summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brüning <michael.bruning@qt.io>2023-11-17 14:09:21 +0100
committerMichael Brüning <michael.bruning@qt.io>2024-03-22 11:57:56 +0000
commit68302c9ea158fbc83cd28570a0560e5a892b45e8 (patch)
tree08c0039e3f33730a05ca4ef2340641a67419c009
parent38655f07d8ef13eb067e3a29bb3a0c2dc0b19716 (diff)
Enable building with Python 3
Port and fix up the patch used by the Debian project, see https://salsa.debian.org/qt-kde-team/qt/qtwebengine/-/blob/0db62e47f0e2f5e4e00193b65da912fe0083088c/debian/patches/chromium-python3.patch which in turn was largely based on a patch from ArchLinux: https://github.com/archlinux/svntogit-packages/blob/packages/qt5-webengine/trunk/qt5-webengine-chromium-python3.patch Also contains upgrades of six and catapult to build with Python 3.11 and 3.12, plus some other additional fixes, e.g. for macOS builds. Change-Id: I6b999505150495caabdcf05f6e4c7af588eff7ee Reviewed-on: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/542809 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
-rwxr-xr-xchromium/build/android/gyp/java_cpp_enum.py5
-rwxr-xr-xchromium/build/print_python_deps.py4
-rw-r--r--chromium/build/util/python2_action.py14
-rwxr-xr-xchromium/components/resources/protobufs/binary_proto_generator.py27
-rwxr-xr-xchromium/components/variations/service/generate_ui_string_overrider.py2
-rwxr-xr-xchromium/content/browser/tracing/generate_trace_viewer_grd.py2
-rw-r--r--chromium/mojo/public/tools/bindings/BUILD.gn2
-rwxr-xr-xchromium/mojo/public/tools/bindings/concatenate_and_replace_closure_exports.py2
-rw-r--r--chromium/mojo/public/tools/bindings/gen_data_files_list.py8
-rw-r--r--chromium/mojo/public/tools/bindings/generators/mojom_java_generator.py4
-rw-r--r--chromium/mojo/public/tools/mojom/mojom/generate/generator.py14
-rw-r--r--chromium/mojo/public/tools/mojom/mojom/generate/module.py3
-rw-r--r--chromium/mojo/public/tools/mojom/mojom/generate/template_expander.py12
-rwxr-xr-xchromium/sandbox/policy/mac/package_sb_file.py11
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py6
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/bind_gen/callback_interface.py2
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/bind_gen/code_node.py10
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_expr.py15
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_format.py2
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_utils.py2
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/bind_gen/dictionary.py2
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py82
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/bind_gen/mako_renderer.py2
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/bind_gen/style_format.py9
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/bind_gen/task_queue.py5
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/code_generator.py10
-rwxr-xr-xchromium/third_party/blink/renderer/bindings/scripts/generate_origin_trial_features.py4
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/idl_definitions.py8
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/idl_reader.py4
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/idl_types.py2
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/utilities.py28
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/v8_interface.py9
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/v8_methods.py4
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/v8_utilities.py2
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/web_idl/callback_interface.py12
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/web_idl/database.py2
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/web_idl/exposure.py5
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/web_idl/function_like.py28
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py21
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/web_idl/interface.py45
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/web_idl/ir_builder.py29
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/web_idl/make_copy.py7
-rw-r--r--chromium/third_party/blink/renderer/bindings/scripts/web_idl/namespace.py12
-rw-r--r--chromium/third_party/blink/renderer/bindings/templates/dictionary_v8.cc.tmpl8
-rwxr-xr-xchromium/third_party/blink/renderer/build/scripts/core/css/make_style_shorthands.py23
-rwxr-xr-xchromium/third_party/blink/renderer/build/scripts/core/css/properties/make_css_property_instances.py4
-rw-r--r--chromium/third_party/blink/renderer/build/scripts/gperf.py2
-rw-r--r--chromium/third_party/blink/renderer/build/scripts/in_file.py2
-rw-r--r--chromium/third_party/blink/renderer/build/scripts/in_generator.py5
-rwxr-xr-xchromium/third_party/blink/renderer/build/scripts/make_runtime_features.py2
-rw-r--r--chromium/third_party/blink/renderer/build/scripts/templates/element_factory.cc.tmpl4
-rw-r--r--chromium/third_party/blink/renderer/build/scripts/templates/element_type_helpers.cc.tmpl4
-rw-r--r--chromium/third_party/blink/renderer/build/scripts/templates/element_type_helpers.h.tmpl2
-rw-r--r--chromium/third_party/blink/renderer/build/scripts/templates/macros.tmpl4
-rw-r--r--chromium/third_party/blink/renderer/build/scripts/templates/make_qualified_names.h.tmpl4
-rw-r--r--chromium/third_party/catapult/BUILD.gn17
-rw-r--r--chromium/third_party/catapult/catapult_build/PRESUBMIT.py6
-rw-r--r--chromium/third_party/catapult/catapult_build/__init__.py15
-rw-r--r--chromium/third_party/catapult/catapult_build/appengine_deploy.py10
-rw-r--r--chromium/third_party/catapult/catapult_build/appengine_dev_server.py9
-rwxr-xr-xchromium/third_party/catapult/catapult_build/bin/run_py_tests5
-rw-r--r--chromium/third_party/catapult/catapult_build/build_steps.py68
-rw-r--r--chromium/third_party/catapult/catapult_build/dev_server.py19
-rwxr-xr-xchromium/third_party/catapult/catapult_build/fetch_telemetry_deps_and_run_tests8
-rw-r--r--chromium/third_party/catapult/catapult_build/html_checks.py2
-rw-r--r--chromium/third_party/catapult/catapult_build/js_checks.py9
-rwxr-xr-xchromium/third_party/catapult/catapult_build/perfbot_stats/chrome_perf_stats.py36
-rw-r--r--chromium/third_party/catapult/catapult_build/perfbot_stats/chrome_perf_stats_unittest.py2
-rwxr-xr-xchromium/third_party/catapult/catapult_build/perfbot_stats/chrome_perf_step_timings.py28
-rw-r--r--chromium/third_party/catapult/catapult_build/repo_checks.py3
-rw-r--r--chromium/third_party/catapult/catapult_build/run_dev_server_tests.py55
-rw-r--r--chromium/third_party/catapult/catapult_build/run_with_typ.py3
-rw-r--r--chromium/third_party/catapult/catapult_build/test_runner.py6
-rwxr-xr-xchromium/third_party/catapult/common/bin/run_tests2
-rwxr-xr-xchromium/third_party/catapult/common/bin/update_chrome_reference_binaries.py50
-rwxr-xr-xchromium/third_party/catapult/common/lab/commits.py29
-rwxr-xr-xchromium/third_party/catapult/common/lab/hardware.py11
-rw-r--r--chromium/third_party/catapult/common/node_runner/node_runner/node_util.py1
-rw-r--r--chromium/third_party/catapult/common/py_trace_event/py_trace_event/__init__.py1
-rw-r--r--chromium/third_party/catapult/common/py_trace_event/py_trace_event/setup.py1
-rw-r--r--chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event.py6
-rw-r--r--chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/__init__.py9
-rw-r--r--chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators.py9
-rw-r--r--chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators_test.py6
-rw-r--r--chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log.py13
-rw-r--r--chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log_io_test.py5
-rw-r--r--chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/meta_class.py4
-rw-r--r--chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/multiprocessing_shim.py4
-rw-r--r--chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/parsed_trace_events.py3
-rw-r--r--chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_proto_classes.py1
-rw-r--r--chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_trace_writer.py6
-rw-r--r--chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_trace_writer_unittest.py73
-rw-r--r--chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/trace_test.py5
-rw-r--r--chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_unittest.py7
-rw-r--r--chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_time.py1
-rw-r--r--chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_time_unittest.py3
-rw-r--r--chromium/third_party/catapult/common/py_trace_event/third_party/protobuf/encoder.py1
-rw-r--r--chromium/third_party/catapult/common/py_utils/PRESUBMIT.py6
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/__init__.py21
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/atexit_with_log.py1
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/binary_manager.py4
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/binary_manager_unittest.py15
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/camel_case.py9
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/camel_case_unittest.py1
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/chrome_binaries.json22
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/class_util.py1
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/class_util_unittest.py23
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/cloud_storage.py93
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/cloud_storage_unittest.py79
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/contextlib_ext.py3
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/contextlib_ext_unittest.py3
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/dependency_util.py3
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/discover.py2
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/discover_unittest.py11
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/exc_util.py1
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/exc_util_unittest.py43
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/expectations_parser.py8
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/file_util.py1
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/file_util_unittest.py1
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/lock.py24
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/lock_unittest.py14
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/logging_util.py1
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/logging_util_unittest.py3
-rwxr-xr-xchromium/third_party/catapult/common/py_utils/py_utils/memory_debug.py4
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/modules_util.py1
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/modules_util_unittest.py3
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/py_utils_unittest.py2
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/refactor/__init__.py1
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/__init__.py1
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/base_symbol.py6
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/class_definition.py9
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/function_definition.py12
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/import_statement.py25
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/reference.py2
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/refactor/module.py3
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/refactor/offset_token.py2
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/refactor/snippet.py42
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/refactor_util/move.py3
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/retry_util_unittest.py12
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/shell_util.py1
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/slots_metaclass.py4
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/slots_metaclass_unittest.py13
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/tempfile_ext.py1
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/tempfile_ext_unittest.py5
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/test_data/discoverable_classes/another_discover_dummyclass.py9
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/test_data/discoverable_classes/discover_dummyclass.py2
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/test_data/discoverable_classes/parameter_discover_dummyclass.py3
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/ts_proxy_server.py44
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/ts_proxy_server_unittest.py19
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/webpagereplay_go_server.py37
-rw-r--r--chromium/third_party/catapult/common/py_utils/py_utils/xvfb.py1
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/__init__.py1
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/fake_fs.py40
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/fake_fs_unittest.py4
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/generate.py12
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/generate_unittest.py1
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/html_generation_controller.py1
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/html_module.py1
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/html_module_unittest.py10
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/js_utils_unittest.py1
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/module.py4
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/module_unittest.py1
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/parse_html_deps.py22
-rwxr-xr-xchromium/third_party/catapult/common/py_vulcanize/py_vulcanize/parse_html_deps_unittest.py5
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/resource.py1
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/resource_loader.py10
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/resource_unittest.py1
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/strip_js_comments.py1
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/strip_js_comments_unittest.py1
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/style_sheet.py3
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/style_sheet_unittest.py5
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/shell.py5
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/util.py3
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/shell.py1
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/main.py15
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/write.py15
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/_setup/py2/shell.py3
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/_setup/py2/util.py3
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/_setup/py3/shell.py1
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/bench/main.py15
-rw-r--r--chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/bench/write.py15
-rw-r--r--chromium/third_party/catapult/devil/BUILD.gn7
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/COPYING.txt27
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/LICENSE30
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/MANIFEST.in10
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/NEWS.txt1547
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/PKG-INFO126
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/README.md102
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/TODO.txt31
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/beautifulsoup4.egg-info/PKG-INFO126
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/beautifulsoup4.egg-info/SOURCES.txt53
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/beautifulsoup4.egg-info/dependency_links.txt1
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/beautifulsoup4.egg-info/requires.txt12
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/beautifulsoup4.egg-info/top_level.txt1
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/__init__.py791
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/builder/__init__.py519
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/builder/_html5lib.py467
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/builder/_htmlparser.py477
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/builder/_lxml.py332
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/dammit.py939
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/diagnose.py242
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/element.py2175
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/formatter.py152
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/testing.py1101
-rwxr-xr-xchromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/convert-py3k16
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ptbr/Makefile130
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ptbr/source/6.1.jpgbin0 -> 22619 bytes
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ptbr/source/conf.py256
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ptbr/source/index.rst3266
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ru/Makefile130
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ru/source/6.1.jpgbin0 -> 22619 bytes
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ru/source/bs4ru.rst3360
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ru/source/conf.py256
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ru/source/index.rst17
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.zh/Makefile130
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.zh/source/6.1.jpgbin0 -> 22619 bytes
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.zh/source/conf.py256
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.zh/source/index.rst2741
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc/Makefile130
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc/source/6.1.jpgbin0 -> 22619 bytes
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc/source/check_doc.py28
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc/source/conf.py256
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc/source/index.rst3505
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/__init__.py791
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/builder/__init__.py519
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/builder/_html5lib.py467
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/builder/_htmlparser.py477
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/builder/_lxml.py332
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/dammit.py939
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/diagnose.py242
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/element.py2175
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/formatter.py152
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/testing.py1101
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/scripts/demonstrate_parser_differences.py95
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/scripts/demonstration_markup.txt34
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/setup.cfg4
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/setup.py45
-rwxr-xr-xchromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/test-all-versions1
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4/bs4/__init__.py16
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4/bs4/builder/__init__.py4
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4/bs4/builder/_html5lib.py10
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4/bs4/builder/_htmlparser.py19
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4/bs4/builder/_lxml.py12
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4/bs4/dammit.py11
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4/bs4/diagnose.py54
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4/bs4/element.py81
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4/bs4/testing.py10
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4/doc/source/conf.py1
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4/scripts/demonstrate_parser_differences.py28
-rw-r--r--chromium/third_party/catapult/third_party/beautifulsoup4/setup.py1
-rw-r--r--chromium/third_party/catapult/third_party/polymer-svg-template/README.md13
-rw-r--r--chromium/third_party/catapult/third_party/polymer-svg-template/polymer-svg-template.html2
-rw-r--r--chromium/third_party/catapult/third_party/polymer-svg-template/polymer-svg-template.js55
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/LICENSE.polymer27
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/README.chromium24
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower.json25
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/.bower.json40
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/Changelog.md154
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/LICENSE202
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/README.md222
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/bower.json31
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/dist/js/axs_testing.js2402
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/main.js7
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/.bower.json75
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/.travis.yml32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/README.md217
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-location.d.ts126
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-location.html218
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route-converter-behavior.d.ts64
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route-converter-behavior.html107
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route-converter.d.ts70
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route-converter.html79
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route.d.ts127
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route.html431
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/bower.json65
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/data-loading-demo.html35
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/data-loading-demo/flickr-image-page.html106
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/data-loading-demo/flickr-search-demo.html62
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/data-loading-demo/flickr-search-page.html107
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/index.html195
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/simple-demo.html116
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/route-info.html44
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/search-results.html59
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/video-viewer.html121
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/youtube-lite.html178
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/youtube-search.html86
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/youtube-toolbar.html179
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/index.html27
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/package-lock.json2388
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/package.json15
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/async/.bower.json67
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/async/CHANGELOG.md125
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/async/LICENSE19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/async/Makefile37
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/async/README.md1877
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/async/bower.json57
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/async/component.json17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/async/deps/nodeunit.css70
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/async/deps/nodeunit.js2117
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/async/dist/async.js1265
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/async/dist/async.min.js2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/async/dist/async.min.map1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/async/karma.conf.js12
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/async/lib/async.js1265
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/async/mocha_test/compose.js86
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/async/mocha_test/forever.js44
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/async/mocha_test/support/is_browser.js4
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/async/package.json85
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/async/perf/benchmark.js228
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/async/perf/memory.js46
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/async/perf/suites.js297
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/async/support/sync-package-managers.js53
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chai/.bower.json37
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chai/CODE_OF_CONDUCT.md58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chai/CONTRIBUTING.md214
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chai/History.md1059
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chai/README.md83
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chai/ReleaseNotes.md737
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chai/bower.json26
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chai/chai.js6142
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chai/karma.conf.js28
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chai/karma.sauce.js41
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chai/package.json51
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chai/sauce.browsers.js128
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/.bower.json61
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/Makefile10
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/bower.json50
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-bug-input.html63
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-bug-link.html77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-bug-mixin.html39
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-button.html160
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-carousel.html215
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-chip.html162
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-cl-link.html53
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-dialog.html235
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-header.html133
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-login.html60
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-signin-aware.html67
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-signin.html1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-signin.js175
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-styles.css3
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-timestamp.html87
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-tree-status.html143
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-user-dropdown.html89
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-user-id.html127
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-user-input.html177
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-bug-input_demo.html9
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-bug-link_demo.html12
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-button_demo.html83
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-carousel_demo.html19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-chip_demo.html43
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-cl-link_demo.html9
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-dialog_demo.html51
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-header_demo.html25
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-login_demo.html19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-timestamp_demo.html29
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-tree-status_demo.html38
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-user-id_demo.html12
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-user-input_demo.html12
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/img/img1.pngbin0 -> 20663 bytes
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/img/img2.pngbin0 -> 23664 bytes
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/img/logo.pngbin0 -> 12956 bytes
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/new-element-test.sh40
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/new-element.sh40
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/prpc-client.js209
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/.bower.json31
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/README.md1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/bower.json22
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/package-lock.json987
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/package.json26
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/roboto.d.ts10
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/roboto.html10
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/.bower.json56
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/LICENSE13
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/README.md4
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/bower.json47
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/demo/index.html51
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-apis.html16
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-client-loader.html236
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-js-api.html63
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-legacy-loader.html55
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-maps-api.html150
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-plusone-api.html54
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-realtime-api.html57
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-youtube-api.html61
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/index.html15
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/.bower.json63
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/LICENSE13
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/README.md4
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/bower.json54
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/demo/index.html208
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/google-icons.html36
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/google-signin-aware.html824
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/google-signin-styles.html267
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/google-signin.html596
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/index.html15
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/.bower.json65
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/.travis.yml30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/README.md55
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/bower.json55
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/demo/index.html75
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/demo/x-announces.html55
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/index.html28
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/iron-a11y-announcer.d.ts68
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/iron-a11y-announcer.html124
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/package-lock.json974
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/package.json17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/.bower.json64
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/.travis.yml32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/README.md45
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/bower.json54
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/demo/index.html32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/demo/x-key-aware.html93
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/index.html24
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.d.ts107
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html490
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/package-lock.json2388
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/package.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/.bower.json72
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/.travis.yml30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/README.md45
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/bower.json63
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/demo/index.html99
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/hero.svg33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/index.html30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/iron-autogrow-textarea.d.ts136
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/iron-autogrow-textarea.html384
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/package-lock.json974
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/package.json17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/.bower.json63
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/.travis.yml30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/README.md22
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/bower.json53
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/demo/index.html48
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/demo/simple-button.html74
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/index.html27
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/iron-button-state.d.ts88
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/iron-button-state.html239
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/iron-control-state.d.ts40
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/iron-control-state.html137
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/package-lock.json974
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/package.json17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/.bower.json64
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/.travis.yml33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/README.md11
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/bower.json55
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/demo/index.html39
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/demo/simple-checkbox.html57
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/index.html30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/iron-checked-element-behavior.d.ts68
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/iron-checked-element-behavior.html109
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/package-lock.json2388
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/package.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/.bower.json63
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/.travis.yml32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/README.md56
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/bower.json54
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/demo/index.html108
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/demo/simple-expand-collapse.html78
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/hero.svg23
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/index.html31
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/iron-collapse.d.ts110
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/iron-collapse.html282
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/package-lock.json2388
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/package.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/.bower.json71
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/.travis.yml25
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/README.md34
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/bower.json62
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/demo/grow-height-animation.html36
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/demo/index.html191
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/demo/x-select.html80
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/index.html24
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/iron-dropdown-scroll-manager.html374
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/iron-dropdown.html349
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/.bower.json59
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/.travis.yml33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/README.md43
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/bower.json49
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/demo/index.html175
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/demo/simple-fit.html28
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/index.html30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/iron-fit-behavior.d.ts211
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/iron-fit-behavior.html679
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/package-lock.json2388
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/package.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/.bower.json64
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/.travis.yml30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/GUIDE.md1265
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/README.md61
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/bower.json54
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/demo/index.html429
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/gen-tsd.json5
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/index.html24
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/iron-flex-layout-classes.d.ts12
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/iron-flex-layout-classes.html436
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/iron-flex-layout.d.ts12
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/iron-flex-layout.html424
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/package-lock.json986
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/package.json17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/.bower.json59
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/.travis.yml29
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/README.md14
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/bower.json49
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/demo/index.html71
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/demo/simple-element.html27
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/demo/simple-form.html53
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/index.html30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/iron-form-element-behavior.d.ts54
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/iron-form-element-behavior.html91
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/package-lock.json983
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/package.json17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/.bower.json69
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/.travis.yml29
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/README.md22
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/bower.json59
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/demo/async.html64
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/demo/index.html50
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/demo/location.pngbin0 -> 324 bytes
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/hero.svg19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/index.html26
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/iron-icon.d.ts107
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/iron-icon.html214
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/package-lock.json974
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/package.json17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/.bower.json86
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/.travis.yml29
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/README.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/av-icons.d.ts13
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/av-icons.html96
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/bower.json77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/communication-icons.d.ts13
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/communication-icons.html66
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/demo/index.html119
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/device-icons.d.ts13
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/device-icons.html95
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/editor-icons.d.ts13
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/editor-icons.html84
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/gen-tsd.json8
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/hardware-icons.d.ts13
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/hardware-icons.html64
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/hero.svg35
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/image-icons.d.ts13
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/image-icons.html171
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/index.html26
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/iron-icons.d.ts43
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/iron-icons.html353
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/maps-icons.d.ts13
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/maps-icons.html84
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/notification-icons.d.ts13
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/notification-icons.html70
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/package-lock.json1196
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/package.json17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/places-icons.d.ts13
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/places-icons.html35
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/social-icons.d.ts13
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/social-icons.html46
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/.bower.json65
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/.travis.yml32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/README.md40
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/bower.json55
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/demo/index.html83
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/demo/svg-sample-icons.html69
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/index.html26
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/iron-iconset-svg.d.ts142
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/iron-iconset-svg.html258
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/package-lock.json2388
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/package.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/.bower.json69
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/.travis.yml33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/README.md80
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/bower.json60
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/demo/cats-only.html24
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/demo/index.html99
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/hero.svg19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/index.html30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/iron-input.d.ts164
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/iron-input.html366
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/package-lock.json2388
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/package.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/.bower.json66
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/README.md51
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/bower.json57
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/demo/index.html133
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/hero.svg31
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/index.html26
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/iron-jsonp-library.d.ts90
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/iron-jsonp-library.html271
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/package-lock.json974
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/package.json17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/.bower.json71
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/.travis.yml33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/README.md61
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/bower.json61
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/demo/index.html125
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/demo/iron-query-params.html124
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/index.html27
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/iron-location.d.ts135
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/iron-location.html433
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/iron-query-params.d.ts26
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/iron-query-params.html89
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/package-lock.json2388
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/package.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/.bower.json69
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/.travis.yml32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/README.md18
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/bower.json60
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/demo/index.html128
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/demo/simple-menu.html45
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/demo/simple-menubar.html45
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/index.html30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/iron-menu-behavior.d.ts169
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/iron-menu-behavior.html439
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/iron-menubar-behavior.d.ts31
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/iron-menubar-behavior.html75
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/package-lock.json2388
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/package.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/.bower.json58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/.travis.yml33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/README.md10
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/bower.json48
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/demo/index.html75
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/gen-tsd.json7
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/hero.svg33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/index.html27
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/iron-meta-extra.d.ts18
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/iron-meta.d.ts85
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/iron-meta.html207
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/package-lock.json2388
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/package.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/.bower.json70
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/.travis.yml33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/README.md67
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/bower.json60
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/demo/index.html325
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/demo/simple-overlay.html40
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/index.html30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-focusables-helper.d.ts12
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-focusables-helper.html219
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-backdrop.d.ts61
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-backdrop.html160
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-behavior.d.ts276
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-behavior.html806
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-manager.d.ts14
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-manager.html389
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-scroll-manager.d.ts49
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-scroll-manager.html391
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/package-lock.json2162
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/package.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/.bower.json55
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/.travis.yml32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/README.md8
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/bower.json45
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/demo/index.html78
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/index.html24
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/iron-range-behavior.d.ts53
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/iron-range-behavior.html97
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/package-lock.json2388
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/package.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/.bower.json58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/.travis.yml29
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/README.md22
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/bower.json48
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/demo/index.html29
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/demo/src/x-app.html105
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/index.html25
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/iron-resizable-behavior.d.ts83
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/iron-resizable-behavior.html214
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/package-lock.json974
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/package.json17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/.bower.json68
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/.travis.yml29
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/CONTRIBUTING.md77
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/README.md102
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/bower.json59
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/demo/index.html104
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/gen-tsd.json7
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/index.html28
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-multi-selectable.d.ts56
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-multi-selectable.html169
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selectable.d.ts155
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selectable.html410
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selection-extra.d.ts60
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selection.d.ts13
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selection.html120
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selector.d.ts19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selector.html87
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/package-lock.json974
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/package.json17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/.bower.json66
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/.travis.yml30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/README.md46
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/bower.json57
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/demo/cats-only.html46
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/demo/index.html56
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/demo/validatable-input.html53
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/index.html30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/iron-validatable-behavior.d.ts78
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/iron-validatable-behavior.html131
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/package-lock.json974
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/package.json17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/lodash/.bower.json30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/lodash/LICENSE22
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/lodash/bower.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/lodash/lodash.js12352
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/lodash/lodash.min.js98
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/.bower.json33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/LICENSE.md43
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/Makefile15
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/README.md67
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/marked/bin/marked199
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/bower.json23
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/component.json10
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/AUTHORS.md164
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/CNAME1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/CODE_OF_CONDUCT.md74
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/CONTRIBUTING.md95
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/PUBLISHING.md24
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/README.md112
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/USING_ADVANCED.md78
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/USING_PRO.md157
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/broken.md426
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/demo/demo.css55
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/demo/demo.js175
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/demo/index.html60
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/demo/initial.md36
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/demo/quickref.md167
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/img/logo-black-and-white.svg133
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/img/logo-black.svg32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/index.html171
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/index.js1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/jasmine.json11
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/lib/marked.js1514
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/man/marked.191
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/man/marked.1.txt96
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/marked.min.js6
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/package-lock.json2501
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/marked/package.json61
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/.bower.json48
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/CHANGELOG.md1711
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/LICENSE22
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/README.md124
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/bower.json38
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/mocha.css326
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/mocha.js16590
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/.bower.json30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/LICENSE20
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/README.md36
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/bower.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/builds/moment-timezone-with-data-2012-2022.js1204
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/builds/moment-timezone-with-data-2012-2022.min.js1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/builds/moment-timezone-with-data.js1204
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/builds/moment-timezone-with-data.min.js1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/builds/moment-timezone.min.js1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/changelog.md154
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/composer.json43
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/data/meta/latest.json5118
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/data/packed/latest.json599
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/data/unpacked/latest.json125209
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/moment-timezone-utils.js318
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/moment-timezone.js605
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/.bower.json36
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/CHANGELOG.md737
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/LICENSE22
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/README.md58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/bower.json25
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/af.js73
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar-dz.js59
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar-ly.js126
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar-ma.js60
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar-sa.js105
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar-tn.js59
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar.js142
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/az.js105
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/be.js134
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/bg.js90
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/bn.js119
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/bo.js119
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/br.js108
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/bs.js143
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ca.js81
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/cs.js172
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/cv.js63
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/cy.js81
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/da.js60
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/de-at.js79
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/de.js78
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/dv.js100
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/el.js98
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/en-au.js67
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/en-ca.js63
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/en-gb.js67
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/en-ie.js67
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/en-nz.js67
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/eo.js73
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/es-do.js80
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/es.js81
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/et.js80
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/eu.js66
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fa.js107
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fi.js107
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fo.js60
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fr-ca.js60
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fr-ch.js64
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fr.js64
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fy.js73
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/gd.js76
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/gl.js77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/he.js99
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/hi.js124
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/hr.js145
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/hu.js109
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/hy-am.js95
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/id.js83
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/is.js127
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/it.js70
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ja.js76
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/jv.js83
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ka.js89
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/kk.js87
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/km.js58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ko.js65
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ky.js88
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/lb.js137
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/lo.js70
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/lt.js117
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/lv.js97
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/me.js111
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/mi.js64
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/mk.js90
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ml.js81
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/mr.js159
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ms-my.js83
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ms.js82
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/my.js96
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/nb.js63
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ne.js123
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/nl-be.js86
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/nl.js86
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/nn.js60
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/pa-in.js124
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/pl.js105
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/pt-br.js61
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/pt.js65
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ro.js75
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ru.js183
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/se.js61
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/si.js71
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sk.js150
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sl.js162
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sq.js70
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sr-cyrl.js110
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sr.js110
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ss.js89
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sv.js69
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sw.js59
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ta.js130
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/te.js89
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tet.js68
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/th.js67
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tl-ph.js62
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tlh.js120
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tr.js90
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tzl.js91
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tzm-latn.js58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tzm.js58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/uk.js146
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/uz.js58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/vi.js79
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/x-pseudo.js68
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/yo.js60
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/zh-cn.js127
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/zh-hk.js105
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/zh-tw.js104
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/locales.js8624
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/locales.min.js663
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/moment-with-locales.js12910
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/moment-with-locales.min.js1216
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/moment.min.js551
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/tests.js72932
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/moment.d.ts708
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/moment.js4301
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/check-overflow.js34
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/date-from-array.js21
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-anything.js109
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-array.js140
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-object.js16
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-string-and-array.js50
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-string-and-format.js107
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-string.js120
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/local.js5
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/parsing-flags.js24
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/utc.js5
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/valid.js49
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/abs.js18
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/add-subtract.js21
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/as.js55
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/bubble.js61
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/constructor.js41
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/create.js120
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/duration.js16
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/get.js25
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/humanize.js76
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/iso-string.js52
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/prototype.js48
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/format/format.js91
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/base-config.js44
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/calendar.js15
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/constructor.js5
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/en.js15
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/formats.js23
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/invalid.js5
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/lists.js93
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/locale.js39
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/locales.js186
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/ordinal.js7
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/pre-post-format.js3
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/prototype.js69
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/relative.js29
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/set.js46
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/add-subtract.js55
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/calendar.js26
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/clone.js5
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/compare.js59
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/constructor.js77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/creation-data.js9
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/diff.js62
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/format.js56
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/from.js17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/get-set.js55
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/locale.js34
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/min-max.js63
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/moment.js28
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/now.js3
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/prototype.js150
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/start-end-of.js59
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/to-type.js34
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/to.js17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/valid.js15
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/parse/regex.js54
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/parse/token.js33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/aliases.js30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/constants.js9
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/day-of-month.js36
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/day-of-week.js363
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/day-of-year.js36
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/hour.js138
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/millisecond.js69
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/minute.js29
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/month.js281
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/offset.js235
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/priorities.js16
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/quarter.js32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/second.js29
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/timestamp.js20
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/timezone.js16
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/units.js20
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/week-calendar-utils.js65
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/week-year.js107
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/week.js67
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/year.js75
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/abs-ceil.js7
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/abs-floor.js8
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/abs-round.js7
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/compare-arrays.js16
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/defaults.js10
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/deprecate.js55
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/extend.js19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/has-own-prop.js3
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/hooks.js13
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/index-of.js18
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-array.js3
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-date.js3
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-function.js3
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-number.js3
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-object-empty.js8
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-object.js5
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-undefined.js3
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/keys.js19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/map.js7
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/some.js19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/to-int.js12
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/zero-fill.js7
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/af.js63
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar-dz.js50
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar-ly.js112
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar-ma.js51
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar-sa.js95
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar-tn.js50
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar.js128
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/az.js96
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/be.js125
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/bg.js81
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/bn.js109
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/bo.js110
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/br.js99
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/bs.js133
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ca.js72
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/cs.js163
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/cv.js53
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/cy.js72
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/da.js51
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/de-at.js69
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/de.js68
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/dv.js89
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/el.js86
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/en-au.js58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/en-ca.js53
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/en-gb.js58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/en-ie.js58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/en-nz.js57
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/eo.js64
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/es-do.js71
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/es.js72
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/et.js71
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/eu.js57
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fa.js97
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fi.js98
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fo.js51
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fr-ca.js51
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fr-ch.js55
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fr.js55
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fy.js64
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/gd.js67
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/gl.js68
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/he.js90
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/hi.js115
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/hr.js135
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/hu.js100
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/hy-am.js86
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/id.js74
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/is.js118
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/it.js61
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ja.js67
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/jv.js73
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ka.js80
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/kk.js77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/km.js49
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ko.js56
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ky.js78
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/lb.js128
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/lo.js61
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/lt.js108
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/lv.js88
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/me.js101
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/mi.js54
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/mk.js81
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ml.js72
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/mr.js150
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ms-my.js74
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ms.js73
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/my.js86
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/nb.js54
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ne.js114
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/nl-be.js77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/nl.js77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/nn.js51
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/pa-in.js115
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/pl.js95
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/pt-br.js52
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/pt.js56
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ro.js66
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ru.js173
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/se.js51
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/si.js61
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sk.js141
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sl.js152
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sq.js61
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sr-cyrl.js100
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sr.js100
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ss.js80
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sv.js60
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sw.js50
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ta.js120
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/te.js79
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tet.js58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/th.js57
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tl-ph.js53
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tlh.js110
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tr.js81
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tzl.js82
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tzm-latn.js49
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tzm.js49
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/uk.js137
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/uz.js49
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/vi.js70
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/x-pseudo.js58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/yo.js50
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/zh-cn.js118
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/zh-hk.js95
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/zh-tw.js94
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/moment.js82
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/templates/default.js5
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/templates/locale-header.js6
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/moment/templates/test-header.js6
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/.bower.json90
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/.travis.yml30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/README.md299
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/cascaded-animation.d.ts36
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/cascaded-animation.html94
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/fade-in-animation.d.ts32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/fade-in-animation.html48
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/fade-out-animation.d.ts32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/fade-out-animation.html48
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/hero-animation.d.ts41
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/hero-animation.html82
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/opaque-animation.d.ts25
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/opaque-animation.html45
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/reverse-ripple-animation.d.ts42
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/reverse-ripple-animation.html86
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/ripple-animation.d.ts44
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/ripple-animation.html92
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/scale-down-animation.d.ts35
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/scale-down-animation.html64
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/scale-up-animation.d.ts35
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/scale-up-animation.html64
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-down-animation.d.ts34
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-down-animation.html58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-bottom-animation.d.ts34
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-bottom-animation.html58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-left-animation.d.ts35
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-left-animation.html59
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-right-animation.d.ts35
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-right-animation.html59
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-top-animation.d.ts34
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-top-animation.html58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-left-animation.d.ts34
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-left-animation.html58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-right-animation.d.ts34
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-right-animation.html58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-up-animation.d.ts34
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-up-animation.html58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/transform-animation.d.ts36
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/transform-animation.html69
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/bower.json80
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/card/index.html174
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/card/x-card.html100
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/card/x-cards-list.html81
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/declarative/index.html150
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/doc/index.html76
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/doc/my-animatable.html68
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/doc/my-dialog.html94
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/dropdown/animated-dropdown.html90
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/dropdown/index.html61
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/grid/animated-grid.html160
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/grid/fullsize-page-with-card.html125
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/grid/index.html74
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/index.html46
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/list/full-view.html123
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/list/index.html38
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/list/list-demo.html101
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/list/list-view.html131
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/load/animated-grid.html145
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/load/full-page.html82
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/load/index.html51
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/shared-styles.html47
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/tiles/circles-page.html115
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/tiles/index.html80
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/tiles/squares-page.html102
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/gen-tsd.json5
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/guides/neon-animation.md314
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/index.html30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animatable-behavior.d.ts53
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animatable-behavior.html150
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animatable.d.ts32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animatable.html54
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animated-pages.d.ts38
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animated-pages.html219
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation-behavior.d.ts50
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation-behavior.html92
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation-runner-behavior.d.ts36
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation-runner-behavior.html155
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation.d.ts19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation.html18
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animations.d.ts30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animations.html29
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-shared-element-animatable-behavior.d.ts29
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-shared-element-animatable-behavior.html43
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-shared-element-animation-behavior.d.ts33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-shared-element-animation-behavior.html72
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/package-lock.json974
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/package.json17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/web-animations.d.ts10
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/web-animations.html11
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/.bower.json75
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/.travis.yml35
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/README.md44
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/bower.json66
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/demo/index.html45
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/demo/paper-button.html63
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/demo/paper-radio-button.html110
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/index.html26
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/package-lock.json2388
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/package.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-button-behavior.d.ts47
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-button-behavior.html89
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-checked-element-behavior.d.ts36
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-checked-element-behavior.html57
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-inky-focus-behavior.d.ts27
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-inky-focus-behavior.html50
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-ripple-behavior.d.ts78
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-ripple-behavior.html125
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/.bower.json75
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/.travis.yml33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/README.md73
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/bower.json66
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/demo/index.html140
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/index.html26
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/package-lock.json2388
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/package.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/paper-button.d.ts92
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/paper-button.html205
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/.bower.json75
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/.eslintrc.json18
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/.travis.yml32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/README.md63
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/bower.json66
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/demo/index.html127
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/index.html30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/package-lock.json2388
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/package.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/paper-checkbox.d.ts74
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/paper-checkbox.html324
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/.bower.json77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/.travis.yml32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/README.md44
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/bower.json68
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/demo/index.html107
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/demo/simple-dialog.html28
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/hero.svg51
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/index.html30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/package-lock.json2388
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/package.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/paper-dialog-behavior.d.ts70
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/paper-dialog-behavior.html143
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/paper-dialog-shared-styles.d.ts16
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/paper-dialog-shared-styles.html100
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/.bower.json78
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/.travis.yml29
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/README.md65
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/bower.json69
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/demo/index.html230
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/hero.svg58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/index.html30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/package-lock.json1196
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/package.json17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/paper-dialog.d.ts74
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/paper-dialog.html109
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/.bower.json71
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/.travis.yml30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/README.md92
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/bower.json61
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/demo/index.html111
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/demo/paper-icon-button-light.html68
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/index.html23
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/package-lock.json983
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/package.json17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/paper-icon-button-light.d.ts50
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/paper-icon-button-light.html130
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/paper-icon-button.d.ts92
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/paper-icon-button.html181
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/.bower.json93
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/.travis.yml27
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/README.md44
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/all-imports.html12
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/bower.json84
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/demo/index.html156
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/demo/ssn-input.html128
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/demo/ssn-validator.html27
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/hero.svg19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/index.html28
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input-addon-behavior.html44
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input-behavior.html566
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input-char-counter.html99
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input-container.html682
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input-error.html94
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input.html316
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-textarea.html165
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/.bower.json81
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/.travis.yml26
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/README.md163
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/all-imports.html13
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/bower.json72
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/demo/index.html197
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/index.html30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/paper-icon-item.html86
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/paper-item-behavior.html36
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/paper-item-body.html83
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/paper-item-shared-styles.html70
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/paper-item.html110
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/.bower.json63
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/.travis.yml30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/README.md34
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/bower.json54
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/demo/index.html85
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/index.html30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/package-lock.json986
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/package.json17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/paper-material-shared-styles.d.ts12
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/paper-material-shared-styles.html42
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/paper-material.d.ts45
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/paper-material.html81
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/.bower.json65
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/.travis.yml32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/README.md49
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/bower.json55
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/demo/index.html132
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/hero.svg21
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/index.html28
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/package-lock.json2388
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/package.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/paper-progress.d.ts117
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/paper-progress.html345
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/.bower.json70
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/.travis.yml29
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/README.md38
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/bower.json61
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/demo/index.html83
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/hero.svg22
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/index.html30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/package-lock.json983
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/package.json17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/paper-radio-button.d.ts62
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/paper-radio-button.html252
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/.bower.json70
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/.travis.yml29
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/README.md49
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/bower.json61
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/demo/index.html76
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/hero.svg25
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/index.html30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/package-lock.json983
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/package.json17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/paper-radio-group.d.ts86
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/paper-radio-group.html185
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/.bower.json67
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/.travis.yml32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/README.md40
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/bower.json57
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/demo/index.html405
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/hero.svg30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/index.html27
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/package-lock.json2388
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/package.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/paper-ripple.d.ts171
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/paper-ripple.html729
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/.bower.json64
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/README.md50
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/bower.json55
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/global.d.ts12
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/global.html94
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/shadow.d.ts10
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/shadow.html60
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/typography.d.ts12
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/typography.html164
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/color.d.ts12
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/color.html334
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/default-theme.d.ts13
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/default-theme.html71
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/demo-pages.d.ts16
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/demo-pages.html80
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/demo/index.html232
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/element-styles/paper-item-styles.d.ts15
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/element-styles/paper-item-styles.html91
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/element-styles/paper-material-styles.d.ts13
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/element-styles/paper-material-styles.html78
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/gen-tsd.json5
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/index.html24
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/package-lock.json984
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/package.json17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/paper-styles-classes.d.ts13
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/paper-styles-classes.html22
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/paper-styles.d.ts16
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/paper-styles.html42
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/shadow.d.ts12
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/shadow.html76
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/typography.d.ts13
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/typography.html178
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/.bower.json82
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/.travis.yml32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/README.md52
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/bower.json72
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/demo/index.html318
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/hero.svg23
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/index.html25
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/package-lock.json2388
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/package.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tab.d.ts58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tab.html168
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tabs-icons.d.ts12
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tabs-icons.html18
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tabs.d.ts210
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tabs.html614
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/.bower.json70
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/.travis.yml32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/README.md67
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/bower.json60
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/demo/index.html96
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/hero.svg20
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/index.html26
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/package-lock.json2388
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/package.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/paper-toast.d.ts151
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/paper-toast.html299
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/.bower.json70
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/.travis.yml32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/README.md32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/bower.json61
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/demo/index.html88
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/hero.svg22
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/index.html26
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/package-lock.json2388
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/package.json19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/paper-toggle-button.d.ts69
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/paper-toggle-button.html280
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/.bower.json47
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/LICENSE21
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/bower.json37
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/async.html123
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/behaviors.html84
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/index.html32
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/message-mixin.html24
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/observing.html70
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/ready-state.html94
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/redux-mixin.html22
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/dist/polymer-redux.html256
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/gulpfile.babel.js80
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/index.html14
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/lib/index.html1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/lib/index.js254
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/package.json108
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/polymer-redux.html2
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/polymer.json5
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/readme.md103
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/src/index.html1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/src/index.js212
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/wct.conf.json7
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/yarn.lock7838
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/.bower.json46
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/LICENSE.txt27
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/README.md522
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/bower.json35
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/externs/closure-types.js1402
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/externs/polymer-externs.js112
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/externs/polymer-internal-shared-types.js165
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/externs/polymer-internal-types.html11
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/externs/webcomponents-externs.js64
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/gen-tsd.json23
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/img/migration.pngbin0 -> 544823 bytes
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/index.html25
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/array-selector.html440
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/custom-style.html114
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/dom-bind.html139
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/dom-if.html288
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/dom-module.html143
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/dom-repeat.html738
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/class.html376
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/legacy-element-mixin.html1003
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/mutable-data-behavior.html161
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/polymer-fn.html50
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/polymer.dom.html405
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/templatizer-behavior.html151
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/dir-mixin.html181
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/disable-upgrade-mixin.html116
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/element-mixin.html739
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/gesture-event-listeners.html83
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/mutable-data.html205
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/properties-changed.html534
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/properties-mixin.html230
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/property-accessors.html322
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/property-effects.html2808
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/template-stamp.html491
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/array-splice.html316
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/async.html216
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/boot.html65
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/case-map.html64
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/debounce.html118
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/flattened-nodes-observer.html312
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/flush.html62
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/gestures.html1093
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/html-tag.html129
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/import-href.html107
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/mixin.html78
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/path.html284
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/render-status.html133
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/resolve-url.html112
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/settings.html118
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/style-gather.html299
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/templatize.html579
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/unresolved.html31
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/package-lock.json10899
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/package.json56
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/polymer-element.html44
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/polymer.html30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/extra-types.d.ts147
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/array-selector.d.ts200
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/custom-style.d.ts71
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/dom-bind.d.ts47
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/dom-if.d.ts71
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/dom-module.d.ts82
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/dom-repeat.d.ts282
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/class.d.ts115
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/legacy-element-mixin.d.ts634
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/mutable-data-behavior.d.ts135
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/polymer-fn.d.ts25
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/polymer.dom.d.ts179
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/templatizer-behavior.d.ts116
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/dir-mixin.d.ts52
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/disable-upgrade-mixin.d.ts49
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/element-mixin.d.ts233
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/gesture-event-listeners.d.ts53
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/mutable-data.d.ts147
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/properties-changed.d.ts304
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/properties-mixin.d.ts79
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/property-accessors.d.ts152
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/property-effects.d.ts841
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/template-stamp.d.ts258
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/array-splice.d.ts49
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/async.d.ts119
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/boot.d.ts19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/case-map.d.ts39
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/debounce.d.ts78
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/flattened-nodes-observer.d.ts96
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/flush.d.ts28
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/gestures.d.ts87
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/html-tag.d.ts86
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/import-href.d.ts27
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/mixin.d.ts22
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/path.d.ts151
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/render-status.d.ts45
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/resolve-url.d.ts50
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/settings.d.ts40
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/style-gather.d.ts113
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/templatize.d.ts218
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/unresolved.d.ts10
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/polymer-element.d.ts25
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/polymer.d.ts21
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/wct.conf.json20
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/.bower.json46
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/README.md400
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/apply-shim.html10
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/apply-shim.min.js30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/apply-shim.min.js.map1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/bower.json36
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/custom-style-interface.html10
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/custom-style-interface.min.js14
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/custom-style-interface.min.js.map1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/entrypoints/apply-shim.js196
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/entrypoints/custom-style-interface.js67
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/entrypoints/scoping-shim.js87
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/examples/custom-style-element.js42
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/examples/document-style-lib.js54
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/externs/shadycss-externs.js26
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/gulpfile.js113
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/package-lock.json11002
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/package.json59
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/scoping-shim.min.js53
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/scoping-shim.min.js.map1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/apply-shim-utils.js149
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/apply-shim.js482
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/common-regex.js19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/common-utils.js59
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/css-parse.js264
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/custom-style-interface.js162
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/document-wait.js45
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/document-watcher.js133
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/scoping-shim.js470
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-cache.js51
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-info.js74
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-placeholder.js40
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-properties.js612
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-settings.js47
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-transformer.js363
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-util.js294
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/template-map.js17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/unscoped-style-handler.js40
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/wct.conf.json17
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/.bower.json14
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/.editorconfig9
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/.eslintignore1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/.eslintrc.json229
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/.travis.yml30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/LICENSE.txt49
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/README.md256
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/lib/sinon-chai.js147
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/package-lock.json1830
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/package.json42
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/sinonjs/.bower.json20
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/sinonjs/README.md8
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/sinonjs/bower.json10
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/sinonjs/sinon.js6383
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/.bower.json37
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/LICENSE27
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/bower.json28
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/browser.js346
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/lib/formatting.js158
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/lib/index.js26
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/lib/normalization.js57
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/lib/parsing.js95
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/.bower.json35
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/.github/ISSUE_TEMPLATE.md33
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/.travis.yml21
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/CONTRIBUTING.md77
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/README.md148
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/bower.json25
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/package.json24
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/test-fixture-mocha.js40
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/test-fixture.html351
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/wct.conf.json5
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/.bower.json40
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/CONTRIBUTING.md123
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/COPYING202
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/History.md265
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/README.md80
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/bower.json30
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/docs/examples.md241
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/docs/experimental.md58
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/docs/support.md69
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/externs/README.md10
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/externs/web-animations-next.js113
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/externs/web-animations.js126
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/animation.js279
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/apply-preserving-inline-style.js239
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/apply.js25
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/box-handler.js57
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/color-handler.js63
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/deprecation.js47
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/dev.js16
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/dimension-handler.js240
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/effect-callback.js98
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/element-animatable.js23
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/font-weight-handler.js42
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/group-constructors.js204
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/handler-utils.js177
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/interpolation.js49
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/keyframe-effect-constructor.js183
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/keyframe-effect.js57
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/keyframe-interpolations.js123
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/matrix-decomposition.js440
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/matrix-interpolation.js130
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/normalize-keyframes.js321
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/number-handler.js97
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/position-handler.js117
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/property-interpolation.js127
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/property-names.js40
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/scope.js20
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/shadow-handler.js108
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/shape-handler.js85
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/tick.js181
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/timeline.js101
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/timing-utilities.js420
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/transform-handler.js275
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/visibility-handler.js29
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/web-animations-bonus-cancel-events.js83
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/web-animations-bonus-object-form-keyframes.js63
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/web-animations-next-animation.js383
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next-lite.min.html1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next-lite.min.js16
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next-lite.min.js.map1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next.min.html1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next.min.js16
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next.min.js.map1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations.html50
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations.min.html1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations.min.js16
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations.min.js.map1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/.bower.json53
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/bower.json43
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/browser.js1865
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/browser.js.map1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/data/a11ySuite-npm-header.txt5
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/data/a11ySuite.js130
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/data/index.html27
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/package.json131
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/.bower.json34
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/.eslintrc.json11
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/.github/CODEOWNERS1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/.travis.yml25
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/CONTRIBUTING.md66
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/LICENSE.md19
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/README.md169
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/bower.json24
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/closure-output.txt10
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/custom-elements-es5-adapter.js16
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/custom-elements-es5-adapter-index.js16
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-hi-ce-index.js21
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-hi-index.js20
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-hi-sd-ce-index.js22
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-hi-sd-ce-pf-index.js26
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-hi-sd-index.js21
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-sd-ce-index.js42
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/externs/webcomponents.js25
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/gulpfile.js187
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/package-lock.json9534
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/package.json56
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/src/post-polyfill.js63
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/src/pre-polyfill.js63
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/src/promise.js26
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/src/unresolved.js31
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/wct.conf.json6
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-ce.js81
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-ce.js.map1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-sd-ce.js198
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-sd-ce.js.map1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-sd.js181
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-sd.js.map1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi.js55
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi.js.map1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-lite.js221
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-lite.js.map1
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-loader.js74
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-sd-ce.js172
-rw-r--r--chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-sd-ce.js.map1
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/LICENSE.polymer27
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/README.chromium24
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower.json7
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.bower.json14
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.eslintrc.json45
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.github/CODEOWNERS2
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.github/ISSUE_TEMPLATE.md50
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.github/PULL_REQUEST_TEMPLATE.md3
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.npmignore4
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.travis.yml26
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/CHANGELOG.md5894
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/CONTRIBUTING.md162
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/LICENSE.txt27
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/README.md142
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/externs/closure-types.js1415
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/externs/polymer-externs.js112
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/externs/polymer-internal-shared-types.js165
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/externs/polymer-internal-types.html11
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/externs/webcomponents-externs.js64
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/gen-tsd.json23
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/gulpfile.js287
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/img/migration.pngbin0 -> 544823 bytes
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/index.html25
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/array-selector.js429
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/custom-style.js108
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-bind.js127
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-if.js279
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-module.js137
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-repeat.js728
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/class.js366
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/legacy-element-mixin.js987
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/mutable-data-behavior.js150
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/polymer-fn.js48
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/polymer.dom.js391
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/templatizer-behavior.js144
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/dir-mixin.js179
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/disable-upgrade-mixin.js110
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/element-mixin.js747
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/gesture-event-listeners.js73
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/mutable-data.js194
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/properties-changed.js524
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/properties-mixin.js221
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/property-accessors.js313
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/property-effects.js2812
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/strict-binding-parser.js413
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/template-stamp.js482
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/array-splice.js299
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/async.js207
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/boot.js11
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/case-map.js53
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/debounce.js114
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/flattened-nodes-observer.js304
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/flush.js54
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/gestures.js1081
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/html-tag.js127
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/mixin.js66
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/path.js262
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/render-status.js120
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/resolve-url.js87
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/settings.js85
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/style-gather.js282
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/templatize.js568
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/unresolved.js19
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/manifest.json765
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/package-lock.json28382
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/package.json68
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/polymer-element.js30
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/polymer-legacy.js27
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/util/.eslintrc.json5
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer3/bower_components/polymer/util/gen-changelog.sh30
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/util/minimalDocument.js72
-rwxr-xr-xchromium/third_party/catapult/third_party/polymer3/bower_components/polymer/util/travis-sauce-test.sh12
-rw-r--r--chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/wct.conf.json20
-rw-r--r--chromium/third_party/catapult/third_party/six/CHANGES74
-rw-r--r--chromium/third_party/catapult/third_party/six/LICENSE2
-rw-r--r--chromium/third_party/catapult/third_party/six/PKG-INFO47
-rw-r--r--chromium/third_party/catapult/third_party/six/README17
-rw-r--r--chromium/third_party/catapult/third_party/six/README.chromium6
-rw-r--r--chromium/third_party/catapult/third_party/six/README.rst29
-rw-r--r--chromium/third_party/catapult/third_party/six/documentation/conf.py2
-rw-r--r--chromium/third_party/catapult/third_party/six/documentation/index.rst347
-rw-r--r--chromium/third_party/catapult/third_party/six/setup.cfg26
-rw-r--r--chromium/third_party/catapult/third_party/six/setup.py14
-rw-r--r--chromium/third_party/catapult/third_party/six/six.egg-info/PKG-INFO47
-rw-r--r--chromium/third_party/catapult/third_party/six/six.egg-info/SOURCES.txt15
-rw-r--r--chromium/third_party/catapult/third_party/six/six.egg-info/dependency_links.txt1
-rw-r--r--chromium/third_party/catapult/third_party/six/six.egg-info/top_level.txt1
-rw-r--r--chromium/third_party/catapult/third_party/six/six.py186
-rw-r--r--chromium/third_party/catapult/third_party/six/test_six.py323
-rw-r--r--chromium/third_party/catapult/third_party/vinn/BUILD.gn2
-rw-r--r--chromium/third_party/catapult/tracing/DIR_METADATA4
-rw-r--r--chromium/third_party/catapult/tracing/OWNERS4
-rw-r--r--chromium/third_party/catapult/tracing/PRESUBMIT.py17
-rw-r--r--chromium/third_party/catapult/tracing/bin/PRESUBMIT.py5
-rwxr-xr-xchromium/third_party/catapult/tracing/bin/add_reserved_diagnostics10
-rwxr-xr-xchromium/third_party/catapult/tracing/bin/compare_samples1
-rwxr-xr-xchromium/third_party/catapult/tracing/bin/histograms2csv4
-rwxr-xr-xchromium/third_party/catapult/tracing/bin/histograms2html3
-rwxr-xr-xchromium/third_party/catapult/tracing/bin/html2trace3
-rwxr-xr-xchromium/third_party/catapult/tracing/bin/memory_infra_remote_dump20
-rwxr-xr-xchromium/third_party/catapult/tracing/bin/merge_histograms2
-rwxr-xr-xchromium/third_party/catapult/tracing/bin/proto2json3
-rwxr-xr-xchromium/third_party/catapult/tracing/bin/run_metric14
-rwxr-xr-xchromium/third_party/catapult/tracing/bin/run_py_tests1
-rwxr-xr-xchromium/third_party/catapult/tracing/bin/snapdragon2trace1
-rwxr-xr-xchromium/third_party/catapult/tracing/bin/trace2html3
-rwxr-xr-xchromium/third_party/catapult/tracing/bin/validate_all_diagnostics24
-rwxr-xr-xchromium/third_party/catapult/tracing/bin/validate_all_metrics12
-rwxr-xr-xchromium/third_party/catapult/tracing/bin/why_imported5
-rw-r--r--chromium/third_party/catapult/tracing/docs/perfetto.md19
-rw-r--r--chromium/third_party/catapult/tracing/third_party/symbols/symbols/PRESUBMIT.py14
-rw-r--r--chromium/third_party/catapult/tracing/third_party/symbols/symbols/elf_symbolizer.py10
-rwxr-xr-xchromium/third_party/catapult/tracing/third_party/symbols/symbols/elf_symbolizer_unittest.py7
-rwxr-xr-xchromium/third_party/catapult/tracing/third_party/symbols/symbols/mock_addr2line/mock_addr2line50
-rw-r--r--chromium/third_party/catapult/tracing/trace_viewer.gni16
-rw-r--r--chromium/third_party/catapult/tracing/tracing/BUILD.gn7
-rw-r--r--chromium/third_party/catapult/tracing/tracing/base/unittest/html_test_results.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/base/unittest/suite_loader.html4
-rw-r--r--chromium/third_party/catapult/tracing/tracing/base/unittest/test_suite.html31
-rw-r--r--chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_auditor.html5
-rw-r--r--chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_auditor_test.html26
-rw-r--r--chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_test_utils.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_user_friendly_category_driver.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_user_friendly_category_driver_test.html2
-rw-r--r--chromium/third_party/catapult/tracing/tracing/extras/chrome/estimated_input_latency_test.html1
-rw-r--r--chromium/third_party/catapult/tracing/tracing/extras/chrome/largest_contentful_paint.html5
-rw-r--r--chromium/third_party/catapult/tracing/tracing/extras/importer/fuchsia_importer.html23
-rw-r--r--chromium/third_party/catapult/tracing/tracing/extras/importer/linux_perf/ftrace_importer.html1
-rw-r--r--chromium/third_party/catapult/tracing/tracing/extras/importer/linux_perf/msm_parser.html170
-rw-r--r--chromium/third_party/catapult/tracing/tracing/extras/importer/linux_perf/msm_parser_test.html106
-rw-r--r--chromium/third_party/catapult/tracing/tracing/extras/importer/trace_event_importer.html6
-rw-r--r--chromium/third_party/catapult/tracing/tracing/extras/importer/trace_event_importer_test.html91
-rwxr-xr-xchromium/third_party/catapult/tracing/tracing/extras/symbolizer/symbolize_trace.py106
-rw-r--r--chromium/third_party/catapult/tracing/tracing/extras/symbolizer/symbolize_trace_macho_reader.py3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/extras/symbolizer/symbolize_trace_macho_reader_unittest.py13
-rw-r--r--chromium/third_party/catapult/tracing/tracing/importer/find_load_expectations.html13
-rw-r--r--chromium/third_party/catapult/tracing/tracing/importer/import.html29
-rw-r--r--chromium/third_party/catapult/tracing/tracing/importer/import_test.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/importer/proto_expectation.html4
-rw-r--r--chromium/third_party/catapult/tracing/tracing/importer/user_model_builder_test.html20
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/__init__.py1
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/all_metrics.html7
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/android_startup_metric.html256
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/android_startup_metric_test.html117
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/blink/gc_metric_test.html1
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/blink/resource_metric.html51
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/blink/resource_metric_test.html45
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/compare_samples_unittest.py2
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/core_web_vitals_metric.html111
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/core_web_vitals_metric_test.html174
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/count_sum_metric.html81
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/count_sum_metric_test.html61
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/custom_metric.html155
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/custom_metric_test.html273
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/discover.py3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/discover_unittest.py2
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/media_metric.html54
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/metric_map_function.html6
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/partition_alloc/OWNERS2
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/partition_alloc/pcscan_metric.html195
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/partition_alloc/pcscan_metric_test.html138
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/rendering/cpu_utilization.html38
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/rendering/cpu_utilization_test.html8
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/rendering/frame_segment_filter.html112
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/rendering/queueing_duration.html11
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/rendering/rendering_metric.html26
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/rendering/rendering_metric_test.html10
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/system_health/breakdown_tree_helpers_test.html10
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/system_health/cpu_time_metric.html2
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/system_health/loading_metric.html123
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/system_health/loading_metric_test.html149
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/system_health/memory_metric.html24
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/system_health/memory_metric_test.html54
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/system_health/persecond_metric_test.html6
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/system_health/weblayer_startup_metric.html54
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/system_health/weblayer_startup_metric_test.html46
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/uma_metric.html88
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/uma_metric_test.html68
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/v8/OWNERS3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/v8/gc_metric.html791
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/v8/gc_metric_test.html717
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/v8/utils.html2
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/v8/v8_metrics.html2
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/v8/wasm_metric.html74
-rw-r--r--chromium/third_party/catapult/tracing/tracing/metrics/v8/wasm_metric_test.html133
-rw-r--r--chromium/third_party/catapult/tracing/tracing/model/clock_sync_manager.html1
-rw-r--r--chromium/third_party/catapult/tracing/tracing/model/helpers/telemetry_helper.html1
-rw-r--r--chromium/third_party/catapult/tracing/tracing/model/helpers/telemetry_helper_test.html30
-rw-r--r--chromium/third_party/catapult/tracing/tracing/model/thread.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/mre/cloud_storage.py2
-rw-r--r--chromium/third_party/catapult/tracing/tracing/mre/failure.py2
-rw-r--r--chromium/third_party/catapult/tracing/tracing/mre/failure_unittest.py14
-rw-r--r--chromium/third_party/catapult/tracing/tracing/mre/function_handle.py3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/mre/function_handle_unittest.py22
-rw-r--r--chromium/third_party/catapult/tracing/tracing/mre/json_output_formatter.py4
-rw-r--r--chromium/third_party/catapult/tracing/tracing/mre/local_directory_corpus_driver.py1
-rw-r--r--chromium/third_party/catapult/tracing/tracing/mre/map_single_trace.py2
-rw-r--r--chromium/third_party/catapult/tracing/tracing/mre/map_single_trace_unittest.py30
-rw-r--r--chromium/third_party/catapult/tracing/tracing/mre/map_traces.py3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/mre/mre_result.py2
-rw-r--r--chromium/third_party/catapult/tracing/tracing/mre/mre_result_unittest.py4
-rw-r--r--chromium/third_party/catapult/tracing/tracing/mre/threaded_work_queue_unittest.py4
-rw-r--r--chromium/third_party/catapult/tracing/tracing/proto/histogram_proto.py22
-rw-r--r--chromium/third_party/catapult/tracing/tracing/proto/histogram_proto_unittest.py10
-rw-r--r--chromium/third_party/catapult/tracing/tracing/tests.html2
-rw-r--r--chromium/third_party/catapult/tracing/tracing/trace_data/__init__.py1
-rw-r--r--chromium/third_party/catapult/tracing/tracing/trace_data/trace_data.py33
-rw-r--r--chromium/third_party/catapult/tracing/tracing/trace_data/trace_data_unittest.py5
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/analysis/alert_sub_view_test.html6
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/analysis/container_memory_dump_sub_view_test.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/analysis/frame_power_usage_chart_test.html19
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/analysis/generic_object_view.html2
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/analysis/generic_object_view_test.html6
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/analysis/memory_dump_heap_details_breakdown_view.html4
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/analysis/multi_event_sub_view_test.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/base/base.html2
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/base/camera_test.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/base/container_that_decorates_its_children_test.html9
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/base/dom_helpers_test.html10
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/base/dropdown_test.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/base/hotkey_controller_test.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/base/info_bar_group_test.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/base/tab_view_test.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/base/table_test.html12
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/base/utils.html12
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/base/utils_test.html6
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/extras/about_tracing/profiling_view.html28
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/extras/about_tracing/profiling_view_test.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/extras/about_tracing/record_controller_test.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/extras/about_tracing/record_selection_dialog_test.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/display_item_debugger_test.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/layer_tree_host_impl_view_test.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/layer_tree_quad_stack_view_test.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/layer_view_test.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/raster_task_view_test.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/timeline_view.html27
-rw-r--r--chromium/third_party/catapult/tracing/tracing/ui/tracks/async_slice_group_track.html9
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/diagnostics/alert_groups.html35
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/diagnostics/breakdown.py6
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/diagnostics/date_range.py6
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/diagnostics/diagnostic.py2
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/diagnostics/generic_set.py14
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/diagnostics/related_event_set.py8
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/diagnostics/related_name_map.py2
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/diagnostics/reserved_infos.py15
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/diagnostics/reserved_names.html17
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/diagnostics/unmergeable_diagnostic_set.py2
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/gtest_json_converter.py2
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/heap_profiler.py4
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/heap_profiler_unittest.py25
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/histogram.h1
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/histogram.html24
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/histogram.py24
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/histogram_importer.html22
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/histogram_serializer_unittest.py98
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/histogram_set.py2
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/histogram_set_unittest.py30
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/histogram_test.html57
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/histogram_unittest.py5
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/running_statistics.cc3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/ui/breakdown_span_test.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/ui/diagnostic_span.html11
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/ui/generic_set_span_test.html5
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/ui/histogram_importer_test.html95
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/ui/histogram_set_controls_test.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/ui/histogram_set_table_row.html6
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/ui/histogram_set_table_test.html15
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/ui/histogram_span_test.html6
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/ui/related_event_set_span_test.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/ui/scalar_context_controller_test.html3
-rw-r--r--chromium/third_party/catapult/tracing/tracing/value/ui/scalar_span_test.html24
-rw-r--r--chromium/third_party/catapult/tracing/tracing_build/check_common.py8
-rw-r--r--chromium/third_party/catapult/tracing/tracing_build/generate_about_tracing_contents_unittest.py7
-rw-r--r--chromium/third_party/catapult/tracing/tracing_build/histograms_viewer.html6
-rw-r--r--chromium/third_party/catapult/tracing/tracing_build/html2trace.py22
-rw-r--r--chromium/third_party/catapult/tracing/tracing_build/merge_traces.py23
-rw-r--r--chromium/third_party/catapult/tracing/tracing_build/merge_traces_unittest.py8
-rw-r--r--chromium/third_party/catapult/tracing/tracing_build/render_histograms_viewer.py33
-rw-r--r--chromium/third_party/catapult/tracing/tracing_build/render_histograms_viewer_unittest.py44
-rw-r--r--chromium/third_party/catapult/tracing/tracing_build/snapdragon2trace.py6
-rwxr-xr-xchromium/third_party/catapult/tracing/tracing_build/strip_memory_infra_trace.py2
-rw-r--r--chromium/third_party/catapult/tracing/tracing_build/trace2html.py10
-rw-r--r--chromium/third_party/catapult/tracing/tracing_build/trace2html_unittest.py17
-rw-r--r--chromium/third_party/catapult/tracing/tracing_build/update_gni.py2
-rw-r--r--chromium/third_party/catapult/tracing/tracing_build/vulcanize_trace_viewer_unittest.py7
-rw-r--r--chromium/third_party/catapult/tracing/tracing_examples/trace_viewer_embedder.html4
-rw-r--r--chromium/third_party/catapult/tracing/tracing_project.py7
-rw-r--r--chromium/third_party/dawn/generator/generator_lib.py4
-rw-r--r--chromium/third_party/devtools-frontend/src/BUILD.gn2
-rw-r--r--chromium/third_party/devtools-frontend/src/scripts/build/build_inspector_overlay.py25
-rw-r--r--chromium/third_party/devtools-frontend/src/scripts/build/build_release_applications.py21
-rw-r--r--chromium/third_party/devtools-frontend/src/scripts/build/generate_devtools_grd.py4
-rw-r--r--chromium/third_party/devtools-frontend/src/scripts/build/modular_build.py6
-rw-r--r--chromium/third_party/jinja2/tests.py6
-rwxr-xr-xchromium/tools/generate_stubs/generate_stubs.py10
-rw-r--r--chromium/tools/grit/grit/util.py2
-rw-r--r--chromium/tools/metrics/structured/model.py2
-rwxr-xr-xchromium/tools/metrics/ukm/gen_builders.py5
-rw-r--r--chromium/tools/metrics/ukm/ukm_model.py4
-rwxr-xr-xchromium/ui/ozone/generate_constructor_list.py13
-rwxr-xr-xchromium/ui/ozone/generate_ozone_platform_list.py26
2133 files changed, 628699 insertions, 2118 deletions
diff --git a/chromium/build/android/gyp/java_cpp_enum.py b/chromium/build/android/gyp/java_cpp_enum.py
index 0b9ee541e4e..5fd66b93b9e 100755
--- a/chromium/build/android/gyp/java_cpp_enum.py
+++ b/chromium/build/android/gyp/java_cpp_enum.py
@@ -186,8 +186,9 @@ class HeaderParser(object):
enum_name_re = r'(\w+)'
optional_fixed_type_re = r'(\:\s*(\w+\s*\w+?))?'
enum_start_re = re.compile(r'^\s*(?:\[cpp.*\])?\s*enum\s+' +
- optional_class_or_struct_re + '\s*' + enum_name_re + '\s*' +
- optional_fixed_type_re + '\s*{\s*')
+ optional_class_or_struct_re + r'\s*' +
+ enum_name_re + r'\s*' + optional_fixed_type_re +
+ r'\s*{\s*')
enum_single_line_re = re.compile(
r'^\s*(?:\[cpp.*\])?\s*enum.*{(?P<enum_entries>.*)}.*$')
diff --git a/chromium/build/print_python_deps.py b/chromium/build/print_python_deps.py
index fd29c0972c9..2a0118563e5 100755
--- a/chromium/build/print_python_deps.py
+++ b/chromium/build/print_python_deps.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python2.7
+#!/usr/bin/python3
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
@@ -152,7 +152,7 @@ def main():
# Trybots run with vpython as default Python, but with a different config
# from //.vpython. To make the is_vpython test work, and to match the behavior
- # of dev machines, the shebang line must be run with python2.7.
+ # of dev machines, the shebang line must be run with python3.
#
# E.g. $HOME/.vpython-root/dd50d3/bin/python
# E.g. /b/s/w/ir/cache/vpython/ab5c79/bin/python
diff --git a/chromium/build/util/python2_action.py b/chromium/build/util/python2_action.py
index a62d065ce13..d23ec8eaf2f 100644
--- a/chromium/build/util/python2_action.py
+++ b/chromium/build/util/python2_action.py
@@ -6,17 +6,5 @@
import subprocess
import sys
-if sys.version_info.major == 2:
- # If we get here, we're already Python2, so just re-execute the
- # command without the wrapper.
- exe = sys.executable
-elif sys.executable.endswith('.exe'):
- # If we get here, we're a Python3 executable likely running on
- # Windows, so look for the Python2 wrapper in depot_tools.
- exe = 'python.bat'
-else:
- # If we get here, we are a Python3 executable. Hope that we can find
- # a `python2.7` in path somewhere.
- exe = 'python2.7'
-
+exe = sys.executable
sys.exit(subprocess.call([exe] + sys.argv[1:]))
diff --git a/chromium/components/resources/protobufs/binary_proto_generator.py b/chromium/components/resources/protobufs/binary_proto_generator.py
index 7422ead9697..f98e87594eb 100755
--- a/chromium/components/resources/protobufs/binary_proto_generator.py
+++ b/chromium/components/resources/protobufs/binary_proto_generator.py
@@ -7,9 +7,8 @@
Converts a given ASCII proto into a binary resource.
"""
-
+from __future__ import print_function
import abc
-import imp
import optparse
import os
import re
@@ -17,6 +16,12 @@ import subprocess
import sys
import traceback
+PY34 = sys.version_info[0:2] >= (3, 4)
+
+if PY34:
+ from importlib import util as imp_util
+else:
+ import imp
class GoogleProtobufModuleImporter:
"""A custom module importer for importing google.protobuf.
@@ -67,8 +72,16 @@ class GoogleProtobufModuleImporter:
# but is included for completeness.
raise ImportError(fullname)
- filepath = self._fullname_to_filepath(fullname)
- return imp.load_source(fullname, filepath)
+ if PY34:
+ filepath = self._fullname_to_filepath(fullname)
+ spec = imp_util.spec_from_file_location(fullname, filepath)
+ loaded = imp_util.module_from_spec(spec)
+ spec.loader.exec_module(loaded)
+
+ else:
+ return imp.load_source(fullname, filepath)
+
+ return loaded
class BinaryProtoGenerator:
@@ -196,12 +209,12 @@ class BinaryProtoGenerator:
self._ImportProtoModules(opts.path)
if not self.VerifyArgs(opts):
- print "Wrong arguments"
+ print("Wrong arguments")
return 1
try:
self._GenerateBinaryProtos(opts)
except Exception as e:
- print "ERROR: Failed to render binary version of %s:\n %s\n%s" % (
- opts.infile, str(e), traceback.format_exc())
+ print("ERROR: Failed to render binary version of %s:\n %s\n%s" %
+ (opts.infile, str(e), traceback.format_exc()))
return 1
diff --git a/chromium/components/variations/service/generate_ui_string_overrider.py b/chromium/components/variations/service/generate_ui_string_overrider.py
index 859b758ef8b..2da8713403a 100755
--- a/chromium/components/variations/service/generate_ui_string_overrider.py
+++ b/chromium/components/variations/service/generate_ui_string_overrider.py
@@ -20,7 +20,7 @@ SCRIPT_NAME = "generate_ui_string_overrider.py"
# #define IDS_FOO_MESSAGE 1234
# With generate whitelist flag:
# #define IDS_FOO_MESSAGE (::ui::AllowlistedResource<1234>(), 1234)
-RESOURCE_EXTRACT_REGEX = re.compile('^#define (\S*).* (\d+)\)?$', re.MULTILINE)
+RESOURCE_EXTRACT_REGEX = re.compile(r'^#define (\S*).* (\d+)\)?$', re.MULTILINE)
class Error(Exception):
"""Base error class for all exceptions in generated_resources_map."""
diff --git a/chromium/content/browser/tracing/generate_trace_viewer_grd.py b/chromium/content/browser/tracing/generate_trace_viewer_grd.py
index 037f9497dc2..be393d21f90 100755
--- a/chromium/content/browser/tracing/generate_trace_viewer_grd.py
+++ b/chromium/content/browser/tracing/generate_trace_viewer_grd.py
@@ -74,7 +74,7 @@ def main(argv):
for filename in parsed_args.source_files:
add_file_to_grd(doc, os.path.basename(filename))
- with open(parsed_args.output_filename, 'w') as output_file:
+ with open(parsed_args.output_filename, 'wb') as output_file:
output_file.write(doc.toxml(encoding='UTF-8'))
diff --git a/chromium/mojo/public/tools/bindings/BUILD.gn b/chromium/mojo/public/tools/bindings/BUILD.gn
index fc04b5dd0b1..708958e438b 100644
--- a/chromium/mojo/public/tools/bindings/BUILD.gn
+++ b/chromium/mojo/public/tools/bindings/BUILD.gn
@@ -2,9 +2,11 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//build/config/python.gni")
import("//mojo/public/tools/bindings/mojom.gni")
import("//third_party/jinja2/jinja2.gni")
+# TODO(crbug.com/1194274): Investigate nondeterminism in Py3 builds.
action("precompile_templates") {
sources = mojom_generator_sources
sources += [
diff --git a/chromium/mojo/public/tools/bindings/concatenate_and_replace_closure_exports.py b/chromium/mojo/public/tools/bindings/concatenate_and_replace_closure_exports.py
index be8985cedc9..e42ee0edf69 100755
--- a/chromium/mojo/public/tools/bindings/concatenate_and_replace_closure_exports.py
+++ b/chromium/mojo/public/tools/bindings/concatenate_and_replace_closure_exports.py
@@ -31,7 +31,7 @@ def FilterLine(filename, line, output):
return
if line.startswith("goog.provide"):
- match = re.match("goog.provide\('([^']+)'\);", line)
+ match = re.match(r"goog.provide\('([^']+)'\);", line)
if not match:
print("Invalid goog.provide line in %s:\n%s" % (filename, line))
exit(1)
diff --git a/chromium/mojo/public/tools/bindings/gen_data_files_list.py b/chromium/mojo/public/tools/bindings/gen_data_files_list.py
index 79c9e50efce..8b78d092418 100644
--- a/chromium/mojo/public/tools/bindings/gen_data_files_list.py
+++ b/chromium/mojo/public/tools/bindings/gen_data_files_list.py
@@ -18,7 +18,6 @@ import os
import re
import sys
-from cStringIO import StringIO
from optparse import OptionParser
sys.path.insert(
@@ -41,12 +40,9 @@ def main():
pattern = re.compile(options.pattern)
files = [f for f in os.listdir(options.directory) if pattern.match(f)]
- stream = StringIO()
- for f in files:
- print(f, file=stream)
+ contents = '\n'.join(f for f in files) + '\n'
+ WriteFile(contents, options.output)
- WriteFile(stream.getvalue(), options.output)
- stream.close()
if __name__ == '__main__':
sys.exit(main())
diff --git a/chromium/mojo/public/tools/bindings/generators/mojom_java_generator.py b/chromium/mojo/public/tools/bindings/generators/mojom_java_generator.py
index 96b2fdfae0c..00b9dccd00c 100644
--- a/chromium/mojo/public/tools/bindings/generators/mojom_java_generator.py
+++ b/chromium/mojo/public/tools/bindings/generators/mojom_java_generator.py
@@ -25,6 +25,10 @@ sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir,
'build', 'android', 'gyp'))
from util import build_utils
+# TODO(crbug.com/1174969): Remove this once Python2 is obsoleted.
+if sys.version_info.major != 2:
+ basestring = str
+ long = int
GENERATOR_PREFIX = 'java'
diff --git a/chromium/mojo/public/tools/mojom/mojom/generate/generator.py b/chromium/mojo/public/tools/mojom/mojom/generate/generator.py
index de62260a5c9..4a1c73fcf82 100644
--- a/chromium/mojo/public/tools/mojom/mojom/generate/generator.py
+++ b/chromium/mojo/public/tools/mojom/mojom/generate/generator.py
@@ -136,9 +136,14 @@ class Stylizer(object):
def WriteFile(contents, full_path):
# If |contents| is same with the file content, we skip updating.
+ if not isinstance(contents, bytes):
+ data = contents.encode('utf8')
+ else:
+ data = contents
+
if os.path.isfile(full_path):
with open(full_path, 'rb') as destination_file:
- if destination_file.read() == contents:
+ if destination_file.read() == data:
return
# Make sure the containing directory exists.
@@ -146,11 +151,8 @@ def WriteFile(contents, full_path):
fileutil.EnsureDirectoryExists(full_dir)
# Dump the data to disk.
- with open(full_path, "wb") as f:
- if not isinstance(contents, bytes):
- f.write(contents.encode('utf-8'))
- else:
- f.write(contents)
+ with open(full_path, 'wb') as f:
+ f.write(data)
def AddComputedData(module):
diff --git a/chromium/mojo/public/tools/mojom/mojom/generate/module.py b/chromium/mojo/public/tools/mojom/mojom/generate/module.py
index ebbc9b322ea..3d026429bbc 100644
--- a/chromium/mojo/public/tools/mojom/mojom/generate/module.py
+++ b/chromium/mojo/public/tools/mojom/mojom/generate/module.py
@@ -398,7 +398,8 @@ class Field(object):
class StructField(Field):
- pass
+ def __hash__(self):
+ return super(Field, self).__hash__()
class UnionField(Field):
diff --git a/chromium/mojo/public/tools/mojom/mojom/generate/template_expander.py b/chromium/mojo/public/tools/mojom/mojom/generate/template_expander.py
index 7a300560246..8d9e26fb7f6 100644
--- a/chromium/mojo/public/tools/mojom/mojom/generate/template_expander.py
+++ b/chromium/mojo/public/tools/mojom/mojom/generate/template_expander.py
@@ -75,9 +75,9 @@ def PrecompileTemplates(generator_modules, output_dir):
os.path.dirname(module.__file__), generator.GetTemplatePrefix())
]))
jinja_env.filters.update(generator.GetFilters())
- jinja_env.compile_templates(
- os.path.join(output_dir, "%s.zip" % generator.GetTemplatePrefix()),
- extensions=["tmpl"],
- zip="stored",
- py_compile=True,
- ignore_errors=False)
+ jinja_env.compile_templates(os.path.join(
+ output_dir, "%s.zip" % generator.GetTemplatePrefix()),
+ extensions=["tmpl"],
+ zip="stored",
+ py_compile=sys.version_info.major < 3,
+ ignore_errors=False)
diff --git a/chromium/sandbox/policy/mac/package_sb_file.py b/chromium/sandbox/policy/mac/package_sb_file.py
index 934fd2261b5..152c3860028 100755
--- a/chromium/sandbox/policy/mac/package_sb_file.py
+++ b/chromium/sandbox/policy/mac/package_sb_file.py
@@ -3,6 +3,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import print_function
import os
import sys
@@ -28,7 +29,7 @@ def escape_for_c(line):
def pack_file(argv):
if len(argv) != 2:
- print >> sys.stderr, 'usage: package_sb_file.py input_filename output_dir'
+ print('usage: package_sb_file.py input_filename output_dir', file=sys.stderr)
return 1
input_filename = argv[0]
output_directory = argv[1]
@@ -37,14 +38,14 @@ def pack_file(argv):
output_h_file = output_directory + '/' + input_basename + '.h'
output_cc_file = output_directory + '/' + input_basename + '.cc'
try:
- with open(input_filename, 'rb') as infile:
- with open(output_h_file, 'wb') as outfile:
+ with open(input_filename, 'r') as infile:
+ with open(output_h_file, 'w') as outfile:
outfile.write(header)
outfile.write(h_include)
outfile.write(namespace)
outfile.write(h_definition % module_name)
outfile.write(namespace_end)
- with open(output_cc_file, 'wb') as outfile:
+ with open(output_cc_file, 'w') as outfile:
outfile.write(header)
outfile.write(cc_include % module_name)
outfile.write(namespace)
@@ -56,7 +57,7 @@ def pack_file(argv):
outfile.write(cc_definition_end)
outfile.write(namespace_end)
except IOError:
- print >> sys.stderr, 'Failed to process %s' % input_filename
+ print('Failed to process %s' % input_filename, file = sys.stderr)
return 1
return 0
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py
index 3225ecca6e4..fc078d31b55 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py
@@ -344,7 +344,7 @@ def make_default_value_expr(idl_type, default_value):
"""
assert default_value.is_type_compatible_with(idl_type)
- class DefaultValueExpr:
+ class DefaultValueExpr(object):
_ALLOWED_SYMBOLS_IN_DEPS = ("isolate")
def __init__(self, initializer_expr, initializer_deps,
@@ -502,7 +502,7 @@ def make_v8_to_blink_value(blink_var_name,
assert isinstance(blink_var_name, str)
assert isinstance(v8_value_expr, str)
assert isinstance(idl_type, web_idl.IdlType)
- assert (argument_index is None or isinstance(argument_index, (int, long)))
+ assert (argument_index is None or isinstance(argument_index, int))
assert (default_value is None
or isinstance(default_value, web_idl.LiteralConstant))
@@ -622,7 +622,7 @@ def make_v8_to_blink_value_variadic(blink_var_name, v8_array,
"""
assert isinstance(blink_var_name, str)
assert isinstance(v8_array, str)
- assert isinstance(v8_array_start_index, (int, long))
+ assert isinstance(v8_array_start_index, int)
assert isinstance(idl_type, web_idl.IdlType)
pattern = ("auto&& ${{{_1}}} = "
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/callback_interface.py b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/callback_interface.py
index 4a6df513068..8b51f23a409 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/callback_interface.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/callback_interface.py
@@ -177,7 +177,7 @@ def generate_callback_interface(callback_interface_identifier):
prop_install_mode=PropInstallMode.UNCONDITIONAL,
trampoline_var_name=None,
attribute_entries=[],
- constant_entries=filter(is_unconditional, constant_entries),
+ constant_entries=list(filter(is_unconditional, constant_entries)),
exposed_construct_entries=[],
operation_entries=[])
(install_interface_template_decl, install_interface_template_def,
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/code_node.py b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/code_node.py
index 52972fefe20..e5ae9d9629e 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/code_node.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/code_node.py
@@ -503,13 +503,13 @@ class CompositeNode(CodeNode):
gensym_kwargs = {}
template_vars = {}
for arg in args:
- assert isinstance(arg, (CodeNode, int, long, str))
+ assert isinstance(arg, (CodeNode, int, str))
gensym = CodeNode.gensym()
gensym_args.append("${{{}}}".format(gensym))
template_vars[gensym] = arg
for key, value in kwargs.items():
- assert isinstance(key, (int, long, str))
- assert isinstance(value, (CodeNode, int, long, str))
+ assert isinstance(key, (int, str))
+ assert isinstance(value, (CodeNode, int, str))
gensym = CodeNode.gensym()
gensym_kwargs[key] = "${{{}}}".format(gensym)
template_vars[gensym] = value
@@ -602,7 +602,7 @@ class ListNode(CodeNode):
def insert(self, index, node):
if node is None:
return
- assert isinstance(index, (int, long))
+ assert isinstance(index, int)
assert isinstance(node, CodeNode)
assert node.outer is None and node.prev is None
@@ -721,7 +721,7 @@ class SymbolScopeNode(SequenceNode):
if not scope_chains:
return counts
- self_index = iter(scope_chains).next().index(self)
+ self_index = next(iter(scope_chains)).index(self)
scope_chains = map(
lambda scope_chain: scope_chain[self_index + 1:], scope_chains)
scope_to_likeliness = {}
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_expr.py b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_expr.py
index a229a6c71c9..5fa288dabf2 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_expr.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_expr.py
@@ -109,7 +109,7 @@ def expr_and(terms):
if any(term.is_always_false for term in terms):
return _Expr(False)
- terms = filter(lambda x: not x.is_always_true, terms)
+ terms = list(filter(lambda x: not x.is_always_true, terms))
if not terms:
return _Expr(True)
if len(terms) == 1:
@@ -124,7 +124,7 @@ def expr_or(terms):
if any(term.is_always_true for term in terms):
return _Expr(True)
- terms = filter(lambda x: not x.is_always_false, terms)
+ terms = list(filter(lambda x: not x.is_always_false, terms))
if not terms:
return _Expr(False)
if len(terms) == 1:
@@ -222,7 +222,7 @@ def expr_from_exposure(exposure,
elif exposure.only_in_secure_contexts is False:
secure_context_term = _Expr(True)
else:
- terms = map(ref_enabled, exposure.only_in_secure_contexts)
+ terms = list(map(ref_enabled, exposure.only_in_secure_contexts))
secure_context_term = expr_or(
[_Expr("${is_in_secure_context}"),
expr_not(expr_and(terms))])
@@ -275,10 +275,11 @@ def expr_from_exposure(exposure,
# [ContextEnabled]
if exposure.context_enabled_features:
- terms = map(
- lambda feature: _Expr(
- "${{context_feature_settings}}->is{}Enabled()".format(
- feature)), exposure.context_enabled_features)
+ terms = list(
+ map(
+ lambda feature: _Expr(
+ "${{context_feature_settings}}->is{}Enabled()".format(
+ feature)), exposure.context_enabled_features))
context_enabled_terms.append(
expr_and([_Expr("${context_feature_settings}"),
expr_or(terms)]))
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_format.py b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_format.py
index 87d26eec3ca..f3e9d38247e 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_format.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_format.py
@@ -23,7 +23,7 @@ class _TemplateFormatter(string.Formatter):
self._template_formatter_indexing_count_ = 0
def get_value(self, key, args, kwargs):
- if isinstance(key, (int, long)):
+ if isinstance(key, int):
return args[key]
assert isinstance(key, str)
if not key:
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_utils.py b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_utils.py
index 2bcc4fed49a..e72282aa696 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_utils.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_utils.py
@@ -116,4 +116,4 @@ def write_code_node_to_file(code_node, filepath):
# stderr=format_result.error_message))
#
# web_idl.file_io.write_to_file_if_changed(filepath, format_result.contents)
- web_idl.file_io.write_to_file_if_changed(filepath, rendered_text)
+ web_idl.file_io.write_to_file_if_changed(filepath, rendered_text.encode('utf-8'))
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/dictionary.py b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/dictionary.py
index b39f0100410..4d68202296b 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/dictionary.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/dictionary.py
@@ -993,7 +993,7 @@ def make_dict_trace_func(cg_context):
_2 = _blink_member_name(member).value_var
return TextNode(_format(pattern, _1=_1, _2=_2))
- body.extend(map(make_trace_member_node, own_members))
+ body.extend(list(map(make_trace_member_node, own_members)))
body.append(TextNode("BaseClass::Trace(visitor);"))
return func_decl, func_def
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py
index 10ff30656ad..bfdf7128aac 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py
@@ -582,7 +582,7 @@ def _make_blink_api_call(code_node,
overriding_args=None):
assert isinstance(code_node, SymbolScopeNode)
assert isinstance(cg_context, CodeGenContext)
- assert num_of_args is None or isinstance(num_of_args, (int, long))
+ assert num_of_args is None or isinstance(num_of_args, int)
assert (overriding_args is None
or (isinstance(overriding_args, (list, tuple))
and all(isinstance(arg, str) for arg in overriding_args)))
@@ -1196,8 +1196,10 @@ def make_overload_dispatcher(cg_context):
did_use_break = did_use_break or can_fail
conditional = expr_or(
- map(lambda item: expr_from_exposure(item.function_like.exposure),
- items))
+ list(
+ map(
+ lambda item: expr_from_exposure(item.function_like.exposure
+ ), items)))
if not conditional.is_always_true:
node = CxxUnlikelyIfNode(cond=conditional, body=node)
@@ -4642,7 +4644,7 @@ class _PropEntryConstructorGroup(_PropEntryBase):
def __init__(self, is_context_dependent, exposure_conditional, world,
constructor_group, ctor_callback_name, ctor_func_length):
assert isinstance(ctor_callback_name, str)
- assert isinstance(ctor_func_length, (int, long))
+ assert isinstance(ctor_func_length, int)
_PropEntryBase.__init__(self, is_context_dependent,
exposure_conditional, world, constructor_group)
@@ -4670,7 +4672,7 @@ class _PropEntryOperationGroup(_PropEntryBase):
op_func_length,
no_alloc_direct_callback_name=None):
assert isinstance(op_callback_name, str)
- assert isinstance(op_func_length, (int, long))
+ assert isinstance(op_func_length, int)
_PropEntryBase.__init__(self, is_context_dependent,
exposure_conditional, world, operation_group)
@@ -5175,9 +5177,9 @@ def make_install_interface_template(cg_context, function_name, class_name, api_c
])
if class_like.identifier == "CSSStyleDeclaration":
- css_properties = filter(
- lambda attr: "CSSProperty" in attr.extended_attributes,
- class_like.attributes)
+ css_properties = list(
+ filter(lambda attr: "CSSProperty" in attr.extended_attributes,
+ class_like.attributes))
if css_properties:
prop_name_list = "".join(
map(lambda attr: "\"{}\", ".format(attr.identifier),
@@ -5567,8 +5569,8 @@ ${instance_object} = ${v8_context}->Global()->GetPrototype().As<v8::Object>();\
"V8DOMConfiguration::InstallConstants(${isolate}, "
"${interface_template}, ${prototype_template}, "
"kConstantCallbackTable, base::size(kConstantCallbackTable));")
- constant_callback_entries = filter(lambda entry: entry.const_callback_name,
- constant_entries)
+ constant_callback_entries = list(filter(lambda entry: entry.const_callback_name,
+ constant_entries))
install_properties(table_name, constant_callback_entries,
_make_constant_callback_registration_table,
installer_call_text)
@@ -5584,8 +5586,8 @@ ${instance_object} = ${v8_context}->Global()->GetPrototype().As<v8::Object>();\
"V8DOMConfiguration::InstallConstants(${isolate}, "
"${interface_template}, ${prototype_template}, "
"kConstantValueTable, base::size(kConstantValueTable));")
- constant_value_entries = filter(
- lambda entry: not entry.const_callback_name, constant_entries)
+ constant_value_entries = list(filter(
+ lambda entry: not entry.const_callback_name, constant_entries))
install_properties(table_name, constant_value_entries,
_make_constant_value_registration_table,
installer_call_text)
@@ -6336,8 +6338,8 @@ def make_v8_context_snapshot_api(cg_context, component, attribute_entries,
assert isinstance(component, web_idl.Component)
derived_interfaces = cg_context.interface.deriveds
- derived_names = map(lambda interface: interface.identifier,
- derived_interfaces)
+ derived_names = list(
+ map(lambda interface: interface.identifier, derived_interfaces))
derived_names.append(cg_context.interface.identifier)
if not ("Window" in derived_names or "HTMLDocument" in derived_names):
return None, None
@@ -6411,9 +6413,11 @@ def _make_v8_context_snapshot_get_reference_table_function(
collect_callbacks(named_properties_object_callback_defs)
collect_callbacks(cross_origin_property_callback_defs)
- entry_nodes = map(
- lambda name: TextNode("reinterpret_cast<intptr_t>({}),".format(name)),
- filter(None, callback_names))
+ entry_nodes = list(
+ map(
+ lambda name: TextNode("reinterpret_cast<intptr_t>({}),".format(name
+ )),
+ filter(None, callback_names)))
table_node = ListNode([
TextNode("using namespace ${class_name}Callbacks;"),
TextNode("static const intptr_t kReferenceTable[] = {"),
@@ -6451,10 +6455,11 @@ def _make_v8_context_snapshot_install_props_per_context_function(
class_name=None,
prop_install_mode=PropInstallMode.V8_CONTEXT_SNAPSHOT,
trampoline_var_name=None,
- attribute_entries=filter(selector, attribute_entries),
- constant_entries=filter(selector, constant_entries),
- exposed_construct_entries=filter(selector, exposed_construct_entries),
- operation_entries=filter(selector, operation_entries))
+ attribute_entries=list(filter(selector, attribute_entries)),
+ constant_entries=list(filter(selector, constant_entries)),
+ exposed_construct_entries=list(
+ filter(selector, exposed_construct_entries)),
+ operation_entries=list(filter(selector, operation_entries)))
return func_decl, func_def
@@ -6810,11 +6815,11 @@ def generate_interface(interface_identifier):
class_name=impl_class_name,
prop_install_mode=PropInstallMode.UNCONDITIONAL,
trampoline_var_name=tp_install_unconditional_props,
- attribute_entries=filter(is_unconditional, attribute_entries),
- constant_entries=filter(is_unconditional, constant_entries),
- exposed_construct_entries=filter(is_unconditional,
- exposed_construct_entries),
- operation_entries=filter(is_unconditional, operation_entries))
+ attribute_entries=list(filter(is_unconditional, attribute_entries)),
+ constant_entries=list(filter(is_unconditional, constant_entries)),
+ exposed_construct_entries=list(
+ filter(is_unconditional, exposed_construct_entries)),
+ operation_entries=list(filter(is_unconditional, operation_entries)))
(install_context_independent_props_decl,
install_context_independent_props_def,
install_context_independent_props_trampoline) = make_install_properties(
@@ -6823,11 +6828,14 @@ def generate_interface(interface_identifier):
class_name=impl_class_name,
prop_install_mode=PropInstallMode.CONTEXT_INDEPENDENT,
trampoline_var_name=tp_install_context_independent_props,
- attribute_entries=filter(is_context_independent, attribute_entries),
- constant_entries=filter(is_context_independent, constant_entries),
- exposed_construct_entries=filter(is_context_independent,
- exposed_construct_entries),
- operation_entries=filter(is_context_independent, operation_entries))
+ attribute_entries=list(
+ filter(is_context_independent, attribute_entries)),
+ constant_entries=list(filter(is_context_independent,
+ constant_entries)),
+ exposed_construct_entries=list(
+ filter(is_context_independent, exposed_construct_entries)),
+ operation_entries=list(
+ filter(is_context_independent, operation_entries)))
(install_context_dependent_props_decl, install_context_dependent_props_def,
install_context_dependent_props_trampoline) = make_install_properties(
cg_context,
@@ -6835,11 +6843,13 @@ def generate_interface(interface_identifier):
class_name=impl_class_name,
prop_install_mode=PropInstallMode.CONTEXT_DEPENDENT,
trampoline_var_name=tp_install_context_dependent_props,
- attribute_entries=filter(is_context_dependent, attribute_entries),
- constant_entries=filter(is_context_dependent, constant_entries),
- exposed_construct_entries=filter(is_context_dependent,
- exposed_construct_entries),
- operation_entries=filter(is_context_dependent, operation_entries))
+ attribute_entries=list(filter(is_context_dependent,
+ attribute_entries)),
+ constant_entries=list(filter(is_context_dependent, constant_entries)),
+ exposed_construct_entries=list(
+ filter(is_context_dependent, exposed_construct_entries)),
+ operation_entries=list(filter(is_context_dependent,
+ operation_entries)))
(install_interface_template_decl, install_interface_template_def,
install_interface_template_trampoline) = make_install_interface_template(
cg_context,
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/mako_renderer.py b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/mako_renderer.py
index b4c70553863..f3a2fcd772d 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/mako_renderer.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/mako_renderer.py
@@ -105,7 +105,7 @@ class MakoRenderer(object):
on_error = self._caller_stack_on_error
if (len(current) <= len(on_error)
and all(current[i] == on_error[i]
- for i in xrange(len(current)))):
+ for i in range(len(current)))):
pass # Error happened in a deeper caller.
else:
self._caller_stack_on_error = list(self._caller_stack)
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/style_format.py b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/style_format.py
index dc3493cc394..017d3d47bb3 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/style_format.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/style_format.py
@@ -70,8 +70,13 @@ def gn_format(contents, filename=None):
def _invoke_format_command(command_line, filename, contents):
- proc = subprocess.Popen(
- command_line, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
+ kwargs = {}
+ if sys.version_info.major != 2:
+ kwargs['encoding'] = 'utf-8'
+ proc = subprocess.Popen(command_line,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ **kwargs)
stdout_output, stderr_output = proc.communicate(input=contents)
exit_code = proc.wait()
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/task_queue.py b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/task_queue.py
index 0d8f4c0f303..e666a9b668e 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/task_queue.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/task_queue.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import functools
import multiprocessing
from .package_initializer import package_initializer
@@ -76,7 +77,7 @@ class TaskQueue(object):
if not report_progress:
return
- done_count = reduce(
+ done_count = functools.reduce(
lambda count, worker_task: count + bool(worker_task.ready()),
self._worker_tasks, 0)
report_progress(len(self._worker_tasks), done_count)
@@ -85,4 +86,4 @@ class TaskQueue(object):
def _task_queue_run_tasks(tasks):
for task in tasks:
func, args, kwargs = task
- apply(func, args, kwargs)
+ func(*args, **kwargs)
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/code_generator.py b/chromium/third_party/blink/renderer/bindings/scripts/code_generator.py
index e8280be7213..e49e6eb965e 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/code_generator.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/code_generator.py
@@ -13,6 +13,7 @@ import re
import sys
from idl_types import set_ancestors, IdlType
+from itertools import groupby
from v8_globals import includes
from v8_interface import constant_filters
from v8_types import set_component_dirs
@@ -43,6 +44,7 @@ TEMPLATES_DIR = os.path.normpath(
# after path[0] == invoking script dir
sys.path.insert(1, THIRD_PARTY_DIR)
import jinja2
+from jinja2.filters import make_attrgetter, environmentfilter
def generate_indented_conditional(code, conditional):
@@ -88,6 +90,13 @@ def runtime_enabled_if(code, name):
return generate_indented_conditional(code, function)
+@environmentfilter
+def do_stringify_key_group_by(environment, value, attribute):
+ expr = make_attrgetter(environment, attribute)
+ key = lambda item: '' if expr(item) is None else str(expr(item))
+ return groupby(sorted(value, key=key), expr)
+
+
def initialize_jinja_env(cache_dir):
jinja_env = jinja2.Environment(
loader=jinja2.FileSystemLoader(TEMPLATES_DIR),
@@ -117,6 +126,7 @@ def initialize_jinja_env(cache_dir):
})
jinja_env.filters.update(constant_filters())
jinja_env.filters.update(method_filters())
+ jinja_env.filters["stringifykeygroupby"] = do_stringify_key_group_by
return jinja_env
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/generate_origin_trial_features.py b/chromium/third_party/blink/renderer/bindings/scripts/generate_origin_trial_features.py
index 130004eae83..04c0fabcef2 100755
--- a/chromium/third_party/blink/renderer/bindings/scripts/generate_origin_trial_features.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/generate_origin_trial_features.py
@@ -80,7 +80,7 @@ def read_idl_file(reader, idl_filename):
assert len(interfaces) == 1, (
"Expected one interface in file %r, found %d" %
(idl_filename, len(interfaces)))
- return (interfaces.values()[0], includes)
+ return (list(interfaces.values())[0], includes)
def interface_is_global(interface):
@@ -281,7 +281,7 @@ def main():
info_provider = create_component_info_provider(
os.path.normpath(options.info_dir), options.target_component)
- idl_filenames = map(str.strip, open(options.idl_files_list))
+ idl_filenames = list(map(str.strip, open(options.idl_files_list)))
generate_origin_trial_features(info_provider, options, idl_filenames)
return 0
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/idl_definitions.py b/chromium/third_party/blink/renderer/bindings/scripts/idl_definitions.py
index 14e6e9d3f87..b027818aef2 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/idl_definitions.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/idl_definitions.py
@@ -394,7 +394,8 @@ class IdlInterface(object):
else:
raise ValueError('Unrecognized node class: %s' % child_class)
- if len(filter(None, [self.iterable, self.maplike, self.setlike])) > 1:
+ if len(list(filter(None,
+ [self.iterable, self.maplike, self.setlike]))) > 1:
raise ValueError(
'Interface can only have one of iterable<>, maplike<> and setlike<>.'
)
@@ -512,6 +513,9 @@ class IdlAttribute(TypedObject):
def accept(self, visitor):
visitor.visit_attribute(self)
+ def __lt__(self, other):
+ return self.name < other.name
+
################################################################################
# Constants
@@ -852,7 +856,7 @@ class IdlIncludes(object):
################################################################################
-class Exposure:
+class Exposure(object):
"""An Exposure holds one Exposed or RuntimeEnabled condition.
Each exposure has two properties: exposed and runtime_enabled.
Exposure(e, r) corresponds to [Exposed(e r)]. Exposure(e) corresponds to
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/idl_reader.py b/chromium/third_party/blink/renderer/bindings/scripts/idl_reader.py
index 8d72865a6ca..b80eebdcd61 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/idl_reader.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/idl_reader.py
@@ -55,8 +55,8 @@ def validate_blink_idl_definitions(idl_filename, idl_file_basename,
definitions. There is no filename convention in this case.
- Otherwise, an IDL file is invalid.
"""
- targets = (
- definitions.interfaces.values() + definitions.dictionaries.values())
+ targets = (list(definitions.interfaces.values()) +
+ list(definitions.dictionaries.values()))
number_of_targets = len(targets)
if number_of_targets > 1:
raise Exception(
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/idl_types.py b/chromium/third_party/blink/renderer/bindings/scripts/idl_types.py
index cd4f0c3513b..ab95e9c0b08 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/idl_types.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/idl_types.py
@@ -349,7 +349,7 @@ class IdlUnionType(IdlTypeBase):
return True
def single_matching_member_type(self, predicate):
- matching_types = filter(predicate, self.flattened_member_types)
+ matching_types = list(filter(predicate, self.flattened_member_types))
if len(matching_types) > 1:
raise ValueError('%s is ambiguous.' % self.name)
return matching_types[0] if matching_types else None
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/utilities.py b/chromium/third_party/blink/renderer/bindings/scripts/utilities.py
index e1677ee7bd6..3c5006f064f 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/utilities.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/utilities.py
@@ -196,8 +196,9 @@ class ComponentInfoProviderModules(ComponentInfoProvider):
@property
def callback_functions(self):
- return dict(self._component_info_core['callback_functions'].items() +
- self._component_info_modules['callback_functions'].items())
+ return dict(
+ list(self._component_info_core['callback_functions'].items()) +
+ list(self._component_info_modules['callback_functions'].items()))
@property
def specifier_for_export(self):
@@ -209,8 +210,8 @@ class ComponentInfoProviderModules(ComponentInfoProvider):
def load_interfaces_info_overall_pickle(info_dir):
- with open(os.path.join(info_dir,
- 'interfaces_info.pickle')) as interface_info_file:
+ with open(os.path.join(info_dir, 'interfaces_info.pickle'),
+ mode='rb') as interface_info_file:
return pickle.load(interface_info_file)
@@ -236,23 +237,20 @@ def merge_dict_recursively(target, diff):
def create_component_info_provider_core(info_dir):
interfaces_info = load_interfaces_info_overall_pickle(info_dir)
- with open(
- os.path.join(info_dir, 'core',
- 'component_info_core.pickle')) as component_info_file:
+ with open(os.path.join(info_dir, 'core', 'component_info_core.pickle'),
+ mode='rb') as component_info_file:
component_info = pickle.load(component_info_file)
return ComponentInfoProviderCore(interfaces_info, component_info)
def create_component_info_provider_modules(info_dir):
interfaces_info = load_interfaces_info_overall_pickle(info_dir)
- with open(
- os.path.join(info_dir, 'core',
- 'component_info_core.pickle')) as component_info_file:
+ with open(os.path.join(info_dir, 'core', 'component_info_core.pickle'),
+ mode='rb') as component_info_file:
component_info_core = pickle.load(component_info_file)
- with open(
- os.path.join(
- info_dir, 'modules',
- 'component_info_modules.pickle')) as component_info_file:
+ with open(os.path.join(info_dir, 'modules',
+ 'component_info_modules.pickle'),
+ mode='rb') as component_info_file:
component_info_modules = pickle.load(component_info_file)
return ComponentInfoProviderModules(interfaces_info, component_info_core,
component_info_modules)
@@ -356,7 +354,7 @@ def write_pickle_file(pickle_filename, data):
pickle_filename = abs(pickle_filename)
# If |data| is same with the file content, we skip updating.
if os.path.isfile(pickle_filename):
- with open(pickle_filename) as pickle_file:
+ with open(pickle_filename, 'rb') as pickle_file:
try:
if pickle.load(pickle_file) == data:
return
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/v8_interface.py b/chromium/third_party/blink/renderer/bindings/scripts/v8_interface.py
index a43260414db..a85b03abe75 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/v8_interface.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/v8_interface.py
@@ -189,7 +189,7 @@ def context_enabled_features(attributes):
return sorted([
member for member in members
if member.get(KEY) and not member.get('exposed_test')
- ])
+ ], key=lambda item: item['name'])
def member_filter_by_name(members, name):
return [member for member in members if member[KEY] == name]
@@ -612,7 +612,8 @@ def interface_context(interface, interfaces, component_info):
sorted(
origin_trial_features(interface, context['constants'],
context['attributes'], context['methods']) +
- context_enabled_features(context['attributes'])),
+ context_enabled_features(context['attributes']),
+ key=lambda item: item['name']),
})
if context['optional_features']:
includes.add('platform/bindings/v8_per_context_data.h')
@@ -1356,9 +1357,9 @@ def resolution_tests_methods(effective_overloads):
# Extract argument and IDL type to simplify accessing these in each loop.
arguments = [method['arguments'][index] for method in methods]
- arguments_methods = zip(arguments, methods)
+ arguments_methods = list(zip(arguments, methods))
idl_types = [argument['idl_type_object'] for argument in arguments]
- idl_types_methods = zip(idl_types, methods)
+ idl_types_methods = list(zip(idl_types, methods))
# We can’t do a single loop through all methods or simply sort them, because
# a method may be listed in multiple steps of the resolution algorithm, and
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/v8_methods.py b/chromium/third_party/blink/renderer/bindings/scripts/v8_methods.py
index 5f1f89a3def..6ee8a407798 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/v8_methods.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/v8_methods.py
@@ -46,6 +46,10 @@ import v8_types
import v8_utilities
from v8_utilities import (has_extended_attribute_value, is_unforgeable)
+# TODO: Remove this once Python2 is obsoleted.
+if sys.version_info.major != 2:
+ basestring = str
+
def method_is_visible(method, interface_is_partial):
if 'overloads' in method:
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/v8_utilities.py b/chromium/third_party/blink/renderer/bindings/scripts/v8_utilities.py
index 2ecd6923320..fcfc48371b1 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/v8_utilities.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/v8_utilities.py
@@ -271,7 +271,7 @@ EXPOSED_WORKERS = set([
])
-class ExposureSet:
+class ExposureSet(object):
"""An ExposureSet is a collection of Exposure instructions."""
def __init__(self, exposures=None):
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/web_idl/callback_interface.py b/chromium/third_party/blink/renderer/bindings/scripts/web_idl/callback_interface.py
index 13fb7c7068d..b73b7710687 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/web_idl/callback_interface.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/web_idl/callback_interface.py
@@ -91,11 +91,13 @@ class CallbackInterface(UserDefinedType, WithExtendedAttributes,
for operation_ir in ir.operations
])
self._operation_groups = tuple([
- OperationGroup(
- operation_group_ir,
- filter(lambda x: x.identifier == operation_group_ir.identifier,
- self._operations),
- owner=self) for operation_group_ir in ir.operation_groups
+ OperationGroup(operation_group_ir,
+ list(
+ filter(
+ lambda x: x.identifier == operation_group_ir
+ .identifier, self._operations)),
+ owner=self)
+ for operation_group_ir in ir.operation_groups
])
@property
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/web_idl/database.py b/chromium/third_party/blink/renderer/bindings/scripts/web_idl/database.py
index c92cf48eb2a..f5d59129449 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/web_idl/database.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/web_idl/database.py
@@ -156,4 +156,4 @@ class Database(object):
return self._view_by_kind(Database._Kind.UNION)
def _view_by_kind(self, kind):
- return self._impl.find_by_kind(kind).values()
+ return list(self._impl.find_by_kind(kind).values())
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/web_idl/exposure.py b/chromium/third_party/blink/renderer/bindings/scripts/web_idl/exposure.py
index abaeef39c30..e36cf7439ae 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/web_idl/exposure.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/web_idl/exposure.py
@@ -8,8 +8,11 @@ from .runtime_enabled_features import RuntimeEnabledFeatures
class _Feature(str):
"""Represents a runtime-enabled feature."""
+ def __new__(cls, value):
+ return str.__new__(cls, value)
+
def __init__(self, value):
- str.__init__(self, value)
+ str.__init__(self)
self._is_context_dependent = (
RuntimeEnabledFeatures.is_context_dependent(self))
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/web_idl/function_like.py b/chromium/third_party/blink/renderer/bindings/scripts/web_idl/function_like.py
index 648c70d803d..1712f19c672 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/web_idl/function_like.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/web_idl/function_like.py
@@ -71,8 +71,9 @@ class FunctionLike(WithIdentifier):
def num_of_required_arguments(self):
"""Returns the number of required arguments."""
return len(
- filter(lambda arg: not (arg.is_optional or arg.is_variadic),
- self.arguments))
+ list(
+ filter(lambda arg: not (arg.is_optional or arg.is_variadic),
+ self.arguments)))
class OverloadGroup(WithIdentifier):
@@ -171,8 +172,7 @@ class OverloadGroup(WithIdentifier):
Returns the effective overload set.
https://heycam.github.io/webidl/#compute-the-effective-overload-set
"""
- assert argument_count is None or isinstance(argument_count,
- (int, long))
+ assert argument_count is None or isinstance(argument_count, int)
N = argument_count
S = []
@@ -188,21 +188,21 @@ class OverloadGroup(WithIdentifier):
S.append(
OverloadGroup.EffectiveOverloadItem(
- X, map(lambda arg: arg.idl_type, X.arguments),
- map(lambda arg: arg.optionality, X.arguments)))
+ X, list(map(lambda arg: arg.idl_type, X.arguments)),
+ list(map(lambda arg: arg.optionality, X.arguments))))
if X.is_variadic:
- for i in xrange(n, max(maxarg, N)):
- t = map(lambda arg: arg.idl_type, X.arguments)
- o = map(lambda arg: arg.optionality, X.arguments)
- for _ in xrange(n, i + 1):
+ for i in range(n, max(maxarg, N)):
+ t = list(map(lambda arg: arg.idl_type, X.arguments))
+ o = list(map(lambda arg: arg.optionality, X.arguments))
+ for _ in range(n, i + 1):
t.append(X.arguments[-1].idl_type)
o.append(X.arguments[-1].optionality)
S.append(OverloadGroup.EffectiveOverloadItem(X, t, o))
- t = map(lambda arg: arg.idl_type, X.arguments)
- o = map(lambda arg: arg.optionality, X.arguments)
- for i in xrange(n - 1, -1, -1):
+ t = list(map(lambda arg: arg.idl_type, X.arguments))
+ o = list(map(lambda arg: arg.optionality, X.arguments))
+ for i in range(n - 1, -1, -1):
if X.arguments[i].optionality == IdlType.Optionality.REQUIRED:
break
S.append(OverloadGroup.EffectiveOverloadItem(X, t[:i], o[:i]))
@@ -222,7 +222,7 @@ class OverloadGroup(WithIdentifier):
for item in items)
assert len(items) > 1
- for index in xrange(len(items[0].type_list)):
+ for index in range(len(items[0].type_list)):
# Assume that the given items are valid, and we only need to test
# the two types.
if OverloadGroup.are_distinguishable_types(
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py b/chromium/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py
index c5ee2bd8a3d..58315072480 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py
@@ -149,8 +149,8 @@ class IdlCompiler(object):
for old_ir in old_irs:
new_ir = make_copy(old_ir)
self._ir_map.add(new_ir)
- new_ir.attributes = filter(not_disabled, new_ir.attributes)
- new_ir.operations = filter(not_disabled, new_ir.operations)
+ new_ir.attributes = list(filter(not_disabled, new_ir.attributes))
+ new_ir.operations = list(filter(not_disabled, new_ir.operations))
def _record_defined_in_partial_and_mixin(self):
old_irs = self._ir_map.irs_of_kinds(
@@ -231,7 +231,7 @@ class IdlCompiler(object):
only_to_members_of_partial_or_mixin=False)
propagate_to_exposure(propagate)
- map(process_member_like, ir.iter_all_members())
+ list(map(process_member_like, ir.iter_all_members()))
def process_member_like(ir):
propagate = functools.partial(propagate_extattr, ir=ir)
@@ -257,7 +257,7 @@ class IdlCompiler(object):
self._ir_map.move_to_new_phase()
- map(process_interface_like, old_irs)
+ list(map(process_interface_like, old_irs))
def _determine_blink_headers(self):
irs = self._ir_map.irs_of_kinds(
@@ -422,9 +422,9 @@ class IdlCompiler(object):
assert not new_interface.deriveds
derived_set = identifier_to_derived_set.get(
new_interface.identifier, set())
- new_interface.deriveds = map(
- lambda id_: self._ref_to_idl_def_factory.create(id_),
- sorted(derived_set))
+ new_interface.deriveds = list(
+ map(lambda id_: self._ref_to_idl_def_factory.create(id_),
+ sorted(derived_set)))
def _supplement_missing_html_constructor_operation(self):
# Temporary mitigation of misuse of [HTMLConstructor]
@@ -553,7 +553,8 @@ class IdlCompiler(object):
self._ir_map.add(new_ir)
for group in new_ir.iter_all_overload_groups():
- exposures = map(lambda overload: overload.exposure, group)
+ exposures = list(map(lambda overload: overload.exposure,
+ group))
# [Exposed]
if any(not exposure.global_names_and_features
@@ -653,8 +654,8 @@ class IdlCompiler(object):
constructs = set()
for global_name in global_names:
constructs.update(exposed_map.get(global_name, []))
- new_ir.exposed_constructs = map(
- self._ref_to_idl_def_factory.create, sorted(constructs))
+ new_ir.exposed_constructs = list(
+ map(self._ref_to_idl_def_factory.create, sorted(constructs)))
assert not new_ir.legacy_window_aliases
if new_ir.identifier != 'Window':
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/web_idl/interface.py b/chromium/third_party/blink/renderer/bindings/scripts/web_idl/interface.py
index 65d24e529d1..067ef2eb0b2 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/web_idl/interface.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/web_idl/interface.py
@@ -180,8 +180,9 @@ class Interface(UserDefinedType, WithExtendedAttributes, WithCodeGeneratorInfo,
self._constructor_groups = tuple([
ConstructorGroup(
group_ir,
- filter(lambda x: x.identifier == group_ir.identifier,
- self._constructors),
+ list(
+ filter(lambda x: x.identifier == group_ir.identifier,
+ self._constructors)),
owner=self) for group_ir in ir.constructor_groups
])
assert len(self._constructor_groups) <= 1
@@ -192,8 +193,9 @@ class Interface(UserDefinedType, WithExtendedAttributes, WithCodeGeneratorInfo,
self._named_constructor_groups = tuple([
ConstructorGroup(
group_ir,
- filter(lambda x: x.identifier == group_ir.identifier,
- self._named_constructors),
+ list(
+ filter(lambda x: x.identifier == group_ir.identifier,
+ self._named_constructors)),
owner=self) for group_ir in ir.named_constructor_groups
])
self._operations = tuple([
@@ -203,22 +205,23 @@ class Interface(UserDefinedType, WithExtendedAttributes, WithCodeGeneratorInfo,
self._operation_groups = tuple([
OperationGroup(
group_ir,
- filter(lambda x: x.identifier == group_ir.identifier,
- self._operations),
+ list(
+ filter(lambda x: x.identifier == group_ir.identifier,
+ self._operations)),
owner=self) for group_ir in ir.operation_groups
])
self._exposed_constructs = tuple(ir.exposed_constructs)
self._legacy_window_aliases = tuple(ir.legacy_window_aliases)
self._indexed_and_named_properties = None
- indexed_and_named_property_operations = filter(
- lambda x: x.is_indexed_or_named_property_operation,
- self._operations)
+ indexed_and_named_property_operations = list(
+ filter(lambda x: x.is_indexed_or_named_property_operation,
+ self._operations))
if indexed_and_named_property_operations:
self._indexed_and_named_properties = IndexedAndNamedProperties(
indexed_and_named_property_operations, owner=self)
self._stringifier = None
- stringifier_operation_irs = filter(lambda x: x.is_stringifier,
- ir.operations)
+ stringifier_operation_irs = list(
+ filter(lambda x: x.is_stringifier, ir.operations))
if stringifier_operation_irs:
assert len(stringifier_operation_irs) == 1
op_ir = make_copy(stringifier_operation_irs[0])
@@ -231,8 +234,9 @@ class Interface(UserDefinedType, WithExtendedAttributes, WithCodeGeneratorInfo,
attribute = None
if operation.stringifier_attribute:
attr_id = operation.stringifier_attribute
- attributes = filter(lambda x: x.identifier == attr_id,
- self._attributes)
+ attributes = list(
+ filter(lambda x: x.identifier == attr_id,
+ self._attributes))
assert len(attributes) == 1
attribute = attributes[0]
self._stringifier = Stringifier(operation, attribute, owner=self)
@@ -578,8 +582,9 @@ class Iterable(WithDebugInfo):
self._operation_groups = tuple([
OperationGroup(
group_ir,
- filter(lambda x: x.identifier == group_ir.identifier,
- self._operations),
+ list(
+ filter(lambda x: x.identifier == group_ir.identifier,
+ self._operations)),
owner=owner) for group_ir in ir.operation_groups
])
@@ -666,8 +671,9 @@ class Maplike(WithDebugInfo):
self._operation_groups = tuple([
OperationGroup(
group_ir,
- filter(lambda x: x.identifier == group_ir.identifier,
- self._operations),
+ list(
+ filter(lambda x: x.identifier == group_ir.identifier,
+ self._operations)),
owner=owner) for group_ir in ir.operation_groups
])
@@ -755,8 +761,9 @@ class Setlike(WithDebugInfo):
self._operation_groups = tuple([
OperationGroup(
group_ir,
- filter(lambda x: x.identifier == group_ir.identifier,
- self._operations),
+ list(
+ filter(lambda x: x.identifier == group_ir.identifier,
+ self._operations)),
owner=owner) for group_ir in ir.operation_groups
])
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/web_idl/ir_builder.py b/chromium/third_party/blink/renderer/bindings/scripts/web_idl/ir_builder.py
index e9aeff4ab82..d80554d603e 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/web_idl/ir_builder.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/web_idl/ir_builder.py
@@ -2,6 +2,8 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import sys
+
from .argument import Argument
from .ast_group import AstGroup
from .attribute import Attribute
@@ -30,6 +32,11 @@ from .operation import Operation
from .typedef import Typedef
+# TODO: Remove this once Python2 is obsoleted.
+if sys.version_info.major != 2:
+ long = int
+
+
def load_and_register_idl_definitions(filepaths, register_ir,
create_ref_to_idl_def, idl_type_factory):
"""
@@ -160,7 +167,7 @@ class _IRBuilder(object):
child_nodes = list(node.GetChildren())
extended_attributes = self._take_extended_attributes(child_nodes)
- members = map(self._build_interface_member, child_nodes)
+ members = list(map(self._build_interface_member, child_nodes))
attributes = []
constants = []
operations = []
@@ -302,7 +309,7 @@ class _IRBuilder(object):
child_nodes = list(node.GetChildren())
inherited = self._take_inheritance(child_nodes)
extended_attributes = self._take_extended_attributes(child_nodes)
- own_members = map(self._build_dictionary_member, child_nodes)
+ own_members = list(map(self._build_dictionary_member, child_nodes))
return Dictionary.IR(
identifier=Identifier(node.GetName()),
@@ -336,7 +343,7 @@ class _IRBuilder(object):
child_nodes = list(node.GetChildren())
extended_attributes = self._take_extended_attributes(child_nodes)
- members = map(self._build_interface_member, child_nodes)
+ members = list(map(self._build_interface_member, child_nodes))
constants = []
operations = []
for member in members:
@@ -456,8 +463,8 @@ class _IRBuilder(object):
assert len(child_nodes) == 1
child = child_nodes[0]
if child.GetClass() == 'Arguments':
- arguments = map(build_extattr_argument,
- child.GetChildren())
+ arguments = list(
+ map(build_extattr_argument, child.GetChildren()))
elif child.GetClass() == 'Call':
assert len(child.GetChildren()) == 1
grand_child = child.GetChildren()[0]
@@ -486,7 +493,9 @@ class _IRBuilder(object):
assert node.GetClass() == 'ExtAttributes'
return ExtendedAttributes(
- filter(None, map(build_extended_attribute, node.GetChildren())))
+ list(
+ filter(None, map(build_extended_attribute,
+ node.GetChildren()))))
def _build_inheritance(self, node):
assert node.GetClass() == 'Inherit'
@@ -506,7 +515,7 @@ class _IRBuilder(object):
def _build_iterable(self, node):
assert node.GetClass() == 'Iterable'
- types = map(self._build_type, node.GetChildren())
+ types = list(map(self._build_type, node.GetChildren()))
assert len(types) == 1 or len(types) == 2
if len(types) == 1: # value iterator
key_type, value_type = (None, types[0])
@@ -584,7 +593,7 @@ class _IRBuilder(object):
def _build_maplike(self, node, interface_identifier):
assert node.GetClass() == 'Maplike'
assert isinstance(interface_identifier, Identifier)
- types = map(self._build_type, node.GetChildren())
+ types = list(map(self._build_type, node.GetChildren()))
assert len(types) == 2
key_type, value_type = types
is_readonly = bool(node.GetProperty('READONLY'))
@@ -676,7 +685,7 @@ class _IRBuilder(object):
def _build_setlike(self, node, interface_identifier):
assert node.GetClass() == 'Setlike'
assert isinstance(interface_identifier, Identifier)
- types = map(self._build_type, node.GetChildren())
+ types = list(map(self._build_type, node.GetChildren()))
assert len(types) == 1
value_type = types[0]
is_readonly = bool(node.GetProperty('READONLY'))
@@ -838,7 +847,7 @@ class _IRBuilder(object):
def build_union_type(node, extended_attributes):
return self._idl_type_factory.union_type(
- member_types=map(self._build_type, node.GetChildren()),
+ member_types=list(map(self._build_type, node.GetChildren())),
is_optional=is_optional,
extended_attributes=extended_attributes,
debug_info=self._build_debug_info(node))
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/web_idl/make_copy.py b/chromium/third_party/blink/renderer/bindings/scripts/web_idl/make_copy.py
index a7a2b11f3f0..2f6b61300ff 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/web_idl/make_copy.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/web_idl/make_copy.py
@@ -3,6 +3,13 @@
# found in the LICENSE file.
+import sys
+
+# TODO: Remove this once Python2 is obsoleted.
+if sys.version_info.major != 2:
+ long = int
+ basestring = str
+
def make_copy(obj, memo=None):
"""
Creates a copy of the given object, which should be an IR or part of IR.
diff --git a/chromium/third_party/blink/renderer/bindings/scripts/web_idl/namespace.py b/chromium/third_party/blink/renderer/bindings/scripts/web_idl/namespace.py
index eeabef97cbe..bd7e98907f3 100644
--- a/chromium/third_party/blink/renderer/bindings/scripts/web_idl/namespace.py
+++ b/chromium/third_party/blink/renderer/bindings/scripts/web_idl/namespace.py
@@ -107,11 +107,13 @@ class Namespace(UserDefinedType, WithExtendedAttributes, WithCodeGeneratorInfo,
for operation_ir in ir.operations
])
self._operation_groups = tuple([
- OperationGroup(
- operation_group_ir,
- filter(lambda x: x.identifier == operation_group_ir.identifier,
- self._operations),
- owner=self) for operation_group_ir in ir.operation_groups
+ OperationGroup(operation_group_ir,
+ list(
+ filter(
+ lambda x: x.identifier == operation_group_ir
+ .identifier, self._operations)),
+ owner=self)
+ for operation_group_ir in ir.operation_groups
])
@property
diff --git a/chromium/third_party/blink/renderer/bindings/templates/dictionary_v8.cc.tmpl b/chromium/third_party/blink/renderer/bindings/templates/dictionary_v8.cc.tmpl
index 0add9c45a38..dc910f6d227 100644
--- a/chromium/third_party/blink/renderer/bindings/templates/dictionary_v8.cc.tmpl
+++ b/chromium/third_party/blink/renderer/bindings/templates/dictionary_v8.cc.tmpl
@@ -59,9 +59,9 @@ void {{v8_class}}::ToImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8_value, {
DCHECK(executionContext);
{% endif %}{# has_origin_trial_members #}
{% endif %}{# members #}
- {% for origin_trial_test, origin_trial_member_list in members | groupby('origin_trial_feature_name') %}
+ {% for origin_trial_test, origin_trial_member_list in members | stringifykeygroupby('origin_trial_feature_name') %}
{% filter origin_trial_enabled(origin_trial_test, "executionContext") %}
- {% for feature_name, member_list in origin_trial_member_list | groupby('runtime_enabled_feature_name') %}
+ {% for feature_name, member_list in origin_trial_member_list | stringifykeygroupby('runtime_enabled_feature_name') %}
{% filter runtime_enabled(feature_name) %}
{% for member in member_list %}
v8::Local<v8::Value> {{member.v8_value}};
@@ -147,9 +147,9 @@ bool toV8{{cpp_class}}(const {{cpp_class}}* impl, v8::Local<v8::Object> dictiona
DCHECK(executionContext);
{% endif %}{# has_origin_trial_members #}
{% endif %}{# members #}
- {% for origin_trial_test, origin_trial_member_list in members | groupby('origin_trial_feature_name') %}
+ {% for origin_trial_test, origin_trial_member_list in members | stringifykeygroupby('origin_trial_feature_name') %}
{% filter origin_trial_enabled(origin_trial_test, "executionContext") %}
- {% for feature_name, member_list in origin_trial_member_list | groupby('runtime_enabled_feature_name') %}
+ {% for feature_name, member_list in origin_trial_member_list | stringifykeygroupby('runtime_enabled_feature_name') %}
{% filter runtime_enabled(feature_name) %}
{% for member in member_list %}
v8::Local<v8::Value> {{member.v8_value}};
diff --git a/chromium/third_party/blink/renderer/build/scripts/core/css/make_style_shorthands.py b/chromium/third_party/blink/renderer/build/scripts/core/css/make_style_shorthands.py
index 1799cd5a153..5f43ffabc26 100755
--- a/chromium/third_party/blink/renderer/build/scripts/core/css/make_style_shorthands.py
+++ b/chromium/third_party/blink/renderer/build/scripts/core/css/make_style_shorthands.py
@@ -71,7 +71,7 @@ class Expansion(object):
def enabled_longhands(self):
include = lambda longhand: not longhand[
'runtime_flag'] or self.is_enabled(longhand['runtime_flag'])
- return filter(include, self._longhands)
+ return list(filter(include, self._longhands))
@property
def index(self):
@@ -87,8 +87,9 @@ class Expansion(object):
def create_expansions(longhands):
flags = collect_runtime_flags(longhands)
- expansions = map(lambda mask: Expansion(longhands, flags, mask),
- range(1 << len(flags)))
+ expansions = list(
+ map(lambda mask: Expansion(longhands, flags, mask),
+ range(1 << len(flags))))
assert len(expansions) > 0
# We generate 2^N expansions for N flags, so enforce some limit.
assert len(flags) <= 4, 'Too many runtime flags for a single shorthand'
@@ -114,14 +115,14 @@ class StylePropertyShorthandWriter(json5_generator.Writer):
self._longhand_dictionary = defaultdict(list)
for property_ in json5_properties.shorthands:
- property_['longhand_enum_keys'] = map(enum_key_for_css_property,
- property_['longhands'])
- property_['longhand_property_ids'] = map(id_for_css_property,
- property_['longhands'])
-
- longhands = map(
- lambda name: json5_properties.properties_by_name[name],
- property_['longhands'])
+ property_['longhand_enum_keys'] = list(
+ map(enum_key_for_css_property, property_['longhands']))
+ property_['longhand_property_ids'] = list(
+ map(id_for_css_property, property_['longhands']))
+
+ longhands = list(
+ map(lambda name: json5_properties.properties_by_name[name],
+ property_['longhands']))
property_['expansions'] = create_expansions(longhands)
for longhand_enum_key in property_['longhand_enum_keys']:
self._longhand_dictionary[longhand_enum_key].append(property_)
diff --git a/chromium/third_party/blink/renderer/build/scripts/core/css/properties/make_css_property_instances.py b/chromium/third_party/blink/renderer/build/scripts/core/css/properties/make_css_property_instances.py
index 75030ac577e..f72aadee17d 100755
--- a/chromium/third_party/blink/renderer/build/scripts/core/css/properties/make_css_property_instances.py
+++ b/chromium/third_party/blink/renderer/build/scripts/core/css/properties/make_css_property_instances.py
@@ -42,8 +42,8 @@ class CSSPropertyInstancesWriter(json5_generator.Writer):
aliases = self._css_properties.aliases
# Lists of PropertyClassData.
- self._property_classes_by_id = map(self.get_class, properties)
- self._alias_classes_by_id = map(self.get_class, aliases)
+ self._property_classes_by_id = list(map(self.get_class, properties))
+ self._alias_classes_by_id = list(map(self.get_class, aliases))
# Sort by enum value.
self._property_classes_by_id.sort(key=lambda t: t.enum_value)
diff --git a/chromium/third_party/blink/renderer/build/scripts/gperf.py b/chromium/third_party/blink/renderer/build/scripts/gperf.py
index 5ee49056be4..db72660d471 100644
--- a/chromium/third_party/blink/renderer/build/scripts/gperf.py
+++ b/chromium/third_party/blink/renderer/build/scripts/gperf.py
@@ -95,7 +95,7 @@ def main():
open(args.output_file, 'wb').write(
generate_gperf(gperf_path,
- open(infile).read(), gperf_args))
+ open(infile).read(), gperf_args).encode('utf-8'))
if __name__ == '__main__':
diff --git a/chromium/third_party/blink/renderer/build/scripts/in_file.py b/chromium/third_party/blink/renderer/build/scripts/in_file.py
index 28adc050f1e..58113483e57 100644
--- a/chromium/third_party/blink/renderer/build/scripts/in_file.py
+++ b/chromium/third_party/blink/renderer/build/scripts/in_file.py
@@ -66,7 +66,7 @@ class InFile(object):
self._defaults = defaults
self._valid_values = copy.deepcopy(
valid_values if valid_values else {})
- self._parse(map(str.strip, lines))
+ self._parse(list(map(str.strip, lines)))
@classmethod
def load_from_files(self, file_paths, defaults, valid_values,
diff --git a/chromium/third_party/blink/renderer/build/scripts/in_generator.py b/chromium/third_party/blink/renderer/build/scripts/in_generator.py
index e46740a2e85..ab1981ad1e3 100644
--- a/chromium/third_party/blink/renderer/build/scripts/in_generator.py
+++ b/chromium/third_party/blink/renderer/build/scripts/in_generator.py
@@ -32,10 +32,15 @@ import os
import os.path
import shlex
import shutil
+import sys
import optparse
from in_file import InFile
+# TODO: Remove this once Python2 is obsoleted.
+if sys.version_info.major != 2:
+ basestring = str
+
#########################################################
# This is now deprecated - use json5_generator.py instead
diff --git a/chromium/third_party/blink/renderer/build/scripts/make_runtime_features.py b/chromium/third_party/blink/renderer/build/scripts/make_runtime_features.py
index cafe8d94a8e..6925a4fa580 100755
--- a/chromium/third_party/blink/renderer/build/scripts/make_runtime_features.py
+++ b/chromium/third_party/blink/renderer/build/scripts/make_runtime_features.py
@@ -138,7 +138,7 @@ class RuntimeFeatureWriter(BaseRuntimeFeatureWriter):
except Exception:
# If trouble unpickling, overwrite
pass
- with open(os.path.abspath(file_name), 'w') as pickle_file:
+ with open(os.path.abspath(file_name), 'wb') as pickle_file:
pickle.dump(features_map, pickle_file)
def _template_inputs(self):
diff --git a/chromium/third_party/blink/renderer/build/scripts/templates/element_factory.cc.tmpl b/chromium/third_party/blink/renderer/build/scripts/templates/element_factory.cc.tmpl
index dc3f44c5b10..3eefcf9f0ee 100644
--- a/chromium/third_party/blink/renderer/build/scripts/templates/element_factory.cc.tmpl
+++ b/chromium/third_party/blink/renderer/build/scripts/templates/element_factory.cc.tmpl
@@ -26,7 +26,7 @@ using {{namespace}}FunctionMap = HashMap<AtomicString, {{namespace}}ConstructorF
static {{namespace}}FunctionMap* g_{{namespace|lower}}_constructors = nullptr;
-{% for tag in tags|sort if not tag.noConstructor %}
+{% for tag in tags|sort(attribute='name') if not tag.noConstructor %}
static {{namespace}}Element* {{namespace}}{{tag.name.to_upper_camel_case()}}Constructor(
Document& document, const CreateElementFlags flags) {
{% if tag.runtimeEnabled %}
@@ -52,7 +52,7 @@ static void Create{{namespace}}FunctionMap() {
// Empty array initializer lists are illegal [dcl.init.aggr] and will not
// compile in MSVC. If tags list is empty, add check to skip this.
static const Create{{namespace}}FunctionMapData data[] = {
- {% for tag in tags|sort if not tag.noConstructor %}
+ {% for tag in tags|sort(attribute='name') if not tag.noConstructor %}
{ {{cpp_namespace}}::{{tag|symbol}}Tag, {{namespace}}{{tag.name.to_upper_camel_case()}}Constructor },
{% endfor %}
};
diff --git a/chromium/third_party/blink/renderer/build/scripts/templates/element_type_helpers.cc.tmpl b/chromium/third_party/blink/renderer/build/scripts/templates/element_type_helpers.cc.tmpl
index 9bfc489e048..5f86184e879 100644
--- a/chromium/third_party/blink/renderer/build/scripts/templates/element_type_helpers.cc.tmpl
+++ b/chromium/third_party/blink/renderer/build/scripts/templates/element_type_helpers.cc.tmpl
@@ -22,7 +22,7 @@ HTMLTypeMap CreateHTMLTypeMap() {
const char* name;
HTMLElementType type;
} kTags[] = {
- {% for tag in tags|sort %}
+ {% for tag in tags|sort(attribute='name') %}
{ "{{tag.name}}", HTMLElementType::k{{tag.js_interface}} },
{% endfor %}
};
@@ -42,7 +42,7 @@ HTMLElementType htmlElementTypeForTag(const AtomicString& tagName, const Documen
if (it == html_type_map.end())
return HTMLElementType::kHTMLUnknownElement;
- {% for tag in tags|sort %}
+ {% for tag in tags|sort(attribute='name') %}
{% if tag.runtimeEnabled %}
if (tagName == "{{tag.name}}") {
if (!RuntimeEnabledFeatures::{{tag.runtimeEnabled}}Enabled(document->GetExecutionContext())) {
diff --git a/chromium/third_party/blink/renderer/build/scripts/templates/element_type_helpers.h.tmpl b/chromium/third_party/blink/renderer/build/scripts/templates/element_type_helpers.h.tmpl
index 1b5297d52dc..edecc81d9d4 100644
--- a/chromium/third_party/blink/renderer/build/scripts/templates/element_type_helpers.h.tmpl
+++ b/chromium/third_party/blink/renderer/build/scripts/templates/element_type_helpers.h.tmpl
@@ -15,7 +15,7 @@ namespace blink {
class Document;
// Type checking.
-{% for tag in tags|sort if not tag.multipleTagNames and not tag.noTypeHelpers %}
+{% for tag in tags|sort(attribute='name') if not tag.multipleTagNames and not tag.noTypeHelpers %}
class {{tag.interface}};
template <>
inline bool IsElementOfType<const {{tag.interface}}>(const Node& node) {
diff --git a/chromium/third_party/blink/renderer/build/scripts/templates/macros.tmpl b/chromium/third_party/blink/renderer/build/scripts/templates/macros.tmpl
index 0244433af2e..dcdbb02a56c 100644
--- a/chromium/third_party/blink/renderer/build/scripts/templates/macros.tmpl
+++ b/chromium/third_party/blink/renderer/build/scripts/templates/macros.tmpl
@@ -25,7 +25,7 @@
{% macro trie_leaf(index, object, return_macro, lowercase_data) %}
-{% set name, value = object.items()[0] %}
+{% set name, value = (object.items()|list)[0] %}
{% if name|length %}
if (
{%- for c in name -%}
@@ -45,7 +45,7 @@ return {{ return_macro(value) }};
{% macro trie_switch(trie, index, return_macro, lowercase_data) %}
-{% if trie|length == 1 and trie.values()[0] is string %}
+{% if trie|length == 1 and (trie.values()|list)[0] is string %}
{{ trie_leaf(index, trie, return_macro, lowercase_data) -}}
{% else %}
{% if lowercase_data %}
diff --git a/chromium/third_party/blink/renderer/build/scripts/templates/make_qualified_names.h.tmpl b/chromium/third_party/blink/renderer/build/scripts/templates/make_qualified_names.h.tmpl
index cb05c6c4315..bd5566b03e7 100644
--- a/chromium/third_party/blink/renderer/build/scripts/templates/make_qualified_names.h.tmpl
+++ b/chromium/third_party/blink/renderer/build/scripts/templates/make_qualified_names.h.tmpl
@@ -24,12 +24,12 @@ namespace {{cpp_namespace}} {
{{symbol_export}}extern const WTF::AtomicString& {{namespace_prefix}}NamespaceURI;
// Tags
-{% for tag in tags|sort %}
+{% for tag in tags|sort(attribute='name') %}
{{symbol_export}}extern const blink::{{namespace}}QualifiedName& {{tag|symbol}}Tag;
{% endfor %}
// Attributes
-{% for attr in attrs|sort %}
+{% for attr in attrs|sort(attribute='name') %}
{{symbol_export}}extern const blink::QualifiedName& {{attr|symbol}}Attr;
{% endfor %}
diff --git a/chromium/third_party/catapult/BUILD.gn b/chromium/third_party/catapult/BUILD.gn
index aa6e5d059a4..07cea36180f 100644
--- a/chromium/third_party/catapult/BUILD.gn
+++ b/chromium/third_party/catapult/BUILD.gn
@@ -16,6 +16,7 @@ group("telemetry_chrome_test_support") {
data += [
"AUTHORS",
"CONTRIBUTING.md",
+ "DIR_METADATA",
"LICENSE",
"OWNERS",
"PRESUBMIT.py",
@@ -28,7 +29,6 @@ group("telemetry_chrome_test_support") {
"catapult_build/",
"dashboard/",
"dependency_manager/",
- "firefighter/",
"hooks/",
"infra/",
"netlog_viewer/",
@@ -44,7 +44,6 @@ group("telemetry_chrome_test_support") {
data += [
"common/bin/",
- "common/eslint/",
"common/lab/",
"common/py_trace_event/",
"common/py_utils/",
@@ -55,25 +54,33 @@ group("telemetry_chrome_test_support") {
"third_party/WebOb/",
"third_party/apiclient/",
"third_party/beautifulsoup4/",
+ "third_party/beautifulsoup4-4.9.3/",
"third_party/cachetools/",
"third_party/certifi/",
"third_party/chai/",
"third_party/chardet/",
+ "third_party/click/",
"third_party/cloudstorage/",
"third_party/coverage/",
"third_party/d3/",
"third_party/depot_tools/",
+ "third_party/flask/",
"third_party/flot/",
"third_party/gae_ts_mon/",
"third_party/google-auth/",
"third_party/graphy/",
+ "third_party/html5lib-1.1/",
"third_party/html5lib-python/",
"third_party/httplib2/",
"third_party/idb/",
"third_party/idna/",
"third_party/ijson/",
+ "third_party/itsdangerous/",
+ "third_party/jinja2/",
"third_party/jquery/",
+ "third_party/jszip/",
"third_party/mapreduce/",
+ "third_party/markupsafe/",
"third_party/mocha/",
"third_party/mock/",
"third_party/mox3/",
@@ -85,7 +92,7 @@ group("telemetry_chrome_test_support") {
"third_party/pyasn1/",
"third_party/pyasn1_modules/",
"third_party/pyfakefs/",
- "third_party/pyserial/",
+ "third_party/pyparsing/",
"third_party/python_gflags/",
"third_party/redux/",
"third_party/requests/",
@@ -98,8 +105,9 @@ group("telemetry_chrome_test_support") {
"third_party/uritemplate/",
"third_party/urllib3/",
"third_party/webapp2/",
+ "third_party/webencodings-0.5.1/",
"third_party/webtest/",
- "third_party/zipfile/",
+ "third_party/werkzeug/",
]
data_deps += [
@@ -110,6 +118,7 @@ group("telemetry_chrome_test_support") {
data += [
"tracing/BUILD.gn",
+ "tracing/DIR_METADATA",
"tracing/LICENSE",
"tracing/OWNERS",
"tracing/PRESUBMIT.py",
diff --git a/chromium/third_party/catapult/catapult_build/PRESUBMIT.py b/chromium/third_party/catapult/catapult_build/PRESUBMIT.py
index 1a8eb2cdead..507373a9cce 100644
--- a/chromium/third_party/catapult/catapult_build/PRESUBMIT.py
+++ b/chromium/third_party/catapult/catapult_build/PRESUBMIT.py
@@ -3,6 +3,9 @@
# found in the LICENSE file.
+USE_PYTHON3 = True
+
+
def CheckChangeOnUpload(input_api, output_api):
return _CommonChecks(input_api, output_api)
@@ -15,7 +18,7 @@ def _CommonChecks(input_api, output_api):
results = []
results += input_api.RunTests(input_api.canned_checks.GetPylint(
input_api, output_api, extra_paths_list=_GetPathsToPrepend(input_api),
- pylintrc='../pylintrc'))
+ pylintrc='../pylintrc', version='2.7'))
return results
@@ -25,7 +28,6 @@ def _GetPathsToPrepend(input_api):
return [
project_dir,
- input_api.os_path.join(catapult_dir, 'common', 'eslint'),
input_api.os_path.join(catapult_dir, 'common', 'py_utils'),
input_api.os_path.join(catapult_dir, 'common', 'py_vulcanize'),
input_api.os_path.join(catapult_dir, 'dashboard'),
diff --git a/chromium/third_party/catapult/catapult_build/__init__.py b/chromium/third_party/catapult/catapult_build/__init__.py
index 15b3468775a..d2a9b164252 100644
--- a/chromium/third_party/catapult/catapult_build/__init__.py
+++ b/chromium/third_party/catapult/catapult_build/__init__.py
@@ -15,11 +15,20 @@ def _UpdateSysPathIfNeeded():
catapult_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
catapult_third_party_path = os.path.abspath(os.path.join(
catapult_path, 'third_party'))
- _AddToPathIfNeeded(os.path.join(catapult_path, 'common', 'eslint'))
_AddToPathIfNeeded(os.path.join(catapult_path, 'common', 'py_utils'))
_AddToPathIfNeeded(os.path.join(catapult_path, 'common', 'py_vulcanize'))
- _AddToPathIfNeeded(os.path.join(catapult_third_party_path, 'beautifulsoup4'))
- _AddToPathIfNeeded(os.path.join(catapult_third_party_path, 'html5lib-python'))
+ if sys.version_info.major == 2:
+ _AddToPathIfNeeded(
+ os.path.join(catapult_third_party_path, 'beautifulsoup4'))
+ _AddToPathIfNeeded(
+ os.path.join(catapult_third_party_path, 'html5lib-python'))
+ else:
+ _AddToPathIfNeeded(
+ os.path.join(catapult_third_party_path, 'beautifulsoup4-4.9.3', 'py3k'))
+ _AddToPathIfNeeded(
+ os.path.join(catapult_third_party_path, 'html5lib-1.1'))
+ _AddToPathIfNeeded(
+ os.path.join(catapult_third_party_path, 'webencodings-0.5.1'))
_AddToPathIfNeeded(os.path.join(catapult_third_party_path, 'six'))
_AddToPathIfNeeded(os.path.join(catapult_third_party_path, 'Paste'))
_AddToPathIfNeeded(os.path.join(catapult_third_party_path, 'webapp2'))
diff --git a/chromium/third_party/catapult/catapult_build/appengine_deploy.py b/chromium/third_party/catapult/catapult_build/appengine_deploy.py
index 8c2732eacc8..c8479589df5 100644
--- a/chromium/third_party/catapult/catapult_build/appengine_deploy.py
+++ b/chromium/third_party/catapult/catapult_build/appengine_deploy.py
@@ -2,6 +2,8 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
+from __future__ import print_function
import os
import subprocess
import sys
@@ -21,7 +23,7 @@ def Deploy(paths, args, version=None):
version = _VersionName()
with temp_deployment_dir.TempDeploymentDir(
paths, use_symlinks=False) as temp_dir:
- print 'Deploying from "%s".' % temp_dir
+ print('Deploying from "%s".' % temp_dir)
# google-cloud-sdk/bin/gcloud is a shell script, which we can't subprocess
# on Windows with shell=False. So, execute the Python script directly.
@@ -30,9 +32,9 @@ def Deploy(paths, args, version=None):
else:
script_path = _FindScriptInPath('gcloud')
if not script_path:
- print 'This script requires the Google Cloud SDK to be in PATH.'
- print 'Install at https://cloud.google.com/sdk and then run'
- print '`gcloud components install app-engine-python`'
+ print('This script requires the Google Cloud SDK to be in PATH.')
+ print('Install at https://cloud.google.com/sdk and then run')
+ print('`gcloud components install app-engine-python`')
sys.exit(1)
subprocess.check_call([script_path, 'app', 'deploy', '--no-promote',
diff --git a/chromium/third_party/catapult/catapult_build/appengine_dev_server.py b/chromium/third_party/catapult/catapult_build/appengine_dev_server.py
index ad8582f0fed..ae3852eb3b1 100644
--- a/chromium/third_party/catapult/catapult_build/appengine_dev_server.py
+++ b/chromium/third_party/catapult/catapult_build/appengine_dev_server.py
@@ -3,6 +3,8 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
+from __future__ import print_function
import argparse
import os
import os.path
@@ -24,11 +26,11 @@ def DevAppserver(paths, args, reuse_path=None):
"""
with temp_deployment_dir.TempDeploymentDir(
paths, reuse_path=reuse_path) as temp_dir:
- print 'Running dev server on "%s".' % temp_dir
+ print('Running dev server on "%s".' % temp_dir)
script_path = _FindScriptInPath('dev_appserver.py')
if not script_path:
- print 'This script requires the App Engine SDK to be in PATH.'
+ print('This script requires the App Engine SDK to be in PATH.')
sys.exit(1)
subprocess.call([sys.executable, script_path] +
@@ -48,10 +50,13 @@ def _AddTempDirToYamlPathArgs(temp_dir, args):
"""Join `temp_dir` to the positional args, preserving the other args."""
parser = argparse.ArgumentParser()
parser.add_argument('yaml_path', nargs='*')
+ parser.add_argument('--run_pinpoint', default=False, action='store_true')
options, remaining_args = parser.parse_known_args(args)
yaml_path_args = [
os.path.join(temp_dir, yaml_path) for yaml_path in options.yaml_path
]
if not yaml_path_args:
+ if options.run_pinpoint:
+ temp_dir += '/pinpoint.yaml'
yaml_path_args = [temp_dir]
return yaml_path_args + remaining_args
diff --git a/chromium/third_party/catapult/catapult_build/bin/run_py_tests b/chromium/third_party/catapult/catapult_build/bin/run_py_tests
index baed4330134..97ccbdf2a12 100755
--- a/chromium/third_party/catapult/catapult_build/bin/run_py_tests
+++ b/chromium/third_party/catapult/catapult_build/bin/run_py_tests
@@ -21,6 +21,11 @@ if __name__ == '__main__':
else:
install.InstallHooks()
+ # For some reason the value of PYTHONPATH on try bot will cause import error
+ # when the test is invoked by vpython3. Removing the value as a workaround.
+ if sys.version_info.major == 3 and 'PYTHONPATH' in os.environ:
+ os.environ.pop('PYTHONPATH')
+
from catapult_build import run_with_typ
sys.exit(run_with_typ.Run(
os.path.join(_CATAPULT, 'catapult_build'),
diff --git a/chromium/third_party/catapult/catapult_build/build_steps.py b/chromium/third_party/catapult/catapult_build/build_steps.py
index abdf331b337..57ff8358f0e 100644
--- a/chromium/third_party/catapult/catapult_build/build_steps.py
+++ b/chromium/third_party/catapult/catapult_build/build_steps.py
@@ -17,6 +17,8 @@ import sys
# environment.
# disabled (optional): List of platforms the test is disabled on. May contain
# 'win', 'mac', 'linux', or 'android'.
+# python_versions (optional): A list of ints specifying the Python versions to
+# run on. May contain "2" or "3". Defaults to running on both.
# outputs_presentation_json (optional): If True, pass in --presentation-json
# argument to the test executable to allow it to update the buildbot status
# page. More details here:
@@ -30,7 +32,7 @@ _DASHBOARD_TESTS = [
'--timeout-sec=120', '--timeout-retries=2'
],
'outputs_presentation_json': True,
- 'disabled': ['android'],
+ 'disabled': ['android', 'win', 'mac'],
},
{
'name': 'Dashboard Dev Server Tests Canary',
@@ -40,13 +42,13 @@ _DASHBOARD_TESTS = [
'--timeout-sec=120', '--timeout-retries=2'
],
'outputs_presentation_json': True,
- 'disabled': ['android'],
+ 'disabled': ['android', 'win', 'mac'],
},
{
'name': 'Dashboard Python Tests',
'path': 'dashboard/bin/run_py_tests',
'additional_args': ['--no-install-hooks'],
- 'disabled': ['android'],
+ 'disabled': ['android', 'win', 'mac'],
},
]
@@ -75,11 +77,6 @@ _CATAPULT_TESTS = [
'disabled': ['mac', 'win'],
},
{
- 'name': 'eslint Tests',
- 'path': 'common/eslint/bin/run_tests',
- 'disabled': ['android'],
- },
- {
'name': 'Native Heap Symbolizer Tests',
'path': 'tracing/bin/run_symbolizer_tests',
'disabled': ['android'],
@@ -100,6 +97,7 @@ _CATAPULT_TESTS = [
'additional_args': ['--browser=reference',],
'uses_sandbox_env': True,
'disabled': ['android'],
+ 'python_versions': [3],
},
{
'name': 'Telemetry Tests with Stable Browser (Desktop)',
@@ -111,6 +109,7 @@ _CATAPULT_TESTS = [
],
'uses_sandbox_env': True,
'disabled': ['android'],
+ 'python_versions': [3],
},
{
'name': 'Telemetry Tests with Stable Browser (Android)',
@@ -122,7 +121,8 @@ _CATAPULT_TESTS = [
'-v',
],
'uses_sandbox_env': True,
- 'disabled': ['win', 'mac', 'linux']
+ 'disabled': ['win', 'mac', 'linux'],
+ 'python_versions': [3],
},
{
'name': 'Telemetry Integration Tests with Stable Browser',
@@ -134,6 +134,7 @@ _CATAPULT_TESTS = [
],
'uses_sandbox_env': True,
'disabled': ['android', 'linux'], # TODO(nedn): enable this on linux
+ 'python_versions': [3],
},
{
'name': 'Tracing Dev Server Tests',
@@ -208,6 +209,7 @@ def main(args=None):
'--app-engine-sdk-pythonpath',
help='PYTHONPATH to include app engine SDK path')
parser.add_argument('--platform', help='Platform name (linux, mac, or win)')
+ parser.add_argument('--platform_arch', help='Platform arch (intel or arm)')
parser.add_argument('--output-json', help='Output for buildbot status page')
parser.add_argument(
'--run_android_tests', default=True, help='Run Android tests')
@@ -216,6 +218,11 @@ def main(args=None):
default=False,
help='Run only the Dashboard and Pinpoint tests',
action='store_true')
+ parser.add_argument(
+ '--use_python3',
+ default=False,
+ help='Run Catapult Tests using vpython3',
+ action='store_true')
args = parser.parse_args(args)
dashboard_protos_path = os.path.join(args.api_path_checkout, 'dashboard',
@@ -235,6 +242,7 @@ def main(args=None):
tracing_proto_output_path = tracing_protos_path
tracing_proto_files = [os.path.join(tracing_protos_path, 'histogram.proto')]
+ protoc_path = 'protoc'
steps = [
{
@@ -257,7 +265,7 @@ def main(args=None):
'name':
'Generate Sheriff Config protocol buffers',
'cmd': [
- 'protoc',
+ protoc_path,
'--proto_path',
dashboard_protos_path,
'--python_out',
@@ -268,7 +276,7 @@ def main(args=None):
'name':
'Generate Dashboard protocol buffers',
'cmd': [
- 'protoc',
+ protoc_path,
'--proto_path',
dashboard_protos_path,
'--python_out',
@@ -279,7 +287,7 @@ def main(args=None):
'name':
'Generate Tracing protocol buffers',
'cmd': [
- 'protoc',
+ protoc_path,
'--proto_path',
tracing_protos_path,
'--python_out',
@@ -325,7 +333,7 @@ def main(args=None):
if args.dashboard_only:
tests = _DASHBOARD_TESTS
else:
- tests = _DASHBOARD_TESTS + _CATAPULT_TESTS
+ tests = _CATAPULT_TESTS
for test in tests:
if args.platform == 'android' and not args.run_android_tests:
# Remove all the steps for the Android configuration if we're asked to not
@@ -335,16 +343,37 @@ def main(args=None):
if args.platform in test.get('disabled', []):
continue
+
+ python_version = 3 if args.use_python3 else 2
+ if python_version not in test.get('python_versions', [2, 3]):
+ continue
+
+ # The test "Devil Python Tests" has two executables, run_py_tests and
+ # run_py3_tests. Those scripts define the vpython interpreter on shebang,
+ # and will quit when running on unexpected version. This script assumes one
+ # path for each test and thus we will conditionally replace the script name
+ # until python 2 is fully dropped.
+ # here,
+ test_path = test['path']
+ if args.use_python3 and test['name'] == 'Devil Python Tests':
+ test_path = 'devil/bin/run_py3_tests'
+
step = {'name': test['name'], 'env': {}}
- executable = 'vpython.bat' if sys.platform == 'win32' else 'vpython'
+ if args.use_python3:
+ vpython_executable = "vpython3"
+ else:
+ vpython_executable = "vpython"
+
+ if sys.platform == 'win32':
+ vpython_executable += '.bat'
# Always add the appengine SDK path.
step['env']['PYTHONPATH'] = args.app_engine_sdk_pythonpath
step['cmd'] = [
- executable,
- os.path.join(args.api_path_checkout, test['path'])
+ vpython_executable,
+ os.path.join(args.api_path_checkout, test_path)
]
if step['name'] == 'Systrace Tests':
step['cmd'] += ['--device=' + args.platform]
@@ -354,6 +383,13 @@ def main(args=None):
step['env']['CHROME_DEVEL_SANDBOX'] = '/opt/chromium/chrome_sandbox'
if test.get('outputs_presentation_json'):
step['outputs_presentation_json'] = True
+ # TODO(crbug/1221663):
+ # Before python 3 conversion is finished, the try jobs with use_python3 are
+ # experimental. We want to see all possible failure and thus we don't want
+ # to try job to quit before all tests are finished.
+ # This condition will be removed when the python 3 conversion is done.
+ if args.use_python3:
+ step['always_run'] = True
steps.append(step)
with open(args.output_json, 'w') as outfile:
json.dump(steps, outfile)
diff --git a/chromium/third_party/catapult/catapult_build/dev_server.py b/chromium/third_party/catapult/catapult_build/dev_server.py
index d109f2c8f8c..e3fef45dcd5 100644
--- a/chromium/third_party/catapult/catapult_build/dev_server.py
+++ b/chromium/third_party/catapult/catapult_build/dev_server.py
@@ -4,11 +4,13 @@
from __future__ import print_function
+from __future__ import absolute_import
import argparse
import json
import os
import sys
-import urlparse
+import six
+import six.moves.urllib.parse # pylint: disable=import-error
from hooks import install
@@ -69,7 +71,7 @@ def _RelPathToUnixPath(p):
class TestResultHandler(webapp2.RequestHandler):
def post(self, *args, **kwargs): # pylint: disable=unused-argument
- msg = self.request.body
+ msg = six.ensure_str(self.request.body)
ostream = sys.stdout if 'PASSED' in msg else sys.stderr
ostream.write(msg + '\n')
return self.response.write('')
@@ -77,7 +79,7 @@ class TestResultHandler(webapp2.RequestHandler):
class TestsCompletedHandler(webapp2.RequestHandler):
def post(self, *args, **kwargs): # pylint: disable=unused-argument
- msg = self.request.body
+ msg = six.ensure_str(self.request.body)
sys.stdout.write(msg + '\n')
exit_code = 0 if 'ALL_PASSED' in msg else 1
if hasattr(self.app.server, 'please_exit'):
@@ -87,7 +89,7 @@ class TestsCompletedHandler(webapp2.RequestHandler):
class TestsErrorHandler(webapp2.RequestHandler):
def post(self, *args, **kwargs):
del args, kwargs
- msg = self.request.body
+ msg = six.ensure_str(self.request.body)
sys.stderr.write(msg + '\n')
exit_code = 1
if hasattr(self.app.server, 'please_exit'):
@@ -135,6 +137,7 @@ class SourcePathsHandler(webapp2.RequestHandler):
app.cache_control(no_cache=True)
return app
self.abort(404)
+ return None
@staticmethod
def GetServingPathForAbsFilename(source_paths, filename):
@@ -160,7 +163,7 @@ class SimpleDirectoryHandler(webapp2.RequestHandler):
os.path.join(top_path, kwargs.pop('rest_of_path')))
if not joined_path.startswith(top_path):
self.response.set_status(403)
- return
+ return None
app = FileAppWithGZipHandling(joined_path)
app.cache_control(no_cache=True)
return app
@@ -169,7 +172,7 @@ class SimpleDirectoryHandler(webapp2.RequestHandler):
class TestOverviewHandler(webapp2.RequestHandler):
def get(self, *args, **kwargs): # pylint: disable=unused-argument
test_links = []
- for name, path in kwargs.pop('pds').iteritems():
+ for name, path in kwargs.pop('pds').items():
test_links.append(_LINK_ITEM % (path, name))
quick_links = []
for name, path in _QUICK_LINKS:
@@ -259,14 +262,14 @@ class DevServerApp(webapp2.WSGIApplication):
continue
rel = os.path.relpath(filename, source_path)
unix_rel = _RelPathToUnixPath(rel)
- url = urlparse.urljoin(mapped_path, unix_rel)
+ url = six.moves.urllib.parse.urljoin(mapped_path, unix_rel)
return url
path = SourcePathsHandler.GetServingPathForAbsFilename(
self._all_source_paths, filename)
if path is None:
return None
- return urlparse.urljoin('/', path)
+ return six.moves.urllib.parse.urljoin('/', path)
def _AddPleaseExitMixinToServer(server):
diff --git a/chromium/third_party/catapult/catapult_build/fetch_telemetry_deps_and_run_tests b/chromium/third_party/catapult/catapult_build/fetch_telemetry_deps_and_run_tests
index 5c03bf9590b..264580492af 100755
--- a/chromium/third_party/catapult/catapult_build/fetch_telemetry_deps_and_run_tests
+++ b/chromium/third_party/catapult/catapult_build/fetch_telemetry_deps_and_run_tests
@@ -3,6 +3,8 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import print_function
+
import os
import subprocess
import sys
@@ -13,13 +15,13 @@ _TELEMETRY_BIN_DIR = os.path.abspath(
def main(args):
- print 'Fetching Telemetry dependencies...'
+ print('Fetching Telemetry dependencies...')
subprocess.check_call(
[sys.executable,
os.path.join(_TELEMETRY_BIN_DIR, 'fetch_telemetry_binary_dependencies')])
- print 'Done fetching Telemetry dependencies.'
- print 'Running Telemetry tests...'
+ print('Done fetching Telemetry dependencies.')
+ print('Running Telemetry tests...')
subprocess.check_call(
[sys.executable, os.path.join(_TELEMETRY_BIN_DIR, 'run_tests')] + args)
diff --git a/chromium/third_party/catapult/catapult_build/html_checks.py b/chromium/third_party/catapult/catapult_build/html_checks.py
index bd3d9f0568e..1e96ab52b33 100644
--- a/chromium/third_party/catapult/catapult_build/html_checks.py
+++ b/chromium/third_party/catapult/catapult_build/html_checks.py
@@ -60,7 +60,7 @@ def CheckImportOrder(path, soup, results, output_api):
grouped_hrefs[','.join(link.get('rel'))].append(link.get('href'))
- for rel, actual_hrefs in grouped_hrefs.iteritems():
+ for rel, actual_hrefs in grouped_hrefs.items():
expected_hrefs = list(sorted(set(actual_hrefs)))
if actual_hrefs != expected_hrefs:
error_text = (
diff --git a/chromium/third_party/catapult/catapult_build/js_checks.py b/chromium/third_party/catapult/catapult_build/js_checks.py
index d5a3714f67f..8de6f316793 100644
--- a/chromium/third_party/catapult/catapult_build/js_checks.py
+++ b/chromium/third_party/catapult/catapult_build/js_checks.py
@@ -4,7 +4,6 @@
import re
-import eslint
from py_vulcanize import strip_js_comments
from catapult_build import parse_html
@@ -47,14 +46,6 @@ class JSChecker(object):
'\n'.join(contents),
is_html_file=f.LocalPath().endswith('.html'))
- if affected_js_files:
- success, eslint_output = eslint.RunEslint(
- [f.AbsoluteLocalPath() for f in affected_js_files])
-
- if not success:
- error_lines.append('\neslint found lint errors:')
- error_lines.append(eslint_output)
-
if error_lines:
error_lines.insert(0, 'Found JavaScript style violations:')
results.append(
diff --git a/chromium/third_party/catapult/catapult_build/perfbot_stats/chrome_perf_stats.py b/chromium/third_party/catapult/catapult_build/perfbot_stats/chrome_perf_stats.py
index e98fddfd37d..0e10645ce04 100755
--- a/chromium/third_party/catapult/catapult_build/perfbot_stats/chrome_perf_stats.py
+++ b/chromium/third_party/catapult/catapult_build/perfbot_stats/chrome_perf_stats.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2.7
+#!/usr/bin/env python
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
@@ -14,12 +14,16 @@ https://apis-explorer.appspot.com/apis-explorer/?
base=https://chrome-infra-stats.appspot.com/_ah/api#p/
"""
+from __future__ import absolute_import
+from __future__ import print_function
import calendar
import datetime
import json
import sys
-import urllib
-import urllib2
+import six.moves.urllib.request # pylint: disable=import-error
+import six.moves.urllib.parse # pylint: disable=import-error
+import six.moves.urllib.error # pylint: disable=import-error
+from six.moves import range
BUILDER_LIST_URL = ('https://chrome-infra-stats.appspot.com/'
'_ah/api/stats/v1/masters/chromium.perf')
@@ -33,7 +37,7 @@ USAGE = ('Usage: chrome_perf_stats.py <year> <month> <day>. If date is not '
def main():
if len(sys.argv) == 2 and sys.argv[0] == '--help':
- print USAGE
+ print(USAGE)
sys.exit(0)
year = None
month = None
@@ -41,22 +45,22 @@ def main():
if len(sys.argv) == 4 or len(sys.argv) == 3:
year = int(sys.argv[1])
if year > 2016 or year < 2014:
- print USAGE
+ print(USAGE)
sys.exit(0)
month = int(sys.argv[2])
if month > 12 or month <= 0:
- print USAGE
+ print(USAGE)
sys.exit(0)
if len(sys.argv) == 3:
- days = range(1, calendar.monthrange(year, month)[1] + 1)
+ days = list(range(1, calendar.monthrange(year, month)[1] + 1))
else:
day = int(sys.argv[3])
if day > 31 or day <= 0:
- print USAGE
+ print(USAGE)
sys.exit(0)
days = [day]
elif len(sys.argv) != 1:
- print USAGE
+ print(USAGE)
sys.exit(0)
else:
yesterday = datetime.date.today() - datetime.timedelta(days=1)
@@ -64,7 +68,7 @@ def main():
month = yesterday.month
days = [yesterday.day]
- response = urllib2.urlopen(BUILDER_LIST_URL)
+ response = six.moves.urllib.request.urlopen(BUILDER_LIST_URL)
builders = [builder['name'] for builder in json.load(response)['builders']]
success_rates = CalculateSuccessRates(year, month, days, builders)
UploadToPerfDashboard(success_rates)
@@ -87,7 +91,7 @@ def _UpdateSuccessRatesWithResult(
def _SummarizeSuccessRates(success_rates):
overall_success_rates = []
- for day, results in success_rates.iteritems():
+ for day, results in success_rates.items():
success_rate_sum = 0
success_rate_count = 0
for rates in results.values():
@@ -131,8 +135,9 @@ def UploadToPerfDashboard(success_rates):
}
}
url = 'https://chromeperf.appspot.com/add_point'
- data = urllib.urlencode({'data': json.dumps(dashboard_data)})
- urllib2.urlopen(url=url, data=data).read()
+ data = six.moves.urllib.parse.urlencode(
+ {'data': json.dumps(dashboard_data)})
+ six.moves.urllib.request.urlopen(url, data).read()
def CalculateSuccessRates(year, month, days, builders):
@@ -143,8 +148,9 @@ def CalculateSuccessRates(year, month, days, builders):
date_dict_str = '%d%02d%02d' % (year, month, day)
for builder in builders:
url = BUILDER_STATS_URL % (
- urllib.quote(builder), urllib.quote(date_str))
- response = urllib2.urlopen(url)
+ six.moves.urllib.parse.quote(builder),
+ six.moves.urllib.parse.quote(date_str))
+ response = six.moves.urllib.request.urlopen(url)
results = json.load(response)
_UpdateSuccessRatesWithResult(
success_rates, results, date_dict_str, builder)
diff --git a/chromium/third_party/catapult/catapult_build/perfbot_stats/chrome_perf_stats_unittest.py b/chromium/third_party/catapult/catapult_build/perfbot_stats/chrome_perf_stats_unittest.py
index bb72bf19039..07372dfd79e 100644
--- a/chromium/third_party/catapult/catapult_build/perfbot_stats/chrome_perf_stats_unittest.py
+++ b/chromium/third_party/catapult/catapult_build/perfbot_stats/chrome_perf_stats_unittest.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2.7
+#!/usr/bin/env python
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
diff --git a/chromium/third_party/catapult/catapult_build/perfbot_stats/chrome_perf_step_timings.py b/chromium/third_party/catapult/catapult_build/perfbot_stats/chrome_perf_step_timings.py
index 30558abd1f6..05925bcf60b 100755
--- a/chromium/third_party/catapult/catapult_build/perfbot_stats/chrome_perf_step_timings.py
+++ b/chromium/third_party/catapult/catapult_build/perfbot_stats/chrome_perf_step_timings.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2.7
+#!/usr/bin/env python
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
@@ -13,12 +13,14 @@ https://apis-explorer.appspot.com/apis-explorer/?
base=https://chrome-infra-stats.appspot.com/_ah/api#p/
"""
+from __future__ import print_function
import csv
import datetime
import json
import sys
-import urllib
-import urllib2
+import six.moves.urllib.request
+import six.moves.urllib.parse
+import six.moves.urllib.error
BUILDER_STEPS_URL = ('https://chrome-infra-stats.appspot.com/_ah/api/stats/v1/'
@@ -115,7 +117,7 @@ USAGE = 'Usage: chrome-perf-step-timings.py <outfilename>'
def main():
if len(sys.argv) != 2:
- print USAGE
+ print(USAGE)
sys.exit(0)
outfilename = sys.argv[1]
@@ -129,18 +131,20 @@ def main():
for builder in KNOWN_TESTERS_LIST:
step_timings = []
- url = BUILDER_STEPS_URL % urllib.quote(builder)
- response = urllib2.urlopen(url)
+ url = BUILDER_STEPS_URL % six.moves.urllib.parse.quote(builder)
+ response = six.moves.urllib.request.urlopen(url)
results = json.load(response)
steps = results['steps']
steps.sort() # to group tests and their references together.
for step in steps:
if step in IGNORED_STEPS:
continue
- url = STEP_ACTIVE_URL % (urllib.quote(builder), urllib.quote(step))
- response = urllib2.urlopen(url)
+ url = STEP_ACTIVE_URL % (
+ six.moves.urllib.parse.quote(builder),
+ six.moves.urllib.parse.quote(step))
+ response = six.moves.urllib.request.urlopen(url)
results = json.load(response)
- if ('step_records' not in results.keys() or
+ if ('step_records' not in list(results.keys()) or
len(results['step_records']) == 0):
continue
first_record = results['step_records'][0]
@@ -149,8 +153,10 @@ def main():
# ignore steps that did not run for more than 2 days
if last_step_time < threshold_time:
continue
- url = STEP_STATS_URL % (urllib.quote(builder), urllib.quote(step))
- response = urllib2.urlopen(url)
+ url = STEP_STATS_URL % (
+ six.moves.urllib.parse.quote(builder),
+ six.moves.urllib.parse.quote(step))
+ response = six.moves.urllib.request.urlopen(url)
results = json.load(response)
step_timings.append(
[builder, step, results['count'], results['stddev'],
diff --git a/chromium/third_party/catapult/catapult_build/repo_checks.py b/chromium/third_party/catapult/catapult_build/repo_checks.py
index 8fc765a88ee..52309ce50fc 100644
--- a/chromium/third_party/catapult/catapult_build/repo_checks.py
+++ b/chromium/third_party/catapult/catapult_build/repo_checks.py
@@ -13,5 +13,4 @@ def RunChecks(input_api, output_api):
return [output_api.PresubmitError(
'Files with ".orig" suffix must not be checked into the '
'repository:\n ' + '\n '.join(orig_files))]
- else:
- return []
+ return []
diff --git a/chromium/third_party/catapult/catapult_build/run_dev_server_tests.py b/chromium/third_party/catapult/catapult_build/run_dev_server_tests.py
index 44f51a30994..025a50cd2b1 100644
--- a/chromium/third_party/catapult/catapult_build/run_dev_server_tests.py
+++ b/chromium/third_party/catapult/catapult_build/run_dev_server_tests.py
@@ -133,20 +133,23 @@ def GetChromeInfo(args):
raise ChromeNotFound('Could not find chrome locally. You can supply it '
'manually using --chrome_path')
return ChromeInfo(path=chrome_path, version=None)
+ channel = args.channel
+ if sys.version_info.major == 3:
+ target = 'linux'
else:
- channel = args.channel
- if sys.platform == 'linux2' and channel == 'canary':
- channel = 'dev'
- assert channel in ['stable', 'beta', 'dev', 'canary']
+ target = 'linux2'
+ if sys.platform == target and channel == 'canary':
+ channel = 'dev'
+ assert channel in ['stable', 'beta', 'dev', 'canary']
- binary = 'chrome'
- print('Fetching the', channel, binary, 'binary via the binary_manager.')
- chrome_manager = binary_manager.BinaryManager([CHROME_BINARIES_CONFIG])
- os_name, arch = dependency_util.GetOSAndArchForCurrentDesktopPlatform()
- chrome_path, version = chrome_manager.FetchPathWithVersion(
- '%s_%s' % (binary, channel), os_name, arch)
- print('Finished fetching the', binary, 'binary to', chrome_path)
- return ChromeInfo(path=chrome_path, version=version)
+ binary = 'chrome'
+ print('Fetching the', channel, binary, 'binary via the binary_manager.')
+ chrome_manager = binary_manager.BinaryManager([CHROME_BINARIES_CONFIG])
+ os_name, arch = dependency_util.GetOSAndArchForCurrentDesktopPlatform()
+ chrome_path, version = chrome_manager.FetchPathWithVersion(
+ '%s_%s' % (binary, channel), os_name, arch)
+ print('Finished fetching the', binary, 'binary to', chrome_path)
+ return ChromeInfo(path=chrome_path, version=version)
def KillProcess(process):
@@ -190,7 +193,8 @@ def RunTests(args, chrome_path):
if sys.platform != 'win32':
output = server_process.stderr.readline()
port = re.search(
- r'Now running on http://127.0.0.1:([\d]+)', output).group(1)
+ r'Now running on http://127.0.0.1:([\d]+)',
+ output.decode('utf-8')).group(1)
if xvfb.ShouldStartXvfb():
print('Starting xvfb...')
xvfb_process = xvfb.StartXvfb()
@@ -204,12 +208,15 @@ def RunTests(args, chrome_path):
'--window-size=1280,1024',
'--enable-logging', '--v=1',
'--enable-features=ForceWebRequestProxyForTest',
- '--enable-blink-features=CustomElementsV0,'
- 'HTMLImports,ShadowDOMV0',
'--force-device-scale-factor=1',
- ('http://localhost:%s/%s/tests.html?' % (port, args.tests)) +
- 'headless=true&testTypeToRun=all',
+ '--use-mock-keychain',
]
+ if args.extra_chrome_args:
+ chrome_command.extend(args.extra_chrome_args.strip('"').split(' '))
+ chrome_command.append(
+ ('http://localhost:%s/%s/tests.html?' % (port, args.tests)) +
+ 'headless=true&testTypeToRun=all')
+
print('Starting Chrome at path %s...' % chrome_path)
chrome_process = subprocess.Popen(
chrome_command, stdout=sys.stdout, stderr=sys.stderr)
@@ -239,12 +246,11 @@ def RunTests(args, chrome_path):
if timed_out:
print('Tests did not finish before', args.timeout_sec, 'seconds')
return _TIMEOUT_RETURNCODE
+ if server_process.returncode == 0:
+ print("Tests passed in %.2f seconds." % (time.time() - test_start_time))
else:
- if server_process.returncode == 0:
- print("Tests passed in %.2f seconds." % (time.time() - test_start_time))
- else:
- logging.error('Tests failed!')
- return server_process.returncode
+ logging.error('Tests failed!')
+ return server_process.returncode
finally:
if timer:
@@ -298,6 +304,8 @@ def Main(argv):
parser.add_argument('--timeout-retries', type=int, default=0,
help='Number of times to retry if tests time out.'
'Default 0 (no retries)')
+ parser.add_argument('--extra-chrome-args', type=str,
+ help='Extra args to pass to chrome.')
parser.set_defaults(install_hooks=True)
parser.set_defaults(use_local_chrome=True)
args = parser.parse_args(argv[1:])
@@ -322,8 +330,7 @@ def Main(argv):
if return_code == _TIMEOUT_RETURNCODE:
attempts_left -= 1
continue
- else:
- break
+ break
else:
logging.error('Tests timed out every time. Retried %d times.',
args.timeout_retries)
diff --git a/chromium/third_party/catapult/catapult_build/run_with_typ.py b/chromium/third_party/catapult/catapult_build/run_with_typ.py
index 543e4a2008a..c27448bec41 100644
--- a/chromium/third_party/catapult/catapult_build/run_with_typ.py
+++ b/chromium/third_party/catapult/catapult_build/run_with_typ.py
@@ -24,12 +24,13 @@ def Run(top_level_dir, path=None, suffixes=None, **kwargs):
typ_path = os.path.abspath(os.path.join(
os.path.dirname(__file__), os.path.pardir, 'third_party', 'typ'))
_AddToPathIfNeeded(typ_path)
- import typ
+ import typ # pylint: disable=import-outside-toplevel
return typ.main(
top_level_dir=top_level_dir,
path=(path or []),
coverage_source=[top_level_dir],
suffixes=suffixes,
+ coverage=True,
**kwargs)
diff --git a/chromium/third_party/catapult/catapult_build/test_runner.py b/chromium/third_party/catapult/catapult_build/test_runner.py
index d3286a8fdfe..6a0299b5b6a 100644
--- a/chromium/third_party/catapult/catapult_build/test_runner.py
+++ b/chromium/third_party/catapult/catapult_build/test_runner.py
@@ -3,6 +3,8 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
+from __future__ import print_function
import argparse
import os
import subprocess
@@ -53,9 +55,9 @@ def Main(name, tests, argv):
os.path.basename(test['path']), test['path'])
if exit_code:
- print _Color('Oops! Some tests failed.', RED), FAIL_EMOJI
+ print(_Color('Oops! Some tests failed.', RED), FAIL_EMOJI)
sys.stderr.writelines(errors)
else:
- print _Color('Woho! All tests passed.', GREEN), PASS_EMOJI
+ print(_Color('Woho! All tests passed.', GREEN), PASS_EMOJI)
sys.exit(exit_code)
diff --git a/chromium/third_party/catapult/common/bin/run_tests b/chromium/third_party/catapult/common/bin/run_tests
index 632cdbf129a..aab34cac89a 100755
--- a/chromium/third_party/catapult/common/bin/run_tests
+++ b/chromium/third_party/catapult/common/bin/run_tests
@@ -11,8 +11,6 @@ _CATAPULT_PATH = os.path.abspath(
os.path.join(os.path.dirname(__file__), '..', '..'))
_TESTS = [
{'path': os.path.join(
- _CATAPULT_PATH, 'common', 'eslint', 'bin', 'run_tests')},
- {'path': os.path.join(
_CATAPULT_PATH, 'common', 'py_trace_event', 'bin', 'run_tests')},
{'path': os.path.join(
_CATAPULT_PATH, 'common', 'py_utils', 'bin', 'run_tests')},
diff --git a/chromium/third_party/catapult/common/bin/update_chrome_reference_binaries.py b/chromium/third_party/catapult/common/bin/update_chrome_reference_binaries.py
index 86a1d7fe916..c4a388a9332 100755
--- a/chromium/third_party/catapult/common/bin/update_chrome_reference_binaries.py
+++ b/chromium/third_party/catapult/common/bin/update_chrome_reference_binaries.py
@@ -12,15 +12,17 @@ Usage:
$ git cl upload
"""
+from __future__ import print_function
+from __future__ import absolute_import
import argparse
import collections
import logging
import os
+import six
import shutil
import subprocess
import sys
import tempfile
-import urllib2
import zipfile
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'py_utils'))
@@ -43,7 +45,8 @@ _CHROMIUM_SNAPSHOT_SEARCH_WINDOW = 10
# Remove a platform name from this list to disable updating it.
# Add one to enable updating it. (Must also update _PLATFORM_MAP.)
-_PLATFORMS_TO_UPDATE = ['mac_x86_64', 'win_x86', 'win_AMD64', 'linux_x86_64',
+_PLATFORMS_TO_UPDATE = ['mac_arm64', 'mac_x86_64', 'win_x86',
+ 'win_AMD64', 'linux_x86_64',
'android_k_armeabi-v7a', 'android_l_arm64-v8a',
'android_l_armeabi-v7a', 'android_n_armeabi-v7a',
'android_n_arm64-v8a', 'android_n_bundle_armeabi-v7a',
@@ -51,7 +54,8 @@ _PLATFORMS_TO_UPDATE = ['mac_x86_64', 'win_x86', 'win_AMD64', 'linux_x86_64',
# Add platforms here if you also want to update chromium binary for it.
# Must add chromium_info for it in _PLATFORM_MAP.
-_CHROMIUM_PLATFORMS = ['mac_x86_64', 'win_x86', 'win_AMD64', 'linux_x86_64']
+_CHROMIUM_PLATFORMS = ['mac_arm64', 'mac_x86_64', 'win_x86', 'win_AMD64',
+ 'linux_x86_64']
# Remove a channel name from this list to disable updating it.
# Add one to enable updating it.
@@ -60,7 +64,8 @@ _CHANNELS_TO_UPDATE = ['stable', 'canary', 'dev']
# Omaha is Chrome's autoupdate server. It reports the current versions used
# by each platform on each channel.
-_OMAHA_PLATFORMS = { 'stable': ['mac', 'linux', 'win', 'android'],
+_OMAHA_PLATFORMS = { 'stable': ['mac_arm64', 'mac', 'linux', 'win',
+ 'win64', 'android'],
'dev': ['linux'], 'canary': ['mac', 'win']}
@@ -83,6 +88,15 @@ _PLATFORM_MAP = {'mac_x86_64': UpdateInfo(
build_dir='Mac',
zip_name='chrome-mac.zip'),
zip_name='chrome-mac.zip'),
+ 'mac_arm64': UpdateInfo(
+ omaha='mac_arm64',
+ gs_folder='desktop-*',
+ gs_build='mac-arm64',
+ chromium_info=ChromiumInfo(
+ build_dir='Mac_Arm',
+ zip_name='chrome-mac.zip',
+ ),
+ zip_name='chrome-mac.zip'),
'win_x86': UpdateInfo(
omaha='win',
gs_folder='desktop-*',
@@ -149,10 +163,8 @@ _PLATFORM_MAP = {'mac_x86_64': UpdateInfo(
gs_build='arm_64',
chromium_info=None,
zip_name='Monochrome.apks')
-
}
-
VersionInfo = collections.namedtuple('VersionInfo',
'version, branch_base_position')
@@ -170,8 +182,8 @@ def _ChannelVersionsMap(channel):
def _OmahaReportVersionInfo(channel):
url ='https://omahaproxy.appspot.com/all?channel=%s' % channel
- lines = urllib2.urlopen(url).readlines()
- return [l.split(',') for l in lines]
+ lines = six.moves.urllib.request.urlopen(url).readlines()
+ return [six.ensure_str(l).split(',') for l in lines]
def _OmahaVersionsMap(rows, channel):
@@ -227,8 +239,8 @@ def _FindClosestChromiumSnapshot(base_position, build_dir):
# positions between 123446 an 123466. We do this by getting all snapshots
# with prefix 12344*, 12345*, and 12346*. This may get a few more snapshots
# that we intended, but that's fine since we take the min distance anyways.
- min_position_prefix = min_position / 10;
- max_position_prefix = max_position / 10;
+ min_position_prefix = min_position // 10;
+ max_position_prefix = max_position // 10;
available_positions = []
for position_prefix in range(min_position_prefix, max_position_prefix + 1):
@@ -263,10 +275,10 @@ def _ResolveChromiumRemotePath(channel, platform, version_info):
closest_snapshot = _FindClosestChromiumSnapshot(
branch_base_position, build_dir)
if closest_snapshot != branch_base_position:
- print ('Channel %s corresponds to commit position ' % channel +
- '%d on %s, ' % (branch_base_position, platform) +
- 'but closest chromium snapshot available on ' +
- '%s is %d' % (_CHROMIUM_GS_BUCKET, closest_snapshot))
+ print('Channel %s corresponds to commit position ' % channel +
+ '%d on %s, ' % (branch_base_position, platform) +
+ 'but closest chromium snapshot available on ' +
+ '%s is %d' % (_CHROMIUM_GS_BUCKET, closest_snapshot))
return RemotePath(bucket=_CHROMIUM_GS_BUCKET,
path = ('%s/%s/%s' % (build_dir, closest_snapshot,
platform_info.chromium_info.zip_name)))
@@ -316,7 +328,7 @@ def _ModifyBuildIfNeeded(binary, location, platform):
if binary != 'chrome':
return
- if platform == 'mac_x86_64':
+ if platform in ['mac_x86_64', 'mac_arm64']:
_RemoveKeystoneFromBuild(location)
return
@@ -348,11 +360,11 @@ def _RemoveKeystoneFromBuild(location):
def _NeedsUpdate(config, binary, channel, platform, version_info):
channel_version = version_info.version
- print 'Checking %s (%s channel) on %s' % (binary, channel, platform)
+ print('Checking %s (%s channel) on %s' % (binary, channel, platform))
current_version = config.GetVersion('%s_%s' % (binary, channel), platform)
- print 'current: %s, channel: %s' % (current_version, channel_version)
+ print('current: %s, channel: %s' % (current_version, channel_version))
if current_version and current_version == channel_version:
- print 'Already up to date.'
+ print('Already up to date.')
return False
return True
@@ -372,7 +384,7 @@ def UpdateBuilds(args):
_QueuePlatformUpdate('chromium', platform, version_info,
config, channel)
- print 'Updating builds with downloaded binaries'
+ print('Updating builds with downloaded binaries')
config.ExecuteUpdateJobs(force=True)
diff --git a/chromium/third_party/catapult/common/lab/commits.py b/chromium/third_party/catapult/common/lab/commits.py
index 6d47b9166e3..3b674e463a7 100755
--- a/chromium/third_party/catapult/common/lab/commits.py
+++ b/chromium/third_party/catapult/common/lab/commits.py
@@ -5,12 +5,13 @@
"""Print statistics about the rate of commits to a repository."""
+from __future__ import print_function
+from __future__ import absolute_import
import datetime
import itertools
import json
import math
-import urllib
-import urllib2
+import six
_BASE_URL = 'https://chromium.googlesource.com'
@@ -29,7 +30,7 @@ def Pairwise(iterable):
"""s -> (s0,s1), (s1,s2), (s2, s3), ..."""
a, b = itertools.tee(iterable)
next(b, None)
- return itertools.izip(a, b)
+ return six.zip(a, b)
def Percentile(data, percentile):
@@ -58,9 +59,9 @@ def Percentile(data, percentile):
def CommitTimes(repository, revision_count):
- parameters = urllib.urlencode((('n', revision_count), ('format', 'JSON')))
- url = '%s/%s/+log?%s' % (_BASE_URL, urllib.quote(repository), parameters)
- data = json.loads(''.join(urllib2.urlopen(url).read().splitlines()[1:]))
+ parameters = six.moves.urllib.parse.urlencode((('n', revision_count), ('format', 'JSON')))
+ url = '%s/%s/+log?%s' % (_BASE_URL, six.moves.urllib.parse.quote(repository), parameters)
+ data = json.loads(''.join(six.moves.urllib.request.urlopen(url).read().splitlines()[1:]))
commit_times = []
for revision in data['log']:
@@ -87,18 +88,18 @@ def main():
commit_durations.append((time1 - time2).total_seconds() / 60.)
commit_durations.sort()
- print 'REPOSITORY:', repository
- print 'Start Date:', min(commit_times), 'PDT'
- print ' End Date:', max(commit_times), 'PDT'
- print ' Duration:', max(commit_times) - min(commit_times)
- print ' n:', len(commit_times)
+ print('REPOSITORY:', repository)
+ print('Start Date:', min(commit_times), 'PDT')
+ print(' End Date:', max(commit_times), 'PDT')
+ print(' Duration:', max(commit_times) - min(commit_times))
+ print(' n:', len(commit_times))
for p in (0.25, 0.50, 0.90):
percentile = Percentile(commit_durations, p)
- print '%3d%% commit duration:' % (p * 100), '%6.1fm' % percentile
+ print('%3d%% commit duration:' % (p * 100), '%6.1fm' % percentile)
mean = math.fsum(commit_durations) / len(commit_durations)
- print 'Mean commit duration:', '%6.1fm' % mean
- print
+ print('Mean commit duration:', '%6.1fm' % mean)
+ print()
if __name__ == '__main__':
diff --git a/chromium/third_party/catapult/common/lab/hardware.py b/chromium/third_party/catapult/common/lab/hardware.py
index 5e49c5c86ba..53f8c5bd48d 100755
--- a/chromium/third_party/catapult/common/lab/hardware.py
+++ b/chromium/third_party/catapult/common/lab/hardware.py
@@ -5,11 +5,12 @@
"""Query build slave hardware info, and print it to stdout as csv."""
+from __future__ import absolute_import
import csv
import json
import logging
+import six
import sys
-import urllib2
_MASTERS = [
@@ -50,11 +51,11 @@ def main():
writer.writeheader()
for master_name in _MASTERS:
- master_data = json.load(urllib2.urlopen(
+ master_data = json.load(six.moves.urllib.request.urlopen(
'http://build.chromium.org/p/%s/json/slaves' % master_name))
- slaves = sorted(master_data.iteritems(),
- key=lambda x: (x[1]['builders'].keys(), x[0]))
+ slaves = sorted(six.iteritems(master_data),
+ key=lambda x: (list(x[1]['builders'].keys()), x[0]))
for slave_name, slave_data in slaves:
for builder_name in slave_data['builders']:
row = {
@@ -76,7 +77,7 @@ def main():
row[key] = value
# Munge keys.
- row = {key.replace('_', ' '): value for key, value in row.iteritems()}
+ row = {key.replace('_', ' '): value for key, value in six.iteritems(row)}
if 'osfamily' in row:
row['os family'] = row.pop('osfamily')
if 'product name' not in row and slave_name.startswith('slave'):
diff --git a/chromium/third_party/catapult/common/node_runner/node_runner/node_util.py b/chromium/third_party/catapult/common/node_runner/node_runner/node_util.py
index 05d0084bb6a..40a84883f0d 100644
--- a/chromium/third_party/catapult/common/node_runner/node_runner/node_util.py
+++ b/chromium/third_party/catapult/common/node_runner/node_runner/node_util.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import os
import subprocess
import sys
diff --git a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/__init__.py b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/__init__.py
index 2cd8dd1df91..7337ddeff39 100644
--- a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/__init__.py
+++ b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/__init__.py
@@ -1,6 +1,7 @@
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import os
import sys
diff --git a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/setup.py b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/setup.py
index 0b0070a01b0..06caf09c880 100644
--- a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/setup.py
+++ b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/setup.py
@@ -2,6 +2,7 @@
# Copyright 2011 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
from distutils.core import setup
setup(
name='py_trace_event',
diff --git a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event.py b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event.py
index 88eef21e6ed..e95ee6a670a 100644
--- a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event.py
+++ b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event.py
@@ -1,7 +1,9 @@
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
from py_trace_event import trace_time
+import six
r"""Instrumentation-based profiling for Python.
@@ -48,7 +50,7 @@ in the child processes.
"""
try:
- import trace_event_impl
+ from . import trace_event_impl
except ImportError:
trace_event_impl = None
@@ -88,7 +90,7 @@ if trace_event_impl:
trace_event_impl.trace_flush()
def trace_begin(name, **kwargs):
- args_to_log = {key: repr(value) for key, value in kwargs.iteritems()}
+ args_to_log = {key: repr(value) for key, value in six.iteritems(kwargs)}
trace_event_impl.add_trace_event("B", trace_time.Now(), "python", name,
args_to_log)
diff --git a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/__init__.py b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/__init__.py
index d250e0312e4..1fba93423ff 100644
--- a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/__init__.py
+++ b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/__init__.py
@@ -1,7 +1,8 @@
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-from log import *
-from decorators import *
-from meta_class import *
-import multiprocessing_shim
+from __future__ import absolute_import
+from .log import *
+from .decorators import *
+from .meta_class import *
+from . import multiprocessing_shim
diff --git a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators.py b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators.py
index dc753f1f61b..e3494ff6d14 100644
--- a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators.py
+++ b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators.py
@@ -1,20 +1,23 @@
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import contextlib
import inspect
import time
import functools
-import log
+from . import log
from py_trace_event import trace_time
+import six
+from six.moves import map
@contextlib.contextmanager
def trace(name, **kwargs):
category = "python"
start = trace_time.Now()
- args_to_log = {key: repr(value) for key, value in kwargs.iteritems()}
+ args_to_log = {key: repr(value) for key, value in six.iteritems(kwargs)}
log.add_trace_event("B", start, category, name, args_to_log)
try:
yield
@@ -42,7 +45,7 @@ def traced(*args):
default = None
return (name, arg_index, default)
- args_to_log = map(arg_spec_tuple, arg_names)
+ args_to_log = list(map(arg_spec_tuple, arg_names))
@functools.wraps(func)
def traced_function(*args, **kwargs):
diff --git a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators_test.py b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators_test.py
index 434a3516f42..9db1781569b 100644
--- a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators_test.py
+++ b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators_test.py
@@ -2,12 +2,12 @@
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import decorators
+from __future__ import absolute_import
+from . import decorators
import logging
import unittest
-from trace_test import TraceTest
-#from .trace_test import TraceTest
+from .trace_test import TraceTest
def generator():
yield 1
diff --git a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log.py b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log.py
index 130d1683853..8a35f88877b 100644
--- a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log.py
+++ b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log.py
@@ -1,6 +1,7 @@
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import atexit
import json
import os
@@ -8,12 +9,12 @@ import sys
import time
import threading
import multiprocessing
-import multiprocessing_shim
from py_trace_event.trace_event_impl import perfetto_trace_writer
from py_trace_event import trace_time
from py_utils import lock
+import six
# Trace file formats:
@@ -169,9 +170,12 @@ def _trace_enable(log_file=None, format=None):
if _format == PROTOBUF:
log_file = open("%s.pb" % n, "ab", False)
else:
- log_file = open("%s.json" % n, "ab", False)
- elif isinstance(log_file, basestring):
- log_file = open("%s" % log_file, "ab", False)
+ log_file = open("%s.json" % n, "a")
+ elif isinstance(log_file, six.string_types):
+ if _format == PROTOBUF:
+ log_file = open("%s" % log_file, "ab", False)
+ else:
+ log_file = open("%s" % log_file, "a")
elif not hasattr(log_file, 'fileno'):
raise TraceException(
"Log file must be None, a string, or file-like object with a fileno()")
@@ -191,6 +195,7 @@ def _trace_enable(log_file=None, format=None):
_note("trace_event: Opened existing tracelog")
_log_file.flush()
# Monkeypatch in our process replacement for the multiprocessing.Process class
+ from . import multiprocessing_shim
if multiprocessing.Process != multiprocessing_shim.ProcessShim:
multiprocessing.Process = multiprocessing_shim.ProcessShim
diff --git a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log_io_test.py b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log_io_test.py
index 6c03ea81471..e49b4ad4f1a 100644
--- a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log_io_test.py
+++ b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log_io_test.py
@@ -2,13 +2,14 @@
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import logging
import os
import sys
import unittest
-from log import *
-from parsed_trace_events import *
+from .log import *
+from .parsed_trace_events import *
from py_utils import tempfile_ext
diff --git a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/meta_class.py b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/meta_class.py
index 7aaa3faf62c..97ff4bbca99 100644
--- a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/meta_class.py
+++ b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/meta_class.py
@@ -2,14 +2,16 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import types
from py_trace_event.trace_event_impl import decorators
+import six
class TracedMetaClass(type):
def __new__(cls, name, bases, attrs):
- for attr_name, attr_value in attrs.iteritems():
+ for attr_name, attr_value in six.iteritems(attrs):
if (not attr_name.startswith('_') and
isinstance(attr_value, types.FunctionType)):
attrs[attr_name] = decorators.traced(attr_value)
diff --git a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/multiprocessing_shim.py b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/multiprocessing_shim.py
index c2295edafa2..08986f90caf 100644
--- a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/multiprocessing_shim.py
+++ b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/multiprocessing_shim.py
@@ -1,8 +1,8 @@
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import multiprocessing
-import log
import time
@@ -16,6 +16,7 @@ class ProcessSubclass(_RealProcess):
self._shim = shim
def run(self,*args,**kwargs):
+ from . import log
log._disallow_tracing_control()
try:
r = _RealProcess.run(self, *args, **kwargs)
@@ -37,6 +38,7 @@ class ProcessShim():
self._proc.start()
def terminate(self):
+ from . import log
if log.trace_is_enabled():
# give the flush a chance to finish --> TODO: find some other way.
time.sleep(0.25)
diff --git a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/parsed_trace_events.py b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/parsed_trace_events.py
index fdc7514542d..b0598b5addd 100644
--- a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/parsed_trace_events.py
+++ b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/parsed_trace_events.py
@@ -1,6 +1,7 @@
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import math
import json
@@ -47,7 +48,7 @@ class ParsedTraceEvents(object):
events = events['traceEvents']
if not hasattr(events, '__iter__'):
- raise Exception, 'events must be iteraable.'
+ raise Exception('events must be iteraable.')
self.events = events
self.pids = None
self.tids = None
diff --git a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_proto_classes.py b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_proto_classes.py
index 5be4a8e1d77..0be8d89174c 100644
--- a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_proto_classes.py
+++ b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_proto_classes.py
@@ -15,6 +15,7 @@ Definitions of perfetto messages can be found here:
https://android.googlesource.com/platform/external/perfetto/+/refs/heads/master/protos/perfetto/trace/
"""
+from __future__ import absolute_import
import encoder
import wire_format
diff --git a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_trace_writer.py b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_trace_writer.py
index 584352cfdc2..5e88ebad511 100644
--- a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_trace_writer.py
+++ b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_trace_writer.py
@@ -5,9 +5,11 @@
""" Functions to write trace data in perfetto protobuf format.
"""
+from __future__ import absolute_import
import collections
-import perfetto_proto_classes as proto
+from . import perfetto_proto_classes as proto
+import six
CLOCK_BOOTTIME = 6
CLOCK_TELEMETRY = 64
@@ -128,7 +130,7 @@ def write_event(output, ph, category, name, ts, args, tid):
legacy_event.name_iid = _intern_event_name(name, packet, tid)
packet.track_event.legacy_event = legacy_event
- for name, value in args.iteritems():
+ for name, value in six.iteritems(args):
debug_annotation = proto.DebugAnnotation()
debug_annotation.name = name
if isinstance(value, int):
diff --git a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_trace_writer_unittest.py b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_trace_writer_unittest.py
index 00dafa463cf..a0010793c76 100644
--- a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_trace_writer_unittest.py
+++ b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_trace_writer_unittest.py
@@ -3,8 +3,9 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import unittest
-import StringIO
+from io import BytesIO
from py_trace_event.trace_event_impl import perfetto_trace_writer
@@ -19,21 +20,21 @@ class PerfettoTraceWriterTest(unittest.TestCase):
perfetto_trace_writer.reset_global_state()
def testWriteThreadDescriptorEvent(self):
- result = StringIO.StringIO()
+ result = BytesIO()
perfetto_trace_writer.write_thread_descriptor_event(
output=result,
pid=1,
tid=2,
ts=1556716807306000,
)
- expected_output = (
- '\n\x1b@\x80\xec\xea\xda\x83\xb6\xa4\xcd\x15P\x80\x80@'
- '\xc8\x02\x01\xe2\x02\x04\x08\x01\x10\x02\xd0\x03@'
- )
+ expected_output = b"".join([
+ b'\n\x1b@\x80\xec\xea\xda\x83\xb6\xa4\xcd\x15P\x80\x80@',
+ b'\xc8\x02\x01\xe2\x02\x04\x08\x01\x10\x02\xd0\x03@'
+ ])
self.assertEqual(expected_output, result.getvalue())
def testWriteTwoEvents(self):
- result = StringIO.StringIO()
+ result = BytesIO()
perfetto_trace_writer.write_thread_descriptor_event(
output=result,
pid=1,
@@ -49,17 +50,17 @@ class PerfettoTraceWriterTest(unittest.TestCase):
args={},
tid=2,
)
- expected_output = (
- '\n\x1b@\x80\xec\xea\xda\x83\xb6\xa4\xcd\x15P\x80\x80@'
- '\xc8\x02\x01\xe2\x02\x04\x08\x01\x10\x02\xd0\x03@\n;@'
- '\x80\xb0\xc2\x8a\x84\xb6\xa4\xcd\x15P\x80\x80@Z\x08'
- '\x18\x012\x04\x08\x01\x10Mb\x1e\n\x0c\x08\x01\x12\x08'
- 'category\x12\x0e\x08\x01\x12\nevent_name\xd0\x03@'
- )
+ expected_output = b"".join([
+ b'\n\x1b@\x80\xec\xea\xda\x83\xb6\xa4\xcd\x15P\x80\x80@',
+ b'\xc8\x02\x01\xe2\x02\x04\x08\x01\x10\x02\xd0\x03@\n;@',
+ b'\x80\xb0\xc2\x8a\x84\xb6\xa4\xcd\x15P\x80\x80@Z\x08',
+ b'\x18\x012\x04\x08\x01\x10Mb\x1e\n\x0c\x08\x01\x12\x08',
+ b'category\x12\x0e\x08\x01\x12\nevent_name\xd0\x03@'
+ ])
self.assertEqual(expected_output, result.getvalue())
def testWriteMetadata(self):
- result = StringIO.StringIO()
+ result = BytesIO()
perfetto_trace_writer.write_metadata(
output=result,
benchmark_start_time_us=1556716807306000,
@@ -71,15 +72,15 @@ class PerfettoTraceWriterTest(unittest.TestCase):
story_run_index=0,
label="label",
)
- expected_output = (
- '\nG\x82\x03D\x08\x90\xf6\xc2\x82\xb6\xfa\xe1'
- '\x02\x10\xb0\x83\xc9\x82\xb6\xfa\xe1\x02\x1a\tbenchmark"'
- '\x0bdescription*\x05label2\x05story:\x03foo:\x03bar@\x00'
- )
+ expected_output = b"".join([
+ b'\nG\x82\x03D\x08\x90\xf6\xc2\x82\xb6\xfa\xe1',
+ b'\x02\x10\xb0\x83\xc9\x82\xb6\xfa\xe1\x02\x1a\tbenchmark"',
+ b'\x0bdescription*\x05label2\x05story:\x03foo:\x03bar@\x00'
+ ])
self.assertEqual(expected_output, result.getvalue())
def testWriteArgs(self):
- result = StringIO.StringIO()
+ result = BytesIO()
perfetto_trace_writer.write_thread_descriptor_event(
output=result,
pid=1,
@@ -95,36 +96,34 @@ class PerfettoTraceWriterTest(unittest.TestCase):
args={'int': 123, 'double': 1.23, 'string': 'onetwothree'},
tid=2,
)
- expected_output = (
- '\n\x13@\x00P\x80\x80@\xc8\x02\x01\xe2\x02\x04\x08\x01\x10'
- '\x02\xd0\x03@\nT@\x00P\x80\x80@Z;\x18\x01"\x07R\x03int {"\x11'
- 'R\x06double)\xaeG\xe1z\x14\xae\xf3?"\x15R\x06string2\x0bonetwothree2'
- '\x04\x08\x01\x10Mb\x0c\n\x04\x08\x01\x12\x00\x12\x04\x08\x01\x12\x00'
- '\xd0\x03@'
- )
+ expected_output = b"".join([
+ b'\n\x13@\x00P\x80\x80@\xc8\x02\x01\xe2\x02\x04\x08\x01\x10',
+ b'\x02\xd0\x03@\nT@\x00P\x80\x80@Z;\x18\x01"\x07R\x03int {"\x11',
+ b'R\x06double)\xaeG\xe1z\x14\xae\xf3?"\x15R\x06string2\x0bonetwothree2',
+ b'\x04\x08\x01\x10Mb\x0c\n\x04\x08\x01\x12\x00\x12\x04\x08\x01\x12\x00',
+ b'\xd0\x03@'
+ ])
self.assertEqual(expected_output, result.getvalue())
def testWriteChromeMetadata(self):
- result = StringIO.StringIO()
+ result = BytesIO()
perfetto_trace_writer.write_chrome_metadata(
output=result,
clock_domain='FOO',
)
- expected_output = (
- '\n\x17*\x15\x12\x13\n\x0cclock-domain\x12\x03FOO'
- )
+ expected_output = b'\n\x17*\x15\x12\x13\n\x0cclock-domain\x12\x03FOO'
self.assertEqual(expected_output, result.getvalue())
def testWriteClockSnapshot(self):
- result = StringIO.StringIO()
+ result = BytesIO()
perfetto_trace_writer.write_clock_snapshot(
output=result,
tid=1,
telemetry_ts=1234.567,
boottime_ts=7654.321,
)
- expected_output = (
- '\n\x172\x11\n\x06\x08@\x10\x87\xadK\n\x07\x08\x06\x10'
- '\xb1\x97\xd3\x03P\x80\x80@'
- )
+ expected_output = b"".join([
+ b'\n\x172\x11\n\x06\x08@\x10\x87\xadK\n\x07\x08\x06\x10',
+ b'\xb1\x97\xd3\x03P\x80\x80@'
+ ])
self.assertEqual(expected_output, result.getvalue())
diff --git a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/trace_test.py b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/trace_test.py
index 1216037f1c0..37f7501d99d 100644
--- a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/trace_test.py
+++ b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/trace_test.py
@@ -1,13 +1,14 @@
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import unittest
#from .log import *
#from .parsed_trace_events import *
-from log import *
-from parsed_trace_events import *
+from .log import *
+from .parsed_trace_events import *
from py_utils import tempfile_ext
class TraceTest(unittest.TestCase):
diff --git a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_unittest.py b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_unittest.py
index de7b5947835..ab6da5cd997 100644
--- a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_unittest.py
+++ b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_event_unittest.py
@@ -2,6 +2,7 @@
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import contextlib
import json
import logging
@@ -456,7 +457,7 @@ class TraceEventTests(unittest.TestCase):
def testFormatProtobuf(self):
with self._test_trace(format=trace_event.PROTOBUF):
trace_event.trace_flush()
- with open(self._log_path, 'r') as f:
+ with open(self._log_path, 'rb') as f:
self.assertGreater(len(f.read()), 0)
def testAddMetadata(self):
@@ -496,7 +497,7 @@ class TraceEventTests(unittest.TestCase):
story_run_index=0,
)
trace_event.trace_disable()
- with open(self._log_path, 'r') as f:
+ with open(self._log_path, 'rb') as f:
self.assertGreater(len(f.read()), 0)
def testAddMetadataInJsonFormatRaises(self):
@@ -519,7 +520,7 @@ class TraceEventTests(unittest.TestCase):
)
with self._test_trace(format=trace_event.PROTOBUF):
trace_event.trace_disable()
- with open(self._log_path, 'r') as f:
+ with open(self._log_path, 'rb') as f:
self.assertGreater(len(f.read()), 0)
diff --git a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_time.py b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_time.py
index c5e3fe1ed92..9455125d209 100644
--- a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_time.py
+++ b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_time.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import ctypes
import ctypes.util
import logging
diff --git a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_time_unittest.py b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_time_unittest.py
index bae7ea81fe5..509900b27d0 100644
--- a/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_time_unittest.py
+++ b/chromium/third_party/catapult/common/py_trace_event/py_trace_event/trace_time_unittest.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import contextlib
import logging
import platform
@@ -112,7 +113,7 @@ class TimerTest(unittest.TestCase):
# Smoke Test.
def testMonotonic(self):
time_one = trace_time.Now()
- for _ in xrange(1000):
+ for _ in range(1000):
time_two = trace_time.Now()
self.assertLessEqual(time_one, time_two)
time_one = time_two
diff --git a/chromium/third_party/catapult/common/py_trace_event/third_party/protobuf/encoder.py b/chromium/third_party/catapult/common/py_trace_event/third_party/protobuf/encoder.py
index 50d104657d8..59dac3ca2ca 100644
--- a/chromium/third_party/catapult/common/py_trace_event/third_party/protobuf/encoder.py
+++ b/chromium/third_party/catapult/common/py_trace_event/third_party/protobuf/encoder.py
@@ -28,6 +28,7 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+from __future__ import absolute_import
import six
import struct
diff --git a/chromium/third_party/catapult/common/py_utils/PRESUBMIT.py b/chromium/third_party/catapult/common/py_utils/PRESUBMIT.py
index c1d92fe0031..7b8510e31b1 100644
--- a/chromium/third_party/catapult/common/py_utils/PRESUBMIT.py
+++ b/chromium/third_party/catapult/common/py_utils/PRESUBMIT.py
@@ -1,6 +1,10 @@
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+# pylint: disable=invalid-name
+
+
+USE_PYTHON3 = True
def CheckChangeOnUpload(input_api, output_api):
@@ -15,7 +19,7 @@ def _CommonChecks(input_api, output_api):
results = []
results += input_api.RunTests(input_api.canned_checks.GetPylint(
input_api, output_api, extra_paths_list=_GetPathsToPrepend(input_api),
- pylintrc='../../pylintrc'))
+ pylintrc='../../pylintrc', version='2.7'))
return results
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/__init__.py b/chromium/third_party/catapult/common/py_utils/py_utils/__init__.py
index 0d7b052af6f..b4c22a21627 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/__init__.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/__init__.py
@@ -6,6 +6,7 @@
from __future__ import print_function
+from __future__ import absolute_import
import functools
import inspect
import os
@@ -33,12 +34,13 @@ def IsRunningOnCrosDevice():
def GetHostOsName():
if IsRunningOnCrosDevice():
return 'chromeos'
- elif sys.platform.startswith('linux'):
+ if sys.platform.startswith('linux'):
return 'linux'
- elif sys.platform == 'darwin':
+ if sys.platform == 'darwin':
return 'mac'
- elif sys.platform == 'win32':
+ if sys.platform == 'win32':
return 'win'
+ return None
def GetHostArchName():
@@ -55,13 +57,12 @@ def IsExecutable(path):
if os.path.isfile(path):
if hasattr(os, 'name') and os.name == 'nt':
return path.split('.')[-1].upper() in _ExecutableExtensions()
- else:
- return os.access(path, os.X_OK)
- else:
- return False
+ return os.access(path, os.X_OK)
+ return False
def _AddDirToPythonPath(*path_parts):
+ # pylint: disable=no-value-for-parameter
path = os.path.abspath(os.path.join(*path_parts))
if os.path.isdir(path) and path not in sys.path:
# Some callsite that use telemetry assumes that sys.path[0] is the directory
@@ -95,10 +96,7 @@ def Timeout(default_timeout):
def TimeoutDeco(func, default_timeout):
@functools.wraps(func)
def RunWithTimeout(*args, **kwargs):
- if 'timeout' in kwargs:
- timeout = kwargs['timeout']
- else:
- timeout = default_timeout
+ timeout = kwargs.get('timeout', default_timeout)
try:
return timeout_retry.Run(func, timeout, 0, args=args)
except reraiser_thread.TimeoutError:
@@ -155,4 +153,3 @@ class TimeoutException(Exception):
It is possible that waiting for a longer period of time would result in a
successful operation.
"""
- pass
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/atexit_with_log.py b/chromium/third_party/catapult/common/py_utils/py_utils/atexit_with_log.py
index f217c094366..92650af5672 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/atexit_with_log.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/atexit_with_log.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import atexit
import logging
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/binary_manager.py b/chromium/third_party/catapult/common/py_utils/py_utils/binary_manager.py
index 2d3ac8a6cf6..51027d82d45 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/binary_manager.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/binary_manager.py
@@ -2,12 +2,13 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import logging
import dependency_manager
-class BinaryManager(object):
+class BinaryManager():
""" This class is effectively a subclass of dependency_manager, but uses a
different number of arguments for FetchPath and LocalPath.
"""
@@ -58,4 +59,3 @@ class BinaryManager(object):
'Cannot find path for %s on platform %s. Falling back to %s.',
binary_name, versioned_platform, platform)
return function(binary_name, platform)
-
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/binary_manager_unittest.py b/chromium/third_party/catapult/common/py_utils/py_utils/binary_manager_unittest.py
index ccf21ad11c9..26e4ed24f29 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/binary_manager_unittest.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/binary_manager_unittest.py
@@ -2,8 +2,10 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import json
import os
+import six
from pyfakefs import fake_filesystem_unittest
from dependency_manager import exceptions
@@ -13,9 +15,14 @@ from py_utils import binary_manager
class BinaryManagerTest(fake_filesystem_unittest.TestCase):
# TODO(aiolos): disable cloud storage use during this test.
+ def assertCountEqualPy23(self, expected, actual):
+ if six.PY2:
+ self.assertItemsEqual(expected, actual)
+ else:
+ self.assertCountEqual(expected, actual)
+
def setUp(self):
self.setUpPyfakefs()
- # pylint: disable=bad-continuation
self.expected_dependencies = {
'dep_1': {
'cloud_storage_base_folder': 'dependencies/fake_config',
@@ -138,7 +145,6 @@ class BinaryManagerTest(fake_filesystem_unittest.TestCase):
}
}
}
- # pylint: enable=bad-continuation
fake_config = {
'config_type': 'BaseConfig',
'dependencies': self.expected_dependencies
@@ -173,8 +179,8 @@ class BinaryManagerTest(fake_filesystem_unittest.TestCase):
with self.assertRaises(ValueError):
manager = binary_manager.BinaryManager(self.base_config)
manager = binary_manager.BinaryManager([self.base_config])
- self.assertItemsEqual(self.expected_dependencies,
- manager._dependency_manager._lookup_dict)
+ self.assertCountEqualPy23(self.expected_dependencies,
+ manager._dependency_manager._lookup_dict)
def testSuccessfulFetchPathNoOsVersion(self):
manager = binary_manager.BinaryManager([self.base_config])
@@ -211,4 +217,3 @@ class BinaryManagerTest(fake_filesystem_unittest.TestCase):
manager = binary_manager.BinaryManager([self.base_config])
found_path = manager.LocalPath('dep_2', 'android', 'x86', 'l')
self.assertEqual(self.expected_dep2_android_file, found_path)
-
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/camel_case.py b/chromium/third_party/catapult/common/py_utils/py_utils/camel_case.py
index dbebb227384..dbe9943e804 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/camel_case.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/camel_case.py
@@ -18,17 +18,16 @@ def ToUnderscore(obj):
if isinstance(obj, six.string_types):
return re.sub('(?!^)([A-Z]+)', r'_\1', obj).lower()
- elif isinstance(obj, list):
+ if isinstance(obj, list):
return [ToUnderscore(item) for item in obj]
- elif isinstance(obj, dict):
+ if isinstance(obj, dict):
output = {}
for k, v in six.iteritems(obj):
- if isinstance(v, list) or isinstance(v, dict):
+ if isinstance(v, (list, dict)):
output[ToUnderscore(k)] = ToUnderscore(v)
else:
output[ToUnderscore(k)] = v
return output
- else:
- return obj
+ return obj
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/camel_case_unittest.py b/chromium/third_party/catapult/common/py_utils/py_utils/camel_case_unittest.py
index c748ba2f433..ddae2957fb4 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/camel_case_unittest.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/camel_case_unittest.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import unittest
from py_utils import camel_case
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/chrome_binaries.json b/chromium/third_party/catapult/common/py_utils/py_utils/chrome_binaries.json
index badb3642c7f..04173ec6dae 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/chrome_binaries.json
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/chrome_binaries.json
@@ -12,16 +12,16 @@
"version_in_cs": "85.0.4169.0"
},
"win_AMD64": {
- "cloud_storage_hash": "c0b02f47afb6bacdd8d12eda6f03488583404b60",
+ "cloud_storage_hash": "121271e6e917886bd2e5b539dd643e74a3aae395",
"download_path": "bin\\reference_build\\chrome-win64-clang.zip",
"path_within_archive": "chrome-win64-clang\\chrome.exe",
- "version_in_cs": "85.0.4169.0"
+ "version_in_cs": "86.0.4240.111"
},
"win_x86": {
- "cloud_storage_hash": "5879958eda4edc5b0eaffeda4c7369a07937af73",
+ "cloud_storage_hash": "83e9d11b28d01c10bbcccb7b882288b192b5e756",
"download_path": "bin\\reference_build\\chrome-win32-clang.zip",
"path_within_archive": "chrome-win32-clang\\chrome.exe",
- "version_in_cs": "85.0.4169.0"
+ "version_in_cs": "86.0.4240.111"
}
}
},
@@ -88,6 +88,12 @@
"path_within_archive": "chrome-mac/Google Chrome.app/Contents/MacOS/Google Chrome",
"version_in_cs": "83.0.4103.97"
},
+ "mac_arm64": {
+ "cloud_storage_hash": "8e5715ab04cdf366a20038b6d6aac2f41e12bbf0",
+ "download_path": "bin/reference_build/chrome-mac-arm64.zip",
+ "path_within_archive": "chrome-mac/Google Chrome.app/Contents/MacOS/Google Chrome",
+ "version_in_cs": "100.0.4896.75"
+ },
"win_AMD64": {
"cloud_storage_hash": "e6515496ebab0d02a5294a008fe8bbf9dd3dbc0c",
"download_path": "bin\\reference_build\\chrome-win64-clang.zip",
@@ -154,6 +160,12 @@
"path_within_archive": "chrome-mac/Chromium.app/Contents/MacOS/Chromium",
"version_in_cs": "83.0.4103.97"
},
+ "mac_arm64": {
+ "cloud_storage_hash": "5fd942947943278bcf91b6f7ef85485ebfef3092",
+ "download_path": "bin/reference_build/chrome-mac-arm64.zip",
+ "path_within_archive": "chrome-mac/Chromium.app/Contents/MacOS/Chromium",
+ "version_in_cs": "100.0.4896.75"
+ },
"win_AMD64": {
"cloud_storage_hash": "5e503f1bfeae37061ddc80ae1660a1c41594b188",
"download_path": "bin\\reference_build\\chrome-win.zip",
@@ -169,4 +181,4 @@
}
}
}
-} \ No newline at end of file
+}
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/class_util.py b/chromium/third_party/catapult/common/py_utils/py_utils/class_util.py
index 4cec430038b..bed7365a582 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/class_util.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/class_util.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import inspect
def IsMethodOverridden(parent_cls, child_cls, method_name):
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/class_util_unittest.py b/chromium/third_party/catapult/common/py_utils/py_utils/class_util_unittest.py
index 938bcdc7b81..d04a12d9a1b 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/class_util_unittest.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/class_util_unittest.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import unittest
from py_utils import class_util
@@ -10,7 +11,7 @@ from py_utils import class_util
class ClassUtilTest(unittest.TestCase):
def testClassOverridden(self):
- class Parent(object):
+ class Parent():
def MethodShouldBeOverridden(self):
pass
@@ -22,7 +23,7 @@ class ClassUtilTest(unittest.TestCase):
Parent, Child, 'MethodShouldBeOverridden'))
def testGrandchildOverridden(self):
- class Parent(object):
+ class Parent():
def MethodShouldBeOverridden(self):
pass
@@ -37,7 +38,7 @@ class ClassUtilTest(unittest.TestCase):
Parent, Grandchild, 'MethodShouldBeOverridden'))
def testClassNotOverridden(self):
- class Parent(object):
+ class Parent():
def MethodShouldBeOverridden(self):
pass
@@ -49,7 +50,7 @@ class ClassUtilTest(unittest.TestCase):
Parent, Child, 'MethodShouldBeOverridden'))
def testGrandchildNotOverridden(self):
- class Parent(object):
+ class Parent():
def MethodShouldBeOverridden(self):
pass
@@ -65,7 +66,7 @@ class ClassUtilTest(unittest.TestCase):
Parent, Grandchild, 'MethodShouldBeOverridden'))
def testClassNotPresentInParent(self):
- class Parent(object):
+ class Parent():
def MethodShouldBeOverridden(self):
pass
@@ -78,7 +79,7 @@ class ClassUtilTest(unittest.TestCase):
Parent, Child, 'WrongMethod')
def testInvalidClass(self):
- class Foo(object):
+ class Foo():
def Bar(self):
pass
@@ -89,18 +90,18 @@ class ClassUtilTest(unittest.TestCase):
AssertionError, class_util.IsMethodOverridden, Foo, 'invalid', 'Bar')
def testMultipleInheritance(self):
- class Aaa(object):
+ class Aaa():
def One(self):
pass
- class Bbb(object):
+ class Bbb():
def Two(self):
pass
class Ccc(Aaa, Bbb):
pass
- class Ddd(object):
+ class Ddd():
def Three(self):
pass
@@ -112,7 +113,7 @@ class ClassUtilTest(unittest.TestCase):
def One(self):
pass
- class Ggg(object):
+ class Ggg():
def Four(self):
pass
@@ -134,5 +135,3 @@ class ClassUtilTest(unittest.TestCase):
self.assertTrue(class_util.IsMethodOverridden(Bbb, Hhh, 'Two'))
self.assertTrue(class_util.IsMethodOverridden(Bbb, Jjj, 'Two'))
self.assertFalse(class_util.IsMethodOverridden(Eee, Fff, 'Three'))
-
-
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/cloud_storage.py b/chromium/third_party/catapult/common/py_utils/py_utils/cloud_storage.py
index a359a065d97..b9f155e18b1 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/cloud_storage.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/cloud_storage.py
@@ -4,6 +4,7 @@
"""Wrappers for gsutil, for basic interaction with Google Cloud Storage."""
+from __future__ import absolute_import
import collections
import contextlib
import hashlib
@@ -74,10 +75,13 @@ class CloudStorageError(Exception):
' 2. If you have a @google.com account, use that account.\n'
' 3. For the project-id, just enter 0.' % command)
-
+# TODO(https://crbug.com/1262295): Rename this after Python2 trybots retire.
+# pylint: disable=redefined-builtin
class PermissionError(CloudStorageError):
def __init__(self):
+ # TODO(https://crbug.com/1262295): Change to super() after Python2 trybots retire.
+ # pylint: disable=super-with-arguments
super(PermissionError, self).__init__(
'Attempted to access a file from Cloud Storage but you don\'t '
'have permission. ' + self._GetConfigInstructions())
@@ -86,6 +90,8 @@ class PermissionError(CloudStorageError):
class CredentialsError(CloudStorageError):
def __init__(self):
+ # TODO(https://crbug.com/1262295): Change to super() after Python2 trybots retire.
+ # pylint: disable=super-with-arguments
super(CredentialsError, self).__init__(
'Attempted to access a file from Cloud Storage but you have no '
'configured credentials. ' + self._GetConfigInstructions())
@@ -138,13 +144,9 @@ def _RunCommand(args):
elif _IsRunningOnSwarming():
gsutil_env = os.environ.copy()
- if os.name == 'nt':
- # If Windows, prepend python. Python scripts aren't directly executable.
- args = [sys.executable, _GSUTIL_PATH] + args
- else:
- # Don't do it on POSIX, in case someone is using a shell script to redirect.
- args = [_GSUTIL_PATH] + args
- _EnsureExecutable(_GSUTIL_PATH)
+ # Always prepend executable to take advantage of vpython following advice of:
+ # https://chromium.googlesource.com/infra/infra/+/main/doc/users/vpython.md
+ args = [sys.executable, _GSUTIL_PATH] + args
if args[0] not in ('help', 'hash', 'version') and not IsNetworkIOEnabled():
raise CloudStorageIODisabled(
@@ -156,9 +158,9 @@ def _RunCommand(args):
stdout, stderr = gsutil.communicate()
if gsutil.returncode:
- raise GetErrorObjectForCloudStorageStderr(stderr)
+ raise GetErrorObjectForCloudStorageStderr(stderr.decode('utf-8'))
- return stdout
+ return stdout.decode('utf-8')
def GetErrorObjectForCloudStorageStderr(stderr):
@@ -192,10 +194,66 @@ def IsNetworkIOEnabled():
return disable_cloud_storage_env_val != '1'
-def List(bucket):
- query = 'gs://%s/' % bucket
- stdout = _RunCommand(['ls', query])
- return [url[len(query):] for url in stdout.splitlines()]
+def List(bucket, prefix=None):
+ """Returns all paths matching the given prefix in bucket.
+
+ Returned paths are relative to the bucket root.
+ If path is given, 'gsutil ls gs://<bucket>/<path>' will be executed, otherwise
+ 'gsutil ls gs://<bucket>' will be executed.
+
+ For more details, see:
+ https://cloud.google.com/storage/docs/gsutil/commands/ls#directory-by-directory,-flat,-and-recursive-listings
+
+ Args:
+ bucket: Name of cloud storage bucket to look at.
+ prefix: Path within the bucket to filter to.
+
+ Returns:
+ A list of files. All returned path are relative to the bucket root
+ directory. For example, List('my-bucket', path='foo/') will returns results
+ of the form ['/foo/123', '/foo/124', ...], as opposed to ['123', '124',
+ ...].
+ """
+ bucket_prefix = 'gs://%s' % bucket
+ if prefix is None:
+ full_path = bucket_prefix
+ else:
+ full_path = '%s/%s' % (bucket_prefix, prefix)
+ stdout = _RunCommand(['ls', full_path])
+ return [url[len(bucket_prefix):] for url in stdout.splitlines()]
+
+
+def ListFiles(bucket, path='', sort_by='name'):
+ """Returns files matching the given path in bucket.
+
+ Args:
+ bucket: Name of cloud storage bucket to look at.
+ path: Path within the bucket to filter to. Path can include wildcards.
+ sort_by: 'name' (default), 'time' or 'size'.
+
+ Returns:
+ A sorted list of files.
+ """
+ bucket_prefix = 'gs://%s' % bucket
+ full_path = '%s/%s' % (bucket_prefix, path)
+ stdout = _RunCommand(['ls', '-l', '-d', full_path])
+
+ # Filter out directories and the summary line.
+ file_infos = [line.split(None, 2) for line in stdout.splitlines()
+ if len(line) > 0 and not line.startswith("TOTAL")
+ and not line.endswith('/')]
+
+ # The first field in the info is size, the second is time, the third is name.
+ if sort_by == 'size':
+ file_infos.sort(key=lambda info: int(info[0]))
+ elif sort_by == 'time':
+ file_infos.sort(key=lambda info: info[1])
+ elif sort_by == 'name':
+ file_infos.sort(key=lambda info: info[2])
+ else:
+ raise ValueError("Wrong sort_by value: %s" % sort_by)
+
+ return [url[len(bucket_prefix):] for _, _, url in file_infos]
def ListDirs(bucket, path=''):
@@ -229,6 +287,7 @@ def ListDirs(bucket, path=''):
dirs.append(url[len(bucket_prefix):])
return dirs
+
def Exists(bucket, remote_path):
try:
_RunCommand(['ls', 'gs://%s/%s' % (bucket, remote_path)])
@@ -409,7 +468,7 @@ def Insert(bucket, remote_path, local_path, publicly_readable=False):
return cloud_filepath.view_url
-class CloudFilepath(object):
+class CloudFilepath():
def __init__(self, bucket, remote_path):
self.bucket = bucket
self.remote_path = remote_path
@@ -417,7 +476,7 @@ class CloudFilepath(object):
@property
def view_url(self):
"""Get a human viewable url for the cloud file."""
- return 'https://console.developers.google.com/m/cloudstorage/b/%s/o/%s' % (
+ return 'https://storage.cloud.google.com/%s/%s' % (
self.bucket, self.remote_path)
@property
@@ -567,4 +626,4 @@ def CalculateHash(file_path):
def ReadHash(hash_path):
with open(hash_path, 'rb') as f:
- return f.read(1024).rstrip()
+ return f.read(1024).rstrip().decode('utf-8')
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/cloud_storage_unittest.py b/chromium/third_party/catapult/common/py_utils/py_utils/cloud_storage_unittest.py
index 2e663a763d2..fb326e74dea 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/cloud_storage_unittest.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/cloud_storage_unittest.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import os
import shutil
import sys
@@ -63,7 +64,7 @@ class CloudStorageFakeFsUnitTest(BaseFakeFsUnitTest):
popen.return_value = p_mock
p_mock.returncode = 1
for stderr in communicate_strs:
- p_mock.communicate.return_value = ('', stderr)
+ p_mock.communicate.return_value = ('', stderr.encode('utf-8'))
self.assertRaises(error, cloud_storage._RunCommand, [])
def testRunCommandCredentialsError(self):
@@ -96,8 +97,8 @@ class CloudStorageFakeFsUnitTest(BaseFakeFsUnitTest):
local_path = 'test-local-path.html'
cloud_url = cloud_storage.Insert(cloud_storage.PUBLIC_BUCKET,
remote_path, local_path)
- self.assertEqual('https://console.developers.google.com/m/cloudstorage'
- '/b/chromium-telemetry/o/test-remote-path.html',
+ self.assertEqual('https://storage.cloud.google.com'
+ '/chromium-telemetry/test-remote-path.html',
cloud_url)
finally:
cloud_storage._RunCommand = orig_run_command
@@ -110,8 +111,8 @@ class CloudStorageFakeFsUnitTest(BaseFakeFsUnitTest):
local_path = 'test-local-path.html'
cloud_filepath = cloud_storage.Upload(
cloud_storage.PUBLIC_BUCKET, remote_path, local_path)
- self.assertEqual('https://console.developers.google.com/m/cloudstorage'
- '/b/chromium-telemetry/o/test-remote-path.html',
+ self.assertEqual('https://storage.cloud.google.com'
+ '/chromium-telemetry/test-remote-path.html',
cloud_filepath.view_url)
self.assertEqual('gs://chromium-telemetry/test-remote-path.html',
cloud_filepath.fetch_url)
@@ -124,7 +125,7 @@ class CloudStorageFakeFsUnitTest(BaseFakeFsUnitTest):
subprocess_mock.Popen.return_value = p_mock
p_mock.communicate.return_value = (
'',
- 'CommandException: One or more URLs matched no objects.\n')
+ b'CommandException: One or more URLs matched no objects.\n')
p_mock.returncode_result = 1
self.assertFalse(cloud_storage.Exists('fake bucket',
'fake remote path'))
@@ -171,6 +172,24 @@ class CloudStorageFakeFsUnitTest(BaseFakeFsUnitTest):
cloud_storage._RunCommand = orig_run_command
@mock.patch('py_utils.cloud_storage._RunCommand')
+ def testListNoPrefix(self, mock_run_command):
+ mock_run_command.return_value = '\n'.join(['gs://bucket/foo-file.txt',
+ 'gs://bucket/foo1/',
+ 'gs://bucket/foo2/'])
+
+ self.assertEqual(cloud_storage.List('bucket'),
+ ['/foo-file.txt', '/foo1/', '/foo2/'])
+
+ @mock.patch('py_utils.cloud_storage._RunCommand')
+ def testListWithPrefix(self, mock_run_command):
+ mock_run_command.return_value = '\n'.join(['gs://bucket/foo/foo-file.txt',
+ 'gs://bucket/foo/foo1/',
+ 'gs://bucket/foo/foo2/'])
+
+ self.assertEqual(cloud_storage.List('bucket', 'foo'),
+ ['/foo/foo-file.txt', '/foo/foo1/', '/foo/foo2/'])
+
+ @mock.patch('py_utils.cloud_storage._RunCommand')
def testListDirs(self, mock_run_command):
mock_run_command.return_value = '\n'.join(['gs://bucket/foo-file.txt',
'',
@@ -181,12 +200,54 @@ class CloudStorageFakeFsUnitTest(BaseFakeFsUnitTest):
self.assertEqual(cloud_storage.ListDirs('bucket', 'foo*'),
['/foo1/', '/foo2/'])
+ @mock.patch('py_utils.cloud_storage._RunCommand')
+ def testListFilesSortByName(self, mock_run_command):
+ mock_run_command.return_value = '\n'.join([
+ ' 11 2022-01-01T16:05:16Z gs://bucket/foo/c.txt',
+ ' 5 2022-03-03T16:05:16Z gs://bucket/foo/a.txt',
+ '',
+ ' gs://bucket/foo/bar/',
+ ' 1 2022-02-02T16:05:16Z gs://bucket/foo/bar/b.txt',
+ 'TOTAL: 3 objects, 17 bytes (17 B)',
+ ])
+
+ self.assertEqual(cloud_storage.ListFiles('bucket', 'foo/*', sort_by='name'),
+ ['/foo/a.txt', '/foo/bar/b.txt', '/foo/c.txt'])
+
+ @mock.patch('py_utils.cloud_storage._RunCommand')
+ def testListFilesSortByTime(self, mock_run_command):
+ mock_run_command.return_value = '\n'.join([
+ ' 11 2022-01-01T16:05:16Z gs://bucket/foo/c.txt',
+ ' 5 2022-03-03T16:05:16Z gs://bucket/foo/a.txt',
+ '',
+ ' gs://bucket/foo/bar/',
+ ' 1 2022-02-02T16:05:16Z gs://bucket/foo/bar/b.txt',
+ 'TOTAL: 3 objects, 17 bytes (17 B)',
+ ])
+
+ self.assertEqual(cloud_storage.ListFiles('bucket', 'foo/*', sort_by='time'),
+ ['/foo/c.txt', '/foo/bar/b.txt', '/foo/a.txt'])
+
+ @mock.patch('py_utils.cloud_storage._RunCommand')
+ def testListFilesSortBySize(self, mock_run_command):
+ mock_run_command.return_value = '\n'.join([
+ ' 11 2022-01-01T16:05:16Z gs://bucket/foo/c.txt',
+ ' 5 2022-03-03T16:05:16Z gs://bucket/foo/a.txt',
+ '',
+ ' gs://bucket/foo/bar/',
+ ' 1 2022-02-02T16:05:16Z gs://bucket/foo/bar/b.txt',
+ 'TOTAL: 3 objects, 17 bytes (17 B)',
+ ])
+
+ self.assertEqual(cloud_storage.ListFiles('bucket', 'foo/*', sort_by='size'),
+ ['/foo/bar/b.txt', '/foo/a.txt', '/foo/c.txt'])
+
@mock.patch('py_utils.cloud_storage.subprocess.Popen')
def testSwarmingUsesExistingEnv(self, mock_popen):
os.environ['SWARMING_HEADLESS'] = '1'
mock_gsutil = mock_popen()
- mock_gsutil.communicate = mock.MagicMock(return_value=('a', 'b'))
+ mock_gsutil.communicate = mock.MagicMock(return_value=(b'a', b'b'))
mock_gsutil.returncode = None
cloud_storage.Copy('bucket1', 'bucket2', 'remote_path1', 'remote_path2')
@@ -227,11 +288,15 @@ class CloudStorageFakeFsUnitTest(BaseFakeFsUnitTest):
class GetIfChangedTests(BaseFakeFsUnitTest):
def setUp(self):
+ # TODO(https://crbug.com/1262295): Change to super() after Python2 trybots retire.
+ # pylint: disable=super-with-arguments
super(GetIfChangedTests, self).setUp()
self._orig_read_hash = cloud_storage.ReadHash
self._orig_calculate_hash = cloud_storage.CalculateHash
def tearDown(self):
+ # TODO(https://crbug.com/1262295): Change to super() after Python2 trybots retire.
+ # pylint: disable=super-with-arguments
super(GetIfChangedTests, self).tearDown()
cloud_storage.CalculateHash = self._orig_calculate_hash
cloud_storage.ReadHash = self._orig_read_hash
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/contextlib_ext.py b/chromium/third_party/catapult/common/py_utils/py_utils/contextlib_ext.py
index 922d27d548b..44ccf9e7ec8 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/contextlib_ext.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/contextlib_ext.py
@@ -3,7 +3,7 @@
# found in the LICENSE file.
-class _OptionalContextManager(object):
+class _OptionalContextManager():
def __init__(self, manager, condition):
self._manager = manager
@@ -30,4 +30,3 @@ def Optional(manager, condition):
A context manager that conditionally executes the given manager.
"""
return _OptionalContextManager(manager, condition)
-
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/contextlib_ext_unittest.py b/chromium/third_party/catapult/common/py_utils/py_utils/contextlib_ext_unittest.py
index b83e7e5e018..be40e7b641f 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/contextlib_ext_unittest.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/contextlib_ext_unittest.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import unittest
from py_utils import contextlib_ext
@@ -9,7 +10,7 @@ from py_utils import contextlib_ext
class OptionalUnittest(unittest.TestCase):
- class SampleContextMgr(object):
+ class SampleContextMgr():
def __init__(self):
self.entered = False
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/dependency_util.py b/chromium/third_party/catapult/common/py_utils/py_utils/dependency_util.py
index d3cfe89c389..e7b3345f96f 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/dependency_util.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/dependency_util.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import os
import platform
import sys
@@ -39,7 +40,7 @@ def GetChromeApkOsVersion(version_name):
'First character of versions name %s was not an uppercase letter.')
if version < 'L':
return 'k'
- elif version > 'M':
+ if version > 'M':
return 'n'
return 'l'
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/discover.py b/chromium/third_party/catapult/common/py_utils/py_utils/discover.py
index a9333e2d7dd..7eac0c545a8 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/discover.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/discover.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import fnmatch
import importlib
import inspect
@@ -174,6 +175,7 @@ def IsDirectlyConstructable(cls):
# Case |class A(object): pass|.
return True
# Case |class (object):| with |__init__| other than |object.__init__|.
+ # pylint: disable=deprecated-method
args, _, _, defaults = inspect.getargspec(cls.__init__)
if defaults is None:
defaults = ()
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/discover_unittest.py b/chromium/third_party/catapult/common/py_utils/py_utils/discover_unittest.py
index bdc50b2fff9..ec76df18142 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/discover_unittest.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/discover_unittest.py
@@ -113,26 +113,25 @@ class DiscoverTest(unittest.TestCase):
}
self.assertEqual(actual_classes, expected_classes)
-
-class ClassWithoutInitDefOne: # pylint: disable=old-style-class, no-init
+class ClassWithoutInitDefOne():
pass
-class ClassWithoutInitDefTwo(object):
+class ClassWithoutInitDefTwo():
pass
-class ClassWhoseInitOnlyHasSelf(object):
+class ClassWhoseInitOnlyHasSelf():
def __init__(self):
pass
-class ClassWhoseInitWithDefaultArguments(object):
+class ClassWhoseInitWithDefaultArguments():
def __init__(self, dog=1, cat=None, cow=None, fud='a'):
pass
-class ClassWhoseInitWithDefaultArgumentsAndNonDefaultArguments(object):
+class ClassWhoseInitWithDefaultArgumentsAndNonDefaultArguments():
def __init__(self, x, dog=1, cat=None, fish=None, fud='a'):
pass
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/exc_util.py b/chromium/third_party/catapult/common/py_utils/py_utils/exc_util.py
index 538ced2a7c1..7e1690b83ce 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/exc_util.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/exc_util.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import functools
import logging
import sys
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/exc_util_unittest.py b/chromium/third_party/catapult/common/py_utils/py_utils/exc_util_unittest.py
index 31e3b57a86c..688be09c8e1 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/exc_util_unittest.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/exc_util_unittest.py
@@ -2,9 +2,11 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import re
import sys
import unittest
+import six
from py_utils import exc_util
@@ -25,7 +27,7 @@ class FakeCleanupError(Exception):
pass
-class FaultyClient(object):
+class FaultyClient():
def __init__(self, *args):
self.failures = set(args)
self.called = set()
@@ -54,11 +56,23 @@ class FaultyClient(object):
class ReraiseTests(unittest.TestCase):
+ def assertCountEqualPy23(self, expected, actual):
+ if six.PY2:
+ # TODO(https://crbug.com/1262295): Update this after Python2 trybots retire.
+ # pylint: disable=deprecated-method, no-member
+ self.assertItemsEqual(expected, actual)
+ else:
+ self.assertCountEqual(expected, actual) # pylint: disable=no-member
+
def assertLogMatches(self, pattern):
+ # TODO(https://crbug.com/1262295): Update this after Python2 trybots retire.
+ # pylint: disable=deprecated-method
self.assertRegexpMatches(
sys.stderr.getvalue(), pattern) # pylint: disable=no-member
def assertLogNotMatches(self, pattern):
+ # TODO(https://crbug.com/1262295): Update this after Python2 trybots retire.
+ # pylint: disable=deprecated-method
self.assertNotRegexpMatches(
sys.stderr.getvalue(), pattern) # pylint: disable=no-member
@@ -76,10 +90,9 @@ class ReraiseTests(unittest.TestCase):
self.assertLogMatches(re.compile(
r'While handling a FakeConnectionError, .* was also raised:\n'
- r'Traceback \(most recent call last\):\n'
- r'.*\n'
+ r'.*'
r'FakeDisconnectionError: Oops!\n', re.DOTALL))
- self.assertItemsEqual(client.called, ['Connect', 'Disconnect'])
+ self.assertCountEqualPy23(client.called, ['Connect', 'Disconnect'])
def testTryRaisesExceptDoesnt(self):
client = FaultyClient(FakeConnectionError)
@@ -94,7 +107,7 @@ class ReraiseTests(unittest.TestCase):
raise
self.assertLogNotMatches('FakeDisconnectionError')
- self.assertItemsEqual(client.called, ['Connect', 'Disconnect'])
+ self.assertCountEqualPy23(client.called, ['Connect', 'Disconnect'])
def testTryPassesNoException(self):
client = FaultyClient(FakeDisconnectionError)
@@ -109,7 +122,7 @@ class ReraiseTests(unittest.TestCase):
self.assertLogNotMatches('FakeConnectionError')
self.assertLogNotMatches('FakeDisconnectionError')
- self.assertItemsEqual(client.called, ['Connect'])
+ self.assertCountEqualPy23(client.called, ['Connect'])
def testTryRaisesFinallyRaises(self):
worker = FaultyClient(FakeProcessingError, FakeCleanupError)
@@ -118,6 +131,8 @@ class ReraiseTests(unittest.TestCase):
with self.assertRaises(FakeProcessingError):
try:
worker.Process()
+ # TODO(https://crbug.com/1262295): Update this after Python2 trybots retire.
+ # pylint: disable=try-except-raise
except:
raise # Needed for Cleanup to know if an exception is handled.
finally:
@@ -125,10 +140,9 @@ class ReraiseTests(unittest.TestCase):
self.assertLogMatches(re.compile(
r'While handling a FakeProcessingError, .* was also raised:\n'
- r'Traceback \(most recent call last\):\n'
- r'.*\n'
+ r'.*'
r'FakeCleanupError: Oops!\n', re.DOTALL))
- self.assertItemsEqual(worker.called, ['Process', 'Cleanup'])
+ self.assertCountEqualPy23(worker.called, ['Process', 'Cleanup'])
def testTryRaisesFinallyDoesnt(self):
worker = FaultyClient(FakeProcessingError)
@@ -137,6 +151,8 @@ class ReraiseTests(unittest.TestCase):
with self.assertRaises(FakeProcessingError):
try:
worker.Process()
+ # TODO(https://crbug.com/1262295): Update this after Python2 trybots retire.
+ # pylint: disable= try-except-raise
except:
raise # Needed for Cleanup to know if an exception is handled.
finally:
@@ -144,7 +160,7 @@ class ReraiseTests(unittest.TestCase):
self.assertLogNotMatches('FakeProcessingError')
self.assertLogNotMatches('FakeCleanupError')
- self.assertItemsEqual(worker.called, ['Process', 'Cleanup'])
+ self.assertCountEqualPy23(worker.called, ['Process', 'Cleanup'])
def testTryPassesFinallyRaises(self):
worker = FaultyClient(FakeCleanupError)
@@ -154,14 +170,12 @@ class ReraiseTests(unittest.TestCase):
with self.assertRaises(FakeCleanupError):
try:
worker.Process()
- except:
- raise # Needed for Cleanup to know if an exception is handled.
finally:
worker.Cleanup()
self.assertLogNotMatches('FakeProcessingError')
self.assertLogNotMatches('FakeCleanupError')
- self.assertItemsEqual(worker.called, ['Process', 'Cleanup'])
+ self.assertCountEqualPy23(worker.called, ['Process', 'Cleanup'])
def testTryRaisesExceptRaisesFinallyRaises(self):
worker = FaultyClient(
@@ -180,4 +194,5 @@ class ReraiseTests(unittest.TestCase):
self.assertLogMatches('FakeDisconnectionError')
self.assertLogMatches('FakeCleanupError')
- self.assertItemsEqual(worker.called, ['Process', 'Disconnect', 'Cleanup'])
+ self.assertCountEqualPy23(worker.called,
+ ['Process', 'Disconnect', 'Cleanup'])
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/expectations_parser.py b/chromium/third_party/catapult/common/py_utils/py_utils/expectations_parser.py
index 534b3526302..5d67c3030b5 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/expectations_parser.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/expectations_parser.py
@@ -13,7 +13,7 @@ class ParseError(Exception):
pass
-class Expectation(object):
+class Expectation():
def __init__(self, reason, test, conditions, results):
"""Constructor for expectations.
@@ -56,7 +56,7 @@ class Expectation(object):
return self._results
-class TestExpectationParser(object):
+class TestExpectationParser():
"""Parse expectations data in TA/DA format.
This parser covers the 'tagged' test lists format in:
@@ -110,14 +110,14 @@ class TestExpectationParser(object):
% (line_number, line))
# Unused group is optional trailing comment.
reason, raw_conditions, test, results, _ = match.groups()
- conditions = [c for c in raw_conditions.split()] if raw_conditions else []
+ conditions = list(raw_conditions.split()) if raw_conditions else []
for c in conditions:
if c not in tags:
raise ParseError(
'Condition %s not found in expectations tag data. Line %d'
% (c, line_number))
- return Expectation(reason, test, conditions, [r for r in results.split()])
+ return Expectation(reason, test, conditions, list(results.split()))
@property
def expectations(self):
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/file_util.py b/chromium/third_party/catapult/common/py_utils/py_utils/file_util.py
index b1602c97de8..7c16c237f1f 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/file_util.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/file_util.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import errno
import os
import shutil
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/file_util_unittest.py b/chromium/third_party/catapult/common/py_utils/py_utils/file_util_unittest.py
index 4bb19a14225..219e6717fe9 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/file_util_unittest.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/file_util_unittest.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import errno
import os
import shutil
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/lock.py b/chromium/third_party/catapult/common/py_utils/py_utils/lock.py
index ade4d1f0376..7d8fdb5cf1c 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/lock.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/lock.py
@@ -2,8 +2,10 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import # pylint: disable=wrong-import-position
import contextlib
import os
+import six
LOCK_EX = None # Exclusive lock
LOCK_SH = None # Shared lock
@@ -85,11 +87,11 @@ def _LockImplWin(target_file, flags):
try:
win32file.LockFileEx(hfile, flags, 0, -0x10000, _OVERLAPPED)
except pywintypes.error as exc_value:
- if exc_value[0] == 33:
- raise LockException('Error trying acquiring lock of %s: %s' %
- (target_file.name, exc_value[2]))
- else:
- raise
+ if exc_value.args[0] == 33:
+ six.raise_from(LockException('Error trying acquiring lock of %s: %s' %
+ (target_file.name, exc_value.args[2])),
+ exc_value)
+ raise
def _UnlockImplWin(target_file):
@@ -97,7 +99,7 @@ def _UnlockImplWin(target_file):
try:
win32file.UnlockFileEx(hfile, 0, -0x10000, _OVERLAPPED)
except pywintypes.error as exc_value:
- if exc_value[0] == 158:
+ if exc_value.args[0] == 158:
# error: (158, 'UnlockFileEx', 'The segment is already unlocked.')
# To match the 'posix' implementation, silently ignore this error
pass
@@ -110,11 +112,11 @@ def _LockImplPosix(target_file, flags):
try:
fcntl.flock(target_file.fileno(), flags)
except IOError as exc_value:
- if exc_value[0] == 11 or exc_value[0] == 35:
- raise LockException('Error trying acquiring lock of %s: %s' %
- (target_file.name, exc_value[1]))
- else:
- raise
+ if exc_value.args[0] == 11 or exc_value.args[0] == 35:
+ six.raise_from(LockException('Error trying acquiring lock of %s: %s' %
+ (target_file.name, exc_value.args[1])),
+ exc_value)
+ raise
def _UnlockImplPosix(target_file):
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/lock_unittest.py b/chromium/third_party/catapult/common/py_utils/py_utils/lock_unittest.py
index 2ba288bd14a..ef2a4150af9 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/lock_unittest.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/lock_unittest.py
@@ -73,8 +73,8 @@ class FileLockTest(unittest.TestCase):
# file content as below.
expected_file_content = ''.join((['Start'] + ['*']*10000 + ['End']) * 10)
with open(self.temp_file_path, 'r') as f:
- # Use assertTrue instead of assertEquals since the strings are big, hence
- # assertEquals's assertion failure will contain huge strings.
+ # Use assertTrue instead of assertEqual since the strings are big, hence
+ # assertEqual's assertion failure will contain huge strings.
self.assertTrue(expected_file_content == f.read())
def testSharedLock(self):
@@ -102,7 +102,7 @@ class FileLockTest(unittest.TestCase):
# temp_write_file should contains 10 copy of temp_file_path's content.
with open(temp_write_file, 'r') as f:
- self.assertEquals('0123456789'*10, f.read())
+ self.assertEqual('0123456789'*10, f.read())
finally:
os.remove(temp_write_file)
@@ -119,7 +119,7 @@ class FileLockTest(unittest.TestCase):
p.start()
p.join()
with open(temp_status_file, 'r') as f:
- self.assertEquals('LockException raised', f.read())
+ self.assertEqual('LockException raised', f.read())
finally:
os.remove(temp_status_file)
@@ -137,7 +137,7 @@ class FileLockTest(unittest.TestCase):
p.start()
p.join()
with open(temp_status_file, 'r') as f:
- self.assertEquals('LockException was not raised', f.read())
+ self.assertEqual('LockException was not raised', f.read())
finally:
os.remove(temp_status_file)
@@ -156,7 +156,7 @@ class FileLockTest(unittest.TestCase):
p.start()
p.join()
with open(temp_status_file, 'r') as f:
- self.assertEquals('LockException raised', f.read())
+ self.assertEqual('LockException raised', f.read())
# Accessing self.temp_file_path here should not raise exception.
p = multiprocessing.Process(
@@ -165,6 +165,6 @@ class FileLockTest(unittest.TestCase):
p.start()
p.join()
with open(temp_status_file, 'r') as f:
- self.assertEquals('LockException was not raised', f.read())
+ self.assertEqual('LockException was not raised', f.read())
finally:
os.remove(temp_status_file)
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/logging_util.py b/chromium/third_party/catapult/common/py_utils/py_utils/logging_util.py
index 435785116bc..f8445137696 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/logging_util.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/logging_util.py
@@ -7,6 +7,7 @@ It would be named logging, but other modules in this directory use the default
logging module, so that would break them.
"""
+from __future__ import absolute_import
import contextlib
import logging
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/logging_util_unittest.py b/chromium/third_party/catapult/common/py_utils/py_utils/logging_util_unittest.py
index eb26098c885..67da91e4746 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/logging_util_unittest.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/logging_util_unittest.py
@@ -1,11 +1,12 @@
# Copyright 2017 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import logging
import unittest
try:
- from six import StringIO
+ from StringIO import StringIO
except ImportError:
from io import StringIO
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/memory_debug.py b/chromium/third_party/catapult/common/py_utils/py_utils/memory_debug.py
index 26f10ae0368..bca86cccdb4 100755
--- a/chromium/third_party/catapult/common/py_utils/py_utils/memory_debug.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/memory_debug.py
@@ -3,6 +3,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import heapq
import logging
import os
@@ -26,8 +27,7 @@ def FormatBytes(value):
if value is not None:
return '%.1f %s' % GetValueAndUnit(value)
- else:
- return 'N/A'
+ return 'N/A'
def _GetProcessInfo(p):
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/modules_util.py b/chromium/third_party/catapult/common/py_utils/py_utils/modules_util.py
index 6c1106d77f4..7ac6c4dfc33 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/modules_util.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/modules_util.py
@@ -1,6 +1,7 @@
# Copyright 2019 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
from distutils import version # pylint: disable=no-name-in-module
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/modules_util_unittest.py b/chromium/third_party/catapult/common/py_utils/py_utils/modules_util_unittest.py
index aa056740a2c..4ff02f2cd48 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/modules_util_unittest.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/modules_util_unittest.py
@@ -1,12 +1,13 @@
# Copyright 2019 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import unittest
from py_utils import modules_util
-class FakeModule(object):
+class FakeModule():
def __init__(self, name, version):
self.__name__ = name
self.__version__ = version
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/py_utils_unittest.py b/chromium/third_party/catapult/common/py_utils/py_utils/py_utils_unittest.py
index 588a5d57572..4831a8ce323 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/py_utils_unittest.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/py_utils_unittest.py
@@ -1,6 +1,7 @@
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import os
import sys
import unittest
@@ -53,4 +54,3 @@ class WaitForTest(unittest.TestCase):
def testWaitForFalseLambda(self):
with self.assertRaises(py_utils.TimeoutException):
py_utils.WaitFor(lambda: False, .1)
-
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/refactor/__init__.py b/chromium/third_party/catapult/common/py_utils/py_utils/refactor/__init__.py
index 938ff684d5e..5926397ea31 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/refactor/__init__.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/refactor/__init__.py
@@ -8,6 +8,7 @@ This module provides components for modifying and querying Python code. They can
be used to build custom refactorings and linters.
"""
+from __future__ import absolute_import
import functools
import multiprocessing
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/__init__.py b/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/__init__.py
index 1bed84be683..180907ca652 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/__init__.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/__init__.py
@@ -3,6 +3,7 @@
# found in the LICENSE file.
# pylint: disable=wildcard-import
+from __future__ import absolute_import
from py_utils.refactor.annotated_symbol.class_definition import *
from py_utils.refactor.annotated_symbol.function_definition import *
from py_utils.refactor.annotated_symbol.import_statement import *
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/base_symbol.py b/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/base_symbol.py
index bdaec61b3ae..e51d6355481 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/base_symbol.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/base_symbol.py
@@ -13,6 +13,8 @@ from py_utils.refactor import snippet
class AnnotatedSymbol(snippet.Symbol):
def __init__(self, symbol_type, children):
+ # TODO(https://crbug.com/1262295): Change to super() after Python2 trybots retire.
+ # pylint: disable=super-with-arguments
super(AnnotatedSymbol, self).__init__(symbol_type, children)
self._modified = False
@@ -20,12 +22,16 @@ class AnnotatedSymbol(snippet.Symbol):
def modified(self):
if self._modified:
return True
+ # TODO(https://crbug.com/1262295): Change to super() after Python2 trybots retire.
+ # pylint: disable=super-with-arguments
return super(AnnotatedSymbol, self).modified
def __setattr__(self, name, value):
if (hasattr(self.__class__, name) and
isinstance(getattr(self.__class__, name), property)):
self._modified = True
+ # TODO(https://crbug.com/1262295): Change to super() after Python2 trybots retire.
+ # pylint: disable=super-with-arguments
return super(AnnotatedSymbol, self).__setattr__(name, value)
def Cut(self, child):
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/class_definition.py b/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/class_definition.py
index a83ac96d895..cad50879f13 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/class_definition.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/class_definition.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import symbol
from py_utils.refactor.annotated_symbol import base_symbol
@@ -23,13 +24,11 @@ class Class(base_symbol.AnnotatedSymbol):
return None
statement = compound_statement.children[0]
- if statement.type == symbol.classdef:
- return cls(statement.type, statement.children)
- elif (statement.type == symbol.decorated and
+ if statement.type == symbol.classdef or \
+ (statement.type == symbol.decorated and
statement.children[-1].type == symbol.classdef):
return cls(statement.type, statement.children)
- else:
- return None
+ return None
@property
def suite(self):
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/function_definition.py b/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/function_definition.py
index 384d3cf134d..52719fe68dc 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/function_definition.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/function_definition.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import symbol
from py_utils.refactor.annotated_symbol import base_symbol
@@ -23,13 +24,12 @@ class Function(base_symbol.AnnotatedSymbol):
return None
statement = compound_statement.children[0]
- if statement.type == symbol.funcdef:
+ if statement.type == symbol.funcdef or \
+ (statement.type == symbol.decorated and
+ statement.children[-1].type == symbol.funcdef):
return cls(statement.type, statement.children)
- elif (statement.type == symbol.decorated and
- statement.children[-1].type == symbol.funcdef):
- return cls(statement.type, statement.children)
- else:
- return None
+
+ return None
@property
def suite(self):
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/import_statement.py b/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/import_statement.py
index 54a3935ca05..9ebdad54077 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/import_statement.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/import_statement.py
@@ -62,8 +62,8 @@ class DottedName(base_symbol.AnnotatedSymbol):
class AsName(base_symbol.AnnotatedSymbol):
@classmethod
def Annotate(cls, symbol_type, children):
- if (symbol_type != symbol.dotted_as_name and
- symbol_type != symbol.import_as_name):
+ if symbol_type not in \
+ (symbol.dotted_as_name, symbol.import_as_name):
return None
return cls(symbol_type, children)
@@ -218,8 +218,7 @@ class ImportName(Import):
def name(self):
if self.alias:
return self.alias
- else:
- return self.path
+ return self.path
class ImportFrom(Import):
@@ -281,8 +280,7 @@ class ImportFrom(Import):
import_as_name = self._import_as_name
if import_as_name:
return import_as_name.name
- else:
- return '*'
+ return '*'
@module.setter
def module(self, value):
@@ -293,12 +291,11 @@ class ImportFrom(Import):
if value == '*':
# TODO: Implement this.
raise NotImplementedError()
+ if import_as_name:
+ import_as_name.name = value
else:
- if import_as_name:
- import_as_name.name = value
- else:
- # TODO: Implement this.
- raise NotImplementedError()
+ # TODO: Implement this.
+ raise NotImplementedError()
@property
def path(self):
@@ -313,8 +310,7 @@ class ImportFrom(Import):
import_as_name = self._import_as_name
if import_as_name:
return import_as_name.alias
- else:
- return None
+ return None
@alias.setter
def alias(self, value): # pylint: disable=arguments-differ
@@ -327,5 +323,4 @@ class ImportFrom(Import):
def name(self):
if self.alias:
return self.alias
- else:
- return self.module
+ return self.module
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/reference.py b/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/reference.py
index 493176e65a4..1077dbe448b 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/reference.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/refactor/annotated_symbol/reference.py
@@ -47,6 +47,8 @@ class Reference(base_symbol.AnnotatedSymbol):
return [cls(nodes[:i])] + nodes[i:]
def __init__(self, children):
+ # TODO(https://crbug.com/1262295): Change to super() after Python2 trybots retire.
+ # pylint: disable=super-with-arguments
super(Reference, self).__init__(-1, children)
@property
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/refactor/module.py b/chromium/third_party/catapult/common/py_utils/py_utils/refactor/module.py
index d6eae00cdb4..c01dba459dd 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/refactor/module.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/refactor/module.py
@@ -2,10 +2,11 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
from py_utils.refactor import annotated_symbol
-class Module(object):
+class Module():
def __init__(self, file_path):
self._file_path = file_path
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/refactor/offset_token.py b/chromium/third_party/catapult/common/py_utils/py_utils/refactor/offset_token.py
index deca085879a..3c2cf73ac85 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/refactor/offset_token.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/refactor/offset_token.py
@@ -20,7 +20,7 @@ def _Pairwise(iterable):
return zip(a, b)
-class OffsetToken(object):
+class OffsetToken():
"""A Python token with a relative position.
A token is represented by a type defined in Python's token module, a string
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/refactor/snippet.py b/chromium/third_party/catapult/common/py_utils/py_utils/refactor/snippet.py
index 7056abf74a0..f9fa54afa45 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/refactor/snippet.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/refactor/snippet.py
@@ -4,6 +4,7 @@
from __future__ import print_function
+from __future__ import absolute_import
import parser
import symbol
import sys
@@ -13,7 +14,7 @@ import tokenize
from py_utils.refactor import offset_token
-class Snippet(object):
+class Snippet():
"""A node in the Python parse tree.
The Python grammar is defined at:
@@ -70,7 +71,7 @@ class Snippet(object):
if not isinstance(child, snippet_type):
continue
- for attribute, value in kwargs:
+ for attribute, value in kwargs.items():
if getattr(child, attribute) != value:
break
else:
@@ -223,24 +224,23 @@ def _SnippetizeNode(node, tokens):
# Symbol.
children = tuple(_SnippetizeNode(child, tokens) for child in node[1:])
return Symbol(node_type, children)
- else:
- # Token.
- grabbed_tokens = []
- while tokens and (
- tokens[0].type == tokenize.COMMENT or tokens[0].type == tokenize.NL):
- grabbed_tokens.append(tokens.popleft())
-
- # parser has 2 NEWLINEs right before the end.
- # tokenize has 0 or 1 depending on if the file has one.
- # Create extra nodes without consuming tokens to account for this.
- if node_type == token.NEWLINE:
- for tok in tokens:
- if tok.type == token.ENDMARKER:
- return TokenSnippet(node_type, grabbed_tokens)
- if tok.type != token.DEDENT:
- break
+ # Token.
+ grabbed_tokens = []
+ while tokens and (
+ tokens[0].type == tokenize.COMMENT or tokens[0].type == tokenize.NL):
+ grabbed_tokens.append(tokens.popleft())
- assert tokens[0].type == token.OP or node_type == tokens[0].type
+ # parser has 2 NEWLINEs right before the end.
+ # tokenize has 0 or 1 depending on if the file has one.
+ # Create extra nodes without consuming tokens to account for this.
+ if node_type == token.NEWLINE:
+ for tok in tokens:
+ if tok.type == token.ENDMARKER:
+ return TokenSnippet(node_type, grabbed_tokens)
+ if tok.type != token.DEDENT:
+ break
- grabbed_tokens.append(tokens.popleft())
- return TokenSnippet(node_type, grabbed_tokens)
+ assert tokens[0].type == token.OP or node_type == tokens[0].type
+
+ grabbed_tokens.append(tokens.popleft())
+ return TokenSnippet(node_type, grabbed_tokens)
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/refactor_util/move.py b/chromium/third_party/catapult/common/py_utils/py_utils/refactor_util/move.py
index 6d0a7cb813e..12beb16c34f 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/refactor_util/move.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/refactor_util/move.py
@@ -4,6 +4,7 @@
from __future__ import print_function
+from __future__ import absolute_import
import functools
import os
import sys
@@ -40,7 +41,7 @@ def _Update(moves, module):
print('Error updating %s: %s' % (module.file_path, e), file=sys.stderr)
-class _Move(object):
+class _Move():
def __init__(self, source, target):
self._source_path = os.path.realpath(source)
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/retry_util_unittest.py b/chromium/third_party/catapult/common/py_utils/py_utils/retry_util_unittest.py
index f24577f0ea6..b28a0c8cd3b 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/retry_util_unittest.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/retry_util_unittest.py
@@ -1,6 +1,7 @@
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import unittest
import mock
@@ -76,8 +77,7 @@ class RetryOnExceptionTest(unittest.TestCase):
self.num_calls += 1
if self.num_calls < 3:
raise KeyError('oops!')
- else:
- return 'OK!'
+ return 'OK!'
# The value is returned after the expected number of calls.
self.assertEqual(Test(), 'OK!')
@@ -90,8 +90,7 @@ class RetryOnExceptionTest(unittest.TestCase):
self.num_calls += 1
if self.num_calls < 3:
raise KeyError('oops!')
- else:
- return 'OK!'
+ return 'OK!'
# We fail immediately on the first try.
with self.assertRaises(KeyError):
@@ -105,10 +104,9 @@ class RetryOnExceptionTest(unittest.TestCase):
self.num_calls += 1
if self.num_calls == 1:
raise KeyError('oops!')
- elif self.num_calls == 2:
+ if self.num_calls == 2:
raise ValueError('uh oh!')
- else:
- return 'OK!'
+ return 'OK!'
# Call eventually succeeds after enough tries.
self.assertEqual(Test(retries=5), 'OK!')
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/shell_util.py b/chromium/third_party/catapult/common/py_utils/py_utils/shell_util.py
index 6af7f8e2827..111078a181d 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/shell_util.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/shell_util.py
@@ -6,6 +6,7 @@
from __future__ import print_function
+from __future__ import absolute_import
import os as _os
import shutil as _shutil
import subprocess as _subprocess
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/slots_metaclass.py b/chromium/third_party/catapult/common/py_utils/py_utils/slots_metaclass.py
index ae36c6778d9..53227d1d2c5 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/slots_metaclass.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/slots_metaclass.py
@@ -20,8 +20,8 @@ class SlotsMetaclass(type):
add '__dict__' to its __slots__.
"""
- def __new__(mcs, name, bases, attrs):
+ def __new__(cls, name, bases, attrs):
assert '__slots__' in attrs, 'Class "%s" must define __slots__' % name
assert isinstance(attrs['__slots__'], tuple), '__slots__ must be a tuple'
- return super(SlotsMetaclass, mcs).__new__(mcs, name, bases, attrs)
+ return super(SlotsMetaclass, cls).__new__(cls, name, bases, attrs)
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/slots_metaclass_unittest.py b/chromium/third_party/catapult/common/py_utils/py_utils/slots_metaclass_unittest.py
index 702371a79a4..299a8c45e09 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/slots_metaclass_unittest.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/slots_metaclass_unittest.py
@@ -18,27 +18,20 @@ class SlotsMetaclassUnittest(unittest.TestCase):
def testSlotsMetaclass(self):
class NiceClass(six.with_metaclass(slots_metaclass.SlotsMetaclass, object)):
- __slots__ = '_nice',
+ __slots__ = ('_nice',)
def __init__(self, nice):
self._nice = nice
NiceClass(42)
- with self.assertRaises(AssertionError):
- class NaughtyClass(NiceClass):
- def __init__(self, naughty):
- super(NaughtyClass, self).__init__(42)
- self._naughty = naughty
-
- # Metaclasses are called when the class is defined, so no need to
- # instantiate it.
-
with self.assertRaises(AttributeError):
class NaughtyClass2(NiceClass):
__slots__ = ()
def __init__(self, naughty):
+ # TODO(https://crbug.com/1262295): Change to super() after Python2 trybots retire.
+ # pylint: disable=super-with-arguments
super(NaughtyClass2, self).__init__(42)
self._naughty = naughty # pylint: disable=assigning-non-slot
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/tempfile_ext.py b/chromium/third_party/catapult/common/py_utils/py_utils/tempfile_ext.py
index ba68c52b9f0..41227eb5414 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/tempfile_ext.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/tempfile_ext.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import contextlib
import os
import shutil
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/tempfile_ext_unittest.py b/chromium/third_party/catapult/common/py_utils/py_utils/tempfile_ext_unittest.py
index 76a0efd976f..194c01bcdf2 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/tempfile_ext_unittest.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/tempfile_ext_unittest.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import filecmp
import os
import shutil
@@ -37,7 +38,7 @@ class NamedTemporaryDirectoryTest(fake_filesystem_unittest.TestCase):
test_dir = '/baz'
self.fs.CreateDirectory(test_dir)
with tempfile_ext.NamedTemporaryDirectory(dir=test_dir) as d:
- self.assertEquals(test_dir, os.path.dirname(d))
+ self.assertEqual(test_dir, os.path.dirname(d))
class TemporaryFilesTest(fake_filesystem_unittest.TestCase):
@@ -50,7 +51,7 @@ class TemporaryFilesTest(fake_filesystem_unittest.TestCase):
def testNamedTemporaryFile(self):
with tempfile_ext.NamedTemporaryFile() as f:
self.assertTrue(os.path.isfile(f.name))
- f.write('<data>')
+ f.write(b'<data>')
f.close()
self.assertTrue(os.path.exists(f.name))
with open(f.name) as f2:
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/test_data/discoverable_classes/another_discover_dummyclass.py b/chromium/third_party/catapult/common/py_utils/py_utils/test_data/discoverable_classes/another_discover_dummyclass.py
index 0459ccf7148..a1deb358481 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/test_data/discoverable_classes/another_discover_dummyclass.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/test_data/discoverable_classes/another_discover_dummyclass.py
@@ -9,25 +9,28 @@
# Suppress complaints about unable to import class. The directory path is
# added at runtime by telemetry test runner.
#pylint: disable=import-error
+from __future__ import absolute_import
from discoverable_classes import discover_dummyclass
class _PrivateDummyException(discover_dummyclass.DummyException):
def __init__(self):
- super(_PrivateDummyException, self).__init__()
+ discover_dummyclass.DummyException.__init__(self)
class DummyExceptionImpl1(_PrivateDummyException):
def __init__(self):
- super(DummyExceptionImpl1, self).__init__()
+ _PrivateDummyException.__init__(self)
class DummyExceptionImpl2(_PrivateDummyException):
def __init__(self):
- super(DummyExceptionImpl2, self).__init__()
+ _PrivateDummyException.__init__(self)
class DummyExceptionWithParameterImpl1(_PrivateDummyException):
def __init__(self, parameter):
+ # TODO(https://crbug.com/1262295): Change to super() after Python2 trybots retire.
+ # pylint: disable=super-with-arguments
super(DummyExceptionWithParameterImpl1, self).__init__()
del parameter
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/test_data/discoverable_classes/discover_dummyclass.py b/chromium/third_party/catapult/common/py_utils/py_utils/test_data/discoverable_classes/discover_dummyclass.py
index 15dcb35a4d5..239651fa5bb 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/test_data/discoverable_classes/discover_dummyclass.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/test_data/discoverable_classes/discover_dummyclass.py
@@ -6,4 +6,4 @@
class DummyException(Exception):
def __init__(self):
- super(DummyException, self).__init__()
+ Exception.__init__(self)
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/test_data/discoverable_classes/parameter_discover_dummyclass.py b/chromium/third_party/catapult/common/py_utils/py_utils/test_data/discoverable_classes/parameter_discover_dummyclass.py
index c37f4a99765..1fcbf3f3088 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/test_data/discoverable_classes/parameter_discover_dummyclass.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/test_data/discoverable_classes/parameter_discover_dummyclass.py
@@ -3,9 +3,12 @@
# found in the LICENSE file.
"""A dummy exception subclass used by core/discover.py's unit tests."""
+from __future__ import absolute_import
from discoverable_classes import discover_dummyclass
class DummyExceptionWithParameterImpl2(discover_dummyclass.DummyException):
def __init__(self, parameter1, parameter2):
+ # TODO(https://crbug.com/1262295): Change to super() after Python2 trybots retire.
+ # pylint: disable=super-with-arguments
super(DummyExceptionWithParameterImpl2, self).__init__()
del parameter1, parameter2
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/ts_proxy_server.py b/chromium/third_party/catapult/common/py_utils/py_utils/ts_proxy_server.py
index b71d143de5e..5b642cdaccb 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/ts_proxy_server.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/ts_proxy_server.py
@@ -4,6 +4,8 @@
"""Start and stop tsproxy."""
+from __future__ import absolute_import
+import locale
import logging
import os
import re
@@ -11,6 +13,7 @@ import signal
import subprocess
import sys
import time
+import six
try:
import fcntl
@@ -26,7 +29,6 @@ _TSPROXY_PATH = os.path.join(
class TsProxyServerError(Exception):
"""Catch-all exception for tsProxy Server."""
- pass
def ParseTsProxyPortFromOutput(output_line):
port_re = re.compile(
@@ -36,9 +38,10 @@ def ParseTsProxyPortFromOutput(output_line):
m = port_re.match(output_line)
if m:
return int(m.group('port'))
+ return None
-class TsProxyServer(object):
+class TsProxyServer():
"""Start and stop tsproxy.
TsProxy provides basic latency, download and upload traffic shaping. This
@@ -88,9 +91,16 @@ class TsProxyServer(object):
cmd_line.append(
'--mapports=443:%s,*:%s' % (self._https_port, self._http_port))
logging.info('Tsproxy commandline: %s', cmd_line)
+ # In python3 subprocess handles encoding/decoding; this warns if it won't
+ # be UTF-8.
+ if locale.getpreferredencoding() != 'UTF-8':
+ logging.warning('Decoding will use %s instead of UTF-8',
+ locale.getpreferredencoding())
+ # In python3 universal_newlines forces subprocess to encode/decode,
+ # allowing per-line buffering.
self._proc = subprocess.Popen(
cmd_line, stdout=subprocess.PIPE, stdin=subprocess.PIPE,
- stderr=subprocess.PIPE, bufsize=1)
+ stderr=subprocess.PIPE, bufsize=1, universal_newlines=True)
self._non_blocking = False
if fcntl:
logging.info('fcntl is supported, trying to set '
@@ -109,8 +119,8 @@ class TsProxyServer(object):
err = self.StopServer()
if err:
logging.error('Error stopping WPR server:\n%s', err)
- raise TsProxyServerError(
- 'Error starting tsproxy: timed out after %s seconds' % timeout)
+ six.raise_from(TsProxyServerError(
+ 'Error starting tsproxy: timed out after %s seconds' % timeout), None)
def _IsStarted(self):
assert not self._is_running
@@ -121,7 +131,7 @@ class TsProxyServer(object):
output_line = self._ReadLineTsProxyStdout(timeout=5)
logging.debug('TsProxy output: %s', output_line)
self._port = ParseTsProxyPortFromOutput(output_line)
- return self._port != None
+ return self._port is not None
def _ReadLineTsProxyStdout(self, timeout):
def ReadSingleLine():
@@ -139,7 +149,7 @@ class TsProxyServer(object):
del retries # handled by the decorator
logging.info('Issuing command to ts_proxy_server: %s', command_string)
command_output = []
- self._proc.stdin.write('%s\n' % command_string)
+ self._proc.stdin.write(('%s\n' % command_string))
def CommandStatusIsRead():
self._proc.stdin.flush()
self._proc.stdout.flush()
@@ -152,7 +162,8 @@ class TsProxyServer(object):
logging.log(logging.DEBUG if success else logging.ERROR,
'TsProxy output:\n%s', '\n'.join(command_output))
if not success:
- raise TsProxyServerError('Failed to execute command: %s', command_string)
+ six.raise_from(TsProxyServerError('Failed to execute command: %s',
+ command_string), None)
def UpdateOutboundPorts(self, http_port, https_port, timeout=5):
assert http_port and https_port
@@ -190,17 +201,20 @@ class TsProxyServer(object):
"""Stop TsProxy Server."""
if not self._is_running:
logging.debug('Attempting to stop TsProxy server that is not running.')
- return
+ return None
if not self._proc:
- return
+ return None
try:
+ self._IssueCommand('exit', timeout=10)
py_utils.WaitFor(lambda: self._proc.poll() is not None, 10)
except py_utils.TimeoutException:
- try:
- # Use a SIGNINT so that it can do graceful cleanup
- self._proc.send_signal(signal.SIGINT)
- except ValueError:
- logging.warning('Unable to stop ts_proxy_server gracefully.\n')
+ # signal.SIGINT is not supported on Windows.
+ if not sys.platform.startswith('win'):
+ try:
+ # Use a SIGNINT so that it can do graceful cleanup
+ self._proc.send_signal(signal.SIGINT)
+ except ValueError:
+ logging.warning('Unable to stop ts_proxy_server gracefully.\n')
self._proc.terminate()
_, err = self._proc.communicate()
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/ts_proxy_server_unittest.py b/chromium/third_party/catapult/common/py_utils/py_utils/ts_proxy_server_unittest.py
index 4bb75c8b103..cbc398f9f03 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/ts_proxy_server_unittest.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/ts_proxy_server_unittest.py
@@ -2,21 +2,22 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import unittest
from py_utils import ts_proxy_server
class TsProxyServerTest(unittest.TestCase):
def testParseTsProxyPort(self):
- self.assertEquals(
+ self.assertEqual(
ts_proxy_server.ParseTsProxyPortFromOutput(
'Started Socks5 proxy server on 127.0.0.1:54430 \n'),
54430)
- self.assertEquals(
+ self.assertEqual(
ts_proxy_server.ParseTsProxyPortFromOutput(
'Started Socks5 proxy server on foo.bar.com:430 \n'),
430)
- self.assertEquals(
+ self.assertEqual(
ts_proxy_server.ParseTsProxyPortFromOutput(
'Failed to start sock5 proxy.'),
None)
@@ -44,13 +45,13 @@ class TsProxyServerTest(unittest.TestCase):
server.UpdateTrafficSettings(download_bandwidth_kbps=5000)
server.UpdateTrafficSettings(upload_bandwidth_kbps=2000)
- self.assertEquals(server._rtt, 100)
- self.assertEquals(server._inbkps, 5000)
- self.assertEquals(server._outkbps, 2000)
+ self.assertEqual(server._rtt, 100)
+ self.assertEqual(server._inbkps, 5000)
+ self.assertEqual(server._outkbps, 2000)
server.UpdateTrafficSettings(
round_trip_latency_ms=200, download_bandwidth_kbps=500,
upload_bandwidth_kbps=2000)
- self.assertEquals(server._rtt, 200)
- self.assertEquals(server._inbkps, 500)
- self.assertEquals(server._outkbps, 2000)
+ self.assertEqual(server._rtt, 200)
+ self.assertEqual(server._inbkps, 500)
+ self.assertEqual(server._outkbps, 2000)
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/webpagereplay_go_server.py b/chromium/third_party/catapult/common/py_utils/py_utils/webpagereplay_go_server.py
index 95e44954c73..f9860c44a25 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/webpagereplay_go_server.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/webpagereplay_go_server.py
@@ -4,6 +4,7 @@
"""Start and stop Web Page Replay."""
+from __future__ import print_function
import logging
import os
import re
@@ -11,7 +12,7 @@ import signal
import subprocess
import sys
import tempfile
-import urllib
+import six.moves.urllib.request # pylint: disable=import-error
import py_utils
from py_utils import atexit_with_log
@@ -35,8 +36,6 @@ DISABLE_FUZZY_URL_MATCHING = '--disable-fuzzy-url-matching'
class ReplayError(Exception):
"""Catch-all exception for the module."""
- pass
-
class ReplayNotFoundError(ReplayError):
def __init__(self, label, path):
@@ -49,6 +48,8 @@ class ReplayNotFoundError(ReplayError):
path: A string of the path in this error.
"""
+ # TODO(https://crbug.com/1262295): Change to super() after Python2 trybots retire.
+ # pylint: disable=super-with-arguments
super(ReplayNotFoundError, self).__init__()
self.args = (label, path)
@@ -61,7 +62,7 @@ class ReplayNotStartedError(ReplayError):
pass
-class ReplayServer(object):
+class ReplayServer():
"""Start and Stop Web Page Replay.
Web Page Replay is a proxy that can record and "replay" web pages with
@@ -136,9 +137,10 @@ class ReplayServer(object):
cur_cwd = os.getcwd()
os.chdir(go_folder)
try:
- print subprocess.check_output(['go', 'build', os.path.join(go_folder, 'wpr.go')])
+ print(subprocess.check_output(
+ ['go', 'build', os.path.join(go_folder, 'wpr.go')]))
except subprocess.CalledProcessError:
- exit(1)
+ sys.exit(1)
os.chdir(cur_cwd)
return os.path.join(go_folder, 'wpr')
@@ -307,6 +309,7 @@ class ReplayServer(object):
logging.info('Starting Web-Page-Replay: %s', self._cmd_line)
self._CreateTempLogFilePath()
with self._OpenLogFile() as log_fh:
+ # pylint: disable=subprocess-popen-preexec-fn
self.replay_process = subprocess.Popen(
self._cmd_line, stdout=log_fh, stderr=subprocess.STDOUT,
preexec_fn=(_ResetInterruptHandler if is_posix else None))
@@ -317,9 +320,12 @@ class ReplayServer(object):
logging.info('WPR ports: %s', self._started_ports)
atexit_with_log.Register(self.StopServer)
return dict(self._started_ports)
- except Exception:
+ except Exception: # pylint: disable=broad-except
self.StopServer(logging.ERROR)
- raise ReplayNotStartedError('Web Page Replay failed to start.')
+ six.raise_from(ReplayNotStartedError('Web Page Replay failed to start.'),
+ None)
+
+ return None
def _IsReplayProcessStarted(self):
if not self.replay_process:
@@ -383,19 +389,22 @@ class ReplayServer(object):
def _CleanUpTempLogFilePath(self, log_level):
if not self._temp_log_file_path:
return ''
- if logging.getLogger('').isEnabledFor(log_level) or USE_LOCAL_WPR in self._replay_options:
+ if logging.getLogger('').isEnabledFor(log_level) or USE_LOCAL_WPR \
+ in self._replay_options:
with open(self._temp_log_file_path, 'r') as f:
wpr_log_output = f.read()
- output = ('************************** WPR LOG *****************************\n' +
+ asterisk_str = '**************************'
+ output = (asterisk_str + ' WPR LOG ' + asterisk_str + '\n' +
'\n'.join(wpr_log_output.split('\n')) +
- '************************** END OF WPR LOG **********************')
+ asterisk_str + ' END OF WPR LOG ' + asterisk_str)
if logging.getLogger('').isEnabledFor(log_level):
logging.log(log_level, output)
else:
- print output
+ print(output)
os.remove(self._temp_log_file_path)
self._temp_log_file_path = None
+ return None
def __enter__(self):
"""Add support for with-statement."""
@@ -420,7 +429,9 @@ class ReplayServer(object):
"""
url = '%s://%s:%s/%s' % (
protocol, self._replay_host, self._started_ports[protocol], url_path)
- return urllib.urlopen(url, proxies={})
+
+ # pylint: disable=no-member
+ return six.moves.urllib.request.FancyURLopener({}).open(url)
def _ResetInterruptHandler():
"""Reset the interrupt handler back to the default.
diff --git a/chromium/third_party/catapult/common/py_utils/py_utils/xvfb.py b/chromium/third_party/catapult/common/py_utils/py_utils/xvfb.py
index 06ce7ddedc7..3f2753f2a44 100644
--- a/chromium/third_party/catapult/common/py_utils/py_utils/xvfb.py
+++ b/chromium/third_party/catapult/common/py_utils/py_utils/xvfb.py
@@ -2,6 +2,7 @@
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import os
import logging
import subprocess
diff --git a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/__init__.py b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/__init__.py
index f3a4bd1bb15..087a104ef64 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/__init__.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/__init__.py
@@ -7,5 +7,6 @@
This module implements trace-viewer's component model.
"""
+from __future__ import absolute_import
from py_vulcanize.generate import * # pylint: disable=wildcard-import
from py_vulcanize.project import Project
diff --git a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/fake_fs.py b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/fake_fs.py
index 40b01bb5ffb..f4e3512b395 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/fake_fs.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/fake_fs.py
@@ -9,10 +9,13 @@ from __future__ import print_function
import codecs
import collections
import os
+import six
import sys
-import six
+from io import BytesIO
+if six.PY3:
+ import builtins
class WithableStringIO(six.StringIO):
@@ -22,6 +25,13 @@ class WithableStringIO(six.StringIO):
def __exit__(self, *args):
pass
+class WithableBytesIO(BytesIO):
+
+ def __enter__(self, *args):
+ return self
+
+ def __exit__(self, *args):
+ pass
class FakeFS(object):
@@ -33,7 +43,11 @@ class FakeFS(object):
self._bound = False
self._real_codecs_open = codecs.open
- self._real_open = sys.modules['__builtin__'].open
+ if six.PY3:
+ self._real_open = builtins.open
+ else:
+ self._real_open = sys.modules['__builtin__'].open
+
self._real_abspath = os.path.abspath
self._real_exists = os.path.exists
self._real_walk = os.walk
@@ -49,7 +63,10 @@ class FakeFS(object):
def Bind(self):
assert not self._bound
codecs.open = self._FakeCodecsOpen
- sys.modules['__builtin__'].open = self._FakeOpen
+ if six.PY3:
+ builtins.open = self._FakeOpen
+ else:
+ sys.modules['__builtin__'].open = self._FakeOpen
os.path.abspath = self._FakeAbspath
os.path.exists = self._FakeExists
os.walk = self._FakeWalk
@@ -59,7 +76,10 @@ class FakeFS(object):
def Unbind(self):
assert self._bound
codecs.open = self._real_codecs_open
- sys.modules['__builtin__'].open = self._real_open
+ if six.PY3:
+ builtins.open = self._real_open
+ else:
+ sys.modules['__builtin__'].open = self._real_open
os.path.abspath = self._real_abspath
os.path.exists = self._real_exists
os.walk = self._real_walk
@@ -77,7 +97,11 @@ class FakeFS(object):
if mode == 'r' or mode == 'rU' or mode == 'rb':
if path not in self._file_contents:
return self._real_open(path, mode)
- return WithableStringIO(self._file_contents[path])
+
+ if mode == 'rb':
+ return WithableBytesIO(self._file_contents[path])
+ else:
+ return WithableStringIO(self._file_contents[path])
raise NotImplementedError()
@@ -88,7 +112,11 @@ class FakeFS(object):
if mode == 'r' or mode == 'rU' or mode == 'rb':
if path not in self._file_contents:
return self._real_open(path, mode)
- return WithableStringIO(self._file_contents[path])
+
+ if mode == 'rb':
+ return WithableBytesIO(self._file_contents[path])
+ else:
+ return WithableStringIO(self._file_contents[path])
raise NotImplementedError()
diff --git a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/fake_fs_unittest.py b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/fake_fs_unittest.py
index 7e225f595c1..b8516f71366 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/fake_fs_unittest.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/fake_fs_unittest.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import os
import unittest
@@ -49,4 +50,5 @@ class FakeFSUnittest(unittest.TestCase):
r = next(gen)
self.assertEquals((os.path.normpath('/x/w2/w3'), [], ['z3.txt']), r)
- self.assertRaises(StopIteration, gen.next)
+ with self.assertRaises(StopIteration):
+ next(gen)
diff --git a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/generate.py b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/generate.py
index 8af373102f6..d8897f69445 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/generate.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/generate.py
@@ -83,7 +83,7 @@ def _MinifyJS(input_js):
with tempfile.NamedTemporaryFile() as _:
args = [
- 'python',
+ sys.executable,
rjsmin_path
]
p = subprocess.Popen(args,
@@ -94,7 +94,7 @@ def _MinifyJS(input_js):
errorcode = p.wait()
if errorcode != 0:
sys.stderr.write('rJSmin exited with error code %d' % errorcode)
- sys.stderr.write(res[1])
+ sys.stderr.write(res[1].decode('utf-8'))
raise Exception('Failed to minify, omgah')
return res[0].decode('utf-8')
@@ -203,18 +203,18 @@ def _MinifyCSS(css_text):
os.path.join(py_vulcanize_path, 'third_party', 'rcssmin', 'rcssmin.py'))
with tempfile.NamedTemporaryFile() as _:
- rcssmin_args = ['python', rcssmin_path]
+ rcssmin_args = [sys.executable, rcssmin_path]
p = subprocess.Popen(rcssmin_args,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
- res = p.communicate(input=css_text)
+ res = p.communicate(input=css_text.encode('utf-8'))
errorcode = p.wait()
if errorcode != 0:
sys.stderr.write('rCSSmin exited with error code %d' % errorcode)
- sys.stderr.write(res[1])
+ sys.stderr.write(res[1].decode('utf-8'))
raise Exception('Failed to generate css for %s.' % css_text)
- return res[0]
+ return res[0].decode('utf-8')
def GenerateStandaloneHTMLAsString(*args, **kwargs):
diff --git a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/generate_unittest.py b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/generate_unittest.py
index 1e83cb48c21..942df9d75f0 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/generate_unittest.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/generate_unittest.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import os
import unittest
diff --git a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/html_generation_controller.py b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/html_generation_controller.py
index c804fe8ca3e..991652cc1f7 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/html_generation_controller.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/html_generation_controller.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import os
import re
from py_vulcanize import style_sheet
diff --git a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/html_module.py b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/html_module.py
index 5e1c7541c53..1cc53f4bf45 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/html_module.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/html_module.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import os
import re
diff --git a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/html_module_unittest.py b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/html_module_unittest.py
index e8438f4db23..b6d9f93a5ee 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/html_module_unittest.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/html_module_unittest.py
@@ -5,6 +5,7 @@
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
+from io import BytesIO
import os
import unittest
@@ -18,6 +19,8 @@ from py_vulcanize import project as project_module
from py_vulcanize import resource
from py_vulcanize import resource_loader as resource_loader
import six
+if six.PY3:
+ import functools
class ResourceWithFakeContents(resource.Resource):
@@ -56,7 +59,10 @@ class FakeLoader(object):
return None
# Sort by length. Longest match wins.
- candidate_paths.sort(lambda x, y: len(x) - len(y))
+ if six.PY3:
+ sorted(candidate_paths, key=functools.cmp_to_key(lambda x, y: len(x) - len(y)), reverse=True)
+ else:
+ candidate_paths.sort(lambda x, y: len(x) - len(y))
longest_candidate = candidate_paths[-1]
return ResourceWithFakeContents(
@@ -300,7 +306,7 @@ console.log('/raw/raw_script.js was written');
}
</style>
"""
- file_contents[os.path.normpath('/tmp/a/something.jpg')] = 'jpgdata'
+ file_contents[os.path.normpath('/tmp/a/something.jpg')] = b'jpgdata'
with fake_fs.FakeFS(file_contents):
project = project_module.Project([
os.path.normpath('/py_vulcanize/'), os.path.normpath('/tmp/')])
diff --git a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/js_utils_unittest.py b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/js_utils_unittest.py
index cb8025c97db..359eec4e773 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/js_utils_unittest.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/js_utils_unittest.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import unittest
from py_vulcanize import js_utils
diff --git a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/module.py b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/module.py
index bebf1b4659b..d27f350f7e5 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/module.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/module.py
@@ -20,7 +20,7 @@ import inspect
import os
from py_vulcanize import js_utils
-#import six
+import six
class DepsException(Exception):
@@ -97,7 +97,7 @@ class Module(object):
"""
def __init__(self, loader, name, resource, load_resource=True):
- #assert isinstance(name, six.string_types), 'Got %s instead' % repr(name)
+ assert isinstance(name, six.string_types), 'Got %s instead' % repr(name)
global _next_module_id
self._id = _next_module_id
diff --git a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/module_unittest.py b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/module_unittest.py
index ed92db35362..c3f500d7b6e 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/module_unittest.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/module_unittest.py
@@ -5,6 +5,7 @@
"""Tests for the module module, which contains Module and related classes."""
+from __future__ import absolute_import
import os
import unittest
diff --git a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/parse_html_deps.py b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/parse_html_deps.py
index 441edc5ed0d..5fee1774251 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/parse_html_deps.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/parse_html_deps.py
@@ -8,11 +8,13 @@ from __future__ import print_function
import os
import sys
+import warnings
from py_vulcanize import html_generation_controller
from py_vulcanize import js_utils
from py_vulcanize import module
from py_vulcanize import strip_js_comments
+import six
def _AddToPathIfNeeded(path):
@@ -24,19 +26,33 @@ def _InitBeautifulSoup():
catapult_path = os.path.abspath(
os.path.join(os.path.dirname(__file__),
os.path.pardir, os.path.pardir, os.path.pardir))
- bs_path = os.path.join(catapult_path, 'third_party', 'beautifulsoup4')
+ if six.PY3:
+ # Filter out warnings related to soupsieve from beautifulsoup.
+ # We do not need it and it generates unnecessary warnings during build.
+ warnings.filterwarnings('ignore', message='.*soupsieve.*',
+ category=UserWarning, module='bs4')
+ bs_path = os.path.join(catapult_path, 'third_party', 'beautifulsoup4-4.9.3', 'py3k')
+ else:
+ bs_path = os.path.join(catapult_path, 'third_party', 'beautifulsoup4')
_AddToPathIfNeeded(bs_path)
- html5lib_path = os.path.join(catapult_path, 'third_party', 'html5lib-python')
+ if six.PY3:
+ html5lib_path = os.path.join(catapult_path, 'third_party', 'html5lib-1.1')
+ else:
+ html5lib_path = os.path.join(catapult_path, 'third_party', 'html5lib-python')
_AddToPathIfNeeded(html5lib_path)
+ if six.PY3:
+ webencodings_path = os.path.join(
+ catapult_path, 'third_party', 'webencodings-0.5.1')
+ _AddToPathIfNeeded(webencodings_path)
+
six_path = os.path.join(catapult_path, 'third_party', 'six')
_AddToPathIfNeeded(six_path)
_InitBeautifulSoup()
import bs4
-import six
class Script(object):
diff --git a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/parse_html_deps_unittest.py b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/parse_html_deps_unittest.py
index 2a30a29b059..5d2b26496d1 100755
--- a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/parse_html_deps_unittest.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/parse_html_deps_unittest.py
@@ -3,6 +3,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import re
import unittest
@@ -176,7 +177,9 @@ class ParseTests(unittest.TestCase):
</template>
</polymer-element>"""
parser = parse_html_deps.HTMLModuleParser()
- self.assertRaises(lambda: parser.Parse(html))
+ with self.assertRaises(Exception):
+ parsed = parser.Parse(html)
+ parsed.html_contents_without_links_and_script()
def test_nested_templates(self):
orig_html = """<template>
diff --git a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/resource.py b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/resource.py
index 853dff94437..b188e731038 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/resource.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/resource.py
@@ -4,6 +4,7 @@
"""A Resource is a file and its various associated canonical names."""
+from __future__ import absolute_import
import codecs
import os
diff --git a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/resource_loader.py b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/resource_loader.py
index 015adaa6608..853069515c3 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/resource_loader.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/resource_loader.py
@@ -4,8 +4,13 @@
"""ResourceFinder is a helper class for finding resources given their name."""
+from __future__ import absolute_import
import codecs
import os
+import six
+import sys
+if six.PY3:
+ import functools
from py_vulcanize import module
from py_vulcanize import style_sheet as style_sheet_module
@@ -59,7 +64,10 @@ class ResourceLoader(object):
return None
# Sort by length. Longest match wins.
- candidate_paths.sort(lambda x, y: len(x) - len(y))
+ if six.PY3:
+ sorted(candidate_paths, key=functools.cmp_to_key(lambda x, y: len(x) - len(y)), reverse=True)
+ else:
+ candidate_paths.sort(lambda x, y: len(x) - len(y))
longest_candidate = candidate_paths[-1]
return resource_module.Resource(longest_candidate, absolute_path, binary)
diff --git a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/resource_unittest.py b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/resource_unittest.py
index 4da23556f24..ef1864094cf 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/resource_unittest.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/resource_unittest.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import os
import unittest
diff --git a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/strip_js_comments.py b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/strip_js_comments.py
index 73c3a885f3b..a3ce8779e11 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/strip_js_comments.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/strip_js_comments.py
@@ -4,6 +4,7 @@
"""Utility function for stripping comments out of JavaScript source code."""
+from __future__ import absolute_import
import re
diff --git a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/strip_js_comments_unittest.py b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/strip_js_comments_unittest.py
index 685cb824a24..4cdc2d01db8 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/strip_js_comments_unittest.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/strip_js_comments_unittest.py
@@ -5,6 +5,7 @@
"""Tests for strip_js_comments module."""
+from __future__ import absolute_import
import unittest
from py_vulcanize import strip_js_comments
diff --git a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/style_sheet.py b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/style_sheet.py
index 5338762588e..2ffc4ccfc3d 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/style_sheet.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/style_sheet.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import base64
import os
import re
@@ -56,7 +57,7 @@ class ParsedStyleSheet(object):
ext = os.path.splitext(image.absolute_path)[1]
data = base64.standard_b64encode(image.contents)
- return 'url(data:image/%s;base64,%s)' % (ext[1:], data)
+ return 'url(data:image/%s;base64,%s)' % (ext[1:], data.decode('utf-8'))
# I'm assuming we only have url()'s associated with images
return re.sub('url\((?P<quote>"|\'|)(?P<url>[^"\'()]*)(?P=quote)\)',
diff --git a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/style_sheet_unittest.py b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/style_sheet_unittest.py
index 4ebc71d5651..89bc0f473ad 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/style_sheet_unittest.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/py_vulcanize/style_sheet_unittest.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import base64
import os
import unittest
@@ -21,7 +22,7 @@ class StyleSheetUnittest(unittest.TestCase):
background-image: url(../images/bar.jpeg);
}
""")
- fs.AddFile('/src/images/bar.jpeg', 'hello world')
+ fs.AddFile('/src/images/bar.jpeg', b'hello world')
with fs:
project = project_module.Project([os.path.normpath('/src/')])
loader = resource_loader.ResourceLoader(project)
@@ -38,7 +39,7 @@ class StyleSheetUnittest(unittest.TestCase):
.x .y {
background-image: url(data:image/jpeg;base64,%s);
}
-""" % base64.standard_b64encode('hello world'), inlined)
+""" % base64.standard_b64encode(b'hello world').decode('utf-8'), inlined)
def testURLResolveFails(self):
fs = fake_fs.FakeFS()
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/shell.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/shell.py
index 4eafb9c8647..5976174b43d 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/shell.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/shell.py
@@ -21,8 +21,9 @@
Shell utilities.
"""
-from __future__ import generators
+from __future__ import generators
+from __future__ import print_function
__author__ = u"Andr\xe9 Malo"
__docformat__ = "restructuredtext en"
@@ -346,7 +347,7 @@ def spawn(*argv, **kwargs):
echo = kwargs.get('echo')
if echo:
- print ' '.join(argv)
+ print(' '.join(argv))
filepipe = kwargs.get('filepipe')
if filepipe:
return _filepipespawn(
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/util.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/util.py
index 5c05fac6e4c..9b997973524 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/util.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/util.py
@@ -21,6 +21,7 @@
Setup utilities.
"""
+from __future__ import print_function
__author__ = u"Andr\xe9 Malo"
__docformat__ = "restructuredtext en"
@@ -29,7 +30,7 @@ try:
except ImportError:
class log(object):
def info(self, value):
- print value
+ print(value)
def debug(self, value):
pass
log = log()
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/shell.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/shell.py
index 91f2ebc5b40..5861ed25320 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/shell.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/shell.py
@@ -21,6 +21,7 @@
Shell utilities.
"""
+from __future__ import print_function
__author__ = "Andr\xe9 Malo"
__docformat__ = "restructuredtext en"
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/main.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/main.py
index 078150629f2..2b45abdebb5 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/main.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/main.py
@@ -34,6 +34,7 @@ Usage::
-p file File to write the benchmark results in (pickled)
"""
+from __future__ import print_function
if __doc__:
__doc__ = __doc__.encode('ascii').decode('unicode_escape')
__author__ = r"Andr\xe9 Malo".encode('ascii').decode('unicode_escape')
@@ -199,20 +200,20 @@ def main(argv=None):
opts, args = _getopt.getopt(argv, "hc:p:", ["help"])
except getopt.GetoptError:
e = _sys.exc_info()[0](_sys.exc_info()[1])
- print >> _sys.stderr, "%s\nTry %s -mbench.main --help" % (
- e,
- _os.path.basename(_sys.executable),
- )
+ print(
+ "%s\nTry %s -mbench.main --help" % (
+ e,
+ _os.path.basename(_sys.executable),
+ ), file=_sys.stderr)
_sys.exit(2)
count, pickle = 10, None
for key, value in opts:
if key in ("-h", "--help"):
- print >> _sys.stderr, (
+ print(
"%s -mbench.main [-c count] [-p file] cssfile ..." % (
_os.path.basename(_sys.executable),
- )
- )
+ ), file=_sys.stderr)
_sys.exit(0)
elif key == '-c':
count = int(value)
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/write.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/write.py
index 939e11d5910..81b82640e34 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/write.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/write.py
@@ -34,6 +34,7 @@ Usage::
-t table Table file to write to (like docs/_userdoc/benchmark.txt).
"""
+from __future__ import print_function
if __doc__:
__doc__ = __doc__.encode('ascii').decode('unicode_escape')
__author__ = r"Andr\xe9 Malo".encode('ascii').decode('unicode_escape')
@@ -302,20 +303,20 @@ def main(argv=None):
opts, args = _getopt.getopt(argv, "hp:t:", ["help"])
except getopt.GetoptError:
e = _sys.exc_info()[0](_sys.exc_info()[1])
- print >> _sys.stderr, "%s\nTry %s -mbench.write --help" % (
- e,
- _os.path.basename(_sys.executable),
- )
+ print(
+ "%s\nTry %s -mbench.write --help" % (
+ e,
+ _os.path.basename(_sys.executable),
+ ), file=_sys.stderr)
_sys.exit(2)
plain, table = None, None
for key, value in opts:
if key in ("-h", "--help"):
- print >> _sys.stderr, (
+ print(
"%s -mbench.write [-p plain] [-t table] <pickled" % (
_os.path.basename(_sys.executable),
- )
- )
+ ), file=_sys.stderr)
_sys.exit(0)
elif key == '-p':
plain = str(value)
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/_setup/py2/shell.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/_setup/py2/shell.py
index 4eafb9c8647..fee746809b4 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/_setup/py2/shell.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/_setup/py2/shell.py
@@ -23,6 +23,7 @@ Shell utilities.
"""
from __future__ import generators
+from __future__ import print_function
__author__ = u"Andr\xe9 Malo"
__docformat__ = "restructuredtext en"
@@ -346,7 +347,7 @@ def spawn(*argv, **kwargs):
echo = kwargs.get('echo')
if echo:
- print ' '.join(argv)
+ print(' '.join(argv))
filepipe = kwargs.get('filepipe')
if filepipe:
return _filepipespawn(
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/_setup/py2/util.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/_setup/py2/util.py
index 5c05fac6e4c..9b997973524 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/_setup/py2/util.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/_setup/py2/util.py
@@ -21,6 +21,7 @@
Setup utilities.
"""
+from __future__ import print_function
__author__ = u"Andr\xe9 Malo"
__docformat__ = "restructuredtext en"
@@ -29,7 +30,7 @@ try:
except ImportError:
class log(object):
def info(self, value):
- print value
+ print(value)
def debug(self, value):
pass
log = log()
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/_setup/py3/shell.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/_setup/py3/shell.py
index 91f2ebc5b40..5861ed25320 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/_setup/py3/shell.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/_setup/py3/shell.py
@@ -21,6 +21,7 @@
Shell utilities.
"""
+from __future__ import print_function
__author__ = "Andr\xe9 Malo"
__docformat__ = "restructuredtext en"
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/bench/main.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/bench/main.py
index c43810594fa..76d495142f5 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/bench/main.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/bench/main.py
@@ -34,6 +34,7 @@ Usage::
-p file File to write the benchmark results in (pickled)
"""
+from __future__ import print_function
if __doc__:
__doc__ = __doc__.encode('ascii').decode('unicode_escape')
__author__ = r"Andr\xe9 Malo".encode('ascii').decode('unicode_escape')
@@ -197,20 +198,20 @@ def main(argv=None):
opts, args = _getopt.getopt(argv, "hc:p:", ["help"])
except getopt.GetoptError:
e = _sys.exc_info()[0](_sys.exc_info()[1])
- print >> _sys.stderr, "%s\nTry %s -mbench.main --help" % (
- e,
- _os.path.basename(_sys.executable),
- )
+ print(
+ "%s\nTry %s -mbench.main --help" % (
+ e,
+ _os.path.basename(_sys.executable),
+ ), file=_sys.stderr)
_sys.exit(2)
count, pickle = 10, None
for key, value in opts:
if key in ("-h", "--help"):
- print >> _sys.stderr, (
+ print(
"%s -mbench.main [-c count] [-p file] cssfile ..." % (
_os.path.basename(_sys.executable),
- )
- )
+ ), file=_sys.stderr)
_sys.exit(0)
elif key == '-c':
count = int(value)
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/bench/write.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/bench/write.py
index e91c3d073b1..e9e97571d26 100644
--- a/chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/bench/write.py
+++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rjsmin/bench/write.py
@@ -34,6 +34,7 @@ Usage::
-t table Table file to write to (like docs/_userdoc/benchmark.txt).
"""
+from __future__ import print_function
if __doc__:
__doc__ = __doc__.encode('ascii').decode('unicode_escape')
__author__ = r"Andr\xe9 Malo".encode('ascii').decode('unicode_escape')
@@ -303,20 +304,20 @@ def main(argv=None):
opts, args = _getopt.getopt(argv, "hp:t:", ["help"])
except getopt.GetoptError:
e = _sys.exc_info()[0](_sys.exc_info()[1])
- print >> _sys.stderr, "%s\nTry %s -mbench.write --help" % (
- e,
- _os.path.basename(_sys.executable),
- )
+ print(
+ "%s\nTry %s -mbench.write --help" % (
+ e,
+ _os.path.basename(_sys.executable),
+ ), file=_sys.stderr)
_sys.exit(2)
plain, table = None, None
for key, value in opts:
if key in ("-h", "--help"):
- print >> _sys.stderr, (
+ print(
"%s -mbench.write [-p plain] [-t table] <pickled" % (
_os.path.basename(_sys.executable),
- )
- )
+ ), file=_sys.stderr)
_sys.exit(0)
elif key == '-p':
plain = str(value)
diff --git a/chromium/third_party/catapult/devil/BUILD.gn b/chromium/third_party/catapult/devil/BUILD.gn
index cf1255d6259..8ae170e8cb3 100644
--- a/chromium/third_party/catapult/devil/BUILD.gn
+++ b/chromium/third_party/catapult/devil/BUILD.gn
@@ -5,11 +5,10 @@
group("devil") {
testonly = true
deps = []
- data_deps = [
- "../third_party/gsutil",
- ]
+ data_deps = [ "../third_party/gsutil" ]
data = [
"devil/",
+ "bin/deps/",
]
if (is_android) {
@@ -26,7 +25,7 @@ if (is_android) {
import("//testing/android/empty_apk/empty_apk.gni")
empty_apk("empty_system_webview_apk") {
- package_name = "com.android.webview"
+ package_name = "com.google.android.webview"
apk_name = "EmptySystemWebView"
}
}
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/COPYING.txt b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/COPYING.txt
new file mode 100644
index 00000000000..fb6ae69cdf5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/COPYING.txt
@@ -0,0 +1,27 @@
+Beautiful Soup is made available under the MIT license:
+
+ Copyright (c) 2004-2017 Leonard Richardson
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+
+Beautiful Soup incorporates code from the html5lib library, which is
+also made available under the MIT license. Copyright (c) 2006-2013
+James Graham and other contributors
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/LICENSE b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/LICENSE
new file mode 100644
index 00000000000..4c068bab272
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/LICENSE
@@ -0,0 +1,30 @@
+Beautiful Soup is made available under the MIT license:
+
+ Copyright (c) 2004-2019 Leonard Richardson
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+
+Beautiful Soup incorporates code from the html5lib library, which is
+also made available under the MIT license. Copyright (c) 2006-2013
+James Graham and other contributors
+
+Beautiful Soup depends on the soupsieve library, which is also made
+available under the MIT license. Copyright (c) 2018 Isaac Muse
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/MANIFEST.in b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/MANIFEST.in
new file mode 100644
index 00000000000..33821b975af
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/MANIFEST.in
@@ -0,0 +1,10 @@
+include test-all-versions
+include convert-py3k
+include LICENSE
+include *.txt
+include doc*/Makefile
+include doc*/source/*.py
+include doc*/source/*.rst
+include doc*/source/*.jpg
+include scripts/*.py
+include scripts/*.txt
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/NEWS.txt b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/NEWS.txt
new file mode 100644
index 00000000000..625bb34c42b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/NEWS.txt
@@ -0,0 +1,1547 @@
+= 4.9.3 (20201003)
+
+* Implemented a significant performance optimization to the process of
+ searching the parse tree. Patch by Morotti. [bug=1898212]
+
+= 4.9.2 (20200926)
+
+* Fixed a bug that caused too many tags to be popped from the tag
+ stack during tree building, when encountering a closing tag that had
+ no matching opening tag. [bug=1880420]
+
+* Fixed a bug that inconsistently moved elements over when passing
+ a Tag, rather than a list, into Tag.extend(). [bug=1885710]
+
+* Specify the soupsieve dependency in a way that complies with
+ PEP 508. Patch by Mike Nerone. [bug=1893696]
+
+* Change the signatures for BeautifulSoup.insert_before and insert_after
+ (which are not implemented) to match PageElement.insert_before and
+ insert_after, quieting warnings in some IDEs. [bug=1897120]
+
+= 4.9.1 (20200517)
+
+* Added a keyword argument 'on_duplicate_attribute' to the
+ BeautifulSoupHTMLParser constructor (used by the html.parser tree
+ builder) which lets you customize the handling of markup that
+ contains the same attribute more than once, as in:
+ <a href="url1" href="url2"> [bug=1878209]
+
+* Added a distinct subclass, GuessedAtParserWarning, for the warning
+ issued when BeautifulSoup is instantiated without a parser being
+ specified. [bug=1873787]
+
+* Added a distinct subclass, MarkupResemblesLocatorWarning, for the
+ warning issued when BeautifulSoup is instantiated with 'markup' that
+ actually seems to be a URL or the path to a file on
+ disk. [bug=1873787]
+
+* The new NavigableString subclasses (Stylesheet, Script, and
+ TemplateString) can now be imported directly from the bs4 package.
+
+* If you encode a document with a Python-specific encoding like
+ 'unicode_escape', that encoding is no longer mentioned in the final
+ XML or HTML document. Instead, encoding information is omitted or
+ left blank. [bug=1874955]
+
+* Fixed test failures when run against soupselect 2.0. Patch by Tomáš
+ Chvátal. [bug=1872279]
+
+= 4.9.0 (20200405)
+
+* Added PageElement.decomposed, a new property which lets you
+ check whether you've already called decompose() on a Tag or
+ NavigableString.
+
+* Embedded CSS and Javascript is now stored in distinct Stylesheet and
+ Script tags, which are ignored by methods like get_text() since most
+ people don't consider this sort of content to be 'text'. This
+ feature is not supported by the html5lib treebuilder. [bug=1868861]
+
+* Added a Russian translation by 'authoress' to the repository.
+
+* Fixed an unhandled exception when formatting a Tag that had been
+ decomposed.[bug=1857767]
+
+* Fixed a bug that happened when passing a Unicode filename containing
+ non-ASCII characters as markup into Beautiful Soup, on a system that
+ allows Unicode filenames. [bug=1866717]
+
+* Added a performance optimization to PageElement.extract(). Patch by
+ Arthur Darcet.
+
+= 4.8.2 (20191224)
+
+* Added Python docstrings to all public methods of the most commonly
+ used classes.
+
+* Added a Chinese translation by Deron Wang and a Brazilian Portuguese
+ translation by Cezar Peixeiro to the repository.
+
+* Fixed two deprecation warnings. Patches by Colin
+ Watson and Nicholas Neumann. [bug=1847592] [bug=1855301]
+
+* The html.parser tree builder now correctly handles DOCTYPEs that are
+ not uppercase. [bug=1848401]
+
+* PageElement.select() now returns a ResultSet rather than a regular
+ list, making it consistent with methods like find_all().
+
+= 4.8.1 (20191006)
+
+* When the html.parser or html5lib parsers are in use, Beautiful Soup
+ will, by default, record the position in the original document where
+ each tag was encountered. This includes line number (Tag.sourceline)
+ and position within a line (Tag.sourcepos). Based on code by Chris
+ Mayo. [bug=1742921]
+
+* When instantiating a BeautifulSoup object, it's now possible to
+ provide a dictionary ('element_classes') of the classes you'd like to be
+ instantiated instead of Tag, NavigableString, etc.
+
+* Fixed the definition of the default XML namespace when using
+ lxml 4.4. Patch by Isaac Muse. [bug=1840141]
+
+* Fixed a crash when pretty-printing tags that were not created
+ during initial parsing. [bug=1838903]
+
+* Copying a Tag preserves information that was originally obtained from
+ the TreeBuilder used to build the original Tag. [bug=1838903]
+
+* Raise an explanatory exception when the underlying parser
+ completely rejects the incoming markup. [bug=1838877]
+
+* Avoid a crash when trying to detect the declared encoding of a
+ Unicode document. [bug=1838877]
+
+* Avoid a crash when unpickling certain parse trees generated
+ using html5lib on Python 3. [bug=1843545]
+
+= 4.8.0 (20190720, "One Small Soup")
+
+This release focuses on making it easier to customize Beautiful Soup's
+input mechanism (the TreeBuilder) and output mechanism (the Formatter).
+
+* You can customize the TreeBuilder object by passing keyword
+ arguments into the BeautifulSoup constructor. Those keyword
+ arguments will be passed along into the TreeBuilder constructor.
+
+ The main reason to do this right now is to change how which
+ attributes are treated as multi-valued attributes (the way 'class'
+ is treated by default). You can do this with the
+ 'multi_valued_attributes' argument. [bug=1832978]
+
+* The role of Formatter objects has been greatly expanded. The Formatter
+ class now controls the following:
+
+ - The function to call to perform entity substitution. (This was
+ previously Formatter's only job.)
+ - Which tags should be treated as containing CDATA and have their
+ contents exempt from entity substitution.
+ - The order in which a tag's attributes are output. [bug=1812422]
+ - Whether or not to put a '/' inside a void element, e.g. '<br/>' vs '<br>'
+
+ All preexisting code should work as before.
+
+* Added a new method to the API, Tag.smooth(), which consolidates
+ multiple adjacent NavigableString elements. [bug=1697296]
+
+* &apos; (which is valid in XML, XHTML, and HTML 5, but not HTML 4) is always
+ recognized as a named entity and converted to a single quote. [bug=1818721]
+
+= 4.7.1 (20190106)
+
+* Fixed a significant performance problem introduced in 4.7.0. [bug=1810617]
+
+* Fixed an incorrectly raised exception when inserting a tag before or
+ after an identical tag. [bug=1810692]
+
+* Beautiful Soup will no longer try to keep track of namespaces that
+ are not defined with a prefix; this can confuse soupselect. [bug=1810680]
+
+* Tried even harder to avoid the deprecation warning originally fixed in
+ 4.6.1. [bug=1778909]
+
+= 4.7.0 (20181231)
+
+* Beautiful Soup's CSS Selector implementation has been replaced by a
+ dependency on Isaac Muse's SoupSieve project (the soupsieve package
+ on PyPI). The good news is that SoupSieve has a much more robust and
+ complete implementation of CSS selectors, resolving a large number
+ of longstanding issues. The bad news is that from this point onward,
+ SoupSieve must be installed if you want to use the select() method.
+
+ You don't have to change anything lf you installed Beautiful Soup
+ through pip (SoupSieve will be automatically installed when you
+ upgrade Beautiful Soup) or if you don't use CSS selectors from
+ within Beautiful Soup.
+
+ SoupSieve documentation: https://facelessuser.github.io/soupsieve/
+
+* Added the PageElement.extend() method, which works like list.append().
+ [bug=1514970]
+
+* PageElement.insert_before() and insert_after() now take a variable
+ number of arguments. [bug=1514970]
+
+* Fix a number of problems with the tree builder that caused
+ trees that were superficially okay, but which fell apart when bits
+ were extracted. Patch by Isaac Muse. [bug=1782928,1809910]
+
+* Fixed a problem with the tree builder in which elements that
+ contained no content (such as empty comments and all-whitespace
+ elements) were not being treated as part of the tree. Patch by Isaac
+ Muse. [bug=1798699]
+
+* Fixed a problem with multi-valued attributes where the value
+ contained whitespace. Thanks to Jens Svalgaard for the
+ fix. [bug=1787453]
+
+* Clarified ambiguous license statements in the source code. Beautiful
+ Soup is released under the MIT license, and has been since 4.4.0.
+
+* This file has been renamed from NEWS.txt to CHANGELOG.
+
+= 4.6.3 (20180812)
+
+* Exactly the same as 4.6.2. Re-released to make the README file
+ render properly on PyPI.
+
+= 4.6.2 (20180812)
+
+* Fix an exception when a custom formatter was asked to format a void
+ element. [bug=1784408]
+
+= 4.6.1 (20180728)
+
+* Stop data loss when encountering an empty numeric entity, and
+ possibly in other cases. Thanks to tos.kamiya for the fix. [bug=1698503]
+
+* Preserve XML namespaces introduced inside an XML document, not just
+ the ones introduced at the top level. [bug=1718787]
+
+* Added a new formatter, "html5", which represents void elements
+ as "<element>" rather than "<element/>". [bug=1716272]
+
+* Fixed a problem where the html.parser tree builder interpreted
+ a string like "&foo " as the character entity "&foo;" [bug=1728706]
+
+* Correctly handle invalid HTML numeric character entities like &#147;
+ which reference code points that are not Unicode code points. Note
+ that this is only fixed when Beautiful Soup is used with the
+ html.parser parser -- html5lib already worked and I couldn't fix it
+ with lxml. [bug=1782933]
+
+* Improved the warning given when no parser is specified. [bug=1780571]
+
+* When markup contains duplicate elements, a select() call that
+ includes multiple match clauses will match all relevant
+ elements. [bug=1770596]
+
+* Fixed code that was causing deprecation warnings in recent Python 3
+ versions. Includes a patch from Ville Skyttä. [bug=1778909] [bug=1689496]
+
+* Fixed a Windows crash in diagnose() when checking whether a long
+ markup string is a filename. [bug=1737121]
+
+* Stopped HTMLParser from raising an exception in very rare cases of
+ bad markup. [bug=1708831]
+
+* Fixed a bug where find_all() was not working when asked to find a
+ tag with a namespaced name in an XML document that was parsed as
+ HTML. [bug=1723783]
+
+* You can get finer control over formatting by subclassing
+ bs4.element.Formatter and passing a Formatter instance into (e.g.)
+ encode(). [bug=1716272]
+
+* You can pass a dictionary of `attrs` into
+ BeautifulSoup.new_tag. This makes it possible to create a tag with
+ an attribute like 'name' that would otherwise be masked by another
+ argument of new_tag. [bug=1779276]
+
+* Clarified the deprecation warning when accessing tag.fooTag, to cover
+ the possibility that you might really have been looking for a tag
+ called 'fooTag'.
+
+= 4.6.0 (20170507) =
+
+* Added the `Tag.get_attribute_list` method, which acts like `Tag.get` for
+ getting the value of an attribute, but which always returns a list,
+ whether or not the attribute is a multi-value attribute. [bug=1678589]
+
+* It's now possible to use a tag's namespace prefix when searching,
+ e.g. soup.find('namespace:tag') [bug=1655332]
+
+* Improved the handling of empty-element tags like <br> when using the
+ html.parser parser. [bug=1676935]
+
+* HTML parsers treat all HTML4 and HTML5 empty element tags (aka void
+ element tags) correctly. [bug=1656909]
+
+* Namespace prefix is preserved when an XML tag is copied. Thanks
+ to Vikas for a patch and test. [bug=1685172]
+
+= 4.5.3 (20170102) =
+
+* Fixed foster parenting when html5lib is the tree builder. Thanks to
+ Geoffrey Sneddon for a patch and test.
+
+* Fixed yet another problem that caused the html5lib tree builder to
+ create a disconnected parse tree. [bug=1629825]
+
+= 4.5.2 (20170102) =
+
+* Apart from the version number, this release is identical to
+ 4.5.3. Due to user error, it could not be completely uploaded to
+ PyPI. Use 4.5.3 instead.
+
+= 4.5.1 (20160802) =
+
+* Fixed a crash when passing Unicode markup that contained a
+ processing instruction into the lxml HTML parser on Python
+ 3. [bug=1608048]
+
+= 4.5.0 (20160719) =
+
+* Beautiful Soup is no longer compatible with Python 2.6. This
+ actually happened a few releases ago, but it's now official.
+
+* Beautiful Soup will now work with versions of html5lib greater than
+ 0.99999999. [bug=1603299]
+
+* If a search against each individual value of a multi-valued
+ attribute fails, the search will be run one final time against the
+ complete attribute value considered as a single string. That is, if
+ a tag has class="foo bar" and neither "foo" nor "bar" matches, but
+ "foo bar" does, the tag is now considered a match.
+
+ This happened in previous versions, but only when the value being
+ searched for was a string. Now it also works when that value is
+ a regular expression, a list of strings, etc. [bug=1476868]
+
+* Fixed a bug that deranged the tree when a whitespace element was
+ reparented into a tag that contained an identical whitespace
+ element. [bug=1505351]
+
+* Added support for CSS selector values that contain quoted spaces,
+ such as tag[style="display: foo"]. [bug=1540588]
+
+* Corrected handling of XML processing instructions. [bug=1504393]
+
+* Corrected an encoding error that happened when a BeautifulSoup
+ object was copied. [bug=1554439]
+
+* The contents of <textarea> tags will no longer be modified when the
+ tree is prettified. [bug=1555829]
+
+* When a BeautifulSoup object is pickled but its tree builder cannot
+ be pickled, its .builder attribute is set to None instead of being
+ destroyed. This avoids a performance problem once the object is
+ unpickled. [bug=1523629]
+
+* Specify the file and line number when warning about a
+ BeautifulSoup object being instantiated without a parser being
+ specified. [bug=1574647]
+
+* The `limit` argument to `select()` now works correctly, though it's
+ not implemented very efficiently. [bug=1520530]
+
+* Fixed a Python 3 ByteWarning when a URL was passed in as though it
+ were markup. Thanks to James Salter for a patch and
+ test. [bug=1533762]
+
+* We don't run the check for a filename passed in as markup if the
+ 'filename' contains a less-than character; the less-than character
+ indicates it's most likely a very small document. [bug=1577864]
+
+= 4.4.1 (20150928) =
+
+* Fixed a bug that deranged the tree when part of it was
+ removed. Thanks to Eric Weiser for the patch and John Wiseman for a
+ test. [bug=1481520]
+
+* Fixed a parse bug with the html5lib tree-builder. Thanks to Roel
+ Kramer for the patch. [bug=1483781]
+
+* Improved the implementation of CSS selector grouping. Thanks to
+ Orangain for the patch. [bug=1484543]
+
+* Fixed the test_detect_utf8 test so that it works when chardet is
+ installed. [bug=1471359]
+
+* Corrected the output of Declaration objects. [bug=1477847]
+
+
+= 4.4.0 (20150703) =
+
+Especially important changes:
+
+* Added a warning when you instantiate a BeautifulSoup object without
+ explicitly naming a parser. [bug=1398866]
+
+* __repr__ now returns an ASCII bytestring in Python 2, and a Unicode
+ string in Python 3, instead of a UTF8-encoded bytestring in both
+ versions. In Python 3, __str__ now returns a Unicode string instead
+ of a bytestring. [bug=1420131]
+
+* The `text` argument to the find_* methods is now called `string`,
+ which is more accurate. `text` still works, but `string` is the
+ argument described in the documentation. `text` may eventually
+ change its meaning, but not for a very long time. [bug=1366856]
+
+* Changed the way soup objects work under copy.copy(). Copying a
+ NavigableString or a Tag will give you a new NavigableString that's
+ equal to the old one but not connected to the parse tree. Patch by
+ Martijn Peters. [bug=1307490]
+
+* Started using a standard MIT license. [bug=1294662]
+
+* Added a Chinese translation of the documentation by Delong .w.
+
+New features:
+
+* Introduced the select_one() method, which uses a CSS selector but
+ only returns the first match, instead of a list of
+ matches. [bug=1349367]
+
+* You can now create a Tag object without specifying a
+ TreeBuilder. Patch by Martijn Pieters. [bug=1307471]
+
+* You can now create a NavigableString or a subclass just by invoking
+ the constructor. [bug=1294315]
+
+* Added an `exclude_encodings` argument to UnicodeDammit and to the
+ Beautiful Soup constructor, which lets you prohibit the detection of
+ an encoding that you know is wrong. [bug=1469408]
+
+* The select() method now supports selector grouping. Patch by
+ Francisco Canas [bug=1191917]
+
+Bug fixes:
+
+* Fixed yet another problem that caused the html5lib tree builder to
+ create a disconnected parse tree. [bug=1237763]
+
+* Force object_was_parsed() to keep the tree intact even when an element
+ from later in the document is moved into place. [bug=1430633]
+
+* Fixed yet another bug that caused a disconnected tree when html5lib
+ copied an element from one part of the tree to another. [bug=1270611]
+
+* Fixed a bug where Element.extract() could create an infinite loop in
+ the remaining tree.
+
+* The select() method can now find tags whose names contain
+ dashes. Patch by Francisco Canas. [bug=1276211]
+
+* The select() method can now find tags with attributes whose names
+ contain dashes. Patch by Marek Kapolka. [bug=1304007]
+
+* Improved the lxml tree builder's handling of processing
+ instructions. [bug=1294645]
+
+* Restored the helpful syntax error that happens when you try to
+ import the Python 2 edition of Beautiful Soup under Python
+ 3. [bug=1213387]
+
+* In Python 3.4 and above, set the new convert_charrefs argument to
+ the html.parser constructor to avoid a warning and future
+ failures. Patch by Stefano Revera. [bug=1375721]
+
+* The warning when you pass in a filename or URL as markup will now be
+ displayed correctly even if the filename or URL is a Unicode
+ string. [bug=1268888]
+
+* If the initial <html> tag contains a CDATA list attribute such as
+ 'class', the html5lib tree builder will now turn its value into a
+ list, as it would with any other tag. [bug=1296481]
+
+* Fixed an import error in Python 3.5 caused by the removal of the
+ HTMLParseError class. [bug=1420063]
+
+* Improved docstring for encode_contents() and
+ decode_contents(). [bug=1441543]
+
+* Fixed a crash in Unicode, Dammit's encoding detector when the name
+ of the encoding itself contained invalid bytes. [bug=1360913]
+
+* Improved the exception raised when you call .unwrap() or
+ .replace_with() on an element that's not attached to a tree.
+
+* Raise a NotImplementedError whenever an unsupported CSS pseudoclass
+ is used in select(). Previously some cases did not result in a
+ NotImplementedError.
+
+* It's now possible to pickle a BeautifulSoup object no matter which
+ tree builder was used to create it. However, the only tree builder
+ that survives the pickling process is the HTMLParserTreeBuilder
+ ('html.parser'). If you unpickle a BeautifulSoup object created with
+ some other tree builder, soup.builder will be None. [bug=1231545]
+
+= 4.3.2 (20131002) =
+
+* Fixed a bug in which short Unicode input was improperly encoded to
+ ASCII when checking whether or not it was the name of a file on
+ disk. [bug=1227016]
+
+* Fixed a crash when a short input contains data not valid in
+ filenames. [bug=1232604]
+
+* Fixed a bug that caused Unicode data put into UnicodeDammit to
+ return None instead of the original data. [bug=1214983]
+
+* Combined two tests to stop a spurious test failure when tests are
+ run by nosetests. [bug=1212445]
+
+= 4.3.1 (20130815) =
+
+* Fixed yet another problem with the html5lib tree builder, caused by
+ html5lib's tendency to rearrange the tree during
+ parsing. [bug=1189267]
+
+* Fixed a bug that caused the optimized version of find_all() to
+ return nothing. [bug=1212655]
+
+= 4.3.0 (20130812) =
+
+* Instead of converting incoming data to Unicode and feeding it to the
+ lxml tree builder in chunks, Beautiful Soup now makes successive
+ guesses at the encoding of the incoming data, and tells lxml to
+ parse the data as that encoding. Giving lxml more control over the
+ parsing process improves performance and avoids a number of bugs and
+ issues with the lxml parser which had previously required elaborate
+ workarounds:
+
+ - An issue in which lxml refuses to parse Unicode strings on some
+ systems. [bug=1180527]
+
+ - A returning bug that truncated documents longer than a (very
+ small) size. [bug=963880]
+
+ - A returning bug in which extra spaces were added to a document if
+ the document defined a charset other than UTF-8. [bug=972466]
+
+ This required a major overhaul of the tree builder architecture. If
+ you wrote your own tree builder and didn't tell me, you'll need to
+ modify your prepare_markup() method.
+
+* The UnicodeDammit code that makes guesses at encodings has been
+ split into its own class, EncodingDetector. A lot of apparently
+ redundant code has been removed from Unicode, Dammit, and some
+ undocumented features have also been removed.
+
+* Beautiful Soup will issue a warning if instead of markup you pass it
+ a URL or the name of a file on disk (a common beginner's mistake).
+
+* A number of optimizations improve the performance of the lxml tree
+ builder by about 33%, the html.parser tree builder by about 20%, and
+ the html5lib tree builder by about 15%.
+
+* All find_all calls should now return a ResultSet object. Patch by
+ Aaron DeVore. [bug=1194034]
+
+= 4.2.1 (20130531) =
+
+* The default XML formatter will now replace ampersands even if they
+ appear to be part of entities. That is, "&lt;" will become
+ "&amp;lt;". The old code was left over from Beautiful Soup 3, which
+ didn't always turn entities into Unicode characters.
+
+ If you really want the old behavior (maybe because you add new
+ strings to the tree, those strings include entities, and you want
+ the formatter to leave them alone on output), it can be found in
+ EntitySubstitution.substitute_xml_containing_entities(). [bug=1182183]
+
+* Gave new_string() the ability to create subclasses of
+ NavigableString. [bug=1181986]
+
+* Fixed another bug by which the html5lib tree builder could create a
+ disconnected tree. [bug=1182089]
+
+* The .previous_element of a BeautifulSoup object is now always None,
+ not the last element to be parsed. [bug=1182089]
+
+* Fixed test failures when lxml is not installed. [bug=1181589]
+
+* html5lib now supports Python 3. Fixed some Python 2-specific
+ code in the html5lib test suite. [bug=1181624]
+
+* The html.parser treebuilder can now handle numeric attributes in
+ text when the hexidecimal name of the attribute starts with a
+ capital X. Patch by Tim Shirley. [bug=1186242]
+
+= 4.2.0 (20130514) =
+
+* The Tag.select() method now supports a much wider variety of CSS
+ selectors.
+
+ - Added support for the adjacent sibling combinator (+) and the
+ general sibling combinator (~). Tests by "liquider". [bug=1082144]
+
+ - The combinators (>, +, and ~) can now combine with any supported
+ selector, not just one that selects based on tag name.
+
+ - Added limited support for the "nth-of-type" pseudo-class. Code
+ by Sven Slootweg. [bug=1109952]
+
+* The BeautifulSoup class is now aliased to "_s" and "_soup", making
+ it quicker to type the import statement in an interactive session:
+
+ from bs4 import _s
+ or
+ from bs4 import _soup
+
+ The alias may change in the future, so don't use this in code you're
+ going to run more than once.
+
+* Added the 'diagnose' submodule, which includes several useful
+ functions for reporting problems and doing tech support.
+
+ - diagnose(data) tries the given markup on every installed parser,
+ reporting exceptions and displaying successes. If a parser is not
+ installed, diagnose() mentions this fact.
+
+ - lxml_trace(data, html=True) runs the given markup through lxml's
+ XML parser or HTML parser, and prints out the parser events as
+ they happen. This helps you quickly determine whether a given
+ problem occurs in lxml code or Beautiful Soup code.
+
+ - htmlparser_trace(data) is the same thing, but for Python's
+ built-in HTMLParser class.
+
+* In an HTML document, the contents of a <script> or <style> tag will
+ no longer undergo entity substitution by default. XML documents work
+ the same way they did before. [bug=1085953]
+
+* Methods like get_text() and properties like .strings now only give
+ you strings that are visible in the document--no comments or
+ processing commands. [bug=1050164]
+
+* The prettify() method now leaves the contents of <pre> tags
+ alone. [bug=1095654]
+
+* Fix a bug in the html5lib treebuilder which sometimes created
+ disconnected trees. [bug=1039527]
+
+* Fix a bug in the lxml treebuilder which crashed when a tag included
+ an attribute from the predefined "xml:" namespace. [bug=1065617]
+
+* Fix a bug by which keyword arguments to find_parent() were not
+ being passed on. [bug=1126734]
+
+* Stop a crash when unwisely messing with a tag that's been
+ decomposed. [bug=1097699]
+
+* Now that lxml's segfault on invalid doctype has been fixed, fixed a
+ corresponding problem on the Beautiful Soup end that was previously
+ invisible. [bug=984936]
+
+* Fixed an exception when an overspecified CSS selector didn't match
+ anything. Code by Stefaan Lippens. [bug=1168167]
+
+= 4.1.3 (20120820) =
+
+* Skipped a test under Python 2.6 and Python 3.1 to avoid a spurious
+ test failure caused by the lousy HTMLParser in those
+ versions. [bug=1038503]
+
+* Raise a more specific error (FeatureNotFound) when a requested
+ parser or parser feature is not installed. Raise NotImplementedError
+ instead of ValueError when the user calls insert_before() or
+ insert_after() on the BeautifulSoup object itself. Patch by Aaron
+ Devore. [bug=1038301]
+
+= 4.1.2 (20120817) =
+
+* As per PEP-8, allow searching by CSS class using the 'class_'
+ keyword argument. [bug=1037624]
+
+* Display namespace prefixes for namespaced attribute names, instead of
+ the fully-qualified names given by the lxml parser. [bug=1037597]
+
+* Fixed a crash on encoding when an attribute name contained
+ non-ASCII characters.
+
+* When sniffing encodings, if the cchardet library is installed,
+ Beautiful Soup uses it instead of chardet. cchardet is much
+ faster. [bug=1020748]
+
+* Use logging.warning() instead of warning.warn() to notify the user
+ that characters were replaced with REPLACEMENT
+ CHARACTER. [bug=1013862]
+
+= 4.1.1 (20120703) =
+
+* Fixed an html5lib tree builder crash which happened when html5lib
+ moved a tag with a multivalued attribute from one part of the tree
+ to another. [bug=1019603]
+
+* Correctly display closing tags with an XML namespace declared. Patch
+ by Andreas Kostyrka. [bug=1019635]
+
+* Fixed a typo that made parsing significantly slower than it should
+ have been, and also waited too long to close tags with XML
+ namespaces. [bug=1020268]
+
+* get_text() now returns an empty Unicode string if there is no text,
+ rather than an empty bytestring. [bug=1020387]
+
+= 4.1.0 (20120529) =
+
+* Added experimental support for fixing Windows-1252 characters
+ embedded in UTF-8 documents. (UnicodeDammit.detwingle())
+
+* Fixed the handling of &quot; with the built-in parser. [bug=993871]
+
+* Comments, processing instructions, document type declarations, and
+ markup declarations are now treated as preformatted strings, the way
+ CData blocks are. [bug=1001025]
+
+* Fixed a bug with the lxml treebuilder that prevented the user from
+ adding attributes to a tag that didn't originally have
+ attributes. [bug=1002378] Thanks to Oliver Beattie for the patch.
+
+* Fixed some edge-case bugs having to do with inserting an element
+ into a tag it's already inside, and replacing one of a tag's
+ children with another. [bug=997529]
+
+* Added the ability to search for attribute values specified in UTF-8. [bug=1003974]
+
+ This caused a major refactoring of the search code. All the tests
+ pass, but it's possible that some searches will behave differently.
+
+= 4.0.5 (20120427) =
+
+* Added a new method, wrap(), which wraps an element in a tag.
+
+* Renamed replace_with_children() to unwrap(), which is easier to
+ understand and also the jQuery name of the function.
+
+* Made encoding substitution in <meta> tags completely transparent (no
+ more %SOUP-ENCODING%).
+
+* Fixed a bug in decoding data that contained a byte-order mark, such
+ as data encoded in UTF-16LE. [bug=988980]
+
+* Fixed a bug that made the HTMLParser treebuilder generate XML
+ definitions ending with two question marks instead of
+ one. [bug=984258]
+
+* Upon document generation, CData objects are no longer run through
+ the formatter. [bug=988905]
+
+* The test suite now passes when lxml is not installed, whether or not
+ html5lib is installed. [bug=987004]
+
+* Print a warning on HTMLParseErrors to let people know they should
+ install a better parser library.
+
+= 4.0.4 (20120416) =
+
+* Fixed a bug that sometimes created disconnected trees.
+
+* Fixed a bug with the string setter that moved a string around the
+ tree instead of copying it. [bug=983050]
+
+* Attribute values are now run through the provided output formatter.
+ Previously they were always run through the 'minimal' formatter. In
+ the future I may make it possible to specify different formatters
+ for attribute values and strings, but for now, consistent behavior
+ is better than inconsistent behavior. [bug=980237]
+
+* Added the missing renderContents method from Beautiful Soup 3. Also
+ added an encode_contents() method to go along with decode_contents().
+
+* Give a more useful error when the user tries to run the Python 2
+ version of BS under Python 3.
+
+* UnicodeDammit can now convert Microsoft smart quotes to ASCII with
+ UnicodeDammit(markup, smart_quotes_to="ascii").
+
+= 4.0.3 (20120403) =
+
+* Fixed a typo that caused some versions of Python 3 to convert the
+ Beautiful Soup codebase incorrectly.
+
+* Got rid of the 4.0.2 workaround for HTML documents--it was
+ unnecessary and the workaround was triggering a (possibly different,
+ but related) bug in lxml. [bug=972466]
+
+= 4.0.2 (20120326) =
+
+* Worked around a possible bug in lxml that prevents non-tiny XML
+ documents from being parsed. [bug=963880, bug=963936]
+
+* Fixed a bug where specifying `text` while also searching for a tag
+ only worked if `text` wanted an exact string match. [bug=955942]
+
+= 4.0.1 (20120314) =
+
+* This is the first official release of Beautiful Soup 4. There is no
+ 4.0.0 release, to eliminate any possibility that packaging software
+ might treat "4.0.0" as being an earlier version than "4.0.0b10".
+
+* Brought BS up to date with the latest release of soupselect, adding
+ CSS selector support for direct descendant matches and multiple CSS
+ class matches.
+
+= 4.0.0b10 (20120302) =
+
+* Added support for simple CSS selectors, taken from the soupselect project.
+
+* Fixed a crash when using html5lib. [bug=943246]
+
+* In HTML5-style <meta charset="foo"> tags, the value of the "charset"
+ attribute is now replaced with the appropriate encoding on
+ output. [bug=942714]
+
+* Fixed a bug that caused calling a tag to sometimes call find_all()
+ with the wrong arguments. [bug=944426]
+
+* For backwards compatibility, brought back the BeautifulStoneSoup
+ class as a deprecated wrapper around BeautifulSoup.
+
+= 4.0.0b9 (20120228) =
+
+* Fixed the string representation of DOCTYPEs that have both a public
+ ID and a system ID.
+
+* Fixed the generated XML declaration.
+
+* Renamed Tag.nsprefix to Tag.prefix, for consistency with
+ NamespacedAttribute.
+
+* Fixed a test failure that occurred on Python 3.x when chardet was
+ installed.
+
+* Made prettify() return Unicode by default, so it will look nice on
+ Python 3 when passed into print().
+
+= 4.0.0b8 (20120224) =
+
+* All tree builders now preserve namespace information in the
+ documents they parse. If you use the html5lib parser or lxml's XML
+ parser, you can access the namespace URL for a tag as tag.namespace.
+
+ However, there is no special support for namespace-oriented
+ searching or tree manipulation. When you search the tree, you need
+ to use namespace prefixes exactly as they're used in the original
+ document.
+
+* The string representation of a DOCTYPE always ends in a newline.
+
+* Issue a warning if the user tries to use a SoupStrainer in
+ conjunction with the html5lib tree builder, which doesn't support
+ them.
+
+= 4.0.0b7 (20120223) =
+
+* Upon decoding to string, any characters that can't be represented in
+ your chosen encoding will be converted into numeric XML entity
+ references.
+
+* Issue a warning if characters were replaced with REPLACEMENT
+ CHARACTER during Unicode conversion.
+
+* Restored compatibility with Python 2.6.
+
+* The install process no longer installs docs or auxiliary text files.
+
+* It's now possible to deepcopy a BeautifulSoup object created with
+ Python's built-in HTML parser.
+
+* About 100 unit tests that "test" the behavior of various parsers on
+ invalid markup have been removed. Legitimate changes to those
+ parsers caused these tests to fail, indicating that perhaps
+ Beautiful Soup should not test the behavior of foreign
+ libraries.
+
+ The problematic unit tests have been reformulated as informational
+ comparisons generated by the script
+ scripts/demonstrate_parser_differences.py.
+
+ This makes Beautiful Soup compatible with html5lib version 0.95 and
+ future versions of HTMLParser.
+
+= 4.0.0b6 (20120216) =
+
+* Multi-valued attributes like "class" always have a list of values,
+ even if there's only one value in the list.
+
+* Added a number of multi-valued attributes defined in HTML5.
+
+* Stopped generating a space before the slash that closes an
+ empty-element tag. This may come back if I add a special XHTML mode
+ (http://www.w3.org/TR/xhtml1/#C_2), but right now it's pretty
+ useless.
+
+* Passing text along with tag-specific arguments to a find* method:
+
+ find("a", text="Click here")
+
+ will find tags that contain the given text as their
+ .string. Previously, the tag-specific arguments were ignored and
+ only strings were searched.
+
+* Fixed a bug that caused the html5lib tree builder to build a
+ partially disconnected tree. Generally cleaned up the html5lib tree
+ builder.
+
+* If you restrict a multi-valued attribute like "class" to a string
+ that contains spaces, Beautiful Soup will only consider it a match
+ if the values correspond to that specific string.
+
+= 4.0.0b5 (20120209) =
+
+* Rationalized Beautiful Soup's treatment of CSS class. A tag
+ belonging to multiple CSS classes is treated as having a list of
+ values for the 'class' attribute. Searching for a CSS class will
+ match *any* of the CSS classes.
+
+ This actually affects all attributes that the HTML standard defines
+ as taking multiple values (class, rel, rev, archive, accept-charset,
+ and headers), but 'class' is by far the most common. [bug=41034]
+
+* If you pass anything other than a dictionary as the second argument
+ to one of the find* methods, it'll assume you want to use that
+ object to search against a tag's CSS classes. Previously this only
+ worked if you passed in a string.
+
+* Fixed a bug that caused a crash when you passed a dictionary as an
+ attribute value (possibly because you mistyped "attrs"). [bug=842419]
+
+* Unicode, Dammit now detects the encoding in HTML 5-style <meta> tags
+ like <meta charset="utf-8" />. [bug=837268]
+
+* If Unicode, Dammit can't figure out a consistent encoding for a
+ page, it will try each of its guesses again, with errors="replace"
+ instead of errors="strict". This may mean that some data gets
+ replaced with REPLACEMENT CHARACTER, but at least most of it will
+ get turned into Unicode. [bug=754903]
+
+* Patched over a bug in html5lib (?) that was crashing Beautiful Soup
+ on certain kinds of markup. [bug=838800]
+
+* Fixed a bug that wrecked the tree if you replaced an element with an
+ empty string. [bug=728697]
+
+* Improved Unicode, Dammit's behavior when you give it Unicode to
+ begin with.
+
+= 4.0.0b4 (20120208) =
+
+* Added BeautifulSoup.new_string() to go along with BeautifulSoup.new_tag()
+
+* BeautifulSoup.new_tag() will follow the rules of whatever
+ tree-builder was used to create the original BeautifulSoup object. A
+ new <p> tag will look like "<p />" if the soup object was created to
+ parse XML, but it will look like "<p></p>" if the soup object was
+ created to parse HTML.
+
+* We pass in strict=False to html.parser on Python 3, greatly
+ improving html.parser's ability to handle bad HTML.
+
+* We also monkeypatch a serious bug in html.parser that made
+ strict=False disastrous on Python 3.2.2.
+
+* Replaced the "substitute_html_entities" argument with the
+ more general "formatter" argument.
+
+* Bare ampersands and angle brackets are always converted to XML
+ entities unless the user prevents it.
+
+* Added PageElement.insert_before() and PageElement.insert_after(),
+ which let you put an element into the parse tree with respect to
+ some other element.
+
+* Raise an exception when the user tries to do something nonsensical
+ like insert a tag into itself.
+
+
+= 4.0.0b3 (20120203) =
+
+Beautiful Soup 4 is a nearly-complete rewrite that removes Beautiful
+Soup's custom HTML parser in favor of a system that lets you write a
+little glue code and plug in any HTML or XML parser you want.
+
+Beautiful Soup 4.0 comes with glue code for four parsers:
+
+ * Python's standard HTMLParser (html.parser in Python 3)
+ * lxml's HTML and XML parsers
+ * html5lib's HTML parser
+
+HTMLParser is the default, but I recommend you install lxml if you
+can.
+
+For complete documentation, see the Sphinx documentation in
+bs4/doc/source/. What follows is a summary of the changes from
+Beautiful Soup 3.
+
+=== The module name has changed ===
+
+Previously you imported the BeautifulSoup class from a module also
+called BeautifulSoup. To save keystrokes and make it clear which
+version of the API is in use, the module is now called 'bs4':
+
+ >>> from bs4 import BeautifulSoup
+
+=== It works with Python 3 ===
+
+Beautiful Soup 3.1.0 worked with Python 3, but the parser it used was
+so bad that it barely worked at all. Beautiful Soup 4 works with
+Python 3, and since its parser is pluggable, you don't sacrifice
+quality.
+
+Special thanks to Thomas Kluyver and Ezio Melotti for getting Python 3
+support to the finish line. Ezio Melotti is also to thank for greatly
+improving the HTML parser that comes with Python 3.2.
+
+=== CDATA sections are normal text, if they're understood at all. ===
+
+Currently, the lxml and html5lib HTML parsers ignore CDATA sections in
+markup:
+
+ <p><![CDATA[foo]]></p> => <p></p>
+
+A future version of html5lib will turn CDATA sections into text nodes,
+but only within tags like <svg> and <math>:
+
+ <svg><![CDATA[foo]]></svg> => <p>foo</p>
+
+The default XML parser (which uses lxml behind the scenes) turns CDATA
+sections into ordinary text elements:
+
+ <p><![CDATA[foo]]></p> => <p>foo</p>
+
+In theory it's possible to preserve the CDATA sections when using the
+XML parser, but I don't see how to get it to work in practice.
+
+=== Miscellaneous other stuff ===
+
+If the BeautifulSoup instance has .is_xml set to True, an appropriate
+XML declaration will be emitted when the tree is transformed into a
+string:
+
+ <?xml version="1.0" encoding="utf-8">
+ <markup>
+ ...
+ </markup>
+
+The ['lxml', 'xml'] tree builder sets .is_xml to True; the other tree
+builders set it to False. If you want to parse XHTML with an HTML
+parser, you can set it manually.
+
+
+= 3.2.0 =
+
+The 3.1 series wasn't very useful, so I renamed the 3.0 series to 3.2
+to make it obvious which one you should use.
+
+= 3.1.0 =
+
+A hybrid version that supports 2.4 and can be automatically converted
+to run under Python 3.0. There are three backwards-incompatible
+changes you should be aware of, but no new features or deliberate
+behavior changes.
+
+1. str() may no longer do what you want. This is because the meaning
+of str() inverts between Python 2 and 3; in Python 2 it gives you a
+byte string, in Python 3 it gives you a Unicode string.
+
+The effect of this is that you can't pass an encoding to .__str__
+anymore. Use encode() to get a string and decode() to get Unicode, and
+you'll be ready (well, readier) for Python 3.
+
+2. Beautiful Soup is now based on HTMLParser rather than SGMLParser,
+which is gone in Python 3. There's some bad HTML that SGMLParser
+handled but HTMLParser doesn't, usually to do with attribute values
+that aren't closed or have brackets inside them:
+
+ <a href="foo</a>, </a><a href="bar">baz</a>
+ <a b="<a>">', '<a b="&lt;a&gt;"></a><a>"></a>
+
+A later version of Beautiful Soup will allow you to plug in different
+parsers to make tradeoffs between speed and the ability to handle bad
+HTML.
+
+3. In Python 3 (but not Python 2), HTMLParser converts entities within
+attributes to the corresponding Unicode characters. In Python 2 it's
+possible to parse this string and leave the &eacute; intact.
+
+ <a href="http://crummy.com?sacr&eacute;&bleu">
+
+In Python 3, the &eacute; is always converted to \xe9 during
+parsing.
+
+
+= 3.0.7a =
+
+Added an import that makes BS work in Python 2.3.
+
+
+= 3.0.7 =
+
+Fixed a UnicodeDecodeError when unpickling documents that contain
+non-ASCII characters.
+
+Fixed a TypeError that occurred in some circumstances when a tag
+contained no text.
+
+Jump through hoops to avoid the use of chardet, which can be extremely
+slow in some circumstances. UTF-8 documents should never trigger the
+use of chardet.
+
+Whitespace is preserved inside <pre> and <textarea> tags that contain
+nothing but whitespace.
+
+Beautiful Soup can now parse a doctype that's scoped to an XML namespace.
+
+
+= 3.0.6 =
+
+Got rid of a very old debug line that prevented chardet from working.
+
+Added a Tag.decompose() method that completely disconnects a tree or a
+subset of a tree, breaking it up into bite-sized pieces that are
+easy for the garbage collecter to collect.
+
+Tag.extract() now returns the tag that was extracted.
+
+Tag.findNext() now does something with the keyword arguments you pass
+it instead of dropping them on the floor.
+
+Fixed a Unicode conversion bug.
+
+Fixed a bug that garbled some <meta> tags when rewriting them.
+
+
+= 3.0.5 =
+
+Soup objects can now be pickled, and copied with copy.deepcopy.
+
+Tag.append now works properly on existing BS objects. (It wasn't
+originally intended for outside use, but it can be now.) (Giles
+Radford)
+
+Passing in a nonexistent encoding will no longer crash the parser on
+Python 2.4 (John Nagle).
+
+Fixed an underlying bug in SGMLParser that thinks ASCII has 255
+characters instead of 127 (John Nagle).
+
+Entities are converted more consistently to Unicode characters.
+
+Entity references in attribute values are now converted to Unicode
+characters when appropriate. Numeric entities are always converted,
+because SGMLParser always converts them outside of attribute values.
+
+ALL_ENTITIES happens to just be the XHTML entities, so I renamed it to
+XHTML_ENTITIES.
+
+The regular expression for bare ampersands was too loose. In some
+cases ampersands were not being escaped. (Sam Ruby?)
+
+Non-breaking spaces and other special Unicode space characters are no
+longer folded to ASCII spaces. (Robert Leftwich)
+
+Information inside a TEXTAREA tag is now parsed literally, not as HTML
+tags. TEXTAREA now works exactly the same way as SCRIPT. (Zephyr Fang)
+
+= 3.0.4 =
+
+Fixed a bug that crashed Unicode conversion in some cases.
+
+Fixed a bug that prevented UnicodeDammit from being used as a
+general-purpose data scrubber.
+
+Fixed some unit test failures when running against Python 2.5.
+
+When considering whether to convert smart quotes, UnicodeDammit now
+looks at the original encoding in a case-insensitive way.
+
+= 3.0.3 (20060606) =
+
+Beautiful Soup is now usable as a way to clean up invalid XML/HTML (be
+sure to pass in an appropriate value for convertEntities, or XML/HTML
+entities might stick around that aren't valid in HTML/XML). The result
+may not validate, but it should be good enough to not choke a
+real-world XML parser. Specifically, the output of a properly
+constructed soup object should always be valid as part of an XML
+document, but parts may be missing if they were missing in the
+original. As always, if the input is valid XML, the output will also
+be valid.
+
+= 3.0.2 (20060602) =
+
+Previously, Beautiful Soup correctly handled attribute values that
+contained embedded quotes (sometimes by escaping), but not other kinds
+of XML character. Now, it correctly handles or escapes all special XML
+characters in attribute values.
+
+I aliased methods to the 2.x names (fetch, find, findText, etc.) for
+backwards compatibility purposes. Those names are deprecated and if I
+ever do a 4.0 I will remove them. I will, I tell you!
+
+Fixed a bug where the findAll method wasn't passing along any keyword
+arguments.
+
+When run from the command line, Beautiful Soup now acts as an HTML
+pretty-printer, not an XML pretty-printer.
+
+= 3.0.1 (20060530) =
+
+Reintroduced the "fetch by CSS class" shortcut. I thought keyword
+arguments would replace it, but they don't. You can't call soup('a',
+class='foo') because class is a Python keyword.
+
+If Beautiful Soup encounters a meta tag that declares the encoding,
+but a SoupStrainer tells it not to parse that tag, Beautiful Soup will
+no longer try to rewrite the meta tag to mention the new
+encoding. Basically, this makes SoupStrainers work in real-world
+applications instead of crashing the parser.
+
+= 3.0.0 "Who would not give all else for two p" (20060528) =
+
+This release is not backward-compatible with previous releases. If
+you've got code written with a previous version of the library, go
+ahead and keep using it, unless one of the features mentioned here
+really makes your life easier. Since the library is self-contained,
+you can include an old copy of the library in your old applications,
+and use the new version for everything else.
+
+The documentation has been rewritten and greatly expanded with many
+more examples.
+
+Beautiful Soup autodetects the encoding of a document (or uses the one
+you specify), and converts it from its native encoding to
+Unicode. Internally, it only deals with Unicode strings. When you
+print out the document, it converts to UTF-8 (or another encoding you
+specify). [Doc reference]
+
+It's now easy to make large-scale changes to the parse tree without
+screwing up the navigation members. The methods are extract,
+replaceWith, and insert. [Doc reference. See also Improving Memory
+Usage with extract]
+
+Passing True in as an attribute value gives you tags that have any
+value for that attribute. You don't have to create a regular
+expression. Passing None for an attribute value gives you tags that
+don't have that attribute at all.
+
+Tag objects now know whether or not they're self-closing. This avoids
+the problem where Beautiful Soup thought that tags like <BR /> were
+self-closing even in XML documents. You can customize the self-closing
+tags for a parser object by passing them in as a list of
+selfClosingTags: you don't have to subclass anymore.
+
+There's a new built-in parser, MinimalSoup, which has most of
+BeautifulSoup's HTML-specific rules, but no tag nesting rules. [Doc
+reference]
+
+You can use a SoupStrainer to tell Beautiful Soup to parse only part
+of a document. This saves time and memory, often making Beautiful Soup
+about as fast as a custom-built SGMLParser subclass. [Doc reference,
+SoupStrainer reference]
+
+You can (usually) use keyword arguments instead of passing a
+dictionary of attributes to a search method. That is, you can replace
+soup(args={"id" : "5"}) with soup(id="5"). You can still use args if
+(for instance) you need to find an attribute whose name clashes with
+the name of an argument to findAll. [Doc reference: **kwargs attrs]
+
+The method names have changed to the better method names used in
+Rubyful Soup. Instead of find methods and fetch methods, there are
+only find methods. Instead of a scheme where you can't remember which
+method finds one element and which one finds them all, we have find
+and findAll. In general, if the method name mentions All or a plural
+noun (eg. findNextSiblings), then it finds many elements
+method. Otherwise, it only finds one element. [Doc reference]
+
+Some of the argument names have been renamed for clarity. For instance
+avoidParserProblems is now parserMassage.
+
+Beautiful Soup no longer implements a feed method. You need to pass a
+string or a filehandle into the soup constructor, not with feed after
+the soup has been created. There is still a feed method, but it's the
+feed method implemented by SGMLParser and calling it will bypass
+Beautiful Soup and cause problems.
+
+The NavigableText class has been renamed to NavigableString. There is
+no NavigableUnicodeString anymore, because every string inside a
+Beautiful Soup parse tree is a Unicode string.
+
+findText and fetchText are gone. Just pass a text argument into find
+or findAll.
+
+Null was more trouble than it was worth, so I got rid of it. Anything
+that used to return Null now returns None.
+
+Special XML constructs like comments and CDATA now have their own
+NavigableString subclasses, instead of being treated as oddly-formed
+data. If you parse a document that contains CDATA and write it back
+out, the CDATA will still be there.
+
+When you're parsing a document, you can get Beautiful Soup to convert
+XML or HTML entities into the corresponding Unicode characters. [Doc
+reference]
+
+= 2.1.1 (20050918) =
+
+Fixed a serious performance bug in BeautifulStoneSoup which was
+causing parsing to be incredibly slow.
+
+Corrected several entities that were previously being incorrectly
+translated from Microsoft smart-quote-like characters.
+
+Fixed a bug that was breaking text fetch.
+
+Fixed a bug that crashed the parser when text chunks that look like
+HTML tag names showed up within a SCRIPT tag.
+
+THEAD, TBODY, and TFOOT tags are now nestable within TABLE
+tags. Nested tables should parse more sensibly now.
+
+BASE is now considered a self-closing tag.
+
+= 2.1.0 "Game, or any other dish?" (20050504) =
+
+Added a wide variety of new search methods which, given a starting
+point inside the tree, follow a particular navigation member (like
+nextSibling) over and over again, looking for Tag and NavigableText
+objects that match certain criteria. The new methods are findNext,
+fetchNext, findPrevious, fetchPrevious, findNextSibling,
+fetchNextSiblings, findPreviousSibling, fetchPreviousSiblings,
+findParent, and fetchParents. All of these use the same basic code
+used by first and fetch, so you can pass your weird ways of matching
+things into these methods.
+
+The fetch method and its derivatives now accept a limit argument.
+
+You can now pass keyword arguments when calling a Tag object as though
+it were a method.
+
+Fixed a bug that caused all hand-created tags to share a single set of
+attributes.
+
+= 2.0.3 (20050501) =
+
+Fixed Python 2.2 support for iterators.
+
+Fixed a bug that gave the wrong representation to tags within quote
+tags like <script>.
+
+Took some code from Mark Pilgrim that treats CDATA declarations as
+data instead of ignoring them.
+
+Beautiful Soup's setup.py will now do an install even if the unit
+tests fail. It won't build a source distribution if the unit tests
+fail, so I can't release a new version unless they pass.
+
+= 2.0.2 (20050416) =
+
+Added the unit tests in a separate module, and packaged it with
+distutils.
+
+Fixed a bug that sometimes caused renderContents() to return a Unicode
+string even if there was no Unicode in the original string.
+
+Added the done() method, which closes all of the parser's open
+tags. It gets called automatically when you pass in some text to the
+constructor of a parser class; otherwise you must call it yourself.
+
+Reinstated some backwards compatibility with 1.x versions: referencing
+the string member of a NavigableText object returns the NavigableText
+object instead of throwing an error.
+
+= 2.0.1 (20050412) =
+
+Fixed a bug that caused bad results when you tried to reference a tag
+name shorter than 3 characters as a member of a Tag, eg. tag.table.td.
+
+Made sure all Tags have the 'hidden' attribute so that an attempt to
+access tag.hidden doesn't spawn an attempt to find a tag named
+'hidden'.
+
+Fixed a bug in the comparison operator.
+
+= 2.0.0 "Who cares for fish?" (20050410)
+
+Beautiful Soup version 1 was very useful but also pretty stupid. I
+originally wrote it without noticing any of the problems inherent in
+trying to build a parse tree out of ambiguous HTML tags. This version
+solves all of those problems to my satisfaction. It also adds many new
+clever things to make up for the removal of the stupid things.
+
+== Parsing ==
+
+The parser logic has been greatly improved, and the BeautifulSoup
+class should much more reliably yield a parse tree that looks like
+what the page author intended. For a particular class of odd edge
+cases that now causes problems, there is a new class,
+ICantBelieveItsBeautifulSoup.
+
+By default, Beautiful Soup now performs some cleanup operations on
+text before parsing it. This is to avoid common problems with bad
+definitions and self-closing tags that crash SGMLParser. You can
+provide your own set of cleanup operations, or turn it off
+altogether. The cleanup operations include fixing self-closing tags
+that don't close, and replacing Microsoft smart quotes and similar
+characters with their HTML entity equivalents.
+
+You can now get a pretty-print version of parsed HTML to get a visual
+picture of how Beautiful Soup parses it, with the Tag.prettify()
+method.
+
+== Strings and Unicode ==
+
+There are separate NavigableText subclasses for ASCII and Unicode
+strings. These classes directly subclass the corresponding base data
+types. This means you can treat NavigableText objects as strings
+instead of having to call methods on them to get the strings.
+
+str() on a Tag always returns a string, and unicode() always returns
+Unicode. Previously it was inconsistent.
+
+== Tree traversal ==
+
+In a first() or fetch() call, the tag name or the desired value of an
+attribute can now be any of the following:
+
+ * A string (matches that specific tag or that specific attribute value)
+ * A list of strings (matches any tag or attribute value in the list)
+ * A compiled regular expression object (matches any tag or attribute
+ value that matches the regular expression)
+ * A callable object that takes the Tag object or attribute value as a
+ string. It returns None/false/empty string if the given string
+ doesn't match, and any other value if it does.
+
+This is much easier to use than SQL-style wildcards (see, regular
+expressions are good for something). Because of this, I took out
+SQL-style wildcards. I'll put them back if someone complains, but
+their removal simplifies the code a lot.
+
+You can use fetch() and first() to search for text in the parse tree,
+not just tags. There are new alias methods fetchText() and firstText()
+designed for this purpose. As with searching for tags, you can pass in
+a string, a regular expression object, or a method to match your text.
+
+If you pass in something besides a map to the attrs argument of
+fetch() or first(), Beautiful Soup will assume you want to match that
+thing against the "class" attribute. When you're scraping
+well-structured HTML, this makes your code a lot cleaner.
+
+1.x and 2.x both let you call a Tag object as a shorthand for
+fetch(). For instance, foo("bar") is a shorthand for
+foo.fetch("bar"). In 2.x, you can also access a specially-named member
+of a Tag object as a shorthand for first(). For instance, foo.barTag
+is a shorthand for foo.first("bar"). By chaining these shortcuts you
+traverse a tree in very little code: for header in
+soup.bodyTag.pTag.tableTag('th'):
+
+If an element relationship (like parent or next) doesn't apply to a
+tag, it'll now show up Null instead of None. first() will also return
+Null if you ask it for a nonexistent tag. Null is an object that's
+just like None, except you can do whatever you want to it and it'll
+give you Null instead of throwing an error.
+
+This lets you do tree traversals like soup.htmlTag.headTag.titleTag
+without having to worry if the intermediate stages are actually
+there. Previously, if there was no 'head' tag in the document, headTag
+in that instance would have been None, and accessing its 'titleTag'
+member would have thrown an AttributeError. Now, you can get what you
+want when it exists, and get Null when it doesn't, without having to
+do a lot of conditionals checking to see if every stage is None.
+
+There are two new relations between page elements: previousSibling and
+nextSibling. They reference the previous and next element at the same
+level of the parse tree. For instance, if you have HTML like this:
+
+ <p><ul><li>Foo<br /><li>Bar</ul>
+
+The first 'li' tag has a previousSibling of Null and its nextSibling
+is the second 'li' tag. The second 'li' tag has a nextSibling of Null
+and its previousSibling is the first 'li' tag. The previousSibling of
+the 'ul' tag is the first 'p' tag. The nextSibling of 'Foo' is the
+'br' tag.
+
+I took out the ability to use fetch() to find tags that have a
+specific list of contents. See, I can't even explain it well. It was
+really difficult to use, I never used it, and I don't think anyone
+else ever used it. To the extent anyone did, they can probably use
+fetchText() instead. If it turns out someone needs it I'll think of
+another solution.
+
+== Tree manipulation ==
+
+You can add new attributes to a tag, and delete attributes from a
+tag. In 1.x you could only change a tag's existing attributes.
+
+== Porting Considerations ==
+
+There are three changes in 2.0 that break old code:
+
+In the post-1.2 release you could pass in a function into fetch(). The
+function took a string, the tag name. In 2.0, the function takes the
+actual Tag object.
+
+It's no longer to pass in SQL-style wildcards to fetch(). Use a
+regular expression instead.
+
+The different parsing algorithm means the parse tree may not be shaped
+like you expect. This will only actually affect you if your code uses
+one of the affected parts. I haven't run into this problem yet while
+porting my code.
+
+= Between 1.2 and 2.0 =
+
+This is the release to get if you want Python 1.5 compatibility.
+
+The desired value of an attribute can now be any of the following:
+
+ * A string
+ * A string with SQL-style wildcards
+ * A compiled RE object
+ * A callable that returns None/false/empty string if the given value
+ doesn't match, and any other value otherwise.
+
+This is much easier to use than SQL-style wildcards (see, regular
+expressions are good for something). Because of this, I no longer
+recommend you use SQL-style wildcards. They may go away in a future
+release to clean up the code.
+
+Made Beautiful Soup handle processing instructions as text instead of
+ignoring them.
+
+Applied patch from Richie Hindle (richie at entrian dot com) that
+makes tag.string a shorthand for tag.contents[0].string when the tag
+has only one string-owning child.
+
+Added still more nestable tags. The nestable tags thing won't work in
+a lot of cases and needs to be rethought.
+
+Fixed an edge case where searching for "%foo" would match any string
+shorter than "foo".
+
+= 1.2 "Who for such dainties would not stoop?" (20040708) =
+
+Applied patch from Ben Last (ben at benlast dot com) that made
+Tag.renderContents() correctly handle Unicode.
+
+Made BeautifulStoneSoup even dumber by making it not implicitly close
+a tag when another tag of the same type is encountered; only when an
+actual closing tag is encountered. This change courtesy of Fuzzy (mike
+at pcblokes dot com). BeautifulSoup still works as before.
+
+= 1.1 "Swimming in a hot tureen" =
+
+Added more 'nestable' tags. Changed popping semantics so that when a
+nestable tag is encountered, tags are popped up to the previously
+encountered nestable tag (of whatever kind). I will revert this if
+enough people complain, but it should make more people's lives easier
+than harder. This enhancement was suggested by Anthony Baxter (anthony
+at interlink dot com dot au).
+
+= 1.0 "So rich and green" (20040420) =
+
+Initial release.
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/PKG-INFO b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/PKG-INFO
new file mode 100644
index 00000000000..c5685222994
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/PKG-INFO
@@ -0,0 +1,126 @@
+Metadata-Version: 2.1
+Name: beautifulsoup4
+Version: 4.9.3
+Summary: Screen-scraping library
+Home-page: http://www.crummy.com/software/BeautifulSoup/bs4/
+Author: Leonard Richardson
+Author-email: leonardr@segfault.org
+License: MIT
+Download-URL: http://www.crummy.com/software/BeautifulSoup/bs4/download/
+Description: Beautiful Soup is a library that makes it easy to scrape information
+ from web pages. It sits atop an HTML or XML parser, providing Pythonic
+ idioms for iterating, searching, and modifying the parse tree.
+
+ # Quick start
+
+ ```
+ >>> from bs4 import BeautifulSoup
+ >>> soup = BeautifulSoup("<p>Some<b>bad<i>HTML")
+ >>> print(soup.prettify())
+ <html>
+ <body>
+ <p>
+ Some
+ <b>
+ bad
+ <i>
+ HTML
+ </i>
+ </b>
+ </p>
+ </body>
+ </html>
+ >>> soup.find(text="bad")
+ 'bad'
+ >>> soup.i
+ <i>HTML</i>
+ #
+ >>> soup = BeautifulSoup("<tag1>Some<tag2/>bad<tag3>XML", "xml")
+ #
+ >>> print(soup.prettify())
+ <?xml version="1.0" encoding="utf-8"?>
+ <tag1>
+ Some
+ <tag2/>
+ bad
+ <tag3>
+ XML
+ </tag3>
+ </tag1>
+ ```
+
+ To go beyond the basics, [comprehensive documentation is available](http://www.crummy.com/software/BeautifulSoup/bs4/doc/).
+
+ # Links
+
+ * [Homepage](http://www.crummy.com/software/BeautifulSoup/bs4/)
+ * [Documentation](http://www.crummy.com/software/BeautifulSoup/bs4/doc/)
+ * [Discussion group](http://groups.google.com/group/beautifulsoup/)
+ * [Development](https://code.launchpad.net/beautifulsoup/)
+ * [Bug tracker](https://bugs.launchpad.net/beautifulsoup/)
+ * [Complete changelog](https://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/head:/CHANGELOG)
+
+ # Note on Python 2 sunsetting
+
+ Since 2012, Beautiful Soup has been developed as a Python 2 library
+ which is automatically converted to Python 3 code as necessary. This
+ makes it impossible to take advantage of some features of Python
+ 3.
+
+ For this reason, I plan to discontinue Beautiful Soup's Python 2
+ support at some point after December 31, 2020: one year after the
+ sunset date for Python 2 itself. Beyond that point, new Beautiful Soup
+ development will exclusively target Python 3. Of course, older
+ releases of Beautiful Soup, which support both versions, will continue
+ to be available.
+
+ # Supporting the project
+
+ If you use Beautiful Soup as part of your professional work, please consider a
+ [Tidelift subscription](https://tidelift.com/subscription/pkg/pypi-beautifulsoup4?utm_source=pypi-beautifulsoup4&utm_medium=referral&utm_campaign=readme).
+ This will support many of the free software projects your organization
+ depends on, not just Beautiful Soup.
+
+ If you use Beautiful Soup for personal projects, the best way to say
+ thank you is to read
+ [Tool Safety](https://www.crummy.com/software/BeautifulSoup/zine/), a zine I
+ wrote about what Beautiful Soup has taught me about software
+ development.
+
+ # Building the documentation
+
+ The bs4/doc/ directory contains full documentation in Sphinx
+ format. Run `make html` in that directory to create HTML
+ documentation.
+
+ # Running the unit tests
+
+ Beautiful Soup supports unit test discovery from the project root directory:
+
+ ```
+ $ nosetests
+ ```
+
+ ```
+ $ python -m unittest discover -s bs4
+ ```
+
+ If you checked out the source tree, you should see a script in the
+ home directory called test-all-versions. This script will run the unit
+ tests under Python 2, then create a temporary Python 3 conversion of
+ the source and run the unit tests again under Python 3.
+
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Topic :: Text Processing :: Markup :: HTML
+Classifier: Topic :: Text Processing :: Markup :: XML
+Classifier: Topic :: Text Processing :: Markup :: SGML
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Description-Content-Type: text/markdown
+Provides-Extra: html5lib
+Provides-Extra: lxml
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/README.md b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/README.md
new file mode 100644
index 00000000000..92dd3394237
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/README.md
@@ -0,0 +1,102 @@
+Beautiful Soup is a library that makes it easy to scrape information
+from web pages. It sits atop an HTML or XML parser, providing Pythonic
+idioms for iterating, searching, and modifying the parse tree.
+
+# Quick start
+
+```
+>>> from bs4 import BeautifulSoup
+>>> soup = BeautifulSoup("<p>Some<b>bad<i>HTML")
+>>> print(soup.prettify())
+<html>
+ <body>
+ <p>
+ Some
+ <b>
+ bad
+ <i>
+ HTML
+ </i>
+ </b>
+ </p>
+ </body>
+</html>
+>>> soup.find(text="bad")
+'bad'
+>>> soup.i
+<i>HTML</i>
+#
+>>> soup = BeautifulSoup("<tag1>Some<tag2/>bad<tag3>XML", "xml")
+#
+>>> print(soup.prettify())
+<?xml version="1.0" encoding="utf-8"?>
+<tag1>
+ Some
+ <tag2/>
+ bad
+ <tag3>
+ XML
+ </tag3>
+</tag1>
+```
+
+To go beyond the basics, [comprehensive documentation is available](http://www.crummy.com/software/BeautifulSoup/bs4/doc/).
+
+# Links
+
+* [Homepage](http://www.crummy.com/software/BeautifulSoup/bs4/)
+* [Documentation](http://www.crummy.com/software/BeautifulSoup/bs4/doc/)
+* [Discussion group](http://groups.google.com/group/beautifulsoup/)
+* [Development](https://code.launchpad.net/beautifulsoup/)
+* [Bug tracker](https://bugs.launchpad.net/beautifulsoup/)
+* [Complete changelog](https://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/head:/CHANGELOG)
+
+# Note on Python 2 sunsetting
+
+Since 2012, Beautiful Soup has been developed as a Python 2 library
+which is automatically converted to Python 3 code as necessary. This
+makes it impossible to take advantage of some features of Python
+3.
+
+For this reason, I plan to discontinue Beautiful Soup's Python 2
+support at some point after December 31, 2020: one year after the
+sunset date for Python 2 itself. Beyond that point, new Beautiful Soup
+development will exclusively target Python 3. Of course, older
+releases of Beautiful Soup, which support both versions, will continue
+to be available.
+
+# Supporting the project
+
+If you use Beautiful Soup as part of your professional work, please consider a
+[Tidelift subscription](https://tidelift.com/subscription/pkg/pypi-beautifulsoup4?utm_source=pypi-beautifulsoup4&utm_medium=referral&utm_campaign=readme).
+This will support many of the free software projects your organization
+depends on, not just Beautiful Soup.
+
+If you use Beautiful Soup for personal projects, the best way to say
+thank you is to read
+[Tool Safety](https://www.crummy.com/software/BeautifulSoup/zine/), a zine I
+wrote about what Beautiful Soup has taught me about software
+development.
+
+# Building the documentation
+
+The bs4/doc/ directory contains full documentation in Sphinx
+format. Run `make html` in that directory to create HTML
+documentation.
+
+# Running the unit tests
+
+Beautiful Soup supports unit test discovery from the project root directory:
+
+```
+$ nosetests
+```
+
+```
+$ python -m unittest discover -s bs4
+```
+
+If you checked out the source tree, you should see a script in the
+home directory called test-all-versions. This script will run the unit
+tests under Python 2, then create a temporary Python 3 conversion of
+the source and run the unit tests again under Python 3.
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/TODO.txt b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/TODO.txt
new file mode 100644
index 00000000000..e26d6264dac
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/TODO.txt
@@ -0,0 +1,31 @@
+Additions
+---------
+
+More of the jQuery API: nextUntil?
+
+Optimizations
+-------------
+
+The html5lib tree builder doesn't use the standard tree-building API,
+which worries me and has resulted in a number of bugs.
+
+markup_attr_map can be optimized since it's always a map now.
+
+Upon encountering UTF-16LE data or some other uncommon serialization
+of Unicode, UnicodeDammit will convert the data to Unicode, then
+encode it at UTF-8. This is wasteful because it will just get decoded
+back to Unicode.
+
+CDATA
+-----
+
+The elementtree XMLParser has a strip_cdata argument that, when set to
+False, should allow Beautiful Soup to preserve CDATA sections instead
+of treating them as text. Except it doesn't. (This argument is also
+present for HTMLParser, and also does nothing there.)
+
+Currently, htm5lib converts CDATA sections into comments. An
+as-yet-unreleased version of html5lib changes the parser's handling of
+CDATA sections to allow CDATA sections in tags like <svg> and
+<math>. The HTML5TreeBuilder will need to be updated to create CData
+objects instead of Comment objects in this situation.
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/beautifulsoup4.egg-info/PKG-INFO b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/beautifulsoup4.egg-info/PKG-INFO
new file mode 100644
index 00000000000..c5685222994
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/beautifulsoup4.egg-info/PKG-INFO
@@ -0,0 +1,126 @@
+Metadata-Version: 2.1
+Name: beautifulsoup4
+Version: 4.9.3
+Summary: Screen-scraping library
+Home-page: http://www.crummy.com/software/BeautifulSoup/bs4/
+Author: Leonard Richardson
+Author-email: leonardr@segfault.org
+License: MIT
+Download-URL: http://www.crummy.com/software/BeautifulSoup/bs4/download/
+Description: Beautiful Soup is a library that makes it easy to scrape information
+ from web pages. It sits atop an HTML or XML parser, providing Pythonic
+ idioms for iterating, searching, and modifying the parse tree.
+
+ # Quick start
+
+ ```
+ >>> from bs4 import BeautifulSoup
+ >>> soup = BeautifulSoup("<p>Some<b>bad<i>HTML")
+ >>> print(soup.prettify())
+ <html>
+ <body>
+ <p>
+ Some
+ <b>
+ bad
+ <i>
+ HTML
+ </i>
+ </b>
+ </p>
+ </body>
+ </html>
+ >>> soup.find(text="bad")
+ 'bad'
+ >>> soup.i
+ <i>HTML</i>
+ #
+ >>> soup = BeautifulSoup("<tag1>Some<tag2/>bad<tag3>XML", "xml")
+ #
+ >>> print(soup.prettify())
+ <?xml version="1.0" encoding="utf-8"?>
+ <tag1>
+ Some
+ <tag2/>
+ bad
+ <tag3>
+ XML
+ </tag3>
+ </tag1>
+ ```
+
+ To go beyond the basics, [comprehensive documentation is available](http://www.crummy.com/software/BeautifulSoup/bs4/doc/).
+
+ # Links
+
+ * [Homepage](http://www.crummy.com/software/BeautifulSoup/bs4/)
+ * [Documentation](http://www.crummy.com/software/BeautifulSoup/bs4/doc/)
+ * [Discussion group](http://groups.google.com/group/beautifulsoup/)
+ * [Development](https://code.launchpad.net/beautifulsoup/)
+ * [Bug tracker](https://bugs.launchpad.net/beautifulsoup/)
+ * [Complete changelog](https://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/head:/CHANGELOG)
+
+ # Note on Python 2 sunsetting
+
+ Since 2012, Beautiful Soup has been developed as a Python 2 library
+ which is automatically converted to Python 3 code as necessary. This
+ makes it impossible to take advantage of some features of Python
+ 3.
+
+ For this reason, I plan to discontinue Beautiful Soup's Python 2
+ support at some point after December 31, 2020: one year after the
+ sunset date for Python 2 itself. Beyond that point, new Beautiful Soup
+ development will exclusively target Python 3. Of course, older
+ releases of Beautiful Soup, which support both versions, will continue
+ to be available.
+
+ # Supporting the project
+
+ If you use Beautiful Soup as part of your professional work, please consider a
+ [Tidelift subscription](https://tidelift.com/subscription/pkg/pypi-beautifulsoup4?utm_source=pypi-beautifulsoup4&utm_medium=referral&utm_campaign=readme).
+ This will support many of the free software projects your organization
+ depends on, not just Beautiful Soup.
+
+ If you use Beautiful Soup for personal projects, the best way to say
+ thank you is to read
+ [Tool Safety](https://www.crummy.com/software/BeautifulSoup/zine/), a zine I
+ wrote about what Beautiful Soup has taught me about software
+ development.
+
+ # Building the documentation
+
+ The bs4/doc/ directory contains full documentation in Sphinx
+ format. Run `make html` in that directory to create HTML
+ documentation.
+
+ # Running the unit tests
+
+ Beautiful Soup supports unit test discovery from the project root directory:
+
+ ```
+ $ nosetests
+ ```
+
+ ```
+ $ python -m unittest discover -s bs4
+ ```
+
+ If you checked out the source tree, you should see a script in the
+ home directory called test-all-versions. This script will run the unit
+ tests under Python 2, then create a temporary Python 3 conversion of
+ the source and run the unit tests again under Python 3.
+
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Topic :: Text Processing :: Markup :: HTML
+Classifier: Topic :: Text Processing :: Markup :: XML
+Classifier: Topic :: Text Processing :: Markup :: SGML
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Description-Content-Type: text/markdown
+Provides-Extra: html5lib
+Provides-Extra: lxml
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/beautifulsoup4.egg-info/SOURCES.txt b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/beautifulsoup4.egg-info/SOURCES.txt
new file mode 100644
index 00000000000..9eea8f35050
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/beautifulsoup4.egg-info/SOURCES.txt
@@ -0,0 +1,53 @@
+COPYING.txt
+LICENSE
+MANIFEST.in
+NEWS.txt
+README.md
+TODO.txt
+convert-py3k
+setup.cfg
+setup.py
+test-all-versions
+beautifulsoup4.egg-info/PKG-INFO
+beautifulsoup4.egg-info/SOURCES.txt
+beautifulsoup4.egg-info/dependency_links.txt
+beautifulsoup4.egg-info/requires.txt
+beautifulsoup4.egg-info/top_level.txt
+bs4/__init__.py
+bs4/dammit.py
+bs4/diagnose.py
+bs4/element.py
+bs4/formatter.py
+bs4/testing.py
+bs4/builder/__init__.py
+bs4/builder/_html5lib.py
+bs4/builder/_htmlparser.py
+bs4/builder/_lxml.py
+bs4/tests/__init__.py
+bs4/tests/test_builder_registry.py
+bs4/tests/test_docs.py
+bs4/tests/test_html5lib.py
+bs4/tests/test_htmlparser.py
+bs4/tests/test_lxml.py
+bs4/tests/test_soup.py
+bs4/tests/test_tree.py
+doc/Makefile
+doc.ptbr/Makefile
+doc.ptbr/source/6.1.jpg
+doc.ptbr/source/conf.py
+doc.ptbr/source/index.rst
+doc.ru/Makefile
+doc.ru/source/6.1.jpg
+doc.ru/source/bs4ru.rst
+doc.ru/source/conf.py
+doc.ru/source/index.rst
+doc.zh/Makefile
+doc.zh/source/6.1.jpg
+doc.zh/source/conf.py
+doc.zh/source/index.rst
+doc/source/6.1.jpg
+doc/source/check_doc.py
+doc/source/conf.py
+doc/source/index.rst
+scripts/demonstrate_parser_differences.py
+scripts/demonstration_markup.txt \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/beautifulsoup4.egg-info/dependency_links.txt b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/beautifulsoup4.egg-info/dependency_links.txt
new file mode 100644
index 00000000000..8b137891791
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/beautifulsoup4.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/beautifulsoup4.egg-info/requires.txt b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/beautifulsoup4.egg-info/requires.txt
new file mode 100644
index 00000000000..32caeaa4d64
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/beautifulsoup4.egg-info/requires.txt
@@ -0,0 +1,12 @@
+
+[:python_version < "3.0"]
+soupsieve<2.0,>1.2
+
+[:python_version >= "3.0"]
+soupsieve>1.2
+
+[html5lib]
+html5lib
+
+[lxml]
+lxml
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/beautifulsoup4.egg-info/top_level.txt b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/beautifulsoup4.egg-info/top_level.txt
new file mode 100644
index 00000000000..13154420d48
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/beautifulsoup4.egg-info/top_level.txt
@@ -0,0 +1 @@
+bs4
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/__init__.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/__init__.py
new file mode 100644
index 00000000000..8f78809b313
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/__init__.py
@@ -0,0 +1,791 @@
+"""Beautiful Soup Elixir and Tonic - "The Screen-Scraper's Friend".
+
+http://www.crummy.com/software/BeautifulSoup/
+
+Beautiful Soup uses a pluggable XML or HTML parser to parse a
+(possibly invalid) document into a tree representation. Beautiful Soup
+provides methods and Pythonic idioms that make it easy to navigate,
+search, and modify the parse tree.
+
+Beautiful Soup works with Python 2.7 and up. It works better if lxml
+and/or html5lib is installed.
+
+For more than you ever wanted to know about Beautiful Soup, see the
+documentation: http://www.crummy.com/software/BeautifulSoup/bs4/doc/
+"""
+
+__author__ = "Leonard Richardson (leonardr@segfault.org)"
+__version__ = "4.9.3"
+__copyright__ = "Copyright (c) 2004-2020 Leonard Richardson"
+# Use of this source code is governed by the MIT license.
+__license__ = "MIT"
+
+__all__ = ['BeautifulSoup']
+
+from collections import Counter
+import os
+import re
+import sys
+import traceback
+import warnings
+
+from .builder import builder_registry, ParserRejectedMarkup
+from .dammit import UnicodeDammit
+from .element import (
+ CData,
+ Comment,
+ DEFAULT_OUTPUT_ENCODING,
+ Declaration,
+ Doctype,
+ NavigableString,
+ PageElement,
+ ProcessingInstruction,
+ PYTHON_SPECIFIC_ENCODINGS,
+ ResultSet,
+ Script,
+ Stylesheet,
+ SoupStrainer,
+ Tag,
+ TemplateString,
+ )
+
+# The very first thing we do is give a useful error if someone is
+# running this code under Python 3 without converting it.
+'You are trying to run the Python 2 version of Beautiful Soup under Python 3. This will not work.'<>'You need to convert the code, either by installing it (`python setup.py install`) or by running 2to3 (`2to3 -w bs4`).'
+
+# Define some custom warnings.
+class GuessedAtParserWarning(UserWarning):
+ """The warning issued when BeautifulSoup has to guess what parser to
+ use -- probably because no parser was specified in the constructor.
+ """
+
+class MarkupResemblesLocatorWarning(UserWarning):
+ """The warning issued when BeautifulSoup is given 'markup' that
+ actually looks like a resource locator -- a URL or a path to a file
+ on disk.
+ """
+
+
+class BeautifulSoup(Tag):
+ """A data structure representing a parsed HTML or XML document.
+
+ Most of the methods you'll call on a BeautifulSoup object are inherited from
+ PageElement or Tag.
+
+ Internally, this class defines the basic interface called by the
+ tree builders when converting an HTML/XML document into a data
+ structure. The interface abstracts away the differences between
+ parsers. To write a new tree builder, you'll need to understand
+ these methods as a whole.
+
+ These methods will be called by the BeautifulSoup constructor:
+ * reset()
+ * feed(markup)
+
+ The tree builder may call these methods from its feed() implementation:
+ * handle_starttag(name, attrs) # See note about return value
+ * handle_endtag(name)
+ * handle_data(data) # Appends to the current data node
+ * endData(containerClass) # Ends the current data node
+
+ No matter how complicated the underlying parser is, you should be
+ able to build a tree using 'start tag' events, 'end tag' events,
+ 'data' events, and "done with data" events.
+
+ If you encounter an empty-element tag (aka a self-closing tag,
+ like HTML's <br> tag), call handle_starttag and then
+ handle_endtag.
+ """
+
+ # Since BeautifulSoup subclasses Tag, it's possible to treat it as
+ # a Tag with a .name. This name makes it clear the BeautifulSoup
+ # object isn't a real markup tag.
+ ROOT_TAG_NAME = u'[document]'
+
+ # If the end-user gives no indication which tree builder they
+ # want, look for one with these features.
+ DEFAULT_BUILDER_FEATURES = ['html', 'fast']
+
+ # A string containing all ASCII whitespace characters, used in
+ # endData() to detect data chunks that seem 'empty'.
+ ASCII_SPACES = '\x20\x0a\x09\x0c\x0d'
+
+ NO_PARSER_SPECIFIED_WARNING = "No parser was explicitly specified, so I'm using the best available %(markup_type)s parser for this system (\"%(parser)s\"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.\n\nThe code that caused this warning is on line %(line_number)s of the file %(filename)s. To get rid of this warning, pass the additional argument 'features=\"%(parser)s\"' to the BeautifulSoup constructor.\n"
+
+ def __init__(self, markup="", features=None, builder=None,
+ parse_only=None, from_encoding=None, exclude_encodings=None,
+ element_classes=None, **kwargs):
+ """Constructor.
+
+ :param markup: A string or a file-like object representing
+ markup to be parsed.
+
+ :param features: Desirable features of the parser to be
+ used. This may be the name of a specific parser ("lxml",
+ "lxml-xml", "html.parser", or "html5lib") or it may be the
+ type of markup to be used ("html", "html5", "xml"). It's
+ recommended that you name a specific parser, so that
+ Beautiful Soup gives you the same results across platforms
+ and virtual environments.
+
+ :param builder: A TreeBuilder subclass to instantiate (or
+ instance to use) instead of looking one up based on
+ `features`. You only need to use this if you've implemented a
+ custom TreeBuilder.
+
+ :param parse_only: A SoupStrainer. Only parts of the document
+ matching the SoupStrainer will be considered. This is useful
+ when parsing part of a document that would otherwise be too
+ large to fit into memory.
+
+ :param from_encoding: A string indicating the encoding of the
+ document to be parsed. Pass this in if Beautiful Soup is
+ guessing wrongly about the document's encoding.
+
+ :param exclude_encodings: A list of strings indicating
+ encodings known to be wrong. Pass this in if you don't know
+ the document's encoding but you know Beautiful Soup's guess is
+ wrong.
+
+ :param element_classes: A dictionary mapping BeautifulSoup
+ classes like Tag and NavigableString, to other classes you'd
+ like to be instantiated instead as the parse tree is
+ built. This is useful for subclassing Tag or NavigableString
+ to modify default behavior.
+
+ :param kwargs: For backwards compatibility purposes, the
+ constructor accepts certain keyword arguments used in
+ Beautiful Soup 3. None of these arguments do anything in
+ Beautiful Soup 4; they will result in a warning and then be
+ ignored.
+
+ Apart from this, any keyword arguments passed into the
+ BeautifulSoup constructor are propagated to the TreeBuilder
+ constructor. This makes it possible to configure a
+ TreeBuilder by passing in arguments, not just by saying which
+ one to use.
+ """
+ if 'convertEntities' in kwargs:
+ del kwargs['convertEntities']
+ warnings.warn(
+ "BS4 does not respect the convertEntities argument to the "
+ "BeautifulSoup constructor. Entities are always converted "
+ "to Unicode characters.")
+
+ if 'markupMassage' in kwargs:
+ del kwargs['markupMassage']
+ warnings.warn(
+ "BS4 does not respect the markupMassage argument to the "
+ "BeautifulSoup constructor. The tree builder is responsible "
+ "for any necessary markup massage.")
+
+ if 'smartQuotesTo' in kwargs:
+ del kwargs['smartQuotesTo']
+ warnings.warn(
+ "BS4 does not respect the smartQuotesTo argument to the "
+ "BeautifulSoup constructor. Smart quotes are always converted "
+ "to Unicode characters.")
+
+ if 'selfClosingTags' in kwargs:
+ del kwargs['selfClosingTags']
+ warnings.warn(
+ "BS4 does not respect the selfClosingTags argument to the "
+ "BeautifulSoup constructor. The tree builder is responsible "
+ "for understanding self-closing tags.")
+
+ if 'isHTML' in kwargs:
+ del kwargs['isHTML']
+ warnings.warn(
+ "BS4 does not respect the isHTML argument to the "
+ "BeautifulSoup constructor. Suggest you use "
+ "features='lxml' for HTML and features='lxml-xml' for "
+ "XML.")
+
+ def deprecated_argument(old_name, new_name):
+ if old_name in kwargs:
+ warnings.warn(
+ 'The "%s" argument to the BeautifulSoup constructor '
+ 'has been renamed to "%s."' % (old_name, new_name))
+ value = kwargs[old_name]
+ del kwargs[old_name]
+ return value
+ return None
+
+ parse_only = parse_only or deprecated_argument(
+ "parseOnlyThese", "parse_only")
+
+ from_encoding = from_encoding or deprecated_argument(
+ "fromEncoding", "from_encoding")
+
+ if from_encoding and isinstance(markup, unicode):
+ warnings.warn("You provided Unicode markup but also provided a value for from_encoding. Your from_encoding will be ignored.")
+ from_encoding = None
+
+ self.element_classes = element_classes or dict()
+
+ # We need this information to track whether or not the builder
+ # was specified well enough that we can omit the 'you need to
+ # specify a parser' warning.
+ original_builder = builder
+ original_features = features
+
+ if isinstance(builder, type):
+ # A builder class was passed in; it needs to be instantiated.
+ builder_class = builder
+ builder = None
+ elif builder is None:
+ if isinstance(features, basestring):
+ features = [features]
+ if features is None or len(features) == 0:
+ features = self.DEFAULT_BUILDER_FEATURES
+ builder_class = builder_registry.lookup(*features)
+ if builder_class is None:
+ raise FeatureNotFound(
+ "Couldn't find a tree builder with the features you "
+ "requested: %s. Do you need to install a parser library?"
+ % ",".join(features))
+
+ # At this point either we have a TreeBuilder instance in
+ # builder, or we have a builder_class that we can instantiate
+ # with the remaining **kwargs.
+ if builder is None:
+ builder = builder_class(**kwargs)
+ if not original_builder and not (
+ original_features == builder.NAME or
+ original_features in builder.ALTERNATE_NAMES
+ ) and markup:
+ # The user did not tell us which TreeBuilder to use,
+ # and we had to guess. Issue a warning.
+ if builder.is_xml:
+ markup_type = "XML"
+ else:
+ markup_type = "HTML"
+
+ # This code adapted from warnings.py so that we get the same line
+ # of code as our warnings.warn() call gets, even if the answer is wrong
+ # (as it may be in a multithreading situation).
+ caller = None
+ try:
+ caller = sys._getframe(1)
+ except ValueError:
+ pass
+ if caller:
+ globals = caller.f_globals
+ line_number = caller.f_lineno
+ else:
+ globals = sys.__dict__
+ line_number= 1
+ filename = globals.get('__file__')
+ if filename:
+ fnl = filename.lower()
+ if fnl.endswith((".pyc", ".pyo")):
+ filename = filename[:-1]
+ if filename:
+ # If there is no filename at all, the user is most likely in a REPL,
+ # and the warning is not necessary.
+ values = dict(
+ filename=filename,
+ line_number=line_number,
+ parser=builder.NAME,
+ markup_type=markup_type
+ )
+ warnings.warn(
+ self.NO_PARSER_SPECIFIED_WARNING % values,
+ GuessedAtParserWarning, stacklevel=2
+ )
+ else:
+ if kwargs:
+ warnings.warn("Keyword arguments to the BeautifulSoup constructor will be ignored. These would normally be passed into the TreeBuilder constructor, but a TreeBuilder instance was passed in as `builder`.")
+
+ self.builder = builder
+ self.is_xml = builder.is_xml
+ self.known_xml = self.is_xml
+ self._namespaces = dict()
+ self.parse_only = parse_only
+
+ self.builder.initialize_soup(self)
+
+ if hasattr(markup, 'read'): # It's a file-type object.
+ markup = markup.read()
+ elif len(markup) <= 256 and (
+ (isinstance(markup, bytes) and not b'<' in markup)
+ or (isinstance(markup, unicode) and not u'<' in markup)
+ ):
+ # Print out warnings for a couple beginner problems
+ # involving passing non-markup to Beautiful Soup.
+ # Beautiful Soup will still parse the input as markup,
+ # just in case that's what the user really wants.
+ if (isinstance(markup, unicode)
+ and not os.path.supports_unicode_filenames):
+ possible_filename = markup.encode("utf8")
+ else:
+ possible_filename = markup
+ is_file = False
+ try:
+ is_file = os.path.exists(possible_filename)
+ except Exception, e:
+ # This is almost certainly a problem involving
+ # characters not valid in filenames on this
+ # system. Just let it go.
+ pass
+ if is_file:
+ warnings.warn(
+ '"%s" looks like a filename, not markup. You should'
+ ' probably open this file and pass the filehandle into'
+ ' Beautiful Soup.' % self._decode_markup(markup),
+ MarkupResemblesLocatorWarning
+ )
+ self._check_markup_is_url(markup)
+
+ rejections = []
+ success = False
+ for (self.markup, self.original_encoding, self.declared_html_encoding,
+ self.contains_replacement_characters) in (
+ self.builder.prepare_markup(
+ markup, from_encoding, exclude_encodings=exclude_encodings)):
+ self.reset()
+ try:
+ self._feed()
+ success = True
+ break
+ except ParserRejectedMarkup as e:
+ rejections.append(e)
+ pass
+
+ if not success:
+ other_exceptions = [unicode(e) for e in rejections]
+ raise ParserRejectedMarkup(
+ u"The markup you provided was rejected by the parser. Trying a different parser or a different encoding may help.\n\nOriginal exception(s) from parser:\n " + "\n ".join(other_exceptions)
+ )
+
+ # Clear out the markup and remove the builder's circular
+ # reference to this object.
+ self.markup = None
+ self.builder.soup = None
+
+ def __copy__(self):
+ """Copy a BeautifulSoup object by converting the document to a string and parsing it again."""
+ copy = type(self)(
+ self.encode('utf-8'), builder=self.builder, from_encoding='utf-8'
+ )
+
+ # Although we encoded the tree to UTF-8, that may not have
+ # been the encoding of the original markup. Set the copy's
+ # .original_encoding to reflect the original object's
+ # .original_encoding.
+ copy.original_encoding = self.original_encoding
+ return copy
+
+ def __getstate__(self):
+ # Frequently a tree builder can't be pickled.
+ d = dict(self.__dict__)
+ if 'builder' in d and not self.builder.picklable:
+ d['builder'] = None
+ return d
+
+ @classmethod
+ def _decode_markup(cls, markup):
+ """Ensure `markup` is bytes so it's safe to send into warnings.warn.
+
+ TODO: warnings.warn had this problem back in 2010 but it might not
+ anymore.
+ """
+ if isinstance(markup, bytes):
+ decoded = markup.decode('utf-8', 'replace')
+ else:
+ decoded = markup
+ return decoded
+
+ @classmethod
+ def _check_markup_is_url(cls, markup):
+ """Error-handling method to raise a warning if incoming markup looks
+ like a URL.
+
+ :param markup: A string.
+ """
+ if isinstance(markup, bytes):
+ space = b' '
+ cant_start_with = (b"http:", b"https:")
+ elif isinstance(markup, unicode):
+ space = u' '
+ cant_start_with = (u"http:", u"https:")
+ else:
+ return
+
+ if any(markup.startswith(prefix) for prefix in cant_start_with):
+ if not space in markup:
+ warnings.warn(
+ '"%s" looks like a URL. Beautiful Soup is not an'
+ ' HTTP client. You should probably use an HTTP client like'
+ ' requests to get the document behind the URL, and feed'
+ ' that document to Beautiful Soup.' % cls._decode_markup(
+ markup
+ ),
+ MarkupResemblesLocatorWarning
+ )
+
+ def _feed(self):
+ """Internal method that parses previously set markup, creating a large
+ number of Tag and NavigableString objects.
+ """
+ # Convert the document to Unicode.
+ self.builder.reset()
+
+ self.builder.feed(self.markup)
+ # Close out any unfinished strings and close all the open tags.
+ self.endData()
+ while self.currentTag.name != self.ROOT_TAG_NAME:
+ self.popTag()
+
+ def reset(self):
+ """Reset this object to a state as though it had never parsed any
+ markup.
+ """
+ Tag.__init__(self, self, self.builder, self.ROOT_TAG_NAME)
+ self.hidden = 1
+ self.builder.reset()
+ self.current_data = []
+ self.currentTag = None
+ self.tagStack = []
+ self.open_tag_counter = Counter()
+ self.preserve_whitespace_tag_stack = []
+ self.string_container_stack = []
+ self.pushTag(self)
+
+ def new_tag(self, name, namespace=None, nsprefix=None, attrs={},
+ sourceline=None, sourcepos=None, **kwattrs):
+ """Create a new Tag associated with this BeautifulSoup object.
+
+ :param name: The name of the new Tag.
+ :param namespace: The URI of the new Tag's XML namespace, if any.
+ :param prefix: The prefix for the new Tag's XML namespace, if any.
+ :param attrs: A dictionary of this Tag's attribute values; can
+ be used instead of `kwattrs` for attributes like 'class'
+ that are reserved words in Python.
+ :param sourceline: The line number where this tag was
+ (purportedly) found in its source document.
+ :param sourcepos: The character position within `sourceline` where this
+ tag was (purportedly) found.
+ :param kwattrs: Keyword arguments for the new Tag's attribute values.
+
+ """
+ kwattrs.update(attrs)
+ return self.element_classes.get(Tag, Tag)(
+ None, self.builder, name, namespace, nsprefix, kwattrs,
+ sourceline=sourceline, sourcepos=sourcepos
+ )
+
+ def string_container(self, base_class=None):
+ container = base_class or NavigableString
+
+ # There may be a general override of NavigableString.
+ container = self.element_classes.get(
+ container, container
+ )
+
+ # On top of that, we may be inside a tag that needs a special
+ # container class.
+ if self.string_container_stack:
+ container = self.builder.string_containers.get(
+ self.string_container_stack[-1].name, container
+ )
+ return container
+
+ def new_string(self, s, subclass=None):
+ """Create a new NavigableString associated with this BeautifulSoup
+ object.
+ """
+ container = self.string_container(subclass)
+ return container(s)
+
+ def insert_before(self, *args):
+ """This method is part of the PageElement API, but `BeautifulSoup` doesn't implement
+ it because there is nothing before or after it in the parse tree.
+ """
+ raise NotImplementedError("BeautifulSoup objects don't support insert_before().")
+
+ def insert_after(self, *args):
+ """This method is part of the PageElement API, but `BeautifulSoup` doesn't implement
+ it because there is nothing before or after it in the parse tree.
+ """
+ raise NotImplementedError("BeautifulSoup objects don't support insert_after().")
+
+ def popTag(self):
+ """Internal method called by _popToTag when a tag is closed."""
+ tag = self.tagStack.pop()
+ if tag.name in self.open_tag_counter:
+ self.open_tag_counter[tag.name] -= 1
+ if self.preserve_whitespace_tag_stack and tag == self.preserve_whitespace_tag_stack[-1]:
+ self.preserve_whitespace_tag_stack.pop()
+ if self.string_container_stack and tag == self.string_container_stack[-1]:
+ self.string_container_stack.pop()
+ #print("Pop", tag.name)
+ if self.tagStack:
+ self.currentTag = self.tagStack[-1]
+ return self.currentTag
+
+ def pushTag(self, tag):
+ """Internal method called by handle_starttag when a tag is opened."""
+ #print("Push", tag.name)
+ if self.currentTag is not None:
+ self.currentTag.contents.append(tag)
+ self.tagStack.append(tag)
+ self.currentTag = self.tagStack[-1]
+ if tag.name != self.ROOT_TAG_NAME:
+ self.open_tag_counter[tag.name] += 1
+ if tag.name in self.builder.preserve_whitespace_tags:
+ self.preserve_whitespace_tag_stack.append(tag)
+ if tag.name in self.builder.string_containers:
+ self.string_container_stack.append(tag)
+
+ def endData(self, containerClass=None):
+ """Method called by the TreeBuilder when the end of a data segment
+ occurs.
+ """
+ containerClass = self.string_container(containerClass)
+
+ if self.current_data:
+ current_data = u''.join(self.current_data)
+ # If whitespace is not preserved, and this string contains
+ # nothing but ASCII spaces, replace it with a single space
+ # or newline.
+ if not self.preserve_whitespace_tag_stack:
+ strippable = True
+ for i in current_data:
+ if i not in self.ASCII_SPACES:
+ strippable = False
+ break
+ if strippable:
+ if '\n' in current_data:
+ current_data = '\n'
+ else:
+ current_data = ' '
+
+ # Reset the data collector.
+ self.current_data = []
+
+ # Should we add this string to the tree at all?
+ if self.parse_only and len(self.tagStack) <= 1 and \
+ (not self.parse_only.text or \
+ not self.parse_only.search(current_data)):
+ return
+
+ o = containerClass(current_data)
+ self.object_was_parsed(o)
+
+ def object_was_parsed(self, o, parent=None, most_recent_element=None):
+ """Method called by the TreeBuilder to integrate an object into the parse tree."""
+ if parent is None:
+ parent = self.currentTag
+ if most_recent_element is not None:
+ previous_element = most_recent_element
+ else:
+ previous_element = self._most_recent_element
+
+ next_element = previous_sibling = next_sibling = None
+ if isinstance(o, Tag):
+ next_element = o.next_element
+ next_sibling = o.next_sibling
+ previous_sibling = o.previous_sibling
+ if previous_element is None:
+ previous_element = o.previous_element
+
+ fix = parent.next_element is not None
+
+ o.setup(parent, previous_element, next_element, previous_sibling, next_sibling)
+
+ self._most_recent_element = o
+ parent.contents.append(o)
+
+ # Check if we are inserting into an already parsed node.
+ if fix:
+ self._linkage_fixer(parent)
+
+ def _linkage_fixer(self, el):
+ """Make sure linkage of this fragment is sound."""
+
+ first = el.contents[0]
+ child = el.contents[-1]
+ descendant = child
+
+ if child is first and el.parent is not None:
+ # Parent should be linked to first child
+ el.next_element = child
+ # We are no longer linked to whatever this element is
+ prev_el = child.previous_element
+ if prev_el is not None and prev_el is not el:
+ prev_el.next_element = None
+ # First child should be linked to the parent, and no previous siblings.
+ child.previous_element = el
+ child.previous_sibling = None
+
+ # We have no sibling as we've been appended as the last.
+ child.next_sibling = None
+
+ # This index is a tag, dig deeper for a "last descendant"
+ if isinstance(child, Tag) and child.contents:
+ descendant = child._last_descendant(False)
+
+ # As the final step, link last descendant. It should be linked
+ # to the parent's next sibling (if found), else walk up the chain
+ # and find a parent with a sibling. It should have no next sibling.
+ descendant.next_element = None
+ descendant.next_sibling = None
+ target = el
+ while True:
+ if target is None:
+ break
+ elif target.next_sibling is not None:
+ descendant.next_element = target.next_sibling
+ target.next_sibling.previous_element = child
+ break
+ target = target.parent
+
+ def _popToTag(self, name, nsprefix=None, inclusivePop=True):
+ """Pops the tag stack up to and including the most recent
+ instance of the given tag.
+
+ If there are no open tags with the given name, nothing will be
+ popped.
+
+ :param name: Pop up to the most recent tag with this name.
+ :param nsprefix: The namespace prefix that goes with `name`.
+ :param inclusivePop: It this is false, pops the tag stack up
+ to but *not* including the most recent instqance of the
+ given tag.
+
+ """
+ #print("Popping to %s" % name)
+ if name == self.ROOT_TAG_NAME:
+ # The BeautifulSoup object itself can never be popped.
+ return
+
+ most_recently_popped = None
+
+ stack_size = len(self.tagStack)
+ for i in range(stack_size - 1, 0, -1):
+ if not self.open_tag_counter.get(name):
+ break
+ t = self.tagStack[i]
+ if (name == t.name and nsprefix == t.prefix):
+ if inclusivePop:
+ most_recently_popped = self.popTag()
+ break
+ most_recently_popped = self.popTag()
+
+ return most_recently_popped
+
+ def handle_starttag(self, name, namespace, nsprefix, attrs, sourceline=None,
+ sourcepos=None):
+ """Called by the tree builder when a new tag is encountered.
+
+ :param name: Name of the tag.
+ :param nsprefix: Namespace prefix for the tag.
+ :param attrs: A dictionary of attribute values.
+ :param sourceline: The line number where this tag was found in its
+ source document.
+ :param sourcepos: The character position within `sourceline` where this
+ tag was found.
+
+ If this method returns None, the tag was rejected by an active
+ SoupStrainer. You should proceed as if the tag had not occurred
+ in the document. For instance, if this was a self-closing tag,
+ don't call handle_endtag.
+ """
+ # print("Start tag %s: %s" % (name, attrs))
+ self.endData()
+
+ if (self.parse_only and len(self.tagStack) <= 1
+ and (self.parse_only.text
+ or not self.parse_only.search_tag(name, attrs))):
+ return None
+
+ tag = self.element_classes.get(Tag, Tag)(
+ self, self.builder, name, namespace, nsprefix, attrs,
+ self.currentTag, self._most_recent_element,
+ sourceline=sourceline, sourcepos=sourcepos
+ )
+ if tag is None:
+ return tag
+ if self._most_recent_element is not None:
+ self._most_recent_element.next_element = tag
+ self._most_recent_element = tag
+ self.pushTag(tag)
+ return tag
+
+ def handle_endtag(self, name, nsprefix=None):
+ """Called by the tree builder when an ending tag is encountered.
+
+ :param name: Name of the tag.
+ :param nsprefix: Namespace prefix for the tag.
+ """
+ #print("End tag: " + name)
+ self.endData()
+ self._popToTag(name, nsprefix)
+
+ def handle_data(self, data):
+ """Called by the tree builder when a chunk of textual data is encountered."""
+ self.current_data.append(data)
+
+ def decode(self, pretty_print=False,
+ eventual_encoding=DEFAULT_OUTPUT_ENCODING,
+ formatter="minimal"):
+ """Returns a string or Unicode representation of the parse tree
+ as an HTML or XML document.
+
+ :param pretty_print: If this is True, indentation will be used to
+ make the document more readable.
+ :param eventual_encoding: The encoding of the final document.
+ If this is None, the document will be a Unicode string.
+ """
+ if self.is_xml:
+ # Print the XML declaration
+ encoding_part = ''
+ if eventual_encoding in PYTHON_SPECIFIC_ENCODINGS:
+ # This is a special Python encoding; it can't actually
+ # go into an XML document because it means nothing
+ # outside of Python.
+ eventual_encoding = None
+ if eventual_encoding != None:
+ encoding_part = ' encoding="%s"' % eventual_encoding
+ prefix = u'<?xml version="1.0"%s?>\n' % encoding_part
+ else:
+ prefix = u''
+ if not pretty_print:
+ indent_level = None
+ else:
+ indent_level = 0
+ return prefix + super(BeautifulSoup, self).decode(
+ indent_level, eventual_encoding, formatter)
+
+# Aliases to make it easier to get started quickly, e.g. 'from bs4 import _soup'
+_s = BeautifulSoup
+_soup = BeautifulSoup
+
+class BeautifulStoneSoup(BeautifulSoup):
+ """Deprecated interface to an XML parser."""
+
+ def __init__(self, *args, **kwargs):
+ kwargs['features'] = 'xml'
+ warnings.warn(
+ 'The BeautifulStoneSoup class is deprecated. Instead of using '
+ 'it, pass features="xml" into the BeautifulSoup constructor.')
+ super(BeautifulStoneSoup, self).__init__(*args, **kwargs)
+
+
+class StopParsing(Exception):
+ """Exception raised by a TreeBuilder if it's unable to continue parsing."""
+ pass
+
+class FeatureNotFound(ValueError):
+ """Exception raised by the BeautifulSoup constructor if no parser with the
+ requested features is found.
+ """
+ pass
+
+
+#If this file is run as a script, act as an HTML pretty-printer.
+if __name__ == '__main__':
+ import sys
+ soup = BeautifulSoup(sys.stdin)
+ print(soup.prettify())
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/builder/__init__.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/builder/__init__.py
new file mode 100644
index 00000000000..03da4c6e40c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/builder/__init__.py
@@ -0,0 +1,519 @@
+# Use of this source code is governed by the MIT license.
+__license__ = "MIT"
+
+from collections import defaultdict
+import itertools
+import sys
+from bs4.element import (
+ CharsetMetaAttributeValue,
+ ContentMetaAttributeValue,
+ Stylesheet,
+ Script,
+ TemplateString,
+ nonwhitespace_re
+)
+
+__all__ = [
+ 'HTMLTreeBuilder',
+ 'SAXTreeBuilder',
+ 'TreeBuilder',
+ 'TreeBuilderRegistry',
+ ]
+
+# Some useful features for a TreeBuilder to have.
+FAST = 'fast'
+PERMISSIVE = 'permissive'
+STRICT = 'strict'
+XML = 'xml'
+HTML = 'html'
+HTML_5 = 'html5'
+
+
+class TreeBuilderRegistry(object):
+ """A way of looking up TreeBuilder subclasses by their name or by desired
+ features.
+ """
+
+ def __init__(self):
+ self.builders_for_feature = defaultdict(list)
+ self.builders = []
+
+ def register(self, treebuilder_class):
+ """Register a treebuilder based on its advertised features.
+
+ :param treebuilder_class: A subclass of Treebuilder. its .features
+ attribute should list its features.
+ """
+ for feature in treebuilder_class.features:
+ self.builders_for_feature[feature].insert(0, treebuilder_class)
+ self.builders.insert(0, treebuilder_class)
+
+ def lookup(self, *features):
+ """Look up a TreeBuilder subclass with the desired features.
+
+ :param features: A list of features to look for. If none are
+ provided, the most recently registered TreeBuilder subclass
+ will be used.
+ :return: A TreeBuilder subclass, or None if there's no
+ registered subclass with all the requested features.
+ """
+ if len(self.builders) == 0:
+ # There are no builders at all.
+ return None
+
+ if len(features) == 0:
+ # They didn't ask for any features. Give them the most
+ # recently registered builder.
+ return self.builders[0]
+
+ # Go down the list of features in order, and eliminate any builders
+ # that don't match every feature.
+ features = list(features)
+ features.reverse()
+ candidates = None
+ candidate_set = None
+ while len(features) > 0:
+ feature = features.pop()
+ we_have_the_feature = self.builders_for_feature.get(feature, [])
+ if len(we_have_the_feature) > 0:
+ if candidates is None:
+ candidates = we_have_the_feature
+ candidate_set = set(candidates)
+ else:
+ # Eliminate any candidates that don't have this feature.
+ candidate_set = candidate_set.intersection(
+ set(we_have_the_feature))
+
+ # The only valid candidates are the ones in candidate_set.
+ # Go through the original list of candidates and pick the first one
+ # that's in candidate_set.
+ if candidate_set is None:
+ return None
+ for candidate in candidates:
+ if candidate in candidate_set:
+ return candidate
+ return None
+
+# The BeautifulSoup class will take feature lists from developers and use them
+# to look up builders in this registry.
+builder_registry = TreeBuilderRegistry()
+
+class TreeBuilder(object):
+ """Turn a textual document into a Beautiful Soup object tree."""
+
+ NAME = "[Unknown tree builder]"
+ ALTERNATE_NAMES = []
+ features = []
+
+ is_xml = False
+ picklable = False
+ empty_element_tags = None # A tag will be considered an empty-element
+ # tag when and only when it has no contents.
+
+ # A value for these tag/attribute combinations is a space- or
+ # comma-separated list of CDATA, rather than a single CDATA.
+ DEFAULT_CDATA_LIST_ATTRIBUTES = {}
+
+ # Whitespace should be preserved inside these tags.
+ DEFAULT_PRESERVE_WHITESPACE_TAGS = set()
+
+ # The textual contents of tags with these names should be
+ # instantiated with some class other than NavigableString.
+ DEFAULT_STRING_CONTAINERS = {}
+
+ USE_DEFAULT = object()
+
+ # Most parsers don't keep track of line numbers.
+ TRACKS_LINE_NUMBERS = False
+
+ def __init__(self, multi_valued_attributes=USE_DEFAULT,
+ preserve_whitespace_tags=USE_DEFAULT,
+ store_line_numbers=USE_DEFAULT,
+ string_containers=USE_DEFAULT,
+ ):
+ """Constructor.
+
+ :param multi_valued_attributes: If this is set to None, the
+ TreeBuilder will not turn any values for attributes like
+ 'class' into lists. Setting this to a dictionary will
+ customize this behavior; look at DEFAULT_CDATA_LIST_ATTRIBUTES
+ for an example.
+
+ Internally, these are called "CDATA list attributes", but that
+ probably doesn't make sense to an end-user, so the argument name
+ is `multi_valued_attributes`.
+
+ :param preserve_whitespace_tags: A list of tags to treat
+ the way <pre> tags are treated in HTML. Tags in this list
+ are immune from pretty-printing; their contents will always be
+ output as-is.
+
+ :param string_containers: A dictionary mapping tag names to
+ the classes that should be instantiated to contain the textual
+ contents of those tags. The default is to use NavigableString
+ for every tag, no matter what the name. You can override the
+ default by changing DEFAULT_STRING_CONTAINERS.
+
+ :param store_line_numbers: If the parser keeps track of the
+ line numbers and positions of the original markup, that
+ information will, by default, be stored in each corresponding
+ `Tag` object. You can turn this off by passing
+ store_line_numbers=False. If the parser you're using doesn't
+ keep track of this information, then setting store_line_numbers=True
+ will do nothing.
+ """
+ self.soup = None
+ if multi_valued_attributes is self.USE_DEFAULT:
+ multi_valued_attributes = self.DEFAULT_CDATA_LIST_ATTRIBUTES
+ self.cdata_list_attributes = multi_valued_attributes
+ if preserve_whitespace_tags is self.USE_DEFAULT:
+ preserve_whitespace_tags = self.DEFAULT_PRESERVE_WHITESPACE_TAGS
+ self.preserve_whitespace_tags = preserve_whitespace_tags
+ if store_line_numbers == self.USE_DEFAULT:
+ store_line_numbers = self.TRACKS_LINE_NUMBERS
+ self.store_line_numbers = store_line_numbers
+ if string_containers == self.USE_DEFAULT:
+ string_containers = self.DEFAULT_STRING_CONTAINERS
+ self.string_containers = string_containers
+
+ def initialize_soup(self, soup):
+ """The BeautifulSoup object has been initialized and is now
+ being associated with the TreeBuilder.
+
+ :param soup: A BeautifulSoup object.
+ """
+ self.soup = soup
+
+ def reset(self):
+ """Do any work necessary to reset the underlying parser
+ for a new document.
+
+ By default, this does nothing.
+ """
+ pass
+
+ def can_be_empty_element(self, tag_name):
+ """Might a tag with this name be an empty-element tag?
+
+ The final markup may or may not actually present this tag as
+ self-closing.
+
+ For instance: an HTMLBuilder does not consider a <p> tag to be
+ an empty-element tag (it's not in
+ HTMLBuilder.empty_element_tags). This means an empty <p> tag
+ will be presented as "<p></p>", not "<p/>" or "<p>".
+
+ The default implementation has no opinion about which tags are
+ empty-element tags, so a tag will be presented as an
+ empty-element tag if and only if it has no children.
+ "<foo></foo>" will become "<foo/>", and "<foo>bar</foo>" will
+ be left alone.
+
+ :param tag_name: The name of a markup tag.
+ """
+ if self.empty_element_tags is None:
+ return True
+ return tag_name in self.empty_element_tags
+
+ def feed(self, markup):
+ """Run some incoming markup through some parsing process,
+ populating the `BeautifulSoup` object in self.soup.
+
+ This method is not implemented in TreeBuilder; it must be
+ implemented in subclasses.
+
+ :return: None.
+ """
+ raise NotImplementedError()
+
+ def prepare_markup(self, markup, user_specified_encoding=None,
+ document_declared_encoding=None, exclude_encodings=None):
+ """Run any preliminary steps necessary to make incoming markup
+ acceptable to the parser.
+
+ :param markup: Some markup -- probably a bytestring.
+ :param user_specified_encoding: The user asked to try this encoding.
+ :param document_declared_encoding: The markup itself claims to be
+ in this encoding.
+ :param exclude_encodings: The user asked _not_ to try any of
+ these encodings.
+
+ :yield: A series of 4-tuples:
+ (markup, encoding, declared encoding,
+ has undergone character replacement)
+
+ Each 4-tuple represents a strategy for converting the
+ document to Unicode and parsing it. Each strategy will be tried
+ in turn.
+
+ By default, the only strategy is to parse the markup
+ as-is. See `LXMLTreeBuilderForXML` and
+ `HTMLParserTreeBuilder` for implementations that take into
+ account the quirks of particular parsers.
+ """
+ yield markup, None, None, False
+
+ def test_fragment_to_document(self, fragment):
+ """Wrap an HTML fragment to make it look like a document.
+
+ Different parsers do this differently. For instance, lxml
+ introduces an empty <head> tag, and html5lib
+ doesn't. Abstracting this away lets us write simple tests
+ which run HTML fragments through the parser and compare the
+ results against other HTML fragments.
+
+ This method should not be used outside of tests.
+
+ :param fragment: A string -- fragment of HTML.
+ :return: A string -- a full HTML document.
+ """
+ return fragment
+
+ def set_up_substitutions(self, tag):
+ """Set up any substitutions that will need to be performed on
+ a `Tag` when it's output as a string.
+
+ By default, this does nothing. See `HTMLTreeBuilder` for a
+ case where this is used.
+
+ :param tag: A `Tag`
+ :return: Whether or not a substitution was performed.
+ """
+ return False
+
+ def _replace_cdata_list_attribute_values(self, tag_name, attrs):
+ """When an attribute value is associated with a tag that can
+ have multiple values for that attribute, convert the string
+ value to a list of strings.
+
+ Basically, replaces class="foo bar" with class=["foo", "bar"]
+
+ NOTE: This method modifies its input in place.
+
+ :param tag_name: The name of a tag.
+ :param attrs: A dictionary containing the tag's attributes.
+ Any appropriate attribute values will be modified in place.
+ """
+ if not attrs:
+ return attrs
+ if self.cdata_list_attributes:
+ universal = self.cdata_list_attributes.get('*', [])
+ tag_specific = self.cdata_list_attributes.get(
+ tag_name.lower(), None)
+ for attr in attrs.keys():
+ if attr in universal or (tag_specific and attr in tag_specific):
+ # We have a "class"-type attribute whose string
+ # value is a whitespace-separated list of
+ # values. Split it into a list.
+ value = attrs[attr]
+ if isinstance(value, basestring):
+ values = nonwhitespace_re.findall(value)
+ else:
+ # html5lib sometimes calls setAttributes twice
+ # for the same tag when rearranging the parse
+ # tree. On the second call the attribute value
+ # here is already a list. If this happens,
+ # leave the value alone rather than trying to
+ # split it again.
+ values = value
+ attrs[attr] = values
+ return attrs
+
+class SAXTreeBuilder(TreeBuilder):
+ """A Beautiful Soup treebuilder that listens for SAX events.
+
+ This is not currently used for anything, but it demonstrates
+ how a simple TreeBuilder would work.
+ """
+
+ def feed(self, markup):
+ raise NotImplementedError()
+
+ def close(self):
+ pass
+
+ def startElement(self, name, attrs):
+ attrs = dict((key[1], value) for key, value in list(attrs.items()))
+ #print("Start %s, %r" % (name, attrs))
+ self.soup.handle_starttag(name, attrs)
+
+ def endElement(self, name):
+ #print("End %s" % name)
+ self.soup.handle_endtag(name)
+
+ def startElementNS(self, nsTuple, nodeName, attrs):
+ # Throw away (ns, nodeName) for now.
+ self.startElement(nodeName, attrs)
+
+ def endElementNS(self, nsTuple, nodeName):
+ # Throw away (ns, nodeName) for now.
+ self.endElement(nodeName)
+ #handler.endElementNS((ns, node.nodeName), node.nodeName)
+
+ def startPrefixMapping(self, prefix, nodeValue):
+ # Ignore the prefix for now.
+ pass
+
+ def endPrefixMapping(self, prefix):
+ # Ignore the prefix for now.
+ # handler.endPrefixMapping(prefix)
+ pass
+
+ def characters(self, content):
+ self.soup.handle_data(content)
+
+ def startDocument(self):
+ pass
+
+ def endDocument(self):
+ pass
+
+
+class HTMLTreeBuilder(TreeBuilder):
+ """This TreeBuilder knows facts about HTML.
+
+ Such as which tags are empty-element tags.
+ """
+
+ empty_element_tags = set([
+ # These are from HTML5.
+ 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr',
+
+ # These are from earlier versions of HTML and are removed in HTML5.
+ 'basefont', 'bgsound', 'command', 'frame', 'image', 'isindex', 'nextid', 'spacer'
+ ])
+
+ # The HTML standard defines these as block-level elements. Beautiful
+ # Soup does not treat these elements differently from other elements,
+ # but it may do so eventually, and this information is available if
+ # you need to use it.
+ block_elements = set(["address", "article", "aside", "blockquote", "canvas", "dd", "div", "dl", "dt", "fieldset", "figcaption", "figure", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "header", "hr", "li", "main", "nav", "noscript", "ol", "output", "p", "pre", "section", "table", "tfoot", "ul", "video"])
+
+ # The HTML standard defines an unusual content model for these tags.
+ # We represent this by using a string class other than NavigableString
+ # inside these tags.
+ #
+ # I made this list by going through the HTML spec
+ # (https://html.spec.whatwg.org/#metadata-content) and looking for
+ # "metadata content" elements that can contain strings.
+ #
+ # TODO: Arguably <noscript> could go here but it seems
+ # qualitatively different from the other tags.
+ DEFAULT_STRING_CONTAINERS = {
+ 'style': Stylesheet,
+ 'script': Script,
+ 'template': TemplateString,
+ }
+
+ # The HTML standard defines these attributes as containing a
+ # space-separated list of values, not a single value. That is,
+ # class="foo bar" means that the 'class' attribute has two values,
+ # 'foo' and 'bar', not the single value 'foo bar'. When we
+ # encounter one of these attributes, we will parse its value into
+ # a list of values if possible. Upon output, the list will be
+ # converted back into a string.
+ DEFAULT_CDATA_LIST_ATTRIBUTES = {
+ "*" : ['class', 'accesskey', 'dropzone'],
+ "a" : ['rel', 'rev'],
+ "link" : ['rel', 'rev'],
+ "td" : ["headers"],
+ "th" : ["headers"],
+ "td" : ["headers"],
+ "form" : ["accept-charset"],
+ "object" : ["archive"],
+
+ # These are HTML5 specific, as are *.accesskey and *.dropzone above.
+ "area" : ["rel"],
+ "icon" : ["sizes"],
+ "iframe" : ["sandbox"],
+ "output" : ["for"],
+ }
+
+ DEFAULT_PRESERVE_WHITESPACE_TAGS = set(['pre', 'textarea'])
+
+ def set_up_substitutions(self, tag):
+ """Replace the declared encoding in a <meta> tag with a placeholder,
+ to be substituted when the tag is output to a string.
+
+ An HTML document may come in to Beautiful Soup as one
+ encoding, but exit in a different encoding, and the <meta> tag
+ needs to be changed to reflect this.
+
+ :param tag: A `Tag`
+ :return: Whether or not a substitution was performed.
+ """
+ # We are only interested in <meta> tags
+ if tag.name != 'meta':
+ return False
+
+ http_equiv = tag.get('http-equiv')
+ content = tag.get('content')
+ charset = tag.get('charset')
+
+ # We are interested in <meta> tags that say what encoding the
+ # document was originally in. This means HTML 5-style <meta>
+ # tags that provide the "charset" attribute. It also means
+ # HTML 4-style <meta> tags that provide the "content"
+ # attribute and have "http-equiv" set to "content-type".
+ #
+ # In both cases we will replace the value of the appropriate
+ # attribute with a standin object that can take on any
+ # encoding.
+ meta_encoding = None
+ if charset is not None:
+ # HTML 5 style:
+ # <meta charset="utf8">
+ meta_encoding = charset
+ tag['charset'] = CharsetMetaAttributeValue(charset)
+
+ elif (content is not None and http_equiv is not None
+ and http_equiv.lower() == 'content-type'):
+ # HTML 4 style:
+ # <meta http-equiv="content-type" content="text/html; charset=utf8">
+ tag['content'] = ContentMetaAttributeValue(content)
+
+ return (meta_encoding is not None)
+
+def register_treebuilders_from(module):
+ """Copy TreeBuilders from the given module into this module."""
+ this_module = sys.modules[__name__]
+ for name in module.__all__:
+ obj = getattr(module, name)
+
+ if issubclass(obj, TreeBuilder):
+ setattr(this_module, name, obj)
+ this_module.__all__.append(name)
+ # Register the builder while we're at it.
+ this_module.builder_registry.register(obj)
+
+class ParserRejectedMarkup(Exception):
+ """An Exception to be raised when the underlying parser simply
+ refuses to parse the given markup.
+ """
+ def __init__(self, message_or_exception):
+ """Explain why the parser rejected the given markup, either
+ with a textual explanation or another exception.
+ """
+ if isinstance(message_or_exception, Exception):
+ e = message_or_exception
+ message_or_exception = "%s: %s" % (e.__class__.__name__, unicode(e))
+ super(ParserRejectedMarkup, self).__init__(message_or_exception)
+
+# Builders are registered in reverse order of priority, so that custom
+# builder registrations will take precedence. In general, we want lxml
+# to take precedence over html5lib, because it's faster. And we only
+# want to use HTMLParser as a last resort.
+from . import _htmlparser
+register_treebuilders_from(_htmlparser)
+try:
+ from . import _html5lib
+ register_treebuilders_from(_html5lib)
+except ImportError:
+ # They don't have html5lib installed.
+ pass
+try:
+ from . import _lxml
+ register_treebuilders_from(_lxml)
+except ImportError:
+ # They don't have lxml installed.
+ pass
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/builder/_html5lib.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/builder/_html5lib.py
new file mode 100644
index 00000000000..a1c6134c165
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/builder/_html5lib.py
@@ -0,0 +1,467 @@
+# Use of this source code is governed by the MIT license.
+__license__ = "MIT"
+
+__all__ = [
+ 'HTML5TreeBuilder',
+ ]
+
+import warnings
+import re
+from bs4.builder import (
+ PERMISSIVE,
+ HTML,
+ HTML_5,
+ HTMLTreeBuilder,
+ )
+from bs4.element import (
+ NamespacedAttribute,
+ nonwhitespace_re,
+)
+import html5lib
+from html5lib.constants import (
+ namespaces,
+ prefixes,
+ )
+from bs4.element import (
+ Comment,
+ Doctype,
+ NavigableString,
+ Tag,
+ )
+
+try:
+ # Pre-0.99999999
+ from html5lib.treebuilders import _base as treebuilder_base
+ new_html5lib = False
+except ImportError, e:
+ # 0.99999999 and up
+ from html5lib.treebuilders import base as treebuilder_base
+ new_html5lib = True
+
+class HTML5TreeBuilder(HTMLTreeBuilder):
+ """Use html5lib to build a tree.
+
+ Note that this TreeBuilder does not support some features common
+ to HTML TreeBuilders. Some of these features could theoretically
+ be implemented, but at the very least it's quite difficult,
+ because html5lib moves the parse tree around as it's being built.
+
+ * This TreeBuilder doesn't use different subclasses of NavigableString
+ based on the name of the tag in which the string was found.
+
+ * You can't use a SoupStrainer to parse only part of a document.
+ """
+
+ NAME = "html5lib"
+
+ features = [NAME, PERMISSIVE, HTML_5, HTML]
+
+ # html5lib can tell us which line number and position in the
+ # original file is the source of an element.
+ TRACKS_LINE_NUMBERS = True
+
+ def prepare_markup(self, markup, user_specified_encoding,
+ document_declared_encoding=None, exclude_encodings=None):
+ # Store the user-specified encoding for use later on.
+ self.user_specified_encoding = user_specified_encoding
+
+ # document_declared_encoding and exclude_encodings aren't used
+ # ATM because the html5lib TreeBuilder doesn't use
+ # UnicodeDammit.
+ if exclude_encodings:
+ warnings.warn("You provided a value for exclude_encoding, but the html5lib tree builder doesn't support exclude_encoding.")
+ yield (markup, None, None, False)
+
+ # These methods are defined by Beautiful Soup.
+ def feed(self, markup):
+ if self.soup.parse_only is not None:
+ warnings.warn("You provided a value for parse_only, but the html5lib tree builder doesn't support parse_only. The entire document will be parsed.")
+ parser = html5lib.HTMLParser(tree=self.create_treebuilder)
+ self.underlying_builder.parser = parser
+ extra_kwargs = dict()
+ if not isinstance(markup, unicode):
+ if new_html5lib:
+ extra_kwargs['override_encoding'] = self.user_specified_encoding
+ else:
+ extra_kwargs['encoding'] = self.user_specified_encoding
+ doc = parser.parse(markup, **extra_kwargs)
+
+ # Set the character encoding detected by the tokenizer.
+ if isinstance(markup, unicode):
+ # We need to special-case this because html5lib sets
+ # charEncoding to UTF-8 if it gets Unicode input.
+ doc.original_encoding = None
+ else:
+ original_encoding = parser.tokenizer.stream.charEncoding[0]
+ if not isinstance(original_encoding, basestring):
+ # In 0.99999999 and up, the encoding is an html5lib
+ # Encoding object. We want to use a string for compatibility
+ # with other tree builders.
+ original_encoding = original_encoding.name
+ doc.original_encoding = original_encoding
+ self.underlying_builder.parser = None
+
+ def create_treebuilder(self, namespaceHTMLElements):
+ self.underlying_builder = TreeBuilderForHtml5lib(
+ namespaceHTMLElements, self.soup,
+ store_line_numbers=self.store_line_numbers
+ )
+ return self.underlying_builder
+
+ def test_fragment_to_document(self, fragment):
+ """See `TreeBuilder`."""
+ return u'<html><head></head><body>%s</body></html>' % fragment
+
+
+class TreeBuilderForHtml5lib(treebuilder_base.TreeBuilder):
+
+ def __init__(self, namespaceHTMLElements, soup=None,
+ store_line_numbers=True, **kwargs):
+ if soup:
+ self.soup = soup
+ else:
+ from bs4 import BeautifulSoup
+ # TODO: Why is the parser 'html.parser' here? To avoid an
+ # infinite loop?
+ self.soup = BeautifulSoup(
+ "", "html.parser", store_line_numbers=store_line_numbers,
+ **kwargs
+ )
+ # TODO: What are **kwargs exactly? Should they be passed in
+ # here in addition to/instead of being passed to the BeautifulSoup
+ # constructor?
+ super(TreeBuilderForHtml5lib, self).__init__(namespaceHTMLElements)
+
+ # This will be set later to an html5lib.html5parser.HTMLParser
+ # object, which we can use to track the current line number.
+ self.parser = None
+ self.store_line_numbers = store_line_numbers
+
+ def documentClass(self):
+ self.soup.reset()
+ return Element(self.soup, self.soup, None)
+
+ def insertDoctype(self, token):
+ name = token["name"]
+ publicId = token["publicId"]
+ systemId = token["systemId"]
+
+ doctype = Doctype.for_name_and_ids(name, publicId, systemId)
+ self.soup.object_was_parsed(doctype)
+
+ def elementClass(self, name, namespace):
+ kwargs = {}
+ if self.parser and self.store_line_numbers:
+ # This represents the point immediately after the end of the
+ # tag. We don't know when the tag started, but we do know
+ # where it ended -- the character just before this one.
+ sourceline, sourcepos = self.parser.tokenizer.stream.position()
+ kwargs['sourceline'] = sourceline
+ kwargs['sourcepos'] = sourcepos-1
+ tag = self.soup.new_tag(name, namespace, **kwargs)
+
+ return Element(tag, self.soup, namespace)
+
+ def commentClass(self, data):
+ return TextNode(Comment(data), self.soup)
+
+ def fragmentClass(self):
+ from bs4 import BeautifulSoup
+ # TODO: Why is the parser 'html.parser' here? To avoid an
+ # infinite loop?
+ self.soup = BeautifulSoup("", "html.parser")
+ self.soup.name = "[document_fragment]"
+ return Element(self.soup, self.soup, None)
+
+ def appendChild(self, node):
+ # XXX This code is not covered by the BS4 tests.
+ self.soup.append(node.element)
+
+ def getDocument(self):
+ return self.soup
+
+ def getFragment(self):
+ return treebuilder_base.TreeBuilder.getFragment(self).element
+
+ def testSerializer(self, element):
+ from bs4 import BeautifulSoup
+ rv = []
+ doctype_re = re.compile(r'^(.*?)(?: PUBLIC "(.*?)"(?: "(.*?)")?| SYSTEM "(.*?)")?$')
+
+ def serializeElement(element, indent=0):
+ if isinstance(element, BeautifulSoup):
+ pass
+ if isinstance(element, Doctype):
+ m = doctype_re.match(element)
+ if m:
+ name = m.group(1)
+ if m.lastindex > 1:
+ publicId = m.group(2) or ""
+ systemId = m.group(3) or m.group(4) or ""
+ rv.append("""|%s<!DOCTYPE %s "%s" "%s">""" %
+ (' ' * indent, name, publicId, systemId))
+ else:
+ rv.append("|%s<!DOCTYPE %s>" % (' ' * indent, name))
+ else:
+ rv.append("|%s<!DOCTYPE >" % (' ' * indent,))
+ elif isinstance(element, Comment):
+ rv.append("|%s<!-- %s -->" % (' ' * indent, element))
+ elif isinstance(element, NavigableString):
+ rv.append("|%s\"%s\"" % (' ' * indent, element))
+ else:
+ if element.namespace:
+ name = "%s %s" % (prefixes[element.namespace],
+ element.name)
+ else:
+ name = element.name
+ rv.append("|%s<%s>" % (' ' * indent, name))
+ if element.attrs:
+ attributes = []
+ for name, value in element.attrs.items():
+ if isinstance(name, NamespacedAttribute):
+ name = "%s %s" % (prefixes[name.namespace], name.name)
+ if isinstance(value, list):
+ value = " ".join(value)
+ attributes.append((name, value))
+
+ for name, value in sorted(attributes):
+ rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value))
+ indent += 2
+ for child in element.children:
+ serializeElement(child, indent)
+ serializeElement(element, 0)
+
+ return "\n".join(rv)
+
+class AttrList(object):
+ def __init__(self, element):
+ self.element = element
+ self.attrs = dict(self.element.attrs)
+ def __iter__(self):
+ return list(self.attrs.items()).__iter__()
+ def __setitem__(self, name, value):
+ # If this attribute is a multi-valued attribute for this element,
+ # turn its value into a list.
+ list_attr = self.element.cdata_list_attributes
+ if (name in list_attr['*']
+ or (self.element.name in list_attr
+ and name in list_attr[self.element.name])):
+ # A node that is being cloned may have already undergone
+ # this procedure.
+ if not isinstance(value, list):
+ value = nonwhitespace_re.findall(value)
+ self.element[name] = value
+ def items(self):
+ return list(self.attrs.items())
+ def keys(self):
+ return list(self.attrs.keys())
+ def __len__(self):
+ return len(self.attrs)
+ def __getitem__(self, name):
+ return self.attrs[name]
+ def __contains__(self, name):
+ return name in list(self.attrs.keys())
+
+
+class Element(treebuilder_base.Node):
+ def __init__(self, element, soup, namespace):
+ treebuilder_base.Node.__init__(self, element.name)
+ self.element = element
+ self.soup = soup
+ self.namespace = namespace
+
+ def appendChild(self, node):
+ string_child = child = None
+ if isinstance(node, basestring):
+ # Some other piece of code decided to pass in a string
+ # instead of creating a TextElement object to contain the
+ # string.
+ string_child = child = node
+ elif isinstance(node, Tag):
+ # Some other piece of code decided to pass in a Tag
+ # instead of creating an Element object to contain the
+ # Tag.
+ child = node
+ elif node.element.__class__ == NavigableString:
+ string_child = child = node.element
+ node.parent = self
+ else:
+ child = node.element
+ node.parent = self
+
+ if not isinstance(child, basestring) and child.parent is not None:
+ node.element.extract()
+
+ if (string_child is not None and self.element.contents
+ and self.element.contents[-1].__class__ == NavigableString):
+ # We are appending a string onto another string.
+ # TODO This has O(n^2) performance, for input like
+ # "a</a>a</a>a</a>..."
+ old_element = self.element.contents[-1]
+ new_element = self.soup.new_string(old_element + string_child)
+ old_element.replace_with(new_element)
+ self.soup._most_recent_element = new_element
+ else:
+ if isinstance(node, basestring):
+ # Create a brand new NavigableString from this string.
+ child = self.soup.new_string(node)
+
+ # Tell Beautiful Soup to act as if it parsed this element
+ # immediately after the parent's last descendant. (Or
+ # immediately after the parent, if it has no children.)
+ if self.element.contents:
+ most_recent_element = self.element._last_descendant(False)
+ elif self.element.next_element is not None:
+ # Something from further ahead in the parse tree is
+ # being inserted into this earlier element. This is
+ # very annoying because it means an expensive search
+ # for the last element in the tree.
+ most_recent_element = self.soup._last_descendant()
+ else:
+ most_recent_element = self.element
+
+ self.soup.object_was_parsed(
+ child, parent=self.element,
+ most_recent_element=most_recent_element)
+
+ def getAttributes(self):
+ if isinstance(self.element, Comment):
+ return {}
+ return AttrList(self.element)
+
+ def setAttributes(self, attributes):
+ if attributes is not None and len(attributes) > 0:
+ converted_attributes = []
+ for name, value in list(attributes.items()):
+ if isinstance(name, tuple):
+ new_name = NamespacedAttribute(*name)
+ del attributes[name]
+ attributes[new_name] = value
+
+ self.soup.builder._replace_cdata_list_attribute_values(
+ self.name, attributes)
+ for name, value in attributes.items():
+ self.element[name] = value
+
+ # The attributes may contain variables that need substitution.
+ # Call set_up_substitutions manually.
+ #
+ # The Tag constructor called this method when the Tag was created,
+ # but we just set/changed the attributes, so call it again.
+ self.soup.builder.set_up_substitutions(self.element)
+ attributes = property(getAttributes, setAttributes)
+
+ def insertText(self, data, insertBefore=None):
+ text = TextNode(self.soup.new_string(data), self.soup)
+ if insertBefore:
+ self.insertBefore(text, insertBefore)
+ else:
+ self.appendChild(text)
+
+ def insertBefore(self, node, refNode):
+ index = self.element.index(refNode.element)
+ if (node.element.__class__ == NavigableString and self.element.contents
+ and self.element.contents[index-1].__class__ == NavigableString):
+ # (See comments in appendChild)
+ old_node = self.element.contents[index-1]
+ new_str = self.soup.new_string(old_node + node.element)
+ old_node.replace_with(new_str)
+ else:
+ self.element.insert(index, node.element)
+ node.parent = self
+
+ def removeChild(self, node):
+ node.element.extract()
+
+ def reparentChildren(self, new_parent):
+ """Move all of this tag's children into another tag."""
+ # print("MOVE", self.element.contents)
+ # print("FROM", self.element)
+ # print("TO", new_parent.element)
+
+ element = self.element
+ new_parent_element = new_parent.element
+ # Determine what this tag's next_element will be once all the children
+ # are removed.
+ final_next_element = element.next_sibling
+
+ new_parents_last_descendant = new_parent_element._last_descendant(False, False)
+ if len(new_parent_element.contents) > 0:
+ # The new parent already contains children. We will be
+ # appending this tag's children to the end.
+ new_parents_last_child = new_parent_element.contents[-1]
+ new_parents_last_descendant_next_element = new_parents_last_descendant.next_element
+ else:
+ # The new parent contains no children.
+ new_parents_last_child = None
+ new_parents_last_descendant_next_element = new_parent_element.next_element
+
+ to_append = element.contents
+ if len(to_append) > 0:
+ # Set the first child's previous_element and previous_sibling
+ # to elements within the new parent
+ first_child = to_append[0]
+ if new_parents_last_descendant is not None:
+ first_child.previous_element = new_parents_last_descendant
+ else:
+ first_child.previous_element = new_parent_element
+ first_child.previous_sibling = new_parents_last_child
+ if new_parents_last_descendant is not None:
+ new_parents_last_descendant.next_element = first_child
+ else:
+ new_parent_element.next_element = first_child
+ if new_parents_last_child is not None:
+ new_parents_last_child.next_sibling = first_child
+
+ # Find the very last element being moved. It is now the
+ # parent's last descendant. It has no .next_sibling and
+ # its .next_element is whatever the previous last
+ # descendant had.
+ last_childs_last_descendant = to_append[-1]._last_descendant(False, True)
+
+ last_childs_last_descendant.next_element = new_parents_last_descendant_next_element
+ if new_parents_last_descendant_next_element is not None:
+ # TODO: This code has no test coverage and I'm not sure
+ # how to get html5lib to go through this path, but it's
+ # just the other side of the previous line.
+ new_parents_last_descendant_next_element.previous_element = last_childs_last_descendant
+ last_childs_last_descendant.next_sibling = None
+
+ for child in to_append:
+ child.parent = new_parent_element
+ new_parent_element.contents.append(child)
+
+ # Now that this element has no children, change its .next_element.
+ element.contents = []
+ element.next_element = final_next_element
+
+ # print("DONE WITH MOVE")
+ # print("FROM", self.element)
+ # print("TO", new_parent_element)
+
+ def cloneNode(self):
+ tag = self.soup.new_tag(self.element.name, self.namespace)
+ node = Element(tag, self.soup, self.namespace)
+ for key,value in self.attributes:
+ node.attributes[key] = value
+ return node
+
+ def hasContent(self):
+ return self.element.contents
+
+ def getNameTuple(self):
+ if self.namespace == None:
+ return namespaces["html"], self.name
+ else:
+ return self.namespace, self.name
+
+ nameTuple = property(getNameTuple)
+
+class TextNode(Element):
+ def __init__(self, element, soup):
+ treebuilder_base.Node.__init__(self, None)
+ self.element = element
+ self.soup = soup
+
+ def cloneNode(self):
+ raise NotImplementedError
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/builder/_htmlparser.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/builder/_htmlparser.py
new file mode 100644
index 00000000000..96a7b7d4d44
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/builder/_htmlparser.py
@@ -0,0 +1,477 @@
+# encoding: utf-8
+"""Use the HTMLParser library to parse HTML files that aren't too bad."""
+
+# Use of this source code is governed by the MIT license.
+__license__ = "MIT"
+
+__all__ = [
+ 'HTMLParserTreeBuilder',
+ ]
+
+from HTMLParser import HTMLParser
+
+try:
+ from HTMLParser import HTMLParseError
+except ImportError, e:
+ # HTMLParseError is removed in Python 3.5. Since it can never be
+ # thrown in 3.5, we can just define our own class as a placeholder.
+ class HTMLParseError(Exception):
+ pass
+
+import sys
+import warnings
+
+# Starting in Python 3.2, the HTMLParser constructor takes a 'strict'
+# argument, which we'd like to set to False. Unfortunately,
+# http://bugs.python.org/issue13273 makes strict=True a better bet
+# before Python 3.2.3.
+#
+# At the end of this file, we monkeypatch HTMLParser so that
+# strict=True works well on Python 3.2.2.
+major, minor, release = sys.version_info[:3]
+CONSTRUCTOR_TAKES_STRICT = major == 3 and minor == 2 and release >= 3
+CONSTRUCTOR_STRICT_IS_DEPRECATED = major == 3 and minor == 3
+CONSTRUCTOR_TAKES_CONVERT_CHARREFS = major == 3 and minor >= 4
+
+
+from bs4.element import (
+ CData,
+ Comment,
+ Declaration,
+ Doctype,
+ ProcessingInstruction,
+ )
+from bs4.dammit import EntitySubstitution, UnicodeDammit
+
+from bs4.builder import (
+ HTML,
+ HTMLTreeBuilder,
+ STRICT,
+ )
+
+
+HTMLPARSER = 'html.parser'
+
+class BeautifulSoupHTMLParser(HTMLParser):
+ """A subclass of the Python standard library's HTMLParser class, which
+ listens for HTMLParser events and translates them into calls
+ to Beautiful Soup's tree construction API.
+ """
+
+ # Strategies for handling duplicate attributes
+ IGNORE = 'ignore'
+ REPLACE = 'replace'
+
+ def __init__(self, *args, **kwargs):
+ """Constructor.
+
+ :param on_duplicate_attribute: A strategy for what to do if a
+ tag includes the same attribute more than once. Accepted
+ values are: REPLACE (replace earlier values with later
+ ones, the default), IGNORE (keep the earliest value
+ encountered), or a callable. A callable must take three
+ arguments: the dictionary of attributes already processed,
+ the name of the duplicate attribute, and the most recent value
+ encountered.
+ """
+ self.on_duplicate_attribute = kwargs.pop(
+ 'on_duplicate_attribute', self.REPLACE
+ )
+ HTMLParser.__init__(self, *args, **kwargs)
+
+ # Keep a list of empty-element tags that were encountered
+ # without an explicit closing tag. If we encounter a closing tag
+ # of this type, we'll associate it with one of those entries.
+ #
+ # This isn't a stack because we don't care about the
+ # order. It's a list of closing tags we've already handled and
+ # will ignore, assuming they ever show up.
+ self.already_closed_empty_element = []
+
+ def error(self, msg):
+ """In Python 3, HTMLParser subclasses must implement error(), although
+ this requirement doesn't appear to be documented.
+
+ In Python 2, HTMLParser implements error() by raising an exception,
+ which we don't want to do.
+
+ In any event, this method is called only on very strange
+ markup and our best strategy is to pretend it didn't happen
+ and keep going.
+ """
+ warnings.warn(msg)
+
+ def handle_startendtag(self, name, attrs):
+ """Handle an incoming empty-element tag.
+
+ This is only called when the markup looks like <tag/>.
+
+ :param name: Name of the tag.
+ :param attrs: Dictionary of the tag's attributes.
+ """
+ # is_startend() tells handle_starttag not to close the tag
+ # just because its name matches a known empty-element tag. We
+ # know that this is an empty-element tag and we want to call
+ # handle_endtag ourselves.
+ tag = self.handle_starttag(name, attrs, handle_empty_element=False)
+ self.handle_endtag(name)
+
+ def handle_starttag(self, name, attrs, handle_empty_element=True):
+ """Handle an opening tag, e.g. '<tag>'
+
+ :param name: Name of the tag.
+ :param attrs: Dictionary of the tag's attributes.
+ :param handle_empty_element: True if this tag is known to be
+ an empty-element tag (i.e. there is not expected to be any
+ closing tag).
+ """
+ # XXX namespace
+ attr_dict = {}
+ for key, value in attrs:
+ # Change None attribute values to the empty string
+ # for consistency with the other tree builders.
+ if value is None:
+ value = ''
+ if key in attr_dict:
+ # A single attribute shows up multiple times in this
+ # tag. How to handle it depends on the
+ # on_duplicate_attribute setting.
+ on_dupe = self.on_duplicate_attribute
+ if on_dupe == self.IGNORE:
+ pass
+ elif on_dupe in (None, self.REPLACE):
+ attr_dict[key] = value
+ else:
+ on_dupe(attr_dict, key, value)
+ else:
+ attr_dict[key] = value
+ attrvalue = '""'
+ #print("START", name)
+ sourceline, sourcepos = self.getpos()
+ tag = self.soup.handle_starttag(
+ name, None, None, attr_dict, sourceline=sourceline,
+ sourcepos=sourcepos
+ )
+ if tag and tag.is_empty_element and handle_empty_element:
+ # Unlike other parsers, html.parser doesn't send separate end tag
+ # events for empty-element tags. (It's handled in
+ # handle_startendtag, but only if the original markup looked like
+ # <tag/>.)
+ #
+ # So we need to call handle_endtag() ourselves. Since we
+ # know the start event is identical to the end event, we
+ # don't want handle_endtag() to cross off any previous end
+ # events for tags of this name.
+ self.handle_endtag(name, check_already_closed=False)
+
+ # But we might encounter an explicit closing tag for this tag
+ # later on. If so, we want to ignore it.
+ self.already_closed_empty_element.append(name)
+
+ def handle_endtag(self, name, check_already_closed=True):
+ """Handle a closing tag, e.g. '</tag>'
+
+ :param name: A tag name.
+ :param check_already_closed: True if this tag is expected to
+ be the closing portion of an empty-element tag,
+ e.g. '<tag></tag>'.
+ """
+ #print("END", name)
+ if check_already_closed and name in self.already_closed_empty_element:
+ # This is a redundant end tag for an empty-element tag.
+ # We've already called handle_endtag() for it, so just
+ # check it off the list.
+ #print("ALREADY CLOSED", name)
+ self.already_closed_empty_element.remove(name)
+ else:
+ self.soup.handle_endtag(name)
+
+ def handle_data(self, data):
+ """Handle some textual data that shows up between tags."""
+ self.soup.handle_data(data)
+
+ def handle_charref(self, name):
+ """Handle a numeric character reference by converting it to the
+ corresponding Unicode character and treating it as textual
+ data.
+
+ :param name: Character number, possibly in hexadecimal.
+ """
+ # XXX workaround for a bug in HTMLParser. Remove this once
+ # it's fixed in all supported versions.
+ # http://bugs.python.org/issue13633
+ if name.startswith('x'):
+ real_name = int(name.lstrip('x'), 16)
+ elif name.startswith('X'):
+ real_name = int(name.lstrip('X'), 16)
+ else:
+ real_name = int(name)
+
+ data = None
+ if real_name < 256:
+ # HTML numeric entities are supposed to reference Unicode
+ # code points, but sometimes they reference code points in
+ # some other encoding (ahem, Windows-1252). E.g. &#147;
+ # instead of &#201; for LEFT DOUBLE QUOTATION MARK. This
+ # code tries to detect this situation and compensate.
+ for encoding in (self.soup.original_encoding, 'windows-1252'):
+ if not encoding:
+ continue
+ try:
+ data = bytearray([real_name]).decode(encoding)
+ except UnicodeDecodeError, e:
+ pass
+ if not data:
+ try:
+ data = unichr(real_name)
+ except (ValueError, OverflowError), e:
+ pass
+ data = data or u"\N{REPLACEMENT CHARACTER}"
+ self.handle_data(data)
+
+ def handle_entityref(self, name):
+ """Handle a named entity reference by converting it to the
+ corresponding Unicode character and treating it as textual
+ data.
+
+ :param name: Name of the entity reference.
+ """
+ character = EntitySubstitution.HTML_ENTITY_TO_CHARACTER.get(name)
+ if character is not None:
+ data = character
+ else:
+ # If this were XML, it would be ambiguous whether "&foo"
+ # was an character entity reference with a missing
+ # semicolon or the literal string "&foo". Since this is
+ # HTML, we have a complete list of all character entity references,
+ # and this one wasn't found, so assume it's the literal string "&foo".
+ data = "&%s" % name
+ self.handle_data(data)
+
+ def handle_comment(self, data):
+ """Handle an HTML comment.
+
+ :param data: The text of the comment.
+ """
+ self.soup.endData()
+ self.soup.handle_data(data)
+ self.soup.endData(Comment)
+
+ def handle_decl(self, data):
+ """Handle a DOCTYPE declaration.
+
+ :param data: The text of the declaration.
+ """
+ self.soup.endData()
+ data = data[len("DOCTYPE "):]
+ self.soup.handle_data(data)
+ self.soup.endData(Doctype)
+
+ def unknown_decl(self, data):
+ """Handle a declaration of unknown type -- probably a CDATA block.
+
+ :param data: The text of the declaration.
+ """
+ if data.upper().startswith('CDATA['):
+ cls = CData
+ data = data[len('CDATA['):]
+ else:
+ cls = Declaration
+ self.soup.endData()
+ self.soup.handle_data(data)
+ self.soup.endData(cls)
+
+ def handle_pi(self, data):
+ """Handle a processing instruction.
+
+ :param data: The text of the instruction.
+ """
+ self.soup.endData()
+ self.soup.handle_data(data)
+ self.soup.endData(ProcessingInstruction)
+
+
+class HTMLParserTreeBuilder(HTMLTreeBuilder):
+ """A Beautiful soup `TreeBuilder` that uses the `HTMLParser` parser,
+ found in the Python standard library.
+ """
+ is_xml = False
+ picklable = True
+ NAME = HTMLPARSER
+ features = [NAME, HTML, STRICT]
+
+ # The html.parser knows which line number and position in the
+ # original file is the source of an element.
+ TRACKS_LINE_NUMBERS = True
+
+ def __init__(self, parser_args=None, parser_kwargs=None, **kwargs):
+ """Constructor.
+
+ :param parser_args: Positional arguments to pass into
+ the BeautifulSoupHTMLParser constructor, once it's
+ invoked.
+ :param parser_kwargs: Keyword arguments to pass into
+ the BeautifulSoupHTMLParser constructor, once it's
+ invoked.
+ :param kwargs: Keyword arguments for the superclass constructor.
+ """
+ # Some keyword arguments will be pulled out of kwargs and placed
+ # into parser_kwargs.
+ extra_parser_kwargs = dict()
+ for arg in ('on_duplicate_attribute',):
+ if arg in kwargs:
+ value = kwargs.pop(arg)
+ extra_parser_kwargs[arg] = value
+ super(HTMLParserTreeBuilder, self).__init__(**kwargs)
+ parser_args = parser_args or []
+ parser_kwargs = parser_kwargs or {}
+ parser_kwargs.update(extra_parser_kwargs)
+ if CONSTRUCTOR_TAKES_STRICT and not CONSTRUCTOR_STRICT_IS_DEPRECATED:
+ parser_kwargs['strict'] = False
+ if CONSTRUCTOR_TAKES_CONVERT_CHARREFS:
+ parser_kwargs['convert_charrefs'] = False
+ self.parser_args = (parser_args, parser_kwargs)
+
+ def prepare_markup(self, markup, user_specified_encoding=None,
+ document_declared_encoding=None, exclude_encodings=None):
+
+ """Run any preliminary steps necessary to make incoming markup
+ acceptable to the parser.
+
+ :param markup: Some markup -- probably a bytestring.
+ :param user_specified_encoding: The user asked to try this encoding.
+ :param document_declared_encoding: The markup itself claims to be
+ in this encoding.
+ :param exclude_encodings: The user asked _not_ to try any of
+ these encodings.
+
+ :yield: A series of 4-tuples:
+ (markup, encoding, declared encoding,
+ has undergone character replacement)
+
+ Each 4-tuple represents a strategy for converting the
+ document to Unicode and parsing it. Each strategy will be tried
+ in turn.
+ """
+ if isinstance(markup, unicode):
+ # Parse Unicode as-is.
+ yield (markup, None, None, False)
+ return
+
+ # Ask UnicodeDammit to sniff the most likely encoding.
+ try_encodings = [user_specified_encoding, document_declared_encoding]
+ dammit = UnicodeDammit(markup, try_encodings, is_html=True,
+ exclude_encodings=exclude_encodings)
+ yield (dammit.markup, dammit.original_encoding,
+ dammit.declared_html_encoding,
+ dammit.contains_replacement_characters)
+
+ def feed(self, markup):
+ """Run some incoming markup through some parsing process,
+ populating the `BeautifulSoup` object in self.soup.
+ """
+ args, kwargs = self.parser_args
+ parser = BeautifulSoupHTMLParser(*args, **kwargs)
+ parser.soup = self.soup
+ try:
+ parser.feed(markup)
+ parser.close()
+ except HTMLParseError, e:
+ warnings.warn(RuntimeWarning(
+ "Python's built-in HTMLParser cannot parse the given document. This is not a bug in Beautiful Soup. The best solution is to install an external parser (lxml or html5lib), and use Beautiful Soup with that parser. See http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser for help."))
+ raise e
+ parser.already_closed_empty_element = []
+
+# Patch 3.2 versions of HTMLParser earlier than 3.2.3 to use some
+# 3.2.3 code. This ensures they don't treat markup like <p></p> as a
+# string.
+#
+# XXX This code can be removed once most Python 3 users are on 3.2.3.
+if major == 3 and minor == 2 and not CONSTRUCTOR_TAKES_STRICT:
+ import re
+ attrfind_tolerant = re.compile(
+ r'\s*((?<=[\'"\s])[^\s/>][^\s/=>]*)(\s*=+\s*'
+ r'(\'[^\']*\'|"[^"]*"|(?![\'"])[^>\s]*))?')
+ HTMLParserTreeBuilder.attrfind_tolerant = attrfind_tolerant
+
+ locatestarttagend = re.compile(r"""
+ <[a-zA-Z][-.a-zA-Z0-9:_]* # tag name
+ (?:\s+ # whitespace before attribute name
+ (?:[a-zA-Z_][-.:a-zA-Z0-9_]* # attribute name
+ (?:\s*=\s* # value indicator
+ (?:'[^']*' # LITA-enclosed value
+ |\"[^\"]*\" # LIT-enclosed value
+ |[^'\">\s]+ # bare value
+ )
+ )?
+ )
+ )*
+ \s* # trailing whitespace
+""", re.VERBOSE)
+ BeautifulSoupHTMLParser.locatestarttagend = locatestarttagend
+
+ from html.parser import tagfind, attrfind
+
+ def parse_starttag(self, i):
+ self.__starttag_text = None
+ endpos = self.check_for_whole_start_tag(i)
+ if endpos < 0:
+ return endpos
+ rawdata = self.rawdata
+ self.__starttag_text = rawdata[i:endpos]
+
+ # Now parse the data between i+1 and j into a tag and attrs
+ attrs = []
+ match = tagfind.match(rawdata, i+1)
+ assert match, 'unexpected call to parse_starttag()'
+ k = match.end()
+ self.lasttag = tag = rawdata[i+1:k].lower()
+ while k < endpos:
+ if self.strict:
+ m = attrfind.match(rawdata, k)
+ else:
+ m = attrfind_tolerant.match(rawdata, k)
+ if not m:
+ break
+ attrname, rest, attrvalue = m.group(1, 2, 3)
+ if not rest:
+ attrvalue = None
+ elif attrvalue[:1] == '\'' == attrvalue[-1:] or \
+ attrvalue[:1] == '"' == attrvalue[-1:]:
+ attrvalue = attrvalue[1:-1]
+ if attrvalue:
+ attrvalue = self.unescape(attrvalue)
+ attrs.append((attrname.lower(), attrvalue))
+ k = m.end()
+
+ end = rawdata[k:endpos].strip()
+ if end not in (">", "/>"):
+ lineno, offset = self.getpos()
+ if "\n" in self.__starttag_text:
+ lineno = lineno + self.__starttag_text.count("\n")
+ offset = len(self.__starttag_text) \
+ - self.__starttag_text.rfind("\n")
+ else:
+ offset = offset + len(self.__starttag_text)
+ if self.strict:
+ self.error("junk characters in start tag: %r"
+ % (rawdata[k:endpos][:20],))
+ self.handle_data(rawdata[i:endpos])
+ return endpos
+ if end.endswith('/>'):
+ # XHTML-style empty tag: <span attr="value" />
+ self.handle_startendtag(tag, attrs)
+ else:
+ self.handle_starttag(tag, attrs)
+ if tag in self.CDATA_CONTENT_ELEMENTS:
+ self.set_cdata_mode(tag)
+ return endpos
+
+ def set_cdata_mode(self, elem):
+ self.cdata_elem = elem.lower()
+ self.interesting = re.compile(r'</\s*%s\s*>' % self.cdata_elem, re.I)
+
+ BeautifulSoupHTMLParser.parse_starttag = parse_starttag
+ BeautifulSoupHTMLParser.set_cdata_mode = set_cdata_mode
+
+ CONSTRUCTOR_TAKES_STRICT = True
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/builder/_lxml.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/builder/_lxml.py
new file mode 100644
index 00000000000..1b44d7516bf
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/builder/_lxml.py
@@ -0,0 +1,332 @@
+# Use of this source code is governed by the MIT license.
+__license__ = "MIT"
+
+__all__ = [
+ 'LXMLTreeBuilderForXML',
+ 'LXMLTreeBuilder',
+ ]
+
+try:
+ from collections.abc import Callable # Python 3.6
+except ImportError , e:
+ from collections import Callable
+
+from io import BytesIO
+from StringIO import StringIO
+from lxml import etree
+from bs4.element import (
+ Comment,
+ Doctype,
+ NamespacedAttribute,
+ ProcessingInstruction,
+ XMLProcessingInstruction,
+)
+from bs4.builder import (
+ FAST,
+ HTML,
+ HTMLTreeBuilder,
+ PERMISSIVE,
+ ParserRejectedMarkup,
+ TreeBuilder,
+ XML)
+from bs4.dammit import EncodingDetector
+
+LXML = 'lxml'
+
+def _invert(d):
+ "Invert a dictionary."
+ return dict((v,k) for k, v in d.items())
+
+class LXMLTreeBuilderForXML(TreeBuilder):
+ DEFAULT_PARSER_CLASS = etree.XMLParser
+
+ is_xml = True
+ processing_instruction_class = XMLProcessingInstruction
+
+ NAME = "lxml-xml"
+ ALTERNATE_NAMES = ["xml"]
+
+ # Well, it's permissive by XML parser standards.
+ features = [NAME, LXML, XML, FAST, PERMISSIVE]
+
+ CHUNK_SIZE = 512
+
+ # This namespace mapping is specified in the XML Namespace
+ # standard.
+ DEFAULT_NSMAPS = dict(xml='http://www.w3.org/XML/1998/namespace')
+
+ DEFAULT_NSMAPS_INVERTED = _invert(DEFAULT_NSMAPS)
+
+ # NOTE: If we parsed Element objects and looked at .sourceline,
+ # we'd be able to see the line numbers from the original document.
+ # But instead we build an XMLParser or HTMLParser object to serve
+ # as the target of parse messages, and those messages don't include
+ # line numbers.
+ # See: https://bugs.launchpad.net/lxml/+bug/1846906
+
+ def initialize_soup(self, soup):
+ """Let the BeautifulSoup object know about the standard namespace
+ mapping.
+
+ :param soup: A `BeautifulSoup`.
+ """
+ super(LXMLTreeBuilderForXML, self).initialize_soup(soup)
+ self._register_namespaces(self.DEFAULT_NSMAPS)
+
+ def _register_namespaces(self, mapping):
+ """Let the BeautifulSoup object know about namespaces encountered
+ while parsing the document.
+
+ This might be useful later on when creating CSS selectors.
+
+ :param mapping: A dictionary mapping namespace prefixes to URIs.
+ """
+ for key, value in mapping.items():
+ if key and key not in self.soup._namespaces:
+ # Let the BeautifulSoup object know about a new namespace.
+ # If there are multiple namespaces defined with the same
+ # prefix, the first one in the document takes precedence.
+ self.soup._namespaces[key] = value
+
+ def default_parser(self, encoding):
+ """Find the default parser for the given encoding.
+
+ :param encoding: A string.
+ :return: Either a parser object or a class, which
+ will be instantiated with default arguments.
+ """
+ if self._default_parser is not None:
+ return self._default_parser
+ return etree.XMLParser(
+ target=self, strip_cdata=False, recover=True, encoding=encoding)
+
+ def parser_for(self, encoding):
+ """Instantiate an appropriate parser for the given encoding.
+
+ :param encoding: A string.
+ :return: A parser object such as an `etree.XMLParser`.
+ """
+ # Use the default parser.
+ parser = self.default_parser(encoding)
+
+ if isinstance(parser, Callable):
+ # Instantiate the parser with default arguments
+ parser = parser(
+ target=self, strip_cdata=False, recover=True, encoding=encoding
+ )
+ return parser
+
+ def __init__(self, parser=None, empty_element_tags=None, **kwargs):
+ # TODO: Issue a warning if parser is present but not a
+ # callable, since that means there's no way to create new
+ # parsers for different encodings.
+ self._default_parser = parser
+ if empty_element_tags is not None:
+ self.empty_element_tags = set(empty_element_tags)
+ self.soup = None
+ self.nsmaps = [self.DEFAULT_NSMAPS_INVERTED]
+ super(LXMLTreeBuilderForXML, self).__init__(**kwargs)
+
+ def _getNsTag(self, tag):
+ # Split the namespace URL out of a fully-qualified lxml tag
+ # name. Copied from lxml's src/lxml/sax.py.
+ if tag[0] == '{':
+ return tuple(tag[1:].split('}', 1))
+ else:
+ return (None, tag)
+
+ def prepare_markup(self, markup, user_specified_encoding=None,
+ exclude_encodings=None,
+ document_declared_encoding=None):
+ """Run any preliminary steps necessary to make incoming markup
+ acceptable to the parser.
+
+ lxml really wants to get a bytestring and convert it to
+ Unicode itself. So instead of using UnicodeDammit to convert
+ the bytestring to Unicode using different encodings, this
+ implementation uses EncodingDetector to iterate over the
+ encodings, and tell lxml to try to parse the document as each
+ one in turn.
+
+ :param markup: Some markup -- hopefully a bytestring.
+ :param user_specified_encoding: The user asked to try this encoding.
+ :param document_declared_encoding: The markup itself claims to be
+ in this encoding.
+ :param exclude_encodings: The user asked _not_ to try any of
+ these encodings.
+
+ :yield: A series of 4-tuples:
+ (markup, encoding, declared encoding,
+ has undergone character replacement)
+
+ Each 4-tuple represents a strategy for converting the
+ document to Unicode and parsing it. Each strategy will be tried
+ in turn.
+ """
+ is_html = not self.is_xml
+ if is_html:
+ self.processing_instruction_class = ProcessingInstruction
+ else:
+ self.processing_instruction_class = XMLProcessingInstruction
+
+ if isinstance(markup, unicode):
+ # We were given Unicode. Maybe lxml can parse Unicode on
+ # this system?
+ yield markup, None, document_declared_encoding, False
+
+ if isinstance(markup, unicode):
+ # No, apparently not. Convert the Unicode to UTF-8 and
+ # tell lxml to parse it as UTF-8.
+ yield (markup.encode("utf8"), "utf8",
+ document_declared_encoding, False)
+
+ try_encodings = [user_specified_encoding, document_declared_encoding]
+ detector = EncodingDetector(
+ markup, try_encodings, is_html, exclude_encodings)
+ for encoding in detector.encodings:
+ yield (detector.markup, encoding, document_declared_encoding, False)
+
+ def feed(self, markup):
+ if isinstance(markup, bytes):
+ markup = BytesIO(markup)
+ elif isinstance(markup, unicode):
+ markup = StringIO(markup)
+
+ # Call feed() at least once, even if the markup is empty,
+ # or the parser won't be initialized.
+ data = markup.read(self.CHUNK_SIZE)
+ try:
+ self.parser = self.parser_for(self.soup.original_encoding)
+ self.parser.feed(data)
+ while len(data) != 0:
+ # Now call feed() on the rest of the data, chunk by chunk.
+ data = markup.read(self.CHUNK_SIZE)
+ if len(data) != 0:
+ self.parser.feed(data)
+ self.parser.close()
+ except (UnicodeDecodeError, LookupError, etree.ParserError), e:
+ raise ParserRejectedMarkup(e)
+
+ def close(self):
+ self.nsmaps = [self.DEFAULT_NSMAPS_INVERTED]
+
+ def start(self, name, attrs, nsmap={}):
+ # Make sure attrs is a mutable dict--lxml may send an immutable dictproxy.
+ attrs = dict(attrs)
+ nsprefix = None
+ # Invert each namespace map as it comes in.
+ if len(nsmap) == 0 and len(self.nsmaps) > 1:
+ # There are no new namespaces for this tag, but
+ # non-default namespaces are in play, so we need a
+ # separate tag stack to know when they end.
+ self.nsmaps.append(None)
+ elif len(nsmap) > 0:
+ # A new namespace mapping has come into play.
+
+ # First, Let the BeautifulSoup object know about it.
+ self._register_namespaces(nsmap)
+
+ # Then, add it to our running list of inverted namespace
+ # mappings.
+ self.nsmaps.append(_invert(nsmap))
+
+ # Also treat the namespace mapping as a set of attributes on the
+ # tag, so we can recreate it later.
+ attrs = attrs.copy()
+ for prefix, namespace in nsmap.items():
+ attribute = NamespacedAttribute(
+ "xmlns", prefix, "http://www.w3.org/2000/xmlns/")
+ attrs[attribute] = namespace
+
+ # Namespaces are in play. Find any attributes that came in
+ # from lxml with namespaces attached to their names, and
+ # turn then into NamespacedAttribute objects.
+ new_attrs = {}
+ for attr, value in attrs.items():
+ namespace, attr = self._getNsTag(attr)
+ if namespace is None:
+ new_attrs[attr] = value
+ else:
+ nsprefix = self._prefix_for_namespace(namespace)
+ attr = NamespacedAttribute(nsprefix, attr, namespace)
+ new_attrs[attr] = value
+ attrs = new_attrs
+
+ namespace, name = self._getNsTag(name)
+ nsprefix = self._prefix_for_namespace(namespace)
+ self.soup.handle_starttag(name, namespace, nsprefix, attrs)
+
+ def _prefix_for_namespace(self, namespace):
+ """Find the currently active prefix for the given namespace."""
+ if namespace is None:
+ return None
+ for inverted_nsmap in reversed(self.nsmaps):
+ if inverted_nsmap is not None and namespace in inverted_nsmap:
+ return inverted_nsmap[namespace]
+ return None
+
+ def end(self, name):
+ self.soup.endData()
+ completed_tag = self.soup.tagStack[-1]
+ namespace, name = self._getNsTag(name)
+ nsprefix = None
+ if namespace is not None:
+ for inverted_nsmap in reversed(self.nsmaps):
+ if inverted_nsmap is not None and namespace in inverted_nsmap:
+ nsprefix = inverted_nsmap[namespace]
+ break
+ self.soup.handle_endtag(name, nsprefix)
+ if len(self.nsmaps) > 1:
+ # This tag, or one of its parents, introduced a namespace
+ # mapping, so pop it off the stack.
+ self.nsmaps.pop()
+
+ def pi(self, target, data):
+ self.soup.endData()
+ self.soup.handle_data(target + ' ' + data)
+ self.soup.endData(self.processing_instruction_class)
+
+ def data(self, content):
+ self.soup.handle_data(content)
+
+ def doctype(self, name, pubid, system):
+ self.soup.endData()
+ doctype = Doctype.for_name_and_ids(name, pubid, system)
+ self.soup.object_was_parsed(doctype)
+
+ def comment(self, content):
+ "Handle comments as Comment objects."
+ self.soup.endData()
+ self.soup.handle_data(content)
+ self.soup.endData(Comment)
+
+ def test_fragment_to_document(self, fragment):
+ """See `TreeBuilder`."""
+ return u'<?xml version="1.0" encoding="utf-8"?>\n%s' % fragment
+
+
+class LXMLTreeBuilder(HTMLTreeBuilder, LXMLTreeBuilderForXML):
+
+ NAME = LXML
+ ALTERNATE_NAMES = ["lxml-html"]
+
+ features = ALTERNATE_NAMES + [NAME, HTML, FAST, PERMISSIVE]
+ is_xml = False
+ processing_instruction_class = ProcessingInstruction
+
+ def default_parser(self, encoding):
+ return etree.HTMLParser
+
+ def feed(self, markup):
+ encoding = self.soup.original_encoding
+ try:
+ self.parser = self.parser_for(encoding)
+ self.parser.feed(markup)
+ self.parser.close()
+ except (UnicodeDecodeError, LookupError, etree.ParserError), e:
+ raise ParserRejectedMarkup(e)
+
+
+ def test_fragment_to_document(self, fragment):
+ """See `TreeBuilder`."""
+ return u'<html><body>%s</body></html>' % fragment
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/dammit.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/dammit.py
new file mode 100644
index 00000000000..33f7b7d1be3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/dammit.py
@@ -0,0 +1,939 @@
+# -*- coding: utf-8 -*-
+"""Beautiful Soup bonus library: Unicode, Dammit
+
+This library converts a bytestream to Unicode through any means
+necessary. It is heavily based on code from Mark Pilgrim's Universal
+Feed Parser. It works best on XML and HTML, but it does not rewrite the
+XML or HTML to reflect a new encoding; that's the tree builder's job.
+"""
+# Use of this source code is governed by the MIT license.
+__license__ = "MIT"
+
+import codecs
+from htmlentitydefs import codepoint2name
+import re
+import logging
+import string
+
+# Import a library to autodetect character encodings.
+chardet_type = None
+try:
+ # First try the fast C implementation.
+ # PyPI package: cchardet
+ import cchardet
+ def chardet_dammit(s):
+ if isinstance(s, unicode):
+ return None
+ return cchardet.detect(s)['encoding']
+except ImportError:
+ try:
+ # Fall back to the pure Python implementation
+ # Debian package: python-chardet
+ # PyPI package: chardet
+ import chardet
+ def chardet_dammit(s):
+ if isinstance(s, unicode):
+ return None
+ return chardet.detect(s)['encoding']
+ #import chardet.constants
+ #chardet.constants._debug = 1
+ except ImportError:
+ # No chardet available.
+ def chardet_dammit(s):
+ return None
+
+# Available from http://cjkpython.i18n.org/.
+#
+# TODO: This doesn't work anymore and the closest thing, iconv_codecs,
+# is GPL-licensed. Check whether this is still necessary.
+try:
+ import iconv_codec
+except ImportError:
+ pass
+
+# Build bytestring and Unicode versions of regular expressions for finding
+# a declared encoding inside an XML or HTML document.
+xml_encoding = u'^\\s*<\\?.*encoding=[\'"](.*?)[\'"].*\\?>'
+html_meta = u'<\\s*meta[^>]+charset\\s*=\\s*["\']?([^>]*?)[ /;\'">]'
+encoding_res = dict()
+encoding_res[bytes] = {
+ 'html' : re.compile(html_meta.encode("ascii"), re.I),
+ 'xml' : re.compile(xml_encoding.encode("ascii"), re.I),
+}
+encoding_res[unicode] = {
+ 'html' : re.compile(html_meta, re.I),
+ 'xml' : re.compile(xml_encoding, re.I)
+}
+
+class EntitySubstitution(object):
+ """The ability to substitute XML or HTML entities for certain characters."""
+
+ def _populate_class_variables():
+ lookup = {}
+ reverse_lookup = {}
+ characters_for_re = []
+
+ # &apos is an XHTML entity and an HTML 5, but not an HTML 4
+ # entity. We don't want to use it, but we want to recognize it on the way in.
+ #
+ # TODO: Ideally we would be able to recognize all HTML 5 named
+ # entities, but that's a little tricky.
+ extra = [(39, 'apos')]
+ for codepoint, name in list(codepoint2name.items()) + extra:
+ character = unichr(codepoint)
+ if codepoint not in (34, 39):
+ # There's no point in turning the quotation mark into
+ # &quot; or the single quote into &apos;, unless it
+ # happens within an attribute value, which is handled
+ # elsewhere.
+ characters_for_re.append(character)
+ lookup[character] = name
+ # But we do want to recognize those entities on the way in and
+ # convert them to Unicode characters.
+ reverse_lookup[name] = character
+ re_definition = "[%s]" % "".join(characters_for_re)
+ return lookup, reverse_lookup, re.compile(re_definition)
+ (CHARACTER_TO_HTML_ENTITY, HTML_ENTITY_TO_CHARACTER,
+ CHARACTER_TO_HTML_ENTITY_RE) = _populate_class_variables()
+
+ CHARACTER_TO_XML_ENTITY = {
+ "'": "apos",
+ '"': "quot",
+ "&": "amp",
+ "<": "lt",
+ ">": "gt",
+ }
+
+ BARE_AMPERSAND_OR_BRACKET = re.compile("([<>]|"
+ "&(?!#\\d+;|#x[0-9a-fA-F]+;|\\w+;)"
+ ")")
+
+ AMPERSAND_OR_BRACKET = re.compile("([<>&])")
+
+ @classmethod
+ def _substitute_html_entity(cls, matchobj):
+ """Used with a regular expression to substitute the
+ appropriate HTML entity for a special character."""
+ entity = cls.CHARACTER_TO_HTML_ENTITY.get(matchobj.group(0))
+ return "&%s;" % entity
+
+ @classmethod
+ def _substitute_xml_entity(cls, matchobj):
+ """Used with a regular expression to substitute the
+ appropriate XML entity for a special character."""
+ entity = cls.CHARACTER_TO_XML_ENTITY[matchobj.group(0)]
+ return "&%s;" % entity
+
+ @classmethod
+ def quoted_attribute_value(self, value):
+ """Make a value into a quoted XML attribute, possibly escaping it.
+
+ Most strings will be quoted using double quotes.
+
+ Bob's Bar -> "Bob's Bar"
+
+ If a string contains double quotes, it will be quoted using
+ single quotes.
+
+ Welcome to "my bar" -> 'Welcome to "my bar"'
+
+ If a string contains both single and double quotes, the
+ double quotes will be escaped, and the string will be quoted
+ using double quotes.
+
+ Welcome to "Bob's Bar" -> "Welcome to &quot;Bob's bar&quot;
+ """
+ quote_with = '"'
+ if '"' in value:
+ if "'" in value:
+ # The string contains both single and double
+ # quotes. Turn the double quotes into
+ # entities. We quote the double quotes rather than
+ # the single quotes because the entity name is
+ # "&quot;" whether this is HTML or XML. If we
+ # quoted the single quotes, we'd have to decide
+ # between &apos; and &squot;.
+ replace_with = "&quot;"
+ value = value.replace('"', replace_with)
+ else:
+ # There are double quotes but no single quotes.
+ # We can use single quotes to quote the attribute.
+ quote_with = "'"
+ return quote_with + value + quote_with
+
+ @classmethod
+ def substitute_xml(cls, value, make_quoted_attribute=False):
+ """Substitute XML entities for special XML characters.
+
+ :param value: A string to be substituted. The less-than sign
+ will become &lt;, the greater-than sign will become &gt;,
+ and any ampersands will become &amp;. If you want ampersands
+ that appear to be part of an entity definition to be left
+ alone, use substitute_xml_containing_entities() instead.
+
+ :param make_quoted_attribute: If True, then the string will be
+ quoted, as befits an attribute value.
+ """
+ # Escape angle brackets and ampersands.
+ value = cls.AMPERSAND_OR_BRACKET.sub(
+ cls._substitute_xml_entity, value)
+
+ if make_quoted_attribute:
+ value = cls.quoted_attribute_value(value)
+ return value
+
+ @classmethod
+ def substitute_xml_containing_entities(
+ cls, value, make_quoted_attribute=False):
+ """Substitute XML entities for special XML characters.
+
+ :param value: A string to be substituted. The less-than sign will
+ become &lt;, the greater-than sign will become &gt;, and any
+ ampersands that are not part of an entity defition will
+ become &amp;.
+
+ :param make_quoted_attribute: If True, then the string will be
+ quoted, as befits an attribute value.
+ """
+ # Escape angle brackets, and ampersands that aren't part of
+ # entities.
+ value = cls.BARE_AMPERSAND_OR_BRACKET.sub(
+ cls._substitute_xml_entity, value)
+
+ if make_quoted_attribute:
+ value = cls.quoted_attribute_value(value)
+ return value
+
+ @classmethod
+ def substitute_html(cls, s):
+ """Replace certain Unicode characters with named HTML entities.
+
+ This differs from data.encode(encoding, 'xmlcharrefreplace')
+ in that the goal is to make the result more readable (to those
+ with ASCII displays) rather than to recover from
+ errors. There's absolutely nothing wrong with a UTF-8 string
+ containg a LATIN SMALL LETTER E WITH ACUTE, but replacing that
+ character with "&eacute;" will make it more readable to some
+ people.
+
+ :param s: A Unicode string.
+ """
+ return cls.CHARACTER_TO_HTML_ENTITY_RE.sub(
+ cls._substitute_html_entity, s)
+
+
+class EncodingDetector:
+ """Suggests a number of possible encodings for a bytestring.
+
+ Order of precedence:
+
+ 1. Encodings you specifically tell EncodingDetector to try first
+ (the override_encodings argument to the constructor).
+
+ 2. An encoding declared within the bytestring itself, either in an
+ XML declaration (if the bytestring is to be interpreted as an XML
+ document), or in a <meta> tag (if the bytestring is to be
+ interpreted as an HTML document.)
+
+ 3. An encoding detected through textual analysis by chardet,
+ cchardet, or a similar external library.
+
+ 4. UTF-8.
+
+ 5. Windows-1252.
+ """
+ def __init__(self, markup, override_encodings=None, is_html=False,
+ exclude_encodings=None):
+ """Constructor.
+
+ :param markup: Some markup in an unknown encoding.
+ :param override_encodings: These encodings will be tried first.
+ :param is_html: If True, this markup is considered to be HTML. Otherwise
+ it's assumed to be XML.
+ :param exclude_encodings: These encodings will not be tried, even
+ if they otherwise would be.
+ """
+ self.override_encodings = override_encodings or []
+ exclude_encodings = exclude_encodings or []
+ self.exclude_encodings = set([x.lower() for x in exclude_encodings])
+ self.chardet_encoding = None
+ self.is_html = is_html
+ self.declared_encoding = None
+
+ # First order of business: strip a byte-order mark.
+ self.markup, self.sniffed_encoding = self.strip_byte_order_mark(markup)
+
+ def _usable(self, encoding, tried):
+ """Should we even bother to try this encoding?
+
+ :param encoding: Name of an encoding.
+ :param tried: Encodings that have already been tried. This will be modified
+ as a side effect.
+ """
+ if encoding is not None:
+ encoding = encoding.lower()
+ if encoding in self.exclude_encodings:
+ return False
+ if encoding not in tried:
+ tried.add(encoding)
+ return True
+ return False
+
+ @property
+ def encodings(self):
+ """Yield a number of encodings that might work for this markup.
+
+ :yield: A sequence of strings.
+ """
+ tried = set()
+ for e in self.override_encodings:
+ if self._usable(e, tried):
+ yield e
+
+ # Did the document originally start with a byte-order mark
+ # that indicated its encoding?
+ if self._usable(self.sniffed_encoding, tried):
+ yield self.sniffed_encoding
+
+ # Look within the document for an XML or HTML encoding
+ # declaration.
+ if self.declared_encoding is None:
+ self.declared_encoding = self.find_declared_encoding(
+ self.markup, self.is_html)
+ if self._usable(self.declared_encoding, tried):
+ yield self.declared_encoding
+
+ # Use third-party character set detection to guess at the
+ # encoding.
+ if self.chardet_encoding is None:
+ self.chardet_encoding = chardet_dammit(self.markup)
+ if self._usable(self.chardet_encoding, tried):
+ yield self.chardet_encoding
+
+ # As a last-ditch effort, try utf-8 and windows-1252.
+ for e in ('utf-8', 'windows-1252'):
+ if self._usable(e, tried):
+ yield e
+
+ @classmethod
+ def strip_byte_order_mark(cls, data):
+ """If a byte-order mark is present, strip it and return the encoding it implies.
+
+ :param data: Some markup.
+ :return: A 2-tuple (modified data, implied encoding)
+ """
+ encoding = None
+ if isinstance(data, unicode):
+ # Unicode data cannot have a byte-order mark.
+ return data, encoding
+ if (len(data) >= 4) and (data[:2] == b'\xfe\xff') \
+ and (data[2:4] != '\x00\x00'):
+ encoding = 'utf-16be'
+ data = data[2:]
+ elif (len(data) >= 4) and (data[:2] == b'\xff\xfe') \
+ and (data[2:4] != '\x00\x00'):
+ encoding = 'utf-16le'
+ data = data[2:]
+ elif data[:3] == b'\xef\xbb\xbf':
+ encoding = 'utf-8'
+ data = data[3:]
+ elif data[:4] == b'\x00\x00\xfe\xff':
+ encoding = 'utf-32be'
+ data = data[4:]
+ elif data[:4] == b'\xff\xfe\x00\x00':
+ encoding = 'utf-32le'
+ data = data[4:]
+ return data, encoding
+
+ @classmethod
+ def find_declared_encoding(cls, markup, is_html=False, search_entire_document=False):
+ """Given a document, tries to find its declared encoding.
+
+ An XML encoding is declared at the beginning of the document.
+
+ An HTML encoding is declared in a <meta> tag, hopefully near the
+ beginning of the document.
+
+ :param markup: Some markup.
+ :param is_html: If True, this markup is considered to be HTML. Otherwise
+ it's assumed to be XML.
+ :param search_entire_document: Since an encoding is supposed to declared near the beginning
+ of the document, most of the time it's only necessary to search a few kilobytes of data.
+ Set this to True to force this method to search the entire document.
+ """
+ if search_entire_document:
+ xml_endpos = html_endpos = len(markup)
+ else:
+ xml_endpos = 1024
+ html_endpos = max(2048, int(len(markup) * 0.05))
+
+ if isinstance(markup, bytes):
+ res = encoding_res[bytes]
+ else:
+ res = encoding_res[unicode]
+
+ xml_re = res['xml']
+ html_re = res['html']
+ declared_encoding = None
+ declared_encoding_match = xml_re.search(markup, endpos=xml_endpos)
+ if not declared_encoding_match and is_html:
+ declared_encoding_match = html_re.search(markup, endpos=html_endpos)
+ if declared_encoding_match is not None:
+ declared_encoding = declared_encoding_match.groups()[0]
+ if declared_encoding:
+ if isinstance(declared_encoding, bytes):
+ declared_encoding = declared_encoding.decode('ascii', 'replace')
+ return declared_encoding.lower()
+ return None
+
+class UnicodeDammit:
+ """A class for detecting the encoding of a *ML document and
+ converting it to a Unicode string. If the source encoding is
+ windows-1252, can replace MS smart quotes with their HTML or XML
+ equivalents."""
+
+ # This dictionary maps commonly seen values for "charset" in HTML
+ # meta tags to the corresponding Python codec names. It only covers
+ # values that aren't in Python's aliases and can't be determined
+ # by the heuristics in find_codec.
+ CHARSET_ALIASES = {"macintosh": "mac-roman",
+ "x-sjis": "shift-jis"}
+
+ ENCODINGS_WITH_SMART_QUOTES = [
+ "windows-1252",
+ "iso-8859-1",
+ "iso-8859-2",
+ ]
+
+ def __init__(self, markup, override_encodings=[],
+ smart_quotes_to=None, is_html=False, exclude_encodings=[]):
+ """Constructor.
+
+ :param markup: A bytestring representing markup in an unknown encoding.
+ :param override_encodings: These encodings will be tried first,
+ before any sniffing code is run.
+
+ :param smart_quotes_to: By default, Microsoft smart quotes will, like all other characters, be converted
+ to Unicode characters. Setting this to 'ascii' will convert them to ASCII quotes instead.
+ Setting it to 'xml' will convert them to XML entity references, and setting it to 'html'
+ will convert them to HTML entity references.
+ :param is_html: If True, this markup is considered to be HTML. Otherwise
+ it's assumed to be XML.
+ :param exclude_encodings: These encodings will not be considered, even
+ if the sniffing code thinks they might make sense.
+ """
+ self.smart_quotes_to = smart_quotes_to
+ self.tried_encodings = []
+ self.contains_replacement_characters = False
+ self.is_html = is_html
+ self.log = logging.getLogger(__name__)
+ self.detector = EncodingDetector(
+ markup, override_encodings, is_html, exclude_encodings)
+
+ # Short-circuit if the data is in Unicode to begin with.
+ if isinstance(markup, unicode) or markup == '':
+ self.markup = markup
+ self.unicode_markup = unicode(markup)
+ self.original_encoding = None
+ return
+
+ # The encoding detector may have stripped a byte-order mark.
+ # Use the stripped markup from this point on.
+ self.markup = self.detector.markup
+
+ u = None
+ for encoding in self.detector.encodings:
+ markup = self.detector.markup
+ u = self._convert_from(encoding)
+ if u is not None:
+ break
+
+ if not u:
+ # None of the encodings worked. As an absolute last resort,
+ # try them again with character replacement.
+
+ for encoding in self.detector.encodings:
+ if encoding != "ascii":
+ u = self._convert_from(encoding, "replace")
+ if u is not None:
+ self.log.warning(
+ "Some characters could not be decoded, and were "
+ "replaced with REPLACEMENT CHARACTER."
+ )
+ self.contains_replacement_characters = True
+ break
+
+ # If none of that worked, we could at this point force it to
+ # ASCII, but that would destroy so much data that I think
+ # giving up is better.
+ self.unicode_markup = u
+ if not u:
+ self.original_encoding = None
+
+ def _sub_ms_char(self, match):
+ """Changes a MS smart quote character to an XML or HTML
+ entity, or an ASCII character."""
+ orig = match.group(1)
+ if self.smart_quotes_to == 'ascii':
+ sub = self.MS_CHARS_TO_ASCII.get(orig).encode()
+ else:
+ sub = self.MS_CHARS.get(orig)
+ if type(sub) == tuple:
+ if self.smart_quotes_to == 'xml':
+ sub = '&#x'.encode() + sub[1].encode() + ';'.encode()
+ else:
+ sub = '&'.encode() + sub[0].encode() + ';'.encode()
+ else:
+ sub = sub.encode()
+ return sub
+
+ def _convert_from(self, proposed, errors="strict"):
+ """Attempt to convert the markup to the proposed encoding.
+
+ :param proposed: The name of a character encoding.
+ """
+ proposed = self.find_codec(proposed)
+ if not proposed or (proposed, errors) in self.tried_encodings:
+ return None
+ self.tried_encodings.append((proposed, errors))
+ markup = self.markup
+ # Convert smart quotes to HTML if coming from an encoding
+ # that might have them.
+ if (self.smart_quotes_to is not None
+ and proposed in self.ENCODINGS_WITH_SMART_QUOTES):
+ smart_quotes_re = b"([\x80-\x9f])"
+ smart_quotes_compiled = re.compile(smart_quotes_re)
+ markup = smart_quotes_compiled.sub(self._sub_ms_char, markup)
+
+ try:
+ #print("Trying to convert document to %s (errors=%s)" % (
+ # proposed, errors))
+ u = self._to_unicode(markup, proposed, errors)
+ self.markup = u
+ self.original_encoding = proposed
+ except Exception as e:
+ #print("That didn't work!")
+ #print(e)
+ return None
+ #print("Correct encoding: %s" % proposed)
+ return self.markup
+
+ def _to_unicode(self, data, encoding, errors="strict"):
+ """Given a string and its encoding, decodes the string into Unicode.
+
+ :param encoding: The name of an encoding.
+ """
+ return unicode(data, encoding, errors)
+
+ @property
+ def declared_html_encoding(self):
+ """If the markup is an HTML document, returns the encoding declared _within_
+ the document.
+ """
+ if not self.is_html:
+ return None
+ return self.detector.declared_encoding
+
+ def find_codec(self, charset):
+ """Convert the name of a character set to a codec name.
+
+ :param charset: The name of a character set.
+ :return: The name of a codec.
+ """
+ value = (self._codec(self.CHARSET_ALIASES.get(charset, charset))
+ or (charset and self._codec(charset.replace("-", "")))
+ or (charset and self._codec(charset.replace("-", "_")))
+ or (charset and charset.lower())
+ or charset
+ )
+ if value:
+ return value.lower()
+ return None
+
+ def _codec(self, charset):
+ if not charset:
+ return charset
+ codec = None
+ try:
+ codecs.lookup(charset)
+ codec = charset
+ except (LookupError, ValueError):
+ pass
+ return codec
+
+
+ # A partial mapping of ISO-Latin-1 to HTML entities/XML numeric entities.
+ MS_CHARS = {b'\x80': ('euro', '20AC'),
+ b'\x81': ' ',
+ b'\x82': ('sbquo', '201A'),
+ b'\x83': ('fnof', '192'),
+ b'\x84': ('bdquo', '201E'),
+ b'\x85': ('hellip', '2026'),
+ b'\x86': ('dagger', '2020'),
+ b'\x87': ('Dagger', '2021'),
+ b'\x88': ('circ', '2C6'),
+ b'\x89': ('permil', '2030'),
+ b'\x8A': ('Scaron', '160'),
+ b'\x8B': ('lsaquo', '2039'),
+ b'\x8C': ('OElig', '152'),
+ b'\x8D': '?',
+ b'\x8E': ('#x17D', '17D'),
+ b'\x8F': '?',
+ b'\x90': '?',
+ b'\x91': ('lsquo', '2018'),
+ b'\x92': ('rsquo', '2019'),
+ b'\x93': ('ldquo', '201C'),
+ b'\x94': ('rdquo', '201D'),
+ b'\x95': ('bull', '2022'),
+ b'\x96': ('ndash', '2013'),
+ b'\x97': ('mdash', '2014'),
+ b'\x98': ('tilde', '2DC'),
+ b'\x99': ('trade', '2122'),
+ b'\x9a': ('scaron', '161'),
+ b'\x9b': ('rsaquo', '203A'),
+ b'\x9c': ('oelig', '153'),
+ b'\x9d': '?',
+ b'\x9e': ('#x17E', '17E'),
+ b'\x9f': ('Yuml', ''),}
+
+ # A parochial partial mapping of ISO-Latin-1 to ASCII. Contains
+ # horrors like stripping diacritical marks to turn á into a, but also
+ # contains non-horrors like turning “ into ".
+ MS_CHARS_TO_ASCII = {
+ b'\x80' : 'EUR',
+ b'\x81' : ' ',
+ b'\x82' : ',',
+ b'\x83' : 'f',
+ b'\x84' : ',,',
+ b'\x85' : '...',
+ b'\x86' : '+',
+ b'\x87' : '++',
+ b'\x88' : '^',
+ b'\x89' : '%',
+ b'\x8a' : 'S',
+ b'\x8b' : '<',
+ b'\x8c' : 'OE',
+ b'\x8d' : '?',
+ b'\x8e' : 'Z',
+ b'\x8f' : '?',
+ b'\x90' : '?',
+ b'\x91' : "'",
+ b'\x92' : "'",
+ b'\x93' : '"',
+ b'\x94' : '"',
+ b'\x95' : '*',
+ b'\x96' : '-',
+ b'\x97' : '--',
+ b'\x98' : '~',
+ b'\x99' : '(TM)',
+ b'\x9a' : 's',
+ b'\x9b' : '>',
+ b'\x9c' : 'oe',
+ b'\x9d' : '?',
+ b'\x9e' : 'z',
+ b'\x9f' : 'Y',
+ b'\xa0' : ' ',
+ b'\xa1' : '!',
+ b'\xa2' : 'c',
+ b'\xa3' : 'GBP',
+ b'\xa4' : '$', #This approximation is especially parochial--this is the
+ #generic currency symbol.
+ b'\xa5' : 'YEN',
+ b'\xa6' : '|',
+ b'\xa7' : 'S',
+ b'\xa8' : '..',
+ b'\xa9' : '',
+ b'\xaa' : '(th)',
+ b'\xab' : '<<',
+ b'\xac' : '!',
+ b'\xad' : ' ',
+ b'\xae' : '(R)',
+ b'\xaf' : '-',
+ b'\xb0' : 'o',
+ b'\xb1' : '+-',
+ b'\xb2' : '2',
+ b'\xb3' : '3',
+ b'\xb4' : ("'", 'acute'),
+ b'\xb5' : 'u',
+ b'\xb6' : 'P',
+ b'\xb7' : '*',
+ b'\xb8' : ',',
+ b'\xb9' : '1',
+ b'\xba' : '(th)',
+ b'\xbb' : '>>',
+ b'\xbc' : '1/4',
+ b'\xbd' : '1/2',
+ b'\xbe' : '3/4',
+ b'\xbf' : '?',
+ b'\xc0' : 'A',
+ b'\xc1' : 'A',
+ b'\xc2' : 'A',
+ b'\xc3' : 'A',
+ b'\xc4' : 'A',
+ b'\xc5' : 'A',
+ b'\xc6' : 'AE',
+ b'\xc7' : 'C',
+ b'\xc8' : 'E',
+ b'\xc9' : 'E',
+ b'\xca' : 'E',
+ b'\xcb' : 'E',
+ b'\xcc' : 'I',
+ b'\xcd' : 'I',
+ b'\xce' : 'I',
+ b'\xcf' : 'I',
+ b'\xd0' : 'D',
+ b'\xd1' : 'N',
+ b'\xd2' : 'O',
+ b'\xd3' : 'O',
+ b'\xd4' : 'O',
+ b'\xd5' : 'O',
+ b'\xd6' : 'O',
+ b'\xd7' : '*',
+ b'\xd8' : 'O',
+ b'\xd9' : 'U',
+ b'\xda' : 'U',
+ b'\xdb' : 'U',
+ b'\xdc' : 'U',
+ b'\xdd' : 'Y',
+ b'\xde' : 'b',
+ b'\xdf' : 'B',
+ b'\xe0' : 'a',
+ b'\xe1' : 'a',
+ b'\xe2' : 'a',
+ b'\xe3' : 'a',
+ b'\xe4' : 'a',
+ b'\xe5' : 'a',
+ b'\xe6' : 'ae',
+ b'\xe7' : 'c',
+ b'\xe8' : 'e',
+ b'\xe9' : 'e',
+ b'\xea' : 'e',
+ b'\xeb' : 'e',
+ b'\xec' : 'i',
+ b'\xed' : 'i',
+ b'\xee' : 'i',
+ b'\xef' : 'i',
+ b'\xf0' : 'o',
+ b'\xf1' : 'n',
+ b'\xf2' : 'o',
+ b'\xf3' : 'o',
+ b'\xf4' : 'o',
+ b'\xf5' : 'o',
+ b'\xf6' : 'o',
+ b'\xf7' : '/',
+ b'\xf8' : 'o',
+ b'\xf9' : 'u',
+ b'\xfa' : 'u',
+ b'\xfb' : 'u',
+ b'\xfc' : 'u',
+ b'\xfd' : 'y',
+ b'\xfe' : 'b',
+ b'\xff' : 'y',
+ }
+
+ # A map used when removing rogue Windows-1252/ISO-8859-1
+ # characters in otherwise UTF-8 documents.
+ #
+ # Note that \x81, \x8d, \x8f, \x90, and \x9d are undefined in
+ # Windows-1252.
+ WINDOWS_1252_TO_UTF8 = {
+ 0x80 : b'\xe2\x82\xac', # €
+ 0x82 : b'\xe2\x80\x9a', # ‚
+ 0x83 : b'\xc6\x92', # ƒ
+ 0x84 : b'\xe2\x80\x9e', # „
+ 0x85 : b'\xe2\x80\xa6', # …
+ 0x86 : b'\xe2\x80\xa0', # †
+ 0x87 : b'\xe2\x80\xa1', # ‡
+ 0x88 : b'\xcb\x86', # ˆ
+ 0x89 : b'\xe2\x80\xb0', # ‰
+ 0x8a : b'\xc5\xa0', # Š
+ 0x8b : b'\xe2\x80\xb9', # ‹
+ 0x8c : b'\xc5\x92', # Œ
+ 0x8e : b'\xc5\xbd', # Ž
+ 0x91 : b'\xe2\x80\x98', # ‘
+ 0x92 : b'\xe2\x80\x99', # ’
+ 0x93 : b'\xe2\x80\x9c', # “
+ 0x94 : b'\xe2\x80\x9d', # ”
+ 0x95 : b'\xe2\x80\xa2', # •
+ 0x96 : b'\xe2\x80\x93', # –
+ 0x97 : b'\xe2\x80\x94', # —
+ 0x98 : b'\xcb\x9c', # ˜
+ 0x99 : b'\xe2\x84\xa2', # ™
+ 0x9a : b'\xc5\xa1', # š
+ 0x9b : b'\xe2\x80\xba', # ›
+ 0x9c : b'\xc5\x93', # œ
+ 0x9e : b'\xc5\xbe', # ž
+ 0x9f : b'\xc5\xb8', # Ÿ
+ 0xa0 : b'\xc2\xa0', #  
+ 0xa1 : b'\xc2\xa1', # ¡
+ 0xa2 : b'\xc2\xa2', # ¢
+ 0xa3 : b'\xc2\xa3', # £
+ 0xa4 : b'\xc2\xa4', # ¤
+ 0xa5 : b'\xc2\xa5', # ¥
+ 0xa6 : b'\xc2\xa6', # ¦
+ 0xa7 : b'\xc2\xa7', # §
+ 0xa8 : b'\xc2\xa8', # ¨
+ 0xa9 : b'\xc2\xa9', # ©
+ 0xaa : b'\xc2\xaa', # ª
+ 0xab : b'\xc2\xab', # «
+ 0xac : b'\xc2\xac', # ¬
+ 0xad : b'\xc2\xad', # ­
+ 0xae : b'\xc2\xae', # ®
+ 0xaf : b'\xc2\xaf', # ¯
+ 0xb0 : b'\xc2\xb0', # °
+ 0xb1 : b'\xc2\xb1', # ±
+ 0xb2 : b'\xc2\xb2', # ²
+ 0xb3 : b'\xc2\xb3', # ³
+ 0xb4 : b'\xc2\xb4', # ´
+ 0xb5 : b'\xc2\xb5', # µ
+ 0xb6 : b'\xc2\xb6', # ¶
+ 0xb7 : b'\xc2\xb7', # ·
+ 0xb8 : b'\xc2\xb8', # ¸
+ 0xb9 : b'\xc2\xb9', # ¹
+ 0xba : b'\xc2\xba', # º
+ 0xbb : b'\xc2\xbb', # »
+ 0xbc : b'\xc2\xbc', # ¼
+ 0xbd : b'\xc2\xbd', # ½
+ 0xbe : b'\xc2\xbe', # ¾
+ 0xbf : b'\xc2\xbf', # ¿
+ 0xc0 : b'\xc3\x80', # À
+ 0xc1 : b'\xc3\x81', # Á
+ 0xc2 : b'\xc3\x82', # Â
+ 0xc3 : b'\xc3\x83', # Ã
+ 0xc4 : b'\xc3\x84', # Ä
+ 0xc5 : b'\xc3\x85', # Å
+ 0xc6 : b'\xc3\x86', # Æ
+ 0xc7 : b'\xc3\x87', # Ç
+ 0xc8 : b'\xc3\x88', # È
+ 0xc9 : b'\xc3\x89', # É
+ 0xca : b'\xc3\x8a', # Ê
+ 0xcb : b'\xc3\x8b', # Ë
+ 0xcc : b'\xc3\x8c', # Ì
+ 0xcd : b'\xc3\x8d', # Í
+ 0xce : b'\xc3\x8e', # Î
+ 0xcf : b'\xc3\x8f', # Ï
+ 0xd0 : b'\xc3\x90', # Ð
+ 0xd1 : b'\xc3\x91', # Ñ
+ 0xd2 : b'\xc3\x92', # Ò
+ 0xd3 : b'\xc3\x93', # Ó
+ 0xd4 : b'\xc3\x94', # Ô
+ 0xd5 : b'\xc3\x95', # Õ
+ 0xd6 : b'\xc3\x96', # Ö
+ 0xd7 : b'\xc3\x97', # ×
+ 0xd8 : b'\xc3\x98', # Ø
+ 0xd9 : b'\xc3\x99', # Ù
+ 0xda : b'\xc3\x9a', # Ú
+ 0xdb : b'\xc3\x9b', # Û
+ 0xdc : b'\xc3\x9c', # Ü
+ 0xdd : b'\xc3\x9d', # Ý
+ 0xde : b'\xc3\x9e', # Þ
+ 0xdf : b'\xc3\x9f', # ß
+ 0xe0 : b'\xc3\xa0', # à
+ 0xe1 : b'\xa1', # á
+ 0xe2 : b'\xc3\xa2', # â
+ 0xe3 : b'\xc3\xa3', # ã
+ 0xe4 : b'\xc3\xa4', # ä
+ 0xe5 : b'\xc3\xa5', # å
+ 0xe6 : b'\xc3\xa6', # æ
+ 0xe7 : b'\xc3\xa7', # ç
+ 0xe8 : b'\xc3\xa8', # è
+ 0xe9 : b'\xc3\xa9', # é
+ 0xea : b'\xc3\xaa', # ê
+ 0xeb : b'\xc3\xab', # ë
+ 0xec : b'\xc3\xac', # ì
+ 0xed : b'\xc3\xad', # í
+ 0xee : b'\xc3\xae', # î
+ 0xef : b'\xc3\xaf', # ï
+ 0xf0 : b'\xc3\xb0', # ð
+ 0xf1 : b'\xc3\xb1', # ñ
+ 0xf2 : b'\xc3\xb2', # ò
+ 0xf3 : b'\xc3\xb3', # ó
+ 0xf4 : b'\xc3\xb4', # ô
+ 0xf5 : b'\xc3\xb5', # õ
+ 0xf6 : b'\xc3\xb6', # ö
+ 0xf7 : b'\xc3\xb7', # ÷
+ 0xf8 : b'\xc3\xb8', # ø
+ 0xf9 : b'\xc3\xb9', # ù
+ 0xfa : b'\xc3\xba', # ú
+ 0xfb : b'\xc3\xbb', # û
+ 0xfc : b'\xc3\xbc', # ü
+ 0xfd : b'\xc3\xbd', # ý
+ 0xfe : b'\xc3\xbe', # þ
+ }
+
+ MULTIBYTE_MARKERS_AND_SIZES = [
+ (0xc2, 0xdf, 2), # 2-byte characters start with a byte C2-DF
+ (0xe0, 0xef, 3), # 3-byte characters start with E0-EF
+ (0xf0, 0xf4, 4), # 4-byte characters start with F0-F4
+ ]
+
+ FIRST_MULTIBYTE_MARKER = MULTIBYTE_MARKERS_AND_SIZES[0][0]
+ LAST_MULTIBYTE_MARKER = MULTIBYTE_MARKERS_AND_SIZES[-1][1]
+
+ @classmethod
+ def detwingle(cls, in_bytes, main_encoding="utf8",
+ embedded_encoding="windows-1252"):
+ """Fix characters from one encoding embedded in some other encoding.
+
+ Currently the only situation supported is Windows-1252 (or its
+ subset ISO-8859-1), embedded in UTF-8.
+
+ :param in_bytes: A bytestring that you suspect contains
+ characters from multiple encodings. Note that this _must_
+ be a bytestring. If you've already converted the document
+ to Unicode, you're too late.
+ :param main_encoding: The primary encoding of `in_bytes`.
+ :param embedded_encoding: The encoding that was used to embed characters
+ in the main document.
+ :return: A bytestring in which `embedded_encoding`
+ characters have been converted to their `main_encoding`
+ equivalents.
+ """
+ if embedded_encoding.replace('_', '-').lower() not in (
+ 'windows-1252', 'windows_1252'):
+ raise NotImplementedError(
+ "Windows-1252 and ISO-8859-1 are the only currently supported "
+ "embedded encodings.")
+
+ if main_encoding.lower() not in ('utf8', 'utf-8'):
+ raise NotImplementedError(
+ "UTF-8 is the only currently supported main encoding.")
+
+ byte_chunks = []
+
+ chunk_start = 0
+ pos = 0
+ while pos < len(in_bytes):
+ byte = in_bytes[pos]
+ if not isinstance(byte, int):
+ # Python 2.x
+ byte = ord(byte)
+ if (byte >= cls.FIRST_MULTIBYTE_MARKER
+ and byte <= cls.LAST_MULTIBYTE_MARKER):
+ # This is the start of a UTF-8 multibyte character. Skip
+ # to the end.
+ for start, end, size in cls.MULTIBYTE_MARKERS_AND_SIZES:
+ if byte >= start and byte <= end:
+ pos += size
+ break
+ elif byte >= 0x80 and byte in cls.WINDOWS_1252_TO_UTF8:
+ # We found a Windows-1252 character!
+ # Save the string up to this point as a chunk.
+ byte_chunks.append(in_bytes[chunk_start:pos])
+
+ # Now translate the Windows-1252 character into UTF-8
+ # and add it as another, one-byte chunk.
+ byte_chunks.append(cls.WINDOWS_1252_TO_UTF8[byte])
+ pos += 1
+ chunk_start = pos
+ else:
+ # Go on to the next character.
+ pos += 1
+ if chunk_start == 0:
+ # The string is unchanged.
+ return in_bytes
+ else:
+ # Store the final chunk.
+ byte_chunks.append(in_bytes[chunk_start:])
+ return b''.join(byte_chunks)
+
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/diagnose.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/diagnose.py
new file mode 100644
index 00000000000..e4f2f47fa96
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/diagnose.py
@@ -0,0 +1,242 @@
+"""Diagnostic functions, mainly for use when doing tech support."""
+
+# Use of this source code is governed by the MIT license.
+__license__ = "MIT"
+
+import cProfile
+from StringIO import StringIO
+from HTMLParser import HTMLParser
+import bs4
+from bs4 import BeautifulSoup, __version__
+from bs4.builder import builder_registry
+
+import os
+import pstats
+import random
+import tempfile
+import time
+import traceback
+import sys
+import cProfile
+
+def diagnose(data):
+ """Diagnostic suite for isolating common problems.
+
+ :param data: A string containing markup that needs to be explained.
+ :return: None; diagnostics are printed to standard output.
+ """
+ print("Diagnostic running on Beautiful Soup %s" % __version__)
+ print("Python version %s" % sys.version)
+
+ basic_parsers = ["html.parser", "html5lib", "lxml"]
+ for name in basic_parsers:
+ for builder in builder_registry.builders:
+ if name in builder.features:
+ break
+ else:
+ basic_parsers.remove(name)
+ print(
+ "I noticed that %s is not installed. Installing it may help." %
+ name)
+
+ if 'lxml' in basic_parsers:
+ basic_parsers.append("lxml-xml")
+ try:
+ from lxml import etree
+ print("Found lxml version %s" % ".".join(map(str,etree.LXML_VERSION)))
+ except ImportError, e:
+ print(
+ "lxml is not installed or couldn't be imported.")
+
+
+ if 'html5lib' in basic_parsers:
+ try:
+ import html5lib
+ print("Found html5lib version %s" % html5lib.__version__)
+ except ImportError, e:
+ print(
+ "html5lib is not installed or couldn't be imported.")
+
+ if hasattr(data, 'read'):
+ data = data.read()
+ elif data.startswith("http:") or data.startswith("https:"):
+ print('"%s" looks like a URL. Beautiful Soup is not an HTTP client.' % data)
+ print("You need to use some other library to get the document behind the URL, and feed that document to Beautiful Soup.")
+ return
+ else:
+ try:
+ if os.path.exists(data):
+ print('"%s" looks like a filename. Reading data from the file.' % data)
+ with open(data) as fp:
+ data = fp.read()
+ except ValueError:
+ # This can happen on some platforms when the 'filename' is
+ # too long. Assume it's data and not a filename.
+ pass
+ print("")
+
+ for parser in basic_parsers:
+ print("Trying to parse your markup with %s" % parser)
+ success = False
+ try:
+ soup = BeautifulSoup(data, features=parser)
+ success = True
+ except Exception, e:
+ print("%s could not parse the markup." % parser)
+ traceback.print_exc()
+ if success:
+ print("Here's what %s did with the markup:" % parser)
+ print(soup.prettify())
+
+ print("-" * 80)
+
+def lxml_trace(data, html=True, **kwargs):
+ """Print out the lxml events that occur during parsing.
+
+ This lets you see how lxml parses a document when no Beautiful
+ Soup code is running. You can use this to determine whether
+ an lxml-specific problem is in Beautiful Soup's lxml tree builders
+ or in lxml itself.
+
+ :param data: Some markup.
+ :param html: If True, markup will be parsed with lxml's HTML parser.
+ if False, lxml's XML parser will be used.
+ """
+ from lxml import etree
+ for event, element in etree.iterparse(StringIO(data), html=html, **kwargs):
+ print("%s, %4s, %s" % (event, element.tag, element.text))
+
+class AnnouncingParser(HTMLParser):
+ """Subclass of HTMLParser that announces parse events, without doing
+ anything else.
+
+ You can use this to get a picture of how html.parser sees a given
+ document. The easiest way to do this is to call `htmlparser_trace`.
+ """
+
+ def _p(self, s):
+ print(s)
+
+ def handle_starttag(self, name, attrs):
+ self._p("%s START" % name)
+
+ def handle_endtag(self, name):
+ self._p("%s END" % name)
+
+ def handle_data(self, data):
+ self._p("%s DATA" % data)
+
+ def handle_charref(self, name):
+ self._p("%s CHARREF" % name)
+
+ def handle_entityref(self, name):
+ self._p("%s ENTITYREF" % name)
+
+ def handle_comment(self, data):
+ self._p("%s COMMENT" % data)
+
+ def handle_decl(self, data):
+ self._p("%s DECL" % data)
+
+ def unknown_decl(self, data):
+ self._p("%s UNKNOWN-DECL" % data)
+
+ def handle_pi(self, data):
+ self._p("%s PI" % data)
+
+def htmlparser_trace(data):
+ """Print out the HTMLParser events that occur during parsing.
+
+ This lets you see how HTMLParser parses a document when no
+ Beautiful Soup code is running.
+
+ :param data: Some markup.
+ """
+ parser = AnnouncingParser()
+ parser.feed(data)
+
+_vowels = "aeiou"
+_consonants = "bcdfghjklmnpqrstvwxyz"
+
+def rword(length=5):
+ "Generate a random word-like string."
+ s = ''
+ for i in range(length):
+ if i % 2 == 0:
+ t = _consonants
+ else:
+ t = _vowels
+ s += random.choice(t)
+ return s
+
+def rsentence(length=4):
+ "Generate a random sentence-like string."
+ return " ".join(rword(random.randint(4,9)) for i in range(length))
+
+def rdoc(num_elements=1000):
+ """Randomly generate an invalid HTML document."""
+ tag_names = ['p', 'div', 'span', 'i', 'b', 'script', 'table']
+ elements = []
+ for i in range(num_elements):
+ choice = random.randint(0,3)
+ if choice == 0:
+ # New tag.
+ tag_name = random.choice(tag_names)
+ elements.append("<%s>" % tag_name)
+ elif choice == 1:
+ elements.append(rsentence(random.randint(1,4)))
+ elif choice == 2:
+ # Close a tag.
+ tag_name = random.choice(tag_names)
+ elements.append("</%s>" % tag_name)
+ return "<html>" + "\n".join(elements) + "</html>"
+
+def benchmark_parsers(num_elements=100000):
+ """Very basic head-to-head performance benchmark."""
+ print("Comparative parser benchmark on Beautiful Soup %s" % __version__)
+ data = rdoc(num_elements)
+ print("Generated a large invalid HTML document (%d bytes)." % len(data))
+
+ for parser in ["lxml", ["lxml", "html"], "html5lib", "html.parser"]:
+ success = False
+ try:
+ a = time.time()
+ soup = BeautifulSoup(data, parser)
+ b = time.time()
+ success = True
+ except Exception, e:
+ print("%s could not parse the markup." % parser)
+ traceback.print_exc()
+ if success:
+ print("BS4+%s parsed the markup in %.2fs." % (parser, b-a))
+
+ from lxml import etree
+ a = time.time()
+ etree.HTML(data)
+ b = time.time()
+ print("Raw lxml parsed the markup in %.2fs." % (b-a))
+
+ import html5lib
+ parser = html5lib.HTMLParser()
+ a = time.time()
+ parser.parse(data)
+ b = time.time()
+ print("Raw html5lib parsed the markup in %.2fs." % (b-a))
+
+def profile(num_elements=100000, parser="lxml"):
+ """Use Python's profiler on a randomly generated document."""
+ filehandle = tempfile.NamedTemporaryFile()
+ filename = filehandle.name
+
+ data = rdoc(num_elements)
+ vars = dict(bs4=bs4, data=data, parser=parser)
+ cProfile.runctx('bs4.BeautifulSoup(data, parser)' , vars, vars, filename)
+
+ stats = pstats.Stats(filename)
+ # stats.strip_dirs()
+ stats.sort_stats("cumulative")
+ stats.print_stats('_html5lib|bs4', 50)
+
+# If this file is run as a script, standard input is diagnosed.
+if __name__ == '__main__':
+ diagnose(sys.stdin.read())
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/element.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/element.py
new file mode 100644
index 00000000000..09a81d92bbc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/element.py
@@ -0,0 +1,2175 @@
+# Use of this source code is governed by the MIT license.
+__license__ = "MIT"
+
+try:
+ from collections.abc import Callable # Python 3.6
+except ImportError , e:
+ from collections import Callable
+import re
+import sys
+import warnings
+try:
+ import soupsieve
+except ImportError, e:
+ soupsieve = None
+ warnings.warn(
+ 'The soupsieve package is not installed. CSS selectors cannot be used.'
+ )
+
+from bs4.formatter import (
+ Formatter,
+ HTMLFormatter,
+ XMLFormatter,
+)
+
+DEFAULT_OUTPUT_ENCODING = "utf-8"
+PY3K = (sys.version_info[0] > 2)
+
+nonwhitespace_re = re.compile(r"\S+")
+
+# NOTE: This isn't used as of 4.7.0. I'm leaving it for a little bit on
+# the off chance someone imported it for their own use.
+whitespace_re = re.compile(r"\s+")
+
+def _alias(attr):
+ """Alias one attribute name to another for backward compatibility"""
+ @property
+ def alias(self):
+ return getattr(self, attr)
+
+ @alias.setter
+ def alias(self):
+ return setattr(self, attr)
+ return alias
+
+
+# These encodings are recognized by Python (so PageElement.encode
+# could theoretically support them) but XML and HTML don't recognize
+# them (so they should not show up in an XML or HTML document as that
+# document's encoding).
+#
+# If an XML document is encoded in one of these encodings, no encoding
+# will be mentioned in the XML declaration. If an HTML document is
+# encoded in one of these encodings, and the HTML document has a
+# <meta> tag that mentions an encoding, the encoding will be given as
+# the empty string.
+#
+# Source:
+# https://docs.python.org/3/library/codecs.html#python-specific-encodings
+PYTHON_SPECIFIC_ENCODINGS = set([
+ u"idna",
+ u"mbcs",
+ u"oem",
+ u"palmos",
+ u"punycode",
+ u"raw_unicode_escape",
+ u"undefined",
+ u"unicode_escape",
+ u"raw-unicode-escape",
+ u"unicode-escape",
+ u"string-escape",
+ u"string_escape",
+])
+
+
+class NamespacedAttribute(unicode):
+ """A namespaced string (e.g. 'xml:lang') that remembers the namespace
+ ('xml') and the name ('lang') that were used to create it.
+ """
+
+ def __new__(cls, prefix, name=None, namespace=None):
+ if not name:
+ # This is the default namespace. Its name "has no value"
+ # per https://www.w3.org/TR/xml-names/#defaulting
+ name = None
+
+ if name is None:
+ obj = unicode.__new__(cls, prefix)
+ elif prefix is None:
+ # Not really namespaced.
+ obj = unicode.__new__(cls, name)
+ else:
+ obj = unicode.__new__(cls, prefix + ":" + name)
+ obj.prefix = prefix
+ obj.name = name
+ obj.namespace = namespace
+ return obj
+
+class AttributeValueWithCharsetSubstitution(unicode):
+ """A stand-in object for a character encoding specified in HTML."""
+
+class CharsetMetaAttributeValue(AttributeValueWithCharsetSubstitution):
+ """A generic stand-in for the value of a meta tag's 'charset' attribute.
+
+ When Beautiful Soup parses the markup '<meta charset="utf8">', the
+ value of the 'charset' attribute will be one of these objects.
+ """
+
+ def __new__(cls, original_value):
+ obj = unicode.__new__(cls, original_value)
+ obj.original_value = original_value
+ return obj
+
+ def encode(self, encoding):
+ """When an HTML document is being encoded to a given encoding, the
+ value of a meta tag's 'charset' is the name of the encoding.
+ """
+ if encoding in PYTHON_SPECIFIC_ENCODINGS:
+ return ''
+ return encoding
+
+
+class ContentMetaAttributeValue(AttributeValueWithCharsetSubstitution):
+ """A generic stand-in for the value of a meta tag's 'content' attribute.
+
+ When Beautiful Soup parses the markup:
+ <meta http-equiv="content-type" content="text/html; charset=utf8">
+
+ The value of the 'content' attribute will be one of these objects.
+ """
+
+ CHARSET_RE = re.compile(r"((^|;)\s*charset=)([^;]*)", re.M)
+
+ def __new__(cls, original_value):
+ match = cls.CHARSET_RE.search(original_value)
+ if match is None:
+ # No substitution necessary.
+ return unicode.__new__(unicode, original_value)
+
+ obj = unicode.__new__(cls, original_value)
+ obj.original_value = original_value
+ return obj
+
+ def encode(self, encoding):
+ if encoding in PYTHON_SPECIFIC_ENCODINGS:
+ return ''
+ def rewrite(match):
+ return match.group(1) + encoding
+ return self.CHARSET_RE.sub(rewrite, self.original_value)
+
+
+class PageElement(object):
+ """Contains the navigational information for some part of the page:
+ that is, its current location in the parse tree.
+
+ NavigableString, Tag, etc. are all subclasses of PageElement.
+ """
+
+ def setup(self, parent=None, previous_element=None, next_element=None,
+ previous_sibling=None, next_sibling=None):
+ """Sets up the initial relations between this element and
+ other elements.
+
+ :param parent: The parent of this element.
+
+ :param previous_element: The element parsed immediately before
+ this one.
+
+ :param next_element: The element parsed immediately before
+ this one.
+
+ :param previous_sibling: The most recently encountered element
+ on the same level of the parse tree as this one.
+
+ :param previous_sibling: The next element to be encountered
+ on the same level of the parse tree as this one.
+ """
+ self.parent = parent
+
+ self.previous_element = previous_element
+ if previous_element is not None:
+ self.previous_element.next_element = self
+
+ self.next_element = next_element
+ if self.next_element is not None:
+ self.next_element.previous_element = self
+
+ self.next_sibling = next_sibling
+ if self.next_sibling is not None:
+ self.next_sibling.previous_sibling = self
+
+ if (previous_sibling is None
+ and self.parent is not None and self.parent.contents):
+ previous_sibling = self.parent.contents[-1]
+
+ self.previous_sibling = previous_sibling
+ if previous_sibling is not None:
+ self.previous_sibling.next_sibling = self
+
+ def format_string(self, s, formatter):
+ """Format the given string using the given formatter.
+
+ :param s: A string.
+ :param formatter: A Formatter object, or a string naming one of the standard formatters.
+ """
+ if formatter is None:
+ return s
+ if not isinstance(formatter, Formatter):
+ formatter = self.formatter_for_name(formatter)
+ output = formatter.substitute(s)
+ return output
+
+ def formatter_for_name(self, formatter):
+ """Look up or create a Formatter for the given identifier,
+ if necessary.
+
+ :param formatter: Can be a Formatter object (used as-is), a
+ function (used as the entity substitution hook for an
+ XMLFormatter or HTMLFormatter), or a string (used to look
+ up an XMLFormatter or HTMLFormatter in the appropriate
+ registry.
+ """
+ if isinstance(formatter, Formatter):
+ return formatter
+ if self._is_xml:
+ c = XMLFormatter
+ else:
+ c = HTMLFormatter
+ if isinstance(formatter, Callable):
+ return c(entity_substitution=formatter)
+ return c.REGISTRY[formatter]
+
+ @property
+ def _is_xml(self):
+ """Is this element part of an XML tree or an HTML tree?
+
+ This is used in formatter_for_name, when deciding whether an
+ XMLFormatter or HTMLFormatter is more appropriate. It can be
+ inefficient, but it should be called very rarely.
+ """
+ if self.known_xml is not None:
+ # Most of the time we will have determined this when the
+ # document is parsed.
+ return self.known_xml
+
+ # Otherwise, it's likely that this element was created by
+ # direct invocation of the constructor from within the user's
+ # Python code.
+ if self.parent is None:
+ # This is the top-level object. It should have .known_xml set
+ # from tree creation. If not, take a guess--BS is usually
+ # used on HTML markup.
+ return getattr(self, 'is_xml', False)
+ return self.parent._is_xml
+
+ nextSibling = _alias("next_sibling") # BS3
+ previousSibling = _alias("previous_sibling") # BS3
+
+ def replace_with(self, replace_with):
+ """Replace this PageElement with another one, keeping the rest of the
+ tree the same.
+
+ :param replace_with: A PageElement.
+ :return: `self`, no longer part of the tree.
+ """
+ if self.parent is None:
+ raise ValueError(
+ "Cannot replace one element with another when the "
+ "element to be replaced is not part of a tree.")
+ if replace_with is self:
+ return
+ if replace_with is self.parent:
+ raise ValueError("Cannot replace a Tag with its parent.")
+ old_parent = self.parent
+ my_index = self.parent.index(self)
+ self.extract(_self_index=my_index)
+ old_parent.insert(my_index, replace_with)
+ return self
+ replaceWith = replace_with # BS3
+
+ def unwrap(self):
+ """Replace this PageElement with its contents.
+
+ :return: `self`, no longer part of the tree.
+ """
+ my_parent = self.parent
+ if self.parent is None:
+ raise ValueError(
+ "Cannot replace an element with its contents when that"
+ "element is not part of a tree.")
+ my_index = self.parent.index(self)
+ self.extract(_self_index=my_index)
+ for child in reversed(self.contents[:]):
+ my_parent.insert(my_index, child)
+ return self
+ replace_with_children = unwrap
+ replaceWithChildren = unwrap # BS3
+
+ def wrap(self, wrap_inside):
+ """Wrap this PageElement inside another one.
+
+ :param wrap_inside: A PageElement.
+ :return: `wrap_inside`, occupying the position in the tree that used
+ to be occupied by `self`, and with `self` inside it.
+ """
+ me = self.replace_with(wrap_inside)
+ wrap_inside.append(me)
+ return wrap_inside
+
+ def extract(self, _self_index=None):
+ """Destructively rips this element out of the tree.
+
+ :param _self_index: The location of this element in its parent's
+ .contents, if known. Passing this in allows for a performance
+ optimization.
+
+ :return: `self`, no longer part of the tree.
+ """
+ if self.parent is not None:
+ if _self_index is None:
+ _self_index = self.parent.index(self)
+ del self.parent.contents[_self_index]
+
+ #Find the two elements that would be next to each other if
+ #this element (and any children) hadn't been parsed. Connect
+ #the two.
+ last_child = self._last_descendant()
+ next_element = last_child.next_element
+
+ if (self.previous_element is not None and
+ self.previous_element is not next_element):
+ self.previous_element.next_element = next_element
+ if next_element is not None and next_element is not self.previous_element:
+ next_element.previous_element = self.previous_element
+ self.previous_element = None
+ last_child.next_element = None
+
+ self.parent = None
+ if (self.previous_sibling is not None
+ and self.previous_sibling is not self.next_sibling):
+ self.previous_sibling.next_sibling = self.next_sibling
+ if (self.next_sibling is not None
+ and self.next_sibling is not self.previous_sibling):
+ self.next_sibling.previous_sibling = self.previous_sibling
+ self.previous_sibling = self.next_sibling = None
+ return self
+
+ def _last_descendant(self, is_initialized=True, accept_self=True):
+ """Finds the last element beneath this object to be parsed.
+
+ :param is_initialized: Has `setup` been called on this PageElement
+ yet?
+ :param accept_self: Is `self` an acceptable answer to the question?
+ """
+ if is_initialized and self.next_sibling is not None:
+ last_child = self.next_sibling.previous_element
+ else:
+ last_child = self
+ while isinstance(last_child, Tag) and last_child.contents:
+ last_child = last_child.contents[-1]
+ if not accept_self and last_child is self:
+ last_child = None
+ return last_child
+ # BS3: Not part of the API!
+ _lastRecursiveChild = _last_descendant
+
+ def insert(self, position, new_child):
+ """Insert a new PageElement in the list of this PageElement's children.
+
+ This works the same way as `list.insert`.
+
+ :param position: The numeric position that should be occupied
+ in `self.children` by the new PageElement.
+ :param new_child: A PageElement.
+ """
+ if new_child is None:
+ raise ValueError("Cannot insert None into a tag.")
+ if new_child is self:
+ raise ValueError("Cannot insert a tag into itself.")
+ if (isinstance(new_child, basestring)
+ and not isinstance(new_child, NavigableString)):
+ new_child = NavigableString(new_child)
+
+ from bs4 import BeautifulSoup
+ if isinstance(new_child, BeautifulSoup):
+ # We don't want to end up with a situation where one BeautifulSoup
+ # object contains another. Insert the children one at a time.
+ for subchild in list(new_child.contents):
+ self.insert(position, subchild)
+ position += 1
+ return
+ position = min(position, len(self.contents))
+ if hasattr(new_child, 'parent') and new_child.parent is not None:
+ # We're 'inserting' an element that's already one
+ # of this object's children.
+ if new_child.parent is self:
+ current_index = self.index(new_child)
+ if current_index < position:
+ # We're moving this element further down the list
+ # of this object's children. That means that when
+ # we extract this element, our target index will
+ # jump down one.
+ position -= 1
+ new_child.extract()
+
+ new_child.parent = self
+ previous_child = None
+ if position == 0:
+ new_child.previous_sibling = None
+ new_child.previous_element = self
+ else:
+ previous_child = self.contents[position - 1]
+ new_child.previous_sibling = previous_child
+ new_child.previous_sibling.next_sibling = new_child
+ new_child.previous_element = previous_child._last_descendant(False)
+ if new_child.previous_element is not None:
+ new_child.previous_element.next_element = new_child
+
+ new_childs_last_element = new_child._last_descendant(False)
+
+ if position >= len(self.contents):
+ new_child.next_sibling = None
+
+ parent = self
+ parents_next_sibling = None
+ while parents_next_sibling is None and parent is not None:
+ parents_next_sibling = parent.next_sibling
+ parent = parent.parent
+ if parents_next_sibling is not None:
+ # We found the element that comes next in the document.
+ break
+ if parents_next_sibling is not None:
+ new_childs_last_element.next_element = parents_next_sibling
+ else:
+ # The last element of this tag is the last element in
+ # the document.
+ new_childs_last_element.next_element = None
+ else:
+ next_child = self.contents[position]
+ new_child.next_sibling = next_child
+ if new_child.next_sibling is not None:
+ new_child.next_sibling.previous_sibling = new_child
+ new_childs_last_element.next_element = next_child
+
+ if new_childs_last_element.next_element is not None:
+ new_childs_last_element.next_element.previous_element = new_childs_last_element
+ self.contents.insert(position, new_child)
+
+ def append(self, tag):
+ """Appends the given PageElement to the contents of this one.
+
+ :param tag: A PageElement.
+ """
+ self.insert(len(self.contents), tag)
+
+ def extend(self, tags):
+ """Appends the given PageElements to this one's contents.
+
+ :param tags: A list of PageElements.
+ """
+ if isinstance(tags, Tag):
+ # Calling self.append() on another tag's contents will change
+ # the list we're iterating over. Make a list that won't
+ # change.
+ tags = list(tags.contents)
+ for tag in tags:
+ self.append(tag)
+
+ def insert_before(self, *args):
+ """Makes the given element(s) the immediate predecessor of this one.
+
+ All the elements will have the same parent, and the given elements
+ will be immediately before this one.
+
+ :param args: One or more PageElements.
+ """
+ parent = self.parent
+ if parent is None:
+ raise ValueError(
+ "Element has no parent, so 'before' has no meaning.")
+ if any(x is self for x in args):
+ raise ValueError("Can't insert an element before itself.")
+ for predecessor in args:
+ # Extract first so that the index won't be screwed up if they
+ # are siblings.
+ if isinstance(predecessor, PageElement):
+ predecessor.extract()
+ index = parent.index(self)
+ parent.insert(index, predecessor)
+
+ def insert_after(self, *args):
+ """Makes the given element(s) the immediate successor of this one.
+
+ The elements will have the same parent, and the given elements
+ will be immediately after this one.
+
+ :param args: One or more PageElements.
+ """
+ # Do all error checking before modifying the tree.
+ parent = self.parent
+ if parent is None:
+ raise ValueError(
+ "Element has no parent, so 'after' has no meaning.")
+ if any(x is self for x in args):
+ raise ValueError("Can't insert an element after itself.")
+
+ offset = 0
+ for successor in args:
+ # Extract first so that the index won't be screwed up if they
+ # are siblings.
+ if isinstance(successor, PageElement):
+ successor.extract()
+ index = parent.index(self)
+ parent.insert(index+1+offset, successor)
+ offset += 1
+
+ def find_next(self, name=None, attrs={}, text=None, **kwargs):
+ """Find the first PageElement that matches the given criteria and
+ appears later in the document than this PageElement.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param text: A filter for a NavigableString with specific text.
+ :kwargs: A dictionary of filters on attribute values.
+ :return: A PageElement.
+ :rtype: bs4.element.Tag | bs4.element.NavigableString
+ """
+ return self._find_one(self.find_all_next, name, attrs, text, **kwargs)
+ findNext = find_next # BS3
+
+ def find_all_next(self, name=None, attrs={}, text=None, limit=None,
+ **kwargs):
+ """Find all PageElements that match the given criteria and appear
+ later in the document than this PageElement.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param text: A filter for a NavigableString with specific text.
+ :param limit: Stop looking after finding this many results.
+ :kwargs: A dictionary of filters on attribute values.
+ :return: A ResultSet containing PageElements.
+ """
+ return self._find_all(name, attrs, text, limit, self.next_elements,
+ **kwargs)
+ findAllNext = find_all_next # BS3
+
+ def find_next_sibling(self, name=None, attrs={}, text=None, **kwargs):
+ """Find the closest sibling to this PageElement that matches the
+ given criteria and appears later in the document.
+
+ All find_* methods take a common set of arguments. See the
+ online documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param text: A filter for a NavigableString with specific text.
+ :kwargs: A dictionary of filters on attribute values.
+ :return: A PageElement.
+ :rtype: bs4.element.Tag | bs4.element.NavigableString
+ """
+ return self._find_one(self.find_next_siblings, name, attrs, text,
+ **kwargs)
+ findNextSibling = find_next_sibling # BS3
+
+ def find_next_siblings(self, name=None, attrs={}, text=None, limit=None,
+ **kwargs):
+ """Find all siblings of this PageElement that match the given criteria
+ and appear later in the document.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param text: A filter for a NavigableString with specific text.
+ :param limit: Stop looking after finding this many results.
+ :kwargs: A dictionary of filters on attribute values.
+ :return: A ResultSet of PageElements.
+ :rtype: bs4.element.ResultSet
+ """
+ return self._find_all(name, attrs, text, limit,
+ self.next_siblings, **kwargs)
+ findNextSiblings = find_next_siblings # BS3
+ fetchNextSiblings = find_next_siblings # BS2
+
+ def find_previous(self, name=None, attrs={}, text=None, **kwargs):
+ """Look backwards in the document from this PageElement and find the
+ first PageElement that matches the given criteria.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param text: A filter for a NavigableString with specific text.
+ :kwargs: A dictionary of filters on attribute values.
+ :return: A PageElement.
+ :rtype: bs4.element.Tag | bs4.element.NavigableString
+ """
+ return self._find_one(
+ self.find_all_previous, name, attrs, text, **kwargs)
+ findPrevious = find_previous # BS3
+
+ def find_all_previous(self, name=None, attrs={}, text=None, limit=None,
+ **kwargs):
+ """Look backwards in the document from this PageElement and find all
+ PageElements that match the given criteria.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param text: A filter for a NavigableString with specific text.
+ :param limit: Stop looking after finding this many results.
+ :kwargs: A dictionary of filters on attribute values.
+ :return: A ResultSet of PageElements.
+ :rtype: bs4.element.ResultSet
+ """
+ return self._find_all(name, attrs, text, limit, self.previous_elements,
+ **kwargs)
+ findAllPrevious = find_all_previous # BS3
+ fetchPrevious = find_all_previous # BS2
+
+ def find_previous_sibling(self, name=None, attrs={}, text=None, **kwargs):
+ """Returns the closest sibling to this PageElement that matches the
+ given criteria and appears earlier in the document.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param text: A filter for a NavigableString with specific text.
+ :kwargs: A dictionary of filters on attribute values.
+ :return: A PageElement.
+ :rtype: bs4.element.Tag | bs4.element.NavigableString
+ """
+ return self._find_one(self.find_previous_siblings, name, attrs, text,
+ **kwargs)
+ findPreviousSibling = find_previous_sibling # BS3
+
+ def find_previous_siblings(self, name=None, attrs={}, text=None,
+ limit=None, **kwargs):
+ """Returns all siblings to this PageElement that match the
+ given criteria and appear earlier in the document.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param text: A filter for a NavigableString with specific text.
+ :param limit: Stop looking after finding this many results.
+ :kwargs: A dictionary of filters on attribute values.
+ :return: A ResultSet of PageElements.
+ :rtype: bs4.element.ResultSet
+ """
+ return self._find_all(name, attrs, text, limit,
+ self.previous_siblings, **kwargs)
+ findPreviousSiblings = find_previous_siblings # BS3
+ fetchPreviousSiblings = find_previous_siblings # BS2
+
+ def find_parent(self, name=None, attrs={}, **kwargs):
+ """Find the closest parent of this PageElement that matches the given
+ criteria.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :kwargs: A dictionary of filters on attribute values.
+
+ :return: A PageElement.
+ :rtype: bs4.element.Tag | bs4.element.NavigableString
+ """
+ # NOTE: We can't use _find_one because findParents takes a different
+ # set of arguments.
+ r = None
+ l = self.find_parents(name, attrs, 1, **kwargs)
+ if l:
+ r = l[0]
+ return r
+ findParent = find_parent # BS3
+
+ def find_parents(self, name=None, attrs={}, limit=None, **kwargs):
+ """Find all parents of this PageElement that match the given criteria.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param limit: Stop looking after finding this many results.
+ :kwargs: A dictionary of filters on attribute values.
+
+ :return: A PageElement.
+ :rtype: bs4.element.Tag | bs4.element.NavigableString
+ """
+ return self._find_all(name, attrs, None, limit, self.parents,
+ **kwargs)
+ findParents = find_parents # BS3
+ fetchParents = find_parents # BS2
+
+ @property
+ def next(self):
+ """The PageElement, if any, that was parsed just after this one.
+
+ :return: A PageElement.
+ :rtype: bs4.element.Tag | bs4.element.NavigableString
+ """
+ return self.next_element
+
+ @property
+ def previous(self):
+ """The PageElement, if any, that was parsed just before this one.
+
+ :return: A PageElement.
+ :rtype: bs4.element.Tag | bs4.element.NavigableString
+ """
+ return self.previous_element
+
+ #These methods do the real heavy lifting.
+
+ def _find_one(self, method, name, attrs, text, **kwargs):
+ r = None
+ l = method(name, attrs, text, 1, **kwargs)
+ if l:
+ r = l[0]
+ return r
+
+ def _find_all(self, name, attrs, text, limit, generator, **kwargs):
+ "Iterates over a generator looking for things that match."
+
+ if text is None and 'string' in kwargs:
+ text = kwargs['string']
+ del kwargs['string']
+
+ if isinstance(name, SoupStrainer):
+ strainer = name
+ else:
+ strainer = SoupStrainer(name, attrs, text, **kwargs)
+
+ if text is None and not limit and not attrs and not kwargs:
+ if name is True or name is None:
+ # Optimization to find all tags.
+ result = (element for element in generator
+ if isinstance(element, Tag))
+ return ResultSet(strainer, result)
+ elif isinstance(name, basestring):
+ # Optimization to find all tags with a given name.
+ if name.count(':') == 1:
+ # This is a name with a prefix. If this is a namespace-aware document,
+ # we need to match the local name against tag.name. If not,
+ # we need to match the fully-qualified name against tag.name.
+ prefix, local_name = name.split(':', 1)
+ else:
+ prefix = None
+ local_name = name
+ result = (element for element in generator
+ if isinstance(element, Tag)
+ and (
+ element.name == name
+ ) or (
+ element.name == local_name
+ and (prefix is None or element.prefix == prefix)
+ )
+ )
+ return ResultSet(strainer, result)
+ results = ResultSet(strainer)
+ while True:
+ try:
+ i = next(generator)
+ except StopIteration:
+ break
+ if i:
+ found = strainer.search(i)
+ if found:
+ results.append(found)
+ if limit and len(results) >= limit:
+ break
+ return results
+
+ #These generators can be used to navigate starting from both
+ #NavigableStrings and Tags.
+ @property
+ def next_elements(self):
+ """All PageElements that were parsed after this one.
+
+ :yield: A sequence of PageElements.
+ """
+ i = self.next_element
+ while i is not None:
+ yield i
+ i = i.next_element
+
+ @property
+ def next_siblings(self):
+ """All PageElements that are siblings of this one but were parsed
+ later.
+
+ :yield: A sequence of PageElements.
+ """
+ i = self.next_sibling
+ while i is not None:
+ yield i
+ i = i.next_sibling
+
+ @property
+ def previous_elements(self):
+ """All PageElements that were parsed before this one.
+
+ :yield: A sequence of PageElements.
+ """
+ i = self.previous_element
+ while i is not None:
+ yield i
+ i = i.previous_element
+
+ @property
+ def previous_siblings(self):
+ """All PageElements that are siblings of this one but were parsed
+ earlier.
+
+ :yield: A sequence of PageElements.
+ """
+ i = self.previous_sibling
+ while i is not None:
+ yield i
+ i = i.previous_sibling
+
+ @property
+ def parents(self):
+ """All PageElements that are parents of this PageElement.
+
+ :yield: A sequence of PageElements.
+ """
+ i = self.parent
+ while i is not None:
+ yield i
+ i = i.parent
+
+ @property
+ def decomposed(self):
+ """Check whether a PageElement has been decomposed.
+
+ :rtype: bool
+ """
+ return getattr(self, '_decomposed', False) or False
+
+ # Old non-property versions of the generators, for backwards
+ # compatibility with BS3.
+ def nextGenerator(self):
+ return self.next_elements
+
+ def nextSiblingGenerator(self):
+ return self.next_siblings
+
+ def previousGenerator(self):
+ return self.previous_elements
+
+ def previousSiblingGenerator(self):
+ return self.previous_siblings
+
+ def parentGenerator(self):
+ return self.parents
+
+
+class NavigableString(unicode, PageElement):
+ """A Python Unicode string that is part of a parse tree.
+
+ When Beautiful Soup parses the markup <b>penguin</b>, it will
+ create a NavigableString for the string "penguin".
+ """
+
+ PREFIX = ''
+ SUFFIX = ''
+
+ # We can't tell just by looking at a string whether it's contained
+ # in an XML document or an HTML document.
+
+ known_xml = None
+
+ def __new__(cls, value):
+ """Create a new NavigableString.
+
+ When unpickling a NavigableString, this method is called with
+ the string in DEFAULT_OUTPUT_ENCODING. That encoding needs to be
+ passed in to the superclass's __new__ or the superclass won't know
+ how to handle non-ASCII characters.
+ """
+ if isinstance(value, unicode):
+ u = unicode.__new__(cls, value)
+ else:
+ u = unicode.__new__(cls, value, DEFAULT_OUTPUT_ENCODING)
+ u.setup()
+ return u
+
+ def __copy__(self):
+ """A copy of a NavigableString has the same contents and class
+ as the original, but it is not connected to the parse tree.
+ """
+ return type(self)(self)
+
+ def __getnewargs__(self):
+ return (unicode(self),)
+
+ def __getattr__(self, attr):
+ """text.string gives you text. This is for backwards
+ compatibility for Navigable*String, but for CData* it lets you
+ get the string without the CData wrapper."""
+ if attr == 'string':
+ return self
+ else:
+ raise AttributeError(
+ "'%s' object has no attribute '%s'" % (
+ self.__class__.__name__, attr))
+
+ def output_ready(self, formatter="minimal"):
+ """Run the string through the provided formatter.
+
+ :param formatter: A Formatter object, or a string naming one of the standard formatters.
+ """
+ output = self.format_string(self, formatter)
+ return self.PREFIX + output + self.SUFFIX
+
+ @property
+ def name(self):
+ """Since a NavigableString is not a Tag, it has no .name.
+
+ This property is implemented so that code like this doesn't crash
+ when run on a mixture of Tag and NavigableString objects:
+ [x.name for x in tag.children]
+ """
+ return None
+
+ @name.setter
+ def name(self, name):
+ """Prevent NavigableString.name from ever being set."""
+ raise AttributeError("A NavigableString cannot be given a name.")
+
+
+class PreformattedString(NavigableString):
+ """A NavigableString not subject to the normal formatting rules.
+
+ This is an abstract class used for special kinds of strings such
+ as comments (the Comment class) and CDATA blocks (the CData
+ class).
+ """
+
+ PREFIX = ''
+ SUFFIX = ''
+
+ def output_ready(self, formatter=None):
+ """Make this string ready for output by adding any subclass-specific
+ prefix or suffix.
+
+ :param formatter: A Formatter object, or a string naming one
+ of the standard formatters. The string will be passed into the
+ Formatter, but only to trigger any side effects: the return
+ value is ignored.
+
+ :return: The string, with any subclass-specific prefix and
+ suffix added on.
+ """
+ if formatter is not None:
+ ignore = self.format_string(self, formatter)
+ return self.PREFIX + self + self.SUFFIX
+
+class CData(PreformattedString):
+ """A CDATA block."""
+ PREFIX = u'<![CDATA['
+ SUFFIX = u']]>'
+
+class ProcessingInstruction(PreformattedString):
+ """A SGML processing instruction."""
+
+ PREFIX = u'<?'
+ SUFFIX = u'>'
+
+class XMLProcessingInstruction(ProcessingInstruction):
+ """An XML processing instruction."""
+ PREFIX = u'<?'
+ SUFFIX = u'?>'
+
+class Comment(PreformattedString):
+ """An HTML or XML comment."""
+ PREFIX = u'<!--'
+ SUFFIX = u'-->'
+
+
+class Declaration(PreformattedString):
+ """An XML declaration."""
+ PREFIX = u'<?'
+ SUFFIX = u'?>'
+
+
+class Doctype(PreformattedString):
+ """A document type declaration."""
+ @classmethod
+ def for_name_and_ids(cls, name, pub_id, system_id):
+ """Generate an appropriate document type declaration for a given
+ public ID and system ID.
+
+ :param name: The name of the document's root element, e.g. 'html'.
+ :param pub_id: The Formal Public Identifier for this document type,
+ e.g. '-//W3C//DTD XHTML 1.1//EN'
+ :param system_id: The system identifier for this document type,
+ e.g. 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'
+
+ :return: A Doctype.
+ """
+ value = name or ''
+ if pub_id is not None:
+ value += ' PUBLIC "%s"' % pub_id
+ if system_id is not None:
+ value += ' "%s"' % system_id
+ elif system_id is not None:
+ value += ' SYSTEM "%s"' % system_id
+
+ return Doctype(value)
+
+ PREFIX = u'<!DOCTYPE '
+ SUFFIX = u'>\n'
+
+
+class Stylesheet(NavigableString):
+ """A NavigableString representing an stylesheet (probably
+ CSS).
+
+ Used to distinguish embedded stylesheets from textual content.
+ """
+ pass
+
+
+class Script(NavigableString):
+ """A NavigableString representing an executable script (probably
+ Javascript).
+
+ Used to distinguish executable code from textual content.
+ """
+ pass
+
+
+class TemplateString(NavigableString):
+ """A NavigableString representing a string found inside an HTML
+ template embedded in a larger document.
+
+ Used to distinguish such strings from the main body of the document.
+ """
+ pass
+
+
+class Tag(PageElement):
+ """Represents an HTML or XML tag that is part of a parse tree, along
+ with its attributes and contents.
+
+ When Beautiful Soup parses the markup <b>penguin</b>, it will
+ create a Tag object representing the <b> tag.
+ """
+
+ def __init__(self, parser=None, builder=None, name=None, namespace=None,
+ prefix=None, attrs=None, parent=None, previous=None,
+ is_xml=None, sourceline=None, sourcepos=None,
+ can_be_empty_element=None, cdata_list_attributes=None,
+ preserve_whitespace_tags=None
+ ):
+ """Basic constructor.
+
+ :param parser: A BeautifulSoup object.
+ :param builder: A TreeBuilder.
+ :param name: The name of the tag.
+ :param namespace: The URI of this Tag's XML namespace, if any.
+ :param prefix: The prefix for this Tag's XML namespace, if any.
+ :param attrs: A dictionary of this Tag's attribute values.
+ :param parent: The PageElement to use as this Tag's parent.
+ :param previous: The PageElement that was parsed immediately before
+ this tag.
+ :param is_xml: If True, this is an XML tag. Otherwise, this is an
+ HTML tag.
+ :param sourceline: The line number where this tag was found in its
+ source document.
+ :param sourcepos: The character position within `sourceline` where this
+ tag was found.
+ :param can_be_empty_element: If True, this tag should be
+ represented as <tag/>. If False, this tag should be represented
+ as <tag></tag>.
+ :param cdata_list_attributes: A list of attributes whose values should
+ be treated as CDATA if they ever show up on this tag.
+ :param preserve_whitespace_tags: A list of tag names whose contents
+ should have their whitespace preserved.
+ """
+ if parser is None:
+ self.parser_class = None
+ else:
+ # We don't actually store the parser object: that lets extracted
+ # chunks be garbage-collected.
+ self.parser_class = parser.__class__
+ if name is None:
+ raise ValueError("No value provided for new tag's name.")
+ self.name = name
+ self.namespace = namespace
+ self.prefix = prefix
+ if ((not builder or builder.store_line_numbers)
+ and (sourceline is not None or sourcepos is not None)):
+ self.sourceline = sourceline
+ self.sourcepos = sourcepos
+ if attrs is None:
+ attrs = {}
+ elif attrs:
+ if builder is not None and builder.cdata_list_attributes:
+ attrs = builder._replace_cdata_list_attribute_values(
+ self.name, attrs)
+ else:
+ attrs = dict(attrs)
+ else:
+ attrs = dict(attrs)
+
+ # If possible, determine ahead of time whether this tag is an
+ # XML tag.
+ if builder:
+ self.known_xml = builder.is_xml
+ else:
+ self.known_xml = is_xml
+ self.attrs = attrs
+ self.contents = []
+ self.setup(parent, previous)
+ self.hidden = False
+
+ if builder is None:
+ # In the absence of a TreeBuilder, use whatever values were
+ # passed in here. They're probably None, unless this is a copy of some
+ # other tag.
+ self.can_be_empty_element = can_be_empty_element
+ self.cdata_list_attributes = cdata_list_attributes
+ self.preserve_whitespace_tags = preserve_whitespace_tags
+ else:
+ # Set up any substitutions for this tag, such as the charset in a META tag.
+ builder.set_up_substitutions(self)
+
+ # Ask the TreeBuilder whether this tag might be an empty-element tag.
+ self.can_be_empty_element = builder.can_be_empty_element(name)
+
+ # Keep track of the list of attributes of this tag that
+ # might need to be treated as a list.
+ #
+ # For performance reasons, we store the whole data structure
+ # rather than asking the question of every tag. Asking would
+ # require building a new data structure every time, and
+ # (unlike can_be_empty_element), we almost never need
+ # to check this.
+ self.cdata_list_attributes = builder.cdata_list_attributes
+
+ # Keep track of the names that might cause this tag to be treated as a
+ # whitespace-preserved tag.
+ self.preserve_whitespace_tags = builder.preserve_whitespace_tags
+
+ parserClass = _alias("parser_class") # BS3
+
+ def __copy__(self):
+ """A copy of a Tag is a new Tag, unconnected to the parse tree.
+ Its contents are a copy of the old Tag's contents.
+ """
+ clone = type(self)(
+ None, self.builder, self.name, self.namespace,
+ self.prefix, self.attrs, is_xml=self._is_xml,
+ sourceline=self.sourceline, sourcepos=self.sourcepos,
+ can_be_empty_element=self.can_be_empty_element,
+ cdata_list_attributes=self.cdata_list_attributes,
+ preserve_whitespace_tags=self.preserve_whitespace_tags
+ )
+ for attr in ('can_be_empty_element', 'hidden'):
+ setattr(clone, attr, getattr(self, attr))
+ for child in self.contents:
+ clone.append(child.__copy__())
+ return clone
+
+ @property
+ def is_empty_element(self):
+ """Is this tag an empty-element tag? (aka a self-closing tag)
+
+ A tag that has contents is never an empty-element tag.
+
+ A tag that has no contents may or may not be an empty-element
+ tag. It depends on the builder used to create the tag. If the
+ builder has a designated list of empty-element tags, then only
+ a tag whose name shows up in that list is considered an
+ empty-element tag.
+
+ If the builder has no designated list of empty-element tags,
+ then any tag with no contents is an empty-element tag.
+ """
+ return len(self.contents) == 0 and self.can_be_empty_element
+ isSelfClosing = is_empty_element # BS3
+
+ @property
+ def string(self):
+ """Convenience property to get the single string within this
+ PageElement.
+
+ TODO It might make sense to have NavigableString.string return
+ itself.
+
+ :return: If this element has a single string child, return
+ value is that string. If this element has one child tag,
+ return value is the 'string' attribute of the child tag,
+ recursively. If this element is itself a string, has no
+ children, or has more than one child, return value is None.
+ """
+ if len(self.contents) != 1:
+ return None
+ child = self.contents[0]
+ if isinstance(child, NavigableString):
+ return child
+ return child.string
+
+ @string.setter
+ def string(self, string):
+ """Replace this PageElement's contents with `string`."""
+ self.clear()
+ self.append(string.__class__(string))
+
+ def _all_strings(self, strip=False, types=(NavigableString, CData)):
+ """Yield all strings of certain classes, possibly stripping them.
+
+ :param strip: If True, all strings will be stripped before being
+ yielded.
+
+ :types: A tuple of NavigableString subclasses. Any strings of
+ a subclass not found in this list will be ignored. By
+ default, this means only NavigableString and CData objects
+ will be considered. So no comments, processing instructions,
+ etc.
+
+ :yield: A sequence of strings.
+ """
+ for descendant in self.descendants:
+ if (
+ (types is None and not isinstance(descendant, NavigableString))
+ or
+ (types is not None and type(descendant) not in types)):
+ continue
+ if strip:
+ descendant = descendant.strip()
+ if len(descendant) == 0:
+ continue
+ yield descendant
+
+ strings = property(_all_strings)
+
+ @property
+ def stripped_strings(self):
+ """Yield all strings in the document, stripping them first.
+
+ :yield: A sequence of stripped strings.
+ """
+ for string in self._all_strings(True):
+ yield string
+
+ def get_text(self, separator=u"", strip=False,
+ types=(NavigableString, CData)):
+ """Get all child strings, concatenated using the given separator.
+
+ :param separator: Strings will be concatenated using this separator.
+
+ :param strip: If True, strings will be stripped before being
+ concatenated.
+
+ :types: A tuple of NavigableString subclasses. Any strings of
+ a subclass not found in this list will be ignored. By
+ default, this means only NavigableString and CData objects
+ will be considered. So no comments, processing instructions,
+ stylesheets, etc.
+
+ :return: A string.
+ """
+ return separator.join([s for s in self._all_strings(
+ strip, types=types)])
+ getText = get_text
+ text = property(get_text)
+
+ def decompose(self):
+ """Recursively destroys this PageElement and its children.
+
+ This element will be removed from the tree and wiped out; so
+ will everything beneath it.
+
+ The behavior of a decomposed PageElement is undefined and you
+ should never use one for anything, but if you need to _check_
+ whether an element has been decomposed, you can use the
+ `decomposed` property.
+ """
+ self.extract()
+ i = self
+ while i is not None:
+ n = i.next_element
+ i.__dict__.clear()
+ i.contents = []
+ i._decomposed = True
+ i = n
+
+ def clear(self, decompose=False):
+ """Wipe out all children of this PageElement by calling extract()
+ on them.
+
+ :param decompose: If this is True, decompose() (a more
+ destructive method) will be called instead of extract().
+ """
+ if decompose:
+ for element in self.contents[:]:
+ if isinstance(element, Tag):
+ element.decompose()
+ else:
+ element.extract()
+ else:
+ for element in self.contents[:]:
+ element.extract()
+
+ def smooth(self):
+ """Smooth out this element's children by consolidating consecutive
+ strings.
+
+ This makes pretty-printed output look more natural following a
+ lot of operations that modified the tree.
+ """
+ # Mark the first position of every pair of children that need
+ # to be consolidated. Do this rather than making a copy of
+ # self.contents, since in most cases very few strings will be
+ # affected.
+ marked = []
+ for i, a in enumerate(self.contents):
+ if isinstance(a, Tag):
+ # Recursively smooth children.
+ a.smooth()
+ if i == len(self.contents)-1:
+ # This is the last item in .contents, and it's not a
+ # tag. There's no chance it needs any work.
+ continue
+ b = self.contents[i+1]
+ if (isinstance(a, NavigableString)
+ and isinstance(b, NavigableString)
+ and not isinstance(a, PreformattedString)
+ and not isinstance(b, PreformattedString)
+ ):
+ marked.append(i)
+
+ # Go over the marked positions in reverse order, so that
+ # removing items from .contents won't affect the remaining
+ # positions.
+ for i in reversed(marked):
+ a = self.contents[i]
+ b = self.contents[i+1]
+ b.extract()
+ n = NavigableString(a+b)
+ a.replace_with(n)
+
+ def index(self, element):
+ """Find the index of a child by identity, not value.
+
+ Avoids issues with tag.contents.index(element) getting the
+ index of equal elements.
+
+ :param element: Look for this PageElement in `self.contents`.
+ """
+ for i, child in enumerate(self.contents):
+ if child is element:
+ return i
+ raise ValueError("Tag.index: element not in tag")
+
+ def get(self, key, default=None):
+ """Returns the value of the 'key' attribute for the tag, or
+ the value given for 'default' if it doesn't have that
+ attribute."""
+ return self.attrs.get(key, default)
+
+ def get_attribute_list(self, key, default=None):
+ """The same as get(), but always returns a list.
+
+ :param key: The attribute to look for.
+ :param default: Use this value if the attribute is not present
+ on this PageElement.
+ :return: A list of values, probably containing only a single
+ value.
+ """
+ value = self.get(key, default)
+ if not isinstance(value, list):
+ value = [value]
+ return value
+
+ def has_attr(self, key):
+ """Does this PageElement have an attribute with the given name?"""
+ return key in self.attrs
+
+ def __hash__(self):
+ return str(self).__hash__()
+
+ def __getitem__(self, key):
+ """tag[key] returns the value of the 'key' attribute for the Tag,
+ and throws an exception if it's not there."""
+ return self.attrs[key]
+
+ def __iter__(self):
+ "Iterating over a Tag iterates over its contents."
+ return iter(self.contents)
+
+ def __len__(self):
+ "The length of a Tag is the length of its list of contents."
+ return len(self.contents)
+
+ def __contains__(self, x):
+ return x in self.contents
+
+ def __nonzero__(self):
+ "A tag is non-None even if it has no contents."
+ return True
+
+ def __setitem__(self, key, value):
+ """Setting tag[key] sets the value of the 'key' attribute for the
+ tag."""
+ self.attrs[key] = value
+
+ def __delitem__(self, key):
+ "Deleting tag[key] deletes all 'key' attributes for the tag."
+ self.attrs.pop(key, None)
+
+ def __call__(self, *args, **kwargs):
+ """Calling a Tag like a function is the same as calling its
+ find_all() method. Eg. tag('a') returns a list of all the A tags
+ found within this tag."""
+ return self.find_all(*args, **kwargs)
+
+ def __getattr__(self, tag):
+ """Calling tag.subtag is the same as calling tag.find(name="subtag")"""
+ #print("Getattr %s.%s" % (self.__class__, tag))
+ if len(tag) > 3 and tag.endswith('Tag'):
+ # BS3: soup.aTag -> "soup.find("a")
+ tag_name = tag[:-3]
+ warnings.warn(
+ '.%(name)sTag is deprecated, use .find("%(name)s") instead. If you really were looking for a tag called %(name)sTag, use .find("%(name)sTag")' % dict(
+ name=tag_name
+ )
+ )
+ return self.find(tag_name)
+ # We special case contents to avoid recursion.
+ elif not tag.startswith("__") and not tag == "contents":
+ return self.find(tag)
+ raise AttributeError(
+ "'%s' object has no attribute '%s'" % (self.__class__, tag))
+
+ def __eq__(self, other):
+ """Returns true iff this Tag has the same name, the same attributes,
+ and the same contents (recursively) as `other`."""
+ if self is other:
+ return True
+ if (not hasattr(other, 'name') or
+ not hasattr(other, 'attrs') or
+ not hasattr(other, 'contents') or
+ self.name != other.name or
+ self.attrs != other.attrs or
+ len(self) != len(other)):
+ return False
+ for i, my_child in enumerate(self.contents):
+ if my_child != other.contents[i]:
+ return False
+ return True
+
+ def __ne__(self, other):
+ """Returns true iff this Tag is not identical to `other`,
+ as defined in __eq__."""
+ return not self == other
+
+ def __repr__(self, encoding="unicode-escape"):
+ """Renders this PageElement as a string.
+
+ :param encoding: The encoding to use (Python 2 only).
+ :return: Under Python 2, a bytestring; under Python 3,
+ a Unicode string.
+ """
+ if PY3K:
+ # "The return value must be a string object", i.e. Unicode
+ return self.decode()
+ else:
+ # "The return value must be a string object", i.e. a bytestring.
+ # By convention, the return value of __repr__ should also be
+ # an ASCII string.
+ return self.encode(encoding)
+
+ def __unicode__(self):
+ """Renders this PageElement as a Unicode string."""
+ return self.decode()
+
+ def __str__(self):
+ """Renders this PageElement as a generic string.
+
+ :return: Under Python 2, a UTF-8 bytestring; under Python 3,
+ a Unicode string.
+ """
+ if PY3K:
+ return self.decode()
+ else:
+ return self.encode()
+
+ if PY3K:
+ __str__ = __repr__ = __unicode__
+
+ def encode(self, encoding=DEFAULT_OUTPUT_ENCODING,
+ indent_level=None, formatter="minimal",
+ errors="xmlcharrefreplace"):
+ """Render a bytestring representation of this PageElement and its
+ contents.
+
+ :param encoding: The destination encoding.
+ :param indent_level: Each line of the rendering will be
+ indented this many spaces. Used internally in
+ recursive calls while pretty-printing.
+ :param formatter: A Formatter object, or a string naming one of
+ the standard formatters.
+ :param errors: An error handling strategy such as
+ 'xmlcharrefreplace'. This value is passed along into
+ encode() and its value should be one of the constants
+ defined by Python.
+ :return: A bytestring.
+
+ """
+ # Turn the data structure into Unicode, then encode the
+ # Unicode.
+ u = self.decode(indent_level, encoding, formatter)
+ return u.encode(encoding, errors)
+
+ def decode(self, indent_level=None,
+ eventual_encoding=DEFAULT_OUTPUT_ENCODING,
+ formatter="minimal"):
+ """Render a Unicode representation of this PageElement and its
+ contents.
+
+ :param indent_level: Each line of the rendering will be
+ indented this many spaces. Used internally in
+ recursive calls while pretty-printing.
+ :param eventual_encoding: The tag is destined to be
+ encoded into this encoding. This method is _not_
+ responsible for performing that encoding. This information
+ is passed in so that it can be substituted in if the
+ document contains a <META> tag that mentions the document's
+ encoding.
+ :param formatter: A Formatter object, or a string naming one of
+ the standard formatters.
+ """
+
+ # First off, turn a non-Formatter `formatter` into a Formatter
+ # object. This will stop the lookup from happening over and
+ # over again.
+ if not isinstance(formatter, Formatter):
+ formatter = self.formatter_for_name(formatter)
+ attributes = formatter.attributes(self)
+ attrs = []
+ for key, val in attributes:
+ if val is None:
+ decoded = key
+ else:
+ if isinstance(val, list) or isinstance(val, tuple):
+ val = ' '.join(val)
+ elif not isinstance(val, basestring):
+ val = unicode(val)
+ elif (
+ isinstance(val, AttributeValueWithCharsetSubstitution)
+ and eventual_encoding is not None
+ ):
+ val = val.encode(eventual_encoding)
+
+ text = formatter.attribute_value(val)
+ decoded = (
+ unicode(key) + '='
+ + formatter.quoted_attribute_value(text))
+ attrs.append(decoded)
+ close = ''
+ closeTag = ''
+
+ prefix = ''
+ if self.prefix:
+ prefix = self.prefix + ":"
+
+ if self.is_empty_element:
+ close = formatter.void_element_close_prefix or ''
+ else:
+ closeTag = '</%s%s>' % (prefix, self.name)
+
+ pretty_print = self._should_pretty_print(indent_level)
+ space = ''
+ indent_space = ''
+ if indent_level is not None:
+ indent_space = (' ' * (indent_level - 1))
+ if pretty_print:
+ space = indent_space
+ indent_contents = indent_level + 1
+ else:
+ indent_contents = None
+ contents = self.decode_contents(
+ indent_contents, eventual_encoding, formatter
+ )
+
+ if self.hidden:
+ # This is the 'document root' object.
+ s = contents
+ else:
+ s = []
+ attribute_string = ''
+ if attrs:
+ attribute_string = ' ' + ' '.join(attrs)
+ if indent_level is not None:
+ # Even if this particular tag is not pretty-printed,
+ # we should indent up to the start of the tag.
+ s.append(indent_space)
+ s.append('<%s%s%s%s>' % (
+ prefix, self.name, attribute_string, close))
+ if pretty_print:
+ s.append("\n")
+ s.append(contents)
+ if pretty_print and contents and contents[-1] != "\n":
+ s.append("\n")
+ if pretty_print and closeTag:
+ s.append(space)
+ s.append(closeTag)
+ if indent_level is not None and closeTag and self.next_sibling:
+ # Even if this particular tag is not pretty-printed,
+ # we're now done with the tag, and we should add a
+ # newline if appropriate.
+ s.append("\n")
+ s = ''.join(s)
+ return s
+
+ def _should_pretty_print(self, indent_level):
+ """Should this tag be pretty-printed?
+
+ Most of them should, but some (such as <pre> in HTML
+ documents) should not.
+ """
+ return (
+ indent_level is not None
+ and (
+ not self.preserve_whitespace_tags
+ or self.name not in self.preserve_whitespace_tags
+ )
+ )
+
+ def prettify(self, encoding=None, formatter="minimal"):
+ """Pretty-print this PageElement as a string.
+
+ :param encoding: The eventual encoding of the string. If this is None,
+ a Unicode string will be returned.
+ :param formatter: A Formatter object, or a string naming one of
+ the standard formatters.
+ :return: A Unicode string (if encoding==None) or a bytestring
+ (otherwise).
+ """
+ if encoding is None:
+ return self.decode(True, formatter=formatter)
+ else:
+ return self.encode(encoding, True, formatter=formatter)
+
+ def decode_contents(self, indent_level=None,
+ eventual_encoding=DEFAULT_OUTPUT_ENCODING,
+ formatter="minimal"):
+ """Renders the contents of this tag as a Unicode string.
+
+ :param indent_level: Each line of the rendering will be
+ indented this many spaces. Used internally in
+ recursive calls while pretty-printing.
+
+ :param eventual_encoding: The tag is destined to be
+ encoded into this encoding. decode_contents() is _not_
+ responsible for performing that encoding. This information
+ is passed in so that it can be substituted in if the
+ document contains a <META> tag that mentions the document's
+ encoding.
+
+ :param formatter: A Formatter object, or a string naming one of
+ the standard Formatters.
+ """
+ # First off, turn a string formatter into a Formatter object. This
+ # will stop the lookup from happening over and over again.
+ if not isinstance(formatter, Formatter):
+ formatter = self.formatter_for_name(formatter)
+
+ pretty_print = (indent_level is not None)
+ s = []
+ for c in self:
+ text = None
+ if isinstance(c, NavigableString):
+ text = c.output_ready(formatter)
+ elif isinstance(c, Tag):
+ s.append(c.decode(indent_level, eventual_encoding,
+ formatter))
+ preserve_whitespace = (
+ self.preserve_whitespace_tags and self.name in self.preserve_whitespace_tags
+ )
+ if text and indent_level and not preserve_whitespace:
+ text = text.strip()
+ if text:
+ if pretty_print and not preserve_whitespace:
+ s.append(" " * (indent_level - 1))
+ s.append(text)
+ if pretty_print and not preserve_whitespace:
+ s.append("\n")
+ return ''.join(s)
+
+ def encode_contents(
+ self, indent_level=None, encoding=DEFAULT_OUTPUT_ENCODING,
+ formatter="minimal"):
+ """Renders the contents of this PageElement as a bytestring.
+
+ :param indent_level: Each line of the rendering will be
+ indented this many spaces. Used internally in
+ recursive calls while pretty-printing.
+
+ :param eventual_encoding: The bytestring will be in this encoding.
+
+ :param formatter: A Formatter object, or a string naming one of
+ the standard Formatters.
+
+ :return: A bytestring.
+ """
+ contents = self.decode_contents(indent_level, encoding, formatter)
+ return contents.encode(encoding)
+
+ # Old method for BS3 compatibility
+ def renderContents(self, encoding=DEFAULT_OUTPUT_ENCODING,
+ prettyPrint=False, indentLevel=0):
+ """Deprecated method for BS3 compatibility."""
+ if not prettyPrint:
+ indentLevel = None
+ return self.encode_contents(
+ indent_level=indentLevel, encoding=encoding)
+
+ #Soup methods
+
+ def find(self, name=None, attrs={}, recursive=True, text=None,
+ **kwargs):
+ """Look in the children of this PageElement and find the first
+ PageElement that matches the given criteria.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param recursive: If this is True, find() will perform a
+ recursive search of this PageElement's children. Otherwise,
+ only the direct children will be considered.
+ :param limit: Stop looking after finding this many results.
+ :kwargs: A dictionary of filters on attribute values.
+ :return: A PageElement.
+ :rtype: bs4.element.Tag | bs4.element.NavigableString
+ """
+ r = None
+ l = self.find_all(name, attrs, recursive, text, 1, **kwargs)
+ if l:
+ r = l[0]
+ return r
+ findChild = find #BS2
+
+ def find_all(self, name=None, attrs={}, recursive=True, text=None,
+ limit=None, **kwargs):
+ """Look in the children of this PageElement and find all
+ PageElements that match the given criteria.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param recursive: If this is True, find_all() will perform a
+ recursive search of this PageElement's children. Otherwise,
+ only the direct children will be considered.
+ :param limit: Stop looking after finding this many results.
+ :kwargs: A dictionary of filters on attribute values.
+ :return: A ResultSet of PageElements.
+ :rtype: bs4.element.ResultSet
+ """
+ generator = self.descendants
+ if not recursive:
+ generator = self.children
+ return self._find_all(name, attrs, text, limit, generator, **kwargs)
+ findAll = find_all # BS3
+ findChildren = find_all # BS2
+
+ #Generator methods
+ @property
+ def children(self):
+ """Iterate over all direct children of this PageElement.
+
+ :yield: A sequence of PageElements.
+ """
+ # return iter() to make the purpose of the method clear
+ return iter(self.contents) # XXX This seems to be untested.
+
+ @property
+ def descendants(self):
+ """Iterate over all children of this PageElement in a
+ breadth-first sequence.
+
+ :yield: A sequence of PageElements.
+ """
+ if not len(self.contents):
+ return
+ stopNode = self._last_descendant().next_element
+ current = self.contents[0]
+ while current is not stopNode:
+ yield current
+ current = current.next_element
+
+ # CSS selector code
+ def select_one(self, selector, namespaces=None, **kwargs):
+ """Perform a CSS selection operation on the current element.
+
+ :param selector: A CSS selector.
+
+ :param namespaces: A dictionary mapping namespace prefixes
+ used in the CSS selector to namespace URIs. By default,
+ Beautiful Soup will use the prefixes it encountered while
+ parsing the document.
+
+ :param kwargs: Keyword arguments to be passed into SoupSieve's
+ soupsieve.select() method.
+
+ :return: A Tag.
+ :rtype: bs4.element.Tag
+ """
+ value = self.select(selector, namespaces, 1, **kwargs)
+ if value:
+ return value[0]
+ return None
+
+ def select(self, selector, namespaces=None, limit=None, **kwargs):
+ """Perform a CSS selection operation on the current element.
+
+ This uses the SoupSieve library.
+
+ :param selector: A string containing a CSS selector.
+
+ :param namespaces: A dictionary mapping namespace prefixes
+ used in the CSS selector to namespace URIs. By default,
+ Beautiful Soup will use the prefixes it encountered while
+ parsing the document.
+
+ :param limit: After finding this number of results, stop looking.
+
+ :param kwargs: Keyword arguments to be passed into SoupSieve's
+ soupsieve.select() method.
+
+ :return: A ResultSet of Tags.
+ :rtype: bs4.element.ResultSet
+ """
+ if namespaces is None:
+ namespaces = self._namespaces
+
+ if limit is None:
+ limit = 0
+ if soupsieve is None:
+ raise NotImplementedError(
+ "Cannot execute CSS selectors because the soupsieve package is not installed."
+ )
+
+ results = soupsieve.select(selector, self, namespaces, limit, **kwargs)
+
+ # We do this because it's more consistent and because
+ # ResultSet.__getattr__ has a helpful error message.
+ return ResultSet(None, results)
+
+ # Old names for backwards compatibility
+ def childGenerator(self):
+ """Deprecated generator."""
+ return self.children
+
+ def recursiveChildGenerator(self):
+ """Deprecated generator."""
+ return self.descendants
+
+ def has_key(self, key):
+ """Deprecated method. This was kind of misleading because has_key()
+ (attributes) was different from __in__ (contents).
+
+ has_key() is gone in Python 3, anyway.
+ """
+ warnings.warn('has_key is deprecated. Use has_attr("%s") instead.' % (
+ key))
+ return self.has_attr(key)
+
+# Next, a couple classes to represent queries and their results.
+class SoupStrainer(object):
+ """Encapsulates a number of ways of matching a markup element (tag or
+ string).
+
+ This is primarily used to underpin the find_* methods, but you can
+ create one yourself and pass it in as `parse_only` to the
+ `BeautifulSoup` constructor, to parse a subset of a large
+ document.
+ """
+
+ def __init__(self, name=None, attrs={}, text=None, **kwargs):
+ """Constructor.
+
+ The SoupStrainer constructor takes the same arguments passed
+ into the find_* methods. See the online documentation for
+ detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param text: A filter for a NavigableString with specific text.
+ :kwargs: A dictionary of filters on attribute values.
+ """
+ self.name = self._normalize_search_value(name)
+ if not isinstance(attrs, dict):
+ # Treat a non-dict value for attrs as a search for the 'class'
+ # attribute.
+ kwargs['class'] = attrs
+ attrs = None
+
+ if 'class_' in kwargs:
+ # Treat class_="foo" as a search for the 'class'
+ # attribute, overriding any non-dict value for attrs.
+ kwargs['class'] = kwargs['class_']
+ del kwargs['class_']
+
+ if kwargs:
+ if attrs:
+ attrs = attrs.copy()
+ attrs.update(kwargs)
+ else:
+ attrs = kwargs
+ normalized_attrs = {}
+ for key, value in attrs.items():
+ normalized_attrs[key] = self._normalize_search_value(value)
+
+ self.attrs = normalized_attrs
+ self.text = self._normalize_search_value(text)
+
+ def _normalize_search_value(self, value):
+ # Leave it alone if it's a Unicode string, a callable, a
+ # regular expression, a boolean, or None.
+ if (isinstance(value, unicode) or isinstance(value, Callable) or hasattr(value, 'match')
+ or isinstance(value, bool) or value is None):
+ return value
+
+ # If it's a bytestring, convert it to Unicode, treating it as UTF-8.
+ if isinstance(value, bytes):
+ return value.decode("utf8")
+
+ # If it's listlike, convert it into a list of strings.
+ if hasattr(value, '__iter__'):
+ new_value = []
+ for v in value:
+ if (hasattr(v, '__iter__') and not isinstance(v, bytes)
+ and not isinstance(v, unicode)):
+ # This is almost certainly the user's mistake. In the
+ # interests of avoiding infinite loops, we'll let
+ # it through as-is rather than doing a recursive call.
+ new_value.append(v)
+ else:
+ new_value.append(self._normalize_search_value(v))
+ return new_value
+
+ # Otherwise, convert it into a Unicode string.
+ # The unicode(str()) thing is so this will do the same thing on Python 2
+ # and Python 3.
+ return unicode(str(value))
+
+ def __str__(self):
+ """A human-readable representation of this SoupStrainer."""
+ if self.text:
+ return self.text
+ else:
+ return "%s|%s" % (self.name, self.attrs)
+
+ def search_tag(self, markup_name=None, markup_attrs={}):
+ """Check whether a Tag with the given name and attributes would
+ match this SoupStrainer.
+
+ Used prospectively to decide whether to even bother creating a Tag
+ object.
+
+ :param markup_name: A tag name as found in some markup.
+ :param markup_attrs: A dictionary of attributes as found in some markup.
+
+ :return: True if the prospective tag would match this SoupStrainer;
+ False otherwise.
+ """
+ found = None
+ markup = None
+ if isinstance(markup_name, Tag):
+ markup = markup_name
+ markup_attrs = markup
+
+ if isinstance(self.name, basestring):
+ # Optimization for a very common case where the user is
+ # searching for a tag with one specific name, and we're
+ # looking at a tag with a different name.
+ if markup and not markup.prefix and self.name != markup.name:
+ return False
+
+ call_function_with_tag_data = (
+ isinstance(self.name, Callable)
+ and not isinstance(markup_name, Tag))
+
+ if ((not self.name)
+ or call_function_with_tag_data
+ or (markup and self._matches(markup, self.name))
+ or (not markup and self._matches(markup_name, self.name))):
+ if call_function_with_tag_data:
+ match = self.name(markup_name, markup_attrs)
+ else:
+ match = True
+ markup_attr_map = None
+ for attr, match_against in list(self.attrs.items()):
+ if not markup_attr_map:
+ if hasattr(markup_attrs, 'get'):
+ markup_attr_map = markup_attrs
+ else:
+ markup_attr_map = {}
+ for k, v in markup_attrs:
+ markup_attr_map[k] = v
+ attr_value = markup_attr_map.get(attr)
+ if not self._matches(attr_value, match_against):
+ match = False
+ break
+ if match:
+ if markup:
+ found = markup
+ else:
+ found = markup_name
+ if found and self.text and not self._matches(found.string, self.text):
+ found = None
+ return found
+
+ # For BS3 compatibility.
+ searchTag = search_tag
+
+ def search(self, markup):
+ """Find all items in `markup` that match this SoupStrainer.
+
+ Used by the core _find_all() method, which is ultimately
+ called by all find_* methods.
+
+ :param markup: A PageElement or a list of them.
+ """
+ # print('looking for %s in %s' % (self, markup))
+ found = None
+ # If given a list of items, scan it for a text element that
+ # matches.
+ if hasattr(markup, '__iter__') and not isinstance(markup, (Tag, basestring)):
+ for element in markup:
+ if isinstance(element, NavigableString) \
+ and self.search(element):
+ found = element
+ break
+ # If it's a Tag, make sure its name or attributes match.
+ # Don't bother with Tags if we're searching for text.
+ elif isinstance(markup, Tag):
+ if not self.text or self.name or self.attrs:
+ found = self.search_tag(markup)
+ # If it's text, make sure the text matches.
+ elif isinstance(markup, NavigableString) or \
+ isinstance(markup, basestring):
+ if not self.name and not self.attrs and self._matches(markup, self.text):
+ found = markup
+ else:
+ raise Exception(
+ "I don't know how to match against a %s" % markup.__class__)
+ return found
+
+ def _matches(self, markup, match_against, already_tried=None):
+ # print(u"Matching %s against %s" % (markup, match_against))
+ result = False
+ if isinstance(markup, list) or isinstance(markup, tuple):
+ # This should only happen when searching a multi-valued attribute
+ # like 'class'.
+ for item in markup:
+ if self._matches(item, match_against):
+ return True
+ # We didn't match any particular value of the multivalue
+ # attribute, but maybe we match the attribute value when
+ # considered as a string.
+ if self._matches(' '.join(markup), match_against):
+ return True
+ return False
+
+ if match_against is True:
+ # True matches any non-None value.
+ return markup is not None
+
+ if isinstance(match_against, Callable):
+ return match_against(markup)
+
+ # Custom callables take the tag as an argument, but all
+ # other ways of matching match the tag name as a string.
+ original_markup = markup
+ if isinstance(markup, Tag):
+ markup = markup.name
+
+ # Ensure that `markup` is either a Unicode string, or None.
+ markup = self._normalize_search_value(markup)
+
+ if markup is None:
+ # None matches None, False, an empty string, an empty list, and so on.
+ return not match_against
+
+ if (hasattr(match_against, '__iter__')
+ and not isinstance(match_against, basestring)):
+ # We're asked to match against an iterable of items.
+ # The markup must be match at least one item in the
+ # iterable. We'll try each one in turn.
+ #
+ # To avoid infinite recursion we need to keep track of
+ # items we've already seen.
+ if not already_tried:
+ already_tried = set()
+ for item in match_against:
+ if item.__hash__:
+ key = item
+ else:
+ key = id(item)
+ if key in already_tried:
+ continue
+ else:
+ already_tried.add(key)
+ if self._matches(original_markup, item, already_tried):
+ return True
+ else:
+ return False
+
+ # Beyond this point we might need to run the test twice: once against
+ # the tag's name and once against its prefixed name.
+ match = False
+
+ if not match and isinstance(match_against, unicode):
+ # Exact string match
+ match = markup == match_against
+
+ if not match and hasattr(match_against, 'search'):
+ # Regexp match
+ return match_against.search(markup)
+
+ if (not match
+ and isinstance(original_markup, Tag)
+ and original_markup.prefix):
+ # Try the whole thing again with the prefixed tag name.
+ return self._matches(
+ original_markup.prefix + ':' + original_markup.name, match_against
+ )
+
+ return match
+
+
+class ResultSet(list):
+ """A ResultSet is just a list that keeps track of the SoupStrainer
+ that created it."""
+ def __init__(self, source, result=()):
+ """Constructor.
+
+ :param source: A SoupStrainer.
+ :param result: A list of PageElements.
+ """
+ super(ResultSet, self).__init__(result)
+ self.source = source
+
+ def __getattr__(self, key):
+ """Raise a helpful exception to explain a common code fix."""
+ raise AttributeError(
+ "ResultSet object has no attribute '%s'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?" % key
+ )
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/formatter.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/formatter.py
new file mode 100644
index 00000000000..9a692ecae3c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/formatter.py
@@ -0,0 +1,152 @@
+from bs4.dammit import EntitySubstitution
+
+class Formatter(EntitySubstitution):
+ """Describes a strategy to use when outputting a parse tree to a string.
+
+ Some parts of this strategy come from the distinction between
+ HTML4, HTML5, and XML. Others are configurable by the user.
+
+ Formatters are passed in as the `formatter` argument to methods
+ like `PageElement.encode`. Most people won't need to think about
+ formatters, and most people who need to think about them can pass
+ in one of these predefined strings as `formatter` rather than
+ making a new Formatter object:
+
+ For HTML documents:
+ * 'html' - HTML entity substitution for generic HTML documents. (default)
+ * 'html5' - HTML entity substitution for HTML5 documents.
+ * 'minimal' - Only make the substitutions necessary to guarantee
+ valid HTML.
+ * None - Do not perform any substitution. This will be faster
+ but may result in invalid markup.
+
+ For XML documents:
+ * 'html' - Entity substitution for XHTML documents.
+ * 'minimal' - Only make the substitutions necessary to guarantee
+ valid XML. (default)
+ * None - Do not perform any substitution. This will be faster
+ but may result in invalid markup.
+ """
+ # Registries of XML and HTML formatters.
+ XML_FORMATTERS = {}
+ HTML_FORMATTERS = {}
+
+ HTML = 'html'
+ XML = 'xml'
+
+ HTML_DEFAULTS = dict(
+ cdata_containing_tags=set(["script", "style"]),
+ )
+
+ def _default(self, language, value, kwarg):
+ if value is not None:
+ return value
+ if language == self.XML:
+ return set()
+ return self.HTML_DEFAULTS[kwarg]
+
+ def __init__(
+ self, language=None, entity_substitution=None,
+ void_element_close_prefix='/', cdata_containing_tags=None,
+ ):
+ """Constructor.
+
+ :param language: This should be Formatter.XML if you are formatting
+ XML markup and Formatter.HTML if you are formatting HTML markup.
+
+ :param entity_substitution: A function to call to replace special
+ characters with XML/HTML entities. For examples, see
+ bs4.dammit.EntitySubstitution.substitute_html and substitute_xml.
+ :param void_element_close_prefix: By default, void elements
+ are represented as <tag/> (XML rules) rather than <tag>
+ (HTML rules). To get <tag>, pass in the empty string.
+ :param cdata_containing_tags: The list of tags that are defined
+ as containing CDATA in this dialect. For example, in HTML,
+ <script> and <style> tags are defined as containing CDATA,
+ and their contents should not be formatted.
+ """
+ self.language = language
+ self.entity_substitution = entity_substitution
+ self.void_element_close_prefix = void_element_close_prefix
+ self.cdata_containing_tags = self._default(
+ language, cdata_containing_tags, 'cdata_containing_tags'
+ )
+
+ def substitute(self, ns):
+ """Process a string that needs to undergo entity substitution.
+ This may be a string encountered in an attribute value or as
+ text.
+
+ :param ns: A string.
+ :return: A string with certain characters replaced by named
+ or numeric entities.
+ """
+ if not self.entity_substitution:
+ return ns
+ from element import NavigableString
+ if (isinstance(ns, NavigableString)
+ and ns.parent is not None
+ and ns.parent.name in self.cdata_containing_tags):
+ # Do nothing.
+ return ns
+ # Substitute.
+ return self.entity_substitution(ns)
+
+ def attribute_value(self, value):
+ """Process the value of an attribute.
+
+ :param ns: A string.
+ :return: A string with certain characters replaced by named
+ or numeric entities.
+ """
+ return self.substitute(value)
+
+ def attributes(self, tag):
+ """Reorder a tag's attributes however you want.
+
+ By default, attributes are sorted alphabetically. This makes
+ behavior consistent between Python 2 and Python 3, and preserves
+ backwards compatibility with older versions of Beautiful Soup.
+ """
+ if tag.attrs is None:
+ return []
+ return sorted(tag.attrs.items())
+
+
+class HTMLFormatter(Formatter):
+ """A generic Formatter for HTML."""
+ REGISTRY = {}
+ def __init__(self, *args, **kwargs):
+ return super(HTMLFormatter, self).__init__(self.HTML, *args, **kwargs)
+
+
+class XMLFormatter(Formatter):
+ """A generic Formatter for XML."""
+ REGISTRY = {}
+ def __init__(self, *args, **kwargs):
+ return super(XMLFormatter, self).__init__(self.XML, *args, **kwargs)
+
+
+# Set up aliases for the default formatters.
+HTMLFormatter.REGISTRY['html'] = HTMLFormatter(
+ entity_substitution=EntitySubstitution.substitute_html
+)
+HTMLFormatter.REGISTRY["html5"] = HTMLFormatter(
+ entity_substitution=EntitySubstitution.substitute_html,
+ void_element_close_prefix = None
+)
+HTMLFormatter.REGISTRY["minimal"] = HTMLFormatter(
+ entity_substitution=EntitySubstitution.substitute_xml
+)
+HTMLFormatter.REGISTRY[None] = HTMLFormatter(
+ entity_substitution=None
+)
+XMLFormatter.REGISTRY["html"] = XMLFormatter(
+ entity_substitution=EntitySubstitution.substitute_html
+)
+XMLFormatter.REGISTRY["minimal"] = XMLFormatter(
+ entity_substitution=EntitySubstitution.substitute_xml
+)
+XMLFormatter.REGISTRY[None] = Formatter(
+ Formatter(Formatter.XML, entity_substitution=None)
+)
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/testing.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/testing.py
new file mode 100644
index 00000000000..a2f83a1ad16
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/bs4/testing.py
@@ -0,0 +1,1101 @@
+# encoding: utf-8
+"""Helper classes for tests."""
+
+# Use of this source code is governed by the MIT license.
+__license__ = "MIT"
+
+import pickle
+import copy
+import functools
+import unittest
+from unittest import TestCase
+from bs4 import BeautifulSoup
+from bs4.element import (
+ CharsetMetaAttributeValue,
+ Comment,
+ ContentMetaAttributeValue,
+ Doctype,
+ PYTHON_SPECIFIC_ENCODINGS,
+ SoupStrainer,
+ Script,
+ Stylesheet,
+ Tag
+)
+
+from bs4.builder import HTMLParserTreeBuilder
+default_builder = HTMLParserTreeBuilder
+
+BAD_DOCUMENT = u"""A bare string
+<!DOCTYPE xsl:stylesheet SYSTEM "htmlent.dtd">
+<!DOCTYPE xsl:stylesheet PUBLIC "htmlent.dtd">
+<div><![CDATA[A CDATA section where it doesn't belong]]></div>
+<div><svg><![CDATA[HTML5 does allow CDATA sections in SVG]]></svg></div>
+<div>A <meta> tag</div>
+<div>A <br> tag that supposedly has contents.</br></div>
+<div>AT&T</div>
+<div><textarea>Within a textarea, markup like <b> tags and <&<&amp; should be treated as literal</textarea></div>
+<div><script>if (i < 2) { alert("<b>Markup within script tags should be treated as literal.</b>"); }</script></div>
+<div>This numeric entity is missing the final semicolon: <x t="pi&#241ata"></div>
+<div><a href="http://example.com/</a> that attribute value never got closed</div>
+<div><a href="foo</a>, </a><a href="bar">that attribute value was closed by the subsequent tag</a></div>
+<! This document starts with a bogus declaration ><div>a</div>
+<div>This document contains <!an incomplete declaration <div>(do you see it?)</div>
+<div>This document ends with <!an incomplete declaration
+<div><a style={height:21px;}>That attribute value was bogus</a></div>
+<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">The doctype is invalid because it contains extra whitespace
+<div><table><td nowrap>That boolean attribute had no value</td></table></div>
+<div>Here's a nonexistent entity: &#foo; (do you see it?)</div>
+<div>This document ends before the entity finishes: &gt
+<div><p>Paragraphs shouldn't contain block display elements, but this one does: <dl><dt>you see?</dt></p>
+<b b="20" a="1" b="10" a="2" a="3" a="4">Multiple values for the same attribute.</b>
+<div><table><tr><td>Here's a table</td></tr></table></div>
+<div><table id="1"><tr><td>Here's a nested table:<table id="2"><tr><td>foo</td></tr></table></td></div>
+<div>This tag contains nothing but whitespace: <b> </b></div>
+<div><blockquote><p><b>This p tag is cut off by</blockquote></p>the end of the blockquote tag</div>
+<div><table><div>This table contains bare markup</div></table></div>
+<div><div id="1">\n <a href="link1">This link is never closed.\n</div>\n<div id="2">\n <div id="3">\n <a href="link2">This link is closed.</a>\n </div>\n</div></div>
+<div>This document contains a <!DOCTYPE surprise>surprise doctype</div>
+<div><a><B><Cd><EFG>Mixed case tags are folded to lowercase</efg></CD></b></A></div>
+<div><our\u2603>Tag name contains Unicode characters</our\u2603></div>
+<div><a \u2603="snowman">Attribute name contains Unicode characters</a></div>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+"""
+
+
+class SoupTest(unittest.TestCase):
+
+ @property
+ def default_builder(self):
+ return default_builder
+
+ def soup(self, markup, **kwargs):
+ """Build a Beautiful Soup object from markup."""
+ builder = kwargs.pop('builder', self.default_builder)
+ return BeautifulSoup(markup, builder=builder, **kwargs)
+
+ def document_for(self, markup, **kwargs):
+ """Turn an HTML fragment into a document.
+
+ The details depend on the builder.
+ """
+ return self.default_builder(**kwargs).test_fragment_to_document(markup)
+
+ def assertSoupEquals(self, to_parse, compare_parsed_to=None):
+ builder = self.default_builder
+ obj = BeautifulSoup(to_parse, builder=builder)
+ if compare_parsed_to is None:
+ compare_parsed_to = to_parse
+
+ # Verify that the documents come out the same.
+ self.assertEqual(obj.decode(), self.document_for(compare_parsed_to))
+
+ # Also run some checks on the BeautifulSoup object itself:
+
+ # Verify that every tag that was opened was eventually closed.
+
+ # There are no tags in the open tag counter.
+ assert all(v==0 for v in obj.open_tag_counter.values())
+
+ # The only tag in the tag stack is the one for the root
+ # document.
+ self.assertEqual(
+ [obj.ROOT_TAG_NAME], [x.name for x in obj.tagStack]
+ )
+
+ def assertConnectedness(self, element):
+ """Ensure that next_element and previous_element are properly
+ set for all descendants of the given element.
+ """
+ earlier = None
+ for e in element.descendants:
+ if earlier:
+ self.assertEqual(e, earlier.next_element)
+ self.assertEqual(earlier, e.previous_element)
+ earlier = e
+
+ def linkage_validator(self, el, _recursive_call=False):
+ """Ensure proper linkage throughout the document."""
+ descendant = None
+ # Document element should have no previous element or previous sibling.
+ # It also shouldn't have a next sibling.
+ if el.parent is None:
+ assert el.previous_element is None,\
+ "Bad previous_element\nNODE: {}\nPREV: {}\nEXPECTED: {}".format(
+ el, el.previous_element, None
+ )
+ assert el.previous_sibling is None,\
+ "Bad previous_sibling\nNODE: {}\nPREV: {}\nEXPECTED: {}".format(
+ el, el.previous_sibling, None
+ )
+ assert el.next_sibling is None,\
+ "Bad next_sibling\nNODE: {}\nNEXT: {}\nEXPECTED: {}".format(
+ el, el.next_sibling, None
+ )
+
+ idx = 0
+ child = None
+ last_child = None
+ last_idx = len(el.contents) - 1
+ for child in el.contents:
+ descendant = None
+
+ # Parent should link next element to their first child
+ # That child should have no previous sibling
+ if idx == 0:
+ if el.parent is not None:
+ assert el.next_element is child,\
+ "Bad next_element\nNODE: {}\nNEXT: {}\nEXPECTED: {}".format(
+ el, el.next_element, child
+ )
+ assert child.previous_element is el,\
+ "Bad previous_element\nNODE: {}\nPREV: {}\nEXPECTED: {}".format(
+ child, child.previous_element, el
+ )
+ assert child.previous_sibling is None,\
+ "Bad previous_sibling\nNODE: {}\nPREV {}\nEXPECTED: {}".format(
+ child, child.previous_sibling, None
+ )
+
+ # If not the first child, previous index should link as sibling to this index
+ # Previous element should match the last index or the last bubbled up descendant
+ else:
+ assert child.previous_sibling is el.contents[idx - 1],\
+ "Bad previous_sibling\nNODE: {}\nPREV {}\nEXPECTED {}".format(
+ child, child.previous_sibling, el.contents[idx - 1]
+ )
+ assert el.contents[idx - 1].next_sibling is child,\
+ "Bad next_sibling\nNODE: {}\nNEXT {}\nEXPECTED {}".format(
+ el.contents[idx - 1], el.contents[idx - 1].next_sibling, child
+ )
+
+ if last_child is not None:
+ assert child.previous_element is last_child,\
+ "Bad previous_element\nNODE: {}\nPREV {}\nEXPECTED {}\nCONTENTS {}".format(
+ child, child.previous_element, last_child, child.parent.contents
+ )
+ assert last_child.next_element is child,\
+ "Bad next_element\nNODE: {}\nNEXT {}\nEXPECTED {}".format(
+ last_child, last_child.next_element, child
+ )
+
+ if isinstance(child, Tag) and child.contents:
+ descendant = self.linkage_validator(child, True)
+ # A bubbled up descendant should have no next siblings
+ assert descendant.next_sibling is None,\
+ "Bad next_sibling\nNODE: {}\nNEXT {}\nEXPECTED {}".format(
+ descendant, descendant.next_sibling, None
+ )
+
+ # Mark last child as either the bubbled up descendant or the current child
+ if descendant is not None:
+ last_child = descendant
+ else:
+ last_child = child
+
+ # If last child, there are non next siblings
+ if idx == last_idx:
+ assert child.next_sibling is None,\
+ "Bad next_sibling\nNODE: {}\nNEXT {}\nEXPECTED {}".format(
+ child, child.next_sibling, None
+ )
+ idx += 1
+
+ child = descendant if descendant is not None else child
+ if child is None:
+ child = el
+
+ if not _recursive_call and child is not None:
+ target = el
+ while True:
+ if target is None:
+ assert child.next_element is None, \
+ "Bad next_element\nNODE: {}\nNEXT {}\nEXPECTED {}".format(
+ child, child.next_element, None
+ )
+ break
+ elif target.next_sibling is not None:
+ assert child.next_element is target.next_sibling, \
+ "Bad next_element\nNODE: {}\nNEXT {}\nEXPECTED {}".format(
+ child, child.next_element, target.next_sibling
+ )
+ break
+ target = target.parent
+
+ # We are done, so nothing to return
+ return None
+ else:
+ # Return the child to the recursive caller
+ return child
+
+
+class HTMLTreeBuilderSmokeTest(object):
+
+ """A basic test of a treebuilder's competence.
+
+ Any HTML treebuilder, present or future, should be able to pass
+ these tests. With invalid markup, there's room for interpretation,
+ and different parsers can handle it differently. But with the
+ markup in these tests, there's not much room for interpretation.
+ """
+
+ def test_empty_element_tags(self):
+ """Verify that all HTML4 and HTML5 empty element (aka void element) tags
+ are handled correctly.
+ """
+ for name in [
+ 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr',
+ 'spacer', 'frame'
+ ]:
+ soup = self.soup("")
+ new_tag = soup.new_tag(name)
+ self.assertEqual(True, new_tag.is_empty_element)
+
+ def test_special_string_containers(self):
+ soup = self.soup(
+ "<style>Some CSS</style><script>Some Javascript</script>"
+ )
+ assert isinstance(soup.style.string, Stylesheet)
+ assert isinstance(soup.script.string, Script)
+
+ soup = self.soup(
+ "<style><!--Some CSS--></style>"
+ )
+ assert isinstance(soup.style.string, Stylesheet)
+ # The contents of the style tag resemble an HTML comment, but
+ # it's not treated as a comment.
+ self.assertEqual("<!--Some CSS-->", soup.style.string)
+ assert isinstance(soup.style.string, Stylesheet)
+
+ def test_pickle_and_unpickle_identity(self):
+ # Pickling a tree, then unpickling it, yields a tree identical
+ # to the original.
+ tree = self.soup("<a><b>foo</a>")
+ dumped = pickle.dumps(tree, 2)
+ loaded = pickle.loads(dumped)
+ self.assertEqual(loaded.__class__, BeautifulSoup)
+ self.assertEqual(loaded.decode(), tree.decode())
+
+ def assertDoctypeHandled(self, doctype_fragment):
+ """Assert that a given doctype string is handled correctly."""
+ doctype_str, soup = self._document_with_doctype(doctype_fragment)
+
+ # Make sure a Doctype object was created.
+ doctype = soup.contents[0]
+ self.assertEqual(doctype.__class__, Doctype)
+ self.assertEqual(doctype, doctype_fragment)
+ self.assertEqual(
+ soup.encode("utf8")[:len(doctype_str)],
+ doctype_str
+ )
+
+ # Make sure that the doctype was correctly associated with the
+ # parse tree and that the rest of the document parsed.
+ self.assertEqual(soup.p.contents[0], 'foo')
+
+ def _document_with_doctype(self, doctype_fragment, doctype_string="DOCTYPE"):
+ """Generate and parse a document with the given doctype."""
+ doctype = '<!%s %s>' % (doctype_string, doctype_fragment)
+ markup = doctype + '\n<p>foo</p>'
+ soup = self.soup(markup)
+ return doctype.encode("utf8"), soup
+
+ def test_normal_doctypes(self):
+ """Make sure normal, everyday HTML doctypes are handled correctly."""
+ self.assertDoctypeHandled("html")
+ self.assertDoctypeHandled(
+ 'html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"')
+
+ def test_empty_doctype(self):
+ soup = self.soup("<!DOCTYPE>")
+ doctype = soup.contents[0]
+ self.assertEqual("", doctype.strip())
+
+ def test_mixed_case_doctype(self):
+ # A lowercase or mixed-case doctype becomes a Doctype.
+ for doctype_fragment in ("doctype", "DocType"):
+ doctype_str, soup = self._document_with_doctype(
+ "html", doctype_fragment
+ )
+
+ # Make sure a Doctype object was created and that the DOCTYPE
+ # is uppercase.
+ doctype = soup.contents[0]
+ self.assertEqual(doctype.__class__, Doctype)
+ self.assertEqual(doctype, "html")
+ self.assertEqual(
+ soup.encode("utf8")[:len(doctype_str)],
+ b"<!DOCTYPE html>"
+ )
+
+ # Make sure that the doctype was correctly associated with the
+ # parse tree and that the rest of the document parsed.
+ self.assertEqual(soup.p.contents[0], 'foo')
+
+ def test_public_doctype_with_url(self):
+ doctype = 'html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"'
+ self.assertDoctypeHandled(doctype)
+
+ def test_system_doctype(self):
+ self.assertDoctypeHandled('foo SYSTEM "http://www.example.com/"')
+
+ def test_namespaced_system_doctype(self):
+ # We can handle a namespaced doctype with a system ID.
+ self.assertDoctypeHandled('xsl:stylesheet SYSTEM "htmlent.dtd"')
+
+ def test_namespaced_public_doctype(self):
+ # Test a namespaced doctype with a public id.
+ self.assertDoctypeHandled('xsl:stylesheet PUBLIC "htmlent.dtd"')
+
+ def test_real_xhtml_document(self):
+ """A real XHTML document should come out more or less the same as it went in."""
+ markup = b"""<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title>Hello.</title></head>
+<body>Goodbye.</body>
+</html>"""
+ soup = self.soup(markup)
+ self.assertEqual(
+ soup.encode("utf-8").replace(b"\n", b""),
+ markup.replace(b"\n", b""))
+
+ def test_namespaced_html(self):
+ """When a namespaced XML document is parsed as HTML it should
+ be treated as HTML with weird tag names.
+ """
+ markup = b"""<ns1:foo>content</ns1:foo><ns1:foo/><ns2:foo/>"""
+ soup = self.soup(markup)
+ self.assertEqual(2, len(soup.find_all("ns1:foo")))
+
+ def test_processing_instruction(self):
+ # We test both Unicode and bytestring to verify that
+ # process_markup correctly sets processing_instruction_class
+ # even when the markup is already Unicode and there is no
+ # need to process anything.
+ markup = u"""<?PITarget PIContent?>"""
+ soup = self.soup(markup)
+ self.assertEqual(markup, soup.decode())
+
+ markup = b"""<?PITarget PIContent?>"""
+ soup = self.soup(markup)
+ self.assertEqual(markup, soup.encode("utf8"))
+
+ def test_deepcopy(self):
+ """Make sure you can copy the tree builder.
+
+ This is important because the builder is part of a
+ BeautifulSoup object, and we want to be able to copy that.
+ """
+ copy.deepcopy(self.default_builder)
+
+ def test_p_tag_is_never_empty_element(self):
+ """A <p> tag is never designated as an empty-element tag.
+
+ Even if the markup shows it as an empty-element tag, it
+ shouldn't be presented that way.
+ """
+ soup = self.soup("<p/>")
+ self.assertFalse(soup.p.is_empty_element)
+ self.assertEqual(str(soup.p), "<p></p>")
+
+ def test_unclosed_tags_get_closed(self):
+ """A tag that's not closed by the end of the document should be closed.
+
+ This applies to all tags except empty-element tags.
+ """
+ self.assertSoupEquals("<p>", "<p></p>")
+ self.assertSoupEquals("<b>", "<b></b>")
+
+ self.assertSoupEquals("<br>", "<br/>")
+
+ def test_br_is_always_empty_element_tag(self):
+ """A <br> tag is designated as an empty-element tag.
+
+ Some parsers treat <br></br> as one <br/> tag, some parsers as
+ two tags, but it should always be an empty-element tag.
+ """
+ soup = self.soup("<br></br>")
+ self.assertTrue(soup.br.is_empty_element)
+ self.assertEqual(str(soup.br), "<br/>")
+
+ def test_nested_formatting_elements(self):
+ self.assertSoupEquals("<em><em></em></em>")
+
+ def test_double_head(self):
+ html = '''<!DOCTYPE html>
+<html>
+<head>
+<title>Ordinary HEAD element test</title>
+</head>
+<script type="text/javascript">
+alert("Help!");
+</script>
+<body>
+Hello, world!
+</body>
+</html>
+'''
+ soup = self.soup(html)
+ self.assertEqual("text/javascript", soup.find('script')['type'])
+
+ def test_comment(self):
+ # Comments are represented as Comment objects.
+ markup = "<p>foo<!--foobar-->baz</p>"
+ self.assertSoupEquals(markup)
+
+ soup = self.soup(markup)
+ comment = soup.find(text="foobar")
+ self.assertEqual(comment.__class__, Comment)
+
+ # The comment is properly integrated into the tree.
+ foo = soup.find(text="foo")
+ self.assertEqual(comment, foo.next_element)
+ baz = soup.find(text="baz")
+ self.assertEqual(comment, baz.previous_element)
+
+ def test_preserved_whitespace_in_pre_and_textarea(self):
+ """Whitespace must be preserved in <pre> and <textarea> tags,
+ even if that would mean not prettifying the markup.
+ """
+ pre_markup = "<pre> </pre>"
+ textarea_markup = "<textarea> woo\nwoo </textarea>"
+ self.assertSoupEquals(pre_markup)
+ self.assertSoupEquals(textarea_markup)
+
+ soup = self.soup(pre_markup)
+ self.assertEqual(soup.pre.prettify(), pre_markup)
+
+ soup = self.soup(textarea_markup)
+ self.assertEqual(soup.textarea.prettify(), textarea_markup)
+
+ soup = self.soup("<textarea></textarea>")
+ self.assertEqual(soup.textarea.prettify(), "<textarea></textarea>")
+
+ def test_nested_inline_elements(self):
+ """Inline elements can be nested indefinitely."""
+ b_tag = "<b>Inside a B tag</b>"
+ self.assertSoupEquals(b_tag)
+
+ nested_b_tag = "<p>A <i>nested <b>tag</b></i></p>"
+ self.assertSoupEquals(nested_b_tag)
+
+ double_nested_b_tag = "<p>A <a>doubly <i>nested <b>tag</b></i></a></p>"
+ self.assertSoupEquals(nested_b_tag)
+
+ def test_nested_block_level_elements(self):
+ """Block elements can be nested."""
+ soup = self.soup('<blockquote><p><b>Foo</b></p></blockquote>')
+ blockquote = soup.blockquote
+ self.assertEqual(blockquote.p.b.string, 'Foo')
+ self.assertEqual(blockquote.b.string, 'Foo')
+
+ def test_correctly_nested_tables(self):
+ """One table can go inside another one."""
+ markup = ('<table id="1">'
+ '<tr>'
+ "<td>Here's another table:"
+ '<table id="2">'
+ '<tr><td>foo</td></tr>'
+ '</table></td>')
+
+ self.assertSoupEquals(
+ markup,
+ '<table id="1"><tr><td>Here\'s another table:'
+ '<table id="2"><tr><td>foo</td></tr></table>'
+ '</td></tr></table>')
+
+ self.assertSoupEquals(
+ "<table><thead><tr><td>Foo</td></tr></thead>"
+ "<tbody><tr><td>Bar</td></tr></tbody>"
+ "<tfoot><tr><td>Baz</td></tr></tfoot></table>")
+
+ def test_multivalued_attribute_with_whitespace(self):
+ # Whitespace separating the values of a multi-valued attribute
+ # should be ignored.
+
+ markup = '<div class=" foo bar "></a>'
+ soup = self.soup(markup)
+ self.assertEqual(['foo', 'bar'], soup.div['class'])
+
+ # If you search by the literal name of the class it's like the whitespace
+ # wasn't there.
+ self.assertEqual(soup.div, soup.find('div', class_="foo bar"))
+
+ def test_deeply_nested_multivalued_attribute(self):
+ # html5lib can set the attributes of the same tag many times
+ # as it rearranges the tree. This has caused problems with
+ # multivalued attributes.
+ markup = '<table><div><div class="css"></div></div></table>'
+ soup = self.soup(markup)
+ self.assertEqual(["css"], soup.div.div['class'])
+
+ def test_multivalued_attribute_on_html(self):
+ # html5lib uses a different API to set the attributes ot the
+ # <html> tag. This has caused problems with multivalued
+ # attributes.
+ markup = '<html class="a b"></html>'
+ soup = self.soup(markup)
+ self.assertEqual(["a", "b"], soup.html['class'])
+
+ def test_angle_brackets_in_attribute_values_are_escaped(self):
+ self.assertSoupEquals('<a b="<a>"></a>', '<a b="&lt;a&gt;"></a>')
+
+ def test_strings_resembling_character_entity_references(self):
+ # "&T" and "&p" look like incomplete character entities, but they are
+ # not.
+ self.assertSoupEquals(
+ u"<p>&bull; AT&T is in the s&p 500</p>",
+ u"<p>\u2022 AT&amp;T is in the s&amp;p 500</p>"
+ )
+
+ def test_apos_entity(self):
+ self.assertSoupEquals(
+ u"<p>Bob&apos;s Bar</p>",
+ u"<p>Bob's Bar</p>",
+ )
+
+ def test_entities_in_foreign_document_encoding(self):
+ # &#147; and &#148; are invalid numeric entities referencing
+ # Windows-1252 characters. &#45; references a character common
+ # to Windows-1252 and Unicode, and &#9731; references a
+ # character only found in Unicode.
+ #
+ # All of these entities should be converted to Unicode
+ # characters.
+ markup = "<p>&#147;Hello&#148; &#45;&#9731;</p>"
+ soup = self.soup(markup)
+ self.assertEquals(u"“Hello” -☃", soup.p.string)
+
+ def test_entities_in_attributes_converted_to_unicode(self):
+ expect = u'<p id="pi\N{LATIN SMALL LETTER N WITH TILDE}ata"></p>'
+ self.assertSoupEquals('<p id="pi&#241;ata"></p>', expect)
+ self.assertSoupEquals('<p id="pi&#xf1;ata"></p>', expect)
+ self.assertSoupEquals('<p id="pi&#Xf1;ata"></p>', expect)
+ self.assertSoupEquals('<p id="pi&ntilde;ata"></p>', expect)
+
+ def test_entities_in_text_converted_to_unicode(self):
+ expect = u'<p>pi\N{LATIN SMALL LETTER N WITH TILDE}ata</p>'
+ self.assertSoupEquals("<p>pi&#241;ata</p>", expect)
+ self.assertSoupEquals("<p>pi&#xf1;ata</p>", expect)
+ self.assertSoupEquals("<p>pi&#Xf1;ata</p>", expect)
+ self.assertSoupEquals("<p>pi&ntilde;ata</p>", expect)
+
+ def test_quot_entity_converted_to_quotation_mark(self):
+ self.assertSoupEquals("<p>I said &quot;good day!&quot;</p>",
+ '<p>I said "good day!"</p>')
+
+ def test_out_of_range_entity(self):
+ expect = u"\N{REPLACEMENT CHARACTER}"
+ self.assertSoupEquals("&#10000000000000;", expect)
+ self.assertSoupEquals("&#x10000000000000;", expect)
+ self.assertSoupEquals("&#1000000000;", expect)
+
+ def test_multipart_strings(self):
+ "Mostly to prevent a recurrence of a bug in the html5lib treebuilder."
+ soup = self.soup("<html><h2>\nfoo</h2><p></p></html>")
+ self.assertEqual("p", soup.h2.string.next_element.name)
+ self.assertEqual("p", soup.p.name)
+ self.assertConnectedness(soup)
+
+ def test_empty_element_tags(self):
+ """Verify consistent handling of empty-element tags,
+ no matter how they come in through the markup.
+ """
+ self.assertSoupEquals('<br/><br/><br/>', "<br/><br/><br/>")
+ self.assertSoupEquals('<br /><br /><br />', "<br/><br/><br/>")
+
+ def test_head_tag_between_head_and_body(self):
+ "Prevent recurrence of a bug in the html5lib treebuilder."
+ content = """<html><head></head>
+ <link></link>
+ <body>foo</body>
+</html>
+"""
+ soup = self.soup(content)
+ self.assertNotEqual(None, soup.html.body)
+ self.assertConnectedness(soup)
+
+ def test_multiple_copies_of_a_tag(self):
+ "Prevent recurrence of a bug in the html5lib treebuilder."
+ content = """<!DOCTYPE html>
+<html>
+ <body>
+ <article id="a" >
+ <div><a href="1"></div>
+ <footer>
+ <a href="2"></a>
+ </footer>
+ </article>
+ </body>
+</html>
+"""
+ soup = self.soup(content)
+ self.assertConnectedness(soup.article)
+
+ def test_basic_namespaces(self):
+ """Parsers don't need to *understand* namespaces, but at the
+ very least they should not choke on namespaces or lose
+ data."""
+
+ markup = b'<html xmlns="http://www.w3.org/1999/xhtml" xmlns:mathml="http://www.w3.org/1998/Math/MathML" xmlns:svg="http://www.w3.org/2000/svg"><head></head><body><mathml:msqrt>4</mathml:msqrt><b svg:fill="red"></b></body></html>'
+ soup = self.soup(markup)
+ self.assertEqual(markup, soup.encode())
+ html = soup.html
+ self.assertEqual('http://www.w3.org/1999/xhtml', soup.html['xmlns'])
+ self.assertEqual(
+ 'http://www.w3.org/1998/Math/MathML', soup.html['xmlns:mathml'])
+ self.assertEqual(
+ 'http://www.w3.org/2000/svg', soup.html['xmlns:svg'])
+
+ def test_multivalued_attribute_value_becomes_list(self):
+ markup = b'<a class="foo bar">'
+ soup = self.soup(markup)
+ self.assertEqual(['foo', 'bar'], soup.a['class'])
+
+ #
+ # Generally speaking, tests below this point are more tests of
+ # Beautiful Soup than tests of the tree builders. But parsers are
+ # weird, so we run these tests separately for every tree builder
+ # to detect any differences between them.
+ #
+
+ def test_can_parse_unicode_document(self):
+ # A seemingly innocuous document... but it's in Unicode! And
+ # it contains characters that can't be represented in the
+ # encoding found in the declaration! The horror!
+ markup = u'<html><head><meta encoding="euc-jp"></head><body>Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!</body>'
+ soup = self.soup(markup)
+ self.assertEqual(u'Sacr\xe9 bleu!', soup.body.string)
+
+ def test_soupstrainer(self):
+ """Parsers should be able to work with SoupStrainers."""
+ strainer = SoupStrainer("b")
+ soup = self.soup("A <b>bold</b> <meta/> <i>statement</i>",
+ parse_only=strainer)
+ self.assertEqual(soup.decode(), "<b>bold</b>")
+
+ def test_single_quote_attribute_values_become_double_quotes(self):
+ self.assertSoupEquals("<foo attr='bar'></foo>",
+ '<foo attr="bar"></foo>')
+
+ def test_attribute_values_with_nested_quotes_are_left_alone(self):
+ text = """<foo attr='bar "brawls" happen'>a</foo>"""
+ self.assertSoupEquals(text)
+
+ def test_attribute_values_with_double_nested_quotes_get_quoted(self):
+ text = """<foo attr='bar "brawls" happen'>a</foo>"""
+ soup = self.soup(text)
+ soup.foo['attr'] = 'Brawls happen at "Bob\'s Bar"'
+ self.assertSoupEquals(
+ soup.foo.decode(),
+ """<foo attr="Brawls happen at &quot;Bob\'s Bar&quot;">a</foo>""")
+
+ def test_ampersand_in_attribute_value_gets_escaped(self):
+ self.assertSoupEquals('<this is="really messed up & stuff"></this>',
+ '<this is="really messed up &amp; stuff"></this>')
+
+ self.assertSoupEquals(
+ '<a href="http://example.org?a=1&b=2;3">foo</a>',
+ '<a href="http://example.org?a=1&amp;b=2;3">foo</a>')
+
+ def test_escaped_ampersand_in_attribute_value_is_left_alone(self):
+ self.assertSoupEquals('<a href="http://example.org?a=1&amp;b=2;3"></a>')
+
+ def test_entities_in_strings_converted_during_parsing(self):
+ # Both XML and HTML entities are converted to Unicode characters
+ # during parsing.
+ text = "<p>&lt;&lt;sacr&eacute;&#32;bleu!&gt;&gt;</p>"
+ expected = u"<p>&lt;&lt;sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!&gt;&gt;</p>"
+ self.assertSoupEquals(text, expected)
+
+ def test_smart_quotes_converted_on_the_way_in(self):
+ # Microsoft smart quotes are converted to Unicode characters during
+ # parsing.
+ quote = b"<p>\x91Foo\x92</p>"
+ soup = self.soup(quote)
+ self.assertEqual(
+ soup.p.string,
+ u"\N{LEFT SINGLE QUOTATION MARK}Foo\N{RIGHT SINGLE QUOTATION MARK}")
+
+ def test_non_breaking_spaces_converted_on_the_way_in(self):
+ soup = self.soup("<a>&nbsp;&nbsp;</a>")
+ self.assertEqual(soup.a.string, u"\N{NO-BREAK SPACE}" * 2)
+
+ def test_entities_converted_on_the_way_out(self):
+ text = "<p>&lt;&lt;sacr&eacute;&#32;bleu!&gt;&gt;</p>"
+ expected = u"<p>&lt;&lt;sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!&gt;&gt;</p>".encode("utf-8")
+ soup = self.soup(text)
+ self.assertEqual(soup.p.encode("utf-8"), expected)
+
+ def test_real_iso_latin_document(self):
+ # Smoke test of interrelated functionality, using an
+ # easy-to-understand document.
+
+ # Here it is in Unicode. Note that it claims to be in ISO-Latin-1.
+ unicode_html = u'<html><head><meta content="text/html; charset=ISO-Latin-1" http-equiv="Content-type"/></head><body><p>Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!</p></body></html>'
+
+ # That's because we're going to encode it into ISO-Latin-1, and use
+ # that to test.
+ iso_latin_html = unicode_html.encode("iso-8859-1")
+
+ # Parse the ISO-Latin-1 HTML.
+ soup = self.soup(iso_latin_html)
+ # Encode it to UTF-8.
+ result = soup.encode("utf-8")
+
+ # What do we expect the result to look like? Well, it would
+ # look like unicode_html, except that the META tag would say
+ # UTF-8 instead of ISO-Latin-1.
+ expected = unicode_html.replace("ISO-Latin-1", "utf-8")
+
+ # And, of course, it would be in UTF-8, not Unicode.
+ expected = expected.encode("utf-8")
+
+ # Ta-da!
+ self.assertEqual(result, expected)
+
+ def test_real_shift_jis_document(self):
+ # Smoke test to make sure the parser can handle a document in
+ # Shift-JIS encoding, without choking.
+ shift_jis_html = (
+ b'<html><head></head><body><pre>'
+ b'\x82\xb1\x82\xea\x82\xcdShift-JIS\x82\xc5\x83R\x81[\x83f'
+ b'\x83B\x83\x93\x83O\x82\xb3\x82\xea\x82\xbd\x93\xfa\x96{\x8c'
+ b'\xea\x82\xcc\x83t\x83@\x83C\x83\x8b\x82\xc5\x82\xb7\x81B'
+ b'</pre></body></html>')
+ unicode_html = shift_jis_html.decode("shift-jis")
+ soup = self.soup(unicode_html)
+
+ # Make sure the parse tree is correctly encoded to various
+ # encodings.
+ self.assertEqual(soup.encode("utf-8"), unicode_html.encode("utf-8"))
+ self.assertEqual(soup.encode("euc_jp"), unicode_html.encode("euc_jp"))
+
+ def test_real_hebrew_document(self):
+ # A real-world test to make sure we can convert ISO-8859-9 (a
+ # Hebrew encoding) to UTF-8.
+ hebrew_document = b'<html><head><title>Hebrew (ISO 8859-8) in Visual Directionality</title></head><body><h1>Hebrew (ISO 8859-8) in Visual Directionality</h1>\xed\xe5\xec\xf9</body></html>'
+ soup = self.soup(
+ hebrew_document, from_encoding="iso8859-8")
+ # Some tree builders call it iso8859-8, others call it iso-8859-9.
+ # That's not a difference we really care about.
+ assert soup.original_encoding in ('iso8859-8', 'iso-8859-8')
+ self.assertEqual(
+ soup.encode('utf-8'),
+ hebrew_document.decode("iso8859-8").encode("utf-8"))
+
+ def test_meta_tag_reflects_current_encoding(self):
+ # Here's the <meta> tag saying that a document is
+ # encoded in Shift-JIS.
+ meta_tag = ('<meta content="text/html; charset=x-sjis" '
+ 'http-equiv="Content-type"/>')
+
+ # Here's a document incorporating that meta tag.
+ shift_jis_html = (
+ '<html><head>\n%s\n'
+ '<meta http-equiv="Content-language" content="ja"/>'
+ '</head><body>Shift-JIS markup goes here.') % meta_tag
+ soup = self.soup(shift_jis_html)
+
+ # Parse the document, and the charset is seemingly unaffected.
+ parsed_meta = soup.find('meta', {'http-equiv': 'Content-type'})
+ content = parsed_meta['content']
+ self.assertEqual('text/html; charset=x-sjis', content)
+
+ # But that value is actually a ContentMetaAttributeValue object.
+ self.assertTrue(isinstance(content, ContentMetaAttributeValue))
+
+ # And it will take on a value that reflects its current
+ # encoding.
+ self.assertEqual('text/html; charset=utf8', content.encode("utf8"))
+
+ # For the rest of the story, see TestSubstitutions in
+ # test_tree.py.
+
+ def test_html5_style_meta_tag_reflects_current_encoding(self):
+ # Here's the <meta> tag saying that a document is
+ # encoded in Shift-JIS.
+ meta_tag = ('<meta id="encoding" charset="x-sjis" />')
+
+ # Here's a document incorporating that meta tag.
+ shift_jis_html = (
+ '<html><head>\n%s\n'
+ '<meta http-equiv="Content-language" content="ja"/>'
+ '</head><body>Shift-JIS markup goes here.') % meta_tag
+ soup = self.soup(shift_jis_html)
+
+ # Parse the document, and the charset is seemingly unaffected.
+ parsed_meta = soup.find('meta', id="encoding")
+ charset = parsed_meta['charset']
+ self.assertEqual('x-sjis', charset)
+
+ # But that value is actually a CharsetMetaAttributeValue object.
+ self.assertTrue(isinstance(charset, CharsetMetaAttributeValue))
+
+ # And it will take on a value that reflects its current
+ # encoding.
+ self.assertEqual('utf8', charset.encode("utf8"))
+
+ def test_python_specific_encodings_not_used_in_charset(self):
+ # You can encode an HTML document using a Python-specific
+ # encoding, but that encoding won't be mentioned _inside_ the
+ # resulting document. Instead, the document will appear to
+ # have no encoding.
+ for markup in [
+ b'<meta charset="utf8"></head>'
+ b'<meta id="encoding" charset="utf-8" />'
+ ]:
+ soup = self.soup(markup)
+ for encoding in PYTHON_SPECIFIC_ENCODINGS:
+ if encoding in (
+ u'idna', u'mbcs', u'oem', u'undefined',
+ u'string_escape', u'string-escape'
+ ):
+ # For one reason or another, these will raise an
+ # exception if we actually try to use them, so don't
+ # bother.
+ continue
+ encoded = soup.encode(encoding)
+ assert b'meta charset=""' in encoded
+ assert encoding.encode("ascii") not in encoded
+
+ def test_tag_with_no_attributes_can_have_attributes_added(self):
+ data = self.soup("<a>text</a>")
+ data.a['foo'] = 'bar'
+ self.assertEqual('<a foo="bar">text</a>', data.a.decode())
+
+ def test_closing_tag_with_no_opening_tag(self):
+ # Without BeautifulSoup.open_tag_counter, the </span> tag will
+ # cause _popToTag to be called over and over again as we look
+ # for a <span> tag that wasn't there. The result is that 'text2'
+ # will show up outside the body of the document.
+ soup = self.soup("<body><div><p>text1</p></span>text2</div></body>")
+ self.assertEqual(
+ "<body><div><p>text1</p>text2</div></body>", soup.body.decode()
+ )
+
+ def test_worst_case(self):
+ """Test the worst case (currently) for linking issues."""
+
+ soup = self.soup(BAD_DOCUMENT)
+ self.linkage_validator(soup)
+
+
+class XMLTreeBuilderSmokeTest(object):
+
+ def test_pickle_and_unpickle_identity(self):
+ # Pickling a tree, then unpickling it, yields a tree identical
+ # to the original.
+ tree = self.soup("<a><b>foo</a>")
+ dumped = pickle.dumps(tree, 2)
+ loaded = pickle.loads(dumped)
+ self.assertEqual(loaded.__class__, BeautifulSoup)
+ self.assertEqual(loaded.decode(), tree.decode())
+
+ def test_docstring_generated(self):
+ soup = self.soup("<root/>")
+ self.assertEqual(
+ soup.encode(), b'<?xml version="1.0" encoding="utf-8"?>\n<root/>')
+
+ def test_xml_declaration(self):
+ markup = b"""<?xml version="1.0" encoding="utf8"?>\n<foo/>"""
+ soup = self.soup(markup)
+ self.assertEqual(markup, soup.encode("utf8"))
+
+ def test_python_specific_encodings_not_used_in_xml_declaration(self):
+ # You can encode an XML document using a Python-specific
+ # encoding, but that encoding won't be mentioned _inside_ the
+ # resulting document.
+ markup = b"""<?xml version="1.0"?>\n<foo/>"""
+ soup = self.soup(markup)
+ for encoding in PYTHON_SPECIFIC_ENCODINGS:
+ if encoding in (
+ u'idna', u'mbcs', u'oem', u'undefined',
+ u'string_escape', u'string-escape'
+ ):
+ # For one reason or another, these will raise an
+ # exception if we actually try to use them, so don't
+ # bother.
+ continue
+ encoded = soup.encode(encoding)
+ assert b'<?xml version="1.0"?>' in encoded
+ assert encoding.encode("ascii") not in encoded
+
+ def test_processing_instruction(self):
+ markup = b"""<?xml version="1.0" encoding="utf8"?>\n<?PITarget PIContent?>"""
+ soup = self.soup(markup)
+ self.assertEqual(markup, soup.encode("utf8"))
+
+ def test_real_xhtml_document(self):
+ """A real XHTML document should come out *exactly* the same as it went in."""
+ markup = b"""<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title>Hello.</title></head>
+<body>Goodbye.</body>
+</html>"""
+ soup = self.soup(markup)
+ self.assertEqual(
+ soup.encode("utf-8"), markup)
+
+ def test_nested_namespaces(self):
+ doc = b"""<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<parent xmlns="http://ns1/">
+<child xmlns="http://ns2/" xmlns:ns3="http://ns3/">
+<grandchild ns3:attr="value" xmlns="http://ns4/"/>
+</child>
+</parent>"""
+ soup = self.soup(doc)
+ self.assertEqual(doc, soup.encode())
+
+ def test_formatter_processes_script_tag_for_xml_documents(self):
+ doc = """
+ <script type="text/javascript">
+ </script>
+"""
+ soup = BeautifulSoup(doc, "lxml-xml")
+ # lxml would have stripped this while parsing, but we can add
+ # it later.
+ soup.script.string = 'console.log("< < hey > > ");'
+ encoded = soup.encode()
+ self.assertTrue(b"&lt; &lt; hey &gt; &gt;" in encoded)
+
+ def test_can_parse_unicode_document(self):
+ markup = u'<?xml version="1.0" encoding="euc-jp"><root>Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!</root>'
+ soup = self.soup(markup)
+ self.assertEqual(u'Sacr\xe9 bleu!', soup.root.string)
+
+ def test_popping_namespaced_tag(self):
+ markup = '<rss xmlns:dc="foo"><dc:creator>b</dc:creator><dc:date>2012-07-02T20:33:42Z</dc:date><dc:rights>c</dc:rights><image>d</image></rss>'
+ soup = self.soup(markup)
+ self.assertEqual(
+ unicode(soup.rss), markup)
+
+ def test_docstring_includes_correct_encoding(self):
+ soup = self.soup("<root/>")
+ self.assertEqual(
+ soup.encode("latin1"),
+ b'<?xml version="1.0" encoding="latin1"?>\n<root/>')
+
+ def test_large_xml_document(self):
+ """A large XML document should come out the same as it went in."""
+ markup = (b'<?xml version="1.0" encoding="utf-8"?>\n<root>'
+ + b'0' * (2**12)
+ + b'</root>')
+ soup = self.soup(markup)
+ self.assertEqual(soup.encode("utf-8"), markup)
+
+
+ def test_tags_are_empty_element_if_and_only_if_they_are_empty(self):
+ self.assertSoupEquals("<p>", "<p/>")
+ self.assertSoupEquals("<p>foo</p>")
+
+ def test_namespaces_are_preserved(self):
+ markup = '<root xmlns:a="http://example.com/" xmlns:b="http://example.net/"><a:foo>This tag is in the a namespace</a:foo><b:foo>This tag is in the b namespace</b:foo></root>'
+ soup = self.soup(markup)
+ root = soup.root
+ self.assertEqual("http://example.com/", root['xmlns:a'])
+ self.assertEqual("http://example.net/", root['xmlns:b'])
+
+ def test_closing_namespaced_tag(self):
+ markup = '<p xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>20010504</dc:date></p>'
+ soup = self.soup(markup)
+ self.assertEqual(unicode(soup.p), markup)
+
+ def test_namespaced_attributes(self):
+ markup = '<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><bar xsi:schemaLocation="http://www.example.com"/></foo>'
+ soup = self.soup(markup)
+ self.assertEqual(unicode(soup.foo), markup)
+
+ def test_namespaced_attributes_xml_namespace(self):
+ markup = '<foo xml:lang="fr">bar</foo>'
+ soup = self.soup(markup)
+ self.assertEqual(unicode(soup.foo), markup)
+
+ def test_find_by_prefixed_name(self):
+ doc = """<?xml version="1.0" encoding="utf-8"?>
+<Document xmlns="http://example.com/ns0"
+ xmlns:ns1="http://example.com/ns1"
+ xmlns:ns2="http://example.com/ns2"
+ <ns1:tag>foo</ns1:tag>
+ <ns1:tag>bar</ns1:tag>
+ <ns2:tag key="value">baz</ns2:tag>
+</Document>
+"""
+ soup = self.soup(doc)
+
+ # There are three <tag> tags.
+ self.assertEqual(3, len(soup.find_all('tag')))
+
+ # But two of them are ns1:tag and one of them is ns2:tag.
+ self.assertEqual(2, len(soup.find_all('ns1:tag')))
+ self.assertEqual(1, len(soup.find_all('ns2:tag')))
+
+ self.assertEqual(1, len(soup.find_all('ns2:tag', key='value')))
+ self.assertEqual(3, len(soup.find_all(['ns1:tag', 'ns2:tag'])))
+
+ def test_copy_tag_preserves_namespace(self):
+ xml = """<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<w:document xmlns:w="http://example.com/ns0"/>"""
+
+ soup = self.soup(xml)
+ tag = soup.document
+ duplicate = copy.copy(tag)
+
+ # The two tags have the same namespace prefix.
+ self.assertEqual(tag.prefix, duplicate.prefix)
+
+ def test_worst_case(self):
+ """Test the worst case (currently) for linking issues."""
+
+ soup = self.soup(BAD_DOCUMENT)
+ self.linkage_validator(soup)
+
+
+class HTML5TreeBuilderSmokeTest(HTMLTreeBuilderSmokeTest):
+ """Smoke test for a tree builder that supports HTML5."""
+
+ def test_real_xhtml_document(self):
+ # Since XHTML is not HTML5, HTML5 parsers are not tested to handle
+ # XHTML documents in any particular way.
+ pass
+
+ def test_html_tags_have_namespace(self):
+ markup = "<a>"
+ soup = self.soup(markup)
+ self.assertEqual("http://www.w3.org/1999/xhtml", soup.a.namespace)
+
+ def test_svg_tags_have_namespace(self):
+ markup = '<svg><circle/></svg>'
+ soup = self.soup(markup)
+ namespace = "http://www.w3.org/2000/svg"
+ self.assertEqual(namespace, soup.svg.namespace)
+ self.assertEqual(namespace, soup.circle.namespace)
+
+
+ def test_mathml_tags_have_namespace(self):
+ markup = '<math><msqrt>5</msqrt></math>'
+ soup = self.soup(markup)
+ namespace = 'http://www.w3.org/1998/Math/MathML'
+ self.assertEqual(namespace, soup.math.namespace)
+ self.assertEqual(namespace, soup.msqrt.namespace)
+
+ def test_xml_declaration_becomes_comment(self):
+ markup = '<?xml version="1.0" encoding="utf-8"?><html></html>'
+ soup = self.soup(markup)
+ self.assertTrue(isinstance(soup.contents[0], Comment))
+ self.assertEqual(soup.contents[0], '?xml version="1.0" encoding="utf-8"?')
+ self.assertEqual("html", soup.contents[0].next_element.name)
+
+def skipIf(condition, reason):
+ def nothing(test, *args, **kwargs):
+ return None
+
+ def decorator(test_item):
+ if condition:
+ return nothing
+ else:
+ return test_item
+
+ return decorator
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/convert-py3k b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/convert-py3k
new file mode 100755
index 00000000000..05fab53ca27
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/convert-py3k
@@ -0,0 +1,16 @@
+#!/bin/sh
+#
+# The Python 2 source is the definitive source. This script uses 2to3-3.2 to
+# create a new python3/bs4 source tree that works under Python 3.
+#
+# See README.txt to see how to run the test suite after conversion.
+echo "About to destroy and rebuild the py3k/bs4 directory."
+echo "If you've got stuff in there, Ctrl-C out of this script or answer 'n'."
+mkdir -p py3k
+rm -rfI py3k/bs4
+cp -r bs4/ py3k/
+2to3 -w py3k
+echo ""
+echo "OK, conversion is done."
+echo "Now running the unit tests."
+(cd py3k && python3 -m unittest discover -s bs4) \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ptbr/Makefile b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ptbr/Makefile
new file mode 100644
index 00000000000..8c833d2cedb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ptbr/Makefile
@@ -0,0 +1,130 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS =
+SPHINXBUILD = sphinx-build
+PAPER =
+BUILDDIR = build
+
+# Internal variables.
+PAPEROPT_a4 = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
+
+help:
+ @echo "Please use \`make <target>' where <target> is one of"
+ @echo " html to make standalone HTML files"
+ @echo " dirhtml to make HTML files named index.html in directories"
+ @echo " singlehtml to make a single large HTML file"
+ @echo " pickle to make pickle files"
+ @echo " json to make JSON files"
+ @echo " htmlhelp to make HTML files and a HTML help project"
+ @echo " qthelp to make HTML files and a qthelp project"
+ @echo " devhelp to make HTML files and a Devhelp project"
+ @echo " epub to make an epub"
+ @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+ @echo " latexpdf to make LaTeX files and run them through pdflatex"
+ @echo " text to make text files"
+ @echo " man to make manual pages"
+ @echo " changes to make an overview of all changed/added/deprecated items"
+ @echo " linkcheck to check all external links for integrity"
+ @echo " doctest to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+ -rm -rf $(BUILDDIR)/*
+
+html:
+ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+ $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+ $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+ @echo
+ @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+ $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+ @echo
+ @echo "Build finished; now you can process the pickle files."
+
+json:
+ $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+ @echo
+ @echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+ $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+ @echo
+ @echo "Build finished; now you can run HTML Help Workshop with the" \
+ ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+ $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+ @echo
+ @echo "Build finished; now you can run "qcollectiongenerator" with the" \
+ ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+ @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/BeautifulSoup.qhcp"
+ @echo "To view the help file:"
+ @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/BeautifulSoup.qhc"
+
+devhelp:
+ $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+ @echo
+ @echo "Build finished."
+ @echo "To view the help file:"
+ @echo "# mkdir -p $$HOME/.local/share/devhelp/BeautifulSoup"
+ @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/BeautifulSoup"
+ @echo "# devhelp"
+
+epub:
+ $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+ @echo
+ @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo
+ @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+ @echo "Run \`make' in that directory to run these through (pdf)latex" \
+ "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo "Running LaTeX files through pdflatex..."
+ make -C $(BUILDDIR)/latex all-pdf
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+ $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+ @echo
+ @echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+ $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+ @echo
+ @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+changes:
+ $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+ @echo
+ @echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+ $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+ @echo
+ @echo "Link check complete; look for any errors in the above output " \
+ "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+ $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+ @echo "Testing of doctests in the sources finished, look at the " \
+ "results in $(BUILDDIR)/doctest/output.txt."
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ptbr/source/6.1.jpg b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ptbr/source/6.1.jpg
new file mode 100644
index 00000000000..97014f0ec04
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ptbr/source/6.1.jpg
Binary files differ
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ptbr/source/conf.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ptbr/source/conf.py
new file mode 100644
index 00000000000..cd679b5cb25
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ptbr/source/conf.py
@@ -0,0 +1,256 @@
+# -*- coding: utf-8 -*-
+#
+# Beautiful Soup documentation build configuration file, created by
+# sphinx-quickstart on Thu Jan 26 11:22:55 2012.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration -----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = []
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'Beautiful Soup'
+copyright = u'2004-2015, Leonard Richardson'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '4'
+# The full version, including alpha/beta/rc tags.
+release = '4.4.0'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = []
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+html_theme = 'default'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further. For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar. Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'BeautifulSoupdoc'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+ ('index', 'BeautifulSoup.tex', u'Beautiful Soup Documentation',
+ u'Leonard Richardson', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output --------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+ ('index', 'beautifulsoup', u'Beautiful Soup Documentation',
+ [u'Leonard Richardson'], 1)
+]
+
+
+# -- Options for Epub output ---------------------------------------------------
+
+# Bibliographic Dublin Core info.
+epub_title = u'Beautiful Soup'
+epub_author = u'Leonard Richardson'
+epub_publisher = u'Leonard Richardson'
+epub_copyright = u'2012, Leonard Richardson'
+
+# The language of the text. It defaults to the language option
+# or en if the language is not set.
+#epub_language = ''
+
+# The scheme of the identifier. Typical schemes are ISBN or URL.
+#epub_scheme = ''
+
+# The unique identifier of the text. This can be a ISBN number
+# or the project homepage.
+#epub_identifier = ''
+
+# A unique identification for the text.
+#epub_uid = ''
+
+# HTML files that should be inserted before the pages created by sphinx.
+# The format is a list of tuples containing the path and title.
+#epub_pre_files = []
+
+# HTML files shat should be inserted after the pages created by sphinx.
+# The format is a list of tuples containing the path and title.
+#epub_post_files = []
+
+# A list of files that should not be packed into the epub file.
+#epub_exclude_files = []
+
+# The depth of the table of contents in toc.ncx.
+#epub_tocdepth = 3
+
+# Allow duplicate toc entries.
+#epub_tocdup = True
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ptbr/source/index.rst b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ptbr/source/index.rst
new file mode 100644
index 00000000000..2b6a5f9324e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ptbr/source/index.rst
@@ -0,0 +1,3266 @@
+Documentação Beautiful Soup
+============================
+
+.. image:: 6.1.jpg
+ :align: right
+ :alt: "O Lacaio-Peixe começou tirando debaixo do braço uma grande carta, quase tão grande quanto ele mesmo."
+
+
+`Beautiful Soup <http://www.crummy.com/software/BeautifulSoup/>`_ é uma biblioteca
+Python de extração de dados de arquivos HTML e XML. Ela funciona com o seu interpretador (parser) favorito
+a fim de prover maneiras mais intuitivas de navegar, buscar e modificar uma árvore de análise (parse tree).
+Ela geralmente economiza horas ou dias de trabalho de programadores ao redor do mundo.
+
+Estas instruções ilustram as principais funcionalidades do Beautiful Soup 4
+com exemplos. Mostro para o que a biblioteca é indicada, como funciona,
+como se usa e como fazer aquilo que você quer e o que fazer quando ela frustra suas
+expectativas.
+
+Os exemplos nesta documentação devem funcionar da mesma maneira em Python 2.7 e Python 3.2.
+
+`Você pode estar procurando pela documentação do Beautiful Soup 3
+<http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html>`_.
+Se está, informo que o Beautiful Soup 3 não está mais sendo desenvolvido,
+e que o Beautiful Soup 4 é o recomendado para todos os novos projetos.
+Se você quiser saber as diferenças entre as versões 3 e 4, veja `Portabilidade de código para BS4`_.
+
+Esta documentação foi traduzida para outros idiomas pelos usuários do Beautiful Soup:
+
+* `这篇文档当然还有中文版. <https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/>`_
+* このページは日本語で利用できます(`外部リンク <http://kondou.com/BS4/>`_)
+* `이 문서는 한국어 번역도 가능합니다. <https://www.crummy.com/software/BeautifulSoup/bs4/doc.ko/>`_
+* `Эта документация доступна на русском языке. <https://www.crummy.com/software/BeautifulSoup/bs4/doc.ru/>`_
+
+Como conseguir ajuda:
+---------------------
+
+Se você tem perguntas sobre o Beautiful Soup ou está com dificuldades,
+`envie uma mensagem para nosso grupo de discussão
+<https://groups.google.com/forum/?fromgroups#!forum/beautifulsoup>`_. Se o seu
+problema envolve a interpretação de um documento HTML, não esqueça de mencionar
+:ref:`o que a função diagnose() diz <diagnose>` sobre seu documento.
+
+Início Rápido
+=============
+
+Este é o HTML que usarei como exemplo ao longo deste documento
+É um trecho de "Alice no País das Maravilhas"::
+
+ html_doc = """
+ <html><head><title>The Dormouse's story</title></head>
+ <body>
+ <p class="title"><b>The Dormouse's story</b></p>
+
+ <p class="story">Once upon a time there were three little sisters; and their names were
+ <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
+ <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
+ <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
+ and they lived at the bottom of a well.</p>
+
+ <p class="story">...</p>
+ """
+
+Executando o arquivo "three sisters" através do Beautiful Soup, ele nos
+retorna um objeto ``BeautifulSoup``, que apresenta o documento como uma estrutura
+de dados aninhada::
+
+ from bs4 import BeautifulSoup
+ soup = BeautifulSoup(html_doc, 'html.parser')
+
+ print(soup.prettify())
+ # <html>
+ # <head>
+ # <title>
+ # The Dormouse's story
+ # </title>
+ # </head>
+ # <body>
+ # <p class="title">
+ # <b>
+ # The Dormouse's story
+ # </b>
+ # </p>
+ # <p class="story">
+ # Once upon a time there were three little sisters; and their names were
+ # <a class="sister" href="http://example.com/elsie" id="link1">
+ # Elsie
+ # </a>
+ # ,
+ # <a class="sister" href="http://example.com/lacie" id="link2">
+ # Lacie
+ # </a>
+ # and
+ # <a class="sister" href="http://example.com/tillie" id="link2">
+ # Tillie
+ # </a>
+ # ; and they lived at the bottom of a well.
+ # </p>
+ # <p class="story">
+ # ...
+ # </p>
+ # </body>
+ # </html>
+
+Abaixo verificamos algumas maneiras simples de navegar na estrutura::
+
+ soup.title
+ # <title>The Dormouse's story</title>
+
+ soup.title.name
+ # u'title'
+
+ soup.title.string
+ # u'The Dormouse's story'
+
+ soup.title.parent.name
+ # u'head'
+
+ soup.p
+ # <p class="title"><b>The Dormouse's story</b></p>
+
+ soup.p['class']
+ # u'title'
+
+ soup.a
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+ soup.find_all('a')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.find(id="link3")
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
+
+Uma tarefa comum é extratir todas as URLs encontradas nas tags <a> de uma página::
+
+ for link in soup.find_all('a'):
+ print(link.get('href'))
+ # http://example.com/elsie
+ # http://example.com/lacie
+ # http://example.com/tillie
+
+Outra tarefa comum é extrair todo o texto de uma página::
+
+ print(soup.get_text())
+ # The Dormouse's story
+ #
+ # The Dormouse's story
+ #
+ # Once upon a time there were three little sisters; and their names were
+ # Elsie,
+ # Lacie and
+ # Tillie;
+ # and they lived at the bottom of a well.
+ #
+ # ...
+
+Isso se parece com o que você precisa? Então vá em frente!
+
+Instalando o Beautiful Soup
+===========================
+
+Se você está usando uma versão recente das distribuições Linux Debian ou Ubuntu,
+você pode instalar o Beautiful Soup facilmente utilizando o gerenciador de pacotes
+
+:kbd:`$ apt-get install python-bs4` (for Python 2)
+
+:kbd:`$ apt-get install python3-bs4` (for Python 3)
+
+O Beautiful Soup 4 também está publicado no PyPi. Portanto, se
+você não conseguir instalá-lo através de seu gerenciador de pacotes, você
+pode fazer isso com ``easy_install`` ou ``pip``. O nome do pacote é ``beautifulsoup4``,
+e o mesmo pacote é válido tanto para Python 2 quanto Python 3. Tenha certeza de utilizar
+a versão correta de ``pip`` ou ``easy_install`` para sua versão do Python (estarão
+nomeados como ``pip3`` ou ``easy_install3`` ,respectivamente, se você estiver usando Python 3).
+
+
+:kbd:`$ easy_install beautifulsoup4`
+
+:kbd:`$ pip install beautifulsoup4`
+
+(O pacote ``BeautifulSoup`` provavelmente `não` é o que você quer. Esta
+é a versão anterior, `Beautiful Soup 3`_. Muitos softwares utilizam
+BS3, por isso ele ainda está disponível, mas se você está criando algo novo,
+você deve instalar o ``beautifulsoup4``.)
+
+Se você não possui o ``easy_install`` ou ``pip`` instalados, você pode fazer
+o download através do tarball do arquivo fonte do Beautiful Soup 4
+<http://www.crummy.com/software/BeautifulSoup/download/4.x/>`_ e
+instalar através do ``setup.py``.
+
+:kbd:`$ python setup.py install`
+
+Se tudo isso falhar, a licença do Beautiful Soup lhe permite empacotar
+toda a biblioteca em sua aplicação. Você pode fazer o download do arquivo
+tarball, copiar o diretório ``bs4`` do código-fonte para sua aplicação e
+utilizar o Beautiful Soup sem nenhum processo de instalação.
+
+Eu utilizo Python 2.7 e Python 3.2 para desenvolver o Beautiful Soup,
+mas ele também funcionará com outras versões recentes.
+
+Problemas após a instalação
+---------------------------
+
+O Beautiful Soup é empacotado em Python 2. Quando você o instala utilizando
+Python 3 ele é automaticamente convertido para esta versão. Se você não instalar o pacote, o
+código não será convertido. Também foi relatado versões erradas sendo instaladas em
+máquinas Windows.
+
+Se você receber um ``ImportError`` "No module named HTMLParser", seu problema
+é que você está utilizando o formato de código Python 2 sob Python 3.
+
+Se você receber um ``ImportError`` "No module named html.parser", seu problema
+é que você está utilizando o formato de código Python 3 sob Python 2.
+
+Em ambos os casos, sua melhor opção é remover completamente a
+instalação do Beautiful Soup do seu sistema (incluindo qualquer diretório
+criado quando o tarball foi descompactado) e realizar a instalação novamente.
+
+Se você receber um ``SyntaxError`` "Invalid syntax" na linha
+``ROOT_TAG_NAME = u'[document]'``, você terá que converter o Python 2
+em Python 3. Você pode fazer isso instalando o pacote:
+
+:kbd:`$ python3 setup.py install`
+
+ou manualmente executando o script de conversão ``2to3`` no
+diretório ``bs4``:
+
+:kbd:`$ 2to3-3.2 -w bs4`
+
+.. _parser-installation:
+
+
+Instalando um interpretador (parser)
+------------------------------------
+
+
+O Beautiful Soup não só suporta o parser HTML incluído na biblioteca
+padrão do Python como também inúmeros parsers de terceiros.
+Um deles é o `parser lxml <http://lxml.de/>`_. Dependendo de sua configuração,
+você podera instalar o lxml com algum dos seguintes comandos:
+
+:kbd:`$ apt-get install python-lxml`
+
+:kbd:`$ easy_install lxml`
+
+:kbd:`$ pip install lxml`
+
+Outra alternativa é o parser `html5lib
+<http://code.google.com/p/html5lib/>`_ do Python puro, o qual analisa o HTML
+da mesma maneira que o navegador o faz. Dependendo de sua configuração,
+você podera instalar o html5lib com algum dos seguintes comandos:
+
+:kbd:`$ apt-get install python-html5lib`
+
+:kbd:`$ easy_install html5lib`
+
+:kbd:`$ pip install html5lib`
+
+Esta tabela resume as vantagens e desvantagens de cada parser:-
+
++----------------------+--------------------------------------------+--------------------------------+--------------------------+
+| Parser | Uso Padrão | Vantagens | Desvantagens |
++----------------------+--------------------------------------------+--------------------------------+--------------------------+
+| html.parser (puro) | ``BeautifulSoup(markup, "html.parser")`` | * Baterias inclusas | * Não tão rápido quanto |
+| | | * Velocidade Decente | lxml, menos leniente |
+| | | * Leniente (Python 2.7.3 | que html5lib. |
+| | | e 3.2.) | |
++----------------------+--------------------------------------------+--------------------------------+--------------------------+
+| HTML (lxml) | ``BeautifulSoup(markup, "lxml")`` | * Muito rápido | * Dependencia externa de |
+| | | * Leniente | C |
++----------------------+--------------------------------------------+--------------------------------+--------------------------+
+| XML (lxml) | ``BeautifulSoup(markup, "lxml-xml")`` | * Muito rápido | * Dependência externa de |
+| | ``BeautifulSoup(markup, "xml")`` | * O único parser XML atualmente| C |
+| | | suportado | |
++----------------------+--------------------------------------------+--------------------------------+--------------------------+
+| html5lib | ``BeautifulSoup(markup, "html5lib")`` | * Extremamente leniente | * Muito lento |
+| | | * Analisa as páginas da mesma | * Dependência externa de |
+| | | maneira que o navegador o faz| Python |
+| | | * Cria HTML5 válidos | |
++----------------------+--------------------------------------------+--------------------------------+--------------------------+
+
+Se for possível recomendo que você instale e utilize o lxml pelo desempenho.
+Se você está utilizando o Python 2 anterior a 2.7.3 ou uma versão do Python 3
+anterior a 3.2.2, é `essencial` que você instale o lxml ou o html5lib. O parser
+HTML nativo do Python não é muito bom para versões mais antigas.
+
+Note que se um documento é inválido, diferentes parsers irão gerar
+diferentes árvores BeautifulSoup para isso. Veja
+:ref:`Diferenças entre os interpretadores (parsers) <differences-between-parsers>`
+para detalhes.
+
+
+Criando a "Sopa"
+================
+
+Para analisar um documento, passe-o como argumento dentro de um construtor ``BeautifulSoup``.
+Você pode passar este argumento como uma string ou manipulador da função open()::
+
+ from bs4 import BeautifulSoup
+
+ with open("index.html") as fp:
+ soup = BeautifulSoup(fp)
+
+ soup = BeautifulSoup("<html>data</html>")
+
+Primeiro, o documento é convertido para Unicode e as entidades HTML
+são convertidas para caracteres Unicode::
+
+ BeautifulSoup("Sacr&eacute; bleu!")
+ <html><head></head><body>Sacré bleu!</body></html>
+
+O Beautiful Soup então interpreta o documento usando o melhor parser disponível.
+Ele irá utilizar um parser HTML ao menos que você indique a ele que utilize um
+parser XML. (Veja `Analisando um XML`_.)
+
+Tipos de objetos
+================
+
+O Beautiful Soup transforma um documento HTML complexo em uma complexa árvore de objetos Python.
+Mas você terá apenas que lidar com quatro `tipos` de objetos: ``Tag``, ``NavigableString``, ``BeautifulSoup``,
+e ``Comment``.
+
+.. _Tag:
+
+``Tag``
+-------
+
+Um objeto ``Tag`` corresponde a uma tag XML ou HTML do documento original::
+
+ soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
+ tag = soup.b
+ type(tag)
+ # <class 'bs4.element.Tag'>
+
+As tags possuem muitos atributos e métodos que eu falarei mais sobre em
+`Navegando pela árvore`_ e `Buscando na árvore`_. Por agora, as características
+mais importantes da tag são seu nome e atributos.
+
+Nome
+^^^^
+
+Toda tag possui um nome, acessível através de ``.name``::
+
+ tag.name
+ # u'b'
+
+Se você mudar o nome de uma tag, a alteração será refletida em qualquer HTML gerado pelo
+Beautiful Soup::
+
+ tag.name = "blockquote"
+ tag
+ # <blockquote class="boldest">Extremely bold</blockquote>
+
+Atributos
+^^^^^^^^^^
+Uma tag pode ter inúmeros atributos. A tag ``<b id="boldest">``
+possui um atributo "id" que possui o valor "boldest". Você pode
+acessar um atributo de uma tag tratando-a como um dicionário::
+
+ tag['id']
+ # u'boldest'
+
+Você pode acessar este dicionário diretamente através de ``.attrs``::
+
+ tag.attrs
+ # {u'id': 'boldest'}
+
+Você pode adicionar, remover ou modificar os atributos de uma tag. Novamente, isso pode
+ser feito tratando a tag como um dicionário::
+
+ tag['id'] = 'verybold'
+ tag['another-attribute'] = 1
+ tag
+ # <b another-attribute="1" id="verybold"></b>
+
+ del tag['id']
+ del tag['another-attribute']
+ tag
+ # <b></b>
+
+ tag['id']
+ # KeyError: 'id'
+ print(tag.get('id'))
+ # None
+
+.. _multivalue:
+
+Atributos com múltiplos valores
+&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
+
+O HTML 4 define alguns atributos que podem ter múltiplos valores. O HTML 5
+removeu alguns deles, mas definiu alguns novos. O atributo mais comum
+que pode receber múltiplos valores é o ``class`` (ou seja, a tag pode ter mais de uma classe CSS).
+Outros são ``rel``, ``rev``, ``accept-charset``, ``headers``, e ``accesskey``.
+O Beautiful Soup apresenta o(s) valor(es) de um atributo deste tipo como uma lista::
+
+ css_soup = BeautifulSoup('<p class="body"></p>')
+ css_soup.p['class']
+ # ["body"]
+
+ css_soup = BeautifulSoup('<p class="body strikeout"></p>')
+ css_soup.p['class']
+ # ["body", "strikeout"]
+
+Se um atributo possui mais de um valor, mas não é um atributo
+que aceita múltiplos valores conforme definido por qualquer versão do
+padrão HTML, o Beautiful Soup retornará como um valor único::
+
+ id_soup = BeautifulSoup('<p id="my id"></p>')
+ id_soup.p['id']
+ # 'my id'
+
+Quando a tag é transformada novamente em string, os valores do atributo múltiplo
+são consolidados::
+
+ rel_soup = BeautifulSoup('<p>Back to the <a rel="index">homepage</a></p>')
+ rel_soup.a['rel']
+ # ['index']
+ rel_soup.a['rel'] = ['index', 'contents']
+ print(rel_soup.p)
+ # <p>Back to the <a rel="index contents">homepage</a></p>
+
+Você pode desabilitar esta opção passando ``multi_valued_attributes=None`` como argumento
+dentro do construtor ``BeautifulSoup`` ::
+
+ no_list_soup = BeautifulSoup('<p class="body strikeout"></p>', 'html', multi_valued_attributes=None)
+ no_list_soup.p['class']
+ # u'body strikeout'
+
+Você pode utilizar ```get_attribute_list`` para retornar um valor no formato de lista, seja um atributo de
+múltiplos valores ou não::
+
+ id_soup.p.get_attribute_list('id')
+ # ["my id"]
+
+Se você analisar um documento como XML, nenhum atributo será tratado como de múltiplos valores::
+
+ xml_soup = BeautifulSoup('<p class="body strikeout"></p>', 'xml')
+ xml_soup.p['class']
+ # u'body strikeout'
+
+Novamente, você pode configurar isto usando o argumento ``multi_valued_attributes``::
+
+ class_is_multi= { '*' : 'class'}
+ xml_soup = BeautifulSoup('<p class="body strikeout"></p>', 'xml', multi_valued_attributes=class_is_multi)
+ xml_soup.p['class']
+ # [u'body', u'strikeout']
+
+Você provavelmente não precisará fazer isso, mas se fizer, use os padrões como guia.
+Eles implementam as regras descritas na especificação do HTML::
+
+ from bs4.builder import builder_registry
+ builder_registry.lookup('html').DEFAULT_CDATA_LIST_ATTRIBUTES
+
+
+``NavigableString``
+-------------------
+
+Uma string corresponde a um texto dentro de uma tag.
+O Beautiful Soup usa a classe ``NavigableString`` para armazenar este texto::
+
+ tag.string
+ # u'Extremely bold'
+ type(tag.string)
+ # <class 'bs4.element.NavigableString'>
+
+Uma ``NavigableString`` é como uma string Unicode do Python, exceto
+que ela também suporta algumas características descritas em `Navegando pela árvore`_
+e `Buscando na árvore`_. Você pode converter um
+``NavigableString`` em uma string Unicode utilizando ``unicode()``::
+
+ unicode_string = unicode(tag.string)
+ unicode_string
+ # u'Extremely bold'
+ type(unicode_string)
+ # <type 'unicode'>
+
+Você não pode editar uma string "in place", mas você pode substituir
+uma string por outra usando :ref:`replace_with()`::
+
+ tag.string.replace_with("No longer bold")
+ tag
+ # <blockquote>No longer bold</blockquote>
+
+``NavigableString`` suporta a maior parte das características descritas em
+`Navegando pela árvore`_ e `Buscando na árvore`_, mas não todas elas.
+Em particular, desde que uma string não pode conter de tudo (da maneira que
+uma tag pode conter uma string ou outra tag), as strings não suportam os
+atributos ``.contents`` ou ``.string`` ou o método ``find()``.
+
+Se você quer utilizar uma ``NavigableString`` fora do Beautiful Soup,
+você deve chamar o ``unicode()`` para transformá-la em uma string Unicode Python
+padrão. Se você não fizer isso, sua string irá carregar uma referência de toda sua
+árvore Beautiful Soup, mesmo que você já não esteja mais usando ela, o que é um grande
+desperdício de memória.
+
+``BeautifulSoup``
+-----------------
+
+O objeto ``BeautifulSoup`` em si representa o documento como um todo.
+Para maioria dos propósitos, você pode tratá-lo como um objeto :ref:`Tag`.
+Isso significa que irá suportar a maioria dos métodos descritos em
+`Navegando pela árvore`_ e `Buscando na árvore`_.
+
+Sabendo que o objeto ``BeautifulSoup`` não corresponde a uma tag
+HTML ou XML propriamente dita, ele não tem nome e nem atributos. Mas em alguns
+casos é útil observar seu ``.name``; então, foi dado o especial
+``.name`` "[document]"::
+
+ soup.name
+ # u'[document]'
+
+Comentários e outras strings especiais
+--------------------------------------
+
+``Tag``, ``NavigableString``, e ``BeautifulSoup`` abrangem quase
+tudo o que você encontrará em um arquivo HTML ou XML, mas há alguns
+pontos faltando. O único deles que você provavelmente precisará se preocupar
+é o comentário::
+
+ markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>"
+ soup = BeautifulSoup(markup)
+ comment = soup.b.string
+ type(comment)
+ # <class 'bs4.element.Comment'>
+
+O objeto ``Comment`` é apenas um tipo especial de ``NavigableString``::
+
+ comment
+ # u'Hey, buddy. Want to buy a used parser'
+
+Mas quando aparece como parte de um documento HTML, um ``Comment`` é
+exibido com uma formatação especial::
+
+ print(soup.b.prettify())
+ # <b>
+ # <!--Hey, buddy. Want to buy a used parser?-->
+ # </b>
+
+O Beautiful Soup define classes para qualquer outra coisa que possa
+aparecer em um documento XML: ``CData``, ``ProcessingInstruction``,
+``Declaration`` e ``Doctype``. Assim como ``Comment``, estas classes
+são subclasses de ``NavigableString`` que adicionam algo a string.
+Aqui está um exemplo que substitui o comentário por um bloco CDATA::
+
+ from bs4 import CData
+ cdata = CData("A CDATA block")
+ comment.replace_with(cdata)
+
+ print(soup.b.prettify())
+ # <b>
+ # <![CDATA[A CDATA block]]>
+ # </b>
+
+
+Navegando pela árvore
+=====================
+
+Aqui está o documento HTML "Three sisters" novamente::
+
+ html_doc = """
+ <html><head><title>The Dormouse's story</title></head>
+ <body>
+ <p class="title"><b>The Dormouse's story</b></p>
+
+ <p class="story">Once upon a time there were three little sisters; and their names were
+ <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
+ <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
+ <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
+ and they lived at the bottom of a well.</p>
+
+ <p class="story">...</p>
+ """
+
+ from bs4 import BeautifulSoup
+ soup = BeautifulSoup(html_doc, 'html.parser')
+
+Eu usarei este documento como exemplo para mostrar como navegar
+de uma parte para outra do documento.
+
+Descendo na Árvore
+------------------
+As tags podem conter strings e outras tags. Estes elementos são as tags
+`filhas` (children). O Beautiful Soup oferece diferentes atributos para
+navegar e iterar sobre as tags filhas.
+
+Note que as strings Beautiful Soup não suportam qualquer destes atributos,
+porque uma string não pode ter filhos.
+
+Navegar usando os nomes das tags
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+A maneira mais simples de navegar pela árvore é utilizar
+o nome da tag que você quer. Se você quer a tag <head>,
+simplesmente use ``soup.head``::
+
+ soup.head
+ # <head><title>The Dormouse's story</title></head>
+
+ soup.title
+ # <title>The Dormouse's story</title>
+
+Você pode usar este truque de novo, e de novo, para focar em certa parte da
+árvore de análise. Este código retorna a primeira tag <b> abaixo da tag <body>::
+
+ soup.body.b
+ # <b>The Dormouse's story</b>
+
+Utilizando o nome da tag como atributo irá lhe retornar apenas a `primeira`
+tag com aquele nome::
+
+ soup.a
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+Se você precisar retornar `todas` as tags <a>, ou algo mais complicado
+que a primeira tag com um certo nome, você precisará utilizar um dos
+métodos descritos em `Buscando na árvore`_, como `find_all()`::
+
+ soup.find_all('a')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+``.contents`` e ``.children``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+As tags filhas de uma outra tag estão disponíveis em uma lista chamada por ``.contents``::
+
+ head_tag = soup.head
+ head_tag
+ # <head><title>The Dormouse's story</title></head>
+
+ head_tag.contents
+ [<title>The Dormouse's story</title>]
+
+ title_tag = head_tag.contents[0]
+ title_tag
+ # <title>The Dormouse's story</title>
+ title_tag.contents
+ # [u'The Dormouse's story']
+
+O objeto ``BeautifulSoup`` em si possui filhos. Neste caso, a tag
+<html> é a filha do objeto ``BeautifulSoup``.::
+
+ len(soup.contents)
+ # 1
+ soup.contents[0].name
+ # u'html'
+
+Uma string não possui o atributo ``.contents``, porque ela não pode conter
+nada::
+
+ text = title_tag.contents[0]
+ text.contents
+ # AttributeError: 'NavigableString' object has no attribute 'contents'
+
+Ao invés de retorná-las como uma lista, você pode iterar sobre as
+tag's filhas usando o gerador ``.children``::
+
+ for child in title_tag.children:
+ print(child)
+ # The Dormouse's story
+
+``.descendants``
+^^^^^^^^^^^^^^^^
+
+Os atributos ``.contents`` e ``.children`` somente consideram tags que
+são `filhas diretas`. Por instância, a tag <head> tem apenas uma tag filha direta,
+a tag <title>::
+
+ head_tag.contents
+ # [<title>The Dormouse's story</title>]
+
+Mas a tag <title> em si possui uma filha: a string "The Dormouse's story".
+Existe uma percepção de que esta string também é filha da tag <head>.
+O atributo ``.descendants`` permite que você itere sobre `todas`
+as tags filhas, recursivamente: suas filhas diretas, as filhas de suas filhas, e assim por diante::
+
+ for child in head_tag.descendants:
+ print(child)
+ # <title>The Dormouse's story</title>
+ # The Dormouse's story
+
+A tag <head> possui apenas uma filha, mas também possui dois `descentendes`:
+a tag <title> e a filha da tag <title>. O objeto ``BeautifulSoup`` possui apenas
+uma filha direta (a tag <html>), mas ele possui vários descendentes::
+
+ len(list(soup.children))
+ # 1
+ len(list(soup.descendants))
+ # 25
+
+.. _.string:
+
+``.string``
+^^^^^^^^^^^
+
+Se uma tag possui apenas uma filha, e esta filha é uma ``NavigableString``,
+esta filha pode ser disponibilizada através de ``.string``::
+
+ title_tag.string
+ # u'The Dormouse's story'
+
+Se a filha única de uma tag é outra tag e esta tag possui uma
+``.string``, então considera-se que a tag mãe tenha a mesma
+``.string`` como sua filha::
+
+ head_tag.contents
+ # [<title>The Dormouse's story</title>]
+
+ head_tag.string
+ # u'The Dormouse's story'
+
+Se uma tag contém mais de uma coisa, então não fica claro a que
+``.string`` deve se referir, portanto ``.string`` será definida como
+``None``::
+
+ print(soup.html.string)
+ # None
+
+.. _string-generators:
+
+``.strings`` e ``stripped_strings``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Se existe mais de alguma coisa dentro da tag, você pode continuar
+olhando apenas as strings. Use o gerador ``.strings``::
+
+ for string in soup.strings:
+ print(repr(string))
+ # u"The Dormouse's story"
+ # u'\n\n'
+ # u"The Dormouse's story"
+ # u'\n\n'
+ # u'Once upon a time there were three little sisters; and their names were\n'
+ # u'Elsie'
+ # u',\n'
+ # u'Lacie'
+ # u' and\n'
+ # u'Tillie'
+ # u';\nand they lived at the bottom of a well.'
+ # u'\n\n'
+ # u'...'
+ # u'\n'
+
+Estas strings tendem a ter muitos espaços em branco, os quais você
+pode remover utilizando o gerador ``.stripped_strings`` como alternativa::
+
+ for string in soup.stripped_strings:
+ print(repr(string))
+ # u"The Dormouse's story"
+ # u"The Dormouse's story"
+ # u'Once upon a time there were three little sisters; and their names were'
+ # u'Elsie'
+ # u','
+ # u'Lacie'
+ # u'and'
+ # u'Tillie'
+ # u';\nand they lived at the bottom of a well.'
+ # u'...'
+
+Aqui, strings formadas inteiramente por espaços em branco serão ignoradas,
+e espaços em branco no início e no fim das strings serão removidos.
+
+Subindo na Árvore
+-----------------
+
+Continuando a analogia da árvore como "família", toda tag e toda string possuem
+`tags mães (parents)`: a tag que as contém.
+
+.. _.parent:
+
+``.parent``
+^^^^^^^^^^^
+
+Você pode acessar o elemento mãe com o atributo ``.parent``. No
+exemplo "three sisters", a tag <head> é mãe da tag <title>::
+
+ title_tag = soup.title
+ title_tag
+ # <title>The Dormouse's story</title>
+ title_tag.parent
+ # <head><title>The Dormouse's story</title></head>
+
+A string de title tem uma mãe: a tag <title> que a contém::
+
+ title_tag.string.parent
+ # <title>The Dormouse's story</title>
+
+A tag mãe de todo documento (<html>) é um objeto ``BeautifulSoup`` em si::
+
+ html_tag = soup.html
+ type(html_tag.parent)
+ # <class 'bs4.BeautifulSoup'>
+
+E o ``.parent`` de um objeto ``BeautifulSoup`` é definido como None::
+
+ print(soup.parent)
+ # None
+
+.. _.parents:
+
+``.parents``
+^^^^^^^^^^^^
+Você pode iterar sobre todos os elementos pais com
+``.parents``. Este exemplo usa ``.parents`` para viajar de uma tag <a>
+profunda no documento, para o elemento mais ao topo da árvore do documento::
+
+ link = soup.a
+ link
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+ for parent in link.parents:
+ if parent is None:
+ print(parent)
+ else:
+ print(parent.name)
+ # p
+ # body
+ # html
+ # [document]
+ # None
+
+Navegando para os lados:
+------------------------
+
+Considere um simples documento como este::
+
+ sibling_soup = BeautifulSoup("<a><b>text1</b><c>text2</c></b></a>")
+ print(sibling_soup.prettify())
+ # <html>
+ # <body>
+ # <a>
+ # <b>
+ # text1
+ # </b>
+ # <c>
+ # text2
+ # </c>
+ # </a>
+ # </body>
+ # </html>
+
+A tag <b> e a tag <c> estão no mesmo nível: ambas são filhas diretas
+da mesma tag. Nós podemos chamá-las irmãs (`siblings`).
+Quando um documento é pretty-printed, irmãs aparecem no mesmo nível de identação.
+Você pode utilizar esta relação nos códigos que você escrever.
+
+``.next_sibling`` e ``.previous_sibling``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Você pode usar ``.next_sibling`` e ``.previous_sibling`` para navegar
+entre os elementos da página que estão no mesmo nível da árvore::
+
+ sibling_soup.b.next_sibling
+ # <c>text2</c>
+
+ sibling_soup.c.previous_sibling
+ # <b>text1</b>
+
+A tag <b> possui ``.next_sibling``, mas não ``.previous_sibling``,
+porque não há nada antes da tag <b> `no mesmo nível na árvore`.
+Pela mesma razão, a tag <c> possui ``.previous_sibling``
+mas não ``.next_sibling``::
+
+ print(sibling_soup.b.previous_sibling)
+ # None
+ print(sibling_soup.c.next_sibling)
+ # None
+
+As strings "text1" e "text2" `não` são irmãs, porque elas não tem a mesma tag mãe::
+
+ sibling_soup.b.string
+ # u'text1'
+
+ print(sibling_soup.b.string.next_sibling)
+ # None
+
+No mundo real, ``.next_sibling`` ou ``.previous_sibling`` de uma tag
+geralmente são strings contendo espaços em branco. Voltando ao documento
+"three sisters"::
+
+ <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>
+ <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>
+ <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>
+
+Você pode pensar que o ``.next_sibling`` da primeira tag <a> será a segunda tag <a>.
+Mas na verdade é uma string: a vírgula e um caracter de nova linha (\n) que separam
+a primeira da segunda tag <a>::
+
+ link = soup.a
+ link
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+ link.next_sibling
+ # u',\n'
+
+A segunda tag <a> é, na verdade, a ``.next_sibling`` da vírgula::
+
+ link.next_sibling.next_sibling
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>
+
+.. _sibling-generators:
+
+``.next_siblings`` e ``.previous_siblings``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Você pode iterar sobre as tag's filhas com ``.next_siblings``
+ou ``.previous_siblings``::
+
+ for sibling in soup.a.next_siblings:
+ print(repr(sibling))
+ # u',\n'
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>
+ # u' and\n'
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
+ # u'; and they lived at the bottom of a well.'
+ # None
+
+ for sibling in soup.find(id="link3").previous_siblings:
+ print(repr(sibling))
+ # ' and\n'
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>
+ # u',\n'
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+ # u'Once upon a time there were three little sisters; and their names were\n'
+ # None
+
+Indo e voltando
+----------------
+
+Dê uma olhada no início do documento "three sisters"::
+
+ <html><head><title>The Dormouse's story</title></head>
+ <p class="title"><b>The Dormouse's story</b></p>
+
+Um parser HTML transforma estas strings em uma série de eventos: "abrir
+uma tag <html>", "abrir uma tag <head>", "abrir uma tag <title>",
+"adicionar uma string", "fechar uma tag <title>,
+"abrir uma tag <p>", e daí por diante. O Beautiful Soup oferece ferramentas
+para reconstruir a análise inicial do documento.
+
+.. _element-generators:
+
+``.next_element`` e ``.previous_element``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+O atributo ``.next_element`` de uma string ou tag aponta para
+qualquer coisa que tenha sido interpretado posteriormente.
+Isso deveria ser o mesmo que ``.next_sibling``, mas é
+drasticamente diferente.
+
+Aqui está a tag <a> final no "three sisters". Sua
+``.next_sibling`` é uma string: a conclusão da sentença
+que foi interrompida pelo início da tag <a>.::
+
+ last_a_tag = soup.find("a", id="link3")
+ last_a_tag
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
+
+ last_a_tag.next_sibling
+ # '; and they lived at the bottom of a well.'
+
+Mas no ``.next_element`` da tag <a>, o que é analisado imediatamente
+depois da tag <a> `não` é o resto da sentença: é a palavra "Tillie".
+
+ last_a_tag.next_element
+ # u'Tillie'
+
+Isso porque na marcação original, a palavra "Tillie" apareceu
+antes do ponto e virgula. O parser encontrou uma tag <a>, então
+a palavra "Tillie", então fechando a tag </a>, então o ponto e vírgula e o
+resto da sentença. O ponto e vírgula estão no mesmo nível que a tag <a>,
+mas a palavra "Tillie" foi encontrada primeiro.
+
+O atributo ``.previous_element`` é exatamente o oposto de
+``.next_element``. Ele aponta para qualquer elemento que
+seja analisado antes do respectivo::
+
+ last_a_tag.previous_element
+ # u' and\n'
+ last_a_tag.previous_element.next_element
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
+
+``.next_elements`` e ``.previous_elements``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Você deve ter entendido a idéia agora. Você pode usar estes iteradores
+para andar para frente e para atrás no documento quando ele for analisado::
+
+ for element in last_a_tag.next_elements:
+ print(repr(element))
+ # u'Tillie'
+ # u';\nand they lived at the bottom of a well.'
+ # u'\n\n'
+ # <p class="story">...</p>
+ # u'...'
+ # u'\n'
+ # None
+
+Buscando na árvore
+==================
+
+O Beautiful Soup define vários métodos para buscar na árvore que está sendo analisada,
+mas eles são todos muito similares. Vou usar a maior parte do tempo para explicar os dois mais
+populares métodos: ``find()`` e ``find_all()``. Os outros métodos recebem exatamente
+os mesmos argumentos, portanto, vou cobrí-los apenas brevemente.
+
+
+Mais uma vez, utilizarei o documento "three sisters" como exemplo::
+
+ html_doc = """
+ <html><head><title>The Dormouse's story</title></head>
+ <body>
+ <p class="title"><b>The Dormouse's story</b></p>
+
+ <p class="story">Once upon a time there were three little sisters; and their names were
+ <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
+ <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
+ <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
+ and they lived at the bottom of a well.</p>
+
+ <p class="story">...</p>
+ """
+
+ from bs4 import BeautifulSoup
+ soup = BeautifulSoup(html_doc, 'html.parser')
+
+Utilizando em um filtro um argumento como ``find_all()``, você pode
+"dar um zoom" nas partes do documento que você está interessado.
+
+Tipos de filtros
+----------------
+
+Antes de entrar em detalhes sobre o ``find_all()`` e métodos similares,
+quero mostrar exemplos de diferentes filtros que você pode passar dentro
+destes métodos. Estes filtros aparecerão de novo e de novo por toda API
+de pesquisa. Você pode usá-los para realizar filtros baseados nos nomes das tags,
+nos seus atributos, no texto de uma strings ou em alguma combinação entre eles.
+
+.. _uma string:
+
+Uma string
+^^^^^^^^^^
+
+O filtro mais simples é uma string. Passando uma string para um método de pesquisa,
+o Beautiful Soup irá buscar uma correspondência a esta exata string. O seguinte código
+encontrará todas as tags <b> no documento::
+
+ soup.find_all('b')
+ # [<b>The Dormouse's story</b>]
+
+Se você passar uma byte string, o Beautiful Soup assumirá que a string
+esta codificada como UTF-8. Você pode evitar isso passando ao invés disso
+uma string Unicode.
+
+.. _uma expressão regular:
+
+Uma expressão regular (regex)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Se você passar um objeto `regex`, o Beautiful Soup irá
+realizar um filtro com ela utilizando seu método ``search()``.
+O código seguinte buscará todas as tags as quais os nomes comecem com
+a letra "b"; neste caso, a tag <body> e a tag <b>::
+
+ import re
+ for tag in soup.find_all(re.compile("^b")):
+ print(tag.name)
+ # body
+ # b
+
+Este código buscará todas as tags cujo nome contenha a letra "t"::
+
+ for tag in soup.find_all(re.compile("t")):
+ print(tag.name)
+ # html
+ # title
+
+.. _uma lista:
+
+Uma lista
+^^^^^^^^^
+
+Se você passar uma lista, o Beautiful Soup irá buscar
+uma correspondência com qualquer item dessuma lista.
+O código seguinte buscará todas as tags <a> e todas
+as tags <b>::
+
+ soup.find_all(["a", "b"])
+ # [<b>The Dormouse's story</b>,
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+.. _the value True:
+
+``True``
+^^^^^^^^
+
+O valor ``True`` irá corresponder com tudo.
+O código abaixo encontrará ``todas`` as tags do documento,
+mas nenhuma das strings::
+
+ for tag in soup.find_all(True):
+ print(tag.name)
+ # html
+ # head
+ # title
+ # body
+ # p
+ # b
+ # p
+ # a
+ # a
+ # a
+ # p
+
+.. _a function:
+
+Uma função
+^^^^^^^^^^
+
+Se nenhuma das opções anteriores funcionar para você, defina uma
+função que pegará um elemento como seu único argumento. A função
+deverá retornar ``True`` se o argumento corresponder e ``False``
+caso contrário.
+
+Aqui você tem uma função que irá retornar ``True`` se uma tag definir
+o atributo `class`, mas não definir o atributo `id`::
+
+ def has_class_but_no_id(tag):
+ return tag.has_attr('class') and not tag.has_attr('id')
+
+Passe esta função dentro de ``find_all()`` e você irá retornar todas
+as tags <p>::
+
+ soup.find_all(has_class_but_no_id)
+ # [<p class="title"><b>The Dormouse's story</b></p>,
+ # <p class="story">Once upon a time there were...</p>,
+ # <p class="story">...</p>]
+
+Esta função irá encontrar apenas as tags <p>. Não irá encontrar as tags <a>,
+porque elas definem "class e "id" ao mesmo tempo. Ela não encontrará
+as tags <html> e <title>, porque estas tags não definem um atributo
+"class".
+
+Se você passar uma função para filtrar um atributo específico como
+``href``, o argumento passado na função será o nome do atributo e
+não toda a tag. Aqui vemos uma função que encontra todas as tags <a>
+em que o atributo ``href`` não corresponde a expressão regular passada::
+
+ def not_lacie(href):
+ return href and not re.compile("lacie").search(href)
+ soup.find_all(href=not_lacie)
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+A função pode ser tão complexa quanto você precise que seja.
+Aqui temos uma função que retorna ``True`` se uma tag esta
+cercada por objetos string::
+
+ from bs4 import NavigableString
+ def surrounded_by_strings(tag):
+ return (isinstance(tag.next_element, NavigableString)
+ and isinstance(tag.previous_element, NavigableString))
+
+ for tag in soup.find_all(surrounded_by_strings):
+ print tag.name
+ # p
+ # a
+ # a
+ # a
+ # p
+
+Agora nós estamos prontos para olhar os métodos de busca em detalhes.
+
+``find_all()``
+--------------
+
+Definição: find_all(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`recursive
+<recursive>`, :ref:`string <string>`, :ref:`limit <limit>`, :ref:`**kwargs <kwargs>`)
+
+O método ``find_all()`` busca entre os decendentes de uma tag e retorna todos os decendentes
+que correspondem a seus filtros. Dei diversos exemplos em `Tipos de filtros`_,
+mas aqui estão mais alguns::
+
+ soup.find_all("title")
+ # [<title>The Dormouse's story</title>]
+
+ soup.find_all("p", "title")
+ # [<p class="title"><b>The Dormouse's story</b></p>]
+
+ soup.find_all("a")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.find_all(id="link2")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+ import re
+ soup.find(string=re.compile("sisters"))
+ # u'Once upon a time there were three little sisters; and their names were\n'
+
+Alguns podem parecer familiares, mas outros são novos.
+O que significa passar um valor ``string`` ou ``id``? Por que
+``find_all("p", "title")`` encontra uma tag <p> com a classe CSS "title"?
+Vamos dar uma olhada nos argumentos de ``find_all()``.
+
+.. _name:
+
+O argumento ``name``
+^^^^^^^^^^^^^^^^^^^^
+
+Passe um valor para ``name`` e você dirá para o Beautiful Soup
+considerar apenas as tags com certos nomes. Strings de texto seão ignoradas,
+assim como os nomes que não corresponderem ao argumento ``name``
+
+Este é o uso mais simples::
+
+ soup.find_all("title")
+ # [<title>The Dormouse's story</title>]
+
+Lembre-se de `Tipos de filtros`_ que o valor para ``name`` pode ser `uma
+string`_, `uma expressão regular`_, `uma lista`_, `uma função`_, ou
+:ref:`o valor True <the value True>`.
+
+.. _kwargs:
+
+Os argumentos "palavras-chave"
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Qualquer argumento que não for reconhecido se tornará um filtro
+de atributos da tag. Se você passar um valor para um argumento
+chamado ``id``, o Beautiful Soup irá buscar correspondentes entre
+todas tags ``id``::
+
+ soup.find_all(id='link2')
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+Se você passar um valor para ``href``, o Beautiful Soup buscar correspondentes
+em cada tag que possua o atributo ``href``::
+
+ soup.find_all(href=re.compile("elsie"))
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+Você pode filtrar um atributo baseado em `uma string`_,
+`uma expressão regular`_, `uma lista`_, `uma função`_, ou
+:ref:`o valor True <the value True>`.
+
+Este código encontra todas as tags em que o atributo ``id``
+possuem um valor, independente de qual valor seja::
+
+ soup.find_all(id=True)
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+Você pode filtrar múltiplos atributos de uma vez passando mais de um argumento
+palavra-chave::
+
+ soup.find_all(href=re.compile("elsie"), id='link1')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">three</a>]
+
+Alguns atributos, como o atributo data-* do HTML5, possuem nomes que não
+podem ser usados como argumentos palavra-chave:::
+
+ data_soup = BeautifulSoup('<div data-foo="value">foo!</div>')
+ data_soup.find_all(data-foo="value")
+ # SyntaxError: keyword can't be an expression
+
+Você pode usar estes atributos para realizar buscas, colocando-os
+em um dicionário e passando o dicionário em ``find_all()``, como o argumento
+``attrs``::
+
+ data_soup.find_all(attrs={"data-foo": "value"})
+ # [<div data-foo="value">foo!</div>]
+
+Você não pode utilizar um argumento palavra-chave para buscar pelo elemento
+HTML "name", porque o Beautiful Soup utiliza o argumento ``name`` para
+conter o nome da própria tag. Ao invés disso, você pode passar o valor para
+"name" no argumento ``attrs``::
+
+ name_soup = BeautifulSoup('<input name="email"/>')
+ name_soup.find_all(name="email")
+ # []
+ name_soup.find_all(attrs={"name": "email"})
+ # [<input name="email"/>]
+
+.. _attrs:
+
+Buscando por uma classe CSS
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+É muito útil buscar por uma tag que tem uma certa classe CSS, mas
+o nome do atributo CSS, "class", é uma palavra reservada no Python.
+Utilizar ``class`` como um argumento palavra-chave lhe trará um erro
+de sintaxe. A partir do Beautiful Soup 4.1.2, você pode buscar por uma
+classe CSS utilizando o argumento palavra-chave ``class_``::
+
+ soup.find_all("a", class_="sister")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+Assim como qualquer argumento palavra-chave, você pode passar para ``class_``
+uma string, uma expressão regular (regex), uma função ou ``True``::
+
+ soup.find_all(class_=re.compile("itl"))
+ # [<p class="title"><b>The Dormouse's story</b></p>]
+
+ def has_six_characters(css_class):
+ return css_class is not None and len(css_class) == 6
+
+ soup.find_all(class_=has_six_characters)
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+:ref:`Lembre-se <multivalue>` que uma tag pode ter valores múltiplos
+para seu atributo classe. Quando você buscar por uma tag que tenha
+uma certa classe CSS, você esta buscando correspodência em `qualquer`
+de suas classes CSS::
+
+ css_soup = BeautifulSoup('<p class="body strikeout"></p>')
+ css_soup.find_all("p", class_="strikeout")
+ # [<p class="body strikeout"></p>]
+
+ css_soup.find_all("p", class_="body")
+ # [<p class="body strikeout"></p>]
+
+Você pode também buscar por uma string exata como valor de ``class``::
+
+ css_soup.find_all("p", class_="body strikeout")
+ # [<p class="body strikeout"></p>]
+
+Mas ao procurar por variações de uma string, isso não irá funcionar::
+
+ css_soup.find_all("p", class_="strikeout body")
+ # []
+
+Se voce quiser buscar por tags que correspondem a duas ou mais classes CSS,
+você deverá utilizar um seletor CSS::
+
+ css_soup.select("p.strikeout.body")
+ # [<p class="body strikeout"></p>]
+
+Em versões mais antigas do Beautiful Soup, as quais não possuem o atalho ``class_``
+você pode utilizar o truque ``attrs`` conforme mencionado acima. Será criado um dicionário
+do qual o valor para "class" seja uma string ( ou uma expressão regular, ou qualquer
+outra coisa) que você queira procurar::
+
+ soup.find_all("a", attrs={"class": "sister"})
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+.. _string:
+
+O argumento ``string``
+^^^^^^^^^^^^^^^^^^^^^^^
+
+Com ``string`` você pode buscar por strings ao invés de tags. Assim como
+``name`` e os argumentos palavras-chave, você pode passar `uma string`_, `uma
+expressão regular`_, `uma lista`_, `uma função`_, ou
+:ref:`o valor True <the value True>`. Aqui estão alguns exemplos::
+
+ soup.find_all(string="Elsie")
+ # [u'Elsie']
+
+ soup.find_all(string=["Tillie", "Elsie", "Lacie"])
+ # [u'Elsie', u'Lacie', u'Tillie']
+
+ soup.find_all(string=re.compile("Dormouse"))
+ [u"The Dormouse's story", u"The Dormouse's story"]
+
+ def is_the_only_string_within_a_tag(s):
+ """Return True if this string is the only child of its parent tag."""
+ return (s == s.parent.string)
+
+ soup.find_all(string=is_the_only_string_within_a_tag)
+ # [u"The Dormouse's story", u"The Dormouse's story", u'Elsie', u'Lacie', u'Tillie', u'...']
+
+Mesmo que ``string`` seja para encontrar strings, você pode combiná-lo com argumentos
+para encontrar tags: o Beautiful Soup encontrará todas as tags as quais
+``.string`` corresponder seu valor em ``string``. O código seguinte encontra
+a tag <a>, a qual a ``.string`` é "Elsie"::
+
+ soup.find_all("a", string="Elsie")
+ # [<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>]
+
+O argumento ``string`` é novo no Beautiful Soup 4.4.0. Em versões anteriores
+ele era chamado de ``text``::
+
+ soup.find_all("a", text="Elsie")
+ # [<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>]
+
+.. _limit:
+
+O argumento ``limit``
+^^^^^^^^^^^^^^^^^^^^^^
+
+``find_all()`` retorna todas as tags e strings que correspondem aos seus
+filtros. Isso pode levar algum tmepo se o documento for extenso. Se você
+não precisar de `todos` os resultados, você pode passar um número limite
+(``limit``). Ele funciona assim como o parâmetro LIMIT utilizado em SQL.
+Ele diz ao Beautiful Soup para parar de adquirir resultados assim que atingir
+um certo número.
+
+Existem três links no documento "three sisters", mas este código encontra somente
+os dois primeiros::
+
+ soup.find_all("a", limit=2)
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+.. _recursive:
+
+O argumento ``recursive``
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Se você chamar ``mytag.find_all()``, o Beautiful Soup irá examinar todos os descendentes
+de ``mytag``: suas filhas, as filhas de suas filhas e daí em diante. Se você quer apenas que
+o Beautiful Soup considere filhas diretas, você pode passar o parâmetro ``recursive=False``.
+Veja a diferença aqui::
+
+ soup.html.find_all("title")
+ # [<title>The Dormouse's story</title>]
+
+ soup.html.find_all("title", recursive=False)
+ # []
+
+Aqui está o trecho do documento::
+
+ <html>
+ <head>
+ <title>
+ The Dormouse's story
+ </title>
+ </head>
+ ...
+
+O tag <title> esta abaixo da tag <html>, mas não está `diretamente`
+abaixo de <html>: a tag <head> está no caminho entre elas. O Beautiful Soup encontra a tag
+<title> quando é autorizado a olhar todos os descendentes de <html>, mas
+quando ``recursive=False`` é restringido o acesso as filhas imediatas de <html>.
+
+O Beautiful Soup oferece diversos métodos de busca na árvore (como vimos acima), e a maioria
+deles recebe os mesmos argumentos que ``find_all()``: ``name``,
+``attrs``, ``string``, ``limit``, e os argumentos palavras-chave. Mas o
+argumento ``recursive`` é diferente: ``find_all()`` e ``find()`` são
+os únicos métodos que o suportam. Passar ``recursive=False`` em um método
+como ``find_parents()`` não seria muito útil.
+
+Chamar uma tag é como chamar ``find_all()``
+--------------------------------------------
+
+Por ``find_all()`` ser o método mais popular na API de busca do
+Beautiful Soup, você pode usar um atalho para ele. Se você tratar
+o objeto ``BeautifulSoup`` ou um objeto ``Tag`` como se fosse uma
+função, então é o mesmo que chamar ``find_all()`` para aquele objeto.
+Estas duas linhas de código são equivalentes::
+
+ soup.find_all("a")
+ soup("a")
+
+Estas duas linhas também são equivalentes::
+
+ soup.title.find_all(string=True)
+ soup.title(string=True)
+
+``find()``
+----------
+
+Signature: find(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`recursive
+<recursive>`, :ref:`string <string>`, :ref:`**kwargs <kwargs>`)
+
+O método ``find_all()`` varre todo o documento em busca de resultados,
+mas algumas vezes você irá querer apenas um resultado. Se você sabe que
+o documento possui apenas uma tag <body>, é perda de tempo varrer todo o
+o documento procurando por outras. Ao invés de passar ``limit=1``
+toda vez em que chamar ``find_all``, você pode usar o método ``find()``.
+Estas duas linhas de código são `quase` equivalentes::
+
+ soup.find_all('title', limit=1)
+ # [<title>The Dormouse's story</title>]
+
+ soup.find('title')
+ # <title>The Dormouse's story</title>
+
+A única diferença é que ``find_all()`` retorna uma lista contendo apenas
+um resuldado, enquanto ``find()`` retorna o resultado.
+
+Se ``find_all()`` não encontrar nada, ele retornará uma lista vazia. Se
+``find()`` não encontrar nada, ele retornará ``None``::
+
+ print(soup.find("nosuchtag"))
+ # None
+
+Lembre-se do truque ``soup.head.title`` de `Navegar usando os nomes das tags`_?
+Aquele truque funciona chamando repetidamente ``find()``::
+
+ soup.head.title
+ # <title>The Dormouse's story</title>
+
+ soup.find("head").find("title")
+ # <title>The Dormouse's story</title>
+
+``find_parents()`` e ``find_parent()``
+----------------------------------------
+
+Signature: find_parents(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`limit <limit>`, :ref:`**kwargs <kwargs>`)
+
+Signature: find_parent(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`**kwargs <kwargs>`)
+
+Levei muito tempo cobrindo ``find_all()`` e ``find()`` acima.
+O API do Beautiful Soup define dez outros métodos
+para buscas na árvore, mas não tenha medo! Cinco destes métodos são
+basicamente o mesmo que ``find_all()``, e os outros cinco são basicamente
+o mesmo que ``find()``. A única diferença está em qual parte da árvore
+eles procuram.
+
+Primeiro vamos considerar ``find_parents()`` e
+``find_parent()``. Lembre-se que ``find_all()`` e ``find()`` trabalham
+de sua própria maneira descendo através da árvore, procurando pelos
+descendentes de uma tag. Estes métodos fazem o contrário: eles trabalham
+`subindo` a árvore, procurando pelas `mães` de uma tag (ou string).
+Vamos experimentá-los: começando por uma string "enterrada" no documento
+"three daughters"::
+
+ a_string = soup.find(string="Lacie")
+ a_string
+ # u'Lacie'
+
+ a_string.find_parents("a")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+ a_string.find_parent("p")
+ # <p class="story">Once upon a time there were three little sisters; and their names were
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> and
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>;
+ # and they lived at the bottom of a well.</p>
+
+ a_string.find_parents("p", class="title")
+ # []
+
+Uma das três tags <a> é diretamente um nível superior da string em
+questão, então nossa busca a encontra. Uma das três tags <p> é uma mãe
+indireta da string e nossa busca também a encontra. Há uma tag <p> com
+a classe CSS "title" em algum lugar no documento, mas não é nenhuma das tags mães
+da string, portanto, não podemos encontrá-la com ``find_parents()``.
+
+Você já deve ter feito a conexão entre ``find_parent()`` e
+``find_parents()``, e os atributos `.parent`_ e `.parents`_ mencionados
+anteriormente. A conexão é muito forte. Estes métodos de busca utilizam ``.parents``
+para iterar sobre todos as mãesS e compara cada um com o filtro passado
+para verificar se preenche o requisito.
+
+``find_next_siblings()`` e ``find_next_sibling()``
+----------------------------------------------------
+
+Signature: find_next_siblings(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`limit <limit>`, :ref:`**kwargs <kwargs>`)
+
+Signature: find_next_sibling(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`**kwargs <kwargs>`)
+
+Estes métodos utilizam :ref:`.next_siblings <sibling-generators>` para
+iterar sobre o resto dos filhos de um elemento da árvore. O método
+``find_next_siblings()`` retornará todos os filhos que atendem o
+requisito ``find_next_sibling()`` retorna apenas o primeiro::
+
+ first_link = soup.a
+ first_link
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+ first_link.find_next_siblings("a")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ first_story_paragraph = soup.find("p", "story")
+ first_story_paragraph.find_next_sibling("p")
+ # <p class="story">...</p>
+
+``find_previous_siblings()`` e ``find_previous_sibling()``
+------------------------------------------------------------
+
+Signature: find_previous_siblings(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`limit <limit>`, :ref:`**kwargs <kwargs>`)
+
+Signature: find_previous_sibling(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`**kwargs <kwargs>`)
+
+Estes métodos utilizam :ref:`.previous_siblings <sibling-generators>` para iterar sobre os filhos de um elemento que
+o precede na árvore. O método ``find_previous_siblings()``
+retorna todos os filhos que atendem o requisito e
+``find_previous_sibling()`` retorna apenas o primeiro::
+
+ last_link = soup.find("a", id="link3")
+ last_link
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
+
+ last_link.find_previous_siblings("a")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+ first_story_paragraph = soup.find("p", "story")
+ first_story_paragraph.find_previous_sibling("p")
+ # <p class="title"><b>The Dormouse's story</b></p>
+
+
+``find_all_next()`` e ``find_next()``
+---------------------------------------
+
+Signature: find_all_next(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`limit <limit>`, :ref:`**kwargs <kwargs>`)
+
+Signature: find_next(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`**kwargs <kwargs>`)
+
+Estes métodos utilizam :ref:`.next_elements <element-generators>` para
+iterar sobre qualquer tag e string que aparecer depois da atual no documento.
+O método ``find_all_next()`` retorna todos os casos que atendem, e
+``find_next()`` retorna somente o primeiro caso::
+
+ first_link = soup.a
+ first_link
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+ first_link.find_all_next(string=True)
+ # [u'Elsie', u',\n', u'Lacie', u' and\n', u'Tillie',
+ # u';\nand they lived at the bottom of a well.', u'\n\n', u'...', u'\n']
+
+ first_link.find_next("p")
+ # <p class="story">...</p>
+
+No primeiro exemplo, a string "Elsie" foi encontrada, mesmo estando
+dentro da tag <a>. No segundo exemplo, a última tag <p> do documento foi
+encontrada, mesmo que não esteja na mesma parte da árvore que <a> onde começamos.
+Para estes métodos, o que importa é que um elemento corresponda ao filtro e esteja
+depois do elemento de início no documento.
+
+``find_all_previous()`` e ``find_previous()``
+-----------------------------------------------
+
+Signature: find_all_previous(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`limit <limit>`, :ref:`**kwargs <kwargs>`)
+
+Signature: find_previous(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`**kwargs <kwargs>`)
+
+Estes métodos utilizam :ref:`.previous_elements <element-generators>` para
+iterar sobre as tags e strings que aparecem antes do elemento indicado no argumento.
+O método ``find_all_previous()`` retorna todos que correspondem a busca e o método
+``find_previous()`` apenas a primeira correspondência::
+
+ first_link = soup.a
+ first_link
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+ first_link.find_all_previous("p")
+ # [<p class="story">Once upon a time there were three little sisters; ...</p>,
+ # <p class="title"><b>The Dormouse's story</b></p>]
+
+ first_link.find_previous("title")
+ # <title>The Dormouse's story</title>
+
+Quando se chama ``find_all_previous("p")`` é encontrado não só o
+primeiro parágrafo do documento (o que possui class="title"), mas também o
+segundo parágrafo, a tag <p> que contém a tag <a> por onde começamos.
+Isso não deveria ser tão surpreendente: nós estamos olhando para todas as tags
+que apareceram anteriormente no documento incluindo aquela onde começamos. Uma
+tag <p> que contenha uma tag <a> deve aparecer antes da tag <a> que ela contém.
+
+Seletores CSS
+-------------
+
+A partir da versão 4.7.0, o Beautiful Soup suporta a maior parte dos seletores CSS4
+através do projeto `SoupSieve <https://facelessuser.github.io/soupsieve/>`_. Se você
+instalou o Beautiful Soup através do ``pip``,o SoupSieve foi instalado ao mesmo tempo,
+portanto você não precisará realizar nenhuma etapa adicional.
+
+``BeautifulSoup`` possui um método ``.select()`` o qual utiliza o SoupSieve para
+executar um seletor CSS selector sobre um documento a ser analisado e retorna todos os
+elementos correspondentes. ``Tag`` possui um método similar que executa um seletor CSS
+sobre o conteúdo de uma única tag.
+
+(Versões anteriores do Beautiful Soup também possuem o método ``.select()``,
+ mas somente os seletores CSS mais populares são suportados.
+
+A `documentação <https://facelessuser.github.io/soupsieve/>`_ SoupSieve
+lista todos os seletores suportados atualmente, mas aqui estão alguns dos
+básicos:
+
+Você pode encontrar tags::
+
+ soup.select("title")
+ # [<title>The Dormouse's story</title>]
+
+ soup.select("p:nth-of-type(3)")
+ # [<p class="story">...</p>]
+
+Encontrar tags aninhadas com outras::
+ soup.select("body a")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select("html head title")
+ # [<title>The Dormouse's story</title>]
+
+Encontrar tags `diretamente` abaixo de outras tags no aninhamento::
+
+ soup.select("head > title")
+ # [<title>The Dormouse's story</title>]
+
+ soup.select("p > a")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select("p > a:nth-of-type(2)")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+ soup.select("p > #link1")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+ soup.select("body > a")
+ # []
+
+Encontrar as irmãs de alguma tag::
+
+ soup.select("#link1 ~ .sister")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select("#link1 + .sister")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+Encontrar tags pela classe CSS::
+
+ soup.select(".sister")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select("[class~=sister]")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+Encontrar tags pelo ID::
+
+ soup.select("#link1")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+ soup.select("a#link2")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+Encontrar tags que se relacionam com qualquer seletor em uma lista de seletores::
+
+ soup.select("#link1,#link2")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+Testar a existência de um atributo::
+
+ soup.select('a[href]')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+Encontrar tags pelo valor do atributo::
+
+ soup.select('a[href="http://example.com/elsie"]')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+ soup.select('a[href^="http://example.com/"]')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select('a[href$="tillie"]')
+ # [<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select('a[href*=".com/el"]')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+Há outro método chamado ``select_one()``, o qual encontra somente
+a primeira tag que combina com um seletor::
+
+ soup.select_one(".sister")
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+Se você analisou um XML que define namespaces, você pode
+utilizar nos seletores CSS::
+
+ from bs4 import BeautifulSoup
+ xml = """<tag xmlns:ns1="http://namespace1/" xmlns:ns2="http://namespace2/">
+ <ns1:child>I'm in namespace 1</ns1:child>
+ <ns2:child>I'm in namespace 2</ns2:child>
+ </tag> """
+ soup = BeautifulSoup(xml, "xml")
+
+ soup.select("child")
+ # [<ns1:child>I'm in namespace 1</ns1:child>, <ns2:child>I'm in namespace 2</ns2:child>]
+
+ soup.select("ns1|child", namespaces=namespaces)
+ # [<ns1:child>I'm in namespace 1</ns1:child>]
+
+Quando manipulando um seletor CSS que utiliza
+namespaces,o Beautiful Soup utiliza a abreviação do namespace
+que encontrou quando estava analisando o documento. Você pode evitar isso
+passando um dicionário com suas próprias abreviações::
+
+ namespaces = dict(first="http://namespace1/", second="http://namespace2/")
+ soup.select("second|child", namespaces=namespaces)
+ # [<ns1:child>I'm in namespace 2</ns1:child>]
+
+Todo este negócio de seletor CSS é conveniente
+para pessoas que já sabem a sintaxe do seletor CSS.
+Você pode fazer tudo isso com a API do BeautifulSoup.
+E se os seletores CSS são tudo o que você precisa,
+você deveria analisar o documento com lxml: é mais rápido. Mas isso deixa você `combinar`
+seletores CSS com a API do Beautiful Soup.
+
+Modificando a árvore
+====================
+
+O principal poder do Beautiful Soup está na busca pela árvore, mas você
+pode também modificar a árvore e escrever suas modificações como um novo
+documento HTML ou XML.
+
+Alterando nomes de tags e atributos
+-----------------------------------
+
+Cobri este assunto anteriormente em `Atributos`_, mas vale a pena repetir. Você
+pode renomear uma tag, alterar o valor de algum de seus atributos, adicionar novos
+atributos e deletar qualquer um deles::
+
+ soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
+ tag = soup.b
+
+ tag.name = "blockquote"
+ tag['class'] = 'verybold'
+ tag['id'] = 1
+ tag
+ # <blockquote class="verybold" id="1">Extremely bold</blockquote>
+
+ del tag['class']
+ del tag['id']
+ tag
+ # <blockquote>Extremely bold</blockquote>
+
+Modificando ``.string``
+-----------------------
+
+Se você definir o um atributo ``.string`` de uma tag, o conteúdo da
+tag será substituido pela string que foi passada::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+
+ tag = soup.a
+ tag.string = "New link text."
+ tag
+ # <a href="http://example.com/">New link text.</a>
+
+Cuidado: se a tag conter outra(s) tag(s), ela(s) e todo seu conteúdo
+serão destruídos.
+
+``append()``
+------------
+
+Você pode adicionar algo no conteúdo de uma tag com ``Tag.append()``. Funciona
+da mesma maneira que ``.append()`` de uma lista::
+
+ soup = BeautifulSoup("<a>Foo</a>")
+ soup.a.append("Bar")
+
+ soup
+ # <html><head></head><body><a>FooBar</a></body></html>
+ soup.a.contents
+ # [u'Foo', u'Bar']
+
+``extend()``
+------------
+
+Com início no Beautiful Soup 4.7.0, ``Tag`` também suporta um método chamado
+``.extend()``, o qual funciona da mesma maneira que chamando ``.extend()`` em
+uma lista::
+
+ soup = BeautifulSoup("<a>Soup</a>")
+ soup.a.extend(["'s", " ", "on"])
+
+ soup
+ # <html><head></head><body><a>Soup's on</a></body></html>
+ soup.a.contents
+ # [u'Soup', u''s', u' ', u'on']
+
+``NavigableString()`` e ``.new_tag()``
+-------------------------------------------------
+
+Se você precisar adicionar uma string a um documento, sem problema -- você
+pode passar uma string Python através de ``append()``, ou você pode chamar
+o construtor ``NavigableString``::
+
+ soup = BeautifulSoup("<b></b>")
+ tag = soup.b
+ tag.append("Hello")
+ new_string = NavigableString(" there")
+ tag.append(new_string)
+ tag
+ # <b>Hello there.</b>
+ tag.contents
+ # [u'Hello', u' there']
+
+Se você quiser criar um comentário ou alguma outra subclasse de
+``NavigableString``, apenas chame o construtor::
+
+ from bs4 import Comment
+ new_comment = Comment("Nice to see you.")
+ tag.append(new_comment)
+ tag
+ # <b>Hello there<!--Nice to see you.--></b>
+ tag.contents
+ # [u'Hello', u' there', u'Nice to see you.']
+
+(Esta é uma funcionalidade nova no Beautiful Soup 4.4.0.)
+
+E se você precisar criar uma nova tag? A melhor solução
+é chamar o método ``BeautifulSoup.new_tag()``::
+
+ soup = BeautifulSoup("<b></b>")
+ original_tag = soup.b
+
+ new_tag = soup.new_tag("a", href="http://www.example.com")
+ original_tag.append(new_tag)
+ original_tag
+ # <b><a href="http://www.example.com"></a></b>
+
+ new_tag.string = "Link text."
+ original_tag
+ # <b><a href="http://www.example.com">Link text.</a></b>
+
+Somente o primeiro argumento (o nome da tag) é obrigatório.
+
+``insert()``
+------------
+
+``Tag.insert()`` funciona assim como ``Tag.append()``, exceto que o novo elemento
+não será inserido ao final do ``.contents`` de sua tag mãe. Ele será inserido em qualquer posição
+numérica que você informar. Funciona assim como ``.insert()`` em uma lista::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ tag = soup.a
+
+ tag.insert(1, "but did not endorse ")
+ tag
+ # <a href="http://example.com/">I linked to but did not endorse <i>example.com</i></a>
+ tag.contents
+ # [u'I linked to ', u'but did not endorse', <i>example.com</i>]
+
+``insert_before()`` e ``insert_after()``
+------------------------------------------
+
+O método ``insert_before()`` insere tags ou strings imediatamente antes de algo
+na árvore::
+
+ soup = BeautifulSoup("<b>stop</b>")
+ tag = soup.new_tag("i")
+ tag.string = "Don't"
+ soup.b.string.insert_before(tag)
+ soup.b
+ # <b><i>Don't</i>stop</b>
+
+O método ``insert_after()`` insere tags ou strings imediatamente após algo
+na árvore::
+
+ div = soup.new_tag('div')
+ div.string = 'ever'
+ soup.b.i.insert_after(" you ", div)
+ soup.b
+ # <b><i>Don't</i> you <div>ever</div> stop</b>
+ soup.b.contents
+ # [<i>Don't</i>, u' you', <div>ever</div>, u'stop']
+
+``clear()``
+-----------
+
+O ``Tag.clear()`` remove o conteúdo de uma tag::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ tag = soup.a
+
+ tag.clear()
+ tag
+ # <a href="http://example.com/"></a>
+
+``extract()``
+-------------
+
+O ``PageElement.extract()`` remove uma tag ou string da árvore. Ele retorna
+a tag ou string que foi extraída::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ a_tag = soup.a
+
+ i_tag = soup.i.extract()
+
+ a_tag
+ # <a href="http://example.com/">I linked to</a>
+
+ i_tag
+ # <i>example.com</i>
+
+ print(i_tag.parent)
+ None
+
+Neste ponto você efetivamente tem duas árvores de análise: uma baseada no objeto
+``BeautifulSoup`` que você usou para analisar o documento, e outra baseada na tag que foi
+extraída. Você pode também chamar ``extract`` em um filho do elemento que você extraiu::
+
+ my_string = i_tag.string.extract()
+ my_string
+ # u'example.com'
+
+ print(my_string.parent)
+ # None
+ i_tag
+ # <i></i>
+
+
+``decompose()``
+---------------
+
+O ``Tag.decompose()`` remove uma tag da árvore, então destrói `completamente` ela
+e seu conteúdo::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ a_tag = soup.a
+
+ soup.i.decompose()
+
+ a_tag
+ # <a href="http://example.com/">I linked to</a>
+
+
+.. _replace_with():
+
+``replace_with()``
+------------------
+
+Um ``PageElement.replace_with()`` remove uma tag ou string da árvore e
+substitui pela tag ou string que você escolher::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ a_tag = soup.a
+
+ new_tag = soup.new_tag("b")
+ new_tag.string = "example.net"
+ a_tag.i.replace_with(new_tag)
+
+ a_tag
+ # <a href="http://example.com/">I linked to <b>example.net</b></a>
+
+``replace_with()`` retorna a tag ou string que foi substituída, então você pode
+examiná-la ou adicioná-la novamente em outra parte da árvore.
+
+``wrap()``
+----------
+
+O ``PageElement.wrap()`` envelopa um elemento na tag que você especificar. Ele
+retornará o novo empacotador::
+
+ soup = BeautifulSoup("<p>I wish I was bold.</p>")
+ soup.p.string.wrap(soup.new_tag("b"))
+ # <b>I wish I was bold.</b>
+
+ soup.p.wrap(soup.new_tag("div")
+ # <div><p><b>I wish I was bold.</b></p></div>
+
+Este método é novo no Beautiful Soup 4.0.5.
+
+``unwrap()``
+---------------------------
+
+O ``Tag.unwrap()`` é o oposto de ``wrap()``. Ele substitui uma tag pelo
+que estiver dentro dela. É uma boa maneira de remover marcações::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ a_tag = soup.a
+
+ a_tag.i.unwrap()
+ a_tag
+ # <a href="http://example.com/">I linked to example.com</a>
+
+Assim como ``replace_with()``, ``unwrap()`` retorna a tag que foi
+substituída.
+
+``smooth()``
+---------------------------
+
+Após chamar vários métodos que modificam a árvore, você pode acabar com um ou dois objetos ``NavigableString`` próximos um ao outro. O Beautiful Soup não tem nenhum problema com isso, mas como isso não pode acontecer em um documento que acabou de ser analisado, você não deve esperar um comportamento como o seguinte::
+
+ soup = BeautifulSoup("<p>A one</p>")
+ soup.p.append(", a two")
+
+ soup.p.contents
+ # [u'A one', u', a two']
+
+ print(soup.p.encode())
+ # <p>A one, a two</p>
+
+ print(soup.p.prettify())
+ # <p>
+ # A one
+ # , a two
+ # </p>
+
+Você pode chamar ``Tag.smooth()`` para limpar a árvore analisada, consolidando strings adjacentes::
+
+ soup.smooth()
+
+ soup.p.contents
+ # [u'A one, a two']
+
+ print(soup.p.prettify())
+ # <p>
+ # A one, a two
+ # </p>
+
+O método ``smooth()`` é novo no Beautiful Soup 4.8.0.
+
+Saída
+======
+
+.. _.prettyprinting:
+
+Pretty-printing
+---------------
+
+O método ``prettify()`` irá transformar uma árvore do Beautiful Soup em
+uma string Unicode devidamente formatada, com uma linha para cada tag e cada string::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ soup.prettify()
+ # '<html>\n <head>\n </head>\n <body>\n <a href="http://example.com/">\n...'
+
+ print(soup.prettify())
+ # <html>
+ # <head>
+ # </head>
+ # <body>
+ # <a href="http://example.com/">
+ # I linked to
+ # <i>
+ # example.com
+ # </i>
+ # </a>
+ # </body>
+ # </html>
+
+Você pode chamar ``prettify()`` no top-level do objeto ``BeautifulSoup``,
+ou em qualquer de seus objetos ``Tag``::
+
+ print(soup.a.prettify())
+ # <a href="http://example.com/">
+ # I linked to
+ # <i>
+ # example.com
+ # </i>
+ # </a>
+
+Non-pretty printing
+-------------------
+
+Se você quer apenas uma string, sem nenhuma formatação, você pode chamar
+``unicode()`` ou ``str()`` para o objeto ``BeautifulSoup`` ou uma ``Tag``
+dentro dele::
+
+ str(soup)
+ # '<html><head></head><body><a href="http://example.com/">I linked to <i>example.com</i></a></body></html>'
+
+ unicode(soup.a)
+ # u'<a href="http://example.com/">I linked to <i>example.com</i></a>'
+
+A função ``str()`` retorna uma string codificada em UTF-8. Veja
+`Codificação (Encoding)`_ para outras opções.
+
+Você também pode chamar ``encode()`` para ter uma bytestring, e ``decode()``
+para ter Unicode.
+
+.. _output_formatters:
+
+Output formatters
+-----------------
+
+Se você der para o Beautiful Soup um documento que contém entidades HTML como
+"&lquot;", elas serão convertidades em caracteres Unicode::
+
+ soup = BeautifulSoup("&ldquo;Dammit!&rdquo; he said.")
+ unicode(soup)
+ # u'<html><head></head><body>\u201cDammit!\u201d he said.</body></html>'
+
+Se você converter o documento em uma string, os caracteres Unicode
+serão codificados como UTF-8. Você não irá ter suas entidades HTML de volta::
+
+ str(soup)
+ # '<html><head></head><body>\xe2\x80\x9cDammit!\xe2\x80\x9d he said.</body></html>'
+
+Por padrão, os únicos caracteres que escapam desta saída são o & e os sinais de <>.
+Eles são convertidos em "&amp;", "&lt;",
+e "&gt;", com isso o Beautiful Soup não gera HTML e XML inválidos de maneira inadvertida.
+
+ soup = BeautifulSoup("<p>The law firm of Dewey, Cheatem, & Howe</p>")
+ soup.p
+ # <p>The law firm of Dewey, Cheatem, &amp; Howe</p>
+
+ soup = BeautifulSoup('<a href="http://example.com/?foo=val1&bar=val2">A link</a>')
+ soup.a
+ # <a href="http://example.com/?foo=val1&amp;bar=val2">A link</a>
+
+Você pode alterar este comportamento informando um valor para o argumento de
+``formatter`` para ``prettify()``, ``encode()``, ou
+``decode()``. Beautiful Soup reconhece cinco possiveis valores para ``formatter``.
+
+O padrão é ``formatter="minimal"``. Strings sempre serão processadas de maneira a garantir que o Beautiful Soup gere HTML/XML válidos::
+
+ french = "<p>Il a dit &lt;&lt;Sacr&eacute; bleu!&gt;&gt;</p>"
+ soup = BeautifulSoup(french)
+ print(soup.prettify(formatter="minimal"))
+ # <html>
+ # <body>
+ # <p>
+ # Il a dit &lt;&lt;Sacré bleu!&gt;&gt;
+ # </p>
+ # </body>
+ # </html>
+
+Se você passar ``formatter="html"``, Beautiful Soup irá converter caracteres
+Unicode para entidades HTML sempre que possível::
+
+ print(soup.prettify(formatter="html"))
+ # <html>
+ # <body>
+ # <p>
+ # Il a dit &lt;&lt;Sacr&eacute; bleu!&gt;&gt;
+ # </p>
+ # </body>
+ # </html>
+
+Se você passar um ``formatter="html5"``, é o mesmo que ``formatter="html"``,
+mas o Beautiful Soup irá omitir a barra de fechamento HTML::
+
+ soup = BeautifulSoup("<br>")
+
+ print(soup.encode(formatter="html"))
+ # <html><body><br/></body></html>
+
+ print(soup.encode(formatter="html5"))
+ # <html><body><br></body></html>
+
+Se você passar ``formatter=None``, Beautiful Soup não irá modificar
+as strings na saída. Esta é a opção mais rápida, mas permitirá que o
+Beautiful Soup gere HTML/XML inválidos, como nestes exemplos::
+
+ print(soup.prettify(formatter=None))
+ # <html>
+ # <body>
+ # <p>
+ # Il a dit <<Sacré bleu!>>
+ # </p>
+ # </body>
+ # </html>
+
+ link_soup = BeautifulSoup('<a href="http://example.com/?foo=val1&bar=val2">A link</a>')
+ print(link_soup.a.encode(formatter=None))
+ # <a href="http://example.com/?foo=val1&bar=val2">A link</a>
+
+Se você precisar de controles mais sofisticados sobre sua saída,
+você pode usar a classe ``Formatter`` do Beautiful Soup. Aqui você pode ver um
+formatter que converte strings para uppercase, quando elas ocorrem em um nó de texto
+ou em um valor de algum atributo::
+
+ from bs4.formatter import HTMLFormatter
+ def uppercase(str):
+ return str.upper()
+ formatter = HTMLFormatter(uppercase)
+
+ print(soup.prettify(formatter=formatter))
+ # <html>
+ # <body>
+ # <p>
+ # IL A DIT <<SACRÉ BLEU!>>
+ # </p>
+ # </body>
+ # </html>
+
+ print(link_soup.a.prettify(formatter=formatter))
+ # <a href="HTTP://EXAMPLE.COM/?FOO=VAL1&BAR=VAL2">
+ # A LINK
+ # </a>
+
+Dividindo em subclasses ``HTMLFormatter`` ou ``XMLFormatter`` darão a você ainda
+mais controle sobre a saída. Por exemplo, o Beautiful Soup ordena os atributos em toda
+tag por padrão::
+
+ attr_soup = BeautifulSoup(b'<p z="1" m="2" a="3"></p>')
+ print(attr_soup.p.encode())
+ # <p a="3" m="2" z="1"></p>
+
+Para desabilitar esta opção, você pode criar uma subclasse do método ``Formatter.attributes()``,
+o qual controla qual atributo será usado na saída e em que ordem. Esta
+implementação também filtra o atributido chamado "m" quando ele aparece::
+
+ class UnsortedAttributes(HTMLFormatter):
+ def attributes(self, tag):
+ for k, v in tag.attrs.items():
+ if k == 'm':
+ continue
+ yield k, v
+ print(attr_soup.p.encode(formatter=UnsortedAttributes()))
+ # <p z="1" a="3"></p>
+
+Um último conselho: se você criar um objeto ``CDATA``, o texto dentro deste objeto
+sempre estará presente `exatamente como aparenta, com nenhuma formatação`.
+O Beautiful Soup irá chamar sua função de substituição da entidade, apenas
+no caso de você ter escrito uma função personalizada que conta todas as strings
+que existem no documento ou algo do tipo, mas ele irá ignorar o valor de retorno::
+
+ from bs4.element import CData
+ soup = BeautifulSoup("<a></a>")
+ soup.a.string = CData("one < three")
+ print(soup.a.prettify(formatter="xml"))
+ # <a>
+ # <![CDATA[one < three]]>
+ # </a>
+
+
+``get_text()``
+--------------
+
+Se você quer apenas o texto contido no documento ou em um par de tags, você
+pode utilizar o método ``get_text()``. Ele retornará todo texto em um documento
+ou dentro das tags como uma string Unicode::
+
+ markup = '<a href="http://example.com/">\nI linked to <i>example.com</i>\n</a>'
+ soup = BeautifulSoup(markup)
+
+ soup.get_text()
+ u'\nI linked to example.com\n'
+ soup.i.get_text()
+ u'example.com'
+
+Você pode especificar uma string a ser usada para unir as partes do texto::
+
+ # soup.get_text("|")
+ u'\nI linked to |example.com|\n'
+
+Você pode dizer ao Beautiful Soup para excluir espaços em branco do início
+e fim de cada parte de texto::
+
+ # soup.get_text("|", strip=True)
+ u'I linked to|example.com'
+
+Contudo para isso, você pode querer utilizar o gerador :ref:`.stripped_strings <string-generators>`
+e processar o texto você mesmo::
+
+ [text for text in soup.stripped_strings]
+ # [u'I linked to', u'example.com']
+
+Especificando um interpretador (parser) para uso
+================================================
+
+Se você precisa analisar um pequeno HTML, você pode passá-lo no construtor do
+``BeautifulSoup`` e será o suficiente. O Beautiful Soup irá escolher um parser
+para você e irá interpretar o dado. Mas existem alguns argumentos adicionais que você
+pode passar no construtor para alterar qual parser será usado.
+
+O primeiro argumento do construtor ``BeautifulSoup`` é uma string ou uma variável contendo o
+conteúdo do que você quer analisar. O segundo argumento é `como` você quer interpretar aquele
+conteúdo.
+
+Se você não especificar nada, você irá utilizar o melhor analisador HTML instalado.
+O Beautiful Soup classifica o lxml's como sendo o melhor, logo em seguida o html5lib,
+e então o parser nativo do Python. Você pode substituí-lo, especificando de acordo
+com as seguintes características:
+
+* O tipo de marcação que você quer analisar. Atualmente são suportados
+ "html", "xml", and "html5".
+* O nome do parser que você quer utilizar. Atualmente são suportadas
+ as opções "lxml", "html5lib", e "html.parser" (parser nativo do Python).
+
+A seção `Instalando um interpretador (parser)` compara os parsers suportados.
+
+Se você não tem um parser apropriado instalado, o Beautiful Soup irá
+ignorar sua solicitação e escolher um diferente. Atualmente, o único parser
+XML suportado é o lxml. Se você não possui o lxml instalado, pedir um parser
+XML não trará um e pedir por "lxml" não funcionará também.
+
+
+.. _differences-between-parsers:
+
+Diferenças entre os interpretadores (parsers)
+---------------------------------------------
+
+O Beautiful Soup apresenta a mesma interface para diferentes parsers,
+mas cada um é diferente. Diferentes parsers irão criar diferentes análises da árvore
+do mesmo documento. As maiores diferenças estão entre os parsers HTML e XML.
+Aqui está um pequeno documento analisado como HTML::
+
+ BeautifulSoup("<a><b /></a>")
+ # <html><head></head><body><a><b></b></a></body></html>
+
+Como uma tag <b /> vazia não é um HTML válido, o analisador a transforma
+em um par <b></b>.
+
+Aqui está o mesmo documento analisado como XML (partindo do princípio
+que você tenha o lxml instalado). Note que o a tag vazia <b /> é deixada sozinha,
+e que é dada ao documento uma declaração XML ao invés de ser colocada dentro de uma tag <html>.::
+
+ BeautifulSoup("<a><b /></a>", "xml")
+ # <?xml version="1.0" encoding="utf-8"?>
+ # <a><b/></a>
+
+Há também diferenças entre analisadores HTML. Se você der ao Beautiful
+Soup um documento HTML perfeitamente formatado, estas diferenças não irão
+importar. Um analisador será mais rápido que outro, mas todos irão lhe
+retornar uma estrutura de dados que se parece exatamente como o HTML original.
+
+Mas se o documento não estiver perfeitamente formatado, diferentes analisadores
+irão retornar diferentes resultados. Aqui está um pequeno e inválido documento
+analisado utilizando o analisador lxml HTML. Note que a tag pendente </p> é
+simplesmente ignorada::
+
+ BeautifulSoup("<a></p>", "lxml")
+ # <html><body><a></a></body></html>
+
+Aqui está o mesmo documento analisado utilizando html5lib::
+
+ BeautifulSoup("<a></p>", "html5lib")
+ # <html><head></head><body><a><p></p></a></body></html>
+
+Ao invés de ignorar a tag </p> pendente, o html5lib a equipara a uma tag
+<p> aberta. Este parser também adiciona uma tag <head> vazia ao documento.
+
+Aqui está o mesmo documento analisado com o parser HTML nativo do Python::
+
+ BeautifulSoup("<a></p>", "html.parser")
+ # <a></a>
+
+Assim como html5lib, este parser ignora a tag de fechamento </p>.
+Este parser também não realiza nenhuma tentatida de criar um HTML bem
+formatado adicionando uma tag <body>. Como lxml, ele nem se importa em
+adicionar uma tag <html>.
+
+Sendo o documento "<a></p>" inválido, nenhuma dessas técnicas é a maneira
+"correta" de lidar com isso. O html5lib utiliza técnicas que são parte
+do padrão HTML5, portanto vendo sendo definido como a maneira "mais correta",
+mas todas as três técnicas são legítimas.
+
+Diferenças entre analisadores podem afetar o seu script. Se você está
+planejando distribuir seu script para outras pessoas, ou rodá-lo em
+múltiplas máquinas, você deve especificar o analisador no construtor
+``BeautifulSoup``. Isso irá reduzir as chances de que seus usuários
+analisem um documento de forma diferente da maneira como você analisou.
+
+
+Codificação (Encoding)
+======================
+
+Todo documento HTML ou XML é escrito em uma codificação (encoding) específica como ASCII
+ou UTF-8. Mas quando você carrega um documento no BeautifulSoup, você irá descobrir
+que ele foi convertido para Unicode::
+
+ markup = "<h1>Sacr\xc3\xa9 bleu!</h1>"
+ soup = BeautifulSoup(markup)
+ soup.h1
+ # <h1>Sacré bleu!</h1>
+ soup.h1.string
+ # u'Sacr\xe9 bleu!'
+
+Não é mágica (Seria bem legal que fosse). O BeautifulSoup utiliza uma
+sub-biblioteca chamada `Unicode, Dammit`_ para detectar a codificação de
+um documento e convertê-lo para Unicode. A codificação detectada automaticamente está
+disponível como objeto ``.original_encoding`` atributo do objeto ``BeautifulSoup`` ::
+
+ soup.original_encoding
+ 'utf-8'
+
+`Unicode, Dammit` acerta na maioria das vezes, mas pode errar em algumas.
+Outras vezes acerta, porém somente após uma busca byte a byte no documento,
+o leva muito tempo. Se você souber com antecedência a codificação, você poderá
+evitar erros ou demora passando-o para o contrutor do ``BeautifulSoup``
+através de ``from_encoding``.
+
+Abaixo você tem um documento escrito em ISO-8859-8. O documento é tão
+pequeno que o `Unicode, Dammit` não consegue verificar sua codificação
+e acaba fazendo a identificação como ISO-8859-7::
+
+ markup = b"<h1>\xed\xe5\xec\xf9</h1>"
+ soup = BeautifulSoup(markup)
+ soup.h1
+ <h1>νεμω</h1>
+ soup.original_encoding
+ 'ISO-8859-7'
+
+Podemos consertar isso passando a codificação correta com ``from_encoding``::
+
+ soup = BeautifulSoup(markup, from_encoding="iso-8859-8")
+ soup.h1
+ <h1>םולש</h1>
+ soup.original_encoding
+ 'iso8859-8'
+
+Se você não sabe qual a codificação correta, mas você sabe que o
+`Unicode, Dammit` está errado, você pode passar as opções excluentes
+como ``exclude_encodings``::
+
+ soup = BeautifulSoup(markup, exclude_encodings=["ISO-8859-7"])
+ soup.h1
+ <h1>םולש</h1>
+ soup.original_encoding
+ 'WINDOWS-1255'
+
+Windows-1255 não é 100% correto, mas é um superconjunto compatível com
+ISO-8859-8, portanto é mais próximo do ideal. (``exclude_encodings``
+é uma opção nova no Beautiful Soup 4.4.0.)
+
+Em casos raros (geralmente quando um documento UTF-8 contém texto escrito
+em uma codificação completamente diferente), a única maneira de ser convertido para
+Unicode é convertendo alguns caracteres com o caractere especial Unicode
+"REPLACEMENT CHARACTER" (U+FFFD, �). Se o `Unicode, Dammit` precisar utilizá-lo,
+ele será armazenado no atributo ``.contains_replacement_characters`` como
+``True`` no ``UnicodeDammit`` ou objeto ``BeautifulSoup``. Isso deixa você ciente
+que a representação Unicode não é uma representação exata do original - algum dado
+foi perdido. Se um documento possui �, mas ``.contains_replacement_characters`` é ``False``,
+você poderá concluir então que o � já estava ali originalmente e não representa dados
+perdidos.
+
+Codificação de Saída
+--------------------
+
+Quando um documento é gerado pelo Beautiful Soup, ele é gerado como UTF-8,
+mesmo que o documento não for um UTF-8 de início. Aqui está um documento gerado
+com codificação Latin-1::
+
+ markup = b'''
+ <html>
+ <head>
+ <meta content="text/html; charset=ISO-Latin-1" http-equiv="Content-type" />
+ </head>
+ <body>
+ <p>Sacr\xe9 bleu!</p>
+ </body>
+ </html>
+ '''
+
+ soup = BeautifulSoup(markup)
+ print(soup.prettify())
+ # <html>
+ # <head>
+ # <meta content="text/html; charset=utf-8" http-equiv="Content-type" />
+ # </head>
+ # <body>
+ # <p>
+ # Sacré bleu!
+ # </p>
+ # </body>
+ # </html>
+
+Note que a tag <meta> foi reescrita para refletir o fato que o documento
+é agora um UTF-8.
+
+Se você não quiser um UTF-8, você pode passar a codificação desejada como parâmetro de
+``prettify()``::
+
+ print(soup.prettify("latin-1"))
+ # <html>
+ # <head>
+ # <meta content="text/html; charset=latin-1" http-equiv="Content-type" />
+ # ...
+
+Você também pode chamar encode() no objeto ``BeautifulSoup`` ou em qualquer elemento
+do objeto, assim como se faz em uma string Python::
+
+ soup.p.encode("latin-1")
+ # '<p>Sacr\xe9 bleu!</p>'
+
+ soup.p.encode("utf-8")
+ # '<p>Sacr\xc3\xa9 bleu!</p>'
+
+Qualquer caractere que não pode ser representado na codificação escolhida
+irá ser convertida para uma entidade de referência numérica XML. Abaixo você
+tem um documento que inclui o caractere Unicode SNOWMAN::
+
+ markup = u"<b>\N{SNOWMAN}</b>"
+ snowman_soup = BeautifulSoup(markup)
+ tag = snowman_soup.b
+
+O caractere SNOWMAN faz parte da documentação UTF-8 (algo como
+☃), mas não possui representação para este caractere em ISO-latin-1 ou
+ASCII, portanto ele é convertido para "&#9731" para as essas codificações::
+
+ print(tag.encode("utf-8"))
+ # <b>☃</b>
+
+ print tag.encode("latin-1")
+ # <b>&#9731;</b>
+
+ print tag.encode("ascii")
+ # <b>&#9731;</b>
+
+Unicode, Dammit
+---------------
+
+Você pode usar o `Unicode, Dammit` fora do Beautiful Soup. É útil
+quando você possui dados em uma codificação desconhecida e quer
+simplesmente convertê-la para Unicode::
+
+ from bs4 import UnicodeDammit
+ dammit = UnicodeDammit("Sacr\xc3\xa9 bleu!")
+ print(dammit.unicode_markup)
+ # Sacré bleu!
+ dammit.original_encoding
+ # 'utf-8'
+
+
+As respostas do `Unicode, Dammit` serão um pouco mais precisas se você
+instalar as bibliotecas ``chardet`` ou ``cchardet``. Quanto maior a quantidade
+de dados no arquivo que você passar para o `Unicode, Dammit`, mais precisas serão
+as conversões. Se você possui suas suspeitas sobre qual a codificação original,
+você pode passar as opções em uma lista::
+
+ dammit = UnicodeDammit("Sacr\xe9 bleu!", ["latin-1", "iso-8859-1"])
+ print(dammit.unicode_markup)
+ # Sacré bleu!
+ dammit.original_encoding
+ # 'latin-1'
+
+`Unicode, Dammit` possui duas características que o Beautiful Soup não utiliza.
+
+Smart quotes
+^^^^^^^^^^^^
+
+Você pode utilizar `Unicode, Dammit` para converter Microsoft smart quotes para
+entidades HTML ou XML::
+
+ markup = b"<p>I just \x93love\x94 Microsoft Word\x92s smart quotes</p>"
+
+ UnicodeDammit(markup, ["windows-1252"], smart_quotes_to="html").unicode_markup
+ # u'<p>I just &ldquo;love&rdquo; Microsoft Word&rsquo;s smart quotes</p>'
+
+ UnicodeDammit(markup, ["windows-1252"], smart_quotes_to="xml").unicode_markup
+ # u'<p>I just &#x201C;love&#x201D; Microsoft Word&#x2019;s smart quotes</p>'
+
+Você também pode converter Microsoft smart quotes para ASCII::
+
+ UnicodeDammit(markup, ["windows-1252"], smart_quotes_to="ascii").unicode_markup
+ # u'<p>I just "love" Microsoft Word\'s smart quotes</p>'
+
+Espero que você ache estas características úteis, mas o Beautiful Soup não
+as usa.O Beautiful Soup dá preferência ao comportamento padrão, que é
+converter para caracteres Unicode::
+
+ UnicodeDammit(markup, ["windows-1252"]).unicode_markup
+ # u'<p>I just \u201clove\u201d Microsoft Word\u2019s smart quotes</p>'
+
+Codificação Inconsistente
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Algumas vezes um documento é em sua maioria UTF-8, mas contém caracteres
+Windows-1252 assim como (de novo) Microsoft smart quotes. Isso pode acontecer
+quando um website compostos de dados de muitas fontes diferentes. Você pode
+utilizar ``UnicodeDammit.detwingle()`` para transformar este documento em um
+UTF-8 puro. Aqui está um exemplo::
+
+ snowmen = (u"\N{SNOWMAN}" * 3)
+ quote = (u"\N{LEFT DOUBLE QUOTATION MARK}I like snowmen!\N{RIGHT DOUBLE QUOTATION MARK}")
+ doc = snowmen.encode("utf8") + quote.encode("windows_1252")
+
+Este documento é uma bagunça. O snowmen é um UTF-8 e as aspas são Windows-1252.
+Você pode exibir o snowmen ou as aspas, mas não os dois ao mesmo tempo::
+
+ print(doc)
+ # ☃☃☃�I like snowmen!�
+
+ print(doc.decode("windows-1252"))
+ # ☃☃☃“I like snowmen!”
+
+Decodificar um documento como UTF-8 gera um ``UnicodeDecodeError``, e
+como um Windows-1252 lhe tras algo sem sentido. Felizmente,
+``UnicodeDammit.detwingle()`` irá converter a string para UTF-8 puro,
+permitindo a você decodificá-la para Unicode e exibir o snowmen e as
+aspas simultaneamente::
+
+ new_doc = UnicodeDammit.detwingle(doc)
+ print(new_doc.decode("utf8"))
+ # ☃☃☃“I like snowmen!”
+
+``UnicodeDammit.detwingle()`` sabe apenas como trabalhar com Windows-1252
+contido em UTF-8 (ou vice versa, eu suponho), mas este é o caso mais comum.
+
+Note que você deve chamar ``UnicodeDammit.detwingle()`` em seu dado
+antes de passá-lo para ``BeautifulSoup`` ou para o construtor ``UnicodeDammit``.
+O Beautiful Soup assume que um documento possui apenas uma codificação,
+independente de qual ela seja. Se você passar um documento que
+contém ambos UTF-8 e Windows-1252, é provável que ele pense que todo
+o documento seja Windows-1252, e o documento parecerá ``☃☃☃“I like snowmen!”``.
+
+``UnicodeDammit.detwingle()`` é novo no Beautiful Soup 4.1.0.
+
+Linhas numeradas
+================
+
+Os interpretadores ``html.parser` e ``html5lib`` podem rastrear onde, no
+documento original, cada tag foi encontrada. Você pode acessar esta
+informação através de ``Tag.sourceline`` (número da linha) e ``Tag.sourcepos``
+(posição do início da tag na linha)::
+
+ markup = "<p\n>Paragraph 1</p>\n <p>Paragraph 2</p>"
+ soup = BeautifulSoup(markup, 'html.parser')
+ for tag in soup.find_all('p'):
+ print(tag.sourceline, tag.sourcepos, tag.string)
+ # (1, 0, u'Paragraph 1')
+ # (2, 3, u'Paragraph 2')
+
+Note que os dois interpretadores significam coisas levemente diferentes por
+``sourceline`` e ``sourcepos``. Para html.parser, estes números representam
+a posição do sinal `menor que`inicial. Para html5lib, representa a posição
+do sinal `maior que` final::
+
+ soup = BeautifulSoup(markup, 'html5lib')
+ for tag in soup.find_all('p'):
+ print(tag.sourceline, tag.sourcepos, tag.string)
+ # (2, 1, u'Paragraph 1')
+ # (3, 7, u'Paragraph 2')
+
+Você pode desabilitar esta característica passando ``store_line_numbers=False`
+no construtor ``BeautifulSoup``::
+
+ markup = "<p\n>Paragraph 1</p>\n <p>Paragraph 2</p>"
+ soup = BeautifulSoup(markup, 'html.parser', store_line_numbers=False)
+ soup.p.sourceline
+ # None
+
+Esta característica é nova no 4.8.1 e os analisadores baseados no lxml
+não a suportam.
+
+Comparando objetos por igualdade
+================================
+
+O Beautiful Soup diz que dois objetos ``NavigableString`` ou ``Tag`` são
+iguais quando eles apresentam as mesma marcação HTML ou XML. No exemplo
+abaixo, as duas tags <b> são tratadas como iguais, mesmo estando em partes
+diferentes da árvore do objeto, porque ambas estão como "<b>pizza</b>"::
+
+ markup = "<p>I want <b>pizza</b> and more <b>pizza</b>!</p>"
+ soup = BeautifulSoup(markup, 'html.parser')
+ first_b, second_b = soup.find_all('b')
+ print first_b == second_b
+ # True
+
+ print first_b.previous_element == second_b.previous_element
+ # False
+
+Se você quiser verificar se duas variáveis se referem exatamente ao
+mesmo objeto, use `is`::
+
+ print first_b is second_b
+ # False
+
+Copiando objetos Beautiful Soup
+===============================
+
+Você pode utilizar ``copy.copy()`` para criar uma cópia de qualquer ``Tag`` ou
+``NavigableString``::
+
+ import copy
+ p_copy = copy.copy(soup.p)
+ print p_copy
+ # <p>I want <b>pizza</b> and more <b>pizza</b>!</p>
+
+
+A cópia será considerada igual ao original, desde que ela apresente a mesma
+marcação que o original, mas não será o mesmo objeto::
+
+ print soup.p == p_copy
+ # True
+
+ print soup.p is p_copy
+ # False
+
+A única diferença real é que a cópia é completamente separada da árvore
+original do Beautiful Soup, como se ``extract()`` fosse chamado para ela::
+
+ print p_copy.parent
+ # None
+
+Isso acontece porque dois objetos ``Tag`` diferentes não podem ocupar o mesmo
+espaço ao mesmo tempo.
+
+
+Analisando apenas parte de um documento
+=======================================
+
+Suponhamos que você queira que o Beautiful Soup olhe apenas para as
+tags <a> de um documento. É um desperdício de tempo e memória analisar
+todo o documento e, posteriormente, analisar novamente apenas para buscar
+as tags <a>. Seria muito mais rápido ignorar tudo o que não for <a> em
+primeiro lugar. A classe ``SoupStrainer`` permite que você escolha
+qual partes do documento serão analisadas. Você deverá penas criar uma
+instância de ``SoupStrainer`` e passá-la ao construtor ``BeautifulSoup``
+no argumento ``parse_only``.
+
+(Note que *esta característica não funcionará se você estiver utilizando
+o html5lib*. Se você utilizar o html5lib, todo o documento será analisado.
+Isso acontece porque html5lib constantemente reorganiza a árvore de análise
+e se alguma parte do documento realmente não fizer parte dela, ela irá quebrar.
+Para evitar confusão, no exemplo abaixo, forçarei o Beautiful Soup a usar o
+analisador nativo do Python).
+
+``SoupStrainer``
+----------------
+
+A classe ``SoupStrainer`` recebe os mesmos argumentos que qualquer método em `Buscando na árvore`_: :ref:`name <name>`, :ref:`attrs
+<attrs>`, :ref:`string <string>`, e :ref:`**kwargs <kwargs>`. Aqui temos três objetos ``SoupStrainer`` ::
+
+ from bs4 import SoupStrainer
+
+ only_a_tags = SoupStrainer("a")
+
+ only_tags_with_id_link2 = SoupStrainer(id="link2")
+
+ def is_short_string(string):
+ return len(string) < 10
+
+ only_short_strings = SoupStrainer(string=is_short_string)
+
+Irei trazer de volta o documento "three sisters" mais uma vez e veremos
+como o documento se parece quando é analisado com estes três objetos ``SoupStrainer``
+diferentes::
+
+ html_doc = """
+ <html><head><title>The Dormouse's story</title></head>
+ <body>
+ <p class="title"><b>The Dormouse's story</b></p>
+
+ <p class="story">Once upon a time there were three little sisters; and their names were
+ <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
+ <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
+ <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
+ and they lived at the bottom of a well.</p>
+
+ <p class="story">...</p>
+ """
+
+ print(BeautifulSoup(html_doc, "html.parser", parse_only=only_a_tags).prettify())
+ # <a class="sister" href="http://example.com/elsie" id="link1">
+ # Elsie
+ # </a>
+ # <a class="sister" href="http://example.com/lacie" id="link2">
+ # Lacie
+ # </a>
+ # <a class="sister" href="http://example.com/tillie" id="link3">
+ # Tillie
+ # </a>
+
+ print(BeautifulSoup(html_doc, "html.parser", parse_only=only_tags_with_id_link2).prettify())
+ # <a class="sister" href="http://example.com/lacie" id="link2">
+ # Lacie
+ # </a>
+
+ print(BeautifulSoup(html_doc, "html.parser", parse_only=only_short_strings).prettify())
+ # Elsie
+ # ,
+ # Lacie
+ # and
+ # Tillie
+ # ...
+ #
+
+Você pode também passar um ``SoupStrainer`` em qualquer método coberto em `Buscando na árvore`_.
+Este uso provavelmente não seja muito útil, mas pensei que deveria mencioná-lo::
+
+ soup = BeautifulSoup(html_doc)
+ soup.find_all(only_short_strings)
+ # [u'\n\n', u'\n\n', u'Elsie', u',\n', u'Lacie', u' and\n', u'Tillie',
+ # u'\n\n', u'...', u'\n']
+
+Solucionando Problemas
+======================
+
+.. _diagnose:
+
+``diagnose()``
+--------------
+
+Se você está tendo problemas em entender o que o Beautiful Soup está
+fazendo com um documento, passe o documento pela função ``diagnose()``. (Nova no Beautiful Soup 4.2.0.)
+O Beautiful Soup irá retornar um relatório mostrando como diferentes parsers
+lidam com o documento e irá lhe dizer o Beautiful Soup poderia estar utilizando outro parser::
+
+ from bs4.diagnose import diagnose
+ with open("bad.html") as fp:
+ data = fp.read()
+ diagnose(data)
+
+ # Diagnostic running on Beautiful Soup 4.2.0
+ # Python version 2.7.3 (default, Aug 1 2012, 05:16:07)
+ # I noticed that html5lib is not installed. Installing it may help.
+ # Found lxml version 2.3.2.0
+ #
+ # Trying to parse your data with html.parser
+ # Here's what html.parser did with the document:
+ # ...
+
+Olhando para o que diagnose() retorna, poderá lhe dizer como resolver
+o seu problema. Mesmo que não consiga, você poderá colar a saída de ``diagnose()``
+quando solicitar ajuda.
+
+Erros enquanto se analisa um documento
+--------------------------------------
+
+Existem dois tipos diferentes de erros de análise. Existem quebras
+quando você passa para o Beautiful Soup um documento e ele retorna uma
+exceção, geralmente um ``HTMLParser.HTMLParseError``. E existe o comportamento
+inesperado, quando uma árvore de análise parece um pouco diferente do
+documento usado para criá-la.
+
+Quase nenhum destes problemas são parte do Beautiful Soup. Não é
+porque o Beautiful Soup é maravilhosamente um software bem escrito. É
+porque o Beautiful Soup não inclui nenhum código de análise. Ao invés disso,
+ele depende de analisadores externos. Se um analisador não funciona com
+certo documento, a melhor solução é tentar um analisador diferente. Veja
+:ref:`Instalando um interpretador <parser-installation>` para detalhes e uma comparação entre eles.
+
+Os erros de interpretação mais comuns são ``HTMLParser.HTMLParseError:
+malformed start tag`` e ``HTMLParser.HTMLParseError: bad end
+tag``. Existem dois parsers gerados para o parser built in do Python
+e a solução é :ref:`install lxml ou html5lib. <parser-installation>`
+
+Os tipos de erros de comportamento inesperado mais comuns acontecem
+quando não é encontrada a tag buscada no documento. Você vê a busca
+sendo executada, mas ``find_all()`` retorna ``[]`` ou ``find()`` retorna ``None``.
+Este é um problema comum com o analisador HTML nativo do Python que algumas
+vezes pula tags que ele não entende. Novamente, a solução é
+:ref:`instalar o lxml ou html5lib.<parser-installation>`
+
+Problemas de incompatibilidade de versões
+-----------------------------------------
+
+* ``SyntaxError: Invalid syntax`` (on the line ``ROOT_TAG_NAME =
+ u'[document]'``): Causado por rodar a versão Python 2 do
+ Beautiful Soup no Python 3, sem converter o código.
+
+* ``ImportError: No module named HTMLParser`` - Causado por rodar a
+ versão Python 2 do Beautiful Soup no Python 3.
+
+* ``ImportError: No module named html.parser`` - Causado por rodar a
+ versão Python 3 do Beautiful Soup no Python 2.
+
+* ``ImportError: No module named BeautifulSoup`` - Causado por rodar
+ código do Beautiful Soup 3 em um sistema que não possui o BS3
+ instalado. Ou por escrever código Beautiful Soup 4 sem saber que
+ o nome do pacote é diferente no ``bs4``.
+
+* ``ImportError: No module named bs4`` - Causado por rodar código Beautiful
+ Soup 4 em um sistema que não possui o BS4 instalado.
+
+.. _parsing-xml:
+
+Analisando um XML
+-----------------
+
+Por padrão, o Beautiful Soup analisa documento como HTML. Para analisar um documento
+como XML, passe "xml" como um segundo argumento ao construtor ``BeautifulSoup`` ::
+
+ soup = BeautifulSoup(markup, "xml")
+
+Você precisará ter :ref:` lxml instalado <parser-installation>`.
+
+Outros problemas com analisadores
+---------------------------------
+
+* Se seu script funciona em um computador, mas não em outro,
+ ou em um ambiente virtual mas não em outro, ou fora do ambiente
+ virtual mas não dentro dele, provavelmente porque ambos os ambientes
+ possuem bibliotecas de analisadores difererentes. Por exemplo, você pode
+ ter desenvolvido um script em um computador que possui lxml instalado,
+ e então estar tentando rodá-lo no seu computador que possui apenas html5lib
+ instalado. Veja :ref:`Diferenças entre os interpretadores (parsers) <differences-between-parsers>` para entender porque isso importa,
+ e corrija o problema mencionando uma biblioteca específica no construtor ``BeautifulSoup``.
+
+* Por tags `HTML e atributos serem case-insensitive
+ <http://www.w3.org/TR/html5/syntax.html#syntax>`_, todos os três
+ parsers HTML convertem tags e atributos para lowercase. Isso é,
+ a marcação <TAG></TAG> é convertida para <tag></tag>. Se você quiser
+ preservar a formatação anterior das tags e atributos, você precisará
+ :ref:`analisar o documento como XML. <parsing-xml>`
+
+.. _misc:
+
+Diversos
+--------
+
+* ``UnicodeEncodeError: 'charmap' codec can't encode character
+ u'\xfoo' in position bar`` (ou qualquer outro
+ ``UnicodeEncodeError``) - Este não é um problema do Beautiful Soup.
+ Este problema poderá surgir em duas situações: a primeira quando você
+ tentar imprimir um caractere Unicode que seu console não sabe como
+ exibir. (Veja `Esta página na wiki do Python
+ <http://wiki.python.org/moin/PrintFails>`_ para saber mais.). A segunda,
+ quando você está gravando um arquivo e passa um caractere Unicode que
+ não é suportado pelo seu codificador padrão. Neste caso, a solução mais
+ simples é explicitamente converter a string Unicode em UTF-8 com
+ ``u.encode("utf8")``.
+
+* ``KeyError: [attr]`` - Caused by accessing ``tag['attr']`` quando a
+ tag em questão não define o atributo ``attr``. Os erros mais comuns são
+ ``KeyError: 'href'`` e ``KeyError:
+ 'class'``. Use ``tag.get('attr')`` se você não tem certeza se ``attr`` está
+ definido, assim como você faria em um dicionário Python.
+
+* ``AttributeError: 'ResultSet' object has no attribute 'foo'`` - Isso
+ geralmente ocorre quando você espera que ``find_all()`` retorne
+ uma única tag ou string. Mas ``find_all()`` retorn uma _lista_ de tags
+ e strings--um objeto ``ResultSet``. Você precisa iterar sobre a lista e
+ buscar ``.foo`` para cada um. Ou, se você realmente quiser apenas um resultado,
+ deverá usar ``find()`` ao invés de ``find_all()``.
+
+* ``AttributeError: 'NoneType' object has no attribute 'foo'`` - Isso
+ geralmente acontece quando é chamado ``find()`` e então se tenta acessar
+ o atributo `.foo`` o resultado. Mas no seu caso, ``find()`` não encontra nada,
+ então retorna ``None`` ao invés de retornar uma tag ou uma string. Você precisa
+ descobrir porque ``find()`` não está retornando nada.
+
+Melhorando a performance
+------------------------
+
+O Beautiful Soup nunca será tão rápido quanto os parsers em que
+ele foi construido em cima. Se o tempo de resposta se tornar crítico,
+se você estiver pagando por hora de uso de um computador ou se há
+qualquer outra razão para que o tempo de processamento seja mais
+valioso que o tempo de programação, você deve esquecer o Beautiful Soup
+e trabalhar diretamente em cima do `lxml <http://lxml.de/>`_.
+
+Dito isso, existem algumas coisas que você pode fazer para acelerar o
+Beautiful Soup. Se você não está utilizando o lxml como seu parser,
+meu conselho é que o faça :ref:`start <parser-installation>`.
+O Beautiful Soup analisa documentos significativamente mais rápido
+utilizando o lxml do que usando o html.parser ou html5lib.
+
+Você pode acelerar a detecção da codificação significativamente instalando
+a biblioteca `cchardet <http://pypi.python.org/pypi/cchardet/>`_ .
+
+`Analisando apenas parte de um documento`_ não irá lhe poupar muito tempo de
+análise, mas irá poupar muita memória e fará a `busca` no documento muito
+mais rápida.
+
+Beautiful Soup 3
+================
+
+O Beautiful Soup 3 é a versão anterior e não é mais desenvolvida
+ativamente. Ela atualmente faz parte da maioria das distribuições
+Linux:
+
+:kbd:`$ apt-get install python-beautifulsoup`
+
+Também está publicada no PyPi como ``BeautifulSoup``.:
+
+:kbd:`$ easy_install BeautifulSoup`
+
+:kbd:`$ pip install BeautifulSoup`
+
+Você também pode fazer o `download de um tarball do Beautiful Soup 3.2.0
+<http://www.crummy.com/software/BeautifulSoup/bs3/download/3.x/BeautifulSoup-3.2.0.tar.gz>`_.
+
+Se você rodar ``easy_install beautifulsoup`` ou ``easy_install
+BeautifulSoup``, mas seu código não funcionar, você instalou o Beautiful
+Soup 3 por engano. Você precisa executar ``easy_install beautifulsoup4``.
+
+`A documentação do Beautiful Soup 3 está arquivada online
+<http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html>`_.
+
+Portabilidade de código para BS4
+--------------------------------
+
+A maioria dos códigos escritos em Beautiful Soup 3 irá funcionar no
+Beautiful Soup 4 com uma pequena alteração. Tudo que você precisa
+fazer é alterar o nome do pacote de ``BeautifulSoup`` para ``bs4``. Então::
+
+ from BeautifulSoup import BeautifulSoup
+
+deverá ser assim::
+
+ from bs4 import BeautifulSoup
+
+* Se for gerado um ``ImportError`` "No module named BeautifulSoup", o
+ problema é que você está tentando executar um código Beautiful Soup 3,
+ mas possui apenas o Beautiful Soup 4 instalado.
+
+* Se for gerado um ``ImportError`` "No module named bs4", o problema
+ é que você está tentando executar um código Beautiful Soup 4, mas
+ possui apenas o Beautiful Soup 3 instalado.
+
+Apesar do BS4 ser quase totalmente compativel com BS3, a maioria de seus
+métodos foram depreciados e renomeados para atender o padrão `PEP 8
+<http://www.python.org/dev/peps/pep-0008/>`_. Existem muitas outras
+renomeações e alterações, e algumas delas quebram esta compatibilidade.
+
+Aqui está o que você irá precisar saber para converter seu código BS3 para BS4:
+
+Você precisa de um interpretador (parser)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+O Beautiful Soup 3 utilizava o ``SGMLParser`` do Python, um módulo que
+foi depreciado e removido no Python 3.0. O Beautiful Soup 4 utiliza o
+``html.parser`` por padrão, mas você pode adicionar o lxml ou html5lib
+e utilizá-los como alternativa. Veja :ref:`Instalando um interpretador <parser-installation>` para
+comparação.
+
+Como o ``html.parser`` não é o mesmo analisador que ``SGMLParser``, é possível
+que o Beautiful Soup 4 retorne uma árvore de análise diferente da
+gerada pelo Beautiful Soup 3 para as mesmas marcações. Se você trocar
+``html.parser`` por lxml ou html5lib, você poderá descorbrir que a árvore também
+mudará. Se isso acontecer, você precisará atualizar seu código para lidar com a
+nova árvore.
+
+Nomes dos Métodos
+^^^^^^^^^^^^^^^^^
+
+* ``renderContents`` -> ``encode_contents``
+* ``replaceWith`` -> ``replace_with``
+* ``replaceWithChildren`` -> ``unwrap``
+* ``findAll`` -> ``find_all``
+* ``findAllNext`` -> ``find_all_next``
+* ``findAllPrevious`` -> ``find_all_previous``
+* ``findNext`` -> ``find_next``
+* ``findNextSibling`` -> ``find_next_sibling``
+* ``findNextSiblings`` -> ``find_next_siblings``
+* ``findParent`` -> ``find_parent``
+* ``findParents`` -> ``find_parents``
+* ``findPrevious`` -> ``find_previous``
+* ``findPreviousSibling`` -> ``find_previous_sibling``
+* ``findPreviousSiblings`` -> ``find_previous_siblings``
+* ``getText`` -> ``get_text``
+* ``nextSibling`` -> ``next_sibling``
+* ``previousSibling`` -> ``previous_sibling``
+
+Alguns argumentos do construtor do Beautiful Soup foram renomeados pelas
+mesmas razões:
+
+* ``BeautifulSoup(parseOnlyThese=...)`` -> ``BeautifulSoup(parse_only=...)``
+* ``BeautifulSoup(fromEncoding=...)`` -> ``BeautifulSoup(from_encoding=...)``
+
+Eu renomeei um método para compatibilidade com Python 3:
+
+* ``Tag.has_key()`` -> ``Tag.has_attr()``
+
+Eu renomeei um atributo para utilizar uma terminologia mais precisa:
+
+* ``Tag.isSelfClosing`` -> ``Tag.is_empty_element``
+
+Eu renomeei três atributos para evitar utilizar palavras reservadas do
+Python. Ao contrário das outras, estas alterações *não são compativeis com
+versões anteriores.* Se você utilizar estes atributos no BS3, seu código
+irá quebrar no BS4 até você corrigí-los.
+
+* ``UnicodeDammit.unicode`` -> ``UnicodeDammit.unicode_markup``
+* ``Tag.next`` -> ``Tag.next_element``
+* ``Tag.previous`` -> ``Tag.previous_element``
+
+Geradores
+^^^^^^^^^
+
+Eu dei nomes aos geradores de acordo com o PEP-8 e transformei-os
+em propriedades:
+
+* ``childGenerator()`` -> ``children``
+* ``nextGenerator()`` -> ``next_elements``
+* ``nextSiblingGenerator()`` -> ``next_siblings``
+* ``previousGenerator()`` -> ``previous_elements``
+* ``previousSiblingGenerator()`` -> ``previous_siblings``
+* ``recursiveChildGenerator()`` -> ``descendants``
+* ``parentGenerator()`` -> ``parents``
+
+Então, ao invés de::
+
+ for parent in tag.parentGenerator():
+ ...
+
+Você pode escrever::
+
+ for parent in tag.parents:
+ ...
+
+(Mas a versão antiga ainda funcionará.)
+
+Alguns dos geradores eram utilizados para gerar ``None`` após
+finalizado e então parar. Isso era um bug. Agora os geradores
+apenas param.
+
+Existem dois novos geradores, :ref:`.strings e
+.stripped_strings <string-generators>`. ``.strings`` gera objetos
+NavigableString, e ``.stripped_strings`` gera strings Python com
+espaços em branco removidos.
+
+XML
+^^^
+Não existe mais uma classe ``BeautifulStoneSoup`` para analisar XML. Para
+analisar XML você deverá passar "xml" como segundo argumento ao construtor
+``BeautifulSoup``. Pela mesma razão, o construtor ``BeautifulSoup`` não
+reconhece mais o argumento ``isHTML``.
+
+A manipulação do Beautiful Soup's de tags XML vazias foi melhorada.
+Anteriormente, quando você analisava um XML, deveria explicitamente
+dizer quais tags seriam consideradas elementos de tag vazios. O
+argumento ``selfClosingTags`` não é mais reconhecido. Ao invés disso,
+o Beautiful Soup considera qualquer tag vazia como um elemento de tag vazia.
+Se você adicionar uma filha a um elemento de tag vazia, ela deixará de ser vazia.
+
+Entidades
+^^^^^^^^^
+
+Uma entidade HTML ou XML de entrada é sempre convertida em
+seu caractere Unicode correspondente. O Beautiful Soup 3 possuia
+inúmeras maneiras redundantes de lidar com entidades, as quais foram
+removidas. O construtor ``BeautifulSoup`` não reconhece mais os argumentos
+``smartQuotesTo`` ou ``convertEntities``. (`Unicode,
+Dammit`_ ainda possui ``smart_quotes_to``, mas seu padrão agora é converter
+smart quotes em Unicode.) As constantes ``HTML_ENTITIES``,
+``XML_ENTITIES``, e ``XHTML_ENTITIES`` foram removidas, desde que elas
+se referiam a uma feature (transformar algumas, mas não todas as entidades
+em caracteres Unicode) que não existe mais.
+Se você quiser transformar caracteres Unicode novamente em entidades HTML
+na saída, ao invés de transformá-las em caracteres UTF-8, você precisará
+utilizar um :ref:`output formatter <output_formatters>`.
+
+Variados
+^^^^^^^^
+
+:ref:`Tag.string <.string>` agora opera recursivamente. Se a tag A
+contém apenas uma tag B e nada mais, então A.string é o mesmo que
+B.string. (Anteriormente era None)
+
+`Atributos com múltiplos valores`_ como ``class`` possuem listas de strings
+como valores e não strings. Isso deverá afetar a maneira que você buscará
+por classes CSS.
+
+Se você passar um dos métodos ``find*``, ambos :ref:`string <string>` `e`
+um argumento específico de uma tag como :ref:`name <name>`, o Beautiful Soup
+irá buscar por tags que atentem o seu critério de argumento específico e que
+:ref:`Tag.string <.string>` atenda o valor para :ref:`string <string>`. Isso
+`não` irá encontrar as strings por si. Anteriormente, Beautiful Soup ignorava
+o argumento específico de uma tag e olhava apenas para as strings.
+
+O construtor ``BeautifulSoup`` não reconhece mais o argumento `markupMassage`.
+É agora responsabilidade do parser de manipular a marcação corretamente.
+
+As classes raramente usadas do analisador como
+``ICantBelieveItsBeautifulSoup`` e ``BeautifulSOAP`` foram removidas.
+é agora decisão do analisador como manipular marcações ambiguas.
+
+O método ``prettify()`` agora retorna uma string Unicode, e não bytestring.
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ru/Makefile b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ru/Makefile
new file mode 100644
index 00000000000..8c833d2cedb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ru/Makefile
@@ -0,0 +1,130 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS =
+SPHINXBUILD = sphinx-build
+PAPER =
+BUILDDIR = build
+
+# Internal variables.
+PAPEROPT_a4 = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
+
+help:
+ @echo "Please use \`make <target>' where <target> is one of"
+ @echo " html to make standalone HTML files"
+ @echo " dirhtml to make HTML files named index.html in directories"
+ @echo " singlehtml to make a single large HTML file"
+ @echo " pickle to make pickle files"
+ @echo " json to make JSON files"
+ @echo " htmlhelp to make HTML files and a HTML help project"
+ @echo " qthelp to make HTML files and a qthelp project"
+ @echo " devhelp to make HTML files and a Devhelp project"
+ @echo " epub to make an epub"
+ @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+ @echo " latexpdf to make LaTeX files and run them through pdflatex"
+ @echo " text to make text files"
+ @echo " man to make manual pages"
+ @echo " changes to make an overview of all changed/added/deprecated items"
+ @echo " linkcheck to check all external links for integrity"
+ @echo " doctest to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+ -rm -rf $(BUILDDIR)/*
+
+html:
+ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+ $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+ $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+ @echo
+ @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+ $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+ @echo
+ @echo "Build finished; now you can process the pickle files."
+
+json:
+ $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+ @echo
+ @echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+ $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+ @echo
+ @echo "Build finished; now you can run HTML Help Workshop with the" \
+ ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+ $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+ @echo
+ @echo "Build finished; now you can run "qcollectiongenerator" with the" \
+ ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+ @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/BeautifulSoup.qhcp"
+ @echo "To view the help file:"
+ @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/BeautifulSoup.qhc"
+
+devhelp:
+ $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+ @echo
+ @echo "Build finished."
+ @echo "To view the help file:"
+ @echo "# mkdir -p $$HOME/.local/share/devhelp/BeautifulSoup"
+ @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/BeautifulSoup"
+ @echo "# devhelp"
+
+epub:
+ $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+ @echo
+ @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo
+ @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+ @echo "Run \`make' in that directory to run these through (pdf)latex" \
+ "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo "Running LaTeX files through pdflatex..."
+ make -C $(BUILDDIR)/latex all-pdf
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+ $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+ @echo
+ @echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+ $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+ @echo
+ @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+changes:
+ $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+ @echo
+ @echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+ $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+ @echo
+ @echo "Link check complete; look for any errors in the above output " \
+ "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+ $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+ @echo "Testing of doctests in the sources finished, look at the " \
+ "results in $(BUILDDIR)/doctest/output.txt."
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ru/source/6.1.jpg b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ru/source/6.1.jpg
new file mode 100644
index 00000000000..97014f0ec04
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ru/source/6.1.jpg
Binary files differ
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ru/source/bs4ru.rst b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ru/source/bs4ru.rst
new file mode 100644
index 00000000000..f39a6e82986
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ru/source/bs4ru.rst
@@ -0,0 +1,3360 @@
+Документация Beautiful Soup
+===========================
+
+.. image:: 6.1.jpg
+ :align: right
+ :alt: "Лакей Карась начал с того, что вытащил из-под мышки огромный конверт (чуть ли не больше его самого)."
+
+`Beautiful Soup <http://www.crummy.com/software/BeautifulSoup/>`_ — это
+библиотека Python для извлечения данных из файлов HTML и XML. Она работает
+с вашим любимым парсером, чтобы дать вам естественные способы навигации,
+поиска и изменения дерева разбора. Она обычно экономит программистам
+часы и дни работы.
+
+Эти инструкции иллюстрируют все основные функции Beautiful Soup 4
+на примерах. Я покажу вам, для чего нужна библиотека, как она работает,
+как ее использовать, как заставить ее делать то, что вы хотите, и что нужно делать, когда она
+не оправдывает ваши ожидания.
+
+Примеры в этой документации работают одинаково на Python 2.7
+и Python 3.2.
+
+Возможно, вы ищете документацию для `Beautiful Soup 3
+<http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html>`_.
+Если это так, имейте в виду, что Beautiful Soup 3 больше не
+развивается, и что поддержка этой версии будет прекращена
+31 декабря 2020 года или немногим позже. Если вы хотите узнать о различиях между Beautiful Soup 3
+и Beautiful Soup 4, читайте раздел `Перенос кода на BS4`_.
+
+Эта документация переведена на другие языки
+пользователями Beautiful Soup:
+
+* `这篇文档当然还有中文版. <https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/>`_
+* このページは日本語で利用できます(`外部リンク <http://kondou.com/BS4/>`_)
+* `이 문서는 한국어 번역도 가능합니다. <https://www.crummy.com/software/BeautifulSoup/bs4/doc.ko/>`_
+* `Este documento também está disponível em Português do Brasil. <https://www.crummy.com/software/BeautifulSoup/bs4/doc.ptbr/>`_
+
+
+Техническая поддержка
+---------------------
+
+Если у вас есть вопросы о Beautiful Soup или возникли проблемы,
+`отправьте сообщение в дискуссионную группу
+<https://groups.google.com/forum/?fromgroups#!forum/beautifulsoup>`_. Если
+ваша проблема связана с разбором HTML-документа, не забудьте упомянуть,
+:ref:`что говорит о нем функция diagnose() <diagnose>`.
+
+Быстрый старт
+=============
+
+Вот HTML-документ, который я буду использовать в качестве примера в этой
+документации. Это фрагмент из `«Алисы в стране чудес»`::
+
+ html_doc = """
+ <html><head><title>The Dormouse's story</title></head>
+ <body>
+ <p class="title"><b>The Dormouse's story</b></p>
+
+ <p class="story">Once upon a time there were three little sisters; and their names were
+ <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
+ <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
+ <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
+ and they lived at the bottom of a well.</p>
+
+ <p class="story">...</p>
+ """
+
+Прогон документа через Beautiful Soup дает нам
+объект ``BeautifulSoup``, который представляет документ в виде
+вложенной структуры данных::
+
+ from bs4 import BeautifulSoup
+ soup = BeautifulSoup (html_doc, 'html.parser')
+
+ print(soup.prettify())
+ # <html>
+ # <head>
+ # <title>
+ # The Dormouse's story
+ # </title>
+ # </head>
+ # <body>
+ # <p class="title">
+ # <b>
+ # The Dormouse's story
+ # </b>
+ # </p>
+ # <p class="story">
+ # Once upon a time there were three little sisters; and their names were
+ # <a class="sister" href="http://example.com/elsie" id="link1">
+ # Elsie
+ # </a>
+ # ,
+ # <a class="sister" href="http://example.com/lacie" id="link2">
+ # Lacie
+ # </a>
+ # and
+ # <a class="sister" href="http://example.com/tillie" id="link3">
+ # Tillie
+ # </a>
+ # ; and they lived at the bottom of a well.
+ # </p>
+ # <p class="story">
+ # ...
+ # </p>
+ # </body>
+ # </html>
+
+Вот несколько простых способов навигации по этой структуре данных::
+
+ soup.title
+ # <title>The Dormouse's story</title>
+
+ soup.title.name
+ # u'title'
+
+ soup.title.string
+ # u'The Dormouse's story'
+
+ soup.title.parent.name
+ # u'head'
+
+ soup.p
+ # <p class="title"><b>The Dormouse's story</b></p>
+
+ soup.p['class']
+ # u'title'
+
+ soup.a
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+ soup.find_all('a')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.find(id="link3")
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
+
+Одна из распространенных задач — извлечь все URL-адреса, найденные на странице в тегах <a>::
+
+ for link in soup.find_all('a'):
+ print(link.get('href'))
+ # http://example.com/elsie
+ # http://example.com/lacie
+ # http://example.com/tillie
+
+Другая распространенная задача — извлечь весь текст со страницы::
+
+ print(soup.get_text())
+ # The Dormouse's story
+ #
+ # The Dormouse's story
+ #
+ # Once upon a time there were three little sisters; and their names were
+ # Elsie,
+ # Lacie and
+ # Tillie;
+ # and they lived at the bottom of a well.
+ #
+ # ...
+
+Это похоже на то, что вам нужно? Если да, продолжайте читать.
+
+Установка Beautiful Soup
+========================
+
+Если вы используете последнюю версию Debian или Ubuntu Linux, вы можете
+установить Beautiful Soup с помощью системы управления пакетами:
+
+:kbd:`$ apt-get install python-bs4` (для Python 2)
+
+:kbd:`$ apt-get install python3-bs4` (для Python 3)
+
+Beautiful Soup 4 публикуется через PyPi, поэтому, если вы не можете установить библиотеку
+с помощью системы управления пакетами, можно установить с помощью ``easy_install`` или
+``pip``. Пакет называется ``beautifulsoup4``. Один и тот же пакет
+работает как на Python 2, так и на Python 3. Убедитесь, что вы используете версию
+``pip`` или ``easy_install``, предназначенную для вашей версии Python (их можно назвать
+``pip3`` и ``easy_install3`` соответственно, если вы используете Python 3).
+
+:kbd:`$ easy_install beautifulsoup4`
+
+:kbd:`$ pip install beautifulsoup4`
+
+(``BeautifulSoup`` — это, скорее всего, `не тот` пакет, который вам нужен. Это
+предыдущий основной релиз, `Beautiful Soup 3`_. Многие программы используют
+BS3, так что он все еще доступен, но если вы пишете новый код,
+нужно установить ``beautifulsoup4``.)
+
+Если у вас не установлены ``easy_install`` или ``pip``, вы можете
+`скачать архив с исходным кодом Beautiful Soup 4
+<http://www.crummy.com/software/BeautifulSoup/download/4.x/>`_ и
+установить его с помощью ``setup.py``.
+
+:kbd:`$ python setup.py install`
+
+Если ничего не помогает, лицензия на Beautiful Soup позволяет
+упаковать библиотеку целиком вместе с вашим приложением. Вы можете скачать
+tar-архив, скопировать из него в кодовую базу вашего приложения каталог ``bs4``
+и использовать Beautiful Soup, не устанавливая его вообще.
+
+Я использую Python 2.7 и Python 3.2 для разработки Beautiful Soup, но библиотека
+должна работать и с более поздними версиями Python.
+
+Проблемы после установки
+------------------------
+
+Beautiful Soup упакован как код Python 2. Когда вы устанавливаете его для
+использования с Python 3, он автоматически конвертируется в код Python 3. Если
+вы не устанавливаете библиотеку в виде пакета, код не будет сконвертирован. Были
+также сообщения об установке неправильной версии на компьютерах с
+Windows.
+
+Если выводится сообщение ``ImportError`` "No module named HTMLParser", ваша
+проблема в том, что вы используете версию кода на Python 2, работая на
+Python 3.
+
+Если выводится сообщение ``ImportError`` "No module named html.parser", ваша
+проблема в том, что вы используете версию кода на Python 3, работая на
+Python 2.
+
+В обоих случаях лучше всего полностью удалить Beautiful
+Soup с вашей системы (включая любой каталог, созданный
+при распаковке tar-архива) и запустить установку еще раз.
+
+Если выводится сообщение ``SyntaxError`` "Invalid syntax" в строке
+``ROOT_TAG_NAME = u'[document]'``, вам нужно конвертировать код из Python 2
+в Python 3. Вы можете установить пакет:
+
+:kbd:`$ python3 setup.py install`
+
+или запустить вручную Python-скрипт ``2to3``
+в каталоге ``bs4``:
+
+:kbd:`$ 2to3-3.2 -w bs4`
+
+.. _parser-installation:
+
+
+Установка парсера
+-----------------
+
+Beautiful Soup поддерживает парсер HTML, включенный в стандартную библиотеку Python,
+а также ряд сторонних парсеров на Python.
+Одним из них является `парсер lxml <http://lxml.de/>`_. В зависимости от ваших настроек,
+вы можете установить lxml с помощью одной из следующих команд:
+
+:kbd:`$ apt-get install python-lxml`
+
+:kbd:`$ easy_install lxml`
+
+:kbd:`$ pip install lxml`
+
+Другая альтернатива — написанный исключительно на Python `парсер html5lib
+<http://code.google.com/p/html5lib/>`_, который разбирает HTML таким же образом,
+как это делает веб-браузер. В зависимости от ваших настроек, вы можете установить html5lib
+с помощью одной из этих команд:
+
+:kbd:`$ apt-get install python-html5lib`
+
+:kbd:`$ easy_install html5lib`
+
+:kbd:`$ pip install html5lib`
+
+Эта таблица суммирует преимущества и недостатки каждого парсера:
+
++----------------------+--------------------------------------------+--------------------------------+--------------------------+
+| Парсер | Типичное использование | Преимущества | Недостатки |
++----------------------+--------------------------------------------+--------------------------------+--------------------------+
+| html.parser от Python| ``BeautifulSoup(markup, "html.parser")`` | * Входит в комплект | * Не такой быстрый, как |
+| | | * Приличная скорость | lxml, более строгий, |
+| | | * Нестрогий (по крайней мере, | чем html5lib. |
+| | | в Python 2.7.3 и 3.2.) | |
++----------------------+--------------------------------------------+--------------------------------+--------------------------+
+| HTML-парсер в lxml | ``BeautifulSoup(markup, "lxml")`` | * Очень быстрый | * Внешняя зависимость |
+| | | * Нестрогий | от C |
++----------------------+--------------------------------------------+--------------------------------+--------------------------+
+| XML-парсер в lxml | ``BeautifulSoup(markup, "lxml-xml")`` | * Очень быстрый | * Внешняя зависимость |
+| | ``BeautifulSoup(markup, "xml")`` | * Единственный XML-парсер, | от C |
+| | | который сейчас поддерживается| |
++----------------------+--------------------------------------------+--------------------------------+--------------------------+
+| html5lib | ``BeautifulSoup(markup, "html5lib")`` | * Очень нестрогий | * Очень медленный |
+| | | * Разбирает страницы так же, | * Внешняя зависимость |
+| | | как это делает браузер | от Python |
+| | | * Создает валидный HTML5 | |
++----------------------+--------------------------------------------+--------------------------------+--------------------------+
+
+Я рекомендую по возможности установить и использовать lxml для быстродействия. Если вы
+используете версию Python 2 более раннюю, чем 2.7.3, или версию Python 3
+более раннюю, чем 3.2.2, `необходимо` установить lxml или
+html5lib, потому что встроенный в Python парсер HTML просто недостаточно хорош в старых
+версиях.
+
+Обратите внимание, что если документ невалиден, различные парсеры будут генерировать
+дерево Beautiful Soup для этого документа по-разному. Ищите подробности в разделе `Различия
+между парсерами`_.
+
+Приготовление супа
+==================
+
+Чтобы разобрать документ, передайте его в
+конструктор ``BeautifulSoup``. Вы можете передать строку или открытый дескриптор файла::
+
+ from bs4 import BeautifulSoup
+
+ with open("index.html") as fp:
+ soup = BeautifulSoup(fp)
+
+ soup = BeautifulSoup("<html>data</html>")
+
+Первым делом документ конвертируется в Unicode, а HTML-мнемоники
+конвертируются в символы Unicode::
+
+ BeautifulSoup("Sacr&eacute; bleu!")
+ <html><head></head><body>Sacré bleu!</body></html>
+
+Затем Beautiful Soup анализирует документ, используя лучший из доступных
+парсеров. Библиотека будет использовать HTML-парсер, если вы явно не укажете,
+что нужно использовать XML-парсер. (См. `Разбор XML`_.)
+
+Виды объектов
+=============
+
+Beautiful Soup превращает сложный HTML-документ в сложное дерево
+объектов Python. Однако вам придется иметь дело только с четырьмя
+`видами` объектов: ``Tag``, ``NavigableString``, ``BeautifulSoup``
+и ``Comment``.
+
+.. _Tag:
+
+``Tag``
+-------
+
+Объект ``Tag`` соответствует тегу XML или HTML в исходном документе::
+
+ soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
+ tag = soup.b
+ type(tag)
+ # <class 'bs4.element.Tag'>
+
+У объекта Tag (далее «тег») много атрибутов и методов, и я расскажу о большинстве из них
+в разделах `Навигация по дереву`_ и `Поиск по дереву`_. На данный момент наиболее
+важными особенностями тега являются его имя и атрибуты.
+
+Имя
+^^^
+
+У каждого тега есть имя, доступное как ``.name``::
+
+ tag.name
+ # u'b'
+
+Если вы измените имя тега, это изменение будет отражено в любой HTML-
+разметке, созданной Beautiful Soup::
+
+ tag.name = "blockquote"
+ tag
+ # <blockquote class="boldest">Extremely bold</blockquote>
+
+Атрибуты
+^^^^^^^^
+
+У тега может быть любое количество атрибутов. Тег ``<b
+id = "boldest">`` имеет атрибут "id", значение которого равно
+"boldest". Вы можете получить доступ к атрибутам тега, обращаясь с тегом как
+со словарем::
+
+ tag['id']
+ # u'boldest'
+
+Вы можете получить доступ к этому словарю напрямую как к ``.attrs``::
+
+ tag.attrs
+ # {u'id': 'boldest'}
+
+Вы можете добавлять, удалять и изменять атрибуты тега. Опять же, это
+делается путем обращения с тегом как со словарем::
+
+ tag['id'] = 'verybold'
+ tag['another-attribute'] = 1
+ tag
+ # <b another-attribute="1" id="verybold"></b>
+
+ del tag['id']
+ del tag['another-attribute']
+ tag
+ # <b></b>
+
+ tag['id']
+ # KeyError: 'id'
+ print(tag.get('id'))
+ # None
+
+.. _multivalue:
+
+Многозначные атрибуты
+&&&&&&&&&&&&&&&&&&&&&
+
+В HTML 4 определено несколько атрибутов, которые могут иметь множество значений. В HTML 5
+пара таких атрибутов удалена, но определено еще несколько. Самый распространённый из
+многозначных атрибутов — это ``class`` (т. е. тег может иметь более
+одного класса CSS). Среди прочих ``rel``, ``rev``, ``accept-charset``,
+``headers`` и ``accesskey``. Beautiful Soup представляет значение(я)
+многозначного атрибута в виде списка::
+
+ css_soup = BeautifulSoup('<p class="body"></p>')
+ css_soup.p['class']
+ # ["body"]
+
+ css_soup = BeautifulSoup('<p class="body strikeout"></p>')
+ css_soup.p['class']
+ # ["body", "strikeout"]
+
+Если атрибут `выглядит` так, будто он имеет более одного значения, но это не
+многозначный атрибут, определенный какой-либо версией HTML-
+стандарта, Beautiful Soup оставит атрибут как есть::
+
+ id_soup = BeautifulSoup('<p id="my id"></p>')
+ id_soup.p['id']
+ # 'my id'
+
+Когда вы преобразовываете тег обратно в строку, несколько значений атрибута
+объединяются::
+
+ rel_soup = BeautifulSoup('<p>Back to the <a rel="index">homepage</a></p>')
+ rel_soup.a['rel']
+ # ['index']
+ rel_soup.a['rel'] = ['index', 'contents']
+ print(rel_soup.p)
+ # <p>Back to the <a rel="index contents">homepage</a></p>
+
+Вы можете отключить объединение, передав ``multi_valued_attributes = None`` в качестве
+именованного аргумента в конструктор ``BeautifulSoup``::
+
+ no_list_soup = BeautifulSoup('<p class="body strikeout"></p>', 'html', multi_valued_attributes=None)
+ no_list_soup.p['class']
+ # u'body strikeout'
+
+Вы можете использовать ``get_attribute_list``, того чтобы получить значение в виде списка,
+независимо от того, является ли атрибут многозначным или нет::
+
+ id_soup.p.get_attribute_list('id')
+ # ["my id"]
+
+Если вы разбираете документ как XML, многозначных атрибутов не будет::
+
+ xml_soup = BeautifulSoup('<p class="body strikeout"></p>', 'xml')
+ xml_soup.p['class']
+ # u'body strikeout'
+
+Опять же, вы можете поменять настройку, используя аргумент ``multi_valued_attributes``::
+
+ class_is_multi= { '*' : 'class'}
+ xml_soup = BeautifulSoup('<p class="body strikeout"></p>', 'xml', multi_valued_attributes=class_is_multi)
+ xml_soup.p['class']
+ # [u'body', u'strikeout']
+
+Вряд ли вам это пригодится, но если все-таки будет нужно, руководствуйтесь значениями
+по умолчанию. Они реализуют правила, описанные в спецификации HTML::
+
+ from bs4.builder import builder_registry
+ builder_registry.lookup('html').DEFAULT_CDATA_LIST_ATTRIBUTES
+
+
+``NavigableString``
+-------------------
+
+Строка соответствует фрагменту текста в теге. Beautiful Soup
+использует класс ``NavigableString`` для хранения этих фрагментов текста::
+
+ tag.string
+ # u'Extremely bold'
+ type(tag.string)
+ # <class 'bs4.element.NavigableString'>
+
+``NavigableString`` похожа на строку Unicode в Python, не считая того,
+что она также поддерживает некоторые функции, описанные в
+разделах `Навигация по дереву`_ и `Поиск по дереву`_. Вы можете конвертировать
+``NavigableString`` в строку Unicode с помощью ``unicode()``::
+
+ unicode_string = unicode(tag.string)
+ unicode_string
+ # u'Extremely bold'
+ type(unicode_string)
+ # <type 'unicode'>
+
+Вы не можете редактировать строку непосредственно, но вы можете заменить одну строку
+другой, используя :ref:`replace_with()`::
+
+ tag.string.replace_with("No longer bold")
+ tag
+ # <blockquote>No longer bold</blockquote>
+
+``NavigableString`` поддерживает большинство функций, описанных в
+разделах `Навигация по дереву`_ и `Поиск по дереву`_, но
+не все. В частности, поскольку строка не может ничего содержать (в том смысле,
+в котором тег может содержать строку или другой тег), строки не поддерживают
+атрибуты ``.contents`` и ``.string`` или метод ``find()``.
+
+Если вы хотите использовать ``NavigableString`` вне Beautiful Soup,
+вам нужно вызвать метод ``unicode()``, чтобы превратить ее в обычную для Python
+строку Unicode. Если вы этого не сделаете, ваша строка будет тащить за собой
+ссылку на все дерево разбора Beautiful Soup, даже когда вы
+закончите использовать Beautiful Soup. Это большой расход памяти.
+
+``BeautifulSoup``
+-----------------
+
+Объект ``BeautifulSoup`` представляет разобранный документ как единое
+целое. В большинстве случаев вы можете рассматривать его как объект
+:ref:`Tag`. Это означает, что он поддерживает большинство методов, описанных
+в разделах `Навигация по дереву`_ и `Поиск по дереву`_.
+
+Вы также можете передать объект ``BeautifulSoup`` в один из методов,
+перечисленных в разделе `Изменение дерева`_, по аналогии с передачей объекта :ref:`Tag`. Это
+позволяет вам делать такие вещи, как объединение двух разобранных документов::
+
+ doc = BeautifulSoup("<document><content/>INSERT FOOTER HERE</document", "xml")
+ footer = BeautifulSoup("<footer>Here's the footer</footer>", "xml")
+ doc.find(text="INSERT FOOTER HERE").replace_with(footer)
+ # u'INSERT FOOTER HERE'
+ print(doc)
+ # <?xml version="1.0" encoding="utf-8"?>
+ # <document><content/><footer>Here's the footer</footer></document>
+
+Поскольку объект ``BeautifulSoup`` не соответствует действительному
+HTML- или XML-тегу, у него нет имени и атрибутов. Однако иногда
+бывает полезно взглянуть на ``.name`` объекта ``BeautifulSoup``, поэтому ему было присвоено специальное «имя»
+``.name`` "[document]"::
+
+ soup.name
+ # u'[document]'
+
+Комментарии и другие специфичные строки
+---------------------------------------
+
+``Tag``, ``NavigableString`` и ``BeautifulSoup`` охватывают почти
+все, с чем вы столкнётесь в файле HTML или XML, но осталось
+ещё немного. Пожалуй, единственное, о чем стоит волноваться,
+это комментарий::
+
+ markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>"
+ soup = BeautifulSoup(markup)
+ comment = soup.b.string
+ type(comment)
+ # <class 'bs4.element.Comment'>
+
+Объект ``Comment`` — это просто особый тип ``NavigableString``::
+
+ comment
+ # u'Hey, buddy. Want to buy a used parser'
+
+Но когда он появляется как часть HTML-документа, ``Comment``
+отображается со специальным форматированием::
+
+ print(soup.b.prettify())
+ # <b>
+ # <!--Hey, buddy. Want to buy a used parser?-->
+ # </b>
+
+Beautiful Soup определяет классы для всего, что может появиться в
+XML-документе: ``CData``, ``ProcessingInstruction``,
+``Declaration`` и ``Doctype``. Как и ``Comment``, эти классы
+являются подклассами ``NavigableString``, которые добавляют что-то еще к
+строке. Вот пример, который заменяет комментарий блоком
+CDATA::
+
+ from bs4 import CData
+ cdata = CData("A CDATA block")
+ comment.replace_with(cdata)
+
+ print(soup.b.prettify())
+ # <b>
+ # <![CDATA[A CDATA block]]>
+ # </b>
+
+
+Навигация по дереву
+===================
+
+Вернемся к HTML-документу с фрагментом из «Алисы в стране чудес»::
+
+ html_doc = """
+ <html><head><title>The Dormouse's story</title></head>
+ <body>
+ <p class="title"><b>The Dormouse's story</b></p>
+
+ <p class="story">Once upon a time there were three little sisters; and their names were
+ <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
+ <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
+ <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
+ and they lived at the bottom of a well.</p>
+
+ <p class="story">...</p>
+ """
+
+ from bs4 import BeautifulSoup
+ soup = BeautifulSoup (html_doc, 'html.parser')
+
+Я буду использовать его в качестве примера, чтобы показать, как перейти от одной части
+документа к другой.
+
+Проход сверху вниз
+------------------
+
+Теги могут содержать строки и другие теги. Эти элементы являются
+дочерними (`children`) для тега. Beautiful Soup предоставляет множество различных атрибутов для
+навигации и перебора дочерних элементов.
+
+Обратите внимание, что строки Beautiful Soup не поддерживают ни один из этих
+атрибутов, потому что строка не может иметь дочерних элементов.
+
+Навигация с использованием имен тегов
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Самый простой способ навигации по дереву разбора — это указать имя
+тега, который вам нужен. Если вы хотите получить тег <head>, просто напишите ``soup.head``::
+
+ soup.head
+ # <head><title>The Dormouse's story</title></head>
+
+ soup.title
+ # <title>The Dormouse's story</title>
+
+Вы можете повторять этот трюк многократно, чтобы подробнее рассмотреть определенную часть
+дерева разбора. Следующий код извлекает первый тег <b> внутри тега <body>::
+
+ soup.body.b
+ # <b>The Dormouse's story</b>
+
+Использование имени тега в качестве атрибута даст вам только `первый` тег с таким
+именем::
+
+ soup.a
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+Если вам нужно получить `все` теги <a> или что-нибудь более сложное,
+чем первый тег с определенным именем, вам нужно использовать один из
+методов, описанных в разделе `Поиск по дереву`_, такой как `find_all()`::
+
+ soup.find_all('a')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+``.contents`` и ``.children``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Дочерние элементы доступны в списке под названием ``.contents``::
+
+ head_tag = soup.head
+ head_tag
+ # <head><title>The Dormouse's story</title></head>
+
+ head_tag.contents
+ [<title>The Dormouse's story</title>]
+
+ title_tag = head_tag.contents[0]
+ title_tag
+ # <title>The Dormouse's story</title>
+ title_tag.contents
+ # [u'The Dormouse's story']
+
+Сам объект ``BeautifulSoup`` имеет дочерние элементы. В этом случае
+тег <html> является дочерним для объекта ``BeautifulSoup``::
+
+ len(soup.contents)
+ # 1
+ soup.contents[0].name
+ # u'html'
+
+У строки нет ``.contents``, потому что она не может содержать
+ничего::
+
+ text = title_tag.contents[0]
+ text.contents
+ # AttributeError: У объекта 'NavigableString' нет атрибута 'contents'
+
+Вместо того, чтобы получать дочерние элементы в виде списка, вы можете перебирать их
+с помощью генератора ``.children``::
+
+ for child in title_tag.children:
+ print(child)
+ # The Dormouse's story
+
+``.descendants``
+^^^^^^^^^^^^^^^^
+
+Атрибуты ``.contents`` и ``.children`` применяются только в отношении
+`непосредственных` дочерних элементов тега. Например, тег <head> имеет только один непосредственный
+дочерний тег <title>::
+
+ head_tag.contents
+ # [<title>The Dormouse's story</title>]
+
+Но у самого тега <title> есть дочерний элемент: строка "The Dormouse's
+story". В некотором смысле эта строка также является дочерним элементом
+тега <head>. Атрибут ``.descendants`` позволяет перебирать `все`
+дочерние элементы тега рекурсивно: его непосредственные дочерние элементы, дочерние элементы
+дочерних элементов и так далее::
+
+ for child in head_tag.descendants:
+ print(child)
+ # <title>The Dormouse's story</title>
+ # The Dormouse's story
+
+У тега <head> есть только один дочерний элемент, но при этом у него два потомка:
+тег <title> и его дочерний элемент. У объекта ``BeautifulSoup``
+только один прямой дочерний элемент (тег <html>), зато множество
+потомков::
+
+ len(list(soup.children))
+ # 1
+ len(list(soup.descendants))
+ # 25
+
+.. _.string:
+
+``.string``
+^^^^^^^^^^^
+
+Если у тега есть только один дочерний элемент, и это ``NavigableString``,
+его можно получить через ``.string``::
+
+ title_tag.string
+ # u'The Dormouse's story'
+
+Если единственным дочерним элементом тега является другой тег, и у этого `другого` тега есть строка
+``.string``, то считается, что родительский тег содержит ту же строку
+``.string``, что и дочерний тег::
+
+ head_tag.contents
+ # [<title>The Dormouse's story</title>]
+
+ head_tag.string
+ # u'The Dormouse's story'
+
+Если тег содержит больше чем один элемент, то становится неясным, какая из строк
+``.string`` относится и к родительскому тегу, поэтому ``.string`` родительского тега имеет значение
+``None``::
+
+ print(soup.html.string)
+ # None
+
+.. _string-generators:
+
+``.strings`` и ``.stripped_strings``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Если внутри тега есть более одного элемента, вы все равно можете посмотреть только на
+строки. Используйте генератор ``.strings``::
+
+ for string in soup.strings:
+ print(repr(string))
+ # u"The Dormouse's story"
+ # u'\n\n'
+ # u"The Dormouse's story"
+ # u'\n\n'
+ # u'Once upon a time there were three little sisters; and their names were\n'
+ # u'Elsie'
+ # u',\n'
+ # u'Lacie'
+ # u' and\n'
+ # u'Tillie'
+ # u';\nand they lived at the bottom of a well.'
+ # u'\n\n'
+ # u'...'
+ # u'\n'
+
+В этих строках много лишних пробелов, которые вы можете
+удалить, используя генератор ``.stripped_strings``::
+
+ for string in soup.stripped_strings:
+ print(repr(string))
+ # u"The Dormouse's story"
+ # u"The Dormouse's story"
+ # u'Once upon a time there were three little sisters; and their names were'
+ # u'Elsie'
+ # u','
+ # u'Lacie'
+ # u'and'
+ # u'Tillie'
+ # u';\nand they lived at the bottom of a well.'
+ # u'...'
+
+Здесь строки, состоящие исключительно из пробелов, игнорируются, а
+пробелы в начале и конце строк удаляются.
+
+Проход снизу вверх
+------------------
+
+В продолжение аналогии с «семейным деревом», каждый тег и каждая строка имеет
+родителя (`parent`): тег, который его содержит.
+
+.. _.parent:
+
+``.parent``
+^^^^^^^^^^^
+
+Вы можете получить доступ к родительскому элементу с помощью атрибута ``.parent``. В
+примере документа с фрагментом из «Алисы в стране чудес» тег <head> является родительским
+для тега <title>::
+
+ title_tag = soup.title
+ title_tag
+ # <title>The Dormouse's story</title>
+ title_tag.parent
+ # <head><title>The Dormouse's story</title></head>
+
+Строка заголовка сама имеет родителя: тег <title>, содержащий
+ее::
+
+ title_tag.string.parent
+ # <title>The Dormouse's story</title>
+
+Родительским элементом тега верхнего уровня, такого как <html>, является сам объект
+``BeautifulSoup``::
+
+ html_tag = soup.html
+ type(html_tag.parent)
+ # <class 'bs4.BeautifulSoup'>
+
+И ``.parent`` объекта ``BeautifulSoup`` определяется как None::
+
+ print(soup.parent)
+ # None
+
+.. _.parents:
+
+``.parents``
+^^^^^^^^^^^^
+
+Вы можете перебрать всех родителей элемента с помощью
+``.parents``. В следующем примере ``.parents`` используется для перемещения от тега <a>,
+закопанного глубоко внутри документа, до самого верха документа::
+
+ link = soup.a
+ link
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+ for parent in link.parents:
+ if parent is None:
+ print(parent)
+ else:
+ print(parent.name)
+ # p
+ # body
+ # html
+ # [document]
+ # None
+
+Перемещение вбок
+----------------
+
+Рассмотрим простой документ::
+
+ sibling_soup = BeautifulSoup("<a><b>text1</b><c>text2</c></b></a>")
+ print(sibling_soup.prettify())
+ # <html>
+ # <body>
+ # <a>
+ # <b>
+ # text1
+ # </b>
+ # <c>
+ # text2
+ # </c>
+ # </a>
+ # </body>
+ # </html>
+
+Тег <b> и тег <c> находятся на одном уровне: они оба непосредственные
+дочерние элементы одного и того же тега. Мы называем их `одноуровневые`. Когда документ
+красиво отформатирован, одноуровневые элементы выводятся с одинаковым отступом. Вы
+также можете использовать это отношение в написанном вами коде.
+
+``.next_sibling`` и ``.previous_sibling``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Вы можете использовать ``.next_sibling`` и ``.previous_sibling`` для навигации
+между элементами страницы, которые находятся на одном уровне дерева разбора::
+
+ sibling_soup.b.next_sibling
+ # <c>text2</c>
+
+ sibling_soup.c.previous_sibling
+ # <b>text1</b>
+
+У тега <b> есть ``.next_sibling``, но нет ``.previous_sibling``,
+потому что нет ничего до тега <b> `на том же уровне
+дерева`. По той же причине у тега <c> есть ``.previous_sibling``,
+но нет ``.next_sibling``::
+
+ print(sibling_soup.b.previous_sibling)
+ # None
+ print(sibling_soup.c.next_sibling)
+ # None
+
+Строки "text1" и "text2" `не являются` одноуровневыми, потому что они не
+имеют общего родителя::
+
+ sibling_soup.b.string
+ # u'text1'
+
+ print(sibling_soup.b.string.next_sibling)
+ # None
+
+В реальных документах ``.next_sibling`` или ``.previous_sibling``
+тега обычно будет строкой, содержащей пробелы. Возвращаясь к
+фрагменту из «Алисы в стране чудес»::
+
+ <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>
+ <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>
+ <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>
+
+Вы можете подумать, что ``.next_sibling`` первого тега <a>
+должен быть второй тег <a>. Но на самом деле это строка: запятая и
+перевод строки, отделяющий первый тег <a> от второго::
+
+ link = soup.a
+ link
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+ link.next_sibling
+ # u',\n'
+
+Второй тег <a> на самом деле является ``.next_sibling`` запятой ::
+
+ link.next_sibling.next_sibling
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>
+
+.. _sibling-generators:
+
+``.next_siblings`` и ``.previous_siblings``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Вы можете перебрать одноуровневые элементы данного тега с помощью ``.next_siblings`` или
+``.previous_siblings``::
+
+ for sibling in soup.a.next_siblings:
+ print(repr(sibling))
+ # u',\n'
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>
+ # u' and\n'
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
+ # u'; and they lived at the bottom of a well.'
+ # None
+
+ for sibling in soup.find(id="link3").previous_siblings:
+ print(repr(sibling))
+ # ' and\n'
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>
+ # u',\n'
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+ # u'Once upon a time there were three little sisters; and their names were\n'
+ # None
+
+Проход вперед и назад
+---------------------
+
+Взгляните на начало фрагмента из «Алисы в стране чудес»::
+
+ <html><head><title>The Dormouse's story</title></head>
+ <p class="title"><b>The Dormouse's story</b></p>
+
+HTML-парсер берет эту строку символов и превращает ее в
+серию событий: "открыть тег <html>", "открыть тег <head>", "открыть
+тег <html>", "добавить строку", "закрыть тег <title>", "открыть
+тег <p>" и так далее. Beautiful Soup предлагает инструменты для реконструирование
+первоначального разбора документа.
+
+.. _element-generators:
+
+``.next_element`` и ``.previous_element``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Атрибут ``.next_element`` строки или тега указывает на то,
+что было разобрано непосредственно после него. Это могло бы быть тем же, что и
+``.next_sibling``, но обычно результат резко отличается.
+
+Возьмем последний тег <a> в фрагменте из «Алисы в стране чудес». Его
+``.next_sibling`` является строкой: конец предложения, которое было
+прервано началом тега <a>::
+
+ last_a_tag = soup.find("a", id="link3")
+ last_a_tag
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
+
+ last_a_tag.next_sibling
+ # '; and they lived at the bottom of a well.'
+
+Но ``.next_element`` этого тега <a> — это то, что было разобрано
+сразу после тега <a>, `не` остальная часть этого предложения:
+это слово "Tillie"::
+
+ last_a_tag.next_element
+ # u'Tillie'
+
+Это потому, что в оригинальной разметке слово «Tillie» появилось
+перед точкой с запятой. Парсер обнаружил тег <a>, затем
+слово «Tillie», затем закрывающий тег </a>, затем точку с запятой и оставшуюся
+часть предложения. Точка с запятой находится на том же уровне, что и тег <a>, но
+слово «Tillie» встретилось первым.
+
+Атрибут ``.previous_element`` является полной противоположностью
+``.next_element``. Он указывает на элемент, который был встречен при разборе
+непосредственно перед текущим::
+
+ last_a_tag.previous_element
+ # u' and\n'
+ last_a_tag.previous_element.next_element
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
+
+``.next_elements`` и ``.previous_elements``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Вы уже должны были уловить идею. Вы можете использовать их для перемещения
+вперед или назад по документу, в том порядке, в каком он был разобран парсером::
+
+ for element in last_a_tag.next_elements:
+ print(repr(element))
+ # u'Tillie'
+ # u';\nand they lived at the bottom of a well.'
+ # u'\n\n'
+ # <p class="story">...</p>
+ # u'...'
+ # u'\n'
+ # None
+
+Поиск по дереву
+===============
+
+Beautiful Soup определяет множество методов поиска по дереву разбора,
+но они все очень похожи. Я буду долго объяснять, как работают
+два самых популярных метода: ``find()`` и ``find_all()``. Прочие
+методы принимают практически те же самые аргументы, поэтому я расскажу
+о них вкратце.
+
+И опять, я буду использовать фрагмент из «Алисы в стране чудес» в качестве примера::
+
+ html_doc = """
+ <html><head><title>The Dormouse's story</title></head>
+ <body>
+ <p class="title"><b>The Dormouse's story</b></p>
+
+ <p class="story">Once upon a time there were three little sisters; and their names were
+ <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
+ <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
+ <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
+ and they lived at the bottom of a well.</p>
+
+ <p class="story">...</p>
+ """
+
+ from bs4 import BeautifulSoup
+ soup = BeautifulSoup (html_doc, 'html.parser')
+
+Передав фильтр в аргумент типа ``find_all()``, вы можете
+углубиться в интересующие вас части документа.
+
+Виды фильтров
+-------------
+
+Прежде чем подробно рассказывать о ``find_all()`` и подобных методах, я
+хочу показать примеры различных фильтров, которые вы можете передать в эти
+методы. Эти фильтры появляются снова и снова в
+поисковом API. Вы можете использовать их для фильтрации по имени тега,
+по его атрибутам, по тексту строки или по некоторой их
+комбинации.
+
+.. _a string:
+
+Строка
+^^^^^^
+
+Самый простой фильтр — это строка. Передайте строку в метод поиска, и
+Beautiful Soup выполнит поиск соответствия этой строке. Следующий
+код находит все теги <b> в документе::
+
+ soup.find_all('b')
+ # [<b>The Dormouse's story</b>]
+
+Если вы передадите байтовую строку, Beautiful Soup будет считать, что строка
+кодируется в UTF-8. Вы можете избежать этого, передав вместо нее строку Unicode.
+
+.. _a regular expression:
+
+Регулярное выражение
+^^^^^^^^^^^^^^^^^^^^
+
+Если вы передадите объект с регулярным выражением, Beautiful Soup отфильтрует результаты
+в соответствии с этим регулярным выражением, используя его метод ``search()``. Следующий код
+находит все теги, имена которых начинаются с буквы "b"; в нашем
+случае это теги <body> и <b>::
+
+ import re
+ for tag in soup.find_all(re.compile("^b")):
+ print(tag.name)
+ # body
+ # b
+
+Этот код находит все теги, имена которых содержат букву "t"::
+
+ for tag in soup.find_all(re.compile("t")):
+ print(tag.name)
+ # html
+ # title
+
+.. _a list:
+
+Список
+^^^^^^
+
+Если вы передадите список, Beautiful Soup разрешит совпадение строк
+с `любым` элементом из этого списка. Следующий код находит все теги <a>
+`и` все теги <b>::
+
+ soup.find_all(["a", "b"])
+ # [<b>The Dormouse's story</b>,
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+.. _the value True:
+
+``True``
+^^^^^^^^
+
+Значение ``True`` подходит везде, где возможно.. Следующий код находит `все`
+теги в документе, но не текстовые строки::
+
+ for tag in soup.find_all(True):
+ print(tag.name)
+ # html
+ # head
+ # title
+ # body
+ # p
+ # b
+ # p
+ # a
+ # a
+ # a
+ # p
+
+.. a function:
+
+Функция
+^^^^^^^
+
+Если ничто из перечисленного вам не подходит, определите функцию, которая
+принимает элемент в качестве единственного аргумента. Функция должна вернуть
+``True``, если аргумент подходит, и ``False``, если нет.
+
+Вот функция, которая возвращает ``True``, если в теге определен атрибут "class",
+но не определен атрибут "id"::
+
+ def has_class_but_no_id(tag):
+ return tag.has_attr('class') and not tag.has_attr('id')
+
+Передайте эту функцию в ``find_all()``, и вы получите все
+теги <p>::
+
+ soup.find_all(has_class_but_no_id)
+ # [<p class="title"><b>The Dormouse's story</b></p>,
+ # <p class="story">Once upon a time there were...</p>,
+ # <p class="story">...</p>]
+
+Эта функция выбирает только теги <p>. Она не выбирает теги <a>,
+поскольку в них определены и атрибут "class" , и атрибут "id". Она не выбирает
+теги вроде <html> и <title>, потому что в них не определен атрибут
+"class".
+
+Если вы передаете функцию для фильтрации по определенному атрибуту, такому как
+``href``, аргументом, переданным в функцию, будет
+значение атрибута, а не весь тег. Вот функция, которая находит все теги ``a``,
+у которых атрибут ``href`` *не* соответствует регулярному выражению::
+
+ def not_lacie(href):
+ return href and not re.compile("lacie").search(href)
+ soup.find_all(href=not_lacie)
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+Функция может быть настолько сложной, насколько вам нужно. Вот
+функция, которая возвращает ``True``, если тег окружен строковыми
+объектами::
+
+ from bs4 import NavigableString
+ def surrounded_by_strings(tag):
+ return (isinstance(tag.next_element, NavigableString)
+ and isinstance(tag.previous_element, NavigableString))
+
+ for tag in soup.find_all(surrounded_by_strings):
+ print tag.name
+ # p
+ # a
+ # a
+ # a
+ # p
+
+Теперь мы готовы подробно рассмотреть методы поиска.
+
+``find_all()``
+--------------
+
+Сигнатура: find_all(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`recursive
+<recursive>`, :ref:`string <string>`, :ref:`limit <limit>`, :ref:`**kwargs <kwargs>`)
+
+Метод ``find_all()`` просматривает потомков тега и
+извлекает `всех` потомков, которые соответствую вашим фильтрам. Я привел несколько
+примеров в разделе `Виды фильтров`_, а вот еще несколько::
+
+ soup.find_all("title")
+ # [<title>The Dormouse's story</title>]
+
+ soup.find_all("p", "title")
+ # [<p class="title"><b>The Dormouse's story</b></p>]
+
+ soup.find_all("a")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.find_all(id="link2")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+ import re
+ soup.find(string=re.compile("sisters"))
+ # u'Once upon a time there were three little sisters; and their names were\n'
+
+Кое-что из этого нам уже знакомо, но есть и новое. Что означает
+передача значения для ``string`` или ``id``? Почему
+``find_all ("p", "title")`` находит тег <p> с CSS-классом "title"?
+Давайте посмотрим на аргументы ``find_all()``.
+
+.. _name:
+
+Аргумент ``name``
+^^^^^^^^^^^^^^^^^
+
+Передайте значение для аргумента ``name``, и вы скажете Beautiful Soup
+рассматривать только теги с определенными именами. Текстовые строки будут игнорироваться, так же как и
+теги, имена которых не соответствуют заданным.
+
+Вот простейший пример использования::
+
+ soup.find_all("title")
+ # [<title>The Dormouse's story</title>]
+
+В разделе `Виды фильтров`_ говорилось, что значением ``name`` может быть
+`строка`_, `регулярное выражение`_, `список`_, `функция`_ или
+`True`_.
+
+.. _kwargs:
+
+Именованные аргументы
+^^^^^^^^^^^^^^^^^^^^^
+
+Любой нераспознанный аргумент будет превращен в фильтр
+по атрибуту тега. Если вы передаете значение для аргумента с именем ``id``,
+Beautiful Soup будет фильтровать по атрибуту "id" каждого тега::
+
+ soup.find_all(id='link2')
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+Если вы передадите значение для ``href``, Beautiful Soup отфильтрует
+по атрибуту "href" каждого тега::
+
+ soup.find_all(href=re.compile("elsie"))
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+Для фильтрации по атрибуту может использоваться `строка`_, `регулярное
+выражение`_, `список`_, `функция`_ или значение `True`_.
+
+Следующий код находит все теги, атрибут ``id`` которых имеет значение,
+независимо от того, что это за значение::
+
+ soup.find_all(id=True)
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+Вы можете отфильтровать несколько атрибутов одновременно, передав более одного
+именованного аргумента::
+
+ soup.find_all(href=re.compile("elsie"), id='link1')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">three</a>]
+
+Некоторые атрибуты, такие как атрибуты data-* в HTML 5, имеют имена, которые
+нельзя использовать в качестве имен именованных аргументов::
+
+ data_soup = BeautifulSoup('<div data-foo="value">foo!</div>')
+ data_soup.find_all(data-foo="value")
+ # SyntaxError: keyword can't be an expression
+
+Вы можете использовать эти атрибуты в поиске, поместив их в
+словарь и передав словарь в ``find_all()`` как
+аргумент ``attrs``::
+
+ data_soup.find_all(attrs={"data-foo": "value"})
+ # [<div data-foo="value">foo!</div>]
+
+Нельзя использовать именованный аргумент для поиска в HTML по элементу "name",
+потому что Beautiful Soup использует аргумент ``name`` для имени
+самого тега. Вместо этого вы можете передать элемент "name" вместе с его значением в
+составе аргумента ``attrs``::
+
+ name_soup = BeautifulSoup('<input name="email"/>')
+ name_soup.find_all(name="email")
+ # []
+ name_soup.find_all(attrs={"name": "email"})
+ # [<input name="email"/>]
+
+.. _attrs:
+
+Поиск по классу CSS
+^^^^^^^^^^^^^^^^^^^
+
+Очень удобно искать тег с определенным классом CSS, но
+имя атрибута CSS, "class", является зарезервированным словом в
+Python. Использование ``class`` в качестве именованного аргумента приведет к синтаксической
+ошибке. Начиная с Beautiful Soup 4.1.2, вы можете выполнять поиск по классу CSS, используя
+именованный аргумент ``class_``::
+
+ soup.find_all("a", class_="sister")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+Как и с любым именованным аргументом, вы можете передать в качестве значения ``class_`` строку, регулярное
+выражение, функцию или ``True``::
+
+ soup.find_all(class_=re.compile("itl"))
+ # [<p class="title"><b>The Dormouse's story</b></p>]
+
+ def has_six_characters(css_class):
+ return css_class is not None and len(css_class) == 6
+
+ soup.find_all(class_=has_six_characters)
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+Помните, что один тег может иметь :ref:`несколько значений <multivalue>`
+для атрибута "class". Когда вы ищете тег, который
+соответствует определенному классу CSS, вы ищете соответствие `любому` из его
+классов CSS::
+
+ css_soup = BeautifulSoup('<p class="body strikeout"></p>')
+ css_soup.find_all("p", class_="strikeout")
+ # [<p class="body strikeout"></p>]
+
+ css_soup.find_all("p", class_="body")
+ # [<p class="body strikeout"></p>]
+
+Можно искать точное строковое значение атрибута ``class``::
+
+ css_soup.find_all("p", class_="body strikeout")
+ # [<p class="body strikeout"></p>]
+
+Но поиск вариантов строкового значения не сработает::
+
+ css_soup.find_all("p", class_="strikeout body")
+ # []
+
+Если вы хотите искать теги, которые соответствуют двум или более классам CSS,
+следует использовать селектор CSS::
+
+ css_soup.select("p.strikeout.body")
+ # [<p class="body strikeout"></p>]
+
+В старых версиях Beautiful Soup, в которых нет ярлыка ``class_``
+можно использовать трюк с аргументом ``attrs``, упомянутый выше. Создайте
+словарь, значение которого для "class" является строкой (или регулярным
+выражением, или чем угодно еще), которую вы хотите найти::
+
+ soup.find_all("a", attrs={"class": "sister"})
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+.. _string:
+
+Аргумент ``string``
+^^^^^^^^^^^^^^^^^^^
+
+С помощью ``string`` вы можете искать строки вместо тегов. Как и в случае с
+``name`` и именованными аргументами, передаваться может `строка`_,
+`регулярное выражение`_, `список`_, `функция`_ или значения `True`_.
+Вот несколько примеров::
+
+ soup.find_all(string="Elsie")
+ # [u'Elsie']
+
+ soup.find_all(string=["Tillie", "Elsie", "Lacie"])
+ # [u'Elsie', u'Lacie', u'Tillie']
+
+ soup.find_all(string=re.compile("Dormouse"))
+ [u"The Dormouse's story", u"The Dormouse's story"]
+
+ def is_the_only_string_within_a_tag(s):
+ """Return True if this string is the only child of its parent tag."""
+ return (s == s.parent.string)
+
+ soup.find_all(string=is_the_only_string_within_a_tag)
+ # [u"The Dormouse's story", u"The Dormouse's story", u'Elsie', u'Lacie', u'Tillie', u'...']
+
+Хотя значение типа ``string`` предназначено для поиска строк, вы можете комбинировать его с
+аргументами, которые находят теги: Beautiful Soup найдет все теги, в которых
+``.string`` соответствует вашему значению для ``string``. Следующий код находит все теги <a>,
+у которых ``.string`` равно "Elsie"::
+
+ soup.find_all("a", string="Elsie")
+ # [<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>]
+
+Аргумент ``string`` — это новое в Beautiful Soup 4.4.0. В ранних
+версиях он назывался ``text``::
+
+ soup.find_all("a", text="Elsie")
+ # [<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>]
+
+.. _limit:
+
+Аргумент ``limit``
+^^^^^^^^^^^^^^^^^^
+
+``find_all()`` возвращает все теги и строки, которые соответствуют вашим
+фильтрам. Это может занять некоторое время, если документ большой. Если вам не
+нужны `все` результаты, вы можете указать их предельное число — ``limit``. Это
+работает так же, как ключевое слово LIMIT в SQL. Оно говорит Beautiful Soup
+прекратить собирать результаты после того, как их найдено определенное количество.
+
+В фрагменте из «Алисы в стране чудес» есть три ссылки, но следующий код
+находит только первые две::
+
+ soup.find_all("a", limit=2)
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+.. _recursive:
+
+Аргумент ``recursive``
+^^^^^^^^^^^^^^^^^^^^^^
+
+Если вы вызовете ``mytag.find_all()``, Beautiful Soup проверит всех
+потомков ``mytag``: его дочерние элементы, дочерние элементы дочерних элементов, и
+так далее. Если вы хотите, чтобы Beautiful Soup рассматривал только непосредственных потомков (дочерние элементы),
+вы можете передать ``recursive = False``. Оцените разницу::
+
+ soup.html.find_all("title")
+ # [<title>The Dormouse's story</title>]
+
+ soup.html.find_all("title", recursive=False)
+ # []
+
+Вот эта часть документа::
+
+ <html>
+ <head>
+ <title>
+ The Dormouse's story
+ </title>
+ </head>
+ ...
+
+Тег <title> находится под тегом <html>, но не `непосредственно`
+под тегом <html>: на пути встречается тег <head>. Beautiful Soup
+находит тег <title>, когда разрешено просматривать всех потомков
+тега <html>, но когда ``recursive=False`` ограничивает поиск
+только непосредстввенно дочерними элементами, Beautiful Soup ничего не находит.
+
+Beautiful Soup предлагает множество методов поиска по дереву (они рассмотрены ниже),
+и они в основном принимают те же аргументы, что и ``find_all()``: ``name``,
+``attrs``, ``string``, ``limit`` и именованные аргументы. Но
+с аргументом ``recursive`` все иначе: ``find_all()`` и ``find()`` —
+это единственные методы, которые его поддерживают. От передачи ``recursive=False`` в
+метод типа ``find_parents()`` не очень много пользы.
+
+Вызов тега похож на вызов ``find_all()``
+----------------------------------------
+
+Поскольку ``find_all()`` является самым популярным методом в Beautiful
+Soup API, вы можете использовать сокращенную запись. Если относиться к
+объекту ``BeautifulSoup`` или объекту ``Tag`` так, будто это
+функция, то это похоже на вызов ``find_all()``
+с этим объектом. Эти две строки кода эквивалентны::
+
+ soup.find_all("a")
+ soup("a")
+
+Эти две строки также эквивалентны::
+
+ soup.title.find_all(string=True)
+ soup.title(string=True)
+
+``find()``
+----------
+
+Сигнатура: find(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`recursive
+<recursive>`, :ref:`string <string>`, :ref:`**kwargs <kwargs>`)
+
+Метод ``find_all()`` сканирует весь документ в поиске
+всех результатов, но иногда вам нужен только один. Если вы знаете,
+что в документе есть только один тег <body>, нет смысла сканировать
+весь документ в поиске остальных. Вместо того, чтобы передавать ``limit=1``
+каждый раз, когда вы вызываете ``find_all()``, используйте
+метод ``find()``. Эти две строки кода эквивалентны::
+
+ soup.find_all('title', limit=1)
+ # [<title>The Dormouse's story</title>]
+
+ soup.find('title')
+ # <title>The Dormouse's story</title>
+
+Разница лишь в том, что ``find_all()`` возвращает список, содержащий
+единственный результат, а ``find()`` возвращает только сам результат.
+
+Если ``find_all()`` не может ничего найти, он возвращает пустой список. Если
+``find()`` не может ничего найти, он возвращает ``None``::
+
+ print(soup.find("nosuchtag"))
+ # None
+
+Помните трюк с ``soup.head.title`` из раздела
+`Навигация с использованием имен тегов`_? Этот трюк работает на основе неоднократного вызова ``find()``::
+
+ soup.head.title
+ # <title>The Dormouse's story</title>
+
+ soup.find("head").find("title")
+ # <title>The Dormouse's story</title>
+
+``find_parents()`` и ``find_parent()``
+--------------------------------------
+
+Сигнатура: find_parents(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`limit <limit>`, :ref:`**kwargs <kwargs>`)
+
+Сигнатура: find_parent(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`**kwargs <kwargs>`)
+
+Я долго объяснял, как работают ``find_all()`` и
+``find()``. Beautiful Soup API определяет десяток других методов для
+поиска по дереву, но пусть вас это не пугает. Пять из этих методов
+в целом похожи на ``find_all()``, а другие пять в целом
+похожи на ``find()``. Единственное различие в том, по каким частям
+дерева они ищут.
+
+Сначала давайте рассмотрим ``find_parents()`` и
+``find_parent()``. Помните, что ``find_all()`` и ``find()`` прорабатывают
+дерево сверху вниз, просматривая теги и их потомков. ``find_parents()`` и ``find_parent()``
+делают наоборот: они идут `снизу вверх`, рассматривая
+родительские элементы тега или строки. Давайте испытаем их, начав со строки,
+закопанной глубоко в фрагменте из «Алисы в стране чудес»::
+
+ a_string = soup.find(string="Lacie")
+ a_string
+ # u'Lacie'
+
+ a_string.find_parents("a")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+ a_string.find_parent("p")
+ # <p class="story">Once upon a time there were three little sisters; and their names were
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> and
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>;
+ # and they lived at the bottom of a well.</p>
+
+ a_string.find_parents("p", class="title")
+ # []
+
+Один из трех тегов <a> является прямым родителем искомой строки,
+так что наш поиск находит его. Один из трех тегов <p> является
+непрямым родителем строки, и наш поиск тоже его
+находит. Где-то в документе есть тег <p> с классом CSS "title",
+но он не является родительским для строки, так что мы не можем найти
+его с помощью ``find_parents()``.
+
+Вы могли заметить связь между ``find_parent()``,
+``find_parents()`` и атрибутами `.parent`_ и `.parents`_,
+упомянутыми ранее. Связь очень сильная. Эти методы поиска
+на самом деле используют ``.parents``, чтобы перебрать все родительские элементы и проверить
+каждый из них на соответствие заданному фильтру.
+
+``find_next_siblings()`` и ``find_next_sibling()``
+--------------------------------------------------
+
+Сигнатура: find_next_siblings(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`limit <limit>`, :ref:`**kwargs <kwargs>`)
+
+Сигнатура: find_next_sibling(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`**kwargs <kwargs>`)
+
+Эти методы используют :ref:`.next_siblings <sibling-generators>` для
+перебора одноуровневых элементов для данного элемента в дереве. Метод
+``find_next_siblings()`` возвращает все подходящие одноуровневые элементы,
+а ``find_next_sibling()`` возвращает только первый из них::
+
+ first_link = soup.a
+ first_link
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+ first_link.find_next_siblings("a")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ first_story_paragraph = soup.find("p", "story")
+ first_story_paragraph.find_next_sibling("p")
+ # <p class="story">...</p>
+
+``find_previous_siblings()`` и ``find_previous_sibling()``
+----------------------------------------------------------
+
+Сигнатура: find_previous_siblings(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`limit <limit>`, :ref:`**kwargs <kwargs>`)
+
+Сигнатура: find_previous_sibling(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`**kwargs <kwargs>`)
+
+Эти методы используют :ref:`.previous_siblings <sibling-generators>` для перебора тех одноуровневых элементов,
+которые предшествуют данному элементу в дереве разбора. Метод ``find_previous_siblings()``
+возвращает все подходящие одноуровневые элементы,, а
+а ``find_next_sibling()`` только первый из них::
+
+ last_link = soup.find("a", id="link3")
+ last_link
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
+
+ last_link.find_previous_siblings("a")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+ first_story_paragraph = soup.find("p", "story")
+ first_story_paragraph.find_previous_sibling("p")
+ # <p class="title"><b>The Dormouse's story</b></p>
+
+
+``find_all_next()`` и ``find_next()``
+-------------------------------------
+
+Сигнатура: find_all_next(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`limit <limit>`, :ref:`**kwargs <kwargs>`)
+
+Сигнатура: find_next(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`**kwargs <kwargs>`)
+
+Эти методы используют :ref:`.next_elements <element-generators>` для
+перебора любых тегов и строк, которые встречаются в документе после
+элемента. Метод ``find_all_next()`` возвращает все совпадения, а
+``find_next()`` только первое::
+
+ first_link = soup.a
+ first_link
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+ first_link.find_all_next(string=True)
+ # [u'Elsie', u',\n', u'Lacie', u' and\n', u'Tillie',
+ # u';\nand they lived at the bottom of a well.', u'\n\n', u'...', u'\n']
+
+ first_link.find_next("p")
+ # <p class="story">...</p>
+
+В первом примере нашлась строка "Elsie", хотя она
+содержится в теге <a>, с которого мы начали. Во втором примере
+нашелся последний тег <p>, хотя он находится
+в другой части дерева, чем тег <a>, с которого мы начали. Для этих
+методов имеет значение только то, что элемент соответствует фильтру и
+появляется в документе позже, чем тот элемент, с которого начали поиск.
+
+``find_all_previous()`` и ``find_previous()``
+---------------------------------------------
+
+Сигнатура: find_all_previous(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`limit <limit>`, :ref:`**kwargs <kwargs>`)
+
+Сигнатура: find_previous(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`**kwargs <kwargs>`)
+
+Эти методы используют :ref:`.previous_elements <element-generators>` для
+перебора любых тегов и строк, которые встречаются в документе до
+элемента. Метод ``find_all_previous()`` возвращает все совпадения, а
+``find_previous()`` только первое::
+
+ first_link = soup.a
+ first_link
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+ first_link.find_all_previous("p")
+ # [<p class="story">Once upon a time there were three little sisters; ...</p>,
+ # <p class="title"><b>The Dormouse's story</b></p>]
+
+ first_link.find_previous("title")
+ # <title>The Dormouse's story</title>
+
+Вызов ``find_all_previous ("p")`` нашел первый абзац в
+документе (тот, который с ``class = "title"``), но он также находит
+второй абзац, а именно тег <p>, содержащий тег <a>, с которого мы
+начали. Это не так уж удивительно: мы смотрим на все теги,
+которые появляются в документе раньше, чем тот, с которого мы начали. Тег
+<p>, содержащий тег <a>, должен был появиться до тега <a>, который
+в нем содержится.
+
+Селекторы CSS
+-------------
+
+Начиная с версии 4.7.0, Beautiful Soup поддерживает большинство селекторов CSS4 благодаря
+проекту `SoupSieve
+<https://facelessuser.github.io/soupsieve/>`_. Если вы установили Beautiful Soup через ``pip``, одновременно должен был установиться SoupSieve,
+так что вам больше ничего не нужно делать.
+
+В ``BeautifulSoup`` есть метод ``.select()``, который использует SoupSieve, чтобы
+запустить селектор CSS и вернуть все
+подходящие элементы. ``Tag`` имеет похожий метод, который запускает селектор CSS
+в отношении содержимого одного тега.
+
+(В более ранних версиях Beautiful Soup тоже есть метод ``.select()``,
+но поддерживаются только наиболее часто используемые селекторы CSS.)
+
+В `документации SoupSieve
+<https://facelessuser.github.io/soupsieve/>`_ перечислены все
+селекторы CSS, которые поддерживаются на данный момент, но вот некоторые из основных:
+
+Вы можете найти теги::
+
+ soup.select("title")
+ # [<title>The Dormouse's story</title>]
+
+ soup.select("p:nth-of-type(3)")
+ # [<p class="story">...</p>]
+
+Найти теги под другими тегами::
+
+ soup.select("body a")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select("html head title")
+ # [<title>The Dormouse's story</title>]
+
+Найти теги `непосредственно` под другими тегами::
+
+ soup.select("head > title")
+ # [<title>The Dormouse's story</title>]
+
+ soup.select("p > a")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select("p > a:nth-of-type(2)")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+ soup.select("p > #link1")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+ soup.select("body > a")
+ # []
+
+Найти одноуровневые элементы тега::
+
+ soup.select("#link1 ~ .sister")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select("#link1 + .sister")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+Найти теги по классу CSS::
+
+ soup.select(".sister")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select("[class~=sister]")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+Найти теги по ID::
+
+ soup.select("#link1")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+ soup.select("a#link2")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+Найти теги, которые соответствуют любому селектору из списка::
+
+ soup.select("#link1,#link2")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+Проверка на наличие атрибута::
+
+ soup.select('a[href]')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+Найти теги по значению атрибута::
+
+ soup.select('a[href="http://example.com/elsie"]')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+ soup.select('a[href^="http://example.com/"]')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select('a[href$="tillie"]')
+ # [<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select('a[href*=".com/el"]')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+Есть также метод ``select_one()``, который находит только
+первый тег, соответствующий селектору::
+
+ soup.select_one(".sister")
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+Если вы разобрали XML, в котором определены пространства имен, вы можете использовать их в
+селекторах CSS::
+
+ from bs4 import BeautifulSoup
+ xml = """<tag xmlns:ns1="http://namespace1/" xmlns:ns2="http://namespace2/">
+ <ns1:child>I'm in namespace 1</ns1:child>
+ <ns2:child>I'm in namespace 2</ns2:child>
+ </tag> """
+ soup = BeautifulSoup(xml, "xml")
+
+ soup.select("child")
+ # [<ns1:child>I'm in namespace 1</ns1:child>, <ns2:child>I'm in namespace 2</ns2:child>]
+
+ soup.select("ns1|child", namespaces=namespaces)
+ # [<ns1:child>I'm in namespace 1</ns1:child>]
+
+При обработке селектора CSS, который использует пространства имен, Beautiful Soup
+использует сокращения пространства имен, найденные при разборе
+документа. Вы можете заменить сокращения своими собственными, передав словарь
+сокращений::
+
+ namespaces = dict(first="http://namespace1/", second="http://namespace2/")
+ soup.select("second|child", namespaces=namespaces)
+ # [<ns1:child>I'm in namespace 2</ns1:child>]
+
+Все эти селекторы CSS удобны для тех, кто уже
+знаком с синтаксисом селекторов CSS. Вы можете сделать все это с помощью
+Beautiful Soup API. И если CSS селекторы — это все, что вам нужно, вам следует
+использовать парсер lxml: так будет намного быстрее. Но вы можете
+`комбинировать` селекторы CSS с Beautiful Soup API.
+
+Изменение дерева
+================
+
+Основная сила Beautiful Soup в поиске по дереву разбора, но вы
+также можете изменить дерево и записать свои изменения в виде нового HTML или
+XML-документа.
+
+Изменение имен тегов и атрибутов
+--------------------------------
+
+Я говорил об этом раньше, в разделе `Атрибуты`_, но это стоит повторить. Вы
+можете переименовать тег, изменить значения его атрибутов, добавить новые
+атрибуты и удалить атрибуты::
+
+ soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
+ tag = soup.b
+
+ tag.name = "blockquote"
+ tag['class'] = 'verybold'
+ tag['id'] = 1
+ tag
+ # <blockquote class="verybold" id="1">Extremely bold</blockquote>
+
+ del tag['class']
+ del tag['id']
+ tag
+ # <blockquote>Extremely bold</blockquote>
+
+Изменение ``.string``
+---------------------
+
+Если вы замените значение атрибута ``.string`` новой строкой, содержимое тега будет
+заменено на эту строку::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+
+ tag = soup.a
+ tag.string = "New link text."
+ tag
+ # <a href="http://example.com/">New link text.</a>
+
+Будьте осторожны: если тег содержит другие теги, они и все их
+содержимое будет уничтожено.
+
+``append()``
+------------
+
+Вы можете добавить содержимое тега с помощью ``Tag.append()``. Это работает
+точно так же, как ``.append()`` для списка в Python::
+
+ soup = BeautifulSoup("<a>Foo</a>")
+ soup.a.append("Bar")
+
+ soup
+ # <html><head></head><body><a>FooBar</a></body></html>
+ soup.a.contents
+ # [u'Foo', u'Bar']
+
+``extend()``
+------------
+
+Начиная с версии Beautiful Soup 4.7.0, ``Tag`` также поддерживает метод
+``.extend()``, который работает так же, как вызов ``.extend()`` для
+списка в Python::
+
+ soup = BeautifulSoup("<a>Soup</a>")
+ soup.a.extend(["'s", " ", "on"])
+
+ soup
+ # <html><head></head><body><a>Soup's on</a></body></html>
+ soup.a.contents
+ # [u'Soup', u''s', u' ', u'on']
+
+``NavigableString()`` и ``.new_tag()``
+--------------------------------------
+
+Если вам нужно добавить строку в документ, нет проблем — вы можете передать
+строку Python в ``append()`` или вызвать
+конструктор ``NavigableString``::
+
+ soup = BeautifulSoup("<b></b>")
+ tag = soup.b
+ tag.append("Hello")
+ new_string = NavigableString(" there")
+ tag.append(new_string)
+ tag
+ # <b>Hello there.</b>
+ tag.contents
+ # [u'Hello', u' there']
+
+Если вы хотите создать комментарий или другой подкласс
+``NavigableString``, просто вызовите конструктор::
+
+ from bs4 import Comment
+ new_comment = Comment("Nice to see you.")
+ tag.append(new_comment)
+ tag
+ # <b>Hello there<!--Nice to see you.--></b>
+ tag.contents
+ # [u'Hello', u' there', u'Nice to see you.']
+
+(Это новая функция в Beautiful Soup 4.4.0.)
+
+Что делать, если вам нужно создать совершенно новый тег? Наилучшим решением будет
+вызвать фабричный метод ``BeautifulSoup.new_tag()``::
+
+ soup = BeautifulSoup("<b></b>")
+ original_tag = soup.b
+
+ new_tag = soup.new_tag("a", href="http://www.example.com")
+ original_tag.append(new_tag)
+ original_tag
+ # <b><a href="http://www.example.com"></a></b>
+
+ new_tag.string = "Link text."
+ original_tag
+ # <b><a href="http://www.example.com">Link text.</a></b>
+
+Нужен только первый аргумент, имя тега.
+
+``insert()``
+------------
+
+``Tag.insert()`` похож на ``Tag.append()``, за исключением того, что новый элемент
+не обязательно добавляется в конец родительского
+``.contents``. Он добавится в любое место, номер которого
+вы укажете. Это работает в точности как ``.insert()`` в списке Python::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ tag = soup.a
+
+ tag.insert(1, "but did not endorse ")
+ tag
+ # <a href="http://example.com/">I linked to but did not endorse <i>example.com</i></a>
+ tag.contents
+ # [u'I linked to ', u'but did not endorse', <i>example.com</i>]
+
+``insert_before()`` и ``insert_after()``
+----------------------------------------
+
+Метод ``insert_before()`` вставляет теги или строки непосредственно
+перед чем-то в дереве разбора::
+
+ soup = BeautifulSoup("<b>stop</b>")
+ tag = soup.new_tag("i")
+ tag.string = "Don't"
+ soup.b.string.insert_before(tag)
+ soup.b
+ # <b><i>Don't</i>stop</b>
+
+Метод ``insert_after()`` вставляет теги или строки непосредственно
+после чего-то в дереве разбора::
+
+ div = soup.new_tag('div')
+ div.string = 'ever'
+ soup.b.i.insert_after(" you ", div)
+ soup.b
+ # <b><i>Don't</i> you <div>ever</div> stop</b>
+ soup.b.contents
+ # [<i>Don't</i>, u' you', <div>ever</div>, u'stop']
+
+``clear()``
+-----------
+
+``Tag.clear()`` удаляет содержимое тега::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ tag = soup.a
+
+ tag.clear()
+ tag
+ # <a href="http://example.com/"></a>
+
+``extract()``
+-------------
+
+``PageElement.extract()`` удаляет тег или строку из дерева. Он
+возвращает тег или строку, которая была извлечена::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ a_tag = soup.a
+
+ i_tag = soup.i.extract()
+
+ a_tag
+ # <a href="http://example.com/">I linked to</a>
+
+ i_tag
+ # <i>example.com</i>
+
+ print(i_tag.parent)
+ None
+
+К этому моменту у вас фактически есть два дерева разбора: одно в
+объекте ``BeautifulSoup``, который вы использовали, чтобы разобрать документ, другое в
+теге, который был извлечен. Вы можете далее вызывать ``extract`` в отношении
+дочернего элемента того тега, который был извлечен::
+
+ my_string = i_tag.string.extract()
+ my_string
+ # u'example.com'
+
+ print(my_string.parent)
+ # None
+ i_tag
+ # <i></i>
+
+
+``decompose()``
+---------------
+
+``Tag.decompose()`` удаляет тег из дерева, а затем `полностью
+уничтожает его вместе с его содержимым`::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ a_tag = soup.a
+
+ soup.i.decompose()
+
+ a_tag
+ # <a href="http://example.com/">I linked to</a>
+
+
+.. _replace_with():
+
+``replace_with()``
+------------------
+
+``PageElement.extract()`` удаляет тег или строку из дерева
+и заменяет его тегом или строкой по вашему выбору::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ a_tag = soup.a
+
+ new_tag = soup.new_tag("b")
+ new_tag.string = "example.net"
+ a_tag.i.replace_with(new_tag)
+
+ a_tag
+ # <a href="http://example.com/">I linked to <b>example.net</b></a>
+
+``replace_with()`` возвращает тег или строку, которые были заменены, так что
+вы можете изучить его или добавить его обратно в другую часть дерева.
+
+``wrap()``
+----------
+
+``PageElement.wrap()`` обертывает элемент в указанный вами тег. Он
+возвращает новую обертку::
+
+ soup = BeautifulSoup("<p>I wish I was bold.</p>")
+ soup.p.string.wrap(soup.new_tag("b"))
+ # <b>I wish I was bold.</b>
+
+ soup.p.wrap(soup.new_tag("div")
+ # <div><p><b>I wish I was bold.</b></p></div>
+
+Это новый метод в Beautiful Soup 4.0.5.
+
+``unwrap()``
+------------
+
+``Tag.unwrap()`` — это противоположность ``wrap()``. Он заменяет весь тег на
+его содержимое. Этим методом удобно очищать разметку::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ a_tag = soup.a
+
+ a_tag.i.unwrap()
+ a_tag
+ # <a href="http://example.com/">I linked to example.com</a>
+
+Как и ``replace_with()``, ``unwrap()`` возвращает тег,
+который был заменен.
+
+``smooth()``
+------------
+
+После вызова ряда методов, которые изменяют дерево разбора, у вас может оказаться несколько объектов ``NavigableString`` подряд. У Beautiful Soup с этим нет проблем, но поскольку такое не случается со свежеразобранным документом, вам может показаться неожиданным следующее поведение::
+
+ soup = BeautifulSoup("<p>A one</p>")
+ soup.p.append(", a two")
+
+ soup.p.contents
+ # [u'A one', u', a two']
+
+ print(soup.p.encode())
+ # <p>A one, a two</p>
+
+ print(soup.p.prettify())
+ # <p>
+ # A one
+ # , a two
+ # </p>
+
+Вы можете вызвать ``Tag.smooth()``, чтобы очистить дерево разбора путем объединения смежных строк::
+
+ soup.smooth()
+
+ soup.p.contents
+ # [u'A one, a two']
+
+ print(soup.p.prettify())
+ # <p>
+ # A one, a two
+ # </p>
+
+``smooth()`` — это новый метод в Beautiful Soup 4.8.0.
+
+Вывод
+=====
+
+.. _.prettyprinting:
+
+Красивое форматирование
+-----------------------
+
+Метод ``prettify()`` превратит дерево разбора Beautiful Soup в
+красиво отформатированную строку Unicode, где каждый
+тег и каждая строка выводятся на отдельной строчке::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ soup.prettify()
+ # '<html>\n <head>\n </head>\n <body>\n <a href="http://example.com/">\n...'
+
+ print(soup.prettify())
+ # <html>
+ # <head>
+ # </head>
+ # <body>
+ # <a href="http://example.com/">
+ # I linked to
+ # <i>
+ # example.com
+ # </i>
+ # </a>
+ # </body>
+ # </html>
+
+Вы можете вызвать ``prettify()`` для объекта ``BeautifulSoup`` верхнего уровня
+или для любого из его объектов ``Tag``::
+
+ print(soup.a.prettify())
+ # <a href="http://example.com/">
+ # I linked to
+ # <i>
+ # example.com
+ # </i>
+ # </a>
+
+Без красивого форматирования
+----------------------------
+
+Если вам нужна просто строка, без особого форматирования, вы можете вызвать
+``unicode()`` или ``str()`` для объекта ``BeautifulSoup`` или объекта ``Tag``
+внутри::
+
+ str(soup)
+ # '<html><head></head><body><a href="http://example.com/">I linked to <i>example.com</i></a></body></html>'
+
+ unicode(soup.a)
+ # u'<a href="http://example.com/">I linked to <i>example.com</i></a>'
+
+Функция ``str()`` возвращает строку, кодированную в UTF-8. Для получения более подробной информации см.
+`Кодировки`_.
+
+Вы также можете вызвать ``encode()`` для получения байтовой строки, и ``decode()``,
+чтобы получить Unicode.
+
+.. _output_formatters:
+
+Средства форматирования вывода
+------------------------------
+
+Если вы дадите Beautiful Soup документ, который содержит HTML-мнемоники, такие как
+"&lquot;", они будут преобразованы в символы Unicode::
+
+ soup = BeautifulSoup("&ldquo;Dammit!&rdquo; he said.")
+ unicode(soup)
+ # u'<html><head></head><body>\u201cDammit!\u201d he said.</body></html>'
+
+Если затем преобразовать документ в строку, символы Unicode
+будет кодироваться как UTF-8. Вы не получите обратно HTML-мнемоники::
+
+ str(soup)
+ # '<html><head></head><body>\xe2\x80\x9cDammit!\xe2\x80\x9d he said.</body></html>'
+
+По умолчанию единственные символы, которые экранируются при выводе — это чистые
+амперсанды и угловые скобки. Они превращаются в «&», «<»
+и ">", чтобы Beautiful Soup случайно не сгенерировал
+невалидный HTML или XML::
+
+ soup = BeautifulSoup("<p>The law firm of Dewey, Cheatem, & Howe</p>")
+ soup.p
+ # <p>The law firm of Dewey, Cheatem, &amp; Howe</p>
+
+ soup = BeautifulSoup('<a href="http://example.com/?foo=val1&bar=val2">A link</a>')
+ soup.a
+ # <a href="http://example.com/?foo=val1&amp;bar=val2">A link</a>
+
+Вы можете изменить это поведение, указав для
+аргумента ``formatter`` одно из значений: ``prettify()``, ``encode()`` или
+``decode()``. Beautiful Soup распознает пять возможных значений
+``formatter``.
+
+Значение по умолчанию — ``formatter="minimal"``. Строки будут обрабатываться
+ровно настолько, чтобы Beautiful Soup генерировал валидный HTML / XML::
+
+ french = "<p>Il a dit &lt;&lt;Sacr&eacute; bleu!&gt;&gt;</p>"
+ soup = BeautifulSoup(french)
+ print(soup.prettify(formatter="minimal"))
+ # <html>
+ # <body>
+ # <p>
+ # Il a dit &lt;&lt;Sacré bleu!&gt;&gt;
+ # </p>
+ # </body>
+ # </html>
+
+Если вы передадите ``formatter = "html"``, Beautiful Soup преобразует
+символы Unicode в HTML-мнемоники, когда это возможно::
+
+ print(soup.prettify(formatter="html"))
+ # <html>
+ # <body>
+ # <p>
+ # Il a dit &lt;&lt;Sacr&eacute; bleu!&gt;&gt;
+ # </p>
+ # </body>
+ # </html>
+
+Если вы передаете ``formatter="html5"``, это то же самое, что
+``formatter="html"``, только Beautiful Soup будет
+пропускать закрывающую косую черту в пустых тегах HTML, таких как "br"::
+
+ soup = BeautifulSoup("<br>")
+
+ print(soup.encode(formatter="html"))
+ # <html><body><br/></body></html>
+
+ print(soup.encode(formatter="html5"))
+ # <html><body><br></body></html>
+
+Если вы передадите ``formatter=None``, Beautiful Soup вообще не будет менять
+строки на выходе. Это самый быстрый вариант, но он может привести
+к тому, что Beautiful Soup будет генерировать невалидный HTML / XML::
+
+ print(soup.prettify(formatter=None))
+ # <html>
+ # <body>
+ # <p>
+ # Il a dit <<Sacré bleu!>>
+ # </p>
+ # </body>
+ # </html>
+
+ link_soup = BeautifulSoup('<a href="http://example.com/?foo=val1&bar=val2">A link</a>')
+ print(link_soup.a.encode(formatter=None))
+ # <a href="http://example.com/?foo=val1&bar=val2">A link</a>
+
+Если вам нужен более сложный контроль над выводом, вы можете
+использовать класс ``Formatter`` из Beautiful Soup. Вот как можно
+преобразовать строки в верхний регистр, независимо от того, находятся ли они в текстовом узле или в
+значении атрибута::
+
+ from bs4.formatter import HTMLFormatter
+ def uppercase(str):
+ return str.upper()
+ formatter = HTMLFormatter(uppercase)
+
+ print(soup.prettify(formatter=formatter))
+ # <html>
+ # <body>
+ # <p>
+ # IL A DIT <<SACRÉ BLEU!>>
+ # </p>
+ # </body>
+ # </html>
+
+ print(link_soup.a.prettify(formatter=formatter))
+ # <a href="HTTP://EXAMPLE.COM/?FOO=VAL1&BAR=VAL2">
+ # A LINK
+ # </a>
+
+Подклассы ``HTMLFormatter`` или ``XMLFormatter`` дают еще
+больший контроль над выводом. Например, Beautiful Soup сортирует
+атрибуты в каждом теге по умолчанию::
+
+ attr_soup = BeautifulSoup(b'<p z="1" m="2" a="3"></p>')
+ print(attr_soup.p.encode())
+ # <p a="3" m="2" z="1"></p>
+
+Чтобы выключить сортировку по умолчанию, вы можете создать подкласс на основе метода ``Formatter.attributes()``,
+который контролирует, какие атрибуты выводятся и в каком
+порядке. Эта реализация также отфильтровывает атрибут с именем "m",
+где бы он ни появился::
+
+ class UnsortedAttributes(HTMLFormatter):
+ def attributes(self, tag):
+ for k, v in tag.attrs.items():
+ if k == 'm':
+ continue
+ yield k, v
+ print(attr_soup.p.encode(formatter=UnsortedAttributes()))
+ # <p z="1" a="3"></p>
+
+Последнее предостережение: если вы создаете объект ``CData``, текст внутри
+этого объекта всегда представлен `как есть, без какого-либо
+форматирования`. Beautiful Soup вызовет вашу функцию для замены мнемоник,
+на тот случай, если вы написали функцию, которая подсчитывает
+все строки в документе или что-то еще, но он будет игнорировать
+возвращаемое значение::
+
+ from bs4.element import CData
+ soup = BeautifulSoup("<a></a>")
+ soup.a.string = CData("one < three")
+ print(soup.a.prettify(formatter="xml"))
+ # <a>
+ # <![CDATA[one < three]]>
+ # </a>
+
+
+``get_text()``
+--------------
+
+Если вам нужна только текстовая часть документа или тега, вы можете использовать
+метод ``get_text()``. Он возвращает весь текст документа или
+тега в виде единственной строки Unicode::
+
+ markup = '<a href="http://example.com/">\nI linked to <i>example.com</i>\n</a>'
+ soup = BeautifulSoup(markup)
+
+ soup.get_text()
+ u'\nI linked to example.com\n'
+ soup.i.get_text()
+ u'example.com'
+
+Вы можете указать строку, которая будет использоваться для объединения текстовых фрагментов
+в единую строку::
+
+ # soup.get_text("|")
+ u'\nI linked to |example.com|\n'
+
+Вы можете сказать Beautiful Soup удалять пробелы в начале и
+конце каждого текстового фрагмента::
+
+ # soup.get_text("|", strip=True)
+ u'I linked to|example.com'
+
+Но в этом случае вы можете предпочесть использовать генератор :ref:`.stripped_strings <string-generators>`
+и затем обработать текст самостоятельно::
+
+ [text for text in soup.stripped_strings]
+ # [u'I linked to', u'example.com']
+
+Указание парсера
+================
+
+Если вам нужно просто разобрать HTML, вы можете скинуть разметку в
+конструктор ``BeautifulSoup``, и, скорее всего, все будет в порядке. Beautiful
+Soup подберет для вас парсер и проанализирует данные. Но есть
+несколько дополнительных аргументов, которые вы можете передать конструктору, чтобы изменить
+используемый парсер.
+
+Первым аргументом конструктора ``BeautifulSou`` является строка или
+открытый дескриптор файла — сама разметка, которую вы хотите разобрать. Второй аргумент — это
+`как` вы хотите, чтобы разметка была разобрана.
+
+Если вы ничего не укажете, будет использован лучший HTML-парсер из тех,
+которые установлены. Beautiful Soup оценивает парсер lxml как лучший, за ним идет
+html5lib, затем встроенный парсер Python. Вы можете переопределить используемый парсер,
+указав что-то из следующего:
+
+* Какой тип разметки вы хотите разобрать. В данный момент поддерживаются:
+ "html", "xml" и "html5".
+
+* Имя библиотеки парсера, которую вы хотите использовать. В данный момент поддерживаются
+ "lxml", "html5lib" и "html.parser" (встроенный в Python
+ парсер HTML).
+
+В разделе `Установка парсера`_ вы найдете сравнительную таблицу поддерживаемых парсеров.
+
+Если у вас не установлен соответствующий парсер, Beautiful Soup
+проигнорирует ваш запрос и выберет другой парсер. На текущий момент единственный
+поддерживаемый парсер XML — это lxml. Если у вас не установлен lxml, запрос на
+парсер XML ничего не даст, и запрос "lxml" тоже
+не сработает.
+
+Различия между парсерами
+------------------------
+
+Beautiful Soup представляет один интерфейс для разных
+парсеров, но парсеры неодинаковы. Разные парсеры создадут
+различные деревья разбора из одного и того же документа. Самые большие различия будут
+между парсерами HTML и парсерами XML. Вот короткий
+документ, разобранный как HTML::
+
+ BeautifulSoup("<a><b /></a>")
+ # <html><head></head><body><a><b></b></a></body></html>
+
+Поскольку пустой тег <b /> не является валидным кодом HTML, парсер превращает его в
+пару тегов <b></b>.
+
+Вот тот же документ, который разобран как XML (для его запуска нужно, чтобы был
+установлен lxml). Обратите внимание, что пустой тег <b /> остается, и
+что в документ добавляется объявление XML вместо
+тега <html>::
+
+ BeautifulSoup("<a><b /></a>", "xml")
+ # <?xml version="1.0" encoding="utf-8"?>
+ # <a><b/></a>
+
+Есть также различия между парсерами HTML. Если вы даете Beautiful
+Soup идеально оформленный документ HTML, эти различия не будут
+иметь значения. Один парсер будет быстрее другого, но все они будут давать
+структуру данных, которая выглядит точно так же, как оригинальный
+документ HTML.
+
+Но если документ оформлен неидеально, различные парсеры
+дадут разные результаты. Вот короткий невалидный документ, разобранный с помощью
+HTML-парсера lxml. Обратите внимание, что висячий тег </p> просто
+игнорируется::
+
+ BeautifulSoup("<a></p>", "lxml")
+ # <html><body><a></a></body></html>
+
+Вот тот же документ, разобранный с помощью html5lib::
+
+ BeautifulSoup("<a></p>", "html5lib")
+ # <html><head></head><body><a><p></p></a></body></html>
+
+Вместо того, чтобы игнорировать висячий тег </p>, html5lib добавляет
+открывающй тег <p>. Этот парсер также добавляет пустой тег <head> в
+документ.
+
+Вот тот же документ, разобранный с помощью встроенного в Python
+парсера HTML::
+
+ BeautifulSoup("<a></p>", "html.parser")
+ # <a></a>
+
+Как и html5lib, этот парсер игнорирует закрывающий тег </p>. В отличие от
+html5lib, этот парсер не делает попытки создать правильно оформленный HTML-
+документ, добавив тег <body>. В отличие от lxml, он даже не
+добавляет тег <html>.
+
+Поскольку документ ``<a></p>`` невалиден, ни один из этих способов
+нельзя назвать "правильным". Парсер html5lib использует способы,
+которые являются частью стандарта HTML5, поэтому он может претендовать на то, что его подход
+самый "правильный", но правомерно использовать любой из трех методов.
+
+Различия между парсерами могут повлиять на ваш скрипт. Если вы планируете
+распространять ваш скрипт или запускать его на нескольких
+машинах, вам нужно указать парсер в
+конструкторе ``BeautifulSoup``. Это уменьшит вероятность того, что ваши пользователи при разборе
+документа получат результат, отличный от вашего.
+
+Кодировки
+=========
+
+Любой документ HTML или XML написан в определенной кодировке, такой как ASCII
+или UTF-8. Но когда вы загрузите этот документ в Beautiful Soup, вы
+обнаружите, что он был преобразован в Unicode::
+
+ markup = "<h1>Sacr\xc3\xa9 bleu!</h1>"
+ soup = BeautifulSoup(markup)
+ soup.h1
+ # <h1>Sacré bleu!</h1>
+ soup.h1.string
+ # u'Sacr\xe9 bleu!'
+
+Это не волшебство. (Хотя это было бы здорово, конечно.) Beautiful Soup использует
+подбиблиотеку под названием `Unicode, Dammit`_ для определения кодировки документа
+и преобразования ее в Unicode. Кодировка, которая была автоматически определена, содержится в значении
+атрибута ``.original_encoding`` объекта ``BeautifulSoup``::
+
+ soup.original_encoding
+ 'utf-8'
+
+Unicode, Dammit чаще всего угадывает правильно, но иногда
+делает ошибки. Иногда он угадывает правильно только после
+побайтового поиска по документу, что занимает очень много времени. Если
+вы вдруг уже знаете кодировку документа, вы можете избежать
+ошибок и задержек, передав кодировку конструктору ``BeautifulSoup``
+как аргумент ``from_encoding``.
+
+Вот документ, написанный на ISO-8859-8. Документ настолько короткий, что
+Unicode, Dammit не может разобраться и неправильно идентифицирует кодировку как
+ISO-8859-7::
+
+ markup = b"<h1>\xed\xe5\xec\xf9</h1>"
+ soup = BeautifulSoup(markup)
+ soup.h1
+ <h1>νεμω</h1>
+ soup.original_encoding
+ 'ISO-8859-7'
+
+Мы можем все исправить, передав правильный ``from_encoding``::
+
+ soup = BeautifulSoup(markup, from_encoding="iso-8859-8")
+ soup.h1
+ <h1>םולש</h1>
+ soup.original_encoding
+ 'iso8859-8'
+
+Если вы не знаете правильную кодировку, но видите, что
+Unicode, Dammit определяет ее неправильно, вы можете передать ошибочные варианты в
+``exclude_encodings``::
+
+ soup = BeautifulSoup(markup, exclude_encodings=["ISO-8859-7"])
+ soup.h1
+ <h1>םולש</h1>
+ soup.original_encoding
+ 'WINDOWS-1255'
+
+Windows-1255 не на 100% подходит, но это совместимое
+надмножество ISO-8859-8, так что догадка почти верна. (``exclude_encodings``
+— это новая функция в Beautiful Soup 4.4.0.)
+
+В редких случаях (обычно когда документ UTF-8 содержит текст в
+совершенно другой кодировке) единственным способом получить Unicode может оказаться
+замена некоторых символов специальным символом Unicode
+"REPLACEMENT CHARACTER" (U+FFFD, �). Если Unicode, Dammit приходится это сделать,
+он установит атрибут ``.contains_replacement_characters``
+в ``True`` для объектов ``UnicodeDammit`` или ``BeautifulSoup``. Это
+даст понять, что представление в виде Unicode не является точным
+представление оригинала, и что некоторые данные потерялись. Если документ
+содержит �, но ``.contains_replacement_characters`` равен ``False``,
+вы будете знать, что � был в тексте изначально (как в этом
+параграфе), а не служит заменой отсутствующим данным.
+
+Кодировка вывода
+----------------
+
+Когда вы пишете документ из Beautiful Soup, вы получаете документ в UTF-8,
+даже если он изначально не был в UTF-8. Вот
+документ в кодировке Latin-1::
+
+ markup = b'''
+ <html>
+ <head>
+ <meta content="text/html; charset=ISO-Latin-1" http-equiv="Content-type" />
+ </head>
+ <body>
+ <p>Sacr\xe9 bleu!</p>
+ </body>
+ </html>
+ '''
+
+ soup = BeautifulSoup(markup)
+ print(soup.prettify())
+ # <html>
+ # <head>
+ # <meta content="text/html; charset=utf-8" http-equiv="Content-type" />
+ # </head>
+ # <body>
+ # <p>
+ # Sacré bleu!
+ # </p>
+ # </body>
+ # </html>
+
+Обратите внимание, что тег <meta> был переписан, чтобы отразить тот факт, что
+теперь документ кодируется в UTF-8.
+
+Если вы не хотите кодировку UTF-8, вы можете передать другую в ``prettify()``::
+
+ print(soup.prettify("latin-1"))
+ # <html>
+ # <head>
+ # <meta content="text/html; charset=latin-1" http-equiv="Content-type" />
+ # ...
+
+Вы также можете вызвать encode() для объекта ``BeautifulSoup`` или любого
+элемента в супе, как если бы это была строка Python::
+
+ soup.p.encode("latin-1")
+ # '<p>Sacr\xe9 bleu!</p>'
+
+ soup.p.encode("utf-8")
+ # '<p>Sacr\xc3\xa9 bleu!</p>'
+
+Любые символы, которые не могут быть представлены в выбранной вами кодировке, будут
+преобразованы в числовые коды мнемоник XML. Вот документ,
+который включает в себя Unicode-символ SNOWMAN (снеговик)::
+
+ markup = u"<b>\N{SNOWMAN}</b>"
+ snowman_soup = BeautifulSoup(markup)
+ tag = snowman_soup.b
+
+Символ SNOWMAN может быть частью документа UTF-8 (он выглядит
+так: ☃), но в ISO-Latin-1 или
+ASCII нет представления для этого символа, поэтому для этих кодировок он конвертируется в "&#9731;":
+
+ print(tag.encode("utf-8"))
+ # <b>☃</b>
+
+ print tag.encode("latin-1")
+ # <b>&#9731;</b>
+
+ print tag.encode("ascii")
+ # <b>&#9731;</b>
+
+Unicode, Dammit
+---------------
+
+Вы можете использовать Unicode, Dammit без Beautiful Soup. Он полезен в тех случаях.
+когда у вас есть данные в неизвестной кодировке, и вы просто хотите, чтобы они
+преобразовались в Unicode::
+
+ from bs4 import UnicodeDammit
+ dammit = UnicodeDammit("Sacr\xc3\xa9 bleu!")
+ print(dammit.unicode_markup)
+ # Sacré bleu!
+ dammit.original_encoding
+ # 'utf-8'
+
+Догадки Unicode, Dammit станут намного точнее, если вы установите
+библиотеки Python ``chardet`` или ``cchardet``. Чем больше данных вы
+даете Unicode, Dammit, тем точнее он определит кодировку. Если у вас есть
+собственные предположения относительно возможных кодировок, вы можете передать
+их в виде списка::
+
+ dammit = UnicodeDammit("Sacr\xe9 bleu!", ["latin-1", "iso-8859-1"])
+ print(dammit.unicode_markup)
+ # Sacré bleu!
+ dammit.original_encoding
+ # 'latin-1'
+
+В Unicode, Dammit есть две специальные функции, которые Beautiful Soup не
+использует.
+
+Парные кавычки
+^^^^^^^^^^^^^^
+
+Вы можете использовать Unicode, Dammit, чтобы конвертировать парные кавычки (Microsoft smart quotes) в
+мнемоники HTML или XML::
+
+ markup = b"<p>I just \x93love\x94 Microsoft Word\x92s smart quotes</p>"
+
+ UnicodeDammit(markup, ["windows-1252"], smart_quotes_to="html").unicode_markup
+ # u'<p>I just &ldquo;love&rdquo; Microsoft Word&rsquo;s smart quotes</p>'
+
+ UnicodeDammit(markup, ["windows-1252"], smart_quotes_to="xml").unicode_markup
+ # u'<p>I just &#x201C;love&#x201D; Microsoft Word&#x2019;s smart quotes</p>'
+
+Вы также можете конвертировать парные кавычки в обычные кавычки ASCII::
+
+ UnicodeDammit(markup, ["windows-1252"], smart_quotes_to="ascii").unicode_markup
+ # u'<p>I just "love" Microsoft Word\'s smart quotes</p>'
+
+Надеюсь, вы найдете эту функцию полезной, но Beautiful Soup не
+использует ее. Beautiful Soup по умолчанию
+конвертирует парные кавычки в символы Unicode, как и
+все остальное::
+
+ UnicodeDammit(markup, ["windows-1252"]).unicode_markup
+ # u'<p>I just \u201clove\u201d Microsoft Word\u2019s smart quotes</p>'
+
+Несогласованные кодировки
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Иногда документ кодирован в основном в UTF-8, но содержит символы Windows-1252,
+такие как, опять-таки, парные кавычки. Такое бывает,
+когда веб-сайт содержит данные из нескольких источников. Вы можете использовать
+``UnicodeDammit.detwingle()``, чтобы превратить такой документ в чистый
+UTF-8. Вот простой пример::
+
+ snowmen = (u"\N{SNOWMAN}" * 3)
+ quote = (u"\N{LEFT DOUBLE QUOTATION MARK}I like snowmen!\N{RIGHT DOUBLE QUOTATION MARK}")
+ doc = snowmen.encode("utf8") + quote.encode("windows_1252")
+
+В этом документе бардак. Снеговики в UTF-8, а парные кавычки
+в Windows-1252. Можно отображать или снеговиков, или кавычки, но не
+то и другое одновременно::
+
+ print(doc)
+ # ☃☃☃�I like snowmen!�
+
+ print(doc.decode("windows-1252"))
+ # ☃☃☃“I like snowmen!”
+
+Декодирование документа как UTF-8 вызывает ``UnicodeDecodeError``, а
+декодирование его как Windows-1252 выдаст тарабарщину. К счастью,
+``UnicodeDammit.detwingle()`` преобразует строку в чистый UTF-8,
+позволяя затем декодировать его в Unicode и отображать снеговиков и кавычки
+одновременно::
+
+ new_doc = UnicodeDammit.detwingle(doc)
+ print(new_doc.decode("utf8"))
+ # ☃☃☃“I like snowmen!”
+
+``UnicodeDammit.detwingle()`` знает только, как обрабатывать Windows-1252,
+встроенный в UTF-8 (и наоборот, мне кажется), но это наиболее
+общий случай.
+
+Обратите внимание, что нужно вызывать ``UnicodeDammit.detwingle()`` для ваших данных
+перед передачей в конструктор ``BeautifulSoup`` или
+``UnicodeDammit``. Beautiful Soup предполагает, что документ имеет единую
+кодировку, какой бы она ни была. Если вы передадите ему документ, который
+содержит как UTF-8, так и Windows-1252, скорее всего, он решит, что весь
+документ кодируется в Windows-1252, и это будет выглядеть как
+``☃☃☃“I like snowmen!”``.
+
+``UnicodeDammit.detwingle()`` — это новое в Beautiful Soup 4.1.0.
+
+Нумерация строк
+===============
+
+Парсеры ``html.parser`` и ``html5lib`` могут отслеживать, где в
+исходном документе был найден каждый тег. Вы можете получить доступ к этой
+информации через ``Tag.sourceline`` (номер строки) и ``Tag.sourcepos``
+(позиция начального тега в строке)::
+
+ markup = "<p\n>Paragraph 1</p>\n <p>Paragraph 2</p>"
+ soup = BeautifulSoup(markup, 'html.parser')
+ for tag in soup.find_all('p'):
+ print(tag.sourceline, tag.sourcepos, tag.string)
+ # (1, 0, u'Paragraph 1')
+ # (2, 3, u'Paragraph 2')
+
+Обратите внимание, что два парсера понимают
+``sourceline`` и ``sourcepos`` немного по-разному. Для html.parser эти числа
+представляет позицию начального знака "<". Для html5lib
+эти числа представляют позицию конечного знака ">"::
+
+ soup = BeautifulSoup(markup, 'html5lib')
+ for tag in soup.find_all('p'):
+ print(tag.sourceline, tag.sourcepos, tag.string)
+ # (2, 1, u'Paragraph 1')
+ # (3, 7, u'Paragraph 2')
+
+Вы можете отключить эту функцию, передав ``store_line_numbers = False``
+в конструктор ``BeautifulSoup``::
+
+ markup = "<p\n>Paragraph 1</p>\n <p>Paragraph 2</p>"
+ soup = BeautifulSoup(markup, 'html.parser', store_line_numbers=False)
+ soup.p.sourceline
+ # None
+
+Эта функция является новой в 4.8.1, и парсеры, основанные на lxml, не
+поддерживают ее.
+
+Проверка объектов на равенство
+==============================
+
+Beautiful Soup считает, что два объекта ``NavigableString`` или ``Tag``
+равны, если они представлены в одинаковой разметке HTML или XML. В этом
+примере два тега <b> рассматриваются как равные, даже если они находятся
+в разных частях дерева объекта, потому что они оба выглядят как
+``<b>pizza</b>``::
+
+ markup = "<p>I want <b>pizza</b> and more <b>pizza</b>!</p>"
+ soup = BeautifulSoup(markup, 'html.parser')
+ first_b, second_b = soup.find_all('b')
+ print first_b == second_b
+ # True
+
+ print first_b.previous_element == second_b.previous_element
+ # False
+
+Если вы хотите выяснить, указывают ли две переменные на один и тот же
+объект, используйте `is`::
+
+ print first_b is second_b
+ # False
+
+Копирование объектов Beautiful Soup
+===================================
+
+Вы можете использовать ``copy.copy()`` для создания копии любого ``Tag`` или
+``NavigableString``::
+
+ import copy
+ p_copy = copy.copy(soup.p)
+ print p_copy
+ # <p>I want <b>pizza</b> and more <b>pizza</b>!</p>
+
+Копия считается равной оригиналу, так как у нее
+такая же разметка, что и у оригинала, но это другой объект::
+
+ print soup.p == p_copy
+ # True
+
+ print soup.p is p_copy
+ # False
+
+Единственная настоящая разница в том, что копия полностью отделена от
+исходного дерева объекта Beautiful Soup, как если бы в отношении нее вызвали
+метод ``extract()``::
+
+ print p_copy.parent
+ # None
+
+Это потому, что два разных объекта ``Tag`` не могут занимать одно и то же
+пространство в одно и то же время.
+
+
+Разбор части документа
+======================
+
+Допустим, вы хотите использовать Beautiful Soup, чтобы посмотреть на
+теги <a> в документе. Было бы бесполезной тратой времени и памяти разобирать весь документ и
+затем снова проходить по нему в поисках тегов <a>. Намного быстрее
+изначательно игнорировать все, что не является тегом <a>. Класс
+``SoupStrainer`` позволяет выбрать, какие части входящего
+документ разбирать. Вы просто создаете ``SoupStrainer`` и передаете его в
+конструктор ``BeautifulSoup`` в качестве аргумента ``parse_only``.
+
+(Обратите внимание, что *эта функция не будет работать, если вы используете парсер html5lib*.
+Если вы используете html5lib, будет разобран весь документ, независимо
+от обстоятельств. Это потому что html5lib постоянно переставляет части дерева разбора
+в процессе работы, и если какая-то часть документа не
+попала в дерево разбора, все рухнет. Чтобы избежать путаницы, в
+примерах ниже я принудительно использую встроенный в Python
+парсер HTML.)
+
+``SoupStrainer``
+----------------
+
+Класс ``SoupStrainer`` принимает те же аргументы, что и типичный
+метод из раздела `Поиск по дереву`_: :ref:`name <name>`, :ref:`attrs
+<attrs>`, :ref:`string <string>` и :ref:`**kwargs <kwargs>`. Вот
+три объекта ``SoupStrainer``::
+
+ from bs4 import SoupStrainer
+
+ only_a_tags = SoupStrainer("a")
+
+ only_tags_with_id_link2 = SoupStrainer(id="link2")
+
+ def is_short_string(string):
+ return len(string) < 10
+
+ only_short_strings = SoupStrainer(string=is_short_string)
+
+Вернемся к фрагменту из «Алисы в стране чудес»
+и увидим, как выглядит документ, когда он разобран с этими
+тремя объектами ``SoupStrainer``::
+
+ html_doc = """
+ <html><head><title>The Dormouse's story</title></head>
+ <body>
+ <p class="title"><b>The Dormouse's story</b></p>
+
+ <p class="story">Once upon a time there were three little sisters; and their names were
+ <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
+ <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
+ <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
+ and they lived at the bottom of a well.</p>
+
+ <p class="story">...</p>
+ """
+
+ print(BeautifulSoup(html_doc, "html.parser", parse_only=only_a_tags).prettify())
+ # <a class="sister" href="http://example.com/elsie" id="link1">
+ # Elsie
+ # </a>
+ # <a class="sister" href="http://example.com/lacie" id="link2">
+ # Lacie
+ # </a>
+ # <a class="sister" href="http://example.com/tillie" id="link3">
+ # Tillie
+ # </a>
+
+ print(BeautifulSoup(html_doc, "html.parser", parse_only=only_tags_with_id_link2).prettify())
+ # <a class="sister" href="http://example.com/lacie" id="link2">
+ # Lacie
+ # </a>
+
+ print(BeautifulSoup(html_doc, "html.parser", parse_only=only_short_strings).prettify())
+ # Elsie
+ # ,
+ # Lacie
+ # and
+ # Tillie
+ # ...
+ #
+
+Вы также можете передать ``SoupStrainer`` в любой из методов. описанных в разделе
+`Поиск по дереву`_. Может, это не безумно полезно, но я
+решил упомянуть::
+
+ soup = BeautifulSoup(html_doc)
+ soup.find_all(only_short_strings)
+ # [u'\n\n', u'\n\n', u'Elsie', u',\n', u'Lacie', u' and\n', u'Tillie',
+ # u'\n\n', u'...', u'\n']
+
+Устранение неисправностей
+=========================
+
+.. _diagnose:
+
+``diagnose()``
+--------------
+
+Если у вас возникли проблемы с пониманием того, что Beautiful Soup делает с
+документом, передайте документ в функцию ``Diagnose()``. (Новое в
+Beautiful Soup 4.2.0.) Beautiful Soup выведет отчет, показывающий,
+как разные парсеры обрабатывают документ, и сообщит вам, если
+отсутствует парсер, который Beautiful Soup мог бы использовать::
+
+ from bs4.diagnose import diagnose
+ with open("bad.html") as fp:
+ data = fp.read()
+ diagnose(data)
+
+ # Diagnostic running on Beautiful Soup 4.2.0
+ # Python version 2.7.3 (default, Aug 1 2012, 05:16:07)
+ # I noticed that html5lib is not installed. Installing it may help.
+ # Found lxml version 2.3.2.0
+ #
+ # Trying to parse your data with html.parser
+ # Here's what html.parser did with the document:
+ # ...
+
+Простой взгляд на вывод diagnose() может показать, как решить
+проблему. Если это и не поможет, вы можете скопировать вывод ``Diagnose()``, когда
+обратитесь за помощью.
+
+Ошибки при разборе документа
+----------------------------
+
+Существует два вида ошибок разбора. Есть сбои,
+когда вы подаете документ в Beautiful Soup, и это поднимает
+исключение, обычно ``HTMLParser.HTMLParseError``. И есть
+неожиданное поведение, когда дерево разбора Beautiful Soup сильно
+отличается от документа, использованного для создания дерева.
+
+Практически никогда источником этих проблемы не бывает Beautiful
+Soup. Это не потому, что Beautiful Soup так прекрасно
+написан. Это потому, что Beautiful Soup не содержит
+кода, который бы разбирал документ. Beautiful Soup опирается на внешние парсеры. Если один парсер
+не подходит для разбора документа, лучшим решением будет попробовать
+другой парсер. В разделе `Установка парсера`_ вы найдете больше информации
+и таблицу сравнения парсеров.
+
+Наиболее распространенные ошибки разбора — это ``HTMLParser.HTMLParseError:
+malformed start tag`` и ``HTMLParser.HTMLParseError: bad end
+tag``. Они оба генерируются встроенным в Python парсером HTML,
+и решением будет :ref:`установить lxml или
+html5lib. <parser-installation>`
+
+Наиболее распространенный тип неожиданного поведения — когда вы не можете найти
+тег, который точно есть в документе. Вы видели его на входе, но
+``find_all()`` возвращает ``[]``, или ``find()`` возвращает ``None``. Это
+еще одна распространенная проблема со встроенным в Python парсером HTML, который
+иногда пропускает теги, которые он не понимает. Опять же, решение заключается в
+:ref:`установке lxml или html5lib <parser-installation>`.
+
+Проблемы несоответствия версий
+------------------------------
+
+* ``SyntaxError: Invalid syntax`` (в строке ``ROOT_TAG_NAME =
+ u'[document]'``) — вызвано запуском версии Beautiful Soup на Python 2
+ под Python 3 без конвертации кода.
+
+* ``ImportError: No module named HTMLParser`` — вызвано запуском
+ версия Beautiful Soup на Python 3 под Python 2.
+
+* ``ImportError: No module named html.parser`` — вызвано запуском
+ версия Beautiful Soup на Python 2 под Python 3.
+
+* ``ImportError: No module named BeautifulSoup`` — вызвано запуском
+ кода Beautiful Soup 3 в системе, где BS3
+ не установлен. Или код писали на Beautiful Soup 4, не зная, что
+ имя пакета сменилось на ``bs4``.
+
+* ``ImportError: No module named bs4`` — вызвано запуском
+ кода Beautiful Soup 4 в системе, где BS4 не установлен.
+
+.. _parsing-xml:
+
+Разбор XML
+----------
+
+По умолчанию Beautiful Soup разбирает документы как HTML. Чтобы разобрать
+документ в виде XML, передайте "xml" в качестве второго аргумента
+в конструктор ``BeautifulSoup``::
+
+ soup = BeautifulSoup(markup, "xml")
+
+Вам также нужно будет :ref:`установить lxml <parser-installation>`.
+
+Другие проблемы с парсерами
+---------------------------
+
+* Если ваш скрипт работает на одном компьютере, но не работает на другом, или работает в одной
+ виртуальной среде, но не в другой, или работает вне виртуальной
+ среды, но не внутри нее, это, вероятно, потому что в двух
+ средах разные библиотеки парсеров. Например,
+ вы могли разработать скрипт на компьютере с установленным lxml,
+ а затем попытались запустить его на компьютере, где установлен только
+ html5lib. Читайте в разделе `Различия между парсерами`_, почему это
+ важно, и исправляйте проблемы, указывая конкретную библиотеку парсера
+ в конструкторе ``BeautifulSoup``.
+
+* Поскольку `HTML-теги и атрибуты нечувствительны к регистру
+ <http://www.w3.org/TR/html5/syntax.html#syntax>`_, все три HTML-
+ парсера конвертируют имена тегов и атрибутов в нижний регистр. Таким образом,
+ разметка <TAG></TAG> преобразуется в <tag></tag>. Если вы хотите
+ сохранить смешанный или верхний регистр тегов и атрибутов, вам нужно
+ :ref:`разобрать документ как XML <parsing-xml>`.
+
+.. _misc:
+
+Прочие ошибки
+-------------
+
+* ``UnicodeEncodeError: 'charmap' codec can't encode character
+ u'\xfoo' in position bar`` (или практически любая другая ошибка
+ ``UnicodeEncodeError``) — это не проблема с Beautiful Soup.
+ Эта проблема проявляется в основном в двух ситуациях. Во-первых, когда вы пытаетесь
+ вывести символ Unicode, который ваша консоль не может отобразить, потому что не знает, как.
+ (Смотрите `эту страницу в Python вики
+ <http://wiki.python.org/moin/PrintFails>`_.) Во-вторых, когда
+ вы пишете в файл и передаете символ Unicode, который
+ не поддерживается вашей кодировкой по умолчанию. В этом случае самым простым
+ решением будет явное кодирование строки Unicode в UTF-8 с помощью
+ ``u.encode("utf8")``.
+
+* ``KeyError: [attr]`` — вызывается при обращении к ``tag['attr']``, когда
+ в искомом теге не определен атрибут ``attr``. Наиболее
+ типичны ошибки ``KeyError: 'href'`` и ``KeyError:
+ 'class'``. Используйте ``tag.get('attr')``, если вы не уверены, что ``attr``
+ определен — так же, как если бы вы работали со словарем Python.
+
+* ``AttributeError: 'ResultSet' object has no attribute 'foo'`` — это
+ обычно происходит тогда, когда вы ожидаете, что ``find_all()`` вернет
+ один тег или строку. Но ``find_all()`` возвращает *список* тегов
+ и строк в объекте ``ResultSet``. Вам нужно перебрать
+ список и поискать ``.foo`` в каждом из элементов. Или, если вам действительно
+ нужен только один результат, используйте ``find()`` вместо
+ ``find_all()``.
+
+* ``AttributeError: 'NoneType' object has no attribute 'foo'`` — это
+ обычно происходит, когда вы вызываете ``find()`` и затем пытаетесь
+ получить доступ к атрибуту ``.foo``. Но в вашем случае
+ ``find()`` не нашел ничего, поэтому вернул ``None`` вместо
+ того, чтобы вернуть тег или строку. Вам нужно выяснить, почему
+ ``find()`` ничего не возвращает.
+
+Повышение производительности
+----------------------------
+
+Beautiful Soup никогда не будет таким же быстрым, как парсеры, на основе которых он
+работает. Если время отклика критично, если вы платите за компьютерное время
+по часам, или если есть какая-то другая причина, почему компьютерное время
+важнее программистского, стоит забыть о Beautiful Soup
+и работать непосредственно с `lxml <http://lxml.de/>`_.
+
+Тем не менее, есть вещи, которые вы можете сделать, чтобы ускорить Beautiful Soup. Если
+вы не используете lxml в качестве основного парсера, самое время
+:ref:`начать <parser-installation>`. Beautiful Soup разбирает документы
+значительно быстрее с lxml, чем с html.parser или html5lib.
+
+Вы можете значительно ускорить распознавание кодировок, установив
+библиотеку `cchardet <http://pypi.python.org/pypi/cchardet/>`_.
+
+`Разбор части документа`_ не сэкономит много времени в процессе разбора,
+но может сэкономить много памяти, что сделает
+`поиск` по документу намного быстрее.
+
+
+Beautiful Soup 3
+================
+
+Beautiful Soup 3 — предыдущая версия, и она больше
+активно не развивается. На текущий момент Beautiful Soup 3 поставляется со всеми основными
+дистрибутивами Linux:
+
+:kbd:`$ apt-get install python-beautifulsoup`
+
+Он также публикуется через PyPi как ``BeautifulSoup``:
+
+:kbd:`$ easy_install BeautifulSoup`
+
+:kbd:`$ pip install BeautifulSoup`
+
+Вы можете скачать `tar-архив Beautiful Soup 3.2.0
+<http://www.crummy.com/software/BeautifulSoup/bs3/download/3.x/BeautifulSoup-3.2.0.tar.gz>`_.
+
+Если вы запустили ``easy_install beautifulsoup`` или ``easy_install
+BeautifulSoup``, но ваш код не работает, значит, вы ошибочно установили Beautiful
+Soup 3. Вам нужно запустить ``easy_install beautifulsoup4``.
+
+Архивная документация для Beautiful Soup 3 доступна `онлайн
+<http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html>`_.
+
+Перенос кода на BS4
+-------------------
+
+Большая часть кода, написанного для Beautiful Soup 3, будет работать и в Beautiful
+Soup 4 с одной простой заменой. Все, что вам нужно сделать, это изменить
+имя пакета c ``BeautifulSoup`` на ``bs4``. Так что это::
+
+ from BeautifulSoup import BeautifulSoup
+
+становится этим::
+
+ from bs4 import BeautifulSoup
+
+* Если выводится сообщение ``ImportError`` "No module named BeautifulSoup", ваша
+ проблема в том, что вы пытаетесь запустить код Beautiful Soup 3, в то время как
+ у вас установлен Beautiful Soup 4.
+
+* Если выводится сообщение ``ImportError`` "No module named bs4", ваша проблема
+ в том, что вы пытаетесь запустить код Beautiful Soup 4, в то время как
+ у вас установлен Beautiful Soup 3.
+
+Хотя BS4 в основном обратно совместим с BS3, большинство
+методов BS3 устарели и получили новые имена, чтобы `соответствовать PEP 8
+<http://www.python.org/dev/peps/pep-0008/>`_. Некоторые
+из переименований и изменений нарушают обратную совместимость.
+
+Вот что нужно знать, чтобы перейти с BS3 на BS4:
+
+Вам нужен парсер
+^^^^^^^^^^^^^^^^
+
+Beautiful Soup 3 использовал модуль Python ``SGMLParser``, который теперь
+устарел и был удален в Python 3.0. Beautiful Soup 4 по умолчанию использует
+``html.parser``, но вы можете подключить lxml или html5lib
+вместо него. Вы найдете таблицу сравнения парсеров в разделе `Установка парсера`_.
+
+Поскольку ``html.parser`` — это не то же, что ``SGMLParser``, вы
+можете обнаружить, что Beautiful Soup 4 дает другое дерево разбора, чем
+Beautiful Soup 3. Если вы замените html.parser
+на lxml или html5lib, может оказаться, что дерево разбора опять
+изменилось. Если такое случится, вам придется обновить код,
+чтобы разобраться с новым деревом.
+
+Имена методов
+^^^^^^^^^^^^^
+
+* ``renderContents`` -> ``encode_contents``
+* ``replaceWith`` -> ``replace_with``
+* ``replaceWithChildren`` -> ``unwrap``
+* ``findAll`` -> ``find_all``
+* ``findAllNext`` -> ``find_all_next``
+* ``findAllPrevious`` -> ``find_all_previous``
+* ``findNext`` -> ``find_next``
+* ``findNextSibling`` -> ``find_next_sibling``
+* ``findNextSiblings`` -> ``find_next_siblings``
+* ``findParent`` -> ``find_parent``
+* ``findParents`` -> ``find_parents``
+* ``findPrevious`` -> ``find_previous``
+* ``findPreviousSibling`` -> ``find_previous_sibling``
+* ``findPreviousSiblings`` -> ``find_previous_siblings``
+* ``getText`` -> ``get_text``
+* ``nextSibling`` -> ``next_sibling``
+* ``previousSibling`` -> ``previous_sibling``
+
+Некоторые аргументы конструктора Beautiful Soup были переименованы по
+той же причине:
+
+* ``BeautifulSoup(parseOnlyThese=...)`` -> ``BeautifulSoup(parse_only=...)``
+* ``BeautifulSoup(fromEncoding=...)`` -> ``BeautifulSoup(from_encoding=...)``
+
+Я переименовал один метод для совместимости с Python 3:
+
+* ``Tag.has_key()`` -> ``Tag.has_attr()``
+
+Я переименовал один атрибут, чтобы использовать более точную терминологию:
+
+* ``Tag.isSelfClosing`` -> ``Tag.is_empty_element``
+
+Я переименовал три атрибута, чтобы избежать использования зарезервированных слов
+в Python. В отличие от других, эти изменения *не являются обратно
+совместимыми*. Если вы использовали эти атрибуты в BS3, ваш код не сработает
+на BS4, пока вы их не измените.
+
+* ``UnicodeDammit.unicode`` -> ``UnicodeDammit.unicode_markup``
+* ``Tag.next`` -> ``Tag.next_element``
+* ``Tag.previous`` -> ``Tag.previous_element``
+
+Генераторы
+^^^^^^^^^^
+
+Я дал генераторам PEP 8-совместимые имена и преобразовал их в
+свойства:
+
+* ``childGenerator()`` -> ``children``
+* ``nextGenerator()`` -> ``next_elements``
+* ``nextSiblingGenerator()`` -> ``next_siblings``
+* ``previousGenerator()`` -> ``previous_elements``
+* ``previousSiblingGenerator()`` -> ``previous_siblings``
+* ``recursiveChildGenerator()`` -> ``descendants``
+* ``parentGenerator()`` -> ``parents``
+
+Так что вместо этого::
+
+ for parent in tag.parentGenerator():
+ ...
+
+Вы можете написать это::
+
+ for parent in tag.parents:
+ ...
+
+(Хотя старый код тоже будет работать.)
+
+Некоторые генераторы выдавали ``None`` после их завершения и
+останавливались. Это была ошибка. Теперь генераторы просто останавливаются.
+
+Добавились два генератора: :ref:`.strings и
+.stripped_strings <string-generators>`.
+
+``.strings`` выдает
+объекты NavigableString, а ``.stripped_strings`` выдает строки Python,
+у которых удалены пробелы.
+
+XML
+^^^
+
+Больше нет класса ``BeautifulStoneSoup`` для разбора XML. Чтобы
+разобрать XML, нужно передать "xml" в качестве второго аргумента
+в конструктор ``BeautifulSoup``. По той же причине
+конструктор ``BeautifulSoup`` больше не распознает
+аргумент ``isHTML``.
+
+Улучшена обработка пустых тегов
+XML. Ранее при разборе XML нужно было явно указать,
+какие теги считать пустыми элементами. Аргумент ``SelfClosingTags``
+больше не распознается. Вместо этого
+Beautiful Soup считает пустым элементом любой тег без содержимого. Если
+вы добавляете в тег дочерний элемент, тег больше не считается
+пустым элементом.
+
+Мнемоники
+^^^^^^^^^
+
+Входящие мнемоники HTML или XML всегда преобразуются в
+соответствующие символы Unicode. В Beautiful Soup 3 было несколько
+перекрывающих друг друга способов взаимодействия с мнемониками. Эти способы
+удалены. Конструктор ``BeautifulSoup`` больше не распознает
+аргументы ``smartQuotesTo`` и ``convertEntities``. (В `Unicode,
+Dammit`_ все еще присутствует ``smart_quotes_to``, но по умолчанию парные кавычки
+преобразуются в Unicode). Константы ``HTML_ENTITIES``,
+``XML_ENTITIES`` и ``XHTML_ENTITIES`` были удалены, так как они
+служили для настройки функции, которой больше нет (преобразование отдельных мнемоник в
+символы Unicode).
+
+Если вы хотите на выходе преобразовать символы Unicode обратно в мнемоники HTML,
+а не превращать Unicode в символы UTF-8, вам нужно
+использовать :ref:`средства форматирования вывода <output_formatters>`.
+
+Прочее
+^^^^^^
+
+:ref:`Tag.string <.string>` теперь работает рекурсивно. Если тег А
+содержит только тег B и ничего больше, тогда значение A.string будет таким же, как
+B.string. (Раньше это был None.)
+
+`Многозначные атрибуты`_, такие как ``class``, теперь в качестве значений имеют списки строк,
+а не строки. Это может повлиять на поиск
+по классу CSS.
+
+Если вы передадите в один из методов ``find*`` одновременно :ref:`string <string>` `и`
+специфичный для тега аргумент, такой как :ref:`name <name>`, Beautiful Soup будет
+искать теги, которые, во-первых, соответствуют специфичным для тега критериям, и, во-вторых, имеют
+:ref:`Tag.string <.string>`, соответствующий заданному вами значению :ref:`string
+<string>`. Beautiful Soup `не` найдет сами строки. Ранее
+Beautiful Soup игнорировал аргументы, специфичные для тегов, и искал
+строки.
+
+Конструктор ``BeautifulSoup`` больше не распознает
+аргумент `markupMassage`. Теперь это задача парсера —
+обрабатывать разметку правильно.
+
+Редко используемые альтернативные классы парсеров, такие как
+``ICantBelieveItsBeautifulSoup`` и ``BeautifulSOAP``,
+удалены. Теперь парсер решает, что делать с неоднозначной
+разметкой.
+
+Метод ``prettify()`` теперь возвращает строку Unicode, а не байтовую строку.
+
+Перевод документации
+====================
+
+Переводы документации Beautiful Soup очень
+приветствуются. Перевод должен быть лицензирован по лицензии MIT,
+так же, как сам Beautiful Soup и англоязычная документация к нему.
+
+Есть два способа передать ваш перевод:
+
+1. Создайте ветку репозитория Beautiful Soup, добавьте свой
+ перевод и предложите слияние с основной веткой — так же,
+ как вы предложили бы изменения исходного кода.
+2. Отправьте `в дискуссионную группу Beautiful Soup <https://groups.google.com/forum/?fromgroups#!forum/beautifulsoup>`_
+ сообщение со ссылкой на
+ ваш перевод, или приложите перевод к сообщению.
+
+Используйте существующие переводы документации на китайский или португальский в качестве образца. В
+частности, переводите исходный файл ``doc/source/index.rst`` вместо
+того, чтобы переводить HTML-версию документации. Это позволяет
+публиковать документацию в разных форматах, не
+только в HTML.
+
+Об этом переводе
+----------------
+
+Перевод на русский язык: `authoress <mailto:geekwriter@yandex.ru>`_
+
+Дата перевода: февраль 2020
+
+Перевод выполнен с `оригинала на английском языке <https://www.crummy.com/software/BeautifulSoup/bs4/doc/>`_.
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ru/source/conf.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ru/source/conf.py
new file mode 100644
index 00000000000..77f417e7ea2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ru/source/conf.py
@@ -0,0 +1,256 @@
+# -*- coding: utf-8 -*-
+#
+# Beautiful Soup documentation build configuration file, created by
+# sphinx-quickstart on Thu Jan 26 11:22:55 2012.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration -----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = []
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'Beautiful Soup'
+copyright = u'2004-2020, Leonard Richardson'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '4'
+# The full version, including alpha/beta/rc tags.
+release = '4.9.0'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+# language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = []
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+html_theme = 'default'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further. For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar. Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'BeautifulSoupdoc'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+ ('index', 'BeautifulSoup.tex', u'Beautiful Soup Documentation',
+ u'Leonard Richardson', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output --------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+ ('index', 'beautifulsoup', u'Beautiful Soup Documentation',
+ [u'Leonard Richardson'], 1)
+]
+
+
+# -- Options for Epub output ---------------------------------------------------
+
+# Bibliographic Dublin Core info.
+epub_title = u'Beautiful Soup'
+epub_author = u'Leonard Richardson'
+epub_publisher = u'Leonard Richardson'
+epub_copyright = u'2012, Leonard Richardson'
+
+# The language of the text. It defaults to the language option
+# or en if the language is not set.
+#epub_language = ''
+
+# The scheme of the identifier. Typical schemes are ISBN or URL.
+#epub_scheme = ''
+
+# The unique identifier of the text. This can be a ISBN number
+# or the project homepage.
+#epub_identifier = ''
+
+# A unique identification for the text.
+#epub_uid = ''
+
+# HTML files that should be inserted before the pages created by sphinx.
+# The format is a list of tuples containing the path and title.
+#epub_pre_files = []
+
+# HTML files shat should be inserted after the pages created by sphinx.
+# The format is a list of tuples containing the path and title.
+#epub_post_files = []
+
+# A list of files that should not be packed into the epub file.
+#epub_exclude_files = []
+
+# The depth of the table of contents in toc.ncx.
+#epub_tocdepth = 3
+
+# Allow duplicate toc entries.
+#epub_tocdup = True
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ru/source/index.rst b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ru/source/index.rst
new file mode 100644
index 00000000000..31b87d33cea
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.ru/source/index.rst
@@ -0,0 +1,17 @@
+.. bs4RUdocs documentation master file, created by
+ sphinx-quickstart on Sat Feb 1 21:26:47 2020.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+Beautiful Soup на русском языке
+===============================
+
+Переведено на русский `authoress <http://geekwriter.ru/>`_.
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Оглавление:
+
+ bs4ru
+
+
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.zh/Makefile b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.zh/Makefile
new file mode 100644
index 00000000000..8c833d2cedb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.zh/Makefile
@@ -0,0 +1,130 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS =
+SPHINXBUILD = sphinx-build
+PAPER =
+BUILDDIR = build
+
+# Internal variables.
+PAPEROPT_a4 = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
+
+help:
+ @echo "Please use \`make <target>' where <target> is one of"
+ @echo " html to make standalone HTML files"
+ @echo " dirhtml to make HTML files named index.html in directories"
+ @echo " singlehtml to make a single large HTML file"
+ @echo " pickle to make pickle files"
+ @echo " json to make JSON files"
+ @echo " htmlhelp to make HTML files and a HTML help project"
+ @echo " qthelp to make HTML files and a qthelp project"
+ @echo " devhelp to make HTML files and a Devhelp project"
+ @echo " epub to make an epub"
+ @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+ @echo " latexpdf to make LaTeX files and run them through pdflatex"
+ @echo " text to make text files"
+ @echo " man to make manual pages"
+ @echo " changes to make an overview of all changed/added/deprecated items"
+ @echo " linkcheck to check all external links for integrity"
+ @echo " doctest to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+ -rm -rf $(BUILDDIR)/*
+
+html:
+ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+ $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+ $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+ @echo
+ @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+ $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+ @echo
+ @echo "Build finished; now you can process the pickle files."
+
+json:
+ $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+ @echo
+ @echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+ $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+ @echo
+ @echo "Build finished; now you can run HTML Help Workshop with the" \
+ ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+ $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+ @echo
+ @echo "Build finished; now you can run "qcollectiongenerator" with the" \
+ ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+ @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/BeautifulSoup.qhcp"
+ @echo "To view the help file:"
+ @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/BeautifulSoup.qhc"
+
+devhelp:
+ $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+ @echo
+ @echo "Build finished."
+ @echo "To view the help file:"
+ @echo "# mkdir -p $$HOME/.local/share/devhelp/BeautifulSoup"
+ @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/BeautifulSoup"
+ @echo "# devhelp"
+
+epub:
+ $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+ @echo
+ @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo
+ @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+ @echo "Run \`make' in that directory to run these through (pdf)latex" \
+ "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo "Running LaTeX files through pdflatex..."
+ make -C $(BUILDDIR)/latex all-pdf
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+ $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+ @echo
+ @echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+ $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+ @echo
+ @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+changes:
+ $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+ @echo
+ @echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+ $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+ @echo
+ @echo "Link check complete; look for any errors in the above output " \
+ "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+ $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+ @echo "Testing of doctests in the sources finished, look at the " \
+ "results in $(BUILDDIR)/doctest/output.txt."
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.zh/source/6.1.jpg b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.zh/source/6.1.jpg
new file mode 100644
index 00000000000..97014f0ec04
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.zh/source/6.1.jpg
Binary files differ
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.zh/source/conf.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.zh/source/conf.py
new file mode 100644
index 00000000000..102c3cf972a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.zh/source/conf.py
@@ -0,0 +1,256 @@
+# -*- coding: utf-8 -*-
+#
+# Beautiful Soup documentation build configuration file, created by
+# sphinx-quickstart on Thu Jan 26 11:22:55 2012.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration -----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = []
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'Beautiful Soup'
+copyright = u'2012, Leonard Richardson'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '4'
+# The full version, including alpha/beta/rc tags.
+release = '4.2.0'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = []
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+html_theme = 'default'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further. For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar. Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'BeautifulSoupdoc'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+ ('index', 'BeautifulSoup.tex', u'Beautiful Soup Documentation',
+ u'Leonard Richardson', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output --------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+ ('index', 'beautifulsoup', u'Beautiful Soup Documentation',
+ [u'Leonard Richardson'], 1)
+]
+
+
+# -- Options for Epub output ---------------------------------------------------
+
+# Bibliographic Dublin Core info.
+epub_title = u'Beautiful Soup'
+epub_author = u'Leonard Richardson'
+epub_publisher = u'Leonard Richardson'
+epub_copyright = u'2012, Leonard Richardson'
+
+# The language of the text. It defaults to the language option
+# or en if the language is not set.
+#epub_language = ''
+
+# The scheme of the identifier. Typical schemes are ISBN or URL.
+#epub_scheme = ''
+
+# The unique identifier of the text. This can be a ISBN number
+# or the project homepage.
+#epub_identifier = ''
+
+# A unique identification for the text.
+#epub_uid = ''
+
+# HTML files that should be inserted before the pages created by sphinx.
+# The format is a list of tuples containing the path and title.
+#epub_pre_files = []
+
+# HTML files shat should be inserted after the pages created by sphinx.
+# The format is a list of tuples containing the path and title.
+#epub_post_files = []
+
+# A list of files that should not be packed into the epub file.
+#epub_exclude_files = []
+
+# The depth of the table of contents in toc.ncx.
+#epub_tocdepth = 3
+
+# Allow duplicate toc entries.
+#epub_tocdup = True
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.zh/source/index.rst b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.zh/source/index.rst
new file mode 100644
index 00000000000..228ef888411
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc.zh/source/index.rst
@@ -0,0 +1,2741 @@
+.. BeautifulSoup文档 documentation master file, created by
+ Deron Wang on Fri Nov 29 13:49:30 2013.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+Beautiful Soup 4.4.0 文档
+==========================
+
+`Beautiful Soup <http://www.crummy.com/software/BeautifulSoup/>`_ 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.
+
+这篇文档介绍了BeautifulSoup4中所有主要特性,并且有小例子.让我来向你展示它适合做什么,如何工作,怎样使用,如何达到你想要的效果,和处理异常情况.
+
+文档中出现的例子在Python2.7和Python3.2中的执行结果相同
+
+你可能在寻找 `Beautiful Soup3 <http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html>`_ 的文档,Beautiful Soup 3 目前已经停止开发,我们推荐在现在的项目中使用Beautiful Soup 4, `移植到BS4 <http://www.baidu.com>`_
+
+这篇帮助文档已经被翻译成了其它语言:
+
+* `这篇文档当然还有中文版. <https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/>`_
+* このページは日本語で利用できます(`外部リンク <http://kondou.com/BS4/>`_)
+* `이 문서는 한국어 번역도 가능합니다. <https://www.crummy.com/software/BeautifulSoup/bs4/doc.ko/>`_
+* `Este documento também está disponível em Português do Brasil. <https://www.crummy.com/software/BeautifulSoup/bs4/doc.ptbr/>`_
+* `Эта документация доступна на русском языке. <https://www.crummy.com/software/BeautifulSoup/bs4/doc.ru/>`_
+
+
+寻求帮助
+--------
+
+如果你有关于BeautifulSoup的问题,可以发送邮件到 `讨论组 <https://groups.google.com/forum/?fromgroups#!forum/beautifulsoup>`_ .如果你的问题包含了一段需要转换的HTML代码,那么确保你提的问题描述中附带这段HTML文档的 `代码诊断`_ [1]_
+
+快速开始
+========
+
+下面的一段HTML代码将作为例子被多次用到.这是 *爱丽丝梦游仙境的* 的一段内容(以后内容中简称为 *爱丽丝* 的文档):
+
+::
+
+ html_doc = """
+ <html><head><title>The Dormouse's story</title></head>
+ <body>
+ <p class="title"><b>The Dormouse's story</b></p>
+
+ <p class="story">Once upon a time there were three little sisters; and their names were
+ <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
+ <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
+ <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
+ and they lived at the bottom of a well.</p>
+
+ <p class="story">...</p>
+ """
+
+使用BeautifulSoup解析这段代码,能够得到一个 ``BeautifulSoup`` 的对象,并能按照标准的缩进格式的结构输出:
+
+::
+
+ from bs4 import BeautifulSoup
+ soup = BeautifulSoup(html_doc, 'html.parser')
+
+ print(soup.prettify())
+ # <html>
+ # <head>
+ # <title>
+ # The Dormouse's story
+ # </title>
+ # </head>
+ # <body>
+ # <p class="title">
+ # <b>
+ # The Dormouse's story
+ # </b>
+ # </p>
+ # <p class="story">
+ # Once upon a time there were three little sisters; and their names were
+ # <a class="sister" href="http://example.com/elsie" id="link1">
+ # Elsie
+ # </a>
+ # ,
+ # <a class="sister" href="http://example.com/lacie" id="link2">
+ # Lacie
+ # </a>
+ # and
+ # <a class="sister" href="http://example.com/tillie" id="link2">
+ # Tillie
+ # </a>
+ # ; and they lived at the bottom of a well.
+ # </p>
+ # <p class="story">
+ # ...
+ # </p>
+ # </body>
+ # </html>
+
+几个简单的浏览结构化数据的方法:
+
+::
+
+ soup.title
+ # <title>The Dormouse's story</title>
+
+ soup.title.name
+ # u'title'
+
+ soup.title.string
+ # u'The Dormouse's story'
+
+ soup.title.parent.name
+ # u'head'
+
+ soup.p
+ # <p class="title"><b>The Dormouse's story</b></p>
+
+ soup.p['class']
+ # u'title'
+
+ soup.a
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+ soup.find_all('a')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.find(id="link3")
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
+
+从文档中找到所有<a>标签的链接:
+
+::
+
+ for link in soup.find_all('a'):
+ print(link.get('href'))
+ # http://example.com/elsie
+ # http://example.com/lacie
+ # http://example.com/tillie
+
+从文档中获取所有文字内容:
+
+::
+
+ print(soup.get_text())
+ # The Dormouse's story
+ #
+ # The Dormouse's story
+ #
+ # Once upon a time there were three little sisters; and their names were
+ # Elsie,
+ # Lacie and
+ # Tillie;
+ # and they lived at the bottom of a well.
+ #
+ # ...
+
+这是你想要的吗?别着急,还有更好用的
+
+安装 Beautiful Soup
+======================
+
+如果你用的是新版的Debain或ubuntu,那么可以通过系统的软件包管理来安装:
+
+``$ apt-get install Python-bs4``
+
+Beautiful Soup 4 通过PyPi发布,所以如果你无法使用系统包管理安装,那么也可以通过 ``easy_install`` 或 ``pip`` 来安装.包的名字是 ``beautifulsoup4`` ,这个包兼容Python2和Python3.
+
+``$ easy_install beautifulsoup4``
+
+``$ pip install beautifulsoup4``
+
+(在PyPi中还有一个名字是 ``BeautifulSoup`` 的包,但那可能不是你想要的,那是 `Beautiful Soup3 <http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html>`_ 的发布版本,因为很多项目还在使用BS3, 所以 ``BeautifulSoup`` 包依然有效.但是如果你在编写新项目,那么你应该安装的 ``beautifulsoup4`` )
+
+如果你没有安装 ``easy_install`` 或 ``pip`` ,那你也可以 `下载BS4的源码 <http://www.crummy.com/software/BeautifulSoup/download/4.x/>`_ ,然后通过setup.py来安装.
+
+``$ Python setup.py install``
+
+如果上述安装方法都行不通,Beautiful Soup的发布协议允许你将BS4的代码打包在你的项目中,这样无须安装即可使用.
+
+作者在Python2.7和Python3.2的版本下开发Beautiful Soup, 理论上Beautiful Soup应该在所有当前的Python版本中正常工作
+
+安装完成后的问题
+-----------------
+
+Beautiful Soup发布时打包成Python2版本的代码,在Python3环境下安装时,会自动转换成Python3的代码,如果没有一个安装的过程,那么代码就不会被转换.
+
+如果代码抛出了 ``ImportError`` 的异常: "No module named HTMLParser", 这是因为你在Python3版本中执行Python2版本的代码.
+
+
+如果代码抛出了 ``ImportError`` 的异常: "No module named html.parser", 这是因为你在Python2版本中执行Python3版本的代码.
+
+如果遇到上述2种情况,最好的解决方法是重新安装BeautifulSoup4.
+
+如果在ROOT_TAG_NAME = u'[document]'代码处遇到 ``SyntaxError`` "Invalid syntax"错误,需要将把BS4的Python代码版本从Python2转换到Python3. 可以重新安装BS4:
+
+``$ Python3 setup.py install``
+
+或在bs4的目录中执行Python代码版本转换脚本
+
+``$ 2to3-3.2 -w bs4``
+
+安装解析器
+------------
+
+Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 `lxml <http://lxml.de/>`_ .根据操作系统不同,可以选择下列方法来安装lxml:
+
+``$ apt-get install Python-lxml``
+
+``$ easy_install lxml``
+
+``$ pip install lxml``
+
+另一个可供选择的解析器是纯Python实现的 `html5lib <http://code.google.com/p/html5lib/>`_ , html5lib的解析方式与浏览器相同,可以选择下列方法来安装html5lib:
+
+``$ apt-get install Python-html5lib``
+
+``$ easy_install html5lib``
+
+``$ pip install html5lib``
+
+下表列出了主要的解析器,以及它们的优缺点:
+
++-----------------------+---------------------------+---------------------------+---------------------------+
+| 解析器 | 使用方法 | 优势 | 劣势 |
++=======================+===========================+===========================+===========================+
+| Python标准库 | ``BeautifulSoup(markup, | - Python的内置标准库 | - Python 2.7.3 or 3.2.2)前|
+| | "html.parser")`` | - 执行速度适中 | 的版本中文档容错能力差 |
+| | | - 文档容错能力强 | |
+| | | | |
++-----------------------+---------------------------+---------------------------+---------------------------+
+| lxml HTML 解析器 | ``BeautifulSoup(markup, | - 速度快 | - 需要安装C语言库 |
+| | "lxml")`` | - 文档容错能力强 | |
+| | | | |
++-----------------------+---------------------------+---------------------------+---------------------------+
+| lxml XML 解析器 | ``BeautifulSoup(markup, | - 速度快 | - 需要安装C语言库 |
+| | ["lxml-xml"])`` | - 唯一支持XML的解析器 | |
+| | | | |
+| | ``BeautifulSoup(markup, | | |
+| | "xml")`` | | |
++-----------------------+---------------------------+---------------------------+---------------------------+
+| html5lib | ``BeautifulSoup(markup, | - 最好的容错性 | - 速度慢 |
+| | "html5lib")`` | - 以浏览器的方式解析文档 | - 不依赖外部扩展 |
+| | | - 生成HTML5格式的文档 | |
++-----------------------+---------------------------+---------------------------+---------------------------+
+
+推荐使用lxml作为解析器,因为效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib, 因为那些Python版本的标准库中内置的HTML解析方法不够稳定.
+
+提示: 如果一段HTML或XML文档格式不正确的话,那么在不同的解析器中返回的结果可能是不一样的,查看 `解析器之间的区别`_ 了解更多细节
+
+如何使用
+========
+
+将一段文档传入BeautifulSoup 的构造方法,就能得到一个文档的对象, 可以传入一段字符串或一个文件句柄.
+
+::
+
+ from bs4 import BeautifulSoup
+
+ soup = BeautifulSoup(open("index.html"))
+
+ soup = BeautifulSoup("<html>data</html>")
+
+首先,文档被转换成Unicode,并且HTML的实例都被转换成Unicode编码
+
+::
+
+ BeautifulSoup("Sacr&eacute; bleu!")
+ <html><head></head><body>Sacré bleu!</body></html>
+
+然后,Beautiful Soup选择最合适的解析器来解析这段文档,如果手动指定解析器那么Beautiful Soup会选择指定的解析器来解析文档.(参考 `解析成XML`_ ).
+
+对象的种类
+==========
+
+Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
+``Tag`` , ``NavigableString`` , ``BeautifulSoup`` , ``Comment`` .
+
+Tag
+-----
+
+``Tag`` 对象与XML或HTML原生文档中的tag相同:
+
+::
+
+ soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
+ tag = soup.b
+ type(tag)
+ # <class 'bs4.element.Tag'>
+
+Tag有很多方法和属性,在 `遍历文档树`_ 和 `搜索文档树`_ 中有详细解释.现在介绍一下tag中最重要的属性: name和attributes
+
+Name
+.....
+
+每个tag都有自己的名字,通过 ``.name`` 来获取:
+
+::
+
+ tag.name
+ # u'b'
+
+如果改变了tag的name,那将影响所有通过当前Beautiful Soup对象生成的HTML文档:
+
+::
+
+ tag.name = "blockquote"
+ tag
+ # <blockquote class="boldest">Extremely bold</blockquote>
+
+Attributes
+............
+
+一个tag可能有很多个属性. tag ``<b class="boldest">`` 有一个 "class" 的属性,值为 "boldest" . tag的属性的操作方法与字典相同:
+
+::
+
+ tag['class']
+ # u'boldest'
+
+也可以直接"点"取属性, 比如: ``.attrs`` :
+
+::
+
+ tag.attrs
+ # {u'class': u'boldest'}
+
+tag的属性可以被添加,删除或修改. 再说一次, tag的属性操作方法与字典一样
+
+::
+
+ tag['class'] = 'verybold'
+ tag['id'] = 1
+ tag
+ # <blockquote class="verybold" id="1">Extremely bold</blockquote>
+
+ del tag['class']
+ del tag['id']
+ tag
+ # <blockquote>Extremely bold</blockquote>
+
+ tag['class']
+ # KeyError: 'class'
+ print(tag.get('class'))
+ # None
+
+多值属性
+``````````
+
+HTML 4定义了一系列可以包含多个值的属性.在HTML5中移除了一些,却增加更多.最常见的多值的属性是 class (一个tag可以有多个CSS的class). 还有一些属性 ``rel`` , ``rev`` , ``accept-charset`` , ``headers`` , ``accesskey`` . 在Beautiful Soup中多值属性的返回类型是list:
+
+::
+
+ css_soup = BeautifulSoup('<p class="body strikeout"></p>')
+ css_soup.p['class']
+ # ["body", "strikeout"]
+
+ css_soup = BeautifulSoup('<p class="body"></p>')
+ css_soup.p['class']
+ # ["body"]
+
+如果某个属性看起来好像有多个值,但在任何版本的HTML定义中都没有被定义为多值属性,那么Beautiful Soup会将这个属性作为字符串返回
+
+::
+
+ id_soup = BeautifulSoup('<p id="my id"></p>')
+ id_soup.p['id']
+ # 'my id'
+
+将tag转换成字符串时,多值属性会合并为一个值
+
+::
+
+ rel_soup = BeautifulSoup('<p>Back to the <a rel="index">homepage</a></p>')
+ rel_soup.a['rel']
+ # ['index']
+ rel_soup.a['rel'] = ['index', 'contents']
+ print(rel_soup.p)
+ # <p>Back to the <a rel="index contents">homepage</a></p>
+
+如果转换的文档是XML格式,那么tag中不包含多值属性
+
+::
+
+ xml_soup = BeautifulSoup('<p class="body strikeout"></p>', 'xml')
+ xml_soup.p['class']
+ # u'body strikeout'
+
+可以遍历的字符串
+----------------
+
+字符串常被包含在tag内.Beautiful Soup用 ``NavigableString`` 类来包装tag中的字符串:
+
+::
+
+ tag.string
+ # u'Extremely bold'
+ type(tag.string)
+ # <class 'bs4.element.NavigableString'>
+
+一个 ``NavigableString`` 字符串与Python中的Unicode字符串相同,并且还支持包含在 `遍历文档树`_ 和 `搜索文档树`_ 中的一些特性. 通过 ``unicode()`` 方法可以直接将 ``NavigableString`` 对象转换成Unicode字符串:
+
+::
+
+ unicode_string = unicode(tag.string)
+ unicode_string
+ # u'Extremely bold'
+ type(unicode_string)
+ # <type 'unicode'>
+
+tag中包含的字符串不能编辑,但是可以被替换成其它的字符串,用 `replace_with()`_ 方法:
+
+::
+
+ tag.string.replace_with("No longer bold")
+ tag
+ # <blockquote>No longer bold</blockquote>
+
+``NavigableString`` 对象支持 `遍历文档树`_ 和 `搜索文档树`_ 中定义的大部分属性, 并非全部.尤其是,一个字符串不能包含其它内容(tag能够包含字符串或是其它tag),字符串不支持 ``.contents`` 或 ``.string`` 属性或 ``find()`` 方法.
+
+如果想在Beautiful Soup之外使用 ``NavigableString`` 对象,需要调用 ``unicode()`` 方法,将该对象转换成普通的Unicode字符串,否则就算Beautiful Soup已方法已经执行结束,该对象的输出也会带有对象的引用地址.这样会浪费内存.
+
+BeautifulSoup
+----------------
+
+``BeautifulSoup`` 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 ``Tag`` 对象,它支持 `遍历文档树`_ 和 `搜索文档树`_ 中描述的大部分的方法.
+
+因为 ``BeautifulSoup`` 对象并不是真正的HTML或XML的tag,所以它没有name和attribute属性.但有时查看它的 ``.name`` 属性是很方便的,所以 ``BeautifulSoup`` 对象包含了一个值为 "[document]" 的特殊属性 ``.name``
+
+::
+
+ soup.name
+ # u'[document]'
+
+注释及特殊字符串
+-----------------
+
+``Tag`` , ``NavigableString`` , ``BeautifulSoup`` 几乎覆盖了html和xml中的所有内容,但是还有一些特殊对象.容易让人担心的内容是文档的注释部分:
+
+::
+
+ markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>"
+ soup = BeautifulSoup(markup)
+ comment = soup.b.string
+ type(comment)
+ # <class 'bs4.element.Comment'>
+
+``Comment`` 对象是一个特殊类型的 ``NavigableString`` 对象:
+
+::
+
+ comment
+ # u'Hey, buddy. Want to buy a used parser'
+
+但是当它出现在HTML文档中时, ``Comment`` 对象会使用特殊的格式输出:
+
+::
+
+ print(soup.b.prettify())
+ # <b>
+ # <!--Hey, buddy. Want to buy a used parser?-->
+ # </b>
+
+Beautiful Soup中定义的其它类型都可能会出现在XML的文档中: ``CData`` , ``ProcessingInstruction`` , ``Declaration`` , ``Doctype`` .与 ``Comment`` 对象类似,这些类都是 ``NavigableString`` 的子类,只是添加了一些额外的方法的字符串独享.下面是用CDATA来替代注释的例子:
+
+::
+
+ from bs4 import CData
+ cdata = CData("A CDATA block")
+ comment.replace_with(cdata)
+
+ print(soup.b.prettify())
+ # <b>
+ # <![CDATA[A CDATA block]]>
+ # </b>
+
+遍历文档树
+==========
+
+还拿"爱丽丝梦游仙境"的文档来做例子:
+
+::
+
+ html_doc = """
+ <html><head><title>The Dormouse's story</title></head>
+ <body>
+ <p class="title"><b>The Dormouse's story</b></p>
+
+ <p class="story">Once upon a time there were three little sisters; and their names were
+ <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
+ <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
+ <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
+ and they lived at the bottom of a well.</p>
+
+ <p class="story">...</p>
+ """
+
+ from bs4 import BeautifulSoup
+ soup = BeautifulSoup(html_doc, 'html.parser')
+
+通过这段例子来演示怎样从文档的一段内容找到另一段内容
+
+子节点
+-------
+
+一个Tag可能包含多个字符串或其它的Tag,这些都是这个Tag的子节点.Beautiful Soup提供了许多操作和遍历子节点的属性.
+
+注意: Beautiful Soup中字符串节点不支持这些属性,因为字符串没有子节点
+
+tag的名字
+..........
+
+操作文档树最简单的方法就是告诉它你想获取的tag的name.如果想获取 <head> 标签,只要用 ``soup.head`` :
+
+::
+
+ soup.head
+ # <head><title>The Dormouse's story</title></head>
+
+ soup.title
+ # <title>The Dormouse's story</title>
+
+这是个获取tag的小窍门,可以在文档树的tag中多次调用这个方法.下面的代码可以获取<body>标签中的第一个<b>标签:
+
+::
+
+ soup.body.b
+ # <b>The Dormouse's story</b>
+
+通过点取属性的方式只能获得当前名字的第一个tag:
+
+::
+
+ soup.a
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+如果想要得到所有的<a>标签,或是通过名字得到比一个tag更多的内容的时候,就需要用到 `Searching the tree` 中描述的方法,比如: find_all()
+
+::
+
+ soup.find_all('a')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+.contents 和 .children
+........................
+
+tag的 ``.contents`` 属性可以将tag的子节点以列表的方式输出:
+
+::
+
+ head_tag = soup.head
+ head_tag
+ # <head><title>The Dormouse's story</title></head>
+
+ head_tag.contents
+ [<title>The Dormouse's story</title>]
+
+ title_tag = head_tag.contents[0]
+ title_tag
+ # <title>The Dormouse's story</title>
+ title_tag.contents
+ # [u'The Dormouse's story']
+
+``BeautifulSoup`` 对象本身一定会包含子节点,也就是说<html>标签也是 ``BeautifulSoup`` 对象的子节点:
+
+::
+
+ len(soup.contents)
+ # 1
+ soup.contents[0].name
+ # u'html'
+
+字符串没有 ``.contents`` 属性,因为字符串没有子节点:
+
+::
+
+ text = title_tag.contents[0]
+ text.contents
+ # AttributeError: 'NavigableString' object has no attribute 'contents'
+
+通过tag的 ``.children`` 生成器,可以对tag的子节点进行循环:
+
+::
+
+ for child in title_tag.children:
+ print(child)
+ # The Dormouse's story
+
+.descendants
+..............
+
+``.contents`` 和 ``.children`` 属性仅包含tag的直接子节点.例如,<head>标签只有一个直接子节点<title>
+
+::
+
+ head_tag.contents
+ # [<title>The Dormouse's story</title>]
+
+但是<title>标签也包含一个子节点:字符串 “The Dormouse’s story”,这种情况下字符串 “The Dormouse’s story”也属于<head>标签的子孙节点. ``.descendants`` 属性可以对所有tag的子孙节点进行递归循环 [5]_ :
+
+::
+
+ for child in head_tag.descendants:
+ print(child)
+ # <title>The Dormouse's story</title>
+ # The Dormouse's story
+
+上面的例子中, <head>标签只有一个子节点,但是有2个子孙节点:<head>节点和<head>的子节点, ``BeautifulSoup`` 有一个直接子节点(<html>节点),却有很多子孙节点:
+
+::
+
+ len(list(soup.children))
+ # 1
+ len(list(soup.descendants))
+ # 25
+
+.string
+........
+
+如果tag只有一个 ``NavigableString`` 类型子节点,那么这个tag可以使用 ``.string`` 得到子节点:
+
+::
+
+ title_tag.string
+ # u'The Dormouse's story'
+
+如果一个tag仅有一个子节点,那么这个tag也可以使用 ``.string`` 方法,输出结果与当前唯一子节点的 ``.string`` 结果相同:
+
+::
+
+ head_tag.contents
+ # [<title>The Dormouse's story</title>]
+
+ head_tag.string
+ # u'The Dormouse's story'
+
+如果tag包含了多个子节点,tag就无法确定 ``.string`` 方法应该调用哪个子节点的内容, ``.string`` 的输出结果是 ``None`` :
+
+::
+
+ print(soup.html.string)
+ # None
+
+.strings 和 stripped_strings
+.............................
+
+如果tag中包含多个字符串 [2]_ ,可以使用 ``.strings`` 来循环获取:
+
+::
+
+ for string in soup.strings:
+ print(repr(string))
+ # u"The Dormouse's story"
+ # u'\n\n'
+ # u"The Dormouse's story"
+ # u'\n\n'
+ # u'Once upon a time there were three little sisters; and their names were\n'
+ # u'Elsie'
+ # u',\n'
+ # u'Lacie'
+ # u' and\n'
+ # u'Tillie'
+ # u';\nand they lived at the bottom of a well.'
+ # u'\n\n'
+ # u'...'
+ # u'\n'
+
+输出的字符串中可能包含了很多空格或空行,使用 ``.stripped_strings`` 可以去除多余空白内容:
+
+::
+
+ for string in soup.stripped_strings:
+ print(repr(string))
+ # u"The Dormouse's story"
+ # u"The Dormouse's story"
+ # u'Once upon a time there were three little sisters; and their names were'
+ # u'Elsie'
+ # u','
+ # u'Lacie'
+ # u'and'
+ # u'Tillie'
+ # u';\nand they lived at the bottom of a well.'
+ # u'...'
+
+全部是空格的行会被忽略掉,段首和段末的空白会被删除
+
+父节点
+-------
+
+继续分析文档树,每个tag或字符串都有父节点:被包含在某个tag中
+
+.parent
+........
+
+通过 ``.parent`` 属性来获取某个元素的父节点.在例子“爱丽丝”的文档中,<head>标签是<title>标签的父节点:
+
+::
+
+ title_tag = soup.title
+ title_tag
+ # <title>The Dormouse's story</title>
+ title_tag.parent
+ # <head><title>The Dormouse's story</title></head>
+
+文档title的字符串也有父节点:<title>标签
+
+::
+
+ title_tag.string.parent
+ # <title>The Dormouse's story</title>
+
+文档的顶层节点比如<html>的父节点是 ``BeautifulSoup`` 对象:
+
+::
+
+ html_tag = soup.html
+ type(html_tag.parent)
+ # <class 'bs4.BeautifulSoup'>
+
+``BeautifulSoup`` 对象的 ``.parent`` 是None:
+
+::
+
+ print(soup.parent)
+ # None
+
+.parents
+..........
+
+通过元素的 ``.parents`` 属性可以递归得到元素的所有父辈节点,下面的例子使用了 ``.parents`` 方法遍历了<a>标签到根节点的所有节点.
+
+::
+
+ link = soup.a
+ link
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+ for parent in link.parents:
+ if parent is None:
+ print(parent)
+ else:
+ print(parent.name)
+ # p
+ # body
+ # html
+ # [document]
+ # None
+
+兄弟节点
+---------
+
+看一段简单的例子:
+
+::
+
+ sibling_soup = BeautifulSoup("<a><b>text1</b><c>text2</c></b></a>")
+ print(sibling_soup.prettify())
+ # <html>
+ # <body>
+ # <a>
+ # <b>
+ # text1
+ # </b>
+ # <c>
+ # text2
+ # </c>
+ # </a>
+ # </body>
+ # </html>
+
+因为<b>标签和<c>标签是同一层:他们是同一个元素的子节点,所以<b>和<c>可以被称为兄弟节点.一段文档以标准格式输出时,兄弟节点有相同的缩进级别.在代码中也可以使用这种关系.
+
+.next_sibling 和 .previous_sibling
+....................................
+
+在文档树中,使用 ``.next_sibling`` 和 ``.previous_sibling`` 属性来查询兄弟节点:
+
+::
+
+ sibling_soup.b.next_sibling
+ # <c>text2</c>
+
+ sibling_soup.c.previous_sibling
+ # <b>text1</b>
+
+<b>标签有 ``.next_sibling`` 属性,但是没有 ``.previous_sibling`` 属性,因为<b>标签在同级节点中是第一个.同理,<c>标签有 ``.previous_sibling`` 属性,却没有 ``.next_sibling`` 属性:
+
+::
+
+ print(sibling_soup.b.previous_sibling)
+ # None
+ print(sibling_soup.c.next_sibling)
+ # None
+
+例子中的字符串“text1”和“text2”不是兄弟节点,因为它们的父节点不同:
+
+::
+
+ sibling_soup.b.string
+ # u'text1'
+
+ print(sibling_soup.b.string.next_sibling)
+ # None
+
+实际文档中的tag的 ``.next_sibling`` 和 ``.previous_sibling`` 属性通常是字符串或空白. 看看“爱丽丝”文档:
+
+::
+
+ <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>
+ <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>
+ <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>
+
+如果以为第一个<a>标签的 ``.next_sibling`` 结果是第二个<a>标签,那就错了,真实结果是第一个<a>标签和第二个<a>标签之间的顿号和换行符:
+
+::
+
+ link = soup.a
+ link
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+ link.next_sibling
+ # u',\n'
+
+第二个<a>标签是顿号的 ``.next_sibling`` 属性:
+
+::
+
+ link.next_sibling.next_sibling
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>
+
+.next_siblings 和 .previous_siblings
+......................................
+
+通过 ``.next_siblings`` 和 ``.previous_siblings`` 属性可以对当前节点的兄弟节点迭代输出:
+
+::
+
+ for sibling in soup.a.next_siblings:
+ print(repr(sibling))
+ # u',\n'
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>
+ # u' and\n'
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
+ # u'; and they lived at the bottom of a well.'
+ # None
+
+ for sibling in soup.find(id="link3").previous_siblings:
+ print(repr(sibling))
+ # ' and\n'
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>
+ # u',\n'
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+ # u'Once upon a time there were three little sisters; and their names were\n'
+ # None
+
+回退和前进
+----------
+
+看一下“爱丽丝” 文档:
+
+::
+
+ <html><head><title>The Dormouse's story</title></head>
+ <p class="title"><b>The Dormouse's story</b></p>
+
+HTML解析器把这段字符串转换成一连串的事件: "打开<html>标签","打开一个<head>标签","打开一个<title>标签","添加一段字符串","关闭<title>标签","打开<p>标签",等等.Beautiful Soup提供了重现解析器初始化过程的方法.
+
+.next_element 和 .previous_element
+...................................
+
+``.next_element`` 属性指向解析过程中下一个被解析的对象(字符串或tag),结果可能与 ``.next_sibling`` 相同,但通常是不一样的.
+
+这是“爱丽丝”文档中最后一个<a>标签,它的 ``.next_sibling`` 结果是一个字符串,因为当前的解析过程 [2]_ 因为当前的解析过程因为遇到了<a>标签而中断了:
+
+::
+
+ last_a_tag = soup.find("a", id="link3")
+ last_a_tag
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
+
+ last_a_tag.next_sibling
+ # '; and they lived at the bottom of a well.'
+
+但这个<a>标签的 ``.next_element`` 属性结果是在<a>标签被解析之后的解析内容,不是<a>标签后的句子部分,应该是字符串"Tillie":
+
+::
+
+ last_a_tag.next_element
+ # u'Tillie'
+
+这是因为在原始文档中,字符串“Tillie” 在分号前出现,解析器先进入<a>标签,然后是字符串“Tillie”,然后关闭</a>标签,然后是分号和剩余部分.分号与<a>标签在同一层级,但是字符串“Tillie”会被先解析.
+
+``.previous_element`` 属性刚好与 ``.next_element`` 相反,它指向当前被解析的对象的前一个解析对象:
+
+::
+
+ last_a_tag.previous_element
+ # u' and\n'
+ last_a_tag.previous_element.next_element
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
+
+.next_elements 和 .previous_elements
+.....................................
+
+通过 ``.next_elements`` 和 ``.previous_elements`` 的迭代器就可以向前或向后访问文档的解析内容,就好像文档正在被解析一样:
+
+::
+
+ for element in last_a_tag.next_elements:
+ print(repr(element))
+ # u'Tillie'
+ # u';\nand they lived at the bottom of a well.'
+ # u'\n\n'
+ # <p class="story">...</p>
+ # u'...'
+ # u'\n'
+ # None
+
+搜索文档树
+==========
+
+Beautiful Soup定义了很多搜索方法,这里着重介绍2个: ``find()`` 和 ``find_all()`` .其它方法的参数和用法类似,请读者举一反三.
+
+再以“爱丽丝”文档作为例子:
+
+::
+
+ html_doc = """
+ <html><head><title>The Dormouse's story</title></head>
+ <body>
+ <p class="title"><b>The Dormouse's story</b></p>
+
+ <p class="story">Once upon a time there were three little sisters; and their names were
+ <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
+ <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
+ <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
+ and they lived at the bottom of a well.</p>
+
+ <p class="story">...</p>
+ """
+
+ from bs4 import BeautifulSoup
+ soup = BeautifulSoup(html_doc, 'html.parser')
+
+使用 ``find_all()`` 类似的方法可以查找到想要查找的文档内容
+
+过滤器
+------
+
+介绍 ``find_all()`` 方法前,先介绍一下过滤器的类型 [3]_ ,这些过滤器贯穿整个搜索的API.过滤器可以被用在tag的name中,节点的属性中,字符串中或他们的混合中.
+
+字符串
+............
+
+最简单的过滤器是字符串.在搜索方法中传入一个字符串参数,Beautiful Soup会查找与字符串完整匹配的内容,下面的例子用于查找文档中所有的<b>标签:
+
+::
+
+ soup.find_all('b')
+ # [<b>The Dormouse's story</b>]
+
+如果传入字节码参数,Beautiful Soup会当作UTF-8编码,可以传入一段Unicode 编码来避免Beautiful Soup解析编码出错
+
+正则表达式
+..........
+
+如果传入正则表达式作为参数,Beautiful Soup会通过正则表达式的 ``search()`` 来匹配内容.下面例子中找出所有以b开头的标签,这表示<body>和<b>标签都应该被找到:
+
+::
+
+ import re
+ for tag in soup.find_all(re.compile("^b")):
+ print(tag.name)
+ # body
+ # b
+
+下面代码找出所有名字中包含"t"的标签:
+
+::
+
+ for tag in soup.find_all(re.compile("t")):
+ print(tag.name)
+ # html
+ # title
+
+列表
+....
+
+如果传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回.下面代码找到文档中所有<a>标签和<b>标签:
+
+::
+
+ soup.find_all(["a", "b"])
+ # [<b>The Dormouse's story</b>,
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+True
+.....
+
+``True`` 可以匹配任何值,下面代码查找到所有的tag,但是不会返回字符串节点
+
+::
+
+ for tag in soup.find_all(True):
+ print(tag.name)
+ # html
+ # head
+ # title
+ # body
+ # p
+ # b
+ # p
+ # a
+ # a
+ # a
+ # p
+
+方法
+....
+
+如果没有合适过滤器,那么还可以定义一个方法,方法只接受一个元素参数 [4]_ ,如果这个方法返回 ``True`` 表示当前元素匹配并且被找到,如果不是则反回 ``False``
+
+下面方法校验了当前元素,如果包含 ``class`` 属性却不包含 ``id`` 属性,那么将返回 ``True``:
+
+::
+
+ def has_class_but_no_id(tag):
+ return tag.has_attr('class') and not tag.has_attr('id')
+
+将这个方法作为参数传入 ``find_all()`` 方法,将得到所有<p>标签:
+
+::
+
+ soup.find_all(has_class_but_no_id)
+ # [<p class="title"><b>The Dormouse's story</b></p>,
+ # <p class="story">Once upon a time there were...</p>,
+ # <p class="story">...</p>]
+
+返回结果中只有<p>标签没有<a>标签,因为<a>标签还定义了"id",没有返回<html>和<head>,因为<html>和<head>中没有定义"class"属性.
+
+通过一个方法来过滤一类标签属性的时候, 这个方法的参数是要被过滤的属性的值, 而不是这个标签.
+下面的例子是找出 ``href`` 属性不符合指定正则的 ``a`` 标签.
+
+::
+
+
+ def not_lacie(href):
+ return href and not re.compile("lacie").search(href)
+ soup.find_all(href=not_lacie)
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+标签过滤方法可以使用复杂方法. 下面的例子可以过滤出前后都有文字的标签.
+
+::
+
+ from bs4 import NavigableString
+ def surrounded_by_strings(tag):
+ return (isinstance(tag.next_element, NavigableString)
+ and isinstance(tag.previous_element, NavigableString))
+
+ for tag in soup.find_all(surrounded_by_strings):
+ print tag.name
+ # p
+ # a
+ # a
+ # a
+ # p
+
+现在来了解一下搜索方法的细节
+
+find_all()
+-----------
+
+find_all( `name`_ , `attrs`_ , `recursive`_ , `string`_ , `**kwargs`_ )
+
+``find_all()`` 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件.这里有几个例子:
+
+::
+
+ soup.find_all("title")
+ # [<title>The Dormouse's story</title>]
+
+ soup.find_all("p", "title")
+ # [<p class="title"><b>The Dormouse's story</b></p>]
+
+ soup.find_all("a")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.find_all(id="link2")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+ import re
+ soup.find(string=re.compile("sisters"))
+ # u'Once upon a time there were three little sisters; and their names were\n'
+
+有几个方法很相似,还有几个方法是新的,参数中的 ``string`` 和 ``id`` 是什么含义? 为什么 ``find_all("p", "title")`` 返回的是CSS Class为"title"的<p>标签? 我们来仔细看一下 ``find_all()`` 的参数
+
+name 参数
+..........
+
+``name`` 参数可以查找所有名字为 ``name`` 的tag,字符串对象会被自动忽略掉.
+
+简单的用法如下:
+
+::
+
+ soup.find_all("title")
+ # [<title>The Dormouse's story</title>]
+
+重申: 搜索 ``name`` 参数的值可以使任一类型的 `过滤器`_ ,字符窜,正则表达式,列表,方法或是 ``True`` .
+
+keyword 参数
+..............
+
+如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索,如果包含一个名字为 ``id`` 的参数,Beautiful Soup会搜索每个tag的"id"属性.
+
+::
+
+ soup.find_all(id='link2')
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+如果传入 ``href`` 参数,Beautiful Soup会搜索每个tag的"href"属性:
+
+::
+
+ soup.find_all(href=re.compile("elsie"))
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+搜索指定名字的属性时可以使用的参数值包括 `字符串`_ , `正则表达式`_ , `列表`_, `True`_ .
+
+下面的例子在文档树中查找所有包含 ``id`` 属性的tag,无论 ``id`` 的值是什么:
+
+::
+
+ soup.find_all(id=True)
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+使用多个指定名字的参数可以同时过滤tag的多个属性:
+
+::
+
+ soup.find_all(href=re.compile("elsie"), id='link1')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">three</a>]
+
+有些tag属性在搜索不能使用,比如HTML5中的 data-* 属性:
+
+::
+
+ data_soup = BeautifulSoup('<div data-foo="value">foo!</div>')
+ data_soup.find_all(data-foo="value")
+ # SyntaxError: keyword can't be an expression
+
+但是可以通过 ``find_all()`` 方法的 ``attrs`` 参数定义一个字典参数来搜索包含特殊属性的tag:
+
+::
+
+ data_soup.find_all(attrs={"data-foo": "value"})
+ # [<div data-foo="value">foo!</div>]
+
+按CSS搜索
+..........
+
+按照CSS类名搜索tag的功能非常实用,但标识CSS类名的关键字 ``class`` 在Python中是保留字,使用 ``class`` 做参数会导致语法错误.从Beautiful Soup的4.1.1版本开始,可以通过 ``class_`` 参数搜索有指定CSS类名的tag:
+
+::
+
+ soup.find_all("a", class_="sister")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+``class_`` 参数同样接受不同类型的 ``过滤器`` ,字符串,正则表达式,方法或 ``True`` :
+
+::
+
+ soup.find_all(class_=re.compile("itl"))
+ # [<p class="title"><b>The Dormouse's story</b></p>]
+
+ def has_six_characters(css_class):
+ return css_class is not None and len(css_class) == 6
+
+ soup.find_all(class_=has_six_characters)
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+tag的 ``class`` 属性是 `多值属性`_ .按照CSS类名搜索tag时,可以分别搜索tag中的每个CSS类名:
+
+::
+
+ css_soup = BeautifulSoup('<p class="body strikeout"></p>')
+ css_soup.find_all("p", class_="strikeout")
+ # [<p class="body strikeout"></p>]
+
+ css_soup.find_all("p", class_="body")
+ # [<p class="body strikeout"></p>]
+
+搜索 ``class`` 属性时也可以通过CSS值完全匹配:
+
+::
+
+ css_soup.find_all("p", class_="body strikeout")
+ # [<p class="body strikeout"></p>]
+
+完全匹配 ``class`` 的值时,如果CSS类名的顺序与实际不符,将搜索不到结果:
+
+::
+
+ soup.find_all("a", attrs={"class": "sister"})
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+``string`` 参数
+...............
+
+通过 ``string`` 参数可以搜搜文档中的字符串内容.与 ``name`` 参数的可选值一样, ``string`` 参数接受 `字符串`_ , `正则表达式`_ , `列表`_, `True`_ . 看例子:
+
+::
+
+ soup.find_all(string="Elsie")
+ # [u'Elsie']
+
+ soup.find_all(string=["Tillie", "Elsie", "Lacie"])
+ # [u'Elsie', u'Lacie', u'Tillie']
+
+ soup.find_all(string=re.compile("Dormouse"))
+ [u"The Dormouse's story", u"The Dormouse's story"]
+
+ def is_the_only_string_within_a_tag(s):
+ ""Return True if this string is the only child of its parent tag.""
+ return (s == s.parent.string)
+
+ soup.find_all(string=is_the_only_string_within_a_tag)
+ # [u"The Dormouse's story", u"The Dormouse's story", u'Elsie', u'Lacie', u'Tillie', u'...']
+
+虽然 ``string`` 参数用于搜索字符串,还可以与其它参数混合使用来过滤tag.Beautiful Soup会找到 ``.string`` 方法与 ``string`` 参数值相符的tag.下面代码用来搜索内容里面包含“Elsie”的<a>标签:
+
+::
+
+ soup.find_all("a", string="Elsie")
+ # [<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>]
+
+``limit`` 参数
+...............
+
+``find_all()`` 方法返回全部的搜索结构,如果文档树很大那么搜索会很慢.如果我们不需要全部结果,可以使用 ``limit`` 参数限制返回结果的数量.效果与SQL中的limit关键字类似,当搜索到的结果数量达到 ``limit`` 的限制时,就停止搜索返回结果.
+
+文档树中有3个tag符合搜索条件,但结果只返回了2个,因为我们限制了返回数量:
+
+::
+
+ soup.find_all("a", limit=2)
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+``recursive`` 参数
+...................
+
+调用tag的 ``find_all()`` 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 ``recursive=False`` .
+
+一段简单的文档:
+
+::
+
+ <html>
+ <head>
+ <title>
+ The Dormouse's story
+ </title>
+ </head>
+ ...
+
+是否使用 ``recursive`` 参数的搜索结果:
+
+::
+
+ soup.html.find_all("title")
+ # [<title>The Dormouse's story</title>]
+
+ soup.html.find_all("title", recursive=False)
+ # []
+
+这是文档片段
+
+::
+
+ <html>
+ <head>
+ <title>
+ The Dormouse's story
+ </title>
+ </head>
+ ...
+
+<title>标签在 <html> 标签下, 但并不是直接子节点, <head> 标签才是直接子节点.
+在允许查询所有后代节点时 Beautiful Soup 能够查找到 <title> 标签.
+但是使用了 ``recursive=False`` 参数之后,只能查找直接子节点,这样就查不到 <title> 标签了.
+
+Beautiful Soup 提供了多种DOM树搜索方法. 这些方法都使用了类似的参数定义.
+比如这些方法: ``find_all()``: ``name``, ``attrs``, ``text``, ``limit``.
+但是只有 ``find_all()`` 和 ``find()`` 支持 ``recursive`` 参数.
+
+像调用 ``find_all()`` 一样调用tag
+----------------------------------
+
+``find_all()`` 几乎是Beautiful Soup中最常用的搜索方法,所以我们定义了它的简写方法. ``BeautifulSoup`` 对象和 ``tag`` 对象可以被当作一个方法来使用,这个方法的执行结果与调用这个对象的 ``find_all()`` 方法相同,下面两行代码是等价的:
+
+::
+
+ soup.find_all("a")
+ soup("a")
+
+这两行代码也是等价的:
+
+::
+
+ soup.title.find_all(string=True)
+ soup.title(string=True)
+
+find()
+-------
+
+find( `name`_ , `attrs`_ , `recursive`_ , `string`_ , `**kwargs`_ )
+
+``find_all()`` 方法将返回文档中符合条件的所有tag,尽管有时候我们只想得到一个结果.比如文档中只有一个<body>标签,那么使用 ``find_all()`` 方法来查找<body>标签就不太合适, 使用 ``find_all`` 方法并设置 ``limit=1`` 参数不如直接使用 ``find()`` 方法.下面两行代码是等价的:
+
+::
+
+ soup.find_all('title', limit=1)
+ # [<title>The Dormouse's story</title>]
+
+ soup.find('title')
+ # <title>The Dormouse's story</title>
+
+唯一的区别是 ``find_all()`` 方法的返回结果是值包含一个元素的列表,而 ``find()`` 方法直接返回结果.
+
+``find_all()`` 方法没有找到目标是返回空列表, ``find()`` 方法找不到目标时,返回 ``None`` .
+
+::
+
+ print(soup.find("nosuchtag"))
+ # None
+
+``soup.head.title`` 是 `tag的名字`_ 方法的简写.这个简写的原理就是多次调用当前tag的 ``find()`` 方法:
+
+::
+
+ soup.head.title
+ # <title>The Dormouse's story</title>
+
+ soup.find("head").find("title")
+ # <title>The Dormouse's story</title>
+
+find_parents() 和 find_parent()
+--------------------------------
+
+find_parents( `name`_ , `attrs`_ , `recursive`_ , `string`_ , `**kwargs`_ )
+
+find_parent( `name`_ , `attrs`_ , `recursive`_ , `string`_ , `**kwargs`_ )
+
+我们已经用了很大篇幅来介绍 ``find_all()`` 和 ``find()`` 方法,Beautiful Soup中还有10个用于搜索的API.它们中的五个用的是与 ``find_all()`` 相同的搜索参数,另外5个与 ``find()`` 方法的搜索参数类似.区别仅是它们搜索文档的不同部分.
+
+记住: ``find_all()`` 和 ``find()`` 只搜索当前节点的所有子节点,孙子节点等. ``find_parents()`` 和 ``find_parent()`` 用来搜索当前节点的父辈节点,搜索方法与普通tag的搜索方法相同,搜索文档\搜索文档包含的内容. 我们从一个文档中的一个叶子节点开始:
+
+::
+
+ a_string = soup.find(string="Lacie")
+ a_string
+ # u'Lacie'
+
+ a_string.find_parents("a")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+ a_string.find_parent("p")
+ # <p class="story">Once upon a time there were three little sisters; and their names were
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> and
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>;
+ # and they lived at the bottom of a well.</p>
+
+ a_string.find_parents("p", class="title")
+ # []
+
+文档中的一个<a>标签是是当前叶子节点的直接父节点,所以可以被找到.还有一个<p>标签,是目标叶子节点的间接父辈节点,所以也可以被找到.包含class值为"title"的<p>标签不是不是目标叶子节点的父辈节点,所以通过 ``find_parents()`` 方法搜索不到.
+
+``find_parent()`` 和 ``find_parents()`` 方法会让人联想到 `.parent`_ 和 `.parents`_ 属性.它们之间的联系非常紧密.搜索父辈节点的方法实际上就是对 ``.parents`` 属性的迭代搜索.
+
+find_next_siblings() 和 find_next_sibling()
+-------------------------------------------
+
+find_next_siblings( `name`_ , `attrs`_ , `recursive`_ , `string`_ , `**kwargs`_ )
+
+find_next_sibling( `name`_ , `attrs`_ , `recursive`_ , `string`_ , `**kwargs`_ )
+
+这2个方法通过 `.next_siblings`_ 属性对当tag的所有后面解析 [5]_ 的兄弟tag节点进行迭代, ``find_next_siblings()`` 方法返回所有符合条件的后面的兄弟节点, ``find_next_sibling()`` 只返回符合条件的后面的第一个tag节点.
+
+::
+
+ first_link = soup.a
+ first_link
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+ first_link.find_next_siblings("a")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ first_story_paragraph = soup.find("p", "story")
+ first_story_paragraph.find_next_sibling("p")
+ # <p class="story">...</p>
+
+find_previous_siblings() 和 find_previous_sibling()
+-----------------------------------------------------
+
+find_previous_siblings( `name`_ , `attrs`_ , `recursive`_ , `string`_ , `**kwargs`_ )
+
+find_previous_sibling( `name`_ , `attrs`_ , `recursive`_ , `string`_ , `**kwargs`_ )
+
+这2个方法通过 `.previous_siblings`_ 属性对当前tag的前面解析 [5]_ 的兄弟tag节点进行迭代, ``find_previous_siblings()`` 方法返回所有符合条件的前面的兄弟节点, ``find_previous_sibling()`` 方法返回第一个符合条件的前面的兄弟节点:
+
+::
+
+ last_link = soup.find("a", id="link3")
+ last_link
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
+
+ last_link.find_previous_siblings("a")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+ first_story_paragraph = soup.find("p", "story")
+ first_story_paragraph.find_previous_sibling("p")
+ # <p class="title"><b>The Dormouse's story</b></p>
+
+find_all_next() 和 find_next()
+--------------------------------
+
+find_all_next( `name`_ , `attrs`_ , `recursive`_ , `string`_ , `**kwargs`_ )
+
+find_next( `name`_ , `attrs`_ , `recursive`_ , `string`_ , `**kwargs`_ )
+
+这2个方法通过 `.next_elements`_ 属性对当前tag的之后的 [5]_ tag和字符串进行迭代, ``find_all_next()`` 方法返回所有符合条件的节点, ``find_next()`` 方法返回第一个符合条件的节点:
+
+::
+
+ first_link = soup.a
+ first_link
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+ first_link.find_all_next(string=True)
+ # [u'Elsie', u',\n', u'Lacie', u' and\n', u'Tillie',
+ # u';\nand they lived at the bottom of a well.', u'\n\n', u'...', u'\n']
+
+ first_link.find_next("p")
+ # <p class="story">...</p>
+
+第一个例子中,字符串 “Elsie”也被显示出来,尽管它被包含在我们开始查找的<a>标签的里面.第二个例子中,最后一个<p>标签也被显示出来,尽管它与我们开始查找位置的<a>标签不属于同一部分.例子中,搜索的重点是要匹配过滤器的条件,并且在文档中出现的顺序而不是开始查找的元素的位置.
+
+find_all_previous() 和 find_previous()
+---------------------------------------
+
+find_all_previous( `name`_ , `attrs`_ , `recursive`_ , `string`_ , `**kwargs`_ )
+
+find_previous( `name`_ , `attrs`_ , `recursive`_ , `string`_ , `**kwargs`_ )
+
+这2个方法通过 `.previous_elements`_ 属性对当前节点前面 [5]_ 的tag和字符串进行迭代, ``find_all_previous()`` 方法返回所有符合条件的节点, ``find_previous()`` 方法返回第一个符合条件的节点.
+
+::
+
+ first_link = soup.a
+ first_link
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+ first_link.find_all_previous("p")
+ # [<p class="story">Once upon a time there were three little sisters; ...</p>,
+ # <p class="title"><b>The Dormouse's story</b></p>]
+
+ first_link.find_previous("title")
+ # <title>The Dormouse's story</title>
+
+``find_all_previous("p")`` 返回了文档中的第一段(class="title"的那段),但还返回了第二段,<p>标签包含了我们开始查找的<a>标签.不要惊讶,这段代码的功能是查找所有出现在指定<a>标签之前的<p>标签,因为这个<p>标签包含了开始的<a>标签,所以<p>标签一定是在<a>之前出现的.
+
+CSS选择器
+------------
+
+Beautiful Soup支持大部分的CSS选择器 `<http://www.w3.org/TR/CSS2/selector.html>`_ [6]_ ,
+在 ``Tag`` 或 ``BeautifulSoup`` 对象的 ``.select()`` 方法中传入字符串参数,
+即可使用CSS选择器的语法找到tag:
+
+::
+
+ soup.select("title")
+ # [<title>The Dormouse's story</title>]
+
+ soup.select("p:nth-of-type(3)")
+ # [<p class="story">...</p>]
+
+通过tag标签逐层查找:
+
+::
+
+ soup.select("body a")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select("html head title")
+ # [<title>The Dormouse's story</title>]
+
+找到某个tag标签下的直接子标签 [6]_ :
+
+::
+
+ soup.select("head > title")
+ # [<title>The Dormouse's story</title>]
+
+ soup.select("p > a")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select("p > a:nth-of-type(2)")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+ soup.select("p > #link1")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+ soup.select("body > a")
+ # []
+
+找到兄弟节点标签:
+
+::
+
+ soup.select("#link1 ~ .sister")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select("#link1 + .sister")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+通过CSS的类名查找:
+
+::
+
+ soup.select(".sister")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select("[class~=sister]")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+通过tag的id查找:
+
+::
+
+ soup.select("#link1")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+ soup.select("a#link2")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+同时用多种CSS选择器查询元素:
+
+::
+
+ soup.select("#link1,#link2")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+
+通过是否存在某个属性来查找:
+
+::
+
+ soup.select('a[href]')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+通过属性的值来查找:
+
+::
+
+ soup.select('a[href="http://example.com/elsie"]')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+ soup.select('a[href^="http://example.com/"]')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select('a[href$="tillie"]')
+ # [<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select('a[href*=".com/el"]')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+通过语言设置来查找:
+
+::
+
+ multilingual_markup = """
+ <p lang="en">Hello</p>
+ <p lang="en-us">Howdy, y'all</p>
+ <p lang="en-gb">Pip-pip, old fruit</p>
+ <p lang="fr">Bonjour mes amis</p>
+ """
+ multilingual_soup = BeautifulSoup(multilingual_markup)
+ multilingual_soup.select('p[lang|=en]')
+ # [<p lang="en">Hello</p>,
+ # <p lang="en-us">Howdy, y'all</p>,
+ # <p lang="en-gb">Pip-pip, old fruit</p>]
+
+返回查找到的元素的第一个
+
+::
+
+ soup.select_one(".sister")
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+
+对于熟悉CSS选择器语法的人来说这是个非常方便的方法.Beautiful Soup也支持CSS选择器API,
+如果你仅仅需要CSS选择器的功能,那么直接使用 ``lxml`` 也可以,
+而且速度更快,支持更多的CSS选择器语法,但Beautiful Soup整合了CSS选择器的语法和自身方便使用API.
+
+
+修改文档树
+===========
+
+Beautiful Soup的强项是文档树的搜索,但同时也可以方便的修改文档树
+
+修改tag的名称和属性
+-------------------
+
+在 `Attributes`_ 的章节中已经介绍过这个功能,但是再看一遍也无妨. 重命名一个tag,改变属性的值,添加或删除属性:
+
+::
+
+ soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
+ tag = soup.b
+
+ tag.name = "blockquote"
+ tag['class'] = 'verybold'
+ tag['id'] = 1
+ tag
+ # <blockquote class="verybold" id="1">Extremely bold</blockquote>
+
+ del tag['class']
+ del tag['id']
+ tag
+ # <blockquote>Extremely bold</blockquote>
+
+修改 .string
+-------------
+
+给tag的 ``.string`` 属性赋值,就相当于用当前的内容替代了原来的内容:
+
+::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+
+ tag = soup.a
+ tag.string = "New link text."
+ tag
+ # <a href="http://example.com/">New link text.</a>
+
+注意: 如果当前的tag包含了其它tag,那么给它的 ``.string`` 属性赋值会覆盖掉原有的所有内容包括子tag
+
+append()
+----------
+
+``Tag.append()`` 方法想tag中添加内容,就好像Python的列表的 ``.append()`` 方法:
+
+::
+
+ soup = BeautifulSoup("<a>Foo</a>")
+ soup.a.append("Bar")
+
+ soup
+ # <html><head></head><body><a>FooBar</a></body></html>
+ soup.a.contents
+ # [u'Foo', u'Bar']
+
+NavigableString() 和 .new_tag()
+-----------------------------------------
+
+如果想添加一段文本内容到文档中也没问题,可以调用Python的 ``append()`` 方法
+或调用 ``NavigableString`` 的构造方法:
+
+::
+
+ soup = BeautifulSoup("<b></b>")
+ tag = soup.b
+ tag.append("Hello")
+ new_string = NavigableString(" there")
+ tag.append(new_string)
+ tag
+ # <b>Hello there.</b>
+ tag.contents
+ # [u'Hello', u' there']
+
+如果想要创建一段注释,或 ``NavigableString`` 的任何子类, 只要调用 NavigableString 的构造方法:
+
+::
+
+ from bs4 import Comment
+ new_comment = soup.new_string("Nice to see you.", Comment)
+ tag.append(new_comment)
+ tag
+ # <b>Hello there<!--Nice to see you.--></b>
+ tag.contents
+ # [u'Hello', u' there', u'Nice to see you.']
+
+# 这是Beautiful Soup 4.2.1 中新增的方法
+
+创建一个tag最好的方法是调用工厂方法 ``BeautifulSoup.new_tag()`` :
+
+::
+
+ soup = BeautifulSoup("<b></b>")
+ original_tag = soup.b
+
+ new_tag = soup.new_tag("a", href="http://www.example.com")
+ original_tag.append(new_tag)
+ original_tag
+ # <b><a href="http://www.example.com"></a></b>
+
+ new_tag.string = "Link text."
+ original_tag
+ # <b><a href="http://www.example.com">Link text.</a></b>
+
+第一个参数作为tag的name,是必填,其它参数选填
+
+insert()
+--------
+
+``Tag.insert()`` 方法与 ``Tag.append()`` 方法类似,区别是不会把新元素添加到父节点 ``.contents`` 属性的最后,而是把元素插入到指定的位置.与Python列表总的 ``.insert()`` 方法的用法下同:
+
+::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ tag = soup.a
+
+ tag.insert(1, "but did not endorse ")
+ tag
+ # <a href="http://example.com/">I linked to but did not endorse <i>example.com</i></a>
+ tag.contents
+ # [u'I linked to ', u'but did not endorse', <i>example.com</i>]
+
+insert_before() 和 insert_after()
+-----------------------------------
+
+``insert_before()`` 方法在当前tag或文本节点前插入内容:
+
+::
+
+ soup = BeautifulSoup("<b>stop</b>")
+ tag = soup.new_tag("i")
+ tag.string = "Don't"
+ soup.b.string.insert_before(tag)
+ soup.b
+ # <b><i>Don't</i>stop</b>
+
+``insert_after()`` 方法在当前tag或文本节点后插入内容:
+
+::
+
+ soup.b.i.insert_after(soup.new_string(" ever "))
+ soup.b
+ # <b><i>Don't</i> ever stop</b>
+ soup.b.contents
+ # [<i>Don't</i>, u' ever ', u'stop']
+
+clear()
+--------
+
+``Tag.clear()`` 方法移除当前tag的内容:
+
+::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ tag = soup.a
+
+ tag.clear()
+ tag
+ # <a href="http://example.com/"></a>
+
+extract()
+----------
+
+``PageElement.extract()`` 方法将当前tag移除文档树,并作为方法结果返回:
+
+::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ a_tag = soup.a
+
+ i_tag = soup.i.extract()
+
+ a_tag
+ # <a href="http://example.com/">I linked to</a>
+
+ i_tag
+ # <i>example.com</i>
+
+ print(i_tag.parent)
+ None
+
+这个方法实际上产生了2个文档树: 一个是用来解析原始文档的 ``BeautifulSoup`` 对象,另一个是被移除并且返回的tag.被移除并返回的tag可以继续调用 ``extract`` 方法:
+
+::
+
+ my_string = i_tag.string.extract()
+ my_string
+ # u'example.com'
+
+ print(my_string.parent)
+ # None
+ i_tag
+ # <i></i>
+
+decompose()
+------------
+
+``Tag.decompose()`` 方法将当前节点移除文档树并完全销毁:
+
+::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ a_tag = soup.a
+
+ soup.i.decompose()
+
+ a_tag
+ # <a href="http://example.com/">I linked to</a>
+
+replace_with()
+---------------
+
+``PageElement.replace_with()`` 方法移除文档树中的某段内容,并用新tag或文本节点替代它:
+
+::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ a_tag = soup.a
+
+ new_tag = soup.new_tag("b")
+ new_tag.string = "example.net"
+ a_tag.i.replace_with(new_tag)
+
+ a_tag
+ # <a href="http://example.com/">I linked to <b>example.net</b></a>
+
+``replace_with()`` 方法返回被替代的tag或文本节点,可以用来浏览或添加到文档树其它地方
+
+wrap()
+------
+
+``PageElement.wrap()`` 方法可以对指定的tag元素进行包装 [8]_ ,并返回包装后的结果:
+
+::
+
+ soup = BeautifulSoup("<p>I wish I was bold.</p>")
+ soup.p.string.wrap(soup.new_tag("b"))
+ # <b>I wish I was bold.</b>
+
+ soup.p.wrap(soup.new_tag("div"))
+ # <div><p><b>I wish I was bold.</b></p></div>
+
+该方法在 Beautiful Soup 4.0.5 中添加
+
+unwrap()
+---------
+
+``Tag.unwrap()`` 方法与 ``wrap()`` 方法相反.将移除tag内的所有tag标签,该方法常被用来进行标记的解包:
+
+::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ a_tag = soup.a
+
+ a_tag.i.unwrap()
+ a_tag
+ # <a href="http://example.com/">I linked to example.com</a>
+
+与 ``replace_with()`` 方法相同, ``unwrap()`` 方法返回被移除的tag
+
+输出
+====
+
+格式化输出
+-----------
+
+``prettify()`` 方法将Beautiful Soup的文档树格式化后以Unicode编码输出,每个XML/HTML标签都独占一行
+
+::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup)
+ soup.prettify()
+ # '<html>\n <head>\n </head>\n <body>\n <a href="http://example.com/">\n...'
+
+ print(soup.prettify())
+ # <html>
+ # <head>
+ # </head>
+ # <body>
+ # <a href="http://example.com/">
+ # I linked to
+ # <i>
+ # example.com
+ # </i>
+ # </a>
+ # </body>
+ # </html>
+
+``BeautifulSoup`` 对象和它的tag节点都可以调用 ``prettify()`` 方法:
+
+::
+
+ print(soup.a.prettify())
+ # <a href="http://example.com/">
+ # I linked to
+ # <i>
+ # example.com
+ # </i>
+ # </a>
+
+压缩输出
+----------
+
+如果只想得到结果字符串,不重视格式,那么可以对一个 ``BeautifulSoup`` 对象或 ``Tag`` 对象使用Python的 ``unicode()`` 或 ``str()`` 方法:
+
+::
+
+ str(soup)
+ # '<html><head></head><body><a href="http://example.com/">I linked to <i>example.com</i></a></body></html>'
+
+ unicode(soup.a)
+ # u'<a href="http://example.com/">I linked to <i>example.com</i></a>'
+
+``str()`` 方法返回UTF-8编码的字符串,可以指定 `编码`_ 的设置.
+
+还可以调用 ``encode()`` 方法获得字节码或调用 ``decode()`` 方法获得Unicode.
+
+输出格式
+---------
+
+Beautiful Soup输出是会将HTML中的特殊字符转换成Unicode,比如“&lquot;”:
+
+::
+
+ soup = BeautifulSoup("&ldquo;Dammit!&rdquo; he said.")
+ unicode(soup)
+ # u'<html><head></head><body>\u201cDammit!\u201d he said.</body></html>'
+
+如果将文档转换成字符串,Unicode编码会被编码成UTF-8.这样就无法正确显示HTML特殊字符了:
+
+::
+
+ str(soup)
+ # '<html><head></head><body>\xe2\x80\x9cDammit!\xe2\x80\x9d he said.</body></html>'
+
+get_text()
+----------
+
+如果只想得到tag中包含的文本内容,那么可以调用 ``get_text()`` 方法,这个方法获取到tag中包含的所有文版内容包括子孙tag中的内容,并将结果作为Unicode字符串返回:
+
+::
+
+ markup = '<a href="http://example.com/">\nI linked to <i>example.com</i>\n</a>'
+ soup = BeautifulSoup(markup)
+
+ soup.get_text()
+ u'\nI linked to example.com\n'
+ soup.i.get_text()
+ u'example.com'
+
+可以通过参数指定tag的文本内容的分隔符:
+
+::
+
+ # soup.get_text("|")
+ u'\nI linked to |example.com|\n'
+
+还可以去除获得文本内容的前后空白:
+
+::
+
+ # soup.get_text("|", strip=True)
+ u'I linked to|example.com'
+
+或者使用 `.stripped_strings`_ 生成器,获得文本列表后手动处理列表:
+
+::
+
+ [text for text in soup.stripped_strings]
+ # [u'I linked to', u'example.com']
+
+指定文档解析器
+==============
+
+如果仅是想要解析HTML文档,只要用文档创建 ``BeautifulSoup`` 对象就可以了.Beautiful Soup会自动选择一个解析器来解析文档.但是还可以通过参数指定使用那种解析器来解析当前文档.
+
+``BeautifulSoup`` 第一个参数应该是要被解析的文档字符串或是文件句柄,第二个参数用来标识怎样解析文档.如果第二个参数为空,那么Beautiful Soup根据当前系统安装的库自动选择解析器,解析器的优先数序: lxml, html5lib, Python标准库.在下面两种条件下解析器优先顺序会变化:
+
+ * 要解析的文档是什么类型: 目前支持, “html”, “xml”, 和 “html5”
+ * 指定使用哪种解析器: 目前支持, “lxml”, “html5lib”, 和 “html.parser”
+
+`安装解析器`_ 章节介绍了可以使用哪种解析器,以及如何安装.
+
+如果指定的解析器没有安装,Beautiful Soup会自动选择其它方案.目前只有 lxml 解析器支持XML文档的解析,在没有安装lxml库的情况下,创建 ``beautifulsoup`` 对象时无论是否指定使用lxml,都无法得到解析后的对象
+
+解析器之间的区别
+-----------------
+
+Beautiful Soup为不同的解析器提供了相同的接口,但解析器本身时有区别的.同一篇文档被不同的解析器解析后可能会生成不同结构的树型文档.区别最大的是HTML解析器和XML解析器,看下面片段被解析成HTML结构:
+
+::
+
+ BeautifulSoup("<a><b /></a>")
+ # <html><head></head><body><a><b></b></a></body></html>
+
+因为空标签<b />不符合HTML标准,所以解析器把它解析成<b></b>
+
+同样的文档使用XML解析如下(解析XML需要安装lxml库).注意,空标签<b />依然被保留,并且文档前添加了XML头,而不是被包含在<html>标签内:
+
+::
+
+ BeautifulSoup("<a><b /></a>", "xml")
+ # <?xml version="1.0" encoding="utf-8"?>
+ # <a><b/></a>
+
+HTML解析器之间也有区别,如果被解析的HTML文档是标准格式,那么解析器之间没有任何差别,只是解析速度不同,结果都会返回正确的文档树.
+
+但是如果被解析文档不是标准格式,那么不同的解析器返回结果可能不同.下面例子中,使用lxml解析错误格式的文档,结果</p>标签被直接忽略掉了:
+
+::
+
+ BeautifulSoup("<a></p>", "lxml")
+ # <html><body><a></a></body></html>
+
+使用html5lib库解析相同文档会得到不同的结果:
+
+::
+
+ BeautifulSoup("<a></p>", "html5lib")
+ # <html><head></head><body><a><p></p></a></body></html>
+
+html5lib库没有忽略掉</p>标签,而是自动补全了标签,还给文档树添加了<head>标签.
+
+使用pyhton内置库解析结果如下:
+
+::
+
+ BeautifulSoup("<a></p>", "html.parser")
+ # <a></a>
+
+与lxml [7]_ 库类似的,Python内置库忽略掉了</p>标签,与html5lib库不同的是标准库没有尝试创建符合标准的文档格式或将文档片段包含在<body>标签内,与lxml不同的是标准库甚至连<html>标签都没有尝试去添加.
+
+因为文档片段“<a></p>”是错误格式,所以以上解析方式都能算作"正确",html5lib库使用的是HTML5的部分标准,所以最接近"正确".不过所有解析器的结构都能够被认为是"正常"的.
+
+不同的解析器可能影响代码执行结果,如果在分发给别人的代码中使用了 ``BeautifulSoup`` ,那么最好注明使用了哪种解析器,以减少不必要的麻烦.
+
+编码
+====
+
+任何HTML或XML文档都有自己的编码方式,比如ASCII 或 UTF-8,但是使用Beautiful Soup解析后,文档都被转换成了Unicode:
+
+::
+
+ markup = "<h1>Sacr\xc3\xa9 bleu!</h1>"
+ soup = BeautifulSoup(markup)
+ soup.h1
+ # <h1>Sacré bleu!</h1>
+ soup.h1.string
+ # u'Sacr\xe9 bleu!'
+
+这不是魔术(但很神奇),Beautiful Soup用了 `编码自动检测`_ 子库来识别当前文档编码并转换成Unicode编码. ``BeautifulSoup`` 对象的 ``.original_encoding`` 属性记录了自动识别编码的结果:
+
+::
+
+ soup.original_encoding
+ 'utf-8'
+
+`编码自动检测`_ 功能大部分时候都能猜对编码格式,但有时候也会出错.有时候即使猜测正确,也是在逐个字节的遍历整个文档后才猜对的,这样很慢.如果预先知道文档编码,可以设置编码参数来减少自动检查编码出错的概率并且提高文档解析速度.在创建 ``BeautifulSoup`` 对象的时候设置 ``from_encoding`` 参数.
+
+下面一段文档用了ISO-8859-8编码方式,这段文档太短,结果Beautiful Soup以为文档是用ISO-8859-7编码:
+
+::
+
+ markup = b"<h1>\xed\xe5\xec\xf9</h1>"
+ soup = BeautifulSoup(markup)
+ soup.h1
+ <h1>νεμω</h1>
+ soup.original_encoding
+ 'ISO-8859-7'
+
+通过传入 ``from_encoding`` 参数来指定编码方式:
+
+::
+
+ soup = BeautifulSoup(markup, from_encoding="iso-8859-8")
+ soup.h1
+ <h1>םולש</h1>
+ soup.original_encoding
+ 'iso8859-8'
+
+如果仅知道文档采用了Unicode编码, 但不知道具体编码. 可以先自己猜测, 猜测错误(依旧是乱码)时,
+可以把错误编码作为 ``exclude_encodings`` 参数, 这样文档就不会尝试使用这种编码了解码了.
+译者备注: 在没有指定编码的情况下, BS会自己猜测编码, 把不正确的编码排除掉, BS就更容易猜到正确编码.
+
+::
+
+ soup = BeautifulSoup(markup, exclude_encodings=["ISO-8859-7"])
+ soup.h1
+ <h1>םולש</h1>
+ soup.original_encoding
+ 'WINDOWS-1255'
+
+猜测结果是 Windows-1255 编码, 猜测结果可能不够准确, 但是 Windows-1255 编码是 ISO-8859-8 的扩展集,
+所以猜测结果已经十分接近了, 并且不影响使用. (``exclude_encodings`` 参数是 4.4.0版本的新功能)
+
+少数情况下(通常是UTF-8编码的文档中包含了其它编码格式的文件),想获得正确的Unicode编码就不得不将文档中少数特殊编码字符替换成特殊Unicode编码,“REPLACEMENT CHARACTER” (U+FFFD, �) [9]_ . 如果Beautifu Soup猜测文档编码时作了特殊字符的替换,那么Beautiful Soup会把 ``UnicodeDammit`` 或 ``BeautifulSoup`` 对象的 ``.contains_replacement_characters`` 属性标记为 ``True`` .这样就可以知道当前文档进行Unicode编码后丢失了一部分特殊内容字符.如果文档中包含�而 ``.contains_replacement_characters`` 属性是 ``False`` ,则表示�就是文档中原来的字符,不是转码失败.
+
+输出编码
+--------
+
+通过Beautiful Soup输出文档时,不管输入文档是什么编码方式,输出编码均为UTF-8编码,下面例子输入文档是Latin-1编码:
+
+::
+
+ markup = b'''
+ <html>
+ <head>
+ <meta content="text/html; charset=ISO-Latin-1" http-equiv="Content-type" />
+ </head>
+ <body>
+ <p>Sacr\xe9 bleu!</p>
+ </body>
+ </html>
+ '''
+
+ soup = BeautifulSoup(markup)
+ print(soup.prettify())
+ # <html>
+ # <head>
+ # <meta content="text/html; charset=utf-8" http-equiv="Content-type" />
+ # </head>
+ # <body>
+ # <p>
+ # Sacré bleu!
+ # </p>
+ # </body>
+ # </html>
+
+注意,输出文档中的<meta>标签的编码设置已经修改成了与输出编码一致的UTF-8.
+
+如果不想用UTF-8编码输出,可以将编码方式传入 ``prettify()`` 方法:
+
+::
+
+ print(soup.prettify("latin-1"))
+ # <html>
+ # <head>
+ # <meta content="text/html; charset=latin-1" http-equiv="Content-type" />
+ # ...
+
+还可以调用 ``BeautifulSoup`` 对象或任意节点的 ``encode()`` 方法,就像Python的字符串调用 ``encode()`` 方法一样:
+
+::
+
+ soup.p.encode("latin-1")
+ # '<p>Sacr\xe9 bleu!</p>'
+
+ soup.p.encode("utf-8")
+ # '<p>Sacr\xc3\xa9 bleu!</p>'
+
+如果文档中包含当前编码不支持的字符,那么这些字符将被转换成一系列XML特殊字符引用,下面例子中包含了Unicode编码字符SNOWMAN:
+
+::
+
+ markup = u"<b>\N{SNOWMAN}</b>"
+ snowman_soup = BeautifulSoup(markup)
+ tag = snowman_soup.b
+
+SNOWMAN字符在UTF-8编码中可以正常显示(看上去像是☃),但有些编码不支持SNOWMAN字符,比如ISO-Latin-1或ASCII,那么在这些编码中SNOWMAN字符会被转换成“&#9731”:
+
+::
+
+ print(tag.encode("utf-8"))
+ # <b>☃</b>
+
+ print tag.encode("latin-1")
+ # <b>&#9731;</b>
+
+ print tag.encode("ascii")
+ # <b>&#9731;</b>
+
+Unicode, Dammit! (乱码, 靠!)
+-----------------------------
+
+译者备注: UnicodeDammit 是BS内置库, 主要用来猜测文档编码.
+
+`编码自动检测`_ 功能可以在Beautiful Soup以外使用,检测某段未知编码时,可以使用这个方法:
+
+::
+
+ from bs4 import UnicodeDammit
+ dammit = UnicodeDammit("Sacr\xc3\xa9 bleu!")
+ print(dammit.unicode_markup)
+ # Sacré bleu!
+ dammit.original_encoding
+ # 'utf-8'
+
+如果Python中安装了 ``chardet`` 或 ``cchardet`` 那么编码检测功能的准确率将大大提高.
+输入的字符越多,检测结果越精确,如果事先猜测到一些可能编码,
+那么可以将猜测的编码作为参数,这样将优先检测这些编码:
+
+::
+
+
+ dammit = UnicodeDammit("Sacr\xe9 bleu!", ["latin-1", "iso-8859-1"])
+ print(dammit.unicode_markup)
+ # Sacré bleu!
+ dammit.original_encoding
+ # 'latin-1'
+
+`编码自动检测`_ 功能中有2项功能是Beautiful Soup库中用不到的
+
+智能引号
+...........
+
+使用Unicode时,Beautiful Soup还会智能的把引号 [10]_ 转换成HTML或XML中的特殊字符:
+
+::
+
+ markup = b"<p>I just \x93love\x94 Microsoft Word\x92s smart quotes</p>"
+
+ UnicodeDammit(markup, ["windows-1252"], smart_quotes_to="html").unicode_markup
+ # u'<p>I just &ldquo;love&rdquo; Microsoft Word&rsquo;s smart quotes</p>'
+
+ UnicodeDammit(markup, ["windows-1252"], smart_quotes_to="xml").unicode_markup
+ # u'<p>I just &#x201C;love&#x201D; Microsoft Word&#x2019;s smart quotes</p>'
+
+也可以把引号转换为ASCII码:
+
+::
+
+ UnicodeDammit(markup, ["windows-1252"], smart_quotes_to="ascii").unicode_markup
+ # u'<p>I just "love" Microsoft Word\'s smart quotes</p>'
+
+很有用的功能,但是Beautiful Soup没有使用这种方式.默认情况下,Beautiful Soup把引号转换成Unicode:
+
+::
+
+ UnicodeDammit(markup, ["windows-1252"]).unicode_markup
+ # u'<p>I just \u201clove\u201d Microsoft Word\u2019s smart quotes</p>'
+
+矛盾的编码
+...........
+
+有时文档的大部分都是用UTF-8,但同时还包含了Windows-1252编码的字符,就像微软的智能引号 [10]_ 一样.
+一些包含多个信息的来源网站容易出现这种情况. ``UnicodeDammit.detwingle()``
+方法可以把这类文档转换成纯UTF-8编码格式,看个简单的例子:
+
+::
+
+ snowmen = (u"\N{SNOWMAN}" * 3)
+ quote = (u"\N{LEFT DOUBLE QUOTATION MARK}I like snowmen!\N{RIGHT DOUBLE QUOTATION MARK}")
+ doc = snowmen.encode("utf8") + quote.encode("windows_1252")
+
+这段文档很杂乱,snowmen是UTF-8编码,引号是Windows-1252编码,直接输出时不能同时显示snowmen和引号,因为它们编码不同:
+
+::
+
+ print(doc)
+ # ☃☃☃�I like snowmen!�
+
+ print(doc.decode("windows-1252"))
+ # ☃☃☃“I like snowmen!”
+
+如果对这段文档用UTF-8解码就会得到 ``UnicodeDecodeError`` 异常,如果用Windows-1252解码就回得到一堆乱码.
+幸好, ``UnicodeDammit.detwingle()`` 方法会把这段字符串转换成UTF-8编码,允许我们同时显示出文档中的snowmen和引号:
+
+::
+
+ new_doc = UnicodeDammit.detwingle(doc)
+ print(new_doc.decode("utf8"))
+ # ☃☃☃“I like snowmen!”
+
+``UnicodeDammit.detwingle()`` 方法只能解码包含在UTF-8编码中的Windows-1252编码内容,但这解决了最常见的一类问题.
+
+在创建 ``BeautifulSoup`` 或 ``UnicodeDammit`` 对象前一定要先对文档调用 ``UnicodeDammit.detwingle()`` 确保文档的编码方式正确.如果尝试去解析一段包含Windows-1252编码的UTF-8文档,就会得到一堆乱码,比如: ☃☃☃“I like snowmen!”.
+
+``UnicodeDammit.detwingle()`` 方法在Beautiful Soup 4.1.0版本中新增
+
+比较对象是否相同
+=================
+
+两个 ``NavigableString`` 或 ``Tag`` 对象具有相同的HTML或XML结构时,
+Beautiful Soup就判断这两个对象相同. 这个例子中, 2个 <b> 标签在 BS 中是相同的,
+尽管他们在文档树的不同位置, 但是具有相同的表象: "<b>pizza</b>"
+
+::
+
+ markup = "<p>I want <b>pizza</b> and more <b>pizza</b>!</p>"
+ soup = BeautifulSoup(markup, 'html.parser')
+ first_b, second_b = soup.find_all('b')
+ print first_b == second_b
+ # True
+
+ print first_b.previous_element == second_b.previous_element
+ # False
+
+如果想判断两个对象是否严格的指向同一个对象可以通过 ``is`` 来判断
+
+::
+
+ print first_b is second_b
+ # False
+
+复制Beautiful Soup对象
+======================
+
+``copy.copy()`` 方法可以复制任意 ``Tag`` 或 ``NavigableString`` 对象
+
+::
+
+ import copy
+ p_copy = copy.copy(soup.p)
+ print p_copy
+ # <p>I want <b>pizza</b> and more <b>pizza</b>!</p>
+
+复制后的对象跟与对象是相等的, 但指向不同的内存地址
+
+::
+
+ print soup.p == p_copy
+ # True
+
+ print soup.p is p_copy
+ # False
+
+源对象和复制对象的区别是源对象在文档树中, 而复制后的对象是独立的还没有添加到文档树中.
+复制后对象的效果跟调用了 ``extract()`` 方法相同.
+
+::
+
+ print p_copy.parent
+ # None
+
+这是因为相等的对象不能同时插入相同的位置
+
+
+解析部分文档
+============
+
+如果仅仅因为想要查找文档中的<a>标签而将整片文档进行解析,实在是浪费内存和时间.最快的方法是从一开始就把<a>标签以外的东西都忽略掉. ``SoupStrainer`` 类可以定义文档的某段内容,这样搜索文档时就不必先解析整篇文档,只会解析在 ``SoupStrainer`` 中定义过的文档. 创建一个 ``SoupStrainer`` 对象并作为 ``parse_only`` 参数给 ``BeautifulSoup`` 的构造方法即可.
+
+SoupStrainer
+-------------
+
+``SoupStrainer`` 类接受与典型搜索方法相同的参数:`name`_ , `attrs`_ , `recursive`_ , `string`_ , `**kwargs`_ 。下面举例说明三种 ``SoupStrainer`` 对象:
+
+::
+
+ from bs4 import SoupStrainer
+
+ only_a_tags = SoupStrainer("a")
+
+ only_tags_with_id_link2 = SoupStrainer(id="link2")
+
+ def is_short_string(string):
+ return len(string) < 10
+
+ only_short_strings = SoupStrainer(string=is_short_string)
+
+再拿“爱丽丝”文档来举例,来看看使用三种 ``SoupStrainer`` 对象做参数会有什么不同:
+
+::
+
+ html_doc = """
+ <html><head><title>The Dormouse's story</title></head>
+ <body>
+ <p class="title"><b>The Dormouse's story</b></p>
+
+ <p class="story">Once upon a time there were three little sisters; and their names were
+ <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
+ <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
+ <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
+ and they lived at the bottom of a well.</p>
+
+ <p class="story">...</p>
+ """
+
+ print(BeautifulSoup(html_doc, "html.parser", parse_only=only_a_tags).prettify())
+ # <a class="sister" href="http://example.com/elsie" id="link1">
+ # Elsie
+ # </a>
+ # <a class="sister" href="http://example.com/lacie" id="link2">
+ # Lacie
+ # </a>
+ # <a class="sister" href="http://example.com/tillie" id="link3">
+ # Tillie
+ # </a>
+
+ print(BeautifulSoup(html_doc, "html.parser", parse_only=only_tags_with_id_link2).prettify())
+ # <a class="sister" href="http://example.com/lacie" id="link2">
+ # Lacie
+ # </a>
+
+ print(BeautifulSoup(html_doc, "html.parser", parse_only=only_short_strings).prettify())
+ # Elsie
+ # ,
+ # Lacie
+ # and
+ # Tillie
+ # ...
+ #
+
+还可以将 ``SoupStrainer`` 作为参数传入 `搜索文档树`_ 中提到的方法.这可能不是个常用用法,所以还是提一下:
+
+::
+
+ soup = BeautifulSoup(html_doc)
+ soup.find_all(only_short_strings)
+ # [u'\n\n', u'\n\n', u'Elsie', u',\n', u'Lacie', u' and\n', u'Tillie',
+ # u'\n\n', u'...', u'\n']
+
+常见问题
+========
+
+代码诊断
+----------
+
+如果想知道Beautiful Soup到底怎样处理一份文档,可以将文档传入 ``diagnose()`` 方法(Beautiful Soup 4.2.0中新增),Beautiful Soup会输出一份报告,说明不同的解析器会怎样处理这段文档,并标出当前的解析过程会使用哪种解析器:
+
+::
+
+ from bs4.diagnose import diagnose
+ data = open("bad.html").read()
+ diagnose(data)
+
+ # Diagnostic running on Beautiful Soup 4.2.0
+ # Python version 2.7.3 (default, Aug 1 2012, 05:16:07)
+ # I noticed that html5lib is not installed. Installing it may help.
+ # Found lxml version 2.3.2.0
+ #
+ # Trying to parse your data with html.parser
+ # Here's what html.parser did with the document:
+ # ...
+
+``diagnose()`` 方法的输出结果可能帮助你找到问题的原因,如果不行,还可以把结果复制出来以便寻求他人的帮助
+
+文档解析错误
+-------------
+
+文档解析错误有两种.一种是崩溃,Beautiful Soup尝试解析一段文档结果却抛除了异常,通常是 ``HTMLParser.HTMLParseError`` .还有一种异常情况,是Beautiful Soup解析后的文档树看起来与原来的内容相差很多.
+
+这些错误几乎都不是Beautiful Soup的原因,这不会是因为Beautiful Soup的代码写的太优秀,而是因为Beautiful Soup没有包含任何文档解析代码.异常产生自被依赖的解析器,如果解析器不能很好的解析出当前的文档,那么最好的办法是换一个解析器.更多细节查看 `安装解析器`_ 章节.
+
+最常见的解析错误是 ``HTMLParser.HTMLParseError: malformed start tag`` 和 ``HTMLParser.HTMLParseError: bad end tag`` .这都是由Python内置的解析器引起的,解决方法是 `安装lxml或html5lib`_
+
+最常见的异常现象是当前文档找不到指定的Tag,而这个Tag光是用眼睛就足够发现的了. ``find_all()`` 方法返回 [] ,而 ``find()`` 方法返回 None .这是Python内置解析器的又一个问题: 解析器会跳过那些它不知道的tag.解决方法还是 `安装lxml或html5lib`_
+
+版本错误
+----------
+
+* ``SyntaxError: Invalid syntax`` (异常位置在代码行: ``ROOT_TAG_NAME = u'[document]'`` ),因为Python2语法的代码(没有经过迁移)直接在Python3中运行
+
+* ``ImportError: No module named HTMLParser`` 因为在Python3中执行Python2版本的Beautiful Soup
+
+* ``ImportError: No module named html.parser`` 因为在Python2中执行Python3版本的Beautiful Soup
+
+* ``ImportError: No module named BeautifulSoup`` 因为在没有安装BeautifulSoup3库的Python环境下执行代码,或忘记了BeautifulSoup4的代码需要从 ``bs4`` 包中引入
+
+* ``ImportError: No module named bs4`` 因为当前Python环境下还没有安装BeautifulSoup4
+
+解析成XML
+----------
+
+默认情况下,Beautiful Soup会将当前文档作为HTML格式解析,如果要解析XML文档,要在 ``BeautifulSoup`` 构造方法中加入第二个参数 "xml":
+
+::
+
+ soup = BeautifulSoup(markup, "xml")
+
+当然,还需要 `安装lxml`_
+
+解析器的错误
+------------
+
+* 如果同样的代码在不同环境下结果不同,可能是因为两个环境下使用不同的解析器造成的.例如这个环境中安装了lxml,而另一个环境中只有html5lib, `解析器之间的区别`_ 中说明了原因.修复方法是在 ``BeautifulSoup`` 的构造方法中中指定解析器
+
+* 因为HTML标签是 `大小写敏感 <http://www.w3.org/TR/html5/syntax.html#syntax>`_ 的,所以3种解析器再出来文档时都将tag和属性转换成小写.例如文档中的 <TAG></TAG> 会被转换为 <tag></tag> .如果想要保留tag的大写的话,那么应该将文档 `解析成XML`_ .
+
+杂项错误
+--------
+
+* ``UnicodeEncodeError: 'charmap' codec can't encode character u'\xfoo' in position bar`` (或其它类型的 ``UnicodeEncodeError`` )的错误,主要是两方面的错误(都不是Beautiful Soup的原因),第一种是正在使用的终端(console)无法显示部分Unicode,参考 `Python wiki <http://wiki.Python.org/moin/PrintFails>`_ ,第二种是向文件写入时,被写入文件不支持部分Unicode,这时只要用 ``u.encode("utf8")`` 方法将编码转换为UTF-8.
+
+* ``KeyError: [attr]`` 因为调用 ``tag['attr']`` 方法而引起,因为这个tag没有定义该属性.出错最多的是 ``KeyError: 'href'`` 和 ``KeyError: 'class'`` .如果不确定某个属性是否存在时,用 ``tag.get('attr')`` 方法去获取它,跟获取Python字典的key一样
+
+* ``AttributeError: 'ResultSet' object has no attribute 'foo'`` 错误通常是因为把 ``find_all()`` 的返回结果当作一个tag或文本节点使用,实际上返回结果是一个列表或 ``ResultSet`` 对象的字符串,需要对结果进行循环才能得到每个节点的 ``.foo`` 属性.或者使用 ``find()`` 方法仅获取到一个节点
+
+* ``AttributeError: 'NoneType' object has no attribute 'foo'`` 这个错误通常是在调用了 ``find()`` 方法后直节点取某个属性 .foo 但是 ``find()`` 方法并没有找到任何结果,所以它的返回值是 ``None`` .需要找出为什么 ``find()`` 的返回值是 ``None`` .
+
+如何提高效率
+------------
+
+Beautiful Soup对文档的解析速度不会比它所依赖的解析器更快,如果对计算时间要求很高或者计算机的时间比程序员的时间更值钱,那么就应该直接使用 `lxml <http://lxml.de/>`_ .
+
+换句话说,还有提高Beautiful Soup效率的办法,使用lxml作为解析器.Beautiful Soup用lxml做解析器比用html5lib或Python内置解析器速度快很多.
+
+安装 `cchardet <http://pypi.Python.org/pypi/cchardet/>`_ 后文档的解码的编码检测会速度更快
+
+`解析部分文档`_ 不会节省多少解析时间,但是会节省很多内存,并且搜索时也会变得更快.
+
+Beautiful Soup 3
+=================
+
+Beautiful Soup 3是上一个发布版本,目前已经停止维护.Beautiful Soup 3库目前已经被几个主要的linux平台添加到源里:
+
+``$ apt-get install Python-beautifulsoup``
+
+在PyPi中分发的包名字是 ``BeautifulSoup`` :
+
+``$ easy_install BeautifulSoup``
+
+``$ pip install BeautifulSoup``
+
+或通过 `Beautiful Soup 3.2.0源码包 <http://www.crummy.com/software/BeautifulSoup/bs3/download/3.x/BeautifulSoup-3.2.0.tar.gz>`_ 安装
+
+Beautiful Soup 3的在线文档查看 `这里 <http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html>`_ .
+
+迁移到BS4
+----------
+
+只要一个小变动就能让大部分的Beautiful Soup 3代码使用Beautiful Soup 4的库和方法----修改 ``BeautifulSoup`` 对象的引入方式:
+
+::
+
+ from BeautifulSoup import BeautifulSoup
+
+修改为:
+
+::
+
+ from bs4 import BeautifulSoup
+
+* 如果代码抛出 ``ImportError`` 异常“No module named BeautifulSoup”,原因可能是尝试执行Beautiful Soup 3,但环境中只安装了Beautiful Soup 4库
+
+* 如果代码跑出 ``ImportError`` 异常“No module named bs4”,原因可能是尝试运行Beautiful Soup 4的代码,但环境中只安装了Beautiful Soup 3.
+
+虽然BS4兼容绝大部分BS3的功能,但BS3中的大部分方法已经不推荐使用了,就方法按照 `PEP8标准 <http://www.Python.org/dev/peps/pep-0008/>`_ 重新定义了方法名.很多方法都重新定义了方法名,但只有少数几个方法没有向下兼容.
+
+上述内容就是BS3迁移到BS4的注意事项
+
+需要的解析器
+............
+
+Beautiful Soup 3曾使用Python的 ``SGMLParser`` 解析器,这个模块在Python3中已经被移除了.Beautiful Soup 4默认使用系统的 ``html.parser`` ,也可以使用lxml或html5lib扩展库代替.查看 `安装解析器`_ 章节
+
+因为解析器 ``html.parser`` 与 ``SGMLParser`` 不同. BS4 和 BS3 处理相同的文档会产生不同的对象结构. 使用lxml或html5lib解析文档的时候, 如果添加了 ``html.parser`` 参数, 解析的对象又回发生变化. 如果发生了这种情况, 只能修改对应的处文档结果处理代码了.
+
+方法名的变化
+............
+
+* ``renderContents`` -> ``encode_contents``
+
+* ``replaceWith`` -> ``replace_with``
+
+* ``replaceWithChildren`` -> ``unwrap``
+
+* ``findAll`` -> ``find_all``
+
+* ``findAllNext`` -> ``find_all_next``
+
+* ``findAllPrevious`` -> ``find_all_previous``
+
+* ``findNext`` -> ``find_next``
+
+* ``findNextSibling`` -> ``find_next_sibling``
+
+* ``findNextSiblings`` -> ``find_next_siblings``
+
+* ``findParent`` -> ``find_parent``
+
+* ``findParents`` -> ``find_parents``
+
+* ``findPrevious`` -> ``find_previous``
+
+* ``findPreviousSibling`` -> ``find_previous_sibling``
+
+* ``findPreviousSiblings`` -> ``find_previous_siblings``
+
+* ``nextSibling`` -> ``next_sibling``
+
+* ``previousSibling`` -> ``previous_sibling``
+
+Beautiful Soup构造方法的参数部分也有名字变化:
+
+* ``BeautifulSoup(parseOnlyThese=...)`` -> ``BeautifulSoup(parse_only=...)``
+
+* ``BeautifulSoup(fromEncoding=...)`` -> ``BeautifulSoup(from_encoding=...)``
+
+为了适配Python3,修改了一个方法名:
+
+* ``Tag.has_key()`` -> ``Tag.has_attr()``
+
+修改了一个属性名,让它看起来更专业点:
+
+* ``Tag.isSelfClosing`` -> ``Tag.is_empty_element``
+
+修改了下面3个属性的名字,以免雨Python保留字冲突.这些变动不是向下兼容的,如果在BS3中使用了这些属性,那么在BS4中这些代码无法执行.
+
+* UnicodeDammit.Unicode -> UnicodeDammit.Unicode_markup``
+
+* ``Tag.next`` -> ``Tag.next_element``
+
+* ``Tag.previous`` -> ``Tag.previous_element``
+
+生成器
+.......
+
+将下列生成器按照PEP8标准重新命名,并转换成对象的属性:
+
+* ``childGenerator()`` -> ``children``
+
+* ``nextGenerator()`` -> ``next_elements``
+
+* ``nextSiblingGenerator()`` -> ``next_siblings``
+
+* ``previousGenerator()`` -> ``previous_elements``
+
+* ``previousSiblingGenerator()`` -> ``previous_siblings``
+
+* ``recursiveChildGenerator()`` -> ``descendants``
+
+* ``parentGenerator()`` -> ``parents``
+
+所以迁移到BS4版本时要替换这些代码:
+
+::
+
+ for parent in tag.parentGenerator():
+ ...
+
+替换为:
+
+::
+
+ for parent in tag.parents:
+ ...
+
+(两种调用方法现在都能使用)
+
+BS3中有的生成器循环结束后会返回 ``None`` 然后结束.这是个bug.新版生成器不再返回 ``None`` .
+
+BS4中增加了2个新的生成器, `.strings 和 stripped_strings`_ . ``.strings`` 生成器返回NavigableString对象, ``.stripped_strings`` 方法返回去除前后空白的Python的string对象.
+
+XML
+....
+
+BS4中移除了解析XML的 ``BeautifulStoneSoup`` 类.如果要解析一段XML文档,使用 ``BeautifulSoup`` 构造方法并在第二个参数设置为“xml”.同时 ``BeautifulSoup`` 构造方法也不再识别 ``isHTML`` 参数.
+
+Beautiful Soup处理XML空标签的方法升级了.旧版本中解析XML时必须指明哪个标签是空标签. 构造方法的 ``selfClosingTags`` 参数已经不再使用.新版Beautiful Soup将所有空标签解析为空元素,如果向空元素中添加子节点,那么这个元素就不再是空元素了.
+
+实体
+.....
+
+HTML或XML实体都会被解析成Unicode字符,Beautiful Soup 3版本中有很多处理实体的方法,在新版中都被移除了. ``BeautifulSoup`` 构造方法也不再接受 ``smartQuotesTo`` 或 ``convertEntities`` 参数. `编码自动检测`_ 方法依然有 ``smart_quotes_to`` 参数,但是默认会将引号转换成Unicode.内容配置项 ``HTML_ENTITIES`` , ``XML_ENTITIES`` 和 ``XHTML_ENTITIES`` 在新版中被移除.因为它们代表的特性已经不再被支持.
+
+如果在输出文档时想把Unicode字符转换成HTML实体,而不是输出成UTF-8编码,那就需要用到 `输出格式`_ 的方法.
+
+迁移杂项
+.........
+
+`Tag.string`_ 属性现在是一个递归操作.如果A标签只包含了一个B标签,那么A标签的.string属性值与B标签的.string属性值相同.
+
+`多值属性`_ 比如 ``class`` 属性包含一个他们的值的列表,而不是一个字符串.这可能会影响到如何按照CSS类名哦搜索tag.
+
+如果使用 ``find*`` 方法时同时传入了 `string 参数`_ 和 `name 参数`_ .Beautiful Soup会搜索指定name的tag,并且这个tag的 `Tag.string`_ 属性包含text参数的内容.结果中不会包含字符串本身.旧版本中Beautiful Soup会忽略掉tag参数,只搜索text参数.
+
+``BeautifulSoup`` 构造方法不再支持 markupMassage 参数.现在由解析器负责文档的解析正确性.
+
+很少被用到的几个解析器方法在新版中被移除,比如 ``ICantBelieveItsBeautifulSoup`` 和 ``BeautifulSOAP`` .现在由解析器完全负责如何解释模糊不清的文档标记.
+
+``prettify()`` 方法在新版中返回Unicode字符串,不再返回字节流.
+
+附录
+=====
+
+.. _`BeautifulSoup3 文档`: http://www.crummy.com/software/BeautifulSoup/bs3/documentation.zh.html
+.. _name: `name 参数`_
+.. _attrs: `按CSS搜索`_
+.. _recursive: `recursive 参数`_
+.. _string: `string 参数`_
+.. _**kwargs: `keyword 参数`_
+.. _.next_siblings: `.next_siblings 和 .previous_siblings`_
+.. _.previous_siblings: `.next_siblings 和 .previous_siblings`_
+.. _.next_elements: `.next_elements 和 .previous_elements`_
+.. _.previous_elements: `.next_elements 和 .previous_elements`_
+.. _.stripped_strings: `.strings 和 stripped_strings`_
+.. _安装lxml: `安装解析器`_
+.. _安装lxml或html5lib: `安装解析器`_
+.. _编码自动检测: `Unicode, Dammit! (乱码, 靠!)`_
+.. _Tag.string: `.string`_
+
+
+.. [1] BeautifulSoup的google讨论组不是很活跃,可能是因为库已经比较完善了吧,但是作者还是会很热心的尽量帮你解决问题的.
+.. [2] 文档被解析成树形结构,所以下一步解析过程应该是当前节点的子节点
+.. [3] 过滤器只能作为搜索文档的参数,或者说应该叫参数类型更为贴切,原文中用了 ``filter`` 因此翻译为过滤器
+.. [4] 元素参数,HTML文档中的一个tag节点,不能是文本节点
+.. [5] 采用先序遍历方式
+.. [6] CSS选择器是一种单独的文档搜索语法, 参考 http://www.w3school.com.cn/css/css_selector_type.asp
+.. [7] 原文写的是 html5lib, 译者觉得这是原文档的一个笔误
+.. [8] wrap含有包装,打包的意思,但是这里的包装不是在外部包装而是将当前tag的内部内容包装在一个tag里.包装原来内容的新tag依然在执行 `wrap()`_ 方法的tag内
+.. [9] 文档中特殊编码字符被替换成特殊字符(通常是�)的过程是Beautful Soup自动实现的,如果想要多种编码格式的文档被完全转换正确,那么,只好,预先手动处理,统一编码格式
+.. [10] 智能引号,常出现在microsoft的word软件中,即在某一段落中按引号出现的顺序每个引号都被自动转换为左引号,或右引号.
+
+原文: http://www.crummy.com/software/BeautifulSoup/bs4/doc/
+
+翻译: Deron Wang
+
+查看 `BeautifulSoup3 文档`_
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc/Makefile b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc/Makefile
new file mode 100644
index 00000000000..8c833d2cedb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc/Makefile
@@ -0,0 +1,130 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS =
+SPHINXBUILD = sphinx-build
+PAPER =
+BUILDDIR = build
+
+# Internal variables.
+PAPEROPT_a4 = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
+
+help:
+ @echo "Please use \`make <target>' where <target> is one of"
+ @echo " html to make standalone HTML files"
+ @echo " dirhtml to make HTML files named index.html in directories"
+ @echo " singlehtml to make a single large HTML file"
+ @echo " pickle to make pickle files"
+ @echo " json to make JSON files"
+ @echo " htmlhelp to make HTML files and a HTML help project"
+ @echo " qthelp to make HTML files and a qthelp project"
+ @echo " devhelp to make HTML files and a Devhelp project"
+ @echo " epub to make an epub"
+ @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+ @echo " latexpdf to make LaTeX files and run them through pdflatex"
+ @echo " text to make text files"
+ @echo " man to make manual pages"
+ @echo " changes to make an overview of all changed/added/deprecated items"
+ @echo " linkcheck to check all external links for integrity"
+ @echo " doctest to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+ -rm -rf $(BUILDDIR)/*
+
+html:
+ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+ $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+ $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+ @echo
+ @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+ $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+ @echo
+ @echo "Build finished; now you can process the pickle files."
+
+json:
+ $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+ @echo
+ @echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+ $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+ @echo
+ @echo "Build finished; now you can run HTML Help Workshop with the" \
+ ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+ $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+ @echo
+ @echo "Build finished; now you can run "qcollectiongenerator" with the" \
+ ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+ @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/BeautifulSoup.qhcp"
+ @echo "To view the help file:"
+ @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/BeautifulSoup.qhc"
+
+devhelp:
+ $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+ @echo
+ @echo "Build finished."
+ @echo "To view the help file:"
+ @echo "# mkdir -p $$HOME/.local/share/devhelp/BeautifulSoup"
+ @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/BeautifulSoup"
+ @echo "# devhelp"
+
+epub:
+ $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+ @echo
+ @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo
+ @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+ @echo "Run \`make' in that directory to run these through (pdf)latex" \
+ "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo "Running LaTeX files through pdflatex..."
+ make -C $(BUILDDIR)/latex all-pdf
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+ $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+ @echo
+ @echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+ $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+ @echo
+ @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+changes:
+ $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+ @echo
+ @echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+ $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+ @echo
+ @echo "Link check complete; look for any errors in the above output " \
+ "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+ $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+ @echo "Testing of doctests in the sources finished, look at the " \
+ "results in $(BUILDDIR)/doctest/output.txt."
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc/source/6.1.jpg b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc/source/6.1.jpg
new file mode 100644
index 00000000000..97014f0ec04
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc/source/6.1.jpg
Binary files differ
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc/source/check_doc.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc/source/check_doc.py
new file mode 100644
index 00000000000..43c470cb1e0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc/source/check_doc.py
@@ -0,0 +1,28 @@
+from pdb import set_trace
+class Parser(object):
+
+ def __init__(self):
+ self.in_code = False
+ self.code = []
+
+ def parse(self, x):
+ for line in x:
+ self.parse_line(line)
+
+ def parse_line(self, line):
+ line = line[:-1]
+ is_code = False
+ if self.in_code:
+ if line.strip() and not line.startswith(" "):
+ self.in_code = False
+ else:
+ is_code = True
+ elif line.strip().endswith("::"):
+ self.in_code = True
+
+ if is_code:
+ self.code.append(line[1:])
+
+parser = Parser()
+parser.parse(open("index.rst").readlines())
+print("\n".join(parser.code))
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc/source/conf.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc/source/conf.py
new file mode 100644
index 00000000000..7ba53ac96f7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc/source/conf.py
@@ -0,0 +1,256 @@
+# -*- coding: utf-8 -*-
+#
+# Beautiful Soup documentation build configuration file, created by
+# sphinx-quickstart on Thu Jan 26 11:22:55 2012.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration -----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = ['sphinx.ext.autodoc']
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'Beautiful Soup'
+copyright = u'2004-2020, Leonard Richardson'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '4'
+# The full version, including alpha/beta/rc tags.
+release = '4.9.0'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = []
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+html_theme = 'default'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further. For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar. Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'BeautifulSoupdoc'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+ ('index', 'BeautifulSoup.tex', u'Beautiful Soup Documentation',
+ u'Leonard Richardson', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output --------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+ ('index', 'beautifulsoup', u'Beautiful Soup Documentation',
+ [u'Leonard Richardson'], 1)
+]
+
+
+# -- Options for Epub output ---------------------------------------------------
+
+# Bibliographic Dublin Core info.
+epub_title = u'Beautiful Soup'
+epub_author = u'Leonard Richardson'
+epub_publisher = u'Leonard Richardson'
+epub_copyright = u'2012, Leonard Richardson'
+
+# The language of the text. It defaults to the language option
+# or en if the language is not set.
+#epub_language = ''
+
+# The scheme of the identifier. Typical schemes are ISBN or URL.
+#epub_scheme = ''
+
+# The unique identifier of the text. This can be a ISBN number
+# or the project homepage.
+#epub_identifier = ''
+
+# A unique identification for the text.
+#epub_uid = ''
+
+# HTML files that should be inserted before the pages created by sphinx.
+# The format is a list of tuples containing the path and title.
+#epub_pre_files = []
+
+# HTML files shat should be inserted after the pages created by sphinx.
+# The format is a list of tuples containing the path and title.
+#epub_post_files = []
+
+# A list of files that should not be packed into the epub file.
+#epub_exclude_files = []
+
+# The depth of the table of contents in toc.ncx.
+#epub_tocdepth = 3
+
+# Allow duplicate toc entries.
+#epub_tocdup = True
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc/source/index.rst b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc/source/index.rst
new file mode 100644
index 00000000000..34ec7cf79ca
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/doc/source/index.rst
@@ -0,0 +1,3505 @@
+.. _manual:
+
+Beautiful Soup Documentation
+============================
+
+.. image:: 6.1.jpg
+ :align: right
+ :alt: "The Fish-Footman began by producing from under his arm a great letter, nearly as large as himself."
+
+`Beautiful Soup <http://www.crummy.com/software/BeautifulSoup/>`_ is a
+Python library for pulling data out of HTML and XML files. It works
+with your favorite parser to provide idiomatic ways of navigating,
+searching, and modifying the parse tree. It commonly saves programmers
+hours or days of work.
+
+These instructions illustrate all major features of Beautiful Soup 4,
+with examples. I show you what the library is good for, how it works,
+how to use it, how to make it do what you want, and what to do when it
+violates your expectations.
+
+This document covers Beautiful Soup version 4.9.2. The examples in
+this documentation should work the same way in Python 2.7 and Python
+3.8.
+
+You might be looking for the documentation for `Beautiful Soup 3
+<http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html>`_.
+If so, you should know that Beautiful Soup 3 is no longer being
+developed and that support for it will be dropped on or after December
+31, 2020. If you want to learn about the differences between Beautiful
+Soup 3 and Beautiful Soup 4, see `Porting code to BS4`_.
+
+This documentation has been translated into other languages by
+Beautiful Soup users:
+
+* `这篇文档当然还有中文版. <https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/>`_
+* このページは日本語で利用できます(`外部リンク <http://kondou.com/BS4/>`_)
+* `이 문서는 한국어 번역도 가능합니다. <https://www.crummy.com/software/BeautifulSoup/bs4/doc.ko/>`_
+* `Este documento também está disponível em Português do Brasil. <https://www.crummy.com/software/BeautifulSoup/bs4/doc.ptbr>`_
+* `Эта документация доступна на русском языке. <https://www.crummy.com/software/BeautifulSoup/bs4/doc.ru/>`_
+
+Getting help
+------------
+
+If you have questions about Beautiful Soup, or run into problems,
+`send mail to the discussion group
+<https://groups.google.com/forum/?fromgroups#!forum/beautifulsoup>`_. If
+your problem involves parsing an HTML document, be sure to mention
+:ref:`what the diagnose() function says <diagnose>` about
+that document.
+
+Quick Start
+===========
+
+Here's an HTML document I'll be using as an example throughout this
+document. It's part of a story from `Alice in Wonderland`::
+
+ html_doc = """<html><head><title>The Dormouse's story</title></head>
+ <body>
+ <p class="title"><b>The Dormouse's story</b></p>
+
+ <p class="story">Once upon a time there were three little sisters; and their names were
+ <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
+ <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
+ <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
+ and they lived at the bottom of a well.</p>
+
+ <p class="story">...</p>
+ """
+
+Running the "three sisters" document through Beautiful Soup gives us a
+``BeautifulSoup`` object, which represents the document as a nested
+data structure::
+
+ from bs4 import BeautifulSoup
+ soup = BeautifulSoup(html_doc, 'html.parser')
+
+ print(soup.prettify())
+ # <html>
+ # <head>
+ # <title>
+ # The Dormouse's story
+ # </title>
+ # </head>
+ # <body>
+ # <p class="title">
+ # <b>
+ # The Dormouse's story
+ # </b>
+ # </p>
+ # <p class="story">
+ # Once upon a time there were three little sisters; and their names were
+ # <a class="sister" href="http://example.com/elsie" id="link1">
+ # Elsie
+ # </a>
+ # ,
+ # <a class="sister" href="http://example.com/lacie" id="link2">
+ # Lacie
+ # </a>
+ # and
+ # <a class="sister" href="http://example.com/tillie" id="link3">
+ # Tillie
+ # </a>
+ # ; and they lived at the bottom of a well.
+ # </p>
+ # <p class="story">
+ # ...
+ # </p>
+ # </body>
+ # </html>
+
+Here are some simple ways to navigate that data structure::
+
+ soup.title
+ # <title>The Dormouse's story</title>
+
+ soup.title.name
+ # u'title'
+
+ soup.title.string
+ # u'The Dormouse's story'
+
+ soup.title.parent.name
+ # u'head'
+
+ soup.p
+ # <p class="title"><b>The Dormouse's story</b></p>
+
+ soup.p['class']
+ # u'title'
+
+ soup.a
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+ soup.find_all('a')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.find(id="link3")
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
+
+One common task is extracting all the URLs found within a page's <a> tags::
+
+ for link in soup.find_all('a'):
+ print(link.get('href'))
+ # http://example.com/elsie
+ # http://example.com/lacie
+ # http://example.com/tillie
+
+Another common task is extracting all the text from a page::
+
+ print(soup.get_text())
+ # The Dormouse's story
+ #
+ # The Dormouse's story
+ #
+ # Once upon a time there were three little sisters; and their names were
+ # Elsie,
+ # Lacie and
+ # Tillie;
+ # and they lived at the bottom of a well.
+ #
+ # ...
+
+Does this look like what you need? If so, read on.
+
+Installing Beautiful Soup
+=========================
+
+If you're using a recent version of Debian or Ubuntu Linux, you can
+install Beautiful Soup with the system package manager:
+
+:kbd:`$ apt-get install python-bs4` (for Python 2)
+
+:kbd:`$ apt-get install python3-bs4` (for Python 3)
+
+Beautiful Soup 4 is published through PyPi, so if you can't install it
+with the system packager, you can install it with ``easy_install`` or
+``pip``. The package name is ``beautifulsoup4``, and the same package
+works on Python 2 and Python 3. Make sure you use the right version of
+``pip`` or ``easy_install`` for your Python version (these may be named
+``pip3`` and ``easy_install3`` respectively if you're using Python 3).
+
+:kbd:`$ easy_install beautifulsoup4`
+
+:kbd:`$ pip install beautifulsoup4`
+
+(The ``BeautifulSoup`` package is `not` what you want. That's
+the previous major release, `Beautiful Soup 3`_. Lots of software uses
+BS3, so it's still available, but if you're writing new code you
+should install ``beautifulsoup4``.)
+
+If you don't have ``easy_install`` or ``pip`` installed, you can
+`download the Beautiful Soup 4 source tarball
+<http://www.crummy.com/software/BeautifulSoup/download/4.x/>`_ and
+install it with ``setup.py``.
+
+:kbd:`$ python setup.py install`
+
+If all else fails, the license for Beautiful Soup allows you to
+package the entire library with your application. You can download the
+tarball, copy its ``bs4`` directory into your application's codebase,
+and use Beautiful Soup without installing it at all.
+
+I use Python 2.7 and Python 3.8 to develop Beautiful Soup, but it
+should work with other recent versions.
+
+Problems after installation
+---------------------------
+
+Beautiful Soup is packaged as Python 2 code. When you install it for
+use with Python 3, it's automatically converted to Python 3 code. If
+you don't install the package, the code won't be converted. There have
+also been reports on Windows machines of the wrong version being
+installed.
+
+If you get the ``ImportError`` "No module named HTMLParser", your
+problem is that you're running the Python 2 version of the code under
+Python 3.
+
+If you get the ``ImportError`` "No module named html.parser", your
+problem is that you're running the Python 3 version of the code under
+Python 2.
+
+In both cases, your best bet is to completely remove the Beautiful
+Soup installation from your system (including any directory created
+when you unzipped the tarball) and try the installation again.
+
+If you get the ``SyntaxError`` "Invalid syntax" on the line
+``ROOT_TAG_NAME = u'[document]'``, you need to convert the Python 2
+code to Python 3. You can do this either by installing the package:
+
+:kbd:`$ python3 setup.py install`
+
+or by manually running Python's ``2to3`` conversion script on the
+``bs4`` directory:
+
+:kbd:`$ 2to3-3.2 -w bs4`
+
+.. _parser-installation:
+
+
+Installing a parser
+-------------------
+
+Beautiful Soup supports the HTML parser included in Python's standard
+library, but it also supports a number of third-party Python parsers.
+One is the `lxml parser <http://lxml.de/>`_. Depending on your setup,
+you might install lxml with one of these commands:
+
+:kbd:`$ apt-get install python-lxml`
+
+:kbd:`$ easy_install lxml`
+
+:kbd:`$ pip install lxml`
+
+Another alternative is the pure-Python `html5lib parser
+<http://code.google.com/p/html5lib/>`_, which parses HTML the way a
+web browser does. Depending on your setup, you might install html5lib
+with one of these commands:
+
+:kbd:`$ apt-get install python-html5lib`
+
+:kbd:`$ easy_install html5lib`
+
+:kbd:`$ pip install html5lib`
+
+This table summarizes the advantages and disadvantages of each parser library:
+
++----------------------+--------------------------------------------+--------------------------------+--------------------------+
+| Parser | Typical usage | Advantages | Disadvantages |
++----------------------+--------------------------------------------+--------------------------------+--------------------------+
+| Python's html.parser | ``BeautifulSoup(markup, "html.parser")`` | * Batteries included | * Not as fast as lxml, |
+| | | * Decent speed | less lenient than |
+| | | * Lenient (As of Python 2.7.3 | html5lib. |
+| | | and 3.2.) | |
++----------------------+--------------------------------------------+--------------------------------+--------------------------+
+| lxml's HTML parser | ``BeautifulSoup(markup, "lxml")`` | * Very fast | * External C dependency |
+| | | * Lenient | |
++----------------------+--------------------------------------------+--------------------------------+--------------------------+
+| lxml's XML parser | ``BeautifulSoup(markup, "lxml-xml")`` | * Very fast | * External C dependency |
+| | ``BeautifulSoup(markup, "xml")`` | * The only currently supported | |
+| | | XML parser | |
++----------------------+--------------------------------------------+--------------------------------+--------------------------+
+| html5lib | ``BeautifulSoup(markup, "html5lib")`` | * Extremely lenient | * Very slow |
+| | | * Parses pages the same way a | * External Python |
+| | | web browser does | dependency |
+| | | * Creates valid HTML5 | |
++----------------------+--------------------------------------------+--------------------------------+--------------------------+
+
+If you can, I recommend you install and use lxml for speed. If you're
+using a very old version of Python -- earlier than 2.7.3 or 3.2.2 --
+it's `essential` that you install lxml or html5lib. Python's built-in
+HTML parser is just not very good in those old versions.
+
+Note that if a document is invalid, different parsers will generate
+different Beautiful Soup trees for it. See `Differences
+between parsers`_ for details.
+
+Making the soup
+===============
+
+To parse a document, pass it into the ``BeautifulSoup``
+constructor. You can pass in a string or an open filehandle::
+
+ from bs4 import BeautifulSoup
+
+ with open("index.html") as fp:
+ soup = BeautifulSoup(fp, 'html.parser')
+
+ soup = BeautifulSoup("<html>a web page</html>", 'html.parser')
+
+First, the document is converted to Unicode, and HTML entities are
+converted to Unicode characters::
+
+ print(BeautifulSoup("<html><head></head><body>Sacr&eacute; bleu!</body></html>", "html.parser"))
+ # <html><head></head><body>Sacré bleu!</body></html>
+
+Beautiful Soup then parses the document using the best available
+parser. It will use an HTML parser unless you specifically tell it to
+use an XML parser. (See `Parsing XML`_.)
+
+Kinds of objects
+================
+
+Beautiful Soup transforms a complex HTML document into a complex tree
+of Python objects. But you'll only ever have to deal with about four
+`kinds` of objects: ``Tag``, ``NavigableString``, ``BeautifulSoup``,
+and ``Comment``.
+
+.. _Tag:
+
+``Tag``
+-------
+
+A ``Tag`` object corresponds to an XML or HTML tag in the original document::
+
+ soup = BeautifulSoup('<b class="boldest">Extremely bold</b>', 'html.parser')
+ tag = soup.b
+ type(tag)
+ # <class 'bs4.element.Tag'>
+
+Tags have a lot of attributes and methods, and I'll cover most of them
+in `Navigating the tree`_ and `Searching the tree`_. For now, the most
+important features of a tag are its name and attributes.
+
+Name
+^^^^
+
+Every tag has a name, accessible as ``.name``::
+
+ tag.name
+ # 'b'
+
+If you change a tag's name, the change will be reflected in any HTML
+markup generated by Beautiful Soup::
+
+ tag.name = "blockquote"
+ tag
+ # <blockquote class="boldest">Extremely bold</blockquote>
+
+Attributes
+^^^^^^^^^^
+
+A tag may have any number of attributes. The tag ``<b
+id="boldest">`` has an attribute "id" whose value is
+"boldest". You can access a tag's attributes by treating the tag like
+a dictionary::
+
+ tag = BeautifulSoup('<b id="boldest">bold</b>', 'html.parser').b
+ tag['id']
+ # 'boldest'
+
+You can access that dictionary directly as ``.attrs``::
+
+ tag.attrs
+ # {'id': 'boldest'}
+
+You can add, remove, and modify a tag's attributes. Again, this is
+done by treating the tag as a dictionary::
+
+ tag['id'] = 'verybold'
+ tag['another-attribute'] = 1
+ tag
+ # <b another-attribute="1" id="verybold"></b>
+
+ del tag['id']
+ del tag['another-attribute']
+ tag
+ # <b>bold</b>
+
+ tag['id']
+ # KeyError: 'id'
+ tag.get('id')
+ # None
+
+.. _multivalue:
+
+Multi-valued attributes
+&&&&&&&&&&&&&&&&&&&&&&&
+
+HTML 4 defines a few attributes that can have multiple values. HTML 5
+removes a couple of them, but defines a few more. The most common
+multi-valued attribute is ``class`` (that is, a tag can have more than
+one CSS class). Others include ``rel``, ``rev``, ``accept-charset``,
+``headers``, and ``accesskey``. Beautiful Soup presents the value(s)
+of a multi-valued attribute as a list::
+
+ css_soup = BeautifulSoup('<p class="body"></p>', 'html.parser')
+ css_soup.p['class']
+ # ['body']
+
+ css_soup = BeautifulSoup('<p class="body strikeout"></p>', 'html.parser')
+ css_soup.p['class']
+ # ['body', 'strikeout']
+
+If an attribute `looks` like it has more than one value, but it's not
+a multi-valued attribute as defined by any version of the HTML
+standard, Beautiful Soup will leave the attribute alone::
+
+ id_soup = BeautifulSoup('<p id="my id"></p>', 'html.parser')
+ id_soup.p['id']
+ # 'my id'
+
+When you turn a tag back into a string, multiple attribute values are
+consolidated::
+
+ rel_soup = BeautifulSoup('<p>Back to the <a rel="index">homepage</a></p>', 'html.parser')
+ rel_soup.a['rel']
+ # ['index']
+ rel_soup.a['rel'] = ['index', 'contents']
+ print(rel_soup.p)
+ # <p>Back to the <a rel="index contents">homepage</a></p>
+
+You can disable this by passing ``multi_valued_attributes=None`` as a
+keyword argument into the ``BeautifulSoup`` constructor::
+
+ no_list_soup = BeautifulSoup('<p class="body strikeout"></p>', 'html.parser', multi_valued_attributes=None)
+ no_list_soup.p['class']
+ # 'body strikeout'
+
+You can use ```get_attribute_list`` to get a value that's always a
+list, whether or not it's a multi-valued atribute::
+
+ id_soup.p.get_attribute_list('id')
+ # ["my id"]
+
+If you parse a document as XML, there are no multi-valued attributes::
+
+ xml_soup = BeautifulSoup('<p class="body strikeout"></p>', 'xml')
+ xml_soup.p['class']
+ # 'body strikeout'
+
+Again, you can configure this using the ``multi_valued_attributes`` argument::
+
+ class_is_multi= { '*' : 'class'}
+ xml_soup = BeautifulSoup('<p class="body strikeout"></p>', 'xml', multi_valued_attributes=class_is_multi)
+ xml_soup.p['class']
+ # ['body', 'strikeout']
+
+You probably won't need to do this, but if you do, use the defaults as
+a guide. They implement the rules described in the HTML specification::
+
+ from bs4.builder import builder_registry
+ builder_registry.lookup('html').DEFAULT_CDATA_LIST_ATTRIBUTES
+
+
+``NavigableString``
+-------------------
+
+A string corresponds to a bit of text within a tag. Beautiful Soup
+uses the ``NavigableString`` class to contain these bits of text::
+
+ soup = BeautifulSoup('<b class="boldest">Extremely bold</b>', 'html.parser')
+ tag = soup.b
+ tag.string
+ # 'Extremely bold'
+ type(tag.string)
+ # <class 'bs4.element.NavigableString'>
+
+A ``NavigableString`` is just like a Python Unicode string, except
+that it also supports some of the features described in `Navigating
+the tree`_ and `Searching the tree`_. You can convert a
+``NavigableString`` to a Unicode string with ``unicode()`` (in
+Python 2) or ``str`` (in Python 3)::
+
+ unicode_string = str(tag.string)
+ unicode_string
+ # 'Extremely bold'
+ type(unicode_string)
+ # <type 'str'>
+
+You can't edit a string in place, but you can replace one string with
+another, using :ref:`replace_with()`::
+
+ tag.string.replace_with("No longer bold")
+ tag
+ # <b class="boldest">No longer bold</b>
+
+``NavigableString`` supports most of the features described in
+`Navigating the tree`_ and `Searching the tree`_, but not all of
+them. In particular, since a string can't contain anything (the way a
+tag may contain a string or another tag), strings don't support the
+``.contents`` or ``.string`` attributes, or the ``find()`` method.
+
+If you want to use a ``NavigableString`` outside of Beautiful Soup,
+you should call ``unicode()`` on it to turn it into a normal Python
+Unicode string. If you don't, your string will carry around a
+reference to the entire Beautiful Soup parse tree, even when you're
+done using Beautiful Soup. This is a big waste of memory.
+
+``BeautifulSoup``
+-----------------
+
+The ``BeautifulSoup`` object represents the parsed document as a
+whole. For most purposes, you can treat it as a :ref:`Tag`
+object. This means it supports most of the methods described in
+`Navigating the tree`_ and `Searching the tree`_.
+
+You can also pass a ``BeautifulSoup`` object into one of the methods
+defined in `Modifying the tree`_, just as you would a :ref:`Tag`. This
+lets you do things like combine two parsed documents::
+
+ doc = BeautifulSoup("<document><content/>INSERT FOOTER HERE</document", "xml")
+ footer = BeautifulSoup("<footer>Here's the footer</footer>", "xml")
+ doc.find(text="INSERT FOOTER HERE").replace_with(footer)
+ # 'INSERT FOOTER HERE'
+ print(doc)
+ # <?xml version="1.0" encoding="utf-8"?>
+ # <document><content/><footer>Here's the footer</footer></document>
+
+Since the ``BeautifulSoup`` object doesn't correspond to an actual
+HTML or XML tag, it has no name and no attributes. But sometimes it's
+useful to look at its ``.name``, so it's been given the special
+``.name`` "[document]"::
+
+ soup.name
+ # '[document]'
+
+Comments and other special strings
+----------------------------------
+
+``Tag``, ``NavigableString``, and ``BeautifulSoup`` cover almost
+everything you'll see in an HTML or XML file, but there are a few
+leftover bits. The main one you'll probably encounter
+is the comment::
+
+ markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>"
+ soup = BeautifulSoup(markup, 'html.parser')
+ comment = soup.b.string
+ type(comment)
+ # <class 'bs4.element.Comment'>
+
+The ``Comment`` object is just a special type of ``NavigableString``::
+
+ comment
+ # 'Hey, buddy. Want to buy a used parser'
+
+But when it appears as part of an HTML document, a ``Comment`` is
+displayed with special formatting::
+
+ print(soup.b.prettify())
+ # <b>
+ # <!--Hey, buddy. Want to buy a used parser?-->
+ # </b>
+
+Beautiful Soup also defines classes called ``Stylesheet``, ``Script``,
+and ``TemplateString``, for embedded CSS stylesheets (any strings
+found inside a ``<style>`` tag), embedded Javascript (any strings
+found in a ``<script>`` tag), and HTML templates (any strings inside a
+``<template>`` tag). These classes work exactly the same way as
+``NavigableString``; their only purpose is to make it easier to pick
+out the main body of the page, by ignoring strings that represent
+something else. `(These classes are new in Beautiful Soup 4.9.0, and
+the html5lib parser doesn't use them.)`
+
+Beautiful Soup defines classes for anything else that might show up in
+an XML document: ``CData``, ``ProcessingInstruction``,
+``Declaration``, and ``Doctype``. Like ``Comment``, these classes
+are subclasses of ``NavigableString`` that add something extra to the
+string. Here's an example that replaces the comment with a CDATA
+block::
+
+ from bs4 import CData
+ cdata = CData("A CDATA block")
+ comment.replace_with(cdata)
+
+ print(soup.b.prettify())
+ # <b>
+ # <![CDATA[A CDATA block]]>
+ # </b>
+
+
+Navigating the tree
+===================
+
+Here's the "Three sisters" HTML document again::
+
+ html_doc = """
+ <html><head><title>The Dormouse's story</title></head>
+ <body>
+ <p class="title"><b>The Dormouse's story</b></p>
+
+ <p class="story">Once upon a time there were three little sisters; and their names were
+ <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
+ <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
+ <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
+ and they lived at the bottom of a well.</p>
+
+ <p class="story">...</p>
+ """
+
+ from bs4 import BeautifulSoup
+ soup = BeautifulSoup(html_doc, 'html.parser')
+
+I'll use this as an example to show you how to move from one part of
+a document to another.
+
+Going down
+----------
+
+Tags may contain strings and other tags. These elements are the tag's
+`children`. Beautiful Soup provides a lot of different attributes for
+navigating and iterating over a tag's children.
+
+Note that Beautiful Soup strings don't support any of these
+attributes, because a string can't have children.
+
+Navigating using tag names
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The simplest way to navigate the parse tree is to say the name of the
+tag you want. If you want the <head> tag, just say ``soup.head``::
+
+ soup.head
+ # <head><title>The Dormouse's story</title></head>
+
+ soup.title
+ # <title>The Dormouse's story</title>
+
+You can do use this trick again and again to zoom in on a certain part
+of the parse tree. This code gets the first <b> tag beneath the <body> tag::
+
+ soup.body.b
+ # <b>The Dormouse's story</b>
+
+Using a tag name as an attribute will give you only the `first` tag by that
+name::
+
+ soup.a
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+If you need to get `all` the <a> tags, or anything more complicated
+than the first tag with a certain name, you'll need to use one of the
+methods described in `Searching the tree`_, such as `find_all()`::
+
+ soup.find_all('a')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+``.contents`` and ``.children``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+A tag's children are available in a list called ``.contents``::
+
+ head_tag = soup.head
+ head_tag
+ # <head><title>The Dormouse's story</title></head>
+
+ head_tag.contents
+ # [<title>The Dormouse's story</title>]
+
+ title_tag = head_tag.contents[0]
+ title_tag
+ # <title>The Dormouse's story</title>
+ title_tag.contents
+ # ['The Dormouse's story']
+
+The ``BeautifulSoup`` object itself has children. In this case, the
+<html> tag is the child of the ``BeautifulSoup`` object.::
+
+ len(soup.contents)
+ # 1
+ soup.contents[0].name
+ # 'html'
+
+A string does not have ``.contents``, because it can't contain
+anything::
+
+ text = title_tag.contents[0]
+ text.contents
+ # AttributeError: 'NavigableString' object has no attribute 'contents'
+
+Instead of getting them as a list, you can iterate over a tag's
+children using the ``.children`` generator::
+
+ for child in title_tag.children:
+ print(child)
+ # The Dormouse's story
+
+``.descendants``
+^^^^^^^^^^^^^^^^
+
+The ``.contents`` and ``.children`` attributes only consider a tag's
+`direct` children. For instance, the <head> tag has a single direct
+child--the <title> tag::
+
+ head_tag.contents
+ # [<title>The Dormouse's story</title>]
+
+But the <title> tag itself has a child: the string "The Dormouse's
+story". There's a sense in which that string is also a child of the
+<head> tag. The ``.descendants`` attribute lets you iterate over `all`
+of a tag's children, recursively: its direct children, the children of
+its direct children, and so on::
+
+ for child in head_tag.descendants:
+ print(child)
+ # <title>The Dormouse's story</title>
+ # The Dormouse's story
+
+The <head> tag has only one child, but it has two descendants: the
+<title> tag and the <title> tag's child. The ``BeautifulSoup`` object
+only has one direct child (the <html> tag), but it has a whole lot of
+descendants::
+
+ len(list(soup.children))
+ # 1
+ len(list(soup.descendants))
+ # 26
+
+.. _.string:
+
+``.string``
+^^^^^^^^^^^
+
+If a tag has only one child, and that child is a ``NavigableString``,
+the child is made available as ``.string``::
+
+ title_tag.string
+ # 'The Dormouse's story'
+
+If a tag's only child is another tag, and `that` tag has a
+``.string``, then the parent tag is considered to have the same
+``.string`` as its child::
+
+ head_tag.contents
+ # [<title>The Dormouse's story</title>]
+
+ head_tag.string
+ # 'The Dormouse's story'
+
+If a tag contains more than one thing, then it's not clear what
+``.string`` should refer to, so ``.string`` is defined to be
+``None``::
+
+ print(soup.html.string)
+ # None
+
+.. _string-generators:
+
+``.strings`` and ``stripped_strings``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If there's more than one thing inside a tag, you can still look at
+just the strings. Use the ``.strings`` generator::
+
+ for string in soup.strings:
+ print(repr(string))
+ '\n'
+ # "The Dormouse's story"
+ # '\n'
+ # '\n'
+ # "The Dormouse's story"
+ # '\n'
+ # 'Once upon a time there were three little sisters; and their names were\n'
+ # 'Elsie'
+ # ',\n'
+ # 'Lacie'
+ # ' and\n'
+ # 'Tillie'
+ # ';\nand they lived at the bottom of a well.'
+ # '\n'
+ # '...'
+ # '\n'
+
+These strings tend to have a lot of extra whitespace, which you can
+remove by using the ``.stripped_strings`` generator instead::
+
+ for string in soup.stripped_strings:
+ print(repr(string))
+ # "The Dormouse's story"
+ # "The Dormouse's story"
+ # 'Once upon a time there were three little sisters; and their names were'
+ # 'Elsie'
+ # ','
+ # 'Lacie'
+ # 'and'
+ # 'Tillie'
+ # ';\n and they lived at the bottom of a well.'
+ # '...'
+
+Here, strings consisting entirely of whitespace are ignored, and
+whitespace at the beginning and end of strings is removed.
+
+Going up
+--------
+
+Continuing the "family tree" analogy, every tag and every string has a
+`parent`: the tag that contains it.
+
+.. _.parent:
+
+``.parent``
+^^^^^^^^^^^
+
+You can access an element's parent with the ``.parent`` attribute. In
+the example "three sisters" document, the <head> tag is the parent
+of the <title> tag::
+
+ title_tag = soup.title
+ title_tag
+ # <title>The Dormouse's story</title>
+ title_tag.parent
+ # <head><title>The Dormouse's story</title></head>
+
+The title string itself has a parent: the <title> tag that contains
+it::
+
+ title_tag.string.parent
+ # <title>The Dormouse's story</title>
+
+The parent of a top-level tag like <html> is the ``BeautifulSoup`` object
+itself::
+
+ html_tag = soup.html
+ type(html_tag.parent)
+ # <class 'bs4.BeautifulSoup'>
+
+And the ``.parent`` of a ``BeautifulSoup`` object is defined as None::
+
+ print(soup.parent)
+ # None
+
+.. _.parents:
+
+``.parents``
+^^^^^^^^^^^^
+
+You can iterate over all of an element's parents with
+``.parents``. This example uses ``.parents`` to travel from an <a> tag
+buried deep within the document, to the very top of the document::
+
+ link = soup.a
+ link
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+ for parent in link.parents:
+ print(parent.name)
+ # p
+ # body
+ # html
+ # [document]
+
+Going sideways
+--------------
+
+Consider a simple document like this::
+
+ sibling_soup = BeautifulSoup("<a><b>text1</b><c>text2</c></b></a>", 'html.parser')
+ print(sibling_soup.prettify())
+ # <a>
+ # <b>
+ # text1
+ # </b>
+ # <c>
+ # text2
+ # </c>
+ # </a>
+
+The <b> tag and the <c> tag are at the same level: they're both direct
+children of the same tag. We call them `siblings`. When a document is
+pretty-printed, siblings show up at the same indentation level. You
+can also use this relationship in the code you write.
+
+``.next_sibling`` and ``.previous_sibling``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+You can use ``.next_sibling`` and ``.previous_sibling`` to navigate
+between page elements that are on the same level of the parse tree::
+
+ sibling_soup.b.next_sibling
+ # <c>text2</c>
+
+ sibling_soup.c.previous_sibling
+ # <b>text1</b>
+
+The <b> tag has a ``.next_sibling``, but no ``.previous_sibling``,
+because there's nothing before the <b> tag `on the same level of the
+tree`. For the same reason, the <c> tag has a ``.previous_sibling``
+but no ``.next_sibling``::
+
+ print(sibling_soup.b.previous_sibling)
+ # None
+ print(sibling_soup.c.next_sibling)
+ # None
+
+The strings "text1" and "text2" are `not` siblings, because they don't
+have the same parent::
+
+ sibling_soup.b.string
+ # 'text1'
+
+ print(sibling_soup.b.string.next_sibling)
+ # None
+
+In real documents, the ``.next_sibling`` or ``.previous_sibling`` of a
+tag will usually be a string containing whitespace. Going back to the
+"three sisters" document::
+
+ # <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>
+ # <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>
+ # <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>
+
+You might think that the ``.next_sibling`` of the first <a> tag would
+be the second <a> tag. But actually, it's a string: the comma and
+newline that separate the first <a> tag from the second::
+
+ link = soup.a
+ link
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+ link.next_sibling
+ # ',\n '
+
+The second <a> tag is actually the ``.next_sibling`` of the comma::
+
+ link.next_sibling.next_sibling
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>
+
+.. _sibling-generators:
+
+``.next_siblings`` and ``.previous_siblings``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+You can iterate over a tag's siblings with ``.next_siblings`` or
+``.previous_siblings``::
+
+ for sibling in soup.a.next_siblings:
+ print(repr(sibling))
+ # ',\n'
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>
+ # ' and\n'
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
+ # '; and they lived at the bottom of a well.'
+
+ for sibling in soup.find(id="link3").previous_siblings:
+ print(repr(sibling))
+ # ' and\n'
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>
+ # ',\n'
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+ # 'Once upon a time there were three little sisters; and their names were\n'
+
+Going back and forth
+--------------------
+
+Take a look at the beginning of the "three sisters" document::
+
+ # <html><head><title>The Dormouse's story</title></head>
+ # <p class="title"><b>The Dormouse's story</b></p>
+
+An HTML parser takes this string of characters and turns it into a
+series of events: "open an <html> tag", "open a <head> tag", "open a
+<title> tag", "add a string", "close the <title> tag", "open a <p>
+tag", and so on. Beautiful Soup offers tools for reconstructing the
+initial parse of the document.
+
+.. _element-generators:
+
+``.next_element`` and ``.previous_element``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The ``.next_element`` attribute of a string or tag points to whatever
+was parsed immediately afterwards. It might be the same as
+``.next_sibling``, but it's usually drastically different.
+
+Here's the final <a> tag in the "three sisters" document. Its
+``.next_sibling`` is a string: the conclusion of the sentence that was
+interrupted by the start of the <a> tag.::
+
+ last_a_tag = soup.find("a", id="link3")
+ last_a_tag
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
+
+ last_a_tag.next_sibling
+ # ';\nand they lived at the bottom of a well.'
+
+But the ``.next_element`` of that <a> tag, the thing that was parsed
+immediately after the <a> tag, is `not` the rest of that sentence:
+it's the word "Tillie"::
+
+ last_a_tag.next_element
+ # 'Tillie'
+
+That's because in the original markup, the word "Tillie" appeared
+before that semicolon. The parser encountered an <a> tag, then the
+word "Tillie", then the closing </a> tag, then the semicolon and rest of
+the sentence. The semicolon is on the same level as the <a> tag, but the
+word "Tillie" was encountered first.
+
+The ``.previous_element`` attribute is the exact opposite of
+``.next_element``. It points to whatever element was parsed
+immediately before this one::
+
+ last_a_tag.previous_element
+ # ' and\n'
+ last_a_tag.previous_element.next_element
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
+
+``.next_elements`` and ``.previous_elements``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+You should get the idea by now. You can use these iterators to move
+forward or backward in the document as it was parsed::
+
+ for element in last_a_tag.next_elements:
+ print(repr(element))
+ # 'Tillie'
+ # ';\nand they lived at the bottom of a well.'
+ # '\n'
+ # <p class="story">...</p>
+ # '...'
+ # '\n'
+
+Searching the tree
+==================
+
+Beautiful Soup defines a lot of methods for searching the parse tree,
+but they're all very similar. I'm going to spend a lot of time explaining
+the two most popular methods: ``find()`` and ``find_all()``. The other
+methods take almost exactly the same arguments, so I'll just cover
+them briefly.
+
+Once again, I'll be using the "three sisters" document as an example::
+
+ html_doc = """
+ <html><head><title>The Dormouse's story</title></head>
+ <body>
+ <p class="title"><b>The Dormouse's story</b></p>
+
+ <p class="story">Once upon a time there were three little sisters; and their names were
+ <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
+ <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
+ <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
+ and they lived at the bottom of a well.</p>
+
+ <p class="story">...</p>
+ """
+
+ from bs4 import BeautifulSoup
+ soup = BeautifulSoup(html_doc, 'html.parser')
+
+By passing in a filter to an argument like ``find_all()``, you can
+zoom in on the parts of the document you're interested in.
+
+Kinds of filters
+----------------
+
+Before talking in detail about ``find_all()`` and similar methods, I
+want to show examples of different filters you can pass into these
+methods. These filters show up again and again, throughout the
+search API. You can use them to filter based on a tag's name,
+on its attributes, on the text of a string, or on some combination of
+these.
+
+.. _a string:
+
+A string
+^^^^^^^^
+
+The simplest filter is a string. Pass a string to a search method and
+Beautiful Soup will perform a match against that exact string. This
+code finds all the <b> tags in the document::
+
+ soup.find_all('b')
+ # [<b>The Dormouse's story</b>]
+
+If you pass in a byte string, Beautiful Soup will assume the string is
+encoded as UTF-8. You can avoid this by passing in a Unicode string instead.
+
+.. _a regular expression:
+
+A regular expression
+^^^^^^^^^^^^^^^^^^^^
+
+If you pass in a regular expression object, Beautiful Soup will filter
+against that regular expression using its ``search()`` method. This code
+finds all the tags whose names start with the letter "b"; in this
+case, the <body> tag and the <b> tag::
+
+ import re
+ for tag in soup.find_all(re.compile("^b")):
+ print(tag.name)
+ # body
+ # b
+
+This code finds all the tags whose names contain the letter 't'::
+
+ for tag in soup.find_all(re.compile("t")):
+ print(tag.name)
+ # html
+ # title
+
+.. _a list:
+
+A list
+^^^^^^
+
+If you pass in a list, Beautiful Soup will allow a string match
+against `any` item in that list. This code finds all the <a> tags
+`and` all the <b> tags::
+
+ soup.find_all(["a", "b"])
+ # [<b>The Dormouse's story</b>,
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+.. _the value True:
+
+``True``
+^^^^^^^^
+
+The value ``True`` matches everything it can. This code finds `all`
+the tags in the document, but none of the text strings::
+
+ for tag in soup.find_all(True):
+ print(tag.name)
+ # html
+ # head
+ # title
+ # body
+ # p
+ # b
+ # p
+ # a
+ # a
+ # a
+ # p
+
+.. a function:
+
+A function
+^^^^^^^^^^
+
+If none of the other matches work for you, define a function that
+takes an element as its only argument. The function should return
+``True`` if the argument matches, and ``False`` otherwise.
+
+Here's a function that returns ``True`` if a tag defines the "class"
+attribute but doesn't define the "id" attribute::
+
+ def has_class_but_no_id(tag):
+ return tag.has_attr('class') and not tag.has_attr('id')
+
+Pass this function into ``find_all()`` and you'll pick up all the <p>
+tags::
+
+ soup.find_all(has_class_but_no_id)
+ # [<p class="title"><b>The Dormouse's story</b></p>,
+ # <p class="story">Once upon a time there were…bottom of a well.</p>,
+ # <p class="story">...</p>]
+
+This function only picks up the <p> tags. It doesn't pick up the <a>
+tags, because those tags define both "class" and "id". It doesn't pick
+up tags like <html> and <title>, because those tags don't define
+"class".
+
+If you pass in a function to filter on a specific attribute like
+``href``, the argument passed into the function will be the attribute
+value, not the whole tag. Here's a function that finds all ``a`` tags
+whose ``href`` attribute *does not* match a regular expression::
+
+ import re
+ def not_lacie(href):
+ return href and not re.compile("lacie").search(href)
+
+ soup.find_all(href=not_lacie)
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+The function can be as complicated as you need it to be. Here's a
+function that returns ``True`` if a tag is surrounded by string
+objects::
+
+ from bs4 import NavigableString
+ def surrounded_by_strings(tag):
+ return (isinstance(tag.next_element, NavigableString)
+ and isinstance(tag.previous_element, NavigableString))
+
+ for tag in soup.find_all(surrounded_by_strings):
+ print(tag.name)
+ # body
+ # p
+ # a
+ # a
+ # a
+ # p
+
+Now we're ready to look at the search methods in detail.
+
+``find_all()``
+--------------
+
+Method signature: find_all(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`recursive
+<recursive>`, :ref:`string <string>`, :ref:`limit <limit>`, :ref:`**kwargs <kwargs>`)
+
+The ``find_all()`` method looks through a tag's descendants and
+retrieves `all` descendants that match your filters. I gave several
+examples in `Kinds of filters`_, but here are a few more::
+
+ soup.find_all("title")
+ # [<title>The Dormouse's story</title>]
+
+ soup.find_all("p", "title")
+ # [<p class="title"><b>The Dormouse's story</b></p>]
+
+ soup.find_all("a")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.find_all(id="link2")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+ import re
+ soup.find(string=re.compile("sisters"))
+ # 'Once upon a time there were three little sisters; and their names were\n'
+
+Some of these should look familiar, but others are new. What does it
+mean to pass in a value for ``string``, or ``id``? Why does
+``find_all("p", "title")`` find a <p> tag with the CSS class "title"?
+Let's look at the arguments to ``find_all()``.
+
+.. _name:
+
+The ``name`` argument
+^^^^^^^^^^^^^^^^^^^^^
+
+Pass in a value for ``name`` and you'll tell Beautiful Soup to only
+consider tags with certain names. Text strings will be ignored, as
+will tags whose names that don't match.
+
+This is the simplest usage::
+
+ soup.find_all("title")
+ # [<title>The Dormouse's story</title>]
+
+Recall from `Kinds of filters`_ that the value to ``name`` can be `a
+string`_, `a regular expression`_, `a list`_, `a function`_, or `the value
+True`_.
+
+.. _kwargs:
+
+The keyword arguments
+^^^^^^^^^^^^^^^^^^^^^
+
+Any argument that's not recognized will be turned into a filter on one
+of a tag's attributes. If you pass in a value for an argument called ``id``,
+Beautiful Soup will filter against each tag's 'id' attribute::
+
+ soup.find_all(id='link2')
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+If you pass in a value for ``href``, Beautiful Soup will filter
+against each tag's 'href' attribute::
+
+ soup.find_all(href=re.compile("elsie"))
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+You can filter an attribute based on `a string`_, `a regular
+expression`_, `a list`_, `a function`_, or `the value True`_.
+
+This code finds all tags whose ``id`` attribute has a value,
+regardless of what the value is::
+
+ soup.find_all(id=True)
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+You can filter multiple attributes at once by passing in more than one
+keyword argument::
+
+ soup.find_all(href=re.compile("elsie"), id='link1')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+Some attributes, like the data-* attributes in HTML 5, have names that
+can't be used as the names of keyword arguments::
+
+ data_soup = BeautifulSoup('<div data-foo="value">foo!</div>', 'html.parser')
+ data_soup.find_all(data-foo="value")
+ # SyntaxError: keyword can't be an expression
+
+You can use these attributes in searches by putting them into a
+dictionary and passing the dictionary into ``find_all()`` as the
+``attrs`` argument::
+
+ data_soup.find_all(attrs={"data-foo": "value"})
+ # [<div data-foo="value">foo!</div>]
+
+You can't use a keyword argument to search for HTML's 'name' element,
+because Beautiful Soup uses the ``name`` argument to contain the name
+of the tag itself. Instead, you can give a value to 'name' in the
+``attrs`` argument::
+
+ name_soup = BeautifulSoup('<input name="email"/>', 'html.parser')
+ name_soup.find_all(name="email")
+ # []
+ name_soup.find_all(attrs={"name": "email"})
+ # [<input name="email"/>]
+
+.. _attrs:
+
+Searching by CSS class
+^^^^^^^^^^^^^^^^^^^^^^
+
+It's very useful to search for a tag that has a certain CSS class, but
+the name of the CSS attribute, "class", is a reserved word in
+Python. Using ``class`` as a keyword argument will give you a syntax
+error. As of Beautiful Soup 4.1.2, you can search by CSS class using
+the keyword argument ``class_``::
+
+ soup.find_all("a", class_="sister")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+As with any keyword argument, you can pass ``class_`` a string, a regular
+expression, a function, or ``True``::
+
+ soup.find_all(class_=re.compile("itl"))
+ # [<p class="title"><b>The Dormouse's story</b></p>]
+
+ def has_six_characters(css_class):
+ return css_class is not None and len(css_class) == 6
+
+ soup.find_all(class_=has_six_characters)
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+:ref:`Remember <multivalue>` that a single tag can have multiple
+values for its "class" attribute. When you search for a tag that
+matches a certain CSS class, you're matching against `any` of its CSS
+classes::
+
+ css_soup = BeautifulSoup('<p class="body strikeout"></p>', 'html.parser')
+ css_soup.find_all("p", class_="strikeout")
+ # [<p class="body strikeout"></p>]
+
+ css_soup.find_all("p", class_="body")
+ # [<p class="body strikeout"></p>]
+
+You can also search for the exact string value of the ``class`` attribute::
+
+ css_soup.find_all("p", class_="body strikeout")
+ # [<p class="body strikeout"></p>]
+
+But searching for variants of the string value won't work::
+
+ css_soup.find_all("p", class_="strikeout body")
+ # []
+
+If you want to search for tags that match two or more CSS classes, you
+should use a CSS selector::
+
+ css_soup.select("p.strikeout.body")
+ # [<p class="body strikeout"></p>]
+
+In older versions of Beautiful Soup, which don't have the ``class_``
+shortcut, you can use the ``attrs`` trick mentioned above. Create a
+dictionary whose value for "class" is the string (or regular
+expression, or whatever) you want to search for::
+
+ soup.find_all("a", attrs={"class": "sister"})
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+.. _string:
+
+The ``string`` argument
+^^^^^^^^^^^^^^^^^^^^^^^
+
+With ``string`` you can search for strings instead of tags. As with
+``name`` and the keyword arguments, you can pass in `a string`_, `a
+regular expression`_, `a list`_, `a function`_, or `the value True`_.
+Here are some examples::
+
+ soup.find_all(string="Elsie")
+ # ['Elsie']
+
+ soup.find_all(string=["Tillie", "Elsie", "Lacie"])
+ # ['Elsie', 'Lacie', 'Tillie']
+
+ soup.find_all(string=re.compile("Dormouse"))
+ # ["The Dormouse's story", "The Dormouse's story"]
+
+ def is_the_only_string_within_a_tag(s):
+ """Return True if this string is the only child of its parent tag."""
+ return (s == s.parent.string)
+
+ soup.find_all(string=is_the_only_string_within_a_tag)
+ # ["The Dormouse's story", "The Dormouse's story", 'Elsie', 'Lacie', 'Tillie', '...']
+
+Although ``string`` is for finding strings, you can combine it with
+arguments that find tags: Beautiful Soup will find all tags whose
+``.string`` matches your value for ``string``. This code finds the <a>
+tags whose ``.string`` is "Elsie"::
+
+ soup.find_all("a", string="Elsie")
+ # [<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>]
+
+The ``string`` argument is new in Beautiful Soup 4.4.0. In earlier
+versions it was called ``text``::
+
+ soup.find_all("a", text="Elsie")
+ # [<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>]
+
+.. _limit:
+
+The ``limit`` argument
+^^^^^^^^^^^^^^^^^^^^^^
+
+``find_all()`` returns all the tags and strings that match your
+filters. This can take a while if the document is large. If you don't
+need `all` the results, you can pass in a number for ``limit``. This
+works just like the LIMIT keyword in SQL. It tells Beautiful Soup to
+stop gathering results after it's found a certain number.
+
+There are three links in the "three sisters" document, but this code
+only finds the first two::
+
+ soup.find_all("a", limit=2)
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+.. _recursive:
+
+The ``recursive`` argument
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If you call ``mytag.find_all()``, Beautiful Soup will examine all the
+descendants of ``mytag``: its children, its children's children, and
+so on. If you only want Beautiful Soup to consider direct children,
+you can pass in ``recursive=False``. See the difference here::
+
+ soup.html.find_all("title")
+ # [<title>The Dormouse's story</title>]
+
+ soup.html.find_all("title", recursive=False)
+ # []
+
+Here's that part of the document::
+
+ <html>
+ <head>
+ <title>
+ The Dormouse's story
+ </title>
+ </head>
+ ...
+
+The <title> tag is beneath the <html> tag, but it's not `directly`
+beneath the <html> tag: the <head> tag is in the way. Beautiful Soup
+finds the <title> tag when it's allowed to look at all descendants of
+the <html> tag, but when ``recursive=False`` restricts it to the
+<html> tag's immediate children, it finds nothing.
+
+Beautiful Soup offers a lot of tree-searching methods (covered below),
+and they mostly take the same arguments as ``find_all()``: ``name``,
+``attrs``, ``string``, ``limit``, and the keyword arguments. But the
+``recursive`` argument is different: ``find_all()`` and ``find()`` are
+the only methods that support it. Passing ``recursive=False`` into a
+method like ``find_parents()`` wouldn't be very useful.
+
+Calling a tag is like calling ``find_all()``
+--------------------------------------------
+
+Because ``find_all()`` is the most popular method in the Beautiful
+Soup search API, you can use a shortcut for it. If you treat the
+``BeautifulSoup`` object or a ``Tag`` object as though it were a
+function, then it's the same as calling ``find_all()`` on that
+object. These two lines of code are equivalent::
+
+ soup.find_all("a")
+ soup("a")
+
+These two lines are also equivalent::
+
+ soup.title.find_all(string=True)
+ soup.title(string=True)
+
+``find()``
+----------
+
+Method signature: find(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`recursive
+<recursive>`, :ref:`string <string>`, :ref:`**kwargs <kwargs>`)
+
+The ``find_all()`` method scans the entire document looking for
+results, but sometimes you only want to find one result. If you know a
+document only has one <body> tag, it's a waste of time to scan the
+entire document looking for more. Rather than passing in ``limit=1``
+every time you call ``find_all``, you can use the ``find()``
+method. These two lines of code are `nearly` equivalent::
+
+ soup.find_all('title', limit=1)
+ # [<title>The Dormouse's story</title>]
+
+ soup.find('title')
+ # <title>The Dormouse's story</title>
+
+The only difference is that ``find_all()`` returns a list containing
+the single result, and ``find()`` just returns the result.
+
+If ``find_all()`` can't find anything, it returns an empty list. If
+``find()`` can't find anything, it returns ``None``::
+
+ print(soup.find("nosuchtag"))
+ # None
+
+Remember the ``soup.head.title`` trick from `Navigating using tag
+names`_? That trick works by repeatedly calling ``find()``::
+
+ soup.head.title
+ # <title>The Dormouse's story</title>
+
+ soup.find("head").find("title")
+ # <title>The Dormouse's story</title>
+
+``find_parents()`` and ``find_parent()``
+----------------------------------------
+
+Method signature: find_parents(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`limit <limit>`, :ref:`**kwargs <kwargs>`)
+
+Method signature: find_parent(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`**kwargs <kwargs>`)
+
+I spent a lot of time above covering ``find_all()`` and
+``find()``. The Beautiful Soup API defines ten other methods for
+searching the tree, but don't be afraid. Five of these methods are
+basically the same as ``find_all()``, and the other five are basically
+the same as ``find()``. The only differences are in what parts of the
+tree they search.
+
+First let's consider ``find_parents()`` and
+``find_parent()``. Remember that ``find_all()`` and ``find()`` work
+their way down the tree, looking at tag's descendants. These methods
+do the opposite: they work their way `up` the tree, looking at a tag's
+(or a string's) parents. Let's try them out, starting from a string
+buried deep in the "three daughters" document::
+
+ a_string = soup.find(string="Lacie")
+ a_string
+ # 'Lacie'
+
+ a_string.find_parents("a")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+ a_string.find_parent("p")
+ # <p class="story">Once upon a time there were three little sisters; and their names were
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> and
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>;
+ # and they lived at the bottom of a well.</p>
+
+ a_string.find_parents("p", class_="title")
+ # []
+
+One of the three <a> tags is the direct parent of the string in
+question, so our search finds it. One of the three <p> tags is an
+indirect parent of the string, and our search finds that as
+well. There's a <p> tag with the CSS class "title" `somewhere` in the
+document, but it's not one of this string's parents, so we can't find
+it with ``find_parents()``.
+
+You may have made the connection between ``find_parent()`` and
+``find_parents()``, and the `.parent`_ and `.parents`_ attributes
+mentioned earlier. The connection is very strong. These search methods
+actually use ``.parents`` to iterate over all the parents, and check
+each one against the provided filter to see if it matches.
+
+``find_next_siblings()`` and ``find_next_sibling()``
+----------------------------------------------------
+
+Method signature: find_next_siblings(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`limit <limit>`, :ref:`**kwargs <kwargs>`)
+
+Method signature: find_next_sibling(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`**kwargs <kwargs>`)
+
+These methods use :ref:`.next_siblings <sibling-generators>` to
+iterate over the rest of an element's siblings in the tree. The
+``find_next_siblings()`` method returns all the siblings that match,
+and ``find_next_sibling()`` only returns the first one::
+
+ first_link = soup.a
+ first_link
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+ first_link.find_next_siblings("a")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ first_story_paragraph = soup.find("p", "story")
+ first_story_paragraph.find_next_sibling("p")
+ # <p class="story">...</p>
+
+``find_previous_siblings()`` and ``find_previous_sibling()``
+------------------------------------------------------------
+
+Method signature: find_previous_siblings(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`limit <limit>`, :ref:`**kwargs <kwargs>`)
+
+Method signature: find_previous_sibling(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`**kwargs <kwargs>`)
+
+These methods use :ref:`.previous_siblings <sibling-generators>` to iterate over an element's
+siblings that precede it in the tree. The ``find_previous_siblings()``
+method returns all the siblings that match, and
+``find_previous_sibling()`` only returns the first one::
+
+ last_link = soup.find("a", id="link3")
+ last_link
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
+
+ last_link.find_previous_siblings("a")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+ first_story_paragraph = soup.find("p", "story")
+ first_story_paragraph.find_previous_sibling("p")
+ # <p class="title"><b>The Dormouse's story</b></p>
+
+
+``find_all_next()`` and ``find_next()``
+---------------------------------------
+
+Method signature: find_all_next(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`limit <limit>`, :ref:`**kwargs <kwargs>`)
+
+Method signature: find_next(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`**kwargs <kwargs>`)
+
+These methods use :ref:`.next_elements <element-generators>` to
+iterate over whatever tags and strings that come after it in the
+document. The ``find_all_next()`` method returns all matches, and
+``find_next()`` only returns the first match::
+
+ first_link = soup.a
+ first_link
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+ first_link.find_all_next(string=True)
+ # ['Elsie', ',\n', 'Lacie', ' and\n', 'Tillie',
+ # ';\nand they lived at the bottom of a well.', '\n', '...', '\n']
+
+ first_link.find_next("p")
+ # <p class="story">...</p>
+
+In the first example, the string "Elsie" showed up, even though it was
+contained within the <a> tag we started from. In the second example,
+the last <p> tag in the document showed up, even though it's not in
+the same part of the tree as the <a> tag we started from. For these
+methods, all that matters is that an element match the filter, and
+show up later in the document than the starting element.
+
+``find_all_previous()`` and ``find_previous()``
+-----------------------------------------------
+
+Method signature: find_all_previous(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`limit <limit>`, :ref:`**kwargs <kwargs>`)
+
+Method signature: find_previous(:ref:`name <name>`, :ref:`attrs <attrs>`, :ref:`string <string>`, :ref:`**kwargs <kwargs>`)
+
+These methods use :ref:`.previous_elements <element-generators>` to
+iterate over the tags and strings that came before it in the
+document. The ``find_all_previous()`` method returns all matches, and
+``find_previous()`` only returns the first match::
+
+ first_link = soup.a
+ first_link
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+ first_link.find_all_previous("p")
+ # [<p class="story">Once upon a time there were three little sisters; ...</p>,
+ # <p class="title"><b>The Dormouse's story</b></p>]
+
+ first_link.find_previous("title")
+ # <title>The Dormouse's story</title>
+
+The call to ``find_all_previous("p")`` found the first paragraph in
+the document (the one with class="title"), but it also finds the
+second paragraph, the <p> tag that contains the <a> tag we started
+with. This shouldn't be too surprising: we're looking at all the tags
+that show up earlier in the document than the one we started with. A
+<p> tag that contains an <a> tag must have shown up before the <a>
+tag it contains.
+
+CSS selectors
+-------------
+
+``BeautifulSoup`` has a ``.select()`` method which uses the `SoupSieve
+<https://facelessuser.github.io/soupsieve/>`_ package to run a CSS
+selector against a parsed document and return all the matching
+elements. ``Tag`` has a similar method which runs a CSS selector
+against the contents of a single tag.
+
+(The SoupSieve integration was added in Beautiful Soup 4.7.0. Earlier
+versions also have the ``.select()`` method, but only the most
+commonly-used CSS selectors are supported. If you installed Beautiful
+Soup through ``pip``, SoupSieve was installed at the same time, so you
+don't have to do anything extra.)
+
+The SoupSieve `documentation
+<https://facelessuser.github.io/soupsieve/>`_ lists all the currently
+supported CSS selectors, but here are some of the basics:
+
+You can find tags::
+
+ soup.select("title")
+ # [<title>The Dormouse's story</title>]
+
+ soup.select("p:nth-of-type(3)")
+ # [<p class="story">...</p>]
+
+Find tags beneath other tags::
+
+ soup.select("body a")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select("html head title")
+ # [<title>The Dormouse's story</title>]
+
+Find tags `directly` beneath other tags::
+
+ soup.select("head > title")
+ # [<title>The Dormouse's story</title>]
+
+ soup.select("p > a")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select("p > a:nth-of-type(2)")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+ soup.select("p > #link1")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+ soup.select("body > a")
+ # []
+
+Find the siblings of tags::
+
+ soup.select("#link1 ~ .sister")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select("#link1 + .sister")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+Find tags by CSS class::
+
+ soup.select(".sister")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select("[class~=sister]")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+Find tags by ID::
+
+ soup.select("#link1")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+ soup.select("a#link2")
+ # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+Find tags that match any selector from a list of selectors::
+
+ soup.select("#link1,#link2")
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
+
+Test for the existence of an attribute::
+
+ soup.select('a[href]')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+Find tags by attribute value::
+
+ soup.select('a[href="http://example.com/elsie"]')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+ soup.select('a[href^="http://example.com/"]')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
+ # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
+ # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select('a[href$="tillie"]')
+ # [<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
+
+ soup.select('a[href*=".com/el"]')
+ # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
+
+There's also a method called ``select_one()``, which finds only the
+first tag that matches a selector::
+
+ soup.select_one(".sister")
+ # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
+
+If you've parsed XML that defines namespaces, you can use them in CSS
+selectors.::
+
+ from bs4 import BeautifulSoup
+ xml = """<tag xmlns:ns1="http://namespace1/" xmlns:ns2="http://namespace2/">
+ <ns1:child>I'm in namespace 1</ns1:child>
+ <ns2:child>I'm in namespace 2</ns2:child>
+ </tag> """
+ soup = BeautifulSoup(xml, "xml")
+
+ soup.select("child")
+ # [<ns1:child>I'm in namespace 1</ns1:child>, <ns2:child>I'm in namespace 2</ns2:child>]
+
+ soup.select("ns1|child", namespaces=soup.namespaces)
+ # [<ns1:child>I'm in namespace 1</ns1:child>]
+
+When handling a CSS selector that uses namespaces, Beautiful Soup
+uses the namespace abbreviations it found when parsing the
+document. You can override this by passing in your own dictionary of
+abbreviations::
+
+ namespaces = dict(first="http://namespace1/", second="http://namespace2/")
+ soup.select("second|child", namespaces=namespaces)
+ # [<ns1:child>I'm in namespace 2</ns1:child>]
+
+All this CSS selector stuff is a convenience for people who already
+know the CSS selector syntax. You can do all of this with the
+Beautiful Soup API. And if CSS selectors are all you need, you should
+parse the document with lxml: it's a lot faster. But this lets you
+`combine` CSS selectors with the Beautiful Soup API.
+
+Modifying the tree
+==================
+
+Beautiful Soup's main strength is in searching the parse tree, but you
+can also modify the tree and write your changes as a new HTML or XML
+document.
+
+Changing tag names and attributes
+---------------------------------
+
+I covered this earlier, in `Attributes`_, but it bears repeating. You
+can rename a tag, change the values of its attributes, add new
+attributes, and delete attributes::
+
+ soup = BeautifulSoup('<b class="boldest">Extremely bold</b>', 'html.parser')
+ tag = soup.b
+
+ tag.name = "blockquote"
+ tag['class'] = 'verybold'
+ tag['id'] = 1
+ tag
+ # <blockquote class="verybold" id="1">Extremely bold</blockquote>
+
+ del tag['class']
+ del tag['id']
+ tag
+ # <blockquote>Extremely bold</blockquote>
+
+Modifying ``.string``
+---------------------
+
+If you set a tag's ``.string`` attribute to a new string, the tag's contents are
+replaced with that string::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup, 'html.parser')
+
+ tag = soup.a
+ tag.string = "New link text."
+ tag
+ # <a href="http://example.com/">New link text.</a>
+
+Be careful: if the tag contained other tags, they and all their
+contents will be destroyed.
+
+``append()``
+------------
+
+You can add to a tag's contents with ``Tag.append()``. It works just
+like calling ``.append()`` on a Python list::
+
+ soup = BeautifulSoup("<a>Foo</a>", 'html.parser')
+ soup.a.append("Bar")
+
+ soup
+ # <a>FooBar</a>
+ soup.a.contents
+ # ['Foo', 'Bar']
+
+``extend()``
+------------
+
+Starting in Beautiful Soup 4.7.0, ``Tag`` also supports a method
+called ``.extend()``, which adds every element of a list to a ``Tag``,
+in order::
+
+ soup = BeautifulSoup("<a>Soup</a>", 'html.parser')
+ soup.a.extend(["'s", " ", "on"])
+
+ soup
+ # <a>Soup's on</a>
+ soup.a.contents
+ # ['Soup', ''s', ' ', 'on']
+
+``NavigableString()`` and ``.new_tag()``
+-------------------------------------------------
+
+If you need to add a string to a document, no problem--you can pass a
+Python string in to ``append()``, or you can call the ``NavigableString``
+constructor::
+
+ soup = BeautifulSoup("<b></b>", 'html.parser')
+ tag = soup.b
+ tag.append("Hello")
+ new_string = NavigableString(" there")
+ tag.append(new_string)
+ tag
+ # <b>Hello there.</b>
+ tag.contents
+ # ['Hello', ' there']
+
+If you want to create a comment or some other subclass of
+``NavigableString``, just call the constructor::
+
+ from bs4 import Comment
+ new_comment = Comment("Nice to see you.")
+ tag.append(new_comment)
+ tag
+ # <b>Hello there<!--Nice to see you.--></b>
+ tag.contents
+ # ['Hello', ' there', 'Nice to see you.']
+
+`(This is a new feature in Beautiful Soup 4.4.0.)`
+
+What if you need to create a whole new tag? The best solution is to
+call the factory method ``BeautifulSoup.new_tag()``::
+
+ soup = BeautifulSoup("<b></b>", 'html.parser')
+ original_tag = soup.b
+
+ new_tag = soup.new_tag("a", href="http://www.example.com")
+ original_tag.append(new_tag)
+ original_tag
+ # <b><a href="http://www.example.com"></a></b>
+
+ new_tag.string = "Link text."
+ original_tag
+ # <b><a href="http://www.example.com">Link text.</a></b>
+
+Only the first argument, the tag name, is required.
+
+``insert()``
+------------
+
+``Tag.insert()`` is just like ``Tag.append()``, except the new element
+doesn't necessarily go at the end of its parent's
+``.contents``. It'll be inserted at whatever numeric position you
+say. It works just like ``.insert()`` on a Python list::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup, 'html.parser')
+ tag = soup.a
+
+ tag.insert(1, "but did not endorse ")
+ tag
+ # <a href="http://example.com/">I linked to but did not endorse <i>example.com</i></a>
+ tag.contents
+ # ['I linked to ', 'but did not endorse', <i>example.com</i>]
+
+``insert_before()`` and ``insert_after()``
+------------------------------------------
+
+The ``insert_before()`` method inserts tags or strings immediately
+before something else in the parse tree::
+
+ soup = BeautifulSoup("<b>leave</b>", 'html.parser')
+ tag = soup.new_tag("i")
+ tag.string = "Don't"
+ soup.b.string.insert_before(tag)
+ soup.b
+ # <b><i>Don't</i>leave</b>
+
+The ``insert_after()`` method inserts tags or strings immediately
+following something else in the parse tree::
+
+ div = soup.new_tag('div')
+ div.string = 'ever'
+ soup.b.i.insert_after(" you ", div)
+ soup.b
+ # <b><i>Don't</i> you <div>ever</div> leave</b>
+ soup.b.contents
+ # [<i>Don't</i>, ' you', <div>ever</div>, 'leave']
+
+``clear()``
+-----------
+
+``Tag.clear()`` removes the contents of a tag::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup, 'html.parser')
+ tag = soup.a
+
+ tag.clear()
+ tag
+ # <a href="http://example.com/"></a>
+
+``extract()``
+-------------
+
+``PageElement.extract()`` removes a tag or string from the tree. It
+returns the tag or string that was extracted::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup, 'html.parser')
+ a_tag = soup.a
+
+ i_tag = soup.i.extract()
+
+ a_tag
+ # <a href="http://example.com/">I linked to</a>
+
+ i_tag
+ # <i>example.com</i>
+
+ print(i_tag.parent)
+ # None
+
+At this point you effectively have two parse trees: one rooted at the
+``BeautifulSoup`` object you used to parse the document, and one rooted
+at the tag that was extracted. You can go on to call ``extract`` on
+a child of the element you extracted::
+
+ my_string = i_tag.string.extract()
+ my_string
+ # 'example.com'
+
+ print(my_string.parent)
+ # None
+ i_tag
+ # <i></i>
+
+
+``decompose()``
+---------------
+
+``Tag.decompose()`` removes a tag from the tree, then `completely
+destroys it and its contents`::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup, 'html.parser')
+ a_tag = soup.a
+ i_tag = soup.i
+
+ i_tag.decompose()
+ a_tag
+ # <a href="http://example.com/">I linked to</a>
+
+The behavior of a decomposed ``Tag`` or ``NavigableString`` is not
+defined and you should not use it for anything. If you're not sure
+whether something has been decomposed, you can check its
+``.decomposed`` property `(new in Beautiful Soup 4.9.0)`::
+
+ i_tag.decomposed
+ # True
+
+ a_tag.decomposed
+ # False
+
+
+.. _replace_with():
+
+``replace_with()``
+------------------
+
+``PageElement.replace_with()`` removes a tag or string from the tree,
+and replaces it with the tag or string of your choice::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup, 'html.parser')
+ a_tag = soup.a
+
+ new_tag = soup.new_tag("b")
+ new_tag.string = "example.net"
+ a_tag.i.replace_with(new_tag)
+
+ a_tag
+ # <a href="http://example.com/">I linked to <b>example.net</b></a>
+
+``replace_with()`` returns the tag or string that was replaced, so
+that you can examine it or add it back to another part of the tree.
+
+``wrap()``
+----------
+
+``PageElement.wrap()`` wraps an element in the tag you specify. It
+returns the new wrapper::
+
+ soup = BeautifulSoup("<p>I wish I was bold.</p>", 'html.parser')
+ soup.p.string.wrap(soup.new_tag("b"))
+ # <b>I wish I was bold.</b>
+
+ soup.p.wrap(soup.new_tag("div"))
+ # <div><p><b>I wish I was bold.</b></p></div>
+
+This method is new in Beautiful Soup 4.0.5.
+
+``unwrap()``
+---------------------------
+
+``Tag.unwrap()`` is the opposite of ``wrap()``. It replaces a tag with
+whatever's inside that tag. It's good for stripping out markup::
+
+ markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup, 'html.parser')
+ a_tag = soup.a
+
+ a_tag.i.unwrap()
+ a_tag
+ # <a href="http://example.com/">I linked to example.com</a>
+
+Like ``replace_with()``, ``unwrap()`` returns the tag
+that was replaced.
+
+``smooth()``
+---------------------------
+
+After calling a bunch of methods that modify the parse tree, you may end up with two or more ``NavigableString`` objects next to each other. Beautiful Soup doesn't have any problems with this, but since it can't happen in a freshly parsed document, you might not expect behavior like the following::
+
+ soup = BeautifulSoup("<p>A one</p>", 'html.parser')
+ soup.p.append(", a two")
+
+ soup.p.contents
+ # ['A one', ', a two']
+
+ print(soup.p.encode())
+ # b'<p>A one, a two</p>'
+
+ print(soup.p.prettify())
+ # <p>
+ # A one
+ # , a two
+ # </p>
+
+You can call ``Tag.smooth()`` to clean up the parse tree by consolidating adjacent strings::
+
+ soup.smooth()
+
+ soup.p.contents
+ # ['A one, a two']
+
+ print(soup.p.prettify())
+ # <p>
+ # A one, a two
+ # </p>
+
+The ``smooth()`` method is new in Beautiful Soup 4.8.0.
+
+Output
+======
+
+.. _.prettyprinting:
+
+Pretty-printing
+---------------
+
+The ``prettify()`` method will turn a Beautiful Soup parse tree into a
+nicely formatted Unicode string, with a separate line for each
+tag and each string::
+
+ markup = '<html><head><body><a href="http://example.com/">I linked to <i>example.com</i></a>'
+ soup = BeautifulSoup(markup, 'html.parser')
+ soup.prettify()
+ # '<html>\n <head>\n </head>\n <body>\n <a href="http://example.com/">\n...'
+
+ print(soup.prettify())
+ # <html>
+ # <head>
+ # </head>
+ # <body>
+ # <a href="http://example.com/">
+ # I linked to
+ # <i>
+ # example.com
+ # </i>
+ # </a>
+ # </body>
+ # </html>
+
+You can call ``prettify()`` on the top-level ``BeautifulSoup`` object,
+or on any of its ``Tag`` objects::
+
+ print(soup.a.prettify())
+ # <a href="http://example.com/">
+ # I linked to
+ # <i>
+ # example.com
+ # </i>
+ # </a>
+
+Since it adds whitespace (in the form of newlines), ``prettify()``
+changes the meaning of an HTML document and should not be used to
+reformat one. The goal of ``prettify()`` is to help you visually
+understand the structure of the documents you work with.
+
+Non-pretty printing
+-------------------
+
+If you just want a string, with no fancy formatting, you can call
+``str()`` on a ``BeautifulSoup`` object (``unicode()`` in Python 2),
+or on a ``Tag`` within it::
+
+ str(soup)
+ # '<html><head></head><body><a href="http://example.com/">I linked to <i>example.com</i></a></body></html>'
+
+ str(soup.a)
+ # '<a href="http://example.com/">I linked to <i>example.com</i></a>'
+
+The ``str()`` function returns a string encoded in UTF-8. See
+`Encodings`_ for other options.
+
+You can also call ``encode()`` to get a bytestring, and ``decode()``
+to get Unicode.
+
+.. _output_formatters:
+
+Output formatters
+-----------------
+
+If you give Beautiful Soup a document that contains HTML entities like
+"&lquot;", they'll be converted to Unicode characters::
+
+ soup = BeautifulSoup("&ldquo;Dammit!&rdquo; he said.", 'html.parser')
+ str(soup)
+ # '“Dammit!” he said.'
+
+If you then convert the document to a bytestring, the Unicode characters
+will be encoded as UTF-8. You won't get the HTML entities back::
+
+ soup.encode("utf8")
+ # b'\xe2\x80\x9cDammit!\xe2\x80\x9d he said.'
+
+By default, the only characters that are escaped upon output are bare
+ampersands and angle brackets. These get turned into "&amp;", "&lt;",
+and "&gt;", so that Beautiful Soup doesn't inadvertently generate
+invalid HTML or XML::
+
+ soup = BeautifulSoup("<p>The law firm of Dewey, Cheatem, & Howe</p>", 'html.parser')
+ soup.p
+ # <p>The law firm of Dewey, Cheatem, &amp; Howe</p>
+
+ soup = BeautifulSoup('<a href="http://example.com/?foo=val1&bar=val2">A link</a>', 'html.parser')
+ soup.a
+ # <a href="http://example.com/?foo=val1&amp;bar=val2">A link</a>
+
+You can change this behavior by providing a value for the
+``formatter`` argument to ``prettify()``, ``encode()``, or
+``decode()``. Beautiful Soup recognizes five possible values for
+``formatter``.
+
+The default is ``formatter="minimal"``. Strings will only be processed
+enough to ensure that Beautiful Soup generates valid HTML/XML::
+
+ french = "<p>Il a dit &lt;&lt;Sacr&eacute; bleu!&gt;&gt;</p>"
+ soup = BeautifulSoup(french, 'html.parser')
+ print(soup.prettify(formatter="minimal"))
+ # <p>
+ # Il a dit &lt;&lt;Sacré bleu!&gt;&gt;
+ # </p>
+
+If you pass in ``formatter="html"``, Beautiful Soup will convert
+Unicode characters to HTML entities whenever possible::
+
+ print(soup.prettify(formatter="html"))
+ # <p>
+ # Il a dit &lt;&lt;Sacr&eacute; bleu!&gt;&gt;
+ # </p>
+
+If you pass in ``formatter="html5"``, it's the same as
+``formatter="html"``, but Beautiful Soup will
+omit the closing slash in HTML void tags like "br"::
+
+ br = BeautifulSoup("<br>", 'html.parser').br
+
+ print(br.encode(formatter="html"))
+ # b'<br/>'
+
+ print(br.encode(formatter="html5"))
+ # b'<br>'
+
+If you pass in ``formatter=None``, Beautiful Soup will not modify
+strings at all on output. This is the fastest option, but it may lead
+to Beautiful Soup generating invalid HTML/XML, as in these examples::
+
+ print(soup.prettify(formatter=None))
+ # <p>
+ # Il a dit <<Sacré bleu!>>
+ # </p>
+
+ link_soup = BeautifulSoup('<a href="http://example.com/?foo=val1&bar=val2">A link</a>', 'html.parser')
+ print(link_soup.a.encode(formatter=None))
+ # b'<a href="http://example.com/?foo=val1&bar=val2">A link</a>'
+
+If you need more sophisticated control over your output, you can
+use Beautiful Soup's ``Formatter`` class. Here's a formatter that
+converts strings to uppercase, whether they occur in a text node or in an
+attribute value::
+
+ from bs4.formatter import HTMLFormatter
+ def uppercase(str):
+ return str.upper()
+
+ formatter = HTMLFormatter(uppercase)
+
+ print(soup.prettify(formatter=formatter))
+ # <p>
+ # IL A DIT <<SACRÉ BLEU!>>
+ # </p>
+
+ print(link_soup.a.prettify(formatter=formatter))
+ # <a href="HTTP://EXAMPLE.COM/?FOO=VAL1&BAR=VAL2">
+ # A LINK
+ # </a>
+
+Subclassing ``HTMLFormatter`` or ``XMLFormatter`` will give you even
+more control over the output. For example, Beautiful Soup sorts the
+attributes in every tag by default::
+
+ attr_soup = BeautifulSoup(b'<p z="1" m="2" a="3"></p>', 'html.parser')
+ print(attr_soup.p.encode())
+ # <p a="3" m="2" z="1"></p>
+
+To turn this off, you can subclass the ``Formatter.attributes()``
+method, which controls which attributes are output and in what
+order. This implementation also filters out the attribute called "m"
+whenever it appears::
+
+ class UnsortedAttributes(HTMLFormatter):
+ def attributes(self, tag):
+ for k, v in tag.attrs.items():
+ if k == 'm':
+ continue
+ yield k, v
+
+ print(attr_soup.p.encode(formatter=UnsortedAttributes()))
+ # <p z="1" a="3"></p>
+
+One last caveat: if you create a ``CData`` object, the text inside
+that object is always presented `exactly as it appears, with no
+formatting`. Beautiful Soup will call your entity substitution
+function, just in case you've written a custom function that counts
+all the strings in the document or something, but it will ignore the
+return value::
+
+ from bs4.element import CData
+ soup = BeautifulSoup("<a></a>", 'html.parser')
+ soup.a.string = CData("one < three")
+ print(soup.a.prettify(formatter="html"))
+ # <a>
+ # <![CDATA[one < three]]>
+ # </a>
+
+
+``get_text()``
+--------------
+
+If you only want the human-readable text inside a document or tag, you can use the
+``get_text()`` method. It returns all the text in a document or
+beneath a tag, as a single Unicode string::
+
+ markup = '<a href="http://example.com/">\nI linked to <i>example.com</i>\n</a>'
+ soup = BeautifulSoup(markup, 'html.parser')
+
+ soup.get_text()
+ '\nI linked to example.com\n'
+ soup.i.get_text()
+ 'example.com'
+
+You can specify a string to be used to join the bits of text
+together::
+
+ # soup.get_text("|")
+ '\nI linked to |example.com|\n'
+
+You can tell Beautiful Soup to strip whitespace from the beginning and
+end of each bit of text::
+
+ # soup.get_text("|", strip=True)
+ 'I linked to|example.com'
+
+But at that point you might want to use the :ref:`.stripped_strings <string-generators>`
+generator instead, and process the text yourself::
+
+ [text for text in soup.stripped_strings]
+ # ['I linked to', 'example.com']
+
+*As of Beautiful Soup version 4.9.0, when lxml or html.parser are in
+use, the contents of <script>, <style>, and <template>
+tags are not considered to be 'text', since those tags are not part of
+the human-visible content of the page.*
+
+
+Specifying the parser to use
+============================
+
+If you just need to parse some HTML, you can dump the markup into the
+``BeautifulSoup`` constructor, and it'll probably be fine. Beautiful
+Soup will pick a parser for you and parse the data. But there are a
+few additional arguments you can pass in to the constructor to change
+which parser is used.
+
+The first argument to the ``BeautifulSoup`` constructor is a string or
+an open filehandle--the markup you want parsed. The second argument is
+`how` you'd like the markup parsed.
+
+If you don't specify anything, you'll get the best HTML parser that's
+installed. Beautiful Soup ranks lxml's parser as being the best, then
+html5lib's, then Python's built-in parser. You can override this by
+specifying one of the following:
+
+* What type of markup you want to parse. Currently supported are
+ "html", "xml", and "html5".
+
+* The name of the parser library you want to use. Currently supported
+ options are "lxml", "html5lib", and "html.parser" (Python's
+ built-in HTML parser).
+
+The section `Installing a parser`_ contrasts the supported parsers.
+
+If you don't have an appropriate parser installed, Beautiful Soup will
+ignore your request and pick a different parser. Right now, the only
+supported XML parser is lxml. If you don't have lxml installed, asking
+for an XML parser won't give you one, and asking for "lxml" won't work
+either.
+
+Differences between parsers
+---------------------------
+
+Beautiful Soup presents the same interface to a number of different
+parsers, but each parser is different. Different parsers will create
+different parse trees from the same document. The biggest differences
+are between the HTML parsers and the XML parsers. Here's a short
+document, parsed as HTML using the parser that comes with Python::
+
+ BeautifulSoup("<a><b/></a>", "html.parser")
+ # <a><b></b></a>
+
+Since a standalone <b/> tag is not valid HTML, html.parser turns it into
+a <b></b> tag pair.
+
+Here's the same document parsed as XML (running this requires that you
+have lxml installed). Note that the standalone <b/> tag is left alone, and
+that the document is given an XML declaration instead of being put
+into an <html> tag.::
+
+ print(BeautifulSoup("<a><b/></a>", "xml"))
+ # <?xml version="1.0" encoding="utf-8"?>
+ # <a><b/></a>
+
+There are also differences between HTML parsers. If you give Beautiful
+Soup a perfectly-formed HTML document, these differences won't
+matter. One parser will be faster than another, but they'll all give
+you a data structure that looks exactly like the original HTML
+document.
+
+But if the document is not perfectly-formed, different parsers will
+give different results. Here's a short, invalid document parsed using
+lxml's HTML parser. Note that the <a> tag gets wrapped in <body> and
+<html> tags, and the dangling </p> tag is simply ignored::
+
+ BeautifulSoup("<a></p>", "lxml")
+ # <html><body><a></a></body></html>
+
+Here's the same document parsed using html5lib::
+
+ BeautifulSoup("<a></p>", "html5lib")
+ # <html><head></head><body><a><p></p></a></body></html>
+
+Instead of ignoring the dangling </p> tag, html5lib pairs it with an
+opening <p> tag. html5lib also adds an empty <head> tag; lxml didn't
+bother.
+
+Here's the same document parsed with Python's built-in HTML
+parser::
+
+ BeautifulSoup("<a></p>", "html.parser")
+ # <a></a>
+
+Like html5lib, this parser ignores the closing </p> tag. Unlike
+html5lib or lxml, this parser makes no attempt to create a
+well-formed HTML document by adding <html> or <body> tags.
+
+Since the document "<a></p>" is invalid, none of these techniques is
+the 'correct' way to handle it. The html5lib parser uses techniques
+that are part of the HTML5 standard, so it has the best claim on being
+the 'correct' way, but all three techniques are legitimate.
+
+Differences between parsers can affect your script. If you're planning
+on distributing your script to other people, or running it on multiple
+machines, you should specify a parser in the ``BeautifulSoup``
+constructor. That will reduce the chances that your users parse a
+document differently from the way you parse it.
+
+Encodings
+=========
+
+Any HTML or XML document is written in a specific encoding like ASCII
+or UTF-8. But when you load that document into Beautiful Soup, you'll
+discover it's been converted to Unicode::
+
+ markup = "<h1>Sacr\xc3\xa9 bleu!</h1>"
+ soup = BeautifulSoup(markup, 'html.parser')
+ soup.h1
+ # <h1>Sacré bleu!</h1>
+ soup.h1.string
+ # 'Sacr\xe9 bleu!'
+
+It's not magic. (That sure would be nice.) Beautiful Soup uses a
+sub-library called `Unicode, Dammit`_ to detect a document's encoding
+and convert it to Unicode. The autodetected encoding is available as
+the ``.original_encoding`` attribute of the ``BeautifulSoup`` object::
+
+ soup.original_encoding
+ 'utf-8'
+
+Unicode, Dammit guesses correctly most of the time, but sometimes it
+makes mistakes. Sometimes it guesses correctly, but only after a
+byte-by-byte search of the document that takes a very long time. If
+you happen to know a document's encoding ahead of time, you can avoid
+mistakes and delays by passing it to the ``BeautifulSoup`` constructor
+as ``from_encoding``.
+
+Here's a document written in ISO-8859-8. The document is so short that
+Unicode, Dammit can't get a lock on it, and misidentifies it as
+ISO-8859-7::
+
+ markup = b"<h1>\xed\xe5\xec\xf9</h1>"
+ soup = BeautifulSoup(markup, 'html.parser')
+ print(soup.h1)
+ # <h1>νεμω</h1>
+ print(soup.original_encoding)
+ # iso-8859-7
+
+We can fix this by passing in the correct ``from_encoding``::
+
+ soup = BeautifulSoup(markup, 'html.parser', from_encoding="iso-8859-8")
+ print(soup.h1)
+ # <h1>םולש</h1>
+ print(soup.original_encoding)
+ # iso8859-8
+
+If you don't know what the correct encoding is, but you know that
+Unicode, Dammit is guessing wrong, you can pass the wrong guesses in
+as ``exclude_encodings``::
+
+ soup = BeautifulSoup(markup, 'html.parser', exclude_encodings=["iso-8859-7"])
+ print(soup.h1)
+ # <h1>םולש</h1>
+ print(soup.original_encoding)
+ # WINDOWS-1255
+
+Windows-1255 isn't 100% correct, but that encoding is a compatible
+superset of ISO-8859-8, so it's close enough. (``exclude_encodings``
+is a new feature in Beautiful Soup 4.4.0.)
+
+In rare cases (usually when a UTF-8 document contains text written in
+a completely different encoding), the only way to get Unicode may be
+to replace some characters with the special Unicode character
+"REPLACEMENT CHARACTER" (U+FFFD, �). If Unicode, Dammit needs to do
+this, it will set the ``.contains_replacement_characters`` attribute
+to ``True`` on the ``UnicodeDammit`` or ``BeautifulSoup`` object. This
+lets you know that the Unicode representation is not an exact
+representation of the original--some data was lost. If a document
+contains �, but ``.contains_replacement_characters`` is ``False``,
+you'll know that the � was there originally (as it is in this
+paragraph) and doesn't stand in for missing data.
+
+Output encoding
+---------------
+
+When you write out a document from Beautiful Soup, you get a UTF-8
+document, even if the document wasn't in UTF-8 to begin with. Here's a
+document written in the Latin-1 encoding::
+
+ markup = b'''
+ <html>
+ <head>
+ <meta content="text/html; charset=ISO-Latin-1" http-equiv="Content-type" />
+ </head>
+ <body>
+ <p>Sacr\xe9 bleu!</p>
+ </body>
+ </html>
+ '''
+
+ soup = BeautifulSoup(markup, 'html.parser')
+ print(soup.prettify())
+ # <html>
+ # <head>
+ # <meta content="text/html; charset=utf-8" http-equiv="Content-type" />
+ # </head>
+ # <body>
+ # <p>
+ # Sacré bleu!
+ # </p>
+ # </body>
+ # </html>
+
+Note that the <meta> tag has been rewritten to reflect the fact that
+the document is now in UTF-8.
+
+If you don't want UTF-8, you can pass an encoding into ``prettify()``::
+
+ print(soup.prettify("latin-1"))
+ # <html>
+ # <head>
+ # <meta content="text/html; charset=latin-1" http-equiv="Content-type" />
+ # ...
+
+You can also call encode() on the ``BeautifulSoup`` object, or any
+element in the soup, just as if it were a Python string::
+
+ soup.p.encode("latin-1")
+ # b'<p>Sacr\xe9 bleu!</p>'
+
+ soup.p.encode("utf-8")
+ # b'<p>Sacr\xc3\xa9 bleu!</p>'
+
+Any characters that can't be represented in your chosen encoding will
+be converted into numeric XML entity references. Here's a document
+that includes the Unicode character SNOWMAN::
+
+ markup = u"<b>\N{SNOWMAN}</b>"
+ snowman_soup = BeautifulSoup(markup, 'html.parser')
+ tag = snowman_soup.b
+
+The SNOWMAN character can be part of a UTF-8 document (it looks like
+☃), but there's no representation for that character in ISO-Latin-1 or
+ASCII, so it's converted into "&#9731" for those encodings::
+
+ print(tag.encode("utf-8"))
+ # b'<b>\xe2\x98\x83</b>'
+
+ print(tag.encode("latin-1"))
+ # b'<b>&#9731;</b>'
+
+ print(tag.encode("ascii"))
+ # b'<b>&#9731;</b>'
+
+Unicode, Dammit
+---------------
+
+You can use Unicode, Dammit without using Beautiful Soup. It's useful
+whenever you have data in an unknown encoding and you just want it to
+become Unicode::
+
+ from bs4 import UnicodeDammit
+ dammit = UnicodeDammit("Sacr\xc3\xa9 bleu!")
+ print(dammit.unicode_markup)
+ # Sacré bleu!
+ dammit.original_encoding
+ # 'utf-8'
+
+Unicode, Dammit's guesses will get a lot more accurate if you install
+the ``chardet`` or ``cchardet`` Python libraries. The more data you
+give Unicode, Dammit, the more accurately it will guess. If you have
+your own suspicions as to what the encoding might be, you can pass
+them in as a list::
+
+ dammit = UnicodeDammit("Sacr\xe9 bleu!", ["latin-1", "iso-8859-1"])
+ print(dammit.unicode_markup)
+ # Sacré bleu!
+ dammit.original_encoding
+ # 'latin-1'
+
+Unicode, Dammit has two special features that Beautiful Soup doesn't
+use.
+
+Smart quotes
+^^^^^^^^^^^^
+
+You can use Unicode, Dammit to convert Microsoft smart quotes to HTML or XML
+entities::
+
+ markup = b"<p>I just \x93love\x94 Microsoft Word\x92s smart quotes</p>"
+
+ UnicodeDammit(markup, ["windows-1252"], smart_quotes_to="html").unicode_markup
+ # '<p>I just &ldquo;love&rdquo; Microsoft Word&rsquo;s smart quotes</p>'
+
+ UnicodeDammit(markup, ["windows-1252"], smart_quotes_to="xml").unicode_markup
+ # '<p>I just &#x201C;love&#x201D; Microsoft Word&#x2019;s smart quotes</p>'
+
+You can also convert Microsoft smart quotes to ASCII quotes::
+
+ UnicodeDammit(markup, ["windows-1252"], smart_quotes_to="ascii").unicode_markup
+ # '<p>I just "love" Microsoft Word\'s smart quotes</p>'
+
+Hopefully you'll find this feature useful, but Beautiful Soup doesn't
+use it. Beautiful Soup prefers the default behavior, which is to
+convert Microsoft smart quotes to Unicode characters along with
+everything else::
+
+ UnicodeDammit(markup, ["windows-1252"]).unicode_markup
+ # '<p>I just “love” Microsoft Word’s smart quotes</p>'
+
+Inconsistent encodings
+^^^^^^^^^^^^^^^^^^^^^^
+
+Sometimes a document is mostly in UTF-8, but contains Windows-1252
+characters such as (again) Microsoft smart quotes. This can happen
+when a website includes data from multiple sources. You can use
+``UnicodeDammit.detwingle()`` to turn such a document into pure
+UTF-8. Here's a simple example::
+
+ snowmen = (u"\N{SNOWMAN}" * 3)
+ quote = (u"\N{LEFT DOUBLE QUOTATION MARK}I like snowmen!\N{RIGHT DOUBLE QUOTATION MARK}")
+ doc = snowmen.encode("utf8") + quote.encode("windows_1252")
+
+This document is a mess. The snowmen are in UTF-8 and the quotes are
+in Windows-1252. You can display the snowmen or the quotes, but not
+both::
+
+ print(doc)
+ # ☃☃☃�I like snowmen!�
+
+ print(doc.decode("windows-1252"))
+ # ☃☃☃“I like snowmen!”
+
+Decoding the document as UTF-8 raises a ``UnicodeDecodeError``, and
+decoding it as Windows-1252 gives you gibberish. Fortunately,
+``UnicodeDammit.detwingle()`` will convert the string to pure UTF-8,
+allowing you to decode it to Unicode and display the snowmen and quote
+marks simultaneously::
+
+ new_doc = UnicodeDammit.detwingle(doc)
+ print(new_doc.decode("utf8"))
+ # ☃☃☃“I like snowmen!”
+
+``UnicodeDammit.detwingle()`` only knows how to handle Windows-1252
+embedded in UTF-8 (or vice versa, I suppose), but this is the most
+common case.
+
+Note that you must know to call ``UnicodeDammit.detwingle()`` on your
+data before passing it into ``BeautifulSoup`` or the ``UnicodeDammit``
+constructor. Beautiful Soup assumes that a document has a single
+encoding, whatever it might be. If you pass it a document that
+contains both UTF-8 and Windows-1252, it's likely to think the whole
+document is Windows-1252, and the document will come out looking like
+``☃☃☃“I like snowmen!”``.
+
+``UnicodeDammit.detwingle()`` is new in Beautiful Soup 4.1.0.
+
+Line numbers
+============
+
+The ``html.parser`` and ``html5lib`` parsers can keep track of where in
+the original document each Tag was found. You can access this
+information as ``Tag.sourceline`` (line number) and ``Tag.sourcepos``
+(position of the start tag within a line)::
+
+ markup = "<p\n>Paragraph 1</p>\n <p>Paragraph 2</p>"
+ soup = BeautifulSoup(markup, 'html.parser')
+ for tag in soup.find_all('p'):
+ print(repr((tag.sourceline, tag.sourcepos, tag.string)))
+ # (1, 0, 'Paragraph 1')
+ # (3, 4, 'Paragraph 2')
+
+Note that the two parsers mean slightly different things by
+``sourceline`` and ``sourcepos``. For html.parser, these numbers
+represent the position of the initial less-than sign. For html5lib,
+these numbers represent the position of the final greater-than sign::
+
+ soup = BeautifulSoup(markup, 'html5lib')
+ for tag in soup.find_all('p'):
+ print(repr((tag.sourceline, tag.sourcepos, tag.string)))
+ # (2, 0, 'Paragraph 1')
+ # (3, 6, 'Paragraph 2')
+
+You can shut off this feature by passing ``store_line_numbers=False`
+into the ``BeautifulSoup`` constructor::
+
+ markup = "<p\n>Paragraph 1</p>\n <p>Paragraph 2</p>"
+ soup = BeautifulSoup(markup, 'html.parser', store_line_numbers=False)
+ print(soup.p.sourceline)
+ # None
+
+`This feature is new in 4.8.1, and the parsers based on lxml don't
+support it.`
+
+Comparing objects for equality
+==============================
+
+Beautiful Soup says that two ``NavigableString`` or ``Tag`` objects
+are equal when they represent the same HTML or XML markup. In this
+example, the two <b> tags are treated as equal, even though they live
+in different parts of the object tree, because they both look like
+"<b>pizza</b>"::
+
+ markup = "<p>I want <b>pizza</b> and more <b>pizza</b>!</p>"
+ soup = BeautifulSoup(markup, 'html.parser')
+ first_b, second_b = soup.find_all('b')
+ print(first_b == second_b)
+ # True
+
+ print(first_b.previous_element == second_b.previous_element)
+ # False
+
+If you want to see whether two variables refer to exactly the same
+object, use `is`::
+
+ print(first_b is second_b)
+ # False
+
+Copying Beautiful Soup objects
+==============================
+
+You can use ``copy.copy()`` to create a copy of any ``Tag`` or
+``NavigableString``::
+
+ import copy
+ p_copy = copy.copy(soup.p)
+ print(p_copy)
+ # <p>I want <b>pizza</b> and more <b>pizza</b>!</p>
+
+The copy is considered equal to the original, since it represents the
+same markup as the original, but it's not the same object::
+
+ print(soup.p == p_copy)
+ # True
+
+ print(soup.p is p_copy)
+ # False
+
+The only real difference is that the copy is completely detached from
+the original Beautiful Soup object tree, just as if ``extract()`` had
+been called on it::
+
+ print(p_copy.parent)
+ # None
+
+This is because two different ``Tag`` objects can't occupy the same
+space at the same time.
+
+Advanced parser customization
+=============================
+
+Beautiful Soup offers a number of ways to customize how the parser
+treats incoming HTML and XML. This section covers the most commonly
+used customization techniques.
+
+Parsing only part of a document
+-------------------------------
+
+Let's say you want to use Beautiful Soup look at a document's <a>
+tags. It's a waste of time and memory to parse the entire document and
+then go over it again looking for <a> tags. It would be much faster to
+ignore everything that wasn't an <a> tag in the first place. The
+``SoupStrainer`` class allows you to choose which parts of an incoming
+document are parsed. You just create a ``SoupStrainer`` and pass it in
+to the ``BeautifulSoup`` constructor as the ``parse_only`` argument.
+
+(Note that *this feature won't work if you're using the html5lib parser*.
+If you use html5lib, the whole document will be parsed, no
+matter what. This is because html5lib constantly rearranges the parse
+tree as it works, and if some part of the document didn't actually
+make it into the parse tree, it'll crash. To avoid confusion, in the
+examples below I'll be forcing Beautiful Soup to use Python's
+built-in parser.)
+
+``SoupStrainer``
+^^^^^^^^^^^^^^^^
+
+The ``SoupStrainer`` class takes the same arguments as a typical
+method from `Searching the tree`_: :ref:`name <name>`, :ref:`attrs
+<attrs>`, :ref:`string <string>`, and :ref:`**kwargs <kwargs>`. Here are
+three ``SoupStrainer`` objects::
+
+ from bs4 import SoupStrainer
+
+ only_a_tags = SoupStrainer("a")
+
+ only_tags_with_id_link2 = SoupStrainer(id="link2")
+
+ def is_short_string(string):
+ return string is not None and len(string) < 10
+
+ only_short_strings = SoupStrainer(string=is_short_string)
+
+I'm going to bring back the "three sisters" document one more time,
+and we'll see what the document looks like when it's parsed with these
+three ``SoupStrainer`` objects::
+
+ html_doc = """<html><head><title>The Dormouse's story</title></head>
+ <body>
+ <p class="title"><b>The Dormouse's story</b></p>
+
+ <p class="story">Once upon a time there were three little sisters; and their names were
+ <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
+ <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
+ <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
+ and they lived at the bottom of a well.</p>
+
+ <p class="story">...</p>
+ """
+
+ print(BeautifulSoup(html_doc, "html.parser", parse_only=only_a_tags).prettify())
+ # <a class="sister" href="http://example.com/elsie" id="link1">
+ # Elsie
+ # </a>
+ # <a class="sister" href="http://example.com/lacie" id="link2">
+ # Lacie
+ # </a>
+ # <a class="sister" href="http://example.com/tillie" id="link3">
+ # Tillie
+ # </a>
+
+ print(BeautifulSoup(html_doc, "html.parser", parse_only=only_tags_with_id_link2).prettify())
+ # <a class="sister" href="http://example.com/lacie" id="link2">
+ # Lacie
+ # </a>
+
+ print(BeautifulSoup(html_doc, "html.parser", parse_only=only_short_strings).prettify())
+ # Elsie
+ # ,
+ # Lacie
+ # and
+ # Tillie
+ # ...
+ #
+
+You can also pass a ``SoupStrainer`` into any of the methods covered
+in `Searching the tree`_. This probably isn't terribly useful, but I
+thought I'd mention it::
+
+ soup = BeautifulSoup(html_doc, 'html.parser')
+ soup.find_all(only_short_strings)
+ # ['\n\n', '\n\n', 'Elsie', ',\n', 'Lacie', ' and\n', 'Tillie',
+ # '\n\n', '...', '\n']
+
+Customizing multi-valued attributes
+-----------------------------------
+
+In an HTML document, an attribute like ``class`` is given a list of
+values, and an attribute like ``id`` is given a single value, because
+the HTML specification treats those attributes differently::
+
+ markup = '<a class="cls1 cls2" id="id1 id2">'
+ soup = BeautifulSoup(markup, 'html.parser')
+ soup.a['class']
+ # ['cls1', 'cls2']
+ soup.a['id']
+ # 'id1 id2'
+
+You can turn this off by passing in
+``multi_valued_attributes=None``. Than all attributes will be given a
+single value::
+
+ soup = BeautifulSoup(markup, 'html.parser', multi_valued_attributes=None)
+ soup.a['class']
+ # 'cls1 cls2'
+ soup.a['id']
+ # 'id1 id2'
+
+You can customize this behavior quite a bit by passing in a
+dictionary for ``multi_valued_attributes``. If you need this, look at
+``HTMLTreeBuilder.DEFAULT_CDATA_LIST_ATTRIBUTES`` to see the
+configuration Beautiful Soup uses by default, which is based on the
+HTML specification.
+
+`(This is a new feature in Beautiful Soup 4.8.0.)`
+
+Handling duplicate attributes
+-----------------------------
+
+When using the ``html.parser`` parser, you can use the
+``on_duplicate_attribute`` constructor argument to customize what
+Beautiful Soup does when it encounters a tag that defines the same
+attribute more than once::
+
+ markup = '<a href="http://url1/" href="http://url2/">'
+
+The default behavior is to use the last value found for the tag::
+
+ soup = BeautifulSoup(markup, 'html.parser')
+ soup.a['href']
+ # http://url2/
+
+ soup = BeautifulSoup(markup, 'html.parser', on_duplicate_attribute='replace')
+ soup.a['href']
+ # http://url2/
+
+With ``on_duplicate_attribute='ignore'`` you can tell Beautiful Soup
+to use the `first` value found and ignore the rest::
+
+ soup = BeautifulSoup(markup, 'html.parser', on_duplicate_attribute='ignore')
+ soup.a['href']
+ # http://url1/
+
+(lxml and html5lib always do it this way; their behavior can't be
+configured from within Beautiful Soup.)
+
+If you need more, you can pass in a function that's called on each duplicate value::
+
+ def accumulate(attributes_so_far, key, value):
+ if not isinstance(attributes_so_far[key], list):
+ attributes_so_far[key] = [attributes_so_far[key]]
+ attributes_so_far[key].append(value)
+
+ soup = BeautifulSoup(markup, 'html.parser', on_duplicate_attribute=accumulate)
+ soup.a['href']
+ # ["http://url1/", "http://url2/"]
+
+`(This is a new feature in Beautiful Soup 4.9.1.)`
+
+Instantiating custom subclasses
+-------------------------------
+
+When a parser tells Beautiful Soup about a tag or a string, Beautiful
+Soup will instantiate a ``Tag`` or ``NavigableString`` object to
+contain that information. Instead of that default behavior, you can
+tell Beautiful Soup to instantiate `subclasses` of ``Tag`` or
+``NavigableString``, subclasses you define with custom behavior::
+
+ from bs4 import Tag, NavigableString
+ class MyTag(Tag):
+ pass
+
+
+ class MyString(NavigableString):
+ pass
+
+
+ markup = "<div>some text</div>"
+ soup = BeautifulSoup(markup, 'html.parser')
+ isinstance(soup.div, MyTag)
+ # False
+ isinstance(soup.div.string, MyString)
+ # False
+
+ my_classes = { Tag: MyTag, NavigableString: MyString }
+ soup = BeautifulSoup(markup, 'html.parser', element_classes=my_classes)
+ isinstance(soup.div, MyTag)
+ # True
+ isinstance(soup.div.string, MyString)
+ # True
+
+This can be useful when incorporating Beautiful Soup into a test
+framework.
+
+`(This is a new feature in Beautiful Soup 4.8.1.)`
+
+Troubleshooting
+===============
+
+.. _diagnose:
+
+``diagnose()``
+--------------
+
+If you're having trouble understanding what Beautiful Soup does to a
+document, pass the document into the ``diagnose()`` function. (New in
+Beautiful Soup 4.2.0.) Beautiful Soup will print out a report showing
+you how different parsers handle the document, and tell you if you're
+missing a parser that Beautiful Soup could be using::
+
+ from bs4.diagnose import diagnose
+ with open("bad.html") as fp:
+ data = fp.read()
+
+ diagnose(data)
+
+ # Diagnostic running on Beautiful Soup 4.2.0
+ # Python version 2.7.3 (default, Aug 1 2012, 05:16:07)
+ # I noticed that html5lib is not installed. Installing it may help.
+ # Found lxml version 2.3.2.0
+ #
+ # Trying to parse your data with html.parser
+ # Here's what html.parser did with the document:
+ # ...
+
+Just looking at the output of diagnose() may show you how to solve the
+problem. Even if not, you can paste the output of ``diagnose()`` when
+asking for help.
+
+Errors when parsing a document
+------------------------------
+
+There are two different kinds of parse errors. There are crashes,
+where you feed a document to Beautiful Soup and it raises an
+exception, usually an ``HTMLParser.HTMLParseError``. And there is
+unexpected behavior, where a Beautiful Soup parse tree looks a lot
+different than the document used to create it.
+
+Almost none of these problems turn out to be problems with Beautiful
+Soup. This is not because Beautiful Soup is an amazingly well-written
+piece of software. It's because Beautiful Soup doesn't include any
+parsing code. Instead, it relies on external parsers. If one parser
+isn't working on a certain document, the best solution is to try a
+different parser. See `Installing a parser`_ for details and a parser
+comparison.
+
+The most common parse errors are ``HTMLParser.HTMLParseError:
+malformed start tag`` and ``HTMLParser.HTMLParseError: bad end
+tag``. These are both generated by Python's built-in HTML parser
+library, and the solution is to :ref:`install lxml or
+html5lib. <parser-installation>`
+
+The most common type of unexpected behavior is that you can't find a
+tag that you know is in the document. You saw it going in, but
+``find_all()`` returns ``[]`` or ``find()`` returns ``None``. This is
+another common problem with Python's built-in HTML parser, which
+sometimes skips tags it doesn't understand. Again, the best solution is to
+:ref:`install lxml or html5lib. <parser-installation>`
+
+Version mismatch problems
+-------------------------
+
+* ``SyntaxError: Invalid syntax`` (on the line ``ROOT_TAG_NAME =
+ '[document]'``): Caused by running the Python 2 version of
+ Beautiful Soup under Python 3, without converting the code.
+
+* ``ImportError: No module named HTMLParser`` - Caused by running the
+ Python 2 version of Beautiful Soup under Python 3.
+
+* ``ImportError: No module named html.parser`` - Caused by running the
+ Python 3 version of Beautiful Soup under Python 2.
+
+* ``ImportError: No module named BeautifulSoup`` - Caused by running
+ Beautiful Soup 3 code on a system that doesn't have BS3
+ installed. Or, by writing Beautiful Soup 4 code without knowing that
+ the package name has changed to ``bs4``.
+
+* ``ImportError: No module named bs4`` - Caused by running Beautiful
+ Soup 4 code on a system that doesn't have BS4 installed.
+
+.. _parsing-xml:
+
+Parsing XML
+-----------
+
+By default, Beautiful Soup parses documents as HTML. To parse a
+document as XML, pass in "xml" as the second argument to the
+``BeautifulSoup`` constructor::
+
+ soup = BeautifulSoup(markup, "xml")
+
+You'll need to :ref:`have lxml installed <parser-installation>`.
+
+Other parser problems
+---------------------
+
+* If your script works on one computer but not another, or in one
+ virtual environment but not another, or outside the virtual
+ environment but not inside, it's probably because the two
+ environments have different parser libraries available. For example,
+ you may have developed the script on a computer that has lxml
+ installed, and then tried to run it on a computer that only has
+ html5lib installed. See `Differences between parsers`_ for why this
+ matters, and fix the problem by mentioning a specific parser library
+ in the ``BeautifulSoup`` constructor.
+
+* Because `HTML tags and attributes are case-insensitive
+ <http://www.w3.org/TR/html5/syntax.html#syntax>`_, all three HTML
+ parsers convert tag and attribute names to lowercase. That is, the
+ markup <TAG></TAG> is converted to <tag></tag>. If you want to
+ preserve mixed-case or uppercase tags and attributes, you'll need to
+ :ref:`parse the document as XML. <parsing-xml>`
+
+.. _misc:
+
+Miscellaneous
+-------------
+
+* ``UnicodeEncodeError: 'charmap' codec can't encode character
+ '\xfoo' in position bar`` (or just about any other
+ ``UnicodeEncodeError``) - This problem shows up in two main
+ situations. First, when you try to print a Unicode character that
+ your console doesn't know how to display. (See `this page on the
+ Python wiki <http://wiki.python.org/moin/PrintFails>`_ for help.)
+ Second, when you're writing to a file and you pass in a Unicode
+ character that's not supported by your default encoding. In this
+ case, the simplest solution is to explicitly encode the Unicode
+ string into UTF-8 with ``u.encode("utf8")``.
+
+* ``KeyError: [attr]`` - Caused by accessing ``tag['attr']`` when the
+ tag in question doesn't define the ``attr`` attribute. The most
+ common errors are ``KeyError: 'href'`` and ``KeyError: 'class'``.
+ Use ``tag.get('attr')`` if you're not sure ``attr`` is
+ defined, just as you would with a Python dictionary.
+
+* ``AttributeError: 'ResultSet' object has no attribute 'foo'`` - This
+ usually happens because you expected ``find_all()`` to return a
+ single tag or string. But ``find_all()`` returns a _list_ of tags
+ and strings--a ``ResultSet`` object. You need to iterate over the
+ list and look at the ``.foo`` of each one. Or, if you really only
+ want one result, you need to use ``find()`` instead of
+ ``find_all()``.
+
+* ``AttributeError: 'NoneType' object has no attribute 'foo'`` - This
+ usually happens because you called ``find()`` and then tried to
+ access the `.foo`` attribute of the result. But in your case,
+ ``find()`` didn't find anything, so it returned ``None``, instead of
+ returning a tag or a string. You need to figure out why your
+ ``find()`` call isn't returning anything.
+
+* ``AttributeError: 'NavigableString' object has no attribute
+ 'foo'`` - This usually happens because you're treating a string as
+ though it were a tag. You may be iterating over a list, expecting
+ that it contains nothing but tags, when it actually contains both tags and
+ strings.
+
+
+Improving Performance
+---------------------
+
+Beautiful Soup will never be as fast as the parsers it sits on top
+of. If response time is critical, if you're paying for computer time
+by the hour, or if there's any other reason why computer time is more
+valuable than programmer time, you should forget about Beautiful Soup
+and work directly atop `lxml <http://lxml.de/>`_.
+
+That said, there are things you can do to speed up Beautiful Soup. If
+you're not using lxml as the underlying parser, my advice is to
+:ref:`start <parser-installation>`. Beautiful Soup parses documents
+significantly faster using lxml than using html.parser or html5lib.
+
+You can speed up encoding detection significantly by installing the
+`cchardet <http://pypi.python.org/pypi/cchardet/>`_ library.
+
+`Parsing only part of a document`_ won't save you much time parsing
+the document, but it can save a lot of memory, and it'll make
+`searching` the document much faster.
+
+Translating this documentation
+==============================
+
+New translations of the Beautiful Soup documentation are greatly
+appreciated. Translations should be licensed under the MIT license,
+just like Beautiful Soup and its English documentation are.
+
+There are two ways of getting your translation into the main code base
+and onto the Beautiful Soup website:
+
+1. Create a branch of the Beautiful Soup repository, add your
+ translation, and propose a merge with the main branch, the same
+ as you would do with a proposed change to the source code.
+2. Send a message to the Beautiful Soup discussion group with a link to
+ your translation, or attach your translation to the message.
+
+Use the Chinese or Brazilian Portuguese translations as your model. In
+particular, please translate the source file ``doc/source/index.rst``,
+rather than the HTML version of the documentation. This makes it
+possible to publish the documentation in a variety of formats, not
+just HTML.
+
+Beautiful Soup 3
+================
+
+Beautiful Soup 3 is the previous release series, and is no longer
+being actively developed. It's currently packaged with all major Linux
+distributions:
+
+:kbd:`$ apt-get install python-beautifulsoup`
+
+It's also published through PyPi as ``BeautifulSoup``.:
+
+:kbd:`$ easy_install BeautifulSoup`
+
+:kbd:`$ pip install BeautifulSoup`
+
+You can also `download a tarball of Beautiful Soup 3.2.0
+<http://www.crummy.com/software/BeautifulSoup/bs3/download/3.x/BeautifulSoup-3.2.0.tar.gz>`_.
+
+If you ran ``easy_install beautifulsoup`` or ``easy_install
+BeautifulSoup``, but your code doesn't work, you installed Beautiful
+Soup 3 by mistake. You need to run ``easy_install beautifulsoup4``.
+
+`The documentation for Beautiful Soup 3 is archived online
+<http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html>`_.
+
+Porting code to BS4
+-------------------
+
+Most code written against Beautiful Soup 3 will work against Beautiful
+Soup 4 with one simple change. All you should have to do is change the
+package name from ``BeautifulSoup`` to ``bs4``. So this::
+
+ from BeautifulSoup import BeautifulSoup
+
+becomes this::
+
+ from bs4 import BeautifulSoup
+
+* If you get the ``ImportError`` "No module named BeautifulSoup", your
+ problem is that you're trying to run Beautiful Soup 3 code, but you
+ only have Beautiful Soup 4 installed.
+
+* If you get the ``ImportError`` "No module named bs4", your problem
+ is that you're trying to run Beautiful Soup 4 code, but you only
+ have Beautiful Soup 3 installed.
+
+Although BS4 is mostly backwards-compatible with BS3, most of its
+methods have been deprecated and given new names for `PEP 8 compliance
+<http://www.python.org/dev/peps/pep-0008/>`_. There are numerous other
+renames and changes, and a few of them break backwards compatibility.
+
+Here's what you'll need to know to convert your BS3 code and habits to BS4:
+
+You need a parser
+^^^^^^^^^^^^^^^^^
+
+Beautiful Soup 3 used Python's ``SGMLParser``, a module that was
+deprecated and removed in Python 3.0. Beautiful Soup 4 uses
+``html.parser`` by default, but you can plug in lxml or html5lib and
+use that instead. See `Installing a parser`_ for a comparison.
+
+Since ``html.parser`` is not the same parser as ``SGMLParser``, you
+may find that Beautiful Soup 4 gives you a different parse tree than
+Beautiful Soup 3 for the same markup. If you swap out ``html.parser``
+for lxml or html5lib, you may find that the parse tree changes yet
+again. If this happens, you'll need to update your scraping code to
+deal with the new tree.
+
+Method names
+^^^^^^^^^^^^
+
+* ``renderContents`` -> ``encode_contents``
+* ``replaceWith`` -> ``replace_with``
+* ``replaceWithChildren`` -> ``unwrap``
+* ``findAll`` -> ``find_all``
+* ``findAllNext`` -> ``find_all_next``
+* ``findAllPrevious`` -> ``find_all_previous``
+* ``findNext`` -> ``find_next``
+* ``findNextSibling`` -> ``find_next_sibling``
+* ``findNextSiblings`` -> ``find_next_siblings``
+* ``findParent`` -> ``find_parent``
+* ``findParents`` -> ``find_parents``
+* ``findPrevious`` -> ``find_previous``
+* ``findPreviousSibling`` -> ``find_previous_sibling``
+* ``findPreviousSiblings`` -> ``find_previous_siblings``
+* ``getText`` -> ``get_text``
+* ``nextSibling`` -> ``next_sibling``
+* ``previousSibling`` -> ``previous_sibling``
+
+Some arguments to the Beautiful Soup constructor were renamed for the
+same reasons:
+
+* ``BeautifulSoup(parseOnlyThese=...)`` -> ``BeautifulSoup(parse_only=...)``
+* ``BeautifulSoup(fromEncoding=...)`` -> ``BeautifulSoup(from_encoding=...)``
+
+I renamed one method for compatibility with Python 3:
+
+* ``Tag.has_key()`` -> ``Tag.has_attr()``
+
+I renamed one attribute to use more accurate terminology:
+
+* ``Tag.isSelfClosing`` -> ``Tag.is_empty_element``
+
+I renamed three attributes to avoid using words that have special
+meaning to Python. Unlike the others, these changes are *not backwards
+compatible.* If you used these attributes in BS3, your code will break
+on BS4 until you change them.
+
+* ``UnicodeDammit.unicode`` -> ``UnicodeDammit.unicode_markup``
+* ``Tag.next`` -> ``Tag.next_element``
+* ``Tag.previous`` -> ``Tag.previous_element``
+
+These methods are left over from the Beautiful Soup 2 API. They've
+been deprecated since 2006, and should not be used at all:
+
+* ``Tag.fetchNextSiblings``
+* ``Tag.fetchPreviousSiblings``
+* ``Tag.fetchPrevious``
+* ``Tag.fetchPreviousSiblings``
+* ``Tag.fetchParents``
+* ``Tag.findChild``
+* ``Tag.findChildren``
+
+
+Generators
+^^^^^^^^^^
+
+I gave the generators PEP 8-compliant names, and transformed them into
+properties:
+
+* ``childGenerator()`` -> ``children``
+* ``nextGenerator()`` -> ``next_elements``
+* ``nextSiblingGenerator()`` -> ``next_siblings``
+* ``previousGenerator()`` -> ``previous_elements``
+* ``previousSiblingGenerator()`` -> ``previous_siblings``
+* ``recursiveChildGenerator()`` -> ``descendants``
+* ``parentGenerator()`` -> ``parents``
+
+So instead of this::
+
+ for parent in tag.parentGenerator():
+ ...
+
+You can write this::
+
+ for parent in tag.parents:
+ ...
+
+(But the old code will still work.)
+
+Some of the generators used to yield ``None`` after they were done, and
+then stop. That was a bug. Now the generators just stop.
+
+There are two new generators, :ref:`.strings and
+.stripped_strings <string-generators>`. ``.strings`` yields
+NavigableString objects, and ``.stripped_strings`` yields Python
+strings that have had whitespace stripped.
+
+XML
+^^^
+
+There is no longer a ``BeautifulStoneSoup`` class for parsing XML. To
+parse XML you pass in "xml" as the second argument to the
+``BeautifulSoup`` constructor. For the same reason, the
+``BeautifulSoup`` constructor no longer recognizes the ``isHTML``
+argument.
+
+Beautiful Soup's handling of empty-element XML tags has been
+improved. Previously when you parsed XML you had to explicitly say
+which tags were considered empty-element tags. The ``selfClosingTags``
+argument to the constructor is no longer recognized. Instead,
+Beautiful Soup considers any empty tag to be an empty-element tag. If
+you add a child to an empty-element tag, it stops being an
+empty-element tag.
+
+Entities
+^^^^^^^^
+
+An incoming HTML or XML entity is always converted into the
+corresponding Unicode character. Beautiful Soup 3 had a number of
+overlapping ways of dealing with entities, which have been
+removed. The ``BeautifulSoup`` constructor no longer recognizes the
+``smartQuotesTo`` or ``convertEntities`` arguments. (`Unicode,
+Dammit`_ still has ``smart_quotes_to``, but its default is now to turn
+smart quotes into Unicode.) The constants ``HTML_ENTITIES``,
+``XML_ENTITIES``, and ``XHTML_ENTITIES`` have been removed, since they
+configure a feature (transforming some but not all entities into
+Unicode characters) that no longer exists.
+
+If you want to turn Unicode characters back into HTML entities on
+output, rather than turning them into UTF-8 characters, you need to
+use an :ref:`output formatter <output_formatters>`.
+
+Miscellaneous
+^^^^^^^^^^^^^
+
+:ref:`Tag.string <.string>` now operates recursively. If tag A
+contains a single tag B and nothing else, then A.string is the same as
+B.string. (Previously, it was None.)
+
+`Multi-valued attributes`_ like ``class`` have lists of strings as
+their values, not strings. This may affect the way you search by CSS
+class.
+
+``Tag`` objects now implement the ``__hash__`` method, such that two
+``Tag`` objects are considered equal if they generate the same
+markup. This may change your script's behavior if you put ``Tag``
+objects into a dictionary or set.
+
+If you pass one of the ``find*`` methods both :ref:`string <string>` `and`
+a tag-specific argument like :ref:`name <name>`, Beautiful Soup will
+search for tags that match your tag-specific criteria and whose
+:ref:`Tag.string <.string>` matches your value for :ref:`string
+<string>`. It will `not` find the strings themselves. Previously,
+Beautiful Soup ignored the tag-specific arguments and looked for
+strings.
+
+The ``BeautifulSoup`` constructor no longer recognizes the
+`markupMassage` argument. It's now the parser's responsibility to
+handle markup correctly.
+
+The rarely-used alternate parser classes like
+``ICantBelieveItsBeautifulSoup`` and ``BeautifulSOAP`` have been
+removed. It's now the parser's decision how to handle ambiguous
+markup.
+
+The ``prettify()`` method now returns a Unicode string, not a bytestring.
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/__init__.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/__init__.py
new file mode 100644
index 00000000000..74cab3f7294
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/__init__.py
@@ -0,0 +1,791 @@
+"""Beautiful Soup Elixir and Tonic - "The Screen-Scraper's Friend".
+
+http://www.crummy.com/software/BeautifulSoup/
+
+Beautiful Soup uses a pluggable XML or HTML parser to parse a
+(possibly invalid) document into a tree representation. Beautiful Soup
+provides methods and Pythonic idioms that make it easy to navigate,
+search, and modify the parse tree.
+
+Beautiful Soup works with Python 2.7 and up. It works better if lxml
+and/or html5lib is installed.
+
+For more than you ever wanted to know about Beautiful Soup, see the
+documentation: http://www.crummy.com/software/BeautifulSoup/bs4/doc/
+"""
+
+__author__ = "Leonard Richardson (leonardr@segfault.org)"
+__version__ = "4.9.3"
+__copyright__ = "Copyright (c) 2004-2020 Leonard Richardson"
+# Use of this source code is governed by the MIT license.
+__license__ = "MIT"
+
+__all__ = ['BeautifulSoup']
+
+from collections import Counter
+import os
+import re
+import sys
+import traceback
+import warnings
+
+from .builder import builder_registry, ParserRejectedMarkup
+from .dammit import UnicodeDammit
+from .element import (
+ CData,
+ Comment,
+ DEFAULT_OUTPUT_ENCODING,
+ Declaration,
+ Doctype,
+ NavigableString,
+ PageElement,
+ ProcessingInstruction,
+ PYTHON_SPECIFIC_ENCODINGS,
+ ResultSet,
+ Script,
+ Stylesheet,
+ SoupStrainer,
+ Tag,
+ TemplateString,
+ )
+
+# The very first thing we do is give a useful error if someone is
+# running this code under Python 3 without converting it.
+'You are trying to run the Python 2 version of Beautiful Soup under Python 3. This will not work.'!='You need to convert the code, either by installing it (`python setup.py install`) or by running 2to3 (`2to3 -w bs4`).'
+
+# Define some custom warnings.
+class GuessedAtParserWarning(UserWarning):
+ """The warning issued when BeautifulSoup has to guess what parser to
+ use -- probably because no parser was specified in the constructor.
+ """
+
+class MarkupResemblesLocatorWarning(UserWarning):
+ """The warning issued when BeautifulSoup is given 'markup' that
+ actually looks like a resource locator -- a URL or a path to a file
+ on disk.
+ """
+
+
+class BeautifulSoup(Tag):
+ """A data structure representing a parsed HTML or XML document.
+
+ Most of the methods you'll call on a BeautifulSoup object are inherited from
+ PageElement or Tag.
+
+ Internally, this class defines the basic interface called by the
+ tree builders when converting an HTML/XML document into a data
+ structure. The interface abstracts away the differences between
+ parsers. To write a new tree builder, you'll need to understand
+ these methods as a whole.
+
+ These methods will be called by the BeautifulSoup constructor:
+ * reset()
+ * feed(markup)
+
+ The tree builder may call these methods from its feed() implementation:
+ * handle_starttag(name, attrs) # See note about return value
+ * handle_endtag(name)
+ * handle_data(data) # Appends to the current data node
+ * endData(containerClass) # Ends the current data node
+
+ No matter how complicated the underlying parser is, you should be
+ able to build a tree using 'start tag' events, 'end tag' events,
+ 'data' events, and "done with data" events.
+
+ If you encounter an empty-element tag (aka a self-closing tag,
+ like HTML's <br> tag), call handle_starttag and then
+ handle_endtag.
+ """
+
+ # Since BeautifulSoup subclasses Tag, it's possible to treat it as
+ # a Tag with a .name. This name makes it clear the BeautifulSoup
+ # object isn't a real markup tag.
+ ROOT_TAG_NAME = '[document]'
+
+ # If the end-user gives no indication which tree builder they
+ # want, look for one with these features.
+ DEFAULT_BUILDER_FEATURES = ['html', 'fast']
+
+ # A string containing all ASCII whitespace characters, used in
+ # endData() to detect data chunks that seem 'empty'.
+ ASCII_SPACES = '\x20\x0a\x09\x0c\x0d'
+
+ NO_PARSER_SPECIFIED_WARNING = "No parser was explicitly specified, so I'm using the best available %(markup_type)s parser for this system (\"%(parser)s\"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.\n\nThe code that caused this warning is on line %(line_number)s of the file %(filename)s. To get rid of this warning, pass the additional argument 'features=\"%(parser)s\"' to the BeautifulSoup constructor.\n"
+
+ def __init__(self, markup="", features=None, builder=None,
+ parse_only=None, from_encoding=None, exclude_encodings=None,
+ element_classes=None, **kwargs):
+ """Constructor.
+
+ :param markup: A string or a file-like object representing
+ markup to be parsed.
+
+ :param features: Desirable features of the parser to be
+ used. This may be the name of a specific parser ("lxml",
+ "lxml-xml", "html.parser", or "html5lib") or it may be the
+ type of markup to be used ("html", "html5", "xml"). It's
+ recommended that you name a specific parser, so that
+ Beautiful Soup gives you the same results across platforms
+ and virtual environments.
+
+ :param builder: A TreeBuilder subclass to instantiate (or
+ instance to use) instead of looking one up based on
+ `features`. You only need to use this if you've implemented a
+ custom TreeBuilder.
+
+ :param parse_only: A SoupStrainer. Only parts of the document
+ matching the SoupStrainer will be considered. This is useful
+ when parsing part of a document that would otherwise be too
+ large to fit into memory.
+
+ :param from_encoding: A string indicating the encoding of the
+ document to be parsed. Pass this in if Beautiful Soup is
+ guessing wrongly about the document's encoding.
+
+ :param exclude_encodings: A list of strings indicating
+ encodings known to be wrong. Pass this in if you don't know
+ the document's encoding but you know Beautiful Soup's guess is
+ wrong.
+
+ :param element_classes: A dictionary mapping BeautifulSoup
+ classes like Tag and NavigableString, to other classes you'd
+ like to be instantiated instead as the parse tree is
+ built. This is useful for subclassing Tag or NavigableString
+ to modify default behavior.
+
+ :param kwargs: For backwards compatibility purposes, the
+ constructor accepts certain keyword arguments used in
+ Beautiful Soup 3. None of these arguments do anything in
+ Beautiful Soup 4; they will result in a warning and then be
+ ignored.
+
+ Apart from this, any keyword arguments passed into the
+ BeautifulSoup constructor are propagated to the TreeBuilder
+ constructor. This makes it possible to configure a
+ TreeBuilder by passing in arguments, not just by saying which
+ one to use.
+ """
+ if 'convertEntities' in kwargs:
+ del kwargs['convertEntities']
+ warnings.warn(
+ "BS4 does not respect the convertEntities argument to the "
+ "BeautifulSoup constructor. Entities are always converted "
+ "to Unicode characters.")
+
+ if 'markupMassage' in kwargs:
+ del kwargs['markupMassage']
+ warnings.warn(
+ "BS4 does not respect the markupMassage argument to the "
+ "BeautifulSoup constructor. The tree builder is responsible "
+ "for any necessary markup massage.")
+
+ if 'smartQuotesTo' in kwargs:
+ del kwargs['smartQuotesTo']
+ warnings.warn(
+ "BS4 does not respect the smartQuotesTo argument to the "
+ "BeautifulSoup constructor. Smart quotes are always converted "
+ "to Unicode characters.")
+
+ if 'selfClosingTags' in kwargs:
+ del kwargs['selfClosingTags']
+ warnings.warn(
+ "BS4 does not respect the selfClosingTags argument to the "
+ "BeautifulSoup constructor. The tree builder is responsible "
+ "for understanding self-closing tags.")
+
+ if 'isHTML' in kwargs:
+ del kwargs['isHTML']
+ warnings.warn(
+ "BS4 does not respect the isHTML argument to the "
+ "BeautifulSoup constructor. Suggest you use "
+ "features='lxml' for HTML and features='lxml-xml' for "
+ "XML.")
+
+ def deprecated_argument(old_name, new_name):
+ if old_name in kwargs:
+ warnings.warn(
+ 'The "%s" argument to the BeautifulSoup constructor '
+ 'has been renamed to "%s."' % (old_name, new_name))
+ value = kwargs[old_name]
+ del kwargs[old_name]
+ return value
+ return None
+
+ parse_only = parse_only or deprecated_argument(
+ "parseOnlyThese", "parse_only")
+
+ from_encoding = from_encoding or deprecated_argument(
+ "fromEncoding", "from_encoding")
+
+ if from_encoding and isinstance(markup, str):
+ warnings.warn("You provided Unicode markup but also provided a value for from_encoding. Your from_encoding will be ignored.")
+ from_encoding = None
+
+ self.element_classes = element_classes or dict()
+
+ # We need this information to track whether or not the builder
+ # was specified well enough that we can omit the 'you need to
+ # specify a parser' warning.
+ original_builder = builder
+ original_features = features
+
+ if isinstance(builder, type):
+ # A builder class was passed in; it needs to be instantiated.
+ builder_class = builder
+ builder = None
+ elif builder is None:
+ if isinstance(features, str):
+ features = [features]
+ if features is None or len(features) == 0:
+ features = self.DEFAULT_BUILDER_FEATURES
+ builder_class = builder_registry.lookup(*features)
+ if builder_class is None:
+ raise FeatureNotFound(
+ "Couldn't find a tree builder with the features you "
+ "requested: %s. Do you need to install a parser library?"
+ % ",".join(features))
+
+ # At this point either we have a TreeBuilder instance in
+ # builder, or we have a builder_class that we can instantiate
+ # with the remaining **kwargs.
+ if builder is None:
+ builder = builder_class(**kwargs)
+ if not original_builder and not (
+ original_features == builder.NAME or
+ original_features in builder.ALTERNATE_NAMES
+ ) and markup:
+ # The user did not tell us which TreeBuilder to use,
+ # and we had to guess. Issue a warning.
+ if builder.is_xml:
+ markup_type = "XML"
+ else:
+ markup_type = "HTML"
+
+ # This code adapted from warnings.py so that we get the same line
+ # of code as our warnings.warn() call gets, even if the answer is wrong
+ # (as it may be in a multithreading situation).
+ caller = None
+ try:
+ caller = sys._getframe(1)
+ except ValueError:
+ pass
+ if caller:
+ globals = caller.f_globals
+ line_number = caller.f_lineno
+ else:
+ globals = sys.__dict__
+ line_number= 1
+ filename = globals.get('__file__')
+ if filename:
+ fnl = filename.lower()
+ if fnl.endswith((".pyc", ".pyo")):
+ filename = filename[:-1]
+ if filename:
+ # If there is no filename at all, the user is most likely in a REPL,
+ # and the warning is not necessary.
+ values = dict(
+ filename=filename,
+ line_number=line_number,
+ parser=builder.NAME,
+ markup_type=markup_type
+ )
+ warnings.warn(
+ self.NO_PARSER_SPECIFIED_WARNING % values,
+ GuessedAtParserWarning, stacklevel=2
+ )
+ else:
+ if kwargs:
+ warnings.warn("Keyword arguments to the BeautifulSoup constructor will be ignored. These would normally be passed into the TreeBuilder constructor, but a TreeBuilder instance was passed in as `builder`.")
+
+ self.builder = builder
+ self.is_xml = builder.is_xml
+ self.known_xml = self.is_xml
+ self._namespaces = dict()
+ self.parse_only = parse_only
+
+ self.builder.initialize_soup(self)
+
+ if hasattr(markup, 'read'): # It's a file-type object.
+ markup = markup.read()
+ elif len(markup) <= 256 and (
+ (isinstance(markup, bytes) and not b'<' in markup)
+ or (isinstance(markup, str) and not '<' in markup)
+ ):
+ # Print out warnings for a couple beginner problems
+ # involving passing non-markup to Beautiful Soup.
+ # Beautiful Soup will still parse the input as markup,
+ # just in case that's what the user really wants.
+ if (isinstance(markup, str)
+ and not os.path.supports_unicode_filenames):
+ possible_filename = markup.encode("utf8")
+ else:
+ possible_filename = markup
+ is_file = False
+ try:
+ is_file = os.path.exists(possible_filename)
+ except Exception as e:
+ # This is almost certainly a problem involving
+ # characters not valid in filenames on this
+ # system. Just let it go.
+ pass
+ if is_file:
+ warnings.warn(
+ '"%s" looks like a filename, not markup. You should'
+ ' probably open this file and pass the filehandle into'
+ ' Beautiful Soup.' % self._decode_markup(markup),
+ MarkupResemblesLocatorWarning
+ )
+ self._check_markup_is_url(markup)
+
+ rejections = []
+ success = False
+ for (self.markup, self.original_encoding, self.declared_html_encoding,
+ self.contains_replacement_characters) in (
+ self.builder.prepare_markup(
+ markup, from_encoding, exclude_encodings=exclude_encodings)):
+ self.reset()
+ try:
+ self._feed()
+ success = True
+ break
+ except ParserRejectedMarkup as e:
+ rejections.append(e)
+ pass
+
+ if not success:
+ other_exceptions = [str(e) for e in rejections]
+ raise ParserRejectedMarkup(
+ "The markup you provided was rejected by the parser. Trying a different parser or a different encoding may help.\n\nOriginal exception(s) from parser:\n " + "\n ".join(other_exceptions)
+ )
+
+ # Clear out the markup and remove the builder's circular
+ # reference to this object.
+ self.markup = None
+ self.builder.soup = None
+
+ def __copy__(self):
+ """Copy a BeautifulSoup object by converting the document to a string and parsing it again."""
+ copy = type(self)(
+ self.encode('utf-8'), builder=self.builder, from_encoding='utf-8'
+ )
+
+ # Although we encoded the tree to UTF-8, that may not have
+ # been the encoding of the original markup. Set the copy's
+ # .original_encoding to reflect the original object's
+ # .original_encoding.
+ copy.original_encoding = self.original_encoding
+ return copy
+
+ def __getstate__(self):
+ # Frequently a tree builder can't be pickled.
+ d = dict(self.__dict__)
+ if 'builder' in d and not self.builder.picklable:
+ d['builder'] = None
+ return d
+
+ @classmethod
+ def _decode_markup(cls, markup):
+ """Ensure `markup` is bytes so it's safe to send into warnings.warn.
+
+ TODO: warnings.warn had this problem back in 2010 but it might not
+ anymore.
+ """
+ if isinstance(markup, bytes):
+ decoded = markup.decode('utf-8', 'replace')
+ else:
+ decoded = markup
+ return decoded
+
+ @classmethod
+ def _check_markup_is_url(cls, markup):
+ """Error-handling method to raise a warning if incoming markup looks
+ like a URL.
+
+ :param markup: A string.
+ """
+ if isinstance(markup, bytes):
+ space = b' '
+ cant_start_with = (b"http:", b"https:")
+ elif isinstance(markup, str):
+ space = ' '
+ cant_start_with = ("http:", "https:")
+ else:
+ return
+
+ if any(markup.startswith(prefix) for prefix in cant_start_with):
+ if not space in markup:
+ warnings.warn(
+ '"%s" looks like a URL. Beautiful Soup is not an'
+ ' HTTP client. You should probably use an HTTP client like'
+ ' requests to get the document behind the URL, and feed'
+ ' that document to Beautiful Soup.' % cls._decode_markup(
+ markup
+ ),
+ MarkupResemblesLocatorWarning
+ )
+
+ def _feed(self):
+ """Internal method that parses previously set markup, creating a large
+ number of Tag and NavigableString objects.
+ """
+ # Convert the document to Unicode.
+ self.builder.reset()
+
+ self.builder.feed(self.markup)
+ # Close out any unfinished strings and close all the open tags.
+ self.endData()
+ while self.currentTag.name != self.ROOT_TAG_NAME:
+ self.popTag()
+
+ def reset(self):
+ """Reset this object to a state as though it had never parsed any
+ markup.
+ """
+ Tag.__init__(self, self, self.builder, self.ROOT_TAG_NAME)
+ self.hidden = 1
+ self.builder.reset()
+ self.current_data = []
+ self.currentTag = None
+ self.tagStack = []
+ self.open_tag_counter = Counter()
+ self.preserve_whitespace_tag_stack = []
+ self.string_container_stack = []
+ self.pushTag(self)
+
+ def new_tag(self, name, namespace=None, nsprefix=None, attrs={},
+ sourceline=None, sourcepos=None, **kwattrs):
+ """Create a new Tag associated with this BeautifulSoup object.
+
+ :param name: The name of the new Tag.
+ :param namespace: The URI of the new Tag's XML namespace, if any.
+ :param prefix: The prefix for the new Tag's XML namespace, if any.
+ :param attrs: A dictionary of this Tag's attribute values; can
+ be used instead of `kwattrs` for attributes like 'class'
+ that are reserved words in Python.
+ :param sourceline: The line number where this tag was
+ (purportedly) found in its source document.
+ :param sourcepos: The character position within `sourceline` where this
+ tag was (purportedly) found.
+ :param kwattrs: Keyword arguments for the new Tag's attribute values.
+
+ """
+ kwattrs.update(attrs)
+ return self.element_classes.get(Tag, Tag)(
+ None, self.builder, name, namespace, nsprefix, kwattrs,
+ sourceline=sourceline, sourcepos=sourcepos
+ )
+
+ def string_container(self, base_class=None):
+ container = base_class or NavigableString
+
+ # There may be a general override of NavigableString.
+ container = self.element_classes.get(
+ container, container
+ )
+
+ # On top of that, we may be inside a tag that needs a special
+ # container class.
+ if self.string_container_stack:
+ container = self.builder.string_containers.get(
+ self.string_container_stack[-1].name, container
+ )
+ return container
+
+ def new_string(self, s, subclass=None):
+ """Create a new NavigableString associated with this BeautifulSoup
+ object.
+ """
+ container = self.string_container(subclass)
+ return container(s)
+
+ def insert_before(self, *args):
+ """This method is part of the PageElement API, but `BeautifulSoup` doesn't implement
+ it because there is nothing before or after it in the parse tree.
+ """
+ raise NotImplementedError("BeautifulSoup objects don't support insert_before().")
+
+ def insert_after(self, *args):
+ """This method is part of the PageElement API, but `BeautifulSoup` doesn't implement
+ it because there is nothing before or after it in the parse tree.
+ """
+ raise NotImplementedError("BeautifulSoup objects don't support insert_after().")
+
+ def popTag(self):
+ """Internal method called by _popToTag when a tag is closed."""
+ tag = self.tagStack.pop()
+ if tag.name in self.open_tag_counter:
+ self.open_tag_counter[tag.name] -= 1
+ if self.preserve_whitespace_tag_stack and tag == self.preserve_whitespace_tag_stack[-1]:
+ self.preserve_whitespace_tag_stack.pop()
+ if self.string_container_stack and tag == self.string_container_stack[-1]:
+ self.string_container_stack.pop()
+ #print("Pop", tag.name)
+ if self.tagStack:
+ self.currentTag = self.tagStack[-1]
+ return self.currentTag
+
+ def pushTag(self, tag):
+ """Internal method called by handle_starttag when a tag is opened."""
+ #print("Push", tag.name)
+ if self.currentTag is not None:
+ self.currentTag.contents.append(tag)
+ self.tagStack.append(tag)
+ self.currentTag = self.tagStack[-1]
+ if tag.name != self.ROOT_TAG_NAME:
+ self.open_tag_counter[tag.name] += 1
+ if tag.name in self.builder.preserve_whitespace_tags:
+ self.preserve_whitespace_tag_stack.append(tag)
+ if tag.name in self.builder.string_containers:
+ self.string_container_stack.append(tag)
+
+ def endData(self, containerClass=None):
+ """Method called by the TreeBuilder when the end of a data segment
+ occurs.
+ """
+ containerClass = self.string_container(containerClass)
+
+ if self.current_data:
+ current_data = ''.join(self.current_data)
+ # If whitespace is not preserved, and this string contains
+ # nothing but ASCII spaces, replace it with a single space
+ # or newline.
+ if not self.preserve_whitespace_tag_stack:
+ strippable = True
+ for i in current_data:
+ if i not in self.ASCII_SPACES:
+ strippable = False
+ break
+ if strippable:
+ if '\n' in current_data:
+ current_data = '\n'
+ else:
+ current_data = ' '
+
+ # Reset the data collector.
+ self.current_data = []
+
+ # Should we add this string to the tree at all?
+ if self.parse_only and len(self.tagStack) <= 1 and \
+ (not self.parse_only.text or \
+ not self.parse_only.search(current_data)):
+ return
+
+ o = containerClass(current_data)
+ self.object_was_parsed(o)
+
+ def object_was_parsed(self, o, parent=None, most_recent_element=None):
+ """Method called by the TreeBuilder to integrate an object into the parse tree."""
+ if parent is None:
+ parent = self.currentTag
+ if most_recent_element is not None:
+ previous_element = most_recent_element
+ else:
+ previous_element = self._most_recent_element
+
+ next_element = previous_sibling = next_sibling = None
+ if isinstance(o, Tag):
+ next_element = o.next_element
+ next_sibling = o.next_sibling
+ previous_sibling = o.previous_sibling
+ if previous_element is None:
+ previous_element = o.previous_element
+
+ fix = parent.next_element is not None
+
+ o.setup(parent, previous_element, next_element, previous_sibling, next_sibling)
+
+ self._most_recent_element = o
+ parent.contents.append(o)
+
+ # Check if we are inserting into an already parsed node.
+ if fix:
+ self._linkage_fixer(parent)
+
+ def _linkage_fixer(self, el):
+ """Make sure linkage of this fragment is sound."""
+
+ first = el.contents[0]
+ child = el.contents[-1]
+ descendant = child
+
+ if child is first and el.parent is not None:
+ # Parent should be linked to first child
+ el.next_element = child
+ # We are no longer linked to whatever this element is
+ prev_el = child.previous_element
+ if prev_el is not None and prev_el is not el:
+ prev_el.next_element = None
+ # First child should be linked to the parent, and no previous siblings.
+ child.previous_element = el
+ child.previous_sibling = None
+
+ # We have no sibling as we've been appended as the last.
+ child.next_sibling = None
+
+ # This index is a tag, dig deeper for a "last descendant"
+ if isinstance(child, Tag) and child.contents:
+ descendant = child._last_descendant(False)
+
+ # As the final step, link last descendant. It should be linked
+ # to the parent's next sibling (if found), else walk up the chain
+ # and find a parent with a sibling. It should have no next sibling.
+ descendant.next_element = None
+ descendant.next_sibling = None
+ target = el
+ while True:
+ if target is None:
+ break
+ elif target.next_sibling is not None:
+ descendant.next_element = target.next_sibling
+ target.next_sibling.previous_element = child
+ break
+ target = target.parent
+
+ def _popToTag(self, name, nsprefix=None, inclusivePop=True):
+ """Pops the tag stack up to and including the most recent
+ instance of the given tag.
+
+ If there are no open tags with the given name, nothing will be
+ popped.
+
+ :param name: Pop up to the most recent tag with this name.
+ :param nsprefix: The namespace prefix that goes with `name`.
+ :param inclusivePop: It this is false, pops the tag stack up
+ to but *not* including the most recent instqance of the
+ given tag.
+
+ """
+ #print("Popping to %s" % name)
+ if name == self.ROOT_TAG_NAME:
+ # The BeautifulSoup object itself can never be popped.
+ return
+
+ most_recently_popped = None
+
+ stack_size = len(self.tagStack)
+ for i in range(stack_size - 1, 0, -1):
+ if not self.open_tag_counter.get(name):
+ break
+ t = self.tagStack[i]
+ if (name == t.name and nsprefix == t.prefix):
+ if inclusivePop:
+ most_recently_popped = self.popTag()
+ break
+ most_recently_popped = self.popTag()
+
+ return most_recently_popped
+
+ def handle_starttag(self, name, namespace, nsprefix, attrs, sourceline=None,
+ sourcepos=None):
+ """Called by the tree builder when a new tag is encountered.
+
+ :param name: Name of the tag.
+ :param nsprefix: Namespace prefix for the tag.
+ :param attrs: A dictionary of attribute values.
+ :param sourceline: The line number where this tag was found in its
+ source document.
+ :param sourcepos: The character position within `sourceline` where this
+ tag was found.
+
+ If this method returns None, the tag was rejected by an active
+ SoupStrainer. You should proceed as if the tag had not occurred
+ in the document. For instance, if this was a self-closing tag,
+ don't call handle_endtag.
+ """
+ # print("Start tag %s: %s" % (name, attrs))
+ self.endData()
+
+ if (self.parse_only and len(self.tagStack) <= 1
+ and (self.parse_only.text
+ or not self.parse_only.search_tag(name, attrs))):
+ return None
+
+ tag = self.element_classes.get(Tag, Tag)(
+ self, self.builder, name, namespace, nsprefix, attrs,
+ self.currentTag, self._most_recent_element,
+ sourceline=sourceline, sourcepos=sourcepos
+ )
+ if tag is None:
+ return tag
+ if self._most_recent_element is not None:
+ self._most_recent_element.next_element = tag
+ self._most_recent_element = tag
+ self.pushTag(tag)
+ return tag
+
+ def handle_endtag(self, name, nsprefix=None):
+ """Called by the tree builder when an ending tag is encountered.
+
+ :param name: Name of the tag.
+ :param nsprefix: Namespace prefix for the tag.
+ """
+ #print("End tag: " + name)
+ self.endData()
+ self._popToTag(name, nsprefix)
+
+ def handle_data(self, data):
+ """Called by the tree builder when a chunk of textual data is encountered."""
+ self.current_data.append(data)
+
+ def decode(self, pretty_print=False,
+ eventual_encoding=DEFAULT_OUTPUT_ENCODING,
+ formatter="minimal"):
+ """Returns a string or Unicode representation of the parse tree
+ as an HTML or XML document.
+
+ :param pretty_print: If this is True, indentation will be used to
+ make the document more readable.
+ :param eventual_encoding: The encoding of the final document.
+ If this is None, the document will be a Unicode string.
+ """
+ if self.is_xml:
+ # Print the XML declaration
+ encoding_part = ''
+ if eventual_encoding in PYTHON_SPECIFIC_ENCODINGS:
+ # This is a special Python encoding; it can't actually
+ # go into an XML document because it means nothing
+ # outside of Python.
+ eventual_encoding = None
+ if eventual_encoding != None:
+ encoding_part = ' encoding="%s"' % eventual_encoding
+ prefix = '<?xml version="1.0"%s?>\n' % encoding_part
+ else:
+ prefix = ''
+ if not pretty_print:
+ indent_level = None
+ else:
+ indent_level = 0
+ return prefix + super(BeautifulSoup, self).decode(
+ indent_level, eventual_encoding, formatter)
+
+# Aliases to make it easier to get started quickly, e.g. 'from bs4 import _soup'
+_s = BeautifulSoup
+_soup = BeautifulSoup
+
+class BeautifulStoneSoup(BeautifulSoup):
+ """Deprecated interface to an XML parser."""
+
+ def __init__(self, *args, **kwargs):
+ kwargs['features'] = 'xml'
+ warnings.warn(
+ 'The BeautifulStoneSoup class is deprecated. Instead of using '
+ 'it, pass features="xml" into the BeautifulSoup constructor.')
+ super(BeautifulStoneSoup, self).__init__(*args, **kwargs)
+
+
+class StopParsing(Exception):
+ """Exception raised by a TreeBuilder if it's unable to continue parsing."""
+ pass
+
+class FeatureNotFound(ValueError):
+ """Exception raised by the BeautifulSoup constructor if no parser with the
+ requested features is found.
+ """
+ pass
+
+
+#If this file is run as a script, act as an HTML pretty-printer.
+if __name__ == '__main__':
+ import sys
+ soup = BeautifulSoup(sys.stdin)
+ print((soup.prettify()))
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/builder/__init__.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/builder/__init__.py
new file mode 100644
index 00000000000..03fbd6a8114
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/builder/__init__.py
@@ -0,0 +1,519 @@
+# Use of this source code is governed by the MIT license.
+__license__ = "MIT"
+
+from collections import defaultdict
+import itertools
+import sys
+from bs4.element import (
+ CharsetMetaAttributeValue,
+ ContentMetaAttributeValue,
+ Stylesheet,
+ Script,
+ TemplateString,
+ nonwhitespace_re
+)
+
+__all__ = [
+ 'HTMLTreeBuilder',
+ 'SAXTreeBuilder',
+ 'TreeBuilder',
+ 'TreeBuilderRegistry',
+ ]
+
+# Some useful features for a TreeBuilder to have.
+FAST = 'fast'
+PERMISSIVE = 'permissive'
+STRICT = 'strict'
+XML = 'xml'
+HTML = 'html'
+HTML_5 = 'html5'
+
+
+class TreeBuilderRegistry(object):
+ """A way of looking up TreeBuilder subclasses by their name or by desired
+ features.
+ """
+
+ def __init__(self):
+ self.builders_for_feature = defaultdict(list)
+ self.builders = []
+
+ def register(self, treebuilder_class):
+ """Register a treebuilder based on its advertised features.
+
+ :param treebuilder_class: A subclass of Treebuilder. its .features
+ attribute should list its features.
+ """
+ for feature in treebuilder_class.features:
+ self.builders_for_feature[feature].insert(0, treebuilder_class)
+ self.builders.insert(0, treebuilder_class)
+
+ def lookup(self, *features):
+ """Look up a TreeBuilder subclass with the desired features.
+
+ :param features: A list of features to look for. If none are
+ provided, the most recently registered TreeBuilder subclass
+ will be used.
+ :return: A TreeBuilder subclass, or None if there's no
+ registered subclass with all the requested features.
+ """
+ if len(self.builders) == 0:
+ # There are no builders at all.
+ return None
+
+ if len(features) == 0:
+ # They didn't ask for any features. Give them the most
+ # recently registered builder.
+ return self.builders[0]
+
+ # Go down the list of features in order, and eliminate any builders
+ # that don't match every feature.
+ features = list(features)
+ features.reverse()
+ candidates = None
+ candidate_set = None
+ while len(features) > 0:
+ feature = features.pop()
+ we_have_the_feature = self.builders_for_feature.get(feature, [])
+ if len(we_have_the_feature) > 0:
+ if candidates is None:
+ candidates = we_have_the_feature
+ candidate_set = set(candidates)
+ else:
+ # Eliminate any candidates that don't have this feature.
+ candidate_set = candidate_set.intersection(
+ set(we_have_the_feature))
+
+ # The only valid candidates are the ones in candidate_set.
+ # Go through the original list of candidates and pick the first one
+ # that's in candidate_set.
+ if candidate_set is None:
+ return None
+ for candidate in candidates:
+ if candidate in candidate_set:
+ return candidate
+ return None
+
+# The BeautifulSoup class will take feature lists from developers and use them
+# to look up builders in this registry.
+builder_registry = TreeBuilderRegistry()
+
+class TreeBuilder(object):
+ """Turn a textual document into a Beautiful Soup object tree."""
+
+ NAME = "[Unknown tree builder]"
+ ALTERNATE_NAMES = []
+ features = []
+
+ is_xml = False
+ picklable = False
+ empty_element_tags = None # A tag will be considered an empty-element
+ # tag when and only when it has no contents.
+
+ # A value for these tag/attribute combinations is a space- or
+ # comma-separated list of CDATA, rather than a single CDATA.
+ DEFAULT_CDATA_LIST_ATTRIBUTES = {}
+
+ # Whitespace should be preserved inside these tags.
+ DEFAULT_PRESERVE_WHITESPACE_TAGS = set()
+
+ # The textual contents of tags with these names should be
+ # instantiated with some class other than NavigableString.
+ DEFAULT_STRING_CONTAINERS = {}
+
+ USE_DEFAULT = object()
+
+ # Most parsers don't keep track of line numbers.
+ TRACKS_LINE_NUMBERS = False
+
+ def __init__(self, multi_valued_attributes=USE_DEFAULT,
+ preserve_whitespace_tags=USE_DEFAULT,
+ store_line_numbers=USE_DEFAULT,
+ string_containers=USE_DEFAULT,
+ ):
+ """Constructor.
+
+ :param multi_valued_attributes: If this is set to None, the
+ TreeBuilder will not turn any values for attributes like
+ 'class' into lists. Setting this to a dictionary will
+ customize this behavior; look at DEFAULT_CDATA_LIST_ATTRIBUTES
+ for an example.
+
+ Internally, these are called "CDATA list attributes", but that
+ probably doesn't make sense to an end-user, so the argument name
+ is `multi_valued_attributes`.
+
+ :param preserve_whitespace_tags: A list of tags to treat
+ the way <pre> tags are treated in HTML. Tags in this list
+ are immune from pretty-printing; their contents will always be
+ output as-is.
+
+ :param string_containers: A dictionary mapping tag names to
+ the classes that should be instantiated to contain the textual
+ contents of those tags. The default is to use NavigableString
+ for every tag, no matter what the name. You can override the
+ default by changing DEFAULT_STRING_CONTAINERS.
+
+ :param store_line_numbers: If the parser keeps track of the
+ line numbers and positions of the original markup, that
+ information will, by default, be stored in each corresponding
+ `Tag` object. You can turn this off by passing
+ store_line_numbers=False. If the parser you're using doesn't
+ keep track of this information, then setting store_line_numbers=True
+ will do nothing.
+ """
+ self.soup = None
+ if multi_valued_attributes is self.USE_DEFAULT:
+ multi_valued_attributes = self.DEFAULT_CDATA_LIST_ATTRIBUTES
+ self.cdata_list_attributes = multi_valued_attributes
+ if preserve_whitespace_tags is self.USE_DEFAULT:
+ preserve_whitespace_tags = self.DEFAULT_PRESERVE_WHITESPACE_TAGS
+ self.preserve_whitespace_tags = preserve_whitespace_tags
+ if store_line_numbers == self.USE_DEFAULT:
+ store_line_numbers = self.TRACKS_LINE_NUMBERS
+ self.store_line_numbers = store_line_numbers
+ if string_containers == self.USE_DEFAULT:
+ string_containers = self.DEFAULT_STRING_CONTAINERS
+ self.string_containers = string_containers
+
+ def initialize_soup(self, soup):
+ """The BeautifulSoup object has been initialized and is now
+ being associated with the TreeBuilder.
+
+ :param soup: A BeautifulSoup object.
+ """
+ self.soup = soup
+
+ def reset(self):
+ """Do any work necessary to reset the underlying parser
+ for a new document.
+
+ By default, this does nothing.
+ """
+ pass
+
+ def can_be_empty_element(self, tag_name):
+ """Might a tag with this name be an empty-element tag?
+
+ The final markup may or may not actually present this tag as
+ self-closing.
+
+ For instance: an HTMLBuilder does not consider a <p> tag to be
+ an empty-element tag (it's not in
+ HTMLBuilder.empty_element_tags). This means an empty <p> tag
+ will be presented as "<p></p>", not "<p/>" or "<p>".
+
+ The default implementation has no opinion about which tags are
+ empty-element tags, so a tag will be presented as an
+ empty-element tag if and only if it has no children.
+ "<foo></foo>" will become "<foo/>", and "<foo>bar</foo>" will
+ be left alone.
+
+ :param tag_name: The name of a markup tag.
+ """
+ if self.empty_element_tags is None:
+ return True
+ return tag_name in self.empty_element_tags
+
+ def feed(self, markup):
+ """Run some incoming markup through some parsing process,
+ populating the `BeautifulSoup` object in self.soup.
+
+ This method is not implemented in TreeBuilder; it must be
+ implemented in subclasses.
+
+ :return: None.
+ """
+ raise NotImplementedError()
+
+ def prepare_markup(self, markup, user_specified_encoding=None,
+ document_declared_encoding=None, exclude_encodings=None):
+ """Run any preliminary steps necessary to make incoming markup
+ acceptable to the parser.
+
+ :param markup: Some markup -- probably a bytestring.
+ :param user_specified_encoding: The user asked to try this encoding.
+ :param document_declared_encoding: The markup itself claims to be
+ in this encoding.
+ :param exclude_encodings: The user asked _not_ to try any of
+ these encodings.
+
+ :yield: A series of 4-tuples:
+ (markup, encoding, declared encoding,
+ has undergone character replacement)
+
+ Each 4-tuple represents a strategy for converting the
+ document to Unicode and parsing it. Each strategy will be tried
+ in turn.
+
+ By default, the only strategy is to parse the markup
+ as-is. See `LXMLTreeBuilderForXML` and
+ `HTMLParserTreeBuilder` for implementations that take into
+ account the quirks of particular parsers.
+ """
+ yield markup, None, None, False
+
+ def test_fragment_to_document(self, fragment):
+ """Wrap an HTML fragment to make it look like a document.
+
+ Different parsers do this differently. For instance, lxml
+ introduces an empty <head> tag, and html5lib
+ doesn't. Abstracting this away lets us write simple tests
+ which run HTML fragments through the parser and compare the
+ results against other HTML fragments.
+
+ This method should not be used outside of tests.
+
+ :param fragment: A string -- fragment of HTML.
+ :return: A string -- a full HTML document.
+ """
+ return fragment
+
+ def set_up_substitutions(self, tag):
+ """Set up any substitutions that will need to be performed on
+ a `Tag` when it's output as a string.
+
+ By default, this does nothing. See `HTMLTreeBuilder` for a
+ case where this is used.
+
+ :param tag: A `Tag`
+ :return: Whether or not a substitution was performed.
+ """
+ return False
+
+ def _replace_cdata_list_attribute_values(self, tag_name, attrs):
+ """When an attribute value is associated with a tag that can
+ have multiple values for that attribute, convert the string
+ value to a list of strings.
+
+ Basically, replaces class="foo bar" with class=["foo", "bar"]
+
+ NOTE: This method modifies its input in place.
+
+ :param tag_name: The name of a tag.
+ :param attrs: A dictionary containing the tag's attributes.
+ Any appropriate attribute values will be modified in place.
+ """
+ if not attrs:
+ return attrs
+ if self.cdata_list_attributes:
+ universal = self.cdata_list_attributes.get('*', [])
+ tag_specific = self.cdata_list_attributes.get(
+ tag_name.lower(), None)
+ for attr in list(attrs.keys()):
+ if attr in universal or (tag_specific and attr in tag_specific):
+ # We have a "class"-type attribute whose string
+ # value is a whitespace-separated list of
+ # values. Split it into a list.
+ value = attrs[attr]
+ if isinstance(value, str):
+ values = nonwhitespace_re.findall(value)
+ else:
+ # html5lib sometimes calls setAttributes twice
+ # for the same tag when rearranging the parse
+ # tree. On the second call the attribute value
+ # here is already a list. If this happens,
+ # leave the value alone rather than trying to
+ # split it again.
+ values = value
+ attrs[attr] = values
+ return attrs
+
+class SAXTreeBuilder(TreeBuilder):
+ """A Beautiful Soup treebuilder that listens for SAX events.
+
+ This is not currently used for anything, but it demonstrates
+ how a simple TreeBuilder would work.
+ """
+
+ def feed(self, markup):
+ raise NotImplementedError()
+
+ def close(self):
+ pass
+
+ def startElement(self, name, attrs):
+ attrs = dict((key[1], value) for key, value in list(attrs.items()))
+ #print("Start %s, %r" % (name, attrs))
+ self.soup.handle_starttag(name, attrs)
+
+ def endElement(self, name):
+ #print("End %s" % name)
+ self.soup.handle_endtag(name)
+
+ def startElementNS(self, nsTuple, nodeName, attrs):
+ # Throw away (ns, nodeName) for now.
+ self.startElement(nodeName, attrs)
+
+ def endElementNS(self, nsTuple, nodeName):
+ # Throw away (ns, nodeName) for now.
+ self.endElement(nodeName)
+ #handler.endElementNS((ns, node.nodeName), node.nodeName)
+
+ def startPrefixMapping(self, prefix, nodeValue):
+ # Ignore the prefix for now.
+ pass
+
+ def endPrefixMapping(self, prefix):
+ # Ignore the prefix for now.
+ # handler.endPrefixMapping(prefix)
+ pass
+
+ def characters(self, content):
+ self.soup.handle_data(content)
+
+ def startDocument(self):
+ pass
+
+ def endDocument(self):
+ pass
+
+
+class HTMLTreeBuilder(TreeBuilder):
+ """This TreeBuilder knows facts about HTML.
+
+ Such as which tags are empty-element tags.
+ """
+
+ empty_element_tags = set([
+ # These are from HTML5.
+ 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr',
+
+ # These are from earlier versions of HTML and are removed in HTML5.
+ 'basefont', 'bgsound', 'command', 'frame', 'image', 'isindex', 'nextid', 'spacer'
+ ])
+
+ # The HTML standard defines these as block-level elements. Beautiful
+ # Soup does not treat these elements differently from other elements,
+ # but it may do so eventually, and this information is available if
+ # you need to use it.
+ block_elements = set(["address", "article", "aside", "blockquote", "canvas", "dd", "div", "dl", "dt", "fieldset", "figcaption", "figure", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "header", "hr", "li", "main", "nav", "noscript", "ol", "output", "p", "pre", "section", "table", "tfoot", "ul", "video"])
+
+ # The HTML standard defines an unusual content model for these tags.
+ # We represent this by using a string class other than NavigableString
+ # inside these tags.
+ #
+ # I made this list by going through the HTML spec
+ # (https://html.spec.whatwg.org/#metadata-content) and looking for
+ # "metadata content" elements that can contain strings.
+ #
+ # TODO: Arguably <noscript> could go here but it seems
+ # qualitatively different from the other tags.
+ DEFAULT_STRING_CONTAINERS = {
+ 'style': Stylesheet,
+ 'script': Script,
+ 'template': TemplateString,
+ }
+
+ # The HTML standard defines these attributes as containing a
+ # space-separated list of values, not a single value. That is,
+ # class="foo bar" means that the 'class' attribute has two values,
+ # 'foo' and 'bar', not the single value 'foo bar'. When we
+ # encounter one of these attributes, we will parse its value into
+ # a list of values if possible. Upon output, the list will be
+ # converted back into a string.
+ DEFAULT_CDATA_LIST_ATTRIBUTES = {
+ "*" : ['class', 'accesskey', 'dropzone'],
+ "a" : ['rel', 'rev'],
+ "link" : ['rel', 'rev'],
+ "td" : ["headers"],
+ "th" : ["headers"],
+ "td" : ["headers"],
+ "form" : ["accept-charset"],
+ "object" : ["archive"],
+
+ # These are HTML5 specific, as are *.accesskey and *.dropzone above.
+ "area" : ["rel"],
+ "icon" : ["sizes"],
+ "iframe" : ["sandbox"],
+ "output" : ["for"],
+ }
+
+ DEFAULT_PRESERVE_WHITESPACE_TAGS = set(['pre', 'textarea'])
+
+ def set_up_substitutions(self, tag):
+ """Replace the declared encoding in a <meta> tag with a placeholder,
+ to be substituted when the tag is output to a string.
+
+ An HTML document may come in to Beautiful Soup as one
+ encoding, but exit in a different encoding, and the <meta> tag
+ needs to be changed to reflect this.
+
+ :param tag: A `Tag`
+ :return: Whether or not a substitution was performed.
+ """
+ # We are only interested in <meta> tags
+ if tag.name != 'meta':
+ return False
+
+ http_equiv = tag.get('http-equiv')
+ content = tag.get('content')
+ charset = tag.get('charset')
+
+ # We are interested in <meta> tags that say what encoding the
+ # document was originally in. This means HTML 5-style <meta>
+ # tags that provide the "charset" attribute. It also means
+ # HTML 4-style <meta> tags that provide the "content"
+ # attribute and have "http-equiv" set to "content-type".
+ #
+ # In both cases we will replace the value of the appropriate
+ # attribute with a standin object that can take on any
+ # encoding.
+ meta_encoding = None
+ if charset is not None:
+ # HTML 5 style:
+ # <meta charset="utf8">
+ meta_encoding = charset
+ tag['charset'] = CharsetMetaAttributeValue(charset)
+
+ elif (content is not None and http_equiv is not None
+ and http_equiv.lower() == 'content-type'):
+ # HTML 4 style:
+ # <meta http-equiv="content-type" content="text/html; charset=utf8">
+ tag['content'] = ContentMetaAttributeValue(content)
+
+ return (meta_encoding is not None)
+
+def register_treebuilders_from(module):
+ """Copy TreeBuilders from the given module into this module."""
+ this_module = sys.modules[__name__]
+ for name in module.__all__:
+ obj = getattr(module, name)
+
+ if issubclass(obj, TreeBuilder):
+ setattr(this_module, name, obj)
+ this_module.__all__.append(name)
+ # Register the builder while we're at it.
+ this_module.builder_registry.register(obj)
+
+class ParserRejectedMarkup(Exception):
+ """An Exception to be raised when the underlying parser simply
+ refuses to parse the given markup.
+ """
+ def __init__(self, message_or_exception):
+ """Explain why the parser rejected the given markup, either
+ with a textual explanation or another exception.
+ """
+ if isinstance(message_or_exception, Exception):
+ e = message_or_exception
+ message_or_exception = "%s: %s" % (e.__class__.__name__, str(e))
+ super(ParserRejectedMarkup, self).__init__(message_or_exception)
+
+# Builders are registered in reverse order of priority, so that custom
+# builder registrations will take precedence. In general, we want lxml
+# to take precedence over html5lib, because it's faster. And we only
+# want to use HTMLParser as a last resort.
+from . import _htmlparser
+register_treebuilders_from(_htmlparser)
+try:
+ from . import _html5lib
+ register_treebuilders_from(_html5lib)
+except ImportError:
+ # They don't have html5lib installed.
+ pass
+try:
+ from . import _lxml
+ register_treebuilders_from(_lxml)
+except ImportError:
+ # They don't have lxml installed.
+ pass
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/builder/_html5lib.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/builder/_html5lib.py
new file mode 100644
index 00000000000..69aefd728d2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/builder/_html5lib.py
@@ -0,0 +1,467 @@
+# Use of this source code is governed by the MIT license.
+__license__ = "MIT"
+
+__all__ = [
+ 'HTML5TreeBuilder',
+ ]
+
+import warnings
+import re
+from bs4.builder import (
+ PERMISSIVE,
+ HTML,
+ HTML_5,
+ HTMLTreeBuilder,
+ )
+from bs4.element import (
+ NamespacedAttribute,
+ nonwhitespace_re,
+)
+import html5lib
+from html5lib.constants import (
+ namespaces,
+ prefixes,
+ )
+from bs4.element import (
+ Comment,
+ Doctype,
+ NavigableString,
+ Tag,
+ )
+
+try:
+ # Pre-0.99999999
+ from html5lib.treebuilders import _base as treebuilder_base
+ new_html5lib = False
+except ImportError as e:
+ # 0.99999999 and up
+ from html5lib.treebuilders import base as treebuilder_base
+ new_html5lib = True
+
+class HTML5TreeBuilder(HTMLTreeBuilder):
+ """Use html5lib to build a tree.
+
+ Note that this TreeBuilder does not support some features common
+ to HTML TreeBuilders. Some of these features could theoretically
+ be implemented, but at the very least it's quite difficult,
+ because html5lib moves the parse tree around as it's being built.
+
+ * This TreeBuilder doesn't use different subclasses of NavigableString
+ based on the name of the tag in which the string was found.
+
+ * You can't use a SoupStrainer to parse only part of a document.
+ """
+
+ NAME = "html5lib"
+
+ features = [NAME, PERMISSIVE, HTML_5, HTML]
+
+ # html5lib can tell us which line number and position in the
+ # original file is the source of an element.
+ TRACKS_LINE_NUMBERS = True
+
+ def prepare_markup(self, markup, user_specified_encoding,
+ document_declared_encoding=None, exclude_encodings=None):
+ # Store the user-specified encoding for use later on.
+ self.user_specified_encoding = user_specified_encoding
+
+ # document_declared_encoding and exclude_encodings aren't used
+ # ATM because the html5lib TreeBuilder doesn't use
+ # UnicodeDammit.
+ if exclude_encodings:
+ warnings.warn("You provided a value for exclude_encoding, but the html5lib tree builder doesn't support exclude_encoding.")
+ yield (markup, None, None, False)
+
+ # These methods are defined by Beautiful Soup.
+ def feed(self, markup):
+ if self.soup.parse_only is not None:
+ warnings.warn("You provided a value for parse_only, but the html5lib tree builder doesn't support parse_only. The entire document will be parsed.")
+ parser = html5lib.HTMLParser(tree=self.create_treebuilder)
+ self.underlying_builder.parser = parser
+ extra_kwargs = dict()
+ if not isinstance(markup, str):
+ if new_html5lib:
+ extra_kwargs['override_encoding'] = self.user_specified_encoding
+ else:
+ extra_kwargs['encoding'] = self.user_specified_encoding
+ doc = parser.parse(markup, **extra_kwargs)
+
+ # Set the character encoding detected by the tokenizer.
+ if isinstance(markup, str):
+ # We need to special-case this because html5lib sets
+ # charEncoding to UTF-8 if it gets Unicode input.
+ doc.original_encoding = None
+ else:
+ original_encoding = parser.tokenizer.stream.charEncoding[0]
+ if not isinstance(original_encoding, str):
+ # In 0.99999999 and up, the encoding is an html5lib
+ # Encoding object. We want to use a string for compatibility
+ # with other tree builders.
+ original_encoding = original_encoding.name
+ doc.original_encoding = original_encoding
+ self.underlying_builder.parser = None
+
+ def create_treebuilder(self, namespaceHTMLElements):
+ self.underlying_builder = TreeBuilderForHtml5lib(
+ namespaceHTMLElements, self.soup,
+ store_line_numbers=self.store_line_numbers
+ )
+ return self.underlying_builder
+
+ def test_fragment_to_document(self, fragment):
+ """See `TreeBuilder`."""
+ return '<html><head></head><body>%s</body></html>' % fragment
+
+
+class TreeBuilderForHtml5lib(treebuilder_base.TreeBuilder):
+
+ def __init__(self, namespaceHTMLElements, soup=None,
+ store_line_numbers=True, **kwargs):
+ if soup:
+ self.soup = soup
+ else:
+ from bs4 import BeautifulSoup
+ # TODO: Why is the parser 'html.parser' here? To avoid an
+ # infinite loop?
+ self.soup = BeautifulSoup(
+ "", "html.parser", store_line_numbers=store_line_numbers,
+ **kwargs
+ )
+ # TODO: What are **kwargs exactly? Should they be passed in
+ # here in addition to/instead of being passed to the BeautifulSoup
+ # constructor?
+ super(TreeBuilderForHtml5lib, self).__init__(namespaceHTMLElements)
+
+ # This will be set later to an html5lib.html5parser.HTMLParser
+ # object, which we can use to track the current line number.
+ self.parser = None
+ self.store_line_numbers = store_line_numbers
+
+ def documentClass(self):
+ self.soup.reset()
+ return Element(self.soup, self.soup, None)
+
+ def insertDoctype(self, token):
+ name = token["name"]
+ publicId = token["publicId"]
+ systemId = token["systemId"]
+
+ doctype = Doctype.for_name_and_ids(name, publicId, systemId)
+ self.soup.object_was_parsed(doctype)
+
+ def elementClass(self, name, namespace):
+ kwargs = {}
+ if self.parser and self.store_line_numbers:
+ # This represents the point immediately after the end of the
+ # tag. We don't know when the tag started, but we do know
+ # where it ended -- the character just before this one.
+ sourceline, sourcepos = self.parser.tokenizer.stream.position()
+ kwargs['sourceline'] = sourceline
+ kwargs['sourcepos'] = sourcepos-1
+ tag = self.soup.new_tag(name, namespace, **kwargs)
+
+ return Element(tag, self.soup, namespace)
+
+ def commentClass(self, data):
+ return TextNode(Comment(data), self.soup)
+
+ def fragmentClass(self):
+ from bs4 import BeautifulSoup
+ # TODO: Why is the parser 'html.parser' here? To avoid an
+ # infinite loop?
+ self.soup = BeautifulSoup("", "html.parser")
+ self.soup.name = "[document_fragment]"
+ return Element(self.soup, self.soup, None)
+
+ def appendChild(self, node):
+ # XXX This code is not covered by the BS4 tests.
+ self.soup.append(node.element)
+
+ def getDocument(self):
+ return self.soup
+
+ def getFragment(self):
+ return treebuilder_base.TreeBuilder.getFragment(self).element
+
+ def testSerializer(self, element):
+ from bs4 import BeautifulSoup
+ rv = []
+ doctype_re = re.compile(r'^(.*?)(?: PUBLIC "(.*?)"(?: "(.*?)")?| SYSTEM "(.*?)")?$')
+
+ def serializeElement(element, indent=0):
+ if isinstance(element, BeautifulSoup):
+ pass
+ if isinstance(element, Doctype):
+ m = doctype_re.match(element)
+ if m:
+ name = m.group(1)
+ if m.lastindex > 1:
+ publicId = m.group(2) or ""
+ systemId = m.group(3) or m.group(4) or ""
+ rv.append("""|%s<!DOCTYPE %s "%s" "%s">""" %
+ (' ' * indent, name, publicId, systemId))
+ else:
+ rv.append("|%s<!DOCTYPE %s>" % (' ' * indent, name))
+ else:
+ rv.append("|%s<!DOCTYPE >" % (' ' * indent,))
+ elif isinstance(element, Comment):
+ rv.append("|%s<!-- %s -->" % (' ' * indent, element))
+ elif isinstance(element, NavigableString):
+ rv.append("|%s\"%s\"" % (' ' * indent, element))
+ else:
+ if element.namespace:
+ name = "%s %s" % (prefixes[element.namespace],
+ element.name)
+ else:
+ name = element.name
+ rv.append("|%s<%s>" % (' ' * indent, name))
+ if element.attrs:
+ attributes = []
+ for name, value in list(element.attrs.items()):
+ if isinstance(name, NamespacedAttribute):
+ name = "%s %s" % (prefixes[name.namespace], name.name)
+ if isinstance(value, list):
+ value = " ".join(value)
+ attributes.append((name, value))
+
+ for name, value in sorted(attributes):
+ rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value))
+ indent += 2
+ for child in element.children:
+ serializeElement(child, indent)
+ serializeElement(element, 0)
+
+ return "\n".join(rv)
+
+class AttrList(object):
+ def __init__(self, element):
+ self.element = element
+ self.attrs = dict(self.element.attrs)
+ def __iter__(self):
+ return list(self.attrs.items()).__iter__()
+ def __setitem__(self, name, value):
+ # If this attribute is a multi-valued attribute for this element,
+ # turn its value into a list.
+ list_attr = self.element.cdata_list_attributes
+ if (name in list_attr['*']
+ or (self.element.name in list_attr
+ and name in list_attr[self.element.name])):
+ # A node that is being cloned may have already undergone
+ # this procedure.
+ if not isinstance(value, list):
+ value = nonwhitespace_re.findall(value)
+ self.element[name] = value
+ def items(self):
+ return list(self.attrs.items())
+ def keys(self):
+ return list(self.attrs.keys())
+ def __len__(self):
+ return len(self.attrs)
+ def __getitem__(self, name):
+ return self.attrs[name]
+ def __contains__(self, name):
+ return name in list(self.attrs.keys())
+
+
+class Element(treebuilder_base.Node):
+ def __init__(self, element, soup, namespace):
+ treebuilder_base.Node.__init__(self, element.name)
+ self.element = element
+ self.soup = soup
+ self.namespace = namespace
+
+ def appendChild(self, node):
+ string_child = child = None
+ if isinstance(node, str):
+ # Some other piece of code decided to pass in a string
+ # instead of creating a TextElement object to contain the
+ # string.
+ string_child = child = node
+ elif isinstance(node, Tag):
+ # Some other piece of code decided to pass in a Tag
+ # instead of creating an Element object to contain the
+ # Tag.
+ child = node
+ elif node.element.__class__ == NavigableString:
+ string_child = child = node.element
+ node.parent = self
+ else:
+ child = node.element
+ node.parent = self
+
+ if not isinstance(child, str) and child.parent is not None:
+ node.element.extract()
+
+ if (string_child is not None and self.element.contents
+ and self.element.contents[-1].__class__ == NavigableString):
+ # We are appending a string onto another string.
+ # TODO This has O(n^2) performance, for input like
+ # "a</a>a</a>a</a>..."
+ old_element = self.element.contents[-1]
+ new_element = self.soup.new_string(old_element + string_child)
+ old_element.replace_with(new_element)
+ self.soup._most_recent_element = new_element
+ else:
+ if isinstance(node, str):
+ # Create a brand new NavigableString from this string.
+ child = self.soup.new_string(node)
+
+ # Tell Beautiful Soup to act as if it parsed this element
+ # immediately after the parent's last descendant. (Or
+ # immediately after the parent, if it has no children.)
+ if self.element.contents:
+ most_recent_element = self.element._last_descendant(False)
+ elif self.element.next_element is not None:
+ # Something from further ahead in the parse tree is
+ # being inserted into this earlier element. This is
+ # very annoying because it means an expensive search
+ # for the last element in the tree.
+ most_recent_element = self.soup._last_descendant()
+ else:
+ most_recent_element = self.element
+
+ self.soup.object_was_parsed(
+ child, parent=self.element,
+ most_recent_element=most_recent_element)
+
+ def getAttributes(self):
+ if isinstance(self.element, Comment):
+ return {}
+ return AttrList(self.element)
+
+ def setAttributes(self, attributes):
+ if attributes is not None and len(attributes) > 0:
+ converted_attributes = []
+ for name, value in list(attributes.items()):
+ if isinstance(name, tuple):
+ new_name = NamespacedAttribute(*name)
+ del attributes[name]
+ attributes[new_name] = value
+
+ self.soup.builder._replace_cdata_list_attribute_values(
+ self.name, attributes)
+ for name, value in list(attributes.items()):
+ self.element[name] = value
+
+ # The attributes may contain variables that need substitution.
+ # Call set_up_substitutions manually.
+ #
+ # The Tag constructor called this method when the Tag was created,
+ # but we just set/changed the attributes, so call it again.
+ self.soup.builder.set_up_substitutions(self.element)
+ attributes = property(getAttributes, setAttributes)
+
+ def insertText(self, data, insertBefore=None):
+ text = TextNode(self.soup.new_string(data), self.soup)
+ if insertBefore:
+ self.insertBefore(text, insertBefore)
+ else:
+ self.appendChild(text)
+
+ def insertBefore(self, node, refNode):
+ index = self.element.index(refNode.element)
+ if (node.element.__class__ == NavigableString and self.element.contents
+ and self.element.contents[index-1].__class__ == NavigableString):
+ # (See comments in appendChild)
+ old_node = self.element.contents[index-1]
+ new_str = self.soup.new_string(old_node + node.element)
+ old_node.replace_with(new_str)
+ else:
+ self.element.insert(index, node.element)
+ node.parent = self
+
+ def removeChild(self, node):
+ node.element.extract()
+
+ def reparentChildren(self, new_parent):
+ """Move all of this tag's children into another tag."""
+ # print("MOVE", self.element.contents)
+ # print("FROM", self.element)
+ # print("TO", new_parent.element)
+
+ element = self.element
+ new_parent_element = new_parent.element
+ # Determine what this tag's next_element will be once all the children
+ # are removed.
+ final_next_element = element.next_sibling
+
+ new_parents_last_descendant = new_parent_element._last_descendant(False, False)
+ if len(new_parent_element.contents) > 0:
+ # The new parent already contains children. We will be
+ # appending this tag's children to the end.
+ new_parents_last_child = new_parent_element.contents[-1]
+ new_parents_last_descendant_next_element = new_parents_last_descendant.next_element
+ else:
+ # The new parent contains no children.
+ new_parents_last_child = None
+ new_parents_last_descendant_next_element = new_parent_element.next_element
+
+ to_append = element.contents
+ if len(to_append) > 0:
+ # Set the first child's previous_element and previous_sibling
+ # to elements within the new parent
+ first_child = to_append[0]
+ if new_parents_last_descendant is not None:
+ first_child.previous_element = new_parents_last_descendant
+ else:
+ first_child.previous_element = new_parent_element
+ first_child.previous_sibling = new_parents_last_child
+ if new_parents_last_descendant is not None:
+ new_parents_last_descendant.next_element = first_child
+ else:
+ new_parent_element.next_element = first_child
+ if new_parents_last_child is not None:
+ new_parents_last_child.next_sibling = first_child
+
+ # Find the very last element being moved. It is now the
+ # parent's last descendant. It has no .next_sibling and
+ # its .next_element is whatever the previous last
+ # descendant had.
+ last_childs_last_descendant = to_append[-1]._last_descendant(False, True)
+
+ last_childs_last_descendant.next_element = new_parents_last_descendant_next_element
+ if new_parents_last_descendant_next_element is not None:
+ # TODO: This code has no test coverage and I'm not sure
+ # how to get html5lib to go through this path, but it's
+ # just the other side of the previous line.
+ new_parents_last_descendant_next_element.previous_element = last_childs_last_descendant
+ last_childs_last_descendant.next_sibling = None
+
+ for child in to_append:
+ child.parent = new_parent_element
+ new_parent_element.contents.append(child)
+
+ # Now that this element has no children, change its .next_element.
+ element.contents = []
+ element.next_element = final_next_element
+
+ # print("DONE WITH MOVE")
+ # print("FROM", self.element)
+ # print("TO", new_parent_element)
+
+ def cloneNode(self):
+ tag = self.soup.new_tag(self.element.name, self.namespace)
+ node = Element(tag, self.soup, self.namespace)
+ for key,value in self.attributes:
+ node.attributes[key] = value
+ return node
+
+ def hasContent(self):
+ return self.element.contents
+
+ def getNameTuple(self):
+ if self.namespace == None:
+ return namespaces["html"], self.name
+ else:
+ return self.namespace, self.name
+
+ nameTuple = property(getNameTuple)
+
+class TextNode(Element):
+ def __init__(self, element, soup):
+ treebuilder_base.Node.__init__(self, None)
+ self.element = element
+ self.soup = soup
+
+ def cloneNode(self):
+ raise NotImplementedError
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/builder/_htmlparser.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/builder/_htmlparser.py
new file mode 100644
index 00000000000..88860a994c4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/builder/_htmlparser.py
@@ -0,0 +1,477 @@
+# encoding: utf-8
+"""Use the HTMLParser library to parse HTML files that aren't too bad."""
+
+# Use of this source code is governed by the MIT license.
+__license__ = "MIT"
+
+__all__ = [
+ 'HTMLParserTreeBuilder',
+ ]
+
+from html.parser import HTMLParser
+
+try:
+ from html.parser import HTMLParseError
+except ImportError as e:
+ # HTMLParseError is removed in Python 3.5. Since it can never be
+ # thrown in 3.5, we can just define our own class as a placeholder.
+ class HTMLParseError(Exception):
+ pass
+
+import sys
+import warnings
+
+# Starting in Python 3.2, the HTMLParser constructor takes a 'strict'
+# argument, which we'd like to set to False. Unfortunately,
+# http://bugs.python.org/issue13273 makes strict=True a better bet
+# before Python 3.2.3.
+#
+# At the end of this file, we monkeypatch HTMLParser so that
+# strict=True works well on Python 3.2.2.
+major, minor, release = sys.version_info[:3]
+CONSTRUCTOR_TAKES_STRICT = major == 3 and minor == 2 and release >= 3
+CONSTRUCTOR_STRICT_IS_DEPRECATED = major == 3 and minor == 3
+CONSTRUCTOR_TAKES_CONVERT_CHARREFS = major == 3 and minor >= 4
+
+
+from bs4.element import (
+ CData,
+ Comment,
+ Declaration,
+ Doctype,
+ ProcessingInstruction,
+ )
+from bs4.dammit import EntitySubstitution, UnicodeDammit
+
+from bs4.builder import (
+ HTML,
+ HTMLTreeBuilder,
+ STRICT,
+ )
+
+
+HTMLPARSER = 'html.parser'
+
+class BeautifulSoupHTMLParser(HTMLParser):
+ """A subclass of the Python standard library's HTMLParser class, which
+ listens for HTMLParser events and translates them into calls
+ to Beautiful Soup's tree construction API.
+ """
+
+ # Strategies for handling duplicate attributes
+ IGNORE = 'ignore'
+ REPLACE = 'replace'
+
+ def __init__(self, *args, **kwargs):
+ """Constructor.
+
+ :param on_duplicate_attribute: A strategy for what to do if a
+ tag includes the same attribute more than once. Accepted
+ values are: REPLACE (replace earlier values with later
+ ones, the default), IGNORE (keep the earliest value
+ encountered), or a callable. A callable must take three
+ arguments: the dictionary of attributes already processed,
+ the name of the duplicate attribute, and the most recent value
+ encountered.
+ """
+ self.on_duplicate_attribute = kwargs.pop(
+ 'on_duplicate_attribute', self.REPLACE
+ )
+ HTMLParser.__init__(self, *args, **kwargs)
+
+ # Keep a list of empty-element tags that were encountered
+ # without an explicit closing tag. If we encounter a closing tag
+ # of this type, we'll associate it with one of those entries.
+ #
+ # This isn't a stack because we don't care about the
+ # order. It's a list of closing tags we've already handled and
+ # will ignore, assuming they ever show up.
+ self.already_closed_empty_element = []
+
+ def error(self, msg):
+ """In Python 3, HTMLParser subclasses must implement error(), although
+ this requirement doesn't appear to be documented.
+
+ In Python 2, HTMLParser implements error() by raising an exception,
+ which we don't want to do.
+
+ In any event, this method is called only on very strange
+ markup and our best strategy is to pretend it didn't happen
+ and keep going.
+ """
+ warnings.warn(msg)
+
+ def handle_startendtag(self, name, attrs):
+ """Handle an incoming empty-element tag.
+
+ This is only called when the markup looks like <tag/>.
+
+ :param name: Name of the tag.
+ :param attrs: Dictionary of the tag's attributes.
+ """
+ # is_startend() tells handle_starttag not to close the tag
+ # just because its name matches a known empty-element tag. We
+ # know that this is an empty-element tag and we want to call
+ # handle_endtag ourselves.
+ tag = self.handle_starttag(name, attrs, handle_empty_element=False)
+ self.handle_endtag(name)
+
+ def handle_starttag(self, name, attrs, handle_empty_element=True):
+ """Handle an opening tag, e.g. '<tag>'
+
+ :param name: Name of the tag.
+ :param attrs: Dictionary of the tag's attributes.
+ :param handle_empty_element: True if this tag is known to be
+ an empty-element tag (i.e. there is not expected to be any
+ closing tag).
+ """
+ # XXX namespace
+ attr_dict = {}
+ for key, value in attrs:
+ # Change None attribute values to the empty string
+ # for consistency with the other tree builders.
+ if value is None:
+ value = ''
+ if key in attr_dict:
+ # A single attribute shows up multiple times in this
+ # tag. How to handle it depends on the
+ # on_duplicate_attribute setting.
+ on_dupe = self.on_duplicate_attribute
+ if on_dupe == self.IGNORE:
+ pass
+ elif on_dupe in (None, self.REPLACE):
+ attr_dict[key] = value
+ else:
+ on_dupe(attr_dict, key, value)
+ else:
+ attr_dict[key] = value
+ attrvalue = '""'
+ #print("START", name)
+ sourceline, sourcepos = self.getpos()
+ tag = self.soup.handle_starttag(
+ name, None, None, attr_dict, sourceline=sourceline,
+ sourcepos=sourcepos
+ )
+ if tag and tag.is_empty_element and handle_empty_element:
+ # Unlike other parsers, html.parser doesn't send separate end tag
+ # events for empty-element tags. (It's handled in
+ # handle_startendtag, but only if the original markup looked like
+ # <tag/>.)
+ #
+ # So we need to call handle_endtag() ourselves. Since we
+ # know the start event is identical to the end event, we
+ # don't want handle_endtag() to cross off any previous end
+ # events for tags of this name.
+ self.handle_endtag(name, check_already_closed=False)
+
+ # But we might encounter an explicit closing tag for this tag
+ # later on. If so, we want to ignore it.
+ self.already_closed_empty_element.append(name)
+
+ def handle_endtag(self, name, check_already_closed=True):
+ """Handle a closing tag, e.g. '</tag>'
+
+ :param name: A tag name.
+ :param check_already_closed: True if this tag is expected to
+ be the closing portion of an empty-element tag,
+ e.g. '<tag></tag>'.
+ """
+ #print("END", name)
+ if check_already_closed and name in self.already_closed_empty_element:
+ # This is a redundant end tag for an empty-element tag.
+ # We've already called handle_endtag() for it, so just
+ # check it off the list.
+ #print("ALREADY CLOSED", name)
+ self.already_closed_empty_element.remove(name)
+ else:
+ self.soup.handle_endtag(name)
+
+ def handle_data(self, data):
+ """Handle some textual data that shows up between tags."""
+ self.soup.handle_data(data)
+
+ def handle_charref(self, name):
+ """Handle a numeric character reference by converting it to the
+ corresponding Unicode character and treating it as textual
+ data.
+
+ :param name: Character number, possibly in hexadecimal.
+ """
+ # XXX workaround for a bug in HTMLParser. Remove this once
+ # it's fixed in all supported versions.
+ # http://bugs.python.org/issue13633
+ if name.startswith('x'):
+ real_name = int(name.lstrip('x'), 16)
+ elif name.startswith('X'):
+ real_name = int(name.lstrip('X'), 16)
+ else:
+ real_name = int(name)
+
+ data = None
+ if real_name < 256:
+ # HTML numeric entities are supposed to reference Unicode
+ # code points, but sometimes they reference code points in
+ # some other encoding (ahem, Windows-1252). E.g. &#147;
+ # instead of &#201; for LEFT DOUBLE QUOTATION MARK. This
+ # code tries to detect this situation and compensate.
+ for encoding in (self.soup.original_encoding, 'windows-1252'):
+ if not encoding:
+ continue
+ try:
+ data = bytearray([real_name]).decode(encoding)
+ except UnicodeDecodeError as e:
+ pass
+ if not data:
+ try:
+ data = chr(real_name)
+ except (ValueError, OverflowError) as e:
+ pass
+ data = data or "\N{REPLACEMENT CHARACTER}"
+ self.handle_data(data)
+
+ def handle_entityref(self, name):
+ """Handle a named entity reference by converting it to the
+ corresponding Unicode character and treating it as textual
+ data.
+
+ :param name: Name of the entity reference.
+ """
+ character = EntitySubstitution.HTML_ENTITY_TO_CHARACTER.get(name)
+ if character is not None:
+ data = character
+ else:
+ # If this were XML, it would be ambiguous whether "&foo"
+ # was an character entity reference with a missing
+ # semicolon or the literal string "&foo". Since this is
+ # HTML, we have a complete list of all character entity references,
+ # and this one wasn't found, so assume it's the literal string "&foo".
+ data = "&%s" % name
+ self.handle_data(data)
+
+ def handle_comment(self, data):
+ """Handle an HTML comment.
+
+ :param data: The text of the comment.
+ """
+ self.soup.endData()
+ self.soup.handle_data(data)
+ self.soup.endData(Comment)
+
+ def handle_decl(self, data):
+ """Handle a DOCTYPE declaration.
+
+ :param data: The text of the declaration.
+ """
+ self.soup.endData()
+ data = data[len("DOCTYPE "):]
+ self.soup.handle_data(data)
+ self.soup.endData(Doctype)
+
+ def unknown_decl(self, data):
+ """Handle a declaration of unknown type -- probably a CDATA block.
+
+ :param data: The text of the declaration.
+ """
+ if data.upper().startswith('CDATA['):
+ cls = CData
+ data = data[len('CDATA['):]
+ else:
+ cls = Declaration
+ self.soup.endData()
+ self.soup.handle_data(data)
+ self.soup.endData(cls)
+
+ def handle_pi(self, data):
+ """Handle a processing instruction.
+
+ :param data: The text of the instruction.
+ """
+ self.soup.endData()
+ self.soup.handle_data(data)
+ self.soup.endData(ProcessingInstruction)
+
+
+class HTMLParserTreeBuilder(HTMLTreeBuilder):
+ """A Beautiful soup `TreeBuilder` that uses the `HTMLParser` parser,
+ found in the Python standard library.
+ """
+ is_xml = False
+ picklable = True
+ NAME = HTMLPARSER
+ features = [NAME, HTML, STRICT]
+
+ # The html.parser knows which line number and position in the
+ # original file is the source of an element.
+ TRACKS_LINE_NUMBERS = True
+
+ def __init__(self, parser_args=None, parser_kwargs=None, **kwargs):
+ """Constructor.
+
+ :param parser_args: Positional arguments to pass into
+ the BeautifulSoupHTMLParser constructor, once it's
+ invoked.
+ :param parser_kwargs: Keyword arguments to pass into
+ the BeautifulSoupHTMLParser constructor, once it's
+ invoked.
+ :param kwargs: Keyword arguments for the superclass constructor.
+ """
+ # Some keyword arguments will be pulled out of kwargs and placed
+ # into parser_kwargs.
+ extra_parser_kwargs = dict()
+ for arg in ('on_duplicate_attribute',):
+ if arg in kwargs:
+ value = kwargs.pop(arg)
+ extra_parser_kwargs[arg] = value
+ super(HTMLParserTreeBuilder, self).__init__(**kwargs)
+ parser_args = parser_args or []
+ parser_kwargs = parser_kwargs or {}
+ parser_kwargs.update(extra_parser_kwargs)
+ if CONSTRUCTOR_TAKES_STRICT and not CONSTRUCTOR_STRICT_IS_DEPRECATED:
+ parser_kwargs['strict'] = False
+ if CONSTRUCTOR_TAKES_CONVERT_CHARREFS:
+ parser_kwargs['convert_charrefs'] = False
+ self.parser_args = (parser_args, parser_kwargs)
+
+ def prepare_markup(self, markup, user_specified_encoding=None,
+ document_declared_encoding=None, exclude_encodings=None):
+
+ """Run any preliminary steps necessary to make incoming markup
+ acceptable to the parser.
+
+ :param markup: Some markup -- probably a bytestring.
+ :param user_specified_encoding: The user asked to try this encoding.
+ :param document_declared_encoding: The markup itself claims to be
+ in this encoding.
+ :param exclude_encodings: The user asked _not_ to try any of
+ these encodings.
+
+ :yield: A series of 4-tuples:
+ (markup, encoding, declared encoding,
+ has undergone character replacement)
+
+ Each 4-tuple represents a strategy for converting the
+ document to Unicode and parsing it. Each strategy will be tried
+ in turn.
+ """
+ if isinstance(markup, str):
+ # Parse Unicode as-is.
+ yield (markup, None, None, False)
+ return
+
+ # Ask UnicodeDammit to sniff the most likely encoding.
+ try_encodings = [user_specified_encoding, document_declared_encoding]
+ dammit = UnicodeDammit(markup, try_encodings, is_html=True,
+ exclude_encodings=exclude_encodings)
+ yield (dammit.markup, dammit.original_encoding,
+ dammit.declared_html_encoding,
+ dammit.contains_replacement_characters)
+
+ def feed(self, markup):
+ """Run some incoming markup through some parsing process,
+ populating the `BeautifulSoup` object in self.soup.
+ """
+ args, kwargs = self.parser_args
+ parser = BeautifulSoupHTMLParser(*args, **kwargs)
+ parser.soup = self.soup
+ try:
+ parser.feed(markup)
+ parser.close()
+ except HTMLParseError as e:
+ warnings.warn(RuntimeWarning(
+ "Python's built-in HTMLParser cannot parse the given document. This is not a bug in Beautiful Soup. The best solution is to install an external parser (lxml or html5lib), and use Beautiful Soup with that parser. See http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser for help."))
+ raise e
+ parser.already_closed_empty_element = []
+
+# Patch 3.2 versions of HTMLParser earlier than 3.2.3 to use some
+# 3.2.3 code. This ensures they don't treat markup like <p></p> as a
+# string.
+#
+# XXX This code can be removed once most Python 3 users are on 3.2.3.
+if major == 3 and minor == 2 and not CONSTRUCTOR_TAKES_STRICT:
+ import re
+ attrfind_tolerant = re.compile(
+ r'\s*((?<=[\'"\s])[^\s/>][^\s/=>]*)(\s*=+\s*'
+ r'(\'[^\']*\'|"[^"]*"|(?![\'"])[^>\s]*))?')
+ HTMLParserTreeBuilder.attrfind_tolerant = attrfind_tolerant
+
+ locatestarttagend = re.compile(r"""
+ <[a-zA-Z][-.a-zA-Z0-9:_]* # tag name
+ (?:\s+ # whitespace before attribute name
+ (?:[a-zA-Z_][-.:a-zA-Z0-9_]* # attribute name
+ (?:\s*=\s* # value indicator
+ (?:'[^']*' # LITA-enclosed value
+ |\"[^\"]*\" # LIT-enclosed value
+ |[^'\">\s]+ # bare value
+ )
+ )?
+ )
+ )*
+ \s* # trailing whitespace
+""", re.VERBOSE)
+ BeautifulSoupHTMLParser.locatestarttagend = locatestarttagend
+
+ from html.parser import tagfind, attrfind
+
+ def parse_starttag(self, i):
+ self.__starttag_text = None
+ endpos = self.check_for_whole_start_tag(i)
+ if endpos < 0:
+ return endpos
+ rawdata = self.rawdata
+ self.__starttag_text = rawdata[i:endpos]
+
+ # Now parse the data between i+1 and j into a tag and attrs
+ attrs = []
+ match = tagfind.match(rawdata, i+1)
+ assert match, 'unexpected call to parse_starttag()'
+ k = match.end()
+ self.lasttag = tag = rawdata[i+1:k].lower()
+ while k < endpos:
+ if self.strict:
+ m = attrfind.match(rawdata, k)
+ else:
+ m = attrfind_tolerant.match(rawdata, k)
+ if not m:
+ break
+ attrname, rest, attrvalue = m.group(1, 2, 3)
+ if not rest:
+ attrvalue = None
+ elif attrvalue[:1] == '\'' == attrvalue[-1:] or \
+ attrvalue[:1] == '"' == attrvalue[-1:]:
+ attrvalue = attrvalue[1:-1]
+ if attrvalue:
+ attrvalue = self.unescape(attrvalue)
+ attrs.append((attrname.lower(), attrvalue))
+ k = m.end()
+
+ end = rawdata[k:endpos].strip()
+ if end not in (">", "/>"):
+ lineno, offset = self.getpos()
+ if "\n" in self.__starttag_text:
+ lineno = lineno + self.__starttag_text.count("\n")
+ offset = len(self.__starttag_text) \
+ - self.__starttag_text.rfind("\n")
+ else:
+ offset = offset + len(self.__starttag_text)
+ if self.strict:
+ self.error("junk characters in start tag: %r"
+ % (rawdata[k:endpos][:20],))
+ self.handle_data(rawdata[i:endpos])
+ return endpos
+ if end.endswith('/>'):
+ # XHTML-style empty tag: <span attr="value" />
+ self.handle_startendtag(tag, attrs)
+ else:
+ self.handle_starttag(tag, attrs)
+ if tag in self.CDATA_CONTENT_ELEMENTS:
+ self.set_cdata_mode(tag)
+ return endpos
+
+ def set_cdata_mode(self, elem):
+ self.cdata_elem = elem.lower()
+ self.interesting = re.compile(r'</\s*%s\s*>' % self.cdata_elem, re.I)
+
+ BeautifulSoupHTMLParser.parse_starttag = parse_starttag
+ BeautifulSoupHTMLParser.set_cdata_mode = set_cdata_mode
+
+ CONSTRUCTOR_TAKES_STRICT = True
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/builder/_lxml.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/builder/_lxml.py
new file mode 100644
index 00000000000..432a2c86aeb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/builder/_lxml.py
@@ -0,0 +1,332 @@
+# Use of this source code is governed by the MIT license.
+__license__ = "MIT"
+
+__all__ = [
+ 'LXMLTreeBuilderForXML',
+ 'LXMLTreeBuilder',
+ ]
+
+try:
+ from collections.abc import Callable # Python 3.6
+except ImportError as e:
+ from collections import Callable
+
+from io import BytesIO
+from io import StringIO
+from lxml import etree
+from bs4.element import (
+ Comment,
+ Doctype,
+ NamespacedAttribute,
+ ProcessingInstruction,
+ XMLProcessingInstruction,
+)
+from bs4.builder import (
+ FAST,
+ HTML,
+ HTMLTreeBuilder,
+ PERMISSIVE,
+ ParserRejectedMarkup,
+ TreeBuilder,
+ XML)
+from bs4.dammit import EncodingDetector
+
+LXML = 'lxml'
+
+def _invert(d):
+ "Invert a dictionary."
+ return dict((v,k) for k, v in list(d.items()))
+
+class LXMLTreeBuilderForXML(TreeBuilder):
+ DEFAULT_PARSER_CLASS = etree.XMLParser
+
+ is_xml = True
+ processing_instruction_class = XMLProcessingInstruction
+
+ NAME = "lxml-xml"
+ ALTERNATE_NAMES = ["xml"]
+
+ # Well, it's permissive by XML parser standards.
+ features = [NAME, LXML, XML, FAST, PERMISSIVE]
+
+ CHUNK_SIZE = 512
+
+ # This namespace mapping is specified in the XML Namespace
+ # standard.
+ DEFAULT_NSMAPS = dict(xml='http://www.w3.org/XML/1998/namespace')
+
+ DEFAULT_NSMAPS_INVERTED = _invert(DEFAULT_NSMAPS)
+
+ # NOTE: If we parsed Element objects and looked at .sourceline,
+ # we'd be able to see the line numbers from the original document.
+ # But instead we build an XMLParser or HTMLParser object to serve
+ # as the target of parse messages, and those messages don't include
+ # line numbers.
+ # See: https://bugs.launchpad.net/lxml/+bug/1846906
+
+ def initialize_soup(self, soup):
+ """Let the BeautifulSoup object know about the standard namespace
+ mapping.
+
+ :param soup: A `BeautifulSoup`.
+ """
+ super(LXMLTreeBuilderForXML, self).initialize_soup(soup)
+ self._register_namespaces(self.DEFAULT_NSMAPS)
+
+ def _register_namespaces(self, mapping):
+ """Let the BeautifulSoup object know about namespaces encountered
+ while parsing the document.
+
+ This might be useful later on when creating CSS selectors.
+
+ :param mapping: A dictionary mapping namespace prefixes to URIs.
+ """
+ for key, value in list(mapping.items()):
+ if key and key not in self.soup._namespaces:
+ # Let the BeautifulSoup object know about a new namespace.
+ # If there are multiple namespaces defined with the same
+ # prefix, the first one in the document takes precedence.
+ self.soup._namespaces[key] = value
+
+ def default_parser(self, encoding):
+ """Find the default parser for the given encoding.
+
+ :param encoding: A string.
+ :return: Either a parser object or a class, which
+ will be instantiated with default arguments.
+ """
+ if self._default_parser is not None:
+ return self._default_parser
+ return etree.XMLParser(
+ target=self, strip_cdata=False, recover=True, encoding=encoding)
+
+ def parser_for(self, encoding):
+ """Instantiate an appropriate parser for the given encoding.
+
+ :param encoding: A string.
+ :return: A parser object such as an `etree.XMLParser`.
+ """
+ # Use the default parser.
+ parser = self.default_parser(encoding)
+
+ if isinstance(parser, Callable):
+ # Instantiate the parser with default arguments
+ parser = parser(
+ target=self, strip_cdata=False, recover=True, encoding=encoding
+ )
+ return parser
+
+ def __init__(self, parser=None, empty_element_tags=None, **kwargs):
+ # TODO: Issue a warning if parser is present but not a
+ # callable, since that means there's no way to create new
+ # parsers for different encodings.
+ self._default_parser = parser
+ if empty_element_tags is not None:
+ self.empty_element_tags = set(empty_element_tags)
+ self.soup = None
+ self.nsmaps = [self.DEFAULT_NSMAPS_INVERTED]
+ super(LXMLTreeBuilderForXML, self).__init__(**kwargs)
+
+ def _getNsTag(self, tag):
+ # Split the namespace URL out of a fully-qualified lxml tag
+ # name. Copied from lxml's src/lxml/sax.py.
+ if tag[0] == '{':
+ return tuple(tag[1:].split('}', 1))
+ else:
+ return (None, tag)
+
+ def prepare_markup(self, markup, user_specified_encoding=None,
+ exclude_encodings=None,
+ document_declared_encoding=None):
+ """Run any preliminary steps necessary to make incoming markup
+ acceptable to the parser.
+
+ lxml really wants to get a bytestring and convert it to
+ Unicode itself. So instead of using UnicodeDammit to convert
+ the bytestring to Unicode using different encodings, this
+ implementation uses EncodingDetector to iterate over the
+ encodings, and tell lxml to try to parse the document as each
+ one in turn.
+
+ :param markup: Some markup -- hopefully a bytestring.
+ :param user_specified_encoding: The user asked to try this encoding.
+ :param document_declared_encoding: The markup itself claims to be
+ in this encoding.
+ :param exclude_encodings: The user asked _not_ to try any of
+ these encodings.
+
+ :yield: A series of 4-tuples:
+ (markup, encoding, declared encoding,
+ has undergone character replacement)
+
+ Each 4-tuple represents a strategy for converting the
+ document to Unicode and parsing it. Each strategy will be tried
+ in turn.
+ """
+ is_html = not self.is_xml
+ if is_html:
+ self.processing_instruction_class = ProcessingInstruction
+ else:
+ self.processing_instruction_class = XMLProcessingInstruction
+
+ if isinstance(markup, str):
+ # We were given Unicode. Maybe lxml can parse Unicode on
+ # this system?
+ yield markup, None, document_declared_encoding, False
+
+ if isinstance(markup, str):
+ # No, apparently not. Convert the Unicode to UTF-8 and
+ # tell lxml to parse it as UTF-8.
+ yield (markup.encode("utf8"), "utf8",
+ document_declared_encoding, False)
+
+ try_encodings = [user_specified_encoding, document_declared_encoding]
+ detector = EncodingDetector(
+ markup, try_encodings, is_html, exclude_encodings)
+ for encoding in detector.encodings:
+ yield (detector.markup, encoding, document_declared_encoding, False)
+
+ def feed(self, markup):
+ if isinstance(markup, bytes):
+ markup = BytesIO(markup)
+ elif isinstance(markup, str):
+ markup = StringIO(markup)
+
+ # Call feed() at least once, even if the markup is empty,
+ # or the parser won't be initialized.
+ data = markup.read(self.CHUNK_SIZE)
+ try:
+ self.parser = self.parser_for(self.soup.original_encoding)
+ self.parser.feed(data)
+ while len(data) != 0:
+ # Now call feed() on the rest of the data, chunk by chunk.
+ data = markup.read(self.CHUNK_SIZE)
+ if len(data) != 0:
+ self.parser.feed(data)
+ self.parser.close()
+ except (UnicodeDecodeError, LookupError, etree.ParserError) as e:
+ raise ParserRejectedMarkup(e)
+
+ def close(self):
+ self.nsmaps = [self.DEFAULT_NSMAPS_INVERTED]
+
+ def start(self, name, attrs, nsmap={}):
+ # Make sure attrs is a mutable dict--lxml may send an immutable dictproxy.
+ attrs = dict(attrs)
+ nsprefix = None
+ # Invert each namespace map as it comes in.
+ if len(nsmap) == 0 and len(self.nsmaps) > 1:
+ # There are no new namespaces for this tag, but
+ # non-default namespaces are in play, so we need a
+ # separate tag stack to know when they end.
+ self.nsmaps.append(None)
+ elif len(nsmap) > 0:
+ # A new namespace mapping has come into play.
+
+ # First, Let the BeautifulSoup object know about it.
+ self._register_namespaces(nsmap)
+
+ # Then, add it to our running list of inverted namespace
+ # mappings.
+ self.nsmaps.append(_invert(nsmap))
+
+ # Also treat the namespace mapping as a set of attributes on the
+ # tag, so we can recreate it later.
+ attrs = attrs.copy()
+ for prefix, namespace in list(nsmap.items()):
+ attribute = NamespacedAttribute(
+ "xmlns", prefix, "http://www.w3.org/2000/xmlns/")
+ attrs[attribute] = namespace
+
+ # Namespaces are in play. Find any attributes that came in
+ # from lxml with namespaces attached to their names, and
+ # turn then into NamespacedAttribute objects.
+ new_attrs = {}
+ for attr, value in list(attrs.items()):
+ namespace, attr = self._getNsTag(attr)
+ if namespace is None:
+ new_attrs[attr] = value
+ else:
+ nsprefix = self._prefix_for_namespace(namespace)
+ attr = NamespacedAttribute(nsprefix, attr, namespace)
+ new_attrs[attr] = value
+ attrs = new_attrs
+
+ namespace, name = self._getNsTag(name)
+ nsprefix = self._prefix_for_namespace(namespace)
+ self.soup.handle_starttag(name, namespace, nsprefix, attrs)
+
+ def _prefix_for_namespace(self, namespace):
+ """Find the currently active prefix for the given namespace."""
+ if namespace is None:
+ return None
+ for inverted_nsmap in reversed(self.nsmaps):
+ if inverted_nsmap is not None and namespace in inverted_nsmap:
+ return inverted_nsmap[namespace]
+ return None
+
+ def end(self, name):
+ self.soup.endData()
+ completed_tag = self.soup.tagStack[-1]
+ namespace, name = self._getNsTag(name)
+ nsprefix = None
+ if namespace is not None:
+ for inverted_nsmap in reversed(self.nsmaps):
+ if inverted_nsmap is not None and namespace in inverted_nsmap:
+ nsprefix = inverted_nsmap[namespace]
+ break
+ self.soup.handle_endtag(name, nsprefix)
+ if len(self.nsmaps) > 1:
+ # This tag, or one of its parents, introduced a namespace
+ # mapping, so pop it off the stack.
+ self.nsmaps.pop()
+
+ def pi(self, target, data):
+ self.soup.endData()
+ self.soup.handle_data(target + ' ' + data)
+ self.soup.endData(self.processing_instruction_class)
+
+ def data(self, content):
+ self.soup.handle_data(content)
+
+ def doctype(self, name, pubid, system):
+ self.soup.endData()
+ doctype = Doctype.for_name_and_ids(name, pubid, system)
+ self.soup.object_was_parsed(doctype)
+
+ def comment(self, content):
+ "Handle comments as Comment objects."
+ self.soup.endData()
+ self.soup.handle_data(content)
+ self.soup.endData(Comment)
+
+ def test_fragment_to_document(self, fragment):
+ """See `TreeBuilder`."""
+ return '<?xml version="1.0" encoding="utf-8"?>\n%s' % fragment
+
+
+class LXMLTreeBuilder(HTMLTreeBuilder, LXMLTreeBuilderForXML):
+
+ NAME = LXML
+ ALTERNATE_NAMES = ["lxml-html"]
+
+ features = ALTERNATE_NAMES + [NAME, HTML, FAST, PERMISSIVE]
+ is_xml = False
+ processing_instruction_class = ProcessingInstruction
+
+ def default_parser(self, encoding):
+ return etree.HTMLParser
+
+ def feed(self, markup):
+ encoding = self.soup.original_encoding
+ try:
+ self.parser = self.parser_for(encoding)
+ self.parser.feed(markup)
+ self.parser.close()
+ except (UnicodeDecodeError, LookupError, etree.ParserError) as e:
+ raise ParserRejectedMarkup(e)
+
+
+ def test_fragment_to_document(self, fragment):
+ """See `TreeBuilder`."""
+ return '<html><body>%s</body></html>' % fragment
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/dammit.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/dammit.py
new file mode 100644
index 00000000000..ee3708f5c36
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/dammit.py
@@ -0,0 +1,939 @@
+# -*- coding: utf-8 -*-
+"""Beautiful Soup bonus library: Unicode, Dammit
+
+This library converts a bytestream to Unicode through any means
+necessary. It is heavily based on code from Mark Pilgrim's Universal
+Feed Parser. It works best on XML and HTML, but it does not rewrite the
+XML or HTML to reflect a new encoding; that's the tree builder's job.
+"""
+# Use of this source code is governed by the MIT license.
+__license__ = "MIT"
+
+import codecs
+from html.entities import codepoint2name
+import re
+import logging
+import string
+
+# Import a library to autodetect character encodings.
+chardet_type = None
+try:
+ # First try the fast C implementation.
+ # PyPI package: cchardet
+ import cchardet
+ def chardet_dammit(s):
+ if isinstance(s, str):
+ return None
+ return cchardet.detect(s)['encoding']
+except ImportError:
+ try:
+ # Fall back to the pure Python implementation
+ # Debian package: python-chardet
+ # PyPI package: chardet
+ import chardet
+ def chardet_dammit(s):
+ if isinstance(s, str):
+ return None
+ return chardet.detect(s)['encoding']
+ #import chardet.constants
+ #chardet.constants._debug = 1
+ except ImportError:
+ # No chardet available.
+ def chardet_dammit(s):
+ return None
+
+# Available from http://cjkpython.i18n.org/.
+#
+# TODO: This doesn't work anymore and the closest thing, iconv_codecs,
+# is GPL-licensed. Check whether this is still necessary.
+try:
+ import iconv_codec
+except ImportError:
+ pass
+
+# Build bytestring and Unicode versions of regular expressions for finding
+# a declared encoding inside an XML or HTML document.
+xml_encoding = '^\\s*<\\?.*encoding=[\'"](.*?)[\'"].*\\?>'
+html_meta = '<\\s*meta[^>]+charset\\s*=\\s*["\']?([^>]*?)[ /;\'">]'
+encoding_res = dict()
+encoding_res[bytes] = {
+ 'html' : re.compile(html_meta.encode("ascii"), re.I),
+ 'xml' : re.compile(xml_encoding.encode("ascii"), re.I),
+}
+encoding_res[str] = {
+ 'html' : re.compile(html_meta, re.I),
+ 'xml' : re.compile(xml_encoding, re.I)
+}
+
+class EntitySubstitution(object):
+ """The ability to substitute XML or HTML entities for certain characters."""
+
+ def _populate_class_variables():
+ lookup = {}
+ reverse_lookup = {}
+ characters_for_re = []
+
+ # &apos is an XHTML entity and an HTML 5, but not an HTML 4
+ # entity. We don't want to use it, but we want to recognize it on the way in.
+ #
+ # TODO: Ideally we would be able to recognize all HTML 5 named
+ # entities, but that's a little tricky.
+ extra = [(39, 'apos')]
+ for codepoint, name in list(codepoint2name.items()) + extra:
+ character = chr(codepoint)
+ if codepoint not in (34, 39):
+ # There's no point in turning the quotation mark into
+ # &quot; or the single quote into &apos;, unless it
+ # happens within an attribute value, which is handled
+ # elsewhere.
+ characters_for_re.append(character)
+ lookup[character] = name
+ # But we do want to recognize those entities on the way in and
+ # convert them to Unicode characters.
+ reverse_lookup[name] = character
+ re_definition = "[%s]" % "".join(characters_for_re)
+ return lookup, reverse_lookup, re.compile(re_definition)
+ (CHARACTER_TO_HTML_ENTITY, HTML_ENTITY_TO_CHARACTER,
+ CHARACTER_TO_HTML_ENTITY_RE) = _populate_class_variables()
+
+ CHARACTER_TO_XML_ENTITY = {
+ "'": "apos",
+ '"': "quot",
+ "&": "amp",
+ "<": "lt",
+ ">": "gt",
+ }
+
+ BARE_AMPERSAND_OR_BRACKET = re.compile("([<>]|"
+ "&(?!#\\d+;|#x[0-9a-fA-F]+;|\\w+;)"
+ ")")
+
+ AMPERSAND_OR_BRACKET = re.compile("([<>&])")
+
+ @classmethod
+ def _substitute_html_entity(cls, matchobj):
+ """Used with a regular expression to substitute the
+ appropriate HTML entity for a special character."""
+ entity = cls.CHARACTER_TO_HTML_ENTITY.get(matchobj.group(0))
+ return "&%s;" % entity
+
+ @classmethod
+ def _substitute_xml_entity(cls, matchobj):
+ """Used with a regular expression to substitute the
+ appropriate XML entity for a special character."""
+ entity = cls.CHARACTER_TO_XML_ENTITY[matchobj.group(0)]
+ return "&%s;" % entity
+
+ @classmethod
+ def quoted_attribute_value(self, value):
+ """Make a value into a quoted XML attribute, possibly escaping it.
+
+ Most strings will be quoted using double quotes.
+
+ Bob's Bar -> "Bob's Bar"
+
+ If a string contains double quotes, it will be quoted using
+ single quotes.
+
+ Welcome to "my bar" -> 'Welcome to "my bar"'
+
+ If a string contains both single and double quotes, the
+ double quotes will be escaped, and the string will be quoted
+ using double quotes.
+
+ Welcome to "Bob's Bar" -> "Welcome to &quot;Bob's bar&quot;
+ """
+ quote_with = '"'
+ if '"' in value:
+ if "'" in value:
+ # The string contains both single and double
+ # quotes. Turn the double quotes into
+ # entities. We quote the double quotes rather than
+ # the single quotes because the entity name is
+ # "&quot;" whether this is HTML or XML. If we
+ # quoted the single quotes, we'd have to decide
+ # between &apos; and &squot;.
+ replace_with = "&quot;"
+ value = value.replace('"', replace_with)
+ else:
+ # There are double quotes but no single quotes.
+ # We can use single quotes to quote the attribute.
+ quote_with = "'"
+ return quote_with + value + quote_with
+
+ @classmethod
+ def substitute_xml(cls, value, make_quoted_attribute=False):
+ """Substitute XML entities for special XML characters.
+
+ :param value: A string to be substituted. The less-than sign
+ will become &lt;, the greater-than sign will become &gt;,
+ and any ampersands will become &amp;. If you want ampersands
+ that appear to be part of an entity definition to be left
+ alone, use substitute_xml_containing_entities() instead.
+
+ :param make_quoted_attribute: If True, then the string will be
+ quoted, as befits an attribute value.
+ """
+ # Escape angle brackets and ampersands.
+ value = cls.AMPERSAND_OR_BRACKET.sub(
+ cls._substitute_xml_entity, value)
+
+ if make_quoted_attribute:
+ value = cls.quoted_attribute_value(value)
+ return value
+
+ @classmethod
+ def substitute_xml_containing_entities(
+ cls, value, make_quoted_attribute=False):
+ """Substitute XML entities for special XML characters.
+
+ :param value: A string to be substituted. The less-than sign will
+ become &lt;, the greater-than sign will become &gt;, and any
+ ampersands that are not part of an entity defition will
+ become &amp;.
+
+ :param make_quoted_attribute: If True, then the string will be
+ quoted, as befits an attribute value.
+ """
+ # Escape angle brackets, and ampersands that aren't part of
+ # entities.
+ value = cls.BARE_AMPERSAND_OR_BRACKET.sub(
+ cls._substitute_xml_entity, value)
+
+ if make_quoted_attribute:
+ value = cls.quoted_attribute_value(value)
+ return value
+
+ @classmethod
+ def substitute_html(cls, s):
+ """Replace certain Unicode characters with named HTML entities.
+
+ This differs from data.encode(encoding, 'xmlcharrefreplace')
+ in that the goal is to make the result more readable (to those
+ with ASCII displays) rather than to recover from
+ errors. There's absolutely nothing wrong with a UTF-8 string
+ containg a LATIN SMALL LETTER E WITH ACUTE, but replacing that
+ character with "&eacute;" will make it more readable to some
+ people.
+
+ :param s: A Unicode string.
+ """
+ return cls.CHARACTER_TO_HTML_ENTITY_RE.sub(
+ cls._substitute_html_entity, s)
+
+
+class EncodingDetector:
+ """Suggests a number of possible encodings for a bytestring.
+
+ Order of precedence:
+
+ 1. Encodings you specifically tell EncodingDetector to try first
+ (the override_encodings argument to the constructor).
+
+ 2. An encoding declared within the bytestring itself, either in an
+ XML declaration (if the bytestring is to be interpreted as an XML
+ document), or in a <meta> tag (if the bytestring is to be
+ interpreted as an HTML document.)
+
+ 3. An encoding detected through textual analysis by chardet,
+ cchardet, or a similar external library.
+
+ 4. UTF-8.
+
+ 5. Windows-1252.
+ """
+ def __init__(self, markup, override_encodings=None, is_html=False,
+ exclude_encodings=None):
+ """Constructor.
+
+ :param markup: Some markup in an unknown encoding.
+ :param override_encodings: These encodings will be tried first.
+ :param is_html: If True, this markup is considered to be HTML. Otherwise
+ it's assumed to be XML.
+ :param exclude_encodings: These encodings will not be tried, even
+ if they otherwise would be.
+ """
+ self.override_encodings = override_encodings or []
+ exclude_encodings = exclude_encodings or []
+ self.exclude_encodings = set([x.lower() for x in exclude_encodings])
+ self.chardet_encoding = None
+ self.is_html = is_html
+ self.declared_encoding = None
+
+ # First order of business: strip a byte-order mark.
+ self.markup, self.sniffed_encoding = self.strip_byte_order_mark(markup)
+
+ def _usable(self, encoding, tried):
+ """Should we even bother to try this encoding?
+
+ :param encoding: Name of an encoding.
+ :param tried: Encodings that have already been tried. This will be modified
+ as a side effect.
+ """
+ if encoding is not None:
+ encoding = encoding.lower()
+ if encoding in self.exclude_encodings:
+ return False
+ if encoding not in tried:
+ tried.add(encoding)
+ return True
+ return False
+
+ @property
+ def encodings(self):
+ """Yield a number of encodings that might work for this markup.
+
+ :yield: A sequence of strings.
+ """
+ tried = set()
+ for e in self.override_encodings:
+ if self._usable(e, tried):
+ yield e
+
+ # Did the document originally start with a byte-order mark
+ # that indicated its encoding?
+ if self._usable(self.sniffed_encoding, tried):
+ yield self.sniffed_encoding
+
+ # Look within the document for an XML or HTML encoding
+ # declaration.
+ if self.declared_encoding is None:
+ self.declared_encoding = self.find_declared_encoding(
+ self.markup, self.is_html)
+ if self._usable(self.declared_encoding, tried):
+ yield self.declared_encoding
+
+ # Use third-party character set detection to guess at the
+ # encoding.
+ if self.chardet_encoding is None:
+ self.chardet_encoding = chardet_dammit(self.markup)
+ if self._usable(self.chardet_encoding, tried):
+ yield self.chardet_encoding
+
+ # As a last-ditch effort, try utf-8 and windows-1252.
+ for e in ('utf-8', 'windows-1252'):
+ if self._usable(e, tried):
+ yield e
+
+ @classmethod
+ def strip_byte_order_mark(cls, data):
+ """If a byte-order mark is present, strip it and return the encoding it implies.
+
+ :param data: Some markup.
+ :return: A 2-tuple (modified data, implied encoding)
+ """
+ encoding = None
+ if isinstance(data, str):
+ # Unicode data cannot have a byte-order mark.
+ return data, encoding
+ if (len(data) >= 4) and (data[:2] == b'\xfe\xff') \
+ and (data[2:4] != '\x00\x00'):
+ encoding = 'utf-16be'
+ data = data[2:]
+ elif (len(data) >= 4) and (data[:2] == b'\xff\xfe') \
+ and (data[2:4] != '\x00\x00'):
+ encoding = 'utf-16le'
+ data = data[2:]
+ elif data[:3] == b'\xef\xbb\xbf':
+ encoding = 'utf-8'
+ data = data[3:]
+ elif data[:4] == b'\x00\x00\xfe\xff':
+ encoding = 'utf-32be'
+ data = data[4:]
+ elif data[:4] == b'\xff\xfe\x00\x00':
+ encoding = 'utf-32le'
+ data = data[4:]
+ return data, encoding
+
+ @classmethod
+ def find_declared_encoding(cls, markup, is_html=False, search_entire_document=False):
+ """Given a document, tries to find its declared encoding.
+
+ An XML encoding is declared at the beginning of the document.
+
+ An HTML encoding is declared in a <meta> tag, hopefully near the
+ beginning of the document.
+
+ :param markup: Some markup.
+ :param is_html: If True, this markup is considered to be HTML. Otherwise
+ it's assumed to be XML.
+ :param search_entire_document: Since an encoding is supposed to declared near the beginning
+ of the document, most of the time it's only necessary to search a few kilobytes of data.
+ Set this to True to force this method to search the entire document.
+ """
+ if search_entire_document:
+ xml_endpos = html_endpos = len(markup)
+ else:
+ xml_endpos = 1024
+ html_endpos = max(2048, int(len(markup) * 0.05))
+
+ if isinstance(markup, bytes):
+ res = encoding_res[bytes]
+ else:
+ res = encoding_res[str]
+
+ xml_re = res['xml']
+ html_re = res['html']
+ declared_encoding = None
+ declared_encoding_match = xml_re.search(markup, endpos=xml_endpos)
+ if not declared_encoding_match and is_html:
+ declared_encoding_match = html_re.search(markup, endpos=html_endpos)
+ if declared_encoding_match is not None:
+ declared_encoding = declared_encoding_match.groups()[0]
+ if declared_encoding:
+ if isinstance(declared_encoding, bytes):
+ declared_encoding = declared_encoding.decode('ascii', 'replace')
+ return declared_encoding.lower()
+ return None
+
+class UnicodeDammit:
+ """A class for detecting the encoding of a *ML document and
+ converting it to a Unicode string. If the source encoding is
+ windows-1252, can replace MS smart quotes with their HTML or XML
+ equivalents."""
+
+ # This dictionary maps commonly seen values for "charset" in HTML
+ # meta tags to the corresponding Python codec names. It only covers
+ # values that aren't in Python's aliases and can't be determined
+ # by the heuristics in find_codec.
+ CHARSET_ALIASES = {"macintosh": "mac-roman",
+ "x-sjis": "shift-jis"}
+
+ ENCODINGS_WITH_SMART_QUOTES = [
+ "windows-1252",
+ "iso-8859-1",
+ "iso-8859-2",
+ ]
+
+ def __init__(self, markup, override_encodings=[],
+ smart_quotes_to=None, is_html=False, exclude_encodings=[]):
+ """Constructor.
+
+ :param markup: A bytestring representing markup in an unknown encoding.
+ :param override_encodings: These encodings will be tried first,
+ before any sniffing code is run.
+
+ :param smart_quotes_to: By default, Microsoft smart quotes will, like all other characters, be converted
+ to Unicode characters. Setting this to 'ascii' will convert them to ASCII quotes instead.
+ Setting it to 'xml' will convert them to XML entity references, and setting it to 'html'
+ will convert them to HTML entity references.
+ :param is_html: If True, this markup is considered to be HTML. Otherwise
+ it's assumed to be XML.
+ :param exclude_encodings: These encodings will not be considered, even
+ if the sniffing code thinks they might make sense.
+ """
+ self.smart_quotes_to = smart_quotes_to
+ self.tried_encodings = []
+ self.contains_replacement_characters = False
+ self.is_html = is_html
+ self.log = logging.getLogger(__name__)
+ self.detector = EncodingDetector(
+ markup, override_encodings, is_html, exclude_encodings)
+
+ # Short-circuit if the data is in Unicode to begin with.
+ if isinstance(markup, str) or markup == '':
+ self.markup = markup
+ self.unicode_markup = str(markup)
+ self.original_encoding = None
+ return
+
+ # The encoding detector may have stripped a byte-order mark.
+ # Use the stripped markup from this point on.
+ self.markup = self.detector.markup
+
+ u = None
+ for encoding in self.detector.encodings:
+ markup = self.detector.markup
+ u = self._convert_from(encoding)
+ if u is not None:
+ break
+
+ if not u:
+ # None of the encodings worked. As an absolute last resort,
+ # try them again with character replacement.
+
+ for encoding in self.detector.encodings:
+ if encoding != "ascii":
+ u = self._convert_from(encoding, "replace")
+ if u is not None:
+ self.log.warning(
+ "Some characters could not be decoded, and were "
+ "replaced with REPLACEMENT CHARACTER."
+ )
+ self.contains_replacement_characters = True
+ break
+
+ # If none of that worked, we could at this point force it to
+ # ASCII, but that would destroy so much data that I think
+ # giving up is better.
+ self.unicode_markup = u
+ if not u:
+ self.original_encoding = None
+
+ def _sub_ms_char(self, match):
+ """Changes a MS smart quote character to an XML or HTML
+ entity, or an ASCII character."""
+ orig = match.group(1)
+ if self.smart_quotes_to == 'ascii':
+ sub = self.MS_CHARS_TO_ASCII.get(orig).encode()
+ else:
+ sub = self.MS_CHARS.get(orig)
+ if type(sub) == tuple:
+ if self.smart_quotes_to == 'xml':
+ sub = '&#x'.encode() + sub[1].encode() + ';'.encode()
+ else:
+ sub = '&'.encode() + sub[0].encode() + ';'.encode()
+ else:
+ sub = sub.encode()
+ return sub
+
+ def _convert_from(self, proposed, errors="strict"):
+ """Attempt to convert the markup to the proposed encoding.
+
+ :param proposed: The name of a character encoding.
+ """
+ proposed = self.find_codec(proposed)
+ if not proposed or (proposed, errors) in self.tried_encodings:
+ return None
+ self.tried_encodings.append((proposed, errors))
+ markup = self.markup
+ # Convert smart quotes to HTML if coming from an encoding
+ # that might have them.
+ if (self.smart_quotes_to is not None
+ and proposed in self.ENCODINGS_WITH_SMART_QUOTES):
+ smart_quotes_re = b"([\x80-\x9f])"
+ smart_quotes_compiled = re.compile(smart_quotes_re)
+ markup = smart_quotes_compiled.sub(self._sub_ms_char, markup)
+
+ try:
+ #print("Trying to convert document to %s (errors=%s)" % (
+ # proposed, errors))
+ u = self._to_unicode(markup, proposed, errors)
+ self.markup = u
+ self.original_encoding = proposed
+ except Exception as e:
+ #print("That didn't work!")
+ #print(e)
+ return None
+ #print("Correct encoding: %s" % proposed)
+ return self.markup
+
+ def _to_unicode(self, data, encoding, errors="strict"):
+ """Given a string and its encoding, decodes the string into Unicode.
+
+ :param encoding: The name of an encoding.
+ """
+ return str(data, encoding, errors)
+
+ @property
+ def declared_html_encoding(self):
+ """If the markup is an HTML document, returns the encoding declared _within_
+ the document.
+ """
+ if not self.is_html:
+ return None
+ return self.detector.declared_encoding
+
+ def find_codec(self, charset):
+ """Convert the name of a character set to a codec name.
+
+ :param charset: The name of a character set.
+ :return: The name of a codec.
+ """
+ value = (self._codec(self.CHARSET_ALIASES.get(charset, charset))
+ or (charset and self._codec(charset.replace("-", "")))
+ or (charset and self._codec(charset.replace("-", "_")))
+ or (charset and charset.lower())
+ or charset
+ )
+ if value:
+ return value.lower()
+ return None
+
+ def _codec(self, charset):
+ if not charset:
+ return charset
+ codec = None
+ try:
+ codecs.lookup(charset)
+ codec = charset
+ except (LookupError, ValueError):
+ pass
+ return codec
+
+
+ # A partial mapping of ISO-Latin-1 to HTML entities/XML numeric entities.
+ MS_CHARS = {b'\x80': ('euro', '20AC'),
+ b'\x81': ' ',
+ b'\x82': ('sbquo', '201A'),
+ b'\x83': ('fnof', '192'),
+ b'\x84': ('bdquo', '201E'),
+ b'\x85': ('hellip', '2026'),
+ b'\x86': ('dagger', '2020'),
+ b'\x87': ('Dagger', '2021'),
+ b'\x88': ('circ', '2C6'),
+ b'\x89': ('permil', '2030'),
+ b'\x8A': ('Scaron', '160'),
+ b'\x8B': ('lsaquo', '2039'),
+ b'\x8C': ('OElig', '152'),
+ b'\x8D': '?',
+ b'\x8E': ('#x17D', '17D'),
+ b'\x8F': '?',
+ b'\x90': '?',
+ b'\x91': ('lsquo', '2018'),
+ b'\x92': ('rsquo', '2019'),
+ b'\x93': ('ldquo', '201C'),
+ b'\x94': ('rdquo', '201D'),
+ b'\x95': ('bull', '2022'),
+ b'\x96': ('ndash', '2013'),
+ b'\x97': ('mdash', '2014'),
+ b'\x98': ('tilde', '2DC'),
+ b'\x99': ('trade', '2122'),
+ b'\x9a': ('scaron', '161'),
+ b'\x9b': ('rsaquo', '203A'),
+ b'\x9c': ('oelig', '153'),
+ b'\x9d': '?',
+ b'\x9e': ('#x17E', '17E'),
+ b'\x9f': ('Yuml', ''),}
+
+ # A parochial partial mapping of ISO-Latin-1 to ASCII. Contains
+ # horrors like stripping diacritical marks to turn á into a, but also
+ # contains non-horrors like turning “ into ".
+ MS_CHARS_TO_ASCII = {
+ b'\x80' : 'EUR',
+ b'\x81' : ' ',
+ b'\x82' : ',',
+ b'\x83' : 'f',
+ b'\x84' : ',,',
+ b'\x85' : '...',
+ b'\x86' : '+',
+ b'\x87' : '++',
+ b'\x88' : '^',
+ b'\x89' : '%',
+ b'\x8a' : 'S',
+ b'\x8b' : '<',
+ b'\x8c' : 'OE',
+ b'\x8d' : '?',
+ b'\x8e' : 'Z',
+ b'\x8f' : '?',
+ b'\x90' : '?',
+ b'\x91' : "'",
+ b'\x92' : "'",
+ b'\x93' : '"',
+ b'\x94' : '"',
+ b'\x95' : '*',
+ b'\x96' : '-',
+ b'\x97' : '--',
+ b'\x98' : '~',
+ b'\x99' : '(TM)',
+ b'\x9a' : 's',
+ b'\x9b' : '>',
+ b'\x9c' : 'oe',
+ b'\x9d' : '?',
+ b'\x9e' : 'z',
+ b'\x9f' : 'Y',
+ b'\xa0' : ' ',
+ b'\xa1' : '!',
+ b'\xa2' : 'c',
+ b'\xa3' : 'GBP',
+ b'\xa4' : '$', #This approximation is especially parochial--this is the
+ #generic currency symbol.
+ b'\xa5' : 'YEN',
+ b'\xa6' : '|',
+ b'\xa7' : 'S',
+ b'\xa8' : '..',
+ b'\xa9' : '',
+ b'\xaa' : '(th)',
+ b'\xab' : '<<',
+ b'\xac' : '!',
+ b'\xad' : ' ',
+ b'\xae' : '(R)',
+ b'\xaf' : '-',
+ b'\xb0' : 'o',
+ b'\xb1' : '+-',
+ b'\xb2' : '2',
+ b'\xb3' : '3',
+ b'\xb4' : ("'", 'acute'),
+ b'\xb5' : 'u',
+ b'\xb6' : 'P',
+ b'\xb7' : '*',
+ b'\xb8' : ',',
+ b'\xb9' : '1',
+ b'\xba' : '(th)',
+ b'\xbb' : '>>',
+ b'\xbc' : '1/4',
+ b'\xbd' : '1/2',
+ b'\xbe' : '3/4',
+ b'\xbf' : '?',
+ b'\xc0' : 'A',
+ b'\xc1' : 'A',
+ b'\xc2' : 'A',
+ b'\xc3' : 'A',
+ b'\xc4' : 'A',
+ b'\xc5' : 'A',
+ b'\xc6' : 'AE',
+ b'\xc7' : 'C',
+ b'\xc8' : 'E',
+ b'\xc9' : 'E',
+ b'\xca' : 'E',
+ b'\xcb' : 'E',
+ b'\xcc' : 'I',
+ b'\xcd' : 'I',
+ b'\xce' : 'I',
+ b'\xcf' : 'I',
+ b'\xd0' : 'D',
+ b'\xd1' : 'N',
+ b'\xd2' : 'O',
+ b'\xd3' : 'O',
+ b'\xd4' : 'O',
+ b'\xd5' : 'O',
+ b'\xd6' : 'O',
+ b'\xd7' : '*',
+ b'\xd8' : 'O',
+ b'\xd9' : 'U',
+ b'\xda' : 'U',
+ b'\xdb' : 'U',
+ b'\xdc' : 'U',
+ b'\xdd' : 'Y',
+ b'\xde' : 'b',
+ b'\xdf' : 'B',
+ b'\xe0' : 'a',
+ b'\xe1' : 'a',
+ b'\xe2' : 'a',
+ b'\xe3' : 'a',
+ b'\xe4' : 'a',
+ b'\xe5' : 'a',
+ b'\xe6' : 'ae',
+ b'\xe7' : 'c',
+ b'\xe8' : 'e',
+ b'\xe9' : 'e',
+ b'\xea' : 'e',
+ b'\xeb' : 'e',
+ b'\xec' : 'i',
+ b'\xed' : 'i',
+ b'\xee' : 'i',
+ b'\xef' : 'i',
+ b'\xf0' : 'o',
+ b'\xf1' : 'n',
+ b'\xf2' : 'o',
+ b'\xf3' : 'o',
+ b'\xf4' : 'o',
+ b'\xf5' : 'o',
+ b'\xf6' : 'o',
+ b'\xf7' : '/',
+ b'\xf8' : 'o',
+ b'\xf9' : 'u',
+ b'\xfa' : 'u',
+ b'\xfb' : 'u',
+ b'\xfc' : 'u',
+ b'\xfd' : 'y',
+ b'\xfe' : 'b',
+ b'\xff' : 'y',
+ }
+
+ # A map used when removing rogue Windows-1252/ISO-8859-1
+ # characters in otherwise UTF-8 documents.
+ #
+ # Note that \x81, \x8d, \x8f, \x90, and \x9d are undefined in
+ # Windows-1252.
+ WINDOWS_1252_TO_UTF8 = {
+ 0x80 : b'\xe2\x82\xac', # €
+ 0x82 : b'\xe2\x80\x9a', # ‚
+ 0x83 : b'\xc6\x92', # ƒ
+ 0x84 : b'\xe2\x80\x9e', # „
+ 0x85 : b'\xe2\x80\xa6', # …
+ 0x86 : b'\xe2\x80\xa0', # †
+ 0x87 : b'\xe2\x80\xa1', # ‡
+ 0x88 : b'\xcb\x86', # ˆ
+ 0x89 : b'\xe2\x80\xb0', # ‰
+ 0x8a : b'\xc5\xa0', # Š
+ 0x8b : b'\xe2\x80\xb9', # ‹
+ 0x8c : b'\xc5\x92', # Œ
+ 0x8e : b'\xc5\xbd', # Ž
+ 0x91 : b'\xe2\x80\x98', # ‘
+ 0x92 : b'\xe2\x80\x99', # ’
+ 0x93 : b'\xe2\x80\x9c', # “
+ 0x94 : b'\xe2\x80\x9d', # ”
+ 0x95 : b'\xe2\x80\xa2', # •
+ 0x96 : b'\xe2\x80\x93', # –
+ 0x97 : b'\xe2\x80\x94', # —
+ 0x98 : b'\xcb\x9c', # ˜
+ 0x99 : b'\xe2\x84\xa2', # ™
+ 0x9a : b'\xc5\xa1', # š
+ 0x9b : b'\xe2\x80\xba', # ›
+ 0x9c : b'\xc5\x93', # œ
+ 0x9e : b'\xc5\xbe', # ž
+ 0x9f : b'\xc5\xb8', # Ÿ
+ 0xa0 : b'\xc2\xa0', #  
+ 0xa1 : b'\xc2\xa1', # ¡
+ 0xa2 : b'\xc2\xa2', # ¢
+ 0xa3 : b'\xc2\xa3', # £
+ 0xa4 : b'\xc2\xa4', # ¤
+ 0xa5 : b'\xc2\xa5', # ¥
+ 0xa6 : b'\xc2\xa6', # ¦
+ 0xa7 : b'\xc2\xa7', # §
+ 0xa8 : b'\xc2\xa8', # ¨
+ 0xa9 : b'\xc2\xa9', # ©
+ 0xaa : b'\xc2\xaa', # ª
+ 0xab : b'\xc2\xab', # «
+ 0xac : b'\xc2\xac', # ¬
+ 0xad : b'\xc2\xad', # ­
+ 0xae : b'\xc2\xae', # ®
+ 0xaf : b'\xc2\xaf', # ¯
+ 0xb0 : b'\xc2\xb0', # °
+ 0xb1 : b'\xc2\xb1', # ±
+ 0xb2 : b'\xc2\xb2', # ²
+ 0xb3 : b'\xc2\xb3', # ³
+ 0xb4 : b'\xc2\xb4', # ´
+ 0xb5 : b'\xc2\xb5', # µ
+ 0xb6 : b'\xc2\xb6', # ¶
+ 0xb7 : b'\xc2\xb7', # ·
+ 0xb8 : b'\xc2\xb8', # ¸
+ 0xb9 : b'\xc2\xb9', # ¹
+ 0xba : b'\xc2\xba', # º
+ 0xbb : b'\xc2\xbb', # »
+ 0xbc : b'\xc2\xbc', # ¼
+ 0xbd : b'\xc2\xbd', # ½
+ 0xbe : b'\xc2\xbe', # ¾
+ 0xbf : b'\xc2\xbf', # ¿
+ 0xc0 : b'\xc3\x80', # À
+ 0xc1 : b'\xc3\x81', # Á
+ 0xc2 : b'\xc3\x82', # Â
+ 0xc3 : b'\xc3\x83', # Ã
+ 0xc4 : b'\xc3\x84', # Ä
+ 0xc5 : b'\xc3\x85', # Å
+ 0xc6 : b'\xc3\x86', # Æ
+ 0xc7 : b'\xc3\x87', # Ç
+ 0xc8 : b'\xc3\x88', # È
+ 0xc9 : b'\xc3\x89', # É
+ 0xca : b'\xc3\x8a', # Ê
+ 0xcb : b'\xc3\x8b', # Ë
+ 0xcc : b'\xc3\x8c', # Ì
+ 0xcd : b'\xc3\x8d', # Í
+ 0xce : b'\xc3\x8e', # Î
+ 0xcf : b'\xc3\x8f', # Ï
+ 0xd0 : b'\xc3\x90', # Ð
+ 0xd1 : b'\xc3\x91', # Ñ
+ 0xd2 : b'\xc3\x92', # Ò
+ 0xd3 : b'\xc3\x93', # Ó
+ 0xd4 : b'\xc3\x94', # Ô
+ 0xd5 : b'\xc3\x95', # Õ
+ 0xd6 : b'\xc3\x96', # Ö
+ 0xd7 : b'\xc3\x97', # ×
+ 0xd8 : b'\xc3\x98', # Ø
+ 0xd9 : b'\xc3\x99', # Ù
+ 0xda : b'\xc3\x9a', # Ú
+ 0xdb : b'\xc3\x9b', # Û
+ 0xdc : b'\xc3\x9c', # Ü
+ 0xdd : b'\xc3\x9d', # Ý
+ 0xde : b'\xc3\x9e', # Þ
+ 0xdf : b'\xc3\x9f', # ß
+ 0xe0 : b'\xc3\xa0', # à
+ 0xe1 : b'\xa1', # á
+ 0xe2 : b'\xc3\xa2', # â
+ 0xe3 : b'\xc3\xa3', # ã
+ 0xe4 : b'\xc3\xa4', # ä
+ 0xe5 : b'\xc3\xa5', # å
+ 0xe6 : b'\xc3\xa6', # æ
+ 0xe7 : b'\xc3\xa7', # ç
+ 0xe8 : b'\xc3\xa8', # è
+ 0xe9 : b'\xc3\xa9', # é
+ 0xea : b'\xc3\xaa', # ê
+ 0xeb : b'\xc3\xab', # ë
+ 0xec : b'\xc3\xac', # ì
+ 0xed : b'\xc3\xad', # í
+ 0xee : b'\xc3\xae', # î
+ 0xef : b'\xc3\xaf', # ï
+ 0xf0 : b'\xc3\xb0', # ð
+ 0xf1 : b'\xc3\xb1', # ñ
+ 0xf2 : b'\xc3\xb2', # ò
+ 0xf3 : b'\xc3\xb3', # ó
+ 0xf4 : b'\xc3\xb4', # ô
+ 0xf5 : b'\xc3\xb5', # õ
+ 0xf6 : b'\xc3\xb6', # ö
+ 0xf7 : b'\xc3\xb7', # ÷
+ 0xf8 : b'\xc3\xb8', # ø
+ 0xf9 : b'\xc3\xb9', # ù
+ 0xfa : b'\xc3\xba', # ú
+ 0xfb : b'\xc3\xbb', # û
+ 0xfc : b'\xc3\xbc', # ü
+ 0xfd : b'\xc3\xbd', # ý
+ 0xfe : b'\xc3\xbe', # þ
+ }
+
+ MULTIBYTE_MARKERS_AND_SIZES = [
+ (0xc2, 0xdf, 2), # 2-byte characters start with a byte C2-DF
+ (0xe0, 0xef, 3), # 3-byte characters start with E0-EF
+ (0xf0, 0xf4, 4), # 4-byte characters start with F0-F4
+ ]
+
+ FIRST_MULTIBYTE_MARKER = MULTIBYTE_MARKERS_AND_SIZES[0][0]
+ LAST_MULTIBYTE_MARKER = MULTIBYTE_MARKERS_AND_SIZES[-1][1]
+
+ @classmethod
+ def detwingle(cls, in_bytes, main_encoding="utf8",
+ embedded_encoding="windows-1252"):
+ """Fix characters from one encoding embedded in some other encoding.
+
+ Currently the only situation supported is Windows-1252 (or its
+ subset ISO-8859-1), embedded in UTF-8.
+
+ :param in_bytes: A bytestring that you suspect contains
+ characters from multiple encodings. Note that this _must_
+ be a bytestring. If you've already converted the document
+ to Unicode, you're too late.
+ :param main_encoding: The primary encoding of `in_bytes`.
+ :param embedded_encoding: The encoding that was used to embed characters
+ in the main document.
+ :return: A bytestring in which `embedded_encoding`
+ characters have been converted to their `main_encoding`
+ equivalents.
+ """
+ if embedded_encoding.replace('_', '-').lower() not in (
+ 'windows-1252', 'windows_1252'):
+ raise NotImplementedError(
+ "Windows-1252 and ISO-8859-1 are the only currently supported "
+ "embedded encodings.")
+
+ if main_encoding.lower() not in ('utf8', 'utf-8'):
+ raise NotImplementedError(
+ "UTF-8 is the only currently supported main encoding.")
+
+ byte_chunks = []
+
+ chunk_start = 0
+ pos = 0
+ while pos < len(in_bytes):
+ byte = in_bytes[pos]
+ if not isinstance(byte, int):
+ # Python 2.x
+ byte = ord(byte)
+ if (byte >= cls.FIRST_MULTIBYTE_MARKER
+ and byte <= cls.LAST_MULTIBYTE_MARKER):
+ # This is the start of a UTF-8 multibyte character. Skip
+ # to the end.
+ for start, end, size in cls.MULTIBYTE_MARKERS_AND_SIZES:
+ if byte >= start and byte <= end:
+ pos += size
+ break
+ elif byte >= 0x80 and byte in cls.WINDOWS_1252_TO_UTF8:
+ # We found a Windows-1252 character!
+ # Save the string up to this point as a chunk.
+ byte_chunks.append(in_bytes[chunk_start:pos])
+
+ # Now translate the Windows-1252 character into UTF-8
+ # and add it as another, one-byte chunk.
+ byte_chunks.append(cls.WINDOWS_1252_TO_UTF8[byte])
+ pos += 1
+ chunk_start = pos
+ else:
+ # Go on to the next character.
+ pos += 1
+ if chunk_start == 0:
+ # The string is unchanged.
+ return in_bytes
+ else:
+ # Store the final chunk.
+ byte_chunks.append(in_bytes[chunk_start:])
+ return b''.join(byte_chunks)
+
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/diagnose.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/diagnose.py
new file mode 100644
index 00000000000..500e92df4d3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/diagnose.py
@@ -0,0 +1,242 @@
+"""Diagnostic functions, mainly for use when doing tech support."""
+
+# Use of this source code is governed by the MIT license.
+__license__ = "MIT"
+
+import cProfile
+from io import StringIO
+from html.parser import HTMLParser
+import bs4
+from bs4 import BeautifulSoup, __version__
+from bs4.builder import builder_registry
+
+import os
+import pstats
+import random
+import tempfile
+import time
+import traceback
+import sys
+import cProfile
+
+def diagnose(data):
+ """Diagnostic suite for isolating common problems.
+
+ :param data: A string containing markup that needs to be explained.
+ :return: None; diagnostics are printed to standard output.
+ """
+ print(("Diagnostic running on Beautiful Soup %s" % __version__))
+ print(("Python version %s" % sys.version))
+
+ basic_parsers = ["html.parser", "html5lib", "lxml"]
+ for name in basic_parsers:
+ for builder in builder_registry.builders:
+ if name in builder.features:
+ break
+ else:
+ basic_parsers.remove(name)
+ print((
+ "I noticed that %s is not installed. Installing it may help." %
+ name))
+
+ if 'lxml' in basic_parsers:
+ basic_parsers.append("lxml-xml")
+ try:
+ from lxml import etree
+ print(("Found lxml version %s" % ".".join(map(str,etree.LXML_VERSION))))
+ except ImportError as e:
+ print(
+ "lxml is not installed or couldn't be imported.")
+
+
+ if 'html5lib' in basic_parsers:
+ try:
+ import html5lib
+ print(("Found html5lib version %s" % html5lib.__version__))
+ except ImportError as e:
+ print(
+ "html5lib is not installed or couldn't be imported.")
+
+ if hasattr(data, 'read'):
+ data = data.read()
+ elif data.startswith("http:") or data.startswith("https:"):
+ print(('"%s" looks like a URL. Beautiful Soup is not an HTTP client.' % data))
+ print("You need to use some other library to get the document behind the URL, and feed that document to Beautiful Soup.")
+ return
+ else:
+ try:
+ if os.path.exists(data):
+ print(('"%s" looks like a filename. Reading data from the file.' % data))
+ with open(data) as fp:
+ data = fp.read()
+ except ValueError:
+ # This can happen on some platforms when the 'filename' is
+ # too long. Assume it's data and not a filename.
+ pass
+ print("")
+
+ for parser in basic_parsers:
+ print(("Trying to parse your markup with %s" % parser))
+ success = False
+ try:
+ soup = BeautifulSoup(data, features=parser)
+ success = True
+ except Exception as e:
+ print(("%s could not parse the markup." % parser))
+ traceback.print_exc()
+ if success:
+ print(("Here's what %s did with the markup:" % parser))
+ print((soup.prettify()))
+
+ print(("-" * 80))
+
+def lxml_trace(data, html=True, **kwargs):
+ """Print out the lxml events that occur during parsing.
+
+ This lets you see how lxml parses a document when no Beautiful
+ Soup code is running. You can use this to determine whether
+ an lxml-specific problem is in Beautiful Soup's lxml tree builders
+ or in lxml itself.
+
+ :param data: Some markup.
+ :param html: If True, markup will be parsed with lxml's HTML parser.
+ if False, lxml's XML parser will be used.
+ """
+ from lxml import etree
+ for event, element in etree.iterparse(StringIO(data), html=html, **kwargs):
+ print(("%s, %4s, %s" % (event, element.tag, element.text)))
+
+class AnnouncingParser(HTMLParser):
+ """Subclass of HTMLParser that announces parse events, without doing
+ anything else.
+
+ You can use this to get a picture of how html.parser sees a given
+ document. The easiest way to do this is to call `htmlparser_trace`.
+ """
+
+ def _p(self, s):
+ print(s)
+
+ def handle_starttag(self, name, attrs):
+ self._p("%s START" % name)
+
+ def handle_endtag(self, name):
+ self._p("%s END" % name)
+
+ def handle_data(self, data):
+ self._p("%s DATA" % data)
+
+ def handle_charref(self, name):
+ self._p("%s CHARREF" % name)
+
+ def handle_entityref(self, name):
+ self._p("%s ENTITYREF" % name)
+
+ def handle_comment(self, data):
+ self._p("%s COMMENT" % data)
+
+ def handle_decl(self, data):
+ self._p("%s DECL" % data)
+
+ def unknown_decl(self, data):
+ self._p("%s UNKNOWN-DECL" % data)
+
+ def handle_pi(self, data):
+ self._p("%s PI" % data)
+
+def htmlparser_trace(data):
+ """Print out the HTMLParser events that occur during parsing.
+
+ This lets you see how HTMLParser parses a document when no
+ Beautiful Soup code is running.
+
+ :param data: Some markup.
+ """
+ parser = AnnouncingParser()
+ parser.feed(data)
+
+_vowels = "aeiou"
+_consonants = "bcdfghjklmnpqrstvwxyz"
+
+def rword(length=5):
+ "Generate a random word-like string."
+ s = ''
+ for i in range(length):
+ if i % 2 == 0:
+ t = _consonants
+ else:
+ t = _vowels
+ s += random.choice(t)
+ return s
+
+def rsentence(length=4):
+ "Generate a random sentence-like string."
+ return " ".join(rword(random.randint(4,9)) for i in range(length))
+
+def rdoc(num_elements=1000):
+ """Randomly generate an invalid HTML document."""
+ tag_names = ['p', 'div', 'span', 'i', 'b', 'script', 'table']
+ elements = []
+ for i in range(num_elements):
+ choice = random.randint(0,3)
+ if choice == 0:
+ # New tag.
+ tag_name = random.choice(tag_names)
+ elements.append("<%s>" % tag_name)
+ elif choice == 1:
+ elements.append(rsentence(random.randint(1,4)))
+ elif choice == 2:
+ # Close a tag.
+ tag_name = random.choice(tag_names)
+ elements.append("</%s>" % tag_name)
+ return "<html>" + "\n".join(elements) + "</html>"
+
+def benchmark_parsers(num_elements=100000):
+ """Very basic head-to-head performance benchmark."""
+ print(("Comparative parser benchmark on Beautiful Soup %s" % __version__))
+ data = rdoc(num_elements)
+ print(("Generated a large invalid HTML document (%d bytes)." % len(data)))
+
+ for parser in ["lxml", ["lxml", "html"], "html5lib", "html.parser"]:
+ success = False
+ try:
+ a = time.time()
+ soup = BeautifulSoup(data, parser)
+ b = time.time()
+ success = True
+ except Exception as e:
+ print(("%s could not parse the markup." % parser))
+ traceback.print_exc()
+ if success:
+ print(("BS4+%s parsed the markup in %.2fs." % (parser, b-a)))
+
+ from lxml import etree
+ a = time.time()
+ etree.HTML(data)
+ b = time.time()
+ print(("Raw lxml parsed the markup in %.2fs." % (b-a)))
+
+ import html5lib
+ parser = html5lib.HTMLParser()
+ a = time.time()
+ parser.parse(data)
+ b = time.time()
+ print(("Raw html5lib parsed the markup in %.2fs." % (b-a)))
+
+def profile(num_elements=100000, parser="lxml"):
+ """Use Python's profiler on a randomly generated document."""
+ filehandle = tempfile.NamedTemporaryFile()
+ filename = filehandle.name
+
+ data = rdoc(num_elements)
+ vars = dict(bs4=bs4, data=data, parser=parser)
+ cProfile.runctx('bs4.BeautifulSoup(data, parser)' , vars, vars, filename)
+
+ stats = pstats.Stats(filename)
+ # stats.strip_dirs()
+ stats.sort_stats("cumulative")
+ stats.print_stats('_html5lib|bs4', 50)
+
+# If this file is run as a script, standard input is diagnosed.
+if __name__ == '__main__':
+ diagnose(sys.stdin.read())
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/element.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/element.py
new file mode 100644
index 00000000000..81d9db90f9a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/element.py
@@ -0,0 +1,2175 @@
+# Use of this source code is governed by the MIT license.
+__license__ = "MIT"
+
+try:
+ from collections.abc import Callable # Python 3.6
+except ImportError as e:
+ from collections import Callable
+import re
+import sys
+import warnings
+try:
+ import soupsieve
+except ImportError as e:
+ soupsieve = None
+ warnings.warn(
+ 'The soupsieve package is not installed. CSS selectors cannot be used.'
+ )
+
+from bs4.formatter import (
+ Formatter,
+ HTMLFormatter,
+ XMLFormatter,
+)
+
+DEFAULT_OUTPUT_ENCODING = "utf-8"
+PY3K = (sys.version_info[0] > 2)
+
+nonwhitespace_re = re.compile(r"\S+")
+
+# NOTE: This isn't used as of 4.7.0. I'm leaving it for a little bit on
+# the off chance someone imported it for their own use.
+whitespace_re = re.compile(r"\s+")
+
+def _alias(attr):
+ """Alias one attribute name to another for backward compatibility"""
+ @property
+ def alias(self):
+ return getattr(self, attr)
+
+ @alias.setter
+ def alias(self):
+ return setattr(self, attr)
+ return alias
+
+
+# These encodings are recognized by Python (so PageElement.encode
+# could theoretically support them) but XML and HTML don't recognize
+# them (so they should not show up in an XML or HTML document as that
+# document's encoding).
+#
+# If an XML document is encoded in one of these encodings, no encoding
+# will be mentioned in the XML declaration. If an HTML document is
+# encoded in one of these encodings, and the HTML document has a
+# <meta> tag that mentions an encoding, the encoding will be given as
+# the empty string.
+#
+# Source:
+# https://docs.python.org/3/library/codecs.html#python-specific-encodings
+PYTHON_SPECIFIC_ENCODINGS = set([
+ "idna",
+ "mbcs",
+ "oem",
+ "palmos",
+ "punycode",
+ "raw_unicode_escape",
+ "undefined",
+ "unicode_escape",
+ "raw-unicode-escape",
+ "unicode-escape",
+ "string-escape",
+ "string_escape",
+])
+
+
+class NamespacedAttribute(str):
+ """A namespaced string (e.g. 'xml:lang') that remembers the namespace
+ ('xml') and the name ('lang') that were used to create it.
+ """
+
+ def __new__(cls, prefix, name=None, namespace=None):
+ if not name:
+ # This is the default namespace. Its name "has no value"
+ # per https://www.w3.org/TR/xml-names/#defaulting
+ name = None
+
+ if name is None:
+ obj = str.__new__(cls, prefix)
+ elif prefix is None:
+ # Not really namespaced.
+ obj = str.__new__(cls, name)
+ else:
+ obj = str.__new__(cls, prefix + ":" + name)
+ obj.prefix = prefix
+ obj.name = name
+ obj.namespace = namespace
+ return obj
+
+class AttributeValueWithCharsetSubstitution(str):
+ """A stand-in object for a character encoding specified in HTML."""
+
+class CharsetMetaAttributeValue(AttributeValueWithCharsetSubstitution):
+ """A generic stand-in for the value of a meta tag's 'charset' attribute.
+
+ When Beautiful Soup parses the markup '<meta charset="utf8">', the
+ value of the 'charset' attribute will be one of these objects.
+ """
+
+ def __new__(cls, original_value):
+ obj = str.__new__(cls, original_value)
+ obj.original_value = original_value
+ return obj
+
+ def encode(self, encoding):
+ """When an HTML document is being encoded to a given encoding, the
+ value of a meta tag's 'charset' is the name of the encoding.
+ """
+ if encoding in PYTHON_SPECIFIC_ENCODINGS:
+ return ''
+ return encoding
+
+
+class ContentMetaAttributeValue(AttributeValueWithCharsetSubstitution):
+ """A generic stand-in for the value of a meta tag's 'content' attribute.
+
+ When Beautiful Soup parses the markup:
+ <meta http-equiv="content-type" content="text/html; charset=utf8">
+
+ The value of the 'content' attribute will be one of these objects.
+ """
+
+ CHARSET_RE = re.compile(r"((^|;)\s*charset=)([^;]*)", re.M)
+
+ def __new__(cls, original_value):
+ match = cls.CHARSET_RE.search(original_value)
+ if match is None:
+ # No substitution necessary.
+ return str.__new__(str, original_value)
+
+ obj = str.__new__(cls, original_value)
+ obj.original_value = original_value
+ return obj
+
+ def encode(self, encoding):
+ if encoding in PYTHON_SPECIFIC_ENCODINGS:
+ return ''
+ def rewrite(match):
+ return match.group(1) + encoding
+ return self.CHARSET_RE.sub(rewrite, self.original_value)
+
+
+class PageElement(object):
+ """Contains the navigational information for some part of the page:
+ that is, its current location in the parse tree.
+
+ NavigableString, Tag, etc. are all subclasses of PageElement.
+ """
+
+ def setup(self, parent=None, previous_element=None, next_element=None,
+ previous_sibling=None, next_sibling=None):
+ """Sets up the initial relations between this element and
+ other elements.
+
+ :param parent: The parent of this element.
+
+ :param previous_element: The element parsed immediately before
+ this one.
+
+ :param next_element: The element parsed immediately before
+ this one.
+
+ :param previous_sibling: The most recently encountered element
+ on the same level of the parse tree as this one.
+
+ :param previous_sibling: The next element to be encountered
+ on the same level of the parse tree as this one.
+ """
+ self.parent = parent
+
+ self.previous_element = previous_element
+ if previous_element is not None:
+ self.previous_element.next_element = self
+
+ self.next_element = next_element
+ if self.next_element is not None:
+ self.next_element.previous_element = self
+
+ self.next_sibling = next_sibling
+ if self.next_sibling is not None:
+ self.next_sibling.previous_sibling = self
+
+ if (previous_sibling is None
+ and self.parent is not None and self.parent.contents):
+ previous_sibling = self.parent.contents[-1]
+
+ self.previous_sibling = previous_sibling
+ if previous_sibling is not None:
+ self.previous_sibling.next_sibling = self
+
+ def format_string(self, s, formatter):
+ """Format the given string using the given formatter.
+
+ :param s: A string.
+ :param formatter: A Formatter object, or a string naming one of the standard formatters.
+ """
+ if formatter is None:
+ return s
+ if not isinstance(formatter, Formatter):
+ formatter = self.formatter_for_name(formatter)
+ output = formatter.substitute(s)
+ return output
+
+ def formatter_for_name(self, formatter):
+ """Look up or create a Formatter for the given identifier,
+ if necessary.
+
+ :param formatter: Can be a Formatter object (used as-is), a
+ function (used as the entity substitution hook for an
+ XMLFormatter or HTMLFormatter), or a string (used to look
+ up an XMLFormatter or HTMLFormatter in the appropriate
+ registry.
+ """
+ if isinstance(formatter, Formatter):
+ return formatter
+ if self._is_xml:
+ c = XMLFormatter
+ else:
+ c = HTMLFormatter
+ if isinstance(formatter, Callable):
+ return c(entity_substitution=formatter)
+ return c.REGISTRY[formatter]
+
+ @property
+ def _is_xml(self):
+ """Is this element part of an XML tree or an HTML tree?
+
+ This is used in formatter_for_name, when deciding whether an
+ XMLFormatter or HTMLFormatter is more appropriate. It can be
+ inefficient, but it should be called very rarely.
+ """
+ if self.known_xml is not None:
+ # Most of the time we will have determined this when the
+ # document is parsed.
+ return self.known_xml
+
+ # Otherwise, it's likely that this element was created by
+ # direct invocation of the constructor from within the user's
+ # Python code.
+ if self.parent is None:
+ # This is the top-level object. It should have .known_xml set
+ # from tree creation. If not, take a guess--BS is usually
+ # used on HTML markup.
+ return getattr(self, 'is_xml', False)
+ return self.parent._is_xml
+
+ nextSibling = _alias("next_sibling") # BS3
+ previousSibling = _alias("previous_sibling") # BS3
+
+ def replace_with(self, replace_with):
+ """Replace this PageElement with another one, keeping the rest of the
+ tree the same.
+
+ :param replace_with: A PageElement.
+ :return: `self`, no longer part of the tree.
+ """
+ if self.parent is None:
+ raise ValueError(
+ "Cannot replace one element with another when the "
+ "element to be replaced is not part of a tree.")
+ if replace_with is self:
+ return
+ if replace_with is self.parent:
+ raise ValueError("Cannot replace a Tag with its parent.")
+ old_parent = self.parent
+ my_index = self.parent.index(self)
+ self.extract(_self_index=my_index)
+ old_parent.insert(my_index, replace_with)
+ return self
+ replaceWith = replace_with # BS3
+
+ def unwrap(self):
+ """Replace this PageElement with its contents.
+
+ :return: `self`, no longer part of the tree.
+ """
+ my_parent = self.parent
+ if self.parent is None:
+ raise ValueError(
+ "Cannot replace an element with its contents when that"
+ "element is not part of a tree.")
+ my_index = self.parent.index(self)
+ self.extract(_self_index=my_index)
+ for child in reversed(self.contents[:]):
+ my_parent.insert(my_index, child)
+ return self
+ replace_with_children = unwrap
+ replaceWithChildren = unwrap # BS3
+
+ def wrap(self, wrap_inside):
+ """Wrap this PageElement inside another one.
+
+ :param wrap_inside: A PageElement.
+ :return: `wrap_inside`, occupying the position in the tree that used
+ to be occupied by `self`, and with `self` inside it.
+ """
+ me = self.replace_with(wrap_inside)
+ wrap_inside.append(me)
+ return wrap_inside
+
+ def extract(self, _self_index=None):
+ """Destructively rips this element out of the tree.
+
+ :param _self_index: The location of this element in its parent's
+ .contents, if known. Passing this in allows for a performance
+ optimization.
+
+ :return: `self`, no longer part of the tree.
+ """
+ if self.parent is not None:
+ if _self_index is None:
+ _self_index = self.parent.index(self)
+ del self.parent.contents[_self_index]
+
+ #Find the two elements that would be next to each other if
+ #this element (and any children) hadn't been parsed. Connect
+ #the two.
+ last_child = self._last_descendant()
+ next_element = last_child.next_element
+
+ if (self.previous_element is not None and
+ self.previous_element is not next_element):
+ self.previous_element.next_element = next_element
+ if next_element is not None and next_element is not self.previous_element:
+ next_element.previous_element = self.previous_element
+ self.previous_element = None
+ last_child.next_element = None
+
+ self.parent = None
+ if (self.previous_sibling is not None
+ and self.previous_sibling is not self.next_sibling):
+ self.previous_sibling.next_sibling = self.next_sibling
+ if (self.next_sibling is not None
+ and self.next_sibling is not self.previous_sibling):
+ self.next_sibling.previous_sibling = self.previous_sibling
+ self.previous_sibling = self.next_sibling = None
+ return self
+
+ def _last_descendant(self, is_initialized=True, accept_self=True):
+ """Finds the last element beneath this object to be parsed.
+
+ :param is_initialized: Has `setup` been called on this PageElement
+ yet?
+ :param accept_self: Is `self` an acceptable answer to the question?
+ """
+ if is_initialized and self.next_sibling is not None:
+ last_child = self.next_sibling.previous_element
+ else:
+ last_child = self
+ while isinstance(last_child, Tag) and last_child.contents:
+ last_child = last_child.contents[-1]
+ if not accept_self and last_child is self:
+ last_child = None
+ return last_child
+ # BS3: Not part of the API!
+ _lastRecursiveChild = _last_descendant
+
+ def insert(self, position, new_child):
+ """Insert a new PageElement in the list of this PageElement's children.
+
+ This works the same way as `list.insert`.
+
+ :param position: The numeric position that should be occupied
+ in `self.children` by the new PageElement.
+ :param new_child: A PageElement.
+ """
+ if new_child is None:
+ raise ValueError("Cannot insert None into a tag.")
+ if new_child is self:
+ raise ValueError("Cannot insert a tag into itself.")
+ if (isinstance(new_child, str)
+ and not isinstance(new_child, NavigableString)):
+ new_child = NavigableString(new_child)
+
+ from bs4 import BeautifulSoup
+ if isinstance(new_child, BeautifulSoup):
+ # We don't want to end up with a situation where one BeautifulSoup
+ # object contains another. Insert the children one at a time.
+ for subchild in list(new_child.contents):
+ self.insert(position, subchild)
+ position += 1
+ return
+ position = min(position, len(self.contents))
+ if hasattr(new_child, 'parent') and new_child.parent is not None:
+ # We're 'inserting' an element that's already one
+ # of this object's children.
+ if new_child.parent is self:
+ current_index = self.index(new_child)
+ if current_index < position:
+ # We're moving this element further down the list
+ # of this object's children. That means that when
+ # we extract this element, our target index will
+ # jump down one.
+ position -= 1
+ new_child.extract()
+
+ new_child.parent = self
+ previous_child = None
+ if position == 0:
+ new_child.previous_sibling = None
+ new_child.previous_element = self
+ else:
+ previous_child = self.contents[position - 1]
+ new_child.previous_sibling = previous_child
+ new_child.previous_sibling.next_sibling = new_child
+ new_child.previous_element = previous_child._last_descendant(False)
+ if new_child.previous_element is not None:
+ new_child.previous_element.next_element = new_child
+
+ new_childs_last_element = new_child._last_descendant(False)
+
+ if position >= len(self.contents):
+ new_child.next_sibling = None
+
+ parent = self
+ parents_next_sibling = None
+ while parents_next_sibling is None and parent is not None:
+ parents_next_sibling = parent.next_sibling
+ parent = parent.parent
+ if parents_next_sibling is not None:
+ # We found the element that comes next in the document.
+ break
+ if parents_next_sibling is not None:
+ new_childs_last_element.next_element = parents_next_sibling
+ else:
+ # The last element of this tag is the last element in
+ # the document.
+ new_childs_last_element.next_element = None
+ else:
+ next_child = self.contents[position]
+ new_child.next_sibling = next_child
+ if new_child.next_sibling is not None:
+ new_child.next_sibling.previous_sibling = new_child
+ new_childs_last_element.next_element = next_child
+
+ if new_childs_last_element.next_element is not None:
+ new_childs_last_element.next_element.previous_element = new_childs_last_element
+ self.contents.insert(position, new_child)
+
+ def append(self, tag):
+ """Appends the given PageElement to the contents of this one.
+
+ :param tag: A PageElement.
+ """
+ self.insert(len(self.contents), tag)
+
+ def extend(self, tags):
+ """Appends the given PageElements to this one's contents.
+
+ :param tags: A list of PageElements.
+ """
+ if isinstance(tags, Tag):
+ # Calling self.append() on another tag's contents will change
+ # the list we're iterating over. Make a list that won't
+ # change.
+ tags = list(tags.contents)
+ for tag in tags:
+ self.append(tag)
+
+ def insert_before(self, *args):
+ """Makes the given element(s) the immediate predecessor of this one.
+
+ All the elements will have the same parent, and the given elements
+ will be immediately before this one.
+
+ :param args: One or more PageElements.
+ """
+ parent = self.parent
+ if parent is None:
+ raise ValueError(
+ "Element has no parent, so 'before' has no meaning.")
+ if any(x is self for x in args):
+ raise ValueError("Can't insert an element before itself.")
+ for predecessor in args:
+ # Extract first so that the index won't be screwed up if they
+ # are siblings.
+ if isinstance(predecessor, PageElement):
+ predecessor.extract()
+ index = parent.index(self)
+ parent.insert(index, predecessor)
+
+ def insert_after(self, *args):
+ """Makes the given element(s) the immediate successor of this one.
+
+ The elements will have the same parent, and the given elements
+ will be immediately after this one.
+
+ :param args: One or more PageElements.
+ """
+ # Do all error checking before modifying the tree.
+ parent = self.parent
+ if parent is None:
+ raise ValueError(
+ "Element has no parent, so 'after' has no meaning.")
+ if any(x is self for x in args):
+ raise ValueError("Can't insert an element after itself.")
+
+ offset = 0
+ for successor in args:
+ # Extract first so that the index won't be screwed up if they
+ # are siblings.
+ if isinstance(successor, PageElement):
+ successor.extract()
+ index = parent.index(self)
+ parent.insert(index+1+offset, successor)
+ offset += 1
+
+ def find_next(self, name=None, attrs={}, text=None, **kwargs):
+ """Find the first PageElement that matches the given criteria and
+ appears later in the document than this PageElement.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param text: A filter for a NavigableString with specific text.
+ :kwargs: A dictionary of filters on attribute values.
+ :return: A PageElement.
+ :rtype: bs4.element.Tag | bs4.element.NavigableString
+ """
+ return self._find_one(self.find_all_next, name, attrs, text, **kwargs)
+ findNext = find_next # BS3
+
+ def find_all_next(self, name=None, attrs={}, text=None, limit=None,
+ **kwargs):
+ """Find all PageElements that match the given criteria and appear
+ later in the document than this PageElement.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param text: A filter for a NavigableString with specific text.
+ :param limit: Stop looking after finding this many results.
+ :kwargs: A dictionary of filters on attribute values.
+ :return: A ResultSet containing PageElements.
+ """
+ return self._find_all(name, attrs, text, limit, self.next_elements,
+ **kwargs)
+ findAllNext = find_all_next # BS3
+
+ def find_next_sibling(self, name=None, attrs={}, text=None, **kwargs):
+ """Find the closest sibling to this PageElement that matches the
+ given criteria and appears later in the document.
+
+ All find_* methods take a common set of arguments. See the
+ online documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param text: A filter for a NavigableString with specific text.
+ :kwargs: A dictionary of filters on attribute values.
+ :return: A PageElement.
+ :rtype: bs4.element.Tag | bs4.element.NavigableString
+ """
+ return self._find_one(self.find_next_siblings, name, attrs, text,
+ **kwargs)
+ findNextSibling = find_next_sibling # BS3
+
+ def find_next_siblings(self, name=None, attrs={}, text=None, limit=None,
+ **kwargs):
+ """Find all siblings of this PageElement that match the given criteria
+ and appear later in the document.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param text: A filter for a NavigableString with specific text.
+ :param limit: Stop looking after finding this many results.
+ :kwargs: A dictionary of filters on attribute values.
+ :return: A ResultSet of PageElements.
+ :rtype: bs4.element.ResultSet
+ """
+ return self._find_all(name, attrs, text, limit,
+ self.next_siblings, **kwargs)
+ findNextSiblings = find_next_siblings # BS3
+ fetchNextSiblings = find_next_siblings # BS2
+
+ def find_previous(self, name=None, attrs={}, text=None, **kwargs):
+ """Look backwards in the document from this PageElement and find the
+ first PageElement that matches the given criteria.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param text: A filter for a NavigableString with specific text.
+ :kwargs: A dictionary of filters on attribute values.
+ :return: A PageElement.
+ :rtype: bs4.element.Tag | bs4.element.NavigableString
+ """
+ return self._find_one(
+ self.find_all_previous, name, attrs, text, **kwargs)
+ findPrevious = find_previous # BS3
+
+ def find_all_previous(self, name=None, attrs={}, text=None, limit=None,
+ **kwargs):
+ """Look backwards in the document from this PageElement and find all
+ PageElements that match the given criteria.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param text: A filter for a NavigableString with specific text.
+ :param limit: Stop looking after finding this many results.
+ :kwargs: A dictionary of filters on attribute values.
+ :return: A ResultSet of PageElements.
+ :rtype: bs4.element.ResultSet
+ """
+ return self._find_all(name, attrs, text, limit, self.previous_elements,
+ **kwargs)
+ findAllPrevious = find_all_previous # BS3
+ fetchPrevious = find_all_previous # BS2
+
+ def find_previous_sibling(self, name=None, attrs={}, text=None, **kwargs):
+ """Returns the closest sibling to this PageElement that matches the
+ given criteria and appears earlier in the document.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param text: A filter for a NavigableString with specific text.
+ :kwargs: A dictionary of filters on attribute values.
+ :return: A PageElement.
+ :rtype: bs4.element.Tag | bs4.element.NavigableString
+ """
+ return self._find_one(self.find_previous_siblings, name, attrs, text,
+ **kwargs)
+ findPreviousSibling = find_previous_sibling # BS3
+
+ def find_previous_siblings(self, name=None, attrs={}, text=None,
+ limit=None, **kwargs):
+ """Returns all siblings to this PageElement that match the
+ given criteria and appear earlier in the document.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param text: A filter for a NavigableString with specific text.
+ :param limit: Stop looking after finding this many results.
+ :kwargs: A dictionary of filters on attribute values.
+ :return: A ResultSet of PageElements.
+ :rtype: bs4.element.ResultSet
+ """
+ return self._find_all(name, attrs, text, limit,
+ self.previous_siblings, **kwargs)
+ findPreviousSiblings = find_previous_siblings # BS3
+ fetchPreviousSiblings = find_previous_siblings # BS2
+
+ def find_parent(self, name=None, attrs={}, **kwargs):
+ """Find the closest parent of this PageElement that matches the given
+ criteria.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :kwargs: A dictionary of filters on attribute values.
+
+ :return: A PageElement.
+ :rtype: bs4.element.Tag | bs4.element.NavigableString
+ """
+ # NOTE: We can't use _find_one because findParents takes a different
+ # set of arguments.
+ r = None
+ l = self.find_parents(name, attrs, 1, **kwargs)
+ if l:
+ r = l[0]
+ return r
+ findParent = find_parent # BS3
+
+ def find_parents(self, name=None, attrs={}, limit=None, **kwargs):
+ """Find all parents of this PageElement that match the given criteria.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param limit: Stop looking after finding this many results.
+ :kwargs: A dictionary of filters on attribute values.
+
+ :return: A PageElement.
+ :rtype: bs4.element.Tag | bs4.element.NavigableString
+ """
+ return self._find_all(name, attrs, None, limit, self.parents,
+ **kwargs)
+ findParents = find_parents # BS3
+ fetchParents = find_parents # BS2
+
+ @property
+ def next(self):
+ """The PageElement, if any, that was parsed just after this one.
+
+ :return: A PageElement.
+ :rtype: bs4.element.Tag | bs4.element.NavigableString
+ """
+ return self.next_element
+
+ @property
+ def previous(self):
+ """The PageElement, if any, that was parsed just before this one.
+
+ :return: A PageElement.
+ :rtype: bs4.element.Tag | bs4.element.NavigableString
+ """
+ return self.previous_element
+
+ #These methods do the real heavy lifting.
+
+ def _find_one(self, method, name, attrs, text, **kwargs):
+ r = None
+ l = method(name, attrs, text, 1, **kwargs)
+ if l:
+ r = l[0]
+ return r
+
+ def _find_all(self, name, attrs, text, limit, generator, **kwargs):
+ "Iterates over a generator looking for things that match."
+
+ if text is None and 'string' in kwargs:
+ text = kwargs['string']
+ del kwargs['string']
+
+ if isinstance(name, SoupStrainer):
+ strainer = name
+ else:
+ strainer = SoupStrainer(name, attrs, text, **kwargs)
+
+ if text is None and not limit and not attrs and not kwargs:
+ if name is True or name is None:
+ # Optimization to find all tags.
+ result = (element for element in generator
+ if isinstance(element, Tag))
+ return ResultSet(strainer, result)
+ elif isinstance(name, str):
+ # Optimization to find all tags with a given name.
+ if name.count(':') == 1:
+ # This is a name with a prefix. If this is a namespace-aware document,
+ # we need to match the local name against tag.name. If not,
+ # we need to match the fully-qualified name against tag.name.
+ prefix, local_name = name.split(':', 1)
+ else:
+ prefix = None
+ local_name = name
+ result = (element for element in generator
+ if isinstance(element, Tag)
+ and (
+ element.name == name
+ ) or (
+ element.name == local_name
+ and (prefix is None or element.prefix == prefix)
+ )
+ )
+ return ResultSet(strainer, result)
+ results = ResultSet(strainer)
+ while True:
+ try:
+ i = next(generator)
+ except StopIteration:
+ break
+ if i:
+ found = strainer.search(i)
+ if found:
+ results.append(found)
+ if limit and len(results) >= limit:
+ break
+ return results
+
+ #These generators can be used to navigate starting from both
+ #NavigableStrings and Tags.
+ @property
+ def next_elements(self):
+ """All PageElements that were parsed after this one.
+
+ :yield: A sequence of PageElements.
+ """
+ i = self.next_element
+ while i is not None:
+ yield i
+ i = i.next_element
+
+ @property
+ def next_siblings(self):
+ """All PageElements that are siblings of this one but were parsed
+ later.
+
+ :yield: A sequence of PageElements.
+ """
+ i = self.next_sibling
+ while i is not None:
+ yield i
+ i = i.next_sibling
+
+ @property
+ def previous_elements(self):
+ """All PageElements that were parsed before this one.
+
+ :yield: A sequence of PageElements.
+ """
+ i = self.previous_element
+ while i is not None:
+ yield i
+ i = i.previous_element
+
+ @property
+ def previous_siblings(self):
+ """All PageElements that are siblings of this one but were parsed
+ earlier.
+
+ :yield: A sequence of PageElements.
+ """
+ i = self.previous_sibling
+ while i is not None:
+ yield i
+ i = i.previous_sibling
+
+ @property
+ def parents(self):
+ """All PageElements that are parents of this PageElement.
+
+ :yield: A sequence of PageElements.
+ """
+ i = self.parent
+ while i is not None:
+ yield i
+ i = i.parent
+
+ @property
+ def decomposed(self):
+ """Check whether a PageElement has been decomposed.
+
+ :rtype: bool
+ """
+ return getattr(self, '_decomposed', False) or False
+
+ # Old non-property versions of the generators, for backwards
+ # compatibility with BS3.
+ def nextGenerator(self):
+ return self.next_elements
+
+ def nextSiblingGenerator(self):
+ return self.next_siblings
+
+ def previousGenerator(self):
+ return self.previous_elements
+
+ def previousSiblingGenerator(self):
+ return self.previous_siblings
+
+ def parentGenerator(self):
+ return self.parents
+
+
+class NavigableString(str, PageElement):
+ """A Python Unicode string that is part of a parse tree.
+
+ When Beautiful Soup parses the markup <b>penguin</b>, it will
+ create a NavigableString for the string "penguin".
+ """
+
+ PREFIX = ''
+ SUFFIX = ''
+
+ # We can't tell just by looking at a string whether it's contained
+ # in an XML document or an HTML document.
+
+ known_xml = None
+
+ def __new__(cls, value):
+ """Create a new NavigableString.
+
+ When unpickling a NavigableString, this method is called with
+ the string in DEFAULT_OUTPUT_ENCODING. That encoding needs to be
+ passed in to the superclass's __new__ or the superclass won't know
+ how to handle non-ASCII characters.
+ """
+ if isinstance(value, str):
+ u = str.__new__(cls, value)
+ else:
+ u = str.__new__(cls, value, DEFAULT_OUTPUT_ENCODING)
+ u.setup()
+ return u
+
+ def __copy__(self):
+ """A copy of a NavigableString has the same contents and class
+ as the original, but it is not connected to the parse tree.
+ """
+ return type(self)(self)
+
+ def __getnewargs__(self):
+ return (str(self),)
+
+ def __getattr__(self, attr):
+ """text.string gives you text. This is for backwards
+ compatibility for Navigable*String, but for CData* it lets you
+ get the string without the CData wrapper."""
+ if attr == 'string':
+ return self
+ else:
+ raise AttributeError(
+ "'%s' object has no attribute '%s'" % (
+ self.__class__.__name__, attr))
+
+ def output_ready(self, formatter="minimal"):
+ """Run the string through the provided formatter.
+
+ :param formatter: A Formatter object, or a string naming one of the standard formatters.
+ """
+ output = self.format_string(self, formatter)
+ return self.PREFIX + output + self.SUFFIX
+
+ @property
+ def name(self):
+ """Since a NavigableString is not a Tag, it has no .name.
+
+ This property is implemented so that code like this doesn't crash
+ when run on a mixture of Tag and NavigableString objects:
+ [x.name for x in tag.children]
+ """
+ return None
+
+ @name.setter
+ def name(self, name):
+ """Prevent NavigableString.name from ever being set."""
+ raise AttributeError("A NavigableString cannot be given a name.")
+
+
+class PreformattedString(NavigableString):
+ """A NavigableString not subject to the normal formatting rules.
+
+ This is an abstract class used for special kinds of strings such
+ as comments (the Comment class) and CDATA blocks (the CData
+ class).
+ """
+
+ PREFIX = ''
+ SUFFIX = ''
+
+ def output_ready(self, formatter=None):
+ """Make this string ready for output by adding any subclass-specific
+ prefix or suffix.
+
+ :param formatter: A Formatter object, or a string naming one
+ of the standard formatters. The string will be passed into the
+ Formatter, but only to trigger any side effects: the return
+ value is ignored.
+
+ :return: The string, with any subclass-specific prefix and
+ suffix added on.
+ """
+ if formatter is not None:
+ ignore = self.format_string(self, formatter)
+ return self.PREFIX + self + self.SUFFIX
+
+class CData(PreformattedString):
+ """A CDATA block."""
+ PREFIX = '<![CDATA['
+ SUFFIX = ']]>'
+
+class ProcessingInstruction(PreformattedString):
+ """A SGML processing instruction."""
+
+ PREFIX = '<?'
+ SUFFIX = '>'
+
+class XMLProcessingInstruction(ProcessingInstruction):
+ """An XML processing instruction."""
+ PREFIX = '<?'
+ SUFFIX = '?>'
+
+class Comment(PreformattedString):
+ """An HTML or XML comment."""
+ PREFIX = '<!--'
+ SUFFIX = '-->'
+
+
+class Declaration(PreformattedString):
+ """An XML declaration."""
+ PREFIX = '<?'
+ SUFFIX = '?>'
+
+
+class Doctype(PreformattedString):
+ """A document type declaration."""
+ @classmethod
+ def for_name_and_ids(cls, name, pub_id, system_id):
+ """Generate an appropriate document type declaration for a given
+ public ID and system ID.
+
+ :param name: The name of the document's root element, e.g. 'html'.
+ :param pub_id: The Formal Public Identifier for this document type,
+ e.g. '-//W3C//DTD XHTML 1.1//EN'
+ :param system_id: The system identifier for this document type,
+ e.g. 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'
+
+ :return: A Doctype.
+ """
+ value = name or ''
+ if pub_id is not None:
+ value += ' PUBLIC "%s"' % pub_id
+ if system_id is not None:
+ value += ' "%s"' % system_id
+ elif system_id is not None:
+ value += ' SYSTEM "%s"' % system_id
+
+ return Doctype(value)
+
+ PREFIX = '<!DOCTYPE '
+ SUFFIX = '>\n'
+
+
+class Stylesheet(NavigableString):
+ """A NavigableString representing an stylesheet (probably
+ CSS).
+
+ Used to distinguish embedded stylesheets from textual content.
+ """
+ pass
+
+
+class Script(NavigableString):
+ """A NavigableString representing an executable script (probably
+ Javascript).
+
+ Used to distinguish executable code from textual content.
+ """
+ pass
+
+
+class TemplateString(NavigableString):
+ """A NavigableString representing a string found inside an HTML
+ template embedded in a larger document.
+
+ Used to distinguish such strings from the main body of the document.
+ """
+ pass
+
+
+class Tag(PageElement):
+ """Represents an HTML or XML tag that is part of a parse tree, along
+ with its attributes and contents.
+
+ When Beautiful Soup parses the markup <b>penguin</b>, it will
+ create a Tag object representing the <b> tag.
+ """
+
+ def __init__(self, parser=None, builder=None, name=None, namespace=None,
+ prefix=None, attrs=None, parent=None, previous=None,
+ is_xml=None, sourceline=None, sourcepos=None,
+ can_be_empty_element=None, cdata_list_attributes=None,
+ preserve_whitespace_tags=None
+ ):
+ """Basic constructor.
+
+ :param parser: A BeautifulSoup object.
+ :param builder: A TreeBuilder.
+ :param name: The name of the tag.
+ :param namespace: The URI of this Tag's XML namespace, if any.
+ :param prefix: The prefix for this Tag's XML namespace, if any.
+ :param attrs: A dictionary of this Tag's attribute values.
+ :param parent: The PageElement to use as this Tag's parent.
+ :param previous: The PageElement that was parsed immediately before
+ this tag.
+ :param is_xml: If True, this is an XML tag. Otherwise, this is an
+ HTML tag.
+ :param sourceline: The line number where this tag was found in its
+ source document.
+ :param sourcepos: The character position within `sourceline` where this
+ tag was found.
+ :param can_be_empty_element: If True, this tag should be
+ represented as <tag/>. If False, this tag should be represented
+ as <tag></tag>.
+ :param cdata_list_attributes: A list of attributes whose values should
+ be treated as CDATA if they ever show up on this tag.
+ :param preserve_whitespace_tags: A list of tag names whose contents
+ should have their whitespace preserved.
+ """
+ if parser is None:
+ self.parser_class = None
+ else:
+ # We don't actually store the parser object: that lets extracted
+ # chunks be garbage-collected.
+ self.parser_class = parser.__class__
+ if name is None:
+ raise ValueError("No value provided for new tag's name.")
+ self.name = name
+ self.namespace = namespace
+ self.prefix = prefix
+ if ((not builder or builder.store_line_numbers)
+ and (sourceline is not None or sourcepos is not None)):
+ self.sourceline = sourceline
+ self.sourcepos = sourcepos
+ if attrs is None:
+ attrs = {}
+ elif attrs:
+ if builder is not None and builder.cdata_list_attributes:
+ attrs = builder._replace_cdata_list_attribute_values(
+ self.name, attrs)
+ else:
+ attrs = dict(attrs)
+ else:
+ attrs = dict(attrs)
+
+ # If possible, determine ahead of time whether this tag is an
+ # XML tag.
+ if builder:
+ self.known_xml = builder.is_xml
+ else:
+ self.known_xml = is_xml
+ self.attrs = attrs
+ self.contents = []
+ self.setup(parent, previous)
+ self.hidden = False
+
+ if builder is None:
+ # In the absence of a TreeBuilder, use whatever values were
+ # passed in here. They're probably None, unless this is a copy of some
+ # other tag.
+ self.can_be_empty_element = can_be_empty_element
+ self.cdata_list_attributes = cdata_list_attributes
+ self.preserve_whitespace_tags = preserve_whitespace_tags
+ else:
+ # Set up any substitutions for this tag, such as the charset in a META tag.
+ builder.set_up_substitutions(self)
+
+ # Ask the TreeBuilder whether this tag might be an empty-element tag.
+ self.can_be_empty_element = builder.can_be_empty_element(name)
+
+ # Keep track of the list of attributes of this tag that
+ # might need to be treated as a list.
+ #
+ # For performance reasons, we store the whole data structure
+ # rather than asking the question of every tag. Asking would
+ # require building a new data structure every time, and
+ # (unlike can_be_empty_element), we almost never need
+ # to check this.
+ self.cdata_list_attributes = builder.cdata_list_attributes
+
+ # Keep track of the names that might cause this tag to be treated as a
+ # whitespace-preserved tag.
+ self.preserve_whitespace_tags = builder.preserve_whitespace_tags
+
+ parserClass = _alias("parser_class") # BS3
+
+ def __copy__(self):
+ """A copy of a Tag is a new Tag, unconnected to the parse tree.
+ Its contents are a copy of the old Tag's contents.
+ """
+ clone = type(self)(
+ None, self.builder, self.name, self.namespace,
+ self.prefix, self.attrs, is_xml=self._is_xml,
+ sourceline=self.sourceline, sourcepos=self.sourcepos,
+ can_be_empty_element=self.can_be_empty_element,
+ cdata_list_attributes=self.cdata_list_attributes,
+ preserve_whitespace_tags=self.preserve_whitespace_tags
+ )
+ for attr in ('can_be_empty_element', 'hidden'):
+ setattr(clone, attr, getattr(self, attr))
+ for child in self.contents:
+ clone.append(child.__copy__())
+ return clone
+
+ @property
+ def is_empty_element(self):
+ """Is this tag an empty-element tag? (aka a self-closing tag)
+
+ A tag that has contents is never an empty-element tag.
+
+ A tag that has no contents may or may not be an empty-element
+ tag. It depends on the builder used to create the tag. If the
+ builder has a designated list of empty-element tags, then only
+ a tag whose name shows up in that list is considered an
+ empty-element tag.
+
+ If the builder has no designated list of empty-element tags,
+ then any tag with no contents is an empty-element tag.
+ """
+ return len(self.contents) == 0 and self.can_be_empty_element
+ isSelfClosing = is_empty_element # BS3
+
+ @property
+ def string(self):
+ """Convenience property to get the single string within this
+ PageElement.
+
+ TODO It might make sense to have NavigableString.string return
+ itself.
+
+ :return: If this element has a single string child, return
+ value is that string. If this element has one child tag,
+ return value is the 'string' attribute of the child tag,
+ recursively. If this element is itself a string, has no
+ children, or has more than one child, return value is None.
+ """
+ if len(self.contents) != 1:
+ return None
+ child = self.contents[0]
+ if isinstance(child, NavigableString):
+ return child
+ return child.string
+
+ @string.setter
+ def string(self, string):
+ """Replace this PageElement's contents with `string`."""
+ self.clear()
+ self.append(string.__class__(string))
+
+ def _all_strings(self, strip=False, types=(NavigableString, CData)):
+ """Yield all strings of certain classes, possibly stripping them.
+
+ :param strip: If True, all strings will be stripped before being
+ yielded.
+
+ :types: A tuple of NavigableString subclasses. Any strings of
+ a subclass not found in this list will be ignored. By
+ default, this means only NavigableString and CData objects
+ will be considered. So no comments, processing instructions,
+ etc.
+
+ :yield: A sequence of strings.
+ """
+ for descendant in self.descendants:
+ if (
+ (types is None and not isinstance(descendant, NavigableString))
+ or
+ (types is not None and type(descendant) not in types)):
+ continue
+ if strip:
+ descendant = descendant.strip()
+ if len(descendant) == 0:
+ continue
+ yield descendant
+
+ strings = property(_all_strings)
+
+ @property
+ def stripped_strings(self):
+ """Yield all strings in the document, stripping them first.
+
+ :yield: A sequence of stripped strings.
+ """
+ for string in self._all_strings(True):
+ yield string
+
+ def get_text(self, separator="", strip=False,
+ types=(NavigableString, CData)):
+ """Get all child strings, concatenated using the given separator.
+
+ :param separator: Strings will be concatenated using this separator.
+
+ :param strip: If True, strings will be stripped before being
+ concatenated.
+
+ :types: A tuple of NavigableString subclasses. Any strings of
+ a subclass not found in this list will be ignored. By
+ default, this means only NavigableString and CData objects
+ will be considered. So no comments, processing instructions,
+ stylesheets, etc.
+
+ :return: A string.
+ """
+ return separator.join([s for s in self._all_strings(
+ strip, types=types)])
+ getText = get_text
+ text = property(get_text)
+
+ def decompose(self):
+ """Recursively destroys this PageElement and its children.
+
+ This element will be removed from the tree and wiped out; so
+ will everything beneath it.
+
+ The behavior of a decomposed PageElement is undefined and you
+ should never use one for anything, but if you need to _check_
+ whether an element has been decomposed, you can use the
+ `decomposed` property.
+ """
+ self.extract()
+ i = self
+ while i is not None:
+ n = i.next_element
+ i.__dict__.clear()
+ i.contents = []
+ i._decomposed = True
+ i = n
+
+ def clear(self, decompose=False):
+ """Wipe out all children of this PageElement by calling extract()
+ on them.
+
+ :param decompose: If this is True, decompose() (a more
+ destructive method) will be called instead of extract().
+ """
+ if decompose:
+ for element in self.contents[:]:
+ if isinstance(element, Tag):
+ element.decompose()
+ else:
+ element.extract()
+ else:
+ for element in self.contents[:]:
+ element.extract()
+
+ def smooth(self):
+ """Smooth out this element's children by consolidating consecutive
+ strings.
+
+ This makes pretty-printed output look more natural following a
+ lot of operations that modified the tree.
+ """
+ # Mark the first position of every pair of children that need
+ # to be consolidated. Do this rather than making a copy of
+ # self.contents, since in most cases very few strings will be
+ # affected.
+ marked = []
+ for i, a in enumerate(self.contents):
+ if isinstance(a, Tag):
+ # Recursively smooth children.
+ a.smooth()
+ if i == len(self.contents)-1:
+ # This is the last item in .contents, and it's not a
+ # tag. There's no chance it needs any work.
+ continue
+ b = self.contents[i+1]
+ if (isinstance(a, NavigableString)
+ and isinstance(b, NavigableString)
+ and not isinstance(a, PreformattedString)
+ and not isinstance(b, PreformattedString)
+ ):
+ marked.append(i)
+
+ # Go over the marked positions in reverse order, so that
+ # removing items from .contents won't affect the remaining
+ # positions.
+ for i in reversed(marked):
+ a = self.contents[i]
+ b = self.contents[i+1]
+ b.extract()
+ n = NavigableString(a+b)
+ a.replace_with(n)
+
+ def index(self, element):
+ """Find the index of a child by identity, not value.
+
+ Avoids issues with tag.contents.index(element) getting the
+ index of equal elements.
+
+ :param element: Look for this PageElement in `self.contents`.
+ """
+ for i, child in enumerate(self.contents):
+ if child is element:
+ return i
+ raise ValueError("Tag.index: element not in tag")
+
+ def get(self, key, default=None):
+ """Returns the value of the 'key' attribute for the tag, or
+ the value given for 'default' if it doesn't have that
+ attribute."""
+ return self.attrs.get(key, default)
+
+ def get_attribute_list(self, key, default=None):
+ """The same as get(), but always returns a list.
+
+ :param key: The attribute to look for.
+ :param default: Use this value if the attribute is not present
+ on this PageElement.
+ :return: A list of values, probably containing only a single
+ value.
+ """
+ value = self.get(key, default)
+ if not isinstance(value, list):
+ value = [value]
+ return value
+
+ def has_attr(self, key):
+ """Does this PageElement have an attribute with the given name?"""
+ return key in self.attrs
+
+ def __hash__(self):
+ return str(self).__hash__()
+
+ def __getitem__(self, key):
+ """tag[key] returns the value of the 'key' attribute for the Tag,
+ and throws an exception if it's not there."""
+ return self.attrs[key]
+
+ def __iter__(self):
+ "Iterating over a Tag iterates over its contents."
+ return iter(self.contents)
+
+ def __len__(self):
+ "The length of a Tag is the length of its list of contents."
+ return len(self.contents)
+
+ def __contains__(self, x):
+ return x in self.contents
+
+ def __bool__(self):
+ "A tag is non-None even if it has no contents."
+ return True
+
+ def __setitem__(self, key, value):
+ """Setting tag[key] sets the value of the 'key' attribute for the
+ tag."""
+ self.attrs[key] = value
+
+ def __delitem__(self, key):
+ "Deleting tag[key] deletes all 'key' attributes for the tag."
+ self.attrs.pop(key, None)
+
+ def __call__(self, *args, **kwargs):
+ """Calling a Tag like a function is the same as calling its
+ find_all() method. Eg. tag('a') returns a list of all the A tags
+ found within this tag."""
+ return self.find_all(*args, **kwargs)
+
+ def __getattr__(self, tag):
+ """Calling tag.subtag is the same as calling tag.find(name="subtag")"""
+ #print("Getattr %s.%s" % (self.__class__, tag))
+ if len(tag) > 3 and tag.endswith('Tag'):
+ # BS3: soup.aTag -> "soup.find("a")
+ tag_name = tag[:-3]
+ warnings.warn(
+ '.%(name)sTag is deprecated, use .find("%(name)s") instead. If you really were looking for a tag called %(name)sTag, use .find("%(name)sTag")' % dict(
+ name=tag_name
+ )
+ )
+ return self.find(tag_name)
+ # We special case contents to avoid recursion.
+ elif not tag.startswith("__") and not tag == "contents":
+ return self.find(tag)
+ raise AttributeError(
+ "'%s' object has no attribute '%s'" % (self.__class__, tag))
+
+ def __eq__(self, other):
+ """Returns true iff this Tag has the same name, the same attributes,
+ and the same contents (recursively) as `other`."""
+ if self is other:
+ return True
+ if (not hasattr(other, 'name') or
+ not hasattr(other, 'attrs') or
+ not hasattr(other, 'contents') or
+ self.name != other.name or
+ self.attrs != other.attrs or
+ len(self) != len(other)):
+ return False
+ for i, my_child in enumerate(self.contents):
+ if my_child != other.contents[i]:
+ return False
+ return True
+
+ def __ne__(self, other):
+ """Returns true iff this Tag is not identical to `other`,
+ as defined in __eq__."""
+ return not self == other
+
+ def __repr__(self, encoding="unicode-escape"):
+ """Renders this PageElement as a string.
+
+ :param encoding: The encoding to use (Python 2 only).
+ :return: Under Python 2, a bytestring; under Python 3,
+ a Unicode string.
+ """
+ if PY3K:
+ # "The return value must be a string object", i.e. Unicode
+ return self.decode()
+ else:
+ # "The return value must be a string object", i.e. a bytestring.
+ # By convention, the return value of __repr__ should also be
+ # an ASCII string.
+ return self.encode(encoding)
+
+ def __unicode__(self):
+ """Renders this PageElement as a Unicode string."""
+ return self.decode()
+
+ def __str__(self):
+ """Renders this PageElement as a generic string.
+
+ :return: Under Python 2, a UTF-8 bytestring; under Python 3,
+ a Unicode string.
+ """
+ if PY3K:
+ return self.decode()
+ else:
+ return self.encode()
+
+ if PY3K:
+ __str__ = __repr__ = __unicode__
+
+ def encode(self, encoding=DEFAULT_OUTPUT_ENCODING,
+ indent_level=None, formatter="minimal",
+ errors="xmlcharrefreplace"):
+ """Render a bytestring representation of this PageElement and its
+ contents.
+
+ :param encoding: The destination encoding.
+ :param indent_level: Each line of the rendering will be
+ indented this many spaces. Used internally in
+ recursive calls while pretty-printing.
+ :param formatter: A Formatter object, or a string naming one of
+ the standard formatters.
+ :param errors: An error handling strategy such as
+ 'xmlcharrefreplace'. This value is passed along into
+ encode() and its value should be one of the constants
+ defined by Python.
+ :return: A bytestring.
+
+ """
+ # Turn the data structure into Unicode, then encode the
+ # Unicode.
+ u = self.decode(indent_level, encoding, formatter)
+ return u.encode(encoding, errors)
+
+ def decode(self, indent_level=None,
+ eventual_encoding=DEFAULT_OUTPUT_ENCODING,
+ formatter="minimal"):
+ """Render a Unicode representation of this PageElement and its
+ contents.
+
+ :param indent_level: Each line of the rendering will be
+ indented this many spaces. Used internally in
+ recursive calls while pretty-printing.
+ :param eventual_encoding: The tag is destined to be
+ encoded into this encoding. This method is _not_
+ responsible for performing that encoding. This information
+ is passed in so that it can be substituted in if the
+ document contains a <META> tag that mentions the document's
+ encoding.
+ :param formatter: A Formatter object, or a string naming one of
+ the standard formatters.
+ """
+
+ # First off, turn a non-Formatter `formatter` into a Formatter
+ # object. This will stop the lookup from happening over and
+ # over again.
+ if not isinstance(formatter, Formatter):
+ formatter = self.formatter_for_name(formatter)
+ attributes = formatter.attributes(self)
+ attrs = []
+ for key, val in attributes:
+ if val is None:
+ decoded = key
+ else:
+ if isinstance(val, list) or isinstance(val, tuple):
+ val = ' '.join(val)
+ elif not isinstance(val, str):
+ val = str(val)
+ elif (
+ isinstance(val, AttributeValueWithCharsetSubstitution)
+ and eventual_encoding is not None
+ ):
+ val = val.encode(eventual_encoding)
+
+ text = formatter.attribute_value(val)
+ decoded = (
+ str(key) + '='
+ + formatter.quoted_attribute_value(text))
+ attrs.append(decoded)
+ close = ''
+ closeTag = ''
+
+ prefix = ''
+ if self.prefix:
+ prefix = self.prefix + ":"
+
+ if self.is_empty_element:
+ close = formatter.void_element_close_prefix or ''
+ else:
+ closeTag = '</%s%s>' % (prefix, self.name)
+
+ pretty_print = self._should_pretty_print(indent_level)
+ space = ''
+ indent_space = ''
+ if indent_level is not None:
+ indent_space = (' ' * (indent_level - 1))
+ if pretty_print:
+ space = indent_space
+ indent_contents = indent_level + 1
+ else:
+ indent_contents = None
+ contents = self.decode_contents(
+ indent_contents, eventual_encoding, formatter
+ )
+
+ if self.hidden:
+ # This is the 'document root' object.
+ s = contents
+ else:
+ s = []
+ attribute_string = ''
+ if attrs:
+ attribute_string = ' ' + ' '.join(attrs)
+ if indent_level is not None:
+ # Even if this particular tag is not pretty-printed,
+ # we should indent up to the start of the tag.
+ s.append(indent_space)
+ s.append('<%s%s%s%s>' % (
+ prefix, self.name, attribute_string, close))
+ if pretty_print:
+ s.append("\n")
+ s.append(contents)
+ if pretty_print and contents and contents[-1] != "\n":
+ s.append("\n")
+ if pretty_print and closeTag:
+ s.append(space)
+ s.append(closeTag)
+ if indent_level is not None and closeTag and self.next_sibling:
+ # Even if this particular tag is not pretty-printed,
+ # we're now done with the tag, and we should add a
+ # newline if appropriate.
+ s.append("\n")
+ s = ''.join(s)
+ return s
+
+ def _should_pretty_print(self, indent_level):
+ """Should this tag be pretty-printed?
+
+ Most of them should, but some (such as <pre> in HTML
+ documents) should not.
+ """
+ return (
+ indent_level is not None
+ and (
+ not self.preserve_whitespace_tags
+ or self.name not in self.preserve_whitespace_tags
+ )
+ )
+
+ def prettify(self, encoding=None, formatter="minimal"):
+ """Pretty-print this PageElement as a string.
+
+ :param encoding: The eventual encoding of the string. If this is None,
+ a Unicode string will be returned.
+ :param formatter: A Formatter object, or a string naming one of
+ the standard formatters.
+ :return: A Unicode string (if encoding==None) or a bytestring
+ (otherwise).
+ """
+ if encoding is None:
+ return self.decode(True, formatter=formatter)
+ else:
+ return self.encode(encoding, True, formatter=formatter)
+
+ def decode_contents(self, indent_level=None,
+ eventual_encoding=DEFAULT_OUTPUT_ENCODING,
+ formatter="minimal"):
+ """Renders the contents of this tag as a Unicode string.
+
+ :param indent_level: Each line of the rendering will be
+ indented this many spaces. Used internally in
+ recursive calls while pretty-printing.
+
+ :param eventual_encoding: The tag is destined to be
+ encoded into this encoding. decode_contents() is _not_
+ responsible for performing that encoding. This information
+ is passed in so that it can be substituted in if the
+ document contains a <META> tag that mentions the document's
+ encoding.
+
+ :param formatter: A Formatter object, or a string naming one of
+ the standard Formatters.
+ """
+ # First off, turn a string formatter into a Formatter object. This
+ # will stop the lookup from happening over and over again.
+ if not isinstance(formatter, Formatter):
+ formatter = self.formatter_for_name(formatter)
+
+ pretty_print = (indent_level is not None)
+ s = []
+ for c in self:
+ text = None
+ if isinstance(c, NavigableString):
+ text = c.output_ready(formatter)
+ elif isinstance(c, Tag):
+ s.append(c.decode(indent_level, eventual_encoding,
+ formatter))
+ preserve_whitespace = (
+ self.preserve_whitespace_tags and self.name in self.preserve_whitespace_tags
+ )
+ if text and indent_level and not preserve_whitespace:
+ text = text.strip()
+ if text:
+ if pretty_print and not preserve_whitespace:
+ s.append(" " * (indent_level - 1))
+ s.append(text)
+ if pretty_print and not preserve_whitespace:
+ s.append("\n")
+ return ''.join(s)
+
+ def encode_contents(
+ self, indent_level=None, encoding=DEFAULT_OUTPUT_ENCODING,
+ formatter="minimal"):
+ """Renders the contents of this PageElement as a bytestring.
+
+ :param indent_level: Each line of the rendering will be
+ indented this many spaces. Used internally in
+ recursive calls while pretty-printing.
+
+ :param eventual_encoding: The bytestring will be in this encoding.
+
+ :param formatter: A Formatter object, or a string naming one of
+ the standard Formatters.
+
+ :return: A bytestring.
+ """
+ contents = self.decode_contents(indent_level, encoding, formatter)
+ return contents.encode(encoding)
+
+ # Old method for BS3 compatibility
+ def renderContents(self, encoding=DEFAULT_OUTPUT_ENCODING,
+ prettyPrint=False, indentLevel=0):
+ """Deprecated method for BS3 compatibility."""
+ if not prettyPrint:
+ indentLevel = None
+ return self.encode_contents(
+ indent_level=indentLevel, encoding=encoding)
+
+ #Soup methods
+
+ def find(self, name=None, attrs={}, recursive=True, text=None,
+ **kwargs):
+ """Look in the children of this PageElement and find the first
+ PageElement that matches the given criteria.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param recursive: If this is True, find() will perform a
+ recursive search of this PageElement's children. Otherwise,
+ only the direct children will be considered.
+ :param limit: Stop looking after finding this many results.
+ :kwargs: A dictionary of filters on attribute values.
+ :return: A PageElement.
+ :rtype: bs4.element.Tag | bs4.element.NavigableString
+ """
+ r = None
+ l = self.find_all(name, attrs, recursive, text, 1, **kwargs)
+ if l:
+ r = l[0]
+ return r
+ findChild = find #BS2
+
+ def find_all(self, name=None, attrs={}, recursive=True, text=None,
+ limit=None, **kwargs):
+ """Look in the children of this PageElement and find all
+ PageElements that match the given criteria.
+
+ All find_* methods take a common set of arguments. See the online
+ documentation for detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param recursive: If this is True, find_all() will perform a
+ recursive search of this PageElement's children. Otherwise,
+ only the direct children will be considered.
+ :param limit: Stop looking after finding this many results.
+ :kwargs: A dictionary of filters on attribute values.
+ :return: A ResultSet of PageElements.
+ :rtype: bs4.element.ResultSet
+ """
+ generator = self.descendants
+ if not recursive:
+ generator = self.children
+ return self._find_all(name, attrs, text, limit, generator, **kwargs)
+ findAll = find_all # BS3
+ findChildren = find_all # BS2
+
+ #Generator methods
+ @property
+ def children(self):
+ """Iterate over all direct children of this PageElement.
+
+ :yield: A sequence of PageElements.
+ """
+ # return iter() to make the purpose of the method clear
+ return iter(self.contents) # XXX This seems to be untested.
+
+ @property
+ def descendants(self):
+ """Iterate over all children of this PageElement in a
+ breadth-first sequence.
+
+ :yield: A sequence of PageElements.
+ """
+ if not len(self.contents):
+ return
+ stopNode = self._last_descendant().next_element
+ current = self.contents[0]
+ while current is not stopNode:
+ yield current
+ current = current.next_element
+
+ # CSS selector code
+ def select_one(self, selector, namespaces=None, **kwargs):
+ """Perform a CSS selection operation on the current element.
+
+ :param selector: A CSS selector.
+
+ :param namespaces: A dictionary mapping namespace prefixes
+ used in the CSS selector to namespace URIs. By default,
+ Beautiful Soup will use the prefixes it encountered while
+ parsing the document.
+
+ :param kwargs: Keyword arguments to be passed into SoupSieve's
+ soupsieve.select() method.
+
+ :return: A Tag.
+ :rtype: bs4.element.Tag
+ """
+ value = self.select(selector, namespaces, 1, **kwargs)
+ if value:
+ return value[0]
+ return None
+
+ def select(self, selector, namespaces=None, limit=None, **kwargs):
+ """Perform a CSS selection operation on the current element.
+
+ This uses the SoupSieve library.
+
+ :param selector: A string containing a CSS selector.
+
+ :param namespaces: A dictionary mapping namespace prefixes
+ used in the CSS selector to namespace URIs. By default,
+ Beautiful Soup will use the prefixes it encountered while
+ parsing the document.
+
+ :param limit: After finding this number of results, stop looking.
+
+ :param kwargs: Keyword arguments to be passed into SoupSieve's
+ soupsieve.select() method.
+
+ :return: A ResultSet of Tags.
+ :rtype: bs4.element.ResultSet
+ """
+ if namespaces is None:
+ namespaces = self._namespaces
+
+ if limit is None:
+ limit = 0
+ if soupsieve is None:
+ raise NotImplementedError(
+ "Cannot execute CSS selectors because the soupsieve package is not installed."
+ )
+
+ results = soupsieve.select(selector, self, namespaces, limit, **kwargs)
+
+ # We do this because it's more consistent and because
+ # ResultSet.__getattr__ has a helpful error message.
+ return ResultSet(None, results)
+
+ # Old names for backwards compatibility
+ def childGenerator(self):
+ """Deprecated generator."""
+ return self.children
+
+ def recursiveChildGenerator(self):
+ """Deprecated generator."""
+ return self.descendants
+
+ def has_key(self, key):
+ """Deprecated method. This was kind of misleading because has_key()
+ (attributes) was different from __in__ (contents).
+
+ has_key() is gone in Python 3, anyway.
+ """
+ warnings.warn('has_key is deprecated. Use has_attr("%s") instead.' % (
+ key))
+ return self.has_attr(key)
+
+# Next, a couple classes to represent queries and their results.
+class SoupStrainer(object):
+ """Encapsulates a number of ways of matching a markup element (tag or
+ string).
+
+ This is primarily used to underpin the find_* methods, but you can
+ create one yourself and pass it in as `parse_only` to the
+ `BeautifulSoup` constructor, to parse a subset of a large
+ document.
+ """
+
+ def __init__(self, name=None, attrs={}, text=None, **kwargs):
+ """Constructor.
+
+ The SoupStrainer constructor takes the same arguments passed
+ into the find_* methods. See the online documentation for
+ detailed explanations.
+
+ :param name: A filter on tag name.
+ :param attrs: A dictionary of filters on attribute values.
+ :param text: A filter for a NavigableString with specific text.
+ :kwargs: A dictionary of filters on attribute values.
+ """
+ self.name = self._normalize_search_value(name)
+ if not isinstance(attrs, dict):
+ # Treat a non-dict value for attrs as a search for the 'class'
+ # attribute.
+ kwargs['class'] = attrs
+ attrs = None
+
+ if 'class_' in kwargs:
+ # Treat class_="foo" as a search for the 'class'
+ # attribute, overriding any non-dict value for attrs.
+ kwargs['class'] = kwargs['class_']
+ del kwargs['class_']
+
+ if kwargs:
+ if attrs:
+ attrs = attrs.copy()
+ attrs.update(kwargs)
+ else:
+ attrs = kwargs
+ normalized_attrs = {}
+ for key, value in list(attrs.items()):
+ normalized_attrs[key] = self._normalize_search_value(value)
+
+ self.attrs = normalized_attrs
+ self.text = self._normalize_search_value(text)
+
+ def _normalize_search_value(self, value):
+ # Leave it alone if it's a Unicode string, a callable, a
+ # regular expression, a boolean, or None.
+ if (isinstance(value, str) or isinstance(value, Callable) or hasattr(value, 'match')
+ or isinstance(value, bool) or value is None):
+ return value
+
+ # If it's a bytestring, convert it to Unicode, treating it as UTF-8.
+ if isinstance(value, bytes):
+ return value.decode("utf8")
+
+ # If it's listlike, convert it into a list of strings.
+ if hasattr(value, '__iter__'):
+ new_value = []
+ for v in value:
+ if (hasattr(v, '__iter__') and not isinstance(v, bytes)
+ and not isinstance(v, str)):
+ # This is almost certainly the user's mistake. In the
+ # interests of avoiding infinite loops, we'll let
+ # it through as-is rather than doing a recursive call.
+ new_value.append(v)
+ else:
+ new_value.append(self._normalize_search_value(v))
+ return new_value
+
+ # Otherwise, convert it into a Unicode string.
+ # The unicode(str()) thing is so this will do the same thing on Python 2
+ # and Python 3.
+ return str(str(value))
+
+ def __str__(self):
+ """A human-readable representation of this SoupStrainer."""
+ if self.text:
+ return self.text
+ else:
+ return "%s|%s" % (self.name, self.attrs)
+
+ def search_tag(self, markup_name=None, markup_attrs={}):
+ """Check whether a Tag with the given name and attributes would
+ match this SoupStrainer.
+
+ Used prospectively to decide whether to even bother creating a Tag
+ object.
+
+ :param markup_name: A tag name as found in some markup.
+ :param markup_attrs: A dictionary of attributes as found in some markup.
+
+ :return: True if the prospective tag would match this SoupStrainer;
+ False otherwise.
+ """
+ found = None
+ markup = None
+ if isinstance(markup_name, Tag):
+ markup = markup_name
+ markup_attrs = markup
+
+ if isinstance(self.name, str):
+ # Optimization for a very common case where the user is
+ # searching for a tag with one specific name, and we're
+ # looking at a tag with a different name.
+ if markup and not markup.prefix and self.name != markup.name:
+ return False
+
+ call_function_with_tag_data = (
+ isinstance(self.name, Callable)
+ and not isinstance(markup_name, Tag))
+
+ if ((not self.name)
+ or call_function_with_tag_data
+ or (markup and self._matches(markup, self.name))
+ or (not markup and self._matches(markup_name, self.name))):
+ if call_function_with_tag_data:
+ match = self.name(markup_name, markup_attrs)
+ else:
+ match = True
+ markup_attr_map = None
+ for attr, match_against in list(self.attrs.items()):
+ if not markup_attr_map:
+ if hasattr(markup_attrs, 'get'):
+ markup_attr_map = markup_attrs
+ else:
+ markup_attr_map = {}
+ for k, v in markup_attrs:
+ markup_attr_map[k] = v
+ attr_value = markup_attr_map.get(attr)
+ if not self._matches(attr_value, match_against):
+ match = False
+ break
+ if match:
+ if markup:
+ found = markup
+ else:
+ found = markup_name
+ if found and self.text and not self._matches(found.string, self.text):
+ found = None
+ return found
+
+ # For BS3 compatibility.
+ searchTag = search_tag
+
+ def search(self, markup):
+ """Find all items in `markup` that match this SoupStrainer.
+
+ Used by the core _find_all() method, which is ultimately
+ called by all find_* methods.
+
+ :param markup: A PageElement or a list of them.
+ """
+ # print('looking for %s in %s' % (self, markup))
+ found = None
+ # If given a list of items, scan it for a text element that
+ # matches.
+ if hasattr(markup, '__iter__') and not isinstance(markup, (Tag, str)):
+ for element in markup:
+ if isinstance(element, NavigableString) \
+ and self.search(element):
+ found = element
+ break
+ # If it's a Tag, make sure its name or attributes match.
+ # Don't bother with Tags if we're searching for text.
+ elif isinstance(markup, Tag):
+ if not self.text or self.name or self.attrs:
+ found = self.search_tag(markup)
+ # If it's text, make sure the text matches.
+ elif isinstance(markup, NavigableString) or \
+ isinstance(markup, str):
+ if not self.name and not self.attrs and self._matches(markup, self.text):
+ found = markup
+ else:
+ raise Exception(
+ "I don't know how to match against a %s" % markup.__class__)
+ return found
+
+ def _matches(self, markup, match_against, already_tried=None):
+ # print(u"Matching %s against %s" % (markup, match_against))
+ result = False
+ if isinstance(markup, list) or isinstance(markup, tuple):
+ # This should only happen when searching a multi-valued attribute
+ # like 'class'.
+ for item in markup:
+ if self._matches(item, match_against):
+ return True
+ # We didn't match any particular value of the multivalue
+ # attribute, but maybe we match the attribute value when
+ # considered as a string.
+ if self._matches(' '.join(markup), match_against):
+ return True
+ return False
+
+ if match_against is True:
+ # True matches any non-None value.
+ return markup is not None
+
+ if isinstance(match_against, Callable):
+ return match_against(markup)
+
+ # Custom callables take the tag as an argument, but all
+ # other ways of matching match the tag name as a string.
+ original_markup = markup
+ if isinstance(markup, Tag):
+ markup = markup.name
+
+ # Ensure that `markup` is either a Unicode string, or None.
+ markup = self._normalize_search_value(markup)
+
+ if markup is None:
+ # None matches None, False, an empty string, an empty list, and so on.
+ return not match_against
+
+ if (hasattr(match_against, '__iter__')
+ and not isinstance(match_against, str)):
+ # We're asked to match against an iterable of items.
+ # The markup must be match at least one item in the
+ # iterable. We'll try each one in turn.
+ #
+ # To avoid infinite recursion we need to keep track of
+ # items we've already seen.
+ if not already_tried:
+ already_tried = set()
+ for item in match_against:
+ if item.__hash__:
+ key = item
+ else:
+ key = id(item)
+ if key in already_tried:
+ continue
+ else:
+ already_tried.add(key)
+ if self._matches(original_markup, item, already_tried):
+ return True
+ else:
+ return False
+
+ # Beyond this point we might need to run the test twice: once against
+ # the tag's name and once against its prefixed name.
+ match = False
+
+ if not match and isinstance(match_against, str):
+ # Exact string match
+ match = markup == match_against
+
+ if not match and hasattr(match_against, 'search'):
+ # Regexp match
+ return match_against.search(markup)
+
+ if (not match
+ and isinstance(original_markup, Tag)
+ and original_markup.prefix):
+ # Try the whole thing again with the prefixed tag name.
+ return self._matches(
+ original_markup.prefix + ':' + original_markup.name, match_against
+ )
+
+ return match
+
+
+class ResultSet(list):
+ """A ResultSet is just a list that keeps track of the SoupStrainer
+ that created it."""
+ def __init__(self, source, result=()):
+ """Constructor.
+
+ :param source: A SoupStrainer.
+ :param result: A list of PageElements.
+ """
+ super(ResultSet, self).__init__(result)
+ self.source = source
+
+ def __getattr__(self, key):
+ """Raise a helpful exception to explain a common code fix."""
+ raise AttributeError(
+ "ResultSet object has no attribute '%s'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?" % key
+ )
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/formatter.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/formatter.py
new file mode 100644
index 00000000000..2cbab4c713a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/formatter.py
@@ -0,0 +1,152 @@
+from bs4.dammit import EntitySubstitution
+
+class Formatter(EntitySubstitution):
+ """Describes a strategy to use when outputting a parse tree to a string.
+
+ Some parts of this strategy come from the distinction between
+ HTML4, HTML5, and XML. Others are configurable by the user.
+
+ Formatters are passed in as the `formatter` argument to methods
+ like `PageElement.encode`. Most people won't need to think about
+ formatters, and most people who need to think about them can pass
+ in one of these predefined strings as `formatter` rather than
+ making a new Formatter object:
+
+ For HTML documents:
+ * 'html' - HTML entity substitution for generic HTML documents. (default)
+ * 'html5' - HTML entity substitution for HTML5 documents.
+ * 'minimal' - Only make the substitutions necessary to guarantee
+ valid HTML.
+ * None - Do not perform any substitution. This will be faster
+ but may result in invalid markup.
+
+ For XML documents:
+ * 'html' - Entity substitution for XHTML documents.
+ * 'minimal' - Only make the substitutions necessary to guarantee
+ valid XML. (default)
+ * None - Do not perform any substitution. This will be faster
+ but may result in invalid markup.
+ """
+ # Registries of XML and HTML formatters.
+ XML_FORMATTERS = {}
+ HTML_FORMATTERS = {}
+
+ HTML = 'html'
+ XML = 'xml'
+
+ HTML_DEFAULTS = dict(
+ cdata_containing_tags=set(["script", "style"]),
+ )
+
+ def _default(self, language, value, kwarg):
+ if value is not None:
+ return value
+ if language == self.XML:
+ return set()
+ return self.HTML_DEFAULTS[kwarg]
+
+ def __init__(
+ self, language=None, entity_substitution=None,
+ void_element_close_prefix='/', cdata_containing_tags=None,
+ ):
+ """Constructor.
+
+ :param language: This should be Formatter.XML if you are formatting
+ XML markup and Formatter.HTML if you are formatting HTML markup.
+
+ :param entity_substitution: A function to call to replace special
+ characters with XML/HTML entities. For examples, see
+ bs4.dammit.EntitySubstitution.substitute_html and substitute_xml.
+ :param void_element_close_prefix: By default, void elements
+ are represented as <tag/> (XML rules) rather than <tag>
+ (HTML rules). To get <tag>, pass in the empty string.
+ :param cdata_containing_tags: The list of tags that are defined
+ as containing CDATA in this dialect. For example, in HTML,
+ <script> and <style> tags are defined as containing CDATA,
+ and their contents should not be formatted.
+ """
+ self.language = language
+ self.entity_substitution = entity_substitution
+ self.void_element_close_prefix = void_element_close_prefix
+ self.cdata_containing_tags = self._default(
+ language, cdata_containing_tags, 'cdata_containing_tags'
+ )
+
+ def substitute(self, ns):
+ """Process a string that needs to undergo entity substitution.
+ This may be a string encountered in an attribute value or as
+ text.
+
+ :param ns: A string.
+ :return: A string with certain characters replaced by named
+ or numeric entities.
+ """
+ if not self.entity_substitution:
+ return ns
+ from .element import NavigableString
+ if (isinstance(ns, NavigableString)
+ and ns.parent is not None
+ and ns.parent.name in self.cdata_containing_tags):
+ # Do nothing.
+ return ns
+ # Substitute.
+ return self.entity_substitution(ns)
+
+ def attribute_value(self, value):
+ """Process the value of an attribute.
+
+ :param ns: A string.
+ :return: A string with certain characters replaced by named
+ or numeric entities.
+ """
+ return self.substitute(value)
+
+ def attributes(self, tag):
+ """Reorder a tag's attributes however you want.
+
+ By default, attributes are sorted alphabetically. This makes
+ behavior consistent between Python 2 and Python 3, and preserves
+ backwards compatibility with older versions of Beautiful Soup.
+ """
+ if tag.attrs is None:
+ return []
+ return sorted(tag.attrs.items())
+
+
+class HTMLFormatter(Formatter):
+ """A generic Formatter for HTML."""
+ REGISTRY = {}
+ def __init__(self, *args, **kwargs):
+ return super(HTMLFormatter, self).__init__(self.HTML, *args, **kwargs)
+
+
+class XMLFormatter(Formatter):
+ """A generic Formatter for XML."""
+ REGISTRY = {}
+ def __init__(self, *args, **kwargs):
+ return super(XMLFormatter, self).__init__(self.XML, *args, **kwargs)
+
+
+# Set up aliases for the default formatters.
+HTMLFormatter.REGISTRY['html'] = HTMLFormatter(
+ entity_substitution=EntitySubstitution.substitute_html
+)
+HTMLFormatter.REGISTRY["html5"] = HTMLFormatter(
+ entity_substitution=EntitySubstitution.substitute_html,
+ void_element_close_prefix = None
+)
+HTMLFormatter.REGISTRY["minimal"] = HTMLFormatter(
+ entity_substitution=EntitySubstitution.substitute_xml
+)
+HTMLFormatter.REGISTRY[None] = HTMLFormatter(
+ entity_substitution=None
+)
+XMLFormatter.REGISTRY["html"] = XMLFormatter(
+ entity_substitution=EntitySubstitution.substitute_html
+)
+XMLFormatter.REGISTRY["minimal"] = XMLFormatter(
+ entity_substitution=EntitySubstitution.substitute_xml
+)
+XMLFormatter.REGISTRY[None] = Formatter(
+ Formatter(Formatter.XML, entity_substitution=None)
+)
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/testing.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/testing.py
new file mode 100644
index 00000000000..9ca507bccd3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/py3k/bs4/testing.py
@@ -0,0 +1,1101 @@
+# encoding: utf-8
+"""Helper classes for tests."""
+
+# Use of this source code is governed by the MIT license.
+__license__ = "MIT"
+
+import pickle
+import copy
+import functools
+import unittest
+from unittest import TestCase
+from bs4 import BeautifulSoup
+from bs4.element import (
+ CharsetMetaAttributeValue,
+ Comment,
+ ContentMetaAttributeValue,
+ Doctype,
+ PYTHON_SPECIFIC_ENCODINGS,
+ SoupStrainer,
+ Script,
+ Stylesheet,
+ Tag
+)
+
+from bs4.builder import HTMLParserTreeBuilder
+default_builder = HTMLParserTreeBuilder
+
+BAD_DOCUMENT = """A bare string
+<!DOCTYPE xsl:stylesheet SYSTEM "htmlent.dtd">
+<!DOCTYPE xsl:stylesheet PUBLIC "htmlent.dtd">
+<div><![CDATA[A CDATA section where it doesn't belong]]></div>
+<div><svg><![CDATA[HTML5 does allow CDATA sections in SVG]]></svg></div>
+<div>A <meta> tag</div>
+<div>A <br> tag that supposedly has contents.</br></div>
+<div>AT&T</div>
+<div><textarea>Within a textarea, markup like <b> tags and <&<&amp; should be treated as literal</textarea></div>
+<div><script>if (i < 2) { alert("<b>Markup within script tags should be treated as literal.</b>"); }</script></div>
+<div>This numeric entity is missing the final semicolon: <x t="pi&#241ata"></div>
+<div><a href="http://example.com/</a> that attribute value never got closed</div>
+<div><a href="foo</a>, </a><a href="bar">that attribute value was closed by the subsequent tag</a></div>
+<! This document starts with a bogus declaration ><div>a</div>
+<div>This document contains <!an incomplete declaration <div>(do you see it?)</div>
+<div>This document ends with <!an incomplete declaration
+<div><a style={height:21px;}>That attribute value was bogus</a></div>
+<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">The doctype is invalid because it contains extra whitespace
+<div><table><td nowrap>That boolean attribute had no value</td></table></div>
+<div>Here's a nonexistent entity: &#foo; (do you see it?)</div>
+<div>This document ends before the entity finishes: &gt
+<div><p>Paragraphs shouldn't contain block display elements, but this one does: <dl><dt>you see?</dt></p>
+<b b="20" a="1" b="10" a="2" a="3" a="4">Multiple values for the same attribute.</b>
+<div><table><tr><td>Here's a table</td></tr></table></div>
+<div><table id="1"><tr><td>Here's a nested table:<table id="2"><tr><td>foo</td></tr></table></td></div>
+<div>This tag contains nothing but whitespace: <b> </b></div>
+<div><blockquote><p><b>This p tag is cut off by</blockquote></p>the end of the blockquote tag</div>
+<div><table><div>This table contains bare markup</div></table></div>
+<div><div id="1">\n <a href="link1">This link is never closed.\n</div>\n<div id="2">\n <div id="3">\n <a href="link2">This link is closed.</a>\n </div>\n</div></div>
+<div>This document contains a <!DOCTYPE surprise>surprise doctype</div>
+<div><a><B><Cd><EFG>Mixed case tags are folded to lowercase</efg></CD></b></A></div>
+<div><our\u2603>Tag name contains Unicode characters</our\u2603></div>
+<div><a \u2603="snowman">Attribute name contains Unicode characters</a></div>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+"""
+
+
+class SoupTest(unittest.TestCase):
+
+ @property
+ def default_builder(self):
+ return default_builder
+
+ def soup(self, markup, **kwargs):
+ """Build a Beautiful Soup object from markup."""
+ builder = kwargs.pop('builder', self.default_builder)
+ return BeautifulSoup(markup, builder=builder, **kwargs)
+
+ def document_for(self, markup, **kwargs):
+ """Turn an HTML fragment into a document.
+
+ The details depend on the builder.
+ """
+ return self.default_builder(**kwargs).test_fragment_to_document(markup)
+
+ def assertSoupEquals(self, to_parse, compare_parsed_to=None):
+ builder = self.default_builder
+ obj = BeautifulSoup(to_parse, builder=builder)
+ if compare_parsed_to is None:
+ compare_parsed_to = to_parse
+
+ # Verify that the documents come out the same.
+ self.assertEqual(obj.decode(), self.document_for(compare_parsed_to))
+
+ # Also run some checks on the BeautifulSoup object itself:
+
+ # Verify that every tag that was opened was eventually closed.
+
+ # There are no tags in the open tag counter.
+ assert all(v==0 for v in list(obj.open_tag_counter.values()))
+
+ # The only tag in the tag stack is the one for the root
+ # document.
+ self.assertEqual(
+ [obj.ROOT_TAG_NAME], [x.name for x in obj.tagStack]
+ )
+
+ def assertConnectedness(self, element):
+ """Ensure that next_element and previous_element are properly
+ set for all descendants of the given element.
+ """
+ earlier = None
+ for e in element.descendants:
+ if earlier:
+ self.assertEqual(e, earlier.next_element)
+ self.assertEqual(earlier, e.previous_element)
+ earlier = e
+
+ def linkage_validator(self, el, _recursive_call=False):
+ """Ensure proper linkage throughout the document."""
+ descendant = None
+ # Document element should have no previous element or previous sibling.
+ # It also shouldn't have a next sibling.
+ if el.parent is None:
+ assert el.previous_element is None,\
+ "Bad previous_element\nNODE: {}\nPREV: {}\nEXPECTED: {}".format(
+ el, el.previous_element, None
+ )
+ assert el.previous_sibling is None,\
+ "Bad previous_sibling\nNODE: {}\nPREV: {}\nEXPECTED: {}".format(
+ el, el.previous_sibling, None
+ )
+ assert el.next_sibling is None,\
+ "Bad next_sibling\nNODE: {}\nNEXT: {}\nEXPECTED: {}".format(
+ el, el.next_sibling, None
+ )
+
+ idx = 0
+ child = None
+ last_child = None
+ last_idx = len(el.contents) - 1
+ for child in el.contents:
+ descendant = None
+
+ # Parent should link next element to their first child
+ # That child should have no previous sibling
+ if idx == 0:
+ if el.parent is not None:
+ assert el.next_element is child,\
+ "Bad next_element\nNODE: {}\nNEXT: {}\nEXPECTED: {}".format(
+ el, el.next_element, child
+ )
+ assert child.previous_element is el,\
+ "Bad previous_element\nNODE: {}\nPREV: {}\nEXPECTED: {}".format(
+ child, child.previous_element, el
+ )
+ assert child.previous_sibling is None,\
+ "Bad previous_sibling\nNODE: {}\nPREV {}\nEXPECTED: {}".format(
+ child, child.previous_sibling, None
+ )
+
+ # If not the first child, previous index should link as sibling to this index
+ # Previous element should match the last index or the last bubbled up descendant
+ else:
+ assert child.previous_sibling is el.contents[idx - 1],\
+ "Bad previous_sibling\nNODE: {}\nPREV {}\nEXPECTED {}".format(
+ child, child.previous_sibling, el.contents[idx - 1]
+ )
+ assert el.contents[idx - 1].next_sibling is child,\
+ "Bad next_sibling\nNODE: {}\nNEXT {}\nEXPECTED {}".format(
+ el.contents[idx - 1], el.contents[idx - 1].next_sibling, child
+ )
+
+ if last_child is not None:
+ assert child.previous_element is last_child,\
+ "Bad previous_element\nNODE: {}\nPREV {}\nEXPECTED {}\nCONTENTS {}".format(
+ child, child.previous_element, last_child, child.parent.contents
+ )
+ assert last_child.next_element is child,\
+ "Bad next_element\nNODE: {}\nNEXT {}\nEXPECTED {}".format(
+ last_child, last_child.next_element, child
+ )
+
+ if isinstance(child, Tag) and child.contents:
+ descendant = self.linkage_validator(child, True)
+ # A bubbled up descendant should have no next siblings
+ assert descendant.next_sibling is None,\
+ "Bad next_sibling\nNODE: {}\nNEXT {}\nEXPECTED {}".format(
+ descendant, descendant.next_sibling, None
+ )
+
+ # Mark last child as either the bubbled up descendant or the current child
+ if descendant is not None:
+ last_child = descendant
+ else:
+ last_child = child
+
+ # If last child, there are non next siblings
+ if idx == last_idx:
+ assert child.next_sibling is None,\
+ "Bad next_sibling\nNODE: {}\nNEXT {}\nEXPECTED {}".format(
+ child, child.next_sibling, None
+ )
+ idx += 1
+
+ child = descendant if descendant is not None else child
+ if child is None:
+ child = el
+
+ if not _recursive_call and child is not None:
+ target = el
+ while True:
+ if target is None:
+ assert child.next_element is None, \
+ "Bad next_element\nNODE: {}\nNEXT {}\nEXPECTED {}".format(
+ child, child.next_element, None
+ )
+ break
+ elif target.next_sibling is not None:
+ assert child.next_element is target.next_sibling, \
+ "Bad next_element\nNODE: {}\nNEXT {}\nEXPECTED {}".format(
+ child, child.next_element, target.next_sibling
+ )
+ break
+ target = target.parent
+
+ # We are done, so nothing to return
+ return None
+ else:
+ # Return the child to the recursive caller
+ return child
+
+
+class HTMLTreeBuilderSmokeTest(object):
+
+ """A basic test of a treebuilder's competence.
+
+ Any HTML treebuilder, present or future, should be able to pass
+ these tests. With invalid markup, there's room for interpretation,
+ and different parsers can handle it differently. But with the
+ markup in these tests, there's not much room for interpretation.
+ """
+
+ def test_empty_element_tags(self):
+ """Verify that all HTML4 and HTML5 empty element (aka void element) tags
+ are handled correctly.
+ """
+ for name in [
+ 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr',
+ 'spacer', 'frame'
+ ]:
+ soup = self.soup("")
+ new_tag = soup.new_tag(name)
+ self.assertEqual(True, new_tag.is_empty_element)
+
+ def test_special_string_containers(self):
+ soup = self.soup(
+ "<style>Some CSS</style><script>Some Javascript</script>"
+ )
+ assert isinstance(soup.style.string, Stylesheet)
+ assert isinstance(soup.script.string, Script)
+
+ soup = self.soup(
+ "<style><!--Some CSS--></style>"
+ )
+ assert isinstance(soup.style.string, Stylesheet)
+ # The contents of the style tag resemble an HTML comment, but
+ # it's not treated as a comment.
+ self.assertEqual("<!--Some CSS-->", soup.style.string)
+ assert isinstance(soup.style.string, Stylesheet)
+
+ def test_pickle_and_unpickle_identity(self):
+ # Pickling a tree, then unpickling it, yields a tree identical
+ # to the original.
+ tree = self.soup("<a><b>foo</a>")
+ dumped = pickle.dumps(tree, 2)
+ loaded = pickle.loads(dumped)
+ self.assertEqual(loaded.__class__, BeautifulSoup)
+ self.assertEqual(loaded.decode(), tree.decode())
+
+ def assertDoctypeHandled(self, doctype_fragment):
+ """Assert that a given doctype string is handled correctly."""
+ doctype_str, soup = self._document_with_doctype(doctype_fragment)
+
+ # Make sure a Doctype object was created.
+ doctype = soup.contents[0]
+ self.assertEqual(doctype.__class__, Doctype)
+ self.assertEqual(doctype, doctype_fragment)
+ self.assertEqual(
+ soup.encode("utf8")[:len(doctype_str)],
+ doctype_str
+ )
+
+ # Make sure that the doctype was correctly associated with the
+ # parse tree and that the rest of the document parsed.
+ self.assertEqual(soup.p.contents[0], 'foo')
+
+ def _document_with_doctype(self, doctype_fragment, doctype_string="DOCTYPE"):
+ """Generate and parse a document with the given doctype."""
+ doctype = '<!%s %s>' % (doctype_string, doctype_fragment)
+ markup = doctype + '\n<p>foo</p>'
+ soup = self.soup(markup)
+ return doctype.encode("utf8"), soup
+
+ def test_normal_doctypes(self):
+ """Make sure normal, everyday HTML doctypes are handled correctly."""
+ self.assertDoctypeHandled("html")
+ self.assertDoctypeHandled(
+ 'html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"')
+
+ def test_empty_doctype(self):
+ soup = self.soup("<!DOCTYPE>")
+ doctype = soup.contents[0]
+ self.assertEqual("", doctype.strip())
+
+ def test_mixed_case_doctype(self):
+ # A lowercase or mixed-case doctype becomes a Doctype.
+ for doctype_fragment in ("doctype", "DocType"):
+ doctype_str, soup = self._document_with_doctype(
+ "html", doctype_fragment
+ )
+
+ # Make sure a Doctype object was created and that the DOCTYPE
+ # is uppercase.
+ doctype = soup.contents[0]
+ self.assertEqual(doctype.__class__, Doctype)
+ self.assertEqual(doctype, "html")
+ self.assertEqual(
+ soup.encode("utf8")[:len(doctype_str)],
+ b"<!DOCTYPE html>"
+ )
+
+ # Make sure that the doctype was correctly associated with the
+ # parse tree and that the rest of the document parsed.
+ self.assertEqual(soup.p.contents[0], 'foo')
+
+ def test_public_doctype_with_url(self):
+ doctype = 'html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"'
+ self.assertDoctypeHandled(doctype)
+
+ def test_system_doctype(self):
+ self.assertDoctypeHandled('foo SYSTEM "http://www.example.com/"')
+
+ def test_namespaced_system_doctype(self):
+ # We can handle a namespaced doctype with a system ID.
+ self.assertDoctypeHandled('xsl:stylesheet SYSTEM "htmlent.dtd"')
+
+ def test_namespaced_public_doctype(self):
+ # Test a namespaced doctype with a public id.
+ self.assertDoctypeHandled('xsl:stylesheet PUBLIC "htmlent.dtd"')
+
+ def test_real_xhtml_document(self):
+ """A real XHTML document should come out more or less the same as it went in."""
+ markup = b"""<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title>Hello.</title></head>
+<body>Goodbye.</body>
+</html>"""
+ soup = self.soup(markup)
+ self.assertEqual(
+ soup.encode("utf-8").replace(b"\n", b""),
+ markup.replace(b"\n", b""))
+
+ def test_namespaced_html(self):
+ """When a namespaced XML document is parsed as HTML it should
+ be treated as HTML with weird tag names.
+ """
+ markup = b"""<ns1:foo>content</ns1:foo><ns1:foo/><ns2:foo/>"""
+ soup = self.soup(markup)
+ self.assertEqual(2, len(soup.find_all("ns1:foo")))
+
+ def test_processing_instruction(self):
+ # We test both Unicode and bytestring to verify that
+ # process_markup correctly sets processing_instruction_class
+ # even when the markup is already Unicode and there is no
+ # need to process anything.
+ markup = """<?PITarget PIContent?>"""
+ soup = self.soup(markup)
+ self.assertEqual(markup, soup.decode())
+
+ markup = b"""<?PITarget PIContent?>"""
+ soup = self.soup(markup)
+ self.assertEqual(markup, soup.encode("utf8"))
+
+ def test_deepcopy(self):
+ """Make sure you can copy the tree builder.
+
+ This is important because the builder is part of a
+ BeautifulSoup object, and we want to be able to copy that.
+ """
+ copy.deepcopy(self.default_builder)
+
+ def test_p_tag_is_never_empty_element(self):
+ """A <p> tag is never designated as an empty-element tag.
+
+ Even if the markup shows it as an empty-element tag, it
+ shouldn't be presented that way.
+ """
+ soup = self.soup("<p/>")
+ self.assertFalse(soup.p.is_empty_element)
+ self.assertEqual(str(soup.p), "<p></p>")
+
+ def test_unclosed_tags_get_closed(self):
+ """A tag that's not closed by the end of the document should be closed.
+
+ This applies to all tags except empty-element tags.
+ """
+ self.assertSoupEquals("<p>", "<p></p>")
+ self.assertSoupEquals("<b>", "<b></b>")
+
+ self.assertSoupEquals("<br>", "<br/>")
+
+ def test_br_is_always_empty_element_tag(self):
+ """A <br> tag is designated as an empty-element tag.
+
+ Some parsers treat <br></br> as one <br/> tag, some parsers as
+ two tags, but it should always be an empty-element tag.
+ """
+ soup = self.soup("<br></br>")
+ self.assertTrue(soup.br.is_empty_element)
+ self.assertEqual(str(soup.br), "<br/>")
+
+ def test_nested_formatting_elements(self):
+ self.assertSoupEquals("<em><em></em></em>")
+
+ def test_double_head(self):
+ html = '''<!DOCTYPE html>
+<html>
+<head>
+<title>Ordinary HEAD element test</title>
+</head>
+<script type="text/javascript">
+alert("Help!");
+</script>
+<body>
+Hello, world!
+</body>
+</html>
+'''
+ soup = self.soup(html)
+ self.assertEqual("text/javascript", soup.find('script')['type'])
+
+ def test_comment(self):
+ # Comments are represented as Comment objects.
+ markup = "<p>foo<!--foobar-->baz</p>"
+ self.assertSoupEquals(markup)
+
+ soup = self.soup(markup)
+ comment = soup.find(text="foobar")
+ self.assertEqual(comment.__class__, Comment)
+
+ # The comment is properly integrated into the tree.
+ foo = soup.find(text="foo")
+ self.assertEqual(comment, foo.next_element)
+ baz = soup.find(text="baz")
+ self.assertEqual(comment, baz.previous_element)
+
+ def test_preserved_whitespace_in_pre_and_textarea(self):
+ """Whitespace must be preserved in <pre> and <textarea> tags,
+ even if that would mean not prettifying the markup.
+ """
+ pre_markup = "<pre> </pre>"
+ textarea_markup = "<textarea> woo\nwoo </textarea>"
+ self.assertSoupEquals(pre_markup)
+ self.assertSoupEquals(textarea_markup)
+
+ soup = self.soup(pre_markup)
+ self.assertEqual(soup.pre.prettify(), pre_markup)
+
+ soup = self.soup(textarea_markup)
+ self.assertEqual(soup.textarea.prettify(), textarea_markup)
+
+ soup = self.soup("<textarea></textarea>")
+ self.assertEqual(soup.textarea.prettify(), "<textarea></textarea>")
+
+ def test_nested_inline_elements(self):
+ """Inline elements can be nested indefinitely."""
+ b_tag = "<b>Inside a B tag</b>"
+ self.assertSoupEquals(b_tag)
+
+ nested_b_tag = "<p>A <i>nested <b>tag</b></i></p>"
+ self.assertSoupEquals(nested_b_tag)
+
+ double_nested_b_tag = "<p>A <a>doubly <i>nested <b>tag</b></i></a></p>"
+ self.assertSoupEquals(nested_b_tag)
+
+ def test_nested_block_level_elements(self):
+ """Block elements can be nested."""
+ soup = self.soup('<blockquote><p><b>Foo</b></p></blockquote>')
+ blockquote = soup.blockquote
+ self.assertEqual(blockquote.p.b.string, 'Foo')
+ self.assertEqual(blockquote.b.string, 'Foo')
+
+ def test_correctly_nested_tables(self):
+ """One table can go inside another one."""
+ markup = ('<table id="1">'
+ '<tr>'
+ "<td>Here's another table:"
+ '<table id="2">'
+ '<tr><td>foo</td></tr>'
+ '</table></td>')
+
+ self.assertSoupEquals(
+ markup,
+ '<table id="1"><tr><td>Here\'s another table:'
+ '<table id="2"><tr><td>foo</td></tr></table>'
+ '</td></tr></table>')
+
+ self.assertSoupEquals(
+ "<table><thead><tr><td>Foo</td></tr></thead>"
+ "<tbody><tr><td>Bar</td></tr></tbody>"
+ "<tfoot><tr><td>Baz</td></tr></tfoot></table>")
+
+ def test_multivalued_attribute_with_whitespace(self):
+ # Whitespace separating the values of a multi-valued attribute
+ # should be ignored.
+
+ markup = '<div class=" foo bar "></a>'
+ soup = self.soup(markup)
+ self.assertEqual(['foo', 'bar'], soup.div['class'])
+
+ # If you search by the literal name of the class it's like the whitespace
+ # wasn't there.
+ self.assertEqual(soup.div, soup.find('div', class_="foo bar"))
+
+ def test_deeply_nested_multivalued_attribute(self):
+ # html5lib can set the attributes of the same tag many times
+ # as it rearranges the tree. This has caused problems with
+ # multivalued attributes.
+ markup = '<table><div><div class="css"></div></div></table>'
+ soup = self.soup(markup)
+ self.assertEqual(["css"], soup.div.div['class'])
+
+ def test_multivalued_attribute_on_html(self):
+ # html5lib uses a different API to set the attributes ot the
+ # <html> tag. This has caused problems with multivalued
+ # attributes.
+ markup = '<html class="a b"></html>'
+ soup = self.soup(markup)
+ self.assertEqual(["a", "b"], soup.html['class'])
+
+ def test_angle_brackets_in_attribute_values_are_escaped(self):
+ self.assertSoupEquals('<a b="<a>"></a>', '<a b="&lt;a&gt;"></a>')
+
+ def test_strings_resembling_character_entity_references(self):
+ # "&T" and "&p" look like incomplete character entities, but they are
+ # not.
+ self.assertSoupEquals(
+ "<p>&bull; AT&T is in the s&p 500</p>",
+ "<p>\u2022 AT&amp;T is in the s&amp;p 500</p>"
+ )
+
+ def test_apos_entity(self):
+ self.assertSoupEquals(
+ "<p>Bob&apos;s Bar</p>",
+ "<p>Bob's Bar</p>",
+ )
+
+ def test_entities_in_foreign_document_encoding(self):
+ # &#147; and &#148; are invalid numeric entities referencing
+ # Windows-1252 characters. &#45; references a character common
+ # to Windows-1252 and Unicode, and &#9731; references a
+ # character only found in Unicode.
+ #
+ # All of these entities should be converted to Unicode
+ # characters.
+ markup = "<p>&#147;Hello&#148; &#45;&#9731;</p>"
+ soup = self.soup(markup)
+ self.assertEqual("“Hello” -☃", soup.p.string)
+
+ def test_entities_in_attributes_converted_to_unicode(self):
+ expect = '<p id="pi\N{LATIN SMALL LETTER N WITH TILDE}ata"></p>'
+ self.assertSoupEquals('<p id="pi&#241;ata"></p>', expect)
+ self.assertSoupEquals('<p id="pi&#xf1;ata"></p>', expect)
+ self.assertSoupEquals('<p id="pi&#Xf1;ata"></p>', expect)
+ self.assertSoupEquals('<p id="pi&ntilde;ata"></p>', expect)
+
+ def test_entities_in_text_converted_to_unicode(self):
+ expect = '<p>pi\N{LATIN SMALL LETTER N WITH TILDE}ata</p>'
+ self.assertSoupEquals("<p>pi&#241;ata</p>", expect)
+ self.assertSoupEquals("<p>pi&#xf1;ata</p>", expect)
+ self.assertSoupEquals("<p>pi&#Xf1;ata</p>", expect)
+ self.assertSoupEquals("<p>pi&ntilde;ata</p>", expect)
+
+ def test_quot_entity_converted_to_quotation_mark(self):
+ self.assertSoupEquals("<p>I said &quot;good day!&quot;</p>",
+ '<p>I said "good day!"</p>')
+
+ def test_out_of_range_entity(self):
+ expect = "\N{REPLACEMENT CHARACTER}"
+ self.assertSoupEquals("&#10000000000000;", expect)
+ self.assertSoupEquals("&#x10000000000000;", expect)
+ self.assertSoupEquals("&#1000000000;", expect)
+
+ def test_multipart_strings(self):
+ "Mostly to prevent a recurrence of a bug in the html5lib treebuilder."
+ soup = self.soup("<html><h2>\nfoo</h2><p></p></html>")
+ self.assertEqual("p", soup.h2.string.next_element.name)
+ self.assertEqual("p", soup.p.name)
+ self.assertConnectedness(soup)
+
+ def test_empty_element_tags(self):
+ """Verify consistent handling of empty-element tags,
+ no matter how they come in through the markup.
+ """
+ self.assertSoupEquals('<br/><br/><br/>', "<br/><br/><br/>")
+ self.assertSoupEquals('<br /><br /><br />', "<br/><br/><br/>")
+
+ def test_head_tag_between_head_and_body(self):
+ "Prevent recurrence of a bug in the html5lib treebuilder."
+ content = """<html><head></head>
+ <link></link>
+ <body>foo</body>
+</html>
+"""
+ soup = self.soup(content)
+ self.assertNotEqual(None, soup.html.body)
+ self.assertConnectedness(soup)
+
+ def test_multiple_copies_of_a_tag(self):
+ "Prevent recurrence of a bug in the html5lib treebuilder."
+ content = """<!DOCTYPE html>
+<html>
+ <body>
+ <article id="a" >
+ <div><a href="1"></div>
+ <footer>
+ <a href="2"></a>
+ </footer>
+ </article>
+ </body>
+</html>
+"""
+ soup = self.soup(content)
+ self.assertConnectedness(soup.article)
+
+ def test_basic_namespaces(self):
+ """Parsers don't need to *understand* namespaces, but at the
+ very least they should not choke on namespaces or lose
+ data."""
+
+ markup = b'<html xmlns="http://www.w3.org/1999/xhtml" xmlns:mathml="http://www.w3.org/1998/Math/MathML" xmlns:svg="http://www.w3.org/2000/svg"><head></head><body><mathml:msqrt>4</mathml:msqrt><b svg:fill="red"></b></body></html>'
+ soup = self.soup(markup)
+ self.assertEqual(markup, soup.encode())
+ html = soup.html
+ self.assertEqual('http://www.w3.org/1999/xhtml', soup.html['xmlns'])
+ self.assertEqual(
+ 'http://www.w3.org/1998/Math/MathML', soup.html['xmlns:mathml'])
+ self.assertEqual(
+ 'http://www.w3.org/2000/svg', soup.html['xmlns:svg'])
+
+ def test_multivalued_attribute_value_becomes_list(self):
+ markup = b'<a class="foo bar">'
+ soup = self.soup(markup)
+ self.assertEqual(['foo', 'bar'], soup.a['class'])
+
+ #
+ # Generally speaking, tests below this point are more tests of
+ # Beautiful Soup than tests of the tree builders. But parsers are
+ # weird, so we run these tests separately for every tree builder
+ # to detect any differences between them.
+ #
+
+ def test_can_parse_unicode_document(self):
+ # A seemingly innocuous document... but it's in Unicode! And
+ # it contains characters that can't be represented in the
+ # encoding found in the declaration! The horror!
+ markup = '<html><head><meta encoding="euc-jp"></head><body>Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!</body>'
+ soup = self.soup(markup)
+ self.assertEqual('Sacr\xe9 bleu!', soup.body.string)
+
+ def test_soupstrainer(self):
+ """Parsers should be able to work with SoupStrainers."""
+ strainer = SoupStrainer("b")
+ soup = self.soup("A <b>bold</b> <meta/> <i>statement</i>",
+ parse_only=strainer)
+ self.assertEqual(soup.decode(), "<b>bold</b>")
+
+ def test_single_quote_attribute_values_become_double_quotes(self):
+ self.assertSoupEquals("<foo attr='bar'></foo>",
+ '<foo attr="bar"></foo>')
+
+ def test_attribute_values_with_nested_quotes_are_left_alone(self):
+ text = """<foo attr='bar "brawls" happen'>a</foo>"""
+ self.assertSoupEquals(text)
+
+ def test_attribute_values_with_double_nested_quotes_get_quoted(self):
+ text = """<foo attr='bar "brawls" happen'>a</foo>"""
+ soup = self.soup(text)
+ soup.foo['attr'] = 'Brawls happen at "Bob\'s Bar"'
+ self.assertSoupEquals(
+ soup.foo.decode(),
+ """<foo attr="Brawls happen at &quot;Bob\'s Bar&quot;">a</foo>""")
+
+ def test_ampersand_in_attribute_value_gets_escaped(self):
+ self.assertSoupEquals('<this is="really messed up & stuff"></this>',
+ '<this is="really messed up &amp; stuff"></this>')
+
+ self.assertSoupEquals(
+ '<a href="http://example.org?a=1&b=2;3">foo</a>',
+ '<a href="http://example.org?a=1&amp;b=2;3">foo</a>')
+
+ def test_escaped_ampersand_in_attribute_value_is_left_alone(self):
+ self.assertSoupEquals('<a href="http://example.org?a=1&amp;b=2;3"></a>')
+
+ def test_entities_in_strings_converted_during_parsing(self):
+ # Both XML and HTML entities are converted to Unicode characters
+ # during parsing.
+ text = "<p>&lt;&lt;sacr&eacute;&#32;bleu!&gt;&gt;</p>"
+ expected = "<p>&lt;&lt;sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!&gt;&gt;</p>"
+ self.assertSoupEquals(text, expected)
+
+ def test_smart_quotes_converted_on_the_way_in(self):
+ # Microsoft smart quotes are converted to Unicode characters during
+ # parsing.
+ quote = b"<p>\x91Foo\x92</p>"
+ soup = self.soup(quote)
+ self.assertEqual(
+ soup.p.string,
+ "\N{LEFT SINGLE QUOTATION MARK}Foo\N{RIGHT SINGLE QUOTATION MARK}")
+
+ def test_non_breaking_spaces_converted_on_the_way_in(self):
+ soup = self.soup("<a>&nbsp;&nbsp;</a>")
+ self.assertEqual(soup.a.string, "\N{NO-BREAK SPACE}" * 2)
+
+ def test_entities_converted_on_the_way_out(self):
+ text = "<p>&lt;&lt;sacr&eacute;&#32;bleu!&gt;&gt;</p>"
+ expected = "<p>&lt;&lt;sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!&gt;&gt;</p>".encode("utf-8")
+ soup = self.soup(text)
+ self.assertEqual(soup.p.encode("utf-8"), expected)
+
+ def test_real_iso_latin_document(self):
+ # Smoke test of interrelated functionality, using an
+ # easy-to-understand document.
+
+ # Here it is in Unicode. Note that it claims to be in ISO-Latin-1.
+ unicode_html = '<html><head><meta content="text/html; charset=ISO-Latin-1" http-equiv="Content-type"/></head><body><p>Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!</p></body></html>'
+
+ # That's because we're going to encode it into ISO-Latin-1, and use
+ # that to test.
+ iso_latin_html = unicode_html.encode("iso-8859-1")
+
+ # Parse the ISO-Latin-1 HTML.
+ soup = self.soup(iso_latin_html)
+ # Encode it to UTF-8.
+ result = soup.encode("utf-8")
+
+ # What do we expect the result to look like? Well, it would
+ # look like unicode_html, except that the META tag would say
+ # UTF-8 instead of ISO-Latin-1.
+ expected = unicode_html.replace("ISO-Latin-1", "utf-8")
+
+ # And, of course, it would be in UTF-8, not Unicode.
+ expected = expected.encode("utf-8")
+
+ # Ta-da!
+ self.assertEqual(result, expected)
+
+ def test_real_shift_jis_document(self):
+ # Smoke test to make sure the parser can handle a document in
+ # Shift-JIS encoding, without choking.
+ shift_jis_html = (
+ b'<html><head></head><body><pre>'
+ b'\x82\xb1\x82\xea\x82\xcdShift-JIS\x82\xc5\x83R\x81[\x83f'
+ b'\x83B\x83\x93\x83O\x82\xb3\x82\xea\x82\xbd\x93\xfa\x96{\x8c'
+ b'\xea\x82\xcc\x83t\x83@\x83C\x83\x8b\x82\xc5\x82\xb7\x81B'
+ b'</pre></body></html>')
+ unicode_html = shift_jis_html.decode("shift-jis")
+ soup = self.soup(unicode_html)
+
+ # Make sure the parse tree is correctly encoded to various
+ # encodings.
+ self.assertEqual(soup.encode("utf-8"), unicode_html.encode("utf-8"))
+ self.assertEqual(soup.encode("euc_jp"), unicode_html.encode("euc_jp"))
+
+ def test_real_hebrew_document(self):
+ # A real-world test to make sure we can convert ISO-8859-9 (a
+ # Hebrew encoding) to UTF-8.
+ hebrew_document = b'<html><head><title>Hebrew (ISO 8859-8) in Visual Directionality</title></head><body><h1>Hebrew (ISO 8859-8) in Visual Directionality</h1>\xed\xe5\xec\xf9</body></html>'
+ soup = self.soup(
+ hebrew_document, from_encoding="iso8859-8")
+ # Some tree builders call it iso8859-8, others call it iso-8859-9.
+ # That's not a difference we really care about.
+ assert soup.original_encoding in ('iso8859-8', 'iso-8859-8')
+ self.assertEqual(
+ soup.encode('utf-8'),
+ hebrew_document.decode("iso8859-8").encode("utf-8"))
+
+ def test_meta_tag_reflects_current_encoding(self):
+ # Here's the <meta> tag saying that a document is
+ # encoded in Shift-JIS.
+ meta_tag = ('<meta content="text/html; charset=x-sjis" '
+ 'http-equiv="Content-type"/>')
+
+ # Here's a document incorporating that meta tag.
+ shift_jis_html = (
+ '<html><head>\n%s\n'
+ '<meta http-equiv="Content-language" content="ja"/>'
+ '</head><body>Shift-JIS markup goes here.') % meta_tag
+ soup = self.soup(shift_jis_html)
+
+ # Parse the document, and the charset is seemingly unaffected.
+ parsed_meta = soup.find('meta', {'http-equiv': 'Content-type'})
+ content = parsed_meta['content']
+ self.assertEqual('text/html; charset=x-sjis', content)
+
+ # But that value is actually a ContentMetaAttributeValue object.
+ self.assertTrue(isinstance(content, ContentMetaAttributeValue))
+
+ # And it will take on a value that reflects its current
+ # encoding.
+ self.assertEqual('text/html; charset=utf8', content.encode("utf8"))
+
+ # For the rest of the story, see TestSubstitutions in
+ # test_tree.py.
+
+ def test_html5_style_meta_tag_reflects_current_encoding(self):
+ # Here's the <meta> tag saying that a document is
+ # encoded in Shift-JIS.
+ meta_tag = ('<meta id="encoding" charset="x-sjis" />')
+
+ # Here's a document incorporating that meta tag.
+ shift_jis_html = (
+ '<html><head>\n%s\n'
+ '<meta http-equiv="Content-language" content="ja"/>'
+ '</head><body>Shift-JIS markup goes here.') % meta_tag
+ soup = self.soup(shift_jis_html)
+
+ # Parse the document, and the charset is seemingly unaffected.
+ parsed_meta = soup.find('meta', id="encoding")
+ charset = parsed_meta['charset']
+ self.assertEqual('x-sjis', charset)
+
+ # But that value is actually a CharsetMetaAttributeValue object.
+ self.assertTrue(isinstance(charset, CharsetMetaAttributeValue))
+
+ # And it will take on a value that reflects its current
+ # encoding.
+ self.assertEqual('utf8', charset.encode("utf8"))
+
+ def test_python_specific_encodings_not_used_in_charset(self):
+ # You can encode an HTML document using a Python-specific
+ # encoding, but that encoding won't be mentioned _inside_ the
+ # resulting document. Instead, the document will appear to
+ # have no encoding.
+ for markup in [
+ b'<meta charset="utf8"></head>'
+ b'<meta id="encoding" charset="utf-8" />'
+ ]:
+ soup = self.soup(markup)
+ for encoding in PYTHON_SPECIFIC_ENCODINGS:
+ if encoding in (
+ 'idna', 'mbcs', 'oem', 'undefined',
+ 'string_escape', 'string-escape'
+ ):
+ # For one reason or another, these will raise an
+ # exception if we actually try to use them, so don't
+ # bother.
+ continue
+ encoded = soup.encode(encoding)
+ assert b'meta charset=""' in encoded
+ assert encoding.encode("ascii") not in encoded
+
+ def test_tag_with_no_attributes_can_have_attributes_added(self):
+ data = self.soup("<a>text</a>")
+ data.a['foo'] = 'bar'
+ self.assertEqual('<a foo="bar">text</a>', data.a.decode())
+
+ def test_closing_tag_with_no_opening_tag(self):
+ # Without BeautifulSoup.open_tag_counter, the </span> tag will
+ # cause _popToTag to be called over and over again as we look
+ # for a <span> tag that wasn't there. The result is that 'text2'
+ # will show up outside the body of the document.
+ soup = self.soup("<body><div><p>text1</p></span>text2</div></body>")
+ self.assertEqual(
+ "<body><div><p>text1</p>text2</div></body>", soup.body.decode()
+ )
+
+ def test_worst_case(self):
+ """Test the worst case (currently) for linking issues."""
+
+ soup = self.soup(BAD_DOCUMENT)
+ self.linkage_validator(soup)
+
+
+class XMLTreeBuilderSmokeTest(object):
+
+ def test_pickle_and_unpickle_identity(self):
+ # Pickling a tree, then unpickling it, yields a tree identical
+ # to the original.
+ tree = self.soup("<a><b>foo</a>")
+ dumped = pickle.dumps(tree, 2)
+ loaded = pickle.loads(dumped)
+ self.assertEqual(loaded.__class__, BeautifulSoup)
+ self.assertEqual(loaded.decode(), tree.decode())
+
+ def test_docstring_generated(self):
+ soup = self.soup("<root/>")
+ self.assertEqual(
+ soup.encode(), b'<?xml version="1.0" encoding="utf-8"?>\n<root/>')
+
+ def test_xml_declaration(self):
+ markup = b"""<?xml version="1.0" encoding="utf8"?>\n<foo/>"""
+ soup = self.soup(markup)
+ self.assertEqual(markup, soup.encode("utf8"))
+
+ def test_python_specific_encodings_not_used_in_xml_declaration(self):
+ # You can encode an XML document using a Python-specific
+ # encoding, but that encoding won't be mentioned _inside_ the
+ # resulting document.
+ markup = b"""<?xml version="1.0"?>\n<foo/>"""
+ soup = self.soup(markup)
+ for encoding in PYTHON_SPECIFIC_ENCODINGS:
+ if encoding in (
+ 'idna', 'mbcs', 'oem', 'undefined',
+ 'string_escape', 'string-escape'
+ ):
+ # For one reason or another, these will raise an
+ # exception if we actually try to use them, so don't
+ # bother.
+ continue
+ encoded = soup.encode(encoding)
+ assert b'<?xml version="1.0"?>' in encoded
+ assert encoding.encode("ascii") not in encoded
+
+ def test_processing_instruction(self):
+ markup = b"""<?xml version="1.0" encoding="utf8"?>\n<?PITarget PIContent?>"""
+ soup = self.soup(markup)
+ self.assertEqual(markup, soup.encode("utf8"))
+
+ def test_real_xhtml_document(self):
+ """A real XHTML document should come out *exactly* the same as it went in."""
+ markup = b"""<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title>Hello.</title></head>
+<body>Goodbye.</body>
+</html>"""
+ soup = self.soup(markup)
+ self.assertEqual(
+ soup.encode("utf-8"), markup)
+
+ def test_nested_namespaces(self):
+ doc = b"""<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<parent xmlns="http://ns1/">
+<child xmlns="http://ns2/" xmlns:ns3="http://ns3/">
+<grandchild ns3:attr="value" xmlns="http://ns4/"/>
+</child>
+</parent>"""
+ soup = self.soup(doc)
+ self.assertEqual(doc, soup.encode())
+
+ def test_formatter_processes_script_tag_for_xml_documents(self):
+ doc = """
+ <script type="text/javascript">
+ </script>
+"""
+ soup = BeautifulSoup(doc, "lxml-xml")
+ # lxml would have stripped this while parsing, but we can add
+ # it later.
+ soup.script.string = 'console.log("< < hey > > ");'
+ encoded = soup.encode()
+ self.assertTrue(b"&lt; &lt; hey &gt; &gt;" in encoded)
+
+ def test_can_parse_unicode_document(self):
+ markup = '<?xml version="1.0" encoding="euc-jp"><root>Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!</root>'
+ soup = self.soup(markup)
+ self.assertEqual('Sacr\xe9 bleu!', soup.root.string)
+
+ def test_popping_namespaced_tag(self):
+ markup = '<rss xmlns:dc="foo"><dc:creator>b</dc:creator><dc:date>2012-07-02T20:33:42Z</dc:date><dc:rights>c</dc:rights><image>d</image></rss>'
+ soup = self.soup(markup)
+ self.assertEqual(
+ str(soup.rss), markup)
+
+ def test_docstring_includes_correct_encoding(self):
+ soup = self.soup("<root/>")
+ self.assertEqual(
+ soup.encode("latin1"),
+ b'<?xml version="1.0" encoding="latin1"?>\n<root/>')
+
+ def test_large_xml_document(self):
+ """A large XML document should come out the same as it went in."""
+ markup = (b'<?xml version="1.0" encoding="utf-8"?>\n<root>'
+ + b'0' * (2**12)
+ + b'</root>')
+ soup = self.soup(markup)
+ self.assertEqual(soup.encode("utf-8"), markup)
+
+
+ def test_tags_are_empty_element_if_and_only_if_they_are_empty(self):
+ self.assertSoupEquals("<p>", "<p/>")
+ self.assertSoupEquals("<p>foo</p>")
+
+ def test_namespaces_are_preserved(self):
+ markup = '<root xmlns:a="http://example.com/" xmlns:b="http://example.net/"><a:foo>This tag is in the a namespace</a:foo><b:foo>This tag is in the b namespace</b:foo></root>'
+ soup = self.soup(markup)
+ root = soup.root
+ self.assertEqual("http://example.com/", root['xmlns:a'])
+ self.assertEqual("http://example.net/", root['xmlns:b'])
+
+ def test_closing_namespaced_tag(self):
+ markup = '<p xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>20010504</dc:date></p>'
+ soup = self.soup(markup)
+ self.assertEqual(str(soup.p), markup)
+
+ def test_namespaced_attributes(self):
+ markup = '<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><bar xsi:schemaLocation="http://www.example.com"/></foo>'
+ soup = self.soup(markup)
+ self.assertEqual(str(soup.foo), markup)
+
+ def test_namespaced_attributes_xml_namespace(self):
+ markup = '<foo xml:lang="fr">bar</foo>'
+ soup = self.soup(markup)
+ self.assertEqual(str(soup.foo), markup)
+
+ def test_find_by_prefixed_name(self):
+ doc = """<?xml version="1.0" encoding="utf-8"?>
+<Document xmlns="http://example.com/ns0"
+ xmlns:ns1="http://example.com/ns1"
+ xmlns:ns2="http://example.com/ns2"
+ <ns1:tag>foo</ns1:tag>
+ <ns1:tag>bar</ns1:tag>
+ <ns2:tag key="value">baz</ns2:tag>
+</Document>
+"""
+ soup = self.soup(doc)
+
+ # There are three <tag> tags.
+ self.assertEqual(3, len(soup.find_all('tag')))
+
+ # But two of them are ns1:tag and one of them is ns2:tag.
+ self.assertEqual(2, len(soup.find_all('ns1:tag')))
+ self.assertEqual(1, len(soup.find_all('ns2:tag')))
+
+ self.assertEqual(1, len(soup.find_all('ns2:tag', key='value')))
+ self.assertEqual(3, len(soup.find_all(['ns1:tag', 'ns2:tag'])))
+
+ def test_copy_tag_preserves_namespace(self):
+ xml = """<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<w:document xmlns:w="http://example.com/ns0"/>"""
+
+ soup = self.soup(xml)
+ tag = soup.document
+ duplicate = copy.copy(tag)
+
+ # The two tags have the same namespace prefix.
+ self.assertEqual(tag.prefix, duplicate.prefix)
+
+ def test_worst_case(self):
+ """Test the worst case (currently) for linking issues."""
+
+ soup = self.soup(BAD_DOCUMENT)
+ self.linkage_validator(soup)
+
+
+class HTML5TreeBuilderSmokeTest(HTMLTreeBuilderSmokeTest):
+ """Smoke test for a tree builder that supports HTML5."""
+
+ def test_real_xhtml_document(self):
+ # Since XHTML is not HTML5, HTML5 parsers are not tested to handle
+ # XHTML documents in any particular way.
+ pass
+
+ def test_html_tags_have_namespace(self):
+ markup = "<a>"
+ soup = self.soup(markup)
+ self.assertEqual("http://www.w3.org/1999/xhtml", soup.a.namespace)
+
+ def test_svg_tags_have_namespace(self):
+ markup = '<svg><circle/></svg>'
+ soup = self.soup(markup)
+ namespace = "http://www.w3.org/2000/svg"
+ self.assertEqual(namespace, soup.svg.namespace)
+ self.assertEqual(namespace, soup.circle.namespace)
+
+
+ def test_mathml_tags_have_namespace(self):
+ markup = '<math><msqrt>5</msqrt></math>'
+ soup = self.soup(markup)
+ namespace = 'http://www.w3.org/1998/Math/MathML'
+ self.assertEqual(namespace, soup.math.namespace)
+ self.assertEqual(namespace, soup.msqrt.namespace)
+
+ def test_xml_declaration_becomes_comment(self):
+ markup = '<?xml version="1.0" encoding="utf-8"?><html></html>'
+ soup = self.soup(markup)
+ self.assertTrue(isinstance(soup.contents[0], Comment))
+ self.assertEqual(soup.contents[0], '?xml version="1.0" encoding="utf-8"?')
+ self.assertEqual("html", soup.contents[0].next_element.name)
+
+def skipIf(condition, reason):
+ def nothing(test, *args, **kwargs):
+ return None
+
+ def decorator(test_item):
+ if condition:
+ return nothing
+ else:
+ return test_item
+
+ return decorator
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/scripts/demonstrate_parser_differences.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/scripts/demonstrate_parser_differences.py
new file mode 100644
index 00000000000..d84670a53a6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/scripts/demonstrate_parser_differences.py
@@ -0,0 +1,95 @@
+"""Demonstrate how different parsers parse the same markup.
+
+Beautiful Soup can use any of a number of different parsers. Every
+parser should behave more or less the same on valid markup, and
+Beautiful Soup's unit tests make sure this is the case. But every
+parser handles invalid markup differently. Even different versions of
+the same parser handle invalid markup differently. So instead of unit
+tests I've created this educational demonstration script.
+
+The file demonstration_markup.txt contains many lines of HTML. This
+script tests each line of markup against every parser you have
+installed, and prints out how each parser sees that markup. This may
+help you choose a parser, or understand why Beautiful Soup presents
+your document the way it does.
+"""
+
+import os
+import sys
+from bs4 import BeautifulSoup
+parsers = ['html.parser']
+
+try:
+ from bs4.builder import _lxml
+ parsers.append('lxml')
+except ImportError, e:
+ pass
+
+try:
+ from bs4.builder import _html5lib
+ parsers.append('html5lib')
+except ImportError, e:
+ pass
+
+class Demonstration(object):
+ def __init__(self, markup):
+ self.results = {}
+ self.markup = markup
+
+ def run_against(self, *parser_names):
+ uniform_results = True
+ previous_output = None
+ for parser in parser_names:
+ try:
+ soup = BeautifulSoup(self.markup, parser)
+ if markup.startswith("<div>"):
+ # Extract the interesting part
+ output = soup.div
+ else:
+ output = soup
+ except Exception, e:
+ output = "[EXCEPTION] %s" % str(e)
+ self.results[parser] = output
+ if previous_output is None:
+ previous_output = output
+ elif previous_output != output:
+ uniform_results = False
+ return uniform_results
+
+ def dump(self):
+ print "%s: %s" % ("Markup".rjust(13), self.markup.encode("utf8"))
+ for parser, output in self.results.items():
+ print "%s: %s" % (parser.rjust(13), output.encode("utf8"))
+
+different_results = []
+uniform_results = []
+
+print "= Testing the following parsers: %s =" % ", ".join(parsers)
+print
+
+input_file = sys.stdin
+if sys.stdin.isatty():
+ for filename in [
+ "demonstration_markup.txt",
+ os.path.join("scripts", "demonstration_markup.txt")]:
+ if os.path.exists(filename):
+ input_file = open(filename)
+
+for markup in input_file:
+ demo = Demonstration(markup.decode("utf8").strip().replace("\\n", "\n"))
+ is_uniform = demo.run_against(*parsers)
+ if is_uniform:
+ uniform_results.append(demo)
+ else:
+ different_results.append(demo)
+
+print "== Markup that's handled the same in every parser =="
+print
+for demo in uniform_results:
+ demo.dump()
+ print
+print "== Markup that's not handled the same in every parser =="
+print
+for demo in different_results:
+ demo.dump()
+ print
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/scripts/demonstration_markup.txt b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/scripts/demonstration_markup.txt
new file mode 100644
index 00000000000..a7914a0b04a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/scripts/demonstration_markup.txt
@@ -0,0 +1,34 @@
+A bare string
+<!DOCTYPE xsl:stylesheet SYSTEM "htmlent.dtd">
+<!DOCTYPE xsl:stylesheet PUBLIC "htmlent.dtd">
+<div><![CDATA[A CDATA section where it doesn't belong]]></div>
+<div><svg><![CDATA[HTML5 does allow CDATA sections in SVG]]></svg></div>
+<div>A <meta> tag</div>
+<div>A <br> tag that supposedly has contents.</br></div>
+<div>AT&T</div>
+<div><textarea>Within a textarea, markup like <b> tags and <&<&amp; should be treated as literal</textarea></div>
+<div><script>if (i < 2) { alert("<b>Markup within script tags should be treated as literal.</b>"); }</script></div>
+<div>This numeric entity is missing the final semicolon: <x t="pi&#241ata"></div>
+<div><a href="http://example.com/</a> that attribute value never got closed</div>
+<div><a href="foo</a>, </a><a href="bar">that attribute value was closed by the subsequent tag</a></div>
+<! This document starts with a bogus declaration ><div>a</div>
+<div>This document contains <!an incomplete declaration <div>(do you see it?)</div>
+<div>This document ends with <!an incomplete declaration
+<div><a style={height:21px;}>That attribute value was bogus</a></div>
+<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">The doctype is invalid because it contains extra whitespace
+<div><table><td nowrap>That boolean attribute had no value</td></table></div>
+<div>Here's a nonexistent entity: &#foo; (do you see it?)</div>
+<div>This document ends before the entity finishes: &gt
+<div><p>Paragraphs shouldn't contain block display elements, but this one does: <dl><dt>you see?</dt></p>
+<b b="20" a="1" b="10" a="2" a="3" a="4">Multiple values for the same attribute.</b>
+<div><table><tr><td>Here's a table</td></tr></table></div>
+<div><table id="1"><tr><td>Here's a nested table:<table id="2"><tr><td>foo</td></tr></table></td></div>
+<div>This tag contains nothing but whitespace: <b> </b></div>
+<div><blockquote><p><b>This p tag is cut off by</blockquote></p>the end of the blockquote tag</div>
+<div><table><div>This table contains bare markup</div></table></div>
+<div><div id="1">\n <a href="link1">This link is never closed.\n</div>\n<div id="2">\n <div id="3">\n <a href="link2">This link is closed.</a>\n </div>\n</div></div>
+<div>This document contains a <!DOCTYPE surprise>surprise doctype</div>
+<div><a><B><Cd><EFG>Mixed case tags are folded to lowercase</efg></CD></b></A></div>
+<div><our☃>Tag name contains Unicode characters</our☃></div>
+<div><a ☃="snowman">Attribute name contains Unicode characters</a></div>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/setup.cfg b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/setup.cfg
new file mode 100644
index 00000000000..8bfd5a12f85
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/setup.cfg
@@ -0,0 +1,4 @@
+[egg_info]
+tag_build =
+tag_date = 0
+
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/setup.py b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/setup.py
new file mode 100644
index 00000000000..7b4b3931c3d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/setup.py
@@ -0,0 +1,45 @@
+from setuptools import (
+ setup,
+ find_packages,
+)
+import sys
+
+with open("README.md", "r") as fh:
+ long_description = fh.read()
+
+setup(
+ name="beautifulsoup4",
+ # NOTE: We can't import __version__ from bs4 because bs4/__init__.py is Python 2 code,
+ # and converting it to Python 3 means going through this code to run 2to3.
+ # So we have to specify it twice for the time being.
+ version = '4.9.3',
+ author="Leonard Richardson",
+ author_email='leonardr@segfault.org',
+ url="http://www.crummy.com/software/BeautifulSoup/bs4/",
+ download_url = "http://www.crummy.com/software/BeautifulSoup/bs4/download/",
+ description="Screen-scraping library",
+ install_requires=[
+ "soupsieve >1.2; python_version>='3.0'",
+ "soupsieve >1.2, <2.0; python_version<'3.0'",
+ ],
+ long_description=long_description,
+ long_description_content_type="text/markdown",
+ license="MIT",
+ packages=find_packages(exclude=['tests*']),
+ extras_require = {
+ 'lxml' : [ 'lxml'],
+ 'html5lib' : ['html5lib'],
+ },
+ use_2to3 = True,
+ classifiers=["Development Status :: 5 - Production/Stable",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: MIT License",
+ "Programming Language :: Python",
+ "Programming Language :: Python :: 2.7",
+ 'Programming Language :: Python :: 3',
+ "Topic :: Text Processing :: Markup :: HTML",
+ "Topic :: Text Processing :: Markup :: XML",
+ "Topic :: Text Processing :: Markup :: SGML",
+ "Topic :: Software Development :: Libraries :: Python Modules",
+ ],
+)
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/test-all-versions b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/test-all-versions
new file mode 100755
index 00000000000..01e436b10ac
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4-4.9.3/test-all-versions
@@ -0,0 +1 @@
+python2.7 -m unittest discover -s bs4 && ./convert-py3k
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/__init__.py b/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/__init__.py
index 7ba34269af7..85d9135f39d 100644
--- a/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/__init__.py
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/__init__.py
@@ -16,6 +16,10 @@ documentation:
http://www.crummy.com/software/BeautifulSoup/bs4/doc/
"""
+from __future__ import absolute_import
+from __future__ import print_function
+import six
+from six.moves import range
__author__ = "Leonard Richardson (leonardr@segfault.org)"
__version__ = "4.3.2"
__copyright__ = "Copyright (c) 2004-2013 Leonard Richardson"
@@ -135,12 +139,12 @@ class BeautifulSoup(Tag):
"fromEncoding", "from_encoding")
if len(kwargs) > 0:
- arg = kwargs.keys().pop()
+ arg = list(kwargs.keys()).pop()
raise TypeError(
"__init__() got an unexpected keyword argument '%s'" % arg)
if builder is None:
- if isinstance(features, basestring):
+ if isinstance(features, six.string_types):
features = [features]
if features is None or len(features) == 0:
features = self.DEFAULT_BUILDER_FEATURES
@@ -164,7 +168,7 @@ class BeautifulSoup(Tag):
# involving passing non-markup to Beautiful Soup.
# Beautiful Soup will still parse the input as markup,
# just in case that's what the user really wants.
- if (isinstance(markup, unicode)
+ if (isinstance(markup, six.text_type)
and not os.path.supports_unicode_filenames):
possible_filename = markup.encode("utf8")
else:
@@ -172,7 +176,7 @@ class BeautifulSoup(Tag):
is_file = False
try:
is_file = os.path.exists(possible_filename)
- except Exception, e:
+ except Exception as e:
# This is almost certainly a problem involving
# characters not valid in filenames on this
# system. Just let it go.
@@ -184,7 +188,7 @@ class BeautifulSoup(Tag):
# TODO: This is ugly but I couldn't get it to work in
# Python 3 otherwise.
if ((isinstance(markup, bytes) and not b' ' in markup)
- or (isinstance(markup, unicode) and not u' ' in markup)):
+ or (isinstance(markup, six.text_type) and not u' ' in markup)):
warnings.warn(
'"%s" looks like a URL. Beautiful Soup is not an HTTP client. You should probably use an HTTP client to get the document behind the URL, and feed that document to Beautiful Soup.' % markup)
@@ -403,4 +407,4 @@ class FeatureNotFound(ValueError):
if __name__ == '__main__':
import sys
soup = BeautifulSoup(sys.stdin)
- print soup.prettify()
+ print(soup.prettify())
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/builder/__init__.py b/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/builder/__init__.py
index 740f5f29cd7..819012dc22c 100644
--- a/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/builder/__init__.py
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/builder/__init__.py
@@ -1,3 +1,4 @@
+from __future__ import absolute_import
from collections import defaultdict
import itertools
import sys
@@ -6,6 +7,7 @@ from bs4.element import (
ContentMetaAttributeValue,
whitespace_re
)
+import six
__all__ = [
'HTMLTreeBuilder',
@@ -159,7 +161,7 @@ class TreeBuilder(object):
# value is a whitespace-separated list of
# values. Split it into a list.
value = attrs[attr]
- if isinstance(value, basestring):
+ if isinstance(value, six.string_types):
values = whitespace_re.split(value)
else:
# html5lib sometimes calls setAttributes twice
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/builder/_html5lib.py b/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/builder/_html5lib.py
index 7de36ae75e4..93d53812b0f 100644
--- a/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/builder/_html5lib.py
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/builder/_html5lib.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import
+import six
__all__ = [
'HTML5TreeBuilder',
]
@@ -37,7 +39,7 @@ class HTML5TreeBuilder(HTMLTreeBuilder):
doc = parser.parse(markup, encoding=self.user_specified_encoding)
# Set the character encoding detected by the tokenizer.
- if isinstance(markup, unicode):
+ if isinstance(markup, six.text_type):
# We need to special-case this because html5lib sets
# charEncoding to UTF-8 if it gets Unicode input.
doc.original_encoding = None
@@ -124,7 +126,7 @@ class Element(html5lib.treebuilders._base.Node):
def appendChild(self, node):
string_child = child = None
- if isinstance(node, basestring):
+ if isinstance(node, six.string_types):
# Some other piece of code decided to pass in a string
# instead of creating a TextElement object to contain the
# string.
@@ -139,7 +141,7 @@ class Element(html5lib.treebuilders._base.Node):
else:
child = node.element
- if not isinstance(child, basestring) and child.parent is not None:
+ if not isinstance(child, six.string_types) and child.parent is not None:
node.element.extract()
if (string_child and self.element.contents
@@ -152,7 +154,7 @@ class Element(html5lib.treebuilders._base.Node):
old_element.replace_with(new_element)
self.soup._most_recent_element = new_element
else:
- if isinstance(node, basestring):
+ if isinstance(node, six.string_types):
# Create a brand new NavigableString from this string.
child = self.soup.new_string(node)
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/builder/_htmlparser.py b/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/builder/_htmlparser.py
index ca8d8b892bf..504a901c737 100644
--- a/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/builder/_htmlparser.py
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/builder/_htmlparser.py
@@ -1,13 +1,18 @@
"""Use the HTMLParser library to parse HTML files that aren't too bad."""
+from __future__ import absolute_import
+from six import unichr
+import six
__all__ = [
'HTMLParserTreeBuilder',
]
-from HTMLParser import (
- HTMLParser,
- HTMLParseError,
- )
+from six.moves.html_parser import HTMLParser
+if six.PY2:
+ from six.moves.html_parser import HTMLParseError
+else:
+ class HTMLParseError(Exception):
+ pass
import sys
import warnings
@@ -73,7 +78,7 @@ class BeautifulSoupHTMLParser(HTMLParser):
try:
data = unichr(real_name)
- except (ValueError, OverflowError), e:
+ except (ValueError, OverflowError) as e:
data = u"\N{REPLACEMENT CHARACTER}"
self.handle_data(data)
@@ -142,7 +147,7 @@ class HTMLParserTreeBuilder(HTMLTreeBuilder):
declared within markup, whether any characters had to be
replaced with REPLACEMENT CHARACTER).
"""
- if isinstance(markup, unicode):
+ if isinstance(markup, six.text_type):
yield (markup, None, None, False)
return
@@ -158,7 +163,7 @@ class HTMLParserTreeBuilder(HTMLTreeBuilder):
parser.soup = self.soup
try:
parser.feed(markup)
- except HTMLParseError, e:
+ except HTMLParseError as e:
warnings.warn(RuntimeWarning(
"Python's built-in HTMLParser cannot parse the given document. This is not a bug in Beautiful Soup. The best solution is to install an external parser (lxml or html5lib), and use Beautiful Soup with that parser. See http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser for help."))
raise e
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/builder/_lxml.py b/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/builder/_lxml.py
index fa5d49875ea..7a5e612a641 100644
--- a/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/builder/_lxml.py
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/builder/_lxml.py
@@ -1,3 +1,5 @@
+from __future__ import absolute_import
+import six
__all__ = [
'LXMLTreeBuilderForXML',
'LXMLTreeBuilder',
@@ -78,12 +80,12 @@ class LXMLTreeBuilderForXML(TreeBuilder):
Each 4-tuple represents a strategy for parsing the document.
"""
- if isinstance(markup, unicode):
+ if isinstance(markup, six.text_type):
# We were given Unicode. Maybe lxml can parse Unicode on
# this system?
yield markup, None, document_declared_encoding, False
- if isinstance(markup, unicode):
+ if isinstance(markup, six.text_type):
# No, apparently not. Convert the Unicode to UTF-8 and
# tell lxml to parse it as UTF-8.
yield (markup.encode("utf8"), "utf8",
@@ -102,7 +104,7 @@ class LXMLTreeBuilderForXML(TreeBuilder):
def feed(self, markup):
if isinstance(markup, bytes):
markup = BytesIO(markup)
- elif isinstance(markup, unicode):
+ elif isinstance(markup, six.text_type):
markup = StringIO(markup)
# Call feed() at least once, even if the markup is empty,
@@ -117,7 +119,7 @@ class LXMLTreeBuilderForXML(TreeBuilder):
if len(data) != 0:
self.parser.feed(data)
self.parser.close()
- except (UnicodeDecodeError, LookupError, etree.ParserError), e:
+ except (UnicodeDecodeError, LookupError, etree.ParserError) as e:
raise ParserRejectedMarkup(str(e))
def close(self):
@@ -224,7 +226,7 @@ class LXMLTreeBuilder(HTMLTreeBuilder, LXMLTreeBuilderForXML):
self.parser = self.parser_for(encoding)
self.parser.feed(markup)
self.parser.close()
- except (UnicodeDecodeError, LookupError, etree.ParserError), e:
+ except (UnicodeDecodeError, LookupError, etree.ParserError) as e:
raise ParserRejectedMarkup(str(e))
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/dammit.py b/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/dammit.py
index 59640b7ce3a..5fad7274b8f 100644
--- a/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/dammit.py
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/dammit.py
@@ -7,11 +7,14 @@ Feed Parser. It works best on XML and XML, but it does not rewrite the
XML or HTML to reflect a new encoding; that's the tree builder's job.
"""
+from __future__ import absolute_import
import codecs
-from htmlentitydefs import codepoint2name
+from six.moves.html_entities import codepoint2name
import re
import logging
import string
+from six import unichr
+import six
# Import a library to autodetect character encodings.
chardet_type = None
@@ -340,9 +343,9 @@ class UnicodeDammit:
self.detector = EncodingDetector(markup, override_encodings, is_html)
# Short-circuit if the data is in Unicode to begin with.
- if isinstance(markup, unicode) or markup == '':
+ if isinstance(markup, six.text_type) or markup == '':
self.markup = markup
- self.unicode_markup = unicode(markup)
+ self.unicode_markup = six.text_type(markup)
self.original_encoding = None
return
@@ -425,7 +428,7 @@ class UnicodeDammit:
def _to_unicode(self, data, encoding, errors="strict"):
'''Given a string and its encoding, decodes the string into Unicode.
%encoding is a string recognized by encodings.aliases'''
- return unicode(data, encoding, errors)
+ return six.text_type(data, encoding, errors)
@property
def declared_html_encoding(self):
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/diagnose.py b/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/diagnose.py
index 4d0b00afadd..ec417abba3a 100644
--- a/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/diagnose.py
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/diagnose.py
@@ -1,7 +1,9 @@
"""Diagnostic functions, mainly for use when doing tech support."""
+from __future__ import absolute_import
+from __future__ import print_function
import cProfile
from StringIO import StringIO
-from HTMLParser import HTMLParser
+from six.moves.html_parser import HTMLParser
import bs4
from bs4 import BeautifulSoup, __version__
from bs4.builder import builder_registry
@@ -14,11 +16,13 @@ import time
import traceback
import sys
import cProfile
+from six.moves import map
+from six.moves import range
def diagnose(data):
"""Diagnostic suite for isolating common problems."""
- print "Diagnostic running on Beautiful Soup %s" % __version__
- print "Python version %s" % sys.version
+ print("Diagnostic running on Beautiful Soup %s" % __version__)
+ print("Python version %s" % sys.version)
basic_parsers = ["html.parser", "html5lib", "lxml"]
for name in basic_parsers:
@@ -27,44 +31,44 @@ def diagnose(data):
break
else:
basic_parsers.remove(name)
- print (
+ print((
"I noticed that %s is not installed. Installing it may help." %
- name)
+ name))
if 'lxml' in basic_parsers:
basic_parsers.append(["lxml", "xml"])
from lxml import etree
- print "Found lxml version %s" % ".".join(map(str,etree.LXML_VERSION))
+ print("Found lxml version %s" % ".".join(map(str,etree.LXML_VERSION)))
if 'html5lib' in basic_parsers:
import html5lib
- print "Found html5lib version %s" % html5lib.__version__
+ print("Found html5lib version %s" % html5lib.__version__)
if hasattr(data, 'read'):
data = data.read()
elif os.path.exists(data):
- print '"%s" looks like a filename. Reading data from the file.' % data
+ print('"%s" looks like a filename. Reading data from the file.' % data)
data = open(data).read()
elif data.startswith("http:") or data.startswith("https:"):
- print '"%s" looks like a URL. Beautiful Soup is not an HTTP client.' % data
- print "You need to use some other library to get the document behind the URL, and feed that document to Beautiful Soup."
+ print('"%s" looks like a URL. Beautiful Soup is not an HTTP client.' % data)
+ print("You need to use some other library to get the document behind the URL, and feed that document to Beautiful Soup.")
return
- print
+ print()
for parser in basic_parsers:
- print "Trying to parse your markup with %s" % parser
+ print("Trying to parse your markup with %s" % parser)
success = False
try:
soup = BeautifulSoup(data, parser)
success = True
- except Exception, e:
- print "%s could not parse the markup." % parser
+ except Exception as e:
+ print("%s could not parse the markup." % parser)
traceback.print_exc()
if success:
- print "Here's what %s did with the markup:" % parser
- print soup.prettify()
+ print("Here's what %s did with the markup:" % parser)
+ print(soup.prettify())
- print "-" * 80
+ print("-" * 80)
def lxml_trace(data, html=True, **kwargs):
"""Print out the lxml events that occur during parsing.
@@ -74,7 +78,7 @@ def lxml_trace(data, html=True, **kwargs):
"""
from lxml import etree
for event, element in etree.iterparse(StringIO(data), html=html, **kwargs):
- print("%s, %4s, %s" % (event, element.tag, element.text))
+ print(("%s, %4s, %s" % (event, element.tag, element.text)))
class AnnouncingParser(HTMLParser):
"""Announces HTMLParser parse events, without doing anything else."""
@@ -156,9 +160,9 @@ def rdoc(num_elements=1000):
def benchmark_parsers(num_elements=100000):
"""Very basic head-to-head performance benchmark."""
- print "Comparative parser benchmark on Beautiful Soup %s" % __version__
+ print("Comparative parser benchmark on Beautiful Soup %s" % __version__)
data = rdoc(num_elements)
- print "Generated a large invalid HTML document (%d bytes)." % len(data)
+ print("Generated a large invalid HTML document (%d bytes)." % len(data))
for parser in ["lxml", ["lxml", "html"], "html5lib", "html.parser"]:
success = False
@@ -167,24 +171,24 @@ def benchmark_parsers(num_elements=100000):
soup = BeautifulSoup(data, parser)
b = time.time()
success = True
- except Exception, e:
- print "%s could not parse the markup." % parser
+ except Exception as e:
+ print("%s could not parse the markup." % parser)
traceback.print_exc()
if success:
- print "BS4+%s parsed the markup in %.2fs." % (parser, b-a)
+ print("BS4+%s parsed the markup in %.2fs." % (parser, b-a))
from lxml import etree
a = time.time()
etree.HTML(data)
b = time.time()
- print "Raw lxml parsed the markup in %.2fs." % (b-a)
+ print("Raw lxml parsed the markup in %.2fs." % (b-a))
import html5lib
parser = html5lib.HTMLParser()
a = time.time()
parser.parse(data)
b = time.time()
- print "Raw html5lib parsed the markup in %.2fs." % (b-a)
+ print("Raw html5lib parsed the markup in %.2fs." % (b-a))
def profile(num_elements=100000, parser="lxml"):
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/element.py b/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/element.py
index da9afdf48ec..bda27c3e9c9 100644
--- a/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/element.py
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/element.py
@@ -1,8 +1,11 @@
+from __future__ import absolute_import
+from __future__ import print_function
import collections
import re
import sys
import warnings
from bs4.dammit import EntitySubstitution
+import six
DEFAULT_OUTPUT_ENCODING = "utf-8"
PY3K = (sys.version_info[0] > 2)
@@ -21,22 +24,22 @@ def _alias(attr):
return alias
-class NamespacedAttribute(unicode):
+class NamespacedAttribute(six.text_type):
def __new__(cls, prefix, name, namespace=None):
if name is None:
- obj = unicode.__new__(cls, prefix)
+ obj = six.text_type.__new__(cls, prefix)
elif prefix is None:
# Not really namespaced.
- obj = unicode.__new__(cls, name)
+ obj = six.text_type.__new__(cls, name)
else:
- obj = unicode.__new__(cls, prefix + ":" + name)
+ obj = six.text_type.__new__(cls, prefix + ":" + name)
obj.prefix = prefix
obj.name = name
obj.namespace = namespace
return obj
-class AttributeValueWithCharsetSubstitution(unicode):
+class AttributeValueWithCharsetSubstitution(six.text_type):
"""A stand-in object for a character encoding specified in HTML."""
class CharsetMetaAttributeValue(AttributeValueWithCharsetSubstitution):
@@ -47,7 +50,7 @@ class CharsetMetaAttributeValue(AttributeValueWithCharsetSubstitution):
"""
def __new__(cls, original_value):
- obj = unicode.__new__(cls, original_value)
+ obj = six.text_type.__new__(cls, original_value)
obj.original_value = original_value
return obj
@@ -70,9 +73,9 @@ class ContentMetaAttributeValue(AttributeValueWithCharsetSubstitution):
match = cls.CHARSET_RE.search(original_value)
if match is None:
# No substitution necessary.
- return unicode.__new__(unicode, original_value)
+ return six.text_type.__new__(six.text_type, original_value)
- obj = unicode.__new__(cls, original_value)
+ obj = six.text_type.__new__(cls, original_value)
obj.original_value = original_value
return obj
@@ -272,7 +275,7 @@ class PageElement(object):
def insert(self, position, new_child):
if new_child is self:
raise ValueError("Cannot insert a tag into itself.")
- if (isinstance(new_child, basestring)
+ if (isinstance(new_child, six.string_types)
and not isinstance(new_child, NavigableString)):
new_child = NavigableString(new_child)
@@ -489,7 +492,7 @@ class PageElement(object):
result = (element for element in generator
if isinstance(element, Tag))
return ResultSet(strainer, result)
- elif isinstance(name, basestring):
+ elif isinstance(name, six.string_types):
# Optimization to find all tags with a given name.
result = (element for element in generator
if isinstance(element, Tag)
@@ -640,7 +643,7 @@ class PageElement(object):
return self.parents
-class NavigableString(unicode, PageElement):
+class NavigableString(six.text_type, PageElement):
PREFIX = ''
SUFFIX = ''
@@ -653,15 +656,15 @@ class NavigableString(unicode, PageElement):
passed in to the superclass's __new__ or the superclass won't know
how to handle non-ASCII characters.
"""
- if isinstance(value, unicode):
- return unicode.__new__(cls, value)
- return unicode.__new__(cls, value, DEFAULT_OUTPUT_ENCODING)
+ if isinstance(value, six.text_type):
+ return six.text_type.__new__(cls, value)
+ return six.text_type.__new__(cls, value, DEFAULT_OUTPUT_ENCODING)
def __copy__(self):
return self
def __getnewargs__(self):
- return (unicode(self),)
+ return (six.text_type(self),)
def __getattr__(self, attr):
"""text.string gives you text. This is for backwards
@@ -1025,8 +1028,8 @@ class Tag(PageElement):
else:
if isinstance(val, list) or isinstance(val, tuple):
val = ' '.join(val)
- elif not isinstance(val, basestring):
- val = unicode(val)
+ elif not isinstance(val, six.string_types):
+ val = six.text_type(val)
elif (
isinstance(val, AttributeValueWithCharsetSubstitution)
and eventual_encoding is not None):
@@ -1034,7 +1037,7 @@ class Tag(PageElement):
text = self.format_string(val, formatter)
decoded = (
- unicode(key) + '='
+ six.text_type(key) + '='
+ EntitySubstitution.quoted_attribute_value(text))
attrs.append(decoded)
close = ''
@@ -1210,16 +1213,16 @@ class Tag(PageElement):
raise ValueError(
'Final combinator "%s" is missing an argument.' % tokens[-1])
if self._select_debug:
- print 'Running CSS selector "%s"' % selector
+ print('Running CSS selector "%s"' % selector)
for index, token in enumerate(tokens):
if self._select_debug:
- print ' Considering token "%s"' % token
+ print(' Considering token "%s"' % token)
recursive_candidate_generator = None
tag_name = None
if tokens[index-1] in self._selector_combinators:
# This token was consumed by the previous combinator. Skip it.
if self._select_debug:
- print ' Token was consumed by the previous combinator.'
+ print(' Token was consumed by the previous combinator.')
continue
# Each operation corresponds to a checker function, a rule
# for determining whether a candidate matches the
@@ -1325,14 +1328,14 @@ class Tag(PageElement):
next_token = tokens[index+1]
def recursive_select(tag):
if self._select_debug:
- print ' Calling select("%s") recursively on %s %s' % (next_token, tag.name, tag.attrs)
- print '-' * 40
+ print(' Calling select("%s") recursively on %s %s' % (next_token, tag.name, tag.attrs))
+ print('-' * 40)
for i in tag.select(next_token, recursive_candidate_generator):
if self._select_debug:
- print '(Recursive select picked up candidate %s %s)' % (i.name, i.attrs)
+ print('(Recursive select picked up candidate %s %s)' % (i.name, i.attrs))
yield i
if self._select_debug:
- print '-' * 40
+ print('-' * 40)
_use_candidate_generator = recursive_select
elif _candidate_generator is None:
# By default, a tag's candidates are all of its
@@ -1343,7 +1346,7 @@ class Tag(PageElement):
check = "[any]"
else:
check = tag_name
- print ' Default candidate generator, tag name="%s"' % check
+ print(' Default candidate generator, tag name="%s"' % check)
if self._select_debug:
# This is redundant with later code, but it stops
# a bunch of bogus tags from cluttering up the
@@ -1365,8 +1368,8 @@ class Tag(PageElement):
new_context_ids = set([])
for tag in current_context:
if self._select_debug:
- print " Running candidate generator on %s %s" % (
- tag.name, repr(tag.attrs))
+ print(" Running candidate generator on %s %s" % (
+ tag.name, repr(tag.attrs)))
for candidate in _use_candidate_generator(tag):
if not isinstance(candidate, Tag):
continue
@@ -1381,21 +1384,21 @@ class Tag(PageElement):
break
if checker is None or result:
if self._select_debug:
- print " SUCCESS %s %s" % (candidate.name, repr(candidate.attrs))
+ print(" SUCCESS %s %s" % (candidate.name, repr(candidate.attrs)))
if id(candidate) not in new_context_ids:
# If a tag matches a selector more than once,
# don't include it in the context more than once.
new_context.append(candidate)
new_context_ids.add(id(candidate))
elif self._select_debug:
- print " FAILURE %s %s" % (candidate.name, repr(candidate.attrs))
+ print(" FAILURE %s %s" % (candidate.name, repr(candidate.attrs)))
current_context = new_context
if self._select_debug:
- print "Final verdict:"
+ print("Final verdict:")
for i in current_context:
- print " %s %s" % (i.name, i.attrs)
+ print(" %s %s" % (i.name, i.attrs))
return current_context
# Old names for backwards compatibility
@@ -1448,7 +1451,7 @@ class SoupStrainer(object):
def _normalize_search_value(self, value):
# Leave it alone if it's a Unicode string, a callable, a
# regular expression, a boolean, or None.
- if (isinstance(value, unicode) or callable(value) or hasattr(value, 'match')
+ if (isinstance(value, six.text_type) or callable(value) or hasattr(value, 'match')
or isinstance(value, bool) or value is None):
return value
@@ -1461,7 +1464,7 @@ class SoupStrainer(object):
new_value = []
for v in value:
if (hasattr(v, '__iter__') and not isinstance(v, bytes)
- and not isinstance(v, unicode)):
+ and not isinstance(v, six.text_type)):
# This is almost certainly the user's mistake. In the
# interests of avoiding infinite loops, we'll let
# it through as-is rather than doing a recursive call.
@@ -1473,7 +1476,7 @@ class SoupStrainer(object):
# Otherwise, convert it into a Unicode string.
# The unicode(str()) thing is so this will do the same thing on Python 2
# and Python 3.
- return unicode(str(value))
+ return six.text_type(str(value))
def __str__(self):
if self.text:
@@ -1527,7 +1530,7 @@ class SoupStrainer(object):
found = None
# If given a list of items, scan it for a text element that
# matches.
- if hasattr(markup, '__iter__') and not isinstance(markup, (Tag, basestring)):
+ if hasattr(markup, '__iter__') and not isinstance(markup, (Tag, six.string_types)):
for element in markup:
if isinstance(element, NavigableString) \
and self.search(element):
@@ -1540,7 +1543,7 @@ class SoupStrainer(object):
found = self.search_tag(markup)
# If it's text, make sure the text matches.
elif isinstance(markup, NavigableString) or \
- isinstance(markup, basestring):
+ isinstance(markup, six.string_types):
if not self.name and not self.attrs and self._matches(markup, self.text):
found = markup
else:
@@ -1554,7 +1557,7 @@ class SoupStrainer(object):
if isinstance(markup, list) or isinstance(markup, tuple):
# This should only happen when searching a multi-valued attribute
# like 'class'.
- if (isinstance(match_against, unicode)
+ if (isinstance(match_against, six.text_type)
and ' ' in match_against):
# A bit of a special case. If they try to match "foo
# bar" on a multivalue attribute's value, only accept
@@ -1589,7 +1592,7 @@ class SoupStrainer(object):
# None matches None, False, an empty string, an empty list, and so on.
return not match_against
- if isinstance(match_against, unicode):
+ if isinstance(match_against, six.text_type):
# Exact string match
return markup == match_against
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/testing.py b/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/testing.py
index fd4495ac58c..4d94c392373 100644
--- a/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/testing.py
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4/bs4/testing.py
@@ -1,5 +1,6 @@
"""Helper classes for tests."""
+from __future__ import absolute_import
import copy
import functools
import unittest
@@ -14,6 +15,7 @@ from bs4.element import (
)
from bs4.builder import HTMLParserTreeBuilder
+import six
default_builder = HTMLParserTreeBuilder
@@ -501,7 +503,7 @@ class XMLTreeBuilderSmokeTest(object):
markup = '<rss xmlns:dc="foo"><dc:creator>b</dc:creator><dc:date>2012-07-02T20:33:42Z</dc:date><dc:rights>c</dc:rights><image>d</image></rss>'
soup = self.soup(markup)
self.assertEqual(
- unicode(soup.rss), markup)
+ six.text_type(soup.rss), markup)
def test_docstring_includes_correct_encoding(self):
soup = self.soup("<root/>")
@@ -532,17 +534,17 @@ class XMLTreeBuilderSmokeTest(object):
def test_closing_namespaced_tag(self):
markup = '<p xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>20010504</dc:date></p>'
soup = self.soup(markup)
- self.assertEqual(unicode(soup.p), markup)
+ self.assertEqual(six.text_type(soup.p), markup)
def test_namespaced_attributes(self):
markup = '<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><bar xsi:schemaLocation="http://www.example.com"/></foo>'
soup = self.soup(markup)
- self.assertEqual(unicode(soup.foo), markup)
+ self.assertEqual(six.text_type(soup.foo), markup)
def test_namespaced_attributes_xml_namespace(self):
markup = '<foo xml:lang="fr">bar</foo>'
soup = self.soup(markup)
- self.assertEqual(unicode(soup.foo), markup)
+ self.assertEqual(six.text_type(soup.foo), markup)
class HTML5TreeBuilderSmokeTest(HTMLTreeBuilderSmokeTest):
"""Smoke test for a tree builder that supports HTML5."""
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4/doc/source/conf.py b/chromium/third_party/catapult/third_party/beautifulsoup4/doc/source/conf.py
index 102c3cf972a..4bad2e9f0f9 100644
--- a/chromium/third_party/catapult/third_party/beautifulsoup4/doc/source/conf.py
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4/doc/source/conf.py
@@ -11,6 +11,7 @@
# All configuration values have a default; values that are commented out
# serve to show the default.
+from __future__ import absolute_import
import sys, os
# If extensions (or modules to document with autodoc) are in another directory,
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4/scripts/demonstrate_parser_differences.py b/chromium/third_party/catapult/third_party/beautifulsoup4/scripts/demonstrate_parser_differences.py
index d84670a53a6..c62f06d3ef8 100644
--- a/chromium/third_party/catapult/third_party/beautifulsoup4/scripts/demonstrate_parser_differences.py
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4/scripts/demonstrate_parser_differences.py
@@ -14,6 +14,8 @@ help you choose a parser, or understand why Beautiful Soup presents
your document the way it does.
"""
+from __future__ import absolute_import
+from __future__ import print_function
import os
import sys
from bs4 import BeautifulSoup
@@ -22,13 +24,13 @@ parsers = ['html.parser']
try:
from bs4.builder import _lxml
parsers.append('lxml')
-except ImportError, e:
+except ImportError as e:
pass
try:
from bs4.builder import _html5lib
parsers.append('html5lib')
-except ImportError, e:
+except ImportError as e:
pass
class Demonstration(object):
@@ -47,7 +49,7 @@ class Demonstration(object):
output = soup.div
else:
output = soup
- except Exception, e:
+ except Exception as e:
output = "[EXCEPTION] %s" % str(e)
self.results[parser] = output
if previous_output is None:
@@ -57,15 +59,15 @@ class Demonstration(object):
return uniform_results
def dump(self):
- print "%s: %s" % ("Markup".rjust(13), self.markup.encode("utf8"))
+ print("%s: %s" % ("Markup".rjust(13), self.markup.encode("utf8")))
for parser, output in self.results.items():
- print "%s: %s" % (parser.rjust(13), output.encode("utf8"))
+ print("%s: %s" % (parser.rjust(13), output.encode("utf8")))
different_results = []
uniform_results = []
-print "= Testing the following parsers: %s =" % ", ".join(parsers)
-print
+print("= Testing the following parsers: %s =" % ", ".join(parsers))
+print()
input_file = sys.stdin
if sys.stdin.isatty():
@@ -83,13 +85,13 @@ for markup in input_file:
else:
different_results.append(demo)
-print "== Markup that's handled the same in every parser =="
-print
+print("== Markup that's handled the same in every parser ==")
+print()
for demo in uniform_results:
demo.dump()
- print
-print "== Markup that's not handled the same in every parser =="
-print
+ print()
+print("== Markup that's not handled the same in every parser ==")
+print()
for demo in different_results:
demo.dump()
- print
+ print()
diff --git a/chromium/third_party/catapult/third_party/beautifulsoup4/setup.py b/chromium/third_party/catapult/third_party/beautifulsoup4/setup.py
index 0142ea00e86..c895096fd62 100644
--- a/chromium/third_party/catapult/third_party/beautifulsoup4/setup.py
+++ b/chromium/third_party/catapult/third_party/beautifulsoup4/setup.py
@@ -1,3 +1,4 @@
+from __future__ import absolute_import
from distutils.core import setup
try:
diff --git a/chromium/third_party/catapult/third_party/polymer-svg-template/README.md b/chromium/third_party/catapult/third_party/polymer-svg-template/README.md
new file mode 100644
index 00000000000..c33b401c3a8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer-svg-template/README.md
@@ -0,0 +1,13 @@
+Name: polymer-svg-template
+URL: https://github.com/garryyao/polymer-svg-template
+Version: 1.0.2
+License: MIT
+Security Critical: no
+
+Description:
+This function allows defining Polymer dom-modules that contain svg that contain
+templates such as dom-if and dom-repeat.
+
+Changes:
+Optionally accept the ownerDocument as a parameter because currentScript is
+unavailable in ES6 modules.
diff --git a/chromium/third_party/catapult/third_party/polymer-svg-template/polymer-svg-template.html b/chromium/third_party/catapult/third_party/polymer-svg-template/polymer-svg-template.html
new file mode 100644
index 00000000000..8a134653263
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer-svg-template/polymer-svg-template.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<script src="/polymer-svg-template/polymer-svg-template.js"></script>
diff --git a/chromium/third_party/catapult/third_party/polymer-svg-template/polymer-svg-template.js b/chromium/third_party/catapult/third_party/polymer-svg-template/polymer-svg-template.js
new file mode 100644
index 00000000000..10bc3b21726
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer-svg-template/polymer-svg-template.js
@@ -0,0 +1,55 @@
+/* Copyright 2018 The Chromium Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style license that can be
+ found in the LICENSE file.
+
+ TODO Remove this file after Polymer#1976 is fixed:
+ https://github.com/Polymer/polymer/issues/1976
+ https://github.com/garryyao/polymer-svg-template
+*/
+'use strict';
+window.PolymerSvgTemplate = (nameOrContent, doc) => {
+ const ua = window.navigator.userAgent;
+
+ // owner document of this import module
+ if (!doc) doc = document.currentScript.ownerDocument;
+ const ns = doc.body.namespaceURI;
+
+ walkTemplate((typeof nameOrContent === 'string') ?
+ Polymer.DomModule.import(name, 'template').content : nameOrContent);
+
+ function upgradeTemplate(el) {
+ const attribs = el.attributes;
+ const tmpl = el.ownerDocument.createElement('template');
+ el.parentNode.insertBefore(tmpl, el);
+ let count = attribs.length;
+ while (count-- > 0) {
+ const attrib = attribs[count];
+ tmpl.setAttribute(attrib.name, attrib.value);
+ el.removeAttribute(attrib.name);
+ }
+ el.parentNode.removeChild(el);
+ const content = tmpl.content;
+ let child;
+ while (child = el.firstChild) {
+ content.appendChild(child);
+ }
+ return tmpl;
+ }
+
+ function walkTemplate(root) {
+ const treeWalker = doc.createTreeWalker(
+ root, NodeFilter.SHOW_ELEMENT);
+ while (treeWalker.nextNode()) {
+ let node = treeWalker.currentNode;
+ if (node.localName === 'svg') {
+ walkTemplate(node);
+ } else if (node.localName === 'template' &&
+ !node.hasAttribute('preserve-content') &&
+ node.namespaceURI !== ns) {
+ node = upgradeTemplate(node);
+ walkTemplate(node.content);
+ treeWalker.currentNode = node;
+ }
+ }
+ }
+};
diff --git a/chromium/third_party/catapult/third_party/polymer2/LICENSE.polymer b/chromium/third_party/catapult/third_party/polymer2/LICENSE.polymer
new file mode 100644
index 00000000000..87c683b8e83
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/LICENSE.polymer
@@ -0,0 +1,27 @@
+// Copyright (c) 2017 The Polymer Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/chromium/third_party/catapult/third_party/polymer2/README.chromium b/chromium/third_party/catapult/third_party/polymer2/README.chromium
new file mode 100644
index 00000000000..f20f4f4c296
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/README.chromium
@@ -0,0 +1,24 @@
+Name: Polymer
+Short Name: polymer
+URL: http://www.polymer-project.org
+Version: 2.2.0
+Revision: (Run `bower install` and see bower_components/polymer/.bower.json)
+License: BSD
+License File: LICENSE.polymer
+Security Critical: no
+
+Description:
+This directory contains a subset of the components provided by the
+Polymer project. See bower.json for a full list of components.
+
+The license can be found in bower_components/polymer/LICENSE.txt.
+
+The source git repositories can be found at:
+https://github.com/Polymer/<component>
+
+Note on Bower:
+Install bower using `npm install -g bower`.
+Install new bower components using `bower install --save $COMPONENT_NAME`.
+
+Local Modifications:
+None
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower.json
new file mode 100644
index 00000000000..f5e46b86c4d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower.json
@@ -0,0 +1,25 @@
+{
+ "name": "catapult",
+ "private": true,
+ "dependencies": {
+ "google-signin": "GoogleWebComponents/google-signin",
+ "iron-icons": "^2.0.0",
+ "iron-collapse": "^2.0.0",
+ "polymer": "Polymer/polymer#^2.0.0",
+ "polymer-redux": "^1.0.0",
+ "app-route": "PolymerElements/app-route",
+ "paper-dialog": "^2.0.0",
+ "web-animations-js": "^2.0.0",
+ "paper-icon-button": "^2.0.0",
+ "paper-checkbox": "^2.0.0",
+ "paper-radio-group": "^2.0.0",
+ "paper-toast": "^2.0.0",
+ "paper-progress": "^2.0.0",
+ "paper-button": "^2.0.0",
+ "paper-tabs": "^2.0.0",
+ "paper-toggle-button": "^2.0.0",
+ "paper-input": "^2.0.0",
+ "web-component-tester": "^6.5.0",
+ "chopsui": "^0.0.38"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/.bower.json
new file mode 100644
index 00000000000..9b7493c33b5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/.bower.json
@@ -0,0 +1,40 @@
+{
+ "name": "accessibility-developer-tools",
+ "version": "2.12.0",
+ "homepage": "https://github.com/GoogleChrome/accessibility-developer-tools",
+ "authors": [
+ "Google"
+ ],
+ "description": "This is a library of accessibility-related testing and utility code.",
+ "main": "dist/js/axs_testing.js",
+ "moduleType": [
+ "amd",
+ "globals"
+ ],
+ "keywords": [
+ "accessibility",
+ "testing",
+ "WCAG",
+ "module"
+ ],
+ "license": "Apache-2.0",
+ "ignore": [
+ "**/.*",
+ "lib",
+ "scripts",
+ "src",
+ "test",
+ "tools",
+ "Gruntfile.js",
+ "package.json"
+ ],
+ "_release": "2.12.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.12.0",
+ "commit": "3616c094e090174f70b53ca4cea25529522abffb"
+ },
+ "_source": "https://github.com/GoogleChrome/accessibility-developer-tools.git",
+ "_target": "^2.10.0",
+ "_originalSource": "accessibility-developer-tools"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/Changelog.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/Changelog.md
new file mode 100644
index 00000000000..e587f7eae53
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/Changelog.md
@@ -0,0 +1,154 @@
+## 2.11.0 - 2016-09-14
+
+### Enhancements
+
+* Performance enhancements (#263)
+
+## 2.10.1-rc.0 - 2016-01-13
+
+### Bug fixes:
+
+* Escape special characters to be used in a query selector string (PR #267)
+* Fix exception thrown by RoleTooltipRequiresDescribedBy.js (#269)
+
+## 2.10.0 - 2015-11-13
+
+## 2.10.0-rc.1 - 2015-10-19
+
+### Bug fixes:
+
+* `linkWithUnclearPurpose` should only look at links, not `<a>` without `href`. (#245)
+
+## 2.10.0-rc.0 - 2015-10-09
+
+### New rules
+* A tabpanel should be related to a tab via aria-controls or aria-labelledby (`src/audits/UncontrolledTabpanel.js`)
+* A data table must identify row and column headers (`src/audits/TableHasAppropriateHeaders.js`)
+* A tooltip element should have an aria-describedby referring to it (`src/audits/RoleTooltipRequiresDescribedBy.js`).
+
+### Enhancements
+
+* Pull DOM-related functionality out into `DOMUtils.js`
+
+### Bug fixes:
+
+* Fix `findTextAlternatives` not always correctly ignoring hidden elements (#217).
+* `findTextAlternatives` now honors `alt` attribute of input type image
+* Revert #150 which was causing the extension not to work.
+* AX_HTML_02 (duplicate IDs) now only audits elements that are referenced by an IDREF (#141);
+* Fix #171 by being smarter about finding the composed parent node.
+* Tweak in canScrollTo to handle the (common) case where the container is `document.body` (#243).
+
+## 2.9.0 - 2015-09-04
+
+## 2.9.0-rc.0 - 2015-08-21
+
+### New rules
+
+* A label element may not have labelable descendants other than its labeled control (`src/audits/MultipleLabelableElementsPerLabel.js`)
+
+### Enhancements
+
+* Implement support for specifying audit configuration options through an object when initializing audits (#165).
+* Implement support for AMD loaders.
+
+### Bug fixes:
+
+* Fix `badAriaAttributeValue` not correctly handling decimal values (#182).
+* Work around null pointer exception caused by closure compiler issue (#183).
+* Add a special case to handle color `"transparent"` to fix (#180).
+* Fix `matchSelector` not working properly in browser environments without vendor prefixes (#189).
+* Fix false positives on elements with no role for Unsupported ARIA Attribute rule (#178 and #199).
+* Fix ARIA `tablist` and ARIA `tab` scope (#204)
+* Fix link with clear purpose with text alternative (#156);
+* Handle edge cases in number parser, e.g. "+1", ".1", "01"
+* HTML button containing img with alt attribute now passes controlsWithoutLabel (#202)
+* Disabled elements should be ignored by low contrast audit (#205)
+* Fix input of type "text" did not find correct implied role (#225)
+* Hidden links are no longer relevant for meaningful link text rule.
+
+## 2.8.0 - 2015-07-24
+
+## 2.8.0-rc.0 - 2015-07-10
+
+### Enhancements:
+* Pull color code into separate file.
+* Improve color suggestion algorithm.
+* Descend into iframes when collecting matching elements.
+
+## 2.7.1 - 2015-06-30
+
+## 2.7.1-rc.1 - 2015-06-23
+
+### Bug fixes:
+
+* Check for null `textAlternatives` in `FocusableElementNotVisibleAndNotAriaHidden`'s `relevantElementMatcher` method.
+
+## 2.7.1-rc.0 - 2015-06-15
+
+### Enhancements:
+* Rework findTextAlternatives not to return non-exposed text alternatives.
+* Add Bower config (#157)
+
+### Bug fixes:
+* Check for any text alternatives when assessing unlabeled images (#154).
+
+## 2.7.0 - 2015-05-15
+
+### New rules
+* This element does not support ARIA roles, states and properties (`src/audits/AriaOnReservedElement.js`)
+* aria-owns should not be used if ownership is implicit in the DOM (`src/audits/AriaOwnsDescendant.js`)
+* Elements with ARIA roles must be in the correct scope (`src/audits/AriaRoleNotScoped.js`)
+* An element's ID must be unique in the DOM (`src/audits/DuplicateId.js`)
+* The web page should have the content's human language indicated in the markup (`src/audits/HumanLangMissing.js`)
+* An element's ID must not be present in more that one aria-owns attribute at any time (`src/audits/MultipleAriaOwners.js`)
+* ARIA attributes which refer to other elements by ID should refer to elements which exist in the DOM (`src/audits/NonExistentAriaRelatedElement.js` - previously `src/audits/NonExistentAriaLabeledBy.js`)
+* Elements with ARIA roles must ensure required owned elements are present (`src/audits/RequiredOwnedAriaRoleMissing.js`)
+* Avoid positive integer values for tabIndex (`src/audits/TabIndexGreaterThanZero.js`)
+* This element has an unsupported ARIA attribute (`src/audits/UnsupportedAriaAttribute.js`)
+
+### Enhancements:
+* Add configurable blacklist phrases and stop words to LinkWithUnclearPurpose (#99)
+* Detect and warn if we reuse the same code for more than one rule. (#133)
+* Force focus before testing visibility on focusable elements. (#65)
+* Use getDistributedNodes to get nodes distributed into shadowRoots (#128)
+* Add section to Audit Rules page for HumanLangMissing and link to it from rule (#119)
+* Reference "applied role" in axs.utils.getRoles enhancement (#130)
+* Add warning that AX_FOCUS_02 is not available from axs.Audit.run() (#85)
+
+### Bug fixes:
+* Incorrect use of nth-of-type against className in utils.getQuerySelectorText (#87)
+* AX_TEXT_01 Accessibility Audit test should probably ignore role=presentation elements (#97)
+* Fix path to audit rules in phantomjs runner (#108)
+* Label audit should fail if form fields lack a label, even with placeholder text (#81)
+* False positives for controls without labels with role=presentation (#23)
+* Fix "valid" flag on return value of axs.utils.getRoles (#131)
+
+Note: this version number is somewhat arbitrary - just bringing it vaguely in line with [the extension](https://github.com/GoogleChrome/accessibility-developer-tools-extension) since that's where the library originated - but will use semver for version bumps going forward from here.
+
+## 0.0.5 - 2014-02-04
+
+### Enhancements:
+* overlapping elements detection code made more sophisticated
+* axs.properties.getFocusProperties() returns more information about visibility
+* new axs.properties.hasDirectTextDescendant() method with more sophisticated detection of text content
+
+### Bug fixes:
+* FocusableElementNotVisibleAndNotAriaHidden audit passes on elements which are brought onscreen on focus
+* UnfocusableElementsWithOnclick checks for element.disabled
+* Fix infinite loop when getting descendant text content of a label containing an input
+* Detect elements which are out of scroll area of any parent element, not just the document scroll area
+* findTextAlternatives doesn't throw TypeError if used on a HTMLSelectElement
+
+## 0.0.4 - 2013-10-03
+
+### Enhancements:
+
+* axs.AuditRule.run() has a new signature: it now takes an options object. Please see method documentation for details.
+* Audit Rule severity can be overridden (per Audit Rule) in AuditConfig.
+
+### Bug fixes:
+
+* axs.utils.isLowContrast() now rounds to the nearest 0.1 before checking (so `#777` is now a passing value)
+* MainRoleOnInappropriateElement was always failing due to accessible name calculation taking the main role into account and not descending into content (now just gets descendant content directly)
+* UnfocusableElementsWithOnClick had a dangling if-statement causing very noisy false positives
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/LICENSE b/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/LICENSE
new file mode 100644
index 00000000000..d6456956733
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/README.md
new file mode 100644
index 00000000000..3bc1a10695a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/README.md
@@ -0,0 +1,222 @@
+[![Build Status](https://travis-ci.org/GoogleChrome/accessibility-developer-tools.svg?branch=master)](https://travis-ci.org/GoogleChrome/accessibility-developer-tools)
+[![npm version](https://img.shields.io/npm/v/accessibility-developer-tools.svg)](https://www.npmjs.com/package/accessibility-developer-tools)
+[![npm downloads](https://img.shields.io/npm/dm/accessibility-developer-tools.svg)](https://www.npmjs.com/package/accessibility-developer-tools)
+
+# Accessibility Developer Tools
+
+This is a library of accessibility-related testing and utility code.
+
+Its main component is the accessibility audit: a collection of audit rules checking for common accessibility problems, and an API for running these rules in an HTML page.
+
+There is also a collection of accessibility-related utility code, including but not limited to:
+* contrast ratio calculation and color suggestions
+* retrieving and validating ARIA attributes and states
+* accessible name calculation using the algorithm at [http://www.w3.org/TR/wai-aria/roles#textalternativecomputation](http://www.w3.org/TR/wai-aria/roles#textalternativecomputation)
+
+# Getting the code
+
+To include just the javascript rules, require the following file:
+
+ https://raw.github.com/GoogleChrome/accessibility-developer-tools/stable/dist/js/axs_testing.js
+
+ `git 1.6.5` or later:
+
+ % git clone --recursive https://github.com/GoogleChrome/accessibility-developer-tools.git
+
+ Before `git 1.6.5`:
+
+ % git clone https://github.com/GoogleChrome/accessibility-developer-tools.git
+ % cd accessibility-developer-tools
+ % git submodule init; git submodule update
+
+# Building
+
+You will need `node` and `grunt-cli` to build.
+
+1. (Once only) Install [Node.js](http://nodejs.org/) and `npm` - useful instructions here: [https://gist.github.com/isaacs/579814](https://gist.github.com/isaacs/579814)
+
+ Make sure you have Node.js v 0.8 or higher.
+
+2. (Once only) Use `npm` to install `grunt-cli`
+
+ % npm install -g grunt-cli # May need to be run as root
+
+3. (Every time you make a fresh checkout) Install dependencies (including `grunt`) for this project (run from project root)
+
+ % npm install
+
+4. (Rebuild if you make changes) Build using `grunt` (run from project root)
+
+ % grunt
+
+
+## Troubleshooting
+
+This project uses [Closure Compiler](https://github.com/google/closure-compiler) to build our releases. You may need to install a recent version of [JDK](http://www.oracle.com/technetwork/java/javase/downloads/index.html) in order for builds to successfully complete.
+
+# Using the Audit API
+
+## Including the library
+
+The simplest option is to include the generated `axs_testing.js` library on your page. After you build, you will have two versions of `axs_testings.js`:
+* Distribution Build: project-root/dist/js/axs_testing.js
+* Local Build (use if you make changes): project-root/tmp/build/axs_testing.js
+
+Work is underway to include the library in WebDriver and other automated testing frameworks.
+
+## The `axs.Audit.run()` method
+
+Once you have included `axs_testing.js`, you can call `axs.Audit.run()`. This returns an object in the following form:
+
+ {
+ /** @type {axs.constants.AuditResult} */
+ result, // one of PASS, FAIL or NA
+
+ /** @type {Array.<Element>} */
+ elements, // The elements which the rule fails on, if result == axs.constants.AuditResult.FAIL
+
+ /** @type {axs.AuditRule} */
+ rule // The rule which this result is for.
+ }
+
+### Command Line Runner
+
+The Accessibility Developer Tools project includes a command line runner for the audit. To use the runner, [install phantomjs](http://phantomjs.org/download.html) then run the following command from the project root directory.
+
+ $ phantomjs tools/runner/audit.js <url-or-filepath>
+
+The runner will load the specified file or URL in a headless browser, inject axs_testing.js, run the audit and output the report text.
+
+### Run audit from Selenium WebDriver (Scala):
+ val driver = org.openqa.selenium.firefox.FirefoxDriver //use driver of your choice
+ val jse = driver.asInstanceOf[JavascriptExecutor]
+ jse.executeScript(scala.io.Source.fromURL("https://raw.githubusercontent.com/GoogleChrome/" +
+ "accessibility-developer-tools/stable/dist/js/axs_testing.js").mkString)
+ val report = jse.executeScript("var results = axs.Audit.run();return axs.Audit.createReport(results);")
+ println(report)
+
+### Run audit from Selenium WebDriver (Scala)(with caching):
+ val cache = collection.mutable.Map[String, String]()
+ val driver = org.openqa.selenium.firefox.FirefoxDriver //use driver of your choice
+ val jse = driver.asInstanceOf[JavascriptExecutor]
+ def getUrlSource(arg: String): String = cache get arg match {
+ case Some(result) => result
+ case None =>
+ val result: String = scala.io.Source.fromURL(arg).mkString
+ cache(arg) = result
+ result
+ }
+ jse.executeScript(getUrlSource("https://raw.githubusercontent.com/GoogleChrome/" +
+ "accessibility-developer-tools/stable/dist/js/axs_testing.js"))
+ val report = js.executeScript("var results = axs.Audit.run();return axs.Audit.createReport(results);")
+ println(report)
+
+If println() outputs nothing, check if you need to set DesiredCapabilities for your WebDriver (such as loggingPrefs):
+https://code.google.com/p/selenium/wiki/DesiredCapabilities
+
+## Using the results
+
+### Interpreting the result
+
+The result may be one of three constants:
+* `axs.constants.AuditResult.PASS` - This implies that there were elements on the page that may potentially have failed this audit rule, but they passed. Congratulations!
+* `axs.constants.AuditResult.NA` - This implies that there were no elements on the page that may potentially have failed this audit rule. For example, an audit rule that checks video elements for subtitles would return this result if there were no video elements on the page.
+* `axs.constants.AuditResult.FAIL` - This implies that there were elements on the page that did not pass this audit rule. This is the only result you will probably be interested in.
+
+### Creating a useful error message
+
+The static, global `axs.Audit.createReport(results, opt_url)` may be used to create an error message using the return value of axs.Audit.run(). This will look like the following:
+
+ *** Begin accessibility audit results ***
+ An accessibility audit found 4 errors and 4 warnings on this page.
+ For more information, please see https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules
+
+ Error: badAriaAttributeValue (AX_ARIA_04) failed on the following elements (1 - 3 of 3):
+ DIV:nth-of-type(3) > INPUT
+ DIV:nth-of-type(5) > INPUT
+ #aria-invalid
+
+ Error: badAriaRole (AX_ARIA_01) failed on the following element:
+ DIV:nth-of-type(11) > SPAN
+
+ Error: controlsWithoutLabel (AX_TEXT_01) failed on the following elements (1 - 3 of 3):
+ DIV > INPUT
+ DIV:nth-of-type(12) > DIV:nth-of-type(3) > INPUT
+ LABEL > INPUT
+
+ Error: requiredAriaAttributeMissing (AX_ARIA_03) failed on the following element:
+ DIV:nth-of-type(13) > DIV:nth-of-type(11) > DIV
+
+ Warning: focusableElementNotVisibleAndNotAriaHidden (AX_FOCUS_01) failed on the following element:
+ #notariahidden
+
+ Warning: imagesWithoutAltText (AX_TEXT_02) failed on the following elements (1 - 2 of 2):
+ #deceptive-img
+ DIV:nth-of-type(13) > IMG
+
+ Warning: lowContrastElements (AX_COLOR_01) failed on the following elements (1 - 2 of 2):
+ DIV:nth-of-type(13) > DIV
+ DIV:nth-of-type(13) > DIV:nth-of-type(3)
+
+ Warning: nonExistentAriaLabelledbyElement (AX_ARIA_02) failed on the following elements (1 - 2 of 2):
+ DIV:nth-of-type(3) > INPUT
+ DIV:nth-of-type(5) > INPUT
+ *** End accessibility audit results ***
+
+Each rule will have at most five elements listed as failures, in the form of a unique query selector for each element.
+
+### Configuring the Audit
+
+If you wish to fine-tune the audit, you can create an `axs.AuditConfiguration` object, with the following options:
+
+#### Ignore parts of the page for a particular audit rule
+
+For example, say you have a separate high-contrast version of your page, and there is a CSS rule which causes certain elements (with class `pretty`) on the page to be low-contrast for stylistic reasons. Running the audit unmodified produces results something like
+
+ Warning: lowContrastElements (AX_COLOR_01) failed on the following elements (1 - 5 of 15):
+ ...
+
+You can modify the audit to ignore the elements which are known and intended to have low contrast like this:
+
+ var configuration = new axs.AuditConfiguration();
+ configuration.ignoreSelectors('lowContrastElements', '.pretty');
+ axs.Audit.run(configuration);
+
+The `AuditConfiguration.ignoreSelectors()` method takes a rule name, which you can find in the audit report, and a query selector string representing the parts of the page to be ignored for that audit rule. Multiple calls to `ignoreSelectors()` can be made for each audit rule, if multiple selectors need to be ignored.
+
+#### Restrict the scope of the entire audit to a subsection of the page
+
+You may have a part of the page which varies while other parts of the page stay constant, like a content area vs. a toolbar. In this case, running the audit on the entire page may give you spurious results in the part of the page which doesn't vary, which may drown out regressions in the main part of the page.
+
+You can set a `scope` on the `AuditConfiguration` object like this:
+
+ var configuration = new axs.AuditConfiguration();
+ configuration.scope = document.querySelector('main'); // or however you wish to choose your scope element
+ axs.Audit.run(configuration);
+
+You may also specify a configuration payload while instantiating the `axs.AuditConfiguration`,
+which allows you to provide multiple configuration options at once.
+
+ var configuration = new axs.AuditConfiguration({
+ auditRulesToRun: ['badAriaRole'],
+ scope: document.querySelector('main'),
+ maxResults: 5
+ });
+
+ axs.Audit.run(configuration);
+
+## License
+
+Copyright 2013 Google Inc. All Rights Reserved.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+[http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/bower.json
new file mode 100644
index 00000000000..ab38602120a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/bower.json
@@ -0,0 +1,31 @@
+{
+ "name": "accessibility-developer-tools",
+ "version": "2.11.0",
+ "homepage": "https://github.com/GoogleChrome/accessibility-developer-tools",
+ "authors": [
+ "Google"
+ ],
+ "description": "This is a library of accessibility-related testing and utility code.",
+ "main": "dist/js/axs_testing.js",
+ "moduleType": [
+ "amd",
+ "globals"
+ ],
+ "keywords": [
+ "accessibility",
+ "testing",
+ "WCAG",
+ "module"
+ ],
+ "license": "Apache-2.0",
+ "ignore": [
+ "**/.*",
+ "lib",
+ "scripts",
+ "src",
+ "test",
+ "tools",
+ "Gruntfile.js",
+ "package.json"
+ ]
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/dist/js/axs_testing.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/dist/js/axs_testing.js
new file mode 100644
index 00000000000..1f83c95a0d7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/dist/js/axs_testing.js
@@ -0,0 +1,2402 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Generated from http://github.com/GoogleChrome/accessibility-developer-tools/tree/9acd1c6e3e72a39a0ec14506d68203a4e8cfafb4
+ *
+ * See project README for build steps.
+ */
+
+// AUTO-GENERATED CONTENT BELOW: DO NOT EDIT! See above for details.
+
+var fn = (function() {
+ var COMPILED = !0, goog = goog || {};
+goog.global = this;
+goog.isDef = function(a) {
+ return void 0 !== a;
+};
+goog.exportPath_ = function(a, b, c) {
+ a = a.split(".");
+ c = c || goog.global;
+ a[0] in c || !c.execScript || c.execScript("var " + a[0]);
+ for (var d;a.length && (d = a.shift());) {
+ !a.length && goog.isDef(b) ? c[d] = b : c = c[d] ? c[d] : c[d] = {};
+ }
+};
+goog.define = function(a, b) {
+ var c = b;
+ COMPILED || (goog.global.CLOSURE_UNCOMPILED_DEFINES && Object.prototype.hasOwnProperty.call(goog.global.CLOSURE_UNCOMPILED_DEFINES, a) ? c = goog.global.CLOSURE_UNCOMPILED_DEFINES[a] : goog.global.CLOSURE_DEFINES && Object.prototype.hasOwnProperty.call(goog.global.CLOSURE_DEFINES, a) && (c = goog.global.CLOSURE_DEFINES[a]));
+ goog.exportPath_(a, c);
+};
+goog.DEBUG = !0;
+goog.LOCALE = "en";
+goog.TRUSTED_SITE = !0;
+goog.STRICT_MODE_COMPATIBLE = !1;
+goog.DISALLOW_TEST_ONLY_CODE = COMPILED && !goog.DEBUG;
+goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING = !1;
+goog.provide = function(a) {
+ if (goog.isInModuleLoader_()) {
+ throw Error("goog.provide can not be used within a goog.module.");
+ }
+ if (!COMPILED && goog.isProvided_(a)) {
+ throw Error('Namespace "' + a + '" already declared.');
+ }
+ goog.constructNamespace_(a);
+};
+goog.constructNamespace_ = function(a, b) {
+ if (!COMPILED) {
+ delete goog.implicitNamespaces_[a];
+ for (var c = a;(c = c.substring(0, c.lastIndexOf("."))) && !goog.getObjectByName(c);) {
+ goog.implicitNamespaces_[c] = !0;
+ }
+ }
+ goog.exportPath_(a, b);
+};
+goog.VALID_MODULE_RE_ = /^[a-zA-Z_$][a-zA-Z0-9._$]*$/;
+goog.module = function(a) {
+ if (!goog.isString(a) || !a || -1 == a.search(goog.VALID_MODULE_RE_)) {
+ throw Error("Invalid module identifier");
+ }
+ if (!goog.isInModuleLoader_()) {
+ throw Error("Module " + a + " has been loaded incorrectly. Note, modules cannot be loaded as normal scripts. They require some kind of pre-processing step. You're likely trying to load a module via a script tag or as a part of a concatenated bundle without rewriting the module. For more info see: https://github.com/google/closure-library/wiki/goog.module:-an-ES6-module-like-alternative-to-goog.provide.");
+ }
+ if (goog.moduleLoaderState_.moduleName) {
+ throw Error("goog.module may only be called once per module.");
+ }
+ goog.moduleLoaderState_.moduleName = a;
+ if (!COMPILED) {
+ if (goog.isProvided_(a)) {
+ throw Error('Namespace "' + a + '" already declared.');
+ }
+ delete goog.implicitNamespaces_[a];
+ }
+};
+goog.module.get = function(a) {
+ return goog.module.getInternal_(a);
+};
+goog.module.getInternal_ = function(a) {
+ if (!COMPILED) {
+ if (a in goog.loadedModules_) {
+ return goog.loadedModules_[a];
+ }
+ if (!goog.implicitNamespaces_[a]) {
+ return a = goog.getObjectByName(a), null != a ? a : null;
+ }
+ }
+ return null;
+};
+goog.moduleLoaderState_ = null;
+goog.isInModuleLoader_ = function() {
+ return null != goog.moduleLoaderState_;
+};
+goog.module.declareLegacyNamespace = function() {
+ if (!COMPILED && !goog.isInModuleLoader_()) {
+ throw Error("goog.module.declareLegacyNamespace must be called from within a goog.module");
+ }
+ if (!COMPILED && !goog.moduleLoaderState_.moduleName) {
+ throw Error("goog.module must be called prior to goog.module.declareLegacyNamespace.");
+ }
+ goog.moduleLoaderState_.declareLegacyNamespace = !0;
+};
+goog.setTestOnly = function(a) {
+ if (goog.DISALLOW_TEST_ONLY_CODE) {
+ throw a = a || "", Error("Importing test-only code into non-debug environment" + (a ? ": " + a : "."));
+ }
+};
+goog.forwardDeclare = function(a) {
+};
+COMPILED || (goog.isProvided_ = function(a) {
+ return a in goog.loadedModules_ || !goog.implicitNamespaces_[a] && goog.isDefAndNotNull(goog.getObjectByName(a));
+}, goog.implicitNamespaces_ = {"goog.module":!0});
+goog.getObjectByName = function(a, b) {
+ for (var c = a.split("."), d = b || goog.global, e;e = c.shift();) {
+ if (goog.isDefAndNotNull(d[e])) {
+ d = d[e];
+ } else {
+ return null;
+ }
+ }
+ return d;
+};
+goog.globalize = function(a, b) {
+ var c = b || goog.global, d;
+ for (d in a) {
+ c[d] = a[d];
+ }
+};
+goog.addDependency = function(a, b, c, d) {
+ if (goog.DEPENDENCIES_ENABLED) {
+ var e;
+ a = a.replace(/\\/g, "/");
+ var f = goog.dependencies_;
+ d && "boolean" !== typeof d || (d = d ? {module:"goog"} : {});
+ for (var g = 0;e = b[g];g++) {
+ f.nameToPath[e] = a, f.loadFlags[a] = d;
+ }
+ for (d = 0;b = c[d];d++) {
+ a in f.requires || (f.requires[a] = {}), f.requires[a][b] = !0;
+ }
+ }
+};
+goog.ENABLE_DEBUG_LOADER = !0;
+goog.logToConsole_ = function(a) {
+ goog.global.console && goog.global.console.error(a);
+};
+goog.require = function(a) {
+ if (!COMPILED) {
+ goog.ENABLE_DEBUG_LOADER && goog.IS_OLD_IE_ && goog.maybeProcessDeferredDep_(a);
+ if (goog.isProvided_(a)) {
+ if (goog.isInModuleLoader_()) {
+ return goog.module.getInternal_(a);
+ }
+ } else {
+ if (goog.ENABLE_DEBUG_LOADER) {
+ var b = goog.getPathFromDeps_(a);
+ if (b) {
+ goog.writeScripts_(b);
+ } else {
+ throw a = "goog.require could not find: " + a, goog.logToConsole_(a), Error(a);
+ }
+ }
+ }
+ return null;
+ }
+};
+goog.basePath = "";
+goog.nullFunction = function() {
+};
+goog.abstractMethod = function() {
+ throw Error("unimplemented abstract method");
+};
+goog.addSingletonGetter = function(a) {
+ a.getInstance = function() {
+ if (a.instance_) {
+ return a.instance_;
+ }
+ goog.DEBUG && (goog.instantiatedSingletons_[goog.instantiatedSingletons_.length] = a);
+ return a.instance_ = new a;
+ };
+};
+goog.instantiatedSingletons_ = [];
+goog.LOAD_MODULE_USING_EVAL = !0;
+goog.SEAL_MODULE_EXPORTS = goog.DEBUG;
+goog.loadedModules_ = {};
+goog.DEPENDENCIES_ENABLED = !COMPILED && goog.ENABLE_DEBUG_LOADER;
+goog.TRANSPILE = "detect";
+goog.TRANSPILER = "transpile.js";
+goog.DEPENDENCIES_ENABLED && (goog.dependencies_ = {loadFlags:{}, nameToPath:{}, requires:{}, visited:{}, written:{}, deferred:{}}, goog.inHtmlDocument_ = function() {
+ var a = goog.global.document;
+ return null != a && "write" in a;
+}, goog.findBasePath_ = function() {
+ if (goog.isDef(goog.global.CLOSURE_BASE_PATH)) {
+ goog.basePath = goog.global.CLOSURE_BASE_PATH;
+ } else {
+ if (goog.inHtmlDocument_()) {
+ for (var a = goog.global.document.getElementsByTagName("SCRIPT"), b = a.length - 1;0 <= b;--b) {
+ var c = a[b].src, d = c.lastIndexOf("?"), d = -1 == d ? c.length : d;
+ if ("base.js" == c.substr(d - 7, 7)) {
+ goog.basePath = c.substr(0, d - 7);
+ break;
+ }
+ }
+ }
+ }
+}, goog.importScript_ = function(a, b) {
+ (goog.global.CLOSURE_IMPORT_SCRIPT || goog.writeScriptTag_)(a, b) && (goog.dependencies_.written[a] = !0);
+}, goog.IS_OLD_IE_ = !(goog.global.atob || !goog.global.document || !goog.global.document.all), goog.importProcessedScript_ = function(a, b, c) {
+ goog.importScript_("", 'goog.retrieveAndExec_("' + a + '", ' + b + ", " + c + ");");
+}, goog.queuedModules_ = [], goog.wrapModule_ = function(a, b) {
+ return goog.LOAD_MODULE_USING_EVAL && goog.isDef(goog.global.JSON) ? "goog.loadModule(" + goog.global.JSON.stringify(b + "\n//# sourceURL=" + a + "\n") + ");" : 'goog.loadModule(function(exports) {"use strict";' + b + "\n;return exports});\n//# sourceURL=" + a + "\n";
+}, goog.loadQueuedModules_ = function() {
+ var a = goog.queuedModules_.length;
+ if (0 < a) {
+ var b = goog.queuedModules_;
+ goog.queuedModules_ = [];
+ for (var c = 0;c < a;c++) {
+ goog.maybeProcessDeferredPath_(b[c]);
+ }
+ }
+}, goog.maybeProcessDeferredDep_ = function(a) {
+ goog.isDeferredModule_(a) && goog.allDepsAreAvailable_(a) && (a = goog.getPathFromDeps_(a), goog.maybeProcessDeferredPath_(goog.basePath + a));
+}, goog.isDeferredModule_ = function(a) {
+ var b = (a = goog.getPathFromDeps_(a)) && goog.dependencies_.loadFlags[a] || {}, c = b.lang || "es3";
+ return a && ("goog" == b.module || goog.needsTranspile_(c)) ? goog.basePath + a in goog.dependencies_.deferred : !1;
+}, goog.allDepsAreAvailable_ = function(a) {
+ if ((a = goog.getPathFromDeps_(a)) && a in goog.dependencies_.requires) {
+ for (var b in goog.dependencies_.requires[a]) {
+ if (!goog.isProvided_(b) && !goog.isDeferredModule_(b)) {
+ return !1;
+ }
+ }
+ }
+ return !0;
+}, goog.maybeProcessDeferredPath_ = function(a) {
+ if (a in goog.dependencies_.deferred) {
+ var b = goog.dependencies_.deferred[a];
+ delete goog.dependencies_.deferred[a];
+ goog.globalEval(b);
+ }
+}, goog.loadModuleFromUrl = function(a) {
+ goog.retrieveAndExec_(a, !0, !1);
+}, goog.writeScriptSrcNode_ = function(a) {
+ goog.global.document.write('<script type="text/javascript" src="' + a + '">\x3c/script>');
+}, goog.appendScriptSrcNode_ = function(a) {
+ var b = goog.global.document, c = b.createElement("script");
+ c.type = "text/javascript";
+ c.src = a;
+ c.defer = !1;
+ c.async = !1;
+ b.head.appendChild(c);
+}, goog.writeScriptTag_ = function(a, b) {
+ if (goog.inHtmlDocument_()) {
+ var c = goog.global.document;
+ if (!goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING && "complete" == c.readyState) {
+ if (/\bdeps.js$/.test(a)) {
+ return !1;
+ }
+ throw Error('Cannot write "' + a + '" after document load');
+ }
+ if (void 0 === b) {
+ if (goog.IS_OLD_IE_) {
+ var d = " onreadystatechange='goog.onScriptLoad_(this, " + ++goog.lastNonModuleScriptIndex_ + ")' ";
+ c.write('<script type="text/javascript" src="' + a + '"' + d + ">\x3c/script>");
+ } else {
+ goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING ? goog.appendScriptSrcNode_(a) : goog.writeScriptSrcNode_(a);
+ }
+ } else {
+ c.write('<script type="text/javascript">' + goog.protectScriptTag_(b) + "\x3c/script>");
+ }
+ return !0;
+ }
+ return !1;
+}, goog.protectScriptTag_ = function(a) {
+ return a.replace(/<\/(SCRIPT)/ig, "\\x3c\\$1");
+}, goog.needsTranspile_ = function(a) {
+ if ("always" == goog.TRANSPILE) {
+ return !0;
+ }
+ if ("never" == goog.TRANSPILE) {
+ return !1;
+ }
+ goog.requiresTranspilation_ || (goog.requiresTranspilation_ = goog.createRequiresTranspilation_());
+ if (a in goog.requiresTranspilation_) {
+ return goog.requiresTranspilation_[a];
+ }
+ throw Error("Unknown language mode: " + a);
+}, goog.requiresTranspilation_ = null, goog.lastNonModuleScriptIndex_ = 0, goog.onScriptLoad_ = function(a, b) {
+ "complete" == a.readyState && goog.lastNonModuleScriptIndex_ == b && goog.loadQueuedModules_();
+ return !0;
+}, goog.writeScripts_ = function(a) {
+ function b(a) {
+ if (!(a in e.written || a in e.visited)) {
+ e.visited[a] = !0;
+ if (a in e.requires) {
+ for (var f in e.requires[a]) {
+ if (!goog.isProvided_(f)) {
+ if (f in e.nameToPath) {
+ b(e.nameToPath[f]);
+ } else {
+ throw Error("Undefined nameToPath for " + f);
+ }
+ }
+ }
+ }
+ a in d || (d[a] = !0, c.push(a));
+ }
+ }
+ var c = [], d = {}, e = goog.dependencies_;
+ b(a);
+ for (a = 0;a < c.length;a++) {
+ var f = c[a];
+ goog.dependencies_.written[f] = !0;
+ }
+ var g = goog.moduleLoaderState_;
+ goog.moduleLoaderState_ = null;
+ for (a = 0;a < c.length;a++) {
+ if (f = c[a]) {
+ var h = e.loadFlags[f] || {}, k = goog.needsTranspile_(h.lang || "es3");
+ "goog" == h.module || k ? goog.importProcessedScript_(goog.basePath + f, "goog" == h.module, k) : goog.importScript_(goog.basePath + f);
+ } else {
+ throw goog.moduleLoaderState_ = g, Error("Undefined script input");
+ }
+ }
+ goog.moduleLoaderState_ = g;
+}, goog.getPathFromDeps_ = function(a) {
+ return a in goog.dependencies_.nameToPath ? goog.dependencies_.nameToPath[a] : null;
+}, goog.findBasePath_(), goog.global.CLOSURE_NO_DEPS || goog.importScript_(goog.basePath + "deps.js"));
+goog.loadModule = function(a) {
+ var b = goog.moduleLoaderState_;
+ try {
+ goog.moduleLoaderState_ = {moduleName:void 0, declareLegacyNamespace:!1};
+ var c;
+ if (goog.isFunction(a)) {
+ c = a.call(void 0, {});
+ } else {
+ if (goog.isString(a)) {
+ c = goog.loadModuleFromSource_.call(void 0, a);
+ } else {
+ throw Error("Invalid module definition");
+ }
+ }
+ var d = goog.moduleLoaderState_.moduleName;
+ if (!goog.isString(d) || !d) {
+ throw Error('Invalid module name "' + d + '"');
+ }
+ goog.moduleLoaderState_.declareLegacyNamespace ? goog.constructNamespace_(d, c) : goog.SEAL_MODULE_EXPORTS && Object.seal && goog.isObject(c) && Object.seal(c);
+ goog.loadedModules_[d] = c;
+ } finally {
+ goog.moduleLoaderState_ = b;
+ }
+};
+goog.loadModuleFromSource_ = function(a) {
+ eval(a);
+ return {};
+};
+goog.normalizePath_ = function(a) {
+ a = a.split("/");
+ for (var b = 0;b < a.length;) {
+ "." == a[b] ? a.splice(b, 1) : b && ".." == a[b] && a[b - 1] && ".." != a[b - 1] ? a.splice(--b, 2) : b++;
+ }
+ return a.join("/");
+};
+goog.loadFileSync_ = function(a) {
+ if (goog.global.CLOSURE_LOAD_FILE_SYNC) {
+ return goog.global.CLOSURE_LOAD_FILE_SYNC(a);
+ }
+ try {
+ var b = new goog.global.XMLHttpRequest;
+ b.open("get", a, !1);
+ b.send();
+ return 0 == b.status || 200 == b.status ? b.responseText : null;
+ } catch (c) {
+ return null;
+ }
+};
+goog.retrieveAndExec_ = function(a, b, c) {
+ if (!COMPILED) {
+ var d = a;
+ a = goog.normalizePath_(a);
+ var e = goog.global.CLOSURE_IMPORT_SCRIPT || goog.writeScriptTag_, f = goog.loadFileSync_(a);
+ if (null == f) {
+ throw Error('Load of "' + a + '" failed');
+ }
+ c && (f = goog.transpile_.call(goog.global, f, a));
+ f = b ? goog.wrapModule_(a, f) : f + ("\n//# sourceURL=" + a);
+ goog.IS_OLD_IE_ ? (goog.dependencies_.deferred[d] = f, goog.queuedModules_.push(d)) : e(a, f);
+ }
+};
+goog.transpile_ = function(a, b) {
+ var c = goog.global.$jscomp;
+ c || (goog.global.$jscomp = c = {});
+ var d = c.transpile;
+ if (!d) {
+ var e = goog.basePath + goog.TRANSPILER, f = goog.loadFileSync_(e);
+ if (f) {
+ eval(f + "\n//# sourceURL=" + e);
+ if (goog.global.$gwtExport && goog.global.$gwtExport.$jscomp && !goog.global.$gwtExport.$jscomp.transpile) {
+ throw Error('The transpiler did not properly export the "transpile" method. $gwtExport: ' + JSON.stringify(goog.global.$gwtExport));
+ }
+ goog.global.$jscomp.transpile = goog.global.$gwtExport.$jscomp.transpile;
+ c = goog.global.$jscomp;
+ d = c.transpile;
+ }
+ }
+ d || (d = c.transpile = function(a, b) {
+ goog.logToConsole_(b + " requires transpilation but no transpiler was found.");
+ return a;
+ });
+ return d(a, b);
+};
+goog.typeOf = function(a) {
+ var b = typeof a;
+ if ("object" == b) {
+ if (a) {
+ if (a instanceof Array) {
+ return "array";
+ }
+ if (a instanceof Object) {
+ return b;
+ }
+ var c = Object.prototype.toString.call(a);
+ if ("[object Window]" == c) {
+ return "object";
+ }
+ if ("[object Array]" == c || "number" == typeof a.length && "undefined" != typeof a.splice && "undefined" != typeof a.propertyIsEnumerable && !a.propertyIsEnumerable("splice")) {
+ return "array";
+ }
+ if ("[object Function]" == c || "undefined" != typeof a.call && "undefined" != typeof a.propertyIsEnumerable && !a.propertyIsEnumerable("call")) {
+ return "function";
+ }
+ } else {
+ return "null";
+ }
+ } else {
+ if ("function" == b && "undefined" == typeof a.call) {
+ return "object";
+ }
+ }
+ return b;
+};
+goog.isNull = function(a) {
+ return null === a;
+};
+goog.isDefAndNotNull = function(a) {
+ return null != a;
+};
+goog.isArray = function(a) {
+ return "array" == goog.typeOf(a);
+};
+goog.isArrayLike = function(a) {
+ var b = goog.typeOf(a);
+ return "array" == b || "object" == b && "number" == typeof a.length;
+};
+goog.isDateLike = function(a) {
+ return goog.isObject(a) && "function" == typeof a.getFullYear;
+};
+goog.isString = function(a) {
+ return "string" == typeof a;
+};
+goog.isBoolean = function(a) {
+ return "boolean" == typeof a;
+};
+goog.isNumber = function(a) {
+ return "number" == typeof a;
+};
+goog.isFunction = function(a) {
+ return "function" == goog.typeOf(a);
+};
+goog.isObject = function(a) {
+ var b = typeof a;
+ return "object" == b && null != a || "function" == b;
+};
+goog.getUid = function(a) {
+ return a[goog.UID_PROPERTY_] || (a[goog.UID_PROPERTY_] = ++goog.uidCounter_);
+};
+goog.hasUid = function(a) {
+ return !!a[goog.UID_PROPERTY_];
+};
+goog.removeUid = function(a) {
+ null !== a && "removeAttribute" in a && a.removeAttribute(goog.UID_PROPERTY_);
+ try {
+ delete a[goog.UID_PROPERTY_];
+ } catch (b) {
+ }
+};
+goog.UID_PROPERTY_ = "closure_uid_" + (1E9 * Math.random() >>> 0);
+goog.uidCounter_ = 0;
+goog.getHashCode = goog.getUid;
+goog.removeHashCode = goog.removeUid;
+goog.cloneObject = function(a) {
+ var b = goog.typeOf(a);
+ if ("object" == b || "array" == b) {
+ if (a.clone) {
+ return a.clone();
+ }
+ var b = "array" == b ? [] : {}, c;
+ for (c in a) {
+ b[c] = goog.cloneObject(a[c]);
+ }
+ return b;
+ }
+ return a;
+};
+goog.bindNative_ = function(a, b, c) {
+ return a.call.apply(a.bind, arguments);
+};
+goog.bindJs_ = function(a, b, c) {
+ if (!a) {
+ throw Error();
+ }
+ if (2 < arguments.length) {
+ var d = Array.prototype.slice.call(arguments, 2);
+ return function() {
+ var c = Array.prototype.slice.call(arguments);
+ Array.prototype.unshift.apply(c, d);
+ return a.apply(b, c);
+ };
+ }
+ return function() {
+ return a.apply(b, arguments);
+ };
+};
+goog.bind = function(a, b, c) {
+ Function.prototype.bind && -1 != Function.prototype.bind.toString().indexOf("native code") ? goog.bind = goog.bindNative_ : goog.bind = goog.bindJs_;
+ return goog.bind.apply(null, arguments);
+};
+goog.partial = function(a, b) {
+ var c = Array.prototype.slice.call(arguments, 1);
+ return function() {
+ var b = c.slice();
+ b.push.apply(b, arguments);
+ return a.apply(this, b);
+ };
+};
+goog.mixin = function(a, b) {
+ for (var c in b) {
+ a[c] = b[c];
+ }
+};
+goog.now = goog.TRUSTED_SITE && Date.now || function() {
+ return +new Date;
+};
+goog.globalEval = function(a) {
+ if (goog.global.execScript) {
+ goog.global.execScript(a, "JavaScript");
+ } else {
+ if (goog.global.eval) {
+ if (null == goog.evalWorksForGlobals_) {
+ if (goog.global.eval("var _evalTest_ = 1;"), "undefined" != typeof goog.global._evalTest_) {
+ try {
+ delete goog.global._evalTest_;
+ } catch (d) {
+ }
+ goog.evalWorksForGlobals_ = !0;
+ } else {
+ goog.evalWorksForGlobals_ = !1;
+ }
+ }
+ if (goog.evalWorksForGlobals_) {
+ goog.global.eval(a);
+ } else {
+ var b = goog.global.document, c = b.createElement("SCRIPT");
+ c.type = "text/javascript";
+ c.defer = !1;
+ c.appendChild(b.createTextNode(a));
+ b.body.appendChild(c);
+ b.body.removeChild(c);
+ }
+ } else {
+ throw Error("goog.globalEval not available");
+ }
+ }
+};
+goog.evalWorksForGlobals_ = null;
+goog.getCssName = function(a, b) {
+ if ("." == String(a).charAt(0)) {
+ throw Error('className passed in goog.getCssName must not start with ".". You passed: ' + a);
+ }
+ var c = function(a) {
+ return goog.cssNameMapping_[a] || a;
+ }, d = function(a) {
+ a = a.split("-");
+ for (var b = [], d = 0;d < a.length;d++) {
+ b.push(c(a[d]));
+ }
+ return b.join("-");
+ }, d = goog.cssNameMapping_ ? "BY_WHOLE" == goog.cssNameMappingStyle_ ? c : d : function(a) {
+ return a;
+ }, d = b ? a + "-" + d(b) : d(a);
+ return goog.global.CLOSURE_CSS_NAME_MAP_FN ? goog.global.CLOSURE_CSS_NAME_MAP_FN(d) : d;
+};
+goog.setCssNameMapping = function(a, b) {
+ goog.cssNameMapping_ = a;
+ goog.cssNameMappingStyle_ = b;
+};
+!COMPILED && goog.global.CLOSURE_CSS_NAME_MAPPING && (goog.cssNameMapping_ = goog.global.CLOSURE_CSS_NAME_MAPPING);
+goog.getMsg = function(a, b) {
+ b && (a = a.replace(/\{\$([^}]+)}/g, function(a, d) {
+ return null != b && d in b ? b[d] : a;
+ }));
+ return a;
+};
+goog.getMsgWithFallback = function(a, b) {
+ return a;
+};
+goog.exportSymbol = function(a, b, c) {
+ goog.exportPath_(a, b, c);
+};
+goog.exportProperty = function(a, b, c) {
+ a[b] = c;
+};
+goog.inherits = function(a, b) {
+ function c() {
+ }
+ c.prototype = b.prototype;
+ a.superClass_ = b.prototype;
+ a.prototype = new c;
+ a.prototype.constructor = a;
+ a.base = function(a, c, f) {
+ for (var d = Array(arguments.length - 2), e = 2;e < arguments.length;e++) {
+ d[e - 2] = arguments[e];
+ }
+ return b.prototype[c].apply(a, d);
+ };
+};
+goog.base = function(a, b, c) {
+ var d = arguments.callee.caller;
+ if (goog.STRICT_MODE_COMPATIBLE || goog.DEBUG && !d) {
+ throw Error("arguments.caller not defined. goog.base() cannot be used with strict mode code. See http://www.ecma-international.org/ecma-262/5.1/#sec-C");
+ }
+ if (d.superClass_) {
+ for (var e = Array(arguments.length - 1), f = 1;f < arguments.length;f++) {
+ e[f - 1] = arguments[f];
+ }
+ return d.superClass_.constructor.apply(a, e);
+ }
+ e = Array(arguments.length - 2);
+ for (f = 2;f < arguments.length;f++) {
+ e[f - 2] = arguments[f];
+ }
+ for (var f = !1, g = a.constructor;g;g = g.superClass_ && g.superClass_.constructor) {
+ if (g.prototype[b] === d) {
+ f = !0;
+ } else {
+ if (f) {
+ return g.prototype[b].apply(a, e);
+ }
+ }
+ }
+ if (a[b] === d) {
+ return a.constructor.prototype[b].apply(a, e);
+ }
+ throw Error("goog.base called from a method of one name to a method of a different name");
+};
+goog.scope = function(a) {
+ if (goog.isInModuleLoader_()) {
+ throw Error("goog.scope is not supported within a goog.module.");
+ }
+ a.call(goog.global);
+};
+COMPILED || (goog.global.COMPILED = COMPILED);
+goog.defineClass = function(a, b) {
+ var c = b.constructor, d = b.statics;
+ c && c != Object.prototype.constructor || (c = function() {
+ throw Error("cannot instantiate an interface (no constructor defined).");
+ });
+ c = goog.defineClass.createSealingConstructor_(c, a);
+ a && goog.inherits(c, a);
+ delete b.constructor;
+ delete b.statics;
+ goog.defineClass.applyProperties_(c.prototype, b);
+ null != d && (d instanceof Function ? d(c) : goog.defineClass.applyProperties_(c, d));
+ return c;
+};
+goog.defineClass.SEAL_CLASS_INSTANCES = goog.DEBUG;
+goog.defineClass.createSealingConstructor_ = function(a, b) {
+ if (!goog.defineClass.SEAL_CLASS_INSTANCES) {
+ return a;
+ }
+ var c = !goog.defineClass.isUnsealable_(b), d = function() {
+ var b = a.apply(this, arguments) || this;
+ b[goog.UID_PROPERTY_] = b[goog.UID_PROPERTY_];
+ this.constructor === d && c && Object.seal instanceof Function && Object.seal(b);
+ return b;
+ };
+ return d;
+};
+goog.defineClass.isUnsealable_ = function(a) {
+ return a && a.prototype && a.prototype[goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_];
+};
+goog.defineClass.OBJECT_PROTOTYPE_FIELDS_ = "constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" ");
+goog.defineClass.applyProperties_ = function(a, b) {
+ for (var c in b) {
+ Object.prototype.hasOwnProperty.call(b, c) && (a[c] = b[c]);
+ }
+ for (var d = 0;d < goog.defineClass.OBJECT_PROTOTYPE_FIELDS_.length;d++) {
+ c = goog.defineClass.OBJECT_PROTOTYPE_FIELDS_[d], Object.prototype.hasOwnProperty.call(b, c) && (a[c] = b[c]);
+ }
+};
+goog.tagUnsealableClass = function(a) {
+ !COMPILED && goog.defineClass.SEAL_CLASS_INSTANCES && (a.prototype[goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_] = !0);
+};
+goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_ = "goog_defineClass_legacy_unsealable";
+goog.createRequiresTranspilation_ = function() {
+ function a(a, b) {
+ d ? c[a] = !0 : b() ? c[a] = !1 : d = c[a] = !0;
+ }
+ function b(a) {
+ try {
+ return !!eval(a);
+ } catch (f) {
+ return !1;
+ }
+ }
+ var c = {es3:!1}, d = !1;
+ a("es5", function() {
+ return b("[1,].length==1");
+ });
+ a("es6", function() {
+ return b('(()=>{"use strict";class X{constructor(){if(new.target!=String)throw 1;this.x=42}}let q=Reflect.construct(X,[],String);if(q.x!=42||!(q instanceof String))throw 1;for(const a of[2,3]){if(a==2)continue;function f(z={a}){let a=0;return z.a}{function f(){return 0;}}return f()==3}})()');
+ });
+ a("es6-impl", function() {
+ return !0;
+ });
+ a("es7", function() {
+ return b("2 ** 2 == 4");
+ });
+ a("es8", function() {
+ return b("async () => 1, true");
+ });
+ return c;
+};
+var axs = {};
+axs.browserUtils = {};
+axs.browserUtils.matchSelector = function(a, b) {
+ return a.matches ? a.matches(b) : a.webkitMatchesSelector ? a.webkitMatchesSelector(b) : a.mozMatchesSelector ? a.mozMatchesSelector(b) : a.msMatchesSelector ? a.msMatchesSelector(b) : !1;
+};
+axs.color = {};
+axs.color.Color = function(a, b, c, d) {
+ this.red = a;
+ this.green = b;
+ this.blue = c;
+ this.alpha = d;
+};
+axs.color.YCbCr = function(a) {
+ this.luma = this.z = a[0];
+ this.Cb = this.x = a[1];
+ this.Cr = this.y = a[2];
+};
+axs.color.YCbCr.prototype = {multiply:function(a) {
+ return new axs.color.YCbCr([this.luma * a, this.Cb * a, this.Cr * a]);
+}, add:function(a) {
+ return new axs.color.YCbCr([this.luma + a.luma, this.Cb + a.Cb, this.Cr + a.Cr]);
+}, subtract:function(a) {
+ return new axs.color.YCbCr([this.luma - a.luma, this.Cb - a.Cb, this.Cr - a.Cr]);
+}};
+axs.color.calculateContrastRatio = function(a, b) {
+ 1 > a.alpha && (a = axs.color.flattenColors(a, b));
+ var c = axs.color.calculateLuminance(a), d = axs.color.calculateLuminance(b);
+ return (Math.max(c, d) + .05) / (Math.min(c, d) + .05);
+};
+axs.color.calculateLuminance = function(a) {
+ return axs.color.toYCbCr(a).luma;
+};
+axs.color.luminanceRatio = function(a, b) {
+ return (Math.max(a, b) + .05) / (Math.min(a, b) + .05);
+};
+axs.color.parseColor = function(a) {
+ if ("transparent" === a) {
+ return new axs.color.Color(0, 0, 0, 0);
+ }
+ var b = a.match(/^rgb\((\d+), (\d+), (\d+)\)$/);
+ if (b) {
+ a = parseInt(b[1], 10);
+ var c = parseInt(b[2], 10), d = parseInt(b[3], 10);
+ return new axs.color.Color(a, c, d, 1);
+ }
+ return (b = a.match(/^rgba\((\d+), (\d+), (\d+), (\d*(\.\d+)?)\)/)) ? (a = parseInt(b[1], 10), c = parseInt(b[2], 10), d = parseInt(b[3], 10), b = parseFloat(b[4]), new axs.color.Color(a, c, d, b)) : null;
+};
+axs.color.colorChannelToString = function(a) {
+ a = Math.round(a);
+ return 15 >= a ? "0" + a.toString(16) : a.toString(16);
+};
+axs.color.colorToString = function(a) {
+ return 1 == a.alpha ? "#" + axs.color.colorChannelToString(a.red) + axs.color.colorChannelToString(a.green) + axs.color.colorChannelToString(a.blue) : "rgba(" + [a.red, a.green, a.blue, a.alpha].join() + ")";
+};
+axs.color.luminanceFromContrastRatio = function(a, b, c) {
+ return c ? (a + .05) * b - .05 : (a + .05) / b - .05;
+};
+axs.color.translateColor = function(a, b) {
+ for (var c = b > a.luma ? axs.color.WHITE_YCC : axs.color.BLACK_YCC, d = c == axs.color.WHITE_YCC ? axs.color.YCC_CUBE_FACES_WHITE : axs.color.YCC_CUBE_FACES_BLACK, e = new axs.color.YCbCr([0, a.Cb, a.Cr]), f = new axs.color.YCbCr([1, a.Cb, a.Cr]), f = {a:e, b:f}, e = null, g = 0;g < d.length && !(e = axs.color.findIntersection(f, d[g]), 0 <= e.z && 1 >= e.z);g++) {
+ }
+ if (!e) {
+ throw "Couldn't find intersection with YCbCr color cube for Cb=" + a.Cb + ", Cr=" + a.Cr + ".";
+ }
+ if (e.x != a.x || e.y != a.y) {
+ throw "Intersection has wrong Cb/Cr values.";
+ }
+ if (Math.abs(c.luma - e.luma) < Math.abs(c.luma - b)) {
+ return c = [b, a.Cb, a.Cr], axs.color.fromYCbCrArray(c);
+ }
+ c = (b - e.luma) / (c.luma - e.luma);
+ c = [b, e.Cb - e.Cb * c, e.Cr - e.Cr * c];
+ return axs.color.fromYCbCrArray(c);
+};
+axs.color.suggestColors = function(a, b, c) {
+ var d = {}, e = axs.color.calculateLuminance(a), f = axs.color.calculateLuminance(b), g = f > e, h = axs.color.toYCbCr(b), k = axs.color.toYCbCr(a), m;
+ for (m in c) {
+ var l = c[m], n = axs.color.luminanceFromContrastRatio(e, l + .02, g);
+ if (1 >= n && 0 <= n) {
+ var p = axs.color.translateColor(h, n), l = axs.color.calculateContrastRatio(p, a), n = {};
+ n.fg = axs.color.colorToString(p);
+ n.bg = axs.color.colorToString(a);
+ n.contrast = l.toFixed(2);
+ d[m] = n;
+ } else {
+ l = axs.color.luminanceFromContrastRatio(f, l + .02, !g), 1 >= l && 0 <= l && (p = axs.color.translateColor(k, l), l = axs.color.calculateContrastRatio(b, p), n = {}, n.bg = axs.color.colorToString(p), n.fg = axs.color.colorToString(b), n.contrast = l.toFixed(2), d[m] = n);
+ }
+ }
+ return d;
+};
+axs.color.flattenColors = function(a, b) {
+ var c = a.alpha;
+ return new axs.color.Color((1 - c) * b.red + c * a.red, (1 - c) * b.green + c * a.green, (1 - c) * b.blue + c * a.blue, a.alpha + b.alpha * (1 - a.alpha));
+};
+axs.color.multiplyMatrixVector = function(a, b) {
+ var c = b[0], d = b[1], e = b[2];
+ return [a[0][0] * c + a[0][1] * d + a[0][2] * e, a[1][0] * c + a[1][1] * d + a[1][2] * e, a[2][0] * c + a[2][1] * d + a[2][2] * e];
+};
+axs.color.toYCbCr = function(a) {
+ var b = a.red / 255, c = a.green / 255;
+ a = a.blue / 255;
+ return new axs.color.YCbCr(axs.color.multiplyMatrixVector(axs.color.YCC_MATRIX, [.03928 >= b ? b / 12.92 : Math.pow((b + .055) / 1.055, 2.4), .03928 >= c ? c / 12.92 : Math.pow((c + .055) / 1.055, 2.4), .03928 >= a ? a / 12.92 : Math.pow((a + .055) / 1.055, 2.4)]));
+};
+axs.color.fromYCbCr = function(a) {
+ return axs.color.fromYCbCrArray([a.luma, a.Cb, a.Cr]);
+};
+axs.color.fromYCbCrArray = function(a) {
+ var b = axs.color.multiplyMatrixVector(axs.color.INVERTED_YCC_MATRIX, a);
+ a = b[0];
+ var c = b[1], b = b[2];
+ return new axs.color.Color(Math.min(Math.max(Math.round(255 * (.00303949 >= a ? 12.92 * a : 1.055 * Math.pow(a, 1 / 2.4) - .055)), 0), 255), Math.min(Math.max(Math.round(255 * (.00303949 >= c ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - .055)), 0), 255), Math.min(Math.max(Math.round(255 * (.00303949 >= b ? 12.92 * b : 1.055 * Math.pow(b, 1 / 2.4) - .055)), 0), 255), 1);
+};
+axs.color.RGBToYCbCrMatrix = function(a, b) {
+ return [[a, 1 - a - b, b], [-a / (2 - 2 * b), (a + b - 1) / (2 - 2 * b), (1 - b) / (2 - 2 * b)], [(1 - a) / (2 - 2 * a), (a + b - 1) / (2 - 2 * a), -b / (2 - 2 * a)]];
+};
+axs.color.invert3x3Matrix = function(a) {
+ var b = a[0][0], c = a[0][1], d = a[0][2], e = a[1][0], f = a[1][1], g = a[1][2], h = a[2][0], k = a[2][1];
+ a = a[2][2];
+ return axs.color.scalarMultiplyMatrix([[f * a - g * k, d * k - c * a, c * g - d * f], [g * h - e * a, b * a - d * h, d * e - b * g], [e * k - f * h, h * c - b * k, b * f - c * e]], 1 / (b * (f * a - g * k) - c * (a * e - g * h) + d * (e * k - f * h)));
+};
+axs.color.findIntersection = function(a, b) {
+ var c = [a.a.x - b.p0.x, a.a.y - b.p0.y, a.a.z - b.p0.z], d = axs.color.invert3x3Matrix([[a.a.x - a.b.x, b.p1.x - b.p0.x, b.p2.x - b.p0.x], [a.a.y - a.b.y, b.p1.y - b.p0.y, b.p2.y - b.p0.y], [a.a.z - a.b.z, b.p1.z - b.p0.z, b.p2.z - b.p0.z]]), c = axs.color.multiplyMatrixVector(d, c)[0];
+ return a.a.add(a.b.subtract(a.a).multiply(c));
+};
+axs.color.scalarMultiplyMatrix = function(a, b) {
+ for (var c = [], d = 0;3 > d;d++) {
+ c[d] = axs.color.scalarMultiplyVector(a[d], b);
+ }
+ return c;
+};
+axs.color.scalarMultiplyVector = function(a, b) {
+ for (var c = [], d = 0;d < a.length;d++) {
+ c[d] = a[d] * b;
+ }
+ return c;
+};
+axs.color.kR = .2126;
+axs.color.kB = .0722;
+axs.color.YCC_MATRIX = axs.color.RGBToYCbCrMatrix(axs.color.kR, axs.color.kB);
+axs.color.INVERTED_YCC_MATRIX = axs.color.invert3x3Matrix(axs.color.YCC_MATRIX);
+axs.color.BLACK = new axs.color.Color(0, 0, 0, 1);
+axs.color.BLACK_YCC = axs.color.toYCbCr(axs.color.BLACK);
+axs.color.WHITE = new axs.color.Color(255, 255, 255, 1);
+axs.color.WHITE_YCC = axs.color.toYCbCr(axs.color.WHITE);
+axs.color.RED = new axs.color.Color(255, 0, 0, 1);
+axs.color.RED_YCC = axs.color.toYCbCr(axs.color.RED);
+axs.color.GREEN = new axs.color.Color(0, 255, 0, 1);
+axs.color.GREEN_YCC = axs.color.toYCbCr(axs.color.GREEN);
+axs.color.BLUE = new axs.color.Color(0, 0, 255, 1);
+axs.color.BLUE_YCC = axs.color.toYCbCr(axs.color.BLUE);
+axs.color.CYAN = new axs.color.Color(0, 255, 255, 1);
+axs.color.CYAN_YCC = axs.color.toYCbCr(axs.color.CYAN);
+axs.color.MAGENTA = new axs.color.Color(255, 0, 255, 1);
+axs.color.MAGENTA_YCC = axs.color.toYCbCr(axs.color.MAGENTA);
+axs.color.YELLOW = new axs.color.Color(255, 255, 0, 1);
+axs.color.YELLOW_YCC = axs.color.toYCbCr(axs.color.YELLOW);
+axs.color.YCC_CUBE_FACES_BLACK = [{p0:axs.color.BLACK_YCC, p1:axs.color.RED_YCC, p2:axs.color.GREEN_YCC}, {p0:axs.color.BLACK_YCC, p1:axs.color.GREEN_YCC, p2:axs.color.BLUE_YCC}, {p0:axs.color.BLACK_YCC, p1:axs.color.BLUE_YCC, p2:axs.color.RED_YCC}];
+axs.color.YCC_CUBE_FACES_WHITE = [{p0:axs.color.WHITE_YCC, p1:axs.color.CYAN_YCC, p2:axs.color.MAGENTA_YCC}, {p0:axs.color.WHITE_YCC, p1:axs.color.MAGENTA_YCC, p2:axs.color.YELLOW_YCC}, {p0:axs.color.WHITE_YCC, p1:axs.color.YELLOW_YCC, p2:axs.color.CYAN_YCC}];
+axs.constants = {};
+axs.constants.ARIA_ROLES = {alert:{namefrom:["author"], parent:["region"]}, alertdialog:{namefrom:["author"], namerequired:!0, parent:["alert", "dialog"]}, application:{namefrom:["author"], namerequired:!0, parent:["landmark"]}, article:{namefrom:["author"], parent:["document", "region"]}, banner:{namefrom:["author"], parent:["landmark"]}, button:{childpresentational:!0, namefrom:["contents", "author"], namerequired:!0, parent:["command"], properties:["aria-expanded", "aria-pressed"]}, checkbox:{namefrom:["contents",
+"author"], namerequired:!0, parent:["input"], requiredProperties:["aria-checked"], properties:["aria-checked"]}, columnheader:{namefrom:["contents", "author"], namerequired:!0, parent:["gridcell", "sectionhead", "widget"], properties:["aria-sort"], scope:["row"]}, combobox:{mustcontain:["listbox", "textbox"], namefrom:["author"], namerequired:!0, parent:["select"], requiredProperties:["aria-expanded"], properties:["aria-expanded", "aria-autocomplete", "aria-required"]}, command:{"abstract":!0, namefrom:["author"],
+parent:["widget"]}, complementary:{namefrom:["author"], parent:["landmark"]}, composite:{"abstract":!0, childpresentational:!1, namefrom:["author"], parent:["widget"], properties:["aria-activedescendant"]}, contentinfo:{namefrom:["author"], parent:["landmark"]}, definition:{namefrom:["author"], parent:["section"]}, dialog:{namefrom:["author"], namerequired:!0, parent:["window"]}, directory:{namefrom:["contents", "author"], parent:["list"]}, document:{namefrom:[" author"], namerequired:!0, parent:["structure"],
+properties:["aria-expanded"]}, form:{namefrom:["author"], parent:["landmark"]}, grid:{mustcontain:["row", "rowgroup"], namefrom:["author"], namerequired:!0, parent:["composite", "region"], properties:["aria-level", "aria-multiselectable", "aria-readonly"]}, gridcell:{namefrom:["contents", "author"], namerequired:!0, parent:["section", "widget"], properties:["aria-readonly", "aria-required", "aria-selected"], scope:["row"]}, group:{namefrom:[" author"], parent:["section"], properties:["aria-activedescendant"]},
+heading:{namerequired:!0, parent:["sectionhead"], properties:["aria-level"]}, img:{childpresentational:!0, namefrom:["author"], namerequired:!0, parent:["section"]}, input:{"abstract":!0, namefrom:["author"], parent:["widget"]}, landmark:{"abstract":!0, namefrom:["contents", "author"], namerequired:!1, parent:["region"]}, link:{namefrom:["contents", "author"], namerequired:!0, parent:["command"], properties:["aria-expanded"]}, list:{mustcontain:["group", "listitem"], namefrom:["author"], parent:["region"]},
+listbox:{mustcontain:["option"], namefrom:["author"], namerequired:!0, parent:["list", "select"], properties:["aria-multiselectable", "aria-required"]}, listitem:{namefrom:["contents", "author"], namerequired:!0, parent:["section"], properties:["aria-level", "aria-posinset", "aria-setsize"], scope:["list"]}, log:{namefrom:[" author"], namerequired:!0, parent:["region"]}, main:{namefrom:["author"], parent:["landmark"]}, marquee:{namerequired:!0, parent:["section"]}, math:{childpresentational:!0, namefrom:["author"],
+parent:["section"]}, menu:{mustcontain:["group", "menuitemradio", "menuitem", "menuitemcheckbox"], namefrom:["author"], namerequired:!0, parent:["list", "select"]}, menubar:{namefrom:["author"], parent:["menu"]}, menuitem:{namefrom:["contents", "author"], namerequired:!0, parent:["command"], scope:["menu", "menubar"]}, menuitemcheckbox:{namefrom:["contents", "author"], namerequired:!0, parent:["checkbox", "menuitem"], scope:["menu", "menubar"]}, menuitemradio:{namefrom:["contents", "author"], namerequired:!0,
+parent:["menuitemcheckbox", "radio"], scope:["menu", "menubar"]}, navigation:{namefrom:["author"], parent:["landmark"]}, note:{namefrom:["author"], parent:["section"]}, option:{namefrom:["contents", "author"], namerequired:!0, parent:["input"], properties:["aria-checked", "aria-posinset", "aria-selected", "aria-setsize"]}, presentation:{parent:["structure"]}, progressbar:{childpresentational:!0, namefrom:["author"], namerequired:!0, parent:["range"]}, radio:{namefrom:["contents", "author"], namerequired:!0,
+parent:["checkbox", "option"]}, radiogroup:{mustcontain:["radio"], namefrom:["author"], namerequired:!0, parent:["select"], properties:["aria-required"]}, range:{"abstract":!0, namefrom:["author"], parent:["widget"], properties:["aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"]}, region:{namefrom:[" author"], parent:["section"]}, roletype:{"abstract":!0, properties:"aria-atomic aria-busy aria-controls aria-describedby aria-disabled aria-dropeffect aria-flowto aria-grabbed aria-haspopup aria-hidden aria-invalid aria-label aria-labelledby aria-live aria-owns aria-relevant".split(" ")},
+row:{mustcontain:["columnheader", "gridcell", "rowheader"], namefrom:["contents", "author"], parent:["group", "widget"], properties:["aria-level", "aria-selected"], scope:["grid", "rowgroup", "treegrid"]}, rowgroup:{mustcontain:["row"], namefrom:["contents", "author"], parent:["group"], scope:["grid"]}, rowheader:{namefrom:["contents", "author"], namerequired:!0, parent:["gridcell", "sectionhead", "widget"], properties:["aria-sort"], scope:["row"]}, search:{namefrom:["author"], parent:["landmark"]},
+section:{"abstract":!0, namefrom:["contents", "author"], parent:["structure"], properties:["aria-expanded"]}, sectionhead:{"abstract":!0, namefrom:["contents", "author"], parent:["structure"], properties:["aria-expanded"]}, select:{"abstract":!0, namefrom:["author"], parent:["composite", "group", "input"]}, separator:{childpresentational:!0, namefrom:["author"], parent:["structure"], properties:["aria-expanded", "aria-orientation"]}, scrollbar:{childpresentational:!0, namefrom:["author"], namerequired:!1,
+parent:["input", "range"], requiredProperties:["aria-controls", "aria-orientation", "aria-valuemax", "aria-valuemin", "aria-valuenow"], properties:["aria-controls", "aria-orientation", "aria-valuemax", "aria-valuemin", "aria-valuenow"]}, slider:{childpresentational:!0, namefrom:["author"], namerequired:!0, parent:["input", "range"], requiredProperties:["aria-valuemax", "aria-valuemin", "aria-valuenow"], properties:["aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-orientation"]}, spinbutton:{namefrom:["author"],
+namerequired:!0, parent:["input", "range"], requiredProperties:["aria-valuemax", "aria-valuemin", "aria-valuenow"], properties:["aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-required"]}, status:{parent:["region"]}, structure:{"abstract":!0, parent:["roletype"]}, tab:{namefrom:["contents", "author"], parent:["sectionhead", "widget"], properties:["aria-selected"], scope:["tablist"]}, tablist:{mustcontain:["tab"], namefrom:["author"], parent:["composite", "directory"], properties:["aria-level"]},
+tabpanel:{namefrom:["author"], namerequired:!0, parent:["region"]}, textbox:{namefrom:["author"], namerequired:!0, parent:["input"], properties:["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-readonly", "aria-required"]}, timer:{namefrom:["author"], namerequired:!0, parent:["status"]}, toolbar:{namefrom:["author"], parent:["group"]}, tooltip:{namerequired:!0, parent:["section"]}, tree:{mustcontain:["group", "treeitem"], namefrom:["author"], namerequired:!0, parent:["select"],
+properties:["aria-multiselectable", "aria-required"]}, treegrid:{mustcontain:["row"], namefrom:["author"], namerequired:!0, parent:["grid", "tree"]}, treeitem:{namefrom:["contents", "author"], namerequired:!0, parent:["listitem", "option"], scope:["group", "tree"]}, widget:{"abstract":!0, parent:["roletype"]}, window:{"abstract":!0, namefrom:[" author"], parent:["roletype"], properties:["aria-expanded"]}};
+axs.constants.WIDGET_ROLES = {};
+axs.constants.addAllParentRolesToSet_ = function(a, b) {
+ if (a.parent) {
+ for (var c = a.parent, d = 0;d < c.length;d++) {
+ var e = c[d];
+ b[e] = !0;
+ axs.constants.addAllParentRolesToSet_(axs.constants.ARIA_ROLES[e], b);
+ }
+ }
+};
+axs.constants.addAllPropertiesToSet_ = function(a, b, c) {
+ var d = a[b];
+ if (d) {
+ for (var e = 0;e < d.length;e++) {
+ c[d[e]] = !0;
+ }
+ }
+ if (a.parent) {
+ for (a = a.parent, d = 0;d < a.length;d++) {
+ axs.constants.addAllPropertiesToSet_(axs.constants.ARIA_ROLES[a[d]], b, c);
+ }
+ }
+};
+for (var roleName in axs.constants.ARIA_ROLES) {
+ var role = axs.constants.ARIA_ROLES[roleName], propertiesSet = {};
+ axs.constants.addAllPropertiesToSet_(role, "properties", propertiesSet);
+ role.propertiesSet = propertiesSet;
+ var requiredPropertiesSet = {};
+ axs.constants.addAllPropertiesToSet_(role, "requiredProperties", requiredPropertiesSet);
+ role.requiredPropertiesSet = requiredPropertiesSet;
+ var parentRolesSet = {};
+ axs.constants.addAllParentRolesToSet_(role, parentRolesSet);
+ role.allParentRolesSet = parentRolesSet;
+ "widget" in parentRolesSet && (axs.constants.WIDGET_ROLES[roleName] = role);
+}
+axs.constants.ARIA_PROPERTIES = {activedescendant:{type:"property", valueType:"idref"}, atomic:{defaultValue:"false", type:"property", valueType:"boolean"}, autocomplete:{defaultValue:"none", type:"property", valueType:"token", values:["inline", "list", "both", "none"]}, busy:{defaultValue:"false", type:"state", valueType:"boolean"}, checked:{defaultValue:"undefined", type:"state", valueType:"token", values:["true", "false", "mixed", "undefined"]}, controls:{type:"property", valueType:"idref_list"},
+describedby:{type:"property", valueType:"idref_list"}, disabled:{defaultValue:"false", type:"state", valueType:"boolean"}, dropeffect:{defaultValue:"none", type:"property", valueType:"token_list", values:"copy move link execute popup none".split(" ")}, expanded:{defaultValue:"undefined", type:"state", valueType:"token", values:["true", "false", "undefined"]}, flowto:{type:"property", valueType:"idref_list"}, grabbed:{defaultValue:"undefined", type:"state", valueType:"token", values:["true", "false",
+"undefined"]}, haspopup:{defaultValue:"false", type:"property", valueType:"boolean"}, hidden:{defaultValue:"false", type:"state", valueType:"boolean"}, invalid:{defaultValue:"false", type:"state", valueType:"token", values:["grammar", "false", "spelling", "true"]}, label:{type:"property", valueType:"string"}, labelledby:{type:"property", valueType:"idref_list"}, level:{type:"property", valueType:"integer"}, live:{defaultValue:"off", type:"property", valueType:"token", values:["off", "polite", "assertive"]},
+multiline:{defaultValue:"false", type:"property", valueType:"boolean"}, multiselectable:{defaultValue:"false", type:"property", valueType:"boolean"}, orientation:{defaultValue:"vertical", type:"property", valueType:"token", values:["horizontal", "vertical"]}, owns:{type:"property", valueType:"idref_list"}, posinset:{type:"property", valueType:"integer"}, pressed:{defaultValue:"undefined", type:"state", valueType:"token", values:["true", "false", "mixed", "undefined"]}, readonly:{defaultValue:"false",
+type:"property", valueType:"boolean"}, relevant:{defaultValue:"additions text", type:"property", valueType:"token_list", values:["additions", "removals", "text", "all"]}, required:{defaultValue:"false", type:"property", valueType:"boolean"}, selected:{defaultValue:"undefined", type:"state", valueType:"token", values:["true", "false", "undefined"]}, setsize:{type:"property", valueType:"integer"}, sort:{defaultValue:"none", type:"property", valueType:"token", values:["ascending", "descending", "none",
+"other"]}, valuemax:{type:"property", valueType:"decimal"}, valuemin:{type:"property", valueType:"decimal"}, valuenow:{type:"property", valueType:"decimal"}, valuetext:{type:"property", valueType:"string"}};
+(function() {
+ for (var a in axs.constants.ARIA_PROPERTIES) {
+ var b = axs.constants.ARIA_PROPERTIES[a];
+ if (b.values) {
+ for (var c = {}, d = 0;d < b.values.length;d++) {
+ c[b.values[d]] = !0;
+ }
+ b.valuesSet = c;
+ }
+ }
+})();
+axs.constants.GLOBAL_PROPERTIES = axs.constants.ARIA_ROLES.roletype.propertiesSet;
+axs.constants.NO_ROLE_NAME = " ";
+axs.constants.WIDGET_ROLE_TO_NAME = {alert:"aria_role_alert", alertdialog:"aria_role_alertdialog", button:"aria_role_button", checkbox:"aria_role_checkbox", columnheader:"aria_role_columnheader", combobox:"aria_role_combobox", dialog:"aria_role_dialog", grid:"aria_role_grid", gridcell:"aria_role_gridcell", link:"aria_role_link", listbox:"aria_role_listbox", log:"aria_role_log", marquee:"aria_role_marquee", menu:"aria_role_menu", menubar:"aria_role_menubar", menuitem:"aria_role_menuitem", menuitemcheckbox:"aria_role_menuitemcheckbox",
+menuitemradio:"aria_role_menuitemradio", option:axs.constants.NO_ROLE_NAME, progressbar:"aria_role_progressbar", radio:"aria_role_radio", radiogroup:"aria_role_radiogroup", rowheader:"aria_role_rowheader", scrollbar:"aria_role_scrollbar", slider:"aria_role_slider", spinbutton:"aria_role_spinbutton", status:"aria_role_status", tab:"aria_role_tab", tabpanel:"aria_role_tabpanel", textbox:"aria_role_textbox", timer:"aria_role_timer", toolbar:"aria_role_toolbar", tooltip:"aria_role_tooltip", treeitem:"aria_role_treeitem"};
+axs.constants.STRUCTURE_ROLE_TO_NAME = {article:"aria_role_article", application:"aria_role_application", banner:"aria_role_banner", columnheader:"aria_role_columnheader", complementary:"aria_role_complementary", contentinfo:"aria_role_contentinfo", definition:"aria_role_definition", directory:"aria_role_directory", document:"aria_role_document", form:"aria_role_form", group:"aria_role_group", heading:"aria_role_heading", img:"aria_role_img", list:"aria_role_list", listitem:"aria_role_listitem",
+main:"aria_role_main", math:"aria_role_math", navigation:"aria_role_navigation", note:"aria_role_note", region:"aria_role_region", rowheader:"aria_role_rowheader", search:"aria_role_search", separator:"aria_role_separator"};
+axs.constants.ATTRIBUTE_VALUE_TO_STATUS = [{name:"aria-autocomplete", values:{inline:"aria_autocomplete_inline", list:"aria_autocomplete_list", both:"aria_autocomplete_both"}}, {name:"aria-checked", values:{"true":"aria_checked_true", "false":"aria_checked_false", mixed:"aria_checked_mixed"}}, {name:"aria-disabled", values:{"true":"aria_disabled_true"}}, {name:"aria-expanded", values:{"true":"aria_expanded_true", "false":"aria_expanded_false"}}, {name:"aria-invalid", values:{"true":"aria_invalid_true",
+grammar:"aria_invalid_grammar", spelling:"aria_invalid_spelling"}}, {name:"aria-multiline", values:{"true":"aria_multiline_true"}}, {name:"aria-multiselectable", values:{"true":"aria_multiselectable_true"}}, {name:"aria-pressed", values:{"true":"aria_pressed_true", "false":"aria_pressed_false", mixed:"aria_pressed_mixed"}}, {name:"aria-readonly", values:{"true":"aria_readonly_true"}}, {name:"aria-required", values:{"true":"aria_required_true"}}, {name:"aria-selected", values:{"true":"aria_selected_true",
+"false":"aria_selected_false"}}];
+axs.constants.INPUT_TYPE_TO_INFORMATION_TABLE_MSG = {button:"input_type_button", checkbox:"input_type_checkbox", color:"input_type_color", datetime:"input_type_datetime", "datetime-local":"input_type_datetime_local", date:"input_type_date", email:"input_type_email", file:"input_type_file", image:"input_type_image", month:"input_type_month", number:"input_type_number", password:"input_type_password", radio:"input_type_radio", range:"input_type_range", reset:"input_type_reset", search:"input_type_search",
+submit:"input_type_submit", tel:"input_type_tel", text:"input_type_text", url:"input_type_url", week:"input_type_week"};
+axs.constants.TAG_TO_INFORMATION_TABLE_VERBOSE_MSG = {A:"tag_link", BUTTON:"tag_button", H1:"tag_h1", H2:"tag_h2", H3:"tag_h3", H4:"tag_h4", H5:"tag_h5", H6:"tag_h6", LI:"tag_li", OL:"tag_ol", SELECT:"tag_select", TEXTAREA:"tag_textarea", UL:"tag_ul", SECTION:"tag_section", NAV:"tag_nav", ARTICLE:"tag_article", ASIDE:"tag_aside", HGROUP:"tag_hgroup", HEADER:"tag_header", FOOTER:"tag_footer", TIME:"tag_time", MARK:"tag_mark"};
+axs.constants.TAG_TO_INFORMATION_TABLE_BRIEF_MSG = {BUTTON:"tag_button", SELECT:"tag_select", TEXTAREA:"tag_textarea"};
+axs.constants.MIXED_VALUES = {"true":!0, "false":!0, mixed:!0};
+axs.constants.Severity = {INFO:"Info", WARNING:"Warning", SEVERE:"Severe"};
+axs.constants.AuditResult = {PASS:"PASS", FAIL:"FAIL", NA:"NA"};
+axs.constants.InlineElements = {TT:!0, I:!0, B:!0, BIG:!0, SMALL:!0, EM:!0, STRONG:!0, DFN:!0, CODE:!0, SAMP:!0, KBD:!0, VAR:!0, CITE:!0, ABBR:!0, ACRONYM:!0, A:!0, IMG:!0, OBJECT:!0, BR:!0, SCRIPT:!0, MAP:!0, Q:!0, SUB:!0, SUP:!0, SPAN:!0, BDO:!0, INPUT:!0, SELECT:!0, TEXTAREA:!0, LABEL:!0, BUTTON:!0};
+axs.constants.NATIVELY_DISABLEABLE = {BUTTON:!0, INPUT:!0, SELECT:!0, TEXTAREA:!0, FIELDSET:!0, OPTGROUP:!0, OPTION:!0};
+axs.constants.ARIA_TO_HTML_ATTRIBUTE = {"aria-checked":"checked", "aria-disabled":"disabled", "aria-hidden":"hidden", "aria-expanded":"open", "aria-valuemax":"max", "aria-valuemin":"min", "aria-readonly":"readonly", "aria-required":"required", "aria-selected":"selected", "aria-valuenow":"value"};
+axs.constants.TAG_TO_IMPLICIT_SEMANTIC_INFO = {A:[{role:"link", allowed:"button checkbox menuitem menuitemcheckbox menuitemradio tab treeitem".split(" "), selector:"a[href]"}], ADDRESS:[{role:"", allowed:["contentinfo", "presentation"]}], AREA:[{role:"link", selector:"area[href]"}], ARTICLE:[{role:"article", allowed:["presentation", "article", "document", "application", "main"]}], ASIDE:[{role:"complementary", allowed:["note", "complementary", "search", "presentation"]}], AUDIO:[{role:"", allowed:["application",
+"presentation"]}], BASE:[{role:"", reserved:!0}], BODY:[{role:"document", allowed:["presentation"]}], BUTTON:[{role:"button", allowed:["link", "menuitem", "menuitemcheckbox", "menuitemradio", "radio"], selector:'button:not([aria-pressed]):not([type="menu"])'}, {role:"button", allowed:["button"], selector:"button[aria-pressed]"}, {role:"button", attributes:{"aria-haspopup":!0}, allowed:["link", "menuitem", "menuitemcheckbox", "menuitemradio", "radio"], selector:'button[type="menu"]'}], CAPTION:[{role:"",
+allowed:["presentation"]}], COL:[{role:"", reserved:!0}], COLGROUP:[{role:"", reserved:!0}], DATALIST:[{role:"listbox", attributes:{"aria-multiselectable":!1}, allowed:["presentation"]}], DEL:[{role:"", allowed:["*"]}], DD:[{role:"", allowed:["presentation"]}], DT:[{role:"", allowed:["presentation"]}], DETAILS:[{role:"group", allowed:["group", "presentation"]}], DIALOG:[{role:"dialog", allowed:"dialog alert alertdialog application log marquee status".split(" "), selector:"dialog[open]"}, {role:"dialog",
+attributes:{"aria-hidden":!0}, allowed:"dialog alert alertdialog application log marquee status".split(" "), selector:"dialog:not([open])"}], DIV:[{role:"", allowed:["*"]}], DL:[{role:"list", allowed:["presentation"]}], EMBED:[{role:"", allowed:["application", "document", "img", "presentation"]}], FIGURE:[{role:"", allowed:["*"]}], FOOTER:[{role:"", allowed:["contentinfo", "presentation"]}], FORM:[{role:"form", allowed:["presentation"]}], P:[{role:"", allowed:["*"]}], PRE:[{role:"", allowed:["*"]}],
+BLOCKQUOTE:[{role:"", allowed:["*"]}], H1:[{role:"heading"}], H2:[{role:"heading"}], H3:[{role:"heading"}], H4:[{role:"heading"}], H5:[{role:"heading"}], H6:[{role:"heading"}], HEAD:[{role:"", reserved:!0}], HEADER:[{role:"", allowed:["banner", "presentation"]}], HR:[{role:"separator", allowed:["presentation"]}], HTML:[{role:"", reserved:!0}], IFRAME:[{role:"", allowed:["application", "document", "img", "presentation"], selector:"iframe:not([seamless])"}, {role:"", allowed:["application", "document",
+"img", "presentation", "group"], selector:"iframe[seamless]"}], IMG:[{role:"presentation", reserved:!0, selector:'img[alt=""]'}, {role:"img", allowed:["*"], selector:'img[alt]:not([alt=""])'}], INPUT:[{role:"button", allowed:["link", "menuitem", "menuitemcheckbox", "menuitemradio", "radio"], selector:'input[type="button"]:not([aria-pressed])'}, {role:"button", allowed:["button"], selector:'input[type="button"][aria-pressed]'}, {role:"checkbox", allowed:["checkbox"], selector:'input[type="checkbox"]'},
+{role:"", selector:'input[type="color"]'}, {role:"", selector:'input[type="date"]'}, {role:"", selector:'input[type="datetime"]'}, {role:"textbox", selector:'input[type="email"]:not([list])'}, {role:"", selector:'input[type="file"]'}, {role:"", reserved:!0, selector:'input[type="hidden"]'}, {role:"button", allowed:["button"], selector:'input[type="image"][aria-pressed]'}, {role:"button", allowed:["link", "menuitem", "menuitemcheckbox", "menuitemradio", "radio"], selector:'input[type="image"]:not([aria-pressed])'},
+{role:"", selector:'input[type="month"]'}, {role:"", selector:'input[type="number"]'}, {role:"textbox", selector:'input[type="password"]'}, {role:"radio", allowed:["menuitemradio"], selector:'input[type="radio"]'}, {role:"slider", selector:'input[type="range"]'}, {role:"button", selector:'input[type="reset"]'}, {role:"combobox", selector:'input[type="search"][list]'}, {role:"textbox", selector:'input[type="search"]:not([list])'}, {role:"button", selector:'input[type="submit"]'}, {role:"combobox",
+selector:'input[type="tel"][list]'}, {role:"textbox", selector:'input[type="tel"]:not([list])'}, {role:"combobox", selector:'input[type="text"][list]'}, {role:"textbox", selector:'input[type="text"]:not([list])'}, {role:"textbox", selector:"input:not([type])"}, {role:"", selector:'input[type="time"]'}, {role:"combobox", selector:'input[type="url"][list]'}, {role:"textbox", selector:'input[type="url"]:not([list])'}, {role:"", selector:'input[type="week"]'}], INS:[{role:"", allowed:["*"]}], KEYGEN:[{role:""}],
+LABEL:[{role:"", allowed:["presentation"]}], LI:[{role:"listitem", allowed:"menuitem menuitemcheckbox menuitemradio option tab treeitem presentation".split(" "), selector:'ol:not([role="presentation"])>li, ul:not([role="presentation"])>li'}, {role:"listitem", allowed:"listitem menuitem menuitemcheckbox menuitemradio option tab treeitem presentation".split(" "), selector:'ol[role="presentation"]>li, ul[role="presentation"]>li'}], LINK:[{role:"link", reserved:!0, selector:"link[href]"}], MAIN:[{role:"",
+allowed:["main", "presentation"]}], MAP:[{role:"", reserved:!0}], MATH:[{role:"", allowed:["presentation"]}], MENU:[{role:"toolbar", selector:'menu[type="toolbar"]'}], MENUITEM:[{role:"menuitem", selector:'menuitem[type="command"]'}, {role:"menuitemcheckbox", selector:'menuitem[type="checkbox"]'}, {role:"menuitemradio", selector:'menuitem[type="radio"]'}], META:[{role:"", reserved:!0}], METER:[{role:"progressbar", allowed:["presentation"]}], NAV:[{role:"navigation", allowed:["navigation", "presentation"]}],
+NOSCRIPT:[{role:"", reserved:!0}], OBJECT:[{role:"", allowed:["application", "document", "img", "presentation"]}], OL:[{role:"list", allowed:"directory group listbox menu menubar tablist toolbar tree presentation".split(" ")}], OPTGROUP:[{role:"", allowed:["presentation"]}], OPTION:[{role:"option"}], OUTPUT:[{role:"status", allowed:["*"]}], PARAM:[{role:"", reserved:!0}], PICTURE:[{role:"", reserved:!0}], PROGRESS:[{role:"progressbar", allowed:["presentation"]}], SCRIPT:[{role:"", reserved:!0}],
+SECTION:[{role:"region", allowed:"alert alertdialog application contentinfo dialog document log marquee search status presentation".split(" ")}], SELECT:[{role:"listbox"}], SOURCE:[{role:"", reserved:!0}], SPAN:[{role:"", allowed:["*"]}], STYLE:[{role:"", reserved:!0}], SVG:[{role:"", allowed:["application", "document", "img", "presentation"]}], SUMMARY:[{role:"", allowed:["presentation"]}], TABLE:[{role:"", allowed:["*"]}], TEMPLATE:[{role:"", reserved:!0}], TEXTAREA:[{role:"textbox"}], TBODY:[{role:"rowgroup",
+allowed:["*"]}], THEAD:[{role:"rowgroup", allowed:["*"]}], TFOOT:[{role:"rowgroup", allowed:["*"]}], TITLE:[{role:"", reserved:!0}], TD:[{role:"", allowed:["*"]}], TH:[{role:"", allowed:["*"]}], TR:[{role:"", allowed:["*"]}], TRACK:[{role:"", reserved:!0}], UL:[{role:"list", allowed:"directory group listbox menu menubar tablist toolbar tree presentation".split(" ")}], VIDEO:[{role:"", allowed:["application", "presentation"]}]};
+axs.dom = {};
+axs.dom.parentElement = function(a) {
+ if (!a) {
+ return null;
+ }
+ a = axs.dom.composedParentNode(a);
+ if (!a) {
+ return null;
+ }
+ switch(a.nodeType) {
+ case Node.ELEMENT_NODE:
+ return a;
+ default:
+ return axs.dom.parentElement(a);
+ }
+};
+axs.dom.shadowHost = function(a) {
+ return "host" in a ? a.host : null;
+};
+axs.dom.composedParentNode = function(a) {
+ if (!a) {
+ return null;
+ }
+ if (a.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
+ return axs.dom.shadowHost(a);
+ }
+ var b = a.parentNode;
+ if (!b) {
+ return null;
+ }
+ if (b.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
+ return axs.dom.shadowHost(b);
+ }
+ if (!b.shadowRoot) {
+ return b;
+ }
+ if (a.nodeType === Node.ELEMENT_NODE || a.nodeType === Node.TEXT_NODE) {
+ if (b = a.assignedSlot, HTMLSlotElement && b instanceof HTMLSlotElement) {
+ return axs.dom.composedParentNode(b);
+ }
+ }
+ return "function" === typeof a.getDestinationInsertionPoints && (a = a.getDestinationInsertionPoints(), 0 < a.length) ? axs.dom.composedParentNode(a[a.length - 1]) : null;
+};
+axs.dom.asElement = function(a) {
+ switch(a.nodeType) {
+ case Node.COMMENT_NODE:
+ break;
+ case Node.ELEMENT_NODE:
+ if ("script" == a.localName || "template" == a.localName) {
+ break;
+ }
+ return a;
+ case Node.DOCUMENT_FRAGMENT_NODE:
+ return a.host;
+ case Node.TEXT_NODE:
+ return axs.dom.parentElement(a);
+ default:
+ console.warn("Unhandled node type: ", a.nodeType);
+ }
+ return null;
+};
+axs.dom.composedTreeSearch = function(a, b, c, d, e) {
+ if (a === b) {
+ return !0;
+ }
+ if (a.nodeType == Node.ELEMENT_NODE) {
+ var f = a;
+ }
+ var g = !1;
+ d = Object.create(d);
+ if (f) {
+ var h = f.localName;
+ d.collectIdRefs && (d.idrefs = axs.utils.getReferencedIds(f));
+ if (!d.disabled || "legend" === h && axs.browserUtils.matchSelector(f, "fieldset>legend:first-of-type")) {
+ d.disabled = axs.utils.isElementDisabled(f, !0);
+ }
+ d.hidden || (d.hidden = axs.utils.isElementHidden(f));
+ if (c.preorder && !c.preorder(f, d)) {
+ return g;
+ }
+ var k = f.shadowRoot || f.webkitShadowRoot;
+ if (k) {
+ return d.level++, g = axs.dom.composedTreeSearch(k, b, c, d, k), f && c.postorder && !g && c.postorder(f, d), g;
+ }
+ if ("content" == h && "function" === typeof f.getDistributedNodes) {
+ a = f.getDistributedNodes();
+ for (h = 0;h < a.length && !g;h++) {
+ g = axs.dom.composedTreeSearch(a[h], b, c, d, e);
+ }
+ c.postorder && !g && c.postorder.call(null, f, d);
+ return g;
+ }
+ }
+ for (a = a.firstChild;null != a && !g;) {
+ g = axs.dom.composedTreeSearch(a, b, c, d, e), a = a.nextSibling;
+ }
+ f && c.postorder && !g && c.postorder.call(null, f, d);
+ return g;
+};
+axs.utils = {};
+axs.utils.FOCUSABLE_ELEMENTS_SELECTOR = "input:not([type=hidden]):not([disabled]),select:not([disabled]),textarea:not([disabled]),button:not([disabled]),a[href],iframe,[tabindex]";
+axs.utils.LABELABLE_ELEMENTS_SELECTOR = "button,input:not([type=hidden]),keygen,meter,output,progress,select,textarea";
+axs.utils.elementIsTransparent = function(a) {
+ return "0" == a.style.opacity;
+};
+axs.utils.elementHasZeroArea = function(a) {
+ a = a.getBoundingClientRect();
+ var b = a.top - a.bottom;
+ return a.right - a.left && b ? !1 : !0;
+};
+axs.utils.elementIsOutsideScrollArea = function(a) {
+ for (var b = axs.dom.parentElement(a), c = a.ownerDocument.defaultView;b != c.document.body;) {
+ if (axs.utils.isClippedBy(a, b)) {
+ return !0;
+ }
+ if (axs.utils.canScrollTo(a, b) && !axs.utils.elementIsOutsideScrollArea(b)) {
+ return !1;
+ }
+ b = axs.dom.parentElement(b);
+ }
+ return !axs.utils.canScrollTo(a, c.document.body);
+};
+axs.utils.canScrollTo = function(a, b) {
+ var c = a.getBoundingClientRect(), d = b.getBoundingClientRect();
+ if (b == b.ownerDocument.body) {
+ var e = d.top, f = d.left;
+ } else {
+ e = d.top - b.scrollTop, f = d.left - b.scrollLeft;
+ }
+ var g = e + b.scrollHeight, h = f + b.scrollWidth;
+ if (c.right < f || c.bottom < e || c.left > h || c.top > g) {
+ return !1;
+ }
+ e = a.ownerDocument.defaultView;
+ f = e.getComputedStyle(b);
+ return c.left > d.right || c.top > d.bottom ? "scroll" == f.overflow || "auto" == f.overflow || b instanceof e.HTMLBodyElement : !0;
+};
+axs.utils.isClippedBy = function(a, b) {
+ var c = a.getBoundingClientRect(), d = b.getBoundingClientRect(), e = d.top - b.scrollTop, f = d.left - b.scrollLeft, g = a.ownerDocument.defaultView.getComputedStyle(b);
+ return (c.right < d.left || c.bottom < d.top || c.left > d.right || c.top > d.bottom) && "hidden" == g.overflow ? !0 : c.right < f || c.bottom < e ? "visible" != g.overflow : !1;
+};
+axs.utils.isAncestor = function(a, b) {
+ if (null == b) {
+ return !1;
+ }
+ if (b === a) {
+ return !0;
+ }
+ var c = axs.dom.composedParentNode(b);
+ return axs.utils.isAncestor(a, c);
+};
+axs.utils.overlappingElements = function(a) {
+ if (axs.utils.elementHasZeroArea(a)) {
+ return null;
+ }
+ for (var b = [], c = a.getClientRects(), d = 0;d < c.length;d++) {
+ var e = c[d], e = document.elementFromPoint((e.left + e.right) / 2, (e.top + e.bottom) / 2);
+ if (null != e && e != a && !axs.utils.isAncestor(e, a) && !axs.utils.isAncestor(a, e)) {
+ var f = window.getComputedStyle(e, null);
+ f && (f = axs.utils.getBgColor(f, e)) && 0 < f.alpha && 0 > b.indexOf(e) && b.push(e);
+ }
+ }
+ return b;
+};
+axs.utils.elementIsHtmlControl = function(a) {
+ var b = a.ownerDocument.defaultView;
+ return a instanceof b.HTMLButtonElement || a instanceof b.HTMLInputElement || a instanceof b.HTMLSelectElement || a instanceof b.HTMLTextAreaElement ? !0 : !1;
+};
+axs.utils.elementIsAriaWidget = function(a) {
+ return a.hasAttribute("role") && (a = a.getAttribute("role")) && (a = axs.constants.ARIA_ROLES[a]) && "widget" in a.allParentRolesSet ? !0 : !1;
+};
+axs.utils.elementIsVisible = function(a) {
+ return axs.utils.elementIsTransparent(a) || axs.utils.elementHasZeroArea(a) || axs.utils.elementIsOutsideScrollArea(a) || axs.utils.overlappingElements(a).length ? !1 : !0;
+};
+axs.utils.isLargeFont = function(a) {
+ var b = a.fontSize;
+ a = "bold" == a.fontWeight;
+ var c = b.match(/(\d+)px/);
+ if (c) {
+ b = parseInt(c[1], 10);
+ if (c = window.getComputedStyle(document.body, null).fontSize.match(/(\d+)px/)) {
+ var d = parseInt(c[1], 10), c = 1.2 * d, d = 1.5 * d;
+ } else {
+ c = 19.2, d = 24;
+ }
+ return a && b >= c || b >= d;
+ }
+ if (c = b.match(/(\d+)em/)) {
+ return b = parseInt(c[1], 10), a && 1.2 <= b || 1.5 <= b ? !0 : !1;
+ }
+ if (c = b.match(/(\d+)%/)) {
+ return b = parseInt(c[1], 10), a && 120 <= b || 150 <= b ? !0 : !1;
+ }
+ if (c = b.match(/(\d+)pt/)) {
+ if (b = parseInt(c[1], 10), a && 14 <= b || 18 <= b) {
+ return !0;
+ }
+ }
+ return !1;
+};
+axs.utils.getBgColor = function(a, b) {
+ var c = axs.color.parseColor(a.backgroundColor);
+ if (!c) {
+ return null;
+ }
+ 1 > a.opacity && (c.alpha *= a.opacity);
+ if (1 > c.alpha) {
+ var d = axs.utils.getParentBgColor(b);
+ if (null == d) {
+ return null;
+ }
+ c = axs.color.flattenColors(c, d);
+ }
+ return c;
+};
+axs.utils.getParentBgColor = function(a) {
+ var b = a;
+ a = [];
+ for (var c = null;b = axs.dom.parentElement(b);) {
+ var d = window.getComputedStyle(b, null);
+ if (d) {
+ var e = axs.color.parseColor(d.backgroundColor);
+ if (e && (1 > d.opacity && (e.alpha *= d.opacity), 0 != e.alpha && (a.push(e), 1 == e.alpha))) {
+ c = !0;
+ break;
+ }
+ }
+ }
+ c || a.push(new axs.color.Color(255, 255, 255, 1));
+ for (b = a.pop();a.length;) {
+ c = a.pop(), b = axs.color.flattenColors(c, b);
+ }
+ return b;
+};
+axs.utils.getFgColor = function(a, b, c) {
+ var d = axs.color.parseColor(a.color);
+ if (!d) {
+ return null;
+ }
+ 1 > d.alpha && (d = axs.color.flattenColors(d, c));
+ 1 > a.opacity && (b = axs.utils.getParentBgColor(b), d.alpha *= a.opacity, d = axs.color.flattenColors(d, b));
+ return d;
+};
+axs.utils.getContrastRatioForElement = function(a) {
+ var b = window.getComputedStyle(a, null);
+ return axs.utils.getContrastRatioForElementWithComputedStyle(b, a);
+};
+axs.utils.getContrastRatioForElementWithComputedStyle = function(a, b) {
+ if (axs.utils.isElementHidden(b)) {
+ return null;
+ }
+ var c = axs.utils.getBgColor(a, b);
+ if (!c) {
+ return null;
+ }
+ var d = axs.utils.getFgColor(a, b, c);
+ return d ? axs.color.calculateContrastRatio(d, c) : null;
+};
+axs.utils.isNativeTextElement = function(a) {
+ var b = a.tagName.toLowerCase();
+ a = a.type ? a.type.toLowerCase() : "";
+ if ("textarea" == b) {
+ return !0;
+ }
+ if ("input" != b) {
+ return !1;
+ }
+ switch(a) {
+ case "email":
+ case "number":
+ case "password":
+ case "search":
+ case "text":
+ case "tel":
+ case "url":
+ case "":
+ return !0;
+ default:
+ return !1;
+ }
+};
+axs.utils.isLowContrast = function(a, b, c) {
+ a = Math.round(10 * a) / 10;
+ return c ? 4.5 > a || !axs.utils.isLargeFont(b) && 7 > a : 3 > a || !axs.utils.isLargeFont(b) && 4.5 > a;
+};
+axs.utils.hasLabel = function(a) {
+ var b = a.tagName.toLowerCase(), c = a.type ? a.type.toLowerCase() : "";
+ if (a.hasAttribute("aria-label") || a.hasAttribute("title") || "img" == b && a.hasAttribute("alt") || "input" == b && "image" == c && a.hasAttribute("alt") || "input" == b && ("submit" == c || "reset" == c) || a.hasAttribute("aria-labelledby") || a.hasAttribute("id") && 0 < document.querySelectorAll('label[for="' + a.id + '"]').length) {
+ return !0;
+ }
+ for (b = axs.dom.parentElement(a);b;) {
+ if ("label" == b.tagName.toLowerCase() && b.control == a) {
+ return !0;
+ }
+ b = axs.dom.parentElement(b);
+ }
+ return !1;
+};
+axs.utils.isNativelyDisableable = function(a) {
+ return a.tagName.toUpperCase() in axs.constants.NATIVELY_DISABLEABLE;
+};
+axs.utils.isElementDisabled = function(a, b) {
+ if (axs.browserUtils.matchSelector(a, b ? "[aria-disabled=true]" : "[aria-disabled=true], [aria-disabled=true] *")) {
+ return !0;
+ }
+ if (!axs.utils.isNativelyDisableable(a) || axs.browserUtils.matchSelector(a, "fieldset>legend:first-of-type *")) {
+ return !1;
+ }
+ for (var c = a;null !== c;c = axs.dom.parentElement(c)) {
+ if (c.hasAttribute("disabled")) {
+ return !0;
+ }
+ if (b) {
+ break;
+ }
+ }
+ return !1;
+};
+axs.utils.isElementHidden = function(a) {
+ if (!(a instanceof a.ownerDocument.defaultView.HTMLElement)) {
+ return !1;
+ }
+ if (a.hasAttribute("chromevoxignoreariahidden")) {
+ var b = !0;
+ }
+ var c = window.getComputedStyle(a, null);
+ return "none" == c.display || "hidden" == c.visibility ? !0 : a.hasAttribute("aria-hidden") && "true" == a.getAttribute("aria-hidden").toLowerCase() ? !b : !1;
+};
+axs.utils.isElementOrAncestorHidden = function(a) {
+ return axs.utils.isElementHidden(a) ? !0 : axs.dom.parentElement(a) ? axs.utils.isElementOrAncestorHidden(axs.dom.parentElement(a)) : !1;
+};
+axs.utils.isInlineElement = function(a) {
+ a = a.tagName.toUpperCase();
+ return axs.constants.InlineElements[a];
+};
+axs.utils.getRoles = function(a, b) {
+ if (!a || a.nodeType !== Node.ELEMENT_NODE || !a.hasAttribute("role") && !b) {
+ return null;
+ }
+ var c = a.getAttribute("role");
+ !c && b && (c = axs.properties.getImplicitRole(a));
+ if (!c) {
+ return null;
+ }
+ for (var c = c.split(" "), d = {roles:[], valid:!1}, e = 0;e < c.length;e++) {
+ var f = c[e], g = axs.constants.ARIA_ROLES[f], f = {name:f};
+ g && !g["abstract"] ? (f.details = g, d.applied || (d.applied = f), f.valid = d.valid = !0) : f.valid = !1;
+ d.roles.push(f);
+ }
+ return d;
+};
+axs.utils.getAriaPropertyValue = function(a, b, c) {
+ var d = a.replace(/^aria-/, ""), e = axs.constants.ARIA_PROPERTIES[d], d = {name:a, rawValue:b};
+ if (!e) {
+ return d.valid = !1, d.reason = '"' + a + '" is not a valid ARIA property', d;
+ }
+ e = e.valueType;
+ if (!e) {
+ return d.valid = !1, d.reason = '"' + a + '" is not a valid ARIA property', d;
+ }
+ switch(e) {
+ case "idref":
+ a = axs.utils.isValidIDRefValue(b, c), d.valid = a.valid, d.reason = a.reason, d.idref = a.idref;
+ case "idref_list":
+ a = b.split(/\s+/);
+ d.valid = !0;
+ for (b = 0;b < a.length;b++) {
+ e = axs.utils.isValidIDRefValue(a[b], c), e.valid || (d.valid = !1), d.values ? d.values.push(e) : d.values = [e];
+ }
+ return d;
+ case "integer":
+ c = axs.utils.isValidNumber(b);
+ if (!c.valid) {
+ return d.valid = !1, d.reason = c.reason, d;
+ }
+ Math.floor(c.value) !== c.value ? (d.valid = !1, d.reason = "" + b + " is not a whole integer") : (d.valid = !0, d.value = c.value);
+ return d;
+ case "decimal":
+ case "number":
+ c = axs.utils.isValidNumber(b);
+ d.valid = c.valid;
+ if (!c.valid) {
+ return d.reason = c.reason, d;
+ }
+ d.value = c.value;
+ return d;
+ case "string":
+ return d.valid = !0, d.value = b, d;
+ case "token":
+ return c = axs.utils.isValidTokenValue(a, b.toLowerCase()), c.valid ? (d.valid = !0, d.value = c.value) : (d.valid = !1, d.value = b, d.reason = c.reason), d;
+ case "token_list":
+ e = b.split(/\s+/);
+ d.valid = !0;
+ for (b = 0;b < e.length;b++) {
+ c = axs.utils.isValidTokenValue(a, e[b].toLowerCase()), c.valid || (d.valid = !1, d.reason ? (d.reason = [d.reason], d.reason.push(c.reason)) : (d.reason = c.reason, d.possibleValues = c.possibleValues)), d.values ? d.values.push(c.value) : d.values = [c.value];
+ }
+ return d;
+ case "tristate":
+ return c = axs.utils.isPossibleValue(b.toLowerCase(), axs.constants.MIXED_VALUES, a), c.valid ? (d.valid = !0, d.value = c.value) : (d.valid = !1, d.value = b, d.reason = c.reason), d;
+ case "boolean":
+ return c = axs.utils.isValidBoolean(b), c.valid ? (d.valid = !0, d.value = c.value) : (d.valid = !1, d.value = b, d.reason = c.reason), d;
+ }
+ d.valid = !1;
+ d.reason = "Not a valid ARIA property";
+ return d;
+};
+axs.utils.isValidTokenValue = function(a, b) {
+ var c = a.replace(/^aria-/, "");
+ return axs.utils.isPossibleValue(b, axs.constants.ARIA_PROPERTIES[c].valuesSet, a);
+};
+axs.utils.isPossibleValue = function(a, b, c) {
+ return b[a] ? {valid:!0, value:a} : {valid:!1, value:a, reason:'"' + a + '" is not a valid value for ' + c, possibleValues:Object.keys(b)};
+};
+axs.utils.isValidBoolean = function(a) {
+ try {
+ var b = JSON.parse(a);
+ } catch (c) {
+ b = "";
+ }
+ return "boolean" != typeof b ? {valid:!1, value:a, reason:'"' + a + '" is not a true/false value'} : {valid:!0, value:b};
+};
+axs.utils.isValidIDRefValue = function(a, b) {
+ return 0 == a.length ? {valid:!0, idref:a} : b.ownerDocument.getElementById(a) ? {valid:!0, idref:a} : {valid:!1, idref:a, reason:'No element with ID "' + a + '"'};
+};
+axs.utils.isValidNumber = function(a) {
+ var b = {valid:!1, value:a, reason:'"' + a + '" is not a number'};
+ if (!a) {
+ return b;
+ }
+ if (/^0x/i.test(a)) {
+ return b.reason = '"' + a + '" is not a decimal number', b;
+ }
+ a *= 1;
+ return isFinite(a) ? {valid:!0, value:a} : b;
+};
+axs.utils.isElementImplicitlyFocusable = function(a) {
+ var b = a.ownerDocument.defaultView;
+ return a instanceof b.HTMLAnchorElement || a instanceof b.HTMLAreaElement ? a.hasAttribute("href") : a instanceof b.HTMLInputElement || a instanceof b.HTMLSelectElement || a instanceof b.HTMLTextAreaElement || a instanceof b.HTMLButtonElement || a instanceof b.HTMLIFrameElement ? !a.disabled : !1;
+};
+axs.utils.values = function(a) {
+ var b = [], c;
+ for (c in a) {
+ a.hasOwnProperty(c) && "function" != typeof a[c] && b.push(a[c]);
+ }
+ return b;
+};
+axs.utils.namedValues = function(a) {
+ var b = {}, c;
+ for (c in a) {
+ a.hasOwnProperty(c) && "function" != typeof a[c] && (b[c] = a[c]);
+ }
+ return b;
+};
+function escapeId(a) {
+ return a.replace(/[^a-zA-Z0-9_-]/g, function(a) {
+ return "\\" + a;
+ });
+}
+axs.utils.getQuerySelectorText = function(a) {
+ if (null == a || "HTML" == a.tagName) {
+ return "html";
+ }
+ if ("BODY" == a.tagName) {
+ return "body";
+ }
+ if (a.hasAttribute) {
+ if (a.id) {
+ return "#" + escapeId(a.id);
+ }
+ if (a.className) {
+ for (var b = "", c = 0;c < a.classList.length;c++) {
+ b += "." + a.classList[c];
+ }
+ var d = 0;
+ if (a.parentNode) {
+ for (c = 0;c < a.parentNode.children.length;c++) {
+ var e = a.parentNode.children[c];
+ axs.browserUtils.matchSelector(e, b) && d++;
+ if (e === a) {
+ break;
+ }
+ }
+ } else {
+ d = 1;
+ }
+ if (1 == d) {
+ return axs.utils.getQuerySelectorText(a.parentNode) + " > " + b;
+ }
+ }
+ if (a.parentNode) {
+ b = a.parentNode.children;
+ d = 1;
+ for (c = 0;b[c] !== a;) {
+ b[c].tagName == a.tagName && d++, c++;
+ }
+ c = "";
+ "BODY" != a.parentNode.tagName && (c = axs.utils.getQuerySelectorText(a.parentNode) + " > ");
+ return 1 == d ? c + a.tagName : c + a.tagName + ":nth-of-type(" + d + ")";
+ }
+ } else {
+ if (a.selectorText) {
+ return a.selectorText;
+ }
+ }
+ return "";
+};
+axs.utils.getAriaIdReferrers = function(a, b) {
+ var c = function(a) {
+ var b = axs.constants.ARIA_PROPERTIES[a];
+ if (b) {
+ if ("idref" === b.valueType) {
+ return "[aria-" + a + "='" + d + "']";
+ }
+ if ("idref_list" === b.valueType) {
+ return "[aria-" + a + "~='" + d + "']";
+ }
+ }
+ return "";
+ };
+ if (!a) {
+ return null;
+ }
+ var d = a.id;
+ if (!d) {
+ return null;
+ }
+ d = d.replace(/'/g, "\\'");
+ if (b) {
+ var e = b.replace(/^aria-/, ""), f = c(e);
+ if (f) {
+ return a.ownerDocument.querySelectorAll(f);
+ }
+ } else {
+ var g = [];
+ for (e in axs.constants.ARIA_PROPERTIES) {
+ (f = c(e)) && g.push(f);
+ }
+ return a.ownerDocument.querySelectorAll(g.join(","));
+ }
+ return null;
+};
+axs.utils.getHtmlIdReferrers = function(a) {
+ if (!a) {
+ return null;
+ }
+ var b = a.id;
+ if (!b) {
+ return null;
+ }
+ var b = b.replace(/'/g, "\\'"), c = "[contextmenu='{id}'] [itemref~='{id}'] button[form='{id}'] button[menu='{id}'] fieldset[form='{id}'] input[form='{id}'] input[list='{id}'] keygen[form='{id}'] label[for='{id}'] label[form='{id}'] menuitem[command='{id}'] object[form='{id}'] output[for~='{id}'] output[form='{id}'] select[form='{id}'] td[headers~='{id}'] textarea[form='{id}'] tr[headers~='{id}']".split(" ").map(function(a) {
+ return a.replace("{id}", b);
+ });
+ return a.ownerDocument.querySelectorAll(c.join(","));
+};
+axs.utils.getReferencedIds = function(a) {
+ for (var b = [], c = function(a) {
+ a && (0 < a.indexOf(" ") ? b = b.concat(f.value.split(" ")) : b.push(a));
+ }, d = 0;d < a.attributes.length;d++) {
+ var e = a.tagName.toLowerCase(), f = a.attributes[d];
+ if (f.specified) {
+ var g = f.name, h = g.match(/aria-(.+)/);
+ if (h) {
+ e = axs.constants.ARIA_PROPERTIES[h[1]], !e || "idref" !== e.valueType && "idref_list" !== e.valueType || c(f.value);
+ } else {
+ switch(g) {
+ case "contextmenu":
+ case "itemref":
+ c(f.value);
+ break;
+ case "form":
+ "button" != e && "fieldset" != e && "input" != e && "keygen" != e && "label" != e && "object" != e && "output" != e && "select" != e && "textarea" != e || c(f.value);
+ break;
+ case "for":
+ "label" != e && "output" != e || c(f.value);
+ break;
+ case "menu":
+ "button" == e && c(f.value);
+ break;
+ case "list":
+ "input" == e && c(f.value);
+ break;
+ case "command":
+ "menuitem" == e && c(f.value);
+ break;
+ case "headers":
+ "td" != e && "tr" != e || c(f.value);
+ }
+ }
+ }
+ }
+ return b;
+};
+axs.utils.getIdReferrers = function(a) {
+ var b = [], c = axs.utils.getHtmlIdReferrers(a);
+ c && (b = b.concat(Array.prototype.slice.call(c)));
+ (c = axs.utils.getAriaIdReferrers(a)) && (b = b.concat(Array.prototype.slice.call(c)));
+ return b;
+};
+axs.utils.getIdReferents = function(a, b) {
+ var c = [], d = a.replace(/^aria-/, ""), d = axs.constants.ARIA_PROPERTIES[d];
+ if (!d || !b.hasAttribute(a)) {
+ return c;
+ }
+ d = d.valueType;
+ if ("idref_list" === d || "idref" === d) {
+ for (var d = b.ownerDocument, e = b.getAttribute(a), e = e.split(/\s+/), f = 0, g = e.length;f < g;f++) {
+ var h = d.getElementById(e[f]);
+ h && (c[c.length] = h);
+ }
+ }
+ return c;
+};
+axs.utils.getAriaPropertiesByValueType = function(a) {
+ var b = {}, c;
+ for (c in axs.constants.ARIA_PROPERTIES) {
+ var d = axs.constants.ARIA_PROPERTIES[c];
+ d && 0 <= a.indexOf(d.valueType) && (b[c] = d);
+ }
+ return b;
+};
+axs.utils.getSelectorForAriaProperties = function(a) {
+ a = Object.keys(a).map(function(a) {
+ return "[aria-" + a + "]";
+ });
+ a.sort();
+ return a.join(",");
+};
+axs.utils.findDescendantsWithRole = function(a, b) {
+ if (!a || !b) {
+ return [];
+ }
+ var c = axs.properties.getSelectorForRole(b);
+ if (c && (c = a.querySelectorAll(c))) {
+ c = Array.prototype.map.call(c, function(a) {
+ return a;
+ });
+ } else {
+ return [];
+ }
+ return c;
+};
+axs.properties = {};
+axs.properties.TEXT_CONTENT_XPATH = './/text()[normalize-space(.)!=""]/parent::*[name()!="script"]';
+axs.properties.getFocusProperties = function(a) {
+ var b = {}, c = a.getAttribute("tabindex");
+ void 0 != c ? b.tabindex = {value:c, valid:!0} : axs.utils.isElementImplicitlyFocusable(a) && (b.implicitlyFocusable = {value:!0, valid:!0});
+ if (0 == Object.keys(b).length) {
+ return null;
+ }
+ var d = axs.utils.elementIsTransparent(a), e = axs.utils.elementHasZeroArea(a), f = axs.utils.elementIsOutsideScrollArea(a), g = axs.utils.overlappingElements(a);
+ if (d || e || f || 0 < g.length) {
+ var c = axs.utils.isElementOrAncestorHidden(a), h = {value:!1, valid:c};
+ d && (h.transparent = !0);
+ e && (h.zeroArea = !0);
+ f && (h.outsideScrollArea = !0);
+ g && 0 < g.length && (h.overlappingElements = g);
+ d = {value:c, valid:c};
+ c && (d.reason = axs.properties.getHiddenReason(a));
+ h.hidden = d;
+ b.visible = h;
+ } else {
+ b.visible = {value:!0, valid:!0};
+ }
+ return b;
+};
+axs.properties.getHiddenReason = function(a) {
+ if (!(a && a instanceof a.ownerDocument.defaultView.HTMLElement)) {
+ return null;
+ }
+ if (a.hasAttribute("chromevoxignoreariahidden")) {
+ var b = !0;
+ }
+ var c = window.getComputedStyle(a, null);
+ return "none" == c.display ? {property:"display: none", on:a} : "hidden" == c.visibility ? {property:"visibility: hidden", on:a} : a.hasAttribute("aria-hidden") && "true" == a.getAttribute("aria-hidden").toLowerCase() && !b ? {property:"aria-hidden", on:a} : axs.properties.getHiddenReason(axs.dom.parentElement(a));
+};
+axs.properties.getColorProperties = function(a) {
+ var b = {};
+ (a = axs.properties.getContrastRatioProperties(a)) && (b.contrastRatio = a);
+ return 0 == Object.keys(b).length ? null : b;
+};
+axs.properties.hasDirectTextDescendant = function(a) {
+ function b() {
+ for (var b = c.evaluate(axs.properties.TEXT_CONTENT_XPATH, a, null, XPathResult.ANY_TYPE, null), e = b.iterateNext();null != e;e = b.iterateNext()) {
+ if (e === a) {
+ return !0;
+ }
+ }
+ return !1;
+ }
+ var c;
+ c = a.nodeType == Node.DOCUMENT_NODE ? a : a.ownerDocument;
+ return c.evaluate ? b() : function() {
+ for (var b = c.createTreeWalker(a, NodeFilter.SHOW_TEXT, null, !1);b.nextNode();) {
+ var e = b.currentNode, f = e.parentNode, f = f.host || f, f = f.tagName.toLowerCase();
+ if (e.nodeValue.trim() && "script" !== f && a !== e) {
+ return !0;
+ }
+ }
+ return !1;
+ }();
+};
+axs.properties.getContrastRatioProperties = function(a) {
+ if (!axs.properties.hasDirectTextDescendant(a)) {
+ return null;
+ }
+ var b = {}, c = window.getComputedStyle(a, null), d = axs.utils.getBgColor(c, a);
+ if (!d) {
+ return null;
+ }
+ b.backgroundColor = axs.color.colorToString(d);
+ var e = axs.utils.getFgColor(c, a, d);
+ b.foregroundColor = axs.color.colorToString(e);
+ a = axs.utils.getContrastRatioForElementWithComputedStyle(c, a);
+ if (!a) {
+ return null;
+ }
+ b.value = a.toFixed(2);
+ axs.utils.isLowContrast(a, c) && (b.alert = !0);
+ var f = axs.utils.isLargeFont(c) ? 3 : 4.5, c = axs.utils.isLargeFont(c) ? 4.5 : 7, g = {};
+ f > a && (g.AA = f);
+ c > a && (g.AAA = c);
+ if (!Object.keys(g).length) {
+ return b;
+ }
+ (d = axs.color.suggestColors(d, e, g)) && Object.keys(d).length && (b.suggestedColors = d);
+ return b;
+};
+axs.properties.findTextAlternatives = function(a, b, c, d) {
+ var e = c || !1;
+ c = axs.dom.asElement(a);
+ if (!c || !d && axs.utils.isElementOrAncestorHidden(c)) {
+ return null;
+ }
+ if (a.nodeType == Node.TEXT_NODE) {
+ return c = {type:"text"}, c.text = a.textContent, c.lastWord = axs.properties.getLastWord(c.text), b.content = c, a.textContent;
+ }
+ a = null;
+ e || (a = axs.properties.getTextFromAriaLabelledby(c, b));
+ if (c.hasAttribute("aria-label")) {
+ var f = {type:"text"};
+ f.text = c.getAttribute("aria-label");
+ f.lastWord = axs.properties.getLastWord(f.text);
+ a ? f.unused = !0 : e && axs.utils.elementIsHtmlControl(c) || (a = f.text);
+ b.ariaLabel = f;
+ }
+ c.hasAttribute("role") && "presentation" == c.getAttribute("role") || (a = axs.properties.getTextFromHostLanguageAttributes(c, b, a, e));
+ e && axs.utils.elementIsHtmlControl(c) && (f = c.ownerDocument.defaultView, c instanceof f.HTMLInputElement && ("text" == c.type && c.value && 0 < c.value.length && (b.controlValue = {text:c.value}), "range" == c.type && (b.controlValue = {text:c.value})), c instanceof f.HTMLSelectElement && (b.controlValue = {text:c.value}), b.controlValue && (f = b.controlValue, a ? f.unused = !0 : a = f.text));
+ if (e && axs.utils.elementIsAriaWidget(c)) {
+ e = c.getAttribute("role");
+ "textbox" == e && c.textContent && 0 < c.textContent.length && (b.controlValue = {text:c.textContent});
+ if ("slider" == e || "spinbutton" == e) {
+ c.hasAttribute("aria-valuetext") ? b.controlValue = {text:c.getAttribute("aria-valuetext")} : c.hasAttribute("aria-valuenow") && (b.controlValue = {value:c.getAttribute("aria-valuenow"), text:"" + c.getAttribute("aria-valuenow")});
+ }
+ if ("menu" == e) {
+ for (var g = c.querySelectorAll("[role=menuitemcheckbox], [role=menuitemradio]"), f = [], h = 0;h < g.length;h++) {
+ "true" == g[h].getAttribute("aria-checked") && f.push(g[h]);
+ }
+ if (0 < f.length) {
+ g = "";
+ for (h = 0;h < f.length;h++) {
+ g += axs.properties.findTextAlternatives(f[h], {}, !0), h < f.length - 1 && (g += ", ");
+ }
+ b.controlValue = {text:g};
+ }
+ }
+ if ("combobox" == e || "select" == e) {
+ b.controlValue = {text:"TODO"};
+ }
+ b.controlValue && (f = b.controlValue, a ? f.unused = !0 : a = f.text);
+ }
+ f = !0;
+ c.hasAttribute("role") && (e = c.getAttribute("role"), (e = axs.constants.ARIA_ROLES[e]) && (!e.namefrom || 0 > e.namefrom.indexOf("contents")) && (f = !1));
+ (d = axs.properties.getTextFromDescendantContent(c, d)) && f && (e = {type:"text"}, e.text = d, e.lastWord = axs.properties.getLastWord(e.text), a ? e.unused = !0 : a = d, b.content = e);
+ c.hasAttribute("title") && (d = {type:"string", valid:!0}, d.text = c.getAttribute("title"), d.lastWord = axs.properties.getLastWord(d.lastWord), a ? d.unused = !0 : a = d.text, b.title = d);
+ return 0 == Object.keys(b).length && null == a ? null : a;
+};
+axs.properties.getTextFromDescendantContent = function(a, b) {
+ for (var c = a.childNodes, d = [], e = 0;e < c.length;e++) {
+ var f = axs.properties.findTextAlternatives(c[e], {}, !0, b);
+ f && d.push(f.trim());
+ }
+ if (d.length) {
+ c = "";
+ for (e = 0;e < d.length;e++) {
+ c = [c, d[e]].join(" ").trim();
+ }
+ return c;
+ }
+ return null;
+};
+axs.properties.getTextFromAriaLabelledby = function(a, b) {
+ var c = null;
+ if (!a.hasAttribute("aria-labelledby")) {
+ return c;
+ }
+ for (var d = a.getAttribute("aria-labelledby").split(/\s+/), e = {valid:!0}, f = [], g = [], h = 0;h < d.length;h++) {
+ var k = {type:"element"}, m = d[h];
+ k.value = m;
+ var l = document.getElementById(m);
+ l ? (k.valid = !0, k.text = axs.properties.findTextAlternatives(l, {}, !0, !0), k.lastWord = axs.properties.getLastWord(k.text), f.push(k.text), k.element = l) : (k.valid = !1, e.valid = !1, k.errorMessage = {messageKey:"noElementWithId", args:[m]});
+ g.push(k);
+ }
+ 0 < g.length && (g[g.length - 1].last = !0, e.values = g, e.text = f.join(" "), e.lastWord = axs.properties.getLastWord(e.text), c = e.text, b.ariaLabelledby = e);
+ return c;
+};
+axs.properties.getTextFromHostLanguageAttributes = function(a, b, c, d) {
+ if (axs.browserUtils.matchSelector(a, "img") && a.hasAttribute("alt")) {
+ var e = {type:"string", valid:!0};
+ e.text = a.getAttribute("alt");
+ c ? e.unused = !0 : c = e.text;
+ b.alt = e;
+ }
+ if (axs.browserUtils.matchSelector(a, 'input:not([type="hidden"]):not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), video:not([disabled])') && !d) {
+ if (a.hasAttribute("id")) {
+ d = document.querySelectorAll('label[for="' + a.id + '"]');
+ for (var e = {}, f = [], g = [], h = 0;h < d.length;h++) {
+ var k = {type:"element"}, m = d[h], l = axs.properties.findTextAlternatives(m, {}, !0);
+ l && 0 < l.trim().length && (k.text = l.trim(), g.push(l.trim()));
+ k.element = m;
+ f.push(k);
+ }
+ 0 < f.length && (f[f.length - 1].last = !0, e.values = f, e.text = g.join(" "), e.lastWord = axs.properties.getLastWord(e.text), c ? e.unused = !0 : c = e.text, b.labelFor = e);
+ }
+ d = axs.dom.parentElement(a);
+ for (e = {};d;) {
+ if ("label" == d.tagName.toLowerCase() && (f = d, f.control == a)) {
+ e.type = "element";
+ e.text = axs.properties.findTextAlternatives(f, {}, !0);
+ e.lastWord = axs.properties.getLastWord(e.text);
+ e.element = f;
+ break;
+ }
+ d = axs.dom.parentElement(d);
+ }
+ e.text && (c ? e.unused = !0 : c = e.text, b.labelWrapped = e);
+ axs.browserUtils.matchSelector(a, 'input[type="image"]') && a.hasAttribute("alt") && (e = {type:"string", valid:!0}, e.text = a.getAttribute("alt"), c ? e.unused = !0 : c = e.text, b.alt = e);
+ Object.keys(b).length || (b.noLabel = !0);
+ }
+ return c;
+};
+axs.properties.getLastWord = function(a) {
+ if (!a) {
+ return null;
+ }
+ var b = a.lastIndexOf(" ") + 1, c = a.length - 10;
+ return a.substring(b > c ? b : c);
+};
+axs.properties.getTextProperties = function(a) {
+ var b = {}, c = axs.properties.findTextAlternatives(a, b, !1, !0);
+ if (0 == Object.keys(b).length && ((a = axs.dom.asElement(a)) && axs.browserUtils.matchSelector(a, "img") && (b.alt = {valid:!1, errorMessage:"No alt value provided"}, a = a.src, "string" == typeof a && (c = a.split("/").pop(), b.filename = {text:c})), !c)) {
+ return null;
+ }
+ b.hasProperties = !!Object.keys(b).length;
+ b.computedText = c;
+ b.lastWord = axs.properties.getLastWord(c);
+ return b;
+};
+axs.properties.getAriaProperties = function(a) {
+ var b = {}, c = axs.properties.getGlobalAriaProperties(a), d;
+ for (d in axs.constants.ARIA_PROPERTIES) {
+ var e = "aria-" + d;
+ if (a.hasAttribute(e)) {
+ var f = a.getAttribute(e);
+ c[e] = axs.utils.getAriaPropertyValue(e, f, a);
+ }
+ }
+ 0 < Object.keys(c).length && (b.properties = axs.utils.values(c));
+ f = axs.utils.getRoles(a);
+ if (!f) {
+ return Object.keys(b).length ? b : null;
+ }
+ b.roles = f;
+ if (!f.valid || !f.roles) {
+ return b;
+ }
+ for (var e = f.roles, g = 0;g < e.length;g++) {
+ var h = e[g];
+ if (h.details && h.details.propertiesSet) {
+ for (d in h.details.propertiesSet) {
+ d in c || (a.hasAttribute(d) ? (f = a.getAttribute(d), c[d] = axs.utils.getAriaPropertyValue(d, f, a), "values" in c[d] && (f = c[d].values, f[f.length - 1].isLast = !0)) : h.details.requiredPropertiesSet[d] && (c[d] = {name:d, valid:!1, reason:"Required property not set"}));
+ }
+ }
+ }
+ 0 < Object.keys(c).length && (b.properties = axs.utils.values(c));
+ return 0 < Object.keys(b).length ? b : null;
+};
+axs.properties.getGlobalAriaProperties = function(a) {
+ var b = {}, c;
+ for (c in axs.constants.GLOBAL_PROPERTIES) {
+ if (a.hasAttribute(c)) {
+ var d = a.getAttribute(c);
+ b[c] = axs.utils.getAriaPropertyValue(c, d, a);
+ }
+ }
+ return b;
+};
+axs.properties.getVideoProperties = function(a) {
+ if (!axs.browserUtils.matchSelector(a, "video")) {
+ return null;
+ }
+ var b = {};
+ b.captionTracks = axs.properties.getTrackElements(a, "captions");
+ b.descriptionTracks = axs.properties.getTrackElements(a, "descriptions");
+ b.chapterTracks = axs.properties.getTrackElements(a, "chapters");
+ return b;
+};
+axs.properties.getTrackElements = function(a, b) {
+ var c = a.querySelectorAll("track[kind=" + b + "]"), d = {};
+ if (!c.length) {
+ return d.valid = !1, d.reason = {messageKey:"noTracksProvided", args:[[b]]}, d;
+ }
+ d.valid = !0;
+ for (var e = [], f = 0;f < c.length;f++) {
+ var g = {}, h = c[f].getAttribute("src"), k = c[f].getAttribute("srcLang"), m = c[f].getAttribute("label");
+ h ? (g.valid = !0, g.src = h) : (g.valid = !1, g.reason = {messageKey:"noSrcProvided"});
+ h = "";
+ m && (h += m, k && (h += " "));
+ k && (h += "(" + k + ")");
+ "" == h && (h = "[[object Object]]");
+ g.name = h;
+ e.push(g);
+ }
+ d.values = e;
+ return d;
+};
+axs.properties.getAllProperties = function(a) {
+ var b = axs.dom.asElement(a);
+ if (!b) {
+ return {};
+ }
+ var c = {};
+ c.ariaProperties = axs.properties.getAriaProperties(b);
+ c.colorProperties = axs.properties.getColorProperties(b);
+ c.focusProperties = axs.properties.getFocusProperties(b);
+ c.textProperties = axs.properties.getTextProperties(a);
+ c.videoProperties = axs.properties.getVideoProperties(b);
+ return c;
+};
+(function() {
+ function a(a) {
+ if (!a) {
+ return null;
+ }
+ var b = a.tagName;
+ if (!b) {
+ return null;
+ }
+ b = b.toUpperCase();
+ b = axs.constants.TAG_TO_IMPLICIT_SEMANTIC_INFO[b];
+ if (!b || !b.length) {
+ return null;
+ }
+ for (var d = null, e = 0, f = b.length;e < f;e++) {
+ var g = b[e];
+ if (g.selector) {
+ if (axs.browserUtils.matchSelector(a, g.selector)) {
+ return g;
+ }
+ } else {
+ d = g;
+ }
+ }
+ return d;
+ }
+ axs.properties.getImplicitRole = function(b) {
+ return (b = a(b)) ? b.role : "";
+ };
+ axs.properties.canTakeAriaAttributes = function(b) {
+ return (b = a(b)) ? !b.reserved : !0;
+ };
+})();
+axs.properties.getNativelySupportedAttributes = function(a) {
+ var b = [];
+ if (!a) {
+ return b;
+ }
+ a = a.cloneNode(!1);
+ for (var c = Object.keys(axs.constants.ARIA_TO_HTML_ATTRIBUTE), d = 0;d < c.length;d++) {
+ var e = c[d];
+ axs.constants.ARIA_TO_HTML_ATTRIBUTE[e] in a && (b[b.length] = e);
+ }
+ return b;
+};
+(function() {
+ var a = {};
+ axs.properties.getSelectorForRole = function(b) {
+ if (!b) {
+ return "";
+ }
+ if (a[b] && a.hasOwnProperty(b)) {
+ return a[b];
+ }
+ var c = ['[role="' + b + '"]'];
+ Object.keys(axs.constants.TAG_TO_IMPLICIT_SEMANTIC_INFO).forEach(function(a) {
+ var d = axs.constants.TAG_TO_IMPLICIT_SEMANTIC_INFO[a];
+ if (d && d.length) {
+ for (var f = 0;f < d.length;f++) {
+ var g = d[f];
+ if (g.role === b) {
+ if (g.selector) {
+ c[c.length] = g.selector;
+ } else {
+ c[c.length] = a;
+ break;
+ }
+ }
+ }
+ }
+ });
+ return a[b] = c.join(",");
+ };
+})();
+axs.AuditRule = function(a) {
+ for (var b = a.opt_requires || {}, c = !0, d = [], e = 0;e < axs.AuditRule.requiredFields.length;e++) {
+ var f = axs.AuditRule.requiredFields[e];
+ f in a || (c = !1, d.push(f));
+ }
+ if (!c) {
+ throw "Invalid spec; the following fields were not specified: " + d.join(", ") + "\n" + JSON.stringify(a);
+ }
+ this.name = a.name;
+ this.severity = a.severity;
+ this.relevantElementMatcher_ = a.relevantElementMatcher;
+ this.isRelevant_ = a.isRelevant || function(a, b) {
+ return !0;
+ };
+ this.test_ = a.test;
+ this.code = a.code;
+ this.heading = a.heading || "";
+ this.url = a.url || "";
+ this.requiresConsoleAPI = !!b.consoleAPI;
+ this.relevantElements = [];
+ this.relatedElements = [];
+ this.collectIdRefs = b.idRefs || !1;
+};
+axs.AuditRule.requiredFields = "name severity relevantElementMatcher test code heading".split(" ");
+axs.AuditRule.NOT_APPLICABLE = {result:axs.constants.AuditResult.NA};
+axs.AuditRule.prototype.addElement = function(a, b) {
+ a.push(b);
+};
+axs.AuditRule.prototype.collectMatchingElement = function(a, b) {
+ return this.relevantElementMatcher_(a, b) && b.inScope ? (this.relevantElements.push({element:a, flags:b}), !0) : !1;
+};
+axs.AuditRule.prototype.canRun = function(a) {
+ return this.disabled || !a.withConsoleApi && this.requiresConsoleAPI ? !1 : !0;
+};
+axs.AuditRule.Result = function(a, b) {
+ var c = axs.utils.namedValues(b);
+ c.severity = a.getSeverity(b.name) || c.severity;
+ this.rule = c;
+ this.maxResults = a.maxResults;
+ this.update(axs.constants.AuditResult.NA);
+};
+axs.AuditRule.Result.prototype.update = function(a, b) {
+ if (a === axs.constants.AuditResult.FAIL) {
+ var c = this.elements || (this.elements = []);
+ this.result = a;
+ this.maxResults && this.elements.length >= this.maxResults ? this.resultsTruncated = !0 : b && c.push(b);
+ } else {
+ a === axs.constants.AuditResult.PASS ? (this.elements || (this.elements = []), this.result !== axs.constants.AuditResult.FAIL && (this.result = a)) : this.result || (this.result = a);
+ }
+};
+axs.AuditRule.prototype.run = function(a) {
+ try {
+ for (var b = this._options || {}, c = new axs.AuditRule.Result(a, this), d;d = this.relevantElements.shift();) {
+ var e = d.element, f = d.flags;
+ this.isRelevant_(e, f) && (this.test_(e, f, b.config) ? c.update(axs.constants.AuditResult.FAIL, e) : c.update(axs.constants.AuditResult.PASS, e));
+ }
+ return c;
+ } finally {
+ this.relatedElements.length = 0;
+ }
+};
+axs.AuditRules = {};
+(function() {
+ var a = {}, b = {};
+ axs.AuditRules.specs = {};
+ axs.AuditRules.addRule = function(c) {
+ var d = new axs.AuditRule(c);
+ if (d.code in b) {
+ throw Error('Can not add audit rule with same code: "' + d.code + '"');
+ }
+ if (d.name in a) {
+ throw Error('Can not add audit rule with same name: "' + d.name + '"');
+ }
+ a[d.name] = b[d.code] = d;
+ axs.AuditRules.specs[c.name] = c;
+ };
+ axs.AuditRules.getRule = function(c) {
+ return a[c] || b[c] || null;
+ };
+ axs.AuditRules.getRules = function(b) {
+ var c = Object.keys(a);
+ return b ? c : c.map(function(a) {
+ return this.getRule(a);
+ }, axs.AuditRules);
+ };
+ axs.AuditRules.getActiveRules = function(a) {
+ var b;
+ b = a.auditRulesToRun && 0 < a.auditRulesToRun.length ? a.auditRulesToRun : axs.AuditRules.getRules(!0);
+ if (a.auditRulesToIgnore) {
+ for (var c = 0;c < a.auditRulesToIgnore.length;c++) {
+ var f = a.auditRulesToIgnore[c];
+ 0 > b.indexOf(f) || b.splice(b.indexOf(f), 1);
+ }
+ }
+ return b.map(axs.AuditRules.getRule);
+ };
+})();
+axs.AuditResults = function() {
+ this.errors_ = [];
+ this.warnings_ = [];
+};
+goog.exportSymbol("axs.AuditResults", axs.AuditResults);
+axs.AuditResults.prototype.addError = function(a) {
+ "" != a && this.errors_.push(a);
+};
+goog.exportProperty(axs.AuditResults.prototype, "addError", axs.AuditResults.prototype.addError);
+axs.AuditResults.prototype.addWarning = function(a) {
+ "" != a && this.warnings_.push(a);
+};
+goog.exportProperty(axs.AuditResults.prototype, "addWarning", axs.AuditResults.prototype.addWarning);
+axs.AuditResults.prototype.numErrors = function() {
+ return this.errors_.length;
+};
+goog.exportProperty(axs.AuditResults.prototype, "numErrors", axs.AuditResults.prototype.numErrors);
+axs.AuditResults.prototype.numWarnings = function() {
+ return this.warnings_.length;
+};
+goog.exportProperty(axs.AuditResults.prototype, "numWarnings", axs.AuditResults.prototype.numWarnings);
+axs.AuditResults.prototype.getErrors = function() {
+ return this.errors_;
+};
+goog.exportProperty(axs.AuditResults.prototype, "getErrors", axs.AuditResults.prototype.getErrors);
+axs.AuditResults.prototype.getWarnings = function() {
+ return this.warnings_;
+};
+goog.exportProperty(axs.AuditResults.prototype, "getWarnings", axs.AuditResults.prototype.getWarnings);
+axs.AuditResults.prototype.toString = function() {
+ for (var a = "", b = 0;b < this.errors_.length;b++) {
+ 0 == b && (a += "\nErrors:\n");
+ var c = this.errors_[b], a = a + (c + "\n\n");
+ }
+ for (b = 0;b < this.warnings_.length;b++) {
+ 0 == b && (a += "\nWarnings:\n"), c = this.warnings_[b], a += c + "\n\n";
+ }
+ return a;
+};
+goog.exportProperty(axs.AuditResults.prototype, "toString", axs.AuditResults.prototype.toString);
+axs.Audit = {};
+axs.AuditConfiguration = function(a) {
+ null == a && (a = {});
+ this.rules_ = {};
+ this.maxResults = this.auditRulesToIgnore = this.auditRulesToRun = this.scope = null;
+ this.withConsoleApi = !1;
+ this.showUnsupportedRulesWarning = this.walkDom = !0;
+ for (var b in this) {
+ this.hasOwnProperty(b) && b in a && (this[b] = a[b]);
+ }
+ goog.exportProperty(this, "scope", this.scope);
+ goog.exportProperty(this, "auditRulesToRun", this.auditRulesToRun);
+ goog.exportProperty(this, "auditRulesToIgnore", this.auditRulesToIgnore);
+ goog.exportProperty(this, "withConsoleApi", this.withConsoleApi);
+ goog.exportProperty(this, "walkDom", this.walkDom);
+ goog.exportProperty(this, "showUnsupportedRulesWarning", this.showUnsupportedRulesWarning);
+};
+goog.exportSymbol("axs.AuditConfiguration", axs.AuditConfiguration);
+axs.AuditConfiguration.prototype = {ignoreSelectors:function(a, b) {
+ a in this.rules_ || (this.rules_[a] = {});
+ "ignore" in this.rules_[a] || (this.rules_[a].ignore = []);
+ Array.prototype.push.call(this.rules_[a].ignore, b);
+}, getIgnoreSelectors:function(a) {
+ return a in this.rules_ && "ignore" in this.rules_[a] ? this.rules_[a].ignore : [];
+}, setSeverity:function(a, b) {
+ a in this.rules_ || (this.rules_[a] = {});
+ this.rules_[a].severity = b;
+}, getSeverity:function(a) {
+ return a in this.rules_ && "severity" in this.rules_[a] ? this.rules_[a].severity : null;
+}, setRuleConfig:function(a, b) {
+ a in this.rules_ || (this.rules_[a] = {});
+ this.rules_[a].config = b;
+}, getRuleConfig:function(a) {
+ return a in this.rules_ && "config" in this.rules_[a] ? this.rules_[a].config : null;
+}};
+goog.exportProperty(axs.AuditConfiguration.prototype, "ignoreSelectors", axs.AuditConfiguration.prototype.ignoreSelectors);
+goog.exportProperty(axs.AuditConfiguration.prototype, "getIgnoreSelectors", axs.AuditConfiguration.prototype.getIgnoreSelectors);
+axs.Audit.unsupportedRulesWarningShown = !1;
+axs.Audit.getRulesCannotRun = function(a) {
+ return a.withConsoleApi ? [] : axs.AuditRules.getRules().filter(function(a) {
+ return a.requiresConsoleAPI;
+ }).map(function(a) {
+ return a.code;
+ });
+};
+axs.Audit.run = function(a) {
+ a = a || new axs.AuditConfiguration;
+ if (!axs.Audit.unsupportedRulesWarningShown && a.showUnsupportedRulesWarning) {
+ var b = axs.Audit.getRulesCannotRun(a);
+ 0 < b.length && (console.warn("Some rules cannot be checked using the axs.Audit.run() method call. Use the Chrome plugin to check these rules: " + b.join(", ")), console.warn("To remove this message, pass an AuditConfiguration object to axs.Audit.run() and set configuration.showUnsupportedRulesWarning = false."));
+ axs.Audit.unsupportedRulesWarningShown = !0;
+ }
+ b = axs.AuditRules.getActiveRules(a);
+ a.collectIdRefs = b.some(function(a) {
+ return a.collectIdRefs;
+ });
+ a.scope || (a.scope = document.documentElement);
+ axs.Audit.collectMatchingElements(a, b);
+ for (var c = [], d = 0;d < b.length;d++) {
+ var e = b[d];
+ e.canRun(a) && c.push(e.run(a));
+ }
+ return c;
+};
+goog.exportSymbol("axs.Audit.run", axs.Audit.run);
+(function() {
+ function a(a, c) {
+ var b = a.getIgnoreSelectors(c.name);
+ if (0 < b.length || a.scope) {
+ this.ignoreSelectors = b;
+ }
+ if (b = a.getRuleConfig(c.name)) {
+ this.config = b;
+ }
+ }
+ axs.Audit.collectMatchingElements = function(b, c) {
+ axs.dom.composedTreeSearch(b.walkDom ? document.documentElement : b.scope, null, {preorder:function(d, e) {
+ e.inScope || (e.inScope = d === b.scope);
+ for (var f = 0;f < c.length;f++) {
+ var g = c[f];
+ g.canRun(b) && (g._options = new a(b, g), e.ignoring[g.name] || (e.ignoring[g.name] = g._options.shouldIgnore(d)) || g.collectMatchingElement(d, e));
+ }
+ return !0;
+ }}, {walkDom:b.walkDom, collectIdRefs:b.collectIdRefs, level:0, ignoring:{}, disabled:!1, hidden:!1});
+ };
+ a.prototype.shouldIgnore = function(a) {
+ var b = this.ignoreSelectors;
+ if (b) {
+ for (var d = 0;d < b.length;d++) {
+ if (axs.browserUtils.matchSelector(a, b[d])) {
+ return !0;
+ }
+ }
+ }
+ return !1;
+ };
+})();
+axs.Audit.auditResults = function(a) {
+ for (var b = new axs.AuditResults, c = 0;c < a.length;c++) {
+ var d = a[c];
+ d.result == axs.constants.AuditResult.FAIL && (d.rule.severity == axs.constants.Severity.SEVERE ? b.addError(axs.Audit.accessibilityErrorMessage(d)) : b.addWarning(axs.Audit.accessibilityErrorMessage(d)));
+ }
+ return b;
+};
+goog.exportSymbol("axs.Audit.auditResults", axs.Audit.auditResults);
+axs.Audit.createReport = function(a, b) {
+ var c;
+ c = "*** Begin accessibility audit results ***\nAn accessibility audit found " + axs.Audit.auditResults(a).toString();
+ b && (c = c + "\nFor more information, please see " + b);
+ return c + "\n*** End accessibility audit results ***";
+};
+goog.exportSymbol("axs.Audit.createReport", axs.Audit.createReport);
+axs.Audit.accessibilityErrorMessage = function(a) {
+ for (var b = a.rule.severity == axs.constants.Severity.SEVERE ? "Error: " : "Warning: ", b = b + (a.rule.code + " (" + a.rule.heading + ") failed on the following " + (1 == a.elements.length ? "element" : "elements")), b = 1 == a.elements.length ? b + ":" : b + (" (1 - " + Math.min(5, a.elements.length) + " of " + a.elements.length + "):"), c = Math.min(a.elements.length, 5), d = 0;d < c;d++) {
+ var e = a.elements[d], b = b + "\n";
+ try {
+ b += axs.utils.getQuerySelectorText(e);
+ } catch (f) {
+ b += " tagName:" + e.tagName, b += " id:" + e.id;
+ }
+ }
+ "" != a.rule.url && (b += "\nSee " + a.rule.url + " for more information.");
+ return b;
+};
+goog.exportSymbol("axs.Audit.accessibilityErrorMessage", axs.Audit.accessibilityErrorMessage);
+axs.AuditRules.addRule({name:"ariaOnReservedElement", heading:"This element does not support ARIA roles, states and properties", url:"https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules#ax_aria_12", severity:axs.constants.Severity.WARNING, relevantElementMatcher:function(a) {
+ return !axs.properties.canTakeAriaAttributes(a);
+}, test:function(a) {
+ return null !== axs.properties.getAriaProperties(a);
+}, code:"AX_ARIA_12"});
+axs.AuditRules.addRule({name:"ariaOwnsDescendant", heading:"aria-owns should not be used if ownership is implicit in the DOM", url:"https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules#ax_aria_06", severity:axs.constants.Severity.WARNING, relevantElementMatcher:function(a) {
+ return axs.browserUtils.matchSelector(a, "[aria-owns]");
+}, test:function(a) {
+ return axs.utils.getIdReferents("aria-owns", a).some(function(b) {
+ return a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_CONTAINED_BY;
+ });
+}, code:"AX_ARIA_06"});
+axs.AuditRules.addRule({name:"ariaRoleNotScoped", heading:"Elements with ARIA roles must be in the correct scope", url:"https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules#ax_aria_09", severity:axs.constants.Severity.SEVERE, relevantElementMatcher:function(a) {
+ return axs.browserUtils.matchSelector(a, "[role]");
+}, test:function(a) {
+ var b = axs.utils.getRoles(a);
+ if (!b || !b.applied) {
+ return !1;
+ }
+ b = b.applied.details.scope;
+ if (!b || 0 === b.length) {
+ return !1;
+ }
+ for (var c = a;c = axs.dom.parentElement(c);) {
+ var d = axs.utils.getRoles(c, !0);
+ if (d && d.applied && 0 <= b.indexOf(d.applied.name)) {
+ return !1;
+ }
+ }
+ if (a = axs.utils.getAriaIdReferrers(a, "aria-owns")) {
+ for (c = 0;c < a.length;c++) {
+ if ((d = axs.utils.getRoles(a[c], !0)) && d.applied && 0 <= b.indexOf(d.applied.name)) {
+ return !1;
+ }
+ }
+ }
+ return !0;
+}, code:"AX_ARIA_09"});
+axs.AuditRules.addRule({name:"audioWithoutControls", heading:"Audio elements should have controls", url:"https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules#ax_audio_01", severity:axs.constants.Severity.WARNING, relevantElementMatcher:function(a) {
+ return axs.browserUtils.matchSelector(a, "audio[autoplay]");
+}, test:function(a) {
+ return !a.querySelectorAll("[controls]").length && 3 < a.duration;
+}, code:"AX_AUDIO_01"});
+(function() {
+ var a = /^aria\-/;
+ axs.AuditRules.addRule({name:"badAriaAttribute", heading:"This element has an invalid ARIA attribute", url:"https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules#ax_aria_11", severity:axs.constants.Severity.WARNING, relevantElementMatcher:function(b) {
+ b = b.attributes;
+ for (var c = 0, d = b.length;c < d;c++) {
+ if (a.test(b[c].name)) {
+ return !0;
+ }
+ }
+ return !1;
+ }, test:function(b) {
+ b = b.attributes;
+ for (var c = 0, d = b.length;c < d;c++) {
+ var e = b[c].name;
+ if (a.test(e) && (e = e.replace(a, ""), !axs.constants.ARIA_PROPERTIES.hasOwnProperty(e))) {
+ return !0;
+ }
+ }
+ return !1;
+ }, code:"AX_ARIA_11"});
+})();
+axs.AuditRules.addRule({name:"badAriaAttributeValue", heading:"ARIA state and property values must be valid", url:"https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules#ax_aria_04", severity:axs.constants.Severity.SEVERE, relevantElementMatcher:function(a) {
+ var b = axs.utils.getSelectorForAriaProperties(axs.constants.ARIA_PROPERTIES);
+ return axs.browserUtils.matchSelector(a, b);
+}, test:function(a) {
+ for (var b in axs.constants.ARIA_PROPERTIES) {
+ var c = "aria-" + b;
+ if (a.hasAttribute(c)) {
+ var d = a.getAttribute(c);
+ if (!axs.utils.getAriaPropertyValue(c, d, a).valid) {
+ return !0;
+ }
+ }
+ }
+ return !1;
+}, code:"AX_ARIA_04"});
+axs.AuditRules.addRule({name:"badAriaRole", heading:"Elements with ARIA roles must use a valid, non-abstract ARIA role", url:"https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules#ax_aria_01", severity:axs.constants.Severity.SEVERE, relevantElementMatcher:function(a) {
+ return axs.browserUtils.matchSelector(a, "[role]");
+}, test:function(a) {
+ return !axs.utils.getRoles(a).valid;
+}, code:"AX_ARIA_01"});
+axs.AuditRules.addRule({name:"controlsWithoutLabel", heading:"Controls and media elements should have labels", url:"https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules#ax_text_01", severity:axs.constants.Severity.SEVERE, relevantElementMatcher:function(a) {
+ if (!axs.browserUtils.matchSelector(a, 'input:not([type="hidden"]):not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), video:not([disabled])') || "presentation" == a.getAttribute("role")) {
+ return !1;
+ }
+ if (0 <= a.tabIndex) {
+ return !0;
+ }
+ for (a = axs.dom.parentElement(a);null != a;a = axs.dom.parentElement(a)) {
+ if (axs.utils.elementIsAriaWidget(a)) {
+ return !1;
+ }
+ }
+ return !0;
+}, test:function(a, b) {
+ if (b.hidden || "input" == a.tagName.toLowerCase() && "button" == a.type && a.value.length || "button" == a.tagName.toLowerCase() && a.textContent.replace(/^\s+|\s+$/g, "").length || axs.utils.hasLabel(a)) {
+ return !1;
+ }
+ var c = axs.properties.findTextAlternatives(a, {});
+ return null === c || "" === c.trim() ? !0 : !1;
+}, code:"AX_TEXT_01", ruleName:"Controls and media elements should have labels"});
+axs.AuditRules.addRule({name:"duplicateId", heading:"Any ID referred to via an IDREF must be unique in the DOM", url:"https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules#ax_html_02", severity:axs.constants.Severity.SEVERE, opt_requires:{idRefs:!0}, relevantElementMatcher:function(a, b) {
+ b.idrefs.length && !b.hidden && this.relatedElements.push({element:a, flags:b});
+ return a.hasAttribute("id") ? !0 : !1;
+}, isRelevant:function(a, b) {
+ var c = a.id, d = b.level;
+ return this.relatedElements.some(function(a) {
+ var b = a.flags.idrefs;
+ return a.flags.level === d && 0 <= b.indexOf(c);
+ });
+}, test:function(a) {
+ var b = "[id='" + a.id.replace(/'/g, "\\'") + "']";
+ return 1 < a.ownerDocument.querySelectorAll(b).length;
+}, code:"AX_HTML_02"});
+
+ return axs;
+});
+
+// Define AMD module if possible, export globals otherwise.
+if (typeof define !== 'undefined' && define.amd) {
+ define([], fn);
+} else {
+ var axs = fn.call(this);
+}
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/main.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/main.js
new file mode 100644
index 00000000000..d92b110b437
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/accessibility-developer-tools/main.js
@@ -0,0 +1,7 @@
+// This exposes the ./dist Javascript file for node libraries.
+// It also unwraps the main axs package so Audit and other objects are exposed
+// directly in the node library
+
+var library = require('./dist/js/axs_testing'); // eslint-disable-line no-undef
+
+module.exports = library.axs; // eslint-disable-line no-undef
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/.bower.json
new file mode 100644
index 00000000000..47ef0f0a925
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/.bower.json
@@ -0,0 +1,75 @@
+{
+ "name": "app-route",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "description": "App routing expressed as Polymer Custom Elements.",
+ "main": [
+ "app-route.html",
+ "app-location.html",
+ "app-route-converter.html"
+ ],
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/app-route",
+ "private": true,
+ "ignore": [],
+ "dependencies": {
+ "iron-location": "PolymerElements/iron-location#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "google-youtube": "GoogleWebComponents/google-youtube#1 - 2",
+ "iron-component-page": "polymerelements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-pages": "PolymerElements/iron-pages#1 - 2",
+ "iron-test-helpers": "polymerelements/iron-test-helpers#1 - 2",
+ "paper-card": "PolymerElements/paper-card#1 - 2",
+ "paper-icon-button": "polymerelements/paper-icon-button#1 - 2",
+ "paper-input": "polymerelements/paper-input#1 - 2",
+ "paper-spinner": "PolymerElements/paper-spinner#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "paper-toggle-button": "polymerelements/paper-toggle-button#1 - 2",
+ "url": "webcomponents/URL#^0.5.7",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-location": "polymerelements/iron-location#^0.8.1",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "google-youtube": "GoogleWebComponents/google-youtube#^1.2.1",
+ "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.2.0",
+ "iron-pages": "PolymerElements/iron-pages#^1.0.7",
+ "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0",
+ "paper-card": "PolymerElements/paper-card#^1.1.1",
+ "paper-icon-button": "polymerelements/paper-icon-button#^v1.0.0",
+ "paper-input": "polymerelements/paper-input#^1.1.2",
+ "paper-spinner": "PolymerElements/paper-spinner#^1.1.1",
+ "paper-styles": "polymerelements/paper-styles#^1.0.13",
+ "paper-toggle-button": "polymerelements/paper-toggle-button#^1.0.0",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "version": "2.1.1",
+ "_release": "2.1.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.1",
+ "commit": "af8e578831240fd52671a2ca40b726ee21bcd4ed"
+ },
+ "_source": "https://github.com/PolymerElements/app-route.git",
+ "_target": "*",
+ "_originalSource": "PolymerElements/app-route"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/.github/CODEOWNERS
new file mode 100644
index 00000000000..9ef9eb64211
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @e111077
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..0c018d64fc7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/app-route/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/hirore/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+* Open the page in a web browser.
+* Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/.travis.yml
new file mode 100644
index 00000000000..78ddb9fec50
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/.travis.yml
@@ -0,0 +1,32 @@
+language: node_js
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e '\n\033[31mERROR:\033[0m
+ Typings are stale. Please run "npm run format".' && false)
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+env:
+ global:
+ - secure: >-
+ WdFRmsbFi5zjdD/yaGR0HITPFsjSWeVYj8JcLE95nUN0fkkJuNh/A0/cDHDcDpxzY4xCNdc/IwPTtE4+awCGavot71OXlpEYD8aZUdVw9VcYVTc1IG2B/hgFcdYhXHYOLbs7JlOA/H6/RSiOensRv7QESNY2cMGzRsccav9jdAbLJqHNPI5orMRBT6/H5roZvXXEn5XmIemjCMwtGlqUeRd3nHM2n0PsQKETb+8Y04fTFuqggSEVt/SgU/UdNNm2T2mVFUDWChvjAM36l4FvgUKZm8gh2CYrXc0rHOVt7BCJN5OzZSwCmxxauhUe+7QOgZO3UE5l+M+MX9CjnSdy/HJRauMJy2eCSr9RDoChPKZOC14QrZff06L9WhDnVEHkz8PN2mwP73/uDVYyJC9Szs+4MSKK+WEIIiywEnxCp2Nq9eBNoWNDySOaud+9WxLosh01bTvytVZrd3Lqkf3MUm2sJ+v17e4JagW13zwBXjxnLP1V+H+IP/imrRRV9x5gdvK+9iL3ZYsIQmcEkqNlWrqHe3eZTgpkc/HhewfZCu49ClM6pnoJiC/7/YM3CarwkfMhGJKDU5iXfJiQABIfZ3XhTKG7nltz6VRpm8eFwxInpxNAIBghkz6PGeESHgtmsoQKtGqAg7+cRfjTS9uLMVomYHWPz0brCIQloAjSKc8=
+ - secure: >-
+ k6zYpUF0NdxNqVyfCbEztJ25Z229mpcvSdHfkOF8YqFse+1CkSR1M83Dts1K34eK43Yov375YJ/Op/MXEA0wrbnyEDg/AvwqBv5XZTslIvOjA1WvZJDGBiaZ6lvqs6tEhLfB79eZvTHP8DSDlLabklDAPaio1VC+Q6zyLIlsTIr6fH1VK1gX/uHkvSGKl8C9bfeGHgFlXaWmShN+FvLwW4PiRw2MwzXeq/qQqfS0Nn3gtuGN2kNNBpKVJwcDkYDOcJ2+49ojF8RAdbt8hsZkjGq21hpY6eKhbte66guN7lRTKY5+g2aLkg1CrBp9ZHZ4kAlfbhibhiLt/W1UbXUL/nnTFkrotuJ6vdU6gLN0EhjZN3bMAtKqHC+Bl2223ClNMs17iXReSqqOSc9D3gL9b3FYqQElS4bQIa+0L76TbkMM/H6ilQjSIvVnUXLszMIeyliIVpnI0ClTUbqe5Et51urk+KjJrOE95wyxkiL2bzKxcXCLzdvSy0nxwwcu7DnBQPG0Fg6/JVRMHM17PDhjgQLSvKr8wXtO042xzAosoZuDVOHHgpA5v9iKI/xPUseu3utfBT5ZGcyjKKuxI9Dsjoi4Go0B6uQ4rY/XUp+k4aa1Ucg3Ngx8zYgzJlFGiZq7OnG+quSTpZ32hpQqDmtYKNMxf5p/YRhxWSeuBWheLeQ=
+dist: trusty
+sudo: required
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/CONTRIBUTING.md
new file mode 100644
index 00000000000..34d615448b5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/hirore/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/hirore/edit?html,output](https://jsbin.com/hirore/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/README.md
new file mode 100644
index 00000000000..b388b599f4d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/README.md
@@ -0,0 +1,217 @@
+
+<!---
+
+This README is automatically generated from the comments in these files:
+app-location.html app-route-converter-behavior.html app-route-converter.html app-route.html
+
+Edit those files, and our readme bot will duplicate them over here!
+Edit this file, and the bot will squash your changes :)
+
+The bot does some handling of markdown. Please file a bug if it does the wrong
+thing! https://github.com/PolymerLabs/tedium/issues
+
+-->
+
+[![Build status](https://travis-ci.org/PolymerElements/app-route.svg?branch=master)](https://travis-ci.org/PolymerElements/app-route)
+
+
+## &lt;app-route&gt;
+
+`app-route` is an element that enables declarative, self-describing routing
+for a web app.
+
+> *n.b. app-route is still in beta. We expect it will need some changes. We're counting on your feedback!*
+
+In its typical usage, a `app-route` element consumes an object that describes
+some state about the current route, via the `route` property. It then parses
+that state using the `pattern` property, and produces two artifacts: some `data`
+related to the `route`, and a `tail` that contains the rest of the `route` that
+did not match.
+
+Here is a basic example, when used with `app-location`:
+
+```html
+<app-location route="{{route}}"></app-location>
+<app-route
+ route="{{route}}"
+ pattern="/:page"
+ data="{{data}}"
+ tail="{{tail}}">
+</app-route>
+```
+
+In the above example, the `app-location` produces a `route` value. Then, the
+`route.path` property is matched by comparing it to the `pattern` property. If
+the `pattern` property matches `route.path`, the `app-route` will set or update
+its `data` property with an object whose properties correspond to the parameters
+in `pattern`. So, in the above example, if `route.path` was `'/about'`, the value
+of `data` would be `{"page": "about"}`.
+
+The `tail` property represents the remaining part of the route state after the
+`pattern` has been applied to a matching `route`.
+
+Here is another example, where `tail` is used:
+
+```html
+<app-location route="{{route}}"></app-location>
+<app-route
+ route="{{route}}"
+ pattern="/:page"
+ data="{{routeData}}"
+ tail="{{subroute}}">
+</app-route>
+<app-route
+ route="{{subroute}}"
+ pattern="/:id"
+ data="{{subrouteData}}">
+</app-route>
+```
+
+In the above example, there are two `app-route` elements. The first
+`app-route` consumes a `route`. When the `route` is matched, the first
+`app-route` also produces `routeData` from its `data`, and `subroute` from
+its `tail`. The second `app-route` consumes the `subroute`, and when it
+matches, it produces an object called `subrouteData` from its `data`.
+
+So, when `route.path` is `'/about'`, the `routeData` object will look like
+this: `{ page: 'about' }`
+
+And `subrouteData` will be null. However, if `route.path` changes to
+`'/article/123'`, the `routeData` object will look like this:
+`{ page: 'article' }`
+
+And the `subrouteData` will look like this: `{ id: '123' }`
+
+`app-route` is responsive to bi-directional changes to the `data` objects
+they produce. So, if `routeData.page` changed from `'article'` to `'about'`,
+the `app-route` will update `route.path`. This in-turn will update the
+`app-location`, and cause the global location bar to change its value.
+
+
+
+## &lt;app-location&gt;
+
+`app-location` is an element that provides synchronization between the
+browser location bar and the state of an app. When created, `app-location`
+elements will automatically watch the global location for changes. As changes
+occur, `app-location` produces and updates an object called `route`. This
+`route` object is suitable for passing into a `app-route`, and other similar
+elements.
+
+An example of the public API of a route object that describes the URL
+`https://elements.polymer-project.org/elements/app-location`:
+
+```css
+{
+ prefix: '',
+ path: '/elements/app-location'
+}
+```
+
+Example Usage:
+
+```html
+<app-location route="{{route}}"></app-location>
+<app-route route="{{route}}" pattern="/:page" data="{{data}}"></app-route>
+```
+
+As you can see above, the `app-location` element produces a `route` and that
+property is then bound into the `app-route` element. The bindings are two-
+directional, so when changes to the `route` object occur within `app-route`,
+they automatically reflect back to the global location.
+
+### Hashes vs Paths
+
+By default `app-location` routes uses the pathname portion of the URL. This has
+broad browser support but it does require cooperation of the backend server. An
+`app-location` can be configured to use the hash part of a URL instead using
+the `use-hash-as-path` attribute, like so:
+
+```html
+<app-location route="{{route}}" use-hash-as-path></app-location>
+```
+
+### Integrating with other routing code
+
+There is no standard event that is fired when window.location is modified.
+`app-location` fires a `location-changed` event on `window` when it updates the
+location. It also listens for that same event, and re-reads the URL when it's
+fired. This makes it very easy to interop with other routing code.
+
+So for example if you want to navigate to `/new_path` imperatively you could
+call `window.location.pushState` or `window.location.replaceState` followed by
+firing a `location-changed` event on `window`. i.e.
+
+```javascript
+window.history.pushState({}, null, '/new_path');
+window.dispatchEvent(new CustomEvent('location-changed'));
+```
+
+
+
+## &lt;app-route-converter&gt;
+
+`app-route-converter` provides a means to convert a path and query
+parameters into a route object and vice versa. This produced route object
+is to be fed into route-consuming elements such as `app-route`.
+
+> n.b. This element is intended to be a primitive of the routing system and for
+creating bespoke routing solutions from scratch. To simply include routing in
+an app, please refer to [app-location](https://github.com/PolymerElements/app-route/blob/master/app-location.html)
+and [app-route](https://github.com/PolymerElements/app-route/blob/master/app-route.html).
+
+An example of a route object that describes
+`https://elements.polymer-project.org/elements/app-route-converter?foo=bar&baz=qux`
+and should be passed to other `app-route` elements:
+
+```css
+{
+ prefix: '',
+ path: '/elements/app-route-converter',
+ __queryParams: {
+ foo: 'bar',
+ baz: 'qux'
+ }
+}
+```
+
+`__queryParams` is private to discourage directly data-binding to it. This is so
+that routing elements like `app-route` can intermediate changes to the query
+params and choose whether to propagate them upstream or not. `app-route` for
+example will not propagate changes to its `queryParams` property if it is not
+currently active. A public queryParams object will also be produced in which you
+should perform data-binding operations.
+
+Example Usage:
+
+```html
+<iron-location path="{{path}}" query="{{query}}"></iron-location>
+<iron-query-params
+ params-string="{{query}}"
+ params-object="{{queryParams}}">
+</iron-query-params>
+<app-route-converter
+ path="{{path}}"
+ query-params="{{queryParams}}"
+ route="{{route}}">
+</app-route-converter>
+<app-route route='{{route}}' pattern='/:page' data='{{data}}'>
+</app-route>
+```
+
+This is a simplified implementation of the `app-location` element. Here the
+`iron-location` produces a path and a query, the `iron-query-params` consumes
+the query and produces a queryParams object, and the `app-route-converter`
+consumes the path and the query params and converts it into a route which is in
+turn is consumed by the `app-route`.
+
+
+
+## Polymer.AppRouteConverterBehavior
+
+Provides bidirectional mapping between `path` and `queryParams` and a
+app-route compatible `route` object.
+
+For more information, see the docs for `app-route-converter`.
+
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-location.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-location.d.ts
new file mode 100644
index 00000000000..edc2b8c8e67
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-location.d.ts
@@ -0,0 +1,126 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * app-location.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-location/iron-location.d.ts" />
+/// <reference path="../iron-location/iron-query-params.d.ts" />
+/// <reference path="app-route-converter-behavior.d.ts" />
+
+/**
+ * `app-location` is an element that provides synchronization between the
+ * browser location bar and the state of an app. When created, `app-location`
+ * elements will automatically watch the global location for changes. As changes
+ * occur, `app-location` produces and updates an object called `route`. This
+ * `route` object is suitable for passing into a `app-route`, and other similar
+ * elements.
+ *
+ * An example of the public API of a route object that describes the URL
+ * `https://elements.polymer-project.org/elements/app-location`:
+ *
+ * {
+ * prefix: '',
+ * path: '/elements/app-location'
+ * }
+ *
+ * Example Usage:
+ *
+ * <app-location route="{{route}}"></app-location>
+ * <app-route route="{{route}}" pattern="/:page" data="{{data}}"></app-route>
+ *
+ * As you can see above, the `app-location` element produces a `route` and that
+ * property is then bound into the `app-route` element. The bindings are two-
+ * directional, so when changes to the `route` object occur within `app-route`,
+ * they automatically reflect back to the global location.
+ *
+ * ### Hashes vs Paths
+ *
+ * By default `app-location` routes using the pathname portion of the URL. This has
+ * broad browser support but it does require cooperation of the backend server. An
+ * `app-location` can be configured to use the hash part of a URL instead using
+ * the `use-hash-as-path` attribute, like so:
+ *
+ * <app-location route="{{route}}" use-hash-as-path></app-location>
+ *
+ * ### Integrating with other routing code
+ *
+ * There is no standard event that is fired when window.location is modified.
+ * `app-location` fires a `location-changed` event on `window` when it updates the
+ * location. It also listens for that same event, and re-reads the URL when it's
+ * fired. This makes it very easy to interop with other routing code.
+ *
+ * So for example if you want to navigate to `/new_path` imperatively you could
+ * call `window.location.pushState` or `window.location.replaceState` followed by
+ * firing a `location-changed` event on `window`. i.e.
+ *
+ * window.history.pushState({}, null, '/new_path');
+ * window.dispatchEvent(new CustomEvent('location-changed'));
+ */
+interface AppLocationElement extends Polymer.Element, Polymer.AppRouteConverterBehavior {
+
+ /**
+ * A model representing the deserialized path through the route tree, as
+ * well as the current queryParams.
+ */
+ route: object|null|undefined;
+
+ /**
+ * The route path, which will be either the hash or the path, depending
+ * on useHashAsPath.
+ */
+ path: string|null|undefined;
+
+ /**
+ * In many scenarios, it is convenient to treat the `hash` as a stand-in
+ * alternative to the `path`. For example, if deploying an app to a static
+ * web server (e.g., Github Pages) - where one does not have control over
+ * server-side routing - it is usually a better experience to use the hash
+ * to represent paths through one's app.
+ *
+ * When this property is set to true, the `hash` will be used in place of
+ *
+ * the `path` for generating a `route`.
+ */
+ useHashAsPath: boolean|null|undefined;
+
+ /**
+ * A regexp that defines the set of URLs that should be considered part
+ * of this web app.
+ *
+ * Clicking on a link that matches this regex won't result in a full page
+ * navigation, but will instead just update the URL state in place.
+ *
+ * This regexp is given everything after the origin in an absolute
+ * URL. So to match just URLs that start with /search/ do:
+ * url-space-regex="^/search/"
+ */
+ urlSpaceRegex: string|RegExp|null;
+
+ /**
+ * Whether or not the ready function has been called.
+ */
+ _isReady: boolean|null|undefined;
+
+ /**
+ * If the user was on a URL for less than `dwellTime` milliseconds, it
+ * won't be added to the browser's history, but instead will be
+ * replaced by the next entry.
+ *
+ * This is to prevent large numbers of entries from clogging up the
+ * user's browser history. Disable by setting to a negative number.
+ *
+ * See `iron-location` for more information.
+ */
+ dwellTime: number|null|undefined;
+ ready(): void;
+}
+
+interface HTMLElementTagNameMap {
+ "app-location": AppLocationElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-location.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-location.html
new file mode 100644
index 00000000000..c1cfeffffad
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-location.html
@@ -0,0 +1,218 @@
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-location/iron-location.html">
+<link rel="import" href="../iron-location/iron-query-params.html">
+<link rel="import" href="app-route-converter-behavior.html">
+
+<!--
+`app-location` is an element that provides synchronization between the
+browser location bar and the state of an app. When created, `app-location`
+elements will automatically watch the global location for changes. As changes
+occur, `app-location` produces and updates an object called `route`. This
+`route` object is suitable for passing into a `app-route`, and other similar
+elements.
+
+An example of the public API of a route object that describes the URL
+`https://elements.polymer-project.org/elements/app-location`:
+
+ {
+ prefix: '',
+ path: '/elements/app-location'
+ }
+
+Example Usage:
+
+ <app-location route="{{route}}"></app-location>
+ <app-route route="{{route}}" pattern="/:page" data="{{data}}"></app-route>
+
+As you can see above, the `app-location` element produces a `route` and that
+property is then bound into the `app-route` element. The bindings are two-
+directional, so when changes to the `route` object occur within `app-route`,
+they automatically reflect back to the global location.
+
+### Hashes vs Paths
+
+By default `app-location` routes using the pathname portion of the URL. This has
+broad browser support but it does require cooperation of the backend server. An
+`app-location` can be configured to use the hash part of a URL instead using
+the `use-hash-as-path` attribute, like so:
+
+ <app-location route="{{route}}" use-hash-as-path></app-location>
+
+### Integrating with other routing code
+
+There is no standard event that is fired when window.location is modified.
+`app-location` fires a `location-changed` event on `window` when it updates the
+location. It also listens for that same event, and re-reads the URL when it's
+fired. This makes it very easy to interop with other routing code.
+
+So for example if you want to navigate to `/new_path` imperatively you could
+call `window.location.pushState` or `window.location.replaceState` followed by
+firing a `location-changed` event on `window`. i.e.
+
+ window.history.pushState({}, null, '/new_path');
+ window.dispatchEvent(new CustomEvent('location-changed'));
+
+@element app-location
+@demo demo/index.html
+-->
+<dom-module id="app-location">
+ <template>
+ <iron-query-params
+ params-string="{{__query}}"
+ params-object="{{queryParams}}">
+ </iron-query-params>
+ <iron-location
+ path="{{__path}}"
+ query="{{__query}}"
+ hash="{{__hash}}"
+ url-space-regex="[[urlSpaceRegex]]"
+ dwell-time="[[dwellTime]]">
+ </iron-location>
+ </template>
+ <script>
+ (function() {
+ 'use strict';
+
+ Polymer({
+ is: 'app-location',
+
+ properties: {
+ /**
+ * A model representing the deserialized path through the route tree, as
+ * well as the current queryParams.
+ */
+ route: {
+ type: Object,
+ notify: true,
+ },
+
+ /**
+ * In many scenarios, it is convenient to treat the `hash` as a stand-in
+ * alternative to the `path`. For example, if deploying an app to a static
+ * web server (e.g., Github Pages) - where one does not have control over
+ * server-side routing - it is usually a better experience to use the hash
+ * to represent paths through one's app.
+ *
+ * When this property is set to true, the `hash` will be used in place of
+
+ * the `path` for generating a `route`.
+ */
+ useHashAsPath: {
+ type: Boolean,
+ value: false,
+ },
+
+ /**
+ * A regexp that defines the set of URLs that should be considered part
+ * of this web app.
+ *
+ * Clicking on a link that matches this regex won't result in a full page
+ * navigation, but will instead just update the URL state in place.
+ *
+ * This regexp is given everything after the origin in an absolute
+ * URL. So to match just URLs that start with /search/ do:
+ * url-space-regex="^/search/"
+ *
+ * @type {string|RegExp}
+ */
+ urlSpaceRegex: {
+ type: String,
+ notify: true,
+ },
+
+ /**
+ * A set of key/value pairs that are universally accessible to branches
+ * of the route tree.
+ */
+ __queryParams: {
+ type: Object,
+ },
+
+ /**
+ * The pathname component of the current URL.
+ */
+ __path: {
+ type: String,
+ },
+
+ /**
+ * The query string portion of the current URL.
+ */
+ __query: {
+ type: String,
+ },
+
+ /**
+ * The hash portion of the current URL.
+ */
+ __hash: {
+ type: String,
+ },
+
+ /**
+ * The route path, which will be either the hash or the path, depending
+ * on useHashAsPath.
+ */
+ path: {
+ type: String,
+ observer: '__onPathChanged',
+ },
+
+ /**
+ * Whether or not the ready function has been called.
+ */
+ _isReady: {
+ type: Boolean,
+ },
+
+ /**
+ * If the user was on a URL for less than `dwellTime` milliseconds, it
+ * won't be added to the browser's history, but instead will be
+ * replaced by the next entry.
+ *
+ * This is to prevent large numbers of entries from clogging up the
+ * user's browser history. Disable by setting to a negative number.
+ *
+ * See `iron-location` for more information.
+ */
+ dwellTime: {
+ type: Number,
+ }
+ },
+
+ behaviors: [Polymer.AppRouteConverterBehavior],
+
+ observers: ['__computeRoutePath(useHashAsPath, __hash, __path)'],
+
+ ready: function() {
+ this._isReady = true;
+ },
+
+ __computeRoutePath: function() {
+ this.path = this.useHashAsPath ? this.__hash : this.__path;
+ },
+
+ __onPathChanged: function() {
+ if (!this._isReady) {
+ return;
+ }
+
+ if (this.useHashAsPath) {
+ this.__hash = this.path;
+ } else {
+ this.__path = this.path;
+ }
+ }
+ });
+ })();
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route-converter-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route-converter-behavior.d.ts
new file mode 100644
index 00000000000..37af327fd80
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route-converter-behavior.d.ts
@@ -0,0 +1,64 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * app-route-converter-behavior.html
+ */
+
+declare namespace Polymer {
+
+ /**
+ * Provides bidirectional mapping between `path` and `queryParams` and a
+ * app-route compatible `route` object.
+ *
+ * For more information, see the docs for `app-route-converter`.
+ */
+ interface AppRouteConverterBehavior {
+
+ /**
+ * A model representing the deserialized path through the route tree, as
+ * well as the current queryParams.
+ *
+ * A route object is the kernel of the routing system. It is intended to
+ * be fed into consuming elements such as `app-route`.
+ */
+ route: object|null|undefined;
+
+ /**
+ * A set of key/value pairs that are universally accessible to branches of
+ * the route tree.
+ */
+ queryParams: object|null;
+
+ /**
+ * The serialized path through the route tree. This corresponds to the
+ * `window.location.pathname` value, and will update to reflect changes
+ * to that value.
+ */
+ path: string|null|undefined;
+ created(): void;
+
+ /**
+ * Handler called when the path or queryParams change.
+ */
+ _locationChanged(): void;
+
+ /**
+ * Handler called when the route prefix and route path change.
+ */
+ _routeChanged(): void;
+
+ /**
+ * Handler called when the route queryParams change.
+ *
+ * @param queryParams A set of key/value pairs that are
+ * universally accessible to branches of the route tree.
+ */
+ _routeQueryParamsChanged(queryParams: object|null): void;
+ }
+
+ const AppRouteConverterBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route-converter-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route-converter-behavior.html
new file mode 100644
index 00000000000..66a7b5b8c0d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route-converter-behavior.html
@@ -0,0 +1,107 @@
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<script>
+ (function() {
+ 'use strict';
+
+ /**
+ * Provides bidirectional mapping between `path` and `queryParams` and a
+ * app-route compatible `route` object.
+ *
+ * For more information, see the docs for `app-route-converter`.
+ *
+ * @polymerBehavior
+ */
+ Polymer.AppRouteConverterBehavior = {
+ properties: {
+ /**
+ * A model representing the deserialized path through the route tree, as
+ * well as the current queryParams.
+ *
+ * A route object is the kernel of the routing system. It is intended to
+ * be fed into consuming elements such as `app-route`.
+ *
+ * @type {?Object|undefined}
+ */
+ route: {
+ type: Object,
+ notify: true,
+ },
+
+ /**
+ * A set of key/value pairs that are universally accessible to branches of
+ * the route tree.
+ *
+ * @type {?Object}
+ */
+ queryParams: {
+ type: Object,
+ notify: true,
+ },
+
+ /**
+ * The serialized path through the route tree. This corresponds to the
+ * `window.location.pathname` value, and will update to reflect changes
+ * to that value.
+ */
+ path: {
+ type: String,
+ notify: true,
+ }
+ },
+
+ observers: [
+ '_locationChanged(path, queryParams)',
+ '_routeChanged(route.prefix, route.path)',
+ '_routeQueryParamsChanged(route.__queryParams)'
+ ],
+
+ created: function() {
+ this.linkPaths('route.__queryParams', 'queryParams');
+ this.linkPaths('queryParams', 'route.__queryParams');
+ },
+
+ /**
+ * Handler called when the path or queryParams change.
+ */
+ _locationChanged: function() {
+ if (this.route && this.route.path === this.path &&
+ this.queryParams === this.route.__queryParams) {
+ return;
+ }
+ this.route = {prefix: '', path: this.path, __queryParams: this.queryParams};
+ },
+
+ /**
+ * Handler called when the route prefix and route path change.
+ */
+ _routeChanged: function() {
+ if (!this.route) {
+ return;
+ }
+
+ this.path = this.route.prefix + this.route.path;
+ },
+
+ /**
+ * Handler called when the route queryParams change.
+ *
+ * @param {Object} queryParams A set of key/value pairs that are
+ * universally accessible to branches of the route tree.
+ */
+ _routeQueryParamsChanged: function(queryParams) {
+ if (!this.route) {
+ return;
+ }
+ this.queryParams = queryParams;
+ }
+ };
+ })();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route-converter.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route-converter.d.ts
new file mode 100644
index 00000000000..d6435419e05
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route-converter.d.ts
@@ -0,0 +1,70 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * app-route-converter.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="app-route-converter-behavior.d.ts" />
+
+/**
+ * `app-route-converter` provides a means to convert a path and query
+ * parameters into a route object and vice versa. This produced route object
+ * is to be fed into route-consuming elements such as `app-route`.
+ *
+ * > n.b. This element is intended to be a primitive of the routing system and for
+ * creating bespoke routing solutions from scratch. To simply include routing in
+ * an app, please refer to [app-location](https://github.com/PolymerElements/app-route/blob/master/app-location.html)
+ * and [app-route](https://github.com/PolymerElements/app-route/blob/master/app-route.html).
+ *
+ * An example of a route object that describes
+ * `https://elements.polymer-project.org/elements/app-route-converter?foo=bar&baz=qux`
+ * and should be passed to other `app-route` elements:
+ *
+ * {
+ * prefix: '',
+ * path: '/elements/app-route-converter',
+ * __queryParams: {
+ * foo: 'bar',
+ * baz: 'qux'
+ * }
+ * }
+ *
+ * `__queryParams` is private to discourage directly data-binding to it. This is so
+ * that routing elements like `app-route` can intermediate changes to the query
+ * params and choose whether to propagate them upstream or not. `app-route` for
+ * example will not propagate changes to its `queryParams` property if it is not
+ * currently active. A public queryParams object will also be produced in which you
+ * should perform data-binding operations.
+ *
+ * Example Usage:
+ *
+ * <iron-location path="{{path}}" query="{{query}}"></iron-location>
+ * <iron-query-params
+ * params-string="{{query}}"
+ * params-object="{{queryParams}}">
+ * </iron-query-params>
+ * <app-route-converter
+ * path="{{path}}"
+ * query-params="{{queryParams}}"
+ * route="{{route}}">
+ * </app-route-converter>
+ * <app-route route='{{route}}' pattern='/:page' data='{{data}}'>
+ * </app-route>
+ *
+ * This is a simplified implementation of the `app-location` element. Here the
+ * `iron-location` produces a path and a query, the `iron-query-params` consumes
+ * the query and produces a queryParams object, and the `app-route-converter`
+ * consumes the path and the query params and converts it into a route which is in
+ * turn is consumed by the `app-route`.
+ */
+interface AppRouteConverterElement extends Polymer.Element, Polymer.AppRouteConverterBehavior {
+}
+
+interface HTMLElementTagNameMap {
+ "app-route-converter": AppRouteConverterElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route-converter.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route-converter.html
new file mode 100644
index 00000000000..a87fb21fcfc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route-converter.html
@@ -0,0 +1,79 @@
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="./app-route-converter-behavior.html">
+
+<!--
+`app-route-converter` provides a means to convert a path and query
+parameters into a route object and vice versa. This produced route object
+is to be fed into route-consuming elements such as `app-route`.
+
+> n.b. This element is intended to be a primitive of the routing system and for
+creating bespoke routing solutions from scratch. To simply include routing in
+an app, please refer to [app-location](https://github.com/PolymerElements/app-route/blob/master/app-location.html)
+and [app-route](https://github.com/PolymerElements/app-route/blob/master/app-route.html).
+
+An example of a route object that describes
+`https://elements.polymer-project.org/elements/app-route-converter?foo=bar&baz=qux`
+and should be passed to other `app-route` elements:
+
+ {
+ prefix: '',
+ path: '/elements/app-route-converter',
+ __queryParams: {
+ foo: 'bar',
+ baz: 'qux'
+ }
+ }
+
+`__queryParams` is private to discourage directly data-binding to it. This is so
+that routing elements like `app-route` can intermediate changes to the query
+params and choose whether to propagate them upstream or not. `app-route` for
+example will not propagate changes to its `queryParams` property if it is not
+currently active. A public queryParams object will also be produced in which you
+should perform data-binding operations.
+
+Example Usage:
+
+ <iron-location path="{{path}}" query="{{query}}"></iron-location>
+ <iron-query-params
+ params-string="{{query}}"
+ params-object="{{queryParams}}">
+ </iron-query-params>
+ <app-route-converter
+ path="{{path}}"
+ query-params="{{queryParams}}"
+ route="{{route}}">
+ </app-route-converter>
+ <app-route route='{{route}}' pattern='/:page' data='{{data}}'>
+ </app-route>
+
+This is a simplified implementation of the `app-location` element. Here the
+`iron-location` produces a path and a query, the `iron-query-params` consumes
+the query and produces a queryParams object, and the `app-route-converter`
+consumes the path and the query params and converts it into a route which is in
+turn is consumed by the `app-route`.
+
+@element app-route-converter
+@demo demo/index.html
+-->
+
+<script>
+ (function() {
+ 'use strict';
+
+ Polymer({
+ is: 'app-route-converter',
+
+ behaviors: [Polymer.AppRouteConverterBehavior]
+ });
+ })();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route.d.ts
new file mode 100644
index 00000000000..c7113f5707d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route.d.ts
@@ -0,0 +1,127 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * app-route.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+
+/**
+ * `app-route` is an element that enables declarative, self-describing routing
+ * for a web app.
+ *
+ * > *n.b. app-route is still in beta. We expect it will need some changes. We're counting on your feedback!*
+ *
+ * In its typical usage, a `app-route` element consumes an object that describes
+ * some state about the current route, via the `route` property. It then parses
+ * that state using the `pattern` property, and produces two artifacts: some `data`
+ * related to the `route`, and a `tail` that contains the rest of the `route` that
+ * did not match.
+ *
+ * Here is a basic example, when used with `app-location`:
+ *
+ * <app-location route="{{route}}"></app-location>
+ * <app-route
+ * route="{{route}}"
+ * pattern="/:page"
+ * data="{{data}}"
+ * tail="{{tail}}">
+ * </app-route>
+ *
+ * In the above example, the `app-location` produces a `route` value. Then, the
+ * `route.path` property is matched by comparing it to the `pattern` property. If
+ * the `pattern` property matches `route.path`, the `app-route` will set or update
+ * its `data` property with an object whose properties correspond to the parameters
+ * in `pattern`. So, in the above example, if `route.path` was `'/about'`, the value
+ * of `data` would be `{"page": "about"}`.
+ *
+ * The `tail` property represents the remaining part of the route state after the
+ * `pattern` has been applied to a matching `route`.
+ *
+ * Here is another example, where `tail` is used:
+ *
+ * <app-location route="{{route}}"></app-location>
+ * <app-route
+ * route="{{route}}"
+ * pattern="/:page"
+ * data="{{routeData}}"
+ * tail="{{subroute}}">
+ * </app-route>
+ * <app-route
+ * route="{{subroute}}"
+ * pattern="/:id"
+ * data="{{subrouteData}}">
+ * </app-route>
+ *
+ * In the above example, there are two `app-route` elements. The first
+ * `app-route` consumes a `route`. When the `route` is matched, the first
+ * `app-route` also produces `routeData` from its `data`, and `subroute` from
+ * its `tail`. The second `app-route` consumes the `subroute`, and when it
+ * matches, it produces an object called `subrouteData` from its `data`.
+ *
+ * So, when `route.path` is `'/about'`, the `routeData` object will look like
+ * this: `{ page: 'about' }`
+ *
+ * And `subrouteData` will be null. However, if `route.path` changes to
+ * `'/article/123'`, the `routeData` object will look like this:
+ * `{ page: 'article' }`
+ *
+ * And the `subrouteData` will look like this: `{ id: '123' }`
+ *
+ * `app-route` is responsive to bi-directional changes to the `data` objects
+ * they produce. So, if `routeData.page` changed from `'article'` to `'about'`,
+ * the `app-route` will update `route.path`. This in-turn will update the
+ * `app-location`, and cause the global location bar to change its value.
+ */
+interface AppRouteElement extends Polymer.Element {
+
+ /**
+ * The URL component managed by this element.
+ */
+ route: object|null|undefined;
+
+ /**
+ * The pattern of slash-separated segments to match `route.path` against.
+ *
+ * For example the pattern "/foo" will match "/foo" or "/foo/bar"
+ * but not "/foobar".
+ *
+ * Path segments like `/:named` are mapped to properties on the `data`
+ * object.
+ */
+ pattern: string|null|undefined;
+
+ /**
+ * The parameterized values that are extracted from the route as
+ * described by `pattern`.
+ */
+ data: object|null|undefined;
+
+ /**
+ * Auto activate route if path empty
+ */
+ autoActivate: boolean|null|undefined;
+ _queryParamsUpdating: boolean|null|undefined;
+ queryParams: object|null;
+
+ /**
+ * The part of `route.path` NOT consumed by `pattern`.
+ */
+ tail: object|null|undefined;
+
+ /**
+ * Whether the current route is active. True if `route.path` matches the
+ * `pattern`, false otherwise.
+ */
+ readonly active: boolean|null|undefined;
+ _matched: string|null;
+ created(): void;
+}
+
+interface HTMLElementTagNameMap {
+ "app-route": AppRouteElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route.html
new file mode 100644
index 00000000000..cf4d7a87b0f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/app-route.html
@@ -0,0 +1,431 @@
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<!--
+`app-route` is an element that enables declarative, self-describing routing
+for a web app.
+
+> *n.b. app-route is still in beta. We expect it will need some changes. We're counting on your feedback!*
+
+In its typical usage, a `app-route` element consumes an object that describes
+some state about the current route, via the `route` property. It then parses
+that state using the `pattern` property, and produces two artifacts: some `data`
+related to the `route`, and a `tail` that contains the rest of the `route` that
+did not match.
+
+Here is a basic example, when used with `app-location`:
+
+ <app-location route="{{route}}"></app-location>
+ <app-route
+ route="{{route}}"
+ pattern="/:page"
+ data="{{data}}"
+ tail="{{tail}}">
+ </app-route>
+
+In the above example, the `app-location` produces a `route` value. Then, the
+`route.path` property is matched by comparing it to the `pattern` property. If
+the `pattern` property matches `route.path`, the `app-route` will set or update
+its `data` property with an object whose properties correspond to the parameters
+in `pattern`. So, in the above example, if `route.path` was `'/about'`, the value
+of `data` would be `{"page": "about"}`.
+
+The `tail` property represents the remaining part of the route state after the
+`pattern` has been applied to a matching `route`.
+
+Here is another example, where `tail` is used:
+
+ <app-location route="{{route}}"></app-location>
+ <app-route
+ route="{{route}}"
+ pattern="/:page"
+ data="{{routeData}}"
+ tail="{{subroute}}">
+ </app-route>
+ <app-route
+ route="{{subroute}}"
+ pattern="/:id"
+ data="{{subrouteData}}">
+ </app-route>
+
+In the above example, there are two `app-route` elements. The first
+`app-route` consumes a `route`. When the `route` is matched, the first
+`app-route` also produces `routeData` from its `data`, and `subroute` from
+its `tail`. The second `app-route` consumes the `subroute`, and when it
+matches, it produces an object called `subrouteData` from its `data`.
+
+So, when `route.path` is `'/about'`, the `routeData` object will look like
+this: `{ page: 'about' }`
+
+And `subrouteData` will be null. However, if `route.path` changes to
+`'/article/123'`, the `routeData` object will look like this:
+`{ page: 'article' }`
+
+And the `subrouteData` will look like this: `{ id: '123' }`
+
+`app-route` is responsive to bi-directional changes to the `data` objects
+they produce. So, if `routeData.page` changed from `'article'` to `'about'`,
+the `app-route` will update `route.path`. This in-turn will update the
+`app-location`, and cause the global location bar to change its value.
+
+@element app-route
+@demo demo/index.html
+@demo demo/data-loading-demo.html
+@demo demo/simple-demo.html
+-->
+
+<script>
+ (function() {
+ 'use strict';
+
+ Polymer({
+ is: 'app-route',
+
+ properties: {
+ /**
+ * The URL component managed by this element.
+ */
+ route: {
+ type: Object,
+ notify: true,
+ },
+
+ /**
+ * The pattern of slash-separated segments to match `route.path` against.
+ *
+ * For example the pattern "/foo" will match "/foo" or "/foo/bar"
+ * but not "/foobar".
+ *
+ * Path segments like `/:named` are mapped to properties on the `data`
+ * object.
+ */
+ pattern: {
+ type: String,
+ },
+
+ /**
+ * The parameterized values that are extracted from the route as
+ * described by `pattern`.
+ */
+ data: {
+ type: Object,
+ value: function() {
+ return {};
+ },
+ notify: true,
+ },
+
+ /**
+ * Auto activate route if path empty
+ */
+ autoActivate: {
+ type: Boolean,
+ value: false,
+ },
+
+ _queryParamsUpdating: {
+ type: Boolean,
+ value: false,
+ },
+
+ /**
+ * @type {?Object}
+ */
+ queryParams: {
+ type: Object,
+ value: function() {
+ return {};
+ },
+ notify: true,
+ },
+
+ /**
+ * The part of `route.path` NOT consumed by `pattern`.
+ */
+ tail: {
+ type: Object,
+ value: function() {
+ return {
+ path: null,
+ prefix: null,
+ __queryParams: null,
+ };
+ },
+ notify: true,
+ },
+
+ /**
+ * Whether the current route is active. True if `route.path` matches the
+ * `pattern`, false otherwise.
+ */
+ active: {
+ type: Boolean,
+ notify: true,
+ readOnly: true,
+ },
+
+ /**
+ * @type {?string}
+ */
+ _matched: {
+ type: String,
+ value: '',
+ }
+ },
+
+ observers: [
+ '__tryToMatch(route.path, pattern)',
+ '__updatePathOnDataChange(data.*)',
+ '__tailPathChanged(tail.path)',
+ '__routeQueryParamsChanged(route.__queryParams)',
+ '__tailQueryParamsChanged(tail.__queryParams)',
+ '__queryParamsChanged(queryParams.*)'
+ ],
+
+ created: function() {
+ this.linkPaths('route.__queryParams', 'tail.__queryParams');
+ this.linkPaths('tail.__queryParams', 'route.__queryParams');
+ },
+
+ /**
+ * Deal with the query params object being assigned to wholesale.
+ */
+ __routeQueryParamsChanged: function(queryParams) {
+ if (queryParams && this.tail) {
+ if (this.tail.__queryParams !== queryParams) {
+ this.set('tail.__queryParams', queryParams);
+ }
+
+ if (!this.active || this._queryParamsUpdating) {
+ return;
+ }
+
+ // Copy queryParams and track whether there are any differences compared
+ // to the existing query params.
+ var copyOfQueryParams = {};
+ var anythingChanged = false;
+ for (var key in queryParams) {
+ copyOfQueryParams[key] = queryParams[key];
+ if (anythingChanged || !this.queryParams ||
+ queryParams[key] !== this.queryParams[key]) {
+ anythingChanged = true;
+ }
+ }
+ // Need to check whether any keys were deleted
+ for (var key in this.queryParams) {
+ if (anythingChanged || !(key in queryParams)) {
+ anythingChanged = true;
+ break;
+ }
+ }
+
+ if (!anythingChanged) {
+ return;
+ }
+ this._queryParamsUpdating = true;
+ this.set('queryParams', copyOfQueryParams);
+ this._queryParamsUpdating = false;
+ }
+ },
+
+ __tailQueryParamsChanged: function(queryParams) {
+ if (queryParams && this.route && this.route.__queryParams != queryParams) {
+ this.set('route.__queryParams', queryParams);
+ }
+ },
+
+ __queryParamsChanged: function(changes) {
+ if (!this.active || this._queryParamsUpdating) {
+ return;
+ }
+
+ this.set('route.__' + changes.path, changes.value);
+ },
+
+ __resetProperties: function() {
+ this._setActive(false);
+ this._matched = null;
+ },
+
+ __tryToMatch: function() {
+ if (!this.route) {
+ return;
+ }
+
+ var path = this.route.path;
+ var pattern = this.pattern;
+
+ if (this.autoActivate && path === '') {
+ path = '/';
+ }
+
+ if (!pattern) {
+ return;
+ }
+
+ if (!path) {
+ this.__resetProperties();
+ return;
+ }
+
+ var remainingPieces = path.split('/');
+ var patternPieces = pattern.split('/');
+
+ var matched = [];
+ var namedMatches = {};
+
+ for (var i = 0; i < patternPieces.length; i++) {
+ var patternPiece = patternPieces[i];
+ if (!patternPiece && patternPiece !== '') {
+ break;
+ }
+ var pathPiece = remainingPieces.shift();
+
+ // We don't match this path.
+ if (!pathPiece && pathPiece !== '') {
+ this.__resetProperties();
+ return;
+ }
+ matched.push(pathPiece);
+
+ if (patternPiece.charAt(0) == ':') {
+ namedMatches[patternPiece.slice(1)] = pathPiece;
+ } else if (patternPiece !== pathPiece) {
+ this.__resetProperties();
+ return;
+ }
+ }
+
+ this._matched = matched.join('/');
+
+ // Properties that must be updated atomically.
+ var propertyUpdates = {};
+
+ // this.active
+ if (!this.active) {
+ propertyUpdates.active = true;
+ }
+
+ // this.tail
+ var tailPrefix = this.route.prefix + this._matched;
+ var tailPath = remainingPieces.join('/');
+ if (remainingPieces.length > 0) {
+ tailPath = '/' + tailPath;
+ }
+ if (!this.tail || this.tail.prefix !== tailPrefix ||
+ this.tail.path !== tailPath) {
+ propertyUpdates.tail = {
+ prefix: tailPrefix,
+ path: tailPath,
+ __queryParams: this.route.__queryParams
+ };
+ }
+
+ // this.data
+ propertyUpdates.data = namedMatches;
+ this._dataInUrl = {};
+ for (var key in namedMatches) {
+ this._dataInUrl[key] = namedMatches[key];
+ }
+
+ if (this.setProperties) {
+ // atomic update
+ this.setProperties(propertyUpdates, true);
+ } else {
+ this.__setMulti(propertyUpdates);
+ }
+ },
+
+ __tailPathChanged: function(path) {
+ if (!this.active) {
+ return;
+ }
+ var tailPath = path;
+ var newPath = this._matched;
+ if (tailPath) {
+ if (tailPath.charAt(0) !== '/') {
+ tailPath = '/' + tailPath;
+ }
+ newPath += tailPath;
+ }
+ this.set('route.path', newPath);
+ },
+
+ __updatePathOnDataChange: function() {
+ if (!this.route || !this.active) {
+ return;
+ }
+ var newPath = this.__getLink({});
+ var oldPath = this.__getLink(this._dataInUrl);
+ if (newPath === oldPath) {
+ return;
+ }
+ this.set('route.path', newPath);
+ },
+
+ __getLink: function(overrideValues) {
+ var values = {tail: null};
+ for (var key in this.data) {
+ values[key] = this.data[key];
+ }
+ for (var key in overrideValues) {
+ values[key] = overrideValues[key];
+ }
+ var patternPieces = this.pattern.split('/');
+ var interp = patternPieces.map(function(value) {
+ if (value[0] == ':') {
+ value = values[value.slice(1)];
+ }
+ return value;
+ }, this);
+ if (values.tail && values.tail.path) {
+ if (interp.length > 0 && values.tail.path.charAt(0) === '/') {
+ interp.push(values.tail.path.slice(1));
+ } else {
+ interp.push(values.tail.path);
+ }
+ }
+ return interp.join('/');
+ },
+
+ __setMulti: function(setObj) {
+ // HACK(rictic): skirting around 1.0's lack of a setMulti by poking at
+ // internal data structures. I would not advise that you copy this
+ // example.
+ //
+ // In the future this will be a feature of Polymer itself.
+ // See: https://github.com/Polymer/polymer/issues/3640
+ //
+ // Hacking around with private methods like this is juggling footguns,
+ // and is likely to have unexpected and unsupported rough edges.
+ //
+ // Be ye so warned.
+ for (var property in setObj) {
+ this._propertySetter(property, setObj[property]);
+ }
+ // notify in a specific order
+ if (setObj.data !== undefined) {
+ this._pathEffector('data', this.data);
+ this._notifyChange('data');
+ }
+ if (setObj.active !== undefined) {
+ this._pathEffector('active', this.active);
+ this._notifyChange('active');
+ }
+ if (setObj.tail !== undefined) {
+ this._pathEffector('tail', this.tail);
+ this._notifyChange('tail');
+ }
+ }
+ });
+ })();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/bower.json
new file mode 100644
index 00000000000..f1679dcf088
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/bower.json
@@ -0,0 +1,65 @@
+{
+ "name": "app-route",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "description": "App routing expressed as Polymer Custom Elements.",
+ "main": [
+ "app-route.html",
+ "app-location.html",
+ "app-route-converter.html"
+ ],
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/app-route",
+ "private": true,
+ "ignore": [],
+ "dependencies": {
+ "iron-location": "PolymerElements/iron-location#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "google-youtube": "GoogleWebComponents/google-youtube#1 - 2",
+ "iron-component-page": "polymerelements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-pages": "PolymerElements/iron-pages#1 - 2",
+ "iron-test-helpers": "polymerelements/iron-test-helpers#1 - 2",
+ "paper-card": "PolymerElements/paper-card#1 - 2",
+ "paper-icon-button": "polymerelements/paper-icon-button#1 - 2",
+ "paper-input": "polymerelements/paper-input#1 - 2",
+ "paper-spinner": "PolymerElements/paper-spinner#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "paper-toggle-button": "polymerelements/paper-toggle-button#1 - 2",
+ "url": "webcomponents/URL#^0.5.7",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-location": "polymerelements/iron-location#^0.8.1",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "google-youtube": "GoogleWebComponents/google-youtube#^1.2.1",
+ "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.2.0",
+ "iron-pages": "PolymerElements/iron-pages#^1.0.7",
+ "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0",
+ "paper-card": "PolymerElements/paper-card#^1.1.1",
+ "paper-icon-button": "polymerelements/paper-icon-button#^v1.0.0",
+ "paper-input": "polymerelements/paper-input#^1.1.2",
+ "paper-spinner": "PolymerElements/paper-spinner#^1.1.1",
+ "paper-styles": "polymerelements/paper-styles#^1.0.13",
+ "paper-toggle-button": "polymerelements/paper-toggle-button#^1.0.0",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/data-loading-demo.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/data-loading-demo.html
new file mode 100644
index 00000000000..20797f7f891
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/data-loading-demo.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <title>carbon-route data loading example</title>
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../iron-demo-helpers/url-bar.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="./data-loading-demo/flickr-search-demo.html">
+
+ <style is="custom-style" include="demo-pages-shared-styles">
+ </style>
+</head>
+<body>
+
+<url-bar></url-bar>
+
+<flickr-search-demo></flickr-search-demo>
+
+
+
+</body></html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/data-loading-demo/flickr-image-page.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/data-loading-demo/flickr-image-page.html
new file mode 100644
index 00000000000..3b39a0cc8b5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/data-loading-demo/flickr-image-page.html
@@ -0,0 +1,106 @@
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../../iron-ajax/iron-ajax.html">
+<link rel="import" href="../../../paper-spinner/paper-spinner.html">
+<link rel="import" href="../../app-route.html">
+
+<dom-module id="flickr-image-page">
+ <template>
+ <style>
+ paper-spinner {
+ display: block;
+ }
+ .tags span {
+ display: inline-block;
+ padding-right: 10px;
+ font-size: 110%;
+ }
+ .tags span::after {
+ content: ', ';
+ }
+ .tags span:last-of-type::after {
+ content: '';
+ }
+ </style>
+ <app-route route="{{route}}" pattern="/:farm/:server/:id/:secret" data="{{data}}">
+ </app-route>
+ <img src="{{_computeSrc(data)}}">
+ <iron-ajax auto url="https://www.flickr.com/services/rest/"
+ handle-as="json"
+ params="{{params}}"
+ last-response="{{metadata}}"
+ last-error="{{error}}"
+ loading="{{loading}}">
+ </iron-ajax>
+ <paper-spinner active="{{loading}}"></paper-spinner>
+ <div>
+ <h1>{{metadata.photo.title._content}}</h1>
+ <div class="tags">
+ <template is="dom-repeat" items="{{metadata.photo.tags.tag}}">
+ <span>{{item.raw}}</span>
+ </template>
+ </div>
+ <div>
+ <ul>
+ <template is="dom-repeat" items="{{metadata.photo.urls.url}}">
+ <li>
+ <a target="_blank" href="{{item._content}}">
+ {{item._content}}
+ </a>
+ </li>
+ </template>
+ </ul>
+ </div>
+ </div>
+ </template>
+ <script>
+ Polymer({
+ is: 'flickr-image-page',
+ properties: {
+ apiKey: {
+ type: String,
+ },
+
+ params: {
+ type: Object,
+ computed: '_computeParams(apiKey, data.id, data.secret)'
+ },
+
+ route: {type: Object}
+ },
+ observers: ['_clearOldMetadata(route.path)'],
+
+ _clearOldMetadata: function() {
+ this.metadata = null;
+ },
+
+ _computeParams: function(apiKey, id, secret) {
+ return {
+ method: 'flickr.photos.getInfo',
+ api_key: apiKey,
+ photo_id: id,
+ secret: secret,
+ format: 'json',
+ nojsoncallback: 1
+ };
+ },
+
+ _computeSrc: function(photo) {
+ if (!photo || !photo.farm) {
+ return '';
+ }
+ return 'https://farm' + photo.farm + '.staticflickr.com/' + photo.server +
+ '/' + photo.id + '_' + photo.secret + '.jpg';
+ }
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/data-loading-demo/flickr-search-demo.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/data-loading-demo/flickr-search-demo.html
new file mode 100644
index 00000000000..eb35a8a1fe9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/data-loading-demo/flickr-search-demo.html
@@ -0,0 +1,62 @@
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../../iron-pages/iron-pages.html">
+<link rel="import" href="../../app-location.html">
+<link rel="import" href="../../app-route.html">
+<link rel="import" href="./flickr-search-page.html">
+<link rel="import" href="./flickr-image-page.html">
+
+
+<dom-module id="flickr-search-demo">
+ <template>
+ <style>
+ a {
+ text-decoration: none;
+ color: inherit;
+ }
+ a:hover {
+ text-decoration: underline;
+ }
+ </style>
+ <app-location route="{{route}}" use-hash-as-path></app-location>
+ <app-route route="{{route}}" pattern="/:page" data="{{data}}">
+ </app-route>
+ <app-route route="{{route}}" pattern="/search" tail="{{searchRoute}}">
+ </app-route>
+ <app-route route="{{route}}" pattern="/image" tail="{{imageRoute}}">
+ </app-route>
+
+ <h1><a href="#/search/">Public Domain Image Search</a></h1>
+
+ <iron-pages attr-for-selected="id" selected="{{data.page}}"
+ selected-attribute="selected">
+ <flickr-search-page id="search" api-key="{{apiKey}}"
+ route="{{searchRoute}}">
+ </flickr-search-page>
+ <flickr-image-page id="image" api-key="{{apiKey}}" route="{{imageRoute}}">
+ </flickr-image-page>
+ </iron-pages>
+ </template>
+ <script>
+ Polymer({
+ is: 'flickr-search-demo',
+ properties:
+ {apiKey: {type: String, value: '5358d9830b6865a13d251e5e1acb4c30'}},
+
+ attached: function() {
+ if (this.route.path === '') {
+ this.set('route.path', '/search/');
+ }
+ }
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/data-loading-demo/flickr-search-page.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/data-loading-demo/flickr-search-page.html
new file mode 100644
index 00000000000..04276abb2c9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/data-loading-demo/flickr-search-page.html
@@ -0,0 +1,107 @@
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../../paper-spinner/paper-spinner.html">
+<link rel="import" href="../../../paper-input/paper-input.html">
+<link rel="import" href="../../app-route.html">
+
+<dom-module id="flickr-search-page">
+ <template>
+ <style>
+ paper-spinner {
+ display: block;
+ }
+ img {
+ max-width: 200px;
+ max-height: 200px;
+ }
+ </style>
+ <app-route pattern="/" route="{{route}}" query-params="{{queryParams}}"
+ active="{{active}}">
+ </app-route>
+ <paper-input autofocus label="Search the public domain on Flickr"
+ value="{{queryParams.search}}">
+ </paper-input>
+
+ <iron-ajax auto url="https://www.flickr.com/services/rest/"
+ handle-as="json"
+ debounce-duration="300"
+ params="{{params}}"
+ last-response="{{response}}"
+ last-error="{{error}}"
+ loading="{{loading}}">
+ </iron-ajax>
+ <paper-spinner active="{{loading}}"></paper-spinner>
+ <template is="dom-repeat" items="{{response.photos.photo}}" as="photo">
+ <a href="{{_computeLink(photo)}}">
+ <img src="{{_computeSrc(photo)}}">
+ </a>
+ </template>
+ <template is="dom-if" if="{{error}}">
+ <span>{{error.statusCode}}</span> Error:
+ <pre>{{error.response}}</pre>
+ </template>
+ </template>
+ <script>
+ Polymer({
+ is: 'flickr-search-page',
+ properties: {
+ apiKey: {
+ type: String,
+ },
+
+ params:
+ {type: Object, computed: '_computeParams(apiKey, queryParams.search)'},
+
+ route: {type: Object}
+ },
+
+ observers: [
+ '_clearOldSearchResults(queryParams.search)',
+ '_setDefaultSearch(active)'
+ ],
+
+ _clearOldSearchResults: function() {
+ this.response = null;
+ },
+
+ _computeParams: function(apiKey, search) {
+ return {
+ method: 'flickr.photos.search',
+ api_key: apiKey,
+ text: search,
+ license: '7,8',
+ format: 'json',
+ nojsoncallback: 1
+ };
+ },
+
+ _computeSrc: function(photo) {
+ if (!photo || !photo.farm) {
+ return '';
+ }
+ return 'https://farm' + photo.farm + '.staticflickr.com/' + photo.server +
+ '/' + photo.id + '_' + photo.secret + '.jpg';
+ },
+
+ _computeLink: function(photo) {
+ return window.location.pathname + '#/image/' + photo.farm + '/' +
+ photo.server + '/' + photo.id + '/' + photo.secret;
+ },
+
+ _setDefaultSearch: function(active) {
+ if (active && !this.queryParams.search) {
+ this.set('queryParams.search', 'spaceship')
+ }
+ }
+ })
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/index.html
new file mode 100644
index 00000000000..22f297e5957
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/index.html
@@ -0,0 +1,195 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at
+http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at
+http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at
+http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at
+http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+<script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+<title>app-route Demo</title>
+<link rel="import" href="../../polymer/polymer.html">
+
+<link rel="import" href="../../iron-demo-helpers/url-bar.html">
+<link rel="import" href="../../iron-pages/iron-pages.html">
+
+<link rel="import" href="../app-location.html">
+<link rel="import" href="../app-route.html">
+
+<link rel="import" href="youtube-demo/youtube-search.html">
+<link rel="import" href="youtube-demo/youtube-toolbar.html">
+<link rel="import" href="youtube-demo/video-viewer.html">
+<link rel="import" href="youtube-demo/search-results.html">
+
+<style>
+ body {
+ margin: 0;
+ padding: 0;
+ }
+ url-bar {
+ background-color: white;
+ }
+</style>
+</head>
+
+<body>
+
+<url-bar></url-bar>
+
+<app-router-demo></app-router-demo>
+
+<dom-module id="app-router-demo">
+ <template>
+ <style>
+ :host {
+ display: block;
+ position: relative;
+ height: 100vh;
+ @apply --paper-font-common-base;
+ }
+
+ :host([video-page-active]) {
+ overflow: hidden;
+ }
+
+ :host([video-page-active]) iron-pages {
+ transform: translateY(-170px);
+ }
+
+ iron-pages {
+ transition: transform 0.3s;
+ }
+ </style>
+
+
+ <!-- app-location binds with the URL and produces a route for
+ app-route elements to consume. Since this demo needs to run without
+ server cooperation (e.g. with polyserve, in the elements catalog, etc) we'll
+ use the hash portion of the URL for our route paths. -->
+ <app-location route="{{route}}" use-hash-as-path></app-location>
+
+ <!-- app-routes parse route paths based on the their `pattern`.
+ Parameters are extracted into the `data` object. The rest of the path that
+ comes after the `pattern` is put into the `tail` object, which can be
+ passed to the `route` property of downstream app-routes. -->
+ <app-route route="{{route}}" pattern="/:page" data="{{data}}"></app-route>
+ <app-route route="{{route}}" pattern="/search" tail="{{searchTail}}"></app-route>
+ <app-route route="{{route}}" pattern="/video" tail="{{videoTail}}" active="{{videoPageActive}}"></app-route>
+
+ <youtube-toolbar collapsed$="{{videoPageActive}}">
+ <!-- The youtube-search has a app-route that consumes the tail of
+ another route (`searchTail`) -->
+ <youtube-search
+ route="{{searchTail}}"
+ video-data="{{videoData}}">
+ </youtube-search>
+ </youtube-toolbar>
+
+ <iron-pages attr-for-selected="id" selected="{{data.page}}">
+ <search-results id="search" items="{{videos}}"></search-results>
+
+ <!-- The video-viewer has a app-route that consumes the tail of
+ another route -->
+ <video-viewer id="video" route="{{videoTail}}"></video-viewer>
+ </iron-pages>
+
+ </template>
+
+ <script>
+ window.addEventListener('WebComponentsReady', function() {
+ Polymer({
+ is: 'app-router-demo',
+
+ properties: {
+ route: {type: Object},
+
+ videoData: {type: Object, observer: '_videoDataChanged'},
+
+ videoPageActive: {
+ type: Boolean,
+ reflectToAttribute: true,
+ observer: '_videoPageActiveChanged'
+ },
+
+ searchTail: {type: Object, notify: true},
+
+ videoTail: {type: Object, notify: true},
+
+ newCategory: {type: String},
+
+ videos: {
+ type: Array,
+ value: function() {
+ return [];
+ }
+ },
+
+ data: {
+ type: Object,
+ value: function() {
+ return {page: '/search/'};
+ }
+ }
+ },
+
+ attached: function() {
+ // If we do not have an initial URL, we redirect to /search
+ if (!this.route || !this.route.path) {
+ this.set('route.path', '/search/');
+ }
+ },
+
+ _videoDataChanged: function(data) {
+ var allVideos = [];
+
+ var that = this;
+
+ data.items.forEach(function(videoItem) {
+ var youtubeVideo = {
+ id: videoItem.id.videoId,
+ title: videoItem.snippet.title,
+ thumbnail: videoItem.snippet.thumbnails.high.url
+ };
+
+ allVideos.push(youtubeVideo);
+ });
+
+ this.set('videos', allVideos);
+ },
+
+ _videoPageActiveChanged: function(videoPageActive, previousValue) {
+ // change color of page on page change
+ var newColor;
+
+ if (videoPageActive) {
+ // black
+ newColor = 0;
+ } else {
+ // white
+ newColor = 255;
+ }
+
+ document.body.style.backgroundColor =
+ 'rgb(' + newColor + ',' + newColor + ',' + newColor + ')';
+
+ // on first load, set the color then allow color transition animations
+ if (previousValue === undefined) {
+ document.body.style.transition = 'background-color .2s linear';
+ return;
+ }
+ }
+ });
+ });
+ </script>
+</dom-module>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/simple-demo.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/simple-demo.html
new file mode 100644
index 00000000000..98cc1719a96
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/simple-demo.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+<script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+<title>app-route Demo</title>
+<link rel="import" href="../../polymer/polymer.html">
+
+<link rel="import" href="../../iron-demo-helpers/url-bar.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../../iron-pages/iron-pages.html">
+<link rel="import" href="../../paper-input/paper-input.html">
+<link rel="import" href="../../paper-button/paper-button.html">
+
+<link rel="import" href="../app-location.html">
+<link rel="import" href="../app-route.html">
+</head>
+
+<body>
+<dom-module id="route-display">
+ <template>
+ <div>
+ <div>route<template is="dom-if" if="{{tail}}"> / tail</template>: {</div>
+ <div>&nbsp;&nbsp;prefix: {{route.prefix}}</div>
+ <div>&nbsp;&nbsp;path: {{route.path}}</div>
+ <div>}</div>
+ </div>
+ </template>
+ <script>
+ Polymer({
+ is: 'route-display',
+
+ properties: {route: Object, tail: Boolean}
+ });
+ </script>
+</dom-module>
+
+<dom-bind>
+ <template is="dom-bind">
+ <url-bar></url-bar>
+
+ <app-location route="{{route}}" use-hash-as-path></app-location>
+
+ <app-route
+ route="{{route}}"
+ pattern="/:demoType"
+ data="{{demoSelectionData}}"
+ tail="{{demoSelectionTail}}">
+ </app-route>
+
+ <app-route
+ route="{{route}}"
+ pattern="/pathDemo/:firstPath/:secondPath"
+ data="{{pathData}}"
+ tail="{{pathDataTail}}">
+ </app-route>
+
+ <app-route
+ route="{{route}}"
+ pattern="/queryParamsDemo"
+ query-params="{{queryParams}}"
+ tail="{{qpDemoTail}}">
+ </app-route>
+
+ <div>App location route object
+ <route-display route="{{route}}"></route-display>
+ </div>
+
+ <paper-button raised>
+ <a href="#/pathDemo/firstPath/secondPath/thirdPath">Changes in Path</a>
+ </paper-button>
+
+ <paper-button raised>
+ <a href="?hello=world&foo=bar#/queryParamsDemo">Changes in Query Params</a>
+ </paper-button>
+
+ <iron-pages selected={{demoSelectionData.demoType}} attr-for-selected="demo">
+ <div demo="pathDemo">
+ Change location of first part of the path:
+ <paper-input value="{{pathData.firstPath}}"></paper-input>
+ Change location of second part of the path:
+ <paper-input value="{{pathData.secondPath}}"></paper-input>
+
+ <app-route
+ route="{{pathDataTail}}"
+ pattern="/:thirdPath"
+ data="{{tailExampleData}}">
+ </app-route>
+ You can pass the tail of an app-route to be the route another app-route. Here is
+ the tail object of the first app-route which is the route object of this new app-route:
+ <route-display route="{{pathDataTail}}" tail></route-display>
+ You can also bind to this new route. Change the location of the third part of
+ the path:
+ <paper-input value="{{tailExampleData.thirdPath}}"></paper-input>
+ </div>
+
+ <div demo="queryParamsDemo">
+ Change the value of the hello query param
+ <paper-input value="{{queryParams.hello}}"></paper-input>
+ Change the value of the foo param
+ <paper-input value="{{queryParams.foo}}"></paper-input>
+ </div>
+ </iron-pages>
+ </template>
+</dom-bind>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/route-info.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/route-info.html
new file mode 100644
index 00000000000..90743081b85
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/route-info.html
@@ -0,0 +1,44 @@
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../../polymer/polymer.html">
+
+<dom-module id="route-info">
+ <template>
+ <style>
+ :host {
+ font-style: italic;
+ font-size: 0.85em;
+ font-weight: 200;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ color: #fff;
+ }
+ </style>
+ <span>Route prefix: {{route.prefix}} &middot; Route path: {{route.path}} &middot; Query params: {{_stringifyQueryParams(route.__queryParams.*)}}</span>
+ </template>
+ <script>
+ Polymer({
+ is: 'route-info',
+
+ properties: {route: {type: Object}},
+
+ _stringifyQueryParams: function() {
+ var params = [];
+ if (this.route && this.route.__queryParams) {
+ for (var key in this.route.__queryParams) {
+ params.push(key + ' = ' + this.route.__queryParams[key]);
+ }
+ }
+ return params.join(', ');
+ }
+ })
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/search-results.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/search-results.html
new file mode 100644
index 00000000000..87cc856ad18
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/search-results.html
@@ -0,0 +1,59 @@
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../../paper-card/paper-card.html">
+<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
+
+<dom-module id="search-results">
+ <template>
+ <style>
+ :host {
+ @apply --layout-horizontal;
+ @apply --layout-center-center;
+ @apply --layout-wrap;
+ }
+
+ a {
+ color: black;
+ text-decoration: none;
+ }
+
+ paper-card {
+ width: 300px;
+ margin: 1em 0.5em 0em;
+ font-size: 14px;
+ }
+
+ .card-content {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+ </style>
+ <template is="dom-repeat" items="{{items}}" as="video">
+ <!-- The '#' is included because the use-hash-as-path property is
+ set to true in the app-location -->
+ <a href="./#/video/{{video.id}}">
+ <paper-card image="{{video.thumbnail}}">
+ <div class="card-content">
+ {{video.title}}
+ </div>
+ </paper-card>
+ </a>
+ </template>
+ </template>
+ <script>
+ Polymer({
+ is: 'search-results',
+
+ properties: {items: {type: Array}}
+ })
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/video-viewer.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/video-viewer.html
new file mode 100644
index 00000000000..ca274c6142e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/video-viewer.html
@@ -0,0 +1,121 @@
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../../paper-styles/color.html">
+<link rel="import" href="../../../paper-input/paper-input.html">
+<link rel="import" href="../../../paper-toggle-button/paper-toggle-button.html">
+
+<link rel="import" href="../../app-route.html">
+
+<link rel="import" href="youtube-lite.html">
+<link rel="import" href="route-info.html">
+
+<dom-module id="video-viewer">
+ <template>
+ <style>
+ :host {
+ display: block;
+ position: relative;
+ height: calc(100vh - 60px);
+ --primary-color: var(--paper-red-500);
+ --primary-text-color: #fff;
+ --paper-toggle-button-unchecked-bar-color: #888;
+ }
+
+ paper-input {
+ width: 100px;
+ }
+
+ #controls {
+ color: #fff;
+ @apply --layout-vertical;
+ @apply --layout-center-center;
+ height: 30%;
+ }
+
+ #controls > div {
+ @apply --layout-horizontal;
+ padding-bottom: 1em;
+ }
+
+ #state {
+ margin-left: 16px;
+ }
+
+ #player {
+ height: 70%;
+ }
+ </style>
+
+ <!-- This app-route consumes the route which was provided by the tail of
+ a app-route in the host of this element. This means that the parent that
+ provides this route decides where this element lives in the URL space. In
+ this case, the parent, which uses hashes, matches #/video and hence this
+ element lives in <App serving point>?querParams#/video/:vid -->
+ <app-route route="{{route}}" pattern="/:vid" data="{{data}}" query-params="{{queryParams}}">
+ </app-route>
+
+ <!-- You can bind any element's state into the URL by binding their
+ properties into the queryParams object. youtube-lite doesn't have any code
+ that's even aware of routing or the URL. -->
+ <youtube-lite
+ id="player"
+ video-id="{{data.vid}}"
+ state="{{queryParams.state}}"
+ current-time="{{queryParams.time}}"
+ start-time="{{queryParams.time}}">
+ </youtube-lite>
+
+ <div id="controls">
+ <div>
+ <paper-input
+ id="time"
+ type="number"
+ on-focus="pause"
+ label="Time"
+ value="{{queryParams.time}}">
+ </paper-input>
+ <paper-toggle-button id="state" active="{{playing}}">[[queryParams.state]]</paper-toggle-button>
+ </div>
+ <route-info route="[[route]]"></route-info>
+ </div>
+ </template>
+
+ <script>
+ Polymer({
+ is: 'video-viewer',
+
+ properties: {
+ route: {type: Object, notify: true},
+
+ data: {type: Object},
+
+ playing: {type: Boolean},
+
+ queryParams: {type: Object}
+ },
+
+ observers: ['_playingChanged(playing)', '_stateChanged(queryParams.state)'],
+
+ pause: function() {
+ this.set('queryParams.state', 'paused');
+ },
+
+ _playingChanged: function(playing) {
+ this.set('queryParams.state', playing ? 'playing' : 'paused');
+ },
+
+ _stateChanged: function(state) {
+ this.playing = state === 'playing';
+ }
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/youtube-lite.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/youtube-lite.html
new file mode 100644
index 00000000000..a7af9a9a734
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/youtube-lite.html
@@ -0,0 +1,178 @@
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../../google-youtube/google-youtube.html">
+<!--
+youtube-lite provides a simple subset of the google-youtube element's API. By
+simplifying the API we're also able to make it more amenable to two-way data
+binding.
+
+Note that this element is totally agnostic to routing!
+-->
+<dom-module id="youtube-lite">
+ <template>
+ <style>
+ :host {
+ display: block;
+ position: relative;
+ width: 100%;
+ }
+
+ google-youtube {
+ height: 100%;
+ }
+ </style>
+
+ <google-youtube
+ id="player"
+ video-id="{{videoId}}"
+ state="{{__state}}"
+ currenttime="{{__currentTime}}"
+ width="100%"
+ height="100%">
+ </google-youtube>
+ </template>
+
+ <script>
+ Polymer({
+ is: 'youtube-lite',
+
+ properties: {
+ videoId: {type: String, notify: true},
+
+ state: {type: String, notify: true, observer: '_stateChanged'},
+
+ currentTime: {type: Number, notify: true, observer: '_currentTimeChanged'},
+
+ startTime: {type: Number},
+
+ __state: {type: String, observer: '__ytApiStateChange'},
+
+ __currentTime: {type: String, observer: '_ytCurrentTimeChanged'},
+
+ __pauseOnFirstSeek: {type: Boolean}
+ },
+
+ listeners: {'google-youtube-ready': '_onYoutubeReady'},
+
+ _seekTo: function(newTime) {
+ var player = this.$.player;
+
+ if (player.duration == 1 || newTime < player.duration) {
+ player.seekTo(newTime);
+ }
+ },
+
+ _onYoutubeReady: function() {
+ this.__pauseOnFirstSeek = this.state == 'paused';
+
+ if (!this.__pauseOnFirstSeek || this.startTime) {
+ this._seekTo(this.startTime);
+ }
+ },
+
+ _currentTimeChanged: function(newTime, oldTime) {
+ var apiState = this.__readableStateToApiState(this.state);
+
+ if (apiState != 2 || this.__state != 2) {
+ return;
+ }
+
+ this._seekTo(newTime);
+ },
+
+ _ytCurrentTimeChanged: function(ytCurrentTime) {
+ if (this.__state === this.__apiStates.PAUSED) {
+ return;
+ }
+
+ this.currentTime = ytCurrentTime;
+ },
+
+ _stateChanged: function(newState, oldState) {
+ var newApiState = this.__readableStateToApiState(newState);
+
+ if (newApiState == this.__state ||
+ this.__state == this.__apiStates.UNSTARTED) {
+ return;
+ }
+
+ this.currentTime = this.__currentTime;
+ var player = this.$.player;
+
+ switch (newApiState) {
+ case this.__apiStates.PLAYING:
+ player.play();
+ break;
+ case this.__apiStates.PAUSED:
+ player.pause();
+ break;
+ default:
+ return;
+ }
+ },
+
+ __ytApiStateChange: function(newState, oldState) {
+ var readableState;
+
+ switch (newState) {
+ case this.__apiStates.ENDED:
+ readableState = this.__states.PAUSED;
+ break;
+ case this.__apiStates.PLAYING:
+ readableState = this.__states.PLAYING;
+ break;
+ case this.__apiStates.PAUSED:
+ readableState = this.__states.PAUSED;
+ break;
+ default:
+ return;
+ }
+
+ if (this.state == readableState) {
+ return;
+ }
+
+ if (this.__pauseOnFirstSeek && readableState == this.__states.PLAYING) {
+ this.__pauseOnFirstSeek = false;
+ this.$.player.pause();
+ return;
+ }
+
+ this.state = readableState;
+ this.currentTime = this.__currentTime;
+ },
+
+ __readableStateToApiState: function(readableState) {
+ var newApiState = -2;
+
+ if (readableState == this.__states.PLAYING) {
+ newApiState = this.__apiStates.PLAYING;
+
+ } else if (readableState = this.__states.PAUSED) {
+ newApiState = this.__apiStates.PAUSED;
+ }
+
+ return newApiState;
+ },
+
+ __states: {PLAYING: 'playing', PAUSED: 'paused'},
+
+ __apiStates: {
+ UNSTARTED: -1,
+ ENDED: 0,
+ PLAYING: 1,
+ PAUSED: 2,
+ BUFFERING: 3,
+ QUEUED: 5
+ }
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/youtube-search.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/youtube-search.html
new file mode 100644
index 00000000000..9d8612d3ea7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/youtube-search.html
@@ -0,0 +1,86 @@
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../../paper-input/paper-input.html">
+<link rel="import" href="../../../iron-ajax/iron-ajax.html">
+
+<link rel="import" href="../../app-route.html">
+
+<link rel="import" href="route-info.html">
+
+<dom-module id="youtube-search">
+ <template>
+ <style>
+ :host {
+ --primary-color: #fff;
+ --paper-input-container-color: #fff;
+ display: block;
+ position: relative;
+ padding: 1em;
+ }
+
+ route-info {
+ color: #fff;
+ }
+ </style>
+
+ <!-- This app-route consumes the route which was provided by the tail of
+ a app-route in the host of this element -->
+ <app-route route="{{route}}" pattern="/:searchQuery" data="{{data}}">
+ </app-route>
+
+ <paper-input label="Search Youtube" value="{{data.searchQuery}}"></paper-input>
+
+ <route-info route="[[route]]"></route-info>
+
+ <iron-ajax auto
+ id="youtubeSearch"
+ url="https://www.googleapis.com/youtube/v3/search"
+ params="{{params}}"
+ last-response="{{videoData}}">
+ </iron-ajax>
+ </template>
+
+ <script>
+ Polymer({
+ is: 'youtube-search',
+
+ properties: {
+ route: {type: Object, notify: true},
+
+ data: {type: Object},
+
+ category: {type: String, notify: true},
+
+ params: {type: String, computed: '_setParams(data.searchQuery)'},
+
+ videoData: {type: Object, notify: true}
+ },
+
+ observers: ['_pathChanged(route.path)'],
+
+ _pathChanged: function() {
+ this.async(function() {
+ if (!this.route.path) {
+ this.set('route.path', '/');
+ }
+ });
+ },
+
+ _setParams: function(category) {
+ return {
+ part: 'snippet', q: this.data.searchQuery,
+ key: 'AIzaSyAuecFZ9xJXbGDkQYWBmYrtzOGJD-iDIgI', type: 'video'
+ }
+ },
+
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/youtube-toolbar.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/youtube-toolbar.html
new file mode 100644
index 00000000000..a1f3ff5325b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/demo/youtube-demo/youtube-toolbar.html
@@ -0,0 +1,179 @@
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../../paper-styles/shadow.html">
+<link rel="import" href="../../../paper-icon-button/paper-icon-button.html">
+<link rel="import" href="../../../iron-icons/iron-icons.html">
+
+<dom-module id="youtube-toolbar">
+ <template>
+ <style>
+ :host {
+ display: block;
+ position: relative;
+ --paper-icon-button-ink-color: #fff;
+ --iron-icon-fill-color: #fff;
+ }
+
+ :host([collapsed]) #background {
+ transform: scaleY(calc(60/230));
+ }
+
+ :host([collapsed]) #youtube-logo {
+ transform: scale(calc(60/230)) translateY(-195px);
+ }
+
+ :host([collapsed]) #back {
+ transform: translateX(0);
+ }
+
+ :host([collapsed]) #content {
+ opacity: 0;
+ transition-delay: 0s;
+ transform: translateY(-10px);
+ }
+
+ #background {
+ height: 230px;
+ background-image: linear-gradient(#E7291A, #C21616);
+ @apply --shadow-elevation-2dp;
+ transform-origin: 0 0;
+ transition: transform 0.3s;
+ transform: scaleY(1);
+ }
+
+ #youtube-logo {
+ display: block;
+ position: absolute;
+ margin: auto;
+ top: 30px;
+
+ left: calc(50% - 75px);
+
+ width: 150px;
+ height: calc(150px / 1.45);
+ background-image: radial-gradient(transparent 50%, #fff 50%);
+ border-radius: 9% / 13%;
+ transition: transform 0.3s;
+ }
+
+ #youtube-logo:before,
+ #youtube-logo:after {
+ content: '';
+ display: block;
+ position: absolute;
+ background-color: #fff;
+ width: 90%;
+ height: 14%;
+ left: 5%;
+ border-radius: 100% / 90%;
+ }
+
+ #youtube-logo:before {
+ top: -3.7%;
+ }
+
+ #youtube-logo:after {
+ bottom: -3.7%;
+ }
+
+ #youtube-logo > .lr-edge {
+ display: block;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ }
+
+ #youtube-logo > .lr-edge:before,
+ #youtube-logo > .lr-edge:after {
+ content: '';
+ display: block;
+ position: absolute;
+ background-color: #fff;
+ width: 10%;
+ height: 90%;
+ top: 5%;
+
+ border-radius: 100% / 90%;
+ }
+
+ #youtube-logo > .lr-edge:before {
+ left: -2.5%;
+ }
+
+ #youtube-logo > .lr-edge:after {
+ right: -2.5%;
+ }
+
+ #youtube-logo > .play-icon {
+ display: block;
+ position: absolute;
+ width: 80%;
+ height: 80%;
+ top: 10%;
+ left: 10%;
+ overflow: hidden;
+ background-image:
+ linear-gradient(90deg, #fff 38%, transparent 38%),
+ linear-gradient(35deg, transparent 57%, rgba(0, 0, 0, 0.3) 57%);
+ }
+
+ #youtube-logo > .play-icon:before,
+ #youtube-logo > .play-icon:after {
+ content: '';
+ display: block;
+ position: absolute;
+ width: 200%;
+ height: 65%;
+ background-color: #fff;
+ }
+
+ #youtube-logo > .play-icon:before {
+ transform-origin: top left;
+ top: -80%;
+ transform: rotate(29deg);
+ }
+
+ #youtube-logo > .play-icon:after {
+ transform-origin: bottom left;
+ bottom: -80%;
+ transform: rotate(-29deg);
+ }
+
+ #content {
+ display: block;
+ position: absolute;
+ bottom: 0;
+ width: 100%;
+ transition: transform 0.15s, opacity 0.15s;
+ transition-delay: 0.2s;
+ }
+
+ #back {
+ position: absolute;
+ top: 10px;
+ transform: translateX(-64px);
+ transition: transform 0.3s;
+ }
+ </style>
+ <div id="background"></div>
+ <div id="youtube-logo">
+ <div class="lr-edge"></div>
+ <div class="play-icon"></div>
+ </div>
+ <div id="content">
+ <slot></slot>
+ </div>
+ <a id="back" href="../#/search/"><paper-icon-button icon="icons:arrow-back"></paper-icon-button></a>
+ </template>
+ <script>
+ Polymer({is: 'youtube-toolbar'});
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/index.html
new file mode 100644
index 00000000000..5b354f51bf1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/index.html
@@ -0,0 +1,27 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <title>app-router</title>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/package-lock.json
new file mode 100644
index 00000000000..733067118a0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/package-lock.json
@@ -0,0 +1,2388 @@
+{
+ "name": "@polymer/app-route",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.5"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "8.10.5"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "8.10.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.5.tgz",
+ "integrity": "sha512-ZPFmE9m1svkDUy9sK2/TaUYLEKslrETZFiH4AlVVEN7Wtow7sD3RCD6zSq/44vaiZxzQlKi769iL2yR/a+BQxg==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.5"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.5"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.5"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.44",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+ "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz",
+ "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.2",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.105",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.44",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.2",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/package.json
new file mode 100644
index 00000000000..c29cd7cc63f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/app-route/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "@polymer/app-route",
+ "private": true,
+ "description": "App routing expressed as Polymer Custom Elements.",
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.1.1",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/.bower.json
new file mode 100644
index 00000000000..a2e40778aff
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/.bower.json
@@ -0,0 +1,67 @@
+{
+ "name": "async",
+ "description": "Higher-order functions and common patterns for asynchronous code",
+ "main": "lib/async.js",
+ "keywords": [
+ "async",
+ "callback",
+ "utility",
+ "module"
+ ],
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/caolan/async.git"
+ },
+ "devDependencies": {
+ "benchmark": "bestiejs/benchmark.js",
+ "bluebird": "^2.9.32",
+ "chai": "^3.1.0",
+ "coveralls": "^2.11.2",
+ "es6-promise": "^2.3.0",
+ "jscs": "^1.13.1",
+ "jshint": "~2.8.0",
+ "karma": "^0.13.2",
+ "karma-browserify": "^4.2.1",
+ "karma-firefox-launcher": "^0.1.6",
+ "karma-mocha": "^0.2.0",
+ "karma-mocha-reporter": "^1.0.2",
+ "lodash": "^3.9.0",
+ "mkdirp": "~0.5.1",
+ "mocha": "^2.2.5",
+ "native-promise-only": "^0.8.0-a",
+ "nodeunit": ">0.0.0",
+ "nyc": "^2.1.0",
+ "rsvp": "^3.0.18",
+ "semver": "^4.3.6",
+ "uglify-js": "~2.4.0",
+ "xyz": "^0.5.0",
+ "yargs": "~3.9.1"
+ },
+ "moduleType": [
+ "amd",
+ "globals",
+ "node"
+ ],
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests"
+ ],
+ "authors": [
+ "Caolan McMahon"
+ ],
+ "version": "1.5.2",
+ "homepage": "https://github.com/caolan/async",
+ "_release": "1.5.2",
+ "_resolution": {
+ "type": "version",
+ "tag": "v1.5.2",
+ "commit": "a47eef3dac38d593180b1e2eaed7b512b022cb9f"
+ },
+ "_source": "https://github.com/caolan/async.git",
+ "_target": "^1.5.0",
+ "_originalSource": "async"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/CHANGELOG.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/CHANGELOG.md
new file mode 100644
index 00000000000..f15e08121b2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/CHANGELOG.md
@@ -0,0 +1,125 @@
+# v1.5.2
+- Allow using `"consructor"` as an argument in `memoize` (#998)
+- Give a better error messsage when `auto` dependency checking fails (#994)
+- Various doc updates (#936, #956, #979, #1002)
+
+# v1.5.1
+- Fix issue with `pause` in `queue` with concurrency enabled (#946)
+- `while` and `until` now pass the final result to callback (#963)
+- `auto` will properly handle concurrency when there is no callback (#966)
+- `auto` will now properly stop execution when an error occurs (#988, #993)
+- Various doc fixes (#971, #980)
+
+# v1.5.0
+
+- Added `transform`, analogous to [`_.transform`](http://lodash.com/docs#transform) (#892)
+- `map` now returns an object when an object is passed in, rather than array with non-numeric keys. `map` will begin always returning an array with numeric indexes in the next major release. (#873)
+- `auto` now accepts an optional `concurrency` argument to limit the number of running tasks (#637)
+- Added `queue#workersList()`, to retrieve the list of currently running tasks. (#891)
+- Various code simplifications (#896, #904)
+- Various doc fixes :scroll: (#890, #894, #903, #905, #912)
+
+# v1.4.2
+
+- Ensure coverage files don't get published on npm (#879)
+
+# v1.4.1
+
+- Add in overlooked `detectLimit` method (#866)
+- Removed unnecessary files from npm releases (#861)
+- Removed usage of a reserved word to prevent :boom: in older environments (#870)
+
+# v1.4.0
+
+- `asyncify` now supports promises (#840)
+- Added `Limit` versions of `filter` and `reject` (#836)
+- Add `Limit` versions of `detect`, `some` and `every` (#828, #829)
+- `some`, `every` and `detect` now short circuit early (#828, #829)
+- Improve detection of the global object (#804), enabling use in WebWorkers
+- `whilst` now called with arguments from iterator (#823)
+- `during` now gets called with arguments from iterator (#824)
+- Code simplifications and optimizations aplenty ([diff](https://github.com/caolan/async/compare/v1.3.0...v1.4.0))
+
+
+# v1.3.0
+
+New Features:
+- Added `constant`
+- Added `asyncify`/`wrapSync` for making sync functions work with callbacks. (#671, #806)
+- Added `during` and `doDuring`, which are like `whilst` with an async truth test. (#800)
+- `retry` now accepts an `interval` parameter to specify a delay between retries. (#793)
+- `async` should work better in Web Workers due to better `root` detection (#804)
+- Callbacks are now optional in `whilst`, `doWhilst`, `until`, and `doUntil` (#642)
+- Various internal updates (#786, #801, #802, #803)
+- Various doc fixes (#790, #794)
+
+Bug Fixes:
+- `cargo` now exposes the `payload` size, and `cargo.payload` can be changed on the fly after the `cargo` is created. (#740, #744, #783)
+
+
+# v1.2.1
+
+Bug Fix:
+
+- Small regression with synchronous iterator behavior in `eachSeries` with a 1-element array. Before 1.1.0, `eachSeries`'s callback was called on the same tick, which this patch restores. In 2.0.0, it will be called on the next tick. (#782)
+
+
+# v1.2.0
+
+New Features:
+
+- Added `timesLimit` (#743)
+- `concurrency` can be changed after initialization in `queue` by setting `q.concurrency`. The new concurrency will be reflected the next time a task is processed. (#747, #772)
+
+Bug Fixes:
+
+- Fixed a regression in `each` and family with empty arrays that have additional properties. (#775, #777)
+
+
+# v1.1.1
+
+Bug Fix:
+
+- Small regression with synchronous iterator behavior in `eachSeries` with a 1-element array. Before 1.1.0, `eachSeries`'s callback was called on the same tick, which this patch restores. In 2.0.0, it will be called on the next tick. (#782)
+
+
+# v1.1.0
+
+New Features:
+
+- `cargo` now supports all of the same methods and event callbacks as `queue`.
+- Added `ensureAsync` - A wrapper that ensures an async function calls its callback on a later tick. (#769)
+- Optimized `map`, `eachOf`, and `waterfall` families of functions
+- Passing a `null` or `undefined` array to `map`, `each`, `parallel` and families will be treated as an empty array (#667).
+- The callback is now optional for the composed results of `compose` and `seq`. (#618)
+- Reduced file size by 4kb, (minified version by 1kb)
+- Added code coverage through `nyc` and `coveralls` (#768)
+
+Bug Fixes:
+
+- `forever` will no longer stack overflow with a synchronous iterator (#622)
+- `eachLimit` and other limit functions will stop iterating once an error occurs (#754)
+- Always pass `null` in callbacks when there is no error (#439)
+- Ensure proper conditions when calling `drain()` after pushing an empty data set to a queue (#668)
+- `each` and family will properly handle an empty array (#578)
+- `eachSeries` and family will finish if the underlying array is modified during execution (#557)
+- `queue` will throw if a non-function is passed to `q.push()` (#593)
+- Doc fixes (#629, #766)
+
+
+# v1.0.0
+
+No known breaking changes, we are simply complying with semver from here on out.
+
+Changes:
+
+- Start using a changelog!
+- Add `forEachOf` for iterating over Objects (or to iterate Arrays with indexes available) (#168 #704 #321)
+- Detect deadlocks in `auto` (#663)
+- Better support for require.js (#527)
+- Throw if queue created with concurrency `0` (#714)
+- Fix unneeded iteration in `queue.resume()` (#758)
+- Guard against timer mocking overriding `setImmediate` (#609 #611)
+- Miscellaneous doc fixes (#542 #596 #615 #628 #631 #690 #729)
+- Use single noop function internally (#546)
+- Optimize internal `_each`, `_map` and `_keys` functions.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/LICENSE b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/LICENSE
new file mode 100644
index 00000000000..8f296985885
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2010-2014 Caolan McMahon
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/Makefile b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/Makefile
new file mode 100644
index 00000000000..87279f40cb1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/Makefile
@@ -0,0 +1,37 @@
+export PATH := ./node_modules/.bin/:$(PATH):./bin/
+
+PACKAGE = asyncjs
+XYZ = node_modules/.bin/xyz --repo git@github.com:caolan/async.git
+
+BUILDDIR = dist
+SRC = lib/async.js
+
+all: lint test clean build
+
+build: $(wildcard lib/*.js)
+ mkdir -p $(BUILDDIR)
+ cp $(SRC) $(BUILDDIR)/async.js
+ uglifyjs $(BUILDDIR)/async.js -mc \
+ --source-map $(BUILDDIR)/async.min.map \
+ -o $(BUILDDIR)/async.min.js
+
+test:
+ nodeunit test
+
+clean:
+ rm -rf $(BUILDDIR)
+
+lint:
+ jshint $(SRC) test/*.js mocha_test/* perf/*.js
+ jscs $(SRC) test/*.js mocha_test/* perf/*.js
+
+.PHONY: test lint build all clean
+
+
+.PHONY: release-major release-minor release-patch
+release-major release-minor release-patch: all
+ ./support/sync-package-managers.js
+ git add --force *.json
+ git add --force $(BUILDDIR)
+ git commit -am "update minified build"; true
+ $(XYZ) --increment $(@:release-%=%)
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/README.md
new file mode 100644
index 00000000000..316c40505c7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/README.md
@@ -0,0 +1,1877 @@
+# Async.js
+
+[![Build Status via Travis CI](https://travis-ci.org/caolan/async.svg?branch=master)](https://travis-ci.org/caolan/async)
+[![NPM version](http://img.shields.io/npm/v/async.svg)](https://www.npmjs.org/package/async)
+[![Coverage Status](https://coveralls.io/repos/caolan/async/badge.svg?branch=master)](https://coveralls.io/r/caolan/async?branch=master)
+[![Join the chat at https://gitter.im/caolan/async](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/caolan/async?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+
+Async is a utility module which provides straight-forward, powerful functions
+for working with asynchronous JavaScript. Although originally designed for
+use with [Node.js](http://nodejs.org) and installable via `npm install async`,
+it can also be used directly in the browser.
+
+Async is also installable via:
+
+- [bower](http://bower.io/): `bower install async`
+- [component](https://github.com/component/component): `component install
+ caolan/async`
+- [jam](http://jamjs.org/): `jam install async`
+- [spm](http://spmjs.io/): `spm install async`
+
+Async provides around 20 functions that include the usual 'functional'
+suspects (`map`, `reduce`, `filter`, `each`…) as well as some common patterns
+for asynchronous control flow (`parallel`, `series`, `waterfall`…). All these
+functions assume you follow the Node.js convention of providing a single
+callback as the last argument of your `async` function.
+
+
+## Quick Examples
+
+```javascript
+async.map(['file1','file2','file3'], fs.stat, function(err, results){
+ // results is now an array of stats for each file
+});
+
+async.filter(['file1','file2','file3'], fs.exists, function(results){
+ // results now equals an array of the existing files
+});
+
+async.parallel([
+ function(){ ... },
+ function(){ ... }
+], callback);
+
+async.series([
+ function(){ ... },
+ function(){ ... }
+]);
+```
+
+There are many more functions available so take a look at the docs below for a
+full list. This module aims to be comprehensive, so if you feel anything is
+missing please create a GitHub issue for it.
+
+## Common Pitfalls <sub>[(StackOverflow)](http://stackoverflow.com/questions/tagged/async.js)</sub>
+### Synchronous iteration functions
+
+If you get an error like `RangeError: Maximum call stack size exceeded.` or other stack overflow issues when using async, you are likely using a synchronous iterator. By *synchronous* we mean a function that calls its callback on the same tick in the javascript event loop, without doing any I/O or using any timers. Calling many callbacks iteratively will quickly overflow the stack. If you run into this issue, just defer your callback with `async.setImmediate` to start a new call stack on the next tick of the event loop.
+
+This can also arise by accident if you callback early in certain cases:
+
+```js
+async.eachSeries(hugeArray, function iterator(item, callback) {
+ if (inCache(item)) {
+ callback(null, cache[item]); // if many items are cached, you'll overflow
+ } else {
+ doSomeIO(item, callback);
+ }
+}, function done() {
+ //...
+});
+```
+
+Just change it to:
+
+```js
+async.eachSeries(hugeArray, function iterator(item, callback) {
+ if (inCache(item)) {
+ async.setImmediate(function () {
+ callback(null, cache[item]);
+ });
+ } else {
+ doSomeIO(item, callback);
+ //...
+```
+
+Async guards against synchronous functions in some, but not all, cases. If you are still running into stack overflows, you can defer as suggested above, or wrap functions with [`async.ensureAsync`](#ensureAsync) Functions that are asynchronous by their nature do not have this problem and don't need the extra callback deferral.
+
+If JavaScript's event loop is still a bit nebulous, check out [this article](http://blog.carbonfive.com/2013/10/27/the-javascript-event-loop-explained/) or [this talk](http://2014.jsconf.eu/speakers/philip-roberts-what-the-heck-is-the-event-loop-anyway.html) for more detailed information about how it works.
+
+
+### Multiple callbacks
+
+Make sure to always `return` when calling a callback early, otherwise you will cause multiple callbacks and unpredictable behavior in many cases.
+
+```js
+async.waterfall([
+ function (callback) {
+ getSomething(options, function (err, result) {
+ if (err) {
+ callback(new Error("failed getting something:" + err.message));
+ // we should return here
+ }
+ // since we did not return, this callback still will be called and
+ // `processData` will be called twice
+ callback(null, result);
+ });
+ },
+ processData
+], done)
+```
+
+It is always good practice to `return callback(err, result)` whenever a callback call is not the last statement of a function.
+
+
+### Binding a context to an iterator
+
+This section is really about `bind`, not about `async`. If you are wondering how to
+make `async` execute your iterators in a given context, or are confused as to why
+a method of another library isn't working as an iterator, study this example:
+
+```js
+// Here is a simple object with an (unnecessarily roundabout) squaring method
+var AsyncSquaringLibrary = {
+ squareExponent: 2,
+ square: function(number, callback){
+ var result = Math.pow(number, this.squareExponent);
+ setTimeout(function(){
+ callback(null, result);
+ }, 200);
+ }
+};
+
+async.map([1, 2, 3], AsyncSquaringLibrary.square, function(err, result){
+ // result is [NaN, NaN, NaN]
+ // This fails because the `this.squareExponent` expression in the square
+ // function is not evaluated in the context of AsyncSquaringLibrary, and is
+ // therefore undefined.
+});
+
+async.map([1, 2, 3], AsyncSquaringLibrary.square.bind(AsyncSquaringLibrary), function(err, result){
+ // result is [1, 4, 9]
+ // With the help of bind we can attach a context to the iterator before
+ // passing it to async. Now the square function will be executed in its
+ // 'home' AsyncSquaringLibrary context and the value of `this.squareExponent`
+ // will be as expected.
+});
+```
+
+## Download
+
+The source is available for download from
+[GitHub](https://github.com/caolan/async/blob/master/lib/async.js).
+Alternatively, you can install using Node Package Manager (`npm`):
+
+ npm install async
+
+As well as using Bower:
+
+ bower install async
+
+__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 29.6kb Uncompressed
+
+## In the Browser
+
+So far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5.
+
+Usage:
+
+```html
+<script type="text/javascript" src="async.js"></script>
+<script type="text/javascript">
+
+ async.map(data, asyncProcess, function(err, results){
+ alert(results);
+ });
+
+</script>
+```
+
+## Documentation
+
+Some functions are also available in the following forms:
+* `<name>Series` - the same as `<name>` but runs only a single async operation at a time
+* `<name>Limit` - the same as `<name>` but runs a maximum of `limit` async operations at a time
+
+### Collections
+
+* [`each`](#each), `eachSeries`, `eachLimit`
+* [`forEachOf`](#forEachOf), `forEachOfSeries`, `forEachOfLimit`
+* [`map`](#map), `mapSeries`, `mapLimit`
+* [`filter`](#filter), `filterSeries`, `filterLimit`
+* [`reject`](#reject), `rejectSeries`, `rejectLimit`
+* [`reduce`](#reduce), [`reduceRight`](#reduceRight)
+* [`detect`](#detect), `detectSeries`, `detectLimit`
+* [`sortBy`](#sortBy)
+* [`some`](#some), `someLimit`
+* [`every`](#every), `everyLimit`
+* [`concat`](#concat), `concatSeries`
+
+### Control Flow
+
+* [`series`](#seriestasks-callback)
+* [`parallel`](#parallel), `parallelLimit`
+* [`whilst`](#whilst), [`doWhilst`](#doWhilst)
+* [`until`](#until), [`doUntil`](#doUntil)
+* [`during`](#during), [`doDuring`](#doDuring)
+* [`forever`](#forever)
+* [`waterfall`](#waterfall)
+* [`compose`](#compose)
+* [`seq`](#seq)
+* [`applyEach`](#applyEach), `applyEachSeries`
+* [`queue`](#queue), [`priorityQueue`](#priorityQueue)
+* [`cargo`](#cargo)
+* [`auto`](#auto)
+* [`retry`](#retry)
+* [`iterator`](#iterator)
+* [`times`](#times), `timesSeries`, `timesLimit`
+
+### Utils
+
+* [`apply`](#apply)
+* [`nextTick`](#nextTick)
+* [`memoize`](#memoize)
+* [`unmemoize`](#unmemoize)
+* [`ensureAsync`](#ensureAsync)
+* [`constant`](#constant)
+* [`asyncify`](#asyncify)
+* [`wrapSync`](#wrapSync)
+* [`log`](#log)
+* [`dir`](#dir)
+* [`noConflict`](#noConflict)
+
+## Collections
+
+<a name="forEach" />
+<a name="each" />
+### each(arr, iterator, [callback])
+
+Applies the function `iterator` to each item in `arr`, in parallel.
+The `iterator` is called with an item from the list, and a callback for when it
+has finished. If the `iterator` passes an error to its `callback`, the main
+`callback` (for the `each` function) is immediately called with the error.
+
+Note, that since this function applies `iterator` to each item in parallel,
+there is no guarantee that the iterator functions will complete in order.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A function to apply to each item in `arr`.
+ The iterator is passed a `callback(err)` which must be called once it has
+ completed. If no error has occurred, the `callback` should be run without
+ arguments or with an explicit `null` argument. The array index is not passed
+ to the iterator. If you need the index, use [`forEachOf`](#forEachOf).
+* `callback(err)` - *Optional* A callback which is called when all `iterator` functions
+ have finished, or an error occurs.
+
+__Examples__
+
+
+```js
+// assuming openFiles is an array of file names and saveFile is a function
+// to save the modified contents of that file:
+
+async.each(openFiles, saveFile, function(err){
+ // if any of the saves produced an error, err would equal that error
+});
+```
+
+```js
+// assuming openFiles is an array of file names
+
+async.each(openFiles, function(file, callback) {
+
+ // Perform operation on file here.
+ console.log('Processing file ' + file);
+
+ if( file.length > 32 ) {
+ console.log('This file name is too long');
+ callback('File name too long');
+ } else {
+ // Do work to process file here
+ console.log('File processed');
+ callback();
+ }
+}, function(err){
+ // if any of the file processing produced an error, err would equal that error
+ if( err ) {
+ // One of the iterations produced an error.
+ // All processing will now stop.
+ console.log('A file failed to process');
+ } else {
+ console.log('All files have been processed successfully');
+ }
+});
+```
+
+__Related__
+
+* eachSeries(arr, iterator, [callback])
+* eachLimit(arr, limit, iterator, [callback])
+
+---------------------------------------
+
+<a name="forEachOf" />
+<a name="eachOf" />
+
+### forEachOf(obj, iterator, [callback])
+
+Like `each`, except that it iterates over objects, and passes the key as the second argument to the iterator.
+
+__Arguments__
+
+* `obj` - An object or array to iterate over.
+* `iterator(item, key, callback)` - A function to apply to each item in `obj`.
+The `key` is the item's key, or index in the case of an array. The iterator is
+passed a `callback(err)` which must be called once it has completed. If no
+error has occurred, the callback should be run without arguments or with an
+explicit `null` argument.
+* `callback(err)` - *Optional* A callback which is called when all `iterator` functions have finished, or an error occurs.
+
+__Example__
+
+```js
+var obj = {dev: "/dev.json", test: "/test.json", prod: "/prod.json"};
+var configs = {};
+
+async.forEachOf(obj, function (value, key, callback) {
+ fs.readFile(__dirname + value, "utf8", function (err, data) {
+ if (err) return callback(err);
+ try {
+ configs[key] = JSON.parse(data);
+ } catch (e) {
+ return callback(e);
+ }
+ callback();
+ })
+}, function (err) {
+ if (err) console.error(err.message);
+ // configs is now a map of JSON data
+ doSomethingWith(configs);
+})
+```
+
+__Related__
+
+* forEachOfSeries(obj, iterator, [callback])
+* forEachOfLimit(obj, limit, iterator, [callback])
+
+---------------------------------------
+
+<a name="map" />
+### map(arr, iterator, [callback])
+
+Produces a new array of values by mapping each value in `arr` through
+the `iterator` function. The `iterator` is called with an item from `arr` and a
+callback for when it has finished processing. Each of these callback takes 2 arguments:
+an `error`, and the transformed item from `arr`. If `iterator` passes an error to its
+callback, the main `callback` (for the `map` function) is immediately called with the error.
+
+Note, that since this function applies the `iterator` to each item in parallel,
+there is no guarantee that the `iterator` functions will complete in order.
+However, the results array will be in the same order as the original `arr`.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A function to apply to each item in `arr`.
+ The iterator is passed a `callback(err, transformed)` which must be called once
+ it has completed with an error (which can be `null`) and a transformed item.
+* `callback(err, results)` - *Optional* A callback which is called when all `iterator`
+ functions have finished, or an error occurs. Results is an array of the
+ transformed items from the `arr`.
+
+__Example__
+
+```js
+async.map(['file1','file2','file3'], fs.stat, function(err, results){
+ // results is now an array of stats for each file
+});
+```
+
+__Related__
+* mapSeries(arr, iterator, [callback])
+* mapLimit(arr, limit, iterator, [callback])
+
+---------------------------------------
+
+<a name="select" />
+<a name="filter" />
+### filter(arr, iterator, [callback])
+
+__Alias:__ `select`
+
+Returns a new array of all the values in `arr` which pass an async truth test.
+_The callback for each `iterator` call only accepts a single argument of `true` or
+`false`; it does not accept an error argument first!_ This is in-line with the
+way node libraries work with truth tests like `fs.exists`. This operation is
+performed in parallel, but the results array will be in the same order as the
+original.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A truth test to apply to each item in `arr`.
+ The `iterator` is passed a `callback(truthValue)`, which must be called with a
+ boolean argument once it has completed.
+* `callback(results)` - *Optional* A callback which is called after all the `iterator`
+ functions have finished.
+
+__Example__
+
+```js
+async.filter(['file1','file2','file3'], fs.exists, function(results){
+ // results now equals an array of the existing files
+});
+```
+
+__Related__
+
+* filterSeries(arr, iterator, [callback])
+* filterLimit(arr, limit, iterator, [callback])
+
+---------------------------------------
+
+<a name="reject" />
+### reject(arr, iterator, [callback])
+
+The opposite of [`filter`](#filter). Removes values that pass an `async` truth test.
+
+__Related__
+
+* rejectSeries(arr, iterator, [callback])
+* rejectLimit(arr, limit, iterator, [callback])
+
+---------------------------------------
+
+<a name="reduce" />
+### reduce(arr, memo, iterator, [callback])
+
+__Aliases:__ `inject`, `foldl`
+
+Reduces `arr` into a single value using an async `iterator` to return
+each successive step. `memo` is the initial state of the reduction.
+This function only operates in series.
+
+For performance reasons, it may make sense to split a call to this function into
+a parallel map, and then use the normal `Array.prototype.reduce` on the results.
+This function is for situations where each step in the reduction needs to be async;
+if you can get the data before reducing it, then it's probably a good idea to do so.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `memo` - The initial state of the reduction.
+* `iterator(memo, item, callback)` - A function applied to each item in the
+ array to produce the next step in the reduction. The `iterator` is passed a
+ `callback(err, reduction)` which accepts an optional error as its first
+ argument, and the state of the reduction as the second. If an error is
+ passed to the callback, the reduction is stopped and the main `callback` is
+ immediately called with the error.
+* `callback(err, result)` - *Optional* A callback which is called after all the `iterator`
+ functions have finished. Result is the reduced value.
+
+__Example__
+
+```js
+async.reduce([1,2,3], 0, function(memo, item, callback){
+ // pointless async:
+ process.nextTick(function(){
+ callback(null, memo + item)
+ });
+}, function(err, result){
+ // result is now equal to the last value of memo, which is 6
+});
+```
+
+---------------------------------------
+
+<a name="reduceRight" />
+### reduceRight(arr, memo, iterator, [callback])
+
+__Alias:__ `foldr`
+
+Same as [`reduce`](#reduce), only operates on `arr` in reverse order.
+
+
+---------------------------------------
+
+<a name="detect" />
+### detect(arr, iterator, [callback])
+
+Returns the first value in `arr` that passes an async truth test. The
+`iterator` is applied in parallel, meaning the first iterator to return `true` will
+fire the detect `callback` with that result. That means the result might not be
+the first item in the original `arr` (in terms of order) that passes the test.
+
+If order within the original `arr` is important, then look at [`detectSeries`](#detectSeries).
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A truth test to apply to each item in `arr`.
+ The iterator is passed a `callback(truthValue)` which must be called with a
+ boolean argument once it has completed. **Note: this callback does not take an error as its first argument.**
+* `callback(result)` - *Optional* A callback which is called as soon as any iterator returns
+ `true`, or after all the `iterator` functions have finished. Result will be
+ the first item in the array that passes the truth test (iterator) or the
+ value `undefined` if none passed. **Note: this callback does not take an error as its first argument.**
+
+__Example__
+
+```js
+async.detect(['file1','file2','file3'], fs.exists, function(result){
+ // result now equals the first file in the list that exists
+});
+```
+
+__Related__
+
+* detectSeries(arr, iterator, [callback])
+* detectLimit(arr, limit, iterator, [callback])
+
+---------------------------------------
+
+<a name="sortBy" />
+### sortBy(arr, iterator, [callback])
+
+Sorts a list by the results of running each `arr` value through an async `iterator`.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A function to apply to each item in `arr`.
+ The iterator is passed a `callback(err, sortValue)` which must be called once it
+ has completed with an error (which can be `null`) and a value to use as the sort
+ criteria.
+* `callback(err, results)` - *Optional* A callback which is called after all the `iterator`
+ functions have finished, or an error occurs. Results is the items from
+ the original `arr` sorted by the values returned by the `iterator` calls.
+
+__Example__
+
+```js
+async.sortBy(['file1','file2','file3'], function(file, callback){
+ fs.stat(file, function(err, stats){
+ callback(err, stats.mtime);
+ });
+}, function(err, results){
+ // results is now the original array of files sorted by
+ // modified date
+});
+```
+
+__Sort Order__
+
+By modifying the callback parameter the sorting order can be influenced:
+
+```js
+//ascending order
+async.sortBy([1,9,3,5], function(x, callback){
+ callback(null, x);
+}, function(err,result){
+ //result callback
+} );
+
+//descending order
+async.sortBy([1,9,3,5], function(x, callback){
+ callback(null, x*-1); //<- x*-1 instead of x, turns the order around
+}, function(err,result){
+ //result callback
+} );
+```
+
+---------------------------------------
+
+<a name="some" />
+### some(arr, iterator, [callback])
+
+__Alias:__ `any`
+
+Returns `true` if at least one element in the `arr` satisfies an async test.
+_The callback for each iterator call only accepts a single argument of `true` or
+`false`; it does not accept an error argument first!_ This is in-line with the
+way node libraries work with truth tests like `fs.exists`. Once any iterator
+call returns `true`, the main `callback` is immediately called.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A truth test to apply to each item in the array
+ in parallel. The iterator is passed a `callback(truthValue)`` which must be
+ called with a boolean argument once it has completed.
+* `callback(result)` - *Optional* A callback which is called as soon as any iterator returns
+ `true`, or after all the iterator functions have finished. Result will be
+ either `true` or `false` depending on the values of the async tests.
+
+ **Note: the callbacks do not take an error as their first argument.**
+__Example__
+
+```js
+async.some(['file1','file2','file3'], fs.exists, function(result){
+ // if result is true then at least one of the files exists
+});
+```
+
+__Related__
+
+* someLimit(arr, limit, iterator, callback)
+
+---------------------------------------
+
+<a name="every" />
+### every(arr, iterator, [callback])
+
+__Alias:__ `all`
+
+Returns `true` if every element in `arr` satisfies an async test.
+_The callback for each `iterator` call only accepts a single argument of `true` or
+`false`; it does not accept an error argument first!_ This is in-line with the
+way node libraries work with truth tests like `fs.exists`.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A truth test to apply to each item in the array
+ in parallel. The iterator is passed a `callback(truthValue)` which must be
+ called with a boolean argument once it has completed.
+* `callback(result)` - *Optional* A callback which is called as soon as any iterator returns
+ `false`, or after all the iterator functions have finished. Result will be
+ either `true` or `false` depending on the values of the async tests.
+
+ **Note: the callbacks do not take an error as their first argument.**
+
+__Example__
+
+```js
+async.every(['file1','file2','file3'], fs.exists, function(result){
+ // if result is true then every file exists
+});
+```
+
+__Related__
+
+* everyLimit(arr, limit, iterator, callback)
+
+---------------------------------------
+
+<a name="concat" />
+### concat(arr, iterator, [callback])
+
+Applies `iterator` to each item in `arr`, concatenating the results. Returns the
+concatenated list. The `iterator`s are called in parallel, and the results are
+concatenated as they return. There is no guarantee that the results array will
+be returned in the original order of `arr` passed to the `iterator` function.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A function to apply to each item in `arr`.
+ The iterator is passed a `callback(err, results)` which must be called once it
+ has completed with an error (which can be `null`) and an array of results.
+* `callback(err, results)` - *Optional* A callback which is called after all the `iterator`
+ functions have finished, or an error occurs. Results is an array containing
+ the concatenated results of the `iterator` function.
+
+__Example__
+
+```js
+async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){
+ // files is now a list of filenames that exist in the 3 directories
+});
+```
+
+__Related__
+
+* concatSeries(arr, iterator, [callback])
+
+
+## Control Flow
+
+<a name="series" />
+### series(tasks, [callback])
+
+Run the functions in the `tasks` array in series, each one running once the previous
+function has completed. If any functions in the series pass an error to its
+callback, no more functions are run, and `callback` is immediately called with the value of the error.
+Otherwise, `callback` receives an array of results when `tasks` have completed.
+
+It is also possible to use an object instead of an array. Each property will be
+run as a function, and the results will be passed to the final `callback` as an object
+instead of an array. This can be a more readable way of handling results from
+[`series`](#series).
+
+**Note** that while many implementations preserve the order of object properties, the
+[ECMAScript Language Specification](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6)
+explicitly states that
+
+> The mechanics and order of enumerating the properties is not specified.
+
+So if you rely on the order in which your series of functions are executed, and want
+this to work on all platforms, consider using an array.
+
+__Arguments__
+
+* `tasks` - An array or object containing functions to run, each function is passed
+ a `callback(err, result)` it must call on completion with an error `err` (which can
+ be `null`) and an optional `result` value.
+* `callback(err, results)` - An optional callback to run once all the functions
+ have completed. This function gets a results array (or object) containing all
+ the result arguments passed to the `task` callbacks.
+
+__Example__
+
+```js
+async.series([
+ function(callback){
+ // do some stuff ...
+ callback(null, 'one');
+ },
+ function(callback){
+ // do some more stuff ...
+ callback(null, 'two');
+ }
+],
+// optional callback
+function(err, results){
+ // results is now equal to ['one', 'two']
+});
+
+
+// an example using an object instead of an array
+async.series({
+ one: function(callback){
+ setTimeout(function(){
+ callback(null, 1);
+ }, 200);
+ },
+ two: function(callback){
+ setTimeout(function(){
+ callback(null, 2);
+ }, 100);
+ }
+},
+function(err, results) {
+ // results is now equal to: {one: 1, two: 2}
+});
+```
+
+---------------------------------------
+
+<a name="parallel" />
+### parallel(tasks, [callback])
+
+Run the `tasks` array of functions in parallel, without waiting until the previous
+function has completed. If any of the functions pass an error to its
+callback, the main `callback` is immediately called with the value of the error.
+Once the `tasks` have completed, the results are passed to the final `callback` as an
+array.
+
+**Note:** `parallel` is about kicking-off I/O tasks in parallel, not about parallel execution of code. If your tasks do not use any timers or perform any I/O, they will actually be executed in series. Any synchronous setup sections for each task will happen one after the other. JavaScript remains single-threaded.
+
+It is also possible to use an object instead of an array. Each property will be
+run as a function and the results will be passed to the final `callback` as an object
+instead of an array. This can be a more readable way of handling results from
+[`parallel`](#parallel).
+
+
+__Arguments__
+
+* `tasks` - An array or object containing functions to run. Each function is passed
+ a `callback(err, result)` which it must call on completion with an error `err`
+ (which can be `null`) and an optional `result` value.
+* `callback(err, results)` - An optional callback to run once all the functions
+ have completed successfully. This function gets a results array (or object) containing all
+ the result arguments passed to the task callbacks.
+
+__Example__
+
+```js
+async.parallel([
+ function(callback){
+ setTimeout(function(){
+ callback(null, 'one');
+ }, 200);
+ },
+ function(callback){
+ setTimeout(function(){
+ callback(null, 'two');
+ }, 100);
+ }
+],
+// optional callback
+function(err, results){
+ // the results array will equal ['one','two'] even though
+ // the second function had a shorter timeout.
+});
+
+
+// an example using an object instead of an array
+async.parallel({
+ one: function(callback){
+ setTimeout(function(){
+ callback(null, 1);
+ }, 200);
+ },
+ two: function(callback){
+ setTimeout(function(){
+ callback(null, 2);
+ }, 100);
+ }
+},
+function(err, results) {
+ // results is now equals to: {one: 1, two: 2}
+});
+```
+
+__Related__
+
+* parallelLimit(tasks, limit, [callback])
+
+---------------------------------------
+
+<a name="whilst" />
+### whilst(test, fn, callback)
+
+Repeatedly call `fn`, while `test` returns `true`. Calls `callback` when stopped,
+or an error occurs.
+
+__Arguments__
+
+* `test()` - synchronous truth test to perform before each execution of `fn`.
+* `fn(callback)` - A function which is called each time `test` passes. The function is
+ passed a `callback(err)`, which must be called once it has completed with an
+ optional `err` argument.
+* `callback(err, [results])` - A callback which is called after the test
+ function has failed and repeated execution of `fn` has stopped. `callback`
+ will be passed an error and any arguments passed to the final `fn`'s callback.
+
+__Example__
+
+```js
+var count = 0;
+
+async.whilst(
+ function () { return count < 5; },
+ function (callback) {
+ count++;
+ setTimeout(function () {
+ callback(null, count);
+ }, 1000);
+ },
+ function (err, n) {
+ // 5 seconds have passed, n = 5
+ }
+);
+```
+
+---------------------------------------
+
+<a name="doWhilst" />
+### doWhilst(fn, test, callback)
+
+The post-check version of [`whilst`](#whilst). To reflect the difference in
+the order of operations, the arguments `test` and `fn` are switched.
+
+`doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript.
+
+---------------------------------------
+
+<a name="until" />
+### until(test, fn, callback)
+
+Repeatedly call `fn` until `test` returns `true`. Calls `callback` when stopped,
+or an error occurs. `callback` will be passed an error and any arguments passed
+to the final `fn`'s callback.
+
+The inverse of [`whilst`](#whilst).
+
+---------------------------------------
+
+<a name="doUntil" />
+### doUntil(fn, test, callback)
+
+Like [`doWhilst`](#doWhilst), except the `test` is inverted. Note the argument ordering differs from `until`.
+
+---------------------------------------
+
+<a name="during" />
+### during(test, fn, callback)
+
+Like [`whilst`](#whilst), except the `test` is an asynchronous function that is passed a callback in the form of `function (err, truth)`. If error is passed to `test` or `fn`, the main callback is immediately called with the value of the error.
+
+__Example__
+
+```js
+var count = 0;
+
+async.during(
+ function (callback) {
+ return callback(null, count < 5);
+ },
+ function (callback) {
+ count++;
+ setTimeout(callback, 1000);
+ },
+ function (err) {
+ // 5 seconds have passed
+ }
+);
+```
+
+---------------------------------------
+
+<a name="doDuring" />
+### doDuring(fn, test, callback)
+
+The post-check version of [`during`](#during). To reflect the difference in
+the order of operations, the arguments `test` and `fn` are switched.
+
+Also a version of [`doWhilst`](#doWhilst) with asynchronous `test` function.
+
+---------------------------------------
+
+<a name="forever" />
+### forever(fn, [errback])
+
+Calls the asynchronous function `fn` with a callback parameter that allows it to
+call itself again, in series, indefinitely.
+
+If an error is passed to the callback then `errback` is called with the
+error, and execution stops, otherwise it will never be called.
+
+```js
+async.forever(
+ function(next) {
+ // next is suitable for passing to things that need a callback(err [, whatever]);
+ // it will result in this function being called again.
+ },
+ function(err) {
+ // if next is called with a value in its first parameter, it will appear
+ // in here as 'err', and execution will stop.
+ }
+);
+```
+
+---------------------------------------
+
+<a name="waterfall" />
+### waterfall(tasks, [callback])
+
+Runs the `tasks` array of functions in series, each passing their results to the next in
+the array. However, if any of the `tasks` pass an error to their own callback, the
+next function is not executed, and the main `callback` is immediately called with
+the error.
+
+__Arguments__
+
+* `tasks` - An array of functions to run, each function is passed a
+ `callback(err, result1, result2, ...)` it must call on completion. The first
+ argument is an error (which can be `null`) and any further arguments will be
+ passed as arguments in order to the next task.
+* `callback(err, [results])` - An optional callback to run once all the functions
+ have completed. This will be passed the results of the last task's callback.
+
+
+
+__Example__
+
+```js
+async.waterfall([
+ function(callback) {
+ callback(null, 'one', 'two');
+ },
+ function(arg1, arg2, callback) {
+ // arg1 now equals 'one' and arg2 now equals 'two'
+ callback(null, 'three');
+ },
+ function(arg1, callback) {
+ // arg1 now equals 'three'
+ callback(null, 'done');
+ }
+], function (err, result) {
+ // result now equals 'done'
+});
+```
+Or, with named functions:
+
+```js
+async.waterfall([
+ myFirstFunction,
+ mySecondFunction,
+ myLastFunction,
+], function (err, result) {
+ // result now equals 'done'
+});
+function myFirstFunction(callback) {
+ callback(null, 'one', 'two');
+}
+function mySecondFunction(arg1, arg2, callback) {
+ // arg1 now equals 'one' and arg2 now equals 'two'
+ callback(null, 'three');
+}
+function myLastFunction(arg1, callback) {
+ // arg1 now equals 'three'
+ callback(null, 'done');
+}
+```
+
+Or, if you need to pass any argument to the first function:
+
+```js
+async.waterfall([
+ async.apply(myFirstFunction, 'zero'),
+ mySecondFunction,
+ myLastFunction,
+], function (err, result) {
+ // result now equals 'done'
+});
+function myFirstFunction(arg1, callback) {
+ // arg1 now equals 'zero'
+ callback(null, 'one', 'two');
+}
+function mySecondFunction(arg1, arg2, callback) {
+ // arg1 now equals 'one' and arg2 now equals 'two'
+ callback(null, 'three');
+}
+function myLastFunction(arg1, callback) {
+ // arg1 now equals 'three'
+ callback(null, 'done');
+}
+```
+
+---------------------------------------
+<a name="compose" />
+### compose(fn1, fn2...)
+
+Creates a function which is a composition of the passed asynchronous
+functions. Each function consumes the return value of the function that
+follows. Composing functions `f()`, `g()`, and `h()` would produce the result of
+`f(g(h()))`, only this version uses callbacks to obtain the return values.
+
+Each function is executed with the `this` binding of the composed function.
+
+__Arguments__
+
+* `functions...` - the asynchronous functions to compose
+
+
+__Example__
+
+```js
+function add1(n, callback) {
+ setTimeout(function () {
+ callback(null, n + 1);
+ }, 10);
+}
+
+function mul3(n, callback) {
+ setTimeout(function () {
+ callback(null, n * 3);
+ }, 10);
+}
+
+var add1mul3 = async.compose(mul3, add1);
+
+add1mul3(4, function (err, result) {
+ // result now equals 15
+});
+```
+
+---------------------------------------
+<a name="seq" />
+### seq(fn1, fn2...)
+
+Version of the compose function that is more natural to read.
+Each function consumes the return value of the previous function.
+It is the equivalent of [`compose`](#compose) with the arguments reversed.
+
+Each function is executed with the `this` binding of the composed function.
+
+__Arguments__
+
+* `functions...` - the asynchronous functions to compose
+
+
+__Example__
+
+```js
+// Requires lodash (or underscore), express3 and dresende's orm2.
+// Part of an app, that fetches cats of the logged user.
+// This example uses `seq` function to avoid overnesting and error
+// handling clutter.
+app.get('/cats', function(request, response) {
+ var User = request.models.User;
+ async.seq(
+ _.bind(User.get, User), // 'User.get' has signature (id, callback(err, data))
+ function(user, fn) {
+ user.getCats(fn); // 'getCats' has signature (callback(err, data))
+ }
+ )(req.session.user_id, function (err, cats) {
+ if (err) {
+ console.error(err);
+ response.json({ status: 'error', message: err.message });
+ } else {
+ response.json({ status: 'ok', message: 'Cats found', data: cats });
+ }
+ });
+});
+```
+
+---------------------------------------
+<a name="applyEach" />
+### applyEach(fns, args..., callback)
+
+Applies the provided arguments to each function in the array, calling
+`callback` after all functions have completed. If you only provide the first
+argument, then it will return a function which lets you pass in the
+arguments as if it were a single function call.
+
+__Arguments__
+
+* `fns` - the asynchronous functions to all call with the same arguments
+* `args...` - any number of separate arguments to pass to the function
+* `callback` - the final argument should be the callback, called when all
+ functions have completed processing
+
+
+__Example__
+
+```js
+async.applyEach([enableSearch, updateSchema], 'bucket', callback);
+
+// partial application example:
+async.each(
+ buckets,
+ async.applyEach([enableSearch, updateSchema]),
+ callback
+);
+```
+
+__Related__
+
+* applyEachSeries(tasks, args..., [callback])
+
+---------------------------------------
+
+<a name="queue" />
+### queue(worker, [concurrency])
+
+Creates a `queue` object with the specified `concurrency`. Tasks added to the
+`queue` are processed in parallel (up to the `concurrency` limit). If all
+`worker`s are in progress, the task is queued until one becomes available.
+Once a `worker` completes a `task`, that `task`'s callback is called.
+
+__Arguments__
+
+* `worker(task, callback)` - An asynchronous function for processing a queued
+ task, which must call its `callback(err)` argument when finished, with an
+ optional `error` as an argument. If you want to handle errors from an individual task, pass a callback to `q.push()`.
+* `concurrency` - An `integer` for determining how many `worker` functions should be
+ run in parallel. If omitted, the concurrency defaults to `1`. If the concurrency is `0`, an error is thrown.
+
+__Queue objects__
+
+The `queue` object returned by this function has the following properties and
+methods:
+
+* `length()` - a function returning the number of items waiting to be processed.
+* `started` - a function returning whether or not any items have been pushed and processed by the queue
+* `running()` - a function returning the number of items currently being processed.
+* `workersList()` - a function returning the array of items currently being processed.
+* `idle()` - a function returning false if there are items waiting or being processed, or true if not.
+* `concurrency` - an integer for determining how many `worker` functions should be
+ run in parallel. This property can be changed after a `queue` is created to
+ alter the concurrency on-the-fly.
+* `push(task, [callback])` - add a new task to the `queue`. Calls `callback` once
+ the `worker` has finished processing the task. Instead of a single task, a `tasks` array
+ can be submitted. The respective callback is used for every task in the list.
+* `unshift(task, [callback])` - add a new task to the front of the `queue`.
+* `saturated` - a callback that is called when the `queue` length hits the `concurrency` limit,
+ and further tasks will be queued.
+* `empty` - a callback that is called when the last item from the `queue` is given to a `worker`.
+* `drain` - a callback that is called when the last item from the `queue` has returned from the `worker`.
+* `paused` - a boolean for determining whether the queue is in a paused state
+* `pause()` - a function that pauses the processing of tasks until `resume()` is called.
+* `resume()` - a function that resumes the processing of queued tasks when the queue is paused.
+* `kill()` - a function that removes the `drain` callback and empties remaining tasks from the queue forcing it to go idle.
+
+__Example__
+
+```js
+// create a queue object with concurrency 2
+
+var q = async.queue(function (task, callback) {
+ console.log('hello ' + task.name);
+ callback();
+}, 2);
+
+
+// assign a callback
+q.drain = function() {
+ console.log('all items have been processed');
+}
+
+// add some items to the queue
+
+q.push({name: 'foo'}, function (err) {
+ console.log('finished processing foo');
+});
+q.push({name: 'bar'}, function (err) {
+ console.log('finished processing bar');
+});
+
+// add some items to the queue (batch-wise)
+
+q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {
+ console.log('finished processing item');
+});
+
+// add some items to the front of the queue
+
+q.unshift({name: 'bar'}, function (err) {
+ console.log('finished processing bar');
+});
+```
+
+
+---------------------------------------
+
+<a name="priorityQueue" />
+### priorityQueue(worker, concurrency)
+
+The same as [`queue`](#queue) only tasks are assigned a priority and completed in ascending priority order. There are two differences between `queue` and `priorityQueue` objects:
+
+* `push(task, priority, [callback])` - `priority` should be a number. If an array of
+ `tasks` is given, all tasks will be assigned the same priority.
+* The `unshift` method was removed.
+
+---------------------------------------
+
+<a name="cargo" />
+### cargo(worker, [payload])
+
+Creates a `cargo` object with the specified payload. Tasks added to the
+cargo will be processed altogether (up to the `payload` limit). If the
+`worker` is in progress, the task is queued until it becomes available. Once
+the `worker` has completed some tasks, each callback of those tasks is called.
+Check out [these](https://camo.githubusercontent.com/6bbd36f4cf5b35a0f11a96dcd2e97711ffc2fb37/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130382f62626330636662302d356632392d313165322d393734662d3333393763363464633835382e676966) [animations](https://camo.githubusercontent.com/f4810e00e1c5f5f8addbe3e9f49064fd5d102699/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130312f38346339323036362d356632392d313165322d383134662d3964336430323431336266642e676966) for how `cargo` and `queue` work.
+
+While [queue](#queue) passes only one task to one of a group of workers
+at a time, cargo passes an array of tasks to a single worker, repeating
+when the worker is finished.
+
+__Arguments__
+
+* `worker(tasks, callback)` - An asynchronous function for processing an array of
+ queued tasks, which must call its `callback(err)` argument when finished, with
+ an optional `err` argument.
+* `payload` - An optional `integer` for determining how many tasks should be
+ processed per round; if omitted, the default is unlimited.
+
+__Cargo objects__
+
+The `cargo` object returned by this function has the following properties and
+methods:
+
+* `length()` - A function returning the number of items waiting to be processed.
+* `payload` - An `integer` for determining how many tasks should be
+ process per round. This property can be changed after a `cargo` is created to
+ alter the payload on-the-fly.
+* `push(task, [callback])` - Adds `task` to the `queue`. The callback is called
+ once the `worker` has finished processing the task. Instead of a single task, an array of `tasks`
+ can be submitted. The respective callback is used for every task in the list.
+* `saturated` - A callback that is called when the `queue.length()` hits the concurrency and further tasks will be queued.
+* `empty` - A callback that is called when the last item from the `queue` is given to a `worker`.
+* `drain` - A callback that is called when the last item from the `queue` has returned from the `worker`.
+* `idle()`, `pause()`, `resume()`, `kill()` - cargo inherits all of the same methods and event calbacks as [`queue`](#queue)
+
+__Example__
+
+```js
+// create a cargo object with payload 2
+
+var cargo = async.cargo(function (tasks, callback) {
+ for(var i=0; i<tasks.length; i++){
+ console.log('hello ' + tasks[i].name);
+ }
+ callback();
+}, 2);
+
+
+// add some items
+
+cargo.push({name: 'foo'}, function (err) {
+ console.log('finished processing foo');
+});
+cargo.push({name: 'bar'}, function (err) {
+ console.log('finished processing bar');
+});
+cargo.push({name: 'baz'}, function (err) {
+ console.log('finished processing baz');
+});
+```
+
+---------------------------------------
+
+<a name="auto" />
+### auto(tasks, [concurrency], [callback])
+
+Determines the best order for running the functions in `tasks`, based on their requirements. Each function can optionally depend on other functions being completed first, and each function is run as soon as its requirements are satisfied.
+
+If any of the functions pass an error to their callback, the `auto` sequence will stop. Further tasks will not execute (so any other functions depending on it will not run), and the main `callback` is immediately called with the error. Functions also receive an object containing the results of functions which have completed so far.
+
+Note, all functions are called with a `results` object as a second argument,
+so it is unsafe to pass functions in the `tasks` object which cannot handle the
+extra argument.
+
+For example, this snippet of code:
+
+```js
+async.auto({
+ readData: async.apply(fs.readFile, 'data.txt', 'utf-8')
+}, callback);
+```
+
+will have the effect of calling `readFile` with the results object as the last
+argument, which will fail:
+
+```js
+fs.readFile('data.txt', 'utf-8', cb, {});
+```
+
+Instead, wrap the call to `readFile` in a function which does not forward the
+`results` object:
+
+```js
+async.auto({
+ readData: function(cb, results){
+ fs.readFile('data.txt', 'utf-8', cb);
+ }
+}, callback);
+```
+
+__Arguments__
+
+* `tasks` - An object. Each of its properties is either a function or an array of
+ requirements, with the function itself the last item in the array. The object's key
+ of a property serves as the name of the task defined by that property,
+ i.e. can be used when specifying requirements for other tasks.
+ The function receives two arguments: (1) a `callback(err, result)` which must be
+ called when finished, passing an `error` (which can be `null`) and the result of
+ the function's execution, and (2) a `results` object, containing the results of
+ the previously executed functions.
+* `concurrency` - An optional `integer` for determining the maximum number of tasks that can be run in parallel. By default, as many as possible.
+* `callback(err, results)` - An optional callback which is called when all the
+ tasks have been completed. It receives the `err` argument if any `tasks`
+ pass an error to their callback. Results are always returned; however, if
+ an error occurs, no further `tasks` will be performed, and the results
+ object will only contain partial results.
+
+
+__Example__
+
+```js
+async.auto({
+ get_data: function(callback){
+ console.log('in get_data');
+ // async code to get some data
+ callback(null, 'data', 'converted to array');
+ },
+ make_folder: function(callback){
+ console.log('in make_folder');
+ // async code to create a directory to store a file in
+ // this is run at the same time as getting the data
+ callback(null, 'folder');
+ },
+ write_file: ['get_data', 'make_folder', function(callback, results){
+ console.log('in write_file', JSON.stringify(results));
+ // once there is some data and the directory exists,
+ // write the data to a file in the directory
+ callback(null, 'filename');
+ }],
+ email_link: ['write_file', function(callback, results){
+ console.log('in email_link', JSON.stringify(results));
+ // once the file is written let's email a link to it...
+ // results.write_file contains the filename returned by write_file.
+ callback(null, {'file':results.write_file, 'email':'user@example.com'});
+ }]
+}, function(err, results) {
+ console.log('err = ', err);
+ console.log('results = ', results);
+});
+```
+
+This is a fairly trivial example, but to do this using the basic parallel and
+series functions would look like this:
+
+```js
+async.parallel([
+ function(callback){
+ console.log('in get_data');
+ // async code to get some data
+ callback(null, 'data', 'converted to array');
+ },
+ function(callback){
+ console.log('in make_folder');
+ // async code to create a directory to store a file in
+ // this is run at the same time as getting the data
+ callback(null, 'folder');
+ }
+],
+function(err, results){
+ async.series([
+ function(callback){
+ console.log('in write_file', JSON.stringify(results));
+ // once there is some data and the directory exists,
+ // write the data to a file in the directory
+ results.push('filename');
+ callback(null);
+ },
+ function(callback){
+ console.log('in email_link', JSON.stringify(results));
+ // once the file is written let's email a link to it...
+ callback(null, {'file':results.pop(), 'email':'user@example.com'});
+ }
+ ]);
+});
+```
+
+For a complicated series of `async` tasks, using the [`auto`](#auto) function makes adding
+new tasks much easier (and the code more readable).
+
+
+---------------------------------------
+
+<a name="retry" />
+### retry([opts = {times: 5, interval: 0}| 5], task, [callback])
+
+Attempts to get a successful response from `task` no more than `times` times before
+returning an error. If the task is successful, the `callback` will be passed the result
+of the successful task. If all attempts fail, the callback will be passed the error and
+result (if any) of the final attempt.
+
+__Arguments__
+
+* `opts` - Can be either an object with `times` and `interval` or a number.
+ * `times` - The number of attempts to make before giving up. The default is `5`.
+ * `interval` - The time to wait between retries, in milliseconds. The default is `0`.
+ * If `opts` is a number, the number specifies the number of times to retry, with the default interval of `0`.
+* `task(callback, results)` - A function which receives two arguments: (1) a `callback(err, result)`
+ which must be called when finished, passing `err` (which can be `null`) and the `result` of
+ the function's execution, and (2) a `results` object, containing the results of
+ the previously executed functions (if nested inside another control flow).
+* `callback(err, results)` - An optional callback which is called when the
+ task has succeeded, or after the final failed attempt. It receives the `err` and `result` arguments of the last attempt at completing the `task`.
+
+The [`retry`](#retry) function can be used as a stand-alone control flow by passing a callback, as shown below:
+
+```js
+// try calling apiMethod 3 times
+async.retry(3, apiMethod, function(err, result) {
+ // do something with the result
+});
+```
+
+```js
+// try calling apiMethod 3 times, waiting 200 ms between each retry
+async.retry({times: 3, interval: 200}, apiMethod, function(err, result) {
+ // do something with the result
+});
+```
+
+```js
+// try calling apiMethod the default 5 times no delay between each retry
+async.retry(apiMethod, function(err, result) {
+ // do something with the result
+});
+```
+
+It can also be embedded within other control flow functions to retry individual methods
+that are not as reliable, like this:
+
+```js
+async.auto({
+ users: api.getUsers.bind(api),
+ payments: async.retry(3, api.getPayments.bind(api))
+}, function(err, results) {
+ // do something with the results
+});
+```
+
+
+---------------------------------------
+
+<a name="iterator" />
+### iterator(tasks)
+
+Creates an iterator function which calls the next function in the `tasks` array,
+returning a continuation to call the next one after that. It's also possible to
+“peek” at the next iterator with `iterator.next()`.
+
+This function is used internally by the `async` module, but can be useful when
+you want to manually control the flow of functions in series.
+
+__Arguments__
+
+* `tasks` - An array of functions to run.
+
+__Example__
+
+```js
+var iterator = async.iterator([
+ function(){ sys.p('one'); },
+ function(){ sys.p('two'); },
+ function(){ sys.p('three'); }
+]);
+
+node> var iterator2 = iterator();
+'one'
+node> var iterator3 = iterator2();
+'two'
+node> iterator3();
+'three'
+node> var nextfn = iterator2.next();
+node> nextfn();
+'three'
+```
+
+---------------------------------------
+
+<a name="apply" />
+### apply(function, arguments..)
+
+Creates a continuation function with some arguments already applied.
+
+Useful as a shorthand when combined with other control flow functions. Any arguments
+passed to the returned function are added to the arguments originally passed
+to apply.
+
+__Arguments__
+
+* `function` - The function you want to eventually apply all arguments to.
+* `arguments...` - Any number of arguments to automatically apply when the
+ continuation is called.
+
+__Example__
+
+```js
+// using apply
+
+async.parallel([
+ async.apply(fs.writeFile, 'testfile1', 'test1'),
+ async.apply(fs.writeFile, 'testfile2', 'test2'),
+]);
+
+
+// the same process without using apply
+
+async.parallel([
+ function(callback){
+ fs.writeFile('testfile1', 'test1', callback);
+ },
+ function(callback){
+ fs.writeFile('testfile2', 'test2', callback);
+ }
+]);
+```
+
+It's possible to pass any number of additional arguments when calling the
+continuation:
+
+```js
+node> var fn = async.apply(sys.puts, 'one');
+node> fn('two', 'three');
+one
+two
+three
+```
+
+---------------------------------------
+
+<a name="nextTick" />
+### nextTick(callback), setImmediate(callback)
+
+Calls `callback` on a later loop around the event loop. In Node.js this just
+calls `process.nextTick`; in the browser it falls back to `setImmediate(callback)`
+if available, otherwise `setTimeout(callback, 0)`, which means other higher priority
+events may precede the execution of `callback`.
+
+This is used internally for browser-compatibility purposes.
+
+__Arguments__
+
+* `callback` - The function to call on a later loop around the event loop.
+
+__Example__
+
+```js
+var call_order = [];
+async.nextTick(function(){
+ call_order.push('two');
+ // call_order now equals ['one','two']
+});
+call_order.push('one')
+```
+
+<a name="times" />
+### times(n, iterator, [callback])
+
+Calls the `iterator` function `n` times, and accumulates results in the same manner
+you would use with [`map`](#map).
+
+__Arguments__
+
+* `n` - The number of times to run the function.
+* `iterator` - The function to call `n` times.
+* `callback` - see [`map`](#map)
+
+__Example__
+
+```js
+// Pretend this is some complicated async factory
+var createUser = function(id, callback) {
+ callback(null, {
+ id: 'user' + id
+ })
+}
+// generate 5 users
+async.times(5, function(n, next){
+ createUser(n, function(err, user) {
+ next(err, user)
+ })
+}, function(err, users) {
+ // we should now have 5 users
+});
+```
+
+__Related__
+
+* timesSeries(n, iterator, [callback])
+* timesLimit(n, limit, iterator, [callback])
+
+
+## Utils
+
+<a name="memoize" />
+### memoize(fn, [hasher])
+
+Caches the results of an `async` function. When creating a hash to store function
+results against, the callback is omitted from the hash and an optional hash
+function can be used.
+
+If no hash function is specified, the first argument is used as a hash key, which may work reasonably if it is a string or a data type that converts to a distinct string. Note that objects and arrays will not behave reasonably. Neither will cases where the other arguments are significant. In such cases, specify your own hash function.
+
+The cache of results is exposed as the `memo` property of the function returned
+by `memoize`.
+
+__Arguments__
+
+* `fn` - The function to proxy and cache results from.
+* `hasher` - An optional function for generating a custom hash for storing
+ results. It has all the arguments applied to it apart from the callback, and
+ must be synchronous.
+
+__Example__
+
+```js
+var slow_fn = function (name, callback) {
+ // do something
+ callback(null, result);
+};
+var fn = async.memoize(slow_fn);
+
+// fn can now be used as if it were slow_fn
+fn('some name', function () {
+ // callback
+});
+```
+
+<a name="unmemoize" />
+### unmemoize(fn)
+
+Undoes a [`memoize`](#memoize)d function, reverting it to the original, unmemoized
+form. Handy for testing.
+
+__Arguments__
+
+* `fn` - the memoized function
+
+---------------------------------------
+
+<a name="ensureAsync" />
+### ensureAsync(fn)
+
+Wrap an async function and ensure it calls its callback on a later tick of the event loop. If the function already calls its callback on a next tick, no extra deferral is added. This is useful for preventing stack overflows (`RangeError: Maximum call stack size exceeded`) and generally keeping [Zalgo](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony) contained.
+
+__Arguments__
+
+* `fn` - an async function, one that expects a node-style callback as its last argument
+
+Returns a wrapped function with the exact same call signature as the function passed in.
+
+__Example__
+
+```js
+function sometimesAsync(arg, callback) {
+ if (cache[arg]) {
+ return callback(null, cache[arg]); // this would be synchronous!!
+ } else {
+ doSomeIO(arg, callback); // this IO would be asynchronous
+ }
+}
+
+// this has a risk of stack overflows if many results are cached in a row
+async.mapSeries(args, sometimesAsync, done);
+
+// this will defer sometimesAsync's callback if necessary,
+// preventing stack overflows
+async.mapSeries(args, async.ensureAsync(sometimesAsync), done);
+
+```
+
+---------------------------------------
+
+<a name="constant">
+### constant(values...)
+
+Returns a function that when called, calls-back with the values provided. Useful as the first function in a `waterfall`, or for plugging values in to `auto`.
+
+__Example__
+
+```js
+async.waterfall([
+ async.constant(42),
+ function (value, next) {
+ // value === 42
+ },
+ //...
+], callback);
+
+async.waterfall([
+ async.constant(filename, "utf8"),
+ fs.readFile,
+ function (fileData, next) {
+ //...
+ }
+ //...
+], callback);
+
+async.auto({
+ hostname: async.constant("https://server.net/"),
+ port: findFreePort,
+ launchServer: ["hostname", "port", function (cb, options) {
+ startServer(options, cb);
+ }],
+ //...
+}, callback);
+
+```
+
+---------------------------------------
+
+<a name="asyncify">
+<a name="wrapSync">
+### asyncify(func)
+
+__Alias:__ `wrapSync`
+
+Take a sync function and make it async, passing its return value to a callback. This is useful for plugging sync functions into a waterfall, series, or other async functions. Any arguments passed to the generated function will be passed to the wrapped function (except for the final callback argument). Errors thrown will be passed to the callback.
+
+__Example__
+
+```js
+async.waterfall([
+ async.apply(fs.readFile, filename, "utf8"),
+ async.asyncify(JSON.parse),
+ function (data, next) {
+ // data is the result of parsing the text.
+ // If there was a parsing error, it would have been caught.
+ }
+], callback)
+```
+
+If the function passed to `asyncify` returns a Promise, that promises's resolved/rejected state will be used to call the callback, rather than simply the synchronous return value. Example:
+
+```js
+async.waterfall([
+ async.apply(fs.readFile, filename, "utf8"),
+ async.asyncify(function (contents) {
+ return db.model.create(contents);
+ }),
+ function (model, next) {
+ // `model` is the instantiated model object.
+ // If there was an error, this function would be skipped.
+ }
+], callback)
+```
+
+This also means you can asyncify ES2016 `async` functions.
+
+```js
+var q = async.queue(async.asyncify(async function (file) {
+ var intermediateStep = await processFile(file);
+ return await somePromise(intermediateStep)
+}));
+
+q.push(files);
+```
+
+---------------------------------------
+
+<a name="log" />
+### log(function, arguments)
+
+Logs the result of an `async` function to the `console`. Only works in Node.js or
+in browsers that support `console.log` and `console.error` (such as FF and Chrome).
+If multiple arguments are returned from the async function, `console.log` is
+called on each argument in order.
+
+__Arguments__
+
+* `function` - The function you want to eventually apply all arguments to.
+* `arguments...` - Any number of arguments to apply to the function.
+
+__Example__
+
+```js
+var hello = function(name, callback){
+ setTimeout(function(){
+ callback(null, 'hello ' + name);
+ }, 1000);
+};
+```
+```js
+node> async.log(hello, 'world');
+'hello world'
+```
+
+---------------------------------------
+
+<a name="dir" />
+### dir(function, arguments)
+
+Logs the result of an `async` function to the `console` using `console.dir` to
+display the properties of the resulting object. Only works in Node.js or
+in browsers that support `console.dir` and `console.error` (such as FF and Chrome).
+If multiple arguments are returned from the async function, `console.dir` is
+called on each argument in order.
+
+__Arguments__
+
+* `function` - The function you want to eventually apply all arguments to.
+* `arguments...` - Any number of arguments to apply to the function.
+
+__Example__
+
+```js
+var hello = function(name, callback){
+ setTimeout(function(){
+ callback(null, {hello: name});
+ }, 1000);
+};
+```
+```js
+node> async.dir(hello, 'world');
+{hello: 'world'}
+```
+
+---------------------------------------
+
+<a name="noConflict" />
+### noConflict()
+
+Changes the value of `async` back to its original value, returning a reference to the
+`async` object.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/bower.json
new file mode 100644
index 00000000000..0ce24babbcf
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/bower.json
@@ -0,0 +1,57 @@
+{
+ "name": "async",
+ "description": "Higher-order functions and common patterns for asynchronous code",
+ "main": "lib/async.js",
+ "keywords": [
+ "async",
+ "callback",
+ "utility",
+ "module"
+ ],
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/caolan/async.git"
+ },
+ "devDependencies": {
+ "benchmark": "bestiejs/benchmark.js",
+ "bluebird": "^2.9.32",
+ "chai": "^3.1.0",
+ "coveralls": "^2.11.2",
+ "es6-promise": "^2.3.0",
+ "jscs": "^1.13.1",
+ "jshint": "~2.8.0",
+ "karma": "^0.13.2",
+ "karma-browserify": "^4.2.1",
+ "karma-firefox-launcher": "^0.1.6",
+ "karma-mocha": "^0.2.0",
+ "karma-mocha-reporter": "^1.0.2",
+ "lodash": "^3.9.0",
+ "mkdirp": "~0.5.1",
+ "mocha": "^2.2.5",
+ "native-promise-only": "^0.8.0-a",
+ "nodeunit": ">0.0.0",
+ "nyc": "^2.1.0",
+ "rsvp": "^3.0.18",
+ "semver": "^4.3.6",
+ "uglify-js": "~2.4.0",
+ "xyz": "^0.5.0",
+ "yargs": "~3.9.1"
+ },
+ "moduleType": [
+ "amd",
+ "globals",
+ "node"
+ ],
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests"
+ ],
+ "authors": [
+ "Caolan McMahon"
+ ],
+ "version": "1.5.2"
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/component.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/component.json
new file mode 100644
index 00000000000..103558d6d1d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/component.json
@@ -0,0 +1,17 @@
+{
+ "name": "async",
+ "description": "Higher-order functions and common patterns for asynchronous code",
+ "version": "1.5.2",
+ "keywords": [
+ "async",
+ "callback",
+ "utility",
+ "module"
+ ],
+ "license": "MIT",
+ "main": "lib/async.js",
+ "repository": "caolan/async",
+ "scripts": [
+ "lib/async.js"
+ ]
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/deps/nodeunit.css b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/deps/nodeunit.css
new file mode 100644
index 00000000000..274434a4ac8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/deps/nodeunit.css
@@ -0,0 +1,70 @@
+/*!
+ * Styles taken from qunit.css
+ */
+
+h1#nodeunit-header, h1.nodeunit-header {
+ padding: 15px;
+ font-size: large;
+ background-color: #06b;
+ color: white;
+ font-family: 'trebuchet ms', verdana, arial;
+ margin: 0;
+}
+
+h1#nodeunit-header a {
+ color: white;
+}
+
+h2#nodeunit-banner {
+ height: 2em;
+ border-bottom: 1px solid white;
+ background-color: #eee;
+ margin: 0;
+ font-family: 'trebuchet ms', verdana, arial;
+}
+h2#nodeunit-banner.pass {
+ background-color: green;
+}
+h2#nodeunit-banner.fail {
+ background-color: red;
+}
+
+h2#nodeunit-userAgent, h2.nodeunit-userAgent {
+ padding: 10px;
+ background-color: #eee;
+ color: black;
+ margin: 0;
+ font-size: small;
+ font-weight: normal;
+ font-family: 'trebuchet ms', verdana, arial;
+ font-size: 10pt;
+}
+
+div#nodeunit-testrunner-toolbar {
+ background: #eee;
+ border-top: 1px solid black;
+ padding: 10px;
+ font-family: 'trebuchet ms', verdana, arial;
+ margin: 0;
+ font-size: 10pt;
+}
+
+ol#nodeunit-tests {
+ font-family: 'trebuchet ms', verdana, arial;
+ font-size: 10pt;
+}
+ol#nodeunit-tests li strong {
+ cursor:pointer;
+}
+ol#nodeunit-tests .pass {
+ color: green;
+}
+ol#nodeunit-tests .fail {
+ color: red;
+}
+
+p#nodeunit-testresult {
+ margin-left: 1em;
+ font-size: 10pt;
+ font-family: 'trebuchet ms', verdana, arial;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/deps/nodeunit.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/deps/nodeunit.js
new file mode 100644
index 00000000000..6251ba13e68
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/deps/nodeunit.js
@@ -0,0 +1,2117 @@
+/*!
+ * Nodeunit
+ * https://github.com/caolan/nodeunit
+ * Copyright (c) 2010 Caolan McMahon
+ * MIT Licensed
+ *
+ * json2.js
+ * http://www.JSON.org/json2.js
+ * Public Domain.
+ * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+ */
+nodeunit = (function(){
+/*
+ http://www.JSON.org/json2.js
+ 2010-11-17
+
+ Public Domain.
+
+ NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+
+ See http://www.JSON.org/js.html
+
+
+ This code should be minified before deployment.
+ See http://javascript.crockford.com/jsmin.html
+
+ USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
+ NOT CONTROL.
+
+
+ This file creates a global JSON object containing two methods: stringify
+ and parse.
+
+ JSON.stringify(value, replacer, space)
+ value any JavaScript value, usually an object or array.
+
+ replacer an optional parameter that determines how object
+ values are stringified for objects. It can be a
+ function or an array of strings.
+
+ space an optional parameter that specifies the indentation
+ of nested structures. If it is omitted, the text will
+ be packed without extra whitespace. If it is a number,
+ it will specify the number of spaces to indent at each
+ level. If it is a string (such as '\t' or '&nbsp;'),
+ it contains the characters used to indent at each level.
+
+ This method produces a JSON text from a JavaScript value.
+
+ When an object value is found, if the object contains a toJSON
+ method, its toJSON method will be called and the result will be
+ stringified. A toJSON method does not serialize: it returns the
+ value represented by the name/value pair that should be serialized,
+ or undefined if nothing should be serialized. The toJSON method
+ will be passed the key associated with the value, and this will be
+ bound to the value
+
+ For example, this would serialize Dates as ISO strings.
+
+ Date.prototype.toJSON = function (key) {
+ function f(n) {
+ // Format integers to have at least two digits.
+ return n < 10 ? '0' + n : n;
+ }
+
+ return this.getUTCFullYear() + '-' +
+ f(this.getUTCMonth() + 1) + '-' +
+ f(this.getUTCDate()) + 'T' +
+ f(this.getUTCHours()) + ':' +
+ f(this.getUTCMinutes()) + ':' +
+ f(this.getUTCSeconds()) + 'Z';
+ };
+
+ You can provide an optional replacer method. It will be passed the
+ key and value of each member, with this bound to the containing
+ object. The value that is returned from your method will be
+ serialized. If your method returns undefined, then the member will
+ be excluded from the serialization.
+
+ If the replacer parameter is an array of strings, then it will be
+ used to select the members to be serialized. It filters the results
+ such that only members with keys listed in the replacer array are
+ stringified.
+
+ Values that do not have JSON representations, such as undefined or
+ functions, will not be serialized. Such values in objects will be
+ dropped; in arrays they will be replaced with null. You can use
+ a replacer function to replace those with JSON values.
+ JSON.stringify(undefined) returns undefined.
+
+ The optional space parameter produces a stringification of the
+ value that is filled with line breaks and indentation to make it
+ easier to read.
+
+ If the space parameter is a non-empty string, then that string will
+ be used for indentation. If the space parameter is a number, then
+ the indentation will be that many spaces.
+
+ Example:
+
+ text = JSON.stringify(['e', {pluribus: 'unum'}]);
+ // text is '["e",{"pluribus":"unum"}]'
+
+
+ text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
+ // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
+
+ text = JSON.stringify([new Date()], function (key, value) {
+ return this[key] instanceof Date ?
+ 'Date(' + this[key] + ')' : value;
+ });
+ // text is '["Date(---current time---)"]'
+
+
+ JSON.parse(text, reviver)
+ This method parses a JSON text to produce an object or array.
+ It can throw a SyntaxError exception.
+
+ The optional reviver parameter is a function that can filter and
+ transform the results. It receives each of the keys and values,
+ and its return value is used instead of the original value.
+ If it returns what it received, then the structure is not modified.
+ If it returns undefined then the member is deleted.
+
+ Example:
+
+ // Parse the text. Values that look like ISO date strings will
+ // be converted to Date objects.
+
+ myData = JSON.parse(text, function (key, value) {
+ var a;
+ if (typeof value === 'string') {
+ a =
+/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
+ if (a) {
+ return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
+ +a[5], +a[6]));
+ }
+ }
+ return value;
+ });
+
+ myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
+ var d;
+ if (typeof value === 'string' &&
+ value.slice(0, 5) === 'Date(' &&
+ value.slice(-1) === ')') {
+ d = new Date(value.slice(5, -1));
+ if (d) {
+ return d;
+ }
+ }
+ return value;
+ });
+
+
+ This is a reference implementation. You are free to copy, modify, or
+ redistribute.
+*/
+
+/*jslint evil: true, strict: false, regexp: false */
+
+/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
+ call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
+ getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
+ lastIndex, length, parse, prototype, push, replace, slice, stringify,
+ test, toJSON, toString, valueOf
+*/
+
+
+// Create a JSON object only if one does not already exist. We create the
+// methods in a closure to avoid creating global variables.
+
+var JSON = {};
+
+(function () {
+ "use strict";
+
+ function f(n) {
+ // Format integers to have at least two digits.
+ return n < 10 ? '0' + n : n;
+ }
+
+ if (typeof Date.prototype.toJSON !== 'function') {
+
+ Date.prototype.toJSON = function (key) {
+
+ return isFinite(this.valueOf()) ?
+ this.getUTCFullYear() + '-' +
+ f(this.getUTCMonth() + 1) + '-' +
+ f(this.getUTCDate()) + 'T' +
+ f(this.getUTCHours()) + ':' +
+ f(this.getUTCMinutes()) + ':' +
+ f(this.getUTCSeconds()) + 'Z' : null;
+ };
+
+ String.prototype.toJSON =
+ Number.prototype.toJSON =
+ Boolean.prototype.toJSON = function (key) {
+ return this.valueOf();
+ };
+ }
+
+ var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
+ escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
+ gap,
+ indent,
+ meta = { // table of character substitutions
+ '\b': '\\b',
+ '\t': '\\t',
+ '\n': '\\n',
+ '\f': '\\f',
+ '\r': '\\r',
+ '"' : '\\"',
+ '\\': '\\\\'
+ },
+ rep;
+
+
+ function quote(string) {
+
+// If the string contains no control characters, no quote characters, and no
+// backslash characters, then we can safely slap some quotes around it.
+// Otherwise we must also replace the offending characters with safe escape
+// sequences.
+
+ escapable.lastIndex = 0;
+ return escapable.test(string) ?
+ '"' + string.replace(escapable, function (a) {
+ var c = meta[a];
+ return typeof c === 'string' ? c :
+ '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+ }) + '"' :
+ '"' + string + '"';
+ }
+
+
+ function str(key, holder) {
+
+// Produce a string from holder[key].
+
+ var i, // The loop counter.
+ k, // The member key.
+ v, // The member value.
+ length,
+ mind = gap,
+ partial,
+ value = holder[key];
+
+// If the value has a toJSON method, call it to obtain a replacement value.
+
+ if (value && typeof value === 'object' &&
+ typeof value.toJSON === 'function') {
+ value = value.toJSON(key);
+ }
+
+// If we were called with a replacer function, then call the replacer to
+// obtain a replacement value.
+
+ if (typeof rep === 'function') {
+ value = rep.call(holder, key, value);
+ }
+
+// What happens next depends on the value's type.
+
+ switch (typeof value) {
+ case 'string':
+ return quote(value);
+
+ case 'number':
+
+// JSON numbers must be finite. Encode non-finite numbers as null.
+
+ return isFinite(value) ? String(value) : 'null';
+
+ case 'boolean':
+ case 'null':
+
+// If the value is a boolean or null, convert it to a string. Note:
+// typeof null does not produce 'null'. The case is included here in
+// the remote chance that this gets fixed someday.
+
+ return String(value);
+
+// If the type is 'object', we might be dealing with an object or an array or
+// null.
+
+ case 'object':
+
+// Due to a specification blunder in ECMAScript, typeof null is 'object',
+// so watch out for that case.
+
+ if (!value) {
+ return 'null';
+ }
+
+// Make an array to hold the partial results of stringifying this object value.
+
+ gap += indent;
+ partial = [];
+
+// Is the value an array?
+
+ if (Object.prototype.toString.apply(value) === '[object Array]') {
+
+// The value is an array. Stringify every element. Use null as a placeholder
+// for non-JSON values.
+
+ length = value.length;
+ for (i = 0; i < length; i += 1) {
+ partial[i] = str(i, value) || 'null';
+ }
+
+// Join all of the elements together, separated with commas, and wrap them in
+// brackets.
+
+ v = partial.length === 0 ? '[]' :
+ gap ? '[\n' + gap +
+ partial.join(',\n' + gap) + '\n' +
+ mind + ']' :
+ '[' + partial.join(',') + ']';
+ gap = mind;
+ return v;
+ }
+
+// If the replacer is an array, use it to select the members to be stringified.
+
+ if (rep && typeof rep === 'object') {
+ length = rep.length;
+ for (i = 0; i < length; i += 1) {
+ k = rep[i];
+ if (typeof k === 'string') {
+ v = str(k, value);
+ if (v) {
+ partial.push(quote(k) + (gap ? ': ' : ':') + v);
+ }
+ }
+ }
+ } else {
+
+// Otherwise, iterate through all of the keys in the object.
+
+ for (k in value) {
+ if (Object.hasOwnProperty.call(value, k)) {
+ v = str(k, value);
+ if (v) {
+ partial.push(quote(k) + (gap ? ': ' : ':') + v);
+ }
+ }
+ }
+ }
+
+// Join all of the member texts together, separated with commas,
+// and wrap them in braces.
+
+ v = partial.length === 0 ? '{}' :
+ gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
+ mind + '}' : '{' + partial.join(',') + '}';
+ gap = mind;
+ return v;
+ }
+ }
+
+// If the JSON object does not yet have a stringify method, give it one.
+
+ if (typeof JSON.stringify !== 'function') {
+ JSON.stringify = function (value, replacer, space) {
+
+// The stringify method takes a value and an optional replacer, and an optional
+// space parameter, and returns a JSON text. The replacer can be a function
+// that can replace values, or an array of strings that will select the keys.
+// A default replacer method can be provided. Use of the space parameter can
+// produce text that is more easily readable.
+
+ var i;
+ gap = '';
+ indent = '';
+
+// If the space parameter is a number, make an indent string containing that
+// many spaces.
+
+ if (typeof space === 'number') {
+ for (i = 0; i < space; i += 1) {
+ indent += ' ';
+ }
+
+// If the space parameter is a string, it will be used as the indent string.
+
+ } else if (typeof space === 'string') {
+ indent = space;
+ }
+
+// If there is a replacer, it must be a function or an array.
+// Otherwise, throw an error.
+
+ rep = replacer;
+ if (replacer && typeof replacer !== 'function' &&
+ (typeof replacer !== 'object' ||
+ typeof replacer.length !== 'number')) {
+ throw new Error('JSON.stringify');
+ }
+
+// Make a fake root object containing our value under the key of ''.
+// Return the result of stringifying the value.
+
+ return str('', {'': value});
+ };
+ }
+
+
+// If the JSON object does not yet have a parse method, give it one.
+
+ if (typeof JSON.parse !== 'function') {
+ JSON.parse = function (text, reviver) {
+
+// The parse method takes a text and an optional reviver function, and returns
+// a JavaScript value if the text is a valid JSON text.
+
+ var j;
+
+ function walk(holder, key) {
+
+// The walk method is used to recursively walk the resulting structure so
+// that modifications can be made.
+
+ var k, v, value = holder[key];
+ if (value && typeof value === 'object') {
+ for (k in value) {
+ if (Object.hasOwnProperty.call(value, k)) {
+ v = walk(value, k);
+ if (v !== undefined) {
+ value[k] = v;
+ } else {
+ delete value[k];
+ }
+ }
+ }
+ }
+ return reviver.call(holder, key, value);
+ }
+
+
+// Parsing happens in four stages. In the first stage, we replace certain
+// Unicode characters with escape sequences. JavaScript handles many characters
+// incorrectly, either silently deleting them, or treating them as line endings.
+
+ text = String(text);
+ cx.lastIndex = 0;
+ if (cx.test(text)) {
+ text = text.replace(cx, function (a) {
+ return '\\u' +
+ ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+ });
+ }
+
+// In the second stage, we run the text against regular expressions that look
+// for non-JSON patterns. We are especially concerned with '()' and 'new'
+// because they can cause invocation, and '=' because it can cause mutation.
+// But just to be safe, we want to reject all unexpected forms.
+
+// We split the second stage into 4 regexp operations in order to work around
+// crippling inefficiencies in IE's and Safari's regexp engines. First we
+// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
+// replace all simple value tokens with ']' characters. Third, we delete all
+// open brackets that follow a colon or comma or that begin the text. Finally,
+// we look to see that the remaining characters are only whitespace or ']' or
+// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
+
+ if (/^[\],:{}\s]*$/
+.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
+.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
+.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
+
+// In the third stage we use the eval function to compile the text into a
+// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
+// in JavaScript: it can begin a block or an object literal. We wrap the text
+// in parens to eliminate the ambiguity.
+
+ j = eval('(' + text + ')');
+
+// In the optional fourth stage, we recursively walk the new structure, passing
+// each name/value pair to a reviver function for possible transformation.
+
+ return typeof reviver === 'function' ?
+ walk({'': j}, '') : j;
+ }
+
+// If the text is not JSON parseable, then a SyntaxError is thrown.
+
+ throw new SyntaxError('JSON.parse');
+ };
+ }
+}());
+var assert = this.assert = {};
+var types = {};
+var core = {};
+var nodeunit = {};
+var reporter = {};
+/*global setTimeout: false, console: false */
+(function () {
+
+ var async = {};
+
+ // global on the server, window in the browser
+ var root = this,
+ previous_async = root.async;
+
+ if (typeof module !== 'undefined' && module.exports) {
+ module.exports = async;
+ }
+ else {
+ root.async = async;
+ }
+
+ async.noConflict = function () {
+ root.async = previous_async;
+ return async;
+ };
+
+ //// cross-browser compatiblity functions ////
+
+ var _forEach = function (arr, iterator) {
+ if (arr.forEach) {
+ return arr.forEach(iterator);
+ }
+ for (var i = 0; i < arr.length; i += 1) {
+ iterator(arr[i], i, arr);
+ }
+ };
+
+ var _map = function (arr, iterator) {
+ if (arr.map) {
+ return arr.map(iterator);
+ }
+ var results = [];
+ _forEach(arr, function (x, i, a) {
+ results.push(iterator(x, i, a));
+ });
+ return results;
+ };
+
+ var _reduce = function (arr, iterator, memo) {
+ if (arr.reduce) {
+ return arr.reduce(iterator, memo);
+ }
+ _forEach(arr, function (x, i, a) {
+ memo = iterator(memo, x, i, a);
+ });
+ return memo;
+ };
+
+ var _keys = function (obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ }
+ var keys = [];
+ for (var k in obj) {
+ if (obj.hasOwnProperty(k)) {
+ keys.push(k);
+ }
+ }
+ return keys;
+ };
+
+ var _indexOf = function (arr, item) {
+ if (arr.indexOf) {
+ return arr.indexOf(item);
+ }
+ for (var i = 0; i < arr.length; i += 1) {
+ if (arr[i] === item) {
+ return i;
+ }
+ }
+ return -1;
+ };
+
+ //// exported async module functions ////
+
+ //// nextTick implementation with browser-compatible fallback ////
+ if (typeof setImmediate === 'function') {
+ async.nextTick = function (fn) {
+ setImmediate(fn);
+ };
+ }
+ else if (typeof process !== 'undefined' && process.nextTick) {
+ async.nextTick = process.nextTick;
+ }
+ else {
+ async.nextTick = function (fn) {
+ setTimeout(fn, 0);
+ };
+ }
+
+ async.forEach = function (arr, iterator, callback) {
+ if (!arr.length) {
+ return callback();
+ }
+ var completed = 0;
+ _forEach(arr, function (x) {
+ iterator(x, function (err) {
+ if (err) {
+ callback(err);
+ callback = function () {};
+ }
+ else {
+ completed += 1;
+ if (completed === arr.length) {
+ callback();
+ }
+ }
+ });
+ });
+ };
+
+ async.forEachSeries = function (arr, iterator, callback) {
+ if (!arr.length) {
+ return callback();
+ }
+ var completed = 0;
+ var iterate = function () {
+ iterator(arr[completed], function (err) {
+ if (err) {
+ callback(err);
+ callback = function () {};
+ }
+ else {
+ completed += 1;
+ if (completed === arr.length) {
+ callback();
+ }
+ else {
+ iterate();
+ }
+ }
+ });
+ };
+ iterate();
+ };
+
+
+ var doParallel = function (fn) {
+ return function () {
+ var args = Array.prototype.slice.call(arguments);
+ return fn.apply(null, [async.forEach].concat(args));
+ };
+ };
+ var doSeries = function (fn) {
+ return function () {
+ var args = Array.prototype.slice.call(arguments);
+ return fn.apply(null, [async.forEachSeries].concat(args));
+ };
+ };
+
+
+ var _asyncMap = function (eachfn, arr, iterator, callback) {
+ var results = [];
+ arr = _map(arr, function (x, i) {
+ return {index: i, value: x};
+ });
+ eachfn(arr, function (x, callback) {
+ iterator(x.value, function (err, v) {
+ results[x.index] = v;
+ callback(err);
+ });
+ }, function (err) {
+ callback(err, results);
+ });
+ };
+ async.map = doParallel(_asyncMap);
+ async.mapSeries = doSeries(_asyncMap);
+
+
+ // reduce only has a series version, as doing reduce in parallel won't
+ // work in many situations.
+ async.reduce = function (arr, memo, iterator, callback) {
+ async.forEachSeries(arr, function (x, callback) {
+ iterator(memo, x, function (err, v) {
+ memo = v;
+ callback(err);
+ });
+ }, function (err) {
+ callback(err, memo);
+ });
+ };
+ // inject alias
+ async.inject = async.reduce;
+ // foldl alias
+ async.foldl = async.reduce;
+
+ async.reduceRight = function (arr, memo, iterator, callback) {
+ var reversed = _map(arr, function (x) {
+ return x;
+ }).reverse();
+ async.reduce(reversed, memo, iterator, callback);
+ };
+ // foldr alias
+ async.foldr = async.reduceRight;
+
+ var _filter = function (eachfn, arr, iterator, callback) {
+ var results = [];
+ arr = _map(arr, function (x, i) {
+ return {index: i, value: x};
+ });
+ eachfn(arr, function (x, callback) {
+ iterator(x.value, function (v) {
+ if (v) {
+ results.push(x);
+ }
+ callback();
+ });
+ }, function (err) {
+ callback(_map(results.sort(function (a, b) {
+ return a.index - b.index;
+ }), function (x) {
+ return x.value;
+ }));
+ });
+ };
+ async.filter = doParallel(_filter);
+ async.filterSeries = doSeries(_filter);
+ // select alias
+ async.select = async.filter;
+ async.selectSeries = async.filterSeries;
+
+ var _reject = function (eachfn, arr, iterator, callback) {
+ var results = [];
+ arr = _map(arr, function (x, i) {
+ return {index: i, value: x};
+ });
+ eachfn(arr, function (x, callback) {
+ iterator(x.value, function (v) {
+ if (!v) {
+ results.push(x);
+ }
+ callback();
+ });
+ }, function (err) {
+ callback(_map(results.sort(function (a, b) {
+ return a.index - b.index;
+ }), function (x) {
+ return x.value;
+ }));
+ });
+ };
+ async.reject = doParallel(_reject);
+ async.rejectSeries = doSeries(_reject);
+
+ var _detect = function (eachfn, arr, iterator, main_callback) {
+ eachfn(arr, function (x, callback) {
+ iterator(x, function (result) {
+ if (result) {
+ main_callback(x);
+ }
+ else {
+ callback();
+ }
+ });
+ }, function (err) {
+ main_callback();
+ });
+ };
+ async.detect = doParallel(_detect);
+ async.detectSeries = doSeries(_detect);
+
+ async.some = function (arr, iterator, main_callback) {
+ async.forEach(arr, function (x, callback) {
+ iterator(x, function (v) {
+ if (v) {
+ main_callback(true);
+ main_callback = function () {};
+ }
+ callback();
+ });
+ }, function (err) {
+ main_callback(false);
+ });
+ };
+ // any alias
+ async.any = async.some;
+
+ async.every = function (arr, iterator, main_callback) {
+ async.forEach(arr, function (x, callback) {
+ iterator(x, function (v) {
+ if (!v) {
+ main_callback(false);
+ main_callback = function () {};
+ }
+ callback();
+ });
+ }, function (err) {
+ main_callback(true);
+ });
+ };
+ // all alias
+ async.all = async.every;
+
+ async.sortBy = function (arr, iterator, callback) {
+ async.map(arr, function (x, callback) {
+ iterator(x, function (err, criteria) {
+ if (err) {
+ callback(err);
+ }
+ else {
+ callback(null, {value: x, criteria: criteria});
+ }
+ });
+ }, function (err, results) {
+ if (err) {
+ return callback(err);
+ }
+ else {
+ var fn = function (left, right) {
+ var a = left.criteria, b = right.criteria;
+ return a < b ? -1 : a > b ? 1 : 0;
+ };
+ callback(null, _map(results.sort(fn), function (x) {
+ return x.value;
+ }));
+ }
+ });
+ };
+
+ async.auto = function (tasks, callback) {
+ callback = callback || function () {};
+ var keys = _keys(tasks);
+ if (!keys.length) {
+ return callback(null);
+ }
+
+ var completed = [];
+
+ var listeners = [];
+ var addListener = function (fn) {
+ listeners.unshift(fn);
+ };
+ var removeListener = function (fn) {
+ for (var i = 0; i < listeners.length; i += 1) {
+ if (listeners[i] === fn) {
+ listeners.splice(i, 1);
+ return;
+ }
+ }
+ };
+ var taskComplete = function () {
+ _forEach(listeners, function (fn) {
+ fn();
+ });
+ };
+
+ addListener(function () {
+ if (completed.length === keys.length) {
+ callback(null);
+ }
+ });
+
+ _forEach(keys, function (k) {
+ var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k];
+ var taskCallback = function (err) {
+ if (err) {
+ callback(err);
+ // stop subsequent errors hitting callback multiple times
+ callback = function () {};
+ }
+ else {
+ completed.push(k);
+ taskComplete();
+ }
+ };
+ var requires = task.slice(0, Math.abs(task.length - 1)) || [];
+ var ready = function () {
+ return _reduce(requires, function (a, x) {
+ return (a && _indexOf(completed, x) !== -1);
+ }, true);
+ };
+ if (ready()) {
+ task[task.length - 1](taskCallback);
+ }
+ else {
+ var listener = function () {
+ if (ready()) {
+ removeListener(listener);
+ task[task.length - 1](taskCallback);
+ }
+ };
+ addListener(listener);
+ }
+ });
+ };
+
+ async.waterfall = function (tasks, callback) {
+ if (!tasks.length) {
+ return callback();
+ }
+ callback = callback || function () {};
+ var wrapIterator = function (iterator) {
+ return function (err) {
+ if (err) {
+ callback(err);
+ callback = function () {};
+ }
+ else {
+ var args = Array.prototype.slice.call(arguments, 1);
+ var next = iterator.next();
+ if (next) {
+ args.push(wrapIterator(next));
+ }
+ else {
+ args.push(callback);
+ }
+ async.nextTick(function () {
+ iterator.apply(null, args);
+ });
+ }
+ };
+ };
+ wrapIterator(async.iterator(tasks))();
+ };
+
+ async.parallel = function (tasks, callback) {
+ callback = callback || function () {};
+ if (tasks.constructor === Array) {
+ async.map(tasks, function (fn, callback) {
+ if (fn) {
+ fn(function (err) {
+ var args = Array.prototype.slice.call(arguments, 1);
+ if (args.length <= 1) {
+ args = args[0];
+ }
+ callback.call(null, err, args || null);
+ });
+ }
+ }, callback);
+ }
+ else {
+ var results = {};
+ async.forEach(_keys(tasks), function (k, callback) {
+ tasks[k](function (err) {
+ var args = Array.prototype.slice.call(arguments, 1);
+ if (args.length <= 1) {
+ args = args[0];
+ }
+ results[k] = args;
+ callback(err);
+ });
+ }, function (err) {
+ callback(err, results);
+ });
+ }
+ };
+
+ async.series = function (tasks, callback) {
+ callback = callback || function () {};
+ if (tasks.constructor === Array) {
+ async.mapSeries(tasks, function (fn, callback) {
+ if (fn) {
+ fn(function (err) {
+ var args = Array.prototype.slice.call(arguments, 1);
+ if (args.length <= 1) {
+ args = args[0];
+ }
+ callback.call(null, err, args || null);
+ });
+ }
+ }, callback);
+ }
+ else {
+ var results = {};
+ async.forEachSeries(_keys(tasks), function (k, callback) {
+ tasks[k](function (err) {
+ var args = Array.prototype.slice.call(arguments, 1);
+ if (args.length <= 1) {
+ args = args[0];
+ }
+ results[k] = args;
+ callback(err);
+ });
+ }, function (err) {
+ callback(err, results);
+ });
+ }
+ };
+
+ async.iterator = function (tasks) {
+ var makeCallback = function (index) {
+ var fn = function () {
+ if (tasks.length) {
+ tasks[index].apply(null, arguments);
+ }
+ return fn.next();
+ };
+ fn.next = function () {
+ return (index < tasks.length - 1) ? makeCallback(index + 1): null;
+ };
+ return fn;
+ };
+ return makeCallback(0);
+ };
+
+ async.apply = function (fn) {
+ var args = Array.prototype.slice.call(arguments, 1);
+ return function () {
+ return fn.apply(
+ null, args.concat(Array.prototype.slice.call(arguments))
+ );
+ };
+ };
+
+ var _concat = function (eachfn, arr, fn, callback) {
+ var r = [];
+ eachfn(arr, function (x, cb) {
+ fn(x, function (err, y) {
+ r = r.concat(y || []);
+ cb(err);
+ });
+ }, function (err) {
+ callback(err, r);
+ });
+ };
+ async.concat = doParallel(_concat);
+ async.concatSeries = doSeries(_concat);
+
+ async.whilst = function (test, iterator, callback) {
+ if (test()) {
+ iterator(function (err) {
+ if (err) {
+ return callback(err);
+ }
+ async.whilst(test, iterator, callback);
+ });
+ }
+ else {
+ callback();
+ }
+ };
+
+ async.until = function (test, iterator, callback) {
+ if (!test()) {
+ iterator(function (err) {
+ if (err) {
+ return callback(err);
+ }
+ async.until(test, iterator, callback);
+ });
+ }
+ else {
+ callback();
+ }
+ };
+
+ async.queue = function (worker, concurrency) {
+ var workers = 0;
+ var tasks = [];
+ var q = {
+ concurrency: concurrency,
+ push: function (data, callback) {
+ tasks.push({data: data, callback: callback});
+ async.nextTick(q.process);
+ },
+ process: function () {
+ if (workers < q.concurrency && tasks.length) {
+ var task = tasks.splice(0, 1)[0];
+ workers += 1;
+ worker(task.data, function () {
+ workers -= 1;
+ if (task.callback) {
+ task.callback.apply(task, arguments);
+ }
+ q.process();
+ });
+ }
+ },
+ length: function () {
+ return tasks.length;
+ }
+ };
+ return q;
+ };
+
+ var _console_fn = function (name) {
+ return function (fn) {
+ var args = Array.prototype.slice.call(arguments, 1);
+ fn.apply(null, args.concat([function (err) {
+ var args = Array.prototype.slice.call(arguments, 1);
+ if (typeof console !== 'undefined') {
+ if (err) {
+ if (console.error) {
+ console.error(err);
+ }
+ }
+ else if (console[name]) {
+ _forEach(args, function (x) {
+ console[name](x);
+ });
+ }
+ }
+ }]));
+ };
+ };
+ async.log = _console_fn('log');
+ async.dir = _console_fn('dir');
+ /*async.info = _console_fn('info');
+ async.warn = _console_fn('warn');
+ async.error = _console_fn('error');*/
+
+ async.memoize = function (fn, hasher) {
+ var memo = {};
+ hasher = hasher || function (x) {
+ return x;
+ };
+ return function () {
+ var args = Array.prototype.slice.call(arguments);
+ var callback = args.pop();
+ var key = hasher.apply(null, args);
+ if (key in memo) {
+ callback.apply(null, memo[key]);
+ }
+ else {
+ fn.apply(null, args.concat([function () {
+ memo[key] = arguments;
+ callback.apply(null, arguments);
+ }]));
+ }
+ };
+ };
+
+}());
+(function(exports){
+/**
+ * This file is based on the node.js assert module, but with some small
+ * changes for browser-compatibility
+ * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS!
+ */
+
+
+/**
+ * Added for browser compatibility
+ */
+
+var _keys = function(obj){
+ if(Object.keys) return Object.keys(obj);
+ if (typeof obj != 'object' && typeof obj != 'function') {
+ throw new TypeError('-');
+ }
+ var keys = [];
+ for(var k in obj){
+ if(obj.hasOwnProperty(k)) keys.push(k);
+ }
+ return keys;
+};
+
+
+
+// http://wiki.commonjs.org/wiki/Unit_Testing/1.0
+//
+// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!
+//
+// Originally from narwhal.js (http://narwhaljs.org)
+// Copyright (c) 2009 Thomas Robinson <280north.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the 'Software'), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+// sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS 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.
+
+
+var pSlice = Array.prototype.slice;
+
+// 1. The assert module provides functions that throw
+// AssertionError's when particular conditions are not met. The
+// assert module must conform to the following interface.
+
+var assert = exports;
+
+// 2. The AssertionError is defined in assert.
+// new assert.AssertionError({message: message, actual: actual, expected: expected})
+
+assert.AssertionError = function AssertionError (options) {
+ this.name = "AssertionError";
+ this.message = options.message;
+ this.actual = options.actual;
+ this.expected = options.expected;
+ this.operator = options.operator;
+ var stackStartFunction = options.stackStartFunction || fail;
+
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, stackStartFunction);
+ }
+};
+// code from util.inherits in node
+assert.AssertionError.super_ = Error;
+
+
+// EDITED FOR BROWSER COMPATIBILITY: replaced Object.create call
+// TODO: test what effect this may have
+var ctor = function () { this.constructor = assert.AssertionError; };
+ctor.prototype = Error.prototype;
+assert.AssertionError.prototype = new ctor();
+
+
+assert.AssertionError.prototype.toString = function() {
+ if (this.message) {
+ return [this.name+":", this.message].join(' ');
+ } else {
+ return [ this.name+":"
+ , typeof this.expected !== 'undefined' ? JSON.stringify(this.expected) : 'undefined'
+ , this.operator
+ , typeof this.actual !== 'undefined' ? JSON.stringify(this.actual) : 'undefined'
+ ].join(" ");
+ }
+};
+
+// assert.AssertionError instanceof Error
+
+assert.AssertionError.__proto__ = Error.prototype;
+
+// At present only the three keys mentioned above are used and
+// understood by the spec. Implementations or sub modules can pass
+// other keys to the AssertionError's constructor - they will be
+// ignored.
+
+// 3. All of the following functions must throw an AssertionError
+// when a corresponding condition is not met, with a message that
+// may be undefined if not provided. All assertion methods provide
+// both the actual and expected values to the assertion error for
+// display purposes.
+
+function fail(actual, expected, message, operator, stackStartFunction) {
+ throw new assert.AssertionError({
+ message: message,
+ actual: actual,
+ expected: expected,
+ operator: operator,
+ stackStartFunction: stackStartFunction
+ });
+}
+
+// EXTENSION! allows for well behaved errors defined elsewhere.
+assert.fail = fail;
+
+// 4. Pure assertion tests whether a value is truthy, as determined
+// by !!guard.
+// assert.ok(guard, message_opt);
+// This statement is equivalent to assert.equal(true, guard,
+// message_opt);. To test strictly for the value true, use
+// assert.strictEqual(true, guard, message_opt);.
+
+assert.ok = function ok(value, message) {
+ if (!!!value) fail(value, true, message, "==", assert.ok);
+};
+
+// 5. The equality assertion tests shallow, coercive equality with
+// ==.
+// assert.equal(actual, expected, message_opt);
+
+assert.equal = function equal(actual, expected, message) {
+ if (actual != expected) fail(actual, expected, message, "==", assert.equal);
+};
+
+// 6. The non-equality assertion tests for whether two objects are not equal
+// with != assert.notEqual(actual, expected, message_opt);
+
+assert.notEqual = function notEqual(actual, expected, message) {
+ if (actual == expected) {
+ fail(actual, expected, message, "!=", assert.notEqual);
+ }
+};
+
+// 7. The equivalence assertion tests a deep equality relation.
+// assert.deepEqual(actual, expected, message_opt);
+
+assert.deepEqual = function deepEqual(actual, expected, message) {
+ if (!_deepEqual(actual, expected)) {
+ fail(actual, expected, message, "deepEqual", assert.deepEqual);
+ }
+};
+
+var Buffer = null;
+if (typeof require !== 'undefined' && typeof process !== 'undefined') {
+ try {
+ Buffer = require('buffer').Buffer;
+ }
+ catch (e) {
+ // May be a CommonJS environment other than Node.js
+ Buffer = null;
+ }
+}
+
+function _deepEqual(actual, expected) {
+ // 7.1. All identical values are equivalent, as determined by ===.
+ if (actual === expected) {
+ return true;
+ // 7.2. If the expected value is a Date object, the actual value is
+ // equivalent if it is also a Date object that refers to the same time.
+ } else if (actual instanceof Date && expected instanceof Date) {
+ return actual.getTime() === expected.getTime();
+
+ // 7.2.1 If the expcted value is a RegExp object, the actual value is
+ // equivalent if it is also a RegExp object that refers to the same source and options
+ } else if (actual instanceof RegExp && expected instanceof RegExp) {
+ return actual.source === expected.source &&
+ actual.global === expected.global &&
+ actual.ignoreCase === expected.ignoreCase &&
+ actual.multiline === expected.multiline;
+
+ } else if (Buffer && actual instanceof Buffer && expected instanceof Buffer) {
+ return (function() {
+ var i, len;
+
+ for (i = 0, len = expected.length; i < len; i++) {
+ if (actual[i] !== expected[i]) {
+ return false;
+ }
+ }
+ return actual.length === expected.length;
+ })();
+ // 7.3. Other pairs that do not both pass typeof value == "object",
+ // equivalence is determined by ==.
+ } else if (typeof actual != 'object' && typeof expected != 'object') {
+ return actual == expected;
+
+ // 7.4. For all other Object pairs, including Array objects, equivalence is
+ // determined by having the same number of owned properties (as verified
+ // with Object.prototype.hasOwnProperty.call), the same set of keys
+ // (although not necessarily the same order), equivalent values for every
+ // corresponding key, and an identical "prototype" property. Note: this
+ // accounts for both named and indexed properties on Arrays.
+ } else {
+ return objEquiv(actual, expected);
+ }
+}
+
+function isUndefinedOrNull (value) {
+ return value === null || value === undefined;
+}
+
+function isArguments (object) {
+ return Object.prototype.toString.call(object) == '[object Arguments]';
+}
+
+function objEquiv (a, b) {
+ if (isUndefinedOrNull(a) || isUndefinedOrNull(b))
+ return false;
+ // an identical "prototype" property.
+ if (a.prototype !== b.prototype) return false;
+ //~~~I've managed to break Object.keys through screwy arguments passing.
+ // Converting to array solves the problem.
+ if (isArguments(a)) {
+ if (!isArguments(b)) {
+ return false;
+ }
+ a = pSlice.call(a);
+ b = pSlice.call(b);
+ return _deepEqual(a, b);
+ }
+ try{
+ var ka = _keys(a),
+ kb = _keys(b),
+ key, i;
+ } catch (e) {//happens when one is a string literal and the other isn't
+ return false;
+ }
+ // having the same number of owned properties (keys incorporates hasOwnProperty)
+ if (ka.length != kb.length)
+ return false;
+ //the same set of keys (although not necessarily the same order),
+ ka.sort();
+ kb.sort();
+ //~~~cheap key test
+ for (i = ka.length - 1; i >= 0; i--) {
+ if (ka[i] != kb[i])
+ return false;
+ }
+ //equivalent values for every corresponding key, and
+ //~~~possibly expensive deep test
+ for (i = ka.length - 1; i >= 0; i--) {
+ key = ka[i];
+ if (!_deepEqual(a[key], b[key] ))
+ return false;
+ }
+ return true;
+}
+
+// 8. The non-equivalence assertion tests for any deep inequality.
+// assert.notDeepEqual(actual, expected, message_opt);
+
+assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
+ if (_deepEqual(actual, expected)) {
+ fail(actual, expected, message, "notDeepEqual", assert.notDeepEqual);
+ }
+};
+
+// 9. The strict equality assertion tests strict equality, as determined by ===.
+// assert.strictEqual(actual, expected, message_opt);
+
+assert.strictEqual = function strictEqual(actual, expected, message) {
+ if (actual !== expected) {
+ fail(actual, expected, message, "===", assert.strictEqual);
+ }
+};
+
+// 10. The strict non-equality assertion tests for strict inequality, as determined by !==.
+// assert.notStrictEqual(actual, expected, message_opt);
+
+assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
+ if (actual === expected) {
+ fail(actual, expected, message, "!==", assert.notStrictEqual);
+ }
+};
+
+function expectedException(actual, expected) {
+ if (!actual || !expected) {
+ return false;
+ }
+
+ if (expected instanceof RegExp) {
+ return expected.test(actual.message || actual);
+ } else if (actual instanceof expected) {
+ return true;
+ } else if (expected.call({}, actual) === true) {
+ return true;
+ }
+
+ return false;
+}
+
+function _throws(shouldThrow, block, expected, message) {
+ var actual;
+
+ if (typeof expected === 'string') {
+ message = expected;
+ expected = null;
+ }
+
+ try {
+ block();
+ } catch (e) {
+ actual = e;
+ }
+
+ message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
+ (message ? ' ' + message : '.');
+
+ if (shouldThrow && !actual) {
+ fail('Missing expected exception' + message);
+ }
+
+ if (!shouldThrow && expectedException(actual, expected)) {
+ fail('Got unwanted exception' + message);
+ }
+
+ if ((shouldThrow && actual && expected &&
+ !expectedException(actual, expected)) || (!shouldThrow && actual)) {
+ throw actual;
+ }
+}
+
+// 11. Expected to throw an error:
+// assert.throws(block, Error_opt, message_opt);
+
+assert.throws = function(block, /*optional*/error, /*optional*/message) {
+ _throws.apply(this, [true].concat(pSlice.call(arguments)));
+};
+
+// EXTENSION! This is annoying to write outside this module.
+assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) {
+ _throws.apply(this, [false].concat(pSlice.call(arguments)));
+};
+
+assert.ifError = function (err) { if (err) {throw err;}};
+})(assert);
+(function(exports){
+/*!
+ * Nodeunit
+ * Copyright (c) 2010 Caolan McMahon
+ * MIT Licensed
+ *
+ * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS!
+ * Only code on that line will be removed, it's mostly to avoid requiring code
+ * that is node specific
+ */
+
+/**
+ * Module dependencies
+ */
+
+
+
+/**
+ * Creates assertion objects representing the result of an assert call.
+ * Accepts an object or AssertionError as its argument.
+ *
+ * @param {object} obj
+ * @api public
+ */
+
+exports.assertion = function (obj) {
+ return {
+ method: obj.method || '',
+ message: obj.message || (obj.error && obj.error.message) || '',
+ error: obj.error,
+ passed: function () {
+ return !this.error;
+ },
+ failed: function () {
+ return Boolean(this.error);
+ }
+ };
+};
+
+/**
+ * Creates an assertion list object representing a group of assertions.
+ * Accepts an array of assertion objects.
+ *
+ * @param {Array} arr
+ * @param {Number} duration
+ * @api public
+ */
+
+exports.assertionList = function (arr, duration) {
+ var that = arr || [];
+ that.failures = function () {
+ var failures = 0;
+ for (var i = 0; i < this.length; i += 1) {
+ if (this[i].failed()) {
+ failures += 1;
+ }
+ }
+ return failures;
+ };
+ that.passes = function () {
+ return that.length - that.failures();
+ };
+ that.duration = duration || 0;
+ return that;
+};
+
+/**
+ * Create a wrapper function for assert module methods. Executes a callback
+ * after it's complete with an assertion object representing the result.
+ *
+ * @param {Function} callback
+ * @api private
+ */
+
+var assertWrapper = function (callback) {
+ return function (new_method, assert_method, arity) {
+ return function () {
+ var message = arguments[arity - 1];
+ var a = exports.assertion({method: new_method, message: message});
+ try {
+ assert[assert_method].apply(null, arguments);
+ }
+ catch (e) {
+ a.error = e;
+ }
+ callback(a);
+ };
+ };
+};
+
+/**
+ * Creates the 'test' object that gets passed to every test function.
+ * Accepts the name of the test function as its first argument, followed by
+ * the start time in ms, the options object and a callback function.
+ *
+ * @param {String} name
+ * @param {Number} start
+ * @param {Object} options
+ * @param {Function} callback
+ * @api public
+ */
+
+exports.test = function (name, start, options, callback) {
+ var expecting;
+ var a_list = [];
+
+ var wrapAssert = assertWrapper(function (a) {
+ a_list.push(a);
+ if (options.log) {
+ async.nextTick(function () {
+ options.log(a);
+ });
+ }
+ });
+
+ var test = {
+ done: function (err) {
+ if (expecting !== undefined && expecting !== a_list.length) {
+ var e = new Error(
+ 'Expected ' + expecting + ' assertions, ' +
+ a_list.length + ' ran'
+ );
+ var a1 = exports.assertion({method: 'expect', error: e});
+ a_list.push(a1);
+ if (options.log) {
+ async.nextTick(function () {
+ options.log(a1);
+ });
+ }
+ }
+ if (err) {
+ var a2 = exports.assertion({error: err});
+ a_list.push(a2);
+ if (options.log) {
+ async.nextTick(function () {
+ options.log(a2);
+ });
+ }
+ }
+ var end = new Date().getTime();
+ async.nextTick(function () {
+ var assertion_list = exports.assertionList(a_list, end - start);
+ options.testDone(name, assertion_list);
+ callback(null, a_list);
+ });
+ },
+ ok: wrapAssert('ok', 'ok', 2),
+ same: wrapAssert('same', 'deepEqual', 3),
+ equals: wrapAssert('equals', 'equal', 3),
+ expect: function (num) {
+ expecting = num;
+ },
+ _assertion_list: a_list
+ };
+ // add all functions from the assert module
+ for (var k in assert) {
+ if (assert.hasOwnProperty(k)) {
+ test[k] = wrapAssert(k, k, assert[k].length);
+ }
+ }
+ return test;
+};
+
+/**
+ * Ensures an options object has all callbacks, adding empty callback functions
+ * if any are missing.
+ *
+ * @param {Object} opt
+ * @return {Object}
+ * @api public
+ */
+
+exports.options = function (opt) {
+ var optionalCallback = function (name) {
+ opt[name] = opt[name] || function () {};
+ };
+
+ optionalCallback('moduleStart');
+ optionalCallback('moduleDone');
+ optionalCallback('testStart');
+ optionalCallback('testReady');
+ optionalCallback('testDone');
+ //optionalCallback('log');
+
+ // 'done' callback is not optional.
+
+ return opt;
+};
+})(types);
+(function(exports){
+/*!
+ * Nodeunit
+ * Copyright (c) 2010 Caolan McMahon
+ * MIT Licensed
+ *
+ * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS!
+ * Only code on that line will be removed, it's mostly to avoid requiring code
+ * that is node specific
+ */
+
+/**
+ * Module dependencies
+ */
+
+
+
+/**
+ * Added for browser compatibility
+ */
+
+var _keys = function (obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ }
+ var keys = [];
+ for (var k in obj) {
+ if (obj.hasOwnProperty(k)) {
+ keys.push(k);
+ }
+ }
+ return keys;
+};
+
+
+var _copy = function (obj) {
+ var nobj = {};
+ var keys = _keys(obj);
+ for (var i = 0; i < keys.length; i += 1) {
+ nobj[keys[i]] = obj[keys[i]];
+ }
+ return nobj;
+};
+
+
+/**
+ * Runs a test function (fn) from a loaded module. After the test function
+ * calls test.done(), the callback is executed with an assertionList as its
+ * second argument.
+ *
+ * @param {String} name
+ * @param {Function} fn
+ * @param {Object} opt
+ * @param {Function} callback
+ * @api public
+ */
+
+exports.runTest = function (name, fn, opt, callback) {
+ var options = types.options(opt);
+
+ options.testStart(name);
+ var start = new Date().getTime();
+ var test = types.test(name, start, options, callback);
+
+ options.testReady(test);
+ try {
+ fn(test);
+ }
+ catch (e) {
+ test.done(e);
+ }
+};
+
+/**
+ * Takes an object containing test functions or other test suites as properties
+ * and runs each in series. After all tests have completed, the callback is
+ * called with a list of all assertions as the second argument.
+ *
+ * If a name is passed to this function it is prepended to all test and suite
+ * names that run within it.
+ *
+ * @param {String} name
+ * @param {Object} suite
+ * @param {Object} opt
+ * @param {Function} callback
+ * @api public
+ */
+
+exports.runSuite = function (name, suite, opt, callback) {
+ suite = wrapGroup(suite);
+ var keys = _keys(suite);
+
+ async.concatSeries(keys, function (k, cb) {
+ var prop = suite[k], _name;
+
+ _name = name ? [].concat(name, k) : [k];
+ _name.toString = function () {
+ // fallback for old one
+ return this.join(' - ');
+ };
+
+ if (typeof prop === 'function') {
+ var in_name = false,
+ in_specific_test = (_name.toString() === opt.testFullSpec) ? true : false;
+ for (var i = 0; i < _name.length; i += 1) {
+ if (_name[i] === opt.testspec) {
+ in_name = true;
+ }
+ }
+
+ if ((!opt.testFullSpec || in_specific_test) && (!opt.testspec || in_name)) {
+ if (opt.moduleStart) {
+ opt.moduleStart();
+ }
+ exports.runTest(_name, suite[k], opt, cb);
+ }
+ else {
+ return cb();
+ }
+ }
+ else {
+ exports.runSuite(_name, suite[k], opt, cb);
+ }
+ }, callback);
+};
+
+/**
+ * Run each exported test function or test suite from a loaded module.
+ *
+ * @param {String} name
+ * @param {Object} mod
+ * @param {Object} opt
+ * @param {Function} callback
+ * @api public
+ */
+
+exports.runModule = function (name, mod, opt, callback) {
+ var options = _copy(types.options(opt));
+
+ var _run = false;
+ var _moduleStart = options.moduleStart;
+
+ mod = wrapGroup(mod);
+
+ function run_once() {
+ if (!_run) {
+ _run = true;
+ _moduleStart(name);
+ }
+ }
+ options.moduleStart = run_once;
+
+ var start = new Date().getTime();
+
+ exports.runSuite(null, mod, options, function (err, a_list) {
+ var end = new Date().getTime();
+ var assertion_list = types.assertionList(a_list, end - start);
+ options.moduleDone(name, assertion_list);
+ if (nodeunit.complete) {
+ nodeunit.complete(name, assertion_list);
+ }
+ callback(null, a_list);
+ });
+};
+
+/**
+ * Treats an object literal as a list of modules keyed by name. Runs each
+ * module and finished with calling 'done'. You can think of this as a browser
+ * safe alternative to runFiles in the nodeunit module.
+ *
+ * @param {Object} modules
+ * @param {Object} opt
+ * @api public
+ */
+
+// TODO: add proper unit tests for this function
+exports.runModules = function (modules, opt) {
+ var all_assertions = [];
+ var options = types.options(opt);
+ var start = new Date().getTime();
+
+ async.concatSeries(_keys(modules), function (k, cb) {
+ exports.runModule(k, modules[k], options, cb);
+ },
+ function (err, all_assertions) {
+ var end = new Date().getTime();
+ options.done(types.assertionList(all_assertions, end - start));
+ });
+};
+
+
+/**
+ * Wraps a test function with setUp and tearDown functions.
+ * Used by testCase.
+ *
+ * @param {Function} setUp
+ * @param {Function} tearDown
+ * @param {Function} fn
+ * @api private
+ */
+
+var wrapTest = function (setUp, tearDown, fn) {
+ return function (test) {
+ var context = {};
+ if (tearDown) {
+ var done = test.done;
+ test.done = function (err) {
+ try {
+ tearDown.call(context, function (err2) {
+ if (err && err2) {
+ test._assertion_list.push(
+ types.assertion({error: err})
+ );
+ return done(err2);
+ }
+ done(err || err2);
+ });
+ }
+ catch (e) {
+ done(e);
+ }
+ };
+ }
+ if (setUp) {
+ setUp.call(context, function (err) {
+ if (err) {
+ return test.done(err);
+ }
+ fn.call(context, test);
+ });
+ }
+ else {
+ fn.call(context, test);
+ }
+ };
+};
+
+
+/**
+ * Returns a serial callback from two functions.
+ *
+ * @param {Function} funcFirst
+ * @param {Function} funcSecond
+ * @api private
+ */
+
+var getSerialCallback = function (fns) {
+ if (!fns.length) {
+ return null;
+ }
+ return function (callback) {
+ var that = this;
+ var bound_fns = [];
+ for (var i = 0, len = fns.length; i < len; i++) {
+ (function (j) {
+ bound_fns.push(function () {
+ return fns[j].apply(that, arguments);
+ });
+ })(i);
+ }
+ return async.series(bound_fns, callback);
+ };
+};
+
+
+/**
+ * Wraps a group of tests with setUp and tearDown functions.
+ * Used by testCase.
+ *
+ * @param {Object} group
+ * @param {Array} setUps - parent setUp functions
+ * @param {Array} tearDowns - parent tearDown functions
+ * @api private
+ */
+
+var wrapGroup = function (group, setUps, tearDowns) {
+ var tests = {};
+
+ var setUps = setUps ? setUps.slice(): [];
+ var tearDowns = tearDowns ? tearDowns.slice(): [];
+
+ if (group.setUp) {
+ setUps.push(group.setUp);
+ delete group.setUp;
+ }
+ if (group.tearDown) {
+ tearDowns.unshift(group.tearDown);
+ delete group.tearDown;
+ }
+
+ var keys = _keys(group);
+
+ for (var i = 0; i < keys.length; i += 1) {
+ var k = keys[i];
+ if (typeof group[k] === 'function') {
+ tests[k] = wrapTest(
+ getSerialCallback(setUps),
+ getSerialCallback(tearDowns),
+ group[k]
+ );
+ }
+ else if (typeof group[k] === 'object') {
+ tests[k] = wrapGroup(group[k], setUps, tearDowns);
+ }
+ }
+ return tests;
+};
+
+
+/**
+ * Backwards compatibility for test suites using old testCase API
+ */
+
+exports.testCase = function (suite) {
+ return suite;
+};
+})(core);
+(function(exports){
+/*!
+ * Nodeunit
+ * Copyright (c) 2010 Caolan McMahon
+ * MIT Licensed
+ *
+ * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS!
+ * Only code on that line will be removed, its mostly to avoid requiring code
+ * that is node specific
+ */
+
+
+/**
+ * NOTE: this test runner is not listed in index.js because it cannot be
+ * used with the command-line tool, only inside the browser.
+ */
+
+
+/**
+ * Reporter info string
+ */
+
+exports.info = "Browser-based test reporter";
+
+
+/**
+ * Run all tests within each module, reporting the results
+ *
+ * @param {Array} files
+ * @api public
+ */
+
+exports.run = function (modules, options, callback) {
+ var start = new Date().getTime(), div;
+ options = options || {};
+ div = options.div || document.body;
+
+ function setText(el, txt) {
+ if ('innerText' in el) {
+ el.innerText = txt;
+ }
+ else if ('textContent' in el){
+ el.textContent = txt;
+ }
+ }
+
+ function getOrCreate(tag, id) {
+ var el = document.getElementById(id);
+ if (!el) {
+ el = document.createElement(tag);
+ el.id = id;
+ div.appendChild(el);
+ }
+ return el;
+ };
+
+ var header = getOrCreate('h1', 'nodeunit-header');
+ var banner = getOrCreate('h2', 'nodeunit-banner');
+ var userAgent = getOrCreate('h2', 'nodeunit-userAgent');
+ var tests = getOrCreate('ol', 'nodeunit-tests');
+ var result = getOrCreate('p', 'nodeunit-testresult');
+
+ setText(userAgent, navigator.userAgent);
+
+ nodeunit.runModules(modules, {
+ moduleStart: function (name) {
+ /*var mheading = document.createElement('h2');
+ mheading.innerText = name;
+ results.appendChild(mheading);
+ module = document.createElement('ol');
+ results.appendChild(module);*/
+ },
+ testDone: function (name, assertions) {
+ var test = document.createElement('li');
+ var strong = document.createElement('strong');
+ strong.innerHTML = name + ' <b style="color: black;">(' +
+ '<b class="fail">' + assertions.failures() + '</b>, ' +
+ '<b class="pass">' + assertions.passes() + '</b>, ' +
+ assertions.length +
+ ')</b>';
+ test.className = assertions.failures() ? 'fail': 'pass';
+ test.appendChild(strong);
+
+ var aList = document.createElement('ol');
+ aList.style.display = 'none';
+ test.onclick = function () {
+ var d = aList.style.display;
+ aList.style.display = (d == 'none') ? 'block': 'none';
+ };
+ for (var i=0; i<assertions.length; i++) {
+ var li = document.createElement('li');
+ var a = assertions[i];
+ if (a.failed()) {
+ li.innerHTML = (a.message || a.method || 'no message') +
+ '<pre>' + (a.error.stack || a.error) + '</pre>';
+ li.className = 'fail';
+ }
+ else {
+ li.innerHTML = a.message || a.method || 'no message';
+ li.className = 'pass';
+ }
+ aList.appendChild(li);
+ }
+ test.appendChild(aList);
+ tests.appendChild(test);
+ },
+ done: function (assertions) {
+ var end = new Date().getTime();
+ var duration = end - start;
+
+ var failures = assertions.failures();
+ banner.className = failures ? 'fail': 'pass';
+
+ result.innerHTML = 'Tests completed in ' + duration +
+ ' milliseconds.<br/><span class="passed">' +
+ assertions.passes() + '</span> assertions of ' +
+ '<span class="all">' + assertions.length + '<span> passed, ' +
+ assertions.failures() + ' failed.';
+
+ if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined);
+ }
+ });
+};
+})(reporter);
+nodeunit = core;
+nodeunit.assert = assert;
+nodeunit.reporter = reporter;
+nodeunit.run = reporter.run;
+return nodeunit; })();
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/dist/async.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/dist/async.js
new file mode 100644
index 00000000000..31e7620fb6f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/dist/async.js
@@ -0,0 +1,1265 @@
+/*!
+ * async
+ * https://github.com/caolan/async
+ *
+ * Copyright 2010-2014 Caolan McMahon
+ * Released under the MIT license
+ */
+(function () {
+
+ var async = {};
+ function noop() {}
+ function identity(v) {
+ return v;
+ }
+ function toBool(v) {
+ return !!v;
+ }
+ function notId(v) {
+ return !v;
+ }
+
+ // global on the server, window in the browser
+ var previous_async;
+
+ // Establish the root object, `window` (`self`) in the browser, `global`
+ // on the server, or `this` in some virtual machines. We use `self`
+ // instead of `window` for `WebWorker` support.
+ var root = typeof self === 'object' && self.self === self && self ||
+ typeof global === 'object' && global.global === global && global ||
+ this;
+
+ if (root != null) {
+ previous_async = root.async;
+ }
+
+ async.noConflict = function () {
+ root.async = previous_async;
+ return async;
+ };
+
+ function only_once(fn) {
+ return function() {
+ if (fn === null) throw new Error("Callback was already called.");
+ fn.apply(this, arguments);
+ fn = null;
+ };
+ }
+
+ function _once(fn) {
+ return function() {
+ if (fn === null) return;
+ fn.apply(this, arguments);
+ fn = null;
+ };
+ }
+
+ //// cross-browser compatiblity functions ////
+
+ var _toString = Object.prototype.toString;
+
+ var _isArray = Array.isArray || function (obj) {
+ return _toString.call(obj) === '[object Array]';
+ };
+
+ // Ported from underscore.js isObject
+ var _isObject = function(obj) {
+ var type = typeof obj;
+ return type === 'function' || type === 'object' && !!obj;
+ };
+
+ function _isArrayLike(arr) {
+ return _isArray(arr) || (
+ // has a positive integer length property
+ typeof arr.length === "number" &&
+ arr.length >= 0 &&
+ arr.length % 1 === 0
+ );
+ }
+
+ function _arrayEach(arr, iterator) {
+ var index = -1,
+ length = arr.length;
+
+ while (++index < length) {
+ iterator(arr[index], index, arr);
+ }
+ }
+
+ function _map(arr, iterator) {
+ var index = -1,
+ length = arr.length,
+ result = Array(length);
+
+ while (++index < length) {
+ result[index] = iterator(arr[index], index, arr);
+ }
+ return result;
+ }
+
+ function _range(count) {
+ return _map(Array(count), function (v, i) { return i; });
+ }
+
+ function _reduce(arr, iterator, memo) {
+ _arrayEach(arr, function (x, i, a) {
+ memo = iterator(memo, x, i, a);
+ });
+ return memo;
+ }
+
+ function _forEachOf(object, iterator) {
+ _arrayEach(_keys(object), function (key) {
+ iterator(object[key], key);
+ });
+ }
+
+ function _indexOf(arr, item) {
+ for (var i = 0; i < arr.length; i++) {
+ if (arr[i] === item) return i;
+ }
+ return -1;
+ }
+
+ var _keys = Object.keys || function (obj) {
+ var keys = [];
+ for (var k in obj) {
+ if (obj.hasOwnProperty(k)) {
+ keys.push(k);
+ }
+ }
+ return keys;
+ };
+
+ function _keyIterator(coll) {
+ var i = -1;
+ var len;
+ var keys;
+ if (_isArrayLike(coll)) {
+ len = coll.length;
+ return function next() {
+ i++;
+ return i < len ? i : null;
+ };
+ } else {
+ keys = _keys(coll);
+ len = keys.length;
+ return function next() {
+ i++;
+ return i < len ? keys[i] : null;
+ };
+ }
+ }
+
+ // Similar to ES6's rest param (http://ariya.ofilabs.com/2013/03/es6-and-rest-parameter.html)
+ // This accumulates the arguments passed into an array, after a given index.
+ // From underscore.js (https://github.com/jashkenas/underscore/pull/2140).
+ function _restParam(func, startIndex) {
+ startIndex = startIndex == null ? func.length - 1 : +startIndex;
+ return function() {
+ var length = Math.max(arguments.length - startIndex, 0);
+ var rest = Array(length);
+ for (var index = 0; index < length; index++) {
+ rest[index] = arguments[index + startIndex];
+ }
+ switch (startIndex) {
+ case 0: return func.call(this, rest);
+ case 1: return func.call(this, arguments[0], rest);
+ }
+ // Currently unused but handle cases outside of the switch statement:
+ // var args = Array(startIndex + 1);
+ // for (index = 0; index < startIndex; index++) {
+ // args[index] = arguments[index];
+ // }
+ // args[startIndex] = rest;
+ // return func.apply(this, args);
+ };
+ }
+
+ function _withoutIndex(iterator) {
+ return function (value, index, callback) {
+ return iterator(value, callback);
+ };
+ }
+
+ //// exported async module functions ////
+
+ //// nextTick implementation with browser-compatible fallback ////
+
+ // capture the global reference to guard against fakeTimer mocks
+ var _setImmediate = typeof setImmediate === 'function' && setImmediate;
+
+ var _delay = _setImmediate ? function(fn) {
+ // not a direct alias for IE10 compatibility
+ _setImmediate(fn);
+ } : function(fn) {
+ setTimeout(fn, 0);
+ };
+
+ if (typeof process === 'object' && typeof process.nextTick === 'function') {
+ async.nextTick = process.nextTick;
+ } else {
+ async.nextTick = _delay;
+ }
+ async.setImmediate = _setImmediate ? _delay : async.nextTick;
+
+
+ async.forEach =
+ async.each = function (arr, iterator, callback) {
+ return async.eachOf(arr, _withoutIndex(iterator), callback);
+ };
+
+ async.forEachSeries =
+ async.eachSeries = function (arr, iterator, callback) {
+ return async.eachOfSeries(arr, _withoutIndex(iterator), callback);
+ };
+
+
+ async.forEachLimit =
+ async.eachLimit = function (arr, limit, iterator, callback) {
+ return _eachOfLimit(limit)(arr, _withoutIndex(iterator), callback);
+ };
+
+ async.forEachOf =
+ async.eachOf = function (object, iterator, callback) {
+ callback = _once(callback || noop);
+ object = object || [];
+
+ var iter = _keyIterator(object);
+ var key, completed = 0;
+
+ while ((key = iter()) != null) {
+ completed += 1;
+ iterator(object[key], key, only_once(done));
+ }
+
+ if (completed === 0) callback(null);
+
+ function done(err) {
+ completed--;
+ if (err) {
+ callback(err);
+ }
+ // Check key is null in case iterator isn't exhausted
+ // and done resolved synchronously.
+ else if (key === null && completed <= 0) {
+ callback(null);
+ }
+ }
+ };
+
+ async.forEachOfSeries =
+ async.eachOfSeries = function (obj, iterator, callback) {
+ callback = _once(callback || noop);
+ obj = obj || [];
+ var nextKey = _keyIterator(obj);
+ var key = nextKey();
+ function iterate() {
+ var sync = true;
+ if (key === null) {
+ return callback(null);
+ }
+ iterator(obj[key], key, only_once(function (err) {
+ if (err) {
+ callback(err);
+ }
+ else {
+ key = nextKey();
+ if (key === null) {
+ return callback(null);
+ } else {
+ if (sync) {
+ async.setImmediate(iterate);
+ } else {
+ iterate();
+ }
+ }
+ }
+ }));
+ sync = false;
+ }
+ iterate();
+ };
+
+
+
+ async.forEachOfLimit =
+ async.eachOfLimit = function (obj, limit, iterator, callback) {
+ _eachOfLimit(limit)(obj, iterator, callback);
+ };
+
+ function _eachOfLimit(limit) {
+
+ return function (obj, iterator, callback) {
+ callback = _once(callback || noop);
+ obj = obj || [];
+ var nextKey = _keyIterator(obj);
+ if (limit <= 0) {
+ return callback(null);
+ }
+ var done = false;
+ var running = 0;
+ var errored = false;
+
+ (function replenish () {
+ if (done && running <= 0) {
+ return callback(null);
+ }
+
+ while (running < limit && !errored) {
+ var key = nextKey();
+ if (key === null) {
+ done = true;
+ if (running <= 0) {
+ callback(null);
+ }
+ return;
+ }
+ running += 1;
+ iterator(obj[key], key, only_once(function (err) {
+ running -= 1;
+ if (err) {
+ callback(err);
+ errored = true;
+ }
+ else {
+ replenish();
+ }
+ }));
+ }
+ })();
+ };
+ }
+
+
+ function doParallel(fn) {
+ return function (obj, iterator, callback) {
+ return fn(async.eachOf, obj, iterator, callback);
+ };
+ }
+ function doParallelLimit(fn) {
+ return function (obj, limit, iterator, callback) {
+ return fn(_eachOfLimit(limit), obj, iterator, callback);
+ };
+ }
+ function doSeries(fn) {
+ return function (obj, iterator, callback) {
+ return fn(async.eachOfSeries, obj, iterator, callback);
+ };
+ }
+
+ function _asyncMap(eachfn, arr, iterator, callback) {
+ callback = _once(callback || noop);
+ arr = arr || [];
+ var results = _isArrayLike(arr) ? [] : {};
+ eachfn(arr, function (value, index, callback) {
+ iterator(value, function (err, v) {
+ results[index] = v;
+ callback(err);
+ });
+ }, function (err) {
+ callback(err, results);
+ });
+ }
+
+ async.map = doParallel(_asyncMap);
+ async.mapSeries = doSeries(_asyncMap);
+ async.mapLimit = doParallelLimit(_asyncMap);
+
+ // reduce only has a series version, as doing reduce in parallel won't
+ // work in many situations.
+ async.inject =
+ async.foldl =
+ async.reduce = function (arr, memo, iterator, callback) {
+ async.eachOfSeries(arr, function (x, i, callback) {
+ iterator(memo, x, function (err, v) {
+ memo = v;
+ callback(err);
+ });
+ }, function (err) {
+ callback(err, memo);
+ });
+ };
+
+ async.foldr =
+ async.reduceRight = function (arr, memo, iterator, callback) {
+ var reversed = _map(arr, identity).reverse();
+ async.reduce(reversed, memo, iterator, callback);
+ };
+
+ async.transform = function (arr, memo, iterator, callback) {
+ if (arguments.length === 3) {
+ callback = iterator;
+ iterator = memo;
+ memo = _isArray(arr) ? [] : {};
+ }
+
+ async.eachOf(arr, function(v, k, cb) {
+ iterator(memo, v, k, cb);
+ }, function(err) {
+ callback(err, memo);
+ });
+ };
+
+ function _filter(eachfn, arr, iterator, callback) {
+ var results = [];
+ eachfn(arr, function (x, index, callback) {
+ iterator(x, function (v) {
+ if (v) {
+ results.push({index: index, value: x});
+ }
+ callback();
+ });
+ }, function () {
+ callback(_map(results.sort(function (a, b) {
+ return a.index - b.index;
+ }), function (x) {
+ return x.value;
+ }));
+ });
+ }
+
+ async.select =
+ async.filter = doParallel(_filter);
+
+ async.selectLimit =
+ async.filterLimit = doParallelLimit(_filter);
+
+ async.selectSeries =
+ async.filterSeries = doSeries(_filter);
+
+ function _reject(eachfn, arr, iterator, callback) {
+ _filter(eachfn, arr, function(value, cb) {
+ iterator(value, function(v) {
+ cb(!v);
+ });
+ }, callback);
+ }
+ async.reject = doParallel(_reject);
+ async.rejectLimit = doParallelLimit(_reject);
+ async.rejectSeries = doSeries(_reject);
+
+ function _createTester(eachfn, check, getResult) {
+ return function(arr, limit, iterator, cb) {
+ function done() {
+ if (cb) cb(getResult(false, void 0));
+ }
+ function iteratee(x, _, callback) {
+ if (!cb) return callback();
+ iterator(x, function (v) {
+ if (cb && check(v)) {
+ cb(getResult(true, x));
+ cb = iterator = false;
+ }
+ callback();
+ });
+ }
+ if (arguments.length > 3) {
+ eachfn(arr, limit, iteratee, done);
+ } else {
+ cb = iterator;
+ iterator = limit;
+ eachfn(arr, iteratee, done);
+ }
+ };
+ }
+
+ async.any =
+ async.some = _createTester(async.eachOf, toBool, identity);
+
+ async.someLimit = _createTester(async.eachOfLimit, toBool, identity);
+
+ async.all =
+ async.every = _createTester(async.eachOf, notId, notId);
+
+ async.everyLimit = _createTester(async.eachOfLimit, notId, notId);
+
+ function _findGetResult(v, x) {
+ return x;
+ }
+ async.detect = _createTester(async.eachOf, identity, _findGetResult);
+ async.detectSeries = _createTester(async.eachOfSeries, identity, _findGetResult);
+ async.detectLimit = _createTester(async.eachOfLimit, identity, _findGetResult);
+
+ async.sortBy = function (arr, iterator, callback) {
+ async.map(arr, function (x, callback) {
+ iterator(x, function (err, criteria) {
+ if (err) {
+ callback(err);
+ }
+ else {
+ callback(null, {value: x, criteria: criteria});
+ }
+ });
+ }, function (err, results) {
+ if (err) {
+ return callback(err);
+ }
+ else {
+ callback(null, _map(results.sort(comparator), function (x) {
+ return x.value;
+ }));
+ }
+
+ });
+
+ function comparator(left, right) {
+ var a = left.criteria, b = right.criteria;
+ return a < b ? -1 : a > b ? 1 : 0;
+ }
+ };
+
+ async.auto = function (tasks, concurrency, callback) {
+ if (typeof arguments[1] === 'function') {
+ // concurrency is optional, shift the args.
+ callback = concurrency;
+ concurrency = null;
+ }
+ callback = _once(callback || noop);
+ var keys = _keys(tasks);
+ var remainingTasks = keys.length;
+ if (!remainingTasks) {
+ return callback(null);
+ }
+ if (!concurrency) {
+ concurrency = remainingTasks;
+ }
+
+ var results = {};
+ var runningTasks = 0;
+
+ var hasError = false;
+
+ var listeners = [];
+ function addListener(fn) {
+ listeners.unshift(fn);
+ }
+ function removeListener(fn) {
+ var idx = _indexOf(listeners, fn);
+ if (idx >= 0) listeners.splice(idx, 1);
+ }
+ function taskComplete() {
+ remainingTasks--;
+ _arrayEach(listeners.slice(0), function (fn) {
+ fn();
+ });
+ }
+
+ addListener(function () {
+ if (!remainingTasks) {
+ callback(null, results);
+ }
+ });
+
+ _arrayEach(keys, function (k) {
+ if (hasError) return;
+ var task = _isArray(tasks[k]) ? tasks[k]: [tasks[k]];
+ var taskCallback = _restParam(function(err, args) {
+ runningTasks--;
+ if (args.length <= 1) {
+ args = args[0];
+ }
+ if (err) {
+ var safeResults = {};
+ _forEachOf(results, function(val, rkey) {
+ safeResults[rkey] = val;
+ });
+ safeResults[k] = args;
+ hasError = true;
+
+ callback(err, safeResults);
+ }
+ else {
+ results[k] = args;
+ async.setImmediate(taskComplete);
+ }
+ });
+ var requires = task.slice(0, task.length - 1);
+ // prevent dead-locks
+ var len = requires.length;
+ var dep;
+ while (len--) {
+ if (!(dep = tasks[requires[len]])) {
+ throw new Error('Has nonexistent dependency in ' + requires.join(', '));
+ }
+ if (_isArray(dep) && _indexOf(dep, k) >= 0) {
+ throw new Error('Has cyclic dependencies');
+ }
+ }
+ function ready() {
+ return runningTasks < concurrency && _reduce(requires, function (a, x) {
+ return (a && results.hasOwnProperty(x));
+ }, true) && !results.hasOwnProperty(k);
+ }
+ if (ready()) {
+ runningTasks++;
+ task[task.length - 1](taskCallback, results);
+ }
+ else {
+ addListener(listener);
+ }
+ function listener() {
+ if (ready()) {
+ runningTasks++;
+ removeListener(listener);
+ task[task.length - 1](taskCallback, results);
+ }
+ }
+ });
+ };
+
+
+
+ async.retry = function(times, task, callback) {
+ var DEFAULT_TIMES = 5;
+ var DEFAULT_INTERVAL = 0;
+
+ var attempts = [];
+
+ var opts = {
+ times: DEFAULT_TIMES,
+ interval: DEFAULT_INTERVAL
+ };
+
+ function parseTimes(acc, t){
+ if(typeof t === 'number'){
+ acc.times = parseInt(t, 10) || DEFAULT_TIMES;
+ } else if(typeof t === 'object'){
+ acc.times = parseInt(t.times, 10) || DEFAULT_TIMES;
+ acc.interval = parseInt(t.interval, 10) || DEFAULT_INTERVAL;
+ } else {
+ throw new Error('Unsupported argument type for \'times\': ' + typeof t);
+ }
+ }
+
+ var length = arguments.length;
+ if (length < 1 || length > 3) {
+ throw new Error('Invalid arguments - must be either (task), (task, callback), (times, task) or (times, task, callback)');
+ } else if (length <= 2 && typeof times === 'function') {
+ callback = task;
+ task = times;
+ }
+ if (typeof times !== 'function') {
+ parseTimes(opts, times);
+ }
+ opts.callback = callback;
+ opts.task = task;
+
+ function wrappedTask(wrappedCallback, wrappedResults) {
+ function retryAttempt(task, finalAttempt) {
+ return function(seriesCallback) {
+ task(function(err, result){
+ seriesCallback(!err || finalAttempt, {err: err, result: result});
+ }, wrappedResults);
+ };
+ }
+
+ function retryInterval(interval){
+ return function(seriesCallback){
+ setTimeout(function(){
+ seriesCallback(null);
+ }, interval);
+ };
+ }
+
+ while (opts.times) {
+
+ var finalAttempt = !(opts.times-=1);
+ attempts.push(retryAttempt(opts.task, finalAttempt));
+ if(!finalAttempt && opts.interval > 0){
+ attempts.push(retryInterval(opts.interval));
+ }
+ }
+
+ async.series(attempts, function(done, data){
+ data = data[data.length - 1];
+ (wrappedCallback || opts.callback)(data.err, data.result);
+ });
+ }
+
+ // If a callback is passed, run this as a controll flow
+ return opts.callback ? wrappedTask() : wrappedTask;
+ };
+
+ async.waterfall = function (tasks, callback) {
+ callback = _once(callback || noop);
+ if (!_isArray(tasks)) {
+ var err = new Error('First argument to waterfall must be an array of functions');
+ return callback(err);
+ }
+ if (!tasks.length) {
+ return callback();
+ }
+ function wrapIterator(iterator) {
+ return _restParam(function (err, args) {
+ if (err) {
+ callback.apply(null, [err].concat(args));
+ }
+ else {
+ var next = iterator.next();
+ if (next) {
+ args.push(wrapIterator(next));
+ }
+ else {
+ args.push(callback);
+ }
+ ensureAsync(iterator).apply(null, args);
+ }
+ });
+ }
+ wrapIterator(async.iterator(tasks))();
+ };
+
+ function _parallel(eachfn, tasks, callback) {
+ callback = callback || noop;
+ var results = _isArrayLike(tasks) ? [] : {};
+
+ eachfn(tasks, function (task, key, callback) {
+ task(_restParam(function (err, args) {
+ if (args.length <= 1) {
+ args = args[0];
+ }
+ results[key] = args;
+ callback(err);
+ }));
+ }, function (err) {
+ callback(err, results);
+ });
+ }
+
+ async.parallel = function (tasks, callback) {
+ _parallel(async.eachOf, tasks, callback);
+ };
+
+ async.parallelLimit = function(tasks, limit, callback) {
+ _parallel(_eachOfLimit(limit), tasks, callback);
+ };
+
+ async.series = function(tasks, callback) {
+ _parallel(async.eachOfSeries, tasks, callback);
+ };
+
+ async.iterator = function (tasks) {
+ function makeCallback(index) {
+ function fn() {
+ if (tasks.length) {
+ tasks[index].apply(null, arguments);
+ }
+ return fn.next();
+ }
+ fn.next = function () {
+ return (index < tasks.length - 1) ? makeCallback(index + 1): null;
+ };
+ return fn;
+ }
+ return makeCallback(0);
+ };
+
+ async.apply = _restParam(function (fn, args) {
+ return _restParam(function (callArgs) {
+ return fn.apply(
+ null, args.concat(callArgs)
+ );
+ });
+ });
+
+ function _concat(eachfn, arr, fn, callback) {
+ var result = [];
+ eachfn(arr, function (x, index, cb) {
+ fn(x, function (err, y) {
+ result = result.concat(y || []);
+ cb(err);
+ });
+ }, function (err) {
+ callback(err, result);
+ });
+ }
+ async.concat = doParallel(_concat);
+ async.concatSeries = doSeries(_concat);
+
+ async.whilst = function (test, iterator, callback) {
+ callback = callback || noop;
+ if (test()) {
+ var next = _restParam(function(err, args) {
+ if (err) {
+ callback(err);
+ } else if (test.apply(this, args)) {
+ iterator(next);
+ } else {
+ callback.apply(null, [null].concat(args));
+ }
+ });
+ iterator(next);
+ } else {
+ callback(null);
+ }
+ };
+
+ async.doWhilst = function (iterator, test, callback) {
+ var calls = 0;
+ return async.whilst(function() {
+ return ++calls <= 1 || test.apply(this, arguments);
+ }, iterator, callback);
+ };
+
+ async.until = function (test, iterator, callback) {
+ return async.whilst(function() {
+ return !test.apply(this, arguments);
+ }, iterator, callback);
+ };
+
+ async.doUntil = function (iterator, test, callback) {
+ return async.doWhilst(iterator, function() {
+ return !test.apply(this, arguments);
+ }, callback);
+ };
+
+ async.during = function (test, iterator, callback) {
+ callback = callback || noop;
+
+ var next = _restParam(function(err, args) {
+ if (err) {
+ callback(err);
+ } else {
+ args.push(check);
+ test.apply(this, args);
+ }
+ });
+
+ var check = function(err, truth) {
+ if (err) {
+ callback(err);
+ } else if (truth) {
+ iterator(next);
+ } else {
+ callback(null);
+ }
+ };
+
+ test(check);
+ };
+
+ async.doDuring = function (iterator, test, callback) {
+ var calls = 0;
+ async.during(function(next) {
+ if (calls++ < 1) {
+ next(null, true);
+ } else {
+ test.apply(this, arguments);
+ }
+ }, iterator, callback);
+ };
+
+ function _queue(worker, concurrency, payload) {
+ if (concurrency == null) {
+ concurrency = 1;
+ }
+ else if(concurrency === 0) {
+ throw new Error('Concurrency must not be zero');
+ }
+ function _insert(q, data, pos, callback) {
+ if (callback != null && typeof callback !== "function") {
+ throw new Error("task callback must be a function");
+ }
+ q.started = true;
+ if (!_isArray(data)) {
+ data = [data];
+ }
+ if(data.length === 0 && q.idle()) {
+ // call drain immediately if there are no tasks
+ return async.setImmediate(function() {
+ q.drain();
+ });
+ }
+ _arrayEach(data, function(task) {
+ var item = {
+ data: task,
+ callback: callback || noop
+ };
+
+ if (pos) {
+ q.tasks.unshift(item);
+ } else {
+ q.tasks.push(item);
+ }
+
+ if (q.tasks.length === q.concurrency) {
+ q.saturated();
+ }
+ });
+ async.setImmediate(q.process);
+ }
+ function _next(q, tasks) {
+ return function(){
+ workers -= 1;
+
+ var removed = false;
+ var args = arguments;
+ _arrayEach(tasks, function (task) {
+ _arrayEach(workersList, function (worker, index) {
+ if (worker === task && !removed) {
+ workersList.splice(index, 1);
+ removed = true;
+ }
+ });
+
+ task.callback.apply(task, args);
+ });
+ if (q.tasks.length + workers === 0) {
+ q.drain();
+ }
+ q.process();
+ };
+ }
+
+ var workers = 0;
+ var workersList = [];
+ var q = {
+ tasks: [],
+ concurrency: concurrency,
+ payload: payload,
+ saturated: noop,
+ empty: noop,
+ drain: noop,
+ started: false,
+ paused: false,
+ push: function (data, callback) {
+ _insert(q, data, false, callback);
+ },
+ kill: function () {
+ q.drain = noop;
+ q.tasks = [];
+ },
+ unshift: function (data, callback) {
+ _insert(q, data, true, callback);
+ },
+ process: function () {
+ while(!q.paused && workers < q.concurrency && q.tasks.length){
+
+ var tasks = q.payload ?
+ q.tasks.splice(0, q.payload) :
+ q.tasks.splice(0, q.tasks.length);
+
+ var data = _map(tasks, function (task) {
+ return task.data;
+ });
+
+ if (q.tasks.length === 0) {
+ q.empty();
+ }
+ workers += 1;
+ workersList.push(tasks[0]);
+ var cb = only_once(_next(q, tasks));
+ worker(data, cb);
+ }
+ },
+ length: function () {
+ return q.tasks.length;
+ },
+ running: function () {
+ return workers;
+ },
+ workersList: function () {
+ return workersList;
+ },
+ idle: function() {
+ return q.tasks.length + workers === 0;
+ },
+ pause: function () {
+ q.paused = true;
+ },
+ resume: function () {
+ if (q.paused === false) { return; }
+ q.paused = false;
+ var resumeCount = Math.min(q.concurrency, q.tasks.length);
+ // Need to call q.process once per concurrent
+ // worker to preserve full concurrency after pause
+ for (var w = 1; w <= resumeCount; w++) {
+ async.setImmediate(q.process);
+ }
+ }
+ };
+ return q;
+ }
+
+ async.queue = function (worker, concurrency) {
+ var q = _queue(function (items, cb) {
+ worker(items[0], cb);
+ }, concurrency, 1);
+
+ return q;
+ };
+
+ async.priorityQueue = function (worker, concurrency) {
+
+ function _compareTasks(a, b){
+ return a.priority - b.priority;
+ }
+
+ function _binarySearch(sequence, item, compare) {
+ var beg = -1,
+ end = sequence.length - 1;
+ while (beg < end) {
+ var mid = beg + ((end - beg + 1) >>> 1);
+ if (compare(item, sequence[mid]) >= 0) {
+ beg = mid;
+ } else {
+ end = mid - 1;
+ }
+ }
+ return beg;
+ }
+
+ function _insert(q, data, priority, callback) {
+ if (callback != null && typeof callback !== "function") {
+ throw new Error("task callback must be a function");
+ }
+ q.started = true;
+ if (!_isArray(data)) {
+ data = [data];
+ }
+ if(data.length === 0) {
+ // call drain immediately if there are no tasks
+ return async.setImmediate(function() {
+ q.drain();
+ });
+ }
+ _arrayEach(data, function(task) {
+ var item = {
+ data: task,
+ priority: priority,
+ callback: typeof callback === 'function' ? callback : noop
+ };
+
+ q.tasks.splice(_binarySearch(q.tasks, item, _compareTasks) + 1, 0, item);
+
+ if (q.tasks.length === q.concurrency) {
+ q.saturated();
+ }
+ async.setImmediate(q.process);
+ });
+ }
+
+ // Start with a normal queue
+ var q = async.queue(worker, concurrency);
+
+ // Override push to accept second parameter representing priority
+ q.push = function (data, priority, callback) {
+ _insert(q, data, priority, callback);
+ };
+
+ // Remove unshift function
+ delete q.unshift;
+
+ return q;
+ };
+
+ async.cargo = function (worker, payload) {
+ return _queue(worker, 1, payload);
+ };
+
+ function _console_fn(name) {
+ return _restParam(function (fn, args) {
+ fn.apply(null, args.concat([_restParam(function (err, args) {
+ if (typeof console === 'object') {
+ if (err) {
+ if (console.error) {
+ console.error(err);
+ }
+ }
+ else if (console[name]) {
+ _arrayEach(args, function (x) {
+ console[name](x);
+ });
+ }
+ }
+ })]));
+ });
+ }
+ async.log = _console_fn('log');
+ async.dir = _console_fn('dir');
+ /*async.info = _console_fn('info');
+ async.warn = _console_fn('warn');
+ async.error = _console_fn('error');*/
+
+ async.memoize = function (fn, hasher) {
+ var memo = {};
+ var queues = {};
+ var has = Object.prototype.hasOwnProperty;
+ hasher = hasher || identity;
+ var memoized = _restParam(function memoized(args) {
+ var callback = args.pop();
+ var key = hasher.apply(null, args);
+ if (has.call(memo, key)) {
+ async.setImmediate(function () {
+ callback.apply(null, memo[key]);
+ });
+ }
+ else if (has.call(queues, key)) {
+ queues[key].push(callback);
+ }
+ else {
+ queues[key] = [callback];
+ fn.apply(null, args.concat([_restParam(function (args) {
+ memo[key] = args;
+ var q = queues[key];
+ delete queues[key];
+ for (var i = 0, l = q.length; i < l; i++) {
+ q[i].apply(null, args);
+ }
+ })]));
+ }
+ });
+ memoized.memo = memo;
+ memoized.unmemoized = fn;
+ return memoized;
+ };
+
+ async.unmemoize = function (fn) {
+ return function () {
+ return (fn.unmemoized || fn).apply(null, arguments);
+ };
+ };
+
+ function _times(mapper) {
+ return function (count, iterator, callback) {
+ mapper(_range(count), iterator, callback);
+ };
+ }
+
+ async.times = _times(async.map);
+ async.timesSeries = _times(async.mapSeries);
+ async.timesLimit = function (count, limit, iterator, callback) {
+ return async.mapLimit(_range(count), limit, iterator, callback);
+ };
+
+ async.seq = function (/* functions... */) {
+ var fns = arguments;
+ return _restParam(function (args) {
+ var that = this;
+
+ var callback = args[args.length - 1];
+ if (typeof callback == 'function') {
+ args.pop();
+ } else {
+ callback = noop;
+ }
+
+ async.reduce(fns, args, function (newargs, fn, cb) {
+ fn.apply(that, newargs.concat([_restParam(function (err, nextargs) {
+ cb(err, nextargs);
+ })]));
+ },
+ function (err, results) {
+ callback.apply(that, [err].concat(results));
+ });
+ });
+ };
+
+ async.compose = function (/* functions... */) {
+ return async.seq.apply(null, Array.prototype.reverse.call(arguments));
+ };
+
+
+ function _applyEach(eachfn) {
+ return _restParam(function(fns, args) {
+ var go = _restParam(function(args) {
+ var that = this;
+ var callback = args.pop();
+ return eachfn(fns, function (fn, _, cb) {
+ fn.apply(that, args.concat([cb]));
+ },
+ callback);
+ });
+ if (args.length) {
+ return go.apply(this, args);
+ }
+ else {
+ return go;
+ }
+ });
+ }
+
+ async.applyEach = _applyEach(async.eachOf);
+ async.applyEachSeries = _applyEach(async.eachOfSeries);
+
+
+ async.forever = function (fn, callback) {
+ var done = only_once(callback || noop);
+ var task = ensureAsync(fn);
+ function next(err) {
+ if (err) {
+ return done(err);
+ }
+ task(next);
+ }
+ next();
+ };
+
+ function ensureAsync(fn) {
+ return _restParam(function (args) {
+ var callback = args.pop();
+ args.push(function () {
+ var innerArgs = arguments;
+ if (sync) {
+ async.setImmediate(function () {
+ callback.apply(null, innerArgs);
+ });
+ } else {
+ callback.apply(null, innerArgs);
+ }
+ });
+ var sync = true;
+ fn.apply(this, args);
+ sync = false;
+ });
+ }
+
+ async.ensureAsync = ensureAsync;
+
+ async.constant = _restParam(function(values) {
+ var args = [null].concat(values);
+ return function (callback) {
+ return callback.apply(this, args);
+ };
+ });
+
+ async.wrapSync =
+ async.asyncify = function asyncify(func) {
+ return _restParam(function (args) {
+ var callback = args.pop();
+ var result;
+ try {
+ result = func.apply(this, args);
+ } catch (e) {
+ return callback(e);
+ }
+ // if result is Promise object
+ if (_isObject(result) && typeof result.then === "function") {
+ result.then(function(value) {
+ callback(null, value);
+ })["catch"](function(err) {
+ callback(err.message ? err : new Error(err));
+ });
+ } else {
+ callback(null, result);
+ }
+ });
+ };
+
+ // Node.js
+ if (typeof module === 'object' && module.exports) {
+ module.exports = async;
+ }
+ // AMD / RequireJS
+ else if (typeof define === 'function' && define.amd) {
+ define([], function () {
+ return async;
+ });
+ }
+ // included directly via <script> tag
+ else {
+ root.async = async;
+ }
+
+}());
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/dist/async.min.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/dist/async.min.js
new file mode 100644
index 00000000000..2490016a06f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/dist/async.min.js
@@ -0,0 +1,2 @@
+!function(){function n(){}function t(n){return n}function e(n){return!!n}function r(n){return!n}function u(n){return function(){if(null===n)throw new Error("Callback was already called.");n.apply(this,arguments),n=null}}function i(n){return function(){null!==n&&(n.apply(this,arguments),n=null)}}function o(n){return M(n)||"number"==typeof n.length&&n.length>=0&&n.length%1===0}function c(n,t){for(var e=-1,r=n.length;++e<r;)t(n[e],e,n)}function a(n,t){for(var e=-1,r=n.length,u=Array(r);++e<r;)u[e]=t(n[e],e,n);return u}function f(n){return a(Array(n),function(n,t){return t})}function l(n,t,e){return c(n,function(n,r,u){e=t(e,n,r,u)}),e}function s(n,t){c(W(n),function(e){t(n[e],e)})}function p(n,t){for(var e=0;e<n.length;e++)if(n[e]===t)return e;return-1}function h(n){var t,e,r=-1;return o(n)?(t=n.length,function(){return r++,t>r?r:null}):(e=W(n),t=e.length,function(){return r++,t>r?e[r]:null})}function m(n,t){return t=null==t?n.length-1:+t,function(){for(var e=Math.max(arguments.length-t,0),r=Array(e),u=0;e>u;u++)r[u]=arguments[u+t];switch(t){case 0:return n.call(this,r);case 1:return n.call(this,arguments[0],r)}}}function y(n){return function(t,e,r){return n(t,r)}}function v(t){return function(e,r,o){o=i(o||n),e=e||[];var c=h(e);if(0>=t)return o(null);var a=!1,f=0,l=!1;!function s(){if(a&&0>=f)return o(null);for(;t>f&&!l;){var n=c();if(null===n)return a=!0,void(0>=f&&o(null));f+=1,r(e[n],n,u(function(n){f-=1,n?(o(n),l=!0):s()}))}}()}}function d(n){return function(t,e,r){return n(P.eachOf,t,e,r)}}function g(n){return function(t,e,r,u){return n(v(e),t,r,u)}}function k(n){return function(t,e,r){return n(P.eachOfSeries,t,e,r)}}function b(t,e,r,u){u=i(u||n),e=e||[];var c=o(e)?[]:{};t(e,function(n,t,e){r(n,function(n,r){c[t]=r,e(n)})},function(n){u(n,c)})}function w(n,t,e,r){var u=[];n(t,function(n,t,r){e(n,function(e){e&&u.push({index:t,value:n}),r()})},function(){r(a(u.sort(function(n,t){return n.index-t.index}),function(n){return n.value}))})}function O(n,t,e,r){w(n,t,function(n,t){e(n,function(n){t(!n)})},r)}function S(n,t,e){return function(r,u,i,o){function c(){o&&o(e(!1,void 0))}function a(n,r,u){return o?void i(n,function(r){o&&t(r)&&(o(e(!0,n)),o=i=!1),u()}):u()}arguments.length>3?n(r,u,a,c):(o=i,i=u,n(r,a,c))}}function E(n,t){return t}function L(t,e,r){r=r||n;var u=o(e)?[]:{};t(e,function(n,t,e){n(m(function(n,r){r.length<=1&&(r=r[0]),u[t]=r,e(n)}))},function(n){r(n,u)})}function j(n,t,e,r){var u=[];n(t,function(n,t,r){e(n,function(n,t){u=u.concat(t||[]),r(n)})},function(n){r(n,u)})}function I(t,e,r){function i(t,e,r,u){if(null!=u&&"function"!=typeof u)throw new Error("task callback must be a function");return t.started=!0,M(e)||(e=[e]),0===e.length&&t.idle()?P.setImmediate(function(){t.drain()}):(c(e,function(e){var i={data:e,callback:u||n};r?t.tasks.unshift(i):t.tasks.push(i),t.tasks.length===t.concurrency&&t.saturated()}),void P.setImmediate(t.process))}function o(n,t){return function(){f-=1;var e=!1,r=arguments;c(t,function(n){c(l,function(t,r){t!==n||e||(l.splice(r,1),e=!0)}),n.callback.apply(n,r)}),n.tasks.length+f===0&&n.drain(),n.process()}}if(null==e)e=1;else if(0===e)throw new Error("Concurrency must not be zero");var f=0,l=[],s={tasks:[],concurrency:e,payload:r,saturated:n,empty:n,drain:n,started:!1,paused:!1,push:function(n,t){i(s,n,!1,t)},kill:function(){s.drain=n,s.tasks=[]},unshift:function(n,t){i(s,n,!0,t)},process:function(){for(;!s.paused&&f<s.concurrency&&s.tasks.length;){var n=s.payload?s.tasks.splice(0,s.payload):s.tasks.splice(0,s.tasks.length),e=a(n,function(n){return n.data});0===s.tasks.length&&s.empty(),f+=1,l.push(n[0]);var r=u(o(s,n));t(e,r)}},length:function(){return s.tasks.length},running:function(){return f},workersList:function(){return l},idle:function(){return s.tasks.length+f===0},pause:function(){s.paused=!0},resume:function(){if(s.paused!==!1){s.paused=!1;for(var n=Math.min(s.concurrency,s.tasks.length),t=1;n>=t;t++)P.setImmediate(s.process)}}};return s}function x(n){return m(function(t,e){t.apply(null,e.concat([m(function(t,e){"object"==typeof console&&(t?console.error&&console.error(t):console[n]&&c(e,function(t){console[n](t)}))})]))})}function A(n){return function(t,e,r){n(f(t),e,r)}}function T(n){return m(function(t,e){var r=m(function(e){var r=this,u=e.pop();return n(t,function(n,t,u){n.apply(r,e.concat([u]))},u)});return e.length?r.apply(this,e):r})}function z(n){return m(function(t){var e=t.pop();t.push(function(){var n=arguments;r?P.setImmediate(function(){e.apply(null,n)}):e.apply(null,n)});var r=!0;n.apply(this,t),r=!1})}var q,P={},C="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||this;null!=C&&(q=C.async),P.noConflict=function(){return C.async=q,P};var H=Object.prototype.toString,M=Array.isArray||function(n){return"[object Array]"===H.call(n)},U=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},W=Object.keys||function(n){var t=[];for(var e in n)n.hasOwnProperty(e)&&t.push(e);return t},B="function"==typeof setImmediate&&setImmediate,D=B?function(n){B(n)}:function(n){setTimeout(n,0)};"object"==typeof process&&"function"==typeof process.nextTick?P.nextTick=process.nextTick:P.nextTick=D,P.setImmediate=B?D:P.nextTick,P.forEach=P.each=function(n,t,e){return P.eachOf(n,y(t),e)},P.forEachSeries=P.eachSeries=function(n,t,e){return P.eachOfSeries(n,y(t),e)},P.forEachLimit=P.eachLimit=function(n,t,e,r){return v(t)(n,y(e),r)},P.forEachOf=P.eachOf=function(t,e,r){function o(n){f--,n?r(n):null===c&&0>=f&&r(null)}r=i(r||n),t=t||[];for(var c,a=h(t),f=0;null!=(c=a());)f+=1,e(t[c],c,u(o));0===f&&r(null)},P.forEachOfSeries=P.eachOfSeries=function(t,e,r){function o(){var n=!0;return null===a?r(null):(e(t[a],a,u(function(t){if(t)r(t);else{if(a=c(),null===a)return r(null);n?P.setImmediate(o):o()}})),void(n=!1))}r=i(r||n),t=t||[];var c=h(t),a=c();o()},P.forEachOfLimit=P.eachOfLimit=function(n,t,e,r){v(t)(n,e,r)},P.map=d(b),P.mapSeries=k(b),P.mapLimit=g(b),P.inject=P.foldl=P.reduce=function(n,t,e,r){P.eachOfSeries(n,function(n,r,u){e(t,n,function(n,e){t=e,u(n)})},function(n){r(n,t)})},P.foldr=P.reduceRight=function(n,e,r,u){var i=a(n,t).reverse();P.reduce(i,e,r,u)},P.transform=function(n,t,e,r){3===arguments.length&&(r=e,e=t,t=M(n)?[]:{}),P.eachOf(n,function(n,r,u){e(t,n,r,u)},function(n){r(n,t)})},P.select=P.filter=d(w),P.selectLimit=P.filterLimit=g(w),P.selectSeries=P.filterSeries=k(w),P.reject=d(O),P.rejectLimit=g(O),P.rejectSeries=k(O),P.any=P.some=S(P.eachOf,e,t),P.someLimit=S(P.eachOfLimit,e,t),P.all=P.every=S(P.eachOf,r,r),P.everyLimit=S(P.eachOfLimit,r,r),P.detect=S(P.eachOf,t,E),P.detectSeries=S(P.eachOfSeries,t,E),P.detectLimit=S(P.eachOfLimit,t,E),P.sortBy=function(n,t,e){function r(n,t){var e=n.criteria,r=t.criteria;return r>e?-1:e>r?1:0}P.map(n,function(n,e){t(n,function(t,r){t?e(t):e(null,{value:n,criteria:r})})},function(n,t){return n?e(n):void e(null,a(t.sort(r),function(n){return n.value}))})},P.auto=function(t,e,r){function u(n){g.unshift(n)}function o(n){var t=p(g,n);t>=0&&g.splice(t,1)}function a(){h--,c(g.slice(0),function(n){n()})}"function"==typeof arguments[1]&&(r=e,e=null),r=i(r||n);var f=W(t),h=f.length;if(!h)return r(null);e||(e=h);var y={},v=0,d=!1,g=[];u(function(){h||r(null,y)}),c(f,function(n){function i(){return e>v&&l(k,function(n,t){return n&&y.hasOwnProperty(t)},!0)&&!y.hasOwnProperty(n)}function c(){i()&&(v++,o(c),h[h.length-1](g,y))}if(!d){for(var f,h=M(t[n])?t[n]:[t[n]],g=m(function(t,e){if(v--,e.length<=1&&(e=e[0]),t){var u={};s(y,function(n,t){u[t]=n}),u[n]=e,d=!0,r(t,u)}else y[n]=e,P.setImmediate(a)}),k=h.slice(0,h.length-1),b=k.length;b--;){if(!(f=t[k[b]]))throw new Error("Has nonexistent dependency in "+k.join(", "));if(M(f)&&p(f,n)>=0)throw new Error("Has cyclic dependencies")}i()?(v++,h[h.length-1](g,y)):u(c)}})},P.retry=function(n,t,e){function r(n,t){if("number"==typeof t)n.times=parseInt(t,10)||i;else{if("object"!=typeof t)throw new Error("Unsupported argument type for 'times': "+typeof t);n.times=parseInt(t.times,10)||i,n.interval=parseInt(t.interval,10)||o}}function u(n,t){function e(n,e){return function(r){n(function(n,t){r(!n||e,{err:n,result:t})},t)}}function r(n){return function(t){setTimeout(function(){t(null)},n)}}for(;a.times;){var u=!(a.times-=1);c.push(e(a.task,u)),!u&&a.interval>0&&c.push(r(a.interval))}P.series(c,function(t,e){e=e[e.length-1],(n||a.callback)(e.err,e.result)})}var i=5,o=0,c=[],a={times:i,interval:o},f=arguments.length;if(1>f||f>3)throw new Error("Invalid arguments - must be either (task), (task, callback), (times, task) or (times, task, callback)");return 2>=f&&"function"==typeof n&&(e=t,t=n),"function"!=typeof n&&r(a,n),a.callback=e,a.task=t,a.callback?u():u},P.waterfall=function(t,e){function r(n){return m(function(t,u){if(t)e.apply(null,[t].concat(u));else{var i=n.next();i?u.push(r(i)):u.push(e),z(n).apply(null,u)}})}if(e=i(e||n),!M(t)){var u=new Error("First argument to waterfall must be an array of functions");return e(u)}return t.length?void r(P.iterator(t))():e()},P.parallel=function(n,t){L(P.eachOf,n,t)},P.parallelLimit=function(n,t,e){L(v(t),n,e)},P.series=function(n,t){L(P.eachOfSeries,n,t)},P.iterator=function(n){function t(e){function r(){return n.length&&n[e].apply(null,arguments),r.next()}return r.next=function(){return e<n.length-1?t(e+1):null},r}return t(0)},P.apply=m(function(n,t){return m(function(e){return n.apply(null,t.concat(e))})}),P.concat=d(j),P.concatSeries=k(j),P.whilst=function(t,e,r){if(r=r||n,t()){var u=m(function(n,i){n?r(n):t.apply(this,i)?e(u):r.apply(null,[null].concat(i))});e(u)}else r(null)},P.doWhilst=function(n,t,e){var r=0;return P.whilst(function(){return++r<=1||t.apply(this,arguments)},n,e)},P.until=function(n,t,e){return P.whilst(function(){return!n.apply(this,arguments)},t,e)},P.doUntil=function(n,t,e){return P.doWhilst(n,function(){return!t.apply(this,arguments)},e)},P.during=function(t,e,r){r=r||n;var u=m(function(n,e){n?r(n):(e.push(i),t.apply(this,e))}),i=function(n,t){n?r(n):t?e(u):r(null)};t(i)},P.doDuring=function(n,t,e){var r=0;P.during(function(n){r++<1?n(null,!0):t.apply(this,arguments)},n,e)},P.queue=function(n,t){var e=I(function(t,e){n(t[0],e)},t,1);return e},P.priorityQueue=function(t,e){function r(n,t){return n.priority-t.priority}function u(n,t,e){for(var r=-1,u=n.length-1;u>r;){var i=r+(u-r+1>>>1);e(t,n[i])>=0?r=i:u=i-1}return r}function i(t,e,i,o){if(null!=o&&"function"!=typeof o)throw new Error("task callback must be a function");return t.started=!0,M(e)||(e=[e]),0===e.length?P.setImmediate(function(){t.drain()}):void c(e,function(e){var c={data:e,priority:i,callback:"function"==typeof o?o:n};t.tasks.splice(u(t.tasks,c,r)+1,0,c),t.tasks.length===t.concurrency&&t.saturated(),P.setImmediate(t.process)})}var o=P.queue(t,e);return o.push=function(n,t,e){i(o,n,t,e)},delete o.unshift,o},P.cargo=function(n,t){return I(n,1,t)},P.log=x("log"),P.dir=x("dir"),P.memoize=function(n,e){var r={},u={},i=Object.prototype.hasOwnProperty;e=e||t;var o=m(function(t){var o=t.pop(),c=e.apply(null,t);i.call(r,c)?P.setImmediate(function(){o.apply(null,r[c])}):i.call(u,c)?u[c].push(o):(u[c]=[o],n.apply(null,t.concat([m(function(n){r[c]=n;var t=u[c];delete u[c];for(var e=0,i=t.length;i>e;e++)t[e].apply(null,n)})])))});return o.memo=r,o.unmemoized=n,o},P.unmemoize=function(n){return function(){return(n.unmemoized||n).apply(null,arguments)}},P.times=A(P.map),P.timesSeries=A(P.mapSeries),P.timesLimit=function(n,t,e,r){return P.mapLimit(f(n),t,e,r)},P.seq=function(){var t=arguments;return m(function(e){var r=this,u=e[e.length-1];"function"==typeof u?e.pop():u=n,P.reduce(t,e,function(n,t,e){t.apply(r,n.concat([m(function(n,t){e(n,t)})]))},function(n,t){u.apply(r,[n].concat(t))})})},P.compose=function(){return P.seq.apply(null,Array.prototype.reverse.call(arguments))},P.applyEach=T(P.eachOf),P.applyEachSeries=T(P.eachOfSeries),P.forever=function(t,e){function r(n){return n?i(n):void o(r)}var i=u(e||n),o=z(t);r()},P.ensureAsync=z,P.constant=m(function(n){var t=[null].concat(n);return function(n){return n.apply(this,t)}}),P.wrapSync=P.asyncify=function(n){return m(function(t){var e,r=t.pop();try{e=n.apply(this,t)}catch(u){return r(u)}U(e)&&"function"==typeof e.then?e.then(function(n){r(null,n)})["catch"](function(n){r(n.message?n:new Error(n))}):r(null,e)})},"object"==typeof module&&module.exports?module.exports=P:"function"==typeof define&&define.amd?define([],function(){return P}):C.async=P}();
+//# sourceMappingURL=dist/async.min.map \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/dist/async.min.map b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/dist/async.min.map
new file mode 100644
index 00000000000..1e23922cd55
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/dist/async.min.map
@@ -0,0 +1 @@
+{"version":3,"file":"dist/async.min.js","sources":["dist/async.js"],"names":["noop","identity","v","toBool","notId","only_once","fn","Error","apply","this","arguments","_once","_isArrayLike","arr","_isArray","length","_arrayEach","iterator","index","_map","result","Array","_range","count","i","_reduce","memo","x","a","_forEachOf","object","_keys","key","_indexOf","item","_keyIterator","coll","len","keys","_restParam","func","startIndex","Math","max","rest","call","_withoutIndex","value","callback","_eachOfLimit","limit","obj","nextKey","done","running","errored","replenish","err","doParallel","async","eachOf","doParallelLimit","doSeries","eachOfSeries","_asyncMap","eachfn","results","_filter","push","sort","b","_reject","cb","_createTester","check","getResult","iteratee","_","_findGetResult","_parallel","tasks","task","args","_concat","y","concat","_queue","worker","concurrency","payload","_insert","q","data","pos","started","idle","setImmediate","drain","unshift","saturated","process","_next","workers","removed","workersList","splice","empty","paused","kill","pause","resume","resumeCount","min","w","_console_fn","name","console","error","_times","mapper","_applyEach","fns","go","that","pop","ensureAsync","innerArgs","sync","previous_async","root","self","global","noConflict","_toString","Object","prototype","toString","isArray","_isObject","type","k","hasOwnProperty","_setImmediate","_delay","setTimeout","nextTick","forEach","each","forEachSeries","eachSeries","forEachLimit","eachLimit","forEachOf","completed","iter","forEachOfSeries","iterate","forEachOfLimit","eachOfLimit","map","mapSeries","mapLimit","inject","foldl","reduce","foldr","reduceRight","reversed","reverse","transform","select","filter","selectLimit","filterLimit","selectSeries","filterSeries","reject","rejectLimit","rejectSeries","any","some","someLimit","all","every","everyLimit","detect","detectSeries","detectLimit","sortBy","comparator","left","right","criteria","auto","addListener","listeners","removeListener","idx","taskComplete","remainingTasks","slice","runningTasks","hasError","ready","requires","listener","taskCallback","dep","safeResults","val","rkey","join","retry","times","parseTimes","acc","t","parseInt","DEFAULT_TIMES","interval","DEFAULT_INTERVAL","wrappedTask","wrappedCallback","wrappedResults","retryAttempt","finalAttempt","seriesCallback","retryInterval","opts","attempts","series","waterfall","wrapIterator","next","parallel","parallelLimit","makeCallback","callArgs","concatSeries","whilst","test","doWhilst","calls","until","doUntil","during","truth","doDuring","queue","items","priorityQueue","_compareTasks","priority","_binarySearch","sequence","compare","beg","end","mid","cargo","log","dir","memoize","hasher","queues","has","memoized","l","unmemoized","unmemoize","timesSeries","timesLimit","seq","newargs","nextargs","compose","applyEach","applyEachSeries","forever","constant","values","wrapSync","asyncify","e","then","message","module","exports","define","amd"],"mappings":"CAOC,WAGG,QAASA,MACT,QAASC,GAASC,GACd,MAAOA,GAEX,QAASC,GAAOD,GACZ,QAASA,EAEb,QAASE,GAAMF,GACX,OAAQA,EAsBZ,QAASG,GAAUC,GACf,MAAO,YACH,GAAW,OAAPA,EAAa,KAAM,IAAIC,OAAM,+BACjCD,GAAGE,MAAMC,KAAMC,WACfJ,EAAK,MAIb,QAASK,GAAML,GACX,MAAO,YACQ,OAAPA,IACJA,EAAGE,MAAMC,KAAMC,WACfJ,EAAK,OAkBb,QAASM,GAAaC,GAClB,MAAOC,GAASD,IAEU,gBAAfA,GAAIE,QACXF,EAAIE,QAAU,GACdF,EAAIE,OAAS,IAAM,EAI3B,QAASC,GAAWH,EAAKI,GAIrB,IAHA,GAAIC,GAAQ,GACRH,EAASF,EAAIE,SAERG,EAAQH,GACbE,EAASJ,EAAIK,GAAQA,EAAOL,GAIpC,QAASM,GAAKN,EAAKI,GAKf,IAJA,GAAIC,GAAQ,GACRH,EAASF,EAAIE,OACbK,EAASC,MAAMN,KAEVG,EAAQH,GACbK,EAAOF,GAASD,EAASJ,EAAIK,GAAQA,EAAOL,EAEhD,OAAOO,GAGX,QAASE,GAAOC,GACZ,MAAOJ,GAAKE,MAAME,GAAQ,SAAUrB,EAAGsB,GAAK,MAAOA,KAGvD,QAASC,GAAQZ,EAAKI,EAAUS,GAI5B,MAHAV,GAAWH,EAAK,SAAUc,EAAGH,EAAGI,GAC5BF,EAAOT,EAASS,EAAMC,EAAGH,EAAGI,KAEzBF,EAGX,QAASG,GAAWC,EAAQb,GACxBD,EAAWe,EAAMD,GAAS,SAAUE,GAChCf,EAASa,EAAOE,GAAMA,KAI9B,QAASC,GAASpB,EAAKqB,GACnB,IAAK,GAAIV,GAAI,EAAGA,EAAIX,EAAIE,OAAQS,IAC5B,GAAIX,EAAIW,KAAOU,EAAM,MAAOV,EAEhC,OAAO,GAaX,QAASW,GAAaC,GAClB,GACIC,GACAC,EAFAd,EAAI,EAGR,OAAIZ,GAAawB,IACbC,EAAMD,EAAKrB,OACJ,WAEH,MADAS,KACWa,EAAJb,EAAUA,EAAI,QAGzBc,EAAOP,EAAMK,GACbC,EAAMC,EAAKvB,OACJ,WAEH,MADAS,KACWa,EAAJb,EAAUc,EAAKd,GAAK,OAQvC,QAASe,GAAWC,EAAMC,GAEtB,MADAA,GAA2B,MAAdA,EAAqBD,EAAKzB,OAAS,GAAK0B,EAC9C,WAGH,IAAK,GAFD1B,GAAS2B,KAAKC,IAAIjC,UAAUK,OAAS0B,EAAY,GACjDG,EAAOvB,MAAMN,GACRG,EAAQ,EAAWH,EAARG,EAAgBA,IAChC0B,EAAK1B,GAASR,UAAUQ,EAAQuB,EAEpC,QAAQA,GACJ,IAAK,GAAG,MAAOD,GAAKK,KAAKpC,KAAMmC,EAC/B,KAAK,GAAG,MAAOJ,GAAKK,KAAKpC,KAAMC,UAAU,GAAIkC,KAYzD,QAASE,GAAc7B,GACnB,MAAO,UAAU8B,EAAO7B,EAAO8B,GAC3B,MAAO/B,GAAS8B,EAAOC,IA8G/B,QAASC,GAAaC,GAElB,MAAO,UAAUC,EAAKlC,EAAU+B,GAC5BA,EAAWrC,EAAMqC,GAAYhD,GAC7BmD,EAAMA,KACN,IAAIC,GAAUjB,EAAagB,EAC3B,IAAa,GAATD,EACA,MAAOF,GAAS,KAEpB,IAAIK,IAAO,EACPC,EAAU,EACVC,GAAU,GAEd,QAAUC,KACN,GAAIH,GAAmB,GAAXC,EACR,MAAON,GAAS,KAGpB,MAAiBE,EAAVI,IAAoBC,GAAS,CAChC,GAAIvB,GAAMoB,GACV,IAAY,OAARpB,EAKA,MAJAqB,IAAO,OACQ,GAAXC,GACAN,EAAS,MAIjBM,IAAW,EACXrC,EAASkC,EAAInB,GAAMA,EAAK3B,EAAU,SAAUoD,GACxCH,GAAW,EACPG,GACAT,EAASS,GACTF,GAAU,GAGVC,YASxB,QAASE,GAAWpD,GAChB,MAAO,UAAU6C,EAAKlC,EAAU+B,GAC5B,MAAO1C,GAAGqD,EAAMC,OAAQT,EAAKlC,EAAU+B,IAG/C,QAASa,GAAgBvD,GACrB,MAAO,UAAU6C,EAAKD,EAAOjC,EAAU+B,GACnC,MAAO1C,GAAG2C,EAAaC,GAAQC,EAAKlC,EAAU+B,IAGtD,QAASc,GAASxD,GACd,MAAO,UAAU6C,EAAKlC,EAAU+B,GAC5B,MAAO1C,GAAGqD,EAAMI,aAAcZ,EAAKlC,EAAU+B,IAIrD,QAASgB,GAAUC,EAAQpD,EAAKI,EAAU+B,GACtCA,EAAWrC,EAAMqC,GAAYhD,GAC7Ba,EAAMA,KACN,IAAIqD,GAAUtD,EAAaC,QAC3BoD,GAAOpD,EAAK,SAAUkC,EAAO7B,EAAO8B,GAChC/B,EAAS8B,EAAO,SAAUU,EAAKvD,GAC3BgE,EAAQhD,GAAShB,EACjB8C,EAASS,MAEd,SAAUA,GACTT,EAASS,EAAKS,KA2CtB,QAASC,GAAQF,EAAQpD,EAAKI,EAAU+B,GACpC,GAAIkB,KACJD,GAAOpD,EAAK,SAAUc,EAAGT,EAAO8B,GAC5B/B,EAASU,EAAG,SAAUzB,GACdA,GACAgE,EAAQE,MAAMlD,MAAOA,EAAO6B,MAAOpB,IAEvCqB,OAEL,WACCA,EAAS7B,EAAK+C,EAAQG,KAAK,SAAUzC,EAAG0C,GACpC,MAAO1C,GAAEV,MAAQoD,EAAEpD,QACnB,SAAUS,GACV,MAAOA,GAAEoB,WAcrB,QAASwB,GAAQN,EAAQpD,EAAKI,EAAU+B,GACpCmB,EAAQF,EAAQpD,EAAK,SAASkC,EAAOyB,GACjCvD,EAAS8B,EAAO,SAAS7C,GACrBsE,GAAItE,MAET8C,GAMP,QAASyB,GAAcR,EAAQS,EAAOC,GAClC,MAAO,UAAS9D,EAAKqC,EAAOjC,EAAUuD,GAClC,QAASnB,KACDmB,GAAIA,EAAGG,GAAU,EAAO,SAEhC,QAASC,GAASjD,EAAGkD,EAAG7B,GACpB,MAAKwB,OACLvD,GAASU,EAAG,SAAUzB,GACdsE,GAAME,EAAMxE,KACZsE,EAAGG,GAAU,EAAMhD,IACnB6C,EAAKvD,GAAW,GAEpB+B,MANYA,IAShBtC,UAAUK,OAAS,EACnBkD,EAAOpD,EAAKqC,EAAO0B,EAAUvB,IAE7BmB,EAAKvD,EACLA,EAAWiC,EACXe,EAAOpD,EAAK+D,EAAUvB,KAelC,QAASyB,GAAe5E,EAAGyB,GACvB,MAAOA,GA2OX,QAASoD,GAAUd,EAAQe,EAAOhC,GAC9BA,EAAWA,GAAYhD,CACvB,IAAIkE,GAAUtD,EAAaoE,QAE3Bf,GAAOe,EAAO,SAAUC,EAAMjD,EAAKgB,GAC/BiC,EAAK1C,EAAW,SAAUkB,EAAKyB,GACvBA,EAAKnE,QAAU,IACfmE,EAAOA,EAAK,IAEhBhB,EAAQlC,GAAOkD,EACflC,EAASS,OAEd,SAAUA,GACTT,EAASS,EAAKS,KAwCtB,QAASiB,GAAQlB,EAAQpD,EAAKP,EAAI0C,GAC9B,GAAI5B,KACJ6C,GAAOpD,EAAK,SAAUc,EAAGT,EAAOsD,GAC5BlE,EAAGqB,EAAG,SAAU8B,EAAK2B,GACjBhE,EAASA,EAAOiE,OAAOD,OACvBZ,EAAGf,MAER,SAAUA,GACTT,EAASS,EAAKrC,KA+EtB,QAASkE,GAAOC,EAAQC,EAAaC,GAOjC,QAASC,GAAQC,EAAGC,EAAMC,EAAK7C,GAC3B,GAAgB,MAAZA,GAAwC,kBAAbA,GAC3B,KAAM,IAAIzC,OAAM,mCAMpB,OAJAoF,GAAEG,SAAU,EACPhF,EAAS8E,KACVA,GAAQA,IAEO,IAAhBA,EAAK7E,QAAgB4E,EAAEI,OAEfpC,EAAMqC,aAAa,WACtBL,EAAEM,WAGVjF,EAAW4E,EAAM,SAASX,GACtB,GAAI/C,IACA0D,KAAMX,EACNjC,SAAUA,GAAYhD,EAGtB6F,GACAF,EAAEX,MAAMkB,QAAQhE,GAEhByD,EAAEX,MAAMZ,KAAKlC,GAGbyD,EAAEX,MAAMjE,SAAW4E,EAAEH,aACrBG,EAAEQ,kBAGVxC,GAAMqC,aAAaL,EAAES,UAEzB,QAASC,GAAMV,EAAGX,GACd,MAAO,YACHsB,GAAW,CAEX,IAAIC,IAAU,EACVrB,EAAOxE,SACXM,GAAWgE,EAAO,SAAUC,GACxBjE,EAAWwF,EAAa,SAAUjB,EAAQrE,GAClCqE,IAAWN,GAASsB,IACpBC,EAAYC,OAAOvF,EAAO,GAC1BqF,GAAU,KAIlBtB,EAAKjC,SAASxC,MAAMyE,EAAMC,KAE1BS,EAAEX,MAAMjE,OAASuF,IAAY,GAC7BX,EAAEM,QAENN,EAAES,WAzDV,GAAmB,MAAfZ,EACAA,EAAc,MAEb,IAAmB,IAAhBA,EACJ,KAAM,IAAIjF,OAAM,+BAyDpB,IAAI+F,GAAU,EACVE,KACAb,GACAX,SACAQ,YAAaA,EACbC,QAASA,EACTU,UAAWnG,EACX0G,MAAO1G,EACPiG,MAAOjG,EACP8F,SAAS,EACTa,QAAQ,EACRvC,KAAM,SAAUwB,EAAM5C,GAClB0C,EAAQC,EAAGC,GAAM,EAAO5C,IAE5B4D,KAAM,WACFjB,EAAEM,MAAQjG,EACV2F,EAAEX,UAENkB,QAAS,SAAUN,EAAM5C,GACrB0C,EAAQC,EAAGC,GAAM,EAAM5C,IAE3BoD,QAAS,WACL,MAAOT,EAAEgB,QAAUL,EAAUX,EAAEH,aAAeG,EAAEX,MAAMjE,QAAO,CAEzD,GAAIiE,GAAQW,EAAEF,QACVE,EAAEX,MAAMyB,OAAO,EAAGd,EAAEF,SACpBE,EAAEX,MAAMyB,OAAO,EAAGd,EAAEX,MAAMjE,QAE1B6E,EAAOzE,EAAK6D,EAAO,SAAUC,GAC7B,MAAOA,GAAKW,MAGO,KAAnBD,EAAEX,MAAMjE,QACR4E,EAAEe,QAENJ,GAAW,EACXE,EAAYpC,KAAKY,EAAM,GACvB,IAAIR,GAAKnE,EAAUgG,EAAMV,EAAGX,GAC5BO,GAAOK,EAAMpB,KAGrBzD,OAAQ,WACJ,MAAO4E,GAAEX,MAAMjE,QAEnBuC,QAAS,WACL,MAAOgD,IAEXE,YAAa,WACT,MAAOA,IAEXT,KAAM,WACF,MAAOJ,GAAEX,MAAMjE,OAASuF,IAAY,GAExCO,MAAO,WACHlB,EAAEgB,QAAS,GAEfG,OAAQ,WACJ,GAAInB,EAAEgB,UAAW,EAAjB,CACAhB,EAAEgB,QAAS,CAIX,KAAK,GAHDI,GAAcrE,KAAKsE,IAAIrB,EAAEH,YAAaG,EAAEX,MAAMjE,QAGzCkG,EAAI,EAAQF,GAALE,EAAkBA,IAC9BtD,EAAMqC,aAAaL,EAAES,WAIjC,OAAOT,GA+EX,QAASuB,GAAYC,GACjB,MAAO5E,GAAW,SAAUjC,EAAI4E,GAC5B5E,EAAGE,MAAM,KAAM0E,EAAKG,QAAQ9C,EAAW,SAAUkB,EAAKyB,GAC3B,gBAAZkC,WACH3D,EACI2D,QAAQC,OACRD,QAAQC,MAAM5D,GAGb2D,QAAQD,IACbnG,EAAWkE,EAAM,SAAUvD,GACvByF,QAAQD,GAAMxF,aAoDtC,QAAS2F,GAAOC,GACZ,MAAO,UAAUhG,EAAON,EAAU+B,GAC9BuE,EAAOjG,EAAOC,GAAQN,EAAU+B,IAsCxC,QAASwE,GAAWvD,GAChB,MAAO1B,GAAW,SAASkF,EAAKvC,GAC5B,GAAIwC,GAAKnF,EAAW,SAAS2C,GACzB,GAAIyC,GAAOlH,KACPuC,EAAWkC,EAAK0C,KACpB,OAAO3D,GAAOwD,EAAK,SAAUnH,EAAIuE,EAAGL,GAChClE,EAAGE,MAAMmH,EAAMzC,EAAKG,QAAQb,MAEhCxB,IAEJ,OAAIkC,GAAKnE,OACE2G,EAAGlH,MAAMC,KAAMyE,GAGfwC,IAqBnB,QAASG,GAAYvH,GACjB,MAAOiC,GAAW,SAAU2C,GACxB,GAAIlC,GAAWkC,EAAK0C,KACpB1C,GAAKd,KAAK,WACN,GAAI0D,GAAYpH,SACZqH,GACApE,EAAMqC,aAAa,WACfhD,EAASxC,MAAM,KAAMsH,KAGzB9E,EAASxC,MAAM,KAAMsH,IAG7B,IAAIC,IAAO,CACXzH,GAAGE,MAAMC,KAAMyE,GACf6C,GAAO,IAprCf,GAaIC,GAbArE,KAkBAsE,EAAuB,gBAATC,OAAqBA,KAAKA,OAASA,MAAQA,MACnC,gBAAXC,SAAuBA,OAAOA,SAAWA,QAAUA,QAC1D1H,IAEI,OAARwH,IACAD,EAAiBC,EAAKtE,OAG1BA,EAAMyE,WAAa,WAEf,MADAH,GAAKtE,MAAQqE,EACNrE,EAqBX,IAAI0E,GAAYC,OAAOC,UAAUC,SAE7B1H,EAAWO,MAAMoH,SAAW,SAAUtF,GACtC,MAA+B,mBAAxBkF,EAAUxF,KAAKM,IAItBuF,EAAY,SAASvF,GACrB,GAAIwF,SAAcxF,EAClB,OAAgB,aAATwF,GAAgC,WAATA,KAAuBxF,GAwDrDpB,EAAQuG,OAAOhG,MAAQ,SAAUa,GACjC,GAAIb,KACJ,KAAK,GAAIsG,KAAKzF,GACNA,EAAI0F,eAAeD,IACnBtG,EAAK8B,KAAKwE,EAGlB,OAAOtG,IA2DPwG,EAAwC,kBAAjB9C,eAA+BA,aAEtD+C,EAASD,EAAgB,SAASxI,GAElCwI,EAAcxI,IACd,SAASA,GACT0I,WAAW1I,EAAI,GAGI,iBAAZ8F,UAAoD,kBAArBA,SAAQ6C,SAC9CtF,EAAMsF,SAAW7C,QAAQ6C,SAEzBtF,EAAMsF,SAAWF,EAErBpF,EAAMqC,aAAe8C,EAAgBC,EAASpF,EAAMsF,SAGpDtF,EAAMuF,QACNvF,EAAMwF,KAAO,SAAUtI,EAAKI,EAAU+B,GAClC,MAAOW,GAAMC,OAAO/C,EAAKiC,EAAc7B,GAAW+B,IAGtDW,EAAMyF,cACNzF,EAAM0F,WAAa,SAAUxI,EAAKI,EAAU+B,GACxC,MAAOW,GAAMI,aAAalD,EAAKiC,EAAc7B,GAAW+B,IAI5DW,EAAM2F,aACN3F,EAAM4F,UAAY,SAAU1I,EAAKqC,EAAOjC,EAAU+B,GAC9C,MAAOC,GAAaC,GAAOrC,EAAKiC,EAAc7B,GAAW+B,IAG7DW,EAAM6F,UACN7F,EAAMC,OAAS,SAAU9B,EAAQb,EAAU+B,GAcvC,QAASK,GAAKI,GACVgG,IACIhG,EACAT,EAASS,GAII,OAARzB,GAA6B,GAAbyH,GACrBzG,EAAS,MArBjBA,EAAWrC,EAAMqC,GAAYhD,GAC7B8B,EAASA,KAKT,KAHA,GACIE,GADA0H,EAAOvH,EAAaL,GACf2H,EAAY,EAEI,OAAjBzH,EAAM0H,MACVD,GAAa,EACbxI,EAASa,EAAOE,GAAMA,EAAK3B,EAAUgD,GAGvB,KAAdoG,GAAiBzG,EAAS,OAelCW,EAAMgG,gBACNhG,EAAMI,aAAe,SAAUZ,EAAKlC,EAAU+B,GAK1C,QAAS4G,KACL,GAAI7B,IAAO,CACX,OAAY,QAAR/F,EACOgB,EAAS,OAEpB/B,EAASkC,EAAInB,GAAMA,EAAK3B,EAAU,SAAUoD,GACxC,GAAIA,EACAT,EAASS,OAER,CAED,GADAzB,EAAMoB,IACM,OAARpB,EACA,MAAOgB,GAAS,KAEZ+E,GACApE,EAAMqC,aAAa4D,GAEnBA,aAKhB7B,GAAO,IA1BX/E,EAAWrC,EAAMqC,GAAYhD,GAC7BmD,EAAMA,KACN,IAAIC,GAAUjB,EAAagB,GACvBnB,EAAMoB,GAyBVwG,MAKJjG,EAAMkG,eACNlG,EAAMmG,YAAc,SAAU3G,EAAKD,EAAOjC,EAAU+B,GAChDC,EAAaC,GAAOC,EAAKlC,EAAU+B,IA6EvCW,EAAMoG,IAAMrG,EAAWM,GACvBL,EAAMqG,UAAYlG,EAASE,GAC3BL,EAAMsG,SAAWpG,EAAgBG,GAIjCL,EAAMuG,OACNvG,EAAMwG,MACNxG,EAAMyG,OAAS,SAAUvJ,EAAKa,EAAMT,EAAU+B,GAC1CW,EAAMI,aAAalD,EAAK,SAAUc,EAAGH,EAAGwB,GACpC/B,EAASS,EAAMC,EAAG,SAAU8B,EAAKvD,GAC7BwB,EAAOxB,EACP8C,EAASS,MAEd,SAAUA,GACTT,EAASS,EAAK/B,MAItBiC,EAAM0G,MACN1G,EAAM2G,YAAc,SAAUzJ,EAAKa,EAAMT,EAAU+B,GAC/C,GAAIuH,GAAWpJ,EAAKN,EAAKZ,GAAUuK,SACnC7G,GAAMyG,OAAOG,EAAU7I,EAAMT,EAAU+B,IAG3CW,EAAM8G,UAAY,SAAU5J,EAAKa,EAAMT,EAAU+B,GACpB,IAArBtC,UAAUK,SACViC,EAAW/B,EACXA,EAAWS,EACXA,EAAOZ,EAASD,UAGpB8C,EAAMC,OAAO/C,EAAK,SAASX,EAAG0I,EAAGpE,GAC7BvD,EAASS,EAAMxB,EAAG0I,EAAGpE,IACtB,SAASf,GACRT,EAASS,EAAK/B,MAsBtBiC,EAAM+G,OACN/G,EAAMgH,OAASjH,EAAWS,GAE1BR,EAAMiH,YACNjH,EAAMkH,YAAchH,EAAgBM,GAEpCR,EAAMmH,aACNnH,EAAMoH,aAAejH,EAASK,GAS9BR,EAAMqH,OAAStH,EAAWa,GAC1BZ,EAAMsH,YAAcpH,EAAgBU,GACpCZ,EAAMuH,aAAepH,EAASS,GA2B9BZ,EAAMwH,IACNxH,EAAMyH,KAAO3G,EAAcd,EAAMC,OAAQzD,EAAQF,GAEjD0D,EAAM0H,UAAY5G,EAAcd,EAAMmG,YAAa3J,EAAQF,GAE3D0D,EAAM2H,IACN3H,EAAM4H,MAAQ9G,EAAcd,EAAMC,OAAQxD,EAAOA,GAEjDuD,EAAM6H,WAAa/G,EAAcd,EAAMmG,YAAa1J,EAAOA,GAK3DuD,EAAM8H,OAAShH,EAAcd,EAAMC,OAAQ3D,EAAU6E,GACrDnB,EAAM+H,aAAejH,EAAcd,EAAMI,aAAc9D,EAAU6E,GACjEnB,EAAMgI,YAAclH,EAAcd,EAAMmG,YAAa7J,EAAU6E,GAE/DnB,EAAMiI,OAAS,SAAU/K,EAAKI,EAAU+B,GAsBpC,QAAS6I,GAAWC,EAAMC,GACtB,GAAInK,GAAIkK,EAAKE,SAAU1H,EAAIyH,EAAMC,QACjC,OAAW1H,GAAJ1C,EAAQ,GAAKA,EAAI0C,EAAI,EAAI,EAvBpCX,EAAMoG,IAAIlJ,EAAK,SAAUc,EAAGqB,GACxB/B,EAASU,EAAG,SAAU8B,EAAKuI,GACnBvI,EACAT,EAASS,GAGTT,EAAS,MAAOD,MAAOpB,EAAGqK,SAAUA,OAG7C,SAAUvI,EAAKS,GACd,MAAIT,GACOT,EAASS,OAGhBT,GAAS,KAAM7B,EAAK+C,EAAQG,KAAKwH,GAAa,SAAUlK,GACpD,MAAOA,GAAEoB,YAYzBY,EAAMsI,KAAO,SAAUjH,EAAOQ,EAAaxC,GAsBvC,QAASkJ,GAAY5L,GACjB6L,EAAUjG,QAAQ5F,GAEtB,QAAS8L,GAAe9L,GACpB,GAAI+L,GAAMpK,EAASkK,EAAW7L,EAC1B+L,IAAO,GAAGF,EAAU1F,OAAO4F,EAAK,GAExC,QAASC,KACLC,IACAvL,EAAWmL,EAAUK,MAAM,GAAI,SAAUlM,GACrCA,MA/BoB,kBAAjBI,WAAU,KAEjBsC,EAAWwC,EACXA,EAAc,MAElBxC,EAAWrC,EAAMqC,GAAYhD,EAC7B,IAAIsC,GAAOP,EAAMiD,GACbuH,EAAiBjK,EAAKvB,MAC1B,KAAKwL,EACD,MAAOvJ,GAAS,KAEfwC,KACDA,EAAc+G,EAGlB,IAAIrI,MACAuI,EAAe,EAEfC,GAAW,EAEXP,IAeJD,GAAY,WACHK,GACDvJ,EAAS,KAAMkB,KAIvBlD,EAAWsB,EAAM,SAAUsG,GAmCvB,QAAS+D,KACL,MAAsBnH,GAAfiH,GAA8BhL,EAAQmL,EAAU,SAAUhL,EAAGD,GAChE,MAAQC,IAAKsC,EAAQ2E,eAAelH,KACrC,KAAUuC,EAAQ2E,eAAeD,GASxC,QAASiE,KACDF,MACAF,IACAL,EAAeS,GACf5H,EAAKA,EAAKlE,OAAS,GAAG+L,EAAc5I,IAlD5C,IAAIwI,EAAJ,CA0BA,IAzBA,GAwBIK,GAxBA9H,EAAOnE,EAASkE,EAAM4D,IAAM5D,EAAM4D,IAAK5D,EAAM4D,IAC7CkE,EAAevK,EAAW,SAASkB,EAAKyB,GAKxC,GAJAuH,IACIvH,EAAKnE,QAAU,IACfmE,EAAOA,EAAK,IAEZzB,EAAK,CACL,GAAIuJ,KACJnL,GAAWqC,EAAS,SAAS+I,EAAKC,GAC9BF,EAAYE,GAAQD,IAExBD,EAAYpE,GAAK1D,EACjBwH,GAAW,EAEX1J,EAASS,EAAKuJ,OAGd9I,GAAQ0E,GAAK1D,EACbvB,EAAMqC,aAAasG,KAGvBM,EAAW3H,EAAKuH,MAAM,EAAGvH,EAAKlE,OAAS,GAEvCsB,EAAMuK,EAAS7L,OAEZsB,KAAO,CACV,KAAM0K,EAAM/H,EAAM4H,EAASvK,KACvB,KAAM,IAAI9B,OAAM,iCAAmCqM,EAASO,KAAK,MAErE,IAAIrM,EAASiM,IAAQ9K,EAAS8K,EAAKnE,IAAM,EACrC,KAAM,IAAIrI,OAAM,2BAQpBoM,KACAF,IACAxH,EAAKA,EAAKlE,OAAS,GAAG+L,EAAc5I,IAGpCgI,EAAYW,OAcxBlJ,EAAMyJ,MAAQ,SAASC,EAAOpI,EAAMjC,GAWhC,QAASsK,GAAWC,EAAKC,GACrB,GAAgB,gBAANA,GACND,EAAIF,MAAQI,SAASD,EAAG,KAAOE,MAC5B,CAAA,GAAgB,gBAANF,GAIb,KAAM,IAAIjN,OAAM,gDAAqDiN,GAHrED,GAAIF,MAAQI,SAASD,EAAEH,MAAO,KAAOK,EACrCH,EAAII,SAAWF,SAASD,EAAEG,SAAU,KAAOC,GAmBnD,QAASC,GAAYC,EAAiBC,GAClC,QAASC,GAAa/I,EAAMgJ,GACxB,MAAO,UAASC,GACZjJ,EAAK,SAASxB,EAAKrC,GACf8M,GAAgBzK,GAAOwK,GAAexK,IAAKA,EAAKrC,OAAQA,KACzD2M,IAIX,QAASI,GAAcR,GACnB,MAAO,UAASO,GACZlF,WAAW,WACPkF,EAAe,OAChBP,IAIX,KAAOS,EAAKf,OAAO,CAEf,GAAIY,KAAiBG,EAAKf,OAAO,EACjCgB,GAASjK,KAAK4J,EAAaI,EAAKnJ,KAAMgJ,KAClCA,GAAgBG,EAAKT,SAAW,GAChCU,EAASjK,KAAK+J,EAAcC,EAAKT,WAIzChK,EAAM2K,OAAOD,EAAU,SAAShL,EAAMuC,GAClCA,EAAOA,EAAKA,EAAK7E,OAAS,IACzB+M,GAAmBM,EAAKpL,UAAU4C,EAAKnC,IAAKmC,EAAKxE,UA9D1D,GAAIsM,GAAgB,EAChBE,EAAmB,EAEnBS,KAEAD,GACAf,MAAOK,EACPC,SAAUC,GAcV7M,EAASL,UAAUK,MACvB,IAAa,EAATA,GAAcA,EAAS,EACvB,KAAM,IAAIR,OAAM,wGA4CpB,OA3CqB,IAAVQ,GAAgC,kBAAVsM,KAC7BrK,EAAWiC,EACXA,EAAOoI,GAEU,kBAAVA,IACPC,EAAWc,EAAMf,GAErBe,EAAKpL,SAAWA,EAChBoL,EAAKnJ,KAAOA,EAmCLmJ,EAAKpL,SAAW6K,IAAgBA,GAG3ClK,EAAM4K,UAAY,SAAUvJ,EAAOhC,GAS/B,QAASwL,GAAavN,GAClB,MAAOsB,GAAW,SAAUkB,EAAKyB,GAC7B,GAAIzB,EACAT,EAASxC,MAAM,MAAOiD,GAAK4B,OAAOH,QAEjC,CACD,GAAIuJ,GAAOxN,EAASwN,MAChBA,GACAvJ,EAAKd,KAAKoK,EAAaC,IAGvBvJ,EAAKd,KAAKpB,GAEd6E,EAAY5G,GAAUT,MAAM,KAAM0E,MApB9C,GADAlC,EAAWrC,EAAMqC,GAAYhD,IACxBc,EAASkE,GAAQ,CAClB,GAAIvB,GAAM,GAAIlD,OAAM,4DACpB,OAAOyC,GAASS,GAEpB,MAAKuB,GAAMjE,WAoBXyN,GAAa7K,EAAM1C,SAAS+D,MAnBjBhC,KAuCfW,EAAM+K,SAAW,SAAU1J,EAAOhC,GAC9B+B,EAAUpB,EAAMC,OAAQoB,EAAOhC,IAGnCW,EAAMgL,cAAgB,SAAS3J,EAAO9B,EAAOF,GACzC+B,EAAU9B,EAAaC,GAAQ8B,EAAOhC,IAG1CW,EAAM2K,OAAS,SAAStJ,EAAOhC,GAC3B+B,EAAUpB,EAAMI,aAAciB,EAAOhC,IAGzCW,EAAM1C,SAAW,SAAU+D,GACvB,QAAS4J,GAAa1N,GAClB,QAASZ,KAIL,MAHI0E,GAAMjE,QACNiE,EAAM9D,GAAOV,MAAM,KAAME,WAEtBJ,EAAGmO,OAKd,MAHAnO,GAAGmO,KAAO,WACN,MAAQvN,GAAQ8D,EAAMjE,OAAS,EAAK6N,EAAa1N,EAAQ,GAAI,MAE1DZ,EAEX,MAAOsO,GAAa,IAGxBjL,EAAMnD,MAAQ+B,EAAW,SAAUjC,EAAI4E,GACnC,MAAO3C,GAAW,SAAUsM,GACxB,MAAOvO,GAAGE,MACN,KAAM0E,EAAKG,OAAOwJ,QAgB9BlL,EAAM0B,OAAS3B,EAAWyB,GAC1BxB,EAAMmL,aAAehL,EAASqB,GAE9BxB,EAAMoL,OAAS,SAAUC,EAAM/N,EAAU+B,GAErC,GADAA,EAAWA,GAAYhD,EACnBgP,IAAQ,CACR,GAAIP,GAAOlM,EAAW,SAASkB,EAAKyB,GAC5BzB,EACAT,EAASS,GACFuL,EAAKxO,MAAMC,KAAMyE,GACxBjE,EAASwN,GAETzL,EAASxC,MAAM,MAAO,MAAM6E,OAAOH,KAG3CjE,GAASwN,OAETzL,GAAS,OAIjBW,EAAMsL,SAAW,SAAUhO,EAAU+N,EAAMhM,GACvC,GAAIkM,GAAQ,CACZ,OAAOvL,GAAMoL,OAAO,WAChB,QAASG,GAAS,GAAKF,EAAKxO,MAAMC,KAAMC,YACzCO,EAAU+B,IAGjBW,EAAMwL,MAAQ,SAAUH,EAAM/N,EAAU+B,GACpC,MAAOW,GAAMoL,OAAO,WAChB,OAAQC,EAAKxO,MAAMC,KAAMC,YAC1BO,EAAU+B,IAGjBW,EAAMyL,QAAU,SAAUnO,EAAU+N,EAAMhM,GACtC,MAAOW,GAAMsL,SAAShO,EAAU,WAC5B,OAAQ+N,EAAKxO,MAAMC,KAAMC,YAC1BsC,IAGPW,EAAM0L,OAAS,SAAUL,EAAM/N,EAAU+B,GACrCA,EAAWA,GAAYhD,CAEvB,IAAIyO,GAAOlM,EAAW,SAASkB,EAAKyB,GAC5BzB,EACAT,EAASS,IAETyB,EAAKd,KAAKM,GACVsK,EAAKxO,MAAMC,KAAMyE,MAIrBR,EAAQ,SAASjB,EAAK6L,GAClB7L,EACAT,EAASS,GACF6L,EACPrO,EAASwN,GAETzL,EAAS,MAIjBgM,GAAKtK,IAGTf,EAAM4L,SAAW,SAAUtO,EAAU+N,EAAMhM,GACvC,GAAIkM,GAAQ,CACZvL,GAAM0L,OAAO,SAASZ,GACdS,IAAU,EACVT,EAAK,MAAM,GAEXO,EAAKxO,MAAMC,KAAMC,YAEtBO,EAAU+B,IAuIjBW,EAAM6L,MAAQ,SAAUjK,EAAQC,GAC5B,GAAIG,GAAIL,EAAO,SAAUmK,EAAOjL,GAC5Be,EAAOkK,EAAM,GAAIjL,IAClBgB,EAAa,EAEhB,OAAOG,IAGXhC,EAAM+L,cAAgB,SAAUnK,EAAQC,GAEpC,QAASmK,GAAc/N,EAAG0C,GACtB,MAAO1C,GAAEgO,SAAWtL,EAAEsL,SAG1B,QAASC,GAAcC,EAAU5N,EAAM6N,GAGnC,IAFA,GAAIC,GAAM,GACNC,EAAMH,EAAS/O,OAAS,EACfkP,EAAND,GAAW,CACd,GAAIE,GAAMF,GAAQC,EAAMD,EAAM,IAAO,EACjCD,GAAQ7N,EAAM4N,EAASI,KAAS,EAChCF,EAAME,EAEND,EAAMC,EAAM,EAGpB,MAAOF,GAGX,QAAStK,GAAQC,EAAGC,EAAMgK,EAAU5M,GAChC,GAAgB,MAAZA,GAAwC,kBAAbA,GAC3B,KAAM,IAAIzC,OAAM,mCAMpB,OAJAoF,GAAEG,SAAU,EACPhF,EAAS8E,KACVA,GAAQA,IAEO,IAAhBA,EAAK7E,OAEG4C,EAAMqC,aAAa,WACtBL,EAAEM,cAGVjF,GAAW4E,EAAM,SAASX,GACtB,GAAI/C,IACA0D,KAAMX,EACN2K,SAAUA,EACV5M,SAA8B,kBAAbA,GAA0BA,EAAWhD,EAG1D2F,GAAEX,MAAMyB,OAAOoJ,EAAclK,EAAEX,MAAO9C,EAAMyN,GAAiB,EAAG,EAAGzN,GAE/DyD,EAAEX,MAAMjE,SAAW4E,EAAEH,aACrBG,EAAEQ,YAENxC,EAAMqC,aAAaL,EAAES,WAK7B,GAAIT,GAAIhC,EAAM6L,MAAMjK,EAAQC,EAU5B,OAPAG,GAAEvB,KAAO,SAAUwB,EAAMgK,EAAU5M,GAC/B0C,EAAQC,EAAGC,EAAMgK,EAAU5M,UAIxB2C,GAAEO,QAEFP,GAGXhC,EAAMwM,MAAQ,SAAU5K,EAAQE,GAC5B,MAAOH,GAAOC,EAAQ,EAAGE,IAqB7B9B,EAAMyM,IAAMlJ,EAAY,OACxBvD,EAAM0M,IAAMnJ,EAAY,OAKxBvD,EAAM2M,QAAU,SAAUhQ,EAAIiQ,GAC1B,GAAI7O,MACA8O,KACAC,EAAMnI,OAAOC,UAAUM,cAC3B0H,GAASA,GAAUtQ,CACnB,IAAIyQ,GAAWnO,EAAW,SAAkB2C,GACxC,GAAIlC,GAAWkC,EAAK0C,MAChB5F,EAAMuO,EAAO/P,MAAM,KAAM0E,EACzBuL,GAAI5N,KAAKnB,EAAMM,GACf2B,EAAMqC,aAAa,WACfhD,EAASxC,MAAM,KAAMkB,EAAKM,MAGzByO,EAAI5N,KAAK2N,EAAQxO,GACtBwO,EAAOxO,GAAKoC,KAAKpB,IAGjBwN,EAAOxO,IAAQgB,GACf1C,EAAGE,MAAM,KAAM0E,EAAKG,QAAQ9C,EAAW,SAAU2C,GAC7CxD,EAAKM,GAAOkD,CACZ,IAAIS,GAAI6K,EAAOxO,SACRwO,GAAOxO,EACd,KAAK,GAAIR,GAAI,EAAGmP,EAAIhL,EAAE5E,OAAY4P,EAAJnP,EAAOA,IACjCmE,EAAEnE,GAAGhB,MAAM,KAAM0E,UAOjC,OAFAwL,GAAShP,KAAOA,EAChBgP,EAASE,WAAatQ,EACfoQ,GAGX/M,EAAMkN,UAAY,SAAUvQ,GACxB,MAAO,YACH,OAAQA,EAAGsQ,YAActQ,GAAIE,MAAM,KAAME,aAUjDiD,EAAM0J,MAAQ/F,EAAO3D,EAAMoG,KAC3BpG,EAAMmN,YAAcxJ,EAAO3D,EAAMqG,WACjCrG,EAAMoN,WAAa,SAAUxP,EAAO2B,EAAOjC,EAAU+B,GACjD,MAAOW,GAAMsG,SAAS3I,EAAOC,GAAQ2B,EAAOjC,EAAU+B,IAG1DW,EAAMqN,IAAM,WACR,GAAIvJ,GAAM/G,SACV,OAAO6B,GAAW,SAAU2C,GACxB,GAAIyC,GAAOlH,KAEPuC,EAAWkC,EAAKA,EAAKnE,OAAS,EACX,mBAAZiC,GACPkC,EAAK0C,MAEL5E,EAAWhD,EAGf2D,EAAMyG,OAAO3C,EAAKvC,EAAM,SAAU+L,EAAS3Q,EAAIkE,GAC3ClE,EAAGE,MAAMmH,EAAMsJ,EAAQ5L,QAAQ9C,EAAW,SAAUkB,EAAKyN,GACrD1M,EAAGf,EAAKyN,SAGhB,SAAUzN,EAAKS,GACXlB,EAASxC,MAAMmH,GAAOlE,GAAK4B,OAAOnB,SAK9CP,EAAMwN,QAAU,WACZ,MAAOxN,GAAMqN,IAAIxQ,MAAM,KAAMa,MAAMkH,UAAUiC,QAAQ3H,KAAKnC,aAuB9DiD,EAAMyN,UAAY5J,EAAW7D,EAAMC,QACnCD,EAAM0N,gBAAkB7J,EAAW7D,EAAMI,cAGzCJ,EAAM2N,QAAU,SAAUhR,EAAI0C,GAG1B,QAASyL,GAAKhL,GACV,MAAIA,GACOJ,EAAKI,OAEhBwB,GAAKwJ,GANT,GAAIpL,GAAOhD,EAAU2C,GAAYhD,GAC7BiF,EAAO4C,EAAYvH,EAOvBmO,MAsBJ9K,EAAMkE,YAAcA,EAEpBlE,EAAM4N,SAAWhP,EAAW,SAASiP,GACjC,GAAItM,IAAQ,MAAMG,OAAOmM,EACzB,OAAO,UAAUxO,GACb,MAAOA,GAASxC,MAAMC,KAAMyE,MAIpCvB,EAAM8N,SACN9N,EAAM+N,SAAW,SAAkBlP,GAC/B,MAAOD,GAAW,SAAU2C,GACxB,GACI9D,GADA4B,EAAWkC,EAAK0C,KAEpB,KACIxG,EAASoB,EAAKhC,MAAMC,KAAMyE,GAC5B,MAAOyM,GACL,MAAO3O,GAAS2O,GAGhBjJ,EAAUtH,IAAkC,kBAAhBA,GAAOwQ,KACnCxQ,EAAOwQ,KAAK,SAAS7O,GACjBC,EAAS,KAAMD,KAChB,SAAS,SAASU,GACjBT,EAASS,EAAIoO,QAAUpO,EAAM,GAAIlD,OAAMkD,MAG3CT,EAAS,KAAM5B,MAML,gBAAX0Q,SAAuBA,OAAOC,QACrCD,OAAOC,QAAUpO,EAGM,kBAAXqO,SAAyBA,OAAOC,IAC5CD,UAAW,WACP,MAAOrO,KAKXsE,EAAKtE,MAAQA"} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/karma.conf.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/karma.conf.js
new file mode 100644
index 00000000000..9e048c3daba
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/karma.conf.js
@@ -0,0 +1,12 @@
+module.exports = function (config) {
+ config.set({
+ browsers: ['Firefox'],
+ files: ['mocha_test/*.js'],
+ frameworks: ['browserify', 'mocha'],
+ preprocessors: {
+ 'mocha_test/*.js': ['browserify']
+ },
+ reporters: ['mocha'],
+ singleRun: true
+ });
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/lib/async.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/lib/async.js
new file mode 100644
index 00000000000..31e7620fb6f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/lib/async.js
@@ -0,0 +1,1265 @@
+/*!
+ * async
+ * https://github.com/caolan/async
+ *
+ * Copyright 2010-2014 Caolan McMahon
+ * Released under the MIT license
+ */
+(function () {
+
+ var async = {};
+ function noop() {}
+ function identity(v) {
+ return v;
+ }
+ function toBool(v) {
+ return !!v;
+ }
+ function notId(v) {
+ return !v;
+ }
+
+ // global on the server, window in the browser
+ var previous_async;
+
+ // Establish the root object, `window` (`self`) in the browser, `global`
+ // on the server, or `this` in some virtual machines. We use `self`
+ // instead of `window` for `WebWorker` support.
+ var root = typeof self === 'object' && self.self === self && self ||
+ typeof global === 'object' && global.global === global && global ||
+ this;
+
+ if (root != null) {
+ previous_async = root.async;
+ }
+
+ async.noConflict = function () {
+ root.async = previous_async;
+ return async;
+ };
+
+ function only_once(fn) {
+ return function() {
+ if (fn === null) throw new Error("Callback was already called.");
+ fn.apply(this, arguments);
+ fn = null;
+ };
+ }
+
+ function _once(fn) {
+ return function() {
+ if (fn === null) return;
+ fn.apply(this, arguments);
+ fn = null;
+ };
+ }
+
+ //// cross-browser compatiblity functions ////
+
+ var _toString = Object.prototype.toString;
+
+ var _isArray = Array.isArray || function (obj) {
+ return _toString.call(obj) === '[object Array]';
+ };
+
+ // Ported from underscore.js isObject
+ var _isObject = function(obj) {
+ var type = typeof obj;
+ return type === 'function' || type === 'object' && !!obj;
+ };
+
+ function _isArrayLike(arr) {
+ return _isArray(arr) || (
+ // has a positive integer length property
+ typeof arr.length === "number" &&
+ arr.length >= 0 &&
+ arr.length % 1 === 0
+ );
+ }
+
+ function _arrayEach(arr, iterator) {
+ var index = -1,
+ length = arr.length;
+
+ while (++index < length) {
+ iterator(arr[index], index, arr);
+ }
+ }
+
+ function _map(arr, iterator) {
+ var index = -1,
+ length = arr.length,
+ result = Array(length);
+
+ while (++index < length) {
+ result[index] = iterator(arr[index], index, arr);
+ }
+ return result;
+ }
+
+ function _range(count) {
+ return _map(Array(count), function (v, i) { return i; });
+ }
+
+ function _reduce(arr, iterator, memo) {
+ _arrayEach(arr, function (x, i, a) {
+ memo = iterator(memo, x, i, a);
+ });
+ return memo;
+ }
+
+ function _forEachOf(object, iterator) {
+ _arrayEach(_keys(object), function (key) {
+ iterator(object[key], key);
+ });
+ }
+
+ function _indexOf(arr, item) {
+ for (var i = 0; i < arr.length; i++) {
+ if (arr[i] === item) return i;
+ }
+ return -1;
+ }
+
+ var _keys = Object.keys || function (obj) {
+ var keys = [];
+ for (var k in obj) {
+ if (obj.hasOwnProperty(k)) {
+ keys.push(k);
+ }
+ }
+ return keys;
+ };
+
+ function _keyIterator(coll) {
+ var i = -1;
+ var len;
+ var keys;
+ if (_isArrayLike(coll)) {
+ len = coll.length;
+ return function next() {
+ i++;
+ return i < len ? i : null;
+ };
+ } else {
+ keys = _keys(coll);
+ len = keys.length;
+ return function next() {
+ i++;
+ return i < len ? keys[i] : null;
+ };
+ }
+ }
+
+ // Similar to ES6's rest param (http://ariya.ofilabs.com/2013/03/es6-and-rest-parameter.html)
+ // This accumulates the arguments passed into an array, after a given index.
+ // From underscore.js (https://github.com/jashkenas/underscore/pull/2140).
+ function _restParam(func, startIndex) {
+ startIndex = startIndex == null ? func.length - 1 : +startIndex;
+ return function() {
+ var length = Math.max(arguments.length - startIndex, 0);
+ var rest = Array(length);
+ for (var index = 0; index < length; index++) {
+ rest[index] = arguments[index + startIndex];
+ }
+ switch (startIndex) {
+ case 0: return func.call(this, rest);
+ case 1: return func.call(this, arguments[0], rest);
+ }
+ // Currently unused but handle cases outside of the switch statement:
+ // var args = Array(startIndex + 1);
+ // for (index = 0; index < startIndex; index++) {
+ // args[index] = arguments[index];
+ // }
+ // args[startIndex] = rest;
+ // return func.apply(this, args);
+ };
+ }
+
+ function _withoutIndex(iterator) {
+ return function (value, index, callback) {
+ return iterator(value, callback);
+ };
+ }
+
+ //// exported async module functions ////
+
+ //// nextTick implementation with browser-compatible fallback ////
+
+ // capture the global reference to guard against fakeTimer mocks
+ var _setImmediate = typeof setImmediate === 'function' && setImmediate;
+
+ var _delay = _setImmediate ? function(fn) {
+ // not a direct alias for IE10 compatibility
+ _setImmediate(fn);
+ } : function(fn) {
+ setTimeout(fn, 0);
+ };
+
+ if (typeof process === 'object' && typeof process.nextTick === 'function') {
+ async.nextTick = process.nextTick;
+ } else {
+ async.nextTick = _delay;
+ }
+ async.setImmediate = _setImmediate ? _delay : async.nextTick;
+
+
+ async.forEach =
+ async.each = function (arr, iterator, callback) {
+ return async.eachOf(arr, _withoutIndex(iterator), callback);
+ };
+
+ async.forEachSeries =
+ async.eachSeries = function (arr, iterator, callback) {
+ return async.eachOfSeries(arr, _withoutIndex(iterator), callback);
+ };
+
+
+ async.forEachLimit =
+ async.eachLimit = function (arr, limit, iterator, callback) {
+ return _eachOfLimit(limit)(arr, _withoutIndex(iterator), callback);
+ };
+
+ async.forEachOf =
+ async.eachOf = function (object, iterator, callback) {
+ callback = _once(callback || noop);
+ object = object || [];
+
+ var iter = _keyIterator(object);
+ var key, completed = 0;
+
+ while ((key = iter()) != null) {
+ completed += 1;
+ iterator(object[key], key, only_once(done));
+ }
+
+ if (completed === 0) callback(null);
+
+ function done(err) {
+ completed--;
+ if (err) {
+ callback(err);
+ }
+ // Check key is null in case iterator isn't exhausted
+ // and done resolved synchronously.
+ else if (key === null && completed <= 0) {
+ callback(null);
+ }
+ }
+ };
+
+ async.forEachOfSeries =
+ async.eachOfSeries = function (obj, iterator, callback) {
+ callback = _once(callback || noop);
+ obj = obj || [];
+ var nextKey = _keyIterator(obj);
+ var key = nextKey();
+ function iterate() {
+ var sync = true;
+ if (key === null) {
+ return callback(null);
+ }
+ iterator(obj[key], key, only_once(function (err) {
+ if (err) {
+ callback(err);
+ }
+ else {
+ key = nextKey();
+ if (key === null) {
+ return callback(null);
+ } else {
+ if (sync) {
+ async.setImmediate(iterate);
+ } else {
+ iterate();
+ }
+ }
+ }
+ }));
+ sync = false;
+ }
+ iterate();
+ };
+
+
+
+ async.forEachOfLimit =
+ async.eachOfLimit = function (obj, limit, iterator, callback) {
+ _eachOfLimit(limit)(obj, iterator, callback);
+ };
+
+ function _eachOfLimit(limit) {
+
+ return function (obj, iterator, callback) {
+ callback = _once(callback || noop);
+ obj = obj || [];
+ var nextKey = _keyIterator(obj);
+ if (limit <= 0) {
+ return callback(null);
+ }
+ var done = false;
+ var running = 0;
+ var errored = false;
+
+ (function replenish () {
+ if (done && running <= 0) {
+ return callback(null);
+ }
+
+ while (running < limit && !errored) {
+ var key = nextKey();
+ if (key === null) {
+ done = true;
+ if (running <= 0) {
+ callback(null);
+ }
+ return;
+ }
+ running += 1;
+ iterator(obj[key], key, only_once(function (err) {
+ running -= 1;
+ if (err) {
+ callback(err);
+ errored = true;
+ }
+ else {
+ replenish();
+ }
+ }));
+ }
+ })();
+ };
+ }
+
+
+ function doParallel(fn) {
+ return function (obj, iterator, callback) {
+ return fn(async.eachOf, obj, iterator, callback);
+ };
+ }
+ function doParallelLimit(fn) {
+ return function (obj, limit, iterator, callback) {
+ return fn(_eachOfLimit(limit), obj, iterator, callback);
+ };
+ }
+ function doSeries(fn) {
+ return function (obj, iterator, callback) {
+ return fn(async.eachOfSeries, obj, iterator, callback);
+ };
+ }
+
+ function _asyncMap(eachfn, arr, iterator, callback) {
+ callback = _once(callback || noop);
+ arr = arr || [];
+ var results = _isArrayLike(arr) ? [] : {};
+ eachfn(arr, function (value, index, callback) {
+ iterator(value, function (err, v) {
+ results[index] = v;
+ callback(err);
+ });
+ }, function (err) {
+ callback(err, results);
+ });
+ }
+
+ async.map = doParallel(_asyncMap);
+ async.mapSeries = doSeries(_asyncMap);
+ async.mapLimit = doParallelLimit(_asyncMap);
+
+ // reduce only has a series version, as doing reduce in parallel won't
+ // work in many situations.
+ async.inject =
+ async.foldl =
+ async.reduce = function (arr, memo, iterator, callback) {
+ async.eachOfSeries(arr, function (x, i, callback) {
+ iterator(memo, x, function (err, v) {
+ memo = v;
+ callback(err);
+ });
+ }, function (err) {
+ callback(err, memo);
+ });
+ };
+
+ async.foldr =
+ async.reduceRight = function (arr, memo, iterator, callback) {
+ var reversed = _map(arr, identity).reverse();
+ async.reduce(reversed, memo, iterator, callback);
+ };
+
+ async.transform = function (arr, memo, iterator, callback) {
+ if (arguments.length === 3) {
+ callback = iterator;
+ iterator = memo;
+ memo = _isArray(arr) ? [] : {};
+ }
+
+ async.eachOf(arr, function(v, k, cb) {
+ iterator(memo, v, k, cb);
+ }, function(err) {
+ callback(err, memo);
+ });
+ };
+
+ function _filter(eachfn, arr, iterator, callback) {
+ var results = [];
+ eachfn(arr, function (x, index, callback) {
+ iterator(x, function (v) {
+ if (v) {
+ results.push({index: index, value: x});
+ }
+ callback();
+ });
+ }, function () {
+ callback(_map(results.sort(function (a, b) {
+ return a.index - b.index;
+ }), function (x) {
+ return x.value;
+ }));
+ });
+ }
+
+ async.select =
+ async.filter = doParallel(_filter);
+
+ async.selectLimit =
+ async.filterLimit = doParallelLimit(_filter);
+
+ async.selectSeries =
+ async.filterSeries = doSeries(_filter);
+
+ function _reject(eachfn, arr, iterator, callback) {
+ _filter(eachfn, arr, function(value, cb) {
+ iterator(value, function(v) {
+ cb(!v);
+ });
+ }, callback);
+ }
+ async.reject = doParallel(_reject);
+ async.rejectLimit = doParallelLimit(_reject);
+ async.rejectSeries = doSeries(_reject);
+
+ function _createTester(eachfn, check, getResult) {
+ return function(arr, limit, iterator, cb) {
+ function done() {
+ if (cb) cb(getResult(false, void 0));
+ }
+ function iteratee(x, _, callback) {
+ if (!cb) return callback();
+ iterator(x, function (v) {
+ if (cb && check(v)) {
+ cb(getResult(true, x));
+ cb = iterator = false;
+ }
+ callback();
+ });
+ }
+ if (arguments.length > 3) {
+ eachfn(arr, limit, iteratee, done);
+ } else {
+ cb = iterator;
+ iterator = limit;
+ eachfn(arr, iteratee, done);
+ }
+ };
+ }
+
+ async.any =
+ async.some = _createTester(async.eachOf, toBool, identity);
+
+ async.someLimit = _createTester(async.eachOfLimit, toBool, identity);
+
+ async.all =
+ async.every = _createTester(async.eachOf, notId, notId);
+
+ async.everyLimit = _createTester(async.eachOfLimit, notId, notId);
+
+ function _findGetResult(v, x) {
+ return x;
+ }
+ async.detect = _createTester(async.eachOf, identity, _findGetResult);
+ async.detectSeries = _createTester(async.eachOfSeries, identity, _findGetResult);
+ async.detectLimit = _createTester(async.eachOfLimit, identity, _findGetResult);
+
+ async.sortBy = function (arr, iterator, callback) {
+ async.map(arr, function (x, callback) {
+ iterator(x, function (err, criteria) {
+ if (err) {
+ callback(err);
+ }
+ else {
+ callback(null, {value: x, criteria: criteria});
+ }
+ });
+ }, function (err, results) {
+ if (err) {
+ return callback(err);
+ }
+ else {
+ callback(null, _map(results.sort(comparator), function (x) {
+ return x.value;
+ }));
+ }
+
+ });
+
+ function comparator(left, right) {
+ var a = left.criteria, b = right.criteria;
+ return a < b ? -1 : a > b ? 1 : 0;
+ }
+ };
+
+ async.auto = function (tasks, concurrency, callback) {
+ if (typeof arguments[1] === 'function') {
+ // concurrency is optional, shift the args.
+ callback = concurrency;
+ concurrency = null;
+ }
+ callback = _once(callback || noop);
+ var keys = _keys(tasks);
+ var remainingTasks = keys.length;
+ if (!remainingTasks) {
+ return callback(null);
+ }
+ if (!concurrency) {
+ concurrency = remainingTasks;
+ }
+
+ var results = {};
+ var runningTasks = 0;
+
+ var hasError = false;
+
+ var listeners = [];
+ function addListener(fn) {
+ listeners.unshift(fn);
+ }
+ function removeListener(fn) {
+ var idx = _indexOf(listeners, fn);
+ if (idx >= 0) listeners.splice(idx, 1);
+ }
+ function taskComplete() {
+ remainingTasks--;
+ _arrayEach(listeners.slice(0), function (fn) {
+ fn();
+ });
+ }
+
+ addListener(function () {
+ if (!remainingTasks) {
+ callback(null, results);
+ }
+ });
+
+ _arrayEach(keys, function (k) {
+ if (hasError) return;
+ var task = _isArray(tasks[k]) ? tasks[k]: [tasks[k]];
+ var taskCallback = _restParam(function(err, args) {
+ runningTasks--;
+ if (args.length <= 1) {
+ args = args[0];
+ }
+ if (err) {
+ var safeResults = {};
+ _forEachOf(results, function(val, rkey) {
+ safeResults[rkey] = val;
+ });
+ safeResults[k] = args;
+ hasError = true;
+
+ callback(err, safeResults);
+ }
+ else {
+ results[k] = args;
+ async.setImmediate(taskComplete);
+ }
+ });
+ var requires = task.slice(0, task.length - 1);
+ // prevent dead-locks
+ var len = requires.length;
+ var dep;
+ while (len--) {
+ if (!(dep = tasks[requires[len]])) {
+ throw new Error('Has nonexistent dependency in ' + requires.join(', '));
+ }
+ if (_isArray(dep) && _indexOf(dep, k) >= 0) {
+ throw new Error('Has cyclic dependencies');
+ }
+ }
+ function ready() {
+ return runningTasks < concurrency && _reduce(requires, function (a, x) {
+ return (a && results.hasOwnProperty(x));
+ }, true) && !results.hasOwnProperty(k);
+ }
+ if (ready()) {
+ runningTasks++;
+ task[task.length - 1](taskCallback, results);
+ }
+ else {
+ addListener(listener);
+ }
+ function listener() {
+ if (ready()) {
+ runningTasks++;
+ removeListener(listener);
+ task[task.length - 1](taskCallback, results);
+ }
+ }
+ });
+ };
+
+
+
+ async.retry = function(times, task, callback) {
+ var DEFAULT_TIMES = 5;
+ var DEFAULT_INTERVAL = 0;
+
+ var attempts = [];
+
+ var opts = {
+ times: DEFAULT_TIMES,
+ interval: DEFAULT_INTERVAL
+ };
+
+ function parseTimes(acc, t){
+ if(typeof t === 'number'){
+ acc.times = parseInt(t, 10) || DEFAULT_TIMES;
+ } else if(typeof t === 'object'){
+ acc.times = parseInt(t.times, 10) || DEFAULT_TIMES;
+ acc.interval = parseInt(t.interval, 10) || DEFAULT_INTERVAL;
+ } else {
+ throw new Error('Unsupported argument type for \'times\': ' + typeof t);
+ }
+ }
+
+ var length = arguments.length;
+ if (length < 1 || length > 3) {
+ throw new Error('Invalid arguments - must be either (task), (task, callback), (times, task) or (times, task, callback)');
+ } else if (length <= 2 && typeof times === 'function') {
+ callback = task;
+ task = times;
+ }
+ if (typeof times !== 'function') {
+ parseTimes(opts, times);
+ }
+ opts.callback = callback;
+ opts.task = task;
+
+ function wrappedTask(wrappedCallback, wrappedResults) {
+ function retryAttempt(task, finalAttempt) {
+ return function(seriesCallback) {
+ task(function(err, result){
+ seriesCallback(!err || finalAttempt, {err: err, result: result});
+ }, wrappedResults);
+ };
+ }
+
+ function retryInterval(interval){
+ return function(seriesCallback){
+ setTimeout(function(){
+ seriesCallback(null);
+ }, interval);
+ };
+ }
+
+ while (opts.times) {
+
+ var finalAttempt = !(opts.times-=1);
+ attempts.push(retryAttempt(opts.task, finalAttempt));
+ if(!finalAttempt && opts.interval > 0){
+ attempts.push(retryInterval(opts.interval));
+ }
+ }
+
+ async.series(attempts, function(done, data){
+ data = data[data.length - 1];
+ (wrappedCallback || opts.callback)(data.err, data.result);
+ });
+ }
+
+ // If a callback is passed, run this as a controll flow
+ return opts.callback ? wrappedTask() : wrappedTask;
+ };
+
+ async.waterfall = function (tasks, callback) {
+ callback = _once(callback || noop);
+ if (!_isArray(tasks)) {
+ var err = new Error('First argument to waterfall must be an array of functions');
+ return callback(err);
+ }
+ if (!tasks.length) {
+ return callback();
+ }
+ function wrapIterator(iterator) {
+ return _restParam(function (err, args) {
+ if (err) {
+ callback.apply(null, [err].concat(args));
+ }
+ else {
+ var next = iterator.next();
+ if (next) {
+ args.push(wrapIterator(next));
+ }
+ else {
+ args.push(callback);
+ }
+ ensureAsync(iterator).apply(null, args);
+ }
+ });
+ }
+ wrapIterator(async.iterator(tasks))();
+ };
+
+ function _parallel(eachfn, tasks, callback) {
+ callback = callback || noop;
+ var results = _isArrayLike(tasks) ? [] : {};
+
+ eachfn(tasks, function (task, key, callback) {
+ task(_restParam(function (err, args) {
+ if (args.length <= 1) {
+ args = args[0];
+ }
+ results[key] = args;
+ callback(err);
+ }));
+ }, function (err) {
+ callback(err, results);
+ });
+ }
+
+ async.parallel = function (tasks, callback) {
+ _parallel(async.eachOf, tasks, callback);
+ };
+
+ async.parallelLimit = function(tasks, limit, callback) {
+ _parallel(_eachOfLimit(limit), tasks, callback);
+ };
+
+ async.series = function(tasks, callback) {
+ _parallel(async.eachOfSeries, tasks, callback);
+ };
+
+ async.iterator = function (tasks) {
+ function makeCallback(index) {
+ function fn() {
+ if (tasks.length) {
+ tasks[index].apply(null, arguments);
+ }
+ return fn.next();
+ }
+ fn.next = function () {
+ return (index < tasks.length - 1) ? makeCallback(index + 1): null;
+ };
+ return fn;
+ }
+ return makeCallback(0);
+ };
+
+ async.apply = _restParam(function (fn, args) {
+ return _restParam(function (callArgs) {
+ return fn.apply(
+ null, args.concat(callArgs)
+ );
+ });
+ });
+
+ function _concat(eachfn, arr, fn, callback) {
+ var result = [];
+ eachfn(arr, function (x, index, cb) {
+ fn(x, function (err, y) {
+ result = result.concat(y || []);
+ cb(err);
+ });
+ }, function (err) {
+ callback(err, result);
+ });
+ }
+ async.concat = doParallel(_concat);
+ async.concatSeries = doSeries(_concat);
+
+ async.whilst = function (test, iterator, callback) {
+ callback = callback || noop;
+ if (test()) {
+ var next = _restParam(function(err, args) {
+ if (err) {
+ callback(err);
+ } else if (test.apply(this, args)) {
+ iterator(next);
+ } else {
+ callback.apply(null, [null].concat(args));
+ }
+ });
+ iterator(next);
+ } else {
+ callback(null);
+ }
+ };
+
+ async.doWhilst = function (iterator, test, callback) {
+ var calls = 0;
+ return async.whilst(function() {
+ return ++calls <= 1 || test.apply(this, arguments);
+ }, iterator, callback);
+ };
+
+ async.until = function (test, iterator, callback) {
+ return async.whilst(function() {
+ return !test.apply(this, arguments);
+ }, iterator, callback);
+ };
+
+ async.doUntil = function (iterator, test, callback) {
+ return async.doWhilst(iterator, function() {
+ return !test.apply(this, arguments);
+ }, callback);
+ };
+
+ async.during = function (test, iterator, callback) {
+ callback = callback || noop;
+
+ var next = _restParam(function(err, args) {
+ if (err) {
+ callback(err);
+ } else {
+ args.push(check);
+ test.apply(this, args);
+ }
+ });
+
+ var check = function(err, truth) {
+ if (err) {
+ callback(err);
+ } else if (truth) {
+ iterator(next);
+ } else {
+ callback(null);
+ }
+ };
+
+ test(check);
+ };
+
+ async.doDuring = function (iterator, test, callback) {
+ var calls = 0;
+ async.during(function(next) {
+ if (calls++ < 1) {
+ next(null, true);
+ } else {
+ test.apply(this, arguments);
+ }
+ }, iterator, callback);
+ };
+
+ function _queue(worker, concurrency, payload) {
+ if (concurrency == null) {
+ concurrency = 1;
+ }
+ else if(concurrency === 0) {
+ throw new Error('Concurrency must not be zero');
+ }
+ function _insert(q, data, pos, callback) {
+ if (callback != null && typeof callback !== "function") {
+ throw new Error("task callback must be a function");
+ }
+ q.started = true;
+ if (!_isArray(data)) {
+ data = [data];
+ }
+ if(data.length === 0 && q.idle()) {
+ // call drain immediately if there are no tasks
+ return async.setImmediate(function() {
+ q.drain();
+ });
+ }
+ _arrayEach(data, function(task) {
+ var item = {
+ data: task,
+ callback: callback || noop
+ };
+
+ if (pos) {
+ q.tasks.unshift(item);
+ } else {
+ q.tasks.push(item);
+ }
+
+ if (q.tasks.length === q.concurrency) {
+ q.saturated();
+ }
+ });
+ async.setImmediate(q.process);
+ }
+ function _next(q, tasks) {
+ return function(){
+ workers -= 1;
+
+ var removed = false;
+ var args = arguments;
+ _arrayEach(tasks, function (task) {
+ _arrayEach(workersList, function (worker, index) {
+ if (worker === task && !removed) {
+ workersList.splice(index, 1);
+ removed = true;
+ }
+ });
+
+ task.callback.apply(task, args);
+ });
+ if (q.tasks.length + workers === 0) {
+ q.drain();
+ }
+ q.process();
+ };
+ }
+
+ var workers = 0;
+ var workersList = [];
+ var q = {
+ tasks: [],
+ concurrency: concurrency,
+ payload: payload,
+ saturated: noop,
+ empty: noop,
+ drain: noop,
+ started: false,
+ paused: false,
+ push: function (data, callback) {
+ _insert(q, data, false, callback);
+ },
+ kill: function () {
+ q.drain = noop;
+ q.tasks = [];
+ },
+ unshift: function (data, callback) {
+ _insert(q, data, true, callback);
+ },
+ process: function () {
+ while(!q.paused && workers < q.concurrency && q.tasks.length){
+
+ var tasks = q.payload ?
+ q.tasks.splice(0, q.payload) :
+ q.tasks.splice(0, q.tasks.length);
+
+ var data = _map(tasks, function (task) {
+ return task.data;
+ });
+
+ if (q.tasks.length === 0) {
+ q.empty();
+ }
+ workers += 1;
+ workersList.push(tasks[0]);
+ var cb = only_once(_next(q, tasks));
+ worker(data, cb);
+ }
+ },
+ length: function () {
+ return q.tasks.length;
+ },
+ running: function () {
+ return workers;
+ },
+ workersList: function () {
+ return workersList;
+ },
+ idle: function() {
+ return q.tasks.length + workers === 0;
+ },
+ pause: function () {
+ q.paused = true;
+ },
+ resume: function () {
+ if (q.paused === false) { return; }
+ q.paused = false;
+ var resumeCount = Math.min(q.concurrency, q.tasks.length);
+ // Need to call q.process once per concurrent
+ // worker to preserve full concurrency after pause
+ for (var w = 1; w <= resumeCount; w++) {
+ async.setImmediate(q.process);
+ }
+ }
+ };
+ return q;
+ }
+
+ async.queue = function (worker, concurrency) {
+ var q = _queue(function (items, cb) {
+ worker(items[0], cb);
+ }, concurrency, 1);
+
+ return q;
+ };
+
+ async.priorityQueue = function (worker, concurrency) {
+
+ function _compareTasks(a, b){
+ return a.priority - b.priority;
+ }
+
+ function _binarySearch(sequence, item, compare) {
+ var beg = -1,
+ end = sequence.length - 1;
+ while (beg < end) {
+ var mid = beg + ((end - beg + 1) >>> 1);
+ if (compare(item, sequence[mid]) >= 0) {
+ beg = mid;
+ } else {
+ end = mid - 1;
+ }
+ }
+ return beg;
+ }
+
+ function _insert(q, data, priority, callback) {
+ if (callback != null && typeof callback !== "function") {
+ throw new Error("task callback must be a function");
+ }
+ q.started = true;
+ if (!_isArray(data)) {
+ data = [data];
+ }
+ if(data.length === 0) {
+ // call drain immediately if there are no tasks
+ return async.setImmediate(function() {
+ q.drain();
+ });
+ }
+ _arrayEach(data, function(task) {
+ var item = {
+ data: task,
+ priority: priority,
+ callback: typeof callback === 'function' ? callback : noop
+ };
+
+ q.tasks.splice(_binarySearch(q.tasks, item, _compareTasks) + 1, 0, item);
+
+ if (q.tasks.length === q.concurrency) {
+ q.saturated();
+ }
+ async.setImmediate(q.process);
+ });
+ }
+
+ // Start with a normal queue
+ var q = async.queue(worker, concurrency);
+
+ // Override push to accept second parameter representing priority
+ q.push = function (data, priority, callback) {
+ _insert(q, data, priority, callback);
+ };
+
+ // Remove unshift function
+ delete q.unshift;
+
+ return q;
+ };
+
+ async.cargo = function (worker, payload) {
+ return _queue(worker, 1, payload);
+ };
+
+ function _console_fn(name) {
+ return _restParam(function (fn, args) {
+ fn.apply(null, args.concat([_restParam(function (err, args) {
+ if (typeof console === 'object') {
+ if (err) {
+ if (console.error) {
+ console.error(err);
+ }
+ }
+ else if (console[name]) {
+ _arrayEach(args, function (x) {
+ console[name](x);
+ });
+ }
+ }
+ })]));
+ });
+ }
+ async.log = _console_fn('log');
+ async.dir = _console_fn('dir');
+ /*async.info = _console_fn('info');
+ async.warn = _console_fn('warn');
+ async.error = _console_fn('error');*/
+
+ async.memoize = function (fn, hasher) {
+ var memo = {};
+ var queues = {};
+ var has = Object.prototype.hasOwnProperty;
+ hasher = hasher || identity;
+ var memoized = _restParam(function memoized(args) {
+ var callback = args.pop();
+ var key = hasher.apply(null, args);
+ if (has.call(memo, key)) {
+ async.setImmediate(function () {
+ callback.apply(null, memo[key]);
+ });
+ }
+ else if (has.call(queues, key)) {
+ queues[key].push(callback);
+ }
+ else {
+ queues[key] = [callback];
+ fn.apply(null, args.concat([_restParam(function (args) {
+ memo[key] = args;
+ var q = queues[key];
+ delete queues[key];
+ for (var i = 0, l = q.length; i < l; i++) {
+ q[i].apply(null, args);
+ }
+ })]));
+ }
+ });
+ memoized.memo = memo;
+ memoized.unmemoized = fn;
+ return memoized;
+ };
+
+ async.unmemoize = function (fn) {
+ return function () {
+ return (fn.unmemoized || fn).apply(null, arguments);
+ };
+ };
+
+ function _times(mapper) {
+ return function (count, iterator, callback) {
+ mapper(_range(count), iterator, callback);
+ };
+ }
+
+ async.times = _times(async.map);
+ async.timesSeries = _times(async.mapSeries);
+ async.timesLimit = function (count, limit, iterator, callback) {
+ return async.mapLimit(_range(count), limit, iterator, callback);
+ };
+
+ async.seq = function (/* functions... */) {
+ var fns = arguments;
+ return _restParam(function (args) {
+ var that = this;
+
+ var callback = args[args.length - 1];
+ if (typeof callback == 'function') {
+ args.pop();
+ } else {
+ callback = noop;
+ }
+
+ async.reduce(fns, args, function (newargs, fn, cb) {
+ fn.apply(that, newargs.concat([_restParam(function (err, nextargs) {
+ cb(err, nextargs);
+ })]));
+ },
+ function (err, results) {
+ callback.apply(that, [err].concat(results));
+ });
+ });
+ };
+
+ async.compose = function (/* functions... */) {
+ return async.seq.apply(null, Array.prototype.reverse.call(arguments));
+ };
+
+
+ function _applyEach(eachfn) {
+ return _restParam(function(fns, args) {
+ var go = _restParam(function(args) {
+ var that = this;
+ var callback = args.pop();
+ return eachfn(fns, function (fn, _, cb) {
+ fn.apply(that, args.concat([cb]));
+ },
+ callback);
+ });
+ if (args.length) {
+ return go.apply(this, args);
+ }
+ else {
+ return go;
+ }
+ });
+ }
+
+ async.applyEach = _applyEach(async.eachOf);
+ async.applyEachSeries = _applyEach(async.eachOfSeries);
+
+
+ async.forever = function (fn, callback) {
+ var done = only_once(callback || noop);
+ var task = ensureAsync(fn);
+ function next(err) {
+ if (err) {
+ return done(err);
+ }
+ task(next);
+ }
+ next();
+ };
+
+ function ensureAsync(fn) {
+ return _restParam(function (args) {
+ var callback = args.pop();
+ args.push(function () {
+ var innerArgs = arguments;
+ if (sync) {
+ async.setImmediate(function () {
+ callback.apply(null, innerArgs);
+ });
+ } else {
+ callback.apply(null, innerArgs);
+ }
+ });
+ var sync = true;
+ fn.apply(this, args);
+ sync = false;
+ });
+ }
+
+ async.ensureAsync = ensureAsync;
+
+ async.constant = _restParam(function(values) {
+ var args = [null].concat(values);
+ return function (callback) {
+ return callback.apply(this, args);
+ };
+ });
+
+ async.wrapSync =
+ async.asyncify = function asyncify(func) {
+ return _restParam(function (args) {
+ var callback = args.pop();
+ var result;
+ try {
+ result = func.apply(this, args);
+ } catch (e) {
+ return callback(e);
+ }
+ // if result is Promise object
+ if (_isObject(result) && typeof result.then === "function") {
+ result.then(function(value) {
+ callback(null, value);
+ })["catch"](function(err) {
+ callback(err.message ? err : new Error(err));
+ });
+ } else {
+ callback(null, result);
+ }
+ });
+ };
+
+ // Node.js
+ if (typeof module === 'object' && module.exports) {
+ module.exports = async;
+ }
+ // AMD / RequireJS
+ else if (typeof define === 'function' && define.amd) {
+ define([], function () {
+ return async;
+ });
+ }
+ // included directly via <script> tag
+ else {
+ root.async = async;
+ }
+
+}());
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/mocha_test/compose.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/mocha_test/compose.js
new file mode 100644
index 00000000000..85306a5f77b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/mocha_test/compose.js
@@ -0,0 +1,86 @@
+var async = require('../lib/async');
+var expect = require('chai').expect;
+
+describe('compose', function(){
+ context('all functions succeed', function(){
+ it('yields the result of the composition of the functions', function(done){
+ var add2 = function (n, cb) {
+ setTimeout(function () {
+ cb(null, n + 2);
+ });
+ };
+ var mul3 = function (n, cb) {
+ setTimeout(function () {
+ cb(null, n * 3);
+ });
+ };
+ var add1 = function (n, cb) {
+ setTimeout(function () {
+ cb(null, n + 1);
+ });
+ };
+ var add2mul3add1 = async.compose(add1, mul3, add2);
+ add2mul3add1(3, function (err, result) {
+ expect(err).to.not.exist;
+ expect(result).to.eql(16);
+ done();
+ });
+ });
+ });
+
+ context('a function errors', function(){
+ it('yields the error and does not call later functions', function(done){
+ var add1called = false;
+ var mul3error = new Error('mul3 error');
+ var add2 = function (n, cb) {
+ setTimeout(function () {
+ cb(null, n + 2);
+ });
+ };
+ var mul3 = function (n, cb) {
+ setTimeout(function () {
+ cb(mul3error);
+ });
+ };
+ var add1 = function (n, cb) {
+ add1called = true;
+ setTimeout(function () {
+ cb(null, n + 1);
+ });
+ };
+ var add2mul3add1 = async.compose(add1, mul3, add2);
+ add2mul3add1(3, function (err, result) {
+ expect(err).to.eql(mul3error);
+ expect(result).to.not.exist;
+ expect(add1called).to.be.false;
+ done();
+ });
+ });
+ });
+
+ it('calls each function with the binding of the composed function', function(done){
+ var context = {};
+ var add2Context = null;
+ var mul3Context = null;
+ var add2 = function (n, cb) {
+ add2Context = this;
+ setTimeout(function () {
+ cb(null, n + 2);
+ });
+ };
+ var mul3 = function (n, cb) {
+ mul3Context = this;
+ setTimeout(function () {
+ cb(null, n * 3);
+ });
+ };
+ var add2mul3 = async.compose(mul3, add2);
+ add2mul3.call(context, 3, function (err, result) {
+ expect(err).to.not.exist;
+ expect(result).to.eql(15);
+ expect(add2Context).to.equal(context);
+ expect(mul3Context).to.equal(context);
+ done();
+ });
+ });
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/mocha_test/forever.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/mocha_test/forever.js
new file mode 100644
index 00000000000..970c42289b0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/mocha_test/forever.js
@@ -0,0 +1,44 @@
+var async = require('../lib/async');
+var expect = require('chai').expect;
+var isBrowser = require('./support/is_browser');
+
+describe('forever', function(){
+ context('function is asynchronous', function(){
+ it('executes the function over and over until it yields an error', function(done){
+ var counter = 0;
+ function addOne(callback) {
+ counter++;
+ if (counter === 50) {
+ return callback('too big!');
+ }
+ async.setImmediate(function () {
+ callback();
+ });
+ }
+ async.forever(addOne, function (err) {
+ expect(err).to.eql('too big!');
+ expect(counter).to.eql(50);
+ done();
+ });
+ });
+ });
+
+ context('function is synchronous', function(){
+ it('does not cause a stack overflow', function(done){
+ if (isBrowser()) return done(); // this will take forever in a browser
+ var counter = 0;
+ function addOne(callback) {
+ counter++;
+ if (counter === 50000) { // needs to be huge to potentially overflow stack in node
+ return callback('too big!');
+ }
+ callback();
+ }
+ async.forever(addOne, function (err) {
+ expect(err).to.eql('too big!');
+ expect(counter).to.eql(50000);
+ done();
+ });
+ });
+ });
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/mocha_test/support/is_browser.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/mocha_test/support/is_browser.js
new file mode 100644
index 00000000000..85e1522cedd
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/mocha_test/support/is_browser.js
@@ -0,0 +1,4 @@
+module.exports = function() {
+ return (typeof process === "undefined") ||
+ (process + "" !== "[object process]"); // browserify
+};
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/package.json
new file mode 100644
index 00000000000..11725e8de11
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/package.json
@@ -0,0 +1,85 @@
+{
+ "name": "async",
+ "description": "Higher-order functions and common patterns for asynchronous code",
+ "main": "lib/async.js",
+ "files": [
+ "lib",
+ "dist/async.js",
+ "dist/async.min.js"
+ ],
+ "author": "Caolan McMahon",
+ "version": "1.5.2",
+ "keywords": [
+ "async",
+ "callback",
+ "utility",
+ "module"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/caolan/async.git"
+ },
+ "bugs": {
+ "url": "https://github.com/caolan/async/issues"
+ },
+ "license": "MIT",
+ "devDependencies": {
+ "benchmark": "bestiejs/benchmark.js",
+ "bluebird": "^2.9.32",
+ "chai": "^3.1.0",
+ "coveralls": "^2.11.2",
+ "es6-promise": "^2.3.0",
+ "jscs": "^1.13.1",
+ "jshint": "~2.8.0",
+ "karma": "^0.13.2",
+ "karma-browserify": "^4.2.1",
+ "karma-firefox-launcher": "^0.1.6",
+ "karma-mocha": "^0.2.0",
+ "karma-mocha-reporter": "^1.0.2",
+ "lodash": "^3.9.0",
+ "mkdirp": "~0.5.1",
+ "mocha": "^2.2.5",
+ "native-promise-only": "^0.8.0-a",
+ "nodeunit": ">0.0.0",
+ "nyc": "^2.1.0",
+ "rsvp": "^3.0.18",
+ "semver": "^4.3.6",
+ "uglify-js": "~2.4.0",
+ "xyz": "^0.5.0",
+ "yargs": "~3.9.1"
+ },
+ "jam": {
+ "main": "lib/async.js",
+ "include": [
+ "lib/async.js",
+ "README.md",
+ "LICENSE"
+ ],
+ "categories": [
+ "Utilities"
+ ]
+ },
+ "scripts": {
+ "mocha-node-test": "mocha mocha_test/",
+ "mocha-browser-test": "karma start",
+ "mocha-test": "npm run mocha-node-test && npm run mocha-browser-test",
+ "nodeunit-test": "nodeunit test/test-async.js",
+ "test": "npm run-script lint && npm run nodeunit-test && npm run mocha-test",
+ "lint": "jshint lib/*.js test/*.js perf/*.js && jscs lib/*.js test/*.js perf/*.js",
+ "coverage": "nyc npm test && nyc report",
+ "coveralls": "nyc npm test && nyc report --reporter=text-lcov | coveralls"
+ },
+ "spm": {
+ "main": "lib/async.js"
+ },
+ "volo": {
+ "main": "lib/async.js",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests"
+ ]
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/perf/benchmark.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/perf/benchmark.js
new file mode 100755
index 00000000000..f75e05d475b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/perf/benchmark.js
@@ -0,0 +1,228 @@
+#!/usr/bin/env node
+
+var _ = require("lodash");
+var Benchmark = require("benchmark");
+var exec = require("child_process").exec;
+var execSync = require("child_process").execSync;
+var fs = require("fs");
+var path = require("path");
+var mkdirp = require("mkdirp");
+var async = require("../");
+var suiteConfigs = require("./suites");
+var semver = require("semver");
+
+var args = require("yargs")
+ .usage("Usage: $0 [options] [tag1] [tag2]")
+ .describe("g", "run only benchmarks whose names match this regex")
+ .alias("g", "grep")
+ .default("g", ".*")
+ .describe("i", "skip benchmarks whose names match this regex")
+ .alias("i", "reject")
+ .default("i", "^$")
+ .describe("l", "maximum running time per test (in seconds)")
+ .alias("l", "limit")
+ .default("l", 2)
+ .help("h")
+ .alias("h", "help")
+ .example("$0 0.9.2 0.9.0", "Compare v0.9.2 with v0.9.0")
+ .example("$0 0.9.2", "Compare v0.9.2 with the current working version")
+ .example("$0", "Compare the latest tag with the current working version")
+ .example("$0 -g each", "only run the each(), eachLimit() and " +
+ "eachSeries() benchmarks")
+ .example("")
+ .argv;
+
+var grep = new RegExp(args.g, "i");
+var reject = new RegExp(args.i, "i");
+
+function getLatestVersion() {
+ var tags = execSync("git tag");
+ var latest = _(tags).split("\n")
+ .compact()
+ .sort(semver.gt)
+ .last();
+ console.log("Latest tag is ", latest);
+ return latest;
+}
+
+var version0 = args._[0] || getLatestVersion();
+var version1 = args._[1] || "current";
+var versionNames = [version0, version1];
+var benchOptions = {defer: true, minSamples: 1, maxTime: +args.l};
+var versions;
+var wins = {};
+var totalTime = {};
+totalTime[version0] = wins[version0] = 0;
+totalTime[version1] = wins[version1] = 0;
+
+console.log("Comparing " + version0 + " with " + version1 +
+ " on Node " + process.version);
+console.log("--------------------------------------");
+
+
+async.eachSeries(versionNames, cloneVersion, function (err) {
+ if (err) { throw err; }
+ versions = versionNames.map(requireVersion);
+
+ var suites = suiteConfigs
+ .map(setDefaultOptions)
+ .reduce(handleMultipleArgs, [])
+ .map(setName)
+ .filter(matchesGrep)
+ .filter(doesNotMatch)
+ .map(createSuite);
+
+ async.eachSeries(suites, runSuite, function () {
+ var totalTime0 = +totalTime[version0].toPrecision(3);
+ var totalTime1 = +totalTime[version1].toPrecision(3);
+
+ var wins0 = wins[version0];
+ var wins1 = wins[version1];
+
+ if ( Math.abs((totalTime0 / totalTime1) - 1) < 0.01) {
+ // if < 1% difference, we're likely within the margins of error
+ console.log("Both versions are about equal " +
+ "(" + totalTime0 + "ms total vs. " + totalTime1 + "ms total)");
+ } else if (totalTime0 < totalTime1) {
+ console.log(version0 + " faster overall " +
+ "(" + totalTime0 + "ms total vs. " + totalTime1 + "ms total)");
+ } else if (totalTime1 < totalTime0) {
+ console.log(version1 + " faster overall " +
+ "(" + totalTime1 + "ms total vs. " + totalTime0 + "ms total)");
+ }
+
+ if (wins0 > wins1) {
+ console.log(version0 + " won more benchmarks " +
+ "(" + wins0 + " vs. " + wins1 + ")");
+ } else if (wins1 > wins0) {
+ console.log(version1 + " won more benchmarks " +
+ "(" + wins1 + " vs. " + wins0 + ")");
+ } else {
+ console.log("Both versions won the same number of benchmarks " +
+ "(" + wins0 + " vs. " + wins1 + ")");
+ }
+ });
+});
+
+function runSuite(suite, callback) {
+ suite.on("complete", function () {
+ callback();
+ }).run({async: true});
+}
+
+function setDefaultOptions(suiteConfig) {
+ suiteConfig.args = suiteConfig.args || [[]];
+ suiteConfig.setup = suiteConfig.setup || function () {};
+ return suiteConfig;
+}
+
+function handleMultipleArgs(list, suiteConfig) {
+ return list.concat(suiteConfig.args.map(function (args) {
+ return _.defaults({args: args}, suiteConfig);
+ }));
+}
+
+function setName(suiteConfig) {
+ suiteConfig.name = suiteConfig.name + "(" + suiteConfig.args.join(",") + ")";
+ return suiteConfig;
+}
+
+function matchesGrep(suiteConfig) {
+ return !!grep.exec(suiteConfig.name);
+}
+
+function doesNotMatch(suiteConfig) {
+ return !reject.exec(suiteConfig.name);
+}
+
+function createSuite(suiteConfig) {
+ var suite = new Benchmark.Suite();
+ var args = suiteConfig.args;
+ var errored = false;
+
+ function addBench(version, versionName) {
+ var name = suiteConfig.name + " " + versionName;
+
+ try {
+ suiteConfig.setup(1);
+ suiteConfig.fn(version, function () {});
+ } catch (e) {
+ console.error(name + " Errored");
+ errored = true;
+ return;
+ }
+
+ suite.add(name, function (deferred) {
+ suiteConfig.fn(version, function () {
+ deferred.resolve();
+ });
+ }, _.extend({
+ versionName: versionName,
+ setup: _.partial.apply(null, [suiteConfig.setup].concat(args)),
+ onError: function (err) {
+ console.log(err.stack);
+ }
+ }, benchOptions));
+ }
+
+ addBench(versions[0], versionNames[0]);
+ addBench(versions[1], versionNames[1]);
+
+
+ return suite.on('cycle', function(event) {
+ var mean = event.target.stats.mean * 1000;
+ console.log(event.target + ", " + mean.toPrecision(3) + "ms per run");
+ var version = event.target.options.versionName;
+ if (errored) return;
+ totalTime[version] += mean;
+ })
+ .on('error', function (err) { console.error(err); })
+ .on('complete', function() {
+ if (!errored) {
+ var fastest = this.filter('fastest');
+ if (fastest.length === 2) {
+ console.log("Tie");
+ } else {
+ var winner = fastest[0].options.versionName;
+ console.log(winner + ' is faster');
+ wins[winner]++;
+ }
+ }
+ console.log("--------------------------------------");
+ });
+
+}
+
+function requireVersion(tag) {
+ if (tag === "current") {
+ return async;
+ }
+
+ return require("./versions/" + tag + "/");
+}
+
+function cloneVersion(tag, callback) {
+ if (tag === "current") return callback();
+
+ var versionDir = __dirname + "/versions/" + tag;
+ mkdirp.sync(versionDir);
+ fs.open(versionDir + "/package.json", "r", function (err, handle) {
+ if (!err) {
+ // version has already been cloned
+ fs.close(handle);
+ return callback();
+ }
+
+ var repoPath = path.join(__dirname, "..");
+
+ var cmd = "git clone --branch " + tag + " " + repoPath + " " + versionDir;
+
+ exec(cmd, function (err) {
+ if (err) {
+ throw err;
+ }
+ callback();
+ });
+
+ });
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/perf/memory.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/perf/memory.js
new file mode 100644
index 00000000000..1a022af3576
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/perf/memory.js
@@ -0,0 +1,46 @@
+if (process.execArgv[0] !== "--expose-gc") {
+ console.error("please run with node --expose-gc");
+ process.exit(1);
+}
+
+var async = require("../");
+global.gc();
+var startMem = process.memoryUsage().heapUsed;
+
+function waterfallTest(cb) {
+ var functions = [];
+
+ for(var i = 0; i < 10000; i++) {
+ functions.push(function leaky(next) {
+ function func1(cb) {return cb(); }
+
+ function func2(callback) {
+ if (true) {
+ callback();
+ //return next(); // Should be callback here.
+ }
+ }
+
+ function func3(cb) {return cb(); }
+
+ async.waterfall([
+ func1,
+ func2,
+ func3
+ ], next);
+ });
+ }
+
+ async.parallel(functions, cb);
+}
+
+function reportMemory() {
+ global.gc();
+ var increase = process.memoryUsage().heapUsed - startMem;
+ console.log("memory increase: " +
+ (+(increase / 1024).toPrecision(3)) + "kB");
+}
+
+waterfallTest(function () {
+ setTimeout(reportMemory, 0);
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/perf/suites.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/perf/suites.js
new file mode 100644
index 00000000000..dd8392c3820
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/perf/suites.js
@@ -0,0 +1,297 @@
+var _ = require("lodash");
+var tasks;
+
+module.exports = [
+ {
+ name: "each",
+ // args lists are passed to the setup function
+ args: [[10], [300], [10000]],
+ setup: function(count) {
+ tasks = _.range(count);
+ },
+ fn: function (async, done) {
+ async.each(tasks, function (num, cb) {
+ async.setImmediate(cb);
+ }, done);
+ }
+ },
+ {
+ name: "eachSeries",
+ args: [[10], [300], [10000]],
+ setup: function(count) {
+ tasks = _.range(count);
+ },
+ fn: function (async, done) {
+ async.eachSeries(tasks, function (num, cb) {
+ async.setImmediate(cb);
+ }, done);
+ }
+ },
+ {
+ name: "eachLimit",
+ args: [[10], [300], [10000]],
+ setup: function(count) {
+ tasks = _.range(count);
+ },
+ fn: function (async, done) {
+ async.eachLimit(tasks, 4, function (num, cb) {
+ async.setImmediate(cb);
+ }, done);
+ }
+ },
+ {
+ name: "map",
+ // args lists are passed to the setup function
+ args: [[10], [300], [10000]],
+ setup: function(count) {
+ tasks = _.range(count);
+ },
+ fn: function (async, done) {
+ async.map(tasks, function (num, cb) {
+ async.setImmediate(cb);
+ }, done);
+ }
+ },
+ {
+ name: "mapSeries",
+ args: [[10], [300], [10000]],
+ setup: function(count) {
+ tasks = _.range(count);
+ },
+ fn: function (async, done) {
+ async.mapSeries(tasks, function (num, cb) {
+ async.setImmediate(cb);
+ }, done);
+ }
+ },
+ {
+ name: "mapLimit",
+ args: [[10], [300], [10000]],
+ setup: function(count) {
+ tasks = _.range(count);
+ },
+ fn: function (async, done) {
+ async.mapLimit(tasks, 4, function (num, cb) {
+ async.setImmediate(cb);
+ }, done);
+ }
+ },
+ {
+ name: "eachOf",
+ // args lists are passed to the setup function
+ args: [[10], [300], [10000]],
+ setup: function(count) {
+ tasks = _.range(count);
+ },
+ fn: function (async, done) {
+ async.eachOf(tasks, function (num, i, cb) {
+ async.setImmediate(cb);
+ }, done);
+ }
+ },
+ {
+ name: "eachOfSeries",
+ args: [[10], [300], [10000]],
+ setup: function(count) {
+ tasks = _.range(count);
+ },
+ fn: function (async, done) {
+ async.eachOfSeries(tasks, function (num, i, cb) {
+ async.setImmediate(cb);
+ }, done);
+ }
+ },
+ {
+ name: "eachOfLimit",
+ args: [[10], [300], [10000]],
+ setup: function(count) {
+ tasks = _.range(count);
+ },
+ fn: function (async, done) {
+ async.eachOfLimit(tasks, 4, function (num, i, cb) {
+ async.setImmediate(cb);
+ }, done);
+ }
+ },
+ {
+ name: "parallel",
+ args: [[10], [100], [1000]],
+ setup: function (count) {
+ tasks = _.range(count).map(function () {
+ return function (cb) {
+ setImmediate(cb);
+ };
+ });
+ },
+ fn: function (async, done) {
+ async.parallel(tasks, done);
+ }
+ },
+ {
+ name: "series",
+ args: [[10], [100], [1000]],
+ setup: function (count) {
+ tasks = _.range(count).map(function () {
+ return function (cb) { setImmediate(cb); };
+ });
+ },
+ fn: function (async, done) {
+ async.series(tasks, done);
+ }
+ },
+ {
+ name: "waterfall",
+ args: [[10], [100], [1000]],
+ setup: function (count) {
+ tasks = [
+ function (cb) {
+ return cb(null, 1);
+ }
+ ].concat(_.range(count).map(function (i) {
+ return function (arg, cb) {
+ setImmediate(function () {
+ cb(null, i);
+ });
+ };
+ }));
+ },
+ fn: function (async, done) {
+ async.waterfall(tasks, done);
+ }
+ },
+ {
+ name: "queue",
+ args: [[1000], [30000], [100000], [200000]],
+ setup: function (count) {
+ tasks = count;
+ },
+ fn: function (async, done) {
+ var numEntries = tasks;
+ var q = async.queue(worker, 1);
+ for (var i = 1; i <= numEntries; i++) {
+ q.push({num: i});
+ }
+ function worker(task, callback) {
+ if (task.num === numEntries) {
+ return done();
+ }
+ setImmediate(callback);
+ }
+ }
+ },
+ {
+ name: "some - no short circuit- false",
+ // args lists are passed to the setup function
+ args: [[500]],
+ setup: function(count) {
+ tasks = _.range(count);
+ },
+ fn: function (async, done) {
+ async.some(tasks, function(i, cb) {
+ async.setImmediate(function() {
+ cb(i >= 600);
+ });
+ }, done);
+ }
+ },
+ {
+ name: "some - short circuit - true",
+ // args lists are passed to the setup function
+ args: [[500]],
+ setup: function(count) {
+ tasks = _.range(count);
+ },
+ fn: function (async, done) {
+ async.some(tasks, function(i, cb) {
+ async.setImmediate(function() {
+ cb(i >= 60);
+ });
+ }, done);
+ }
+ },
+ {
+ name: "every - no short circuit- true",
+ // args lists are passed to the setup function
+ args: [[500]],
+ setup: function(count) {
+ tasks = _.range(count);
+ },
+ fn: function (async, done) {
+ async.every(tasks, function(i, cb) {
+ async.setImmediate(function() {
+ cb(i <= 600);
+ });
+ }, done);
+ }
+ },
+ {
+ name: "every - short circuit - false",
+ // args lists are passed to the setup function
+ args: [[500]],
+ setup: function(count) {
+ tasks = _.range(count);
+ },
+ fn: function (async, done) {
+ async.every(tasks, function(i, cb) {
+ async.setImmediate(function() {
+ cb(i <= 60);
+ });
+ }, done);
+ }
+ },
+ {
+ name: "defer nextTick",
+ fn: function (async, done) {
+ process.nextTick(done);
+ }
+ },
+ {
+ name: "defer setImmediate",
+ fn: function (async, done) {
+ setImmediate(done);
+ }
+ },
+ {
+ name: "defer async.nextTick",
+ fn: function (async, done) {
+ async.nextTick(done);
+ }
+ },
+ {
+ name: "defer async.setImmediate",
+ fn: function (async, done) {
+ async.setImmediate(done);
+ }
+ },
+ {
+ name: "defer setTimeout",
+ fn: function (async, done) {
+ setTimeout(done, 0);
+ }
+ },
+ {
+ name: "ensureAsync sync",
+ fn: function (async, done) {
+ async.ensureAsync(function (cb) {
+ cb();
+ })(done);
+ }
+ },
+ {
+ name: "ensureAsync async",
+ fn: function (async, done) {
+ async.ensureAsync(function (cb) {
+ setImmediate(cb);
+ })(done);
+ }
+ },
+ {
+ name: "ensureAsync async noWrap",
+ fn: function (async, done) {
+ (function (cb) {
+ setImmediate(cb);
+ }(done));
+ }
+ }
+];
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/async/support/sync-package-managers.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/support/sync-package-managers.js
new file mode 100755
index 00000000000..28c22e9f91c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/async/support/sync-package-managers.js
@@ -0,0 +1,53 @@
+#!/usr/bin/env node
+
+// This should probably be its own module but complaints about bower/etc.
+// support keep coming up and I'd rather just enable the workflow here for now
+// and figure out where this should live later. -- @beaugunderson
+
+var fs = require('fs');
+var _ = require('lodash');
+
+var packageJson = require('../package.json');
+
+var IGNORES = ['**/.*', 'node_modules', 'bower_components', 'test', 'tests'];
+var INCLUDES = ['lib/async.js', 'README.md', 'LICENSE'];
+var REPOSITORY_NAME = 'caolan/async';
+
+packageJson.jam = {
+ main: packageJson.main,
+ include: INCLUDES,
+ categories: ['Utilities']
+};
+
+packageJson.spm = {
+ main: packageJson.main
+};
+
+packageJson.volo = {
+ main: packageJson.main,
+ ignore: IGNORES
+};
+
+var bowerSpecific = {
+ moduleType: ['amd', 'globals', 'node'],
+ ignore: IGNORES,
+ authors: [packageJson.author]
+};
+
+var bowerInclude = ['name', 'description', 'main', 'keywords',
+ 'license', 'homepage', 'repository', 'devDependencies'];
+
+var componentSpecific = {
+ repository: REPOSITORY_NAME,
+ scripts: [packageJson.main]
+};
+
+var componentInclude = ['name', 'description', 'version', 'keywords',
+ 'license', 'main'];
+
+var bowerJson = _.merge({}, _.pick(packageJson, bowerInclude), bowerSpecific);
+var componentJson = _.merge({}, _.pick(packageJson, componentInclude), componentSpecific);
+
+fs.writeFileSync('./bower.json', JSON.stringify(bowerJson, null, 2));
+fs.writeFileSync('./component.json', JSON.stringify(componentJson, null, 2));
+fs.writeFileSync('./package.json', JSON.stringify(packageJson, null, 2));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/.bower.json
new file mode 100644
index 00000000000..ed4bb733dd8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/.bower.json
@@ -0,0 +1,37 @@
+{
+ "name": "chai",
+ "description": "BDD/TDD assertion library for node.js and the browser. Test framework agnostic.",
+ "license": "MIT",
+ "keywords": [
+ "test",
+ "assertion",
+ "assert",
+ "testing",
+ "chai"
+ ],
+ "main": "chai.js",
+ "ignore": [
+ "build",
+ "components",
+ "lib",
+ "node_modules",
+ "support",
+ "test",
+ "index.js",
+ "Makefile",
+ ".*"
+ ],
+ "dependencies": {},
+ "devDependencies": {},
+ "homepage": "https://github.com/chaijs/chai",
+ "version": "3.5.0",
+ "_release": "3.5.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "3.5.0",
+ "commit": "57c85f624a7e19ffaf1a2c7d07d81180db17bec7"
+ },
+ "_source": "https://github.com/chaijs/chai.git",
+ "_target": "^3.2.0",
+ "_originalSource": "chai"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/CODE_OF_CONDUCT.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/CODE_OF_CONDUCT.md
new file mode 100644
index 00000000000..5194527f26e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/CODE_OF_CONDUCT.md
@@ -0,0 +1,58 @@
+# Contributor Code of Conduct
+
+> Read in: [Español](http://contributor-covenant.org/version/1/3/0/es/) |
+[Français](http://contributor-covenant.org/version/1/3/0/fr/) |
+[Italiano](http://contributor-covenant.org/version/1/3/0/it/) |
+[Magyar](http://contributor-covenant.org/version/1/3/0/hu/) |
+[Polskie](http://contributor-covenant.org/version/1/3/0/pl/) |
+[Português](http://contributor-covenant.org/version/1/3/0/pt/) |
+[Português do Brasil](http://contributor-covenant.org/version/1/3/0/pt_br/)
+
+As contributors and maintainers of this project, and in the interest of
+fostering an open and welcoming community, we pledge to respect all people who
+contribute through reporting issues, posting feature requests, updating
+documentation, submitting pull requests or patches, and other activities.
+
+We are committed to making participation in this project a harassment-free
+experience for everyone, regardless of level of experience, gender, gender
+identity and expression, sexual orientation, disability, personal appearance,
+body size, race, ethnicity, age, religion, or nationality.
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery
+* Personal attacks
+* Trolling or insulting/derogatory comments
+* Public or private harassment
+* Publishing other's private information, such as physical or electronic
+ addresses, without explicit permission
+* Other unethical or unprofessional conduct
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+By adopting this Code of Conduct, project maintainers commit themselves to
+fairly and consistently applying these principles to every aspect of managing
+this project. Project maintainers who do not follow or enforce the Code of
+Conduct may be permanently removed from the project team.
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community.
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting a project maintainer at [INSERT EMAIL ADDRESS]. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. Maintainers are
+obligated to maintain confidentiality with regard to the reporter of an
+incident.
+
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 1.3.0, available at
+[http://contributor-covenant.org/version/1/3/0/][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/3/0/
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/CONTRIBUTING.md
new file mode 100644
index 00000000000..8de9ba8eed1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/CONTRIBUTING.md
@@ -0,0 +1,214 @@
+# Chai Contribution Guidelines
+
+We like to encourage you to contribute to the Chai.js repository. This should be as easy as possible for you but there are a few things to consider when contributing. The following guidelines for contribution should be followed if you want to submit a pull request or open an issue.
+
+Following these guidelines helps to communicate that you respect the time of the developers managing and developing this open source project. In return, they should reciprocate that respect in addressing your issue or assessing patches and features.
+
+#### Table of Contents
+
+- [TLDR;](#tldr)
+- [Contributing](#contributing)
+ - [Bug Reports](#bugs)
+ - [Feature Requests](#features)
+ - [Pull Requests](#pull-requests)
+- [Releasing](#releasing)
+- [Support](#support)
+ - [Resources](#resources)
+ - [Core Contributors](#contributors)
+
+<a name="tldr"></a>
+## TLDR;
+
+- Creating an Issue or Pull Request requires a [GitHub](http://github.com) account.
+- Issue reports should be **clear**, **concise** and **reproducible**. Check to see if your issue has already been resolved in the [master]() branch or already reported in Chai's [GitHub Issue Tracker](https://github.com/chaijs/chai/issues).
+- Pull Requests must adhere to strict [coding style guidelines](https://github.com/chaijs/chai/wiki/Chai-Coding-Style-Guide).
+- In general, avoid submitting PRs for new Assertions without asking core contributors first. More than likely it would be better implemented as a plugin.
+- Additional support is available via the [Google Group](http://groups.google.com/group/chaijs) or on irc.freenode.net#chaijs.
+- **IMPORTANT**: By submitting a patch, you agree to allow the project owner to license your work under the same license as that used by the project.
+
+
+
+<a name="contributing"></a>
+## Contributing
+
+The issue tracker is the preferred channel for [bug reports](#bugs),
+[feature requests](#features) and [submitting pull
+requests](#pull-requests), but please respect the following restrictions:
+
+* Please **do not** use the issue tracker for personal support requests (use
+ [Google Group](https://groups.google.com/forum/#!forum/chaijs) or IRC).
+* Please **do not** derail or troll issues. Keep the discussion on topic and
+ respect the opinions of others
+
+<a name="bugs"></a>
+### Bug Reports
+
+A bug is a **demonstrable problem** that is caused by the code in the repository.
+
+Guidelines for bug reports:
+
+1. **Use the GitHub issue search** &mdash; check if the issue has already been reported.
+2. **Check if the issue has been fixed** &mdash; try to reproduce it using the latest `master` or development branch in the repository.
+3. **Isolate the problem** &mdash; create a test case to demonstrate your issue. Provide either a repo, gist, or code sample to demonstrate you problem.
+
+A good bug report shouldn't leave others needing to chase you up for more information. Please try to be as detailed as possible in your report. What is your environment? What steps will reproduce the issue? What browser(s) and/or Node.js versions experience the problem? What would you expect to be the outcome? All these details will help people to fix any potential bugs.
+
+Example:
+
+> Short and descriptive example bug report title
+>
+> A summary of the issue and the browser/OS environment in which it occurs. If suitable, include the steps required to reproduce the bug.
+>
+> 1. This is the first step
+> 2. This is the second step
+> 3. Further steps, etc.
+>
+> `<url>` - a link to the reduced test case OR
+> ```js
+> expect(a).to.equal('a');
+> // code sample
+> ```
+>
+> Any other information you want to share that is relevant to the issue being reported. This might include the lines of code that you have identified as causing the bug, and potential solutions (and your opinions on their merits).
+
+<a name="features"></a>
+### Feature Requests
+
+Feature requests are welcome. But take a moment to find out whether your idea fits with the scope and aims of the project. It's up to *you* to make a strong case to convince the project's developers of the merits of this feature. Please provide as much detail and context as possible.
+
+Furthermore, since Chai.js has a [robust plugin API](http://chaijs.com/guide/plugins/), we encourage you to publish **new Assertions** as plugins. If your feature is an enhancement to an **existing Assertion**, please propose your changes as an issue prior to opening a pull request. If the core Chai.js contributors feel your plugin would be better suited as a core assertion, they will invite you to open a PR in [chaijs/chai](https://github.com/chaijs/chai).
+
+<a name="pull-requests"></a>
+### Pull Requests
+
+- PRs for new core-assertions are advised against.
+- PRs for core-assertion bug fixes are always welcome.
+- PRs for enhancing the interfaces are always welcome.
+- PRs that increase test coverage are always welcome.
+- PRs are scrutinized for coding-style.
+
+Good pull requests - patches, improvements, new features - are a fantastic help. They should remain focused in scope and avoid containing unrelated commits.
+
+**Please ask first** before embarking on any significant pull request (e.g. implementing features, refactoring code), otherwise you risk spending a lot of time working on something that the project's developers might not want to merge into the project.
+
+Please adhere to the coding conventions used throughout a project (indentation, accurate comments, etc.) and any other requirements (such as test coverage). Please review the [Chai.js Coding Style Guide](https://github.com/chaijs/chai/wiki/Chai-Coding-Style-Guide).
+
+Follow this process if you'd like your work considered for inclusion in the project:
+
+1. [Fork](http://help.github.com/fork-a-repo/) the project, clone your fork, and configure the remotes:
+
+```bash
+# Clone your fork of the repo into the current directory
+git clone https://github.com/<your-username>/<repo-name>
+# Navigate to the newly cloned directory
+cd <repo-name>
+# Assign the original repo to a remote called "upstream"
+git remote add upstream https://github.com/<upstream-owner>/<repo-name>
+```
+
+2. If you cloned a while ago, get the latest changes from upstream:
+
+```bash
+git checkout <dev-branch>
+git pull upstream <dev-branch>
+```
+
+3. Create a new topic branch (off the main project development branch) to contain your feature, change, or fix:
+
+```bash
+git checkout -b <topic-branch-name>
+```
+
+4. Commit your changes in logical chunks. Use Git's [interactive rebase](https://help.github.com/articles/interactive-rebase) feature to tidy up your commits before making them public.
+
+5. Run you code to make sure it works. If you're still having problems please try to run `make clean` and then test your code again.
+
+```bash
+npm test
+# when finished running tests...
+git checkout chai.js
+```
+
+6. Locally merge (or rebase) the upstream development branch into your topic branch:
+
+```bash
+git pull [--rebase] upstream <dev-branch>
+```
+
+7. Push your topic branch up to your fork:
+
+```bash
+git push origin <topic-branch-name>
+```
+
+8. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/) with a clear title and description.
+
+**IMPORTANT**: By submitting a patch, you agree to allow the project owner to license your work under the same license as that used by the project.
+
+<a name="releasing"></a>
+## Releasing
+
+Releases can be **prepared** by anyone with access to the code.
+
+Simply run `make release-major`, `make release-minor`, or `make-release-patch`
+and it will automatically do the following:
+
+ - Build chai.js
+ - Bump the version numbers accross the project
+ - Make a commit within git
+
+All you need to do is push the commit up and make a pull request, one of the core contributors will merge it and publish a release.
+
+### Publishing a Release
+
+Anyone who is a core contributor (see the [Core Contributors Heading in the Readme](https://github.com/chaijs/chai#core-contributors)) can publish a release:
+
+1. Go to te [Releases page on Github](https://github.com/chaijs/chai/releases)
+2. Hit "Draft a new release" (if you can't see this, you're not a core contributor!)
+3. Write human-friendly Release Notes based on changelog.
+ - The release title is "x.x.x / YYYY-MM-DD" (where x.x.x is the version number)
+ - If breaking changes, write migration tutorial(s) and reasoning.
+ - Callouts for community contributions (PRs) with links to PR and contributing user.
+ - Callouts for other fixes made by core contributors with links to issue.
+4. Hit "Save Draft" and get other core contributors to check your work, or alternatively hit "Publish release"
+5. That's it!
+
+<a name="support"></a>
+## Support
+
+<a name="resources"></a>
+### Resources
+
+For most of the documentation you are going to want to visit [ChaiJS.com](http://chaijs.com).
+
+- [Getting Started Guide](http://chaijs.com/guide/)
+- [API Reference](http://chaijs.com/api/)
+- [Plugins](http://chaijs.com/plugins/)
+
+Alternatively, the [wiki](https://github.com/chaijs/chai/wiki) might be what you are looking for.
+
+- [Chai Coding Style Guide](https://github.com/chaijs/chai/wiki/Chai-Coding-Style-Guide)
+- [Third-party Resources](https://github.com/chaijs/chai/wiki/Third-Party-Resources)
+
+Or finally, you may find a core-contributor or like-minded developer in any of our support channels.
+
+- IRC: irc.freenode.org #chaijs
+- [Mailing List / Google Group](https://groups.google.com/forum/#!forum/chaijs)
+
+<a name="contributors"></a>
+### Core Contributors
+
+Feel free to reach out to any of the core-contributors with you questions or concerns. We will do our best to respond in a timely manner.
+
+- Jake Luer
+ - GH: [@logicalparadox](https://github.com/logicalparadox)
+ - TW: [@jakeluer](http://twitter.com/jakeluer)
+ - IRC: logicalparadox
+- Veselin Todorov
+ - GH: [@vesln](https://github.com/vesln/)
+ - TW: [@vesln](http://twitter.com/vesln)
+ - IRC: vesln
+- Keith Cirkel
+ - GH: [@keithamus](https://github.com/keithamus)
+ - TW: [@keithamus](http://twitter.com/keithamus)
+ - IRC: keithamus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/History.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/History.md
new file mode 100644
index 00000000000..ae4d323e7da
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/History.md
@@ -0,0 +1,1059 @@
+### Note
+
+As of 3.0.0, the History.md file has been deprecated. [Please refer to the full
+commit logs available on GitHub](https://github.com/chaijs/chai/commits/master).
+
+---
+
+2.3.0 / 2015-04-26
+==================
+
+ * Merge pull request #423 from ehntoo/patch-1
+ * Merge pull request #422 from ljharb/fix_descriptor_tests
+ * Fix a small bug in the .null assertion docs
+ * Use a regex to account for property ordering issues across engines.
+ * Add `make test-firefox`
+ * Merge pull request #417 from astorije/astorije/minimalist-typo
+ * Remove trailing whitespaces
+ * Fix super minor typo in an example
+ * Merge pull request #408 from ljharb/enumerableProperty
+ * Add `ownPropertyDescriptor` assertion.
+
+2.2.0 / 2015-03-26
+==================
+
+ * Merge pull request #405 from chaijs/deep-escape-doc-tweaks
+ * Tweak documentation on `.deep` flag.
+ * Merge pull request #402 from umireon/escaping-dot-should-be-taken
+ * Documentation of escaping in `.deep` flag.
+ * take regular expression apart
+ * Feature: backslash-escaping in `.deep.property`
+ * Escaping dot should be taken in deep property
+
+2.1.2 / 2015-03-15
+==================
+
+ * Merge pull request #396 from chaijs/add-keith-cirkel-contributing-md
+ * Add Keith Cirkel to CONTRIBUTING.md
+ * Merge pull request #395 from cjqed/386-assert-operator-no-eval
+ * No longer using eval on assert operator #386
+ * Merge pull request #389 from chaijs/update-git-summary
+ * Update `git summary` in README
+
+2.1.1 / 2015-03-04
+==================
+
+ * Merge pull request #385 from eldritch-fossicker/master
+ * updates to reflect code style preference from @keithamus
+ * fix indexing into array with deep propery
+ * Merge pull request #382 from astorije/patch-2
+ * Merge pull request #383 from gurdiga/config-doc-wording-improvement
+ * config.truncateThreshold docs: simpler wording
+ * Add missing docstring for showDiff argument of assert
+ * Merge pull request #381 from astorije/patch-1
+ * Add a minor precision that empty asserts on strings too.
+ * Merge pull request #379 from dcneiner/should-primitive-fix
+ * Primitives now use valueOf in shouldGetter
+
+2.1.0 / 2015-02-23
+==================
+
+ * Merge pull request #374 from jmm/v2.0.1
+ * Increment version to 2.0.1.
+ * Merge pull request #365 from chaijs/fix-travis
+ * Fix travis.yml deploy
+ * Merge pull request #356 from Soviut/master
+ * documented fail methods for expect and should interfaces
+ * fail method added directly to expect
+
+2.0.0 / 2015-02-09
+==================
+
+ * Merge pull request #361 from gregglind/b265-keys-object
+ * fix #359. Add `.keys(object)`
+ * Merge pull request #359 from gregglind/b359-unexpected-keys-sort
+ * Fix #359 keys() sorts input unexpectedly
+ * contrib: publish release strategy and travis npm creds #337
+ * Merge pull request #357 from danilovaz/master
+ * Update copyright date
+ * Merge pull request #349 from toastynerd/add-which-chain-method
+ * add the which chain method as per issue #347
+ * Merge pull request #333 from cmpolis/change-assertions
+ * more `by` cleanup
+ * cleaned out `.by` for #333
+ * Merge pull request #335 from DingoEatingFuzz/expose-util
+ * Expose chai util through the chai object
+ * cleanup (per notes on pr #333)
+ * updated `change` to work w/ non-number values + tests
+ * Merge pull request #334 from hurrymaplelad/patch-1
+ * Typo, the flag is called 'contains' with an 's'
+ * updated assertion interface with `change` (#330)
+ * added `change`,`increase`,`decrease` assertions (#330)
+ * assert tests for `change`,`increase`,`decrease`
+ * expect/should tests for `change`,`increase`,`decrease`
+ * Merge pull request #328 from lo1tuma/issue-327
+ * Add includes and contains alias (fixes #327)
+ * Merge pull request #325 from chasenlehara/overwriteChainableMethodDocs
+ * Fix docs for overwriteChainableMethod parameters
+ * Merge pull request #317 from jasonkarns/patch-2
+ * Merge pull request #318 from jasonkarns/patch-3
+ * Merge pull request #316 from jasonkarns/patch-1
+ * typos in docs
+ * minor docs typo
+ * update docs: getAllFlags -> transferFlags
+ * Merge pull request #313 from cjqed/254-expect-any-all
+ * Added the all and any flags for keys assertion, with all being the default behavior
+ * Merge pull request #312 from cjqed/291-assert-same-deep-members
+ * Changed public comment of sameDeepMemebers to be more clear
+ * Fixes issue #291, adds assert.sameDeepMembers
+ * Merge pull request #311 from cjqed/305-above-below-on-assert
+ * Merge pull request #308 from prodatakey/hasproperty
+ * Issue #305 fixed, added assert.isAbove and assert.isBelow
+ * Fix typo
+ * More unit tests for new utility functions
+ * Refactor common functionality, document, test
+ * Refactor if statement out
+ * Small unit test fix
+ * Handle array indexing terminating paths
+ * Merge pull request #309 from ericdouglas/iterableEqual-couting-once
+ * couting variables just once
+ * Fix properties with `undefined` value pass property assertion
+ * Merge pull request #306 from chaijs/revert-297-noopchainfunc
+ * Revert "Allows writing lint-friendly tests"
+
+1.10.0 / 2014-11-10
+==================
+
+ * Merge pull request #297 from prodatakey/noopchainfunc
+ * Merge pull request #300 from julienw/299-fix-getMessage-test
+ * Fix #299: the test is defining global variables
+ * Add a couple more unit tests
+ * Add unit tests for chained terminating property asserts
+ * Revise documentation wording
+ * Add docs for function style NOOP asserts
+ * Make the NOOP function a shared constant
+ * Merge pull request #298 from dasilvacontin/negativeZeroLogging
+ * why not more assertions
+ * added test for inspecting `-0`
+ * a more readable/simple condition statement, as pointed out by @keithamus
+ * added check for logging negative zero
+ * Change test to not trigger argument bug
+ * Allows writing lint-friendly tests
+ * readme: update contributors for 1.9.2
+
+1.9.2 / 2014-09-29
+==================
+
+ * Merge pull request #268 from charlierudolph/cr-lazyMessages
+ * Merge pull request #269 from charlierudolph/cr-codeCleanup
+ * Merge pull request #277 from charlierudolph/fix-doc
+ * Merge pull request #279 from mohayonao/fix-closeTo
+ * Merge pull request #292 from boneskull/mocha
+ * resolves #255: upgrade mocha
+ * Merge pull request #289 from charlierudolph/cr-dryUpCode
+ * Dry up code
+ * Merge pull request #275 from DrRataplan/master
+ * assert: .closeTo() verify value's type before assertion
+ * Rewrite pretty-printing HTML elements to prevent throwing internal errors Fixes errors occuring when using a non-native DOM implementation
+ * Fix assert documentation
+ * Remove unused argument
+ * Allow messages to be functions
+ * Merge pull request #267 from shinnn/master
+ * Use SVG badge
+ * Merge pull request #264 from cjthompson/keys_diff
+ * Show diff for keys assertion
+
+1.9.1 / 2014-03-19
+==================
+
+ * deps update
+ * util: [getActual] select actual logic now allows undefined for actual. Closes #183
+ * docs: [config] make public, express param type
+ * Merge pull request #251 from romario333/threshold3
+ * Fix issue #166 - configurable threshold in objDisplay.
+ * Move configuration options to config.js.
+ * Merge pull request #233 from Empeeric/master
+ * Merge pull request #244 from leider/fix_for_contains
+ * Merge pull request #247 from didoarellano/typo-fixes
+ * Fix typos
+ * Merge pull request #245 from lfac-pt/patch-1
+ * Update `exports.version` to 1.9.0
+ * aborting loop on finding
+ * declaring variable only once
+ * additional test finds incomplete implementation
+ * simplified code
+ * fixing #239 (without changing chai.js)
+ * ssfi as it should be
+ * Merge pull request #228 from duncanbeevers/deep_members
+ * Deep equality check for collection membership
+
+1.9.0 / 2014-01-29
+==================
+
+ * docs: add contributing.md #238
+ * assert: .throws() returns thrown error. Closes #185
+ * Merge pull request #232 from laconbass/assert-throws
+ * assert: .fail() parameter mismatch. Closes #206
+ * Merge branch 'karma-fixes'
+ * Add karma phantomjs launcher
+ * Use latest karma and sauce launcher
+ * Karma tweaks
+ * Merge pull request #230 from jkroso/include
+ * Merge pull request #237 from chaijs/coverage
+ * Add coverage to npmignore
+ * Remove lib-cov from test-travisci dependents
+ * Remove the not longer needed lcov reporter
+ * Test coverage with istanbul
+ * Remove jscoverage
+ * Remove coveralls
+ * Merge pull request #226 from duncanbeevers/add_has
+ * Avoid error instantiation if possible on assert.throws
+ * Merge pull request #231 from duncanbeevers/update_copyright_year
+ * Update Copyright notices to 2014
+ * handle negation correctly
+ * add failing test case
+ * support `{a:1,b:2}.should.include({a:1})`
+ * Merge pull request #224 from vbardales/master
+ * Add `has` to language chains
+ * Merge pull request #219 from demands/overwrite_chainable
+ * return error on throw method to chain on error properties, possibly different from message
+ * util: store chainable behavior in a __methods object on ctx
+ * util: code style fix
+ * util: add overwriteChainableMethod utility (for #215)
+ * Merge pull request #217 from demands/test_cleanup
+ * test: make it possible to run utilities tests with --watch
+ * makefile: change location of karma-runner bin script
+ * Merge pull request #202 from andreineculau/patch-2
+ * test: add tests for throwing custom errors
+ * Merge pull request #201 from andreineculau/patch-1
+ * test: updated for the new assertion errors
+ * core: improve message for assertion errors (throw assertion)
+
+1.8.1 / 2013-10-10
+==================
+
+ * pkg: update deep-eql version
+
+1.8.0 / 2013-09-18
+==================
+
+ * test: [sauce] add a few more browsers
+ * Merge branch 'refactor/deep-equal'
+ * util: remove embedded deep equal utility
+ * util: replace embedded deep equal with external module
+ * Merge branch 'feature/karma'
+ * docs: add sauce badge to readme [ci skip]
+ * test: [sauce] use karma@canary to prevent timeouts
+ * travis: only run on node 0.10
+ * test: [karma] use karma phantomjs runner
+ * Merge pull request #181 from tricknotes/fix-highlight
+ * Fix highlight for example code
+
+1.7.2 / 2013-06-27
+==================
+
+ * coverage: add coveralls badge
+ * test: [coveralls] add coveralls api integration. testing travis-ci integration
+ * Merge branch 'master' of github.com:chaijs/chai
+ * Merge branch 'feature/bower'
+ * Merge pull request #180 from tricknotes/modify-method-title
+ * Merge pull request #179 from tricknotes/highlight-code-example
+ * Modify method title to include argument name
+ * Fix to highlight code example
+ * bower: granular ignores
+
+1.7.1 / 2013-06-24
+==================
+
+ * Merge branch 'feature/bower'. #175
+ * bower: add json file
+ * build: browser
+
+1.7.0 / 2013-06-17
+==================
+
+ * error: remove internal assertion error constructor
+ * core: [assertion-error] replace internal assertion error with dep
+ * deps: add chaijs/assertion-error@1.0.0
+ * docs: fix typo in source file. #174
+ * Merge pull request #174 from piecioshka/master
+ * typo
+ * Merge branch 'master' of github.com:chaijs/chai
+ * pkg: lock mocha/mocha-phantomjs versions (for now)
+ * Merge pull request #173 from chaijs/inspect-fix
+ * Fix `utils.inspect` with custom object-returning inspect()s.
+ * Merge pull request #171 from Bartvds/master
+ * replaced tabs with 2 spaces
+ * added assert.notOk()
+ * Merge pull request #169 from katsgeorgeek/topics/master
+ * Fix comparison objects.
+
+1.6.1 / 2013-06-05
+==================
+
+ * Merge pull request #168 from katsgeorgeek/topics/master
+ * Add test for different RegExp flags.
+ * Add test for regexp comparison.
+ * Downgrade mocha version for fix running Phantom tests.
+ * Fix comparison equality of two regexps.
+ * Merge pull request #161 from brandonpayton/master
+ * Fix documented name for assert interfaces isDefined method
+
+1.6.0 / 2013-04-29
+==================
+
+ * build: browser
+ * assert: [(not)include] throw on incompatible haystack. Closes #142
+ * assert: [notInclude] add assert.notInclude. Closes #158
+ * browser build
+ * makefile: force browser build on browser-test
+ * makefile: use component for browser build
+ * core: [assertions] remove extraneous comments
+ * Merge branch 'master' of github.com:chaijs/chai
+ * test: [assert] deep equal ordering
+ * Merge pull request #153 from NickHeiner/array-assertions
+ * giving members a no-flag assertion
+ * Code review comments - changing syntax
+ * Code review comments
+ * Adding members and memberEquals assertions for checking for subsets and set equality. Implements chaijs/chai#148.
+ * Merge pull request #140 from RubenVerborgh/function-prototype
+ * Restore the `call` and `apply` methods of Function when adding a chainable method.
+ * readme: 2013
+ * notes: migration notes for deep equal changes
+ * test: for ever err() there must be a passing version
+
+1.5.0 / 2013-02-03
+==================
+
+ * docs: add Release Notes for non-gitlog summary of changes.
+ * lib: update copyright to 2013
+ * Merge branch 'refactor/travis'
+ * makefile: remove test-component for full test run
+ * pkg: script test now runs make test so travis will test browser
+ * browser: build
+ * tests: refactor some tests to support new objDisplay output
+ * test: [bootstrap] normalize boostrap across all test scenarios
+ * assertions: refactor some assertions to use objDisplay instead of inspect
+ * util: [objDisplay] normalize output of functions
+ * makefile: refactor for full build scenarios
+ * component: fix build bug where missing util:type file
+ * assertions: [throw] code cleanup
+ * Merge branch 'refactor/typeDetection'
+ * browser: build
+ * makefile: chai.js is .PHONY so it builds every time
+ * test: [expect] add arguments type detection test
+ * core/assertions: [type] (a/an) refactor to use type detection utility
+ * util: add cross-browser type detection utility
+ * Merge branch 'feature/component'
+ * browser: build
+ * component: add component.json file
+ * makefile: refactor for fine grain control of testing scenarios
+ * test: add mochaPhantomJS support and component test file
+ * deps: add component and mocha-phantomjs for browser testing
+ * ignore: update ignore files for component support
+ * travis: run for all branches
+ * Merge branch 'feature/showDiff'
+ * test: [Assertion] configruable showDiff flag. Closes #132
+ * lib: [Assertion] add configurable showDiff flag. #132
+ * Merge branch 'feature/saucelabs'
+ * Merge branch 'master' into feature/saucelabs
+ * browser: build
+ * support: add mocha cloud runner, client, and html test page
+ * test: [saucelabs] add auth placeholder
+ * deps: add mocha-cloud
+ * Merge pull request #136 from whatthejeff/message_fix
+ * Merge pull request #138 from timnew/master
+ * Fix issue #137, test message existence by using message!=null rather than using message
+ * Fixed backwards negation messages.
+ * Merge pull request #133 from RubenVerborgh/throw
+ * Functions throwing strings can reliably be tested.
+ * Merge pull request #131 from RubenVerborgh/proto
+ * Cache whether __proto__ is supported.
+ * Use __proto__ if available.
+ * Determine the property names to exclude beforehand.
+ * Merge pull request #126 from RubenVerborgh/eqls
+ * Add alias eqls for eql.
+ * Use inherited enumerable properties in deep equality comparison.
+ * Show inherited properties when inspecting an object.
+ * Add new getProperties and getEnumerableProperties utils.
+ * showDiff: force true for equal and eql
+
+1.4.2 / 2012-12-21
+==================
+
+ * browser build: (object diff support when used with mocha) #106
+ * test: [display] array test for mocha object diff
+ * browser: no longer need different AssertionError constructor
+
+1.4.1 / 2012-12-21
+==================
+
+ * showDiff: force diff for equal and eql. #106
+ * test: [expect] type null. #122
+ * Merge pull request #115 from eshao/fix-assert-Throw
+ * FIX: assert.Throw checks error type/message
+ * TST: assert.Throw should check error type/message
+
+1.4.0 / 2012-11-29
+==================
+
+ * pre-release browser build
+ * clean up index.js to not check for cov, revert package.json to use index.js
+ * convert tests to use new bootstrap
+ * refactor testing bootstrap
+ * use spaces (not tabs). Clean up #114
+ * Merge pull request #114 from trantorLiu/master
+ * Add most() (alias: lte) and least() (alias: gte) to the API with new chainers "at" and "of".
+ * Change `main` to ./lib/chai. Fixes #28.
+ * Merge pull request #104 from connec/deep_equals_circular_references_
+ * Merge pull request #109 from nnarhinen/patch-1
+ * Check for 'actual' type
+ * Added support for circular references when checking deep (in)equality.
+
+1.3.0 / 2012-10-01
+==================
+
+ * browser build w/ folio >= 0.3.4. Closes #99
+ * add back buffer test for deep equal
+ * do not write flags to assertion.prototype
+ * remove buffer test from expect
+ * browser build
+ * improve documentation of custom error messages
+ * Merge branch 'master' of git://github.com/Liffft/chai into Liffft-master
+ * browser build
+ * improved buffer deep equal checking
+ * mocha is npm test command
+ * Cleaning up the js style…
+ * expect tests now include message pass-through
+ * packaging up browser-side changes…
+ * Increasing Throws error message verbosity
+ * Should syntax: piping message through
+ * Make globalShould test work in browser too.
+ * Add a setter for `Object.prototype.should`. Closes #86.
+
+1.2.0 / 2012-08-07
+==================
+
+ * Merge branch 'feature/errmsg'
+ * browser build
+ * comment updates for utilities
+ * tweak objDislay to only kick in if object inspection is too long
+ * Merge branch 'master' into feature/errmsg
+ * add display sample for error message refactor
+ * first draft of error message refactor. #93
+ * add `closeTo` assertion to `assert` interface. Closes #89.
+ * update folio build for better require.js handling. Closes #85
+ * Merge pull request #92 from paulmillr/topics/add-dom-checks
+ * Add check for DOM objects.
+ * browser build
+ * Merge branch 'master' of github.com:chaijs/chai
+ * bug - getActual not defaulting to assertion subject
+ * Merge pull request #88 from pwnall/master
+ * Don't inspect() assertion arguments if the assertion passes.
+
+1.1.1 / 2012-07-09
+==================
+
+ * improve commonjs support on browser build
+ * Merge pull request #83 from tkazec/equals
+ * Document .equals
+ * Add .equals as an alias of .equal
+ * remove unused browser prefix/suffix
+ * Merge branch 'feature/folio-build'
+ * browser build
+ * using folio to compile
+ * clean up makefile
+ * early folio 0.3.x support
+
+1.1.0 / 2012-06-26
+==================
+
+ * browser build
+ * Disable "Assertion.includeStack is false" test in IE.
+ * Use `utils.getName` for all function inspections.
+ * Merge pull request #80 from kilianc/closeTo
+ * fixes #79
+ * browser build
+ * expand docs to indicate change of subject for chaining. Closes #78
+ * add `that` chain noop
+ * Merge branch 'bug/74'
+ * comments on how to property use `length` as chain. Closes #74
+ * tests for length as chainable property. #74
+ * add support for `length` as chainable prop/method.
+ * Merge branch 'bug/77'
+ * tests for getPathValue when working with nested arrays. Closes #77
+ * add getPathValue support for nested arrays
+ * browser build
+ * fix bug for missing browser utils
+ * compile tool aware of new folder layout
+ * Merge branch 'refactor/1dot1'
+ * move core assertions to own file and refactor all using utils
+ * rearrange folder structure
+
+1.0.4 / 2012-06-03
+==================
+
+ * Merge pull request #68 from fizker/itself
+ * Added itself chain.
+ * simplify error inspections for cross browser compatibility
+ * fix safari `addChainableMethod` errors. Closes #69
+
+1.0.3 / 2012-05-27
+==================
+
+ * Point Travis badge to the right place.
+ * Make error message for eql/deep.equal more clear.
+ * Fix .not.deep.equal.
+ * contributors list
+
+1.0.2 / 2012-05-26
+==================
+
+ * Merge pull request #67 from chaijs/chaining-and-flags
+ * Browser build.
+ * Use `addChainableMethod` to get away from `__proto__` manipulation.
+ * New `addChainableMethod` utility.
+ * Replace `getAllFlags` with `transferFlags` utility.
+ * browser build
+ * test - get all flags
+ * utility - get all flags
+ * Add .mailmap to .npmignore.
+ * Add a .mailmap file to fix my name in shortlogs.
+
+1.0.1 / 2012-05-18
+==================
+
+ * browser build
+ * Fixing "an" vs. "a" grammar in type assertions.
+ * Uniformize `assert` interface inline docs.
+ * Don't use `instanceof` for `assert.isArray`.
+ * Add `deep` flag for equality and property value.
+ * Merge pull request #64 from chaijs/assertion-docs
+ * Uniformize assertion inline docs.
+ * Add npm-debug.log to .gitignore.
+ * no reserved words as actuals. #62
+
+1.0.0 / 2012-05-15
+==================
+
+ * readme cleanup
+ * browser build
+ * utility comments
+ * removed docs
+ * update to package.json
+ * docs build
+ * comments / docs updates
+ * plugins app cleanup
+ * Merge pull request #61 from joliss/doc
+ * Fix and improve documentation of assert.equal and friends
+ * browser build
+ * doc checkpoint - texture
+ * Update chai-jquery link
+ * Use defined return value of Assertion extension functions
+ * Update utility docs
+
+1.0.0-rc3 / 2012-05-09
+==================
+
+ * Merge branch 'feature/rc3'
+ * docs update
+ * browser build
+ * assert test conformity for minor refactor api
+ * assert minor refactor
+ * update util tests for new add/overwrite prop/method format
+ * added chai.Assertion.add/overwrite prop/method for plugin toolbox
+ * add/overwrite prop/method don't make assumptions about context
+ * doc test suite
+ * docs don't need coverage
+ * refactor all simple chains into one forEach loop, for clean documentation
+ * updated npm ignore
+ * remove old docs
+ * docs checkpoint - guide styled
+ * Merge pull request #59 from joliss/doc
+ * Document how to run the test suite
+ * don't need to rebuild docs to view
+ * dep update
+ * docs checkpoint - api section
+ * comment updates for docs
+ * new doc site checkpoint - plugin directory!
+ * Merge pull request #57 from kossnocorp/patch-1
+ * Fix typo: devDependancies → devDependencies
+ * Using message flag in `getMessage` util instead of old `msg` property.
+ * Adding self to package.json contributors.
+ * `getMessage` shouldn't choke on null/omitted messages.
+ * `return this` not necessary in example.
+ * `return this` not necessary in example.
+ * Sinon–Chai has a dash
+ * updated plugins list for docs
+
+1.0.0-rc2 / 2012-05-06
+==================
+
+ * Merge branch 'feature/test-cov'
+ * browser build
+ * missing assert tests for ownProperty
+ * appropriate assert equivalent for expect.to.have.property(key, val)
+ * reset AssertionError to include full stack
+ * test for plugin utilities
+ * overwrite Property and Method now ensure chain
+ * version notes in readme
+
+1.0.0-rc1 / 2012-05-04
+==================
+
+ * browser build (rc1)
+ * assert match/notMatch tests
+ * assert interface - notMatch, ownProperty, notOwnProperty, ownPropertyVal, ownPropertyNotVal
+ * cleaner should interface export.
+ * added chai.Assertion.prototype._obj (getter) for quick access to object flag
+ * moved almostEqual / almostDeepEqual to stats plugin
+ * added mocha.opts
+ * Add test for `utils.addMethod`
+ * Fix a typo
+ * Add test for `utils.overwriteMethod`
+ * Fix a typo
+ * Browser build
+ * Add undefined assertion
+ * Add null assertion
+ * Fix an issue with `mocha --watch`
+ * travis no longer tests on node 0.4.x
+ * removing unnecissary carbon dep
+ * Merge branch 'feature/plugins-app'
+ * docs build
+ * templates for docs express app for plugin directory
+ * express app for plugin and static serving
+ * added web server deps
+ * Merge pull request #54 from josher19/master
+ * Remove old test.assert code
+ * Use util.inspect instead of inspect for deepAlmostEqual and almostEqual
+ * browser build
+ * Added almostEqual and deepAlmostEqual to assert test suite.
+ * bug - context determinants for utils
+ * dec=0 means rounding, so assert.deepAlmostEqual({pi: 3.1416}, {pi: 3}, 0) is true
+ * wrong travis link
+ * readme updates for version information
+ * travis tests 0.5.x branch as well
+ * [bug] util `addProperty` not correctly exporting
+ * read me version notes
+ * browser build 1.0.0alpha1
+ * not using reserved words in internal assertions. #52
+ * version tick
+ * clean up redundant tests
+ * Merge branch 'refs/heads/0.6.x'
+ * update version tag in package 1.0.0alpha1
+ * browser build
+ * added utility tests to browser specs
+ * beginning utility testing
+ * updated utility comments
+ * utility - overwriteMethod
+ * utility - overwriteProperty
+ * utility - addMethod
+ * utility - addProperty
+ * missing ;
+ * contributors list update
+ * Merge branch 'refs/heads/0.6.x-docs' into 0.6.x
+ * Added guide link to docs. WIP
+ * Include/contain are now both properties and methods
+ * Add an alias annotation
+ * Remove usless function wrapper
+ * Fix a typo
+ * A/an are now both properties and methods
+ * [docs] new site homepage layout / color checkpoint
+ * Ignore IE-specific error properties.
+ * Fixing order of error message test.
+ * New cross-browser `getName` util.
+ * Fixing up `AssertionError` inheritance.
+ * backup docs
+ * Add doctypes
+ * [bug] was still using `constructor.name` in `throw` assertion
+ * [bug] flag Object.create(null) instead of new Object
+ * [test] browser build
+ * [refactor] all usage of Assertion.prototype.assert now uses template tags and flags
+ * [refactor] remove Assertion.prototype.inspect for testable object inspection
+ * [refactor] object to test is now stored in flag, with ssfi and custom message
+ * [bug] flag util - don't return on `set`
+ * [docs] comments for getMessage utility
+ * [feature] getMessage
+ * [feature] testing utilities
+ * [refactor] flag doesn't require `call`
+ * Make order of source files well-defined
+ * Added support for throw(errorInstance).
+ * Use a foolproof method of grabbing an error's name.
+ * Removed constructor.name check from throw.
+ * disabled stackTrack configuration tests until api is stable again
+ * first version of line displayed error for node js (unstable)
+ * refactor core Assertion to use flag utility for negation
+ * added flag utility
+ * tests for assert interface negatives. Closed #42
+ * added assertion negatives that were missing. #42
+ * Support for expected and actual parameters in assert-style error object
+ * chai as promised - readme
+ * Added assert.fail. Closes #40
+ * better error message for assert.operator. Closes #39
+ * [refactor] Assertion#property to use getPathValue property
+ * added getPathValue utility helper
+ * removed todo about browser build
+ * version notes
+ * version bumb 0.6.0
+ * browser build
+ * [refactor] browser compile function to replace with `require('./error')' with 'require('./browser/error')'
+ * [feature] browser uses different error.js
+ * [refactor] error without chai.fail
+ * Assertion & interfaces use new utils helper export
+ * [refactor] primary export for new plugin util usage
+ * added util index.js helper
+ * added 2012 to copyright headers
+ * Added DeepEqual assertions
+
+0.5.3 / 2012-04-21
+==================
+
+ * Merge branch 'refs/heads/jgonera-oldbrowsers'
+ * browser build
+ * fixed reserved names for old browsers in interface/assert
+ * fixed reserved names for old browsers in interface/should
+ * fixed: chai.js no longer contains fail()
+ * fixed reserved names for old browsers in Assertion
+ * Merge pull request #49 from joliss/build-order
+ * Make order of source files well-defined
+ * Merge pull request #43 from zzen/patch-1
+ * Support for expected and actual parameters in assert-style error object
+ * chai as promised - readme
+
+0.5.2 / 2012-03-21
+==================
+
+ * browser build
+ * Merge branch 'feature/assert-fail'
+ * Added assert.fail. Closes #40
+ * Merge branch 'bug/operator-msg'
+ * better error message for assert.operator. Closes #39
+ * version notes
+
+0.5.1 / 2012-03-14
+==================
+
+ * chai.fail no longer exists
+ * Merge branch 'feature/assertdefined'
+ * Added asset#isDefined. Closes #37.
+ * dev docs update for Assertion#assert
+
+0.5.0 / 2012-03-07
+==================
+
+ * [bug] on inspect of reg on n 0.4.12
+ * Merge branch 'bug/33-throws'
+ * Merge pull request #35 from logicalparadox/empty-object
+ * browser build
+ * updated #throw docs
+ * Assertion#throw `should` tests updated
+ * Assertion#throw `expect` tests
+ * Should interface supports multiple throw parameters
+ * Update Assertion#throw to support strings and type checks.
+ * Add more tests for `empty` in `should`.
+ * Add more tests for `empty` in `expect`.
+ * Merge branch 'master' into empty-object
+ * don't switch act/exp
+ * Merge pull request #34 from logicalparadox/assert-operator
+ * Update the compiled verison.
+ * Add `assert.operator`.
+ * Notes on messages. #22
+ * browser build
+ * have been test
+ * below tests
+ * Merge branch 'feature/actexp'
+ * browser build
+ * remove unnecessary fail export
+ * full support for actual/expected where relevant
+ * Assertion.assert support expected value
+ * clean up error
+ * Update the compiled version.
+ * Add object & sane arguments support to `Assertion#empty`.
+
+0.4.2 / 2012-02-28
+==================
+
+ * fix for `process` not available in browser when used via browserify. Closes #28
+ * Merge pull request #31 from joliss/doc
+ * Document that "should" works in browsers other than IE
+ * Merge pull request #30 from logicalparadox/assert-tests
+ * Update the browser version of chai.
+ * Update `assert.doesNotThrow` test in order to check the use case when type is a string.
+ * Add test for `assert.ifError`.
+ * Falsey -> falsy.
+ * Full coverage for `assert.throws` and `assert.doesNotThrow`.
+ * Add test for `assert.doesNotThrow`.
+ * Add test for `assert.throws`.
+ * Add test for `assert.length`.
+ * Add test for `assert.include`.
+ * Add test for `assert.isBoolean`.
+ * Fix the implementation of `assert.isNumber`.
+ * Add test for `assert.isNumber`.
+ * Add test for `assert.isString`.
+ * Add test for `assert.isArray`.
+ * Add test for `assert.isUndefined`.
+ * Add test for `assert.isNotNull`.
+ * Fix `assert.isNotNull` implementation.
+ * Fix `assert.isNull` implementation.
+ * Add test for `assert.isNull`.
+ * Add test for `assert.notDeepEqual`.
+ * Add test for `assert.deepEqual`.
+ * Add test for `assert.notStrictEqual`.
+ * Add test for `assert.strictEqual`.
+ * Add test for `assert.notEqual`.
+
+0.4.1 / 2012-02-26
+==================
+
+ * Merge pull request #27 from logicalparadox/type-fix
+ * Update the browser version.
+ * Add should tests for type checks.
+ * Add function type check test.
+ * Add more type checks tests.
+ * Add test for `new Number` type check.
+ * Fix type of actual checks.
+
+0.4.0 / 2012-02-25
+==================
+
+ * docs and readme for upcoming 0.4.0
+ * docs generated
+ * putting coverage and tests for docs in docs/out/support
+ * make docs
+ * makefile copy necessary resources for tests in docs
+ * rename configuration test
+ * Merge pull request #21 from logicalparadox/close-to
+ * Update the browser version.
+ * Update `closeTo()` docs.
+ * Add `Assertion.closeTo()` method.
+ * Add `.closeTo()` should test.
+ * Add `.closeTo()` expect test.
+ * Merge pull request #20 from logicalparadox/satisfy
+ * Update the browser version.
+ * `..` -> `()` in `.satisfy()` should test.
+ * Update example for `.satisfy()`.
+ * Update the compiled browser version.
+ * Add `Assertion.satisfy()` method.
+ * Add `.satisfy()` should test.
+ * Add `.satisfy()` expect test.
+ * Merge pull request #19 from logicalparadox/respond-to
+ * Update the compiled browser version.
+ * Add `respondTo` Assertion.
+ * Add `respondTo` should test.
+ * Add `respondTo` expect test.
+ * Merge branch 'feature/coverage'
+ * mocha coverage support
+ * doc contributors
+ * README contributors
+
+0.3.4 / 2012-02-23
+==================
+
+ * inline comment typos for #15
+ * Merge branch 'refs/heads/jeffbski-configErrorStackCompat'
+ * includeStack documentation for all interfaces
+ * suite name more generic
+ * Update test to be compatible with browsers that do not support err.stack
+ * udpated compiled chai.js and added to browser tests
+ * Allow inclusion of stack trace for Assert error messages to be configurable
+ * docs sharing buttons
+ * sinon-chai link
+ * doc updates
+ * read me updates include plugins
+
+0.3.3 / 2012-02-12
+==================
+
+ * Merge pull request #14 from jfirebaugh/configurable_properties
+ * Make Assertion.prototype properties configurable
+
+0.3.2 / 2012-02-10
+==================
+
+ * codex version
+ * docs
+ * docs cleanup
+
+0.3.1 / 2012-02-07
+==================
+
+ * node 0.4.x compat
+
+0.3.0 / 2012-02-07
+==================
+
+ * Merge branch 'feature/03x'
+ * browser build
+ * remove html/json/headers testign
+ * regex error.message testing
+ * tests for using plugins
+ * Merge pull request #11 from domenic/master
+ * Make `chai.use` a no-op if the function has already been used.
+
+0.2.4 / 2012-02-02
+==================
+
+ * added in past tense switch for `been`
+
+0.2.3 / 2012-02-01
+==================
+
+ * try that again
+
+0.2.2 / 2012-02-01
+==================
+
+ * added `been` (past of `be`) alias
+
+0.2.1 / 2012-01-29
+==================
+
+ * added Throw, with a capital T, as an alias to `throw` (#7)
+
+0.2.0 / 2012-01-26
+==================
+
+ * update gitignore for vim *.swp
+ * Merge branch 'feature/plugins'
+ * browser build
+ * interfaces now work with use
+ * simple .use function. See #9.
+ * readme notice on browser compat
+
+0.1.7 / 2012-01-25
+==================
+
+ * added assert tests to browser test runner
+ * browser update
+ * `should` interface patch for primitives support in FF
+ * fix isObject() Thanks @milewise
+ * travis only on branch `master`
+ * add instanceof alias `instanceOf`. #6
+ * some tests for assert module
+
+0.1.6 / 2012-01-02
+==================
+
+ * commenting for assert interface
+ * updated codex dep
+
+0.1.5 / 2012-01-02
+==================
+
+ * browser tests pass
+ * type in should.not.equal
+ * test for should (not) exist
+ * added should.exist and should.not.exist
+ * browser uses tdd
+ * convert tests to tdd
+
+0.1.4 / 2011-12-26
+==================
+
+ * browser lib update for new assert interface compatiblitiy
+ * inspect typos
+ * added strict equal + negatives and ifError
+ * interface assert had doesNotThrow
+ * added should tests to browser
+ * new expect empty tests
+ * should test browser compat
+ * Fix typo for instanceof docs. Closes #3 [ci skip]
+
+0.1.3 / 2011-12-18
+==================
+
+ * much cleaner reporting string on error.
+
+0.1.2 / 2011-12-18
+==================
+
+ * [docs] for upcoming 0.1.2
+ * browser version built with pre/suffix … all tests passing
+ * make / compile now use prefix/suffix correctly
+ * code clean
+ * prefix/suffix to wrap browser output to prevent conflicts with other `require` methods.
+ * Merge branch 'feature/should4xcompatibility'
+ * compile for browser tests.. all pass
+ * added header/status/html/json
+ * throw tests
+ * should.throw & should.not.throw shortcuts
+ * improved `throw` type detection and messaging
+ * contain is now `include` … keys modifier is now `contain`
+ * removed object() test
+ * removed #respondTo
+ * Merge branch 'bug/2'
+ * replaced __defineGetter__ with defineProperty for all uses
+ * [docs] change mp tracking code
+ * docs site updated with assert (TDD) interface
+ * updated doc comments for assert interface
+
+0.1.1 / 2011-12-16
+==================
+
+ * docs ready for upcoming 0.1.1
+ * readme image fixed [ci skip]
+ * more readme tweaks [ci skip]
+ * réadmet image fixed [ci skip]
+ * documentation
+ * codex locked in version 0.0.5
+ * more comments to assertions for docs
+ * assertions fully commented, browser library updated
+ * adding codex as doc dependancy
+ * prepping for docs
+ * assertion component completely commented for documentation
+ * added exist test
+ * var expect outside of browser if check
+ * added keywords to package.json
+
+0.1.0 / 2011-12-15
+==================
+
+ * failing on purpose successful .. back to normal
+ * testing travis failure
+ * assert#arguments getter
+ * readme typo
+ * updated README
+ * added travis and npmignore
+ * copyright notices … think i got them all
+ * moved expect interface to own file for consistency
+ * assert ui deepEqual
+ * browser tests expect (all working)
+ * browser version built
+ * chai.fail (should ui)
+ * expect tests browser compatible
+ * tests for should and expect (all pass)
+ * moved fail to primary export
+ * should compatibility testing
+ * within, greaterThan, object, keys,
+ * Aliases
+ * Assertion#property now correctly works with negate and undefined values
+ * error message language matches should
+ * Assertion#respondTo
+ * Assertion now uses inspect util
+ * git ignore node modules
+ * should is exported
+ * AssertionError __proto__ from Error.prototype
+ * add should interface for should.js compatibility
+ * moved eql to until folder and added inspect from (joyent/node)
+ * added mocha for testing
+ * browser build for current api
+ * multiple .property assertions
+ * added deep equal from node
+
+0.0.2 / 2011-12-07
+==================
+
+ * cleaner output on error
+ * improved exists detection
+ * package remnant artifact
+ * empty deep equal
+ * test browser build
+ * assertion cleanup
+ * client compile script
+ * makefile
+ * most of the basic assertions
+ * allow no parameters to assertion error
+ * name change
+ * assertion error instance
+ * main exports: assert() & expect()
+ * initialize
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/README.md
new file mode 100644
index 00000000000..c61bfa8b793
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/README.md
@@ -0,0 +1,83 @@
+[![Chai Documentation](http://chaijs.com/public/img/chai-logo.png)](http://chaijs.com)
+
+[![license:mit](https://img.shields.io/badge/license-mit-green.svg?style=flat-square)](#license)<br>
+[![tag:?](https://img.shields.io/github/tag/chaijs/chai.svg?style=flat-square)](https://github.com/chaijs/chai/releases)
+[![build:?](https://img.shields.io/travis/chaijs/chai/master.svg?style=flat-square)](https://travis-ci.org/chaijs/chai)
+[![coverage:?](https://img.shields.io/coveralls/chaijs/chai/master.svg?style=flat-square)](https://coveralls.io/r/chaijs/chai)<br>
+[![npm:](https://img.shields.io/npm/v/chai.svg?style=flat-square)](https://www.npmjs.com/packages/chai)
+[![dependencies:?](https://img.shields.io/npm/dm/chai.svg?style=flat-square)](https://www.npmjs.com/packages/chai)
+[![devDependencies:?](https://img.shields.io/david/chaijs/chai.svg?style=flat-square)](https://david-dm.org/chaijs/chai)
+
+[![Selenium Test Status](https://saucelabs.com/browser-matrix/chaijs.svg)](https://saucelabs.com/u/chaijs)
+
+[![Slack Status](https://chai-slack.herokuapp.com/badge.svg)]( https://chai-slack.herokuapp.com/)
+[![Join the chat at https://gitter.im/chaijs/chai](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/chaijs/chai)
+
+Chai is a BDD / TDD assertion library for [node](http://nodejs.org) and the browser that
+can be delightfully paired with any javascript testing framework.
+
+For more information or to download plugins, view the [documentation](http://chaijs.com).
+
+### Plugins
+
+Chai offers a robust Plugin architecture for extending Chai's assertions and interfaces.
+
+- Need a plugin? View the [official plugin list](http://chaijs.com/plugins).
+- Have a plugin and want it listed? Open a Pull Request at [chaijs/chai-docs:plugin.js](https://github.com/chaijs/chai-docs/blob/master/plugins.js#L1-L12).
+- Want to build a plugin? Read the [plugin api documentation](http://chaijs.com/guide/plugins/).
+
+### Related Projects
+
+- [chaijs / assertion-error](https://github.com/chaijs/assertion-error): Custom `Error` constructor thrown upon an assertion failing.
+- [chaijs / deep-eql](https://github.com/chaijs/deep-eql): Improved deep equality testing for Node.js and the browser.
+- [chaijs / type-detect](https://github.com/chaijs/type-detect): Improved typeof detection for node.js and the browser.
+
+### Contributing
+
+Thank you very much for considering to contribute!
+
+Here are a few issues other contributors frequently ran into when opening pull requests:
+
+- Please do not commit changes to the `chai.js` build. We do it once per release.
+- Before pushing your commits, please make sure you [rebase](https://github.com/chaijs/chai/blob/master/CONTRIBUTING.md#pull-requests) them.
+
+We also strongly encourage you to read our detailed [contribution guidelines](https://github.com/chaijs/chai/blob/master/CONTRIBUTING.md).
+
+### Contributors
+
+Please see the full
+[Contributors Graph](https://github.com/chaijs/chai/graphs/contributors) for our
+list of contributors.
+
+### Core Contributors
+
+Feel free to reach out to any of the core contributors with your questions or
+concerns. We will do our best to respond in a timely manner.
+
+[![Jake Luer](https://avatars3.githubusercontent.com/u/58988?v=3&s=50)](https://github.com/logicalparadox)
+[![Veselin Todorov](https://avatars3.githubusercontent.com/u/330048?v=3&s=50)](https://github.com/vesln)
+[![Keith Cirkel](https://avatars3.githubusercontent.com/u/118266?v=3&s=50)](https://github.com/keithamus)
+
+## License
+
+(The MIT License)
+
+Copyright (c) 2011-2015 Jake Luer <jake@alogicalparadox.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/ReleaseNotes.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/ReleaseNotes.md
new file mode 100644
index 00000000000..2a80d5cec1a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/ReleaseNotes.md
@@ -0,0 +1,737 @@
+# Release Notes
+
+## Note
+
+As of 3.0.0, the ReleaseNotes.md file has been deprecated. [Please refer to the release notes available on Github](https://github.com/chaijs/chai/releases). Or
+[the release notes on the chaijs.com website](https://chaijs.com/releases).
+
+---
+
+## 2.3.0 / 2015-04-26
+
+Added `ownPropertyDescriptor` assertion:
+
+```js
+expect('test').to.have.ownPropertyDescriptor('length');
+expect('test').to.have.ownPropertyDescriptor('length', { enumerable: false, configurable: false, writable: false, value: 4 });
+expect('test').not.to.have.ownPropertyDescriptor('length', { enumerable: false, configurable: false, writable: false, value: 3 });
+expect('test').ownPropertyDescriptor('length').to.have.property('enumerable', false);
+expect('test').ownPropertyDescriptor('length').to.have.keys('value');
+```
+
+### Community Contributions
+
+#### Code Features & Fixes
+
+ * [#408](https://github.com/chaijs/chai/pull/408) Add `ownPropertyDescriptor`
+ assertion.
+ By [@ljharb](https://github.com/ljharb)
+ * [#422](https://github.com/chaijs/chai/pull/422) Improve ownPropertyDescriptor
+ tests.
+ By [@ljharb](https://github.com/ljharb)
+
+#### Documentation fixes
+
+ * [#417](https://github.com/chaijs/chai/pull/417) Fix documentation typo
+ By [@astorije](https://github.com/astorije)
+ * [#423](https://github.com/chaijs/chai/pull/423) Fix inconsistency in docs.
+ By [@ehntoo](https://github.com/ehntoo)
+
+
+## 2.2.0 / 2015-03-26
+
+Deep property strings can now be escaped using `\\` - for example:
+
+```js
+var deepCss = { '.link': { '[target]': 42 }};
+expect(deepCss).to.have.deep.property('\\.link.\\[target\\]', 42)
+```
+
+### Community Contributions
+
+#### Code Features & Fixes
+
+ * [#402](https://github.com/chaijs/chai/pull/402) Allow escaping of deep
+ property keys.
+ By [@umireon](https://github.com/umireon)
+
+#### Documentation fixes
+
+ * [#405](https://github.com/chaijs/chai/pull/405) Tweak documentation around
+ deep property escaping.
+ By [@keithamus](https://github.com/keithamus)
+
+
+## 2.1.2 / 2015-03-15
+
+A minor bug fix. No new features.
+
+### Community Contributions
+
+#### Code Features & Fixes
+
+ * [#395](https://github.com/chaijs/chai/pull/395) Fix eval-related bugs with
+ assert.operator ([#386](https://github.com/chaijs/chai/pull/386)).
+ By [@cjqed](https://github.com/cjqed)
+
+## 2.1.1 / 2015-03-04
+
+Two minor bugfixes. No new features.
+
+### Community Contributions
+
+#### Code Features & Fixes
+
+ * [#385](https://github.com/chaijs/chai/pull/385) Fix a bug (also described in
+ [#387](https://github.com/chaijs/chai/pull/385)) where `deep.property` would not work with single
+ key names. By [@eldritch-fossicker](https://github.com/eldritch-fossicker)
+ * [#379](https://github.com/chaijs/chai/pull/379) Fix bug where tools which overwrite
+ primitive prototypes, such as Babel or core-js would fail.
+ By [@dcneiner](https://github.com/dcneiner)
+
+#### Documentation fixes
+
+ * [#382](https://github.com/chaijs/chai/pull/382) Add doc for showDiff argument in assert.
+ By [@astorije](https://github.com/astorije)
+ * [#383](https://github.com/chaijs/chai/pull/383) Improve wording for truncateTreshold docs
+ By [@gurdiga](https://github.com/gurdiga)
+ * [#381](https://github.com/chaijs/chai/pull/381) Improve wording for assert.empty docs
+ By [@astorije](https://github.com/astorije)
+
+## 2.1.0 / 2015-02-23
+
+Small release; fixes an issue where the Chai lib was incorrectly reporting the
+version number.
+
+Adds new `should.fail()` and `expect.fail()` methods, which are convinience
+methods to throw Assertion Errors.
+
+### Community Contributions
+
+#### Code Features & Fixes
+
+ * [#356](https://github.com/chaijs/chai/pull/356) Add should.fail(), expect.fail(). By [@Soviut](https://github.com/Soviut)
+ * [#374](https://github.com/chaijs/chai/pull/374) Increment version. By [@jmm](https://github.com/jmm)
+
+## 2.0.0 / 2015-02-09
+
+Unfortunately with 1.10.0 - compatibility broke with older versions because of
+the `addChainableNoop`. This change has been reverted.
+
+Any plugins using `addChainableNoop` should cease to do so.
+
+Any developers wishing for this behaviour can use [dirty-chai](https://www.npmjs.com/package/dirty-chai)
+by [@joshperry](https://github.com/joshperry)
+
+### Community Contributions
+
+#### Code Features & Fixes
+
+ * [#361](https://github.com/chaijs/chai/pull/361) `.keys()` now accepts Objects, extracting keys from them. By [@gregglind](https://github.com/gregglind)
+ * [#359](https://github.com/chaijs/chai/pull/359) `.keys()` no longer mutates passed arrays. By [@gregglind](https://github.com/gregglind)
+ * [#349](https://github.com/chaijs/chai/pull/349) Add a new chainable keyword - `.which`. By [@toastynerd](https://github.com/toastynerd)
+ * [#333](https://github.com/chaijs/chai/pull/333) Add `.change`, `.increase` and `.decrease` assertions. By [@cmpolis](https://github.com/cmpolis)
+ * [#335](https://github.com/chaijs/chai/pull/335) `chai.util` is now exposed [@DingoEatingFuzz](https://github.com/DingoEatingFuzz)
+ * [#328](https://github.com/chaijs/chai/pull/328) Add `.includes` and `.contains` aliases (for `.include` and `.contain`). By [@lo1tuma](https://github.com/lo1tuma)
+ * [#313](https://github.com/chaijs/chai/pull/313) Add `.any.keys()` and `.all.keys()` qualifiers. By [@cjqed](https://github.com/cjqed)
+ * [#312](https://github.com/chaijs/chai/pull/312) Add `assert.sameDeepMembers()`. By [@cjqed](https://github.com/cjqed)
+ * [#311](https://github.com/chaijs/chai/pull/311) Add `assert.isAbove()` and `assert.isBelow()`. By [@cjqed](https://github.com/cjqed)
+ * [#308](https://github.com/chaijs/chai/pull/308) `property` and `deep.property` now pass if a value is set to `undefined`. By [@prodatakey](https://github.com/prodatakey)
+ * [#309](https://github.com/chaijs/chai/pull/309) optimize deep equal in Arrays. By [@ericdouglas](https://github.com/ericdouglas)
+ * [#306](https://github.com/chaijs/chai/pull/306) revert #297 - allowing lint-friendly tests. By [@keithamus](https://github.com/keithamus)
+
+#### Documentation fixes
+
+ * [#357](https://github.com/chaijs/chai/pull/357) Copyright year updated in docs. By [@danilovaz](https://github.com/danilovaz)
+ * [#325](https://github.com/chaijs/chai/pull/325) Fix documentation for overwriteChainableMethod. By [@chasenlehara](https://github.com/chasenlehara)
+ * [#334](https://github.com/chaijs/chai/pull/334) Typo fix. By [@hurrymaplelad](https://github.com/hurrymaplelad)
+ * [#317](https://github.com/chaijs/chai/pull/317) Typo fix. By [@jasonkarns](https://github.com/jasonkarns)
+ * [#318](https://github.com/chaijs/chai/pull/318) Typo fix. By [@jasonkarns](https://github.com/jasonkarns)
+ * [#316](https://github.com/chaijs/chai/pull/316) Typo fix. By [@jasonkarns](https://github.com/jasonkarns)
+
+
+## 1.10.0 / 2014-11-10
+
+The following changes are required if you are upgrading from the previous version:
+
+- **Users:**
+ - No changes required
+- **Plugin Developers:**
+ - Review `addChainableNoop` notes below.
+- **Core Contributors:**
+ - Refresh `node_modules` folder for updated dependencies.
+
+### Noop Function for Terminating Assertion Properties
+
+The following assertions can now also be used in the function-call form:
+
+* ok
+* true
+* false
+* null
+* undefined
+* exist
+* empty
+* arguments
+* Arguments
+
+The above list of assertions are property getters that assert immediately on
+access. Because of that, they were written to be used by terminating the assertion
+chain with a property access.
+
+```js
+expect(true).to.be.true;
+foo.should.be.ok;
+```
+
+This syntax is definitely aesthetically pleasing but, if you are linting your
+test code, your linter will complain with an error something like "Expected an
+assignment or function call and instead saw an expression." Since the linter
+doesn't know about the property getter it assumes this line has no side-effects,
+and throws a warning in case you made a mistake.
+
+Squelching these errors is not a good solution as test code is getting to be
+just as important as, if not more than, production code. Catching syntactical
+errors in tests using static analysis is a great tool to help make sure that your
+tests are well-defined and free of typos.
+
+A better option was to provide a function-call form for these assertions so that
+the code's intent is more clear and the linters stop complaining about something
+looking off. This form is added in addition to the existing property access form
+and does not impact existing test code.
+
+```js
+expect(true).to.be.true();
+foo.should.be.ok();
+```
+
+These forms can also be mixed in any way, these are all functionally identical:
+
+```js
+expect(true).to.be.true.and.not.false();
+expect(true).to.be.true().and.not.false;
+expect(true).to.be.true.and.not.false;
+```
+
+#### Plugin Authors
+
+If you would like to provide this function-call form for your terminating assertion
+properties, there is a new function to register these types of asserts. Instead
+of using `addProperty` to register terminating assertions, simply use `addChainableNoop`
+instead; the arguments to both are identical. The latter will make the assertion
+available in both the attribute and function-call forms and should have no impact
+on existing users of your plugin.
+
+### Community Contributions
+
+- [#297](https://github.com/chaijs/chai/pull/297) Allow writing lint-friendly tests. [@joshperry](https://github.com/joshperry)
+- [#298](https://github.com/chaijs/chai/pull/298) Add check for logging `-0`. [@dasilvacontin](https://github.com/dasilvacontin)
+- [#300](https://github.com/chaijs/chai/pull/300) Fix #299: the test is defining global variables [@julienw](https://github.com/julienw)
+
+Thank you to all who took time to contribute!
+
+## 1.9.2 / 2014-09-29
+
+The following changes are required if you are upgrading from the previous version:
+
+- **Users:**
+ - No changes required
+- **Plugin Developers:**
+ - No changes required
+- **Core Contributors:**
+ - Refresh `node_modules` folder for updated dependencies.
+
+### Community Contributions
+
+- [#264](https://github.com/chaijs/chai/pull/264) Show diff for keys assertions [@cjthompson](https://github.com/cjthompson)
+- [#267](https://github.com/chaijs/chai/pull/267) Use SVG badges [@shinnn](https://github.com/shinnn)
+- [#268](https://github.com/chaijs/chai/pull/268) Allow messages to be functions (sinon-compat) [@charlierudolph](https://github.com/charlierudolph)
+- [#269](https://github.com/chaijs/chai/pull/269) Remove unused argument for #lengthOf [@charlierudolph](https://github.com/charlierudolph)
+- [#275](https://github.com/chaijs/chai/pull/275) Rewrite pretty-printing HTML elements to prevent throwing internal errors [@DrRataplan](https://github.com/DrRataplan)
+- [#277](https://github.com/chaijs/chai/pull/277) Fix assert documentation for #sameMembers [@charlierudolph](https://github.com/charlierudolph)
+- [#279](https://github.com/chaijs/chai/pull/279) closeTo should check value's type before assertion [@mohayonao](https://github.com/mohayonao)
+- [#289](https://github.com/chaijs/chai/pull/289) satisfy is called twice [@charlierudolph](https://github.com/charlierudolph)
+- [#292](https://github.com/chaijs/chai/pull/292) resolve conflicts with node-webkit and global usage [@boneskull](https://github.com/boneskull)
+
+Thank you to all who took time to contribute!
+
+## 1.9.1 / 2014-03-19
+
+The following changes are required if you are upgrading from the previous version:
+
+- **Users:**
+ - Migrate configuration options to new interface. (see notes)
+- **Plugin Developers:**
+ - No changes required
+- **Core Contributors:**
+ - Refresh `node_modules` folder for updated dependencies.
+
+### Configuration
+
+There have been requests for changes and additions to the configuration mechanisms
+and their impact in the Chai architecture. As such, we have decoupled the
+configuration from the `Assertion` constructor. This not only allows for centralized
+configuration, but will allow us to shift the responsibility from the `Assertion`
+constructor to the `assert` interface in future releases.
+
+These changes have been implemented in a non-breaking way, but a depretiation
+warning will be presented to users until they migrate. The old config method will
+be removed in either `v1.11.0` or `v2.0.0`, whichever comes first.
+
+#### Quick Migration
+
+```js
+// change this:
+chai.Assertion.includeStack = true;
+chai.Assertion.showDiff = false;
+
+// ... to this:
+chai.config.includeStack = true;
+chai.config.showDiff = false;
+```
+
+#### All Config Options
+
+##### config.includeStack
+
+- **@param** _{Boolean}_
+- **@default** `false`
+
+User configurable property, influences whether stack trace is included in
+Assertion error message. Default of `false` suppresses stack trace in the error
+message.
+
+##### config.showDiff
+
+- **@param** _{Boolean}_
+- **@default** `true`
+
+User configurable property, influences whether or not the `showDiff` flag
+should be included in the thrown AssertionErrors. `false` will always be `false`;
+`true` will be true when the assertion has requested a diff be shown.
+
+##### config.truncateThreshold **(NEW)**
+
+- **@param** _{Number}_
+- **@default** `40`
+
+User configurable property, sets length threshold for actual and expected values
+in assertion errors. If this threshold is exceeded, the value is truncated.
+
+Set it to zero if you want to disable truncating altogether.
+
+```js
+chai.config.truncateThreshold = 0; // disable truncating
+```
+
+### Community Contributions
+
+- [#228](https://github.com/chaijs/chai/pull/228) Deep equality check for memebers. [@duncanbeevers](https://github.com/duncanbeevers)
+- [#247](https://github.com/chaijs/chai/pull/247) Proofreading. [@didorellano](https://github.com/didoarellano)
+- [#244](https://github.com/chaijs/chai/pull/244) Fix `contain`/`include` 1.9.0 regression. [@leider](https://github.com/leider)
+- [#233](https://github.com/chaijs/chai/pull/233) Improvements to `ssfi` for `assert` interface. [@refack](https://github.com/refack)
+- [#251](https://github.com/chaijs/chai/pull/251) New config option: object display threshold. [@romario333](https://github.com/romario333)
+
+Thank you to all who took time to contribute!
+
+### Other Bug Fixes
+
+- [#183](https://github.com/chaijs/chai/issues/183) Allow `undefined` for actual. (internal api)
+- Update Karam(+plugins)/Istanbul to most recent versions.
+
+## 1.9.0 / 2014-01-29
+
+The following changes are required if you are upgrading from the previous version:
+
+- **Users:**
+ - No changes required
+- **Plugin Developers:**
+ - Review [#219](https://github.com/chaijs/chai/pull/219).
+- **Core Contributors:**
+ - Refresh `node_modules` folder for updated dependencies.
+
+### Community Contributions
+
+- [#202](https://github.com/chaijs/chai/pull/201) Improve error message for .throw(). [@andreineculau](https://github.com/andreineculau)
+- [#217](https://github.com/chaijs/chai/pull/217) Chai tests can be run with `--watch`. [@demands](https://github.com/demands)
+- [#219](https://github.com/chaijs/chai/pull/219) Add overwriteChainableMethod utility. [@demands](https://github.com/demands)
+- [#224](https://github.com/chaijs/chai/pull/224) Return error on throw method to chain on error properties. [@vbardales](https://github.com/vbardales)
+- [#226](https://github.com/chaijs/chai/pull/226) Add `has` to language chains. [@duncanbeevers](https://github.com/duncanbeevers)
+- [#230](https://github.com/chaijs/chai/pull/230) Support `{a:1,b:2}.should.include({a:1})` [@jkroso](https://github.com/jkroso)
+- [#231](https://github.com/chaijs/chai/pull/231) Update Copyright notices to 2014 [@duncanbeevers](https://github.com/duncanbeevers)
+- [#232](https://github.com/chaijs/chai/pull/232) Avoid error instantiation if possible on assert.throws. [@laconbass](https://github.com/laconbass)
+
+Thank you to all who took time to contribute!
+
+### Other Bug Fixes
+
+- [#225](https://github.com/chaijs/chai/pull/225) Improved AMD wrapper provided by upstream `component(1)`.
+- [#185](https://github.com/chaijs/chai/issues/185) `assert.throws()` returns thrown error for further assertions.
+- [#237](https://github.com/chaijs/chai/pull/237) Remove coveralls/jscoverage, include istanbul coverage report in travis test.
+- Update Karma and Sauce runner versions for consistent CI results. No more karma@canary.
+
+## 1.8.1 / 2013-10-10
+
+The following changes are required if you are upgrading from the previous version:
+
+- **Users:**
+ - Refresh `node_modules` folder for updated dependencies.
+- **Plugin Developers:**
+ - No changes required
+- **Core Contributors:**
+ - Refresh `node_modules` folder for updated dependencies.
+
+### Browserify
+
+This is a small patch that updates the dependency tree so browserify users can install
+chai. (Remove conditional requires)
+
+## 1.8.0 / 2013-09-18
+
+The following changes are required if you are upgrading from the previous version:
+
+- **Users:**
+ - See `deep.equal` notes.
+- **Plugin Developers:**
+ - No changes required
+- **Core Contributors:**
+ - Refresh `node_modules` folder for updated dependencies.
+
+### Deep Equals
+
+This version of Chai focused on a overhaul to the deep equal utility. The code for this
+tool has been removed from the core lib and can now be found at:
+[chai / deep-eql](https://github.com/chaijs/deep-eql). As stated in previous releases,
+this is part of a larger initiative to provide transparency, independent testing, and coverage for
+some of the more complicated internal tools.
+
+For the most part `.deep.equal` will behave the same as it has. However, in order to provide a
+consistent ruleset across all types being tested, the following changes have been made and _might_
+require changes to your tests.
+
+**1.** Strict equality for non-traversable nodes according to [egal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
+
+_Previously:_ Non-traversable equal via `===`.
+
+```js
+expect(NaN).to.deep.equal(NaN);
+expect(-0).to.not.deep.equal(+0);
+```
+
+**2.** Arguments are not Arrays (and all types must be equal):
+
+_Previously:_ Some crazy nonsense that led to empty arrays deep equaling empty objects deep equaling dates.
+
+```js
+expect(arguments).to.not.deep.equal([]);
+expect(Array.prototype.slice.call(arguments)).to.deep.equal([]);
+```
+
+- [#156](https://github.com/chaijs/chai/issues/156) Empty object is eql to empty array
+- [#192](https://github.com/chaijs/chai/issues/192) empty object is eql to a Date object
+- [#194](https://github.com/chaijs/chai/issues/194) refactor deep-equal utility
+
+### CI and Browser Testing
+
+Chai now runs the browser CI suite using [Karma](http://karma-runner.github.io/) directed at
+[SauceLabs](https://saucelabs.com/). This means we get to know where our browser support stands...
+and we get a cool badge:
+
+[![Selenium Test Status](https://saucelabs.com/browser-matrix/logicalparadox.svg)](https://saucelabs.com/u/logicalparadox)
+
+Look for the list of browsers/versions to expand over the coming releases.
+
+- [#195](https://github.com/chaijs/chai/issues/195) karma test framework
+
+## 1.7.2 / 2013-06-27
+
+The following changes are required if you are upgrading from the previous version:
+
+- **Users:**
+ - No changes required.
+- **Plugin Developers:**
+ - No changes required
+- **Core Contributors:**
+ - Refresh `node_modules` folder for updated dependencies.
+
+### Coverage Reporting
+
+Coverage reporting has always been available for core-developers but the data has never been published
+for our end users. In our ongoing effort to improve accountability this data will now be published via
+the [coveralls.io](https://coveralls.io/) service. A badge has been added to the README and the full report
+can be viewed online at the [chai coveralls project](https://coveralls.io/r/chaijs/chai). Furthermore, PRs
+will receive automated messages indicating how their PR impacts test coverage. This service is tied to TravisCI.
+
+### Other Fixes
+
+- [#175](https://github.com/chaijs/chai/issues/175) Add `bower.json`. (Fix ignore all)
+
+## 1.7.1 / 2013-06-24
+
+The following changes are required if you are upgrading from the previous version:
+
+- **Users:**
+ - No changes required.
+- **Plugin Developers:**
+ - No changes required
+- **Core Contributors:**
+ - Refresh `node_modules` folder for updated dependencies.
+
+### Official Bower Support
+
+Support has been added for the Bower Package Manager ([bower.io])(http://bower.io/). Though
+Chai could be installed via Bower in the past, this update adds official support via the `bower.json`
+specification file.
+
+- [#175](https://github.com/chaijs/chai/issues/175) Add `bower.json`.
+
+## 1.7.0 / 2013-06-17
+
+The following changes are required if you are upgrading from the previous version:
+
+- **Users:**
+ - No changes required.
+- **Plugin Developers:**
+ - Review AssertionError update notice.
+- **Core Contributors:**
+ - Refresh `node_modules` folder for updated dependencies.
+
+### AssertionError Update Notice
+
+Chai now uses [chaijs/assertion-error](https://github.com/chaijs/assertion-error) instead an internal
+constructor. This will allow for further iteration/experimentation of the AssertionError constructor
+independant of Chai. Future plans include stack parsing for callsite support.
+
+This update constructor has a different constructor param signature that conforms more with the standard
+`Error` object. If your plugin throws and `AssertionError` directly you will need to update your plugin
+with the new signature.
+
+```js
+var AssertionError = require('chai').AssertionError;
+
+/**
+ * previous
+ *
+ * @param {Object} options
+ */
+
+throw new AssertionError({
+ message: 'An assertion error occurred'
+ , actual: actual
+ , expect: expect
+ , startStackFunction: arguments.callee
+ , showStack: true
+});
+
+/**
+ * new
+ *
+ * @param {String} message
+ * @param {Object} options
+ * @param {Function} start stack function
+ */
+
+throw new AssertionError('An assertion error occurred', {
+ actual: actual
+ , expect: expect
+ , showStack: true
+}, arguments.callee);
+
+// other signatures
+throw new AssertionError('An assertion error occurred');
+throw new AssertionError('An assertion error occurred', null, arguments.callee);
+```
+
+#### External Dependencies
+
+This is the first non-developement dependency for Chai. As Chai continues to evolve we will begin adding
+more; the next will likely be improved type detection and deep equality. With Chai's userbase continually growing
+there is an higher need for accountability and documentation. External dependencies will allow us to iterate and
+test on features independent from our interfaces.
+
+Note: The browser packaged version `chai.js` will ALWAYS contain all dependencies needed to run Chai.
+
+### Community Contributions
+
+- [#169](https://github.com/chaijs/chai/pull/169) Fix deep equal comparison for Date/Regexp types. [@katsgeorgeek](https://github.com/katsgeorgeek)
+- [#171](https://github.com/chaijs/chai/pull/171) Add `assert.notOk()`. [@Bartvds](https://github.com/Bartvds)
+- [#173](https://github.com/chaijs/chai/pull/173) Fix `inspect` utility. [@domenic](https://github.com/domenic)
+
+Thank you to all who took the time to contribute!
+
+## 1.6.1 / 2013-06-05
+
+The following changes are required if you are upgrading from the previous version:
+
+- **Users:**
+ - No changes required.
+- **Plugin Developers:**
+ - No changes required.
+- **Core Contributors:**
+ - Refresh `node_modules` folder for updated developement dependencies.
+
+### Deep Equality
+
+Regular Expressions are now tested as part of all deep equality assertions. In previous versions
+they silently passed for all scenarios. Thanks to [@katsgeorgeek](https://github.com/katsgeorgeek) for the contribution.
+
+### Community Contributions
+
+- [#161](https://github.com/chaijs/chai/pull/161) Fix documented name for assert interface's isDefined method. [@brandonpayton](https://github.com/brandonpayton)
+- [#168](https://github.com/chaijs/chai/pull/168) Fix comparison equality of two regexps for when using deep equality. [@katsgeorgeek](https://github.com/katsgeorgeek)
+
+Thank you to all who took the time to contribute!
+
+### Additional Notes
+
+- Mocha has been locked at version `1.8.x` to ensure `mocha-phantomjs` compatibility.
+
+## 1.6.0 / 2013-04-29
+
+The following changes are required if you are upgrading from the previous version:
+
+- **Users:**
+ - No changes required.
+- **Plugin Developers:**
+ - No changes required.
+- **Core Contributors:**
+ - Refresh `node_modules` folder for updated developement dependencies.
+
+### New Assertions
+
+#### Array Members Inclusion
+
+Asserts that the target is a superset of `set`, or that the target and `set` have the same members.
+Order is not taken into account. Thanks to [@NickHeiner](https://github.com/NickHeiner) for the contribution.
+
+```js
+// (expect/should) full set
+expect([4, 2]).to.have.members([2, 4]);
+expect([5, 2]).to.not.have.members([5, 2, 1]);
+
+// (expect/should) inclusion
+expect([1, 2, 3]).to.include.members([3, 2]);
+expect([1, 2, 3]).to.not.include.members([3, 2, 8]);
+
+// (assert) full set
+assert.sameMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'same members');
+
+// (assert) inclusion
+assert.includeMembers([ 1, 2, 3 ], [ 2, 1 ], 'include members');
+
+```
+
+#### Non-inclusion for Assert Interface
+
+Most `assert` functions have a negative version, like `instanceOf()` has a corresponding `notInstaceOf()`.
+However `include()` did not have a corresponding `notInclude()`. This has been added.
+
+```js
+assert.notInclude([ 1, 2, 3 ], 8);
+assert.notInclude('foobar', 'baz');
+```
+
+### Community Contributions
+
+- [#140](https://github.com/chaijs/chai/pull/140) Restore `call`/`apply` methods for plugin interface. [@RubenVerborgh](https://github.com/RubenVerborgh)
+- [#148](https://github.com/chaijs/chai/issues/148)/[#153](https://github.com/chaijs/chai/pull/153) Add `members` and `include.members` assertions. [#NickHeiner](https://github.com/NickHeiner)
+
+Thank you to all who took time to contribute!
+
+### Other Bug Fixes
+
+- [#142](https://github.com/chaijs/chai/issues/142) `assert#include` will no longer silently pass on wrong-type haystack.
+- [#158](https://github.com/chaijs/chai/issues/158) `assert#notInclude` has been added.
+- Travis-CI now tests Node.js `v0.10.x`. Support for `v0.6.x` has been removed. `v0.8.x` is still tested as before.
+
+## 1.5.0 / 2013-02-03
+
+### Migration Requirements
+
+The following changes are required if you are upgrading from the previous version:
+
+- **Users:**
+ - _Update [2013-02-04]:_ Some users may notice a small subset of deep equality assertions will no longer pass. This is the result of
+ [#120](https://github.com/chaijs/chai/issues/120), an improvement to our deep equality algorithm. Users will need to revise their assertions
+ to be more granular should this occur. Further information: [#139](https://github.com/chaijs/chai/issues/139).
+- **Plugin Developers:**
+ - No changes required.
+- **Core Contributors:**
+ - Refresh `node_modules` folder for updated developement dependencies.
+
+### Community Contributions
+
+- [#126](https://github.com/chaijs/chai/pull/126): Add `eqls` alias for `eql`. [@RubenVerborgh](https://github.com/RubenVerborgh)
+- [#127](https://github.com/chaijs/chai/issues/127): Performance refactor for chainable methods. [@RubenVerborgh](https://github.com/RubenVerborgh)
+- [#133](https://github.com/chaijs/chai/pull/133): Assertion `.throw` support for primitives. [@RubenVerborgh](https://github.com/RubenVerborgh)
+- [#137](https://github.com/chaijs/chai/issues/137): Assertion `.throw` support for empty messages. [@timnew](https://github.com/timnew)
+- [#136](https://github.com/chaijs/chai/pull/136): Fix backward negation messages when using `.above()` and `.below()`. [@whatthejeff](https://github.com/whatthejeff)
+
+Thank you to all who took time to contribute!
+
+### Other Bug Fixes
+
+- Improve type detection of `.a()`/`.an()` to work in cross-browser scenarios.
+- [#116](https://github.com/chaijs/chai/issues/116): `.throw()` has cleaner display of errors when WebKit browsers.
+- [#120](https://github.com/chaijs/chai/issues/120): `.eql()` now works to compare dom nodes in browsers.
+
+
+### Usage Updates
+
+#### For Users
+
+**1. Component Support:** Chai now included the proper configuration to be installed as a
+[component](https://github.com/component/component). Component users are encouraged to consult
+[chaijs.com](http://chaijs.com) for the latest version number as using the master branch
+does not gaurantee stability.
+
+```js
+// relevant component.json
+ devDependencies: {
+ "chaijs/chai": "1.5.0"
+ }
+```
+
+Alternatively, bleeding-edge is available:
+
+ $ component install chaijs/chai
+
+**2. Configurable showDiff:** Some test runners (such as [mocha](http://visionmedia.github.com/mocha/))
+include support for showing the diff of strings and objects when an equality error occurs. Chai has
+already included support for this, however some users may not prefer this display behavior. To revert to
+no diff display, the following configuration is available:
+
+```js
+chai.Assertion.showDiff = false; // diff output disabled
+chai.Assertion.showDiff = true; // default, diff output enabled
+```
+
+#### For Plugin Developers
+
+**1. New Utility - type**: The new utility `.type()` is available as a better implementation of `typeof`
+that can be used cross-browser. It handles the inconsistencies of Array, `null`, and `undefined` detection.
+
+- **@param** _{Mixed}_ object to detect type of
+- **@return** _{String}_ object type
+
+```js
+chai.use(function (c, utils) {
+ // some examples
+ utils.type({}); // 'object'
+ utils.type(null); // `null'
+ utils.type(undefined); // `undefined`
+ utils.type([]); // `array`
+});
+```
+
+#### For Core Contributors
+
+**1. Browser Testing**: Browser testing of the `./chai.js` file is now available in the command line
+via PhantomJS. `make test` and Travis-CI will now also rebuild and test `./chai.js`. Consequently, all
+pull requests will now be browser tested in this way.
+
+_Note: Contributors opening pull requests should still NOT include the browser build._
+
+**2. SauceLabs Testing**: Early SauceLab support has been enabled with the file `./support/mocha-cloud.js`.
+Those interested in trying it out should create a free [Open Sauce](https://saucelabs.com/signup/plan) account
+and include their credentials in `./test/auth/sauce.json`.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/bower.json
new file mode 100644
index 00000000000..af2ee029b73
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/bower.json
@@ -0,0 +1,26 @@
+{
+ "name": "chai",
+ "description": "BDD/TDD assertion library for node.js and the browser. Test framework agnostic.",
+ "license": "MIT",
+ "keywords": [
+ "test",
+ "assertion",
+ "assert",
+ "testing",
+ "chai"
+ ],
+ "main": "chai.js",
+ "ignore": [
+ "build",
+ "components",
+ "lib",
+ "node_modules",
+ "support",
+ "test",
+ "index.js",
+ "Makefile",
+ ".*"
+ ],
+ "dependencies": {},
+ "devDependencies": {}
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/chai.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/chai.js
new file mode 100644
index 00000000000..1d30296a41b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/chai.js
@@ -0,0 +1,6142 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.chai = f()}})(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);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+module.exports = require('./lib/chai');
+
+},{"./lib/chai":2}],2:[function(require,module,exports){
+/*!
+ * chai
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+var used = []
+ , exports = module.exports = {};
+
+/*!
+ * Chai version
+ */
+
+exports.version = '3.5.0';
+
+/*!
+ * Assertion Error
+ */
+
+exports.AssertionError = require('assertion-error');
+
+/*!
+ * Utils for plugins (not exported)
+ */
+
+var util = require('./chai/utils');
+
+/**
+ * # .use(function)
+ *
+ * Provides a way to extend the internals of Chai
+ *
+ * @param {Function}
+ * @returns {this} for chaining
+ * @api public
+ */
+
+exports.use = function (fn) {
+ if (!~used.indexOf(fn)) {
+ fn(this, util);
+ used.push(fn);
+ }
+
+ return this;
+};
+
+/*!
+ * Utility Functions
+ */
+
+exports.util = util;
+
+/*!
+ * Configuration
+ */
+
+var config = require('./chai/config');
+exports.config = config;
+
+/*!
+ * Primary `Assertion` prototype
+ */
+
+var assertion = require('./chai/assertion');
+exports.use(assertion);
+
+/*!
+ * Core Assertions
+ */
+
+var core = require('./chai/core/assertions');
+exports.use(core);
+
+/*!
+ * Expect interface
+ */
+
+var expect = require('./chai/interface/expect');
+exports.use(expect);
+
+/*!
+ * Should interface
+ */
+
+var should = require('./chai/interface/should');
+exports.use(should);
+
+/*!
+ * Assert interface
+ */
+
+var assert = require('./chai/interface/assert');
+exports.use(assert);
+
+},{"./chai/assertion":3,"./chai/config":4,"./chai/core/assertions":5,"./chai/interface/assert":6,"./chai/interface/expect":7,"./chai/interface/should":8,"./chai/utils":22,"assertion-error":30}],3:[function(require,module,exports){
+/*!
+ * chai
+ * http://chaijs.com
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+var config = require('./config');
+
+module.exports = function (_chai, util) {
+ /*!
+ * Module dependencies.
+ */
+
+ var AssertionError = _chai.AssertionError
+ , flag = util.flag;
+
+ /*!
+ * Module export.
+ */
+
+ _chai.Assertion = Assertion;
+
+ /*!
+ * Assertion Constructor
+ *
+ * Creates object for chaining.
+ *
+ * @api private
+ */
+
+ function Assertion (obj, msg, stack) {
+ flag(this, 'ssfi', stack || arguments.callee);
+ flag(this, 'object', obj);
+ flag(this, 'message', msg);
+ }
+
+ Object.defineProperty(Assertion, 'includeStack', {
+ get: function() {
+ console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.');
+ return config.includeStack;
+ },
+ set: function(value) {
+ console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.');
+ config.includeStack = value;
+ }
+ });
+
+ Object.defineProperty(Assertion, 'showDiff', {
+ get: function() {
+ console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.');
+ return config.showDiff;
+ },
+ set: function(value) {
+ console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.');
+ config.showDiff = value;
+ }
+ });
+
+ Assertion.addProperty = function (name, fn) {
+ util.addProperty(this.prototype, name, fn);
+ };
+
+ Assertion.addMethod = function (name, fn) {
+ util.addMethod(this.prototype, name, fn);
+ };
+
+ Assertion.addChainableMethod = function (name, fn, chainingBehavior) {
+ util.addChainableMethod(this.prototype, name, fn, chainingBehavior);
+ };
+
+ Assertion.overwriteProperty = function (name, fn) {
+ util.overwriteProperty(this.prototype, name, fn);
+ };
+
+ Assertion.overwriteMethod = function (name, fn) {
+ util.overwriteMethod(this.prototype, name, fn);
+ };
+
+ Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) {
+ util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior);
+ };
+
+ /**
+ * ### .assert(expression, message, negateMessage, expected, actual, showDiff)
+ *
+ * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass.
+ *
+ * @name assert
+ * @param {Philosophical} expression to be tested
+ * @param {String|Function} message or function that returns message to display if expression fails
+ * @param {String|Function} negatedMessage or function that returns negatedMessage to display if negated expression fails
+ * @param {Mixed} expected value (remember to check for negation)
+ * @param {Mixed} actual (optional) will default to `this.obj`
+ * @param {Boolean} showDiff (optional) when set to `true`, assert will display a diff in addition to the message if expression fails
+ * @api private
+ */
+
+ Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) {
+ var ok = util.test(this, arguments);
+ if (true !== showDiff) showDiff = false;
+ if (true !== config.showDiff) showDiff = false;
+
+ if (!ok) {
+ var msg = util.getMessage(this, arguments)
+ , actual = util.getActual(this, arguments);
+ throw new AssertionError(msg, {
+ actual: actual
+ , expected: expected
+ , showDiff: showDiff
+ }, (config.includeStack) ? this.assert : flag(this, 'ssfi'));
+ }
+ };
+
+ /*!
+ * ### ._obj
+ *
+ * Quick reference to stored `actual` value for plugin developers.
+ *
+ * @api private
+ */
+
+ Object.defineProperty(Assertion.prototype, '_obj',
+ { get: function () {
+ return flag(this, 'object');
+ }
+ , set: function (val) {
+ flag(this, 'object', val);
+ }
+ });
+};
+
+},{"./config":4}],4:[function(require,module,exports){
+module.exports = {
+
+ /**
+ * ### config.includeStack
+ *
+ * User configurable property, influences whether stack trace
+ * is included in Assertion error message. Default of false
+ * suppresses stack trace in the error message.
+ *
+ * chai.config.includeStack = true; // enable stack on error
+ *
+ * @param {Boolean}
+ * @api public
+ */
+
+ includeStack: false,
+
+ /**
+ * ### config.showDiff
+ *
+ * User configurable property, influences whether or not
+ * the `showDiff` flag should be included in the thrown
+ * AssertionErrors. `false` will always be `false`; `true`
+ * will be true when the assertion has requested a diff
+ * be shown.
+ *
+ * @param {Boolean}
+ * @api public
+ */
+
+ showDiff: true,
+
+ /**
+ * ### config.truncateThreshold
+ *
+ * User configurable property, sets length threshold for actual and
+ * expected values in assertion errors. If this threshold is exceeded, for
+ * example for large data structures, the value is replaced with something
+ * like `[ Array(3) ]` or `{ Object (prop1, prop2) }`.
+ *
+ * Set it to zero if you want to disable truncating altogether.
+ *
+ * This is especially userful when doing assertions on arrays: having this
+ * set to a reasonable large value makes the failure messages readily
+ * inspectable.
+ *
+ * chai.config.truncateThreshold = 0; // disable truncating
+ *
+ * @param {Number}
+ * @api public
+ */
+
+ truncateThreshold: 40
+
+};
+
+},{}],5:[function(require,module,exports){
+/*!
+ * chai
+ * http://chaijs.com
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+module.exports = function (chai, _) {
+ var Assertion = chai.Assertion
+ , toString = Object.prototype.toString
+ , flag = _.flag;
+
+ /**
+ * ### Language Chains
+ *
+ * The following are provided as chainable getters to
+ * improve the readability of your assertions. They
+ * do not provide testing capabilities unless they
+ * have been overwritten by a plugin.
+ *
+ * **Chains**
+ *
+ * - to
+ * - be
+ * - been
+ * - is
+ * - that
+ * - which
+ * - and
+ * - has
+ * - have
+ * - with
+ * - at
+ * - of
+ * - same
+ *
+ * @name language chains
+ * @namespace BDD
+ * @api public
+ */
+
+ [ 'to', 'be', 'been'
+ , 'is', 'and', 'has', 'have'
+ , 'with', 'that', 'which', 'at'
+ , 'of', 'same' ].forEach(function (chain) {
+ Assertion.addProperty(chain, function () {
+ return this;
+ });
+ });
+
+ /**
+ * ### .not
+ *
+ * Negates any of assertions following in the chain.
+ *
+ * expect(foo).to.not.equal('bar');
+ * expect(goodFn).to.not.throw(Error);
+ * expect({ foo: 'baz' }).to.have.property('foo')
+ * .and.not.equal('bar');
+ *
+ * @name not
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addProperty('not', function () {
+ flag(this, 'negate', true);
+ });
+
+ /**
+ * ### .deep
+ *
+ * Sets the `deep` flag, later used by the `equal` and
+ * `property` assertions.
+ *
+ * expect(foo).to.deep.equal({ bar: 'baz' });
+ * expect({ foo: { bar: { baz: 'quux' } } })
+ * .to.have.deep.property('foo.bar.baz', 'quux');
+ *
+ * `.deep.property` special characters can be escaped
+ * by adding two slashes before the `.` or `[]`.
+ *
+ * var deepCss = { '.link': { '[target]': 42 }};
+ * expect(deepCss).to.have.deep.property('\\.link.\\[target\\]', 42);
+ *
+ * @name deep
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addProperty('deep', function () {
+ flag(this, 'deep', true);
+ });
+
+ /**
+ * ### .any
+ *
+ * Sets the `any` flag, (opposite of the `all` flag)
+ * later used in the `keys` assertion.
+ *
+ * expect(foo).to.have.any.keys('bar', 'baz');
+ *
+ * @name any
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addProperty('any', function () {
+ flag(this, 'any', true);
+ flag(this, 'all', false)
+ });
+
+
+ /**
+ * ### .all
+ *
+ * Sets the `all` flag (opposite of the `any` flag)
+ * later used by the `keys` assertion.
+ *
+ * expect(foo).to.have.all.keys('bar', 'baz');
+ *
+ * @name all
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addProperty('all', function () {
+ flag(this, 'all', true);
+ flag(this, 'any', false);
+ });
+
+ /**
+ * ### .a(type)
+ *
+ * The `a` and `an` assertions are aliases that can be
+ * used either as language chains or to assert a value's
+ * type.
+ *
+ * // typeof
+ * expect('test').to.be.a('string');
+ * expect({ foo: 'bar' }).to.be.an('object');
+ * expect(null).to.be.a('null');
+ * expect(undefined).to.be.an('undefined');
+ * expect(new Error).to.be.an('error');
+ * expect(new Promise).to.be.a('promise');
+ * expect(new Float32Array()).to.be.a('float32array');
+ * expect(Symbol()).to.be.a('symbol');
+ *
+ * // es6 overrides
+ * expect({[Symbol.toStringTag]:()=>'foo'}).to.be.a('foo');
+ *
+ * // language chain
+ * expect(foo).to.be.an.instanceof(Foo);
+ *
+ * @name a
+ * @alias an
+ * @param {String} type
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ function an (type, msg) {
+ if (msg) flag(this, 'message', msg);
+ type = type.toLowerCase();
+ var obj = flag(this, 'object')
+ , article = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(type.charAt(0)) ? 'an ' : 'a ';
+
+ this.assert(
+ type === _.type(obj)
+ , 'expected #{this} to be ' + article + type
+ , 'expected #{this} not to be ' + article + type
+ );
+ }
+
+ Assertion.addChainableMethod('an', an);
+ Assertion.addChainableMethod('a', an);
+
+ /**
+ * ### .include(value)
+ *
+ * The `include` and `contain` assertions can be used as either property
+ * based language chains or as methods to assert the inclusion of an object
+ * in an array or a substring in a string. When used as language chains,
+ * they toggle the `contains` flag for the `keys` assertion.
+ *
+ * expect([1,2,3]).to.include(2);
+ * expect('foobar').to.contain('foo');
+ * expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo');
+ *
+ * @name include
+ * @alias contain
+ * @alias includes
+ * @alias contains
+ * @param {Object|String|Number} obj
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ function includeChainingBehavior () {
+ flag(this, 'contains', true);
+ }
+
+ function include (val, msg) {
+ _.expectTypes(this, ['array', 'object', 'string']);
+
+ if (msg) flag(this, 'message', msg);
+ var obj = flag(this, 'object');
+ var expected = false;
+
+ if (_.type(obj) === 'array' && _.type(val) === 'object') {
+ for (var i in obj) {
+ if (_.eql(obj[i], val)) {
+ expected = true;
+ break;
+ }
+ }
+ } else if (_.type(val) === 'object') {
+ if (!flag(this, 'negate')) {
+ for (var k in val) new Assertion(obj).property(k, val[k]);
+ return;
+ }
+ var subset = {};
+ for (var k in val) subset[k] = obj[k];
+ expected = _.eql(subset, val);
+ } else {
+ expected = (obj != undefined) && ~obj.indexOf(val);
+ }
+ this.assert(
+ expected
+ , 'expected #{this} to include ' + _.inspect(val)
+ , 'expected #{this} to not include ' + _.inspect(val));
+ }
+
+ Assertion.addChainableMethod('include', include, includeChainingBehavior);
+ Assertion.addChainableMethod('contain', include, includeChainingBehavior);
+ Assertion.addChainableMethod('contains', include, includeChainingBehavior);
+ Assertion.addChainableMethod('includes', include, includeChainingBehavior);
+
+ /**
+ * ### .ok
+ *
+ * Asserts that the target is truthy.
+ *
+ * expect('everything').to.be.ok;
+ * expect(1).to.be.ok;
+ * expect(false).to.not.be.ok;
+ * expect(undefined).to.not.be.ok;
+ * expect(null).to.not.be.ok;
+ *
+ * @name ok
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addProperty('ok', function () {
+ this.assert(
+ flag(this, 'object')
+ , 'expected #{this} to be truthy'
+ , 'expected #{this} to be falsy');
+ });
+
+ /**
+ * ### .true
+ *
+ * Asserts that the target is `true`.
+ *
+ * expect(true).to.be.true;
+ * expect(1).to.not.be.true;
+ *
+ * @name true
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addProperty('true', function () {
+ this.assert(
+ true === flag(this, 'object')
+ , 'expected #{this} to be true'
+ , 'expected #{this} to be false'
+ , this.negate ? false : true
+ );
+ });
+
+ /**
+ * ### .false
+ *
+ * Asserts that the target is `false`.
+ *
+ * expect(false).to.be.false;
+ * expect(0).to.not.be.false;
+ *
+ * @name false
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addProperty('false', function () {
+ this.assert(
+ false === flag(this, 'object')
+ , 'expected #{this} to be false'
+ , 'expected #{this} to be true'
+ , this.negate ? true : false
+ );
+ });
+
+ /**
+ * ### .null
+ *
+ * Asserts that the target is `null`.
+ *
+ * expect(null).to.be.null;
+ * expect(undefined).to.not.be.null;
+ *
+ * @name null
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addProperty('null', function () {
+ this.assert(
+ null === flag(this, 'object')
+ , 'expected #{this} to be null'
+ , 'expected #{this} not to be null'
+ );
+ });
+
+ /**
+ * ### .undefined
+ *
+ * Asserts that the target is `undefined`.
+ *
+ * expect(undefined).to.be.undefined;
+ * expect(null).to.not.be.undefined;
+ *
+ * @name undefined
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addProperty('undefined', function () {
+ this.assert(
+ undefined === flag(this, 'object')
+ , 'expected #{this} to be undefined'
+ , 'expected #{this} not to be undefined'
+ );
+ });
+
+ /**
+ * ### .NaN
+ * Asserts that the target is `NaN`.
+ *
+ * expect('foo').to.be.NaN;
+ * expect(4).not.to.be.NaN;
+ *
+ * @name NaN
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addProperty('NaN', function () {
+ this.assert(
+ isNaN(flag(this, 'object'))
+ , 'expected #{this} to be NaN'
+ , 'expected #{this} not to be NaN'
+ );
+ });
+
+ /**
+ * ### .exist
+ *
+ * Asserts that the target is neither `null` nor `undefined`.
+ *
+ * var foo = 'hi'
+ * , bar = null
+ * , baz;
+ *
+ * expect(foo).to.exist;
+ * expect(bar).to.not.exist;
+ * expect(baz).to.not.exist;
+ *
+ * @name exist
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addProperty('exist', function () {
+ this.assert(
+ null != flag(this, 'object')
+ , 'expected #{this} to exist'
+ , 'expected #{this} to not exist'
+ );
+ });
+
+
+ /**
+ * ### .empty
+ *
+ * Asserts that the target's length is `0`. For arrays and strings, it checks
+ * the `length` property. For objects, it gets the count of
+ * enumerable keys.
+ *
+ * expect([]).to.be.empty;
+ * expect('').to.be.empty;
+ * expect({}).to.be.empty;
+ *
+ * @name empty
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addProperty('empty', function () {
+ var obj = flag(this, 'object')
+ , expected = obj;
+
+ if (Array.isArray(obj) || 'string' === typeof object) {
+ expected = obj.length;
+ } else if (typeof obj === 'object') {
+ expected = Object.keys(obj).length;
+ }
+
+ this.assert(
+ !expected
+ , 'expected #{this} to be empty'
+ , 'expected #{this} not to be empty'
+ );
+ });
+
+ /**
+ * ### .arguments
+ *
+ * Asserts that the target is an arguments object.
+ *
+ * function test () {
+ * expect(arguments).to.be.arguments;
+ * }
+ *
+ * @name arguments
+ * @alias Arguments
+ * @namespace BDD
+ * @api public
+ */
+
+ function checkArguments () {
+ var obj = flag(this, 'object')
+ , type = Object.prototype.toString.call(obj);
+ this.assert(
+ '[object Arguments]' === type
+ , 'expected #{this} to be arguments but got ' + type
+ , 'expected #{this} to not be arguments'
+ );
+ }
+
+ Assertion.addProperty('arguments', checkArguments);
+ Assertion.addProperty('Arguments', checkArguments);
+
+ /**
+ * ### .equal(value)
+ *
+ * Asserts that the target is strictly equal (`===`) to `value`.
+ * Alternately, if the `deep` flag is set, asserts that
+ * the target is deeply equal to `value`.
+ *
+ * expect('hello').to.equal('hello');
+ * expect(42).to.equal(42);
+ * expect(1).to.not.equal(true);
+ * expect({ foo: 'bar' }).to.not.equal({ foo: 'bar' });
+ * expect({ foo: 'bar' }).to.deep.equal({ foo: 'bar' });
+ *
+ * @name equal
+ * @alias equals
+ * @alias eq
+ * @alias deep.equal
+ * @param {Mixed} value
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ function assertEqual (val, msg) {
+ if (msg) flag(this, 'message', msg);
+ var obj = flag(this, 'object');
+ if (flag(this, 'deep')) {
+ return this.eql(val);
+ } else {
+ this.assert(
+ val === obj
+ , 'expected #{this} to equal #{exp}'
+ , 'expected #{this} to not equal #{exp}'
+ , val
+ , this._obj
+ , true
+ );
+ }
+ }
+
+ Assertion.addMethod('equal', assertEqual);
+ Assertion.addMethod('equals', assertEqual);
+ Assertion.addMethod('eq', assertEqual);
+
+ /**
+ * ### .eql(value)
+ *
+ * Asserts that the target is deeply equal to `value`.
+ *
+ * expect({ foo: 'bar' }).to.eql({ foo: 'bar' });
+ * expect([ 1, 2, 3 ]).to.eql([ 1, 2, 3 ]);
+ *
+ * @name eql
+ * @alias eqls
+ * @param {Mixed} value
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ function assertEql(obj, msg) {
+ if (msg) flag(this, 'message', msg);
+ this.assert(
+ _.eql(obj, flag(this, 'object'))
+ , 'expected #{this} to deeply equal #{exp}'
+ , 'expected #{this} to not deeply equal #{exp}'
+ , obj
+ , this._obj
+ , true
+ );
+ }
+
+ Assertion.addMethod('eql', assertEql);
+ Assertion.addMethod('eqls', assertEql);
+
+ /**
+ * ### .above(value)
+ *
+ * Asserts that the target is greater than `value`.
+ *
+ * expect(10).to.be.above(5);
+ *
+ * Can also be used in conjunction with `length` to
+ * assert a minimum length. The benefit being a
+ * more informative error message than if the length
+ * was supplied directly.
+ *
+ * expect('foo').to.have.length.above(2);
+ * expect([ 1, 2, 3 ]).to.have.length.above(2);
+ *
+ * @name above
+ * @alias gt
+ * @alias greaterThan
+ * @param {Number} value
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ function assertAbove (n, msg) {
+ if (msg) flag(this, 'message', msg);
+ var obj = flag(this, 'object');
+ if (flag(this, 'doLength')) {
+ new Assertion(obj, msg).to.have.property('length');
+ var len = obj.length;
+ this.assert(
+ len > n
+ , 'expected #{this} to have a length above #{exp} but got #{act}'
+ , 'expected #{this} to not have a length above #{exp}'
+ , n
+ , len
+ );
+ } else {
+ this.assert(
+ obj > n
+ , 'expected #{this} to be above ' + n
+ , 'expected #{this} to be at most ' + n
+ );
+ }
+ }
+
+ Assertion.addMethod('above', assertAbove);
+ Assertion.addMethod('gt', assertAbove);
+ Assertion.addMethod('greaterThan', assertAbove);
+
+ /**
+ * ### .least(value)
+ *
+ * Asserts that the target is greater than or equal to `value`.
+ *
+ * expect(10).to.be.at.least(10);
+ *
+ * Can also be used in conjunction with `length` to
+ * assert a minimum length. The benefit being a
+ * more informative error message than if the length
+ * was supplied directly.
+ *
+ * expect('foo').to.have.length.of.at.least(2);
+ * expect([ 1, 2, 3 ]).to.have.length.of.at.least(3);
+ *
+ * @name least
+ * @alias gte
+ * @param {Number} value
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ function assertLeast (n, msg) {
+ if (msg) flag(this, 'message', msg);
+ var obj = flag(this, 'object');
+ if (flag(this, 'doLength')) {
+ new Assertion(obj, msg).to.have.property('length');
+ var len = obj.length;
+ this.assert(
+ len >= n
+ , 'expected #{this} to have a length at least #{exp} but got #{act}'
+ , 'expected #{this} to have a length below #{exp}'
+ , n
+ , len
+ );
+ } else {
+ this.assert(
+ obj >= n
+ , 'expected #{this} to be at least ' + n
+ , 'expected #{this} to be below ' + n
+ );
+ }
+ }
+
+ Assertion.addMethod('least', assertLeast);
+ Assertion.addMethod('gte', assertLeast);
+
+ /**
+ * ### .below(value)
+ *
+ * Asserts that the target is less than `value`.
+ *
+ * expect(5).to.be.below(10);
+ *
+ * Can also be used in conjunction with `length` to
+ * assert a maximum length. The benefit being a
+ * more informative error message than if the length
+ * was supplied directly.
+ *
+ * expect('foo').to.have.length.below(4);
+ * expect([ 1, 2, 3 ]).to.have.length.below(4);
+ *
+ * @name below
+ * @alias lt
+ * @alias lessThan
+ * @param {Number} value
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ function assertBelow (n, msg) {
+ if (msg) flag(this, 'message', msg);
+ var obj = flag(this, 'object');
+ if (flag(this, 'doLength')) {
+ new Assertion(obj, msg).to.have.property('length');
+ var len = obj.length;
+ this.assert(
+ len < n
+ , 'expected #{this} to have a length below #{exp} but got #{act}'
+ , 'expected #{this} to not have a length below #{exp}'
+ , n
+ , len
+ );
+ } else {
+ this.assert(
+ obj < n
+ , 'expected #{this} to be below ' + n
+ , 'expected #{this} to be at least ' + n
+ );
+ }
+ }
+
+ Assertion.addMethod('below', assertBelow);
+ Assertion.addMethod('lt', assertBelow);
+ Assertion.addMethod('lessThan', assertBelow);
+
+ /**
+ * ### .most(value)
+ *
+ * Asserts that the target is less than or equal to `value`.
+ *
+ * expect(5).to.be.at.most(5);
+ *
+ * Can also be used in conjunction with `length` to
+ * assert a maximum length. The benefit being a
+ * more informative error message than if the length
+ * was supplied directly.
+ *
+ * expect('foo').to.have.length.of.at.most(4);
+ * expect([ 1, 2, 3 ]).to.have.length.of.at.most(3);
+ *
+ * @name most
+ * @alias lte
+ * @param {Number} value
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ function assertMost (n, msg) {
+ if (msg) flag(this, 'message', msg);
+ var obj = flag(this, 'object');
+ if (flag(this, 'doLength')) {
+ new Assertion(obj, msg).to.have.property('length');
+ var len = obj.length;
+ this.assert(
+ len <= n
+ , 'expected #{this} to have a length at most #{exp} but got #{act}'
+ , 'expected #{this} to have a length above #{exp}'
+ , n
+ , len
+ );
+ } else {
+ this.assert(
+ obj <= n
+ , 'expected #{this} to be at most ' + n
+ , 'expected #{this} to be above ' + n
+ );
+ }
+ }
+
+ Assertion.addMethod('most', assertMost);
+ Assertion.addMethod('lte', assertMost);
+
+ /**
+ * ### .within(start, finish)
+ *
+ * Asserts that the target is within a range.
+ *
+ * expect(7).to.be.within(5,10);
+ *
+ * Can also be used in conjunction with `length` to
+ * assert a length range. The benefit being a
+ * more informative error message than if the length
+ * was supplied directly.
+ *
+ * expect('foo').to.have.length.within(2,4);
+ * expect([ 1, 2, 3 ]).to.have.length.within(2,4);
+ *
+ * @name within
+ * @param {Number} start lowerbound inclusive
+ * @param {Number} finish upperbound inclusive
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addMethod('within', function (start, finish, msg) {
+ if (msg) flag(this, 'message', msg);
+ var obj = flag(this, 'object')
+ , range = start + '..' + finish;
+ if (flag(this, 'doLength')) {
+ new Assertion(obj, msg).to.have.property('length');
+ var len = obj.length;
+ this.assert(
+ len >= start && len <= finish
+ , 'expected #{this} to have a length within ' + range
+ , 'expected #{this} to not have a length within ' + range
+ );
+ } else {
+ this.assert(
+ obj >= start && obj <= finish
+ , 'expected #{this} to be within ' + range
+ , 'expected #{this} to not be within ' + range
+ );
+ }
+ });
+
+ /**
+ * ### .instanceof(constructor)
+ *
+ * Asserts that the target is an instance of `constructor`.
+ *
+ * var Tea = function (name) { this.name = name; }
+ * , Chai = new Tea('chai');
+ *
+ * expect(Chai).to.be.an.instanceof(Tea);
+ * expect([ 1, 2, 3 ]).to.be.instanceof(Array);
+ *
+ * @name instanceof
+ * @param {Constructor} constructor
+ * @param {String} message _optional_
+ * @alias instanceOf
+ * @namespace BDD
+ * @api public
+ */
+
+ function assertInstanceOf (constructor, msg) {
+ if (msg) flag(this, 'message', msg);
+ var name = _.getName(constructor);
+ this.assert(
+ flag(this, 'object') instanceof constructor
+ , 'expected #{this} to be an instance of ' + name
+ , 'expected #{this} to not be an instance of ' + name
+ );
+ };
+
+ Assertion.addMethod('instanceof', assertInstanceOf);
+ Assertion.addMethod('instanceOf', assertInstanceOf);
+
+ /**
+ * ### .property(name, [value])
+ *
+ * Asserts that the target has a property `name`, optionally asserting that
+ * the value of that property is strictly equal to `value`.
+ * If the `deep` flag is set, you can use dot- and bracket-notation for deep
+ * references into objects and arrays.
+ *
+ * // simple referencing
+ * var obj = { foo: 'bar' };
+ * expect(obj).to.have.property('foo');
+ * expect(obj).to.have.property('foo', 'bar');
+ *
+ * // deep referencing
+ * var deepObj = {
+ * green: { tea: 'matcha' }
+ * , teas: [ 'chai', 'matcha', { tea: 'konacha' } ]
+ * };
+ *
+ * expect(deepObj).to.have.deep.property('green.tea', 'matcha');
+ * expect(deepObj).to.have.deep.property('teas[1]', 'matcha');
+ * expect(deepObj).to.have.deep.property('teas[2].tea', 'konacha');
+ *
+ * You can also use an array as the starting point of a `deep.property`
+ * assertion, or traverse nested arrays.
+ *
+ * var arr = [
+ * [ 'chai', 'matcha', 'konacha' ]
+ * , [ { tea: 'chai' }
+ * , { tea: 'matcha' }
+ * , { tea: 'konacha' } ]
+ * ];
+ *
+ * expect(arr).to.have.deep.property('[0][1]', 'matcha');
+ * expect(arr).to.have.deep.property('[1][2].tea', 'konacha');
+ *
+ * Furthermore, `property` changes the subject of the assertion
+ * to be the value of that property from the original object. This
+ * permits for further chainable assertions on that property.
+ *
+ * expect(obj).to.have.property('foo')
+ * .that.is.a('string');
+ * expect(deepObj).to.have.property('green')
+ * .that.is.an('object')
+ * .that.deep.equals({ tea: 'matcha' });
+ * expect(deepObj).to.have.property('teas')
+ * .that.is.an('array')
+ * .with.deep.property('[2]')
+ * .that.deep.equals({ tea: 'konacha' });
+ *
+ * Note that dots and bracket in `name` must be backslash-escaped when
+ * the `deep` flag is set, while they must NOT be escaped when the `deep`
+ * flag is not set.
+ *
+ * // simple referencing
+ * var css = { '.link[target]': 42 };
+ * expect(css).to.have.property('.link[target]', 42);
+ *
+ * // deep referencing
+ * var deepCss = { '.link': { '[target]': 42 }};
+ * expect(deepCss).to.have.deep.property('\\.link.\\[target\\]', 42);
+ *
+ * @name property
+ * @alias deep.property
+ * @param {String} name
+ * @param {Mixed} value (optional)
+ * @param {String} message _optional_
+ * @returns value of property for chaining
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addMethod('property', function (name, val, msg) {
+ if (msg) flag(this, 'message', msg);
+
+ var isDeep = !!flag(this, 'deep')
+ , descriptor = isDeep ? 'deep property ' : 'property '
+ , negate = flag(this, 'negate')
+ , obj = flag(this, 'object')
+ , pathInfo = isDeep ? _.getPathInfo(name, obj) : null
+ , hasProperty = isDeep
+ ? pathInfo.exists
+ : _.hasProperty(name, obj)
+ , value = isDeep
+ ? pathInfo.value
+ : obj[name];
+
+ if (negate && arguments.length > 1) {
+ if (undefined === value) {
+ msg = (msg != null) ? msg + ': ' : '';
+ throw new Error(msg + _.inspect(obj) + ' has no ' + descriptor + _.inspect(name));
+ }
+ } else {
+ this.assert(
+ hasProperty
+ , 'expected #{this} to have a ' + descriptor + _.inspect(name)
+ , 'expected #{this} to not have ' + descriptor + _.inspect(name));
+ }
+
+ if (arguments.length > 1) {
+ this.assert(
+ val === value
+ , 'expected #{this} to have a ' + descriptor + _.inspect(name) + ' of #{exp}, but got #{act}'
+ , 'expected #{this} to not have a ' + descriptor + _.inspect(name) + ' of #{act}'
+ , val
+ , value
+ );
+ }
+
+ flag(this, 'object', value);
+ });
+
+
+ /**
+ * ### .ownProperty(name)
+ *
+ * Asserts that the target has an own property `name`.
+ *
+ * expect('test').to.have.ownProperty('length');
+ *
+ * @name ownProperty
+ * @alias haveOwnProperty
+ * @param {String} name
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ function assertOwnProperty (name, msg) {
+ if (msg) flag(this, 'message', msg);
+ var obj = flag(this, 'object');
+ this.assert(
+ obj.hasOwnProperty(name)
+ , 'expected #{this} to have own property ' + _.inspect(name)
+ , 'expected #{this} to not have own property ' + _.inspect(name)
+ );
+ }
+
+ Assertion.addMethod('ownProperty', assertOwnProperty);
+ Assertion.addMethod('haveOwnProperty', assertOwnProperty);
+
+ /**
+ * ### .ownPropertyDescriptor(name[, descriptor[, message]])
+ *
+ * Asserts that the target has an own property descriptor `name`, that optionally matches `descriptor`.
+ *
+ * expect('test').to.have.ownPropertyDescriptor('length');
+ * expect('test').to.have.ownPropertyDescriptor('length', { enumerable: false, configurable: false, writable: false, value: 4 });
+ * expect('test').not.to.have.ownPropertyDescriptor('length', { enumerable: false, configurable: false, writable: false, value: 3 });
+ * expect('test').ownPropertyDescriptor('length').to.have.property('enumerable', false);
+ * expect('test').ownPropertyDescriptor('length').to.have.keys('value');
+ *
+ * @name ownPropertyDescriptor
+ * @alias haveOwnPropertyDescriptor
+ * @param {String} name
+ * @param {Object} descriptor _optional_
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ function assertOwnPropertyDescriptor (name, descriptor, msg) {
+ if (typeof descriptor === 'string') {
+ msg = descriptor;
+ descriptor = null;
+ }
+ if (msg) flag(this, 'message', msg);
+ var obj = flag(this, 'object');
+ var actualDescriptor = Object.getOwnPropertyDescriptor(Object(obj), name);
+ if (actualDescriptor && descriptor) {
+ this.assert(
+ _.eql(descriptor, actualDescriptor)
+ , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to match ' + _.inspect(descriptor) + ', got ' + _.inspect(actualDescriptor)
+ , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to not match ' + _.inspect(descriptor)
+ , descriptor
+ , actualDescriptor
+ , true
+ );
+ } else {
+ this.assert(
+ actualDescriptor
+ , 'expected #{this} to have an own property descriptor for ' + _.inspect(name)
+ , 'expected #{this} to not have an own property descriptor for ' + _.inspect(name)
+ );
+ }
+ flag(this, 'object', actualDescriptor);
+ }
+
+ Assertion.addMethod('ownPropertyDescriptor', assertOwnPropertyDescriptor);
+ Assertion.addMethod('haveOwnPropertyDescriptor', assertOwnPropertyDescriptor);
+
+ /**
+ * ### .length
+ *
+ * Sets the `doLength` flag later used as a chain precursor to a value
+ * comparison for the `length` property.
+ *
+ * expect('foo').to.have.length.above(2);
+ * expect([ 1, 2, 3 ]).to.have.length.above(2);
+ * expect('foo').to.have.length.below(4);
+ * expect([ 1, 2, 3 ]).to.have.length.below(4);
+ * expect('foo').to.have.length.within(2,4);
+ * expect([ 1, 2, 3 ]).to.have.length.within(2,4);
+ *
+ * *Deprecation notice:* Using `length` as an assertion will be deprecated
+ * in version 2.4.0 and removed in 3.0.0. Code using the old style of
+ * asserting for `length` property value using `length(value)` should be
+ * switched to use `lengthOf(value)` instead.
+ *
+ * @name length
+ * @namespace BDD
+ * @api public
+ */
+
+ /**
+ * ### .lengthOf(value[, message])
+ *
+ * Asserts that the target's `length` property has
+ * the expected value.
+ *
+ * expect([ 1, 2, 3]).to.have.lengthOf(3);
+ * expect('foobar').to.have.lengthOf(6);
+ *
+ * @name lengthOf
+ * @param {Number} length
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ function assertLengthChain () {
+ flag(this, 'doLength', true);
+ }
+
+ function assertLength (n, msg) {
+ if (msg) flag(this, 'message', msg);
+ var obj = flag(this, 'object');
+ new Assertion(obj, msg).to.have.property('length');
+ var len = obj.length;
+
+ this.assert(
+ len == n
+ , 'expected #{this} to have a length of #{exp} but got #{act}'
+ , 'expected #{this} to not have a length of #{act}'
+ , n
+ , len
+ );
+ }
+
+ Assertion.addChainableMethod('length', assertLength, assertLengthChain);
+ Assertion.addMethod('lengthOf', assertLength);
+
+ /**
+ * ### .match(regexp)
+ *
+ * Asserts that the target matches a regular expression.
+ *
+ * expect('foobar').to.match(/^foo/);
+ *
+ * @name match
+ * @alias matches
+ * @param {RegExp} RegularExpression
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+ function assertMatch(re, msg) {
+ if (msg) flag(this, 'message', msg);
+ var obj = flag(this, 'object');
+ this.assert(
+ re.exec(obj)
+ , 'expected #{this} to match ' + re
+ , 'expected #{this} not to match ' + re
+ );
+ }
+
+ Assertion.addMethod('match', assertMatch);
+ Assertion.addMethod('matches', assertMatch);
+
+ /**
+ * ### .string(string)
+ *
+ * Asserts that the string target contains another string.
+ *
+ * expect('foobar').to.have.string('bar');
+ *
+ * @name string
+ * @param {String} string
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addMethod('string', function (str, msg) {
+ if (msg) flag(this, 'message', msg);
+ var obj = flag(this, 'object');
+ new Assertion(obj, msg).is.a('string');
+
+ this.assert(
+ ~obj.indexOf(str)
+ , 'expected #{this} to contain ' + _.inspect(str)
+ , 'expected #{this} to not contain ' + _.inspect(str)
+ );
+ });
+
+
+ /**
+ * ### .keys(key1, [key2], [...])
+ *
+ * Asserts that the target contains any or all of the passed-in keys.
+ * Use in combination with `any`, `all`, `contains`, or `have` will affect
+ * what will pass.
+ *
+ * When used in conjunction with `any`, at least one key that is passed
+ * in must exist in the target object. This is regardless whether or not
+ * the `have` or `contain` qualifiers are used. Note, either `any` or `all`
+ * should be used in the assertion. If neither are used, the assertion is
+ * defaulted to `all`.
+ *
+ * When both `all` and `contain` are used, the target object must have at
+ * least all of the passed-in keys but may have more keys not listed.
+ *
+ * When both `all` and `have` are used, the target object must both contain
+ * all of the passed-in keys AND the number of keys in the target object must
+ * match the number of keys passed in (in other words, a target object must
+ * have all and only all of the passed-in keys).
+ *
+ * expect({ foo: 1, bar: 2 }).to.have.any.keys('foo', 'baz');
+ * expect({ foo: 1, bar: 2 }).to.have.any.keys('foo');
+ * expect({ foo: 1, bar: 2 }).to.contain.any.keys('bar', 'baz');
+ * expect({ foo: 1, bar: 2 }).to.contain.any.keys(['foo']);
+ * expect({ foo: 1, bar: 2 }).to.contain.any.keys({'foo': 6});
+ * expect({ foo: 1, bar: 2 }).to.have.all.keys(['bar', 'foo']);
+ * expect({ foo: 1, bar: 2 }).to.have.all.keys({'bar': 6, 'foo': 7});
+ * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.all.keys(['bar', 'foo']);
+ * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.all.keys({'bar': 6});
+ *
+ *
+ * @name keys
+ * @alias key
+ * @param {...String|Array|Object} keys
+ * @namespace BDD
+ * @api public
+ */
+
+ function assertKeys (keys) {
+ var obj = flag(this, 'object')
+ , str
+ , ok = true
+ , mixedArgsMsg = 'keys must be given single argument of Array|Object|String, or multiple String arguments';
+
+ switch (_.type(keys)) {
+ case "array":
+ if (arguments.length > 1) throw (new Error(mixedArgsMsg));
+ break;
+ case "object":
+ if (arguments.length > 1) throw (new Error(mixedArgsMsg));
+ keys = Object.keys(keys);
+ break;
+ default:
+ keys = Array.prototype.slice.call(arguments);
+ }
+
+ if (!keys.length) throw new Error('keys required');
+
+ var actual = Object.keys(obj)
+ , expected = keys
+ , len = keys.length
+ , any = flag(this, 'any')
+ , all = flag(this, 'all');
+
+ if (!any && !all) {
+ all = true;
+ }
+
+ // Has any
+ if (any) {
+ var intersection = expected.filter(function(key) {
+ return ~actual.indexOf(key);
+ });
+ ok = intersection.length > 0;
+ }
+
+ // Has all
+ if (all) {
+ ok = keys.every(function(key){
+ return ~actual.indexOf(key);
+ });
+ if (!flag(this, 'negate') && !flag(this, 'contains')) {
+ ok = ok && keys.length == actual.length;
+ }
+ }
+
+ // Key string
+ if (len > 1) {
+ keys = keys.map(function(key){
+ return _.inspect(key);
+ });
+ var last = keys.pop();
+ if (all) {
+ str = keys.join(', ') + ', and ' + last;
+ }
+ if (any) {
+ str = keys.join(', ') + ', or ' + last;
+ }
+ } else {
+ str = _.inspect(keys[0]);
+ }
+
+ // Form
+ str = (len > 1 ? 'keys ' : 'key ') + str;
+
+ // Have / include
+ str = (flag(this, 'contains') ? 'contain ' : 'have ') + str;
+
+ // Assertion
+ this.assert(
+ ok
+ , 'expected #{this} to ' + str
+ , 'expected #{this} to not ' + str
+ , expected.slice(0).sort()
+ , actual.sort()
+ , true
+ );
+ }
+
+ Assertion.addMethod('keys', assertKeys);
+ Assertion.addMethod('key', assertKeys);
+
+ /**
+ * ### .throw(constructor)
+ *
+ * Asserts that the function target will throw a specific error, or specific type of error
+ * (as determined using `instanceof`), optionally with a RegExp or string inclusion test
+ * for the error's message.
+ *
+ * var err = new ReferenceError('This is a bad function.');
+ * var fn = function () { throw err; }
+ * expect(fn).to.throw(ReferenceError);
+ * expect(fn).to.throw(Error);
+ * expect(fn).to.throw(/bad function/);
+ * expect(fn).to.not.throw('good function');
+ * expect(fn).to.throw(ReferenceError, /bad function/);
+ * expect(fn).to.throw(err);
+ *
+ * Please note that when a throw expectation is negated, it will check each
+ * parameter independently, starting with error constructor type. The appropriate way
+ * to check for the existence of a type of error but for a message that does not match
+ * is to use `and`.
+ *
+ * expect(fn).to.throw(ReferenceError)
+ * .and.not.throw(/good function/);
+ *
+ * @name throw
+ * @alias throws
+ * @alias Throw
+ * @param {ErrorConstructor} constructor
+ * @param {String|RegExp} expected error message
+ * @param {String} message _optional_
+ * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
+ * @returns error for chaining (null if no error)
+ * @namespace BDD
+ * @api public
+ */
+
+ function assertThrows (constructor, errMsg, msg) {
+ if (msg) flag(this, 'message', msg);
+ var obj = flag(this, 'object');
+ new Assertion(obj, msg).is.a('function');
+
+ var thrown = false
+ , desiredError = null
+ , name = null
+ , thrownError = null;
+
+ if (arguments.length === 0) {
+ errMsg = null;
+ constructor = null;
+ } else if (constructor && (constructor instanceof RegExp || 'string' === typeof constructor)) {
+ errMsg = constructor;
+ constructor = null;
+ } else if (constructor && constructor instanceof Error) {
+ desiredError = constructor;
+ constructor = null;
+ errMsg = null;
+ } else if (typeof constructor === 'function') {
+ name = constructor.prototype.name;
+ if (!name || (name === 'Error' && constructor !== Error)) {
+ name = constructor.name || (new constructor()).name;
+ }
+ } else {
+ constructor = null;
+ }
+
+ try {
+ obj();
+ } catch (err) {
+ // first, check desired error
+ if (desiredError) {
+ this.assert(
+ err === desiredError
+ , 'expected #{this} to throw #{exp} but #{act} was thrown'
+ , 'expected #{this} to not throw #{exp}'
+ , (desiredError instanceof Error ? desiredError.toString() : desiredError)
+ , (err instanceof Error ? err.toString() : err)
+ );
+
+ flag(this, 'object', err);
+ return this;
+ }
+
+ // next, check constructor
+ if (constructor) {
+ this.assert(
+ err instanceof constructor
+ , 'expected #{this} to throw #{exp} but #{act} was thrown'
+ , 'expected #{this} to not throw #{exp} but #{act} was thrown'
+ , name
+ , (err instanceof Error ? err.toString() : err)
+ );
+
+ if (!errMsg) {
+ flag(this, 'object', err);
+ return this;
+ }
+ }
+
+ // next, check message
+ var message = 'error' === _.type(err) && "message" in err
+ ? err.message
+ : '' + err;
+
+ if ((message != null) && errMsg && errMsg instanceof RegExp) {
+ this.assert(
+ errMsg.exec(message)
+ , 'expected #{this} to throw error matching #{exp} but got #{act}'
+ , 'expected #{this} to throw error not matching #{exp}'
+ , errMsg
+ , message
+ );
+
+ flag(this, 'object', err);
+ return this;
+ } else if ((message != null) && errMsg && 'string' === typeof errMsg) {
+ this.assert(
+ ~message.indexOf(errMsg)
+ , 'expected #{this} to throw error including #{exp} but got #{act}'
+ , 'expected #{this} to throw error not including #{act}'
+ , errMsg
+ , message
+ );
+
+ flag(this, 'object', err);
+ return this;
+ } else {
+ thrown = true;
+ thrownError = err;
+ }
+ }
+
+ var actuallyGot = ''
+ , expectedThrown = name !== null
+ ? name
+ : desiredError
+ ? '#{exp}' //_.inspect(desiredError)
+ : 'an error';
+
+ if (thrown) {
+ actuallyGot = ' but #{act} was thrown'
+ }
+
+ this.assert(
+ thrown === true
+ , 'expected #{this} to throw ' + expectedThrown + actuallyGot
+ , 'expected #{this} to not throw ' + expectedThrown + actuallyGot
+ , (desiredError instanceof Error ? desiredError.toString() : desiredError)
+ , (thrownError instanceof Error ? thrownError.toString() : thrownError)
+ );
+
+ flag(this, 'object', thrownError);
+ };
+
+ Assertion.addMethod('throw', assertThrows);
+ Assertion.addMethod('throws', assertThrows);
+ Assertion.addMethod('Throw', assertThrows);
+
+ /**
+ * ### .respondTo(method)
+ *
+ * Asserts that the object or class target will respond to a method.
+ *
+ * Klass.prototype.bar = function(){};
+ * expect(Klass).to.respondTo('bar');
+ * expect(obj).to.respondTo('bar');
+ *
+ * To check if a constructor will respond to a static function,
+ * set the `itself` flag.
+ *
+ * Klass.baz = function(){};
+ * expect(Klass).itself.to.respondTo('baz');
+ *
+ * @name respondTo
+ * @alias respondsTo
+ * @param {String} method
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ function respondTo (method, msg) {
+ if (msg) flag(this, 'message', msg);
+ var obj = flag(this, 'object')
+ , itself = flag(this, 'itself')
+ , context = ('function' === _.type(obj) && !itself)
+ ? obj.prototype[method]
+ : obj[method];
+
+ this.assert(
+ 'function' === typeof context
+ , 'expected #{this} to respond to ' + _.inspect(method)
+ , 'expected #{this} to not respond to ' + _.inspect(method)
+ );
+ }
+
+ Assertion.addMethod('respondTo', respondTo);
+ Assertion.addMethod('respondsTo', respondTo);
+
+ /**
+ * ### .itself
+ *
+ * Sets the `itself` flag, later used by the `respondTo` assertion.
+ *
+ * function Foo() {}
+ * Foo.bar = function() {}
+ * Foo.prototype.baz = function() {}
+ *
+ * expect(Foo).itself.to.respondTo('bar');
+ * expect(Foo).itself.not.to.respondTo('baz');
+ *
+ * @name itself
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addProperty('itself', function () {
+ flag(this, 'itself', true);
+ });
+
+ /**
+ * ### .satisfy(method)
+ *
+ * Asserts that the target passes a given truth test.
+ *
+ * expect(1).to.satisfy(function(num) { return num > 0; });
+ *
+ * @name satisfy
+ * @alias satisfies
+ * @param {Function} matcher
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ function satisfy (matcher, msg) {
+ if (msg) flag(this, 'message', msg);
+ var obj = flag(this, 'object');
+ var result = matcher(obj);
+ this.assert(
+ result
+ , 'expected #{this} to satisfy ' + _.objDisplay(matcher)
+ , 'expected #{this} to not satisfy' + _.objDisplay(matcher)
+ , this.negate ? false : true
+ , result
+ );
+ }
+
+ Assertion.addMethod('satisfy', satisfy);
+ Assertion.addMethod('satisfies', satisfy);
+
+ /**
+ * ### .closeTo(expected, delta)
+ *
+ * Asserts that the target is equal `expected`, to within a +/- `delta` range.
+ *
+ * expect(1.5).to.be.closeTo(1, 0.5);
+ *
+ * @name closeTo
+ * @alias approximately
+ * @param {Number} expected
+ * @param {Number} delta
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ function closeTo(expected, delta, msg) {
+ if (msg) flag(this, 'message', msg);
+ var obj = flag(this, 'object');
+
+ new Assertion(obj, msg).is.a('number');
+ if (_.type(expected) !== 'number' || _.type(delta) !== 'number') {
+ throw new Error('the arguments to closeTo or approximately must be numbers');
+ }
+
+ this.assert(
+ Math.abs(obj - expected) <= delta
+ , 'expected #{this} to be close to ' + expected + ' +/- ' + delta
+ , 'expected #{this} not to be close to ' + expected + ' +/- ' + delta
+ );
+ }
+
+ Assertion.addMethod('closeTo', closeTo);
+ Assertion.addMethod('approximately', closeTo);
+
+ function isSubsetOf(subset, superset, cmp) {
+ return subset.every(function(elem) {
+ if (!cmp) return superset.indexOf(elem) !== -1;
+
+ return superset.some(function(elem2) {
+ return cmp(elem, elem2);
+ });
+ })
+ }
+
+ /**
+ * ### .members(set)
+ *
+ * Asserts that the target is a superset of `set`,
+ * or that the target and `set` have the same strictly-equal (===) members.
+ * Alternately, if the `deep` flag is set, set members are compared for deep
+ * equality.
+ *
+ * expect([1, 2, 3]).to.include.members([3, 2]);
+ * expect([1, 2, 3]).to.not.include.members([3, 2, 8]);
+ *
+ * expect([4, 2]).to.have.members([2, 4]);
+ * expect([5, 2]).to.not.have.members([5, 2, 1]);
+ *
+ * expect([{ id: 1 }]).to.deep.include.members([{ id: 1 }]);
+ *
+ * @name members
+ * @param {Array} set
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addMethod('members', function (subset, msg) {
+ if (msg) flag(this, 'message', msg);
+ var obj = flag(this, 'object');
+
+ new Assertion(obj).to.be.an('array');
+ new Assertion(subset).to.be.an('array');
+
+ var cmp = flag(this, 'deep') ? _.eql : undefined;
+
+ if (flag(this, 'contains')) {
+ return this.assert(
+ isSubsetOf(subset, obj, cmp)
+ , 'expected #{this} to be a superset of #{act}'
+ , 'expected #{this} to not be a superset of #{act}'
+ , obj
+ , subset
+ );
+ }
+
+ this.assert(
+ isSubsetOf(obj, subset, cmp) && isSubsetOf(subset, obj, cmp)
+ , 'expected #{this} to have the same members as #{act}'
+ , 'expected #{this} to not have the same members as #{act}'
+ , obj
+ , subset
+ );
+ });
+
+ /**
+ * ### .oneOf(list)
+ *
+ * Assert that a value appears somewhere in the top level of array `list`.
+ *
+ * expect('a').to.be.oneOf(['a', 'b', 'c']);
+ * expect(9).to.not.be.oneOf(['z']);
+ * expect([3]).to.not.be.oneOf([1, 2, [3]]);
+ *
+ * var three = [3];
+ * // for object-types, contents are not compared
+ * expect(three).to.not.be.oneOf([1, 2, [3]]);
+ * // comparing references works
+ * expect(three).to.be.oneOf([1, 2, three]);
+ *
+ * @name oneOf
+ * @param {Array<*>} list
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ function oneOf (list, msg) {
+ if (msg) flag(this, 'message', msg);
+ var expected = flag(this, 'object');
+ new Assertion(list).to.be.an('array');
+
+ this.assert(
+ list.indexOf(expected) > -1
+ , 'expected #{this} to be one of #{exp}'
+ , 'expected #{this} to not be one of #{exp}'
+ , list
+ , expected
+ );
+ }
+
+ Assertion.addMethod('oneOf', oneOf);
+
+
+ /**
+ * ### .change(function)
+ *
+ * Asserts that a function changes an object property
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { obj.val += 3 };
+ * var noChangeFn = function() { return 'foo' + 'bar'; }
+ * expect(fn).to.change(obj, 'val');
+ * expect(noChangeFn).to.not.change(obj, 'val')
+ *
+ * @name change
+ * @alias changes
+ * @alias Change
+ * @param {String} object
+ * @param {String} property name
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ function assertChanges (object, prop, msg) {
+ if (msg) flag(this, 'message', msg);
+ var fn = flag(this, 'object');
+ new Assertion(object, msg).to.have.property(prop);
+ new Assertion(fn).is.a('function');
+
+ var initial = object[prop];
+ fn();
+
+ this.assert(
+ initial !== object[prop]
+ , 'expected .' + prop + ' to change'
+ , 'expected .' + prop + ' to not change'
+ );
+ }
+
+ Assertion.addChainableMethod('change', assertChanges);
+ Assertion.addChainableMethod('changes', assertChanges);
+
+ /**
+ * ### .increase(function)
+ *
+ * Asserts that a function increases an object property
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { obj.val = 15 };
+ * expect(fn).to.increase(obj, 'val');
+ *
+ * @name increase
+ * @alias increases
+ * @alias Increase
+ * @param {String} object
+ * @param {String} property name
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ function assertIncreases (object, prop, msg) {
+ if (msg) flag(this, 'message', msg);
+ var fn = flag(this, 'object');
+ new Assertion(object, msg).to.have.property(prop);
+ new Assertion(fn).is.a('function');
+
+ var initial = object[prop];
+ fn();
+
+ this.assert(
+ object[prop] - initial > 0
+ , 'expected .' + prop + ' to increase'
+ , 'expected .' + prop + ' to not increase'
+ );
+ }
+
+ Assertion.addChainableMethod('increase', assertIncreases);
+ Assertion.addChainableMethod('increases', assertIncreases);
+
+ /**
+ * ### .decrease(function)
+ *
+ * Asserts that a function decreases an object property
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { obj.val = 5 };
+ * expect(fn).to.decrease(obj, 'val');
+ *
+ * @name decrease
+ * @alias decreases
+ * @alias Decrease
+ * @param {String} object
+ * @param {String} property name
+ * @param {String} message _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ function assertDecreases (object, prop, msg) {
+ if (msg) flag(this, 'message', msg);
+ var fn = flag(this, 'object');
+ new Assertion(object, msg).to.have.property(prop);
+ new Assertion(fn).is.a('function');
+
+ var initial = object[prop];
+ fn();
+
+ this.assert(
+ object[prop] - initial < 0
+ , 'expected .' + prop + ' to decrease'
+ , 'expected .' + prop + ' to not decrease'
+ );
+ }
+
+ Assertion.addChainableMethod('decrease', assertDecreases);
+ Assertion.addChainableMethod('decreases', assertDecreases);
+
+ /**
+ * ### .extensible
+ *
+ * Asserts that the target is extensible (can have new properties added to
+ * it).
+ *
+ * var nonExtensibleObject = Object.preventExtensions({});
+ * var sealedObject = Object.seal({});
+ * var frozenObject = Object.freeze({});
+ *
+ * expect({}).to.be.extensible;
+ * expect(nonExtensibleObject).to.not.be.extensible;
+ * expect(sealedObject).to.not.be.extensible;
+ * expect(frozenObject).to.not.be.extensible;
+ *
+ * @name extensible
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addProperty('extensible', function() {
+ var obj = flag(this, 'object');
+
+ // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.
+ // In ES6, a non-object argument will be treated as if it was a non-extensible ordinary object, simply return false.
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible
+ // The following provides ES6 behavior when a TypeError is thrown under ES5.
+
+ var isExtensible;
+
+ try {
+ isExtensible = Object.isExtensible(obj);
+ } catch (err) {
+ if (err instanceof TypeError) isExtensible = false;
+ else throw err;
+ }
+
+ this.assert(
+ isExtensible
+ , 'expected #{this} to be extensible'
+ , 'expected #{this} to not be extensible'
+ );
+ });
+
+ /**
+ * ### .sealed
+ *
+ * Asserts that the target is sealed (cannot have new properties added to it
+ * and its existing properties cannot be removed).
+ *
+ * var sealedObject = Object.seal({});
+ * var frozenObject = Object.freeze({});
+ *
+ * expect(sealedObject).to.be.sealed;
+ * expect(frozenObject).to.be.sealed;
+ * expect({}).to.not.be.sealed;
+ *
+ * @name sealed
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addProperty('sealed', function() {
+ var obj = flag(this, 'object');
+
+ // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.
+ // In ES6, a non-object argument will be treated as if it was a sealed ordinary object, simply return true.
+ // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed
+ // The following provides ES6 behavior when a TypeError is thrown under ES5.
+
+ var isSealed;
+
+ try {
+ isSealed = Object.isSealed(obj);
+ } catch (err) {
+ if (err instanceof TypeError) isSealed = true;
+ else throw err;
+ }
+
+ this.assert(
+ isSealed
+ , 'expected #{this} to be sealed'
+ , 'expected #{this} to not be sealed'
+ );
+ });
+
+ /**
+ * ### .frozen
+ *
+ * Asserts that the target is frozen (cannot have new properties added to it
+ * and its existing properties cannot be modified).
+ *
+ * var frozenObject = Object.freeze({});
+ *
+ * expect(frozenObject).to.be.frozen;
+ * expect({}).to.not.be.frozen;
+ *
+ * @name frozen
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addProperty('frozen', function() {
+ var obj = flag(this, 'object');
+
+ // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.
+ // In ES6, a non-object argument will be treated as if it was a frozen ordinary object, simply return true.
+ // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen
+ // The following provides ES6 behavior when a TypeError is thrown under ES5.
+
+ var isFrozen;
+
+ try {
+ isFrozen = Object.isFrozen(obj);
+ } catch (err) {
+ if (err instanceof TypeError) isFrozen = true;
+ else throw err;
+ }
+
+ this.assert(
+ isFrozen
+ , 'expected #{this} to be frozen'
+ , 'expected #{this} to not be frozen'
+ );
+ });
+};
+
+},{}],6:[function(require,module,exports){
+/*!
+ * chai
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+
+module.exports = function (chai, util) {
+
+ /*!
+ * Chai dependencies.
+ */
+
+ var Assertion = chai.Assertion
+ , flag = util.flag;
+
+ /*!
+ * Module export.
+ */
+
+ /**
+ * ### assert(expression, message)
+ *
+ * Write your own test expressions.
+ *
+ * assert('foo' !== 'bar', 'foo is not bar');
+ * assert(Array.isArray([]), 'empty arrays are arrays');
+ *
+ * @param {Mixed} expression to test for truthiness
+ * @param {String} message to display on error
+ * @name assert
+ * @namespace Assert
+ * @api public
+ */
+
+ var assert = chai.assert = function (express, errmsg) {
+ var test = new Assertion(null, null, chai.assert);
+ test.assert(
+ express
+ , errmsg
+ , '[ negation message unavailable ]'
+ );
+ };
+
+ /**
+ * ### .fail(actual, expected, [message], [operator])
+ *
+ * Throw a failure. Node.js `assert` module-compatible.
+ *
+ * @name fail
+ * @param {Mixed} actual
+ * @param {Mixed} expected
+ * @param {String} message
+ * @param {String} operator
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.fail = function (actual, expected, message, operator) {
+ message = message || 'assert.fail()';
+ throw new chai.AssertionError(message, {
+ actual: actual
+ , expected: expected
+ , operator: operator
+ }, assert.fail);
+ };
+
+ /**
+ * ### .isOk(object, [message])
+ *
+ * Asserts that `object` is truthy.
+ *
+ * assert.isOk('everything', 'everything is ok');
+ * assert.isOk(false, 'this will fail');
+ *
+ * @name isOk
+ * @alias ok
+ * @param {Mixed} object to test
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isOk = function (val, msg) {
+ new Assertion(val, msg).is.ok;
+ };
+
+ /**
+ * ### .isNotOk(object, [message])
+ *
+ * Asserts that `object` is falsy.
+ *
+ * assert.isNotOk('everything', 'this will fail');
+ * assert.isNotOk(false, 'this will pass');
+ *
+ * @name isNotOk
+ * @alias notOk
+ * @param {Mixed} object to test
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isNotOk = function (val, msg) {
+ new Assertion(val, msg).is.not.ok;
+ };
+
+ /**
+ * ### .equal(actual, expected, [message])
+ *
+ * Asserts non-strict equality (`==`) of `actual` and `expected`.
+ *
+ * assert.equal(3, '3', '== coerces values to strings');
+ *
+ * @name equal
+ * @param {Mixed} actual
+ * @param {Mixed} expected
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.equal = function (act, exp, msg) {
+ var test = new Assertion(act, msg, assert.equal);
+
+ test.assert(
+ exp == flag(test, 'object')
+ , 'expected #{this} to equal #{exp}'
+ , 'expected #{this} to not equal #{act}'
+ , exp
+ , act
+ );
+ };
+
+ /**
+ * ### .notEqual(actual, expected, [message])
+ *
+ * Asserts non-strict inequality (`!=`) of `actual` and `expected`.
+ *
+ * assert.notEqual(3, 4, 'these numbers are not equal');
+ *
+ * @name notEqual
+ * @param {Mixed} actual
+ * @param {Mixed} expected
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.notEqual = function (act, exp, msg) {
+ var test = new Assertion(act, msg, assert.notEqual);
+
+ test.assert(
+ exp != flag(test, 'object')
+ , 'expected #{this} to not equal #{exp}'
+ , 'expected #{this} to equal #{act}'
+ , exp
+ , act
+ );
+ };
+
+ /**
+ * ### .strictEqual(actual, expected, [message])
+ *
+ * Asserts strict equality (`===`) of `actual` and `expected`.
+ *
+ * assert.strictEqual(true, true, 'these booleans are strictly equal');
+ *
+ * @name strictEqual
+ * @param {Mixed} actual
+ * @param {Mixed} expected
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.strictEqual = function (act, exp, msg) {
+ new Assertion(act, msg).to.equal(exp);
+ };
+
+ /**
+ * ### .notStrictEqual(actual, expected, [message])
+ *
+ * Asserts strict inequality (`!==`) of `actual` and `expected`.
+ *
+ * assert.notStrictEqual(3, '3', 'no coercion for strict equality');
+ *
+ * @name notStrictEqual
+ * @param {Mixed} actual
+ * @param {Mixed} expected
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.notStrictEqual = function (act, exp, msg) {
+ new Assertion(act, msg).to.not.equal(exp);
+ };
+
+ /**
+ * ### .deepEqual(actual, expected, [message])
+ *
+ * Asserts that `actual` is deeply equal to `expected`.
+ *
+ * assert.deepEqual({ tea: 'green' }, { tea: 'green' });
+ *
+ * @name deepEqual
+ * @param {Mixed} actual
+ * @param {Mixed} expected
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.deepEqual = function (act, exp, msg) {
+ new Assertion(act, msg).to.eql(exp);
+ };
+
+ /**
+ * ### .notDeepEqual(actual, expected, [message])
+ *
+ * Assert that `actual` is not deeply equal to `expected`.
+ *
+ * assert.notDeepEqual({ tea: 'green' }, { tea: 'jasmine' });
+ *
+ * @name notDeepEqual
+ * @param {Mixed} actual
+ * @param {Mixed} expected
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.notDeepEqual = function (act, exp, msg) {
+ new Assertion(act, msg).to.not.eql(exp);
+ };
+
+ /**
+ * ### .isAbove(valueToCheck, valueToBeAbove, [message])
+ *
+ * Asserts `valueToCheck` is strictly greater than (>) `valueToBeAbove`
+ *
+ * assert.isAbove(5, 2, '5 is strictly greater than 2');
+ *
+ * @name isAbove
+ * @param {Mixed} valueToCheck
+ * @param {Mixed} valueToBeAbove
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isAbove = function (val, abv, msg) {
+ new Assertion(val, msg).to.be.above(abv);
+ };
+
+ /**
+ * ### .isAtLeast(valueToCheck, valueToBeAtLeast, [message])
+ *
+ * Asserts `valueToCheck` is greater than or equal to (>=) `valueToBeAtLeast`
+ *
+ * assert.isAtLeast(5, 2, '5 is greater or equal to 2');
+ * assert.isAtLeast(3, 3, '3 is greater or equal to 3');
+ *
+ * @name isAtLeast
+ * @param {Mixed} valueToCheck
+ * @param {Mixed} valueToBeAtLeast
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isAtLeast = function (val, atlst, msg) {
+ new Assertion(val, msg).to.be.least(atlst);
+ };
+
+ /**
+ * ### .isBelow(valueToCheck, valueToBeBelow, [message])
+ *
+ * Asserts `valueToCheck` is strictly less than (<) `valueToBeBelow`
+ *
+ * assert.isBelow(3, 6, '3 is strictly less than 6');
+ *
+ * @name isBelow
+ * @param {Mixed} valueToCheck
+ * @param {Mixed} valueToBeBelow
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isBelow = function (val, blw, msg) {
+ new Assertion(val, msg).to.be.below(blw);
+ };
+
+ /**
+ * ### .isAtMost(valueToCheck, valueToBeAtMost, [message])
+ *
+ * Asserts `valueToCheck` is less than or equal to (<=) `valueToBeAtMost`
+ *
+ * assert.isAtMost(3, 6, '3 is less than or equal to 6');
+ * assert.isAtMost(4, 4, '4 is less than or equal to 4');
+ *
+ * @name isAtMost
+ * @param {Mixed} valueToCheck
+ * @param {Mixed} valueToBeAtMost
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isAtMost = function (val, atmst, msg) {
+ new Assertion(val, msg).to.be.most(atmst);
+ };
+
+ /**
+ * ### .isTrue(value, [message])
+ *
+ * Asserts that `value` is true.
+ *
+ * var teaServed = true;
+ * assert.isTrue(teaServed, 'the tea has been served');
+ *
+ * @name isTrue
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isTrue = function (val, msg) {
+ new Assertion(val, msg).is['true'];
+ };
+
+ /**
+ * ### .isNotTrue(value, [message])
+ *
+ * Asserts that `value` is not true.
+ *
+ * var tea = 'tasty chai';
+ * assert.isNotTrue(tea, 'great, time for tea!');
+ *
+ * @name isNotTrue
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isNotTrue = function (val, msg) {
+ new Assertion(val, msg).to.not.equal(true);
+ };
+
+ /**
+ * ### .isFalse(value, [message])
+ *
+ * Asserts that `value` is false.
+ *
+ * var teaServed = false;
+ * assert.isFalse(teaServed, 'no tea yet? hmm...');
+ *
+ * @name isFalse
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isFalse = function (val, msg) {
+ new Assertion(val, msg).is['false'];
+ };
+
+ /**
+ * ### .isNotFalse(value, [message])
+ *
+ * Asserts that `value` is not false.
+ *
+ * var tea = 'tasty chai';
+ * assert.isNotFalse(tea, 'great, time for tea!');
+ *
+ * @name isNotFalse
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isNotFalse = function (val, msg) {
+ new Assertion(val, msg).to.not.equal(false);
+ };
+
+ /**
+ * ### .isNull(value, [message])
+ *
+ * Asserts that `value` is null.
+ *
+ * assert.isNull(err, 'there was no error');
+ *
+ * @name isNull
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isNull = function (val, msg) {
+ new Assertion(val, msg).to.equal(null);
+ };
+
+ /**
+ * ### .isNotNull(value, [message])
+ *
+ * Asserts that `value` is not null.
+ *
+ * var tea = 'tasty chai';
+ * assert.isNotNull(tea, 'great, time for tea!');
+ *
+ * @name isNotNull
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isNotNull = function (val, msg) {
+ new Assertion(val, msg).to.not.equal(null);
+ };
+
+ /**
+ * ### .isNaN
+ * Asserts that value is NaN
+ *
+ * assert.isNaN('foo', 'foo is NaN');
+ *
+ * @name isNaN
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isNaN = function (val, msg) {
+ new Assertion(val, msg).to.be.NaN;
+ };
+
+ /**
+ * ### .isNotNaN
+ * Asserts that value is not NaN
+ *
+ * assert.isNotNaN(4, '4 is not NaN');
+ *
+ * @name isNotNaN
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+ assert.isNotNaN = function (val, msg) {
+ new Assertion(val, msg).not.to.be.NaN;
+ };
+
+ /**
+ * ### .isUndefined(value, [message])
+ *
+ * Asserts that `value` is `undefined`.
+ *
+ * var tea;
+ * assert.isUndefined(tea, 'no tea defined');
+ *
+ * @name isUndefined
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isUndefined = function (val, msg) {
+ new Assertion(val, msg).to.equal(undefined);
+ };
+
+ /**
+ * ### .isDefined(value, [message])
+ *
+ * Asserts that `value` is not `undefined`.
+ *
+ * var tea = 'cup of chai';
+ * assert.isDefined(tea, 'tea has been defined');
+ *
+ * @name isDefined
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isDefined = function (val, msg) {
+ new Assertion(val, msg).to.not.equal(undefined);
+ };
+
+ /**
+ * ### .isFunction(value, [message])
+ *
+ * Asserts that `value` is a function.
+ *
+ * function serveTea() { return 'cup of tea'; };
+ * assert.isFunction(serveTea, 'great, we can have tea now');
+ *
+ * @name isFunction
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isFunction = function (val, msg) {
+ new Assertion(val, msg).to.be.a('function');
+ };
+
+ /**
+ * ### .isNotFunction(value, [message])
+ *
+ * Asserts that `value` is _not_ a function.
+ *
+ * var serveTea = [ 'heat', 'pour', 'sip' ];
+ * assert.isNotFunction(serveTea, 'great, we have listed the steps');
+ *
+ * @name isNotFunction
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isNotFunction = function (val, msg) {
+ new Assertion(val, msg).to.not.be.a('function');
+ };
+
+ /**
+ * ### .isObject(value, [message])
+ *
+ * Asserts that `value` is an object of type 'Object' (as revealed by `Object.prototype.toString`).
+ * _The assertion does not match subclassed objects._
+ *
+ * var selection = { name: 'Chai', serve: 'with spices' };
+ * assert.isObject(selection, 'tea selection is an object');
+ *
+ * @name isObject
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isObject = function (val, msg) {
+ new Assertion(val, msg).to.be.a('object');
+ };
+
+ /**
+ * ### .isNotObject(value, [message])
+ *
+ * Asserts that `value` is _not_ an object of type 'Object' (as revealed by `Object.prototype.toString`).
+ *
+ * var selection = 'chai'
+ * assert.isNotObject(selection, 'tea selection is not an object');
+ * assert.isNotObject(null, 'null is not an object');
+ *
+ * @name isNotObject
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isNotObject = function (val, msg) {
+ new Assertion(val, msg).to.not.be.a('object');
+ };
+
+ /**
+ * ### .isArray(value, [message])
+ *
+ * Asserts that `value` is an array.
+ *
+ * var menu = [ 'green', 'chai', 'oolong' ];
+ * assert.isArray(menu, 'what kind of tea do we want?');
+ *
+ * @name isArray
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isArray = function (val, msg) {
+ new Assertion(val, msg).to.be.an('array');
+ };
+
+ /**
+ * ### .isNotArray(value, [message])
+ *
+ * Asserts that `value` is _not_ an array.
+ *
+ * var menu = 'green|chai|oolong';
+ * assert.isNotArray(menu, 'what kind of tea do we want?');
+ *
+ * @name isNotArray
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isNotArray = function (val, msg) {
+ new Assertion(val, msg).to.not.be.an('array');
+ };
+
+ /**
+ * ### .isString(value, [message])
+ *
+ * Asserts that `value` is a string.
+ *
+ * var teaOrder = 'chai';
+ * assert.isString(teaOrder, 'order placed');
+ *
+ * @name isString
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isString = function (val, msg) {
+ new Assertion(val, msg).to.be.a('string');
+ };
+
+ /**
+ * ### .isNotString(value, [message])
+ *
+ * Asserts that `value` is _not_ a string.
+ *
+ * var teaOrder = 4;
+ * assert.isNotString(teaOrder, 'order placed');
+ *
+ * @name isNotString
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isNotString = function (val, msg) {
+ new Assertion(val, msg).to.not.be.a('string');
+ };
+
+ /**
+ * ### .isNumber(value, [message])
+ *
+ * Asserts that `value` is a number.
+ *
+ * var cups = 2;
+ * assert.isNumber(cups, 'how many cups');
+ *
+ * @name isNumber
+ * @param {Number} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isNumber = function (val, msg) {
+ new Assertion(val, msg).to.be.a('number');
+ };
+
+ /**
+ * ### .isNotNumber(value, [message])
+ *
+ * Asserts that `value` is _not_ a number.
+ *
+ * var cups = '2 cups please';
+ * assert.isNotNumber(cups, 'how many cups');
+ *
+ * @name isNotNumber
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isNotNumber = function (val, msg) {
+ new Assertion(val, msg).to.not.be.a('number');
+ };
+
+ /**
+ * ### .isBoolean(value, [message])
+ *
+ * Asserts that `value` is a boolean.
+ *
+ * var teaReady = true
+ * , teaServed = false;
+ *
+ * assert.isBoolean(teaReady, 'is the tea ready');
+ * assert.isBoolean(teaServed, 'has tea been served');
+ *
+ * @name isBoolean
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isBoolean = function (val, msg) {
+ new Assertion(val, msg).to.be.a('boolean');
+ };
+
+ /**
+ * ### .isNotBoolean(value, [message])
+ *
+ * Asserts that `value` is _not_ a boolean.
+ *
+ * var teaReady = 'yep'
+ * , teaServed = 'nope';
+ *
+ * assert.isNotBoolean(teaReady, 'is the tea ready');
+ * assert.isNotBoolean(teaServed, 'has tea been served');
+ *
+ * @name isNotBoolean
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isNotBoolean = function (val, msg) {
+ new Assertion(val, msg).to.not.be.a('boolean');
+ };
+
+ /**
+ * ### .typeOf(value, name, [message])
+ *
+ * Asserts that `value`'s type is `name`, as determined by
+ * `Object.prototype.toString`.
+ *
+ * assert.typeOf({ tea: 'chai' }, 'object', 'we have an object');
+ * assert.typeOf(['chai', 'jasmine'], 'array', 'we have an array');
+ * assert.typeOf('tea', 'string', 'we have a string');
+ * assert.typeOf(/tea/, 'regexp', 'we have a regular expression');
+ * assert.typeOf(null, 'null', 'we have a null');
+ * assert.typeOf(undefined, 'undefined', 'we have an undefined');
+ *
+ * @name typeOf
+ * @param {Mixed} value
+ * @param {String} name
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.typeOf = function (val, type, msg) {
+ new Assertion(val, msg).to.be.a(type);
+ };
+
+ /**
+ * ### .notTypeOf(value, name, [message])
+ *
+ * Asserts that `value`'s type is _not_ `name`, as determined by
+ * `Object.prototype.toString`.
+ *
+ * assert.notTypeOf('tea', 'number', 'strings are not numbers');
+ *
+ * @name notTypeOf
+ * @param {Mixed} value
+ * @param {String} typeof name
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.notTypeOf = function (val, type, msg) {
+ new Assertion(val, msg).to.not.be.a(type);
+ };
+
+ /**
+ * ### .instanceOf(object, constructor, [message])
+ *
+ * Asserts that `value` is an instance of `constructor`.
+ *
+ * var Tea = function (name) { this.name = name; }
+ * , chai = new Tea('chai');
+ *
+ * assert.instanceOf(chai, Tea, 'chai is an instance of tea');
+ *
+ * @name instanceOf
+ * @param {Object} object
+ * @param {Constructor} constructor
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.instanceOf = function (val, type, msg) {
+ new Assertion(val, msg).to.be.instanceOf(type);
+ };
+
+ /**
+ * ### .notInstanceOf(object, constructor, [message])
+ *
+ * Asserts `value` is not an instance of `constructor`.
+ *
+ * var Tea = function (name) { this.name = name; }
+ * , chai = new String('chai');
+ *
+ * assert.notInstanceOf(chai, Tea, 'chai is not an instance of tea');
+ *
+ * @name notInstanceOf
+ * @param {Object} object
+ * @param {Constructor} constructor
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.notInstanceOf = function (val, type, msg) {
+ new Assertion(val, msg).to.not.be.instanceOf(type);
+ };
+
+ /**
+ * ### .include(haystack, needle, [message])
+ *
+ * Asserts that `haystack` includes `needle`. Works
+ * for strings and arrays.
+ *
+ * assert.include('foobar', 'bar', 'foobar contains string "bar"');
+ * assert.include([ 1, 2, 3 ], 3, 'array contains value');
+ *
+ * @name include
+ * @param {Array|String} haystack
+ * @param {Mixed} needle
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.include = function (exp, inc, msg) {
+ new Assertion(exp, msg, assert.include).include(inc);
+ };
+
+ /**
+ * ### .notInclude(haystack, needle, [message])
+ *
+ * Asserts that `haystack` does not include `needle`. Works
+ * for strings and arrays.
+ *
+ * assert.notInclude('foobar', 'baz', 'string not include substring');
+ * assert.notInclude([ 1, 2, 3 ], 4, 'array not include contain value');
+ *
+ * @name notInclude
+ * @param {Array|String} haystack
+ * @param {Mixed} needle
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.notInclude = function (exp, inc, msg) {
+ new Assertion(exp, msg, assert.notInclude).not.include(inc);
+ };
+
+ /**
+ * ### .match(value, regexp, [message])
+ *
+ * Asserts that `value` matches the regular expression `regexp`.
+ *
+ * assert.match('foobar', /^foo/, 'regexp matches');
+ *
+ * @name match
+ * @param {Mixed} value
+ * @param {RegExp} regexp
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.match = function (exp, re, msg) {
+ new Assertion(exp, msg).to.match(re);
+ };
+
+ /**
+ * ### .notMatch(value, regexp, [message])
+ *
+ * Asserts that `value` does not match the regular expression `regexp`.
+ *
+ * assert.notMatch('foobar', /^foo/, 'regexp does not match');
+ *
+ * @name notMatch
+ * @param {Mixed} value
+ * @param {RegExp} regexp
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.notMatch = function (exp, re, msg) {
+ new Assertion(exp, msg).to.not.match(re);
+ };
+
+ /**
+ * ### .property(object, property, [message])
+ *
+ * Asserts that `object` has a property named by `property`.
+ *
+ * assert.property({ tea: { green: 'matcha' }}, 'tea');
+ *
+ * @name property
+ * @param {Object} object
+ * @param {String} property
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.property = function (obj, prop, msg) {
+ new Assertion(obj, msg).to.have.property(prop);
+ };
+
+ /**
+ * ### .notProperty(object, property, [message])
+ *
+ * Asserts that `object` does _not_ have a property named by `property`.
+ *
+ * assert.notProperty({ tea: { green: 'matcha' }}, 'coffee');
+ *
+ * @name notProperty
+ * @param {Object} object
+ * @param {String} property
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.notProperty = function (obj, prop, msg) {
+ new Assertion(obj, msg).to.not.have.property(prop);
+ };
+
+ /**
+ * ### .deepProperty(object, property, [message])
+ *
+ * Asserts that `object` has a property named by `property`, which can be a
+ * string using dot- and bracket-notation for deep reference.
+ *
+ * assert.deepProperty({ tea: { green: 'matcha' }}, 'tea.green');
+ *
+ * @name deepProperty
+ * @param {Object} object
+ * @param {String} property
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.deepProperty = function (obj, prop, msg) {
+ new Assertion(obj, msg).to.have.deep.property(prop);
+ };
+
+ /**
+ * ### .notDeepProperty(object, property, [message])
+ *
+ * Asserts that `object` does _not_ have a property named by `property`, which
+ * can be a string using dot- and bracket-notation for deep reference.
+ *
+ * assert.notDeepProperty({ tea: { green: 'matcha' }}, 'tea.oolong');
+ *
+ * @name notDeepProperty
+ * @param {Object} object
+ * @param {String} property
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.notDeepProperty = function (obj, prop, msg) {
+ new Assertion(obj, msg).to.not.have.deep.property(prop);
+ };
+
+ /**
+ * ### .propertyVal(object, property, value, [message])
+ *
+ * Asserts that `object` has a property named by `property` with value given
+ * by `value`.
+ *
+ * assert.propertyVal({ tea: 'is good' }, 'tea', 'is good');
+ *
+ * @name propertyVal
+ * @param {Object} object
+ * @param {String} property
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.propertyVal = function (obj, prop, val, msg) {
+ new Assertion(obj, msg).to.have.property(prop, val);
+ };
+
+ /**
+ * ### .propertyNotVal(object, property, value, [message])
+ *
+ * Asserts that `object` has a property named by `property`, but with a value
+ * different from that given by `value`.
+ *
+ * assert.propertyNotVal({ tea: 'is good' }, 'tea', 'is bad');
+ *
+ * @name propertyNotVal
+ * @param {Object} object
+ * @param {String} property
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.propertyNotVal = function (obj, prop, val, msg) {
+ new Assertion(obj, msg).to.not.have.property(prop, val);
+ };
+
+ /**
+ * ### .deepPropertyVal(object, property, value, [message])
+ *
+ * Asserts that `object` has a property named by `property` with value given
+ * by `value`. `property` can use dot- and bracket-notation for deep
+ * reference.
+ *
+ * assert.deepPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'matcha');
+ *
+ * @name deepPropertyVal
+ * @param {Object} object
+ * @param {String} property
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.deepPropertyVal = function (obj, prop, val, msg) {
+ new Assertion(obj, msg).to.have.deep.property(prop, val);
+ };
+
+ /**
+ * ### .deepPropertyNotVal(object, property, value, [message])
+ *
+ * Asserts that `object` has a property named by `property`, but with a value
+ * different from that given by `value`. `property` can use dot- and
+ * bracket-notation for deep reference.
+ *
+ * assert.deepPropertyNotVal({ tea: { green: 'matcha' }}, 'tea.green', 'konacha');
+ *
+ * @name deepPropertyNotVal
+ * @param {Object} object
+ * @param {String} property
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.deepPropertyNotVal = function (obj, prop, val, msg) {
+ new Assertion(obj, msg).to.not.have.deep.property(prop, val);
+ };
+
+ /**
+ * ### .lengthOf(object, length, [message])
+ *
+ * Asserts that `object` has a `length` property with the expected value.
+ *
+ * assert.lengthOf([1,2,3], 3, 'array has length of 3');
+ * assert.lengthOf('foobar', 6, 'string has length of 6');
+ *
+ * @name lengthOf
+ * @param {Mixed} object
+ * @param {Number} length
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.lengthOf = function (exp, len, msg) {
+ new Assertion(exp, msg).to.have.length(len);
+ };
+
+ /**
+ * ### .throws(function, [constructor/string/regexp], [string/regexp], [message])
+ *
+ * Asserts that `function` will throw an error that is an instance of
+ * `constructor`, or alternately that it will throw an error with message
+ * matching `regexp`.
+ *
+ * assert.throws(fn, 'function throws a reference error');
+ * assert.throws(fn, /function throws a reference error/);
+ * assert.throws(fn, ReferenceError);
+ * assert.throws(fn, ReferenceError, 'function throws a reference error');
+ * assert.throws(fn, ReferenceError, /function throws a reference error/);
+ *
+ * @name throws
+ * @alias throw
+ * @alias Throw
+ * @param {Function} function
+ * @param {ErrorConstructor} constructor
+ * @param {RegExp} regexp
+ * @param {String} message
+ * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.throws = function (fn, errt, errs, msg) {
+ if ('string' === typeof errt || errt instanceof RegExp) {
+ errs = errt;
+ errt = null;
+ }
+
+ var assertErr = new Assertion(fn, msg).to.throw(errt, errs);
+ return flag(assertErr, 'object');
+ };
+
+ /**
+ * ### .doesNotThrow(function, [constructor/regexp], [message])
+ *
+ * Asserts that `function` will _not_ throw an error that is an instance of
+ * `constructor`, or alternately that it will not throw an error with message
+ * matching `regexp`.
+ *
+ * assert.doesNotThrow(fn, Error, 'function does not throw');
+ *
+ * @name doesNotThrow
+ * @param {Function} function
+ * @param {ErrorConstructor} constructor
+ * @param {RegExp} regexp
+ * @param {String} message
+ * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.doesNotThrow = function (fn, type, msg) {
+ if ('string' === typeof type) {
+ msg = type;
+ type = null;
+ }
+
+ new Assertion(fn, msg).to.not.Throw(type);
+ };
+
+ /**
+ * ### .operator(val1, operator, val2, [message])
+ *
+ * Compares two values using `operator`.
+ *
+ * assert.operator(1, '<', 2, 'everything is ok');
+ * assert.operator(1, '>', 2, 'this will fail');
+ *
+ * @name operator
+ * @param {Mixed} val1
+ * @param {String} operator
+ * @param {Mixed} val2
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.operator = function (val, operator, val2, msg) {
+ var ok;
+ switch(operator) {
+ case '==':
+ ok = val == val2;
+ break;
+ case '===':
+ ok = val === val2;
+ break;
+ case '>':
+ ok = val > val2;
+ break;
+ case '>=':
+ ok = val >= val2;
+ break;
+ case '<':
+ ok = val < val2;
+ break;
+ case '<=':
+ ok = val <= val2;
+ break;
+ case '!=':
+ ok = val != val2;
+ break;
+ case '!==':
+ ok = val !== val2;
+ break;
+ default:
+ throw new Error('Invalid operator "' + operator + '"');
+ }
+ var test = new Assertion(ok, msg);
+ test.assert(
+ true === flag(test, 'object')
+ , 'expected ' + util.inspect(val) + ' to be ' + operator + ' ' + util.inspect(val2)
+ , 'expected ' + util.inspect(val) + ' to not be ' + operator + ' ' + util.inspect(val2) );
+ };
+
+ /**
+ * ### .closeTo(actual, expected, delta, [message])
+ *
+ * Asserts that the target is equal `expected`, to within a +/- `delta` range.
+ *
+ * assert.closeTo(1.5, 1, 0.5, 'numbers are close');
+ *
+ * @name closeTo
+ * @param {Number} actual
+ * @param {Number} expected
+ * @param {Number} delta
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.closeTo = function (act, exp, delta, msg) {
+ new Assertion(act, msg).to.be.closeTo(exp, delta);
+ };
+
+ /**
+ * ### .approximately(actual, expected, delta, [message])
+ *
+ * Asserts that the target is equal `expected`, to within a +/- `delta` range.
+ *
+ * assert.approximately(1.5, 1, 0.5, 'numbers are close');
+ *
+ * @name approximately
+ * @param {Number} actual
+ * @param {Number} expected
+ * @param {Number} delta
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.approximately = function (act, exp, delta, msg) {
+ new Assertion(act, msg).to.be.approximately(exp, delta);
+ };
+
+ /**
+ * ### .sameMembers(set1, set2, [message])
+ *
+ * Asserts that `set1` and `set2` have the same members.
+ * Order is not taken into account.
+ *
+ * assert.sameMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'same members');
+ *
+ * @name sameMembers
+ * @param {Array} set1
+ * @param {Array} set2
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.sameMembers = function (set1, set2, msg) {
+ new Assertion(set1, msg).to.have.same.members(set2);
+ }
+
+ /**
+ * ### .sameDeepMembers(set1, set2, [message])
+ *
+ * Asserts that `set1` and `set2` have the same members - using a deep equality checking.
+ * Order is not taken into account.
+ *
+ * assert.sameDeepMembers([ {b: 3}, {a: 2}, {c: 5} ], [ {c: 5}, {b: 3}, {a: 2} ], 'same deep members');
+ *
+ * @name sameDeepMembers
+ * @param {Array} set1
+ * @param {Array} set2
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.sameDeepMembers = function (set1, set2, msg) {
+ new Assertion(set1, msg).to.have.same.deep.members(set2);
+ }
+
+ /**
+ * ### .includeMembers(superset, subset, [message])
+ *
+ * Asserts that `subset` is included in `superset`.
+ * Order is not taken into account.
+ *
+ * assert.includeMembers([ 1, 2, 3 ], [ 2, 1 ], 'include members');
+ *
+ * @name includeMembers
+ * @param {Array} superset
+ * @param {Array} subset
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.includeMembers = function (superset, subset, msg) {
+ new Assertion(superset, msg).to.include.members(subset);
+ }
+
+ /**
+ * ### .includeDeepMembers(superset, subset, [message])
+ *
+ * Asserts that `subset` is included in `superset` - using deep equality checking.
+ * Order is not taken into account.
+ * Duplicates are ignored.
+ *
+ * assert.includeDeepMembers([ {a: 1}, {b: 2}, {c: 3} ], [ {b: 2}, {a: 1}, {b: 2} ], 'include deep members');
+ *
+ * @name includeDeepMembers
+ * @param {Array} superset
+ * @param {Array} subset
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.includeDeepMembers = function (superset, subset, msg) {
+ new Assertion(superset, msg).to.include.deep.members(subset);
+ }
+
+ /**
+ * ### .oneOf(inList, list, [message])
+ *
+ * Asserts that non-object, non-array value `inList` appears in the flat array `list`.
+ *
+ * assert.oneOf(1, [ 2, 1 ], 'Not found in list');
+ *
+ * @name oneOf
+ * @param {*} inList
+ * @param {Array<*>} list
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.oneOf = function (inList, list, msg) {
+ new Assertion(inList, msg).to.be.oneOf(list);
+ }
+
+ /**
+ * ### .changes(function, object, property)
+ *
+ * Asserts that a function changes the value of a property
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { obj.val = 22 };
+ * assert.changes(fn, obj, 'val');
+ *
+ * @name changes
+ * @param {Function} modifier function
+ * @param {Object} object
+ * @param {String} property name
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.changes = function (fn, obj, prop) {
+ new Assertion(fn).to.change(obj, prop);
+ }
+
+ /**
+ * ### .doesNotChange(function, object, property)
+ *
+ * Asserts that a function does not changes the value of a property
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { console.log('foo'); };
+ * assert.doesNotChange(fn, obj, 'val');
+ *
+ * @name doesNotChange
+ * @param {Function} modifier function
+ * @param {Object} object
+ * @param {String} property name
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.doesNotChange = function (fn, obj, prop) {
+ new Assertion(fn).to.not.change(obj, prop);
+ }
+
+ /**
+ * ### .increases(function, object, property)
+ *
+ * Asserts that a function increases an object property
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { obj.val = 13 };
+ * assert.increases(fn, obj, 'val');
+ *
+ * @name increases
+ * @param {Function} modifier function
+ * @param {Object} object
+ * @param {String} property name
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.increases = function (fn, obj, prop) {
+ new Assertion(fn).to.increase(obj, prop);
+ }
+
+ /**
+ * ### .doesNotIncrease(function, object, property)
+ *
+ * Asserts that a function does not increase object property
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { obj.val = 8 };
+ * assert.doesNotIncrease(fn, obj, 'val');
+ *
+ * @name doesNotIncrease
+ * @param {Function} modifier function
+ * @param {Object} object
+ * @param {String} property name
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.doesNotIncrease = function (fn, obj, prop) {
+ new Assertion(fn).to.not.increase(obj, prop);
+ }
+
+ /**
+ * ### .decreases(function, object, property)
+ *
+ * Asserts that a function decreases an object property
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { obj.val = 5 };
+ * assert.decreases(fn, obj, 'val');
+ *
+ * @name decreases
+ * @param {Function} modifier function
+ * @param {Object} object
+ * @param {String} property name
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.decreases = function (fn, obj, prop) {
+ new Assertion(fn).to.decrease(obj, prop);
+ }
+
+ /**
+ * ### .doesNotDecrease(function, object, property)
+ *
+ * Asserts that a function does not decreases an object property
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { obj.val = 15 };
+ * assert.doesNotDecrease(fn, obj, 'val');
+ *
+ * @name doesNotDecrease
+ * @param {Function} modifier function
+ * @param {Object} object
+ * @param {String} property name
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.doesNotDecrease = function (fn, obj, prop) {
+ new Assertion(fn).to.not.decrease(obj, prop);
+ }
+
+ /*!
+ * ### .ifError(object)
+ *
+ * Asserts if value is not a false value, and throws if it is a true value.
+ * This is added to allow for chai to be a drop-in replacement for Node's
+ * assert class.
+ *
+ * var err = new Error('I am a custom error');
+ * assert.ifError(err); // Rethrows err!
+ *
+ * @name ifError
+ * @param {Object} object
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.ifError = function (val) {
+ if (val) {
+ throw(val);
+ }
+ };
+
+ /**
+ * ### .isExtensible(object)
+ *
+ * Asserts that `object` is extensible (can have new properties added to it).
+ *
+ * assert.isExtensible({});
+ *
+ * @name isExtensible
+ * @alias extensible
+ * @param {Object} object
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isExtensible = function (obj, msg) {
+ new Assertion(obj, msg).to.be.extensible;
+ };
+
+ /**
+ * ### .isNotExtensible(object)
+ *
+ * Asserts that `object` is _not_ extensible.
+ *
+ * var nonExtensibleObject = Object.preventExtensions({});
+ * var sealedObject = Object.seal({});
+ * var frozenObject = Object.freese({});
+ *
+ * assert.isNotExtensible(nonExtensibleObject);
+ * assert.isNotExtensible(sealedObject);
+ * assert.isNotExtensible(frozenObject);
+ *
+ * @name isNotExtensible
+ * @alias notExtensible
+ * @param {Object} object
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isNotExtensible = function (obj, msg) {
+ new Assertion(obj, msg).to.not.be.extensible;
+ };
+
+ /**
+ * ### .isSealed(object)
+ *
+ * Asserts that `object` is sealed (cannot have new properties added to it
+ * and its existing properties cannot be removed).
+ *
+ * var sealedObject = Object.seal({});
+ * var frozenObject = Object.seal({});
+ *
+ * assert.isSealed(sealedObject);
+ * assert.isSealed(frozenObject);
+ *
+ * @name isSealed
+ * @alias sealed
+ * @param {Object} object
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isSealed = function (obj, msg) {
+ new Assertion(obj, msg).to.be.sealed;
+ };
+
+ /**
+ * ### .isNotSealed(object)
+ *
+ * Asserts that `object` is _not_ sealed.
+ *
+ * assert.isNotSealed({});
+ *
+ * @name isNotSealed
+ * @alias notSealed
+ * @param {Object} object
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isNotSealed = function (obj, msg) {
+ new Assertion(obj, msg).to.not.be.sealed;
+ };
+
+ /**
+ * ### .isFrozen(object)
+ *
+ * Asserts that `object` is frozen (cannot have new properties added to it
+ * and its existing properties cannot be modified).
+ *
+ * var frozenObject = Object.freeze({});
+ * assert.frozen(frozenObject);
+ *
+ * @name isFrozen
+ * @alias frozen
+ * @param {Object} object
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isFrozen = function (obj, msg) {
+ new Assertion(obj, msg).to.be.frozen;
+ };
+
+ /**
+ * ### .isNotFrozen(object)
+ *
+ * Asserts that `object` is _not_ frozen.
+ *
+ * assert.isNotFrozen({});
+ *
+ * @name isNotFrozen
+ * @alias notFrozen
+ * @param {Object} object
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isNotFrozen = function (obj, msg) {
+ new Assertion(obj, msg).to.not.be.frozen;
+ };
+
+ /*!
+ * Aliases.
+ */
+
+ (function alias(name, as){
+ assert[as] = assert[name];
+ return alias;
+ })
+ ('isOk', 'ok')
+ ('isNotOk', 'notOk')
+ ('throws', 'throw')
+ ('throws', 'Throw')
+ ('isExtensible', 'extensible')
+ ('isNotExtensible', 'notExtensible')
+ ('isSealed', 'sealed')
+ ('isNotSealed', 'notSealed')
+ ('isFrozen', 'frozen')
+ ('isNotFrozen', 'notFrozen');
+};
+
+},{}],7:[function(require,module,exports){
+/*!
+ * chai
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+module.exports = function (chai, util) {
+ chai.expect = function (val, message) {
+ return new chai.Assertion(val, message);
+ };
+
+ /**
+ * ### .fail(actual, expected, [message], [operator])
+ *
+ * Throw a failure.
+ *
+ * @name fail
+ * @param {Mixed} actual
+ * @param {Mixed} expected
+ * @param {String} message
+ * @param {String} operator
+ * @namespace Expect
+ * @api public
+ */
+
+ chai.expect.fail = function (actual, expected, message, operator) {
+ message = message || 'expect.fail()';
+ throw new chai.AssertionError(message, {
+ actual: actual
+ , expected: expected
+ , operator: operator
+ }, chai.expect.fail);
+ };
+};
+
+},{}],8:[function(require,module,exports){
+/*!
+ * chai
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+module.exports = function (chai, util) {
+ var Assertion = chai.Assertion;
+
+ function loadShould () {
+ // explicitly define this method as function as to have it's name to include as `ssfi`
+ function shouldGetter() {
+ if (this instanceof String || this instanceof Number || this instanceof Boolean ) {
+ return new Assertion(this.valueOf(), null, shouldGetter);
+ }
+ return new Assertion(this, null, shouldGetter);
+ }
+ function shouldSetter(value) {
+ // See https://github.com/chaijs/chai/issues/86: this makes
+ // `whatever.should = someValue` actually set `someValue`, which is
+ // especially useful for `global.should = require('chai').should()`.
+ //
+ // Note that we have to use [[DefineProperty]] instead of [[Put]]
+ // since otherwise we would trigger this very setter!
+ Object.defineProperty(this, 'should', {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ }
+ // modify Object.prototype to have `should`
+ Object.defineProperty(Object.prototype, 'should', {
+ set: shouldSetter
+ , get: shouldGetter
+ , configurable: true
+ });
+
+ var should = {};
+
+ /**
+ * ### .fail(actual, expected, [message], [operator])
+ *
+ * Throw a failure.
+ *
+ * @name fail
+ * @param {Mixed} actual
+ * @param {Mixed} expected
+ * @param {String} message
+ * @param {String} operator
+ * @namespace Should
+ * @api public
+ */
+
+ should.fail = function (actual, expected, message, operator) {
+ message = message || 'should.fail()';
+ throw new chai.AssertionError(message, {
+ actual: actual
+ , expected: expected
+ , operator: operator
+ }, should.fail);
+ };
+
+ /**
+ * ### .equal(actual, expected, [message])
+ *
+ * Asserts non-strict equality (`==`) of `actual` and `expected`.
+ *
+ * should.equal(3, '3', '== coerces values to strings');
+ *
+ * @name equal
+ * @param {Mixed} actual
+ * @param {Mixed} expected
+ * @param {String} message
+ * @namespace Should
+ * @api public
+ */
+
+ should.equal = function (val1, val2, msg) {
+ new Assertion(val1, msg).to.equal(val2);
+ };
+
+ /**
+ * ### .throw(function, [constructor/string/regexp], [string/regexp], [message])
+ *
+ * Asserts that `function` will throw an error that is an instance of
+ * `constructor`, or alternately that it will throw an error with message
+ * matching `regexp`.
+ *
+ * should.throw(fn, 'function throws a reference error');
+ * should.throw(fn, /function throws a reference error/);
+ * should.throw(fn, ReferenceError);
+ * should.throw(fn, ReferenceError, 'function throws a reference error');
+ * should.throw(fn, ReferenceError, /function throws a reference error/);
+ *
+ * @name throw
+ * @alias Throw
+ * @param {Function} function
+ * @param {ErrorConstructor} constructor
+ * @param {RegExp} regexp
+ * @param {String} message
+ * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
+ * @namespace Should
+ * @api public
+ */
+
+ should.Throw = function (fn, errt, errs, msg) {
+ new Assertion(fn, msg).to.Throw(errt, errs);
+ };
+
+ /**
+ * ### .exist
+ *
+ * Asserts that the target is neither `null` nor `undefined`.
+ *
+ * var foo = 'hi';
+ *
+ * should.exist(foo, 'foo exists');
+ *
+ * @name exist
+ * @namespace Should
+ * @api public
+ */
+
+ should.exist = function (val, msg) {
+ new Assertion(val, msg).to.exist;
+ }
+
+ // negation
+ should.not = {}
+
+ /**
+ * ### .not.equal(actual, expected, [message])
+ *
+ * Asserts non-strict inequality (`!=`) of `actual` and `expected`.
+ *
+ * should.not.equal(3, 4, 'these numbers are not equal');
+ *
+ * @name not.equal
+ * @param {Mixed} actual
+ * @param {Mixed} expected
+ * @param {String} message
+ * @namespace Should
+ * @api public
+ */
+
+ should.not.equal = function (val1, val2, msg) {
+ new Assertion(val1, msg).to.not.equal(val2);
+ };
+
+ /**
+ * ### .throw(function, [constructor/regexp], [message])
+ *
+ * Asserts that `function` will _not_ throw an error that is an instance of
+ * `constructor`, or alternately that it will not throw an error with message
+ * matching `regexp`.
+ *
+ * should.not.throw(fn, Error, 'function does not throw');
+ *
+ * @name not.throw
+ * @alias not.Throw
+ * @param {Function} function
+ * @param {ErrorConstructor} constructor
+ * @param {RegExp} regexp
+ * @param {String} message
+ * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
+ * @namespace Should
+ * @api public
+ */
+
+ should.not.Throw = function (fn, errt, errs, msg) {
+ new Assertion(fn, msg).to.not.Throw(errt, errs);
+ };
+
+ /**
+ * ### .not.exist
+ *
+ * Asserts that the target is neither `null` nor `undefined`.
+ *
+ * var bar = null;
+ *
+ * should.not.exist(bar, 'bar does not exist');
+ *
+ * @name not.exist
+ * @namespace Should
+ * @api public
+ */
+
+ should.not.exist = function (val, msg) {
+ new Assertion(val, msg).to.not.exist;
+ }
+
+ should['throw'] = should['Throw'];
+ should.not['throw'] = should.not['Throw'];
+
+ return should;
+ };
+
+ chai.should = loadShould;
+ chai.Should = loadShould;
+};
+
+},{}],9:[function(require,module,exports){
+/*!
+ * Chai - addChainingMethod utility
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+/*!
+ * Module dependencies
+ */
+
+var transferFlags = require('./transferFlags');
+var flag = require('./flag');
+var config = require('../config');
+
+/*!
+ * Module variables
+ */
+
+// Check whether `__proto__` is supported
+var hasProtoSupport = '__proto__' in Object;
+
+// Without `__proto__` support, this module will need to add properties to a function.
+// However, some Function.prototype methods cannot be overwritten,
+// and there seems no easy cross-platform way to detect them (@see chaijs/chai/issues/69).
+var excludeNames = /^(?:length|name|arguments|caller)$/;
+
+// Cache `Function` properties
+var call = Function.prototype.call,
+ apply = Function.prototype.apply;
+
+/**
+ * ### addChainableMethod (ctx, name, method, chainingBehavior)
+ *
+ * Adds a method to an object, such that the method can also be chained.
+ *
+ * utils.addChainableMethod(chai.Assertion.prototype, 'foo', function (str) {
+ * var obj = utils.flag(this, 'object');
+ * new chai.Assertion(obj).to.be.equal(str);
+ * });
+ *
+ * Can also be accessed directly from `chai.Assertion`.
+ *
+ * chai.Assertion.addChainableMethod('foo', fn, chainingBehavior);
+ *
+ * The result can then be used as both a method assertion, executing both `method` and
+ * `chainingBehavior`, or as a language chain, which only executes `chainingBehavior`.
+ *
+ * expect(fooStr).to.be.foo('bar');
+ * expect(fooStr).to.be.foo.equal('foo');
+ *
+ * @param {Object} ctx object to which the method is added
+ * @param {String} name of method to add
+ * @param {Function} method function to be used for `name`, when called
+ * @param {Function} chainingBehavior function to be called every time the property is accessed
+ * @namespace Utils
+ * @name addChainableMethod
+ * @api public
+ */
+
+module.exports = function (ctx, name, method, chainingBehavior) {
+ if (typeof chainingBehavior !== 'function') {
+ chainingBehavior = function () { };
+ }
+
+ var chainableBehavior = {
+ method: method
+ , chainingBehavior: chainingBehavior
+ };
+
+ // save the methods so we can overwrite them later, if we need to.
+ if (!ctx.__methods) {
+ ctx.__methods = {};
+ }
+ ctx.__methods[name] = chainableBehavior;
+
+ Object.defineProperty(ctx, name,
+ { get: function () {
+ chainableBehavior.chainingBehavior.call(this);
+
+ var assert = function assert() {
+ var old_ssfi = flag(this, 'ssfi');
+ if (old_ssfi && config.includeStack === false)
+ flag(this, 'ssfi', assert);
+ var result = chainableBehavior.method.apply(this, arguments);
+ return result === undefined ? this : result;
+ };
+
+ // Use `__proto__` if available
+ if (hasProtoSupport) {
+ // Inherit all properties from the object by replacing the `Function` prototype
+ var prototype = assert.__proto__ = Object.create(this);
+ // Restore the `call` and `apply` methods from `Function`
+ prototype.call = call;
+ prototype.apply = apply;
+ }
+ // Otherwise, redefine all properties (slow!)
+ else {
+ var asserterNames = Object.getOwnPropertyNames(ctx);
+ asserterNames.forEach(function (asserterName) {
+ if (!excludeNames.test(asserterName)) {
+ var pd = Object.getOwnPropertyDescriptor(ctx, asserterName);
+ Object.defineProperty(assert, asserterName, pd);
+ }
+ });
+ }
+
+ transferFlags(this, assert);
+ return assert;
+ }
+ , configurable: true
+ });
+};
+
+},{"../config":4,"./flag":13,"./transferFlags":29}],10:[function(require,module,exports){
+/*!
+ * Chai - addMethod utility
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+var config = require('../config');
+
+/**
+ * ### .addMethod (ctx, name, method)
+ *
+ * Adds a method to the prototype of an object.
+ *
+ * utils.addMethod(chai.Assertion.prototype, 'foo', function (str) {
+ * var obj = utils.flag(this, 'object');
+ * new chai.Assertion(obj).to.be.equal(str);
+ * });
+ *
+ * Can also be accessed directly from `chai.Assertion`.
+ *
+ * chai.Assertion.addMethod('foo', fn);
+ *
+ * Then can be used as any other assertion.
+ *
+ * expect(fooStr).to.be.foo('bar');
+ *
+ * @param {Object} ctx object to which the method is added
+ * @param {String} name of method to add
+ * @param {Function} method function to be used for name
+ * @namespace Utils
+ * @name addMethod
+ * @api public
+ */
+var flag = require('./flag');
+
+module.exports = function (ctx, name, method) {
+ ctx[name] = function () {
+ var old_ssfi = flag(this, 'ssfi');
+ if (old_ssfi && config.includeStack === false)
+ flag(this, 'ssfi', ctx[name]);
+ var result = method.apply(this, arguments);
+ return result === undefined ? this : result;
+ };
+};
+
+},{"../config":4,"./flag":13}],11:[function(require,module,exports){
+/*!
+ * Chai - addProperty utility
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+var config = require('../config');
+var flag = require('./flag');
+
+/**
+ * ### addProperty (ctx, name, getter)
+ *
+ * Adds a property to the prototype of an object.
+ *
+ * utils.addProperty(chai.Assertion.prototype, 'foo', function () {
+ * var obj = utils.flag(this, 'object');
+ * new chai.Assertion(obj).to.be.instanceof(Foo);
+ * });
+ *
+ * Can also be accessed directly from `chai.Assertion`.
+ *
+ * chai.Assertion.addProperty('foo', fn);
+ *
+ * Then can be used as any other assertion.
+ *
+ * expect(myFoo).to.be.foo;
+ *
+ * @param {Object} ctx object to which the property is added
+ * @param {String} name of property to add
+ * @param {Function} getter function to be used for name
+ * @namespace Utils
+ * @name addProperty
+ * @api public
+ */
+
+module.exports = function (ctx, name, getter) {
+ Object.defineProperty(ctx, name,
+ { get: function addProperty() {
+ var old_ssfi = flag(this, 'ssfi');
+ if (old_ssfi && config.includeStack === false)
+ flag(this, 'ssfi', addProperty);
+
+ var result = getter.call(this);
+ return result === undefined ? this : result;
+ }
+ , configurable: true
+ });
+};
+
+},{"../config":4,"./flag":13}],12:[function(require,module,exports){
+/*!
+ * Chai - expectTypes utility
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+/**
+ * ### expectTypes(obj, types)
+ *
+ * Ensures that the object being tested against is of a valid type.
+ *
+ * utils.expectTypes(this, ['array', 'object', 'string']);
+ *
+ * @param {Mixed} obj constructed Assertion
+ * @param {Array} type A list of allowed types for this assertion
+ * @namespace Utils
+ * @name expectTypes
+ * @api public
+ */
+
+var AssertionError = require('assertion-error');
+var flag = require('./flag');
+var type = require('type-detect');
+
+module.exports = function (obj, types) {
+ var obj = flag(obj, 'object');
+ types = types.map(function (t) { return t.toLowerCase(); });
+ types.sort();
+
+ // Transforms ['lorem', 'ipsum'] into 'a lirum, or an ipsum'
+ var str = types.map(function (t, index) {
+ var art = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(t.charAt(0)) ? 'an' : 'a';
+ var or = types.length > 1 && index === types.length - 1 ? 'or ' : '';
+ return or + art + ' ' + t;
+ }).join(', ');
+
+ if (!types.some(function (expected) { return type(obj) === expected; })) {
+ throw new AssertionError(
+ 'object tested must be ' + str + ', but ' + type(obj) + ' given'
+ );
+ }
+};
+
+},{"./flag":13,"assertion-error":30,"type-detect":35}],13:[function(require,module,exports){
+/*!
+ * Chai - flag utility
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+/**
+ * ### flag(object, key, [value])
+ *
+ * Get or set a flag value on an object. If a
+ * value is provided it will be set, else it will
+ * return the currently set value or `undefined` if
+ * the value is not set.
+ *
+ * utils.flag(this, 'foo', 'bar'); // setter
+ * utils.flag(this, 'foo'); // getter, returns `bar`
+ *
+ * @param {Object} object constructed Assertion
+ * @param {String} key
+ * @param {Mixed} value (optional)
+ * @namespace Utils
+ * @name flag
+ * @api private
+ */
+
+module.exports = function (obj, key, value) {
+ var flags = obj.__flags || (obj.__flags = Object.create(null));
+ if (arguments.length === 3) {
+ flags[key] = value;
+ } else {
+ return flags[key];
+ }
+};
+
+},{}],14:[function(require,module,exports){
+/*!
+ * Chai - getActual utility
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+/**
+ * # getActual(object, [actual])
+ *
+ * Returns the `actual` value for an Assertion
+ *
+ * @param {Object} object (constructed Assertion)
+ * @param {Arguments} chai.Assertion.prototype.assert arguments
+ * @namespace Utils
+ * @name getActual
+ */
+
+module.exports = function (obj, args) {
+ return args.length > 4 ? args[4] : obj._obj;
+};
+
+},{}],15:[function(require,module,exports){
+/*!
+ * Chai - getEnumerableProperties utility
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+/**
+ * ### .getEnumerableProperties(object)
+ *
+ * This allows the retrieval of enumerable property names of an object,
+ * inherited or not.
+ *
+ * @param {Object} object
+ * @returns {Array}
+ * @namespace Utils
+ * @name getEnumerableProperties
+ * @api public
+ */
+
+module.exports = function getEnumerableProperties(object) {
+ var result = [];
+ for (var name in object) {
+ result.push(name);
+ }
+ return result;
+};
+
+},{}],16:[function(require,module,exports){
+/*!
+ * Chai - message composition utility
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+/*!
+ * Module dependancies
+ */
+
+var flag = require('./flag')
+ , getActual = require('./getActual')
+ , inspect = require('./inspect')
+ , objDisplay = require('./objDisplay');
+
+/**
+ * ### .getMessage(object, message, negateMessage)
+ *
+ * Construct the error message based on flags
+ * and template tags. Template tags will return
+ * a stringified inspection of the object referenced.
+ *
+ * Message template tags:
+ * - `#{this}` current asserted object
+ * - `#{act}` actual value
+ * - `#{exp}` expected value
+ *
+ * @param {Object} object (constructed Assertion)
+ * @param {Arguments} chai.Assertion.prototype.assert arguments
+ * @namespace Utils
+ * @name getMessage
+ * @api public
+ */
+
+module.exports = function (obj, args) {
+ var negate = flag(obj, 'negate')
+ , val = flag(obj, 'object')
+ , expected = args[3]
+ , actual = getActual(obj, args)
+ , msg = negate ? args[2] : args[1]
+ , flagMsg = flag(obj, 'message');
+
+ if(typeof msg === "function") msg = msg();
+ msg = msg || '';
+ msg = msg
+ .replace(/#\{this\}/g, function () { return objDisplay(val); })
+ .replace(/#\{act\}/g, function () { return objDisplay(actual); })
+ .replace(/#\{exp\}/g, function () { return objDisplay(expected); });
+
+ return flagMsg ? flagMsg + ': ' + msg : msg;
+};
+
+},{"./flag":13,"./getActual":14,"./inspect":23,"./objDisplay":24}],17:[function(require,module,exports){
+/*!
+ * Chai - getName utility
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+/**
+ * # getName(func)
+ *
+ * Gets the name of a function, in a cross-browser way.
+ *
+ * @param {Function} a function (usually a constructor)
+ * @namespace Utils
+ * @name getName
+ */
+
+module.exports = function (func) {
+ if (func.name) return func.name;
+
+ var match = /^\s?function ([^(]*)\(/.exec(func);
+ return match && match[1] ? match[1] : "";
+};
+
+},{}],18:[function(require,module,exports){
+/*!
+ * Chai - getPathInfo utility
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+var hasProperty = require('./hasProperty');
+
+/**
+ * ### .getPathInfo(path, object)
+ *
+ * This allows the retrieval of property info in an
+ * object given a string path.
+ *
+ * The path info consists of an object with the
+ * following properties:
+ *
+ * * parent - The parent object of the property referenced by `path`
+ * * name - The name of the final property, a number if it was an array indexer
+ * * value - The value of the property, if it exists, otherwise `undefined`
+ * * exists - Whether the property exists or not
+ *
+ * @param {String} path
+ * @param {Object} object
+ * @returns {Object} info
+ * @namespace Utils
+ * @name getPathInfo
+ * @api public
+ */
+
+module.exports = function getPathInfo(path, obj) {
+ var parsed = parsePath(path),
+ last = parsed[parsed.length - 1];
+
+ var info = {
+ parent: parsed.length > 1 ? _getPathValue(parsed, obj, parsed.length - 1) : obj,
+ name: last.p || last.i,
+ value: _getPathValue(parsed, obj)
+ };
+ info.exists = hasProperty(info.name, info.parent);
+
+ return info;
+};
+
+
+/*!
+ * ## parsePath(path)
+ *
+ * Helper function used to parse string object
+ * paths. Use in conjunction with `_getPathValue`.
+ *
+ * var parsed = parsePath('myobject.property.subprop');
+ *
+ * ### Paths:
+ *
+ * * Can be as near infinitely deep and nested
+ * * Arrays are also valid using the formal `myobject.document[3].property`.
+ * * Literal dots and brackets (not delimiter) must be backslash-escaped.
+ *
+ * @param {String} path
+ * @returns {Object} parsed
+ * @api private
+ */
+
+function parsePath (path) {
+ var str = path.replace(/([^\\])\[/g, '$1.[')
+ , parts = str.match(/(\\\.|[^.]+?)+/g);
+ return parts.map(function (value) {
+ var re = /^\[(\d+)\]$/
+ , mArr = re.exec(value);
+ if (mArr) return { i: parseFloat(mArr[1]) };
+ else return { p: value.replace(/\\([.\[\]])/g, '$1') };
+ });
+}
+
+
+/*!
+ * ## _getPathValue(parsed, obj)
+ *
+ * Helper companion function for `.parsePath` that returns
+ * the value located at the parsed address.
+ *
+ * var value = getPathValue(parsed, obj);
+ *
+ * @param {Object} parsed definition from `parsePath`.
+ * @param {Object} object to search against
+ * @param {Number} object to search against
+ * @returns {Object|Undefined} value
+ * @api private
+ */
+
+function _getPathValue (parsed, obj, index) {
+ var tmp = obj
+ , res;
+
+ index = (index === undefined ? parsed.length : index);
+
+ for (var i = 0, l = index; i < l; i++) {
+ var part = parsed[i];
+ if (tmp) {
+ if ('undefined' !== typeof part.p)
+ tmp = tmp[part.p];
+ else if ('undefined' !== typeof part.i)
+ tmp = tmp[part.i];
+ if (i == (l - 1)) res = tmp;
+ } else {
+ res = undefined;
+ }
+ }
+ return res;
+}
+
+},{"./hasProperty":21}],19:[function(require,module,exports){
+/*!
+ * Chai - getPathValue utility
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
+ * @see https://github.com/logicalparadox/filtr
+ * MIT Licensed
+ */
+
+var getPathInfo = require('./getPathInfo');
+
+/**
+ * ### .getPathValue(path, object)
+ *
+ * This allows the retrieval of values in an
+ * object given a string path.
+ *
+ * var obj = {
+ * prop1: {
+ * arr: ['a', 'b', 'c']
+ * , str: 'Hello'
+ * }
+ * , prop2: {
+ * arr: [ { nested: 'Universe' } ]
+ * , str: 'Hello again!'
+ * }
+ * }
+ *
+ * The following would be the results.
+ *
+ * getPathValue('prop1.str', obj); // Hello
+ * getPathValue('prop1.att[2]', obj); // b
+ * getPathValue('prop2.arr[0].nested', obj); // Universe
+ *
+ * @param {String} path
+ * @param {Object} object
+ * @returns {Object} value or `undefined`
+ * @namespace Utils
+ * @name getPathValue
+ * @api public
+ */
+module.exports = function(path, obj) {
+ var info = getPathInfo(path, obj);
+ return info.value;
+};
+
+},{"./getPathInfo":18}],20:[function(require,module,exports){
+/*!
+ * Chai - getProperties utility
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+/**
+ * ### .getProperties(object)
+ *
+ * This allows the retrieval of property names of an object, enumerable or not,
+ * inherited or not.
+ *
+ * @param {Object} object
+ * @returns {Array}
+ * @namespace Utils
+ * @name getProperties
+ * @api public
+ */
+
+module.exports = function getProperties(object) {
+ var result = Object.getOwnPropertyNames(object);
+
+ function addProperty(property) {
+ if (result.indexOf(property) === -1) {
+ result.push(property);
+ }
+ }
+
+ var proto = Object.getPrototypeOf(object);
+ while (proto !== null) {
+ Object.getOwnPropertyNames(proto).forEach(addProperty);
+ proto = Object.getPrototypeOf(proto);
+ }
+
+ return result;
+};
+
+},{}],21:[function(require,module,exports){
+/*!
+ * Chai - hasProperty utility
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+var type = require('type-detect');
+
+/**
+ * ### .hasProperty(object, name)
+ *
+ * This allows checking whether an object has
+ * named property or numeric array index.
+ *
+ * Basically does the same thing as the `in`
+ * operator but works properly with natives
+ * and null/undefined values.
+ *
+ * var obj = {
+ * arr: ['a', 'b', 'c']
+ * , str: 'Hello'
+ * }
+ *
+ * The following would be the results.
+ *
+ * hasProperty('str', obj); // true
+ * hasProperty('constructor', obj); // true
+ * hasProperty('bar', obj); // false
+ *
+ * hasProperty('length', obj.str); // true
+ * hasProperty(1, obj.str); // true
+ * hasProperty(5, obj.str); // false
+ *
+ * hasProperty('length', obj.arr); // true
+ * hasProperty(2, obj.arr); // true
+ * hasProperty(3, obj.arr); // false
+ *
+ * @param {Objuect} object
+ * @param {String|Number} name
+ * @returns {Boolean} whether it exists
+ * @namespace Utils
+ * @name getPathInfo
+ * @api public
+ */
+
+var literals = {
+ 'number': Number
+ , 'string': String
+};
+
+module.exports = function hasProperty(name, obj) {
+ var ot = type(obj);
+
+ // Bad Object, obviously no props at all
+ if(ot === 'null' || ot === 'undefined')
+ return false;
+
+ // The `in` operator does not work with certain literals
+ // box these before the check
+ if(literals[ot] && typeof obj !== 'object')
+ obj = new literals[ot](obj);
+
+ return name in obj;
+};
+
+},{"type-detect":35}],22:[function(require,module,exports){
+/*!
+ * chai
+ * Copyright(c) 2011 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+/*!
+ * Main exports
+ */
+
+var exports = module.exports = {};
+
+/*!
+ * test utility
+ */
+
+exports.test = require('./test');
+
+/*!
+ * type utility
+ */
+
+exports.type = require('type-detect');
+
+/*!
+ * expectTypes utility
+ */
+exports.expectTypes = require('./expectTypes');
+
+/*!
+ * message utility
+ */
+
+exports.getMessage = require('./getMessage');
+
+/*!
+ * actual utility
+ */
+
+exports.getActual = require('./getActual');
+
+/*!
+ * Inspect util
+ */
+
+exports.inspect = require('./inspect');
+
+/*!
+ * Object Display util
+ */
+
+exports.objDisplay = require('./objDisplay');
+
+/*!
+ * Flag utility
+ */
+
+exports.flag = require('./flag');
+
+/*!
+ * Flag transferring utility
+ */
+
+exports.transferFlags = require('./transferFlags');
+
+/*!
+ * Deep equal utility
+ */
+
+exports.eql = require('deep-eql');
+
+/*!
+ * Deep path value
+ */
+
+exports.getPathValue = require('./getPathValue');
+
+/*!
+ * Deep path info
+ */
+
+exports.getPathInfo = require('./getPathInfo');
+
+/*!
+ * Check if a property exists
+ */
+
+exports.hasProperty = require('./hasProperty');
+
+/*!
+ * Function name
+ */
+
+exports.getName = require('./getName');
+
+/*!
+ * add Property
+ */
+
+exports.addProperty = require('./addProperty');
+
+/*!
+ * add Method
+ */
+
+exports.addMethod = require('./addMethod');
+
+/*!
+ * overwrite Property
+ */
+
+exports.overwriteProperty = require('./overwriteProperty');
+
+/*!
+ * overwrite Method
+ */
+
+exports.overwriteMethod = require('./overwriteMethod');
+
+/*!
+ * Add a chainable method
+ */
+
+exports.addChainableMethod = require('./addChainableMethod');
+
+/*!
+ * Overwrite chainable method
+ */
+
+exports.overwriteChainableMethod = require('./overwriteChainableMethod');
+
+},{"./addChainableMethod":9,"./addMethod":10,"./addProperty":11,"./expectTypes":12,"./flag":13,"./getActual":14,"./getMessage":16,"./getName":17,"./getPathInfo":18,"./getPathValue":19,"./hasProperty":21,"./inspect":23,"./objDisplay":24,"./overwriteChainableMethod":25,"./overwriteMethod":26,"./overwriteProperty":27,"./test":28,"./transferFlags":29,"deep-eql":31,"type-detect":35}],23:[function(require,module,exports){
+// This is (almost) directly from Node.js utils
+// https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/util.js
+
+var getName = require('./getName');
+var getProperties = require('./getProperties');
+var getEnumerableProperties = require('./getEnumerableProperties');
+
+module.exports = inspect;
+
+/**
+ * Echos the value of a value. Trys to print the value out
+ * in the best way possible given the different types.
+ *
+ * @param {Object} obj The object to print out.
+ * @param {Boolean} showHidden Flag that shows hidden (not enumerable)
+ * properties of objects.
+ * @param {Number} depth Depth in which to descend in object. Default is 2.
+ * @param {Boolean} colors Flag to turn on ANSI escape codes to color the
+ * output. Default is false (no coloring).
+ * @namespace Utils
+ * @name inspect
+ */
+function inspect(obj, showHidden, depth, colors) {
+ var ctx = {
+ showHidden: showHidden,
+ seen: [],
+ stylize: function (str) { return str; }
+ };
+ return formatValue(ctx, obj, (typeof depth === 'undefined' ? 2 : depth));
+}
+
+// Returns true if object is a DOM element.
+var isDOMElement = function (object) {
+ if (typeof HTMLElement === 'object') {
+ return object instanceof HTMLElement;
+ } else {
+ return object &&
+ typeof object === 'object' &&
+ object.nodeType === 1 &&
+ typeof object.nodeName === 'string';
+ }
+};
+
+function formatValue(ctx, value, recurseTimes) {
+ // Provide a hook for user-specified inspect functions.
+ // Check that value is an object with an inspect function on it
+ if (value && typeof value.inspect === 'function' &&
+ // Filter out the util module, it's inspect function is special
+ value.inspect !== exports.inspect &&
+ // Also filter out any prototype objects using the circular check.
+ !(value.constructor && value.constructor.prototype === value)) {
+ var ret = value.inspect(recurseTimes);
+ if (typeof ret !== 'string') {
+ ret = formatValue(ctx, ret, recurseTimes);
+ }
+ return ret;
+ }
+
+ // Primitive types cannot have properties
+ var primitive = formatPrimitive(ctx, value);
+ if (primitive) {
+ return primitive;
+ }
+
+ // If this is a DOM element, try to get the outer HTML.
+ if (isDOMElement(value)) {
+ if ('outerHTML' in value) {
+ return value.outerHTML;
+ // This value does not have an outerHTML attribute,
+ // it could still be an XML element
+ } else {
+ // Attempt to serialize it
+ try {
+ if (document.xmlVersion) {
+ var xmlSerializer = new XMLSerializer();
+ return xmlSerializer.serializeToString(value);
+ } else {
+ // Firefox 11- do not support outerHTML
+ // It does, however, support innerHTML
+ // Use the following to render the element
+ var ns = "http://www.w3.org/1999/xhtml";
+ var container = document.createElementNS(ns, '_');
+
+ container.appendChild(value.cloneNode(false));
+ html = container.innerHTML
+ .replace('><', '>' + value.innerHTML + '<');
+ container.innerHTML = '';
+ return html;
+ }
+ } catch (err) {
+ // This could be a non-native DOM implementation,
+ // continue with the normal flow:
+ // printing the element as if it is an object.
+ }
+ }
+ }
+
+ // Look up the keys of the object.
+ var visibleKeys = getEnumerableProperties(value);
+ var keys = ctx.showHidden ? getProperties(value) : visibleKeys;
+
+ // Some type of object without properties can be shortcutted.
+ // In IE, errors have a single `stack` property, or if they are vanilla `Error`,
+ // a `stack` plus `description` property; ignore those for consistency.
+ if (keys.length === 0 || (isError(value) && (
+ (keys.length === 1 && keys[0] === 'stack') ||
+ (keys.length === 2 && keys[0] === 'description' && keys[1] === 'stack')
+ ))) {
+ if (typeof value === 'function') {
+ var name = getName(value);
+ var nameSuffix = name ? ': ' + name : '';
+ return ctx.stylize('[Function' + nameSuffix + ']', 'special');
+ }
+ if (isRegExp(value)) {
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+ }
+ if (isDate(value)) {
+ return ctx.stylize(Date.prototype.toUTCString.call(value), 'date');
+ }
+ if (isError(value)) {
+ return formatError(value);
+ }
+ }
+
+ var base = '', array = false, braces = ['{', '}'];
+
+ // Make Array say that they are Array
+ if (isArray(value)) {
+ array = true;
+ braces = ['[', ']'];
+ }
+
+ // Make functions say that they are functions
+ if (typeof value === 'function') {
+ var name = getName(value);
+ var nameSuffix = name ? ': ' + name : '';
+ base = ' [Function' + nameSuffix + ']';
+ }
+
+ // Make RegExps say that they are RegExps
+ if (isRegExp(value)) {
+ base = ' ' + RegExp.prototype.toString.call(value);
+ }
+
+ // Make dates with properties first say the date
+ if (isDate(value)) {
+ base = ' ' + Date.prototype.toUTCString.call(value);
+ }
+
+ // Make error with message first say the error
+ if (isError(value)) {
+ return formatError(value);
+ }
+
+ if (keys.length === 0 && (!array || value.length == 0)) {
+ return braces[0] + base + braces[1];
+ }
+
+ if (recurseTimes < 0) {
+ if (isRegExp(value)) {
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+ } else {
+ return ctx.stylize('[Object]', 'special');
+ }
+ }
+
+ ctx.seen.push(value);
+
+ var output;
+ if (array) {
+ output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
+ } else {
+ output = keys.map(function(key) {
+ return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
+ });
+ }
+
+ ctx.seen.pop();
+
+ return reduceToSingleString(output, base, braces);
+}
+
+
+function formatPrimitive(ctx, value) {
+ switch (typeof value) {
+ case 'undefined':
+ return ctx.stylize('undefined', 'undefined');
+
+ case 'string':
+ var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
+ .replace(/'/g, "\\'")
+ .replace(/\\"/g, '"') + '\'';
+ return ctx.stylize(simple, 'string');
+
+ case 'number':
+ if (value === 0 && (1/value) === -Infinity) {
+ return ctx.stylize('-0', 'number');
+ }
+ return ctx.stylize('' + value, 'number');
+
+ case 'boolean':
+ return ctx.stylize('' + value, 'boolean');
+ }
+ // For some reason typeof null is "object", so special case here.
+ if (value === null) {
+ return ctx.stylize('null', 'null');
+ }
+}
+
+
+function formatError(value) {
+ return '[' + Error.prototype.toString.call(value) + ']';
+}
+
+
+function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
+ var output = [];
+ for (var i = 0, l = value.length; i < l; ++i) {
+ if (Object.prototype.hasOwnProperty.call(value, String(i))) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+ String(i), true));
+ } else {
+ output.push('');
+ }
+ }
+ keys.forEach(function(key) {
+ if (!key.match(/^\d+$/)) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+ key, true));
+ }
+ });
+ return output;
+}
+
+
+function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
+ var name, str;
+ if (value.__lookupGetter__) {
+ if (value.__lookupGetter__(key)) {
+ if (value.__lookupSetter__(key)) {
+ str = ctx.stylize('[Getter/Setter]', 'special');
+ } else {
+ str = ctx.stylize('[Getter]', 'special');
+ }
+ } else {
+ if (value.__lookupSetter__(key)) {
+ str = ctx.stylize('[Setter]', 'special');
+ }
+ }
+ }
+ if (visibleKeys.indexOf(key) < 0) {
+ name = '[' + key + ']';
+ }
+ if (!str) {
+ if (ctx.seen.indexOf(value[key]) < 0) {
+ if (recurseTimes === null) {
+ str = formatValue(ctx, value[key], null);
+ } else {
+ str = formatValue(ctx, value[key], recurseTimes - 1);
+ }
+ if (str.indexOf('\n') > -1) {
+ if (array) {
+ str = str.split('\n').map(function(line) {
+ return ' ' + line;
+ }).join('\n').substr(2);
+ } else {
+ str = '\n' + str.split('\n').map(function(line) {
+ return ' ' + line;
+ }).join('\n');
+ }
+ }
+ } else {
+ str = ctx.stylize('[Circular]', 'special');
+ }
+ }
+ if (typeof name === 'undefined') {
+ if (array && key.match(/^\d+$/)) {
+ return str;
+ }
+ name = JSON.stringify('' + key);
+ if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
+ name = name.substr(1, name.length - 2);
+ name = ctx.stylize(name, 'name');
+ } else {
+ name = name.replace(/'/g, "\\'")
+ .replace(/\\"/g, '"')
+ .replace(/(^"|"$)/g, "'");
+ name = ctx.stylize(name, 'string');
+ }
+ }
+
+ return name + ': ' + str;
+}
+
+
+function reduceToSingleString(output, base, braces) {
+ var numLinesEst = 0;
+ var length = output.reduce(function(prev, cur) {
+ numLinesEst++;
+ if (cur.indexOf('\n') >= 0) numLinesEst++;
+ return prev + cur.length + 1;
+ }, 0);
+
+ if (length > 60) {
+ return braces[0] +
+ (base === '' ? '' : base + '\n ') +
+ ' ' +
+ output.join(',\n ') +
+ ' ' +
+ braces[1];
+ }
+
+ return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
+}
+
+function isArray(ar) {
+ return Array.isArray(ar) ||
+ (typeof ar === 'object' && objectToString(ar) === '[object Array]');
+}
+
+function isRegExp(re) {
+ return typeof re === 'object' && objectToString(re) === '[object RegExp]';
+}
+
+function isDate(d) {
+ return typeof d === 'object' && objectToString(d) === '[object Date]';
+}
+
+function isError(e) {
+ return typeof e === 'object' && objectToString(e) === '[object Error]';
+}
+
+function objectToString(o) {
+ return Object.prototype.toString.call(o);
+}
+
+},{"./getEnumerableProperties":15,"./getName":17,"./getProperties":20}],24:[function(require,module,exports){
+/*!
+ * Chai - flag utility
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+/*!
+ * Module dependancies
+ */
+
+var inspect = require('./inspect');
+var config = require('../config');
+
+/**
+ * ### .objDisplay (object)
+ *
+ * Determines if an object or an array matches
+ * criteria to be inspected in-line for error
+ * messages or should be truncated.
+ *
+ * @param {Mixed} javascript object to inspect
+ * @name objDisplay
+ * @namespace Utils
+ * @api public
+ */
+
+module.exports = function (obj) {
+ var str = inspect(obj)
+ , type = Object.prototype.toString.call(obj);
+
+ if (config.truncateThreshold && str.length >= config.truncateThreshold) {
+ if (type === '[object Function]') {
+ return !obj.name || obj.name === ''
+ ? '[Function]'
+ : '[Function: ' + obj.name + ']';
+ } else if (type === '[object Array]') {
+ return '[ Array(' + obj.length + ') ]';
+ } else if (type === '[object Object]') {
+ var keys = Object.keys(obj)
+ , kstr = keys.length > 2
+ ? keys.splice(0, 2).join(', ') + ', ...'
+ : keys.join(', ');
+ return '{ Object (' + kstr + ') }';
+ } else {
+ return str;
+ }
+ } else {
+ return str;
+ }
+};
+
+},{"../config":4,"./inspect":23}],25:[function(require,module,exports){
+/*!
+ * Chai - overwriteChainableMethod utility
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+/**
+ * ### overwriteChainableMethod (ctx, name, method, chainingBehavior)
+ *
+ * Overwites an already existing chainable method
+ * and provides access to the previous function or
+ * property. Must return functions to be used for
+ * name.
+ *
+ * utils.overwriteChainableMethod(chai.Assertion.prototype, 'length',
+ * function (_super) {
+ * }
+ * , function (_super) {
+ * }
+ * );
+ *
+ * Can also be accessed directly from `chai.Assertion`.
+ *
+ * chai.Assertion.overwriteChainableMethod('foo', fn, fn);
+ *
+ * Then can be used as any other assertion.
+ *
+ * expect(myFoo).to.have.length(3);
+ * expect(myFoo).to.have.length.above(3);
+ *
+ * @param {Object} ctx object whose method / property is to be overwritten
+ * @param {String} name of method / property to overwrite
+ * @param {Function} method function that returns a function to be used for name
+ * @param {Function} chainingBehavior function that returns a function to be used for property
+ * @namespace Utils
+ * @name overwriteChainableMethod
+ * @api public
+ */
+
+module.exports = function (ctx, name, method, chainingBehavior) {
+ var chainableBehavior = ctx.__methods[name];
+
+ var _chainingBehavior = chainableBehavior.chainingBehavior;
+ chainableBehavior.chainingBehavior = function () {
+ var result = chainingBehavior(_chainingBehavior).call(this);
+ return result === undefined ? this : result;
+ };
+
+ var _method = chainableBehavior.method;
+ chainableBehavior.method = function () {
+ var result = method(_method).apply(this, arguments);
+ return result === undefined ? this : result;
+ };
+};
+
+},{}],26:[function(require,module,exports){
+/*!
+ * Chai - overwriteMethod utility
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+/**
+ * ### overwriteMethod (ctx, name, fn)
+ *
+ * Overwites an already existing method and provides
+ * access to previous function. Must return function
+ * to be used for name.
+ *
+ * utils.overwriteMethod(chai.Assertion.prototype, 'equal', function (_super) {
+ * return function (str) {
+ * var obj = utils.flag(this, 'object');
+ * if (obj instanceof Foo) {
+ * new chai.Assertion(obj.value).to.equal(str);
+ * } else {
+ * _super.apply(this, arguments);
+ * }
+ * }
+ * });
+ *
+ * Can also be accessed directly from `chai.Assertion`.
+ *
+ * chai.Assertion.overwriteMethod('foo', fn);
+ *
+ * Then can be used as any other assertion.
+ *
+ * expect(myFoo).to.equal('bar');
+ *
+ * @param {Object} ctx object whose method is to be overwritten
+ * @param {String} name of method to overwrite
+ * @param {Function} method function that returns a function to be used for name
+ * @namespace Utils
+ * @name overwriteMethod
+ * @api public
+ */
+
+module.exports = function (ctx, name, method) {
+ var _method = ctx[name]
+ , _super = function () { return this; };
+
+ if (_method && 'function' === typeof _method)
+ _super = _method;
+
+ ctx[name] = function () {
+ var result = method(_super).apply(this, arguments);
+ return result === undefined ? this : result;
+ }
+};
+
+},{}],27:[function(require,module,exports){
+/*!
+ * Chai - overwriteProperty utility
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+/**
+ * ### overwriteProperty (ctx, name, fn)
+ *
+ * Overwites an already existing property getter and provides
+ * access to previous value. Must return function to use as getter.
+ *
+ * utils.overwriteProperty(chai.Assertion.prototype, 'ok', function (_super) {
+ * return function () {
+ * var obj = utils.flag(this, 'object');
+ * if (obj instanceof Foo) {
+ * new chai.Assertion(obj.name).to.equal('bar');
+ * } else {
+ * _super.call(this);
+ * }
+ * }
+ * });
+ *
+ *
+ * Can also be accessed directly from `chai.Assertion`.
+ *
+ * chai.Assertion.overwriteProperty('foo', fn);
+ *
+ * Then can be used as any other assertion.
+ *
+ * expect(myFoo).to.be.ok;
+ *
+ * @param {Object} ctx object whose property is to be overwritten
+ * @param {String} name of property to overwrite
+ * @param {Function} getter function that returns a getter function to be used for name
+ * @namespace Utils
+ * @name overwriteProperty
+ * @api public
+ */
+
+module.exports = function (ctx, name, getter) {
+ var _get = Object.getOwnPropertyDescriptor(ctx, name)
+ , _super = function () {};
+
+ if (_get && 'function' === typeof _get.get)
+ _super = _get.get
+
+ Object.defineProperty(ctx, name,
+ { get: function () {
+ var result = getter(_super).call(this);
+ return result === undefined ? this : result;
+ }
+ , configurable: true
+ });
+};
+
+},{}],28:[function(require,module,exports){
+/*!
+ * Chai - test utility
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+/*!
+ * Module dependancies
+ */
+
+var flag = require('./flag');
+
+/**
+ * # test(object, expression)
+ *
+ * Test and object for expression.
+ *
+ * @param {Object} object (constructed Assertion)
+ * @param {Arguments} chai.Assertion.prototype.assert arguments
+ * @namespace Utils
+ * @name test
+ */
+
+module.exports = function (obj, args) {
+ var negate = flag(obj, 'negate')
+ , expr = args[0];
+ return negate ? !expr : expr;
+};
+
+},{"./flag":13}],29:[function(require,module,exports){
+/*!
+ * Chai - transferFlags utility
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+/**
+ * ### transferFlags(assertion, object, includeAll = true)
+ *
+ * Transfer all the flags for `assertion` to `object`. If
+ * `includeAll` is set to `false`, then the base Chai
+ * assertion flags (namely `object`, `ssfi`, and `message`)
+ * will not be transferred.
+ *
+ *
+ * var newAssertion = new Assertion();
+ * utils.transferFlags(assertion, newAssertion);
+ *
+ * var anotherAsseriton = new Assertion(myObj);
+ * utils.transferFlags(assertion, anotherAssertion, false);
+ *
+ * @param {Assertion} assertion the assertion to transfer the flags from
+ * @param {Object} object the object to transfer the flags to; usually a new assertion
+ * @param {Boolean} includeAll
+ * @namespace Utils
+ * @name transferFlags
+ * @api private
+ */
+
+module.exports = function (assertion, object, includeAll) {
+ var flags = assertion.__flags || (assertion.__flags = Object.create(null));
+
+ if (!object.__flags) {
+ object.__flags = Object.create(null);
+ }
+
+ includeAll = arguments.length === 3 ? includeAll : true;
+
+ for (var flag in flags) {
+ if (includeAll ||
+ (flag !== 'object' && flag !== 'ssfi' && flag != 'message')) {
+ object.__flags[flag] = flags[flag];
+ }
+ }
+};
+
+},{}],30:[function(require,module,exports){
+/*!
+ * assertion-error
+ * Copyright(c) 2013 Jake Luer <jake@qualiancy.com>
+ * MIT Licensed
+ */
+
+/*!
+ * Return a function that will copy properties from
+ * one object to another excluding any originally
+ * listed. Returned function will create a new `{}`.
+ *
+ * @param {String} excluded properties ...
+ * @return {Function}
+ */
+
+function exclude () {
+ var excludes = [].slice.call(arguments);
+
+ function excludeProps (res, obj) {
+ Object.keys(obj).forEach(function (key) {
+ if (!~excludes.indexOf(key)) res[key] = obj[key];
+ });
+ }
+
+ return function extendExclude () {
+ var args = [].slice.call(arguments)
+ , i = 0
+ , res = {};
+
+ for (; i < args.length; i++) {
+ excludeProps(res, args[i]);
+ }
+
+ return res;
+ };
+};
+
+/*!
+ * Primary Exports
+ */
+
+module.exports = AssertionError;
+
+/**
+ * ### AssertionError
+ *
+ * An extension of the JavaScript `Error` constructor for
+ * assertion and validation scenarios.
+ *
+ * @param {String} message
+ * @param {Object} properties to include (optional)
+ * @param {callee} start stack function (optional)
+ */
+
+function AssertionError (message, _props, ssf) {
+ var extend = exclude('name', 'message', 'stack', 'constructor', 'toJSON')
+ , props = extend(_props || {});
+
+ // default values
+ this.message = message || 'Unspecified AssertionError';
+ this.showDiff = false;
+
+ // copy from properties
+ for (var key in props) {
+ this[key] = props[key];
+ }
+
+ // capture stack trace
+ ssf = ssf || arguments.callee;
+ if (ssf && Error.captureStackTrace) {
+ Error.captureStackTrace(this, ssf);
+ } else {
+ this.stack = new Error().stack;
+ }
+}
+
+/*!
+ * Inherit from Error.prototype
+ */
+
+AssertionError.prototype = Object.create(Error.prototype);
+
+/*!
+ * Statically set name
+ */
+
+AssertionError.prototype.name = 'AssertionError';
+
+/*!
+ * Ensure correct constructor
+ */
+
+AssertionError.prototype.constructor = AssertionError;
+
+/**
+ * Allow errors to be converted to JSON for static transfer.
+ *
+ * @param {Boolean} include stack (default: `true`)
+ * @return {Object} object that can be `JSON.stringify`
+ */
+
+AssertionError.prototype.toJSON = function (stack) {
+ var extend = exclude('constructor', 'toJSON', 'stack')
+ , props = extend({ name: this.name }, this);
+
+ // include stack if exists and not turned off
+ if (false !== stack && this.stack) {
+ props.stack = this.stack;
+ }
+
+ return props;
+};
+
+},{}],31:[function(require,module,exports){
+module.exports = require('./lib/eql');
+
+},{"./lib/eql":32}],32:[function(require,module,exports){
+/*!
+ * deep-eql
+ * Copyright(c) 2013 Jake Luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+/*!
+ * Module dependencies
+ */
+
+var type = require('type-detect');
+
+/*!
+ * Buffer.isBuffer browser shim
+ */
+
+var Buffer;
+try { Buffer = require('buffer').Buffer; }
+catch(ex) {
+ Buffer = {};
+ Buffer.isBuffer = function() { return false; }
+}
+
+/*!
+ * Primary Export
+ */
+
+module.exports = deepEqual;
+
+/**
+ * Assert super-strict (egal) equality between
+ * two objects of any type.
+ *
+ * @param {Mixed} a
+ * @param {Mixed} b
+ * @param {Array} memoised (optional)
+ * @return {Boolean} equal match
+ */
+
+function deepEqual(a, b, m) {
+ if (sameValue(a, b)) {
+ return true;
+ } else if ('date' === type(a)) {
+ return dateEqual(a, b);
+ } else if ('regexp' === type(a)) {
+ return regexpEqual(a, b);
+ } else if (Buffer.isBuffer(a)) {
+ return bufferEqual(a, b);
+ } else if ('arguments' === type(a)) {
+ return argumentsEqual(a, b, m);
+ } else if (!typeEqual(a, b)) {
+ return false;
+ } else if (('object' !== type(a) && 'object' !== type(b))
+ && ('array' !== type(a) && 'array' !== type(b))) {
+ return sameValue(a, b);
+ } else {
+ return objectEqual(a, b, m);
+ }
+}
+
+/*!
+ * Strict (egal) equality test. Ensures that NaN always
+ * equals NaN and `-0` does not equal `+0`.
+ *
+ * @param {Mixed} a
+ * @param {Mixed} b
+ * @return {Boolean} equal match
+ */
+
+function sameValue(a, b) {
+ if (a === b) return a !== 0 || 1 / a === 1 / b;
+ return a !== a && b !== b;
+}
+
+/*!
+ * Compare the types of two given objects and
+ * return if they are equal. Note that an Array
+ * has a type of `array` (not `object`) and arguments
+ * have a type of `arguments` (not `array`/`object`).
+ *
+ * @param {Mixed} a
+ * @param {Mixed} b
+ * @return {Boolean} result
+ */
+
+function typeEqual(a, b) {
+ return type(a) === type(b);
+}
+
+/*!
+ * Compare two Date objects by asserting that
+ * the time values are equal using `saveValue`.
+ *
+ * @param {Date} a
+ * @param {Date} b
+ * @return {Boolean} result
+ */
+
+function dateEqual(a, b) {
+ if ('date' !== type(b)) return false;
+ return sameValue(a.getTime(), b.getTime());
+}
+
+/*!
+ * Compare two regular expressions by converting them
+ * to string and checking for `sameValue`.
+ *
+ * @param {RegExp} a
+ * @param {RegExp} b
+ * @return {Boolean} result
+ */
+
+function regexpEqual(a, b) {
+ if ('regexp' !== type(b)) return false;
+ return sameValue(a.toString(), b.toString());
+}
+
+/*!
+ * Assert deep equality of two `arguments` objects.
+ * Unfortunately, these must be sliced to arrays
+ * prior to test to ensure no bad behavior.
+ *
+ * @param {Arguments} a
+ * @param {Arguments} b
+ * @param {Array} memoize (optional)
+ * @return {Boolean} result
+ */
+
+function argumentsEqual(a, b, m) {
+ if ('arguments' !== type(b)) return false;
+ a = [].slice.call(a);
+ b = [].slice.call(b);
+ return deepEqual(a, b, m);
+}
+
+/*!
+ * Get enumerable properties of a given object.
+ *
+ * @param {Object} a
+ * @return {Array} property names
+ */
+
+function enumerable(a) {
+ var res = [];
+ for (var key in a) res.push(key);
+ return res;
+}
+
+/*!
+ * Simple equality for flat iterable objects
+ * such as Arrays or Node.js buffers.
+ *
+ * @param {Iterable} a
+ * @param {Iterable} b
+ * @return {Boolean} result
+ */
+
+function iterableEqual(a, b) {
+ if (a.length !== b.length) return false;
+
+ var i = 0;
+ var match = true;
+
+ for (; i < a.length; i++) {
+ if (a[i] !== b[i]) {
+ match = false;
+ break;
+ }
+ }
+
+ return match;
+}
+
+/*!
+ * Extension to `iterableEqual` specifically
+ * for Node.js Buffers.
+ *
+ * @param {Buffer} a
+ * @param {Mixed} b
+ * @return {Boolean} result
+ */
+
+function bufferEqual(a, b) {
+ if (!Buffer.isBuffer(b)) return false;
+ return iterableEqual(a, b);
+}
+
+/*!
+ * Block for `objectEqual` ensuring non-existing
+ * values don't get in.
+ *
+ * @param {Mixed} object
+ * @return {Boolean} result
+ */
+
+function isValue(a) {
+ return a !== null && a !== undefined;
+}
+
+/*!
+ * Recursively check the equality of two objects.
+ * Once basic sameness has been established it will
+ * defer to `deepEqual` for each enumerable key
+ * in the object.
+ *
+ * @param {Mixed} a
+ * @param {Mixed} b
+ * @return {Boolean} result
+ */
+
+function objectEqual(a, b, m) {
+ if (!isValue(a) || !isValue(b)) {
+ return false;
+ }
+
+ if (a.prototype !== b.prototype) {
+ return false;
+ }
+
+ var i;
+ if (m) {
+ for (i = 0; i < m.length; i++) {
+ if ((m[i][0] === a && m[i][1] === b)
+ || (m[i][0] === b && m[i][1] === a)) {
+ return true;
+ }
+ }
+ } else {
+ m = [];
+ }
+
+ try {
+ var ka = enumerable(a);
+ var kb = enumerable(b);
+ } catch (ex) {
+ return false;
+ }
+
+ ka.sort();
+ kb.sort();
+
+ if (!iterableEqual(ka, kb)) {
+ return false;
+ }
+
+ m.push([ a, b ]);
+
+ var key;
+ for (i = ka.length - 1; i >= 0; i--) {
+ key = ka[i];
+ if (!deepEqual(a[key], b[key], m)) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+},{"buffer":undefined,"type-detect":33}],33:[function(require,module,exports){
+module.exports = require('./lib/type');
+
+},{"./lib/type":34}],34:[function(require,module,exports){
+/*!
+ * type-detect
+ * Copyright(c) 2013 jake luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+/*!
+ * Primary Exports
+ */
+
+var exports = module.exports = getType;
+
+/*!
+ * Detectable javascript natives
+ */
+
+var natives = {
+ '[object Array]': 'array'
+ , '[object RegExp]': 'regexp'
+ , '[object Function]': 'function'
+ , '[object Arguments]': 'arguments'
+ , '[object Date]': 'date'
+};
+
+/**
+ * ### typeOf (obj)
+ *
+ * Use several different techniques to determine
+ * the type of object being tested.
+ *
+ *
+ * @param {Mixed} object
+ * @return {String} object type
+ * @api public
+ */
+
+function getType (obj) {
+ var str = Object.prototype.toString.call(obj);
+ if (natives[str]) return natives[str];
+ if (obj === null) return 'null';
+ if (obj === undefined) return 'undefined';
+ if (obj === Object(obj)) return 'object';
+ return typeof obj;
+}
+
+exports.Library = Library;
+
+/**
+ * ### Library
+ *
+ * Create a repository for custom type detection.
+ *
+ * ```js
+ * var lib = new type.Library;
+ * ```
+ *
+ */
+
+function Library () {
+ this.tests = {};
+}
+
+/**
+ * #### .of (obj)
+ *
+ * Expose replacement `typeof` detection to the library.
+ *
+ * ```js
+ * if ('string' === lib.of('hello world')) {
+ * // ...
+ * }
+ * ```
+ *
+ * @param {Mixed} object to test
+ * @return {String} type
+ */
+
+Library.prototype.of = getType;
+
+/**
+ * #### .define (type, test)
+ *
+ * Add a test to for the `.test()` assertion.
+ *
+ * Can be defined as a regular expression:
+ *
+ * ```js
+ * lib.define('int', /^[0-9]+$/);
+ * ```
+ *
+ * ... or as a function:
+ *
+ * ```js
+ * lib.define('bln', function (obj) {
+ * if ('boolean' === lib.of(obj)) return true;
+ * var blns = [ 'yes', 'no', 'true', 'false', 1, 0 ];
+ * if ('string' === lib.of(obj)) obj = obj.toLowerCase();
+ * return !! ~blns.indexOf(obj);
+ * });
+ * ```
+ *
+ * @param {String} type
+ * @param {RegExp|Function} test
+ * @api public
+ */
+
+Library.prototype.define = function (type, test) {
+ if (arguments.length === 1) return this.tests[type];
+ this.tests[type] = test;
+ return this;
+};
+
+/**
+ * #### .test (obj, test)
+ *
+ * Assert that an object is of type. Will first
+ * check natives, and if that does not pass it will
+ * use the user defined custom tests.
+ *
+ * ```js
+ * assert(lib.test('1', 'int'));
+ * assert(lib.test('yes', 'bln'));
+ * ```
+ *
+ * @param {Mixed} object
+ * @param {String} type
+ * @return {Boolean} result
+ * @api public
+ */
+
+Library.prototype.test = function (obj, type) {
+ if (type === getType(obj)) return true;
+ var test = this.tests[type];
+
+ if (test && 'regexp' === getType(test)) {
+ return test.test(obj);
+ } else if (test && 'function' === getType(test)) {
+ return test(obj);
+ } else {
+ throw new ReferenceError('Type test "' + type + '" not defined or invalid.');
+ }
+};
+
+},{}],35:[function(require,module,exports){
+arguments[4][33][0].apply(exports,arguments)
+},{"./lib/type":36,"dup":33}],36:[function(require,module,exports){
+/*!
+ * type-detect
+ * Copyright(c) 2013 jake luer <jake@alogicalparadox.com>
+ * MIT Licensed
+ */
+
+/*!
+ * Primary Exports
+ */
+
+var exports = module.exports = getType;
+
+/**
+ * ### typeOf (obj)
+ *
+ * Use several different techniques to determine
+ * the type of object being tested.
+ *
+ *
+ * @param {Mixed} object
+ * @return {String} object type
+ * @api public
+ */
+var objectTypeRegexp = /^\[object (.*)\]$/;
+
+function getType(obj) {
+ var type = Object.prototype.toString.call(obj).match(objectTypeRegexp)[1].toLowerCase();
+ // Let "new String('')" return 'object'
+ if (typeof Promise === 'function' && obj instanceof Promise) return 'promise';
+ // PhantomJS has type "DOMWindow" for null
+ if (obj === null) return 'null';
+ // PhantomJS has type "DOMWindow" for undefined
+ if (obj === undefined) return 'undefined';
+ return type;
+}
+
+exports.Library = Library;
+
+/**
+ * ### Library
+ *
+ * Create a repository for custom type detection.
+ *
+ * ```js
+ * var lib = new type.Library;
+ * ```
+ *
+ */
+
+function Library() {
+ if (!(this instanceof Library)) return new Library();
+ this.tests = {};
+}
+
+/**
+ * #### .of (obj)
+ *
+ * Expose replacement `typeof` detection to the library.
+ *
+ * ```js
+ * if ('string' === lib.of('hello world')) {
+ * // ...
+ * }
+ * ```
+ *
+ * @param {Mixed} object to test
+ * @return {String} type
+ */
+
+Library.prototype.of = getType;
+
+/**
+ * #### .define (type, test)
+ *
+ * Add a test to for the `.test()` assertion.
+ *
+ * Can be defined as a regular expression:
+ *
+ * ```js
+ * lib.define('int', /^[0-9]+$/);
+ * ```
+ *
+ * ... or as a function:
+ *
+ * ```js
+ * lib.define('bln', function (obj) {
+ * if ('boolean' === lib.of(obj)) return true;
+ * var blns = [ 'yes', 'no', 'true', 'false', 1, 0 ];
+ * if ('string' === lib.of(obj)) obj = obj.toLowerCase();
+ * return !! ~blns.indexOf(obj);
+ * });
+ * ```
+ *
+ * @param {String} type
+ * @param {RegExp|Function} test
+ * @api public
+ */
+
+Library.prototype.define = function(type, test) {
+ if (arguments.length === 1) return this.tests[type];
+ this.tests[type] = test;
+ return this;
+};
+
+/**
+ * #### .test (obj, test)
+ *
+ * Assert that an object is of type. Will first
+ * check natives, and if that does not pass it will
+ * use the user defined custom tests.
+ *
+ * ```js
+ * assert(lib.test('1', 'int'));
+ * assert(lib.test('yes', 'bln'));
+ * ```
+ *
+ * @param {Mixed} object
+ * @param {String} type
+ * @return {Boolean} result
+ * @api public
+ */
+
+Library.prototype.test = function(obj, type) {
+ if (type === getType(obj)) return true;
+ var test = this.tests[type];
+
+ if (test && 'regexp' === getType(test)) {
+ return test.test(obj);
+ } else if (test && 'function' === getType(test)) {
+ return test(obj);
+ } else {
+ throw new ReferenceError('Type test "' + type + '" not defined or invalid.');
+ }
+};
+
+},{}]},{},[1])(1)
+}); \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/karma.conf.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/karma.conf.js
new file mode 100644
index 00000000000..48cf541932b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/karma.conf.js
@@ -0,0 +1,28 @@
+module.exports = function(config) {
+ config.set({
+ frameworks: [ 'mocha' ]
+ , files: [
+ 'chai.js'
+ , 'test/bootstrap/karma.js'
+ , 'test/*.js'
+ ]
+ , reporters: [ 'progress' ]
+ , colors: true
+ , logLevel: config.LOG_INFO
+ , autoWatch: false
+ , browsers: [ 'PhantomJS' ]
+ , browserDisconnectTimeout: 10000
+ , browserDisconnectTolerance: 2
+ , browserNoActivityTimeout: 20000
+ , singleRun: true
+ });
+
+ switch (process.env.CHAI_TEST_ENV) {
+ case 'sauce':
+ require('./karma.sauce')(config);
+ break;
+ default:
+ // ...
+ break;
+ };
+};
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/karma.sauce.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/karma.sauce.js
new file mode 100644
index 00000000000..e57d5e0db81
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/karma.sauce.js
@@ -0,0 +1,41 @@
+var version = require('./package.json').version;
+var ts = new Date().getTime();
+
+module.exports = function(config) {
+ var auth;
+
+ try {
+ auth = require('./test/auth/index');
+ } catch(ex) {
+ auth = {};
+ auth.SAUCE_USERNAME = process.env.SAUCE_USERNAME || null;
+ auth.SAUCE_ACCESS_KEY = process.env.SAUCE_ACCESS_KEY || null;
+ }
+
+ if (!auth.SAUCE_USERNAME || !auth.SAUCE_ACCESS_KEY) return;
+ if (process.env.SKIP_SAUCE) return;
+
+ var branch = process.env.TRAVIS_BRANCH || 'local'
+ var browserConfig = require('./sauce.browsers');
+ var browsers = Object.keys(browserConfig);
+ var tags = [ 'chaijs_' + version, auth.SAUCE_USERNAME + '@' + branch ];
+ var tunnel = process.env.TRAVIS_JOB_NUMBER || ts;
+
+ if (process.env.TRAVIS_JOB_NUMBER) {
+ tags.push('travis@' + process.env.TRAVIS_JOB_NUMBER);
+ }
+
+ config.browsers = config.browsers.concat(browsers);
+ config.customLaunchers = browserConfig;
+ config.reporters.push('saucelabs');
+ config.transports = [ 'xhr-polling' ];
+
+ config.sauceLabs = {
+ username: auth.SAUCE_USERNAME
+ , accessKey: auth.SAUCE_ACCESS_KEY
+ , startConnect: true
+ , tags: tags
+ , testName: 'ChaiJS'
+ , tunnelIdentifier: tunnel
+ };
+};
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/package.json
new file mode 100644
index 00000000000..d88685537e1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/package.json
@@ -0,0 +1,51 @@
+{
+ "author": "Jake Luer <jake@alogicalparadox.com>",
+ "name": "chai",
+ "description": "BDD/TDD assertion library for node.js and the browser. Test framework agnostic.",
+ "keywords": [
+ "test",
+ "assertion",
+ "assert",
+ "testing",
+ "chai"
+ ],
+ "homepage": "http://chaijs.com",
+ "license": "MIT",
+ "contributors": [
+ "Jake Luer <jake@alogicalparadox.com>",
+ "Domenic Denicola <domenic@domenicdenicola.com> (http://domenicdenicola.com)",
+ "Veselin Todorov <hi@vesln.com>",
+ "John Firebaugh <john.firebaugh@gmail.com>"
+ ],
+ "version": "3.5.0",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/chaijs/chai"
+ },
+ "bugs": {
+ "url": "https://github.com/chaijs/chai/issues"
+ },
+ "main": "./index",
+ "scripts": {
+ "test": "make test"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ },
+ "dependencies": {
+ "assertion-error": "^1.0.1",
+ "deep-eql": "^0.1.3",
+ "type-detect": "^1.0.0"
+ },
+ "devDependencies": {
+ "browserify": "^10.2.1",
+ "bump-cli": "^1.1.3",
+ "karma": "^0.13.16",
+ "karma-mocha": "^0.1.10",
+ "karma-sauce-launcher": "^0.2.11",
+ "karma-phantomjs-launcher": "^0.2.0",
+ "karma-firefox-launcher": "^0.1.6",
+ "mocha": "^2.2.5",
+ "istanbul": "^0.3.14"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/sauce.browsers.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/sauce.browsers.js
new file mode 100644
index 00000000000..690c7cca1c7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chai/sauce.browsers.js
@@ -0,0 +1,128 @@
+
+/*!
+ * Chrome
+ */
+
+exports['SL_Chrome'] = {
+ base: 'SauceLabs'
+ , browserName: 'chrome'
+};
+
+/*!
+ * Firefox
+ */
+
+/*!
+ * TODO: Karma doesn't seem to like this, though sauce boots its up
+ *
+
+exports['SL_Firefox_23'] = {
+ base: 'SauceLabs'
+ , browserName: 'firefox'
+ , platform: 'Windows XP'
+ , version: '23'
+};
+
+*/
+
+exports['SL_Firefox_22'] = {
+ base: 'SauceLabs'
+ , browserName: 'firefox'
+ , platform: 'Windows 7'
+ , version: '22'
+};
+
+/*!
+ * Opera
+ */
+
+exports['SL_Opera_12'] = {
+ base: 'SauceLabs'
+ , browserName: 'opera'
+ , platform: 'Windows 7'
+ , version: '12'
+};
+
+exports['SL_Opera_11'] = {
+ base: 'SauceLabs'
+ , browserName: 'opera'
+ , platform: 'Windows 7'
+ , version: '11'
+};
+
+/*!
+ * Internet Explorer
+ */
+
+exports['SL_IE_10'] = {
+ base: 'SauceLabs'
+ , browserName: 'internet explorer'
+ , platform: 'Windows 2012'
+ , version: '10'
+};
+
+/*!
+ * Safari
+ */
+
+exports['SL_Safari_6'] = {
+ base: 'SauceLabs'
+ , browserName: 'safari'
+ , platform: 'Mac 10.8'
+ , version: '6'
+};
+
+exports['SL_Safari_5'] = {
+ base: 'SauceLabs'
+ , browserName: 'safari'
+ , platform: 'Mac 10.6'
+ , version: '5'
+};
+
+/*!
+ * iPhone
+ */
+
+/*!
+ * TODO: These take forever to boot or shut down. Causes timeout.
+ *
+
+exports['SL_iPhone_6'] = {
+ base: 'SauceLabs'
+ , browserName: 'iphone'
+ , platform: 'Mac 10.8'
+ , version: '6'
+};
+
+exports['SL_iPhone_5-1'] = {
+ base: 'SauceLabs'
+ , browserName: 'iphone'
+ , platform: 'Mac 10.8'
+ , version: '5.1'
+};
+
+exports['SL_iPhone_5'] = {
+ base: 'SauceLabs'
+ , browserName: 'iphone'
+ , platform: 'Mac 10.6'
+ , version: '5'
+};
+
+*/
+
+/*!
+ * Android
+ */
+
+/*!
+ * TODO: fails because of error serialization
+ *
+
+exports['SL_Android_4'] = {
+ base: 'SauceLabs'
+ , browserName: 'android'
+ , platform: 'Linux'
+ , version: '4'
+};
+
+*/
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/.bower.json
new file mode 100644
index 00000000000..a8c84c63625
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/.bower.json
@@ -0,0 +1,61 @@
+{
+ "name": "chopsui",
+ "description": "Common elements for ChOps Frontends",
+ "authors": [
+ "ChOps CRDX Team"
+ ],
+ "keywords": [
+ "chopsui",
+ "chops-ui"
+ ],
+ "main": "chops-user-dropdown.html",
+ "repository": {
+ "type": "git",
+ "url": "https://chromium.googlesource.com/infra/infra/crdx/chopsui.git"
+ },
+ "moduleType": [
+ "es6"
+ ],
+ "license": "MIT",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests",
+ "README.md"
+ ],
+ "dependencies": {
+ "iron-behaviors": "^2.1.0",
+ "iron-dropdown": "PolymerElements/iron-dropdown#~2.0",
+ "iron-icons": "^2.0.0",
+ "moment": "2.17.1",
+ "moment-timezone": "^0.5.10",
+ "paper-item": "PolymerElements/paper-item#~2.0",
+ "paper-input": "PolymerElements/paper-input#~2.0",
+ "polymer": "Polymer/polymer#^2.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.1",
+ "marked": "^0.4.0"
+ },
+ "devDependencies": {
+ "iron-test-helpers": "PolymerElements/iron-test-helpers",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers",
+ "web-component-tester": "web-component-tester#6.0.0"
+ },
+ "resolutions": {
+ "polymer": "^2.0.0",
+ "iron-behaviors": "1 - 2",
+ "marked": "^0.4.0"
+ },
+ "version": "0.0.38",
+ "_release": "0.0.38",
+ "_resolution": {
+ "type": "version",
+ "tag": "v0.0.38",
+ "commit": "1afa59b56d8e46bc63ed31e9b8cc2da9df141795"
+ },
+ "_source": "https://chromium.googlesource.com/infra/infra/crdx/chopsui.git",
+ "_target": "^0.0.38",
+ "_originalSource": "chopsui",
+ "_direct": true
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/Makefile b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/Makefile
new file mode 100644
index 00000000000..9fbfe6a86ac
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/Makefile
@@ -0,0 +1,10 @@
+# Copyright 201 The Chromium Authors. All rights reserved.
+# Use of this source code is govered by a BSD-style
+# license that can be found in the LICENSE file or at
+# https://developers.google.com/open-source/licenses/bsd
+
+wct:
+ xvfb-run go run ../../go/src/infra/tools/wct/wct.go ../../go/src/infra/tools/wct/monkeypatch.go -chrome=google-chrome
+
+wct_debug:
+ go run ../../go/src/infra/tools/wct/wct.go ../../go/src/infra/tools/wct/monkeypatch.go -chrome=google-chrome -persist
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/bower.json
new file mode 100644
index 00000000000..acf008f6151
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/bower.json
@@ -0,0 +1,50 @@
+{
+ "name": "chopsui",
+ "description": "Common elements for ChOps Frontends",
+ "authors": [
+ "ChOps CRDX Team"
+ ],
+ "keywords": [
+ "chopsui",
+ "chops-ui"
+ ],
+ "main": "chops-user-dropdown.html",
+ "repository": {
+ "type": "git",
+ "url": "https://chromium.googlesource.com/infra/infra/crdx/chopsui.git"
+ },
+ "moduleType": [
+ "es6"
+ ],
+ "license": "MIT",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests",
+ "README.md"
+ ],
+ "dependencies": {
+ "iron-behaviors": "^2.1.0",
+ "iron-dropdown": "PolymerElements/iron-dropdown#~2.0",
+ "iron-icons": "^2.0.0",
+ "moment": "2.17.1",
+ "moment-timezone": "^0.5.10",
+ "paper-item": "PolymerElements/paper-item#~2.0",
+ "paper-input": "PolymerElements/paper-input#~2.0",
+ "polymer": "Polymer/polymer#^2.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.1",
+ "marked": "^0.4.0"
+ },
+ "devDependencies": {
+ "iron-test-helpers": "PolymerElements/iron-test-helpers",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers",
+ "web-component-tester": "web-component-tester#6.0.0"
+ },
+ "resolutions": {
+ "polymer": "^2.0.0",
+ "iron-behaviors": "1 - 2",
+ "marked": "^0.4.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-bug-input.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-bug-input.html
new file mode 100644
index 00000000000..e65df66ed76
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-bug-input.html
@@ -0,0 +1,63 @@
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../paper-input/paper-input.html">
+<link rel="import" href="chops-bug-mixin.html">
+
+<dom-module id="chops-bug-input">
+ <template>
+ <paper-input
+ label="[[label]]"
+ value="{{value}}"
+ auto-validate
+ pattern="[[_bugPattern]]"
+ error-message="Please enter a bug id or bug url">
+ </paper-input>
+ </template>
+ <script>
+ 'use strict';
+
+ /**
+ * `<chops-bug-input>` is an input element for crbug urls and bug ids.
+ *
+ * `<chops-bug-input>` does validation on the input and puts the final bug id in
+ * the bugId property. If the input is invalid, this will be expressed in
+ * the invalidBug property.
+ *
+ *
+ * @customElement
+ * @polymer
+ * @demo /demo/chops-bug-input_demo.html
+ */
+ class ChopsBugInput extends ChopsBugMixin(Polymer.Element) {
+ static get is() { return 'chops-bug-input'; }
+
+ static get properties() {
+ return {
+ /** A bug id, bug url, or a bug in the form of 'projectName:bugId' . Required. */
+ value: String,
+ /** The bug id. */
+ bugId: {
+ type: String,
+ computed: '_computeBugId(value)',
+ },
+ /** The bug's project name. */
+ bugProject: {
+ type: String,
+ computed: '_computeBugProject(value)',
+ },
+ /** The input label for the user inputting the bug with 'Bug # or URL' default. */
+ label: {
+ type: String,
+ value: 'Bug # or URL',
+ },
+ /** True if the given bug is an invalid id or url. */
+ invalidBug: {
+ type: Boolean,
+ notify: true,
+ computed: '_computeInvalidBug(bugId)',
+ },
+ }
+ }
+ }
+ customElements.define(ChopsBugInput.is, ChopsBugInput);
+ </script>
+<dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-bug-link.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-bug-link.html
new file mode 100644
index 00000000000..e1cc25db31c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-bug-link.html
@@ -0,0 +1,77 @@
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="chops-bug-mixin.html">
+
+<dom-module id="chops-bug-link">
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+ p {
+ display: inline;
+ }
+ </style>
+ <a href$="https://bugs.chromium.org/p/[[_bugProject]]/issues/detail?id=[[_bugId]]">
+ [[bugProject]]:[[bugId]]</a>
+ <template is="dom-if" if="[[status]]">
+ <p>([[status]])</p>
+ </template>
+
+ <template is="dom-if" if="[[pri]]">
+ <p>(Pri-[[pri]])</p>
+ </template>
+
+ <template is="dom-if" if="[[!short]]">
+ <p>[[description]]</p>
+ </template>
+
+ </template>
+ <script>
+ 'use strict';
+
+ /**
+ * `<chops-bug-link>` displays a link to a chromium bug.
+ *
+ * All properties except for `bug` are optional. Set short to true
+ * when the description should not be shown.
+ *
+ * @customElement
+ * @polymer
+ * @demo /demo/chops-bug-link_demo.html
+ */
+ class ChopsBugLink extends ChopsBugMixin(Polymer.Element) {
+ static get is() { return 'chops-bug-link'; }
+
+ static get properties() {
+ return {
+ /** A bug id, bug url, or a bug in the form of 'projectName:bugId' . Required. */
+ bug: String,
+ /** The bug id. */
+ bugId: {
+ type: String,
+ computed: '_computeBugId(bug)',
+ },
+ /** The bug's project name. */
+ bugProject: {
+ type: String,
+ computed: '_computeBugProject(bug)',
+ },
+ /** The status of the bug, eg. 'Untriaged', 'Available'. Optional. */
+ status: String,
+ /** The priority number of the bug. Optional. */
+ pri: {
+ type: String,
+ },
+ /** The bug's description. Optional. */
+ description: String,
+ /** Set to true if you don't want the bug's description to be displayed. */
+ short: {
+ type: Boolean,
+ value: false,
+ }
+ }
+ }
+ }
+ customElements.define(ChopsBugLink.is, ChopsBugLink);
+ </script>
+<dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-bug-mixin.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-bug-mixin.html
new file mode 100644
index 00000000000..2ab9fb2bc0e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-bug-mixin.html
@@ -0,0 +1,39 @@
+<script>
+ 'use strict';
+
+ const bugIdRe = /[0-9]{3,}/;
+ const bugRe = /([^0-9]*)?[0-9]{3,}([^0-9]*)?/;
+ const bugProjectUrlRe = /(\/p\/[a-z0-9][-a-z0-9]*[a-z0-9]\/)/i;
+ const bugProjectPairRe = /([a-z0-9][-a-z0-9]*[a-z0-9]:)/i;
+ const bugProjectNameRe = /[a-z0-9][-a-z0-9]*[a-z0-9]/i;
+
+ /**
+ * A class mixin for use in parsing bug data.
+ *
+ * This class is based around parsing "bugString", a free form user bug input
+ * that is in the format of a bug id, bug url, or a bug in the form of
+ * 'projectName:bugId'.
+ */
+ // TODO(zhangtiff): Add support for Buganizer bugs here.
+ var ChopsBugMixin = function(superClass) {
+ return class extends superClass {
+ constructor() {
+ super();
+ }
+
+ _computeBugId(bugString) {
+ return bugRe.test(bugString) ? bugIdRe.exec(bugString) : 'Unknown';
+ }
+
+ _computeBugProject(bugString) {
+ let cleanBug = bugString.replace(/http(s?):/i, "");
+ let projectSection = bugProjectUrlRe.exec(cleanBug) || bugProjectPairRe.exec(cleanBug);
+ return projectSection ? bugProjectNameRe.exec(projectSection)[0] : 'chromium';
+ }
+
+ _computeInvalidBug(bugId) {
+ return bugId == 'Unknown';
+ }
+ };
+ }
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-button.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-button.html
new file mode 100644
index 00000000000..63baef8babb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-button.html
@@ -0,0 +1,160 @@
+<link rel="import" href="../polymer/polymer.html">
+
+<dom-module id="chops-button">
+ <template>
+ <style>
+ :host {
+ background: hsla(0, 0%, 95%, 1);
+ margin: 0.25em 4px;
+ padding: 0.5em 16px;
+ cursor: pointer;
+ border-radius: 3px;
+ text-align: center;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ user-select: none;
+ transition: filter 0.3s ease-in-out, box-shadow 0.3s ease-in-out;
+ font-family: Roboto, Noto, sans-serif;
+ }
+ :host([raised]) {
+ box-shadow: 0px 2px 8px -1px hsla(0, 0%, 0%, 0.5);
+ }
+ :host(:hover) {
+ filter: brightness(95%);
+ }
+ :host(:active), :host(.active) {
+ filter: brightness(115%);
+ }
+ :host([raised]:active), :host([raised].active) {
+ box-shadow: 0px 1px 8px -1px hsla(0, 0%, 0%, 0.5);
+ }
+ :host([disabled]),
+ :host([disabled]:hover) {
+ filter: grayscale(30%);
+ opacity: 0.4;
+ background: hsla(0, 0%, 87%, 1);
+ cursor: default;
+ pointer-events: none;
+ box-shadow: none;
+ }
+ </style>
+ <slot></slot>
+ </template>
+ <script>
+ 'use strict';
+
+ /**
+ * `<chops-button>` displays a styled button component with a few niceties.
+ *
+ * @customElement
+ * @polymer
+ * @demo /demo/chops-button_demo.html
+ */
+ class ChopsButton extends Polymer.Element {
+ static get is() { return 'chops-button'; }
+
+ static get properties() {
+ return {
+ /** Whether the button is available for input or not. */
+ disabled: {
+ type: Boolean,
+ reflectToAttribute: true,
+ },
+ /**
+ * For accessibility. These are the keys that you can use to fire the
+ * onclick event for chops-button. The value is an Array of
+ * JavaScript key input codes, defaulting to space and enter keys.
+ */
+ inputKeys: {
+ type: Array,
+ value: [13, 32],
+ },
+ /**
+ * If true, the element currently has focus. Changed through focus
+ * and blur event listeners.
+ */
+ focused: {
+ type: Boolean,
+ value: false,
+ notify: true,
+ readOnly: true,
+ reflectToAttribute: true,
+ },
+ /** Whether the button should have a shadow or not. */
+ raised: {
+ type: Boolean,
+ value: false,
+ reflectToAttribute: true,
+ },
+ /** Used for accessibility to state this component is a button. **/
+ role: {
+ type: String,
+ value: 'button',
+ readOnly: true,
+ reflectToAttribute: true,
+ },
+ /** Causes the button to be focusable for accessbility. **/
+ tabindex: {
+ type: Number,
+ value: 0,
+ reflectToAttribute: true,
+ },
+ _boundKeypressHandler: {
+ type: Function,
+ value: function() {
+ return this._keypressHandler.bind(this);
+ },
+ },
+ _boundFocusBlurHandler: {
+ type: Function,
+ value: function() {
+ return this._focusBlurHandler.bind(this);
+ },
+ },
+ _debouncedRemoveActive: Object,
+ };
+ }
+
+ ready() {
+ super.ready();
+ this.addEventListener('focus', this._boundFocusBlurHandler, true);
+ this.addEventListener('blur', this._boundFocusBlurHandler, true);
+ }
+
+ connectedCallback() {
+ super.connectedCallback();
+ window.addEventListener('keypress', this._boundKeypressHandler, true);
+ }
+
+ disconnectedCallback() {
+ super.disconnectedCallback();
+ window.removeEventListener('keypress', this._boundKeypressHandler,
+ true);
+ }
+
+ _keypressHandler(event) {
+ if (!this.focused) return;
+ let keyCode = event.keyCode;
+ if (this.inputKeys.includes(keyCode)) {
+ this.click();
+
+ // Trigger the animation for a button click.
+ this.classList.add('active');
+ this._debouncedRemoveActive = Polymer.Debouncer.debounce(
+ this._debouncedRemoveActive,
+ Polymer.Async.timeOut.after(400),
+ () => {
+ this.classList.remove('active');
+ }
+ );
+ }
+ }
+
+ _focusBlurHandler(event) {
+ this._setFocused(event.type === 'focus');
+ }
+ }
+ customElements.define(ChopsButton.is, ChopsButton);
+ </script>
+<dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-carousel.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-carousel.html
new file mode 100644
index 00000000000..0fb52d264e4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-carousel.html
@@ -0,0 +1,215 @@
+<link rel="import" href="../polymer/polymer.html">
+
+<dom-module id="chops-carousel">
+ <template>
+ <style>
+ :host {
+ width: 100%;
+ max-width: 100%;
+ box-sizing: border-box;
+ --chops-carousel-slide-height: 256px;
+ --chops-carousel-slide-width: 400px;
+ }
+ .carousel-content {
+ width: 100%;
+ max-width: 100%;
+ padding: 0.5em 32px;
+ overflow-x: hidden;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
+ box-sizing: border-box;
+ }
+ .carousel-nav {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ width: 100%;
+ padding: 0.5em 16px;
+ box-sizing: border-box;
+ }
+ .carousel-nav-item {
+ border: 0;
+ border-radius: 50%;
+ width: 20px;
+ height: 20px;
+ margin: 0 8px;
+ background: hsl(227, 5%, 80%);
+ transition: box-shadow 0.5s ease-in-out, background 0.5s ease-in-out;
+ cursor: pointer;
+ }
+ .carousel-nav-item:hover,
+ .carousel-nav-item.focused {
+ background: hsl(227, 20%, 60%);
+ }
+ .carousel-nav-item.focused {
+ box-shadow: 0px 2px 8px -1px hsla(0, 0%, 0%, 0.3);
+ }
+ .img-wrapper {
+ width: var(--chops-carousel-slide-width);
+ height: var(--chops-carousel-slide-height);
+ overflow-y: hidden;
+ box-sizing: border-box;
+ transition: opacity 0.5s ease-in-out, box-shadow 0.5s linear;
+ opacity: 0.7;
+ cursor: pointer;
+ transform: scale(0.95, 0.95);
+ border: 1px solid hsl(0, 0%, 83%);
+ padding: 0.5em 8px;
+ margin: 0 8px;
+ background: hsl(0, 0%, 95%);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+ }
+ .img-wrapper.focused {
+ border: 1px solid hsl(227, 20%, 75%);
+ opacity: 1;
+ transform: scale(1, 1);
+ flex-grow: 1;
+ }
+ .img-wrapper:hover {
+ box-shadow: 0px 2px 8px -1px hsla(0, 0%, 0%, 0.5);
+ opacity: 1;
+ }
+ </style>
+ <div id="carouselRoot" class="carousel-content">
+ <button id="prevImage" hidden$="[[!_showNav]]"
+ class="img-wrapper prev-image"
+ on-click="_focusPrevImage">
+ <img src$="[[_prevImage]]" />
+ </button>
+ <button
+ class="img-wrapper focused"
+ on-click="_focusedImageClicked">
+ <img src$="[[_focusedImage]]" />
+ </button>
+ <button id="nextImage" hidden$="[[!_showNav]]"
+ class="img-wrapper next-image"
+ on-click="_focusNextImage">
+ <img src$="[[_nextImage]]" />
+ </button>
+ </div>
+ <template is="dom-if" if="[[_showNav]]">
+ <div id="carouselNav" class="carousel-nav">
+ <template is="dom-repeat" items="[[images]]">
+ <button
+ class$="carousel-nav-item [[_computeFocusedClass(focusedIndex, index)]]"
+ data-index$="[[index]]"
+ on-click="_handleNavClick"></button>
+ </template>
+ </div>
+ </template>
+ </template>
+ <script>
+ 'use strict';
+
+ /**
+ * `<chops-carousel>`
+ *
+ * This creates a carousel of images to browse through.
+ *
+ * @customElement
+ * @polymer
+ * @demo /demo/chops-carousel_demo.html
+ */
+ class ChopsCarousel extends Polymer.Element {
+ static get is() {
+ return 'chops-carousel';
+ }
+
+ static get properties() {
+ return {
+ /** Index of the currently focused image. */
+ focusedIndex: {
+ type: Number,
+ value: 0,
+ },
+ /**
+ * Function handler that gets fired when the user clicks the
+ * focused image. Useful for functions like displaying the image in a
+ * lightbox.
+ */
+ handleFocusedClick: Function,
+ /** Array of image urls to be displayed in the carousel. */
+ images: {
+ type: Array,
+ value: [],
+ observer: '_preloadImages',
+ },
+ _focusedImage: {
+ type: String,
+ computed: '_computeFocusedImage(images, focusedIndex)',
+ },
+ _showNav: {
+ type: Boolean,
+ computed: '_computeShowNav(images.length)',
+ },
+ _prevImage: {
+ type: String,
+ computed: '_computePrevImage(images, focusedIndex)',
+ },
+ _nextImage: {
+ type: String,
+ computed: '_computeNextImage(images, focusedIndex)',
+ },
+ };
+ }
+
+ _computeFocusedClass(focusedIndex, i) {
+ if (focusedIndex === i) {
+ return 'focused';
+ }
+ return '';
+ }
+
+ _computeFocusedImage(images, i) {
+ if (!images || i >= images.length || i < 0) return;
+ return images[i];
+ }
+
+ _computeNextImage(images, i) {
+ if (!images || i >= images.length || i < 0) return;
+ return images[(i + 1) % images.length];
+ }
+
+ _computePrevImage(images, i) {
+ if (!images || i >= images.length || i < 0) return;
+ return images[(i - 1 + images.length) % images.length];
+ }
+
+ _computeShowNav(len) {
+ return len > 1;
+ }
+
+ _focusedImageClicked(evt) {
+ if (this.handleFocusedClick) {
+ this.handleFocusedClick();
+ }
+ }
+
+ _focusNextImage() {
+ this.focusedIndex = (this.focusedIndex + 1) % this.images.length;
+ }
+
+ _focusPrevImage() {
+ const l = this.images.length;
+ this.focusedIndex = (this.focusedIndex - 1 + l) % l;
+ }
+
+ _handleNavClick(evt) {
+ this.focusedIndex = evt.target.dataset.index * 1;
+ }
+
+ _preloadImages(images) {
+ images.forEach((img) => {
+ let image = new Image();
+ image.src = img;
+ });
+ }
+ }
+ customElements.define(ChopsCarousel.is, ChopsCarousel);
+ </script>
+<dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-chip.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-chip.html
new file mode 100644
index 00000000000..18926baecb1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-chip.html
@@ -0,0 +1,162 @@
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-icons/iron-icons.html">
+
+<dom-module id="chops-chip">
+ <template>
+ <style>
+ :host {
+ vertical-align: top;
+ font-family: 'Roboto', 'Noto', sans-serif;
+ font-size: 0.9em;
+ display: inline-flex;
+ align-items: center;
+ flex-direction: row;
+ flex-wrap: nowrap;
+ border-radius: 15px;
+ padding: 0.25em 4px;
+ margin: 0.25em 2px;
+ background-color: hsl(0, 0%, 92%);
+ color: hsl(0, 0%, 13%);
+ /* Make sure chips with and without images are the same height. */
+ line-height: var(--chops-chip-img-size);
+ --chops-chip-img-size: 18px;
+ --chops-chip-remove-button-size: 15px;
+ }
+ img {
+ border-radius: 50%;
+ height: var(--chops-chip-img-size);
+ width: var(--chops-chip-img-size);
+ }
+ a {
+ color: hsl(0, 0%, 13%);
+ text-decoration: none;
+ }
+ a:hover {
+ text-decoration: underline;
+ }
+ iron-icon {
+ cursor: pointer;
+ --iron-icon-height: var(--chops-chip-remove-button-size);
+ --iron-icon-width: var(--chops-chip-remove-button-size);
+ }
+ iron-icon:hover {
+ background-color: hsl(0, 0%, 78%);
+ border-radius: 50%;
+ }
+ .label {
+ padding: 0 4px;
+ }
+ </style>
+ <template is="dom-if" if="[[imageSrc]]">
+ <img
+ src$="[[imageSrc]]"
+ title$="[[_displayedLabel]]"
+ role="presentation"
+ aria-hidden="true"
+ />
+ </template>
+ <template is="dom-if" if="[[url]]">
+ <a href$="[[url]]" class="label">[[_displayedLabel]]</a>
+ </template>
+ <template is="dom-if" if="[[!url]]">
+ <span class="label">
+ [[_displayedLabel]]
+ </span>
+ </template>
+ <iron-icon
+ icon="clear"
+ hidden$="[[!removeable]]"
+ on-click="remove"
+ ></iron-icon>
+ </template>
+ <script>
+ 'use strict';
+
+ /**
+ * `<chops-chip>` is an element used for displaying a general data chip.
+ *
+ * See https://material.io/design/components/chips.html
+ *
+ *
+ * @customElement
+ * @polymer
+ * @demo /demo/chops-chip_demo.html
+ */
+ class ChopsChip extends Polymer.Element {
+ static get is() { return 'chops-chip'; }
+
+ static get properties() {
+ return {
+ /**
+ * The data value represented by the chip. We recommend making this
+ * value unique between chips in a set.
+ *
+ * @type String
+ */
+ value: {
+ type: String,
+ },
+ /**
+ * The text displayed for a given chip. Defaults to displaying value
+ * if no label is specified.
+ *
+ * @type String
+ */
+ label: {
+ type: String,
+ },
+ /**
+ * An optional url for a link to an image to be displayed on the chip.
+ *
+ * @type String
+ */
+ imageSrc: {
+ type: String,
+ value: '',
+ },
+ /**
+ * An optional value for the text in the chip to be linked to.
+ *
+ * @type String
+ */
+ url: {
+ type: String,
+ value: '',
+ },
+ /**
+ * If true, a 'remove' icon will be visible and fire 'remove' on click.
+ *
+ * @type Boolean
+ */
+ removeable: {
+ type: Boolean,
+ value: false,
+ },
+ _displayedLabel: {
+ type: String,
+ computed: '_computeDisplayedLabel(value, label)',
+ },
+ }
+ }
+
+ /** Fires 'remove-chip' event. */
+ remove(e) {
+ this.dispatchEvent(new CustomEvent('remove-chip', {
+ detail: {value: this.value}
+ }));
+ }
+
+ _computeDisplayedLabel(value, label) {
+ return label || value;
+ }
+
+ /**
+ * Fired when someone attempts to remove a chip.
+ *
+ * @event remove-chip
+ * @param {Object} value string containing the value for the chip.
+ */
+ }
+ customElements.define(ChopsChip.is, ChopsChip);
+ </script>
+ <dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-cl-link.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-cl-link.html
new file mode 100644
index 00000000000..5286c50726c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-cl-link.html
@@ -0,0 +1,53 @@
+<link rel="import" href="../polymer/polymer.html">
+
+<dom-module id="chops-cl-link">
+ <template>
+ <style>
+ :host {
+ font-family: 'Roboto', 'Noto', sans-serif;
+ }
+ </style>
+ <a href$="https://crrev.com/[[change]]">[[change]]</a>
+ (<a href$="mailto:[[ownerEmail]]">[[_userName]]</a>):
+ [[description]]
+ </template>
+ <script>
+ 'use strict';
+
+ /**
+ * `<chops-cl-link>` displays basic information of a cl with a
+ * link to the full details of the change
+ *
+ * Provide the change number, owner email, and description.
+ *
+ * @customElement
+ * @polymer
+ * @demo /demo/chops-cl-link_demo.html
+ */
+ class ChopsClLink extends Polymer.Element {
+ static get is() { return 'chops-cl-link'; }
+
+ static get properties() {
+ return {
+ /** The change number. */
+ change: String,
+ /** The owner's email. */
+ ownerEmail: String,
+ /** The change description. */
+ description: String,
+ _userName : {
+ type: String,
+ computed: '_computeUserName(ownerEmail)',
+ },
+ }
+ }
+
+ _computeUserName(email) {
+ let cutoff = email.indexOf('@');
+ return (cutoff < 0) ? 'Unkown' : email.substring(0, cutoff);
+ }
+
+ }
+ customElements.define(ChopsClLink.is, ChopsClLink);
+ </script>
+<dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-dialog.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-dialog.html
new file mode 100644
index 00000000000..a3ec993c968
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-dialog.html
@@ -0,0 +1,235 @@
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-overlay-behavior/iron-focusables-helper.html">
+
+<dom-module id="chops-dialog">
+ <template>
+ <style>
+ :host {
+ position: fixed;
+ z-index: 9999;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ overflow: auto;
+ background-color: rgba(0,0,0,0.4);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+ :host(:not([opened])), [hidden] {
+ display: none;
+ visibility: hidden;
+ }
+ :host([close-on-outside-click]) {
+ cursor: pointer;
+ }
+ .dialog {
+ box-sizing: border-box;
+ background: white;
+ max-width: 90%;
+ max-height: 95%;
+ overflow: auto;
+ padding: 1em 16px;
+ cursor: default;
+ box-shadow: 0px 3px 20px 0px hsla(0, 0%, 0%, 0.4);
+
+ /*
+ * Would have really preferred to just have the dialog itself be the
+ * :host element so that users could style it more easily, but this
+ * causes issues with the backdrop, because there's not a good way to
+ * make a child element appear behind its parent without using wrappers.
+ */
+ @apply --chops-dialog-theme;
+ }
+ </style>
+ <div id="dialog" class="dialog" role="dialog">
+ <slot></slot>
+ </div>
+ </template>
+ <script>
+ (function(window) {
+ 'use strict';
+
+ const ESC_KEYCODE = 27;
+ const TAB_KEYCODE = 9;
+
+ /**
+ * `<chops-dialog>` displays a modal/dialog overlay.
+ *
+ * @customElement
+ * @polymer
+ * @demo /demo/chops-dialog_demo.html
+ */
+ class ChopsDialog extends Polymer.mixinBehaviors([Polymer.IronFocusablesHelper], Polymer.Element) {
+ static get is() { return 'chops-dialog'; }
+
+ static get properties() {
+ return {
+ /**
+ * Whether the dialog should currently be displayed or not.
+ */
+ opened: {
+ type: Boolean,
+ notify: true,
+ value: false,
+ reflectToAttribute: true,
+ observer: '_openedChanged',
+ },
+ /**
+ * A boolean that determines whether clicking outside of the dialog
+ * window should close it.
+ */
+ closeOnOutsideClick: {
+ type: Boolean,
+ value: true,
+ reflectToAttribute: true,
+ },
+ /**
+ * A function fired when the element tries to change its own opened
+ * state. This is useful if you want the dialog state managed outside
+ * of the dialog instead of with internal state. (ie: with Redux)
+ */
+ onOpenedChange: Function,
+ /**
+ * Allow people to exit the dialog using keyboard shortcuts. Defaults
+ * to the escape key.
+ */
+ exitKeys: {
+ type: Array,
+ value: [ESC_KEYCODE],
+ },
+ _boundKeydownHandler: {
+ type: Function,
+ value: function() {
+ return this._keydownHandler.bind(this);
+ },
+ },
+ _previousFocusedElement: Object,
+ }
+ }
+
+ ready() {
+ super.ready();
+ this.addEventListener('click', (evt) => {
+ if (!this.opened || !this.closeOnOutsideClick) return;
+
+ const hasDialog = evt.composedPath().find(
+ (node) => {
+ return node.classList && node.classList.contains('dialog');
+ }
+ );
+ if (hasDialog) return;
+
+ this.close();
+ });
+ }
+
+ connectedCallback() {
+ super.connectedCallback();
+ window.addEventListener('keydown', this._boundKeydownHandler, true);
+ }
+
+ disconnectedCallback() {
+ super.disconnectedCallback();
+ window.removeEventListener('keydown', this._boundKeydownHandler,
+ true);
+ }
+
+ _keydownHandler(event) {
+ if (!this.opened) return;
+ let keyCode = event.keyCode;
+
+ // Handle closing hot keys.
+ if (this.exitKeys.includes(keyCode)) {
+ this.close();
+ }
+
+ // For accessibility, prevent tabbing outside of the dialog.
+ // Key code 9 is tab.
+ if (keyCode === TAB_KEYCODE) {
+ const tabbables = this.getTabbableNodes(this);
+ const active = this._getActiveElement();
+
+ if (!tabbables || !tabbables.length) {
+ event.preventDefault();
+ }
+
+ if (event.shiftKey) {
+ // backwards tab.
+ if (active === tabbables[0]) {
+ event.preventDefault();
+ tabbables[tabbables.length - 1].focus();
+ }
+ } else {
+ // forward tab.
+ if (active === tabbables[tabbables.length - 1]) {
+ event.preventDefault();
+ tabbables[0].focus();
+ }
+ }
+ }
+ }
+
+ close() {
+ if (this.onOpenedChange) {
+ this.onOpenedChange(false);
+ } else {
+ this.opened = false;
+ }
+ }
+
+ open() {
+ if (this.onOpenedChange) {
+ this.onOpenedChange(true);
+ } else {
+ this.opened = true;
+ }
+ }
+
+ toggle() {
+ this.opened = !this.opened;
+ }
+
+ _getActiveElement() {
+ // document.activeElement alone isn't sufficient to find the active
+ // element within shadow dom.
+ let active = document.activeElement || document.body;
+ while (active.root && Polymer.dom(active.root).activeElement) {
+ active = Polymer.dom(active.root).activeElement;
+ }
+ return active;
+ }
+
+ _openedChanged(opened) {
+ if (opened) {
+ // For accessibility, we want to ensure we remember the element that was
+ // focused before this dialog opened.
+ this._previousFocusedElement = this._getActiveElement();
+
+ // Focus the first element within the dialog when it's opened.
+ const tabbables = this.getTabbableNodes(this);
+ if (tabbables && tabbables.length) {
+ tabbables[0].focus();
+ } else if (this._previousFocusedElement) {
+ this._previousFocusedElement.blur();
+ }
+ } else {
+ if (this._previousFocusedElement) {
+ const element = this._previousFocusedElement;
+ setTimeout(function() {
+ // HACK. This is to prevent a possible accessibility bug where
+ // using a keypress to trigger a button that exits a modal causes
+ // the modal to immediately re-open because the button that
+ // originally opened the modal refocuses, and the keypress
+ // propagates.
+ element.focus();
+ }, 1);
+ }
+ }
+ }
+ }
+ customElements.define(ChopsDialog.is, ChopsDialog);
+ })(window);
+ </script>
+<dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-header.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-header.html
new file mode 100644
index 00000000000..0525f73d2f7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-header.html
@@ -0,0 +1,133 @@
+<link rel="import" href="../polymer/polymer.html">
+
+<dom-module id="chops-header">
+ <template>
+ <style>
+ :host {
+ color: var(--chops-header-text-color);
+ box-sizing: border-box;
+ background: hsl(221, 67%, 92%);
+ font-size: 14px;
+ width: 100%;
+ height: 50px;
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: center;
+ z-index: 100;
+ }
+ a {
+ color: var(--chops-header-text-color);
+ text-decoration: none;
+ }
+ a:hover {
+ text-decoration: underline;
+ }
+ #headerTitle {
+ font-size: 18px;
+ display: flex;
+ align-items: center;
+ @apply --chops-header-title-theme;
+ }
+ #headerTitle img {
+ height: 32px;
+ width: 32px;
+ font-size: 10px;
+ overflow: hidden;
+ margin: 0;
+ }
+ #headerTitle small {
+ font-size: 14px;
+ }
+ #headerTitleText {
+ display: flex;
+ align-items: baseline;
+ }
+ #headerTitleTextMain {
+ padding: 0 8px;
+ }
+ .header-section {
+ padding: 0.5em 16px;
+ display: flex;
+ align-items: center;
+ }
+ @media (max-width: 840px) {
+ .header-section {
+ font-size: 0.8em;
+ min-width: 10%;
+ text-align: left;
+ }
+ }
+ </style>
+ <div class="header-section">
+ <slot name="before-header"></slot>
+ <div id="headerTitle">
+ <template is="dom-if" if="[[logoSrc]]">
+ <a href="/">
+ <img src$="[[logoSrc]]" alt$="[[appTitle]] Logo" title$="[[appTitle]] Logo" />
+ </a>
+ </template>
+ <span id="headerTitleText">
+ <a id="headerTitleTextMain" href="/">
+ [[appTitle]]
+ </a>
+ <small>
+ <slot name="subheader"></slot>
+ </small>
+ </span>
+ </div>
+ </div>
+ <div class="header-section">
+ <slot></slot>
+ </div>
+ </template>
+ <script>
+ 'use strict';
+
+ /**
+ * `chops-header` is a shared header element for ChOps frontends to use.
+ *
+ * This element contains two slots for clients to add content. The default
+ * slot holds content in the header section to the right of the title. And
+ * the 'subheader' slot holds content which appears next to the title.
+ *
+ *
+ * @customElement
+ * @polymer
+ * @demo /demo/chops-header_demo.html
+ */
+ class ChopsHeader extends Polymer.Element {
+
+ static get is() {
+ return 'chops-header';
+ }
+
+ static get properties() {
+ return {
+ /* String for the title of the application. */
+ appTitle: {
+ type: String,
+ value: 'Chops App',
+ },
+ /* The home URL for the application. Defaults to '/'. */
+ homeUrl: {
+ type: String,
+ value: '/',
+ },
+ /* URL for the image location of the application's logo. No logo is
+ * shown if this is not specified. */
+ logoSrc: String,
+ // TODO(zhangtiff): Also make the :host element extend the "header"
+ // tag once browsers implement extending native elements with web
+ // components.
+ role: {
+ type: String,
+ reflectToAttribute: true,
+ },
+ };
+ }
+ }
+
+ customElements.define(ChopsHeader.is, ChopsHeader);
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-login.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-login.html
new file mode 100644
index 00000000000..a863e8aae31
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-login.html
@@ -0,0 +1,60 @@
+<link rel="import" href="../polymer/polymer.html">
+
+<dom-module id="chops-login">
+ <template>
+ <style>
+ :host {
+ --chops-login-link-color: inherit;
+ }
+ a, a:link {
+ color: var(--chops-login-link-color);
+ font-size: 0.75em;
+ text-decoration: none;
+ }
+ </style>
+ <template is="dom-if" if="[[!user]]">
+ <a href="[[loginUrl]]">LOGIN</a>
+ </template>
+ <template is="dom-if" if="[[user]]">
+ [[user]] (<a href="[[logoutUrl]]">LOGOUT</a>)
+ </template>
+ </template>
+ <script>
+ 'use strict';
+
+ /**
+ * `chops-login` shows the login/logout links and current user, if provided.
+ *
+ * When the user is logged in provide, at least, the user and logoutURL properties.
+ * When there is no user logged in provide, at least the loginURL property.
+ * In either case, bother URLs may be provided but only one will be shown.
+ *
+ *
+ * @customElement
+ * @polymer
+ * @demo /demo/chops-login_demo.html
+ */
+ class ChopsLogin extends Polymer.Element {
+ static get is() { return 'chops-login'; }
+
+ static get properties() {
+ return {
+ /** The login URL must be provided if no user is given. */
+ loginUrl: {
+ type: String,
+ },
+ /** The logout URL must be provided if a user is given. */
+ logoutUrl: {
+ type: String,
+ },
+ /** The logged in user. If this isn't given the login URL will be shown.*/
+ user: {
+ type: String,
+ value: '',
+ },
+ }
+ }
+ }
+ customElements.define(ChopsLogin.is, ChopsLogin);
+ </script>
+<dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-signin-aware.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-signin-aware.html
new file mode 100644
index 00000000000..a887c959f77
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-signin-aware.html
@@ -0,0 +1,67 @@
+<link rel="import" href="../polymer/polymer.html">
+
+<dom-module id="chops-signin-aware">
+ <template>
+ </template>
+</dom-module>
+<script>
+'use strict';
+// This component adapts chops-signin to an API that is more familiar to Polymer
+// components. Use this table to convert from google-signin-aware:
+
+// google-signin-aware chops-signin-aware
+// *events*
+// google-signin-aware-success user-update
+// google-signin-aware-signed-out user-update
+// signed-in-changed user-update
+// *properties*
+// signedIn signedIn
+// (getAuthResponse()) authHeaders
+// clientId (set window.AUTH_CLIENT_ID)
+// scopes (not supported)
+// height (not supported)
+// theme (not supported)
+// (user.getBasicProfile()) profile
+
+class ChopsSigninAware extends Polymer.Element {
+ static get is() {
+ return 'chops-signin-aware';
+ }
+
+ static get properties() {
+ return {
+ authHeaders: {type: Object, notify: true, readOnly: true},
+ profile: {type: Object, notify: true, readOnly: true},
+ signedIn: {type: Boolean, notify: true, readOnly: true},
+ };
+ }
+
+ connectedCallback() {
+ this.onUserUpdate_ = this.onUserUpdate_.bind(this);
+ window.addEventListener('user-update', this.onUserUpdate_);
+ this.updateProperties_();
+ }
+
+ disconnectedCallback() {
+ window.removeEventListener('user-update', this.onUserUpdate_);
+ }
+
+ updateProperties_() {
+ const self = this;
+ return window.getAuthorizationHeaders().then(function(headers) {
+ self._setAuthHeaders(headers);
+ self._setProfile(window.getUserProfileSync());
+ self._setSignedIn(!!self.profile);
+ });
+ }
+
+ onUserUpdate_() {
+ const self = this;
+ return this.updateProperties_().then(function() {
+ self.dispatchEvent(new CustomEvent('user-update'));
+ });
+ }
+}
+
+customElements.define(ChopsSigninAware.is, ChopsSigninAware);
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-signin.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-signin.html
new file mode 100644
index 00000000000..0a4f110c197
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-signin.html
@@ -0,0 +1 @@
+<script src="./chops-signin.js"></script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-signin.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-signin.js
new file mode 100644
index 00000000000..affcc5ac625
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-signin.js
@@ -0,0 +1,175 @@
+'use strict';
+// chops-signin is a web component that manages signing into services using
+// client-side OAuth via gapi.auth2. chops-signin visually indicates whether the
+// user is signed in using either an icon or the user's profile picture. The
+// signin or signout flow is initiated when the user clicks on this component.
+// This component does not require Polymer, but if you are using Polymer, see
+// chops-signin-aware.
+//
+// Usage:
+// html:
+// <chops-signin></chops-signin>
+// js:
+// window.AUTH_CLIENT_ID = '...';
+// window.addEventListener('user-update', ...);
+// const headers = await window.getAuthorizationHeaders();
+//
+// TODO(benjhayden): Remove the namespace and export functions when all clients
+// import this as an ES6 module.
+// TODO(benjhayden): Use async/await when all clients that need to support IE
+// use a compiler like babel.
+(function() {
+ let resolveAuthInitializedPromise;
+ const authInitializedPromise = new Promise(function(resolve) {
+ resolveAuthInitializedPromise = resolve;
+ });
+
+ const callbackName = 'gapi' + Math.random();
+ const gapiScript = document.createElement('script');
+ gapiScript.src = 'https://apis.google.com/js/api.js?onload=' + callbackName;
+ window[callbackName] = function() {
+ gapi.load('auth2', onAuthLoaded);
+ delete window[callbackName];
+ };
+ document.head.appendChild(gapiScript);
+
+ function onAuthLoaded() {
+ if (!window.gapi || !gapi.auth2) return;
+ if (window.AUTH_CLIENT_ID === undefined) {
+ window.setTimeout(onAuthLoaded, 20);
+ return;
+ }
+ if (window.AUTH_CLIENT_ID === '') {
+ console.log('Not initializing gapi.auth2.');
+ return;
+ }
+ const auth = gapi.auth2.init({
+ client_id: window.AUTH_CLIENT_ID,
+ scope: 'email',
+ });
+ auth.currentUser.listen(function(user) {
+ window.dispatchEvent(new CustomEvent('user-update', {detail: {user}}));
+ });
+ auth.then(
+ function onFulfilled() {
+ resolveAuthInitializedPromise();
+ },
+ function onRejected(error) {
+ console.error(error);
+ }
+ );
+ }
+
+ const SVG_NS = 'http://www.w3.org/2000/svg';
+ const SIZE = 32;
+ const SIZE_PX = SIZE + 'px';
+
+ class ChopsSignin extends HTMLElement {
+ connectedCallback() {
+ this.style.cursor = 'pointer';
+ this.style.strokeWidth = 0;
+ this.style.width = SIZE_PX;
+ this.style.height = SIZE_PX;
+ this.img_ = document.createElement('img');
+ this.img_.style.height = SIZE_PX;
+ this.img_.style.borderRadius = '50%';
+ this.img_.style.overflow = 'hidden';
+ this.render_();
+ this.addEventListener('click', this.onClick_.bind(this));
+ window.addEventListener('user-update', this.onUserUpdate_.bind(this));
+ }
+
+ render_() {
+ while (this.children.length) this.removeChild(this.children[0]);
+ const profile = getUserProfileSync();
+ if (!profile) {
+ this.title = 'Signin with Google';
+ this.appendChild(this.icon_);
+ this.style.fill = 'red';
+ return;
+ }
+ this.title = 'Signout of ' + profile.getEmail();
+ this.img_.src = profile.getImageUrl();
+ if (this.img_.src) {
+ this.appendChild(this.img_);
+ return;
+ }
+ this.appendChild(this.icon_);
+ this.style.fill = 'green';
+ }
+
+ get icon_() {
+ if (this.icon__) return this.icon__;
+ this.icon__ = document.createElementNS(SVG_NS, 'svg');
+ this.icon__.setAttribute('width', SIZE_PX);
+ this.icon__.setAttribute('height', SIZE_PX);
+ this.icon__.setAttribute('viewBox', '0 0 24 24');
+ const path = document.createElementNS(SVG_NS, 'path');
+ // iron-icons account-circle
+ path.setAttributeNS(null, 'd', `
+ M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0
+ 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5
+ 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29
+ 1.94-3.5 3.22-6 3.22z
+ `);
+ this.icon__.appendChild(path);
+ return this.icon__;
+ }
+
+ onUserUpdate_() {
+ this.render_();
+ }
+
+ onClick_() {
+ return authInitializedPromise.then(function() {
+ const auth = gapi.auth2.getAuthInstance();
+ if (auth.currentUser.get().isSignedIn()) {
+ return auth.signOut();
+ } else {
+ return auth.signIn();
+ }
+ });
+ }
+ }
+
+ customElements.define('chops-signin', ChopsSignin);
+
+ window.getAuthInstanceAsync = function() {
+ return authInitializedPromise.then(function() {
+ return gapi.auth2.getAuthInstance();
+ });
+ };
+
+ window.getUserProfileSync = function() {
+ if (!window.gapi || !gapi.auth2) return undefined;
+ const user = gapi.auth2.getAuthInstance().currentUser.get();
+ if (!user.isSignedIn()) return undefined;
+ return user.getBasicProfile();
+ };
+
+ // This async version waits for gapi.auth2 to finish initializing before
+ // getting the profile.
+ window.getUserProfileAsync = function() {
+ return authInitializedPromise.then(getUserProfileSync);
+ };
+
+ window.getAuthorizationHeaders = function() {
+ return window.getAuthInstanceAsync().then(function(auth) {
+ if (!auth) return undefined;
+ const user = auth.currentUser.get();
+ const response = user.getAuthResponse();
+ if (response.expires_at === undefined) {
+ // The user is not signed in.
+ return undefined;
+ }
+ if (response.expires_at < new Date()) {
+ // The token has expired, so reload it.
+ return user.reloadAuthResponse();
+ }
+ return response;
+ }).then(function(response) {
+ if (!response) return {};
+ return {Authorization: response.token_type + ' ' + response.access_token};
+ });
+ };
+})();
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-styles.css b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-styles.css
new file mode 100644
index 00000000000..54bca4c407f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-styles.css
@@ -0,0 +1,3 @@
+:root {
+ font-family: 'Roboto', 'Noto', sans-serif;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-timestamp.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-timestamp.html
new file mode 100644
index 00000000000..1061e94fad9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-timestamp.html
@@ -0,0 +1,87 @@
+<link rel="import" href="../polymer/polymer.html">
+<script src="../moment/min/moment.min.js"></script>
+<script src="../moment-timezone/builds/moment-timezone-with-data.min.js"></script>
+
+<dom-module id="chops-timestamp">
+ <template>
+ <style>
+ </style>
+ <template is="dom-if" if="[[!short]]">
+ [[_formattedDate]] ([[_computeRelativeTime(_date)]])
+ </template>
+ <template is="dom-if" if="[[short]]" title="[[_formattedDate]]">
+ [[_computeRelativeTime(_date)]]
+ </template>
+ </template>
+ <script>
+ 'use strict';
+
+ /**
+ * `<chops-timestamp>` displays a formatted time string in PDT and the relative time.
+ *
+ * This element shows a time in a human readable form.
+ *
+ * @customElement
+ * @polymer
+ * @demo /demo/chops-timestamp_demo.html
+ */
+ class ChopsTimestamp extends Polymer.Element {
+ static get is() { return 'chops-timestamp'; }
+
+ static get properties() {
+ return {
+ /** The data for the time which can be in any format readable by
+ * Date.parse.
+ */
+ timestamp: String,
+ /** When true, a shorter version of the date will be displayed. */
+ short: {
+ type: Boolean,
+ value: false,
+ },
+ /** The format of the date. */
+ dateFormat: {
+ type: String,
+ value: "ddd, D MMM YYYY, h:mm a z",
+ },
+ /** The moment object, which is stored in UTC, to be processed. */
+ _date: {
+ type: Object,
+ value: () => (moment()),
+ computed: '_computeDate(timestamp)',
+ },
+ /** The formatted date. */
+ _formattedDate: {
+ type: String,
+ computed: '_computeDisplayedTime(_date, dateFormat)',
+ },
+ }
+ }
+
+ _computeDate(timestamp) {
+ // Check if timestamp is unix time first.
+ let date = Number.parseInt(timestamp);
+ if (Number.isNaN(date)) {
+ // Date.parse returns milliseconds since epoch but we want seconds.
+ date = Date.parse(timestamp) / 1000;
+ if (Number.isNaN(date)) {
+ // Default to now if all else fails.
+ date = (new Date()).getTime() / 1000;
+ }
+ }
+
+ return moment.unix(date).tz('America/Los_Angeles');
+ }
+
+ _computeDisplayedTime(date, format) {
+ return date.format(format);
+ }
+
+ _computeRelativeTime(date) {
+ return date.fromNow();
+ }
+
+ }
+ customElements.define(ChopsTimestamp.is, ChopsTimestamp);
+ </script>
+<dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-tree-status.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-tree-status.html
new file mode 100644
index 00000000000..03345719555
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-tree-status.html
@@ -0,0 +1,143 @@
+<link rel="import" href="../polymer/polymer.html">
+
+<dom-module id="chops-tree-status">
+ <template>
+ <style>
+ .closed {
+ background-color: hsl(0, 70%, 71%);
+ }
+ .maintenance {
+ background-color: hsl(300, 100%, 75%);
+ }
+ .open {
+ background-color: hsl(98, 67%, 62%);
+ }
+ .throttled {
+ background-color: hsl(59, 100%, 71%);
+ }
+ .tree-banner {
+ box-sizing: border-box;
+ color: #222;
+ margin: 0.5em auto;
+ padding: 0.5em 8px;
+ width: 100%;
+ }
+ </style>
+ <div class="error" hidden$="[[!_hasError]]">
+ Error fetching tree status from <a href$="[[statusUrl]]" target="_blank">[[statusUrl]]</a>
+ </div>
+ <div class$="treeStatus [[_status]]" hidden$="[[_hasError]]">
+ Tree status: [[_message]] by
+ <a href$="mailto:[[_email]]">[[_username]]</a>
+ on [[_time]]
+ (<a href$="[[statusUrl]]" target="_blank">More</a>)
+ </div>
+ </template>
+ <script>
+ 'use strict';
+ /**
+ * `<chops-tree-status>` is an element used for displaying the tree status
+ * available via the statusUrl.
+ *
+ * Provide a statusUrl like 'https://infra-status.appspot.com/' or
+ * 'http://chromium-status.appspot.com/'
+ *
+ * @customElement
+ * @polymer
+ * @demo /demo/chops-tree-status_demo.html
+ */
+ class ChopsTreeStatus extends Polymer.Element {
+ static get is() { return 'chops-tree-status'; }
+
+ static get properties() {
+ return {
+ /**
+ * The url where the tree's status can be found.
+ *
+ * @type String
+ */
+ statusUrl: {
+ type: String,
+ value: '',
+ },
+ /**
+ * The error data json. This property should only be passed in if
+ * there was an error getting the status.
+ *
+ * @type Object{error}
+ */
+ statusErrorJson: {
+ type: Object,
+ value: () => { return {}; },
+ },
+ /**
+ * The tree status data json. This can be taken directly from the
+ * 'current?format=json' page and passed directly to <chops-tree-status>
+ *
+ * @type Object{username, generatl_status, date, message}
+ */
+ statusJson: {
+ type: Object,
+ value: () => {
+ return {message: 'Unknown', date: 'Unknown', general_state: '', username: ''};
+ },
+ },
+ _hasError: {
+ type: Boolean,
+ computed: '_computeHasError(statusErrorJson)',
+ value: false,
+ },
+
+ // Processed JSON data
+ _email: {
+ type: String,
+ computed: '_computeEmail(statusJson)',
+ },
+ _message: {
+ type: String,
+ computed: '_computeMessage(statusJson)',
+ },
+ _status: {
+ type: String,
+ computed: '_computeStatus(statusJson)',
+ },
+ _time: {
+ type: String,
+ computed: '_computeTime(statusJson)',
+ },
+ _username: {
+ type: String,
+ computed: '_computeUsername(_email)',
+ },
+ };
+ }
+
+ _computeHasError(errorJson) {
+ return !!errorJson && Object.keys(errorJson).length > 0;
+ }
+
+ _computeEmail(json) {
+ return json ? json.username : '';
+ }
+
+ _computeStatus(json) {
+ return json ? json.general_state : ''
+ }
+
+ _computeMessage(json) {
+ return json ? json.message : 'Unknown';
+ }
+
+ _computeTime(json) {
+ return json ? `${json.date.split(".")[0]} GMT`: 'Unknown';
+ }
+
+ _computeUsername(email) {
+ let cutoff = email.indexOf('@');
+ return (cutoff < 0) ? 'Unknown' : email.substring(0, cutoff);
+ }
+
+ }
+ customElements.define(ChopsTreeStatus.is, ChopsTreeStatus);
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-user-dropdown.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-user-dropdown.html
new file mode 100644
index 00000000000..15503df9352
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-user-dropdown.html
@@ -0,0 +1,89 @@
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../paper-item/paper-item.html">
+
+<dom-module id="chops-user-dropdown">
+ <template>
+ <style>
+ .resize {
+ display: block;
+ overflow: auto;
+ }
+ .hidden {
+ display: none !important;
+ }
+ paper-item:hover {
+ background: grey;
+ }
+ </style>
+ <div id="dropdown" class="resize">
+ <template is="dom-repeat" items="[[suggestions]]">
+ <paper-item id$="[[index]]" on-click="_userSelected">[[_computeUserDisplay(item)]]</paper-item>
+ </template>
+ </div>
+ </template>
+ <script>
+ 'use strict';
+
+ /**
+ * `chops-user-dropdown` is a dropdown element displaying a list of user ids.
+ *
+ * When using this, provide an array of suggestions that should be displayed
+ * This element should, idealy, be used with chops-user-input
+ *
+ * @customElement
+ * @polymer
+ *
+ */
+ class UserDropdown extends Polymer.Element {
+ static get is() { return 'chops-user-dropdown'; }
+
+ static get properties() {
+ return {
+ /**
+ * The array of users that should be listed.
+ *
+ * @type Array<Object{userId, email(opt), profileLink(opt), fullName(opt)}>
+ */
+ suggestions: {
+ type: Array,
+ value: () => {return []; },
+ },
+ }
+ }
+
+ ready() {
+ super.ready();
+ this.$.dropdown.classList.add('hidden');
+ }
+
+ /** Opens the dropdown element. */
+ open() {
+ this.$.dropdown.classList.remove('hidden');
+ }
+
+ /** Closes the dropdown element. */
+ close() {
+ this.$.dropdown.classList.add('hidden');
+ }
+
+ /** Gets the selected user information and fires 'user-selected'. */
+ _userSelected(e) {
+ let user = this.suggestions[e.currentTarget.id];
+ this.dispatchEvent(new CustomEvent('user-selected', {detail: {selectedUser: user}}));
+ }
+
+ _computeUserDisplay(user) {
+ return user.email ? `${user.userId} <${user.email}> ` : user.userId;
+ }
+
+ /**
+ * Fired when a user has been selected.
+ *
+ * @event user-selected
+ * @param {string} selectedUser username of the selected user.
+ */
+
+ }
+ customElements.define(UserDropdown.is, UserDropdown);
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-user-id.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-user-id.html
new file mode 100644
index 00000000000..46a2d08e656
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-user-id.html
@@ -0,0 +1,127 @@
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-icons/iron-icons.html">
+
+<dom-module id="chops-user-id">
+ <template>
+ <style>
+ a {
+ color: black;
+ text-decoration: none;
+ }
+ a:hover {
+ text-decoration: underline;
+ }
+ iron-icon {
+ top: -1px;
+ --iron-icon-height: 10px;
+ --iron-icon-width: 10px;
+ }
+ iron-icon:hover {
+ background-color: hsl(0, 0%, 81%);
+ }
+ .user-label {
+ font-size: .81em;
+ border-radius: 15px;
+ padding: 2px 8px;
+ background-color: hsl(0, 0%, 88%);
+ }
+ </style>
+ <span class="user-label">
+ <template is="dom-if" if="[[profileLink]]">
+ <a href$="[[profileLink]]">[[userId]]</a>
+ </template>
+ <template is="dom-if" if="[[!profileLink]]">
+ [[userId]]
+ </template>
+ <iron-icon
+ icon="clear"
+ hidden$="[[!removeable]]"
+ on-click="_removeUser"
+ title="[[fullName]] [[email]]"></iron-icon>
+ </span>
+ </template>
+ <script>
+ 'use strict';
+
+ /**
+ * `<chops-user-id>` is an element used for displaying users.
+ *
+ * The only required attribute is userId. If the profile-link is provided
+ * the userId text will be displayed as a link. If an email and/or fullName
+ * are provided they will be visible when hovering over the element.
+ *
+ *
+ * @customElement
+ * @polymer
+ * @demo /demo/chops-user-id_demo.html
+ */
+ class ChopsUserId extends Polymer.Element {
+ static get is() { return 'chops-user-id'; }
+
+ static get properties() {
+ return {
+ /**
+ * The user's id to be displayed. Required.
+ *
+ * @type String
+ */
+ userId: {
+ type: String,
+ },
+ /**
+ * The user's email. Optional.
+ *
+ * @type String
+ */
+ email: {
+ type: String,
+ },
+ /**
+ * The full name of the user. Optional.
+ *
+ * @type String
+ */
+ fullName: {
+ type: String,
+ },
+ /**
+ * The link to the user's profile page. Optional.
+ *
+ * @type String
+ */
+ profileLink: {
+ type: String,
+ value: "",
+ },
+ /**
+ * If true, a 'remove' icon will be visible and fire 'remove-user' on click.
+ *
+ * @type Boolean
+ */
+ removeable: {
+ type: Boolean,
+ value: false,
+ },
+ }
+ }
+
+ /** Gets the user information and fires 'user-removed'. */
+ _removeUser(e) {
+ let user = {userId: this.userId};
+ if (this.email) { user.email = this.email; }
+ if (this.fullName) { user.fullName = this.fullName; }
+ if (this.profileLink) { user.profileLink = this.profileLink; }
+ this.dispatchEvent(new CustomEvent('remove-user', {detail: {removedUser: user}}));
+ }
+
+ /**
+ * Fired when a user wants to remove this user.
+ *
+ * @event remove-user
+ * @param {Object} removedUser object containing all of the user's given information.
+ */
+
+ }
+ customElements.define(ChopsUserId.is, ChopsUserId);
+ </script>
+ <dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-user-input.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-user-input.html
new file mode 100644
index 00000000000..70b033bf74e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/chops-user-input.html
@@ -0,0 +1,177 @@
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="chops-user-dropdown.html">
+<link rel="import" href="chops-user-id.html">
+<link rel="import" href="../paper-input/paper-input.html">
+<link rel="import" href="../iron-behaviors/iron-control-state.html">
+
+<dom-module id="chops-user-input">
+ <template>
+ <style>
+ </style>
+ <paper-input id="input" label="[[label]]" value="{{inputValue}}" on-input="_inputChanged">
+ <template is="dom-repeat" items="[[selectedUsers]]">
+ <chops-user-id
+ slot="prefix"
+ user-id="[[item.userId]]"
+ email="[[item.email]]"
+ profile-link="[[item.profileLink]]"
+ full-name="[[item.fullName]]"
+ on-remove-user="_removeUser"
+ removeable>
+ </chops-user-id>
+ </template>
+ </paper-input>
+ <chops-user-dropdown id="dropdown" on-user-selected="_saveUser" suggestions="[[suggestions]]">
+ </chops-user-dropdown>
+ </template>
+ <script>
+ 'use strict';
+
+ /**
+ *
+ * `<chops-user-input>` as an input element for choosing users with
+ * dropdown suggestions and autocomplete.
+ *
+ * It is up to the developer using this element to provide and update
+ * the users listed in the `suggestions` property. The properties,
+ * `inputValue` and `selectedUsers` are available for two-way binding
+ * for this purpose.
+ *
+ * customElement
+ * @polymer
+ * @demo /demo/chops-user-input_demo.html
+ *
+ */
+ class ChopsUserInput extends Polymer.mixinBehaviors(
+ [Polymer.IronControlState], Polymer.Element) {
+ static get is() { return 'chops-user-input'; }
+
+ static get properties() {
+ return {
+ /**
+ * The current input value.
+ *
+ * @type String
+ */
+ inputValue: {
+ type: String,
+ value: '',
+ notify: true,
+ },
+ /**
+ * The display label.
+ *
+ * @type String
+ */
+ label: {
+ type: String,
+ value: 'place holder',
+ },
+ /**
+ * List of suggestions displayed in the dropdown.
+ *
+ * @type Array<Object{userId, email(opt), profileLink(opt), fullName(opt)}>
+ */
+ suggestions: {
+ type: Array,
+ value: () => { return []; },
+ notify: true,
+ },
+ /**
+ * List of users selected, so far.
+ *
+ * @type Array<Object{userId, email(opt), profileLink(opt), fullName(opt)}>
+ */
+ selectedUsers: {
+ type: Array,
+ value: () => { return []; },
+ notify: true,
+ },
+ /**
+ * If true, multiple users can be selected.
+ *
+ * @type Boolean
+ */
+ multiple: {
+ type: Boolean,
+ value: false,
+ },
+ /**
+ * If true, additional users cannot be selected.
+ *
+ * @type Boolean
+ */
+ _inputDisabled: {
+ type: Boolean,
+ value: false,
+ },
+ }
+ }
+
+ static get observers() {
+ return [
+ '_updateInputDisabled(selectedUsers.length)'
+ ]
+ }
+
+ ready() {
+ super.ready();
+ this.addEventListener('focused-changed', e => this._toggleDropdown(e));
+ }
+
+ /** Updates inputDisabled. */
+ _updateInputDisabled(length) {
+ this._inputDisabled = Boolean(!this.multiple && length);
+ }
+
+ /** Toggles the visibility of the dropdown element. */
+ _toggleDropdown(e) {
+ if (!this._inputDisabled) {
+ if (!this.focused) {
+ this.$.dropdown.close();
+ } else {
+ this.$.dropdown.open();
+ }
+ }
+ }
+
+ /**
+ * Pushes a newly selected user to the selectedUser property
+ *
+ * @param {Event} e event that triggered the function with selectedUser
+ * in the detail{}.
+ */
+ _saveUser(e) {
+ this.push('selectedUsers', e.detail.selectedUser);
+ this.$.dropdown.close();
+ this.inputValue = '';
+ this.dispatchEvent(
+ new CustomEvent('user-selected', {detail: e.detail}));
+ }
+
+ /**
+ * Removes a selected user from the selectedUser property.
+ *
+ * @param {Event} e event that triggered the function with removedUser
+ * in the detail{}.
+ */
+ _removeUser(e) {
+ let userId = e.detail.removedUser.userId;
+ let index = -1;
+ this.selectedUsers.forEach((user, i) => {
+ if (user.userId === userId) {
+ index = i;
+ }
+ });
+ if (index != -1) {
+ this.splice('selectedUsers', index, 1);
+ }
+ }
+
+ _inputChanged(e) {
+ this.dispatchEvent(new CustomEvent('input', {detail: e.detail}));
+ }
+ }
+ customElements.define(ChopsUserInput.is, ChopsUserInput);
+ </script>
+</dom-moduel>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-bug-input_demo.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-bug-input_demo.html
new file mode 100644
index 00000000000..b0eaa6c7c27
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-bug-input_demo.html
@@ -0,0 +1,9 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-bug-input.html">
+
+<demo-snippet>
+ <template>
+ <chops-bug-input></chops-bug-input>
+ </template>
+</demo-snippet>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-bug-link_demo.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-bug-link_demo.html
new file mode 100644
index 00000000000..67144e55857
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-bug-link_demo.html
@@ -0,0 +1,12 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-bug-link.html">
+
+<demo-snippet>
+ <template>
+ <chops-bug-link bug="https://bugs.chromium.org/p/monorail/issues/detail?id=1347#c3"></chops-bug-link>
+ <chops-bug-link bug="crbug/761347" short description="Some long bug description" pri="0" status="Untriaged"></chops-bug-link>
+ <chops-bug-link bug="crbug.com/761347" pri="2" description="Some long bug description"></chops-bug-link>
+ <chops-bug-link bug="gerrit:1347" pri="2" description="problem in gerrit"></chops-bug-link>
+ </template>
+</demo-snippet>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-button_demo.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-button_demo.html
new file mode 100644
index 00000000000..ad41f19fcd2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-button_demo.html
@@ -0,0 +1,83 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-button.html">
+
+<demo-snippet>
+ <template>
+ <style>
+ .blue {
+ background-color: hsla(207, 90%, 54%, 1);
+ color: hsla(0, 0%, 100%, 1);
+ }
+ .green {
+ background-color: hsla(122, 39%, 49%, 1);
+ color: hsla(0, 0%, 100%, 1);
+ }
+ .red {
+ background-color: hsla(4, 90%, 58%, 1);
+ color: hsla(0, 0%, 100%, 1);
+ }
+ </style>
+ <chops-button onclick="console.log('You clicked a basic button!');">Basic Button</chops-button>
+ <chops-button raised>Raised Button</chops-button>
+ <chops-button disabled>Disabled Button</chops-button>
+ <chops-button class="blue">Blue</chops-button>
+ <chops-button class="blue" raised>Raised Blue</chops-button>
+ <chops-button class="blue" disabled>Disabled Blue</chops-button>
+ <chops-button class="green" raised>Green</chops-button>
+ <chops-button class="red" raised>Warning!</chops-button>
+ </template>
+</demo-snippet>
+
+<h2>Styling tips for buttons</h2>
+<p>
+ Use color on your buttons to create hierarchy. Buttons with bright or
+ contrasting colors stand out more than plain buttons, so it's often a good
+ idea to reserve certain buttons colors for the primary actions your users use.
+ On the flipside, if you want to de-emphasize a button, you can make the
+ background color the same as your app's background color.
+</p>
+<demo-snippet>
+ <template>
+ <style>
+ .primary {
+ background-color: hsla(207, 90%, 54%, 1);
+ color: hsla(0, 0%, 100%, 1);
+ }
+ .tertiary {
+ background: hsla(0, 0%, 100%, 1);
+ }
+ </style>
+ <chops-button class="primary">Primary Action</chops-button>
+ <chops-button class="secondary">Secondary Action 1</chops-button>
+ <chops-button class="secondary">Secondary Action 2</chops-button>
+ <chops-button class="tertiary">Tertiary Action</chops-button>
+ </template>
+</demo-snippet>
+
+<p>
+ Consider adding a subtle text-shadow to your buttons if you are using white
+ text against a color background. This can help make the text on your buttons
+ "pop" more.
+</p>
+<demo-snippet>
+ <template>
+ <style>
+ .blue {
+ background-color: hsla(207, 90%, 54%, 1);
+ color: hsla(0, 0%, 100%, 1);
+ }
+ .green {
+ background-color: hsla(122, 39%, 49%, 1);
+ color: hsla(0, 0%, 100%, 1);
+ }
+ .text-shadow {
+ text-shadow: 1px 1px 3px hsla(0, 0%, 0%, 0.25);
+ }
+ </style>
+ <chops-button class="blue" raised>Raised Blue Button</chops-button>
+ <chops-button class="blue text-shadow" raised>Subtle Text Shadow</chops-button>
+ <chops-button class="green" raised>Raised Green Button</chops-button>
+ <chops-button class="green text-shadow" raised>Subtle Text Shadow</chops-button>
+ </template>
+</demo-snippet>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-carousel_demo.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-carousel_demo.html
new file mode 100644
index 00000000000..ae31863fb4a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-carousel_demo.html
@@ -0,0 +1,19 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-carousel.html">
+
+Example of chops-carousel with some images.
+
+<demo-snippet>
+ <template>
+ <chops-carousel images='["/bower_components/chopsui/img/logo.png", "/bower_components/chopsui/img/img1.png", "/bower_components/chopsui/img/img2.png"]'></chops-carousel>
+ </template>
+</demo-snippet>
+
+Example of chops-carousel with just one image.
+
+<demo-snippet>
+ <template>
+ <chops-carousel images='["../img/logo.png"]'></chops-carousel>
+ </template>
+</demo-snippet>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-chip_demo.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-chip_demo.html
new file mode 100644
index 00000000000..0ff458b7459
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-chip_demo.html
@@ -0,0 +1,43 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-chip.html">
+
+<demo-snippet>
+ <template>
+ <chops-chip value="chip"></chops-chip>
+ <chops-chip value="chip2" label="A charming chip"></chops-chip>
+ <chops-chip value="chip3" label="A linked chip" url="https://www.google.com"></chops-chip>
+ <chops-chip value="chip4" label="Chip with an image" image-src="../img/logo.png"></chops-chip>
+ </template>
+</demo-snippet>
+
+<h2>Handling remove events</h2>
+<p>
+ The parent for a given chip is responsible for figuring out what to do when
+ the 'remove-chip' event is fired.
+</p>
+<demo-snippet>
+ <template>
+ <chops-chip id="removeable1"
+ value="chip1"
+ label="A removeable chip"
+ removeable></chops-chip>
+ <chops-chip id="removeable2"
+ value="chip2"
+ label="I have an image"
+ image-src="../img/logo.png"
+ removeable></chops-chip>
+ <chops-chip id="removeable3"
+ value="chip3"
+ label="Delete me"
+ removeable></chops-chip>
+ <script>
+ const removeHandler = (evt) => {
+ evt.target.remove();
+ }
+ removeable1.addEventListener('remove-chip', removeHandler);
+ removeable2.addEventListener('remove-chip', removeHandler);
+ removeable3.addEventListener('remove-chip', removeHandler);
+ </script>
+ </template>
+</demo-snippet>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-cl-link_demo.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-cl-link_demo.html
new file mode 100644
index 00000000000..e1596d5ef33
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-cl-link_demo.html
@@ -0,0 +1,9 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-cl-link.html">
+
+<demo-snippet>
+ <template>
+ <chops-cl-link change="6f1faebd" owner-email="avi@chromium.org" description="Added something cool"></chops-cl-link>
+ </template>
+</demo-snippet>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-dialog_demo.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-dialog_demo.html
new file mode 100644
index 00000000000..7ddc463d781
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-dialog_demo.html
@@ -0,0 +1,51 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-button.html">
+<link rel="import" href="../chops-dialog.html">
+
+<demo-snippet>
+ <chops-button onclick="dialog.open()">Open dialog</chops-button>
+ <chops-button onclick="tabDialog.open()">Dialog with tabbable children</chops-button>
+ <template>
+ <chops-dialog id="dialog">
+ <h1>Test dialog</h1>
+ <p>
+ Here is a test dialog.
+ </p>
+ </chops-dialog>
+ <chops-dialog id="tabDialog">
+ <h1>Tabbable children dialog</h1>
+ <p>
+ To see how chops-dialog handles tabbing, try tabbing
+ through the elements in this dialog.
+ </p>
+ <chops-button>Button 1</chops-button>
+ <chops-button>Button 2</chops-button>
+ <a href="#">A link</a>
+ </chops-dialog>
+ </template>
+</demo-snippet>
+<demo-snippet>
+ <h2>Accessibility notes</h2>
+ <p>
+ Please consider <a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_dialog_role">
+ best practices for accessible dialogs
+ </a> when using chops-dialog.
+ </p>
+ <p>
+ While chops-dialog sets dialogs to role="dialog"
+ by default, it is up to you to set the aria-labelledby and aria-describedby
+ attributes when using chops-dialog. chops-dialog doesn't set these
+ attributes by default because we try to avoid making assumptions about the
+ shape of the markup in your dialog.
+ </p>
+ <chops-button onclick="ariaDialog.open()">Open dialog with aria-labelledby and aria-describedby</chops-button>
+ <template>
+ <chops-dialog id="ariaDialog" aria-labelledby="dialogTitle" aria-describedby="dialogDescription">
+ <h1 id="dialogTitle">Test dialog</h1>
+ <p id="dialogDescription">
+ Here is a description for a dialog.
+ </p>
+ </chops-dialog>
+ </template>
+</demo-snippet>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-header_demo.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-header_demo.html
new file mode 100644
index 00000000000..2d949aa9d9c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-header_demo.html
@@ -0,0 +1,25 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-header.html">
+<link rel="import" href="../chops-login.html">
+
+<link rel="stylesheet" type="text/css" href="../chops-styles.css">
+
+Example of chops-header without any content in slots
+
+<demo-snippet>
+ <template>
+ <chops-header app-title="Demo" logo-src="../img/logo.png"></chops-header>
+ </template>
+</demo-snippet>
+
+Example of chops-header using slots and chops-login
+
+<demo-snippet>
+ <template>
+ <chops-header app-title="Demo" logo-src="../img/logo.png">
+ <span slot="subheader">&gt; <a href="#">Breadcrumbs</a></span>
+ <chops-login login-url="https://www.google.com/" logout-url="https://store.google.com/" user="jojwang@chromium.org"></chops-login>
+ </chops-header>
+ </template>
+</demo-snippet>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-login_demo.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-login_demo.html
new file mode 100644
index 00000000000..c451fcac682
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-login_demo.html
@@ -0,0 +1,19 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-login.html">
+
+Example of chops-login with no current user specified
+
+<demo-snippet>
+ <template>
+ <chops-login login-url="https://www.google.com/" logout-url="https://store.google.com/"></chops-login>
+ </template>
+</demo-snippet>
+
+Example of chops-login with a current user specified
+
+<demo-snippet>
+ <template>
+ <chops-login login-url="https://www.google.com/" logout-url="https://store.google.com/" user="jojwang@chromium.org"></chops-login>
+ </template>
+</demo-snippet>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-timestamp_demo.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-timestamp_demo.html
new file mode 100644
index 00000000000..542a5f39bfa
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-timestamp_demo.html
@@ -0,0 +1,29 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-timestamp.html">
+
+<demo-snippet>
+ <template>
+ <script>
+ // Set first chops-timestamp element properties.
+ let date = new Date();
+ let ts1 = document.getElementById('js-ts1');
+ ts1.date = date;
+
+ // Set second chops-timestamp element properties.
+ let date2 = date;
+ date2.setDate(date2.getDate() - 3);
+ let ts2 = document.getElementById('js-ts2')
+ ts2.date = date2;
+ ts2.dateFormat = 'D MMM YYYY';
+
+ // Set second chops-timestamp element properties.
+ document.getElementById('js-ts3').date = date;
+ </script>
+ <chops-timestamp id="js-ts1"></chops-timestamp>
+ <br>
+ <chops-timestamp id="js-ts2"></chops-timestamp>
+ <br>
+ <chops-timestamp id="js-ts3" short></chops-timestamp>
+ </template>
+</demo-snippet>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-tree-status_demo.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-tree-status_demo.html
new file mode 100644
index 00000000000..4386a7b61f0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-tree-status_demo.html
@@ -0,0 +1,38 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-tree-status.html">
+
+<demo-snippet>
+ <template>
+ <script>
+ let closedStatusJson = {
+ 'username': 'nobody@chromium.org',
+ 'general_state': 'closed',
+ 'date': '2017-08-28 18:29:00.267230',
+ 'message': 'whoopsie',
+ }
+ let closedTree = document.getElementById('closed-tree');
+ closedTree.statusJson = closedStatusJson;
+ closedTree.statusUrl = 'http://chromium-status.appspot.com/';
+
+ let openStatusJson = {
+ 'username': 'nobody@chromium.org',
+ 'general_state': 'open',
+ 'date': '2017-08-28 18:29:00.267230',
+ 'message': 'chill',
+ }
+ let openTree = document.getElementById('open-tree');
+ openTree.statusJson = openStatusJson;
+ openTree.statusUrl = 'https://infra-status.appspot.com/';
+
+ let errorTree = document.getElementById('error-tree');
+ errorTree.statusErrorJson = {error: 'Failure!'};
+ errorTree.statusUrl = 'https://infra-status.appspot.com/';
+ </script>
+ <chops-tree-status id="closed-tree"> </chops-tree-status>
+ <br>
+ <chops-tree-status id="open-tree"></chops-tree-status>
+ <br>
+ <chops-tree-status id="error-tree"></chops-tree-status>
+ </template>
+</demo-snippet>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-user-id_demo.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-user-id_demo.html
new file mode 100644
index 00000000000..d116917701c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-user-id_demo.html
@@ -0,0 +1,12 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-user-id.html">
+<!--- TODO(jojwang): Add some element that listens for the 'remove-user' event -->
+
+<demo-snippet>
+ <template>
+ <chops-user-id user-id="afinch"></chops-user-id>
+ <chops-user-id user-id="sfinch" profile-link="https://www.google.com" removeable></chops-user-id>
+ <chops-user-id user-id="gatsby" full-name="Jay Gatsby" email="gatsbylooking@greenlight.com"></chops-user-id>
+ </template>
+</demo-snippet>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-user-input_demo.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-user-input_demo.html
new file mode 100644
index 00000000000..2c84bc9c0e1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/demo/chops-user-input_demo.html
@@ -0,0 +1,12 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-user-input.html">
+
+<demo-snippet>
+ <template>
+ <chops-user-input suggestions='[{"userId": "one", "email": "one@gmail.com"}, {"userId": "userTwo"}]'>
+ </chops-user-input>
+ <chops-user-input suggestions='[{"userId": "one", "email": "one@gmail.com"}, {"userId": "userTwo"}]' multiple>
+ </chops-user-input>
+ </template>
+</demo-snippet>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/img/img1.png b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/img/img1.png
new file mode 100644
index 00000000000..a8221411631
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/img/img1.png
Binary files differ
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/img/img2.png b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/img/img2.png
new file mode 100644
index 00000000000..26d3ff2ae45
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/img/img2.png
Binary files differ
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/img/logo.png b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/img/logo.png
new file mode 100644
index 00000000000..c436234d7ae
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/img/logo.png
Binary files differ
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/new-element-test.sh b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/new-element-test.sh
new file mode 100755
index 00000000000..64164ca9028
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/new-element-test.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+# Create the skeleton for a polymer element.
+# ./new-element-test time-stamp > test/time-stamp_test.html
+
+spinal=$1
+camel=$(sed -r 's/(^|-)([a-z])/\U\2/g' <<< "${spinal}")
+
+cat <<- _EOF_
+<!DOCTYPE html>
+<title>${camel}</title>
+<meta charset="utf-8">
+<script src="/bower_components/webcomponentsjs/webcomponents-lite.js"></script>
+<script src="/bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="/elements/${spinal}.html">
+
+<test-fixture id="${spinal}-test">
+ <template>
+ <${spinal}></${spinal}>
+ </template>
+</test-fixture>
+
+<script>
+ 'use strict';
+
+ suite('${spinal}', function() {
+ let element;
+ setup(function() {
+ element = fixture('${spinal}-test');
+
+ });
+
+ test('TEST DESCRIPTION', function(done) {
+
+ done();
+ });
+
+ });
+</script>
+
+_EOF_
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/new-element.sh b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/new-element.sh
new file mode 100755
index 00000000000..f7ef1c3e384
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/new-element.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+# Create the skeleton for a polymer element.
+# ./new-element time-stamp > elements/time-stamp.html
+
+spinal=$1
+camel=$(sed -r 's/(^|-)([a-z])/\U\2/g' <<< "${spinal}")
+
+cat <<- _EOF_
+<link rel="import" href="/bower_components/polymer/polymer.html">
+
+<dom-module id="${spinal}">
+ <template>
+ <style>
+ </style>
+ </template>
+ <script>
+ 'use strict';
+
+ /**
+ * \`<${spinal}>\` ....
+ *
+ * Element description here.
+ *
+ * @customElement
+ * @polymer
+ * @demo /demo/${spinal}_demo.html
+ */
+ class ${camel} extends Polymer.Element {
+ static get is() { return '${spinal}'; }
+
+ static get properties() {
+ return {
+ }
+ }
+
+ }
+ customElements.define(${camel}.is, ${camel});
+ </script>
+<dom-module>
+_EOF_
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/prpc-client.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/prpc-client.js
new file mode 100644
index 00000000000..cdc22c30bd4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/chopsui/prpc-client.js
@@ -0,0 +1,209 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// TODO(jeffcarp): Package as an ES module when ready.
+(function(window) {
+
+ /**
+ * An enum object mapping gRPC code names to integer codes.
+ * Reference: https://github.com/grpc/grpc-go/blob/972dbd2/codes/codes.go#L43
+ * @readonly
+ * @enum {number}
+ */
+ const RpcCode = Object.freeze({
+ OK: 0,
+ CANCELED: 1,
+ UNKNOWN: 2,
+ INVALID_ARGUMENT: 3,
+ DEADLINE_EXCEEDED: 4,
+ NOT_FOUND: 5,
+ ALREADY_EXISTS: 6,
+ PERMISSION_DENIED: 7,
+ RESOURCE_EXHAUSTED: 8,
+ FAILED_PRECONDITION: 9,
+ ABORTED: 10,
+ OUT_OF_RANGE: 11,
+ UNIMPLEMENTED: 12,
+ INTERNAL: 13,
+ UNAVAILABLE: 14,
+ DATA_LOSS: 15,
+ UNAUTHENTICATED: 16,
+ });
+
+ const rpcCodeNames = {};
+ for (const name in RpcCode) {
+ rpcCodeNames[RpcCode[name]] = name;
+ }
+
+ /**
+ * Converts a gRPC code integer into its code name.
+ * @param rpcCode {number} the RPC code to convert.
+ * @return {string|undefined} the code name of the corresponding gRPC code
+ * or undefined if not found.
+ */
+ function rpcCodeToCodeName(rpcCode) {
+ return rpcCodeNames[rpcCode];
+ }
+
+ /**
+ * Class for interacting with a pRPC API.
+ * Protocol: https://godoc.org/go.chromium.org/luci/grpc/prpc
+ */
+ class PrpcClient {
+
+ /**
+ * @constructor
+ * @param options {Object} with the following (all optional) config options:
+ * - host: {string} pRPC server host, defaults to current document host.
+ * - accessToken {string} OAuth 2.0 access token to use in RPC.
+ * - insecure {boolean} if true, use HTTP instead of HTTPS. Defaults to false.
+ * - fetchImpl {function} if supplied, use this function instead of fetch.
+ * Defaults to `window.fetch`.
+ */
+ constructor(options=null) {
+ options = options || {};
+ this.host = options.host || document.location.host;
+ this.accessToken = options.accessToken || null;
+ this.insecure = options.hasOwnProperty('insecure') && Boolean(options.insecure);
+ this.fetchImpl = options.fetchImpl || window.fetch.bind(window);
+ }
+
+ /**
+ * Send an RPC request.
+ * @async
+ * @param service {string} Full service name, including package name.
+ * @param method {string} Service method name.
+ * @param message {Object} The protobuf message to send.
+ * Note: because this method is async the following exceptions reject
+ * the returned Promise.
+ * @throws {TypeError} for invalid arguments.
+ * @throws {ProtocolError} when an error happens at the pRPC protocol
+ * (HTTP) level.
+ * @throws {GrpcError} when the response returns a non-OK gRPC status.
+ * @return {Promise<Object>} a promise resolving the response message
+ * or rejecting with an error..
+ */
+ async call(service, method, message) {
+ if (!service) {
+ throw new TypeError('missing required argument: service');
+ }
+ if (!method) {
+ throw new TypeError('missing required argument: method');
+ }
+ if (!message) {
+ throw new TypeError('missing required argument: message');
+ }
+ if (!(message instanceof Object)) {
+ throw new TypeError('argument `message` must be a protobuf object');
+ }
+
+ const protocol = this.insecure === true ? 'http:' : 'https:';
+ const url = `${protocol}//${this.host}/prpc/${service}/${method}`;
+ const options = this._requestOptions(message);
+
+ const response = await this.fetchImpl(url, options);
+
+ if (!response.headers.has('X-Prpc-Grpc-Code')) {
+ throw new ProtocolError(response.status,
+ 'Invalid response: no X-Prpc-Grpc-Code response header');
+ }
+
+ const rpcCode = Number.parseInt(response.headers.get('X-Prpc-Grpc-Code'), 10);
+ if (Number.isNaN(rpcCode)) {
+ throw new ProtocolError(response.status,
+ `Invalid X-Prpc-Grpc-Code response header`);
+ }
+
+ const XSSIPrefix = ')]}\'';
+ const rawResponseText = await response.text();
+
+ if (rpcCode !== RpcCode.OK) {
+ throw new GrpcError(rpcCode, rawResponseText);
+ }
+
+ if (!rawResponseText.startsWith(XSSIPrefix)) {
+ throw new ProtocolError(response.status,
+ `Response body does not start with XSSI prefix: ${XSSIPrefix}`);
+ }
+
+ return JSON.parse(rawResponseText.substr(XSSIPrefix.length));
+ }
+
+ /**
+ * @return {Object} the options used in fetch().
+ */
+ _requestOptions(message) {
+ const headers = {
+ 'accept': 'application/json',
+ 'content-type': 'application/json',
+ };
+ if (this.accessToken) {
+ headers.authorization = `Bearer ${this.accessToken}`;
+ }
+
+ return {
+ credentials: 'omit',
+ method: 'POST',
+ headers: headers,
+ body: JSON.stringify(message),
+ };
+ }
+ }
+
+ /**
+ * Data class representing an error returned from pRPC-gRPC.
+ */
+ class GrpcError extends Error {
+
+ /**
+ * @constructor
+ * @param code {number} gRPC code.
+ * @param description {string} error message.
+ */
+ constructor(code, description) {
+ super();
+ if (code === null) {
+ throw new Error('missing required argument: code');
+ }
+
+ this.code = code;
+ this.codeName = rpcCodeToCodeName(code);
+ this.description = description;
+ }
+
+ get message() {
+ return `code: ${this.code} (${this.codeName}) desc: ${this.description}`;
+ }
+ }
+
+ /**
+ * Data class representing a violation of the pRPC protocol.
+ */
+ class ProtocolError extends Error {
+ constructor(httpStatus, description) {
+ super();
+ if (httpStatus === null) {
+ throw new Error('missing required argument: httpStatus');
+ }
+
+ this.httpStatus = httpStatus;
+ this.description = description;
+ }
+
+ get message() {
+ return `status: ${this.httpStatus} desc: ${this.description}`;
+ }
+ }
+
+ // Export variables onto window.chops.rpc.
+ window.chops = window.chops || {};
+ window.chops.rpc = window.chops.rpc || {};
+ Object.assign(window.chops.rpc, {
+ RpcCode,
+ rpcCodeToCodeName,
+ PrpcClient,
+ ProtocolError,
+ GrpcError,
+ });
+})(window);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/.bower.json
new file mode 100644
index 00000000000..525574c6ce7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/.bower.json
@@ -0,0 +1,31 @@
+{
+ "name": "font-roboto",
+ "version": "1.1.0",
+ "description": "An HTML import for Roboto",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "font",
+ "roboto"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/font-roboto.git"
+ },
+ "main": "roboto.html",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/font-roboto/",
+ "ignore": [
+ "/.*"
+ ],
+ "_release": "1.1.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v1.1.0",
+ "commit": "014b084ae51314648053e792cf6c870946942953"
+ },
+ "_source": "https://github.com/PolymerElements/font-roboto.git",
+ "_target": "^1.0.1",
+ "_originalSource": "PolymerElements/font-roboto"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/README.md
new file mode 100644
index 00000000000..61c6394ce36
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/README.md
@@ -0,0 +1 @@
+# font-roboto
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/bower.json
new file mode 100644
index 00000000000..7099d7ff64f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/bower.json
@@ -0,0 +1,22 @@
+{
+ "name": "font-roboto",
+ "version": "1.0.3",
+ "description": "An HTML import for Roboto",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "font",
+ "roboto"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/font-roboto.git"
+ },
+ "main": "roboto.html",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/font-roboto/",
+ "ignore": [
+ "/.*"
+ ]
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/package-lock.json
new file mode 100644
index 00000000000..0a8f0abd2a1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/package-lock.json
@@ -0,0 +1,987 @@
+{
+ "name": "@polymerelements/font-roboto",
+ "version": "1.0.1",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.1.1.tgz",
+ "integrity": "sha512-rUfH6USpiPYSHl2dC+/rGb3RYK8LPyqNhiuZCLv13F0fhYr01jdTogGuSphEoSLklm1gKRsDsrfZq7OvpzPYEg==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.0",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.1",
+ "command-line-usage": "4.1.0",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.0",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.10"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.97",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.97.tgz",
+ "integrity": "sha512-k3CDdCq8Uv8AZ7/bmGSSvlwbPDPhkkckSq8Y9ndXowv86m3k07PjG98SigpjVAY9EyHV9kiFldEV306xh4gkig==",
+ "dev": true
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.10",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.10.tgz",
+ "integrity": "sha1-9vCd15PdL0IomsAdoCb8q6ZfGYw=",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.97",
+ "@types/parse5": "2.2.34",
+ "babel-generator": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "2.3.0",
+ "indent": "0.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "2.2.3",
+ "polymer-project-config": "3.8.1",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.1"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ }
+ }
+ }
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz",
+ "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.0"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.0"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.0.tgz",
+ "integrity": "sha512-zkYho6/4wZyX6o9UQ8rd0ReEaiEYNNCqYFIAACe2Tf9DrYlgzWW27OigYHnnztnnZQwVRpwWmZKegFmDpinIsA==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.0"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.7.tgz",
+ "integrity": "sha512-jNhbkxPtt9xbzvihfA0OavjJbpCIyTDSmwE03BVXgCKcz9lwNsq4cg2wsNkY4Av5eH35ttBArhYtVJa6CIrg2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.0"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.0.0.tgz",
+ "integrity": "sha512-v+0wW9Wezwsyb0uF4aBVCjmSqit3Ru7PZFziGF0o2KwTvN2zWfTi3BRLq9EkJFdg3eBbyERXGTntVpBxH1J68Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz",
+ "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.4",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.2",
+ "lodash": "4.17.4"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.4",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
+ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.1.tgz",
+ "integrity": "sha512-gRJDcIjFSzMcmG/GrJlgL0wWoAxr11mVzCq32bjka0endupm9meLwvoJUKc4HDeFiEIB2X3GvNrhF5cKO4Bd4A==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
+ "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "4.0.0",
+ "array-back": "2.0.0",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz",
+ "integrity": "sha1-+CBJdb0NrLvltYqKk//B/tD/zSo=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "6.0.96",
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "2.2.3"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.96",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.96.tgz",
+ "integrity": "sha512-fsOOY6tMQ3jCB2wD51XFDmmpgm4wVKkJECdcVRqapbJEa7awJDcr+SaH8toz+4r4KW8YQ3M7ybXMoSDo1QGewA==",
+ "dev": true
+ }
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz",
+ "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.5.7"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.4",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
+ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.8"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz",
+ "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.7",
+ "winston": "2.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.8.1.tgz",
+ "integrity": "sha512-MLvnM9gexFWg7nynY24eHZG6NLXocmk718sVds/sx2CAJ6iihhC0JMhhOIa6jnad9KQrHyGl/cs3mMRaaub5Fg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.96",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.96",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.96.tgz",
+ "integrity": "sha512-fsOOY6tMQ3jCB2wD51XFDmmpgm4wVKkJECdcVRqapbJEa7awJDcr+SaH8toz+4r4KW8YQ3M7ybXMoSDo1QGewA==",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.1.tgz",
+ "integrity": "sha1-Eahr7+rDxKo+wIYjZRo8gabQu8g=",
+ "dev": true
+ },
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/package.json
new file mode 100644
index 00000000000..a74ad2b74fb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/package.json
@@ -0,0 +1,26 @@
+{
+ "name": "@polymerelements/font-roboto",
+ "version": "1.0.1",
+ "description": "An HTML import for Roboto",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "font",
+ "roboto"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/font-roboto.git"
+ },
+ "main": "roboto.html",
+ "license": "BSD-3-Clause",
+ "homepage": "https://github.com/PolymerElements/font-roboto/",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.1.1",
+ "bower": "^1.8.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir ."
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/roboto.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/roboto.d.ts
new file mode 100644
index 00000000000..12fab1efa81
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/roboto.d.ts
@@ -0,0 +1,10 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * roboto.html
+ */
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/roboto.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/roboto.html
new file mode 100644
index 00000000000..417ee18c7e4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/font-roboto/roboto.html
@@ -0,0 +1,10 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Roboto+Mono:400,700|Roboto:400,300,300italic,400italic,500,500italic,700,700italic" crossorigin="anonymous">
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/.bower.json
new file mode 100644
index 00000000000..e1730d6dead
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/.bower.json
@@ -0,0 +1,56 @@
+{
+ "name": "google-apis",
+ "version": "2.0.1",
+ "description": "Web components to load Google API libraries",
+ "homepage": "https://elements.polymer-project.org/elements/google-apis?active=google-js-api",
+ "main": "google-apis.html",
+ "authors": [
+ "Scott Miles <sjmiles@google.com>",
+ "Eric Bidelman <ebidel@gmail.com>"
+ ],
+ "license": "Apache-2.0",
+ "ignore": [
+ "/.*",
+ "/test/"
+ ],
+ "keywords": [
+ "web-component",
+ "web-components",
+ "polymer",
+ "google",
+ "apis"
+ ],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-jsonp-library": "PolymerElements/iron-jsonp-library#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.0.0",
+ "iron-jsonp-library": "PolymerElements/iron-jsonp-library#^1.0.0"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.0.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.0.1",
+ "commit": "cb0a9fd502a845096a63e4a1499fe43efe942638"
+ },
+ "_source": "https://github.com/GoogleWebComponents/google-apis.git",
+ "_target": "1 - 2",
+ "_originalSource": "GoogleWebComponents/google-apis"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/LICENSE b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/LICENSE
new file mode 100644
index 00000000000..3dde500925f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/LICENSE
@@ -0,0 +1,13 @@
+Copyright 2015 Google Inc
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/README.md
new file mode 100644
index 00000000000..dd9268cd404
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/README.md
@@ -0,0 +1,4 @@
+google-apis
+===========
+
+See https://elements.polymer-project.org/elements/google-apis
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/bower.json
new file mode 100644
index 00000000000..d854f69317d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/bower.json
@@ -0,0 +1,47 @@
+{
+ "name": "google-apis",
+ "version": "2.0.1",
+ "description": "Web components to load Google API libraries",
+ "homepage": "https://elements.polymer-project.org/elements/google-apis?active=google-js-api",
+ "main": "google-apis.html",
+ "authors": [
+ "Scott Miles <sjmiles@google.com>",
+ "Eric Bidelman <ebidel@gmail.com>"
+ ],
+ "license": "Apache-2.0",
+ "ignore": [
+ "/.*",
+ "/test/"
+ ],
+ "keywords": [
+ "web-component",
+ "web-components",
+ "polymer",
+ "google",
+ "apis"
+ ],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-jsonp-library": "PolymerElements/iron-jsonp-library#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.0.0",
+ "iron-jsonp-library": "PolymerElements/iron-jsonp-library#^1.0.0"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/demo/index.html
new file mode 100644
index 00000000000..0455cbb6a3a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/demo/index.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<!-- Copyright (c) 2015 Google Inc. All rights reserved. -->
+<html>
+<head>
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+ <title>google-apis Demo</title>
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../google-apis.html">
+</head>
+<body>
+ <div id="messages"></div>
+
+ <dom-bind id="bind">
+ <template id="t" is="dom-bind">
+
+ <google-client-loader id="shortener"
+ name="urlshortener"
+ version="v1"
+ on-google-api-load="loadedShortener"></google-client-loader>
+ <google-js-api on-js-api-load="loaded"></google-js-api>
+ <google-plusone-api on-api-load="loaded"></google-plusone-api>
+ <google-realtime-api on-api-load="loaded"></google-realtime-api>
+ <google-maps-api on-api-load="loaded"></google-maps-api>
+ <google-youtube-api on-api-load="loaded"></google-youtube-api>
+ <google-legacy-loader on-api-load="loaded"></google-legacy-loader>
+
+ </template>
+ </dom-bind>
+ <script>
+ // polymer 1.x compatibility
+ t.loadedShortener = function(event) {
+ var request = event.target.api.url.get({
+ shortUrl: 'http://goo.gl/fbsS'
+ })
+ request.execute(function(resp) {
+ console.log(resp);
+ });
+ }
+
+ t.loaded = function(e) {
+ document.querySelector('#messages').innerHTML +=
+ e.target.localName + ' loaded' + '<br>';
+ console.log(e.target.localName + ' loaded', event.target.api);
+ }
+
+ // Polymer 2.0 compatibility
+ bind.loadedShortener = t.loadedShortener;
+ bind.loaded = t.loaded;
+ </script>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-apis.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-apis.html
new file mode 100644
index 00000000000..29f9883b652
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-apis.html
@@ -0,0 +1,16 @@
+<!--
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at https://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at https://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at https://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at https://polymer.github.io/PATENTS.txt
+-->
+
+<!-- Load all Google APIs, for backwards compatibility -->
+<link rel="import" href="google-client-loader.html">
+<link rel="import" href="google-legacy-loader.html">
+<link rel="import" href="google-maps-api.html">
+<link rel="import" href="google-plusone-api.html">
+<link rel="import" href="google-realtime-api.html">
+<link rel="import" href="google-youtube-api.html">
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-client-loader.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-client-loader.html
new file mode 100644
index 00000000000..cbbb6d0034f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-client-loader.html
@@ -0,0 +1,236 @@
+<!--
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at https://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at https://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at https://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at https://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="google-js-api.html">
+
+<!--
+Element for loading a specific client Google API with the JavaScript client library.
+
+For loading `gapi.client` libraries
+
+##### Example
+
+ <google-client-loader id="shortener"
+ name="urlshortener"
+ version="v1"></google-client-loader>
+
+ <script>
+ var shortener = document.getElementById('shortener');
+ shortener.addEventListener('google-api-load', function(event) {
+ var request = shortener.api.url.get({
+ shortUrl: 'http://goo.gl/fbsS'
+ });
+ request.execute(function(resp) {
+ console.log(resp);
+ });
+ });
+ </script>
+
+@demo
+-->
+
+<script>
+ (function() {
+ 'use strict';
+
+ // Stores whether the API client is done loading.
+ var _clientLoaded = false;
+
+ // Loaders and loading statuses for all APIs, indexed by API name.
+ // This helps prevent multiple loading requests being fired at the same time
+ // by multiple google-api-loader elements.
+ var _statuses = {};
+ var _loaders = {};
+
+ Polymer({
+
+ is: 'google-client-loader',
+
+ /**
+ * Fired when the requested API is loaded. Override this name
+ * by setting `successEventName`.
+ * @event google-api-load
+ */
+
+ /**
+ * Fired if an error occurs while loading the requested API. Override this name
+ * by setting `errorEventName`.
+ * @event google-api-load-error
+ */
+
+ properties: {
+ /**
+ * Name of the API to load, e.g. 'urlshortener'.
+ *
+ * You can find the full list of APIs on the
+ * <a href="https://developers.google.com/apis-explorer"> Google APIs
+ * Explorer</a>.
+ */
+ name: String,
+
+ /**
+ * Version of the API to load, e.g. 'v1'.
+ */
+ version: String,
+
+ /**
+ * App Engine application ID for loading a Google Cloud Endpoints API.
+ */
+ appId: String,
+
+ /**
+ * Root URL where to load the API from, e.g. 'http://host/apis'.
+ * For App Engine dev server this would be something like:
+ * 'http://localhost:8080/_ah/api'.
+ * Overrides 'appId' if both are specified.
+ */
+ apiRoot: String,
+
+ /**
+ * Name of the event fired when API library is loaded.
+ */
+ successEventName: {
+ type: String,
+ value: 'google-api-load'
+ },
+
+ /**
+ * Name of the event fired when there is an error loading the library.
+ */
+ errorEventName: {
+ type: String,
+ value: 'google-api-load-error'
+ }
+ },
+
+ hostAttributes: {
+ hidden: true // remove from rendering tree.
+ },
+
+ // Used to fix events potentially being fired multiple times by
+ // iron-jsonp-library.
+ _waiting: false,
+
+ /**
+ * Returns the loaded API.
+ */
+ get api() {
+ if (window.gapi && window.gapi.client &&
+ window.gapi.client[this.name]) {
+ return window.gapi.client[this.name];
+ } else {
+ return undefined;
+ }
+ },
+
+ /**
+ * Wrapper for `gapi.auth`.
+ */
+ get auth() {
+ return gapi.auth;
+ },
+
+ ready: function() {
+ this._loader = document.createElement('google-js-api');
+
+ if (!this.shadowRoot) { this.attachShadow({mode: 'open'}); }
+ this.shadowRoot.appendChild(this._loader);
+
+ this.listen(this._loader, 'js-api-load', '_loadClient');
+ },
+
+ detached: function() {
+ this.unlisten(this._loader, 'js-api-load', '_loadClient');
+ },
+
+ _loadClient: function() {
+ gapi.load('client', this._doneLoadingClient.bind(this));
+ },
+
+ _handleLoadResponse: function(response) {
+ if (response && response.error) {
+ _statuses[this.name] = 'error';
+ this._fireError(response);
+ } else {
+ _statuses[this.name] = 'loaded';
+ this._fireSuccess();
+ }
+ },
+
+ _fireSuccess: function() {
+ this.fire(this.successEventName,
+ { 'name': this.name, 'version': this.version });
+ },
+
+ _fireError: function(response) {
+ if (response && response.error) {
+ this.fire(this.errorEventName, {
+ 'name': this.name,
+ 'version': this.version,
+ 'error': response.error });
+ } else {
+ this.fire(this.errorEventName, {
+ 'name': this.name,
+ 'version': this.version });
+ }
+ },
+
+ _doneLoadingClient: function() {
+ _clientLoaded = true;
+ // Fix for API client load event being fired multiple times by
+ // iron-jsonp-library.
+ if (!this._waiting) {
+ this._loadApi();
+ }
+ },
+
+ _createSelfRemovingListener: function(eventName) {
+ var handler = function () {
+ _loaders[this.name].removeEventListener(eventName, handler);
+ this._loadApi();
+ }.bind(this);
+
+ return handler;
+ },
+
+ _loadApi: function() {
+ if (_clientLoaded && this.name && this.version) {
+ this._waiting = false;
+ // Is this API already loaded?
+ if (_statuses[this.name] == 'loaded') {
+ this._fireSuccess();
+ // Is a different google-api-loader already loading this API?
+ } else if (_statuses[this.name] == 'loading') {
+ this._waiting = true;
+ _loaders[this.name].addEventListener(this.successEventName,
+ this._createSelfRemovingListener(this.successEventName));
+ _loaders[this.name].addEventListener(this.errorEventName,
+ this._createSelfRemovingListener(this.errorEventName));
+ // Did we get an error when we tried to load this API before?
+ } else if (_statuses[this.name] == 'error') {
+ this._fireError(null);
+ // Otherwise, looks like we're loading a new API.
+ } else {
+ var root;
+ if (this.apiRoot) {
+ root = this.apiRoot;
+ } else if (this.appId) {
+ root = 'https://' + this.appId + '.appspot.com/_ah/api';
+ }
+ _statuses[this.name] = 'loading';
+ _loaders[this.name] = this;
+ gapi.client.load(this.name, this.version,
+ this._handleLoadResponse.bind(this), root);
+ }
+ }
+ }
+ });
+ })();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-js-api.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-js-api.html
new file mode 100644
index 00000000000..3b05a109756
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-js-api.html
@@ -0,0 +1,63 @@
+<!--
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at https://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at https://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at https://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at https://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-jsonp-library/iron-jsonp-library.html">
+
+<!--
+Dynamically loads Google JavaScript API `gapi`, firing the `js-api-load` event when ready.
+
+Any number of components can use `<google-js-api>` elements, and the library will only be loaded once.
+
+##### Example
+
+ <google-js-api></google-js-api>
+ <script>
+ var api = document.querySelector('google-js-api');
+ api.addEventListener('js-api-load', function(e) {
+ console.log('API loaded', gapi);
+ });
+ </script>
+-->
+<script>
+ Polymer({
+
+ is: 'google-js-api',
+
+ behaviors: [
+ Polymer.IronJsonpLibraryBehavior
+ ],
+
+ properties: {
+
+ /** @private */
+ libraryUrl: {
+ type: String,
+ value: 'https://apis.google.com/js/api.js?onload=%%callback%%'
+ },
+
+ /**
+ * Fired when the API library is loaded and available.
+ * @event js-api-load
+ */
+ /**
+ * Name of event fired when library is loaded and available.
+ */
+ notifyEvent: {
+ type: String,
+ value: 'js-api-load'
+ },
+ },
+
+ get api() {
+ return gapi;
+ }
+
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-legacy-loader.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-legacy-loader.html
new file mode 100644
index 00000000000..02e7a5c4215
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-legacy-loader.html
@@ -0,0 +1,55 @@
+<!--
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at https://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at https://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at https://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at https://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-jsonp-library/iron-jsonp-library.html">
+
+<!--
+Dynamically loads the legacy Google JavaScript API Loader (https://developers.google.com/loader/).
+
+Fires `api-load` event when ready.
+-->
+<script>
+ Polymer({
+
+ is: 'google-legacy-loader',
+
+ behaviors: [
+ Polymer.IronJsonpLibraryBehavior
+ ],
+
+ properties: {
+
+ /** @private */
+ libraryUrl: {
+ type: String,
+ value: 'https://www.google.com/jsapi?callback=%%callback%%'
+ },
+
+ /**
+ * Fired when the API library is loaded and available.
+ * @event js-api-load
+ */
+ /**
+ * Name of event fired when library is loaded and available.
+ */
+ notifyEvent: {
+ type: String,
+ value: 'api-load'
+ }
+ },
+
+ /**
+ * Wrapper for `google` API namespace.
+ */
+ get api() {
+ return google;
+ }
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-maps-api.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-maps-api.html
new file mode 100644
index 00000000000..fb9bbacab00
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-maps-api.html
@@ -0,0 +1,150 @@
+<!--
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at https://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at https://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at https://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at https://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-jsonp-library/iron-jsonp-library.html">
+
+<!--
+Dynamically loads the Google Maps JavaScript API, firing the `api-load` event when ready.
+
+#### Example
+
+ <google-maps-api api-key="abc123" version="3.exp"></google-maps-api>
+ <script>
+ var mapsAPI = document.querySelector('google-maps-api');
+ mapsAPI.addEventListener('api-load', function(e) {
+ // this.api === google.maps
+ });
+ </script>
+
+Any number of components can use `<google-maps-api>` elements, and the library will only be loaded once.
+
+@summary Element wrapper around Google Maps API.
+-->
+<script>
+ Polymer({
+
+ is: 'google-maps-api',
+
+ behaviors: [
+ Polymer.IronJsonpLibraryBehavior
+ ],
+
+ properties: {
+
+ /** @private */
+ mapsUrl: {
+ type: String,
+ value: 'https://maps.googleapis.com/maps/api/js?callback=%%callback%%'
+ },
+
+ /**
+ * A Maps API key. To obtain an API key, see developers.google.com/maps/documentation/javascript/tutorial#api_key.
+ */
+ apiKey: {
+ type: String,
+ value: ''
+ },
+
+ /**
+ * A Maps API for Business Client ID. To obtain a Maps API for Business Client ID, see developers.google.com/maps/documentation/business/.
+ * If set, a Client ID will take precedence over an API Key.
+ */
+ clientId: {
+ type: String,
+ value: ''
+ },
+
+ /**
+ * Version of the Maps API to use.
+ */
+ version: {
+ type: String,
+ value: '3.exp'
+ },
+
+ /**
+ * The localized language to load the Maps API with. For more information
+ * see https://developers.google.com/maps/documentation/javascript/basics#Language
+ *
+ * Note: the Maps API defaults to the preffered language setting of the browser.
+ * Use this parameter to override that behavior.
+ */
+ language: {
+ type: String,
+ value: ''
+ },
+ /**
+ * If true, sign-in is enabled.
+ * See https://developers.google.com/maps/documentation/javascript/signedin#enable_sign_in
+ */
+ signedIn: {
+ type: Boolean,
+ value: false
+ },
+
+ /**
+ * Fired when the Maps API library is loaded and ready.
+ * @event api-load
+ */
+ /**
+ * Name of event fired when library is loaded and available.
+ */
+ notifyEvent: {
+ type: String,
+ value: 'api-load'
+ },
+
+ /** @private */
+ libraryUrl: {
+ type: String,
+ computed: '_computeUrl(mapsUrl, version, apiKey, clientId, language, signedIn)'
+ }
+ },
+
+ _computeUrl: function(mapsUrl, version, apiKey, clientId, language, signedIn) {
+ var url = mapsUrl + '&v=' + version;
+
+ // Always load all Maps API libraries.
+ url += '&libraries=drawing,geometry,places,visualization';
+
+ if (apiKey && !clientId) {
+ url += '&key=' + apiKey;
+ }
+
+ if (clientId) {
+ url += '&client=' + clientId;
+ }
+
+ // Log a warning if the user is not using an API Key or Client ID.
+ if (!apiKey && !clientId) {
+ var warning = 'No Google Maps API Key or Client ID specified. ' +
+ 'See https://developers.google.com/maps/documentation/javascript/get-api-key ' +
+ 'for instructions to get started with a key or client id.';
+ console.warn(warning);
+ }
+
+ if (language) {
+ url += '&language=' + language;
+ }
+
+ if (signedIn) {
+ url += '&signed_in=' + signedIn;
+ }
+ return url;
+ },
+
+ /**
+ * Provides the google.maps JS API namespace.
+ */
+ get api() {
+ return google.maps;
+ }
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-plusone-api.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-plusone-api.html
new file mode 100644
index 00000000000..205658e04cc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-plusone-api.html
@@ -0,0 +1,54 @@
+<!--
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at https://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at https://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at https://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at https://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-jsonp-library/iron-jsonp-library.html">
+
+<!--
+Dynamically loads the Google+ JavaScript API, firing the `api-load` event when ready.
+
+Any number of components can use `<google-plusone-api>` elements, and the library will only be loaded once.
+-->
+<script>
+ Polymer({
+
+ is: 'google-plusone-api',
+
+ behaviors: [
+ Polymer.IronJsonpLibraryBehavior
+ ],
+
+ properties: {
+
+ /** @private */
+ libraryUrl: {
+ type: String,
+ value: 'https://apis.google.com/js/plusone.js?onload=%%callback%%'
+ },
+
+ /**
+ * Fired when the API library is loaded and available.
+ * @event js-api-load
+ */
+ /**
+ * Name of event fired when library is loaded and available.
+ */
+ notifyEvent: {
+ type: String,
+ value: 'api-load'
+ }
+
+ },
+
+ get api() {
+ return gapi;
+ }
+
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-realtime-api.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-realtime-api.html
new file mode 100644
index 00000000000..a41fb517adb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-realtime-api.html
@@ -0,0 +1,57 @@
+<!--
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at https://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at https://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at https://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at https://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-jsonp-library/iron-jsonp-library.html">
+
+<!--
+Dynamically loads the Google Drive Realtime API, firing the `api-load` event when ready.
+
+Any number of components can use `<google-realtime-api>` elements, and the library will only be loaded once.
+-->
+<script>
+ Polymer({
+
+ is: 'google-realtime-api',
+
+ behaviors: [
+ Polymer.IronJsonpLibraryBehavior
+ ],
+
+ properties: {
+
+ /** @private */
+ libraryUrl: {
+ type: String,
+ value: 'https://apis.google.com/js/drive-realtime.js?onload=%%callback%%'
+ },
+
+ /**
+ * Fired when the API library is loaded and available.
+ * @event api-load
+ */
+ /**
+ * Name of event fired when library is loaded and available.
+ */
+ notifyEvent: {
+ type: String,
+ value: 'api-load'
+ }
+
+ },
+
+ /**
+ * Returns `gapi.drive.realtime`
+ */
+ get api() {
+ return gapi.drive.realtime;
+ }
+
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-youtube-api.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-youtube-api.html
new file mode 100644
index 00000000000..7f8960d74c5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/google-youtube-api.html
@@ -0,0 +1,61 @@
+<!--
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at https://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at https://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at https://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at https://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-jsonp-library/iron-jsonp-library.html">
+
+<!--
+Dynamically loads the Google Youtube Iframe API, firing the `api-load` event when ready.
+
+Any number of components can use `<google-youtube-api>` elements, and the library will only be loaded once.
+
+https://developers.google.com/youtube/iframe_api_reference
+-->
+<script>
+ Polymer({
+
+ is: 'google-youtube-api',
+
+ behaviors: [
+ Polymer.IronJsonpLibraryBehavior
+ ],
+
+ properties: {
+
+ /** @private */
+ libraryUrl: {
+ type: String,
+ value: 'https://www.youtube.com/iframe_api'
+ },
+
+ /**
+ * Fired when the API library is loaded and available.
+ * @event api-load
+ */
+ /**
+ * Name of event fired when library loads.
+ */
+ notifyEvent: {
+ type: String,
+ value: 'api-load'
+ },
+
+ callbackName: {
+ type: String,
+ value: 'onYouTubeIframeAPIReady'
+ }
+
+ },
+
+ get api() {
+ return YT;
+ }
+
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/index.html
new file mode 100644
index 00000000000..203f4fa4813
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-apis/index.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<!-- Copyright (c) 2015 Google Inc. All rights reserved. -->
+<html>
+<head>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/.bower.json
new file mode 100644
index 00000000000..79bb496fa2f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/.bower.json
@@ -0,0 +1,63 @@
+{
+ "name": "google-signin",
+ "version": "2.0.0",
+ "description": "Web components to authenticate with Google services",
+ "homepage": "https://googlewebcomponents.github.io/google-signin",
+ "main": "google-signin.html",
+ "authors": [
+ "Addy Osmani",
+ "Randy Merrill"
+ ],
+ "license": "Apache-2.0",
+ "ignore": [
+ "/.*",
+ "/test/"
+ ],
+ "keywords": [
+ "web-component",
+ "web-components",
+ "polymer",
+ "sign-in",
+ "google",
+ "authentication"
+ ],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "font-roboto": "PolymerElements/font-roboto#^1.0.0",
+ "iron-icon": "PolymerElements/iron-icon#1 - 2",
+ "iron-iconset-svg": "PolymerElements/iron-iconset-svg#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "paper-ripple": "PolymerElements/paper-ripple#1 - 2",
+ "paper-material": "PolymerElements/paper-material#1 - 2",
+ "google-apis": "GoogleWebComponents/google-apis#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.0.0",
+ "font-roboto": "PolymerElements/font-roboto#^1.0.0",
+ "iron-icon": "PolymerElements/iron-icon#^1.0.0",
+ "iron-iconset-svg": "PolymerElements/iron-iconset-svg#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.3.0",
+ "paper-ripple": "PolymerElements/paper-ripple#^1.0.0",
+ "paper-material": "PolymerElements/paper-material#^1.0.0",
+ "google-apis": "GoogleWebComponents/google-apis#^1.0.0"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0"
+ }
+ }
+ },
+ "_release": "2.0.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.0.0",
+ "commit": "6a3182651e531f221abc0a8341c8fd0246acd08f"
+ },
+ "_source": "https://github.com/GoogleWebComponents/google-signin.git",
+ "_target": "*",
+ "_originalSource": "GoogleWebComponents/google-signin"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/LICENSE b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/LICENSE
new file mode 100644
index 00000000000..52aea39185b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/LICENSE
@@ -0,0 +1,13 @@
+Copyright 2014 Google Inc
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/README.md
new file mode 100644
index 00000000000..e2fc16e4249
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/README.md
@@ -0,0 +1,4 @@
+google-signin
+================
+
+See https://elements.polymer-project.org/elements/google-signin
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/bower.json
new file mode 100644
index 00000000000..06febde750e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/bower.json
@@ -0,0 +1,54 @@
+{
+ "name": "google-signin",
+ "version": "2.0.0",
+ "description": "Web components to authenticate with Google services",
+ "homepage": "https://googlewebcomponents.github.io/google-signin",
+ "main": "google-signin.html",
+ "authors": [
+ "Addy Osmani",
+ "Randy Merrill"
+ ],
+ "license": "Apache-2.0",
+ "ignore": [
+ "/.*",
+ "/test/"
+ ],
+ "keywords": [
+ "web-component",
+ "web-components",
+ "polymer",
+ "sign-in",
+ "google",
+ "authentication"
+ ],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "font-roboto": "PolymerElements/font-roboto#^1.0.0",
+ "iron-icon": "PolymerElements/iron-icon#1 - 2",
+ "iron-iconset-svg": "PolymerElements/iron-iconset-svg#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "paper-ripple": "PolymerElements/paper-ripple#1 - 2",
+ "paper-material": "PolymerElements/paper-material#1 - 2",
+ "google-apis": "GoogleWebComponents/google-apis#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.0.0",
+ "font-roboto": "PolymerElements/font-roboto#^1.0.0",
+ "iron-icon": "PolymerElements/iron-icon#^1.0.0",
+ "iron-iconset-svg": "PolymerElements/iron-iconset-svg#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.3.0",
+ "paper-ripple": "PolymerElements/paper-ripple#^1.0.0",
+ "paper-material": "PolymerElements/paper-material#^1.0.0",
+ "google-apis": "GoogleWebComponents/google-apis#^1.0.0"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0"
+ }
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/demo/index.html
new file mode 100644
index 00000000000..0db7e5a9788
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/demo/index.html
@@ -0,0 +1,208 @@
+<!doctype html>
+<!-- Copyright (c) 2014 Google Inc. All rights reserved. -->
+<html>
+<head>
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+
+ <title>google-signin Demo</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../google-signin.html">
+ <link rel="import" href="../google-signin-aware.html">
+
+ <!-- Demo only styles -->
+ <style>
+ body {
+ font-family: 'RobotoDraft', 'Roboto', sans-serif;
+ line-height:1.2;
+ vertical-align:middle;
+ background: rgba(204, 204, 204, 0.31);
+ }
+
+
+ .map {
+ background: whitesmoke;
+ margin: .5rem -1.5rem 0 -1.5rem;
+ padding: 0.5rem;
+ }
+
+ h1 {
+ font-size: 2rem;
+ font-weight:200;
+ clear: both;
+ }
+
+ h1 strong {
+ font-weight:300;
+ color:#539D00;
+ }
+
+ h2 {
+ font-size:.9rem;
+ line-height:2.5;
+ color:gray;
+ font-weight:400;
+ clear: both;
+ }
+
+ .showcase {
+ display: inline-block;
+ margin-right: 2rem;
+ float: left;
+ }
+ </style>
+
+</head>
+
+<body>
+ <p>A <code>&lt;google-signin&gt;</code> element looks like this button:</p>
+
+ <p><google-signin brand="google" client-id="1054047045356-j8pgqgls9vdef3rl09hapoicumbte0bo.apps.googleusercontent.com"></google-signin>
+or like this if plus scopes are present
+ <google-signin brand="google-plus"></google-signin>
+ </p>
+ <p>Signin button can vary its appearance:</p>
+ <p>Width:
+ <google-signin brand="google" width="wide"></google-signin>
+ <google-signin brand="google" width="iconOnly"></google-signin>
+ Height:
+ <google-signin brand="google" height="tall"></google-signin>
+ <google-signin brand="google" height="standard"></google-signin>
+ <google-signin brand="google" height="short"></google-signin>
+ </p>
+ <p>
+ Theme:
+ <google-signin brand="google" theme="dark"></google-signin>
+ <google-signin brand="google" theme="light"></google-signin>
+ <google-signin brand="google-plus" theme="dark"></google-signin>
+ <google-signin brand="google-plus" theme="light"></google-signin>
+ <google-signin brand="google-plus" theme="light" raised></google-signin>
+ </p>
+ <!-- Demo the ability to use the google-signin-aware element. -->
+ <p><code>&lt;google-signin-aware&gt;</code> is a companion element.</p>
+ <p>You can use it inside your components to request additional scopes.</p>
+ <p>Every signin button will request all the scopes present in the document,
+ and change its appearance to match</p>
+ <p>For example, here is a signin-aware scope. You can change its scopes via popup</p>
+ <dom-bind id="awareness">
+ <template is="dom-bind">
+ <div><code>&lt;google-signin-aware
+ <div>scope=
+ <select value="{{scope::change}}">
+ <option value="">None</option>
+ <option value="https://www.googleapis.com/auth/analytics">Google Analytics</option>
+ <option value="https://www.googleapis.com/auth/plus.login">Google Plus view circles</option>
+ <option value="https://www.googleapis.com/auth/youtube">YouTube</option>
+ <option value="https://www.googleapis.com/auth/calendar">Calendar</option>
+ <option value="profile">Profile info</option>
+ </select>
+ </div>
+ <div>openid-prompt=
+ <input type="checkbox" checked="{{openidPrompt.none::change}}">none
+ <input type="checkbox" checked="{{openidPrompt.login::change}}">login
+ <input type="checkbox" checked="{{openidPrompt.consent::change}}">consent
+ <input type="checkbox"
+ checked="{{openidPrompt.select_account::change}}">select_account
+ </div>
+ <div>offline=<input type="checkbox" checked="{{offline::change}}"></div>
+ <div>initialized="<span>{{initialized}}</span>"</div>
+ <div>signedIn="<span>{{signedIn}}</span>"</div>
+ <div>isAuthorized="<span>{{isAuthorized}}</span>"</div>
+ <div>needAdditionalAuth:"<span>{{needAdditionalAuth}}</span>"&gt;</div>
+ </code></div>
+ <p>Every new scope you select will be added to requested scopes.</p>
+ <p>When you select a Google Plus scope, button will turn red.</p>
+ <google-signin></google-signin>
+ </p>
+ <google-signin-aware
+ scopes="{{scope}}"
+ openid-prompt="{{openidPromptValue}}"
+ initialized="{{initialized}}"
+ signed-in="{{signedIn}}"
+ offline="{{offline}}"
+ is-authorized="{{isAuthorized}}"
+ need-additional-auth="{{needAdditionalAuth}}"
+ on-google-signin-aware-error="handleSignInError"
+ on-google-signin-aware-success="handleSignIn"
+ on-google-signin-offline-success="handleOffline"
+ on-google-signin-aware-signed-out="handleSignOut"
+ on-signed-in-changed="handleStateChange"
+ on-initialized-changed="handleStateChange"></google-signin-aware>
+ <p>User name:<span>{{userName}}</span></p>
+ <p>Testing <code>google-signin-aware</code> events: <span>{{status}}</span></p>
+ <p>Testing <code>google-signin-offline</code> events: <span>{{offlineCode}}</span></p>
+ <p>Only display "not signed in" element after auth state is initialized (avoid flickering): <b hidden id="not-signed-in">Not signed in!</b></p>
+ <p><button on-click="disconnect">Disconnect to start over</button></p>
+ </template>
+ </dom-bind>
+ <script>
+ var aware = document.querySelector('#awareness');
+ if (!Polymer.Element) {
+ aware = aware.querySelector('template');
+ }
+
+ aware.status = 'Not granted';
+ aware.offlineCode = 'No offline login.';
+ aware.userName = 'N/A';
+ aware.openidPrompt = {};
+
+ aware.handleSignInError = function(event) {
+ this.status = JSON.stringify(event.detail);
+ };
+ aware.handleSignIn = function(response) {
+ this.status = 'Signin granted';
+ // console.log('[Aware] Signin Response', response);
+ this.userName = gapi.auth2.getAuthInstance().currentUser.get().getBasicProfile().getName();
+ };
+ aware.handleOffline = function(response) {
+ this.offlineCode = response.detail.code;
+ };
+ aware.handleSignOut = function(response) {
+ this.status = 'Signed out';
+ // console.log('[Aware] Signout Response', response);
+ this.userName = 'N/A';
+ };
+ aware.disconnect = function() {
+ var currentUser = gapi.auth2.getAuthInstance().currentUser.get();
+ if (currentUser) {
+ currentUser.disconnect();
+ }
+ gapi.auth2.getAuthInstance().signOut();
+ };
+
+ aware.handleStateChange = function(e) {
+ var signedIn = e.target.signedIn;
+ var initialized = e.target.initialized;
+ if(initialized && !signedIn) {
+ document.querySelector("#not-signed-in").removeAttribute("hidden");
+ } else {
+ document.querySelector("#not-signed-in").setAttribute("hidden", true);
+ }
+ };
+
+ aware.addEventListener('openid-prompt-changed', function(e) {
+ if (e.detail.value) {
+ if (e.detail.path === 'openidPrompt.none') {
+ aware.set('openidPrompt', {
+ none: true,
+ login: false,
+ consent: false,
+ select_account: false
+ });
+ } else {
+ aware.set('openidPrompt.none', false);
+ }
+ }
+
+ var values = [];
+ Object.keys(aware.openidPrompt).forEach(function(k) {
+ if (aware.openidPrompt[k]) {
+ values.push(k);
+ }
+ });
+ this.set('openidPromptValue', values.join(' '));
+ });
+
+ </script>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/google-icons.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/google-icons.html
new file mode 100644
index 00000000000..0787b94f2c2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/google-icons.html
@@ -0,0 +1,36 @@
+<!--
+Copyright 2014 Google Inc
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<link rel="import" href="../iron-icon/iron-icon.html">
+<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
+<iron-iconset-svg name="google" size="24">
+<svg>
+ <defs>
+ <g id="google">
+ <path fill="#4285F4" d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"/>
+ <path fill="#34A853" d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"/>
+ <path fill="#FBBC05" d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"/>
+ <path fill="#EA4335" d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"/>
+ <path fill="none" d="M1 1h22v22H1z"/>
+ </g>
+ <g id="google-plus">
+ <path fill="none" d="M0 0h24v24H0V0z"/>
+ <path d="M23 11h-2V9h-2v2h-2v2h2v2h2v-2h2zM8 11v2.4h3.97c-.16 1.03-1.2 3.02-3.97 3.02-2.39 0-4.34-1.98-4.34-4.42S5.61 7.58 8 7.58c1.36 0 2.27.58 2.79 1.08l1.9-1.83C11.47 5.69 9.89 5 8 5c-3.87 0-7 3.13-7 7s3.13 7 7 7c4.04 0 6.72-2.84 6.72-6.84 0-.46-.05-.81-.11-1.16H8z"/>
+ <path fill="none" d="M1 5h14v14H1z"/>
+ </g>
+ </defs>
+</svg>
+</iron-iconset-svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/google-signin-aware.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/google-signin-aware.html
new file mode 100644
index 00000000000..e6e731bfad1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/google-signin-aware.html
@@ -0,0 +1,824 @@
+<!--
+Copyright 2014 Google Inc
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../google-apis/google-js-api.html">
+
+<script>
+ (function() {
+
+ /**
+ * Enum of attributes to be passed through to the login API call.
+ * @readonly
+ * @enum {string}
+ */
+ var ProxyLoginAttributes = {
+ 'appPackageName': 'apppackagename',
+ 'clientId': 'clientid',
+ 'cookiePolicy': 'cookiepolicy',
+ 'hostedDomain': 'hostedDomain',
+ 'openidPrompt': 'prompt',
+ 'requestVisibleActions': 'requestvisibleactions'
+ };
+
+ /**
+ * AuthEngine does all interactions with gapi.auth2
+ *
+ * It is tightly coupled with <google-signin-aware> element
+ * The elements configure AuthEngine.
+ * AuthEngine propagates all authentication events to all google-signin-aware elements
+ *
+ * API used: https://developers.google.com/identity/sign-in/web/reference
+ *
+ */
+ var AuthEngine = {
+
+ /**
+ * oauth2 argument, set by google-signin-aware
+ */
+ _clientId: null,
+
+ get clientId() {
+ return this._clientId;
+ },
+
+ set clientId(val) {
+ if (this._clientId && val && val != this._clientId) {
+ throw new Error('clientId cannot change. Values do not match. New: ' + val + ' Old:' + this._clientId);
+ }
+ if (val && val != this._clientId) {
+ this._clientId = val;
+ this.initAuth2();
+ }
+ },
+
+ /**
+ * oauth2 argument, set by google-signin-aware
+ */
+ _cookiePolicy: 'single_host_origin',
+
+ get cookiePolicy() {
+ return this._cookiePolicy;
+ },
+
+ set cookiePolicy(val) {
+ if (val) {
+ this._cookiePolicy = val;
+ }
+ },
+
+ /**
+ * oauth2 argument, set by google-signin-aware
+ */
+ _appPackageName: '',
+
+ get appPackageName() {
+ return this._appPackageName;
+ },
+
+ set appPackageName(val) {
+ if (this._appPackageName && val && val != this._appPackageName) {
+ throw new Error('appPackageName cannot change. Values do not match. New: ' + val + ' Old: ' + this._appPackageName);
+ }
+ if (val) {
+ this._appPackageName = val;
+ }
+ },
+
+ /**
+ * oauth2 argument, set by google-signin-aware
+ */
+ _requestVisibleActions: '',
+
+ get requestVisibleactions() {
+ return this._requestVisibleActions;
+ },
+
+ set requestVisibleactions(val) {
+ if (this._requestVisibleActions && val && val != this._requestVisibleActions) {
+ throw new Error('requestVisibleactions cannot change. Values do not match. New: ' + val + ' Old: ' + this._requestVisibleActions);
+ }
+ if (val)
+ this._requestVisibleActions = val;
+ },
+
+ /**
+ * oauth2 argument, set by google-signin-aware
+ */
+ _hostedDomain: '',
+
+ get hostedDomain() {
+ return this._hostedDomain;
+ },
+
+ set hostedDomain(val) {
+ if (this._hostedDomain && val && val != this._hostedDomain) {
+ throw new Error('hostedDomain cannot change. Values do not match. New: ' + val + ' Old: ' + this._hostedDomain);
+ }
+ if (val)
+ this._hostedDomain = val;
+ },
+
+ /**
+ * oauth2 argument, set by google-signin-aware
+ */
+ _openidPrompt: '',
+
+ get openidPrompt() {
+ return this._openidPrompt;
+ },
+
+ set openidPrompt(val) {
+ if (typeof val !== 'string') {
+ throw new Error(
+ 'openidPrompt must be a string. Received ' + typeof val);
+ }
+ if (val) {
+ var values = val.split(' ');
+ values = values.map(function(v) {
+ return v.trim();
+ });
+ values = values.filter(function(v) {
+ return v;
+ });
+ var validValues = {none: 0, login: 0, consent: 0, select_account: 0};
+ values.forEach(function(v) {
+ if (v == 'none' && values.length > 1) {
+ throw new Error(
+ 'none cannot be combined with other openidPrompt values');
+ }
+ if (!(v in validValues)) {
+ throw new Error(
+ 'invalid openidPrompt value ' + v +
+ '. Valid values: ' + Object.keys(validValues).join(', '));
+ }
+ });
+ }
+ this._openidPrompt = val;
+ },
+
+ /** Is offline access currently enabled in the google-signin-aware element? */
+ _offline: false,
+
+ get offline() {
+ return this._offline;
+ },
+
+ set offline(val) {
+ this._offline = val;
+ this.updateAdditionalAuth();
+ },
+
+ /** Should we force a re-prompt for offline access? */
+ _offlineAlwaysPrompt: false,
+
+ get offlineAlwaysPrompt() {
+ return this._offlineAlwaysPrompt;
+ },
+
+ set offlineAlwaysPrompt(val) {
+ this._offlineAlwaysPrompt = val;
+ this.updateAdditionalAuth();
+ },
+
+ /** Have we already gotten offline access from Google during this session? */
+ offlineGranted: false,
+
+ /** <google-js-api> */
+ _apiLoader: null,
+
+ /** an array of wanted scopes. oauth2 argument */
+ _requestedScopeArray: [],
+
+ /** _requestedScopeArray as string */
+ get requestedScopes() {
+ return this._requestedScopeArray.join(' ');
+ },
+
+ /** Is auth library initalized? */
+ _initialized: false,
+
+ /** Is user signed in? */
+ _signedIn: false,
+
+ /** Currently granted scopes */
+ _grantedScopeArray: [],
+
+ /** True if additional authorization is required */
+ _needAdditionalAuth: true,
+
+ /** True if have google+ scopes */
+ _hasPlusScopes: false,
+
+ /**
+ * array of <google-signin-aware>
+ * state changes are broadcast to them
+ */
+ signinAwares: [],
+
+ init: function() {
+ this._apiLoader = document.createElement('google-js-api');
+ this._apiLoader.addEventListener('js-api-load', this.loadAuth2.bind(this));
+ if (Polymer.Element) {
+ document.body.appendChild(this._apiLoader);
+ }
+ },
+
+ loadAuth2: function() {
+ gapi.load('auth2', this.initAuth2.bind(this));
+ },
+
+ initAuth2: function() {
+ if (!('gapi' in window) || !('auth2' in window.gapi) || !this.clientId) {
+ return;
+ }
+ var auth = gapi.auth2.init({
+ 'client_id': this.clientId,
+ 'cookie_policy': this.cookiePolicy,
+ 'scope': this.requestedScopes,
+ 'hosted_domain': this.hostedDomain
+ });
+
+ auth['currentUser'].listen(this.handleUserUpdate.bind(this));
+
+ auth.then(
+ function onFulfilled() {
+ // Let the current user listener trigger the changes.
+ },
+ function onRejected(error) {
+ console.error(error);
+ }
+ );
+ },
+
+ handleUserUpdate: function(newPrimaryUser) {
+ // update and broadcast currentUser
+ var isSignedIn = newPrimaryUser.isSignedIn();
+ if (isSignedIn != this._signedIn) {
+ this._signedIn = isSignedIn;
+ for (var i=0; i<this.signinAwares.length; i++) {
+ this.signinAwares[i]._setSignedIn(isSignedIn);
+ }
+ }
+ // update and broadcast initialized property the first time the isSignedIn property is set.
+ if(!this._initialized) {
+ for (var i=0; i<this.signinAwares.length; i++) {
+ this.signinAwares[i]._setInitialized(true);
+ }
+ this._initialized = true;
+ }
+
+
+ // update granted scopes
+ this._grantedScopeArray = this.strToScopeArray(
+ newPrimaryUser.getGrantedScopes());
+ // console.log(this._grantedScopeArray);
+ this.updateAdditionalAuth();
+
+ var response = newPrimaryUser.getAuthResponse();
+ for (var i=0; i<this.signinAwares.length; i++) {
+ this.signinAwares[i]._updateScopeStatus(response);
+ }
+ },
+
+ setOfflineCode: function(code) {
+ for (var i=0; i<this.signinAwares.length; i++) {
+ this.signinAwares[i]._updateOfflineCode(code);
+ }
+ },
+
+ /** convert scope string to scope array */
+ strToScopeArray: function(str) {
+ if (!str) {
+ return [];
+ }
+ // remove extra spaces, then split
+ var scopes = str.replace(/\ +/g, ' ').trim().split(' ');
+ for (var i=0; i<scopes.length; i++) {
+ scopes[i] = scopes[i].toLowerCase();
+ // Handle scopes that will be deprecated but are still returned with their old value
+ if (scopes[i] === 'https://www.googleapis.com/auth/userinfo.profile') {
+ scopes[i] = 'profile';
+ }
+ if (scopes[i] === 'https://www.googleapis.com/auth/userinfo.email') {
+ scopes[i] = 'email';
+ }
+ }
+ // return with duplicates filtered out
+ return scopes.filter( function(value, index, self) {
+ return self.indexOf(value) === index;
+ });
+ },
+
+ /** true if scopes have google+ scopes */
+ isPlusScope: function(scope) {
+ return (scope.indexOf('/auth/games') > -1)
+ || (scope.indexOf('auth/plus.') > -1 && scope.indexOf('auth/plus.me') < 0);
+ },
+
+ /** true if scopes have been granted */
+ hasGrantedScopes: function(scopeStr) {
+ var scopes = this.strToScopeArray(scopeStr);
+ for (var i=0; i< scopes.length; i++) {
+ if (this._grantedScopeArray.indexOf(scopes[i]) === -1)
+ return false;
+ }
+ return true;
+ },
+
+ /** request additional scopes */
+ requestScopes: function(newScopeStr) {
+ var newScopes = this.strToScopeArray(newScopeStr);
+ var scopesUpdated = false;
+ for (var i=0; i<newScopes.length; i++) {
+ if (this._requestedScopeArray.indexOf(newScopes[i]) === -1) {
+ this._requestedScopeArray.push(newScopes[i]);
+ scopesUpdated = true;
+ }
+ }
+ if (scopesUpdated) {
+ this.updateAdditionalAuth();
+ this.updatePlusScopes();
+ }
+ },
+
+ /** update status of _needAdditionalAuth */
+ updateAdditionalAuth: function() {
+ var needMoreAuth = false;
+ if ((this.offlineAlwaysPrompt || this.offline ) && !this.offlineGranted) {
+ needMoreAuth = true;
+ } else {
+ for (var i=0; i<this._requestedScopeArray.length; i++) {
+ if (this._grantedScopeArray.indexOf(this._requestedScopeArray[i]) === -1) {
+ needMoreAuth = true;
+ break;
+ }
+ }
+ }
+ if (this._needAdditionalAuth != needMoreAuth) {
+ this._needAdditionalAuth = needMoreAuth;
+ // broadcast new value
+ for (var i=0; i<this.signinAwares.length; i++) {
+ this.signinAwares[i]._setNeedAdditionalAuth(needMoreAuth);
+ }
+ }
+ },
+
+ updatePlusScopes: function() {
+ var hasPlusScopes = false;
+ for (var i = 0; i < this._requestedScopeArray.length; i++) {
+ if (this.isPlusScope(this._requestedScopeArray[i])) {
+ hasPlusScopes = true;
+ break;
+ }
+ }
+ if (this._hasPlusScopes != hasPlusScopes) {
+ this._hasPlusScopes = hasPlusScopes;
+ for (var i=0; i<this.signinAwares.length; i++) {
+ this.signinAwares[i]._setHasPlusScopes(hasPlusScopes);
+ }
+ }
+ },
+ /**
+ * attached <google-signin-aware>
+ * @param {!GoogleSigninAwareElement} aware element to add
+ */
+ attachSigninAware: function(aware) {
+ if (this.signinAwares.indexOf(aware) == -1) {
+ this.signinAwares.push(aware);
+ // Initialize aware properties
+ aware._setNeedAdditionalAuth(this._needAdditionalAuth);
+ aware._setInitialized(this._initialized);
+ aware._setSignedIn(this._signedIn);
+ aware._setHasPlusScopes(this._hasPlusScopes);
+ } else {
+ console.warn('signinAware attached more than once', aware);
+ }
+ },
+
+ detachSigninAware: function(aware) {
+ var index = this.signinAwares.indexOf(aware);
+ if (index != -1) {
+ this.signinAwares.splice(index, 1);
+ } else {
+ console.warn('Trying to detach unattached signin-aware');
+ }
+ },
+
+ /** returns scopes not granted */
+ getMissingScopes: function() {
+ return this._requestedScopeArray.filter( function(scope) {
+ return this._grantedScopeArray.indexOf(scope) === -1;
+ }.bind(this)).join(' ');
+ },
+
+ assertAuthInitialized: function() {
+ if (!this.clientId) {
+ throw new Error("AuthEngine not initialized. clientId has not been configured.");
+ }
+ if (!('gapi' in window)) {
+ throw new Error("AuthEngine not initialized. gapi has not loaded.");
+ }
+ if (!('auth2' in window.gapi)) {
+ throw new Error("AuthEngine not initialized. auth2 not loaded.");
+ }
+ },
+
+ /** pops up sign-in dialog */
+ signIn: function() {
+ this.assertAuthInitialized();
+ var params = {
+ 'scope': this.getMissingScopes()
+ };
+
+ // Proxy specific attributes through to the signIn options.
+ Object.keys(ProxyLoginAttributes).forEach(function(key) {
+ if (this[key] && this[key] !== '') {
+ params[ProxyLoginAttributes[key]] = this[key];
+ }
+ }, this);
+
+ var promise;
+ var user = gapi.auth2.getAuthInstance()['currentUser'].get();
+ if (!(this.offline || this.offlineAlwaysPrompt)) {
+ if (user.getGrantedScopes()) {
+ // additional auth, skip multiple account dialog
+ promise = user.grant(params);
+ } else {
+ // initial signin
+ promise = gapi.auth2.getAuthInstance().signIn(params);
+ }
+ } else {
+ params.redirect_uri = 'postmessage';
+ if (this.offlineAlwaysPrompt) {
+ params.approval_prompt = 'force';
+ }
+
+ // Despite being documented at https://goo.gl/tiO0Bk
+ // It doesn't seem like user.grantOfflineAccess() actually exists in
+ // the current version of the Google Sign-In JS client we're using
+ // through GoogleWebComponents. So in the offline case, we will not
+ // distinguish between a first auth and an additional one.
+ promise = gapi.auth2.getAuthInstance().grantOfflineAccess(params);
+ }
+ promise.then(
+ function onFulfilled(response) {
+ // If login was offline, response contains one string "code"
+ // Otherwise it contains the user object already
+ var newUser;
+ if (response.code) {
+ AuthEngine.offlineGranted = true;
+ newUser = gapi.auth2.getAuthInstance()['currentUser'].get();
+ AuthEngine.setOfflineCode(response.code);
+ } else {
+ newUser = response;
+ }
+
+ var authResponse = newUser.getAuthResponse();
+ // Let the current user listener trigger the changes.
+ },
+ function onRejected(error) {
+ // Access denied is not an error, user hit cancel
+ if ("Access denied." !== error.reason) {
+ this.signinAwares.forEach(function(awareInstance) {
+ awareInstance.errorNotify(error);
+ });
+ }
+ }.bind(this)
+ );
+ },
+
+ /** signs user out */
+ signOut: function() {
+ this.assertAuthInitialized();
+ gapi.auth2.getAuthInstance().signOut().then(
+ function onFulfilled() {
+ // Let the current user listener trigger the changes.
+ },
+ function onRejected(error) {
+ console.error(error);
+ }
+ );
+ }
+ };
+
+ AuthEngine.init();
+
+/**
+`google-signin-aware` is used to enable authentication in custom elements by
+interacting with a google-signin element that needs to be present somewhere
+on the page.
+
+The `scopes` attribute allows you to specify which scope permissions are required
+(e.g do you want to allow interaction with the Google Drive API).
+
+The `google-signin-aware-success` event is triggered when a user successfully
+authenticates. If either `offline` or `offlineAlwaysPrompt` is set to true, successful
+authentication will also trigger the `google-signin-offline-success`event.
+The `google-signin-aware-signed-out` event is triggered when a user explicitly
+signs out via the google-signin element.
+
+You can bind to `isAuthorized` property to monitor authorization state.
+##### Example
+
+ <google-signin-aware scopes="https://www.googleapis.com/auth/drive"></google-signin-aware>
+
+
+##### Example with offline
+ <template id="awareness" is="dom-bind">
+ <google-signin-aware
+ scopes="https://www.googleapis.com/auth/drive"
+ offline
+ on-google-signin-aware-success="handleSignin"
+ on-google-signin-offline-success="handleOffline"></google-signin-aware>
+ <\/template>
+ <script>
+ var aware = document.querySelector('#awareness');
+ aware.handleSignin = function(response) {
+ var user = gapi.auth2.getAuthInstance()['currentUser'].get();
+ console.log('User name: ' + user.getBasicProfile().getName());
+ };
+ aware.handleOffline = function(response) {
+ console.log('Offline code received: ' + response.detail.code);
+ // Here you would POST response.detail.code to your webserver, which can
+ // exchange the authorization code for an access token. More info at:
+ // https://developers.google.com/identity/protocols/OAuth2WebServer
+ };
+ <\/script>
+*/
+ Polymer({
+
+ is: 'google-signin-aware',
+
+ /**
+ * Fired when this scope has been authorized
+ * @param {Object} result Authorization result.
+ * @event google-signin-aware-success
+ */
+
+ /**
+ * Fired when an offline authorization is successful.
+ * @param {{code: string}} detail -
+ * code: The one-time authorization code from Google.
+ * Your application can exchange this for an `access_token` and `refresh_token`
+ * @event google-signin-offline-success
+ */
+
+ /**
+ * Fired when this scope is not authorized
+ * @event google-signin-aware-signed-out
+ */
+
+ /**
+ * Fired when there is an error during the signin flow.
+ * @param {Object} detail The error object returned from the OAuth 2 flow.
+ * @event google-signin-aware-error
+ */
+
+ /**
+ * This block is needed so the previous @param is not assigned to the next property.
+ */
+
+ properties: {
+ /**
+ * App package name for android over-the-air installs.
+ * See the relevant [docs](https://developers.google.com/+/web/signin/android-app-installs)
+ */
+ appPackageName: {
+ type: String,
+ observer: '_appPackageNameChanged'
+ },
+
+ /**
+ * a Google Developers clientId reference
+ */
+ clientId: {
+ type: String,
+ observer: '_clientIdChanged'
+ },
+
+ /**
+ * The cookie policy defines what URIs have access to the session cookie
+ * remembering the user's sign-in state.
+ * See the relevant [docs](https://developers.google.com/+/web/signin/reference#determining_a_value_for_cookie_policy) for more information.
+ * @default 'single_host_origin'
+ */
+ cookiePolicy: {
+ type: String,
+ observer: '_cookiePolicyChanged'
+ },
+
+ /**
+ * The app activity types you want to write on behalf of the user
+ * (e.g http://schemas.google.com/AddActivity)
+ *
+ */
+ requestVisibleActions: {
+ type: String,
+ observer: '_requestVisibleActionsChanged'
+ },
+
+ /**
+ * The Google Apps domain to which users must belong to sign in.
+ * See the relevant [docs](https://developers.google.com/identity/sign-in/web/reference) for more information.
+ */
+ hostedDomain: {
+ type: String,
+ observer: '_hostedDomainChanged'
+ },
+
+ /**
+ * Allows for offline `access_token` retrieval during the signin process.
+ * See also `offlineAlwaysPrompt`. You only need to set one of the two; if both
+ * are set, the behavior of `offlineAlwaysPrompt` will override `offline`.
+ */
+ offline: {
+ type: Boolean,
+ value: false,
+ observer: '_offlineChanged'
+ },
+
+ /**
+ * Works the same as `offline` with the addition that it will always
+ * force a re-prompt to the user, guaranteeing that you will get a
+ * refresh_token even if the user has already granted offline access to
+ * this application. You only need to set one of `offline` or
+ * `offlineAlwaysPrompt`, not both.
+ */
+ offlineAlwaysPrompt: {
+ type: Boolean,
+ value: false,
+ observer: '_offlineAlwaysPromptChanged'
+ },
+
+ /**
+ * The scopes to provide access to (e.g https://www.googleapis.com/auth/drive)
+ * and should be space-delimited.
+ */
+ scopes: {
+ type: String,
+ value: 'profile',
+ observer: '_scopesChanged'
+ },
+
+ /**
+ * Space-delimited, case-sensitive list of strings that
+ * specifies whether the the user is prompted for reauthentication
+ * and/or consent. The defined values are:
+ * none: do not display authentication or consent pages.
+ * This value is mutually exclusive with the rest.
+ * login: always prompt the user for reauthentication.
+ * consent: always show consent screen.
+ * select_account: always show account selection page.
+ * This enables a user who has multiple accounts to select amongst
+ * the multiple accounts that they might have current sessions for.
+ * For more information, see "prompt" parameter description in
+ * https://openid.net/specs/openid-connect-basic-1_0.html#RequestParameters
+ */
+ openidPrompt: {
+ type: String,
+ value: '',
+ observer: '_openidPromptChanged'
+ },
+
+ /**
+ * True when the auth library has been initialized, and signedIn property value is set from the first api response.
+ */
+ initialized: {
+ type: Boolean,
+ notify: true,
+ readOnly: true
+ },
+
+ /**
+ * True if user is signed in
+ */
+ signedIn: {
+ type: Boolean,
+ notify: true,
+ readOnly: true
+ },
+
+ /**
+ * True if authorizations for *this* element have been granted
+ */
+ isAuthorized: {
+ type: Boolean,
+ notify: true,
+ readOnly: true,
+ value: false
+ },
+
+ /**
+ * True if additional authorizations for *any* element are required
+ */
+ needAdditionalAuth: {
+ type: Boolean,
+ notify: true,
+ readOnly: true
+ },
+
+ /**
+ * True if *any* element has google+ scopes
+ */
+ hasPlusScopes: {
+ type: Boolean,
+ value: false,
+ notify: true,
+ readOnly: true
+ }
+ },
+
+ attached: function() {
+ AuthEngine.attachSigninAware(this);
+ },
+
+ detached: function() {
+ AuthEngine.detachSigninAware(this);
+ },
+
+ /** pops up the authorization dialog */
+ signIn: function() {
+ AuthEngine.signIn();
+ },
+
+ /** signs user out */
+ signOut: function() {
+ AuthEngine.signOut();
+ },
+
+ errorNotify: function(error) {
+ this.fire('google-signin-aware-error', error);
+ },
+
+ _appPackageNameChanged: function(newName, oldName) {
+ AuthEngine.appPackageName = newName;
+ },
+
+ _clientIdChanged: function(newId, oldId) {
+ AuthEngine.clientId = newId;
+ },
+
+ _cookiePolicyChanged: function(newPolicy, oldPolicy) {
+ AuthEngine.cookiePolicy = newPolicy;
+ },
+
+ _requestVisibleActionsChanged: function(newVal, oldVal) {
+ AuthEngine.requestVisibleActions = newVal;
+ },
+
+ _hostedDomainChanged: function(newVal, oldVal) {
+ AuthEngine.hostedDomain = newVal;
+ },
+
+ _offlineChanged: function(newVal, oldVal) {
+ AuthEngine.offline = newVal;
+ },
+
+ _offlineAlwaysPromptChanged: function(newVal, oldVal) {
+ AuthEngine.offlineAlwaysPrompt = newVal;
+ },
+
+ _scopesChanged: function(newVal, oldVal) {
+ AuthEngine.requestScopes(newVal);
+ this._updateScopeStatus(undefined);
+ },
+
+ _openidPromptChanged: function(newVal, oldVal) {
+ AuthEngine.openidPrompt = newVal;
+ },
+
+ _updateScopeStatus: function(user) {
+ var newAuthorized = this.signedIn && AuthEngine.hasGrantedScopes(this.scopes);
+ if (newAuthorized !== this.isAuthorized) {
+ this._setIsAuthorized(newAuthorized);
+ if (newAuthorized) {
+ this.fire('google-signin-aware-success', user);
+ }
+ else {
+ this.fire('google-signin-aware-signed-out', user);
+ }
+ }
+ },
+
+ _updateOfflineCode: function(code) {
+ if (code) {
+ this.fire('google-signin-offline-success', {code: code});
+ }
+ }
+ });
+ })();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/google-signin-styles.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/google-signin-styles.html
new file mode 100644
index 00000000000..5a111199335
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/google-signin-styles.html
@@ -0,0 +1,267 @@
+<!--
+Copyright 2014 Google Inc
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<dom-module id="google-signin-styles">
+ <template>
+ <style>
+ :host {
+ display: inline-block;
+ position: relative;
+ box-sizing: border-box;
+ margin: 0 0.29em;
+ background: transparent;
+ text-align: center;
+ font: inherit;
+ outline: none;
+ border-radius: 3px;
+ -webkit-user-select: none;
+ user-select: none;
+ cursor: pointer;
+ z-index: 0;
+ }
+
+ :host([disabled]) {
+ cursor: auto;
+ pointer-events: none;
+ }
+
+ :host([disabled]) #button {
+ background: #eaeaea;
+ color: #a8a8a8;
+ }
+
+ #button {
+ position: relative;
+ outline: none;
+ font-size: 14px;
+ font-weight: 400;
+ font-family: 'RobotoDraft','Roboto',arial,sans-serif;
+ white-space: nowrap;
+ border-radius: inherit;
+ }
+
+ iron-icon {
+ width: 22px;
+ height: 22px;
+ margin: 6px;
+ }
+
+ .icon {
+ display: inline-block;
+ vertical-align: middle;
+ }
+
+ #shadow {
+ border-radius: inherit;
+ }
+
+ #ripple {
+ pointer-events: none;
+ }
+
+ .button-content {
+ outline: none;
+ }
+
+ .buttonText {
+ display: inline-block;
+ vertical-align: middle;
+ padding-right: .8em;
+ }
+
+ /*
+ * Dark Theme
+ */
+ .theme-dark {
+ background: #da4336;
+ color: #ffffff;
+ border: 1px solid transparent;
+ }
+
+ .theme-dark.signedIn-true.additionalAuth-false {
+ background: #999;
+ border: 1px solid #888;
+ }
+
+ .theme-dark.signedIn-true.additionalAuth-false:hover,
+ .theme-dark.signedIn-true.additionalAuth-false:focus {
+ background: #aaa;
+ }
+
+ :host([noink]) .theme-dark:hover,
+ :host([noink]) .theme-dark:focus {
+ background: #e74b37;
+ }
+
+ :host([noink]) .theme-dark.signedIn-true.additionalAuth-false:hover,
+ :host([noink]) .theme-dark.signedIn-true.additionalAuth-false:focus {
+ background: #aaa;
+ }
+
+ /*
+ * Light Theme
+ */
+ .theme-light {
+ background: #fff;
+ color: #737373;
+ border: 1px solid #d9d9d9;
+ }
+
+ .theme-light.signedIn-true.additionalAuth-false {
+ background: #c0c0c0;
+ color: #fff;
+ border: #888 1px solid;
+ }
+
+ .theme-light.signedIn-true.additionalAuth-false:hover,
+ .theme-light.signedIn-true.additionalAuth-false:focus {
+ background: #aaa;
+ }
+
+ :host([noink]) .theme-light .button-content:hover,
+ :host([noink]) .theme-light:focus {
+ border: 1px solid #c0c0c0;
+ }
+
+ :host([noink]) .theme-light.signedIn-true.additionalAuth-false:hover,
+ :host([noink]) .theme-light.signedIn-true.additionalAuth-false:focus {
+ background: #aaa;
+ }
+
+ /*
+ * Icon Only Width
+ */
+ .width-iconOnly .buttonText {
+ display: none;
+ }
+
+ /*
+ * Tall Height
+ */
+ .height-tall .buttonText {
+ font-size: 15px;
+ font-weight: 700;
+ }
+
+ .height-tall iron-icon {
+ width: 30px;
+ height: 30px;
+ margin: 8px;
+ }
+
+ /*
+ * Short Height
+ */
+ .height-short .buttonText {
+ font-size: 11px;
+ }
+
+ .height-short iron-icon {
+ width: 16px;
+ height: 16px;
+ margin: 3px;
+ }
+
+
+ /*
+ * Branding
+ */
+
+ /* Google Scopes */
+
+ /* Dark Theme */
+ .brand-google.theme-dark {
+ background: #4184F3;
+ color: #fff;
+ border: 1px solid #3266d5;
+ }
+
+ .brand-google.theme-dark .icon {
+ background: #fff;
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px;
+ }
+
+ .brand-google.theme-dark.width-iconOnly .icon {
+ border-radius: 2px;
+ }
+
+ .brand-google.theme-dark .buttonText {
+ padding-left: .8em;
+ }
+
+ .brand-google.theme-dark #ripple {
+ color: #1b39a8;
+ }
+
+ :host([noink]) .brand-google.theme-dark:hover,
+ :host([noink]) .brand-google.theme-dark:focus {
+ background: #e74b37;
+ }
+
+ .brand-google.theme-light .icon {
+ color: #4184F3;
+ }
+
+ .brand-google.theme-light.signedIn-true.additionalAuth-false .icon {
+ color: #fff;
+ }
+
+ .brand-google.theme-light #ripple {
+ color: #444;
+ }
+
+ :host([noink]) .brand-google.theme-light:hover,
+ :host([noink]) .brand-google.theme-light:focus {
+ border: 1px solid #c0c0c0;
+ }
+
+ .brand-google-plus.theme-dark {
+ background: #da4336;
+ color: #fff;
+ border: 1px solid transparent;
+ }
+
+ .brand-google-plus.theme-dark #ripple {
+ color: #c43828;
+ }
+
+ /* Light Theme */
+ .brand-google-plus.theme-light {
+ background: #fff;
+ color: #737373;
+ border: 1px solid #d9d9d9;
+ }
+
+ .brand-google-plus.theme-light .icon {
+ color: #e74b37;
+ }
+
+ .brand-google-plus.theme-light.signedIn-true.additionalAuth-false .icon {
+ color: #fff;
+ }
+
+ .brand-google-plus.theme-light #ripple {
+ color: #400;
+ }
+
+ :host([noink]) .brand-google-plus.theme-light:hover,
+ :host([noink]) .brand-google-plus.theme-light:focus {
+ border: 1px solid #c0c0c0;
+ }
+ </style>
+ </template>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/google-signin.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/google-signin.html
new file mode 100644
index 00000000000..dfafc8cecc5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/google-signin.html
@@ -0,0 +1,596 @@
+<!--
+Copyright 2014 Google Inc
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="google-signin-aware.html">
+<link rel="import" href="../iron-icon/iron-icon.html">
+<link rel="import" href="../font-roboto/roboto.html">
+<link rel="import" href="../google-apis/google-js-api.html">
+<link rel="import" href="../paper-ripple/paper-ripple.html">
+<link rel="import" href="../paper-material/paper-material.html">
+<link rel="import" href="../iron-flex-layout/iron-flex-layout-classes.html">
+<link rel="import" href="google-icons.html">
+<link rel="import" href="google-signin-styles.html">
+
+<dom-module id="google-signin">
+ <template>
+ <style include="google-signin-styles iron-positioning"></style>
+
+ <google-signin-aware id="aware"
+ app-package-name="{{appPackageName}}"
+ client-id="{{clientId}}"
+ cookie-policy="{{cookiePolicy}}"
+ request-visible-actions="{{requestVisibleActions}}"
+ hosted-domain="{{hostedDomain}}"
+ offline="{{offline}}"
+ offline-always-prompt="{{offlineAlwaysPrompt}}"
+ scopes="{{scopes}}"
+ openid-prompt="{{openidPrompt}}"
+ initialized="{{initialized}}"
+ signed-in="{{signedIn}}"
+ is-authorized="{{isAuthorized}}"
+ need-additional-auth="{{needAdditionalAuth}}"
+ has-plus-scopes="{{hasPlusScopes}}"></google-signin-aware>
+ <template is="dom-if" if="{{raised}}">
+ <paper-material id="shadow" class="fit" elevation="2" animated></paper-material>
+ </template>
+ <div id="button"
+ class$="[[_computeButtonClass(height, width, theme, signedIn, _brand, needAdditionalAuth)]]">
+
+ <paper-ripple id="ripple" class="fit"></paper-ripple>
+ <!-- this div is needed to position the ripple behind text content -->
+ <div>
+ <template is="dom-if" if="{{_computeButtonIsSignIn(signedIn, needAdditionalAuth)}}">
+ <div class="button-content signIn" tabindex="0"
+ on-click="signIn" on-keydown="_signInKeyPress">
+ <span class="icon"><iron-icon icon="[[_brandIcon]]"></iron-icon></span>
+ <span class="buttonText">{{_labelSignin}}</span>
+ </div>
+ </template>
+ <template is="dom-if" if="{{_computeButtonIsSignOut(signedIn, needAdditionalAuth) }}">
+ <div class="button-content signOut" tabindex="0"
+ on-click="signOut" on-keydown="_signOutKeyPress">
+ <span class="icon"><iron-icon icon="[[_brandIcon]]"></iron-icon></span>
+ <span class="buttonText">{{labelSignout}}</span>
+ </div>
+ </template>
+ <template is="dom-if" if="{{_computeButtonIsSignOutAddl(signedIn, needAdditionalAuth) }}">
+ <div class="button-content signIn" tabindex="0"
+ on-click="signIn" on-keydown="_signInKeyPress">
+ <span class="icon"><iron-icon icon="[[_brandIcon]]"></iron-icon></span>
+ <span class="buttonText">{{labelAdditional}}</span>
+ </div>
+ </template>
+ </div>
+
+ </div>
+ </template>
+</dom-module>
+<script>
+ (function() {
+
+ /**
+ * Enum brand values.
+ * @readonly
+ * @enum {string}
+ */
+ var BrandValue = {
+ GOOGLE: 'google',
+ PLUS: 'google-plus'
+ };
+
+ /**
+ * Enum height values.
+ * @readonly
+ * @enum {string}
+ */
+ var HeightValue = {
+ SHORT: 'short',
+ STANDARD: 'standard',
+ TALL: 'tall'
+ };
+
+ /**
+ * Enum button label default values.
+ * @readonly
+ * @enum {string}
+ */
+ var LabelValue = {
+ STANDARD: 'Sign in',
+ WIDE: 'Sign in with Google',
+ WIDE_PLUS: 'Sign in with Google+'
+ };
+
+ /**
+ * Enum theme values.
+ * @readonly
+ * @enum {string}
+ */
+ var ThemeValue = {
+ LIGHT: 'light',
+ DARK: 'dark'
+ };
+
+ /**
+ * Enum width values.
+ * @readonly
+ * @enum {string}
+ */
+ var WidthValue = {
+ ICON_ONLY: 'iconOnly',
+ STANDARD: 'standard',
+ WIDE: 'wide'
+ };
+
+/**
+&lt;google-signin&gt; is used to authenticate with Google, allowing you to interact
+with other Google APIs such as Drive and Google+.
+
+<img style="max-width:100%;" src="https://cloud.githubusercontent.com/assets/107076/6791176/5c868822-d16a-11e4-918c-ec9b84a2db45.png"/>
+
+If you do not need to show the button, use companion `<google-signin-aware>` element to declare scopes, check authentication state.
+
+#### Examples
+
+ <google-signin client-id="..." scopes="https://www.googleapis.com/auth/drive"></google-signin>
+
+ <google-signin label-signin="Sign-in" client-id="..." scopes="https://www.googleapis.com/auth/drive"></google-signin>
+
+ <google-signin theme="dark" width="iconOnly" client-id="..." scopes="https://www.googleapis.com/auth/drive"></google-signin>
+
+
+#### Notes
+
+The attribute `clientId` is provided in your Google Developers Console
+(https://console.developers.google.com).
+
+The `scopes` attribute allows you to specify which scope permissions are required
+(e.g do you want to allow interaction with the Google Drive API). Many APIs also
+need to be enabled in the Google Developers Console before you can use them.
+
+The `requestVisibleActions` attribute is necessary if you want to write app
+activities (https://developers.google.com/+/web/app-activities/) on behalf of
+the user. Please note that this attribute is only valid in combination with the
+plus.login scope (https://www.googleapis.com/auth/plus.login).
+
+The `offline` attribute allows you to get an auth code which your server can
+redeem for an offline access token
+(https://developers.google.com/identity/sign-in/web/server-side-flow).
+You can also set `offline-always-prompt` instead of `offline` to ensure that your app
+will re-prompt the user for offline access and generate a working `refresh_token`
+even if they have already granted offline access to your app in the past.
+
+Use label properties to customize prompts.
+
+The button can be styled in using the `height`, `width`, and `theme` attributes.
+These attributes help you follow the Google+ Sign-In button branding guidelines
+(https://developers.google.com/+/branding-guidelines).
+
+The `google-signin-success` event is triggered when a user successfully authenticates
+and `google-signed-out` is triggered when user signs out.
+You can also use `isAuthorized` attribute to observe user's authentication state.
+
+Additional events, such as `google-signout-attempted` are
+triggered when the user attempts to sign-out and successfully signs out.
+
+When requesting offline access, the `google-signin-offline-success` event is
+triggered when the user successfully consents with offline support.
+
+The `google-signin-necessary` event is fired when scopes requested via
+google-signin-aware elements require additional user permissions.
+
+#### Testing
+
+By default, the demo accompanying this element is setup to work on localhost with
+port 8080. That said, you *should* update the `clientId` to your own one for
+any apps you're building. See the Google Developers Console
+(https://console.developers.google.com) for more info.
+
+@demo
+*/
+
+ Polymer({
+
+ is: 'google-signin',
+
+ /**
+ * Fired when user is signed in.
+ * You can use auth2 api to retrieve current user: `gapi.auth2.getAuthInstance()['currentUser'].get();`
+ * @event google-signin-success
+ */
+
+ /**
+ * Fired when the user is signed-out.
+ * @event google-signed-out
+ */
+
+ /**
+ * Fired if user requires additional authorization
+ * @event google-signin-necessary
+ */
+
+ /**
+ * Fired when signed in, and scope has been authorized
+ * @param {Object} result Authorization result.
+ * @event google-signin-aware-success
+ */
+
+ /**
+ * Fired when there is an error during the signin flow.
+ * @param {Object} detail The error object returned from the OAuth 2 flow.
+ * @event google-signin-aware-error
+ */
+
+ /**
+ * Fired when an offline authorization is successful.
+ * @param {{code: string}} detail -
+ * code: The one-time authorization code from Google.
+ * Your application can exchange this for an `access_token` and `refresh_token`
+ * @event google-signin-offline-success
+ */
+
+ /**
+ * This block is needed so the previous @param is not assigned to the next property.
+ */
+
+ properties: {
+ /**
+ * App package name for android over-the-air installs.
+ * See the relevant [docs](https://developers.google.com/+/web/signin/android-app-installs)
+ */
+ appPackageName: {
+ type: String,
+ value: ''
+ },
+
+ /**
+ * The brand being used for logo and styling.
+ *
+ * @default 'google'
+ */
+ brand: {
+ type: String,
+ value: ''
+ },
+
+ /** @private */
+ _brand: {
+ type: String,
+ computed: '_computeBrand(brand, hasPlusScopes)'
+ },
+
+ /**
+ * a Google Developers clientId reference
+ */
+ clientId: {
+ type: String,
+ value: ''
+ },
+
+ /**
+ * The cookie policy defines what URIs have access to the session cookie
+ * remembering the user's sign-in state.
+ * See the relevant [docs](https://developers.google.com/+/web/signin/reference#determining_a_value_for_cookie_policy) for more information.
+ *
+ * @default 'single_host_origin'
+ */
+ cookiePolicy: {
+ type: String,
+ value: ''
+ },
+
+ /**
+ * The height to use for the button.
+ *
+ * Available options: short, standard, tall.
+ *
+ * @type {string}
+ */
+ height: {
+ type: String,
+ value: 'standard'
+ },
+
+ /**
+ * By default the ripple expands to fill the button. Set this to true to
+ * constrain the ripple to a circle within the button.
+ */
+ fill: {
+ type: Boolean,
+ value: true
+ },
+
+ /**
+ * An optional label for the button for additional permissions.
+ */
+ labelAdditional: {
+ type: String,
+ value: 'Additional permissions required'
+ },
+
+ /**
+ * An optional label for the sign-in button.
+ */
+ labelSignin: {
+ type: String,
+ value: ''
+ },
+
+ _labelSignin: {
+ type: String,
+ computed: '_computeSigninLabel(labelSignin, width, _brand)'
+ },
+
+ /**
+ * An optional label for the sign-out button.
+ */
+ labelSignout: {
+ type: String,
+ value: 'Sign out'
+ },
+
+ /**
+ * If true, the button will be styled with a shadow.
+ */
+ raised: {
+ type: Boolean,
+ value: false
+ },
+
+ /**
+ * The app activity types you want to write on behalf of the user
+ * (e.g http://schemas.google.com/AddActivity)
+ */
+ requestVisibleActions: {
+ type: String,
+ value: ''
+ },
+
+ /**
+ * The Google Apps domain to which users must belong to sign in.
+ * See the relevant [docs](https://developers.google.com/identity/sign-in/web/reference) for more information.
+ */
+ hostedDomain: {
+ type: String,
+ value: ''
+ },
+
+ /**
+ * Allows for offline `access_token` retrieval during the signin process.
+ */
+ offline: {
+ type: Boolean,
+ value: false
+ },
+
+ /**
+ * Forces a re-prompt, even if the user has already granted offline
+ * access to your application in the past. You only need one of
+ * `offline` and `offlineAlwaysPrompt`.
+ */
+ offlineAlwaysPrompt: {
+ type: Boolean,
+ value: false
+ },
+
+ /**
+ * The scopes to provide access to (e.g https://www.googleapis.com/auth/drive)
+ * and should be space-delimited.
+ */
+ scopes: {
+ type: String,
+ value: ''
+ },
+
+ /**
+ * Space-delimited, case-sensitive list of strings that
+ * specifies whether the the user is prompted for reauthentication
+ * and/or consent. The defined values are:
+ * none: do not display authentication or consent pages.
+ * This value is mutually exclusive with the rest.
+ * login: always prompt the user for reauthentication.
+ * consent: always show consent screen.
+ * select_account: always show account selection page.
+ * This enables a user who has multiple accounts to select amongst
+ * the multiple accounts that they might have current sessions for.
+ * For more information, see "prompt" parameter description in
+ * https://openid.net/specs/openid-connect-basic-1_0.html#RequestParameters
+ */
+ openidPrompt: {
+ type: String,
+ value: ''
+ },
+
+ /**
+ * The theme to use for the button.
+ *
+ * Available options: light, dark.
+ *
+ * @attribute theme
+ * @type {string}
+ * @default 'dark'
+ */
+ theme: {
+ type: String,
+ value: 'light'
+ },
+
+ /**
+ * The width to use for the button.
+ *
+ * Available options: iconOnly, standard, wide.
+ *
+ * @type {string}
+ */
+ width: {
+ type: String,
+ value: 'standard'
+ },
+
+ _brandIcon: {
+ type: String,
+ computed: '_computeIcon(_brand)'
+ },
+
+ /**
+ * True if *any* element has google+ scopes
+ */
+ hasPlusScopes: {
+ type: Boolean,
+ notify: true,
+ value: false
+ },
+
+ /**
+ * True if additional authorization required globally
+ */
+ needAdditionalAuth: {
+ type: Boolean,
+ notify: true,
+ value: false
+ },
+
+ /**
+ * True when the auth library has been initialized, and signedIn property value is set from the first api response.
+ */
+ initialized: {
+ type: Boolean,
+ notify: true,
+ value: false
+ },
+
+ /**
+ * Is user signed in?
+ */
+ signedIn: {
+ type: Boolean,
+ notify: true,
+ value: false,
+ observer: '_observeSignedIn'
+ },
+
+ /**
+ * True if authorizations for *this* element have been granted
+ */
+ isAuthorized: {
+ type: Boolean,
+ notify: true,
+ value: false
+ }
+
+ },
+
+ _computeButtonClass: function(height, width, theme, signedIn, brand, needAdditionalAuth) {
+ return "height-" + height + " width-" + width + " theme-" + theme + " signedIn-" + signedIn + " brand-" + brand + " additionalAuth-" + needAdditionalAuth;
+ },
+
+ _computeIcon: function(brand) {
+ return "google:" + brand;
+ },
+
+ /* Button state computed */
+ _computeButtonIsSignIn: function(signedIn, additionalAuth) {
+ return !signedIn;
+ },
+
+ _computeButtonIsSignOut: function(signedIn, additionalAuth) {
+ return signedIn && !additionalAuth;
+ },
+
+ _computeButtonIsSignOutAddl: function(signedIn, additionalAuth) {
+ return signedIn && additionalAuth;
+ },
+
+ _computeBrand: function(attrBrand, hasPlusScopes) {
+ var newBrand;
+ if (attrBrand) {
+ newBrand = attrBrand;
+ } else if (hasPlusScopes) {
+ newBrand = BrandValue.PLUS;
+ } else {
+ newBrand = BrandValue.GOOGLE;
+ };
+ return newBrand;
+ },
+
+ _observeSignedIn: function(newVal, oldVal) {
+ if (newVal) {
+ if (this.needAdditionalAuth) {
+ this.fire('google-signin-necessary');
+ }
+ this.fire('google-signin-success');
+ }
+ // Use `oldVal` avoids to fire the event at the initialization of
+ // `signedIn`.
+ else if (oldVal) {
+ this.fire('google-signed-out');
+ }
+ },
+
+ /**
+ * Determines the proper label based on the attributes.
+ */
+ _computeSigninLabel: function(labelSignin, width, _brand) {
+ if (labelSignin) {
+ return labelSignin;
+ } else {
+ switch(width) {
+
+ case WidthValue.WIDE:
+ return (_brand == BrandValue.PLUS) ?
+ LabelValue.WIDE_PLUS : LabelValue.WIDE;
+
+ case WidthValue.STANDARD:
+ return LabelValue.STANDARD;
+
+ case WidthValue.ICON_ONLY:
+ return '';
+
+ default:
+ console.warn("bad width value: ", width);
+ return LabelValue.STANDARD;
+ }
+ }
+ },
+
+ /** Sign in user. Opens the authorization dialog for signing in.
+ * The dialog will be blocked by a popup blocker unless called inside click handler.
+ */
+ signIn: function () {
+ this.$.aware.signIn();
+ },
+
+ _signInKeyPress: function (e) {
+ if (e.which == 13 || e.keyCode == 13 || e.which == 32 || e.keyCode == 32) {
+ e.preventDefault();
+ this.signIn();
+ }
+ },
+
+ /** Sign out the user */
+ signOut: function () {
+ this.fire('google-signout-attempted');
+ this.$.aware.signOut();
+ },
+
+ _signOutKeyPress: function (e) {
+ if (e.which == 13 || e.keyCode == 13 || e.which == 32 || e.keyCode == 32) {
+ e.preventDefault();
+ this.signOut();
+ }
+ }
+ });
+ }());
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/index.html
new file mode 100644
index 00000000000..e8f85ae269b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/google-signin/index.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<!-- Copyright (c) 2014 Google Inc. All rights reserved. -->
+<html>
+<head>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/.bower.json
new file mode 100644
index 00000000000..cfc23be12aa
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/.bower.json
@@ -0,0 +1,65 @@
+{
+ "name": "iron-a11y-announcer",
+ "version": "2.1.0",
+ "description": "A singleton element that simplifies announcing text to screen readers.",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "a11y",
+ "live"
+ ],
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-a11y-announcer.git"
+ },
+ "main": "iron-a11y-announcer.html",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "paper-button": "PolymerElements/paper-button#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "ignore": [],
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "paper-button": "PolymerElements/paper-button#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "web-component-tester": "Polymer/web-component-tester#^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "homepage": "https://github.com/PolymerElements/iron-a11y-announcer",
+ "_release": "2.1.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.0",
+ "commit": "7e2c529fcb96582cb8c13905896fcf8496763966"
+ },
+ "_source": "https://github.com/PolymerElements/iron-a11y-announcer.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/iron-a11y-announcer"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/.github/CODEOWNERS
new file mode 100644
index 00000000000..cc86f1ec217
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @notwaldorf
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..594376ff9e7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-a11y-announcer/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/.travis.yml
new file mode 100644
index 00000000000..d13ba205987
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/.travis.yml
@@ -0,0 +1,30 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+env:
+ global:
+ - secure: >-
+ QlyQxWnziNgzWqptOtM0Oq1s/q6YHT/GPuslA31yC0nex7Wi6X9DFoF5rNlDEY0Y6WxCh8xzsZpwXrI9vZypgKoZlAwO1e3RLDsGV0APPrWg66MyImAwlHAJolvJg+ASsLJ8pm9nxMP/xapRamciqUMTUTeZh0V/5SR82BXQCf3zXe+9cMmAFNXBrIg6LDCm77AwW+1vkE/IZAL1oShSBwXEybn9kpYsdCiOGdnvMlChhaeqRlOUXkr3LHPUDtV8hbd2EswmPeHSV+RGdB/UFyRGa4g7gPgqtz7U2FS0/BqT0G2iJlAXGCttJnS6fXwyCriREplYjXzqrX0MeRWHD5vNxAucO/Va1n2tHEmJM3OhIYgO8VDM8S3nRRUDE/ifSjsu1UgBN7b1vml0zWo7rdvpD8fedx6+g4ph390kg5XRFNJZJ03YijfcNVUfnOTEWt9LntGRq5aKPB6RSbEvkuZFjLGHHD/xQu2LfyIjmueIWJNk4JeCNrm3zFPMhBAZfu7WTJPTk3dZ2L+0mty1QbaJ/lyTWIBYbTVBwwHzXKrPbgg5u/9e6DjhT8Zg/eJvmN/+sXAlUqnmTAE9coQ0LIivg6COWPoRDmdGl2uMygiCaLkFAy4sqhjP99Aq5/ekZWXUrTTa4NGw2qnvM4JY9YcEzUC0ZqzM11gj8x8ATi0=
+ - secure: >-
+ d0wz93AwXyNVmCr33od+TFC51nZgUzcdwHiJWxX0E+msZ8VgYCjj21D6OOZy84O7vYiPFy8vO03dvyqkj1uclEvfu2YlfiEaRxifKaxN6mQx142WjBtdHFjEUfBJR5eqm5qSeGj7aSZzPgerUl6yAkYH5tFldBatevF5Ax98Yr1dCsgpegsLCmBmusPH7tERnBilalcvXKVBfRXrnrkFkVoWroBb04W79aZSTlLGTlpBJCzR9Xe7RiXqnanSQQb1LjyCl55P0NvVVRjwpoVnikRqkIV/jehcNfIiJSC/vetepqqUehD6RdP2T8Nio7YvlLtXnW9vptlKYL2uZjhg23DyhgGW/4ZPaIABWVBqVUBbyaX6GCXo3EMyQcZhi17qCWEKnFGCrorC/4ZM6A0kJ+olOfQxszf9HrAX8+9DCaiKscn2Lz+ON/opFKFRAQngCJ9swBc27twavUxx4qNzOVJLdH8oGhCdl5DA4mgGGDWZz463X0HzagGUpi/RfME26uQnTkyK8eErL2yac+1VmA/QOx0RkYlrZ/pIEywkZPWusjJepCm9nlZGylaBr2mDpk8Kea+7IytO6sefiBwjX1RiqmnjnszO3jb/w5s0giUItWuFmDr14sOaFmj6wQB643eSGi42LSPG+FMea1RwUupyEPeLZq/aoJ0jmewGLv4=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+ sauce_connect: true
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/README.md
new file mode 100644
index 00000000000..8b997a30770
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/README.md
@@ -0,0 +1,55 @@
+
+<!---
+
+This README is automatically generated from the comments in these files:
+iron-a11y-announcer.html
+
+Edit those files, and our readme bot will duplicate them over here!
+Edit this file, and the bot will squash your changes :)
+
+The bot does some handling of markdown. Please file a bug if it does the wrong
+thing! https://github.com/PolymerLabs/tedium/issues
+
+-->
+
+[![Build status](https://travis-ci.org/PolymerElements/iron-a11y-announcer.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-a11y-announcer)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/iron-a11y-announcer)_
+
+
+##&lt;iron-a11y-announcer&gt;
+
+`iron-a11y-announcer` is a singleton element that is intended to add a11y
+to features that require on-demand announcement from screen readers. In
+order to make use of the announcer, it is best to request its availability
+in the announcing element.
+
+Example:
+
+```javascript
+Polymer({
+
+ is: 'x-chatty',
+
+ attached: function() {
+ // This will create the singleton element if it has not
+ // been created yet:
+ Polymer.IronA11yAnnouncer.requestAvailability();
+ }
+});
+```
+
+After the `iron-a11y-announcer` has been made available, elements can
+make announces by firing bubbling `iron-announce` events.
+
+Example:
+
+```javascript
+this.fire('iron-announce', {
+ text: 'This is an announcement!'
+}, { bubbles: true });
+```
+
+Note: announcements are only audible if you have a screen reader enabled.
+
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/bower.json
new file mode 100644
index 00000000000..524c047bdfe
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/bower.json
@@ -0,0 +1,55 @@
+{
+ "name": "iron-a11y-announcer",
+ "version": "2.0.0",
+ "description": "A singleton element that simplifies announcing text to screen readers.",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "a11y",
+ "live"
+ ],
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-a11y-announcer.git"
+ },
+ "main": "iron-a11y-announcer.html",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "paper-button": "PolymerElements/paper-button#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "ignore": [],
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "paper-button": "PolymerElements/paper-button#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "web-component-tester": "Polymer/web-component-tester#^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/demo/index.html
new file mode 100644
index 00000000000..8d5aa4c45b6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/demo/index.html
@@ -0,0 +1,75 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <title>iron-a11y-announcer demo</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../../paper-button/paper-button.html">
+ <link rel="import" href="x-announces.html">
+ <link rel="import" href="../iron-a11y-announcer.html">
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles">
+ input {
+ margin-right: 20px;
+ }
+ </style>
+ </custom-style>
+</head>
+<body>
+ <div class="vertical-section-container centered">
+ <p><b>Note</b>: in order to hear the announcements, be sure to turn on your favorite screen reader!</p>
+
+ <h4>Announcer used directly on the main document</h4>
+ <demo-snippet>
+ <template>
+ <input id="input" value="Pizza is delicious">
+ <paper-button raised onclick="_announce()">Announce</paper-button>
+
+ <script>
+ window.addEventListener('WebComponentsReady', function() {
+ // Initialize the announcer.
+ Polymer.IronA11yAnnouncer.requestAvailability();
+
+ // Optional; for testing, set the mode to assertive to announce immediately.
+ Polymer.IronA11yAnnouncer.instance.mode = 'assertive';
+ });
+
+ function _announce() {
+ Polymer.IronA11yAnnouncer.instance.fire('iron-announce', {
+ text: input.value.trim()
+ }, {
+ bubbles: true
+ });
+ }
+ </script>
+ </template>
+ </demo-snippet>
+
+ <h4>Announcer used inside a custom element</h4>
+ <demo-snippet>
+ <template>
+ <x-announces message="Hello, my name is Ava"></x-announces>
+ <x-announces message="This true sentence is false."></x-announces>
+ <x-announces message="Are you paying attention?"></x-announces>
+ </template>
+ </demo-snippet>
+ </div>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/demo/x-announces.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/demo/x-announces.html
new file mode 100644
index 00000000000..b46d49d5e6d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/demo/x-announces.html
@@ -0,0 +1,55 @@
+<!--
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE
+The complete set of authors may be found at http://polymer.github.io/AUTHORS
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../iron-a11y-announcer.html">
+<link rel="import" href="../../paper-button/paper-button.html">
+
+<dom-module id="x-announces">
+ <template>
+ <style>
+ :host {
+ display: block;
+ padding: 1em 0;
+ font-family: inherit;
+ }
+ </style>
+
+ <span>[[message]]</span>
+ <paper-button raised on-tap="_onTapAnnounce">Announce</paper-button>
+
+ </template>
+ <script>
+ Polymer({
+ is: 'x-announces',
+
+ hostAttributes: {
+ 'aria-hidden': 'true'
+ },
+
+ properties: {
+ message: {
+ type: String
+ }
+ },
+
+ attached: function() {
+ Polymer.IronA11yAnnouncer.requestAvailability();
+ },
+
+ _onTapAnnounce: function() {
+ this.fire('iron-announce', {
+ text: this.message.trim()
+ }, {
+ bubbles: true
+ });
+ }
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/index.html
new file mode 100644
index 00000000000..1f8889a8da9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<html>
+<head>
+
+ <title>iron-a11y-announcer</title>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/iron-a11y-announcer.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/iron-a11y-announcer.d.ts
new file mode 100644
index 00000000000..e777c3720ce
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/iron-a11y-announcer.d.ts
@@ -0,0 +1,68 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-a11y-announcer.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * `iron-a11y-announcer` is a singleton element that is intended to add a11y
+ * to features that require on-demand announcement from screen readers. In
+ * order to make use of the announcer, it is best to request its availability
+ * in the announcing element.
+ *
+ * Example:
+ *
+ * Polymer({
+ *
+ * is: 'x-chatty',
+ *
+ * attached: function() {
+ * // This will create the singleton element if it has not
+ * // been created yet:
+ * Polymer.IronA11yAnnouncer.requestAvailability();
+ * }
+ * });
+ *
+ * After the `iron-a11y-announcer` has been made available, elements can
+ * make announces by firing bubbling `iron-announce` events.
+ *
+ * Example:
+ *
+ * this.fire('iron-announce', {
+ * text: 'This is an announcement!'
+ * }, { bubbles: true });
+ *
+ * Note: announcements are only audible if you have a screen reader enabled.
+ */
+ class IronA11yAnnouncer extends Polymer.Element {
+
+ /**
+ * The value of mode is used to set the `aria-live` attribute
+ * for the element that will be announced. Valid values are: `off`,
+ * `polite` and `assertive`.
+ */
+ mode: string|null|undefined;
+ _text: string|null|undefined;
+ created(): void;
+
+ /**
+ * Cause a text string to be announced by screen readers.
+ *
+ * @param text The text that should be announced.
+ */
+ announce(text: string): void;
+ _onIronAnnounce(event: any): void;
+ }
+}
+
+interface HTMLElementTagNameMap {
+ "iron-a11y-announcer": Polymer.IronA11yAnnouncer;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/iron-a11y-announcer.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/iron-a11y-announcer.html
new file mode 100644
index 00000000000..11a8809ff84
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/iron-a11y-announcer.html
@@ -0,0 +1,124 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<!--
+`iron-a11y-announcer` is a singleton element that is intended to add a11y
+to features that require on-demand announcement from screen readers. In
+order to make use of the announcer, it is best to request its availability
+in the announcing element.
+
+Example:
+
+ Polymer({
+
+ is: 'x-chatty',
+
+ attached: function() {
+ // This will create the singleton element if it has not
+ // been created yet:
+ Polymer.IronA11yAnnouncer.requestAvailability();
+ }
+ });
+
+After the `iron-a11y-announcer` has been made available, elements can
+make announces by firing bubbling `iron-announce` events.
+
+Example:
+
+ this.fire('iron-announce', {
+ text: 'This is an announcement!'
+ }, { bubbles: true });
+
+Note: announcements are only audible if you have a screen reader enabled.
+
+@group Iron Elements
+@demo demo/index.html
+-->
+
+<dom-module id="iron-a11y-announcer">
+ <template>
+ <style>
+ :host {
+ display: inline-block;
+ position: fixed;
+ clip: rect(0px,0px,0px,0px);
+ }
+ </style>
+ <div aria-live$="[[mode]]">[[_text]]</div>
+ </template>
+
+ <script>
+
+ (function() {
+ 'use strict';
+
+ Polymer.IronA11yAnnouncer = Polymer({
+ is: 'iron-a11y-announcer',
+
+ properties: {
+
+ /**
+ * The value of mode is used to set the `aria-live` attribute
+ * for the element that will be announced. Valid values are: `off`,
+ * `polite` and `assertive`.
+ */
+ mode: {
+ type: String,
+ value: 'polite'
+ },
+
+ _text: {
+ type: String,
+ value: ''
+ }
+ },
+
+ created: function() {
+ if (!Polymer.IronA11yAnnouncer.instance) {
+ Polymer.IronA11yAnnouncer.instance = this;
+ }
+
+ document.body.addEventListener('iron-announce', this._onIronAnnounce.bind(this));
+ },
+
+ /**
+ * Cause a text string to be announced by screen readers.
+ *
+ * @param {string} text The text that should be announced.
+ */
+ announce: function(text) {
+ this._text = '';
+ this.async(function() {
+ this._text = text;
+ }, 100);
+ },
+
+ _onIronAnnounce: function(event) {
+ if (event.detail && event.detail.text) {
+ this.announce(event.detail.text);
+ }
+ }
+ });
+
+ Polymer.IronA11yAnnouncer.instance = null;
+
+ Polymer.IronA11yAnnouncer.requestAvailability = function() {
+ if (!Polymer.IronA11yAnnouncer.instance) {
+ Polymer.IronA11yAnnouncer.instance = document.createElement('iron-a11y-announcer');
+ }
+
+ document.body.appendChild(Polymer.IronA11yAnnouncer.instance);
+ };
+ })();
+
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/package-lock.json
new file mode 100644
index 00000000000..51a44e05e59
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/package-lock.json
@@ -0,0 +1,974 @@
+{
+ "name": "@polymer/iron-a11y-announcer",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.0.tgz",
+ "integrity": "sha512-a5DFXI3TdZSVOMH4608LVaBLmcr+mwM2+B8OSBiB9WFNCtdqzUXwtB5We6vBzrThXlO4uRo7d2pEqjNXMAlEkA==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.0",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "4.1.0",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.0",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.12"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz",
+ "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.6.tgz",
+ "integrity": "sha512-CTUtLb6WqCCgp6P59QintjHWqzf4VL1uPA27bipLAPxFqrtK1gEYllePzTICGqQ8rYsCbpnsNypXjjDzGAAjEQ==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.8.tgz",
+ "integrity": "sha512-QqR0j08RCS1AQYPMRPHikEpcmK+2aEEbcSzWLwOqyJ4FhLmHUx/WjRrnn7tTQg/y4IKnMhzskh/o7qvGIZZ7iA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.0.0.tgz",
+ "integrity": "sha512-v+0wW9Wezwsyb0uF4aBVCjmSqit3Ru7PZFziGF0o2KwTvN2zWfTi3BRLq9EkJFdg3eBbyERXGTntVpBxH1J68Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.2",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
+ "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "4.0.0",
+ "array-back": "2.0.0",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz",
+ "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.5.7"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.8",
+ "winston": "2.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-QQL70IC85hI6q9uQeresEMcT1Qf8YR/zDe1qG8WWeeFAZk8z0lmzUpsfcAWz+bM4wpDdXrtd4HitIs4p0CHl/w==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.101",
+ "@types/parse5": "2.2.34",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "polymer-project-config": "3.8.1",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.1"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.8.1.tgz",
+ "integrity": "sha512-MLvnM9gexFWg7nynY24eHZG6NLXocmk718sVds/sx2CAJ6iihhC0JMhhOIa6jnad9KQrHyGl/cs3mMRaaub5Fg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.101",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.1.tgz",
+ "integrity": "sha1-Eahr7+rDxKo+wIYjZRo8gabQu8g=",
+ "dev": true
+ },
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/package.json
new file mode 100644
index 00000000000..ee95f42463c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-announcer/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@polymer/iron-a11y-announcer",
+ "private": true,
+ "description": "A singleton element that simplifies announcing text to screen readers.",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-a11y-announcer.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir ."
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/.bower.json
new file mode 100644
index 00000000000..5d8f1f6f4b2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/.bower.json
@@ -0,0 +1,64 @@
+{
+ "name": "iron-a11y-keys-behavior",
+ "version": "2.1.1",
+ "description": "A behavior that enables keybindings for greater a11y.",
+ "keywords": [
+ "web-components",
+ "web-component",
+ "polymer",
+ "a11y",
+ "input"
+ ],
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-a11y-keys-behavior.git"
+ },
+ "main": "iron-a11y-keys-behavior.html",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "homepage": "https://github.com/PolymerElements/iron-a11y-keys-behavior",
+ "_release": "2.1.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.1",
+ "commit": "b7e78a4a8bdd857780ecd8b54852bb27dbf8f216"
+ },
+ "_source": "https://github.com/PolymerElements/iron-a11y-keys-behavior.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/iron-a11y-keys-behavior"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/.github/CODEOWNERS
new file mode 100644
index 00000000000..c5097c0c903
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @valdrinkoshi
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..7d93604870d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-a11y-keys-behavior/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/.travis.yml
new file mode 100644
index 00000000000..c0d007ab8f9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/.travis.yml
@@ -0,0 +1,32 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g bower polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e '\n\033[31mERROR:\033[0m
+ Typings are stale. Please run "npm run format".' && false)
+env:
+ global:
+ - secure: >-
+ XJ31r/5USVGZRtziCLfr8qM1pJKKQMUN1AeYbCdDFEc6i293WxZneR8PwUVhvyptu+qdyd28uy24sH+Ob7kShFbZTUaif5P4gqHPekrYToI0aHyhmVX7C1LmT7nEL8IcT62NhUwh+83eHTAdodkXgnhfQhPn9FHV24Dkvwm8OKhhzEhtTgUGVuGX9j9FyNV6n1+gf4X3Zq63+NkEUh5vpolpue4W7ul2u0sf4l0fzg9pvKPCmywUwX2i7wwAEf3CJghMu2xup54OzXTEkjjSou/ebt1ZnxaUNV1+dblfUne0v9wTD0dPF8H3DwgewwzcZSbOZmj6lFVHRzmLzWcRJOEKdDrpJkjpg7HIhNPGCKDUcNylekafqi7ezhzrkzFwkh6JCdAj7He4mv/X/OUDNjNCClB7Ms/+WPZwtACvIcR2/pvgZ+1PHbIkbIInyAe6iVMMR0oUecei/X+d04DH7iW7rrODVEu6qdibsJki0R0lR2184rrDO9pGek4rLu9sUQBDNgEM6ZLEXXByO8lpG4xStRdkg0/uR5i1/Q8kux4gIJ9yV8WLANkS8NVlmuJgIi6kbh5n4VVKaihGhbBUuTt2aL7fLnH2I6YRwjyNI9TOIRxwk4afppFYUuq6Fv+nfPcdqDOi5Y2AOXLJ3Yvco0+H57nXe/Ny29gFVW4Kftg=
+ - secure: >-
+ huEi/Ja2qnLatb7EJ4Jdc/XAeKphhdH6G+px7/XZY33oDawjStxakx0N/MpT0LPE1BdEWOYTzc17CzKv9R2L3ybWksqXyv/Zs+1NMTmpEAS/54Sk4E61aE3nrV5cfS2R8dBGbJhFoH1W237BDsbw9A4XhsTvhxlIsluWsZgeurbleGg+DgAmg8KlHGRddsfBFgXEk+Khhj6KPsbgPUiWhXpdnXKBPJKF7fJEAbsGR4aFK2eFbYd1OAgJg2Aye0n93IHe+SsxcKRUYteg6UK9V8fk7q5PBlvaodly4F3gH82l+zbnhcTFVW+qN0s6xDBTQzsQ55eTlO3pEezIo3u/1Lq41Yoe6scEkLs63pSYqoB3kakbhLMDJAen080ggdNg9evqvgyznKFYM7sqEcPu+KxHd043DyLTTW11y9lZ/hV3xSTdG4W8mV7+ILbIi54wMaYAcWSGMTOVM0JC/KDoVjze3tzDmfcZwiutLPBFgfrkfJQf3fyqcgvhoLKtHaWHI+76XDsXwEOS2Q5OX9oDtjoZaZ7r8Gp4dqwaKYceOrlsLbaZOLh5nJ4WnDbf4AqZkeM22QWWIfUN6aK+yhsDpQ/d+xJ+/WFENDADrMEKp0Lf3CkzAAcpHp3u65B9qsqweD5/5Je9t0GsA/NvK2xCasnNz6inYy4tAx9i4NWPcOY=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/README.md
new file mode 100644
index 00000000000..87f9902674e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/README.md
@@ -0,0 +1,45 @@
+
+[![Build status](https://travis-ci.org/PolymerElements/iron-a11y-keys-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-a11y-keys-behavior)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/iron-a11y-keys-behavior)_
+
+
+## Polymer.IronA11yKeysBehavior
+
+`Polymer.IronA11yKeysBehavior` provides a normalized interface for processing
+keyboard commands that pertain to [WAI-ARIA best practices](http://www.w3.org/TR/wai-aria-practices/#kbd_general_binding).
+The element takes care of browser differences with respect to Keyboard events
+and uses an expressive syntax to filter key presses.
+
+Use the `keyBindings` prototype property to express what combination of keys
+will trigger the callback. A key binding has the format
+`"KEY+MODIFIER:EVENT": "callback"` (`"KEY": "callback"` or
+`"KEY:EVENT": "callback"` are valid as well). Some examples:
+
+```javascript
+ keyBindings: {
+ 'space': '_onKeydown', // same as 'space:keydown'
+ 'shift+tab': '_onKeydown',
+ 'enter:keypress': '_onKeypress',
+ 'esc:keyup': '_onKeyup'
+ }
+```
+
+The callback will receive with an event containing the following information in `event.detail`:
+
+```javascript
+ _onKeydown: function(event) {
+ console.log(event.detail.combo); // KEY+MODIFIER, e.g. "shift+tab"
+ console.log(event.detail.key); // KEY only, e.g. "tab"
+ console.log(event.detail.event); // EVENT, e.g. "keydown"
+ console.log(event.detail.keyboardEvent); // the original KeyboardEvent
+ }
+```
+
+Use the `keyEventTarget` attribute to set up event handlers on a specific
+node.
+
+See the [demo source code](https://github.com/PolymerElements/iron-a11y-keys-behavior/blob/master/demo/x-key-aware.html)
+for an example.
+
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/bower.json
new file mode 100644
index 00000000000..f79293d70e0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/bower.json
@@ -0,0 +1,54 @@
+{
+ "name": "iron-a11y-keys-behavior",
+ "version": "2.1.1",
+ "description": "A behavior that enables keybindings for greater a11y.",
+ "keywords": [
+ "web-components",
+ "web-component",
+ "polymer",
+ "a11y",
+ "input"
+ ],
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-a11y-keys-behavior.git"
+ },
+ "main": "iron-a11y-keys-behavior.html",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/demo/index.html
new file mode 100644
index 00000000000..e7685e83107
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/demo/index.html
@@ -0,0 +1,32 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="UTF-8">
+ <title>Iron A11y Keys Behavior demo</title>
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="x-key-aware.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+
+ <custom-style><style is="custom-style" include="demo-pages-shared-styles"></style></custom-style>
+</head>
+
+<body unresolved class="centered">
+
+ <demo-snippet>
+ <template>
+ <x-key-aware></x-key-aware>
+ </template>
+ </demo-snippet>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/demo/x-key-aware.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/demo/x-key-aware.html
new file mode 100644
index 00000000000..8d4eb2a7ad6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/demo/x-key-aware.html
@@ -0,0 +1,93 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../iron-a11y-keys-behavior.html">
+
+<dom-module id="x-key-aware">
+ <template>
+ <style>
+ :host {
+ display: block;
+ position: relative;
+ }
+
+ pre {
+ color: #3367d6;
+ }
+
+ .keys {
+ line-height: 25px;
+ }
+
+ .keys span {
+ cursor: default;
+ background-color: #f5f5f5;
+ border: 1px solid #e0e0e0;
+ padding: 1px 5px;
+ border-radius: 5px;
+ }
+ </style>
+
+ <h4>Press any of these keys</h4>
+ <input type="checkbox" checked="{{preventDefault::change}}"> prevent default = {{preventDefault}}
+ <p class="keys">
+ <template is="dom-repeat" items="[[boundKeys]]">
+ <span>{{item}}</span>
+ </template>
+ </p>
+ <pre>[[pressed]]</pre>
+ </template>
+</dom-module>
+
+<script>
+ Polymer({
+ is: 'x-key-aware',
+
+ behaviors: [Polymer.IronA11yKeysBehavior],
+
+ properties: {
+ pressed: {type: String, readOnly: true, value: ''},
+
+ boundKeys: {
+ type: Array,
+ value: function() {
+ return Object.keys(this.keyBindings).join(' ').split(' ');
+ }
+ },
+
+ preventDefault: {type: Boolean, value: true, notify: true},
+
+ keyEventTarget: {
+ type: Object,
+ value: function() {
+ return document.body;
+ }
+ }
+ },
+
+ keyBindings: {
+ '* pageup pagedown left right down up home end space enter @ ~ " $ ? ! \\ + : # backspace':
+ '_updatePressed',
+ 'a': '_updatePressed',
+ 'shift+a alt+a': '_updatePressed',
+ 'shift+tab shift+space': '_updatePressed'
+ },
+
+ _updatePressed: function(event) {
+ console.log(event.detail);
+
+ if (this.preventDefault) {
+ event.preventDefault();
+ }
+ this._setPressed(this.pressed + event.detail.combo + ' pressed!\n');
+ }
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/index.html
new file mode 100644
index 00000000000..c53ba6cf31e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/index.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <title>iron-a11y-keys-behavior</title>
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.d.ts
new file mode 100644
index 00000000000..f02a1f65323
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.d.ts
@@ -0,0 +1,107 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-a11y-keys-behavior.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * `Polymer.IronA11yKeysBehavior` provides a normalized interface for processing
+ * keyboard commands that pertain to [WAI-ARIA best
+ * practices](http://www.w3.org/TR/wai-aria-practices/#kbd_general_binding). The
+ * element takes care of browser differences with respect to Keyboard events and
+ * uses an expressive syntax to filter key presses.
+ *
+ * Use the `keyBindings` prototype property to express what combination of keys
+ * will trigger the callback. A key binding has the format
+ * `"KEY+MODIFIER:EVENT": "callback"` (`"KEY": "callback"` or
+ * `"KEY:EVENT": "callback"` are valid as well). Some examples:
+ *
+ * keyBindings: {
+ * 'space': '_onKeydown', // same as 'space:keydown'
+ * 'shift+tab': '_onKeydown',
+ * 'enter:keypress': '_onKeypress',
+ * 'esc:keyup': '_onKeyup'
+ * }
+ *
+ * The callback will receive with an event containing the following information
+ * in `event.detail`:
+ *
+ * _onKeydown: function(event) {
+ * console.log(event.detail.combo); // KEY+MODIFIER, e.g. "shift+tab"
+ * console.log(event.detail.key); // KEY only, e.g. "tab"
+ * console.log(event.detail.event); // EVENT, e.g. "keydown"
+ * console.log(event.detail.keyboardEvent); // the original KeyboardEvent
+ * }
+ *
+ * Use the `keyEventTarget` attribute to set up event handlers on a specific
+ * node.
+ *
+ * See the [demo source
+ * code](https://github.com/PolymerElements/iron-a11y-keys-behavior/blob/master/demo/x-key-aware.html)
+ * for an example.
+ */
+ interface IronA11yKeysBehavior {
+
+ /**
+ * The EventTarget that will be firing relevant KeyboardEvents. Set it to
+ * `null` to disable the listeners.
+ */
+ keyEventTarget: EventTarget|null;
+
+ /**
+ * If true, this property will cause the implementing element to
+ * automatically stop propagation on any handled KeyboardEvents.
+ */
+ stopKeyboardEventPropagation: boolean|null|undefined;
+ _boundKeyHandlers: any[]|null|undefined;
+
+ /**
+ * own properties of everything on the "prototype".
+ */
+ _imperativeKeyBindings: object|null|undefined;
+
+ /**
+ * To be used to express what combination of keys will trigger the relative
+ * callback. e.g. `keyBindings: { 'esc': '_onEscPressed'}`
+ */
+ keyBindings: object;
+ registered(): void;
+ attached(): void;
+ detached(): void;
+
+ /**
+ * Can be used to imperatively add a key binding to the implementing
+ * element. This is the imperative equivalent of declaring a keybinding
+ * in the `keyBindings` prototype property.
+ */
+ addOwnKeyBinding(eventString: string, handlerName: string): void;
+
+ /**
+ * When called, will remove all imperatively-added key bindings.
+ */
+ removeOwnKeyBindings(): void;
+
+ /**
+ * Returns true if a keyboard event matches `eventString`.
+ */
+ keyboardEventMatchesKeys(event: KeyboardEvent|null, eventString: string): boolean;
+ _collectKeyBindings(): any;
+ _prepKeyBindings(): void;
+ _addKeyBinding(eventString: any, handlerName: any): void;
+ _resetKeyEventListeners(): void;
+ _listenKeyEventListeners(): void;
+ _unlistenKeyEventListeners(): void;
+ _onKeyBindingEvent(keyBindings: any, event: any): void;
+ _triggerKeyHandler(keyCombo: any, handlerName: any, keyboardEvent: any): void;
+ }
+
+ const IronA11yKeysBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html
new file mode 100644
index 00000000000..0005de96d32
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html
@@ -0,0 +1,490 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<script>
+ (function() {
+ 'use strict';
+
+ /**
+ * Chrome uses an older version of DOM Level 3 Keyboard Events
+ *
+ * Most keys are labeled as text, but some are Unicode codepoints.
+ * Values taken from:
+ * http://www.w3.org/TR/2007/WD-DOM-Level-3-Events-20071221/keyset.html#KeySet-Set
+ */
+ var KEY_IDENTIFIER = {
+ 'U+0008': 'backspace',
+ 'U+0009': 'tab',
+ 'U+001B': 'esc',
+ 'U+0020': 'space',
+ 'U+007F': 'del'
+ };
+
+ /**
+ * Special table for KeyboardEvent.keyCode.
+ * KeyboardEvent.keyIdentifier is better, and KeyBoardEvent.key is even better
+ * than that.
+ *
+ * Values from:
+ * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent.keyCode#Value_of_keyCode
+ */
+ var KEY_CODE = {
+ 8: 'backspace',
+ 9: 'tab',
+ 13: 'enter',
+ 27: 'esc',
+ 33: 'pageup',
+ 34: 'pagedown',
+ 35: 'end',
+ 36: 'home',
+ 32: 'space',
+ 37: 'left',
+ 38: 'up',
+ 39: 'right',
+ 40: 'down',
+ 46: 'del',
+ 106: '*'
+ };
+
+ /**
+ * MODIFIER_KEYS maps the short name for modifier keys used in a key
+ * combo string to the property name that references those same keys
+ * in a KeyboardEvent instance.
+ */
+ var MODIFIER_KEYS = {
+ 'shift': 'shiftKey',
+ 'ctrl': 'ctrlKey',
+ 'alt': 'altKey',
+ 'meta': 'metaKey'
+ };
+
+ /**
+ * KeyboardEvent.key is mostly represented by printable character made by
+ * the keyboard, with unprintable keys labeled nicely.
+ *
+ * However, on OS X, Alt+char can make a Unicode character that follows an
+ * Apple-specific mapping. In this case, we fall back to .keyCode.
+ */
+ var KEY_CHAR = /[a-z0-9*]/;
+
+ /**
+ * Matches a keyIdentifier string.
+ */
+ var IDENT_CHAR = /U\+/;
+
+ /**
+ * Matches arrow keys in Gecko 27.0+
+ */
+ var ARROW_KEY = /^arrow/;
+
+ /**
+ * Matches space keys everywhere (notably including IE10's exceptional name
+ * `spacebar`).
+ */
+ var SPACE_KEY = /^space(bar)?/;
+
+ /**
+ * Matches ESC key.
+ *
+ * Value from: http://w3c.github.io/uievents-key/#key-Escape
+ */
+ var ESC_KEY = /^escape$/;
+
+ /**
+ * Transforms the key.
+ * @param {string} key The KeyBoardEvent.key
+ * @param {Boolean} [noSpecialChars] Limits the transformation to
+ * alpha-numeric characters.
+ */
+ function transformKey(key, noSpecialChars) {
+ var validKey = '';
+ if (key) {
+ var lKey = key.toLowerCase();
+ if (lKey === ' ' || SPACE_KEY.test(lKey)) {
+ validKey = 'space';
+ } else if (ESC_KEY.test(lKey)) {
+ validKey = 'esc';
+ } else if (lKey.length == 1) {
+ if (!noSpecialChars || KEY_CHAR.test(lKey)) {
+ validKey = lKey;
+ }
+ } else if (ARROW_KEY.test(lKey)) {
+ validKey = lKey.replace('arrow', '');
+ } else if (lKey == 'multiply') {
+ // numpad '*' can map to Multiply on IE/Windows
+ validKey = '*';
+ } else {
+ validKey = lKey;
+ }
+ }
+ return validKey;
+ }
+
+ function transformKeyIdentifier(keyIdent) {
+ var validKey = '';
+ if (keyIdent) {
+ if (keyIdent in KEY_IDENTIFIER) {
+ validKey = KEY_IDENTIFIER[keyIdent];
+ } else if (IDENT_CHAR.test(keyIdent)) {
+ keyIdent = parseInt(keyIdent.replace('U+', '0x'), 16);
+ validKey = String.fromCharCode(keyIdent).toLowerCase();
+ } else {
+ validKey = keyIdent.toLowerCase();
+ }
+ }
+ return validKey;
+ }
+
+ function transformKeyCode(keyCode) {
+ var validKey = '';
+ if (Number(keyCode)) {
+ if (keyCode >= 65 && keyCode <= 90) {
+ // ascii a-z
+ // lowercase is 32 offset from uppercase
+ validKey = String.fromCharCode(32 + keyCode);
+ } else if (keyCode >= 112 && keyCode <= 123) {
+ // function keys f1-f12
+ validKey = 'f' + (keyCode - 112 + 1);
+ } else if (keyCode >= 48 && keyCode <= 57) {
+ // top 0-9 keys
+ validKey = String(keyCode - 48);
+ } else if (keyCode >= 96 && keyCode <= 105) {
+ // num pad 0-9
+ validKey = String(keyCode - 96);
+ } else {
+ validKey = KEY_CODE[keyCode];
+ }
+ }
+ return validKey;
+ }
+
+ /**
+ * Calculates the normalized key for a KeyboardEvent.
+ * @param {KeyboardEvent} keyEvent
+ * @param {Boolean} [noSpecialChars] Set to true to limit keyEvent.key
+ * transformation to alpha-numeric chars. This is useful with key
+ * combinations like shift + 2, which on FF for MacOS produces
+ * keyEvent.key = @
+ * To get 2 returned, set noSpecialChars = true
+ * To get @ returned, set noSpecialChars = false
+ */
+ function normalizedKeyForEvent(keyEvent, noSpecialChars) {
+ // Fall back from .key, to .detail.key for artifical keyboard events,
+ // and then to deprecated .keyIdentifier and .keyCode.
+ if (keyEvent.key) {
+ return transformKey(keyEvent.key, noSpecialChars);
+ }
+ if (keyEvent.detail && keyEvent.detail.key) {
+ return transformKey(keyEvent.detail.key, noSpecialChars);
+ }
+ return transformKeyIdentifier(keyEvent.keyIdentifier) ||
+ transformKeyCode(keyEvent.keyCode) || '';
+ }
+
+ function keyComboMatchesEvent(keyCombo, event) {
+ // For combos with modifiers we support only alpha-numeric keys
+ var keyEvent = normalizedKeyForEvent(event, keyCombo.hasModifiers);
+ return keyEvent === keyCombo.key &&
+ (!keyCombo.hasModifiers ||
+ (!!event.shiftKey === !!keyCombo.shiftKey &&
+ !!event.ctrlKey === !!keyCombo.ctrlKey &&
+ !!event.altKey === !!keyCombo.altKey &&
+ !!event.metaKey === !!keyCombo.metaKey));
+ }
+
+ function parseKeyComboString(keyComboString) {
+ if (keyComboString.length === 1) {
+ return {combo: keyComboString, key: keyComboString, event: 'keydown'};
+ }
+ return keyComboString.split('+')
+ .reduce(function(parsedKeyCombo, keyComboPart) {
+ var eventParts = keyComboPart.split(':');
+ var keyName = eventParts[0];
+ var event = eventParts[1];
+
+ if (keyName in MODIFIER_KEYS) {
+ parsedKeyCombo[MODIFIER_KEYS[keyName]] = true;
+ parsedKeyCombo.hasModifiers = true;
+ } else {
+ parsedKeyCombo.key = keyName;
+ parsedKeyCombo.event = event || 'keydown';
+ }
+
+ return parsedKeyCombo;
+ }, {combo: keyComboString.split(':').shift()});
+ }
+
+ function parseEventString(eventString) {
+ return eventString.trim().split(' ').map(function(keyComboString) {
+ return parseKeyComboString(keyComboString);
+ });
+ }
+
+ /**
+ * `Polymer.IronA11yKeysBehavior` provides a normalized interface for processing
+ * keyboard commands that pertain to [WAI-ARIA best
+ * practices](http://www.w3.org/TR/wai-aria-practices/#kbd_general_binding). The
+ * element takes care of browser differences with respect to Keyboard events and
+ * uses an expressive syntax to filter key presses.
+ *
+ * Use the `keyBindings` prototype property to express what combination of keys
+ * will trigger the callback. A key binding has the format
+ * `"KEY+MODIFIER:EVENT": "callback"` (`"KEY": "callback"` or
+ * `"KEY:EVENT": "callback"` are valid as well). Some examples:
+ *
+ * keyBindings: {
+ * 'space': '_onKeydown', // same as 'space:keydown'
+ * 'shift+tab': '_onKeydown',
+ * 'enter:keypress': '_onKeypress',
+ * 'esc:keyup': '_onKeyup'
+ * }
+ *
+ * The callback will receive with an event containing the following information
+ * in `event.detail`:
+ *
+ * _onKeydown: function(event) {
+ * console.log(event.detail.combo); // KEY+MODIFIER, e.g. "shift+tab"
+ * console.log(event.detail.key); // KEY only, e.g. "tab"
+ * console.log(event.detail.event); // EVENT, e.g. "keydown"
+ * console.log(event.detail.keyboardEvent); // the original KeyboardEvent
+ * }
+ *
+ * Use the `keyEventTarget` attribute to set up event handlers on a specific
+ * node.
+ *
+ * See the [demo source
+ * code](https://github.com/PolymerElements/iron-a11y-keys-behavior/blob/master/demo/x-key-aware.html)
+ * for an example.
+ *
+ * @demo demo/index.html
+ * @polymerBehavior
+ */
+ Polymer.IronA11yKeysBehavior = {
+ properties: {
+ /**
+ * The EventTarget that will be firing relevant KeyboardEvents. Set it to
+ * `null` to disable the listeners.
+ * @type {?EventTarget}
+ */
+ keyEventTarget: {
+ type: Object,
+ value: function() {
+ return this;
+ }
+ },
+
+ /**
+ * If true, this property will cause the implementing element to
+ * automatically stop propagation on any handled KeyboardEvents.
+ */
+ stopKeyboardEventPropagation: {type: Boolean, value: false},
+
+ _boundKeyHandlers: {
+ type: Array,
+ value: function() {
+ return [];
+ }
+ },
+
+ // We use this due to a limitation in IE10 where instances will have
+ // own properties of everything on the "prototype".
+ _imperativeKeyBindings: {
+ type: Object,
+ value: function() {
+ return {};
+ }
+ }
+ },
+
+ observers: ['_resetKeyEventListeners(keyEventTarget, _boundKeyHandlers)'],
+
+
+ /**
+ * To be used to express what combination of keys will trigger the relative
+ * callback. e.g. `keyBindings: { 'esc': '_onEscPressed'}`
+ * @type {!Object}
+ */
+ keyBindings: {},
+
+ registered: function() {
+ this._prepKeyBindings();
+ },
+
+ attached: function() {
+ this._listenKeyEventListeners();
+ },
+
+ detached: function() {
+ this._unlistenKeyEventListeners();
+ },
+
+ /**
+ * Can be used to imperatively add a key binding to the implementing
+ * element. This is the imperative equivalent of declaring a keybinding
+ * in the `keyBindings` prototype property.
+ *
+ * @param {string} eventString
+ * @param {string} handlerName
+ */
+ addOwnKeyBinding: function(eventString, handlerName) {
+ this._imperativeKeyBindings[eventString] = handlerName;
+ this._prepKeyBindings();
+ this._resetKeyEventListeners();
+ },
+
+ /**
+ * When called, will remove all imperatively-added key bindings.
+ */
+ removeOwnKeyBindings: function() {
+ this._imperativeKeyBindings = {};
+ this._prepKeyBindings();
+ this._resetKeyEventListeners();
+ },
+
+ /**
+ * Returns true if a keyboard event matches `eventString`.
+ *
+ * @param {KeyboardEvent} event
+ * @param {string} eventString
+ * @return {boolean}
+ */
+ keyboardEventMatchesKeys: function(event, eventString) {
+ var keyCombos = parseEventString(eventString);
+ for (var i = 0; i < keyCombos.length; ++i) {
+ if (keyComboMatchesEvent(keyCombos[i], event)) {
+ return true;
+ }
+ }
+ return false;
+ },
+
+ _collectKeyBindings: function() {
+ var keyBindings = this.behaviors.map(function(behavior) {
+ return behavior.keyBindings;
+ });
+
+ if (keyBindings.indexOf(this.keyBindings) === -1) {
+ keyBindings.push(this.keyBindings);
+ }
+
+ return keyBindings;
+ },
+
+ _prepKeyBindings: function() {
+ this._keyBindings = {};
+
+ this._collectKeyBindings().forEach(function(keyBindings) {
+ for (var eventString in keyBindings) {
+ this._addKeyBinding(eventString, keyBindings[eventString]);
+ }
+ }, this);
+
+ for (var eventString in this._imperativeKeyBindings) {
+ this._addKeyBinding(
+ eventString, this._imperativeKeyBindings[eventString]);
+ }
+
+ // Give precedence to combos with modifiers to be checked first.
+ for (var eventName in this._keyBindings) {
+ this._keyBindings[eventName].sort(function(kb1, kb2) {
+ var b1 = kb1[0].hasModifiers;
+ var b2 = kb2[0].hasModifiers;
+ return (b1 === b2) ? 0 : b1 ? -1 : 1;
+ })
+ }
+ },
+
+ _addKeyBinding: function(eventString, handlerName) {
+ parseEventString(eventString).forEach(function(keyCombo) {
+ this._keyBindings[keyCombo.event] =
+ this._keyBindings[keyCombo.event] || [];
+
+ this._keyBindings[keyCombo.event].push([keyCombo, handlerName]);
+ }, this);
+ },
+
+ _resetKeyEventListeners: function() {
+ this._unlistenKeyEventListeners();
+
+ if (this.isAttached) {
+ this._listenKeyEventListeners();
+ }
+ },
+
+ _listenKeyEventListeners: function() {
+ if (!this.keyEventTarget) {
+ return;
+ }
+ Object.keys(this._keyBindings).forEach(function(eventName) {
+ var keyBindings = this._keyBindings[eventName];
+ var boundKeyHandler = this._onKeyBindingEvent.bind(this, keyBindings);
+
+ this._boundKeyHandlers.push(
+ [this.keyEventTarget, eventName, boundKeyHandler]);
+
+ this.keyEventTarget.addEventListener(eventName, boundKeyHandler);
+ }, this);
+ },
+
+ _unlistenKeyEventListeners: function() {
+ var keyHandlerTuple;
+ var keyEventTarget;
+ var eventName;
+ var boundKeyHandler;
+
+ while (this._boundKeyHandlers.length) {
+ // My kingdom for block-scope binding and destructuring assignment..
+ keyHandlerTuple = this._boundKeyHandlers.pop();
+ keyEventTarget = keyHandlerTuple[0];
+ eventName = keyHandlerTuple[1];
+ boundKeyHandler = keyHandlerTuple[2];
+
+ keyEventTarget.removeEventListener(eventName, boundKeyHandler);
+ }
+ },
+
+ _onKeyBindingEvent: function(keyBindings, event) {
+ if (this.stopKeyboardEventPropagation) {
+ event.stopPropagation();
+ }
+
+ // if event has been already prevented, don't do anything
+ if (event.defaultPrevented) {
+ return;
+ }
+
+ for (var i = 0; i < keyBindings.length; i++) {
+ var keyCombo = keyBindings[i][0];
+ var handlerName = keyBindings[i][1];
+ if (keyComboMatchesEvent(keyCombo, event)) {
+ this._triggerKeyHandler(keyCombo, handlerName, event);
+ // exit the loop if eventDefault was prevented
+ if (event.defaultPrevented) {
+ return;
+ }
+ }
+ }
+ },
+
+ _triggerKeyHandler: function(keyCombo, handlerName, keyboardEvent) {
+ var detail = Object.create(keyCombo);
+ detail.keyboardEvent = keyboardEvent;
+ var event =
+ new CustomEvent(keyCombo.event, {detail: detail, cancelable: true});
+ this[handlerName].call(this, event);
+ if (event.defaultPrevented) {
+ keyboardEvent.preventDefault();
+ }
+ }
+ };
+ })();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/package-lock.json
new file mode 100644
index 00000000000..f8244363de5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/package-lock.json
@@ -0,0 +1,2388 @@
+{
+ "name": "@polymer/iron-a11y-keys-behavior",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.3"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.6.3"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.6.3",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.3.tgz",
+ "integrity": "sha512-igaEysRgtg5tYJVIdQ1T2lJ3G6OmoY7g0YVWKHLFiVs4YUChd9IRSiLoHSLffwut+CpsHHBDj4vRxxNEMstctw==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.3"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.3"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.3"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.44",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+ "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz",
+ "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.2",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.105",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.44",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.2",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/package.json
new file mode 100644
index 00000000000..88f10c16f25
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-a11y-keys-behavior/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@polymer/iron-a11y-keys-behavior",
+ "private": true,
+ "description": "A behavior that enables keybindings for greater a11y.",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-a11y-keys-behavior.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/.bower.json
new file mode 100644
index 00000000000..1b870736b6b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/.bower.json
@@ -0,0 +1,72 @@
+{
+ "name": "iron-autogrow-textarea",
+ "version": "2.2.0",
+ "description": "A textarea element that automatically grows with input",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "input",
+ "textarea"
+ ],
+ "main": "iron-autogrow-textarea.html",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-autogrow-textarea.git"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/iron-autogrow-textarea",
+ "ignore": [],
+ "dependencies": {
+ "iron-behaviors": "PolymerElements/iron-behaviors#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "Polymer/web-component-tester#^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.2.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.2.0",
+ "commit": "e5cdb402561bfcfea17a24aae478cbd5ea4bf943"
+ },
+ "_source": "https://github.com/PolymerElements/iron-autogrow-textarea.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/iron-autogrow-textarea"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/.github/CODEOWNERS
new file mode 100644
index 00000000000..cc86f1ec217
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @notwaldorf
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..0b70c29de3c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-autogrow-textarea/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/.travis.yml
new file mode 100644
index 00000000000..08b3ca10425
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/.travis.yml
@@ -0,0 +1,30 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+env:
+ global:
+ - secure: >-
+ TqFz1Cdu4BtLCHYLFPES0q+6wPfCnj9bnTfven9LIU+gtek70FPDT3UlnviNwp5ob3o0sbLgsLWG5OkCsRHli+HCgPEVDazSrghfwaT9mL+h/DlM/PVB079VDdIKvZM6L7xEF0zPv7t26kljBRQcZJ81O3K7h1mNjeBj6sDXHzE=
+ - secure: >-
+ ihYM52Uu3H7FGU+x+f+hzMcWt00B7l6GZOtxzT1xYx4hb4E9/WwXYR5z9bqN+s5p10yf3FG64zbmMTuJeBvknDpSyBt/vKP+QBBZT0hxv05GifS38hiSoYT3HBxEpwhYdpjlsSJtIbKfYGR3xIXutRzRrRKSYigcrQNX83MGWFY=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+ sauce_connect: true
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/README.md
new file mode 100644
index 00000000000..73e8f8af1c6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/README.md
@@ -0,0 +1,45 @@
+
+<!---
+
+This README is automatically generated from the comments in these files:
+iron-autogrow-textarea.html
+
+Edit those files, and our readme bot will duplicate them over here!
+Edit this file, and the bot will squash your changes :)
+
+The bot does some handling of markdown. Please file a bug if it does the wrong
+thing! https://github.com/PolymerLabs/tedium/issues
+
+-->
+
+[![Build status](https://travis-ci.org/PolymerElements/iron-autogrow-textarea.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-autogrow-textarea)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/iron-autogrow-textarea)_
+
+
+## &lt;iron-autogrow-textarea&gt;
+
+`iron-autogrow-textarea` is an element containing a textarea that grows in height as more
+lines of input are entered. Unless an explicit height or the `maxRows` property is set, it will
+never scroll.
+
+Example:
+
+```html
+<iron-autogrow-textarea></iron-autogrow-textarea>
+```
+
+### Changes in 2.0
+- `bind-value` is deprecated, and just mirrors the `value` property
+- corrected the behaviour of `validate()`
+
+### Styling
+
+The following custom properties and mixins are available for styling:
+
+| Custom property | Description | Default |
+| --- | --- | --- |
+| `--iron-autogrow-textarea` | Mixin applied to the textarea | `{}` |
+| `--iron-autogrow-textarea-placeholder` | Mixin applied to the textarea placeholder | `{}` |
+
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/bower.json
new file mode 100644
index 00000000000..1ed77375e4b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/bower.json
@@ -0,0 +1,63 @@
+{
+ "name": "iron-autogrow-textarea",
+ "version": "2.1.1",
+ "description": "A textarea element that automatically grows with input",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "input",
+ "textarea"
+ ],
+ "main": "iron-autogrow-textarea.html",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-autogrow-textarea.git"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/iron-autogrow-textarea",
+ "ignore": [],
+ "dependencies": {
+ "iron-behaviors": "PolymerElements/iron-behaviors#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "Polymer/web-component-tester#^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/demo/index.html
new file mode 100644
index 00000000000..9b87df87948
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/demo/index.html
@@ -0,0 +1,99 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+ <head>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <title>iron-autogrow-textarea demo</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../iron-autogrow-textarea.html">
+
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles">
+ iron-autogrow-textarea {
+ display: block;
+ width: 200px;
+ margin: 5px 0;
+ }
+
+ textarea {
+ width: 200px;
+ }
+
+ demo-snippet {
+ --demo-snippet-demo: {
+ @apply --layout-vertical;
+ @apply --layout-center-center;
+ }
+ }
+ </style>
+ </custom-style>
+ </head>
+ <body unresolved>
+ <div class="vertical-section-container centered">
+ <h3>An iron-autogrow-textarea grows automatically as more text is entered</h3>
+ <demo-snippet>
+ <template>
+ <iron-autogrow-textarea></iron-autogrow-textarea>
+ </template>
+ </demo-snippet>
+
+ <h3>The maximum height can be controlled either through the <i>max-rows</i>
+ property, or through a fixed max height</h3>
+ <demo-snippet>
+ <template>
+ <iron-autogrow-textarea max-rows="4" placeholder="scrolls after 4 rows"></iron-autogrow-textarea>
+ <iron-autogrow-textarea style="max-height: 50px;" placeholder="scrolls after 50px"></iron-autogrow-textarea>
+ </template>
+ </demo-snippet>
+
+ <h3>The initial height can also be controlled using the <i>rows</i> property,
+ or through a fixed height</h3>
+ <demo-snippet>
+ <template>
+ <iron-autogrow-textarea rows="4" placeholder="start with 4 rows"></iron-autogrow-textarea>
+ <iron-autogrow-textarea style="height: 50px;"></iron-autogrow-textarea>
+ </template>
+ </demo-snippet>
+
+ <h3>Example of updating the value imperatively</h3>
+ <demo-snippet>
+ <template>
+ <dom-bind>
+ <template is="dom-bind">
+ <div class="vertical-section">
+ <iron-autogrow-textarea value="{{value}}" id="a1"></iron-autogrow-textarea>
+ <p>bind to the iron-autogrow-textarea's <code>value</code>: {{value}}</p>
+
+ <br>
+ <p>Imperatively updating <code>ironAutogrowTextarea.value</code> will also update the
+ <code>textarea.value</code></p>
+ <button onclick="a1.value='pineapple'">Set value to 'pineapple'</button>
+
+ <br>
+ <p>Imperatively updating <code>ironAutogrowTextarea.textarea.value</code> will update
+ the display, but not update the internal <code>value</code></p>
+ <button onclick="a1.textarea.value='watermelon'">Set textarea.value to 'watermelon'</button>
+ </div>
+ </template>
+ </dom-bind>
+ </template>
+ </demo-snippet>
+ </div>
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/hero.svg b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/hero.svg
new file mode 100755
index 00000000000..19ec70a0545
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/hero.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">
+<g id="background" display="none">
+ <rect display="inline" fill="#B0BEC5" width="225" height="126"/>
+</g>
+<g id="label">
+</g>
+<g id="art">
+ <path d="M140,47c-3,0-4.7-2.4-6.2-4.4c-1.3-1.9-2.4-3.6-4.7-3.6c-2.3,0-3.4,1.7-4.7,3.6c-1.5,2.1-3.1,4.4-6.4,4.4
+ c-3.3,0-4.9-2.4-6.4-4.4c-1.3-1.9-2.5-3.6-4.8-3.6c-2.3,0-3.4,1.7-4.8,3.6c-1.5,2.1-3.1,4.4-6.4,4.4s-5.2-2.4-6.7-4.4
+ c-1.3-1.9-2-3.6-5-3.6v-2c4,0,5.2,2.4,6.7,4.4c1.3,1.9,2.6,3.6,4.9,3.6c2.3,0,3.5-1.7,4.8-3.6c1.5-2.1,3.1-4.4,6.5-4.4
+ s5,2.4,6.4,4.4c1.3,1.9,2.5,3.6,4.8,3.6c2.3,0,3.4-1.7,4.8-3.6c1.5-2.1,3.1-4.4,6.4-4.4c3.3,0,4.7,2.4,6.2,4.4
+ c1.3,1.9,2.5,3.6,4.5,3.6V47z"/>
+ <path d="M140,65c-3,0-4.7-2.4-6.2-4.4c-1.3-1.9-2.4-3.6-4.7-3.6c-2.3,0-3.4,1.7-4.7,3.6c-1.5,2.1-3.1,4.4-6.4,4.4
+ c-3.3,0-4.9-2.4-6.4-4.4c-1.3-1.9-2.5-3.6-4.8-3.6c-2.3,0-3.4,1.7-4.8,3.6c-1.5,2.1-3.1,4.4-6.4,4.4s-5.2-2.4-6.7-4.4
+ c-1.3-1.9-2-3.6-5-3.6v-2c4,0,5.2,2.4,6.7,4.4c1.3,1.9,2.6,3.6,4.9,3.6c2.3,0,3.5-1.7,4.8-3.6c1.5-2.1,3.1-4.4,6.5-4.4
+ s5,2.4,6.4,4.4c1.3,1.9,2.5,3.6,4.8,3.6c2.3,0,3.4-1.7,4.8-3.6c1.5-2.1,3.1-4.4,6.4-4.4c3.3,0,4.7,2.4,6.2,4.4
+ c1.3,1.9,2.5,3.6,4.5,3.6V65z"/>
+ <path d="M140,83c-3,0-4.7-2.4-6.2-4.4c-1.3-1.9-2.4-3.6-4.7-3.6c-2.3,0-3.4,1.7-4.7,3.6c-1.5,2.1-3.1,4.4-6.4,4.4
+ c-3.3,0-4.9-2.4-6.4-4.4c-1.3-1.9-2.5-3.6-4.8-3.6c-2.3,0-3.4,1.7-4.8,3.6c-1.5,2.1-3.1,4.4-6.4,4.4s-5.2-2.4-6.7-4.4
+ c-1.3-1.9-2-3.6-5-3.6v-2c4,0,5.2,2.4,6.7,4.4c1.3,1.9,2.6,3.6,4.9,3.6c2.3,0,3.5-1.7,4.8-3.6c1.5-2.1,3.1-4.4,6.5-4.4
+ s5,2.4,6.4,4.4c1.3,1.9,2.5,3.6,4.8,3.6c2.3,0,3.4-1.7,4.8-3.6c1.5-2.1,3.1-4.4,6.4-4.4c3.3,0,4.7,2.4,6.2,4.4
+ c1.3,1.9,2.5,3.6,4.5,3.6V83z"/>
+ <g id="ic_x5F_add_x0D_">
+ </g>
+ <path d="M151,102H73V24h78V102z M75,100h74V26H75V100z"/>
+</g>
+<g id="Guides">
+</g>
+</svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/index.html
new file mode 100644
index 00000000000..3be2964faf2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/index.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+
+ <title>iron-autogrow-textarea</title>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../polymer/polymer.html">
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+ </head>
+ <body>
+
+ <iron-component-page></iron-component-page>
+
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/iron-autogrow-textarea.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/iron-autogrow-textarea.d.ts
new file mode 100644
index 00000000000..7f45efcbe61
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/iron-autogrow-textarea.d.ts
@@ -0,0 +1,136 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-autogrow-textarea.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-behaviors/iron-control-state.d.ts" />
+/// <reference path="../iron-flex-layout/iron-flex-layout.d.ts" />
+/// <reference path="../iron-validatable-behavior/iron-validatable-behavior.d.ts" />
+
+/**
+ * `iron-autogrow-textarea` is an element containing a textarea that grows in height as more
+ * lines of input are entered. Unless an explicit height or the `maxRows` property is set, it will
+ * never scroll.
+ *
+ * Example:
+ *
+ * <iron-autogrow-textarea></iron-autogrow-textarea>
+ *
+ * ### Styling
+ *
+ * The following custom properties and mixins are available for styling:
+ *
+ * Custom property | Description | Default
+ * ----------------|-------------|----------
+ * `--iron-autogrow-textarea` | Mixin applied to the textarea | `{}`
+ * `--iron-autogrow-textarea-placeholder` | Mixin applied to the textarea placeholder | `{}`
+ */
+interface IronAutogrowTextareaElement extends Polymer.Element, Polymer.IronValidatableBehavior, Polymer.IronControlState {
+
+ /**
+ * Use this property instead of `bind-value` for two-way data binding.
+ */
+ value: string|number;
+
+ /**
+ * This property is deprecated, and just mirrors `value`. Use `value` instead.
+ */
+ bindValue: string|number;
+
+ /**
+ * The initial number of rows.
+ */
+ rows: number|null|undefined;
+
+ /**
+ * The maximum number of rows this element can grow to until it
+ * scrolls. 0 means no maximum.
+ */
+ maxRows: number|null|undefined;
+
+ /**
+ * Bound to the textarea's `autocomplete` attribute.
+ */
+ autocomplete: string|null|undefined;
+
+ /**
+ * Bound to the textarea's `autofocus` attribute.
+ */
+ autofocus: boolean|null|undefined;
+
+ /**
+ * Bound to the textarea's `inputmode` attribute.
+ */
+ inputmode: string|null|undefined;
+
+ /**
+ * Bound to the textarea's `placeholder` attribute.
+ */
+ placeholder: string|null|undefined;
+
+ /**
+ * Bound to the textarea's `readonly` attribute.
+ */
+ readonly: string|null|undefined;
+
+ /**
+ * Set to true to mark the textarea as required.
+ */
+ required: boolean|null|undefined;
+
+ /**
+ * The minimum length of the input value.
+ */
+ minlength: number|null|undefined;
+
+ /**
+ * The maximum length of the input value.
+ */
+ maxlength: number|null|undefined;
+
+ /**
+ * Bound to the textarea's `aria-label` attribute.
+ */
+ label: string|null|undefined;
+
+ /**
+ * Returns the underlying textarea.
+ */
+ readonly textarea: HTMLTextAreaElement;
+
+ /**
+ * Returns textarea's selection start.
+ */
+ selectionStart: number;
+
+ /**
+ * Returns textarea's selection end.
+ */
+ selectionEnd: number;
+
+ /**
+ * Returns true if `value` is valid. The validator provided in `validator`
+ * will be used first, if it exists; otherwise, the `textarea`'s validity
+ * is used.
+ *
+ * @returns True if the value is valid.
+ */
+ validate(): boolean;
+ attached(): void;
+ _bindValueChanged(bindValue: any): void;
+ _valueChanged(value: any): void;
+ _onInput(event: any): void;
+ _constrain(tokens: any): any;
+ _valueForMirror(): any;
+ _updateCached(): void;
+}
+
+interface HTMLElementTagNameMap {
+ "iron-autogrow-textarea": IronAutogrowTextareaElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/iron-autogrow-textarea.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/iron-autogrow-textarea.html
new file mode 100644
index 00000000000..f46bc2ddad6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/iron-autogrow-textarea.html
@@ -0,0 +1,384 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-behaviors/iron-control-state.html">
+<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="../iron-validatable-behavior/iron-validatable-behavior.html">
+
+<!--
+`iron-autogrow-textarea` is an element containing a textarea that grows in height as more
+lines of input are entered. Unless an explicit height or the `maxRows` property is set, it will
+never scroll.
+
+Example:
+
+ <iron-autogrow-textarea></iron-autogrow-textarea>
+
+### Styling
+
+The following custom properties and mixins are available for styling:
+
+Custom property | Description | Default
+----------------|-------------|----------
+`--iron-autogrow-textarea` | Mixin applied to the textarea | `{}`
+`--iron-autogrow-textarea-placeholder` | Mixin applied to the textarea placeholder | `{}`
+
+@group Iron Elements
+@hero hero.svg
+@demo demo/index.html
+-->
+
+<dom-module id="iron-autogrow-textarea">
+ <template>
+ <style>
+ :host {
+ display: inline-block;
+ position: relative;
+ width: 400px;
+ border: 1px solid;
+ padding: 2px;
+ -moz-appearance: textarea;
+ -webkit-appearance: textarea;
+ overflow: hidden;
+ }
+
+ .mirror-text {
+ visibility: hidden;
+ word-wrap: break-word;
+ @apply --iron-autogrow-textarea;
+ }
+
+ .fit {
+ @apply --layout-fit;
+ }
+
+ textarea {
+ position: relative;
+ outline: none;
+ border: none;
+ resize: none;
+ background: inherit;
+ color: inherit;
+ /* see comments in template */
+ width: 100%;
+ height: 100%;
+ font-size: inherit;
+ font-family: inherit;
+ line-height: inherit;
+ text-align: inherit;
+ @apply --iron-autogrow-textarea;
+ }
+
+ textarea::-webkit-input-placeholder {
+ @apply --iron-autogrow-textarea-placeholder;
+ }
+
+ textarea:-moz-placeholder {
+ @apply --iron-autogrow-textarea-placeholder;
+ }
+
+ textarea::-moz-placeholder {
+ @apply --iron-autogrow-textarea-placeholder;
+ }
+
+ textarea:-ms-input-placeholder {
+ @apply --iron-autogrow-textarea-placeholder;
+ }
+ </style>
+
+ <!-- the mirror sizes the input/textarea so it grows with typing -->
+ <!-- use &#160; instead &nbsp; of to allow this element to be used in XHTML -->
+ <div id="mirror" class="mirror-text" aria-hidden="true">&#160;</div>
+
+ <!-- size the input/textarea with a div, because the textarea has intrinsic size in ff -->
+ <div class="textarea-container fit">
+ <textarea id="textarea"
+ name$="[[name]]"
+ aria-label$="[[label]]"
+ autocomplete$="[[autocomplete]]"
+ autofocus$="[[autofocus]]"
+ inputmode$="[[inputmode]]"
+ placeholder$="[[placeholder]]"
+ readonly$="[[readonly]]"
+ required$="[[required]]"
+ disabled$="[[disabled]]"
+ rows$="[[rows]]"
+ minlength$="[[minlength]]"
+ maxlength$="[[maxlength]]"></textarea>
+ </div>
+ </template>
+</dom-module>
+
+<script>
+
+ Polymer({
+
+ is: 'iron-autogrow-textarea',
+
+ behaviors: [
+ Polymer.IronValidatableBehavior,
+ Polymer.IronControlState
+ ],
+
+ properties: {
+ /**
+ * Use this property instead of `bind-value` for two-way data binding.
+ * @type {string|number}
+ */
+ value: {
+ observer: '_valueChanged',
+ type: String,
+ notify: true
+ },
+
+ /**
+ * This property is deprecated, and just mirrors `value`. Use `value` instead.
+ * @type {string|number}
+ */
+ bindValue: {
+ observer: '_bindValueChanged',
+ type: String,
+ notify: true
+ },
+
+ /**
+ * The initial number of rows.
+ *
+ * @attribute rows
+ * @type number
+ * @default 1
+ */
+ rows: {
+ type: Number,
+ value: 1,
+ observer: '_updateCached'
+ },
+
+ /**
+ * The maximum number of rows this element can grow to until it
+ * scrolls. 0 means no maximum.
+ *
+ * @attribute maxRows
+ * @type number
+ * @default 0
+ */
+ maxRows: {
+ type: Number,
+ value: 0,
+ observer: '_updateCached'
+ },
+
+ /**
+ * Bound to the textarea's `autocomplete` attribute.
+ */
+ autocomplete: {
+ type: String,
+ value: 'off'
+ },
+
+ /**
+ * Bound to the textarea's `autofocus` attribute.
+ */
+ autofocus: {
+ type: Boolean,
+ value: false
+ },
+
+ /**
+ * Bound to the textarea's `inputmode` attribute.
+ */
+ inputmode: {
+ type: String
+ },
+
+ /**
+ * Bound to the textarea's `placeholder` attribute.
+ */
+ placeholder: {
+ type: String
+ },
+
+ /**
+ * Bound to the textarea's `readonly` attribute.
+ */
+ readonly: {
+ type: String
+ },
+
+ /**
+ * Set to true to mark the textarea as required.
+ */
+ required: {
+ type: Boolean
+ },
+
+ /**
+ * The minimum length of the input value.
+ */
+ minlength: {
+ type: Number
+ },
+
+ /**
+ * The maximum length of the input value.
+ */
+ maxlength: {
+ type: Number
+ },
+
+ /**
+ * Bound to the textarea's `aria-label` attribute.
+ */
+ label: {
+ type: String
+ }
+
+ },
+
+ listeners: {
+ 'input': '_onInput'
+ },
+
+ /**
+ * Returns the underlying textarea.
+ * @return {!HTMLTextAreaElement}
+ */
+ get textarea() {
+ return this.$.textarea;
+ },
+
+ /**
+ * Returns textarea's selection start.
+ * @return {number}
+ */
+ get selectionStart() {
+ return this.$.textarea.selectionStart;
+ },
+
+ /**
+ * Returns textarea's selection end.
+ * @return {number}
+ */
+ get selectionEnd() {
+ return this.$.textarea.selectionEnd;
+ },
+
+ /**
+ * Sets the textarea's selection start.
+ */
+ set selectionStart(value) {
+ this.$.textarea.selectionStart = value;
+ },
+
+ /**
+ * Sets the textarea's selection end.
+ */
+ set selectionEnd(value) {
+ this.$.textarea.selectionEnd = value;
+ },
+
+ attached: function() {
+ /* iOS has an arbitrary left margin of 3px that isn't present
+ * in any other browser, and means that the paper-textarea's cursor
+ * overlaps the label.
+ * See https://github.com/PolymerElements/paper-input/issues/468.
+ */
+ var IS_IOS = navigator.userAgent.match(/iP(?:[oa]d|hone)/);
+ if (IS_IOS) {
+ this.$.textarea.style.marginLeft = '-3px';
+ }
+ },
+
+ /**
+ * Returns true if `value` is valid. The validator provided in `validator`
+ * will be used first, if it exists; otherwise, the `textarea`'s validity
+ * is used.
+ * @return {boolean} True if the value is valid.
+ */
+ validate: function() {
+ // Use the nested input's native validity.
+ var valid = this.$.textarea.validity.valid;
+
+ // Only do extra checking if the browser thought this was valid.
+ if (valid) {
+ // Empty, required input is invalid
+ if (this.required && this.value === '') {
+ valid = false;
+ } else if (this.hasValidator()) {
+ valid = Polymer.IronValidatableBehavior.validate.call(this, this.value);
+ }
+ }
+
+ this.invalid = !valid;
+ this.fire('iron-input-validate');
+ return valid;
+ },
+
+ _bindValueChanged: function(bindValue) {
+ this.value = bindValue;
+ },
+
+ _valueChanged: function(value) {
+ var textarea = this.textarea;
+ if (!textarea) {
+ return;
+ }
+
+ // If the bindValue changed manually, then we need to also update
+ // the underlying textarea's value. Otherwise this change was probably
+ // generated from the _onInput handler, and the two values are already
+ // the same.
+ if (textarea.value !== value) {
+ textarea.value = !(value || value === 0) ? '' : value;
+ }
+
+ this.bindValue = value;
+ this.$.mirror.innerHTML = this._valueForMirror();
+
+ // Manually notify because we don't want to notify until after setting value.
+ this.fire('bind-value-changed', {value: this.bindValue});
+ },
+
+ _onInput: function(event) {
+ var eventPath = Polymer.dom(event).path;
+ this.value = eventPath ? eventPath[0].value : event.target.value;
+ },
+
+ _constrain: function(tokens) {
+ var _tokens;
+ tokens = tokens || [''];
+ // Enforce the min and max heights for a multiline input to avoid measurement
+ if (this.maxRows > 0 && tokens.length > this.maxRows) {
+ _tokens = tokens.slice(0, this.maxRows);
+ } else {
+ _tokens = tokens.slice(0);
+ }
+ while (this.rows > 0 && _tokens.length < this.rows) {
+ _tokens.push('');
+ }
+ // Use &#160; instead &nbsp; of to allow this element to be used in XHTML.
+ return _tokens.join('<br/>') + '&#160;';
+ },
+
+ _valueForMirror: function() {
+ var input = this.textarea;
+ if (!input) {
+ return;
+ }
+ this.tokens = (input && input.value) ? input.value.replace(/&/gm, '&amp;').replace(/"/gm, '&quot;').replace(/'/gm, '&#39;').replace(/</gm, '&lt;').replace(/>/gm, '&gt;').split('\n') : [''];
+ return this._constrain(this.tokens);
+ },
+
+ _updateCached: function() {
+ this.$.mirror.innerHTML = this._constrain(this.tokens);
+ },
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/package-lock.json
new file mode 100644
index 00000000000..cd64a5299c4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/package-lock.json
@@ -0,0 +1,974 @@
+{
+ "name": "@polymer/iron-autogrow-textarea",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.0.tgz",
+ "integrity": "sha512-a5DFXI3TdZSVOMH4608LVaBLmcr+mwM2+B8OSBiB9WFNCtdqzUXwtB5We6vBzrThXlO4uRo7d2pEqjNXMAlEkA==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.0",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "4.1.0",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.0",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.12"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz",
+ "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.6.tgz",
+ "integrity": "sha512-CTUtLb6WqCCgp6P59QintjHWqzf4VL1uPA27bipLAPxFqrtK1gEYllePzTICGqQ8rYsCbpnsNypXjjDzGAAjEQ==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.8.tgz",
+ "integrity": "sha512-QqR0j08RCS1AQYPMRPHikEpcmK+2aEEbcSzWLwOqyJ4FhLmHUx/WjRrnn7tTQg/y4IKnMhzskh/o7qvGIZZ7iA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.0.0.tgz",
+ "integrity": "sha512-v+0wW9Wezwsyb0uF4aBVCjmSqit3Ru7PZFziGF0o2KwTvN2zWfTi3BRLq9EkJFdg3eBbyERXGTntVpBxH1J68Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.2",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
+ "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "4.0.0",
+ "array-back": "2.0.0",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz",
+ "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.5.7"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.8",
+ "winston": "2.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-QQL70IC85hI6q9uQeresEMcT1Qf8YR/zDe1qG8WWeeFAZk8z0lmzUpsfcAWz+bM4wpDdXrtd4HitIs4p0CHl/w==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.101",
+ "@types/parse5": "2.2.34",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "polymer-project-config": "3.8.1",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.1"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.8.1.tgz",
+ "integrity": "sha512-MLvnM9gexFWg7nynY24eHZG6NLXocmk718sVds/sx2CAJ6iihhC0JMhhOIa6jnad9KQrHyGl/cs3mMRaaub5Fg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.101",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.1.tgz",
+ "integrity": "sha1-Eahr7+rDxKo+wIYjZRo8gabQu8g=",
+ "dev": true
+ },
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/package.json
new file mode 100644
index 00000000000..f29402fe973
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-autogrow-textarea/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@polymer/iron-autogrow-textarea",
+ "private": true,
+ "description": "A textarea element that automatically grows with input",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-autogrow-textarea.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir ."
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/.bower.json
new file mode 100644
index 00000000000..1043fd4f0f3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/.bower.json
@@ -0,0 +1,63 @@
+{
+ "name": "iron-behaviors",
+ "version": "2.1.1",
+ "description": "Provides a set of behaviors for the iron elements",
+ "private": true,
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-behaviors.git"
+ },
+ "main": [
+ "iron-button-state.html",
+ "iron-control-state.html"
+ ],
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#1 - 2"
+ },
+ "devDependencies": {
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "paper-input": "PolymerElements/paper-input#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "ignore": [],
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0"
+ },
+ "devDependencies": {
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "paper-input": "PolymerElements/paper-input#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "Polymer/web-component-tester#^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "homepage": "https://github.com/PolymerElements/iron-behaviors",
+ "_release": "2.1.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.1",
+ "commit": "a27b45bebb2af58506af77c377dab301bf7406ce"
+ },
+ "_source": "https://github.com/PolymerElements/iron-behaviors.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/iron-behaviors"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/.github/CODEOWNERS
new file mode 100644
index 00000000000..cc86f1ec217
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @notwaldorf
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..1cc85c0c790
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-behaviors/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/.travis.yml
new file mode 100644
index 00000000000..bf521e2a1a4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/.travis.yml
@@ -0,0 +1,30 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+env:
+ global:
+ - secure: >-
+ H49pcRc5C6G+ti/ehtT74GZdsUsM/xCvEVJBmKq8rpck7s18R6BbH37RkF2XgYfO4rVa1Bl4KU4Wf5S6aIDYzdaq/phGtFQ04NmDYGbmBhRjwfgxlW4dJ7mkXqXCvNZkxJtAJpgzgVG+xu/I6GsO1Lp4VjGENvVYSsrkGIlSA34=
+ - secure: >-
+ Zq+hvOlL1RmTtMfAtO3bxqYnB7X6MY199cVCKo2J/EbsMvOHII1JvEU1+s2/UG9tgoiXkd7N2OfFOivlbQ75BDIwtvkq32KZNrUEC6vRGhbMBc8JCKkdFB/XHh1mNhQcn6Js656PhZIj2WteZYMSGYDUj7KcBBMacRZQKWuB0OU=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+ sauce_connect: true
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/README.md
new file mode 100644
index 00000000000..0a0629ec7e1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/README.md
@@ -0,0 +1,22 @@
+
+<!---
+
+This README is automatically generated from the comments in these files:
+iron-button-state.html iron-control-state.html
+
+Edit those files, and our readme bot will duplicate them over here!
+Edit this file, and the bot will squash your changes :)
+
+The bot does some handling of markdown. Please file a bug if it does the wrong
+thing! https://github.com/PolymerLabs/tedium/issues
+
+-->
+
+[![Build status](https://travis-ci.org/PolymerElements/iron-behaviors.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-behaviors)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/iron-behaviors)_
+
+
+<!-- No docs for Polymer.IronButtonState found. -->
+
+<!-- No docs for Polymer.IronControlState found. -->
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/bower.json
new file mode 100644
index 00000000000..6350520227f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/bower.json
@@ -0,0 +1,53 @@
+{
+ "name": "iron-behaviors",
+ "version": "2.1.1",
+ "description": "Provides a set of behaviors for the iron elements",
+ "private": true,
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-behaviors.git"
+ },
+ "main": [
+ "iron-button-state.html",
+ "iron-control-state.html"
+ ],
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#1 - 2"
+ },
+ "devDependencies": {
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "paper-input": "PolymerElements/paper-input#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "ignore": [],
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0"
+ },
+ "devDependencies": {
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "paper-input": "PolymerElements/paper-input#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "Polymer/web-component-tester#^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/demo/index.html
new file mode 100644
index 00000000000..e7cbdcc6f1d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/demo/index.html
@@ -0,0 +1,48 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <title>simple-button</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link href="../../paper-styles/demo-pages.html" rel="import">
+ <link href="simple-button.html" rel="import">
+
+ <style>
+
+ .vertical-section {
+ text-align: center;
+ }
+
+ </style>
+
+</head>
+<body unresolved>
+ <div class="vertical-section vertical-section-container centered">
+ <h3>Normal</h3>
+
+ <simple-button tabindex="0">Hello World</simple-button>
+
+ <h3>Toggles</h3>
+
+ <simple-button toggles tabindex="0">Hello World</simple-button>
+
+ <h3>Disabled</h3>
+
+ <simple-button disabled tabindex="0">Hello World</simple-button>
+ </div>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/demo/simple-button.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/demo/simple-button.html
new file mode 100644
index 00000000000..2c3aeefff57
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/demo/simple-button.html
@@ -0,0 +1,74 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../iron-button-state.html">
+<link rel="import" href="../iron-control-state.html">
+
+<dom-module id="simple-button">
+ <template>
+ <style>
+ :host {
+ display: inline-block;
+ background-color: #4285F4;
+ color: #fff;
+ min-height: 8px;
+ min-width: 8px;
+ padding: 16px;
+ text-transform: uppercase;
+ border-radius: 3px;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ -webkit-user-select: none;
+ user-select: none;
+ cursor: pointer;
+ }
+
+ :host([disabled]) {
+ opacity: 0.3;
+ pointer-events: none;
+ }
+
+ :host([active]),
+ :host([pressed]) {
+ background-color: #3367D6;
+ box-shadow: inset 0 3px 5px rgba(0,0,0,.2);
+ }
+
+ :host([focused]) {
+ box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14),
+ 0 6px 30px 5px rgba(0, 0, 0, 0.12),
+ 0 8px 10px -5px rgba(0, 0, 0, 0.4);
+ }
+ </style>
+
+ <slot></slot>
+
+ </template>
+
+ <script>
+
+ Polymer({
+
+ is: 'simple-button',
+
+ behaviors: [
+ Polymer.IronControlState,
+ Polymer.IronButtonState
+ ],
+
+ hostAttributes: {
+ role: 'button'
+ }
+ });
+
+ </script>
+
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/index.html
new file mode 100644
index 00000000000..220deb00349
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/index.html
@@ -0,0 +1,27 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <title>Iron Behaviors</title>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page src="iron-button-state.html"></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/iron-button-state.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/iron-button-state.d.ts
new file mode 100644
index 00000000000..9a231cb3a35
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/iron-button-state.d.ts
@@ -0,0 +1,88 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-button-state.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.d.ts" />
+/// <reference path="iron-control-state.d.ts" />
+
+declare namespace Polymer {
+
+ interface IronButtonState extends Polymer.IronA11yKeysBehavior {
+ keyBindings: object;
+
+ /**
+ * If true, the user is currently holding down the button.
+ */
+ readonly pressed: boolean|null|undefined;
+
+ /**
+ * If true, the button toggles the active state with each tap or press
+ * of the spacebar.
+ */
+ toggles: boolean|null|undefined;
+
+ /**
+ * If true, the button is a toggle and is currently in the active state.
+ */
+ active: boolean|null|undefined;
+
+ /**
+ * True if the element is currently being pressed by a "pointer," which
+ * is loosely defined as mouse or touch input (but specifically excluding
+ * keyboard input).
+ */
+ readonly pointerDown: boolean|null|undefined;
+
+ /**
+ * True if the input device that caused the element to receive focus
+ * was a keyboard.
+ */
+ readonly receivedFocusFromKeyboard: boolean|null|undefined;
+
+ /**
+ * The aria attribute to be set if the button is a toggle and in the
+ * active state.
+ */
+ ariaActiveAttribute: string|null|undefined;
+ _mouseEventRe: RegExp|null;
+ _tapHandler(): void;
+ _focusChanged(focused: any): void;
+ _detectKeyboardFocus(focused: any): void;
+
+ /**
+ * 'change' events
+ */
+ _userActivate(active: any): void;
+ _downHandler(event: any): void;
+ _upHandler(): void;
+
+ /**
+ * @param event .
+ */
+ _spaceKeyDownHandler(event: KeyboardEvent): void;
+
+ /**
+ * @param event .
+ */
+ _spaceKeyUpHandler(event: KeyboardEvent): void;
+
+ /**
+ * event handler to unwind before triggering another event
+ */
+ _asyncClick(): void;
+ _pressedChanged(pressed: any): void;
+ _ariaActiveAttributeChanged(value: any, oldValue: any): void;
+ _activeChanged(active: any, ariaActiveAttribute: any): void;
+ _controlStateChanged(): void;
+ _changedButtonState(): void;
+ }
+
+ const IronButtonState: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/iron-button-state.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/iron-button-state.html
new file mode 100644
index 00000000000..45e5d313818
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/iron-button-state.html
@@ -0,0 +1,239 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
+<link rel="import" href="iron-control-state.html">
+
+<script>
+
+ /**
+ * @demo demo/index.html
+ * @polymerBehavior Polymer.IronButtonState
+ */
+ Polymer.IronButtonStateImpl = {
+
+ properties: {
+
+ /**
+ * If true, the user is currently holding down the button.
+ */
+ pressed: {
+ type: Boolean,
+ readOnly: true,
+ value: false,
+ reflectToAttribute: true,
+ observer: '_pressedChanged'
+ },
+
+ /**
+ * If true, the button toggles the active state with each tap or press
+ * of the spacebar.
+ */
+ toggles: {
+ type: Boolean,
+ value: false,
+ reflectToAttribute: true
+ },
+
+ /**
+ * If true, the button is a toggle and is currently in the active state.
+ */
+ active: {
+ type: Boolean,
+ value: false,
+ notify: true,
+ reflectToAttribute: true
+ },
+
+ /**
+ * True if the element is currently being pressed by a "pointer," which
+ * is loosely defined as mouse or touch input (but specifically excluding
+ * keyboard input).
+ */
+ pointerDown: {
+ type: Boolean,
+ readOnly: true,
+ value: false
+ },
+
+ /**
+ * True if the input device that caused the element to receive focus
+ * was a keyboard.
+ */
+ receivedFocusFromKeyboard: {
+ type: Boolean,
+ readOnly: true
+ },
+
+ /**
+ * The aria attribute to be set if the button is a toggle and in the
+ * active state.
+ */
+ ariaActiveAttribute: {
+ type: String,
+ value: 'aria-pressed',
+ observer: '_ariaActiveAttributeChanged'
+ }
+ },
+
+ listeners: {
+ down: '_downHandler',
+ up: '_upHandler',
+ tap: '_tapHandler'
+ },
+
+ observers: [
+ '_focusChanged(focused)',
+ '_activeChanged(active, ariaActiveAttribute)'
+ ],
+
+ /**
+ * @type {!Object}
+ */
+ keyBindings: {
+ 'enter:keydown': '_asyncClick',
+ 'space:keydown': '_spaceKeyDownHandler',
+ 'space:keyup': '_spaceKeyUpHandler',
+ },
+
+ _mouseEventRe: /^mouse/,
+
+ _tapHandler: function() {
+ if (this.toggles) {
+ // a tap is needed to toggle the active state
+ this._userActivate(!this.active);
+ } else {
+ this.active = false;
+ }
+ },
+
+ _focusChanged: function(focused) {
+ this._detectKeyboardFocus(focused);
+
+ if (!focused) {
+ this._setPressed(false);
+ }
+ },
+
+ _detectKeyboardFocus: function(focused) {
+ this._setReceivedFocusFromKeyboard(!this.pointerDown && focused);
+ },
+
+ // to emulate native checkbox, (de-)activations from a user interaction fire
+ // 'change' events
+ _userActivate: function(active) {
+ if (this.active !== active) {
+ this.active = active;
+ this.fire('change');
+ }
+ },
+
+ _downHandler: function(event) {
+ this._setPointerDown(true);
+ this._setPressed(true);
+ this._setReceivedFocusFromKeyboard(false);
+ },
+
+ _upHandler: function() {
+ this._setPointerDown(false);
+ this._setPressed(false);
+ },
+
+ /**
+ * @param {!KeyboardEvent} event .
+ */
+ _spaceKeyDownHandler: function(event) {
+ var keyboardEvent = event.detail.keyboardEvent;
+ var target = Polymer.dom(keyboardEvent).localTarget;
+
+ // Ignore the event if this is coming from a focused light child, since that
+ // element will deal with it.
+ if (this.isLightDescendant(/** @type {Node} */(target)))
+ return;
+
+ keyboardEvent.preventDefault();
+ keyboardEvent.stopImmediatePropagation();
+ this._setPressed(true);
+ },
+
+ /**
+ * @param {!KeyboardEvent} event .
+ */
+ _spaceKeyUpHandler: function(event) {
+ var keyboardEvent = event.detail.keyboardEvent;
+ var target = Polymer.dom(keyboardEvent).localTarget;
+
+ // Ignore the event if this is coming from a focused light child, since that
+ // element will deal with it.
+ if (this.isLightDescendant(/** @type {Node} */(target)))
+ return;
+
+ if (this.pressed) {
+ this._asyncClick();
+ }
+ this._setPressed(false);
+ },
+
+ // trigger click asynchronously, the asynchrony is useful to allow one
+ // event handler to unwind before triggering another event
+ _asyncClick: function() {
+ this.async(function() {
+ this.click();
+ }, 1);
+ },
+
+ // any of these changes are considered a change to button state
+
+ _pressedChanged: function(pressed) {
+ this._changedButtonState();
+ },
+
+ _ariaActiveAttributeChanged: function(value, oldValue) {
+ if (oldValue && oldValue != value && this.hasAttribute(oldValue)) {
+ this.removeAttribute(oldValue);
+ }
+ },
+
+ _activeChanged: function(active, ariaActiveAttribute) {
+ if (this.toggles) {
+ this.setAttribute(this.ariaActiveAttribute,
+ active ? 'true' : 'false');
+ } else {
+ this.removeAttribute(this.ariaActiveAttribute);
+ }
+ this._changedButtonState();
+ },
+
+ _controlStateChanged: function() {
+ if (this.disabled) {
+ this._setPressed(false);
+ } else {
+ this._changedButtonState();
+ }
+ },
+
+ // provide hook for follow-on behaviors to react to button-state
+
+ _changedButtonState: function() {
+ if (this._buttonStateChanged) {
+ this._buttonStateChanged(); // abstract
+ }
+ }
+
+ };
+
+ /** @polymerBehavior */
+ Polymer.IronButtonState = [
+ Polymer.IronA11yKeysBehavior,
+ Polymer.IronButtonStateImpl
+ ];
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/iron-control-state.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/iron-control-state.d.ts
new file mode 100644
index 00000000000..9082c66a301
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/iron-control-state.d.ts
@@ -0,0 +1,40 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-control-state.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+
+declare namespace Polymer {
+
+ interface IronControlState {
+
+ /**
+ * If true, the element currently has focus.
+ */
+ readonly focused: boolean|null|undefined;
+
+ /**
+ * If true, the user cannot interact with this element.
+ */
+ disabled: boolean|null|undefined;
+
+ /**
+ * Value of the `tabindex` attribute before `disabled` was activated.
+ * `null` means the attribute was not present.
+ */
+ _oldTabIndex: string|null|undefined;
+ _boundFocusBlurHandler: Function|null|undefined;
+ ready(): void;
+ _focusBlurHandler(event: any): void;
+ _disabledChanged(disabled: any, old: any): void;
+ _changedControlState(): void;
+ }
+
+ const IronControlState: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/iron-control-state.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/iron-control-state.html
new file mode 100644
index 00000000000..100ac3977c9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/iron-control-state.html
@@ -0,0 +1,137 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<script>
+
+ /**
+ * @demo demo/index.html
+ * @polymerBehavior
+ */
+ Polymer.IronControlState = {
+
+ properties: {
+
+ /**
+ * If true, the element currently has focus.
+ */
+ focused: {
+ type: Boolean,
+ value: false,
+ notify: true,
+ readOnly: true,
+ reflectToAttribute: true
+ },
+
+ /**
+ * If true, the user cannot interact with this element.
+ */
+ disabled: {
+ type: Boolean,
+ value: false,
+ notify: true,
+ observer: '_disabledChanged',
+ reflectToAttribute: true
+ },
+
+ /**
+ * Value of the `tabindex` attribute before `disabled` was activated.
+ * `null` means the attribute was not present.
+ * @type {?string|undefined}
+ */
+ _oldTabIndex: {
+ type: String
+ },
+
+ _boundFocusBlurHandler: {
+ type: Function,
+ value: function() {
+ return this._focusBlurHandler.bind(this);
+ }
+ },
+
+ __handleEventRetargeting: {
+ type: Boolean,
+ value: function() {
+ return !this.shadowRoot && !Polymer.Element;
+ }
+ }
+ },
+
+ observers: [
+ '_changedControlState(focused, disabled)'
+ ],
+
+ /**
+ * @return {void}
+ */
+ ready: function() {
+ this.addEventListener('focus', this._boundFocusBlurHandler, true);
+ this.addEventListener('blur', this._boundFocusBlurHandler, true);
+ },
+
+ _focusBlurHandler: function(event) {
+ // In Polymer 2.0, the library takes care of retargeting events.
+ if (Polymer.Element) {
+ this._setFocused(event.type === 'focus');
+ return;
+ }
+
+ // NOTE(cdata): if we are in ShadowDOM land, `event.target` will
+ // eventually become `this` due to retargeting; if we are not in
+ // ShadowDOM land, `event.target` will eventually become `this` due
+ // to the second conditional which fires a synthetic event (that is also
+ // handled). In either case, we can disregard `event.path`.
+ if (event.target === this) {
+ this._setFocused(event.type === 'focus');
+ } else if (this.__handleEventRetargeting) {
+ var target = /** @type {Node} */(Polymer.dom(event).localTarget);
+ if (!this.isLightDescendant(target)) {
+ this.fire(event.type, {sourceEvent: event}, {
+ node: this,
+ bubbles: event.bubbles,
+ cancelable: event.cancelable
+ });
+ }
+ }
+ },
+
+ _disabledChanged: function(disabled, old) {
+ this.setAttribute('aria-disabled', disabled ? 'true' : 'false');
+ this.style.pointerEvents = disabled ? 'none' : '';
+ if (disabled) {
+ // Read the `tabindex` attribute instead of the `tabIndex` property.
+ // The property returns `-1` if there is no `tabindex` attribute.
+ // This distinction is important when restoring the value because
+ // leaving `-1` hides shadow root children from the tab order.
+ this._oldTabIndex = this.getAttribute('tabindex');
+ this._setFocused(false);
+ this.tabIndex = -1;
+ this.blur();
+ } else if (this._oldTabIndex !== undefined) {
+ if (this._oldTabIndex === null) {
+ this.removeAttribute('tabindex');
+ } else {
+ this.setAttribute('tabindex', this._oldTabIndex);
+ }
+ }
+ },
+
+ _changedControlState: function() {
+ // _controlStateChanged is abstract, follow-on behaviors may implement it
+ if (this._controlStateChanged) {
+ this._controlStateChanged();
+ }
+ }
+
+ };
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/package-lock.json
new file mode 100644
index 00000000000..fcd0a62fac9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/package-lock.json
@@ -0,0 +1,974 @@
+{
+ "name": "@polymer/iron-behaviors",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.0.tgz",
+ "integrity": "sha512-a5DFXI3TdZSVOMH4608LVaBLmcr+mwM2+B8OSBiB9WFNCtdqzUXwtB5We6vBzrThXlO4uRo7d2pEqjNXMAlEkA==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.0",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "4.1.0",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.0",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.12"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz",
+ "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.6.tgz",
+ "integrity": "sha512-CTUtLb6WqCCgp6P59QintjHWqzf4VL1uPA27bipLAPxFqrtK1gEYllePzTICGqQ8rYsCbpnsNypXjjDzGAAjEQ==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.8.tgz",
+ "integrity": "sha512-QqR0j08RCS1AQYPMRPHikEpcmK+2aEEbcSzWLwOqyJ4FhLmHUx/WjRrnn7tTQg/y4IKnMhzskh/o7qvGIZZ7iA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.0.0.tgz",
+ "integrity": "sha512-v+0wW9Wezwsyb0uF4aBVCjmSqit3Ru7PZFziGF0o2KwTvN2zWfTi3BRLq9EkJFdg3eBbyERXGTntVpBxH1J68Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.2",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
+ "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "4.0.0",
+ "array-back": "2.0.0",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz",
+ "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.5.7"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.8",
+ "winston": "2.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-QQL70IC85hI6q9uQeresEMcT1Qf8YR/zDe1qG8WWeeFAZk8z0lmzUpsfcAWz+bM4wpDdXrtd4HitIs4p0CHl/w==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.101",
+ "@types/parse5": "2.2.34",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "polymer-project-config": "3.8.1",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.1"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.8.1.tgz",
+ "integrity": "sha512-MLvnM9gexFWg7nynY24eHZG6NLXocmk718sVds/sx2CAJ6iihhC0JMhhOIa6jnad9KQrHyGl/cs3mMRaaub5Fg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.101",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.1.tgz",
+ "integrity": "sha1-Eahr7+rDxKo+wIYjZRo8gabQu8g=",
+ "dev": true
+ },
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/package.json
new file mode 100644
index 00000000000..85ff46c8ccc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-behaviors/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@polymer/iron-behaviors",
+ "private": true,
+ "description": "Provides a set of behaviors for the iron elements",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-behaviors.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir ."
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/.bower.json
new file mode 100644
index 00000000000..c20553a6889
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/.bower.json
@@ -0,0 +1,64 @@
+{
+ "name": "iron-checked-element-behavior",
+ "version": "2.1.1",
+ "description": "Implements an element that has a checked attribute and can be added to a form",
+ "authors": "The Polymer Authors",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "iron",
+ "behavior"
+ ],
+ "main": "iron-checked-element-behavior.html",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-checked-element-behavior.git"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/iron-checked-element-behavior",
+ "ignore": [],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#1 - 2",
+ "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#1 - 2"
+ },
+ "devDependencies": {
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "paper-button": "PolymerElements/paper-button#1 - 2",
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#^1.0.0",
+ "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0"
+ },
+ "devDependencies": {
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "paper-button": "PolymerElements/paper-button#^1.0.0",
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "Polymer/web-component-tester#^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.1.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.1",
+ "commit": "2081eb82a4ee7f7045e5b8b0dcfbfefc229ef37f"
+ },
+ "_source": "https://github.com/PolymerElements/iron-checked-element-behavior.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/iron-checked-element-behavior"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/.github/CODEOWNERS
new file mode 100644
index 00000000000..0d8c0ad6b48
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @bicknellr
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..2d520b47239
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-checked-element-behavior/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/.travis.yml
new file mode 100644
index 00000000000..e1b366bd6fd
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/.travis.yml
@@ -0,0 +1,33 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e '\n\033[31mERROR:\033[0m
+ Project is not formatted. Please run "npm run format".' && false)
+env:
+ global:
+ - secure: >-
+ zj5WTkJrZAy1QK0j65jHEsHluT4B/PZl0u3iVEWnyd4CSUbHh3rS5NytZTA8wZ63DYnUcrdbhPeIQI3UKaVBUM2MO/K4MwsC2YTRpifpCLbC+wlRV9WRZNZ9CJ3hu6leshOBWHzZucUWAcKtyQRm66rAU+90ZaJcrBPC/xtgPG1n/Bm2aygr5IA36vJy80Zpwk1+yFmb08eu7jpzNVhcFor+VX0gBW3rxeX0kvzhHGn0bTLxKztNB56Oe+bzx6vU8ACjBcSylouOtPJVIk/iIh7AIDHDcpoZGzmwtVnwAV2mJQtu3V8hQ2kE8eXpDloBGID+AUfTF3YSOVQo34I1yv4T+FlB7uxWrgJo80X5IRXUe15+OoXqraZ25v736RPdTWPjV2b6cWHqdOa45wODkDY0KZ9SrmwZibF3vcfVOG21llW2jF/HC5FvDIiM7gv1ro5jsFbEIwv7ligh0KKa+TOZBphL4sEtMrpxR/zXLqBLXUbKL54A+AefHelxjDIqT3oKQylesrGZ58fEF7Fx5xDSYGJwhIEwTLsEQWIWw8sWB34yRtDBIPocqh8nNZ9pJBOdhK3oC5KK44IQnE44YrIzLRRinHzRVoywpUb5OJDxxSSvOwcqmTYbkFmRJMzfJCEj/EtYsEokmSFv8zIRRDetvenBTGouNK/VsU9xQpA=
+ - secure: >-
+ Q3xN3fRvTQuy/HKlkYFFnVrFo01r6Q8zgzHHK8yKNKio9T/BM0+iIMYP8mRY+qvCQxCboXuUawG6gsxxT2Zn/p7SgNZ+UHq7DcLmocqxmECdGfqra6Hy9Y7BZVYPWlWIADkNUjI0RfOz69/3o/TAFlt4Cnw3BX3ip0o0Rri5/jzj0Nn+xSF+onyMnpH2gQvUE77MHvCuWTPki3R86Bz8RRzbTwKYwVa0oVca7jzdPtOjqzsnz8k9X0HVwQEpHGjqgTP3lg8EotON0rac/ayWs3J3bk9ye5AfvdTCYcZnDcz8POAN6FeC2Xey7oqQO4N8vFagru88mC3AmN67ZYqwI0fmDEYre20lnXFAFBFzsiu4FvKMgFYi/C5tG5ngSR5XcXwLskax82Un7yYYRzVbyhFSxxWZCqIC4cJ5d+E0Wex4eEYDwAlZ9AFP/hRJ2qrBVUbzXeGVMkHlg4qtdUIzHRkMUmjvEWVzTvk0Xa2wD+S0mYPcBwQcscoZy9zqdJM4hfbG9IGi02/DyrTOL3IuNH8WHHvGWS4ajDhSRkGCV4I5VtGKQ/Y3RA/pU6AaI7tVcDhbxOyIPKuOXO6PWuZOiJhhPQ/kceMkUXeh0TmsDtSBpe5OKCnjsdSn02lTT5yYf4nlVIVczP9p6zBerXorzZk1/S3CRBtqYZPgRrefbCw=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+ sauce_connect: true
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/README.md
new file mode 100644
index 00000000000..d3a11bc7911
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/README.md
@@ -0,0 +1,11 @@
+[![Build status](https://travis-ci.org/PolymerElements/iron-checked-element-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-checked-element-behavior)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/iron-checked-element-behavior)_
+
+
+##Polymer.IronCheckedElementBehavior
+
+Use `Polymer.IronCheckedElementBehavior` to implement a custom element
+that has a `checked` property, which can be used for validation if the
+element is also `required`. Element instances implementing this behavior
+will also be registered for use in an `iron-form` element.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/bower.json
new file mode 100644
index 00000000000..418c1995191
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/bower.json
@@ -0,0 +1,55 @@
+{
+ "name": "iron-checked-element-behavior",
+ "version": "2.1.1",
+ "description": "Implements an element that has a checked attribute and can be added to a form",
+ "authors": "The Polymer Authors",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "iron",
+ "behavior"
+ ],
+ "main": "iron-checked-element-behavior.html",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-checked-element-behavior.git"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/iron-checked-element-behavior",
+ "ignore": [],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#1 - 2",
+ "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#1 - 2"
+ },
+ "devDependencies": {
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "paper-button": "PolymerElements/paper-button#1 - 2",
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#^1.0.0",
+ "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0"
+ },
+ "devDependencies": {
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "paper-button": "PolymerElements/paper-button#^1.0.0",
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "Polymer/web-component-tester#^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/demo/index.html
new file mode 100644
index 00000000000..788a64f0016
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/demo/index.html
@@ -0,0 +1,39 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <title>iron-checked-element-behavior demo</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../../paper-styles/demo-pages.html">
+ <link rel="import" href="simple-checkbox.html">
+</head>
+<body unresolved>
+ <div class="horizontal-section-container">
+ <div>
+ <h4>Not required</h4>
+ <div class="horizontal-section">
+ <simple-checkbox></simple-checkbox>
+ </div>
+ </div>
+ <div>
+ <h4>Required</h4>
+ <div class="horizontal-section">
+ <simple-checkbox required></simple-checkbox>
+ </div>
+ </div>
+ </div>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/demo/simple-checkbox.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/demo/simple-checkbox.html
new file mode 100644
index 00000000000..f7bdd14b2d4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/demo/simple-checkbox.html
@@ -0,0 +1,57 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../paper-button/paper-button.html">
+<link rel="import" href="../iron-checked-element-behavior.html">
+
+<dom-module id="simple-checkbox">
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+
+ :host([invalid]) span {
+ color: red;
+ }
+
+ #labelText {
+ display: inline-block;
+ width: 100px;
+ }
+ </style>
+
+ <input type="checkbox" id="checkbox" on-tap="_onCheckTap">
+ <span id="labelText">{{label}}</span>
+ <paper-button raised on-click="_onClick">validate</paper-button>
+
+ </template>
+ <script>
+ Polymer({
+
+ is: 'simple-checkbox',
+
+ behaviors: [Polymer.IronCheckedElementBehavior],
+
+ properties: {label: {type: String, value: 'not validated'}},
+
+ _onCheckTap: function() {
+ this.checked = this.$.checkbox.checked;
+ },
+
+ _onClick: function() {
+ this.validate();
+ this.label = this.invalid ? 'is invalid' : 'is valid';
+ }
+ });
+ </script>
+
+ </dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/index.html
new file mode 100644
index 00000000000..1975dc5a75c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/index.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+
+ <title>iron-checked-element-behavior</title>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../polymer/polymer.html">
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/iron-checked-element-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/iron-checked-element-behavior.d.ts
new file mode 100644
index 00000000000..56f12e1736d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/iron-checked-element-behavior.d.ts
@@ -0,0 +1,68 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-checked-element-behavior.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-validatable-behavior/iron-validatable-behavior.d.ts" />
+/// <reference path="../iron-form-element-behavior/iron-form-element-behavior.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Use `Polymer.IronCheckedElementBehavior` to implement a custom element
+ * that has a `checked` property, which can be used for validation if the
+ * element is also `required`. Element instances implementing this behavior
+ * will also be registered for use in an `iron-form` element.
+ */
+ interface IronCheckedElementBehavior extends Polymer.IronFormElementBehavior, Polymer.IronValidatableBehavior {
+
+ /**
+ * Overriden from Polymer.IronFormElementBehavior
+ */
+ value: string|null|undefined;
+
+ /**
+ * Gets or sets the state, `true` is checked and `false` is unchecked.
+ */
+ checked: boolean|null|undefined;
+
+ /**
+ * If true, the button toggles the active state with each tap or press
+ * of the spacebar.
+ */
+ toggles: boolean|null|undefined;
+
+ /**
+ * Returns false if the element is required and not checked, and true
+ * otherwise.
+ *
+ * @param _value Ignored.
+ * @returns true if `required` is false or if `checked` is true.
+ */
+ _getValidity(_value?: any): boolean;
+ created(): void;
+
+ /**
+ * Update the aria-required label when `required` is changed.
+ */
+ _requiredChanged(): void;
+
+ /**
+ * Fire `iron-changed` when the checked state changes.
+ */
+ _checkedChanged(): void;
+
+ /**
+ * Reset value to 'on' if it is set to `undefined`.
+ */
+ _valueChanged(): void;
+ }
+
+ const IronCheckedElementBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/iron-checked-element-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/iron-checked-element-behavior.html
new file mode 100644
index 00000000000..fde93e7daff
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/iron-checked-element-behavior.html
@@ -0,0 +1,109 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-validatable-behavior/iron-validatable-behavior.html">
+<link rel="import" href="../iron-form-element-behavior/iron-form-element-behavior.html">
+
+<script>
+ /**
+ * Use `Polymer.IronCheckedElementBehavior` to implement a custom element
+ * that has a `checked` property, which can be used for validation if the
+ * element is also `required`. Element instances implementing this behavior
+ * will also be registered for use in an `iron-form` element.
+ *
+ * @demo demo/index.html
+ * @polymerBehavior Polymer.IronCheckedElementBehavior
+ */
+ Polymer.IronCheckedElementBehaviorImpl = {
+
+ properties: {
+ /**
+ * Fired when the checked state changes.
+ *
+ * @event iron-change
+ */
+
+ /**
+ * Gets or sets the state, `true` is checked and `false` is unchecked.
+ */
+ checked: {
+ type: Boolean,
+ value: false,
+ reflectToAttribute: true,
+ notify: true,
+ observer: '_checkedChanged'
+ },
+
+ /**
+ * If true, the button toggles the active state with each tap or press
+ * of the spacebar.
+ */
+ toggles: {type: Boolean, value: true, reflectToAttribute: true},
+
+ /* Overriden from Polymer.IronFormElementBehavior */
+ value: {type: String, value: 'on', observer: '_valueChanged'}
+ },
+
+ observers: ['_requiredChanged(required)'],
+
+ created: function() {
+ // Used by `iron-form` to handle the case that an element with this behavior
+ // doesn't have a role of 'checkbox' or 'radio', but should still only be
+ // included when the form is serialized if `this.checked === true`.
+ this._hasIronCheckedElementBehavior = true;
+ },
+
+ /**
+ * Returns false if the element is required and not checked, and true
+ * otherwise.
+ * @param {*=} _value Ignored.
+ * @return {boolean} true if `required` is false or if `checked` is true.
+ */
+ _getValidity: function(_value) {
+ return this.disabled || !this.required || this.checked;
+ },
+
+ /**
+ * Update the aria-required label when `required` is changed.
+ */
+ _requiredChanged: function() {
+ if (this.required) {
+ this.setAttribute('aria-required', 'true');
+ } else {
+ this.removeAttribute('aria-required');
+ }
+ },
+
+ /**
+ * Fire `iron-changed` when the checked state changes.
+ */
+ _checkedChanged: function() {
+ this.active = this.checked;
+ this.fire('iron-change');
+ },
+
+ /**
+ * Reset value to 'on' if it is set to `undefined`.
+ */
+ _valueChanged: function() {
+ if (this.value === undefined || this.value === null) {
+ this.value = 'on';
+ }
+ }
+ };
+
+ /** @polymerBehavior Polymer.IronCheckedElementBehavior */
+ Polymer.IronCheckedElementBehavior = [
+ Polymer.IronFormElementBehavior,
+ Polymer.IronValidatableBehavior,
+ Polymer.IronCheckedElementBehaviorImpl
+ ];
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/package-lock.json
new file mode 100644
index 00000000000..c430994beab
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/package-lock.json
@@ -0,0 +1,2388 @@
+{
+ "name": "@polymer/iron-checked-element-behavior",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "8.10.7",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.7.tgz",
+ "integrity": "sha512-5QC0YAHH7aXzrrbgQ+faSeBKbJwTaUyYuaywYzDTr1Myz5C0knx5FHOV5QyhBeE1x8n2xfkBUGE/C0X1paLp+Q==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.44",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+ "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz",
+ "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.2",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.105",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.44",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.2",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/package.json
new file mode 100644
index 00000000000..206a5199e4b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-checked-element-behavior/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@polymer/iron-checked-element-behavior",
+ "private": true,
+ "description": "Implements an element that has a checked attribute and can be added to a form",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-checked-element-behavior.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/.bower.json
new file mode 100644
index 00000000000..f3e1beb9f09
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/.bower.json
@@ -0,0 +1,63 @@
+{
+ "name": "iron-collapse",
+ "version": "2.2.1",
+ "description": "Provides a collapsable container",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "container"
+ ],
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/PolymerElements/iron-collapse"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/iron-collapse",
+ "ignore": [],
+ "dependencies": {
+ "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "web-component-tester": "^5.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "main": "iron-collapse.html",
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.2.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.2.1",
+ "commit": "c39063e959bd80be79ef6ff0b4a080260ef13868"
+ },
+ "_source": "https://github.com/PolymerElements/iron-collapse.git",
+ "_target": "^2.0.0",
+ "_originalSource": "iron-collapse"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/.github/CODEOWNERS
new file mode 100644
index 00000000000..c5097c0c903
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @valdrinkoshi
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..544b51e70c9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-collapse/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/.travis.yml
new file mode 100644
index 00000000000..f9e4afb72a5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/.travis.yml
@@ -0,0 +1,32 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e '\n\033[31mERROR:\033[0m
+ Typings are stale. Please run "npm run format".' && false)
+env:
+ global:
+ - secure: >-
+ UKNKHUjbp8O3UiVmnCmmprLR573ZXak9znhIvy0Uvxpkga7DFvfKvYRFCXQI/eV2I9YOI1FgVjlPfH8Id1NOWdMLdNjAI7G5p4FWisgu36kfat853HDYemoxx0C9nqPwakPGCJ9duL1w0dwje2sEHndk1cdwkU3TMsgkawdOJbU=
+ - secure: >-
+ cWudj1yh2mzialubEqhSHBG/CPLtI9ZeUPaI1+N3hiPzvuxqGaEbkpzEmlZrdAfuy9axCQStg88dgKRSv+TdMbcDKpzQqfClxTf9baKgrSgzVoMReY0kjHumCJz1tIVIz74ggp/gdQVFyS9CiA82pHTnxDl/drwPIHa2S8ST02U=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/README.md
new file mode 100644
index 00000000000..4157dac7914
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/README.md
@@ -0,0 +1,56 @@
+[![Build status](https://travis-ci.org/PolymerElements/iron-collapse.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-collapse)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/iron-collapse)_
+
+
+## &lt;iron-collapse&gt;
+
+`iron-collapse` creates a collapsible block of content. By default, the content
+will be collapsed. Use `opened` or `toggle()` to show/hide the content. The
+aria-expanded attribute should only be set on the button that controls the
+collapsable area, not on the area itself. See
+https://www.w3.org/WAI/GL/wiki/Using_aria-expanded_to_indicate_the_state_of_a_collapsible_element#Description
+
+```html
+<button id="button" on-click="toggle">toggle collapse</button>
+
+<iron-collapse id="collapse">
+ <div>Content goes here...</div>
+</iron-collapse>
+
+...
+
+toggle: function() {
+ this.$.collapse.toggle();
+ this.$.button.setAttribute('aria-expanded', this.$.collapse.opened);
+}
+```
+
+`iron-collapse` adjusts the max-height/max-width of the collapsible element to show/hide
+the content. So avoid putting padding/margin/border on the collapsible directly,
+and instead put a div inside and style that.
+
+```html
+<style>
+ .collapse-content {
+ padding: 15px;
+ border: 1px solid #dedede;
+ }
+</style>
+
+<iron-collapse>
+ <div class="collapse-content">
+ <div>Content goes here...</div>
+ </div>
+</iron-collapse>
+```
+
+### Styling
+
+The following custom properties and mixins are available for styling:
+
+| Custom property | Description | Default |
+| --- | --- | --- |
+| `--iron-collapse-transition-duration` | Animation transition duration | `300ms` |
+
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/bower.json
new file mode 100644
index 00000000000..4e2da7460b3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/bower.json
@@ -0,0 +1,54 @@
+{
+ "name": "iron-collapse",
+ "version": "2.2.1",
+ "description": "Provides a collapsable container",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "container"
+ ],
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/PolymerElements/iron-collapse"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/iron-collapse",
+ "ignore": [],
+ "dependencies": {
+ "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "web-component-tester": "^5.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "main": "iron-collapse.html",
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/demo/index.html
new file mode 100644
index 00000000000..c9d48111921
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/demo/index.html
@@ -0,0 +1,108 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<html>
+
+<head>
+
+ <title>iron-collapse demo</title>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="simple-expand-collapse.html">
+
+ <custom-style><style is="custom-style" include="demo-pages-shared-styles">
+
+ demo-snippet {
+ --demo-snippet-code: {
+ max-height: 250px;
+ }
+ }
+
+ simple-expand-collapse {
+ margin: 10px;
+ }
+
+ .content {
+ padding: 15px;
+ }
+ </style></custom-style>
+
+</head>
+
+<body unresolved class="centered">
+
+ <h4>Basic</h4>
+ <demo-snippet>
+ <template>
+ <simple-expand-collapse>
+ <div class="content">
+ Lorem ipsum dolor sit amet, per in nusquam nominavi periculis, sit elit oportere ea, id minim maiestatis incorrupte duo. Dolorum verterem ad ius, his et nullam verterem. Eu alia debet usu, an doming tritani est. Vix ad ponderum petentium suavitate, eum
+ eu tempor populo, graece sententiae constituam vim ex. Cu torquatos reprimique neglegentur nec, voluptua periculis has ut, at eos discere deleniti sensibus. Lorem ipsum dolor sit amet, per in nusquam nominavi periculis, sit elit oportere ea,
+ id minim maiestatis incorrupte duo. Dolorum verterem ad ius, his et nullam verterem. Eu alia debet usu, an doming tritani est. Vix ad ponderum petentium suavitate, eum eu tempor populo, graece sententiae constituam vim ex. Cu torquatos reprimique
+ neglegentur nec, voluptua periculis has ut, at eos discere deleniti sensibus.
+ </div>
+ </simple-expand-collapse>
+ </template>
+ </demo-snippet>
+
+ <h4>Nested, horizontal expand</h4>
+ <demo-snippet>
+ <template>
+ <style>
+ simple-expand-collapse[horizontal] .content {
+ max-height: 250px;
+ overflow: auto;
+ }
+ </style>
+
+ <simple-expand-collapse>
+ <div class="content">
+ <div>
+ Lorem ipsum dolor sit amet, per in nusquam nominavi periculis, sit elit oportere ea, id minim maiestatis incorrupte duo. Dolorum verterem ad ius, his et nullam verterem. Eu alia debet usu, an doming tritani est. Vix ad ponderum petentium suavitate, eum
+ eu tempor populo, graece sententiae constituam vim ex. Cu torquatos reprimique neglegentur nec, voluptua periculis has ut, at eos discere deleniti sensibus. Lorem ipsum dolor sit amet, per in nusquam nominavi periculis, sit elit oportere ea,
+ id minim maiestatis incorrupte duo. Dolorum verterem ad ius, his et nullam verterem. Eu alia debet usu, an doming tritani est. Vix ad ponderum petentium suavitate, eum eu tempor populo, graece sententiae constituam vim ex. Cu torquatos reprimique
+ neglegentur nec, voluptua periculis has ut, at eos discere deleniti sensibus.
+ </div>
+ <simple-expand-collapse horizontal>
+ <div class="content">
+ Lorem ipsum dolor sit amet, per in nusquam nominavi periculis, sit elit oportere ea, id minim maiestatis incorrupte duo. Dolorum verterem ad ius, his et nullam verterem. Eu alia debet usu, an doming tritani est. Vix ad ponderum petentium suavitate, eum
+ eu tempor populo, graece sententiae constituam vim ex. Cu torquatos reprimique neglegentur nec, voluptua periculis has ut, at eos discere deleniti sensibus. Lorem ipsum dolor sit amet, per in nusquam nominavi periculis, sit elit oportere
+ ea, id minim maiestatis incorrupte duo. Dolorum verterem ad ius, his et nullam verterem. Eu alia debet usu, an doming tritani est. Vix ad ponderum petentium suavitate, eum eu tempor populo, graece sententiae constituam vim ex. Cu torquatos
+ reprimique neglegentur nec, voluptua periculis has ut, at eos discere deleniti sensibus.
+ </div>
+ </simple-expand-collapse>
+ </div>
+ </simple-expand-collapse>
+ </template>
+ </demo-snippet>
+
+ <h4>No animation</h4>
+ <demo-snippet>
+ <template>
+ <simple-expand-collapse no-animation>
+ <div class="content">
+ Lorem ipsum dolor sit amet, per in nusquam nominavi periculis, sit elit oportere ea, id minim maiestatis incorrupte duo. Dolorum verterem ad ius, his et nullam verterem. Eu alia debet usu, an doming tritani est. Vix ad ponderum petentium suavitate, eum
+ eu tempor populo, graece sententiae constituam vim ex. Cu torquatos reprimique neglegentur nec, voluptua periculis has ut, at eos discere deleniti sensibus. Lorem ipsum dolor sit amet, per in nusquam nominavi periculis, sit elit oportere ea,
+ id minim maiestatis incorrupte duo. Dolorum verterem ad ius, his et nullam verterem. Eu alia debet usu, an doming tritani est. Vix ad ponderum petentium suavitate, eum eu tempor populo, graece sententiae constituam vim ex. Cu torquatos reprimique
+ neglegentur nec, voluptua periculis has ut, at eos discere deleniti sensibus.
+ </div>
+ </simple-expand-collapse>
+ </template>
+ </demo-snippet>
+</body>
+
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/demo/simple-expand-collapse.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/demo/simple-expand-collapse.html
new file mode 100644
index 00000000000..f5a0b9b7d9f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/demo/simple-expand-collapse.html
@@ -0,0 +1,78 @@
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../iron-collapse.html">
+<link rel="import" href="../../paper-styles/shadow.html">
+
+<dom-module id="simple-expand-collapse">
+
+ <template>
+
+ <style>
+
+ :host {
+ display: block;
+ }
+
+ #trigger {
+ padding: 10px 15px;
+ background-color: #f3f3f3;
+ border: 1px solid #dedede;
+ border-radius: 5px;
+ font-size: 18px;
+ cursor: pointer;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+ text-align: left;
+ }
+
+ :host([opened]) #trigger {
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+
+ iron-collapse {
+ border: 1px solid #dedede;
+ border-top: none;
+ border-bottom-left-radius: 5px;
+ border-bottom-right-radius: 5px;
+ @apply --shadow-elevation-2dp;
+ }
+ </style>
+ <button id="trigger" on-click="toggle" aria-expanded$="[[opened]]" aria-controls="collapse">[[_getText(opened)]]</button>
+ <iron-collapse id="collapse" opened="{{opened}}" horizontal="[[horizontal]]" no-animation="[[noAnimation]]" tabindex="0">
+ <slot></slot>
+ </iron-collapse>
+
+ </template>
+
+</dom-module>
+
+<script>
+ Polymer({
+
+ is: 'simple-expand-collapse',
+
+ properties: {
+
+ horizontal: {type: Boolean},
+ opened: {type: Boolean, reflectToAttribute: true},
+ noAnimation: {type: Boolean},
+ },
+
+ toggle: function() {
+ this.$.collapse.toggle();
+ },
+
+ _getText: function(opened) {
+ return opened ? 'Collapse' : 'Expand';
+ }
+
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/hero.svg b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/hero.svg
new file mode 100755
index 00000000000..ae1a49efab0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/hero.svg
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">
+<g id="background" display="none">
+ <rect display="inline" fill="#B0BEC5" width="225" height="126"/>
+ <path display="inline" fill="none" d="M167.5,51.7c3.7-0.8,6.9,2.4,6.1,6.1c-0.4,1.9-1.9,3.4-3.8,3.8c-3.7,0.8-6.9-2.4-6.1-6.1
+ C164.2,53.6,165.7,52.1,167.5,51.7z"/>
+</g>
+<g id="label">
+</g>
+<g id="art">
+ <path d="M151,102H73V52h78V102z M75,100h74V54H75V100z"/>
+ <path d="M151,38H73V24h78V38z M75,36h74V26H75V36z"/>
+ <circle cx="171" cy="51" r="4"/>
+ <path d="M151,72v-2c10.5,0,19-8.5,19-19s-8.5-19-19-19v-2c11.6,0,21,9.4,21,21S162.6,72,151,72z"/>
+ <g id="ic_x5F_add_x0D_">
+ </g>
+</g>
+<g id="Guides">
+</g>
+</svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/index.html
new file mode 100644
index 00000000000..b5d20077c41
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/index.html
@@ -0,0 +1,31 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<html>
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+
+ <title>iron-collapse</title>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../polymer/polymer.html">
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+ </head>
+ <body>
+
+ <iron-component-page></iron-component-page>
+
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/iron-collapse.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/iron-collapse.d.ts
new file mode 100644
index 00000000000..b260d0bce45
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/iron-collapse.d.ts
@@ -0,0 +1,110 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-collapse.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-resizable-behavior/iron-resizable-behavior.d.ts" />
+
+/**
+ * `iron-collapse` creates a collapsible block of content. By default, the content
+ * will be collapsed. Use `opened` or `toggle()` to show/hide the content.
+ *
+ * <button on-click="toggle">toggle collapse</button>
+ *
+ * <iron-collapse id="collapse">
+ * <div>Content goes here...</div>
+ * </iron-collapse>
+ *
+ * ...
+ *
+ * toggle: function() {
+ * this.$.collapse.toggle();
+ * }
+ *
+ * `iron-collapse` adjusts the max-height/max-width of the collapsible element to show/hide
+ * the content. So avoid putting padding/margin/border on the collapsible directly,
+ * and instead put a div inside and style that.
+ *
+ * <style>
+ * .collapse-content {
+ * padding: 15px;
+ * border: 1px solid #dedede;
+ * }
+ * </style>
+ *
+ * <iron-collapse>
+ * <div class="collapse-content">
+ * <div>Content goes here...</div>
+ * </div>
+ * </iron-collapse>
+ *
+ * ### Styling
+ *
+ * The following custom properties and mixins are available for styling:
+ *
+ * Custom property | Description | Default
+ * ----------------|-------------|----------
+ * `--iron-collapse-transition-duration` | Animation transition duration | `300ms`
+ */
+interface IronCollapseElement extends Polymer.Element, Polymer.IronResizableBehavior {
+
+ /**
+ * If true, the orientation is horizontal; otherwise is vertical.
+ */
+ horizontal: boolean|null|undefined;
+
+ /**
+ * Set opened to true to show the collapse element and to false to hide it.
+ */
+ opened: boolean|null|undefined;
+
+ /**
+ * When true, the element is transitioning its opened state. When false,
+ * the element has finished opening/closing.
+ */
+ readonly transitioning: boolean|null|undefined;
+
+ /**
+ * Set noAnimation to true to disable animations.
+ */
+ noAnimation: boolean|null|undefined;
+ hostAttributes: object|null;
+ readonly dimension: any;
+
+ /**
+ * Toggle the opened state.
+ */
+ toggle(): void;
+ show(): void;
+ hide(): void;
+
+ /**
+ * Updates the size of the element.
+ *
+ * @param size The new value for `maxWidth`/`maxHeight` as css property value, usually `auto` or `0px`.
+ * @param animated if `true` updates the size with an animation, otherwise without.
+ */
+ updateSize(size: string, animated?: boolean): void;
+
+ /**
+ * enableTransition() is deprecated, but left over so it doesn't break
+ * existing code. Please use `noAnimation` property instead.
+ */
+ enableTransition(enabled: any): void;
+ _updateTransition(enabled: any): void;
+ _horizontalChanged(): void;
+ _openedChanged(): void;
+ _transitionEnd(): void;
+ _onTransitionEnd(event: any): void;
+ _calcSize(): any;
+}
+
+interface HTMLElementTagNameMap {
+ "iron-collapse": IronCollapseElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/iron-collapse.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/iron-collapse.html
new file mode 100644
index 00000000000..604034e5ffa
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/iron-collapse.html
@@ -0,0 +1,282 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html">
+
+<!--
+`iron-collapse` creates a collapsible block of content. By default, the content
+will be collapsed. Use `opened` or `toggle()` to show/hide the content.
+
+ <button on-click="toggle">toggle collapse</button>
+
+ <iron-collapse id="collapse">
+ <div>Content goes here...</div>
+ </iron-collapse>
+
+ ...
+
+ toggle: function() {
+ this.$.collapse.toggle();
+ }
+
+`iron-collapse` adjusts the max-height/max-width of the collapsible element to show/hide
+the content. So avoid putting padding/margin/border on the collapsible directly,
+and instead put a div inside and style that.
+
+ <style>
+ .collapse-content {
+ padding: 15px;
+ border: 1px solid #dedede;
+ }
+ </style>
+
+ <iron-collapse>
+ <div class="collapse-content">
+ <div>Content goes here...</div>
+ </div>
+ </iron-collapse>
+
+### Styling
+
+The following custom properties and mixins are available for styling:
+
+Custom property | Description | Default
+----------------|-------------|----------
+`--iron-collapse-transition-duration` | Animation transition duration | `300ms`
+
+@group Iron Elements
+@hero hero.svg
+@demo demo/index.html
+@element iron-collapse
+-->
+
+<dom-module id="iron-collapse">
+
+ <template>
+
+ <style>
+ :host {
+ display: block;
+ transition-duration: var(--iron-collapse-transition-duration, 300ms);
+ /* Safari 10 needs this property prefixed to correctly apply the custom property */
+ -webkit-transition-duration: var(--iron-collapse-transition-duration, 300ms);
+ overflow: visible;
+ }
+
+ :host(.iron-collapse-closed) {
+ display: none;
+ }
+
+ :host(:not(.iron-collapse-opened)) {
+ overflow: hidden;
+ }
+ </style>
+
+ <slot></slot>
+
+ </template>
+
+</dom-module>
+
+<script>
+ Polymer({
+
+ is: 'iron-collapse',
+
+ behaviors: [Polymer.IronResizableBehavior],
+
+ properties: {
+
+ /**
+ * If true, the orientation is horizontal; otherwise is vertical.
+ *
+ * @attribute horizontal
+ */
+ horizontal: {type: Boolean, value: false, observer: '_horizontalChanged'},
+
+ /**
+ * Set opened to true to show the collapse element and to false to hide it.
+ *
+ * @attribute opened
+ */
+ opened:
+ {type: Boolean, value: false, notify: true, observer: '_openedChanged'},
+
+ /**
+ * When true, the element is transitioning its opened state. When false,
+ * the element has finished opening/closing.
+ *
+ * @attribute transitioning
+ */
+ transitioning: {type: Boolean, notify: true, readOnly: true},
+
+ /**
+ * Set noAnimation to true to disable animations.
+ *
+ * @attribute noAnimation
+ */
+ noAnimation: {type: Boolean},
+
+ /**
+ * Stores the desired size of the collapse body.
+ * @private
+ */
+ _desiredSize: {type: String, value: ''}
+ },
+
+ get dimension() {
+ return this.horizontal ? 'width' : 'height';
+ },
+
+ /**
+ * `maxWidth` or `maxHeight`.
+ * @private
+ */
+ get _dimensionMax() {
+ return this.horizontal ? 'maxWidth' : 'maxHeight';
+ },
+
+ /**
+ * `max-width` or `max-height`.
+ * @private
+ */
+ get _dimensionMaxCss() {
+ return this.horizontal ? 'max-width' : 'max-height';
+ },
+
+ hostAttributes: {
+ role: 'group',
+ 'aria-hidden': 'true',
+ },
+
+ listeners: {transitionend: '_onTransitionEnd'},
+
+ /**
+ * Toggle the opened state.
+ *
+ * @method toggle
+ */
+ toggle: function() {
+ this.opened = !this.opened;
+ },
+
+ show: function() {
+ this.opened = true;
+ },
+
+ hide: function() {
+ this.opened = false;
+ },
+
+ /**
+ * Updates the size of the element.
+ * @param {string} size The new value for `maxWidth`/`maxHeight` as css property value, usually `auto` or `0px`.
+ * @param {boolean=} animated if `true` updates the size with an animation, otherwise without.
+ */
+ updateSize: function(size, animated) {
+ // Consider 'auto' as '', to take full size.
+ size = size === 'auto' ? '' : size;
+
+ var willAnimate = animated && !this.noAnimation && this.isAttached &&
+ this._desiredSize !== size;
+
+ this._desiredSize = size;
+
+ this._updateTransition(false);
+ // If we can animate, must do some prep work.
+ if (willAnimate) {
+ // Animation will start at the current size.
+ var startSize = this._calcSize();
+ // For `auto` we must calculate what is the final size for the animation.
+ // After the transition is done, _transitionEnd will set the size back to
+ // `auto`.
+ if (size === '') {
+ this.style[this._dimensionMax] = '';
+ size = this._calcSize();
+ }
+ // Go to startSize without animation.
+ this.style[this._dimensionMax] = startSize;
+ // Force layout to ensure transition will go. Set scrollTop to itself
+ // so that compilers won't remove it.
+ this.scrollTop = this.scrollTop;
+ // Enable animation.
+ this._updateTransition(true);
+ // If final size is the same as startSize it will not animate.
+ willAnimate = (size !== startSize);
+ }
+ // Set the final size.
+ this.style[this._dimensionMax] = size;
+ // If it won't animate, call transitionEnd to set correct classes.
+ if (!willAnimate) {
+ this._transitionEnd();
+ }
+ },
+
+ /**
+ * enableTransition() is deprecated, but left over so it doesn't break
+ * existing code. Please use `noAnimation` property instead.
+ *
+ * @method enableTransition
+ * @deprecated since version 1.0.4
+ */
+ enableTransition: function(enabled) {
+ Polymer.Base._warn(
+ '`enableTransition()` is deprecated, use `noAnimation` instead.');
+ this.noAnimation = !enabled;
+ },
+
+ _updateTransition: function(enabled) {
+ this.style.transitionDuration = (enabled && !this.noAnimation) ? '' : '0s';
+ },
+
+ _horizontalChanged: function() {
+ this.style.transitionProperty = this._dimensionMaxCss;
+ var otherDimension =
+ this._dimensionMax === 'maxWidth' ? 'maxHeight' : 'maxWidth';
+ this.style[otherDimension] = '';
+ this.updateSize(this.opened ? 'auto' : '0px', false);
+ },
+
+ _openedChanged: function() {
+ this.setAttribute('aria-hidden', !this.opened);
+
+ this._setTransitioning(true);
+ this.toggleClass('iron-collapse-closed', false);
+ this.toggleClass('iron-collapse-opened', false);
+ this.updateSize(this.opened ? 'auto' : '0px', true);
+
+ // Focus the current collapse.
+ if (this.opened) {
+ this.focus();
+ }
+ },
+
+ _transitionEnd: function() {
+ this.style[this._dimensionMax] = this._desiredSize;
+ this.toggleClass('iron-collapse-closed', !this.opened);
+ this.toggleClass('iron-collapse-opened', this.opened);
+ this._updateTransition(false);
+ this.notifyResize();
+ this._setTransitioning(false);
+ },
+
+ _onTransitionEnd: function(event) {
+ if (Polymer.dom(event).rootTarget === this) {
+ this._transitionEnd();
+ }
+ },
+
+ _calcSize: function() {
+ return this.getBoundingClientRect()[this.dimension] + 'px';
+ }
+
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/package-lock.json
new file mode 100644
index 00000000000..cd8c08250a6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/package-lock.json
@@ -0,0 +1,2388 @@
+{
+ "name": "@polymer/iron-collapse",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.3"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.6.3"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.6.3",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.3.tgz",
+ "integrity": "sha512-igaEysRgtg5tYJVIdQ1T2lJ3G6OmoY7g0YVWKHLFiVs4YUChd9IRSiLoHSLffwut+CpsHHBDj4vRxxNEMstctw==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.3"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.3"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.3"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.44",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+ "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz",
+ "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.2",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.105",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.44",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.2",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/package.json
new file mode 100644
index 00000000000..0c188543e53
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-collapse/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@polymer/iron-collapse",
+ "private": true,
+ "description": "Provides a collapsable container",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/PolymerElements/iron-collapse"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/.bower.json
new file mode 100644
index 00000000000..3b2df138961
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/.bower.json
@@ -0,0 +1,71 @@
+{
+ "name": "iron-dropdown",
+ "version": "2.0.0",
+ "description": "An unstyled element that works similarly to a native browser select",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "web-component",
+ "polymer"
+ ],
+ "main": "iron-dropdown.html",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-dropdown"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/iron-dropdown",
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-behaviors": "PolymerElements/iron-behaviors#1 - 2",
+ "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#1 - 2",
+ "neon-animation": "PolymerElements/neon-animation#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "web-animations-js": "web-animations/web-animations-js#^2.2.0",
+ "iron-image": "PolymerElements/iron-image#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
+ "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#^1.8.6",
+ "neon-animation": "PolymerElements/neon-animation#^1.0.0"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "web-animations-js": "web-animations/web-animations-js#^2.2.0",
+ "iron-image": "PolymerElements/iron-image#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.0.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.0.0",
+ "commit": "1f581967ae539bf6d94f08a29783e323992a33c8"
+ },
+ "_source": "https://github.com/PolymerElements/iron-dropdown.git",
+ "_target": "~2.0",
+ "_originalSource": "PolymerElements/iron-dropdown"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..a1b71482eab
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-dropdown/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/.travis.yml
new file mode 100644
index 00000000000..823a13c1306
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/.travis.yml
@@ -0,0 +1,25 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+env:
+ global:
+ - secure: >-
+ YMlrRxFp8QBJ9KfvrPru2sIaHm5GeVHsZ/wE4qm5ntdsoqQlsJXRYYhlE2jPSHte+2VrOnFItjCsoqG6myeCbMrDS+/ZAZd+PWNdxbSs0DiGVMJWtrd8PwhKeOoVYzJleTwU0Uj2mF/mKwoC6aNgf56V9XzC2mkooRJX9cDbCkfddcIGoU/45zsPPMJV+BRVDcETw5g0PD+7NJBPtJP+d8TMO+jtdgXQ1V0vPJhkS7RaYZoDeljsml/Xc8Djb3zUttu5cFk4lXeKAKtFgFzxVsFqytxuYY2aSkMcq2/KxwexnnK/SCe5uQC014TjYAMzSs5A7l/ZBEzRGDhxKmkR2JHY3ktRCOFphqrQa9JoK3k+Tc28JeXJXTXNW7B5SODclN45ik5jQQ/FaJgRlideK07LsEObC9FjEoSd0U5rt75bzIhGuBQ6vr16JQLtN7+NvPRMsNqZRGHQysbW7SbfuLdWwmprn8kXaiQoensAnWlrrGoaPtPfKgA68YRQ/2cr9zZWFmMTzfDP6/Y8YSulj1mzqP2U8AZStXZ1vKN7IWY/ADzYrRG/nCqwd8gQpQoiAEgOfc+de5fIzLPRfLS8fI8sow9yZC8hE91JDatxOPvg/YCDGfJUQddCG+Z3LIBqY6RYKjXzCTCexGD6XWIJso8x5HEEWEQKArqT6vLM4gE=
+ - secure: >-
+ yNGht7DLQ56gIwWh+Wu/3spWaIo0qR/EXB7SDzGtE7Y1KLbgYjmGCnA+3Y+vQ8q9Smpv66FMi8ejbBnObb347806LykEG23OJWBbruUi3gGoImNqLmaj+iqxiaYzxqIWs7gwhpYMdNGFiu1T83eBLOLoVQqO1OIIVbH1Fk0MvHvbknY52VyOEaEjVBdnWAxTpDdgujzVaPBxaPCbD15nUFgaMCsBdR0SKtX0X+vVZRdu0VzHqLJPhUxrQJIxdAYc/OyEKki5pR93b0df+0P14NHxduWNtaAReBtMtpVsiLfaxiHdoWzjHdJ2g+x4DEoH1ynbs4v/8qWE1xLABcgHK2UeZYwTtk7KSA9ZcYSx7JxnO1mhseWdiCSKO4Y0bZuBcSsQ9O5skvIOhAd9bLdQHMe4bHSf8mhtv/Kw6IHmEqZ9YZ8TIk7YY4bYiLOKsN6q2kYbWO7UVeYBLul3mppiEWZ04JmbjVU5us1hq40RdSsc34/fW3KitLfVaYQlTWlZ/h9nx7tOQ2o6OOSHgRnD8qPpFM+xExqkj2FIgUWyecn8VKQ6FojgfOeVyEQ3WdPK17LdFxhKfHVod+Qufl6ArBsUMWctns4/jQTCJXL+VIPfZWQ/wrYmkIW7dEjA6NnTMBqhjBa37C1G8+Ak5kvSAcU4iAbjqA1jVv4RANRV5x8=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/README.md
new file mode 100644
index 00000000000..ac614b7e8c2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/README.md
@@ -0,0 +1,34 @@
+[![Build status](https://travis-ci.org/PolymerElements/iron-dropdown.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-dropdown)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/iron-dropdown)_
+
+
+## &lt;iron-dropdown&gt;
+
+`<iron-dropdown>` is a generalized element that is useful when you have
+hidden content (`dropdown-content`) that is revealed due to some change in
+state that should cause it to do so.
+
+Note that this is a low-level element intended to be used as part of other
+composite elements that cause dropdowns to be revealed.
+
+Examples of elements that might be implemented using an `iron-dropdown`
+include comboboxes, menubuttons, selects. The list goes on.
+
+The `<iron-dropdown>` element exposes attributes that allow the position
+of the `dropdown-content` relative to the `dropdown-trigger` to be
+configured.
+
+```html
+<iron-dropdown horizontal-align="right" vertical-align="top">
+ <div slot="dropdown-content">Hello!</div>
+</iron-dropdown>
+```
+
+In the above example, the `<div>` assigned to the `dropdown-content` slot will be
+hidden until the dropdown element has `opened` set to true, or when the `open`
+method is called on the element.
+
+### Changes in 2.0
+- Removed the private property `_focusTarget` which was deprecated.
+- `neon-animation 2.0` doesn't import the Web Animations polyfill, so you'll have to import it ([see example](demo/index.html))
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/bower.json
new file mode 100644
index 00000000000..6ecf2b24bce
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/bower.json
@@ -0,0 +1,62 @@
+{
+ "name": "iron-dropdown",
+ "version": "2.0.0",
+ "description": "An unstyled element that works similarly to a native browser select",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "web-component",
+ "polymer"
+ ],
+ "main": "iron-dropdown.html",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-dropdown"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/iron-dropdown",
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-behaviors": "PolymerElements/iron-behaviors#1 - 2",
+ "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#1 - 2",
+ "neon-animation": "PolymerElements/neon-animation#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "web-animations-js": "web-animations/web-animations-js#^2.2.0",
+ "iron-image": "PolymerElements/iron-image#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
+ "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#^1.8.6",
+ "neon-animation": "PolymerElements/neon-animation#^1.0.0"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "web-animations-js": "web-animations/web-animations-js#^2.2.0",
+ "iron-image": "PolymerElements/iron-image#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/demo/grow-height-animation.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/demo/grow-height-animation.html
new file mode 100644
index 00000000000..e2fdc448a07
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/demo/grow-height-animation.html
@@ -0,0 +1,36 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../neon-animation/neon-animation-behavior.html">
+
+<script>
+ Polymer({
+ is: 'expand-animation',
+
+ behaviors: [
+ Polymer.NeonAnimationBehavior
+ ],
+
+ configure: function(config) {
+ var node = config.node;
+
+ var height = node.getBoundingClientRect().height;
+
+ this._effect = new KeyframeEffect(node, [{
+ height: (height / 2) + 'px'
+ }, {
+ height: height + 'px'
+ }], this.timingFromConfig(config));
+
+ return this._effect;
+ }
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/demo/index.html
new file mode 100644
index 00000000000..4c0f5bcddbd
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/demo/index.html
@@ -0,0 +1,191 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+
+<head>
+
+ <title>iron-dropdown</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../iron-image/iron-image.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../../neon-animation/web-animations.html">
+
+ <link rel="import" href="x-select.html">
+
+ <custom-style><style is="custom-style" include="demo-pages-shared-styles">
+ demo-snippet {
+ --demo-snippet-code: {
+ max-height: 250px;
+ }
+ }
+
+ [slot="dropdown-content"] {
+ background-color: white;
+ line-height: 20px;
+ border-radius: 3px;
+ box-shadow: 0px 2px 6px #ccc;
+ }
+
+ .random-content {
+ padding: 1.5em 2em;
+ max-width: 250px;
+ }
+
+ button {
+ border: 1px solid #ccc;
+ background-color: #eee;
+ padding: 1em;
+ border-radius: 3px;
+ cursor: pointer;
+ }
+
+ button:focus {
+ outline: none;
+ border-color: blue;
+ }
+
+ ul, li {
+ display: block;
+ position: relative;
+ margin: 0;
+ padding: 0;
+ }
+
+ a {
+ display: block;
+ position: relative;
+ padding: 1em;
+ text-decoration: none;
+ }
+
+ li:not(:last-of-type) {
+ border-bottom: 1px solid #eee;
+ }
+
+ a:hover {
+ text-decoration: underline;
+ }
+
+ iron-image {
+ padding: 1em;
+ background-color: #fff;
+ box-shadow: 0px 2px 6px #ccc;
+ border-radius: 3px;
+ }
+ </style></custom-style>
+</head>
+
+<body unresolved class="centered">
+ <h3>Basic</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <x-select>
+ <button slot="dropdown-trigger">Basic</button>
+ <div slot="dropdown-content" class="random-content">
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
+ in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </div>
+ </x-select>
+ <x-select>
+ <button slot="dropdown-trigger">Overflowing</button>
+ <div slot="dropdown-content" class="random-content">
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
+ irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem
+ quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam
+ eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure
+ reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</p>
+ </div>
+ </x-select>
+ </template>
+ </demo-snippet>
+
+ <h3>Alignment</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <x-select vertical-align="bottom">
+ <button slot="dropdown-trigger">Bottom-left Aligned</button>
+ <div slot="dropdown-content" class="random-content">
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
+ in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </div>
+ </x-select>
+ <x-select horizontal-align="right" vertical-align="top">
+ <button slot="dropdown-trigger">Top-right Aligned</button>
+ <div slot="dropdown-content" class="random-content">
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
+ in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </div>
+ </x-select>
+ </template>
+ </demo-snippet>
+
+ <h3>Content</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <x-select horizontal-align="left" vertical-align="top">
+ <button slot="dropdown-trigger">Content</button>
+ <iron-image slot="dropdown-content" src="../../iron-image/demo/polymer.svg"></iron-image>
+ </x-select>
+ <x-select horizontal-align="right" vertical-align="top">
+ <button slot="dropdown-trigger">Unordered list</button>
+ <ul slot="dropdown-content" tabindex="0">
+ <dom-repeat id="Demo">
+ <template is="dom-repeat">
+ <li><a href="javascript:void(0)">[[item]]</a></li>
+ </template>
+ </dom-repeat>
+ </ul>
+ </x-select>
+
+ <script>
+ Demo.items = [
+ 'allosaurus',
+ 'brontosaurus',
+ 'carcharodontosaurus',
+ 'diplodocus',
+ 'ekrixinatosaurus',
+ 'fukuiraptor',
+ 'gallimimus',
+ 'hadrosaurus',
+ 'iguanodon',
+ 'jainosaurus',
+ 'kritosaurus',
+ 'liaoceratops',
+ 'megalosaurus',
+ 'nemegtosaurus',
+ 'ornithomimus',
+ 'protoceratops',
+ 'quetecsaurus',
+ 'rajasaurus',
+ 'stegosaurus',
+ 'triceratops',
+ 'utahraptor',
+ 'vulcanodon',
+ 'wannanosaurus',
+ 'xenoceratops',
+ 'yandusaurus',
+ 'zephyrosaurus'
+ ];
+ // Support hybrid mode.
+ Demo.firstElementChild.items = Demo.items;
+ </script>
+ </template>
+ </demo-snippet>
+
+
+
+</body>
+
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/demo/x-select.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/demo/x-select.html
new file mode 100644
index 00000000000..18ddb9494a1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/demo/x-select.html
@@ -0,0 +1,80 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../iron-dropdown.html">
+<link rel="import" href="../../neon-animation/neon-animations.html">
+<link rel="import" href="grow-height-animation.html">
+
+<dom-module id="x-select">
+ <template>
+ <style>
+ :host {
+ display: inline-block;
+ margin: 1em;
+ }
+ </style>
+ <div on-tap="open">
+ <slot name="dropdown-trigger"></slot>
+ </div>
+ <iron-dropdown id="dropdown"
+ vertical-align="[[verticalAlign]]"
+ horizontal-align="[[horizontalAlign]]"
+ disabled="[[disabled]]"
+ open-animation-config="[[openAnimationConfig]]"
+ close-animation-config="[[closeAnimationConfig]]">
+ <slot name="dropdown-content" slot="dropdown-content"></slot>
+ </iron-dropdown>
+ </template>
+ <script>
+ Polymer({
+ is: 'x-select',
+
+ properties: {
+ verticalAlign: String,
+ horizontalAlign: String,
+ disabled: Boolean,
+ openAnimationConfig: {
+ type: Array,
+ value: function() {
+ return [{
+ name: 'fade-in-animation',
+ timing: {
+ delay: 150,
+ duration: 50
+ }
+ }, {
+ name: 'expand-animation',
+ timing: {
+ delay: 150,
+ duration: 200
+ }
+ }];
+ }
+ },
+
+ closeAnimationConfig: {
+ type: Array,
+ value: function() {
+ return [{
+ name: 'fade-out-animation',
+ timing: {
+ duration: 200
+ }
+ }];
+ }
+ }
+ },
+
+ open: function() {
+ this.$.dropdown.open();
+ }
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/index.html
new file mode 100644
index 00000000000..1d3d6cada97
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/index.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE
+The complete set of authors may be found at http://polymer.github.io/AUTHORS
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS
+-->
+<html>
+<head>
+
+ <title>iron-dropdown</title>
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/iron-dropdown-scroll-manager.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/iron-dropdown-scroll-manager.html
new file mode 100644
index 00000000000..38c21d8e2cf
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/iron-dropdown-scroll-manager.html
@@ -0,0 +1,374 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<script>
+ (function() {
+ 'use strict';
+ /**
+ * Used to calculate the scroll direction during touch events.
+ * @type {!Object}
+ */
+ var lastTouchPosition = {
+ pageX: 0,
+ pageY: 0
+ };
+ /**
+ * Used to avoid computing event.path and filter scrollable nodes (better perf).
+ * @type {?EventTarget}
+ */
+ var lastRootTarget = null;
+ /**
+ * @type {!Array<Node>}
+ */
+ var lastScrollableNodes = [];
+
+ var scrollEvents = [
+ // Modern `wheel` event for mouse wheel scrolling:
+ 'wheel',
+ // Older, non-standard `mousewheel` event for some FF:
+ 'mousewheel',
+ // IE:
+ 'DOMMouseScroll',
+ // Touch enabled devices
+ 'touchstart',
+ 'touchmove'
+ ];
+
+ /**
+ * The IronDropdownScrollManager is intended to provide a central source
+ * of authority and control over which elements in a document are currently
+ * allowed to scroll.
+ */
+
+ Polymer.IronDropdownScrollManager = {
+
+ /**
+ * The current element that defines the DOM boundaries of the
+ * scroll lock. This is always the most recently locking element.
+ */
+ get currentLockingElement() {
+ return this._lockingElements[this._lockingElements.length - 1];
+ },
+
+ /**
+ * Returns true if the provided element is "scroll locked", which is to
+ * say that it cannot be scrolled via pointer or keyboard interactions.
+ *
+ * @param {HTMLElement} element An HTML element instance which may or may
+ * not be scroll locked.
+ */
+ elementIsScrollLocked: function(element) {
+ var currentLockingElement = this.currentLockingElement;
+
+ if (currentLockingElement === undefined)
+ return false;
+
+ var scrollLocked;
+
+ if (this._hasCachedLockedElement(element)) {
+ return true;
+ }
+
+ if (this._hasCachedUnlockedElement(element)) {
+ return false;
+ }
+
+ scrollLocked = !!currentLockingElement &&
+ currentLockingElement !== element &&
+ !this._composedTreeContains(currentLockingElement, element);
+
+ if (scrollLocked) {
+ this._lockedElementCache.push(element);
+ } else {
+ this._unlockedElementCache.push(element);
+ }
+
+ return scrollLocked;
+ },
+
+ /**
+ * Push an element onto the current scroll lock stack. The most recently
+ * pushed element and its children will be considered scrollable. All
+ * other elements will not be scrollable.
+ *
+ * Scroll locking is implemented as a stack so that cases such as
+ * dropdowns within dropdowns are handled well.
+ *
+ * @param {HTMLElement} element The element that should lock scroll.
+ */
+ pushScrollLock: function(element) {
+ // Prevent pushing the same element twice
+ if (this._lockingElements.indexOf(element) >= 0) {
+ return;
+ }
+
+ if (this._lockingElements.length === 0) {
+ this._lockScrollInteractions();
+ }
+
+ this._lockingElements.push(element);
+
+ this._lockedElementCache = [];
+ this._unlockedElementCache = [];
+ },
+
+ /**
+ * Remove an element from the scroll lock stack. The element being
+ * removed does not need to be the most recently pushed element. However,
+ * the scroll lock constraints only change when the most recently pushed
+ * element is removed.
+ *
+ * @param {HTMLElement} element The element to remove from the scroll
+ * lock stack.
+ */
+ removeScrollLock: function(element) {
+ var index = this._lockingElements.indexOf(element);
+
+ if (index === -1) {
+ return;
+ }
+
+ this._lockingElements.splice(index, 1);
+
+ this._lockedElementCache = [];
+ this._unlockedElementCache = [];
+
+ if (this._lockingElements.length === 0) {
+ this._unlockScrollInteractions();
+ }
+ },
+
+ _lockingElements: [],
+
+ _lockedElementCache: null,
+
+ _unlockedElementCache: null,
+
+ _hasCachedLockedElement: function(element) {
+ return this._lockedElementCache.indexOf(element) > -1;
+ },
+
+ _hasCachedUnlockedElement: function(element) {
+ return this._unlockedElementCache.indexOf(element) > -1;
+ },
+
+ _composedTreeContains: function(element, child) {
+ // NOTE(cdata): This method iterates over content elements and their
+ // corresponding distributed nodes to implement a contains-like method
+ // that pierces through the composed tree of the ShadowDOM. Results of
+ // this operation are cached (elsewhere) on a per-scroll-lock basis, to
+ // guard against potentially expensive lookups happening repeatedly as
+ // a user scrolls / touchmoves.
+ var contentElements;
+ var distributedNodes;
+ var contentIndex;
+ var nodeIndex;
+
+ if (element.contains(child)) {
+ return true;
+ }
+
+ contentElements = Polymer.dom(element).querySelectorAll('content,slot');
+
+ for (contentIndex = 0; contentIndex < contentElements.length; ++contentIndex) {
+
+ distributedNodes = Polymer.dom(contentElements[contentIndex]).getDistributedNodes();
+
+ for (nodeIndex = 0; nodeIndex < distributedNodes.length; ++nodeIndex) {
+ // Polymer 2.x returns slot.assignedNodes which can contain text nodes.
+ if (distributedNodes[nodeIndex].nodeType !== Node.ELEMENT_NODE) continue;
+
+ if (this._composedTreeContains(distributedNodes[nodeIndex], child)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ },
+
+ _scrollInteractionHandler: function(event) {
+ // Avoid canceling an event with cancelable=false, e.g. scrolling is in
+ // progress and cannot be interrupted.
+ if (event.cancelable && this._shouldPreventScrolling(event)) {
+ event.preventDefault();
+ }
+ // If event has targetTouches (touch event), update last touch position.
+ if (event.targetTouches) {
+ var touch = event.targetTouches[0];
+ lastTouchPosition.pageX = touch.pageX;
+ lastTouchPosition.pageY = touch.pageY;
+ }
+ },
+
+ _lockScrollInteractions: function() {
+ this._boundScrollHandler = this._boundScrollHandler ||
+ this._scrollInteractionHandler.bind(this);
+ for (var i = 0, l = scrollEvents.length; i < l; i++) {
+ // NOTE: browsers that don't support objects as third arg will
+ // interpret it as boolean, hence useCapture = true in this case.
+ document.addEventListener(scrollEvents[i], this._boundScrollHandler, {
+ capture: true,
+ passive: false
+ });
+ }
+ },
+
+ _unlockScrollInteractions: function() {
+ for (var i = 0, l = scrollEvents.length; i < l; i++) {
+ // NOTE: browsers that don't support objects as third arg will
+ // interpret it as boolean, hence useCapture = true in this case.
+ document.removeEventListener(scrollEvents[i], this._boundScrollHandler, {
+ capture: true,
+ passive: false
+ });
+ }
+ },
+
+ /**
+ * Returns true if the event causes scroll outside the current locking
+ * element, e.g. pointer/keyboard interactions, or scroll "leaking"
+ * outside the locking element when it is already at its scroll boundaries.
+ * @param {!Event} event
+ * @return {boolean}
+ * @private
+ */
+ _shouldPreventScrolling: function(event) {
+
+ // Update if root target changed. For touch events, ensure we don't
+ // update during touchmove.
+ var target = Polymer.dom(event).rootTarget;
+ if (event.type !== 'touchmove' && lastRootTarget !== target) {
+ lastRootTarget = target;
+ lastScrollableNodes = this._getScrollableNodes(Polymer.dom(event).path);
+ }
+
+ // Prevent event if no scrollable nodes.
+ if (!lastScrollableNodes.length) {
+ return true;
+ }
+ // Don't prevent touchstart event inside the locking element when it has
+ // scrollable nodes.
+ if (event.type === 'touchstart') {
+ return false;
+ }
+ // Get deltaX/Y.
+ var info = this._getScrollInfo(event);
+ // Prevent if there is no child that can scroll.
+ return !this._getScrollingNode(lastScrollableNodes, info.deltaX, info.deltaY);
+ },
+
+ /**
+ * Returns an array of scrollable nodes up to the current locking element,
+ * which is included too if scrollable.
+ * @param {!Array<Node>} nodes
+ * @return {Array<Node>} scrollables
+ * @private
+ */
+ _getScrollableNodes: function(nodes) {
+ var scrollables = [];
+ var lockingIndex = nodes.indexOf(this.currentLockingElement);
+ // Loop from root target to locking element (included).
+ for (var i = 0; i <= lockingIndex; i++) {
+ // Skip non-Element nodes.
+ if (nodes[i].nodeType !== Node.ELEMENT_NODE) {
+ continue;
+ }
+ var node = /** @type {!Element} */ (nodes[i]);
+ // Check inline style before checking computed style.
+ var style = node.style;
+ if (style.overflow !== 'scroll' && style.overflow !== 'auto') {
+ style = window.getComputedStyle(node);
+ }
+ if (style.overflow === 'scroll' || style.overflow === 'auto') {
+ scrollables.push(node);
+ }
+ }
+ return scrollables;
+ },
+
+ /**
+ * Returns the node that is scrolling. If there is no scrolling,
+ * returns undefined.
+ * @param {!Array<Node>} nodes
+ * @param {number} deltaX Scroll delta on the x-axis
+ * @param {number} deltaY Scroll delta on the y-axis
+ * @return {Node|undefined}
+ * @private
+ */
+ _getScrollingNode: function(nodes, deltaX, deltaY) {
+ // No scroll.
+ if (!deltaX && !deltaY) {
+ return;
+ }
+ // Check only one axis according to where there is more scroll.
+ // Prefer vertical to horizontal.
+ var verticalScroll = Math.abs(deltaY) >= Math.abs(deltaX);
+ for (var i = 0; i < nodes.length; i++) {
+ var node = nodes[i];
+ var canScroll = false;
+ if (verticalScroll) {
+ // delta < 0 is scroll up, delta > 0 is scroll down.
+ canScroll = deltaY < 0 ? node.scrollTop > 0 :
+ node.scrollTop < node.scrollHeight - node.clientHeight;
+ } else {
+ // delta < 0 is scroll left, delta > 0 is scroll right.
+ canScroll = deltaX < 0 ? node.scrollLeft > 0 :
+ node.scrollLeft < node.scrollWidth - node.clientWidth;
+ }
+ if (canScroll) {
+ return node;
+ }
+ }
+ },
+
+ /**
+ * Returns scroll `deltaX` and `deltaY`.
+ * @param {!Event} event The scroll event
+ * @return {{deltaX: number, deltaY: number}} Object containing the
+ * x-axis scroll delta (positive: scroll right, negative: scroll left,
+ * 0: no scroll), and the y-axis scroll delta (positive: scroll down,
+ * negative: scroll up, 0: no scroll).
+ * @private
+ */
+ _getScrollInfo: function(event) {
+ var info = {
+ deltaX: event.deltaX,
+ deltaY: event.deltaY
+ };
+ // Already available.
+ if ('deltaX' in event) {
+ // do nothing, values are already good.
+ }
+ // Safari has scroll info in `wheelDeltaX/Y`.
+ else if ('wheelDeltaX' in event) {
+ info.deltaX = -event.wheelDeltaX;
+ info.deltaY = -event.wheelDeltaY;
+ }
+ // Firefox has scroll info in `detail` and `axis`.
+ else if ('axis' in event) {
+ info.deltaX = event.axis === 1 ? event.detail : 0;
+ info.deltaY = event.axis === 2 ? event.detail : 0;
+ }
+ // On mobile devices, calculate scroll direction.
+ else if (event.targetTouches) {
+ var touch = event.targetTouches[0];
+ // Touch moves from right to left => scrolling goes right.
+ info.deltaX = lastTouchPosition.pageX - touch.pageX;
+ // Touch moves from down to up => scrolling goes down.
+ info.deltaY = lastTouchPosition.pageY - touch.pageY;
+ }
+ return info;
+ }
+ };
+ })();
+</script> \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/iron-dropdown.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/iron-dropdown.html
new file mode 100644
index 00000000000..a693cccda7c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-dropdown/iron-dropdown.html
@@ -0,0 +1,349 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html">
+<link rel="import" href="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
+<link rel="import" href="../iron-behaviors/iron-control-state.html">
+<link rel="import" href="../iron-overlay-behavior/iron-overlay-behavior.html">
+<link rel="import" href="../neon-animation/neon-animation-runner-behavior.html">
+<link rel="import" href="iron-dropdown-scroll-manager.html">
+
+<!--
+`<iron-dropdown>` is a generalized element that is useful when you have
+hidden content (`dropdown-content`) that is revealed due to some change in
+state that should cause it to do so.
+
+Note that this is a low-level element intended to be used as part of other
+composite elements that cause dropdowns to be revealed.
+
+Examples of elements that might be implemented using an `iron-dropdown`
+include comboboxes, menubuttons, selects. The list goes on.
+
+The `<iron-dropdown>` element exposes attributes that allow the position
+of the `dropdown-content` relative to the `dropdown-trigger` to be
+configured.
+
+ <iron-dropdown horizontal-align="right" vertical-align="top">
+ <div slot="dropdown-content">Hello!</div>
+ </iron-dropdown>
+
+In the above example, the `<div>` assigned to the `dropdown-content` slot will be
+hidden until the dropdown element has `opened` set to true, or when the `open`
+method is called on the element.
+
+@demo demo/index.html
+-->
+
+<dom-module id="iron-dropdown">
+ <template>
+ <style>
+ :host {
+ position: fixed;
+ }
+
+ #contentWrapper ::slotted(*) {
+ overflow: auto;
+ }
+
+ #contentWrapper.animating ::slotted(*) {
+ overflow: hidden;
+ }
+ </style>
+
+ <div id="contentWrapper">
+ <slot id="content" name="dropdown-content"></slot>
+ </div>
+ </template>
+
+ <script>
+ (function() {
+ 'use strict';
+
+ Polymer({
+ is: 'iron-dropdown',
+
+ behaviors: [
+ Polymer.IronControlState,
+ Polymer.IronA11yKeysBehavior,
+ Polymer.IronOverlayBehavior,
+ Polymer.NeonAnimationRunnerBehavior
+ ],
+
+ properties: {
+ /**
+ * The orientation against which to align the dropdown content
+ * horizontally relative to the dropdown trigger.
+ * Overridden from `Polymer.IronFitBehavior`.
+ */
+ horizontalAlign: {
+ type: String,
+ value: 'left',
+ reflectToAttribute: true
+ },
+
+ /**
+ * The orientation against which to align the dropdown content
+ * vertically relative to the dropdown trigger.
+ * Overridden from `Polymer.IronFitBehavior`.
+ */
+ verticalAlign: {
+ type: String,
+ value: 'top',
+ reflectToAttribute: true
+ },
+
+ /**
+ * An animation config. If provided, this will be used to animate the
+ * opening of the dropdown. Pass an Array for multiple animations.
+ * See `neon-animation` documentation for more animation configuration
+ * details.
+ */
+ openAnimationConfig: {
+ type: Object
+ },
+
+ /**
+ * An animation config. If provided, this will be used to animate the
+ * closing of the dropdown. Pass an Array for multiple animations.
+ * See `neon-animation` documentation for more animation configuration
+ * details.
+ */
+ closeAnimationConfig: {
+ type: Object
+ },
+
+ /**
+ * If provided, this will be the element that will be focused when
+ * the dropdown opens.
+ */
+ focusTarget: {
+ type: Object
+ },
+
+ /**
+ * Set to true to disable animations when opening and closing the
+ * dropdown.
+ */
+ noAnimations: {
+ type: Boolean,
+ value: false
+ },
+
+ /**
+ * By default, the dropdown will constrain scrolling on the page
+ * to itself when opened.
+ * Set to true in order to prevent scroll from being constrained
+ * to the dropdown when it opens.
+ */
+ allowOutsideScroll: {
+ type: Boolean,
+ value: false
+ },
+
+ /**
+ * Callback for scroll events.
+ * @type {Function}
+ * @private
+ */
+ _boundOnCaptureScroll: {
+ type: Function,
+ value: function() {
+ return this._onCaptureScroll.bind(this);
+ }
+ }
+ },
+
+ listeners: {
+ 'neon-animation-finish': '_onNeonAnimationFinish'
+ },
+
+ observers: [
+ '_updateOverlayPosition(positionTarget, verticalAlign, horizontalAlign, verticalOffset, horizontalOffset)'
+ ],
+
+ /**
+ * The element that is contained by the dropdown, if any.
+ */
+ get containedElement() {
+ // Polymer 2.x returns slot.assignedNodes which can contain text nodes.
+ var nodes = Polymer.dom(this.$.content).getDistributedNodes();
+ for (var i = 0, l = nodes.length; i < l; i++) {
+ if (nodes[i].nodeType === Node.ELEMENT_NODE) {
+ return nodes[i];
+ }
+ }
+ },
+
+ ready: function() {
+ // Memoized scrolling position, used to block scrolling outside.
+ this._scrollTop = 0;
+ this._scrollLeft = 0;
+ // Used to perform a non-blocking refit on scroll.
+ this._refitOnScrollRAF = null;
+ },
+
+ attached: function () {
+ if (!this.sizingTarget || this.sizingTarget === this) {
+ this.sizingTarget = this.containedElement || this;
+ }
+ },
+
+ detached: function() {
+ this.cancelAnimation();
+ document.removeEventListener('scroll', this._boundOnCaptureScroll);
+ Polymer.IronDropdownScrollManager.removeScrollLock(this);
+ },
+
+ /**
+ * Called when the value of `opened` changes.
+ * Overridden from `IronOverlayBehavior`
+ */
+ _openedChanged: function() {
+ if (this.opened && this.disabled) {
+ this.cancel();
+ } else {
+ this.cancelAnimation();
+ this._updateAnimationConfig();
+ this._saveScrollPosition();
+ if (this.opened) {
+ document.addEventListener('scroll', this._boundOnCaptureScroll);
+ !this.allowOutsideScroll && Polymer.IronDropdownScrollManager.pushScrollLock(this);
+ } else {
+ document.removeEventListener('scroll', this._boundOnCaptureScroll);
+ Polymer.IronDropdownScrollManager.removeScrollLock(this);
+ }
+ Polymer.IronOverlayBehaviorImpl._openedChanged.apply(this, arguments);
+ }
+ },
+
+ /**
+ * Overridden from `IronOverlayBehavior`.
+ */
+ _renderOpened: function() {
+ if (!this.noAnimations && this.animationConfig.open) {
+ this.$.contentWrapper.classList.add('animating');
+ this.playAnimation('open');
+ } else {
+ Polymer.IronOverlayBehaviorImpl._renderOpened.apply(this, arguments);
+ }
+ },
+
+ /**
+ * Overridden from `IronOverlayBehavior`.
+ */
+ _renderClosed: function() {
+ if (!this.noAnimations && this.animationConfig.close) {
+ this.$.contentWrapper.classList.add('animating');
+ this.playAnimation('close');
+ } else {
+ Polymer.IronOverlayBehaviorImpl._renderClosed.apply(this, arguments);
+ }
+ },
+
+ /**
+ * Called when animation finishes on the dropdown (when opening or
+ * closing). Responsible for "completing" the process of opening or
+ * closing the dropdown by positioning it or setting its display to
+ * none.
+ */
+ _onNeonAnimationFinish: function() {
+ this.$.contentWrapper.classList.remove('animating');
+ if (this.opened) {
+ this._finishRenderOpened();
+ } else {
+ this._finishRenderClosed();
+ }
+ },
+
+ _onCaptureScroll: function() {
+ if (!this.allowOutsideScroll) {
+ this._restoreScrollPosition();
+ } else {
+ this._refitOnScrollRAF && window.cancelAnimationFrame(this._refitOnScrollRAF);
+ this._refitOnScrollRAF = window.requestAnimationFrame(this.refit.bind(this));
+ }
+ },
+
+ /**
+ * Memoizes the scroll position of the outside scrolling element.
+ * @private
+ */
+ _saveScrollPosition: function() {
+ if (document.scrollingElement) {
+ this._scrollTop = document.scrollingElement.scrollTop;
+ this._scrollLeft = document.scrollingElement.scrollLeft;
+ } else {
+ // Since we don't know if is the body or html, get max.
+ this._scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
+ this._scrollLeft = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);
+ }
+ },
+
+ /**
+ * Resets the scroll position of the outside scrolling element.
+ * @private
+ */
+ _restoreScrollPosition: function() {
+ if (document.scrollingElement) {
+ document.scrollingElement.scrollTop = this._scrollTop;
+ document.scrollingElement.scrollLeft = this._scrollLeft;
+ } else {
+ // Since we don't know if is the body or html, set both.
+ document.documentElement.scrollTop = this._scrollTop;
+ document.documentElement.scrollLeft = this._scrollLeft;
+ document.body.scrollTop = this._scrollTop;
+ document.body.scrollLeft = this._scrollLeft;
+ }
+ },
+
+ /**
+ * Constructs the final animation config from different properties used
+ * to configure specific parts of the opening and closing animations.
+ */
+ _updateAnimationConfig: function() {
+ // Update the animation node to be the containedElement.
+ var animationNode = this.containedElement;
+ var animations = [].concat(this.openAnimationConfig || []).concat(this.closeAnimationConfig || []);
+ for (var i = 0; i < animations.length; i++) {
+ animations[i].node = animationNode;
+ }
+ this.animationConfig = {
+ open: this.openAnimationConfig,
+ close: this.closeAnimationConfig
+ };
+ },
+
+ /**
+ * Updates the overlay position based on configured horizontal
+ * and vertical alignment.
+ */
+ _updateOverlayPosition: function() {
+ if (this.isAttached) {
+ // This triggers iron-resize, and iron-overlay-behavior will call refit if needed.
+ this.notifyResize();
+ }
+ },
+
+ /**
+ * Apply focus to focusTarget or containedElement
+ */
+ _applyFocus: function() {
+ var focusTarget = this.focusTarget || this.containedElement;
+ if (focusTarget && this.opened && !this.noAutoFocus) {
+ focusTarget.focus();
+ } else {
+ Polymer.IronOverlayBehaviorImpl._applyFocus.apply(this, arguments);
+ }
+ }
+ });
+ })();
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/.bower.json
new file mode 100644
index 00000000000..a577ee88567
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/.bower.json
@@ -0,0 +1,59 @@
+{
+ "name": "iron-fit-behavior",
+ "version": "2.2.0",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "Fits an element inside another element",
+ "private": true,
+ "main": "iron-fit-behavior.html",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "behavior"
+ ],
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-fit-behavior.git"
+ },
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "homepage": "https://github.com/PolymerElements/iron-fit-behavior",
+ "_release": "2.2.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.2.0",
+ "commit": "ec88a7bc2c4fcf37af6892b790e466b8fd5c6af9"
+ },
+ "_source": "https://github.com/PolymerElements/iron-fit-behavior.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/iron-fit-behavior"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/.github/CODEOWNERS
new file mode 100644
index 00000000000..c5097c0c903
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @valdrinkoshi
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..0bd8a80654a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-fit-behavior/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/.travis.yml
new file mode 100644
index 00000000000..873670d26a8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/.travis.yml
@@ -0,0 +1,33 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e '\n\033[31mERROR:\033[0m
+ Typings are stale. Please run "npm run format".' && false)
+env:
+ global:
+ - secure: >-
+ L4lSnuQZDY+YcXYzBZSRKjJJ1rZf18Lc/8YDgQPfkMkAItrRHGR8vblBoKiPAmtvgNxztcpZxAXTiDy1vAeVv54QnX9b1JsuOs7rrQxB4BS04Dj7LdT6DDu1p/V09MJBN11lzLVxgpxljbumwGWE4gfpDl2+rjbBt7cRV5VkVnE=
+ - secure: >-
+ H7dHZ9FQvJszK2UMNZJiZmzOPET3muO/XvlkUc1x3KcUlV5/tD/404V05XfFMowH7DavHFYleZkb89deYjq9PHncO9c4bp4SHD7HKN4FaGyhzfpXjg66v3dZH/OcERjaas337uUE2jo/x1jCq4HJCz2bMVh+bvd4du1C/2OWarc=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+ sauce_connect: true
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/README.md
new file mode 100644
index 00000000000..4900ab986fc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/README.md
@@ -0,0 +1,43 @@
+[![Build status](https://travis-ci.org/PolymerElements/iron-fit-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-fit-behavior)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/iron-fit-behavior)_
+
+
+## Polymer.IronFitBehavior
+
+`Polymer.IronFitBehavior` fits an element in another element using `max-height` and `max-width`, and
+optionally centers it in the window or another element.
+
+The element will only be sized and/or positioned if it has not already been sized and/or positioned
+by CSS.
+
+| CSS properties | Action |
+| --- | --- |
+| `position` set | Element is not centered horizontally or vertically |
+| `top` or `bottom` set | Element is not vertically centered |
+| `left` or `right` set | Element is not horizontally centered |
+| `max-height` set | Element respects `max-height` |
+| `max-width` set | Element respects `max-width` |
+
+`Polymer.IronFitBehavior` can position an element into another element using
+`verticalAlign` and `horizontalAlign`. This will override the element's css position.
+
+```html
+ <div class="container">
+ <iron-fit-impl vertical-align="top" horizontal-align="auto">
+ Positioned into the container
+ </iron-fit-impl>
+ </div>
+```
+
+Use `noOverlap` to position the element around another element without overlapping it.
+
+```html
+ <div class="container">
+ <iron-fit-impl no-overlap vertical-align="auto" horizontal-align="auto">
+ Positioned around the container
+ </iron-fit-impl>
+ </div>
+```
+
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/bower.json
new file mode 100644
index 00000000000..bd865a4a148
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/bower.json
@@ -0,0 +1,49 @@
+{
+ "name": "iron-fit-behavior",
+ "version": "2.2.0",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "Fits an element inside another element",
+ "private": true,
+ "main": "iron-fit-behavior.html",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "behavior"
+ ],
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-fit-behavior.git"
+ },
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/demo/index.html
new file mode 100644
index 00000000000..3b166d9be1f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/demo/index.html
@@ -0,0 +1,175 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+
+<head>
+
+ <title>iron-fit-behavior demo</title>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="simple-fit.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+
+ <custom-style><style is="custom-style" include="demo-pages-shared-styles">
+ .centered {
+ min-width: 600px;
+ }
+ demo-snippet {
+ --demo-snippet-code: {
+ max-height: 250px;
+ }
+ }
+ </style></custom-style>
+
+</head>
+
+<body unresolved class="centered">
+ <h3>
+ An element with <code>IronFitBehavior</code> can be centered in
+ <code>fitInto</code> or positioned around a <code>positionTarget</code>
+ </h3>
+ <demo-snippet>
+ <template>
+ <style>
+ .target {
+ cursor: pointer;
+ text-align: center;
+ display: inline-block;
+ box-sizing: border-box;
+ border: 1px solid;
+ width: 120px;
+ padding: 26px 0;
+ margin: 8px;
+ }
+
+ #myFit {
+ z-index: 10;
+ padding: 20px;
+ overflow: auto;
+ min-width: 100px;
+ min-height: 100px;
+ }
+
+ button {
+ background-color: white;
+ border-radius: 5px;
+ border-width: 1px;
+ }
+ button.selected {
+ background-color: #b3e5fc;
+ }
+ </style>
+ <dom-bind><template is="dom-bind">
+ <template is="dom-repeat" items="[[containers]]">
+ <div class="target" on-tap="updatePositionTarget">Target</div>
+ </template>
+ <simple-fit id="myFit" auto-fit-on-attach>
+ <h2>Align</h2>
+ <p>
+ <button on-tap="updateAlign" vertical-align="top">top</button>
+ <button on-tap="updateAlign" vertical-align="middle">middle</button>
+ <button on-tap="updateAlign" vertical-align="bottom">bottom</button>
+ <button on-tap="updateAlign" vertical-align="auto">auto</button>
+ <button on-tap="updateAlign" vertical-align>null</button>
+ </p>
+ <p>
+ <button on-tap="updateAlign" horizontal-align="left">left</button>
+ <button on-tap="updateAlign" horizontal-align="center">center</button>
+ <button on-tap="updateAlign" horizontal-align="right">right</button>
+ <button on-tap="updateAlign" horizontal-align="auto">auto</button>
+ <button on-tap="updateAlign" horizontal-align>null</button>
+ </p>
+ <button on-tap="toggleNoOverlap">no overlap</button>
+ <button on-tap="toggleDynamicAlign">dynamic align</button>
+ </simple-fit>
+ <script>
+
+ var template = document.querySelector('template[is="dom-bind"]');
+
+ template.containers = new Array(30);
+
+ template.updatePositionTarget = function(e) {
+ var target = Polymer.dom(e).rootTarget;
+ target = myFit.positionTarget === target ? myFit._defaultPositionTarget : target;
+ myFit.positionTarget.style.backgroundColor = '';
+ target.style.backgroundColor = 'orange';
+ myFit.positionTarget = target;
+ refit();
+ };
+
+ template.updateAlign = function(e) {
+ var target = Polymer.dom(e).rootTarget;
+ if (target.hasAttribute('horizontal-align')) {
+ myFit.horizontalAlign = target.getAttribute('horizontal-align');
+ var children = target.parentNode.querySelectorAll('[horizontal-align]');
+ for (var i = 0; i < children.length; i++) {
+ toggleClass(children[i], 'selected', children[i] === target);
+ }
+ }
+ if (target.hasAttribute('vertical-align')) {
+ myFit.verticalAlign = target.getAttribute('vertical-align');
+ var children = target.parentNode.querySelectorAll('[vertical-align]');
+ for (var i = 0; i < children.length; i++) {
+ toggleClass(children[i], 'selected', children[i] === target);
+ }
+ }
+ refit();
+ };
+
+ template.toggleNoOverlap = function(e) {
+ myFit.noOverlap = !myFit.noOverlap;
+ toggleClass(Polymer.dom(e).rootTarget, 'selected', myFit.noOverlap);
+ refit();
+ };
+
+ template.toggleDynamicAlign = function(e) {
+ myFit.dynamicAlign = !myFit.dynamicAlign;
+ toggleClass(Polymer.dom(e).rootTarget, 'selected', myFit.dynamicAlign);
+ refit();
+ };
+
+ // Support hybrid mode
+ var templatev1 = document.querySelector('dom-bind');
+ templatev1.containers = template.containers;
+ templatev1.updatePositionTarget = template.updatePositionTarget;
+ templatev1.updateAlign = template.updateAlign;
+ templatev1.toggleNoOverlap = template.toggleNoOverlap;
+ templatev1.toggleDynamicAlign = template.toggleDynamicAlign;
+
+ // Listen for resize and scroll on window.
+ window.addEventListener('resize', refit);
+ window.addEventListener('scroll', refit);
+
+ var _raf = null;
+ function refit() {
+ _raf && window.cancelAnimationFrame(_raf);
+ _raf = window.requestAnimationFrame(function() {
+ _raf = null;
+ myFit.refit();
+ });
+ }
+
+ function toggleClass(element, cssClass, condition) {
+ element.classList[condition ? 'add' : 'remove'](cssClass);
+ }
+ </script>
+ </template></dom-bind>
+ </template>
+ </demo-snippet>
+
+</body>
+
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/demo/simple-fit.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/demo/simple-fit.html
new file mode 100644
index 00000000000..c7c6b876e36
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/demo/simple-fit.html
@@ -0,0 +1,28 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../iron-fit-behavior.html">
+<link rel="import" href="../../paper-styles/color.html">
+
+<dom-module id="simple-fit">
+ <template>
+ <style>
+ :host {
+ background-color: var(--paper-light-blue-500);
+ color: white;
+ text-align: center;
+ }
+ </style>
+ <slot></slot>
+ </template>
+ <script>
+ Polymer({is: 'simple-fit', behaviors: [Polymer.IronFitBehavior]});
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/index.html
new file mode 100644
index 00000000000..5ffa7d61cec
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/index.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+
+ <title>iron-fit-behavior</title>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../polymer/polymer.html">
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/iron-fit-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/iron-fit-behavior.d.ts
new file mode 100644
index 00000000000..e9356e60f21
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/iron-fit-behavior.d.ts
@@ -0,0 +1,211 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-fit-behavior.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * `Polymer.IronFitBehavior` fits an element in another element using `max-height`
+ * and `max-width`, and optionally centers it in the window or another element.
+ *
+ * The element will only be sized and/or positioned if it has not already been
+ * sized and/or positioned by CSS.
+ *
+ * CSS properties | Action
+ * -----------------------------|-------------------------------------------
+ * `position` set | Element is not centered horizontally or
+ * vertically `top` or `bottom` set | Element is not vertically centered
+ * `left` or `right` set | Element is not horizontally centered
+ * `max-height` set | Element respects `max-height`
+ * `max-width` set | Element respects `max-width`
+ *
+ * `Polymer.IronFitBehavior` can position an element into another element using
+ * `verticalAlign` and `horizontalAlign`. This will override the element's css
+ * position.
+ *
+ * <div class="container">
+ * <iron-fit-impl vertical-align="top" horizontal-align="auto">
+ * Positioned into the container
+ * </iron-fit-impl>
+ * </div>
+ *
+ * Use `noOverlap` to position the element around another element without
+ * overlapping it.
+ *
+ * <div class="container">
+ * <iron-fit-impl no-overlap vertical-align="auto" horizontal-align="auto">
+ * Positioned around the container
+ * </iron-fit-impl>
+ * </div>
+ *
+ * Use `horizontalOffset, verticalOffset` to offset the element from its
+ * `positionTarget`; `Polymer.IronFitBehavior` will collapse these in order to keep
+ * the element within `fitInto` boundaries, while preserving the element's CSS
+ * margin values.
+ *
+ * <div class="container">
+ * <iron-fit-impl vertical-align="top" vertical-offset="20">
+ * With vertical offset
+ * </iron-fit-impl>
+ * </div>
+ *
+ *
+ *
+ */
+ interface IronFitBehavior {
+
+ /**
+ * The element that will receive a `max-height`/`width`. By default it is
+ * the same as `this`, but it can be set to a child element. This is useful,
+ * for example, for implementing a scrolling region inside the element.
+ */
+ sizingTarget: Element;
+
+ /**
+ * The element to fit `this` into.
+ */
+ fitInto: object|null|undefined;
+
+ /**
+ * Will position the element around the positionTarget without overlapping
+ * it.
+ */
+ noOverlap: boolean|null|undefined;
+
+ /**
+ * The element that should be used to position the element. If not set, it
+ * will default to the parent node.
+ */
+ positionTarget: Element;
+
+ /**
+ * The orientation against which to align the element horizontally
+ * relative to the `positionTarget`. Possible values are "left", "right",
+ * "center", "auto".
+ */
+ horizontalAlign: string|null|undefined;
+
+ /**
+ * The orientation against which to align the element vertically
+ * relative to the `positionTarget`. Possible values are "top", "bottom",
+ * "middle", "auto".
+ */
+ verticalAlign: string|null|undefined;
+
+ /**
+ * If true, it will use `horizontalAlign` and `verticalAlign` values as
+ * preferred alignment and if there's not enough space, it will pick the
+ * values which minimize the cropping.
+ */
+ dynamicAlign: boolean|null|undefined;
+
+ /**
+ * A pixel value that will be added to the position calculated for the
+ * given `horizontalAlign`, in the direction of alignment. You can think
+ * of it as increasing or decreasing the distance to the side of the
+ * screen given by `horizontalAlign`.
+ *
+ * If `horizontalAlign` is "left" or "center", this offset will increase or
+ * decrease the distance to the left side of the screen: a negative offset
+ * will move the dropdown to the left; a positive one, to the right.
+ *
+ * Conversely if `horizontalAlign` is "right", this offset will increase
+ * or decrease the distance to the right side of the screen: a negative
+ * offset will move the dropdown to the right; a positive one, to the left.
+ */
+ horizontalOffset: number|null|undefined;
+
+ /**
+ * A pixel value that will be added to the position calculated for the
+ * given `verticalAlign`, in the direction of alignment. You can think
+ * of it as increasing or decreasing the distance to the side of the
+ * screen given by `verticalAlign`.
+ *
+ * If `verticalAlign` is "top" or "middle", this offset will increase or
+ * decrease the distance to the top side of the screen: a negative offset
+ * will move the dropdown upwards; a positive one, downwards.
+ *
+ * Conversely if `verticalAlign` is "bottom", this offset will increase
+ * or decrease the distance to the bottom side of the screen: a negative
+ * offset will move the dropdown downwards; a positive one, upwards.
+ */
+ verticalOffset: number|null|undefined;
+
+ /**
+ * Set to true to auto-fit on attach.
+ */
+ autoFitOnAttach: boolean|null|undefined;
+ _fitInfo: object|null;
+ readonly _fitWidth: any;
+ readonly _fitHeight: any;
+ readonly _fitLeft: any;
+ readonly _fitTop: any;
+
+ /**
+ * The element that should be used to position the element,
+ * if no position target is configured.
+ *
+ */
+ readonly _defaultPositionTarget: any;
+
+ /**
+ * The horizontal align value, accounting for the RTL/LTR text direction.
+ *
+ */
+ readonly _localeHorizontalAlign: any;
+ attached(): void;
+ detached(): void;
+
+ /**
+ * Positions and fits the element into the `fitInto` element.
+ */
+ fit(): void;
+
+ /**
+ * Memoize information needed to position and size the target element.
+ */
+ _discoverInfo(): void;
+
+ /**
+ * Resets the target element's position and size constraints, and clear
+ * the memoized data.
+ */
+ resetFit(): void;
+
+ /**
+ * Equivalent to calling `resetFit()` and `fit()`. Useful to call this after
+ * the element or the `fitInto` element has been resized, or if any of the
+ * positioning properties (e.g. `horizontalAlign, verticalAlign`) is updated.
+ * It preserves the scroll position of the sizingTarget.
+ */
+ refit(): void;
+
+ /**
+ * Positions the element according to `horizontalAlign, verticalAlign`.
+ */
+ position(): void;
+
+ /**
+ * Constrains the size of the element to `fitInto` by setting `max-height`
+ * and/or `max-width`.
+ */
+ constrain(): void;
+ _sizeDimension(rect: any, positionedBy: any, start: any, end: any, extent: any): void;
+
+ /**
+ * Centers horizontally and vertically if not already positioned. This also
+ * sets `position:fixed`.
+ */
+ center(): void;
+ }
+
+ const IronFitBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/iron-fit-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/iron-fit-behavior.html
new file mode 100644
index 00000000000..b335c704d25
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/iron-fit-behavior.html
@@ -0,0 +1,679 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<script>
+ /**
+ `Polymer.IronFitBehavior` fits an element in another element using `max-height`
+ and `max-width`, and optionally centers it in the window or another element.
+
+ The element will only be sized and/or positioned if it has not already been
+ sized and/or positioned by CSS.
+
+ CSS properties | Action
+ -----------------------------|-------------------------------------------
+ `position` set | Element is not centered horizontally or
+ vertically `top` or `bottom` set | Element is not vertically centered
+ `left` or `right` set | Element is not horizontally centered
+ `max-height` set | Element respects `max-height`
+ `max-width` set | Element respects `max-width`
+
+ `Polymer.IronFitBehavior` can position an element into another element using
+ `verticalAlign` and `horizontalAlign`. This will override the element's css
+ position.
+
+ <div class="container">
+ <iron-fit-impl vertical-align="top" horizontal-align="auto">
+ Positioned into the container
+ </iron-fit-impl>
+ </div>
+
+ Use `noOverlap` to position the element around another element without
+ overlapping it.
+
+ <div class="container">
+ <iron-fit-impl no-overlap vertical-align="auto" horizontal-align="auto">
+ Positioned around the container
+ </iron-fit-impl>
+ </div>
+
+ Use `horizontalOffset, verticalOffset` to offset the element from its
+ `positionTarget`; `Polymer.IronFitBehavior` will collapse these in order to keep
+ the element within `fitInto` boundaries, while preserving the element's CSS
+ margin values.
+
+ <div class="container">
+ <iron-fit-impl vertical-align="top" vertical-offset="20">
+ With vertical offset
+ </iron-fit-impl>
+ </div>
+
+
+ @demo demo/index.html
+ @polymerBehavior
+ */
+ Polymer.IronFitBehavior = {
+
+ properties: {
+
+ /**
+ * The element that will receive a `max-height`/`width`. By default it is
+ * the same as `this`, but it can be set to a child element. This is useful,
+ * for example, for implementing a scrolling region inside the element.
+ * @type {!Element}
+ */
+ sizingTarget: {
+ type: Object,
+ value: function() {
+ return this;
+ }
+ },
+
+ /**
+ * The element to fit `this` into.
+ */
+ fitInto: {type: Object, value: window},
+
+ /**
+ * Will position the element around the positionTarget without overlapping
+ * it.
+ */
+ noOverlap: {type: Boolean},
+
+ /**
+ * The element that should be used to position the element. If not set, it
+ * will default to the parent node.
+ * @type {!Element}
+ */
+ positionTarget: {type: Element},
+
+ /**
+ * The orientation against which to align the element horizontally
+ * relative to the `positionTarget`. Possible values are "left", "right",
+ * "center", "auto".
+ */
+ horizontalAlign: {type: String},
+
+ /**
+ * The orientation against which to align the element vertically
+ * relative to the `positionTarget`. Possible values are "top", "bottom",
+ * "middle", "auto".
+ */
+ verticalAlign: {type: String},
+
+ /**
+ * If true, it will use `horizontalAlign` and `verticalAlign` values as
+ * preferred alignment and if there's not enough space, it will pick the
+ * values which minimize the cropping.
+ */
+ dynamicAlign: {type: Boolean},
+
+ /**
+ * A pixel value that will be added to the position calculated for the
+ * given `horizontalAlign`, in the direction of alignment. You can think
+ * of it as increasing or decreasing the distance to the side of the
+ * screen given by `horizontalAlign`.
+ *
+ * If `horizontalAlign` is "left" or "center", this offset will increase or
+ * decrease the distance to the left side of the screen: a negative offset
+ * will move the dropdown to the left; a positive one, to the right.
+ *
+ * Conversely if `horizontalAlign` is "right", this offset will increase
+ * or decrease the distance to the right side of the screen: a negative
+ * offset will move the dropdown to the right; a positive one, to the left.
+ */
+ horizontalOffset: {type: Number, value: 0, notify: true},
+
+ /**
+ * A pixel value that will be added to the position calculated for the
+ * given `verticalAlign`, in the direction of alignment. You can think
+ * of it as increasing or decreasing the distance to the side of the
+ * screen given by `verticalAlign`.
+ *
+ * If `verticalAlign` is "top" or "middle", this offset will increase or
+ * decrease the distance to the top side of the screen: a negative offset
+ * will move the dropdown upwards; a positive one, downwards.
+ *
+ * Conversely if `verticalAlign` is "bottom", this offset will increase
+ * or decrease the distance to the bottom side of the screen: a negative
+ * offset will move the dropdown downwards; a positive one, upwards.
+ */
+ verticalOffset: {type: Number, value: 0, notify: true},
+
+ /**
+ * Set to true to auto-fit on attach.
+ */
+ autoFitOnAttach: {type: Boolean, value: false},
+
+ /** @type {?Object} */
+ _fitInfo: {type: Object}
+ },
+
+ get _fitWidth() {
+ var fitWidth;
+ if (this.fitInto === window) {
+ fitWidth = this.fitInto.innerWidth;
+ } else {
+ fitWidth = this.fitInto.getBoundingClientRect().width;
+ }
+ return fitWidth;
+ },
+
+ get _fitHeight() {
+ var fitHeight;
+ if (this.fitInto === window) {
+ fitHeight = this.fitInto.innerHeight;
+ } else {
+ fitHeight = this.fitInto.getBoundingClientRect().height;
+ }
+ return fitHeight;
+ },
+
+ get _fitLeft() {
+ var fitLeft;
+ if (this.fitInto === window) {
+ fitLeft = 0;
+ } else {
+ fitLeft = this.fitInto.getBoundingClientRect().left;
+ }
+ return fitLeft;
+ },
+
+ get _fitTop() {
+ var fitTop;
+ if (this.fitInto === window) {
+ fitTop = 0;
+ } else {
+ fitTop = this.fitInto.getBoundingClientRect().top;
+ }
+ return fitTop;
+ },
+
+ /**
+ * The element that should be used to position the element,
+ * if no position target is configured.
+ */
+ get _defaultPositionTarget() {
+ var parent = Polymer.dom(this).parentNode;
+
+ if (parent && parent.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
+ parent = parent.host;
+ }
+
+ return parent;
+ },
+
+ /**
+ * The horizontal align value, accounting for the RTL/LTR text direction.
+ */
+ get _localeHorizontalAlign() {
+ if (this._isRTL) {
+ // In RTL, "left" becomes "right".
+ if (this.horizontalAlign === 'right') {
+ return 'left';
+ }
+ if (this.horizontalAlign === 'left') {
+ return 'right';
+ }
+ }
+ return this.horizontalAlign;
+ },
+
+ /**
+ * True if the element should be positioned instead of centered.
+ * @private
+ */
+ get __shouldPosition() {
+ return (this.horizontalAlign || this.verticalAlign) &&
+ (this.horizontalAlign !== 'center' || this.verticalAlign !== 'middle');
+ },
+
+ attached: function() {
+ // Memoize this to avoid expensive calculations & relayouts.
+ // Make sure we do it only once
+ if (typeof this._isRTL === 'undefined') {
+ this._isRTL = window.getComputedStyle(this).direction == 'rtl';
+ }
+ this.positionTarget = this.positionTarget || this._defaultPositionTarget;
+ if (this.autoFitOnAttach) {
+ if (window.getComputedStyle(this).display === 'none') {
+ setTimeout(function() {
+ this.fit();
+ }.bind(this));
+ } else {
+ // NOTE: shadydom applies distribution asynchronously
+ // for performance reasons webcomponents/shadydom#120
+ // Flush to get correct layout info.
+ window.ShadyDOM && ShadyDOM.flush();
+ this.fit();
+ }
+ }
+ },
+
+ detached: function() {
+ if (this.__deferredFit) {
+ clearTimeout(this.__deferredFit);
+ this.__deferredFit = null;
+ }
+ },
+
+ /**
+ * Positions and fits the element into the `fitInto` element.
+ */
+ fit: function() {
+ this.position();
+ this.constrain();
+ this.center();
+ },
+
+ /**
+ * Memoize information needed to position and size the target element.
+ * @suppress {deprecated}
+ */
+ _discoverInfo: function() {
+ if (this._fitInfo) {
+ return;
+ }
+ var target = window.getComputedStyle(this);
+ var sizer = window.getComputedStyle(this.sizingTarget);
+
+ this._fitInfo = {
+ inlineStyle: {
+ top: this.style.top || '',
+ left: this.style.left || '',
+ position: this.style.position || ''
+ },
+ sizerInlineStyle: {
+ maxWidth: this.sizingTarget.style.maxWidth || '',
+ maxHeight: this.sizingTarget.style.maxHeight || '',
+ boxSizing: this.sizingTarget.style.boxSizing || ''
+ },
+ positionedBy: {
+ vertically: target.top !== 'auto' ?
+ 'top' :
+ (target.bottom !== 'auto' ? 'bottom' : null),
+ horizontally: target.left !== 'auto' ?
+ 'left' :
+ (target.right !== 'auto' ? 'right' : null)
+ },
+ sizedBy: {
+ height: sizer.maxHeight !== 'none',
+ width: sizer.maxWidth !== 'none',
+ minWidth: parseInt(sizer.minWidth, 10) || 0,
+ minHeight: parseInt(sizer.minHeight, 10) || 0
+ },
+ margin: {
+ top: parseInt(target.marginTop, 10) || 0,
+ right: parseInt(target.marginRight, 10) || 0,
+ bottom: parseInt(target.marginBottom, 10) || 0,
+ left: parseInt(target.marginLeft, 10) || 0
+ }
+ };
+ },
+
+ /**
+ * Resets the target element's position and size constraints, and clear
+ * the memoized data.
+ */
+ resetFit: function() {
+ var info = this._fitInfo || {};
+ for (var property in info.sizerInlineStyle) {
+ this.sizingTarget.style[property] = info.sizerInlineStyle[property];
+ }
+ for (var property in info.inlineStyle) {
+ this.style[property] = info.inlineStyle[property];
+ }
+
+ this._fitInfo = null;
+ },
+
+ /**
+ * Equivalent to calling `resetFit()` and `fit()`. Useful to call this after
+ * the element or the `fitInto` element has been resized, or if any of the
+ * positioning properties (e.g. `horizontalAlign, verticalAlign`) is updated.
+ * It preserves the scroll position of the sizingTarget.
+ */
+ refit: function() {
+ var scrollLeft = this.sizingTarget.scrollLeft;
+ var scrollTop = this.sizingTarget.scrollTop;
+ this.resetFit();
+ this.fit();
+ this.sizingTarget.scrollLeft = scrollLeft;
+ this.sizingTarget.scrollTop = scrollTop;
+ },
+
+ /**
+ * Positions the element according to `horizontalAlign, verticalAlign`.
+ */
+ position: function() {
+ if (!this.__shouldPosition) {
+ // needs to be centered, and it is done after constrain.
+ return;
+ }
+ this._discoverInfo();
+
+ this.style.position = 'fixed';
+ // Need border-box for margin/padding.
+ this.sizingTarget.style.boxSizing = 'border-box';
+ // Set to 0, 0 in order to discover any offset caused by parent stacking
+ // contexts.
+ this.style.left = '0px';
+ this.style.top = '0px';
+
+ var rect = this.getBoundingClientRect();
+ var positionRect = this.__getNormalizedRect(this.positionTarget);
+ var fitRect = this.__getNormalizedRect(this.fitInto);
+
+ var margin = this._fitInfo.margin;
+
+ // Consider the margin as part of the size for position calculations.
+ var size = {
+ width: rect.width + margin.left + margin.right,
+ height: rect.height + margin.top + margin.bottom
+ };
+
+ var position = this.__getPosition(
+ this._localeHorizontalAlign,
+ this.verticalAlign,
+ size,
+ rect,
+ positionRect,
+ fitRect);
+
+ var left = position.left + margin.left;
+ var top = position.top + margin.top;
+
+ // We first limit right/bottom within fitInto respecting the margin,
+ // then use those values to limit top/left.
+ var right = Math.min(fitRect.right - margin.right, left + rect.width);
+ var bottom = Math.min(fitRect.bottom - margin.bottom, top + rect.height);
+
+ // Keep left/top within fitInto respecting the margin.
+ left = Math.max(
+ fitRect.left + margin.left,
+ Math.min(left, right - this._fitInfo.sizedBy.minWidth));
+ top = Math.max(
+ fitRect.top + margin.top,
+ Math.min(top, bottom - this._fitInfo.sizedBy.minHeight));
+
+ // Use right/bottom to set maxWidth/maxHeight, and respect
+ // minWidth/minHeight.
+ this.sizingTarget.style.maxWidth =
+ Math.max(right - left, this._fitInfo.sizedBy.minWidth) + 'px';
+ this.sizingTarget.style.maxHeight =
+ Math.max(bottom - top, this._fitInfo.sizedBy.minHeight) + 'px';
+
+ // Remove the offset caused by any stacking context.
+ this.style.left = (left - rect.left) + 'px';
+ this.style.top = (top - rect.top) + 'px';
+ },
+
+ /**
+ * Constrains the size of the element to `fitInto` by setting `max-height`
+ * and/or `max-width`.
+ */
+ constrain: function() {
+ if (this.__shouldPosition) {
+ return;
+ }
+ this._discoverInfo();
+
+ var info = this._fitInfo;
+ // position at (0px, 0px) if not already positioned, so we can measure the
+ // natural size.
+ if (!info.positionedBy.vertically) {
+ this.style.position = 'fixed';
+ this.style.top = '0px';
+ }
+ if (!info.positionedBy.horizontally) {
+ this.style.position = 'fixed';
+ this.style.left = '0px';
+ }
+
+ // need border-box for margin/padding
+ this.sizingTarget.style.boxSizing = 'border-box';
+ // constrain the width and height if not already set
+ var rect = this.getBoundingClientRect();
+ if (!info.sizedBy.height) {
+ this.__sizeDimension(
+ rect, info.positionedBy.vertically, 'top', 'bottom', 'Height');
+ }
+ if (!info.sizedBy.width) {
+ this.__sizeDimension(
+ rect, info.positionedBy.horizontally, 'left', 'right', 'Width');
+ }
+ },
+
+ /**
+ * @protected
+ * @deprecated
+ */
+ _sizeDimension: function(rect, positionedBy, start, end, extent) {
+ this.__sizeDimension(rect, positionedBy, start, end, extent);
+ },
+
+ /**
+ * @private
+ */
+ __sizeDimension: function(rect, positionedBy, start, end, extent) {
+ var info = this._fitInfo;
+ var fitRect = this.__getNormalizedRect(this.fitInto);
+ var max = extent === 'Width' ? fitRect.width : fitRect.height;
+ var flip = (positionedBy === end);
+ var offset = flip ? max - rect[end] : rect[start];
+ var margin = info.margin[flip ? start : end];
+ var offsetExtent = 'offset' + extent;
+ var sizingOffset = this[offsetExtent] - this.sizingTarget[offsetExtent];
+ this.sizingTarget.style['max' + extent] =
+ (max - margin - offset - sizingOffset) + 'px';
+ },
+
+ /**
+ * Centers horizontally and vertically if not already positioned. This also
+ * sets `position:fixed`.
+ */
+ center: function() {
+ if (this.__shouldPosition) {
+ return;
+ }
+ this._discoverInfo();
+
+ var positionedBy = this._fitInfo.positionedBy;
+ if (positionedBy.vertically && positionedBy.horizontally) {
+ // Already positioned.
+ return;
+ }
+ // Need position:fixed to center
+ this.style.position = 'fixed';
+ // Take into account the offset caused by parents that create stacking
+ // contexts (e.g. with transform: translate3d). Translate to 0,0 and
+ // measure the bounding rect.
+ if (!positionedBy.vertically) {
+ this.style.top = '0px';
+ }
+ if (!positionedBy.horizontally) {
+ this.style.left = '0px';
+ }
+ // It will take in consideration margins and transforms
+ var rect = this.getBoundingClientRect();
+ var fitRect = this.__getNormalizedRect(this.fitInto);
+ if (!positionedBy.vertically) {
+ var top = fitRect.top - rect.top + (fitRect.height - rect.height) / 2;
+ this.style.top = top + 'px';
+ }
+ if (!positionedBy.horizontally) {
+ var left = fitRect.left - rect.left + (fitRect.width - rect.width) / 2;
+ this.style.left = left + 'px';
+ }
+ },
+
+ __getNormalizedRect: function(target) {
+ if (target === document.documentElement || target === window) {
+ return {
+ top: 0,
+ left: 0,
+ width: window.innerWidth,
+ height: window.innerHeight,
+ right: window.innerWidth,
+ bottom: window.innerHeight
+ };
+ }
+ return target.getBoundingClientRect();
+ },
+
+ __getOffscreenArea: function(position, size, fitRect) {
+ var verticalCrop = Math.min(0, position.top) +
+ Math.min(0, fitRect.bottom - (position.top + size.height));
+ var horizontalCrop = Math.min(0, position.left) +
+ Math.min(0, fitRect.right - (position.left + size.width));
+ return Math.abs(verticalCrop) * size.width +
+ Math.abs(horizontalCrop) * size.height;
+ },
+
+
+ __getPosition: function(
+ hAlign, vAlign, size, sizeNoMargins, positionRect, fitRect) {
+ // All the possible configurations.
+ // Ordered as top-left, top-right, bottom-left, bottom-right.
+ var positions = [
+ {
+ verticalAlign: 'top',
+ horizontalAlign: 'left',
+ top: positionRect.top + this.verticalOffset,
+ left: positionRect.left + this.horizontalOffset
+ },
+ {
+ verticalAlign: 'top',
+ horizontalAlign: 'right',
+ top: positionRect.top + this.verticalOffset,
+ left: positionRect.right - size.width - this.horizontalOffset
+ },
+ {
+ verticalAlign: 'bottom',
+ horizontalAlign: 'left',
+ top: positionRect.bottom - size.height - this.verticalOffset,
+ left: positionRect.left + this.horizontalOffset
+ },
+ {
+ verticalAlign: 'bottom',
+ horizontalAlign: 'right',
+ top: positionRect.bottom - size.height - this.verticalOffset,
+ left: positionRect.right - size.width - this.horizontalOffset
+ }
+ ];
+
+ if (this.noOverlap) {
+ // Duplicate.
+ for (var i = 0, l = positions.length; i < l; i++) {
+ var copy = {};
+ for (var key in positions[i]) {
+ copy[key] = positions[i][key];
+ }
+ positions.push(copy);
+ }
+ // Horizontal overlap only.
+ positions[0].top = positions[1].top += positionRect.height;
+ positions[2].top = positions[3].top -= positionRect.height;
+ // Vertical overlap only.
+ positions[4].left = positions[6].left += positionRect.width;
+ positions[5].left = positions[7].left -= positionRect.width;
+ }
+
+ // Consider auto as null for coding convenience.
+ vAlign = vAlign === 'auto' ? null : vAlign;
+ hAlign = hAlign === 'auto' ? null : hAlign;
+
+ if (!hAlign || hAlign === 'center') {
+ positions.push({
+ verticalAlign: 'top',
+ horizontalAlign: 'center',
+ top: positionRect.top + this.verticalOffset +
+ (this.noOverlap ? positionRect.height : 0),
+ left: positionRect.left - sizeNoMargins.width / 2 +
+ positionRect.width / 2 + this.horizontalOffset
+ });
+ positions.push({
+ verticalAlign: 'bottom',
+ horizontalAlign: 'center',
+ top: positionRect.bottom - size.height - this.verticalOffset -
+ (this.noOverlap ? positionRect.height : 0),
+ left: positionRect.left - sizeNoMargins.width / 2 +
+ positionRect.width / 2 + this.horizontalOffset
+ });
+ }
+
+ if (!vAlign || vAlign === 'middle') {
+ positions.push({
+ verticalAlign: 'middle',
+ horizontalAlign: 'left',
+ top: positionRect.top - sizeNoMargins.height / 2 +
+ positionRect.height / 2 + this.verticalOffset,
+ left: positionRect.left + this.horizontalOffset +
+ (this.noOverlap ? positionRect.width : 0)
+ });
+ positions.push({
+ verticalAlign: 'middle',
+ horizontalAlign: 'right',
+ top: positionRect.top - sizeNoMargins.height / 2 +
+ positionRect.height / 2 + this.verticalOffset,
+ left: positionRect.right - size.width - this.horizontalOffset -
+ (this.noOverlap ? positionRect.width : 0)
+ });
+ }
+
+ var position;
+ for (var i = 0; i < positions.length; i++) {
+ var candidate = positions[i];
+ var vAlignOk = candidate.verticalAlign === vAlign;
+ var hAlignOk = candidate.horizontalAlign === hAlign;
+
+ // If both vAlign and hAlign are defined, return exact match.
+ // For dynamicAlign and noOverlap we'll have more than one candidate, so
+ // we'll have to check the offscreenArea to make the best choice.
+ if (!this.dynamicAlign && !this.noOverlap && vAlignOk && hAlignOk) {
+ position = candidate;
+ break;
+ }
+
+ // Align is ok if alignment preferences are respected. If no preferences,
+ // it is considered ok.
+ var alignOk = (!vAlign || vAlignOk) && (!hAlign || hAlignOk);
+
+ // Filter out elements that don't match the alignment (if defined).
+ // With dynamicAlign, we need to consider all the positions to find the
+ // one that minimizes the cropped area.
+ if (!this.dynamicAlign && !alignOk) {
+ continue;
+ }
+
+ candidate.offscreenArea =
+ this.__getOffscreenArea(candidate, size, fitRect);
+ // If not cropped and respects the align requirements, keep it.
+ // This allows to prefer positions overlapping horizontally over the
+ // ones overlapping vertically.
+ if (candidate.offscreenArea === 0 && alignOk) {
+ position = candidate;
+ break;
+ }
+ position = position || candidate;
+ var diff = candidate.offscreenArea - position.offscreenArea;
+ // Check which crops less. If it crops equally, check if at least one
+ // align setting is ok.
+ if (diff < 0 || (diff === 0 && (vAlignOk || hAlignOk))) {
+ position = candidate;
+ }
+ }
+
+ return position;
+ }
+
+ };
+</script> \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/package-lock.json
new file mode 100644
index 00000000000..6b08ab8c052
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/package-lock.json
@@ -0,0 +1,2388 @@
+{
+ "name": "@polymer/iron-fit-behavior",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.3"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.6.3"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.6.3",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.3.tgz",
+ "integrity": "sha512-igaEysRgtg5tYJVIdQ1T2lJ3G6OmoY7g0YVWKHLFiVs4YUChd9IRSiLoHSLffwut+CpsHHBDj4vRxxNEMstctw==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.3"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.3"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.3"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.44",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+ "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz",
+ "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.2",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.105",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.44",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.2",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/package.json
new file mode 100644
index 00000000000..b2584fe5b17
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-fit-behavior/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@polymer/iron-fit-behavior",
+ "private": true,
+ "description": "Fits an element inside another element",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-fit-behavior.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/.bower.json
new file mode 100644
index 00000000000..12214869a4e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/.bower.json
@@ -0,0 +1,64 @@
+{
+ "name": "iron-flex-layout",
+ "version": "2.0.3",
+ "description": "Provide flexbox-based layouts",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "layout"
+ ],
+ "main": "iron-flex-layout.html",
+ "private": true,
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-flex-layout.git"
+ },
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2"
+ },
+ "ignore": [],
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "Polymer/web-component-tester#^4.0.0",
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "pages": {
+ "Flexbox layout guide": "GUIDE.md"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "homepage": "https://github.com/PolymerElements/iron-flex-layout",
+ "_release": "2.0.3",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.0.3",
+ "commit": "67461d70607ca19d17b462b9a649c1585094f798"
+ },
+ "_source": "https://github.com/PolymerElements/iron-flex-layout.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/iron-flex-layout"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/.github/CODEOWNERS
new file mode 100644
index 00000000000..cc86f1ec217
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @notwaldorf
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..b79eca40e83
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-flex-layout/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/.travis.yml
new file mode 100644
index 00000000000..2d3f9f6e271
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/.travis.yml
@@ -0,0 +1,30 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+env:
+ global:
+ - secure: >-
+ idlCNYtNQ7rLGCSl2NuZ++XZEwofpojkakXhL8m34pCX1ZwhGRprHsvNE7h7tz8SIV+mUjuUT8DaM7rlgZ+bLyw/Hq7G15DdmU5puUsCVibFFBBEhh82lxkdK/Rlfo+ytt0MFsbTJljEoqTSbnL0fSeC0cN/7wf6yEQs/+mTR0I=
+ - secure: >-
+ i/rAHa9rxszmbE+RbQ2b7ln6OYzrcoUssdPk36lNeJk/B1HjBS9cfg1PMwSAw+t6yvAN3I0fbOOl4dlGB1K5T4kAtmcAcC3fbptJL08IvK9K15pz/rMEzIBWLXj9oVJliwBZR2GFH+5zv6aFdEwQxh1leBnHQwmKgl24QX8XGO4=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+ sauce_connect: true
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/GUIDE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/GUIDE.md
new file mode 100644
index 00000000000..e230ce07a22
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/GUIDE.md
@@ -0,0 +1,1265 @@
+## Overview
+
+The `iron-flex-layout` component provides simple ways to use [CSS flexible box layout](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Flexible_boxes), also known as _flexbox_. This component provides two different ways to use flexbox:
+
+* Layout classes. The layout class stylesheet provides a simple set of class-based flexbox rules. Layout classes
+ let you specify layout properties directly in markup.
+
+* Custom CSS mixins. The mixin stylesheet includes custom CSS mixins that can be applied
+ inside a CSS rule using the `@apply` function.
+
+Using the classes or CSS mixins is largely a matter of preference. The following sections discuss
+how to use the each of the stylesheets.
+
+> <b>Note:</b> Before using either of these stylesheets, it's helpful to be familiar with the basics
+of flexbox layout. Chris Coyier's [A Complete Guide to Flexbox](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) is a
+good primer.</aside>
+
+### Using layout classes
+
+To use layout classes import the `iron-flex-layout-classes` file. You
+must do this in any element that uses any of the `iron-flex-layout` styles.
+```html
+<link rel="import" href="bower_components/iron-flex-layout/iron-flex-layout-classes.html">
+```
+
+Then include the module(s) that you need:
+```html
+<!-- include classes in the main document -->
+<style is="custom-style" include="iron-flex iron-flex-alignment">
+```
+
+or:
+```html
+<!-- import classes in an element -->
+<style include="iron-flex iron-flex-alignment">
+```
+
+Then simply apply the classes to any element.
+```html
+<div class="layout horizontal wrap">
+```
+
+Many of the layout rules involve combinations of multiple classes (such as `layout horizontal wrap` above),
+and will need a combination of modules.
+The order in which the classes are specified doesn't matter, so `layout horizontal` and `horizontal layout`
+are equivalent.
+
+There are 5 modules available:
+- `iron-flex`. Basic flex layouts.
+- `iron-flex-reverse`. Reverse flexbox layouts.
+- `iron-flex-alignment`. Main axis, cross axis and self alignment.
+- `iron-flex-factors`. All the available flex factors.
+- `iron-positioning`. Generic, non-flexbox positioning helpers.
+
+**Example: using classes in the main document**
+```html
+<head>
+
+ ...
+
+ <link rel="import" href="bower_components/iron-flex-layout/iron-flex-layout-classes.html">
+
+ ...
+
+ <!-- main document -- include the module you need in a custom-style element -->
+ <style is="custom-style" include="iron-flex"></style>
+
+</head>
+<body>
+
+ <div class="layout horizontal">
+ <div>One</div>
+ <div>Two</div>
+ <div>Three</div>
+ </div>
+
+</body>
+```
+**Example: using classes in a Polymer element**
+```html
+<link rel="import" href="bower_components/iron-flex-layout/iron-flex-layout-classes.html">
+
+ ...
+
+<dom-module id="mixin-demo">
+
+ <!-- inside an element -- include the module you need in a standard style element -->
+ <style include="iron-flex"></style>
+
+ <template>
+ <div class="layout horizontal">
+ <div>One</div>
+ <div>Two</div>
+ <div>Three</div>
+ </div>
+ </template>
+
+ <script>
+ Polymer({ is: 'mixin-demo' });
+ </script>
+
+</dom-module>
+```
+
+It's important to note that unlike the previous layout class stylesheets
+(found in `/classes/iron-flex-layout.html`), the new version does not use the `/deep/`
+combinator: it does not work across local DOM boundaries,
+and the modules must be imported into each scope where they're used.
+
+### Using layout mixins
+
+Custom mixins can be applied inside a Polymer
+custom element's stylesheet, **or** inside a `custom-style` stylesheet to apply styles to the
+main document. (They cannot be applied in the main document without a `custom-style` stylesheet.)
+
+**Example: using mixins in the main document**
+```html
+<head>
+
+ ...
+
+ <link rel="import" href="bower_components/iron-flex-layout/iron-flex-layout.html">
+
+ ...
+
+ <!-- main document -- apply mixins in a custom-style element -->
+ <style is="custom-style">
+ .container {
+ @apply --layout-horizontal;
+ @apply --layout-wrap;
+ }
+ </style>
+
+</head>
+<body>
+
+ <div class="container">
+ <div>One</div>
+ <div>Two</div>
+ <div>Three</div>
+ </div>
+
+</body>
+```
+**Example: using mixins in a Polymer element**
+```html
+<link rel="import" href="bower_components/iron-flex-layout/iron-flex-layout.html">
+
+ ...
+
+<dom-module id="mixin-demo">
+
+ <!-- inside an element -- apply mixins in a standard style element -->
+ <style>
+ .container {
+ @apply --layout-horizontal;
+ @apply --layout-wrap;
+ }
+ </style>
+
+ <template>
+ <div class="container">
+ <div>One</div>
+ <div>Two</div>
+ <div>Three</div>
+ </div>
+ </template>
+
+ <script>
+ Polymer({ is: 'mixin-demo' });
+ </script>
+
+</dom-module>
+```
+
+In general the mixins require a little more code to use, but they can be preferable if you
+don't want to use the classes, or if you want to switch layouts based on a media query.
+
+Custom CSS properties and mixins are features provided by the Polymer library.
+See [Cross-scope styling](https://www.polymer-project.org/1.0/docs/devguide/styling.html#xscope-styling)
+in the Polymer developer guide.
+
+## Horizontal and vertical layout
+
+Create a flex container that lays out its children vertically or horizontally.
+
+Class | Mixin | Result
+:-|:-|:-
+<code>layout horizontal</code>| <code>--layout-horizontal</code> | Horizontal layout container.
+<code>layout vertical</code> | <code>--layout-vertical</code> | Vertical layout container.
+
+The classes listed here are included in the `iron-flex` module of the `iron-flex-layout-classes` file.
+
+**Example: classes**
+```html
+<div class="layout horizontal">
+ <div>One</div>
+ <div>Two</div>
+ <div>Three</div>
+</div>
+```
+
+**Example: mixins**
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ }
+
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<style is="custom-style">
+ .container {
+ @apply --layout-horizontal;
+ }
+</style>
+
+<div class="container">
+ <div>One</div>
+ <div>Two</div>
+ <div>Three</div>
+</div>
+```
+
+### Flexible children
+
+Children of a flex container can use flex to control their own sizing.
+
+Class | Mixin | Result
+:-|:-|:-
+<code>flex</code>| <code>--layout-flex</code> | Expand the child to fill available space in the main axis.
+<code>flex-<var>ratio</var></code>| <code>--layout-flex-<var>ratio</var></code> | Assign a flex ratio of 1 to 12.
+<code>flex-none</code>| <code>--layout-flex-none</code> | Don't flex the child.
+<code>flex-auto</code>| <code>--layout-flex-auto</code> | Sets flex `flex-basis` to `auto` and `flex-grow` and `flex-shrink` to 1.
+
+The classes listed here are included in the `iron-flex` module of the `iron-flex-layout-classes` file.
+
+**Example: classes**
+```html
+<div class="horizontal layout">
+ <div>Alpha</div>
+ <div class="flex">Beta (flex)</div>
+ <div>Gamma</div>
+</div>
+```
+
+**Example: mixins**
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ }
+
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<style is="custom-style">
+ .container {
+ @apply --layout-horizontal;
+ }
+ .flexchild {
+ @apply --layout-flex;
+ }
+</style>
+
+<div class="container">
+<div>Alpha</div>
+ <div class="flexchild">Beta (flex)</div>
+ <div>Gamma</div>
+</div>
+```
+
+#### Flexible children in vertical layouts
+
+The same rules can be used for children in vertical layouts.
+
+**Example: classes**
+```html
+<div class="vertical layout" style="height:250px">
+ <div>Alpha</div>
+ <div class="flex">Beta (flex)</div>
+ <div>Gamma</div>
+</div>
+```
+
+**Example: mixins**
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ }
+
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<style is="custom-style">
+ .container {
+ @apply --layout-vertical;
+ }
+ .flexchild {
+ @apply --layout-flex;
+ }
+</style>
+
+<div class="container" style="height: 250px">
+ <div>One</div>
+ <div class="flexchild">Two</div>
+ <div>Three</div>
+</div>
+```
+
+> **Note**: for vertical layouts, the container needs to have a height for the
+children to flex correctly.
+
+#### Flex ratios
+
+Children elements can be told to take up more space by including a "flex ratio"
+from 1 to 12. This is equivalent to specifying the CSS `flex-grow` property.
+
+For example, the following examples make "Gamma" 2x larger than "Beta" and "Alpha" 3x larger, use
+`flex-2` and `flex-3`, respectively.
+
+The classes listed here are included in the `iron-flex-factors` module of the `iron-flex-layout-classes` file.
+
+**Example: classes**
+```html
+<div class="horizontal layout demo">
+ <div class="flex-3">Alpha</div>
+ <div class="flex">Beta</div>
+ <div class="flex-2">Gamma</div>
+</div>
+```
+
+**Example: mixins**
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ }
+
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<style is="custom-style">
+ .container {
+ @apply --layout-horizontal;
+ }
+ .flexchild {
+ @apply --layout-flex;
+ }
+ .flex2child {
+ @apply --layout-flex-2;
+ }
+ .flex3child {
+ @apply --layout-flex-3;
+ }
+</style>
+
+<div class="container">
+ <div class="flex3child">One</div>
+ <div class="flexchild">Two</div>
+ <div class="flex2child">Three</div>
+</div>
+```
+
+### Cross-axis alignment
+
+By default, children stretch to fit the cross-axis (e.g. _vertical_ stretching in a _horizontal_ layout).
+
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout-classes.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ }
+
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<div class="horizontal layout" style="height: 154px">
+ <div>Stretch Fill</div>
+</div>
+```
+
+Center _across_ the main axis (e.g. _vertical_ centering elements in a _horizontal_ layout)
+by adding the `center` class or applying the `--layout-center` mixin.
+
+**Example: classes, cross-axis center**
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout-classes.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ }
+
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<div class="horizontal layout center" style="height: 154px">
+ <div>Center</div>
+</div>
+```
+
+**Example: mixins, cross-axis center**
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ height: 154px;
+ }
+
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<style is="custom-style">
+ .container {
+ @apply --layout-horizontal;
+ @apply --layout-center;
+ }
+</style>
+
+<div class="container" style="height: 154px">
+ <div>Center</div>
+</div>
+```
+
+You can also position at the top/bottom (or left/right in `vertical` layouts) using the `start` or `end`
+classes, or by applying the `--layout-start` or `--layout-end` mixins.
+
+
+**Example: classes, cross-axis start**
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout-classes.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ }
+
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<div class="horizontal layout start" style="height: 154px">
+ <div>start</div>
+</div>
+```
+
+**Example: mixins, cross-axis start**
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ }
+
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<style is="custom-style">
+ .container {
+ @apply --layout-horizontal;
+ @apply --layout-start;
+ }
+</style>
+
+<div class="container" style="height: 154px">
+ <div>start</div>
+</div>
+```
+
+**Example: classes, cross-axis end**
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout-classes.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ }
+
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<div class="horizontal layout end" style="height: 154px">
+ <div>end</div>
+</div>
+```
+
+**Example: mixins, cross-axis end**
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ }
+
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<style is="custom-style">
+ .container {
+ @apply --layout-horizontal;
+ @apply --layout-end;
+ }
+</style>
+
+<div class="container" style="height: 154px">
+ <div>end</div>
+</div>
+```
+
+### Justification
+
+Justifying aligns contents along the **main axis**. Justify the layout
+by specifying one of the following.
+
+
+Class | Mixin | Result
+:-|:-|:-
+`start-justified`| <code>--layout-start-justified</code> | Aligns contents at the start of the main axis.
+`center-justified` | <code>--layout-center-justified</code> | Centers contents along the main axis.
+`end-justified` | <code>--layout-end-justified</code> | Aligns contents to the end of the main axis.
+`justified` | <code>--layout-justified</code> | Aligns contents with equal spaces between children.
+`around-justified` | <code>--layout-around-justified</code> | Aligns contents with equal spaces arround children.
+
+The classes listed here are included in the `iron-flex-alignment` module of the `iron-flex-layout-classes` file.
+
+**Example: classes, start justified**
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout-classes.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ }
+
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<div class="horizontal start-justified layout">
+ <div>start-justified</div>
+</div>
+```
+
+**Example: mixins, center justified**
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ }
+
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<style is="custom-style">
+ .container {
+ @apply --layout-horizontal;
+ @apply --layout-center-justified;
+ }
+</style>
+
+<div class="container">
+ <div>center-justified</div>
+</div>
+```
+
+**Example: classes, end justified**
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout-classes.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ }
+
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<div class="horizontal end-justified layout">
+ <div>end-justified</div>
+</div>
+```
+
+**Example: mixins, equal space between elements**
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ }
+
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<style is="custom-style">
+ .container {
+ @apply --layout-horizontal;
+ @apply --layout-justified;
+ }
+</style>
+
+<div class="container">
+ <div>justified</div>
+ <div>justified</div>
+ <div>justified</div>
+</div>
+```
+
+**Example: classes, equal space around each element**
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout-classes.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ }
+
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<div class="horizontal around-justified layout">
+ <div>around-justified</div>
+ <div>around-justified</div>
+</div>
+```
+
+## Self alignment
+
+Alignment can also be set per-child (instead of using the layout container's rules).
+
+Class | Mixin | Result
+:-|:-|:-
+`self-start`| <code>--layout-self-start</code> | Aligns the child at the start of the cross-axis.
+`self-center` | <code>--layout-self-center</code> | Centers the child along the cross-axis.
+`self-end` | <code>--layout-self-end</code> | Aligns the child at the end of the cross-axis.
+`self-stretch` | <code>--layout-self-stretch</code> | Stretches the child to fit the cross-axis.
+
+**Example: classes**
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout-classes.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ }
+
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<div class="horizontal layout" style="height: 120px;">
+ <div class="flex self-start">Alpha</div>
+ <div class="flex self-center">Beta</div>
+ <div class="flex self-end">Gamma</div>
+ <div class="flex self-stretch">Delta</div>
+</div>
+```
+
+**Example: mixins**
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ }
+
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<style is="custom-style">
+ .container {
+ @apply --layout-horizontal;
+ @apply --layout-justified;
+ height: 120px;
+ }
+ .container div {
+ @apply --layout-flex;
+ }
+ .child1 {
+ @apply --layout-self-start;
+ }
+ .child2 {
+ @apply --layout-self-center;
+ }
+ .child3 {
+ @apply --layout-self-end;
+ }
+ .child4 {
+ @apply --layout-self-stretch;
+ }
+</style>
+<div class="container">
+ <div class="child1">Alpha</div>
+ <div class="child2">Beta</div>
+ <div class="child3">Gamma</div>
+ <div class="child4">Delta</div>
+</div>
+```
+
+> <b>Note:</b> The <code>flex</code> class
+(and <code>--layout-flex</code> mixin) shown in these examples is
+added for the demo and not required for self-alignment.
+
+
+## Wrapping
+
+Wrapped layouts can be enabled with the `wrap` class or `--layout-wrap` mixin.
+
+**Example: classes**
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout-classes.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ }
+
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<div class="horizontal layout wrap" style="width: 220px">
+ <div>Alpha</div>
+ <div>Beta</div>
+ <div>Gamma</div>
+ <div>Delta</div>
+</div>
+```
+
+## Reversed layouts
+
+Layout direction can be mirrored using the following rules:
+
+Class | Mixin | Result
+:-|:-|:-
+<code>layout horizontal-reverse</code>| <code>--layout-horizontal-reverse</code> | Horizontal layout with children laid out in reverse order (last-to-first).
+<code>layout vertical-reverse</code> | <code>--layout-vertical-reverse</code> | Vertical layout with children laid out in reverse order.
+<code>layout wrap-reverse</code> | <code>--layout-wrap-reverse</code> | Wrap layout with wrapped rows placed in the reverse order (for example, in a vertical layout, the second row is placed above the first row, instead of below).
+
+The classes listed here are included in the `iron-flex-reverse` module of the `iron-flex-layout-classes` file.
+
+**Example: mixins**
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment iron-flex-reverse"></style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ }
+
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<style is="custom-style">
+ .container {
+ @apply --layout-horizontal-reverse;
+ }
+</style>
+
+<div class="container">
+ <div>Alpha</div>
+ <div>Beta</div>
+ <div>Gamma</div>
+ <div>Delta</div>
+</div>
+```
+
+## Full bleed &lt;body>
+
+It's common to want the entire `<body>` to fit to the viewport. By themselves, Polymer's layout features on
+`<body>` don't achieve the result. You can make `<body>` take up the entire viewport by adding the `fullbleed` class:
+
+```html
+<body class="fullbleed vertical layout">
+ <div class="flex">Fitting a fullbleed body.</div>
+</body>
+```
+
+This removes its margins and maximizes its height to the viewport. There is no equivalent mixin, but the same result can
+be achieved in CSS very simply:
+```css
+body {
+ margin: 0;
+ height: 100vh;
+}
+```
+
+This class is included in the `iron-positioning` module of the `iron-flex-layout-classes` file.
+
+Note that the `fullbleed` class **only works on the `<body>` tag.** This is the only rule in the
+stylesheet that is scoped to a particular tag.
+
+
+## General purpose rules
+
+Polymer also includes other general purpose rules for basic positioning:
+
+Class | Mixin | Result
+:-|:-|:-
+`block`| `--layout-block` | Assigns `display: block`
+`invisible` | `--layout-invisible` | Assigns `visibility: hidden`
+`relative` | `--layout-relative` | Assigns `position: relative`
+`fit` | `--layout-fit` | Sets `position: absolute` and sets `top:0;right:0;bottom:0;left:0;` (aka "trbl fitting").
+
+The classes listed here are included in the `iron-positioning` module of the `iron-flex-layout-classes` file.
+
+> <b>Note:</b>When using `fit` layout, the element must have an ancestor with fixed size and `position: relative` layout
+to fit inside of.
+
+
+**Example: classes**
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout-classes.html">
+ <dom-module id="demo-element">
+ <template>
+ <style is="custom-style" include="iron-flex iron-flex-alignment iron-positioning"></style>
+ <style>
+ :host {
+ display: block;
+ background: #ccc;
+ }
+
+ .demo {
+ background-color: white;
+ margin: 12px;
+ padding: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<div class="demo">Before <span>[A Span]</span> After</div>
+<div class="demo">Before <span class="block">[A Block Span]</span> After</div>
+<div class="demo">Before invisible span <span class="invisible">Not displayed</span> After invisible span</div>
+<div class="relative" style="height: 100px;">
+ <div class="fit" style="background-color: #000;color: white">Fit</div>
+</div>
+```
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/README.md
new file mode 100644
index 00000000000..ca54ed33350
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/README.md
@@ -0,0 +1,61 @@
+[![Build status](https://travis-ci.org/PolymerElements/iron-flex-layout.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-flex-layout)
+[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://beta.webcomponents.org/element/PolymerElements/iron-flex-layout)
+
+## &lt;iron-flex-layout&gt;
+
+The `<iron-flex-layout>` component provides simple ways to use
+[CSS flexible box layout](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Flexible_boxes),
+also known as flexbox. This component provides two different ways to use flexbox:
+
+1. [Layout classes](https://github.com/PolymerElements/iron-flex-layout/tree/master/iron-flex-layout-classes.html).
+The layout class stylesheet provides a simple set of class-based flexbox rules, that
+let you specify layout properties directly in markup. You must include this file
+in every element that needs to use them.
+
+Sample use:
+
+<!--
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
+ <link rel="import" href="iron-flex-layout-classes.html">
+ <dom-module id="demo-element">
+ <template>
+ <custom-style>
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ </custom-style>
+ <style>
+ .container, .layout {
+ background-color: #ccc;
+ padding: 4px;
+ }
+ .container div, .layout div {
+ background-color: white;
+ padding: 12px;
+ margin: 4px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+ <script>Polymer({is: "demo-element"});</script>
+ </dom-module>
+ <demo-element></demo-element>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<div class="layout horizontal layout-start" style="height: 154px">
+ <div>cross axis start alignment</div>
+</div>
+```
+
+1. [Custom CSS mixins](https://github.com/PolymerElements/iron-flex-layout/blob/master/iron-flex-layout.html).
+The mixin stylesheet includes custom CSS mixins that can be applied inside a CSS rule using the `@apply` function.
+
+A complete [guide](https://elements.polymer-project.org/guides/flex-layout) to `<iron-flex-layout>` is available.
+
+## Changes in 2.0
+- removed the deprecated `/deep/` classes -- files removed: `classes/iron-flex-layout.html`, `classes/iron-shadow-flex-layout`
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/bower.json
new file mode 100644
index 00000000000..28c3bd3de1f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/bower.json
@@ -0,0 +1,54 @@
+{
+ "name": "iron-flex-layout",
+ "version": "2.0.3",
+ "description": "Provide flexbox-based layouts",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "layout"
+ ],
+ "main": "iron-flex-layout.html",
+ "private": true,
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-flex-layout.git"
+ },
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2"
+ },
+ "ignore": [],
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "Polymer/web-component-tester#^4.0.0",
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "pages": {
+ "Flexbox layout guide": "GUIDE.md"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/demo/index.html
new file mode 100644
index 00000000000..887ff3f9ec1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/demo/index.html
@@ -0,0 +1,429 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<html>
+<head>
+
+ <title>iron-flex-layout demo</title>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../iron-flex-layout.html">
+
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles">
+ demo-snippet {
+ --demo-snippet-demo: {
+ padding: 0;
+ };
+ }
+
+ .container {
+ background-color: #ccc;
+ padding: 5px;
+ margin: 0;
+ }
+
+ .container > div {
+ padding: 15px;
+ margin: 5px;
+ background-color: white;
+ min-height: 20px;
+ }
+ </style>
+ </custom-style>
+
+</head>
+<body unresolved class="fullbleed">
+ <div class="vertical-section-container centered">
+ <h4>Horizontal and vertical layout</h4>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ .flex {
+ @apply --layout-horizontal;
+ }
+ </style>
+ </custom-style>
+ <div class="container flex">
+ <div>one</div>
+ <div>two</div>
+ <div>three</div>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h4>Flexible children</h4>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ .flex-horizontal {
+ @apply --layout-horizontal;
+ }
+ .flexchild {
+ @apply --layout-flex;
+ }
+ </style>
+ </custom-style>
+
+ <div class="container flex-horizontal">
+ <div>one</div>
+ <div class="flexchild">two (flex)</div>
+ <div>three</div>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h4>Flexible children in vertical layouts</h4>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ .flex-vertical {
+ @apply --layout-vertical;
+ height: 220px;
+ }
+ .flexchild-vertical {
+ @apply --layout-flex;
+ }
+ </style>
+ </custom-style>
+
+ <div class="container flex-vertical">
+ <div>one</div>
+ <div class="flexchild-vertical">two (flex)</div>
+ <div>three</div>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h4>Flex ratios</h4>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ .flex-horizontal-with-ratios {
+ @apply --layout-horizontal;
+ }
+ .flexchild {
+ @apply --layout-flex;
+ }
+ .flex2child {
+ @apply --layout-flex-2;
+ }
+ .flex3child {
+ @apply --layout-flex-3;
+ }
+ </style>
+ </custom-style>
+
+ <div class="container flex-horizontal-with-ratios">
+ <div class="flex3child">one</div>
+ <div class="flexchild">two</div>
+ <div class="flex2child">three</div>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h4>Cross-axis stretch alignment (default)</h4>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ .flex-stretch-align {
+ @apply --layout-horizontal;
+ height: 120px;
+ }
+ </style>
+ </custom-style>
+
+ <div class="container flex-stretch-align">
+ <div>stretch</div>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h4>Cross-axis center alignment</h4>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ .flex-center-align {
+ @apply --layout-horizontal;
+ @apply --layout-center;
+ height: 120px;
+ }
+ </style>
+ </custom-style>
+
+ <div class="container flex-center-align">
+ <div>center</div>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h4>Cross-axis start alignment</h4>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ .flex-start-align {
+ @apply --layout-horizontal;
+ @apply --layout-start;
+ height: 120px;
+ }
+ </style>
+ </custom-style>
+
+ <div class="container flex-start-align">
+ <div>start</div>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h4>Cross-axis end alignment</h4>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ .flex-end-align {
+ @apply --layout-horizontal;
+ @apply --layout-end;
+ height: 120px;
+ }
+ </style>
+ </custom-style>
+
+ <div class="container flex-end-align">
+ <div>end</div>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h4>Justification, start justified</h4>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ .flex-start-justified {
+ @apply --layout-horizontal;
+ @apply --layout-start-justified;
+ }
+ </style>
+ </custom-style>
+
+ <div class="container flex-start-justified">
+ <div>start-justified</div>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h4>Justification, center justified</h4>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ .flex-center-justified {
+ @apply --layout-horizontal;
+ @apply --layout-center-justified;
+ }
+ </style>
+ </custom-style>
+
+ <div class="container flex-center-justified">
+ <div>center-justified</div>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h4>Justification, end justified</h4>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ .flex-end-justified {
+ @apply --layout-horizontal;
+ @apply --layout-end-justified;
+ }
+ </style>
+ </custom-style>
+
+ <div class="container flex-end-justified">
+ <div>end-justified</div>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h4>Justification, equal space between elements</h4>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ .flex-equal-justified {
+ @apply --layout-horizontal;
+ @apply --layout-justified;
+ }
+ </style>
+ </custom-style>
+
+ <div class="container flex-equal-justified">
+ <div>justified</div>
+ <div>justified</div>
+ <div>justified</div>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h4>Justification, equal space around each element</h4>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ .flex-equal-around-justified {
+ @apply --layout-horizontal;
+ @apply --layout-around-justified;
+ }
+ </style>
+ </custom-style>
+
+ <div class="container flex-equal-around-justified">
+ <div>around-justified</div>
+ <div>around-justified</div>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h4>Self alignment</h4>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ .flex-self-align {
+ @apply --layout-horizontal;
+ @apply --layout-justified;
+ height: 120px;
+ }
+ .flex-self-align div {
+ @apply --layout-flex;
+ }
+ .child1 {
+ @apply --layout-self-start;
+ }
+ .child2 {
+ @apply --layout-self-center;
+ }
+ .child3 {
+ @apply --layout-self-end;
+ }
+ .child4 {
+ @apply --layout-self-stretch;
+ }
+ </style>
+ </custom-style>
+
+ <div class="container flex-self-align">
+ <div class="child1">one</div>
+ <div class="child2">two</div>
+ <div class="child3">three</div>
+ <div class="child4">four</div>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h4>Wrapping</h4>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ .flex-wrap {
+ @apply --layout-horizontal;
+ @apply --layout-wrap;
+ width: 200px;
+ }
+ </style>
+ </custom-style>
+
+ <div class="container flex-wrap">
+ <div>one</div>
+ <div>two</div>
+ <div>three</div>
+ <div>four</div>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h4>Reversed layouts</h4>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ .flex-reversed {
+ @apply --layout-horizontal-reverse;
+ }
+ </style>
+ </custom-style>
+
+ <div class="container flex-reversed">
+ <div>one</div>
+ <div>two</div>
+ <div>three</div>
+ <div>four</div>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h4>General purpose rules</h4>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ .general {
+ width: 100%;
+ }
+ .general > div {
+ background-color: #ccc;
+ padding: 4px;
+ margin: 12px;
+ }
+ .block {
+ @apply --layout-block;
+ }
+ .invisible {
+ @apply --layout-invisible;
+ }
+ .relative {
+ @apply --layout-relative;
+ }
+ .fit {
+ @apply --layout-fit;
+ }
+ </style>
+ </custom-style>
+
+ <div class="general">
+ <div>Before <span>[A Span]</span> After</div>
+ <div>Before <span class="block">[A Block Span]</span> After</div>
+ <div>Before invisible span <span class="invisible">Not displayed</span> After invisible span</div>
+ <div class="relative" style="height: 100px;">
+ <div class="fit" style="background-color: #000;color: white">Fit</div>
+ </div>
+ </div>
+ </template>
+ </demo-snippet>
+ </div>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/gen-tsd.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/gen-tsd.json
new file mode 100644
index 00000000000..cc757dbf801
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/gen-tsd.json
@@ -0,0 +1,5 @@
+{
+ "excludeIdentifiers": [
+ "iron-flex-layout"
+ ]
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/index.html
new file mode 100644
index 00000000000..7d3b0881f8c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/index.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <title>iron-flex-layout</title>
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/iron-flex-layout-classes.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/iron-flex-layout-classes.d.ts
new file mode 100644
index 00000000000..139911b8f40
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/iron-flex-layout-classes.d.ts
@@ -0,0 +1,12 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-flex-layout-classes.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/iron-flex-layout-classes.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/iron-flex-layout-classes.html
new file mode 100644
index 00000000000..a4e84c1f9e8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/iron-flex-layout-classes.html
@@ -0,0 +1,436 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<!--
+A set of layout classes that let you specify layout properties directly in markup.
+You must include this file in every element that needs to use them.
+
+Sample use:
+
+ <link rel="import" href="../iron-flex-layout/iron-flex-layout-classes.html">
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+
+ <div class="layout horizontal layout-start">
+ <div>cross axis start alignment</div>
+ </div>
+
+The following imports are available:
+ - iron-flex
+ - iron-flex-reverse
+ - iron-flex-alignment
+ - iron-flex-factors
+ - iron-positioning
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<!-- Most common used flex styles-->
+<dom-module id="iron-flex">
+ <template>
+ <style>
+ .layout.horizontal,
+ .layout.vertical {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ }
+
+ .layout.inline {
+ display: -ms-inline-flexbox;
+ display: -webkit-inline-flex;
+ display: inline-flex;
+ }
+
+ .layout.horizontal {
+ -ms-flex-direction: row;
+ -webkit-flex-direction: row;
+ flex-direction: row;
+ }
+
+ .layout.vertical {
+ -ms-flex-direction: column;
+ -webkit-flex-direction: column;
+ flex-direction: column;
+ }
+
+ .layout.wrap {
+ -ms-flex-wrap: wrap;
+ -webkit-flex-wrap: wrap;
+ flex-wrap: wrap;
+ }
+
+ .layout.no-wrap {
+ -ms-flex-wrap: nowrap;
+ -webkit-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ }
+
+ .layout.center,
+ .layout.center-center {
+ -ms-flex-align: center;
+ -webkit-align-items: center;
+ align-items: center;
+ }
+
+ .layout.center-justified,
+ .layout.center-center {
+ -ms-flex-pack: center;
+ -webkit-justify-content: center;
+ justify-content: center;
+ }
+
+ .flex {
+ -ms-flex: 1 1 0.000000001px;
+ -webkit-flex: 1;
+ flex: 1;
+ -webkit-flex-basis: 0.000000001px;
+ flex-basis: 0.000000001px;
+ }
+
+ .flex-auto {
+ -ms-flex: 1 1 auto;
+ -webkit-flex: 1 1 auto;
+ flex: 1 1 auto;
+ }
+
+ .flex-none {
+ -ms-flex: none;
+ -webkit-flex: none;
+ flex: none;
+ }
+ </style>
+ </template>
+</dom-module>
+
+<!-- Basic flexbox reverse styles -->
+<dom-module id="iron-flex-reverse">
+ <template>
+ <style>
+ .layout.horizontal-reverse,
+ .layout.vertical-reverse {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ }
+
+ .layout.horizontal-reverse {
+ -ms-flex-direction: row-reverse;
+ -webkit-flex-direction: row-reverse;
+ flex-direction: row-reverse;
+ }
+
+ .layout.vertical-reverse {
+ -ms-flex-direction: column-reverse;
+ -webkit-flex-direction: column-reverse;
+ flex-direction: column-reverse;
+ }
+
+ .layout.wrap-reverse {
+ -ms-flex-wrap: wrap-reverse;
+ -webkit-flex-wrap: wrap-reverse;
+ flex-wrap: wrap-reverse;
+ }
+ </style>
+ </template>
+</dom-module>
+
+<!-- Flexbox alignment -->
+<dom-module id="iron-flex-alignment">
+ <template>
+ <style>
+ /**
+ * Alignment in cross axis.
+ */
+ .layout.start {
+ -ms-flex-align: start;
+ -webkit-align-items: flex-start;
+ align-items: flex-start;
+ }
+
+ .layout.center,
+ .layout.center-center {
+ -ms-flex-align: center;
+ -webkit-align-items: center;
+ align-items: center;
+ }
+
+ .layout.end {
+ -ms-flex-align: end;
+ -webkit-align-items: flex-end;
+ align-items: flex-end;
+ }
+
+ .layout.baseline {
+ -ms-flex-align: baseline;
+ -webkit-align-items: baseline;
+ align-items: baseline;
+ }
+
+ /**
+ * Alignment in main axis.
+ */
+ .layout.start-justified {
+ -ms-flex-pack: start;
+ -webkit-justify-content: flex-start;
+ justify-content: flex-start;
+ }
+
+ .layout.center-justified,
+ .layout.center-center {
+ -ms-flex-pack: center;
+ -webkit-justify-content: center;
+ justify-content: center;
+ }
+
+ .layout.end-justified {
+ -ms-flex-pack: end;
+ -webkit-justify-content: flex-end;
+ justify-content: flex-end;
+ }
+
+ .layout.around-justified {
+ -ms-flex-pack: distribute;
+ -webkit-justify-content: space-around;
+ justify-content: space-around;
+ }
+
+ .layout.justified {
+ -ms-flex-pack: justify;
+ -webkit-justify-content: space-between;
+ justify-content: space-between;
+ }
+
+ /**
+ * Self alignment.
+ */
+ .self-start {
+ -ms-align-self: flex-start;
+ -webkit-align-self: flex-start;
+ align-self: flex-start;
+ }
+
+ .self-center {
+ -ms-align-self: center;
+ -webkit-align-self: center;
+ align-self: center;
+ }
+
+ .self-end {
+ -ms-align-self: flex-end;
+ -webkit-align-self: flex-end;
+ align-self: flex-end;
+ }
+
+ .self-stretch {
+ -ms-align-self: stretch;
+ -webkit-align-self: stretch;
+ align-self: stretch;
+ }
+
+ .self-baseline {
+ -ms-align-self: baseline;
+ -webkit-align-self: baseline;
+ align-self: baseline;
+ }
+
+ /**
+ * multi-line alignment in main axis.
+ */
+ .layout.start-aligned {
+ -ms-flex-line-pack: start; /* IE10 */
+ -ms-align-content: flex-start;
+ -webkit-align-content: flex-start;
+ align-content: flex-start;
+ }
+
+ .layout.end-aligned {
+ -ms-flex-line-pack: end; /* IE10 */
+ -ms-align-content: flex-end;
+ -webkit-align-content: flex-end;
+ align-content: flex-end;
+ }
+
+ .layout.center-aligned {
+ -ms-flex-line-pack: center; /* IE10 */
+ -ms-align-content: center;
+ -webkit-align-content: center;
+ align-content: center;
+ }
+
+ .layout.between-aligned {
+ -ms-flex-line-pack: justify; /* IE10 */
+ -ms-align-content: space-between;
+ -webkit-align-content: space-between;
+ align-content: space-between;
+ }
+
+ .layout.around-aligned {
+ -ms-flex-line-pack: distribute; /* IE10 */
+ -ms-align-content: space-around;
+ -webkit-align-content: space-around;
+ align-content: space-around;
+ }
+ </style>
+ </template>
+</dom-module>
+
+<dom-module id="iron-flex-factors">
+ <template>
+ <style>
+ .flex,
+ .flex-1 {
+ -ms-flex: 1 1 0.000000001px;
+ -webkit-flex: 1;
+ flex: 1;
+ -webkit-flex-basis: 0.000000001px;
+ flex-basis: 0.000000001px;
+ }
+
+ .flex-2 {
+ -ms-flex: 2;
+ -webkit-flex: 2;
+ flex: 2;
+ }
+
+ .flex-3 {
+ -ms-flex: 3;
+ -webkit-flex: 3;
+ flex: 3;
+ }
+
+ .flex-4 {
+ -ms-flex: 4;
+ -webkit-flex: 4;
+ flex: 4;
+ }
+
+ .flex-5 {
+ -ms-flex: 5;
+ -webkit-flex: 5;
+ flex: 5;
+ }
+
+ .flex-6 {
+ -ms-flex: 6;
+ -webkit-flex: 6;
+ flex: 6;
+ }
+
+ .flex-7 {
+ -ms-flex: 7;
+ -webkit-flex: 7;
+ flex: 7;
+ }
+
+ .flex-8 {
+ -ms-flex: 8;
+ -webkit-flex: 8;
+ flex: 8;
+ }
+
+ .flex-9 {
+ -ms-flex: 9;
+ -webkit-flex: 9;
+ flex: 9;
+ }
+
+ .flex-10 {
+ -ms-flex: 10;
+ -webkit-flex: 10;
+ flex: 10;
+ }
+
+ .flex-11 {
+ -ms-flex: 11;
+ -webkit-flex: 11;
+ flex: 11;
+ }
+
+ .flex-12 {
+ -ms-flex: 12;
+ -webkit-flex: 12;
+ flex: 12;
+ }
+ </style>
+ </template>
+</dom-module>
+
+<!-- Non-flexbox positioning helper styles -->
+<dom-module id="iron-positioning">
+ <template>
+ <style>
+ .block {
+ display: block;
+ }
+
+ [hidden] {
+ display: none !important;
+ }
+
+ .invisible {
+ visibility: hidden !important;
+ }
+
+ .relative {
+ position: relative;
+ }
+
+ .fit {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ }
+
+ body.fullbleed {
+ margin: 0;
+ height: 100vh;
+ }
+
+ .scroll {
+ -webkit-overflow-scrolling: touch;
+ overflow: auto;
+ }
+
+ /* fixed position */
+ .fixed-bottom,
+ .fixed-left,
+ .fixed-right,
+ .fixed-top {
+ position: fixed;
+ }
+
+ .fixed-top {
+ top: 0;
+ left: 0;
+ right: 0;
+ }
+
+ .fixed-right {
+ top: 0;
+ right: 0;
+ bottom: 0;
+ }
+
+ .fixed-bottom {
+ right: 0;
+ bottom: 0;
+ left: 0;
+ }
+
+ .fixed-left {
+ top: 0;
+ bottom: 0;
+ left: 0;
+ }
+ </style>
+ </template>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/iron-flex-layout.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/iron-flex-layout.d.ts
new file mode 100644
index 00000000000..c7301adc888
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/iron-flex-layout.d.ts
@@ -0,0 +1,12 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-flex-layout.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/iron-flex-layout.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/iron-flex-layout.html
new file mode 100644
index 00000000000..99bc55350e0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/iron-flex-layout.html
@@ -0,0 +1,424 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<!--
+The `<iron-flex-layout>` component provides simple ways to use
+[CSS flexible box layout](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Flexible_boxes),
+also known as flexbox. This component provides two different ways to use flexbox:
+
+1. [Layout classes](https://github.com/PolymerElements/iron-flex-layout/tree/master/iron-flex-layout-classes.html).
+The layout class stylesheet provides a simple set of class-based flexbox rules, that
+let you specify layout properties directly in markup. You must include this file
+in every element that needs to use them.
+
+ Sample use:
+
+ ```
+ <custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <next-code-block></next-code-block>
+ </template>
+ </custom-element-demo>
+ ```
+
+ ```html
+ <link rel="import" href="iron-flex-layout-classes.html">
+ <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
+ <style>
+ .test { width: 100px; }
+ </style>
+ <div class="layout horizontal center-center">
+ <div class="test">horizontal layout center alignment</div>
+ </div>
+ ```
+
+2. [Custom CSS mixins](https://github.com/PolymerElements/iron-flex-layout/blob/master/iron-flex-layout.html).
+The mixin stylesheet includes custom CSS mixins that can be applied inside a CSS rule using the `@apply` function.
+
+Please note that the old [/deep/ layout classes](https://github.com/PolymerElements/iron-flex-layout/tree/master/classes)
+are deprecated, and should not be used. To continue using layout properties
+directly in markup, please switch to using the new `dom-module`-based
+[layout classes](https://github.com/PolymerElements/iron-flex-layout/tree/master/iron-flex-layout-classes.html).
+Please note that the new version does not use `/deep/`, and therefore requires you
+to import the `dom-modules` in every element that needs to use them.
+
+A complete [guide](https://elements.polymer-project.org/guides/flex-layout) to `<iron-flex-layout>` is available.
+
+@group Iron Elements
+@pseudoElement iron-flex-layout
+@demo demo/index.html
+-->
+<script>
+ // This is left only for backward compatibility with projects
+ // that incorrectly relied on unscoped global [hidden] rules;
+ // removing would be a breaking change, but new projects
+ // should never rely on this.
+ (function() {
+ var style = document.createElement('style');
+ style.textContent = '[hidden] { display: none !important; }';
+ document.head.appendChild(style);
+ })();
+</script>
+<custom-style>
+ <style is="custom-style">
+ [hidden] {
+ display: none !important;
+ }
+ </style>
+</custom-style>
+
+<custom-style>
+ <style is="custom-style">
+ html {
+
+ --layout: {
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ };
+
+ --layout-inline: {
+ display: -ms-inline-flexbox;
+ display: -webkit-inline-flex;
+ display: inline-flex;
+ };
+
+ --layout-horizontal: {
+ @apply --layout;
+
+ -ms-flex-direction: row;
+ -webkit-flex-direction: row;
+ flex-direction: row;
+ };
+
+ --layout-horizontal-reverse: {
+ @apply --layout;
+
+ -ms-flex-direction: row-reverse;
+ -webkit-flex-direction: row-reverse;
+ flex-direction: row-reverse;
+ };
+
+ --layout-vertical: {
+ @apply --layout;
+
+ -ms-flex-direction: column;
+ -webkit-flex-direction: column;
+ flex-direction: column;
+ };
+
+ --layout-vertical-reverse: {
+ @apply --layout;
+
+ -ms-flex-direction: column-reverse;
+ -webkit-flex-direction: column-reverse;
+ flex-direction: column-reverse;
+ };
+
+ --layout-wrap: {
+ -ms-flex-wrap: wrap;
+ -webkit-flex-wrap: wrap;
+ flex-wrap: wrap;
+ };
+
+ --layout-wrap-reverse: {
+ -ms-flex-wrap: wrap-reverse;
+ -webkit-flex-wrap: wrap-reverse;
+ flex-wrap: wrap-reverse;
+ };
+
+ --layout-flex-auto: {
+ -ms-flex: 1 1 auto;
+ -webkit-flex: 1 1 auto;
+ flex: 1 1 auto;
+ };
+
+ --layout-flex-none: {
+ -ms-flex: none;
+ -webkit-flex: none;
+ flex: none;
+ };
+
+ --layout-flex: {
+ -ms-flex: 1 1 0.000000001px;
+ -webkit-flex: 1;
+ flex: 1;
+ -webkit-flex-basis: 0.000000001px;
+ flex-basis: 0.000000001px;
+ };
+
+ --layout-flex-2: {
+ -ms-flex: 2;
+ -webkit-flex: 2;
+ flex: 2;
+ };
+
+ --layout-flex-3: {
+ -ms-flex: 3;
+ -webkit-flex: 3;
+ flex: 3;
+ };
+
+ --layout-flex-4: {
+ -ms-flex: 4;
+ -webkit-flex: 4;
+ flex: 4;
+ };
+
+ --layout-flex-5: {
+ -ms-flex: 5;
+ -webkit-flex: 5;
+ flex: 5;
+ };
+
+ --layout-flex-6: {
+ -ms-flex: 6;
+ -webkit-flex: 6;
+ flex: 6;
+ };
+
+ --layout-flex-7: {
+ -ms-flex: 7;
+ -webkit-flex: 7;
+ flex: 7;
+ };
+
+ --layout-flex-8: {
+ -ms-flex: 8;
+ -webkit-flex: 8;
+ flex: 8;
+ };
+
+ --layout-flex-9: {
+ -ms-flex: 9;
+ -webkit-flex: 9;
+ flex: 9;
+ };
+
+ --layout-flex-10: {
+ -ms-flex: 10;
+ -webkit-flex: 10;
+ flex: 10;
+ };
+
+ --layout-flex-11: {
+ -ms-flex: 11;
+ -webkit-flex: 11;
+ flex: 11;
+ };
+
+ --layout-flex-12: {
+ -ms-flex: 12;
+ -webkit-flex: 12;
+ flex: 12;
+ };
+
+ /* alignment in cross axis */
+
+ --layout-start: {
+ -ms-flex-align: start;
+ -webkit-align-items: flex-start;
+ align-items: flex-start;
+ };
+
+ --layout-center: {
+ -ms-flex-align: center;
+ -webkit-align-items: center;
+ align-items: center;
+ };
+
+ --layout-end: {
+ -ms-flex-align: end;
+ -webkit-align-items: flex-end;
+ align-items: flex-end;
+ };
+
+ --layout-baseline: {
+ -ms-flex-align: baseline;
+ -webkit-align-items: baseline;
+ align-items: baseline;
+ };
+
+ /* alignment in main axis */
+
+ --layout-start-justified: {
+ -ms-flex-pack: start;
+ -webkit-justify-content: flex-start;
+ justify-content: flex-start;
+ };
+
+ --layout-center-justified: {
+ -ms-flex-pack: center;
+ -webkit-justify-content: center;
+ justify-content: center;
+ };
+
+ --layout-end-justified: {
+ -ms-flex-pack: end;
+ -webkit-justify-content: flex-end;
+ justify-content: flex-end;
+ };
+
+ --layout-around-justified: {
+ -ms-flex-pack: distribute;
+ -webkit-justify-content: space-around;
+ justify-content: space-around;
+ };
+
+ --layout-justified: {
+ -ms-flex-pack: justify;
+ -webkit-justify-content: space-between;
+ justify-content: space-between;
+ };
+
+ --layout-center-center: {
+ @apply --layout-center;
+ @apply --layout-center-justified;
+ };
+
+ /* self alignment */
+
+ --layout-self-start: {
+ -ms-align-self: flex-start;
+ -webkit-align-self: flex-start;
+ align-self: flex-start;
+ };
+
+ --layout-self-center: {
+ -ms-align-self: center;
+ -webkit-align-self: center;
+ align-self: center;
+ };
+
+ --layout-self-end: {
+ -ms-align-self: flex-end;
+ -webkit-align-self: flex-end;
+ align-self: flex-end;
+ };
+
+ --layout-self-stretch: {
+ -ms-align-self: stretch;
+ -webkit-align-self: stretch;
+ align-self: stretch;
+ };
+
+ --layout-self-baseline: {
+ -ms-align-self: baseline;
+ -webkit-align-self: baseline;
+ align-self: baseline;
+ };
+
+ /* multi-line alignment in main axis */
+
+ --layout-start-aligned: {
+ -ms-flex-line-pack: start; /* IE10 */
+ -ms-align-content: flex-start;
+ -webkit-align-content: flex-start;
+ align-content: flex-start;
+ };
+
+ --layout-end-aligned: {
+ -ms-flex-line-pack: end; /* IE10 */
+ -ms-align-content: flex-end;
+ -webkit-align-content: flex-end;
+ align-content: flex-end;
+ };
+
+ --layout-center-aligned: {
+ -ms-flex-line-pack: center; /* IE10 */
+ -ms-align-content: center;
+ -webkit-align-content: center;
+ align-content: center;
+ };
+
+ --layout-between-aligned: {
+ -ms-flex-line-pack: justify; /* IE10 */
+ -ms-align-content: space-between;
+ -webkit-align-content: space-between;
+ align-content: space-between;
+ };
+
+ --layout-around-aligned: {
+ -ms-flex-line-pack: distribute; /* IE10 */
+ -ms-align-content: space-around;
+ -webkit-align-content: space-around;
+ align-content: space-around;
+ };
+
+ /*******************************
+ Other Layout
+ *******************************/
+
+ --layout-block: {
+ display: block;
+ };
+
+ --layout-invisible: {
+ visibility: hidden !important;
+ };
+
+ --layout-relative: {
+ position: relative;
+ };
+
+ --layout-fit: {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ };
+
+ --layout-scroll: {
+ -webkit-overflow-scrolling: touch;
+ overflow: auto;
+ };
+
+ --layout-fullbleed: {
+ margin: 0;
+ height: 100vh;
+ };
+
+ /* fixed position */
+
+ --layout-fixed-top: {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ };
+
+ --layout-fixed-right: {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ };
+
+ --layout-fixed-bottom: {
+ position: fixed;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ };
+
+ --layout-fixed-left: {
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ };
+
+ }
+ </style>
+</custom-style>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/package-lock.json
new file mode 100644
index 00000000000..56139b2b721
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/package-lock.json
@@ -0,0 +1,986 @@
+{
+ "name": "@polymer/iron-flex-layout",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.1.1.tgz",
+ "integrity": "sha512-rUfH6USpiPYSHl2dC+/rGb3RYK8LPyqNhiuZCLv13F0fhYr01jdTogGuSphEoSLklm1gKRsDsrfZq7OvpzPYEg==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.0",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.1",
+ "command-line-usage": "4.1.0",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.0",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.10"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.97",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.97.tgz",
+ "integrity": "sha512-k3CDdCq8Uv8AZ7/bmGSSvlwbPDPhkkckSq8Y9ndXowv86m3k07PjG98SigpjVAY9EyHV9kiFldEV306xh4gkig==",
+ "dev": true
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.10",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.10.tgz",
+ "integrity": "sha1-9vCd15PdL0IomsAdoCb8q6ZfGYw=",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.97",
+ "@types/parse5": "2.2.34",
+ "babel-generator": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "2.3.0",
+ "indent": "0.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "2.2.3",
+ "polymer-project-config": "3.8.1",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.1"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ }
+ }
+ }
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz",
+ "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.0"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.0"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.0.tgz",
+ "integrity": "sha512-zkYho6/4wZyX6o9UQ8rd0ReEaiEYNNCqYFIAACe2Tf9DrYlgzWW27OigYHnnztnnZQwVRpwWmZKegFmDpinIsA==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.0"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.7.tgz",
+ "integrity": "sha512-jNhbkxPtt9xbzvihfA0OavjJbpCIyTDSmwE03BVXgCKcz9lwNsq4cg2wsNkY4Av5eH35ttBArhYtVJa6CIrg2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.0"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.0.0.tgz",
+ "integrity": "sha512-v+0wW9Wezwsyb0uF4aBVCjmSqit3Ru7PZFziGF0o2KwTvN2zWfTi3BRLq9EkJFdg3eBbyERXGTntVpBxH1J68Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz",
+ "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.4",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.2",
+ "lodash": "4.17.4"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.4",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
+ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.1.tgz",
+ "integrity": "sha512-gRJDcIjFSzMcmG/GrJlgL0wWoAxr11mVzCq32bjka0endupm9meLwvoJUKc4HDeFiEIB2X3GvNrhF5cKO4Bd4A==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
+ "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "4.0.0",
+ "array-back": "2.0.0",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz",
+ "integrity": "sha1-+CBJdb0NrLvltYqKk//B/tD/zSo=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "6.0.96",
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "2.2.3"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.96",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.96.tgz",
+ "integrity": "sha512-fsOOY6tMQ3jCB2wD51XFDmmpgm4wVKkJECdcVRqapbJEa7awJDcr+SaH8toz+4r4KW8YQ3M7ybXMoSDo1QGewA==",
+ "dev": true
+ }
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz",
+ "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.5.7"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.4",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
+ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.8"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz",
+ "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.7",
+ "winston": "2.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.8.1.tgz",
+ "integrity": "sha512-MLvnM9gexFWg7nynY24eHZG6NLXocmk718sVds/sx2CAJ6iihhC0JMhhOIa6jnad9KQrHyGl/cs3mMRaaub5Fg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.96",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.96",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.96.tgz",
+ "integrity": "sha512-fsOOY6tMQ3jCB2wD51XFDmmpgm4wVKkJECdcVRqapbJEa7awJDcr+SaH8toz+4r4KW8YQ3M7ybXMoSDo1QGewA==",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.1.tgz",
+ "integrity": "sha1-Eahr7+rDxKo+wIYjZRo8gabQu8g=",
+ "dev": true
+ },
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/package.json
new file mode 100644
index 00000000000..5656aeb459d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-flex-layout/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@polymer/iron-flex-layout",
+ "private": true,
+ "description": "Provide flexbox-based layouts",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-flex-layout.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.1.1",
+ "bower": "^1.8.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir ."
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/.bower.json
new file mode 100644
index 00000000000..9587c307c99
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/.bower.json
@@ -0,0 +1,59 @@
+{
+ "name": "iron-form-element-behavior",
+ "version": "2.1.2",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "private": true,
+ "main": "iron-form-element-behavior.html",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "description": "Enables a custom element to be included in an iron-form",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "form"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-form-element-behavior.git"
+ },
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "homepage": "https://github.com/PolymerElements/iron-form-element-behavior",
+ "_release": "2.1.2",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.2",
+ "commit": "601b8337c2728c8421c2a018c016d9ca97e0f385"
+ },
+ "_source": "https://github.com/PolymerElements/iron-form-element-behavior.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/iron-form-element-behavior"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/.github/CODEOWNERS
new file mode 100644
index 00000000000..c5097c0c903
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @valdrinkoshi
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..36493f30b8b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-form-element-behavior/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/.travis.yml
new file mode 100644
index 00000000000..334e24468fd
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/.travis.yml
@@ -0,0 +1,29 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+env:
+ global:
+ - secure: >-
+ IJ2DKBWd4T446kn7yV/2tStL8tTZcmfguzymvE+U9p9JBJl6Qu+KwfzETjJPyiEhzwS8gqcrV8takloMto2dMLCyCc9RBzJt/AHlLC5vcZ0aJ06ArYkn98/lz4q9noDDpd1dqXbzC8ea4En/b+DCgf8iei7pFmoNjFo8+RGoSMN7GvmUIBEbZ0akQnZcvMNgbWrRQQ31Qkug492ybrmizBMlBoMSRVkMjKkuKQyOr/7CTEvmj62XuapM9VoE21qr6E0T1iXrBbT9ay5HPlitkfBXe+oV3tj3ONBp81+HhEiIkZua3xnGcs0YkT9qd/fipy/1hfPAj5bBco/IyYEjVYUuIrhdJEfzFlHBwNqlWtl5yuW9srHP5V4k7NiUWBESoQ2V4AH7ZDuxcsdhBT1N/2D0dksBP4UkfyBIYQaUOYSI0a4O6BpgTQRPh7yHZ88fG6B2/k59dlX1PuPFuiI7dECPMmaLVsUGH3PMkezHsD4BNdp89HzJVk0jTM8W5oP1/Lj8EEp1X48zHg7IZo+o0rOPtvjqrYtdhw9+BVujRKkLhXBDIh+bjQeX4WpeDPtAxAaOH7bAWxWa+w1h0DbOkHzB6cV3H8jzg/oJKwZyIgmrR9aVjeaW2IP3sYxbkGq2ZM/x9+mcRo+JV3TONStYRc6lEKpmOGQgUZbVMyU0S2E=
+ - secure: >-
+ KZmse/kaUHZKkjYYWssUihkjaWmhXFfJio6/TcyxlvzlRN+b+s8xkMx09F2mfCEzCuxbhMeYaOLYUP+x44mO/N5OKvRYqGKLBJASQ+LvsVe6ep972AfWtb2P2E6OK/b9vAdW0v52j1gTaj94KtUfjaWjxP78TTEG5slMMwadqBm5e7nW4vS+wV26sbNymnWB9NErLebJr0T+wwrXDyjXWkUTH8yPzlwFjPcfXZavQwFyM9E+k+HQVUOQ8b3oMxVnwc2aHRWLWRDu97k1S/hVk+c1j+qamOa16faJLTsG9lay7RRkeq/OQBvjdWtmsq95NkP27/uLlQrKKOY7nZZ331LlqYK/o1+i+nVjZqWAgMXun7OjTtZvU53dOFXPVroXNoIcAPhdVNxLNvlJLvTL1uoVybzjeDdiMrTpZc6FpSLRKOj9AGmnT4vy+A2MSxn3rwujvz2PlRvoXYxnN36QbONbF7Zr1Sv6i+53eN+/1xC78i7otJEsvJhKe6YAq9/7xyOBGhELhOYMIES2gy/Nbc+47pEWWgYQ/tvBO1RXuaRgKG2iwiWL83Phhgw3SAdYaAL5xk6lUTTsuCJZHmcDoD8bTDblBIjntWvtzT6Z1NPTiuUXszJXkLSwUjfNUeQtb4H9GnNWF0P4ze91RZippygyWfrDz7aQhf+NcbF/PE0=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/README.md
new file mode 100644
index 00000000000..14e1ebf78a3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/README.md
@@ -0,0 +1,14 @@
+[![Build status](https://travis-ci.org/PolymerElements/iron-form-element-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-form-element-behavior)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/iron-form-element-behavior)_
+
+
+## Polymer.IronFormElementBehavior
+
+Polymer.IronFormElementBehavior enables a custom element to be included
+in an `iron-form`.
+
+### Changes in 2.0
+
+If your form element is used with Polymer 2.0, it doesn't need to implement `Polymer.IronFormElementBehavior` as `iron-form#2.0.0` won't rely on it.
+The events `iron-form-element-register` and `iron-form-element-unregister` are not fired on Polymer 2.0.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/bower.json
new file mode 100644
index 00000000000..0870b00b0ae
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/bower.json
@@ -0,0 +1,49 @@
+{
+ "name": "iron-form-element-behavior",
+ "version": "2.1.2",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "private": true,
+ "main": "iron-form-element-behavior.html",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "description": "Enables a custom element to be included in an iron-form",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "form"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-form-element-behavior.git"
+ },
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/demo/index.html
new file mode 100644
index 00000000000..7688e8269d4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/demo/index.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+ <head>
+
+ <title>iron-form-element-behavior demo</title>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../paper-styles/demo-pages.html">
+ <link rel="import" href="simple-form.html">
+ <link rel="import" href="simple-element.html">
+ </head>
+ <style>
+ input {
+ margin-bottom: 24px;
+ width: 200px;
+ }
+ </style>
+ <body>
+
+ <div class="vertical-section-container centered">
+ <div class="vertical-section">
+ <form is="simple-form" id="form">
+ Element with iron-form-element-behavior <input is="simple-element" type="text" name="one" value="one">
+ <br>
+ Element without iron-form-element-behavior <input type="text" name="two" value="two">
+ <br>
+ Element with iron-form-element-behavior <input is="simple-element" type="text" name="three" value="three">
+ </form>
+
+ <h4>Elements tracked by the form: <button onclick="update()">Update</button> </h4>
+
+ <ul id="output">
+ </ul>
+ </div>
+ </div>
+
+ <script>
+ function update() {
+ if (Polymer.Element) {
+ console.warn('IronFormElementBehavior is deprecated in Polymer 2.0');
+ return;
+ }
+ var output = document.getElementById('output');
+ var elements = document.getElementById('form').formElements;
+ document.getElementById('output').innerHTML = '';
+ for (var i = 0; i < elements.length; i++) {
+ var li = document.createElement('li');
+ var text = document.createTextNode(elements[i].value);
+ li.appendChild(text);
+ output.appendChild(li);
+ }
+ }
+ </script>
+ </body>
+
+
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/demo/simple-element.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/demo/simple-element.html
new file mode 100644
index 00000000000..450276923b3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/demo/simple-element.html
@@ -0,0 +1,27 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../iron-form-element-behavior.html">
+
+<script>
+
+ Polymer({
+
+ is: 'simple-element',
+
+ extends: 'input',
+
+ behaviors: [
+ Polymer.IronFormElementBehavior
+ ]
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/demo/simple-form.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/demo/simple-form.html
new file mode 100644
index 00000000000..4dc5dc6bb8f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/demo/simple-form.html
@@ -0,0 +1,53 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../polymer/polymer.html">
+
+<script>
+
+ Polymer({
+
+ is: 'simple-form',
+
+ extends: 'form',
+
+ properties: {
+ formElements: {
+ type: Object,
+ notify: true
+ }
+ },
+
+ listeners: {
+ 'iron-form-element-register': '_elementRegistered',
+ 'iron-form-element-unregister': '_elementUnregistered'
+ },
+
+ ready: function() {
+ this.formElements = [];
+ },
+
+ _elementRegistered: function(e) {
+ this.formElements.push(e.target);
+ e.target._parentForm = this;
+ },
+
+ _elementUnregistered: function(e) {
+ var target = e.detail.target;
+ if (target) {
+ var index = this.formElements.indexOf(target);
+ if (index > -1) {
+ this.formElements.splice(index, 1);
+ }
+ }
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/index.html
new file mode 100644
index 00000000000..8d748c0509b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/index.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+
+ <title>iron-form-element-behavior</title>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../polymer/polymer.html">
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/iron-form-element-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/iron-form-element-behavior.d.ts
new file mode 100644
index 00000000000..da153011278
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/iron-form-element-behavior.d.ts
@@ -0,0 +1,54 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-form-element-behavior.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Polymer.IronFormElementBehavior enables a custom element to be included
+ * in an `iron-form`.
+ *
+ * Events `iron-form-element-register` and `iron-form-element-unregister` are not fired on Polymer 2.0.
+ *
+ *
+ */
+ interface IronFormElementBehavior {
+
+ /**
+ * The name of this element.
+ */
+ name: string|null|undefined;
+
+ /**
+ * The value for this element.
+ */
+ value: string|number|null|undefined;
+
+ /**
+ * Set to true to mark the input as required. If used in a form, a
+ * custom element that uses this behavior should also use
+ * Polymer.IronValidatableBehavior and define a custom validation method.
+ * Otherwise, a `required` element will always be considered valid.
+ * It's also strongly recommended to provide a visual style for the element
+ * when its value is invalid.
+ */
+ required: boolean|null|undefined;
+
+ /**
+ * The form that the element is registered to.
+ */
+ _parentForm: object|null|undefined;
+ attached(): void;
+ detached(): void;
+ }
+
+ const IronFormElementBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/iron-form-element-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/iron-form-element-behavior.html
new file mode 100644
index 00000000000..e36371c2305
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/iron-form-element-behavior.html
@@ -0,0 +1,91 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<script>
+ /**
+ Polymer.IronFormElementBehavior enables a custom element to be included
+ in an `iron-form`.
+
+ Events `iron-form-element-register` and `iron-form-element-unregister` are not fired on Polymer 2.0.
+
+ @demo demo/index.html
+ @polymerBehavior
+ */
+ Polymer.IronFormElementBehavior = {
+
+ properties: {
+ /**
+ * Fired when the element is added to an `iron-form`.
+ *
+ * @event iron-form-element-register
+ */
+
+ /**
+ * Fired when the element is removed from an `iron-form`.
+ *
+ * @event iron-form-element-unregister
+ */
+
+ /**
+ * The name of this element.
+ */
+ name: {
+ type: String
+ },
+
+ /**
+ * The value for this element.
+ * @type {string|number|null|undefined}
+ */
+ value: {
+ notify: true,
+ type: String
+ },
+
+ /**
+ * Set to true to mark the input as required. If used in a form, a
+ * custom element that uses this behavior should also use
+ * Polymer.IronValidatableBehavior and define a custom validation method.
+ * Otherwise, a `required` element will always be considered valid.
+ * It's also strongly recommended to provide a visual style for the element
+ * when its value is invalid.
+ */
+ required: {
+ type: Boolean,
+ value: false
+ },
+
+ /**
+ * The form that the element is registered to.
+ */
+ _parentForm: {
+ type: Object
+ }
+ },
+
+ attached() {
+ if (!Polymer.Element) {
+ // Note: the iron-form that this element belongs to will set this
+ // element's _parentForm property when handling this event.
+ this.fire('iron-form-element-register');
+ }
+ },
+
+ detached() {
+ if (!Polymer.Element && this._parentForm) {
+ this._parentForm.fire('iron-form-element-unregister', {target: this});
+ }
+ }
+
+ };
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/package-lock.json
new file mode 100644
index 00000000000..fc39988423e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/package-lock.json
@@ -0,0 +1,983 @@
+{
+ "name": "@polymer/iron-form-element-behavior",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.0.tgz",
+ "integrity": "sha512-a5DFXI3TdZSVOMH4608LVaBLmcr+mwM2+B8OSBiB9WFNCtdqzUXwtB5We6vBzrThXlO4uRo7d2pEqjNXMAlEkA==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "4.1.0",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.12"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.7"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.7"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.7",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.7.tgz",
+ "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.7"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.8.tgz",
+ "integrity": "sha512-QqR0j08RCS1AQYPMRPHikEpcmK+2aEEbcSzWLwOqyJ4FhLmHUx/WjRrnn7tTQg/y4IKnMhzskh/o7qvGIZZ7iA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.7"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.0.0.tgz",
+ "integrity": "sha512-v+0wW9Wezwsyb0uF4aBVCjmSqit3Ru7PZFziGF0o2KwTvN2zWfTi3BRLq9EkJFdg3eBbyERXGTntVpBxH1J68Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.3",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
+ "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "4.0.0",
+ "array-back": "2.0.0",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.3.tgz",
+ "integrity": "sha512-7Z5PPegwDTyjbaeCnV0efcyS6vdKAU51kpEmS7QFib3P4822l8ICYyMn7qvJnc+WzLoDsuI9gPMKbJ8pCu8XtA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.8",
+ "winston": "2.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-QQL70IC85hI6q9uQeresEMcT1Qf8YR/zDe1qG8WWeeFAZk8z0lmzUpsfcAWz+bM4wpDdXrtd4HitIs4p0CHl/w==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.102",
+ "@types/parse5": "2.2.34",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "polymer-project-config": "3.9.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.102",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.102.tgz",
+ "integrity": "sha512-EhNufyBoC1Kqaj+XMHGzi6mPUC8wVABOMTPE5XaSJc49LIVvXsyrV1HYMAPTUViT7E4wLUB38OdDmb+HshjGmA==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.9.0.tgz",
+ "integrity": "sha512-WPOqlV2W/M4Ni40QIqYSv8PE7H4rjiPm1KEf02QPtjZOGlAC4Rv7e6UJ1Ke1O70WT5bydcsEn3LViFIqYpVOJw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.102",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.102",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.102.tgz",
+ "integrity": "sha512-EhNufyBoC1Kqaj+XMHGzi6mPUC8wVABOMTPE5XaSJc49LIVvXsyrV1HYMAPTUViT7E4wLUB38OdDmb+HshjGmA==",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/package.json
new file mode 100644
index 00000000000..9fab6832f62
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-form-element-behavior/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@polymer/iron-form-element-behavior",
+ "private": true,
+ "description": "Enables a custom element to be included in an iron-form",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-form-element-behavior.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir ."
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/.bower.json
new file mode 100644
index 00000000000..b8132922e1a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/.bower.json
@@ -0,0 +1,69 @@
+{
+ "name": "iron-icon",
+ "private": true,
+ "version": "2.1.0",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "An element that supports displaying an icon",
+ "main": "iron-icon.html",
+ "author": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "icon"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-icon.git"
+ },
+ "ignore": [],
+ "dependencies": {
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-meta": "PolymerElements/iron-meta#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "promise-polyfill": "polymerlabs/promise-polyfill#1 - 2",
+ "iron-iconset": "PolymerElements/iron-iconset#1 - 2",
+ "iron-icons": "PolymerElements/iron-icons#1 - 2",
+ "iron-component-page": "polymerelements/iron-component-page#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0",
+ "iron-meta": "polymerelements/iron-meta#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "promise-polyfill": "polymerlabs/promise-polyfill#^1.0.0",
+ "iron-iconset": "polymerelements/iron-iconset#^1.0.0",
+ "iron-icons": "polymerelements/iron-icons#^1.0.0",
+ "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.2.5"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "homepage": "https://github.com/PolymerElements/iron-icon",
+ "_release": "2.1.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.0",
+ "commit": "c592bd3f0b442e3e4c1fc574f08545d0f9810d15"
+ },
+ "_source": "https://github.com/PolymerElements/iron-icon.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/iron-icon"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/.github/CODEOWNERS
new file mode 100644
index 00000000000..0d8c0ad6b48
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @bicknellr
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..61da83fb287
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-icon/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/.travis.yml
new file mode 100644
index 00000000000..d47c0333f9a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/.travis.yml
@@ -0,0 +1,29 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+env:
+ global:
+ - secure: >-
+ TTp7q3OKEpaFqnqbYczhMd8iXTa1Ya0jOQVq1OhljpJogLWb78qvHLHgnxgMWkw+/KDyE5KHW1CXhYUQa7C9QF2Zn7uoN27+7+4q7HuK3pTuUtqdfstLVuLHQrfK6VqUT4XjSpeMzNX/HxuD3EMBH0bMBR4CIr76sLJOuIL/XF8=
+ - secure: >-
+ damHvQXygRYIJG/8Vmqh7U4zxoi5224JIZiZVQL6I5z//s5zqHq6AqwDyfOoc0zWndJCwE8NvOzKD/lmVYXIsPcY95kkZS45Dbye0krYWUzKnv42rDi/7olXcg647iAEDVhW3BRHmA+opzQtKUpAkXl97DtPVkszLL1ReyNyv3A=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/README.md
new file mode 100644
index 00000000000..c2f956f4535
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/README.md
@@ -0,0 +1,22 @@
+[![Build status](https://travis-ci.org/PolymerElements/iron-icon.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-icon)
+
+## &lt;iron-icon&gt;
+
+The `iron-icon` element displays an icon. By default an icon renders as a 24px square.
+
+<!---
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-icons/iron-icons.html">
+ <link rel="import" href="iron-icon.html">
+ <next-code-block></next-code-block>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<iron-icon icon="menu"></iron-icon>
+<iron-icon src="demo/location.png"></iron-icon>
+```
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/bower.json
new file mode 100644
index 00000000000..98243f5e824
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/bower.json
@@ -0,0 +1,59 @@
+{
+ "name": "iron-icon",
+ "private": true,
+ "version": "2.0.1",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "An element that supports displaying an icon",
+ "main": "iron-icon.html",
+ "author": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "icon"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-icon.git"
+ },
+ "ignore": [],
+ "dependencies": {
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-meta": "PolymerElements/iron-meta#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "promise-polyfill": "polymerlabs/promise-polyfill#1 - 2",
+ "iron-iconset": "PolymerElements/iron-iconset#1 - 2",
+ "iron-icons": "PolymerElements/iron-icons#1 - 2",
+ "iron-component-page": "polymerelements/iron-component-page#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0",
+ "iron-meta": "polymerelements/iron-meta#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "promise-polyfill": "polymerlabs/promise-polyfill#^1.0.0",
+ "iron-iconset": "polymerelements/iron-iconset#^1.0.0",
+ "iron-icons": "polymerelements/iron-icons#^1.0.0",
+ "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.2.5"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/demo/async.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/demo/async.html
new file mode 100644
index 00000000000..0e7bffc0b8a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/demo/async.html
@@ -0,0 +1,64 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <title>iron-icon demo</title>
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-icon.html">
+ <link rel="import" href="../../paper-styles/demo-pages.html" >
+
+ <custom-style>
+ <style is="custom-style">
+ #loading_message {
+ color: #444;
+ margin-bottom: 16px;
+ }
+ .vertical-section h4 {
+ border-left: 3px solid var(--paper-grey-300);
+ padding-left: 10px;
+ }
+
+ .vertical-section h4:hover {
+ border-left-color: var(--google-blue-700);
+ }
+ </style>
+ </custom-style>
+</head>
+<body>
+ <div class="vertical-section-container centered">
+ <h4>
+ This demo is for an &lt;iron-icon&gt; with an asynchronously loaded
+ iconset.
+ </h4>
+
+ <div id='loading_message'>Waiting to load iconset...</div>
+
+ <div class="vertical-section">
+ <!-- iron-icon using a iron-iconset as its icon source -->
+ <iron-iconset name="example" icons="location" src="location.png" size="24" width="24"></iron-iconset>
+
+ <h4>&lt;iron-icon icon="example:location"&gt;</h4>
+ <iron-icon icon="example:location"></iron-icon>
+
+ </div>
+ </div>
+ <script>
+ setTimeout(function() {
+ // Import the code that powers the iron-iconset asynchronously
+ var linkElem = document.createElement('link');
+ linkElem.setAttribute('rel', 'import');
+ linkElem.setAttribute('href', '../../iron-iconset/iron-iconset.html');
+ document.head.appendChild(linkElem);
+ document.querySelector('#loading_message').innerText = "Iconset Loaded.";
+ }, 1000);
+ </script>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/demo/index.html
new file mode 100644
index 00000000000..36f292ecc1c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/demo/index.html
@@ -0,0 +1,50 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <title>iron-icon demo</title>
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-icon.html">
+ <link rel="import" href="../../iron-iconset/iron-iconset.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+</head>
+<body unresolved>
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles"></style>
+ </custom-style>
+
+ <div class="vertical-section-container centered">
+ <h3>
+ This demo is for a single &lt;iron-icon&gt;. If you're looking for the
+ whole set of available icons, check out the
+ <a href="https://www.webcomponents.org/element/PolymerElements/iron-icons/demo/demo/index.html" target="_top">&lt;iron-icons&gt;
+ demo.</a>
+ </h3>
+
+ <h3><code>iron-icon</code> using a iron-iconset as its icon source.</h3>
+ <demo-snippet>
+ <template>
+ <iron-iconset name="example" icons="location" src="location.png" size="24" width="24"></iron-iconset>
+
+ <iron-icon icon="example:location"></iron-icon>
+ </template>
+ </demo-snippet>
+
+ <h3><code>iron-icon</code> using an image url as its icon source.</h3>
+ <demo-snippet>
+ <template>
+ <iron-icon src="location.png"></iron-icon>
+ </template>
+ </demo-snippet>
+ </div>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/demo/location.png b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/demo/location.png
new file mode 100644
index 00000000000..9bb74236b85
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/demo/location.png
Binary files differ
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/hero.svg b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/hero.svg
new file mode 100755
index 00000000000..f0f58536e53
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/hero.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">
+<g id="background" display="none">
+ <rect display="inline" fill="#B0BEC5" width="225" height="126"/>
+</g>
+<g id="label">
+</g>
+<g id="art">
+ <circle cx="112" cy="61" r="8"/>
+ <path d="M129,78H95V44h34V78z M97,76h30V46H97V76z"/>
+ <g id="ic_x5F_add_x0D_">
+ </g>
+</g>
+<g id="Guides">
+</g>
+</svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/index.html
new file mode 100644
index 00000000000..487bb5c38a5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/index.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/iron-icon.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/iron-icon.d.ts
new file mode 100644
index 00000000000..f326c64a2a5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/iron-icon.d.ts
@@ -0,0 +1,107 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-icon.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-meta/iron-meta.d.ts" />
+/// <reference path="../iron-flex-layout/iron-flex-layout.d.ts" />
+
+/**
+ * The `iron-icon` element displays an icon. By default an icon renders as a 24px square.
+ *
+ * Example using src:
+ *
+ * <iron-icon src="star.png"></iron-icon>
+ *
+ * Example setting size to 32px x 32px:
+ *
+ * <iron-icon class="big" src="big_star.png"></iron-icon>
+ *
+ * <style is="custom-style">
+ * .big {
+ * --iron-icon-height: 32px;
+ * --iron-icon-width: 32px;
+ * }
+ * </style>
+ *
+ * The iron elements include several sets of icons.
+ * To use the default set of icons, import `iron-icons.html` and use the `icon` attribute to specify an icon:
+ *
+ * <link rel="import" href="/components/iron-icons/iron-icons.html">
+ *
+ * <iron-icon icon="menu"></iron-icon>
+ *
+ * To use a different built-in set of icons, import the specific `iron-icons/<iconset>-icons.html`, and
+ * specify the icon as `<iconset>:<icon>`. For example, to use a communication icon, you would
+ * use:
+ *
+ * <link rel="import" href="/components/iron-icons/communication-icons.html">
+ *
+ * <iron-icon icon="communication:email"></iron-icon>
+ *
+ * You can also create custom icon sets of bitmap or SVG icons.
+ *
+ * Example of using an icon named `cherry` from a custom iconset with the ID `fruit`:
+ *
+ * <iron-icon icon="fruit:cherry"></iron-icon>
+ *
+ * See [iron-iconset](iron-iconset) and [iron-iconset-svg](iron-iconset-svg) for more information about
+ * how to create a custom iconset.
+ *
+ * See the [iron-icons demo](iron-icons?view=demo:demo/index.html) to see the icons available
+ * in the various iconsets.
+ *
+ * To load a subset of icons from one of the default `iron-icons` sets, you can
+ * use the [poly-icon](https://poly-icon.appspot.com/) tool. It allows you
+ * to select individual icons, and creates an iconset from them that you can
+ * use directly in your elements.
+ *
+ * ### Styling
+ *
+ * The following custom properties are available for styling:
+ *
+ * Custom property | Description | Default
+ * ----------------|-------------|----------
+ * `--iron-icon` | Mixin applied to the icon | {}
+ * `--iron-icon-width` | Width of the icon | `24px`
+ * `--iron-icon-height` | Height of the icon | `24px`
+ * `--iron-icon-fill-color` | Fill color of the svg icon | `currentcolor`
+ * `--iron-icon-stroke-color` | Stroke color of the svg icon | none
+ */
+interface IronIconElement extends Polymer.Element {
+
+ /**
+ * The name of the icon to use. The name should be of the form:
+ * `iconset_name:icon_name`.
+ */
+ icon: string|null|undefined;
+
+ /**
+ * The name of the theme to used, if one is specified by the
+ * iconset.
+ */
+ theme: string|null|undefined;
+
+ /**
+ * If using iron-icon without an iconset, you can set the src to be
+ * the URL of an individual icon image file. Note that this will take
+ * precedence over a given icon attribute.
+ */
+ src: string|null|undefined;
+ _meta: Polymer.IronMeta;
+ _DEFAULT_ICONSET: string;
+ _iconChanged(icon: any): void;
+ _srcChanged(src: any): void;
+ _usesIconset(): any;
+ _updateIcon(): void;
+}
+
+interface HTMLElementTagNameMap {
+ "iron-icon": IronIconElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/iron-icon.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/iron-icon.html
new file mode 100644
index 00000000000..71378a776cb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/iron-icon.html
@@ -0,0 +1,214 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-meta/iron-meta.html">
+<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
+
+<!--
+
+The `iron-icon` element displays an icon. By default an icon renders as a 24px square.
+
+Example using src:
+
+ <iron-icon src="star.png"></iron-icon>
+
+Example setting size to 32px x 32px:
+
+ <iron-icon class="big" src="big_star.png"></iron-icon>
+
+ <style is="custom-style">
+ .big {
+ --iron-icon-height: 32px;
+ --iron-icon-width: 32px;
+ }
+ </style>
+
+The iron elements include several sets of icons.
+To use the default set of icons, import `iron-icons.html` and use the `icon` attribute to specify an icon:
+
+ <link rel="import" href="/components/iron-icons/iron-icons.html">
+
+ <iron-icon icon="menu"></iron-icon>
+
+To use a different built-in set of icons, import the specific `iron-icons/<iconset>-icons.html`, and
+specify the icon as `<iconset>:<icon>`. For example, to use a communication icon, you would
+use:
+
+ <link rel="import" href="/components/iron-icons/communication-icons.html">
+
+ <iron-icon icon="communication:email"></iron-icon>
+
+You can also create custom icon sets of bitmap or SVG icons.
+
+Example of using an icon named `cherry` from a custom iconset with the ID `fruit`:
+
+ <iron-icon icon="fruit:cherry"></iron-icon>
+
+See [iron-iconset](iron-iconset) and [iron-iconset-svg](iron-iconset-svg) for more information about
+how to create a custom iconset.
+
+See the [iron-icons demo](iron-icons?view=demo:demo/index.html) to see the icons available
+in the various iconsets.
+
+To load a subset of icons from one of the default `iron-icons` sets, you can
+use the [poly-icon](https://poly-icon.appspot.com/) tool. It allows you
+to select individual icons, and creates an iconset from them that you can
+use directly in your elements.
+
+### Styling
+
+The following custom properties are available for styling:
+
+Custom property | Description | Default
+----------------|-------------|----------
+`--iron-icon` | Mixin applied to the icon | {}
+`--iron-icon-width` | Width of the icon | `24px`
+`--iron-icon-height` | Height of the icon | `24px`
+`--iron-icon-fill-color` | Fill color of the svg icon | `currentcolor`
+`--iron-icon-stroke-color` | Stroke color of the svg icon | none
+
+@group Iron Elements
+@element iron-icon
+@demo demo/index.html
+@hero hero.svg
+@homepage polymer.github.io
+-->
+
+<dom-module id="iron-icon">
+ <template>
+ <style>
+ :host {
+ @apply --layout-inline;
+ @apply --layout-center-center;
+ position: relative;
+
+ vertical-align: middle;
+
+ fill: var(--iron-icon-fill-color, currentcolor);
+ stroke: var(--iron-icon-stroke-color, none);
+
+ width: var(--iron-icon-width, 24px);
+ height: var(--iron-icon-height, 24px);
+ @apply --iron-icon;
+ }
+
+ :host([hidden]) {
+ display: none;
+ }
+ </style>
+ </template>
+
+ <script>
+
+ Polymer({
+
+ is: 'iron-icon',
+
+ properties: {
+
+ /**
+ * The name of the icon to use. The name should be of the form:
+ * `iconset_name:icon_name`.
+ */
+ icon: {
+ type: String
+ },
+
+ /**
+ * The name of the theme to used, if one is specified by the
+ * iconset.
+ */
+ theme: {
+ type: String
+ },
+
+ /**
+ * If using iron-icon without an iconset, you can set the src to be
+ * the URL of an individual icon image file. Note that this will take
+ * precedence over a given icon attribute.
+ */
+ src: {
+ type: String
+ },
+
+ /**
+ * @type {!Polymer.IronMeta}
+ */
+ _meta: {
+ value: Polymer.Base.create('iron-meta', {type: 'iconset'})
+ }
+
+ },
+
+ observers: [
+ '_updateIcon(_meta, isAttached)',
+ '_updateIcon(theme, isAttached)',
+ '_srcChanged(src, isAttached)',
+ '_iconChanged(icon, isAttached)'
+ ],
+
+ _DEFAULT_ICONSET: 'icons',
+
+ _iconChanged: function(icon) {
+ var parts = (icon || '').split(':');
+ this._iconName = parts.pop();
+ this._iconsetName = parts.pop() || this._DEFAULT_ICONSET;
+ this._updateIcon();
+ },
+
+ _srcChanged: function(src) {
+ this._updateIcon();
+ },
+
+ _usesIconset: function() {
+ return this.icon || !this.src;
+ },
+
+ /** @suppress {visibility} */
+ _updateIcon: function() {
+ if (this._usesIconset()) {
+ if (this._img && this._img.parentNode) {
+ Polymer.dom(this.root).removeChild(this._img);
+ }
+ if (this._iconName === "") {
+ if (this._iconset) {
+ this._iconset.removeIcon(this);
+ }
+ } else if (this._iconsetName && this._meta) {
+ this._iconset = /** @type {?Polymer.Iconset} */ (
+ this._meta.byKey(this._iconsetName));
+ if (this._iconset) {
+ this._iconset.applyIcon(this, this._iconName, this.theme);
+ this.unlisten(window, 'iron-iconset-added', '_updateIcon');
+ } else {
+ this.listen(window, 'iron-iconset-added', '_updateIcon');
+ }
+ }
+ } else {
+ if (this._iconset) {
+ this._iconset.removeIcon(this);
+ }
+ if (!this._img) {
+ this._img = document.createElement('img');
+ this._img.style.width = '100%';
+ this._img.style.height = '100%';
+ this._img.draggable = false;
+ }
+ this._img.src = this.src;
+ Polymer.dom(this.root).appendChild(this._img);
+ }
+ }
+
+ });
+
+ </script>
+
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/package-lock.json
new file mode 100644
index 00000000000..8e8e4f36efe
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/package-lock.json
@@ -0,0 +1,974 @@
+{
+ "name": "@polymer/iron-icon",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.0.tgz",
+ "integrity": "sha512-a5DFXI3TdZSVOMH4608LVaBLmcr+mwM2+B8OSBiB9WFNCtdqzUXwtB5We6vBzrThXlO4uRo7d2pEqjNXMAlEkA==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.0",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "4.1.0",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.0",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.12"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz",
+ "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.6.tgz",
+ "integrity": "sha512-CTUtLb6WqCCgp6P59QintjHWqzf4VL1uPA27bipLAPxFqrtK1gEYllePzTICGqQ8rYsCbpnsNypXjjDzGAAjEQ==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.8.tgz",
+ "integrity": "sha512-QqR0j08RCS1AQYPMRPHikEpcmK+2aEEbcSzWLwOqyJ4FhLmHUx/WjRrnn7tTQg/y4IKnMhzskh/o7qvGIZZ7iA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.0.0.tgz",
+ "integrity": "sha512-v+0wW9Wezwsyb0uF4aBVCjmSqit3Ru7PZFziGF0o2KwTvN2zWfTi3BRLq9EkJFdg3eBbyERXGTntVpBxH1J68Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.2",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
+ "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "4.0.0",
+ "array-back": "2.0.0",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz",
+ "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.5.7"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.8",
+ "winston": "2.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-QQL70IC85hI6q9uQeresEMcT1Qf8YR/zDe1qG8WWeeFAZk8z0lmzUpsfcAWz+bM4wpDdXrtd4HitIs4p0CHl/w==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.101",
+ "@types/parse5": "2.2.34",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "polymer-project-config": "3.8.1",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.1"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.8.1.tgz",
+ "integrity": "sha512-MLvnM9gexFWg7nynY24eHZG6NLXocmk718sVds/sx2CAJ6iihhC0JMhhOIa6jnad9KQrHyGl/cs3mMRaaub5Fg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.101",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.1.tgz",
+ "integrity": "sha1-Eahr7+rDxKo+wIYjZRo8gabQu8g=",
+ "dev": true
+ },
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/package.json
new file mode 100644
index 00000000000..fa9ba54927d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icon/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@polymer/iron-icon",
+ "private": true,
+ "description": "An element that supports displaying an icon",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-icon.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir ."
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/.bower.json
new file mode 100644
index 00000000000..f63980774ef
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/.bower.json
@@ -0,0 +1,86 @@
+{
+ "name": "iron-icons",
+ "version": "2.1.1",
+ "description": "A set of icons for use with iron-icon",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "icon"
+ ],
+ "main": "iron-icons.html",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-icons"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-icons",
+ "dependencies": {
+ "iron-icon": "PolymerElements/iron-icon#1 - 2",
+ "iron-iconset-svg": "PolymerElements/iron-iconset-svg#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "iron-component-page": "polymerelements/iron-component-page#1 - 2",
+ "iron-meta": "PolymerElements/iron-meta#1 - 2",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
+ "web-component-tester": "^6.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-icon": "polymerelements/iron-icon#^1.0.0",
+ "iron-iconset-svg": "polymerelements/iron-iconset-svg#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "paper-styles": "polymerelements/paper-styles#^1.0.2",
+ "iron-component-page": "polymerelements/iron-component-page#1.0.0",
+ "iron-meta": "polymerelements/iron-meta#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ },
+ "polymer-1.x_iron-meta-2.x": {
+ "dependencies": {
+ "iron-icon": "polymerelements/iron-icon#^1.0.0",
+ "iron-iconset-svg": "polymerelements/iron-iconset-svg#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "paper-styles": "polymerelements/paper-styles#^1.0.2",
+ "iron-component-page": "polymerelements/iron-component-page#1.0.0",
+ "iron-meta": "polymerelements/iron-meta#^2.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7",
+ "iron-meta": "^2.0.0"
+ }
+ }
+ },
+ "ignore": [
+ "util",
+ "update-icons.sh"
+ ],
+ "_release": "2.1.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.1",
+ "commit": "bc3d1a82b24449732cf3cb3d663748a9f5636d2d"
+ },
+ "_source": "https://github.com/PolymerElements/iron-icons.git",
+ "_target": "^2.0.0",
+ "_originalSource": "iron-icons"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/.github/CODEOWNERS
new file mode 100644
index 00000000000..0d8c0ad6b48
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @bicknellr
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..95ef5d3703c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-icons/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/.travis.yml
new file mode 100644
index 00000000000..b9a33174574
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/.travis.yml
@@ -0,0 +1,29 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+env:
+ global:
+ - secure: >-
+ L3XJmmXJlYZYyvlKoZ25HpEC1FcTtWejNk2xRQKAH4cg8+oNMjE80OxkaIVHtZlatpLdIIYk79p+9OtGiskXZ1QsAjHtrxWE5YRSSz3nL/XyZqUu7tjiNtrih6PiEvocmwMCCdRGMSXwVl1YoUUYM0DWxHdykd0EMXYYkYe+yQo=
+ - secure: >-
+ PSLkHUoiTj6UxN+7KtZG2miLmeuDuGN4c+ksviIP4/4lh5x7xic7CIeMmf2HLd18MR8CwCHjfMrIrxYF/IusILn6fdQ8rdBw+XhEF7xP+8UqqgF6YjGHs/xPDYYiGtisEc2OOg+vzqXIMhmKTg2vVlhuNq16eggGsRDcsEhEong=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/README.md
new file mode 100644
index 00000000000..6377bcf66e3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/README.md
@@ -0,0 +1,33 @@
+[![Build status](https://travis-ci.org/PolymerElements/iron-icons.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-icons)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/iron-icons)_
+
+
+## &lt;iron-icons&gt;
+
+`iron-icons` is a utility import that includes the definition for the `iron-icon` element, `iron-iconset-svg` element, as well as an import for the default icon set.
+
+The `iron-icons` directory also includes imports for additional icon sets that can be loaded into your project.
+
+Example loading icon set:
+
+```html
+<link rel="import" href="../iron-icons/maps-icons.html">
+```
+
+To use an icon from one of these sets, first prefix your `iron-icon` with the icon set name, followed by a colon, ":", and then the icon id.
+
+Example using the directions-bus icon from the maps icon set:
+
+```html
+<iron-icon icon="maps:directions-bus"></iron-icon>
+```
+
+To load a subset of icons from one of the default `iron-icons` sets, you can
+use the [poly-icon](https://poly-icon.appspot.com/) tool. It allows you
+to select individual icons, and creates an iconset from them that you can
+use directly in your elements.
+
+See [iron-icon](https://github.com/PolymerElements/iron-icon) for more information about working with icons.
+
+See [iron-iconset](https://github.com/PolymerElements/iron-iconset) and [iron-iconset-svg](https://github.com/PolymerElements/iron-iconset-svg) for more information about how to create a custom iconset.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/av-icons.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/av-icons.d.ts
new file mode 100644
index 00000000000..5d185519e93
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/av-icons.d.ts
@@ -0,0 +1,13 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * av-icons.html
+ */
+
+/// <reference path="../iron-icon/iron-icon.d.ts" />
+/// <reference path="../iron-iconset-svg/iron-iconset-svg.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/av-icons.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/av-icons.html
new file mode 100644
index 00000000000..764d6229576
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/av-icons.html
@@ -0,0 +1,96 @@
+<!--
+@license
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../iron-icon/iron-icon.html">
+<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
+<iron-iconset-svg name="av" size="24">
+<svg><defs>
+<g id="add-to-queue"><path d="M21 3H3c-1.11 0-2 .89-2 2v12c0 1.1.89 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.11-.9-2-2-2zm0 14H3V5h18v12zm-5-7v2h-3v3h-2v-3H8v-2h3V7h2v3h3z"/></g>
+<g id="airplay"><path d="M6 22h12l-6-6zM21 3H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h4v-2H3V5h18v12h-4v2h4c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"/></g>
+<g id="album"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 14.5c-2.49 0-4.5-2.01-4.5-4.5S9.51 7.5 12 7.5s4.5 2.01 4.5 4.5-2.01 4.5-4.5 4.5zm0-5.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1z"/></g>
+<g id="art-track"><path d="M22 13h-8v-2h8v2zm0-6h-8v2h8V7zm-8 10h8v-2h-8v2zm-2-8v6c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V9c0-1.1.9-2 2-2h6c1.1 0 2 .9 2 2zm-1.5 6l-2.25-3-1.75 2.26-1.25-1.51L3.5 15h7z"/></g>
+<g id="av-timer"><path d="M11 17c0 .55.45 1 1 1s1-.45 1-1-.45-1-1-1-1 .45-1 1zm0-14v4h2V5.08c3.39.49 6 3.39 6 6.92 0 3.87-3.13 7-7 7s-7-3.13-7-7c0-1.68.59-3.22 1.58-4.42L12 13l1.41-1.41-6.8-6.8v.02C4.42 6.45 3 9.05 3 12c0 4.97 4.02 9 9 9 4.97 0 9-4.03 9-9s-4.03-9-9-9h-1zm7 9c0-.55-.45-1-1-1s-1 .45-1 1 .45 1 1 1 1-.45 1-1zM6 12c0 .55.45 1 1 1s1-.45 1-1-.45-1-1-1-1 .45-1 1z"/></g>
+<g id="branding-watermark"><path d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16h-9v-6h9v6z"/></g>
+<g id="call-to-action"><path d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3v-3h18v3z"/></g>
+<g id="closed-caption"><path d="M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 7H9.5v-.5h-2v3h2V13H11v1c0 .55-.45 1-1 1H7c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v1zm7 0h-1.5v-.5h-2v3h2V13H18v1c0 .55-.45 1-1 1h-3c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v1z"/></g>
+<g id="equalizer"><path d="M10 20h4V4h-4v16zm-6 0h4v-8H4v8zM16 9v11h4V9h-4z"/></g>
+<g id="explicit"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 6h-4v2h4v2h-4v2h4v2H9V7h6v2z"/></g>
+<g id="fast-forward"><path d="M4 18l8.5-6L4 6v12zm9-12v12l8.5-6L13 6z"/></g>
+<g id="fast-rewind"><path d="M11 18V6l-8.5 6 8.5 6zm.5-6l8.5 6V6l-8.5 6z"/></g>
+<g id="featured-play-list"><path d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-9 8H3V9h9v2zm0-4H3V5h9v2z"/></g>
+<g id="featured-video"><path d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-9 9H3V5h9v7z"/></g>
+<g id="fiber-dvr"><path d="M17.5 10.5h2v1h-2zm-13 0h2v3h-2zM21 3H3c-1.11 0-2 .89-2 2v14c0 1.1.89 2 2 2h18c1.11 0 2-.9 2-2V5c0-1.11-.89-2-2-2zM8 13.5c0 .85-.65 1.5-1.5 1.5H3V9h3.5c.85 0 1.5.65 1.5 1.5v3zm4.62 1.5h-1.5L9.37 9h1.5l1 3.43 1-3.43h1.5l-1.75 6zM21 11.5c0 .6-.4 1.15-.9 1.4L21 15h-1.5l-.85-2H17.5v2H16V9h3.5c.85 0 1.5.65 1.5 1.5v1z"/></g>
+<g id="fiber-manual-record"><circle cx="12" cy="12" r="8"/></g>
+<g id="fiber-new"><path d="M20 4H4c-1.11 0-1.99.89-1.99 2L2 18c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6c0-1.11-.89-2-2-2zM8.5 15H7.3l-2.55-3.5V15H3.5V9h1.25l2.5 3.5V9H8.5v6zm5-4.74H11v1.12h2.5v1.26H11v1.11h2.5V15h-4V9h4v1.26zm7 3.74c0 .55-.45 1-1 1h-4c-.55 0-1-.45-1-1V9h1.25v4.51h1.13V9.99h1.25v3.51h1.12V9h1.25v5z"/></g>
+<g id="fiber-pin"><path d="M5.5 10.5h2v1h-2zM20 4H4c-1.11 0-1.99.89-1.99 2L2 18c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6c0-1.11-.89-2-2-2zM9 11.5c0 .85-.65 1.5-1.5 1.5h-2v2H4V9h3.5c.85 0 1.5.65 1.5 1.5v1zm3.5 3.5H11V9h1.5v6zm7.5 0h-1.2l-2.55-3.5V15H15V9h1.25l2.5 3.5V9H20v6z"/></g>
+<g id="fiber-smart-record"><g><circle cx="9" cy="12" r="8"/><path d="M17 4.26v2.09c2.33.82 4 3.04 4 5.65s-1.67 4.83-4 5.65v2.09c3.45-.89 6-4.01 6-7.74s-2.55-6.85-6-7.74z"/></g></g>
+<g id="forward-10"><path d="M4 13c0 4.4 3.6 8 8 8s8-3.6 8-8h-2c0 3.3-2.7 6-6 6s-6-2.7-6-6 2.7-6 6-6v4l5-5-5-5v4c-4.4 0-8 3.6-8 8zm6.8 3H10v-3.3L9 13v-.7l1.8-.6h.1V16zm4.3-1.8c0 .3 0 .6-.1.8l-.3.6s-.3.3-.5.3-.4.1-.6.1-.4 0-.6-.1-.3-.2-.5-.3-.2-.3-.3-.6-.1-.5-.1-.8v-.7c0-.3 0-.6.1-.8l.3-.6s.3-.3.5-.3.4-.1.6-.1.4 0 .6.1.3.2.5.3.2.3.3.6.1.5.1.8v.7zm-.8-.8v-.5s-.1-.2-.1-.3-.1-.1-.2-.2-.2-.1-.3-.1-.2 0-.3.1l-.2.2s-.1.2-.1.3v2s.1.2.1.3.1.1.2.2.2.1.3.1.2 0 .3-.1l.2-.2s.1-.2.1-.3v-1.5z"/></g>
+<g id="forward-30"><path d="M9.6 13.5h.4c.2 0 .4-.1.5-.2s.2-.2.2-.4v-.2s-.1-.1-.1-.2-.1-.1-.2-.1h-.5s-.1.1-.2.1-.1.1-.1.2v.2h-1c0-.2 0-.3.1-.5s.2-.3.3-.4.3-.2.4-.2.4-.1.5-.1c.2 0 .4 0 .6.1s.3.1.5.2.2.2.3.4.1.3.1.5v.3s-.1.2-.1.3-.1.2-.2.2-.2.1-.3.2c.2.1.4.2.5.4s.2.4.2.6c0 .2 0 .4-.1.5s-.2.3-.3.4-.3.2-.5.2-.4.1-.6.1c-.2 0-.4 0-.5-.1s-.3-.1-.5-.2-.2-.2-.3-.4-.1-.4-.1-.6h.8v.2s.1.1.1.2.1.1.2.1h.5s.1-.1.2-.1.1-.1.1-.2v-.5s-.1-.1-.1-.2-.1-.1-.2-.1h-.6v-.7zm5.7.7c0 .3 0 .6-.1.8l-.3.6s-.3.3-.5.3-.4.1-.6.1-.4 0-.6-.1-.3-.2-.5-.3-.2-.3-.3-.6-.1-.5-.1-.8v-.7c0-.3 0-.6.1-.8l.3-.6s.3-.3.5-.3.4-.1.6-.1.4 0 .6.1.3.2.5.3.2.3.3.6.1.5.1.8v.7zm-.9-.8v-.5s-.1-.2-.1-.3-.1-.1-.2-.2-.2-.1-.3-.1-.2 0-.3.1l-.2.2s-.1.2-.1.3v2s.1.2.1.3.1.1.2.2.2.1.3.1.2 0 .3-.1l.2-.2s.1-.2.1-.3v-1.5zM4 13c0 4.4 3.6 8 8 8s8-3.6 8-8h-2c0 3.3-2.7 6-6 6s-6-2.7-6-6 2.7-6 6-6v4l5-5-5-5v4c-4.4 0-8 3.6-8 8z"/></g>
+<g id="forward-5"><path d="M4 13c0 4.4 3.6 8 8 8s8-3.6 8-8h-2c0 3.3-2.7 6-6 6s-6-2.7-6-6 2.7-6 6-6v4l5-5-5-5v4c-4.4 0-8 3.6-8 8zm6.7.9l.2-2.2h2.4v.7h-1.7l-.1.9s.1 0 .1-.1.1 0 .1-.1.1 0 .2 0h.2c.2 0 .4 0 .5.1s.3.2.4.3.2.3.3.5.1.4.1.6c0 .2 0 .4-.1.5s-.1.3-.3.5-.3.2-.5.3-.4.1-.6.1c-.2 0-.4 0-.5-.1s-.3-.1-.5-.2-.2-.2-.3-.4-.1-.3-.1-.5h.8c0 .2.1.3.2.4s.2.1.4.1c.1 0 .2 0 .3-.1l.2-.2s.1-.2.1-.3v-.6l-.1-.2-.2-.2s-.2-.1-.3-.1h-.2s-.1 0-.2.1-.1 0-.1.1-.1.1-.1.1h-.6z"/></g>
+<g id="games"><path d="M15 7.5V2H9v5.5l3 3 3-3zM7.5 9H2v6h5.5l3-3-3-3zM9 16.5V22h6v-5.5l-3-3-3 3zM16.5 9l-3 3 3 3H22V9h-5.5z"/></g>
+<g id="hd"><path d="M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-8 12H9.5v-2h-2v2H6V9h1.5v2.5h2V9H11v6zm2-6h4c.55 0 1 .45 1 1v4c0 .55-.45 1-1 1h-4V9zm1.5 4.5h2v-3h-2v3z"/></g>
+<g id="hearing"><path d="M17 20c-.29 0-.56-.06-.76-.15-.71-.37-1.21-.88-1.71-2.38-.51-1.56-1.47-2.29-2.39-3-.79-.61-1.61-1.24-2.32-2.53C9.29 10.98 9 9.93 9 9c0-2.8 2.2-5 5-5s5 2.2 5 5h2c0-3.93-3.07-7-7-7S7 5.07 7 9c0 1.26.38 2.65 1.07 3.9.91 1.65 1.98 2.48 2.85 3.15.81.62 1.39 1.07 1.71 2.05.6 1.82 1.37 2.84 2.73 3.55.51.23 1.07.35 1.64.35 2.21 0 4-1.79 4-4h-2c0 1.1-.9 2-2 2zM7.64 2.64L6.22 1.22C4.23 3.21 3 5.96 3 9s1.23 5.79 3.22 7.78l1.41-1.41C6.01 13.74 5 11.49 5 9s1.01-4.74 2.64-6.36zM11.5 9c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5-1.12-2.5-2.5-2.5-2.5 1.12-2.5 2.5z"/></g>
+<g id="high-quality"><path d="M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 11H9.5v-2h-2v2H6V9h1.5v2.5h2V9H11v6zm7-1c0 .55-.45 1-1 1h-.75v1.5h-1.5V15H14c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v4zm-3.5-.5h2v-3h-2v3z"/></g>
+<g id="library-add"><path d="M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 9h-4v4h-2v-4H9V9h4V5h2v4h4v2z"/></g>
+<g id="library-books"><path d="M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 9H9V9h10v2zm-4 4H9v-2h6v2zm4-8H9V5h10v2z"/></g>
+<g id="library-music"><path d="M20 2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-2 5h-3v5.5c0 1.38-1.12 2.5-2.5 2.5S10 13.88 10 12.5s1.12-2.5 2.5-2.5c.57 0 1.08.19 1.5.51V5h4v2zM4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6z"/></g>
+<g id="loop"><path d="M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z"/></g>
+<g id="mic"><path d="M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z"/></g>
+<g id="mic-none"><path d="M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm-1.2-9.1c0-.66.54-1.2 1.2-1.2.66 0 1.2.54 1.2 1.2l-.01 6.2c0 .66-.53 1.2-1.19 1.2-.66 0-1.2-.54-1.2-1.2V4.9zm6.5 6.1c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z"/></g>
+<g id="mic-off"><path d="M19 11h-1.7c0 .74-.16 1.43-.43 2.05l1.23 1.23c.56-.98.9-2.09.9-3.28zm-4.02.17c0-.06.02-.11.02-.17V5c0-1.66-1.34-3-3-3S9 3.34 9 5v.18l5.98 5.99zM4.27 3L3 4.27l6.01 6.01V11c0 1.66 1.33 3 2.99 3 .22 0 .44-.03.65-.08l1.66 1.66c-.71.33-1.5.52-2.31.52-2.76 0-5.3-2.1-5.3-5.1H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c.91-.13 1.77-.45 2.54-.9L19.73 21 21 19.73 4.27 3z"/></g>
+<g id="movie"><path d="M18 4l2 4h-3l-2-4h-2l2 4h-3l-2-4H8l2 4H7L5 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4h-4z"/></g>
+<g id="music-video"><path d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3V5h18v14zM8 15c0-1.66 1.34-3 3-3 .35 0 .69.07 1 .18V6h5v2h-3v7.03c-.02 1.64-1.35 2.97-3 2.97-1.66 0-3-1.34-3-3z"/></g>
+<g id="new-releases"><path d="M23 12l-2.44-2.78.34-3.68-3.61-.82-1.89-3.18L12 3 8.6 1.54 6.71 4.72l-3.61.81.34 3.68L1 12l2.44 2.78-.34 3.69 3.61.82 1.89 3.18L12 21l3.4 1.46 1.89-3.18 3.61-.82-.34-3.68L23 12zm-10 5h-2v-2h2v2zm0-4h-2V7h2v6z"/></g>
+<g id="not-interested"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8 0-1.85.63-3.55 1.69-4.9L16.9 18.31C15.55 19.37 13.85 20 12 20zm6.31-3.1L7.1 5.69C8.45 4.63 10.15 4 12 4c4.42 0 8 3.58 8 8 0 1.85-.63 3.55-1.69 4.9z"/></g>
+<g id="note"><path d="M22 10l-6-6H4c-1.1 0-2 .9-2 2v12.01c0 1.1.9 1.99 2 1.99l16-.01c1.1 0 2-.89 2-1.99v-8zm-7-4.5l5.5 5.5H15V5.5z"/></g>
+<g id="pause"><path d="M6 19h4V5H6v14zm8-14v14h4V5h-4z"/></g>
+<g id="pause-circle-filled"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 14H9V8h2v8zm4 0h-2V8h2v8z"/></g>
+<g id="pause-circle-outline"><path d="M9 16h2V8H9v8zm3-14C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm1-4h2V8h-2v8z"/></g>
+<g id="play-arrow"><path d="M8 5v14l11-7z"/></g>
+<g id="play-circle-filled"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 14.5v-9l6 4.5-6 4.5z"/></g>
+<g id="play-circle-outline"><path d="M10 16.5l6-4.5-6-4.5v9zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></g>
+<g id="playlist-add"><path d="M14 10H2v2h12v-2zm0-4H2v2h12V6zm4 8v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zM2 16h8v-2H2v2z"/></g>
+<g id="playlist-add-check"><path d="M14 10H2v2h12v-2zm0-4H2v2h12V6zM2 16h8v-2H2v2zm19.5-4.5L23 13l-6.99 7-4.51-4.5L13 14l3.01 3 5.49-5.5z"/></g>
+<g id="playlist-play"><path d="M19 9H2v2h17V9zm0-4H2v2h17V5zM2 15h13v-2H2v2zm15-2v6l5-3-5-3z"/></g>
+<g id="queue"><path d="M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 9h-4v4h-2v-4H9V9h4V5h2v4h4v2z"/></g>
+<g id="queue-music"><path d="M15 6H3v2h12V6zm0 4H3v2h12v-2zM3 16h8v-2H3v2zM17 6v8.18c-.31-.11-.65-.18-1-.18-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3V8h3V6h-5z"/></g>
+<g id="queue-play-next"><path d="M21 3H3c-1.11 0-2 .89-2 2v12c0 1.1.89 2 2 2h5v2h8v-2h2v-2H3V5h18v8h2V5c0-1.11-.9-2-2-2zm-8 7V7h-2v3H8v2h3v3h2v-3h3v-2h-3zm11 8l-4.5 4.5L18 21l3-3-3-3 1.5-1.5L24 18z"/></g>
+<g id="radio"><path d="M3.24 6.15C2.51 6.43 2 7.17 2 8v12c0 1.1.89 2 2 2h16c1.11 0 2-.9 2-2V8c0-1.11-.89-2-2-2H8.3l8.26-3.34L15.88 1 3.24 6.15zM7 20c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm13-8h-2v-2h-2v2H4V8h16v4z"/></g>
+<g id="recent-actors"><path d="M21 5v14h2V5h-2zm-4 14h2V5h-2v14zM14 5H2c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h12c.55 0 1-.45 1-1V6c0-.55-.45-1-1-1zM8 7.75c1.24 0 2.25 1.01 2.25 2.25S9.24 12.25 8 12.25 5.75 11.24 5.75 10 6.76 7.75 8 7.75zM12.5 17h-9v-.75c0-1.5 3-2.25 4.5-2.25s4.5.75 4.5 2.25V17z"/></g>
+<g id="remove-from-queue"><path d="M21 3H3c-1.11 0-2 .89-2 2v12c0 1.1.89 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.11-.9-2-2-2zm0 14H3V5h18v12zm-5-7v2H8v-2h8z"/></g>
+<g id="repeat"><path d="M7 7h10v3l4-4-4-4v3H5v6h2V7zm10 10H7v-3l-4 4 4 4v-3h12v-6h-2v4z"/></g>
+<g id="repeat-one"><path d="M7 7h10v3l4-4-4-4v3H5v6h2V7zm10 10H7v-3l-4 4 4 4v-3h12v-6h-2v4zm-4-2V9h-1l-2 1v1h1.5v4H13z"/></g>
+<g id="replay"><path d="M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z"/></g>
+<g id="replay-10"><path d="M12 5V1L7 6l5 5V7c3.3 0 6 2.7 6 6s-2.7 6-6 6-6-2.7-6-6H4c0 4.4 3.6 8 8 8s8-3.6 8-8-3.6-8-8-8zm-1.1 11H10v-3.3L9 13v-.7l1.8-.6h.1V16zm4.3-1.8c0 .3 0 .6-.1.8l-.3.6s-.3.3-.5.3-.4.1-.6.1-.4 0-.6-.1-.3-.2-.5-.3-.2-.3-.3-.6-.1-.5-.1-.8v-.7c0-.3 0-.6.1-.8l.3-.6s.3-.3.5-.3.4-.1.6-.1.4 0 .6.1c.2.1.3.2.5.3s.2.3.3.6.1.5.1.8v.7zm-.9-.8v-.5s-.1-.2-.1-.3-.1-.1-.2-.2-.2-.1-.3-.1-.2 0-.3.1l-.2.2s-.1.2-.1.3v2s.1.2.1.3.1.1.2.2.2.1.3.1.2 0 .3-.1l.2-.2s.1-.2.1-.3v-1.5z"/></g>
+<g id="replay-30"><path d="M12 5V1L7 6l5 5V7c3.3 0 6 2.7 6 6s-2.7 6-6 6-6-2.7-6-6H4c0 4.4 3.6 8 8 8s8-3.6 8-8-3.6-8-8-8zm-2.4 8.5h.4c.2 0 .4-.1.5-.2s.2-.2.2-.4v-.2s-.1-.1-.1-.2-.1-.1-.2-.1h-.5s-.1.1-.2.1-.1.1-.1.2v.2h-1c0-.2 0-.3.1-.5s.2-.3.3-.4.3-.2.4-.2.4-.1.5-.1c.2 0 .4 0 .6.1s.3.1.5.2.2.2.3.4.1.3.1.5v.3s-.1.2-.1.3-.1.2-.2.2-.2.1-.3.2c.2.1.4.2.5.4s.2.4.2.6c0 .2 0 .4-.1.5s-.2.3-.3.4-.3.2-.5.2-.4.1-.6.1c-.2 0-.4 0-.5-.1s-.3-.1-.5-.2-.2-.2-.3-.4-.1-.4-.1-.6h.8v.2s.1.1.1.2.1.1.2.1h.5s.1-.1.2-.1.1-.1.1-.2v-.5s-.1-.1-.1-.2-.1-.1-.2-.1h-.6v-.7zm5.7.7c0 .3 0 .6-.1.8l-.3.6s-.3.3-.5.3-.4.1-.6.1-.4 0-.6-.1-.3-.2-.5-.3-.2-.3-.3-.6-.1-.5-.1-.8v-.7c0-.3 0-.6.1-.8l.3-.6s.3-.3.5-.3.4-.1.6-.1.4 0 .6.1.3.2.5.3.2.3.3.6.1.5.1.8v.7zm-.8-.8v-.5c0-.1-.1-.2-.1-.3s-.1-.1-.2-.2-.2-.1-.3-.1-.2 0-.3.1l-.2.2s-.1.2-.1.3v2s.1.2.1.3.1.1.2.2.2.1.3.1.2 0 .3-.1l.2-.2s.1-.2.1-.3v-1.5z"/></g>
+<g id="replay-5"><path d="M12 5V1L7 6l5 5V7c3.3 0 6 2.7 6 6s-2.7 6-6 6-6-2.7-6-6H4c0 4.4 3.6 8 8 8s8-3.6 8-8-3.6-8-8-8zm-1.3 8.9l.2-2.2h2.4v.7h-1.7l-.1.9s.1 0 .1-.1.1 0 .1-.1.1 0 .2 0h.2c.2 0 .4 0 .5.1s.3.2.4.3.2.3.3.5.1.4.1.6c0 .2 0 .4-.1.5s-.1.3-.3.5-.3.2-.4.3-.4.1-.6.1c-.2 0-.4 0-.5-.1s-.3-.1-.5-.2-.2-.2-.3-.4-.1-.3-.1-.5h.8c0 .2.1.3.2.4s.2.1.4.1c.1 0 .2 0 .3-.1l.2-.2s.1-.2.1-.3v-.6l-.1-.2-.2-.2s-.2-.1-.3-.1h-.2s-.1 0-.2.1-.1 0-.1.1-.1.1-.1.1h-.7z"/></g>
+<g id="shuffle"><path d="M10.59 9.17L5.41 4 4 5.41l5.17 5.17 1.42-1.41zM14.5 4l2.04 2.04L4 18.59 5.41 20 17.96 7.46 20 9.5V4h-5.5zm.33 9.41l-1.41 1.41 3.13 3.13L14.5 20H20v-5.5l-2.04 2.04-3.13-3.13z"/></g>
+<g id="skip-next"><path d="M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z"/></g>
+<g id="skip-previous"><path d="M6 6h2v12H6zm3.5 6l8.5 6V6z"/></g>
+<g id="slow-motion-video"><path d="M13.05 9.79L10 7.5v9l3.05-2.29L16 12zm0 0L10 7.5v9l3.05-2.29L16 12zm0 0L10 7.5v9l3.05-2.29L16 12zM11 4.07V2.05c-2.01.2-3.84 1-5.32 2.21L7.1 5.69c1.11-.86 2.44-1.44 3.9-1.62zM5.69 7.1L4.26 5.68C3.05 7.16 2.25 8.99 2.05 11h2.02c.18-1.46.76-2.79 1.62-3.9zM4.07 13H2.05c.2 2.01 1 3.84 2.21 5.32l1.43-1.43c-.86-1.1-1.44-2.43-1.62-3.89zm1.61 6.74C7.16 20.95 9 21.75 11 21.95v-2.02c-1.46-.18-2.79-.76-3.9-1.62l-1.42 1.43zM22 12c0 5.16-3.92 9.42-8.95 9.95v-2.02C16.97 19.41 20 16.05 20 12s-3.03-7.41-6.95-7.93V2.05C18.08 2.58 22 6.84 22 12z"/></g>
+<g id="snooze"><path d="M7.88 3.39L6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm-3-9h3.63L9 15.2V17h6v-2h-3.63L15 10.8V9H9v2z"/></g>
+<g id="sort-by-alpha"><path d="M14.94 4.66h-4.72l2.36-2.36zm-4.69 14.71h4.66l-2.33 2.33zM6.1 6.27L1.6 17.73h1.84l.92-2.45h5.11l.92 2.45h1.84L7.74 6.27H6.1zm-1.13 7.37l1.94-5.18 1.94 5.18H4.97zm10.76 2.5h6.12v1.59h-8.53v-1.29l5.92-8.56h-5.88v-1.6h8.3v1.26l-5.93 8.6z"/></g>
+<g id="stop"><path d="M6 6h12v12H6z"/></g>
+<g id="subscriptions"><path d="M20 8H4V6h16v2zm-2-6H6v2h12V2zm4 10v8c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2v-8c0-1.1.9-2 2-2h16c1.1 0 2 .9 2 2zm-6 4l-6-3.27v6.53L16 16z"/></g>
+<g id="subtitles"><path d="M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM4 12h4v2H4v-2zm10 6H4v-2h10v2zm6 0h-4v-2h4v2zm0-4H10v-2h10v2z"/></g>
+<g id="surround-sound"><path d="M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM7.76 16.24l-1.41 1.41C4.78 16.1 4 14.05 4 12c0-2.05.78-4.1 2.34-5.66l1.41 1.41C6.59 8.93 6 10.46 6 12s.59 3.07 1.76 4.24zM12 16c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4zm5.66 1.66l-1.41-1.41C17.41 15.07 18 13.54 18 12s-.59-3.07-1.76-4.24l1.41-1.41C19.22 7.9 20 9.95 20 12c0 2.05-.78 4.1-2.34 5.66zM12 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></g>
+<g id="video-call"><path d="M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4zM14 13h-3v3H9v-3H6v-2h3V8h2v3h3v2z"/></g>
+<g id="video-label"><path d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 13H3V5h18v11z"/></g>
+<g id="video-library"><path d="M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-8 12.5v-9l6 4.5-6 4.5z"/></g>
+<g id="videocam"><path d="M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z"/></g>
+<g id="videocam-off"><path d="M21 6.5l-4 4V7c0-.55-.45-1-1-1H9.82L21 17.18V6.5zM3.27 2L2 3.27 4.73 6H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.21 0 .39-.08.54-.18L19.73 21 21 19.73 3.27 2z"/></g>
+<g id="volume-down"><path d="M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z"/></g>
+<g id="volume-mute"><path d="M7 9v6h4l5 5V4l-5 5H7z"/></g>
+<g id="volume-off"><path d="M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z"/></g>
+<g id="volume-up"><path d="M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"/></g>
+<g id="web"><path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-5 14H4v-4h11v4zm0-5H4V9h11v4zm5 5h-4V9h4v9z"/></g>
+<g id="web-asset"><path d="M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.89-2-2-2zm0 14H5V8h14v10z"/></g>
+</defs></svg>
+</iron-iconset-svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/bower.json
new file mode 100644
index 00000000000..0d71899fe3d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/bower.json
@@ -0,0 +1,77 @@
+{
+ "name": "iron-icons",
+ "version": "2.1.1",
+ "description": "A set of icons for use with iron-icon",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "icon"
+ ],
+ "main": "iron-icons.html",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-icons"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-icons",
+ "dependencies": {
+ "iron-icon": "PolymerElements/iron-icon#1 - 2",
+ "iron-iconset-svg": "PolymerElements/iron-iconset-svg#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "iron-component-page": "polymerelements/iron-component-page#1 - 2",
+ "iron-meta": "PolymerElements/iron-meta#1 - 2",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
+ "web-component-tester": "^6.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-icon": "polymerelements/iron-icon#^1.0.0",
+ "iron-iconset-svg": "polymerelements/iron-iconset-svg#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "paper-styles": "polymerelements/paper-styles#^1.0.2",
+ "iron-component-page": "polymerelements/iron-component-page#1.0.0",
+ "iron-meta": "polymerelements/iron-meta#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ },
+ "polymer-1.x_iron-meta-2.x": {
+ "dependencies": {
+ "iron-icon": "polymerelements/iron-icon#^1.0.0",
+ "iron-iconset-svg": "polymerelements/iron-iconset-svg#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "paper-styles": "polymerelements/paper-styles#^1.0.2",
+ "iron-component-page": "polymerelements/iron-component-page#1.0.0",
+ "iron-meta": "polymerelements/iron-meta#^2.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7",
+ "iron-meta": "^2.0.0"
+ }
+ }
+ },
+ "ignore": [
+ "util",
+ "update-icons.sh"
+ ]
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/communication-icons.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/communication-icons.d.ts
new file mode 100644
index 00000000000..f8a5292434c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/communication-icons.d.ts
@@ -0,0 +1,13 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * communication-icons.html
+ */
+
+/// <reference path="../iron-icon/iron-icon.d.ts" />
+/// <reference path="../iron-iconset-svg/iron-iconset-svg.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/communication-icons.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/communication-icons.html
new file mode 100644
index 00000000000..a9e1839a532
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/communication-icons.html
@@ -0,0 +1,66 @@
+<!--
+@license
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../iron-icon/iron-icon.html">
+<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
+<iron-iconset-svg name="communication" size="24">
+<svg><defs>
+<g id="business"><path d="M12 7V3H2v18h20V7H12zM6 19H4v-2h2v2zm0-4H4v-2h2v2zm0-4H4V9h2v2zm0-4H4V5h2v2zm4 12H8v-2h2v2zm0-4H8v-2h2v2zm0-4H8V9h2v2zm0-4H8V5h2v2zm10 12h-8v-2h2v-2h-2v-2h2v-2h-2V9h8v10zm-2-8h-2v2h2v-2zm0 4h-2v2h2v-2z"/></g>
+<g id="call"><path d="M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z"/></g>
+<g id="call-end"><path d="M12 9c-1.6 0-3.15.25-4.6.72v3.1c0 .39-.23.74-.56.9-.98.49-1.87 1.12-2.66 1.85-.18.18-.43.28-.7.28-.28 0-.53-.11-.71-.29L.29 13.08c-.18-.17-.29-.42-.29-.7 0-.28.11-.53.29-.71C3.34 8.78 7.46 7 12 7s8.66 1.78 11.71 4.67c.18.18.29.43.29.71 0 .28-.11.53-.29.71l-2.48 2.48c-.18.18-.43.29-.71.29-.27 0-.52-.11-.7-.28-.79-.74-1.69-1.36-2.67-1.85-.33-.16-.56-.5-.56-.9v-3.1C15.15 9.25 13.6 9 12 9z"/></g>
+<g id="call-made"><path d="M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5z"/></g>
+<g id="call-merge"><path d="M17 20.41L18.41 19 15 15.59 13.59 17 17 20.41zM7.5 8H11v5.59L5.59 19 7 20.41l6-6V8h3.5L12 3.5 7.5 8z"/></g>
+<g id="call-missed"><path d="M19.59 7L12 14.59 6.41 9H11V7H3v8h2v-4.59l7 7 9-9z"/></g>
+<g id="call-missed-outgoing"><path d="M3 8.41l9 9 7-7V15h2V7h-8v2h4.59L12 14.59 4.41 7 3 8.41z"/></g>
+<g id="call-received"><path d="M20 5.41L18.59 4 7 15.59V9H5v10h10v-2H8.41z"/></g>
+<g id="call-split"><path d="M14 4l2.29 2.29-2.88 2.88 1.42 1.42 2.88-2.88L20 10V4zm-4 0H4v6l2.29-2.29 4.71 4.7V20h2v-8.41l-5.29-5.3z"/></g>
+<g id="chat"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM6 9h12v2H6V9zm8 5H6v-2h8v2zm4-6H6V6h12v2z"/></g>
+<g id="chat-bubble"><path d="M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z"/></g>
+<g id="chat-bubble-outline"><path d="M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z"/></g>
+<g id="clear-all"><path d="M5 13h14v-2H5v2zm-2 4h14v-2H3v2zM7 7v2h14V7H7z"/></g>
+<g id="comment"><path d="M21.99 4c0-1.1-.89-2-1.99-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4-.01-18zM18 14H6v-2h12v2zm0-3H6V9h12v2zm0-3H6V6h12v2z"/></g>
+<g id="contact-mail"><path d="M21 8V7l-3 2-3-2v1l3 2 3-2zm1-5H2C.9 3 0 3.9 0 5v14c0 1.1.9 2 2 2h20c1.1 0 1.99-.9 1.99-2L24 5c0-1.1-.9-2-2-2zM8 6c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12H2v-1c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1zm8-6h-8V6h8v6z"/></g>
+<g id="contact-phone"><path d="M22 3H2C.9 3 0 3.9 0 5v14c0 1.1.9 2 2 2h20c1.1 0 1.99-.9 1.99-2L24 5c0-1.1-.9-2-2-2zM8 6c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12H2v-1c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1zm3.85-4h1.64L21 16l-1.99 1.99c-1.31-.98-2.28-2.38-2.73-3.99-.18-.64-.28-1.31-.28-2s.1-1.36.28-2c.45-1.62 1.42-3.01 2.73-3.99L21 8l-1.51 2h-1.64c-.22.63-.35 1.3-.35 2s.13 1.37.35 2z"/></g>
+<g id="contacts"><path d="M20 0H4v2h16V0zM4 24h16v-2H4v2zM20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 2.75c1.24 0 2.25 1.01 2.25 2.25s-1.01 2.25-2.25 2.25S9.75 10.24 9.75 9 10.76 6.75 12 6.75zM17 17H7v-1.5c0-1.67 3.33-2.5 5-2.5s5 .83 5 2.5V17z"/></g>
+<g id="dialer-sip"><path d="M17 3h-1v5h1V3zm-2 2h-2V4h2V3h-3v3h2v1h-2v1h3V5zm3-2v5h1V6h2V3h-3zm2 2h-1V4h1v1zm0 10.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.01.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.27-.26.35-.65.24-1C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1z"/></g>
+<g id="dialpad"><path d="M12 19c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zM6 1c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12-8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm-6 8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></g>
+<g id="email"><path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/></g>
+<g id="forum"><path d="M21 6h-2v9H6v2c0 .55.45 1 1 1h11l4 4V7c0-.55-.45-1-1-1zm-4 6V3c0-.55-.45-1-1-1H3c-.55 0-1 .45-1 1v14l4-4h10c.55 0 1-.45 1-1z"/></g>
+<g id="import-contacts"><path d="M21 5c-1.11-.35-2.33-.5-3.5-.5-1.95 0-4.05.4-5.5 1.5-1.45-1.1-3.55-1.5-5.5-1.5S2.45 4.9 1 6v14.65c0 .25.25.5.5.5.1 0 .15-.05.25-.05C3.1 20.45 5.05 20 6.5 20c1.95 0 4.05.4 5.5 1.5 1.35-.85 3.8-1.5 5.5-1.5 1.65 0 3.35.3 4.75 1.05.1.05.15.05.25.05.25 0 .5-.25.5-.5V6c-.6-.45-1.25-.75-2-1zm0 13.5c-1.1-.35-2.3-.5-3.5-.5-1.7 0-4.15.65-5.5 1.5V8c1.35-.85 3.8-1.5 5.5-1.5 1.2 0 2.4.15 3.5.5v11.5z"/></g>
+<g id="import-export"><path d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/></g>
+<g id="invert-colors-off"><path d="M20.65 20.87l-2.35-2.35-6.3-6.29-3.56-3.57-1.42-1.41L4.27 4.5 3 5.77l2.78 2.78c-2.55 3.14-2.36 7.76.56 10.69C7.9 20.8 9.95 21.58 12 21.58c1.79 0 3.57-.59 5.03-1.78l2.7 2.7L21 21.23l-.35-.36zM12 19.59c-1.6 0-3.11-.62-4.24-1.76C6.62 16.69 6 15.19 6 13.59c0-1.32.43-2.57 1.21-3.6L12 14.77v4.82zM12 5.1v4.58l7.25 7.26c1.37-2.96.84-6.57-1.6-9.01L12 2.27l-3.7 3.7 1.41 1.41L12 5.1z"/></g>
+<g id="live-help"><path d="M19 2H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h4l3 3 3-3h4c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-6 16h-2v-2h2v2zm2.07-7.75l-.9.92C13.45 11.9 13 12.5 13 14h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z"/></g>
+<g id="location-off"><path d="M12 6.5c1.38 0 2.5 1.12 2.5 2.5 0 .74-.33 1.39-.83 1.85l3.63 3.63c.98-1.86 1.7-3.8 1.7-5.48 0-3.87-3.13-7-7-7-1.98 0-3.76.83-5.04 2.15l3.19 3.19c.46-.52 1.11-.84 1.85-.84zm4.37 9.6l-4.63-4.63-.11-.11L3.27 3 2 4.27l3.18 3.18C5.07 7.95 5 8.47 5 9c0 5.25 7 13 7 13s1.67-1.85 3.38-4.35L18.73 21 20 19.73l-3.63-3.63z"/></g>
+<g id="location-on"><path d="M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z"/></g>
+<g id="mail-outline"><path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 14H4V8l8 5 8-5v10zm-8-7L4 6h16l-8 5z"/></g>
+<g id="message"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-2 12H6v-2h12v2zm0-3H6V9h12v2zm0-3H6V6h12v2z"/></g>
+<g id="no-sim"><path d="M18.99 5c0-1.1-.89-2-1.99-2h-7L7.66 5.34 19 16.68 18.99 5zM3.65 3.88L2.38 5.15 5 7.77V19c0 1.1.9 2 2 2h10.01c.35 0 .67-.1.96-.26l1.88 1.88 1.27-1.27L3.65 3.88z"/></g>
+<g id="phone"><path d="M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z"/></g>
+<g id="phonelink-erase"><path d="M13 8.2l-1-1-4 4-4-4-1 1 4 4-4 4 1 1 4-4 4 4 1-1-4-4 4-4zM19 1H9c-1.1 0-2 .9-2 2v3h2V4h10v16H9v-2H7v3c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2z"/></g>
+<g id="phonelink-lock"><path d="M19 1H9c-1.1 0-2 .9-2 2v3h2V4h10v16H9v-2H7v3c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm-8.2 10V9.5C10.8 8.1 9.4 7 8 7S5.2 8.1 5.2 9.5V11c-.6 0-1.2.6-1.2 1.2v3.5c0 .7.6 1.3 1.2 1.3h5.5c.7 0 1.3-.6 1.3-1.2v-3.5c0-.7-.6-1.3-1.2-1.3zm-1.3 0h-3V9.5c0-.8.7-1.3 1.5-1.3s1.5.5 1.5 1.3V11z"/></g>
+<g id="phonelink-ring"><path d="M20.1 7.7l-1 1c1.8 1.8 1.8 4.6 0 6.5l1 1c2.5-2.3 2.5-6.1 0-8.5zM18 9.8l-1 1c.5.7.5 1.6 0 2.3l1 1c1.2-1.2 1.2-3 0-4.3zM14 1H4c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 19H4V4h10v16z"/></g>
+<g id="phonelink-setup"><path d="M11.8 12.5v-1l1.1-.8c.1-.1.1-.2.1-.3l-1-1.7c-.1-.1-.2-.2-.3-.1l-1.3.4c-.3-.2-.6-.4-.9-.5l-.2-1.3c0-.1-.1-.2-.3-.2H7c-.1 0-.2.1-.3.2l-.2 1.3c-.3.1-.6.3-.9.5l-1.3-.5c-.1 0-.2 0-.3.1l-1 1.7c-.1.1 0 .2.1.3l1.1.8v1l-1.1.8c-.1.2-.1.3-.1.4l1 1.7c.1.1.2.2.3.1l1.4-.4c.3.2.6.4.9.5l.2 1.3c-.1.1.1.2.2.2h2c.1 0 .2-.1.3-.2l.2-1.3c.3-.1.6-.3.9-.5l1.3.5c.1 0 .2 0 .3-.1l1-1.7c.1-.1 0-.2-.1-.3l-1.1-.9zM8 14c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zM19 1H9c-1.1 0-2 .9-2 2v3h2V4h10v16H9v-2H7v3c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2z"/></g>
+<g id="portable-wifi-off"><path d="M17.56 14.24c.28-.69.44-1.45.44-2.24 0-3.31-2.69-6-6-6-.79 0-1.55.16-2.24.44l1.62 1.62c.2-.03.41-.06.62-.06 2.21 0 4 1.79 4 4 0 .21-.02.42-.05.63l1.61 1.61zM12 4c4.42 0 8 3.58 8 8 0 1.35-.35 2.62-.95 3.74l1.47 1.47C21.46 15.69 22 13.91 22 12c0-5.52-4.48-10-10-10-1.91 0-3.69.55-5.21 1.47l1.46 1.46C9.37 4.34 10.65 4 12 4zM3.27 2.5L2 3.77l2.1 2.1C2.79 7.57 2 9.69 2 12c0 3.7 2.01 6.92 4.99 8.65l1-1.73C5.61 17.53 4 14.96 4 12c0-1.76.57-3.38 1.53-4.69l1.43 1.44C6.36 9.68 6 10.8 6 12c0 2.22 1.21 4.15 3 5.19l1-1.74c-1.19-.7-2-1.97-2-3.45 0-.65.17-1.25.44-1.79l1.58 1.58L10 12c0 1.1.9 2 2 2l.21-.02.01.01 7.51 7.51L21 20.23 4.27 3.5l-1-1z"/></g>
+<g id="present-to-all"><path d="M21 3H3c-1.11 0-2 .89-2 2v14c0 1.11.89 2 2 2h18c1.11 0 2-.89 2-2V5c0-1.11-.89-2-2-2zm0 16.02H3V4.98h18v14.04zM10 12H8l4-4 4 4h-2v4h-4v-4z"/></g>
+<g id="ring-volume"><path d="M23.71 16.67C20.66 13.78 16.54 12 12 12 7.46 12 3.34 13.78.29 16.67c-.18.18-.29.43-.29.71 0 .28.11.53.29.71l2.48 2.48c.18.18.43.29.71.29.27 0 .52-.11.7-.28.79-.74 1.69-1.36 2.66-1.85.33-.16.56-.5.56-.9v-3.1c1.45-.48 3-.73 4.6-.73s3.15.25 4.6.72v3.1c0 .39.23.74.56.9.98.49 1.87 1.12 2.66 1.85.18.18.43.28.7.28.28 0 .53-.11.71-.29l2.48-2.48c.18-.18.29-.43.29-.71 0-.27-.11-.52-.29-.7zM21.16 6.26l-1.41-1.41-3.56 3.55 1.41 1.41s3.45-3.52 3.56-3.55zM13 2h-2v5h2V2zM6.4 9.81L7.81 8.4 4.26 4.84 2.84 6.26c.11.03 3.56 3.55 3.56 3.55z"/></g>
+<g id="rss-feed"><circle cx="6.18" cy="17.82" r="2.18"/><path d="M4 4.44v2.83c7.03 0 12.73 5.7 12.73 12.73h2.83c0-8.59-6.97-15.56-15.56-15.56zm0 5.66v2.83c3.9 0 7.07 3.17 7.07 7.07h2.83c0-5.47-4.43-9.9-9.9-9.9z"/></g>
+<g id="screen-share"><path d="M20 18c1.1 0 1.99-.9 1.99-2L22 6c0-1.11-.9-2-2-2H4c-1.11 0-2 .89-2 2v10c0 1.1.89 2 2 2H0v2h24v-2h-4zm-7-3.53v-2.19c-2.78 0-4.61.85-6 2.72.56-2.67 2.11-5.33 6-5.87V7l4 3.73-4 3.74z"/></g>
+<g id="speaker-phone"><path d="M7 7.07L8.43 8.5c.91-.91 2.18-1.48 3.57-1.48s2.66.57 3.57 1.48L17 7.07C15.72 5.79 13.95 5 12 5s-3.72.79-5 2.07zM12 1C8.98 1 6.24 2.23 4.25 4.21l1.41 1.41C7.28 4 9.53 3 12 3s4.72 1 6.34 2.62l1.41-1.41C17.76 2.23 15.02 1 12 1zm2.86 9.01L9.14 10C8.51 10 8 10.51 8 11.14v9.71c0 .63.51 1.14 1.14 1.14h5.71c.63 0 1.14-.51 1.14-1.14v-9.71c.01-.63-.5-1.13-1.13-1.13zM15 20H9v-8h6v8z"/></g>
+<g id="stay-current-landscape"><path d="M1.01 7L1 17c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2H3c-1.1 0-1.99.9-1.99 2zM19 7v10H5V7h14z"/></g>
+<g id="stay-current-portrait"><path d="M17 1.01L7 1c-1.1 0-1.99.9-1.99 2v18c0 1.1.89 2 1.99 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM17 19H7V5h10v14z"/></g>
+<g id="stay-primary-landscape"><path d="M1.01 7L1 17c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2H3c-1.1 0-1.99.9-1.99 2zM19 7v10H5V7h14z"/></g>
+<g id="stay-primary-portrait"><path d="M17 1.01L7 1c-1.1 0-1.99.9-1.99 2v18c0 1.1.89 2 1.99 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM17 19H7V5h10v14z"/></g>
+<g id="stop-screen-share"><path d="M21.22 18.02l2 2H24v-2h-2.78zm.77-2l.01-10c0-1.11-.9-2-2-2H7.22l5.23 5.23c.18-.04.36-.07.55-.1V7.02l4 3.73-1.58 1.47 5.54 5.54c.61-.33 1.03-.99 1.03-1.74zM2.39 1.73L1.11 3l1.54 1.54c-.4.36-.65.89-.65 1.48v10c0 1.1.89 2 2 2H0v2h18.13l2.71 2.71 1.27-1.27L2.39 1.73zM7 15.02c.31-1.48.92-2.95 2.07-4.06l1.59 1.59c-1.54.38-2.7 1.18-3.66 2.47z"/></g>
+<g id="swap-calls"><path d="M18 4l-4 4h3v7c0 1.1-.9 2-2 2s-2-.9-2-2V8c0-2.21-1.79-4-4-4S5 5.79 5 8v7H2l4 4 4-4H7V8c0-1.1.9-2 2-2s2 .9 2 2v7c0 2.21 1.79 4 4 4s4-1.79 4-4V8h3l-4-4z"/></g>
+<g id="textsms"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM9 11H7V9h2v2zm4 0h-2V9h2v2zm4 0h-2V9h2v2z"/></g>
+<g id="voicemail"><path d="M18.5 6C15.46 6 13 8.46 13 11.5c0 1.33.47 2.55 1.26 3.5H9.74c.79-.95 1.26-2.17 1.26-3.5C11 8.46 8.54 6 5.5 6S0 8.46 0 11.5 2.46 17 5.5 17h13c3.04 0 5.5-2.46 5.5-5.5S21.54 6 18.5 6zm-13 9C3.57 15 2 13.43 2 11.5S3.57 8 5.5 8 9 9.57 9 11.5 7.43 15 5.5 15zm13 0c-1.93 0-3.5-1.57-3.5-3.5S16.57 8 18.5 8 22 9.57 22 11.5 20.43 15 18.5 15z"/></g>
+<g id="vpn-key"><path d="M12.65 10C11.83 7.67 9.61 6 7 6c-3.31 0-6 2.69-6 6s2.69 6 6 6c2.61 0 4.83-1.67 5.65-4H17v4h4v-4h2v-4H12.65zM7 14c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z"/></g>
+</defs></svg>
+</iron-iconset-svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/demo/index.html
new file mode 100644
index 00000000000..be1a56f58bd
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/demo/index.html
@@ -0,0 +1,119 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <title>iron-icons demo</title>
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../../paper-styles/demo-pages.html">
+ <link rel="import" href="../../paper-styles/color.html">
+ <link rel="import" href="../../iron-meta/iron-meta.html">
+
+ <!-- load default iconset -->
+ <link rel="import" href="../iron-icons.html">
+
+ <!-- load the rest -->
+ <link rel="import" href="../av-icons.html">
+ <link rel="import" href="../communication-icons.html">
+ <link rel="import" href="../device-icons.html">
+ <link rel="import" href="../editor-icons.html">
+ <link rel="import" href="../hardware-icons.html">
+ <link rel="import" href="../image-icons.html">
+ <link rel="import" href="../maps-icons.html">
+ <link rel="import" href="../notification-icons.html">
+ <link rel="import" href="../social-icons.html">
+ <link rel="import" href="../places-icons.html">
+</head>
+<body>
+ <custom-style>
+ <style is="custom-style">
+ h2 {
+ text-transform: capitalize;
+ }
+
+ iron-icon {
+ transition: all 0.2s;
+ -webkit-transition: all 0.2s;
+ }
+
+ iron-icon:hover {
+ fill: var(--google-yellow-700);
+ }
+
+ .set {
+ display: block;
+ text-align: center;
+ margin: auto;
+ padding: 1em 0;
+ border-bottom: 1px solid silver;
+ }
+
+ .set:last-of-type {
+ border-bottom: none;
+ }
+
+ .set:nth-of-type(4n-3) {
+ color: var(--paper-grey-700);
+ }
+
+ .set:nth-of-type(4n-2) {
+ color: var(--paper-pink-500);
+ }
+
+ .set:nth-of-type(4n-1) {
+ color: var(--google-green-500);
+ }
+
+ .set:nth-of-type(4n) {
+ color: var(--google-blue-500);
+ }
+
+ .container {
+ display: inline-block;
+ width: 10em;
+ margin: 1em 0.5em;
+ text-align: center;
+ }
+
+ .container > div {
+ margin-top: 0.5em;
+ color: black;
+ font-size: 10px;
+ }
+ </style>
+ </custom-style>
+
+ <dom-bind id="scope">
+ <template is="dom-bind">
+ <template is="dom-repeat" id="iconsetRepeat">
+ <h2>{{item.name}}</h2>
+ <div class="set">
+ <template is="dom-repeat" items="{{getIconNames(item)}}">
+ <span class="container">
+ <iron-icon icon="{{item}}"></iron-icon>
+ <div>{{item}}</div>
+ </span>
+ </template>
+ </div>
+ </template>
+ </template>
+ </dom-bind>
+
+ <script>
+ window.addEventListener('WebComponentsReady', function() {
+ scope.getIconNames = function(iconset) {
+ return iconset.getIconNames();
+ };
+ scope.parentNode.getIconNames = scope.getIconNames;
+ iconsetRepeat.items = new Polymer.IronMeta({type: 'iconset'}).list;
+ });
+ </script>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/device-icons.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/device-icons.d.ts
new file mode 100644
index 00000000000..4a676ad78a7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/device-icons.d.ts
@@ -0,0 +1,13 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * device-icons.html
+ */
+
+/// <reference path="../iron-icon/iron-icon.d.ts" />
+/// <reference path="../iron-iconset-svg/iron-iconset-svg.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/device-icons.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/device-icons.html
new file mode 100644
index 00000000000..190f896252b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/device-icons.html
@@ -0,0 +1,95 @@
+<!--
+@license
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../iron-icon/iron-icon.html">
+<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
+<iron-iconset-svg name="device" size="24">
+<svg><defs>
+<g id="access-alarm"><path d="M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM7.88 3.39L6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM12.5 8H11v6l4.75 2.85.75-1.23-4-2.37V8zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"/></g>
+<g id="access-alarms"><path d="M22 5.7l-4.6-3.9-1.3 1.5 4.6 3.9L22 5.7zM7.9 3.4L6.6 1.9 2 5.7l1.3 1.5 4.6-3.8zM12.5 8H11v6l4.7 2.9.8-1.2-4-2.4V8zM12 4c-5 0-9 4-9 9s4 9 9 9 9-4 9-9-4-9-9-9zm0 16c-3.9 0-7-3.1-7-7s3.1-7 7-7 7 3.1 7 7-3.1 7-7 7z"/></g>
+<g id="access-time"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z"/></g>
+<g id="add-alarm"><path d="M7.88 3.39L6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm1-11h-2v3H8v2h3v3h2v-3h3v-2h-3V9z"/></g>
+<g id="airplanemode-active"><path d="M10.18 9"/><path d="M21 16v-2l-8-5V3.5c0-.83-.67-1.5-1.5-1.5S10 2.67 10 3.5V9l-8 5v2l8-2.5V19l-2 1.5V22l3.5-1 3.5 1v-1.5L13 19v-5.5l8 2.5z"/></g>
+<g id="airplanemode-inactive"><path d="M13 9V3.5c0-.83-.67-1.5-1.5-1.5S10 2.67 10 3.5v3.68l7.83 7.83L21 16v-2l-8-5zM3 5.27l4.99 4.99L2 14v2l8-2.5V19l-2 1.5V22l3.5-1 3.5 1v-1.5L13 19v-3.73L18.73 21 20 19.73 4.27 4 3 5.27z"/></g>
+<g id="battery-20"><path d="M7 17v3.67C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V17H7z"/><path fill-opacity=".3" d="M17 5.33C17 4.6 16.4 4 15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33V17h10V5.33z"/></g>
+<g id="battery-30"><path fill-opacity=".3" d="M17 5.33C17 4.6 16.4 4 15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33V15h10V5.33z"/><path d="M7 15v5.67C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V15H7z"/></g>
+<g id="battery-50"><path fill-opacity=".3" d="M17 5.33C17 4.6 16.4 4 15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33V13h10V5.33z"/><path d="M7 13v7.67C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V13H7z"/></g>
+<g id="battery-60"><path fill-opacity=".3" d="M17 5.33C17 4.6 16.4 4 15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33V11h10V5.33z"/><path d="M7 11v9.67C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V11H7z"/></g>
+<g id="battery-80"><path fill-opacity=".3" d="M17 5.33C17 4.6 16.4 4 15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33V9h10V5.33z"/><path d="M7 9v11.67C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V9H7z"/></g>
+<g id="battery-90"><path fill-opacity=".3" d="M17 5.33C17 4.6 16.4 4 15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33V8h10V5.33z"/><path d="M7 8v12.67C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V8H7z"/></g>
+<g id="battery-alert"><path d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v15.33C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V5.33C17 4.6 16.4 4 15.67 4zM13 18h-2v-2h2v2zm0-4h-2V9h2v5z"/></g>
+<g id="battery-charging-20"><path d="M11 20v-3H7v3.67C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V17h-4.4L11 20z"/><path fill-opacity=".3" d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33V17h4v-2.5H9L13 7v5.5h2L12.6 17H17V5.33C17 4.6 16.4 4 15.67 4z"/></g>
+<g id="battery-charging-30"><path fill-opacity=".3" d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v9.17h2L13 7v5.5h2l-1.07 2H17V5.33C17 4.6 16.4 4 15.67 4z"/><path d="M11 20v-5.5H7v6.17C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V14.5h-3.07L11 20z"/></g>
+<g id="battery-charging-50"><path d="M14.47 13.5L11 20v-5.5H9l.53-1H7v7.17C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V13.5h-2.53z"/><path fill-opacity=".3" d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v8.17h2.53L13 7v5.5h2l-.53 1H17V5.33C17 4.6 16.4 4 15.67 4z"/></g>
+<g id="battery-charging-60"><path fill-opacity=".3" d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33V11h3.87L13 7v4h4V5.33C17 4.6 16.4 4 15.67 4z"/><path d="M13 12.5h2L11 20v-5.5H9l1.87-3.5H7v9.67C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V11h-4v1.5z"/></g>
+<g id="battery-charging-80"><path fill-opacity=".3" d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33V9h4.93L13 7v2h4V5.33C17 4.6 16.4 4 15.67 4z"/><path d="M13 12.5h2L11 20v-5.5H9L11.93 9H7v11.67C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V9h-4v3.5z"/></g>
+<g id="battery-charging-90"><path fill-opacity=".3" d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33V8h5.47L13 7v1h4V5.33C17 4.6 16.4 4 15.67 4z"/><path d="M13 12.5h2L11 20v-5.5H9L12.47 8H7v12.67C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V8h-4v4.5z"/></g>
+<g id="battery-charging-full"><path d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v15.33C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V5.33C17 4.6 16.4 4 15.67 4zM11 20v-5.5H9L13 7v5.5h2L11 20z"/></g>
+<g id="battery-full"><path d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v15.33C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V5.33C17 4.6 16.4 4 15.67 4z"/></g>
+<g id="battery-std"><path d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v15.33C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V5.33C17 4.6 16.4 4 15.67 4z"/></g>
+<g id="battery-unknown"><path d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v15.33C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V5.33C17 4.6 16.4 4 15.67 4zm-2.72 13.95h-1.9v-1.9h1.9v1.9zm1.35-5.26s-.38.42-.67.71c-.48.48-.83 1.15-.83 1.6h-1.6c0-.83.46-1.52.93-2l.93-.94c.27-.27.44-.65.44-1.06 0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5H9c0-1.66 1.34-3 3-3s3 1.34 3 3c0 .66-.27 1.26-.7 1.69z"/></g>
+<g id="bluetooth"><path d="M17.71 7.71L12 2h-1v7.59L6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 11 14.41V22h1l5.71-5.71-4.3-4.29 4.3-4.29zM13 5.83l1.88 1.88L13 9.59V5.83zm1.88 10.46L13 18.17v-3.76l1.88 1.88z"/></g>
+<g id="bluetooth-connected"><path d="M7 12l-2-2-2 2 2 2 2-2zm10.71-4.29L12 2h-1v7.59L6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 11 14.41V22h1l5.71-5.71-4.3-4.29 4.3-4.29zM13 5.83l1.88 1.88L13 9.59V5.83zm1.88 10.46L13 18.17v-3.76l1.88 1.88zM19 10l-2 2 2 2 2-2-2-2z"/></g>
+<g id="bluetooth-disabled"><path d="M13 5.83l1.88 1.88-1.6 1.6 1.41 1.41 3.02-3.02L12 2h-1v5.03l2 2v-3.2zM5.41 4L4 5.41 10.59 12 5 17.59 6.41 19 11 14.41V22h1l4.29-4.29 2.3 2.29L20 18.59 5.41 4zM13 18.17v-3.76l1.88 1.88L13 18.17z"/></g>
+<g id="bluetooth-searching"><path d="M14.24 12.01l2.32 2.32c.28-.72.44-1.51.44-2.33 0-.82-.16-1.59-.43-2.31l-2.33 2.32zm5.29-5.3l-1.26 1.26c.63 1.21.98 2.57.98 4.02s-.36 2.82-.98 4.02l1.2 1.2c.97-1.54 1.54-3.36 1.54-5.31-.01-1.89-.55-3.67-1.48-5.19zm-3.82 1L10 2H9v7.59L4.41 5 3 6.41 8.59 12 3 17.59 4.41 19 9 14.41V22h1l5.71-5.71-4.3-4.29 4.3-4.29zM11 5.83l1.88 1.88L11 9.59V5.83zm1.88 10.46L11 18.17v-3.76l1.88 1.88z"/></g>
+<g id="brightness-auto"><path d="M10.85 12.65h2.3L12 9l-1.15 3.65zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12 20 8.69zM14.3 16l-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9h-1.9z"/></g>
+<g id="brightness-high"><path d="M20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12 20 8.69zM12 18c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6zm0-10c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4z"/></g>
+<g id="brightness-low"><path d="M20 15.31L23.31 12 20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69zM12 18c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6z"/></g>
+<g id="brightness-medium"><path d="M20 15.31L23.31 12 20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69zM12 18V6c3.31 0 6 2.69 6 6s-2.69 6-6 6z"/></g>
+<g id="data-usage"><path d="M13 2.05v3.03c3.39.49 6 3.39 6 6.92 0 .9-.18 1.75-.48 2.54l2.6 1.53c.56-1.24.88-2.62.88-4.07 0-5.18-3.95-9.45-9-9.95zM12 19c-3.87 0-7-3.13-7-7 0-3.53 2.61-6.43 6-6.92V2.05c-5.06.5-9 4.76-9 9.95 0 5.52 4.47 10 9.99 10 3.31 0 6.24-1.61 8.06-4.09l-2.6-1.53C16.17 17.98 14.21 19 12 19z"/></g>
+<g id="developer-mode"><path d="M7 5h10v2h2V3c0-1.1-.9-1.99-2-1.99L7 1c-1.1 0-2 .9-2 2v4h2V5zm8.41 11.59L20 12l-4.59-4.59L14 8.83 17.17 12 14 15.17l1.41 1.42zM10 15.17L6.83 12 10 8.83 8.59 7.41 4 12l4.59 4.59L10 15.17zM17 19H7v-2H5v4c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2v-4h-2v2z"/></g>
+<g id="devices"><path d="M4 6h18V4H4c-1.1 0-2 .9-2 2v11H0v3h14v-3H4V6zm19 2h-6c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h6c.55 0 1-.45 1-1V9c0-.55-.45-1-1-1zm-1 9h-4v-7h4v7z"/></g>
+<g id="dvr"><path d="M21 3H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.1-.9-2-2-2zm0 14H3V5h18v12zm-2-9H8v2h11V8zm0 4H8v2h11v-2zM7 8H5v2h2V8zm0 4H5v2h2v-2z"/></g>
+<g id="gps-fixed"><path d="M12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm8.94 3c-.46-4.17-3.77-7.48-7.94-7.94V1h-2v2.06C6.83 3.52 3.52 6.83 3.06 11H1v2h2.06c.46 4.17 3.77 7.48 7.94 7.94V23h2v-2.06c4.17-.46 7.48-3.77 7.94-7.94H23v-2h-2.06zM12 19c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"/></g>
+<g id="gps-not-fixed"><path d="M20.94 11c-.46-4.17-3.77-7.48-7.94-7.94V1h-2v2.06C6.83 3.52 3.52 6.83 3.06 11H1v2h2.06c.46 4.17 3.77 7.48 7.94 7.94V23h2v-2.06c4.17-.46 7.48-3.77 7.94-7.94H23v-2h-2.06zM12 19c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"/></g>
+<g id="gps-off"><path d="M20.94 11c-.46-4.17-3.77-7.48-7.94-7.94V1h-2v2.06c-1.13.12-2.19.46-3.16.97l1.5 1.5C10.16 5.19 11.06 5 12 5c3.87 0 7 3.13 7 7 0 .94-.19 1.84-.52 2.65l1.5 1.5c.5-.96.84-2.02.97-3.15H23v-2h-2.06zM3 4.27l2.04 2.04C3.97 7.62 3.25 9.23 3.06 11H1v2h2.06c.46 4.17 3.77 7.48 7.94 7.94V23h2v-2.06c1.77-.2 3.38-.91 4.69-1.98L19.73 21 21 19.73 4.27 3 3 4.27zm13.27 13.27C15.09 18.45 13.61 19 12 19c-3.87 0-7-3.13-7-7 0-1.61.55-3.09 1.46-4.27l9.81 9.81z"/></g>
+<g id="graphic-eq"><path d="M7 18h2V6H7v12zm4 4h2V2h-2v20zm-8-8h2v-4H3v4zm12 4h2V6h-2v12zm4-8v4h2v-4h-2z"/></g>
+<g id="location-disabled"><path d="M20.94 11c-.46-4.17-3.77-7.48-7.94-7.94V1h-2v2.06c-1.13.12-2.19.46-3.16.97l1.5 1.5C10.16 5.19 11.06 5 12 5c3.87 0 7 3.13 7 7 0 .94-.19 1.84-.52 2.65l1.5 1.5c.5-.96.84-2.02.97-3.15H23v-2h-2.06zM3 4.27l2.04 2.04C3.97 7.62 3.25 9.23 3.06 11H1v2h2.06c.46 4.17 3.77 7.48 7.94 7.94V23h2v-2.06c1.77-.2 3.38-.91 4.69-1.98L19.73 21 21 19.73 4.27 3 3 4.27zm13.27 13.27C15.09 18.45 13.61 19 12 19c-3.87 0-7-3.13-7-7 0-1.61.55-3.09 1.46-4.27l9.81 9.81z"/></g>
+<g id="location-searching"><path d="M20.94 11c-.46-4.17-3.77-7.48-7.94-7.94V1h-2v2.06C6.83 3.52 3.52 6.83 3.06 11H1v2h2.06c.46 4.17 3.77 7.48 7.94 7.94V23h2v-2.06c4.17-.46 7.48-3.77 7.94-7.94H23v-2h-2.06zM12 19c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"/></g>
+<g id="network-cell"><path fill-opacity=".3" d="M2 22h20V2z"/><path d="M17 7L2 22h15z"/></g>
+<g id="network-wifi"><path fill-opacity=".3" d="M12.01 21.49L23.64 7c-.45-.34-4.93-4-11.64-4C5.28 3 .81 6.66.36 7l11.63 14.49.01.01.01-.01z"/><path d="M3.53 10.95l8.46 10.54.01.01.01-.01 8.46-10.54C20.04 10.62 16.81 8 12 8c-4.81 0-8.04 2.62-8.47 2.95z"/></g>
+<g id="nfc"><path d="M20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 18H4V4h16v16zM18 6h-5c-1.1 0-2 .9-2 2v2.28c-.6.35-1 .98-1 1.72 0 1.1.9 2 2 2s2-.9 2-2c0-.74-.4-1.38-1-1.72V8h3v8H8V8h2V6H6v12h12V6z"/></g>
+<g id="screen-lock-landscape"><path d="M21 5H3c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm-2 12H5V7h14v10zm-9-1h4c.55 0 1-.45 1-1v-3c0-.55-.45-1-1-1v-1c0-1.11-.9-2-2-2-1.11 0-2 .9-2 2v1c-.55 0-1 .45-1 1v3c0 .55.45 1 1 1zm.8-6c0-.66.54-1.2 1.2-1.2.66 0 1.2.54 1.2 1.2v1h-2.4v-1z"/></g>
+<g id="screen-lock-portrait"><path d="M10 16h4c.55 0 1-.45 1-1v-3c0-.55-.45-1-1-1v-1c0-1.11-.9-2-2-2-1.11 0-2 .9-2 2v1c-.55 0-1 .45-1 1v3c0 .55.45 1 1 1zm.8-6c0-.66.54-1.2 1.2-1.2.66 0 1.2.54 1.2 1.2v1h-2.4v-1zM17 1H7c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 18H7V5h10v14z"/></g>
+<g id="screen-lock-rotation"><path d="M23.25 12.77l-2.57-2.57-1.41 1.41 2.22 2.22-5.66 5.66L4.51 8.17l5.66-5.66 2.1 2.1 1.41-1.41L11.23.75c-.59-.59-1.54-.59-2.12 0L2.75 7.11c-.59.59-.59 1.54 0 2.12l12.02 12.02c.59.59 1.54.59 2.12 0l6.36-6.36c.59-.59.59-1.54 0-2.12zM8.47 20.48C5.2 18.94 2.86 15.76 2.5 12H1c.51 6.16 5.66 11 11.95 11l.66-.03-3.81-3.82-1.33 1.33zM16 9h5c.55 0 1-.45 1-1V4c0-.55-.45-1-1-1v-.5C21 1.12 19.88 0 18.5 0S16 1.12 16 2.5V3c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1zm.8-6.5c0-.94.76-1.7 1.7-1.7s1.7.76 1.7 1.7V3h-3.4v-.5z"/></g>
+<g id="screen-rotation"><path d="M16.48 2.52c3.27 1.55 5.61 4.72 5.97 8.48h1.5C23.44 4.84 18.29 0 12 0l-.66.03 3.81 3.81 1.33-1.32zm-6.25-.77c-.59-.59-1.54-.59-2.12 0L1.75 8.11c-.59.59-.59 1.54 0 2.12l12.02 12.02c.59.59 1.54.59 2.12 0l6.36-6.36c.59-.59.59-1.54 0-2.12L10.23 1.75zm4.6 19.44L2.81 9.17l6.36-6.36 12.02 12.02-6.36 6.36zm-7.31.29C4.25 19.94 1.91 16.76 1.55 13H.05C.56 19.16 5.71 24 12 24l.66-.03-3.81-3.81-1.33 1.32z"/></g>
+<g id="sd-storage"><path d="M18 2h-8L4.02 8 4 20c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-6 6h-2V4h2v4zm3 0h-2V4h2v4zm3 0h-2V4h2v4z"/></g>
+<g id="settings-system-daydream"><path d="M9 16h6.5c1.38 0 2.5-1.12 2.5-2.5S16.88 11 15.5 11h-.05c-.24-1.69-1.69-3-3.45-3-1.4 0-2.6.83-3.16 2.02h-.16C7.17 10.18 6 11.45 6 13c0 1.66 1.34 3 3 3zM21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16.01H3V4.99h18v14.02z"/></g>
+<g id="signal-cellular-0-bar"><path fill-opacity=".3" d="M2 22h20V2z"/></g>
+<g id="signal-cellular-1-bar"><path fill-opacity=".3" d="M2 22h20V2z"/><path d="M12 12L2 22h10z"/></g>
+<g id="signal-cellular-2-bar"><path fill-opacity=".3" d="M2 22h20V2z"/><path d="M14 10L2 22h12z"/></g>
+<g id="signal-cellular-3-bar"><path fill-opacity=".3" d="M2 22h20V2z"/><path d="M17 7L2 22h15z"/></g>
+<g id="signal-cellular-4-bar"><path d="M2 22h20V2z"/></g>
+<g id="signal-cellular-connected-no-internet-0-bar"><path fill-opacity=".3" d="M22 8V2L2 22h16V8z"/><path d="M20 22h2v-2h-2v2zm0-12v8h2v-8h-2z"/></g>
+<g id="signal-cellular-connected-no-internet-1-bar"><path fill-opacity=".3" d="M22 8V2L2 22h16V8z"/><path d="M20 10v8h2v-8h-2zm-8 12V12L2 22h10zm8 0h2v-2h-2v2z"/></g>
+<g id="signal-cellular-connected-no-internet-2-bar"><path fill-opacity=".3" d="M22 8V2L2 22h16V8z"/><path d="M14 22V10L2 22h12zm6-12v8h2v-8h-2zm0 12h2v-2h-2v2z"/></g>
+<g id="signal-cellular-connected-no-internet-3-bar"><path fill-opacity=".3" d="M22 8V2L2 22h16V8z"/><path d="M17 22V7L2 22h15zm3-12v8h2v-8h-2zm0 12h2v-2h-2v2z"/></g>
+<g id="signal-cellular-connected-no-internet-4-bar"><path d="M20 18h2v-8h-2v8zm0 4h2v-2h-2v2zM2 22h16V8h4V2L2 22z"/></g>
+<g id="signal-cellular-no-sim"><path d="M18.99 5c0-1.1-.89-2-1.99-2h-7L7.66 5.34 19 16.68 18.99 5zM3.65 3.88L2.38 5.15 5 7.77V19c0 1.1.9 2 2 2h10.01c.35 0 .67-.1.96-.26l1.88 1.88 1.27-1.27L3.65 3.88z"/></g>
+<g id="signal-cellular-null"><path d="M20 6.83V20H6.83L20 6.83M22 2L2 22h20V2z"/></g>
+<g id="signal-cellular-off"><path d="M21 1l-8.59 8.59L21 18.18V1zM4.77 4.5L3.5 5.77l6.36 6.36L1 21h17.73l2 2L22 21.73 4.77 4.5z"/></g>
+<g id="signal-wifi-0-bar"><path fill-opacity=".3" d="M12.01 21.49L23.64 7c-.45-.34-4.93-4-11.64-4C5.28 3 .81 6.66.36 7l11.63 14.49.01.01.01-.01z"/></g>
+<g id="signal-wifi-1-bar"><path fill-opacity=".3" d="M12.01 21.49L23.64 7c-.45-.34-4.93-4-11.64-4C5.28 3 .81 6.66.36 7l11.63 14.49.01.01.01-.01z"/><path d="M6.67 14.86L12 21.49v.01l.01-.01 5.33-6.63C17.06 14.65 15.03 13 12 13s-5.06 1.65-5.33 1.86z"/></g>
+<g id="signal-wifi-1-bar-lock"><path d="M23 16v-1.5c0-1.4-1.1-2.5-2.5-2.5S18 13.1 18 14.5V16c-.5 0-1 .5-1 1v4c0 .5.5 1 1 1h5c.5 0 1-.5 1-1v-4c0-.5-.5-1-1-1zm-1 0h-3v-1.5c0-.8.7-1.5 1.5-1.5s1.5.7 1.5 1.5V16z"/><path d="M15.5 14.5c0-2.8 2.2-5 5-5 .4 0 .7 0 1 .1L23.6 7c-.4-.3-4.9-4-11.6-4C5.3 3 .8 6.7.4 7L12 21.5l3.5-4.3v-2.7z" opacity=".3"/><path d="M6.7 14.9l5.3 6.6 3.5-4.3v-2.6c0-.2 0-.5.1-.7-.9-.5-2.2-.9-3.6-.9-3 0-5.1 1.7-5.3 1.9z"/></g>
+<g id="signal-wifi-2-bar"><path fill-opacity=".3" d="M12.01 21.49L23.64 7c-.45-.34-4.93-4-11.64-4C5.28 3 .81 6.66.36 7l11.63 14.49.01.01.01-.01z"/><path d="M4.79 12.52l7.2 8.98H12l.01-.01 7.2-8.98C18.85 12.24 16.1 10 12 10s-6.85 2.24-7.21 2.52z"/></g>
+<g id="signal-wifi-2-bar-lock"><path d="M23 16v-1.5c0-1.4-1.1-2.5-2.5-2.5S18 13.1 18 14.5V16c-.5 0-1 .5-1 1v4c0 .5.5 1 1 1h5c.5 0 1-.5 1-1v-4c0-.5-.5-1-1-1zm-1 0h-3v-1.5c0-.8.7-1.5 1.5-1.5s1.5.7 1.5 1.5V16z"/><path d="M15.5 14.5c0-2.8 2.2-5 5-5 .4 0 .7 0 1 .1L23.6 7c-.4-.3-4.9-4-11.6-4C5.3 3 .8 6.7.4 7L12 21.5l3.5-4.3v-2.7z" opacity=".3"/><path d="M4.8 12.5l7.2 9 3.5-4.4v-2.6c0-1.3.5-2.5 1.4-3.4C15.6 10.5 14 10 12 10c-4.1 0-6.8 2.2-7.2 2.5z"/></g>
+<g id="signal-wifi-3-bar"><path fill-opacity=".3" d="M12.01 21.49L23.64 7c-.45-.34-4.93-4-11.64-4C5.28 3 .81 6.66.36 7l11.63 14.49.01.01.01-.01z"/><path d="M3.53 10.95l8.46 10.54.01.01.01-.01 8.46-10.54C20.04 10.62 16.81 8 12 8c-4.81 0-8.04 2.62-8.47 2.95z"/></g>
+<g id="signal-wifi-3-bar-lock"><path opacity=".3" d="M12 3C5.3 3 .8 6.7.4 7l3.2 3.9L12 21.5l3.5-4.3v-2.6c0-2.2 1.4-4 3.3-4.7.3-.1.5-.2.8-.2.3-.1.6-.1.9-.1.4 0 .7 0 1 .1L23.6 7c-.4-.3-4.9-4-11.6-4z"/><path d="M23 16v-1.5c0-1.4-1.1-2.5-2.5-2.5S18 13.1 18 14.5V16c-.5 0-1 .5-1 1v4c0 .5.5 1 1 1h5c.5 0 1-.5 1-1v-4c0-.5-.5-1-1-1zm-1 0h-3v-1.5c0-.8.7-1.5 1.5-1.5s1.5.7 1.5 1.5V16zm-10 5.5l3.5-4.3v-2.6c0-2.2 1.4-4 3.3-4.7C17.3 9 14.9 8 12 8c-4.8 0-8 2.6-8.5 2.9"/></g>
+<g id="signal-wifi-4-bar"><path d="M12.01 21.49L23.64 7c-.45-.34-4.93-4-11.64-4C5.28 3 .81 6.66.36 7l11.63 14.49.01.01.01-.01z"/></g>
+<g id="signal-wifi-4-bar-lock"><path d="M23 16v-1.5c0-1.4-1.1-2.5-2.5-2.5S18 13.1 18 14.5V16c-.5 0-1 .5-1 1v4c0 .5.5 1 1 1h5c.5 0 1-.5 1-1v-4c0-.5-.5-1-1-1zm-1 0h-3v-1.5c0-.8.7-1.5 1.5-1.5s1.5.7 1.5 1.5V16zm-6.5-1.5c0-2.8 2.2-5 5-5 .4 0 .7 0 1 .1L23.6 7c-.4-.3-4.9-4-11.6-4C5.3 3 .8 6.7.4 7L12 21.5l3.5-4.4v-2.6z"/></g>
+<g id="signal-wifi-off"><path d="M23.64 7c-.45-.34-4.93-4-11.64-4-1.5 0-2.89.19-4.15.48L18.18 13.8 23.64 7zm-6.6 8.22L3.27 1.44 2 2.72l2.05 2.06C1.91 5.76.59 6.82.36 7l11.63 14.49.01.01.01-.01 3.9-4.86 3.32 3.32 1.27-1.27-3.46-3.46z"/></g>
+<g id="storage"><path d="M2 20h20v-4H2v4zm2-3h2v2H4v-2zM2 4v4h20V4H2zm4 3H4V5h2v2zm-4 7h20v-4H2v4zm2-3h2v2H4v-2z"/></g>
+<g id="usb"><path d="M15 7v4h1v2h-3V5h2l-3-4-3 4h2v8H8v-2.07c.7-.37 1.2-1.08 1.2-1.93 0-1.21-.99-2.2-2.2-2.2-1.21 0-2.2.99-2.2 2.2 0 .85.5 1.56 1.2 1.93V13c0 1.11.89 2 2 2h3v3.05c-.71.37-1.2 1.1-1.2 1.95 0 1.22.99 2.2 2.2 2.2 1.21 0 2.2-.98 2.2-2.2 0-.85-.49-1.58-1.2-1.95V15h3c1.11 0 2-.89 2-2v-2h1V7h-4z"/></g>
+<g id="wallpaper"><path d="M4 4h7V2H4c-1.1 0-2 .9-2 2v7h2V4zm6 9l-4 5h12l-3-4-2.03 2.71L10 13zm7-4.5c0-.83-.67-1.5-1.5-1.5S14 7.67 14 8.5s.67 1.5 1.5 1.5S17 9.33 17 8.5zM20 2h-7v2h7v7h2V4c0-1.1-.9-2-2-2zm0 18h-7v2h7c1.1 0 2-.9 2-2v-7h-2v7zM4 13H2v7c0 1.1.9 2 2 2h7v-2H4v-7z"/></g>
+<g id="widgets"><path d="M13 13v8h8v-8h-8zM3 21h8v-8H3v8zM3 3v8h8V3H3zm13.66-1.31L11 7.34 16.66 13l5.66-5.66-5.66-5.65z"/></g>
+<g id="wifi-lock"><path d="M20.5 9.5c.28 0 .55.04.81.08L24 6c-3.34-2.51-7.5-4-12-4S3.34 3.49 0 6l12 16 3.5-4.67V14.5c0-2.76 2.24-5 5-5zM23 16v-1.5c0-1.38-1.12-2.5-2.5-2.5S18 13.12 18 14.5V16c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h5c.55 0 1-.45 1-1v-4c0-.55-.45-1-1-1zm-1 0h-3v-1.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5V16z"/></g>
+<g id="wifi-tethering"><path d="M12 11c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 2c0-3.31-2.69-6-6-6s-6 2.69-6 6c0 2.22 1.21 4.15 3 5.19l1-1.74c-1.19-.7-2-1.97-2-3.45 0-2.21 1.79-4 4-4s4 1.79 4 4c0 1.48-.81 2.75-2 3.45l1 1.74c1.79-1.04 3-2.97 3-5.19zM12 3C6.48 3 2 7.48 2 13c0 3.7 2.01 6.92 4.99 8.65l1-1.73C5.61 18.53 4 15.96 4 13c0-4.42 3.58-8 8-8s8 3.58 8 8c0 2.96-1.61 5.53-4 6.92l1 1.73c2.99-1.73 5-4.95 5-8.65 0-5.52-4.48-10-10-10z"/></g>
+</defs></svg>
+</iron-iconset-svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/editor-icons.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/editor-icons.d.ts
new file mode 100644
index 00000000000..6ecc0bc5c8e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/editor-icons.d.ts
@@ -0,0 +1,13 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * editor-icons.html
+ */
+
+/// <reference path="../iron-icon/iron-icon.d.ts" />
+/// <reference path="../iron-iconset-svg/iron-iconset-svg.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/editor-icons.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/editor-icons.html
new file mode 100644
index 00000000000..bc7084db25b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/editor-icons.html
@@ -0,0 +1,84 @@
+<!--
+@license
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../iron-icon/iron-icon.html">
+<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
+<iron-iconset-svg name="editor" size="24">
+<svg><defs>
+<g id="attach-file"><path d="M16.5 6v11.5c0 2.21-1.79 4-4 4s-4-1.79-4-4V5c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5v10.5c0 .55-.45 1-1 1s-1-.45-1-1V6H10v9.5c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5V5c0-2.21-1.79-4-4-4S7 2.79 7 5v12.5c0 3.04 2.46 5.5 5.5 5.5s5.5-2.46 5.5-5.5V6h-1.5z"/></g>
+<g id="attach-money"><path d="M11.8 10.9c-2.27-.59-3-1.2-3-2.15 0-1.09 1.01-1.85 2.7-1.85 1.78 0 2.44.85 2.5 2.1h2.21c-.07-1.72-1.12-3.3-3.21-3.81V3h-3v2.16c-1.94.42-3.5 1.68-3.5 3.61 0 2.31 1.91 3.46 4.7 4.13 2.5.6 3 1.48 3 2.41 0 .69-.49 1.79-2.7 1.79-2.06 0-2.87-.92-2.98-2.1h-2.2c.12 2.19 1.76 3.42 3.68 3.83V21h3v-2.15c1.95-.37 3.5-1.5 3.5-3.55 0-2.84-2.43-3.81-4.7-4.4z"/></g>
+<g id="border-all"><path d="M3 3v18h18V3H3zm8 16H5v-6h6v6zm0-8H5V5h6v6zm8 8h-6v-6h6v6zm0-8h-6V5h6v6z"/></g>
+<g id="border-bottom"><path d="M9 11H7v2h2v-2zm4 4h-2v2h2v-2zM9 3H7v2h2V3zm4 8h-2v2h2v-2zM5 3H3v2h2V3zm8 4h-2v2h2V7zm4 4h-2v2h2v-2zm-4-8h-2v2h2V3zm4 0h-2v2h2V3zm2 10h2v-2h-2v2zm0 4h2v-2h-2v2zM5 7H3v2h2V7zm14-4v2h2V3h-2zm0 6h2V7h-2v2zM5 11H3v2h2v-2zM3 21h18v-2H3v2zm2-6H3v2h2v-2z"/></g>
+<g id="border-clear"><path d="M7 5h2V3H7v2zm0 8h2v-2H7v2zm0 8h2v-2H7v2zm4-4h2v-2h-2v2zm0 4h2v-2h-2v2zm-8 0h2v-2H3v2zm0-4h2v-2H3v2zm0-4h2v-2H3v2zm0-4h2V7H3v2zm0-4h2V3H3v2zm8 8h2v-2h-2v2zm8 4h2v-2h-2v2zm0-4h2v-2h-2v2zm0 8h2v-2h-2v2zm0-12h2V7h-2v2zm-8 0h2V7h-2v2zm8-6v2h2V3h-2zm-8 2h2V3h-2v2zm4 16h2v-2h-2v2zm0-8h2v-2h-2v2zm0-8h2V3h-2v2z"/></g>
+<g id="border-color"><path d="M17.75 7L14 3.25l-10 10V17h3.75l10-10zm2.96-2.96c.39-.39.39-1.02 0-1.41L18.37.29c-.39-.39-1.02-.39-1.41 0L15 2.25 18.75 6l1.96-1.96z"/><path fill-opacity=".36" d="M0 20h24v4H0z"/></g>
+<g id="border-horizontal"><path d="M3 21h2v-2H3v2zM5 7H3v2h2V7zM3 17h2v-2H3v2zm4 4h2v-2H7v2zM5 3H3v2h2V3zm4 0H7v2h2V3zm8 0h-2v2h2V3zm-4 4h-2v2h2V7zm0-4h-2v2h2V3zm6 14h2v-2h-2v2zm-8 4h2v-2h-2v2zm-8-8h18v-2H3v2zM19 3v2h2V3h-2zm0 6h2V7h-2v2zm-8 8h2v-2h-2v2zm4 4h2v-2h-2v2zm4 0h2v-2h-2v2z"/></g>
+<g id="border-inner"><path d="M3 21h2v-2H3v2zm4 0h2v-2H7v2zM5 7H3v2h2V7zM3 17h2v-2H3v2zM9 3H7v2h2V3zM5 3H3v2h2V3zm12 0h-2v2h2V3zm2 6h2V7h-2v2zm0-6v2h2V3h-2zm-4 18h2v-2h-2v2zM13 3h-2v8H3v2h8v8h2v-8h8v-2h-8V3zm6 18h2v-2h-2v2zm0-4h2v-2h-2v2z"/></g>
+<g id="border-left"><path d="M11 21h2v-2h-2v2zm0-4h2v-2h-2v2zm0-12h2V3h-2v2zm0 4h2V7h-2v2zm0 4h2v-2h-2v2zm-4 8h2v-2H7v2zM7 5h2V3H7v2zm0 8h2v-2H7v2zm-4 8h2V3H3v18zM19 9h2V7h-2v2zm-4 12h2v-2h-2v2zm4-4h2v-2h-2v2zm0-14v2h2V3h-2zm0 10h2v-2h-2v2zm0 8h2v-2h-2v2zm-4-8h2v-2h-2v2zm0-8h2V3h-2v2z"/></g>
+<g id="border-outer"><path d="M13 7h-2v2h2V7zm0 4h-2v2h2v-2zm4 0h-2v2h2v-2zM3 3v18h18V3H3zm16 16H5V5h14v14zm-6-4h-2v2h2v-2zm-4-4H7v2h2v-2z"/></g>
+<g id="border-right"><path d="M7 21h2v-2H7v2zM3 5h2V3H3v2zm4 0h2V3H7v2zm0 8h2v-2H7v2zm-4 8h2v-2H3v2zm8 0h2v-2h-2v2zm-8-8h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm8 8h2v-2h-2v2zm4-4h2v-2h-2v2zm4-10v18h2V3h-2zm-4 18h2v-2h-2v2zm0-16h2V3h-2v2zm-4 8h2v-2h-2v2zm0-8h2V3h-2v2zm0 4h2V7h-2v2z"/></g>
+<g id="border-style"><path d="M15 21h2v-2h-2v2zm4 0h2v-2h-2v2zM7 21h2v-2H7v2zm4 0h2v-2h-2v2zm8-4h2v-2h-2v2zm0-4h2v-2h-2v2zM3 3v18h2V5h16V3H3zm16 6h2V7h-2v2z"/></g>
+<g id="border-top"><path d="M7 21h2v-2H7v2zm0-8h2v-2H7v2zm4 0h2v-2h-2v2zm0 8h2v-2h-2v2zm-8-4h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2v-2H3v2zm0-4h2V7H3v2zm8 8h2v-2h-2v2zm8-8h2V7h-2v2zm0 4h2v-2h-2v2zM3 3v2h18V3H3zm16 14h2v-2h-2v2zm-4 4h2v-2h-2v2zM11 9h2V7h-2v2zm8 12h2v-2h-2v2zm-4-8h2v-2h-2v2z"/></g>
+<g id="border-vertical"><path d="M3 9h2V7H3v2zm0-4h2V3H3v2zm4 16h2v-2H7v2zm0-8h2v-2H7v2zm-4 0h2v-2H3v2zm0 8h2v-2H3v2zm0-4h2v-2H3v2zM7 5h2V3H7v2zm12 12h2v-2h-2v2zm-8 4h2V3h-2v18zm8 0h2v-2h-2v2zm0-8h2v-2h-2v2zm0-10v2h2V3h-2zm0 6h2V7h-2v2zm-4-4h2V3h-2v2zm0 16h2v-2h-2v2zm0-8h2v-2h-2v2z"/></g>
+<g id="bubble-chart"><circle cx="7.2" cy="14.4" r="3.2"/><circle cx="14.8" cy="18" r="2"/><circle cx="15.2" cy="8.8" r="4.8"/></g>
+<g id="drag-handle"><path d="M20 9H4v2h16V9zM4 15h16v-2H4v2z"/></g>
+<g id="format-align-center"><path d="M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z"/></g>
+<g id="format-align-justify"><path d="M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zm0-6v2h18V3H3z"/></g>
+<g id="format-align-left"><path d="M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z"/></g>
+<g id="format-align-right"><path d="M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z"/></g>
+<g id="format-bold"><path d="M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z"/></g>
+<g id="format-clear"><path d="M3.27 5L2 6.27l6.97 6.97L6.5 19h3l1.57-3.66L16.73 21 18 19.73 3.55 5.27 3.27 5zM6 5v.18L8.82 8h2.4l-.72 1.68 2.1 2.1L14.21 8H20V5H6z"/></g>
+<g id="format-color-fill"><path d="M16.56 8.94L7.62 0 6.21 1.41l2.38 2.38-5.15 5.15c-.59.59-.59 1.54 0 2.12l5.5 5.5c.29.29.68.44 1.06.44s.77-.15 1.06-.44l5.5-5.5c.59-.58.59-1.53 0-2.12zM5.21 10L10 5.21 14.79 10H5.21zM19 11.5s-2 2.17-2 3.5c0 1.1.9 2 2 2s2-.9 2-2c0-1.33-2-3.5-2-3.5z"/><path fill-opacity=".36" d="M0 20h24v4H0z"/></g>
+<g id="format-color-reset"><path d="M18 14c0-4-6-10.8-6-10.8s-1.33 1.51-2.73 3.52l8.59 8.59c.09-.42.14-.86.14-1.31zm-.88 3.12L12.5 12.5 5.27 5.27 4 6.55l3.32 3.32C6.55 11.32 6 12.79 6 14c0 3.31 2.69 6 6 6 1.52 0 2.9-.57 3.96-1.5l2.63 2.63 1.27-1.27-2.74-2.74z"/></g>
+<g id="format-color-text"><path fill-opacity=".36" d="M0 20h24v4H0z"/><path d="M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2zm-1.38 9L12 5.67 14.38 12H9.62z"/></g>
+<g id="format-indent-decrease"><path d="M11 17h10v-2H11v2zm-8-5l4 4V8l-4 4zm0 9h18v-2H3v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z"/></g>
+<g id="format-indent-increase"><path d="M3 21h18v-2H3v2zM3 8v8l4-4-4-4zm8 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z"/></g>
+<g id="format-italic"><path d="M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z"/></g>
+<g id="format-line-spacing"><path d="M6 7h2.5L5 3.5 1.5 7H4v10H1.5L5 20.5 8.5 17H6V7zm4-2v2h12V5H10zm0 14h12v-2H10v2zm0-6h12v-2H10v2z"/></g>
+<g id="format-list-bulleted"><path d="M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z"/></g>
+<g id="format-list-numbered"><path d="M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z"/></g>
+<g id="format-paint"><path d="M18 4V3c0-.55-.45-1-1-1H5c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h12c.55 0 1-.45 1-1V6h1v4H9v11c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-9h8V4h-3z"/></g>
+<g id="format-quote"><path d="M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z"/></g>
+<g id="format-shapes"><path d="M23 7V1h-6v2H7V1H1v6h2v10H1v6h6v-2h10v2h6v-6h-2V7h2zM3 3h2v2H3V3zm2 18H3v-2h2v2zm12-2H7v-2H5V7h2V5h10v2h2v10h-2v2zm4 2h-2v-2h2v2zM19 5V3h2v2h-2zm-5.27 9h-3.49l-.73 2H7.89l3.4-9h1.4l3.41 9h-1.63l-.74-2zm-3.04-1.26h2.61L12 8.91l-1.31 3.83z"/></g>
+<g id="format-size"><path d="M9 4v3h5v12h3V7h5V4H9zm-6 8h3v7h3v-7h3V9H3v3z"/></g>
+<g id="format-strikethrough"><path d="M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z"/></g>
+<g id="format-textdirection-l-to-r"><path d="M9 10v5h2V4h2v11h2V4h2V2H9C6.79 2 5 3.79 5 6s1.79 4 4 4zm12 8l-4-4v3H5v2h12v3l4-4z"/></g>
+<g id="format-textdirection-r-to-l"><path d="M10 10v5h2V4h2v11h2V4h2V2h-8C7.79 2 6 3.79 6 6s1.79 4 4 4zm-2 7v-3l-4 4 4 4v-3h12v-2H8z"/></g>
+<g id="format-underlined"><path d="M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z"/></g>
+<g id="functions"><path d="M18 4H6v2l6.5 6L6 18v2h12v-3h-7l5-5-5-5h7z"/></g>
+<g id="highlight"><path d="M6 14l3 3v5h6v-5l3-3V9H6zm5-12h2v3h-2zM3.5 5.875L4.914 4.46l2.12 2.122L5.62 7.997zm13.46.71l2.123-2.12 1.414 1.414L18.375 8z"/></g>
+<g id="insert-chart"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/></g>
+<g id="insert-comment"><path d="M20 2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4V4c0-1.1-.9-2-2-2zm-2 12H6v-2h12v2zm0-3H6V9h12v2zm0-3H6V6h12v2z"/></g>
+<g id="insert-drive-file"><path d="M6 2c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6H6zm7 7V3.5L18.5 9H13z"/></g>
+<g id="insert-emoticon"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z"/></g>
+<g id="insert-invitation"><path d="M17 12h-5v5h5v-5zM16 1v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2h-1V1h-2zm3 18H5V8h14v11z"/></g>
+<g id="insert-link"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/></g>
+<g id="insert-photo"><path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/></g>
+<g id="linear-scale"><path d="M19.5 9.5c-1.03 0-1.9.62-2.29 1.5h-2.92c-.39-.88-1.26-1.5-2.29-1.5s-1.9.62-2.29 1.5H6.79c-.39-.88-1.26-1.5-2.29-1.5C3.12 9.5 2 10.62 2 12s1.12 2.5 2.5 2.5c1.03 0 1.9-.62 2.29-1.5h2.92c.39.88 1.26 1.5 2.29 1.5s1.9-.62 2.29-1.5h2.92c.39.88 1.26 1.5 2.29 1.5 1.38 0 2.5-1.12 2.5-2.5s-1.12-2.5-2.5-2.5z"/></g>
+<g id="merge-type"><path d="M17 20.41L18.41 19 15 15.59 13.59 17 17 20.41zM7.5 8H11v5.59L5.59 19 7 20.41l6-6V8h3.5L12 3.5 7.5 8z"/></g>
+<g id="mode-comment"><path d="M21.99 4c0-1.1-.89-2-1.99-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4-.01-18z"/></g>
+<g id="mode-edit"><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"/></g>
+<g id="monetization-on"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1.41 16.09V20h-2.67v-1.93c-1.71-.36-3.16-1.46-3.27-3.4h1.96c.1 1.05.82 1.87 2.65 1.87 1.96 0 2.4-.98 2.4-1.59 0-.83-.44-1.61-2.67-2.14-2.48-.6-4.18-1.62-4.18-3.67 0-1.72 1.39-2.84 3.11-3.21V4h2.67v1.95c1.86.45 2.79 1.86 2.85 3.39H14.3c-.05-1.11-.64-1.87-2.22-1.87-1.5 0-2.4.68-2.4 1.64 0 .84.65 1.39 2.67 1.91s4.18 1.39 4.18 3.91c-.01 1.83-1.38 2.83-3.12 3.16z"/></g>
+<g id="money-off"><path d="M12.5 6.9c1.78 0 2.44.85 2.5 2.1h2.21c-.07-1.72-1.12-3.3-3.21-3.81V3h-3v2.16c-.53.12-1.03.3-1.48.54l1.47 1.47c.41-.17.91-.27 1.51-.27zM5.33 4.06L4.06 5.33 7.5 8.77c0 2.08 1.56 3.21 3.91 3.91l3.51 3.51c-.34.48-1.05.91-2.42.91-2.06 0-2.87-.92-2.98-2.1h-2.2c.12 2.19 1.76 3.42 3.68 3.83V21h3v-2.15c.96-.18 1.82-.55 2.45-1.12l2.22 2.22 1.27-1.27L5.33 4.06z"/></g>
+<g id="multiline-chart"><path d="M22 6.92l-1.41-1.41-2.85 3.21C15.68 6.4 12.83 5 9.61 5 6.72 5 4.07 6.16 2 8l1.42 1.42C5.12 7.93 7.27 7 9.61 7c2.74 0 5.09 1.26 6.77 3.24l-2.88 3.24-4-4L2 16.99l1.5 1.5 6-6.01 4 4 4.05-4.55c.75 1.35 1.25 2.9 1.44 4.55H21c-.22-2.3-.95-4.39-2.04-6.14L22 6.92z"/></g>
+<g id="pie-chart"><path d="M11 2v20c-5.07-.5-9-4.79-9-10s3.93-9.5 9-10zm2.03 0v8.99H22c-.47-4.74-4.24-8.52-8.97-8.99zm0 11.01V22c4.74-.47 8.5-4.25 8.97-8.99h-8.97z"/></g>
+<g id="pie-chart-outlined"><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zm1 2.07c3.61.45 6.48 3.33 6.93 6.93H13V4.07zM4 12c0-4.06 3.07-7.44 7-7.93v15.87c-3.93-.5-7-3.88-7-7.94zm9 7.93V13h6.93c-.45 3.61-3.32 6.48-6.93 6.93z"/></g>
+<g id="publish"><path d="M5 4v2h14V4H5zm0 10h4v6h6v-6h4l-7-7-7 7z"/></g>
+<g id="short-text"><path d="M4 9h16v2H4zm0 4h10v2H4z"/></g>
+<g id="show-chart"><path d="M3.5 18.49l6-6.01 4 4L22 6.92l-1.41-1.41-7.09 7.97-4-4L2 16.99z"/></g>
+<g id="space-bar"><path d="M18 9v4H6V9H4v6h16V9z"/></g>
+<g id="strikethrough-s"><path d="M7.24 8.75c-.26-.48-.39-1.03-.39-1.67 0-.61.13-1.16.4-1.67.26-.5.63-.93 1.11-1.29.48-.35 1.05-.63 1.7-.83.66-.19 1.39-.29 2.18-.29.81 0 1.54.11 2.21.34.66.22 1.23.54 1.69.94.47.4.83.88 1.08 1.43.25.55.38 1.15.38 1.81h-3.01c0-.31-.05-.59-.15-.85-.09-.27-.24-.49-.44-.68-.2-.19-.45-.33-.75-.44-.3-.1-.66-.16-1.06-.16-.39 0-.74.04-1.03.13-.29.09-.53.21-.72.36-.19.16-.34.34-.44.55-.1.21-.15.43-.15.66 0 .48.25.88.74 1.21.38.25.77.48 1.41.7H7.39c-.05-.08-.11-.17-.15-.25zM21 12v-2H3v2h9.62c.18.07.4.14.55.2.37.17.66.34.87.51.21.17.35.36.43.57.07.2.11.43.11.69 0 .23-.05.45-.14.66-.09.2-.23.38-.42.53-.19.15-.42.26-.71.35-.29.08-.63.13-1.01.13-.43 0-.83-.04-1.18-.13s-.66-.23-.91-.42c-.25-.19-.45-.44-.59-.75-.14-.31-.25-.76-.25-1.21H6.4c0 .55.08 1.13.24 1.58.16.45.37.85.65 1.21.28.35.6.66.98.92.37.26.78.48 1.22.65.44.17.9.3 1.38.39.48.08.96.13 1.44.13.8 0 1.53-.09 2.18-.28s1.21-.45 1.67-.79c.46-.34.82-.77 1.07-1.27s.38-1.07.38-1.71c0-.6-.1-1.14-.31-1.61-.05-.11-.11-.23-.17-.33H21z"/></g>
+<g id="text-fields"><path d="M2.5 4v3h5v12h3V7h5V4h-13zm19 5h-9v3h3v7h3v-7h3V9z"/></g>
+<g id="title"><path d="M5 4v3h5.5v12h3V7H19V4z"/></g>
+<g id="vertical-align-bottom"><path d="M16 13h-3V3h-2v10H8l4 4 4-4zM4 19v2h16v-2H4z"/></g>
+<g id="vertical-align-center"><path d="M8 19h3v4h2v-4h3l-4-4-4 4zm8-14h-3V1h-2v4H8l4 4 4-4zM4 11v2h16v-2H4z"/></g>
+<g id="vertical-align-top"><path d="M8 11h3v10h2V11h3l-4-4-4 4zM4 3v2h16V3H4z"/></g>
+<g id="wrap-text"><path d="M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3 3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"/></g>
+</defs></svg>
+</iron-iconset-svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/gen-tsd.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/gen-tsd.json
new file mode 100644
index 00000000000..2f5920a3620
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/gen-tsd.json
@@ -0,0 +1,8 @@
+{
+ "exclude": [
+ "index.html",
+ "test/**",
+ "demo/**",
+ "util/**"
+ ]
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/hardware-icons.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/hardware-icons.d.ts
new file mode 100644
index 00000000000..1ffcbe7014d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/hardware-icons.d.ts
@@ -0,0 +1,13 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * hardware-icons.html
+ */
+
+/// <reference path="../iron-icon/iron-icon.d.ts" />
+/// <reference path="../iron-iconset-svg/iron-iconset-svg.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/hardware-icons.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/hardware-icons.html
new file mode 100644
index 00000000000..3268e5adb9d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/hardware-icons.html
@@ -0,0 +1,64 @@
+<!--
+@license
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../iron-icon/iron-icon.html">
+<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
+<iron-iconset-svg name="hardware" size="24">
+<svg><defs>
+<g id="cast"><path d="M21 3H3c-1.1 0-2 .9-2 2v3h2V5h18v14h-7v2h7c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM1 18v3h3c0-1.66-1.34-3-3-3zm0-4v2c2.76 0 5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0-4v2c4.97 0 9 4.03 9 9h2c0-6.08-4.93-11-11-11z"/></g>
+<g id="cast-connected"><path d="M1 18v3h3c0-1.66-1.34-3-3-3zm0-4v2c2.76 0 5 2.24 5 5h2c0-3.87-3.13-7-7-7zm18-7H5v1.63c3.96 1.28 7.09 4.41 8.37 8.37H19V7zM1 10v2c4.97 0 9 4.03 9 9h2c0-6.08-4.93-11-11-11zm20-7H3c-1.1 0-2 .9-2 2v3h2V5h18v14h-7v2h7c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"/></g>
+<g id="computer"><path d="M20 18c1.1 0 1.99-.9 1.99-2L22 6c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2H0v2h24v-2h-4zM4 6h16v10H4V6z"/></g>
+<g id="desktop-mac"><path d="M21 2H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h7l-2 3v1h8v-1l-2-3h7c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 12H3V4h18v10z"/></g>
+<g id="desktop-windows"><path d="M21 2H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h7v2H8v2h8v-2h-2v-2h7c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H3V4h18v12z"/></g>
+<g id="developer-board"><path d="M22 9V7h-2V5c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-2h2v-2h-2v-2h2v-2h-2V9h2zm-4 10H4V5h14v14zM6 13h5v4H6zm6-6h4v3h-4zM6 7h5v5H6zm6 4h4v6h-4z"/></g>
+<g id="device-hub"><path d="M17 16l-4-4V8.82C14.16 8.4 15 7.3 15 6c0-1.66-1.34-3-3-3S9 4.34 9 6c0 1.3.84 2.4 2 2.82V12l-4 4H3v5h5v-3.05l4-4.2 4 4.2V21h5v-5h-4z"/></g>
+<g id="devices-other"><path d="M3 6h18V4H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h4v-2H3V6zm10 6H9v1.78c-.61.55-1 1.33-1 2.22s.39 1.67 1 2.22V20h4v-1.78c.61-.55 1-1.34 1-2.22s-.39-1.67-1-2.22V12zm-2 5.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zM22 8h-6c-.5 0-1 .5-1 1v10c0 .5.5 1 1 1h6c.5 0 1-.5 1-1V9c0-.5-.5-1-1-1zm-1 10h-4v-8h4v8z"/></g>
+<g id="dock"><path d="M8 23h8v-2H8v2zm8-21.99L8 1c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM16 15H8V5h8v10z"/></g>
+<g id="gamepad"><path d="M15 7.5V2H9v5.5l3 3 3-3zM7.5 9H2v6h5.5l3-3-3-3zM9 16.5V22h6v-5.5l-3-3-3 3zM16.5 9l-3 3 3 3H22V9h-5.5z"/></g>
+<g id="headset"><path d="M12 1c-4.97 0-9 4.03-9 9v7c0 1.66 1.34 3 3 3h3v-8H5v-2c0-3.87 3.13-7 7-7s7 3.13 7 7v2h-4v8h3c1.66 0 3-1.34 3-3v-7c0-4.97-4.03-9-9-9z"/></g>
+<g id="headset-mic"><path d="M12 1c-4.97 0-9 4.03-9 9v7c0 1.66 1.34 3 3 3h3v-8H5v-2c0-3.87 3.13-7 7-7s7 3.13 7 7v2h-4v8h4v1h-7v2h6c1.66 0 3-1.34 3-3V10c0-4.97-4.03-9-9-9z"/></g>
+<g id="keyboard"><path d="M20 5H4c-1.1 0-1.99.9-1.99 2L2 17c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm-9 3h2v2h-2V8zm0 3h2v2h-2v-2zM8 8h2v2H8V8zm0 3h2v2H8v-2zm-1 2H5v-2h2v2zm0-3H5V8h2v2zm9 7H8v-2h8v2zm0-4h-2v-2h2v2zm0-3h-2V8h2v2zm3 3h-2v-2h2v2zm0-3h-2V8h2v2z"/></g>
+<g id="keyboard-arrow-down"><path d="M7.41 7.84L12 12.42l4.59-4.58L18 9.25l-6 6-6-6z"/></g>
+<g id="keyboard-arrow-left"><path d="M15.41 16.09l-4.58-4.59 4.58-4.59L14 5.5l-6 6 6 6z"/></g>
+<g id="keyboard-arrow-right"><path d="M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z"/></g>
+<g id="keyboard-arrow-up"><path d="M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z"/></g>
+<g id="keyboard-backspace"><path d="M21 11H6.83l3.58-3.59L9 6l-6 6 6 6 1.41-1.41L6.83 13H21z"/></g>
+<g id="keyboard-capslock"><path d="M12 8.41L16.59 13 18 11.59l-6-6-6 6L7.41 13 12 8.41zM6 18h12v-2H6v2z"/></g>
+<g id="keyboard-hide"><path d="M20 3H4c-1.1 0-1.99.9-1.99 2L2 15c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-9 3h2v2h-2V6zm0 3h2v2h-2V9zM8 6h2v2H8V6zm0 3h2v2H8V9zm-1 2H5V9h2v2zm0-3H5V6h2v2zm9 7H8v-2h8v2zm0-4h-2V9h2v2zm0-3h-2V6h2v2zm3 3h-2V9h2v2zm0-3h-2V6h2v2zm-7 15l4-4H8l4 4z"/></g>
+<g id="keyboard-return"><path d="M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z"/></g>
+<g id="keyboard-tab"><path d="M11.59 7.41L15.17 11H1v2h14.17l-3.59 3.59L13 18l6-6-6-6-1.41 1.41zM20 6v12h2V6h-2z"/></g>
+<g id="keyboard-voice"><path d="M12 15c1.66 0 2.99-1.34 2.99-3L15 6c0-1.66-1.34-3-3-3S9 4.34 9 6v6c0 1.66 1.34 3 3 3zm5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 15 6.7 12H5c0 3.42 2.72 6.23 6 6.72V22h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z"/></g>
+<g id="laptop"><path d="M20 18c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2H0v2h24v-2h-4zM4 6h16v10H4V6z"/></g>
+<g id="laptop-chromebook"><path d="M22 18V3H2v15H0v2h24v-2h-2zm-8 0h-4v-1h4v1zm6-3H4V5h16v10z"/></g>
+<g id="laptop-mac"><path d="M20 18c1.1 0 1.99-.9 1.99-2L22 5c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v11c0 1.1.9 2 2 2H0c0 1.1.9 2 2 2h20c1.1 0 2-.9 2-2h-4zM4 5h16v11H4V5zm8 14c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z"/></g>
+<g id="laptop-windows"><path d="M20 18v-1c1.1 0 1.99-.9 1.99-2L22 5c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2v1H0v2h24v-2h-4zM4 5h16v10H4V5z"/></g>
+<g id="memory"><path d="M15 9H9v6h6V9zm-2 4h-2v-2h2v2zm8-2V9h-2V7c0-1.1-.9-2-2-2h-2V3h-2v2h-2V3H9v2H7c-1.1 0-2 .9-2 2v2H3v2h2v2H3v2h2v2c0 1.1.9 2 2 2h2v2h2v-2h2v2h2v-2h2c1.1 0 2-.9 2-2v-2h2v-2h-2v-2h2zm-4 6H7V7h10v10z"/></g>
+<g id="mouse"><path d="M13 1.07V9h7c0-4.08-3.05-7.44-7-7.93zM4 15c0 4.42 3.58 8 8 8s8-3.58 8-8v-4H4v4zm7-13.93C7.05 1.56 4 4.92 4 9h7V1.07z"/></g>
+<g id="phone-android"><path d="M16 1H8C6.34 1 5 2.34 5 4v16c0 1.66 1.34 3 3 3h8c1.66 0 3-1.34 3-3V4c0-1.66-1.34-3-3-3zm-2 20h-4v-1h4v1zm3.25-3H6.75V4h10.5v14z"/></g>
+<g id="phone-iphone"><path d="M15.5 1h-8C6.12 1 5 2.12 5 3.5v17C5 21.88 6.12 23 7.5 23h8c1.38 0 2.5-1.12 2.5-2.5v-17C18 2.12 16.88 1 15.5 1zm-4 21c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm4.5-4H7V4h9v14z"/></g>
+<g id="phonelink"><path d="M4 6h18V4H4c-1.1 0-2 .9-2 2v11H0v3h14v-3H4V6zm19 2h-6c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h6c.55 0 1-.45 1-1V9c0-.55-.45-1-1-1zm-1 9h-4v-7h4v7z"/></g>
+<g id="phonelink-off"><path d="M22 6V4H6.82l2 2H22zM1.92 1.65L.65 2.92l1.82 1.82C2.18 5.08 2 5.52 2 6v11H0v3h17.73l2.35 2.35 1.27-1.27L3.89 3.62 1.92 1.65zM4 6.27L14.73 17H4V6.27zM23 8h-6c-.55 0-1 .45-1 1v4.18l2 2V10h4v7h-2.18l3 3H23c.55 0 1-.45 1-1V9c0-.55-.45-1-1-1z"/></g>
+<g id="power-input"><path d="M2 9v2h19V9H2zm0 6h5v-2H2v2zm7 0h5v-2H9v2zm7 0h5v-2h-5v2z"/></g>
+<g id="router"><path d="M20.2 5.9l.8-.8C19.6 3.7 17.8 3 16 3s-3.6.7-5 2.1l.8.8C13 4.8 14.5 4.2 16 4.2s3 .6 4.2 1.7zm-.9.8c-.9-.9-2.1-1.4-3.3-1.4s-2.4.5-3.3 1.4l.8.8c.7-.7 1.6-1 2.5-1 .9 0 1.8.3 2.5 1l.8-.8zM19 13h-2V9h-2v4H5c-1.1 0-2 .9-2 2v4c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-4c0-1.1-.9-2-2-2zM8 18H6v-2h2v2zm3.5 0h-2v-2h2v2zm3.5 0h-2v-2h2v2z"/></g>
+<g id="scanner"><path d="M19.8 10.7L4.2 5l-.7 1.9L17.6 12H5c-1.1 0-2 .9-2 2v4c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-5.5c0-.8-.5-1.6-1.2-1.8zM7 17H5v-2h2v2zm12 0H9v-2h10v2z"/></g>
+<g id="security"><path d="M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm0 10.99h7c-.53 4.12-3.28 7.79-7 8.94V12H5V6.3l7-3.11v8.8z"/></g>
+<g id="sim-card"><path d="M19.99 4c0-1.1-.89-2-1.99-2h-8L4 8v12c0 1.1.9 2 2 2h12.01c1.1 0 1.99-.9 1.99-2l-.01-16zM9 19H7v-2h2v2zm8 0h-2v-2h2v2zm-8-4H7v-4h2v4zm4 4h-2v-4h2v4zm0-6h-2v-2h2v2zm4 2h-2v-4h2v4z"/></g>
+<g id="smartphone"><path d="M17 1.01L7 1c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM17 19H7V5h10v14z"/></g>
+<g id="speaker"><path d="M17 2H7c-1.1 0-2 .9-2 2v16c0 1.1.9 1.99 2 1.99L17 22c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-5 2c1.1 0 2 .9 2 2s-.9 2-2 2c-1.11 0-2-.9-2-2s.89-2 2-2zm0 16c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/></g>
+<g id="speaker-group"><path d="M18.2 1H9.8C8.81 1 8 1.81 8 2.8v14.4c0 .99.81 1.79 1.8 1.79l8.4.01c.99 0 1.8-.81 1.8-1.8V2.8c0-.99-.81-1.8-1.8-1.8zM14 3c1.1 0 2 .89 2 2s-.9 2-2 2-2-.89-2-2 .9-2 2-2zm0 13.5c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z"/><circle cx="14" cy="12.5" r="2.5"/><path d="M6 5H4v16c0 1.1.89 2 2 2h10v-2H6V5z"/></g>
+<g id="tablet"><path d="M21 4H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h18c1.1 0 1.99-.9 1.99-2L23 6c0-1.1-.9-2-2-2zm-2 14H5V6h14v12z"/></g>
+<g id="tablet-android"><path d="M18 0H6C4.34 0 3 1.34 3 3v18c0 1.66 1.34 3 3 3h12c1.66 0 3-1.34 3-3V3c0-1.66-1.34-3-3-3zm-4 22h-4v-1h4v1zm5.25-3H4.75V3h14.5v16z"/></g>
+<g id="tablet-mac"><path d="M18.5 0h-14C3.12 0 2 1.12 2 2.5v19C2 22.88 3.12 24 4.5 24h14c1.38 0 2.5-1.12 2.5-2.5v-19C21 1.12 19.88 0 18.5 0zm-7 23c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm7.5-4H4V3h15v16z"/></g>
+<g id="toys"><path d="M12 12c0-3 2.5-5.5 5.5-5.5S23 9 23 12H12zm0 0c0 3-2.5 5.5-5.5 5.5S1 15 1 12h11zm0 0c-3 0-5.5-2.5-5.5-5.5S9 1 12 1v11zm0 0c3 0 5.5 2.5 5.5 5.5S15 23 12 23V12z"/></g>
+<g id="tv"><path d="M21 3H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.1-.9-2-2-2zm0 14H3V5h18v12z"/></g>
+<g id="videogame-asset"><path d="M21 6H3c-1.1 0-2 .9-2 2v8c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm-10 7H8v3H6v-3H3v-2h3V8h2v3h3v2zm4.5 2c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm4-3c-.83 0-1.5-.67-1.5-1.5S18.67 9 19.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"/></g>
+<g id="watch"><path d="M20 12c0-2.54-1.19-4.81-3.04-6.27L16 0H8l-.95 5.73C5.19 7.19 4 9.45 4 12s1.19 4.81 3.05 6.27L8 24h8l.96-5.73C18.81 16.81 20 14.54 20 12zM6 12c0-3.31 2.69-6 6-6s6 2.69 6 6-2.69 6-6 6-6-2.69-6-6z"/></g>
+</defs></svg>
+</iron-iconset-svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/hero.svg b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/hero.svg
new file mode 100755
index 00000000000..167321c9422
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/hero.svg
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">
+<g id="background" display="none">
+ <rect display="inline" fill="#B0BEC5" width="225" height="126"/>
+</g>
+<g id="label">
+</g>
+<g id="art">
+ <circle cx="73" cy="24" r="4"/>
+ <path d="M82,33H64V15h18V33z M66,31h14V17H66V31z"/>
+ <circle cx="112.5" cy="24" r="4"/>
+ <circle cx="151" cy="24" r="4"/>
+ <path d="M121,33h-18V15h18V33z M105,31h14V17h-14V31z"/>
+ <path d="M160,33h-18V15h18V33z M144,31h14V17h-14V31z"/>
+ <circle cx="73" cy="62" r="4"/>
+ <path d="M82,71H64V53h18V71z M66,69h14V55H66V69z"/>
+ <circle cx="112.5" cy="62" r="4"/>
+ <path d="M121,71h-18V53h18V71z M105,69h14V55h-14V69z"/>
+ <circle cx="151" cy="62" r="4"/>
+ <path d="M160,71h-18V53h18V71z M144,69h14V55h-14V69z"/>
+ <circle cx="73" cy="102" r="4"/>
+ <path d="M82,111H64V93h18V111z M66,109h14V95H66V109z"/>
+ <circle cx="112.5" cy="102" r="4"/>
+ <path d="M121,111h-18V93h18V111z M105,109h14V95h-14V109z"/>
+ <circle cx="151" cy="102" r="4"/>
+ <path d="M160,111h-18V93h18V111z M144,109h14V95h-14V109z"/>
+ <g id="ic_x5F_add_x0D_">
+ </g>
+</g>
+<g id="Guides">
+</g>
+</svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/image-icons.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/image-icons.d.ts
new file mode 100644
index 00000000000..2d14c7634a9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/image-icons.d.ts
@@ -0,0 +1,13 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * image-icons.html
+ */
+
+/// <reference path="../iron-icon/iron-icon.d.ts" />
+/// <reference path="../iron-iconset-svg/iron-iconset-svg.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/image-icons.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/image-icons.html
new file mode 100644
index 00000000000..bb1a4da3d2b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/image-icons.html
@@ -0,0 +1,171 @@
+<!--
+@license
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../iron-icon/iron-icon.html">
+<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
+<iron-iconset-svg name="image" size="24">
+<svg><defs>
+<g id="add-a-photo"><path d="M3 4V1h2v3h3v2H5v3H3V6H0V4h3zm3 6V7h3V4h7l1.83 2H21c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H5c-1.1 0-2-.9-2-2V10h3zm7 9c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-3.2-5c0 1.77 1.43 3.2 3.2 3.2s3.2-1.43 3.2-3.2-1.43-3.2-3.2-3.2-3.2 1.43-3.2 3.2z"/></g>
+<g id="add-to-photos"><path d="M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 9h-4v4h-2v-4H9V9h4V5h2v4h4v2z"/></g>
+<g id="adjust"><path d="M12 2C6.49 2 2 6.49 2 12s4.49 10 10 10 10-4.49 10-10S17.51 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm3-8c0 1.66-1.34 3-3 3s-3-1.34-3-3 1.34-3 3-3 3 1.34 3 3z"/></g>
+<g id="assistant"><path d="M19 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h4l3 3 3-3h4c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-5.12 10.88L12 17l-1.88-4.12L6 11l4.12-1.88L12 5l1.88 4.12L18 11l-4.12 1.88z"/></g>
+<g id="assistant-photo"><path d="M14.4 6L14 4H5v17h2v-7h5.6l.4 2h7V6z"/></g>
+<g id="audiotrack"><path d="M12 3v9.28c-.47-.17-.97-.28-1.5-.28C8.01 12 6 14.01 6 16.5S8.01 21 10.5 21c2.31 0 4.2-1.75 4.45-4H15V6h4V3h-7z"/></g>
+<g id="blur-circular"><path d="M10 9c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0 4c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zM7 9.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm3 7c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-3-3c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm3-6c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zM14 9c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0-1.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm3 6c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm0-4c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm2-3.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm0-3.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1z"/></g>
+<g id="blur-linear"><path d="M5 17.5c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zM9 13c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0-4c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zM3 21h18v-2H3v2zM5 9.5c.83 0 1.5-.67 1.5-1.5S5.83 6.5 5 6.5 3.5 7.17 3.5 8 4.17 9.5 5 9.5zm0 4c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zM9 17c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm8-.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zM3 3v2h18V3H3zm14 5.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm0 4c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zM13 9c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0 4c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0 4c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1z"/></g>
+<g id="blur-off"><path d="M14 7c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm-.2 4.48l.2.02c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5l.02.2c.09.67.61 1.19 1.28 1.28zM14 3.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm-4 0c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm11 7c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zM10 7c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm8 8c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0-4c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0-4c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm-4 13.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zM2.5 5.27l3.78 3.78L6 9c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1c0-.1-.03-.19-.06-.28l2.81 2.81c-.71.11-1.25.73-1.25 1.47 0 .83.67 1.5 1.5 1.5.74 0 1.36-.54 1.47-1.25l2.81 2.81c-.09-.03-.18-.06-.28-.06-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1c0-.1-.03-.19-.06-.28l3.78 3.78L20 20.23 3.77 4 2.5 5.27zM10 17c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm11-3.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zM6 13c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zM3 9.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm7 11c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zM6 17c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm-3-3.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5z"/></g>
+<g id="blur-on"><path d="M6 13c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0 4c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0-8c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm-3 .5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zM6 5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm15 5.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zM14 7c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0-3.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm-11 10c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm7 7c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm0-17c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zM10 7c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0 5.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm8 .5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0 4c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0-8c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0-4c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm3 8.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zM14 17c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0 3.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-4-12c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0 8.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm4-4.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-4c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5z"/></g>
+<g id="brightness-1"><circle cx="12" cy="12" r="10"/></g>
+<g id="brightness-2"><path d="M10 2c-1.82 0-3.53.5-5 1.35C7.99 5.08 10 8.3 10 12s-2.01 6.92-5 8.65C6.47 21.5 8.18 22 10 22c5.52 0 10-4.48 10-10S15.52 2 10 2z"/></g>
+<g id="brightness-3"><path d="M9 2c-1.05 0-2.05.16-3 .46 4.06 1.27 7 5.06 7 9.54 0 4.48-2.94 8.27-7 9.54.95.3 1.95.46 3 .46 5.52 0 10-4.48 10-10S14.52 2 9 2z"/></g>
+<g id="brightness-4"><path d="M20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12 20 8.69zM12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6c3.31 0 6 2.69 6 6s-2.69 6-6 6z"/></g>
+<g id="brightness-5"><path d="M20 15.31L23.31 12 20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69zM12 18c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6z"/></g>
+<g id="brightness-6"><path d="M20 15.31L23.31 12 20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69zM12 18V6c3.31 0 6 2.69 6 6s-2.69 6-6 6z"/></g>
+<g id="brightness-7"><path d="M20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12 20 8.69zM12 18c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6zm0-10c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4z"/></g>
+<g id="broken-image"><path d="M21 5v6.59l-3-3.01-4 4.01-4-4-4 4-3-3.01V5c0-1.1.9-2 2-2h14c1.1 0 2 .9 2 2zm-3 6.42l3 3.01V19c0 1.1-.9 2-2 2H5c-1.1 0-2-.9-2-2v-6.58l3 2.99 4-4 4 4 4-3.99z"/></g>
+<g id="brush"><path d="M7 14c-1.66 0-3 1.34-3 3 0 1.31-1.16 2-2 2 .92 1.22 2.49 2 4 2 2.21 0 4-1.79 4-4 0-1.66-1.34-3-3-3zm13.71-9.37l-1.34-1.34c-.39-.39-1.02-.39-1.41 0L9 12.25 11.75 15l8.96-8.96c.39-.39.39-1.02 0-1.41z"/></g>
+<g id="burst-mode"><path d="M1 5h2v14H1zm4 0h2v14H5zm17 0H10c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h12c.55 0 1-.45 1-1V6c0-.55-.45-1-1-1zM11 17l2.5-3.15L15.29 16l2.5-3.22L21 17H11z"/></g>
+<g id="camera"><path d="M9.4 10.5l4.77-8.26C13.47 2.09 12.75 2 12 2c-2.4 0-4.6.85-6.32 2.25l3.66 6.35.06-.1zM21.54 9c-.92-2.92-3.15-5.26-6-6.34L11.88 9h9.66zm.26 1h-7.49l.29.5 4.76 8.25C21 16.97 22 14.61 22 12c0-.69-.07-1.35-.2-2zM8.54 12l-3.9-6.75C3.01 7.03 2 9.39 2 12c0 .69.07 1.35.2 2h7.49l-1.15-2zm-6.08 3c.92 2.92 3.15 5.26 6 6.34L12.12 15H2.46zm11.27 0l-3.9 6.76c.7.15 1.42.24 2.17.24 2.4 0 4.6-.85 6.32-2.25l-3.66-6.35-.93 1.6z"/></g>
+<g id="camera-alt"><circle cx="12" cy="12" r="3.2"/><path d="M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"/></g>
+<g id="camera-front"><path d="M10 20H5v2h5v2l3-3-3-3v2zm4 0v2h5v-2h-5zM12 8c1.1 0 2-.9 2-2s-.9-2-2-2-1.99.9-1.99 2S10.9 8 12 8zm5-8H7C5.9 0 5 .9 5 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V2c0-1.1-.9-2-2-2zM7 2h10v10.5c0-1.67-3.33-2.5-5-2.5s-5 .83-5 2.5V2z"/></g>
+<g id="camera-rear"><path d="M10 20H5v2h5v2l3-3-3-3v2zm4 0v2h5v-2h-5zm3-20H7C5.9 0 5 .9 5 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V2c0-1.1-.9-2-2-2zm-5 6c-1.11 0-2-.9-2-2s.89-2 1.99-2 2 .9 2 2C14 5.1 13.1 6 12 6z"/></g>
+<g id="camera-roll"><path d="M14 5c0-1.1-.9-2-2-2h-1V2c0-.55-.45-1-1-1H6c-.55 0-1 .45-1 1v1H4c-1.1 0-2 .9-2 2v15c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2h8V5h-8zm-2 13h-2v-2h2v2zm0-9h-2V7h2v2zm4 9h-2v-2h2v2zm0-9h-2V7h2v2zm4 9h-2v-2h2v2zm0-9h-2V7h2v2z"/></g>
+<g id="center-focus-strong"><path d="M12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm-7 7H3v4c0 1.1.9 2 2 2h4v-2H5v-4zM5 5h4V3H5c-1.1 0-2 .9-2 2v4h2V5zm14-2h-4v2h4v4h2V5c0-1.1-.9-2-2-2zm0 16h-4v2h4c1.1 0 2-.9 2-2v-4h-2v4z"/></g>
+<g id="center-focus-weak"><path d="M5 15H3v4c0 1.1.9 2 2 2h4v-2H5v-4zM5 5h4V3H5c-1.1 0-2 .9-2 2v4h2V5zm14-2h-4v2h4v4h2V5c0-1.1-.9-2-2-2zm0 16h-4v2h4c1.1 0 2-.9 2-2v-4h-2v4zM12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z"/></g>
+<g id="collections"><path d="M22 16V4c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zm-11-4l2.03 2.71L16 11l4 5H8l3-4zM2 6v14c0 1.1.9 2 2 2h14v-2H4V6H2z"/></g>
+<g id="collections-bookmark"><path d="M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 10l-2.5-1.5L15 12V4h5v8z"/></g>
+<g id="color-lens"><path d="M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"/></g>
+<g id="colorize"><path d="M20.71 5.63l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-3.12 3.12-1.93-1.91-1.41 1.41 1.42 1.42L3 16.25V21h4.75l8.92-8.92 1.42 1.42 1.41-1.41-1.92-1.92 3.12-3.12c.4-.4.4-1.03.01-1.42zM6.92 19L5 17.08l8.06-8.06 1.92 1.92L6.92 19z"/></g>
+<g id="compare"><path d="M10 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h5v2h2V1h-2v2zm0 15H5l5-6v6zm9-15h-5v2h5v13l-5-6v9h5c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"/></g>
+<g id="control-point"><path d="M13 7h-2v4H7v2h4v4h2v-4h4v-2h-4V7zm-1-5C6.49 2 2 6.49 2 12s4.49 10 10 10 10-4.49 10-10S17.51 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></g>
+<g id="control-point-duplicate"><path d="M16 8h-2v3h-3v2h3v3h2v-3h3v-2h-3zM2 12c0-2.79 1.64-5.2 4.01-6.32V3.52C2.52 4.76 0 8.09 0 12s2.52 7.24 6.01 8.48v-2.16C3.64 17.2 2 14.79 2 12zm13-9c-4.96 0-9 4.04-9 9s4.04 9 9 9 9-4.04 9-9-4.04-9-9-9zm0 16c-3.86 0-7-3.14-7-7s3.14-7 7-7 7 3.14 7 7-3.14 7-7 7z"/></g>
+<g id="crop"><path d="M17 15h2V7c0-1.1-.9-2-2-2H9v2h8v8zM7 17V1H5v4H1v2h4v10c0 1.1.9 2 2 2h10v4h2v-4h4v-2H7z"/></g>
+<g id="crop-16-9"><path d="M19 6H5c-1.1 0-2 .9-2 2v8c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm0 10H5V8h14v8z"/></g>
+<g id="crop-3-2"><path d="M19 4H5c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 14H5V6h14v12z"/></g>
+<g id="crop-5-4"><path d="M19 5H5c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 12H5V7h14v10z"/></g>
+<g id="crop-7-5"><path d="M19 7H5c-1.1 0-2 .9-2 2v6c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V9c0-1.1-.9-2-2-2zm0 8H5V9h14v6z"/></g>
+<g id="crop-din"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V5h14v14z"/></g>
+<g id="crop-free"><path d="M3 5v4h2V5h4V3H5c-1.1 0-2 .9-2 2zm2 10H3v4c0 1.1.9 2 2 2h4v-2H5v-4zm14 4h-4v2h4c1.1 0 2-.9 2-2v-4h-2v4zm0-16h-4v2h4v4h2V5c0-1.1-.9-2-2-2z"/></g>
+<g id="crop-landscape"><path d="M19 5H5c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 12H5V7h14v10z"/></g>
+<g id="crop-original"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V5h14v14zm-5.04-6.71l-2.75 3.54-1.96-2.36L6.5 17h11l-3.54-4.71z"/></g>
+<g id="crop-portrait"><path d="M17 3H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H7V5h10v14z"/></g>
+<g id="crop-rotate"><path d="M7.47 21.49C4.2 19.93 1.86 16.76 1.5 13H0c.51 6.16 5.66 11 11.95 11 .23 0 .44-.02.66-.03L8.8 20.15l-1.33 1.34zM12.05 0c-.23 0-.44.02-.66.04l3.81 3.81 1.33-1.33C19.8 4.07 22.14 7.24 22.5 11H24c-.51-6.16-5.66-11-11.95-11zM16 14h2V8c0-1.11-.9-2-2-2h-6v2h6v6zm-8 2V4H6v2H4v2h2v8c0 1.1.89 2 2 2h8v2h2v-2h2v-2H8z"/></g>
+<g id="crop-square"><path d="M18 4H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 14H6V6h12v12z"/></g>
+<g id="dehaze"><path d="M2 15.5v2h20v-2H2zm0-5v2h20v-2H2zm0-5v2h20v-2H2z"/></g>
+<g id="details"><path d="M3 4l9 16 9-16H3zm3.38 2h11.25L12 16 6.38 6z"/></g>
+<g id="edit"><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"/></g>
+<g id="exposure"><path d="M15 17v2h2v-2h2v-2h-2v-2h-2v2h-2v2h2zm5-15H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM5 5h6v2H5V5zm15 15H4L20 4v16z"/></g>
+<g id="exposure-neg-1"><path d="M4 11v2h8v-2H4zm15 7h-2V7.38L14 8.4V6.7L18.7 5h.3v13z"/></g>
+<g id="exposure-neg-2"><path d="M15.05 16.29l2.86-3.07c.38-.39.72-.79 1.04-1.18.32-.39.59-.78.82-1.17.23-.39.41-.78.54-1.17s.19-.79.19-1.18c0-.53-.09-1.02-.27-1.46-.18-.44-.44-.81-.78-1.11-.34-.31-.77-.54-1.26-.71-.51-.16-1.08-.24-1.72-.24-.69 0-1.31.11-1.85.32-.54.21-1 .51-1.36.88-.37.37-.65.8-.84 1.3-.18.47-.27.97-.28 1.5h2.14c.01-.31.05-.6.13-.87.09-.29.23-.54.4-.75.18-.21.41-.37.68-.49.27-.12.6-.18.96-.18.31 0 .58.05.81.15.23.1.43.25.59.43.16.18.28.4.37.65.08.25.13.52.13.81 0 .22-.03.43-.08.65-.06.22-.15.45-.29.7-.14.25-.32.53-.56.83-.23.3-.52.65-.88 1.03l-4.17 4.55V18H21v-1.71h-5.95zM2 11v2h8v-2H2z"/></g>
+<g id="exposure-plus-1"><path d="M10 7H8v4H4v2h4v4h2v-4h4v-2h-4V7zm10 11h-2V7.38L15 8.4V6.7L19.7 5h.3v13z"/></g>
+<g id="exposure-plus-2"><path d="M16.05 16.29l2.86-3.07c.38-.39.72-.79 1.04-1.18.32-.39.59-.78.82-1.17.23-.39.41-.78.54-1.17.13-.39.19-.79.19-1.18 0-.53-.09-1.02-.27-1.46-.18-.44-.44-.81-.78-1.11-.34-.31-.77-.54-1.26-.71-.51-.16-1.08-.24-1.72-.24-.69 0-1.31.11-1.85.32-.54.21-1 .51-1.36.88-.37.37-.65.8-.84 1.3-.18.47-.27.97-.28 1.5h2.14c.01-.31.05-.6.13-.87.09-.29.23-.54.4-.75.18-.21.41-.37.68-.49.27-.12.6-.18.96-.18.31 0 .58.05.81.15.23.1.43.25.59.43.16.18.28.4.37.65.08.25.13.52.13.81 0 .22-.03.43-.08.65-.06.22-.15.45-.29.7-.14.25-.32.53-.56.83-.23.3-.52.65-.88 1.03l-4.17 4.55V18H22v-1.71h-5.95zM8 7H6v4H2v2h4v4h2v-4h4v-2H8V7z"/></g>
+<g id="exposure-zero"><path d="M16.14 12.5c0 1-.1 1.85-.3 2.55-.2.7-.48 1.27-.83 1.7-.36.44-.79.75-1.3.95-.51.2-1.07.3-1.7.3-.62 0-1.18-.1-1.69-.3-.51-.2-.95-.51-1.31-.95-.36-.44-.65-1.01-.85-1.7-.2-.7-.3-1.55-.3-2.55v-2.04c0-1 .1-1.85.3-2.55.2-.7.48-1.26.84-1.69.36-.43.8-.74 1.31-.93C10.81 5.1 11.38 5 12 5c.63 0 1.19.1 1.7.29.51.19.95.5 1.31.93.36.43.64.99.84 1.69.2.7.3 1.54.3 2.55v2.04zm-2.11-2.36c0-.64-.05-1.18-.13-1.62-.09-.44-.22-.79-.4-1.06-.17-.27-.39-.46-.64-.58-.25-.13-.54-.19-.86-.19-.32 0-.61.06-.86.18s-.47.31-.64.58c-.17.27-.31.62-.4 1.06s-.13.98-.13 1.62v2.67c0 .64.05 1.18.14 1.62.09.45.23.81.4 1.09s.39.48.64.61.54.19.87.19c.33 0 .62-.06.87-.19s.46-.33.63-.61c.17-.28.3-.64.39-1.09.09-.45.13-.99.13-1.62v-2.66z"/></g>
+<g id="filter"><path d="M15.96 10.29l-2.75 3.54-1.96-2.36L8.5 15h11l-3.54-4.71zM3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm18-4H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14z"/></g>
+<g id="filter-1"><path d="M3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm11 10h2V5h-4v2h2v8zm7-14H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14z"/></g>
+<g id="filter-2"><path d="M3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm18-4H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14zm-4-4h-4v-2h2c1.1 0 2-.89 2-2V7c0-1.11-.9-2-2-2h-4v2h4v2h-2c-1.1 0-2 .89-2 2v4h6v-2z"/></g>
+<g id="filter-3"><path d="M21 1H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14zM3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm14 8v-1.5c0-.83-.67-1.5-1.5-1.5.83 0 1.5-.67 1.5-1.5V7c0-1.11-.9-2-2-2h-4v2h4v2h-2v2h2v2h-4v2h4c1.1 0 2-.89 2-2z"/></g>
+<g id="filter-4"><path d="M3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm12 10h2V5h-2v4h-2V5h-2v6h4v4zm6-14H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14z"/></g>
+<g id="filter-5"><path d="M21 1H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14zM3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm14 8v-2c0-1.11-.9-2-2-2h-2V7h4V5h-6v6h4v2h-4v2h4c1.1 0 2-.89 2-2z"/></g>
+<g id="filter-6"><path d="M3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm18-4H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14zm-8-2h2c1.1 0 2-.89 2-2v-2c0-1.11-.9-2-2-2h-2V7h4V5h-4c-1.1 0-2 .89-2 2v6c0 1.11.9 2 2 2zm0-4h2v2h-2v-2z"/></g>
+<g id="filter-7"><path d="M3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm18-4H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14zm-8-2l4-8V5h-6v2h4l-4 8h2z"/></g>
+<g id="filter-8"><path d="M3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm18-4H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14zm-8-2h2c1.1 0 2-.89 2-2v-1.5c0-.83-.67-1.5-1.5-1.5.83 0 1.5-.67 1.5-1.5V7c0-1.11-.9-2-2-2h-2c-1.1 0-2 .89-2 2v1.5c0 .83.67 1.5 1.5 1.5-.83 0-1.5.67-1.5 1.5V13c0 1.11.9 2 2 2zm0-8h2v2h-2V7zm0 4h2v2h-2v-2z"/></g>
+<g id="filter-9"><path d="M3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm18-4H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14zM15 5h-2c-1.1 0-2 .89-2 2v2c0 1.11.9 2 2 2h2v2h-4v2h4c1.1 0 2-.89 2-2V7c0-1.11-.9-2-2-2zm0 4h-2V7h2v2z"/></g>
+<g id="filter-9-plus"><path d="M3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm11 7V8c0-1.11-.9-2-2-2h-1c-1.1 0-2 .89-2 2v1c0 1.11.9 2 2 2h1v1H9v2h3c1.1 0 2-.89 2-2zm-3-3V8h1v1h-1zm10-8H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 8h-2V7h-2v2h-2v2h2v2h2v-2h2v6H7V3h14v6z"/></g>
+<g id="filter-b-and-w"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16l-7-8v8H5l7-8V5h7v14z"/></g>
+<g id="filter-center-focus"><path d="M5 15H3v4c0 1.1.9 2 2 2h4v-2H5v-4zM5 5h4V3H5c-1.1 0-2 .9-2 2v4h2V5zm14-2h-4v2h4v4h2V5c0-1.1-.9-2-2-2zm0 16h-4v2h4c1.1 0 2-.9 2-2v-4h-2v4zM12 9c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/></g>
+<g id="filter-drama"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.61 5.64 5.36 8.04 2.35 8.36 0 10.9 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM19 18H6c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4h2c0-2.76-1.86-5.08-4.4-5.78C8.61 6.88 10.2 6 12 6c3.03 0 5.5 2.47 5.5 5.5v.5H19c1.65 0 3 1.35 3 3s-1.35 3-3 3z"/></g>
+<g id="filter-frames"><path d="M20 4h-4l-4-4-4 4H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 16H4V6h4.52l3.52-3.5L15.52 6H20v14zM18 8H6v10h12"/></g>
+<g id="filter-hdr"><path d="M14 6l-3.75 5 2.85 3.8-1.6 1.2C9.81 13.75 7 10 7 10l-6 8h22L14 6z"/></g>
+<g id="filter-none"><path d="M3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm18-4H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14z"/></g>
+<g id="filter-tilt-shift"><path d="M11 4.07V2.05c-2.01.2-3.84 1-5.32 2.21L7.1 5.69c1.11-.86 2.44-1.44 3.9-1.62zm7.32.19C16.84 3.05 15.01 2.25 13 2.05v2.02c1.46.18 2.79.76 3.9 1.62l1.42-1.43zM19.93 11h2.02c-.2-2.01-1-3.84-2.21-5.32L18.31 7.1c.86 1.11 1.44 2.44 1.62 3.9zM5.69 7.1L4.26 5.68C3.05 7.16 2.25 8.99 2.05 11h2.02c.18-1.46.76-2.79 1.62-3.9zM4.07 13H2.05c.2 2.01 1 3.84 2.21 5.32l1.43-1.43c-.86-1.1-1.44-2.43-1.62-3.89zM15 12c0-1.66-1.34-3-3-3s-3 1.34-3 3 1.34 3 3 3 3-1.34 3-3zm3.31 4.9l1.43 1.43c1.21-1.48 2.01-3.32 2.21-5.32h-2.02c-.18 1.45-.76 2.78-1.62 3.89zM13 19.93v2.02c2.01-.2 3.84-1 5.32-2.21l-1.43-1.43c-1.1.86-2.43 1.44-3.89 1.62zm-7.32-.19C7.16 20.95 9 21.75 11 21.95v-2.02c-1.46-.18-2.79-.76-3.9-1.62l-1.42 1.43z"/></g>
+<g id="filter-vintage"><path d="M18.7 12.4c-.28-.16-.57-.29-.86-.4.29-.11.58-.24.86-.4 1.92-1.11 2.99-3.12 3-5.19-1.79-1.03-4.07-1.11-6 0-.28.16-.54.35-.78.54.05-.31.08-.63.08-.95 0-2.22-1.21-4.15-3-5.19C10.21 1.85 9 3.78 9 6c0 .32.03.64.08.95-.24-.2-.5-.39-.78-.55-1.92-1.11-4.2-1.03-6 0 0 2.07 1.07 4.08 3 5.19.28.16.57.29.86.4-.29.11-.58.24-.86.4-1.92 1.11-2.99 3.12-3 5.19 1.79 1.03 4.07 1.11 6 0 .28-.16.54-.35.78-.54-.05.32-.08.64-.08.96 0 2.22 1.21 4.15 3 5.19 1.79-1.04 3-2.97 3-5.19 0-.32-.03-.64-.08-.95.24.2.5.38.78.54 1.92 1.11 4.2 1.03 6 0-.01-2.07-1.08-4.08-3-5.19zM12 16c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z"/></g>
+<g id="flare"><path d="M7 11H1v2h6v-2zm2.17-3.24L7.05 5.64 5.64 7.05l2.12 2.12 1.41-1.41zM13 1h-2v6h2V1zm5.36 6.05l-1.41-1.41-2.12 2.12 1.41 1.41 2.12-2.12zM17 11v2h6v-2h-6zm-5-2c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm2.83 7.24l2.12 2.12 1.41-1.41-2.12-2.12-1.41 1.41zm-9.19.71l1.41 1.41 2.12-2.12-1.41-1.41-2.12 2.12zM11 23h2v-6h-2v6z"/></g>
+<g id="flash-auto"><path d="M3 2v12h3v9l7-12H9l4-9H3zm16 0h-2l-3.2 9h1.9l.7-2h3.2l.7 2h1.9L19 2zm-2.15 5.65L18 4l1.15 3.65h-2.3z"/></g>
+<g id="flash-off"><path d="M3.27 3L2 4.27l5 5V13h3v9l3.58-6.14L17.73 20 19 18.73 3.27 3zM17 10h-4l4-8H7v2.18l8.46 8.46L17 10z"/></g>
+<g id="flash-on"><path d="M7 2v11h3v9l7-12h-4l4-8z"/></g>
+<g id="flip"><path d="M15 21h2v-2h-2v2zm4-12h2V7h-2v2zM3 5v14c0 1.1.9 2 2 2h4v-2H5V5h4V3H5c-1.1 0-2 .9-2 2zm16-2v2h2c0-1.1-.9-2-2-2zm-8 20h2V1h-2v22zm8-6h2v-2h-2v2zM15 5h2V3h-2v2zm4 8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2z"/></g>
+<g id="gradient"><path d="M11 9h2v2h-2zm-2 2h2v2H9zm4 0h2v2h-2zm2-2h2v2h-2zM7 9h2v2H7zm12-6H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 18H7v-2h2v2zm4 0h-2v-2h2v2zm4 0h-2v-2h2v2zm2-7h-2v2h2v2h-2v-2h-2v2h-2v-2h-2v2H9v-2H7v2H5v-2h2v-2H5V5h14v6z"/></g>
+<g id="grain"><path d="M10 12c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zM6 8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12-8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm-4 8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm4-4c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-4-4c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-4-4c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></g>
+<g id="grid-off"><path d="M8 4v1.45l2 2V4h4v4h-3.45l2 2H14v1.45l2 2V10h4v4h-3.45l2 2H20v1.45l2 2V4c0-1.1-.9-2-2-2H4.55l2 2H8zm8 0h4v4h-4V4zM1.27 1.27L0 2.55l2 2V20c0 1.1.9 2 2 2h15.46l2 2 1.27-1.27L1.27 1.27zM10 12.55L11.45 14H10v-1.45zm-6-6L5.45 8H4V6.55zM8 20H4v-4h4v4zm0-6H4v-4h3.45l.55.55V14zm6 6h-4v-4h3.45l.55.54V20zm2 0v-1.46L17.46 20H16z"/></g>
+<g id="grid-on"><path d="M20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM8 20H4v-4h4v4zm0-6H4v-4h4v4zm0-6H4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4z"/></g>
+<g id="hdr-off"><path d="M17.5 15v-2h1.1l.9 2H21l-.9-2.1c.5-.2.9-.8.9-1.4v-1c0-.8-.7-1.5-1.5-1.5H16v4.9l1.1 1.1h.4zm0-4.5h2v1h-2v-1zm-4.5 0v.4l1.5 1.5v-1.9c0-.8-.7-1.5-1.5-1.5h-1.9l1.5 1.5h.4zm-3.5-1l-7-7-1.1 1L6.9 9h-.4v2h-2V9H3v6h1.5v-2.5h2V15H8v-4.9l1.5 1.5V15h3.4l7.6 7.6 1.1-1.1-12.1-12z"/></g>
+<g id="hdr-on"><path d="M21 11.5v-1c0-.8-.7-1.5-1.5-1.5H16v6h1.5v-2h1.1l.9 2H21l-.9-2.1c.5-.3.9-.8.9-1.4zm-1.5 0h-2v-1h2v1zm-13-.5h-2V9H3v6h1.5v-2.5h2V15H8V9H6.5v2zM13 9H9.5v6H13c.8 0 1.5-.7 1.5-1.5v-3c0-.8-.7-1.5-1.5-1.5zm0 4.5h-2v-3h2v3z"/></g>
+<g id="hdr-strong"><path d="M17 6c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zM5 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z"/></g>
+<g id="hdr-weak"><path d="M5 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm12-2c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm0 10c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z"/></g>
+<g id="healing"><path d="M17.73 12.02l3.98-3.98c.39-.39.39-1.02 0-1.41l-4.34-4.34c-.39-.39-1.02-.39-1.41 0l-3.98 3.98L8 2.29C7.8 2.1 7.55 2 7.29 2c-.25 0-.51.1-.7.29L2.25 6.63c-.39.39-.39 1.02 0 1.41l3.98 3.98L2.25 16c-.39.39-.39 1.02 0 1.41l4.34 4.34c.39.39 1.02.39 1.41 0l3.98-3.98 3.98 3.98c.2.2.45.29.71.29.26 0 .51-.1.71-.29l4.34-4.34c.39-.39.39-1.02 0-1.41l-3.99-3.98zM12 9c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-4.71 1.96L3.66 7.34l3.63-3.63 3.62 3.62-3.62 3.63zM10 13c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm2 2c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm2-4c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm2.66 9.34l-3.63-3.62 3.63-3.63 3.62 3.62-3.62 3.63z"/></g>
+<g id="image"><path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/></g>
+<g id="image-aspect-ratio"><path d="M16 10h-2v2h2v-2zm0 4h-2v2h2v-2zm-8-4H6v2h2v-2zm4 0h-2v2h2v-2zm8-6H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 14H4V6h16v12z"/></g>
+<g id="iso"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM5.5 7.5h2v-2H9v2h2V9H9v2H7.5V9h-2V7.5zM19 19H5L19 5v14zm-2-2v-1.5h-5V17h5z"/></g>
+<g id="landscape"><path d="M14 6l-3.75 5 2.85 3.8-1.6 1.2C9.81 13.75 7 10 7 10l-6 8h22L14 6z"/></g>
+<g id="leak-add"><path d="M6 3H3v3c1.66 0 3-1.34 3-3zm8 0h-2c0 4.97-4.03 9-9 9v2c6.08 0 11-4.93 11-11zm-4 0H8c0 2.76-2.24 5-5 5v2c3.87 0 7-3.13 7-7zm0 18h2c0-4.97 4.03-9 9-9v-2c-6.07 0-11 4.93-11 11zm8 0h3v-3c-1.66 0-3 1.34-3 3zm-4 0h2c0-2.76 2.24-5 5-5v-2c-3.87 0-7 3.13-7 7z"/></g>
+<g id="leak-remove"><path d="M10 3H8c0 .37-.04.72-.12 1.06l1.59 1.59C9.81 4.84 10 3.94 10 3zM3 4.27l2.84 2.84C5.03 7.67 4.06 8 3 8v2c1.61 0 3.09-.55 4.27-1.46L8.7 9.97C7.14 11.24 5.16 12 3 12v2c2.71 0 5.19-.99 7.11-2.62l2.5 2.5C10.99 15.81 10 18.29 10 21h2c0-2.16.76-4.14 2.03-5.69l1.43 1.43C14.55 17.91 14 19.39 14 21h2c0-1.06.33-2.03.89-2.84L19.73 21 21 19.73 4.27 3 3 4.27zM14 3h-2c0 1.5-.37 2.91-1.02 4.16l1.46 1.46C13.42 6.98 14 5.06 14 3zm5.94 13.12c.34-.08.69-.12 1.06-.12v-2c-.94 0-1.84.19-2.66.52l1.6 1.6zm-4.56-4.56l1.46 1.46C18.09 12.37 19.5 12 21 12v-2c-2.06 0-3.98.58-5.62 1.56z"/></g>
+<g id="lens"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2z"/></g>
+<g id="linked-camera"><circle cx="12" cy="14" r="3.2"/><path d="M16 3.33c2.58 0 4.67 2.09 4.67 4.67H22c0-3.31-2.69-6-6-6v1.33M16 6c1.11 0 2 .89 2 2h1.33c0-1.84-1.49-3.33-3.33-3.33V6"/><path d="M17 9c0-1.11-.89-2-2-2V4H9L7.17 6H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V9h-5zm-5 10c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"/></g>
+<g id="looks"><path d="M12 10c-3.86 0-7 3.14-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.86-3.14-7-7-7zm0-4C5.93 6 1 10.93 1 17h2c0-4.96 4.04-9 9-9s9 4.04 9 9h2c0-6.07-4.93-11-11-11z"/></g>
+<g id="looks-3"><path d="M19.01 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 7.5c0 .83-.67 1.5-1.5 1.5.83 0 1.5.67 1.5 1.5V15c0 1.11-.9 2-2 2h-4v-2h4v-2h-2v-2h2V9h-4V7h4c1.1 0 2 .89 2 2v1.5z"/></g>
+<g id="looks-4"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 14h-2v-4H9V7h2v4h2V7h2v10z"/></g>
+<g id="looks-5"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 6h-4v2h2c1.1 0 2 .89 2 2v2c0 1.11-.9 2-2 2H9v-2h4v-2H9V7h6v2z"/></g>
+<g id="looks-6"><path d="M11 15h2v-2h-2v2zm8-12H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 6h-4v2h2c1.1 0 2 .89 2 2v2c0 1.11-.9 2-2 2h-2c-1.1 0-2-.89-2-2V9c0-1.11.9-2 2-2h4v2z"/></g>
+<g id="looks-one"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-5 14h-2V9h-2V7h4v10z"/></g>
+<g id="looks-two"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 8c0 1.11-.9 2-2 2h-2v2h4v2H9v-4c0-1.11.9-2 2-2h2V9H9V7h4c1.1 0 2 .89 2 2v2z"/></g>
+<g id="loupe"><path d="M13 7h-2v4H7v2h4v4h2v-4h4v-2h-4V7zm-1-5C6.49 2 2 6.49 2 12s4.49 10 10 10h8c1.1 0 2-.9 2-2v-8c0-5.51-4.49-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></g>
+<g id="monochrome-photos"><path d="M20 5h-3.2L15 3H9L7.2 5H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 14h-8v-1c-2.8 0-5-2.2-5-5s2.2-5 5-5V7h8v12zm-3-6c0-2.8-2.2-5-5-5v1.8c1.8 0 3.2 1.4 3.2 3.2s-1.4 3.2-3.2 3.2V18c2.8 0 5-2.2 5-5zm-8.2 0c0 1.8 1.4 3.2 3.2 3.2V9.8c-1.8 0-3.2 1.4-3.2 3.2z"/></g>
+<g id="movie-creation"><path d="M18 4l2 4h-3l-2-4h-2l2 4h-3l-2-4H8l2 4H7L5 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4h-4z"/></g>
+<g id="movie-filter"><path d="M18 4l2 3h-3l-2-3h-2l2 3h-3l-2-3H8l2 3H7L5 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4h-4zm-6.75 11.25L10 18l-1.25-2.75L6 14l2.75-1.25L10 10l1.25 2.75L14 14l-2.75 1.25zm5.69-3.31L16 14l-.94-2.06L13 11l2.06-.94L16 8l.94 2.06L19 11l-2.06.94z"/></g>
+<g id="music-note"><path d="M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z"/></g>
+<g id="nature"><path d="M13 16.12c3.47-.41 6.17-3.36 6.17-6.95 0-3.87-3.13-7-7-7s-7 3.13-7 7c0 3.47 2.52 6.34 5.83 6.89V20H5v2h14v-2h-6v-3.88z"/></g>
+<g id="nature-people"><path d="M22.17 9.17c0-3.87-3.13-7-7-7s-7 3.13-7 7c0 3.47 2.52 6.34 5.83 6.89V20H6v-3h1v-4c0-.55-.45-1-1-1H3c-.55 0-1 .45-1 1v4h1v5h16v-2h-3v-3.88c3.47-.41 6.17-3.36 6.17-6.95zM4.5 11c.83 0 1.5-.67 1.5-1.5S5.33 8 4.5 8 3 8.67 3 9.5 3.67 11 4.5 11z"/></g>
+<g id="navigate-before"><path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/></g>
+<g id="navigate-next"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></g>
+<g id="palette"><path d="M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"/></g>
+<g id="panorama"><path d="M23 18V6c0-1.1-.9-2-2-2H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2zM8.5 12.5l2.5 3.01L14.5 11l4.5 6H5l3.5-4.5z"/></g>
+<g id="panorama-fish-eye"><path d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></g>
+<g id="panorama-horizontal"><path d="M20 6.54v10.91c-2.6-.77-5.28-1.16-8-1.16-2.72 0-5.4.39-8 1.16V6.54c2.6.77 5.28 1.16 8 1.16 2.72.01 5.4-.38 8-1.16M21.43 4c-.1 0-.2.02-.31.06C18.18 5.16 15.09 5.7 12 5.7c-3.09 0-6.18-.55-9.12-1.64-.11-.04-.22-.06-.31-.06-.34 0-.57.23-.57.63v14.75c0 .39.23.62.57.62.1 0 .2-.02.31-.06 2.94-1.1 6.03-1.64 9.12-1.64 3.09 0 6.18.55 9.12 1.64.11.04.21.06.31.06.33 0 .57-.23.57-.63V4.63c0-.4-.24-.63-.57-.63z"/></g>
+<g id="panorama-vertical"><path d="M19.94 21.12c-1.1-2.94-1.64-6.03-1.64-9.12 0-3.09.55-6.18 1.64-9.12.04-.11.06-.22.06-.31 0-.34-.23-.57-.63-.57H4.63c-.4 0-.63.23-.63.57 0 .1.02.2.06.31C5.16 5.82 5.71 8.91 5.71 12c0 3.09-.55 6.18-1.64 9.12-.05.11-.07.22-.07.31 0 .33.23.57.63.57h14.75c.39 0 .63-.24.63-.57-.01-.1-.03-.2-.07-.31zM6.54 20c.77-2.6 1.16-5.28 1.16-8 0-2.72-.39-5.4-1.16-8h10.91c-.77 2.6-1.16 5.28-1.16 8 0 2.72.39 5.4 1.16 8H6.54z"/></g>
+<g id="panorama-wide-angle"><path d="M12 6c2.45 0 4.71.2 7.29.64.47 1.78.71 3.58.71 5.36 0 1.78-.24 3.58-.71 5.36-2.58.44-4.84.64-7.29.64s-4.71-.2-7.29-.64C4.24 15.58 4 13.78 4 12c0-1.78.24-3.58.71-5.36C7.29 6.2 9.55 6 12 6m0-2c-2.73 0-5.22.24-7.95.72l-.93.16-.25.9C2.29 7.85 2 9.93 2 12s.29 4.15.87 6.22l.25.89.93.16c2.73.49 5.22.73 7.95.73s5.22-.24 7.95-.72l.93-.16.25-.89c.58-2.08.87-4.16.87-6.23s-.29-4.15-.87-6.22l-.25-.89-.93-.16C17.22 4.24 14.73 4 12 4z"/></g>
+<g id="photo"><path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/></g>
+<g id="photo-album"><path d="M18 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM6 4h5v8l-2.5-1.5L6 12V4zm0 15l3-3.86 2.14 2.58 3-3.86L18 19H6z"/></g>
+<g id="photo-camera"><circle cx="12" cy="12" r="3.2"/><path d="M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"/></g>
+<g id="photo-filter"><path d="M19.02 10v9H5V5h9V3H5.02c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-9h-2zM17 10l.94-2.06L20 7l-2.06-.94L17 4l-.94 2.06L14 7l2.06.94zm-3.75.75L12 8l-1.25 2.75L8 12l2.75 1.25L12 16l1.25-2.75L16 12z"/></g>
+<g id="photo-library"><path d="M22 16V4c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zm-11-4l2.03 2.71L16 11l4 5H8l3-4zM2 6v14c0 1.1.9 2 2 2h14v-2H4V6H2z"/></g>
+<g id="photo-size-select-actual"><path d="M21 3H3C2 3 1 4 1 5v14c0 1.1.9 2 2 2h18c1 0 2-1 2-2V5c0-1-1-2-2-2zM5 17l3.5-4.5 2.5 3.01L14.5 11l4.5 6H5z"/></g>
+<g id="photo-size-select-large"><path d="M21 15h2v2h-2v-2zm0-4h2v2h-2v-2zm2 8h-2v2c1 0 2-1 2-2zM13 3h2v2h-2V3zm8 4h2v2h-2V7zm0-4v2h2c0-1-1-2-2-2zM1 7h2v2H1V7zm16-4h2v2h-2V3zm0 16h2v2h-2v-2zM3 3C2 3 1 4 1 5h2V3zm6 0h2v2H9V3zM5 3h2v2H5V3zm-4 8v8c0 1.1.9 2 2 2h12V11H1zm2 8l2.5-3.21 1.79 2.15 2.5-3.22L13 19H3z"/></g>
+<g id="photo-size-select-small"><path d="M23 15h-2v2h2v-2zm0-4h-2v2h2v-2zm0 8h-2v2c1 0 2-1 2-2zM15 3h-2v2h2V3zm8 4h-2v2h2V7zm-2-4v2h2c0-1-1-2-2-2zM3 21h8v-6H1v4c0 1.1.9 2 2 2zM3 7H1v2h2V7zm12 12h-2v2h2v-2zm4-16h-2v2h2V3zm0 16h-2v2h2v-2zM3 3C2 3 1 4 1 5h2V3zm0 8H1v2h2v-2zm8-8H9v2h2V3zM7 3H5v2h2V3z"/></g>
+<g id="picture-as-pdf"><path d="M20 2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-8.5 7.5c0 .83-.67 1.5-1.5 1.5H9v2H7.5V7H10c.83 0 1.5.67 1.5 1.5v1zm5 2c0 .83-.67 1.5-1.5 1.5h-2.5V7H15c.83 0 1.5.67 1.5 1.5v3zm4-3H19v1h1.5V11H19v2h-1.5V7h3v1.5zM9 9.5h1v-1H9v1zM4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm10 5.5h1v-3h-1v3z"/></g>
+<g id="portrait"><path d="M12 12.25c1.24 0 2.25-1.01 2.25-2.25S13.24 7.75 12 7.75 9.75 8.76 9.75 10s1.01 2.25 2.25 2.25zm4.5 4c0-1.5-3-2.25-4.5-2.25s-4.5.75-4.5 2.25V17h9v-.75zM19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V5h14v14z"/></g>
+<g id="remove-red-eye"><path d="M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/></g>
+<g id="rotate-90-degrees-ccw"><path d="M7.34 6.41L.86 12.9l6.49 6.48 6.49-6.48-6.5-6.49zM3.69 12.9l3.66-3.66L11 12.9l-3.66 3.66-3.65-3.66zm15.67-6.26C17.61 4.88 15.3 4 13 4V.76L8.76 5 13 9.24V6c1.79 0 3.58.68 4.95 2.05 2.73 2.73 2.73 7.17 0 9.9C16.58 19.32 14.79 20 13 20c-.97 0-1.94-.21-2.84-.61l-1.49 1.49C10.02 21.62 11.51 22 13 22c2.3 0 4.61-.88 6.36-2.64 3.52-3.51 3.52-9.21 0-12.72z"/></g>
+<g id="rotate-left"><path d="M7.11 8.53L5.7 7.11C4.8 8.27 4.24 9.61 4.07 11h2.02c.14-.87.49-1.72 1.02-2.47zM6.09 13H4.07c.17 1.39.72 2.73 1.62 3.89l1.41-1.42c-.52-.75-.87-1.59-1.01-2.47zm1.01 5.32c1.16.9 2.51 1.44 3.9 1.61V17.9c-.87-.15-1.71-.49-2.46-1.03L7.1 18.32zM13 4.07V1L8.45 5.55 13 10V6.09c2.84.48 5 2.94 5 5.91s-2.16 5.43-5 5.91v2.02c3.95-.49 7-3.85 7-7.93s-3.05-7.44-7-7.93z"/></g>
+<g id="rotate-right"><path d="M15.55 5.55L11 1v3.07C7.06 4.56 4 7.92 4 12s3.05 7.44 7 7.93v-2.02c-2.84-.48-5-2.94-5-5.91s2.16-5.43 5-5.91V10l4.55-4.45zM19.93 11c-.17-1.39-.72-2.73-1.62-3.89l-1.42 1.42c.54.75.88 1.6 1.02 2.47h2.02zM13 17.9v2.02c1.39-.17 2.74-.71 3.9-1.61l-1.44-1.44c-.75.54-1.59.89-2.46 1.03zm3.89-2.42l1.42 1.41c.9-1.16 1.45-2.5 1.62-3.89h-2.02c-.14.87-.48 1.72-1.02 2.48z"/></g>
+<g id="slideshow"><path d="M10 8v8l5-4-5-4zm9-5H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V5h14v14z"/></g>
+<g id="straighten"><path d="M21 6H3c-1.1 0-2 .9-2 2v8c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm0 10H3V8h2v4h2V8h2v4h2V8h2v4h2V8h2v4h2V8h2v8z"/></g>
+<g id="style"><path d="M2.53 19.65l1.34.56v-9.03l-2.43 5.86c-.41 1.02.08 2.19 1.09 2.61zm19.5-3.7L17.07 3.98c-.31-.75-1.04-1.21-1.81-1.23-.26 0-.53.04-.79.15L7.1 5.95c-.75.31-1.21 1.03-1.23 1.8-.01.27.04.54.15.8l4.96 11.97c.31.76 1.05 1.22 1.83 1.23.26 0 .52-.05.77-.15l7.36-3.05c1.02-.42 1.51-1.59 1.09-2.6zM7.88 8.75c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-2 11c0 1.1.9 2 2 2h1.45l-3.45-8.34v6.34z"/></g>
+<g id="switch-camera"><path d="M20 4h-3.17L15 2H9L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-5 11.5V13H9v2.5L5.5 12 9 8.5V11h6V8.5l3.5 3.5-3.5 3.5z"/></g>
+<g id="switch-video"><path d="M18 9.5V6c0-.55-.45-1-1-1H3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h14c.55 0 1-.45 1-1v-3.5l4 4v-13l-4 4zm-5 6V13H7v2.5L3.5 12 7 8.5V11h6V8.5l3.5 3.5-3.5 3.5z"/></g>
+<g id="tag-faces"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z"/></g>
+<g id="texture"><path d="M19.51 3.08L3.08 19.51c.09.34.27.65.51.9.25.24.56.42.9.51L20.93 4.49c-.19-.69-.73-1.23-1.42-1.41zM11.88 3L3 11.88v2.83L14.71 3h-2.83zM5 3c-1.1 0-2 .9-2 2v2l4-4H5zm14 18c.55 0 1.05-.22 1.41-.59.37-.36.59-.86.59-1.41v-2l-4 4h2zm-9.71 0h2.83L21 12.12V9.29L9.29 21z"/></g>
+<g id="timelapse"><path d="M16.24 7.76C15.07 6.59 13.54 6 12 6v6l-4.24 4.24c2.34 2.34 6.14 2.34 8.49 0 2.34-2.34 2.34-6.14-.01-8.48zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"/></g>
+<g id="timer"><path d="M15 1H9v2h6V1zm-4 13h2V8h-2v6zm8.03-6.61l1.42-1.42c-.43-.51-.9-.99-1.41-1.41l-1.42 1.42C16.07 4.74 14.12 4 12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9 9-4.03 9-9c0-2.12-.74-4.07-1.97-5.61zM12 20c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"/></g>
+<g id="timer-10"><path d="M0 7.72V9.4l3-1V18h2V6h-.25L0 7.72zm23.78 6.65c-.14-.28-.35-.53-.63-.74-.28-.21-.61-.39-1.01-.53s-.85-.27-1.35-.38c-.35-.07-.64-.15-.87-.23-.23-.08-.41-.16-.55-.25-.14-.09-.23-.19-.28-.3-.05-.11-.08-.24-.08-.39 0-.14.03-.28.09-.41.06-.13.15-.25.27-.34.12-.1.27-.18.45-.24s.4-.09.64-.09c.25 0 .47.04.66.11.19.07.35.17.48.29.13.12.22.26.29.42.06.16.1.32.1.49h1.95c0-.39-.08-.75-.24-1.09-.16-.34-.39-.63-.69-.88-.3-.25-.66-.44-1.09-.59C21.49 9.07 21 9 20.46 9c-.51 0-.98.07-1.39.21-.41.14-.77.33-1.06.57-.29.24-.51.52-.67.84-.16.32-.23.65-.23 1.01s.08.69.23.96c.15.28.36.52.64.73.27.21.6.38.98.53.38.14.81.26 1.27.36.39.08.71.17.95.26s.43.19.57.29c.13.1.22.22.27.34.05.12.07.25.07.39 0 .32-.13.57-.4.77-.27.2-.66.29-1.17.29-.22 0-.43-.02-.64-.08-.21-.05-.4-.13-.56-.24-.17-.11-.3-.26-.41-.44-.11-.18-.17-.41-.18-.67h-1.89c0 .36.08.71.24 1.05.16.34.39.65.7.93.31.27.69.49 1.15.66.46.17.98.25 1.58.25.53 0 1.01-.06 1.44-.19.43-.13.8-.31 1.11-.54.31-.23.54-.51.71-.83.17-.32.25-.67.25-1.06-.02-.4-.09-.74-.24-1.02zm-9.96-7.32c-.34-.4-.75-.7-1.23-.88-.47-.18-1.01-.27-1.59-.27-.58 0-1.11.09-1.59.27-.48.18-.89.47-1.23.88-.34.41-.6.93-.79 1.59-.18.65-.28 1.45-.28 2.39v1.92c0 .94.09 1.74.28 2.39.19.66.45 1.19.8 1.6.34.41.75.71 1.23.89.48.18 1.01.28 1.59.28.59 0 1.12-.09 1.59-.28.48-.18.88-.48 1.22-.89.34-.41.6-.94.78-1.6.18-.65.28-1.45.28-2.39v-1.92c0-.94-.09-1.74-.28-2.39-.18-.66-.44-1.19-.78-1.59zm-.92 6.17c0 .6-.04 1.11-.12 1.53-.08.42-.2.76-.36 1.02-.16.26-.36.45-.59.57-.23.12-.51.18-.82.18-.3 0-.58-.06-.82-.18s-.44-.31-.6-.57c-.16-.26-.29-.6-.38-1.02-.09-.42-.13-.93-.13-1.53v-2.5c0-.6.04-1.11.13-1.52.09-.41.21-.74.38-1 .16-.25.36-.43.6-.55.24-.11.51-.17.81-.17.31 0 .58.06.81.17.24.11.44.29.6.55.16.25.29.58.37.99.08.41.13.92.13 1.52v2.51z"/></g>
+<g id="timer-3"><path d="M11.61 12.97c-.16-.24-.36-.46-.62-.65-.25-.19-.56-.35-.93-.48.3-.14.57-.3.8-.5.23-.2.42-.41.57-.64.15-.23.27-.46.34-.71.08-.24.11-.49.11-.73 0-.55-.09-1.04-.28-1.46-.18-.42-.44-.77-.78-1.06-.33-.28-.73-.5-1.2-.64-.45-.13-.97-.2-1.53-.2-.55 0-1.06.08-1.52.24-.47.17-.87.4-1.2.69-.33.29-.6.63-.78 1.03-.2.39-.29.83-.29 1.29h1.98c0-.26.05-.49.14-.69.09-.2.22-.38.38-.52.17-.14.36-.25.58-.33.22-.08.46-.12.73-.12.61 0 1.06.16 1.36.47.3.31.44.75.44 1.32 0 .27-.04.52-.12.74-.08.22-.21.41-.38.57-.17.16-.38.28-.63.37-.25.09-.55.13-.89.13H6.72v1.57H7.9c.34 0 .64.04.91.11.27.08.5.19.69.35.19.16.34.36.44.61.1.24.16.54.16.87 0 .62-.18 1.09-.53 1.42-.35.33-.84.49-1.45.49-.29 0-.56-.04-.8-.13-.24-.08-.44-.2-.61-.36-.17-.16-.3-.34-.39-.56-.09-.22-.14-.46-.14-.72H4.19c0 .55.11 1.03.32 1.45.21.42.5.77.86 1.05s.77.49 1.24.63.96.21 1.48.21c.57 0 1.09-.08 1.58-.23.49-.15.91-.38 1.26-.68.36-.3.64-.66.84-1.1.2-.43.3-.93.3-1.48 0-.29-.04-.58-.11-.86-.08-.25-.19-.51-.35-.76zm9.26 1.4c-.14-.28-.35-.53-.63-.74-.28-.21-.61-.39-1.01-.53s-.85-.27-1.35-.38c-.35-.07-.64-.15-.87-.23-.23-.08-.41-.16-.55-.25-.14-.09-.23-.19-.28-.3-.05-.11-.08-.24-.08-.39s.03-.28.09-.41c.06-.13.15-.25.27-.34.12-.1.27-.18.45-.24s.4-.09.64-.09c.25 0 .47.04.66.11.19.07.35.17.48.29.13.12.22.26.29.42.06.16.1.32.1.49h1.95c0-.39-.08-.75-.24-1.09-.16-.34-.39-.63-.69-.88-.3-.25-.66-.44-1.09-.59-.43-.15-.92-.22-1.46-.22-.51 0-.98.07-1.39.21-.41.14-.77.33-1.06.57-.29.24-.51.52-.67.84-.16.32-.23.65-.23 1.01s.08.68.23.96c.15.28.37.52.64.73.27.21.6.38.98.53.38.14.81.26 1.27.36.39.08.71.17.95.26s.43.19.57.29c.13.1.22.22.27.34.05.12.07.25.07.39 0 .32-.13.57-.4.77-.27.2-.66.29-1.17.29-.22 0-.43-.02-.64-.08-.21-.05-.4-.13-.56-.24-.17-.11-.3-.26-.41-.44-.11-.18-.17-.41-.18-.67h-1.89c0 .36.08.71.24 1.05.16.34.39.65.7.93.31.27.69.49 1.15.66.46.17.98.25 1.58.25.53 0 1.01-.06 1.44-.19.43-.13.8-.31 1.11-.54.31-.23.54-.51.71-.83.17-.32.25-.67.25-1.06-.02-.4-.09-.74-.24-1.02z"/></g>
+<g id="timer-off"><path d="M19.04 4.55l-1.42 1.42C16.07 4.74 14.12 4 12 4c-1.83 0-3.53.55-4.95 1.48l1.46 1.46C9.53 6.35 10.73 6 12 6c3.87 0 7 3.13 7 7 0 1.27-.35 2.47-.94 3.49l1.45 1.45C20.45 16.53 21 14.83 21 13c0-2.12-.74-4.07-1.97-5.61l1.42-1.42-1.41-1.42zM15 1H9v2h6V1zm-4 8.44l2 2V8h-2v1.44zM3.02 4L1.75 5.27 4.5 8.03C3.55 9.45 3 11.16 3 13c0 4.97 4.02 9 9 9 1.84 0 3.55-.55 4.98-1.5l2.5 2.5 1.27-1.27-7.71-7.71L3.02 4zM12 20c-3.87 0-7-3.13-7-7 0-1.28.35-2.48.95-3.52l9.56 9.56c-1.03.61-2.23.96-3.51.96z"/></g>
+<g id="tonality"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.94-.49-7-3.85-7-7.93s3.05-7.44 7-7.93v15.86zm2-15.86c1.03.13 2 .45 2.87.93H13v-.93zM13 7h5.24c.25.31.48.65.68 1H13V7zm0 3h6.74c.08.33.15.66.19 1H13v-1zm0 9.93V19h2.87c-.87.48-1.84.8-2.87.93zM18.24 17H13v-1h5.92c-.2.35-.43.69-.68 1zm1.5-3H13v-1h6.93c-.04.34-.11.67-.19 1z"/></g>
+<g id="transform"><path d="M22 18v-2H8V4h2L7 1 4 4h2v2H2v2h4v8c0 1.1.9 2 2 2h8v2h-2l3 3 3-3h-2v-2h4zM10 8h6v6h2V8c0-1.1-.9-2-2-2h-6v2z"/></g>
+<g id="tune"><path d="M3 17v2h6v-2H3zM3 5v2h10V5H3zm10 16v-2h8v-2h-8v-2h-2v6h2zM7 9v2H3v2h4v2h2V9H7zm14 4v-2H11v2h10zm-6-4h2V7h4V5h-4V3h-2v6z"/></g>
+<g id="view-comfy"><path d="M3 9h4V5H3v4zm0 5h4v-4H3v4zm5 0h4v-4H8v4zm5 0h4v-4h-4v4zM8 9h4V5H8v4zm5-4v4h4V5h-4zm5 9h4v-4h-4v4zM3 19h4v-4H3v4zm5 0h4v-4H8v4zm5 0h4v-4h-4v4zm5 0h4v-4h-4v4zm0-14v4h4V5h-4z"/></g>
+<g id="view-compact"><path d="M3 19h6v-7H3v7zm7 0h12v-7H10v7zM3 5v6h19V5H3z"/></g>
+<g id="vignette"><path d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-9 15c-4.42 0-8-2.69-8-6s3.58-6 8-6 8 2.69 8 6-3.58 6-8 6z"/></g>
+<g id="wb-auto"><path d="M6.85 12.65h2.3L8 9l-1.15 3.65zM22 7l-1.2 6.29L19.3 7h-1.6l-1.49 6.29L15 7h-.76C12.77 5.17 10.53 4 8 4c-4.42 0-8 3.58-8 8s3.58 8 8 8c3.13 0 5.84-1.81 7.15-4.43l.1.43H17l1.5-6.1L20 16h1.75l2.05-9H22zm-11.7 9l-.7-2H6.4l-.7 2H3.8L7 7h2l3.2 9h-1.9z"/></g>
+<g id="wb-cloudy"><path d="M19.36 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.64-4.96z"/></g>
+<g id="wb-incandescent"><path d="M3.55 18.54l1.41 1.41 1.79-1.8-1.41-1.41-1.79 1.8zM11 22.45h2V19.5h-2v2.95zM4 10.5H1v2h3v-2zm11-4.19V1.5H9v4.81C7.21 7.35 6 9.28 6 11.5c0 3.31 2.69 6 6 6s6-2.69 6-6c0-2.22-1.21-4.15-3-5.19zm5 4.19v2h3v-2h-3zm-2.76 7.66l1.79 1.8 1.41-1.41-1.8-1.79-1.4 1.4z"/></g>
+<g id="wb-iridescent"><path d="M5 14.5h14v-6H5v6zM11 .55V3.5h2V.55h-2zm8.04 2.5l-1.79 1.79 1.41 1.41 1.8-1.79-1.42-1.41zM13 22.45V19.5h-2v2.95h2zm7.45-3.91l-1.8-1.79-1.41 1.41 1.79 1.8 1.42-1.42zM3.55 4.46l1.79 1.79 1.41-1.41-1.79-1.79-1.41 1.41zm1.41 15.49l1.79-1.8-1.41-1.41-1.79 1.79 1.41 1.42z"/></g>
+<g id="wb-sunny"><path d="M6.76 4.84l-1.8-1.79-1.41 1.41 1.79 1.79 1.42-1.41zM4 10.5H1v2h3v-2zm9-9.95h-2V3.5h2V.55zm7.45 3.91l-1.41-1.41-1.79 1.79 1.41 1.41 1.79-1.79zm-3.21 13.7l1.79 1.8 1.41-1.41-1.8-1.79-1.4 1.4zM20 10.5v2h3v-2h-3zm-8-5c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm-1 16.95h2V19.5h-2v2.95zm-7.45-3.91l1.41 1.41 1.79-1.8-1.41-1.41-1.79 1.8z"/></g>
+</defs></svg>
+</iron-iconset-svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/index.html
new file mode 100644
index 00000000000..fa5b89bbef7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/index.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/iron-icons.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/iron-icons.d.ts
new file mode 100644
index 00000000000..4f327505650
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/iron-icons.d.ts
@@ -0,0 +1,43 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-icons.html
+ */
+
+/// <reference path="../iron-icon/iron-icon.d.ts" />
+/// <reference path="../iron-iconset-svg/iron-iconset-svg.d.ts" />
+
+/**
+ * `iron-icons` is a utility import that includes the definition for the `iron-icon` element, `iron-iconset-svg` element, as well as an import for the default icon set.
+ *
+ * The `iron-icons` directory also includes imports for additional icon sets that can be loaded into your project.
+ *
+ * Example loading icon set:
+ *
+ * <link rel="import" href="../iron-icons/maps-icons.html">
+ *
+ * To use an icon from one of these sets, first prefix your `iron-icon` with the icon set name, followed by a colon, ":", and then the icon id.
+ *
+ * Example using the directions-bus icon from the maps icon set:
+ *
+ * <iron-icon icon="maps:directions-bus"></iron-icon>
+ *
+ * To load a subset of icons from one of the default `iron-icons` sets, you can
+ * use the [poly-icon](https://poly-icon.appspot.com/) tool. It allows you
+ * to select individual icons, and creates an iconset from them that you can
+ * use directly in your elements.
+ *
+ * See [iron-icon](#iron-icon) for more information about working with icons.
+ *
+ * See [iron-iconset](#iron-iconset) and [iron-iconset-svg](#iron-iconset-svg) for more information about how to create a custom iconset.
+ */
+interface IronIconsElement extends Polymer.Element {
+}
+
+interface HTMLElementTagNameMap {
+ "iron-icons": IronIconsElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/iron-icons.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/iron-icons.html
new file mode 100644
index 00000000000..739131cc92b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/iron-icons.html
@@ -0,0 +1,353 @@
+<!--
+@license
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<!--
+
+`iron-icons` is a utility import that includes the definition for the `iron-icon` element, `iron-iconset-svg` element, as well as an import for the default icon set.
+
+The `iron-icons` directory also includes imports for additional icon sets that can be loaded into your project.
+
+Example loading icon set:
+
+ <link rel="import" href="../iron-icons/maps-icons.html">
+
+To use an icon from one of these sets, first prefix your `iron-icon` with the icon set name, followed by a colon, ":", and then the icon id.
+
+Example using the directions-bus icon from the maps icon set:
+
+ <iron-icon icon="maps:directions-bus"></iron-icon>
+
+ To load a subset of icons from one of the default `iron-icons` sets, you can
+ use the [poly-icon](https://poly-icon.appspot.com/) tool. It allows you
+ to select individual icons, and creates an iconset from them that you can
+ use directly in your elements.
+
+See [iron-icon](#iron-icon) for more information about working with icons.
+
+See [iron-iconset](#iron-iconset) and [iron-iconset-svg](#iron-iconset-svg) for more information about how to create a custom iconset.
+
+@group Iron Elements
+@pseudoElement iron-icons
+@demo demo/index.html
+-->
+<link rel="import" href="../iron-icon/iron-icon.html">
+<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
+<iron-iconset-svg name="icons" size="24">
+<svg><defs>
+<g id="3d-rotation"><path d="M7.52 21.48C4.25 19.94 1.91 16.76 1.55 13H.05C.56 19.16 5.71 24 12 24l.66-.03-3.81-3.81-1.33 1.32zm.89-6.52c-.19 0-.37-.03-.52-.08-.16-.06-.29-.13-.4-.24-.11-.1-.2-.22-.26-.37-.06-.14-.09-.3-.09-.47h-1.3c0 .36.07.68.21.95.14.27.33.5.56.69.24.18.51.32.82.41.3.1.62.15.96.15.37 0 .72-.05 1.03-.15.32-.1.6-.25.83-.44s.42-.43.55-.72c.13-.29.2-.61.2-.97 0-.19-.02-.38-.07-.56-.05-.18-.12-.35-.23-.51-.1-.16-.24-.3-.4-.43-.17-.13-.37-.23-.61-.31.2-.09.37-.2.52-.33.15-.13.27-.27.37-.42.1-.15.17-.3.22-.46.05-.16.07-.32.07-.48 0-.36-.06-.68-.18-.96-.12-.28-.29-.51-.51-.69-.2-.19-.47-.33-.77-.43C9.1 8.05 8.76 8 8.39 8c-.36 0-.69.05-1 .16-.3.11-.57.26-.79.45-.21.19-.38.41-.51.67-.12.26-.18.54-.18.85h1.3c0-.17.03-.32.09-.45s.14-.25.25-.34c.11-.09.23-.17.38-.22.15-.05.3-.08.48-.08.4 0 .7.1.89.31.19.2.29.49.29.86 0 .18-.03.34-.08.49-.05.15-.14.27-.25.37-.11.1-.25.18-.41.24-.16.06-.36.09-.58.09H7.5v1.03h.77c.22 0 .42.02.6.07s.33.13.45.23c.12.11.22.24.29.4.07.16.1.35.1.57 0 .41-.12.72-.35.93-.23.23-.55.33-.95.33zm8.55-5.92c-.32-.33-.7-.59-1.14-.77-.43-.18-.92-.27-1.46-.27H12v8h2.3c.55 0 1.06-.09 1.51-.27.45-.18.84-.43 1.16-.76.32-.33.57-.73.74-1.19.17-.47.26-.99.26-1.57v-.4c0-.58-.09-1.1-.26-1.57-.18-.47-.43-.87-.75-1.2zm-.39 3.16c0 .42-.05.79-.14 1.13-.1.33-.24.62-.43.85-.19.23-.43.41-.71.53-.29.12-.62.18-.99.18h-.91V9.12h.97c.72 0 1.27.23 1.64.69.38.46.57 1.12.57 1.99v.4zM12 0l-.66.03 3.81 3.81 1.33-1.33c3.27 1.55 5.61 4.72 5.96 8.48h1.5C23.44 4.84 18.29 0 12 0z"/></g>
+<g id="accessibility"><path d="M12 2c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 7h-6v13h-2v-6h-2v6H9V9H3V7h18v2z"/></g>
+<g id="accessible"><circle cx="12" cy="4" r="2"/><path d="M19 13v-2c-1.54.02-3.09-.75-4.07-1.83l-1.29-1.43c-.17-.19-.38-.34-.61-.45-.01 0-.01-.01-.02-.01H13c-.35-.2-.75-.3-1.19-.26C10.76 7.11 10 8.04 10 9.09V15c0 1.1.9 2 2 2h5v5h2v-5.5c0-1.1-.9-2-2-2h-3v-3.45c1.29 1.07 3.25 1.94 5 1.95zm-6.17 5c-.41 1.16-1.52 2-2.83 2-1.66 0-3-1.34-3-3 0-1.31.84-2.41 2-2.83V12.1c-2.28.46-4 2.48-4 4.9 0 2.76 2.24 5 5 5 2.42 0 4.44-1.72 4.9-4h-2.07z"/></g>
+<g id="account-balance"><path d="M4 10v7h3v-7H4zm6 0v7h3v-7h-3zM2 22h19v-3H2v3zm14-12v7h3v-7h-3zm-4.5-9L2 6v2h19V6l-9.5-5z"/></g>
+<g id="account-balance-wallet"><path d="M21 18v1c0 1.1-.9 2-2 2H5c-1.11 0-2-.9-2-2V5c0-1.1.89-2 2-2h14c1.1 0 2 .9 2 2v1h-9c-1.11 0-2 .9-2 2v8c0 1.1.89 2 2 2h9zm-9-2h10V8H12v8zm4-2.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"/></g>
+<g id="account-box"><path d="M3 5v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2H5c-1.11 0-2 .9-2 2zm12 4c0 1.66-1.34 3-3 3s-3-1.34-3-3 1.34-3 3-3 3 1.34 3 3zm-9 8c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1H6v-1z"/></g>
+<g id="account-circle"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z"/></g>
+<g id="add"><path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/></g>
+<g id="add-alert"><path d="M10.01 21.01c0 1.1.89 1.99 1.99 1.99s1.99-.89 1.99-1.99h-3.98zm8.87-4.19V11c0-3.25-2.25-5.97-5.29-6.69v-.72C13.59 2.71 12.88 2 12 2s-1.59.71-1.59 1.59v.72C7.37 5.03 5.12 7.75 5.12 11v5.82L3 18.94V20h18v-1.06l-2.12-2.12zM16 13.01h-3v3h-2v-3H8V11h3V8h2v3h3v2.01z"/></g>
+<g id="add-box"><path d="M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-2 10h-4v4h-2v-4H7v-2h4V7h2v4h4v2z"/></g>
+<g id="add-circle"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11h-4v4h-2v-4H7v-2h4V7h2v4h4v2z"/></g>
+<g id="add-circle-outline"><path d="M13 7h-2v4H7v2h4v4h2v-4h4v-2h-4V7zm-1-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></g>
+<g id="add-shopping-cart"><path d="M11 9h2V6h3V4h-3V1h-2v3H8v2h3v3zm-4 9c-1.1 0-1.99.9-1.99 2S5.9 22 7 22s2-.9 2-2-.9-2-2-2zm10 0c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2zm-9.83-3.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.86-7.01L19.42 4h-.01l-1.1 2-2.76 5H8.53l-.13-.27L6.16 6l-.95-2-.94-2H1v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2H7.42c-.13 0-.25-.11-.25-.25z"/></g>
+<g id="alarm"><path d="M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM7.88 3.39L6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM12.5 8H11v6l4.75 2.85.75-1.23-4-2.37V8zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"/></g>
+<g id="alarm-add"><path d="M7.88 3.39L6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm1-11h-2v3H8v2h3v3h2v-3h3v-2h-3V9z"/></g>
+<g id="alarm-off"><path d="M12 6c3.87 0 7 3.13 7 7 0 .84-.16 1.65-.43 2.4l1.52 1.52c.58-1.19.91-2.51.91-3.92 0-4.97-4.03-9-9-9-1.41 0-2.73.33-3.92.91L9.6 6.43C10.35 6.16 11.16 6 12 6zm10-.28l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM2.92 2.29L1.65 3.57 2.98 4.9l-1.11.93 1.42 1.42 1.11-.94.8.8C3.83 8.69 3 10.75 3 13c0 4.97 4.02 9 9 9 2.25 0 4.31-.83 5.89-2.2l2.2 2.2 1.27-1.27L3.89 3.27l-.97-.98zm13.55 16.1C15.26 19.39 13.7 20 12 20c-3.87 0-7-3.13-7-7 0-1.7.61-3.26 1.61-4.47l9.86 9.86zM8.02 3.28L6.6 1.86l-.86.71 1.42 1.42.86-.71z"/></g>
+<g id="alarm-on"><path d="M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM7.88 3.39L6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm-1.46-5.47L8.41 12.4l-1.06 1.06 3.18 3.18 6-6-1.06-1.06-4.93 4.95z"/></g>
+<g id="all-out"><path d="M16.21 4.16l4 4v-4zm4 12l-4 4h4zm-12 4l-4-4v4zm-4-12l4-4h-4zm12.95-.95c-2.73-2.73-7.17-2.73-9.9 0s-2.73 7.17 0 9.9 7.17 2.73 9.9 0 2.73-7.16 0-9.9zm-1.1 8.8c-2.13 2.13-5.57 2.13-7.7 0s-2.13-5.57 0-7.7 5.57-2.13 7.7 0 2.13 5.57 0 7.7z"/></g>
+<g id="android"><path d="M6 18c0 .55.45 1 1 1h1v3.5c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5V19h2v3.5c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5V19h1c.55 0 1-.45 1-1V8H6v10zM3.5 8C2.67 8 2 8.67 2 9.5v7c0 .83.67 1.5 1.5 1.5S5 17.33 5 16.5v-7C5 8.67 4.33 8 3.5 8zm17 0c-.83 0-1.5.67-1.5 1.5v7c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-7c0-.83-.67-1.5-1.5-1.5zm-4.97-5.84l1.3-1.3c.2-.2.2-.51 0-.71-.2-.2-.51-.2-.71 0l-1.48 1.48C13.85 1.23 12.95 1 12 1c-.96 0-1.86.23-2.66.63L7.85.15c-.2-.2-.51-.2-.71 0-.2.2-.2.51 0 .71l1.31 1.31C6.97 3.26 6 5.01 6 7h12c0-1.99-.97-3.75-2.47-4.84zM10 5H9V4h1v1zm5 0h-1V4h1v1z"/></g>
+<g id="announcement"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 9h-2V5h2v6zm0 4h-2v-2h2v2z"/></g>
+<g id="apps"><path d="M4 8h4V4H4v4zm6 12h4v-4h-4v4zm-6 0h4v-4H4v4zm0-6h4v-4H4v4zm6 0h4v-4h-4v4zm6-10v4h4V4h-4zm-6 4h4V4h-4v4zm6 6h4v-4h-4v4zm0 6h4v-4h-4v4z"/></g>
+<g id="archive"><path d="M20.54 5.23l-1.39-1.68C18.88 3.21 18.47 3 18 3H6c-.47 0-.88.21-1.16.55L3.46 5.23C3.17 5.57 3 6.02 3 6.5V19c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V6.5c0-.48-.17-.93-.46-1.27zM12 17.5L6.5 12H10v-2h4v2h3.5L12 17.5zM5.12 5l.81-1h12l.94 1H5.12z"/></g>
+<g id="arrow-back"><path d="M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z"/></g>
+<g id="arrow-downward"><path d="M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z"/></g>
+<g id="arrow-drop-down"><path d="M7 10l5 5 5-5z"/></g>
+<g id="arrow-drop-down-circle"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 12l-4-4h8l-4 4z"/></g>
+<g id="arrow-drop-up"><path d="M7 14l5-5 5 5z"/></g>
+<g id="arrow-forward"><path d="M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"/></g>
+<g id="arrow-upward"><path d="M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z"/></g>
+<g id="aspect-ratio"><path d="M19 12h-2v3h-3v2h5v-5zM7 9h3V7H5v5h2V9zm14-6H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16.01H3V4.99h18v14.02z"/></g>
+<g id="assessment"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/></g>
+<g id="assignment"><path d="M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm2 14H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z"/></g>
+<g id="assignment-ind"><path d="M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm0 4c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12H6v-1.4c0-2 4-3.1 6-3.1s6 1.1 6 3.1V19z"/></g>
+<g id="assignment-late"><path d="M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-6 15h-2v-2h2v2zm0-4h-2V8h2v6zm-1-9c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z"/></g>
+<g id="assignment-return"><path d="M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm4 12h-4v3l-5-5 5-5v3h4v4z"/></g>
+<g id="assignment-returned"><path d="M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm0 15l-5-5h3V9h4v4h3l-5 5z"/></g>
+<g id="assignment-turned-in"><path d="M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-2 14l-4-4 1.41-1.41L10 14.17l6.59-6.59L18 9l-8 8z"/></g>
+<g id="attachment"><path d="M2 12.5C2 9.46 4.46 7 7.5 7H18c2.21 0 4 1.79 4 4s-1.79 4-4 4H9.5C8.12 15 7 13.88 7 12.5S8.12 10 9.5 10H17v2H9.41c-.55 0-.55 1 0 1H18c1.1 0 2-.9 2-2s-.9-2-2-2H7.5C5.57 9 4 10.57 4 12.5S5.57 16 7.5 16H17v2H7.5C4.46 18 2 15.54 2 12.5z"/></g>
+<g id="autorenew"><path d="M12 6v3l4-4-4-4v3c-4.42 0-8 3.58-8 8 0 1.57.46 3.03 1.24 4.26L6.7 14.8c-.45-.83-.7-1.79-.7-2.8 0-3.31 2.69-6 6-6zm6.76 1.74L17.3 9.2c.44.84.7 1.79.7 2.8 0 3.31-2.69 6-6 6v-3l-4 4 4 4v-3c4.42 0 8-3.58 8-8 0-1.57-.46-3.03-1.24-4.26z"/></g>
+<g id="backspace"><path d="M22 3H7c-.69 0-1.23.35-1.59.88L0 12l5.41 8.11c.36.53.9.89 1.59.89h15c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-3 12.59L17.59 17 14 13.41 10.41 17 9 15.59 12.59 12 9 8.41 10.41 7 14 10.59 17.59 7 19 8.41 15.41 12 19 15.59z"/></g>
+<g id="backup"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"/></g>
+<g id="block"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM4 12c0-4.42 3.58-8 8-8 1.85 0 3.55.63 4.9 1.69L5.69 16.9C4.63 15.55 4 13.85 4 12zm8 8c-1.85 0-3.55-.63-4.9-1.69L18.31 7.1C19.37 8.45 20 10.15 20 12c0 4.42-3.58 8-8 8z"/></g>
+<g id="book"><path d="M18 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM6 4h5v8l-2.5-1.5L6 12V4z"/></g>
+<g id="bookmark"><path d="M17 3H7c-1.1 0-1.99.9-1.99 2L5 21l7-3 7 3V5c0-1.1-.9-2-2-2z"/></g>
+<g id="bookmark-border"><path d="M17 3H7c-1.1 0-1.99.9-1.99 2L5 21l7-3 7 3V5c0-1.1-.9-2-2-2zm0 15l-5-2.18L7 18V5h10v13z"/></g>
+<g id="bug-report"><path d="M20 8h-2.81c-.45-.78-1.07-1.45-1.82-1.96L17 4.41 15.59 3l-2.17 2.17C12.96 5.06 12.49 5 12 5c-.49 0-.96.06-1.41.17L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20V8zm-6 8h-4v-2h4v2zm0-4h-4v-2h4v2z"/></g>
+<g id="build"><path d="M22.7 19l-9.1-9.1c.9-2.3.4-5-1.5-6.9-2-2-5-2.4-7.4-1.3L9 6 6 9 1.6 4.7C.4 7.1.9 10.1 2.9 12.1c1.9 1.9 4.6 2.4 6.9 1.5l9.1 9.1c.4.4 1 .4 1.4 0l2.3-2.3c.5-.4.5-1.1.1-1.4z"/></g>
+<g id="cached"><path d="M19 8l-4 4h3c0 3.31-2.69 6-6 6-1.01 0-1.97-.25-2.8-.7l-1.46 1.46C8.97 19.54 10.43 20 12 20c4.42 0 8-3.58 8-8h3l-4-4zM6 12c0-3.31 2.69-6 6-6 1.01 0 1.97.25 2.8.7l1.46-1.46C15.03 4.46 13.57 4 12 4c-4.42 0-8 3.58-8 8H1l4 4 4-4H6z"/></g>
+<g id="camera-enhance"><path d="M9 3L7.17 5H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2h-3.17L15 3H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-1l1.25-2.75L16 13l-2.75-1.25L12 9l-1.25 2.75L8 13l2.75 1.25z"/></g>
+<g id="cancel"><path d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"/></g>
+<g id="card-giftcard"><path d="M20 6h-2.18c.11-.31.18-.65.18-1 0-1.66-1.34-3-3-3-1.05 0-1.96.54-2.5 1.35l-.5.67-.5-.68C10.96 2.54 10.05 2 9 2 7.34 2 6 3.34 6 5c0 .35.07.69.18 1H4c-1.11 0-1.99.89-1.99 2L2 19c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zm-5-2c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zM9 4c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm11 15H4v-2h16v2zm0-5H4V8h5.08L7 10.83 8.62 12 11 8.76l1-1.36 1 1.36L15.38 12 17 10.83 14.92 8H20v6z"/></g>
+<g id="card-membership"><path d="M20 2H4c-1.11 0-2 .89-2 2v11c0 1.11.89 2 2 2h4v5l4-2 4 2v-5h4c1.11 0 2-.89 2-2V4c0-1.11-.89-2-2-2zm0 13H4v-2h16v2zm0-5H4V4h16v6z"/></g>
+<g id="card-travel"><path d="M20 6h-3V4c0-1.11-.89-2-2-2H9c-1.11 0-2 .89-2 2v2H4c-1.11 0-2 .89-2 2v11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zM9 4h6v2H9V4zm11 15H4v-2h16v2zm0-5H4V8h3v2h2V8h6v2h2V8h3v6z"/></g>
+<g id="change-history"><path d="M12 7.77L18.39 18H5.61L12 7.77M12 4L2 20h20L12 4z"/></g>
+<g id="check"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></g>
+<g id="check-box"><path d="M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/></g>
+<g id="check-box-outline-blank"><path d="M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"/></g>
+<g id="check-circle"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/></g>
+<g id="chevron-left"><path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/></g>
+<g id="chevron-right"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></g>
+<g id="chrome-reader-mode"><path d="M13 12h7v1.5h-7zm0-2.5h7V11h-7zm0 5h7V16h-7zM21 4H3c-1.1 0-2 .9-2 2v13c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 15h-9V6h9v13z"/></g>
+<g id="class"><path d="M18 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM6 4h5v8l-2.5-1.5L6 12V4z"/></g>
+<g id="clear"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></g>
+<g id="close"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></g>
+<g id="cloud"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96z"/></g>
+<g id="cloud-circle"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm4.5 14H8c-1.66 0-3-1.34-3-3s1.34-3 3-3l.14.01C8.58 8.28 10.13 7 12 7c2.21 0 4 1.79 4 4h.5c1.38 0 2.5 1.12 2.5 2.5S17.88 16 16.5 16z"/></g>
+<g id="cloud-done"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM10 17l-3.5-3.5 1.41-1.41L10 14.17 15.18 9l1.41 1.41L10 17z"/></g>
+<g id="cloud-download"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM17 13l-5 5-5-5h3V9h4v4h3z"/></g>
+<g id="cloud-off"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4c-1.48 0-2.85.43-4.01 1.17l1.46 1.46C10.21 6.23 11.08 6 12 6c3.04 0 5.5 2.46 5.5 5.5v.5H19c1.66 0 3 1.34 3 3 0 1.13-.64 2.11-1.56 2.62l1.45 1.45C23.16 18.16 24 16.68 24 15c0-2.64-2.05-4.78-4.65-4.96zM3 5.27l2.75 2.74C2.56 8.15 0 10.77 0 14c0 3.31 2.69 6 6 6h11.73l2 2L21 20.73 4.27 4 3 5.27zM7.73 10l8 8H6c-2.21 0-4-1.79-4-4s1.79-4 4-4h1.73z"/></g>
+<g id="cloud-queue"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM19 18H6c-2.21 0-4-1.79-4-4s1.79-4 4-4h.71C7.37 7.69 9.48 6 12 6c3.04 0 5.5 2.46 5.5 5.5v.5H19c1.66 0 3 1.34 3 3s-1.34 3-3 3z"/></g>
+<g id="cloud-upload"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"/></g>
+<g id="code"><path d="M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z"/></g>
+<g id="compare-arrows"><path d="M9.01 14H2v2h7.01v3L13 15l-3.99-4v3zm5.98-1v-3H22V8h-7.01V5L11 9l3.99 4z"/></g>
+<g id="content-copy"><path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"/></g>
+<g id="content-cut"><path d="M9.64 7.64c.23-.5.36-1.05.36-1.64 0-2.21-1.79-4-4-4S2 3.79 2 6s1.79 4 4 4c.59 0 1.14-.13 1.64-.36L10 12l-2.36 2.36C7.14 14.13 6.59 14 6 14c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4c0-.59-.13-1.14-.36-1.64L12 14l7 7h3v-1L9.64 7.64zM6 8c-1.1 0-2-.89-2-2s.9-2 2-2 2 .89 2 2-.9 2-2 2zm0 12c-1.1 0-2-.89-2-2s.9-2 2-2 2 .89 2 2-.9 2-2 2zm6-7.5c-.28 0-.5-.22-.5-.5s.22-.5.5-.5.5.22.5.5-.22.5-.5.5zM19 3l-6 6 2 2 7-7V3z"/></g>
+<g id="content-paste"><path d="M19 2h-4.18C14.4.84 13.3 0 12 0c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18H5V4h2v3h10V4h2v16z"/></g>
+<g id="copyright"><path d="M10.08 10.86c.05-.33.16-.62.3-.87s.34-.46.59-.62c.24-.15.54-.22.91-.23.23.01.44.05.63.13.2.09.38.21.52.36s.25.33.34.53.13.42.14.64h1.79c-.02-.47-.11-.9-.28-1.29s-.4-.73-.7-1.01-.66-.5-1.08-.66-.88-.23-1.39-.23c-.65 0-1.22.11-1.7.34s-.88.53-1.2.92-.56.84-.71 1.36S8 11.29 8 11.87v.27c0 .58.08 1.12.23 1.64s.39.97.71 1.35.72.69 1.2.91 1.05.34 1.7.34c.47 0 .91-.08 1.32-.23s.77-.36 1.08-.63.56-.58.74-.94.29-.74.3-1.15h-1.79c-.01.21-.06.4-.15.58s-.21.33-.36.46-.32.23-.52.3c-.19.07-.39.09-.6.1-.36-.01-.66-.08-.89-.23-.25-.16-.45-.37-.59-.62s-.25-.55-.3-.88-.08-.67-.08-1v-.27c0-.35.03-.68.08-1.01zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></g>
+<g id="create"><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"/></g>
+<g id="create-new-folder"><path d="M20 6h-8l-2-2H4c-1.11 0-1.99.89-1.99 2L2 18c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zm-1 8h-3v3h-2v-3h-3v-2h3V9h2v3h3v2z"/></g>
+<g id="credit-card"><path d="M20 4H4c-1.11 0-1.99.89-1.99 2L2 18c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6c0-1.11-.89-2-2-2zm0 14H4v-6h16v6zm0-10H4V6h16v2z"/></g>
+<g id="dashboard"><path d="M3 13h8V3H3v10zm0 8h8v-6H3v6zm10 0h8V11h-8v10zm0-18v6h8V3h-8z"/></g>
+<g id="date-range"><path d="M9 11H7v2h2v-2zm4 0h-2v2h2v-2zm4 0h-2v2h2v-2zm2-7h-1V2h-2v2H8V2H6v2H5c-1.11 0-1.99.9-1.99 2L3 20c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 16H5V9h14v11z"/></g>
+<g id="delete"><path d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"/></g>
+<g id="delete-forever"><path d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zm2.46-7.12l1.41-1.41L12 12.59l2.12-2.12 1.41 1.41L13.41 14l2.12 2.12-1.41 1.41L12 15.41l-2.12 2.12-1.41-1.41L10.59 14l-2.13-2.12zM15.5 4l-1-1h-5l-1 1H5v2h14V4z"/></g>
+<g id="delete-sweep"><path d="M15 16h4v2h-4zm0-8h7v2h-7zm0 4h6v2h-6zM3 18c0 1.1.9 2 2 2h6c1.1 0 2-.9 2-2V8H3v10zM14 5h-3l-1-1H6L5 5H2v2h12z"/></g>
+<g id="description"><path d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z"/></g>
+<g id="dns"><path d="M20 13H4c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h16c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zM7 19c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zM20 3H4c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h16c.55 0 1-.45 1-1V4c0-.55-.45-1-1-1zM7 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z"/></g>
+<g id="done"><path d="M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z"/></g>
+<g id="done-all"><path d="M18 7l-1.41-1.41-6.34 6.34 1.41 1.41L18 7zm4.24-1.41L11.66 16.17 7.48 12l-1.41 1.41L11.66 19l12-12-1.42-1.41zM.41 13.41L6 19l1.41-1.41L1.83 12 .41 13.41z"/></g>
+<g id="donut-large"><path d="M11 5.08V2c-5 .5-9 4.81-9 10s4 9.5 9 10v-3.08c-3-.48-6-3.4-6-6.92s3-6.44 6-6.92zM18.97 11H22c-.47-5-4-8.53-9-9v3.08C16 5.51 18.54 8 18.97 11zM13 18.92V22c5-.47 8.53-4 9-9h-3.03c-.43 3-2.97 5.49-5.97 5.92z"/></g>
+<g id="donut-small"><path d="M11 9.16V2c-5 .5-9 4.79-9 10s4 9.5 9 10v-7.16c-1-.41-2-1.52-2-2.84s1-2.43 2-2.84zM14.86 11H22c-.48-4.75-4-8.53-9-9v7.16c1 .3 1.52.98 1.86 1.84zM13 14.84V22c5-.47 8.52-4.25 9-9h-7.14c-.34.86-.86 1.54-1.86 1.84z"/></g>
+<g id="drafts"><path d="M21.99 8c0-.72-.37-1.35-.94-1.7L12 1 2.95 6.3C2.38 6.65 2 7.28 2 8v10c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2l-.01-10zM12 13L3.74 7.84 12 3l8.26 4.84L12 13z"/></g>
+<g id="eject"><path d="M5 17h14v2H5zm7-12L5.33 15h13.34z"/></g>
+<g id="error"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"/></g>
+<g id="error-outline"><path d="M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"/></g>
+<g id="euro-symbol"><path d="M15 18.5c-2.51 0-4.68-1.42-5.76-3.5H15v-2H8.58c-.05-.33-.08-.66-.08-1s.03-.67.08-1H15V9H9.24C10.32 6.92 12.5 5.5 15 5.5c1.61 0 3.09.59 4.23 1.57L21 5.3C19.41 3.87 17.3 3 15 3c-3.92 0-7.24 2.51-8.48 6H3v2h3.06c-.04.33-.06.66-.06 1 0 .34.02.67.06 1H3v2h3.52c1.24 3.49 4.56 6 8.48 6 2.31 0 4.41-.87 6-2.3l-1.78-1.77c-1.13.98-2.6 1.57-4.22 1.57z"/></g>
+<g id="event"><path d="M17 12h-5v5h5v-5zM16 1v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2h-1V1h-2zm3 18H5V8h14v11z"/></g>
+<g id="event-seat"><path d="M4 18v3h3v-3h10v3h3v-6H4zm15-8h3v3h-3zM2 10h3v3H2zm15 3H7V5c0-1.1.9-2 2-2h6c1.1 0 2 .9 2 2v8z"/></g>
+<g id="exit-to-app"><path d="M10.09 15.59L11.5 17l5-5-5-5-1.41 1.41L12.67 11H3v2h9.67l-2.58 2.59zM19 3H5c-1.11 0-2 .9-2 2v4h2V5h14v14H5v-4H3v4c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"/></g>
+<g id="expand-less"><path d="M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z"/></g>
+<g id="expand-more"><path d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z"/></g>
+<g id="explore"><path d="M12 10.9c-.61 0-1.1.49-1.1 1.1s.49 1.1 1.1 1.1c.61 0 1.1-.49 1.1-1.1s-.49-1.1-1.1-1.1zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm2.19 12.19L6 18l3.81-8.19L18 6l-3.81 8.19z"/></g>
+<g id="extension"><path d="M20.5 11H19V7c0-1.1-.9-2-2-2h-4V3.5C13 2.12 11.88 1 10.5 1S8 2.12 8 3.5V5H4c-1.1 0-1.99.9-1.99 2v3.8H3.5c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7H2V20c0 1.1.9 2 2 2h3.8v-1.5c0-1.49 1.21-2.7 2.7-2.7 1.49 0 2.7 1.21 2.7 2.7V22H17c1.1 0 2-.9 2-2v-4h1.5c1.38 0 2.5-1.12 2.5-2.5S21.88 11 20.5 11z"/></g>
+<g id="face"><path d="M9 11.75c-.69 0-1.25.56-1.25 1.25s.56 1.25 1.25 1.25 1.25-.56 1.25-1.25-.56-1.25-1.25-1.25zm6 0c-.69 0-1.25.56-1.25 1.25s.56 1.25 1.25 1.25 1.25-.56 1.25-1.25-.56-1.25-1.25-1.25zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8 0-.29.02-.58.05-.86 2.36-1.05 4.23-2.98 5.21-5.37C11.07 8.33 14.05 10 17.42 10c.78 0 1.53-.09 2.25-.26.21.71.33 1.47.33 2.26 0 4.41-3.59 8-8 8z"/></g>
+<g id="favorite"><path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/></g>
+<g id="favorite-border"><path d="M16.5 3c-1.74 0-3.41.81-4.5 2.09C10.91 3.81 9.24 3 7.5 3 4.42 3 2 5.42 2 8.5c0 3.78 3.4 6.86 8.55 11.54L12 21.35l1.45-1.32C18.6 15.36 22 12.28 22 8.5 22 5.42 19.58 3 16.5 3zm-4.4 15.55l-.1.1-.1-.1C7.14 14.24 4 11.39 4 8.5 4 6.5 5.5 5 7.5 5c1.54 0 3.04.99 3.57 2.36h1.87C13.46 5.99 14.96 5 16.5 5c2 0 3.5 1.5 3.5 3.5 0 2.89-3.14 5.74-7.9 10.05z"/></g>
+<g id="feedback"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 12h-2v-2h2v2zm0-4h-2V6h2v4z"/></g>
+<g id="file-download"><path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/></g>
+<g id="file-upload"><path d="M9 16h6v-6h4l-7-7-7 7h4zm-4 2h14v2H5z"/></g>
+<g id="filter-list"><path d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/></g>
+<g id="find-in-page"><path d="M20 19.59V8l-6-6H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c.45 0 .85-.15 1.19-.4l-4.43-4.43c-.8.52-1.74.83-2.76.83-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5c0 1.02-.31 1.96-.83 2.75L20 19.59zM9 13c0 1.66 1.34 3 3 3s3-1.34 3-3-1.34-3-3-3-3 1.34-3 3z"/></g>
+<g id="find-replace"><path d="M11 6c1.38 0 2.63.56 3.54 1.46L12 10h6V4l-2.05 2.05C14.68 4.78 12.93 4 11 4c-3.53 0-6.43 2.61-6.92 6H6.1c.46-2.28 2.48-4 4.9-4zm5.64 9.14c.66-.9 1.12-1.97 1.28-3.14H15.9c-.46 2.28-2.48 4-4.9 4-1.38 0-2.63-.56-3.54-1.46L10 12H4v6l2.05-2.05C7.32 17.22 9.07 18 11 18c1.55 0 2.98-.51 4.14-1.36L20 21.49 21.49 20l-4.85-4.86z"/></g>
+<g id="fingerprint"><path d="M17.81 4.47c-.08 0-.16-.02-.23-.06C15.66 3.42 14 3 12.01 3c-1.98 0-3.86.47-5.57 1.41-.24.13-.54.04-.68-.2-.13-.24-.04-.55.2-.68C7.82 2.52 9.86 2 12.01 2c2.13 0 3.99.47 6.03 1.52.25.13.34.43.21.67-.09.18-.26.28-.44.28zM3.5 9.72c-.1 0-.2-.03-.29-.09-.23-.16-.28-.47-.12-.7.99-1.4 2.25-2.5 3.75-3.27C9.98 4.04 14 4.03 17.15 5.65c1.5.77 2.76 1.86 3.75 3.25.16.22.11.54-.12.7-.23.16-.54.11-.7-.12-.9-1.26-2.04-2.25-3.39-2.94-2.87-1.47-6.54-1.47-9.4.01-1.36.7-2.5 1.7-3.4 2.96-.08.14-.23.21-.39.21zm6.25 12.07c-.13 0-.26-.05-.35-.15-.87-.87-1.34-1.43-2.01-2.64-.69-1.23-1.05-2.73-1.05-4.34 0-2.97 2.54-5.39 5.66-5.39s5.66 2.42 5.66 5.39c0 .28-.22.5-.5.5s-.5-.22-.5-.5c0-2.42-2.09-4.39-4.66-4.39-2.57 0-4.66 1.97-4.66 4.39 0 1.44.32 2.77.93 3.85.64 1.15 1.08 1.64 1.85 2.42.19.2.19.51 0 .71-.11.1-.24.15-.37.15zm7.17-1.85c-1.19 0-2.24-.3-3.1-.89-1.49-1.01-2.38-2.65-2.38-4.39 0-.28.22-.5.5-.5s.5.22.5.5c0 1.41.72 2.74 1.94 3.56.71.48 1.54.71 2.54.71.24 0 .64-.03 1.04-.1.27-.05.53.13.58.41.05.27-.13.53-.41.58-.57.11-1.07.12-1.21.12zM14.91 22c-.04 0-.09-.01-.13-.02-1.59-.44-2.63-1.03-3.72-2.1-1.4-1.39-2.17-3.24-2.17-5.22 0-1.62 1.38-2.94 3.08-2.94 1.7 0 3.08 1.32 3.08 2.94 0 1.07.93 1.94 2.08 1.94s2.08-.87 2.08-1.94c0-3.77-3.25-6.83-7.25-6.83-2.84 0-5.44 1.58-6.61 4.03-.39.81-.59 1.76-.59 2.8 0 .78.07 2.01.67 3.61.1.26-.03.55-.29.64-.26.1-.55-.04-.64-.29-.49-1.31-.73-2.61-.73-3.96 0-1.2.23-2.29.68-3.24 1.33-2.79 4.28-4.6 7.51-4.6 4.55 0 8.25 3.51 8.25 7.83 0 1.62-1.38 2.94-3.08 2.94s-3.08-1.32-3.08-2.94c0-1.07-.93-1.94-2.08-1.94s-2.08.87-2.08 1.94c0 1.71.66 3.31 1.87 4.51.95.94 1.86 1.46 3.27 1.85.27.07.42.35.35.61-.05.23-.26.38-.47.38z"/></g>
+<g id="first-page"><path d="M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z"/></g>
+<g id="flag"><path d="M14.4 6L14 4H5v17h2v-7h5.6l.4 2h7V6z"/></g>
+<g id="flight-land"><path d="M2.5 19h19v2h-19zm7.18-5.73l4.35 1.16 5.31 1.42c.8.21 1.62-.26 1.84-1.06.21-.8-.26-1.62-1.06-1.84l-5.31-1.42-2.76-9.02L10.12 2v8.28L5.15 8.95l-.93-2.32-1.45-.39v5.17l1.6.43 5.31 1.43z"/></g>
+<g id="flight-takeoff"><path d="M2.5 19h19v2h-19zm19.57-9.36c-.21-.8-1.04-1.28-1.84-1.06L14.92 10l-6.9-6.43-1.93.51 4.14 7.17-4.97 1.33-1.97-1.54-1.45.39 1.82 3.16.77 1.33 1.6-.43 5.31-1.42 4.35-1.16L21 11.49c.81-.23 1.28-1.05 1.07-1.85z"/></g>
+<g id="flip-to-back"><path d="M9 7H7v2h2V7zm0 4H7v2h2v-2zm0-8c-1.11 0-2 .9-2 2h2V3zm4 12h-2v2h2v-2zm6-12v2h2c0-1.1-.9-2-2-2zm-6 0h-2v2h2V3zM9 17v-2H7c0 1.1.89 2 2 2zm10-4h2v-2h-2v2zm0-4h2V7h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zM5 7H3v12c0 1.1.89 2 2 2h12v-2H5V7zm10-2h2V3h-2v2zm0 12h2v-2h-2v2z"/></g>
+<g id="flip-to-front"><path d="M3 13h2v-2H3v2zm0 4h2v-2H3v2zm2 4v-2H3c0 1.1.89 2 2 2zM3 9h2V7H3v2zm12 12h2v-2h-2v2zm4-18H9c-1.11 0-2 .9-2 2v10c0 1.1.89 2 2 2h10c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 12H9V5h10v10zm-8 6h2v-2h-2v2zm-4 0h2v-2H7v2z"/></g>
+<g id="folder"><path d="M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"/></g>
+<g id="folder-open"><path d="M20 6h-8l-2-2H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm0 12H4V8h16v10z"/></g>
+<g id="folder-shared"><path d="M20 6h-8l-2-2H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm-5 3c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm4 8h-8v-1c0-1.33 2.67-2 4-2s4 .67 4 2v1z"/></g>
+<g id="font-download"><path d="M9.93 13.5h4.14L12 7.98zM20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-4.05 16.5l-1.14-3H9.17l-1.12 3H5.96l5.11-13h1.86l5.11 13h-2.09z"/></g>
+<g id="forward"><path d="M12 8V4l8 8-8 8v-4H4V8z"/></g>
+<g id="fullscreen"><path d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"/></g>
+<g id="fullscreen-exit"><path d="M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"/></g>
+<g id="g-translate"><path d="M20 5h-9.12L10 2H4c-1.1 0-2 .9-2 2v13c0 1.1.9 2 2 2h7l1 3h8c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zM7.17 14.59c-2.25 0-4.09-1.83-4.09-4.09s1.83-4.09 4.09-4.09c1.04 0 1.99.37 2.74 1.07l.07.06-1.23 1.18-.06-.05c-.29-.27-.78-.59-1.52-.59-1.31 0-2.38 1.09-2.38 2.42s1.07 2.42 2.38 2.42c1.37 0 1.96-.87 2.12-1.46H7.08V9.91h3.95l.01.07c.04.21.05.4.05.61 0 2.35-1.61 4-3.92 4zm6.03-1.71c.33.6.74 1.18 1.19 1.7l-.54.53-.65-2.23zm.77-.76h-.99l-.31-1.04h3.99s-.34 1.31-1.56 2.74c-.52-.62-.89-1.23-1.13-1.7zM21 20c0 .55-.45 1-1 1h-7l2-2-.81-2.77.92-.92L17.79 18l.73-.73-2.71-2.68c.9-1.03 1.6-2.25 1.92-3.51H19v-1.04h-3.64V9h-1.04v1.04h-1.96L11.18 6H20c.55 0 1 .45 1 1v13z"/></g>
+<g id="gavel"><path d="M1 21h12v2H1zM5.245 8.07l2.83-2.827 14.14 14.142-2.828 2.828zM12.317 1l5.657 5.656-2.83 2.83-5.654-5.66zM3.825 9.485l5.657 5.657-2.828 2.828-5.657-5.657z"/></g>
+<g id="gesture"><path d="M4.59 6.89c.7-.71 1.4-1.35 1.71-1.22.5.2 0 1.03-.3 1.52-.25.42-2.86 3.89-2.86 6.31 0 1.28.48 2.34 1.34 2.98.75.56 1.74.73 2.64.46 1.07-.31 1.95-1.4 3.06-2.77 1.21-1.49 2.83-3.44 4.08-3.44 1.63 0 1.65 1.01 1.76 1.79-3.78.64-5.38 3.67-5.38 5.37 0 1.7 1.44 3.09 3.21 3.09 1.63 0 4.29-1.33 4.69-6.1H21v-2.5h-2.47c-.15-1.65-1.09-4.2-4.03-4.2-2.25 0-4.18 1.91-4.94 2.84-.58.73-2.06 2.48-2.29 2.72-.25.3-.68.84-1.11.84-.45 0-.72-.83-.36-1.92.35-1.09 1.4-2.86 1.85-3.52.78-1.14 1.3-1.92 1.3-3.28C8.95 3.69 7.31 3 6.44 3 5.12 3 3.97 4 3.72 4.25c-.36.36-.66.66-.88.93l1.75 1.71zm9.29 11.66c-.31 0-.74-.26-.74-.72 0-.6.73-2.2 2.87-2.76-.3 2.69-1.43 3.48-2.13 3.48z"/></g>
+<g id="get-app"><path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/></g>
+<g id="gif"><path d="M11.5 9H13v6h-1.5zM9 9H6c-.6 0-1 .5-1 1v4c0 .5.4 1 1 1h3c.6 0 1-.5 1-1v-2H8.5v1.5h-2v-3H10V10c0-.5-.4-1-1-1zm10 1.5V9h-4.5v6H16v-2h2v-1.5h-2v-1z"/></g>
+<g id="grade"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></g>
+<g id="group-work"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM8 17.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5zM9.5 8c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5S9.5 9.38 9.5 8zm6.5 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z"/></g>
+<g id="help"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 17h-2v-2h2v2zm2.07-7.75l-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z"/></g>
+<g id="help-outline"><path d="M11 18h2v-2h-2v2zm1-16C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-2.21 0-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5 0-2.21-1.79-4-4-4z"/></g>
+<g id="highlight-off"><path d="M14.59 8L12 10.59 9.41 8 8 9.41 10.59 12 8 14.59 9.41 16 12 13.41 14.59 16 16 14.59 13.41 12 16 9.41 14.59 8zM12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></g>
+<g id="history"><path d="M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"/></g>
+<g id="home"><path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/></g>
+<g id="hourglass-empty"><path d="M6 2v6h.01L6 8.01 10 12l-4 4 .01.01H6V22h12v-5.99h-.01L18 16l-4-4 4-3.99-.01-.01H18V2H6zm10 14.5V20H8v-3.5l4-4 4 4zm-4-5l-4-4V4h8v3.5l-4 4z"/></g>
+<g id="hourglass-full"><path d="M6 2v6h.01L6 8.01 10 12l-4 4 .01.01H6V22h12v-5.99h-.01L18 16l-4-4 4-3.99-.01-.01H18V2H6z"/></g>
+<g id="http"><path d="M4.5 11h-2V9H1v6h1.5v-2.5h2V15H6V9H4.5v2zm2.5-.5h1.5V15H10v-4.5h1.5V9H7v1.5zm5.5 0H14V15h1.5v-4.5H17V9h-4.5v1.5zm9-1.5H18v6h1.5v-2h2c.8 0 1.5-.7 1.5-1.5v-1c0-.8-.7-1.5-1.5-1.5zm0 2.5h-2v-1h2v1z"/></g>
+<g id="https"><path d="M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z"/></g>
+<g id="important-devices"><path d="M23 11.01L18 11c-.55 0-1 .45-1 1v9c0 .55.45 1 1 1h5c.55 0 1-.45 1-1v-9c0-.55-.45-.99-1-.99zM23 20h-5v-7h5v7zM20 2H2C.89 2 0 2.89 0 4v12c0 1.1.89 2 2 2h7v2H7v2h8v-2h-2v-2h2v-2H2V4h18v5h2V4c0-1.11-.9-2-2-2zm-8.03 7L11 6l-.97 3H7l2.47 1.76-.94 2.91 2.47-1.8 2.47 1.8-.94-2.91L15 9h-3.03z"/></g>
+<g id="inbox"><path d="M19 3H4.99c-1.11 0-1.98.89-1.98 2L3 19c0 1.1.88 2 1.99 2H19c1.1 0 2-.9 2-2V5c0-1.11-.9-2-2-2zm0 12h-4c0 1.66-1.35 3-3 3s-3-1.34-3-3H4.99V5H19v10z"/></g>
+<g id="indeterminate-check-box"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-2 10H7v-2h10v2z"/></g>
+<g id="info"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/></g>
+<g id="info-outline"><path d="M11 17h2v-6h-2v6zm1-15C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zM11 9h2V7h-2v2z"/></g>
+<g id="input"><path d="M21 3.01H3c-1.1 0-2 .9-2 2V9h2V4.99h18v14.03H3V15H1v4.01c0 1.1.9 1.98 2 1.98h18c1.1 0 2-.88 2-1.98v-14c0-1.11-.9-2-2-2zM11 16l4-4-4-4v3H1v2h10v3z"/></g>
+<g id="invert-colors"><path d="M17.66 7.93L12 2.27 6.34 7.93c-3.12 3.12-3.12 8.19 0 11.31C7.9 20.8 9.95 21.58 12 21.58c2.05 0 4.1-.78 5.66-2.34 3.12-3.12 3.12-8.19 0-11.31zM12 19.59c-1.6 0-3.11-.62-4.24-1.76C6.62 16.69 6 15.19 6 13.59s.62-3.11 1.76-4.24L12 5.1v14.49z"/></g>
+<g id="label"><path d="M17.63 5.84C17.27 5.33 16.67 5 16 5L5 5.01C3.9 5.01 3 5.9 3 7v10c0 1.1.9 1.99 2 1.99L16 19c.67 0 1.27-.33 1.63-.84L22 12l-4.37-6.16z"/></g>
+<g id="label-outline"><path d="M17.63 5.84C17.27 5.33 16.67 5 16 5L5 5.01C3.9 5.01 3 5.9 3 7v10c0 1.1.9 1.99 2 1.99L16 19c.67 0 1.27-.33 1.63-.84L22 12l-4.37-6.16zM16 17H5V7h11l3.55 5L16 17z"/></g>
+<g id="language"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zm6.93 6h-2.95c-.32-1.25-.78-2.45-1.38-3.56 1.84.63 3.37 1.91 4.33 3.56zM12 4.04c.83 1.2 1.48 2.53 1.91 3.96h-3.82c.43-1.43 1.08-2.76 1.91-3.96zM4.26 14C4.1 13.36 4 12.69 4 12s.1-1.36.26-2h3.38c-.08.66-.14 1.32-.14 2 0 .68.06 1.34.14 2H4.26zm.82 2h2.95c.32 1.25.78 2.45 1.38 3.56-1.84-.63-3.37-1.9-4.33-3.56zm2.95-8H5.08c.96-1.66 2.49-2.93 4.33-3.56C8.81 5.55 8.35 6.75 8.03 8zM12 19.96c-.83-1.2-1.48-2.53-1.91-3.96h3.82c-.43 1.43-1.08 2.76-1.91 3.96zM14.34 14H9.66c-.09-.66-.16-1.32-.16-2 0-.68.07-1.35.16-2h4.68c.09.65.16 1.32.16 2 0 .68-.07 1.34-.16 2zm.25 5.56c.6-1.11 1.06-2.31 1.38-3.56h2.95c-.96 1.65-2.49 2.93-4.33 3.56zM16.36 14c.08-.66.14-1.32.14-2 0-.68-.06-1.34-.14-2h3.38c.16.64.26 1.31.26 2s-.1 1.36-.26 2h-3.38z"/></g>
+<g id="last-page"><path d="M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z"/></g>
+<g id="launch"><path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"/></g>
+<g id="lightbulb-outline"><path d="M9 21c0 .55.45 1 1 1h4c.55 0 1-.45 1-1v-1H9v1zm3-19C8.14 2 5 5.14 5 9c0 2.38 1.19 4.47 3 5.74V17c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-2.26c1.81-1.27 3-3.36 3-5.74 0-3.86-3.14-7-7-7zm2.85 11.1l-.85.6V16h-4v-2.3l-.85-.6C7.8 12.16 7 10.63 7 9c0-2.76 2.24-5 5-5s5 2.24 5 5c0 1.63-.8 3.16-2.15 4.1z"/></g>
+<g id="line-style"><path d="M3 16h5v-2H3v2zm6.5 0h5v-2h-5v2zm6.5 0h5v-2h-5v2zM3 20h2v-2H3v2zm4 0h2v-2H7v2zm4 0h2v-2h-2v2zm4 0h2v-2h-2v2zm4 0h2v-2h-2v2zM3 12h8v-2H3v2zm10 0h8v-2h-8v2zM3 4v4h18V4H3z"/></g>
+<g id="line-weight"><path d="M3 17h18v-2H3v2zm0 3h18v-1H3v1zm0-7h18v-3H3v3zm0-9v4h18V4H3z"/></g>
+<g id="link"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/></g>
+<g id="list"><path d="M3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7z"/></g>
+<g id="lock"><path d="M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z"/></g>
+<g id="lock-open"><path d="M12 17c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6-9h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6h1.9c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm0 12H6V10h12v10z"/></g>
+<g id="lock-outline"><path d="M12 17c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6-9h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zM8.9 6c0-1.71 1.39-3.1 3.1-3.1s3.1 1.39 3.1 3.1v2H8.9V6zM18 20H6V10h12v10z"/></g>
+<g id="low-priority"><path d="M14 5h8v2h-8zm0 5.5h8v2h-8zm0 5.5h8v2h-8zM2 11.5C2 15.08 4.92 18 8.5 18H9v2l3-3-3-3v2h-.5C6.02 16 4 13.98 4 11.5S6.02 7 8.5 7H12V5H8.5C4.92 5 2 7.92 2 11.5z"/></g>
+<g id="loyalty"><path d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7zm11.77 8.27L13 19.54l-4.27-4.27C8.28 14.81 8 14.19 8 13.5c0-1.38 1.12-2.5 2.5-2.5.69 0 1.32.28 1.77.74l.73.72.73-.73c.45-.45 1.08-.73 1.77-.73 1.38 0 2.5 1.12 2.5 2.5 0 .69-.28 1.32-.73 1.77z"/></g>
+<g id="mail"><path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/></g>
+<g id="markunread"><path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/></g>
+<g id="markunread-mailbox"><path d="M20 6H10v6H8V4h6V0H6v6H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2z"/></g>
+<g id="menu"><path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"/></g>
+<g id="more-horiz"><path d="M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></g>
+<g id="more-vert"><path d="M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></g>
+<g id="motorcycle"><path d="M19.44 9.03L15.41 5H11v2h3.59l2 2H5c-2.8 0-5 2.2-5 5s2.2 5 5 5c2.46 0 4.45-1.69 4.9-4h1.65l2.77-2.77c-.21.54-.32 1.14-.32 1.77 0 2.8 2.2 5 5 5s5-2.2 5-5c0-2.65-1.97-4.77-4.56-4.97zM7.82 15C7.4 16.15 6.28 17 5 17c-1.63 0-3-1.37-3-3s1.37-3 3-3c1.28 0 2.4.85 2.82 2H5v2h2.82zM19 17c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3z"/></g>
+<g id="move-to-inbox"><path d="M19 3H4.99c-1.11 0-1.98.9-1.98 2L3 19c0 1.1.88 2 1.99 2H19c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 12h-4c0 1.66-1.35 3-3 3s-3-1.34-3-3H4.99V5H19v10zm-3-5h-2V7h-4v3H8l4 4 4-4z"/></g>
+<g id="next-week"><path d="M20 7h-4V5c0-.55-.22-1.05-.59-1.41C15.05 3.22 14.55 3 14 3h-4c-1.1 0-2 .9-2 2v2H4c-1.1 0-2 .9-2 2v11c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V9c0-1.1-.9-2-2-2zM10 5h4v2h-4V5zm1 13.5l-1-1 3-3-3-3 1-1 4 4-4 4z"/></g>
+<g id="note-add"><path d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 14h-3v3h-2v-3H8v-2h3v-3h2v3h3v2zm-3-7V3.5L18.5 9H13z"/></g>
+<g id="offline-pin"><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zm5 16H7v-2h10v2zm-6.7-4L7 10.7l1.4-1.4 1.9 1.9 5.3-5.3L17 7.3 10.3 14z"/></g>
+<g id="opacity"><path d="M17.66 8L12 2.35 6.34 8C4.78 9.56 4 11.64 4 13.64s.78 4.11 2.34 5.67 3.61 2.35 5.66 2.35 4.1-.79 5.66-2.35S20 15.64 20 13.64 19.22 9.56 17.66 8zM6 14c.01-2 .62-3.27 1.76-4.4L12 5.27l4.24 4.38C17.38 10.77 17.99 12 18 14H6z"/></g>
+<g id="open-in-browser"><path d="M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h4v-2H5V8h14v10h-4v2h4c1.1 0 2-.9 2-2V6c0-1.1-.89-2-2-2zm-7 6l-4 4h3v6h2v-6h3l-4-4z"/></g>
+<g id="open-in-new"><path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"/></g>
+<g id="open-with"><path d="M10 9h4V6h3l-5-5-5 5h3v3zm-1 1H6V7l-5 5 5 5v-3h3v-4zm14 2l-5-5v3h-3v4h3v3l5-5zm-9 3h-4v3H7l5 5 5-5h-3v-3z"/></g>
+<g id="pageview"><path d="M11.5 9C10.12 9 9 10.12 9 11.5s1.12 2.5 2.5 2.5 2.5-1.12 2.5-2.5S12.88 9 11.5 9zM20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-3.21 14.21l-2.91-2.91c-.69.44-1.51.7-2.39.7C9.01 16 7 13.99 7 11.5S9.01 7 11.5 7 16 9.01 16 11.5c0 .88-.26 1.69-.7 2.39l2.91 2.9-1.42 1.42z"/></g>
+<g id="pan-tool"><path d="M23 5.5V20c0 2.2-1.8 4-4 4h-7.3c-1.08 0-2.1-.43-2.85-1.19L1 14.83s1.26-1.23 1.3-1.25c.22-.19.49-.29.79-.29.22 0 .42.06.6.16.04.01 4.31 2.46 4.31 2.46V4c0-.83.67-1.5 1.5-1.5S11 3.17 11 4v7h1V1.5c0-.83.67-1.5 1.5-1.5S15 .67 15 1.5V11h1V2.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5V11h1V5.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5z"/></g>
+<g id="payment"><path d="M20 4H4c-1.11 0-1.99.89-1.99 2L2 18c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6c0-1.11-.89-2-2-2zm0 14H4v-6h16v6zm0-10H4V6h16v2z"/></g>
+<g id="perm-camera-mic"><path d="M20 5h-3.17L15 3H9L7.17 5H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h7v-2.09c-2.83-.48-5-2.94-5-5.91h2c0 2.21 1.79 4 4 4s4-1.79 4-4h2c0 2.97-2.17 5.43-5 5.91V21h7c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm-6 8c0 1.1-.9 2-2 2s-2-.9-2-2V9c0-1.1.9-2 2-2s2 .9 2 2v4z"/></g>
+<g id="perm-contact-calendar"><path d="M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12H6v-1c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1z"/></g>
+<g id="perm-data-setting"><path d="M18.99 11.5c.34 0 .67.03 1 .07L20 0 0 20h11.56c-.04-.33-.07-.66-.07-1 0-4.14 3.36-7.5 7.5-7.5zm3.71 7.99c.02-.16.04-.32.04-.49 0-.17-.01-.33-.04-.49l1.06-.83c.09-.08.12-.21.06-.32l-1-1.73c-.06-.11-.19-.15-.31-.11l-1.24.5c-.26-.2-.54-.37-.85-.49l-.19-1.32c-.01-.12-.12-.21-.24-.21h-2c-.12 0-.23.09-.25.21l-.19 1.32c-.3.13-.59.29-.85.49l-1.24-.5c-.11-.04-.24 0-.31.11l-1 1.73c-.06.11-.04.24.06.32l1.06.83c-.02.16-.03.32-.03.49 0 .17.01.33.03.49l-1.06.83c-.09.08-.12.21-.06.32l1 1.73c.06.11.19.15.31.11l1.24-.5c.26.2.54.37.85.49l.19 1.32c.02.12.12.21.25.21h2c.12 0 .23-.09.25-.21l.19-1.32c.3-.13.59-.29.84-.49l1.25.5c.11.04.24 0 .31-.11l1-1.73c.06-.11.03-.24-.06-.32l-1.07-.83zm-3.71 1.01c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"/></g>
+<g id="perm-device-information"><path d="M13 7h-2v2h2V7zm0 4h-2v6h2v-6zm4-9.99L7 1c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM17 19H7V5h10v14z"/></g>
+<g id="perm-identity"><path d="M12 5.9c1.16 0 2.1.94 2.1 2.1s-.94 2.1-2.1 2.1S9.9 9.16 9.9 8s.94-2.1 2.1-2.1m0 9c2.97 0 6.1 1.46 6.1 2.1v1.1H5.9V17c0-.64 3.13-2.1 6.1-2.1M12 4C9.79 4 8 5.79 8 8s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 9c-2.67 0-8 1.34-8 4v3h16v-3c0-2.66-5.33-4-8-4z"/></g>
+<g id="perm-media"><path d="M2 6H0v5h.01L0 20c0 1.1.9 2 2 2h18v-2H2V6zm20-2h-8l-2-2H6c-1.1 0-1.99.9-1.99 2L4 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM7 15l4.5-6 3.5 4.51 2.5-3.01L21 15H7z"/></g>
+<g id="perm-phone-msg"><path d="M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.58l2.2-2.21c.28-.27.36-.66.25-1.01C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zM12 3v10l3-3h6V3h-9z"/></g>
+<g id="perm-scan-wifi"><path d="M12 3C6.95 3 3.15 4.85 0 7.23L12 22 24 7.25C20.85 4.87 17.05 3 12 3zm1 13h-2v-6h2v6zm-2-8V6h2v2h-2z"/></g>
+<g id="pets"><circle cx="4.5" cy="9.5" r="2.5"/><circle cx="9" cy="5.5" r="2.5"/><circle cx="15" cy="5.5" r="2.5"/><circle cx="19.5" cy="9.5" r="2.5"/><path d="M17.34 14.86c-.87-1.02-1.6-1.89-2.48-2.91-.46-.54-1.05-1.08-1.75-1.32-.11-.04-.22-.07-.33-.09-.25-.04-.52-.04-.78-.04s-.53 0-.79.05c-.11.02-.22.05-.33.09-.7.24-1.28.78-1.75 1.32-.87 1.02-1.6 1.89-2.48 2.91-1.31 1.31-2.92 2.76-2.62 4.79.29 1.02 1.02 2.03 2.33 2.32.73.15 3.06-.44 5.54-.44h.18c2.48 0 4.81.58 5.54.44 1.31-.29 2.04-1.31 2.33-2.32.31-2.04-1.3-3.49-2.61-4.8z"/></g>
+<g id="picture-in-picture"><path d="M19 7h-8v6h8V7zm2-4H3c-1.1 0-2 .9-2 2v14c0 1.1.9 1.98 2 1.98h18c1.1 0 2-.88 2-1.98V5c0-1.1-.9-2-2-2zm0 16.01H3V4.98h18v14.03z"/></g>
+<g id="picture-in-picture-alt"><path d="M19 11h-8v6h8v-6zm4 8V4.98C23 3.88 22.1 3 21 3H3c-1.1 0-2 .88-2 1.98V19c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2zm-2 .02H3V4.97h18v14.05z"/></g>
+<g id="play-for-work"><path d="M11 5v5.59H7.5l4.5 4.5 4.5-4.5H13V5h-2zm-5 9c0 3.31 2.69 6 6 6s6-2.69 6-6h-2c0 2.21-1.79 4-4 4s-4-1.79-4-4H6z"/></g>
+<g id="polymer"><path d="M19 4h-4L7.11 16.63 4.5 12 9 4H5L.5 12 5 20h4l7.89-12.63L19.5 12 15 20h4l4.5-8z"/></g>
+<g id="power-settings-new"><path d="M13 3h-2v10h2V3zm4.83 2.17l-1.42 1.42C17.99 7.86 19 9.81 19 12c0 3.87-3.13 7-7 7s-7-3.13-7-7c0-2.19 1.01-4.14 2.58-5.42L6.17 5.17C4.23 6.82 3 9.26 3 12c0 4.97 4.03 9 9 9s9-4.03 9-9c0-2.74-1.23-5.18-3.17-6.83z"/></g>
+<g id="pregnant-woman"><path d="M9 4c0-1.11.89-2 2-2s2 .89 2 2-.89 2-2 2-2-.89-2-2zm7 9c-.01-1.34-.83-2.51-2-3 0-1.66-1.34-3-3-3s-3 1.34-3 3v7h2v5h3v-5h3v-4z"/></g>
+<g id="print"><path d="M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z"/></g>
+<g id="query-builder"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z"/></g>
+<g id="question-answer"><path d="M21 6h-2v9H6v2c0 .55.45 1 1 1h11l4 4V7c0-.55-.45-1-1-1zm-4 6V3c0-.55-.45-1-1-1H3c-.55 0-1 .45-1 1v14l4-4h10c.55 0 1-.45 1-1z"/></g>
+<g id="radio-button-checked"><path d="M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zm0-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"/></g>
+<g id="radio-button-unchecked"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"/></g>
+<g id="receipt"><path d="M18 17H6v-2h12v2zm0-4H6v-2h12v2zm0-4H6V7h12v2zM3 22l1.5-1.5L6 22l1.5-1.5L9 22l1.5-1.5L12 22l1.5-1.5L15 22l1.5-1.5L18 22l1.5-1.5L21 22V2l-1.5 1.5L18 2l-1.5 1.5L15 2l-1.5 1.5L12 2l-1.5 1.5L9 2 7.5 3.5 6 2 4.5 3.5 3 2v20z"/></g>
+<g id="record-voice-over"><circle cx="9" cy="9" r="4"/><path d="M9 15c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4zm7.76-9.64l-1.68 1.69c.84 1.18.84 2.71 0 3.89l1.68 1.69c2.02-2.02 2.02-5.07 0-7.27zM20.07 2l-1.63 1.63c2.77 3.02 2.77 7.56 0 10.74L20.07 16c3.9-3.89 3.91-9.95 0-14z"/></g>
+<g id="redeem"><path d="M20 6h-2.18c.11-.31.18-.65.18-1 0-1.66-1.34-3-3-3-1.05 0-1.96.54-2.5 1.35l-.5.67-.5-.68C10.96 2.54 10.05 2 9 2 7.34 2 6 3.34 6 5c0 .35.07.69.18 1H4c-1.11 0-1.99.89-1.99 2L2 19c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zm-5-2c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zM9 4c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm11 15H4v-2h16v2zm0-5H4V8h5.08L7 10.83 8.62 12 11 8.76l1-1.36 1 1.36L15.38 12 17 10.83 14.92 8H20v6z"/></g>
+<g id="redo"><path d="M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22L3.9 16c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88L13 16h9V7l-3.6 3.6z"/></g>
+<g id="refresh"><path d="M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"/></g>
+<g id="remove"><path d="M19 13H5v-2h14v2z"/></g>
+<g id="remove-circle"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11H7v-2h10v2z"/></g>
+<g id="remove-circle-outline"><path d="M7 11v2h10v-2H7zm5-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></g>
+<g id="remove-shopping-cart"><path d="M22.73 22.73L2.77 2.77 2 2l-.73-.73L0 2.54l4.39 4.39 2.21 4.66-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h7.46l1.38 1.38c-.5.36-.83.95-.83 1.62 0 1.1.89 2 1.99 2 .67 0 1.26-.33 1.62-.84L21.46 24l1.27-1.27zM7.42 15c-.14 0-.25-.11-.25-.25l.03-.12.9-1.63h2.36l2 2H7.42zm8.13-2c.75 0 1.41-.41 1.75-1.03l3.58-6.49c.08-.14.12-.31.12-.48 0-.55-.45-1-1-1H6.54l9.01 9zM7 18c-1.1 0-1.99.9-1.99 2S5.9 22 7 22s2-.9 2-2-.9-2-2-2z"/></g>
+<g id="reorder"><path d="M3 15h18v-2H3v2zm0 4h18v-2H3v2zm0-8h18V9H3v2zm0-6v2h18V5H3z"/></g>
+<g id="reply"><path d="M10 9V5l-7 7 7 7v-4.1c5 0 8.5 1.6 11 5.1-1-5-4-10-11-11z"/></g>
+<g id="reply-all"><path d="M7 8V5l-7 7 7 7v-3l-4-4 4-4zm6 1V5l-7 7 7 7v-4.1c5 0 8.5 1.6 11 5.1-1-5-4-10-11-11z"/></g>
+<g id="report"><path d="M15.73 3H8.27L3 8.27v7.46L8.27 21h7.46L21 15.73V8.27L15.73 3zM12 17.3c-.72 0-1.3-.58-1.3-1.3 0-.72.58-1.3 1.3-1.3.72 0 1.3.58 1.3 1.3 0 .72-.58 1.3-1.3 1.3zm1-4.3h-2V7h2v6z"/></g>
+<g id="report-problem"><path d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"/></g>
+<g id="restore"><path d="M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"/></g>
+<g id="restore-page"><path d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm-2 16c-2.05 0-3.81-1.24-4.58-3h1.71c.63.9 1.68 1.5 2.87 1.5 1.93 0 3.5-1.57 3.5-3.5S13.93 9.5 12 9.5c-1.35 0-2.52.78-3.1 1.9l1.6 1.6h-4V9l1.3 1.3C8.69 8.92 10.23 8 12 8c2.76 0 5 2.24 5 5s-2.24 5-5 5z"/></g>
+<g id="room"><path d="M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z"/></g>
+<g id="rounded-corner"><path d="M19 19h2v2h-2v-2zm0-2h2v-2h-2v2zM3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm0-4h2V3H3v2zm4 0h2V3H7v2zm8 16h2v-2h-2v2zm-4 0h2v-2h-2v2zm4 0h2v-2h-2v2zm-8 0h2v-2H7v2zm-4 0h2v-2H3v2zM21 8c0-2.76-2.24-5-5-5h-5v2h5c1.65 0 3 1.35 3 3v5h2V8z"/></g>
+<g id="rowing"><path d="M8.5 14.5L4 19l1.5 1.5L9 17h2l-2.5-2.5zM15 1c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 20.01L18 24l-2.99-3.01V19.5l-7.1-7.09c-.31.05-.61.07-.91.07v-2.16c1.66.03 3.61-.87 4.67-2.04l1.4-1.55c.19-.21.43-.38.69-.5.29-.14.62-.23.96-.23h.03C15.99 6.01 17 7.02 17 8.26v5.75c0 .84-.35 1.61-.92 2.16l-3.58-3.58v-2.27c-.63.52-1.43 1.02-2.29 1.39L16.5 18H18l3 3.01z"/></g>
+<g id="save"><path d="M17 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V7l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10H5V5h10v4z"/></g>
+<g id="schedule"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z"/></g>
+<g id="search"><path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/></g>
+<g id="select-all"><path d="M3 5h2V3c-1.1 0-2 .9-2 2zm0 8h2v-2H3v2zm4 8h2v-2H7v2zM3 9h2V7H3v2zm10-6h-2v2h2V3zm6 0v2h2c0-1.1-.9-2-2-2zM5 21v-2H3c0 1.1.9 2 2 2zm-2-4h2v-2H3v2zM9 3H7v2h2V3zm2 18h2v-2h-2v2zm8-8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zm0-12h2V7h-2v2zm0 8h2v-2h-2v2zm-4 4h2v-2h-2v2zm0-16h2V3h-2v2zM7 17h10V7H7v10zm2-8h6v6H9V9z"/></g>
+<g id="send"><path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/></g>
+<g id="settings"><path d="M19.43 12.98c.04-.32.07-.64.07-.98s-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.3-.61-.22l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65C14.46 2.18 14.25 2 14 2h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69.98l-2.49-1c-.23-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98s.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49-.42l.38-2.65c.61-.25 1.17-.59 1.69-.98l2.49 1c.23.09.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.65zM12 15.5c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z"/></g>
+<g id="settings-applications"><path d="M12 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm7-7H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-1.75 9c0 .23-.02.46-.05.68l1.48 1.16c.13.11.17.3.08.45l-1.4 2.42c-.09.15-.27.21-.43.15l-1.74-.7c-.36.28-.76.51-1.18.69l-.26 1.85c-.03.17-.18.3-.35.3h-2.8c-.17 0-.32-.13-.35-.29l-.26-1.85c-.43-.18-.82-.41-1.18-.69l-1.74.7c-.16.06-.34 0-.43-.15l-1.4-2.42c-.09-.15-.05-.34.08-.45l1.48-1.16c-.03-.23-.05-.46-.05-.69 0-.23.02-.46.05-.68l-1.48-1.16c-.13-.11-.17-.3-.08-.45l1.4-2.42c.09-.15.27-.21.43-.15l1.74.7c.36-.28.76-.51 1.18-.69l.26-1.85c.03-.17.18-.3.35-.3h2.8c.17 0 .32.13.35.29l.26 1.85c.43.18.82.41 1.18.69l1.74-.7c.16-.06.34 0 .43.15l1.4 2.42c.09.15.05.34-.08.45l-1.48 1.16c.03.23.05.46.05.69z"/></g>
+<g id="settings-backup-restore"><path d="M14 12c0-1.1-.9-2-2-2s-2 .9-2 2 .9 2 2 2 2-.9 2-2zm-2-9c-4.97 0-9 4.03-9 9H0l4 4 4-4H5c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.51 0-2.91-.49-4.06-1.3l-1.42 1.44C8.04 20.3 9.94 21 12 21c4.97 0 9-4.03 9-9s-4.03-9-9-9z"/></g>
+<g id="settings-bluetooth"><path d="M11 24h2v-2h-2v2zm-4 0h2v-2H7v2zm8 0h2v-2h-2v2zm2.71-18.29L12 0h-1v7.59L6.41 3 5 4.41 10.59 10 5 15.59 6.41 17 11 12.41V20h1l5.71-5.71-4.3-4.29 4.3-4.29zM13 3.83l1.88 1.88L13 7.59V3.83zm1.88 10.46L13 16.17v-3.76l1.88 1.88z"/></g>
+<g id="settings-brightness"><path d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16.01H3V4.99h18v14.02zM8 16h2.5l1.5 1.5 1.5-1.5H16v-2.5l1.5-1.5-1.5-1.5V8h-2.5L12 6.5 10.5 8H8v2.5L6.5 12 8 13.5V16zm4-7c1.66 0 3 1.34 3 3s-1.34 3-3 3V9z"/></g>
+<g id="settings-cell"><path d="M7 24h2v-2H7v2zm4 0h2v-2h-2v2zm4 0h2v-2h-2v2zM16 .01L8 0C6.9 0 6 .9 6 2v16c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V2c0-1.1-.9-1.99-2-1.99zM16 16H8V4h8v12z"/></g>
+<g id="settings-ethernet"><path d="M7.77 6.76L6.23 5.48.82 12l5.41 6.52 1.54-1.28L3.42 12l4.35-5.24zM7 13h2v-2H7v2zm10-2h-2v2h2v-2zm-6 2h2v-2h-2v2zm6.77-7.52l-1.54 1.28L20.58 12l-4.35 5.24 1.54 1.28L23.18 12l-5.41-6.52z"/></g>
+<g id="settings-input-antenna"><path d="M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm1 9.29c.88-.39 1.5-1.26 1.5-2.29 0-1.38-1.12-2.5-2.5-2.5S9.5 10.62 9.5 12c0 1.02.62 1.9 1.5 2.29v3.3L7.59 21 9 22.41l3-3 3 3L16.41 21 13 17.59v-3.3zM12 1C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11z"/></g>
+<g id="settings-input-component"><path d="M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4H1v6h6V6H5V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2H9v2zm-8 0c0 1.3.84 2.4 2 2.82V23h2v-4.18C6.16 18.4 7 17.3 7 16v-2H1v2zM21 6V2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6V6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4H9v6h6V6h-2V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z"/></g>
+<g id="settings-input-composite"><path d="M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4H1v6h6V6H5V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2H9v2zm-8 0c0 1.3.84 2.4 2 2.82V23h2v-4.18C6.16 18.4 7 17.3 7 16v-2H1v2zM21 6V2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6V6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4H9v6h6V6h-2V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z"/></g>
+<g id="settings-input-hdmi"><path d="M18 7V4c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v3H5v6l3 6v3h8v-3l3-6V7h-1zM8 4h8v3h-2V5h-1v2h-2V5h-1v2H8V4z"/></g>
+<g id="settings-input-svideo"><path d="M8 11.5c0-.83-.67-1.5-1.5-1.5S5 10.67 5 11.5 5.67 13 6.5 13 8 12.33 8 11.5zm7-5c0-.83-.67-1.5-1.5-1.5h-3C9.67 5 9 5.67 9 6.5S9.67 8 10.5 8h3c.83 0 1.5-.67 1.5-1.5zM8.5 15c-.83 0-1.5.67-1.5 1.5S7.67 18 8.5 18s1.5-.67 1.5-1.5S9.33 15 8.5 15zM12 1C5.93 1 1 5.93 1 12s4.93 11 11 11 11-4.93 11-11S18.07 1 12 1zm0 20c-4.96 0-9-4.04-9-9s4.04-9 9-9 9 4.04 9 9-4.04 9-9 9zm5.5-11c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm-2 5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5z"/></g>
+<g id="settings-overscan"><path d="M12.01 5.5L10 8h4l-1.99-2.5zM18 10v4l2.5-1.99L18 10zM6 10l-2.5 2.01L6 14v-4zm8 6h-4l2.01 2.5L14 16zm7-13H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16.01H3V4.99h18v14.02z"/></g>
+<g id="settings-phone"><path d="M13 9h-2v2h2V9zm4 0h-2v2h2V9zm3 6.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.58l2.2-2.21c.28-.27.36-.66.25-1.01C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zM19 9v2h2V9h-2z"/></g>
+<g id="settings-power"><path d="M7 24h2v-2H7v2zm4 0h2v-2h-2v2zm2-22h-2v10h2V2zm3.56 2.44l-1.45 1.45C16.84 6.94 18 8.83 18 11c0 3.31-2.69 6-6 6s-6-2.69-6-6c0-2.17 1.16-4.06 2.88-5.12L7.44 4.44C5.36 5.88 4 8.28 4 11c0 4.42 3.58 8 8 8s8-3.58 8-8c0-2.72-1.36-5.12-3.44-6.56zM15 24h2v-2h-2v2z"/></g>
+<g id="settings-remote"><path d="M15 9H9c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h6c.55 0 1-.45 1-1V10c0-.55-.45-1-1-1zm-3 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zM7.05 6.05l1.41 1.41C9.37 6.56 10.62 6 12 6s2.63.56 3.54 1.46l1.41-1.41C15.68 4.78 13.93 4 12 4s-3.68.78-4.95 2.05zM12 0C8.96 0 6.21 1.23 4.22 3.22l1.41 1.41C7.26 3.01 9.51 2 12 2s4.74 1.01 6.36 2.64l1.41-1.41C17.79 1.23 15.04 0 12 0z"/></g>
+<g id="settings-voice"><path d="M7 24h2v-2H7v2zm5-11c1.66 0 2.99-1.34 2.99-3L15 4c0-1.66-1.34-3-3-3S9 2.34 9 4v6c0 1.66 1.34 3 3 3zm-1 11h2v-2h-2v2zm4 0h2v-2h-2v2zm4-14h-1.7c0 3-2.54 5.1-5.3 5.1S6.7 13 6.7 10H5c0 3.41 2.72 6.23 6 6.72V20h2v-3.28c3.28-.49 6-3.31 6-6.72z"/></g>
+<g id="shop"><path d="M16 6V4c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2H2v13c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6h-6zm-6-2h4v2h-4V4zM9 18V9l7.5 4L9 18z"/></g>
+<g id="shop-two"><path d="M3 9H1v11c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2H3V9zm15-4V3c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2H5v11c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2V5h-5zm-6-2h4v2h-4V3zm0 12V8l5.5 3-5.5 4z"/></g>
+<g id="shopping-basket"><path d="M17.21 9l-4.38-6.56c-.19-.28-.51-.42-.83-.42-.32 0-.64.14-.83.43L6.79 9H2c-.55 0-1 .45-1 1 0 .09.01.18.04.27l2.54 9.27c.23.84 1 1.46 1.92 1.46h13c.92 0 1.69-.62 1.93-1.46l2.54-9.27L23 10c0-.55-.45-1-1-1h-4.79zM9 9l3-4.4L15 9H9zm3 8c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z"/></g>
+<g id="shopping-cart"><path d="M7 18c-1.1 0-1.99.9-1.99 2S5.9 22 7 22s2-.9 2-2-.9-2-2-2zM1 2v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2H7.42c-.14 0-.25-.11-.25-.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.58-6.49c.08-.14.12-.31.12-.48 0-.55-.45-1-1-1H5.21l-.94-2H1zm16 16c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2z"/></g>
+<g id="sort"><path d="M3 18h6v-2H3v2zM3 6v2h18V6H3zm0 7h12v-2H3v2z"/></g>
+<g id="speaker-notes"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM8 14H6v-2h2v2zm0-3H6V9h2v2zm0-3H6V6h2v2zm7 6h-5v-2h5v2zm3-3h-8V9h8v2zm0-3h-8V6h8v2z"/></g>
+<g id="speaker-notes-off"><path d="M10.54 11l-.54-.54L7.54 8 6 6.46 2.38 2.84 1.27 1.73 0 3l2.01 2.01L2 22l4-4h9l5.73 5.73L22 22.46 17.54 18l-7-7zM8 14H6v-2h2v2zm-2-3V9l2 2H6zm14-9H4.08L10 7.92V6h8v2h-7.92l1 1H18v2h-4.92l6.99 6.99C21.14 17.95 22 17.08 22 16V4c0-1.1-.9-2-2-2z"/></g>
+<g id="spellcheck"><path d="M12.45 16h2.09L9.43 3H7.57L2.46 16h2.09l1.12-3h5.64l1.14 3zm-6.02-5L8.5 5.48 10.57 11H6.43zm15.16.59l-8.09 8.09L9.83 16l-1.41 1.41 5.09 5.09L23 13l-1.41-1.41z"/></g>
+<g id="star"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></g>
+<g id="star-border"><path d="M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4l-3.76 2.27 1-4.28-3.32-2.88 4.38-.38L12 6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z"/></g>
+<g id="star-half"><path d="M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4V6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z"/></g>
+<g id="stars"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zm4.24 16L12 15.45 7.77 18l1.12-4.81-3.73-3.23 4.92-.42L12 5l1.92 4.53 4.92.42-3.73 3.23L16.23 18z"/></g>
+<g id="store"><path d="M20 4H4v2h16V4zm1 10v-2l-1-5H4l-1 5v2h1v6h10v-6h4v6h2v-6h1zm-9 4H6v-4h6v4z"/></g>
+<g id="subdirectory-arrow-left"><path d="M11 9l1.42 1.42L8.83 14H18V4h2v12H8.83l3.59 3.58L11 21l-6-6 6-6z"/></g>
+<g id="subdirectory-arrow-right"><path d="M19 15l-6 6-1.42-1.42L15.17 16H4V4h2v10h9.17l-3.59-3.58L13 9l6 6z"/></g>
+<g id="subject"><path d="M14 17H4v2h10v-2zm6-8H4v2h16V9zM4 15h16v-2H4v2zM4 5v2h16V5H4z"/></g>
+<g id="supervisor-account"><path d="M16.5 12c1.38 0 2.49-1.12 2.49-2.5S17.88 7 16.5 7C15.12 7 14 8.12 14 9.5s1.12 2.5 2.5 2.5zM9 11c1.66 0 2.99-1.34 2.99-3S10.66 5 9 5C7.34 5 6 6.34 6 8s1.34 3 3 3zm7.5 3c-1.83 0-5.5.92-5.5 2.75V19h11v-2.25c0-1.83-3.67-2.75-5.5-2.75zM9 13c-2.33 0-7 1.17-7 3.5V19h7v-2.25c0-.85.33-2.34 2.37-3.47C10.5 13.1 9.66 13 9 13z"/></g>
+<g id="swap-horiz"><path d="M6.99 11L3 15l3.99 4v-3H14v-2H6.99v-3zM21 9l-3.99-4v3H10v2h7.01v3L21 9z"/></g>
+<g id="swap-vert"><path d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99h-3zM9 3L5 6.99h3V14h2V6.99h3L9 3z"/></g>
+<g id="swap-vertical-circle"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM6.5 9L10 5.5 13.5 9H11v4H9V9H6.5zm11 6L14 18.5 10.5 15H13v-4h2v4h2.5z"/></g>
+<g id="system-update-alt"><path d="M12 16.5l4-4h-3v-9h-2v9H8l4 4zm9-13h-6v1.99h6v14.03H3V5.49h6V3.5H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2z"/></g>
+<g id="tab"><path d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3V5h10v4h8v10z"/></g>
+<g id="tab-unselected"><path d="M1 9h2V7H1v2zm0 4h2v-2H1v2zm0-8h2V3c-1.1 0-2 .9-2 2zm8 16h2v-2H9v2zm-8-4h2v-2H1v2zm2 4v-2H1c0 1.1.9 2 2 2zM21 3h-8v6h10V5c0-1.1-.9-2-2-2zm0 14h2v-2h-2v2zM9 5h2V3H9v2zM5 21h2v-2H5v2zM5 5h2V3H5v2zm16 16c1.1 0 2-.9 2-2h-2v2zm0-8h2v-2h-2v2zm-8 8h2v-2h-2v2zm4 0h2v-2h-2v2z"/></g>
+<g id="text-format"><path d="M5 17v2h14v-2H5zm4.5-4.2h5l.9 2.2h2.1L12.75 4h-1.5L6.5 15h2.1l.9-2.2zM12 5.98L13.87 11h-3.74L12 5.98z"/></g>
+<g id="theaters"><path d="M18 3v2h-2V3H8v2H6V3H4v18h2v-2h2v2h8v-2h2v2h2V3h-2zM8 17H6v-2h2v2zm0-4H6v-2h2v2zm0-4H6V7h2v2zm10 8h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2V7h2v2z"/></g>
+<g id="thumb-down"><path d="M15 3H6c-.83 0-1.54.5-1.84 1.22l-3.02 7.05c-.09.23-.14.47-.14.73v1.91l.01.01L1 14c0 1.1.9 2 2 2h6.31l-.95 4.57-.03.32c0 .41.17.79.44 1.06L9.83 23l6.59-6.59c.36-.36.58-.86.58-1.41V5c0-1.1-.9-2-2-2zm4 0v12h4V3h-4z"/></g>
+<g id="thumb-up"><path d="M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-1.91l-.01-.01L23 10z"/></g>
+<g id="thumbs-up-down"><path d="M12 6c0-.55-.45-1-1-1H5.82l.66-3.18.02-.23c0-.31-.13-.59-.33-.8L5.38 0 .44 4.94C.17 5.21 0 5.59 0 6v6.5c0 .83.67 1.5 1.5 1.5h6.75c.62 0 1.15-.38 1.38-.91l2.26-5.29c.07-.17.11-.36.11-.55V6zm10.5 4h-6.75c-.62 0-1.15.38-1.38.91l-2.26 5.29c-.07.17-.11.36-.11.55V18c0 .55.45 1 1 1h5.18l-.66 3.18-.02.24c0 .31.13.59.33.8l.79.78 4.94-4.94c.27-.27.44-.65.44-1.06v-6.5c0-.83-.67-1.5-1.5-1.5z"/></g>
+<g id="timeline"><path d="M23 8c0 1.1-.9 2-2 2-.18 0-.35-.02-.51-.07l-3.56 3.55c.05.16.07.34.07.52 0 1.1-.9 2-2 2s-2-.9-2-2c0-.18.02-.36.07-.52l-2.55-2.55c-.16.05-.34.07-.52.07s-.36-.02-.52-.07l-4.55 4.56c.05.16.07.33.07.51 0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2c.18 0 .35.02.51.07l4.56-4.55C8.02 9.36 8 9.18 8 9c0-1.1.9-2 2-2s2 .9 2 2c0 .18-.02.36-.07.52l2.55 2.55c.16-.05.34-.07.52-.07s.36.02.52.07l3.55-3.56C19.02 8.35 19 8.18 19 8c0-1.1.9-2 2-2s2 .9 2 2z"/></g>
+<g id="toc"><path d="M3 9h14V7H3v2zm0 4h14v-2H3v2zm0 4h14v-2H3v2zm16 0h2v-2h-2v2zm0-10v2h2V7h-2zm0 6h2v-2h-2v2z"/></g>
+<g id="today"><path d="M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM7 10h5v5H7z"/></g>
+<g id="toll"><path d="M15 4c-4.42 0-8 3.58-8 8s3.58 8 8 8 8-3.58 8-8-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6zM3 12c0-2.61 1.67-4.83 4-5.65V4.26C3.55 5.15 1 8.27 1 12s2.55 6.85 6 7.74v-2.09c-2.33-.82-4-3.04-4-5.65z"/></g>
+<g id="touch-app"><path d="M9 11.24V7.5C9 6.12 10.12 5 11.5 5S14 6.12 14 7.5v3.74c1.21-.81 2-2.18 2-3.74C16 5.01 13.99 3 11.5 3S7 5.01 7 7.5c0 1.56.79 2.93 2 3.74zm9.84 4.63l-4.54-2.26c-.17-.07-.35-.11-.54-.11H13v-6c0-.83-.67-1.5-1.5-1.5S10 6.67 10 7.5v10.74l-3.43-.72c-.08-.01-.15-.03-.24-.03-.31 0-.59.13-.79.33l-.79.8 4.94 4.94c.27.27.65.44 1.06.44h6.79c.75 0 1.33-.55 1.44-1.28l.75-5.27c.01-.07.02-.14.02-.2 0-.62-.38-1.16-.91-1.38z"/></g>
+<g id="track-changes"><path d="M19.07 4.93l-1.41 1.41C19.1 7.79 20 9.79 20 12c0 4.42-3.58 8-8 8s-8-3.58-8-8c0-4.08 3.05-7.44 7-7.93v2.02C8.16 6.57 6 9.03 6 12c0 3.31 2.69 6 6 6s6-2.69 6-6c0-1.66-.67-3.16-1.76-4.24l-1.41 1.41C15.55 9.9 16 10.9 16 12c0 2.21-1.79 4-4 4s-4-1.79-4-4c0-1.86 1.28-3.41 3-3.86v2.14c-.6.35-1 .98-1 1.72 0 1.1.9 2 2 2s2-.9 2-2c0-.74-.4-1.38-1-1.72V2h-1C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10c0-2.76-1.12-5.26-2.93-7.07z"/></g>
+<g id="translate"><path d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"/></g>
+<g id="trending-down"><path d="M16 18l2.29-2.29-4.88-4.88-4 4L2 7.41 3.41 6l6 6 4-4 6.3 6.29L22 12v6z"/></g>
+<g id="trending-flat"><path d="M22 12l-4-4v3H3v2h15v3z"/></g>
+<g id="trending-up"><path d="M16 6l2.29 2.29-4.88 4.88-4-4L2 16.59 3.41 18l6-6 4 4 6.3-6.29L22 12V6z"/></g>
+<g id="turned-in"><path d="M17 3H7c-1.1 0-1.99.9-1.99 2L5 21l7-3 7 3V5c0-1.1-.9-2-2-2z"/></g>
+<g id="turned-in-not"><path d="M17 3H7c-1.1 0-1.99.9-1.99 2L5 21l7-3 7 3V5c0-1.1-.9-2-2-2zm0 15l-5-2.18L7 18V5h10v13z"/></g>
+<g id="unarchive"><path d="M20.55 5.22l-1.39-1.68C18.88 3.21 18.47 3 18 3H6c-.47 0-.88.21-1.15.55L3.46 5.22C3.17 5.57 3 6.01 3 6.5V19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6.5c0-.49-.17-.93-.45-1.28zM12 9.5l5.5 5.5H14v2h-4v-2H6.5L12 9.5zM5.12 5l.82-1h12l.93 1H5.12z"/></g>
+<g id="undo"><path d="M12.5 8c-2.65 0-5.05.99-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"/></g>
+<g id="unfold-less"><path d="M7.41 18.59L8.83 20 12 16.83 15.17 20l1.41-1.41L12 14l-4.59 4.59zm9.18-13.18L15.17 4 12 7.17 8.83 4 7.41 5.41 12 10l4.59-4.59z"/></g>
+<g id="unfold-more"><path d="M12 5.83L15.17 9l1.41-1.41L12 3 7.41 7.59 8.83 9 12 5.83zm0 12.34L8.83 15l-1.41 1.41L12 21l4.59-4.59L15.17 15 12 18.17z"/></g>
+<g id="update"><path d="M21 10.12h-6.78l2.74-2.82c-2.73-2.7-7.15-2.8-9.88-.1-2.73 2.71-2.73 7.08 0 9.79 2.73 2.71 7.15 2.71 9.88 0C18.32 15.65 19 14.08 19 12.1h2c0 1.98-.88 4.55-2.64 6.29-3.51 3.48-9.21 3.48-12.72 0-3.5-3.47-3.53-9.11-.02-12.58 3.51-3.47 9.14-3.47 12.65 0L21 3v7.12zM12.5 8v4.25l3.5 2.08-.72 1.21L11 13V8h1.5z"/></g>
+<g id="verified-user"><path d="M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm-2 16l-4-4 1.41-1.41L10 14.17l6.59-6.59L18 9l-8 8z"/></g>
+<g id="view-agenda"><path d="M20 13H3c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zm0-10H3c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1V4c0-.55-.45-1-1-1z"/></g>
+<g id="view-array"><path d="M4 18h3V5H4v13zM18 5v13h3V5h-3zM8 18h9V5H8v13z"/></g>
+<g id="view-carousel"><path d="M7 19h10V4H7v15zm-5-2h4V6H2v11zM18 6v11h4V6h-4z"/></g>
+<g id="view-column"><path d="M10 18h5V5h-5v13zm-6 0h5V5H4v13zM16 5v13h5V5h-5z"/></g>
+<g id="view-day"><path d="M2 21h19v-3H2v3zM20 8H3c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1V9c0-.55-.45-1-1-1zM2 3v3h19V3H2z"/></g>
+<g id="view-headline"><path d="M4 15h16v-2H4v2zm0 4h16v-2H4v2zm0-8h16V9H4v2zm0-6v2h16V5H4z"/></g>
+<g id="view-list"><path d="M4 14h4v-4H4v4zm0 5h4v-4H4v4zM4 9h4V5H4v4zm5 5h12v-4H9v4zm0 5h12v-4H9v4zM9 5v4h12V5H9z"/></g>
+<g id="view-module"><path d="M4 11h5V5H4v6zm0 7h5v-6H4v6zm6 0h5v-6h-5v6zm6 0h5v-6h-5v6zm-6-7h5V5h-5v6zm6-6v6h5V5h-5z"/></g>
+<g id="view-quilt"><path d="M10 18h5v-6h-5v6zm-6 0h5V5H4v13zm12 0h5v-6h-5v6zM10 5v6h11V5H10z"/></g>
+<g id="view-stream"><path d="M4 18h17v-6H4v6zM4 5v6h17V5H4z"/></g>
+<g id="view-week"><path d="M6 5H3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1V6c0-.55-.45-1-1-1zm14 0h-3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1V6c0-.55-.45-1-1-1zm-7 0h-3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1V6c0-.55-.45-1-1-1z"/></g>
+<g id="visibility"><path d="M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/></g>
+<g id="visibility-off"><path d="M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z"/></g>
+<g id="warning"><path d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"/></g>
+<g id="watch-later"><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zm4.2 14.2L11 13V7h1.5v5.2l4.5 2.7-.8 1.3z"/></g>
+<g id="weekend"><path d="M21 10c-1.1 0-2 .9-2 2v3H5v-3c0-1.1-.9-2-2-2s-2 .9-2 2v5c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-5c0-1.1-.9-2-2-2zm-3-5H6c-1.1 0-2 .9-2 2v2.15c1.16.41 2 1.51 2 2.82V14h12v-2.03c0-1.3.84-2.4 2-2.82V7c0-1.1-.9-2-2-2z"/></g>
+<g id="work"><path d="M20 6h-4V4c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2H4c-1.11 0-1.99.89-1.99 2L2 19c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zm-6 0h-4V4h4v2z"/></g>
+<g id="youtube-searched-for"><path d="M17.01 14h-.8l-.27-.27c.98-1.14 1.57-2.61 1.57-4.23 0-3.59-2.91-6.5-6.5-6.5s-6.5 3-6.5 6.5H2l3.84 4 4.16-4H6.51C6.51 7 8.53 5 11.01 5s4.5 2.01 4.5 4.5c0 2.48-2.02 4.5-4.5 4.5-.65 0-1.26-.14-1.82-.38L7.71 15.1c.97.57 2.09.9 3.3.9 1.61 0 3.08-.59 4.22-1.57l.27.27v.79l5.01 4.99L22 19l-4.99-5z"/></g>
+<g id="zoom-in"><path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14zm2.5-4h-2v2H9v-2H7V9h2V7h1v2h2v1z"/></g>
+<g id="zoom-out"><path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14zM7 9h5v1H7z"/></g>
+</defs></svg>
+</iron-iconset-svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/maps-icons.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/maps-icons.d.ts
new file mode 100644
index 00000000000..7cd6cf09579
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/maps-icons.d.ts
@@ -0,0 +1,13 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * maps-icons.html
+ */
+
+/// <reference path="../iron-icon/iron-icon.d.ts" />
+/// <reference path="../iron-iconset-svg/iron-iconset-svg.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/maps-icons.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/maps-icons.html
new file mode 100644
index 00000000000..d6ad092fbd6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/maps-icons.html
@@ -0,0 +1,84 @@
+<!--
+@license
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../iron-icon/iron-icon.html">
+<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
+<iron-iconset-svg name="maps" size="24">
+<svg><defs>
+<g id="add-location"><path d="M12 2C8.14 2 5 5.14 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.86-3.14-7-7-7zm4 8h-3v3h-2v-3H8V8h3V5h2v3h3v2z"/></g>
+<g id="beenhere"><path d="M19 1H5c-1.1 0-1.99.9-1.99 2L3 15.93c0 .69.35 1.3.88 1.66L12 23l8.11-5.41c.53-.36.88-.97.88-1.66L21 3c0-1.1-.9-2-2-2zm-9 15l-5-5 1.41-1.41L10 13.17l7.59-7.59L19 7l-9 9z"/></g>
+<g id="directions"><path d="M21.71 11.29l-9-9c-.39-.39-1.02-.39-1.41 0l-9 9c-.39.39-.39 1.02 0 1.41l9 9c.39.39 1.02.39 1.41 0l9-9c.39-.38.39-1.01 0-1.41zM14 14.5V12h-4v3H8v-4c0-.55.45-1 1-1h5V7.5l3.5 3.5-3.5 3.5z"/></g>
+<g id="directions-bike"><path d="M15.5 5.5c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zM5 12c-2.8 0-5 2.2-5 5s2.2 5 5 5 5-2.2 5-5-2.2-5-5-5zm0 8.5c-1.9 0-3.5-1.6-3.5-3.5s1.6-3.5 3.5-3.5 3.5 1.6 3.5 3.5-1.6 3.5-3.5 3.5zm5.8-10l2.4-2.4.8.8c1.3 1.3 3 2.1 5.1 2.1V9c-1.5 0-2.7-.6-3.6-1.5l-1.9-1.9c-.5-.4-1-.6-1.6-.6s-1.1.2-1.4.6L7.8 8.4c-.4.4-.6.9-.6 1.4 0 .6.2 1.1.6 1.4L11 14v5h2v-6.2l-2.2-2.3zM19 12c-2.8 0-5 2.2-5 5s2.2 5 5 5 5-2.2 5-5-2.2-5-5-5zm0 8.5c-1.9 0-3.5-1.6-3.5-3.5s1.6-3.5 3.5-3.5 3.5 1.6 3.5 3.5-1.6 3.5-3.5 3.5z"/></g>
+<g id="directions-boat"><path d="M20 21c-1.39 0-2.78-.47-4-1.32-2.44 1.71-5.56 1.71-8 0C6.78 20.53 5.39 21 4 21H2v2h2c1.38 0 2.74-.35 4-.99 2.52 1.29 5.48 1.29 8 0 1.26.65 2.62.99 4 .99h2v-2h-2zM3.95 19H4c1.6 0 3.02-.88 4-2 .98 1.12 2.4 2 4 2s3.02-.88 4-2c.98 1.12 2.4 2 4 2h.05l1.89-6.68c.08-.26.06-.54-.06-.78s-.34-.42-.6-.5L20 10.62V6c0-1.1-.9-2-2-2h-3V1H9v3H6c-1.1 0-2 .9-2 2v4.62l-1.29.42c-.26.08-.48.26-.6.5s-.15.52-.06.78L3.95 19zM6 6h12v3.97L12 8 6 9.97V6z"/></g>
+<g id="directions-bus"><path d="M4 16c0 .88.39 1.67 1 2.22V20c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h8v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1.78c.61-.55 1-1.34 1-2.22V6c0-3.5-3.58-4-8-4s-8 .5-8 4v10zm3.5 1c-.83 0-1.5-.67-1.5-1.5S6.67 14 7.5 14s1.5.67 1.5 1.5S8.33 17 7.5 17zm9 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm1.5-6H6V6h12v5z"/></g>
+<g id="directions-car"><path d="M18.92 6.01C18.72 5.42 18.16 5 17.5 5h-11c-.66 0-1.21.42-1.42 1.01L3 12v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zM6.5 16c-.83 0-1.5-.67-1.5-1.5S5.67 13 6.5 13s1.5.67 1.5 1.5S7.33 16 6.5 16zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zM5 11l1.5-4.5h11L19 11H5z"/></g>
+<g id="directions-railway"><path d="M4 15.5C4 17.43 5.57 19 7.5 19L6 20.5v.5h12v-.5L16.5 19c1.93 0 3.5-1.57 3.5-3.5V5c0-3.5-3.58-4-8-4s-8 .5-8 4v10.5zm8 1.5c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm6-7H6V5h12v5z"/></g>
+<g id="directions-run"><path d="M13.49 5.48c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm-3.6 13.9l1-4.4 2.1 2v6h2v-7.5l-2.1-2 .6-3c1.3 1.5 3.3 2.5 5.5 2.5v-2c-1.9 0-3.5-1-4.3-2.4l-1-1.6c-.4-.6-1-1-1.7-1-.3 0-.5.1-.8.1l-5.2 2.2v4.7h2v-3.4l1.8-.7-1.6 8.1-4.9-1-.4 2 7 1.4z"/></g>
+<g id="directions-subway"><path d="M12 2c-4.42 0-8 .5-8 4v9.5C4 17.43 5.57 19 7.5 19L6 20.5v.5h12v-.5L16.5 19c1.93 0 3.5-1.57 3.5-3.5V6c0-3.5-3.58-4-8-4zM7.5 17c-.83 0-1.5-.67-1.5-1.5S6.67 14 7.5 14s1.5.67 1.5 1.5S8.33 17 7.5 17zm3.5-6H6V6h5v5zm5.5 6c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm1.5-6h-5V6h5v5z"/></g>
+<g id="directions-transit"><path d="M12 2c-4.42 0-8 .5-8 4v9.5C4 17.43 5.57 19 7.5 19L6 20.5v.5h12v-.5L16.5 19c1.93 0 3.5-1.57 3.5-3.5V6c0-3.5-3.58-4-8-4zM7.5 17c-.83 0-1.5-.67-1.5-1.5S6.67 14 7.5 14s1.5.67 1.5 1.5S8.33 17 7.5 17zm3.5-6H6V6h5v5zm5.5 6c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm1.5-6h-5V6h5v5z"/></g>
+<g id="directions-walk"><path d="M13.5 5.5c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zM9.8 8.9L7 23h2.1l1.8-8 2.1 2v6h2v-7.5l-2.1-2 .6-3C14.8 12 16.8 13 19 13v-2c-1.9 0-3.5-1-4.3-2.4l-1-1.6c-.4-.6-1-1-1.7-1-.3 0-.5.1-.8.1L6 8.3V13h2V9.6l1.8-.7"/></g>
+<g id="edit-location"><path d="M12 2C8.14 2 5 5.14 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.86-3.14-7-7-7zm-1.56 10H9v-1.44l3.35-3.34 1.43 1.43L10.44 12zm4.45-4.45l-.7.7-1.44-1.44.7-.7c.15-.15.39-.15.54 0l.9.9c.15.15.15.39 0 .54z"/></g>
+<g id="ev-station"><path d="M19.77 7.23l.01-.01-3.72-3.72L15 4.56l2.11 2.11c-.94.36-1.61 1.26-1.61 2.33 0 1.38 1.12 2.5 2.5 2.5.36 0 .69-.08 1-.21v7.21c0 .55-.45 1-1 1s-1-.45-1-1V14c0-1.1-.9-2-2-2h-1V5c0-1.1-.9-2-2-2H6c-1.1 0-2 .9-2 2v16h10v-7.5h1.5v5c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5V9c0-.69-.28-1.32-.73-1.77zM18 10c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zM8 18v-4.5H6L10 6v5h2l-4 7z"/></g>
+<g id="flight"><path d="M10.18 9"/><path d="M21 16v-2l-8-5V3.5c0-.83-.67-1.5-1.5-1.5S10 2.67 10 3.5V9l-8 5v2l8-2.5V19l-2 1.5V22l3.5-1 3.5 1v-1.5L13 19v-5.5l8 2.5z"/></g>
+<g id="hotel"><path d="M7 13c1.66 0 3-1.34 3-3S8.66 7 7 7s-3 1.34-3 3 1.34 3 3 3zm12-6h-8v7H3V5H1v15h2v-3h18v3h2v-9c0-2.21-1.79-4-4-4z"/></g>
+<g id="layers"><path d="M11.99 18.54l-7.37-5.73L3 14.07l9 7 9-7-1.63-1.27-7.38 5.74zM12 16l7.36-5.73L21 9l-9-7-9 7 1.63 1.27L12 16z"/></g>
+<g id="layers-clear"><path d="M19.81 14.99l1.19-.92-1.43-1.43-1.19.92 1.43 1.43zm-.45-4.72L21 9l-9-7-2.91 2.27 7.87 7.88 2.4-1.88zM3.27 1L2 2.27l4.22 4.22L3 9l1.63 1.27L12 16l2.1-1.63 1.43 1.43L12 18.54l-7.37-5.73L3 14.07l9 7 4.95-3.85L20.73 21 22 19.73 3.27 1z"/></g>
+<g id="local-activity"><path d="M20 12c0-1.1.9-2 2-2V6c0-1.1-.9-2-2-2H4c-1.1 0-1.99.9-1.99 2v4c1.1 0 1.99.9 1.99 2s-.89 2-2 2v4c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-4c-1.1 0-2-.9-2-2zm-4.42 4.8L12 14.5l-3.58 2.3 1.08-4.12-3.29-2.69 4.24-.25L12 5.8l1.54 3.95 4.24.25-3.29 2.69 1.09 4.11z"/></g>
+<g id="local-airport"><path d="M21 16v-2l-8-5V3.5c0-.83-.67-1.5-1.5-1.5S10 2.67 10 3.5V9l-8 5v2l8-2.5V19l-2 1.5V22l3.5-1 3.5 1v-1.5L13 19v-5.5l8 2.5z"/></g>
+<g id="local-atm"><path d="M11 17h2v-1h1c.55 0 1-.45 1-1v-3c0-.55-.45-1-1-1h-3v-1h4V8h-2V7h-2v1h-1c-.55 0-1 .45-1 1v3c0 .55.45 1 1 1h3v1H9v2h2v1zm9-13H4c-1.11 0-1.99.89-1.99 2L2 18c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6c0-1.11-.89-2-2-2zm0 14H4V6h16v12z"/></g>
+<g id="local-bar"><path d="M21 5V3H3v2l8 9v5H6v2h12v-2h-5v-5l8-9zM7.43 7L5.66 5h12.69l-1.78 2H7.43z"/></g>
+<g id="local-cafe"><path d="M20 3H4v10c0 2.21 1.79 4 4 4h6c2.21 0 4-1.79 4-4v-3h2c1.11 0 2-.89 2-2V5c0-1.11-.89-2-2-2zm0 5h-2V5h2v3zM2 21h18v-2H2v2z"/></g>
+<g id="local-car-wash"><path d="M17 5c.83 0 1.5-.67 1.5-1.5 0-1-1.5-2.7-1.5-2.7s-1.5 1.7-1.5 2.7c0 .83.67 1.5 1.5 1.5zm-5 0c.83 0 1.5-.67 1.5-1.5 0-1-1.5-2.7-1.5-2.7s-1.5 1.7-1.5 2.7c0 .83.67 1.5 1.5 1.5zM7 5c.83 0 1.5-.67 1.5-1.5C8.5 2.5 7 .8 7 .8S5.5 2.5 5.5 3.5C5.5 4.33 6.17 5 7 5zm11.92 3.01C18.72 7.42 18.16 7 17.5 7h-11c-.66 0-1.21.42-1.42 1.01L3 14v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zM6.5 18c-.83 0-1.5-.67-1.5-1.5S5.67 15 6.5 15s1.5.67 1.5 1.5S7.33 18 6.5 18zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zM5 13l1.5-4.5h11L19 13H5z"/></g>
+<g id="local-convenience-store"><path d="M19 7V4H5v3H2v13h8v-4h4v4h8V7h-3zm-8 3H9v1h2v1H8V9h2V8H8V7h3v3zm5 2h-1v-2h-2V7h1v2h1V7h1v5z"/></g>
+<g id="local-dining"><path d="M8.1 13.34l2.83-2.83L3.91 3.5c-1.56 1.56-1.56 4.09 0 5.66l4.19 4.18zm6.78-1.81c1.53.71 3.68.21 5.27-1.38 1.91-1.91 2.28-4.65.81-6.12-1.46-1.46-4.2-1.1-6.12.81-1.59 1.59-2.09 3.74-1.38 5.27L3.7 19.87l1.41 1.41L12 14.41l6.88 6.88 1.41-1.41L13.41 13l1.47-1.47z"/></g>
+<g id="local-drink"><path d="M3 2l2.01 18.23C5.13 21.23 5.97 22 7 22h10c1.03 0 1.87-.77 1.99-1.77L21 2H3zm9 17c-1.66 0-3-1.34-3-3 0-2 3-5.4 3-5.4s3 3.4 3 5.4c0 1.66-1.34 3-3 3zm6.33-11H5.67l-.44-4h13.53l-.43 4z"/></g>
+<g id="local-florist"><path d="M12 22c4.97 0 9-4.03 9-9-4.97 0-9 4.03-9 9zM5.6 10.25c0 1.38 1.12 2.5 2.5 2.5.53 0 1.01-.16 1.42-.44l-.02.19c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5l-.02-.19c.4.28.89.44 1.42.44 1.38 0 2.5-1.12 2.5-2.5 0-1-.59-1.85-1.43-2.25.84-.4 1.43-1.25 1.43-2.25 0-1.38-1.12-2.5-2.5-2.5-.53 0-1.01.16-1.42.44l.02-.19C14.5 2.12 13.38 1 12 1S9.5 2.12 9.5 3.5l.02.19c-.4-.28-.89-.44-1.42-.44-1.38 0-2.5 1.12-2.5 2.5 0 1 .59 1.85 1.43 2.25-.84.4-1.43 1.25-1.43 2.25zM12 5.5c1.38 0 2.5 1.12 2.5 2.5s-1.12 2.5-2.5 2.5S9.5 9.38 9.5 8s1.12-2.5 2.5-2.5zM3 13c0 4.97 4.03 9 9 9 0-4.97-4.03-9-9-9z"/></g>
+<g id="local-gas-station"><path d="M19.77 7.23l.01-.01-3.72-3.72L15 4.56l2.11 2.11c-.94.36-1.61 1.26-1.61 2.33 0 1.38 1.12 2.5 2.5 2.5.36 0 .69-.08 1-.21v7.21c0 .55-.45 1-1 1s-1-.45-1-1V14c0-1.1-.9-2-2-2h-1V5c0-1.1-.9-2-2-2H6c-1.1 0-2 .9-2 2v16h10v-7.5h1.5v5c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5V9c0-.69-.28-1.32-.73-1.77zM12 10H6V5h6v5zm6 0c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z"/></g>
+<g id="local-grocery-store"><path d="M7 18c-1.1 0-1.99.9-1.99 2S5.9 22 7 22s2-.9 2-2-.9-2-2-2zM1 2v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2H7.42c-.14 0-.25-.11-.25-.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.58-6.49c.08-.14.12-.31.12-.48 0-.55-.45-1-1-1H5.21l-.94-2H1zm16 16c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2z"/></g>
+<g id="local-hospital"><path d="M19 3H5c-1.1 0-1.99.9-1.99 2L3 19c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 11h-4v4h-4v-4H6v-4h4V6h4v4h4v4z"/></g>
+<g id="local-hotel"><path d="M7 13c1.66 0 3-1.34 3-3S8.66 7 7 7s-3 1.34-3 3 1.34 3 3 3zm12-6h-8v7H3V5H1v15h2v-3h18v3h2v-9c0-2.21-1.79-4-4-4z"/></g>
+<g id="local-laundry-service"><path d="M9.17 16.83c1.56 1.56 4.1 1.56 5.66 0 1.56-1.56 1.56-4.1 0-5.66l-5.66 5.66zM18 2.01L6 2c-1.11 0-2 .89-2 2v16c0 1.11.89 2 2 2h12c1.11 0 2-.89 2-2V4c0-1.11-.89-1.99-2-1.99zM10 4c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zM7 4c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm5 16c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6z"/></g>
+<g id="local-library"><path d="M12 11.55C9.64 9.35 6.48 8 3 8v11c3.48 0 6.64 1.35 9 3.55 2.36-2.19 5.52-3.55 9-3.55V8c-3.48 0-6.64 1.35-9 3.55zM12 8c1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3 1.34 3 3 3z"/></g>
+<g id="local-mall"><path d="M19 6h-2c0-2.76-2.24-5-5-5S7 3.24 7 6H5c-1.1 0-1.99.9-1.99 2L3 20c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm-7-3c1.66 0 3 1.34 3 3H9c0-1.66 1.34-3 3-3zm0 10c-2.76 0-5-2.24-5-5h2c0 1.66 1.34 3 3 3s3-1.34 3-3h2c0 2.76-2.24 5-5 5z"/></g>
+<g id="local-movies"><path d="M18 3v2h-2V3H8v2H6V3H4v18h2v-2h2v2h8v-2h2v2h2V3h-2zM8 17H6v-2h2v2zm0-4H6v-2h2v2zm0-4H6V7h2v2zm10 8h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2V7h2v2z"/></g>
+<g id="local-offer"><path d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/></g>
+<g id="local-parking"><path d="M13 3H6v18h4v-6h3c3.31 0 6-2.69 6-6s-2.69-6-6-6zm.2 8H10V7h3.2c1.1 0 2 .9 2 2s-.9 2-2 2z"/></g>
+<g id="local-pharmacy"><path d="M21 5h-2.64l1.14-3.14L17.15 1l-1.46 4H3v2l2 6-2 6v2h18v-2l-2-6 2-6V5zm-5 9h-3v3h-2v-3H8v-2h3V9h2v3h3v2z"/></g>
+<g id="local-phone"><path d="M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z"/></g>
+<g id="local-pizza"><path d="M12 2C8.43 2 5.23 3.54 3.01 6L12 22l8.99-16C18.78 3.55 15.57 2 12 2zM7 7c0-1.1.9-2 2-2s2 .9 2 2-.9 2-2 2-2-.9-2-2zm5 8c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z"/></g>
+<g id="local-play"><path d="M20 12c0-1.1.9-2 2-2V6c0-1.1-.9-2-2-2H4c-1.1 0-1.99.9-1.99 2v4c1.1 0 1.99.9 1.99 2s-.89 2-2 2v4c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-4c-1.1 0-2-.9-2-2zm-4.42 4.8L12 14.5l-3.58 2.3 1.08-4.12-3.29-2.69 4.24-.25L12 5.8l1.54 3.95 4.24.25-3.29 2.69 1.09 4.11z"/></g>
+<g id="local-post-office"><path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/></g>
+<g id="local-printshop"><path d="M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z"/></g>
+<g id="local-see"><circle cx="12" cy="12" r="3.2"/><path d="M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"/></g>
+<g id="local-shipping"><path d="M20 8h-3V4H3c-1.1 0-2 .9-2 2v11h2c0 1.66 1.34 3 3 3s3-1.34 3-3h6c0 1.66 1.34 3 3 3s3-1.34 3-3h2v-5l-3-4zM6 18.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm13.5-9l1.96 2.5H17V9.5h2.5zm-1.5 9c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"/></g>
+<g id="local-taxi"><path d="M18.92 6.01C18.72 5.42 18.16 5 17.5 5H15V3H9v2H6.5c-.66 0-1.21.42-1.42 1.01L3 12v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zM6.5 16c-.83 0-1.5-.67-1.5-1.5S5.67 13 6.5 13s1.5.67 1.5 1.5S7.33 16 6.5 16zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zM5 11l1.5-4.5h11L19 11H5z"/></g>
+<g id="map"><path d="M20.5 3l-.16.03L15 5.1 9 3 3.36 4.9c-.21.07-.36.25-.36.48V20.5c0 .28.22.5.5.5l.16-.03L9 18.9l6 2.1 5.64-1.9c.21-.07.36-.25.36-.48V3.5c0-.28-.22-.5-.5-.5zM15 19l-6-2.11V5l6 2.11V19z"/></g>
+<g id="my-location"><path d="M12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm8.94 3c-.46-4.17-3.77-7.48-7.94-7.94V1h-2v2.06C6.83 3.52 3.52 6.83 3.06 11H1v2h2.06c.46 4.17 3.77 7.48 7.94 7.94V23h2v-2.06c4.17-.46 7.48-3.77 7.94-7.94H23v-2h-2.06zM12 19c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"/></g>
+<g id="navigation"><path d="M12 2L4.5 20.29l.71.71L12 18l6.79 3 .71-.71z"/></g>
+<g id="near-me"><path d="M21 3L3 10.53v.98l6.84 2.65L12.48 21h.98L21 3z"/></g>
+<g id="person-pin"><path d="M19 2H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h4l3 3 3-3h4c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 3.3c1.49 0 2.7 1.21 2.7 2.7 0 1.49-1.21 2.7-2.7 2.7-1.49 0-2.7-1.21-2.7-2.7 0-1.49 1.21-2.7 2.7-2.7zM18 16H6v-.9c0-2 4-3.1 6-3.1s6 1.1 6 3.1v.9z"/></g>
+<g id="person-pin-circle"><path d="M12 2C8.14 2 5 5.14 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.86-3.14-7-7-7zm0 2c1.1 0 2 .9 2 2 0 1.11-.9 2-2 2s-2-.89-2-2c0-1.1.9-2 2-2zm0 10c-1.67 0-3.14-.85-4-2.15.02-1.32 2.67-2.05 4-2.05s3.98.73 4 2.05c-.86 1.3-2.33 2.15-4 2.15z"/></g>
+<g id="pin-drop"><path d="M18 8c0-3.31-2.69-6-6-6S6 4.69 6 8c0 4.5 6 11 6 11s6-6.5 6-11zm-8 0c0-1.1.9-2 2-2s2 .9 2 2-.89 2-2 2c-1.1 0-2-.9-2-2zM5 20v2h14v-2H5z"/></g>
+<g id="place"><path d="M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z"/></g>
+<g id="rate-review"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM6 14v-2.47l6.88-6.88c.2-.2.51-.2.71 0l1.77 1.77c.2.2.2.51 0 .71L8.47 14H6zm12 0h-7.5l2-2H18v2z"/></g>
+<g id="restaurant"><path d="M11 9H9V2H7v7H5V2H3v7c0 2.12 1.66 3.84 3.75 3.97V22h2.5v-9.03C11.34 12.84 13 11.12 13 9V2h-2v7zm5-3v8h2.5v8H21V2c-2.76 0-5 2.24-5 4z"/></g>
+<g id="restaurant-menu"><path d="M8.1 13.34l2.83-2.83L3.91 3.5c-1.56 1.56-1.56 4.09 0 5.66l4.19 4.18zm6.78-1.81c1.53.71 3.68.21 5.27-1.38 1.91-1.91 2.28-4.65.81-6.12-1.46-1.46-4.2-1.1-6.12.81-1.59 1.59-2.09 3.74-1.38 5.27L3.7 19.87l1.41 1.41L12 14.41l6.88 6.88 1.41-1.41L13.41 13l1.47-1.47z"/></g>
+<g id="satellite"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM5 4.99h3C8 6.65 6.66 8 5 8V4.99zM5 12v-2c2.76 0 5-2.25 5-5.01h2C12 8.86 8.87 12 5 12zm0 6l3.5-4.5 2.5 3.01L14.5 12l4.5 6H5z"/></g>
+<g id="store-mall-directory"><path d="M20 4H4v2h16V4zm1 10v-2l-1-5H4l-1 5v2h1v6h10v-6h4v6h2v-6h1zm-9 4H6v-4h6v4z"/></g>
+<g id="streetview"><path d="M12.56 14.33c-.34.27-.56.7-.56 1.17V21h7c1.1 0 2-.9 2-2v-5.98c-.94-.33-1.95-.52-3-.52-2.03 0-3.93.7-5.44 1.83z"/><circle cx="18" cy="6" r="5"/><path d="M11.5 6c0-1.08.27-2.1.74-3H5c-1.1 0-2 .9-2 2v14c0 .55.23 1.05.59 1.41l9.82-9.82C12.23 9.42 11.5 7.8 11.5 6z"/></g>
+<g id="subway"><circle cx="15.5" cy="16" r="1"/><circle cx="8.5" cy="16" r="1"/><path d="M7.01 9h10v5h-10zM17.8 2.8C16 2.09 13.86 2 12 2c-1.86 0-4 .09-5.8.8C3.53 3.84 2 6.05 2 8.86V22h20V8.86c0-2.81-1.53-5.02-4.2-6.06zm.2 13.08c0 1.45-1.18 2.62-2.63 2.62l1.13 1.12V20H15l-1.5-1.5h-2.83L9.17 20H7.5v-.38l1.12-1.12C7.18 18.5 6 17.32 6 15.88V9c0-2.63 3-3 6-3 3.32 0 6 .38 6 3v6.88z"/></g>
+<g id="terrain"><path d="M14 6l-3.75 5 2.85 3.8-1.6 1.2C9.81 13.75 7 10 7 10l-6 8h22L14 6z"/></g>
+<g id="traffic"><path d="M20 10h-3V8.86c1.72-.45 3-2 3-3.86h-3V4c0-.55-.45-1-1-1H8c-.55 0-1 .45-1 1v1H4c0 1.86 1.28 3.41 3 3.86V10H4c0 1.86 1.28 3.41 3 3.86V15H4c0 1.86 1.28 3.41 3 3.86V20c0 .55.45 1 1 1h8c.55 0 1-.45 1-1v-1.14c1.72-.45 3-2 3-3.86h-3v-1.14c1.72-.45 3-2 3-3.86zm-8 9c-1.11 0-2-.9-2-2s.89-2 2-2c1.1 0 2 .9 2 2s-.89 2-2 2zm0-5c-1.11 0-2-.9-2-2s.89-2 2-2c1.1 0 2 .9 2 2s-.89 2-2 2zm0-5c-1.11 0-2-.9-2-2 0-1.11.89-2 2-2 1.1 0 2 .89 2 2 0 1.1-.89 2-2 2z"/></g>
+<g id="train"><path d="M12 2c-4 0-8 .5-8 4v9.5C4 17.43 5.57 19 7.5 19L6 20.5v.5h2.23l2-2H14l2 2h2v-.5L16.5 19c1.93 0 3.5-1.57 3.5-3.5V6c0-3.5-3.58-4-8-4zM7.5 17c-.83 0-1.5-.67-1.5-1.5S6.67 14 7.5 14s1.5.67 1.5 1.5S8.33 17 7.5 17zm3.5-7H6V6h5v4zm2 0V6h5v4h-5zm3.5 7c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"/></g>
+<g id="tram"><path d="M19 16.94V8.5c0-2.79-2.61-3.4-6.01-3.49l.76-1.51H17V2H7v1.5h4.75l-.76 1.52C7.86 5.11 5 5.73 5 8.5v8.44c0 1.45 1.19 2.66 2.59 2.97L6 21.5v.5h2.23l2-2H14l2 2h2v-.5L16.5 20h-.08c1.69 0 2.58-1.37 2.58-3.06zm-7 1.56c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm5-4.5H7V9h10v5z"/></g>
+<g id="transfer-within-a-station"><path d="M16.49 15.5v-1.75L14 16.25l2.49 2.5V17H22v-1.5zm3.02 4.25H14v1.5h5.51V23L22 20.5 19.51 18zM9.5 5.5c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zM5.75 8.9L3 23h2.1l1.75-8L9 17v6h2v-7.55L8.95 13.4l.6-3C10.85 12 12.8 13 15 13v-2c-1.85 0-3.45-1-4.35-2.45l-.95-1.6C9.35 6.35 8.7 6 8 6c-.25 0-.5.05-.75.15L2 8.3V13h2V9.65l1.75-.75"/></g>
+<g id="zoom-out-map"><path d="M15 3l2.3 2.3-2.89 2.87 1.42 1.42L18.7 6.7 21 9V3zM3 9l2.3-2.3 2.87 2.89 1.42-1.42L6.7 5.3 9 3H3zm6 12l-2.3-2.3 2.89-2.87-1.42-1.42L5.3 17.3 3 15v6zm12-6l-2.3 2.3-2.87-2.89-1.42 1.42 2.89 2.87L15 21h6z"/></g>
+</defs></svg>
+</iron-iconset-svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/notification-icons.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/notification-icons.d.ts
new file mode 100644
index 00000000000..2a380db11a0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/notification-icons.d.ts
@@ -0,0 +1,13 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * notification-icons.html
+ */
+
+/// <reference path="../iron-icon/iron-icon.d.ts" />
+/// <reference path="../iron-iconset-svg/iron-iconset-svg.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/notification-icons.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/notification-icons.html
new file mode 100644
index 00000000000..272b95b0ee3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/notification-icons.html
@@ -0,0 +1,70 @@
+<!--
+@license
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../iron-icon/iron-icon.html">
+<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
+<iron-iconset-svg name="notification" size="24">
+<svg><defs>
+<g id="adb"><path d="M5 16c0 3.87 3.13 7 7 7s7-3.13 7-7v-4H5v4zM16.12 4.37l2.1-2.1-.82-.83-2.3 2.31C14.16 3.28 13.12 3 12 3s-2.16.28-3.09.75L6.6 1.44l-.82.83 2.1 2.1C6.14 5.64 5 7.68 5 10v1h14v-1c0-2.32-1.14-4.36-2.88-5.63zM9 9c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm6 0c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z"/></g>
+<g id="airline-seat-flat"><path d="M22 11v2H9V7h9c2.21 0 4 1.79 4 4zM2 14v2h6v2h8v-2h6v-2H2zm5.14-1.9c1.16-1.19 1.14-3.08-.04-4.24-1.19-1.16-3.08-1.14-4.24.04-1.16 1.19-1.14 3.08.04 4.24 1.19 1.16 3.08 1.14 4.24-.04z"/></g>
+<g id="airline-seat-flat-angled"><path d="M22.25 14.29l-.69 1.89L9.2 11.71l2.08-5.66 8.56 3.09c2.1.76 3.18 3.06 2.41 5.15zM1.5 12.14L8 14.48V19h8v-1.63L20.52 19l.69-1.89-19.02-6.86-.69 1.89zm5.8-1.94c1.49-.72 2.12-2.51 1.41-4C7.99 4.71 6.2 4.08 4.7 4.8c-1.49.71-2.12 2.5-1.4 4 .71 1.49 2.5 2.12 4 1.4z"/></g>
+<g id="airline-seat-individual-suite"><path d="M7 13c1.65 0 3-1.35 3-3S8.65 7 7 7s-3 1.35-3 3 1.35 3 3 3zm12-6h-8v7H3V7H1v10h22v-6c0-2.21-1.79-4-4-4z"/></g>
+<g id="airline-seat-legroom-extra"><path d="M4 12V3H2v9c0 2.76 2.24 5 5 5h6v-2H7c-1.66 0-3-1.34-3-3zm18.83 5.24c-.38-.72-1.29-.97-2.03-.63l-1.09.5-3.41-6.98c-.34-.68-1.03-1.12-1.79-1.12L11 9V3H5v8c0 1.66 1.34 3 3 3h7l3.41 7 3.72-1.7c.77-.36 1.1-1.3.7-2.06z"/></g>
+<g id="airline-seat-legroom-normal"><path d="M5 12V3H3v9c0 2.76 2.24 5 5 5h6v-2H8c-1.66 0-3-1.34-3-3zm15.5 6H19v-7c0-1.1-.9-2-2-2h-5V3H6v8c0 1.65 1.35 3 3 3h7v7h4.5c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5z"/></g>
+<g id="airline-seat-legroom-reduced"><path d="M19.97 19.2c.18.96-.55 1.8-1.47 1.8H14v-3l1-4H9c-1.65 0-3-1.35-3-3V3h6v6h5c1.1 0 2 .9 2 2l-2 7h1.44c.73 0 1.39.49 1.53 1.2zM5 12V3H3v9c0 2.76 2.24 5 5 5h4v-2H8c-1.66 0-3-1.34-3-3z"/></g>
+<g id="airline-seat-recline-extra"><path d="M5.35 5.64c-.9-.64-1.12-1.88-.49-2.79.63-.9 1.88-1.12 2.79-.49.9.64 1.12 1.88.49 2.79-.64.9-1.88 1.12-2.79.49zM16 19H8.93c-1.48 0-2.74-1.08-2.96-2.54L4 7H2l1.99 9.76C4.37 19.2 6.47 21 8.94 21H16v-2zm.23-4h-4.88l-1.03-4.1c1.58.89 3.28 1.54 5.15 1.22V9.99c-1.63.31-3.44-.27-4.69-1.25L9.14 7.47c-.23-.18-.49-.3-.76-.38-.32-.09-.66-.12-.99-.06h-.02c-1.23.22-2.05 1.39-1.84 2.61l1.35 5.92C7.16 16.98 8.39 18 9.83 18h6.85l3.82 3 1.5-1.5-5.77-4.5z"/></g>
+<g id="airline-seat-recline-normal"><path d="M7.59 5.41c-.78-.78-.78-2.05 0-2.83.78-.78 2.05-.78 2.83 0 .78.78.78 2.05 0 2.83-.79.79-2.05.79-2.83 0zM6 16V7H4v9c0 2.76 2.24 5 5 5h6v-2H9c-1.66 0-3-1.34-3-3zm14 4.07L14.93 15H11.5v-3.68c1.4 1.15 3.6 2.16 5.5 2.16v-2.16c-1.66.02-3.61-.87-4.67-2.04l-1.4-1.55c-.19-.21-.43-.38-.69-.5-.29-.14-.62-.23-.96-.23h-.03C8.01 7 7 8.01 7 9.25V15c0 1.66 1.34 3 3 3h5.07l3.5 3.5L20 20.07z"/></g>
+<g id="bluetooth-audio"><path d="M14.24 12.01l2.32 2.32c.28-.72.44-1.51.44-2.33 0-.82-.16-1.59-.43-2.31l-2.33 2.32zm5.29-5.3l-1.26 1.26c.63 1.21.98 2.57.98 4.02s-.36 2.82-.98 4.02l1.2 1.2c.97-1.54 1.54-3.36 1.54-5.31-.01-1.89-.55-3.67-1.48-5.19zm-3.82 1L10 2H9v7.59L4.41 5 3 6.41 8.59 12 3 17.59 4.41 19 9 14.41V22h1l5.71-5.71-4.3-4.29 4.3-4.29zM11 5.83l1.88 1.88L11 9.59V5.83zm1.88 10.46L11 18.17v-3.76l1.88 1.88z"/></g>
+<g id="confirmation-number"><path d="M22 10V6c0-1.11-.9-2-2-2H4c-1.1 0-1.99.89-1.99 2v4c1.1 0 1.99.9 1.99 2s-.89 2-2 2v4c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-4c-1.1 0-2-.9-2-2s.9-2 2-2zm-9 7.5h-2v-2h2v2zm0-4.5h-2v-2h2v2zm0-4.5h-2v-2h2v2z"/></g>
+<g id="disc-full"><path d="M20 16h2v-2h-2v2zm0-9v5h2V7h-2zM10 4c-4.42 0-8 3.58-8 8s3.58 8 8 8 8-3.58 8-8-3.58-8-8-8zm0 10c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z"/></g>
+<g id="do-not-disturb"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8 0-1.85.63-3.55 1.69-4.9L16.9 18.31C15.55 19.37 13.85 20 12 20zm6.31-3.1L7.1 5.69C8.45 4.63 10.15 4 12 4c4.42 0 8 3.58 8 8 0 1.85-.63 3.55-1.69 4.9z"/></g>
+<g id="do-not-disturb-alt"><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zM4 12c0-4.4 3.6-8 8-8 1.8 0 3.5.6 4.9 1.7L5.7 16.9C4.6 15.5 4 13.8 4 12zm8 8c-1.8 0-3.5-.6-4.9-1.7L18.3 7.1C19.4 8.5 20 10.2 20 12c0 4.4-3.6 8-8 8z"/></g>
+<g id="do-not-disturb-off"><path d="M17 11v2h-1.46l4.68 4.68C21.34 16.07 22 14.11 22 12c0-5.52-4.48-10-10-10-2.11 0-4.07.66-5.68 1.78L13.54 11H17zM2.27 2.27L1 3.54l2.78 2.78C2.66 7.93 2 9.89 2 12c0 5.52 4.48 10 10 10 2.11 0 4.07-.66 5.68-1.78L20.46 23l1.27-1.27L11 11 2.27 2.27zM7 13v-2h1.46l2 2H7z"/></g>
+<g id="do-not-disturb-on"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11H7v-2h10v2z"/></g>
+<g id="drive-eta"><path d="M18.92 5.01C18.72 4.42 18.16 4 17.5 4h-11c-.66 0-1.21.42-1.42 1.01L3 11v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zM6.5 15c-.83 0-1.5-.67-1.5-1.5S5.67 12 6.5 12s1.5.67 1.5 1.5S7.33 15 6.5 15zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zM5 10l1.5-4.5h11L19 10H5z"/></g>
+<g id="enhanced-encryption"><path d="M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zM8.9 6c0-1.71 1.39-3.1 3.1-3.1s3.1 1.39 3.1 3.1v2H8.9V6zM16 16h-3v3h-2v-3H8v-2h3v-3h2v3h3v2z"/></g>
+<g id="event-available"><path d="M16.53 11.06L15.47 10l-4.88 4.88-2.12-2.12-1.06 1.06L10.59 17l5.94-5.94zM19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11z"/></g>
+<g id="event-busy"><path d="M9.31 17l2.44-2.44L14.19 17l1.06-1.06-2.44-2.44 2.44-2.44L14.19 10l-2.44 2.44L9.31 10l-1.06 1.06 2.44 2.44-2.44 2.44L9.31 17zM19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11z"/></g>
+<g id="event-note"><path d="M17 10H7v2h10v-2zm2-7h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zm-5-5H7v2h7v-2z"/></g>
+<g id="folder-special"><path d="M20 6h-8l-2-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm-2.06 11L15 15.28 12.06 17l.78-3.33-2.59-2.24 3.41-.29L15 8l1.34 3.14 3.41.29-2.59 2.24.78 3.33z"/></g>
+<g id="live-tv"><path d="M21 6h-7.59l3.29-3.29L16 2l-4 4-4-4-.71.71L10.59 6H3c-1.1 0-2 .89-2 2v12c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V8c0-1.11-.9-2-2-2zm0 14H3V8h18v12zM9 10v8l7-4z"/></g>
+<g id="mms"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM5 14l3.5-4.5 2.5 3.01L14.5 8l4.5 6H5z"/></g>
+<g id="more"><path d="M22 3H7c-.69 0-1.23.35-1.59.88L0 12l5.41 8.11c.36.53.97.89 1.66.89H22c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 13.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm5 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm5 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"/></g>
+<g id="network-check"><path d="M15.9 5c-.17 0-.32.09-.41.23l-.07.15-5.18 11.65c-.16.29-.26.61-.26.96 0 1.11.9 2.01 2.01 2.01.96 0 1.77-.68 1.96-1.59l.01-.03L16.4 5.5c0-.28-.22-.5-.5-.5zM1 9l2 2c2.88-2.88 6.79-4.08 10.53-3.62l1.19-2.68C9.89 3.84 4.74 5.27 1 9zm20 2l2-2c-1.64-1.64-3.55-2.82-5.59-3.57l-.53 2.82c1.5.62 2.9 1.53 4.12 2.75zm-4 4l2-2c-.8-.8-1.7-1.42-2.66-1.89l-.55 2.92c.42.27.83.59 1.21.97zM5 13l2 2c1.13-1.13 2.56-1.79 4.03-2l1.28-2.88c-2.63-.08-5.3.87-7.31 2.88z"/></g>
+<g id="network-locked"><path d="M19.5 10c.17 0 .33.03.5.05V1L1 20h13v-3c0-.89.39-1.68 1-2.23v-.27c0-2.48 2.02-4.5 4.5-4.5zm2.5 6v-1.5c0-1.38-1.12-2.5-2.5-2.5S17 13.12 17 14.5V16c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h5c.55 0 1-.45 1-1v-4c0-.55-.45-1-1-1zm-1 0h-3v-1.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5V16z"/></g>
+<g id="no-encryption"><path d="M21 21.78L4.22 5 3 6.22l2.04 2.04C4.42 8.6 4 9.25 4 10v10c0 1.1.9 2 2 2h12c.23 0 .45-.05.66-.12L19.78 23 21 21.78zM8.9 6c0-1.71 1.39-3.1 3.1-3.1s3.1 1.39 3.1 3.1v2H9.66L20 18.34V10c0-1.1-.9-2-2-2h-1V6c0-2.76-2.24-5-5-5-2.56 0-4.64 1.93-4.94 4.4L8.9 7.24V6z"/></g>
+<g id="ondemand-video"><path d="M21 3H3c-1.11 0-2 .89-2 2v12c0 1.1.89 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.11-.9-2-2-2zm0 14H3V5h18v12zm-5-6l-7 4V7z"/></g>
+<g id="personal-video"><path d="M21 3H3c-1.11 0-2 .89-2 2v12c0 1.1.89 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.11-.9-2-2-2zm0 14H3V5h18v12z"/></g>
+<g id="phone-bluetooth-speaker"><path d="M14.71 9.5L17 7.21V11h.5l2.85-2.85L18.21 6l2.15-2.15L17.5 1H17v3.79L14.71 2.5l-.71.71L16.79 6 14 8.79l.71.71zM18 2.91l.94.94-.94.94V2.91zm0 4.3l.94.94-.94.94V7.21zm2 8.29c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1z"/></g>
+<g id="phone-forwarded"><path d="M18 11l5-5-5-5v3h-4v4h4v3zm2 4.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1z"/></g>
+<g id="phone-in-talk"><path d="M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zM19 12h2c0-4.97-4.03-9-9-9v2c3.87 0 7 3.13 7 7zm-4 0h2c0-2.76-2.24-5-5-5v2c1.66 0 3 1.34 3 3z"/></g>
+<g id="phone-locked"><path d="M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zM20 4v-.5C20 2.12 18.88 1 17.5 1S15 2.12 15 3.5V4c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h5c.55 0 1-.45 1-1V5c0-.55-.45-1-1-1zm-.8 0h-3.4v-.5c0-.94.76-1.7 1.7-1.7s1.7.76 1.7 1.7V4z"/></g>
+<g id="phone-missed"><path d="M6.5 5.5L12 11l7-7-1-1-6 6-4.5-4.5H11V3H5v6h1.5V5.5zm17.21 11.17C20.66 13.78 16.54 12 12 12 7.46 12 3.34 13.78.29 16.67c-.18.18-.29.43-.29.71s.11.53.29.71l2.48 2.48c.18.18.43.29.71.29.27 0 .52-.11.7-.28.79-.74 1.69-1.36 2.66-1.85.33-.16.56-.5.56-.9v-3.1c1.45-.48 3-.73 4.6-.73 1.6 0 3.15.25 4.6.72v3.1c0 .39.23.74.56.9.98.49 1.87 1.12 2.67 1.85.18.18.43.28.7.28.28 0 .53-.11.71-.29l2.48-2.48c.18-.18.29-.43.29-.71s-.12-.52-.3-.7z"/></g>
+<g id="phone-paused"><path d="M17 3h-2v7h2V3zm3 12.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zM19 3v7h2V3h-2z"/></g>
+<g id="power"><path d="M16.01 7L16 3h-2v4h-4V3H8v4h-.01C7 6.99 6 7.99 6 8.99v5.49L9.5 18v3h5v-3l3.5-3.51v-5.5c0-1-1-2-1.99-1.99z"/></g>
+<g id="priority-high"><circle cx="12" cy="19" r="2"/><path d="M10 3h4v12h-4z"/></g>
+<g id="rv-hookup"><path d="M20 17v-6c0-1.1-.9-2-2-2H7V7l-3 3 3 3v-2h4v3H4v3c0 1.1.9 2 2 2h2c0 1.66 1.34 3 3 3s3-1.34 3-3h8v-2h-2zm-9 3c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm7-6h-4v-3h4v3zM17 2v2H9v2h8v2l3-3z"/></g>
+<g id="sd-card"><path d="M18 2h-8L4.02 8 4 20c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-6 6h-2V4h2v4zm3 0h-2V4h2v4zm3 0h-2V4h2v4z"/></g>
+<g id="sim-card-alert"><path d="M18 2h-8L4.02 8 4 20c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-5 15h-2v-2h2v2zm0-4h-2V8h2v5z"/></g>
+<g id="sms"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM9 11H7V9h2v2zm4 0h-2V9h2v2zm4 0h-2V9h2v2z"/></g>
+<g id="sms-failed"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 12h-2v-2h2v2zm0-4h-2V6h2v4z"/></g>
+<g id="sync"><path d="M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z"/></g>
+<g id="sync-disabled"><path d="M10 6.35V4.26c-.8.21-1.55.54-2.23.96l1.46 1.46c.25-.12.5-.24.77-.33zm-7.14-.94l2.36 2.36C4.45 8.99 4 10.44 4 12c0 2.21.91 4.2 2.36 5.64L4 20h6v-6l-2.24 2.24C6.68 15.15 6 13.66 6 12c0-1 .25-1.94.68-2.77l8.08 8.08c-.25.13-.5.25-.77.34v2.09c.8-.21 1.55-.54 2.23-.96l2.36 2.36 1.27-1.27L4.14 4.14 2.86 5.41zM20 4h-6v6l2.24-2.24C17.32 8.85 18 10.34 18 12c0 1-.25 1.94-.68 2.77l1.46 1.46C19.55 15.01 20 13.56 20 12c0-2.21-.91-4.2-2.36-5.64L20 4z"/></g>
+<g id="sync-problem"><path d="M3 12c0 2.21.91 4.2 2.36 5.64L3 20h6v-6l-2.24 2.24C5.68 15.15 5 13.66 5 12c0-2.61 1.67-4.83 4-5.65V4.26C5.55 5.15 3 8.27 3 12zm8 5h2v-2h-2v2zM21 4h-6v6l2.24-2.24C18.32 8.85 19 10.34 19 12c0 2.61-1.67 4.83-4 5.65v2.09c3.45-.89 6-4.01 6-7.74 0-2.21-.91-4.2-2.36-5.64L21 4zm-10 9h2V7h-2v6z"/></g>
+<g id="system-update"><path d="M17 1.01L7 1c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM17 19H7V5h10v14zm-1-6h-3V8h-2v5H8l4 4 4-4z"/></g>
+<g id="tap-and-play"><path d="M2 16v2c2.76 0 5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0 4v3h3c0-1.66-1.34-3-3-3zm0-8v2c4.97 0 9 4.03 9 9h2c0-6.08-4.92-11-11-11zM17 1.01L7 1c-1.1 0-2 .9-2 2v7.37c.69.16 1.36.37 2 .64V5h10v13h-3.03c.52 1.25.84 2.59.95 4H17c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99z"/></g>
+<g id="time-to-leave"><path d="M18.92 5.01C18.72 4.42 18.16 4 17.5 4h-11c-.66 0-1.21.42-1.42 1.01L3 11v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zM6.5 15c-.83 0-1.5-.67-1.5-1.5S5.67 12 6.5 12s1.5.67 1.5 1.5S7.33 15 6.5 15zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zM5 10l1.5-4.5h11L19 10H5z"/></g>
+<g id="vibration"><path d="M0 15h2V9H0v6zm3 2h2V7H3v10zm19-8v6h2V9h-2zm-3 8h2V7h-2v10zM16.5 3h-9C6.67 3 6 3.67 6 4.5v15c0 .83.67 1.5 1.5 1.5h9c.83 0 1.5-.67 1.5-1.5v-15c0-.83-.67-1.5-1.5-1.5zM16 19H8V5h8v14z"/></g>
+<g id="voice-chat"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-2 12l-4-3.2V14H6V6h8v3.2L18 6v8z"/></g>
+<g id="vpn-lock"><path d="M22 4v-.5C22 2.12 20.88 1 19.5 1S17 2.12 17 3.5V4c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h5c.55 0 1-.45 1-1V5c0-.55-.45-1-1-1zm-.8 0h-3.4v-.5c0-.94.76-1.7 1.7-1.7s1.7.76 1.7 1.7V4zm-2.28 8c.04.33.08.66.08 1 0 2.08-.8 3.97-2.1 5.39-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H7v-2h2c.55 0 1-.45 1-1V8h2c1.1 0 2-.9 2-2V3.46c-.95-.3-1.95-.46-3-.46C5.48 3 1 7.48 1 13s4.48 10 10 10 10-4.48 10-10c0-.34-.02-.67-.05-1h-2.03zM10 20.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L8 16v1c0 1.1.9 2 2 2v1.93z"/></g>
+<g id="wc"><path d="M5.5 22v-7.5H4V9c0-1.1.9-2 2-2h3c1.1 0 2 .9 2 2v5.5H9.5V22h-4zM18 22v-6h3l-2.54-7.63C18.18 7.55 17.42 7 16.56 7h-.12c-.86 0-1.63.55-1.9 1.37L12 16h3v6h3zM7.5 6c1.11 0 2-.89 2-2s-.89-2-2-2-2 .89-2 2 .89 2 2 2zm9 0c1.11 0 2-.89 2-2s-.89-2-2-2-2 .89-2 2 .89 2 2 2z"/></g>
+<g id="wifi"><path d="M1 9l2 2c4.97-4.97 13.03-4.97 18 0l2-2C16.93 2.93 7.08 2.93 1 9zm8 8l3 3 3-3c-1.65-1.66-4.34-1.66-6 0zm-4-4l2 2c2.76-2.76 7.24-2.76 10 0l2-2C15.14 9.14 8.87 9.14 5 13z"/></g>
+</defs></svg>
+</iron-iconset-svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/package-lock.json
new file mode 100644
index 00000000000..b66123d60f7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/package-lock.json
@@ -0,0 +1,1196 @@
+{
+ "name": "@polymer/iron-icons",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.1.tgz",
+ "integrity": "sha512-N0rNp+F8Cp0iQ40i3Lx3onWnRXMnfMosR9WFE+IHMF4k5Fv2toRYz77EZMEPPZCz1tzFmCUelHxvxpdssT9oCw==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.2",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.7"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.7"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.7",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.7.tgz",
+ "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.7"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.7"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.8.tgz",
+ "integrity": "sha512-QqR0j08RCS1AQYPMRPHikEpcmK+2aEEbcSzWLwOqyJ4FhLmHUx/WjRrnn7tTQg/y4IKnMhzskh/o7qvGIZZ7iA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.7"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.3",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.40",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.40.tgz",
+ "integrity": "sha512-AVxF2EcxvGD5hhOuLTOLAXBb0VhwWpEX0HyHdAI2zU+AAP4qEwtQj8voz1JR3uclGai0rfcE+dCTHnNMOnimFg==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.2.tgz",
+ "integrity": "sha512-hICrJJ5zUI7hnEBBluE2169CG3Xnn4D5HPeLkMjbiOyneSLTUX5Wz1d4FSi3xALUtzulIBStSt0S2tLXs8eVrg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.3.tgz",
+ "integrity": "sha512-7Z5PPegwDTyjbaeCnV0efcyS6vdKAU51kpEmS7QFib3P4822l8ICYyMn7qvJnc+WzLoDsuI9gPMKbJ8pCu8XtA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.8",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.102",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.40",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.9.0",
+ "resolve": "1.5.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.102",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.102.tgz",
+ "integrity": "sha512-EhNufyBoC1Kqaj+XMHGzi6mPUC8wVABOMTPE5XaSJc49LIVvXsyrV1HYMAPTUViT7E4wLUB38OdDmb+HshjGmA==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.9.0.tgz",
+ "integrity": "sha512-WPOqlV2W/M4Ni40QIqYSv8PE7H4rjiPm1KEf02QPtjZOGlAC4Rv7e6UJ1Ke1O70WT5bydcsEn3LViFIqYpVOJw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.102",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.102",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.102.tgz",
+ "integrity": "sha512-EhNufyBoC1Kqaj+XMHGzi6mPUC8wVABOMTPE5XaSJc49LIVvXsyrV1HYMAPTUViT7E4wLUB38OdDmb+HshjGmA==",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
+ "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/package.json
new file mode 100644
index 00000000000..e6360ac2d50
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@polymer/iron-icons",
+ "private": true,
+ "description": "A set of icons for use with iron-icon",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-icons"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.1",
+ "bower": "^1.8.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir ."
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/places-icons.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/places-icons.d.ts
new file mode 100644
index 00000000000..6b03265d44f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/places-icons.d.ts
@@ -0,0 +1,13 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * places-icons.html
+ */
+
+/// <reference path="../iron-icon/iron-icon.d.ts" />
+/// <reference path="../iron-iconset-svg/iron-iconset-svg.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/places-icons.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/places-icons.html
new file mode 100644
index 00000000000..fa4827bf02a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/places-icons.html
@@ -0,0 +1,35 @@
+<!--
+@license
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../iron-icon/iron-icon.html">
+<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
+<iron-iconset-svg name="places" size="24">
+<svg><defs>
+<g id="ac-unit"><path d="M22 11h-4.17l3.24-3.24-1.41-1.42L15 11h-2V9l4.66-4.66-1.42-1.41L13 6.17V2h-2v4.17L7.76 2.93 6.34 4.34 11 9v2H9L4.34 6.34 2.93 7.76 6.17 11H2v2h4.17l-3.24 3.24 1.41 1.42L9 13h2v2l-4.66 4.66 1.42 1.41L11 17.83V22h2v-4.17l3.24 3.24 1.42-1.41L13 15v-2h2l4.66 4.66 1.41-1.42L17.83 13H22z"/></g>
+<g id="airport-shuttle"><path d="M17 5H3c-1.1 0-2 .89-2 2v9h2c0 1.65 1.34 3 3 3s3-1.35 3-3h5.5c0 1.65 1.34 3 3 3s3-1.35 3-3H23v-5l-6-6zM3 11V7h4v4H3zm3 6.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm7-6.5H9V7h4v4zm4.5 6.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zM15 11V7h1l4 4h-5z"/></g>
+<g id="all-inclusive"><path d="M18.6 6.62c-1.44 0-2.8.56-3.77 1.53L12 10.66 10.48 12h.01L7.8 14.39c-.64.64-1.49.99-2.4.99-1.87 0-3.39-1.51-3.39-3.38S3.53 8.62 5.4 8.62c.91 0 1.76.35 2.44 1.03l1.13 1 1.51-1.34L9.22 8.2C8.2 7.18 6.84 6.62 5.4 6.62 2.42 6.62 0 9.04 0 12s2.42 5.38 5.4 5.38c1.44 0 2.8-.56 3.77-1.53l2.83-2.5.01.01L13.52 12h-.01l2.69-2.39c.64-.64 1.49-.99 2.4-.99 1.87 0 3.39 1.51 3.39 3.38s-1.52 3.38-3.39 3.38c-.9 0-1.76-.35-2.44-1.03l-1.14-1.01-1.51 1.34 1.27 1.12c1.02 1.01 2.37 1.57 3.82 1.57 2.98 0 5.4-2.41 5.4-5.38s-2.42-5.37-5.4-5.37z"/></g>
+<g id="beach-access"><path d="M13.127 14.56l1.43-1.43 6.44 6.443L19.57 21zm4.293-5.73l2.86-2.86c-3.95-3.95-10.35-3.96-14.3-.02 3.93-1.3 8.31-.25 11.44 2.88zM5.95 5.98c-3.94 3.95-3.93 10.35.02 14.3l2.86-2.86C5.7 14.29 4.65 9.91 5.95 5.98zm.02-.02l-.01.01c-.38 3.01 1.17 6.88 4.3 10.02l5.73-5.73c-3.13-3.13-7.01-4.68-10.02-4.3z"/></g>
+<g id="business-center"><path d="M10 16v-1H3.01L3 19c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2v-4h-7v1h-4zm10-9h-4.01V5l-2-2h-4l-2 2v2H4c-1.1 0-2 .9-2 2v3c0 1.11.89 2 2 2h6v-2h4v2h6c1.1 0 2-.9 2-2V9c0-1.1-.9-2-2-2zm-6 0h-4V5h4v2z"/></g>
+<g id="casino"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM7.5 18c-.83 0-1.5-.67-1.5-1.5S6.67 15 7.5 15s1.5.67 1.5 1.5S8.33 18 7.5 18zm0-9C6.67 9 6 8.33 6 7.5S6.67 6 7.5 6 9 6.67 9 7.5 8.33 9 7.5 9zm4.5 4.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm4.5 4.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm0-9c-.83 0-1.5-.67-1.5-1.5S15.67 6 16.5 6s1.5.67 1.5 1.5S17.33 9 16.5 9z"/></g>
+<g id="child-care"><circle cx="14.5" cy="10.5" r="1.25"/><circle cx="9.5" cy="10.5" r="1.25"/><path d="M22.94 12.66c.04-.21.06-.43.06-.66s-.02-.45-.06-.66c-.25-1.51-1.36-2.74-2.81-3.17-.53-1.12-1.28-2.1-2.19-2.91C16.36 3.85 14.28 3 12 3s-4.36.85-5.94 2.26c-.92.81-1.67 1.8-2.19 2.91-1.45.43-2.56 1.65-2.81 3.17-.04.21-.06.43-.06.66s.02.45.06.66c.25 1.51 1.36 2.74 2.81 3.17.52 1.11 1.27 2.09 2.17 2.89C7.62 20.14 9.71 21 12 21s4.38-.86 5.97-2.28c.9-.8 1.65-1.79 2.17-2.89 1.44-.43 2.55-1.65 2.8-3.17zM19 14c-.1 0-.19-.02-.29-.03-.2.67-.49 1.29-.86 1.86C16.6 17.74 14.45 19 12 19s-4.6-1.26-5.85-3.17c-.37-.57-.66-1.19-.86-1.86-.1.01-.19.03-.29.03-1.1 0-2-.9-2-2s.9-2 2-2c.1 0 .19.02.29.03.2-.67.49-1.29.86-1.86C7.4 6.26 9.55 5 12 5s4.6 1.26 5.85 3.17c.37.57.66 1.19.86 1.86.1-.01.19-.03.29-.03 1.1 0 2 .9 2 2s-.9 2-2 2zM7.5 14c.76 1.77 2.49 3 4.5 3s3.74-1.23 4.5-3h-9z"/></g>
+<g id="child-friendly"><path d="M13 2v8h8c0-4.42-3.58-8-8-8zm6.32 13.89C20.37 14.54 21 12.84 21 11H6.44l-.95-2H2v2h2.22s1.89 4.07 2.12 4.42c-1.1.59-1.84 1.75-1.84 3.08C4.5 20.43 6.07 22 8 22c1.76 0 3.22-1.3 3.46-3h2.08c.24 1.7 1.7 3 3.46 3 1.93 0 3.5-1.57 3.5-3.5 0-1.04-.46-1.97-1.18-2.61zM8 20c-.83 0-1.5-.67-1.5-1.5S7.17 17 8 17s1.5.67 1.5 1.5S8.83 20 8 20zm9 0c-.83 0-1.5-.67-1.5-1.5S16.17 17 17 17s1.5.67 1.5 1.5S17.83 20 17 20z"/></g>
+<g id="fitness-center"><path d="M20.57 14.86L22 13.43 20.57 12 17 15.57 8.43 7 12 3.43 10.57 2 9.14 3.43 7.71 2 5.57 4.14 4.14 2.71 2.71 4.14l1.43 1.43L2 7.71l1.43 1.43L2 10.57 3.43 12 7 8.43 15.57 17 12 20.57 13.43 22l1.43-1.43L16.29 22l2.14-2.14 1.43 1.43 1.43-1.43-1.43-1.43L22 16.29z"/></g>
+<g id="free-breakfast"><path d="M20 3H4v10c0 2.21 1.79 4 4 4h6c2.21 0 4-1.79 4-4v-3h2c1.11 0 2-.9 2-2V5c0-1.11-.89-2-2-2zm0 5h-2V5h2v3zM4 19h16v2H4z"/></g>
+<g id="golf-course"><circle cx="19.5" cy="19.5" r="1.5"/><path d="M17 5.92L9 2v18H7v-1.73c-1.79.35-3 .99-3 1.73 0 1.1 2.69 2 6 2s6-.9 6-2c0-.99-2.16-1.81-5-1.97V8.98l6-3.06z"/></g>
+<g id="hot-tub"><circle cx="7" cy="6" r="2"/><path d="M11.15 12c-.31-.22-.59-.46-.82-.72l-1.4-1.55c-.19-.21-.43-.38-.69-.5-.29-.14-.62-.23-.96-.23h-.03C6.01 9 5 10.01 5 11.25V12H2v8c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-8H11.15zM7 20H5v-6h2v6zm4 0H9v-6h2v6zm4 0h-2v-6h2v6zm4 0h-2v-6h2v6zm-.35-14.14l-.07-.07c-.57-.62-.82-1.41-.67-2.2L18 3h-1.89l-.06.43c-.2 1.36.27 2.71 1.3 3.72l.07.06c.57.62.82 1.41.67 2.2l-.11.59h1.91l.06-.43c.21-1.36-.27-2.71-1.3-3.71zm-4 0l-.07-.07c-.57-.62-.82-1.41-.67-2.2L14 3h-1.89l-.06.43c-.2 1.36.27 2.71 1.3 3.72l.07.06c.57.62.82 1.41.67 2.2l-.11.59h1.91l.06-.43c.21-1.36-.27-2.71-1.3-3.71z"/></g>
+<g id="kitchen"><path d="M18 2.01L6 2c-1.1 0-2 .89-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.11-.9-1.99-2-1.99zM18 20H6v-9.02h12V20zm0-11H6V4h12v5zM8 5h2v3H8zm0 7h2v5H8z"/></g>
+<g id="pool"><path d="M22 21c-1.11 0-1.73-.37-2.18-.64-.37-.22-.6-.36-1.15-.36-.56 0-.78.13-1.15.36-.46.27-1.07.64-2.18.64s-1.73-.37-2.18-.64c-.37-.22-.6-.36-1.15-.36-.56 0-.78.13-1.15.36-.46.27-1.08.64-2.19.64-1.11 0-1.73-.37-2.18-.64-.37-.23-.6-.36-1.15-.36s-.78.13-1.15.36c-.46.27-1.08.64-2.19.64v-2c.56 0 .78-.13 1.15-.36.46-.27 1.08-.64 2.19-.64s1.73.37 2.18.64c.37.23.59.36 1.15.36.56 0 .78-.13 1.15-.36.46-.27 1.08-.64 2.19-.64 1.11 0 1.73.37 2.18.64.37.22.6.36 1.15.36s.78-.13 1.15-.36c.45-.27 1.07-.64 2.18-.64s1.73.37 2.18.64c.37.23.59.36 1.15.36v2zm0-4.5c-1.11 0-1.73-.37-2.18-.64-.37-.22-.6-.36-1.15-.36-.56 0-.78.13-1.15.36-.45.27-1.07.64-2.18.64s-1.73-.37-2.18-.64c-.37-.22-.6-.36-1.15-.36-.56 0-.78.13-1.15.36-.45.27-1.07.64-2.18.64s-1.73-.37-2.18-.64c-.37-.22-.6-.36-1.15-.36s-.78.13-1.15.36c-.47.27-1.09.64-2.2.64v-2c.56 0 .78-.13 1.15-.36.45-.27 1.07-.64 2.18-.64s1.73.37 2.18.64c.37.22.6.36 1.15.36.56 0 .78-.13 1.15-.36.45-.27 1.07-.64 2.18-.64s1.73.37 2.18.64c.37.22.6.36 1.15.36s.78-.13 1.15-.36c.45-.27 1.07-.64 2.18-.64s1.73.37 2.18.64c.37.22.6.36 1.15.36v2zM8.67 12c.56 0 .78-.13 1.15-.36.46-.27 1.08-.64 2.19-.64 1.11 0 1.73.37 2.18.64.37.22.6.36 1.15.36s.78-.13 1.15-.36c.12-.07.26-.15.41-.23L10.48 5C8.93 3.45 7.5 2.99 5 3v2.5c1.82-.01 2.89.39 4 1.5l1 1-3.25 3.25c.31.12.56.27.77.39.37.23.59.36 1.15.36z"/><circle cx="16.5" cy="5.5" r="2.5"/></g>
+<g id="room-service"><path d="M2 17h20v2H2zm11.84-9.21c.1-.24.16-.51.16-.79 0-1.1-.9-2-2-2s-2 .9-2 2c0 .28.06.55.16.79C6.25 8.6 3.27 11.93 3 16h18c-.27-4.07-3.25-7.4-7.16-8.21z"/></g>
+<g id="rv-hookup"><path d="M20 17v-6c0-1.1-.9-2-2-2H7V7l-3 3 3 3v-2h4v3H4v3c0 1.1.9 2 2 2h2c0 1.66 1.34 3 3 3s3-1.34 3-3h8v-2h-2zm-9 3c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm7-6h-4v-3h4v3zM17 2v2H9v2h8v2l3-3z"/></g>
+<g id="smoke-free"><path d="M2 6l6.99 7H2v3h9.99l7 7 1.26-1.25-17-17zm18.5 7H22v3h-1.5zM18 13h1.5v3H18zm.85-8.12c.62-.61 1-1.45 1-2.38h-1.5c0 1.02-.83 1.85-1.85 1.85v1.5c2.24 0 4 1.83 4 4.07V12H22V9.92c0-2.23-1.28-4.15-3.15-5.04zM14.5 8.7h1.53c1.05 0 1.97.74 1.97 2.05V12h1.5v-1.59c0-1.8-1.6-3.16-3.47-3.16H14.5c-1.02 0-1.85-.98-1.85-2s.83-1.75 1.85-1.75V2c-1.85 0-3.35 1.5-3.35 3.35s1.5 3.35 3.35 3.35zm2.5 7.23V13h-2.93z"/></g>
+<g id="smoking-rooms"><path d="M2 16h15v3H2zm18.5 0H22v3h-1.5zM18 16h1.5v3H18zm.85-8.27c.62-.61 1-1.45 1-2.38C19.85 3.5 18.35 2 16.5 2v1.5c1.02 0 1.85.83 1.85 1.85S17.52 7.2 16.5 7.2v1.5c2.24 0 4 1.83 4 4.07V15H22v-2.24c0-2.22-1.28-4.14-3.15-5.03zm-2.82 2.47H14.5c-1.02 0-1.85-.98-1.85-2s.83-1.75 1.85-1.75v-1.5c-1.85 0-3.35 1.5-3.35 3.35s1.5 3.35 3.35 3.35h1.53c1.05 0 1.97.74 1.97 2.05V15h1.5v-1.64c0-1.81-1.6-3.16-3.47-3.16z"/></g>
+<g id="spa"><path d="M8.55 12c-1.07-.71-2.25-1.27-3.53-1.61 1.28.34 2.46.9 3.53 1.61zm10.43-1.61c-1.29.34-2.49.91-3.57 1.64 1.08-.73 2.28-1.3 3.57-1.64z"/><path d="M15.49 9.63c-.18-2.79-1.31-5.51-3.43-7.63-2.14 2.14-3.32 4.86-3.55 7.63 1.28.68 2.46 1.56 3.49 2.63 1.03-1.06 2.21-1.94 3.49-2.63zm-6.5 2.65c-.14-.1-.3-.19-.45-.29.15.11.31.19.45.29zm6.42-.25c-.13.09-.27.16-.4.26.13-.1.27-.17.4-.26zM12 15.45C9.85 12.17 6.18 10 2 10c0 5.32 3.36 9.82 8.03 11.49.63.23 1.29.4 1.97.51.68-.12 1.33-.29 1.97-.51C18.64 19.82 22 15.32 22 10c-4.18 0-7.85 2.17-10 5.45z"/></g>
+</defs></svg>
+</iron-iconset-svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/social-icons.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/social-icons.d.ts
new file mode 100644
index 00000000000..c7cbfe0f344
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/social-icons.d.ts
@@ -0,0 +1,13 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * social-icons.html
+ */
+
+/// <reference path="../iron-icon/iron-icon.d.ts" />
+/// <reference path="../iron-iconset-svg/iron-iconset-svg.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/social-icons.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/social-icons.html
new file mode 100644
index 00000000000..a0424735edf
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-icons/social-icons.html
@@ -0,0 +1,46 @@
+<!--
+@license
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../iron-icon/iron-icon.html">
+<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
+<iron-iconset-svg name="social" size="24">
+<svg><defs>
+<g id="cake"><path d="M12 6c1.11 0 2-.9 2-2 0-.38-.1-.73-.29-1.03L12 0l-1.71 2.97c-.19.3-.29.65-.29 1.03 0 1.1.9 2 2 2zm4.6 9.99l-1.07-1.07-1.08 1.07c-1.3 1.3-3.58 1.31-4.89 0l-1.07-1.07-1.09 1.07C6.75 16.64 5.88 17 4.96 17c-.73 0-1.4-.23-1.96-.61V21c0 .55.45 1 1 1h16c.55 0 1-.45 1-1v-4.61c-.56.38-1.23.61-1.96.61-.92 0-1.79-.36-2.44-1.01zM18 9h-5V7h-2v2H6c-1.66 0-3 1.34-3 3v1.54c0 1.08.88 1.96 1.96 1.96.52 0 1.02-.2 1.38-.57l2.14-2.13 2.13 2.13c.74.74 2.03.74 2.77 0l2.14-2.13 2.13 2.13c.37.37.86.57 1.38.57 1.08 0 1.96-.88 1.96-1.96V12C21 10.34 19.66 9 18 9z"/></g>
+<g id="domain"><path d="M12 7V3H2v18h20V7H12zM6 19H4v-2h2v2zm0-4H4v-2h2v2zm0-4H4V9h2v2zm0-4H4V5h2v2zm4 12H8v-2h2v2zm0-4H8v-2h2v2zm0-4H8V9h2v2zm0-4H8V5h2v2zm10 12h-8v-2h2v-2h-2v-2h2v-2h-2V9h8v10zm-2-8h-2v2h2v-2zm0 4h-2v2h2v-2z"/></g>
+<g id="group"><path d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z"/></g>
+<g id="group-add"><path d="M8 10H5V7H3v3H0v2h3v3h2v-3h3v-2zm10 1c1.66 0 2.99-1.34 2.99-3S19.66 5 18 5c-.32 0-.63.05-.91.14.57.81.9 1.79.9 2.86s-.34 2.04-.9 2.86c.28.09.59.14.91.14zm-5 0c1.66 0 2.99-1.34 2.99-3S14.66 5 13 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm6.62 2.16c.83.73 1.38 1.66 1.38 2.84v2h3v-2c0-1.54-2.37-2.49-4.38-2.84zM13 13c-2 0-6 1-6 3v2h12v-2c0-2-4-3-6-3z"/></g>
+<g id="location-city"><path d="M15 11V5l-3-3-3 3v2H3v14h18V11h-6zm-8 8H5v-2h2v2zm0-4H5v-2h2v2zm0-4H5V9h2v2zm6 8h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2V9h2v2zm0-4h-2V5h2v2zm6 12h-2v-2h2v2zm0-4h-2v-2h2v2z"/></g>
+<g id="mood"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z"/></g>
+<g id="mood-bad"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 3c-2.33 0-4.31 1.46-5.11 3.5h10.22c-.8-2.04-2.78-3.5-5.11-3.5z"/></g>
+<g id="notifications"><path d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z"/></g>
+<g id="notifications-active"><path d="M7.58 4.08L6.15 2.65C3.75 4.48 2.17 7.3 2.03 10.5h2c.15-2.65 1.51-4.97 3.55-6.42zm12.39 6.42h2c-.15-3.2-1.73-6.02-4.12-7.85l-1.42 1.43c2.02 1.45 3.39 3.77 3.54 6.42zM18 11c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2v-5zm-6 11c.14 0 .27-.01.4-.04.65-.14 1.18-.58 1.44-1.18.1-.24.15-.5.15-.78h-4c.01 1.1.9 2 2.01 2z"/></g>
+<g id="notifications-none"><path d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.9 2 2 2zm6-6v-5c0-3.07-1.63-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.64 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2zm-2 1H8v-6c0-2.48 1.51-4.5 4-4.5s4 2.02 4 4.5v6z"/></g>
+<g id="notifications-off"><path d="M20 18.69L7.84 6.14 5.27 3.49 4 4.76l2.8 2.8v.01c-.52.99-.8 2.16-.8 3.42v5l-2 2v1h13.73l2 2L21 19.72l-1-1.03zM12 22c1.11 0 2-.89 2-2h-4c0 1.11.89 2 2 2zm6-7.32V11c0-3.08-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68c-.15.03-.29.08-.42.12-.1.03-.2.07-.3.11h-.01c-.01 0-.01 0-.02.01-.23.09-.46.2-.68.31 0 0-.01 0-.01.01L18 14.68z"/></g>
+<g id="notifications-paused"><path d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.93 6 11v5l-2 2v1h16v-1l-2-2zm-3.5-6.2l-2.8 3.4h2.8V15h-5v-1.8l2.8-3.4H9.5V8h5v1.8z"/></g>
+<g id="pages"><path d="M3 5v6h5L7 7l4 1V3H5c-1.1 0-2 .9-2 2zm5 8H3v6c0 1.1.9 2 2 2h6v-5l-4 1 1-4zm9 4l-4-1v5h6c1.1 0 2-.9 2-2v-6h-5l1 4zm2-14h-6v5l4-1-1 4h5V5c0-1.1-.9-2-2-2z"/></g>
+<g id="party-mode"><path d="M20 4h-3.17L15 2H9L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 3c1.63 0 3.06.79 3.98 2H12c-1.66 0-3 1.34-3 3 0 .35.07.69.18 1H7.1c-.06-.32-.1-.66-.1-1 0-2.76 2.24-5 5-5zm0 10c-1.63 0-3.06-.79-3.98-2H12c1.66 0 3-1.34 3-3 0-.35-.07-.69-.18-1h2.08c.07.32.1.66.1 1 0 2.76-2.24 5-5 5z"/></g>
+<g id="people"><path d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z"/></g>
+<g id="people-outline"><path d="M16.5 13c-1.2 0-3.07.34-4.5 1-1.43-.67-3.3-1-4.5-1C5.33 13 1 14.08 1 16.25V19h22v-2.75c0-2.17-4.33-3.25-6.5-3.25zm-4 4.5h-10v-1.25c0-.54 2.56-1.75 5-1.75s5 1.21 5 1.75v1.25zm9 0H14v-1.25c0-.46-.2-.86-.52-1.22.88-.3 1.96-.53 3.02-.53 2.44 0 5 1.21 5 1.75v1.25zM7.5 12c1.93 0 3.5-1.57 3.5-3.5S9.43 5 7.5 5 4 6.57 4 8.5 5.57 12 7.5 12zm0-5.5c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 5.5c1.93 0 3.5-1.57 3.5-3.5S18.43 5 16.5 5 13 6.57 13 8.5s1.57 3.5 3.5 3.5zm0-5.5c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2z"/></g>
+<g id="person"><path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"/></g>
+<g id="person-add"><path d="M15 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm-9-2V7H4v3H1v2h3v3h2v-3h3v-2H6zm9 4c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"/></g>
+<g id="person-outline"><path d="M12 5.9c1.16 0 2.1.94 2.1 2.1s-.94 2.1-2.1 2.1S9.9 9.16 9.9 8s.94-2.1 2.1-2.1m0 9c2.97 0 6.1 1.46 6.1 2.1v1.1H5.9V17c0-.64 3.13-2.1 6.1-2.1M12 4C9.79 4 8 5.79 8 8s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 9c-2.67 0-8 1.34-8 4v3h16v-3c0-2.66-5.33-4-8-4z"/></g>
+<g id="plus-one"><path d="M10 8H8v4H4v2h4v4h2v-4h4v-2h-4zm4.5-1.92V7.9l2.5-.5V18h2V5z"/></g>
+<g id="poll"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/></g>
+<g id="public"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z"/></g>
+<g id="school"><path d="M5 13.18v4L12 21l7-3.82v-4L12 17l-7-3.82zM12 3L1 9l11 6 9-4.91V17h2V9L12 3z"/></g>
+<g id="sentiment-dissatisfied"><circle cx="15.5" cy="9.5" r="1.5"/><circle cx="8.5" cy="9.5" r="1.5"/><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm0-6c-2.33 0-4.32 1.45-5.12 3.5h1.67c.69-1.19 1.97-2 3.45-2s2.75.81 3.45 2h1.67c-.8-2.05-2.79-3.5-5.12-3.5z"/></g>
+<g id="sentiment-neutral"><path d="M9 14h6v1.5H9z"/><circle cx="15.5" cy="9.5" r="1.5"/><circle cx="8.5" cy="9.5" r="1.5"/><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"/></g>
+<g id="sentiment-satisfied"><circle cx="15.5" cy="9.5" r="1.5"/><circle cx="8.5" cy="9.5" r="1.5"/><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm0-4c-1.48 0-2.75-.81-3.45-2H6.88c.8 2.05 2.79 3.5 5.12 3.5s4.32-1.45 5.12-3.5h-1.67c-.7 1.19-1.97 2-3.45 2z"/></g>
+<g id="sentiment-very-dissatisfied"><path d="M11.99 2C6.47 2 2 6.47 2 12s4.47 10 9.99 10S22 17.53 22 12 17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm4.18-12.24l-1.06 1.06-1.06-1.06L13 8.82l1.06 1.06L13 10.94 14.06 12l1.06-1.06L16.18 12l1.06-1.06-1.06-1.06 1.06-1.06zM7.82 12l1.06-1.06L9.94 12 11 10.94 9.94 9.88 11 8.82 9.94 7.76 8.88 8.82 7.82 7.76 6.76 8.82l1.06 1.06-1.06 1.06zM12 14c-2.33 0-4.31 1.46-5.11 3.5h10.22c-.8-2.04-2.78-3.5-5.11-3.5z"/></g>
+<g id="sentiment-very-satisfied"><path d="M11.99 2C6.47 2 2 6.47 2 12s4.47 10 9.99 10S22 17.53 22 12 17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm1-10.06L14.06 11l1.06-1.06L16.18 11l1.06-1.06-2.12-2.12zm-4.12 0L9.94 11 11 9.94 8.88 7.82 6.76 9.94 7.82 11zM12 17.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z"/></g>
+<g id="share"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z"/></g>
+<g id="whatshot"><path d="M13.5.67s.74 2.65.74 4.8c0 2.06-1.35 3.73-3.41 3.73-2.07 0-3.63-1.67-3.63-3.73l.03-.36C5.21 7.51 4 10.62 4 14c0 4.42 3.58 8 8 8s8-3.58 8-8C20 8.61 17.41 3.8 13.5.67zM11.71 19c-1.78 0-3.22-1.4-3.22-3.14 0-1.62 1.05-2.76 2.81-3.12 1.77-.36 3.6-1.21 4.62-2.58.39 1.29.59 2.65.59 4.04 0 2.65-2.15 4.8-4.8 4.8z"/></g>
+</defs></svg>
+</iron-iconset-svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/.bower.json
new file mode 100644
index 00000000000..e813deebfe9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/.bower.json
@@ -0,0 +1,65 @@
+{
+ "name": "iron-iconset-svg",
+ "description": "Manages a set of svg icons",
+ "version": "2.2.1",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "icon"
+ ],
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "private": true,
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-iconset-svg.git"
+ },
+ "main": "iron-iconset-svg.html",
+ "ignore": [],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-meta": "PolymerElements/iron-meta#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "polymerelements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-icon": "PolymerElements/iron-icon#1 - 2",
+ "promise-polyfill": "polymerlabs/promise-polyfill#1 - 2",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
+ "web-component-tester": "^6.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-meta": "polymerelements/iron-meta#^1.0.0"
+ },
+ "devDependencies": {
+ "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-icon": "polymerelements/iron-icon#^1.0.0",
+ "promise-polyfill": "polymerlabs/promise-polyfill#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "homepage": "https://github.com/PolymerElements/iron-iconset-svg",
+ "_release": "2.2.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.2.1",
+ "commit": "65b04ec3aaeb46efa11be109aa41ea0c6d327a32"
+ },
+ "_source": "https://github.com/PolymerElements/iron-iconset-svg.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/iron-iconset-svg"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/.github/CODEOWNERS
new file mode 100644
index 00000000000..0d8c0ad6b48
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @bicknellr
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..9f7691f53c4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-iconset-svg/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/.travis.yml
new file mode 100644
index 00000000000..5f6187be91e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/.travis.yml
@@ -0,0 +1,32 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e '\n\033[31mERROR:\033[0m
+ Project is not formatted. Please run "npm run format".' && false)
+env:
+ global:
+ - secure: >-
+ FVt0rYGSWqJW3i57y9CQHuDaa97UDwZuGc5ts+TDpbuR3DVP8LxB9MT1ApA2bqhg101hPzhWJWIK3Siotkb7eAlsiWgVhdNr8t5eZBPOOnjLiU6PNCF6ZGCZRJHQ6q4xQ2DycGug8OfwMw63yewLEYmVBppeAlStnPUfDWURlJ8=
+ - secure: >-
+ X7cWxU13zLWoahM/BNBPSvgnI396zMmLzVHDHX6zAQL7gFL+PS4Dz6WjooO3Jx79ks2E8REUzWB8IFY3FohVAncXA///PAaqNLX0k2et4aOTOs5tcsCWL4nj8tKA6vjZIZ61rCjWTyNRR+o2QPsY9QQgi3Y+6bzLguWoPuycRbE=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/README.md
new file mode 100644
index 00000000000..bf8c40a5c71
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/README.md
@@ -0,0 +1,40 @@
+[![Build status](https://travis-ci.org/PolymerElements/iron-iconset-svg.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-iconset-svg)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/iron-iconset-svg)_
+
+
+## &lt;iron-iconset-svg&gt;
+
+The `iron-iconset-svg` element allows users to define their own icon sets
+that contain svg icons. The svg icon elements should be children of the
+`iron-iconset-svg` element. Multiple icons should be given distinct id's.
+
+Using svg elements to create icons has a few advantages over traditional
+bitmap graphics like jpg or png. Icons that use svg are vector based so
+they are resolution independent and should look good on any device. They
+are stylable via css. Icons can be themed, colorized, and even animated.
+
+Example:
+
+```html
+<iron-iconset-svg name="my-svg-icons" size="24">
+ <svg>
+ <defs>
+ <g id="shape">
+ <rect x="12" y="0" width="12" height="24" />
+ <circle cx="12" cy="12" r="12" />
+ </g>
+ </defs>
+ </svg>
+</iron-iconset-svg>
+```
+
+This will automatically register the icon set "my-svg-icons" to the iconset
+database. To use these icons from within another element, make a
+`iron-iconset` element and call the `byId` method
+to retrieve a given iconset. To apply a particular icon inside an
+element use the `applyIcon` method. For example:
+
+```javascript
+iconset.applyIcon(iconNode, 'car');
+```
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/bower.json
new file mode 100644
index 00000000000..fb61b8ea152
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/bower.json
@@ -0,0 +1,55 @@
+{
+ "name": "iron-iconset-svg",
+ "description": "Manages a set of svg icons",
+ "version": "2.2.1",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "icon"
+ ],
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "private": true,
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-iconset-svg.git"
+ },
+ "main": "iron-iconset-svg.html",
+ "ignore": [],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-meta": "PolymerElements/iron-meta#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "polymerelements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-icon": "PolymerElements/iron-icon#1 - 2",
+ "promise-polyfill": "polymerlabs/promise-polyfill#1 - 2",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
+ "web-component-tester": "^6.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-meta": "polymerelements/iron-meta#^1.0.0"
+ },
+ "devDependencies": {
+ "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-icon": "polymerelements/iron-icon#^1.0.0",
+ "promise-polyfill": "polymerlabs/promise-polyfill#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/demo/index.html
new file mode 100644
index 00000000000..4ae9289ad81
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/demo/index.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<html>
+<head>
+ <title>iron-iconset-svg</title>
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../../iron-icon/iron-icon.html">
+ <link rel="import" href="../iron-iconset-svg.html">
+ <link rel="import" href="./svg-sample-icons.html">
+
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles"></style>
+ </custom-style>
+</head>
+<body>
+ <div class="vertical-section-container centered">
+ <h3>
+ Import a document with an <code>&lt;iron-iconset-svg&gt;</code> to use the
+ icons it contains with <code>&lt;iron-icon&gt;</code> elements in your page.
+ </h3>
+ <demo-snippet>
+ <template>
+ <!-- Import your document with an <iron-iconset-svg> in <head>:
+ <link rel="import" href="./svg-sample-icons.html">
+ -->
+
+ <custom-style>
+ <style is="custom-style">
+ iron-icon {
+ height: 64px;
+ width: 64px;
+ margin: 1em;
+
+ fill: black;
+ }
+
+ iron-icon:hover {
+ fill: blue;
+ }
+ </style>
+ </custom-style>
+
+ <iron-icon icon="svg-sample-icons:codepen" role="img" aria-label="CodePen logo"></iron-icon>
+ <iron-icon icon="svg-sample-icons:twitter" role="img" aria-label="Twitter logo"></iron-icon>
+ <iron-icon icon="svg-sample-icons:youtube" role="img" aria-label="YouTube logo"></iron-icon>
+ </template>
+ </demo-snippet>
+
+ <h3>
+ Use an inline <code>&lt;iron-iconset-svg&gt;</code> if you need to both
+ define and use your icons in the same document.
+ </h3>
+ <demo-snippet>
+ <template>
+ <iron-iconset-svg name="inline" size="24">
+ <svg>
+ <defs>
+ <g id="shape">
+ <rect x="12" y="0" width="12" height="24" />
+ <circle cx="12" cy="12" r="12" />
+ </g>
+ </defs>
+ </svg>
+ </iron-iconset-svg>
+
+ <iron-icon icon="inline:shape" role="img" aria-label="A shape"></iron-icon>
+ </template>
+ </demo-snippet>
+ </div>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/demo/svg-sample-icons.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/demo/svg-sample-icons.html
new file mode 100644
index 00000000000..3dd1d525481
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/demo/svg-sample-icons.html
@@ -0,0 +1,69 @@
+
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../iron-iconset-svg.html">
+
+<iron-iconset-svg name="svg-sample-icons" size="100">
+ <svg>
+ <defs>
+ <g id="codepen">
+ <path class="outer-ring" d="M50,0C22.385,0,0,22.385,0,50c0,27.615,22.385,50,50,50c27.614,0,50-22.385,50-50C100,22.385,77.615,0,50,0z M50,91.789
+ C26.958,91.789,8.212,73.042,8.212,50C8.212,26.958,26.958,8.212,50,8.212c23.042,0,41.788,18.747,41.788,41.789
+ C91.788,73.042,73.042,91.789,50,91.789z"></path>
+ <path class="inner-logo" d="M80.893,40.234c-0.006-0.039-0.016-0.076-0.022-0.115c-0.013-0.075-0.027-0.15-0.046-0.223
+ c-0.012-0.044-0.028-0.086-0.042-0.128c-0.021-0.065-0.042-0.13-0.068-0.193c-0.018-0.044-0.039-0.088-0.059-0.13
+ c-0.028-0.06-0.057-0.119-0.09-0.175c-0.024-0.042-0.051-0.083-0.076-0.124c-0.036-0.055-0.073-0.109-0.112-0.161
+ c-0.029-0.039-0.06-0.078-0.091-0.115c-0.042-0.049-0.086-0.098-0.132-0.143c-0.035-0.036-0.069-0.072-0.106-0.104
+ c-0.049-0.044-0.099-0.086-0.15-0.127c-0.04-0.031-0.079-0.062-0.12-0.091c-0.016-0.01-0.029-0.023-0.044-0.033L51.474,19.531
+ c-0.893-0.595-2.055-0.595-2.947,0L20.267,38.371c-0.015,0.01-0.028,0.023-0.044,0.033c-0.042,0.029-0.081,0.06-0.12,0.091
+ c-0.052,0.041-0.102,0.083-0.15,0.127c-0.037,0.032-0.071,0.068-0.106,0.104c-0.046,0.045-0.09,0.094-0.132,0.143
+ c-0.031,0.038-0.062,0.077-0.092,0.115c-0.039,0.052-0.076,0.106-0.111,0.161c-0.027,0.041-0.052,0.082-0.076,0.124
+ c-0.033,0.057-0.062,0.115-0.09,0.175c-0.021,0.042-0.042,0.086-0.06,0.13c-0.026,0.063-0.047,0.128-0.068,0.193
+ c-0.014,0.042-0.029,0.084-0.042,0.128c-0.02,0.073-0.032,0.148-0.046,0.223c-0.006,0.039-0.016,0.076-0.021,0.115
+ c-0.016,0.114-0.024,0.229-0.024,0.346V59.42c0,0.117,0.009,0.233,0.024,0.348c0.005,0.038,0.015,0.077,0.021,0.114
+ c0.014,0.075,0.027,0.149,0.046,0.223c0.012,0.043,0.028,0.086,0.042,0.128c0.021,0.065,0.042,0.13,0.068,0.195
+ c0.018,0.044,0.039,0.086,0.06,0.129c0.028,0.06,0.058,0.118,0.09,0.177c0.024,0.041,0.049,0.082,0.076,0.122
+ c0.035,0.056,0.072,0.109,0.111,0.161c0.029,0.041,0.061,0.078,0.092,0.115c0.042,0.049,0.086,0.098,0.132,0.144
+ c0.035,0.036,0.069,0.071,0.106,0.104c0.048,0.044,0.099,0.086,0.15,0.127c0.039,0.031,0.078,0.062,0.12,0.091
+ c0.016,0.01,0.029,0.023,0.044,0.032l28.259,18.84c0.446,0.297,0.96,0.447,1.474,0.447c0.513,0,1.027-0.149,1.473-0.447
+ l28.259-18.84c0.015-0.009,0.028-0.022,0.044-0.032c0.042-0.029,0.081-0.06,0.12-0.091c0.051-0.041,0.102-0.083,0.15-0.127
+ c0.037-0.033,0.071-0.068,0.106-0.104c0.046-0.046,0.09-0.095,0.132-0.144c0.031-0.037,0.062-0.075,0.091-0.115
+ c0.04-0.052,0.076-0.105,0.112-0.161c0.025-0.041,0.051-0.081,0.076-0.122c0.033-0.059,0.062-0.117,0.09-0.177
+ c0.02-0.042,0.041-0.085,0.059-0.129c0.026-0.065,0.047-0.13,0.068-0.195c0.014-0.042,0.03-0.085,0.042-0.128
+ c0.02-0.074,0.033-0.148,0.046-0.223c0.006-0.037,0.016-0.076,0.022-0.114c0.014-0.115,0.023-0.231,0.023-0.348V40.581
+ C80.916,40.464,80.907,40.348,80.893,40.234z M52.657,26.707l20.817,13.877l-9.298,6.221l-11.519-7.706V26.707z M47.343,26.707
+ v12.393l-11.518,7.706l-9.299-6.221L47.343,26.707z M24.398,45.554L31.046,50l-6.648,4.446V45.554z M47.343,73.294L26.525,59.417
+ l9.299-6.219l11.518,7.704V73.294z M50,56.286L40.603,50L50,43.715L59.397,50L50,56.286z M52.657,73.294V60.902l11.519-7.704
+ l9.298,6.219L52.657,73.294z M75.602,54.447L68.955,50l6.647-4.446V54.447z"></path>
+ </g>
+
+ <path id="twitter" d="M100.001,17.942c-3.681,1.688-7.633,2.826-11.783,3.339
+ c4.236-2.624,7.49-6.779,9.021-11.73c-3.965,2.432-8.354,4.193-13.026,5.146C80.47,10.575,75.138,8,69.234,8
+ c-11.33,0-20.518,9.494-20.518,21.205c0,1.662,0.183,3.281,0.533,4.833c-17.052-0.884-32.168-9.326-42.288-22.155
+ c-1.767,3.133-2.778,6.773-2.778,10.659c0,7.357,3.622,13.849,9.127,17.65c-3.363-0.109-6.525-1.064-9.293-2.651
+ c-0.002,0.089-0.002,0.178-0.002,0.268c0,10.272,7.072,18.845,16.458,20.793c-1.721,0.484-3.534,0.744-5.405,0.744
+ c-1.322,0-2.606-0.134-3.859-0.379c2.609,8.424,10.187,14.555,19.166,14.726c-7.021,5.688-15.867,9.077-25.48,9.077
+ c-1.656,0-3.289-0.102-4.895-0.297C9.08,88.491,19.865,92,31.449,92c37.737,0,58.374-32.312,58.374-60.336
+ c0-0.92-0.02-1.834-0.059-2.743C93.771,25.929,97.251,22.195,100.001,17.942L100.001,17.942z"></path>
+
+ <g id="youtube">
+ <path class="youtube" d="M98.77,27.492c-1.225-5.064-5.576-8.799-10.811-9.354C75.561,16.818,63.01,15.993,50.514,16
+ c-12.495-0.007-25.045,0.816-37.446,2.139c-5.235,0.557-9.583,4.289-10.806,9.354C0.522,34.704,0.5,42.574,0.5,50.001
+ c0,7.426,0,15.296,1.741,22.509c1.224,5.061,5.572,8.799,10.807,9.352c12.399,1.32,24.949,2.145,37.446,2.14
+ c12.494,0.005,25.047-0.817,37.443-2.14c5.234-0.555,9.586-4.291,10.81-9.352c1.741-7.213,1.753-15.083,1.753-22.509
+ S100.51,34.704,98.77,27.492 M67.549,52.203L43.977,64.391c-2.344,1.213-4.262,0.119-4.262-2.428V38.036
+ c0-2.548,1.917-3.644,4.262-2.429l23.572,12.188C69.896,49.008,69.896,50.992,67.549,52.203"></path>
+ </g>
+
+ </defs>
+
+ </svg>
+</iron-iconset-svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/index.html
new file mode 100644
index 00000000000..487bb5c38a5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/index.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/iron-iconset-svg.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/iron-iconset-svg.d.ts
new file mode 100644
index 00000000000..e2ed09b2556
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/iron-iconset-svg.d.ts
@@ -0,0 +1,142 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-iconset-svg.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-meta/iron-meta.d.ts" />
+
+/**
+ * The `iron-iconset-svg` element allows users to define their own icon sets
+ * that contain svg icons. The svg icon elements should be children of the
+ * `iron-iconset-svg` element. Multiple icons should be given distinct id's.
+ *
+ * Using svg elements to create icons has a few advantages over traditional
+ * bitmap graphics like jpg or png. Icons that use svg are vector based so
+ * they are resolution independent and should look good on any device. They
+ * are stylable via css. Icons can be themed, colorized, and even animated.
+ *
+ * Example:
+ *
+ * <iron-iconset-svg name="my-svg-icons" size="24">
+ * <svg>
+ * <defs>
+ * <g id="shape">
+ * <rect x="12" y="0" width="12" height="24" />
+ * <circle cx="12" cy="12" r="12" />
+ * </g>
+ * </defs>
+ * </svg>
+ * </iron-iconset-svg>
+ *
+ * This will automatically register the icon set "my-svg-icons" to the iconset
+ * database. To use these icons from within another element, make a
+ * `iron-iconset` element and call the `byId` method
+ * to retrieve a given iconset. To apply a particular icon inside an
+ * element use the `applyIcon` method. For example:
+ *
+ * iconset.applyIcon(iconNode, 'car');
+ */
+interface IronIconsetSvgElement extends Polymer.Element {
+
+ /**
+ * The name of the iconset.
+ */
+ name: string|null|undefined;
+
+ /**
+ * The size of an individual icon. Note that icons must be square.
+ */
+ size: number|null|undefined;
+
+ /**
+ * Set to true to enable mirroring of icons where specified when they are
+ * stamped. Icons that should be mirrored should be decorated with a
+ * `mirror-in-rtl` attribute.
+ *
+ * NOTE: For performance reasons, direction will be resolved once per
+ * document per iconset, so moving icons in and out of RTL subtrees will
+ * not cause their mirrored state to change.
+ */
+ rtlMirroring: boolean|null|undefined;
+
+ /**
+ * Set to true to measure RTL based on the dir attribute on the body or
+ * html elements (measured on document.body or document.documentElement as
+ * available).
+ */
+ useGlobalRtlAttribute: boolean|null|undefined;
+ created(): void;
+ attached(): void;
+
+ /**
+ * Construct an array of all icon names in this iconset.
+ *
+ * @returns Array of icon names.
+ */
+ getIconNames(): any[];
+
+ /**
+ * Applies an icon to the given element.
+ *
+ * An svg icon is prepended to the element's shadowRoot if it exists,
+ * otherwise to the element itself.
+ *
+ * If RTL mirroring is enabled, and the icon is marked to be mirrored in
+ * RTL, the element will be tested (once and only once ever for each
+ * iconset) to determine the direction of the subtree the element is in.
+ * This direction will apply to all future icon applications, although only
+ * icons marked to be mirrored will be affected.
+ *
+ * @param element Element to which the icon is applied.
+ * @param iconName Name of the icon to apply.
+ * @returns The svg element which renders the icon.
+ */
+ applyIcon(element: Element|null, iconName: string): Element|null;
+
+ /**
+ * Remove an icon from the given element by undoing the changes effected
+ * by `applyIcon`.
+ *
+ * @param element The element from which the icon is removed.
+ */
+ removeIcon(element: Element|null): void;
+
+ /**
+ * Measures and memoizes the direction of the element. Note that this
+ * measurement is only done once and the result is memoized for future
+ * invocations.
+ */
+ _targetIsRTL(target: any): any;
+
+ /**
+ * When name is changed, register iconset metadata
+ */
+ _nameChanged(): void;
+
+ /**
+ * Create a map of child SVG elements by id.
+ *
+ * @returns Map of id's to SVG elements.
+ */
+ _createIconMap(): object;
+
+ /**
+ * Produce installable clone of the SVG element matching `id` in this
+ * iconset, or `undefined` if there is no matching element.
+ *
+ * @returns Returns an installable clone of the SVG element
+ * matching `id`.
+ */
+ _cloneIcon(id: any, mirrorAllowed: any): Element|null;
+ _prepareSvgClone(sourceSvg: Element|null, size: number, mirrorAllowed: Boolean|null): Element|null;
+}
+
+interface HTMLElementTagNameMap {
+ "iron-iconset-svg": IronIconsetSvgElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/iron-iconset-svg.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/iron-iconset-svg.html
new file mode 100644
index 00000000000..152afcb5ce7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/iron-iconset-svg.html
@@ -0,0 +1,258 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-meta/iron-meta.html">
+
+<script>
+ /**
+ * The `iron-iconset-svg` element allows users to define their own icon sets
+ * that contain svg icons. The svg icon elements should be children of the
+ * `iron-iconset-svg` element. Multiple icons should be given distinct id's.
+ *
+ * Using svg elements to create icons has a few advantages over traditional
+ * bitmap graphics like jpg or png. Icons that use svg are vector based so
+ * they are resolution independent and should look good on any device. They
+ * are stylable via css. Icons can be themed, colorized, and even animated.
+ *
+ * Example:
+ *
+ * <iron-iconset-svg name="my-svg-icons" size="24">
+ * <svg>
+ * <defs>
+ * <g id="shape">
+ * <rect x="12" y="0" width="12" height="24" />
+ * <circle cx="12" cy="12" r="12" />
+ * </g>
+ * </defs>
+ * </svg>
+ * </iron-iconset-svg>
+ *
+ * This will automatically register the icon set "my-svg-icons" to the iconset
+ * database. To use these icons from within another element, make a
+ * `iron-iconset` element and call the `byId` method
+ * to retrieve a given iconset. To apply a particular icon inside an
+ * element use the `applyIcon` method. For example:
+ *
+ * iconset.applyIcon(iconNode, 'car');
+ *
+ * @element iron-iconset-svg
+ * @demo demo/index.html
+ * @implements {Polymer.Iconset}
+ */
+ Polymer({
+ is: 'iron-iconset-svg',
+
+ properties: {
+
+ /**
+ * The name of the iconset.
+ */
+ name: {type: String, observer: '_nameChanged'},
+
+ /**
+ * The size of an individual icon. Note that icons must be square.
+ */
+ size: {type: Number, value: 24},
+
+ /**
+ * Set to true to enable mirroring of icons where specified when they are
+ * stamped. Icons that should be mirrored should be decorated with a
+ * `mirror-in-rtl` attribute.
+ *
+ * NOTE: For performance reasons, direction will be resolved once per
+ * document per iconset, so moving icons in and out of RTL subtrees will
+ * not cause their mirrored state to change.
+ */
+ rtlMirroring: {type: Boolean, value: false},
+
+ /**
+ * Set to true to measure RTL based on the dir attribute on the body or
+ * html elements (measured on document.body or document.documentElement as
+ * available).
+ */
+ useGlobalRtlAttribute: {type: Boolean, value: false}
+ },
+
+ created: function() {
+ this._meta =
+ new Polymer.IronMeta({type: 'iconset', key: null, value: null});
+ },
+
+ attached: function() {
+ this.style.display = 'none';
+ },
+
+ /**
+ * Construct an array of all icon names in this iconset.
+ *
+ * @return {!Array} Array of icon names.
+ */
+ getIconNames: function() {
+ this._icons = this._createIconMap();
+ return Object.keys(this._icons).map(function(n) {
+ return this.name + ':' + n;
+ }, this);
+ },
+
+ /**
+ * Applies an icon to the given element.
+ *
+ * An svg icon is prepended to the element's shadowRoot if it exists,
+ * otherwise to the element itself.
+ *
+ * If RTL mirroring is enabled, and the icon is marked to be mirrored in
+ * RTL, the element will be tested (once and only once ever for each
+ * iconset) to determine the direction of the subtree the element is in.
+ * This direction will apply to all future icon applications, although only
+ * icons marked to be mirrored will be affected.
+ *
+ * @method applyIcon
+ * @param {Element} element Element to which the icon is applied.
+ * @param {string} iconName Name of the icon to apply.
+ * @return {?Element} The svg element which renders the icon.
+ */
+ applyIcon: function(element, iconName) {
+ // Remove old svg element
+ this.removeIcon(element);
+ // install new svg element
+ var svg = this._cloneIcon(
+ iconName, this.rtlMirroring && this._targetIsRTL(element));
+ if (svg) {
+ // insert svg element into shadow root, if it exists
+ var pde = Polymer.dom(element.root || element);
+ pde.insertBefore(svg, pde.childNodes[0]);
+ return element._svgIcon = svg;
+ }
+ return null;
+ },
+
+ /**
+ * Remove an icon from the given element by undoing the changes effected
+ * by `applyIcon`.
+ *
+ * @param {Element} element The element from which the icon is removed.
+ */
+ removeIcon: function(element) {
+ // Remove old svg element
+ if (element._svgIcon) {
+ Polymer.dom(element.root || element).removeChild(element._svgIcon);
+ element._svgIcon = null;
+ }
+ },
+
+ /**
+ * Measures and memoizes the direction of the element. Note that this
+ * measurement is only done once and the result is memoized for future
+ * invocations.
+ */
+ _targetIsRTL: function(target) {
+ if (this.__targetIsRTL == null) {
+ if (this.useGlobalRtlAttribute) {
+ var globalElement =
+ (document.body && document.body.hasAttribute('dir')) ?
+ document.body :
+ document.documentElement;
+
+ this.__targetIsRTL = globalElement.getAttribute('dir') === 'rtl';
+ } else {
+ if (target && target.nodeType !== Node.ELEMENT_NODE) {
+ target = target.host;
+ }
+
+ this.__targetIsRTL =
+ target && window.getComputedStyle(target)['direction'] === 'rtl';
+ }
+ }
+
+ return this.__targetIsRTL;
+ },
+
+ /**
+ *
+ * When name is changed, register iconset metadata
+ *
+ */
+ _nameChanged: function() {
+ this._meta.value = null;
+ this._meta.key = this.name;
+ this._meta.value = this;
+
+ this.async(function() {
+ this.fire('iron-iconset-added', this, {node: window});
+ });
+ },
+
+ /**
+ * Create a map of child SVG elements by id.
+ *
+ * @return {!Object} Map of id's to SVG elements.
+ */
+ _createIconMap: function() {
+ // Objects chained to Object.prototype (`{}`) have members. Specifically,
+ // on FF there is a `watch` method that confuses the icon map, so we
+ // need to use a null-based object here.
+ var icons = Object.create(null);
+ Polymer.dom(this).querySelectorAll('[id]').forEach(function(icon) {
+ icons[icon.id] = icon;
+ });
+ return icons;
+ },
+
+ /**
+ * Produce installable clone of the SVG element matching `id` in this
+ * iconset, or `undefined` if there is no matching element.
+ *
+ * @return {Element} Returns an installable clone of the SVG element
+ * matching `id`.
+ */
+ _cloneIcon: function(id, mirrorAllowed) {
+ // create the icon map on-demand, since the iconset itself has no discrete
+ // signal to know when it's children are fully parsed
+ this._icons = this._icons || this._createIconMap();
+ return this._prepareSvgClone(this._icons[id], this.size, mirrorAllowed);
+ },
+
+ /**
+ * @param {Element} sourceSvg
+ * @param {number} size
+ * @param {Boolean} mirrorAllowed
+ * @return {Element}
+ */
+ _prepareSvgClone: function(sourceSvg, size, mirrorAllowed) {
+ if (sourceSvg) {
+ var content = sourceSvg.cloneNode(true),
+ svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'),
+ viewBox =
+ content.getAttribute('viewBox') || '0 0 ' + size + ' ' + size,
+ cssText =
+ 'pointer-events: none; display: block; width: 100%; height: 100%;';
+
+ if (mirrorAllowed && content.hasAttribute('mirror-in-rtl')) {
+ cssText +=
+ '-webkit-transform:scale(-1,1);transform:scale(-1,1);transform-origin:center;';
+ }
+
+ svg.setAttribute('viewBox', viewBox);
+ svg.setAttribute('preserveAspectRatio', 'xMidYMid meet');
+ svg.setAttribute('focusable', 'false');
+ // TODO(dfreedm): `pointer-events: none` works around
+ // https://crbug.com/370136
+ // TODO(sjmiles): inline style may not be ideal, but avoids requiring a
+ // shadow-root
+ svg.style.cssText = cssText;
+ svg.appendChild(content).removeAttribute('id');
+ return svg;
+ }
+ return null;
+ }
+
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/package-lock.json
new file mode 100644
index 00000000000..4736abc096c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/package-lock.json
@@ -0,0 +1,2388 @@
+{
+ "name": "@polymer/iron-iconset-svg",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.3"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.6.3"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.6.3",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.3.tgz",
+ "integrity": "sha512-igaEysRgtg5tYJVIdQ1T2lJ3G6OmoY7g0YVWKHLFiVs4YUChd9IRSiLoHSLffwut+CpsHHBDj4vRxxNEMstctw==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.3"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.3"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.3"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.44",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+ "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz",
+ "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.2",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.105",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.44",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.2",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/package.json
new file mode 100644
index 00000000000..2c775d09bd1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-iconset-svg/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@polymer/iron-iconset-svg",
+ "private": true,
+ "description": "Manages a set of svg icons",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-iconset-svg.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/.bower.json
new file mode 100644
index 00000000000..c18915c0025
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/.bower.json
@@ -0,0 +1,69 @@
+{
+ "name": "iron-input",
+ "version": "2.1.3",
+ "description": "An input element with data binding",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "input"
+ ],
+ "main": "iron-input.html",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-input.git"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/iron-input",
+ "ignore": [],
+ "dependencies": {
+ "iron-a11y-announcer": "PolymerElements/iron-a11y-announcer#1 - 2",
+ "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "polymerelements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "polymerelements/iron-demo-helpers#1 - 2",
+ "iron-validator-behavior": "PolymerElements/iron-validator-behavior#1 - 2",
+ "paper-styles": "polymerelements/paper-styles#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-a11y-announcer": "PolymerElements/iron-a11y-announcer#^1.0.0",
+ "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "polymerelements/iron-demo-helpers#^1.0.0",
+ "iron-validator-behavior": "PolymerElements/iron-validator-behavior#^1.0.0",
+ "paper-styles": "polymerelements/paper-styles#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "Polymer/web-component-tester#^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.1.3",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.3",
+ "commit": "72a4a9e898a4b825602eacd78944e8e25ee41f5c"
+ },
+ "_source": "https://github.com/PolymerElements/iron-input.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/iron-input"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/.github/CODEOWNERS
new file mode 100644
index 00000000000..cc86f1ec217
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @notwaldorf
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..b01fd73e1e4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-input/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/.travis.yml
new file mode 100644
index 00000000000..23948e96ec8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/.travis.yml
@@ -0,0 +1,33 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e '\n\033[31mERROR:\033[0m
+ Project is not formatted. Please run "npm run format".' && false)
+env:
+ global:
+ - secure: >-
+ NQunbnhwQFU/uRU1Dz8VIYXpG9cq4wEldllph4To1XJqEa21pG1Q9+a/M4+aOkW6iIPRgfI/bQ6mPWaRnE/KGrsusARqgYDytq42dJpSoLOiLYbVdRKIHI3t9cr1MiZKUxwz/vpOsKcMK8dW5RmR6zJ8k5roijNAmjFRlzfGOKY=
+ - secure: >-
+ Ge6m7GkHZdhv6Ru7uNEVS9jUQ15CsCa9ZBcBQncA/w8zEmDfM2tzcTUJ54piZ03mo9qnWOcV4IcJj78nXsyKcYZHiGpe63w5R5NWhO3uZ72C48SMPbWQxL0Kyt6PN4u7i5MNCMJ3+a+ttyet8H9qTzxAwOLVSFCUr3On1/B1APU=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+ sauce_connect: true
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/README.md
new file mode 100644
index 00000000000..32a84ebe626
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/README.md
@@ -0,0 +1,80 @@
+
+<!---
+
+This README is automatically generated from the comments in these files:
+iron-input.html
+
+Edit those files, and our readme bot will duplicate them over here!
+Edit this file, and the bot will squash your changes :)
+
+The bot does some handling of markdown. Please file a bug if it does the wrong
+thing! https://github.com/PolymerLabs/tedium/issues
+
+-->
+
+[![Build status](https://travis-ci.org/PolymerElements/iron-input.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-input)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/iron-input)_
+
+
+## &lt;iron-input&gt;
+
+`<iron-input>` adds two-way binding and custom validators using `Polymer.IronValidatorBehavior`
+to `<input>`.
+
+### Changes in 2.0
+Since type-extensions are not available in 2.0, `<iron-input` is a wrapper against a native `input`:
+
+```html
+<iron-input>
+ <input>
+</iron-input>
+ ```
+
+Other changes:
+- `prevent-invalid-input` and `allowed-pattern` had to be always used together; deleted `prevent-invalid-input`, so that only
+`allowed-pattern` is needed
+- added an `auto-validate` property
+- Note: imperatively setting the `value` attribute on the native `<input>` is not supported -- the native `input` does not fire an event in this case, so this update cannot be observed, and `bind-value` cannot be updated.
+
+### Two-way binding
+
+By default you can only get notified of changes to an `input`'s `value` due to user input:
+
+```html
+<input value="{{myValue::input}}">
+```
+
+`iron-input` adds the `bind-value` property that mirrors the `value` property, and can be used
+for two-way data binding. `bind-value` will notify if it is changed either by user input or by script.
+
+```html
+<iron-input bind-value="{{bindValue}}">
+ <input value="{{value::input}}">
+</iron-input>
+```
+
+### Custom validators
+
+You can use custom validators that implement `Polymer.IronValidatorBehavior` with `<iron-input>`.
+
+```html
+<iron-input auto-validate validator="my-custom-validator">
+ <input placeholder="only 'cat' is valid">
+ </iron-input>
+```
+
+### Stopping invalid input
+
+It may be desirable to only allow users to enter certain characters. You can use the
+`prevent-invalid-input` and `allowed-pattern` attributes together to accomplish this. This feature
+is separate from validation, and `allowed-pattern` does not affect how the input is validated.
+
+```html
+<!-- only allow characters that match [0-9] -->
+<iron-input allowed-pattern="[0-9]">
+ <input pattern="\d{5}">
+</iron-input>
+```
+
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/bower.json
new file mode 100644
index 00000000000..57976900b3d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/bower.json
@@ -0,0 +1,60 @@
+{
+ "name": "iron-input",
+ "version": "2.1.3",
+ "description": "An input element with data binding",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "input"
+ ],
+ "main": "iron-input.html",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-input.git"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/iron-input",
+ "ignore": [],
+ "dependencies": {
+ "iron-a11y-announcer": "PolymerElements/iron-a11y-announcer#1 - 2",
+ "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "polymerelements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "polymerelements/iron-demo-helpers#1 - 2",
+ "iron-validator-behavior": "PolymerElements/iron-validator-behavior#1 - 2",
+ "paper-styles": "polymerelements/paper-styles#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-a11y-announcer": "PolymerElements/iron-a11y-announcer#^1.0.0",
+ "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "polymerelements/iron-demo-helpers#^1.0.0",
+ "iron-validator-behavior": "PolymerElements/iron-validator-behavior#^1.0.0",
+ "paper-styles": "polymerelements/paper-styles#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "Polymer/web-component-tester#^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/demo/cats-only.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/demo/cats-only.html
new file mode 100644
index 00000000000..ad32866e295
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/demo/cats-only.html
@@ -0,0 +1,24 @@
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-validator-behavior/iron-validator-behavior.html">
+
+<script>
+ Polymer({
+ is: 'cats-only',
+
+ behaviors: [Polymer.IronValidatorBehavior],
+
+ validate: function(value) {
+ return value === 'cat'
+ }
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/demo/index.html
new file mode 100644
index 00000000000..5d2a2711ef8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/demo/index.html
@@ -0,0 +1,99 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <title>iron-input demo</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+
+ <!-- Order of imports matters. The validator needs to be imported before the
+ iron-input needs it. -->
+ <link rel="import" href="cats-only.html">
+ <link rel="import" href="../iron-input.html">
+
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles"></style>
+ </custom-style>
+</head>
+<body>
+ <div class="vertical-section-container centered">
+ <h4>Basic inputs</h4>
+ <demo-snippet class="centered-demo">
+ <template>
+ <iron-input><input placeholder="type=date" type="date"></iron-input>
+ <iron-input><input placeholder="type=number" type="number"></iron-input>
+ <iron-input><input placeholder="disabled" disabled></iron-input>
+ </template>
+ </demo-snippet>
+
+ <h4>Updating the iron-input's value</h4>
+ <demo-snippet>
+ <template>
+ <dom-bind>
+ <template>
+ <iron-input bind-value="{{bindValue}}" id="input1"><input value="{{value::input}}"></iron-input>
+ <p>bind to the iron-input's <code>bind-value</code>: {{bindValue}}</p>
+ <p>bind to the distributed input's <code>value::input</code>: {{value}}</p>
+ <button onclick="input1.bindValue='pineapple'">Set bindValue to 'pineapple'</button>
+ </template>
+ </dom-bind>
+ </template>
+ </demo-snippet>
+
+ <h4>Preventing invalid characters: only allow <code>!@#0123456789</code></h4>
+ <demo-snippet class="centered-demo">
+ <template>
+ <iron-input allowed-pattern="[!@#0-9]">
+ <input>
+ </iron-input>
+ </template>
+ </demo-snippet>
+
+ <h4>Auto-validation and preventing invalid characters</h4>
+ <demo-snippet class="centered-demo">
+ <template>
+ <style>
+ iron-input[invalid] > input {
+ border: 1px solid red;
+ background-color: #FFCDD2;
+ }
+ </style>
+ <iron-input allowed-pattern="[0-9]" auto-validate>
+ <input pattern="\d{3}" placeholder="exactly 3 digits are valid">
+ </iron-input>
+ </template>
+ </demo-snippet>
+
+ <h4>Validation with a custom validator</h4>
+ <demo-snippet class="centered-demo">
+ <template>
+ <style>
+ iron-input[invalid] > input {
+ border: 1px solid red;
+ background-color: #FFCDD2;
+ }
+ </style>
+ <cats-only></cats-only>
+ <iron-input auto-validate validator="cats-only">
+ <input placeholder="only 'cat' is valid">
+ </iron-input>
+ </template>
+ </demo-snippet>
+ </div>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/hero.svg b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/hero.svg
new file mode 100755
index 00000000000..146ffeac67c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/hero.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">
+<g id="background" display="none">
+ <rect display="inline" fill="#B0BEC5" width="225" height="126"/>
+</g>
+<g id="label">
+</g>
+<g id="art">
+ <rect x="49" y="53" width="2" height="18"/>
+ <path d="M188,78H37V44h151V78z M39,76h147V46H39V76z"/>
+ <g id="ic_x5F_add_x0D_">
+ </g>
+</g>
+<g id="Guides">
+</g>
+</svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/index.html
new file mode 100644
index 00000000000..ca0dac066a5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/index.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+
+ <title>iron-input</title>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../polymer/polymer.html">
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/iron-input.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/iron-input.d.ts
new file mode 100644
index 00000000000..cf1139f501c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/iron-input.d.ts
@@ -0,0 +1,164 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-input.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-a11y-announcer/iron-a11y-announcer.d.ts" />
+/// <reference path="../iron-validatable-behavior/iron-validatable-behavior.d.ts" />
+
+/**
+ * `<iron-input>` is a wrapper to a native `<input>` element, that adds two-way binding
+ * and prevention of invalid input. To use it, you must distribute a native `<input>`
+ * yourself. You can continue to use the native `input` as you would normally:
+ *
+ * <iron-input>
+ * <input>
+ * </iron-input>
+ *
+ * <iron-input>
+ * <input type="email" disabled>
+ * </iron-input>
+ *
+ * ### Two-way binding
+ *
+ * By default you can only get notified of changes to a native `<input>`'s `value`
+ * due to user input:
+ *
+ * <input value="{{myValue::input}}">
+ *
+ * This means that if you imperatively set the value (i.e. `someNativeInput.value = 'foo'`),
+ * no events will be fired and this change cannot be observed.
+ *
+ * `iron-input` adds the `bind-value` property that mirrors the native `input`'s '`value` property; this
+ * property can be used for two-way data binding.
+ * `bind-value` will notify if it is changed either by user input or by script.
+ *
+ * <iron-input bind-value="{{myValue}}">
+ * <input>
+ * </iron-input>
+ *
+ * Note: this means that if you want to imperatively set the native `input`'s, you _must_
+ * set `bind-value` instead, so that the wrapper `iron-input` can be notified.
+ *
+ * ### Validation
+ *
+ * `iron-input` uses the native `input`'s validation. For simplicity, `iron-input`
+ * has a `validate()` method (which internally just checks the distributed `input`'s
+ * validity), which sets an `invalid` attribute that can also be used for styling.
+ *
+ * To validate automatically as you type, you can use the `auto-validate` attribute.
+ *
+ * `iron-input` also fires an `iron-input-validate` event after `validate()` is
+ * called. You can use it to implement a custom validator:
+ *
+ * var CatsOnlyValidator = {
+ * validate: function(ironInput) {
+ * var valid = !ironInput.bindValue || ironInput.bindValue === 'cat';
+ * ironInput.invalid = !valid;
+ * return valid;
+ * }
+ * }
+ * ironInput.addEventListener('iron-input-validate', function() {
+ * CatsOnly.validate(input2);
+ * });
+ *
+ * You can also use an element implementing an [`IronValidatorBehavior`](/element/PolymerElements/iron-validatable-behavior).
+ * This example can also be found in the demo for this element:
+ *
+ * <iron-input validator="cats-only">
+ * <input>
+ * </iron-input>
+ *
+ * ### Preventing invalid input
+ *
+ * It may be desirable to only allow users to enter certain characters. You can use the
+ * `allowed-pattern` attribute to accomplish this. This feature
+ * is separate from validation, and `allowed-pattern` does not affect how the input is validated.
+ *
+ * // Only allow typing digits, but a valid input has exactly 5 digits.
+ * <iron-input allowed-pattern="[0-9]">
+ * <input pattern="\d{5}">
+ * </iron-input>
+ */
+interface IronInputElement extends Polymer.Element, Polymer.IronValidatableBehavior {
+
+ /**
+ * Use this property instead of `value` for two-way data binding, or to
+ * set a default value for the input. **Do not** use the distributed
+ * input's `value` property to set a default value.
+ */
+ bindValue: string|null|undefined;
+
+ /**
+ * Computed property that echoes `bindValue` (mostly used for Polymer 1.0
+ * backcompatibility, if you were one-way binding to the Polymer 1.0
+ * `input is="iron-input"` value attribute).
+ */
+ readonly value: string|null|undefined;
+
+ /**
+ * Regex-like list of characters allowed as input; all characters not in the
+ * list will be rejected. The recommended format should be a list of allowed
+ * characters, for example, `[a-zA-Z0-9.+-!;:]`.
+ *
+ * This pattern represents the allowed characters for the field; as the user
+ * inputs text, each individual character will be checked against the
+ * pattern (rather than checking the entire value as a whole). If a
+ * character is not a match, it will be rejected.
+ *
+ * Pasted input will have each character checked individually; if any
+ * character doesn't match `allowedPattern`, the entire pasted string will
+ * be rejected.
+ *
+ * Note: if you were using `iron-input` in 1.0, you were also required to
+ * set `prevent-invalid-input`. This is no longer needed as of Polymer 2.0,
+ * and will be set automatically for you if an `allowedPattern` is provided.
+ */
+ allowedPattern: string|null|undefined;
+
+ /**
+ * Set to true to auto-validate the input value as you type.
+ */
+ autoValidate: boolean|null|undefined;
+
+ /**
+ * The native input element.
+ */
+ _inputElement: object|null|undefined;
+
+ /**
+ * Returns the distributed input element.
+ *
+ */
+ readonly inputElement: any;
+ readonly _patternRegExp: any;
+
+ /**
+ * Returns true if `value` is valid. The validator provided in `validator`
+ * will be used first, then any constraints.
+ *
+ * @returns True if the value is valid.
+ */
+ validate(): boolean;
+ created(): void;
+ attached(): void;
+ detached(): void;
+ _initSlottedInput(): void;
+ _bindValueChanged(bindValue: any, inputElement: any): void;
+ _onInput(): void;
+ _isPrintable(event: any): any;
+ _onKeypress(event: any): void;
+ _checkPatternValidity(): any;
+ _announceInvalidCharacter(message: any): void;
+ _computeValue(bindValue: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "iron-input": IronInputElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/iron-input.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/iron-input.html
new file mode 100644
index 00000000000..63ab90be3f7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/iron-input.html
@@ -0,0 +1,366 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-a11y-announcer/iron-a11y-announcer.html">
+<link rel="import" href="../iron-validatable-behavior/iron-validatable-behavior.html">
+
+<!--
+`<iron-input>` is a wrapper to a native `<input>` element, that adds two-way binding
+and prevention of invalid input. To use it, you must distribute a native `<input>`
+yourself. You can continue to use the native `input` as you would normally:
+
+ <iron-input>
+ <input>
+ </iron-input>
+
+ <iron-input>
+ <input type="email" disabled>
+ </iron-input>
+
+### Two-way binding
+
+By default you can only get notified of changes to a native `<input>`'s `value`
+due to user input:
+
+ <input value="{{myValue::input}}">
+
+This means that if you imperatively set the value (i.e. `someNativeInput.value = 'foo'`),
+no events will be fired and this change cannot be observed.
+
+`iron-input` adds the `bind-value` property that mirrors the native `input`'s '`value` property; this
+property can be used for two-way data binding.
+`bind-value` will notify if it is changed either by user input or by script.
+
+ <iron-input bind-value="{{myValue}}">
+ <input>
+ </iron-input>
+
+Note: this means that if you want to imperatively set the native `input`'s, you _must_
+set `bind-value` instead, so that the wrapper `iron-input` can be notified.
+
+### Validation
+
+`iron-input` uses the native `input`'s validation. For simplicity, `iron-input`
+has a `validate()` method (which internally just checks the distributed `input`'s
+validity), which sets an `invalid` attribute that can also be used for styling.
+
+To validate automatically as you type, you can use the `auto-validate` attribute.
+
+`iron-input` also fires an `iron-input-validate` event after `validate()` is
+called. You can use it to implement a custom validator:
+
+ var CatsOnlyValidator = {
+ validate: function(ironInput) {
+ var valid = !ironInput.bindValue || ironInput.bindValue === 'cat';
+ ironInput.invalid = !valid;
+ return valid;
+ }
+ }
+ ironInput.addEventListener('iron-input-validate', function() {
+ CatsOnly.validate(input2);
+ });
+
+You can also use an element implementing an [`IronValidatorBehavior`](/element/PolymerElements/iron-validatable-behavior).
+This example can also be found in the demo for this element:
+
+ <iron-input validator="cats-only">
+ <input>
+ </iron-input>
+
+### Preventing invalid input
+
+It may be desirable to only allow users to enter certain characters. You can use the
+`allowed-pattern` attribute to accomplish this. This feature
+is separate from validation, and `allowed-pattern` does not affect how the input is validated.
+
+ // Only allow typing digits, but a valid input has exactly 5 digits.
+ <iron-input allowed-pattern="[0-9]">
+ <input pattern="\d{5}">
+ </iron-input>
+
+@hero hero.svg
+@demo demo/index.html
+-->
+
+<dom-module id="iron-input">
+ <template>
+ <style>
+ :host {
+ display: inline-block;
+ }
+ </style>
+ <slot id="content"></slot>
+ </template>
+ <script>
+ Polymer({
+ is: 'iron-input',
+
+ behaviors: [Polymer.IronValidatableBehavior],
+
+ /**
+ * Fired whenever `validate()` is called.
+ *
+ * @event iron-input-validate
+ */
+
+ properties: {
+
+ /**
+ * Use this property instead of `value` for two-way data binding, or to
+ * set a default value for the input. **Do not** use the distributed
+ * input's `value` property to set a default value.
+ */
+ bindValue: {type: String, value: ''},
+
+ /**
+ * Computed property that echoes `bindValue` (mostly used for Polymer 1.0
+ * backcompatibility, if you were one-way binding to the Polymer 1.0
+ * `input is="iron-input"` value attribute).
+ */
+ value: {type: String, computed: '_computeValue(bindValue)'},
+
+ /**
+ * Regex-like list of characters allowed as input; all characters not in the
+ * list will be rejected. The recommended format should be a list of allowed
+ * characters, for example, `[a-zA-Z0-9.+-!;:]`.
+ *
+ * This pattern represents the allowed characters for the field; as the user
+ * inputs text, each individual character will be checked against the
+ * pattern (rather than checking the entire value as a whole). If a
+ * character is not a match, it will be rejected.
+ *
+ * Pasted input will have each character checked individually; if any
+ * character doesn't match `allowedPattern`, the entire pasted string will
+ * be rejected.
+ *
+ * Note: if you were using `iron-input` in 1.0, you were also required to
+ * set `prevent-invalid-input`. This is no longer needed as of Polymer 2.0,
+ * and will be set automatically for you if an `allowedPattern` is provided.
+ *
+ */
+ allowedPattern: {type: String},
+
+ /**
+ * Set to true to auto-validate the input value as you type.
+ */
+ autoValidate: {type: Boolean, value: false},
+
+ /**
+ * The native input element.
+ */
+ _inputElement: Object,
+ },
+
+ observers: ['_bindValueChanged(bindValue, _inputElement)'],
+
+ listeners: {'input': '_onInput', 'keypress': '_onKeypress'},
+
+ created: function() {
+ Polymer.IronA11yAnnouncer.requestAvailability();
+ this._previousValidInput = '';
+ this._patternAlreadyChecked = false;
+ },
+
+ attached: function() {
+ // If the input is added at a later time, update the internal reference.
+ this._observer = Polymer.dom(this).observeNodes(function(info) {
+ this._initSlottedInput();
+ }.bind(this));
+ },
+
+ detached: function() {
+ if (this._observer) {
+ Polymer.dom(this).unobserveNodes(this._observer);
+ this._observer = null;
+ }
+ },
+
+ /**
+ * Returns the distributed input element.
+ */
+ get inputElement() {
+ return this._inputElement;
+ },
+
+ _initSlottedInput: function() {
+ this._inputElement = this.getEffectiveChildren()[0];
+
+ if (this.inputElement && this.inputElement.value) {
+ this.bindValue = this.inputElement.value;
+ }
+
+ this.fire('iron-input-ready');
+ },
+
+ get _patternRegExp() {
+ var pattern;
+ if (this.allowedPattern) {
+ pattern = new RegExp(this.allowedPattern);
+ } else {
+ switch (this.inputElement.type) {
+ case 'number':
+ pattern = /[0-9.,e-]/;
+ break;
+ }
+ }
+ return pattern;
+ },
+
+ /**
+ * @suppress {checkTypes}
+ */
+ _bindValueChanged: function(bindValue, inputElement) {
+ // The observer could have run before attached() when we have actually
+ // initialized this property.
+ if (!inputElement) {
+ return;
+ }
+
+ if (bindValue === undefined) {
+ inputElement.value = null;
+ } else if (bindValue !== inputElement.value) {
+ this.inputElement.value = bindValue;
+ }
+
+ if (this.autoValidate) {
+ this.validate();
+ }
+
+ // manually notify because we don't want to notify until after setting value
+ this.fire('bind-value-changed', {value: bindValue});
+ },
+
+ _onInput: function() {
+ // Need to validate each of the characters pasted if they haven't
+ // been validated inside `_onKeypress` already.
+ if (this.allowedPattern && !this._patternAlreadyChecked) {
+ var valid = this._checkPatternValidity();
+ if (!valid) {
+ this._announceInvalidCharacter(
+ 'Invalid string of characters not entered.');
+ this.inputElement.value = this._previousValidInput;
+ }
+ }
+ this.bindValue = this._previousValidInput = this.inputElement.value;
+ this._patternAlreadyChecked = false;
+ },
+
+ _isPrintable: function(event) {
+ // What a control/printable character is varies wildly based on the browser.
+ // - most control characters (arrows, backspace) do not send a `keypress`
+ // event
+ // in Chrome, but the *do* on Firefox
+ // - in Firefox, when they do send a `keypress` event, control chars have
+ // a charCode = 0, keyCode = xx (for ex. 40 for down arrow)
+ // - printable characters always send a keypress event.
+ // - in Firefox, printable chars always have a keyCode = 0. In Chrome, the
+ // keyCode
+ // always matches the charCode.
+ // None of this makes any sense.
+
+ // For these keys, ASCII code == browser keycode.
+ var anyNonPrintable = (event.keyCode == 8) || // backspace
+ (event.keyCode == 9) || // tab
+ (event.keyCode == 13) || // enter
+ (event.keyCode == 27); // escape
+
+ // For these keys, make sure it's a browser keycode and not an ASCII code.
+ var mozNonPrintable = (event.keyCode == 19) || // pause
+ (event.keyCode == 20) || // caps lock
+ (event.keyCode == 45) || // insert
+ (event.keyCode == 46) || // delete
+ (event.keyCode == 144) || // num lock
+ (event.keyCode == 145) || // scroll lock
+ (event.keyCode > 32 &&
+ event.keyCode < 41) || // page up/down, end, home, arrows
+ (event.keyCode > 111 && event.keyCode < 124); // fn keys
+
+ return !anyNonPrintable && !(event.charCode == 0 && mozNonPrintable);
+ },
+
+ _onKeypress: function(event) {
+ if (!this.allowedPattern && this.inputElement.type !== 'number') {
+ return;
+ }
+ var regexp = this._patternRegExp;
+ if (!regexp) {
+ return;
+ }
+
+ // Handle special keys and backspace
+ if (event.metaKey || event.ctrlKey || event.altKey) {
+ return;
+ }
+
+ // Check the pattern either here or in `_onInput`, but not in both.
+ this._patternAlreadyChecked = true;
+
+ var thisChar = String.fromCharCode(event.charCode);
+ if (this._isPrintable(event) && !regexp.test(thisChar)) {
+ event.preventDefault();
+ this._announceInvalidCharacter(
+ 'Invalid character ' + thisChar + ' not entered.');
+ }
+ },
+
+ _checkPatternValidity: function() {
+ var regexp = this._patternRegExp;
+ if (!regexp) {
+ return true;
+ }
+ for (var i = 0; i < this.inputElement.value.length; i++) {
+ if (!regexp.test(this.inputElement.value[i])) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ /**
+ * Returns true if `value` is valid. The validator provided in `validator`
+ * will be used first, then any constraints.
+ * @return {boolean} True if the value is valid.
+ */
+ validate: function() {
+ if (!this.inputElement) {
+ this.invalid = false;
+ return true;
+ }
+
+ // Use the nested input's native validity.
+ var valid = this.inputElement.checkValidity();
+
+ // Only do extra checking if the browser thought this was valid.
+ if (valid) {
+ // Empty, required input is invalid
+ if (this.required && this.bindValue === '') {
+ valid = false;
+ } else if (this.hasValidator()) {
+ valid =
+ Polymer.IronValidatableBehavior.validate.call(this, this.bindValue);
+ }
+ }
+
+ this.invalid = !valid;
+ this.fire('iron-input-validate');
+ return valid;
+ },
+
+ _announceInvalidCharacter: function(message) {
+ this.fire('iron-announce', {text: message});
+ },
+
+ _computeValue: function(bindValue) {
+ return bindValue;
+ }
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/package-lock.json
new file mode 100644
index 00000000000..726a87fcbd5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/package-lock.json
@@ -0,0 +1,2388 @@
+{
+ "name": "@polymer/iron-input",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "8.10.7",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.7.tgz",
+ "integrity": "sha512-5QC0YAHH7aXzrrbgQ+faSeBKbJwTaUyYuaywYzDTr1Myz5C0knx5FHOV5QyhBeE1x8n2xfkBUGE/C0X1paLp+Q==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.44",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+ "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz",
+ "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.2",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.105",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.44",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.2",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/package.json
new file mode 100644
index 00000000000..a35aa5d3d88
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-input/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@polymer/iron-input",
+ "private": true,
+ "description": "An input element with data binding",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-input.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/.bower.json
new file mode 100644
index 00000000000..8220520a5d8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/.bower.json
@@ -0,0 +1,66 @@
+{
+ "name": "iron-jsonp-library",
+ "version": "2.1.0",
+ "description": "Loads jsonp libraries",
+ "authors": [
+ "Aleks Totic <a@totic.org>",
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-component",
+ "polymer",
+ "behavior"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-jsonp-library.git"
+ },
+ "main": "iron-jsonp-library.html",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/iron-jsonp-library/",
+ "ignore": [
+ "/.*",
+ "/test/"
+ ],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "paper-spinner": "PolymerElements/paper-spinner#1 - 2"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.2",
+ "paper-spinner": "PolymerElements/paper-spinner#^1.0.1",
+ "web-component-tester": "Polymer/web-component-tester#^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.1.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.0",
+ "commit": "107e718aad5868ee3d409502c2772b54d95ce395"
+ },
+ "_source": "https://github.com/PolymerElements/iron-jsonp-library.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/iron-jsonp-library"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/README.md
new file mode 100644
index 00000000000..c93e1d6bcaa
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/README.md
@@ -0,0 +1,51 @@
+
+<!---
+
+This README is automatically generated from the comments in these files:
+iron-jsonp-library.html
+
+Edit those files, and our readme bot will duplicate them over here!
+Edit this file, and the bot will squash your changes :)
+
+The bot does some handling of markdown. Please file a bug if it does the wrong
+thing! https://github.com/PolymerLabs/tedium/issues
+
+-->
+
+[![Build status](https://travis-ci.org/PolymerElements/iron-jsonp-library.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-jsonp-library)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/iron-jsonp-library)_
+
+
+## &lt;iron-jsonp-library&gt;
+
+Loads specified jsonp library.
+
+Example:
+
+```html
+<iron-jsonp-library
+ library-url="https://apis.google.com/js/plusone.js?onload=%%callback%%"
+ notify-event="api-load"
+ library-loaded="{{loaded}}"></iron-jsonp-library>
+```
+
+Will emit 'api-load' event when loaded, and set 'loaded' to true
+
+Implemented by Polymer.IronJsonpLibraryBehavior. Use it
+to create specific library loader elements.
+
+
+
+## Polymer.IronJsonpLibraryBehavior
+
+`Polymer.IronJsonpLibraryBehavior` loads a jsonp library.
+Multiple components can request same library, only one copy will load.
+
+Some libraries require a specific global function be defined.
+If this is the case, specify the `callbackName` property.
+
+You should use an HTML Import to load library dependencies
+when possible instead of using this element.
+
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/bower.json
new file mode 100644
index 00000000000..ef4c8b7d828
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/bower.json
@@ -0,0 +1,57 @@
+{
+ "name": "iron-jsonp-library",
+ "version": "2.0.0",
+ "description": "Loads jsonp libraries",
+ "authors": [
+ "Aleks Totic <a@totic.org>",
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-component",
+ "polymer",
+ "behavior"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-jsonp-library.git"
+ },
+ "main": "iron-jsonp-library.html",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/iron-jsonp-library/",
+ "ignore": [
+ "/.*",
+ "/test/"
+ ],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "paper-spinner": "PolymerElements/paper-spinner#1 - 2"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.2",
+ "paper-spinner": "PolymerElements/paper-spinner#^1.0.1",
+ "web-component-tester": "Polymer/web-component-tester#^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/demo/index.html
new file mode 100644
index 00000000000..13abb9a7dd5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/demo/index.html
@@ -0,0 +1,133 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+ <title>iron-jsonp-library Demo</title>
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../../paper-styles/color.html">
+ <link rel="import" href="../../paper-styles/demo-pages.html">
+ <link rel="import" href="../../paper-spinner/paper-spinner.html">
+ <link rel="import" href="../iron-jsonp-library.html">
+ <style is="custom-style">
+
+ .loading {
+ color: var(--google-grey-500);
+ }
+
+ .success {
+ color: var(--paper-green-800);
+ }
+
+ .failure {
+ color: var(--paper-red-800);
+ }
+
+ paper-spinner {
+ --paper-spinner-layer-1-color: var(--google-grey-500);
+ --paper-spinner-layer-2-color: var(--google-grey-500);
+ --paper-spinner-layer-3-color: var(--google-grey-500);
+ --paper-spinner-layer-4-color: var(--google-grey-500);
+ }
+ </style>
+ </head>
+ <body>
+
+ <div class="vertical-section vertical-section-container centered">
+ <h1>&lt;iron-jsonp-library&gt;</h1>
+ <dom-bind>
+ <template is="dom-bind">
+ <h3>Good loader</h3>
+ <iron-jsonp-library
+ library-url="https://apis.google.com/js/plusone.js?onload=%%callback%%"
+ notify-event="api-load"
+ library-loaded="{{loaded}}"
+ library-error-message="{{errorMessage}}"></iron-jsonp-library>
+ <template is="dom-if" if="{{loaded}}">
+ <p class="success">The <code>Google+ API</code> has been loaded</p>
+ </template>
+ <template is="dom-if" if="{{!loaded}}">
+ <template is="dom-if" if="{{errorMessage}}">
+ <p class="failure">{{errorMessage}}</p>
+ </template>
+ <template is="dom-if" if="{{!errorMessage}}">
+ <p class="loading">Loading...</p>
+ </template>
+ </template>
+ </template>
+ </dom-bind>
+
+ <hr>
+ <dom-bind>
+ <template is="dom-bind">
+ <h3>Bad loader</h3>
+ <iron-jsonp-library
+ library-url="https://badapis.google.com/js/plusone.js?onload=%%callback%%"
+ notify-event="api-load"
+ library-loaded="{{loaded}}"
+ library-error-message="{{errorMessage}}"></iron-jsonp-library>
+ <template is="dom-if" if="{{loaded}}">
+ <p><code>badapis</code> has been loaded</p>
+ </template>
+ <template is="dom-if" if="{{!loaded}}">
+ <template is="dom-if" if="{{errorMessage}}">
+ <p class="failure">{{errorMessage}}</p>
+ </template>
+ <template is="dom-if" if="{{!errorMessage}}">
+ <p class="loading">Loading...</p>
+ </template>
+ </template>
+ </template>
+ </dom-bind>
+
+ <hr>
+ <dom-bind>
+ <template is="dom-bind" id="delayedLoader">
+ <h3>Delayed libraryUrl loader</h3>
+ <iron-jsonp-library
+ library-url="{{libraryUrl}}"
+ library-loaded="{{loaded}}"
+ library-error-message="{{errorMessage}}">
+ </iron-jsonp-library>
+ <template is="dom-if" if="{{loaded}}">
+ <p><code>{{libraryUrl}}</code> has been loaded</p>
+ </template>
+ <template is="dom-if" if="{{!loaded}}">
+ <template is="dom-if" if="{{errorMessage}}">
+ <p class="failure">{{errorMessage}}</p>
+ </template>
+ <template is="dom-if" if="{{!errorMessage}}">
+ <p class="loading">Loading...<code>{{libraryUrl}}</code></p>
+ </template>
+ </template>
+ </template>
+ </dom-bind>
+
+ </div>
+
+ <script>
+ // kick off delayed loader by setting libraryUrl
+ window.setTimeout(function() {
+ var t = document.querySelector('#delayedLoader');
+
+ if (Polymer.Element) {
+ // value is set on the dom-bind in 2.x
+ t.parentNode.libraryUrl = 'https://apis.google.com/js/drive-realtime.js?onload=%%callback%%';
+ } else {
+ // value is set on template in Polymer 1.x
+ t.libraryUrl = 'https://apis.google.com/js/drive-realtime.js?onload=%%callback%%';
+ }
+ },
+ 1000);
+ </script>
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/hero.svg b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/hero.svg
new file mode 100755
index 00000000000..d6c1c13f8f0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/hero.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">
+<g id="background" display="none">
+ <rect display="inline" fill="#B0BEC5" width="225" height="126"/>
+</g>
+<g id="label">
+</g>
+<g id="art">
+ <circle cx="112" cy="36" r="4"/>
+ <circle cx="112" cy="90" r="4"/>
+ <circle cx="91" cy="98" r="4"/>
+ <circle cx="91" cy="29" r="4"/>
+ <circle cx="133" cy="29" r="4"/>
+ <circle cx="133" cy="97" r="4"/>
+ <circle cx="56" cy="63" r="4"/>
+ <circle cx="168" cy="63" r="4"/>
+ <circle cx="99" cy="63" r="4"/>
+ <circle cx="125" cy="63" r="4"/>
+ <path d="M90.8,98.5c-19.6,0-35.5-15.9-35.5-35.5s15.9-35.5,35.5-35.5s35.5,15.9,35.5,35.5S110.3,98.5,90.8,98.5z M90.8,29.5
+ c-18.5,0-33.5,15-33.5,33.5s15,33.5,33.5,33.5s33.5-15,33.5-33.5S109.2,29.5,90.8,29.5z"/>
+ <path d="M133.2,98.5c-19.6,0-35.5-15.9-35.5-35.5s15.9-35.5,35.5-35.5s35.5,15.9,35.5,35.5S152.8,98.5,133.2,98.5z M133.2,29.5
+ c-18.5,0-33.5,15-33.5,33.5s15,33.5,33.5,33.5s33.5-15,33.5-33.5S151.7,29.5,133.2,29.5z"/>
+ <g id="ic_x5F_add_x0D_">
+ </g>
+</g>
+<g id="Guides">
+</g>
+</svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/index.html
new file mode 100644
index 00000000000..487bb5c38a5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/index.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/iron-jsonp-library.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/iron-jsonp-library.d.ts
new file mode 100644
index 00000000000..a0923bf156a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/iron-jsonp-library.d.ts
@@ -0,0 +1,90 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-jsonp-library.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * `Polymer.IronJsonpLibraryBehavior` loads a jsonp library.
+ * Multiple components can request same library, only one copy will load.
+ *
+ * Some libraries require a specific global function be defined.
+ * If this is the case, specify the `callbackName` property.
+ *
+ * You should use an HTML Import to load library dependencies
+ * when possible instead of using this element.
+ */
+ interface IronJsonpLibraryBehavior {
+
+ /**
+ * True if library has been successfully loaded
+ */
+ readonly libraryLoaded: boolean|null|undefined;
+
+ /**
+ * Not null if library has failed to load
+ */
+ readonly libraryErrorMessage: string|null|undefined;
+ _libraryUrlChanged(libraryUrl: any): void;
+ _libraryLoadCallback(err: any, result: any): void;
+
+ /**
+ * loads the library, and fires this.notifyEvent upon completion
+ */
+ _loadLibrary(): void;
+ ready(): void;
+ }
+
+ const IronJsonpLibraryBehavior: object;
+}
+
+/**
+ * Loads specified jsonp library.
+ *
+ * Example:
+ *
+ * <iron-jsonp-library
+ * library-url="https://apis.google.com/js/plusone.js?onload=%%callback%%"
+ * notify-event="api-load"
+ * library-loaded="{{loaded}}"></iron-jsonp-library>
+ *
+ * Will emit 'api-load' event when loaded, and set 'loaded' to true
+ *
+ * Implemented by Polymer.IronJsonpLibraryBehavior. Use it
+ * to create specific library loader elements.
+ */
+interface IronJsonpLibraryElement extends Polymer.Element, Polymer.IronJsonpLibraryBehavior {
+
+ /**
+ * Library url. Must contain string `%%callback%%`.
+ *
+ * `%%callback%%` is a placeholder for jsonp wrapper function name
+ *
+ * Ex: https://maps.googleapis.com/maps/api/js?callback=%%callback%%
+ */
+ libraryUrl: string|null|undefined;
+
+ /**
+ * Set if library requires specific callback name.
+ * Name will be automatically generated if not set.
+ */
+ callbackName: string|null|undefined;
+
+ /**
+ * event with name specified in 'notifyEvent' attribute
+ * will fire upon successful load
+ */
+ notifyEvent: string|null|undefined;
+}
+
+interface HTMLElementTagNameMap {
+ "iron-jsonp-library": IronJsonpLibraryElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/iron-jsonp-library.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/iron-jsonp-library.html
new file mode 100644
index 00000000000..09277da417c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/iron-jsonp-library.html
@@ -0,0 +1,271 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../polymer/polymer.html">
+
+<script>
+(function() {
+ "use strict";
+ /**
+ * `Polymer.IronJsonpLibraryBehavior` loads a jsonp library.
+ * Multiple components can request same library, only one copy will load.
+ *
+ * Some libraries require a specific global function be defined.
+ * If this is the case, specify the `callbackName` property.
+ *
+ * You should use an HTML Import to load library dependencies
+ * when possible instead of using this element.
+ *
+ * @hero hero.svg
+ * @demo demo/index.html
+ * @polymerBehavior
+ */
+ Polymer.IronJsonpLibraryBehavior = {
+
+ properties: {
+ /**
+ * True if library has been successfully loaded
+ */
+ libraryLoaded: {
+ type: Boolean,
+ value: false,
+ notify: true,
+ readOnly: true
+ },
+ /**
+ * Not null if library has failed to load
+ */
+ libraryErrorMessage: {
+ type: String,
+ value: null,
+ notify: true,
+ readOnly: true
+ }
+ // Following properties are to be set by behavior users
+ /**
+ * Library url. Must contain string `%%callback%%`.
+ *
+ * `%%callback%%` is a placeholder for jsonp wrapper function name
+ *
+ * Ex: https://maps.googleapis.com/maps/api/js?callback=%%callback%%
+ * @property libraryUrl
+ */
+ /**
+ * Set if library requires specific callback name.
+ * Name will be automatically generated if not set.
+ * @property callbackName
+ */
+ /**
+ * name of event to be emitted when library loads. Standard is `api-load`
+ * @property notifyEvent
+ */
+ /**
+ * event with name specified in `notifyEvent` attribute
+ * will fire upon successful load2
+ * @event `notifyEvent`
+ */
+ },
+
+ observers: [
+ '_libraryUrlChanged(libraryUrl)'
+ ],
+
+ _libraryUrlChanged: function(libraryUrl) {
+ // can't load before ready because notifyEvent might not be set
+ if (this._isReady && this.libraryUrl)
+ this._loadLibrary();
+ },
+
+ _libraryLoadCallback: function(err, result) {
+ if (err) {
+ Polymer.Base._warn("Library load failed:", err.message);
+ this._setLibraryErrorMessage(err.message);
+ }
+ else {
+ this._setLibraryErrorMessage(null);
+ this._setLibraryLoaded(true);
+ if (this.notifyEvent)
+ this.fire(this.notifyEvent, result, {composed: true});
+ }
+ },
+
+ /** loads the library, and fires this.notifyEvent upon completion */
+ _loadLibrary: function() {
+ LoaderMap.require(
+ this.libraryUrl,
+ this._libraryLoadCallback.bind(this),
+ this.callbackName
+ );
+ },
+
+ ready: function() {
+ this._isReady = true;
+ if (this.libraryUrl)
+ this._loadLibrary();
+ }
+ };
+
+ /**
+ * LoaderMap keeps track of all Loaders
+ */
+ var LoaderMap = {
+ apiMap: {}, // { hash -> Loader }
+
+ /**
+ * @param {Function} notifyCallback loaded callback fn(result)
+ * @param {string} jsonpCallbackName name of jsonpcallback. If API does not provide it, leave empty. Optional.
+ */
+ require: function(url, notifyCallback, jsonpCallbackName) {
+
+ // make hashable string form url
+ var name = this.nameFromUrl(url);
+
+ // create a loader as needed
+ if (!this.apiMap[name])
+ this.apiMap[name] = new Loader(name, url, jsonpCallbackName);
+
+ // ask for notification
+ this.apiMap[name].requestNotify(notifyCallback);
+ },
+
+ nameFromUrl: function(url) {
+ return url.replace(/[\:\/\%\?\&\.\=\-\,]/g, '_') + '_api';
+ }
+ };
+
+ /** @constructor */
+ var Loader = function(name, url, callbackName) {
+ this.notifiers = []; // array of notifyFn [ notifyFn* ]
+
+ // callback is specified either as callback name
+ // or computed dynamically if url has callbackMacro in it
+ if (!callbackName) {
+ if (url.indexOf(this.callbackMacro) >= 0) {
+ callbackName = name + '_loaded';
+ url = url.replace(this.callbackMacro, callbackName);
+ } else {
+ this.error = new Error('IronJsonpLibraryBehavior a %%callback%% parameter is required in libraryUrl');
+ // TODO(sjmiles): we should probably fallback to listening to script.load
+ return;
+ }
+ }
+ this.callbackName = callbackName;
+ window[this.callbackName] = this.success.bind(this);
+ this.addScript(url);
+ };
+
+ Loader.prototype = {
+
+ callbackMacro: '%%callback%%',
+ loaded: false,
+
+ addScript: function(src) {
+ var script = document.createElement('script');
+ script.src = src;
+ script.onerror = this.handleError.bind(this);
+ var s = document.querySelector('script') || document.body;
+ s.parentNode.insertBefore(script, s);
+ this.script = script;
+ },
+
+ removeScript: function() {
+ if (this.script.parentNode) {
+ this.script.parentNode.removeChild(this.script);
+ }
+ this.script = null;
+ },
+
+ handleError: function(ev) {
+ this.error = new Error("Library failed to load");
+ this.notifyAll();
+ this.cleanup();
+ },
+
+ success: function() {
+ this.loaded = true;
+ this.result = Array.prototype.slice.call(arguments);
+ this.notifyAll();
+ this.cleanup();
+ },
+
+ cleanup: function() {
+ delete window[this.callbackName];
+ },
+
+ notifyAll: function() {
+ this.notifiers.forEach( function(notifyCallback) {
+ notifyCallback(this.error, this.result);
+ }.bind(this));
+ this.notifiers = [];
+ },
+
+ requestNotify: function(notifyCallback) {
+ if (this.loaded || this.error) {
+ notifyCallback( this.error, this.result);
+ } else {
+ this.notifiers.push(notifyCallback);
+ }
+ }
+ };
+})();
+</script>
+
+<!--
+ Loads specified jsonp library.
+
+ Example:
+
+ <iron-jsonp-library
+ library-url="https://apis.google.com/js/plusone.js?onload=%%callback%%"
+ notify-event="api-load"
+ library-loaded="{{loaded}}"></iron-jsonp-library>
+
+ Will emit 'api-load' event when loaded, and set 'loaded' to true
+
+ Implemented by Polymer.IronJsonpLibraryBehavior. Use it
+ to create specific library loader elements.
+
+ @demo
+-->
+<script>
+ Polymer({
+
+ is: 'iron-jsonp-library',
+
+ behaviors: [ Polymer.IronJsonpLibraryBehavior ],
+
+ properties: {
+ /**
+ * Library url. Must contain string `%%callback%%`.
+ *
+ * `%%callback%%` is a placeholder for jsonp wrapper function name
+ *
+ * Ex: https://maps.googleapis.com/maps/api/js?callback=%%callback%%
+ */
+ libraryUrl: String,
+ /**
+ * Set if library requires specific callback name.
+ * Name will be automatically generated if not set.
+ */
+ callbackName: String,
+ /**
+ * event with name specified in 'notifyEvent' attribute
+ * will fire upon successful load
+ */
+ notifyEvent: String
+ /**
+ * event with name specified in 'notifyEvent' attribute
+ * will fire upon successful load
+ * @event `notifyEvent`
+ */
+
+ }
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/package-lock.json
new file mode 100644
index 00000000000..dee184cd29b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/package-lock.json
@@ -0,0 +1,974 @@
+{
+ "name": "@polymer/iron-jsonp-library",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.0.tgz",
+ "integrity": "sha512-a5DFXI3TdZSVOMH4608LVaBLmcr+mwM2+B8OSBiB9WFNCtdqzUXwtB5We6vBzrThXlO4uRo7d2pEqjNXMAlEkA==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.0",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "4.1.0",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.0",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.12"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz",
+ "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.6.tgz",
+ "integrity": "sha512-CTUtLb6WqCCgp6P59QintjHWqzf4VL1uPA27bipLAPxFqrtK1gEYllePzTICGqQ8rYsCbpnsNypXjjDzGAAjEQ==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.8.tgz",
+ "integrity": "sha512-QqR0j08RCS1AQYPMRPHikEpcmK+2aEEbcSzWLwOqyJ4FhLmHUx/WjRrnn7tTQg/y4IKnMhzskh/o7qvGIZZ7iA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.0.0.tgz",
+ "integrity": "sha512-v+0wW9Wezwsyb0uF4aBVCjmSqit3Ru7PZFziGF0o2KwTvN2zWfTi3BRLq9EkJFdg3eBbyERXGTntVpBxH1J68Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.2",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
+ "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "4.0.0",
+ "array-back": "2.0.0",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz",
+ "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.5.7"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.8",
+ "winston": "2.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-QQL70IC85hI6q9uQeresEMcT1Qf8YR/zDe1qG8WWeeFAZk8z0lmzUpsfcAWz+bM4wpDdXrtd4HitIs4p0CHl/w==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.101",
+ "@types/parse5": "2.2.34",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "polymer-project-config": "3.8.1",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.1"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.8.1.tgz",
+ "integrity": "sha512-MLvnM9gexFWg7nynY24eHZG6NLXocmk718sVds/sx2CAJ6iihhC0JMhhOIa6jnad9KQrHyGl/cs3mMRaaub5Fg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.101",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.1.tgz",
+ "integrity": "sha1-Eahr7+rDxKo+wIYjZRo8gabQu8g=",
+ "dev": true
+ },
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/package.json
new file mode 100644
index 00000000000..8dfc458bb86
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-jsonp-library/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@polymer/iron-jsonp-library",
+ "private": true,
+ "description": "Loads jsonp libraries",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-jsonp-library.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir ."
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/.bower.json
new file mode 100644
index 00000000000..257a96c24f2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/.bower.json
@@ -0,0 +1,71 @@
+{
+ "name": "iron-location",
+ "description": "Bidirectional data binding into the page's URL.",
+ "private": true,
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "routing"
+ ],
+ "main": [
+ "iron-location.html",
+ "iron-query-params.html"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-location.git"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/iron-location",
+ "ignore": [],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "promise-polyfill": "polymerlabs/promise-polyfill#1 - 2",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
+ "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0",
+ "paper-input": "polymerelements/paper-input#^1.0.0",
+ "paper-slider": "polymerelements/paper-slider#^1.0.0",
+ "paper-styles": "polymerelements/paper-styles#^1.0.0",
+ "promise-polyfill": "polymerlabs/promise-polyfill#^1.0.0",
+ "test-fixture": "polymerelements/test-fixture#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.2.3"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "version": "2.2.1",
+ "_release": "2.2.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.2.1",
+ "commit": "a0619aa3628371004cecb20758dad282ac8aff8b"
+ },
+ "_source": "https://github.com/PolymerElements/iron-location.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/iron-location"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/.github/CODEOWNERS
new file mode 100644
index 00000000000..9ef9eb64211
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @e111077
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..e3b4e289b66
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-location/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/lebawa/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/.travis.yml
new file mode 100644
index 00000000000..6db554ea090
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/.travis.yml
@@ -0,0 +1,33 @@
+language: node_js
+sudo: required
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+ sauce_connect: true
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e '\n\033[31mERROR:\033[0m
+ Project is not formatted. Please run "npm run format".' && false)
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+env:
+ global:
+ - secure: >-
+ LSHof0ip5tJswHk4wAIXXsf8Z0WL44Y1pB1XmqFtIsjQLl+2K5bdhRq6Hd6RUZYcpTL29cMStCLQJEG1hxnMks37omHuVFWRtk0NaYlGnJY4i/m/ukUBmM7Yr7LROWRnBgU75PVUvc4YMbCjvlQ9KKjdgBbQBFH2KjhKr9GUN+ihB1yaKRMADvFtC6JWisG4RPv1pRxF6UgvGkOsaCdVb9H9AbKA0psAI1cpg8IMGgUBslbwhYw+viMEQdZ5lW++T3Tb9cwzCVaTqBgvkQCXW4I6T4En9yvUWbV0Ry8uChchvs6BJfwpgN/nksYnLCbCLmN+Rw5eU0+XyWZDLiki/HpsNQblqVEW7vHo1hmtpK24GUv2g8kuE1OjjW7K/l+Q20D8FJFIcPdFjmZ/XgLWxdtXbgNC8n4Z1XBEqKuV1BJ29ojvZk5a5/gFBf9PWdMNTVwSepk7+LoEVQW17vzSHT/HDF7WYEs14uZ0x9I0AV2+339RG7iCcVFMZKYgIif0DmZVysnm0Z9j+wRRk227JpiF9MHeVkFUaXl3+3XIQMz04t+H1wOXiDRlJLJG9IUrzFs+KYuCA+OxNc0XrxjA6Zkl75AQAjAY5vMEWYD+N2OGjkfwD7dB4JtltmZ4llMhEZUt/RPLeZJvL4Sus8hfA6SNG9/tdVgef0mQ91acxZg=
+ - secure: >-
+ h0j4eT4lJqbDkEVz4OjkPuAHxxT0Cy7bWbT71oDllhDAvl9zXxIn5BHSnCaUfO0xUhXVpwNuVmDzOE6yQETJ3MamoqL2Hrbg0VCr4hux9/2ipa4tlCTjQ2Y/YaIoID7CpCchdoOQAjrxeg0ZhpMnwxV18NHTqlxNrsdoSDDSmCdffWQwgjVI07O4h1ISIWx6oY0i1Z+9nJI001iZIw5vGopK8zACa5hfSu9my8Nog5gYOBOEoYmT8lNBaKkNuZacGAkHmXPmeeWiflM49sRO5MfyCgVvNtn6yohXs5D1QD2KUZs4mTzVBebT3vPuV7I9NFd+ZY9GT9YeH9BLuxKpYhGlnjL2HhGAvGjIcKX8315EOCpVvgwX3VE1f9PJe3K9q6LP/sFUqf8cUrbj9FhiAVp79IPJkvLUc+1hUG3iQ8X83mjQxcrCt6I50BINOLgjsfzCmnvv12g3FuRry2EBRxEultvPLRCNc2bJCPqol6kiWzs8ySOPXCYOcXqW5/6Z4DYLMTYevapkJZhErcTBuIH7rXEX4tGsdBjtGjTepcW7k2dsCElrul79czZA3AwdLEK/fuygxXR8eMCeS8Tdh4+Ba4M9TfXtAjjnR30NayTOCwyWW9IvTJeWeXKd6SilJcGVO7r546ayGWJ2G+Fltyi7RGixMplRMm8y6YfeM9k=
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/CONTRIBUTING.md
new file mode 100644
index 00000000000..cfda1a55427
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/lebawa/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/lebawa/edit?html,output](https://jsbin.com/lebawa/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/README.md
new file mode 100644
index 00000000000..ec532cf17dd
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/README.md
@@ -0,0 +1,61 @@
+
+<!---
+
+This README is automatically generated from the comments in these files:
+iron-location.html iron-query-params.html
+
+Edit those files, and our readme bot will duplicate them over here!
+Edit this file, and the bot will squash your changes :)
+
+The bot does some handling of markdown. Please file a bug if it does the wrong
+thing! https://github.com/PolymerLabs/tedium/issues
+
+-->
+
+[![Build status](https://travis-ci.org/PolymerElements/iron-location.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-location)
+[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://www.webcomponents.org/element/PolymerElements/iron-location)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/iron-location)_
+
+## Changes in 2.0
+* URL Polyfill no longer a dependency. Small workaround implemented.
+
+## &lt;iron-location&gt;
+
+The `iron-location` element manages binding to and from the current URL.
+
+iron-location is the first, and lowest level element in the Polymer team's
+routing system. This is a beta release of iron-location as we continue work
+on higher level elements, and as such iron-location may undergo breaking
+changes.
+
+#### Properties
+
+When the URL is: `/search?query=583#details` iron-location's properties will be:
+
+* path: `'/search'`
+* query: `'query=583'`
+* hash: `'details'`
+
+These bindings are bidirectional. Modifying them will in turn modify the URL.
+
+iron-location is only active while it is attached to the document.
+
+#### Links
+
+While iron-location is active in the document it will intercept clicks on links
+within your site, updating the URL pushing the updated URL out through the
+databinding system. iron-location only intercepts clicks with the intent to
+open in the same window, so middle mouse clicks and ctrl/cmd clicks work fine.
+
+You can customize this behavior with the `urlSpaceRegex`.
+
+#### Dwell Time
+
+iron-location protects against accidental history spamming by only adding
+entries to the user's history if the URL stays unchanged for `dwellTime`
+milliseconds.
+
+
+
+<!-- No docs for <iron-query-params> found. -->
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/bower.json
new file mode 100644
index 00000000000..48b9ff14d8d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/bower.json
@@ -0,0 +1,61 @@
+{
+ "name": "iron-location",
+ "description": "Bidirectional data binding into the page's URL.",
+ "private": true,
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "routing"
+ ],
+ "main": [
+ "iron-location.html",
+ "iron-query-params.html"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-location.git"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/iron-location",
+ "ignore": [],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "promise-polyfill": "polymerlabs/promise-polyfill#1 - 2",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
+ "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0",
+ "paper-input": "polymerelements/paper-input#^1.0.0",
+ "paper-slider": "polymerelements/paper-slider#^1.0.0",
+ "paper-styles": "polymerelements/paper-styles#^1.0.0",
+ "promise-polyfill": "polymerlabs/promise-polyfill#^1.0.0",
+ "test-fixture": "polymerelements/test-fixture#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.2.3"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/demo/index.html
new file mode 100644
index 00000000000..2a94af06753
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/demo/index.html
@@ -0,0 +1,125 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <title>iron-location</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../../polymer/polymer.html">
+ <link rel="import" href="../iron-location.html">
+ <link rel="import" href="../../iron-flex-layout/iron-flex-layout.html">
+ <link rel="import" href="../../iron-demo-helpers/url-bar.html">
+</head>
+<body>
+ <url-bar></url-bar>
+
+ <dom-module id="iron-location-demo">
+ <template>
+ <style>
+ div.inputs {
+ margin-bottom: 15px;
+ }
+ label {
+ display: inline-block;
+ width: 100px;
+ }
+
+ h3 {
+ padding: 0;
+ margin: 0;
+ }
+
+ .inputs, .history_entries {
+ @apply --layout-vertical;
+ @apply --layout-flex;
+ padding: 20px;
+ max-width: 500px;
+ }
+
+ .container {
+ @apply --layout-horizontal;
+ }
+
+ input {
+ margin-top: 15px;
+ margin-bottom: 15px;
+ }
+ </style>
+ <iron-location path="{{path}}" hash="{{hash}}" query="{{query}}"
+ dwell-time="{{dwellTime}}">
+ </iron-location>
+
+ <div class="container">
+ <div class="inputs">
+ <h3>URL</h3>
+ <input placeholder="path" value="{{path::input}}">
+ <input placeholder="hash" value="{{hash::input}}">
+ <input placeholder="query" value="{{query::input}}">
+ </div>
+ <div class="history_entries">
+ <h3>Dwell Time</h3>
+ <p>
+ iron-location won't add extraneous entries to the browser's history
+ when changes come in quick succession.
+ </p>
+ <p>
+ A new history entry will only be added if iron-location stays in
+ the same state longer than dwellTime.
+ </p>
+ <div>
+ <label>History added: </label>
+ {{historyElementsAdded}} entries
+ </div>
+ <div>
+ <label>Dwell time:</label>
+ {{inSeconds(dwellTime)}}s
+ </div>
+ <input type="range" min="-1" max="5000" step="100"
+ value="{{dwellTime::input}}">
+ </div>
+ </div>
+ </template>
+ <script>
+ window.addEventListener('WebComponentsReady', function() {
+ Polymer({
+ is: 'iron-location-demo',
+ properties: {
+ historyElementsAdded: {type: Number},
+
+ dwellTime: {type: Number, value: 2000}
+ },
+ observers: ['checkHistorySize(path, hash, query, startingHistoryLength)'],
+
+ ready: function() {
+ this.startingHistoryLength = window.history.length;
+ },
+
+ checkHistorySize: function() {
+ this.historyElementsAdded =
+ window.history.length - this.startingHistoryLength;
+ },
+
+ inSeconds: function(dwellTime) {
+ if (dwellTime === -1 || dwellTime === undefined) {
+ return -1;
+ }
+
+ return (Math.round(dwellTime / 100) / 10)
+ }
+ });
+ });
+ </script>
+ </dom-module>
+
+ <iron-location-demo></iron-location-demo>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/demo/iron-query-params.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/demo/iron-query-params.html
new file mode 100644
index 00000000000..43dc376f96b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/demo/iron-query-params.html
@@ -0,0 +1,124 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <title>iron-query-params</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-query-params.html">
+ <link rel="import" href="../../iron-flex-layout/iron-flex-layout-classes.html">
+</head>
+<body>
+
+ <dom-module id='iron-query-params-demo'>
+ <template>
+ <style include="iron-flex">
+ div.inputs {
+ margin-bottom: 15px;
+ }
+ label {
+ display: inline-block;
+ width: 100px;
+ }
+ h3 {
+ padding: 0;
+ margin: 0;
+ }
+ </style>
+ <iron-query-params
+ id="queryParams"
+ params-string='{{paramString}}'
+ params-object='{{params}}'>
+ </iron-query-params>
+
+ <div class="layout horizontal">
+ <div class="layout vertical flex" class='inputs'>
+ <div>Params as string:</div>
+ <input value="{{paramString::input}}">
+
+ <div>Params as object</div>
+ <template is="dom-if" if="{{paramsInvalid}}">
+ <div>INVALID PARAMS: Should be legal JSON</div>
+ </template>
+ <input value="{{stringifiedParams::input}}">
+ </div>
+ </div>
+ </template>
+ <script>
+ window.addEventListener('WebComponentsReady', function() {
+ Polymer({
+ is: 'iron-query-params-demo',
+ properties: {
+ params: {observer: 'paramsChanged'},
+
+ paramsInvalid: {
+ value: false,
+ },
+
+ paramString: {type: String, observer: 'paramStringChanged'},
+
+ stringifiedParams: {type: String, observer: 'stringifedParamsChanged'}
+ },
+
+ paramStringChanged: function() {
+ if (this.ignore) {
+ return;
+ }
+
+ this.ignore = true;
+
+ try {
+ this.paramsInvalid = false;
+ } catch (_) {
+ this.paramsInvalid = true;
+ }
+
+ this.ignore = false;
+ },
+
+ stringifedParamsChanged: function() {
+ if (this.ignore) {
+ return;
+ }
+
+ this.ignore = true;
+
+ try {
+ var newParamsObject = JSON.parse(this.stringifiedParams);
+ this.$.queryParams.paramsObject = newParamsObject;
+ this.paramsInvalid = false;
+
+ } catch (e) {
+ this.paramsInvalid = true;
+ }
+
+ this.ignore = false;
+ },
+
+ paramsChanged: function() {
+ if (this.ignore) {
+ return;
+ }
+
+ this.ignore = true;
+ this.stringifiedParams = JSON.stringify(this.params);
+ this.paramsInvalid = false;
+ this.ignore = false;
+ }
+ });
+ });
+ </script>
+ </dom-module>
+
+ <iron-query-params-demo></iron-query-params-demo>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/index.html
new file mode 100644
index 00000000000..8ded2107516
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/index.html
@@ -0,0 +1,27 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <title>iron-location</title>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/iron-location.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/iron-location.d.ts
new file mode 100644
index 00000000000..0d55d71a77e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/iron-location.d.ts
@@ -0,0 +1,135 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-location.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+
+/**
+ * The `iron-location` element manages binding to and from the current URL.
+ *
+ * iron-location is the first, and lowest level element in the Polymer team's
+ * routing system. This is a beta release of iron-location as we continue work
+ * on higher level elements, and as such iron-location may undergo breaking
+ * changes.
+ *
+ * #### Properties
+ *
+ * When the URL is: `/search?query=583#details` iron-location's properties will be:
+ *
+ * - path: `'/search'`
+ * - query: `'query=583'`
+ * - hash: `'details'`
+ *
+ * These bindings are bidirectional. Modifying them will in turn modify the URL.
+ *
+ * iron-location is only active while it is attached to the document.
+ *
+ * #### Links
+ *
+ * While iron-location is active in the document it will intercept clicks on links
+ * within your site, updating the URL pushing the updated URL out through the
+ * databinding system. iron-location only intercepts clicks with the intent to
+ * open in the same window, so middle mouse clicks and ctrl/cmd clicks work fine.
+ *
+ * You can customize this behavior with the `urlSpaceRegex`.
+ *
+ * #### Dwell Time
+ *
+ * iron-location protects against accidental history spamming by only adding
+ * entries to the user's history if the URL stays unchanged for `dwellTime`
+ * milliseconds.
+ */
+interface IronLocationElement extends Polymer.Element {
+
+ /**
+ * The pathname component of the URL.
+ */
+ path: string|null|undefined;
+
+ /**
+ * The query string portion of the URL.
+ */
+ query: string|null|undefined;
+
+ /**
+ * The hash component of the URL.
+ */
+ hash: string|null|undefined;
+
+ /**
+ * If the user was on a URL for less than `dwellTime` milliseconds, it
+ * won't be added to the browser's history, but instead will be replaced
+ * by the next entry.
+ *
+ * This is to prevent large numbers of entries from clogging up the user's
+ * browser history. Disable by setting to a negative number.
+ */
+ dwellTime: number|null|undefined;
+
+ /**
+ * A regexp that defines the set of URLs that should be considered part
+ * of this web app.
+ *
+ * Clicking on a link that matches this regex won't result in a full page
+ * navigation, but will instead just update the URL state in place.
+ *
+ * This regexp is given everything after the origin in an absolute
+ * URL. So to match just URLs that start with /search/ do:
+ * url-space-regex="^/search/"
+ */
+ urlSpaceRegex: string|RegExp|null;
+
+ /**
+ * A flag that specifies whether the spaces in query that would normally be
+ * encoded as %20 should be encoded as +.
+ *
+ * Given an example text "hello world", it is encoded in query as
+ * - "hello%20world" without the parameter
+ * - "hello+world" with the parameter
+ */
+ encodeSpaceAsPlusInQuery: boolean|null|undefined;
+
+ /**
+ * urlSpaceRegex, but coerced into a regexp.
+ */
+ readonly _urlSpaceRegExp: RegExp|null;
+ _lastChangedAt: number|null|undefined;
+ _initialized: boolean|null|undefined;
+ hostAttributes: object|null;
+ created(): void;
+ attached(): void;
+ detached(): void;
+ _hashChanged(): void;
+ _urlChanged(): void;
+ _getUrl(): any;
+ _updateUrl(): void;
+
+ /**
+ * A necessary evil so that links work as expected. Does its best to
+ * bail out early if possible.
+ *
+ * @param event .
+ */
+ _globalOnClick(event: MouseEvent|null): void;
+
+ /**
+ * Returns the absolute URL of the link (if any) that this click event
+ * is clicking on, if we can and should override the resulting full
+ * page navigation. Returns null otherwise.
+ *
+ * @param event .
+ * @returns .
+ */
+ _getSameOriginLinkHref(event: MouseEvent|null): string|null;
+ _makeRegExp(urlSpaceRegex: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "iron-location": IronLocationElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/iron-location.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/iron-location.html
new file mode 100644
index 00000000000..5b42ae7fe77
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/iron-location.html
@@ -0,0 +1,433 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<!--
+
+The `iron-location` element manages binding to and from the current URL.
+
+iron-location is the first, and lowest level element in the Polymer team's
+routing system. This is a beta release of iron-location as we continue work
+on higher level elements, and as such iron-location may undergo breaking
+changes.
+
+#### Properties
+
+When the URL is: `/search?query=583#details` iron-location's properties will be:
+
+ - path: `'/search'`
+ - query: `'query=583'`
+ - hash: `'details'`
+
+These bindings are bidirectional. Modifying them will in turn modify the URL.
+
+iron-location is only active while it is attached to the document.
+
+#### Links
+
+While iron-location is active in the document it will intercept clicks on links
+within your site, updating the URL pushing the updated URL out through the
+databinding system. iron-location only intercepts clicks with the intent to
+open in the same window, so middle mouse clicks and ctrl/cmd clicks work fine.
+
+You can customize this behavior with the `urlSpaceRegex`.
+
+#### Dwell Time
+
+iron-location protects against accidental history spamming by only adding
+entries to the user's history if the URL stays unchanged for `dwellTime`
+milliseconds.
+
+@demo demo/index.html
+
+ -->
+<script>
+ (function() {
+ 'use strict';
+
+ var workingURL;
+
+ var urlDoc, urlBase, anchor;
+
+ /**
+ * @param {string} path
+ * @param {string=} base
+ * @return {!URL|!HTMLAnchorElement}
+ */
+ function resolveURL(path, base) {
+ if (workingURL === undefined) {
+ workingURL = false;
+ try {
+ var u = new URL('b', 'http://a');
+ u.pathname = 'c%20d';
+ workingURL = (u.href === 'http://a/c%20d');
+ workingURL = workingURL &&
+ (new URL('http://www.google.com/?foo bar').href ===
+ 'http://www.google.com/?foo%20bar');
+ } catch (e) {
+ }
+ }
+ if (workingURL) {
+ return new URL(path, base);
+ }
+ if (!urlDoc) {
+ urlDoc = document.implementation.createHTMLDocument('url');
+ urlBase = urlDoc.createElement('base');
+ urlDoc.head.appendChild(urlBase);
+ anchor = /** @type {HTMLAnchorElement}*/ (urlDoc.createElement('a'));
+ }
+ urlBase.href = base;
+ anchor.href = path.replace(/ /g, '%20');
+ return anchor;
+ }
+
+ Polymer({
+ is: 'iron-location',
+
+ properties: {
+ /**
+ * The pathname component of the URL.
+ */
+ path: {
+ type: String,
+ notify: true,
+ value: function() {
+ return window.decodeURIComponent(window.location.pathname);
+ }
+ },
+
+ /**
+ * The query string portion of the URL.
+ */
+ query: {
+ type: String,
+ notify: true,
+ value: function() {
+ return window.location.search.slice(1);
+ }
+ },
+
+ /**
+ * The hash component of the URL.
+ */
+ hash: {
+ type: String,
+ notify: true,
+ value: function() {
+ return window.decodeURIComponent(window.location.hash.slice(1));
+ }
+ },
+
+ /**
+ * If the user was on a URL for less than `dwellTime` milliseconds, it
+ * won't be added to the browser's history, but instead will be replaced
+ * by the next entry.
+ *
+ * This is to prevent large numbers of entries from clogging up the user's
+ * browser history. Disable by setting to a negative number.
+ */
+ dwellTime: {type: Number, value: 2000},
+
+ /**
+ * A regexp that defines the set of URLs that should be considered part
+ * of this web app.
+ *
+ * Clicking on a link that matches this regex won't result in a full page
+ * navigation, but will instead just update the URL state in place.
+ *
+ * This regexp is given everything after the origin in an absolute
+ * URL. So to match just URLs that start with /search/ do:
+ * url-space-regex="^/search/"
+ *
+ * @type {string|RegExp}
+ */
+ urlSpaceRegex: {type: String, value: ''},
+
+ /**
+ * A flag that specifies whether the spaces in query that would normally be
+ * encoded as %20 should be encoded as +.
+ *
+ * Given an example text "hello world", it is encoded in query as
+ * - "hello%20world" without the parameter
+ * - "hello+world" with the parameter
+ */
+ encodeSpaceAsPlusInQuery: {type: Boolean, value: false},
+
+ /**
+ * urlSpaceRegex, but coerced into a regexp.
+ *
+ * @type {RegExp}
+ */
+ _urlSpaceRegExp: {computed: '_makeRegExp(urlSpaceRegex)'},
+
+ _lastChangedAt: {type: Number},
+
+ _initialized: {type: Boolean, value: false}
+ },
+
+ hostAttributes: {hidden: true},
+
+ observers: ['_updateUrl(path, query, hash)'],
+
+ created: function() {
+ this.__location = window.location;
+ },
+
+ attached: function() {
+ this.listen(window, 'hashchange', '_hashChanged');
+ this.listen(window, 'location-changed', '_urlChanged');
+ this.listen(window, 'popstate', '_urlChanged');
+ this.listen(
+ /** @type {!HTMLBodyElement} */ (document.body),
+ 'click',
+ '_globalOnClick');
+ // Give a 200ms grace period to make initial redirects without any
+ // additions to the user's history.
+ this._lastChangedAt = window.performance.now() - (this.dwellTime - 200);
+ this._initialized = true;
+
+ this._urlChanged();
+ },
+
+ detached: function() {
+ this.unlisten(window, 'hashchange', '_hashChanged');
+ this.unlisten(window, 'location-changed', '_urlChanged');
+ this.unlisten(window, 'popstate', '_urlChanged');
+ this.unlisten(
+ /** @type {!HTMLBodyElement} */ (document.body),
+ 'click',
+ '_globalOnClick');
+ this._initialized = false;
+ },
+
+ _hashChanged: function() {
+ this.hash = window.decodeURIComponent(this.__location.hash.substring(1));
+ },
+
+ _urlChanged: function() {
+ // We want to extract all info out of the updated URL before we
+ // try to write anything back into it.
+ //
+ // i.e. without _dontUpdateUrl we'd overwrite the new path with the old
+ // one when we set this.hash. Likewise for query.
+ this._dontUpdateUrl = true;
+ this._hashChanged();
+ this.path = window.decodeURIComponent(this.__location.pathname);
+ this.query = this.__location.search.substring(1);
+ this._dontUpdateUrl = false;
+ this._updateUrl();
+ },
+
+ _getUrl: function() {
+ var partiallyEncodedPath =
+ window.encodeURI(this.path).replace(/\#/g, '%23').replace(/\?/g, '%3F');
+ var partiallyEncodedQuery = '';
+ if (this.query) {
+ partiallyEncodedQuery = '?' + this.query.replace(/\#/g, '%23');
+ if (this.encodeSpaceAsPlusInQuery) {
+ partiallyEncodedQuery = partiallyEncodedQuery.replace(/\+/g, '%2B')
+ .replace(/ /g, '+')
+ .replace(/%20/g, '+');
+ }
+ }
+ var partiallyEncodedHash = '';
+ if (this.hash) {
+ partiallyEncodedHash = '#' + window.encodeURI(this.hash);
+ }
+ return (
+ partiallyEncodedPath + partiallyEncodedQuery + partiallyEncodedHash);
+ },
+
+ _updateUrl: function() {
+ if (this._dontUpdateUrl || !this._initialized) {
+ return;
+ }
+
+ if (this.path === window.decodeURIComponent(this.__location.pathname) &&
+ this.query === this.__location.search.substring(1) &&
+ this.hash ===
+ window.decodeURIComponent(this.__location.hash.substring(1))) {
+ // Nothing to do, the current URL is a representation of our properties.
+ return;
+ }
+
+ var newUrl = this._getUrl();
+ // Need to use a full URL in case the containing page has a base URI.
+ var fullNewUrl =
+ resolveURL(
+ newUrl, this.__location.protocol + '//' + this.__location.host)
+ .href;
+ var now = window.performance.now();
+ var shouldReplace = this._lastChangedAt + this.dwellTime > now;
+ this._lastChangedAt = now;
+
+ if (shouldReplace) {
+ window.history.replaceState({}, '', fullNewUrl);
+ } else {
+ window.history.pushState({}, '', fullNewUrl);
+ }
+
+ this.fire('location-changed', {}, {node: window});
+ },
+
+ /**
+ * A necessary evil so that links work as expected. Does its best to
+ * bail out early if possible.
+ *
+ * @param {MouseEvent} event .
+ */
+ _globalOnClick: function(event) {
+ // If another event handler has stopped this event then there's nothing
+ // for us to do. This can happen e.g. when there are multiple
+ // iron-location elements in a page.
+ if (event.defaultPrevented) {
+ return;
+ }
+
+ var href = this._getSameOriginLinkHref(event);
+
+ if (!href) {
+ return;
+ }
+
+ event.preventDefault();
+
+ // If the navigation is to the current page we shouldn't add a history
+ // entry or fire a change event.
+ if (href === this.__location.href) {
+ return;
+ }
+
+ window.history.pushState({}, '', href);
+ this.fire('location-changed', {}, {node: window});
+ },
+
+ /**
+ * Returns the absolute URL of the link (if any) that this click event
+ * is clicking on, if we can and should override the resulting full
+ * page navigation. Returns null otherwise.
+ *
+ * @param {MouseEvent} event .
+ * @return {string?} .
+ */
+ _getSameOriginLinkHref: function(event) {
+ // We only care about left-clicks.
+ if (event.button !== 0) {
+ return null;
+ }
+
+ // We don't want modified clicks, where the intent is to open the page
+ // in a new tab.
+ if (event.metaKey || event.ctrlKey) {
+ return null;
+ }
+
+ var eventPath = Polymer.dom(event).path;
+ var anchor = null;
+
+ for (var i = 0; i < eventPath.length; i++) {
+ var element = eventPath[i];
+
+ if (element.tagName === 'A' && element.href) {
+ anchor = element;
+ break;
+ }
+ }
+
+ // If there's no link there's nothing to do.
+ if (!anchor) {
+ return null;
+ }
+
+ // Target blank is a new tab, don't intercept.
+ if (anchor.target === '_blank') {
+ return null;
+ }
+
+ // If the link is for an existing parent frame, don't intercept.
+ if ((anchor.target === '_top' || anchor.target === '_parent') &&
+ window.top !== window) {
+ return null;
+ }
+
+ // If the link is a download, don't intercept.
+ if (anchor.download) {
+ return null;
+ }
+
+ var href = anchor.href;
+
+ // It only makes sense for us to intercept same-origin navigations.
+ // pushState/replaceState don't work with cross-origin links.
+ var url;
+
+ if (document.baseURI != null) {
+ url = resolveURL(href, /** @type {string} */ (document.baseURI));
+ } else {
+ url = resolveURL(href);
+ }
+
+ var origin;
+
+ // IE Polyfill
+ if (this.__location.origin) {
+ origin = this.__location.origin;
+ } else {
+ origin = this.__location.protocol + '//' + this.__location.host;
+ }
+
+ var urlOrigin;
+
+ if (url.origin) {
+ urlOrigin = url.origin;
+ } else {
+ // IE always adds port number on HTTP and HTTPS on <a>.host but not on
+ // window.location.host
+ var urlHost = url.host;
+ var urlPort = url.port;
+ var urlProtocol = url.protocol;
+ var isExtraneousHTTPS = urlProtocol === 'https:' && urlPort === '443';
+ var isExtraneousHTTP = urlProtocol === 'http:' && urlPort === '80';
+
+ if (isExtraneousHTTPS || isExtraneousHTTP) {
+ urlHost = url.hostname;
+ }
+ urlOrigin = urlProtocol + '//' + urlHost;
+ }
+
+ if (urlOrigin !== origin) {
+ return null;
+ }
+
+ var normalizedHref = url.pathname + url.search + url.hash;
+
+ // pathname should start with '/', but may not if `new URL` is not supported
+ if (normalizedHref[0] !== '/') {
+ normalizedHref = '/' + normalizedHref;
+ }
+
+ // If we've been configured not to handle this url... don't handle it!
+ if (this._urlSpaceRegExp && !this._urlSpaceRegExp.test(normalizedHref)) {
+ return null;
+ }
+
+ // Need to use a full URL in case the containing page has a base URI.
+ var fullNormalizedHref =
+ resolveURL(normalizedHref, this.__location.href).href;
+ return fullNormalizedHref;
+ },
+
+ _makeRegExp: function(urlSpaceRegex) {
+ return RegExp(urlSpaceRegex);
+ }
+ });
+ })();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/iron-query-params.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/iron-query-params.d.ts
new file mode 100644
index 00000000000..dcffb3e9f2d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/iron-query-params.d.ts
@@ -0,0 +1,26 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-query-params.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+
+interface IronQueryParamsElement extends Polymer.Element {
+ paramsString: string|null|undefined;
+ paramsObject: object|null|undefined;
+ _dontReact: boolean|null|undefined;
+ hostAttributes: object|null;
+ paramsStringChanged(): void;
+ paramsObjectChanged(): void;
+ _encodeParams(params: any): any;
+ _decodeParams(paramString: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "iron-query-params": IronQueryParamsElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/iron-query-params.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/iron-query-params.html
new file mode 100644
index 00000000000..08e56451e4f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/iron-query-params.html
@@ -0,0 +1,89 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+
+@demo demo/iron-query-params.html
+-->
+<link rel="import" href="../polymer/polymer.html">
+
+<script>
+ 'use strict';
+
+ Polymer({
+ is: 'iron-query-params',
+
+ properties: {
+ paramsString: {
+ type: String,
+ notify: true,
+ observer: 'paramsStringChanged',
+ },
+
+ paramsObject: {
+ type: Object,
+ notify: true
+ },
+
+ _dontReact: {type: Boolean, value: false}
+ },
+
+ hostAttributes: {hidden: true},
+
+ observers: ['paramsObjectChanged(paramsObject.*)'],
+
+ paramsStringChanged: function() {
+ this._dontReact = true;
+ this.paramsObject = this._decodeParams(this.paramsString);
+ this._dontReact = false;
+ },
+
+ paramsObjectChanged: function() {
+ if (this._dontReact) {
+ return;
+ }
+ this.paramsString = this._encodeParams(this.paramsObject)
+ .replace(/%3F/g, '?')
+ .replace(/%2F/g, '/')
+ .replace(/'/g, '%27');
+ },
+
+ _encodeParams: function(params) {
+ var encodedParams = [];
+
+ for (var key in params) {
+ var value = params[key];
+
+ if (value === '') {
+ encodedParams.push(encodeURIComponent(key));
+
+ } else if (value) {
+ encodedParams.push(
+ encodeURIComponent(key) + '=' +
+ encodeURIComponent(value.toString()));
+ }
+ }
+ return encodedParams.join('&');
+ },
+
+ _decodeParams: function(paramString) {
+ var params = {};
+ // Work around a bug in decodeURIComponent where + is not
+ // converted to spaces:
+ paramString = (paramString || '').replace(/\+/g, '%20');
+ var paramList = paramString.split('&');
+ for (var i = 0; i < paramList.length; i++) {
+ var param = paramList[i].split('=');
+ if (param[0]) {
+ params[decodeURIComponent(param[0])] =
+ decodeURIComponent(param[1] || '');
+ }
+ }
+ return params;
+ }
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/package-lock.json
new file mode 100644
index 00000000000..4a671d0d95d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/package-lock.json
@@ -0,0 +1,2388 @@
+{
+ "name": "@polymer/iron-location",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "8.10.7",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.7.tgz",
+ "integrity": "sha512-5QC0YAHH7aXzrrbgQ+faSeBKbJwTaUyYuaywYzDTr1Myz5C0knx5FHOV5QyhBeE1x8n2xfkBUGE/C0X1paLp+Q==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.44",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+ "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz",
+ "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.2",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.105",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.44",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.2",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/package.json
new file mode 100644
index 00000000000..f65abb00ea4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-location/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@polymer/iron-location",
+ "private": true,
+ "description": "Bidirectional data binding into the page's URL.",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-location.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/.bower.json
new file mode 100644
index 00000000000..cf0f4de4a91
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/.bower.json
@@ -0,0 +1,69 @@
+{
+ "name": "iron-menu-behavior",
+ "version": "2.1.1",
+ "description": "Provides accessible menu behavior",
+ "authors": "The Polymer Authors",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "behavior",
+ "menu"
+ ],
+ "main": [
+ "iron-menu-behavior.html",
+ "iron-menubar-behavior.html"
+ ],
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-menu-behavior"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/iron-menu-behavior",
+ "ignore": [],
+ "dependencies": {
+ "iron-selector": "PolymerElements/iron-selector#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2"
+ },
+ "devDependencies": {
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-selector": "PolymerElements/iron-selector#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0"
+ },
+ "devDependencies": {
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.1.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.1",
+ "commit": "3f4817b8929fdc044432c2be6b713613267932d4"
+ },
+ "_source": "https://github.com/PolymerElements/iron-menu-behavior.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/iron-menu-behavior"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/.github/CODEOWNERS
new file mode 100644
index 00000000000..0d8c0ad6b48
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @bicknellr
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..da2172d0163
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-menu-behavior/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/.travis.yml
new file mode 100644
index 00000000000..b61496728fb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/.travis.yml
@@ -0,0 +1,32 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e '\n\033[31mERROR:\033[0m
+ Project is not formatted. Please run "npm run format".' && false)
+env:
+ global:
+ - secure: >-
+ CbYi/0VAtpLB+NDHdD/I9q2ldILrmyc3wxKdO5vEtMvRKYgsddQ/hXGovV3c6Hy9sAXD5sKtNi60BBG5E2XuydshjYAZiytfeNjFIvDu5627Xljjt90e/r1hg3tNHRRQihH73nPECfp/X+g+yBNCX3f0+2ExAh0DMs1DXt7Dl7Q=
+ - secure: >-
+ kLFlOTh9IjctY7DIJ3KEw5OPrqHNTzoArdabfAtisBMWahuJptKFmYCp/t+zPSL27IVqJakaqPrwGrBUi+4h3wVWredNhfl2lCpMfQfBMcHC5kBVkf2xjJyDa5Y3bP7jPq6YnWYAqEl6pBWYiHU6yWBc6BEdJ6FsTWFbLFTnY7w=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/README.md
new file mode 100644
index 00000000000..8e6392832ba
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/README.md
@@ -0,0 +1,18 @@
+[![Build status](https://travis-ci.org/PolymerElements/iron-menu-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-menu-behavior)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/iron-menu-behavior)_
+
+
+## Polymer.IronMenuBehavior
+
+`Polymer.IronMenuBehavior` implements accessible menu behavior.
+
+## Polymer.IronMenubarBehavior
+
+`Polymer.IronMenubarBehavior` implements accessible menubar behavior.
+
+### Notable breaking changes between 1.x and 2.x (hybrid):
+
+IronSelectableBehavior and IronMultiSelectableBehavior, which are used by
+IronMenuBehavior and IronMenubarBehavior, introduce multiple breaking changes.
+Please see the README for those behaviors for more detail.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/bower.json
new file mode 100644
index 00000000000..971cdae1427
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/bower.json
@@ -0,0 +1,60 @@
+{
+ "name": "iron-menu-behavior",
+ "version": "2.1.1",
+ "description": "Provides accessible menu behavior",
+ "authors": "The Polymer Authors",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "behavior",
+ "menu"
+ ],
+ "main": [
+ "iron-menu-behavior.html",
+ "iron-menubar-behavior.html"
+ ],
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-menu-behavior"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/iron-menu-behavior",
+ "ignore": [],
+ "dependencies": {
+ "iron-selector": "PolymerElements/iron-selector#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2"
+ },
+ "devDependencies": {
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-selector": "PolymerElements/iron-selector#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0"
+ },
+ "devDependencies": {
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/demo/index.html
new file mode 100644
index 00000000000..7fe7ca4d36b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/demo/index.html
@@ -0,0 +1,128 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <title>iron-menu-behavior demo</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../../paper-styles/color.html">
+ <link rel="import" href="../../paper-styles/demo-pages.html">
+ <link rel="import" href="../../paper-styles/default-theme.html">
+ <link rel="import" href="simple-menu.html">
+ <link rel="import" href="simple-menubar.html">
+
+ <custom-style>
+ <style is="custom-style">
+ simple-menu,
+ simple-menubar {
+ display: inline-block;
+ width: 100%;
+ }
+
+ simple-menu a {
+ display: block;
+ }
+
+ simple-menubar a,
+ simple-menu a {
+ padding: 15px 20px;
+ color: var(--primary-text-color);
+ text-decoration: none;
+ }
+ simple-menubar a.iron-selected,
+ simple-menu a.iron-selected {
+ color: white;
+ }
+
+ simple-menu a[disabled],
+ simple-menubar a[disabled] {
+ color: var(--google-grey-300);
+ }
+
+ .horizontal-section {
+ padding: 0;
+ margin-bottom: 20px;
+ }
+
+ .row {
+ height: 120px;
+ }
+
+ [hidden] {
+ display: none;
+ }
+ </style>
+ </custom-style>
+</head>
+<body unresolved>
+
+ <div class="horizontal-section-container">
+ <div>
+ <h3>Simple menu</h3>
+ <div class="horizontal-section">
+ <simple-menu>
+ <a href="javascript:void(0)" role="menuitem">Item 0</a>
+ <a href="javascript:void(0)" role="menuitem">Item 1</a>
+ <a href="javascript:void(0)" role="menuitem" disabled>Item 2</a>
+ <a href="javascript:void(0)" role="menuitem" hidden>Ghost</a>
+ <a href="javascript:void(0)" role="menuitem">Item 3</a>
+ <a href="javascript:void(0)" role="menuitem" style="display:none">Another ghost</a>
+ </simple-menu>
+ </div>
+ </div>
+
+ <div>
+ <h3>Multi-select menu</h3>
+ <div class="horizontal-section">
+ <simple-menu multi>
+ <a href="javascript:void(0)" role="menuitem">Item 0</a>
+ <a href="javascript:void(0)" role="menuitem" disabled>Item 1</a>
+ <a href="javascript:void(0)" role="menuitem" hidden>Ghost</a>
+ <a href="javascript:void(0)" role="menuitem">Item 2</a>
+ <a href="javascript:void(0)" role="menuitem">Item 3</a>
+ <a href="javascript:void(0)" role="menuitem" style="display:none">Another ghost</a>
+ </simple-menu>
+ </div>
+ </div>
+
+ <div>
+ <div class="row">
+ <h3>Simple menubar</h3>
+ <div class="horizontal-section">
+ <simple-menubar>
+ <a href="javascript:void(0)" role="menuitem">Item 0</a>
+ <a href="javascript:void(0)" role="menuitem">Item 1</a>
+ <a href="javascript:void(0)" role="menuitem" disabled>Item 2</a>
+ <a href="javascript:void(0)" role="menuitem">Item 3</a>
+ </simple-menubar>
+ </div>
+ </div>
+ <div class="row">
+ <h3>Multi-select menubar</h3>
+ <div class="horizontal-section">
+ <simple-menubar multi>
+ <a href="javascript:void(0)" role="menuitem">Item 0</a>
+ <a href="javascript:void(0)" role="menuitem">Item 1</a>
+ <a href="javascript:void(0)" role="menuitem">Item 2</a>
+ <a href="javascript:void(0)" role="menuitem">Item 3</a>
+ </simple-menubar>
+ </div>
+ </div>
+ </div>
+
+ </div>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/demo/simple-menu.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/demo/simple-menu.html
new file mode 100644
index 00000000000..97e0165dbd6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/demo/simple-menu.html
@@ -0,0 +1,45 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../iron-menu-behavior.html">
+<link rel="import" href="../../paper-styles/color.html">
+
+<dom-module id="simple-menu">
+ <template>
+ <style>
+ :host > ::slotted(*) {
+ display: block;
+ }
+
+ :host > ::slotted(.iron-selected) {
+ color: white;
+ background-color: var(--google-blue-500);
+ }
+ </style>
+
+ <slot></slot>
+
+ </template>
+
+</dom-module>
+
+<script>
+ (function() {
+
+ Polymer({
+
+ is: 'simple-menu',
+
+ behaviors: [Polymer.IronMenuBehavior]
+
+ });
+ })();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/demo/simple-menubar.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/demo/simple-menubar.html
new file mode 100644
index 00000000000..bfca5a17aa9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/demo/simple-menubar.html
@@ -0,0 +1,45 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../iron-menubar-behavior.html">
+<link rel="import" href="../../paper-styles/color.html">
+
+<dom-module id="simple-menubar">
+ <template>
+ <style>
+ :host > ::slotted(*) {
+ display: inline-block;
+ }
+
+ :host > ::slotted(.iron-selected) {
+ color: white;
+ background-color: var(--google-red-500);
+ }
+ </style>
+
+ <slot></slot>
+
+ </template>
+
+</dom-module>
+
+<script>
+ (function() {
+
+ Polymer({
+
+ is: 'simple-menubar',
+
+ behaviors: [Polymer.IronMenubarBehavior]
+
+ });
+ })();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/index.html
new file mode 100644
index 00000000000..2c643c4a037
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/index.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+
+ <title>iron-menu-behavior</title>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../polymer/polymer.html">
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page src="iron-menubar-behavior.html"></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/iron-menu-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/iron-menu-behavior.d.ts
new file mode 100644
index 00000000000..676a9b09d2e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/iron-menu-behavior.d.ts
@@ -0,0 +1,169 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-menu-behavior.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-selector/iron-multi-selectable.d.ts" />
+/// <reference path="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * `Polymer.IronMenuBehavior` implements accessible menu behavior.
+ */
+ interface IronMenuBehavior extends Polymer.IronMultiSelectableBehavior, Polymer.IronA11yKeysBehavior {
+ keyBindings: object;
+
+ /**
+ * Returns the currently focused item.
+ */
+ readonly focusedItem: object|null;
+
+ /**
+ * The attribute to use on menu items to look up the item title. Typing the
+ * first letter of an item when the menu is open focuses that item. If
+ * unset, `textContent` will be used.
+ */
+ attrForItemTitle: string|null|undefined;
+ disabled: boolean;
+ hostAttributes: object|null;
+ attached(): void;
+
+ /**
+ * Selects the given value. If the `multi` property is true, then the selected
+ * state of the `value` will be toggled; otherwise the `value` will be
+ * selected.
+ *
+ * @param value the value to select.
+ */
+ select(value: string|number): void;
+
+ /**
+ * Mutates items in the menu based on provided selection details, so that
+ * all items correctly reflect selection state.
+ *
+ * @param item An item in the menu.
+ * @param isSelected True if the item should be shown in a
+ * selected state, otherwise false.
+ */
+ _applySelection(item: Element|null, isSelected: boolean): void;
+
+ /**
+ * override _activateHandler
+ */
+ _activateHandler(event: any): void;
+
+ /**
+ * Resets all tabindex attributes to the appropriate value based on the
+ * current selection state. The appropriate value is `0` (focusable) for
+ * the default selected item, and `-1` (not keyboard focusable) for all
+ * other items.
+ */
+ _resetTabindices(): void;
+
+ /**
+ * Sets appropriate ARIA based on whether or not the menu is meant to be
+ * multi-selectable.
+ *
+ * @param multi True if the menu should be multi-selectable.
+ */
+ _updateMultiselectable(multi: boolean): void;
+
+ /**
+ * Given a KeyboardEvent, this method will focus the appropriate item in the
+ * menu (if there is a relevant item, and it is possible to focus it).
+ *
+ * @param event A KeyboardEvent.
+ */
+ _focusWithKeyboardEvent(event: KeyboardEvent|null): void;
+ _clearSearchText(): void;
+
+ /**
+ * Focuses the previous item (relative to the currently focused item) in the
+ * menu, disabled items will be skipped.
+ * Loop until length + 1 to handle case of single item in menu.
+ */
+ _focusPrevious(): void;
+
+ /**
+ * Focuses the next item (relative to the currently focused item) in the
+ * menu, disabled items will be skipped.
+ * Loop until length + 1 to handle case of single item in menu.
+ */
+ _focusNext(): void;
+
+ /**
+ * Discretely updates tabindex values among menu items as the focused item
+ * changes.
+ *
+ * @param focusedItem The element that is currently focused.
+ * @param old The last element that was considered focused, if
+ * applicable.
+ */
+ _focusedItemChanged(focusedItem: Element|null, old: Element|null): void;
+
+ /**
+ * A handler that responds to mutation changes related to the list of items
+ * in the menu.
+ *
+ * @param event An event containing mutation records as its
+ * detail.
+ */
+ _onIronItemsChanged(event: CustomEvent|null): void;
+
+ /**
+ * Handler that is called when a shift+tab keypress is detected by the menu.
+ *
+ * @param event A key combination event.
+ */
+ _onShiftTabDown(event: CustomEvent|null): void;
+
+ /**
+ * Handler that is called when the menu receives focus.
+ *
+ * @param event A focus event.
+ */
+ _onFocus(event: FocusEvent|null): void;
+
+ /**
+ * Handler that is called when the up key is pressed.
+ *
+ * @param event A key combination event.
+ */
+ _onUpKey(event: CustomEvent|null): void;
+
+ /**
+ * Handler that is called when the down key is pressed.
+ *
+ * @param event A key combination event.
+ */
+ _onDownKey(event: CustomEvent|null): void;
+
+ /**
+ * Handler that is called when the esc key is pressed.
+ *
+ * @param event A key combination event.
+ */
+ _onEscKey(event: CustomEvent|null): void;
+
+ /**
+ * Handler that is called when a keydown event is detected.
+ *
+ * @param event A keyboard event.
+ */
+ _onKeydown(event: KeyboardEvent|null): void;
+
+ /**
+ * Updates this element's tab index when it's enabled/disabled.
+ */
+ _disabledChanged(disabled: boolean): void;
+ }
+
+ const IronMenuBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/iron-menu-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/iron-menu-behavior.html
new file mode 100644
index 00000000000..bfa040440db
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/iron-menu-behavior.html
@@ -0,0 +1,439 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-selector/iron-multi-selectable.html">
+<link rel="import" href="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
+
+<script>
+ /**
+ * `Polymer.IronMenuBehavior` implements accessible menu behavior.
+ *
+ * @demo demo/index.html
+ * @polymerBehavior Polymer.IronMenuBehavior
+ */
+ Polymer.IronMenuBehaviorImpl = {
+
+ properties: {
+
+ /**
+ * Returns the currently focused item.
+ * @type {?Object}
+ */
+ focusedItem:
+ {observer: '_focusedItemChanged', readOnly: true, type: Object},
+
+ /**
+ * The attribute to use on menu items to look up the item title. Typing the
+ * first letter of an item when the menu is open focuses that item. If
+ * unset, `textContent` will be used.
+ */
+ attrForItemTitle: {type: String},
+
+ /**
+ * @type {boolean}
+ */
+ disabled: {
+ type: Boolean,
+ value: false,
+ observer: '_disabledChanged',
+ },
+ },
+
+ /**
+ * The list of keys has been taken from
+ * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/getModifierState
+ * @private
+ */
+ _MODIFIER_KEYS: [
+ 'Alt',
+ 'AltGraph',
+ 'CapsLock',
+ 'Control',
+ 'Fn',
+ 'FnLock',
+ 'Hyper',
+ 'Meta',
+ 'NumLock',
+ 'OS',
+ 'ScrollLock',
+ 'Shift',
+ 'Super',
+ 'Symbol',
+ 'SymbolLock'
+ ],
+
+ /** @private */
+ _SEARCH_RESET_TIMEOUT_MS: 1000,
+
+ /** @private */
+ _previousTabIndex: 0,
+
+ hostAttributes: {
+ 'role': 'menu',
+ },
+
+ observers: ['_updateMultiselectable(multi)'],
+
+ listeners: {
+ 'focus': '_onFocus',
+ 'keydown': '_onKeydown',
+ 'iron-items-changed': '_onIronItemsChanged'
+ },
+
+ /**
+ * @type {!Object}
+ */
+ keyBindings: {
+ 'up': '_onUpKey',
+ 'down': '_onDownKey',
+ 'esc': '_onEscKey',
+ 'shift+tab:keydown': '_onShiftTabDown'
+ },
+
+ attached: function() {
+ this._resetTabindices();
+ },
+
+ /**
+ * Selects the given value. If the `multi` property is true, then the selected
+ * state of the `value` will be toggled; otherwise the `value` will be
+ * selected.
+ *
+ * @param {string|number} value the value to select.
+ */
+ select: function(value) {
+ // Cancel automatically focusing a default item if the menu received focus
+ // through a user action selecting a particular item.
+ if (this._defaultFocusAsync) {
+ this.cancelAsync(this._defaultFocusAsync);
+ this._defaultFocusAsync = null;
+ }
+ var item = this._valueToItem(value);
+ if (item && item.hasAttribute('disabled'))
+ return;
+ this._setFocusedItem(item);
+ Polymer.IronMultiSelectableBehaviorImpl.select.apply(this, arguments);
+ },
+
+ /**
+ * Resets all tabindex attributes to the appropriate value based on the
+ * current selection state. The appropriate value is `0` (focusable) for
+ * the default selected item, and `-1` (not keyboard focusable) for all
+ * other items.
+ */
+ _resetTabindices: function() {
+ var selectedItem = this.multi ?
+ (this.selectedItems && this.selectedItems[0]) :
+ this.selectedItem;
+
+ this.items.forEach(function(item) {
+ item.setAttribute('tabindex', item === selectedItem ? '0' : '-1');
+ }, this);
+ },
+
+ /**
+ * Sets appropriate ARIA based on whether or not the menu is meant to be
+ * multi-selectable.
+ *
+ * @param {boolean} multi True if the menu should be multi-selectable.
+ */
+ _updateMultiselectable: function(multi) {
+ if (multi) {
+ this.setAttribute('aria-multiselectable', 'true');
+ } else {
+ this.removeAttribute('aria-multiselectable');
+ }
+ },
+
+ /**
+ * Given a KeyboardEvent, this method will focus the appropriate item in the
+ * menu (if there is a relevant item, and it is possible to focus it).
+ *
+ * @param {KeyboardEvent} event A KeyboardEvent.
+ */
+ _focusWithKeyboardEvent: function(event) {
+ // Make sure that the key pressed is not a modifier key.
+ // getModifierState is not being used, as it is not available in Safari
+ // earlier than 10.0.2 (https://trac.webkit.org/changeset/206725/webkit)
+ if (this._MODIFIER_KEYS.indexOf(event.key) !== -1)
+ return;
+
+ this.cancelDebouncer('_clearSearchText');
+
+ var searchText = this._searchText || '';
+ var key = event.key && event.key.length == 1 ?
+ event.key :
+ String.fromCharCode(event.keyCode);
+ searchText += key.toLocaleLowerCase();
+
+ var searchLength = searchText.length;
+
+ for (var i = 0, item; item = this.items[i]; i++) {
+ if (item.hasAttribute('disabled')) {
+ continue;
+ }
+
+ var attr = this.attrForItemTitle || 'textContent';
+ var title = (item[attr] || item.getAttribute(attr) || '').trim();
+
+ if (title.length < searchLength) {
+ continue;
+ }
+
+ if (title.slice(0, searchLength).toLocaleLowerCase() == searchText) {
+ this._setFocusedItem(item);
+ break;
+ }
+ }
+
+ this._searchText = searchText;
+ this.debounce(
+ '_clearSearchText',
+ this._clearSearchText,
+ this._SEARCH_RESET_TIMEOUT_MS);
+ },
+
+ _clearSearchText: function() {
+ this._searchText = '';
+ },
+
+ /**
+ * Focuses the previous item (relative to the currently focused item) in the
+ * menu, disabled items will be skipped.
+ * Loop until length + 1 to handle case of single item in menu.
+ */
+ _focusPrevious: function() {
+ var length = this.items.length;
+ var curFocusIndex = Number(this.indexOf(this.focusedItem));
+
+ for (var i = 1; i < length + 1; i++) {
+ var item = this.items[(curFocusIndex - i + length) % length];
+ if (!item.hasAttribute('disabled')) {
+ var owner = Polymer.dom(item).getOwnerRoot() || document;
+ this._setFocusedItem(item);
+
+ // Focus might not have worked, if the element was hidden or not
+ // focusable. In that case, try again.
+ if (Polymer.dom(owner).activeElement == item) {
+ return;
+ }
+ }
+ }
+ },
+
+ /**
+ * Focuses the next item (relative to the currently focused item) in the
+ * menu, disabled items will be skipped.
+ * Loop until length + 1 to handle case of single item in menu.
+ */
+ _focusNext: function() {
+ var length = this.items.length;
+ var curFocusIndex = Number(this.indexOf(this.focusedItem));
+
+ for (var i = 1; i < length + 1; i++) {
+ var item = this.items[(curFocusIndex + i) % length];
+ if (!item.hasAttribute('disabled')) {
+ var owner = Polymer.dom(item).getOwnerRoot() || document;
+ this._setFocusedItem(item);
+
+ // Focus might not have worked, if the element was hidden or not
+ // focusable. In that case, try again.
+ if (Polymer.dom(owner).activeElement == item) {
+ return;
+ }
+ }
+ }
+ },
+
+ /**
+ * Mutates items in the menu based on provided selection details, so that
+ * all items correctly reflect selection state.
+ *
+ * @param {Element} item An item in the menu.
+ * @param {boolean} isSelected True if the item should be shown in a
+ * selected state, otherwise false.
+ */
+ _applySelection: function(item, isSelected) {
+ if (isSelected) {
+ item.setAttribute('aria-selected', 'true');
+ } else {
+ item.removeAttribute('aria-selected');
+ }
+ Polymer.IronSelectableBehavior._applySelection.apply(this, arguments);
+ },
+
+ /**
+ * Discretely updates tabindex values among menu items as the focused item
+ * changes.
+ *
+ * @param {Element} focusedItem The element that is currently focused.
+ * @param {?Element} old The last element that was considered focused, if
+ * applicable.
+ */
+ _focusedItemChanged: function(focusedItem, old) {
+ old && old.setAttribute('tabindex', '-1');
+ if (focusedItem && !focusedItem.hasAttribute('disabled') &&
+ !this.disabled) {
+ focusedItem.setAttribute('tabindex', '0');
+ focusedItem.focus();
+ }
+ },
+
+ /**
+ * A handler that responds to mutation changes related to the list of items
+ * in the menu.
+ *
+ * @param {CustomEvent} event An event containing mutation records as its
+ * detail.
+ */
+ _onIronItemsChanged: function(event) {
+ if (event.detail.addedNodes.length) {
+ this._resetTabindices();
+ }
+ },
+
+ /**
+ * Handler that is called when a shift+tab keypress is detected by the menu.
+ *
+ * @param {CustomEvent} event A key combination event.
+ */
+ _onShiftTabDown: function(event) {
+ var oldTabIndex = this.getAttribute('tabindex');
+
+ Polymer.IronMenuBehaviorImpl._shiftTabPressed = true;
+
+ this._setFocusedItem(null);
+
+ this.setAttribute('tabindex', '-1');
+
+ this.async(function() {
+ this.setAttribute('tabindex', oldTabIndex);
+ Polymer.IronMenuBehaviorImpl._shiftTabPressed = false;
+ // NOTE(cdata): polymer/polymer#1305
+ }, 1);
+ },
+
+ /**
+ * Handler that is called when the menu receives focus.
+ *
+ * @param {FocusEvent} event A focus event.
+ */
+ _onFocus: function(event) {
+ if (Polymer.IronMenuBehaviorImpl._shiftTabPressed) {
+ // do not focus the menu itself
+ return;
+ }
+
+ // Do not focus the selected tab if the deepest target is part of the
+ // menu element's local DOM and is focusable.
+ var rootTarget =
+ /** @type {?HTMLElement} */ (Polymer.dom(event).rootTarget);
+ if (rootTarget !== this && typeof rootTarget.tabIndex !== 'undefined' &&
+ !this.isLightDescendant(rootTarget)) {
+ return;
+ }
+
+ // clear the cached focus item
+ this._defaultFocusAsync = this.async(function() {
+ // focus the selected item when the menu receives focus, or the first item
+ // if no item is selected
+ var selectedItem = this.multi ?
+ (this.selectedItems && this.selectedItems[0]) :
+ this.selectedItem;
+
+ this._setFocusedItem(null);
+
+ if (selectedItem) {
+ this._setFocusedItem(selectedItem);
+ } else if (this.items[0]) {
+ // We find the first none-disabled item (if one exists)
+ this._focusNext();
+ }
+ });
+ },
+
+ /**
+ * Handler that is called when the up key is pressed.
+ *
+ * @param {CustomEvent} event A key combination event.
+ */
+ _onUpKey: function(event) {
+ // up and down arrows moves the focus
+ this._focusPrevious();
+ event.detail.keyboardEvent.preventDefault();
+ },
+
+ /**
+ * Handler that is called when the down key is pressed.
+ *
+ * @param {CustomEvent} event A key combination event.
+ */
+ _onDownKey: function(event) {
+ this._focusNext();
+ event.detail.keyboardEvent.preventDefault();
+ },
+
+ /**
+ * Handler that is called when the esc key is pressed.
+ *
+ * @param {CustomEvent} event A key combination event.
+ */
+ _onEscKey: function(event) {
+ var focusedItem = this.focusedItem;
+ if (focusedItem) {
+ focusedItem.blur();
+ }
+ },
+
+ /**
+ * Handler that is called when a keydown event is detected.
+ *
+ * @param {KeyboardEvent} event A keyboard event.
+ */
+ _onKeydown: function(event) {
+ if (!this.keyboardEventMatchesKeys(event, 'up down esc')) {
+ // all other keys focus the menu item starting with that character
+ this._focusWithKeyboardEvent(event);
+ }
+ event.stopPropagation();
+ },
+
+ // override _activateHandler
+ _activateHandler: function(event) {
+ Polymer.IronSelectableBehavior._activateHandler.call(this, event);
+ event.stopPropagation();
+ },
+
+ /**
+ * Updates this element's tab index when it's enabled/disabled.
+ * @param {boolean} disabled
+ */
+ _disabledChanged: function(disabled) {
+ if (disabled) {
+ this._previousTabIndex =
+ this.hasAttribute('tabindex') ? this.tabIndex : 0;
+ this.removeAttribute(
+ 'tabindex'); // No tabindex means not tab-able or select-able.
+ } else if (!this.hasAttribute('tabindex')) {
+ this.setAttribute('tabindex', this._previousTabIndex);
+ }
+ }
+ };
+
+ Polymer.IronMenuBehaviorImpl._shiftTabPressed = false;
+
+ /** @polymerBehavior Polymer.IronMenuBehavior */
+ Polymer.IronMenuBehavior = [
+ Polymer.IronMultiSelectableBehavior,
+ Polymer.IronA11yKeysBehavior,
+ Polymer.IronMenuBehaviorImpl
+ ];
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/iron-menubar-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/iron-menubar-behavior.d.ts
new file mode 100644
index 00000000000..83d9a097742
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/iron-menubar-behavior.d.ts
@@ -0,0 +1,31 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-menubar-behavior.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="iron-menu-behavior.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * `Polymer.IronMenubarBehavior` implements accessible menubar behavior.
+ */
+ interface IronMenubarBehavior extends Polymer.IronMenuBehavior {
+ keyBindings: object;
+ hostAttributes: object|null;
+ readonly _isRTL: any;
+ _onUpKey(event: any): void;
+ _onDownKey(event: any): void;
+ _onKeydown(event: any): void;
+ _onLeftKey(event: any): void;
+ _onRightKey(event: any): void;
+ }
+
+ const IronMenubarBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/iron-menubar-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/iron-menubar-behavior.html
new file mode 100644
index 00000000000..dd3e799181c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/iron-menubar-behavior.html
@@ -0,0 +1,75 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="iron-menu-behavior.html">
+
+<script>
+ /**
+ * `Polymer.IronMenubarBehavior` implements accessible menubar behavior.
+ *
+ * @polymerBehavior Polymer.IronMenubarBehavior
+ */
+ Polymer.IronMenubarBehaviorImpl = {
+
+ hostAttributes: {'role': 'menubar'},
+
+ /**
+ * @type {!Object}
+ */
+ keyBindings: {'left': '_onLeftKey', 'right': '_onRightKey'},
+
+ _onUpKey: function(event) {
+ this.focusedItem.click();
+ event.detail.keyboardEvent.preventDefault();
+ },
+
+ _onDownKey: function(event) {
+ this.focusedItem.click();
+ event.detail.keyboardEvent.preventDefault();
+ },
+
+ get _isRTL() {
+ return window.getComputedStyle(this)['direction'] === 'rtl';
+ },
+
+ _onLeftKey: function(event) {
+ if (this._isRTL) {
+ this._focusNext();
+ } else {
+ this._focusPrevious();
+ }
+ event.detail.keyboardEvent.preventDefault();
+ },
+
+ _onRightKey: function(event) {
+ if (this._isRTL) {
+ this._focusPrevious();
+ } else {
+ this._focusNext();
+ }
+ event.detail.keyboardEvent.preventDefault();
+ },
+
+ _onKeydown: function(event) {
+ if (this.keyboardEventMatchesKeys(event, 'up down left right esc')) {
+ return;
+ }
+
+ // all other keys focus the menu item starting with that character
+ this._focusWithKeyboardEvent(event);
+ }
+
+ };
+
+ /** @polymerBehavior Polymer.IronMenubarBehavior */
+ Polymer.IronMenubarBehavior =
+ [Polymer.IronMenuBehavior, Polymer.IronMenubarBehaviorImpl];
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/package-lock.json
new file mode 100644
index 00000000000..791516edbd6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/package-lock.json
@@ -0,0 +1,2388 @@
+{
+ "name": "@polymer/iron-menu-behavior",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "8.10.7",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.7.tgz",
+ "integrity": "sha512-5QC0YAHH7aXzrrbgQ+faSeBKbJwTaUyYuaywYzDTr1Myz5C0knx5FHOV5QyhBeE1x8n2xfkBUGE/C0X1paLp+Q==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.44",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+ "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz",
+ "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.2",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.105",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.44",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.2",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/package.json
new file mode 100644
index 00000000000..c04023325f1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-menu-behavior/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@polymer/iron-menu-behavior",
+ "private": true,
+ "description": "Provides accessible menu behavior",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-menu-behavior"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/.bower.json
new file mode 100644
index 00000000000..e5b40aa5172
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/.bower.json
@@ -0,0 +1,58 @@
+{
+ "name": "iron-meta",
+ "version": "2.1.1",
+ "keywords": [
+ "web-components",
+ "polymer"
+ ],
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "Useful for sharing information across a DOM tree",
+ "private": true,
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-meta.git"
+ },
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "paper-styles": "polymerelements/paper-styles#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "paper-styles": "polymerelements/paper-styles#^1.0.0",
+ "test-fixture": "polymerelements/test-fixture#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "Polymer/web-component-tester#^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "main": "iron-meta.html",
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "homepage": "https://github.com/PolymerElements/iron-meta",
+ "_release": "2.1.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.1",
+ "commit": "d9cd307d9faf2acc9e8f79a31d852c7851c35620"
+ },
+ "_source": "https://github.com/PolymerElements/iron-meta.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/iron-meta"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/.github/CODEOWNERS
new file mode 100644
index 00000000000..0d8c0ad6b48
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @bicknellr
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..2e81711396d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-meta/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/.travis.yml
new file mode 100644
index 00000000000..3a78c402955
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/.travis.yml
@@ -0,0 +1,33 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e '\n\033[31mERROR:\033[0m
+ Project is not formatted. Please run "npm run format".' && false)
+env:
+ global:
+ - secure: >-
+ mjikUCoN+UpTbFHwbGXUoKp4vtZ2qNN1JYW79WcOik7fCFmvdFzfYQPDa6y9aJvU3kgkDndGdR/ynLG4kejZjmqTS5fYtdHEwpPVPapbVYnquJvCJKbMN4S2QpGCoq51pjKQ8U3Ys6G5HkmdcDfw3SKk1uMgVzKV7fEI+6WnZ/M=
+ - secure: >-
+ LHDnBtwK7yO2X4GNmIaAl7t85WWc1U189OiPqemD27+jTcKml0by1n9Mu/yrg94jYgeXab9mHgU3uMtIdQstNNwTDu8CgmmIP4H2EWopHrTi3KM7Z7aeofPgMJsVFXwg+WhNlcCfhEsygHZWTxjJXM4fcGOrFPDa4+BTgRa2hEE=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+ sauce_connect: true
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/README.md
new file mode 100644
index 00000000000..1eecb040743
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/README.md
@@ -0,0 +1,10 @@
+[![Build status](https://travis-ci.org/PolymerElements/iron-meta.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-meta)
+[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://www.webcomponents.org/element/PolymerElements/iron-meta)
+
+## &lt;iron-meta&gt;
+
+`iron-meta` is a generic element you can use for sharing information across the DOM tree.
+It uses [monostate pattern](http://c2.com/cgi/wiki?MonostatePattern) such that any
+instance of iron-meta has access to the shared
+information. You can use `iron-meta` to share whatever you want (or create an extension
+[like x-meta] for enhancements).
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/bower.json
new file mode 100644
index 00000000000..9a11cc780c0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/bower.json
@@ -0,0 +1,48 @@
+{
+ "name": "iron-meta",
+ "version": "2.1.1",
+ "keywords": [
+ "web-components",
+ "polymer"
+ ],
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "Useful for sharing information across a DOM tree",
+ "private": true,
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-meta.git"
+ },
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "paper-styles": "polymerelements/paper-styles#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "paper-styles": "polymerelements/paper-styles#^1.0.0",
+ "test-fixture": "polymerelements/test-fixture#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "Polymer/web-component-tester#^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "main": "iron-meta.html",
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/demo/index.html
new file mode 100644
index 00000000000..dcd0d43fd66
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/demo/index.html
@@ -0,0 +1,75 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <title>iron-meta</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../../paper-styles/demo-pages.html">
+ <link rel="import" href="../iron-meta.html">
+</head>
+<body>
+
+ <div class="vertical-section centered">
+ <h1>&lt;iron-meta&gt;</h1>
+ <h2>Key Query</h2>
+
+ <iron-meta key="info" value="foo/bar"></iron-meta>
+
+ The <code>value</code> stored at <code>key="info"</code> is <code><meta-test></meta-test></code>.
+ </div>
+
+ <div class="vertical-section centered">
+ <h2>Type Query</h2>
+
+ <iron-meta type="type1" key="a" value="Polymer"></iron-meta>
+ <iron-meta type="type1" key="b" value="is"></iron-meta>
+ <iron-meta type="type2" key="a" value="wonderful"></iron-meta>
+ <iron-meta type="type2" key="b" value="<3"></iron-meta>
+
+ The <code>value(s)</code> stored at <code>type="type1"</code> are:<br><code><type-one></type-one></code>.<br><br>The <code>value(s)</code> stored at <code>type="type2"</code> are:<br><code><type-two></type-two></code>.
+ </div>
+
+ <script>
+ window.addEventListener('WebComponentsReady', function() {
+ Polymer({
+ is: 'meta-test',
+ ready: function() {
+ this.textContent = new Polymer.IronMeta({key: 'info'}).value;
+ }
+ });
+ });
+
+ Polymer({
+ is: 'type-one',
+
+ ready: function() {
+ var resultList = new Polymer.IronMeta({type: 'type1'}).list;
+ this.textContent = JSON.stringify(resultList);
+ }
+ });
+
+ Polymer({
+ is: 'type-two',
+
+ ready: function() {
+ var resultList = new Polymer.IronMeta({type: 'type2'}).list;
+ this.textContent = JSON.stringify(resultList);
+ }
+ });
+ </script>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/gen-tsd.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/gen-tsd.json
new file mode 100644
index 00000000000..195c463fe8d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/gen-tsd.json
@@ -0,0 +1,7 @@
+{
+ "addReferences": {
+ "iron-meta.d.ts": [
+ "iron-meta-extra.d.ts"
+ ]
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/hero.svg b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/hero.svg
new file mode 100755
index 00000000000..ea8548dcecb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/hero.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">
+<g id="background" display="none">
+ <rect display="inline" fill="#B0BEC5" width="225" height="126"/>
+</g>
+<g id="label">
+</g>
+<g id="art">
+ <circle cx="22" cy="85" r="4"/>
+ <circle cx="88" cy="98" r="4"/>
+ <path d="M87.5,100c-3.8-0.3-5.5-2.8-7-5c-1.4-2.1-2.7-3.9-5.5-4.2c-2.8-0.3-4.4,1.3-6.2,3.1c-1.9,1.9-4,4-7.8,3.7
+ c-3.8-0.3-5.5-2.8-7-5c-1.4-2.1-2.7-3.9-5.5-4.2c-2.8-0.3-4.4,1.3-6.2,3.1c-1.9,1.9-4,4-7.8,3.7c-3.8-0.3-5.5-2.8-7-5
+ c-1.4-2.1-2.7-3.9-5.5-4.2l0.2-2c3.8,0.3,5.5,2.8,7,5c1.4,2.1,2.7,3.9,5.5,4.2c2.8,0.3,4.4-1.3,6.2-3.1c1.9-1.9,4-4,7.8-3.7
+ c3.8,0.3,5.5,2.8,7,5c1.4,2.1,2.7,3.9,5.5,4.2c2.8,0.3,4.4-1.3,6.2-3.1c1.9-1.9,4-4,7.8-3.7c3.8,0.3,5.5,2.8,7,5
+ c1.4,2.1,2.7,3.9,5.5,4.2L87.5,100z"/>
+ <circle cx="96" cy="86" r="4"/>
+ <circle cx="162" cy="98" r="4"/>
+ <rect x="95.5" y="91" transform="matrix(0.9839 0.1789 -0.1789 0.9839 18.5382 -21.5923)" width="67.1" height="2"/>
+ <g>
+ <path d="M27,41.5l4.5,13.4l4.9-13.4h5.4v32h-4.4V61l0.4-13.4l-5.4,14.5h-2L25.6,48L26,61v12.5h-4.4v-32H27z"/>
+ <path d="M67.5,58.7H53.4V70h16.4v3.5H49v-32h20.6V45H53.4v10.2h14.2V58.7z"/>
+ <path d="M98.5,45H88.3v28.5h-4.4V45H73.6v-3.5h24.9V45z"/>
+ <path d="M116.2,65.3H105l-2.6,8.2h-4.5l10.9-32h3.8l10.6,32h-4.5L116.2,65.3z M106.2,61.6h8.9l-4.4-14.2L106.2,61.6z"/>
+ </g>
+ <g id="ic_x5F_add_x0D_">
+ </g>
+</g>
+<g id="Guides">
+</g>
+</svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/index.html
new file mode 100644
index 00000000000..dce836232ad
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/index.html
@@ -0,0 +1,27 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <title>iron-meta</title>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/iron-meta-extra.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/iron-meta-extra.d.ts
new file mode 100644
index 00000000000..278a7c8fb1e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/iron-meta-extra.d.ts
@@ -0,0 +1,18 @@
+declare namespace Polymer {
+
+ class IronMeta {
+ constructor(options?: {
+ type: string|null|undefined,
+ key: string|null|undefined,
+ value: any,
+ });
+
+ static types: {[type: string]: {[key: string]: any}};
+
+ value: any;
+
+ readonly list: any[]|undefined;
+
+ byKey(key: string): any;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/iron-meta.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/iron-meta.d.ts
new file mode 100644
index 00000000000..b4bc5bdd969
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/iron-meta.d.ts
@@ -0,0 +1,85 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-meta.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="iron-meta-extra.d.ts" />
+
+/**
+ * `iron-meta` is a generic element you can use for sharing information across the DOM tree.
+ * It uses [monostate pattern](http://c2.com/cgi/wiki?MonostatePattern) such that any
+ * instance of iron-meta has access to the shared
+ * information. You can use `iron-meta` to share whatever you want (or create an extension
+ * [like x-meta] for enhancements).
+ *
+ * The `iron-meta` instances containing your actual data can be loaded in an import,
+ * or constructed in any way you see fit. The only requirement is that you create them
+ * before you try to access them.
+ *
+ * Examples:
+ *
+ * If I create an instance like this:
+ *
+ * <iron-meta key="info" value="foo/bar"></iron-meta>
+ *
+ * Note that value="foo/bar" is the metadata I've defined. I could define more
+ * attributes or use child nodes to define additional metadata.
+ *
+ * Now I can access that element (and it's metadata) from any iron-meta instance
+ * via the byKey method, e.g.
+ *
+ * meta.byKey('info');
+ *
+ * Pure imperative form would be like:
+ *
+ * document.createElement('iron-meta').byKey('info');
+ *
+ * Or, in a Polymer element, you can include a meta in your template:
+ *
+ * <iron-meta id="meta"></iron-meta>
+ * ...
+ * this.$.meta.byKey('info');
+ */
+interface IronMetaElement extends Polymer.Element {
+
+ /**
+ * The type of meta-data. All meta-data of the same type is stored
+ * together.
+ */
+ type: string;
+
+ /**
+ * The key used to store `value` under the `type` namespace.
+ */
+ key: string|null;
+
+ /**
+ * The meta-data to store or retrieve.
+ */
+ value: any;
+
+ /**
+ * If true, `value` is set to the iron-meta instance itself.
+ */
+ self: boolean|null|undefined;
+ hostAttributes: object|null;
+ readonly list: any;
+ _selfChanged(self: any): void;
+
+ /**
+ * Retrieves meta data value by key.
+ *
+ * @param key The key of the meta-data to be returned.
+ */
+ byKey(key: string): any;
+}
+
+interface HTMLElementTagNameMap {
+ "iron-meta": IronMetaElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/iron-meta.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/iron-meta.html
new file mode 100644
index 00000000000..51f2f168932
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/iron-meta.html
@@ -0,0 +1,207 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<!--
+`iron-meta` is a generic element you can use for sharing information across the DOM tree.
+It uses [monostate pattern](http://c2.com/cgi/wiki?MonostatePattern) such that any
+instance of iron-meta has access to the shared
+information. You can use `iron-meta` to share whatever you want (or create an extension
+[like x-meta] for enhancements).
+
+The `iron-meta` instances containing your actual data can be loaded in an import,
+or constructed in any way you see fit. The only requirement is that you create them
+before you try to access them.
+
+Examples:
+
+If I create an instance like this:
+
+ <iron-meta key="info" value="foo/bar"></iron-meta>
+
+Note that value="foo/bar" is the metadata I've defined. I could define more
+attributes or use child nodes to define additional metadata.
+
+Now I can access that element (and it's metadata) from any iron-meta instance
+via the byKey method, e.g.
+
+ meta.byKey('info');
+
+Pure imperative form would be like:
+
+ document.createElement('iron-meta').byKey('info');
+
+Or, in a Polymer element, you can include a meta in your template:
+
+ <iron-meta id="meta"></iron-meta>
+ ...
+ this.$.meta.byKey('info');
+
+@group Iron Elements
+@demo demo/index.html
+@hero hero.svg
+@element iron-meta
+-->
+
+<script>
+ (function() {
+
+ /**
+ * @constructor
+ * @param {{
+ * type: (string|null|undefined),
+ * key: (string|null|undefined),
+ * value: *,
+ * }=} options
+ */
+ Polymer.IronMeta = function(options) {
+ Polymer.IronMeta[' '](options);
+
+ this.type = (options && options.type) || 'default';
+ this.key = options && options.key;
+ if (options && 'value' in options) {
+ this.value = options.value;
+ }
+ };
+
+ // This function is used to convince Closure not to remove constructor calls
+ // for instances that are not held anywhere. For example, when
+ // `new Polymer.IronMeta({...})` is used only for the side effect of adding
+ // a value.
+ Polymer.IronMeta[' '] = function() {};
+
+ Polymer.IronMeta.types = {};
+
+ Polymer.IronMeta.prototype = {
+ get value() {
+ var type = this.type;
+ var key = this.key;
+
+ if (type && key) {
+ return Polymer.IronMeta.types[type] && Polymer.IronMeta.types[type][key];
+ }
+ },
+
+ set value(value) {
+ var type = this.type;
+ var key = this.key;
+
+ if (type && key) {
+ type = Polymer.IronMeta.types[type] = Polymer.IronMeta.types[type] || {};
+ if (value == null) {
+ delete type[key];
+ } else {
+ type[key] = value;
+ }
+ }
+ },
+
+ get list() {
+ var type = this.type;
+
+ if (type) {
+ var items = Polymer.IronMeta.types[this.type];
+ if (!items) {
+ return [];
+ }
+
+ return Object.keys(items).map(function(key) {
+ return metaDatas[this.type][key];
+ }, this);
+ }
+ },
+
+ byKey: function(key) {
+ this.key = key;
+ return this.value;
+ }
+ };
+
+ var metaDatas = Polymer.IronMeta.types;
+
+ Polymer({
+
+ is: 'iron-meta',
+
+ properties: {
+
+ /**
+ * The type of meta-data. All meta-data of the same type is stored
+ * together.
+ * @type {string}
+ */
+ type: {
+ type: String,
+ value: 'default',
+ },
+
+ /**
+ * The key used to store `value` under the `type` namespace.
+ * @type {?string}
+ */
+ key: {
+ type: String,
+ },
+
+ /**
+ * The meta-data to store or retrieve.
+ * @type {*}
+ */
+ value: {
+ type: String,
+ notify: true,
+ },
+
+ /**
+ * If true, `value` is set to the iron-meta instance itself.
+ */
+ self: {type: Boolean, observer: '_selfChanged'},
+
+ __meta: {type: Boolean, computed: '__computeMeta(type, key, value)'}
+ },
+
+ hostAttributes: {hidden: true},
+
+ __computeMeta: function(type, key, value) {
+ var meta = new Polymer.IronMeta({type: type, key: key});
+
+ if (value !== undefined && value !== meta.value) {
+ meta.value = value;
+ } else if (this.value !== meta.value) {
+ this.value = meta.value;
+ }
+
+ return meta;
+ },
+
+ get list() {
+ return this.__meta && this.__meta.list;
+ },
+
+ _selfChanged: function(self) {
+ if (self) {
+ this.value = this;
+ }
+ },
+
+ /**
+ * Retrieves meta data value by key.
+ *
+ * @method byKey
+ * @param {string} key The key of the meta-data to be returned.
+ * @return {*}
+ */
+ byKey: function(key) {
+ return new Polymer.IronMeta({type: this.type, key: key}).value;
+ }
+ });
+ })();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/package-lock.json
new file mode 100644
index 00000000000..a0eb2a2ed0f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/package-lock.json
@@ -0,0 +1,2388 @@
+{
+ "name": "@polymer/iron-meta",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "8.10.7",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.7.tgz",
+ "integrity": "sha512-5QC0YAHH7aXzrrbgQ+faSeBKbJwTaUyYuaywYzDTr1Myz5C0knx5FHOV5QyhBeE1x8n2xfkBUGE/C0X1paLp+Q==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.44",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+ "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz",
+ "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.2",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.105",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.44",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.2",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/package.json
new file mode 100644
index 00000000000..981c4ba1b04
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-meta/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@polymer/iron-meta",
+ "private": true,
+ "description": "Useful for sharing information across a DOM tree",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-meta.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/.bower.json
new file mode 100644
index 00000000000..89e3bd01978
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/.bower.json
@@ -0,0 +1,70 @@
+{
+ "name": "iron-overlay-behavior",
+ "version": "2.3.4",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "Provides a behavior for making an element an overlay",
+ "private": true,
+ "main": "iron-overlay-behavior.html",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "behavior",
+ "overlay"
+ ],
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-overlay-behavior.git"
+ },
+ "dependencies": {
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#1 - 2",
+ "iron-fit-behavior": "PolymerElements/iron-fit-behavior#1 - 2",
+ "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0",
+ "iron-fit-behavior": "PolymerElements/iron-fit-behavior#^1.0.0",
+ "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "homepage": "https://github.com/PolymerElements/iron-overlay-behavior",
+ "_release": "2.3.4",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.3.4",
+ "commit": "a2158a41a035616764f9ac4780410ba1c22886de"
+ },
+ "_source": "https://github.com/PolymerElements/iron-overlay-behavior.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/iron-overlay-behavior"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/.github/CODEOWNERS
new file mode 100644
index 00000000000..c5097c0c903
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @valdrinkoshi
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..9925d374459
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-overlay-behavior/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/.travis.yml
new file mode 100644
index 00000000000..2e6aa26cdcf
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/.travis.yml
@@ -0,0 +1,33 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Project has not been formatted. Please run "npm run
+ format" or update the formatconfig.json.' && false)
+env:
+ global:
+ - secure: >-
+ ZE4MrCc8vi6hb2WDctjBf9Y7wmYm0tbknPCX0TR+ks0eEXt2ZkWOvMGCw6sKvL1SsrUzhSOQiAc3IFCZBZ6vA1DUCo6S+4O8IvH+VawsK34arI7PIN7UhTDRmudzDwYKJHToRGVFffM1Y5vmNOBNj7hyiQp/UP0hz8vWLpQKyNw=
+ - secure: >-
+ IDwaZdFRon3lTOOZsoGXFUTJayvthgm5JTigYlOtVq6CVlJQBShveehe08fHAhb0XkpFyTFxBsricOUc2DOlyK9ds+DE9rRlIml+BuCrmvfCFvxX4loRg5tibKrRT9mrHNhJRwZiL4WbsGTskMpWGorgkO9qMJSJ9sAabjCJrmM=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/README.md
new file mode 100644
index 00000000000..979118cce65
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/README.md
@@ -0,0 +1,67 @@
+[![Build status](https://travis-ci.org/PolymerElements/iron-overlay-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-overlay-behavior)
+[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://www.webcomponents.org/element/PolymerElements/iron-overlay-behavior)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/iron-overlay-behavior)_
+
+
+## Polymer.IronOverlayBehavior
+
+Use `Polymer.IronOverlayBehavior` to implement an element that can be hidden or shown, and displays
+on top of other content. It includes an optional backdrop, and can be used to implement a variety
+of UI controls including dialogs and drop downs. Multiple overlays may be displayed at once.
+
+See the [demo source code](https://github.com/PolymerElements/iron-overlay-behavior/blob/master/demo/simple-overlay.html)
+for an example.
+
+### Changes in 2.0
+- Focus wrapping is not guaranteed to work for elements with `tabindex > 0`, see more details [here](https://github.com/PolymerElements/iron-overlay-behavior/pull/241).
+Consider overriding [`_focusableNodes`](http://jsbin.com/siwutox/1/edit) or using the [Blocking Elements polyfill](https://github.com/PolymerLabs/blockingElements).
+
+### Closing and canceling
+
+An overlay may be hidden by closing or canceling. The difference between close and cancel is user
+intent. Closing generally implies that the user acknowledged the content on the overlay. By default,
+it will cancel whenever the user taps outside it or presses the escape key. This behavior is
+configurable with the `no-cancel-on-esc-key` and the `no-cancel-on-outside-click` properties.
+`close()` should be called explicitly by the implementer when the user interacts with a control
+in the overlay element. When the dialog is canceled, the overlay fires an 'iron-overlay-canceled'
+event. Call `preventDefault` on this event to prevent the overlay from closing.
+
+### Positioning
+
+By default the element is sized and positioned to fit and centered inside the window. You can
+position and size it manually using CSS. See `Polymer.IronFitBehavior`.
+
+### Backdrop
+
+Set the `with-backdrop` attribute to display a backdrop behind the overlay. The backdrop is
+appended to `<body>` and is of type `<iron-overlay-backdrop>`. See its doc page for styling
+options.
+
+In addition, `with-backdrop` will wrap the focus within the content in the light DOM.
+Override the [`_focusableNodes` getter](#Polymer.IronOverlayBehavior:property-_focusableNodes)
+to achieve a different behavior.
+
+### Limitations
+
+The element is styled to appear on top of other content by setting its `z-index` property. You
+must ensure no element has a stacking context with a higher `z-index` than its parent stacking
+context. You should place this element as a child of `<body>` whenever possible.
+
+## &lt;iron-overlay-backdrop&gt;
+
+`iron-overlay-backdrop` is a backdrop used by `Polymer.IronOverlayBehavior`. It should be a
+singleton.
+
+### Styling
+
+The following custom properties and mixins are available for styling.
+
+| Custom property | Description | Default |
+| --- | --- | --- |
+| `--iron-overlay-backdrop-background-color` | Backdrop background color | #000 |
+| `--iron-overlay-backdrop-opacity` | Backdrop opacity | 0.6 |
+| `--iron-overlay-backdrop` | Mixin applied to `iron-overlay-backdrop`. | {} |
+| `--iron-overlay-backdrop-opened` | Mixin applied to `iron-overlay-backdrop` when it is displayed | {} |
+
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/bower.json
new file mode 100644
index 00000000000..26b654fc7da
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/bower.json
@@ -0,0 +1,60 @@
+{
+ "name": "iron-overlay-behavior",
+ "version": "2.3.4",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "Provides a behavior for making an element an overlay",
+ "private": true,
+ "main": "iron-overlay-behavior.html",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "behavior",
+ "overlay"
+ ],
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-overlay-behavior.git"
+ },
+ "dependencies": {
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#1 - 2",
+ "iron-fit-behavior": "PolymerElements/iron-fit-behavior#1 - 2",
+ "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0",
+ "iron-fit-behavior": "PolymerElements/iron-fit-behavior#^1.0.0",
+ "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/demo/index.html
new file mode 100644
index 00000000000..61be62d0f62
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/demo/index.html
@@ -0,0 +1,325 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+
+<head>
+
+ <title>simple-overlay demo</title>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../iron-flex-layout/iron-flex-layout.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="simple-overlay.html">
+
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles">
+ demo-snippet {
+ --demo-snippet-code: {
+ max-height: 250px;
+ }
+ }
+ </style>
+ </custom-style>
+
+</head>
+
+<body unresolved class="centered">
+
+ <h3>An element with <code>IronOverlayBehavior</code> can be opened, closed, toggled.</h3>
+ <demo-snippet>
+ <template>
+ <button onclick="plain.open()">Plain overlay</button>
+ <simple-overlay id="plain" tabindex=-1>
+ <h2>Hello world!</h2>
+ <p>This can be closed by pressing the ESC key too.</p>
+ <button onclick="plain.close()">Close</button>
+ </simple-overlay>
+ </template>
+ </demo-snippet>
+
+ <h3>Use <code>with-backdrop</code> to add a backdrop to your overlay. Tabbing will be trapped within the overlay.</h3>
+ <demo-snippet>
+ <template>
+ <button onclick="backdrop.open()">Overlay with backdrop</button>
+ <simple-overlay id="backdrop" with-backdrop scroll-action="lock">
+ <p>Hello world!</p>
+ <button>Button</button>
+ <button onclick="backdrop.close()">Close</button>
+ </simple-overlay>
+ </template>
+ </demo-snippet>
+
+ <h3>Use <code>restore-focus-on-close</code> to return the focus to the element that opened the overlay when it gets closed.</h3>
+ <demo-snippet>
+ <template>
+ <button onclick="returnFocus.open()">Overlay that restores focus</button>
+ <simple-overlay id="returnFocus" restore-focus-on-close>
+ <p>Hello world!</p>
+ <button onclick="returnFocus.close()">Close</button>
+ </simple-overlay>
+ </template>
+ </demo-snippet>
+
+ <h3>The child with <code>autofocus</code> gets focused when opening the overlay.</h3>
+ <demo-snippet>
+ <template>
+ <button onclick="withAutofocus.open()">Overlay with autofocus child</button>
+ <simple-overlay id="withAutofocus">
+ <p>Hello world!</p>
+ <button autofocus>autofocus</button>
+ <button onclick="withAutofocus.close()">Close</button>
+ </simple-overlay>
+ </template>
+ </demo-snippet>
+
+ <h3>Multiple overlays can be opened.</h3>
+ <demo-snippet>
+ <template>
+ <button onclick="multiple.open()">Open first overlay</button>
+ <simple-overlay id="multiple" tabindex=-1 with-backdrop>
+ <p>click to open another overlay</p>
+ <button onclick="multiple2.open()">Open second overlay</button>
+ <button onclick="multiple.close()">Close this</button>
+ </simple-overlay>
+ <simple-overlay id="multiple2" tabindex=-1 with-backdrop>
+ <button onclick="multiple3.open()">Open third overlay</button>
+ <button onclick="multiple2.close()">Close</button>
+ </simple-overlay>
+ <simple-overlay id="multiple3" tabindex=-1>
+ <h2>Hello!</h2>
+ <button onclick="multiple3.close()">Close</button>
+ </simple-overlay>
+ </template>
+ </demo-snippet>
+
+ <h3>Use <code>always-on-top</code> to keep the overlay on top of others.</h3>
+ <demo-snippet>
+ <template>
+ <button onclick="onTop.open()">Open always-on-top</button>
+ <simple-overlay id="onTop" always-on-top tabindex=-1>
+ <h2>Always on top</h2>
+ <button onclick="backdrop2.open()">Open with backdrop</button>
+ <button onclick="onTop.close()">Close this</button>
+ </simple-overlay>
+ <simple-overlay id="backdrop2" with-backdrop tabindex=-1>
+ <h2>With backdrop</h2>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <button onclick="backdrop2.close()">Close</button>
+ </simple-overlay>
+ </template>
+ </demo-snippet>
+
+ <h3>An element with <code>IronOverlayBehavior</code> can be scrollable or contain scrollable content.</h3>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ .with-margin {
+ margin: 24px 40px;
+ }
+
+ .scrollable {
+ border: 1px solid lightgray;
+ padding: 24px;
+ @apply --layout-scroll;
+ }
+ </style>
+ </custom-style>
+ <button onclick="scrolling.open()">Scrolling overlay</button>
+
+ <simple-overlay id="scrolling" class="with-margin scrollable" tabindex=-1 scroll-action="lock">
+ <h2>This overlay scrolls internally.</h2>
+ <p>
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+ Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
+ aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
+ occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </p>
+ <button onclick="scrolling.close()">Close</button>
+ </simple-overlay>
+
+ <button onclick="scrolling2.open()">Scrolling content</button>
+
+ <simple-overlay id="scrolling2" class="with-margin" tabindex=-1 scroll-action="lock">
+ <h2>This overlay has a scrolling child.</h2>
+ <p class="scrollable">
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+ Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
+ aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
+ occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br> Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </p>
+ <button onclick="scrolling2.close()">Close</button>
+ </simple-overlay>
+
+ <script>
+ // .scrollable is the element that determines the size of the overlay.
+ scrolling2.sizingTarget = scrolling2.querySelector('.scrollable');
+ </script>
+ </template>
+ </demo-snippet>
+
+ <h3>Use <code>allow-click-through</code> to allow click events to be handled by overlays below the top overlay.</h3>
+ <demo-snippet>
+ <template>
+ <button onclick="plain.open();toast.open()">Overlay that allows click through</button>
+ <simple-overlay id="toast" allow-click-through no-cancel-on-outside-click horizontal-align="left" vertical-align="bottom" no-auto-focus>
+ <span>This overlay allows click-through which can close overlays below it.</span>
+ <button onclick="toast.close()">Close</button>
+ </simple-overlay>
+ </template>
+ </demo-snippet>
+
+ <h3>Use <code>scroll-action</code> to lock, refit or cancel an overlay on scroll.</h3>
+ <demo-snippet>
+ <template>
+ <span>
+ <button onclick="lockOnScroll.open()">locks scroll</button>
+ <simple-overlay id="lockOnScroll" scroll-action="lock" no-overlap
+ vertical-align="bottom" horizontal-align="left" tabindex=-1>
+ <h2>Prevents scroll outside</h2>
+ <button onclick="lockOnScroll.close()">Close this</button>
+ </simple-overlay>
+ </span>
+ <span>
+ <button onclick="refitOnScroll.open()">refits on scroll</button>
+ <simple-overlay id="refitOnScroll" scroll-action="refit" no-overlap
+ vertical-align="bottom" horizontal-align="left" tabindex=-1>
+ <h2>Refits on scroll</h2>
+ <button onclick="refitOnScroll.close()">Close this</button>
+ </simple-overlay>
+ </span>
+ <span>
+ <button onclick="cancelOnScroll.open()">cancels on scroll</button>
+ <simple-overlay id="cancelOnScroll" scroll-action="cancel" no-overlap
+ vertical-align="bottom" horizontal-align="left" tabindex=-1>
+ <h2>Cancels on scroll</h2>
+ <button onclick="cancelOnScroll.close()">Close this</button>
+ </simple-overlay>
+ </span>
+ </template>
+ </demo-snippet>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/demo/simple-overlay.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/demo/simple-overlay.html
new file mode 100644
index 00000000000..b1449f8cdeb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/demo/simple-overlay.html
@@ -0,0 +1,40 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../iron-overlay-behavior.html">
+
+<dom-module id="simple-overlay">
+ <template>
+ <style>
+ :host {
+ background: white;
+ color: black;
+ padding: 24px;
+ box-shadow: rgba(0, 0, 0, 0.24) -2px 5px 12px 0px, rgba(0, 0, 0, 0.12) 0px 0px 12px 0px;
+ }
+ </style>
+ <slot></slot>
+ </template>
+
+</dom-module>
+
+<script>
+ (function() {
+
+ Polymer({
+
+ is: 'simple-overlay',
+
+ behaviors: [Polymer.IronOverlayBehavior]
+
+ });
+ })();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/index.html
new file mode 100644
index 00000000000..d69e30442ea
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/index.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+
+ <title>iron-overlay-behavior</title>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../polymer/polymer.html">
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-focusables-helper.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-focusables-helper.d.ts
new file mode 100644
index 00000000000..d1a1d411069
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-focusables-helper.d.ts
@@ -0,0 +1,12 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-focusables-helper.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-focusables-helper.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-focusables-helper.html
new file mode 100644
index 00000000000..ea4cd060e76
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-focusables-helper.html
@@ -0,0 +1,219 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../polymer/polymer.html">
+
+<script>
+ (function() {
+ 'use strict';
+
+ var p = Element.prototype;
+ var matches = p.matches || p.matchesSelector || p.mozMatchesSelector ||
+ p.msMatchesSelector || p.oMatchesSelector || p.webkitMatchesSelector;
+
+ Polymer.IronFocusablesHelper = {
+
+ /**
+ * Returns a sorted array of tabbable nodes, including the root node.
+ * It searches the tabbable nodes in the light and shadow dom of the chidren,
+ * sorting the result by tabindex.
+ * @param {!Node} node
+ * @return {!Array<!HTMLElement>}
+ */
+ getTabbableNodes: function(node) {
+ var result = [];
+ // If there is at least one element with tabindex > 0, we need to sort
+ // the final array by tabindex.
+ var needsSortByTabIndex = this._collectTabbableNodes(node, result);
+ if (needsSortByTabIndex) {
+ return this._sortByTabIndex(result);
+ }
+ return result;
+ },
+
+ /**
+ * Returns if a element is focusable.
+ * @param {!HTMLElement} element
+ * @return {boolean}
+ */
+ isFocusable: function(element) {
+ // From http://stackoverflow.com/a/1600194/4228703:
+ // There isn't a definite list, it's up to the browser. The only
+ // standard we have is DOM Level 2 HTML
+ // https://www.w3.org/TR/DOM-Level-2-HTML/html.html, according to which the
+ // only elements that have a focus() method are HTMLInputElement,
+ // HTMLSelectElement, HTMLTextAreaElement and HTMLAnchorElement. This
+ // notably omits HTMLButtonElement and HTMLAreaElement. Referring to these
+ // tests with tabbables in different browsers
+ // http://allyjs.io/data-tables/focusable.html
+
+ // Elements that cannot be focused if they have [disabled] attribute.
+ if (matches.call(element, 'input, select, textarea, button, object')) {
+ return matches.call(element, ':not([disabled])');
+ }
+ // Elements that can be focused even if they have [disabled] attribute.
+ return matches.call(
+ element, 'a[href], area[href], iframe, [tabindex], [contentEditable]');
+ },
+
+ /**
+ * Returns if a element is tabbable. To be tabbable, a element must be
+ * focusable, visible, and with a tabindex !== -1.
+ * @param {!HTMLElement} element
+ * @return {boolean}
+ */
+ isTabbable: function(element) {
+ return this.isFocusable(element) &&
+ matches.call(element, ':not([tabindex="-1"])') &&
+ this._isVisible(element);
+ },
+
+ /**
+ * Returns the normalized element tabindex. If not focusable, returns -1.
+ * It checks for the attribute "tabindex" instead of the element property
+ * `tabIndex` since browsers assign different values to it.
+ * e.g. in Firefox `<div contenteditable>` has `tabIndex = -1`
+ * @param {!HTMLElement} element
+ * @return {!number}
+ * @private
+ */
+ _normalizedTabIndex: function(element) {
+ if (this.isFocusable(element)) {
+ var tabIndex = element.getAttribute('tabindex') || 0;
+ return Number(tabIndex);
+ }
+ return -1;
+ },
+
+ /**
+ * Searches for nodes that are tabbable and adds them to the `result` array.
+ * Returns if the `result` array needs to be sorted by tabindex.
+ * @param {!Node} node The starting point for the search; added to `result`
+ * if tabbable.
+ * @param {!Array<!HTMLElement>} result
+ * @return {boolean}
+ * @private
+ */
+ _collectTabbableNodes: function(node, result) {
+ // If not an element or not visible, no need to explore children.
+ if (node.nodeType !== Node.ELEMENT_NODE || !this._isVisible(node)) {
+ return false;
+ }
+ var element = /** @type {!HTMLElement} */ (node);
+ var tabIndex = this._normalizedTabIndex(element);
+ var needsSort = tabIndex > 0;
+ if (tabIndex >= 0) {
+ result.push(element);
+ }
+
+ // In ShadowDOM v1, tab order is affected by the order of distrubution.
+ // E.g. getTabbableNodes(#root) in ShadowDOM v1 should return [#A, #B];
+ // in ShadowDOM v0 tab order is not affected by the distrubution order,
+ // in fact getTabbableNodes(#root) returns [#B, #A].
+ // <div id="root">
+ // <!-- shadow -->
+ // <slot name="a">
+ // <slot name="b">
+ // <!-- /shadow -->
+ // <input id="A" slot="a">
+ // <input id="B" slot="b" tabindex="1">
+ // </div>
+ // TODO(valdrin) support ShadowDOM v1 when upgrading to Polymer v2.0.
+ var children;
+ if (element.localName === 'content' || element.localName === 'slot') {
+ children = Polymer.dom(element).getDistributedNodes();
+ } else {
+ // Use shadow root if possible, will check for distributed nodes.
+ children = Polymer.dom(element.root || element).children;
+ }
+ for (var i = 0; i < children.length; i++) {
+ // Ensure method is always invoked to collect tabbable children.
+ needsSort = this._collectTabbableNodes(children[i], result) || needsSort;
+ }
+ return needsSort;
+ },
+
+ /**
+ * Returns false if the element has `visibility: hidden` or `display: none`
+ * @param {!HTMLElement} element
+ * @return {boolean}
+ * @private
+ */
+ _isVisible: function(element) {
+ // Check inline style first to save a re-flow. If looks good, check also
+ // computed style.
+ var style = element.style;
+ if (style.visibility !== 'hidden' && style.display !== 'none') {
+ style = window.getComputedStyle(element);
+ return (style.visibility !== 'hidden' && style.display !== 'none');
+ }
+ return false;
+ },
+
+ /**
+ * Sorts an array of tabbable elements by tabindex. Returns a new array.
+ * @param {!Array<!HTMLElement>} tabbables
+ * @return {!Array<!HTMLElement>}
+ * @private
+ */
+ _sortByTabIndex: function(tabbables) {
+ // Implement a merge sort as Array.prototype.sort does a non-stable sort
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
+ var len = tabbables.length;
+ if (len < 2) {
+ return tabbables;
+ }
+ var pivot = Math.ceil(len / 2);
+ var left = this._sortByTabIndex(tabbables.slice(0, pivot));
+ var right = this._sortByTabIndex(tabbables.slice(pivot));
+ return this._mergeSortByTabIndex(left, right);
+ },
+
+ /**
+ * Merge sort iterator, merges the two arrays into one, sorted by tab index.
+ * @param {!Array<!HTMLElement>} left
+ * @param {!Array<!HTMLElement>} right
+ * @return {!Array<!HTMLElement>}
+ * @private
+ */
+ _mergeSortByTabIndex: function(left, right) {
+ var result = [];
+ while ((left.length > 0) && (right.length > 0)) {
+ if (this._hasLowerTabOrder(left[0], right[0])) {
+ result.push(right.shift());
+ } else {
+ result.push(left.shift());
+ }
+ }
+
+ return result.concat(left, right);
+ },
+
+ /**
+ * Returns if element `a` has lower tab order compared to element `b`
+ * (both elements are assumed to be focusable and tabbable).
+ * Elements with tabindex = 0 have lower tab order compared to elements
+ * with tabindex > 0.
+ * If both have same tabindex, it returns false.
+ * @param {!HTMLElement} a
+ * @param {!HTMLElement} b
+ * @return {boolean}
+ * @private
+ */
+ _hasLowerTabOrder: function(a, b) {
+ // Normalize tabIndexes
+ // e.g. in Firefox `<div contenteditable>` has `tabIndex = -1`
+ var ati = Math.max(a.tabIndex, 0);
+ var bti = Math.max(b.tabIndex, 0);
+ return (ati === 0 || bti === 0) ? bti > ati : ati > bti;
+ }
+ };
+ })();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-backdrop.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-backdrop.d.ts
new file mode 100644
index 00000000000..4a3dc89511d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-backdrop.d.ts
@@ -0,0 +1,61 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-overlay-backdrop.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+
+/**
+ * `iron-overlay-backdrop` is a backdrop used by `Polymer.IronOverlayBehavior`. It should be a
+ * singleton.
+ *
+ * ### Styling
+ *
+ * The following custom properties and mixins are available for styling.
+ *
+ * Custom property | Description | Default
+ * -------------------------------------------|------------------------|---------
+ * `--iron-overlay-backdrop-background-color` | Backdrop background color | #000
+ * `--iron-overlay-backdrop-opacity` | Backdrop opacity | 0.6
+ * `--iron-overlay-backdrop` | Mixin applied to `iron-overlay-backdrop`. | {}
+ * `--iron-overlay-backdrop-opened` | Mixin applied to `iron-overlay-backdrop` when it is displayed | {}
+ */
+interface IronOverlayBackdropElement extends Polymer.Element {
+
+ /**
+ * Returns true if the backdrop is opened.
+ */
+ opened: boolean|null|undefined;
+ created(): void;
+ attached(): void;
+
+ /**
+ * Appends the backdrop to document body if needed.
+ */
+ prepare(): void;
+
+ /**
+ * Shows the backdrop.
+ */
+ open(): void;
+
+ /**
+ * Hides the backdrop.
+ */
+ close(): void;
+
+ /**
+ * Removes the backdrop from document body if needed.
+ */
+ complete(): void;
+ _onTransitionend(event: any): void;
+}
+
+interface HTMLElementTagNameMap {
+ "iron-overlay-backdrop": IronOverlayBackdropElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-backdrop.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-backdrop.html
new file mode 100644
index 00000000000..b3a7a9ff984
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-backdrop.html
@@ -0,0 +1,160 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<!--
+`iron-overlay-backdrop` is a backdrop used by `Polymer.IronOverlayBehavior`. It should be a
+singleton.
+
+### Styling
+
+The following custom properties and mixins are available for styling.
+
+Custom property | Description | Default
+-------------------------------------------|------------------------|---------
+`--iron-overlay-backdrop-background-color` | Backdrop background color | #000
+`--iron-overlay-backdrop-opacity` | Backdrop opacity | 0.6
+`--iron-overlay-backdrop` | Mixin applied to `iron-overlay-backdrop`. | {}
+`--iron-overlay-backdrop-opened` | Mixin applied to `iron-overlay-backdrop` when it is displayed | {}
+-->
+
+<dom-module id="iron-overlay-backdrop">
+
+ <template>
+ <style>
+ :host {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-color: var(--iron-overlay-backdrop-background-color, #000);
+ opacity: 0;
+ transition: opacity 0.2s;
+ pointer-events: none;
+ @apply --iron-overlay-backdrop;
+ }
+
+ :host(.opened) {
+ opacity: var(--iron-overlay-backdrop-opacity, 0.6);
+ pointer-events: auto;
+ @apply --iron-overlay-backdrop-opened;
+ }
+ </style>
+
+ <slot></slot>
+ </template>
+
+</dom-module>
+
+<script>
+ Polymer({
+
+ is: 'iron-overlay-backdrop',
+
+ properties: {
+
+ /**
+ * Returns true if the backdrop is opened.
+ */
+ opened: {
+ reflectToAttribute: true,
+ type: Boolean,
+ value: false,
+ observer: '_openedChanged'
+ }
+
+ },
+
+ listeners: {'transitionend': '_onTransitionend'},
+
+ created: function() {
+ // Used to cancel previous requestAnimationFrame calls when opened changes.
+ this.__openedRaf = null;
+ },
+
+ attached: function() {
+ this.opened && this._openedChanged(this.opened);
+ },
+
+ /**
+ * Appends the backdrop to document body if needed.
+ */
+ prepare: function() {
+ if (this.opened && !this.parentNode) {
+ Polymer.dom(document.body).appendChild(this);
+ }
+ },
+
+ /**
+ * Shows the backdrop.
+ */
+ open: function() {
+ this.opened = true;
+ },
+
+ /**
+ * Hides the backdrop.
+ */
+ close: function() {
+ this.opened = false;
+ },
+
+ /**
+ * Removes the backdrop from document body if needed.
+ */
+ complete: function() {
+ if (!this.opened && this.parentNode === document.body) {
+ Polymer.dom(this.parentNode).removeChild(this);
+ }
+ },
+
+ _onTransitionend: function(event) {
+ if (event && event.target === this) {
+ this.complete();
+ }
+ },
+
+ /**
+ * @param {boolean} opened
+ * @private
+ */
+ _openedChanged: function(opened) {
+ if (opened) {
+ // Auto-attach.
+ this.prepare();
+ } else {
+ // Animation might be disabled via the mixin or opacity custom property.
+ // If it is disabled in other ways, it's up to the user to call complete.
+ var cs = window.getComputedStyle(this);
+ if (cs.transitionDuration === '0s' || cs.opacity == 0) {
+ this.complete();
+ }
+ }
+
+ if (!this.isAttached) {
+ return;
+ }
+
+ // Always cancel previous requestAnimationFrame.
+ if (this.__openedRaf) {
+ window.cancelAnimationFrame(this.__openedRaf);
+ this.__openedRaf = null;
+ }
+ // Force relayout to ensure proper transitions.
+ this.scrollTop = this.scrollTop;
+ this.__openedRaf = window.requestAnimationFrame(function() {
+ this.__openedRaf = null;
+ this.toggleClass('opened', this.opened);
+ }.bind(this));
+ }
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-behavior.d.ts
new file mode 100644
index 00000000000..6cd0bc818c9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-behavior.d.ts
@@ -0,0 +1,276 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-overlay-behavior.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-fit-behavior/iron-fit-behavior.d.ts" />
+/// <reference path="../iron-resizable-behavior/iron-resizable-behavior.d.ts" />
+/// <reference path="iron-overlay-manager.d.ts" />
+/// <reference path="iron-scroll-manager.d.ts" />
+/// <reference path="iron-focusables-helper.d.ts" />
+
+declare namespace Polymer {
+
+ interface IronOverlayBehaviorImpl {
+
+ /**
+ * True if the overlay is currently displayed.
+ */
+ opened: boolean|null|undefined;
+
+ /**
+ * True if the overlay was canceled when it was last closed.
+ */
+ readonly canceled: boolean|null|undefined;
+
+ /**
+ * Set to true to display a backdrop behind the overlay. It traps the focus
+ * within the light DOM of the overlay.
+ */
+ withBackdrop: boolean|null|undefined;
+
+ /**
+ * Set to true to disable auto-focusing the overlay or child nodes with
+ * the `autofocus` attribute` when the overlay is opened.
+ */
+ noAutoFocus: boolean|null|undefined;
+
+ /**
+ * Set to true to disable canceling the overlay with the ESC key.
+ */
+ noCancelOnEscKey: boolean|null|undefined;
+
+ /**
+ * Set to true to disable canceling the overlay by clicking outside it.
+ */
+ noCancelOnOutsideClick: boolean|null|undefined;
+
+ /**
+ * Contains the reason(s) this overlay was last closed (see
+ * `iron-overlay-closed`). `IronOverlayBehavior` provides the `canceled`
+ * reason; implementers of the behavior can provide other reasons in
+ * addition to `canceled`.
+ */
+ closingReason: object|null|undefined;
+
+ /**
+ * Set to true to enable restoring of focus when overlay is closed.
+ */
+ restoreFocusOnClose: boolean|null|undefined;
+
+ /**
+ * Set to true to allow clicks to go through overlays.
+ * When the user clicks outside this overlay, the click may
+ * close the overlay below.
+ */
+ allowClickThrough: boolean|null|undefined;
+
+ /**
+ * Set to true to keep overlay always on top.
+ */
+ alwaysOnTop: boolean|null|undefined;
+
+ /**
+ * Determines which action to perform when scroll outside an opened overlay
+ * happens. Possible values: lock - blocks scrolling from happening, refit -
+ * computes the new position on the overlay cancel - causes the overlay to
+ * close
+ */
+ scrollAction: string|null|undefined;
+
+ /**
+ * The node being focused.
+ */
+ _focusedChild: Node|null;
+
+ /**
+ * The backdrop element.
+ */
+ readonly backdropElement: Element;
+
+ /**
+ * Returns the node to give focus to.
+ */
+ readonly _focusNode: Node;
+
+ /**
+ * Array of nodes that can receive focus (overlay included), ordered by
+ * `tabindex`. This is used to retrieve which is the first and last focusable
+ * nodes in order to wrap the focus for overlays `with-backdrop`.
+ *
+ * If you know what is your content (specifically the first and last focusable
+ * children), you can override this method to return only `[firstFocusable,
+ * lastFocusable];`
+ */
+ readonly _focusableNodes: Node[];
+ ready(): void;
+ attached(): void;
+ detached(): void;
+
+ /**
+ * Toggle the opened state of the overlay.
+ */
+ toggle(): void;
+
+ /**
+ * Open the overlay.
+ */
+ open(): void;
+
+ /**
+ * Close the overlay.
+ */
+ close(): void;
+
+ /**
+ * Cancels the overlay.
+ *
+ * @param event The original event
+ */
+ cancel(event?: Event|null): void;
+
+ /**
+ * Invalidates the cached tabbable nodes. To be called when any of the
+ * focusable content changes (e.g. a button is disabled).
+ */
+ invalidateTabbables(): void;
+ _ensureSetup(): void;
+
+ /**
+ * Called when `opened` changes.
+ */
+ _openedChanged(opened?: boolean): void;
+ _canceledChanged(): void;
+ _withBackdropChanged(): void;
+
+ /**
+ * tasks which must occur before opening; e.g. making the element visible.
+ */
+ _prepareRenderOpened(): void;
+
+ /**
+ * Tasks which cause the overlay to actually open; typically play an
+ * animation.
+ */
+ _renderOpened(): void;
+
+ /**
+ * Tasks which cause the overlay to actually close; typically play an
+ * animation.
+ */
+ _renderClosed(): void;
+
+ /**
+ * Tasks to be performed at the end of open action. Will fire
+ * `iron-overlay-opened`.
+ */
+ _finishRenderOpened(): void;
+
+ /**
+ * Tasks to be performed at the end of close action. Will fire
+ * `iron-overlay-closed`.
+ */
+ _finishRenderClosed(): void;
+ _preparePositioning(): void;
+ _finishPositioning(): void;
+
+ /**
+ * Applies focus according to the opened state.
+ */
+ _applyFocus(): void;
+
+ /**
+ * Cancels (closes) the overlay. Call when click happens outside the overlay.
+ */
+ _onCaptureClick(event: Event): void;
+
+ /**
+ * Keeps track of the focused child. If withBackdrop, traps focus within
+ * overlay.
+ */
+ _onCaptureFocus(event: Event): void;
+
+ /**
+ * Handles the ESC key event and cancels (closes) the overlay.
+ */
+ _onCaptureEsc(event: Event): void;
+
+ /**
+ * Handles TAB key events to track focus changes.
+ * Will wrap focus for overlays withBackdrop.
+ */
+ _onCaptureTab(event: Event): void;
+
+ /**
+ * Refits if the overlay is opened and not animating.
+ */
+ _onIronResize(): void;
+
+ /**
+ * Will call notifyResize if overlay is opened.
+ * Can be overridden in order to avoid multiple observers on the same node.
+ */
+ _onNodesChange(): void;
+ }
+
+ const IronOverlayBehaviorImpl: object;
+
+ /**
+ * Use `Polymer.IronOverlayBehavior` to implement an element that can be hidden or
+ * shown, and displays on top of other content. It includes an optional backdrop,
+ * and can be used to implement a variety of UI controls including dialogs and drop
+ * downs. Multiple overlays may be displayed at once.
+ *
+ * See the [demo source
+ * code](https://github.com/PolymerElements/iron-overlay-behavior/blob/master/demo/simple-overlay.html)
+ * for an example.
+ *
+ * ### Closing and canceling
+ *
+ * An overlay may be hidden by closing or canceling. The difference between close
+ * and cancel is user intent. Closing generally implies that the user acknowledged
+ * the content on the overlay. By default, it will cancel whenever the user taps
+ * outside it or presses the escape key. This behavior is configurable with the
+ * `no-cancel-on-esc-key` and the `no-cancel-on-outside-click` properties.
+ * `close()` should be called explicitly by the implementer when the user interacts
+ * with a control in the overlay element. When the dialog is canceled, the overlay
+ * fires an 'iron-overlay-canceled' event. Call `preventDefault` on this event to
+ * prevent the overlay from closing.
+ *
+ * ### Positioning
+ *
+ * By default the element is sized and positioned to fit and centered inside the
+ * window. You can position and size it manually using CSS. See
+ * `Polymer.IronFitBehavior`.
+ *
+ * ### Backdrop
+ *
+ * Set the `with-backdrop` attribute to display a backdrop behind the overlay. The
+ * backdrop is appended to `<body>` and is of type `<iron-overlay-backdrop>`. See
+ * its doc page for styling options.
+ *
+ * In addition, `with-backdrop` will wrap the focus within the content in the light
+ * DOM. Override the [`_focusableNodes`
+ * getter](#Polymer.IronOverlayBehavior:property-_focusableNodes) to achieve a
+ * different behavior.
+ *
+ * ### Limitations
+ *
+ * The element is styled to appear on top of other content by setting its `z-index`
+ * property. You must ensure no element has a stacking context with a higher
+ * `z-index` than its parent stacking context. You should place this element as a
+ * child of `<body>` whenever possible.
+ *
+ *
+ */
+ interface IronOverlayBehavior extends Polymer.IronFitBehavior, Polymer.IronResizableBehavior, Polymer.IronOverlayBehaviorImpl {
+ }
+
+ const IronOverlayBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-behavior.html
new file mode 100644
index 00000000000..8dacd2b1a6f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-behavior.html
@@ -0,0 +1,806 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-fit-behavior/iron-fit-behavior.html">
+<link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html">
+<link rel="import" href="iron-overlay-manager.html">
+<link rel="import" href="iron-scroll-manager.html">
+<link rel="import" href="iron-focusables-helper.html">
+
+<script>
+ (function() {
+ 'use strict';
+
+ /** @polymerBehavior */
+ Polymer.IronOverlayBehaviorImpl = {
+
+ properties: {
+
+ /**
+ * True if the overlay is currently displayed.
+ */
+ opened:
+ {observer: '_openedChanged', type: Boolean, value: false, notify: true},
+
+ /**
+ * True if the overlay was canceled when it was last closed.
+ */
+ canceled: {
+ observer: '_canceledChanged',
+ readOnly: true,
+ type: Boolean,
+ value: false
+ },
+
+ /**
+ * Set to true to display a backdrop behind the overlay. It traps the focus
+ * within the light DOM of the overlay.
+ */
+ withBackdrop: {observer: '_withBackdropChanged', type: Boolean},
+
+ /**
+ * Set to true to disable auto-focusing the overlay or child nodes with
+ * the `autofocus` attribute` when the overlay is opened.
+ */
+ noAutoFocus: {type: Boolean, value: false},
+
+ /**
+ * Set to true to disable canceling the overlay with the ESC key.
+ */
+ noCancelOnEscKey: {type: Boolean, value: false},
+
+ /**
+ * Set to true to disable canceling the overlay by clicking outside it.
+ */
+ noCancelOnOutsideClick: {type: Boolean, value: false},
+
+ /**
+ * Contains the reason(s) this overlay was last closed (see
+ * `iron-overlay-closed`). `IronOverlayBehavior` provides the `canceled`
+ * reason; implementers of the behavior can provide other reasons in
+ * addition to `canceled`.
+ */
+ closingReason: {
+ // was a getter before, but needs to be a property so other
+ // behaviors can override this.
+ type: Object
+ },
+
+ /**
+ * Set to true to enable restoring of focus when overlay is closed.
+ */
+ restoreFocusOnClose: {type: Boolean, value: false},
+
+ /**
+ * Set to true to allow clicks to go through overlays.
+ * When the user clicks outside this overlay, the click may
+ * close the overlay below.
+ */
+ allowClickThrough: {type: Boolean},
+
+ /**
+ * Set to true to keep overlay always on top.
+ */
+ alwaysOnTop: {type: Boolean},
+
+ /**
+ * Determines which action to perform when scroll outside an opened overlay
+ * happens. Possible values: lock - blocks scrolling from happening, refit -
+ * computes the new position on the overlay cancel - causes the overlay to
+ * close
+ */
+ scrollAction: {type: String},
+
+ /**
+ * Shortcut to access to the overlay manager.
+ * @private
+ * @type {!Polymer.IronOverlayManagerClass}
+ */
+ _manager: {type: Object, value: Polymer.IronOverlayManager},
+
+ /**
+ * The node being focused.
+ * @type {?Node}
+ */
+ _focusedChild: {type: Object}
+
+ },
+
+ listeners: {'iron-resize': '_onIronResize'},
+
+ observers: ['__updateScrollObservers(isAttached, opened, scrollAction)'],
+
+ /**
+ * The backdrop element.
+ * @return {!Element}
+ */
+ get backdropElement() {
+ return this._manager.backdropElement;
+ },
+
+ /**
+ * Returns the node to give focus to.
+ * @return {!Node}
+ */
+ get _focusNode() {
+ return this._focusedChild ||
+ Polymer.dom(this).querySelector('[autofocus]') || this;
+ },
+
+ /**
+ * Array of nodes that can receive focus (overlay included), ordered by
+ * `tabindex`. This is used to retrieve which is the first and last focusable
+ * nodes in order to wrap the focus for overlays `with-backdrop`.
+ *
+ * If you know what is your content (specifically the first and last focusable
+ * children), you can override this method to return only `[firstFocusable,
+ * lastFocusable];`
+ * @return {!Array<!Node>}
+ * @protected
+ */
+ get _focusableNodes() {
+ return Polymer.IronFocusablesHelper.getTabbableNodes(this);
+ },
+
+ /**
+ * @return {void}
+ */
+ ready: function() {
+ // Used to skip calls to notifyResize and refit while the overlay is
+ // animating.
+ this.__isAnimating = false;
+ // with-backdrop needs tabindex to be set in order to trap the focus.
+ // If it is not set, IronOverlayBehavior will set it, and remove it if
+ // with-backdrop = false.
+ this.__shouldRemoveTabIndex = false;
+ // Used for wrapping the focus on TAB / Shift+TAB.
+ this.__firstFocusableNode = this.__lastFocusableNode = null;
+ // Used by to keep track of the RAF callbacks.
+ this.__rafs = {};
+ // Focused node before overlay gets opened. Can be restored on close.
+ this.__restoreFocusNode = null;
+ // Scroll info to be restored.
+ this.__scrollTop = this.__scrollLeft = null;
+ this.__onCaptureScroll = this.__onCaptureScroll.bind(this);
+ // Root nodes hosting the overlay, used to listen for scroll events on them.
+ this.__rootNodes = null;
+ this._ensureSetup();
+ },
+
+ attached: function() {
+ // Call _openedChanged here so that position can be computed correctly.
+ if (this.opened) {
+ this._openedChanged(this.opened);
+ }
+ this._observer = Polymer.dom(this).observeNodes(this._onNodesChange);
+ },
+
+ detached: function() {
+ Polymer.dom(this).unobserveNodes(this._observer);
+ this._observer = null;
+ for (var cb in this.__rafs) {
+ if (this.__rafs[cb] !== null) {
+ cancelAnimationFrame(this.__rafs[cb]);
+ }
+ }
+ this.__rafs = {};
+ this._manager.removeOverlay(this);
+
+ // We got detached while animating, ensure we show/hide the overlay
+ // and fire iron-overlay-opened/closed event!
+ if (this.__isAnimating) {
+ if (this.opened) {
+ this._finishRenderOpened();
+ } else {
+ // Restore the focus if necessary.
+ this._applyFocus();
+ this._finishRenderClosed();
+ }
+ }
+ },
+
+ /**
+ * Toggle the opened state of the overlay.
+ */
+ toggle: function() {
+ this._setCanceled(false);
+ this.opened = !this.opened;
+ },
+
+ /**
+ * Open the overlay.
+ */
+ open: function() {
+ this._setCanceled(false);
+ this.opened = true;
+ },
+
+ /**
+ * Close the overlay.
+ */
+ close: function() {
+ this._setCanceled(false);
+ this.opened = false;
+ },
+
+ /**
+ * Cancels the overlay.
+ * @param {Event=} event The original event
+ */
+ cancel: function(event) {
+ var cancelEvent =
+ this.fire('iron-overlay-canceled', event, {cancelable: true});
+ if (cancelEvent.defaultPrevented) {
+ return;
+ }
+
+ this._setCanceled(true);
+ this.opened = false;
+ },
+
+ /**
+ * Invalidates the cached tabbable nodes. To be called when any of the
+ * focusable content changes (e.g. a button is disabled).
+ */
+ invalidateTabbables: function() {
+ this.__firstFocusableNode = this.__lastFocusableNode = null;
+ },
+
+ _ensureSetup: function() {
+ if (this._overlaySetup) {
+ return;
+ }
+ this._overlaySetup = true;
+ this.style.outline = 'none';
+ this.style.display = 'none';
+ },
+
+ /**
+ * Called when `opened` changes.
+ * @param {boolean=} opened
+ * @protected
+ */
+ _openedChanged: function(opened) {
+ if (opened) {
+ this.removeAttribute('aria-hidden');
+ } else {
+ this.setAttribute('aria-hidden', 'true');
+ }
+
+ // Defer any animation-related code on attached
+ // (_openedChanged gets called again on attached).
+ if (!this.isAttached) {
+ return;
+ }
+
+ this.__isAnimating = true;
+
+ // Deraf for non-blocking rendering.
+ this.__deraf('__openedChanged', this.__openedChanged);
+ },
+
+ _canceledChanged: function() {
+ this.closingReason = this.closingReason || {};
+ this.closingReason.canceled = this.canceled;
+ },
+
+ _withBackdropChanged: function() {
+ // If tabindex is already set, no need to override it.
+ if (this.withBackdrop && !this.hasAttribute('tabindex')) {
+ this.setAttribute('tabindex', '-1');
+ this.__shouldRemoveTabIndex = true;
+ } else if (this.__shouldRemoveTabIndex) {
+ this.removeAttribute('tabindex');
+ this.__shouldRemoveTabIndex = false;
+ }
+ if (this.opened && this.isAttached) {
+ this._manager.trackBackdrop();
+ }
+ },
+
+ /**
+ * tasks which must occur before opening; e.g. making the element visible.
+ * @protected
+ */
+ _prepareRenderOpened: function() {
+ // Store focused node.
+ this.__restoreFocusNode = this._manager.deepActiveElement;
+
+ // Needed to calculate the size of the overlay so that transitions on its
+ // size will have the correct starting points.
+ this._preparePositioning();
+ this.refit();
+ this._finishPositioning();
+
+ // Safari will apply the focus to the autofocus element when displayed
+ // for the first time, so we make sure to return the focus where it was.
+ if (this.noAutoFocus && document.activeElement === this._focusNode) {
+ this._focusNode.blur();
+ this.__restoreFocusNode.focus();
+ }
+ },
+
+ /**
+ * Tasks which cause the overlay to actually open; typically play an
+ * animation.
+ * @protected
+ */
+ _renderOpened: function() {
+ this._finishRenderOpened();
+ },
+
+ /**
+ * Tasks which cause the overlay to actually close; typically play an
+ * animation.
+ * @protected
+ */
+ _renderClosed: function() {
+ this._finishRenderClosed();
+ },
+
+ /**
+ * Tasks to be performed at the end of open action. Will fire
+ * `iron-overlay-opened`.
+ * @protected
+ */
+ _finishRenderOpened: function() {
+ this.notifyResize();
+ this.__isAnimating = false;
+
+ this.fire('iron-overlay-opened');
+ },
+
+ /**
+ * Tasks to be performed at the end of close action. Will fire
+ * `iron-overlay-closed`.
+ * @protected
+ */
+ _finishRenderClosed: function() {
+ // Hide the overlay.
+ this.style.display = 'none';
+ // Reset z-index only at the end of the animation.
+ this.style.zIndex = '';
+ this.notifyResize();
+ this.__isAnimating = false;
+ this.fire('iron-overlay-closed', this.closingReason);
+ },
+
+ _preparePositioning: function() {
+ this.style.transition = this.style.webkitTransition = 'none';
+ this.style.transform = this.style.webkitTransform = 'none';
+ this.style.display = '';
+ },
+
+ _finishPositioning: function() {
+ // First, make it invisible & reactivate animations.
+ this.style.display = 'none';
+ // Force reflow before re-enabling animations so that they don't start.
+ // Set scrollTop to itself so that Closure Compiler doesn't remove this.
+ this.scrollTop = this.scrollTop;
+ this.style.transition = this.style.webkitTransition = '';
+ this.style.transform = this.style.webkitTransform = '';
+ // Now that animations are enabled, make it visible again
+ this.style.display = '';
+ // Force reflow, so that following animations are properly started.
+ // Set scrollTop to itself so that Closure Compiler doesn't remove this.
+ this.scrollTop = this.scrollTop;
+ },
+
+ /**
+ * Applies focus according to the opened state.
+ * @protected
+ */
+ _applyFocus: function() {
+ if (this.opened) {
+ if (!this.noAutoFocus) {
+ this._focusNode.focus();
+ }
+ } else {
+ // Restore focus.
+ if (this.restoreFocusOnClose && this.__restoreFocusNode) {
+ // If the activeElement is `<body>` or inside the overlay,
+ // we are allowed to restore the focus. In all the other
+ // cases focus might have been moved elsewhere by another
+ // component or by an user interaction (e.g. click on a
+ // button outside the overlay).
+ var activeElement = this._manager.deepActiveElement;
+ if (activeElement === document.body ||
+ Polymer.dom(this).deepContains(activeElement)) {
+ this.__restoreFocusNode.focus();
+ }
+ }
+ this.__restoreFocusNode = null;
+ this._focusNode.blur();
+ this._focusedChild = null;
+ }
+ },
+
+ /**
+ * Cancels (closes) the overlay. Call when click happens outside the overlay.
+ * @param {!Event} event
+ * @protected
+ */
+ _onCaptureClick: function(event) {
+ if (!this.noCancelOnOutsideClick) {
+ this.cancel(event);
+ }
+ },
+
+ /**
+ * Keeps track of the focused child. If withBackdrop, traps focus within
+ * overlay.
+ * @param {!Event} event
+ * @protected
+ */
+ _onCaptureFocus: function(event) {
+ if (!this.withBackdrop) {
+ return;
+ }
+ var path = Polymer.dom(event).path;
+ if (path.indexOf(this) === -1) {
+ event.stopPropagation();
+ this._applyFocus();
+ } else {
+ this._focusedChild = path[0];
+ }
+ },
+
+ /**
+ * Handles the ESC key event and cancels (closes) the overlay.
+ * @param {!Event} event
+ * @protected
+ */
+ _onCaptureEsc: function(event) {
+ if (!this.noCancelOnEscKey) {
+ this.cancel(event);
+ }
+ },
+
+ /**
+ * Handles TAB key events to track focus changes.
+ * Will wrap focus for overlays withBackdrop.
+ * @param {!Event} event
+ * @protected
+ */
+ _onCaptureTab: function(event) {
+ if (!this.withBackdrop) {
+ return;
+ }
+ this.__ensureFirstLastFocusables();
+ // TAB wraps from last to first focusable.
+ // Shift + TAB wraps from first to last focusable.
+ var shift = event.shiftKey;
+ var nodeToCheck =
+ shift ? this.__firstFocusableNode : this.__lastFocusableNode;
+ var nodeToSet =
+ shift ? this.__lastFocusableNode : this.__firstFocusableNode;
+ var shouldWrap = false;
+ if (nodeToCheck === nodeToSet) {
+ // If nodeToCheck is the same as nodeToSet, it means we have an overlay
+ // with 0 or 1 focusables; in either case we still need to trap the
+ // focus within the overlay.
+ shouldWrap = true;
+ } else {
+ // In dom=shadow, the manager will receive focus changes on the main
+ // root but not the ones within other shadow roots, so we can't rely on
+ // _focusedChild, but we should check the deepest active element.
+ var focusedNode = this._manager.deepActiveElement;
+ // If the active element is not the nodeToCheck but the overlay itself,
+ // it means the focus is about to go outside the overlay, hence we
+ // should prevent that (e.g. user opens the overlay and hit Shift+TAB).
+ shouldWrap = (focusedNode === nodeToCheck || focusedNode === this);
+ }
+
+ if (shouldWrap) {
+ // When the overlay contains the last focusable element of the document
+ // and it's already focused, pressing TAB would move the focus outside
+ // the document (e.g. to the browser search bar). Similarly, when the
+ // overlay contains the first focusable element of the document and it's
+ // already focused, pressing Shift+TAB would move the focus outside the
+ // document (e.g. to the browser search bar).
+ // In both cases, we would not receive a focus event, but only a blur.
+ // In order to achieve focus wrapping, we prevent this TAB event and
+ // force the focus. This will also prevent the focus to temporarily move
+ // outside the overlay, which might cause scrolling.
+ event.preventDefault();
+ this._focusedChild = nodeToSet;
+ this._applyFocus();
+ }
+ },
+
+ /**
+ * Refits if the overlay is opened and not animating.
+ * @protected
+ */
+ _onIronResize: function() {
+ if (this.opened && !this.__isAnimating) {
+ this.__deraf('refit', this.refit);
+ }
+ },
+
+ /**
+ * Will call notifyResize if overlay is opened.
+ * Can be overridden in order to avoid multiple observers on the same node.
+ * @protected
+ */
+ _onNodesChange: function() {
+ if (this.opened && !this.__isAnimating) {
+ // It might have added focusable nodes, so invalidate cached values.
+ this.invalidateTabbables();
+ this.notifyResize();
+ }
+ },
+
+ /**
+ * Will set first and last focusable nodes if any of them is not set.
+ * @private
+ */
+ __ensureFirstLastFocusables: function() {
+ if (!this.__firstFocusableNode || !this.__lastFocusableNode) {
+ var focusableNodes = this._focusableNodes;
+ this.__firstFocusableNode = focusableNodes[0];
+ this.__lastFocusableNode = focusableNodes[focusableNodes.length - 1];
+ }
+ },
+
+ /**
+ * Tasks executed when opened changes: prepare for the opening, move the
+ * focus, update the manager, render opened/closed.
+ * @private
+ */
+ __openedChanged: function() {
+ if (this.opened) {
+ // Make overlay visible, then add it to the manager.
+ this._prepareRenderOpened();
+ this._manager.addOverlay(this);
+ // Move the focus to the child node with [autofocus].
+ this._applyFocus();
+
+ this._renderOpened();
+ } else {
+ // Remove overlay, then restore the focus before actually closing.
+ this._manager.removeOverlay(this);
+ this._applyFocus();
+
+ this._renderClosed();
+ }
+ },
+
+ /**
+ * Debounces the execution of a callback to the next animation frame.
+ * @param {!string} jobname
+ * @param {!Function} callback Always bound to `this`
+ * @private
+ */
+ __deraf: function(jobname, callback) {
+ var rafs = this.__rafs;
+ if (rafs[jobname] !== null) {
+ cancelAnimationFrame(rafs[jobname]);
+ }
+ rafs[jobname] = requestAnimationFrame(function nextAnimationFrame() {
+ rafs[jobname] = null;
+ callback.call(this);
+ }.bind(this));
+ },
+
+ /**
+ * @param {boolean} isAttached
+ * @param {boolean} opened
+ * @param {string=} scrollAction
+ * @private
+ */
+ __updateScrollObservers: function(isAttached, opened, scrollAction) {
+ if (!isAttached || !opened || !this.__isValidScrollAction(scrollAction)) {
+ Polymer.IronScrollManager.removeScrollLock(this);
+ this.__removeScrollListeners();
+ } else {
+ if (scrollAction === 'lock') {
+ this.__saveScrollPosition();
+ Polymer.IronScrollManager.pushScrollLock(this);
+ }
+ this.__addScrollListeners();
+ }
+ },
+
+ /**
+ * @private
+ */
+ __addScrollListeners: function() {
+ if (!this.__rootNodes) {
+ this.__rootNodes = [];
+ // Listen for scroll events in all shadowRoots hosting this overlay only
+ // when in native ShadowDOM.
+ if (Polymer.Settings.useShadow) {
+ var node = this;
+ while (node) {
+ if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE && node.host) {
+ this.__rootNodes.push(node);
+ }
+ node = node.host || node.assignedSlot || node.parentNode;
+ }
+ }
+ this.__rootNodes.push(document);
+ }
+ this.__rootNodes.forEach(function(el) {
+ el.addEventListener('scroll', this.__onCaptureScroll, {
+ capture: true,
+ passive: true,
+ });
+ }, this);
+ },
+
+ /**
+ * @private
+ */
+ __removeScrollListeners: function() {
+ if (this.__rootNodes) {
+ this.__rootNodes.forEach(function(el) {
+ el.removeEventListener('scroll', this.__onCaptureScroll, {
+ capture: true,
+ passive: true,
+ });
+ }, this);
+ }
+ if (!this.isAttached) {
+ this.__rootNodes = null;
+ }
+ },
+
+ /**
+ * @param {string=} scrollAction
+ * @return {boolean}
+ * @private
+ */
+ __isValidScrollAction: function(scrollAction) {
+ return scrollAction === 'lock' || scrollAction === 'refit' ||
+ scrollAction === 'cancel';
+ },
+
+ /**
+ * @private
+ */
+ __onCaptureScroll: function(event) {
+ if (this.__isAnimating) {
+ return;
+ }
+ // Check if scroll outside the overlay.
+ if (Polymer.dom(event).path.indexOf(this) >= 0) {
+ return;
+ }
+ switch (this.scrollAction) {
+ case 'lock':
+ // NOTE: scrolling might happen if a scroll event is not cancellable, or
+ // if user pressed keys that cause scrolling (they're not prevented in
+ // order not to break a11y features like navigate with arrow keys).
+ this.__restoreScrollPosition();
+ break;
+ case 'refit':
+ this.__deraf('refit', this.refit);
+ break;
+ case 'cancel':
+ this.cancel(event);
+ break;
+ }
+ },
+
+ /**
+ * Memoizes the scroll position of the outside scrolling element.
+ * @private
+ */
+ __saveScrollPosition: function() {
+ if (document.scrollingElement) {
+ this.__scrollTop = document.scrollingElement.scrollTop;
+ this.__scrollLeft = document.scrollingElement.scrollLeft;
+ } else {
+ // Since we don't know if is the body or html, get max.
+ this.__scrollTop =
+ Math.max(document.documentElement.scrollTop, document.body.scrollTop);
+ this.__scrollLeft = Math.max(
+ document.documentElement.scrollLeft, document.body.scrollLeft);
+ }
+ },
+
+ /**
+ * Resets the scroll position of the outside scrolling element.
+ * @private
+ */
+ __restoreScrollPosition: function() {
+ if (document.scrollingElement) {
+ document.scrollingElement.scrollTop = this.__scrollTop;
+ document.scrollingElement.scrollLeft = this.__scrollLeft;
+ } else {
+ // Since we don't know if is the body or html, set both.
+ document.documentElement.scrollTop = document.body.scrollTop =
+ this.__scrollTop;
+ document.documentElement.scrollLeft = document.body.scrollLeft =
+ this.__scrollLeft;
+ }
+ },
+
+ };
+
+ /**
+ Use `Polymer.IronOverlayBehavior` to implement an element that can be hidden or
+ shown, and displays on top of other content. It includes an optional backdrop,
+ and can be used to implement a variety of UI controls including dialogs and drop
+ downs. Multiple overlays may be displayed at once.
+
+ See the [demo source
+ code](https://github.com/PolymerElements/iron-overlay-behavior/blob/master/demo/simple-overlay.html)
+ for an example.
+
+ ### Closing and canceling
+
+ An overlay may be hidden by closing or canceling. The difference between close
+ and cancel is user intent. Closing generally implies that the user acknowledged
+ the content on the overlay. By default, it will cancel whenever the user taps
+ outside it or presses the escape key. This behavior is configurable with the
+ `no-cancel-on-esc-key` and the `no-cancel-on-outside-click` properties.
+ `close()` should be called explicitly by the implementer when the user interacts
+ with a control in the overlay element. When the dialog is canceled, the overlay
+ fires an 'iron-overlay-canceled' event. Call `preventDefault` on this event to
+ prevent the overlay from closing.
+
+ ### Positioning
+
+ By default the element is sized and positioned to fit and centered inside the
+ window. You can position and size it manually using CSS. See
+ `Polymer.IronFitBehavior`.
+
+ ### Backdrop
+
+ Set the `with-backdrop` attribute to display a backdrop behind the overlay. The
+ backdrop is appended to `<body>` and is of type `<iron-overlay-backdrop>`. See
+ its doc page for styling options.
+
+ In addition, `with-backdrop` will wrap the focus within the content in the light
+ DOM. Override the [`_focusableNodes`
+ getter](#Polymer.IronOverlayBehavior:property-_focusableNodes) to achieve a
+ different behavior.
+
+ ### Limitations
+
+ The element is styled to appear on top of other content by setting its `z-index`
+ property. You must ensure no element has a stacking context with a higher
+ `z-index` than its parent stacking context. You should place this element as a
+ child of `<body>` whenever possible.
+
+ @demo demo/index.html
+ @polymerBehavior
+ */
+ Polymer.IronOverlayBehavior = [
+ Polymer.IronFitBehavior,
+ Polymer.IronResizableBehavior,
+ Polymer.IronOverlayBehaviorImpl
+ ];
+
+ /**
+ * Fired after the overlay opens.
+ * @event iron-overlay-opened
+ */
+
+ /**
+ * Fired when the overlay is canceled, but before it is closed.
+ * @event iron-overlay-canceled
+ * @param {Event} event The closing of the overlay can be prevented
+ * by calling `event.preventDefault()`. The `event.detail` is the original event
+ * that originated the canceling (e.g. ESC keyboard event or click event outside
+ * the overlay).
+ */
+
+ /**
+ * Fired after the overlay closes.
+ * @event iron-overlay-closed
+ * @param {Event} event The `event.detail` is the `closingReason` property
+ * (contains `canceled`, whether the overlay was canceled).
+ */
+ })();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-manager.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-manager.d.ts
new file mode 100644
index 00000000000..1d140b203a3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-manager.d.ts
@@ -0,0 +1,14 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-overlay-manager.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.d.ts" />
+/// <reference path="iron-overlay-backdrop.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-manager.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-manager.html
new file mode 100644
index 00000000000..352aa9a5724
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-overlay-manager.html
@@ -0,0 +1,389 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
+<link rel="import" href="iron-overlay-backdrop.html">
+
+<script>
+ /**
+ * @struct
+ * @constructor
+ * @private
+ */
+ Polymer.IronOverlayManagerClass = function() {
+ /**
+ * Used to keep track of the opened overlays.
+ * @private {!Array<!Element>}
+ */
+ this._overlays = [];
+
+ /**
+ * iframes have a default z-index of 100,
+ * so this default should be at least that.
+ * @private {number}
+ */
+ this._minimumZ = 101;
+
+ /**
+ * Memoized backdrop element.
+ * @private {Element|null}
+ */
+ this._backdropElement = null;
+
+ // Enable document-wide tap recognizer.
+ // NOTE: Use useCapture=true to avoid accidentally prevention of the closing
+ // of an overlay via event.stopPropagation(). The only way to prevent
+ // closing of an overlay should be through its APIs.
+ // NOTE: enable tap on <html> to workaround Polymer/polymer#4459
+ // Pass no-op function because MSEdge 15 doesn't handle null as 2nd argument
+ // https://github.com/Microsoft/ChakraCore/issues/3863
+ Polymer.Gestures.add(document.documentElement, 'tap', function() {});
+ document.addEventListener('tap', this._onCaptureClick.bind(this), true);
+ document.addEventListener('focus', this._onCaptureFocus.bind(this), true);
+ document.addEventListener('keydown', this._onCaptureKeyDown.bind(this), true);
+ };
+
+ Polymer.IronOverlayManagerClass.prototype = {
+
+ constructor: Polymer.IronOverlayManagerClass,
+
+ /**
+ * The shared backdrop element.
+ * @return {!Element} backdropElement
+ */
+ get backdropElement() {
+ if (!this._backdropElement) {
+ this._backdropElement = document.createElement('iron-overlay-backdrop');
+ }
+ return this._backdropElement;
+ },
+
+ /**
+ * The deepest active element.
+ * @return {!Element} activeElement the active element
+ */
+ get deepActiveElement() {
+ var active = document.activeElement;
+ // document.activeElement can be null
+ // https://developer.mozilla.org/en-US/docs/Web/API/Document/activeElement
+ // In IE 11, it can also be an object when operating in iframes.
+ // In these cases, default it to document.body.
+ if (!active || active instanceof Element === false) {
+ active = document.body;
+ }
+ while (active.root && Polymer.dom(active.root).activeElement) {
+ active = Polymer.dom(active.root).activeElement;
+ }
+ return active;
+ },
+
+ /**
+ * Brings the overlay at the specified index to the front.
+ * @param {number} i
+ * @private
+ */
+ _bringOverlayAtIndexToFront: function(i) {
+ var overlay = this._overlays[i];
+ if (!overlay) {
+ return;
+ }
+ var lastI = this._overlays.length - 1;
+ var currentOverlay = this._overlays[lastI];
+ // Ensure always-on-top overlay stays on top.
+ if (currentOverlay &&
+ this._shouldBeBehindOverlay(overlay, currentOverlay)) {
+ lastI--;
+ }
+ // If already the top element, return.
+ if (i >= lastI) {
+ return;
+ }
+ // Update z-index to be on top.
+ var minimumZ = Math.max(this.currentOverlayZ(), this._minimumZ);
+ if (this._getZ(overlay) <= minimumZ) {
+ this._applyOverlayZ(overlay, minimumZ);
+ }
+
+ // Shift other overlays behind the new on top.
+ while (i < lastI) {
+ this._overlays[i] = this._overlays[i + 1];
+ i++;
+ }
+ this._overlays[lastI] = overlay;
+ },
+
+ /**
+ * Adds the overlay and updates its z-index if it's opened, or removes it if
+ * it's closed. Also updates the backdrop z-index.
+ * @param {!Element} overlay
+ */
+ addOrRemoveOverlay: function(overlay) {
+ if (overlay.opened) {
+ this.addOverlay(overlay);
+ } else {
+ this.removeOverlay(overlay);
+ }
+ },
+
+ /**
+ * Tracks overlays for z-index and focus management.
+ * Ensures the last added overlay with always-on-top remains on top.
+ * @param {!Element} overlay
+ */
+ addOverlay: function(overlay) {
+ var i = this._overlays.indexOf(overlay);
+ if (i >= 0) {
+ this._bringOverlayAtIndexToFront(i);
+ this.trackBackdrop();
+ return;
+ }
+ var insertionIndex = this._overlays.length;
+ var currentOverlay = this._overlays[insertionIndex - 1];
+ var minimumZ = Math.max(this._getZ(currentOverlay), this._minimumZ);
+ var newZ = this._getZ(overlay);
+
+ // Ensure always-on-top overlay stays on top.
+ if (currentOverlay &&
+ this._shouldBeBehindOverlay(overlay, currentOverlay)) {
+ // This bumps the z-index of +2.
+ this._applyOverlayZ(currentOverlay, minimumZ);
+ insertionIndex--;
+ // Update minimumZ to match previous overlay's z-index.
+ var previousOverlay = this._overlays[insertionIndex - 1];
+ minimumZ = Math.max(this._getZ(previousOverlay), this._minimumZ);
+ }
+
+ // Update z-index and insert overlay.
+ if (newZ <= minimumZ) {
+ this._applyOverlayZ(overlay, minimumZ);
+ }
+ this._overlays.splice(insertionIndex, 0, overlay);
+
+ this.trackBackdrop();
+ },
+
+ /**
+ * @param {!Element} overlay
+ */
+ removeOverlay: function(overlay) {
+ var i = this._overlays.indexOf(overlay);
+ if (i === -1) {
+ return;
+ }
+ this._overlays.splice(i, 1);
+
+ this.trackBackdrop();
+ },
+
+ /**
+ * Returns the current overlay.
+ * @return {!Element|undefined}
+ */
+ currentOverlay: function() {
+ var i = this._overlays.length - 1;
+ return this._overlays[i];
+ },
+
+ /**
+ * Returns the current overlay z-index.
+ * @return {number}
+ */
+ currentOverlayZ: function() {
+ return this._getZ(this.currentOverlay());
+ },
+
+ /**
+ * Ensures that the minimum z-index of new overlays is at least `minimumZ`.
+ * This does not effect the z-index of any existing overlays.
+ * @param {number} minimumZ
+ */
+ ensureMinimumZ: function(minimumZ) {
+ this._minimumZ = Math.max(this._minimumZ, minimumZ);
+ },
+
+ focusOverlay: function() {
+ var current = /** @type {?} */ (this.currentOverlay());
+ if (current) {
+ current._applyFocus();
+ }
+ },
+
+ /**
+ * Updates the backdrop z-index.
+ */
+ trackBackdrop: function() {
+ var overlay = this._overlayWithBackdrop();
+ // Avoid creating the backdrop if there is no overlay with backdrop.
+ if (!overlay && !this._backdropElement) {
+ return;
+ }
+ this.backdropElement.style.zIndex = this._getZ(overlay) - 1;
+ this.backdropElement.opened = !!overlay;
+ // Property observers are not fired until element is attached
+ // in Polymer 2.x, so we ensure element is attached if needed.
+ // https://github.com/Polymer/polymer/issues/4526
+ this.backdropElement.prepare();
+ },
+
+ /**
+ * @return {!Array<!Element>}
+ */
+ getBackdrops: function() {
+ var backdrops = [];
+ for (var i = 0; i < this._overlays.length; i++) {
+ if (this._overlays[i].withBackdrop) {
+ backdrops.push(this._overlays[i]);
+ }
+ }
+ return backdrops;
+ },
+
+ /**
+ * Returns the z-index for the backdrop.
+ * @return {number}
+ */
+ backdropZ: function() {
+ return this._getZ(this._overlayWithBackdrop()) - 1;
+ },
+
+ /**
+ * Returns the top opened overlay that has a backdrop.
+ * @return {!Element|undefined}
+ * @private
+ */
+ _overlayWithBackdrop: function() {
+ for (var i = this._overlays.length - 1; i >= 0; i--) {
+ if (this._overlays[i].withBackdrop) {
+ return this._overlays[i];
+ }
+ }
+ },
+
+ /**
+ * Calculates the minimum z-index for the overlay.
+ * @param {Element=} overlay
+ * @private
+ */
+ _getZ: function(overlay) {
+ var z = this._minimumZ;
+ if (overlay) {
+ var z1 = Number(
+ overlay.style.zIndex || window.getComputedStyle(overlay).zIndex);
+ // Check if is a number
+ // Number.isNaN not supported in IE 10+
+ if (z1 === z1) {
+ z = z1;
+ }
+ }
+ return z;
+ },
+
+ /**
+ * @param {!Element} element
+ * @param {number|string} z
+ * @private
+ */
+ _setZ: function(element, z) {
+ element.style.zIndex = z;
+ },
+
+ /**
+ * @param {!Element} overlay
+ * @param {number} aboveZ
+ * @private
+ */
+ _applyOverlayZ: function(overlay, aboveZ) {
+ this._setZ(overlay, aboveZ + 2);
+ },
+
+ /**
+ * Returns the deepest overlay in the path.
+ * @param {!Array<!Element>=} path
+ * @return {!Element|undefined}
+ * @suppress {missingProperties}
+ * @private
+ */
+ _overlayInPath: function(path) {
+ path = path || [];
+ for (var i = 0; i < path.length; i++) {
+ if (path[i]._manager === this) {
+ return path[i];
+ }
+ }
+ },
+
+ /**
+ * Ensures the click event is delegated to the right overlay.
+ * @param {!Event} event
+ * @private
+ */
+ _onCaptureClick: function(event) {
+ var i = this._overlays.length - 1;
+ if (i === -1)
+ return;
+ var path = /** @type {!Array<!EventTarget>} */ (Polymer.dom(event).path);
+ var overlay;
+ // Check if clicked outside of overlay.
+ while ((overlay = /** @type {?} */ (this._overlays[i])) &&
+ this._overlayInPath(path) !== overlay) {
+ overlay._onCaptureClick(event);
+ if (overlay.allowClickThrough) {
+ i--;
+ } else {
+ break;
+ }
+ }
+ },
+
+ /**
+ * Ensures the focus event is delegated to the right overlay.
+ * @param {!Event} event
+ * @private
+ */
+ _onCaptureFocus: function(event) {
+ var overlay = /** @type {?} */ (this.currentOverlay());
+ if (overlay) {
+ overlay._onCaptureFocus(event);
+ }
+ },
+
+ /**
+ * Ensures TAB and ESC keyboard events are delegated to the right overlay.
+ * @param {!Event} event
+ * @private
+ */
+ _onCaptureKeyDown: function(event) {
+ var overlay = /** @type {?} */ (this.currentOverlay());
+ if (overlay) {
+ if (Polymer.IronA11yKeysBehavior.keyboardEventMatchesKeys(event, 'esc')) {
+ overlay._onCaptureEsc(event);
+ } else if (Polymer.IronA11yKeysBehavior.keyboardEventMatchesKeys(
+ event, 'tab')) {
+ overlay._onCaptureTab(event);
+ }
+ }
+ },
+
+ /**
+ * Returns if the overlay1 should be behind overlay2.
+ * @param {!Element} overlay1
+ * @param {!Element} overlay2
+ * @return {boolean}
+ * @suppress {missingProperties}
+ * @private
+ */
+ _shouldBeBehindOverlay: function(overlay1, overlay2) {
+ return !overlay1.alwaysOnTop && overlay2.alwaysOnTop;
+ }
+ };
+
+ Polymer.IronOverlayManager = new Polymer.IronOverlayManagerClass();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-scroll-manager.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-scroll-manager.d.ts
new file mode 100644
index 00000000000..96bbf050caf
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-scroll-manager.d.ts
@@ -0,0 +1,49 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-scroll-manager.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * The IronScrollManager is intended to provide a central source
+ * of authority and control over which elements in a document are currently
+ * allowed to scroll.
+ */
+ namespace IronScrollManager {
+
+
+ /**
+ * Returns true if the provided element is "scroll locked", which is to
+ * say that it cannot be scrolled via pointer or keyboard interactions.
+ */
+ function elementIsScrollLocked(element: HTMLElement): any;
+
+
+ /**
+ * Push an element onto the current scroll lock stack. The most recently
+ * pushed element and its children will be considered scrollable. All
+ * other elements will not be scrollable.
+ *
+ * Scroll locking is implemented as a stack so that cases such as
+ * dropdowns within dropdowns are handled well.
+ */
+ function pushScrollLock(element: HTMLElement): void;
+
+
+ /**
+ * Remove an element from the scroll lock stack. The element being
+ * removed does not need to be the most recently pushed element. However,
+ * the scroll lock constraints only change when the most recently pushed
+ * element is removed.
+ */
+ function removeScrollLock(element: HTMLElement): void;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-scroll-manager.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-scroll-manager.html
new file mode 100644
index 00000000000..549b86933d4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/iron-scroll-manager.html
@@ -0,0 +1,391 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<script>
+ (function() {
+ 'use strict';
+ /**
+ * Used to calculate the scroll direction during touch events.
+ * @type {!Object}
+ */
+ var lastTouchPosition = {pageX: 0, pageY: 0};
+ /**
+ * Used to avoid computing event.path and filter scrollable nodes (better perf).
+ * @type {?EventTarget}
+ */
+ var lastRootTarget = null;
+ /**
+ * @type {!Array<!Node>}
+ */
+ var lastScrollableNodes = [];
+ /**
+ * @type {!Array<string>}
+ */
+ var scrollEvents = [
+ // Modern `wheel` event for mouse wheel scrolling:
+ 'wheel',
+ // Older, non-standard `mousewheel` event for some FF:
+ 'mousewheel',
+ // IE:
+ 'DOMMouseScroll',
+ // Touch enabled devices
+ 'touchstart',
+ 'touchmove'
+ ];
+
+ /**
+ * The IronScrollManager is intended to provide a central source
+ * of authority and control over which elements in a document are currently
+ * allowed to scroll.
+ *
+ * @namespace
+ * @memberof Polymer
+ */
+ Polymer.IronScrollManager = {
+
+ /**
+ * The current element that defines the DOM boundaries of the
+ * scroll lock. This is always the most recently locking element.
+ *
+ * @return {!Node|undefined}
+ */
+ get currentLockingElement() {
+ return this._lockingElements[this._lockingElements.length - 1];
+ },
+
+ /**
+ * Returns true if the provided element is "scroll locked", which is to
+ * say that it cannot be scrolled via pointer or keyboard interactions.
+ *
+ * @memberof Polymer.IronScrollManager
+ * @param {!HTMLElement} element An HTML element instance which may or may
+ * not be scroll locked.
+ */
+ elementIsScrollLocked: function(element) {
+ var currentLockingElement = this.currentLockingElement;
+
+ if (currentLockingElement === undefined)
+ return false;
+
+ var scrollLocked;
+
+ if (this._hasCachedLockedElement(element)) {
+ return true;
+ }
+
+ if (this._hasCachedUnlockedElement(element)) {
+ return false;
+ }
+
+ scrollLocked = !!currentLockingElement &&
+ currentLockingElement !== element &&
+ !this._composedTreeContains(currentLockingElement, element);
+
+ if (scrollLocked) {
+ this._lockedElementCache.push(element);
+ } else {
+ this._unlockedElementCache.push(element);
+ }
+
+ return scrollLocked;
+ },
+
+ /**
+ * Push an element onto the current scroll lock stack. The most recently
+ * pushed element and its children will be considered scrollable. All
+ * other elements will not be scrollable.
+ *
+ * Scroll locking is implemented as a stack so that cases such as
+ * dropdowns within dropdowns are handled well.
+ *
+ * @memberof Polymer.IronScrollManager
+ * @param {!HTMLElement} element The element that should lock scroll.
+ */
+ pushScrollLock: function(element) {
+ // Prevent pushing the same element twice
+ if (this._lockingElements.indexOf(element) >= 0) {
+ return;
+ }
+
+ if (this._lockingElements.length === 0) {
+ this._lockScrollInteractions();
+ }
+
+ this._lockingElements.push(element);
+
+ this._lockedElementCache = [];
+ this._unlockedElementCache = [];
+ },
+
+ /**
+ * Remove an element from the scroll lock stack. The element being
+ * removed does not need to be the most recently pushed element. However,
+ * the scroll lock constraints only change when the most recently pushed
+ * element is removed.
+ *
+ * @memberof Polymer.IronScrollManager
+ * @param {!HTMLElement} element The element to remove from the scroll
+ * lock stack.
+ */
+ removeScrollLock: function(element) {
+ var index = this._lockingElements.indexOf(element);
+
+ if (index === -1) {
+ return;
+ }
+
+ this._lockingElements.splice(index, 1);
+
+ this._lockedElementCache = [];
+ this._unlockedElementCache = [];
+
+ if (this._lockingElements.length === 0) {
+ this._unlockScrollInteractions();
+ }
+ },
+
+ _lockingElements: [],
+
+ _lockedElementCache: null,
+
+ _unlockedElementCache: null,
+
+ _hasCachedLockedElement: function(element) {
+ return this._lockedElementCache.indexOf(element) > -1;
+ },
+
+ _hasCachedUnlockedElement: function(element) {
+ return this._unlockedElementCache.indexOf(element) > -1;
+ },
+
+ _composedTreeContains: function(element, child) {
+ // NOTE(cdata): This method iterates over content elements and their
+ // corresponding distributed nodes to implement a contains-like method
+ // that pierces through the composed tree of the ShadowDOM. Results of
+ // this operation are cached (elsewhere) on a per-scroll-lock basis, to
+ // guard against potentially expensive lookups happening repeatedly as
+ // a user scrolls / touchmoves.
+ var contentElements;
+ var distributedNodes;
+ var contentIndex;
+ var nodeIndex;
+
+ if (element.contains(child)) {
+ return true;
+ }
+
+ contentElements = Polymer.dom(element).querySelectorAll('content,slot');
+
+ for (contentIndex = 0; contentIndex < contentElements.length;
+ ++contentIndex) {
+ distributedNodes =
+ Polymer.dom(contentElements[contentIndex]).getDistributedNodes();
+
+ for (nodeIndex = 0; nodeIndex < distributedNodes.length; ++nodeIndex) {
+ // Polymer 2.x returns slot.assignedNodes which can contain text nodes.
+ if (distributedNodes[nodeIndex].nodeType !== Node.ELEMENT_NODE)
+ continue;
+
+ if (this._composedTreeContains(distributedNodes[nodeIndex], child)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ },
+
+ _scrollInteractionHandler: function(event) {
+ // Avoid canceling an event with cancelable=false, e.g. scrolling is in
+ // progress and cannot be interrupted.
+ if (event.cancelable && this._shouldPreventScrolling(event)) {
+ event.preventDefault();
+ }
+ // If event has targetTouches (touch event), update last touch position.
+ if (event.targetTouches) {
+ var touch = event.targetTouches[0];
+ lastTouchPosition.pageX = touch.pageX;
+ lastTouchPosition.pageY = touch.pageY;
+ }
+ },
+
+ /**
+ * @private
+ */
+ _boundScrollHandler: undefined,
+
+ _lockScrollInteractions: function() {
+ this._boundScrollHandler =
+ this._boundScrollHandler || this._scrollInteractionHandler.bind(this);
+ for (var i = 0, l = scrollEvents.length; i < l; i++) {
+ // NOTE: browsers that don't support objects as third arg will
+ // interpret it as boolean, hence useCapture = true in this case.
+ document.addEventListener(
+ scrollEvents[i],
+ this._boundScrollHandler,
+ {capture: true, passive: false});
+ }
+ },
+
+ _unlockScrollInteractions: function() {
+ for (var i = 0, l = scrollEvents.length; i < l; i++) {
+ // NOTE: browsers that don't support objects as third arg will
+ // interpret it as boolean, hence useCapture = true in this case.
+ document.removeEventListener(
+ scrollEvents[i],
+ this._boundScrollHandler,
+ {capture: true, passive: false});
+ }
+ },
+
+ /**
+ * Returns true if the event causes scroll outside the current locking
+ * element, e.g. pointer/keyboard interactions, or scroll "leaking"
+ * outside the locking element when it is already at its scroll boundaries.
+ * @param {!Event} event
+ * @return {boolean}
+ * @private
+ */
+ _shouldPreventScrolling: function(event) {
+ // Update if root target changed. For touch events, ensure we don't
+ // update during touchmove.
+ var target = Polymer.dom(event).rootTarget;
+ if (event.type !== 'touchmove' && lastRootTarget !== target) {
+ lastRootTarget = target;
+ lastScrollableNodes = this._getScrollableNodes(Polymer.dom(event).path);
+ }
+
+ // Prevent event if no scrollable nodes.
+ if (!lastScrollableNodes.length) {
+ return true;
+ }
+ // Don't prevent touchstart event inside the locking element when it has
+ // scrollable nodes.
+ if (event.type === 'touchstart') {
+ return false;
+ }
+ // Get deltaX/Y.
+ var info = this._getScrollInfo(event);
+ // Prevent if there is no child that can scroll.
+ return !this._getScrollingNode(
+ lastScrollableNodes, info.deltaX, info.deltaY);
+ },
+
+ /**
+ * Returns an array of scrollable nodes up to the current locking element,
+ * which is included too if scrollable.
+ * @param {!Array<!Node>} nodes
+ * @return {!Array<!Node>} scrollables
+ * @private
+ */
+ _getScrollableNodes: function(nodes) {
+ var scrollables = [];
+ var lockingIndex = nodes.indexOf(this.currentLockingElement);
+ // Loop from root target to locking element (included).
+ for (var i = 0; i <= lockingIndex; i++) {
+ // Skip non-Element nodes.
+ if (nodes[i].nodeType !== Node.ELEMENT_NODE) {
+ continue;
+ }
+ var node = /** @type {!Element} */ (nodes[i]);
+ // Check inline style before checking computed style.
+ var style = node.style;
+ if (style.overflow !== 'scroll' && style.overflow !== 'auto') {
+ style = window.getComputedStyle(node);
+ }
+ if (style.overflow === 'scroll' || style.overflow === 'auto') {
+ scrollables.push(node);
+ }
+ }
+ return scrollables;
+ },
+
+ /**
+ * Returns the node that is scrolling. If there is no scrolling,
+ * returns undefined.
+ * @param {!Array<!Node>} nodes
+ * @param {number} deltaX Scroll delta on the x-axis
+ * @param {number} deltaY Scroll delta on the y-axis
+ * @return {!Node|undefined}
+ * @private
+ */
+ _getScrollingNode: function(nodes, deltaX, deltaY) {
+ // No scroll.
+ if (!deltaX && !deltaY) {
+ return;
+ }
+ // Check only one axis according to where there is more scroll.
+ // Prefer vertical to horizontal.
+ var verticalScroll = Math.abs(deltaY) >= Math.abs(deltaX);
+ for (var i = 0; i < nodes.length; i++) {
+ var node = nodes[i];
+ var canScroll = false;
+ if (verticalScroll) {
+ // delta < 0 is scroll up, delta > 0 is scroll down.
+ canScroll = deltaY < 0 ?
+ node.scrollTop > 0 :
+ node.scrollTop < node.scrollHeight - node.clientHeight;
+ } else {
+ // delta < 0 is scroll left, delta > 0 is scroll right.
+ canScroll = deltaX < 0 ?
+ node.scrollLeft > 0 :
+ node.scrollLeft < node.scrollWidth - node.clientWidth;
+ }
+ if (canScroll) {
+ return node;
+ }
+ }
+ },
+
+ /**
+ * Returns scroll `deltaX` and `deltaY`.
+ * @param {!Event} event The scroll event
+ * @return {{deltaX: number, deltaY: number}} Object containing the
+ * x-axis scroll delta (positive: scroll right, negative: scroll left,
+ * 0: no scroll), and the y-axis scroll delta (positive: scroll down,
+ * negative: scroll up, 0: no scroll).
+ * @private
+ */
+ _getScrollInfo: function(event) {
+ var info = {deltaX: event.deltaX, deltaY: event.deltaY};
+ // Already available.
+ if ('deltaX' in event) {
+ // do nothing, values are already good.
+ }
+ // Safari has scroll info in `wheelDeltaX/Y`.
+ else if ('wheelDeltaX' in event && 'wheelDeltaY' in event) {
+ info.deltaX = -event.wheelDeltaX;
+ info.deltaY = -event.wheelDeltaY;
+ }
+ // IE10 has only vertical scroll info in `wheelDelta`.
+ else if ('wheelDelta' in event) {
+ info.deltaX = 0;
+ info.deltaY = -event.wheelDelta;
+ }
+ // Firefox has scroll info in `detail` and `axis`.
+ else if ('axis' in event) {
+ info.deltaX = event.axis === 1 ? event.detail : 0;
+ info.deltaY = event.axis === 2 ? event.detail : 0;
+ }
+ // On mobile devices, calculate scroll direction.
+ else if (event.targetTouches) {
+ var touch = event.targetTouches[0];
+ // Touch moves from right to left => scrolling goes right.
+ info.deltaX = lastTouchPosition.pageX - touch.pageX;
+ // Touch moves from down to up => scrolling goes down.
+ info.deltaY = lastTouchPosition.pageY - touch.pageY;
+ }
+ return info;
+ }
+ };
+ })();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/package-lock.json
new file mode 100644
index 00000000000..a5360c6ac26
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/package-lock.json
@@ -0,0 +1,2162 @@
+{
+ "name": "@polymer/iron-overlay-behavior",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.0.tgz",
+ "integrity": "sha512-a5DFXI3TdZSVOMH4608LVaBLmcr+mwM2+B8OSBiB9WFNCtdqzUXwtB5We6vBzrThXlO4uRo7d2pEqjNXMAlEkA==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.0",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "4.1.0",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.0",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.12"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz",
+ "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.6.tgz",
+ "integrity": "sha512-CTUtLb6WqCCgp6P59QintjHWqzf4VL1uPA27bipLAPxFqrtK1gEYllePzTICGqQ8rYsCbpnsNypXjjDzGAAjEQ==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.8.tgz",
+ "integrity": "sha512-QqR0j08RCS1AQYPMRPHikEpcmK+2aEEbcSzWLwOqyJ4FhLmHUx/WjRrnn7tTQg/y4IKnMhzskh/o7qvGIZZ7iA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.0.0.tgz",
+ "integrity": "sha512-v+0wW9Wezwsyb0uF4aBVCjmSqit3Ru7PZFziGF0o2KwTvN2zWfTi3BRLq9EkJFdg3eBbyERXGTntVpBxH1J68Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.2",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
+ "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "4.0.0",
+ "array-back": "2.0.0",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz",
+ "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.5.7"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.8",
+ "winston": "2.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-QQL70IC85hI6q9uQeresEMcT1Qf8YR/zDe1qG8WWeeFAZk8z0lmzUpsfcAWz+bM4wpDdXrtd4HitIs4p0CHl/w==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.101",
+ "@types/parse5": "2.2.34",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "polymer-project-config": "3.8.1",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.1"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.8.1.tgz",
+ "integrity": "sha512-MLvnM9gexFWg7nynY24eHZG6NLXocmk718sVds/sx2CAJ6iihhC0JMhhOIa6jnad9KQrHyGl/cs3mMRaaub5Fg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.101",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.1.tgz",
+ "integrity": "sha1-Eahr7+rDxKo+wIYjZRo8gabQu8g=",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/package.json
new file mode 100644
index 00000000000..7a09c380626
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-overlay-behavior/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@polymer/iron-overlay-behavior",
+ "private": true,
+ "description": "Provides a behavior for making an element an overlay",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-overlay-behavior.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/.bower.json
new file mode 100644
index 00000000000..bc8fbd07b04
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/.bower.json
@@ -0,0 +1,55 @@
+{
+ "name": "iron-range-behavior",
+ "version": "2.1.1",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "Provides a behavior for something with a minimum and maximum value",
+ "authors": "The Polymer Authors",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "behavior"
+ ],
+ "main": "iron-range-behavior.html",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-range-behavior.git"
+ },
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "homepage": "https://github.com/PolymerElements/iron-range-behavior",
+ "_release": "2.1.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.1",
+ "commit": "dcc636b9fd86c8eeeb1cbd4cade2f6d34ebcb168"
+ },
+ "_source": "https://github.com/PolymerElements/iron-range-behavior.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/iron-range-behavior"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/.github/CODEOWNERS
new file mode 100644
index 00000000000..0d8c0ad6b48
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @bicknellr
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..0273927308e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-range-behavior/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/.travis.yml
new file mode 100644
index 00000000000..6aa2f911f57
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/.travis.yml
@@ -0,0 +1,32 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e '\n\033[31mERROR:\033[0m
+ Project is not formatted. Please run "npm run format".' && false)
+env:
+ global:
+ - secure: >-
+ ioGoTHzroJHO2O9B8y/xB7dsnWY+dArvRF+Dem/0Z8yTJZ/QFCeqFctQXNdj7HIm/y7ZxetVFBnxr+0HbF62qdmVkvfBzD/TaQPeXOHSyrSbR2aAQLeSwRbcUyOmmtk/q0frf1o81i3inoLjrGKieCZq7U8VF/6YyfRDhouU5/Q=
+ - secure: >-
+ LxoITNXWo1Vh2dOlg0I/KI/wuEaiMpNPRcg8MN6TOwy6UIKPwlpA69YZ4eLNDnuCjndQHL7Cl/TA5njubss4UeXG+L3oQMGNBEcRSHGZGxEyTZpofJp5FFK3Ja9CpaBMB7IsWAwuGPJZXM/6aoyAVipJ1et2Gbbasd5EbQYjRwc=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/README.md
new file mode 100644
index 00000000000..c87d0e36d73
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/README.md
@@ -0,0 +1,8 @@
+[![Build status](https://travis-ci.org/PolymerElements/iron-range-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-range-behavior)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/iron-range-behavior)_
+
+
+## Polymer.IronRangeBehavior
+
+`iron-range-behavior` provides the behavior for something with a minimum to maximum range.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/bower.json
new file mode 100644
index 00000000000..c0979afa40b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/bower.json
@@ -0,0 +1,45 @@
+{
+ "name": "iron-range-behavior",
+ "version": "2.1.1",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "Provides a behavior for something with a minimum and maximum value",
+ "authors": "The Polymer Authors",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "behavior"
+ ],
+ "main": "iron-range-behavior.html",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-range-behavior.git"
+ },
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/demo/index.html
new file mode 100644
index 00000000000..6e8548c8424
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/demo/index.html
@@ -0,0 +1,78 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<!doctype html>
+<html>
+ <head>
+ <title>iron-range-behavior demo</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../iron-range-behavior.html">
+
+ <style>
+
+ body {
+ font-family: sans-serif;
+ }
+
+ </style>
+ </head>
+
+ <body unresolved>
+
+ <dom-module id="x-progressbar">
+ <template>
+ <style>
+ :host {
+ display: block;
+ height: 40px;
+ background-color: #555;
+ border-radius: 4px;
+ padding: 8px;
+ box-shadow: inset 0px 2px 5px rgba(0, 0, 0, 0.5);
+ }
+
+ .progress {
+ background-color: #999;
+ height: 100%;
+ border-radius: 4px;
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.5);
+ }
+
+ .progress-value {
+ padding: 0 8px;
+ font-size: 18px;
+ color: #fff;
+ }
+ </style>
+
+ <div class="progress" horizontal center layout style$="{{_computeStyle(ratio)}}">
+ <div class="progress-value"><span>{{ratio}}</span>%</div>
+ </div>
+ </template>
+ <script>
+ window.addEventListener('WebComponentsReady', function() {
+ Polymer({
+ is: 'x-progressbar',
+
+ behaviors: [Polymer.IronRangeBehavior],
+
+ _computeStyle: function(ratio) {
+ return 'width: ' + ratio + '%;';
+ }
+ });
+ });
+ </script>
+ </dom-module>
+
+ <x-progressbar min="0" max="200" value="120"></x-progressbar>
+
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/index.html
new file mode 100644
index 00000000000..cc77788735d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/index.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/iron-range-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/iron-range-behavior.d.ts
new file mode 100644
index 00000000000..d8ed16ce7cf
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/iron-range-behavior.d.ts
@@ -0,0 +1,53 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-range-behavior.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * `iron-range-behavior` provides the behavior for something with a minimum to
+ * maximum range.
+ */
+ interface IronRangeBehavior {
+
+ /**
+ * The number that represents the current value.
+ */
+ value: number|null|undefined;
+
+ /**
+ * The number that indicates the minimum value of the range.
+ */
+ min: number|null|undefined;
+
+ /**
+ * The number that indicates the maximum value of the range.
+ */
+ max: number|null|undefined;
+
+ /**
+ * Specifies the value granularity of the range's value.
+ */
+ step: number|null|undefined;
+
+ /**
+ * Returns the ratio of the value.
+ */
+ readonly ratio: number|null|undefined;
+ _calcRatio(value: any): any;
+ _clampValue(value: any): any;
+ _calcStep(value: any): any;
+ _validateValue(): any;
+ _update(): void;
+ }
+
+ const IronRangeBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/iron-range-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/iron-range-behavior.html
new file mode 100644
index 00000000000..92f4e559067
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/iron-range-behavior.html
@@ -0,0 +1,97 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<script>
+ /**
+ * `iron-range-behavior` provides the behavior for something with a minimum to
+ * maximum range.
+ *
+ * @demo demo/index.html
+ * @polymerBehavior
+ */
+ Polymer.IronRangeBehavior = {
+
+ properties: {
+
+ /**
+ * The number that represents the current value.
+ */
+ value: {type: Number, value: 0, notify: true, reflectToAttribute: true},
+
+ /**
+ * The number that indicates the minimum value of the range.
+ */
+ min: {type: Number, value: 0, notify: true},
+
+ /**
+ * The number that indicates the maximum value of the range.
+ */
+ max: {type: Number, value: 100, notify: true},
+
+ /**
+ * Specifies the value granularity of the range's value.
+ */
+ step: {type: Number, value: 1, notify: true},
+
+ /**
+ * Returns the ratio of the value.
+ */
+ ratio: {type: Number, value: 0, readOnly: true, notify: true},
+ },
+
+ observers: ['_update(value, min, max, step)'],
+
+ _calcRatio: function(value) {
+ return (this._clampValue(value) - this.min) / (this.max - this.min);
+ },
+
+ _clampValue: function(value) {
+ return Math.min(this.max, Math.max(this.min, this._calcStep(value)));
+ },
+
+ _calcStep: function(value) {
+ // polymer/issues/2493
+ value = parseFloat(value);
+
+ if (!this.step) {
+ return value;
+ }
+
+ var numSteps = Math.round((value - this.min) / this.step);
+ if (this.step < 1) {
+ /**
+ * For small values of this.step, if we calculate the step using
+ * `Math.round(value / step) * step` we may hit a precision point issue
+ * eg. 0.1 * 0.2 = 0.020000000000000004
+ * http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
+ *
+ * as a work around we can divide by the reciprocal of `step`
+ */
+ return numSteps / (1 / this.step) + this.min;
+ } else {
+ return numSteps * this.step + this.min;
+ }
+ },
+
+ _validateValue: function() {
+ var v = this._clampValue(this.value);
+ this.value = this.oldValue = isNaN(v) ? this.oldValue : v;
+ return this.value !== v;
+ },
+
+ _update: function() {
+ this._validateValue();
+ this._setRatio(this._calcRatio(this.value) * 100);
+ }
+
+ };
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/package-lock.json
new file mode 100644
index 00000000000..836f3e43d9d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/package-lock.json
@@ -0,0 +1,2388 @@
+{
+ "name": "@polymer/iron-range-behavior",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "8.10.7",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.7.tgz",
+ "integrity": "sha512-5QC0YAHH7aXzrrbgQ+faSeBKbJwTaUyYuaywYzDTr1Myz5C0knx5FHOV5QyhBeE1x8n2xfkBUGE/C0X1paLp+Q==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.7"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.44",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+ "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz",
+ "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.2",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.105",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.44",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.2",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/package.json
new file mode 100644
index 00000000000..7afb52a5591
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-range-behavior/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@polymer/iron-range-behavior",
+ "private": true,
+ "description": "Provides a behavior for something with a minimum and maximum value",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-range-behavior.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/.bower.json
new file mode 100644
index 00000000000..0b2a011b8c1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/.bower.json
@@ -0,0 +1,58 @@
+{
+ "name": "iron-resizable-behavior",
+ "version": "2.1.0",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "Coordinates the flow of resizeable elements",
+ "private": true,
+ "main": "iron-resizable-behavior.html",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "iron",
+ "behavior"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-resizable-behavior.git"
+ },
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "homepage": "https://github.com/PolymerElements/iron-resizable-behavior",
+ "_release": "2.1.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.0",
+ "commit": "806e0807bd4253f446f8be624acf853069e36919"
+ },
+ "_source": "https://github.com/PolymerElements/iron-resizable-behavior.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/iron-resizable-behavior"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/.github/CODEOWNERS
new file mode 100644
index 00000000000..c5097c0c903
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @valdrinkoshi
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..b890b594341
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-resizable-behavior/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/.travis.yml
new file mode 100644
index 00000000000..c7d472cdb6b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/.travis.yml
@@ -0,0 +1,29 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+env:
+ global:
+ - secure: >-
+ Bsp8pa19FCij3Eee0P5eOE8ZrbylrYL99R9EIxH6rcDH+rxMhK0BIfSiXTPSFRk2iqJp++RIZN8kUu5GddetiXreRZDtnhXBA2QoYteIAS8Hzy9u2EggqI0UdGqbCiFHDVD/rEQyhSPiIfWHGCg/Moeo9J2k/eC2w6I8I9C15Zw=
+ - secure: >-
+ j9xIW/banUkkNaLrWVGcTsasAp64zEmZJQO+eY8ExINx3uLbDh5h6Foc7xWhJ4Yu7aey3+nH5BWKYimtPTYoXUD2nIWU31yBNbqU/+G6vIppDbgPHMRcVnRiO7YZ0yW1JunvKs+1lOPhOw4ibztJjGkQ2ZK9q6ZSJvQKRbo6Au0=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/README.md
new file mode 100644
index 00000000000..7ff2e12a602
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/README.md
@@ -0,0 +1,22 @@
+[![Build status](https://travis-ci.org/PolymerElements/iron-resizable-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-resizable-behavior)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/iron-resizable-behavior)_
+
+
+## Polymer.IronResizableBehavior
+
+`IronResizableBehavior` is a behavior that can be used in Polymer elements to
+coordinate the flow of resize events between "resizers" (elements that control the
+size or hidden state of their children) and "resizables" (elements that need to be
+notified when they are resized or un-hidden by their parents in order to take
+action on their new measurements).
+
+Elements that perform measurement should add the `IronResizableBehavior` behavior to
+their element definition and listen for the `iron-resize` event on themselves.
+This event will be fired when they become showing after having been hidden,
+when they are resized explicitly by another resizable, or when the window has been
+resized.
+
+Note, the `iron-resize` event is non-bubbling.
+
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/bower.json
new file mode 100644
index 00000000000..845aeb98716
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/bower.json
@@ -0,0 +1,48 @@
+{
+ "name": "iron-resizable-behavior",
+ "version": "2.0.1",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "Coordinates the flow of resizeable elements",
+ "private": true,
+ "main": "iron-resizable-behavior.html",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "iron",
+ "behavior"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-resizable-behavior.git"
+ },
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/demo/index.html
new file mode 100644
index 00000000000..2896c50d256
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/demo/index.html
@@ -0,0 +1,29 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<html>
+<head>
+
+ <title>iron-resizable-behavior demo</title>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="src/x-app.html">
+
+</head>
+<body>
+
+ <x-app></x-app>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/demo/src/x-app.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/demo/src/x-app.html
new file mode 100644
index 00000000000..c4bfa67ff16
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/demo/src/x-app.html
@@ -0,0 +1,105 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../iron-resizable-behavior.html">
+
+<dom-module id="x-puck">
+ <template>
+ <style>
+ :host {
+ display: inline-block;
+ border: 3px solid lightblue;
+ }
+ </style>
+
+ <b>I'm a resize-aware, thirdifying puck at (<span>{{x}}</span> x <span>{{y}}</span>).</b>
+
+ </template>
+
+</dom-module>
+
+<script>
+
+ Polymer({
+
+ is: 'x-puck',
+
+ behaviors: [
+ Polymer.IronResizableBehavior
+ ],
+
+ properties: {
+ x: {
+ type: Number,
+ value: 0
+ },
+
+ y: {
+ type: Number,
+ value: 0
+ }
+ },
+
+ listeners: {
+ 'iron-resize': '_onIronResize'
+ },
+
+ attached: function() {
+ this.async(this.notifyResize, 1);
+ },
+
+ get parent() {
+ if (this.parentNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
+ return this.parentNode.host;
+ }
+
+ return this.parentNode;
+ },
+
+ _onIronResize: function() {
+ var x = this.x = Math.floor(this.parent.offsetWidth / 3);
+ var y = this.y = Math.floor(this.parent.offsetHeight / 3);
+
+ this.translate3d(x + 'px', y + 'px', 0);
+ }
+ });
+
+</script>
+
+<dom-module id="x-app">
+ <template>
+ <style>
+ :host {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ }
+ </style>
+ <x-puck></x-puck>
+
+ </template>
+
+</dom-module>
+
+<script>
+
+ Polymer({
+
+ is: 'x-app',
+
+ behaviors: [
+ Polymer.IronResizableBehavior
+ ]
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/index.html
new file mode 100644
index 00000000000..b9b8809560f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/index.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<html>
+<head>
+
+ <title>iron-resizable-behavior</title>
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/iron-resizable-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/iron-resizable-behavior.d.ts
new file mode 100644
index 00000000000..3c2128fb054
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/iron-resizable-behavior.d.ts
@@ -0,0 +1,83 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-resizable-behavior.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * `IronResizableBehavior` is a behavior that can be used in Polymer elements to
+ * coordinate the flow of resize events between "resizers" (elements that control the
+ * size or hidden state of their children) and "resizables" (elements that need to be
+ * notified when they are resized or un-hidden by their parents in order to take
+ * action on their new measurements).
+ *
+ * Elements that perform measurement should add the `IronResizableBehavior` behavior to
+ * their element definition and listen for the `iron-resize` event on themselves.
+ * This event will be fired when they become showing after having been hidden,
+ * when they are resized explicitly by another resizable, or when the window has been
+ * resized.
+ *
+ * Note, the `iron-resize` event is non-bubbling.
+ */
+ interface IronResizableBehavior {
+
+ /**
+ * The closest ancestor element that implements `IronResizableBehavior`.
+ */
+ _parentResizable: object|null|undefined;
+
+ /**
+ * True if this element is currently notifying its descendant elements of
+ * resize.
+ */
+ _notifyingDescendant: boolean|null|undefined;
+ created(): void;
+ attached(): void;
+ detached(): void;
+
+ /**
+ * Can be called to manually notify a resizable and its descendant
+ * resizables of a resize change.
+ */
+ notifyResize(): void;
+
+ /**
+ * Used to assign the closest resizable ancestor to this resizable
+ * if the ancestor detects a request for notifications.
+ */
+ assignParentResizable(parentResizable: any): void;
+
+ /**
+ * Used to remove a resizable descendant from the list of descendants
+ * that should be notified of a resize change.
+ */
+ stopResizeNotificationsFor(target: any): void;
+
+ /**
+ * This method can be overridden to filter nested elements that should or
+ * should not be notified by the current element. Return true if an element
+ * should be notified, or false if it should not be notified.
+ *
+ * @param element A candidate descendant element that
+ * implements `IronResizableBehavior`.
+ * @returns True if the `element` should be notified of resize.
+ */
+ resizerShouldNotify(element: HTMLElement|null): boolean;
+ _onDescendantIronResize(event: any): void;
+ _fireResize(): void;
+ _onIronRequestResizeNotifications(event: any): void;
+ _parentResizableChanged(parentResizable: any): void;
+ _notifyDescendant(descendant: any): void;
+ _requestResizeNotifications(): void;
+ }
+
+ const IronResizableBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/iron-resizable-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/iron-resizable-behavior.html
new file mode 100644
index 00000000000..d77dde9cb94
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/iron-resizable-behavior.html
@@ -0,0 +1,214 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<script>
+ /**
+ * `IronResizableBehavior` is a behavior that can be used in Polymer elements to
+ * coordinate the flow of resize events between "resizers" (elements that control the
+ * size or hidden state of their children) and "resizables" (elements that need to be
+ * notified when they are resized or un-hidden by their parents in order to take
+ * action on their new measurements).
+ *
+ * Elements that perform measurement should add the `IronResizableBehavior` behavior to
+ * their element definition and listen for the `iron-resize` event on themselves.
+ * This event will be fired when they become showing after having been hidden,
+ * when they are resized explicitly by another resizable, or when the window has been
+ * resized.
+ *
+ * Note, the `iron-resize` event is non-bubbling.
+ *
+ * @polymerBehavior Polymer.IronResizableBehavior
+ * @demo demo/index.html
+ **/
+ Polymer.IronResizableBehavior = {
+ properties: {
+ /**
+ * The closest ancestor element that implements `IronResizableBehavior`.
+ */
+ _parentResizable: {
+ type: Object,
+ observer: '_parentResizableChanged'
+ },
+
+ /**
+ * True if this element is currently notifying its descendant elements of
+ * resize.
+ */
+ _notifyingDescendant: {
+ type: Boolean,
+ value: false
+ }
+ },
+
+ listeners: {
+ 'iron-request-resize-notifications': '_onIronRequestResizeNotifications'
+ },
+
+ created: function() {
+ // We don't really need property effects on these, and also we want them
+ // to be created before the `_parentResizable` observer fires:
+ this._interestedResizables = [];
+ this._boundNotifyResize = this.notifyResize.bind(this);
+ },
+
+ attached: function() {
+ this._requestResizeNotifications();
+ },
+
+ detached: function() {
+ if (this._parentResizable) {
+ this._parentResizable.stopResizeNotificationsFor(this);
+ } else {
+ window.removeEventListener('resize', this._boundNotifyResize);
+ }
+
+ this._parentResizable = null;
+ },
+
+ /**
+ * Can be called to manually notify a resizable and its descendant
+ * resizables of a resize change.
+ */
+ notifyResize: function() {
+ if (!this.isAttached) {
+ return;
+ }
+
+ this._interestedResizables.forEach(function(resizable) {
+ if (this.resizerShouldNotify(resizable)) {
+ this._notifyDescendant(resizable);
+ }
+ }, this);
+
+ this._fireResize();
+ },
+
+ /**
+ * Used to assign the closest resizable ancestor to this resizable
+ * if the ancestor detects a request for notifications.
+ */
+ assignParentResizable: function(parentResizable) {
+ this._parentResizable = parentResizable;
+ },
+
+ /**
+ * Used to remove a resizable descendant from the list of descendants
+ * that should be notified of a resize change.
+ */
+ stopResizeNotificationsFor: function(target) {
+ var index = this._interestedResizables.indexOf(target);
+
+ if (index > -1) {
+ this._interestedResizables.splice(index, 1);
+ this.unlisten(target, 'iron-resize', '_onDescendantIronResize');
+ }
+ },
+
+ /**
+ * This method can be overridden to filter nested elements that should or
+ * should not be notified by the current element. Return true if an element
+ * should be notified, or false if it should not be notified.
+ *
+ * @param {HTMLElement} element A candidate descendant element that
+ * implements `IronResizableBehavior`.
+ * @return {boolean} True if the `element` should be notified of resize.
+ */
+ resizerShouldNotify: function(element) { return true; },
+
+ _onDescendantIronResize: function(event) {
+ if (this._notifyingDescendant) {
+ event.stopPropagation();
+ return;
+ }
+
+ // NOTE(cdata): In ShadowDOM, event retargeting makes echoing of the
+ // otherwise non-bubbling event "just work." We do it manually here for
+ // the case where Polymer is not using shadow roots for whatever reason:
+ if (!Polymer.Settings.useShadow) {
+ this._fireResize();
+ }
+ },
+
+ _fireResize: function() {
+ this.fire('iron-resize', null, {
+ node: this,
+ bubbles: false
+ });
+ },
+
+ _onIronRequestResizeNotifications: function(event) {
+ var target = /** @type {!EventTarget} */ (Polymer.dom(event).rootTarget);
+ if (target === this) {
+ return;
+ }
+
+ if (this._interestedResizables.indexOf(target) === -1) {
+ this._interestedResizables.push(target);
+ this.listen(target, 'iron-resize', '_onDescendantIronResize');
+ }
+
+ target.assignParentResizable(this);
+ this._notifyDescendant(target);
+
+ event.stopPropagation();
+ },
+
+ _parentResizableChanged: function(parentResizable) {
+ if (parentResizable) {
+ window.removeEventListener('resize', this._boundNotifyResize);
+ }
+ },
+
+ _notifyDescendant: function(descendant) {
+ // NOTE(cdata): In IE10, attached is fired on children first, so it's
+ // important not to notify them if the parent is not attached yet (or
+ // else they will get redundantly notified when the parent attaches).
+ if (!this.isAttached) {
+ return;
+ }
+
+ this._notifyingDescendant = true;
+ descendant.notifyResize();
+ this._notifyingDescendant = false;
+ },
+
+ _requestResizeNotifications: function() {
+ if (!this.isAttached)
+ return;
+
+ // NOTE(valdrin) In CustomElements v1 with native HTMLImports, the order
+ // of imports affects the order of `attached` callbacks (see webcomponents/custom-elements#15).
+ // This might cause a child to notify parents too early (as the parent
+ // still has to be upgraded), resulting in a parent not able to keep track
+ // of the `_interestedResizables`. To solve this, we wait for the document
+ // to be done loading before firing the event.
+ if (document.readyState === 'loading') {
+ var _requestResizeNotifications = this._requestResizeNotifications.bind(this);
+ document.addEventListener('readystatechange', function readystatechanged() {
+ document.removeEventListener('readystatechange', readystatechanged);
+ _requestResizeNotifications();
+ });
+ } else {
+ this.fire('iron-request-resize-notifications', null, {
+ node: this,
+ bubbles: true,
+ cancelable: true
+ });
+
+ if (!this._parentResizable) {
+ window.addEventListener('resize', this._boundNotifyResize);
+ this.notifyResize();
+ }
+ }
+ }
+ };
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/package-lock.json
new file mode 100644
index 00000000000..e74ef2256fa
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/package-lock.json
@@ -0,0 +1,974 @@
+{
+ "name": "@polymer/iron-resizable-behavior",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.0.tgz",
+ "integrity": "sha512-a5DFXI3TdZSVOMH4608LVaBLmcr+mwM2+B8OSBiB9WFNCtdqzUXwtB5We6vBzrThXlO4uRo7d2pEqjNXMAlEkA==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.0",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "4.1.0",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.0",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.12"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz",
+ "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.6.tgz",
+ "integrity": "sha512-CTUtLb6WqCCgp6P59QintjHWqzf4VL1uPA27bipLAPxFqrtK1gEYllePzTICGqQ8rYsCbpnsNypXjjDzGAAjEQ==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.8.tgz",
+ "integrity": "sha512-QqR0j08RCS1AQYPMRPHikEpcmK+2aEEbcSzWLwOqyJ4FhLmHUx/WjRrnn7tTQg/y4IKnMhzskh/o7qvGIZZ7iA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.0.0.tgz",
+ "integrity": "sha512-v+0wW9Wezwsyb0uF4aBVCjmSqit3Ru7PZFziGF0o2KwTvN2zWfTi3BRLq9EkJFdg3eBbyERXGTntVpBxH1J68Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.2",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
+ "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "4.0.0",
+ "array-back": "2.0.0",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz",
+ "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.5.7"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.8",
+ "winston": "2.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-QQL70IC85hI6q9uQeresEMcT1Qf8YR/zDe1qG8WWeeFAZk8z0lmzUpsfcAWz+bM4wpDdXrtd4HitIs4p0CHl/w==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.101",
+ "@types/parse5": "2.2.34",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "polymer-project-config": "3.8.1",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.1"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.8.1.tgz",
+ "integrity": "sha512-MLvnM9gexFWg7nynY24eHZG6NLXocmk718sVds/sx2CAJ6iihhC0JMhhOIa6jnad9KQrHyGl/cs3mMRaaub5Fg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.101",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.1.tgz",
+ "integrity": "sha1-Eahr7+rDxKo+wIYjZRo8gabQu8g=",
+ "dev": true
+ },
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/package.json
new file mode 100644
index 00000000000..5cbb08c424f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-resizable-behavior/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@polymer/iron-resizable-behavior",
+ "private": true,
+ "description": "Coordinates the flow of resizeable elements",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-resizable-behavior.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir ."
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/.bower.json
new file mode 100644
index 00000000000..a60c0292e31
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/.bower.json
@@ -0,0 +1,68 @@
+{
+ "name": "iron-selector",
+ "version": "2.1.0",
+ "description": "Manages a set of elements that can be selected",
+ "private": true,
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "main": [
+ "iron-selector.html",
+ "iron-multi-selectable.html",
+ "iron-selectable.html",
+ "iron-selection.html"
+ ],
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "selector"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-selector.git"
+ },
+ "homepage": "https://github.com/PolymerElements/iron-selector",
+ "ignore": [],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-test-helpers": "polymerelements/iron-test-helpers#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.2.5",
+ "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.4",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.1.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.0",
+ "commit": "82e8bf6bd3c3bf5a3605271e8ef1ee2cb68f053c"
+ },
+ "_source": "https://github.com/PolymerElements/iron-selector.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/iron-selector"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/.github/CODEOWNERS
new file mode 100644
index 00000000000..0d8c0ad6b48
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @bicknellr
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..07a3448a7ae
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-selector/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/.travis.yml
new file mode 100644
index 00000000000..2d6d175f58e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/.travis.yml
@@ -0,0 +1,29 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+env:
+ global:
+ - secure: >-
+ SFfLw5U6C/7UFRyt/ho5AXNnf8E1d7bY6V9lPT2UnHjkNl4NldWyJEkBeaFTERChKmrYBNk33g748OGohL8snCRXCPxM9A/OKRWEGSFIvPmgLs8mkpbNodUAcpL6dbDLlZgcVDHXCn1uvVQgOgzg64FWW5ozphxD4u/nl5nA7aY=
+ - secure: >-
+ a6YFcuIvE3PJ9C0F7cimJ/R8EGlKy2rlg7Re2ezpL85f4++cYnYBUrNnbwj+BNp5F9IXZxvD6T+kNr+1BJtqILFf54W5baBgB5PVCSt7dry+lrcRUf5yTIRl0yJ+73UJrEWR2UOXaXlGzbQ56k2TWAbnzVbq2jik1vdgSnxbjLE=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/README.md
new file mode 100755
index 00000000000..271a106c184
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/README.md
@@ -0,0 +1,102 @@
+[![Build status](https://travis-ci.org/PolymerElements/iron-selector.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-selector)
+[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://www.webcomponents.org/element/PolymerElements/iron-selector)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/iron-selector)_
+
+
+## &lt;iron-selector&gt;
+
+ `iron-selector` is an element which can be used to manage a list of elements
+ that can be selected. Tapping on the item will make the item selected. The `selected` indicates
+ which item is being selected. The default is to use the index of the item.
+
+ Example:
+
+```html
+ <iron-selector selected="0">
+ <div>Item 1</div>
+ <div>Item 2</div>
+ <div>Item 3</div>
+ </iron-selector>
+```
+
+ If you want to use the attribute value of an element for `selected` instead of the index,
+ set `attrForSelected` to the name of the attribute. For example, if you want to select item by
+ `name`, set `attrForSelected` to `name`.
+
+ Example:
+
+```html
+ <iron-selector attr-for-selected="name" selected="foo">
+ <div name="foo">Foo</div>
+ <div name="bar">Bar</div>
+ <div name="zot">Zot</div>
+ </iron-selector>
+```
+
+ You can specify a default fallback with `fallbackSelection` in case the `selected` attribute does
+ not match the `attrForSelected` attribute of any elements.
+
+ Example:
+
+```html
+ <iron-selector attr-for-selected="name" selected="non-existing"
+ fallback-selection="default">
+ <div name="foo">Foo</div>
+ <div name="bar">Bar</div>
+ <div name="default">Default</div>
+ </iron-selector>
+```
+
+ Note: When the selector is multi, the selection will set to `fallbackSelection` iff
+ the number of matching elements is zero.
+
+ `iron-selector` is not styled. Use the `iron-selected` CSS class to style the selected element.
+
+ Example:
+
+```html
+ <style>
+ .iron-selected {
+ background: #eee;
+ }
+ </style>
+
+ ...
+
+ <iron-selector selected="0">
+ <div>Item 1</div>
+ <div>Item 2</div>
+ <div>Item 3</div>
+ </iron-selector>
+```
+
+### Notable breaking changes between 1.x and 2.x (hybrid):
+
+#### IronSelectableBehavior
+
+- IronSelectableBehavior no longer updates its list of items synchronously
+ when it is connected to avoid triggering a situation introduced in the
+ Custom Elements v1 spec that might cause custom element reactions to be
+ called later than expected.
+
+ If you are using an element with IronSelectableBehavior and ...
+ 1. are reading or writing properties of the element that depend on its
+ items (`items`, `selectedItems`, etc.)
+ 1. are performing these accesses after the element is created or connected
+ (attached) either **synchronously** or **after a timeout**
+
+ ... you should wait for the element to dispatch an `iron-items-changed`
+ event instead.
+- `Polymer.dom.flush()` no longer triggers the observer used by
+ IronSelectableBehavior to watch for changes to its items. You can call
+ `forceSynchronousItemUpdate` instead or, preferably, listen for the
+ `iron-items-changed` event.
+
+#### IronMultiSelectableBehavior
+
+- All breaking changes to IronSelectableBehavior listed above apply to
+ IronMultiSelectableBehavior.
+- `selectedValues` and `selectedItems` now have empty arrays as default
+ values. This may cause bindings or observers of these properties to
+ trigger at start up when they previously had not.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/bower.json
new file mode 100755
index 00000000000..7a233b076f4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/bower.json
@@ -0,0 +1,59 @@
+{
+ "name": "iron-selector",
+ "version": "2.0.1",
+ "description": "Manages a set of elements that can be selected",
+ "private": true,
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "main": [
+ "iron-selector.html",
+ "iron-multi-selectable.html",
+ "iron-selectable.html",
+ "iron-selection.html"
+ ],
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "selector"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-selector.git"
+ },
+ "homepage": "https://github.com/PolymerElements/iron-selector",
+ "ignore": [],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-test-helpers": "polymerelements/iron-test-helpers#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.2.5",
+ "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.4",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/demo/index.html
new file mode 100644
index 00000000000..b4b84dc2c15
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/demo/index.html
@@ -0,0 +1,104 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<html>
+ <head>
+
+ <title>iron-selector</title>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../iron-selector.html">
+ <link rel="import" href="../../paper-styles/color.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+
+ </head>
+ <body unresolved>
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles">
+ iron-selector > * {
+ padding: 8px;
+ }
+
+ .iron-selected {
+ background-color: var(--google-blue-500);
+ color: white;
+ }
+ </style>
+ </custom-style>
+
+ <div class="vertical-section-container centered">
+ <h3>Basic</h3>
+ <demo-snippet>
+ <template>
+ <iron-selector selected="3">
+ <div>Item 0</div>
+ <div>Item 1</div>
+ <div>Item 2</div>
+ <div>Item 3</div>
+ <div>Item 4</div>
+ </iron-selector>
+ </template>
+ </demo-snippet>
+
+ <h3>Use <code>multi</code> to enable multiple selection.</h3>
+ <demo-snippet>
+ <template>
+ <iron-selector multi selected-values='[0,2]'>
+ <div>Item 0</div>
+ <div>Item 1</div>
+ <div>Item 2</div>
+ <div>Item 3</div>
+ <div>Item 4</div>
+ </iron-selector>
+ </template>
+ </demo-snippet>
+
+ <h3>
+ Use <code>attr-for-selected</code> to specify the attribute of the
+ selectable elements containing the selection key.
+ </h3>
+ <demo-snippet>
+ <template>
+ <iron-selector selected="bar" attr-for-selected="name">
+ <div name="foo">Foo</div>
+ <div name="bar">Bar</div>
+ <div name="baz">Baz</div>
+ <div name="qux">Qux</div>
+ <div name="quux">Quux</div>
+ </iron-selector>
+ </template>
+ </demo-snippet>
+
+ <h3>
+ Use <code>fallback-selection</code> to provide an option to be selected
+ when all options are deselected or all selected options are invalid.
+ </h3>
+ <demo-snippet>
+ <template>
+ <iron-selector multi selected="an-unknown-key" attr-for-selected="name" fallback-selection="default">
+ <div name="foo">Foo</div>
+ <div name="bar">Bar</div>
+ <div name="baz">Baz</div>
+ <div name="qux">Qux</div>
+ <div name="quux">Quux</div>
+ <div name="default">Default</div>
+ </iron-selector>
+ </template>
+ </demo-snippet>
+ </div>
+
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/gen-tsd.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/gen-tsd.json
new file mode 100644
index 00000000000..ff975995907
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/gen-tsd.json
@@ -0,0 +1,7 @@
+{
+ "addReferences": {
+ "iron-selection.d.ts": [
+ "iron-selection-extra.d.ts"
+ ]
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/index.html
new file mode 100755
index 00000000000..741693ce702
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<html>
+<head>
+
+ <title>iron-selector</title>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-multi-selectable.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-multi-selectable.d.ts
new file mode 100644
index 00000000000..04f939c0903
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-multi-selectable.d.ts
@@ -0,0 +1,56 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-multi-selectable.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="iron-selectable.d.ts" />
+
+declare namespace Polymer {
+
+ interface IronMultiSelectableBehavior extends Polymer.IronSelectableBehavior {
+
+ /**
+ * UNUSED, FOR API COMPATIBILITY
+ */
+ readonly _shouldUpdateSelection: any;
+
+ /**
+ * If true, multiple selections are allowed.
+ */
+ multi: boolean|null|undefined;
+
+ /**
+ * Gets or sets the selected elements. This is used instead of `selected` when `multi`
+ * is true.
+ */
+ selectedValues: any[]|null|undefined;
+
+ /**
+ * Returns an array of currently selected items.
+ */
+ readonly selectedItems: any[]|null|undefined;
+
+ /**
+ * Selects the given value. If the `multi` property is true, then the selected state of the
+ * `value` will be toggled; otherwise the `value` will be selected.
+ *
+ * @param value the value to select.
+ */
+ select(value: string|number): void;
+ _updateAttrForSelected(): void;
+ _updateSelected(): void;
+ _selectionChange(): void;
+ multiChanged(multi: any): void;
+ _selectMulti(values: any): void;
+ _toggleSelected(value: any): void;
+ _valuesToItems(values: any): any;
+ }
+
+ const IronMultiSelectableBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-multi-selectable.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-multi-selectable.html
new file mode 100644
index 00000000000..96051d8b36d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-multi-selectable.html
@@ -0,0 +1,169 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="iron-selectable.html">
+
+<script>
+ /**
+ * @polymerBehavior Polymer.IronMultiSelectableBehavior
+ */
+ Polymer.IronMultiSelectableBehaviorImpl = {
+ properties: {
+
+ /**
+ * If true, multiple selections are allowed.
+ */
+ multi: {
+ type: Boolean,
+ value: false,
+ observer: 'multiChanged'
+ },
+
+ /**
+ * Gets or sets the selected elements. This is used instead of `selected` when `multi`
+ * is true.
+ */
+ selectedValues: {
+ type: Array,
+ notify: true,
+ value: function() {
+ return [];
+ }
+ },
+
+ /**
+ * Returns an array of currently selected items.
+ */
+ selectedItems: {
+ type: Array,
+ readOnly: true,
+ notify: true,
+ value: function() {
+ return [];
+ }
+ },
+
+ },
+
+ observers: [
+ '_updateSelected(selectedValues.splices)'
+ ],
+
+ /**
+ * Selects the given value. If the `multi` property is true, then the selected state of the
+ * `value` will be toggled; otherwise the `value` will be selected.
+ *
+ * @method select
+ * @param {string|number} value the value to select.
+ */
+ select: function(value) {
+ if (this.multi) {
+ this._toggleSelected(value);
+ } else {
+ this.selected = value;
+ }
+ },
+
+ multiChanged: function(multi) {
+ this._selection.multi = multi;
+ this._updateSelected();
+ },
+
+ // UNUSED, FOR API COMPATIBILITY
+ get _shouldUpdateSelection() {
+ return this.selected != null ||
+ (this.selectedValues != null && this.selectedValues.length);
+ },
+
+ _updateAttrForSelected: function() {
+ if (!this.multi) {
+ Polymer.IronSelectableBehavior._updateAttrForSelected.apply(this);
+ } else if (this.selectedItems && this.selectedItems.length > 0) {
+ this.selectedValues = this.selectedItems.map(function(selectedItem) {
+ return this._indexToValue(this.indexOf(selectedItem));
+ }, this).filter(function(unfilteredValue) {
+ return unfilteredValue != null;
+ }, this);
+ }
+ },
+
+ _updateSelected: function() {
+ if (this.multi) {
+ this._selectMulti(this.selectedValues);
+ } else {
+ this._selectSelected(this.selected);
+ }
+ },
+
+ _selectMulti: function(values) {
+ values = values || [];
+
+ var selectedItems = (this._valuesToItems(values) || []).filter(function(item) {
+ return item !== null && item !== undefined;
+ });
+
+ // clear all but the current selected items
+ this._selection.clear(selectedItems);
+
+ // select only those not selected yet
+ for (var i = 0; i < selectedItems.length; i++) {
+ this._selection.setItemSelected(selectedItems[i], true);
+ }
+
+ // Check for items, since this array is populated only when attached
+ if (this.fallbackSelection && !this._selection.get().length) {
+ var fallback = this._valueToItem(this.fallbackSelection);
+ if (fallback) {
+ this.select(this.fallbackSelection);
+ }
+ }
+ },
+
+ _selectionChange: function() {
+ var s = this._selection.get();
+ if (this.multi) {
+ this._setSelectedItems(s);
+ this._setSelectedItem(s.length ? s[0] : null);
+ } else {
+ if (s !== null && s !== undefined) {
+ this._setSelectedItems([s]);
+ this._setSelectedItem(s);
+ } else {
+ this._setSelectedItems([]);
+ this._setSelectedItem(null);
+ }
+ }
+ },
+
+ _toggleSelected: function(value) {
+ var i = this.selectedValues.indexOf(value);
+ var unselected = i < 0;
+ if (unselected) {
+ this.push('selectedValues',value);
+ } else {
+ this.splice('selectedValues',i,1);
+ }
+ },
+
+ _valuesToItems: function(values) {
+ return (values == null) ? null : values.map(function(value) {
+ return this._valueToItem(value);
+ }, this);
+ }
+ };
+
+ /** @polymerBehavior */
+ Polymer.IronMultiSelectableBehavior = [
+ Polymer.IronSelectableBehavior,
+ Polymer.IronMultiSelectableBehaviorImpl
+ ];
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selectable.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selectable.d.ts
new file mode 100644
index 00000000000..57833d82a83
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selectable.d.ts
@@ -0,0 +1,155 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-selectable.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="iron-selection.d.ts" />
+
+declare namespace Polymer {
+
+ interface IronSelectableBehavior {
+
+ /**
+ * If you want to use an attribute value or property of an element for
+ * `selected` instead of the index, set this to the name of the attribute
+ * or property. Hyphenated values are converted to camel case when used to
+ * look up the property of a selectable element. Camel cased values are
+ * *not* converted to hyphenated values for attribute lookup. It's
+ * recommended that you provide the hyphenated form of the name so that
+ * selection works in both cases. (Use `attr-or-property-name` instead of
+ * `attrOrPropertyName`.)
+ */
+ attrForSelected: string|null|undefined;
+
+ /**
+ * Gets or sets the selected element. The default is to use the index of the item.
+ */
+ selected: string|number;
+
+ /**
+ * Returns the currently selected item.
+ */
+ readonly selectedItem: object|null;
+
+ /**
+ * The event that fires from items when they are selected. Selectable
+ * will listen for this event from items and update the selection state.
+ * Set to empty string to listen to no events.
+ */
+ activateEvent: string|null|undefined;
+
+ /**
+ * This is a CSS selector string. If this is set, only items that match the CSS selector
+ * are selectable.
+ */
+ selectable: string|null|undefined;
+
+ /**
+ * The class to set on elements when selected.
+ */
+ selectedClass: string|null|undefined;
+
+ /**
+ * The attribute to set on elements when selected.
+ */
+ selectedAttribute: string|null|undefined;
+
+ /**
+ * Default fallback if the selection based on selected with `attrForSelected`
+ * is not found.
+ */
+ fallbackSelection: string|null|undefined;
+
+ /**
+ * The list of items from which a selection can be made.
+ */
+ readonly items: any[]|null|undefined;
+
+ /**
+ * The set of excluded elements where the key is the `localName`
+ * of the element that will be ignored from the item list.
+ */
+ _excludedLocalNames: object|null|undefined;
+
+ /**
+ * UNUSED, FOR API COMPATIBILITY
+ */
+ readonly _shouldUpdateSelection: any;
+ created(): void;
+ attached(): void;
+ detached(): void;
+
+ /**
+ * Returns the index of the given item.
+ *
+ * @returns Returns the index of the item
+ */
+ indexOf(item: object|null): any;
+
+ /**
+ * Selects the given value.
+ *
+ * @param value the value to select.
+ */
+ select(value: string|number): void;
+
+ /**
+ * Selects the previous item.
+ */
+ selectPrevious(): void;
+
+ /**
+ * Selects the next item.
+ */
+ selectNext(): void;
+
+ /**
+ * Selects the item at the given index.
+ */
+ selectIndex(index: any): void;
+
+ /**
+ * Force a synchronous update of the `items` property.
+ *
+ * NOTE: Consider listening for the `iron-items-changed` event to respond to
+ * updates to the set of selectable items after updates to the DOM list and
+ * selection state have been made.
+ *
+ * WARNING: If you are using this method, you should probably consider an
+ * alternate approach. Synchronously querying for items is potentially
+ * slow for many use cases. The `items` property will update asynchronously
+ * on its own to reflect selectable items in the DOM.
+ */
+ forceSynchronousItemUpdate(): void;
+ _checkFallback(): void;
+ _addListener(eventName: any): void;
+ _removeListener(eventName: any): void;
+ _activateEventChanged(eventName: any, old: any): void;
+ _updateItems(): void;
+ _updateAttrForSelected(): void;
+ _updateSelected(): void;
+ _selectSelected(selected: any): void;
+ _filterItem(node: any): any;
+ _valueToItem(value: any): any;
+ _valueToIndex(value: any): any;
+ _indexToValue(index: any): any;
+ _valueForItem(item: any): any;
+ _applySelection(item: any, isSelected: any): void;
+ _selectionChange(): void;
+
+ /**
+ * observe items change under the given node.
+ */
+ _observeItems(node: any): any;
+ _activateHandler(e: any): void;
+ _itemActivate(value: any, item: any): void;
+ }
+
+ const IronSelectableBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selectable.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selectable.html
new file mode 100644
index 00000000000..30cd1e7be9d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selectable.html
@@ -0,0 +1,410 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="iron-selection.html">
+
+<script>
+ /**
+ * @polymerBehavior Polymer.IronSelectableBehavior
+ */
+ Polymer.IronSelectableBehavior = {
+
+ /**
+ * Fired when iron-selector is activated (selected or deselected).
+ * It is fired before the selected items are changed.
+ * Cancel the event to abort selection.
+ *
+ * @event iron-activate
+ */
+
+ /**
+ * Fired when an item is selected
+ *
+ * @event iron-select
+ */
+
+ /**
+ * Fired when an item is deselected
+ *
+ * @event iron-deselect
+ */
+
+ /**
+ * Fired when the list of selectable items changes (e.g., items are
+ * added or removed). The detail of the event is a mutation record that
+ * describes what changed.
+ *
+ * @event iron-items-changed
+ */
+
+ properties: {
+
+ /**
+ * If you want to use an attribute value or property of an element for
+ * `selected` instead of the index, set this to the name of the attribute
+ * or property. Hyphenated values are converted to camel case when used to
+ * look up the property of a selectable element. Camel cased values are
+ * *not* converted to hyphenated values for attribute lookup. It's
+ * recommended that you provide the hyphenated form of the name so that
+ * selection works in both cases. (Use `attr-or-property-name` instead of
+ * `attrOrPropertyName`.)
+ */
+ attrForSelected: {
+ type: String,
+ value: null
+ },
+
+ /**
+ * Gets or sets the selected element. The default is to use the index of the item.
+ * @type {string|number}
+ */
+ selected: {
+ type: String,
+ notify: true
+ },
+
+ /**
+ * Returns the currently selected item.
+ *
+ * @type {?Object}
+ */
+ selectedItem: {
+ type: Object,
+ readOnly: true,
+ notify: true
+ },
+
+ /**
+ * The event that fires from items when they are selected. Selectable
+ * will listen for this event from items and update the selection state.
+ * Set to empty string to listen to no events.
+ */
+ activateEvent: {
+ type: String,
+ value: 'tap',
+ observer: '_activateEventChanged'
+ },
+
+ /**
+ * This is a CSS selector string. If this is set, only items that match the CSS selector
+ * are selectable.
+ */
+ selectable: String,
+
+ /**
+ * The class to set on elements when selected.
+ */
+ selectedClass: {
+ type: String,
+ value: 'iron-selected'
+ },
+
+ /**
+ * The attribute to set on elements when selected.
+ */
+ selectedAttribute: {
+ type: String,
+ value: null
+ },
+
+ /**
+ * Default fallback if the selection based on selected with `attrForSelected`
+ * is not found.
+ */
+ fallbackSelection: {
+ type: String,
+ value: null
+ },
+
+ /**
+ * The list of items from which a selection can be made.
+ */
+ items: {
+ type: Array,
+ readOnly: true,
+ notify: true,
+ value: function() {
+ return [];
+ }
+ },
+
+ /**
+ * The set of excluded elements where the key is the `localName`
+ * of the element that will be ignored from the item list.
+ *
+ * @default {template: 1}
+ */
+ _excludedLocalNames: {
+ type: Object,
+ value: function() {
+ return {
+ 'template': 1,
+ 'dom-bind': 1,
+ 'dom-if': 1,
+ 'dom-repeat': 1,
+ };
+ }
+ }
+ },
+
+ observers: [
+ '_updateAttrForSelected(attrForSelected)',
+ '_updateSelected(selected)',
+ '_checkFallback(fallbackSelection)'
+ ],
+
+ created: function() {
+ this._bindFilterItem = this._filterItem.bind(this);
+ this._selection = new Polymer.IronSelection(this._applySelection.bind(this));
+ },
+
+ attached: function() {
+ this._observer = this._observeItems(this);
+ this._addListener(this.activateEvent);
+ },
+
+ detached: function() {
+ if (this._observer) {
+ Polymer.dom(this).unobserveNodes(this._observer);
+ }
+ this._removeListener(this.activateEvent);
+ },
+
+ /**
+ * Returns the index of the given item.
+ *
+ * @method indexOf
+ * @param {Object} item
+ * @returns Returns the index of the item
+ */
+ indexOf: function(item) {
+ return this.items ? this.items.indexOf(item) : -1;
+ },
+
+ /**
+ * Selects the given value.
+ *
+ * @method select
+ * @param {string|number} value the value to select.
+ */
+ select: function(value) {
+ this.selected = value;
+ },
+
+ /**
+ * Selects the previous item.
+ *
+ * @method selectPrevious
+ */
+ selectPrevious: function() {
+ var length = this.items.length;
+ var index = (Number(this._valueToIndex(this.selected)) - 1 + length) % length;
+ this.selected = this._indexToValue(index);
+ },
+
+ /**
+ * Selects the next item.
+ *
+ * @method selectNext
+ */
+ selectNext: function() {
+ var index = (Number(this._valueToIndex(this.selected)) + 1) % this.items.length;
+ this.selected = this._indexToValue(index);
+ },
+
+ /**
+ * Selects the item at the given index.
+ *
+ * @method selectIndex
+ */
+ selectIndex: function(index) {
+ this.select(this._indexToValue(index));
+ },
+
+ /**
+ * Force a synchronous update of the `items` property.
+ *
+ * NOTE: Consider listening for the `iron-items-changed` event to respond to
+ * updates to the set of selectable items after updates to the DOM list and
+ * selection state have been made.
+ *
+ * WARNING: If you are using this method, you should probably consider an
+ * alternate approach. Synchronously querying for items is potentially
+ * slow for many use cases. The `items` property will update asynchronously
+ * on its own to reflect selectable items in the DOM.
+ */
+ forceSynchronousItemUpdate: function() {
+ if (this._observer && typeof this._observer.flush === "function") {
+ // NOTE(bicknellr): `Polymer.dom.flush` above is no longer sufficient to
+ // trigger `observeNodes` callbacks. Polymer 2.x returns an object from
+ // `observeNodes` with a `flush` that synchronously gives the callback
+ // any pending MutationRecords (retrieved with `takeRecords`). Any case
+ // where ShadyDOM flushes were expected to synchronously trigger item
+ // updates will now require calling `forceSynchronousItemUpdate`.
+ this._observer.flush();
+ } else {
+ this._updateItems();
+ }
+ },
+
+ // UNUSED, FOR API COMPATIBILITY
+ get _shouldUpdateSelection() {
+ return this.selected != null;
+ },
+
+ _checkFallback: function() {
+ this._updateSelected();
+ },
+
+ _addListener: function(eventName) {
+ this.listen(this, eventName, '_activateHandler');
+ },
+
+ _removeListener: function(eventName) {
+ this.unlisten(this, eventName, '_activateHandler');
+ },
+
+ _activateEventChanged: function(eventName, old) {
+ this._removeListener(old);
+ this._addListener(eventName);
+ },
+
+ _updateItems: function() {
+ var nodes = Polymer.dom(this).queryDistributedElements(this.selectable || '*');
+ nodes = Array.prototype.filter.call(nodes, this._bindFilterItem);
+ this._setItems(nodes);
+ },
+
+ _updateAttrForSelected: function() {
+ if (this.selectedItem) {
+ this.selected = this._valueForItem(this.selectedItem);
+ }
+ },
+
+ _updateSelected: function() {
+ this._selectSelected(this.selected);
+ },
+
+ _selectSelected: function(selected) {
+ if (!this.items) {
+ return;
+ }
+
+ var item = this._valueToItem(this.selected);
+ if (item) {
+ this._selection.select(item);
+ } else {
+ this._selection.clear();
+ }
+ // Check for items, since this array is populated only when attached
+ // Since Number(0) is falsy, explicitly check for undefined
+ if (this.fallbackSelection && this.items.length && (this._selection.get() === undefined)) {
+ this.selected = this.fallbackSelection;
+ }
+ },
+
+ _filterItem: function(node) {
+ return !this._excludedLocalNames[node.localName];
+ },
+
+ _valueToItem: function(value) {
+ return (value == null) ? null : this.items[this._valueToIndex(value)];
+ },
+
+ _valueToIndex: function(value) {
+ if (this.attrForSelected) {
+ for (var i = 0, item; item = this.items[i]; i++) {
+ if (this._valueForItem(item) == value) {
+ return i;
+ }
+ }
+ } else {
+ return Number(value);
+ }
+ },
+
+ _indexToValue: function(index) {
+ if (this.attrForSelected) {
+ var item = this.items[index];
+ if (item) {
+ return this._valueForItem(item);
+ }
+ } else {
+ return index;
+ }
+ },
+
+ _valueForItem: function(item) {
+ if (!item) {
+ return null;
+ }
+ if (!this.attrForSelected) {
+ var i = this.indexOf(item);
+ return i === -1 ? null : i;
+ }
+ var propValue = item[Polymer.CaseMap.dashToCamelCase(this.attrForSelected)];
+ return propValue != undefined ? propValue : item.getAttribute(this.attrForSelected);
+ },
+
+ _applySelection: function(item, isSelected) {
+ if (this.selectedClass) {
+ this.toggleClass(this.selectedClass, isSelected, item);
+ }
+ if (this.selectedAttribute) {
+ this.toggleAttribute(this.selectedAttribute, isSelected, item);
+ }
+ this._selectionChange();
+ this.fire('iron-' + (isSelected ? 'select' : 'deselect'), {item: item});
+ },
+
+ _selectionChange: function() {
+ this._setSelectedItem(this._selection.get());
+ },
+
+ // observe items change under the given node.
+ _observeItems: function(node) {
+ return Polymer.dom(node).observeNodes(function(mutation) {
+ this._updateItems();
+ this._updateSelected();
+
+ // Let other interested parties know about the change so that
+ // we don't have to recreate mutation observers everywhere.
+ this.fire('iron-items-changed', mutation, {
+ bubbles: false,
+ cancelable: false
+ });
+ });
+ },
+
+ _activateHandler: function(e) {
+ var t = e.target;
+ var items = this.items;
+ while (t && t != this) {
+ var i = items.indexOf(t);
+ if (i >= 0) {
+ var value = this._indexToValue(i);
+ this._itemActivate(value, t);
+ return;
+ }
+ t = t.parentNode;
+ }
+ },
+
+ _itemActivate: function(value, item) {
+ if (!this.fire('iron-activate',
+ {selected: value, item: item}, {cancelable: true}).defaultPrevented) {
+ this.select(value);
+ }
+ }
+
+ };
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selection-extra.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selection-extra.d.ts
new file mode 100644
index 00000000000..b29b6c5b718
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selection-extra.d.ts
@@ -0,0 +1,60 @@
+declare namespace Polymer {
+
+ class IronSelection {
+ constructor(selectCallback: Function);
+
+ /**
+ * If true, multiple selections are allowed.
+ */
+ multi: boolean;
+
+ /**
+ * Retrieves the selected item(s).
+ *
+ * @returns Returns the selected item(s). If the multi property is true,
+ * `get` will return an array, otherwise it will return
+ * the selected item or undefined if there is no selection.
+ */
+ get(): any|any[]|undefined;
+
+ /**
+ * Clears all the selection except the ones indicated.
+ *
+ * @param excludes items to be excluded.
+ */
+ clear(excludes: any[]|null): void;
+
+ /**
+ * Indicates if a given item is selected.
+ *
+ * @param item The item whose selection state should be checked.
+ * @returns Returns true if `item` is selected.
+ */
+ isSelected(item: any): boolean;
+
+ /**
+ * Sets the selection state for a given item to either selected or
+ * deselected.
+ *
+ * @param item The item to select.
+ * @param isSelected True for selected, false for deselected.
+ */
+ setItemSelected(item: any, isSelected: boolean): void;
+
+ /**
+ * Sets the selection state for a given item. If the `multi` property
+ * is true, then the selected state of `item` will be toggled; otherwise
+ * the `item` will be selected.
+ *
+ * @param item The item to select.
+ */
+ select(item: any): void;
+
+ /**
+ * Toggles the selection state for `item`.
+ *
+ * @param item The item to toggle.
+ */
+ toggle(item: any): void;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selection.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selection.d.ts
new file mode 100644
index 00000000000..2209ec6834a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selection.d.ts
@@ -0,0 +1,13 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-selection.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="iron-selection-extra.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selection.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selection.html
new file mode 100644
index 00000000000..0bca07dabf1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selection.html
@@ -0,0 +1,120 @@
+
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<script>
+
+ /**
+ * @param {!Function} selectCallback
+ * @constructor
+ * @suppress {missingProvide}
+ */
+ Polymer.IronSelection = function(selectCallback) {
+ this.selection = [];
+ this.selectCallback = selectCallback;
+ };
+
+ Polymer.IronSelection.prototype = {
+
+ /**
+ * Retrieves the selected item(s).
+ *
+ * @method get
+ * @returns Returns the selected item(s). If the multi property is true,
+ * `get` will return an array, otherwise it will return
+ * the selected item or undefined if there is no selection.
+ */
+ get: function() {
+ return this.multi ? this.selection.slice() : this.selection[0];
+ },
+
+ /**
+ * Clears all the selection except the ones indicated.
+ *
+ * @method clear
+ * @param {Array} excludes items to be excluded.
+ */
+ clear: function(excludes) {
+ this.selection.slice().forEach(function(item) {
+ if (!excludes || excludes.indexOf(item) < 0) {
+ this.setItemSelected(item, false);
+ }
+ }, this);
+ },
+
+ /**
+ * Indicates if a given item is selected.
+ *
+ * @method isSelected
+ * @param {*} item The item whose selection state should be checked.
+ * @returns Returns true if `item` is selected.
+ */
+ isSelected: function(item) {
+ return this.selection.indexOf(item) >= 0;
+ },
+
+ /**
+ * Sets the selection state for a given item to either selected or deselected.
+ *
+ * @method setItemSelected
+ * @param {*} item The item to select.
+ * @param {boolean} isSelected True for selected, false for deselected.
+ */
+ setItemSelected: function(item, isSelected) {
+ if (item != null) {
+ if (isSelected !== this.isSelected(item)) {
+ // proceed to update selection only if requested state differs from current
+ if (isSelected) {
+ this.selection.push(item);
+ } else {
+ var i = this.selection.indexOf(item);
+ if (i >= 0) {
+ this.selection.splice(i, 1);
+ }
+ }
+ if (this.selectCallback) {
+ this.selectCallback(item, isSelected);
+ }
+ }
+ }
+ },
+
+ /**
+ * Sets the selection state for a given item. If the `multi` property
+ * is true, then the selected state of `item` will be toggled; otherwise
+ * the `item` will be selected.
+ *
+ * @method select
+ * @param {*} item The item to select.
+ */
+ select: function(item) {
+ if (this.multi) {
+ this.toggle(item);
+ } else if (this.get() !== item) {
+ this.setItemSelected(this.get(), false);
+ this.setItemSelected(item, true);
+ }
+ },
+
+ /**
+ * Toggles the selection state for `item`.
+ *
+ * @method toggle
+ * @param {*} item The item to toggle.
+ */
+ toggle: function(item) {
+ this.setItemSelected(item, !this.isSelected(item));
+ }
+
+ };
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selector.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selector.d.ts
new file mode 100644
index 00000000000..5c28458d5f9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selector.d.ts
@@ -0,0 +1,19 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-selector.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="iron-multi-selectable.d.ts" />
+
+interface IronSelectorElement extends Polymer.Element, Polymer.IronMultiSelectableBehavior {
+}
+
+interface HTMLElementTagNameMap {
+ "iron-selector": IronSelectorElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selector.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selector.html
new file mode 100644
index 00000000000..0ecc9fbcd19
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/iron-selector.html
@@ -0,0 +1,87 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="iron-multi-selectable.html">
+
+<script>
+ /**
+ `iron-selector` is an element which can be used to manage a list of elements
+ that can be selected. Tapping on the item will make the item selected. The `selected` indicates
+ which item is being selected. The default is to use the index of the item.
+
+ Example:
+
+ <iron-selector selected="0">
+ <div>Item 1</div>
+ <div>Item 2</div>
+ <div>Item 3</div>
+ </iron-selector>
+
+ If you want to use the attribute value of an element for `selected` instead of the index,
+ set `attrForSelected` to the name of the attribute. For example, if you want to select item by
+ `name`, set `attrForSelected` to `name`.
+
+ Example:
+
+ <iron-selector attr-for-selected="name" selected="foo">
+ <div name="foo">Foo</div>
+ <div name="bar">Bar</div>
+ <div name="zot">Zot</div>
+ </iron-selector>
+
+ You can specify a default fallback with `fallbackSelection` in case the `selected` attribute does
+ not match the `attrForSelected` attribute of any elements.
+
+ Example:
+
+ <iron-selector attr-for-selected="name" selected="non-existing"
+ fallback-selection="default">
+ <div name="foo">Foo</div>
+ <div name="bar">Bar</div>
+ <div name="default">Default</div>
+ </iron-selector>
+
+ Note: When the selector is multi, the selection will set to `fallbackSelection` iff
+ the number of matching elements is zero.
+
+ `iron-selector` is not styled. Use the `iron-selected` CSS class to style the selected element.
+
+ Example:
+
+ <style>
+ .iron-selected {
+ background: #eee;
+ }
+ </style>
+
+ ...
+
+ <iron-selector selected="0">
+ <div>Item 1</div>
+ <div>Item 2</div>
+ <div>Item 3</div>
+ </iron-selector>
+
+ @demo demo/index.html
+ */
+
+ Polymer({
+
+ is: 'iron-selector',
+
+ behaviors: [
+ Polymer.IronMultiSelectableBehavior
+ ]
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/package-lock.json
new file mode 100644
index 00000000000..22a1350a4de
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/package-lock.json
@@ -0,0 +1,974 @@
+{
+ "name": "@polymer/iron-selector",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.0.tgz",
+ "integrity": "sha512-a5DFXI3TdZSVOMH4608LVaBLmcr+mwM2+B8OSBiB9WFNCtdqzUXwtB5We6vBzrThXlO4uRo7d2pEqjNXMAlEkA==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.0",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "4.1.0",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.0",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.12"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz",
+ "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.6.tgz",
+ "integrity": "sha512-CTUtLb6WqCCgp6P59QintjHWqzf4VL1uPA27bipLAPxFqrtK1gEYllePzTICGqQ8rYsCbpnsNypXjjDzGAAjEQ==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.8.tgz",
+ "integrity": "sha512-QqR0j08RCS1AQYPMRPHikEpcmK+2aEEbcSzWLwOqyJ4FhLmHUx/WjRrnn7tTQg/y4IKnMhzskh/o7qvGIZZ7iA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.0.0.tgz",
+ "integrity": "sha512-v+0wW9Wezwsyb0uF4aBVCjmSqit3Ru7PZFziGF0o2KwTvN2zWfTi3BRLq9EkJFdg3eBbyERXGTntVpBxH1J68Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.2",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
+ "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "4.0.0",
+ "array-back": "2.0.0",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz",
+ "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.5.7"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.8",
+ "winston": "2.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-QQL70IC85hI6q9uQeresEMcT1Qf8YR/zDe1qG8WWeeFAZk8z0lmzUpsfcAWz+bM4wpDdXrtd4HitIs4p0CHl/w==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.101",
+ "@types/parse5": "2.2.34",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "polymer-project-config": "3.8.1",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.1"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.8.1.tgz",
+ "integrity": "sha512-MLvnM9gexFWg7nynY24eHZG6NLXocmk718sVds/sx2CAJ6iihhC0JMhhOIa6jnad9KQrHyGl/cs3mMRaaub5Fg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.101",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.1.tgz",
+ "integrity": "sha1-Eahr7+rDxKo+wIYjZRo8gabQu8g=",
+ "dev": true
+ },
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/package.json
new file mode 100644
index 00000000000..a99bbc4e5c8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-selector/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@polymer/iron-selector",
+ "private": true,
+ "description": "Manages a set of elements that can be selected",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-selector.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir ."
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/.bower.json
new file mode 100644
index 00000000000..7ba23462ccb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/.bower.json
@@ -0,0 +1,66 @@
+{
+ "name": "iron-validatable-behavior",
+ "version": "2.1.0",
+ "description": "Provides a behavior for an element that validates user input",
+ "authors": "The Polymer Authors",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "iron",
+ "behavior"
+ ],
+ "main": "iron-validatable-behavior.html",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-validatable-behavior.git"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/iron-validatable-behavior",
+ "ignore": [],
+ "dependencies": {
+ "iron-meta": "PolymerElements/iron-meta#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-validator-behavior": "PolymerElements/iron-validator-behavior#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-meta": "PolymerElements/iron-meta#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-validator-behavior": "PolymerElements/iron-validator-behavior#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.4",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.1.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.0",
+ "commit": "4b6c1c53e44a3bbb31fcfd14ede2234645518c96"
+ },
+ "_source": "https://github.com/PolymerElements/iron-validatable-behavior.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/iron-validatable-behavior"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/.github/CODEOWNERS
new file mode 100644
index 00000000000..cc86f1ec217
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @notwaldorf
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..a69a2fdc20e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/iron-validatable-behavior/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/.travis.yml
new file mode 100644
index 00000000000..1a08797722a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/.travis.yml
@@ -0,0 +1,30 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+env:
+ global:
+ - secure: >-
+ kwLs1FMf/hBnbxItbOJzbIdGtPDK2R2dngleJPgXLW9ExzpGHPgOmWsvxWL2BzlxlzZgzwpmUhnnJdxHlo8AZtQl1uq6NWl/e3oj9oeenFugF60eIcd01ak4QmhBsk3/20O426QQsz2WckGZRGcudBz5Zj2it3t5cbH3pAi90jo=
+ - secure: >-
+ hGl3bsjz9dbKTA/bAgfdrFMlT6VawxFljIPqX6zJD556jhpYxtkno278eIW8uLlIGC5nXRTWXQzWrRhN8i9osnqw1RFhW8C9lH+TLHEkYMvDnEOp9sZ8Amv6j8FdNibcDP8IPTo2PmIRwBK1nFp0VqhcQu/Eq7WUFolSns9E27k=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+ sauce_connect: true
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/README.md
new file mode 100644
index 00000000000..97032e894eb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/README.md
@@ -0,0 +1,46 @@
+
+<!---
+
+This README is automatically generated from the comments in these files:
+iron-validatable-behavior.html
+
+Edit those files, and our readme bot will duplicate them over here!
+Edit this file, and the bot will squash your changes :)
+
+The bot does some handling of markdown. Please file a bug if it does the wrong
+thing! https://github.com/PolymerLabs/tedium/issues
+
+-->
+
+[![Build status](https://travis-ci.org/PolymerElements/iron-validatable-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-validatable-behavior)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/iron-validatable-behavior)_
+
+
+## Polymer.IronValidatableBehavior
+
+`Use Polymer.IronValidatableBehavior` to implement an element that validates user input.
+Use the related `Polymer.IronValidatorBehavior` to add custom validation logic to an iron-input.
+
+By default, an `<iron-form>` element validates its fields when the user presses the submit button.
+To validate a form imperatively, call the form's `validate()` method, which in turn will
+call `validate()` on all its children. By using `Polymer.IronValidatableBehavior`, your
+custom element will get a public `validate()`, which
+will return the validity of the element, and a corresponding `invalid` attribute,
+which can be used for styling.
+
+To implement the custom validation logic of your element, you must override
+the protected `_getValidity()` method of this behaviour, rather than `validate()`.
+See [this](https://github.com/PolymerElements/iron-form/blob/master/demo/simple-element.html)
+for an example.
+
+### Changes in 2.0
+- `validate()` no longer requires a `value` parameter to be passed, and will use the element's `value` property if it exists
+- `validatorType` and `validatorName` were unused and have been removed
+
+### Accessibility
+
+Changing the `invalid` property, either manually or by calling `validate()` will update the
+`aria-invalid` attribute.
+
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/bower.json
new file mode 100644
index 00000000000..a2ae6cff3c0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/bower.json
@@ -0,0 +1,57 @@
+{
+ "name": "iron-validatable-behavior",
+ "version": "2.0.0",
+ "description": "Provides a behavior for an element that validates user input",
+ "authors": "The Polymer Authors",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "iron",
+ "behavior"
+ ],
+ "main": "iron-validatable-behavior.html",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-validatable-behavior.git"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/iron-validatable-behavior",
+ "ignore": [],
+ "dependencies": {
+ "iron-meta": "PolymerElements/iron-meta#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-validator-behavior": "PolymerElements/iron-validator-behavior#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-meta": "PolymerElements/iron-meta#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-validator-behavior": "PolymerElements/iron-validator-behavior#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.4",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/demo/cats-only.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/demo/cats-only.html
new file mode 100644
index 00000000000..83ef9ba617f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/demo/cats-only.html
@@ -0,0 +1,46 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-validator-behavior/iron-validator-behavior.html">
+
+<script>
+
+ Polymer({
+
+ is: 'cats-only',
+
+ behaviors: [
+ Polymer.IronValidatorBehavior
+ ],
+
+ validateObject: function(obj) {
+ var valid = true;
+ for (key in obj) {
+ if (obj[key] !== 'cats') {
+ valid = false;
+ break;
+ }
+ }
+ return valid;
+ },
+
+ validate: function(values) {
+ if (typeof values === 'object') {
+ return this.validateObject(values);
+ } else {
+ var value = Array.isArray(values) ? values.join('') : values;
+ return value.match(/^(c|ca|cat|cats)?$/) !== null;
+ }
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/demo/index.html
new file mode 100644
index 00000000000..3ea883a5eea
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/demo/index.html
@@ -0,0 +1,56 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <title>iron-validatable-behavior demo</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../paper-styles/color.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="cats-only.html">
+ <link rel="import" href="validatable-input.html">
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles"></style>
+ </custom-style>
+</head>
+<body>
+ <div class="vertical-section-container centered">
+ <h3>The <code>cats-only</code> validator only accepts the string "cats" and
+ its suffixes ("c", "ca", "cat").</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles">
+ validatable-input {
+ border: 1px solid var(--google-green-500);
+ color: var(--google-green-500);
+ }
+ validatable-input[invalid] {
+ border: 1px solid var(--google-red-500);
+ color: var(--google-red-500);
+ }
+ </style>
+ </custom-style>
+
+ <cats-only></cats-only>
+ <validatable-input validator="cats-only"></validatable-input>
+ </template>
+ </demo-snippet>
+ </div>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/demo/validatable-input.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/demo/validatable-input.html
new file mode 100644
index 00000000000..82803f04c13
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/demo/validatable-input.html
@@ -0,0 +1,53 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../iron-validatable-behavior.html">
+
+<dom-module id="validatable-input">
+ <template>
+ <style>
+ :host {
+ display: inline-block;
+ }
+ input {
+ padding: 0.4em;
+ font-size: 16px;
+ margin: 5px;
+ color: inherit;
+ }
+ </style>
+ <input id="input">
+ </template>
+ <script>
+ Polymer({
+ is: 'validatable-input',
+ properties: {
+ invalid: {
+ reflectToAttribute: true,
+ type: Boolean,
+ value: false
+ }
+ },
+
+ behaviors: [
+ Polymer.IronValidatableBehavior
+ ],
+
+ listeners: {
+ 'input': '_onInput'
+ },
+
+ _onInput: function() {
+ this.invalid = !this.validate(this.$.input.value);
+ }
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/index.html
new file mode 100644
index 00000000000..cfaa5b17598
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/index.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+
+ <title>iron-validatable-behavior</title>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../polymer/polymer.html">
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/iron-validatable-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/iron-validatable-behavior.d.ts
new file mode 100644
index 00000000000..e29ab43b844
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/iron-validatable-behavior.d.ts
@@ -0,0 +1,78 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * iron-validatable-behavior.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-meta/iron-meta.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * `Use Polymer.IronValidatableBehavior` to implement an element that validates user input.
+ * Use the related `Polymer.IronValidatorBehavior` to add custom validation logic to an iron-input.
+ *
+ * By default, an `<iron-form>` element validates its fields when the user presses the submit button.
+ * To validate a form imperatively, call the form's `validate()` method, which in turn will
+ * call `validate()` on all its children. By using `Polymer.IronValidatableBehavior`, your
+ * custom element will get a public `validate()`, which
+ * will return the validity of the element, and a corresponding `invalid` attribute,
+ * which can be used for styling.
+ *
+ * To implement the custom validation logic of your element, you must override
+ * the protected `_getValidity()` method of this behaviour, rather than `validate()`.
+ * See [this](https://github.com/PolymerElements/iron-form/blob/master/demo/simple-element.html)
+ * for an example.
+ *
+ * ### Accessibility
+ *
+ * Changing the `invalid` property, either manually or by calling `validate()` will update the
+ * `aria-invalid` attribute.
+ */
+ interface IronValidatableBehavior {
+
+ /**
+ * Name of the validator to use.
+ */
+ validator: string|null|undefined;
+
+ /**
+ * True if the last call to `validate` is invalid.
+ */
+ invalid: boolean|null|undefined;
+
+ /**
+ * Recompute this every time it's needed, because we don't know if the
+ * underlying IronValidatableBehaviorMeta has changed.
+ */
+ readonly _validator: any;
+ registered(): void;
+ _invalidChanged(): void;
+
+ /**
+ * @returns True if the validator `validator` exists.
+ */
+ hasValidator(): boolean;
+
+ /**
+ * Returns true if the `value` is valid, and updates `invalid`. If you want
+ * your element to have custom validation logic, do not override this method;
+ * override `_getValidity(value)` instead.
+ *
+ * @param value Deprecated: The value to be validated. By default,
+ * it is passed to the validator's `validate()` function, if a validator is set.
+ * If this argument is not specified, then the element's `value` property
+ * is used, if it exists.
+ * @returns True if `value` is valid.
+ */
+ validate(value: object|null): boolean;
+ _getValidity(value: any): any;
+ }
+
+ const IronValidatableBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/iron-validatable-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/iron-validatable-behavior.html
new file mode 100644
index 00000000000..646079ffae0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/iron-validatable-behavior.html
@@ -0,0 +1,131 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-meta/iron-meta.html">
+
+<script>
+ /**
+ * Singleton IronMeta instance.
+ */
+ Polymer.IronValidatableBehaviorMeta = null;
+
+ /**
+ * `Use Polymer.IronValidatableBehavior` to implement an element that validates user input.
+ * Use the related `Polymer.IronValidatorBehavior` to add custom validation logic to an iron-input.
+ *
+ * By default, an `<iron-form>` element validates its fields when the user presses the submit button.
+ * To validate a form imperatively, call the form's `validate()` method, which in turn will
+ * call `validate()` on all its children. By using `Polymer.IronValidatableBehavior`, your
+ * custom element will get a public `validate()`, which
+ * will return the validity of the element, and a corresponding `invalid` attribute,
+ * which can be used for styling.
+ *
+ * To implement the custom validation logic of your element, you must override
+ * the protected `_getValidity()` method of this behaviour, rather than `validate()`.
+ * See [this](https://github.com/PolymerElements/iron-form/blob/master/demo/simple-element.html)
+ * for an example.
+ *
+ * ### Accessibility
+ *
+ * Changing the `invalid` property, either manually or by calling `validate()` will update the
+ * `aria-invalid` attribute.
+ *
+ * @demo demo/index.html
+ * @polymerBehavior
+ */
+ Polymer.IronValidatableBehavior = {
+
+ properties: {
+ /**
+ * Name of the validator to use.
+ */
+ validator: {
+ type: String
+ },
+
+ /**
+ * True if the last call to `validate` is invalid.
+ */
+ invalid: {
+ notify: true,
+ reflectToAttribute: true,
+ type: Boolean,
+ value: false,
+ observer: '_invalidChanged'
+ },
+ },
+
+ registered: function() {
+ Polymer.IronValidatableBehaviorMeta = new Polymer.IronMeta({type: 'validator'});
+ },
+
+ _invalidChanged: function() {
+ if (this.invalid) {
+ this.setAttribute('aria-invalid', 'true');
+ } else {
+ this.removeAttribute('aria-invalid');
+ }
+ },
+
+ /* Recompute this every time it's needed, because we don't know if the
+ * underlying IronValidatableBehaviorMeta has changed. */
+ get _validator() {
+ return Polymer.IronValidatableBehaviorMeta &&
+ Polymer.IronValidatableBehaviorMeta.byKey(this.validator);
+ },
+
+ /**
+ * @return {boolean} True if the validator `validator` exists.
+ */
+ hasValidator: function() {
+ return this._validator != null;
+ },
+
+ /**
+ * Returns true if the `value` is valid, and updates `invalid`. If you want
+ * your element to have custom validation logic, do not override this method;
+ * override `_getValidity(value)` instead.
+
+ * @param {Object} value Deprecated: The value to be validated. By default,
+ * it is passed to the validator's `validate()` function, if a validator is set.
+ * If this argument is not specified, then the element's `value` property
+ * is used, if it exists.
+ * @return {boolean} True if `value` is valid.
+ */
+ validate: function(value) {
+ // If this is an element that also has a value property, and there was
+ // no explicit value argument passed, use the element's property instead.
+ if (value === undefined && this.value !== undefined)
+ this.invalid = !this._getValidity(this.value);
+ else
+ this.invalid = !this._getValidity(value);
+ return !this.invalid;
+ },
+
+ /**
+ * Returns true if `value` is valid. By default, it is passed
+ * to the validator's `validate()` function, if a validator is set. You
+ * should override this method if you want to implement custom validity
+ * logic for your element.
+ *
+ * @param {Object} value The value to be validated.
+ * @return {boolean} True if `value` is valid.
+ */
+
+ _getValidity: function(value) {
+ if (this.hasValidator()) {
+ return this._validator.validate(value);
+ }
+ return true;
+ }
+ };
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/package-lock.json
new file mode 100644
index 00000000000..86e77929590
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/package-lock.json
@@ -0,0 +1,974 @@
+{
+ "name": "@polymer/iron-validatable-behavior",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.0.tgz",
+ "integrity": "sha512-a5DFXI3TdZSVOMH4608LVaBLmcr+mwM2+B8OSBiB9WFNCtdqzUXwtB5We6vBzrThXlO4uRo7d2pEqjNXMAlEkA==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.0",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "4.1.0",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.0",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.12"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz",
+ "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.6.tgz",
+ "integrity": "sha512-CTUtLb6WqCCgp6P59QintjHWqzf4VL1uPA27bipLAPxFqrtK1gEYllePzTICGqQ8rYsCbpnsNypXjjDzGAAjEQ==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.8.tgz",
+ "integrity": "sha512-QqR0j08RCS1AQYPMRPHikEpcmK+2aEEbcSzWLwOqyJ4FhLmHUx/WjRrnn7tTQg/y4IKnMhzskh/o7qvGIZZ7iA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.0.0.tgz",
+ "integrity": "sha512-v+0wW9Wezwsyb0uF4aBVCjmSqit3Ru7PZFziGF0o2KwTvN2zWfTi3BRLq9EkJFdg3eBbyERXGTntVpBxH1J68Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.2",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
+ "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "4.0.0",
+ "array-back": "2.0.0",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz",
+ "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.5.7"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.8",
+ "winston": "2.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-QQL70IC85hI6q9uQeresEMcT1Qf8YR/zDe1qG8WWeeFAZk8z0lmzUpsfcAWz+bM4wpDdXrtd4HitIs4p0CHl/w==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.101",
+ "@types/parse5": "2.2.34",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "polymer-project-config": "3.8.1",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.1"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.8.1.tgz",
+ "integrity": "sha512-MLvnM9gexFWg7nynY24eHZG6NLXocmk718sVds/sx2CAJ6iihhC0JMhhOIa6jnad9KQrHyGl/cs3mMRaaub5Fg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.101",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.1.tgz",
+ "integrity": "sha1-Eahr7+rDxKo+wIYjZRo8gabQu8g=",
+ "dev": true
+ },
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/package.json
new file mode 100644
index 00000000000..2e01f44783c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/iron-validatable-behavior/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@polymer/iron-validatable-behavior",
+ "private": true,
+ "description": "Provides a behavior for an element that validates user input",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/iron-validatable-behavior.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir ."
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/lodash/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/lodash/.bower.json
new file mode 100644
index 00000000000..a8f9c4748b0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/lodash/.bower.json
@@ -0,0 +1,30 @@
+{
+ "name": "lodash",
+ "main": "lodash.js",
+ "ignore": [
+ ".*",
+ "*.custom.*",
+ "*.log",
+ "*.map",
+ "*.md",
+ "lodash.src.js",
+ "component.json",
+ "package.json",
+ "doc",
+ "node_modules",
+ "perf",
+ "test",
+ "vendor"
+ ],
+ "homepage": "https://github.com/lodash/lodash",
+ "version": "3.10.1",
+ "_release": "3.10.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "3.10.1",
+ "commit": "ef20b4290cc4fe7551c82a552ea7ffa76548eec8"
+ },
+ "_source": "https://github.com/lodash/lodash.git",
+ "_target": "^3.7.0",
+ "_originalSource": "lodash"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/lodash/LICENSE b/chromium/third_party/catapult/third_party/polymer2/bower_components/lodash/LICENSE
new file mode 100644
index 00000000000..9cd87e5dcef
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/lodash/LICENSE
@@ -0,0 +1,22 @@
+Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+Based on Underscore.js, copyright 2009-2015 Jeremy Ashkenas,
+DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/lodash/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/lodash/bower.json
new file mode 100644
index 00000000000..23c390577d1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/lodash/bower.json
@@ -0,0 +1,19 @@
+{
+ "name": "lodash",
+ "main": "lodash.js",
+ "ignore": [
+ ".*",
+ "*.custom.*",
+ "*.log",
+ "*.map",
+ "*.md",
+ "lodash.src.js",
+ "component.json",
+ "package.json",
+ "doc",
+ "node_modules",
+ "perf",
+ "test",
+ "vendor"
+ ]
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/lodash/lodash.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/lodash/lodash.js
new file mode 100644
index 00000000000..d1f45b6ecd6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/lodash/lodash.js
@@ -0,0 +1,12352 @@
+/**
+ * @license
+ * lodash 3.10.1 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern -o ./lodash.js`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+;(function() {
+
+ /** Used as a safe reference for `undefined` in pre-ES5 environments. */
+ var undefined;
+
+ /** Used as the semantic version number. */
+ var VERSION = '3.10.1';
+
+ /** Used to compose bitmasks for wrapper metadata. */
+ var BIND_FLAG = 1,
+ BIND_KEY_FLAG = 2,
+ CURRY_BOUND_FLAG = 4,
+ CURRY_FLAG = 8,
+ CURRY_RIGHT_FLAG = 16,
+ PARTIAL_FLAG = 32,
+ PARTIAL_RIGHT_FLAG = 64,
+ ARY_FLAG = 128,
+ REARG_FLAG = 256;
+
+ /** Used as default options for `_.trunc`. */
+ var DEFAULT_TRUNC_LENGTH = 30,
+ DEFAULT_TRUNC_OMISSION = '...';
+
+ /** Used to detect when a function becomes hot. */
+ var HOT_COUNT = 150,
+ HOT_SPAN = 16;
+
+ /** Used as the size to enable large array optimizations. */
+ var LARGE_ARRAY_SIZE = 200;
+
+ /** Used to indicate the type of lazy iteratees. */
+ var LAZY_FILTER_FLAG = 1,
+ LAZY_MAP_FLAG = 2;
+
+ /** Used as the `TypeError` message for "Functions" methods. */
+ var FUNC_ERROR_TEXT = 'Expected a function';
+
+ /** Used as the internal argument placeholder. */
+ var PLACEHOLDER = '__lodash_placeholder__';
+
+ /** `Object#toString` result references. */
+ var argsTag = '[object Arguments]',
+ arrayTag = '[object Array]',
+ boolTag = '[object Boolean]',
+ dateTag = '[object Date]',
+ errorTag = '[object Error]',
+ funcTag = '[object Function]',
+ mapTag = '[object Map]',
+ numberTag = '[object Number]',
+ objectTag = '[object Object]',
+ regexpTag = '[object RegExp]',
+ setTag = '[object Set]',
+ stringTag = '[object String]',
+ weakMapTag = '[object WeakMap]';
+
+ var arrayBufferTag = '[object ArrayBuffer]',
+ float32Tag = '[object Float32Array]',
+ float64Tag = '[object Float64Array]',
+ int8Tag = '[object Int8Array]',
+ int16Tag = '[object Int16Array]',
+ int32Tag = '[object Int32Array]',
+ uint8Tag = '[object Uint8Array]',
+ uint8ClampedTag = '[object Uint8ClampedArray]',
+ uint16Tag = '[object Uint16Array]',
+ uint32Tag = '[object Uint32Array]';
+
+ /** Used to match empty string literals in compiled template source. */
+ var reEmptyStringLeading = /\b__p \+= '';/g,
+ reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
+ reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
+
+ /** Used to match HTML entities and HTML characters. */
+ var reEscapedHtml = /&(?:amp|lt|gt|quot|#39|#96);/g,
+ reUnescapedHtml = /[&<>"'`]/g,
+ reHasEscapedHtml = RegExp(reEscapedHtml.source),
+ reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
+
+ /** Used to match template delimiters. */
+ var reEscape = /<%-([\s\S]+?)%>/g,
+ reEvaluate = /<%([\s\S]+?)%>/g,
+ reInterpolate = /<%=([\s\S]+?)%>/g;
+
+ /** Used to match property names within property paths. */
+ var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/,
+ reIsPlainProp = /^\w*$/,
+ rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g;
+
+ /**
+ * Used to match `RegExp` [syntax characters](http://ecma-international.org/ecma-262/6.0/#sec-patterns)
+ * and those outlined by [`EscapeRegExpPattern`](http://ecma-international.org/ecma-262/6.0/#sec-escaperegexppattern).
+ */
+ var reRegExpChars = /^[:!,]|[\\^$.*+?()[\]{}|\/]|(^[0-9a-fA-Fnrtuvx])|([\n\r\u2028\u2029])/g,
+ reHasRegExpChars = RegExp(reRegExpChars.source);
+
+ /** Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). */
+ var reComboMark = /[\u0300-\u036f\ufe20-\ufe23]/g;
+
+ /** Used to match backslashes in property paths. */
+ var reEscapeChar = /\\(\\)?/g;
+
+ /** Used to match [ES template delimiters](http://ecma-international.org/ecma-262/6.0/#sec-template-literal-lexical-components). */
+ var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
+
+ /** Used to match `RegExp` flags from their coerced string values. */
+ var reFlags = /\w*$/;
+
+ /** Used to detect hexadecimal string values. */
+ var reHasHexPrefix = /^0[xX]/;
+
+ /** Used to detect host constructors (Safari > 5). */
+ var reIsHostCtor = /^\[object .+?Constructor\]$/;
+
+ /** Used to detect unsigned integer values. */
+ var reIsUint = /^\d+$/;
+
+ /** Used to match latin-1 supplementary letters (excluding mathematical operators). */
+ var reLatin1 = /[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g;
+
+ /** Used to ensure capturing order of template delimiters. */
+ var reNoMatch = /($^)/;
+
+ /** Used to match unescaped characters in compiled string literals. */
+ var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
+
+ /** Used to match words to create compound words. */
+ var reWords = (function() {
+ var upper = '[A-Z\\xc0-\\xd6\\xd8-\\xde]',
+ lower = '[a-z\\xdf-\\xf6\\xf8-\\xff]+';
+
+ return RegExp(upper + '+(?=' + upper + lower + ')|' + upper + '?' + lower + '|' + upper + '+|[0-9]+', 'g');
+ }());
+
+ /** Used to assign default `context` object properties. */
+ var contextProps = [
+ 'Array', 'ArrayBuffer', 'Date', 'Error', 'Float32Array', 'Float64Array',
+ 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Math', 'Number',
+ 'Object', 'RegExp', 'Set', 'String', '_', 'clearTimeout', 'isFinite',
+ 'parseFloat', 'parseInt', 'setTimeout', 'TypeError', 'Uint8Array',
+ 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap'
+ ];
+
+ /** Used to make template sourceURLs easier to identify. */
+ var templateCounter = -1;
+
+ /** Used to identify `toStringTag` values of typed arrays. */
+ var typedArrayTags = {};
+ typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
+ typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
+ typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
+ typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
+ typedArrayTags[uint32Tag] = true;
+ typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
+ typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
+ typedArrayTags[dateTag] = typedArrayTags[errorTag] =
+ typedArrayTags[funcTag] = typedArrayTags[mapTag] =
+ typedArrayTags[numberTag] = typedArrayTags[objectTag] =
+ typedArrayTags[regexpTag] = typedArrayTags[setTag] =
+ typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
+
+ /** Used to identify `toStringTag` values supported by `_.clone`. */
+ var cloneableTags = {};
+ cloneableTags[argsTag] = cloneableTags[arrayTag] =
+ cloneableTags[arrayBufferTag] = cloneableTags[boolTag] =
+ cloneableTags[dateTag] = cloneableTags[float32Tag] =
+ cloneableTags[float64Tag] = cloneableTags[int8Tag] =
+ cloneableTags[int16Tag] = cloneableTags[int32Tag] =
+ cloneableTags[numberTag] = cloneableTags[objectTag] =
+ cloneableTags[regexpTag] = cloneableTags[stringTag] =
+ cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
+ cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
+ cloneableTags[errorTag] = cloneableTags[funcTag] =
+ cloneableTags[mapTag] = cloneableTags[setTag] =
+ cloneableTags[weakMapTag] = false;
+
+ /** Used to map latin-1 supplementary letters to basic latin letters. */
+ var deburredLetters = {
+ '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
+ '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
+ '\xc7': 'C', '\xe7': 'c',
+ '\xd0': 'D', '\xf0': 'd',
+ '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
+ '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
+ '\xcC': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
+ '\xeC': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i',
+ '\xd1': 'N', '\xf1': 'n',
+ '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
+ '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
+ '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
+ '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
+ '\xdd': 'Y', '\xfd': 'y', '\xff': 'y',
+ '\xc6': 'Ae', '\xe6': 'ae',
+ '\xde': 'Th', '\xfe': 'th',
+ '\xdf': 'ss'
+ };
+
+ /** Used to map characters to HTML entities. */
+ var htmlEscapes = {
+ '&': '&amp;',
+ '<': '&lt;',
+ '>': '&gt;',
+ '"': '&quot;',
+ "'": '&#39;',
+ '`': '&#96;'
+ };
+
+ /** Used to map HTML entities to characters. */
+ var htmlUnescapes = {
+ '&amp;': '&',
+ '&lt;': '<',
+ '&gt;': '>',
+ '&quot;': '"',
+ '&#39;': "'",
+ '&#96;': '`'
+ };
+
+ /** Used to determine if values are of the language type `Object`. */
+ var objectTypes = {
+ 'function': true,
+ 'object': true
+ };
+
+ /** Used to escape characters for inclusion in compiled regexes. */
+ var regexpEscapes = {
+ '0': 'x30', '1': 'x31', '2': 'x32', '3': 'x33', '4': 'x34',
+ '5': 'x35', '6': 'x36', '7': 'x37', '8': 'x38', '9': 'x39',
+ 'A': 'x41', 'B': 'x42', 'C': 'x43', 'D': 'x44', 'E': 'x45', 'F': 'x46',
+ 'a': 'x61', 'b': 'x62', 'c': 'x63', 'd': 'x64', 'e': 'x65', 'f': 'x66',
+ 'n': 'x6e', 'r': 'x72', 't': 'x74', 'u': 'x75', 'v': 'x76', 'x': 'x78'
+ };
+
+ /** Used to escape characters for inclusion in compiled string literals. */
+ var stringEscapes = {
+ '\\': '\\',
+ "'": "'",
+ '\n': 'n',
+ '\r': 'r',
+ '\u2028': 'u2028',
+ '\u2029': 'u2029'
+ };
+
+ /** Detect free variable `exports`. */
+ var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;
+
+ /** Detect free variable `module`. */
+ var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;
+
+ /** Detect free variable `global` from Node.js. */
+ var freeGlobal = freeExports && freeModule && typeof global == 'object' && global && global.Object && global;
+
+ /** Detect free variable `self`. */
+ var freeSelf = objectTypes[typeof self] && self && self.Object && self;
+
+ /** Detect free variable `window`. */
+ var freeWindow = objectTypes[typeof window] && window && window.Object && window;
+
+ /** Detect the popular CommonJS extension `module.exports`. */
+ var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;
+
+ /**
+ * Used as a reference to the global object.
+ *
+ * The `this` value is used if it's the global object to avoid Greasemonkey's
+ * restricted `window` object, otherwise the `window` object is used.
+ */
+ var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || freeSelf || this;
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * The base implementation of `compareAscending` which compares values and
+ * sorts them in ascending order without guaranteeing a stable sort.
+ *
+ * @private
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {number} Returns the sort order indicator for `value`.
+ */
+ function baseCompareAscending(value, other) {
+ if (value !== other) {
+ var valIsNull = value === null,
+ valIsUndef = value === undefined,
+ valIsReflexive = value === value;
+
+ var othIsNull = other === null,
+ othIsUndef = other === undefined,
+ othIsReflexive = other === other;
+
+ if ((value > other && !othIsNull) || !valIsReflexive ||
+ (valIsNull && !othIsUndef && othIsReflexive) ||
+ (valIsUndef && othIsReflexive)) {
+ return 1;
+ }
+ if ((value < other && !valIsNull) || !othIsReflexive ||
+ (othIsNull && !valIsUndef && valIsReflexive) ||
+ (othIsUndef && valIsReflexive)) {
+ return -1;
+ }
+ }
+ return 0;
+ }
+
+ /**
+ * The base implementation of `_.findIndex` and `_.findLastIndex` without
+ * support for callback shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to search.
+ * @param {Function} predicate The function invoked per iteration.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
+ function baseFindIndex(array, predicate, fromRight) {
+ var length = array.length,
+ index = fromRight ? length : -1;
+
+ while ((fromRight ? index-- : ++index < length)) {
+ if (predicate(array[index], index, array)) {
+ return index;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * The base implementation of `_.indexOf` without support for binary searches.
+ *
+ * @private
+ * @param {Array} array The array to search.
+ * @param {*} value The value to search for.
+ * @param {number} fromIndex The index to search from.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
+ function baseIndexOf(array, value, fromIndex) {
+ if (value !== value) {
+ return indexOfNaN(array, fromIndex);
+ }
+ var index = fromIndex - 1,
+ length = array.length;
+
+ while (++index < length) {
+ if (array[index] === value) {
+ return index;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * The base implementation of `_.isFunction` without support for environments
+ * with incorrect `typeof` results.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ */
+ function baseIsFunction(value) {
+ // Avoid a Chakra JIT bug in compatibility modes of IE 11.
+ // See https://github.com/jashkenas/underscore/issues/1621 for more details.
+ return typeof value == 'function' || false;
+ }
+
+ /**
+ * Converts `value` to a string if it's not one. An empty string is returned
+ * for `null` or `undefined` values.
+ *
+ * @private
+ * @param {*} value The value to process.
+ * @returns {string} Returns the string.
+ */
+ function baseToString(value) {
+ return value == null ? '' : (value + '');
+ }
+
+ /**
+ * Used by `_.trim` and `_.trimLeft` to get the index of the first character
+ * of `string` that is not found in `chars`.
+ *
+ * @private
+ * @param {string} string The string to inspect.
+ * @param {string} chars The characters to find.
+ * @returns {number} Returns the index of the first character not found in `chars`.
+ */
+ function charsLeftIndex(string, chars) {
+ var index = -1,
+ length = string.length;
+
+ while (++index < length && chars.indexOf(string.charAt(index)) > -1) {}
+ return index;
+ }
+
+ /**
+ * Used by `_.trim` and `_.trimRight` to get the index of the last character
+ * of `string` that is not found in `chars`.
+ *
+ * @private
+ * @param {string} string The string to inspect.
+ * @param {string} chars The characters to find.
+ * @returns {number} Returns the index of the last character not found in `chars`.
+ */
+ function charsRightIndex(string, chars) {
+ var index = string.length;
+
+ while (index-- && chars.indexOf(string.charAt(index)) > -1) {}
+ return index;
+ }
+
+ /**
+ * Used by `_.sortBy` to compare transformed elements of a collection and stable
+ * sort them in ascending order.
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @returns {number} Returns the sort order indicator for `object`.
+ */
+ function compareAscending(object, other) {
+ return baseCompareAscending(object.criteria, other.criteria) || (object.index - other.index);
+ }
+
+ /**
+ * Used by `_.sortByOrder` to compare multiple properties of a value to another
+ * and stable sort them.
+ *
+ * If `orders` is unspecified, all valuess are sorted in ascending order. Otherwise,
+ * a value is sorted in ascending order if its corresponding order is "asc", and
+ * descending if "desc".
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @param {boolean[]} orders The order to sort by for each property.
+ * @returns {number} Returns the sort order indicator for `object`.
+ */
+ function compareMultiple(object, other, orders) {
+ var index = -1,
+ objCriteria = object.criteria,
+ othCriteria = other.criteria,
+ length = objCriteria.length,
+ ordersLength = orders.length;
+
+ while (++index < length) {
+ var result = baseCompareAscending(objCriteria[index], othCriteria[index]);
+ if (result) {
+ if (index >= ordersLength) {
+ return result;
+ }
+ var order = orders[index];
+ return result * ((order === 'asc' || order === true) ? 1 : -1);
+ }
+ }
+ // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
+ // that causes it, under certain circumstances, to provide the same value for
+ // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
+ // for more details.
+ //
+ // This also ensures a stable sort in V8 and other engines.
+ // See https://code.google.com/p/v8/issues/detail?id=90 for more details.
+ return object.index - other.index;
+ }
+
+ /**
+ * Used by `_.deburr` to convert latin-1 supplementary letters to basic latin letters.
+ *
+ * @private
+ * @param {string} letter The matched letter to deburr.
+ * @returns {string} Returns the deburred letter.
+ */
+ function deburrLetter(letter) {
+ return deburredLetters[letter];
+ }
+
+ /**
+ * Used by `_.escape` to convert characters to HTML entities.
+ *
+ * @private
+ * @param {string} chr The matched character to escape.
+ * @returns {string} Returns the escaped character.
+ */
+ function escapeHtmlChar(chr) {
+ return htmlEscapes[chr];
+ }
+
+ /**
+ * Used by `_.escapeRegExp` to escape characters for inclusion in compiled regexes.
+ *
+ * @private
+ * @param {string} chr The matched character to escape.
+ * @param {string} leadingChar The capture group for a leading character.
+ * @param {string} whitespaceChar The capture group for a whitespace character.
+ * @returns {string} Returns the escaped character.
+ */
+ function escapeRegExpChar(chr, leadingChar, whitespaceChar) {
+ if (leadingChar) {
+ chr = regexpEscapes[chr];
+ } else if (whitespaceChar) {
+ chr = stringEscapes[chr];
+ }
+ return '\\' + chr;
+ }
+
+ /**
+ * Used by `_.template` to escape characters for inclusion in compiled string literals.
+ *
+ * @private
+ * @param {string} chr The matched character to escape.
+ * @returns {string} Returns the escaped character.
+ */
+ function escapeStringChar(chr) {
+ return '\\' + stringEscapes[chr];
+ }
+
+ /**
+ * Gets the index at which the first occurrence of `NaN` is found in `array`.
+ *
+ * @private
+ * @param {Array} array The array to search.
+ * @param {number} fromIndex The index to search from.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {number} Returns the index of the matched `NaN`, else `-1`.
+ */
+ function indexOfNaN(array, fromIndex, fromRight) {
+ var length = array.length,
+ index = fromIndex + (fromRight ? 0 : -1);
+
+ while ((fromRight ? index-- : ++index < length)) {
+ var other = array[index];
+ if (other !== other) {
+ return index;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Checks if `value` is object-like.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ */
+ function isObjectLike(value) {
+ return !!value && typeof value == 'object';
+ }
+
+ /**
+ * Used by `trimmedLeftIndex` and `trimmedRightIndex` to determine if a
+ * character code is whitespace.
+ *
+ * @private
+ * @param {number} charCode The character code to inspect.
+ * @returns {boolean} Returns `true` if `charCode` is whitespace, else `false`.
+ */
+ function isSpace(charCode) {
+ return ((charCode <= 160 && (charCode >= 9 && charCode <= 13) || charCode == 32 || charCode == 160) || charCode == 5760 || charCode == 6158 ||
+ (charCode >= 8192 && (charCode <= 8202 || charCode == 8232 || charCode == 8233 || charCode == 8239 || charCode == 8287 || charCode == 12288 || charCode == 65279)));
+ }
+
+ /**
+ * Replaces all `placeholder` elements in `array` with an internal placeholder
+ * and returns an array of their indexes.
+ *
+ * @private
+ * @param {Array} array The array to modify.
+ * @param {*} placeholder The placeholder to replace.
+ * @returns {Array} Returns the new array of placeholder indexes.
+ */
+ function replaceHolders(array, placeholder) {
+ var index = -1,
+ length = array.length,
+ resIndex = -1,
+ result = [];
+
+ while (++index < length) {
+ if (array[index] === placeholder) {
+ array[index] = PLACEHOLDER;
+ result[++resIndex] = index;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * An implementation of `_.uniq` optimized for sorted arrays without support
+ * for callback shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {Function} [iteratee] The function invoked per iteration.
+ * @returns {Array} Returns the new duplicate free array.
+ */
+ function sortedUniq(array, iteratee) {
+ var seen,
+ index = -1,
+ length = array.length,
+ resIndex = -1,
+ result = [];
+
+ while (++index < length) {
+ var value = array[index],
+ computed = iteratee ? iteratee(value, index, array) : value;
+
+ if (!index || seen !== computed) {
+ seen = computed;
+ result[++resIndex] = value;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Used by `_.trim` and `_.trimLeft` to get the index of the first non-whitespace
+ * character of `string`.
+ *
+ * @private
+ * @param {string} string The string to inspect.
+ * @returns {number} Returns the index of the first non-whitespace character.
+ */
+ function trimmedLeftIndex(string) {
+ var index = -1,
+ length = string.length;
+
+ while (++index < length && isSpace(string.charCodeAt(index))) {}
+ return index;
+ }
+
+ /**
+ * Used by `_.trim` and `_.trimRight` to get the index of the last non-whitespace
+ * character of `string`.
+ *
+ * @private
+ * @param {string} string The string to inspect.
+ * @returns {number} Returns the index of the last non-whitespace character.
+ */
+ function trimmedRightIndex(string) {
+ var index = string.length;
+
+ while (index-- && isSpace(string.charCodeAt(index))) {}
+ return index;
+ }
+
+ /**
+ * Used by `_.unescape` to convert HTML entities to characters.
+ *
+ * @private
+ * @param {string} chr The matched character to unescape.
+ * @returns {string} Returns the unescaped character.
+ */
+ function unescapeHtmlChar(chr) {
+ return htmlUnescapes[chr];
+ }
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * Create a new pristine `lodash` function using the given `context` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Utility
+ * @param {Object} [context=root] The context object.
+ * @returns {Function} Returns a new `lodash` function.
+ * @example
+ *
+ * _.mixin({ 'foo': _.constant('foo') });
+ *
+ * var lodash = _.runInContext();
+ * lodash.mixin({ 'bar': lodash.constant('bar') });
+ *
+ * _.isFunction(_.foo);
+ * // => true
+ * _.isFunction(_.bar);
+ * // => false
+ *
+ * lodash.isFunction(lodash.foo);
+ * // => false
+ * lodash.isFunction(lodash.bar);
+ * // => true
+ *
+ * // using `context` to mock `Date#getTime` use in `_.now`
+ * var mock = _.runInContext({
+ * 'Date': function() {
+ * return { 'getTime': getTimeMock };
+ * }
+ * });
+ *
+ * // or creating a suped-up `defer` in Node.js
+ * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
+ */
+ function runInContext(context) {
+ // Avoid issues with some ES3 environments that attempt to use values, named
+ // after built-in constructors like `Object`, for the creation of literals.
+ // ES5 clears this up by stating that literals must use built-in constructors.
+ // See https://es5.github.io/#x11.1.5 for more details.
+ context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;
+
+ /** Native constructor references. */
+ var Array = context.Array,
+ Date = context.Date,
+ Error = context.Error,
+ Function = context.Function,
+ Math = context.Math,
+ Number = context.Number,
+ Object = context.Object,
+ RegExp = context.RegExp,
+ String = context.String,
+ TypeError = context.TypeError;
+
+ /** Used for native method references. */
+ var arrayProto = Array.prototype,
+ objectProto = Object.prototype,
+ stringProto = String.prototype;
+
+ /** Used to resolve the decompiled source of functions. */
+ var fnToString = Function.prototype.toString;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty = objectProto.hasOwnProperty;
+
+ /** Used to generate unique IDs. */
+ var idCounter = 0;
+
+ /**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+ var objToString = objectProto.toString;
+
+ /** Used to restore the original `_` reference in `_.noConflict`. */
+ var oldDash = root._;
+
+ /** Used to detect if a method is native. */
+ var reIsNative = RegExp('^' +
+ fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
+ .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
+ );
+
+ /** Native method references. */
+ var ArrayBuffer = context.ArrayBuffer,
+ clearTimeout = context.clearTimeout,
+ parseFloat = context.parseFloat,
+ pow = Math.pow,
+ propertyIsEnumerable = objectProto.propertyIsEnumerable,
+ Set = getNative(context, 'Set'),
+ setTimeout = context.setTimeout,
+ splice = arrayProto.splice,
+ Uint8Array = context.Uint8Array,
+ WeakMap = getNative(context, 'WeakMap');
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeCeil = Math.ceil,
+ nativeCreate = getNative(Object, 'create'),
+ nativeFloor = Math.floor,
+ nativeIsArray = getNative(Array, 'isArray'),
+ nativeIsFinite = context.isFinite,
+ nativeKeys = getNative(Object, 'keys'),
+ nativeMax = Math.max,
+ nativeMin = Math.min,
+ nativeNow = getNative(Date, 'now'),
+ nativeParseInt = context.parseInt,
+ nativeRandom = Math.random;
+
+ /** Used as references for `-Infinity` and `Infinity`. */
+ var NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY,
+ POSITIVE_INFINITY = Number.POSITIVE_INFINITY;
+
+ /** Used as references for the maximum length and index of an array. */
+ var MAX_ARRAY_LENGTH = 4294967295,
+ MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
+ HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
+
+ /**
+ * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
+ * of an array-like value.
+ */
+ var MAX_SAFE_INTEGER = 9007199254740991;
+
+ /** Used to store function metadata. */
+ var metaMap = WeakMap && new WeakMap;
+
+ /** Used to lookup unminified function names. */
+ var realNames = {};
+
+ /*------------------------------------------------------------------------*/
+
+ /**
+ * Creates a `lodash` object which wraps `value` to enable implicit chaining.
+ * Methods that operate on and return arrays, collections, and functions can
+ * be chained together. Methods that retrieve a single value or may return a
+ * primitive value will automatically end the chain returning the unwrapped
+ * value. Explicit chaining may be enabled using `_.chain`. The execution of
+ * chained methods is lazy, that is, execution is deferred until `_#value`
+ * is implicitly or explicitly called.
+ *
+ * Lazy evaluation allows several methods to support shortcut fusion. Shortcut
+ * fusion is an optimization strategy which merge iteratee calls; this can help
+ * to avoid the creation of intermediate data structures and greatly reduce the
+ * number of iteratee executions.
+ *
+ * Chaining is supported in custom builds as long as the `_#value` method is
+ * directly or indirectly included in the build.
+ *
+ * In addition to lodash methods, wrappers have `Array` and `String` methods.
+ *
+ * The wrapper `Array` methods are:
+ * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`,
+ * `splice`, and `unshift`
+ *
+ * The wrapper `String` methods are:
+ * `replace` and `split`
+ *
+ * The wrapper methods that support shortcut fusion are:
+ * `compact`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `filter`,
+ * `first`, `initial`, `last`, `map`, `pluck`, `reject`, `rest`, `reverse`,
+ * `slice`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `toArray`,
+ * and `where`
+ *
+ * The chainable wrapper methods are:
+ * `after`, `ary`, `assign`, `at`, `before`, `bind`, `bindAll`, `bindKey`,
+ * `callback`, `chain`, `chunk`, `commit`, `compact`, `concat`, `constant`,
+ * `countBy`, `create`, `curry`, `debounce`, `defaults`, `defaultsDeep`,
+ * `defer`, `delay`, `difference`, `drop`, `dropRight`, `dropRightWhile`,
+ * `dropWhile`, `fill`, `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`,
+ * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,
+ * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,
+ * `invoke`, `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`,
+ * `matchesProperty`, `memoize`, `merge`, `method`, `methodOf`, `mixin`,
+ * `modArgs`, `negate`, `omit`, `once`, `pairs`, `partial`, `partialRight`,
+ * `partition`, `pick`, `plant`, `pluck`, `property`, `propertyOf`, `pull`,
+ * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `restParam`,
+ * `reverse`, `set`, `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`,
+ * `sortByOrder`, `splice`, `spread`, `take`, `takeRight`, `takeRightWhile`,
+ * `takeWhile`, `tap`, `throttle`, `thru`, `times`, `toArray`, `toPlainObject`,
+ * `transform`, `union`, `uniq`, `unshift`, `unzip`, `unzipWith`, `values`,
+ * `valuesIn`, `where`, `without`, `wrap`, `xor`, `zip`, `zipObject`, `zipWith`
+ *
+ * The wrapper methods that are **not** chainable by default are:
+ * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clone`, `cloneDeep`,
+ * `deburr`, `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`,
+ * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`,
+ * `floor`, `get`, `gt`, `gte`, `has`, `identity`, `includes`, `indexOf`,
+ * `inRange`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,
+ * `isEmpty`, `isEqual`, `isError`, `isFinite` `isFunction`, `isMatch`,
+ * `isNative`, `isNaN`, `isNull`, `isNumber`, `isObject`, `isPlainObject`,
+ * `isRegExp`, `isString`, `isUndefined`, `isTypedArray`, `join`, `kebabCase`,
+ * `last`, `lastIndexOf`, `lt`, `lte`, `max`, `min`, `noConflict`, `noop`,
+ * `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`, `random`, `reduce`,
+ * `reduceRight`, `repeat`, `result`, `round`, `runInContext`, `shift`, `size`,
+ * `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`, `startCase`,
+ * `startsWith`, `sum`, `template`, `trim`, `trimLeft`, `trimRight`, `trunc`,
+ * `unescape`, `uniqueId`, `value`, and `words`
+ *
+ * The wrapper method `sample` will return a wrapped value when `n` is provided,
+ * otherwise an unwrapped value is returned.
+ *
+ * @name _
+ * @constructor
+ * @category Chain
+ * @param {*} value The value to wrap in a `lodash` instance.
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * var wrapped = _([1, 2, 3]);
+ *
+ * // returns an unwrapped value
+ * wrapped.reduce(function(total, n) {
+ * return total + n;
+ * });
+ * // => 6
+ *
+ * // returns a wrapped value
+ * var squares = wrapped.map(function(n) {
+ * return n * n;
+ * });
+ *
+ * _.isArray(squares);
+ * // => false
+ *
+ * _.isArray(squares.value());
+ * // => true
+ */
+ function lodash(value) {
+ if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
+ if (value instanceof LodashWrapper) {
+ return value;
+ }
+ if (hasOwnProperty.call(value, '__chain__') && hasOwnProperty.call(value, '__wrapped__')) {
+ return wrapperClone(value);
+ }
+ }
+ return new LodashWrapper(value);
+ }
+
+ /**
+ * The function whose prototype all chaining wrappers inherit from.
+ *
+ * @private
+ */
+ function baseLodash() {
+ // No operation performed.
+ }
+
+ /**
+ * The base constructor for creating `lodash` wrapper objects.
+ *
+ * @private
+ * @param {*} value The value to wrap.
+ * @param {boolean} [chainAll] Enable chaining for all wrapper methods.
+ * @param {Array} [actions=[]] Actions to peform to resolve the unwrapped value.
+ */
+ function LodashWrapper(value, chainAll, actions) {
+ this.__wrapped__ = value;
+ this.__actions__ = actions || [];
+ this.__chain__ = !!chainAll;
+ }
+
+ /**
+ * An object environment feature flags.
+ *
+ * @static
+ * @memberOf _
+ * @type Object
+ */
+ var support = lodash.support = {};
+
+ /**
+ * By default, the template delimiters used by lodash are like those in
+ * embedded Ruby (ERB). Change the following template settings to use
+ * alternative delimiters.
+ *
+ * @static
+ * @memberOf _
+ * @type Object
+ */
+ lodash.templateSettings = {
+
+ /**
+ * Used to detect `data` property values to be HTML-escaped.
+ *
+ * @memberOf _.templateSettings
+ * @type RegExp
+ */
+ 'escape': reEscape,
+
+ /**
+ * Used to detect code to be evaluated.
+ *
+ * @memberOf _.templateSettings
+ * @type RegExp
+ */
+ 'evaluate': reEvaluate,
+
+ /**
+ * Used to detect `data` property values to inject.
+ *
+ * @memberOf _.templateSettings
+ * @type RegExp
+ */
+ 'interpolate': reInterpolate,
+
+ /**
+ * Used to reference the data object in the template text.
+ *
+ * @memberOf _.templateSettings
+ * @type string
+ */
+ 'variable': '',
+
+ /**
+ * Used to import variables into the compiled template.
+ *
+ * @memberOf _.templateSettings
+ * @type Object
+ */
+ 'imports': {
+
+ /**
+ * A reference to the `lodash` function.
+ *
+ * @memberOf _.templateSettings.imports
+ * @type Function
+ */
+ '_': lodash
+ }
+ };
+
+ /*------------------------------------------------------------------------*/
+
+ /**
+ * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
+ *
+ * @private
+ * @param {*} value The value to wrap.
+ */
+ function LazyWrapper(value) {
+ this.__wrapped__ = value;
+ this.__actions__ = [];
+ this.__dir__ = 1;
+ this.__filtered__ = false;
+ this.__iteratees__ = [];
+ this.__takeCount__ = POSITIVE_INFINITY;
+ this.__views__ = [];
+ }
+
+ /**
+ * Creates a clone of the lazy wrapper object.
+ *
+ * @private
+ * @name clone
+ * @memberOf LazyWrapper
+ * @returns {Object} Returns the cloned `LazyWrapper` object.
+ */
+ function lazyClone() {
+ var result = new LazyWrapper(this.__wrapped__);
+ result.__actions__ = arrayCopy(this.__actions__);
+ result.__dir__ = this.__dir__;
+ result.__filtered__ = this.__filtered__;
+ result.__iteratees__ = arrayCopy(this.__iteratees__);
+ result.__takeCount__ = this.__takeCount__;
+ result.__views__ = arrayCopy(this.__views__);
+ return result;
+ }
+
+ /**
+ * Reverses the direction of lazy iteration.
+ *
+ * @private
+ * @name reverse
+ * @memberOf LazyWrapper
+ * @returns {Object} Returns the new reversed `LazyWrapper` object.
+ */
+ function lazyReverse() {
+ if (this.__filtered__) {
+ var result = new LazyWrapper(this);
+ result.__dir__ = -1;
+ result.__filtered__ = true;
+ } else {
+ result = this.clone();
+ result.__dir__ *= -1;
+ }
+ return result;
+ }
+
+ /**
+ * Extracts the unwrapped value from its lazy wrapper.
+ *
+ * @private
+ * @name value
+ * @memberOf LazyWrapper
+ * @returns {*} Returns the unwrapped value.
+ */
+ function lazyValue() {
+ var array = this.__wrapped__.value(),
+ dir = this.__dir__,
+ isArr = isArray(array),
+ isRight = dir < 0,
+ arrLength = isArr ? array.length : 0,
+ view = getView(0, arrLength, this.__views__),
+ start = view.start,
+ end = view.end,
+ length = end - start,
+ index = isRight ? end : (start - 1),
+ iteratees = this.__iteratees__,
+ iterLength = iteratees.length,
+ resIndex = 0,
+ takeCount = nativeMin(length, this.__takeCount__);
+
+ if (!isArr || arrLength < LARGE_ARRAY_SIZE || (arrLength == length && takeCount == length)) {
+ return baseWrapperValue(array, this.__actions__);
+ }
+ var result = [];
+
+ outer:
+ while (length-- && resIndex < takeCount) {
+ index += dir;
+
+ var iterIndex = -1,
+ value = array[index];
+
+ while (++iterIndex < iterLength) {
+ var data = iteratees[iterIndex],
+ iteratee = data.iteratee,
+ type = data.type,
+ computed = iteratee(value);
+
+ if (type == LAZY_MAP_FLAG) {
+ value = computed;
+ } else if (!computed) {
+ if (type == LAZY_FILTER_FLAG) {
+ continue outer;
+ } else {
+ break outer;
+ }
+ }
+ }
+ result[resIndex++] = value;
+ }
+ return result;
+ }
+
+ /*------------------------------------------------------------------------*/
+
+ /**
+ * Creates a cache object to store key/value pairs.
+ *
+ * @private
+ * @static
+ * @name Cache
+ * @memberOf _.memoize
+ */
+ function MapCache() {
+ this.__data__ = {};
+ }
+
+ /**
+ * Removes `key` and its value from the cache.
+ *
+ * @private
+ * @name delete
+ * @memberOf _.memoize.Cache
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed successfully, else `false`.
+ */
+ function mapDelete(key) {
+ return this.has(key) && delete this.__data__[key];
+ }
+
+ /**
+ * Gets the cached value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf _.memoize.Cache
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the cached value.
+ */
+ function mapGet(key) {
+ return key == '__proto__' ? undefined : this.__data__[key];
+ }
+
+ /**
+ * Checks if a cached value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf _.memoize.Cache
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+ function mapHas(key) {
+ return key != '__proto__' && hasOwnProperty.call(this.__data__, key);
+ }
+
+ /**
+ * Sets `value` to `key` of the cache.
+ *
+ * @private
+ * @name set
+ * @memberOf _.memoize.Cache
+ * @param {string} key The key of the value to cache.
+ * @param {*} value The value to cache.
+ * @returns {Object} Returns the cache object.
+ */
+ function mapSet(key, value) {
+ if (key != '__proto__') {
+ this.__data__[key] = value;
+ }
+ return this;
+ }
+
+ /*------------------------------------------------------------------------*/
+
+ /**
+ *
+ * Creates a cache object to store unique values.
+ *
+ * @private
+ * @param {Array} [values] The values to cache.
+ */
+ function SetCache(values) {
+ var length = values ? values.length : 0;
+
+ this.data = { 'hash': nativeCreate(null), 'set': new Set };
+ while (length--) {
+ this.push(values[length]);
+ }
+ }
+
+ /**
+ * Checks if `value` is in `cache` mimicking the return signature of
+ * `_.indexOf` by returning `0` if the value is found, else `-1`.
+ *
+ * @private
+ * @param {Object} cache The cache to search.
+ * @param {*} value The value to search for.
+ * @returns {number} Returns `0` if `value` is found, else `-1`.
+ */
+ function cacheIndexOf(cache, value) {
+ var data = cache.data,
+ result = (typeof value == 'string' || isObject(value)) ? data.set.has(value) : data.hash[value];
+
+ return result ? 0 : -1;
+ }
+
+ /**
+ * Adds `value` to the cache.
+ *
+ * @private
+ * @name push
+ * @memberOf SetCache
+ * @param {*} value The value to cache.
+ */
+ function cachePush(value) {
+ var data = this.data;
+ if (typeof value == 'string' || isObject(value)) {
+ data.set.add(value);
+ } else {
+ data.hash[value] = true;
+ }
+ }
+
+ /*------------------------------------------------------------------------*/
+
+ /**
+ * Creates a new array joining `array` with `other`.
+ *
+ * @private
+ * @param {Array} array The array to join.
+ * @param {Array} other The other array to join.
+ * @returns {Array} Returns the new concatenated array.
+ */
+ function arrayConcat(array, other) {
+ var index = -1,
+ length = array.length,
+ othIndex = -1,
+ othLength = other.length,
+ result = Array(length + othLength);
+
+ while (++index < length) {
+ result[index] = array[index];
+ }
+ while (++othIndex < othLength) {
+ result[index++] = other[othIndex];
+ }
+ return result;
+ }
+
+ /**
+ * Copies the values of `source` to `array`.
+ *
+ * @private
+ * @param {Array} source The array to copy values from.
+ * @param {Array} [array=[]] The array to copy values to.
+ * @returns {Array} Returns `array`.
+ */
+ function arrayCopy(source, array) {
+ var index = -1,
+ length = source.length;
+
+ array || (array = Array(length));
+ while (++index < length) {
+ array[index] = source[index];
+ }
+ return array;
+ }
+
+ /**
+ * A specialized version of `_.forEach` for arrays without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns `array`.
+ */
+ function arrayEach(array, iteratee) {
+ var index = -1,
+ length = array.length;
+
+ while (++index < length) {
+ if (iteratee(array[index], index, array) === false) {
+ break;
+ }
+ }
+ return array;
+ }
+
+ /**
+ * A specialized version of `_.forEachRight` for arrays without support for
+ * callback shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns `array`.
+ */
+ function arrayEachRight(array, iteratee) {
+ var length = array.length;
+
+ while (length--) {
+ if (iteratee(array[length], length, array) === false) {
+ break;
+ }
+ }
+ return array;
+ }
+
+ /**
+ * A specialized version of `_.every` for arrays without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {boolean} Returns `true` if all elements pass the predicate check,
+ * else `false`.
+ */
+ function arrayEvery(array, predicate) {
+ var index = -1,
+ length = array.length;
+
+ while (++index < length) {
+ if (!predicate(array[index], index, array)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * A specialized version of `baseExtremum` for arrays which invokes `iteratee`
+ * with one argument: (value).
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {Function} comparator The function used to compare values.
+ * @param {*} exValue The initial extremum value.
+ * @returns {*} Returns the extremum value.
+ */
+ function arrayExtremum(array, iteratee, comparator, exValue) {
+ var index = -1,
+ length = array.length,
+ computed = exValue,
+ result = computed;
+
+ while (++index < length) {
+ var value = array[index],
+ current = +iteratee(value);
+
+ if (comparator(current, computed)) {
+ computed = current;
+ result = value;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * A specialized version of `_.filter` for arrays without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {Array} Returns the new filtered array.
+ */
+ function arrayFilter(array, predicate) {
+ var index = -1,
+ length = array.length,
+ resIndex = -1,
+ result = [];
+
+ while (++index < length) {
+ var value = array[index];
+ if (predicate(value, index, array)) {
+ result[++resIndex] = value;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * A specialized version of `_.map` for arrays without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns the new mapped array.
+ */
+ function arrayMap(array, iteratee) {
+ var index = -1,
+ length = array.length,
+ result = Array(length);
+
+ while (++index < length) {
+ result[index] = iteratee(array[index], index, array);
+ }
+ return result;
+ }
+
+ /**
+ * Appends the elements of `values` to `array`.
+ *
+ * @private
+ * @param {Array} array The array to modify.
+ * @param {Array} values The values to append.
+ * @returns {Array} Returns `array`.
+ */
+ function arrayPush(array, values) {
+ var index = -1,
+ length = values.length,
+ offset = array.length;
+
+ while (++index < length) {
+ array[offset + index] = values[index];
+ }
+ return array;
+ }
+
+ /**
+ * A specialized version of `_.reduce` for arrays without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @param {boolean} [initFromArray] Specify using the first element of `array`
+ * as the initial value.
+ * @returns {*} Returns the accumulated value.
+ */
+ function arrayReduce(array, iteratee, accumulator, initFromArray) {
+ var index = -1,
+ length = array.length;
+
+ if (initFromArray && length) {
+ accumulator = array[++index];
+ }
+ while (++index < length) {
+ accumulator = iteratee(accumulator, array[index], index, array);
+ }
+ return accumulator;
+ }
+
+ /**
+ * A specialized version of `_.reduceRight` for arrays without support for
+ * callback shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @param {boolean} [initFromArray] Specify using the last element of `array`
+ * as the initial value.
+ * @returns {*} Returns the accumulated value.
+ */
+ function arrayReduceRight(array, iteratee, accumulator, initFromArray) {
+ var length = array.length;
+ if (initFromArray && length) {
+ accumulator = array[--length];
+ }
+ while (length--) {
+ accumulator = iteratee(accumulator, array[length], length, array);
+ }
+ return accumulator;
+ }
+
+ /**
+ * A specialized version of `_.some` for arrays without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {boolean} Returns `true` if any element passes the predicate check,
+ * else `false`.
+ */
+ function arraySome(array, predicate) {
+ var index = -1,
+ length = array.length;
+
+ while (++index < length) {
+ if (predicate(array[index], index, array)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * A specialized version of `_.sum` for arrays without support for callback
+ * shorthands and `this` binding..
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {number} Returns the sum.
+ */
+ function arraySum(array, iteratee) {
+ var length = array.length,
+ result = 0;
+
+ while (length--) {
+ result += +iteratee(array[length]) || 0;
+ }
+ return result;
+ }
+
+ /**
+ * Used by `_.defaults` to customize its `_.assign` use.
+ *
+ * @private
+ * @param {*} objectValue The destination object property value.
+ * @param {*} sourceValue The source object property value.
+ * @returns {*} Returns the value to assign to the destination object.
+ */
+ function assignDefaults(objectValue, sourceValue) {
+ return objectValue === undefined ? sourceValue : objectValue;
+ }
+
+ /**
+ * Used by `_.template` to customize its `_.assign` use.
+ *
+ * **Note:** This function is like `assignDefaults` except that it ignores
+ * inherited property values when checking if a property is `undefined`.
+ *
+ * @private
+ * @param {*} objectValue The destination object property value.
+ * @param {*} sourceValue The source object property value.
+ * @param {string} key The key associated with the object and source values.
+ * @param {Object} object The destination object.
+ * @returns {*} Returns the value to assign to the destination object.
+ */
+ function assignOwnDefaults(objectValue, sourceValue, key, object) {
+ return (objectValue === undefined || !hasOwnProperty.call(object, key))
+ ? sourceValue
+ : objectValue;
+ }
+
+ /**
+ * A specialized version of `_.assign` for customizing assigned values without
+ * support for argument juggling, multiple sources, and `this` binding `customizer`
+ * functions.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @param {Function} customizer The function to customize assigned values.
+ * @returns {Object} Returns `object`.
+ */
+ function assignWith(object, source, customizer) {
+ var index = -1,
+ props = keys(source),
+ length = props.length;
+
+ while (++index < length) {
+ var key = props[index],
+ value = object[key],
+ result = customizer(value, source[key], key, object, source);
+
+ if ((result === result ? (result !== value) : (value === value)) ||
+ (value === undefined && !(key in object))) {
+ object[key] = result;
+ }
+ }
+ return object;
+ }
+
+ /**
+ * The base implementation of `_.assign` without support for argument juggling,
+ * multiple sources, and `customizer` functions.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @returns {Object} Returns `object`.
+ */
+ function baseAssign(object, source) {
+ return source == null
+ ? object
+ : baseCopy(source, keys(source), object);
+ }
+
+ /**
+ * The base implementation of `_.at` without support for string collections
+ * and individual key arguments.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {number[]|string[]} props The property names or indexes of elements to pick.
+ * @returns {Array} Returns the new array of picked elements.
+ */
+ function baseAt(collection, props) {
+ var index = -1,
+ isNil = collection == null,
+ isArr = !isNil && isArrayLike(collection),
+ length = isArr ? collection.length : 0,
+ propsLength = props.length,
+ result = Array(propsLength);
+
+ while(++index < propsLength) {
+ var key = props[index];
+ if (isArr) {
+ result[index] = isIndex(key, length) ? collection[key] : undefined;
+ } else {
+ result[index] = isNil ? undefined : collection[key];
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Copies properties of `source` to `object`.
+ *
+ * @private
+ * @param {Object} source The object to copy properties from.
+ * @param {Array} props The property names to copy.
+ * @param {Object} [object={}] The object to copy properties to.
+ * @returns {Object} Returns `object`.
+ */
+ function baseCopy(source, props, object) {
+ object || (object = {});
+
+ var index = -1,
+ length = props.length;
+
+ while (++index < length) {
+ var key = props[index];
+ object[key] = source[key];
+ }
+ return object;
+ }
+
+ /**
+ * The base implementation of `_.callback` which supports specifying the
+ * number of arguments to provide to `func`.
+ *
+ * @private
+ * @param {*} [func=_.identity] The value to convert to a callback.
+ * @param {*} [thisArg] The `this` binding of `func`.
+ * @param {number} [argCount] The number of arguments to provide to `func`.
+ * @returns {Function} Returns the callback.
+ */
+ function baseCallback(func, thisArg, argCount) {
+ var type = typeof func;
+ if (type == 'function') {
+ return thisArg === undefined
+ ? func
+ : bindCallback(func, thisArg, argCount);
+ }
+ if (func == null) {
+ return identity;
+ }
+ if (type == 'object') {
+ return baseMatches(func);
+ }
+ return thisArg === undefined
+ ? property(func)
+ : baseMatchesProperty(func, thisArg);
+ }
+
+ /**
+ * The base implementation of `_.clone` without support for argument juggling
+ * and `this` binding `customizer` functions.
+ *
+ * @private
+ * @param {*} value The value to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @param {Function} [customizer] The function to customize cloning values.
+ * @param {string} [key] The key of `value`.
+ * @param {Object} [object] The object `value` belongs to.
+ * @param {Array} [stackA=[]] Tracks traversed source objects.
+ * @param {Array} [stackB=[]] Associates clones with source counterparts.
+ * @returns {*} Returns the cloned value.
+ */
+ function baseClone(value, isDeep, customizer, key, object, stackA, stackB) {
+ var result;
+ if (customizer) {
+ result = object ? customizer(value, key, object) : customizer(value);
+ }
+ if (result !== undefined) {
+ return result;
+ }
+ if (!isObject(value)) {
+ return value;
+ }
+ var isArr = isArray(value);
+ if (isArr) {
+ result = initCloneArray(value);
+ if (!isDeep) {
+ return arrayCopy(value, result);
+ }
+ } else {
+ var tag = objToString.call(value),
+ isFunc = tag == funcTag;
+
+ if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
+ result = initCloneObject(isFunc ? {} : value);
+ if (!isDeep) {
+ return baseAssign(result, value);
+ }
+ } else {
+ return cloneableTags[tag]
+ ? initCloneByTag(value, tag, isDeep)
+ : (object ? value : {});
+ }
+ }
+ // Check for circular references and return its corresponding clone.
+ stackA || (stackA = []);
+ stackB || (stackB = []);
+
+ var length = stackA.length;
+ while (length--) {
+ if (stackA[length] == value) {
+ return stackB[length];
+ }
+ }
+ // Add the source value to the stack of traversed objects and associate it with its clone.
+ stackA.push(value);
+ stackB.push(result);
+
+ // Recursively populate clone (susceptible to call stack limits).
+ (isArr ? arrayEach : baseForOwn)(value, function(subValue, key) {
+ result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB);
+ });
+ return result;
+ }
+
+ /**
+ * The base implementation of `_.create` without support for assigning
+ * properties to the created object.
+ *
+ * @private
+ * @param {Object} prototype The object to inherit from.
+ * @returns {Object} Returns the new object.
+ */
+ var baseCreate = (function() {
+ function object() {}
+ return function(prototype) {
+ if (isObject(prototype)) {
+ object.prototype = prototype;
+ var result = new object;
+ object.prototype = undefined;
+ }
+ return result || {};
+ };
+ }());
+
+ /**
+ * The base implementation of `_.delay` and `_.defer` which accepts an index
+ * of where to slice the arguments to provide to `func`.
+ *
+ * @private
+ * @param {Function} func The function to delay.
+ * @param {number} wait The number of milliseconds to delay invocation.
+ * @param {Object} args The arguments provide to `func`.
+ * @returns {number} Returns the timer id.
+ */
+ function baseDelay(func, wait, args) {
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ return setTimeout(function() { func.apply(undefined, args); }, wait);
+ }
+
+ /**
+ * The base implementation of `_.difference` which accepts a single array
+ * of values to exclude.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {Array} values The values to exclude.
+ * @returns {Array} Returns the new array of filtered values.
+ */
+ function baseDifference(array, values) {
+ var length = array ? array.length : 0,
+ result = [];
+
+ if (!length) {
+ return result;
+ }
+ var index = -1,
+ indexOf = getIndexOf(),
+ isCommon = indexOf === baseIndexOf,
+ cache = (isCommon && values.length >= LARGE_ARRAY_SIZE) ? createCache(values) : null,
+ valuesLength = values.length;
+
+ if (cache) {
+ indexOf = cacheIndexOf;
+ isCommon = false;
+ values = cache;
+ }
+ outer:
+ while (++index < length) {
+ var value = array[index];
+
+ if (isCommon && value === value) {
+ var valuesIndex = valuesLength;
+ while (valuesIndex--) {
+ if (values[valuesIndex] === value) {
+ continue outer;
+ }
+ }
+ result.push(value);
+ }
+ else if (indexOf(values, value, 0) < 0) {
+ result.push(value);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * The base implementation of `_.forEach` without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array|Object|string} Returns `collection`.
+ */
+ var baseEach = createBaseEach(baseForOwn);
+
+ /**
+ * The base implementation of `_.forEachRight` without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array|Object|string} Returns `collection`.
+ */
+ var baseEachRight = createBaseEach(baseForOwnRight, true);
+
+ /**
+ * The base implementation of `_.every` without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {boolean} Returns `true` if all elements pass the predicate check,
+ * else `false`
+ */
+ function baseEvery(collection, predicate) {
+ var result = true;
+ baseEach(collection, function(value, index, collection) {
+ result = !!predicate(value, index, collection);
+ return result;
+ });
+ return result;
+ }
+
+ /**
+ * Gets the extremum value of `collection` invoking `iteratee` for each value
+ * in `collection` to generate the criterion by which the value is ranked.
+ * The `iteratee` is invoked with three arguments: (value, index|key, collection).
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {Function} comparator The function used to compare values.
+ * @param {*} exValue The initial extremum value.
+ * @returns {*} Returns the extremum value.
+ */
+ function baseExtremum(collection, iteratee, comparator, exValue) {
+ var computed = exValue,
+ result = computed;
+
+ baseEach(collection, function(value, index, collection) {
+ var current = +iteratee(value, index, collection);
+ if (comparator(current, computed) || (current === exValue && current === result)) {
+ computed = current;
+ result = value;
+ }
+ });
+ return result;
+ }
+
+ /**
+ * The base implementation of `_.fill` without an iteratee call guard.
+ *
+ * @private
+ * @param {Array} array The array to fill.
+ * @param {*} value The value to fill `array` with.
+ * @param {number} [start=0] The start position.
+ * @param {number} [end=array.length] The end position.
+ * @returns {Array} Returns `array`.
+ */
+ function baseFill(array, value, start, end) {
+ var length = array.length;
+
+ start = start == null ? 0 : (+start || 0);
+ if (start < 0) {
+ start = -start > length ? 0 : (length + start);
+ }
+ end = (end === undefined || end > length) ? length : (+end || 0);
+ if (end < 0) {
+ end += length;
+ }
+ length = start > end ? 0 : (end >>> 0);
+ start >>>= 0;
+
+ while (start < length) {
+ array[start++] = value;
+ }
+ return array;
+ }
+
+ /**
+ * The base implementation of `_.filter` without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {Array} Returns the new filtered array.
+ */
+ function baseFilter(collection, predicate) {
+ var result = [];
+ baseEach(collection, function(value, index, collection) {
+ if (predicate(value, index, collection)) {
+ result.push(value);
+ }
+ });
+ return result;
+ }
+
+ /**
+ * The base implementation of `_.find`, `_.findLast`, `_.findKey`, and `_.findLastKey`,
+ * without support for callback shorthands and `this` binding, which iterates
+ * over `collection` using the provided `eachFunc`.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to search.
+ * @param {Function} predicate The function invoked per iteration.
+ * @param {Function} eachFunc The function to iterate over `collection`.
+ * @param {boolean} [retKey] Specify returning the key of the found element
+ * instead of the element itself.
+ * @returns {*} Returns the found element or its key, else `undefined`.
+ */
+ function baseFind(collection, predicate, eachFunc, retKey) {
+ var result;
+ eachFunc(collection, function(value, key, collection) {
+ if (predicate(value, key, collection)) {
+ result = retKey ? key : value;
+ return false;
+ }
+ });
+ return result;
+ }
+
+ /**
+ * The base implementation of `_.flatten` with added support for restricting
+ * flattening and specifying the start index.
+ *
+ * @private
+ * @param {Array} array The array to flatten.
+ * @param {boolean} [isDeep] Specify a deep flatten.
+ * @param {boolean} [isStrict] Restrict flattening to arrays-like objects.
+ * @param {Array} [result=[]] The initial result value.
+ * @returns {Array} Returns the new flattened array.
+ */
+ function baseFlatten(array, isDeep, isStrict, result) {
+ result || (result = []);
+
+ var index = -1,
+ length = array.length;
+
+ while (++index < length) {
+ var value = array[index];
+ if (isObjectLike(value) && isArrayLike(value) &&
+ (isStrict || isArray(value) || isArguments(value))) {
+ if (isDeep) {
+ // Recursively flatten arrays (susceptible to call stack limits).
+ baseFlatten(value, isDeep, isStrict, result);
+ } else {
+ arrayPush(result, value);
+ }
+ } else if (!isStrict) {
+ result[result.length] = value;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * The base implementation of `baseForIn` and `baseForOwn` which iterates
+ * over `object` properties returned by `keysFunc` invoking `iteratee` for
+ * each property. Iteratee functions may exit iteration early by explicitly
+ * returning `false`.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {Function} keysFunc The function to get the keys of `object`.
+ * @returns {Object} Returns `object`.
+ */
+ var baseFor = createBaseFor();
+
+ /**
+ * This function is like `baseFor` except that it iterates over properties
+ * in the opposite order.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {Function} keysFunc The function to get the keys of `object`.
+ * @returns {Object} Returns `object`.
+ */
+ var baseForRight = createBaseFor(true);
+
+ /**
+ * The base implementation of `_.forIn` without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ */
+ function baseForIn(object, iteratee) {
+ return baseFor(object, iteratee, keysIn);
+ }
+
+ /**
+ * The base implementation of `_.forOwn` without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ */
+ function baseForOwn(object, iteratee) {
+ return baseFor(object, iteratee, keys);
+ }
+
+ /**
+ * The base implementation of `_.forOwnRight` without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ */
+ function baseForOwnRight(object, iteratee) {
+ return baseForRight(object, iteratee, keys);
+ }
+
+ /**
+ * The base implementation of `_.functions` which creates an array of
+ * `object` function property names filtered from those provided.
+ *
+ * @private
+ * @param {Object} object The object to inspect.
+ * @param {Array} props The property names to filter.
+ * @returns {Array} Returns the new array of filtered property names.
+ */
+ function baseFunctions(object, props) {
+ var index = -1,
+ length = props.length,
+ resIndex = -1,
+ result = [];
+
+ while (++index < length) {
+ var key = props[index];
+ if (isFunction(object[key])) {
+ result[++resIndex] = key;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * The base implementation of `get` without support for string paths
+ * and default values.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array} path The path of the property to get.
+ * @param {string} [pathKey] The key representation of path.
+ * @returns {*} Returns the resolved value.
+ */
+ function baseGet(object, path, pathKey) {
+ if (object == null) {
+ return;
+ }
+ if (pathKey !== undefined && pathKey in toObject(object)) {
+ path = [pathKey];
+ }
+ var index = 0,
+ length = path.length;
+
+ while (object != null && index < length) {
+ object = object[path[index++]];
+ }
+ return (index && index == length) ? object : undefined;
+ }
+
+ /**
+ * The base implementation of `_.isEqual` without support for `this` binding
+ * `customizer` functions.
+ *
+ * @private
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @param {Function} [customizer] The function to customize comparing values.
+ * @param {boolean} [isLoose] Specify performing partial comparisons.
+ * @param {Array} [stackA] Tracks traversed `value` objects.
+ * @param {Array} [stackB] Tracks traversed `other` objects.
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+ */
+ function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {
+ if (value === other) {
+ return true;
+ }
+ if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {
+ return value !== value && other !== other;
+ }
+ return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);
+ }
+
+ /**
+ * A specialized version of `baseIsEqual` for arrays and objects which performs
+ * deep comparisons and tracks traversed objects enabling objects with circular
+ * references to be compared.
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @param {Function} equalFunc The function to determine equivalents of values.
+ * @param {Function} [customizer] The function to customize comparing objects.
+ * @param {boolean} [isLoose] Specify performing partial comparisons.
+ * @param {Array} [stackA=[]] Tracks traversed `value` objects.
+ * @param {Array} [stackB=[]] Tracks traversed `other` objects.
+ * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+ */
+ function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
+ var objIsArr = isArray(object),
+ othIsArr = isArray(other),
+ objTag = arrayTag,
+ othTag = arrayTag;
+
+ if (!objIsArr) {
+ objTag = objToString.call(object);
+ if (objTag == argsTag) {
+ objTag = objectTag;
+ } else if (objTag != objectTag) {
+ objIsArr = isTypedArray(object);
+ }
+ }
+ if (!othIsArr) {
+ othTag = objToString.call(other);
+ if (othTag == argsTag) {
+ othTag = objectTag;
+ } else if (othTag != objectTag) {
+ othIsArr = isTypedArray(other);
+ }
+ }
+ var objIsObj = objTag == objectTag,
+ othIsObj = othTag == objectTag,
+ isSameTag = objTag == othTag;
+
+ if (isSameTag && !(objIsArr || objIsObj)) {
+ return equalByTag(object, other, objTag);
+ }
+ if (!isLoose) {
+ var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
+ othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
+
+ if (objIsWrapped || othIsWrapped) {
+ return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);
+ }
+ }
+ if (!isSameTag) {
+ return false;
+ }
+ // Assume cyclic values are equal.
+ // For more information on detecting circular references see https://es5.github.io/#JO.
+ stackA || (stackA = []);
+ stackB || (stackB = []);
+
+ var length = stackA.length;
+ while (length--) {
+ if (stackA[length] == object) {
+ return stackB[length] == other;
+ }
+ }
+ // Add `object` and `other` to the stack of traversed objects.
+ stackA.push(object);
+ stackB.push(other);
+
+ var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB);
+
+ stackA.pop();
+ stackB.pop();
+
+ return result;
+ }
+
+ /**
+ * The base implementation of `_.isMatch` without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Object} object The object to inspect.
+ * @param {Array} matchData The propery names, values, and compare flags to match.
+ * @param {Function} [customizer] The function to customize comparing objects.
+ * @returns {boolean} Returns `true` if `object` is a match, else `false`.
+ */
+ function baseIsMatch(object, matchData, customizer) {
+ var index = matchData.length,
+ length = index,
+ noCustomizer = !customizer;
+
+ if (object == null) {
+ return !length;
+ }
+ object = toObject(object);
+ while (index--) {
+ var data = matchData[index];
+ if ((noCustomizer && data[2])
+ ? data[1] !== object[data[0]]
+ : !(data[0] in object)
+ ) {
+ return false;
+ }
+ }
+ while (++index < length) {
+ data = matchData[index];
+ var key = data[0],
+ objValue = object[key],
+ srcValue = data[1];
+
+ if (noCustomizer && data[2]) {
+ if (objValue === undefined && !(key in object)) {
+ return false;
+ }
+ } else {
+ var result = customizer ? customizer(objValue, srcValue, key) : undefined;
+ if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * The base implementation of `_.map` without support for callback shorthands
+ * and `this` binding.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns the new mapped array.
+ */
+ function baseMap(collection, iteratee) {
+ var index = -1,
+ result = isArrayLike(collection) ? Array(collection.length) : [];
+
+ baseEach(collection, function(value, key, collection) {
+ result[++index] = iteratee(value, key, collection);
+ });
+ return result;
+ }
+
+ /**
+ * The base implementation of `_.matches` which does not clone `source`.
+ *
+ * @private
+ * @param {Object} source The object of property values to match.
+ * @returns {Function} Returns the new function.
+ */
+ function baseMatches(source) {
+ var matchData = getMatchData(source);
+ if (matchData.length == 1 && matchData[0][2]) {
+ var key = matchData[0][0],
+ value = matchData[0][1];
+
+ return function(object) {
+ if (object == null) {
+ return false;
+ }
+ return object[key] === value && (value !== undefined || (key in toObject(object)));
+ };
+ }
+ return function(object) {
+ return baseIsMatch(object, matchData);
+ };
+ }
+
+ /**
+ * The base implementation of `_.matchesProperty` which does not clone `srcValue`.
+ *
+ * @private
+ * @param {string} path The path of the property to get.
+ * @param {*} srcValue The value to compare.
+ * @returns {Function} Returns the new function.
+ */
+ function baseMatchesProperty(path, srcValue) {
+ var isArr = isArray(path),
+ isCommon = isKey(path) && isStrictComparable(srcValue),
+ pathKey = (path + '');
+
+ path = toPath(path);
+ return function(object) {
+ if (object == null) {
+ return false;
+ }
+ var key = pathKey;
+ object = toObject(object);
+ if ((isArr || !isCommon) && !(key in object)) {
+ object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
+ if (object == null) {
+ return false;
+ }
+ key = last(path);
+ object = toObject(object);
+ }
+ return object[key] === srcValue
+ ? (srcValue !== undefined || (key in object))
+ : baseIsEqual(srcValue, object[key], undefined, true);
+ };
+ }
+
+ /**
+ * The base implementation of `_.merge` without support for argument juggling,
+ * multiple sources, and `this` binding `customizer` functions.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @param {Function} [customizer] The function to customize merged values.
+ * @param {Array} [stackA=[]] Tracks traversed source objects.
+ * @param {Array} [stackB=[]] Associates values with source counterparts.
+ * @returns {Object} Returns `object`.
+ */
+ function baseMerge(object, source, customizer, stackA, stackB) {
+ if (!isObject(object)) {
+ return object;
+ }
+ var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)),
+ props = isSrcArr ? undefined : keys(source);
+
+ arrayEach(props || source, function(srcValue, key) {
+ if (props) {
+ key = srcValue;
+ srcValue = source[key];
+ }
+ if (isObjectLike(srcValue)) {
+ stackA || (stackA = []);
+ stackB || (stackB = []);
+ baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);
+ }
+ else {
+ var value = object[key],
+ result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
+ isCommon = result === undefined;
+
+ if (isCommon) {
+ result = srcValue;
+ }
+ if ((result !== undefined || (isSrcArr && !(key in object))) &&
+ (isCommon || (result === result ? (result !== value) : (value === value)))) {
+ object[key] = result;
+ }
+ }
+ });
+ return object;
+ }
+
+ /**
+ * A specialized version of `baseMerge` for arrays and objects which performs
+ * deep merges and tracks traversed objects enabling objects with circular
+ * references to be merged.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @param {string} key The key of the value to merge.
+ * @param {Function} mergeFunc The function to merge values.
+ * @param {Function} [customizer] The function to customize merged values.
+ * @param {Array} [stackA=[]] Tracks traversed source objects.
+ * @param {Array} [stackB=[]] Associates values with source counterparts.
+ * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+ */
+ function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {
+ var length = stackA.length,
+ srcValue = source[key];
+
+ while (length--) {
+ if (stackA[length] == srcValue) {
+ object[key] = stackB[length];
+ return;
+ }
+ }
+ var value = object[key],
+ result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
+ isCommon = result === undefined;
+
+ if (isCommon) {
+ result = srcValue;
+ if (isArrayLike(srcValue) && (isArray(srcValue) || isTypedArray(srcValue))) {
+ result = isArray(value)
+ ? value
+ : (isArrayLike(value) ? arrayCopy(value) : []);
+ }
+ else if (isPlainObject(srcValue) || isArguments(srcValue)) {
+ result = isArguments(value)
+ ? toPlainObject(value)
+ : (isPlainObject(value) ? value : {});
+ }
+ else {
+ isCommon = false;
+ }
+ }
+ // Add the source value to the stack of traversed objects and associate
+ // it with its merged value.
+ stackA.push(srcValue);
+ stackB.push(result);
+
+ if (isCommon) {
+ // Recursively merge objects and arrays (susceptible to call stack limits).
+ object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);
+ } else if (result === result ? (result !== value) : (value === value)) {
+ object[key] = result;
+ }
+ }
+
+ /**
+ * The base implementation of `_.property` without support for deep paths.
+ *
+ * @private
+ * @param {string} key The key of the property to get.
+ * @returns {Function} Returns the new function.
+ */
+ function baseProperty(key) {
+ return function(object) {
+ return object == null ? undefined : object[key];
+ };
+ }
+
+ /**
+ * A specialized version of `baseProperty` which supports deep paths.
+ *
+ * @private
+ * @param {Array|string} path The path of the property to get.
+ * @returns {Function} Returns the new function.
+ */
+ function basePropertyDeep(path) {
+ var pathKey = (path + '');
+ path = toPath(path);
+ return function(object) {
+ return baseGet(object, path, pathKey);
+ };
+ }
+
+ /**
+ * The base implementation of `_.pullAt` without support for individual
+ * index arguments and capturing the removed elements.
+ *
+ * @private
+ * @param {Array} array The array to modify.
+ * @param {number[]} indexes The indexes of elements to remove.
+ * @returns {Array} Returns `array`.
+ */
+ function basePullAt(array, indexes) {
+ var length = array ? indexes.length : 0;
+ while (length--) {
+ var index = indexes[length];
+ if (index != previous && isIndex(index)) {
+ var previous = index;
+ splice.call(array, index, 1);
+ }
+ }
+ return array;
+ }
+
+ /**
+ * The base implementation of `_.random` without support for argument juggling
+ * and returning floating-point numbers.
+ *
+ * @private
+ * @param {number} min The minimum possible value.
+ * @param {number} max The maximum possible value.
+ * @returns {number} Returns the random number.
+ */
+ function baseRandom(min, max) {
+ return min + nativeFloor(nativeRandom() * (max - min + 1));
+ }
+
+ /**
+ * The base implementation of `_.reduce` and `_.reduceRight` without support
+ * for callback shorthands and `this` binding, which iterates over `collection`
+ * using the provided `eachFunc`.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {*} accumulator The initial value.
+ * @param {boolean} initFromCollection Specify using the first or last element
+ * of `collection` as the initial value.
+ * @param {Function} eachFunc The function to iterate over `collection`.
+ * @returns {*} Returns the accumulated value.
+ */
+ function baseReduce(collection, iteratee, accumulator, initFromCollection, eachFunc) {
+ eachFunc(collection, function(value, index, collection) {
+ accumulator = initFromCollection
+ ? (initFromCollection = false, value)
+ : iteratee(accumulator, value, index, collection);
+ });
+ return accumulator;
+ }
+
+ /**
+ * The base implementation of `setData` without support for hot loop detection.
+ *
+ * @private
+ * @param {Function} func The function to associate metadata with.
+ * @param {*} data The metadata.
+ * @returns {Function} Returns `func`.
+ */
+ var baseSetData = !metaMap ? identity : function(func, data) {
+ metaMap.set(func, data);
+ return func;
+ };
+
+ /**
+ * The base implementation of `_.slice` without an iteratee call guard.
+ *
+ * @private
+ * @param {Array} array The array to slice.
+ * @param {number} [start=0] The start position.
+ * @param {number} [end=array.length] The end position.
+ * @returns {Array} Returns the slice of `array`.
+ */
+ function baseSlice(array, start, end) {
+ var index = -1,
+ length = array.length;
+
+ start = start == null ? 0 : (+start || 0);
+ if (start < 0) {
+ start = -start > length ? 0 : (length + start);
+ }
+ end = (end === undefined || end > length) ? length : (+end || 0);
+ if (end < 0) {
+ end += length;
+ }
+ length = start > end ? 0 : ((end - start) >>> 0);
+ start >>>= 0;
+
+ var result = Array(length);
+ while (++index < length) {
+ result[index] = array[index + start];
+ }
+ return result;
+ }
+
+ /**
+ * The base implementation of `_.some` without support for callback shorthands
+ * and `this` binding.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {boolean} Returns `true` if any element passes the predicate check,
+ * else `false`.
+ */
+ function baseSome(collection, predicate) {
+ var result;
+
+ baseEach(collection, function(value, index, collection) {
+ result = predicate(value, index, collection);
+ return !result;
+ });
+ return !!result;
+ }
+
+ /**
+ * The base implementation of `_.sortBy` which uses `comparer` to define
+ * the sort order of `array` and replaces criteria objects with their
+ * corresponding values.
+ *
+ * @private
+ * @param {Array} array The array to sort.
+ * @param {Function} comparer The function to define sort order.
+ * @returns {Array} Returns `array`.
+ */
+ function baseSortBy(array, comparer) {
+ var length = array.length;
+
+ array.sort(comparer);
+ while (length--) {
+ array[length] = array[length].value;
+ }
+ return array;
+ }
+
+ /**
+ * The base implementation of `_.sortByOrder` without param guards.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
+ * @param {boolean[]} orders The sort orders of `iteratees`.
+ * @returns {Array} Returns the new sorted array.
+ */
+ function baseSortByOrder(collection, iteratees, orders) {
+ var callback = getCallback(),
+ index = -1;
+
+ iteratees = arrayMap(iteratees, function(iteratee) { return callback(iteratee); });
+
+ var result = baseMap(collection, function(value) {
+ var criteria = arrayMap(iteratees, function(iteratee) { return iteratee(value); });
+ return { 'criteria': criteria, 'index': ++index, 'value': value };
+ });
+
+ return baseSortBy(result, function(object, other) {
+ return compareMultiple(object, other, orders);
+ });
+ }
+
+ /**
+ * The base implementation of `_.sum` without support for callback shorthands
+ * and `this` binding.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {number} Returns the sum.
+ */
+ function baseSum(collection, iteratee) {
+ var result = 0;
+ baseEach(collection, function(value, index, collection) {
+ result += +iteratee(value, index, collection) || 0;
+ });
+ return result;
+ }
+
+ /**
+ * The base implementation of `_.uniq` without support for callback shorthands
+ * and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {Function} [iteratee] The function invoked per iteration.
+ * @returns {Array} Returns the new duplicate free array.
+ */
+ function baseUniq(array, iteratee) {
+ var index = -1,
+ indexOf = getIndexOf(),
+ length = array.length,
+ isCommon = indexOf === baseIndexOf,
+ isLarge = isCommon && length >= LARGE_ARRAY_SIZE,
+ seen = isLarge ? createCache() : null,
+ result = [];
+
+ if (seen) {
+ indexOf = cacheIndexOf;
+ isCommon = false;
+ } else {
+ isLarge = false;
+ seen = iteratee ? [] : result;
+ }
+ outer:
+ while (++index < length) {
+ var value = array[index],
+ computed = iteratee ? iteratee(value, index, array) : value;
+
+ if (isCommon && value === value) {
+ var seenIndex = seen.length;
+ while (seenIndex--) {
+ if (seen[seenIndex] === computed) {
+ continue outer;
+ }
+ }
+ if (iteratee) {
+ seen.push(computed);
+ }
+ result.push(value);
+ }
+ else if (indexOf(seen, computed, 0) < 0) {
+ if (iteratee || isLarge) {
+ seen.push(computed);
+ }
+ result.push(value);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * The base implementation of `_.values` and `_.valuesIn` which creates an
+ * array of `object` property values corresponding to the property names
+ * of `props`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array} props The property names to get values for.
+ * @returns {Object} Returns the array of property values.
+ */
+ function baseValues(object, props) {
+ var index = -1,
+ length = props.length,
+ result = Array(length);
+
+ while (++index < length) {
+ result[index] = object[props[index]];
+ }
+ return result;
+ }
+
+ /**
+ * The base implementation of `_.dropRightWhile`, `_.dropWhile`, `_.takeRightWhile`,
+ * and `_.takeWhile` without support for callback shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to query.
+ * @param {Function} predicate The function invoked per iteration.
+ * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Array} Returns the slice of `array`.
+ */
+ function baseWhile(array, predicate, isDrop, fromRight) {
+ var length = array.length,
+ index = fromRight ? length : -1;
+
+ while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) {}
+ return isDrop
+ ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
+ : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
+ }
+
+ /**
+ * The base implementation of `wrapperValue` which returns the result of
+ * performing a sequence of actions on the unwrapped `value`, where each
+ * successive action is supplied the return value of the previous.
+ *
+ * @private
+ * @param {*} value The unwrapped value.
+ * @param {Array} actions Actions to peform to resolve the unwrapped value.
+ * @returns {*} Returns the resolved value.
+ */
+ function baseWrapperValue(value, actions) {
+ var result = value;
+ if (result instanceof LazyWrapper) {
+ result = result.value();
+ }
+ var index = -1,
+ length = actions.length;
+
+ while (++index < length) {
+ var action = actions[index];
+ result = action.func.apply(action.thisArg, arrayPush([result], action.args));
+ }
+ return result;
+ }
+
+ /**
+ * Performs a binary search of `array` to determine the index at which `value`
+ * should be inserted into `array` in order to maintain its sort order.
+ *
+ * @private
+ * @param {Array} array The sorted array to inspect.
+ * @param {*} value The value to evaluate.
+ * @param {boolean} [retHighest] Specify returning the highest qualified index.
+ * @returns {number} Returns the index at which `value` should be inserted
+ * into `array`.
+ */
+ function binaryIndex(array, value, retHighest) {
+ var low = 0,
+ high = array ? array.length : low;
+
+ if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
+ while (low < high) {
+ var mid = (low + high) >>> 1,
+ computed = array[mid];
+
+ if ((retHighest ? (computed <= value) : (computed < value)) && computed !== null) {
+ low = mid + 1;
+ } else {
+ high = mid;
+ }
+ }
+ return high;
+ }
+ return binaryIndexBy(array, value, identity, retHighest);
+ }
+
+ /**
+ * This function is like `binaryIndex` except that it invokes `iteratee` for
+ * `value` and each element of `array` to compute their sort ranking. The
+ * iteratee is invoked with one argument; (value).
+ *
+ * @private
+ * @param {Array} array The sorted array to inspect.
+ * @param {*} value The value to evaluate.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {boolean} [retHighest] Specify returning the highest qualified index.
+ * @returns {number} Returns the index at which `value` should be inserted
+ * into `array`.
+ */
+ function binaryIndexBy(array, value, iteratee, retHighest) {
+ value = iteratee(value);
+
+ var low = 0,
+ high = array ? array.length : 0,
+ valIsNaN = value !== value,
+ valIsNull = value === null,
+ valIsUndef = value === undefined;
+
+ while (low < high) {
+ var mid = nativeFloor((low + high) / 2),
+ computed = iteratee(array[mid]),
+ isDef = computed !== undefined,
+ isReflexive = computed === computed;
+
+ if (valIsNaN) {
+ var setLow = isReflexive || retHighest;
+ } else if (valIsNull) {
+ setLow = isReflexive && isDef && (retHighest || computed != null);
+ } else if (valIsUndef) {
+ setLow = isReflexive && (retHighest || isDef);
+ } else if (computed == null) {
+ setLow = false;
+ } else {
+ setLow = retHighest ? (computed <= value) : (computed < value);
+ }
+ if (setLow) {
+ low = mid + 1;
+ } else {
+ high = mid;
+ }
+ }
+ return nativeMin(high, MAX_ARRAY_INDEX);
+ }
+
+ /**
+ * A specialized version of `baseCallback` which only supports `this` binding
+ * and specifying the number of arguments to provide to `func`.
+ *
+ * @private
+ * @param {Function} func The function to bind.
+ * @param {*} thisArg The `this` binding of `func`.
+ * @param {number} [argCount] The number of arguments to provide to `func`.
+ * @returns {Function} Returns the callback.
+ */
+ function bindCallback(func, thisArg, argCount) {
+ if (typeof func != 'function') {
+ return identity;
+ }
+ if (thisArg === undefined) {
+ return func;
+ }
+ switch (argCount) {
+ case 1: return function(value) {
+ return func.call(thisArg, value);
+ };
+ case 3: return function(value, index, collection) {
+ return func.call(thisArg, value, index, collection);
+ };
+ case 4: return function(accumulator, value, index, collection) {
+ return func.call(thisArg, accumulator, value, index, collection);
+ };
+ case 5: return function(value, other, key, object, source) {
+ return func.call(thisArg, value, other, key, object, source);
+ };
+ }
+ return function() {
+ return func.apply(thisArg, arguments);
+ };
+ }
+
+ /**
+ * Creates a clone of the given array buffer.
+ *
+ * @private
+ * @param {ArrayBuffer} buffer The array buffer to clone.
+ * @returns {ArrayBuffer} Returns the cloned array buffer.
+ */
+ function bufferClone(buffer) {
+ var result = new ArrayBuffer(buffer.byteLength),
+ view = new Uint8Array(result);
+
+ view.set(new Uint8Array(buffer));
+ return result;
+ }
+
+ /**
+ * Creates an array that is the composition of partially applied arguments,
+ * placeholders, and provided arguments into a single array of arguments.
+ *
+ * @private
+ * @param {Array|Object} args The provided arguments.
+ * @param {Array} partials The arguments to prepend to those provided.
+ * @param {Array} holders The `partials` placeholder indexes.
+ * @returns {Array} Returns the new array of composed arguments.
+ */
+ function composeArgs(args, partials, holders) {
+ var holdersLength = holders.length,
+ argsIndex = -1,
+ argsLength = nativeMax(args.length - holdersLength, 0),
+ leftIndex = -1,
+ leftLength = partials.length,
+ result = Array(leftLength + argsLength);
+
+ while (++leftIndex < leftLength) {
+ result[leftIndex] = partials[leftIndex];
+ }
+ while (++argsIndex < holdersLength) {
+ result[holders[argsIndex]] = args[argsIndex];
+ }
+ while (argsLength--) {
+ result[leftIndex++] = args[argsIndex++];
+ }
+ return result;
+ }
+
+ /**
+ * This function is like `composeArgs` except that the arguments composition
+ * is tailored for `_.partialRight`.
+ *
+ * @private
+ * @param {Array|Object} args The provided arguments.
+ * @param {Array} partials The arguments to append to those provided.
+ * @param {Array} holders The `partials` placeholder indexes.
+ * @returns {Array} Returns the new array of composed arguments.
+ */
+ function composeArgsRight(args, partials, holders) {
+ var holdersIndex = -1,
+ holdersLength = holders.length,
+ argsIndex = -1,
+ argsLength = nativeMax(args.length - holdersLength, 0),
+ rightIndex = -1,
+ rightLength = partials.length,
+ result = Array(argsLength + rightLength);
+
+ while (++argsIndex < argsLength) {
+ result[argsIndex] = args[argsIndex];
+ }
+ var offset = argsIndex;
+ while (++rightIndex < rightLength) {
+ result[offset + rightIndex] = partials[rightIndex];
+ }
+ while (++holdersIndex < holdersLength) {
+ result[offset + holders[holdersIndex]] = args[argsIndex++];
+ }
+ return result;
+ }
+
+ /**
+ * Creates a `_.countBy`, `_.groupBy`, `_.indexBy`, or `_.partition` function.
+ *
+ * @private
+ * @param {Function} setter The function to set keys and values of the accumulator object.
+ * @param {Function} [initializer] The function to initialize the accumulator object.
+ * @returns {Function} Returns the new aggregator function.
+ */
+ function createAggregator(setter, initializer) {
+ return function(collection, iteratee, thisArg) {
+ var result = initializer ? initializer() : {};
+ iteratee = getCallback(iteratee, thisArg, 3);
+
+ if (isArray(collection)) {
+ var index = -1,
+ length = collection.length;
+
+ while (++index < length) {
+ var value = collection[index];
+ setter(result, value, iteratee(value, index, collection), collection);
+ }
+ } else {
+ baseEach(collection, function(value, key, collection) {
+ setter(result, value, iteratee(value, key, collection), collection);
+ });
+ }
+ return result;
+ };
+ }
+
+ /**
+ * Creates a `_.assign`, `_.defaults`, or `_.merge` function.
+ *
+ * @private
+ * @param {Function} assigner The function to assign values.
+ * @returns {Function} Returns the new assigner function.
+ */
+ function createAssigner(assigner) {
+ return restParam(function(object, sources) {
+ var index = -1,
+ length = object == null ? 0 : sources.length,
+ customizer = length > 2 ? sources[length - 2] : undefined,
+ guard = length > 2 ? sources[2] : undefined,
+ thisArg = length > 1 ? sources[length - 1] : undefined;
+
+ if (typeof customizer == 'function') {
+ customizer = bindCallback(customizer, thisArg, 5);
+ length -= 2;
+ } else {
+ customizer = typeof thisArg == 'function' ? thisArg : undefined;
+ length -= (customizer ? 1 : 0);
+ }
+ if (guard && isIterateeCall(sources[0], sources[1], guard)) {
+ customizer = length < 3 ? undefined : customizer;
+ length = 1;
+ }
+ while (++index < length) {
+ var source = sources[index];
+ if (source) {
+ assigner(object, source, customizer);
+ }
+ }
+ return object;
+ });
+ }
+
+ /**
+ * Creates a `baseEach` or `baseEachRight` function.
+ *
+ * @private
+ * @param {Function} eachFunc The function to iterate over a collection.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new base function.
+ */
+ function createBaseEach(eachFunc, fromRight) {
+ return function(collection, iteratee) {
+ var length = collection ? getLength(collection) : 0;
+ if (!isLength(length)) {
+ return eachFunc(collection, iteratee);
+ }
+ var index = fromRight ? length : -1,
+ iterable = toObject(collection);
+
+ while ((fromRight ? index-- : ++index < length)) {
+ if (iteratee(iterable[index], index, iterable) === false) {
+ break;
+ }
+ }
+ return collection;
+ };
+ }
+
+ /**
+ * Creates a base function for `_.forIn` or `_.forInRight`.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new base function.
+ */
+ function createBaseFor(fromRight) {
+ return function(object, iteratee, keysFunc) {
+ var iterable = toObject(object),
+ props = keysFunc(object),
+ length = props.length,
+ index = fromRight ? length : -1;
+
+ while ((fromRight ? index-- : ++index < length)) {
+ var key = props[index];
+ if (iteratee(iterable[key], key, iterable) === false) {
+ break;
+ }
+ }
+ return object;
+ };
+ }
+
+ /**
+ * Creates a function that wraps `func` and invokes it with the `this`
+ * binding of `thisArg`.
+ *
+ * @private
+ * @param {Function} func The function to bind.
+ * @param {*} [thisArg] The `this` binding of `func`.
+ * @returns {Function} Returns the new bound function.
+ */
+ function createBindWrapper(func, thisArg) {
+ var Ctor = createCtorWrapper(func);
+
+ function wrapper() {
+ var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
+ return fn.apply(thisArg, arguments);
+ }
+ return wrapper;
+ }
+
+ /**
+ * Creates a `Set` cache object to optimize linear searches of large arrays.
+ *
+ * @private
+ * @param {Array} [values] The values to cache.
+ * @returns {null|Object} Returns the new cache object if `Set` is supported, else `null`.
+ */
+ function createCache(values) {
+ return (nativeCreate && Set) ? new SetCache(values) : null;
+ }
+
+ /**
+ * Creates a function that produces compound words out of the words in a
+ * given string.
+ *
+ * @private
+ * @param {Function} callback The function to combine each word.
+ * @returns {Function} Returns the new compounder function.
+ */
+ function createCompounder(callback) {
+ return function(string) {
+ var index = -1,
+ array = words(deburr(string)),
+ length = array.length,
+ result = '';
+
+ while (++index < length) {
+ result = callback(result, array[index], index);
+ }
+ return result;
+ };
+ }
+
+ /**
+ * Creates a function that produces an instance of `Ctor` regardless of
+ * whether it was invoked as part of a `new` expression or by `call` or `apply`.
+ *
+ * @private
+ * @param {Function} Ctor The constructor to wrap.
+ * @returns {Function} Returns the new wrapped function.
+ */
+ function createCtorWrapper(Ctor) {
+ return function() {
+ // Use a `switch` statement to work with class constructors.
+ // See http://ecma-international.org/ecma-262/6.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
+ // for more details.
+ var args = arguments;
+ switch (args.length) {
+ case 0: return new Ctor;
+ case 1: return new Ctor(args[0]);
+ case 2: return new Ctor(args[0], args[1]);
+ case 3: return new Ctor(args[0], args[1], args[2]);
+ case 4: return new Ctor(args[0], args[1], args[2], args[3]);
+ case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
+ case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
+ case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
+ }
+ var thisBinding = baseCreate(Ctor.prototype),
+ result = Ctor.apply(thisBinding, args);
+
+ // Mimic the constructor's `return` behavior.
+ // See https://es5.github.io/#x13.2.2 for more details.
+ return isObject(result) ? result : thisBinding;
+ };
+ }
+
+ /**
+ * Creates a `_.curry` or `_.curryRight` function.
+ *
+ * @private
+ * @param {boolean} flag The curry bit flag.
+ * @returns {Function} Returns the new curry function.
+ */
+ function createCurry(flag) {
+ function curryFunc(func, arity, guard) {
+ if (guard && isIterateeCall(func, arity, guard)) {
+ arity = undefined;
+ }
+ var result = createWrapper(func, flag, undefined, undefined, undefined, undefined, undefined, arity);
+ result.placeholder = curryFunc.placeholder;
+ return result;
+ }
+ return curryFunc;
+ }
+
+ /**
+ * Creates a `_.defaults` or `_.defaultsDeep` function.
+ *
+ * @private
+ * @param {Function} assigner The function to assign values.
+ * @param {Function} customizer The function to customize assigned values.
+ * @returns {Function} Returns the new defaults function.
+ */
+ function createDefaults(assigner, customizer) {
+ return restParam(function(args) {
+ var object = args[0];
+ if (object == null) {
+ return object;
+ }
+ args.push(customizer);
+ return assigner.apply(undefined, args);
+ });
+ }
+
+ /**
+ * Creates a `_.max` or `_.min` function.
+ *
+ * @private
+ * @param {Function} comparator The function used to compare values.
+ * @param {*} exValue The initial extremum value.
+ * @returns {Function} Returns the new extremum function.
+ */
+ function createExtremum(comparator, exValue) {
+ return function(collection, iteratee, thisArg) {
+ if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
+ iteratee = undefined;
+ }
+ iteratee = getCallback(iteratee, thisArg, 3);
+ if (iteratee.length == 1) {
+ collection = isArray(collection) ? collection : toIterable(collection);
+ var result = arrayExtremum(collection, iteratee, comparator, exValue);
+ if (!(collection.length && result === exValue)) {
+ return result;
+ }
+ }
+ return baseExtremum(collection, iteratee, comparator, exValue);
+ };
+ }
+
+ /**
+ * Creates a `_.find` or `_.findLast` function.
+ *
+ * @private
+ * @param {Function} eachFunc The function to iterate over a collection.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new find function.
+ */
+ function createFind(eachFunc, fromRight) {
+ return function(collection, predicate, thisArg) {
+ predicate = getCallback(predicate, thisArg, 3);
+ if (isArray(collection)) {
+ var index = baseFindIndex(collection, predicate, fromRight);
+ return index > -1 ? collection[index] : undefined;
+ }
+ return baseFind(collection, predicate, eachFunc);
+ };
+ }
+
+ /**
+ * Creates a `_.findIndex` or `_.findLastIndex` function.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new find function.
+ */
+ function createFindIndex(fromRight) {
+ return function(array, predicate, thisArg) {
+ if (!(array && array.length)) {
+ return -1;
+ }
+ predicate = getCallback(predicate, thisArg, 3);
+ return baseFindIndex(array, predicate, fromRight);
+ };
+ }
+
+ /**
+ * Creates a `_.findKey` or `_.findLastKey` function.
+ *
+ * @private
+ * @param {Function} objectFunc The function to iterate over an object.
+ * @returns {Function} Returns the new find function.
+ */
+ function createFindKey(objectFunc) {
+ return function(object, predicate, thisArg) {
+ predicate = getCallback(predicate, thisArg, 3);
+ return baseFind(object, predicate, objectFunc, true);
+ };
+ }
+
+ /**
+ * Creates a `_.flow` or `_.flowRight` function.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new flow function.
+ */
+ function createFlow(fromRight) {
+ return function() {
+ var wrapper,
+ length = arguments.length,
+ index = fromRight ? length : -1,
+ leftIndex = 0,
+ funcs = Array(length);
+
+ while ((fromRight ? index-- : ++index < length)) {
+ var func = funcs[leftIndex++] = arguments[index];
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ if (!wrapper && LodashWrapper.prototype.thru && getFuncName(func) == 'wrapper') {
+ wrapper = new LodashWrapper([], true);
+ }
+ }
+ index = wrapper ? -1 : length;
+ while (++index < length) {
+ func = funcs[index];
+
+ var funcName = getFuncName(func),
+ data = funcName == 'wrapper' ? getData(func) : undefined;
+
+ if (data && isLaziable(data[0]) && data[1] == (ARY_FLAG | CURRY_FLAG | PARTIAL_FLAG | REARG_FLAG) && !data[4].length && data[9] == 1) {
+ wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
+ } else {
+ wrapper = (func.length == 1 && isLaziable(func)) ? wrapper[funcName]() : wrapper.thru(func);
+ }
+ }
+ return function() {
+ var args = arguments,
+ value = args[0];
+
+ if (wrapper && args.length == 1 && isArray(value) && value.length >= LARGE_ARRAY_SIZE) {
+ return wrapper.plant(value).value();
+ }
+ var index = 0,
+ result = length ? funcs[index].apply(this, args) : value;
+
+ while (++index < length) {
+ result = funcs[index].call(this, result);
+ }
+ return result;
+ };
+ };
+ }
+
+ /**
+ * Creates a function for `_.forEach` or `_.forEachRight`.
+ *
+ * @private
+ * @param {Function} arrayFunc The function to iterate over an array.
+ * @param {Function} eachFunc The function to iterate over a collection.
+ * @returns {Function} Returns the new each function.
+ */
+ function createForEach(arrayFunc, eachFunc) {
+ return function(collection, iteratee, thisArg) {
+ return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))
+ ? arrayFunc(collection, iteratee)
+ : eachFunc(collection, bindCallback(iteratee, thisArg, 3));
+ };
+ }
+
+ /**
+ * Creates a function for `_.forIn` or `_.forInRight`.
+ *
+ * @private
+ * @param {Function} objectFunc The function to iterate over an object.
+ * @returns {Function} Returns the new each function.
+ */
+ function createForIn(objectFunc) {
+ return function(object, iteratee, thisArg) {
+ if (typeof iteratee != 'function' || thisArg !== undefined) {
+ iteratee = bindCallback(iteratee, thisArg, 3);
+ }
+ return objectFunc(object, iteratee, keysIn);
+ };
+ }
+
+ /**
+ * Creates a function for `_.forOwn` or `_.forOwnRight`.
+ *
+ * @private
+ * @param {Function} objectFunc The function to iterate over an object.
+ * @returns {Function} Returns the new each function.
+ */
+ function createForOwn(objectFunc) {
+ return function(object, iteratee, thisArg) {
+ if (typeof iteratee != 'function' || thisArg !== undefined) {
+ iteratee = bindCallback(iteratee, thisArg, 3);
+ }
+ return objectFunc(object, iteratee);
+ };
+ }
+
+ /**
+ * Creates a function for `_.mapKeys` or `_.mapValues`.
+ *
+ * @private
+ * @param {boolean} [isMapKeys] Specify mapping keys instead of values.
+ * @returns {Function} Returns the new map function.
+ */
+ function createObjectMapper(isMapKeys) {
+ return function(object, iteratee, thisArg) {
+ var result = {};
+ iteratee = getCallback(iteratee, thisArg, 3);
+
+ baseForOwn(object, function(value, key, object) {
+ var mapped = iteratee(value, key, object);
+ key = isMapKeys ? mapped : key;
+ value = isMapKeys ? value : mapped;
+ result[key] = value;
+ });
+ return result;
+ };
+ }
+
+ /**
+ * Creates a function for `_.padLeft` or `_.padRight`.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify padding from the right.
+ * @returns {Function} Returns the new pad function.
+ */
+ function createPadDir(fromRight) {
+ return function(string, length, chars) {
+ string = baseToString(string);
+ return (fromRight ? string : '') + createPadding(string, length, chars) + (fromRight ? '' : string);
+ };
+ }
+
+ /**
+ * Creates a `_.partial` or `_.partialRight` function.
+ *
+ * @private
+ * @param {boolean} flag The partial bit flag.
+ * @returns {Function} Returns the new partial function.
+ */
+ function createPartial(flag) {
+ var partialFunc = restParam(function(func, partials) {
+ var holders = replaceHolders(partials, partialFunc.placeholder);
+ return createWrapper(func, flag, undefined, partials, holders);
+ });
+ return partialFunc;
+ }
+
+ /**
+ * Creates a function for `_.reduce` or `_.reduceRight`.
+ *
+ * @private
+ * @param {Function} arrayFunc The function to iterate over an array.
+ * @param {Function} eachFunc The function to iterate over a collection.
+ * @returns {Function} Returns the new each function.
+ */
+ function createReduce(arrayFunc, eachFunc) {
+ return function(collection, iteratee, accumulator, thisArg) {
+ var initFromArray = arguments.length < 3;
+ return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))
+ ? arrayFunc(collection, iteratee, accumulator, initFromArray)
+ : baseReduce(collection, getCallback(iteratee, thisArg, 4), accumulator, initFromArray, eachFunc);
+ };
+ }
+
+ /**
+ * Creates a function that wraps `func` and invokes it with optional `this`
+ * binding of, partial application, and currying.
+ *
+ * @private
+ * @param {Function|string} func The function or method name to reference.
+ * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.
+ * @param {*} [thisArg] The `this` binding of `func`.
+ * @param {Array} [partials] The arguments to prepend to those provided to the new function.
+ * @param {Array} [holders] The `partials` placeholder indexes.
+ * @param {Array} [partialsRight] The arguments to append to those provided to the new function.
+ * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
+ * @param {Array} [argPos] The argument positions of the new function.
+ * @param {number} [ary] The arity cap of `func`.
+ * @param {number} [arity] The arity of `func`.
+ * @returns {Function} Returns the new wrapped function.
+ */
+ function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
+ var isAry = bitmask & ARY_FLAG,
+ isBind = bitmask & BIND_FLAG,
+ isBindKey = bitmask & BIND_KEY_FLAG,
+ isCurry = bitmask & CURRY_FLAG,
+ isCurryBound = bitmask & CURRY_BOUND_FLAG,
+ isCurryRight = bitmask & CURRY_RIGHT_FLAG,
+ Ctor = isBindKey ? undefined : createCtorWrapper(func);
+
+ function wrapper() {
+ // Avoid `arguments` object use disqualifying optimizations by
+ // converting it to an array before providing it to other functions.
+ var length = arguments.length,
+ index = length,
+ args = Array(length);
+
+ while (index--) {
+ args[index] = arguments[index];
+ }
+ if (partials) {
+ args = composeArgs(args, partials, holders);
+ }
+ if (partialsRight) {
+ args = composeArgsRight(args, partialsRight, holdersRight);
+ }
+ if (isCurry || isCurryRight) {
+ var placeholder = wrapper.placeholder,
+ argsHolders = replaceHolders(args, placeholder);
+
+ length -= argsHolders.length;
+ if (length < arity) {
+ var newArgPos = argPos ? arrayCopy(argPos) : undefined,
+ newArity = nativeMax(arity - length, 0),
+ newsHolders = isCurry ? argsHolders : undefined,
+ newHoldersRight = isCurry ? undefined : argsHolders,
+ newPartials = isCurry ? args : undefined,
+ newPartialsRight = isCurry ? undefined : args;
+
+ bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG);
+ bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG);
+
+ if (!isCurryBound) {
+ bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);
+ }
+ var newData = [func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity],
+ result = createHybridWrapper.apply(undefined, newData);
+
+ if (isLaziable(func)) {
+ setData(result, newData);
+ }
+ result.placeholder = placeholder;
+ return result;
+ }
+ }
+ var thisBinding = isBind ? thisArg : this,
+ fn = isBindKey ? thisBinding[func] : func;
+
+ if (argPos) {
+ args = reorder(args, argPos);
+ }
+ if (isAry && ary < args.length) {
+ args.length = ary;
+ }
+ if (this && this !== root && this instanceof wrapper) {
+ fn = Ctor || createCtorWrapper(func);
+ }
+ return fn.apply(thisBinding, args);
+ }
+ return wrapper;
+ }
+
+ /**
+ * Creates the padding required for `string` based on the given `length`.
+ * The `chars` string is truncated if the number of characters exceeds `length`.
+ *
+ * @private
+ * @param {string} string The string to create padding for.
+ * @param {number} [length=0] The padding length.
+ * @param {string} [chars=' '] The string used as padding.
+ * @returns {string} Returns the pad for `string`.
+ */
+ function createPadding(string, length, chars) {
+ var strLength = string.length;
+ length = +length;
+
+ if (strLength >= length || !nativeIsFinite(length)) {
+ return '';
+ }
+ var padLength = length - strLength;
+ chars = chars == null ? ' ' : (chars + '');
+ return repeat(chars, nativeCeil(padLength / chars.length)).slice(0, padLength);
+ }
+
+ /**
+ * Creates a function that wraps `func` and invokes it with the optional `this`
+ * binding of `thisArg` and the `partials` prepended to those provided to
+ * the wrapper.
+ *
+ * @private
+ * @param {Function} func The function to partially apply arguments to.
+ * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.
+ * @param {*} thisArg The `this` binding of `func`.
+ * @param {Array} partials The arguments to prepend to those provided to the new function.
+ * @returns {Function} Returns the new bound function.
+ */
+ function createPartialWrapper(func, bitmask, thisArg, partials) {
+ var isBind = bitmask & BIND_FLAG,
+ Ctor = createCtorWrapper(func);
+
+ function wrapper() {
+ // Avoid `arguments` object use disqualifying optimizations by
+ // converting it to an array before providing it `func`.
+ var argsIndex = -1,
+ argsLength = arguments.length,
+ leftIndex = -1,
+ leftLength = partials.length,
+ args = Array(leftLength + argsLength);
+
+ while (++leftIndex < leftLength) {
+ args[leftIndex] = partials[leftIndex];
+ }
+ while (argsLength--) {
+ args[leftIndex++] = arguments[++argsIndex];
+ }
+ var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
+ return fn.apply(isBind ? thisArg : this, args);
+ }
+ return wrapper;
+ }
+
+ /**
+ * Creates a `_.ceil`, `_.floor`, or `_.round` function.
+ *
+ * @private
+ * @param {string} methodName The name of the `Math` method to use when rounding.
+ * @returns {Function} Returns the new round function.
+ */
+ function createRound(methodName) {
+ var func = Math[methodName];
+ return function(number, precision) {
+ precision = precision === undefined ? 0 : (+precision || 0);
+ if (precision) {
+ precision = pow(10, precision);
+ return func(number * precision) / precision;
+ }
+ return func(number);
+ };
+ }
+
+ /**
+ * Creates a `_.sortedIndex` or `_.sortedLastIndex` function.
+ *
+ * @private
+ * @param {boolean} [retHighest] Specify returning the highest qualified index.
+ * @returns {Function} Returns the new index function.
+ */
+ function createSortedIndex(retHighest) {
+ return function(array, value, iteratee, thisArg) {
+ var callback = getCallback(iteratee);
+ return (iteratee == null && callback === baseCallback)
+ ? binaryIndex(array, value, retHighest)
+ : binaryIndexBy(array, value, callback(iteratee, thisArg, 1), retHighest);
+ };
+ }
+
+ /**
+ * Creates a function that either curries or invokes `func` with optional
+ * `this` binding and partially applied arguments.
+ *
+ * @private
+ * @param {Function|string} func The function or method name to reference.
+ * @param {number} bitmask The bitmask of flags.
+ * The bitmask may be composed of the following flags:
+ * 1 - `_.bind`
+ * 2 - `_.bindKey`
+ * 4 - `_.curry` or `_.curryRight` of a bound function
+ * 8 - `_.curry`
+ * 16 - `_.curryRight`
+ * 32 - `_.partial`
+ * 64 - `_.partialRight`
+ * 128 - `_.rearg`
+ * 256 - `_.ary`
+ * @param {*} [thisArg] The `this` binding of `func`.
+ * @param {Array} [partials] The arguments to be partially applied.
+ * @param {Array} [holders] The `partials` placeholder indexes.
+ * @param {Array} [argPos] The argument positions of the new function.
+ * @param {number} [ary] The arity cap of `func`.
+ * @param {number} [arity] The arity of `func`.
+ * @returns {Function} Returns the new wrapped function.
+ */
+ function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
+ var isBindKey = bitmask & BIND_KEY_FLAG;
+ if (!isBindKey && typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ var length = partials ? partials.length : 0;
+ if (!length) {
+ bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG);
+ partials = holders = undefined;
+ }
+ length -= (holders ? holders.length : 0);
+ if (bitmask & PARTIAL_RIGHT_FLAG) {
+ var partialsRight = partials,
+ holdersRight = holders;
+
+ partials = holders = undefined;
+ }
+ var data = isBindKey ? undefined : getData(func),
+ newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];
+
+ if (data) {
+ mergeData(newData, data);
+ bitmask = newData[1];
+ arity = newData[9];
+ }
+ newData[9] = arity == null
+ ? (isBindKey ? 0 : func.length)
+ : (nativeMax(arity - length, 0) || 0);
+
+ if (bitmask == BIND_FLAG) {
+ var result = createBindWrapper(newData[0], newData[2]);
+ } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !newData[4].length) {
+ result = createPartialWrapper.apply(undefined, newData);
+ } else {
+ result = createHybridWrapper.apply(undefined, newData);
+ }
+ var setter = data ? baseSetData : setData;
+ return setter(result, newData);
+ }
+
+ /**
+ * A specialized version of `baseIsEqualDeep` for arrays with support for
+ * partial deep comparisons.
+ *
+ * @private
+ * @param {Array} array The array to compare.
+ * @param {Array} other The other array to compare.
+ * @param {Function} equalFunc The function to determine equivalents of values.
+ * @param {Function} [customizer] The function to customize comparing arrays.
+ * @param {boolean} [isLoose] Specify performing partial comparisons.
+ * @param {Array} [stackA] Tracks traversed `value` objects.
+ * @param {Array} [stackB] Tracks traversed `other` objects.
+ * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
+ */
+ function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {
+ var index = -1,
+ arrLength = array.length,
+ othLength = other.length;
+
+ if (arrLength != othLength && !(isLoose && othLength > arrLength)) {
+ return false;
+ }
+ // Ignore non-index properties.
+ while (++index < arrLength) {
+ var arrValue = array[index],
+ othValue = other[index],
+ result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined;
+
+ if (result !== undefined) {
+ if (result) {
+ continue;
+ }
+ return false;
+ }
+ // Recursively compare arrays (susceptible to call stack limits).
+ if (isLoose) {
+ if (!arraySome(other, function(othValue) {
+ return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);
+ })) {
+ return false;
+ }
+ } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * A specialized version of `baseIsEqualDeep` for comparing objects of
+ * the same `toStringTag`.
+ *
+ * **Note:** This function only supports comparing values with tags of
+ * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @param {string} tag The `toStringTag` of the objects to compare.
+ * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+ */
+ function equalByTag(object, other, tag) {
+ switch (tag) {
+ case boolTag:
+ case dateTag:
+ // Coerce dates and booleans to numbers, dates to milliseconds and booleans
+ // to `1` or `0` treating invalid dates coerced to `NaN` as not equal.
+ return +object == +other;
+
+ case errorTag:
+ return object.name == other.name && object.message == other.message;
+
+ case numberTag:
+ // Treat `NaN` vs. `NaN` as equal.
+ return (object != +object)
+ ? other != +other
+ : object == +other;
+
+ case regexpTag:
+ case stringTag:
+ // Coerce regexes to strings and treat strings primitives and string
+ // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.
+ return object == (other + '');
+ }
+ return false;
+ }
+
+ /**
+ * A specialized version of `baseIsEqualDeep` for objects with support for
+ * partial deep comparisons.
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @param {Function} equalFunc The function to determine equivalents of values.
+ * @param {Function} [customizer] The function to customize comparing values.
+ * @param {boolean} [isLoose] Specify performing partial comparisons.
+ * @param {Array} [stackA] Tracks traversed `value` objects.
+ * @param {Array} [stackB] Tracks traversed `other` objects.
+ * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+ */
+ function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
+ var objProps = keys(object),
+ objLength = objProps.length,
+ othProps = keys(other),
+ othLength = othProps.length;
+
+ if (objLength != othLength && !isLoose) {
+ return false;
+ }
+ var index = objLength;
+ while (index--) {
+ var key = objProps[index];
+ if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {
+ return false;
+ }
+ }
+ var skipCtor = isLoose;
+ while (++index < objLength) {
+ key = objProps[index];
+ var objValue = object[key],
+ othValue = other[key],
+ result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined;
+
+ // Recursively compare objects (susceptible to call stack limits).
+ if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) {
+ return false;
+ }
+ skipCtor || (skipCtor = key == 'constructor');
+ }
+ if (!skipCtor) {
+ var objCtor = object.constructor,
+ othCtor = other.constructor;
+
+ // Non `Object` object instances with different constructors are not equal.
+ if (objCtor != othCtor &&
+ ('constructor' in object && 'constructor' in other) &&
+ !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
+ typeof othCtor == 'function' && othCtor instanceof othCtor)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Gets the appropriate "callback" function. If the `_.callback` method is
+ * customized this function returns the custom method, otherwise it returns
+ * the `baseCallback` function. If arguments are provided the chosen function
+ * is invoked with them and its result is returned.
+ *
+ * @private
+ * @returns {Function} Returns the chosen function or its result.
+ */
+ function getCallback(func, thisArg, argCount) {
+ var result = lodash.callback || callback;
+ result = result === callback ? baseCallback : result;
+ return argCount ? result(func, thisArg, argCount) : result;
+ }
+
+ /**
+ * Gets metadata for `func`.
+ *
+ * @private
+ * @param {Function} func The function to query.
+ * @returns {*} Returns the metadata for `func`.
+ */
+ var getData = !metaMap ? noop : function(func) {
+ return metaMap.get(func);
+ };
+
+ /**
+ * Gets the name of `func`.
+ *
+ * @private
+ * @param {Function} func The function to query.
+ * @returns {string} Returns the function name.
+ */
+ function getFuncName(func) {
+ var result = (func.name + ''),
+ array = realNames[result],
+ length = array ? array.length : 0;
+
+ while (length--) {
+ var data = array[length],
+ otherFunc = data.func;
+ if (otherFunc == null || otherFunc == func) {
+ return data.name;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Gets the appropriate "indexOf" function. If the `_.indexOf` method is
+ * customized this function returns the custom method, otherwise it returns
+ * the `baseIndexOf` function. If arguments are provided the chosen function
+ * is invoked with them and its result is returned.
+ *
+ * @private
+ * @returns {Function|number} Returns the chosen function or its result.
+ */
+ function getIndexOf(collection, target, fromIndex) {
+ var result = lodash.indexOf || indexOf;
+ result = result === indexOf ? baseIndexOf : result;
+ return collection ? result(collection, target, fromIndex) : result;
+ }
+
+ /**
+ * Gets the "length" property value of `object`.
+ *
+ * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
+ * that affects Safari on at least iOS 8.1-8.3 ARM64.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {*} Returns the "length" value.
+ */
+ var getLength = baseProperty('length');
+
+ /**
+ * Gets the propery names, values, and compare flags of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the match data of `object`.
+ */
+ function getMatchData(object) {
+ var result = pairs(object),
+ length = result.length;
+
+ while (length--) {
+ result[length][2] = isStrictComparable(result[length][1]);
+ }
+ return result;
+ }
+
+ /**
+ * Gets the native function at `key` of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {string} key The key of the method to get.
+ * @returns {*} Returns the function if it's native, else `undefined`.
+ */
+ function getNative(object, key) {
+ var value = object == null ? undefined : object[key];
+ return isNative(value) ? value : undefined;
+ }
+
+ /**
+ * Gets the view, applying any `transforms` to the `start` and `end` positions.
+ *
+ * @private
+ * @param {number} start The start of the view.
+ * @param {number} end The end of the view.
+ * @param {Array} transforms The transformations to apply to the view.
+ * @returns {Object} Returns an object containing the `start` and `end`
+ * positions of the view.
+ */
+ function getView(start, end, transforms) {
+ var index = -1,
+ length = transforms.length;
+
+ while (++index < length) {
+ var data = transforms[index],
+ size = data.size;
+
+ switch (data.type) {
+ case 'drop': start += size; break;
+ case 'dropRight': end -= size; break;
+ case 'take': end = nativeMin(end, start + size); break;
+ case 'takeRight': start = nativeMax(start, end - size); break;
+ }
+ }
+ return { 'start': start, 'end': end };
+ }
+
+ /**
+ * Initializes an array clone.
+ *
+ * @private
+ * @param {Array} array The array to clone.
+ * @returns {Array} Returns the initialized clone.
+ */
+ function initCloneArray(array) {
+ var length = array.length,
+ result = new array.constructor(length);
+
+ // Add array properties assigned by `RegExp#exec`.
+ if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
+ result.index = array.index;
+ result.input = array.input;
+ }
+ return result;
+ }
+
+ /**
+ * Initializes an object clone.
+ *
+ * @private
+ * @param {Object} object The object to clone.
+ * @returns {Object} Returns the initialized clone.
+ */
+ function initCloneObject(object) {
+ var Ctor = object.constructor;
+ if (!(typeof Ctor == 'function' && Ctor instanceof Ctor)) {
+ Ctor = Object;
+ }
+ return new Ctor;
+ }
+
+ /**
+ * Initializes an object clone based on its `toStringTag`.
+ *
+ * **Note:** This function only supports cloning values with tags of
+ * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
+ *
+ * @private
+ * @param {Object} object The object to clone.
+ * @param {string} tag The `toStringTag` of the object to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the initialized clone.
+ */
+ function initCloneByTag(object, tag, isDeep) {
+ var Ctor = object.constructor;
+ switch (tag) {
+ case arrayBufferTag:
+ return bufferClone(object);
+
+ case boolTag:
+ case dateTag:
+ return new Ctor(+object);
+
+ case float32Tag: case float64Tag:
+ case int8Tag: case int16Tag: case int32Tag:
+ case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
+ var buffer = object.buffer;
+ return new Ctor(isDeep ? bufferClone(buffer) : buffer, object.byteOffset, object.length);
+
+ case numberTag:
+ case stringTag:
+ return new Ctor(object);
+
+ case regexpTag:
+ var result = new Ctor(object.source, reFlags.exec(object));
+ result.lastIndex = object.lastIndex;
+ }
+ return result;
+ }
+
+ /**
+ * Invokes the method at `path` on `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path of the method to invoke.
+ * @param {Array} args The arguments to invoke the method with.
+ * @returns {*} Returns the result of the invoked method.
+ */
+ function invokePath(object, path, args) {
+ if (object != null && !isKey(path, object)) {
+ path = toPath(path);
+ object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
+ path = last(path);
+ }
+ var func = object == null ? object : object[path];
+ return func == null ? undefined : func.apply(object, args);
+ }
+
+ /**
+ * Checks if `value` is array-like.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
+ */
+ function isArrayLike(value) {
+ return value != null && isLength(getLength(value));
+ }
+
+ /**
+ * Checks if `value` is a valid array-like index.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
+ * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
+ */
+ function isIndex(value, length) {
+ value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
+ length = length == null ? MAX_SAFE_INTEGER : length;
+ return value > -1 && value % 1 == 0 && value < length;
+ }
+
+ /**
+ * Checks if the provided arguments are from an iteratee call.
+ *
+ * @private
+ * @param {*} value The potential iteratee value argument.
+ * @param {*} index The potential iteratee index or key argument.
+ * @param {*} object The potential iteratee object argument.
+ * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.
+ */
+ function isIterateeCall(value, index, object) {
+ if (!isObject(object)) {
+ return false;
+ }
+ var type = typeof index;
+ if (type == 'number'
+ ? (isArrayLike(object) && isIndex(index, object.length))
+ : (type == 'string' && index in object)) {
+ var other = object[index];
+ return value === value ? (value === other) : (other !== other);
+ }
+ return false;
+ }
+
+ /**
+ * Checks if `value` is a property name and not a property path.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {Object} [object] The object to query keys on.
+ * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
+ */
+ function isKey(value, object) {
+ var type = typeof value;
+ if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') {
+ return true;
+ }
+ if (isArray(value)) {
+ return false;
+ }
+ var result = !reIsDeepProp.test(value);
+ return result || (object != null && value in toObject(object));
+ }
+
+ /**
+ * Checks if `func` has a lazy counterpart.
+ *
+ * @private
+ * @param {Function} func The function to check.
+ * @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`.
+ */
+ function isLaziable(func) {
+ var funcName = getFuncName(func),
+ other = lodash[funcName];
+
+ if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
+ return false;
+ }
+ if (func === other) {
+ return true;
+ }
+ var data = getData(other);
+ return !!data && func === data[0];
+ }
+
+ /**
+ * Checks if `value` is a valid array-like length.
+ *
+ * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+ */
+ function isLength(value) {
+ return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+ }
+
+ /**
+ * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` if suitable for strict
+ * equality comparisons, else `false`.
+ */
+ function isStrictComparable(value) {
+ return value === value && !isObject(value);
+ }
+
+ /**
+ * Merges the function metadata of `source` into `data`.
+ *
+ * Merging metadata reduces the number of wrappers required to invoke a function.
+ * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
+ * may be applied regardless of execution order. Methods like `_.ary` and `_.rearg`
+ * augment function arguments, making the order in which they are executed important,
+ * preventing the merging of metadata. However, we make an exception for a safe
+ * common case where curried functions have `_.ary` and or `_.rearg` applied.
+ *
+ * @private
+ * @param {Array} data The destination metadata.
+ * @param {Array} source The source metadata.
+ * @returns {Array} Returns `data`.
+ */
+ function mergeData(data, source) {
+ var bitmask = data[1],
+ srcBitmask = source[1],
+ newBitmask = bitmask | srcBitmask,
+ isCommon = newBitmask < ARY_FLAG;
+
+ var isCombo =
+ (srcBitmask == ARY_FLAG && bitmask == CURRY_FLAG) ||
+ (srcBitmask == ARY_FLAG && bitmask == REARG_FLAG && data[7].length <= source[8]) ||
+ (srcBitmask == (ARY_FLAG | REARG_FLAG) && bitmask == CURRY_FLAG);
+
+ // Exit early if metadata can't be merged.
+ if (!(isCommon || isCombo)) {
+ return data;
+ }
+ // Use source `thisArg` if available.
+ if (srcBitmask & BIND_FLAG) {
+ data[2] = source[2];
+ // Set when currying a bound function.
+ newBitmask |= (bitmask & BIND_FLAG) ? 0 : CURRY_BOUND_FLAG;
+ }
+ // Compose partial arguments.
+ var value = source[3];
+ if (value) {
+ var partials = data[3];
+ data[3] = partials ? composeArgs(partials, value, source[4]) : arrayCopy(value);
+ data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : arrayCopy(source[4]);
+ }
+ // Compose partial right arguments.
+ value = source[5];
+ if (value) {
+ partials = data[5];
+ data[5] = partials ? composeArgsRight(partials, value, source[6]) : arrayCopy(value);
+ data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : arrayCopy(source[6]);
+ }
+ // Use source `argPos` if available.
+ value = source[7];
+ if (value) {
+ data[7] = arrayCopy(value);
+ }
+ // Use source `ary` if it's smaller.
+ if (srcBitmask & ARY_FLAG) {
+ data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
+ }
+ // Use source `arity` if one is not provided.
+ if (data[9] == null) {
+ data[9] = source[9];
+ }
+ // Use source `func` and merge bitmasks.
+ data[0] = source[0];
+ data[1] = newBitmask;
+
+ return data;
+ }
+
+ /**
+ * Used by `_.defaultsDeep` to customize its `_.merge` use.
+ *
+ * @private
+ * @param {*} objectValue The destination object property value.
+ * @param {*} sourceValue The source object property value.
+ * @returns {*} Returns the value to assign to the destination object.
+ */
+ function mergeDefaults(objectValue, sourceValue) {
+ return objectValue === undefined ? sourceValue : merge(objectValue, sourceValue, mergeDefaults);
+ }
+
+ /**
+ * A specialized version of `_.pick` which picks `object` properties specified
+ * by `props`.
+ *
+ * @private
+ * @param {Object} object The source object.
+ * @param {string[]} props The property names to pick.
+ * @returns {Object} Returns the new object.
+ */
+ function pickByArray(object, props) {
+ object = toObject(object);
+
+ var index = -1,
+ length = props.length,
+ result = {};
+
+ while (++index < length) {
+ var key = props[index];
+ if (key in object) {
+ result[key] = object[key];
+ }
+ }
+ return result;
+ }
+
+ /**
+ * A specialized version of `_.pick` which picks `object` properties `predicate`
+ * returns truthy for.
+ *
+ * @private
+ * @param {Object} object The source object.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {Object} Returns the new object.
+ */
+ function pickByCallback(object, predicate) {
+ var result = {};
+ baseForIn(object, function(value, key, object) {
+ if (predicate(value, key, object)) {
+ result[key] = value;
+ }
+ });
+ return result;
+ }
+
+ /**
+ * Reorder `array` according to the specified indexes where the element at
+ * the first index is assigned as the first element, the element at
+ * the second index is assigned as the second element, and so on.
+ *
+ * @private
+ * @param {Array} array The array to reorder.
+ * @param {Array} indexes The arranged array indexes.
+ * @returns {Array} Returns `array`.
+ */
+ function reorder(array, indexes) {
+ var arrLength = array.length,
+ length = nativeMin(indexes.length, arrLength),
+ oldArray = arrayCopy(array);
+
+ while (length--) {
+ var index = indexes[length];
+ array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
+ }
+ return array;
+ }
+
+ /**
+ * Sets metadata for `func`.
+ *
+ * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
+ * period of time, it will trip its breaker and transition to an identity function
+ * to avoid garbage collection pauses in V8. See [V8 issue 2070](https://code.google.com/p/v8/issues/detail?id=2070)
+ * for more details.
+ *
+ * @private
+ * @param {Function} func The function to associate metadata with.
+ * @param {*} data The metadata.
+ * @returns {Function} Returns `func`.
+ */
+ var setData = (function() {
+ var count = 0,
+ lastCalled = 0;
+
+ return function(key, value) {
+ var stamp = now(),
+ remaining = HOT_SPAN - (stamp - lastCalled);
+
+ lastCalled = stamp;
+ if (remaining > 0) {
+ if (++count >= HOT_COUNT) {
+ return key;
+ }
+ } else {
+ count = 0;
+ }
+ return baseSetData(key, value);
+ };
+ }());
+
+ /**
+ * A fallback implementation of `Object.keys` which creates an array of the
+ * own enumerable property names of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ */
+ function shimKeys(object) {
+ var props = keysIn(object),
+ propsLength = props.length,
+ length = propsLength && object.length;
+
+ var allowIndexes = !!length && isLength(length) &&
+ (isArray(object) || isArguments(object));
+
+ var index = -1,
+ result = [];
+
+ while (++index < propsLength) {
+ var key = props[index];
+ if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {
+ result.push(key);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Converts `value` to an array-like object if it's not one.
+ *
+ * @private
+ * @param {*} value The value to process.
+ * @returns {Array|Object} Returns the array-like object.
+ */
+ function toIterable(value) {
+ if (value == null) {
+ return [];
+ }
+ if (!isArrayLike(value)) {
+ return values(value);
+ }
+ return isObject(value) ? value : Object(value);
+ }
+
+ /**
+ * Converts `value` to an object if it's not one.
+ *
+ * @private
+ * @param {*} value The value to process.
+ * @returns {Object} Returns the object.
+ */
+ function toObject(value) {
+ return isObject(value) ? value : Object(value);
+ }
+
+ /**
+ * Converts `value` to property path array if it's not one.
+ *
+ * @private
+ * @param {*} value The value to process.
+ * @returns {Array} Returns the property path array.
+ */
+ function toPath(value) {
+ if (isArray(value)) {
+ return value;
+ }
+ var result = [];
+ baseToString(value).replace(rePropName, function(match, number, quote, string) {
+ result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
+ });
+ return result;
+ }
+
+ /**
+ * Creates a clone of `wrapper`.
+ *
+ * @private
+ * @param {Object} wrapper The wrapper to clone.
+ * @returns {Object} Returns the cloned wrapper.
+ */
+ function wrapperClone(wrapper) {
+ return wrapper instanceof LazyWrapper
+ ? wrapper.clone()
+ : new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__, arrayCopy(wrapper.__actions__));
+ }
+
+ /*------------------------------------------------------------------------*/
+
+ /**
+ * Creates an array of elements split into groups the length of `size`.
+ * If `collection` can't be split evenly, the final chunk will be the remaining
+ * elements.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to process.
+ * @param {number} [size=1] The length of each chunk.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Array} Returns the new array containing chunks.
+ * @example
+ *
+ * _.chunk(['a', 'b', 'c', 'd'], 2);
+ * // => [['a', 'b'], ['c', 'd']]
+ *
+ * _.chunk(['a', 'b', 'c', 'd'], 3);
+ * // => [['a', 'b', 'c'], ['d']]
+ */
+ function chunk(array, size, guard) {
+ if (guard ? isIterateeCall(array, size, guard) : size == null) {
+ size = 1;
+ } else {
+ size = nativeMax(nativeFloor(size) || 1, 1);
+ }
+ var index = 0,
+ length = array ? array.length : 0,
+ resIndex = -1,
+ result = Array(nativeCeil(length / size));
+
+ while (index < length) {
+ result[++resIndex] = baseSlice(array, index, (index += size));
+ }
+ return result;
+ }
+
+ /**
+ * Creates an array with all falsey values removed. The values `false`, `null`,
+ * `0`, `""`, `undefined`, and `NaN` are falsey.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to compact.
+ * @returns {Array} Returns the new array of filtered values.
+ * @example
+ *
+ * _.compact([0, 1, false, 2, '', 3]);
+ * // => [1, 2, 3]
+ */
+ function compact(array) {
+ var index = -1,
+ length = array ? array.length : 0,
+ resIndex = -1,
+ result = [];
+
+ while (++index < length) {
+ var value = array[index];
+ if (value) {
+ result[++resIndex] = value;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Creates an array of unique `array` values not included in the other
+ * provided arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {...Array} [values] The arrays of values to exclude.
+ * @returns {Array} Returns the new array of filtered values.
+ * @example
+ *
+ * _.difference([1, 2, 3], [4, 2]);
+ * // => [1, 3]
+ */
+ var difference = restParam(function(array, values) {
+ return (isObjectLike(array) && isArrayLike(array))
+ ? baseDifference(array, baseFlatten(values, false, true))
+ : [];
+ });
+
+ /**
+ * Creates a slice of `array` with `n` elements dropped from the beginning.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {number} [n=1] The number of elements to drop.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.drop([1, 2, 3]);
+ * // => [2, 3]
+ *
+ * _.drop([1, 2, 3], 2);
+ * // => [3]
+ *
+ * _.drop([1, 2, 3], 5);
+ * // => []
+ *
+ * _.drop([1, 2, 3], 0);
+ * // => [1, 2, 3]
+ */
+ function drop(array, n, guard) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return [];
+ }
+ if (guard ? isIterateeCall(array, n, guard) : n == null) {
+ n = 1;
+ }
+ return baseSlice(array, n < 0 ? 0 : n);
+ }
+
+ /**
+ * Creates a slice of `array` with `n` elements dropped from the end.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {number} [n=1] The number of elements to drop.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.dropRight([1, 2, 3]);
+ * // => [1, 2]
+ *
+ * _.dropRight([1, 2, 3], 2);
+ * // => [1]
+ *
+ * _.dropRight([1, 2, 3], 5);
+ * // => []
+ *
+ * _.dropRight([1, 2, 3], 0);
+ * // => [1, 2, 3]
+ */
+ function dropRight(array, n, guard) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return [];
+ }
+ if (guard ? isIterateeCall(array, n, guard) : n == null) {
+ n = 1;
+ }
+ n = length - (+n || 0);
+ return baseSlice(array, 0, n < 0 ? 0 : n);
+ }
+
+ /**
+ * Creates a slice of `array` excluding elements dropped from the end.
+ * Elements are dropped until `predicate` returns falsey. The predicate is
+ * bound to `thisArg` and invoked with three arguments: (value, index, array).
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that match the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.dropRightWhile([1, 2, 3], function(n) {
+ * return n > 1;
+ * });
+ * // => [1]
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': true },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': false }
+ * ];
+ *
+ * // using the `_.matches` callback shorthand
+ * _.pluck(_.dropRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');
+ * // => ['barney', 'fred']
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.pluck(_.dropRightWhile(users, 'active', false), 'user');
+ * // => ['barney']
+ *
+ * // using the `_.property` callback shorthand
+ * _.pluck(_.dropRightWhile(users, 'active'), 'user');
+ * // => ['barney', 'fred', 'pebbles']
+ */
+ function dropRightWhile(array, predicate, thisArg) {
+ return (array && array.length)
+ ? baseWhile(array, getCallback(predicate, thisArg, 3), true, true)
+ : [];
+ }
+
+ /**
+ * Creates a slice of `array` excluding elements dropped from the beginning.
+ * Elements are dropped until `predicate` returns falsey. The predicate is
+ * bound to `thisArg` and invoked with three arguments: (value, index, array).
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.dropWhile([1, 2, 3], function(n) {
+ * return n < 3;
+ * });
+ * // => [3]
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': false },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': true }
+ * ];
+ *
+ * // using the `_.matches` callback shorthand
+ * _.pluck(_.dropWhile(users, { 'user': 'barney', 'active': false }), 'user');
+ * // => ['fred', 'pebbles']
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.pluck(_.dropWhile(users, 'active', false), 'user');
+ * // => ['pebbles']
+ *
+ * // using the `_.property` callback shorthand
+ * _.pluck(_.dropWhile(users, 'active'), 'user');
+ * // => ['barney', 'fred', 'pebbles']
+ */
+ function dropWhile(array, predicate, thisArg) {
+ return (array && array.length)
+ ? baseWhile(array, getCallback(predicate, thisArg, 3), true)
+ : [];
+ }
+
+ /**
+ * Fills elements of `array` with `value` from `start` up to, but not
+ * including, `end`.
+ *
+ * **Note:** This method mutates `array`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to fill.
+ * @param {*} value The value to fill `array` with.
+ * @param {number} [start=0] The start position.
+ * @param {number} [end=array.length] The end position.
+ * @returns {Array} Returns `array`.
+ * @example
+ *
+ * var array = [1, 2, 3];
+ *
+ * _.fill(array, 'a');
+ * console.log(array);
+ * // => ['a', 'a', 'a']
+ *
+ * _.fill(Array(3), 2);
+ * // => [2, 2, 2]
+ *
+ * _.fill([4, 6, 8], '*', 1, 2);
+ * // => [4, '*', 8]
+ */
+ function fill(array, value, start, end) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return [];
+ }
+ if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
+ start = 0;
+ end = length;
+ }
+ return baseFill(array, value, start, end);
+ }
+
+ /**
+ * This method is like `_.find` except that it returns the index of the first
+ * element `predicate` returns truthy for instead of the element itself.
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to search.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {number} Returns the index of the found element, else `-1`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': false },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': true }
+ * ];
+ *
+ * _.findIndex(users, function(chr) {
+ * return chr.user == 'barney';
+ * });
+ * // => 0
+ *
+ * // using the `_.matches` callback shorthand
+ * _.findIndex(users, { 'user': 'fred', 'active': false });
+ * // => 1
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.findIndex(users, 'active', false);
+ * // => 0
+ *
+ * // using the `_.property` callback shorthand
+ * _.findIndex(users, 'active');
+ * // => 2
+ */
+ var findIndex = createFindIndex();
+
+ /**
+ * This method is like `_.findIndex` except that it iterates over elements
+ * of `collection` from right to left.
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to search.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {number} Returns the index of the found element, else `-1`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': true },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': false }
+ * ];
+ *
+ * _.findLastIndex(users, function(chr) {
+ * return chr.user == 'pebbles';
+ * });
+ * // => 2
+ *
+ * // using the `_.matches` callback shorthand
+ * _.findLastIndex(users, { 'user': 'barney', 'active': true });
+ * // => 0
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.findLastIndex(users, 'active', false);
+ * // => 2
+ *
+ * // using the `_.property` callback shorthand
+ * _.findLastIndex(users, 'active');
+ * // => 0
+ */
+ var findLastIndex = createFindIndex(true);
+
+ /**
+ * Gets the first element of `array`.
+ *
+ * @static
+ * @memberOf _
+ * @alias head
+ * @category Array
+ * @param {Array} array The array to query.
+ * @returns {*} Returns the first element of `array`.
+ * @example
+ *
+ * _.first([1, 2, 3]);
+ * // => 1
+ *
+ * _.first([]);
+ * // => undefined
+ */
+ function first(array) {
+ return array ? array[0] : undefined;
+ }
+
+ /**
+ * Flattens a nested array. If `isDeep` is `true` the array is recursively
+ * flattened, otherwise it's only flattened a single level.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to flatten.
+ * @param {boolean} [isDeep] Specify a deep flatten.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Array} Returns the new flattened array.
+ * @example
+ *
+ * _.flatten([1, [2, 3, [4]]]);
+ * // => [1, 2, 3, [4]]
+ *
+ * // using `isDeep`
+ * _.flatten([1, [2, 3, [4]]], true);
+ * // => [1, 2, 3, 4]
+ */
+ function flatten(array, isDeep, guard) {
+ var length = array ? array.length : 0;
+ if (guard && isIterateeCall(array, isDeep, guard)) {
+ isDeep = false;
+ }
+ return length ? baseFlatten(array, isDeep) : [];
+ }
+
+ /**
+ * Recursively flattens a nested array.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to recursively flatten.
+ * @returns {Array} Returns the new flattened array.
+ * @example
+ *
+ * _.flattenDeep([1, [2, 3, [4]]]);
+ * // => [1, 2, 3, 4]
+ */
+ function flattenDeep(array) {
+ var length = array ? array.length : 0;
+ return length ? baseFlatten(array, true) : [];
+ }
+
+ /**
+ * Gets the index at which the first occurrence of `value` is found in `array`
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * for equality comparisons. If `fromIndex` is negative, it's used as the offset
+ * from the end of `array`. If `array` is sorted providing `true` for `fromIndex`
+ * performs a faster binary search.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to search.
+ * @param {*} value The value to search for.
+ * @param {boolean|number} [fromIndex=0] The index to search from or `true`
+ * to perform a binary search on a sorted array.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ * @example
+ *
+ * _.indexOf([1, 2, 1, 2], 2);
+ * // => 1
+ *
+ * // using `fromIndex`
+ * _.indexOf([1, 2, 1, 2], 2, 2);
+ * // => 3
+ *
+ * // performing a binary search
+ * _.indexOf([1, 1, 2, 2], 2, true);
+ * // => 2
+ */
+ function indexOf(array, value, fromIndex) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return -1;
+ }
+ if (typeof fromIndex == 'number') {
+ fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;
+ } else if (fromIndex) {
+ var index = binaryIndex(array, value);
+ if (index < length &&
+ (value === value ? (value === array[index]) : (array[index] !== array[index]))) {
+ return index;
+ }
+ return -1;
+ }
+ return baseIndexOf(array, value, fromIndex || 0);
+ }
+
+ /**
+ * Gets all but the last element of `array`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.initial([1, 2, 3]);
+ * // => [1, 2]
+ */
+ function initial(array) {
+ return dropRight(array, 1);
+ }
+
+ /**
+ * Creates an array of unique values that are included in all of the provided
+ * arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @returns {Array} Returns the new array of shared values.
+ * @example
+ * _.intersection([1, 2], [4, 2], [2, 1]);
+ * // => [2]
+ */
+ var intersection = restParam(function(arrays) {
+ var othLength = arrays.length,
+ othIndex = othLength,
+ caches = Array(length),
+ indexOf = getIndexOf(),
+ isCommon = indexOf === baseIndexOf,
+ result = [];
+
+ while (othIndex--) {
+ var value = arrays[othIndex] = isArrayLike(value = arrays[othIndex]) ? value : [];
+ caches[othIndex] = (isCommon && value.length >= 120) ? createCache(othIndex && value) : null;
+ }
+ var array = arrays[0],
+ index = -1,
+ length = array ? array.length : 0,
+ seen = caches[0];
+
+ outer:
+ while (++index < length) {
+ value = array[index];
+ if ((seen ? cacheIndexOf(seen, value) : indexOf(result, value, 0)) < 0) {
+ var othIndex = othLength;
+ while (--othIndex) {
+ var cache = caches[othIndex];
+ if ((cache ? cacheIndexOf(cache, value) : indexOf(arrays[othIndex], value, 0)) < 0) {
+ continue outer;
+ }
+ }
+ if (seen) {
+ seen.push(value);
+ }
+ result.push(value);
+ }
+ }
+ return result;
+ });
+
+ /**
+ * Gets the last element of `array`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @returns {*} Returns the last element of `array`.
+ * @example
+ *
+ * _.last([1, 2, 3]);
+ * // => 3
+ */
+ function last(array) {
+ var length = array ? array.length : 0;
+ return length ? array[length - 1] : undefined;
+ }
+
+ /**
+ * This method is like `_.indexOf` except that it iterates over elements of
+ * `array` from right to left.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to search.
+ * @param {*} value The value to search for.
+ * @param {boolean|number} [fromIndex=array.length-1] The index to search from
+ * or `true` to perform a binary search on a sorted array.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ * @example
+ *
+ * _.lastIndexOf([1, 2, 1, 2], 2);
+ * // => 3
+ *
+ * // using `fromIndex`
+ * _.lastIndexOf([1, 2, 1, 2], 2, 2);
+ * // => 1
+ *
+ * // performing a binary search
+ * _.lastIndexOf([1, 1, 2, 2], 2, true);
+ * // => 3
+ */
+ function lastIndexOf(array, value, fromIndex) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return -1;
+ }
+ var index = length;
+ if (typeof fromIndex == 'number') {
+ index = (fromIndex < 0 ? nativeMax(length + fromIndex, 0) : nativeMin(fromIndex || 0, length - 1)) + 1;
+ } else if (fromIndex) {
+ index = binaryIndex(array, value, true) - 1;
+ var other = array[index];
+ if (value === value ? (value === other) : (other !== other)) {
+ return index;
+ }
+ return -1;
+ }
+ if (value !== value) {
+ return indexOfNaN(array, index, true);
+ }
+ while (index--) {
+ if (array[index] === value) {
+ return index;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Removes all provided values from `array` using
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * **Note:** Unlike `_.without`, this method mutates `array`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to modify.
+ * @param {...*} [values] The values to remove.
+ * @returns {Array} Returns `array`.
+ * @example
+ *
+ * var array = [1, 2, 3, 1, 2, 3];
+ *
+ * _.pull(array, 2, 3);
+ * console.log(array);
+ * // => [1, 1]
+ */
+ function pull() {
+ var args = arguments,
+ array = args[0];
+
+ if (!(array && array.length)) {
+ return array;
+ }
+ var index = 0,
+ indexOf = getIndexOf(),
+ length = args.length;
+
+ while (++index < length) {
+ var fromIndex = 0,
+ value = args[index];
+
+ while ((fromIndex = indexOf(array, value, fromIndex)) > -1) {
+ splice.call(array, fromIndex, 1);
+ }
+ }
+ return array;
+ }
+
+ /**
+ * Removes elements from `array` corresponding to the given indexes and returns
+ * an array of the removed elements. Indexes may be specified as an array of
+ * indexes or as individual arguments.
+ *
+ * **Note:** Unlike `_.at`, this method mutates `array`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to modify.
+ * @param {...(number|number[])} [indexes] The indexes of elements to remove,
+ * specified as individual indexes or arrays of indexes.
+ * @returns {Array} Returns the new array of removed elements.
+ * @example
+ *
+ * var array = [5, 10, 15, 20];
+ * var evens = _.pullAt(array, 1, 3);
+ *
+ * console.log(array);
+ * // => [5, 15]
+ *
+ * console.log(evens);
+ * // => [10, 20]
+ */
+ var pullAt = restParam(function(array, indexes) {
+ indexes = baseFlatten(indexes);
+
+ var result = baseAt(array, indexes);
+ basePullAt(array, indexes.sort(baseCompareAscending));
+ return result;
+ });
+
+ /**
+ * Removes all elements from `array` that `predicate` returns truthy for
+ * and returns an array of the removed elements. The predicate is bound to
+ * `thisArg` and invoked with three arguments: (value, index, array).
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * **Note:** Unlike `_.filter`, this method mutates `array`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to modify.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {Array} Returns the new array of removed elements.
+ * @example
+ *
+ * var array = [1, 2, 3, 4];
+ * var evens = _.remove(array, function(n) {
+ * return n % 2 == 0;
+ * });
+ *
+ * console.log(array);
+ * // => [1, 3]
+ *
+ * console.log(evens);
+ * // => [2, 4]
+ */
+ function remove(array, predicate, thisArg) {
+ var result = [];
+ if (!(array && array.length)) {
+ return result;
+ }
+ var index = -1,
+ indexes = [],
+ length = array.length;
+
+ predicate = getCallback(predicate, thisArg, 3);
+ while (++index < length) {
+ var value = array[index];
+ if (predicate(value, index, array)) {
+ result.push(value);
+ indexes.push(index);
+ }
+ }
+ basePullAt(array, indexes);
+ return result;
+ }
+
+ /**
+ * Gets all but the first element of `array`.
+ *
+ * @static
+ * @memberOf _
+ * @alias tail
+ * @category Array
+ * @param {Array} array The array to query.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.rest([1, 2, 3]);
+ * // => [2, 3]
+ */
+ function rest(array) {
+ return drop(array, 1);
+ }
+
+ /**
+ * Creates a slice of `array` from `start` up to, but not including, `end`.
+ *
+ * **Note:** This method is used instead of `Array#slice` to support node
+ * lists in IE < 9 and to ensure dense arrays are returned.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to slice.
+ * @param {number} [start=0] The start position.
+ * @param {number} [end=array.length] The end position.
+ * @returns {Array} Returns the slice of `array`.
+ */
+ function slice(array, start, end) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return [];
+ }
+ if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
+ start = 0;
+ end = length;
+ }
+ return baseSlice(array, start, end);
+ }
+
+ /**
+ * Uses a binary search to determine the lowest index at which `value` should
+ * be inserted into `array` in order to maintain its sort order. If an iteratee
+ * function is provided it's invoked for `value` and each element of `array`
+ * to compute their sort ranking. The iteratee is bound to `thisArg` and
+ * invoked with one argument; (value).
+ *
+ * If a property name is provided for `iteratee` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `iteratee` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The sorted array to inspect.
+ * @param {*} value The value to evaluate.
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {number} Returns the index at which `value` should be inserted
+ * into `array`.
+ * @example
+ *
+ * _.sortedIndex([30, 50], 40);
+ * // => 1
+ *
+ * _.sortedIndex([4, 4, 5, 5], 5);
+ * // => 2
+ *
+ * var dict = { 'data': { 'thirty': 30, 'forty': 40, 'fifty': 50 } };
+ *
+ * // using an iteratee function
+ * _.sortedIndex(['thirty', 'fifty'], 'forty', function(word) {
+ * return this.data[word];
+ * }, dict);
+ * // => 1
+ *
+ * // using the `_.property` callback shorthand
+ * _.sortedIndex([{ 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');
+ * // => 1
+ */
+ var sortedIndex = createSortedIndex();
+
+ /**
+ * This method is like `_.sortedIndex` except that it returns the highest
+ * index at which `value` should be inserted into `array` in order to
+ * maintain its sort order.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The sorted array to inspect.
+ * @param {*} value The value to evaluate.
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {number} Returns the index at which `value` should be inserted
+ * into `array`.
+ * @example
+ *
+ * _.sortedLastIndex([4, 4, 5, 5], 5);
+ * // => 4
+ */
+ var sortedLastIndex = createSortedIndex(true);
+
+ /**
+ * Creates a slice of `array` with `n` elements taken from the beginning.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {number} [n=1] The number of elements to take.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.take([1, 2, 3]);
+ * // => [1]
+ *
+ * _.take([1, 2, 3], 2);
+ * // => [1, 2]
+ *
+ * _.take([1, 2, 3], 5);
+ * // => [1, 2, 3]
+ *
+ * _.take([1, 2, 3], 0);
+ * // => []
+ */
+ function take(array, n, guard) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return [];
+ }
+ if (guard ? isIterateeCall(array, n, guard) : n == null) {
+ n = 1;
+ }
+ return baseSlice(array, 0, n < 0 ? 0 : n);
+ }
+
+ /**
+ * Creates a slice of `array` with `n` elements taken from the end.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {number} [n=1] The number of elements to take.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.takeRight([1, 2, 3]);
+ * // => [3]
+ *
+ * _.takeRight([1, 2, 3], 2);
+ * // => [2, 3]
+ *
+ * _.takeRight([1, 2, 3], 5);
+ * // => [1, 2, 3]
+ *
+ * _.takeRight([1, 2, 3], 0);
+ * // => []
+ */
+ function takeRight(array, n, guard) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return [];
+ }
+ if (guard ? isIterateeCall(array, n, guard) : n == null) {
+ n = 1;
+ }
+ n = length - (+n || 0);
+ return baseSlice(array, n < 0 ? 0 : n);
+ }
+
+ /**
+ * Creates a slice of `array` with elements taken from the end. Elements are
+ * taken until `predicate` returns falsey. The predicate is bound to `thisArg`
+ * and invoked with three arguments: (value, index, array).
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.takeRightWhile([1, 2, 3], function(n) {
+ * return n > 1;
+ * });
+ * // => [2, 3]
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': true },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': false }
+ * ];
+ *
+ * // using the `_.matches` callback shorthand
+ * _.pluck(_.takeRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');
+ * // => ['pebbles']
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.pluck(_.takeRightWhile(users, 'active', false), 'user');
+ * // => ['fred', 'pebbles']
+ *
+ * // using the `_.property` callback shorthand
+ * _.pluck(_.takeRightWhile(users, 'active'), 'user');
+ * // => []
+ */
+ function takeRightWhile(array, predicate, thisArg) {
+ return (array && array.length)
+ ? baseWhile(array, getCallback(predicate, thisArg, 3), false, true)
+ : [];
+ }
+
+ /**
+ * Creates a slice of `array` with elements taken from the beginning. Elements
+ * are taken until `predicate` returns falsey. The predicate is bound to
+ * `thisArg` and invoked with three arguments: (value, index, array).
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.takeWhile([1, 2, 3], function(n) {
+ * return n < 3;
+ * });
+ * // => [1, 2]
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': false },
+ * { 'user': 'fred', 'active': false},
+ * { 'user': 'pebbles', 'active': true }
+ * ];
+ *
+ * // using the `_.matches` callback shorthand
+ * _.pluck(_.takeWhile(users, { 'user': 'barney', 'active': false }), 'user');
+ * // => ['barney']
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.pluck(_.takeWhile(users, 'active', false), 'user');
+ * // => ['barney', 'fred']
+ *
+ * // using the `_.property` callback shorthand
+ * _.pluck(_.takeWhile(users, 'active'), 'user');
+ * // => []
+ */
+ function takeWhile(array, predicate, thisArg) {
+ return (array && array.length)
+ ? baseWhile(array, getCallback(predicate, thisArg, 3))
+ : [];
+ }
+
+ /**
+ * Creates an array of unique values, in order, from all of the provided arrays
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @returns {Array} Returns the new array of combined values.
+ * @example
+ *
+ * _.union([1, 2], [4, 2], [2, 1]);
+ * // => [1, 2, 4]
+ */
+ var union = restParam(function(arrays) {
+ return baseUniq(baseFlatten(arrays, false, true));
+ });
+
+ /**
+ * Creates a duplicate-free version of an array, using
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * for equality comparisons, in which only the first occurence of each element
+ * is kept. Providing `true` for `isSorted` performs a faster search algorithm
+ * for sorted arrays. If an iteratee function is provided it's invoked for
+ * each element in the array to generate the criterion by which uniqueness
+ * is computed. The `iteratee` is bound to `thisArg` and invoked with three
+ * arguments: (value, index, array).
+ *
+ * If a property name is provided for `iteratee` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `iteratee` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @alias unique
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {boolean} [isSorted] Specify the array is sorted.
+ * @param {Function|Object|string} [iteratee] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Array} Returns the new duplicate-value-free array.
+ * @example
+ *
+ * _.uniq([2, 1, 2]);
+ * // => [2, 1]
+ *
+ * // using `isSorted`
+ * _.uniq([1, 1, 2], true);
+ * // => [1, 2]
+ *
+ * // using an iteratee function
+ * _.uniq([1, 2.5, 1.5, 2], function(n) {
+ * return this.floor(n);
+ * }, Math);
+ * // => [1, 2.5]
+ *
+ * // using the `_.property` callback shorthand
+ * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
+ * // => [{ 'x': 1 }, { 'x': 2 }]
+ */
+ function uniq(array, isSorted, iteratee, thisArg) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return [];
+ }
+ if (isSorted != null && typeof isSorted != 'boolean') {
+ thisArg = iteratee;
+ iteratee = isIterateeCall(array, isSorted, thisArg) ? undefined : isSorted;
+ isSorted = false;
+ }
+ var callback = getCallback();
+ if (!(iteratee == null && callback === baseCallback)) {
+ iteratee = callback(iteratee, thisArg, 3);
+ }
+ return (isSorted && getIndexOf() === baseIndexOf)
+ ? sortedUniq(array, iteratee)
+ : baseUniq(array, iteratee);
+ }
+
+ /**
+ * This method is like `_.zip` except that it accepts an array of grouped
+ * elements and creates an array regrouping the elements to their pre-zip
+ * configuration.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array of grouped elements to process.
+ * @returns {Array} Returns the new array of regrouped elements.
+ * @example
+ *
+ * var zipped = _.zip(['fred', 'barney'], [30, 40], [true, false]);
+ * // => [['fred', 30, true], ['barney', 40, false]]
+ *
+ * _.unzip(zipped);
+ * // => [['fred', 'barney'], [30, 40], [true, false]]
+ */
+ function unzip(array) {
+ if (!(array && array.length)) {
+ return [];
+ }
+ var index = -1,
+ length = 0;
+
+ array = arrayFilter(array, function(group) {
+ if (isArrayLike(group)) {
+ length = nativeMax(group.length, length);
+ return true;
+ }
+ });
+ var result = Array(length);
+ while (++index < length) {
+ result[index] = arrayMap(array, baseProperty(index));
+ }
+ return result;
+ }
+
+ /**
+ * This method is like `_.unzip` except that it accepts an iteratee to specify
+ * how regrouped values should be combined. The `iteratee` is bound to `thisArg`
+ * and invoked with four arguments: (accumulator, value, index, group).
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array of grouped elements to process.
+ * @param {Function} [iteratee] The function to combine regrouped values.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Array} Returns the new array of regrouped elements.
+ * @example
+ *
+ * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
+ * // => [[1, 10, 100], [2, 20, 200]]
+ *
+ * _.unzipWith(zipped, _.add);
+ * // => [3, 30, 300]
+ */
+ function unzipWith(array, iteratee, thisArg) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return [];
+ }
+ var result = unzip(array);
+ if (iteratee == null) {
+ return result;
+ }
+ iteratee = bindCallback(iteratee, thisArg, 4);
+ return arrayMap(result, function(group) {
+ return arrayReduce(group, iteratee, undefined, true);
+ });
+ }
+
+ /**
+ * Creates an array excluding all provided values using
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to filter.
+ * @param {...*} [values] The values to exclude.
+ * @returns {Array} Returns the new array of filtered values.
+ * @example
+ *
+ * _.without([1, 2, 1, 3], 1, 2);
+ * // => [3]
+ */
+ var without = restParam(function(array, values) {
+ return isArrayLike(array)
+ ? baseDifference(array, values)
+ : [];
+ });
+
+ /**
+ * Creates an array of unique values that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
+ * of the provided arrays.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @returns {Array} Returns the new array of values.
+ * @example
+ *
+ * _.xor([1, 2], [4, 2]);
+ * // => [1, 4]
+ */
+ function xor() {
+ var index = -1,
+ length = arguments.length;
+
+ while (++index < length) {
+ var array = arguments[index];
+ if (isArrayLike(array)) {
+ var result = result
+ ? arrayPush(baseDifference(result, array), baseDifference(array, result))
+ : array;
+ }
+ }
+ return result ? baseUniq(result) : [];
+ }
+
+ /**
+ * Creates an array of grouped elements, the first of which contains the first
+ * elements of the given arrays, the second of which contains the second elements
+ * of the given arrays, and so on.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {...Array} [arrays] The arrays to process.
+ * @returns {Array} Returns the new array of grouped elements.
+ * @example
+ *
+ * _.zip(['fred', 'barney'], [30, 40], [true, false]);
+ * // => [['fred', 30, true], ['barney', 40, false]]
+ */
+ var zip = restParam(unzip);
+
+ /**
+ * The inverse of `_.pairs`; this method returns an object composed from arrays
+ * of property names and values. Provide either a single two dimensional array,
+ * e.g. `[[key1, value1], [key2, value2]]` or two arrays, one of property names
+ * and one of corresponding values.
+ *
+ * @static
+ * @memberOf _
+ * @alias object
+ * @category Array
+ * @param {Array} props The property names.
+ * @param {Array} [values=[]] The property values.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * _.zipObject([['fred', 30], ['barney', 40]]);
+ * // => { 'fred': 30, 'barney': 40 }
+ *
+ * _.zipObject(['fred', 'barney'], [30, 40]);
+ * // => { 'fred': 30, 'barney': 40 }
+ */
+ function zipObject(props, values) {
+ var index = -1,
+ length = props ? props.length : 0,
+ result = {};
+
+ if (length && !values && !isArray(props[0])) {
+ values = [];
+ }
+ while (++index < length) {
+ var key = props[index];
+ if (values) {
+ result[key] = values[index];
+ } else if (key) {
+ result[key[0]] = key[1];
+ }
+ }
+ return result;
+ }
+
+ /**
+ * This method is like `_.zip` except that it accepts an iteratee to specify
+ * how grouped values should be combined. The `iteratee` is bound to `thisArg`
+ * and invoked with four arguments: (accumulator, value, index, group).
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {...Array} [arrays] The arrays to process.
+ * @param {Function} [iteratee] The function to combine grouped values.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Array} Returns the new array of grouped elements.
+ * @example
+ *
+ * _.zipWith([1, 2], [10, 20], [100, 200], _.add);
+ * // => [111, 222]
+ */
+ var zipWith = restParam(function(arrays) {
+ var length = arrays.length,
+ iteratee = length > 2 ? arrays[length - 2] : undefined,
+ thisArg = length > 1 ? arrays[length - 1] : undefined;
+
+ if (length > 2 && typeof iteratee == 'function') {
+ length -= 2;
+ } else {
+ iteratee = (length > 1 && typeof thisArg == 'function') ? (--length, thisArg) : undefined;
+ thisArg = undefined;
+ }
+ arrays.length = length;
+ return unzipWith(arrays, iteratee, thisArg);
+ });
+
+ /*------------------------------------------------------------------------*/
+
+ /**
+ * Creates a `lodash` object that wraps `value` with explicit method
+ * chaining enabled.
+ *
+ * @static
+ * @memberOf _
+ * @category Chain
+ * @param {*} value The value to wrap.
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36 },
+ * { 'user': 'fred', 'age': 40 },
+ * { 'user': 'pebbles', 'age': 1 }
+ * ];
+ *
+ * var youngest = _.chain(users)
+ * .sortBy('age')
+ * .map(function(chr) {
+ * return chr.user + ' is ' + chr.age;
+ * })
+ * .first()
+ * .value();
+ * // => 'pebbles is 1'
+ */
+ function chain(value) {
+ var result = lodash(value);
+ result.__chain__ = true;
+ return result;
+ }
+
+ /**
+ * This method invokes `interceptor` and returns `value`. The interceptor is
+ * bound to `thisArg` and invoked with one argument; (value). The purpose of
+ * this method is to "tap into" a method chain in order to perform operations
+ * on intermediate results within the chain.
+ *
+ * @static
+ * @memberOf _
+ * @category Chain
+ * @param {*} value The value to provide to `interceptor`.
+ * @param {Function} interceptor The function to invoke.
+ * @param {*} [thisArg] The `this` binding of `interceptor`.
+ * @returns {*} Returns `value`.
+ * @example
+ *
+ * _([1, 2, 3])
+ * .tap(function(array) {
+ * array.pop();
+ * })
+ * .reverse()
+ * .value();
+ * // => [2, 1]
+ */
+ function tap(value, interceptor, thisArg) {
+ interceptor.call(thisArg, value);
+ return value;
+ }
+
+ /**
+ * This method is like `_.tap` except that it returns the result of `interceptor`.
+ *
+ * @static
+ * @memberOf _
+ * @category Chain
+ * @param {*} value The value to provide to `interceptor`.
+ * @param {Function} interceptor The function to invoke.
+ * @param {*} [thisArg] The `this` binding of `interceptor`.
+ * @returns {*} Returns the result of `interceptor`.
+ * @example
+ *
+ * _(' abc ')
+ * .chain()
+ * .trim()
+ * .thru(function(value) {
+ * return [value];
+ * })
+ * .value();
+ * // => ['abc']
+ */
+ function thru(value, interceptor, thisArg) {
+ return interceptor.call(thisArg, value);
+ }
+
+ /**
+ * Enables explicit method chaining on the wrapper object.
+ *
+ * @name chain
+ * @memberOf _
+ * @category Chain
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36 },
+ * { 'user': 'fred', 'age': 40 }
+ * ];
+ *
+ * // without explicit chaining
+ * _(users).first();
+ * // => { 'user': 'barney', 'age': 36 }
+ *
+ * // with explicit chaining
+ * _(users).chain()
+ * .first()
+ * .pick('user')
+ * .value();
+ * // => { 'user': 'barney' }
+ */
+ function wrapperChain() {
+ return chain(this);
+ }
+
+ /**
+ * Executes the chained sequence and returns the wrapped result.
+ *
+ * @name commit
+ * @memberOf _
+ * @category Chain
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * var array = [1, 2];
+ * var wrapped = _(array).push(3);
+ *
+ * console.log(array);
+ * // => [1, 2]
+ *
+ * wrapped = wrapped.commit();
+ * console.log(array);
+ * // => [1, 2, 3]
+ *
+ * wrapped.last();
+ * // => 3
+ *
+ * console.log(array);
+ * // => [1, 2, 3]
+ */
+ function wrapperCommit() {
+ return new LodashWrapper(this.value(), this.__chain__);
+ }
+
+ /**
+ * Creates a new array joining a wrapped array with any additional arrays
+ * and/or values.
+ *
+ * @name concat
+ * @memberOf _
+ * @category Chain
+ * @param {...*} [values] The values to concatenate.
+ * @returns {Array} Returns the new concatenated array.
+ * @example
+ *
+ * var array = [1];
+ * var wrapped = _(array).concat(2, [3], [[4]]);
+ *
+ * console.log(wrapped.value());
+ * // => [1, 2, 3, [4]]
+ *
+ * console.log(array);
+ * // => [1]
+ */
+ var wrapperConcat = restParam(function(values) {
+ values = baseFlatten(values);
+ return this.thru(function(array) {
+ return arrayConcat(isArray(array) ? array : [toObject(array)], values);
+ });
+ });
+
+ /**
+ * Creates a clone of the chained sequence planting `value` as the wrapped value.
+ *
+ * @name plant
+ * @memberOf _
+ * @category Chain
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * var array = [1, 2];
+ * var wrapped = _(array).map(function(value) {
+ * return Math.pow(value, 2);
+ * });
+ *
+ * var other = [3, 4];
+ * var otherWrapped = wrapped.plant(other);
+ *
+ * otherWrapped.value();
+ * // => [9, 16]
+ *
+ * wrapped.value();
+ * // => [1, 4]
+ */
+ function wrapperPlant(value) {
+ var result,
+ parent = this;
+
+ while (parent instanceof baseLodash) {
+ var clone = wrapperClone(parent);
+ if (result) {
+ previous.__wrapped__ = clone;
+ } else {
+ result = clone;
+ }
+ var previous = clone;
+ parent = parent.__wrapped__;
+ }
+ previous.__wrapped__ = value;
+ return result;
+ }
+
+ /**
+ * Reverses the wrapped array so the first element becomes the last, the
+ * second element becomes the second to last, and so on.
+ *
+ * **Note:** This method mutates the wrapped array.
+ *
+ * @name reverse
+ * @memberOf _
+ * @category Chain
+ * @returns {Object} Returns the new reversed `lodash` wrapper instance.
+ * @example
+ *
+ * var array = [1, 2, 3];
+ *
+ * _(array).reverse().value()
+ * // => [3, 2, 1]
+ *
+ * console.log(array);
+ * // => [3, 2, 1]
+ */
+ function wrapperReverse() {
+ var value = this.__wrapped__;
+
+ var interceptor = function(value) {
+ return value.reverse();
+ };
+ if (value instanceof LazyWrapper) {
+ var wrapped = value;
+ if (this.__actions__.length) {
+ wrapped = new LazyWrapper(this);
+ }
+ wrapped = wrapped.reverse();
+ wrapped.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });
+ return new LodashWrapper(wrapped, this.__chain__);
+ }
+ return this.thru(interceptor);
+ }
+
+ /**
+ * Produces the result of coercing the unwrapped value to a string.
+ *
+ * @name toString
+ * @memberOf _
+ * @category Chain
+ * @returns {string} Returns the coerced string value.
+ * @example
+ *
+ * _([1, 2, 3]).toString();
+ * // => '1,2,3'
+ */
+ function wrapperToString() {
+ return (this.value() + '');
+ }
+
+ /**
+ * Executes the chained sequence to extract the unwrapped value.
+ *
+ * @name value
+ * @memberOf _
+ * @alias run, toJSON, valueOf
+ * @category Chain
+ * @returns {*} Returns the resolved unwrapped value.
+ * @example
+ *
+ * _([1, 2, 3]).value();
+ * // => [1, 2, 3]
+ */
+ function wrapperValue() {
+ return baseWrapperValue(this.__wrapped__, this.__actions__);
+ }
+
+ /*------------------------------------------------------------------------*/
+
+ /**
+ * Creates an array of elements corresponding to the given keys, or indexes,
+ * of `collection`. Keys may be specified as individual arguments or as arrays
+ * of keys.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {...(number|number[]|string|string[])} [props] The property names
+ * or indexes of elements to pick, specified individually or in arrays.
+ * @returns {Array} Returns the new array of picked elements.
+ * @example
+ *
+ * _.at(['a', 'b', 'c'], [0, 2]);
+ * // => ['a', 'c']
+ *
+ * _.at(['barney', 'fred', 'pebbles'], 0, 2);
+ * // => ['barney', 'pebbles']
+ */
+ var at = restParam(function(collection, props) {
+ return baseAt(collection, baseFlatten(props));
+ });
+
+ /**
+ * Creates an object composed of keys generated from the results of running
+ * each element of `collection` through `iteratee`. The corresponding value
+ * of each key is the number of times the key was returned by `iteratee`.
+ * The `iteratee` is bound to `thisArg` and invoked with three arguments:
+ * (value, index|key, collection).
+ *
+ * If a property name is provided for `iteratee` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `iteratee` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Object} Returns the composed aggregate object.
+ * @example
+ *
+ * _.countBy([4.3, 6.1, 6.4], function(n) {
+ * return Math.floor(n);
+ * });
+ * // => { '4': 1, '6': 2 }
+ *
+ * _.countBy([4.3, 6.1, 6.4], function(n) {
+ * return this.floor(n);
+ * }, Math);
+ * // => { '4': 1, '6': 2 }
+ *
+ * _.countBy(['one', 'two', 'three'], 'length');
+ * // => { '3': 2, '5': 1 }
+ */
+ var countBy = createAggregator(function(result, value, key) {
+ hasOwnProperty.call(result, key) ? ++result[key] : (result[key] = 1);
+ });
+
+ /**
+ * Checks if `predicate` returns truthy for **all** elements of `collection`.
+ * The predicate is bound to `thisArg` and invoked with three arguments:
+ * (value, index|key, collection).
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @alias all
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {boolean} Returns `true` if all elements pass the predicate check,
+ * else `false`.
+ * @example
+ *
+ * _.every([true, 1, null, 'yes'], Boolean);
+ * // => false
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': false },
+ * { 'user': 'fred', 'active': false }
+ * ];
+ *
+ * // using the `_.matches` callback shorthand
+ * _.every(users, { 'user': 'barney', 'active': false });
+ * // => false
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.every(users, 'active', false);
+ * // => true
+ *
+ * // using the `_.property` callback shorthand
+ * _.every(users, 'active');
+ * // => false
+ */
+ function every(collection, predicate, thisArg) {
+ var func = isArray(collection) ? arrayEvery : baseEvery;
+ if (thisArg && isIterateeCall(collection, predicate, thisArg)) {
+ predicate = undefined;
+ }
+ if (typeof predicate != 'function' || thisArg !== undefined) {
+ predicate = getCallback(predicate, thisArg, 3);
+ }
+ return func(collection, predicate);
+ }
+
+ /**
+ * Iterates over elements of `collection`, returning an array of all elements
+ * `predicate` returns truthy for. The predicate is bound to `thisArg` and
+ * invoked with three arguments: (value, index|key, collection).
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @alias select
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {Array} Returns the new filtered array.
+ * @example
+ *
+ * _.filter([4, 5, 6], function(n) {
+ * return n % 2 == 0;
+ * });
+ * // => [4, 6]
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': true },
+ * { 'user': 'fred', 'age': 40, 'active': false }
+ * ];
+ *
+ * // using the `_.matches` callback shorthand
+ * _.pluck(_.filter(users, { 'age': 36, 'active': true }), 'user');
+ * // => ['barney']
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.pluck(_.filter(users, 'active', false), 'user');
+ * // => ['fred']
+ *
+ * // using the `_.property` callback shorthand
+ * _.pluck(_.filter(users, 'active'), 'user');
+ * // => ['barney']
+ */
+ function filter(collection, predicate, thisArg) {
+ var func = isArray(collection) ? arrayFilter : baseFilter;
+ predicate = getCallback(predicate, thisArg, 3);
+ return func(collection, predicate);
+ }
+
+ /**
+ * Iterates over elements of `collection`, returning the first element
+ * `predicate` returns truthy for. The predicate is bound to `thisArg` and
+ * invoked with three arguments: (value, index|key, collection).
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @alias detect
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to search.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {*} Returns the matched element, else `undefined`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': true },
+ * { 'user': 'fred', 'age': 40, 'active': false },
+ * { 'user': 'pebbles', 'age': 1, 'active': true }
+ * ];
+ *
+ * _.result(_.find(users, function(chr) {
+ * return chr.age < 40;
+ * }), 'user');
+ * // => 'barney'
+ *
+ * // using the `_.matches` callback shorthand
+ * _.result(_.find(users, { 'age': 1, 'active': true }), 'user');
+ * // => 'pebbles'
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.result(_.find(users, 'active', false), 'user');
+ * // => 'fred'
+ *
+ * // using the `_.property` callback shorthand
+ * _.result(_.find(users, 'active'), 'user');
+ * // => 'barney'
+ */
+ var find = createFind(baseEach);
+
+ /**
+ * This method is like `_.find` except that it iterates over elements of
+ * `collection` from right to left.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to search.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {*} Returns the matched element, else `undefined`.
+ * @example
+ *
+ * _.findLast([1, 2, 3, 4], function(n) {
+ * return n % 2 == 1;
+ * });
+ * // => 3
+ */
+ var findLast = createFind(baseEachRight, true);
+
+ /**
+ * Performs a deep comparison between each element in `collection` and the
+ * source object, returning the first element that has equivalent property
+ * values.
+ *
+ * **Note:** This method supports comparing arrays, booleans, `Date` objects,
+ * numbers, `Object` objects, regexes, and strings. Objects are compared by
+ * their own, not inherited, enumerable properties. For comparing a single
+ * own or inherited property value see `_.matchesProperty`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to search.
+ * @param {Object} source The object of property values to match.
+ * @returns {*} Returns the matched element, else `undefined`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': true },
+ * { 'user': 'fred', 'age': 40, 'active': false }
+ * ];
+ *
+ * _.result(_.findWhere(users, { 'age': 36, 'active': true }), 'user');
+ * // => 'barney'
+ *
+ * _.result(_.findWhere(users, { 'age': 40, 'active': false }), 'user');
+ * // => 'fred'
+ */
+ function findWhere(collection, source) {
+ return find(collection, baseMatches(source));
+ }
+
+ /**
+ * Iterates over elements of `collection` invoking `iteratee` for each element.
+ * The `iteratee` is bound to `thisArg` and invoked with three arguments:
+ * (value, index|key, collection). Iteratee functions may exit iteration early
+ * by explicitly returning `false`.
+ *
+ * **Note:** As with other "Collections" methods, objects with a "length" property
+ * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`
+ * may be used for object iteration.
+ *
+ * @static
+ * @memberOf _
+ * @alias each
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Array|Object|string} Returns `collection`.
+ * @example
+ *
+ * _([1, 2]).forEach(function(n) {
+ * console.log(n);
+ * }).value();
+ * // => logs each value from left to right and returns the array
+ *
+ * _.forEach({ 'a': 1, 'b': 2 }, function(n, key) {
+ * console.log(n, key);
+ * });
+ * // => logs each value-key pair and returns the object (iteration order is not guaranteed)
+ */
+ var forEach = createForEach(arrayEach, baseEach);
+
+ /**
+ * This method is like `_.forEach` except that it iterates over elements of
+ * `collection` from right to left.
+ *
+ * @static
+ * @memberOf _
+ * @alias eachRight
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Array|Object|string} Returns `collection`.
+ * @example
+ *
+ * _([1, 2]).forEachRight(function(n) {
+ * console.log(n);
+ * }).value();
+ * // => logs each value from right to left and returns the array
+ */
+ var forEachRight = createForEach(arrayEachRight, baseEachRight);
+
+ /**
+ * Creates an object composed of keys generated from the results of running
+ * each element of `collection` through `iteratee`. The corresponding value
+ * of each key is an array of the elements responsible for generating the key.
+ * The `iteratee` is bound to `thisArg` and invoked with three arguments:
+ * (value, index|key, collection).
+ *
+ * If a property name is provided for `iteratee` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `iteratee` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Object} Returns the composed aggregate object.
+ * @example
+ *
+ * _.groupBy([4.2, 6.1, 6.4], function(n) {
+ * return Math.floor(n);
+ * });
+ * // => { '4': [4.2], '6': [6.1, 6.4] }
+ *
+ * _.groupBy([4.2, 6.1, 6.4], function(n) {
+ * return this.floor(n);
+ * }, Math);
+ * // => { '4': [4.2], '6': [6.1, 6.4] }
+ *
+ * // using the `_.property` callback shorthand
+ * _.groupBy(['one', 'two', 'three'], 'length');
+ * // => { '3': ['one', 'two'], '5': ['three'] }
+ */
+ var groupBy = createAggregator(function(result, value, key) {
+ if (hasOwnProperty.call(result, key)) {
+ result[key].push(value);
+ } else {
+ result[key] = [value];
+ }
+ });
+
+ /**
+ * Checks if `target` is in `collection` using
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * for equality comparisons. If `fromIndex` is negative, it's used as the offset
+ * from the end of `collection`.
+ *
+ * @static
+ * @memberOf _
+ * @alias contains, include
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to search.
+ * @param {*} target The value to search for.
+ * @param {number} [fromIndex=0] The index to search from.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.
+ * @returns {boolean} Returns `true` if a matching element is found, else `false`.
+ * @example
+ *
+ * _.includes([1, 2, 3], 1);
+ * // => true
+ *
+ * _.includes([1, 2, 3], 1, 2);
+ * // => false
+ *
+ * _.includes({ 'user': 'fred', 'age': 40 }, 'fred');
+ * // => true
+ *
+ * _.includes('pebbles', 'eb');
+ * // => true
+ */
+ function includes(collection, target, fromIndex, guard) {
+ var length = collection ? getLength(collection) : 0;
+ if (!isLength(length)) {
+ collection = values(collection);
+ length = collection.length;
+ }
+ if (typeof fromIndex != 'number' || (guard && isIterateeCall(target, fromIndex, guard))) {
+ fromIndex = 0;
+ } else {
+ fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0);
+ }
+ return (typeof collection == 'string' || !isArray(collection) && isString(collection))
+ ? (fromIndex <= length && collection.indexOf(target, fromIndex) > -1)
+ : (!!length && getIndexOf(collection, target, fromIndex) > -1);
+ }
+
+ /**
+ * Creates an object composed of keys generated from the results of running
+ * each element of `collection` through `iteratee`. The corresponding value
+ * of each key is the last element responsible for generating the key. The
+ * iteratee function is bound to `thisArg` and invoked with three arguments:
+ * (value, index|key, collection).
+ *
+ * If a property name is provided for `iteratee` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `iteratee` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Object} Returns the composed aggregate object.
+ * @example
+ *
+ * var keyData = [
+ * { 'dir': 'left', 'code': 97 },
+ * { 'dir': 'right', 'code': 100 }
+ * ];
+ *
+ * _.indexBy(keyData, 'dir');
+ * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
+ *
+ * _.indexBy(keyData, function(object) {
+ * return String.fromCharCode(object.code);
+ * });
+ * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
+ *
+ * _.indexBy(keyData, function(object) {
+ * return this.fromCharCode(object.code);
+ * }, String);
+ * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
+ */
+ var indexBy = createAggregator(function(result, value, key) {
+ result[key] = value;
+ });
+
+ /**
+ * Invokes the method at `path` of each element in `collection`, returning
+ * an array of the results of each invoked method. Any additional arguments
+ * are provided to each invoked method. If `methodName` is a function it's
+ * invoked for, and `this` bound to, each element in `collection`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Array|Function|string} path The path of the method to invoke or
+ * the function invoked per iteration.
+ * @param {...*} [args] The arguments to invoke the method with.
+ * @returns {Array} Returns the array of results.
+ * @example
+ *
+ * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');
+ * // => [[1, 5, 7], [1, 2, 3]]
+ *
+ * _.invoke([123, 456], String.prototype.split, '');
+ * // => [['1', '2', '3'], ['4', '5', '6']]
+ */
+ var invoke = restParam(function(collection, path, args) {
+ var index = -1,
+ isFunc = typeof path == 'function',
+ isProp = isKey(path),
+ result = isArrayLike(collection) ? Array(collection.length) : [];
+
+ baseEach(collection, function(value) {
+ var func = isFunc ? path : ((isProp && value != null) ? value[path] : undefined);
+ result[++index] = func ? func.apply(value, args) : invokePath(value, path, args);
+ });
+ return result;
+ });
+
+ /**
+ * Creates an array of values by running each element in `collection` through
+ * `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three
+ * arguments: (value, index|key, collection).
+ *
+ * If a property name is provided for `iteratee` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `iteratee` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * Many lodash methods are guarded to work as iteratees for methods like
+ * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
+ *
+ * The guarded methods are:
+ * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`,
+ * `drop`, `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`,
+ * `parseInt`, `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`,
+ * `trimLeft`, `trimRight`, `trunc`, `random`, `range`, `sample`, `some`,
+ * `sum`, `uniq`, and `words`
+ *
+ * @static
+ * @memberOf _
+ * @alias collect
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Array} Returns the new mapped array.
+ * @example
+ *
+ * function timesThree(n) {
+ * return n * 3;
+ * }
+ *
+ * _.map([1, 2], timesThree);
+ * // => [3, 6]
+ *
+ * _.map({ 'a': 1, 'b': 2 }, timesThree);
+ * // => [3, 6] (iteration order is not guaranteed)
+ *
+ * var users = [
+ * { 'user': 'barney' },
+ * { 'user': 'fred' }
+ * ];
+ *
+ * // using the `_.property` callback shorthand
+ * _.map(users, 'user');
+ * // => ['barney', 'fred']
+ */
+ function map(collection, iteratee, thisArg) {
+ var func = isArray(collection) ? arrayMap : baseMap;
+ iteratee = getCallback(iteratee, thisArg, 3);
+ return func(collection, iteratee);
+ }
+
+ /**
+ * Creates an array of elements split into two groups, the first of which
+ * contains elements `predicate` returns truthy for, while the second of which
+ * contains elements `predicate` returns falsey for. The predicate is bound
+ * to `thisArg` and invoked with three arguments: (value, index|key, collection).
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {Array} Returns the array of grouped elements.
+ * @example
+ *
+ * _.partition([1, 2, 3], function(n) {
+ * return n % 2;
+ * });
+ * // => [[1, 3], [2]]
+ *
+ * _.partition([1.2, 2.3, 3.4], function(n) {
+ * return this.floor(n) % 2;
+ * }, Math);
+ * // => [[1.2, 3.4], [2.3]]
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': false },
+ * { 'user': 'fred', 'age': 40, 'active': true },
+ * { 'user': 'pebbles', 'age': 1, 'active': false }
+ * ];
+ *
+ * var mapper = function(array) {
+ * return _.pluck(array, 'user');
+ * };
+ *
+ * // using the `_.matches` callback shorthand
+ * _.map(_.partition(users, { 'age': 1, 'active': false }), mapper);
+ * // => [['pebbles'], ['barney', 'fred']]
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.map(_.partition(users, 'active', false), mapper);
+ * // => [['barney', 'pebbles'], ['fred']]
+ *
+ * // using the `_.property` callback shorthand
+ * _.map(_.partition(users, 'active'), mapper);
+ * // => [['fred'], ['barney', 'pebbles']]
+ */
+ var partition = createAggregator(function(result, value, key) {
+ result[key ? 0 : 1].push(value);
+ }, function() { return [[], []]; });
+
+ /**
+ * Gets the property value of `path` from all elements in `collection`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Array|string} path The path of the property to pluck.
+ * @returns {Array} Returns the property values.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36 },
+ * { 'user': 'fred', 'age': 40 }
+ * ];
+ *
+ * _.pluck(users, 'user');
+ * // => ['barney', 'fred']
+ *
+ * var userIndex = _.indexBy(users, 'user');
+ * _.pluck(userIndex, 'age');
+ * // => [36, 40] (iteration order is not guaranteed)
+ */
+ function pluck(collection, path) {
+ return map(collection, property(path));
+ }
+
+ /**
+ * Reduces `collection` to a value which is the accumulated result of running
+ * each element in `collection` through `iteratee`, where each successive
+ * invocation is supplied the return value of the previous. If `accumulator`
+ * is not provided the first element of `collection` is used as the initial
+ * value. The `iteratee` is bound to `thisArg` and invoked with four arguments:
+ * (accumulator, value, index|key, collection).
+ *
+ * Many lodash methods are guarded to work as iteratees for methods like
+ * `_.reduce`, `_.reduceRight`, and `_.transform`.
+ *
+ * The guarded methods are:
+ * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `sortByAll`,
+ * and `sortByOrder`
+ *
+ * @static
+ * @memberOf _
+ * @alias foldl, inject
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {*} Returns the accumulated value.
+ * @example
+ *
+ * _.reduce([1, 2], function(total, n) {
+ * return total + n;
+ * });
+ * // => 3
+ *
+ * _.reduce({ 'a': 1, 'b': 2 }, function(result, n, key) {
+ * result[key] = n * 3;
+ * return result;
+ * }, {});
+ * // => { 'a': 3, 'b': 6 } (iteration order is not guaranteed)
+ */
+ var reduce = createReduce(arrayReduce, baseEach);
+
+ /**
+ * This method is like `_.reduce` except that it iterates over elements of
+ * `collection` from right to left.
+ *
+ * @static
+ * @memberOf _
+ * @alias foldr
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {*} Returns the accumulated value.
+ * @example
+ *
+ * var array = [[0, 1], [2, 3], [4, 5]];
+ *
+ * _.reduceRight(array, function(flattened, other) {
+ * return flattened.concat(other);
+ * }, []);
+ * // => [4, 5, 2, 3, 0, 1]
+ */
+ var reduceRight = createReduce(arrayReduceRight, baseEachRight);
+
+ /**
+ * The opposite of `_.filter`; this method returns the elements of `collection`
+ * that `predicate` does **not** return truthy for.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {Array} Returns the new filtered array.
+ * @example
+ *
+ * _.reject([1, 2, 3, 4], function(n) {
+ * return n % 2 == 0;
+ * });
+ * // => [1, 3]
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': false },
+ * { 'user': 'fred', 'age': 40, 'active': true }
+ * ];
+ *
+ * // using the `_.matches` callback shorthand
+ * _.pluck(_.reject(users, { 'age': 40, 'active': true }), 'user');
+ * // => ['barney']
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.pluck(_.reject(users, 'active', false), 'user');
+ * // => ['fred']
+ *
+ * // using the `_.property` callback shorthand
+ * _.pluck(_.reject(users, 'active'), 'user');
+ * // => ['barney']
+ */
+ function reject(collection, predicate, thisArg) {
+ var func = isArray(collection) ? arrayFilter : baseFilter;
+ predicate = getCallback(predicate, thisArg, 3);
+ return func(collection, function(value, index, collection) {
+ return !predicate(value, index, collection);
+ });
+ }
+
+ /**
+ * Gets a random element or `n` random elements from a collection.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to sample.
+ * @param {number} [n] The number of elements to sample.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {*} Returns the random sample(s).
+ * @example
+ *
+ * _.sample([1, 2, 3, 4]);
+ * // => 2
+ *
+ * _.sample([1, 2, 3, 4], 2);
+ * // => [3, 1]
+ */
+ function sample(collection, n, guard) {
+ if (guard ? isIterateeCall(collection, n, guard) : n == null) {
+ collection = toIterable(collection);
+ var length = collection.length;
+ return length > 0 ? collection[baseRandom(0, length - 1)] : undefined;
+ }
+ var index = -1,
+ result = toArray(collection),
+ length = result.length,
+ lastIndex = length - 1;
+
+ n = nativeMin(n < 0 ? 0 : (+n || 0), length);
+ while (++index < n) {
+ var rand = baseRandom(index, lastIndex),
+ value = result[rand];
+
+ result[rand] = result[index];
+ result[index] = value;
+ }
+ result.length = n;
+ return result;
+ }
+
+ /**
+ * Creates an array of shuffled values, using a version of the
+ * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to shuffle.
+ * @returns {Array} Returns the new shuffled array.
+ * @example
+ *
+ * _.shuffle([1, 2, 3, 4]);
+ * // => [4, 1, 3, 2]
+ */
+ function shuffle(collection) {
+ return sample(collection, POSITIVE_INFINITY);
+ }
+
+ /**
+ * Gets the size of `collection` by returning its length for array-like
+ * values or the number of own enumerable properties for objects.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to inspect.
+ * @returns {number} Returns the size of `collection`.
+ * @example
+ *
+ * _.size([1, 2, 3]);
+ * // => 3
+ *
+ * _.size({ 'a': 1, 'b': 2 });
+ * // => 2
+ *
+ * _.size('pebbles');
+ * // => 7
+ */
+ function size(collection) {
+ var length = collection ? getLength(collection) : 0;
+ return isLength(length) ? length : keys(collection).length;
+ }
+
+ /**
+ * Checks if `predicate` returns truthy for **any** element of `collection`.
+ * The function returns as soon as it finds a passing value and does not iterate
+ * over the entire collection. The predicate is bound to `thisArg` and invoked
+ * with three arguments: (value, index|key, collection).
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @alias any
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {boolean} Returns `true` if any element passes the predicate check,
+ * else `false`.
+ * @example
+ *
+ * _.some([null, 0, 'yes', false], Boolean);
+ * // => true
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': true },
+ * { 'user': 'fred', 'active': false }
+ * ];
+ *
+ * // using the `_.matches` callback shorthand
+ * _.some(users, { 'user': 'barney', 'active': false });
+ * // => false
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.some(users, 'active', false);
+ * // => true
+ *
+ * // using the `_.property` callback shorthand
+ * _.some(users, 'active');
+ * // => true
+ */
+ function some(collection, predicate, thisArg) {
+ var func = isArray(collection) ? arraySome : baseSome;
+ if (thisArg && isIterateeCall(collection, predicate, thisArg)) {
+ predicate = undefined;
+ }
+ if (typeof predicate != 'function' || thisArg !== undefined) {
+ predicate = getCallback(predicate, thisArg, 3);
+ }
+ return func(collection, predicate);
+ }
+
+ /**
+ * Creates an array of elements, sorted in ascending order by the results of
+ * running each element in a collection through `iteratee`. This method performs
+ * a stable sort, that is, it preserves the original sort order of equal elements.
+ * The `iteratee` is bound to `thisArg` and invoked with three arguments:
+ * (value, index|key, collection).
+ *
+ * If a property name is provided for `iteratee` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `iteratee` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Array} Returns the new sorted array.
+ * @example
+ *
+ * _.sortBy([1, 2, 3], function(n) {
+ * return Math.sin(n);
+ * });
+ * // => [3, 1, 2]
+ *
+ * _.sortBy([1, 2, 3], function(n) {
+ * return this.sin(n);
+ * }, Math);
+ * // => [3, 1, 2]
+ *
+ * var users = [
+ * { 'user': 'fred' },
+ * { 'user': 'pebbles' },
+ * { 'user': 'barney' }
+ * ];
+ *
+ * // using the `_.property` callback shorthand
+ * _.pluck(_.sortBy(users, 'user'), 'user');
+ * // => ['barney', 'fred', 'pebbles']
+ */
+ function sortBy(collection, iteratee, thisArg) {
+ if (collection == null) {
+ return [];
+ }
+ if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
+ iteratee = undefined;
+ }
+ var index = -1;
+ iteratee = getCallback(iteratee, thisArg, 3);
+
+ var result = baseMap(collection, function(value, key, collection) {
+ return { 'criteria': iteratee(value, key, collection), 'index': ++index, 'value': value };
+ });
+ return baseSortBy(result, compareAscending);
+ }
+
+ /**
+ * This method is like `_.sortBy` except that it can sort by multiple iteratees
+ * or property names.
+ *
+ * If a property name is provided for an iteratee the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If an object is provided for an iteratee the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {...(Function|Function[]|Object|Object[]|string|string[])} iteratees
+ * The iteratees to sort by, specified as individual values or arrays of values.
+ * @returns {Array} Returns the new sorted array.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'fred', 'age': 48 },
+ * { 'user': 'barney', 'age': 36 },
+ * { 'user': 'fred', 'age': 42 },
+ * { 'user': 'barney', 'age': 34 }
+ * ];
+ *
+ * _.map(_.sortByAll(users, ['user', 'age']), _.values);
+ * // => [['barney', 34], ['barney', 36], ['fred', 42], ['fred', 48]]
+ *
+ * _.map(_.sortByAll(users, 'user', function(chr) {
+ * return Math.floor(chr.age / 10);
+ * }), _.values);
+ * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]
+ */
+ var sortByAll = restParam(function(collection, iteratees) {
+ if (collection == null) {
+ return [];
+ }
+ var guard = iteratees[2];
+ if (guard && isIterateeCall(iteratees[0], iteratees[1], guard)) {
+ iteratees.length = 1;
+ }
+ return baseSortByOrder(collection, baseFlatten(iteratees), []);
+ });
+
+ /**
+ * This method is like `_.sortByAll` except that it allows specifying the
+ * sort orders of the iteratees to sort by. If `orders` is unspecified, all
+ * values are sorted in ascending order. Otherwise, a value is sorted in
+ * ascending order if its corresponding order is "asc", and descending if "desc".
+ *
+ * If a property name is provided for an iteratee the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If an object is provided for an iteratee the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
+ * @param {boolean[]} [orders] The sort orders of `iteratees`.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.
+ * @returns {Array} Returns the new sorted array.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'fred', 'age': 48 },
+ * { 'user': 'barney', 'age': 34 },
+ * { 'user': 'fred', 'age': 42 },
+ * { 'user': 'barney', 'age': 36 }
+ * ];
+ *
+ * // sort by `user` in ascending order and by `age` in descending order
+ * _.map(_.sortByOrder(users, ['user', 'age'], ['asc', 'desc']), _.values);
+ * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]
+ */
+ function sortByOrder(collection, iteratees, orders, guard) {
+ if (collection == null) {
+ return [];
+ }
+ if (guard && isIterateeCall(iteratees, orders, guard)) {
+ orders = undefined;
+ }
+ if (!isArray(iteratees)) {
+ iteratees = iteratees == null ? [] : [iteratees];
+ }
+ if (!isArray(orders)) {
+ orders = orders == null ? [] : [orders];
+ }
+ return baseSortByOrder(collection, iteratees, orders);
+ }
+
+ /**
+ * Performs a deep comparison between each element in `collection` and the
+ * source object, returning an array of all elements that have equivalent
+ * property values.
+ *
+ * **Note:** This method supports comparing arrays, booleans, `Date` objects,
+ * numbers, `Object` objects, regexes, and strings. Objects are compared by
+ * their own, not inherited, enumerable properties. For comparing a single
+ * own or inherited property value see `_.matchesProperty`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to search.
+ * @param {Object} source The object of property values to match.
+ * @returns {Array} Returns the new filtered array.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': false, 'pets': ['hoppy'] },
+ * { 'user': 'fred', 'age': 40, 'active': true, 'pets': ['baby puss', 'dino'] }
+ * ];
+ *
+ * _.pluck(_.where(users, { 'age': 36, 'active': false }), 'user');
+ * // => ['barney']
+ *
+ * _.pluck(_.where(users, { 'pets': ['dino'] }), 'user');
+ * // => ['fred']
+ */
+ function where(collection, source) {
+ return filter(collection, baseMatches(source));
+ }
+
+ /*------------------------------------------------------------------------*/
+
+ /**
+ * Gets the number of milliseconds that have elapsed since the Unix epoch
+ * (1 January 1970 00:00:00 UTC).
+ *
+ * @static
+ * @memberOf _
+ * @category Date
+ * @example
+ *
+ * _.defer(function(stamp) {
+ * console.log(_.now() - stamp);
+ * }, _.now());
+ * // => logs the number of milliseconds it took for the deferred function to be invoked
+ */
+ var now = nativeNow || function() {
+ return new Date().getTime();
+ };
+
+ /*------------------------------------------------------------------------*/
+
+ /**
+ * The opposite of `_.before`; this method creates a function that invokes
+ * `func` once it's called `n` or more times.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {number} n The number of calls before `func` is invoked.
+ * @param {Function} func The function to restrict.
+ * @returns {Function} Returns the new restricted function.
+ * @example
+ *
+ * var saves = ['profile', 'settings'];
+ *
+ * var done = _.after(saves.length, function() {
+ * console.log('done saving!');
+ * });
+ *
+ * _.forEach(saves, function(type) {
+ * asyncSave({ 'type': type, 'complete': done });
+ * });
+ * // => logs 'done saving!' after the two async saves have completed
+ */
+ function after(n, func) {
+ if (typeof func != 'function') {
+ if (typeof n == 'function') {
+ var temp = n;
+ n = func;
+ func = temp;
+ } else {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ }
+ n = nativeIsFinite(n = +n) ? n : 0;
+ return function() {
+ if (--n < 1) {
+ return func.apply(this, arguments);
+ }
+ };
+ }
+
+ /**
+ * Creates a function that accepts up to `n` arguments ignoring any
+ * additional arguments.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to cap arguments for.
+ * @param {number} [n=func.length] The arity cap.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * _.map(['6', '8', '10'], _.ary(parseInt, 1));
+ * // => [6, 8, 10]
+ */
+ function ary(func, n, guard) {
+ if (guard && isIterateeCall(func, n, guard)) {
+ n = undefined;
+ }
+ n = (func && n == null) ? func.length : nativeMax(+n || 0, 0);
+ return createWrapper(func, ARY_FLAG, undefined, undefined, undefined, undefined, n);
+ }
+
+ /**
+ * Creates a function that invokes `func`, with the `this` binding and arguments
+ * of the created function, while it's called less than `n` times. Subsequent
+ * calls to the created function return the result of the last `func` invocation.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {number} n The number of calls at which `func` is no longer invoked.
+ * @param {Function} func The function to restrict.
+ * @returns {Function} Returns the new restricted function.
+ * @example
+ *
+ * jQuery('#add').on('click', _.before(5, addContactToList));
+ * // => allows adding up to 4 contacts to the list
+ */
+ function before(n, func) {
+ var result;
+ if (typeof func != 'function') {
+ if (typeof n == 'function') {
+ var temp = n;
+ n = func;
+ func = temp;
+ } else {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ }
+ return function() {
+ if (--n > 0) {
+ result = func.apply(this, arguments);
+ }
+ if (n <= 1) {
+ func = undefined;
+ }
+ return result;
+ };
+ }
+
+ /**
+ * Creates a function that invokes `func` with the `this` binding of `thisArg`
+ * and prepends any additional `_.bind` arguments to those provided to the
+ * bound function.
+ *
+ * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
+ * may be used as a placeholder for partially applied arguments.
+ *
+ * **Note:** Unlike native `Function#bind` this method does not set the "length"
+ * property of bound functions.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to bind.
+ * @param {*} thisArg The `this` binding of `func`.
+ * @param {...*} [partials] The arguments to be partially applied.
+ * @returns {Function} Returns the new bound function.
+ * @example
+ *
+ * var greet = function(greeting, punctuation) {
+ * return greeting + ' ' + this.user + punctuation;
+ * };
+ *
+ * var object = { 'user': 'fred' };
+ *
+ * var bound = _.bind(greet, object, 'hi');
+ * bound('!');
+ * // => 'hi fred!'
+ *
+ * // using placeholders
+ * var bound = _.bind(greet, object, _, '!');
+ * bound('hi');
+ * // => 'hi fred!'
+ */
+ var bind = restParam(function(func, thisArg, partials) {
+ var bitmask = BIND_FLAG;
+ if (partials.length) {
+ var holders = replaceHolders(partials, bind.placeholder);
+ bitmask |= PARTIAL_FLAG;
+ }
+ return createWrapper(func, bitmask, thisArg, partials, holders);
+ });
+
+ /**
+ * Binds methods of an object to the object itself, overwriting the existing
+ * method. Method names may be specified as individual arguments or as arrays
+ * of method names. If no method names are provided all enumerable function
+ * properties, own and inherited, of `object` are bound.
+ *
+ * **Note:** This method does not set the "length" property of bound functions.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Object} object The object to bind and assign the bound methods to.
+ * @param {...(string|string[])} [methodNames] The object method names to bind,
+ * specified as individual method names or arrays of method names.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * var view = {
+ * 'label': 'docs',
+ * 'onClick': function() {
+ * console.log('clicked ' + this.label);
+ * }
+ * };
+ *
+ * _.bindAll(view);
+ * jQuery('#docs').on('click', view.onClick);
+ * // => logs 'clicked docs' when the element is clicked
+ */
+ var bindAll = restParam(function(object, methodNames) {
+ methodNames = methodNames.length ? baseFlatten(methodNames) : functions(object);
+
+ var index = -1,
+ length = methodNames.length;
+
+ while (++index < length) {
+ var key = methodNames[index];
+ object[key] = createWrapper(object[key], BIND_FLAG, object);
+ }
+ return object;
+ });
+
+ /**
+ * Creates a function that invokes the method at `object[key]` and prepends
+ * any additional `_.bindKey` arguments to those provided to the bound function.
+ *
+ * This method differs from `_.bind` by allowing bound functions to reference
+ * methods that may be redefined or don't yet exist.
+ * See [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
+ * for more details.
+ *
+ * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
+ * builds, may be used as a placeholder for partially applied arguments.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Object} object The object the method belongs to.
+ * @param {string} key The key of the method.
+ * @param {...*} [partials] The arguments to be partially applied.
+ * @returns {Function} Returns the new bound function.
+ * @example
+ *
+ * var object = {
+ * 'user': 'fred',
+ * 'greet': function(greeting, punctuation) {
+ * return greeting + ' ' + this.user + punctuation;
+ * }
+ * };
+ *
+ * var bound = _.bindKey(object, 'greet', 'hi');
+ * bound('!');
+ * // => 'hi fred!'
+ *
+ * object.greet = function(greeting, punctuation) {
+ * return greeting + 'ya ' + this.user + punctuation;
+ * };
+ *
+ * bound('!');
+ * // => 'hiya fred!'
+ *
+ * // using placeholders
+ * var bound = _.bindKey(object, 'greet', _, '!');
+ * bound('hi');
+ * // => 'hiya fred!'
+ */
+ var bindKey = restParam(function(object, key, partials) {
+ var bitmask = BIND_FLAG | BIND_KEY_FLAG;
+ if (partials.length) {
+ var holders = replaceHolders(partials, bindKey.placeholder);
+ bitmask |= PARTIAL_FLAG;
+ }
+ return createWrapper(key, bitmask, object, partials, holders);
+ });
+
+ /**
+ * Creates a function that accepts one or more arguments of `func` that when
+ * called either invokes `func` returning its result, if all `func` arguments
+ * have been provided, or returns a function that accepts one or more of the
+ * remaining `func` arguments, and so on. The arity of `func` may be specified
+ * if `func.length` is not sufficient.
+ *
+ * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
+ * may be used as a placeholder for provided arguments.
+ *
+ * **Note:** This method does not set the "length" property of curried functions.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to curry.
+ * @param {number} [arity=func.length] The arity of `func`.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Function} Returns the new curried function.
+ * @example
+ *
+ * var abc = function(a, b, c) {
+ * return [a, b, c];
+ * };
+ *
+ * var curried = _.curry(abc);
+ *
+ * curried(1)(2)(3);
+ * // => [1, 2, 3]
+ *
+ * curried(1, 2)(3);
+ * // => [1, 2, 3]
+ *
+ * curried(1, 2, 3);
+ * // => [1, 2, 3]
+ *
+ * // using placeholders
+ * curried(1)(_, 3)(2);
+ * // => [1, 2, 3]
+ */
+ var curry = createCurry(CURRY_FLAG);
+
+ /**
+ * This method is like `_.curry` except that arguments are applied to `func`
+ * in the manner of `_.partialRight` instead of `_.partial`.
+ *
+ * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
+ * builds, may be used as a placeholder for provided arguments.
+ *
+ * **Note:** This method does not set the "length" property of curried functions.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to curry.
+ * @param {number} [arity=func.length] The arity of `func`.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Function} Returns the new curried function.
+ * @example
+ *
+ * var abc = function(a, b, c) {
+ * return [a, b, c];
+ * };
+ *
+ * var curried = _.curryRight(abc);
+ *
+ * curried(3)(2)(1);
+ * // => [1, 2, 3]
+ *
+ * curried(2, 3)(1);
+ * // => [1, 2, 3]
+ *
+ * curried(1, 2, 3);
+ * // => [1, 2, 3]
+ *
+ * // using placeholders
+ * curried(3)(1, _)(2);
+ * // => [1, 2, 3]
+ */
+ var curryRight = createCurry(CURRY_RIGHT_FLAG);
+
+ /**
+ * Creates a debounced function that delays invoking `func` until after `wait`
+ * milliseconds have elapsed since the last time the debounced function was
+ * invoked. The debounced function comes with a `cancel` method to cancel
+ * delayed invocations. Provide an options object to indicate that `func`
+ * should be invoked on the leading and/or trailing edge of the `wait` timeout.
+ * Subsequent calls to the debounced function return the result of the last
+ * `func` invocation.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
+ * on the trailing edge of the timeout only if the the debounced function is
+ * invoked more than once during the `wait` timeout.
+ *
+ * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
+ * for details over the differences between `_.debounce` and `_.throttle`.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to debounce.
+ * @param {number} [wait=0] The number of milliseconds to delay.
+ * @param {Object} [options] The options object.
+ * @param {boolean} [options.leading=false] Specify invoking on the leading
+ * edge of the timeout.
+ * @param {number} [options.maxWait] The maximum time `func` is allowed to be
+ * delayed before it's invoked.
+ * @param {boolean} [options.trailing=true] Specify invoking on the trailing
+ * edge of the timeout.
+ * @returns {Function} Returns the new debounced function.
+ * @example
+ *
+ * // avoid costly calculations while the window size is in flux
+ * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
+ *
+ * // invoke `sendMail` when the click event is fired, debouncing subsequent calls
+ * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {
+ * 'leading': true,
+ * 'trailing': false
+ * }));
+ *
+ * // ensure `batchLog` is invoked once after 1 second of debounced calls
+ * var source = new EventSource('/stream');
+ * jQuery(source).on('message', _.debounce(batchLog, 250, {
+ * 'maxWait': 1000
+ * }));
+ *
+ * // cancel a debounced call
+ * var todoChanges = _.debounce(batchLog, 1000);
+ * Object.observe(models.todo, todoChanges);
+ *
+ * Object.observe(models, function(changes) {
+ * if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) {
+ * todoChanges.cancel();
+ * }
+ * }, ['delete']);
+ *
+ * // ...at some point `models.todo` is changed
+ * models.todo.completed = true;
+ *
+ * // ...before 1 second has passed `models.todo` is deleted
+ * // which cancels the debounced `todoChanges` call
+ * delete models.todo;
+ */
+ function debounce(func, wait, options) {
+ var args,
+ maxTimeoutId,
+ result,
+ stamp,
+ thisArg,
+ timeoutId,
+ trailingCall,
+ lastCalled = 0,
+ maxWait = false,
+ trailing = true;
+
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ wait = wait < 0 ? 0 : (+wait || 0);
+ if (options === true) {
+ var leading = true;
+ trailing = false;
+ } else if (isObject(options)) {
+ leading = !!options.leading;
+ maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait);
+ trailing = 'trailing' in options ? !!options.trailing : trailing;
+ }
+
+ function cancel() {
+ if (timeoutId) {
+ clearTimeout(timeoutId);
+ }
+ if (maxTimeoutId) {
+ clearTimeout(maxTimeoutId);
+ }
+ lastCalled = 0;
+ maxTimeoutId = timeoutId = trailingCall = undefined;
+ }
+
+ function complete(isCalled, id) {
+ if (id) {
+ clearTimeout(id);
+ }
+ maxTimeoutId = timeoutId = trailingCall = undefined;
+ if (isCalled) {
+ lastCalled = now();
+ result = func.apply(thisArg, args);
+ if (!timeoutId && !maxTimeoutId) {
+ args = thisArg = undefined;
+ }
+ }
+ }
+
+ function delayed() {
+ var remaining = wait - (now() - stamp);
+ if (remaining <= 0 || remaining > wait) {
+ complete(trailingCall, maxTimeoutId);
+ } else {
+ timeoutId = setTimeout(delayed, remaining);
+ }
+ }
+
+ function maxDelayed() {
+ complete(trailing, timeoutId);
+ }
+
+ function debounced() {
+ args = arguments;
+ stamp = now();
+ thisArg = this;
+ trailingCall = trailing && (timeoutId || !leading);
+
+ if (maxWait === false) {
+ var leadingCall = leading && !timeoutId;
+ } else {
+ if (!maxTimeoutId && !leading) {
+ lastCalled = stamp;
+ }
+ var remaining = maxWait - (stamp - lastCalled),
+ isCalled = remaining <= 0 || remaining > maxWait;
+
+ if (isCalled) {
+ if (maxTimeoutId) {
+ maxTimeoutId = clearTimeout(maxTimeoutId);
+ }
+ lastCalled = stamp;
+ result = func.apply(thisArg, args);
+ }
+ else if (!maxTimeoutId) {
+ maxTimeoutId = setTimeout(maxDelayed, remaining);
+ }
+ }
+ if (isCalled && timeoutId) {
+ timeoutId = clearTimeout(timeoutId);
+ }
+ else if (!timeoutId && wait !== maxWait) {
+ timeoutId = setTimeout(delayed, wait);
+ }
+ if (leadingCall) {
+ isCalled = true;
+ result = func.apply(thisArg, args);
+ }
+ if (isCalled && !timeoutId && !maxTimeoutId) {
+ args = thisArg = undefined;
+ }
+ return result;
+ }
+ debounced.cancel = cancel;
+ return debounced;
+ }
+
+ /**
+ * Defers invoking the `func` until the current call stack has cleared. Any
+ * additional arguments are provided to `func` when it's invoked.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to defer.
+ * @param {...*} [args] The arguments to invoke the function with.
+ * @returns {number} Returns the timer id.
+ * @example
+ *
+ * _.defer(function(text) {
+ * console.log(text);
+ * }, 'deferred');
+ * // logs 'deferred' after one or more milliseconds
+ */
+ var defer = restParam(function(func, args) {
+ return baseDelay(func, 1, args);
+ });
+
+ /**
+ * Invokes `func` after `wait` milliseconds. Any additional arguments are
+ * provided to `func` when it's invoked.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to delay.
+ * @param {number} wait The number of milliseconds to delay invocation.
+ * @param {...*} [args] The arguments to invoke the function with.
+ * @returns {number} Returns the timer id.
+ * @example
+ *
+ * _.delay(function(text) {
+ * console.log(text);
+ * }, 1000, 'later');
+ * // => logs 'later' after one second
+ */
+ var delay = restParam(function(func, wait, args) {
+ return baseDelay(func, wait, args);
+ });
+
+ /**
+ * Creates a function that returns the result of invoking the provided
+ * functions with the `this` binding of the created function, where each
+ * successive invocation is supplied the return value of the previous.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {...Function} [funcs] Functions to invoke.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * function square(n) {
+ * return n * n;
+ * }
+ *
+ * var addSquare = _.flow(_.add, square);
+ * addSquare(1, 2);
+ * // => 9
+ */
+ var flow = createFlow();
+
+ /**
+ * This method is like `_.flow` except that it creates a function that
+ * invokes the provided functions from right to left.
+ *
+ * @static
+ * @memberOf _
+ * @alias backflow, compose
+ * @category Function
+ * @param {...Function} [funcs] Functions to invoke.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * function square(n) {
+ * return n * n;
+ * }
+ *
+ * var addSquare = _.flowRight(square, _.add);
+ * addSquare(1, 2);
+ * // => 9
+ */
+ var flowRight = createFlow(true);
+
+ /**
+ * Creates a function that memoizes the result of `func`. If `resolver` is
+ * provided it determines the cache key for storing the result based on the
+ * arguments provided to the memoized function. By default, the first argument
+ * provided to the memoized function is coerced to a string and used as the
+ * cache key. The `func` is invoked with the `this` binding of the memoized
+ * function.
+ *
+ * **Note:** The cache is exposed as the `cache` property on the memoized
+ * function. Its creation may be customized by replacing the `_.memoize.Cache`
+ * constructor with one whose instances implement the [`Map`](http://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-map-prototype-object)
+ * method interface of `get`, `has`, and `set`.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to have its output memoized.
+ * @param {Function} [resolver] The function to resolve the cache key.
+ * @returns {Function} Returns the new memoizing function.
+ * @example
+ *
+ * var upperCase = _.memoize(function(string) {
+ * return string.toUpperCase();
+ * });
+ *
+ * upperCase('fred');
+ * // => 'FRED'
+ *
+ * // modifying the result cache
+ * upperCase.cache.set('fred', 'BARNEY');
+ * upperCase('fred');
+ * // => 'BARNEY'
+ *
+ * // replacing `_.memoize.Cache`
+ * var object = { 'user': 'fred' };
+ * var other = { 'user': 'barney' };
+ * var identity = _.memoize(_.identity);
+ *
+ * identity(object);
+ * // => { 'user': 'fred' }
+ * identity(other);
+ * // => { 'user': 'fred' }
+ *
+ * _.memoize.Cache = WeakMap;
+ * var identity = _.memoize(_.identity);
+ *
+ * identity(object);
+ * // => { 'user': 'fred' }
+ * identity(other);
+ * // => { 'user': 'barney' }
+ */
+ function memoize(func, resolver) {
+ if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ var memoized = function() {
+ var args = arguments,
+ key = resolver ? resolver.apply(this, args) : args[0],
+ cache = memoized.cache;
+
+ if (cache.has(key)) {
+ return cache.get(key);
+ }
+ var result = func.apply(this, args);
+ memoized.cache = cache.set(key, result);
+ return result;
+ };
+ memoized.cache = new memoize.Cache;
+ return memoized;
+ }
+
+ /**
+ * Creates a function that runs each argument through a corresponding
+ * transform function.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to wrap.
+ * @param {...(Function|Function[])} [transforms] The functions to transform
+ * arguments, specified as individual functions or arrays of functions.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * function doubled(n) {
+ * return n * 2;
+ * }
+ *
+ * function square(n) {
+ * return n * n;
+ * }
+ *
+ * var modded = _.modArgs(function(x, y) {
+ * return [x, y];
+ * }, square, doubled);
+ *
+ * modded(1, 2);
+ * // => [1, 4]
+ *
+ * modded(5, 10);
+ * // => [25, 20]
+ */
+ var modArgs = restParam(function(func, transforms) {
+ transforms = baseFlatten(transforms);
+ if (typeof func != 'function' || !arrayEvery(transforms, baseIsFunction)) {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ var length = transforms.length;
+ return restParam(function(args) {
+ var index = nativeMin(args.length, length);
+ while (index--) {
+ args[index] = transforms[index](args[index]);
+ }
+ return func.apply(this, args);
+ });
+ });
+
+ /**
+ * Creates a function that negates the result of the predicate `func`. The
+ * `func` predicate is invoked with the `this` binding and arguments of the
+ * created function.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} predicate The predicate to negate.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * function isEven(n) {
+ * return n % 2 == 0;
+ * }
+ *
+ * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
+ * // => [1, 3, 5]
+ */
+ function negate(predicate) {
+ if (typeof predicate != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ return function() {
+ return !predicate.apply(this, arguments);
+ };
+ }
+
+ /**
+ * Creates a function that is restricted to invoking `func` once. Repeat calls
+ * to the function return the value of the first call. The `func` is invoked
+ * with the `this` binding and arguments of the created function.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to restrict.
+ * @returns {Function} Returns the new restricted function.
+ * @example
+ *
+ * var initialize = _.once(createApplication);
+ * initialize();
+ * initialize();
+ * // `initialize` invokes `createApplication` once
+ */
+ function once(func) {
+ return before(2, func);
+ }
+
+ /**
+ * Creates a function that invokes `func` with `partial` arguments prepended
+ * to those provided to the new function. This method is like `_.bind` except
+ * it does **not** alter the `this` binding.
+ *
+ * The `_.partial.placeholder` value, which defaults to `_` in monolithic
+ * builds, may be used as a placeholder for partially applied arguments.
+ *
+ * **Note:** This method does not set the "length" property of partially
+ * applied functions.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to partially apply arguments to.
+ * @param {...*} [partials] The arguments to be partially applied.
+ * @returns {Function} Returns the new partially applied function.
+ * @example
+ *
+ * var greet = function(greeting, name) {
+ * return greeting + ' ' + name;
+ * };
+ *
+ * var sayHelloTo = _.partial(greet, 'hello');
+ * sayHelloTo('fred');
+ * // => 'hello fred'
+ *
+ * // using placeholders
+ * var greetFred = _.partial(greet, _, 'fred');
+ * greetFred('hi');
+ * // => 'hi fred'
+ */
+ var partial = createPartial(PARTIAL_FLAG);
+
+ /**
+ * This method is like `_.partial` except that partially applied arguments
+ * are appended to those provided to the new function.
+ *
+ * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
+ * builds, may be used as a placeholder for partially applied arguments.
+ *
+ * **Note:** This method does not set the "length" property of partially
+ * applied functions.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to partially apply arguments to.
+ * @param {...*} [partials] The arguments to be partially applied.
+ * @returns {Function} Returns the new partially applied function.
+ * @example
+ *
+ * var greet = function(greeting, name) {
+ * return greeting + ' ' + name;
+ * };
+ *
+ * var greetFred = _.partialRight(greet, 'fred');
+ * greetFred('hi');
+ * // => 'hi fred'
+ *
+ * // using placeholders
+ * var sayHelloTo = _.partialRight(greet, 'hello', _);
+ * sayHelloTo('fred');
+ * // => 'hello fred'
+ */
+ var partialRight = createPartial(PARTIAL_RIGHT_FLAG);
+
+ /**
+ * Creates a function that invokes `func` with arguments arranged according
+ * to the specified indexes where the argument value at the first index is
+ * provided as the first argument, the argument value at the second index is
+ * provided as the second argument, and so on.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to rearrange arguments for.
+ * @param {...(number|number[])} indexes The arranged argument indexes,
+ * specified as individual indexes or arrays of indexes.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var rearged = _.rearg(function(a, b, c) {
+ * return [a, b, c];
+ * }, 2, 0, 1);
+ *
+ * rearged('b', 'c', 'a')
+ * // => ['a', 'b', 'c']
+ *
+ * var map = _.rearg(_.map, [1, 0]);
+ * map(function(n) {
+ * return n * 3;
+ * }, [1, 2, 3]);
+ * // => [3, 6, 9]
+ */
+ var rearg = restParam(function(func, indexes) {
+ return createWrapper(func, REARG_FLAG, undefined, undefined, undefined, baseFlatten(indexes));
+ });
+
+ /**
+ * Creates a function that invokes `func` with the `this` binding of the
+ * created function and arguments from `start` and beyond provided as an array.
+ *
+ * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters).
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to apply a rest parameter to.
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var say = _.restParam(function(what, names) {
+ * return what + ' ' + _.initial(names).join(', ') +
+ * (_.size(names) > 1 ? ', & ' : '') + _.last(names);
+ * });
+ *
+ * say('hello', 'fred', 'barney', 'pebbles');
+ * // => 'hello fred, barney, & pebbles'
+ */
+ function restParam(func, start) {
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0);
+ return function() {
+ var args = arguments,
+ index = -1,
+ length = nativeMax(args.length - start, 0),
+ rest = Array(length);
+
+ while (++index < length) {
+ rest[index] = args[start + index];
+ }
+ switch (start) {
+ case 0: return func.call(this, rest);
+ case 1: return func.call(this, args[0], rest);
+ case 2: return func.call(this, args[0], args[1], rest);
+ }
+ var otherArgs = Array(start + 1);
+ index = -1;
+ while (++index < start) {
+ otherArgs[index] = args[index];
+ }
+ otherArgs[start] = rest;
+ return func.apply(this, otherArgs);
+ };
+ }
+
+ /**
+ * Creates a function that invokes `func` with the `this` binding of the created
+ * function and an array of arguments much like [`Function#apply`](https://es5.github.io/#x15.3.4.3).
+ *
+ * **Note:** This method is based on the [spread operator](https://developer.mozilla.org/Web/JavaScript/Reference/Operators/Spread_operator).
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to spread arguments over.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var say = _.spread(function(who, what) {
+ * return who + ' says ' + what;
+ * });
+ *
+ * say(['fred', 'hello']);
+ * // => 'fred says hello'
+ *
+ * // with a Promise
+ * var numbers = Promise.all([
+ * Promise.resolve(40),
+ * Promise.resolve(36)
+ * ]);
+ *
+ * numbers.then(_.spread(function(x, y) {
+ * return x + y;
+ * }));
+ * // => a Promise of 76
+ */
+ function spread(func) {
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ return function(array) {
+ return func.apply(this, array);
+ };
+ }
+
+ /**
+ * Creates a throttled function that only invokes `func` at most once per
+ * every `wait` milliseconds. The throttled function comes with a `cancel`
+ * method to cancel delayed invocations. Provide an options object to indicate
+ * that `func` should be invoked on the leading and/or trailing edge of the
+ * `wait` timeout. Subsequent calls to the throttled function return the
+ * result of the last `func` call.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
+ * on the trailing edge of the timeout only if the the throttled function is
+ * invoked more than once during the `wait` timeout.
+ *
+ * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
+ * for details over the differences between `_.throttle` and `_.debounce`.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to throttle.
+ * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
+ * @param {Object} [options] The options object.
+ * @param {boolean} [options.leading=true] Specify invoking on the leading
+ * edge of the timeout.
+ * @param {boolean} [options.trailing=true] Specify invoking on the trailing
+ * edge of the timeout.
+ * @returns {Function} Returns the new throttled function.
+ * @example
+ *
+ * // avoid excessively updating the position while scrolling
+ * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
+ *
+ * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes
+ * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {
+ * 'trailing': false
+ * }));
+ *
+ * // cancel a trailing throttled call
+ * jQuery(window).on('popstate', throttled.cancel);
+ */
+ function throttle(func, wait, options) {
+ var leading = true,
+ trailing = true;
+
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ if (options === false) {
+ leading = false;
+ } else if (isObject(options)) {
+ leading = 'leading' in options ? !!options.leading : leading;
+ trailing = 'trailing' in options ? !!options.trailing : trailing;
+ }
+ return debounce(func, wait, { 'leading': leading, 'maxWait': +wait, 'trailing': trailing });
+ }
+
+ /**
+ * Creates a function that provides `value` to the wrapper function as its
+ * first argument. Any additional arguments provided to the function are
+ * appended to those provided to the wrapper function. The wrapper is invoked
+ * with the `this` binding of the created function.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {*} value The value to wrap.
+ * @param {Function} wrapper The wrapper function.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var p = _.wrap(_.escape, function(func, text) {
+ * return '<p>' + func(text) + '</p>';
+ * });
+ *
+ * p('fred, barney, & pebbles');
+ * // => '<p>fred, barney, &amp; pebbles</p>'
+ */
+ function wrap(value, wrapper) {
+ wrapper = wrapper == null ? identity : wrapper;
+ return createWrapper(wrapper, PARTIAL_FLAG, undefined, [value], []);
+ }
+
+ /*------------------------------------------------------------------------*/
+
+ /**
+ * Creates a clone of `value`. If `isDeep` is `true` nested objects are cloned,
+ * otherwise they are assigned by reference. If `customizer` is provided it's
+ * invoked to produce the cloned values. If `customizer` returns `undefined`
+ * cloning is handled by the method instead. The `customizer` is bound to
+ * `thisArg` and invoked with up to three argument; (value [, index|key, object]).
+ *
+ * **Note:** This method is loosely based on the
+ * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).
+ * The enumerable properties of `arguments` objects and objects created by
+ * constructors other than `Object` are cloned to plain `Object` objects. An
+ * empty object is returned for uncloneable values such as functions, DOM nodes,
+ * Maps, Sets, and WeakMaps.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @param {Function} [customizer] The function to customize cloning values.
+ * @param {*} [thisArg] The `this` binding of `customizer`.
+ * @returns {*} Returns the cloned value.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney' },
+ * { 'user': 'fred' }
+ * ];
+ *
+ * var shallow = _.clone(users);
+ * shallow[0] === users[0];
+ * // => true
+ *
+ * var deep = _.clone(users, true);
+ * deep[0] === users[0];
+ * // => false
+ *
+ * // using a customizer callback
+ * var el = _.clone(document.body, function(value) {
+ * if (_.isElement(value)) {
+ * return value.cloneNode(false);
+ * }
+ * });
+ *
+ * el === document.body
+ * // => false
+ * el.nodeName
+ * // => BODY
+ * el.childNodes.length;
+ * // => 0
+ */
+ function clone(value, isDeep, customizer, thisArg) {
+ if (isDeep && typeof isDeep != 'boolean' && isIterateeCall(value, isDeep, customizer)) {
+ isDeep = false;
+ }
+ else if (typeof isDeep == 'function') {
+ thisArg = customizer;
+ customizer = isDeep;
+ isDeep = false;
+ }
+ return typeof customizer == 'function'
+ ? baseClone(value, isDeep, bindCallback(customizer, thisArg, 3))
+ : baseClone(value, isDeep);
+ }
+
+ /**
+ * Creates a deep clone of `value`. If `customizer` is provided it's invoked
+ * to produce the cloned values. If `customizer` returns `undefined` cloning
+ * is handled by the method instead. The `customizer` is bound to `thisArg`
+ * and invoked with up to three argument; (value [, index|key, object]).
+ *
+ * **Note:** This method is loosely based on the
+ * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).
+ * The enumerable properties of `arguments` objects and objects created by
+ * constructors other than `Object` are cloned to plain `Object` objects. An
+ * empty object is returned for uncloneable values such as functions, DOM nodes,
+ * Maps, Sets, and WeakMaps.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to deep clone.
+ * @param {Function} [customizer] The function to customize cloning values.
+ * @param {*} [thisArg] The `this` binding of `customizer`.
+ * @returns {*} Returns the deep cloned value.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney' },
+ * { 'user': 'fred' }
+ * ];
+ *
+ * var deep = _.cloneDeep(users);
+ * deep[0] === users[0];
+ * // => false
+ *
+ * // using a customizer callback
+ * var el = _.cloneDeep(document.body, function(value) {
+ * if (_.isElement(value)) {
+ * return value.cloneNode(true);
+ * }
+ * });
+ *
+ * el === document.body
+ * // => false
+ * el.nodeName
+ * // => BODY
+ * el.childNodes.length;
+ * // => 20
+ */
+ function cloneDeep(value, customizer, thisArg) {
+ return typeof customizer == 'function'
+ ? baseClone(value, true, bindCallback(customizer, thisArg, 3))
+ : baseClone(value, true);
+ }
+
+ /**
+ * Checks if `value` is greater than `other`.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if `value` is greater than `other`, else `false`.
+ * @example
+ *
+ * _.gt(3, 1);
+ * // => true
+ *
+ * _.gt(3, 3);
+ * // => false
+ *
+ * _.gt(1, 3);
+ * // => false
+ */
+ function gt(value, other) {
+ return value > other;
+ }
+
+ /**
+ * Checks if `value` is greater than or equal to `other`.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if `value` is greater than or equal to `other`, else `false`.
+ * @example
+ *
+ * _.gte(3, 1);
+ * // => true
+ *
+ * _.gte(3, 3);
+ * // => true
+ *
+ * _.gte(1, 3);
+ * // => false
+ */
+ function gte(value, other) {
+ return value >= other;
+ }
+
+ /**
+ * Checks if `value` is classified as an `arguments` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isArguments(function() { return arguments; }());
+ * // => true
+ *
+ * _.isArguments([1, 2, 3]);
+ * // => false
+ */
+ function isArguments(value) {
+ return isObjectLike(value) && isArrayLike(value) &&
+ hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');
+ }
+
+ /**
+ * Checks if `value` is classified as an `Array` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isArray([1, 2, 3]);
+ * // => true
+ *
+ * _.isArray(function() { return arguments; }());
+ * // => false
+ */
+ var isArray = nativeIsArray || function(value) {
+ return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;
+ };
+
+ /**
+ * Checks if `value` is classified as a boolean primitive or object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isBoolean(false);
+ * // => true
+ *
+ * _.isBoolean(null);
+ * // => false
+ */
+ function isBoolean(value) {
+ return value === true || value === false || (isObjectLike(value) && objToString.call(value) == boolTag);
+ }
+
+ /**
+ * Checks if `value` is classified as a `Date` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isDate(new Date);
+ * // => true
+ *
+ * _.isDate('Mon April 23 2012');
+ * // => false
+ */
+ function isDate(value) {
+ return isObjectLike(value) && objToString.call(value) == dateTag;
+ }
+
+ /**
+ * Checks if `value` is a DOM element.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
+ * @example
+ *
+ * _.isElement(document.body);
+ * // => true
+ *
+ * _.isElement('<body>');
+ * // => false
+ */
+ function isElement(value) {
+ return !!value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value);
+ }
+
+ /**
+ * Checks if `value` is empty. A value is considered empty unless it's an
+ * `arguments` object, array, string, or jQuery-like collection with a length
+ * greater than `0` or an object with own enumerable properties.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {Array|Object|string} value The value to inspect.
+ * @returns {boolean} Returns `true` if `value` is empty, else `false`.
+ * @example
+ *
+ * _.isEmpty(null);
+ * // => true
+ *
+ * _.isEmpty(true);
+ * // => true
+ *
+ * _.isEmpty(1);
+ * // => true
+ *
+ * _.isEmpty([1, 2, 3]);
+ * // => false
+ *
+ * _.isEmpty({ 'a': 1 });
+ * // => false
+ */
+ function isEmpty(value) {
+ if (value == null) {
+ return true;
+ }
+ if (isArrayLike(value) && (isArray(value) || isString(value) || isArguments(value) ||
+ (isObjectLike(value) && isFunction(value.splice)))) {
+ return !value.length;
+ }
+ return !keys(value).length;
+ }
+
+ /**
+ * Performs a deep comparison between two values to determine if they are
+ * equivalent. If `customizer` is provided it's invoked to compare values.
+ * If `customizer` returns `undefined` comparisons are handled by the method
+ * instead. The `customizer` is bound to `thisArg` and invoked with up to
+ * three arguments: (value, other [, index|key]).
+ *
+ * **Note:** This method supports comparing arrays, booleans, `Date` objects,
+ * numbers, `Object` objects, regexes, and strings. Objects are compared by
+ * their own, not inherited, enumerable properties. Functions and DOM nodes
+ * are **not** supported. Provide a customizer function to extend support
+ * for comparing other values.
+ *
+ * @static
+ * @memberOf _
+ * @alias eq
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @param {Function} [customizer] The function to customize value comparisons.
+ * @param {*} [thisArg] The `this` binding of `customizer`.
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+ * @example
+ *
+ * var object = { 'user': 'fred' };
+ * var other = { 'user': 'fred' };
+ *
+ * object == other;
+ * // => false
+ *
+ * _.isEqual(object, other);
+ * // => true
+ *
+ * // using a customizer callback
+ * var array = ['hello', 'goodbye'];
+ * var other = ['hi', 'goodbye'];
+ *
+ * _.isEqual(array, other, function(value, other) {
+ * if (_.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/)) {
+ * return true;
+ * }
+ * });
+ * // => true
+ */
+ function isEqual(value, other, customizer, thisArg) {
+ customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined;
+ var result = customizer ? customizer(value, other) : undefined;
+ return result === undefined ? baseIsEqual(value, other, customizer) : !!result;
+ }
+
+ /**
+ * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
+ * `SyntaxError`, `TypeError`, or `URIError` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
+ * @example
+ *
+ * _.isError(new Error);
+ * // => true
+ *
+ * _.isError(Error);
+ * // => false
+ */
+ function isError(value) {
+ return isObjectLike(value) && typeof value.message == 'string' && objToString.call(value) == errorTag;
+ }
+
+ /**
+ * Checks if `value` is a finite primitive number.
+ *
+ * **Note:** This method is based on [`Number.isFinite`](http://ecma-international.org/ecma-262/6.0/#sec-number.isfinite).
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
+ * @example
+ *
+ * _.isFinite(10);
+ * // => true
+ *
+ * _.isFinite('10');
+ * // => false
+ *
+ * _.isFinite(true);
+ * // => false
+ *
+ * _.isFinite(Object(10));
+ * // => false
+ *
+ * _.isFinite(Infinity);
+ * // => false
+ */
+ function isFinite(value) {
+ return typeof value == 'number' && nativeIsFinite(value);
+ }
+
+ /**
+ * Checks if `value` is classified as a `Function` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isFunction(_);
+ * // => true
+ *
+ * _.isFunction(/abc/);
+ * // => false
+ */
+ function isFunction(value) {
+ // The use of `Object#toString` avoids issues with the `typeof` operator
+ // in older versions of Chrome and Safari which return 'function' for regexes
+ // and Safari 8 which returns 'object' for typed array constructors.
+ return isObject(value) && objToString.call(value) == funcTag;
+ }
+
+ /**
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
+ * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(1);
+ * // => false
+ */
+ function isObject(value) {
+ // Avoid a V8 JIT bug in Chrome 19-20.
+ // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
+ var type = typeof value;
+ return !!value && (type == 'object' || type == 'function');
+ }
+
+ /**
+ * Performs a deep comparison between `object` and `source` to determine if
+ * `object` contains equivalent property values. If `customizer` is provided
+ * it's invoked to compare values. If `customizer` returns `undefined`
+ * comparisons are handled by the method instead. The `customizer` is bound
+ * to `thisArg` and invoked with three arguments: (value, other, index|key).
+ *
+ * **Note:** This method supports comparing properties of arrays, booleans,
+ * `Date` objects, numbers, `Object` objects, regexes, and strings. Functions
+ * and DOM nodes are **not** supported. Provide a customizer function to extend
+ * support for comparing other values.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {Object} object The object to inspect.
+ * @param {Object} source The object of property values to match.
+ * @param {Function} [customizer] The function to customize value comparisons.
+ * @param {*} [thisArg] The `this` binding of `customizer`.
+ * @returns {boolean} Returns `true` if `object` is a match, else `false`.
+ * @example
+ *
+ * var object = { 'user': 'fred', 'age': 40 };
+ *
+ * _.isMatch(object, { 'age': 40 });
+ * // => true
+ *
+ * _.isMatch(object, { 'age': 36 });
+ * // => false
+ *
+ * // using a customizer callback
+ * var object = { 'greeting': 'hello' };
+ * var source = { 'greeting': 'hi' };
+ *
+ * _.isMatch(object, source, function(value, other) {
+ * return _.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/) || undefined;
+ * });
+ * // => true
+ */
+ function isMatch(object, source, customizer, thisArg) {
+ customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined;
+ return baseIsMatch(object, getMatchData(source), customizer);
+ }
+
+ /**
+ * Checks if `value` is `NaN`.
+ *
+ * **Note:** This method is not the same as [`isNaN`](https://es5.github.io/#x15.1.2.4)
+ * which returns `true` for `undefined` and other non-numeric values.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
+ * @example
+ *
+ * _.isNaN(NaN);
+ * // => true
+ *
+ * _.isNaN(new Number(NaN));
+ * // => true
+ *
+ * isNaN(undefined);
+ * // => true
+ *
+ * _.isNaN(undefined);
+ * // => false
+ */
+ function isNaN(value) {
+ // An `NaN` primitive is the only value that is not equal to itself.
+ // Perform the `toStringTag` check first to avoid errors with some host objects in IE.
+ return isNumber(value) && value != +value;
+ }
+
+ /**
+ * Checks if `value` is a native function.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
+ * @example
+ *
+ * _.isNative(Array.prototype.push);
+ * // => true
+ *
+ * _.isNative(_);
+ * // => false
+ */
+ function isNative(value) {
+ if (value == null) {
+ return false;
+ }
+ if (isFunction(value)) {
+ return reIsNative.test(fnToString.call(value));
+ }
+ return isObjectLike(value) && reIsHostCtor.test(value);
+ }
+
+ /**
+ * Checks if `value` is `null`.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
+ * @example
+ *
+ * _.isNull(null);
+ * // => true
+ *
+ * _.isNull(void 0);
+ * // => false
+ */
+ function isNull(value) {
+ return value === null;
+ }
+
+ /**
+ * Checks if `value` is classified as a `Number` primitive or object.
+ *
+ * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are classified
+ * as numbers, use the `_.isFinite` method.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isNumber(8.4);
+ * // => true
+ *
+ * _.isNumber(NaN);
+ * // => true
+ *
+ * _.isNumber('8.4');
+ * // => false
+ */
+ function isNumber(value) {
+ return typeof value == 'number' || (isObjectLike(value) && objToString.call(value) == numberTag);
+ }
+
+ /**
+ * Checks if `value` is a plain object, that is, an object created by the
+ * `Object` constructor or one with a `[[Prototype]]` of `null`.
+ *
+ * **Note:** This method assumes objects created by the `Object` constructor
+ * have no inherited enumerable properties.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * }
+ *
+ * _.isPlainObject(new Foo);
+ * // => false
+ *
+ * _.isPlainObject([1, 2, 3]);
+ * // => false
+ *
+ * _.isPlainObject({ 'x': 0, 'y': 0 });
+ * // => true
+ *
+ * _.isPlainObject(Object.create(null));
+ * // => true
+ */
+ function isPlainObject(value) {
+ var Ctor;
+
+ // Exit early for non `Object` objects.
+ if (!(isObjectLike(value) && objToString.call(value) == objectTag && !isArguments(value)) ||
+ (!hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) {
+ return false;
+ }
+ // IE < 9 iterates inherited properties before own properties. If the first
+ // iterated property is an object's own property then there are no inherited
+ // enumerable properties.
+ var result;
+ // In most environments an object's own properties are iterated before
+ // its inherited properties. If the last iterated property is an object's
+ // own property then there are no inherited enumerable properties.
+ baseForIn(value, function(subValue, key) {
+ result = key;
+ });
+ return result === undefined || hasOwnProperty.call(value, result);
+ }
+
+ /**
+ * Checks if `value` is classified as a `RegExp` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isRegExp(/abc/);
+ * // => true
+ *
+ * _.isRegExp('/abc/');
+ * // => false
+ */
+ function isRegExp(value) {
+ return isObject(value) && objToString.call(value) == regexpTag;
+ }
+
+ /**
+ * Checks if `value` is classified as a `String` primitive or object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isString('abc');
+ * // => true
+ *
+ * _.isString(1);
+ * // => false
+ */
+ function isString(value) {
+ return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);
+ }
+
+ /**
+ * Checks if `value` is classified as a typed array.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isTypedArray(new Uint8Array);
+ * // => true
+ *
+ * _.isTypedArray([]);
+ * // => false
+ */
+ function isTypedArray(value) {
+ return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];
+ }
+
+ /**
+ * Checks if `value` is `undefined`.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
+ * @example
+ *
+ * _.isUndefined(void 0);
+ * // => true
+ *
+ * _.isUndefined(null);
+ * // => false
+ */
+ function isUndefined(value) {
+ return value === undefined;
+ }
+
+ /**
+ * Checks if `value` is less than `other`.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if `value` is less than `other`, else `false`.
+ * @example
+ *
+ * _.lt(1, 3);
+ * // => true
+ *
+ * _.lt(3, 3);
+ * // => false
+ *
+ * _.lt(3, 1);
+ * // => false
+ */
+ function lt(value, other) {
+ return value < other;
+ }
+
+ /**
+ * Checks if `value` is less than or equal to `other`.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if `value` is less than or equal to `other`, else `false`.
+ * @example
+ *
+ * _.lte(1, 3);
+ * // => true
+ *
+ * _.lte(3, 3);
+ * // => true
+ *
+ * _.lte(3, 1);
+ * // => false
+ */
+ function lte(value, other) {
+ return value <= other;
+ }
+
+ /**
+ * Converts `value` to an array.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {Array} Returns the converted array.
+ * @example
+ *
+ * (function() {
+ * return _.toArray(arguments).slice(1);
+ * }(1, 2, 3));
+ * // => [2, 3]
+ */
+ function toArray(value) {
+ var length = value ? getLength(value) : 0;
+ if (!isLength(length)) {
+ return values(value);
+ }
+ if (!length) {
+ return [];
+ }
+ return arrayCopy(value);
+ }
+
+ /**
+ * Converts `value` to a plain object flattening inherited enumerable
+ * properties of `value` to own properties of the plain object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {Object} Returns the converted plain object.
+ * @example
+ *
+ * function Foo() {
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.assign({ 'a': 1 }, new Foo);
+ * // => { 'a': 1, 'b': 2 }
+ *
+ * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
+ * // => { 'a': 1, 'b': 2, 'c': 3 }
+ */
+ function toPlainObject(value) {
+ return baseCopy(value, keysIn(value));
+ }
+
+ /*------------------------------------------------------------------------*/
+
+ /**
+ * Recursively merges own enumerable properties of the source object(s), that
+ * don't resolve to `undefined` into the destination object. Subsequent sources
+ * overwrite property assignments of previous sources. If `customizer` is
+ * provided it's invoked to produce the merged values of the destination and
+ * source properties. If `customizer` returns `undefined` merging is handled
+ * by the method instead. The `customizer` is bound to `thisArg` and invoked
+ * with five arguments: (objectValue, sourceValue, key, object, source).
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @param {Function} [customizer] The function to customize assigned values.
+ * @param {*} [thisArg] The `this` binding of `customizer`.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * var users = {
+ * 'data': [{ 'user': 'barney' }, { 'user': 'fred' }]
+ * };
+ *
+ * var ages = {
+ * 'data': [{ 'age': 36 }, { 'age': 40 }]
+ * };
+ *
+ * _.merge(users, ages);
+ * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }
+ *
+ * // using a customizer callback
+ * var object = {
+ * 'fruits': ['apple'],
+ * 'vegetables': ['beet']
+ * };
+ *
+ * var other = {
+ * 'fruits': ['banana'],
+ * 'vegetables': ['carrot']
+ * };
+ *
+ * _.merge(object, other, function(a, b) {
+ * if (_.isArray(a)) {
+ * return a.concat(b);
+ * }
+ * });
+ * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }
+ */
+ var merge = createAssigner(baseMerge);
+
+ /**
+ * Assigns own enumerable properties of source object(s) to the destination
+ * object. Subsequent sources overwrite property assignments of previous sources.
+ * If `customizer` is provided it's invoked to produce the assigned values.
+ * The `customizer` is bound to `thisArg` and invoked with five arguments:
+ * (objectValue, sourceValue, key, object, source).
+ *
+ * **Note:** This method mutates `object` and is based on
+ * [`Object.assign`](http://ecma-international.org/ecma-262/6.0/#sec-object.assign).
+ *
+ * @static
+ * @memberOf _
+ * @alias extend
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @param {Function} [customizer] The function to customize assigned values.
+ * @param {*} [thisArg] The `this` binding of `customizer`.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' });
+ * // => { 'user': 'fred', 'age': 40 }
+ *
+ * // using a customizer callback
+ * var defaults = _.partialRight(_.assign, function(value, other) {
+ * return _.isUndefined(value) ? other : value;
+ * });
+ *
+ * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
+ * // => { 'user': 'barney', 'age': 36 }
+ */
+ var assign = createAssigner(function(object, source, customizer) {
+ return customizer
+ ? assignWith(object, source, customizer)
+ : baseAssign(object, source);
+ });
+
+ /**
+ * Creates an object that inherits from the given `prototype` object. If a
+ * `properties` object is provided its own enumerable properties are assigned
+ * to the created object.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} prototype The object to inherit from.
+ * @param {Object} [properties] The properties to assign to the object.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * function Shape() {
+ * this.x = 0;
+ * this.y = 0;
+ * }
+ *
+ * function Circle() {
+ * Shape.call(this);
+ * }
+ *
+ * Circle.prototype = _.create(Shape.prototype, {
+ * 'constructor': Circle
+ * });
+ *
+ * var circle = new Circle;
+ * circle instanceof Circle;
+ * // => true
+ *
+ * circle instanceof Shape;
+ * // => true
+ */
+ function create(prototype, properties, guard) {
+ var result = baseCreate(prototype);
+ if (guard && isIterateeCall(prototype, properties, guard)) {
+ properties = undefined;
+ }
+ return properties ? baseAssign(result, properties) : result;
+ }
+
+ /**
+ * Assigns own enumerable properties of source object(s) to the destination
+ * object for all destination properties that resolve to `undefined`. Once a
+ * property is set, additional values of the same property are ignored.
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
+ * // => { 'user': 'barney', 'age': 36 }
+ */
+ var defaults = createDefaults(assign, assignDefaults);
+
+ /**
+ * This method is like `_.defaults` except that it recursively assigns
+ * default properties.
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * _.defaultsDeep({ 'user': { 'name': 'barney' } }, { 'user': { 'name': 'fred', 'age': 36 } });
+ * // => { 'user': { 'name': 'barney', 'age': 36 } }
+ *
+ */
+ var defaultsDeep = createDefaults(merge, mergeDefaults);
+
+ /**
+ * This method is like `_.find` except that it returns the key of the first
+ * element `predicate` returns truthy for instead of the element itself.
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to search.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {string|undefined} Returns the key of the matched element, else `undefined`.
+ * @example
+ *
+ * var users = {
+ * 'barney': { 'age': 36, 'active': true },
+ * 'fred': { 'age': 40, 'active': false },
+ * 'pebbles': { 'age': 1, 'active': true }
+ * };
+ *
+ * _.findKey(users, function(chr) {
+ * return chr.age < 40;
+ * });
+ * // => 'barney' (iteration order is not guaranteed)
+ *
+ * // using the `_.matches` callback shorthand
+ * _.findKey(users, { 'age': 1, 'active': true });
+ * // => 'pebbles'
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.findKey(users, 'active', false);
+ * // => 'fred'
+ *
+ * // using the `_.property` callback shorthand
+ * _.findKey(users, 'active');
+ * // => 'barney'
+ */
+ var findKey = createFindKey(baseForOwn);
+
+ /**
+ * This method is like `_.findKey` except that it iterates over elements of
+ * a collection in the opposite order.
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to search.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {string|undefined} Returns the key of the matched element, else `undefined`.
+ * @example
+ *
+ * var users = {
+ * 'barney': { 'age': 36, 'active': true },
+ * 'fred': { 'age': 40, 'active': false },
+ * 'pebbles': { 'age': 1, 'active': true }
+ * };
+ *
+ * _.findLastKey(users, function(chr) {
+ * return chr.age < 40;
+ * });
+ * // => returns `pebbles` assuming `_.findKey` returns `barney`
+ *
+ * // using the `_.matches` callback shorthand
+ * _.findLastKey(users, { 'age': 36, 'active': true });
+ * // => 'barney'
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.findLastKey(users, 'active', false);
+ * // => 'fred'
+ *
+ * // using the `_.property` callback shorthand
+ * _.findLastKey(users, 'active');
+ * // => 'pebbles'
+ */
+ var findLastKey = createFindKey(baseForOwnRight);
+
+ /**
+ * Iterates over own and inherited enumerable properties of an object invoking
+ * `iteratee` for each property. The `iteratee` is bound to `thisArg` and invoked
+ * with three arguments: (value, key, object). Iteratee functions may exit
+ * iteration early by explicitly returning `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.forIn(new Foo, function(value, key) {
+ * console.log(key);
+ * });
+ * // => logs 'a', 'b', and 'c' (iteration order is not guaranteed)
+ */
+ var forIn = createForIn(baseFor);
+
+ /**
+ * This method is like `_.forIn` except that it iterates over properties of
+ * `object` in the opposite order.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.forInRight(new Foo, function(value, key) {
+ * console.log(key);
+ * });
+ * // => logs 'c', 'b', and 'a' assuming `_.forIn ` logs 'a', 'b', and 'c'
+ */
+ var forInRight = createForIn(baseForRight);
+
+ /**
+ * Iterates over own enumerable properties of an object invoking `iteratee`
+ * for each property. The `iteratee` is bound to `thisArg` and invoked with
+ * three arguments: (value, key, object). Iteratee functions may exit iteration
+ * early by explicitly returning `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.forOwn(new Foo, function(value, key) {
+ * console.log(key);
+ * });
+ * // => logs 'a' and 'b' (iteration order is not guaranteed)
+ */
+ var forOwn = createForOwn(baseForOwn);
+
+ /**
+ * This method is like `_.forOwn` except that it iterates over properties of
+ * `object` in the opposite order.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.forOwnRight(new Foo, function(value, key) {
+ * console.log(key);
+ * });
+ * // => logs 'b' and 'a' assuming `_.forOwn` logs 'a' and 'b'
+ */
+ var forOwnRight = createForOwn(baseForOwnRight);
+
+ /**
+ * Creates an array of function property names from all enumerable properties,
+ * own and inherited, of `object`.
+ *
+ * @static
+ * @memberOf _
+ * @alias methods
+ * @category Object
+ * @param {Object} object The object to inspect.
+ * @returns {Array} Returns the new array of property names.
+ * @example
+ *
+ * _.functions(_);
+ * // => ['after', 'ary', 'assign', ...]
+ */
+ function functions(object) {
+ return baseFunctions(object, keysIn(object));
+ }
+
+ /**
+ * Gets the property value at `path` of `object`. If the resolved value is
+ * `undefined` the `defaultValue` is used in its place.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path of the property to get.
+ * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.
+ * @returns {*} Returns the resolved value.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+ *
+ * _.get(object, 'a[0].b.c');
+ * // => 3
+ *
+ * _.get(object, ['a', '0', 'b', 'c']);
+ * // => 3
+ *
+ * _.get(object, 'a.b.c', 'default');
+ * // => 'default'
+ */
+ function get(object, path, defaultValue) {
+ var result = object == null ? undefined : baseGet(object, toPath(path), (path + ''));
+ return result === undefined ? defaultValue : result;
+ }
+
+ /**
+ * Checks if `path` is a direct property.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path to check.
+ * @returns {boolean} Returns `true` if `path` is a direct property, else `false`.
+ * @example
+ *
+ * var object = { 'a': { 'b': { 'c': 3 } } };
+ *
+ * _.has(object, 'a');
+ * // => true
+ *
+ * _.has(object, 'a.b.c');
+ * // => true
+ *
+ * _.has(object, ['a', 'b', 'c']);
+ * // => true
+ */
+ function has(object, path) {
+ if (object == null) {
+ return false;
+ }
+ var result = hasOwnProperty.call(object, path);
+ if (!result && !isKey(path)) {
+ path = toPath(path);
+ object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
+ if (object == null) {
+ return false;
+ }
+ path = last(path);
+ result = hasOwnProperty.call(object, path);
+ }
+ return result || (isLength(object.length) && isIndex(path, object.length) &&
+ (isArray(object) || isArguments(object)));
+ }
+
+ /**
+ * Creates an object composed of the inverted keys and values of `object`.
+ * If `object` contains duplicate values, subsequent values overwrite property
+ * assignments of previous values unless `multiValue` is `true`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to invert.
+ * @param {boolean} [multiValue] Allow multiple values per key.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Object} Returns the new inverted object.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': 2, 'c': 1 };
+ *
+ * _.invert(object);
+ * // => { '1': 'c', '2': 'b' }
+ *
+ * // with `multiValue`
+ * _.invert(object, true);
+ * // => { '1': ['a', 'c'], '2': ['b'] }
+ */
+ function invert(object, multiValue, guard) {
+ if (guard && isIterateeCall(object, multiValue, guard)) {
+ multiValue = undefined;
+ }
+ var index = -1,
+ props = keys(object),
+ length = props.length,
+ result = {};
+
+ while (++index < length) {
+ var key = props[index],
+ value = object[key];
+
+ if (multiValue) {
+ if (hasOwnProperty.call(result, value)) {
+ result[value].push(key);
+ } else {
+ result[value] = [key];
+ }
+ }
+ else {
+ result[value] = key;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Creates an array of the own enumerable property names of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects. See the
+ * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)
+ * for more details.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.keys(new Foo);
+ * // => ['a', 'b'] (iteration order is not guaranteed)
+ *
+ * _.keys('hi');
+ * // => ['0', '1']
+ */
+ var keys = !nativeKeys ? shimKeys : function(object) {
+ var Ctor = object == null ? undefined : object.constructor;
+ if ((typeof Ctor == 'function' && Ctor.prototype === object) ||
+ (typeof object != 'function' && isArrayLike(object))) {
+ return shimKeys(object);
+ }
+ return isObject(object) ? nativeKeys(object) : [];
+ };
+
+ /**
+ * Creates an array of the own and inherited enumerable property names of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.keysIn(new Foo);
+ * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
+ */
+ function keysIn(object) {
+ if (object == null) {
+ return [];
+ }
+ if (!isObject(object)) {
+ object = Object(object);
+ }
+ var length = object.length;
+ length = (length && isLength(length) &&
+ (isArray(object) || isArguments(object)) && length) || 0;
+
+ var Ctor = object.constructor,
+ index = -1,
+ isProto = typeof Ctor == 'function' && Ctor.prototype === object,
+ result = Array(length),
+ skipIndexes = length > 0;
+
+ while (++index < length) {
+ result[index] = (index + '');
+ }
+ for (var key in object) {
+ if (!(skipIndexes && isIndex(key, length)) &&
+ !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
+ result.push(key);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * The opposite of `_.mapValues`; this method creates an object with the
+ * same values as `object` and keys generated by running each own enumerable
+ * property of `object` through `iteratee`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Object} Returns the new mapped object.
+ * @example
+ *
+ * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
+ * return key + value;
+ * });
+ * // => { 'a1': 1, 'b2': 2 }
+ */
+ var mapKeys = createObjectMapper(true);
+
+ /**
+ * Creates an object with the same keys as `object` and values generated by
+ * running each own enumerable property of `object` through `iteratee`. The
+ * iteratee function is bound to `thisArg` and invoked with three arguments:
+ * (value, key, object).
+ *
+ * If a property name is provided for `iteratee` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `iteratee` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Object} Returns the new mapped object.
+ * @example
+ *
+ * _.mapValues({ 'a': 1, 'b': 2 }, function(n) {
+ * return n * 3;
+ * });
+ * // => { 'a': 3, 'b': 6 }
+ *
+ * var users = {
+ * 'fred': { 'user': 'fred', 'age': 40 },
+ * 'pebbles': { 'user': 'pebbles', 'age': 1 }
+ * };
+ *
+ * // using the `_.property` callback shorthand
+ * _.mapValues(users, 'age');
+ * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
+ */
+ var mapValues = createObjectMapper();
+
+ /**
+ * The opposite of `_.pick`; this method creates an object composed of the
+ * own and inherited enumerable properties of `object` that are not omitted.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The source object.
+ * @param {Function|...(string|string[])} [predicate] The function invoked per
+ * iteration or property names to omit, specified as individual property
+ * names or arrays of property names.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * var object = { 'user': 'fred', 'age': 40 };
+ *
+ * _.omit(object, 'age');
+ * // => { 'user': 'fred' }
+ *
+ * _.omit(object, _.isNumber);
+ * // => { 'user': 'fred' }
+ */
+ var omit = restParam(function(object, props) {
+ if (object == null) {
+ return {};
+ }
+ if (typeof props[0] != 'function') {
+ var props = arrayMap(baseFlatten(props), String);
+ return pickByArray(object, baseDifference(keysIn(object), props));
+ }
+ var predicate = bindCallback(props[0], props[1], 3);
+ return pickByCallback(object, function(value, key, object) {
+ return !predicate(value, key, object);
+ });
+ });
+
+ /**
+ * Creates a two dimensional array of the key-value pairs for `object`,
+ * e.g. `[[key1, value1], [key2, value2]]`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the new array of key-value pairs.
+ * @example
+ *
+ * _.pairs({ 'barney': 36, 'fred': 40 });
+ * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)
+ */
+ function pairs(object) {
+ object = toObject(object);
+
+ var index = -1,
+ props = keys(object),
+ length = props.length,
+ result = Array(length);
+
+ while (++index < length) {
+ var key = props[index];
+ result[index] = [key, object[key]];
+ }
+ return result;
+ }
+
+ /**
+ * Creates an object composed of the picked `object` properties. Property
+ * names may be specified as individual arguments or as arrays of property
+ * names. If `predicate` is provided it's invoked for each property of `object`
+ * picking the properties `predicate` returns truthy for. The predicate is
+ * bound to `thisArg` and invoked with three arguments: (value, key, object).
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The source object.
+ * @param {Function|...(string|string[])} [predicate] The function invoked per
+ * iteration or property names to pick, specified as individual property
+ * names or arrays of property names.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * var object = { 'user': 'fred', 'age': 40 };
+ *
+ * _.pick(object, 'user');
+ * // => { 'user': 'fred' }
+ *
+ * _.pick(object, _.isString);
+ * // => { 'user': 'fred' }
+ */
+ var pick = restParam(function(object, props) {
+ if (object == null) {
+ return {};
+ }
+ return typeof props[0] == 'function'
+ ? pickByCallback(object, bindCallback(props[0], props[1], 3))
+ : pickByArray(object, baseFlatten(props));
+ });
+
+ /**
+ * This method is like `_.get` except that if the resolved value is a function
+ * it's invoked with the `this` binding of its parent object and its result
+ * is returned.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path of the property to resolve.
+ * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.
+ * @returns {*} Returns the resolved value.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
+ *
+ * _.result(object, 'a[0].b.c1');
+ * // => 3
+ *
+ * _.result(object, 'a[0].b.c2');
+ * // => 4
+ *
+ * _.result(object, 'a.b.c', 'default');
+ * // => 'default'
+ *
+ * _.result(object, 'a.b.c', _.constant('default'));
+ * // => 'default'
+ */
+ function result(object, path, defaultValue) {
+ var result = object == null ? undefined : object[path];
+ if (result === undefined) {
+ if (object != null && !isKey(path, object)) {
+ path = toPath(path);
+ object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
+ result = object == null ? undefined : object[last(path)];
+ }
+ result = result === undefined ? defaultValue : result;
+ }
+ return isFunction(result) ? result.call(object) : result;
+ }
+
+ /**
+ * Sets the property value of `path` on `object`. If a portion of `path`
+ * does not exist it's created.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to augment.
+ * @param {Array|string} path The path of the property to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+ *
+ * _.set(object, 'a[0].b.c', 4);
+ * console.log(object.a[0].b.c);
+ * // => 4
+ *
+ * _.set(object, 'x[0].y.z', 5);
+ * console.log(object.x[0].y.z);
+ * // => 5
+ */
+ function set(object, path, value) {
+ if (object == null) {
+ return object;
+ }
+ var pathKey = (path + '');
+ path = (object[pathKey] != null || isKey(path, object)) ? [pathKey] : toPath(path);
+
+ var index = -1,
+ length = path.length,
+ lastIndex = length - 1,
+ nested = object;
+
+ while (nested != null && ++index < length) {
+ var key = path[index];
+ if (isObject(nested)) {
+ if (index == lastIndex) {
+ nested[key] = value;
+ } else if (nested[key] == null) {
+ nested[key] = isIndex(path[index + 1]) ? [] : {};
+ }
+ }
+ nested = nested[key];
+ }
+ return object;
+ }
+
+ /**
+ * An alternative to `_.reduce`; this method transforms `object` to a new
+ * `accumulator` object which is the result of running each of its own enumerable
+ * properties through `iteratee`, with each invocation potentially mutating
+ * the `accumulator` object. The `iteratee` is bound to `thisArg` and invoked
+ * with four arguments: (accumulator, value, key, object). Iteratee functions
+ * may exit iteration early by explicitly returning `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Array|Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [accumulator] The custom accumulator value.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {*} Returns the accumulated value.
+ * @example
+ *
+ * _.transform([2, 3, 4], function(result, n) {
+ * result.push(n *= n);
+ * return n % 2 == 0;
+ * });
+ * // => [4, 9]
+ *
+ * _.transform({ 'a': 1, 'b': 2 }, function(result, n, key) {
+ * result[key] = n * 3;
+ * });
+ * // => { 'a': 3, 'b': 6 }
+ */
+ function transform(object, iteratee, accumulator, thisArg) {
+ var isArr = isArray(object) || isTypedArray(object);
+ iteratee = getCallback(iteratee, thisArg, 4);
+
+ if (accumulator == null) {
+ if (isArr || isObject(object)) {
+ var Ctor = object.constructor;
+ if (isArr) {
+ accumulator = isArray(object) ? new Ctor : [];
+ } else {
+ accumulator = baseCreate(isFunction(Ctor) ? Ctor.prototype : undefined);
+ }
+ } else {
+ accumulator = {};
+ }
+ }
+ (isArr ? arrayEach : baseForOwn)(object, function(value, index, object) {
+ return iteratee(accumulator, value, index, object);
+ });
+ return accumulator;
+ }
+
+ /**
+ * Creates an array of the own enumerable property values of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property values.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.values(new Foo);
+ * // => [1, 2] (iteration order is not guaranteed)
+ *
+ * _.values('hi');
+ * // => ['h', 'i']
+ */
+ function values(object) {
+ return baseValues(object, keys(object));
+ }
+
+ /**
+ * Creates an array of the own and inherited enumerable property values
+ * of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property values.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.valuesIn(new Foo);
+ * // => [1, 2, 3] (iteration order is not guaranteed)
+ */
+ function valuesIn(object) {
+ return baseValues(object, keysIn(object));
+ }
+
+ /*------------------------------------------------------------------------*/
+
+ /**
+ * Checks if `n` is between `start` and up to but not including, `end`. If
+ * `end` is not specified it's set to `start` with `start` then set to `0`.
+ *
+ * @static
+ * @memberOf _
+ * @category Number
+ * @param {number} n The number to check.
+ * @param {number} [start=0] The start of the range.
+ * @param {number} end The end of the range.
+ * @returns {boolean} Returns `true` if `n` is in the range, else `false`.
+ * @example
+ *
+ * _.inRange(3, 2, 4);
+ * // => true
+ *
+ * _.inRange(4, 8);
+ * // => true
+ *
+ * _.inRange(4, 2);
+ * // => false
+ *
+ * _.inRange(2, 2);
+ * // => false
+ *
+ * _.inRange(1.2, 2);
+ * // => true
+ *
+ * _.inRange(5.2, 4);
+ * // => false
+ */
+ function inRange(value, start, end) {
+ start = +start || 0;
+ if (end === undefined) {
+ end = start;
+ start = 0;
+ } else {
+ end = +end || 0;
+ }
+ return value >= nativeMin(start, end) && value < nativeMax(start, end);
+ }
+
+ /**
+ * Produces a random number between `min` and `max` (inclusive). If only one
+ * argument is provided a number between `0` and the given number is returned.
+ * If `floating` is `true`, or either `min` or `max` are floats, a floating-point
+ * number is returned instead of an integer.
+ *
+ * @static
+ * @memberOf _
+ * @category Number
+ * @param {number} [min=0] The minimum possible value.
+ * @param {number} [max=1] The maximum possible value.
+ * @param {boolean} [floating] Specify returning a floating-point number.
+ * @returns {number} Returns the random number.
+ * @example
+ *
+ * _.random(0, 5);
+ * // => an integer between 0 and 5
+ *
+ * _.random(5);
+ * // => also an integer between 0 and 5
+ *
+ * _.random(5, true);
+ * // => a floating-point number between 0 and 5
+ *
+ * _.random(1.2, 5.2);
+ * // => a floating-point number between 1.2 and 5.2
+ */
+ function random(min, max, floating) {
+ if (floating && isIterateeCall(min, max, floating)) {
+ max = floating = undefined;
+ }
+ var noMin = min == null,
+ noMax = max == null;
+
+ if (floating == null) {
+ if (noMax && typeof min == 'boolean') {
+ floating = min;
+ min = 1;
+ }
+ else if (typeof max == 'boolean') {
+ floating = max;
+ noMax = true;
+ }
+ }
+ if (noMin && noMax) {
+ max = 1;
+ noMax = false;
+ }
+ min = +min || 0;
+ if (noMax) {
+ max = min;
+ min = 0;
+ } else {
+ max = +max || 0;
+ }
+ if (floating || min % 1 || max % 1) {
+ var rand = nativeRandom();
+ return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand + '').length - 1)))), max);
+ }
+ return baseRandom(min, max);
+ }
+
+ /*------------------------------------------------------------------------*/
+
+ /**
+ * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the camel cased string.
+ * @example
+ *
+ * _.camelCase('Foo Bar');
+ * // => 'fooBar'
+ *
+ * _.camelCase('--foo-bar');
+ * // => 'fooBar'
+ *
+ * _.camelCase('__foo_bar__');
+ * // => 'fooBar'
+ */
+ var camelCase = createCompounder(function(result, word, index) {
+ word = word.toLowerCase();
+ return result + (index ? (word.charAt(0).toUpperCase() + word.slice(1)) : word);
+ });
+
+ /**
+ * Capitalizes the first character of `string`.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to capitalize.
+ * @returns {string} Returns the capitalized string.
+ * @example
+ *
+ * _.capitalize('fred');
+ * // => 'Fred'
+ */
+ function capitalize(string) {
+ string = baseToString(string);
+ return string && (string.charAt(0).toUpperCase() + string.slice(1));
+ }
+
+ /**
+ * Deburrs `string` by converting [latin-1 supplementary letters](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
+ * to basic latin letters and removing [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to deburr.
+ * @returns {string} Returns the deburred string.
+ * @example
+ *
+ * _.deburr('déjà vu');
+ * // => 'deja vu'
+ */
+ function deburr(string) {
+ string = baseToString(string);
+ return string && string.replace(reLatin1, deburrLetter).replace(reComboMark, '');
+ }
+
+ /**
+ * Checks if `string` ends with the given target string.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to search.
+ * @param {string} [target] The string to search for.
+ * @param {number} [position=string.length] The position to search from.
+ * @returns {boolean} Returns `true` if `string` ends with `target`, else `false`.
+ * @example
+ *
+ * _.endsWith('abc', 'c');
+ * // => true
+ *
+ * _.endsWith('abc', 'b');
+ * // => false
+ *
+ * _.endsWith('abc', 'b', 2);
+ * // => true
+ */
+ function endsWith(string, target, position) {
+ string = baseToString(string);
+ target = (target + '');
+
+ var length = string.length;
+ position = position === undefined
+ ? length
+ : nativeMin(position < 0 ? 0 : (+position || 0), length);
+
+ position -= target.length;
+ return position >= 0 && string.indexOf(target, position) == position;
+ }
+
+ /**
+ * Converts the characters "&", "<", ">", '"', "'", and "\`", in `string` to
+ * their corresponding HTML entities.
+ *
+ * **Note:** No other characters are escaped. To escape additional characters
+ * use a third-party library like [_he_](https://mths.be/he).
+ *
+ * Though the ">" character is escaped for symmetry, characters like
+ * ">" and "/" don't need escaping in HTML and have no special meaning
+ * unless they're part of a tag or unquoted attribute value.
+ * See [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
+ * (under "semi-related fun fact") for more details.
+ *
+ * Backticks are escaped because in Internet Explorer < 9, they can break out
+ * of attribute values or HTML comments. See [#59](https://html5sec.org/#59),
+ * [#102](https://html5sec.org/#102), [#108](https://html5sec.org/#108), and
+ * [#133](https://html5sec.org/#133) of the [HTML5 Security Cheatsheet](https://html5sec.org/)
+ * for more details.
+ *
+ * When working with HTML you should always [quote attribute values](http://wonko.com/post/html-escaping)
+ * to reduce XSS vectors.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to escape.
+ * @returns {string} Returns the escaped string.
+ * @example
+ *
+ * _.escape('fred, barney, & pebbles');
+ * // => 'fred, barney, &amp; pebbles'
+ */
+ function escape(string) {
+ // Reset `lastIndex` because in IE < 9 `String#replace` does not.
+ string = baseToString(string);
+ return (string && reHasUnescapedHtml.test(string))
+ ? string.replace(reUnescapedHtml, escapeHtmlChar)
+ : string;
+ }
+
+ /**
+ * Escapes the `RegExp` special characters "\", "/", "^", "$", ".", "|", "?",
+ * "*", "+", "(", ")", "[", "]", "{" and "}" in `string`.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to escape.
+ * @returns {string} Returns the escaped string.
+ * @example
+ *
+ * _.escapeRegExp('[lodash](https://lodash.com/)');
+ * // => '\[lodash\]\(https:\/\/lodash\.com\/\)'
+ */
+ function escapeRegExp(string) {
+ string = baseToString(string);
+ return (string && reHasRegExpChars.test(string))
+ ? string.replace(reRegExpChars, escapeRegExpChar)
+ : (string || '(?:)');
+ }
+
+ /**
+ * Converts `string` to [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the kebab cased string.
+ * @example
+ *
+ * _.kebabCase('Foo Bar');
+ * // => 'foo-bar'
+ *
+ * _.kebabCase('fooBar');
+ * // => 'foo-bar'
+ *
+ * _.kebabCase('__foo_bar__');
+ * // => 'foo-bar'
+ */
+ var kebabCase = createCompounder(function(result, word, index) {
+ return result + (index ? '-' : '') + word.toLowerCase();
+ });
+
+ /**
+ * Pads `string` on the left and right sides if it's shorter than `length`.
+ * Padding characters are truncated if they can't be evenly divided by `length`.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to pad.
+ * @param {number} [length=0] The padding length.
+ * @param {string} [chars=' '] The string used as padding.
+ * @returns {string} Returns the padded string.
+ * @example
+ *
+ * _.pad('abc', 8);
+ * // => ' abc '
+ *
+ * _.pad('abc', 8, '_-');
+ * // => '_-abc_-_'
+ *
+ * _.pad('abc', 3);
+ * // => 'abc'
+ */
+ function pad(string, length, chars) {
+ string = baseToString(string);
+ length = +length;
+
+ var strLength = string.length;
+ if (strLength >= length || !nativeIsFinite(length)) {
+ return string;
+ }
+ var mid = (length - strLength) / 2,
+ leftLength = nativeFloor(mid),
+ rightLength = nativeCeil(mid);
+
+ chars = createPadding('', rightLength, chars);
+ return chars.slice(0, leftLength) + string + chars;
+ }
+
+ /**
+ * Pads `string` on the left side if it's shorter than `length`. Padding
+ * characters are truncated if they exceed `length`.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to pad.
+ * @param {number} [length=0] The padding length.
+ * @param {string} [chars=' '] The string used as padding.
+ * @returns {string} Returns the padded string.
+ * @example
+ *
+ * _.padLeft('abc', 6);
+ * // => ' abc'
+ *
+ * _.padLeft('abc', 6, '_-');
+ * // => '_-_abc'
+ *
+ * _.padLeft('abc', 3);
+ * // => 'abc'
+ */
+ var padLeft = createPadDir();
+
+ /**
+ * Pads `string` on the right side if it's shorter than `length`. Padding
+ * characters are truncated if they exceed `length`.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to pad.
+ * @param {number} [length=0] The padding length.
+ * @param {string} [chars=' '] The string used as padding.
+ * @returns {string} Returns the padded string.
+ * @example
+ *
+ * _.padRight('abc', 6);
+ * // => 'abc '
+ *
+ * _.padRight('abc', 6, '_-');
+ * // => 'abc_-_'
+ *
+ * _.padRight('abc', 3);
+ * // => 'abc'
+ */
+ var padRight = createPadDir(true);
+
+ /**
+ * Converts `string` to an integer of the specified radix. If `radix` is
+ * `undefined` or `0`, a `radix` of `10` is used unless `value` is a hexadecimal,
+ * in which case a `radix` of `16` is used.
+ *
+ * **Note:** This method aligns with the [ES5 implementation](https://es5.github.io/#E)
+ * of `parseInt`.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} string The string to convert.
+ * @param {number} [radix] The radix to interpret `value` by.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {number} Returns the converted integer.
+ * @example
+ *
+ * _.parseInt('08');
+ * // => 8
+ *
+ * _.map(['6', '08', '10'], _.parseInt);
+ * // => [6, 8, 10]
+ */
+ function parseInt(string, radix, guard) {
+ // Firefox < 21 and Opera < 15 follow ES3 for `parseInt`.
+ // Chrome fails to trim leading <BOM> whitespace characters.
+ // See https://code.google.com/p/v8/issues/detail?id=3109 for more details.
+ if (guard ? isIterateeCall(string, radix, guard) : radix == null) {
+ radix = 0;
+ } else if (radix) {
+ radix = +radix;
+ }
+ string = trim(string);
+ return nativeParseInt(string, radix || (reHasHexPrefix.test(string) ? 16 : 10));
+ }
+
+ /**
+ * Repeats the given string `n` times.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to repeat.
+ * @param {number} [n=0] The number of times to repeat the string.
+ * @returns {string} Returns the repeated string.
+ * @example
+ *
+ * _.repeat('*', 3);
+ * // => '***'
+ *
+ * _.repeat('abc', 2);
+ * // => 'abcabc'
+ *
+ * _.repeat('abc', 0);
+ * // => ''
+ */
+ function repeat(string, n) {
+ var result = '';
+ string = baseToString(string);
+ n = +n;
+ if (n < 1 || !string || !nativeIsFinite(n)) {
+ return result;
+ }
+ // Leverage the exponentiation by squaring algorithm for a faster repeat.
+ // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
+ do {
+ if (n % 2) {
+ result += string;
+ }
+ n = nativeFloor(n / 2);
+ string += string;
+ } while (n);
+
+ return result;
+ }
+
+ /**
+ * Converts `string` to [snake case](https://en.wikipedia.org/wiki/Snake_case).
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the snake cased string.
+ * @example
+ *
+ * _.snakeCase('Foo Bar');
+ * // => 'foo_bar'
+ *
+ * _.snakeCase('fooBar');
+ * // => 'foo_bar'
+ *
+ * _.snakeCase('--foo-bar');
+ * // => 'foo_bar'
+ */
+ var snakeCase = createCompounder(function(result, word, index) {
+ return result + (index ? '_' : '') + word.toLowerCase();
+ });
+
+ /**
+ * Converts `string` to [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the start cased string.
+ * @example
+ *
+ * _.startCase('--foo-bar');
+ * // => 'Foo Bar'
+ *
+ * _.startCase('fooBar');
+ * // => 'Foo Bar'
+ *
+ * _.startCase('__foo_bar__');
+ * // => 'Foo Bar'
+ */
+ var startCase = createCompounder(function(result, word, index) {
+ return result + (index ? ' ' : '') + (word.charAt(0).toUpperCase() + word.slice(1));
+ });
+
+ /**
+ * Checks if `string` starts with the given target string.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to search.
+ * @param {string} [target] The string to search for.
+ * @param {number} [position=0] The position to search from.
+ * @returns {boolean} Returns `true` if `string` starts with `target`, else `false`.
+ * @example
+ *
+ * _.startsWith('abc', 'a');
+ * // => true
+ *
+ * _.startsWith('abc', 'b');
+ * // => false
+ *
+ * _.startsWith('abc', 'b', 1);
+ * // => true
+ */
+ function startsWith(string, target, position) {
+ string = baseToString(string);
+ position = position == null
+ ? 0
+ : nativeMin(position < 0 ? 0 : (+position || 0), string.length);
+
+ return string.lastIndexOf(target, position) == position;
+ }
+
+ /**
+ * Creates a compiled template function that can interpolate data properties
+ * in "interpolate" delimiters, HTML-escape interpolated data properties in
+ * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
+ * properties may be accessed as free variables in the template. If a setting
+ * object is provided it takes precedence over `_.templateSettings` values.
+ *
+ * **Note:** In the development build `_.template` utilizes
+ * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
+ * for easier debugging.
+ *
+ * For more information on precompiling templates see
+ * [lodash's custom builds documentation](https://lodash.com/custom-builds).
+ *
+ * For more information on Chrome extension sandboxes see
+ * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The template string.
+ * @param {Object} [options] The options object.
+ * @param {RegExp} [options.escape] The HTML "escape" delimiter.
+ * @param {RegExp} [options.evaluate] The "evaluate" delimiter.
+ * @param {Object} [options.imports] An object to import into the template as free variables.
+ * @param {RegExp} [options.interpolate] The "interpolate" delimiter.
+ * @param {string} [options.sourceURL] The sourceURL of the template's compiled source.
+ * @param {string} [options.variable] The data object variable name.
+ * @param- {Object} [otherOptions] Enables the legacy `options` param signature.
+ * @returns {Function} Returns the compiled template function.
+ * @example
+ *
+ * // using the "interpolate" delimiter to create a compiled template
+ * var compiled = _.template('hello <%= user %>!');
+ * compiled({ 'user': 'fred' });
+ * // => 'hello fred!'
+ *
+ * // using the HTML "escape" delimiter to escape data property values
+ * var compiled = _.template('<b><%- value %></b>');
+ * compiled({ 'value': '<script>' });
+ * // => '<b>&lt;script&gt;</b>'
+ *
+ * // using the "evaluate" delimiter to execute JavaScript and generate HTML
+ * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
+ * compiled({ 'users': ['fred', 'barney'] });
+ * // => '<li>fred</li><li>barney</li>'
+ *
+ * // using the internal `print` function in "evaluate" delimiters
+ * var compiled = _.template('<% print("hello " + user); %>!');
+ * compiled({ 'user': 'barney' });
+ * // => 'hello barney!'
+ *
+ * // using the ES delimiter as an alternative to the default "interpolate" delimiter
+ * var compiled = _.template('hello ${ user }!');
+ * compiled({ 'user': 'pebbles' });
+ * // => 'hello pebbles!'
+ *
+ * // using custom template delimiters
+ * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
+ * var compiled = _.template('hello {{ user }}!');
+ * compiled({ 'user': 'mustache' });
+ * // => 'hello mustache!'
+ *
+ * // using backslashes to treat delimiters as plain text
+ * var compiled = _.template('<%= "\\<%- value %\\>" %>');
+ * compiled({ 'value': 'ignored' });
+ * // => '<%- value %>'
+ *
+ * // using the `imports` option to import `jQuery` as `jq`
+ * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
+ * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
+ * compiled({ 'users': ['fred', 'barney'] });
+ * // => '<li>fred</li><li>barney</li>'
+ *
+ * // using the `sourceURL` option to specify a custom sourceURL for the template
+ * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
+ * compiled(data);
+ * // => find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector
+ *
+ * // using the `variable` option to ensure a with-statement isn't used in the compiled template
+ * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
+ * compiled.source;
+ * // => function(data) {
+ * // var __t, __p = '';
+ * // __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
+ * // return __p;
+ * // }
+ *
+ * // using the `source` property to inline compiled templates for meaningful
+ * // line numbers in error messages and a stack trace
+ * fs.writeFileSync(path.join(cwd, 'jst.js'), '\
+ * var JST = {\
+ * "main": ' + _.template(mainText).source + '\
+ * };\
+ * ');
+ */
+ function template(string, options, otherOptions) {
+ // Based on John Resig's `tmpl` implementation (http://ejohn.org/blog/javascript-micro-templating/)
+ // and Laura Doktorova's doT.js (https://github.com/olado/doT).
+ var settings = lodash.templateSettings;
+
+ if (otherOptions && isIterateeCall(string, options, otherOptions)) {
+ options = otherOptions = undefined;
+ }
+ string = baseToString(string);
+ options = assignWith(baseAssign({}, otherOptions || options), settings, assignOwnDefaults);
+
+ var imports = assignWith(baseAssign({}, options.imports), settings.imports, assignOwnDefaults),
+ importsKeys = keys(imports),
+ importsValues = baseValues(imports, importsKeys);
+
+ var isEscaping,
+ isEvaluating,
+ index = 0,
+ interpolate = options.interpolate || reNoMatch,
+ source = "__p += '";
+
+ // Compile the regexp to match each delimiter.
+ var reDelimiters = RegExp(
+ (options.escape || reNoMatch).source + '|' +
+ interpolate.source + '|' +
+ (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
+ (options.evaluate || reNoMatch).source + '|$'
+ , 'g');
+
+ // Use a sourceURL for easier debugging.
+ var sourceURL = '//# sourceURL=' +
+ ('sourceURL' in options
+ ? options.sourceURL
+ : ('lodash.templateSources[' + (++templateCounter) + ']')
+ ) + '\n';
+
+ string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
+ interpolateValue || (interpolateValue = esTemplateValue);
+
+ // Escape characters that can't be included in string literals.
+ source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
+
+ // Replace delimiters with snippets.
+ if (escapeValue) {
+ isEscaping = true;
+ source += "' +\n__e(" + escapeValue + ") +\n'";
+ }
+ if (evaluateValue) {
+ isEvaluating = true;
+ source += "';\n" + evaluateValue + ";\n__p += '";
+ }
+ if (interpolateValue) {
+ source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
+ }
+ index = offset + match.length;
+
+ // The JS engine embedded in Adobe products requires returning the `match`
+ // string in order to produce the correct `offset` value.
+ return match;
+ });
+
+ source += "';\n";
+
+ // If `variable` is not specified wrap a with-statement around the generated
+ // code to add the data object to the top of the scope chain.
+ var variable = options.variable;
+ if (!variable) {
+ source = 'with (obj) {\n' + source + '\n}\n';
+ }
+ // Cleanup code by stripping empty strings.
+ source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
+ .replace(reEmptyStringMiddle, '$1')
+ .replace(reEmptyStringTrailing, '$1;');
+
+ // Frame code as the function body.
+ source = 'function(' + (variable || 'obj') + ') {\n' +
+ (variable
+ ? ''
+ : 'obj || (obj = {});\n'
+ ) +
+ "var __t, __p = ''" +
+ (isEscaping
+ ? ', __e = _.escape'
+ : ''
+ ) +
+ (isEvaluating
+ ? ', __j = Array.prototype.join;\n' +
+ "function print() { __p += __j.call(arguments, '') }\n"
+ : ';\n'
+ ) +
+ source +
+ 'return __p\n}';
+
+ var result = attempt(function() {
+ return Function(importsKeys, sourceURL + 'return ' + source).apply(undefined, importsValues);
+ });
+
+ // Provide the compiled function's source by its `toString` method or
+ // the `source` property as a convenience for inlining compiled templates.
+ result.source = source;
+ if (isError(result)) {
+ throw result;
+ }
+ return result;
+ }
+
+ /**
+ * Removes leading and trailing whitespace or specified characters from `string`.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to trim.
+ * @param {string} [chars=whitespace] The characters to trim.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {string} Returns the trimmed string.
+ * @example
+ *
+ * _.trim(' abc ');
+ * // => 'abc'
+ *
+ * _.trim('-_-abc-_-', '_-');
+ * // => 'abc'
+ *
+ * _.map([' foo ', ' bar '], _.trim);
+ * // => ['foo', 'bar']
+ */
+ function trim(string, chars, guard) {
+ var value = string;
+ string = baseToString(string);
+ if (!string) {
+ return string;
+ }
+ if (guard ? isIterateeCall(value, chars, guard) : chars == null) {
+ return string.slice(trimmedLeftIndex(string), trimmedRightIndex(string) + 1);
+ }
+ chars = (chars + '');
+ return string.slice(charsLeftIndex(string, chars), charsRightIndex(string, chars) + 1);
+ }
+
+ /**
+ * Removes leading whitespace or specified characters from `string`.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to trim.
+ * @param {string} [chars=whitespace] The characters to trim.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {string} Returns the trimmed string.
+ * @example
+ *
+ * _.trimLeft(' abc ');
+ * // => 'abc '
+ *
+ * _.trimLeft('-_-abc-_-', '_-');
+ * // => 'abc-_-'
+ */
+ function trimLeft(string, chars, guard) {
+ var value = string;
+ string = baseToString(string);
+ if (!string) {
+ return string;
+ }
+ if (guard ? isIterateeCall(value, chars, guard) : chars == null) {
+ return string.slice(trimmedLeftIndex(string));
+ }
+ return string.slice(charsLeftIndex(string, (chars + '')));
+ }
+
+ /**
+ * Removes trailing whitespace or specified characters from `string`.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to trim.
+ * @param {string} [chars=whitespace] The characters to trim.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {string} Returns the trimmed string.
+ * @example
+ *
+ * _.trimRight(' abc ');
+ * // => ' abc'
+ *
+ * _.trimRight('-_-abc-_-', '_-');
+ * // => '-_-abc'
+ */
+ function trimRight(string, chars, guard) {
+ var value = string;
+ string = baseToString(string);
+ if (!string) {
+ return string;
+ }
+ if (guard ? isIterateeCall(value, chars, guard) : chars == null) {
+ return string.slice(0, trimmedRightIndex(string) + 1);
+ }
+ return string.slice(0, charsRightIndex(string, (chars + '')) + 1);
+ }
+
+ /**
+ * Truncates `string` if it's longer than the given maximum string length.
+ * The last characters of the truncated string are replaced with the omission
+ * string which defaults to "...".
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to truncate.
+ * @param {Object|number} [options] The options object or maximum string length.
+ * @param {number} [options.length=30] The maximum string length.
+ * @param {string} [options.omission='...'] The string to indicate text is omitted.
+ * @param {RegExp|string} [options.separator] The separator pattern to truncate to.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {string} Returns the truncated string.
+ * @example
+ *
+ * _.trunc('hi-diddly-ho there, neighborino');
+ * // => 'hi-diddly-ho there, neighbo...'
+ *
+ * _.trunc('hi-diddly-ho there, neighborino', 24);
+ * // => 'hi-diddly-ho there, n...'
+ *
+ * _.trunc('hi-diddly-ho there, neighborino', {
+ * 'length': 24,
+ * 'separator': ' '
+ * });
+ * // => 'hi-diddly-ho there,...'
+ *
+ * _.trunc('hi-diddly-ho there, neighborino', {
+ * 'length': 24,
+ * 'separator': /,? +/
+ * });
+ * // => 'hi-diddly-ho there...'
+ *
+ * _.trunc('hi-diddly-ho there, neighborino', {
+ * 'omission': ' [...]'
+ * });
+ * // => 'hi-diddly-ho there, neig [...]'
+ */
+ function trunc(string, options, guard) {
+ if (guard && isIterateeCall(string, options, guard)) {
+ options = undefined;
+ }
+ var length = DEFAULT_TRUNC_LENGTH,
+ omission = DEFAULT_TRUNC_OMISSION;
+
+ if (options != null) {
+ if (isObject(options)) {
+ var separator = 'separator' in options ? options.separator : separator;
+ length = 'length' in options ? (+options.length || 0) : length;
+ omission = 'omission' in options ? baseToString(options.omission) : omission;
+ } else {
+ length = +options || 0;
+ }
+ }
+ string = baseToString(string);
+ if (length >= string.length) {
+ return string;
+ }
+ var end = length - omission.length;
+ if (end < 1) {
+ return omission;
+ }
+ var result = string.slice(0, end);
+ if (separator == null) {
+ return result + omission;
+ }
+ if (isRegExp(separator)) {
+ if (string.slice(end).search(separator)) {
+ var match,
+ newEnd,
+ substring = string.slice(0, end);
+
+ if (!separator.global) {
+ separator = RegExp(separator.source, (reFlags.exec(separator) || '') + 'g');
+ }
+ separator.lastIndex = 0;
+ while ((match = separator.exec(substring))) {
+ newEnd = match.index;
+ }
+ result = result.slice(0, newEnd == null ? end : newEnd);
+ }
+ } else if (string.indexOf(separator, end) != end) {
+ var index = result.lastIndexOf(separator);
+ if (index > -1) {
+ result = result.slice(0, index);
+ }
+ }
+ return result + omission;
+ }
+
+ /**
+ * The inverse of `_.escape`; this method converts the HTML entities
+ * `&amp;`, `&lt;`, `&gt;`, `&quot;`, `&#39;`, and `&#96;` in `string` to their
+ * corresponding characters.
+ *
+ * **Note:** No other HTML entities are unescaped. To unescape additional HTML
+ * entities use a third-party library like [_he_](https://mths.be/he).
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to unescape.
+ * @returns {string} Returns the unescaped string.
+ * @example
+ *
+ * _.unescape('fred, barney, &amp; pebbles');
+ * // => 'fred, barney, & pebbles'
+ */
+ function unescape(string) {
+ string = baseToString(string);
+ return (string && reHasEscapedHtml.test(string))
+ ? string.replace(reEscapedHtml, unescapeHtmlChar)
+ : string;
+ }
+
+ /**
+ * Splits `string` into an array of its words.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to inspect.
+ * @param {RegExp|string} [pattern] The pattern to match words.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Array} Returns the words of `string`.
+ * @example
+ *
+ * _.words('fred, barney, & pebbles');
+ * // => ['fred', 'barney', 'pebbles']
+ *
+ * _.words('fred, barney, & pebbles', /[^, ]+/g);
+ * // => ['fred', 'barney', '&', 'pebbles']
+ */
+ function words(string, pattern, guard) {
+ if (guard && isIterateeCall(string, pattern, guard)) {
+ pattern = undefined;
+ }
+ string = baseToString(string);
+ return string.match(pattern || reWords) || [];
+ }
+
+ /*------------------------------------------------------------------------*/
+
+ /**
+ * Attempts to invoke `func`, returning either the result or the caught error
+ * object. Any additional arguments are provided to `func` when it's invoked.
+ *
+ * @static
+ * @memberOf _
+ * @category Utility
+ * @param {Function} func The function to attempt.
+ * @returns {*} Returns the `func` result or error object.
+ * @example
+ *
+ * // avoid throwing errors for invalid selectors
+ * var elements = _.attempt(function(selector) {
+ * return document.querySelectorAll(selector);
+ * }, '>_>');
+ *
+ * if (_.isError(elements)) {
+ * elements = [];
+ * }
+ */
+ var attempt = restParam(function(func, args) {
+ try {
+ return func.apply(undefined, args);
+ } catch(e) {
+ return isError(e) ? e : new Error(e);
+ }
+ });
+
+ /**
+ * Creates a function that invokes `func` with the `this` binding of `thisArg`
+ * and arguments of the created function. If `func` is a property name the
+ * created callback returns the property value for a given element. If `func`
+ * is an object the created callback returns `true` for elements that contain
+ * the equivalent object properties, otherwise it returns `false`.
+ *
+ * @static
+ * @memberOf _
+ * @alias iteratee
+ * @category Utility
+ * @param {*} [func=_.identity] The value to convert to a callback.
+ * @param {*} [thisArg] The `this` binding of `func`.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Function} Returns the callback.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36 },
+ * { 'user': 'fred', 'age': 40 }
+ * ];
+ *
+ * // wrap to create custom callback shorthands
+ * _.callback = _.wrap(_.callback, function(callback, func, thisArg) {
+ * var match = /^(.+?)__([gl]t)(.+)$/.exec(func);
+ * if (!match) {
+ * return callback(func, thisArg);
+ * }
+ * return function(object) {
+ * return match[2] == 'gt'
+ * ? object[match[1]] > match[3]
+ * : object[match[1]] < match[3];
+ * };
+ * });
+ *
+ * _.filter(users, 'age__gt36');
+ * // => [{ 'user': 'fred', 'age': 40 }]
+ */
+ function callback(func, thisArg, guard) {
+ if (guard && isIterateeCall(func, thisArg, guard)) {
+ thisArg = undefined;
+ }
+ return isObjectLike(func)
+ ? matches(func)
+ : baseCallback(func, thisArg);
+ }
+
+ /**
+ * Creates a function that returns `value`.
+ *
+ * @static
+ * @memberOf _
+ * @category Utility
+ * @param {*} value The value to return from the new function.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var object = { 'user': 'fred' };
+ * var getter = _.constant(object);
+ *
+ * getter() === object;
+ * // => true
+ */
+ function constant(value) {
+ return function() {
+ return value;
+ };
+ }
+
+ /**
+ * This method returns the first argument provided to it.
+ *
+ * @static
+ * @memberOf _
+ * @category Utility
+ * @param {*} value Any value.
+ * @returns {*} Returns `value`.
+ * @example
+ *
+ * var object = { 'user': 'fred' };
+ *
+ * _.identity(object) === object;
+ * // => true
+ */
+ function identity(value) {
+ return value;
+ }
+
+ /**
+ * Creates a function that performs a deep comparison between a given object
+ * and `source`, returning `true` if the given object has equivalent property
+ * values, else `false`.
+ *
+ * **Note:** This method supports comparing arrays, booleans, `Date` objects,
+ * numbers, `Object` objects, regexes, and strings. Objects are compared by
+ * their own, not inherited, enumerable properties. For comparing a single
+ * own or inherited property value see `_.matchesProperty`.
+ *
+ * @static
+ * @memberOf _
+ * @category Utility
+ * @param {Object} source The object of property values to match.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': true },
+ * { 'user': 'fred', 'age': 40, 'active': false }
+ * ];
+ *
+ * _.filter(users, _.matches({ 'age': 40, 'active': false }));
+ * // => [{ 'user': 'fred', 'age': 40, 'active': false }]
+ */
+ function matches(source) {
+ return baseMatches(baseClone(source, true));
+ }
+
+ /**
+ * Creates a function that compares the property value of `path` on a given
+ * object to `value`.
+ *
+ * **Note:** This method supports comparing arrays, booleans, `Date` objects,
+ * numbers, `Object` objects, regexes, and strings. Objects are compared by
+ * their own, not inherited, enumerable properties.
+ *
+ * @static
+ * @memberOf _
+ * @category Utility
+ * @param {Array|string} path The path of the property to get.
+ * @param {*} srcValue The value to match.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney' },
+ * { 'user': 'fred' }
+ * ];
+ *
+ * _.find(users, _.matchesProperty('user', 'fred'));
+ * // => { 'user': 'fred' }
+ */
+ function matchesProperty(path, srcValue) {
+ return baseMatchesProperty(path, baseClone(srcValue, true));
+ }
+
+ /**
+ * Creates a function that invokes the method at `path` on a given object.
+ * Any additional arguments are provided to the invoked method.
+ *
+ * @static
+ * @memberOf _
+ * @category Utility
+ * @param {Array|string} path The path of the method to invoke.
+ * @param {...*} [args] The arguments to invoke the method with.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var objects = [
+ * { 'a': { 'b': { 'c': _.constant(2) } } },
+ * { 'a': { 'b': { 'c': _.constant(1) } } }
+ * ];
+ *
+ * _.map(objects, _.method('a.b.c'));
+ * // => [2, 1]
+ *
+ * _.invoke(_.sortBy(objects, _.method(['a', 'b', 'c'])), 'a.b.c');
+ * // => [1, 2]
+ */
+ var method = restParam(function(path, args) {
+ return function(object) {
+ return invokePath(object, path, args);
+ };
+ });
+
+ /**
+ * The opposite of `_.method`; this method creates a function that invokes
+ * the method at a given path on `object`. Any additional arguments are
+ * provided to the invoked method.
+ *
+ * @static
+ * @memberOf _
+ * @category Utility
+ * @param {Object} object The object to query.
+ * @param {...*} [args] The arguments to invoke the method with.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var array = _.times(3, _.constant),
+ * object = { 'a': array, 'b': array, 'c': array };
+ *
+ * _.map(['a[2]', 'c[0]'], _.methodOf(object));
+ * // => [2, 0]
+ *
+ * _.map([['a', '2'], ['c', '0']], _.methodOf(object));
+ * // => [2, 0]
+ */
+ var methodOf = restParam(function(object, args) {
+ return function(path) {
+ return invokePath(object, path, args);
+ };
+ });
+
+ /**
+ * Adds all own enumerable function properties of a source object to the
+ * destination object. If `object` is a function then methods are added to
+ * its prototype as well.
+ *
+ * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
+ * avoid conflicts caused by modifying the original.
+ *
+ * @static
+ * @memberOf _
+ * @category Utility
+ * @param {Function|Object} [object=lodash] The destination object.
+ * @param {Object} source The object of functions to add.
+ * @param {Object} [options] The options object.
+ * @param {boolean} [options.chain=true] Specify whether the functions added
+ * are chainable.
+ * @returns {Function|Object} Returns `object`.
+ * @example
+ *
+ * function vowels(string) {
+ * return _.filter(string, function(v) {
+ * return /[aeiou]/i.test(v);
+ * });
+ * }
+ *
+ * _.mixin({ 'vowels': vowels });
+ * _.vowels('fred');
+ * // => ['e']
+ *
+ * _('fred').vowels().value();
+ * // => ['e']
+ *
+ * _.mixin({ 'vowels': vowels }, { 'chain': false });
+ * _('fred').vowels();
+ * // => ['e']
+ */
+ function mixin(object, source, options) {
+ if (options == null) {
+ var isObj = isObject(source),
+ props = isObj ? keys(source) : undefined,
+ methodNames = (props && props.length) ? baseFunctions(source, props) : undefined;
+
+ if (!(methodNames ? methodNames.length : isObj)) {
+ methodNames = false;
+ options = source;
+ source = object;
+ object = this;
+ }
+ }
+ if (!methodNames) {
+ methodNames = baseFunctions(source, keys(source));
+ }
+ var chain = true,
+ index = -1,
+ isFunc = isFunction(object),
+ length = methodNames.length;
+
+ if (options === false) {
+ chain = false;
+ } else if (isObject(options) && 'chain' in options) {
+ chain = options.chain;
+ }
+ while (++index < length) {
+ var methodName = methodNames[index],
+ func = source[methodName];
+
+ object[methodName] = func;
+ if (isFunc) {
+ object.prototype[methodName] = (function(func) {
+ return function() {
+ var chainAll = this.__chain__;
+ if (chain || chainAll) {
+ var result = object(this.__wrapped__),
+ actions = result.__actions__ = arrayCopy(this.__actions__);
+
+ actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
+ result.__chain__ = chainAll;
+ return result;
+ }
+ return func.apply(object, arrayPush([this.value()], arguments));
+ };
+ }(func));
+ }
+ }
+ return object;
+ }
+
+ /**
+ * Reverts the `_` variable to its previous value and returns a reference to
+ * the `lodash` function.
+ *
+ * @static
+ * @memberOf _
+ * @category Utility
+ * @returns {Function} Returns the `lodash` function.
+ * @example
+ *
+ * var lodash = _.noConflict();
+ */
+ function noConflict() {
+ root._ = oldDash;
+ return this;
+ }
+
+ /**
+ * A no-operation function that returns `undefined` regardless of the
+ * arguments it receives.
+ *
+ * @static
+ * @memberOf _
+ * @category Utility
+ * @example
+ *
+ * var object = { 'user': 'fred' };
+ *
+ * _.noop(object) === undefined;
+ * // => true
+ */
+ function noop() {
+ // No operation performed.
+ }
+
+ /**
+ * Creates a function that returns the property value at `path` on a
+ * given object.
+ *
+ * @static
+ * @memberOf _
+ * @category Utility
+ * @param {Array|string} path The path of the property to get.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var objects = [
+ * { 'a': { 'b': { 'c': 2 } } },
+ * { 'a': { 'b': { 'c': 1 } } }
+ * ];
+ *
+ * _.map(objects, _.property('a.b.c'));
+ * // => [2, 1]
+ *
+ * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c');
+ * // => [1, 2]
+ */
+ function property(path) {
+ return isKey(path) ? baseProperty(path) : basePropertyDeep(path);
+ }
+
+ /**
+ * The opposite of `_.property`; this method creates a function that returns
+ * the property value at a given path on `object`.
+ *
+ * @static
+ * @memberOf _
+ * @category Utility
+ * @param {Object} object The object to query.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var array = [0, 1, 2],
+ * object = { 'a': array, 'b': array, 'c': array };
+ *
+ * _.map(['a[2]', 'c[0]'], _.propertyOf(object));
+ * // => [2, 0]
+ *
+ * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
+ * // => [2, 0]
+ */
+ function propertyOf(object) {
+ return function(path) {
+ return baseGet(object, toPath(path), (path + ''));
+ };
+ }
+
+ /**
+ * Creates an array of numbers (positive and/or negative) progressing from
+ * `start` up to, but not including, `end`. If `end` is not specified it's
+ * set to `start` with `start` then set to `0`. If `end` is less than `start`
+ * a zero-length range is created unless a negative `step` is specified.
+ *
+ * @static
+ * @memberOf _
+ * @category Utility
+ * @param {number} [start=0] The start of the range.
+ * @param {number} end The end of the range.
+ * @param {number} [step=1] The value to increment or decrement by.
+ * @returns {Array} Returns the new array of numbers.
+ * @example
+ *
+ * _.range(4);
+ * // => [0, 1, 2, 3]
+ *
+ * _.range(1, 5);
+ * // => [1, 2, 3, 4]
+ *
+ * _.range(0, 20, 5);
+ * // => [0, 5, 10, 15]
+ *
+ * _.range(0, -4, -1);
+ * // => [0, -1, -2, -3]
+ *
+ * _.range(1, 4, 0);
+ * // => [1, 1, 1]
+ *
+ * _.range(0);
+ * // => []
+ */
+ function range(start, end, step) {
+ if (step && isIterateeCall(start, end, step)) {
+ end = step = undefined;
+ }
+ start = +start || 0;
+ step = step == null ? 1 : (+step || 0);
+
+ if (end == null) {
+ end = start;
+ start = 0;
+ } else {
+ end = +end || 0;
+ }
+ // Use `Array(length)` so engines like Chakra and V8 avoid slower modes.
+ // See https://youtu.be/XAqIpGU8ZZk#t=17m25s for more details.
+ var index = -1,
+ length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
+ result = Array(length);
+
+ while (++index < length) {
+ result[index] = start;
+ start += step;
+ }
+ return result;
+ }
+
+ /**
+ * Invokes the iteratee function `n` times, returning an array of the results
+ * of each invocation. The `iteratee` is bound to `thisArg` and invoked with
+ * one argument; (index).
+ *
+ * @static
+ * @memberOf _
+ * @category Utility
+ * @param {number} n The number of times to invoke `iteratee`.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Array} Returns the array of results.
+ * @example
+ *
+ * var diceRolls = _.times(3, _.partial(_.random, 1, 6, false));
+ * // => [3, 6, 4]
+ *
+ * _.times(3, function(n) {
+ * mage.castSpell(n);
+ * });
+ * // => invokes `mage.castSpell(n)` three times with `n` of `0`, `1`, and `2`
+ *
+ * _.times(3, function(n) {
+ * this.cast(n);
+ * }, mage);
+ * // => also invokes `mage.castSpell(n)` three times
+ */
+ function times(n, iteratee, thisArg) {
+ n = nativeFloor(n);
+
+ // Exit early to avoid a JSC JIT bug in Safari 8
+ // where `Array(0)` is treated as `Array(1)`.
+ if (n < 1 || !nativeIsFinite(n)) {
+ return [];
+ }
+ var index = -1,
+ result = Array(nativeMin(n, MAX_ARRAY_LENGTH));
+
+ iteratee = bindCallback(iteratee, thisArg, 1);
+ while (++index < n) {
+ if (index < MAX_ARRAY_LENGTH) {
+ result[index] = iteratee(index);
+ } else {
+ iteratee(index);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Generates a unique ID. If `prefix` is provided the ID is appended to it.
+ *
+ * @static
+ * @memberOf _
+ * @category Utility
+ * @param {string} [prefix] The value to prefix the ID with.
+ * @returns {string} Returns the unique ID.
+ * @example
+ *
+ * _.uniqueId('contact_');
+ * // => 'contact_104'
+ *
+ * _.uniqueId();
+ * // => '105'
+ */
+ function uniqueId(prefix) {
+ var id = ++idCounter;
+ return baseToString(prefix) + id;
+ }
+
+ /*------------------------------------------------------------------------*/
+
+ /**
+ * Adds two numbers.
+ *
+ * @static
+ * @memberOf _
+ * @category Math
+ * @param {number} augend The first number to add.
+ * @param {number} addend The second number to add.
+ * @returns {number} Returns the sum.
+ * @example
+ *
+ * _.add(6, 4);
+ * // => 10
+ */
+ function add(augend, addend) {
+ return (+augend || 0) + (+addend || 0);
+ }
+
+ /**
+ * Calculates `n` rounded up to `precision`.
+ *
+ * @static
+ * @memberOf _
+ * @category Math
+ * @param {number} n The number to round up.
+ * @param {number} [precision=0] The precision to round up to.
+ * @returns {number} Returns the rounded up number.
+ * @example
+ *
+ * _.ceil(4.006);
+ * // => 5
+ *
+ * _.ceil(6.004, 2);
+ * // => 6.01
+ *
+ * _.ceil(6040, -2);
+ * // => 6100
+ */
+ var ceil = createRound('ceil');
+
+ /**
+ * Calculates `n` rounded down to `precision`.
+ *
+ * @static
+ * @memberOf _
+ * @category Math
+ * @param {number} n The number to round down.
+ * @param {number} [precision=0] The precision to round down to.
+ * @returns {number} Returns the rounded down number.
+ * @example
+ *
+ * _.floor(4.006);
+ * // => 4
+ *
+ * _.floor(0.046, 2);
+ * // => 0.04
+ *
+ * _.floor(4060, -2);
+ * // => 4000
+ */
+ var floor = createRound('floor');
+
+ /**
+ * Gets the maximum value of `collection`. If `collection` is empty or falsey
+ * `-Infinity` is returned. If an iteratee function is provided it's invoked
+ * for each value in `collection` to generate the criterion by which the value
+ * is ranked. The `iteratee` is bound to `thisArg` and invoked with three
+ * arguments: (value, index, collection).
+ *
+ * If a property name is provided for `iteratee` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `iteratee` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Math
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [iteratee] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {*} Returns the maximum value.
+ * @example
+ *
+ * _.max([4, 2, 8, 6]);
+ * // => 8
+ *
+ * _.max([]);
+ * // => -Infinity
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36 },
+ * { 'user': 'fred', 'age': 40 }
+ * ];
+ *
+ * _.max(users, function(chr) {
+ * return chr.age;
+ * });
+ * // => { 'user': 'fred', 'age': 40 }
+ *
+ * // using the `_.property` callback shorthand
+ * _.max(users, 'age');
+ * // => { 'user': 'fred', 'age': 40 }
+ */
+ var max = createExtremum(gt, NEGATIVE_INFINITY);
+
+ /**
+ * Gets the minimum value of `collection`. If `collection` is empty or falsey
+ * `Infinity` is returned. If an iteratee function is provided it's invoked
+ * for each value in `collection` to generate the criterion by which the value
+ * is ranked. The `iteratee` is bound to `thisArg` and invoked with three
+ * arguments: (value, index, collection).
+ *
+ * If a property name is provided for `iteratee` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `iteratee` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Math
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [iteratee] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {*} Returns the minimum value.
+ * @example
+ *
+ * _.min([4, 2, 8, 6]);
+ * // => 2
+ *
+ * _.min([]);
+ * // => Infinity
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36 },
+ * { 'user': 'fred', 'age': 40 }
+ * ];
+ *
+ * _.min(users, function(chr) {
+ * return chr.age;
+ * });
+ * // => { 'user': 'barney', 'age': 36 }
+ *
+ * // using the `_.property` callback shorthand
+ * _.min(users, 'age');
+ * // => { 'user': 'barney', 'age': 36 }
+ */
+ var min = createExtremum(lt, POSITIVE_INFINITY);
+
+ /**
+ * Calculates `n` rounded to `precision`.
+ *
+ * @static
+ * @memberOf _
+ * @category Math
+ * @param {number} n The number to round.
+ * @param {number} [precision=0] The precision to round to.
+ * @returns {number} Returns the rounded number.
+ * @example
+ *
+ * _.round(4.006);
+ * // => 4
+ *
+ * _.round(4.006, 2);
+ * // => 4.01
+ *
+ * _.round(4060, -2);
+ * // => 4100
+ */
+ var round = createRound('round');
+
+ /**
+ * Gets the sum of the values in `collection`.
+ *
+ * @static
+ * @memberOf _
+ * @category Math
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [iteratee] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {number} Returns the sum.
+ * @example
+ *
+ * _.sum([4, 6]);
+ * // => 10
+ *
+ * _.sum({ 'a': 4, 'b': 6 });
+ * // => 10
+ *
+ * var objects = [
+ * { 'n': 4 },
+ * { 'n': 6 }
+ * ];
+ *
+ * _.sum(objects, function(object) {
+ * return object.n;
+ * });
+ * // => 10
+ *
+ * // using the `_.property` callback shorthand
+ * _.sum(objects, 'n');
+ * // => 10
+ */
+ function sum(collection, iteratee, thisArg) {
+ if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
+ iteratee = undefined;
+ }
+ iteratee = getCallback(iteratee, thisArg, 3);
+ return iteratee.length == 1
+ ? arraySum(isArray(collection) ? collection : toIterable(collection), iteratee)
+ : baseSum(collection, iteratee);
+ }
+
+ /*------------------------------------------------------------------------*/
+
+ // Ensure wrappers are instances of `baseLodash`.
+ lodash.prototype = baseLodash.prototype;
+
+ LodashWrapper.prototype = baseCreate(baseLodash.prototype);
+ LodashWrapper.prototype.constructor = LodashWrapper;
+
+ LazyWrapper.prototype = baseCreate(baseLodash.prototype);
+ LazyWrapper.prototype.constructor = LazyWrapper;
+
+ // Add functions to the `Map` cache.
+ MapCache.prototype['delete'] = mapDelete;
+ MapCache.prototype.get = mapGet;
+ MapCache.prototype.has = mapHas;
+ MapCache.prototype.set = mapSet;
+
+ // Add functions to the `Set` cache.
+ SetCache.prototype.push = cachePush;
+
+ // Assign cache to `_.memoize`.
+ memoize.Cache = MapCache;
+
+ // Add functions that return wrapped values when chaining.
+ lodash.after = after;
+ lodash.ary = ary;
+ lodash.assign = assign;
+ lodash.at = at;
+ lodash.before = before;
+ lodash.bind = bind;
+ lodash.bindAll = bindAll;
+ lodash.bindKey = bindKey;
+ lodash.callback = callback;
+ lodash.chain = chain;
+ lodash.chunk = chunk;
+ lodash.compact = compact;
+ lodash.constant = constant;
+ lodash.countBy = countBy;
+ lodash.create = create;
+ lodash.curry = curry;
+ lodash.curryRight = curryRight;
+ lodash.debounce = debounce;
+ lodash.defaults = defaults;
+ lodash.defaultsDeep = defaultsDeep;
+ lodash.defer = defer;
+ lodash.delay = delay;
+ lodash.difference = difference;
+ lodash.drop = drop;
+ lodash.dropRight = dropRight;
+ lodash.dropRightWhile = dropRightWhile;
+ lodash.dropWhile = dropWhile;
+ lodash.fill = fill;
+ lodash.filter = filter;
+ lodash.flatten = flatten;
+ lodash.flattenDeep = flattenDeep;
+ lodash.flow = flow;
+ lodash.flowRight = flowRight;
+ lodash.forEach = forEach;
+ lodash.forEachRight = forEachRight;
+ lodash.forIn = forIn;
+ lodash.forInRight = forInRight;
+ lodash.forOwn = forOwn;
+ lodash.forOwnRight = forOwnRight;
+ lodash.functions = functions;
+ lodash.groupBy = groupBy;
+ lodash.indexBy = indexBy;
+ lodash.initial = initial;
+ lodash.intersection = intersection;
+ lodash.invert = invert;
+ lodash.invoke = invoke;
+ lodash.keys = keys;
+ lodash.keysIn = keysIn;
+ lodash.map = map;
+ lodash.mapKeys = mapKeys;
+ lodash.mapValues = mapValues;
+ lodash.matches = matches;
+ lodash.matchesProperty = matchesProperty;
+ lodash.memoize = memoize;
+ lodash.merge = merge;
+ lodash.method = method;
+ lodash.methodOf = methodOf;
+ lodash.mixin = mixin;
+ lodash.modArgs = modArgs;
+ lodash.negate = negate;
+ lodash.omit = omit;
+ lodash.once = once;
+ lodash.pairs = pairs;
+ lodash.partial = partial;
+ lodash.partialRight = partialRight;
+ lodash.partition = partition;
+ lodash.pick = pick;
+ lodash.pluck = pluck;
+ lodash.property = property;
+ lodash.propertyOf = propertyOf;
+ lodash.pull = pull;
+ lodash.pullAt = pullAt;
+ lodash.range = range;
+ lodash.rearg = rearg;
+ lodash.reject = reject;
+ lodash.remove = remove;
+ lodash.rest = rest;
+ lodash.restParam = restParam;
+ lodash.set = set;
+ lodash.shuffle = shuffle;
+ lodash.slice = slice;
+ lodash.sortBy = sortBy;
+ lodash.sortByAll = sortByAll;
+ lodash.sortByOrder = sortByOrder;
+ lodash.spread = spread;
+ lodash.take = take;
+ lodash.takeRight = takeRight;
+ lodash.takeRightWhile = takeRightWhile;
+ lodash.takeWhile = takeWhile;
+ lodash.tap = tap;
+ lodash.throttle = throttle;
+ lodash.thru = thru;
+ lodash.times = times;
+ lodash.toArray = toArray;
+ lodash.toPlainObject = toPlainObject;
+ lodash.transform = transform;
+ lodash.union = union;
+ lodash.uniq = uniq;
+ lodash.unzip = unzip;
+ lodash.unzipWith = unzipWith;
+ lodash.values = values;
+ lodash.valuesIn = valuesIn;
+ lodash.where = where;
+ lodash.without = without;
+ lodash.wrap = wrap;
+ lodash.xor = xor;
+ lodash.zip = zip;
+ lodash.zipObject = zipObject;
+ lodash.zipWith = zipWith;
+
+ // Add aliases.
+ lodash.backflow = flowRight;
+ lodash.collect = map;
+ lodash.compose = flowRight;
+ lodash.each = forEach;
+ lodash.eachRight = forEachRight;
+ lodash.extend = assign;
+ lodash.iteratee = callback;
+ lodash.methods = functions;
+ lodash.object = zipObject;
+ lodash.select = filter;
+ lodash.tail = rest;
+ lodash.unique = uniq;
+
+ // Add functions to `lodash.prototype`.
+ mixin(lodash, lodash);
+
+ /*------------------------------------------------------------------------*/
+
+ // Add functions that return unwrapped values when chaining.
+ lodash.add = add;
+ lodash.attempt = attempt;
+ lodash.camelCase = camelCase;
+ lodash.capitalize = capitalize;
+ lodash.ceil = ceil;
+ lodash.clone = clone;
+ lodash.cloneDeep = cloneDeep;
+ lodash.deburr = deburr;
+ lodash.endsWith = endsWith;
+ lodash.escape = escape;
+ lodash.escapeRegExp = escapeRegExp;
+ lodash.every = every;
+ lodash.find = find;
+ lodash.findIndex = findIndex;
+ lodash.findKey = findKey;
+ lodash.findLast = findLast;
+ lodash.findLastIndex = findLastIndex;
+ lodash.findLastKey = findLastKey;
+ lodash.findWhere = findWhere;
+ lodash.first = first;
+ lodash.floor = floor;
+ lodash.get = get;
+ lodash.gt = gt;
+ lodash.gte = gte;
+ lodash.has = has;
+ lodash.identity = identity;
+ lodash.includes = includes;
+ lodash.indexOf = indexOf;
+ lodash.inRange = inRange;
+ lodash.isArguments = isArguments;
+ lodash.isArray = isArray;
+ lodash.isBoolean = isBoolean;
+ lodash.isDate = isDate;
+ lodash.isElement = isElement;
+ lodash.isEmpty = isEmpty;
+ lodash.isEqual = isEqual;
+ lodash.isError = isError;
+ lodash.isFinite = isFinite;
+ lodash.isFunction = isFunction;
+ lodash.isMatch = isMatch;
+ lodash.isNaN = isNaN;
+ lodash.isNative = isNative;
+ lodash.isNull = isNull;
+ lodash.isNumber = isNumber;
+ lodash.isObject = isObject;
+ lodash.isPlainObject = isPlainObject;
+ lodash.isRegExp = isRegExp;
+ lodash.isString = isString;
+ lodash.isTypedArray = isTypedArray;
+ lodash.isUndefined = isUndefined;
+ lodash.kebabCase = kebabCase;
+ lodash.last = last;
+ lodash.lastIndexOf = lastIndexOf;
+ lodash.lt = lt;
+ lodash.lte = lte;
+ lodash.max = max;
+ lodash.min = min;
+ lodash.noConflict = noConflict;
+ lodash.noop = noop;
+ lodash.now = now;
+ lodash.pad = pad;
+ lodash.padLeft = padLeft;
+ lodash.padRight = padRight;
+ lodash.parseInt = parseInt;
+ lodash.random = random;
+ lodash.reduce = reduce;
+ lodash.reduceRight = reduceRight;
+ lodash.repeat = repeat;
+ lodash.result = result;
+ lodash.round = round;
+ lodash.runInContext = runInContext;
+ lodash.size = size;
+ lodash.snakeCase = snakeCase;
+ lodash.some = some;
+ lodash.sortedIndex = sortedIndex;
+ lodash.sortedLastIndex = sortedLastIndex;
+ lodash.startCase = startCase;
+ lodash.startsWith = startsWith;
+ lodash.sum = sum;
+ lodash.template = template;
+ lodash.trim = trim;
+ lodash.trimLeft = trimLeft;
+ lodash.trimRight = trimRight;
+ lodash.trunc = trunc;
+ lodash.unescape = unescape;
+ lodash.uniqueId = uniqueId;
+ lodash.words = words;
+
+ // Add aliases.
+ lodash.all = every;
+ lodash.any = some;
+ lodash.contains = includes;
+ lodash.eq = isEqual;
+ lodash.detect = find;
+ lodash.foldl = reduce;
+ lodash.foldr = reduceRight;
+ lodash.head = first;
+ lodash.include = includes;
+ lodash.inject = reduce;
+
+ mixin(lodash, (function() {
+ var source = {};
+ baseForOwn(lodash, function(func, methodName) {
+ if (!lodash.prototype[methodName]) {
+ source[methodName] = func;
+ }
+ });
+ return source;
+ }()), false);
+
+ /*------------------------------------------------------------------------*/
+
+ // Add functions capable of returning wrapped and unwrapped values when chaining.
+ lodash.sample = sample;
+
+ lodash.prototype.sample = function(n) {
+ if (!this.__chain__ && n == null) {
+ return sample(this.value());
+ }
+ return this.thru(function(value) {
+ return sample(value, n);
+ });
+ };
+
+ /*------------------------------------------------------------------------*/
+
+ /**
+ * The semantic version number.
+ *
+ * @static
+ * @memberOf _
+ * @type string
+ */
+ lodash.VERSION = VERSION;
+
+ // Assign default placeholders.
+ arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {
+ lodash[methodName].placeholder = lodash;
+ });
+
+ // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
+ arrayEach(['drop', 'take'], function(methodName, index) {
+ LazyWrapper.prototype[methodName] = function(n) {
+ var filtered = this.__filtered__;
+ if (filtered && !index) {
+ return new LazyWrapper(this);
+ }
+ n = n == null ? 1 : nativeMax(nativeFloor(n) || 0, 0);
+
+ var result = this.clone();
+ if (filtered) {
+ result.__takeCount__ = nativeMin(result.__takeCount__, n);
+ } else {
+ result.__views__.push({ 'size': n, 'type': methodName + (result.__dir__ < 0 ? 'Right' : '') });
+ }
+ return result;
+ };
+
+ LazyWrapper.prototype[methodName + 'Right'] = function(n) {
+ return this.reverse()[methodName](n).reverse();
+ };
+ });
+
+ // Add `LazyWrapper` methods that accept an `iteratee` value.
+ arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {
+ var type = index + 1,
+ isFilter = type != LAZY_MAP_FLAG;
+
+ LazyWrapper.prototype[methodName] = function(iteratee, thisArg) {
+ var result = this.clone();
+ result.__iteratees__.push({ 'iteratee': getCallback(iteratee, thisArg, 1), 'type': type });
+ result.__filtered__ = result.__filtered__ || isFilter;
+ return result;
+ };
+ });
+
+ // Add `LazyWrapper` methods for `_.first` and `_.last`.
+ arrayEach(['first', 'last'], function(methodName, index) {
+ var takeName = 'take' + (index ? 'Right' : '');
+
+ LazyWrapper.prototype[methodName] = function() {
+ return this[takeName](1).value()[0];
+ };
+ });
+
+ // Add `LazyWrapper` methods for `_.initial` and `_.rest`.
+ arrayEach(['initial', 'rest'], function(methodName, index) {
+ var dropName = 'drop' + (index ? '' : 'Right');
+
+ LazyWrapper.prototype[methodName] = function() {
+ return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
+ };
+ });
+
+ // Add `LazyWrapper` methods for `_.pluck` and `_.where`.
+ arrayEach(['pluck', 'where'], function(methodName, index) {
+ var operationName = index ? 'filter' : 'map',
+ createCallback = index ? baseMatches : property;
+
+ LazyWrapper.prototype[methodName] = function(value) {
+ return this[operationName](createCallback(value));
+ };
+ });
+
+ LazyWrapper.prototype.compact = function() {
+ return this.filter(identity);
+ };
+
+ LazyWrapper.prototype.reject = function(predicate, thisArg) {
+ predicate = getCallback(predicate, thisArg, 1);
+ return this.filter(function(value) {
+ return !predicate(value);
+ });
+ };
+
+ LazyWrapper.prototype.slice = function(start, end) {
+ start = start == null ? 0 : (+start || 0);
+
+ var result = this;
+ if (result.__filtered__ && (start > 0 || end < 0)) {
+ return new LazyWrapper(result);
+ }
+ if (start < 0) {
+ result = result.takeRight(-start);
+ } else if (start) {
+ result = result.drop(start);
+ }
+ if (end !== undefined) {
+ end = (+end || 0);
+ result = end < 0 ? result.dropRight(-end) : result.take(end - start);
+ }
+ return result;
+ };
+
+ LazyWrapper.prototype.takeRightWhile = function(predicate, thisArg) {
+ return this.reverse().takeWhile(predicate, thisArg).reverse();
+ };
+
+ LazyWrapper.prototype.toArray = function() {
+ return this.take(POSITIVE_INFINITY);
+ };
+
+ // Add `LazyWrapper` methods to `lodash.prototype`.
+ baseForOwn(LazyWrapper.prototype, function(func, methodName) {
+ var checkIteratee = /^(?:filter|map|reject)|While$/.test(methodName),
+ retUnwrapped = /^(?:first|last)$/.test(methodName),
+ lodashFunc = lodash[retUnwrapped ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName];
+
+ if (!lodashFunc) {
+ return;
+ }
+ lodash.prototype[methodName] = function() {
+ var args = retUnwrapped ? [1] : arguments,
+ chainAll = this.__chain__,
+ value = this.__wrapped__,
+ isHybrid = !!this.__actions__.length,
+ isLazy = value instanceof LazyWrapper,
+ iteratee = args[0],
+ useLazy = isLazy || isArray(value);
+
+ if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
+ // Avoid lazy use if the iteratee has a "length" value other than `1`.
+ isLazy = useLazy = false;
+ }
+ var interceptor = function(value) {
+ return (retUnwrapped && chainAll)
+ ? lodashFunc(value, 1)[0]
+ : lodashFunc.apply(undefined, arrayPush([value], args));
+ };
+
+ var action = { 'func': thru, 'args': [interceptor], 'thisArg': undefined },
+ onlyLazy = isLazy && !isHybrid;
+
+ if (retUnwrapped && !chainAll) {
+ if (onlyLazy) {
+ value = value.clone();
+ value.__actions__.push(action);
+ return func.call(value);
+ }
+ return lodashFunc.call(undefined, this.value())[0];
+ }
+ if (!retUnwrapped && useLazy) {
+ value = onlyLazy ? value : new LazyWrapper(this);
+ var result = func.apply(value, args);
+ result.__actions__.push(action);
+ return new LodashWrapper(result, chainAll);
+ }
+ return this.thru(interceptor);
+ };
+ });
+
+ // Add `Array` and `String` methods to `lodash.prototype`.
+ arrayEach(['join', 'pop', 'push', 'replace', 'shift', 'sort', 'splice', 'split', 'unshift'], function(methodName) {
+ var func = (/^(?:replace|split)$/.test(methodName) ? stringProto : arrayProto)[methodName],
+ chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
+ retUnwrapped = /^(?:join|pop|replace|shift)$/.test(methodName);
+
+ lodash.prototype[methodName] = function() {
+ var args = arguments;
+ if (retUnwrapped && !this.__chain__) {
+ return func.apply(this.value(), args);
+ }
+ return this[chainName](function(value) {
+ return func.apply(value, args);
+ });
+ };
+ });
+
+ // Map minified function names to their real names.
+ baseForOwn(LazyWrapper.prototype, function(func, methodName) {
+ var lodashFunc = lodash[methodName];
+ if (lodashFunc) {
+ var key = (lodashFunc.name + ''),
+ names = realNames[key] || (realNames[key] = []);
+
+ names.push({ 'name': methodName, 'func': lodashFunc });
+ }
+ });
+
+ realNames[createHybridWrapper(undefined, BIND_KEY_FLAG).name] = [{ 'name': 'wrapper', 'func': undefined }];
+
+ // Add functions to the lazy wrapper.
+ LazyWrapper.prototype.clone = lazyClone;
+ LazyWrapper.prototype.reverse = lazyReverse;
+ LazyWrapper.prototype.value = lazyValue;
+
+ // Add chaining functions to the `lodash` wrapper.
+ lodash.prototype.chain = wrapperChain;
+ lodash.prototype.commit = wrapperCommit;
+ lodash.prototype.concat = wrapperConcat;
+ lodash.prototype.plant = wrapperPlant;
+ lodash.prototype.reverse = wrapperReverse;
+ lodash.prototype.toString = wrapperToString;
+ lodash.prototype.run = lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
+
+ // Add function aliases to the `lodash` wrapper.
+ lodash.prototype.collect = lodash.prototype.map;
+ lodash.prototype.head = lodash.prototype.first;
+ lodash.prototype.select = lodash.prototype.filter;
+ lodash.prototype.tail = lodash.prototype.rest;
+
+ return lodash;
+ }
+
+ /*--------------------------------------------------------------------------*/
+
+ // Export lodash.
+ var _ = runInContext();
+
+ // Some AMD build optimizers like r.js check for condition patterns like the following:
+ if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
+ // Expose lodash to the global object when an AMD loader is present to avoid
+ // errors in cases where lodash is loaded by a script tag and not intended
+ // as an AMD module. See http://requirejs.org/docs/errors.html#mismatch for
+ // more details.
+ root._ = _;
+
+ // Define as an anonymous module so, through path mapping, it can be
+ // referenced as the "underscore" module.
+ define(function() {
+ return _;
+ });
+ }
+ // Check for `exports` after `define` in case a build optimizer adds an `exports` object.
+ else if (freeExports && freeModule) {
+ // Export for Node.js or RingoJS.
+ if (moduleExports) {
+ (freeModule.exports = _)._ = _;
+ }
+ // Export for Rhino with CommonJS support.
+ else {
+ freeExports._ = _;
+ }
+ }
+ else {
+ // Export for a browser or Rhino.
+ root._ = _;
+ }
+}.call(this));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/lodash/lodash.min.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/lodash/lodash.min.js
new file mode 100644
index 00000000000..e6c9820b224
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/lodash/lodash.min.js
@@ -0,0 +1,98 @@
+/**
+ * @license
+ * lodash 3.10.1 (Custom Build) lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE
+ * Build: `lodash modern -o ./lodash.js`
+ */
+;(function(){function n(n,t){if(n!==t){var r=null===n,e=n===w,u=n===n,o=null===t,i=t===w,f=t===t;if(n>t&&!o||!u||r&&!i&&f||e&&f)return 1;if(n<t&&!r||!f||o&&!e&&u||i&&u)return-1}return 0}function t(n,t,r){for(var e=n.length,u=r?e:-1;r?u--:++u<e;)if(t(n[u],u,n))return u;return-1}function r(n,t,r){if(t!==t)return p(n,r);r-=1;for(var e=n.length;++r<e;)if(n[r]===t)return r;return-1}function e(n){return typeof n=="function"||false}function u(n){return null==n?"":n+""}function o(n,t){for(var r=-1,e=n.length;++r<e&&-1<t.indexOf(n.charAt(r)););
+return r}function i(n,t){for(var r=n.length;r--&&-1<t.indexOf(n.charAt(r)););return r}function f(t,r){return n(t.a,r.a)||t.b-r.b}function a(n){return Nn[n]}function c(n){return Tn[n]}function l(n,t,r){return t?n=Bn[n]:r&&(n=Dn[n]),"\\"+n}function s(n){return"\\"+Dn[n]}function p(n,t,r){var e=n.length;for(t+=r?0:-1;r?t--:++t<e;){var u=n[t];if(u!==u)return t}return-1}function h(n){return!!n&&typeof n=="object"}function _(n){return 160>=n&&9<=n&&13>=n||32==n||160==n||5760==n||6158==n||8192<=n&&(8202>=n||8232==n||8233==n||8239==n||8287==n||12288==n||65279==n);
+}function v(n,t){for(var r=-1,e=n.length,u=-1,o=[];++r<e;)n[r]===t&&(n[r]=z,o[++u]=r);return o}function g(n){for(var t=-1,r=n.length;++t<r&&_(n.charCodeAt(t)););return t}function y(n){for(var t=n.length;t--&&_(n.charCodeAt(t)););return t}function d(n){return Ln[n]}function m(_){function Nn(n){if(h(n)&&!(Oo(n)||n instanceof zn)){if(n instanceof Ln)return n;if(nu.call(n,"__chain__")&&nu.call(n,"__wrapped__"))return Mr(n)}return new Ln(n)}function Tn(){}function Ln(n,t,r){this.__wrapped__=n,this.__actions__=r||[],
+this.__chain__=!!t}function zn(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=false,this.__iteratees__=[],this.__takeCount__=Ru,this.__views__=[]}function Bn(){this.__data__={}}function Dn(n){var t=n?n.length:0;for(this.data={hash:gu(null),set:new lu};t--;)this.push(n[t])}function Mn(n,t){var r=n.data;return(typeof t=="string"||ge(t)?r.set.has(t):r.hash[t])?0:-1}function qn(n,t){var r=-1,e=n.length;for(t||(t=Be(e));++r<e;)t[r]=n[r];return t}function Pn(n,t){for(var r=-1,e=n.length;++r<e&&false!==t(n[r],r,n););
+return n}function Kn(n,t){for(var r=-1,e=n.length;++r<e;)if(!t(n[r],r,n))return false;return true}function Vn(n,t){for(var r=-1,e=n.length,u=-1,o=[];++r<e;){var i=n[r];t(i,r,n)&&(o[++u]=i)}return o}function Gn(n,t){for(var r=-1,e=n.length,u=Be(e);++r<e;)u[r]=t(n[r],r,n);return u}function Jn(n,t){for(var r=-1,e=t.length,u=n.length;++r<e;)n[u+r]=t[r];return n}function Xn(n,t,r,e){var u=-1,o=n.length;for(e&&o&&(r=n[++u]);++u<o;)r=t(r,n[u],u,n);return r}function Hn(n,t){for(var r=-1,e=n.length;++r<e;)if(t(n[r],r,n))return true;
+return false}function Qn(n,t,r,e){return n!==w&&nu.call(e,r)?n:t}function nt(n,t,r){for(var e=-1,u=zo(t),o=u.length;++e<o;){var i=u[e],f=n[i],a=r(f,t[i],i,n,t);(a===a?a===f:f!==f)&&(f!==w||i in n)||(n[i]=a)}return n}function tt(n,t){return null==t?n:et(t,zo(t),n)}function rt(n,t){for(var r=-1,e=null==n,u=!e&&Er(n),o=u?n.length:0,i=t.length,f=Be(i);++r<i;){var a=t[r];f[r]=u?Cr(a,o)?n[a]:w:e?w:n[a]}return f}function et(n,t,r){r||(r={});for(var e=-1,u=t.length;++e<u;){var o=t[e];r[o]=n[o]}return r}function ut(n,t,r){
+var e=typeof n;return"function"==e?t===w?n:Bt(n,t,r):null==n?Fe:"object"==e?bt(n):t===w?ze(n):xt(n,t)}function ot(n,t,r,e,u,o,i){var f;if(r&&(f=u?r(n,e,u):r(n)),f!==w)return f;if(!ge(n))return n;if(e=Oo(n)){if(f=kr(n),!t)return qn(n,f)}else{var a=ru.call(n),c=a==K;if(a!=Z&&a!=B&&(!c||u))return Fn[a]?Rr(n,a,t):u?n:{};if(f=Ir(c?{}:n),!t)return tt(f,n)}for(o||(o=[]),i||(i=[]),u=o.length;u--;)if(o[u]==n)return i[u];return o.push(n),i.push(f),(e?Pn:_t)(n,function(e,u){f[u]=ot(e,t,r,u,n,o,i)}),f}function it(n,t,r){
+if(typeof n!="function")throw new Ge(L);return su(function(){n.apply(w,r)},t)}function ft(n,t){var e=n?n.length:0,u=[];if(!e)return u;var o=-1,i=xr(),f=i===r,a=f&&t.length>=F&&gu&&lu?new Dn(t):null,c=t.length;a&&(i=Mn,f=false,t=a);n:for(;++o<e;)if(a=n[o],f&&a===a){for(var l=c;l--;)if(t[l]===a)continue n;u.push(a)}else 0>i(t,a,0)&&u.push(a);return u}function at(n,t){var r=true;return Su(n,function(n,e,u){return r=!!t(n,e,u)}),r}function ct(n,t,r,e){var u=e,o=u;return Su(n,function(n,i,f){i=+t(n,i,f),(r(i,u)||i===e&&i===o)&&(u=i,
+o=n)}),o}function lt(n,t){var r=[];return Su(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function st(n,t,r,e){var u;return r(n,function(n,r,o){return t(n,r,o)?(u=e?r:n,false):void 0}),u}function pt(n,t,r,e){e||(e=[]);for(var u=-1,o=n.length;++u<o;){var i=n[u];h(i)&&Er(i)&&(r||Oo(i)||pe(i))?t?pt(i,t,r,e):Jn(e,i):r||(e[e.length]=i)}return e}function ht(n,t){Nu(n,t,Re)}function _t(n,t){return Nu(n,t,zo)}function vt(n,t){return Tu(n,t,zo)}function gt(n,t){for(var r=-1,e=t.length,u=-1,o=[];++r<e;){var i=t[r];
+ve(n[i])&&(o[++u]=i)}return o}function yt(n,t,r){if(null!=n){r!==w&&r in Br(n)&&(t=[r]),r=0;for(var e=t.length;null!=n&&r<e;)n=n[t[r++]];return r&&r==e?n:w}}function dt(n,t,r,e,u,o){if(n===t)n=true;else if(null==n||null==t||!ge(n)&&!h(t))n=n!==n&&t!==t;else n:{var i=dt,f=Oo(n),a=Oo(t),c=D,l=D;f||(c=ru.call(n),c==B?c=Z:c!=Z&&(f=xe(n))),a||(l=ru.call(t),l==B?l=Z:l!=Z&&xe(t));var s=c==Z,a=l==Z,l=c==l;if(!l||f||s){if(!e&&(c=s&&nu.call(n,"__wrapped__"),a=a&&nu.call(t,"__wrapped__"),c||a)){n=i(c?n.value():n,a?t.value():t,r,e,u,o);
+break n}if(l){for(u||(u=[]),o||(o=[]),c=u.length;c--;)if(u[c]==n){n=o[c]==t;break n}u.push(n),o.push(t),n=(f?yr:mr)(n,t,i,r,e,u,o),u.pop(),o.pop()}else n=false}else n=dr(n,t,c)}return n}function mt(n,t,r){var e=t.length,u=e,o=!r;if(null==n)return!u;for(n=Br(n);e--;){var i=t[e];if(o&&i[2]?i[1]!==n[i[0]]:!(i[0]in n))return false}for(;++e<u;){var i=t[e],f=i[0],a=n[f],c=i[1];if(o&&i[2]){if(a===w&&!(f in n))return false}else if(i=r?r(a,c,f):w,i===w?!dt(c,a,r,true):!i)return false}return true}function wt(n,t){var r=-1,e=Er(n)?Be(n.length):[];
+return Su(n,function(n,u,o){e[++r]=t(n,u,o)}),e}function bt(n){var t=Ar(n);if(1==t.length&&t[0][2]){var r=t[0][0],e=t[0][1];return function(n){return null==n?false:n[r]===e&&(e!==w||r in Br(n))}}return function(n){return mt(n,t)}}function xt(n,t){var r=Oo(n),e=Wr(n)&&t===t&&!ge(t),u=n+"";return n=Dr(n),function(o){if(null==o)return false;var i=u;if(o=Br(o),!(!r&&e||i in o)){if(o=1==n.length?o:yt(o,Et(n,0,-1)),null==o)return false;i=Zr(n),o=Br(o)}return o[i]===t?t!==w||i in o:dt(t,o[i],w,true)}}function At(n,t,r,e,u){
+if(!ge(n))return n;var o=Er(t)&&(Oo(t)||xe(t)),i=o?w:zo(t);return Pn(i||t,function(f,a){if(i&&(a=f,f=t[a]),h(f)){e||(e=[]),u||(u=[]);n:{for(var c=a,l=e,s=u,p=l.length,_=t[c];p--;)if(l[p]==_){n[c]=s[p];break n}var p=n[c],v=r?r(p,_,c,n,t):w,g=v===w;g&&(v=_,Er(_)&&(Oo(_)||xe(_))?v=Oo(p)?p:Er(p)?qn(p):[]:me(_)||pe(_)?v=pe(p)?ke(p):me(p)?p:{}:g=false),l.push(_),s.push(v),g?n[c]=At(v,_,r,l,s):(v===v?v!==p:p===p)&&(n[c]=v)}}else c=n[a],l=r?r(c,f,a,n,t):w,(s=l===w)&&(l=f),l===w&&(!o||a in n)||!s&&(l===l?l===c:c!==c)||(n[a]=l);
+}),n}function jt(n){return function(t){return null==t?w:t[n]}}function kt(n){var t=n+"";return n=Dr(n),function(r){return yt(r,n,t)}}function It(n,t){for(var r=n?t.length:0;r--;){var e=t[r];if(e!=u&&Cr(e)){var u=e;pu.call(n,e,1)}}}function Rt(n,t){return n+yu(ku()*(t-n+1))}function Ot(n,t,r,e,u){return u(n,function(n,u,o){r=e?(e=false,n):t(r,n,u,o)}),r}function Et(n,t,r){var e=-1,u=n.length;for(t=null==t?0:+t||0,0>t&&(t=-t>u?0:u+t),r=r===w||r>u?u:+r||0,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Be(u);++e<u;)r[e]=n[e+t];
+return r}function Ct(n,t){var r;return Su(n,function(n,e,u){return r=t(n,e,u),!r}),!!r}function Ut(n,t){var r=n.length;for(n.sort(t);r--;)n[r]=n[r].c;return n}function Wt(t,r,e){var u=wr(),o=-1;return r=Gn(r,function(n){return u(n)}),t=wt(t,function(n){return{a:Gn(r,function(t){return t(n)}),b:++o,c:n}}),Ut(t,function(t,r){var u;n:{for(var o=-1,i=t.a,f=r.a,a=i.length,c=e.length;++o<a;)if(u=n(i[o],f[o])){if(o>=c)break n;o=e[o],u*="asc"===o||true===o?1:-1;break n}u=t.b-r.b}return u})}function $t(n,t){
+var r=0;return Su(n,function(n,e,u){r+=+t(n,e,u)||0}),r}function St(n,t){var e=-1,u=xr(),o=n.length,i=u===r,f=i&&o>=F,a=f&&gu&&lu?new Dn(void 0):null,c=[];a?(u=Mn,i=false):(f=false,a=t?[]:c);n:for(;++e<o;){var l=n[e],s=t?t(l,e,n):l;if(i&&l===l){for(var p=a.length;p--;)if(a[p]===s)continue n;t&&a.push(s),c.push(l)}else 0>u(a,s,0)&&((t||f)&&a.push(s),c.push(l))}return c}function Ft(n,t){for(var r=-1,e=t.length,u=Be(e);++r<e;)u[r]=n[t[r]];return u}function Nt(n,t,r,e){for(var u=n.length,o=e?u:-1;(e?o--:++o<u)&&t(n[o],o,n););
+return r?Et(n,e?0:o,e?o+1:u):Et(n,e?o+1:0,e?u:o)}function Tt(n,t){var r=n;r instanceof zn&&(r=r.value());for(var e=-1,u=t.length;++e<u;)var o=t[e],r=o.func.apply(o.thisArg,Jn([r],o.args));return r}function Lt(n,t,r){var e=0,u=n?n.length:e;if(typeof t=="number"&&t===t&&u<=Eu){for(;e<u;){var o=e+u>>>1,i=n[o];(r?i<=t:i<t)&&null!==i?e=o+1:u=o}return u}return zt(n,t,Fe,r)}function zt(n,t,r,e){t=r(t);for(var u=0,o=n?n.length:0,i=t!==t,f=null===t,a=t===w;u<o;){var c=yu((u+o)/2),l=r(n[c]),s=l!==w,p=l===l;
+(i?p||e:f?p&&s&&(e||null!=l):a?p&&(e||s):null==l?0:e?l<=t:l<t)?u=c+1:o=c}return xu(o,Ou)}function Bt(n,t,r){if(typeof n!="function")return Fe;if(t===w)return n;switch(r){case 1:return function(r){return n.call(t,r)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,o){return n.call(t,r,e,u,o)};case 5:return function(r,e,u,o,i){return n.call(t,r,e,u,o,i)}}return function(){return n.apply(t,arguments)}}function Dt(n){var t=new ou(n.byteLength);return new hu(t).set(new hu(n)),
+t}function Mt(n,t,r){for(var e=r.length,u=-1,o=bu(n.length-e,0),i=-1,f=t.length,a=Be(f+o);++i<f;)a[i]=t[i];for(;++u<e;)a[r[u]]=n[u];for(;o--;)a[i++]=n[u++];return a}function qt(n,t,r){for(var e=-1,u=r.length,o=-1,i=bu(n.length-u,0),f=-1,a=t.length,c=Be(i+a);++o<i;)c[o]=n[o];for(i=o;++f<a;)c[i+f]=t[f];for(;++e<u;)c[i+r[e]]=n[o++];return c}function Pt(n,t){return function(r,e,u){var o=t?t():{};if(e=wr(e,u,3),Oo(r)){u=-1;for(var i=r.length;++u<i;){var f=r[u];n(o,f,e(f,u,r),r)}}else Su(r,function(t,r,u){
+n(o,t,e(t,r,u),u)});return o}}function Kt(n){return le(function(t,r){var e=-1,u=null==t?0:r.length,o=2<u?r[u-2]:w,i=2<u?r[2]:w,f=1<u?r[u-1]:w;for(typeof o=="function"?(o=Bt(o,f,5),u-=2):(o=typeof f=="function"?f:w,u-=o?1:0),i&&Ur(r[0],r[1],i)&&(o=3>u?w:o,u=1);++e<u;)(i=r[e])&&n(t,i,o);return t})}function Vt(n,t){return function(r,e){var u=r?Bu(r):0;if(!Sr(u))return n(r,e);for(var o=t?u:-1,i=Br(r);(t?o--:++o<u)&&false!==e(i[o],o,i););return r}}function Zt(n){return function(t,r,e){var u=Br(t);e=e(t);for(var o=e.length,i=n?o:-1;n?i--:++i<o;){
+var f=e[i];if(false===r(u[f],f,u))break}return t}}function Yt(n,t){function r(){return(this&&this!==Zn&&this instanceof r?e:n).apply(t,arguments)}var e=Jt(n);return r}function Gt(n){return function(t){var r=-1;t=$e(Ce(t));for(var e=t.length,u="";++r<e;)u=n(u,t[r],r);return u}}function Jt(n){return function(){var t=arguments;switch(t.length){case 0:return new n;case 1:return new n(t[0]);case 2:return new n(t[0],t[1]);case 3:return new n(t[0],t[1],t[2]);case 4:return new n(t[0],t[1],t[2],t[3]);case 5:
+return new n(t[0],t[1],t[2],t[3],t[4]);case 6:return new n(t[0],t[1],t[2],t[3],t[4],t[5]);case 7:return new n(t[0],t[1],t[2],t[3],t[4],t[5],t[6])}var r=$u(n.prototype),t=n.apply(r,t);return ge(t)?t:r}}function Xt(n){function t(r,e,u){return u&&Ur(r,e,u)&&(e=w),r=gr(r,n,w,w,w,w,w,e),r.placeholder=t.placeholder,r}return t}function Ht(n,t){return le(function(r){var e=r[0];return null==e?e:(r.push(t),n.apply(w,r))})}function Qt(n,t){return function(r,e,u){if(u&&Ur(r,e,u)&&(e=w),e=wr(e,u,3),1==e.length){
+u=r=Oo(r)?r:zr(r);for(var o=e,i=-1,f=u.length,a=t,c=a;++i<f;){var l=u[i],s=+o(l);n(s,a)&&(a=s,c=l)}if(u=c,!r.length||u!==t)return u}return ct(r,e,n,t)}}function nr(n,r){return function(e,u,o){return u=wr(u,o,3),Oo(e)?(u=t(e,u,r),-1<u?e[u]:w):st(e,u,n)}}function tr(n){return function(r,e,u){return r&&r.length?(e=wr(e,u,3),t(r,e,n)):-1}}function rr(n){return function(t,r,e){return r=wr(r,e,3),st(t,r,n,true)}}function er(n){return function(){for(var t,r=arguments.length,e=n?r:-1,u=0,o=Be(r);n?e--:++e<r;){
+var i=o[u++]=arguments[e];if(typeof i!="function")throw new Ge(L);!t&&Ln.prototype.thru&&"wrapper"==br(i)&&(t=new Ln([],true))}for(e=t?-1:r;++e<r;){var i=o[e],u=br(i),f="wrapper"==u?zu(i):w;t=f&&$r(f[0])&&f[1]==(E|k|R|C)&&!f[4].length&&1==f[9]?t[br(f[0])].apply(t,f[3]):1==i.length&&$r(i)?t[u]():t.thru(i)}return function(){var n=arguments,e=n[0];if(t&&1==n.length&&Oo(e)&&e.length>=F)return t.plant(e).value();for(var u=0,n=r?o[u].apply(this,n):e;++u<r;)n=o[u].call(this,n);return n}}}function ur(n,t){
+return function(r,e,u){return typeof e=="function"&&u===w&&Oo(r)?n(r,e):t(r,Bt(e,u,3))}}function or(n){return function(t,r,e){return(typeof r!="function"||e!==w)&&(r=Bt(r,e,3)),n(t,r,Re)}}function ir(n){return function(t,r,e){return(typeof r!="function"||e!==w)&&(r=Bt(r,e,3)),n(t,r)}}function fr(n){return function(t,r,e){var u={};return r=wr(r,e,3),_t(t,function(t,e,o){o=r(t,e,o),e=n?o:e,t=n?t:o,u[e]=t}),u}}function ar(n){return function(t,r,e){return t=u(t),(n?t:"")+pr(t,r,e)+(n?"":t)}}function cr(n){
+var t=le(function(r,e){var u=v(e,t.placeholder);return gr(r,n,w,e,u)});return t}function lr(n,t){return function(r,e,u,o){var i=3>arguments.length;return typeof e=="function"&&o===w&&Oo(r)?n(r,e,u,i):Ot(r,wr(e,o,4),u,i,t)}}function sr(n,t,r,e,u,o,i,f,a,c){function l(){for(var m=arguments.length,b=m,j=Be(m);b--;)j[b]=arguments[b];if(e&&(j=Mt(j,e,u)),o&&(j=qt(j,o,i)),_||y){var b=l.placeholder,k=v(j,b),m=m-k.length;if(m<c){var I=f?qn(f):w,m=bu(c-m,0),E=_?k:w,k=_?w:k,C=_?j:w,j=_?w:j;return t|=_?R:O,t&=~(_?O:R),
+g||(t&=~(x|A)),j=[n,t,r,C,E,j,k,I,a,m],I=sr.apply(w,j),$r(n)&&Du(I,j),I.placeholder=b,I}}if(b=p?r:this,I=h?b[n]:n,f)for(m=j.length,E=xu(f.length,m),k=qn(j);E--;)C=f[E],j[E]=Cr(C,m)?k[C]:w;return s&&a<j.length&&(j.length=a),this&&this!==Zn&&this instanceof l&&(I=d||Jt(n)),I.apply(b,j)}var s=t&E,p=t&x,h=t&A,_=t&k,g=t&j,y=t&I,d=h?w:Jt(n);return l}function pr(n,t,r){return n=n.length,t=+t,n<t&&mu(t)?(t-=n,r=null==r?" ":r+"",Ue(r,vu(t/r.length)).slice(0,t)):""}function hr(n,t,r,e){function u(){for(var t=-1,f=arguments.length,a=-1,c=e.length,l=Be(c+f);++a<c;)l[a]=e[a];
+for(;f--;)l[a++]=arguments[++t];return(this&&this!==Zn&&this instanceof u?i:n).apply(o?r:this,l)}var o=t&x,i=Jt(n);return u}function _r(n){var t=Pe[n];return function(n,r){return(r=r===w?0:+r||0)?(r=au(10,r),t(n*r)/r):t(n)}}function vr(n){return function(t,r,e,u){var o=wr(e);return null==e&&o===ut?Lt(t,r,n):zt(t,r,o(e,u,1),n)}}function gr(n,t,r,e,u,o,i,f){var a=t&A;if(!a&&typeof n!="function")throw new Ge(L);var c=e?e.length:0;if(c||(t&=~(R|O),e=u=w),c-=u?u.length:0,t&O){var l=e,s=u;e=u=w}var p=a?w:zu(n);
+return r=[n,t,r,e,u,l,s,o,i,f],p&&(e=r[1],t=p[1],f=e|t,u=t==E&&e==k||t==E&&e==C&&r[7].length<=p[8]||t==(E|C)&&e==k,(f<E||u)&&(t&x&&(r[2]=p[2],f|=e&x?0:j),(e=p[3])&&(u=r[3],r[3]=u?Mt(u,e,p[4]):qn(e),r[4]=u?v(r[3],z):qn(p[4])),(e=p[5])&&(u=r[5],r[5]=u?qt(u,e,p[6]):qn(e),r[6]=u?v(r[5],z):qn(p[6])),(e=p[7])&&(r[7]=qn(e)),t&E&&(r[8]=null==r[8]?p[8]:xu(r[8],p[8])),null==r[9]&&(r[9]=p[9]),r[0]=p[0],r[1]=f),t=r[1],f=r[9]),r[9]=null==f?a?0:n.length:bu(f-c,0)||0,(p?Lu:Du)(t==x?Yt(r[0],r[2]):t!=R&&t!=(x|R)||r[4].length?sr.apply(w,r):hr.apply(w,r),r);
+}function yr(n,t,r,e,u,o,i){var f=-1,a=n.length,c=t.length;if(a!=c&&(!u||c<=a))return false;for(;++f<a;){var l=n[f],c=t[f],s=e?e(u?c:l,u?l:c,f):w;if(s!==w){if(s)continue;return false}if(u){if(!Hn(t,function(n){return l===n||r(l,n,e,u,o,i)}))return false}else if(l!==c&&!r(l,c,e,u,o,i))return false}return true}function dr(n,t,r){switch(r){case M:case q:return+n==+t;case P:return n.name==t.name&&n.message==t.message;case V:return n!=+n?t!=+t:n==+t;case Y:case G:return n==t+""}return false}function mr(n,t,r,e,u,o,i){var f=zo(n),a=f.length,c=zo(t).length;
+if(a!=c&&!u)return false;for(c=a;c--;){var l=f[c];if(!(u?l in t:nu.call(t,l)))return false}for(var s=u;++c<a;){var l=f[c],p=n[l],h=t[l],_=e?e(u?h:p,u?p:h,l):w;if(_===w?!r(p,h,e,u,o,i):!_)return false;s||(s="constructor"==l)}return s||(r=n.constructor,e=t.constructor,!(r!=e&&"constructor"in n&&"constructor"in t)||typeof r=="function"&&r instanceof r&&typeof e=="function"&&e instanceof e)?true:false}function wr(n,t,r){var e=Nn.callback||Se,e=e===Se?ut:e;return r?e(n,t,r):e}function br(n){for(var t=n.name+"",r=Wu[t],e=r?r.length:0;e--;){
+var u=r[e],o=u.func;if(null==o||o==n)return u.name}return t}function xr(n,t,e){var u=Nn.indexOf||Vr,u=u===Vr?r:u;return n?u(n,t,e):u}function Ar(n){n=Oe(n);for(var t=n.length;t--;){var r=n[t][1];n[t][2]=r===r&&!ge(r)}return n}function jr(n,t){var r=null==n?w:n[t];return ye(r)?r:w}function kr(n){var t=n.length,r=new n.constructor(t);return t&&"string"==typeof n[0]&&nu.call(n,"index")&&(r.index=n.index,r.input=n.input),r}function Ir(n){return n=n.constructor,typeof n=="function"&&n instanceof n||(n=Ve),
+new n}function Rr(n,t,r){var e=n.constructor;switch(t){case J:return Dt(n);case M:case q:return new e(+n);case X:case H:case Q:case nn:case tn:case rn:case en:case un:case on:return t=n.buffer,new e(r?Dt(t):t,n.byteOffset,n.length);case V:case G:return new e(n);case Y:var u=new e(n.source,kn.exec(n));u.lastIndex=n.lastIndex}return u}function Or(n,t,r){return null==n||Wr(t,n)||(t=Dr(t),n=1==t.length?n:yt(n,Et(t,0,-1)),t=Zr(t)),t=null==n?n:n[t],null==t?w:t.apply(n,r)}function Er(n){return null!=n&&Sr(Bu(n));
+}function Cr(n,t){return n=typeof n=="number"||On.test(n)?+n:-1,t=null==t?Cu:t,-1<n&&0==n%1&&n<t}function Ur(n,t,r){if(!ge(r))return false;var e=typeof t;return("number"==e?Er(r)&&Cr(t,r.length):"string"==e&&t in r)?(t=r[t],n===n?n===t:t!==t):false}function Wr(n,t){var r=typeof n;return"string"==r&&dn.test(n)||"number"==r?true:Oo(n)?false:!yn.test(n)||null!=t&&n in Br(t)}function $r(n){var t=br(n),r=Nn[t];return typeof r=="function"&&t in zn.prototype?n===r?true:(t=zu(r),!!t&&n===t[0]):false}function Sr(n){return typeof n=="number"&&-1<n&&0==n%1&&n<=Cu;
+}function Fr(n,t){return n===w?t:Eo(n,t,Fr)}function Nr(n,t){n=Br(n);for(var r=-1,e=t.length,u={};++r<e;){var o=t[r];o in n&&(u[o]=n[o])}return u}function Tr(n,t){var r={};return ht(n,function(n,e,u){t(n,e,u)&&(r[e]=n)}),r}function Lr(n){for(var t=Re(n),r=t.length,e=r&&n.length,u=!!e&&Sr(e)&&(Oo(n)||pe(n)),o=-1,i=[];++o<r;){var f=t[o];(u&&Cr(f,e)||nu.call(n,f))&&i.push(f)}return i}function zr(n){return null==n?[]:Er(n)?ge(n)?n:Ve(n):Ee(n)}function Br(n){return ge(n)?n:Ve(n)}function Dr(n){if(Oo(n))return n;
+var t=[];return u(n).replace(mn,function(n,r,e,u){t.push(e?u.replace(An,"$1"):r||n)}),t}function Mr(n){return n instanceof zn?n.clone():new Ln(n.__wrapped__,n.__chain__,qn(n.__actions__))}function qr(n,t,r){return n&&n.length?((r?Ur(n,t,r):null==t)&&(t=1),Et(n,0>t?0:t)):[]}function Pr(n,t,r){var e=n?n.length:0;return e?((r?Ur(n,t,r):null==t)&&(t=1),t=e-(+t||0),Et(n,0,0>t?0:t)):[]}function Kr(n){return n?n[0]:w}function Vr(n,t,e){var u=n?n.length:0;if(!u)return-1;if(typeof e=="number")e=0>e?bu(u+e,0):e;else if(e)return e=Lt(n,t),
+e<u&&(t===t?t===n[e]:n[e]!==n[e])?e:-1;return r(n,t,e||0)}function Zr(n){var t=n?n.length:0;return t?n[t-1]:w}function Yr(n){return qr(n,1)}function Gr(n,t,e,u){if(!n||!n.length)return[];null!=t&&typeof t!="boolean"&&(u=e,e=Ur(n,t,u)?w:t,t=false);var o=wr();if((null!=e||o!==ut)&&(e=o(e,u,3)),t&&xr()===r){t=e;var i;e=-1,u=n.length;for(var o=-1,f=[];++e<u;){var a=n[e],c=t?t(a,e,n):a;e&&i===c||(i=c,f[++o]=a)}n=f}else n=St(n,e);return n}function Jr(n){if(!n||!n.length)return[];var t=-1,r=0;n=Vn(n,function(n){
+return Er(n)?(r=bu(n.length,r),true):void 0});for(var e=Be(r);++t<r;)e[t]=Gn(n,jt(t));return e}function Xr(n,t,r){return n&&n.length?(n=Jr(n),null==t?n:(t=Bt(t,r,4),Gn(n,function(n){return Xn(n,t,w,true)}))):[]}function Hr(n,t){var r=-1,e=n?n.length:0,u={};for(!e||t||Oo(n[0])||(t=[]);++r<e;){var o=n[r];t?u[o]=t[r]:o&&(u[o[0]]=o[1])}return u}function Qr(n){return n=Nn(n),n.__chain__=true,n}function ne(n,t,r){return t.call(r,n)}function te(n,t,r){var e=Oo(n)?Kn:at;return r&&Ur(n,t,r)&&(t=w),(typeof t!="function"||r!==w)&&(t=wr(t,r,3)),
+e(n,t)}function re(n,t,r){var e=Oo(n)?Vn:lt;return t=wr(t,r,3),e(n,t)}function ee(n,t,r,e){var u=n?Bu(n):0;return Sr(u)||(n=Ee(n),u=n.length),r=typeof r!="number"||e&&Ur(t,r,e)?0:0>r?bu(u+r,0):r||0,typeof n=="string"||!Oo(n)&&be(n)?r<=u&&-1<n.indexOf(t,r):!!u&&-1<xr(n,t,r)}function ue(n,t,r){var e=Oo(n)?Gn:wt;return t=wr(t,r,3),e(n,t)}function oe(n,t,r){if(r?Ur(n,t,r):null==t){n=zr(n);var e=n.length;return 0<e?n[Rt(0,e-1)]:w}r=-1,n=je(n);var e=n.length,u=e-1;for(t=xu(0>t?0:+t||0,e);++r<t;){var e=Rt(r,u),o=n[e];
+n[e]=n[r],n[r]=o}return n.length=t,n}function ie(n,t,r){var e=Oo(n)?Hn:Ct;return r&&Ur(n,t,r)&&(t=w),(typeof t!="function"||r!==w)&&(t=wr(t,r,3)),e(n,t)}function fe(n,t){var r;if(typeof t!="function"){if(typeof n!="function")throw new Ge(L);var e=n;n=t,t=e}return function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=w),r}}function ae(n,t,r){function e(t,r){r&&iu(r),a=p=h=w,t&&(_=ho(),c=n.apply(s,f),p||a||(f=s=w))}function u(){var n=t-(ho()-l);0>=n||n>t?e(h,a):p=su(u,n)}function o(){e(g,p);
+}function i(){if(f=arguments,l=ho(),s=this,h=g&&(p||!y),false===v)var r=y&&!p;else{a||y||(_=l);var e=v-(l-_),i=0>=e||e>v;i?(a&&(a=iu(a)),_=l,c=n.apply(s,f)):a||(a=su(o,e))}return i&&p?p=iu(p):p||t===v||(p=su(u,t)),r&&(i=true,c=n.apply(s,f)),!i||p||a||(f=s=w),c}var f,a,c,l,s,p,h,_=0,v=false,g=true;if(typeof n!="function")throw new Ge(L);if(t=0>t?0:+t||0,true===r)var y=true,g=false;else ge(r)&&(y=!!r.leading,v="maxWait"in r&&bu(+r.maxWait||0,t),g="trailing"in r?!!r.trailing:g);return i.cancel=function(){p&&iu(p),a&&iu(a),
+_=0,a=p=h=w},i}function ce(n,t){function r(){var e=arguments,u=t?t.apply(this,e):e[0],o=r.cache;return o.has(u)?o.get(u):(e=n.apply(this,e),r.cache=o.set(u,e),e)}if(typeof n!="function"||t&&typeof t!="function")throw new Ge(L);return r.cache=new ce.Cache,r}function le(n,t){if(typeof n!="function")throw new Ge(L);return t=bu(t===w?n.length-1:+t||0,0),function(){for(var r=arguments,e=-1,u=bu(r.length-t,0),o=Be(u);++e<u;)o[e]=r[t+e];switch(t){case 0:return n.call(this,o);case 1:return n.call(this,r[0],o);
+case 2:return n.call(this,r[0],r[1],o)}for(u=Be(t+1),e=-1;++e<t;)u[e]=r[e];return u[t]=o,n.apply(this,u)}}function se(n,t){return n>t}function pe(n){return h(n)&&Er(n)&&nu.call(n,"callee")&&!cu.call(n,"callee")}function he(n,t,r,e){return e=(r=typeof r=="function"?Bt(r,e,3):w)?r(n,t):w,e===w?dt(n,t,r):!!e}function _e(n){return h(n)&&typeof n.message=="string"&&ru.call(n)==P}function ve(n){return ge(n)&&ru.call(n)==K}function ge(n){var t=typeof n;return!!n&&("object"==t||"function"==t)}function ye(n){
+return null==n?false:ve(n)?uu.test(Qe.call(n)):h(n)&&Rn.test(n)}function de(n){return typeof n=="number"||h(n)&&ru.call(n)==V}function me(n){var t;if(!h(n)||ru.call(n)!=Z||pe(n)||!(nu.call(n,"constructor")||(t=n.constructor,typeof t!="function"||t instanceof t)))return false;var r;return ht(n,function(n,t){r=t}),r===w||nu.call(n,r)}function we(n){return ge(n)&&ru.call(n)==Y}function be(n){return typeof n=="string"||h(n)&&ru.call(n)==G}function xe(n){return h(n)&&Sr(n.length)&&!!Sn[ru.call(n)]}function Ae(n,t){
+return n<t}function je(n){var t=n?Bu(n):0;return Sr(t)?t?qn(n):[]:Ee(n)}function ke(n){return et(n,Re(n))}function Ie(n){return gt(n,Re(n))}function Re(n){if(null==n)return[];ge(n)||(n=Ve(n));for(var t=n.length,t=t&&Sr(t)&&(Oo(n)||pe(n))&&t||0,r=n.constructor,e=-1,r=typeof r=="function"&&r.prototype===n,u=Be(t),o=0<t;++e<t;)u[e]=e+"";for(var i in n)o&&Cr(i,t)||"constructor"==i&&(r||!nu.call(n,i))||u.push(i);return u}function Oe(n){n=Br(n);for(var t=-1,r=zo(n),e=r.length,u=Be(e);++t<e;){var o=r[t];
+u[t]=[o,n[o]]}return u}function Ee(n){return Ft(n,zo(n))}function Ce(n){return(n=u(n))&&n.replace(En,a).replace(xn,"")}function Ue(n,t){var r="";if(n=u(n),t=+t,1>t||!n||!mu(t))return r;do t%2&&(r+=n),t=yu(t/2),n+=n;while(t);return r}function We(n,t,r){var e=n;return(n=u(n))?(r?Ur(e,t,r):null==t)?n.slice(g(n),y(n)+1):(t+="",n.slice(o(n,t),i(n,t)+1)):n}function $e(n,t,r){return r&&Ur(n,t,r)&&(t=w),n=u(n),n.match(t||Wn)||[]}function Se(n,t,r){return r&&Ur(n,t,r)&&(t=w),h(n)?Ne(n):ut(n,t)}function Fe(n){
+return n}function Ne(n){return bt(ot(n,true))}function Te(n,t,r){if(null==r){var e=ge(t),u=e?zo(t):w;((u=u&&u.length?gt(t,u):w)?u.length:e)||(u=false,r=t,t=n,n=this)}u||(u=gt(t,zo(t)));var o=true,e=-1,i=ve(n),f=u.length;false===r?o=false:ge(r)&&"chain"in r&&(o=r.chain);for(;++e<f;){r=u[e];var a=t[r];n[r]=a,i&&(n.prototype[r]=function(t){return function(){var r=this.__chain__;if(o||r){var e=n(this.__wrapped__);return(e.__actions__=qn(this.__actions__)).push({func:t,args:arguments,thisArg:n}),e.__chain__=r,e}return t.apply(n,Jn([this.value()],arguments));
+}}(a))}return n}function Le(){}function ze(n){return Wr(n)?jt(n):kt(n)}_=_?Yn.defaults(Zn.Object(),_,Yn.pick(Zn,$n)):Zn;var Be=_.Array,De=_.Date,Me=_.Error,qe=_.Function,Pe=_.Math,Ke=_.Number,Ve=_.Object,Ze=_.RegExp,Ye=_.String,Ge=_.TypeError,Je=Be.prototype,Xe=Ve.prototype,He=Ye.prototype,Qe=qe.prototype.toString,nu=Xe.hasOwnProperty,tu=0,ru=Xe.toString,eu=Zn._,uu=Ze("^"+Qe.call(nu).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),ou=_.ArrayBuffer,iu=_.clearTimeout,fu=_.parseFloat,au=Pe.pow,cu=Xe.propertyIsEnumerable,lu=jr(_,"Set"),su=_.setTimeout,pu=Je.splice,hu=_.Uint8Array,_u=jr(_,"WeakMap"),vu=Pe.ceil,gu=jr(Ve,"create"),yu=Pe.floor,du=jr(Be,"isArray"),mu=_.isFinite,wu=jr(Ve,"keys"),bu=Pe.max,xu=Pe.min,Au=jr(De,"now"),ju=_.parseInt,ku=Pe.random,Iu=Ke.NEGATIVE_INFINITY,Ru=Ke.POSITIVE_INFINITY,Ou=4294967294,Eu=2147483647,Cu=9007199254740991,Uu=_u&&new _u,Wu={};
+Nn.support={},Nn.templateSettings={escape:_n,evaluate:vn,interpolate:gn,variable:"",imports:{_:Nn}};var $u=function(){function n(){}return function(t){if(ge(t)){n.prototype=t;var r=new n;n.prototype=w}return r||{}}}(),Su=Vt(_t),Fu=Vt(vt,true),Nu=Zt(),Tu=Zt(true),Lu=Uu?function(n,t){return Uu.set(n,t),n}:Fe,zu=Uu?function(n){return Uu.get(n)}:Le,Bu=jt("length"),Du=function(){var n=0,t=0;return function(r,e){var u=ho(),o=S-(u-t);if(t=u,0<o){if(++n>=$)return r}else n=0;return Lu(r,e)}}(),Mu=le(function(n,t){
+return h(n)&&Er(n)?ft(n,pt(t,false,true)):[]}),qu=tr(),Pu=tr(true),Ku=le(function(n){for(var t=n.length,e=t,u=Be(l),o=xr(),i=o===r,f=[];e--;){var a=n[e]=Er(a=n[e])?a:[];u[e]=i&&120<=a.length&&gu&&lu?new Dn(e&&a):null}var i=n[0],c=-1,l=i?i.length:0,s=u[0];n:for(;++c<l;)if(a=i[c],0>(s?Mn(s,a):o(f,a,0))){for(e=t;--e;){var p=u[e];if(0>(p?Mn(p,a):o(n[e],a,0)))continue n}s&&s.push(a),f.push(a)}return f}),Vu=le(function(t,r){r=pt(r);var e=rt(t,r);return It(t,r.sort(n)),e}),Zu=vr(),Yu=vr(true),Gu=le(function(n){return St(pt(n,false,true));
+}),Ju=le(function(n,t){return Er(n)?ft(n,t):[]}),Xu=le(Jr),Hu=le(function(n){var t=n.length,r=2<t?n[t-2]:w,e=1<t?n[t-1]:w;return 2<t&&typeof r=="function"?t-=2:(r=1<t&&typeof e=="function"?(--t,e):w,e=w),n.length=t,Xr(n,r,e)}),Qu=le(function(n){return n=pt(n),this.thru(function(t){t=Oo(t)?t:[Br(t)];for(var r=n,e=-1,u=t.length,o=-1,i=r.length,f=Be(u+i);++e<u;)f[e]=t[e];for(;++o<i;)f[e++]=r[o];return f})}),no=le(function(n,t){return rt(n,pt(t))}),to=Pt(function(n,t,r){nu.call(n,r)?++n[r]:n[r]=1}),ro=nr(Su),eo=nr(Fu,true),uo=ur(Pn,Su),oo=ur(function(n,t){
+for(var r=n.length;r--&&false!==t(n[r],r,n););return n},Fu),io=Pt(function(n,t,r){nu.call(n,r)?n[r].push(t):n[r]=[t]}),fo=Pt(function(n,t,r){n[r]=t}),ao=le(function(n,t,r){var e=-1,u=typeof t=="function",o=Wr(t),i=Er(n)?Be(n.length):[];return Su(n,function(n){var f=u?t:o&&null!=n?n[t]:w;i[++e]=f?f.apply(n,r):Or(n,t,r)}),i}),co=Pt(function(n,t,r){n[r?0:1].push(t)},function(){return[[],[]]}),lo=lr(Xn,Su),so=lr(function(n,t,r,e){var u=n.length;for(e&&u&&(r=n[--u]);u--;)r=t(r,n[u],u,n);return r},Fu),po=le(function(n,t){
+if(null==n)return[];var r=t[2];return r&&Ur(t[0],t[1],r)&&(t.length=1),Wt(n,pt(t),[])}),ho=Au||function(){return(new De).getTime()},_o=le(function(n,t,r){var e=x;if(r.length)var u=v(r,_o.placeholder),e=e|R;return gr(n,e,t,r,u)}),vo=le(function(n,t){t=t.length?pt(t):Ie(n);for(var r=-1,e=t.length;++r<e;){var u=t[r];n[u]=gr(n[u],x,n)}return n}),go=le(function(n,t,r){var e=x|A;if(r.length)var u=v(r,go.placeholder),e=e|R;return gr(t,e,n,r,u)}),yo=Xt(k),mo=Xt(I),wo=le(function(n,t){return it(n,1,t)}),bo=le(function(n,t,r){
+return it(n,t,r)}),xo=er(),Ao=er(true),jo=le(function(n,t){if(t=pt(t),typeof n!="function"||!Kn(t,e))throw new Ge(L);var r=t.length;return le(function(e){for(var u=xu(e.length,r);u--;)e[u]=t[u](e[u]);return n.apply(this,e)})}),ko=cr(R),Io=cr(O),Ro=le(function(n,t){return gr(n,C,w,w,w,pt(t))}),Oo=du||function(n){return h(n)&&Sr(n.length)&&ru.call(n)==D},Eo=Kt(At),Co=Kt(function(n,t,r){return r?nt(n,t,r):tt(n,t)}),Uo=Ht(Co,function(n,t){return n===w?t:n}),Wo=Ht(Eo,Fr),$o=rr(_t),So=rr(vt),Fo=or(Nu),No=or(Tu),To=ir(_t),Lo=ir(vt),zo=wu?function(n){
+var t=null==n?w:n.constructor;return typeof t=="function"&&t.prototype===n||typeof n!="function"&&Er(n)?Lr(n):ge(n)?wu(n):[]}:Lr,Bo=fr(true),Do=fr(),Mo=le(function(n,t){if(null==n)return{};if("function"!=typeof t[0])return t=Gn(pt(t),Ye),Nr(n,ft(Re(n),t));var r=Bt(t[0],t[1],3);return Tr(n,function(n,t,e){return!r(n,t,e)})}),qo=le(function(n,t){return null==n?{}:"function"==typeof t[0]?Tr(n,Bt(t[0],t[1],3)):Nr(n,pt(t))}),Po=Gt(function(n,t,r){return t=t.toLowerCase(),n+(r?t.charAt(0).toUpperCase()+t.slice(1):t);
+}),Ko=Gt(function(n,t,r){return n+(r?"-":"")+t.toLowerCase()}),Vo=ar(),Zo=ar(true),Yo=Gt(function(n,t,r){return n+(r?"_":"")+t.toLowerCase()}),Go=Gt(function(n,t,r){return n+(r?" ":"")+(t.charAt(0).toUpperCase()+t.slice(1))}),Jo=le(function(n,t){try{return n.apply(w,t)}catch(r){return _e(r)?r:new Me(r)}}),Xo=le(function(n,t){return function(r){return Or(r,n,t)}}),Ho=le(function(n,t){return function(r){return Or(n,r,t)}}),Qo=_r("ceil"),ni=_r("floor"),ti=Qt(se,Iu),ri=Qt(Ae,Ru),ei=_r("round");return Nn.prototype=Tn.prototype,
+Ln.prototype=$u(Tn.prototype),Ln.prototype.constructor=Ln,zn.prototype=$u(Tn.prototype),zn.prototype.constructor=zn,Bn.prototype["delete"]=function(n){return this.has(n)&&delete this.__data__[n]},Bn.prototype.get=function(n){return"__proto__"==n?w:this.__data__[n]},Bn.prototype.has=function(n){return"__proto__"!=n&&nu.call(this.__data__,n)},Bn.prototype.set=function(n,t){return"__proto__"!=n&&(this.__data__[n]=t),this},Dn.prototype.push=function(n){var t=this.data;typeof n=="string"||ge(n)?t.set.add(n):t.hash[n]=true;
+},ce.Cache=Bn,Nn.after=function(n,t){if(typeof t!="function"){if(typeof n!="function")throw new Ge(L);var r=n;n=t,t=r}return n=mu(n=+n)?n:0,function(){return 1>--n?t.apply(this,arguments):void 0}},Nn.ary=function(n,t,r){return r&&Ur(n,t,r)&&(t=w),t=n&&null==t?n.length:bu(+t||0,0),gr(n,E,w,w,w,w,t)},Nn.assign=Co,Nn.at=no,Nn.before=fe,Nn.bind=_o,Nn.bindAll=vo,Nn.bindKey=go,Nn.callback=Se,Nn.chain=Qr,Nn.chunk=function(n,t,r){t=(r?Ur(n,t,r):null==t)?1:bu(yu(t)||1,1),r=0;for(var e=n?n.length:0,u=-1,o=Be(vu(e/t));r<e;)o[++u]=Et(n,r,r+=t);
+return o},Nn.compact=function(n){for(var t=-1,r=n?n.length:0,e=-1,u=[];++t<r;){var o=n[t];o&&(u[++e]=o)}return u},Nn.constant=function(n){return function(){return n}},Nn.countBy=to,Nn.create=function(n,t,r){var e=$u(n);return r&&Ur(n,t,r)&&(t=w),t?tt(e,t):e},Nn.curry=yo,Nn.curryRight=mo,Nn.debounce=ae,Nn.defaults=Uo,Nn.defaultsDeep=Wo,Nn.defer=wo,Nn.delay=bo,Nn.difference=Mu,Nn.drop=qr,Nn.dropRight=Pr,Nn.dropRightWhile=function(n,t,r){return n&&n.length?Nt(n,wr(t,r,3),true,true):[]},Nn.dropWhile=function(n,t,r){
+return n&&n.length?Nt(n,wr(t,r,3),true):[]},Nn.fill=function(n,t,r,e){var u=n?n.length:0;if(!u)return[];for(r&&typeof r!="number"&&Ur(n,t,r)&&(r=0,e=u),u=n.length,r=null==r?0:+r||0,0>r&&(r=-r>u?0:u+r),e=e===w||e>u?u:+e||0,0>e&&(e+=u),u=r>e?0:e>>>0,r>>>=0;r<u;)n[r++]=t;return n},Nn.filter=re,Nn.flatten=function(n,t,r){var e=n?n.length:0;return r&&Ur(n,t,r)&&(t=false),e?pt(n,t):[]},Nn.flattenDeep=function(n){return n&&n.length?pt(n,true):[]},Nn.flow=xo,Nn.flowRight=Ao,Nn.forEach=uo,Nn.forEachRight=oo,Nn.forIn=Fo,
+Nn.forInRight=No,Nn.forOwn=To,Nn.forOwnRight=Lo,Nn.functions=Ie,Nn.groupBy=io,Nn.indexBy=fo,Nn.initial=function(n){return Pr(n,1)},Nn.intersection=Ku,Nn.invert=function(n,t,r){r&&Ur(n,t,r)&&(t=w),r=-1;for(var e=zo(n),u=e.length,o={};++r<u;){var i=e[r],f=n[i];t?nu.call(o,f)?o[f].push(i):o[f]=[i]:o[f]=i}return o},Nn.invoke=ao,Nn.keys=zo,Nn.keysIn=Re,Nn.map=ue,Nn.mapKeys=Bo,Nn.mapValues=Do,Nn.matches=Ne,Nn.matchesProperty=function(n,t){return xt(n,ot(t,true))},Nn.memoize=ce,Nn.merge=Eo,Nn.method=Xo,Nn.methodOf=Ho,
+Nn.mixin=Te,Nn.modArgs=jo,Nn.negate=function(n){if(typeof n!="function")throw new Ge(L);return function(){return!n.apply(this,arguments)}},Nn.omit=Mo,Nn.once=function(n){return fe(2,n)},Nn.pairs=Oe,Nn.partial=ko,Nn.partialRight=Io,Nn.partition=co,Nn.pick=qo,Nn.pluck=function(n,t){return ue(n,ze(t))},Nn.property=ze,Nn.propertyOf=function(n){return function(t){return yt(n,Dr(t),t+"")}},Nn.pull=function(){var n=arguments,t=n[0];if(!t||!t.length)return t;for(var r=0,e=xr(),u=n.length;++r<u;)for(var o=0,i=n[r];-1<(o=e(t,i,o));)pu.call(t,o,1);
+return t},Nn.pullAt=Vu,Nn.range=function(n,t,r){r&&Ur(n,t,r)&&(t=r=w),n=+n||0,r=null==r?1:+r||0,null==t?(t=n,n=0):t=+t||0;var e=-1;t=bu(vu((t-n)/(r||1)),0);for(var u=Be(t);++e<t;)u[e]=n,n+=r;return u},Nn.rearg=Ro,Nn.reject=function(n,t,r){var e=Oo(n)?Vn:lt;return t=wr(t,r,3),e(n,function(n,r,e){return!t(n,r,e)})},Nn.remove=function(n,t,r){var e=[];if(!n||!n.length)return e;var u=-1,o=[],i=n.length;for(t=wr(t,r,3);++u<i;)r=n[u],t(r,u,n)&&(e.push(r),o.push(u));return It(n,o),e},Nn.rest=Yr,Nn.restParam=le,
+Nn.set=function(n,t,r){if(null==n)return n;var e=t+"";t=null!=n[e]||Wr(t,n)?[e]:Dr(t);for(var e=-1,u=t.length,o=u-1,i=n;null!=i&&++e<u;){var f=t[e];ge(i)&&(e==o?i[f]=r:null==i[f]&&(i[f]=Cr(t[e+1])?[]:{})),i=i[f]}return n},Nn.shuffle=function(n){return oe(n,Ru)},Nn.slice=function(n,t,r){var e=n?n.length:0;return e?(r&&typeof r!="number"&&Ur(n,t,r)&&(t=0,r=e),Et(n,t,r)):[]},Nn.sortBy=function(n,t,r){if(null==n)return[];r&&Ur(n,t,r)&&(t=w);var e=-1;return t=wr(t,r,3),n=wt(n,function(n,r,u){return{a:t(n,r,u),
+b:++e,c:n}}),Ut(n,f)},Nn.sortByAll=po,Nn.sortByOrder=function(n,t,r,e){return null==n?[]:(e&&Ur(t,r,e)&&(r=w),Oo(t)||(t=null==t?[]:[t]),Oo(r)||(r=null==r?[]:[r]),Wt(n,t,r))},Nn.spread=function(n){if(typeof n!="function")throw new Ge(L);return function(t){return n.apply(this,t)}},Nn.take=function(n,t,r){return n&&n.length?((r?Ur(n,t,r):null==t)&&(t=1),Et(n,0,0>t?0:t)):[]},Nn.takeRight=function(n,t,r){var e=n?n.length:0;return e?((r?Ur(n,t,r):null==t)&&(t=1),t=e-(+t||0),Et(n,0>t?0:t)):[]},Nn.takeRightWhile=function(n,t,r){
+return n&&n.length?Nt(n,wr(t,r,3),false,true):[]},Nn.takeWhile=function(n,t,r){return n&&n.length?Nt(n,wr(t,r,3)):[]},Nn.tap=function(n,t,r){return t.call(r,n),n},Nn.throttle=function(n,t,r){var e=true,u=true;if(typeof n!="function")throw new Ge(L);return false===r?e=false:ge(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),ae(n,t,{leading:e,maxWait:+t,trailing:u})},Nn.thru=ne,Nn.times=function(n,t,r){if(n=yu(n),1>n||!mu(n))return[];var e=-1,u=Be(xu(n,4294967295));for(t=Bt(t,r,1);++e<n;)4294967295>e?u[e]=t(e):t(e);
+return u},Nn.toArray=je,Nn.toPlainObject=ke,Nn.transform=function(n,t,r,e){var u=Oo(n)||xe(n);return t=wr(t,e,4),null==r&&(u||ge(n)?(e=n.constructor,r=u?Oo(n)?new e:[]:$u(ve(e)?e.prototype:w)):r={}),(u?Pn:_t)(n,function(n,e,u){return t(r,n,e,u)}),r},Nn.union=Gu,Nn.uniq=Gr,Nn.unzip=Jr,Nn.unzipWith=Xr,Nn.values=Ee,Nn.valuesIn=function(n){return Ft(n,Re(n))},Nn.where=function(n,t){return re(n,bt(t))},Nn.without=Ju,Nn.wrap=function(n,t){return t=null==t?Fe:t,gr(t,R,w,[n],[])},Nn.xor=function(){for(var n=-1,t=arguments.length;++n<t;){
+var r=arguments[n];if(Er(r))var e=e?Jn(ft(e,r),ft(r,e)):r}return e?St(e):[]},Nn.zip=Xu,Nn.zipObject=Hr,Nn.zipWith=Hu,Nn.backflow=Ao,Nn.collect=ue,Nn.compose=Ao,Nn.each=uo,Nn.eachRight=oo,Nn.extend=Co,Nn.iteratee=Se,Nn.methods=Ie,Nn.object=Hr,Nn.select=re,Nn.tail=Yr,Nn.unique=Gr,Te(Nn,Nn),Nn.add=function(n,t){return(+n||0)+(+t||0)},Nn.attempt=Jo,Nn.camelCase=Po,Nn.capitalize=function(n){return(n=u(n))&&n.charAt(0).toUpperCase()+n.slice(1)},Nn.ceil=Qo,Nn.clone=function(n,t,r,e){return t&&typeof t!="boolean"&&Ur(n,t,r)?t=false:typeof t=="function"&&(e=r,
+r=t,t=false),typeof r=="function"?ot(n,t,Bt(r,e,3)):ot(n,t)},Nn.cloneDeep=function(n,t,r){return typeof t=="function"?ot(n,true,Bt(t,r,3)):ot(n,true)},Nn.deburr=Ce,Nn.endsWith=function(n,t,r){n=u(n),t+="";var e=n.length;return r=r===w?e:xu(0>r?0:+r||0,e),r-=t.length,0<=r&&n.indexOf(t,r)==r},Nn.escape=function(n){return(n=u(n))&&hn.test(n)?n.replace(sn,c):n},Nn.escapeRegExp=function(n){return(n=u(n))&&bn.test(n)?n.replace(wn,l):n||"(?:)"},Nn.every=te,Nn.find=ro,Nn.findIndex=qu,Nn.findKey=$o,Nn.findLast=eo,
+Nn.findLastIndex=Pu,Nn.findLastKey=So,Nn.findWhere=function(n,t){return ro(n,bt(t))},Nn.first=Kr,Nn.floor=ni,Nn.get=function(n,t,r){return n=null==n?w:yt(n,Dr(t),t+""),n===w?r:n},Nn.gt=se,Nn.gte=function(n,t){return n>=t},Nn.has=function(n,t){if(null==n)return false;var r=nu.call(n,t);if(!r&&!Wr(t)){if(t=Dr(t),n=1==t.length?n:yt(n,Et(t,0,-1)),null==n)return false;t=Zr(t),r=nu.call(n,t)}return r||Sr(n.length)&&Cr(t,n.length)&&(Oo(n)||pe(n))},Nn.identity=Fe,Nn.includes=ee,Nn.indexOf=Vr,Nn.inRange=function(n,t,r){
+return t=+t||0,r===w?(r=t,t=0):r=+r||0,n>=xu(t,r)&&n<bu(t,r)},Nn.isArguments=pe,Nn.isArray=Oo,Nn.isBoolean=function(n){return true===n||false===n||h(n)&&ru.call(n)==M},Nn.isDate=function(n){return h(n)&&ru.call(n)==q},Nn.isElement=function(n){return!!n&&1===n.nodeType&&h(n)&&!me(n)},Nn.isEmpty=function(n){return null==n?true:Er(n)&&(Oo(n)||be(n)||pe(n)||h(n)&&ve(n.splice))?!n.length:!zo(n).length},Nn.isEqual=he,Nn.isError=_e,Nn.isFinite=function(n){return typeof n=="number"&&mu(n)},Nn.isFunction=ve,Nn.isMatch=function(n,t,r,e){
+return r=typeof r=="function"?Bt(r,e,3):w,mt(n,Ar(t),r)},Nn.isNaN=function(n){return de(n)&&n!=+n},Nn.isNative=ye,Nn.isNull=function(n){return null===n},Nn.isNumber=de,Nn.isObject=ge,Nn.isPlainObject=me,Nn.isRegExp=we,Nn.isString=be,Nn.isTypedArray=xe,Nn.isUndefined=function(n){return n===w},Nn.kebabCase=Ko,Nn.last=Zr,Nn.lastIndexOf=function(n,t,r){var e=n?n.length:0;if(!e)return-1;var u=e;if(typeof r=="number")u=(0>r?bu(e+r,0):xu(r||0,e-1))+1;else if(r)return u=Lt(n,t,true)-1,n=n[u],(t===t?t===n:n!==n)?u:-1;
+if(t!==t)return p(n,u,true);for(;u--;)if(n[u]===t)return u;return-1},Nn.lt=Ae,Nn.lte=function(n,t){return n<=t},Nn.max=ti,Nn.min=ri,Nn.noConflict=function(){return Zn._=eu,this},Nn.noop=Le,Nn.now=ho,Nn.pad=function(n,t,r){n=u(n),t=+t;var e=n.length;return e<t&&mu(t)?(e=(t-e)/2,t=yu(e),e=vu(e),r=pr("",e,r),r.slice(0,t)+n+r):n},Nn.padLeft=Vo,Nn.padRight=Zo,Nn.parseInt=function(n,t,r){return(r?Ur(n,t,r):null==t)?t=0:t&&(t=+t),n=We(n),ju(n,t||(In.test(n)?16:10))},Nn.random=function(n,t,r){r&&Ur(n,t,r)&&(t=r=w);
+var e=null==n,u=null==t;return null==r&&(u&&typeof n=="boolean"?(r=n,n=1):typeof t=="boolean"&&(r=t,u=true)),e&&u&&(t=1,u=false),n=+n||0,u?(t=n,n=0):t=+t||0,r||n%1||t%1?(r=ku(),xu(n+r*(t-n+fu("1e-"+((r+"").length-1))),t)):Rt(n,t)},Nn.reduce=lo,Nn.reduceRight=so,Nn.repeat=Ue,Nn.result=function(n,t,r){var e=null==n?w:n[t];return e===w&&(null==n||Wr(t,n)||(t=Dr(t),n=1==t.length?n:yt(n,Et(t,0,-1)),e=null==n?w:n[Zr(t)]),e=e===w?r:e),ve(e)?e.call(n):e},Nn.round=ei,Nn.runInContext=m,Nn.size=function(n){var t=n?Bu(n):0;
+return Sr(t)?t:zo(n).length},Nn.snakeCase=Yo,Nn.some=ie,Nn.sortedIndex=Zu,Nn.sortedLastIndex=Yu,Nn.startCase=Go,Nn.startsWith=function(n,t,r){return n=u(n),r=null==r?0:xu(0>r?0:+r||0,n.length),n.lastIndexOf(t,r)==r},Nn.sum=function(n,t,r){if(r&&Ur(n,t,r)&&(t=w),t=wr(t,r,3),1==t.length){n=Oo(n)?n:zr(n),r=n.length;for(var e=0;r--;)e+=+t(n[r])||0;n=e}else n=$t(n,t);return n},Nn.template=function(n,t,r){var e=Nn.templateSettings;r&&Ur(n,t,r)&&(t=r=w),n=u(n),t=nt(tt({},r||t),e,Qn),r=nt(tt({},t.imports),e.imports,Qn);
+var o,i,f=zo(r),a=Ft(r,f),c=0;r=t.interpolate||Cn;var l="__p+='";r=Ze((t.escape||Cn).source+"|"+r.source+"|"+(r===gn?jn:Cn).source+"|"+(t.evaluate||Cn).source+"|$","g");var p="sourceURL"in t?"//# sourceURL="+t.sourceURL+"\n":"";if(n.replace(r,function(t,r,e,u,f,a){return e||(e=u),l+=n.slice(c,a).replace(Un,s),r&&(o=true,l+="'+__e("+r+")+'"),f&&(i=true,l+="';"+f+";\n__p+='"),e&&(l+="'+((__t=("+e+"))==null?'':__t)+'"),c=a+t.length,t}),l+="';",(t=t.variable)||(l="with(obj){"+l+"}"),l=(i?l.replace(fn,""):l).replace(an,"$1").replace(cn,"$1;"),
+l="function("+(t||"obj")+"){"+(t?"":"obj||(obj={});")+"var __t,__p=''"+(o?",__e=_.escape":"")+(i?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+l+"return __p}",t=Jo(function(){return qe(f,p+"return "+l).apply(w,a)}),t.source=l,_e(t))throw t;return t},Nn.trim=We,Nn.trimLeft=function(n,t,r){var e=n;return(n=u(n))?n.slice((r?Ur(e,t,r):null==t)?g(n):o(n,t+"")):n},Nn.trimRight=function(n,t,r){var e=n;return(n=u(n))?(r?Ur(e,t,r):null==t)?n.slice(0,y(n)+1):n.slice(0,i(n,t+"")+1):n;
+},Nn.trunc=function(n,t,r){r&&Ur(n,t,r)&&(t=w);var e=U;if(r=W,null!=t)if(ge(t)){var o="separator"in t?t.separator:o,e="length"in t?+t.length||0:e;r="omission"in t?u(t.omission):r}else e=+t||0;if(n=u(n),e>=n.length)return n;if(e-=r.length,1>e)return r;if(t=n.slice(0,e),null==o)return t+r;if(we(o)){if(n.slice(e).search(o)){var i,f=n.slice(0,e);for(o.global||(o=Ze(o.source,(kn.exec(o)||"")+"g")),o.lastIndex=0;n=o.exec(f);)i=n.index;t=t.slice(0,null==i?e:i)}}else n.indexOf(o,e)!=e&&(o=t.lastIndexOf(o),
+-1<o&&(t=t.slice(0,o)));return t+r},Nn.unescape=function(n){return(n=u(n))&&pn.test(n)?n.replace(ln,d):n},Nn.uniqueId=function(n){var t=++tu;return u(n)+t},Nn.words=$e,Nn.all=te,Nn.any=ie,Nn.contains=ee,Nn.eq=he,Nn.detect=ro,Nn.foldl=lo,Nn.foldr=so,Nn.head=Kr,Nn.include=ee,Nn.inject=lo,Te(Nn,function(){var n={};return _t(Nn,function(t,r){Nn.prototype[r]||(n[r]=t)}),n}(),false),Nn.sample=oe,Nn.prototype.sample=function(n){return this.__chain__||null!=n?this.thru(function(t){return oe(t,n)}):oe(this.value());
+},Nn.VERSION=b,Pn("bind bindKey curry curryRight partial partialRight".split(" "),function(n){Nn[n].placeholder=Nn}),Pn(["drop","take"],function(n,t){zn.prototype[n]=function(r){var e=this.__filtered__;if(e&&!t)return new zn(this);r=null==r?1:bu(yu(r)||0,0);var u=this.clone();return e?u.__takeCount__=xu(u.__takeCount__,r):u.__views__.push({size:r,type:n+(0>u.__dir__?"Right":"")}),u},zn.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}}),Pn(["filter","map","takeWhile"],function(n,t){
+var r=t+1,e=r!=T;zn.prototype[n]=function(n,t){var u=this.clone();return u.__iteratees__.push({iteratee:wr(n,t,1),type:r}),u.__filtered__=u.__filtered__||e,u}}),Pn(["first","last"],function(n,t){var r="take"+(t?"Right":"");zn.prototype[n]=function(){return this[r](1).value()[0]}}),Pn(["initial","rest"],function(n,t){var r="drop"+(t?"":"Right");zn.prototype[n]=function(){return this.__filtered__?new zn(this):this[r](1)}}),Pn(["pluck","where"],function(n,t){var r=t?"filter":"map",e=t?bt:ze;zn.prototype[n]=function(n){
+return this[r](e(n))}}),zn.prototype.compact=function(){return this.filter(Fe)},zn.prototype.reject=function(n,t){return n=wr(n,t,1),this.filter(function(t){return!n(t)})},zn.prototype.slice=function(n,t){n=null==n?0:+n||0;var r=this;return r.__filtered__&&(0<n||0>t)?new zn(r):(0>n?r=r.takeRight(-n):n&&(r=r.drop(n)),t!==w&&(t=+t||0,r=0>t?r.dropRight(-t):r.take(t-n)),r)},zn.prototype.takeRightWhile=function(n,t){return this.reverse().takeWhile(n,t).reverse()},zn.prototype.toArray=function(){return this.take(Ru);
+},_t(zn.prototype,function(n,t){var r=/^(?:filter|map|reject)|While$/.test(t),e=/^(?:first|last)$/.test(t),u=Nn[e?"take"+("last"==t?"Right":""):t];u&&(Nn.prototype[t]=function(){function t(n){return e&&i?u(n,1)[0]:u.apply(w,Jn([n],o))}var o=e?[1]:arguments,i=this.__chain__,f=this.__wrapped__,a=!!this.__actions__.length,c=f instanceof zn,l=o[0],s=c||Oo(f);return s&&r&&typeof l=="function"&&1!=l.length&&(c=s=false),l={func:ne,args:[t],thisArg:w},a=c&&!a,e&&!i?a?(f=f.clone(),f.__actions__.push(l),n.call(f)):u.call(w,this.value())[0]:!e&&s?(f=a?f:new zn(this),
+f=n.apply(f,o),f.__actions__.push(l),new Ln(f,i)):this.thru(t)})}),Pn("join pop push replace shift sort splice split unshift".split(" "),function(n){var t=(/^(?:replace|split)$/.test(n)?He:Je)[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:join|pop|replace|shift)$/.test(n);Nn.prototype[n]=function(){var n=arguments;return e&&!this.__chain__?t.apply(this.value(),n):this[r](function(r){return t.apply(r,n)})}}),_t(zn.prototype,function(n,t){var r=Nn[t];if(r){var e=r.name+"";(Wu[e]||(Wu[e]=[])).push({
+name:t,func:r})}}),Wu[sr(w,A).name]=[{name:"wrapper",func:w}],zn.prototype.clone=function(){var n=new zn(this.__wrapped__);return n.__actions__=qn(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=qn(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=qn(this.__views__),n},zn.prototype.reverse=function(){if(this.__filtered__){var n=new zn(this);n.__dir__=-1,n.__filtered__=true}else n=this.clone(),n.__dir__*=-1;return n},zn.prototype.value=function(){
+var n,t=this.__wrapped__.value(),r=this.__dir__,e=Oo(t),u=0>r,o=e?t.length:0;n=o;for(var i=this.__views__,f=0,a=-1,c=i.length;++a<c;){var l=i[a],s=l.size;switch(l.type){case"drop":f+=s;break;case"dropRight":n-=s;break;case"take":n=xu(n,f+s);break;case"takeRight":f=bu(f,n-s)}}if(n={start:f,end:n},i=n.start,f=n.end,n=f-i,u=u?f:i-1,i=this.__iteratees__,f=i.length,a=0,c=xu(n,this.__takeCount__),!e||o<F||o==n&&c==n)return Tt(t,this.__actions__);e=[];n:for(;n--&&a<c;){for(u+=r,o=-1,l=t[u];++o<f;){var p=i[o],s=p.type,p=p.iteratee(l);
+if(s==T)l=p;else if(!p){if(s==N)continue n;break n}}e[a++]=l}return e},Nn.prototype.chain=function(){return Qr(this)},Nn.prototype.commit=function(){return new Ln(this.value(),this.__chain__)},Nn.prototype.concat=Qu,Nn.prototype.plant=function(n){for(var t,r=this;r instanceof Tn;){var e=Mr(r);t?u.__wrapped__=e:t=e;var u=e,r=r.__wrapped__}return u.__wrapped__=n,t},Nn.prototype.reverse=function(){function n(n){return n.reverse()}var t=this.__wrapped__;return t instanceof zn?(this.__actions__.length&&(t=new zn(this)),
+t=t.reverse(),t.__actions__.push({func:ne,args:[n],thisArg:w}),new Ln(t,this.__chain__)):this.thru(n)},Nn.prototype.toString=function(){return this.value()+""},Nn.prototype.run=Nn.prototype.toJSON=Nn.prototype.valueOf=Nn.prototype.value=function(){return Tt(this.__wrapped__,this.__actions__)},Nn.prototype.collect=Nn.prototype.map,Nn.prototype.head=Nn.prototype.first,Nn.prototype.select=Nn.prototype.filter,Nn.prototype.tail=Nn.prototype.rest,Nn}var w,b="3.10.1",x=1,A=2,j=4,k=8,I=16,R=32,O=64,E=128,C=256,U=30,W="...",$=150,S=16,F=200,N=1,T=2,L="Expected a function",z="__lodash_placeholder__",B="[object Arguments]",D="[object Array]",M="[object Boolean]",q="[object Date]",P="[object Error]",K="[object Function]",V="[object Number]",Z="[object Object]",Y="[object RegExp]",G="[object String]",J="[object ArrayBuffer]",X="[object Float32Array]",H="[object Float64Array]",Q="[object Int8Array]",nn="[object Int16Array]",tn="[object Int32Array]",rn="[object Uint8Array]",en="[object Uint8ClampedArray]",un="[object Uint16Array]",on="[object Uint32Array]",fn=/\b__p\+='';/g,an=/\b(__p\+=)''\+/g,cn=/(__e\(.*?\)|\b__t\))\+'';/g,ln=/&(?:amp|lt|gt|quot|#39|#96);/g,sn=/[&<>"'`]/g,pn=RegExp(ln.source),hn=RegExp(sn.source),_n=/<%-([\s\S]+?)%>/g,vn=/<%([\s\S]+?)%>/g,gn=/<%=([\s\S]+?)%>/g,yn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/,dn=/^\w*$/,mn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g,wn=/^[:!,]|[\\^$.*+?()[\]{}|\/]|(^[0-9a-fA-Fnrtuvx])|([\n\r\u2028\u2029])/g,bn=RegExp(wn.source),xn=/[\u0300-\u036f\ufe20-\ufe23]/g,An=/\\(\\)?/g,jn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,kn=/\w*$/,In=/^0[xX]/,Rn=/^\[object .+?Constructor\]$/,On=/^\d+$/,En=/[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g,Cn=/($^)/,Un=/['\n\r\u2028\u2029\\]/g,Wn=RegExp("[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?=[A-Z\\xc0-\\xd6\\xd8-\\xde][a-z\\xdf-\\xf6\\xf8-\\xff]+)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+|[A-Z\\xc0-\\xd6\\xd8-\\xde]+|[0-9]+","g"),$n="Array ArrayBuffer Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Math Number Object RegExp Set String _ clearTimeout isFinite parseFloat parseInt setTimeout TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap".split(" "),Sn={};
+Sn[X]=Sn[H]=Sn[Q]=Sn[nn]=Sn[tn]=Sn[rn]=Sn[en]=Sn[un]=Sn[on]=true,Sn[B]=Sn[D]=Sn[J]=Sn[M]=Sn[q]=Sn[P]=Sn[K]=Sn["[object Map]"]=Sn[V]=Sn[Z]=Sn[Y]=Sn["[object Set]"]=Sn[G]=Sn["[object WeakMap]"]=false;var Fn={};Fn[B]=Fn[D]=Fn[J]=Fn[M]=Fn[q]=Fn[X]=Fn[H]=Fn[Q]=Fn[nn]=Fn[tn]=Fn[V]=Fn[Z]=Fn[Y]=Fn[G]=Fn[rn]=Fn[en]=Fn[un]=Fn[on]=true,Fn[P]=Fn[K]=Fn["[object Map]"]=Fn["[object Set]"]=Fn["[object WeakMap]"]=false;var Nn={"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a",
+"\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y",
+"\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss"},Tn={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","`":"&#96;"},Ln={"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'","&#96;":"`"},zn={"function":true,object:true},Bn={0:"x30",1:"x31",2:"x32",3:"x33",4:"x34",5:"x35",6:"x36",7:"x37",8:"x38",9:"x39",A:"x41",B:"x42",C:"x43",D:"x44",E:"x45",F:"x46",a:"x61",b:"x62",c:"x63",d:"x64",e:"x65",f:"x66",n:"x6e",r:"x72",t:"x74",u:"x75",v:"x76",x:"x78"},Dn={"\\":"\\",
+"'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Mn=zn[typeof exports]&&exports&&!exports.nodeType&&exports,qn=zn[typeof module]&&module&&!module.nodeType&&module,Pn=zn[typeof self]&&self&&self.Object&&self,Kn=zn[typeof window]&&window&&window.Object&&window,Vn=qn&&qn.exports===Mn&&Mn,Zn=Mn&&qn&&typeof global=="object"&&global&&global.Object&&global||Kn!==(this&&this.window)&&Kn||Pn||this,Yn=m();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(Zn._=Yn, define(function(){
+return Yn})):Mn&&qn?Vn?(qn.exports=Yn)._=Yn:Mn._=Yn:Zn._=Yn}).call(this); \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/.bower.json
new file mode 100644
index 00000000000..6831d956474
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/.bower.json
@@ -0,0 +1,33 @@
+{
+ "name": "marked",
+ "homepage": "https://github.com/markedjs/marked",
+ "authors": [
+ "Christopher Jeffrey <chjjeffrey@gmail.com>"
+ ],
+ "description": "A markdown parser built for speed",
+ "keywords": [
+ "markdown",
+ "markup",
+ "html"
+ ],
+ "main": "lib/marked.js",
+ "license": "MIT",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "app/bower_components",
+ "test",
+ "tests"
+ ],
+ "version": "0.4.0",
+ "_release": "0.4.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "0.4.0",
+ "commit": "78db8fb774afa651c87fdb09af2a0160e4f4619f"
+ },
+ "_source": "https://github.com/chjj/marked.git",
+ "_target": "^0.4.0",
+ "_originalSource": "marked"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/LICENSE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/LICENSE.md
new file mode 100644
index 00000000000..64b41a0e463
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/LICENSE.md
@@ -0,0 +1,43 @@
+# License information
+
+## Contribution License Agreement
+
+If you contribute code to this project, you are implicitly allowing your code
+to be distributed under the MIT license. You are also implicitly verifying that
+all code is your original work. `</legalese>`
+
+## Marked
+
+Copyright (c) 2011-2018, Christopher Jeffrey (https://github.com/chjj/)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+## Markdown
+
+Copyright © 2004, John Gruber
+http://daringfireball.net/
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+* Neither the name “Markdown” nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+This software is provided by the copyright holders and contributors “as is” and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall the copyright owner or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/Makefile b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/Makefile
new file mode 100644
index 00000000000..7deead54c14
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/Makefile
@@ -0,0 +1,15 @@
+all:
+ @cp lib/marked.js marked.js
+ @uglifyjs --comments '/\*[^\0]+?Copyright[^\0]+?\*/' -o marked.min.js lib/marked.js
+
+clean:
+ @rm marked.js
+ @rm marked.min.js
+
+bench:
+ @node test --bench
+
+man/marked.1.txt:
+ groff -man -Tascii man/marked.1 | col -b > man/marked.1.txt
+
+.PHONY: clean all
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/README.md
new file mode 100644
index 00000000000..7d3af293786
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/README.md
@@ -0,0 +1,67 @@
+<a href="https://marked.js.org">
+ <img width="60px" height="60px" src="https://marked.js.org/img/logo-black.svg" align="right" />
+</a>
+
+# Marked
+
+[![npm](https://img.shields.io/npm/v/marked.svg)](https://www.npmjs.com/package/marked)
+[![gzip size](http://img.badgesize.io/https://cdn.jsdelivr.net/npm/marked@0.3.19/marked.min.js?compression=gzip)](https://cdn.jsdelivr.net/npm/marked@0.3.19/marked.min.js)
+[![install size](https://packagephobia.now.sh/badge?p=marked@0.3.19)](https://packagephobia.now.sh/result?p=marked@0.3.19)
+[![downloads](https://img.shields.io/npm/dt/marked.svg)](https://www.npmjs.com/package/marked)
+[![travis](https://travis-ci.org/markedjs/marked.svg?branch=master)](https://travis-ci.org/markedjs/marked)
+
+- ⚡ built for speed
+- ⬇️ low-level compiler for parsing markdown without caching or blocking for long periods of time
+- ⚖️ light-weight while implementing all markdown features from the supported flavors & specifications
+- 🌐 works in a browser, on a server, or from a command line interface (CLI)
+
+## Demo
+
+Checkout the [demo page](https://marked.js.org/demo/) to see marked in action ⛹️
+
+## Docs
+
+Our [documentation pages](https://marked.js.org) are also rendered using marked 💯
+
+## Installation
+
+**CLI:** `npm install -g marked`
+
+**In-browser:** `npm install marked --save`
+
+## Usage
+
+**CLI**
+
+``` bash
+$ marked -o hello.html
+hello world
+^D
+$ cat hello.html
+<p>hello world</p>
+```
+
+**Browser**
+
+```html
+<!doctype html>
+<html>
+<head>
+ <meta charset="utf-8"/>
+ <title>Marked in the browser</title>
+</head>
+<body>
+ <div id="content"></div>
+ <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
+ <script>
+ document.getElementById('content').innerHTML =
+ marked('# Marked in the browser\n\nRendered by **marked**.');
+ </script>
+</body>
+</html>
+```
+
+## License
+
+Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/bin/marked b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/bin/marked
new file mode 100755
index 00000000000..09e55943331
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/bin/marked
@@ -0,0 +1,199 @@
+#!/usr/bin/env node
+
+/**
+ * Marked CLI
+ * Copyright (c) 2011-2013, Christopher Jeffrey (MIT License)
+ */
+
+var fs = require('fs'),
+ path = require('path'),
+ marked = require('../');
+
+/**
+ * Man Page
+ */
+
+function help() {
+ var spawn = require('child_process').spawn;
+
+ var options = {
+ cwd: process.cwd(),
+ env: process.env,
+ setsid: false,
+ stdio: 'inherit'
+ };
+
+ spawn('man', [path.resolve(__dirname, '/../man/marked.1')], options)
+ .on('error', function() {
+ fs.readFile(path.resolve(__dirname, '/../man/marked.1.txt'), 'utf8', function(err, data) {
+ if (err) throw err;
+ console.log(data);
+ });
+ });
+}
+
+/**
+ * Main
+ */
+
+function main(argv, callback) {
+ var files = [],
+ options = {},
+ input,
+ output,
+ string,
+ arg,
+ tokens,
+ opt;
+
+ function getarg() {
+ var arg = argv.shift();
+
+ if (arg.indexOf('--') === 0) {
+ // e.g. --opt
+ arg = arg.split('=');
+ if (arg.length > 1) {
+ // e.g. --opt=val
+ argv.unshift(arg.slice(1).join('='));
+ }
+ arg = arg[0];
+ } else if (arg[0] === '-') {
+ if (arg.length > 2) {
+ // e.g. -abc
+ argv = arg.substring(1).split('').map(function(ch) {
+ return '-' + ch;
+ }).concat(argv);
+ arg = argv.shift();
+ } else {
+ // e.g. -a
+ }
+ } else {
+ // e.g. foo
+ }
+
+ return arg;
+ }
+
+ while (argv.length) {
+ arg = getarg();
+ switch (arg) {
+ case '--test':
+ return require('../test').main(process.argv.slice());
+ case '-o':
+ case '--output':
+ output = argv.shift();
+ break;
+ case '-i':
+ case '--input':
+ input = argv.shift();
+ break;
+ case '-s':
+ case '--string':
+ string = argv.shift();
+ break;
+ case '-t':
+ case '--tokens':
+ tokens = true;
+ break;
+ case '-h':
+ case '--help':
+ return help();
+ default:
+ if (arg.indexOf('--') === 0) {
+ opt = camelize(arg.replace(/^--(no-)?/, ''));
+ if (!marked.defaults.hasOwnProperty(opt)) {
+ continue;
+ }
+ if (arg.indexOf('--no-') === 0) {
+ options[opt] = typeof marked.defaults[opt] !== 'boolean'
+ ? null
+ : false;
+ } else {
+ options[opt] = typeof marked.defaults[opt] !== 'boolean'
+ ? argv.shift()
+ : true;
+ }
+ } else {
+ files.push(arg);
+ }
+ break;
+ }
+ }
+
+ function getData(callback) {
+ if (!input) {
+ if (files.length <= 2) {
+ if (string) {
+ return callback(null, string);
+ }
+ return getStdin(callback);
+ }
+ input = files.pop();
+ }
+ return fs.readFile(input, 'utf8', callback);
+ }
+
+ return getData(function(err, data) {
+ if (err) return callback(err);
+
+ data = tokens
+ ? JSON.stringify(marked.lexer(data, options), null, 2)
+ : marked(data, options);
+
+ if (!output) {
+ process.stdout.write(data + '\n');
+ return callback();
+ }
+
+ return fs.writeFile(output, data, callback);
+ });
+}
+
+/**
+ * Helpers
+ */
+
+function getStdin(callback) {
+ var stdin = process.stdin,
+ buff = '';
+
+ stdin.setEncoding('utf8');
+
+ stdin.on('data', function(data) {
+ buff += data;
+ });
+
+ stdin.on('error', function(err) {
+ return callback(err);
+ });
+
+ stdin.on('end', function() {
+ return callback(null, buff);
+ });
+
+ try {
+ stdin.resume();
+ } catch (e) {
+ callback(e);
+ }
+}
+
+function camelize(text) {
+ return text.replace(/(\w)-(\w)/g, function(_, a, b) {
+ return a + b.toUpperCase();
+ });
+}
+
+/**
+ * Expose / Entry Point
+ */
+
+if (!module.parent) {
+ process.title = 'marked';
+ main(process.argv.slice(), function(err, code) {
+ if (err) throw err;
+ return process.exit(code || 0);
+ });
+} else {
+ module.exports = main;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/bower.json
new file mode 100644
index 00000000000..57c91f030fc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/bower.json
@@ -0,0 +1,23 @@
+{
+ "name": "marked",
+ "homepage": "https://github.com/markedjs/marked",
+ "authors": [
+ "Christopher Jeffrey <chjjeffrey@gmail.com>"
+ ],
+ "description": "A markdown parser built for speed",
+ "keywords": [
+ "markdown",
+ "markup",
+ "html"
+ ],
+ "main": "lib/marked.js",
+ "license": "MIT",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "app/bower_components",
+ "test",
+ "tests"
+ ]
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/component.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/component.json
new file mode 100644
index 00000000000..7ebd0356cc1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/component.json
@@ -0,0 +1,10 @@
+{
+ "name": "marked",
+ "version": "0.3.4",
+ "repo": "markedjs/marked",
+ "description": "A markdown parser built for speed",
+ "keywords": ["markdown", "markup", "html"],
+ "scripts": ["lib/marked.js"],
+ "main": "lib/marked.js",
+ "license": "MIT"
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/AUTHORS.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/AUTHORS.md
new file mode 100644
index 00000000000..d44bf5f0ebd
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/AUTHORS.md
@@ -0,0 +1,164 @@
+# Authors
+
+Marked takes an encompassing approach to its community. As such, you can think of these as [concentric circles](https://medium.com/the-node-js-collection/healthy-open-source-967fa8be7951), where each subsequent group is enveloped by the previous one.
+
+## Users
+
+Users are anyone using Marked in some fashion, without them, there's no reason for us to exist.
+
+|Individual or Organization |Website |Project |Submitted by |
+|:--------------------------|:-----------------------|:------------------------------------|:---------------------------------------------------|
+|MarkedJS |https://marked.js.org |https://github.com/markedjs/marked |The marked committers |
+
+To be listed: All fields are optional. Contact any of the committers or, more timely, submit a pull request with the following (using the first row as an example):
+
+- **Individual or Organization:** The name you would like associated with the record.
+- **Website:** A URL to a standalone website for the project.
+- **Project:** A URL for the repository of the project using marked.
+- **Submitted by:** The name and optional honorifics for the person adding the listing.
+
+To be removed: Same as above. Only instead of requesting addition request deletion or delete the row yourself.
+
+## Contributors
+
+Contributors are users who submit a [PR](https://github.com/markedjs/marked/pulls), [Issue](https://github.com/markedjs/marked/issues), or collaborate in making Marked a better product and experience for all the users.
+
+|Name |GitHub handle |Badge of honor |
+|:-------------------|:----------------|:---------------------------------------------|
+|Brandon der Blätter |@intcreator |Curious Contributor |
+|Carlos Valle |@carlosvalle |Maker of the Marked mark from 2018 to present |
+|Federico Soave |@Feder1co5oave |Regent of the Regex, Master of Marked |
+|Karen Yavine |@karenyavine |Snyk's Security Saint |
+|Костя Третяк |@KostyaTretyak |-- |
+|Tom Theisen |@tomtheisen |Defibrillator |
+
+To be listed: make a contribution and, if it has significant impact, the committers may be able to add you here.
+
+To be removed: please let us know or submit a PR.
+
+[Details on badges](#badges)
+
+## Committers
+
+Committers are contributors who also have the responsibility, privilege, some might even say burden of being able to review and merge contributions (just usually not their own).
+
+A note on "decision making authority". This is related to submitting PRs and the [advice process](http://www.reinventingorganizationswiki.com/Decision_Making). The person marked as having decision making authority over a certain area should be sought for advice in that area before committing to a course of action.
+
+|Name |GitHub handle |Decision making |Badges of honor (tag for questions) |
+|:--------------|:---------------|:----------------------------------------|:------------------------------------|
+|Jamie Davis |@davisjam |Seeker of Security | |
+|Tony Brix |@UziTech |Titan of the test harness and Dr. DevOps | |
+
+**Should not exceed 5:** For larger PRs affecting more of the codebase and, most likely, review by more people, we try to keep this pool small and responsive and let those with decision making authority have final say without negative repercussions from the other committers.
+
+To be listed: Committers are usually selected (or they volunteer, using the same process) from contributors who enter the discussions regarding the future direction of Marked (maybe even doing informal reviews of contributions despite not being able to merge them yourself).
+
+To be removed: You can remove yourself through the [GitHub UI](https://help.github.com/articles/removing-yourself-from-a-collaborator-s-repository/).
+
+A note on volunteering:
+
+1. Please do not volunteer unless you believe you can demonstrate to your peers you can do the work required.
+2. Please do not overcommit yourself; we count on those committed to the project to be responsive. Really consider, with all you have going on, wehther you able to really commit to it.
+3. Don't let the previous frighten you away, it can always be changed later by you or your peers.
+
+[Details on badges](#badges)
+
+## Admins
+
+Admins are committers who also have the responsibility, privilege, and burden of selecting committers and making sure the project itself runs smoothly, which includes community maintenance, governance, dispute resolution, and so on. (Letting the contributors easily enter into, and work within, the project to begin contributing, with as little friction as possible.)
+
+|Name |GitHub handle |Decision making |Badges of honor (tag for questions) |
+|:--------------|:---------------|:----------------------------------------|:------------------------------------|
+|Steven |@styfle |Open source, of course and GitHub Guru |Humaning Helper |
+
+**Should not exceed 3:** When there are too many people with the ability to reolves disputes, the dispute itself can quickly turn into a dispute amongst the admins themselves; therefore, we want this group to be small enough to commit to action and large enough to not put too much burden on one person. (Should ensure faster resolution and responsiveness.)
+
+To be listed: Admins are usually selected from the pool of committers (or they volunteer, using the same process) who demonstrate good understanding of the marked culture, operations, and do their best to help new contributors get up to speed on how to contribute effectively to the project.
+
+To be removed: You can remove yourself through the [GitHub UI](https://help.github.com/articles/removing-yourself-from-a-collaborator-s-repository/).
+
+[Details on badges](#badges)
+
+## Publishers
+
+Publishers are admins who also have the responsibility, privilege, and burden of publishing the new releases to NPM and performing outreach and external stakeholder communications. Further, when things go pear-shaped, they're the ones taking most of the heat. Finally, when things go well, they're the primary ones praising the contributors who made it possible.
+
+(In other words, while Admins are focused primarily on the internal workings of the project, Publishers are focused on internal *and* external concerns.)
+
+|Name |GitHub handle |Decision making |Badges of honor (tag for questions) |
+|:----------|:--------------|:------------------------|:-------------------------------------|
+|Josh Bruce |@joshbruce |Release Wrangler |Humaning Helper, Heckler of Hypertext |
+
+**Should not exceed 2:** Having more people with the authority to publish a release can quickly turn into a consensus seeking nightmare (design by committee). Having only one is preferred (Directly Responsible Individual); however, given the nature of the project and its history, having an immediate fallback, and a potential deep fallback (Original author) is probably a good idea.
+
+[Details on badges](#badges)
+
+## Original author
+
+The original author is the publisher who started it all.
+
+Christopher Jeffrey @chjj
+
+<h2 id="badges">Badges</h2>
+
+Badges? You don't *need* no stinkin' badges.
+
+Movie references aside. (It was either that or, "Let's play a game", but that would have been creepy&hellip;that's why it will most likely come later.)
+
+Badges? If you *want* 'em, we got 'em, and here's how you get 'em (and&hellip;dramatic pause&hellip;why not two dramatic pauses for emphasis?&hellip; how they can be taken away).
+
+- [ ] Add the appropriate badge to the desired contributor in the desired column of this page, even if they're not listed here yet.
+- [ ] Submit a PR (we're big on PRs around here, if you haven't noticed, help us help you).
+- [ ] Follow the instructions for submitting a badge PR. (There are more details to find within. Come on. Everybody likes surprises, right? No? Actually, we just try to put documentation where it belongs, closer to the code and part of the sequence of events.)
+
+### Badges at play:
+
+<dl>
+ <dt>Curious Contributor</dt>
+ <dd>A contributor with less than one year on this page who is actively engaged in submitting PRs, Issues, making recommendations, sharing thoughts&hellip;without being too annoying about it (let's be clear, submitting 100 Issues recommending the Marked Committers send everyone candy is trying for the badge, not honestly earning it).</dd>
+ <dt>Dr. DevOps</dt>
+ <dd>
+ <p>Someone who understands and contributes to improving the developer experience and flow of Marked into the world.</p>
+ <blockquote>
+ "The main characteristic of the DevOps movement is to strongly advocate automation and monitoring at all steps of software construction, from integration, testing, releasing to deployment and infrastructure management. DevOps aims at shorter development cycles, increased deployment frequency, more dependable releases, in close alignment with business objectives." ~ <a href="https://www.wikipedia.org/wiki/DevOps">Wikipedia</a>
+ </blockquote>
+ </dd>
+ <dt>Eye for the CLI</dt>
+ <dd>At this point? Pretty much anyone who can update that `man` file to the current Marked version without regression in the CLI tool itself.</dd>
+ <dt>GitHub Guru</dt>
+ <dd>Someone who always seems to be able to tell you easier ways to do things with GitHub.</dd>
+ <dt>Humaning Helper</dt>
+ <dd>Someone who goes out of their way to help contributors feel welcomed and valued. Further, someone who takes the extra steps(s) necessary to help new contributors get up to speed. Finally, they maintain composure even in times of disagreement and dispute resolution.</dd>
+ <dt>Heckler of Hypertext</dt>
+ <dd>Someone who demonstrates an esoteric level of knowledge when it comes to HTML. In other words, someone who says things like, "Did you know most Markdown flavors don't have a way to render a description list (`dl`)? All the more reason Markdown `!==` HTML."</dd>
+ <dt>Markdown Maestro</dt>
+ <dd>You know that person who knows about way too many different flavors of Markdown? The one who maybe seems a little too obsessed with the possibilities of Markdown beyond HTML? Come on. You know who they are. Or, at least you could, if you give them this badge.</dd>
+ <dt>Master of Marked</dt>
+ <dd>Someone who demonstrates they know the ins and outs of the codebase for Marked.</dd>
+ <dt>Open source, of course</dt>
+ <dd>Someone who advocates for and has a proven understanding of how to operate within open source communities.</dd>
+ <dt>Regent of the Regex</dt>
+ <dd><p>Can you demonstrate you understand the following without Google and Stackoverflow?</p>
+ <p><code>/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/</code></p>
+ <p>Because this author can't yet. That's who gets these.</p>
+ </dd>
+ <dt>Seeker of Security</dt>
+ <dd>Someone who has demonstrated a high degree of expertise or authority when it comes to software security.</dd>
+ <dt>Titan of the Test Harness</dt>
+ <dd>Someone who demonstrates high-levels of understanding regarding Marked's test harness.</dd>
+ <dt>Totally Tron</dt>
+ <dd>Someone who demonstrates they are willing and able to "fight for the users", both developers dependent on marked to do their jobs as well as end-users interacting with the output (particularly in the realm of those with the disabilities).</dd>
+</dl>
+
+### Special badges that come with the job:
+
+<dl>
+ <dt>Defibrillator</dt>
+ <dd>A contributor who stepped up to help bring Marked back to life by contriuting solutions to help Marked pass when compared against the CommonMark and GitHub Flavored Markdown specifications.</dd>
+ <dt>Maker of the Marked mark</dt>
+ <dd>This badge is given to the person or oganization credited with creating the logo (or logotype) used in Marked communications for a given period of time. **Maker of the Marked mark from 2017 to present**, for example.</dd>
+ <dt>Release Wrangler</dt>
+ <dd>This is a badge given to all Publishers.</dd>
+ <dt>Snyk's Security Saint</dt>
+ <dd>This is a badge given to whomever primarily reaches out from Snyk to let us know about security issues.</dd>
+</dl>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/CNAME b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/CNAME
new file mode 100644
index 00000000000..c92fdfcbd4a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/CNAME
@@ -0,0 +1 @@
+marked.js.org
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/CODE_OF_CONDUCT.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/CODE_OF_CONDUCT.md
new file mode 100644
index 00000000000..5335399ba99
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/CODE_OF_CONDUCT.md
@@ -0,0 +1,74 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, gender identity and expression, level of experience,
+nationality, personal appearance, race, religion, or sexual identity and
+orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+ address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to block temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team by submitting a PR with changes to the [AUTHORS](#/AUTHORS.md) page (or emailing josh@8fold.com). All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version [1.4][version].
+
+[homepage]: https://www.contributor-covenant.org/
+[version]: https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/CONTRIBUTING.md
new file mode 100644
index 00000000000..ce5f0c387e4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/CONTRIBUTING.md
@@ -0,0 +1,95 @@
+# Contributing to Marked
+
+- [ ] Fork `markedjs/marked`.
+- [ ] Clone the library locally using GitHub Desktop or the command line.
+- [ ] Make sure you are on the `master` branch.
+- [ ] Be sure to run `npm install` or `npm update`.
+- [ ] Create a branch.
+- [ ] Make as small a change as possible.
+- [ ] Run `npm test`, fix any broken things (for linting, you can run `npm run lint` to have the linter fix them for you).
+- [ ] Submit a PR.
+
+## Design principles
+
+Marked tends to favor following the SOLID set of software design and development principles; mainly the [single responsibility](https://en.wikipedia.org/wiki/Single_responsibility_principle) and [open/closed principles](https://en.wikipedia.org/wiki/Open/closed_principle):
+
+- **Single responsibility:** Marked, and the components of Marked, have the single responsibility of converting Markdown strings into HTML.
+- **Open/closed:** Marked favors giving developers the means to easily extend the library and its components over changing Marked's behavior through configuration options.
+
+## Priorities
+
+We think we have our priorities sorted to build quality in.
+
+The following table lists the ticket type labels we use when there is work to be done on the code either through an Issue or a PR; in priority order.
+
+|Ticket type label |Description |
+|:----------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+|L0 - security |A security vulnerability within the Marked library is discovered. |
+|L1 - broken |Valid usage results in incorrect output compared to [supported specifications](#/README.md#specifications) OR causes marked to crash AND there is no known workaround for the issue. |
+|L2 - annoying |Similar to L1 - broken only there is a known workaround avaialable for the issue. |
+|RR - refactor and re-engineer |Results in an improvement to developers using Marked (improved readability) or end-users (faster performance) or both. |
+|NFS - new feature (spec related) |A capability Marked does not currently provide but is in one of the [supported specifications](#/README.md#specifications) |
+|NFU - new feature (user requested) |A capability Marked does not currently provide but has been requested by users of Marked. |
+
+## Test early, often, and everything
+
+We try to write test cases to validate output (writing tests based on the [supported specifications](#/README.md#specifications)) and minimize regression (writing tests for issues fixed). Therefore, if you would like to contribute, some things you should know regarding the test harness.
+
+|Location |Description |
+|:-------------|:---------------------------------------------------|
+|/test/browser |For testing Marked in a client-side implementation. |
+|/test/new |Tests not related to the original `markdown.pl`. |
+|/test/original|Tests validating against the original `markdown.pl`.|
+
+If your test uses features or options, assuming `gfm` is set to `false`, for example, you can add [front-matter](https://www.npmjs.com/package/front-matter) to the top of
+your `.md` file
+
+``` yml
+---
+gfm: false
+---
+```
+
+## Submitting PRs and Issues
+
+Marked provides templates for submitting both pull requests and issues. When you begin creating a new PR or issue, you will see instructions on using the template.
+
+The PR templates include checklists for both the submitter and the reviewer, which, in most cases, will not be the same person.
+
+## Scripts
+
+When it comes to NPM commands, we try to use the native scripts provided by the NPM framework.
+
+To run the tests:
+
+``` bash
+npm test
+```
+
+To test whether you are using the standard syntax rules for the project:
+
+```bash
+npm run test:lint
+```
+
+To see time comparisons between Marked and other popular Markdown libraries:
+
+```bash
+npm run bench
+```
+
+To check for (and fix) standardized syntax (lint):
+
+```bash
+npm run lint
+```
+
+To build your own minified version of Marked:
+
+```bash
+npm run build
+```
+
+## Publishing
+
+Creating GitHub releases and publishing to NPM is limited to conributors and owners. If you would like more information, please see our [publishing documentation](#/PUBLISHING.md).
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/PUBLISHING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/PUBLISHING.md
new file mode 100644
index 00000000000..27937c2f2f2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/PUBLISHING.md
@@ -0,0 +1,24 @@
+# Releasing Marked
+
+- [ ] See [contributing](#/CONTRIBUTING.md)
+- [ ] Create release branch from `master` (`release-x.y.z`)
+- [ ] Submit PR with minimal name: Release x.y.z
+- [ ] Complete PR checklists
+
+## Overall strategy
+
+**Master is always shippable:** We try to merge PRs in such a way that `master` is the only branch to really be concerned about *and* `master` can always be released. This allows smoother flow between new fetures, bug fixes, and so on. (Almost a continuous deployment setup, without automation.)
+
+## Versioning
+
+We follow [semantic versioning](https://semver.org) where the following sequence is true `[major].[minor].[patch]`; therefore, consider the following implications of the release you are preparing:
+
+1. **Major:** There is at least one change not deemed backward compatible.
+2. **Minor:** There is at least one new feature added to the release.
+3. **Patch:** No breaking changes, no new features.
+
+What to expect while Marked is a zero-major (0.x.y):
+
+1. The major will remain at zero; thereby, alerting consumers to the potentially volatile nature of the package.
+2. The minor will tend to be more analagous to a `major` release.
+3. The patch will tend to be more analagous to a `minor` release or a collection of bug fixes (patches).
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/README.md
new file mode 100644
index 00000000000..6df149b8607
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/README.md
@@ -0,0 +1,112 @@
+<ul>
+ <li><a href="#marked">About</a></li>
+ <li><a href="#demo">Demo</a></li>
+ <li><a href="#installation">Installation</a></li>
+ <li><a href="#usage">Usage</a></li>
+ <li><a href="#specifications">Supported Markdown specifications</a></li>
+ <li><a href="#security">Security</a></li>
+ <li><a href="#contributing">Contributing</a></li>
+ <li><a href="#authors">Authors</a></li>
+ <li><a href="#license">License</a></li>
+</ul>
+
+<h2 id="marked">Marked</h2>
+
+Marked is
+
+1. built for speed.<sup>*</sup>
+2. a low-level markdown compiler for parsing markdown without caching or blocking for long periods of time.<sup>**</sup>
+3. light-weight while implementing all markdown features from the supported flavors & specifications.<sup>***</sup>
+4. available as a command line interface (CLI) and running in client- or server-side JavaScript projects.
+
+<p><small><sup>*</sup> Still working on metrics for comparative analysis and definition.</small><br>
+<small><sup>**</sup> As few dependencies as possible.</small><br>
+<small><sup>***</sup> Strict compliance could result in slower processing when running comparative benchmarking.</small></p>
+
+
+<h2 id="demo">Demo</h2>
+
+Checkout the [demo page](./demo/) to see marked in action ⛹️
+
+These documentation pages are also rendered using marked 💯
+
+
+<h2 id="installation">Installation</h2>
+
+**CLI:** `npm install -g marked`
+
+**In-browser:** `npm install marked --save`
+
+<h2 id="usage">Usage</h2>
+
+**CLI**
+
+``` bash
+$ marked -o hello.html
+hello world
+^D
+$ cat hello.html
+<p>hello world</p>
+```
+
+``` bash
+$ marked -s "*hello world*"
+<p><em>hello world</em></p>
+```
+
+**Browser**
+
+```html
+<!doctype html>
+<html>
+<head>
+ <meta charset="utf-8"/>
+ <title>Marked in the browser</title>
+</head>
+<body>
+ <div id="content"></div>
+ <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
+ <script>
+ document.getElementById('content').innerHTML =
+ marked('# Marked in browser\n\nRendered by **marked**.');
+ </script>
+</body>
+</html>
+```
+
+
+Marked offers [advanced configurations](#/USING_ADVANCED.md) and [extensibility](#/USING_PRO.md) as well.
+
+<h2 id="specifications">Supported Markdown specifications</h2>
+
+We actively support the features of the following [Markdown flavors](https://github.com/commonmark/CommonMark/wiki/Markdown-Flavors).
+
+|Flavor |Version |
+|:----------------------------------------------------------|:----------|
+|The original markdown.pl |-- |
+|[CommonMark](http://spec.commonmark.org/0.28/) |0.28 |
+|[GitHub Flavored Markdown](https://github.github.com/gfm/) |0.28 |
+
+By supporting the above Markdown flavors, it's possible that Marked can help you use other flavors as well; however, these are not actively supported by the community.
+
+<h2 id="security">Security</h2>
+
+The only completely secure system is the one that doesn't exist in the first place. Having said that, we take the security of Marked very seriously.
+
+Therefore, please disclose potential security issues by email to the project [committers](#/AUTHORS.md) as well as the [listed owners within NPM](https://docs.npmjs.com/cli/owner). We will provide an initial assessment of security reports within 48 hours and should apply patches within 2 weeks (also, feel free to contribute a fix for the issue).
+
+<h2 id="contributing">Contributing</h2>
+
+The marked community enjoys a spirit of collaboration and contribution from all comers. Whether you're just getting started with Markdown, JavaScript, and Marked or you're a veteran with it all figured out, we're here to help each other improve as professionals while helping Marked improve technically. Please see our [contributing documentation](#/CONTRIBUTING.md) for more details.
+
+For our Contribution License Agreement, see our [license](https://github.com/markedjs/marked/blob/master/LICENSE.md).
+
+<h2 id="authors">Authors</h2>
+
+For list of credited authors and contributors, please see our [authors page](#/AUTHORS.md).
+
+<h2 id="license">License</h2>
+
+Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)
+
+See [license](https://github.com/markedjs/marked/blob/master/LICENSE.md) for more details.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/USING_ADVANCED.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/USING_ADVANCED.md
new file mode 100644
index 00000000000..500eacc5337
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/USING_ADVANCED.md
@@ -0,0 +1,78 @@
+## The `marked` function
+
+```js
+marked(markdownString [,options] [,callback])
+```
+
+|Argument |Type |Notes |
+|:---------------------|:------------|:----------------------------------------------------------------------------------------------------|
+|markdownString |`string` |String of markdown source to be compiled. |
+|<a href="#options">options</a>|`object`|Hash of options. Can also use `marked.setOptions`. |
+|callback |`function` |Called when `markdownString` has been parsed. Can be used as second argument if no `options` present.|
+
+### Alternative using reference
+
+```js
+// Create reference instance
+var myMarked = require('marked');
+
+// Set options
+// `highlight` example uses `highlight.js`
+myMarked.setOptions({
+ renderer: new myMarked.Renderer(),
+ highlight: function(code) {
+ return require('highlight.js').highlightAuto(code).value;
+ },
+ pedantic: false,
+ gfm: true,
+ tables: true,
+ breaks: false,
+ sanitize: false,
+ smartLists: true,
+ smartypants: false,
+ xhtml: false
+});
+
+// Compile
+console.log(myMarked('I am using __markdown__.'));
+```
+
+<h2 id="options">Options</h2>
+
+|Member |Type |Default |Since |Notes |
+|:-----------|:---------|:--------|:--------|:-------------|
+|baseUrl |`string` |`null` |??? |A prefix url for any relative link. |
+|breaks |`boolean` |`false` |??? |If true, use GFM [hard](https://github.github.com/gfm/#hard-line-breaks) and [soft](https://github.github.com/gfm/#soft-line-breaks) line breaks. Requires `gfm` be `true`.|
+|gfm |`boolean` |`true` |??? |If true, use approved [GitHub Flavored Markdown (GFM) specification](https://github.github.com/gfm/).|
+|headerIds |`boolean` |`true` |v0.4.0 |If true, include an `id` attribute when emitting headings (h1, h2, h3, etc).|
+|headerPrefix|`string` |`''` |??? |A string to prefix the `id` attribute when emitting headings (h1, h2, h3, etc).|
+|highlight |`function`|`null` |??? |A function to highlight code blocks, see <a href="#highlight">Asynchronous highlighting</a>.|
+|langPrefix |`string` |`'language-'`|??? |A string to prefix the className in a `<code>` block. Useful for syntax highlighting.|
+|mangle |`boolean` |`true` |??? |??? |
+|pedantic |`boolean` |`false` |??? |If true, conform to the original `markdown.pl` as much as possible. Don't fix original markdown bugs or behavior. Turns off and overrides `gfm`.|
+|renderer |`object` |`new Renderer()`|???|An object containing functions to render tokens to HTML. See [extensibility](USING_PRO.md) for more details.|
+|sanitize |`boolean` |`false` |??? |If true, sanitize the HTML passed into `markdownString` with the `sanitizer` function.|
+|sanitizer |`function`|`null` |??? |A function to sanitize the HTML passed into `markdownString`.|
+|silent |`boolean` |`false` |??? |??? |
+|smartlists |`boolean` |`false` |??? |If true, use smarter list behavior than those found in `markdown.pl`.|
+|smartypants |`boolean` |`false` |??? |If true, use "smart" typographic punctuation for things like quotes and dashes.|
+|tables |`boolean` |`true` |??? |If true and `gfm` is true, use [GFM Tables extension](https://github.github.com/gfm/#tables-extension-).|
+|xhtml |`boolean` |`false` |??? |If true, emit self-closing HTML tags for void elements (&lt;br/&gt;, &lt;img/&gt;, etc.) with a "/" as required by XHTML.|
+
+<h2 id="highlight">Asynchronous highlighting</h2>
+
+Unlike `highlight.js` the `pygmentize.js` library uses asynchronous highlighting. This example demonstrates that marked is agnostic when it comes to the highlighter you use.
+
+```js
+myMarked.setOptions({
+ highlight: function(code, lang, callback) {
+ require('pygmentize-bundled') ({ lang: lang, format: 'html' }, code, function (err, result) {
+ callback(err, result.toString());
+ });
+ }
+});
+
+console.log(myMarked(markdownString));
+```
+
+In both examples, `code` is a `string` representing the section of code to pass to the highlighter. In this example, `lang` is a `string` informing the highlighter what programming lnaguage to use for the `code` and `callback` is the `function` the asynchronous highlighter will call once complete.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/USING_PRO.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/USING_PRO.md
new file mode 100644
index 00000000000..e14658ad439
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/USING_PRO.md
@@ -0,0 +1,157 @@
+## Extending Marked
+
+To champion the single-reponsibility and open/closed prinicples, we have tried to make it relatively painless to extend marked. If you are looking to add custom functionality, this is the place to start.
+
+<ul>
+ <li><a href="#renderer">The renderer</a></li>
+ <li><a href="#lexer">The lexer</a></li>
+ <li><a href="#parser">The parser</a></li>
+</ul>
+
+<h2 id="renderer">The renderer</h2>
+
+The renderer is...
+
+**Example:** Overriding default heading token by adding an embedded anchor tag like on GitHub.
+
+```js
+// Create reference instance
+var myMarked = require('marked');
+
+// Get reference
+var renderer = new myMarked.Renderer();
+
+// Override function
+renderer.heading = function (text, level) {
+ var escapedText = text.toLowerCase().replace(/[^\w]+/g, '-');
+
+ return `
+ <h${level}>
+ <a name="${escapedText}" class="anchor" href="#${escapedText}">
+ <span class="header-link"></span>
+ </a>
+ ${text}
+ </h${level}>`;
+};
+
+// Run marked
+console.log(myMarked('# heading+', { renderer: renderer }));
+```
+
+**Output:**
+
+```html
+<h1>
+ <a name="heading-" class="anchor" href="#heading-">
+ <span class="header-link"></span>
+ </a>
+ heading+
+</h1>
+```
+
+### Block level renderer methods
+
+- code(*string* code, *string* language)
+- blockquote(*string* quote)
+- html(*string* html)
+- heading(*string* text, *number* level)
+- hr()
+- list(*string* body, *boolean* ordered)
+- listitem(*string* text)
+- paragraph(*string* text)
+- table(*string* header, *string* body)
+- tablerow(*string* content)
+- tablecell(*string* content, *object* flags)
+
+`flags` has the following properties:
+
+```js
+{
+ header: true || false,
+ align: 'center' || 'left' || 'right'
+}
+```
+
+### Inline level renderer methods
+
+- strong(*string* text)
+- em(*string* text)
+- codespan(*string* code)
+- br()
+- del(*string* text)
+- link(*string* href, *string* title, *string* text)
+- image(*string* href, *string* title, *string* text)
+- text(*string* text)
+
+<h2 id="lexer">The lexer</h2>
+
+The lexer is...
+
+
+<h2 id="parser">The parser</h2>
+
+The parser is...
+
+***
+
+<h2 id="extend">Access to lexer and parser</h2>
+
+You also have direct access to the lexer and parser if you so desire.
+
+``` js
+var tokens = marked.lexer(text, options);
+console.log(marked.parser(tokens));
+```
+
+``` js
+var lexer = new marked.Lexer(options);
+var tokens = lexer.lex(text);
+console.log(tokens);
+console.log(lexer.rules);
+```
+
+``` bash
+$ node
+> require('marked').lexer('> i am using marked.')
+[ { type: 'blockquote_start' },
+ { type: 'paragraph',
+ text: 'i am using marked.' },
+ { type: 'blockquote_end' },
+ links: {} ]
+```
+
+The Lexers build an array of tokens, which will be passed to their respective
+Parsers. The Parsers process each token in the token arrays,
+which are removed from the array of tokens:
+
+``` js
+const marked = require('marked');
+
+const md = `
+ # heading
+
+ [link][1]
+
+ [1]: #heading "heading"
+`;
+
+const tokens = marked.lexer(md);
+console.log(tokens);
+
+const html = marked.parser(tokens);
+console.log(html);
+
+console.log(tokens);
+```
+
+``` bash
+[ { type: 'heading', depth: 1, text: 'heading' },
+ { type: 'paragraph', text: ' [link][1]' },
+ { type: 'space' },
+ links: { '1': { href: '#heading', title: 'heading' } } ]
+
+<h1 id="heading">heading</h1>
+<p> <a href="#heading" title="heading">link</a></p>
+
+[ links: { '1': { href: '#heading', title: 'heading' } } ]
+```
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/broken.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/broken.md
new file mode 100644
index 00000000000..7bfa49e8a9a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/broken.md
@@ -0,0 +1,426 @@
+# Markdown is broken
+
+I have a lot of scraps of markdown engine oddities that I've collected over the
+years. What you see below is slightly messy, but it's what I've managed to
+cobble together to illustrate the differences between markdown engines, and
+why, if there ever is a markdown specification, it has to be absolutely
+thorough. There are a lot more of these little differences I have documented
+elsewhere. I know I will find them lingering on my disk one day, but until
+then, I'll continue to add whatever strange nonsensical things I find.
+
+Some of these examples may only mention a particular engine compared to marked.
+However, the examples with markdown.pl could easily be swapped out for
+discount, upskirt, or markdown.js, and you would very easily see even more
+inconsistencies.
+
+A lot of this was written when I was very unsatisfied with the inconsistencies
+between markdown engines. Please excuse the frustration noticeable in my
+writing.
+
+## Examples of markdown's "stupid" list parsing
+
+```
+$ markdown.pl
+
+ * item1
+
+ * item2
+
+ text
+^D
+<ul>
+<li><p>item1</p>
+
+<ul>
+<li>item2</li>
+</ul>
+
+<p><p>text</p></li>
+</ul></p>
+```
+
+
+```
+$ marked
+ * item1
+
+ * item2
+
+ text
+^D
+<ul>
+<li><p>item1</p>
+<ul>
+<li>item2</li>
+</ul>
+<p>text</p>
+</li>
+</ul>
+```
+
+Which looks correct to you?
+
+- - -
+
+```
+$ markdown.pl
+* hello
+ > world
+^D
+<p><ul>
+<li>hello</p>
+
+<blockquote>
+ <p>world</li>
+</ul></p>
+</blockquote>
+```
+
+```
+$ marked
+* hello
+ > world
+^D
+<ul>
+<li>hello<blockquote>
+<p>world</p>
+</blockquote>
+</li>
+</ul>
+```
+
+Again, which looks correct to you?
+
+- - -
+
+EXAMPLE:
+
+```
+$ markdown.pl
+* hello
+ * world
+ * hi
+ code
+^D
+<ul>
+<li>hello
+<ul>
+<li>world</li>
+<li>hi
+ code</li>
+</ul></li>
+</ul>
+```
+
+The code isn't a code block even though it's after the bullet margin. I know,
+lets give it two more spaces, effectively making it 8 spaces past the bullet.
+
+```
+$ markdown.pl
+* hello
+ * world
+ * hi
+ code
+^D
+<ul>
+<li>hello
+<ul>
+<li>world</li>
+<li>hi
+ code</li>
+</ul></li>
+</ul>
+```
+
+And, it's still not a code block. Did you also notice that the 3rd item isn't
+even its own list? Markdown screws that up too because of its indentation
+unaware parsing.
+
+- - -
+
+Let's look at some more examples of markdown's list parsing:
+
+```
+$ markdown.pl
+
+ * item1
+
+ * item2
+
+ text
+^D
+<ul>
+<li><p>item1</p>
+
+<ul>
+<li>item2</li>
+</ul>
+
+<p><p>text</p></li>
+</ul></p>
+```
+
+Misnested tags.
+
+
+```
+$ marked
+ * item1
+
+ * item2
+
+ text
+^D
+<ul>
+<li><p>item1</p>
+<ul>
+<li>item2</li>
+</ul>
+<p>text</p>
+</li>
+</ul>
+```
+
+Which looks correct to you?
+
+- - -
+
+```
+$ markdown.pl
+* hello
+ > world
+^D
+<p><ul>
+<li>hello</p>
+
+<blockquote>
+ <p>world</li>
+</ul></p>
+</blockquote>
+```
+
+More misnested tags.
+
+
+```
+$ marked
+* hello
+ > world
+^D
+<ul>
+<li>hello<blockquote>
+<p>world</p>
+</blockquote>
+</li>
+</ul>
+```
+
+Again, which looks correct to you?
+
+- - -
+
+# Why quality matters - Part 2
+
+``` bash
+$ markdown.pl
+* hello
+ > world
+^D
+<p><ul>
+<li>hello</p>
+
+<blockquote>
+ <p>world</li>
+</ul></p>
+</blockquote>
+```
+
+``` bash
+$ sundown # upskirt
+* hello
+ > world
+^D
+<ul>
+<li>hello
+&gt; world</li>
+</ul>
+```
+
+``` bash
+$ marked
+* hello
+ > world
+^D
+<ul><li>hello <blockquote><p>world</p></blockquote></li></ul>
+```
+
+Which looks correct to you?
+
+- - -
+
+See: https://github.com/evilstreak/markdown-js/issues/23
+
+``` bash
+$ markdown.pl # upskirt/markdown.js/discount
+* hello
+ var a = 1;
+* world
+^D
+<ul>
+<li>hello
+var a = 1;</li>
+<li>world</li>
+</ul>
+```
+
+``` bash
+$ marked
+* hello
+ var a = 1;
+* world
+^D
+<ul><li>hello
+<pre>code>var a = 1;</code></pre></li>
+<li>world</li></ul>
+```
+
+Which looks more reasonable? Why shouldn't code blocks be able to appear in
+list items in a sane way?
+
+- - -
+
+``` bash
+$ markdown.js
+<div>hello</div>
+
+<span>hello</span>
+^D
+<p>&lt;div&gt;hello&lt;/div&gt;</p>
+
+<p>&lt;span&gt;hello&lt;/span&gt;</p>
+```
+
+``` bash
+$ marked
+<div>hello</div>
+
+<span>hello</span>
+^D
+<div>hello</div>
+
+
+<p><span>hello</span>
+</p>
+```
+
+- - -
+
+See: https://github.com/evilstreak/markdown-js/issues/27
+
+``` bash
+$ markdown.js
+[![an image](/image)](/link)
+^D
+<p><a href="/image)](/link">![an image</a></p>
+```
+
+``` bash
+$ marked
+[![an image](/image)](/link)
+^D
+<p><a href="/link"><img src="/image" alt="an image"></a>
+</p>
+```
+
+- - -
+
+See: https://github.com/evilstreak/markdown-js/issues/24
+
+``` bash
+$ markdown.js
+> a
+
+> b
+
+> c
+^D
+<blockquote><p>a</p><p>bundefined&gt; c</p></blockquote>
+```
+
+``` bash
+$ marked
+> a
+
+> b
+
+> c
+^D
+<blockquote><p>a
+
+</p></blockquote>
+<blockquote><p>b
+
+</p></blockquote>
+<blockquote><p>c
+</p></blockquote>
+```
+
+- - -
+
+``` bash
+$ markdown.pl
+* hello
+ * world
+ how
+
+ are
+ you
+
+ * today
+* hi
+^D
+<ul>
+<li><p>hello</p>
+
+<ul>
+<li>world
+how</li>
+</ul>
+
+<p>are
+you</p>
+
+<ul>
+<li>today</li>
+</ul></li>
+<li>hi</li>
+</ul>
+```
+
+``` bash
+$ marked
+* hello
+ * world
+ how
+
+ are
+ you
+
+ * today
+* hi
+^D
+<ul>
+<li><p>hello</p>
+<ul>
+<li><p>world
+how</p>
+<p>are
+you</p>
+</li>
+<li><p>today</p>
+</li>
+</ul>
+</li>
+<li>hi</li>
+</ul>
+```
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/demo/demo.css b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/demo/demo.css
new file mode 100644
index 00000000000..8e3e8fc5e82
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/demo/demo.css
@@ -0,0 +1,55 @@
+html, body {
+ margin: 0;
+ padding: 0;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ color: #333;
+ background-color: #fbfbfb;
+ height: 100%;
+}
+
+textarea {
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+ font-size: 12px;
+ resize: none;
+}
+
+header {
+ padding-top: 10px;
+ display: flex;
+ height: 58px;
+}
+
+header h1 {
+ margin: 0;
+}
+
+.github-ribbon {
+ position: absolute;
+ top: 0;
+ right: 0;
+ border: 0;
+ z-index: 1000;
+}
+
+.containers {
+ display: flex;
+ height: calc(100vh - 68px);
+}
+
+.container {
+ flex-basis: 50%;
+ padding: 5px;
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ box-sizing: border-box;
+}
+
+.pane, #input {
+ margin-top: 5px;
+ padding: 0.6em;
+ border: 1px solid #ccc;
+ overflow: auto;
+ flex-grow: 1;
+ flex-shrink: 1;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/demo/demo.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/demo/demo.js
new file mode 100644
index 00000000000..8db8e7146b4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/demo/demo.js
@@ -0,0 +1,175 @@
+/* globals marked, unfetch, ES6Promise */
+
+if (!window.Promise) {
+ window.Promise = ES6Promise;
+}
+if (!window.fetch) {
+ window.fetch = unfetch;
+}
+
+var $inputElem = document.querySelector('#input');
+var $outputTypeElem = document.querySelector('#outputType');
+var $previewElem = document.querySelector('#preview');
+var $permalinkElem = document.querySelector('#permalink');
+var $clearElem = document.querySelector('#clear');
+var $htmlElem = document.querySelector('#html');
+var $lexerElem = document.querySelector('#lexer');
+var $panes = document.querySelectorAll('.pane');
+var inputDirty = true;
+var $activeElem = null;
+var changeTimeout = null;
+var search = searchToObject();
+
+if ('text' in search) {
+ $inputElem.value = search.text;
+} else {
+ fetch('./initial.md')
+ .then(function (res) { return res.text(); })
+ .then(function (text) {
+ if ($inputElem.value === '') {
+ $inputElem.value = text;
+ inputDirty = true;
+ clearTimeout(changeTimeout);
+ checkForChanges();
+ setScrollPercent(0);
+ }
+ });
+}
+
+if (search.outputType) {
+ $outputTypeElem.value = search.outputType;
+}
+
+fetch('./quickref.md')
+ .then(function (res) { return res.text(); })
+ .then(function (text) {
+ document.querySelector('#quickref').value = text;
+ });
+
+function handleChange() {
+ for (var i = 0; i < $panes.length; i++) {
+ $panes[i].style.display = 'none';
+ }
+ $activeElem = document.querySelector('#' + $outputTypeElem.value);
+ $activeElem.style.display = 'block';
+
+ updateLink();
+};
+
+$outputTypeElem.addEventListener('change', handleChange, false);
+handleChange();
+
+function handleInput() {
+ inputDirty = true;
+};
+
+$inputElem.addEventListener('change', handleInput, false);
+$inputElem.addEventListener('keyup', handleInput, false);
+$inputElem.addEventListener('keypress', handleInput, false);
+$inputElem.addEventListener('keydown', handleInput, false);
+
+$clearElem.addEventListener('click', function () {
+ $inputElem.value = '';
+ handleInput();
+}, false);
+
+function searchToObject() {
+ // modified from https://stackoverflow.com/a/7090123/806777
+ var pairs = location.search.slice(1).split('&');
+ var obj = {};
+
+ for (var i = 0; i < pairs.length; i++) {
+ if (pairs[i] === '') {
+ continue;
+ }
+
+ var pair = pairs[i].split('=');
+
+ obj[decodeURIComponent(pair.shift())] = decodeURIComponent(pair.join('='));
+ }
+
+ return obj;
+}
+
+function jsonString(input) {
+ var output = (input + '')
+ .replace(/\n/g, '\\n')
+ .replace(/\r/g, '\\r')
+ .replace(/\t/g, '\\t')
+ .replace(/\f/g, '\\f')
+ .replace(/[\\"']/g, '\\$&')
+ .replace(/\u0000/g, '\\0');
+ return '"' + output + '"';
+};
+
+function getScrollSize() {
+ var e = $activeElem;
+
+ return e.scrollHeight - e.clientHeight;
+};
+function getScrollPercent() {
+ var size = getScrollSize();
+
+ if (size <= 0) {
+ return 1;
+ }
+
+ return $activeElem.scrollTop / size;
+};
+function setScrollPercent(percent) {
+ $activeElem.scrollTop = percent * getScrollSize();
+};
+
+function updateLink() {
+ var outputType = '';
+ if ($outputTypeElem.value !== 'preview') {
+ outputType = 'outputType=' + $outputTypeElem.value + '&';
+ }
+
+ $permalinkElem.href = '?' + outputType + 'text=' + encodeURIComponent($inputElem.value);
+ history.replaceState('', document.title, $permalinkElem.href);
+}
+
+var delayTime = 1;
+function checkForChanges() {
+ if (inputDirty) {
+ inputDirty = false;
+
+ updateLink();
+
+ var startTime = new Date();
+
+ var scrollPercent = getScrollPercent();
+
+ var lexed = marked.lexer($inputElem.value);
+
+ var lexedList = [];
+
+ for (var i = 0; i < lexed.length; i++) {
+ var lexedLine = [];
+ for (var j in lexed[i]) {
+ lexedLine.push(j + ':' + jsonString(lexed[i][j]));
+ }
+ lexedList.push('{' + lexedLine.join(', ') + '}');
+ }
+
+ var parsed = marked.parser(lexed);
+
+ $previewElem.innerHTML = (parsed);
+ $htmlElem.value = (parsed);
+ $lexerElem.value = (lexedList.join('\n'));
+
+ setScrollPercent(scrollPercent);
+
+ var endTime = new Date();
+ delayTime = endTime - startTime;
+ if (delayTime < 50) {
+ delayTime = 50;
+ } else if (delayTime > 500) {
+ delayTime = 1000;
+ }
+ }
+ changeTimeout = window.setTimeout(checkForChanges, delayTime);
+};
+checkForChanges();
+setScrollPercent(0);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/demo/index.html
new file mode 100644
index 00000000000..cc2b378d651
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/demo/index.html
@@ -0,0 +1,60 @@
+<!doctype html>
+<html lang="en">
+
+ <head>
+ <title>Marked Demo</title>
+ <link rel="stylesheet" href="./demo.css" type="text/css" />
+ </head>
+
+ <body>
+ <a href="https://github.com/markedjs/marked">
+ <img class="github-ribbon" src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub">
+ </a>
+
+ <header>
+ <a href="../">
+ <img src="../img/logo-black.svg" height="64px" width="64px" />
+ </a>
+ <h1>Marked Demo</h1>
+ </header>
+
+ <div class="containers">
+ <div class="container">
+ <div class="label">
+ <span>Input</span> ·
+ <a id="permalink">Permalink</a> ·
+ <button id="clear">Clear</button>
+ </div>
+ <textarea id="input"></textarea>
+ </div>
+
+ <div class="container">
+ <div class="label">
+ <select id="outputType">
+ <option value="preview">Preview</option>
+ <option value="html">HTML Source</option>
+ <option value="lexer">Lexer Data</option>
+ <option value="quickref">Quick Reference</option>
+ </select>
+ </div>
+
+ <div id="preview" class="pane">
+ <noscript>
+ <h2>You'll need to enable Javascript to use this tool.</h2>
+ </noscript>
+ </div>
+
+ <textarea id="html" class="pane" readonly="readonly"></textarea>
+
+ <textarea id="lexer" class="pane" readonly="readonly"></textarea>
+
+ <textarea id="quickref" class="pane" readonly="readonly"></textarea>
+ </div>
+ </div>
+ <script src="https://cdn.jsdelivr.net/npm/marked/lib/marked.js"></script>
+ <script src="https://cdn.jsdelivr.net/npm/es6-promise/dist/es6-promise.js"></script>
+ <script src="https://cdn.jsdelivr.net/npm/unfetch/dist/unfetch.umd.js"></script>
+ <script src="./demo.js"></script>
+ </body>
+
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/demo/initial.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/demo/initial.md
new file mode 100644
index 00000000000..2465aef0418
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/demo/initial.md
@@ -0,0 +1,36 @@
+Marked - Markdown Parser
+========================
+
+[Marked] lets you convert [Markdown] into HTML. Markdown is a simple text format whose goal is to be very easy to read and write, even when not converted to HTML. This demo page will let you type anything you like and see how it gets converted. Live. No more waiting around.
+
+How To Use The Demo
+-------------------
+
+1. Type in stuff on the left.
+2. See the live updates on the right.
+
+That's it. Pretty simple. There's also a drop-down option in the upper right to switch between various views:
+
+- **Preview:** A live display of the generated HTML as it would render in a browser.
+- **HTML Source:** The generated HTML before your browser makes it pretty.
+- **Lexer Data:** What [marked] uses internally, in case you like gory stuff like this.
+- **Quick Reference:** A brief run-down of how to format things using markdown.
+
+Why Markdown?
+-------------
+
+It's easy. It's not overly bloated, unlike HTML. Also, as the creator of [markdown] says,
+
+> The overriding design goal for Markdown's
+> formatting syntax is to make it as readable
+> as possible. The idea is that a
+> Markdown-formatted document should be
+> publishable as-is, as plain text, without
+> looking like it's been marked up with tags
+> or formatting instructions.
+
+Ready to start writing? Either start changing stuff on the left or
+[clear everything](?text=) with a simple click.
+
+[Marked]: https://github.com/markedjs/marked/
+[Markdown]: http://daringfireball.net/projects/markdown/
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/demo/quickref.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/demo/quickref.md
new file mode 100644
index 00000000000..10f09bdacf8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/demo/quickref.md
@@ -0,0 +1,167 @@
+Markdown Quick Reference
+========================
+
+This guide is a very brief overview, with examples, of the syntax that [Markdown] supports. It is itself written in Markdown and you can copy the samples over to the left-hand pane for experimentation. It's shown as *text* and not *rendered HTML*.
+
+[Markdown]: http://daringfireball.net/projects/markdown/
+
+
+Simple Text Formatting
+======================
+
+First thing is first. You can use *stars* or _underscores_ for italics. **Double stars** and __double underscores__ do bold. ***Three together*** do ___both___.
+
+Paragraphs are pretty easy too. Just have a blank line between chunks of text.
+
+> This chunk of text is in a block quote. Its multiple lines will all be
+> indended a bit from the rest of the text.
+>
+> > Multiple levels of block quotes also work.
+
+Sometimes you want to include some code, such as when you are explaining how `<h1>` HTML tags work, or maybe you are a programmer and you are discussing `someMethod()`.
+
+If you want to include some code and have
+newlines preserved, indent the line with a tab
+or at least four spaces.
+ Extra spaces work here too.
+This is also called preformatted text and it is useful for showing examples.
+The text will stay as text, so any *markdown* or <u>HTML</u> you add will
+not show up formatted. This way you can show markdown examples in a
+markdown document.
+
+> You can also use preformatted text with your blockquotes
+> as long as you add at least five spaces.
+
+
+Headings
+========
+
+There are a couple of ways to make headings. Using three or more equals signs on a line under a heading makes it into an "h1" style. Three or more hyphens under a line makes it "h2" (slightly smaller). You can also use multiple pound symbols before and after a heading. Pounds after the title are ignored. Here's some examples:
+
+This is H1
+==========
+
+This is H2
+----------
+
+# This is H1
+## This is H2
+### This is H3 with some extra pounds ###
+#### You get the idea ####
+##### I don't need extra pounds at the end
+###### H6 is the max
+
+
+Links
+=====
+
+Let's link to a few sites. First, let's use the bare URL, like <http://www.github.com>. Great for text, but ugly for HTML.
+Next is an inline link to [Google](http://www.google.com). A little nicer.
+This is a reference-style link to [Wikipedia] [1].
+Lastly, here's a pretty link to [Yahoo]. The reference-style and pretty links both automatically use the links defined below, but they could be defined *anywhere* in the markdown and are removed from the HTML. The names are also case insensitive, so you can use [YaHoO] and have it link properly.
+
+[1]: http://www.wikipedia.org/
+[Yahoo]: http://www.yahoo.com/
+
+Title attributes may be added to links by adding text after a link.
+This is the [inline link](http://www.bing.com "Bing") with a "Bing" title.
+You can also go to [W3C] [2] and maybe visit a [friend].
+
+[2]: http://w3c.org (The W3C puts out specs for web-based things)
+[Friend]: http://facebook.com/ "Facebook!"
+
+Email addresses in plain text are not linked: test@example.com.
+Email addresses wrapped in angle brackets are linked: <test@example.com>.
+They are also obfuscated so that email harvesting spam robots hopefully won't get them.
+
+
+Lists
+=====
+
+* This is a bulleted list
+* Great for shopping lists
+- You can also use hyphens
++ Or plus symbols
+
+The above is an "unordered" list. Now, on for a bit of order.
+
+1. Numbered lists are also easy
+2. Just start with a number
+3738762. However, the actual number doesn't matter when converted to HTML.
+1. This will still show up as 4.
+
+You might want a few advanced lists:
+
+- This top-level list is wrapped in paragraph tags
+- This generates an extra space between each top-level item.
+
+- You do it by adding a blank line
+
+- This nested list also has blank lines between the list items.
+
+- How to create nested lists
+1. Start your regular list
+2. Indent nested lists with four spaces
+3. Further nesting means you should indent with four more spaces
+ * This line is indented with eight spaces.
+
+- List items can be quite lengthy. You can keep typing and either continue
+them on the next line with no indentation.
+
+- Alternately, if that looks ugly, you can also
+indent the next line a bit for a prettier look.
+
+- You can put large blocks of text in your list by just indenting with four spaces.
+
+This is formatted the same as code, but you can inspect the HTML
+and find that it's just wrapped in a `<p>` tag and *won't* be shown
+as preformatted text.
+
+You can keep adding more and more paragraphs to a single
+list item by adding the traditional blank line and then keep
+on indenting the paragraphs with four spaces. You really need
+to only indent the first line, but that looks ugly.
+
+- Lists support blockquotes
+
+> Just like this example here. By the way, you can
+> nest lists inside blockquotes!
+> - Fantastic!
+
+- Lists support preformatted text
+
+ You just need to indent eight spaces.
+
+
+Even More
+=========
+
+Horizontal Rule
+---------------
+
+If you need a horizontal rule you just need to put at least three hyphens, asterisks, or underscores on a line by themselves. You can also even put spaces between the characters.
+
+---
+****************************
+_ _ _ _ _ _ _
+
+Those three all produced horizontal lines. Keep in mind that three hyphens under any text turns that text into a heading, so add a blank like if you use hyphens.
+
+Images
+------
+
+Images work exactly like links, but they have exclamation points in front. They work with references and titles too.
+
+![Google Logo](http://www.google.com/images/errors/logo_sm.gif) and ![Happy].
+
+[Happy]: http://www.wpclipart.com/smiley/simple_smiley/smiley_face_simple_green_small.png ("Smiley face")
+
+
+Inline HTML
+-----------
+
+If markdown is too limiting, you can just insert your own <strike>crazy</strike> HTML. Span-level HTML <u>can *still* use markdown</u>. Block level elements must be separated from text by a blank line and must not have any spaces before the opening and closing HTML.
+
+<div style='font-family: "Comic Sans", sans-serif;'>
+It is a pity, but markdown does **not** work in here for most markdown parsers. [Marked] handles it pretty well.
+</div>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/img/logo-black-and-white.svg b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/img/logo-black-and-white.svg
new file mode 100644
index 00000000000..5f6c0b781bf
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/img/logo-black-and-white.svg
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg 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"
+ width="996px" height="439.589px" viewBox="0 0 996 439.589" enable-background="new 0 0 996 439.589" xml:space="preserve">
+<g>
+ <g id="Marked_Letters">
+ <path fill="#010101" d="M185.044,358.869h-9.961l-1.143-25.986l-14.092,25.986h-6.24l-6.709-26.807l-8.818,26.807h-10.225
+ l13.389-40.605h10.928l6.416,25.781l13.916-25.781h10.635L185.044,358.869z"/>
+ <path fill="#010101" d="M226.617,358.869h-10.811l-1.084-8.994H202.33l-4.102,8.994h-10.605l20.566-40.605h10.986L226.617,358.869
+ z M214.019,344.162l-1.934-15.527l-7.061,15.527H214.019z"/>
+ <path fill="#010101" d="M267.712,358.869h-11.338l-4.043-8.467c-1.191-2.559-2.227-4.478-3.105-5.757s-1.651-2.07-2.314-2.373
+ c-0.664-0.303-1.553-0.454-2.666-0.454h-1.553l-2.578,17.051h-10.283l5.889-40.605h15.85c5.761,0,9.672,1.27,11.733,3.809
+ c2.061,2.539,3.091,5.283,3.091,8.232c0,3.105-0.854,5.522-2.563,7.251c-1.709,1.729-4.097,2.798-7.163,3.208
+ c1.562,0.898,2.769,1.953,3.618,3.164s1.86,3.096,3.032,5.654L267.712,358.869z M255.525,330.012c0-1.562-0.571-2.925-1.714-4.087
+ s-3.453-1.743-6.929-1.743h-1.611l-1.699,11.719h4.102c2.89,0,4.922-0.61,6.094-1.831S255.525,331.496,255.525,330.012z"/>
+ <path fill="#010101" d="M313.705,318.264l-17.578,18.223l14.912,22.383h-11.807l-14.59-21.65l-3.282,21.65h-10.342l6.064-40.605
+ h10.401l-2.578,17.256l16.611-17.256H313.705z"/>
+ <path fill="#010101" d="M346.426,318.264L345.4,325.5h-16.436l-1.26,8.818h14.268l-1.025,7.266h-14.385l-1.377,10.02h19.98
+ l-1.025,7.266h-30.439l5.889-40.605H346.426z"/>
+ <path fill="#010101" d="M389.953,338.156c0,4.512-0.86,8.301-2.578,11.367c-1.719,3.066-4.273,5.391-7.662,6.973
+ s-7.583,2.373-12.582,2.373H348.41l5.83-40.605h14.941c3.534,0,6.625,0.527,9.271,1.582s4.82,2.51,6.52,4.365
+ s2.953,3.97,3.764,6.343S389.953,335.461,389.953,338.156z M379.377,338.303c0-2.031-0.387-4.004-1.158-5.918
+ s-2.192-3.54-4.262-4.878c-2.07-1.338-4.941-2.007-8.613-2.007h-1.67l-3.779,26.104h5.449c2.597,0,4.828-0.391,6.693-1.172
+ s3.33-1.821,4.395-3.12s1.821-2.71,2.271-4.233C379.152,341.555,379.377,339.963,379.377,338.303z"/>
+ </g>
+ <g>
+ <path fill="#010101" d="M406.922,307.149l-3.703,26.35c-0.609,4.324-2.72,6.486-6.33,6.486c-0.773,0-1.553-0.07-2.338-0.211
+ l-0.756-3.023c0.879,0.188,1.67,0.281,2.373,0.281c1.219,0,2.118-0.302,2.698-0.905s0.964-1.55,1.151-2.839l3.674-26.139H406.922z
+ "/>
+ <path fill="#010101" d="M423.027,307.8l-0.475,3.357c-1.312-0.867-2.748-1.301-4.307-1.301c-1.312,0-2.361,0.34-3.146,1.02
+ s-1.178,1.576-1.178,2.689c0,0.551,0.188,1.131,0.562,1.74s1.471,1.644,3.287,3.103s3.015,2.739,3.595,3.841
+ s0.87,2.203,0.87,3.305c0,1.758-0.662,3.275-1.986,4.553s-3.088,1.916-5.291,1.916c-1.957,0-3.938-0.586-5.941-1.758l0.51-3.604
+ c2.238,1.559,4.16,2.338,5.766,2.338c0.867,0,1.69-0.284,2.47-0.852c0.779-0.568,1.169-1.339,1.169-2.312
+ c0-0.62-0.197-1.265-0.59-1.933c-0.394-0.667-1.502-1.745-3.324-3.232c-1.824-1.486-3.014-2.778-3.568-3.874
+ c-0.555-1.097-0.832-2.185-0.832-3.263c0-1.899,0.785-3.491,2.355-4.775c1.57-1.283,3.422-1.926,5.555-1.926
+ C420.016,306.833,421.516,307.155,423.027,307.8z"/>
+ </g>
+ <g>
+ <g>
+ <path fill="#010101" d="M357,200v-92c0-8.284-6.716-15-15-15H172c-8.284,0-15,6.716-15,15v92H357z"/>
+ <path fill="#010101" d="M157,205v73c0,8.284,6.716,15,15,15h170c8.284,0,15-6.716,15-15v-73H157z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M208.737,180.15v-33.125l16.987,21.234l16.987-21.234v33.125h16.987v-57.756h-16.987l-16.987,21.234
+ l-16.987-21.234H191.75v57.756H208.737z"/>
+ <path fill="#FFFFFF" d="M322.55,151.272h-16.987v-28.878h-16.986v28.878h-16.987L297.069,181L322.55,151.272z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M217,241.154c0,2.124-1.722,3.846-3.845,3.846h-5.31c-2.124,0-3.845-1.722-3.845-3.846v-0.309
+ c0-2.124,1.722-3.846,3.845-3.846h5.31c2.124,0,3.845,1.722,3.845,3.846V241.154z"/>
+ <path fill="#FFFFFF" d="M207.859,256.5c0,1.933-1.1,3.5-2.457,3.5h-12.046c-1.357,0-2.457-1.567-2.457-3.5l0,0
+ c0-1.933,1.1-3.5,2.457-3.5h12.046C206.759,253,207.859,254.567,207.859,256.5L207.859,256.5z"/>
+ <path fill="#FFFFFF" d="M328.044,238.021c-1.058-3.094-2.692-5.85-4.907-8.269c-2.215-2.418-5.049-4.314-8.498-5.689
+ c-3.45-1.375-7.479-2.063-12.086-2.063h-19.477l-7.6,52.932h24.403c6.518,0,11.984-1.032,16.402-3.094
+ c4.416-2.062,7.746-5.092,9.986-9.09c2.24-3.996,3.361-8.936,3.361-14.817C329.629,244.418,329.1,241.115,328.044,238.021z
+ M314.964,254.347c-0.586,1.986-1.573,3.826-2.96,5.519c-1.389,1.694-3.297,3.049-5.729,4.067s-5.34,1.528-8.727,1.528h-7.103
+ l4.927-34.027h2.176c4.787,0,8.529,0.872,11.229,2.616c2.698,1.744,4.55,3.863,5.557,6.358c1.005,2.494,1.508,5.066,1.508,7.713
+ C315.842,250.286,315.549,252.361,314.964,254.347z"/>
+ <path fill="#FFFFFF" d="M246.148,241.043l1.373-9.61h21.424l1.336-9.434h-10.601h-24.38h-1.256c-2.125,0-3.846,1.877-3.846,4
+ s1.721,4,3.846,4h0.096h3.793c1.928,0,3.491,1.563,3.491,3.491c0,1.928-1.563,3.491-3.491,3.491h-4.806L233.126,237h-8.983
+ c-1.299,0-2.353,1.786-2.353,3.988c0,2.203,1.053,3.989,2.353,3.989h7.826L231.966,245h3.189c2.124,0,3.845,1.722,3.845,3.846
+ v0.309c0,2.124-1.722,3.846-3.845,3.846h-4.349h-0.96H216.2c-1.933,0-3.5,1.567-3.5,3.5s1.567,3.5,3.5,3.5h8.645h4.945h0.364
+ c2.124,0,3.845,1.722,3.845,3.846v0.309c0,2.124-1.722,3.846-3.845,3.846h-1.524h-3.785h-1.8c-2.125,0-3.846,1.377-3.846,3.5
+ s1.721,3.5,3.846,3.5h25.636c0.273,0,0.538-0.024,0.795-0.068h17.828l1.336-9.471h-26.045l1.795-13.062h18.751l1.336-9.471
+ h-18.598l0.029-0.205C246.055,242.213,246.144,241.647,246.148,241.043z"/>
+ </g>
+ </g>
+</g>
+<g>
+ <g id="Marked_Letters_1_">
+ <path fill="#010101" d="M619.045,356.869h-9.961l-1.143-25.986l-14.092,25.986h-6.24l-6.709-26.807l-8.818,26.807h-10.225
+ l13.389-40.605h10.928l6.416,25.781l13.916-25.781h10.635L619.045,356.869z"/>
+ <path fill="#010101" d="M660.617,356.869h-10.811l-1.084-8.994H636.33l-4.102,8.994h-10.605l20.566-40.605h10.986L660.617,356.869
+ z M648.02,342.162l-1.934-15.527l-7.061,15.527H648.02z"/>
+ <path fill="#010101" d="M701.713,356.869h-11.338l-4.043-8.467c-1.191-2.559-2.227-4.478-3.105-5.757s-1.651-2.07-2.314-2.373
+ c-0.664-0.303-1.553-0.454-2.666-0.454h-1.553l-2.578,17.051h-10.283l5.889-40.605h15.85c5.761,0,9.672,1.27,11.732,3.809
+ s3.092,5.283,3.092,8.232c0,3.105-0.855,5.522-2.564,7.251s-4.097,2.798-7.162,3.208c1.562,0.898,2.768,1.953,3.617,3.164
+ s1.861,3.096,3.033,5.654L701.713,356.869z M689.525,328.012c0-1.562-0.572-2.925-1.715-4.087s-3.452-1.743-6.928-1.743h-1.611
+ l-1.699,11.719h4.102c2.89,0,4.922-0.61,6.094-1.831S689.525,329.496,689.525,328.012z"/>
+ <path fill="#010101" d="M747.705,316.264l-17.578,18.223l14.912,22.383h-11.807l-14.59-21.65l-3.281,21.65H705.02l6.064-40.605
+ h10.4l-2.578,17.256l16.611-17.256H747.705z"/>
+ <path fill="#010101" d="M780.426,316.264L779.4,323.5h-16.436l-1.26,8.818h14.268l-1.025,7.266h-14.385l-1.377,10.02h19.98
+ l-1.025,7.266h-30.439l5.889-40.605H780.426z"/>
+ <path fill="#010101" d="M823.953,336.156c0,4.512-0.86,8.301-2.578,11.367c-1.719,3.066-4.273,5.391-7.662,6.973
+ s-7.583,2.373-12.582,2.373H782.41l5.83-40.605h14.941c3.534,0,6.625,0.527,9.271,1.582s4.82,2.51,6.52,4.365
+ s2.953,3.97,3.764,6.343S823.953,333.461,823.953,336.156z M813.377,336.303c0-2.031-0.387-4.004-1.158-5.918
+ s-2.192-3.54-4.262-4.878c-2.07-1.338-4.941-2.007-8.613-2.007h-1.67l-3.779,26.104h5.449c2.597,0,4.828-0.391,6.693-1.172
+ s3.33-1.821,4.395-3.12s1.821-2.71,2.271-4.233C813.152,339.555,813.377,337.963,813.377,336.303z"/>
+ </g>
+ <g>
+ <path fill="#010101" d="M840.922,305.149l-3.703,26.35c-0.609,4.324-2.72,6.486-6.33,6.486c-0.773,0-1.553-0.07-2.338-0.211
+ l-0.756-3.023c0.879,0.188,1.67,0.281,2.373,0.281c1.219,0,2.118-0.302,2.698-0.905s0.964-1.55,1.151-2.839l3.674-26.139H840.922z
+ "/>
+ <path fill="#010101" d="M857.027,305.8l-0.475,3.357c-1.312-0.867-2.748-1.301-4.307-1.301c-1.312,0-2.361,0.34-3.146,1.02
+ s-1.178,1.576-1.178,2.689c0,0.551,0.188,1.131,0.562,1.74s1.471,1.644,3.287,3.103s3.015,2.739,3.595,3.841
+ s0.87,2.203,0.87,3.305c0,1.758-0.662,3.275-1.986,4.553s-3.088,1.916-5.291,1.916c-1.957,0-3.938-0.586-5.941-1.758l0.51-3.604
+ c2.238,1.559,4.16,2.338,5.766,2.338c0.867,0,1.69-0.284,2.47-0.852c0.779-0.568,1.169-1.339,1.169-2.312
+ c0-0.62-0.197-1.265-0.59-1.933c-0.394-0.667-1.502-1.745-3.324-3.232c-1.824-1.486-3.014-2.778-3.568-3.874
+ c-0.555-1.097-0.832-2.185-0.832-3.263c0-1.899,0.785-3.491,2.355-4.775c1.57-1.283,3.422-1.926,5.555-1.926
+ C854.016,304.833,855.516,305.155,857.027,305.8z"/>
+ </g>
+ <g>
+ <g>
+ <path d="M641,234.154c0,2.124-1.722,3.846-3.846,3.846h-5.309c-2.124,0-3.846-1.722-3.846-3.846v-0.309
+ c0-2.124,1.722-3.846,3.846-3.846h5.309c2.124,0,3.846,1.722,3.846,3.846V234.154z"/>
+ <path d="M631.859,249.5c0,1.933-1.1,3.5-2.457,3.5h-12.046c-1.356,0-2.456-1.567-2.456-3.5l0,0c0-1.933,1.1-3.5,2.456-3.5h12.046
+ C630.76,246,631.859,247.567,631.859,249.5L631.859,249.5z"/>
+ <path d="M752.044,231.021c-1.058-3.094-2.692-5.85-4.907-8.269c-2.215-2.418-5.049-4.314-8.498-5.689
+ c-3.45-1.375-7.479-2.063-12.086-2.063h-19.477l-7.6,52.932h24.402c6.518,0,11.984-1.032,16.402-3.094
+ c4.416-2.062,7.746-5.092,9.986-9.09c2.24-3.996,3.361-8.936,3.361-14.817C753.629,237.418,753.1,234.115,752.044,231.021z
+ M738.964,247.347c-0.586,1.986-1.573,3.826-2.96,5.519c-1.389,1.694-3.297,3.049-5.729,4.067s-5.34,1.528-8.727,1.528h-7.103
+ l4.927-34.027h2.176c4.787,0,8.529,0.872,11.229,2.616c2.698,1.744,4.55,3.863,5.557,6.358c1.005,2.494,1.508,5.066,1.508,7.713
+ C739.842,243.286,739.549,245.361,738.964,247.347z"/>
+ <path d="M670.148,234.043l1.373-9.61h21.424l1.337-9.434h-10.601h-24.381h-1.256c-2.124,0-3.846,1.877-3.846,4s1.722,4,3.846,4
+ h0.096h3.793c1.929,0,3.492,1.563,3.492,3.491c0,1.928-1.563,3.491-3.492,3.491h-4.805L657.126,230h-8.983
+ c-1.299,0-2.352,1.786-2.352,3.988c0,2.203,1.053,3.989,2.352,3.989h7.826L655.966,238h3.188c2.124,0,3.846,1.722,3.846,3.846
+ v0.309c0,2.124-1.722,3.846-3.846,3.846h-4.349h-0.96H640.2c-1.933,0-3.5,1.567-3.5,3.5s1.567,3.5,3.5,3.5h8.646h4.945h0.363
+ c2.124,0,3.846,1.722,3.846,3.846v0.309c0,2.124-1.722,3.846-3.846,3.846h-1.523h-3.785h-1.801c-2.124,0-3.846,1.377-3.846,3.5
+ s1.722,3.5,3.846,3.5h25.637c0.272,0,0.537-0.024,0.795-0.068h17.827l1.337-9.471h-26.045l1.795-13.062h18.75l1.337-9.471
+ h-18.599l0.029-0.205C670.055,235.213,670.144,234.647,670.148,234.043z"/>
+ </g>
+ <g>
+ <path fill="#010101" d="M642.236,179.15v-33.125l16.988,21.234l16.986-21.234v33.125h16.987v-57.756h-16.987l-16.986,21.234
+ l-16.988-21.234H625.25v57.756H642.236z"/>
+ <path fill="#010101" d="M756.05,150.272h-16.987v-28.878h-16.986v28.878H705.09L730.569,180L756.05,150.272z"/>
+ </g>
+ <path fill="#010101" d="M776,90H606c-11.028,0-20,8.972-20,20v170c0,11.028,8.972,20,20,20h170c11.028,0,20-8.972,20-20V110
+ C796,98.972,787.028,90,776,90z M606,100h170c5.514,0,10,4.486,10,10v83H596v-83C596,104.486,600.486,100,606,100z M776,290H606
+ c-5.514,0-10-4.486-10-10v-82h190v82C786,285.514,781.514,290,776,290z"/>
+ </g>
+</g>
+</svg> \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/img/logo-black.svg b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/img/logo-black.svg
new file mode 100644
index 00000000000..a67fb80e5f0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/img/logo-black.svg
@@ -0,0 +1,32 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" width="300px" height="439.589px" viewBox="100 100 400 400" xml:space="preserve">
+<g>
+ <g id="Marked_Letters">
+ <path fill="#010101" d="M185.044,358.869h-9.961l-1.143-25.986l-14.092,25.986h-6.24l-6.709-26.807l-8.818,26.807h-10.225 l13.389-40.605h10.928l6.416,25.781l13.916-25.781h10.635L185.044,358.869z"/>
+ <path fill="#010101" d="M226.617,358.869h-10.811l-1.084-8.994H202.33l-4.102,8.994h-10.605l20.566-40.605h10.986L226.617,358.869 z M214.019,344.162l-1.934-15.527l-7.061,15.527H214.019z"/>
+ <path fill="#010101" d="M267.712,358.869h-11.338l-4.043-8.467c-1.191-2.559-2.227-4.478-3.105-5.757s-1.651-2.07-2.314-2.373 c-0.664-0.303-1.553-0.454-2.666-0.454h-1.553l-2.578,17.051h-10.283l5.889-40.605h15.85c5.761,0,9.672,1.27,11.733,3.809 c2.061,2.539,3.091,5.283,3.091,8.232c0,3.105-0.854,5.522-2.563,7.251c-1.709,1.729-4.097,2.798-7.163,3.208 c1.562,0.898,2.769,1.953,3.618,3.164s1.86,3.096,3.032,5.654L267.712,358.869z M255.525,330.012c0-1.562-0.571-2.925-1.714-4.087 s-3.453-1.743-6.929-1.743h-1.611l-1.699,11.719h4.102c2.89,0,4.922-0.61,6.094-1.831S255.525,331.496,255.525,330.012z"/>
+ <path fill="#010101" d="M313.705,318.264l-17.578,18.223l14.912,22.383h-11.807l-14.59-21.65l-3.282,21.65h-10.342l6.064-40.605 h10.401l-2.578,17.256l16.611-17.256H313.705z"/>
+ <path fill="#010101" d="M346.426,318.264L345.4,325.5h-16.436l-1.26,8.818h14.268l-1.025,7.266h-14.385l-1.377,10.02h19.98 l-1.025,7.266h-30.439l5.889-40.605H346.426z"/>
+ <path fill="#010101" d="M389.953,338.156c0,4.512-0.86,8.301-2.578,11.367c-1.719,3.066-4.273,5.391-7.662,6.973 s-7.583,2.373-12.582,2.373H348.41l5.83-40.605h14.941c3.534,0,6.625,0.527,9.271,1.582s4.82,2.51,6.52,4.365 s2.953,3.97,3.764,6.343S389.953,335.461,389.953,338.156z M379.377,338.303c0-2.031-0.387-4.004-1.158-5.918 s-2.192-3.54-4.262-4.878c-2.07-1.338-4.941-2.007-8.613-2.007h-1.67l-3.779,26.104h5.449c2.597,0,4.828-0.391,6.693-1.172 s3.33-1.821,4.395-3.12s1.821-2.71,2.271-4.233C379.152,341.555,379.377,339.963,379.377,338.303z"/>
+ </g>
+ <g>
+ <path fill="#010101" d="M406.922,307.149l-3.703,26.35c-0.609,4.324-2.72,6.486-6.33,6.486c-0.773,0-1.553-0.07-2.338-0.211 l-0.756-3.023c0.879,0.188,1.67,0.281,2.373,0.281c1.219,0,2.118-0.302,2.698-0.905s0.964-1.55,1.151-2.839l3.674-26.139H406.922z "/>
+ <path fill="#010101" d="M423.027,307.8l-0.475,3.357c-1.312-0.867-2.748-1.301-4.307-1.301c-1.312,0-2.361,0.34-3.146,1.02 s-1.178,1.576-1.178,2.689c0,0.551,0.188,1.131,0.562,1.74s1.471,1.644,3.287,3.103s3.015,2.739,3.595,3.841 s0.87,2.203,0.87,3.305c0,1.758-0.662,3.275-1.986,4.553s-3.088,1.916-5.291,1.916c-1.957,0-3.938-0.586-5.941-1.758l0.51-3.604 c2.238,1.559,4.16,2.338,5.766,2.338c0.867,0,1.69-0.284,2.47-0.852c0.779-0.568,1.169-1.339,1.169-2.312 c0-0.62-0.197-1.265-0.59-1.933c-0.394-0.667-1.502-1.745-3.324-3.232c-1.824-1.486-3.014-2.778-3.568-3.874 c-0.555-1.097-0.832-2.185-0.832-3.263c0-1.899,0.785-3.491,2.355-4.775c1.57-1.283,3.422-1.926,5.555-1.926 C420.016,306.833,421.516,307.155,423.027,307.8z"/>
+ </g>
+ <g>
+ <g>
+ <path fill="#010101" d="M357,200v-92c0-8.284-6.716-15-15-15H172c-8.284,0-15,6.716-15,15v92H357z"/>
+ <path fill="#010101" d="M157,205v73c0,8.284,6.716,15,15,15h170c8.284,0,15-6.716,15-15v-73H157z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M208.737,180.15v-33.125l16.987,21.234l16.987-21.234v33.125h16.987v-57.756h-16.987l-16.987,21.234 l-16.987-21.234H191.75v57.756H208.737z"/>
+ <path fill="#FFFFFF" d="M322.55,151.272h-16.987v-28.878h-16.986v28.878h-16.987L297.069,181L322.55,151.272z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M217,241.154c0,2.124-1.722,3.846-3.845,3.846h-5.31c-2.124,0-3.845-1.722-3.845-3.846v-0.309 c0-2.124,1.722-3.846,3.845-3.846h5.31c2.124,0,3.845,1.722,3.845,3.846V241.154z"/>
+ <path fill="#FFFFFF" d="M207.859,256.5c0,1.933-1.1,3.5-2.457,3.5h-12.046c-1.357,0-2.457-1.567-2.457-3.5l0,0 c0-1.933,1.1-3.5,2.457-3.5h12.046C206.759,253,207.859,254.567,207.859,256.5L207.859,256.5z"/>
+ <path fill="#FFFFFF" d="M328.044,238.021c-1.058-3.094-2.692-5.85-4.907-8.269c-2.215-2.418-5.049-4.314-8.498-5.689 c-3.45-1.375-7.479-2.063-12.086-2.063h-19.477l-7.6,52.932h24.403c6.518,0,11.984-1.032,16.402-3.094 c4.416-2.062,7.746-5.092,9.986-9.09c2.24-3.996,3.361-8.936,3.361-14.817C329.629,244.418,329.1,241.115,328.044,238.021z M314.964,254.347c-0.586,1.986-1.573,3.826-2.96,5.519c-1.389,1.694-3.297,3.049-5.729,4.067s-5.34,1.528-8.727,1.528h-7.103 l4.927-34.027h2.176c4.787,0,8.529,0.872,11.229,2.616c2.698,1.744,4.55,3.863,5.557,6.358c1.005,2.494,1.508,5.066,1.508,7.713 C315.842,250.286,315.549,252.361,314.964,254.347z"/>
+ <path fill="#FFFFFF" d="M246.148,241.043l1.373-9.61h21.424l1.336-9.434h-10.601h-24.38h-1.256c-2.125,0-3.846,1.877-3.846,4 s1.721,4,3.846,4h0.096h3.793c1.928,0,3.491,1.563,3.491,3.491c0,1.928-1.563,3.491-3.491,3.491h-4.806L233.126,237h-8.983 c-1.299,0-2.353,1.786-2.353,3.988c0,2.203,1.053,3.989,2.353,3.989h7.826L231.966,245h3.189c2.124,0,3.845,1.722,3.845,3.846 v0.309c0,2.124-1.722,3.846-3.845,3.846h-4.349h-0.96H216.2c-1.933,0-3.5,1.567-3.5,3.5s1.567,3.5,3.5,3.5h8.645h4.945h0.364 c2.124,0,3.845,1.722,3.845,3.846v0.309c0,2.124-1.722,3.846-3.845,3.846h-1.524h-3.785h-1.8c-2.125,0-3.846,1.377-3.846,3.5 s1.721,3.5,3.846,3.5h25.636c0.273,0,0.538-0.024,0.795-0.068h17.828l1.336-9.471h-26.045l1.795-13.062h18.751l1.336-9.471 h-18.598l0.029-0.205C246.055,242.213,246.144,241.647,246.148,241.043z"/>
+ </g>
+ </g>
+</g>
+</svg> \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/index.html
new file mode 100644
index 00000000000..a985d16f5e3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/docs/index.html
@@ -0,0 +1,171 @@
+<!doctype html>
+<html>
+<head>
+ <meta charset="utf-8"/>
+ <title>Marked.js Documentation</title>
+ <style>
+ body {
+ font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";
+ font-size: 16px;
+ line-height: 1.5;
+ word-wrap: break-word;
+ }
+
+ #container {
+ position: relative;
+ max-width: 800px;
+ margin: auto;
+ padding: 10px;
+ border: 1px solid #ddd;
+ border-radius: 3px;
+ }
+
+ header { display: flex; }
+
+ header h1 { margin: 0; }
+
+ table {
+ border-spacing: 0;
+ border-collapse: collapse;
+ border: 1px solid #ddd;
+ }
+
+ td, th {
+ border: 1px solid #ddd;
+ padding: 5px;
+ }
+
+ a {
+ color: #0366d6;
+ text-decoration: none;
+ }
+
+ a:hover {
+ text-decoration: underline;
+ }
+
+ pre {
+ font-family: "SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;
+ padding: 16px;
+ overflow: auto;
+ font-size: 85%;
+ line-height: 1.45;
+ background-color: #f6f8fa;
+ border-radius: 3px;
+ }
+
+ code:not([class]) {
+ padding: 0.2em 0.4em;
+ margin: 0;
+ font-size: 85%;
+ background-color: rgba(27,31,35,0.05);
+ border-radius: 3px;
+ }
+
+ .github-ribbon {
+ position: absolute;
+ top: 0;
+ right: 0;
+ border: 0;
+ }
+ </style>
+</head>
+<body>
+ <div id="container">
+ <header>
+ <a href="#/README.md">
+ <img src="img/logo-black.svg" height="64px" width="64px" />
+ </a>
+ <h1>Marked.js Documentation</h1>
+ </header>
+
+ <a href="https://github.com/markedjs/marked">
+ <img class="github-ribbon" src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub">
+ </a>
+
+ <div id="content"></div>
+ </div>
+ <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
+ <script src="https://cdn.jsdelivr.net/npm/es6-promise/dist/es6-promise.js"></script>
+ <script src="https://cdn.jsdelivr.net/npm/unfetch/dist/unfetch.umd.js"></script>
+ <script>
+ if (!window.Promise) {
+ window.Promise = ES6Promise;
+ }
+ if (!window.fetch) {
+ window.fetch = unfetch;
+ }
+
+ var content = document.querySelector('#content');
+ var body = document.querySelector('html');
+ var currentPage = 'README.md';
+ var currentHash = '';
+ var renderedPage = '';
+
+ function hashChange() {
+ var hash = location.hash.slice(1);
+ if (!hash) {
+ hash = 'README.md';
+ }
+
+ var uri = hash.split('#');
+
+ if (uri[0].match(/^\//)) {
+ currentPage = uri[0].slice(1);
+ if (uri.length > 1) {
+ currentHash = uri[1];
+ } else {
+ currentHash = '';
+ }
+ } else {
+ currentHash = uri[0];
+ }
+
+ fetchPage(currentPage).then(function () {
+ fetchAnchor(currentHash)
+ });
+
+ history.replaceState('', document.title, '#/' + currentPage + (currentHash ? '#' + currentHash : ''));
+ }
+
+ function fetchAnchor(anchor) {
+ if (!anchor) {
+ return;
+ }
+
+ var hashElement = document.getElementById(anchor);
+ if (hashElement) {
+ hashElement.scrollIntoView();
+ }
+ }
+
+ function fetchPage(page) {
+ if (page === renderedPage) {
+ return Promise.resolve();
+ }
+ return fetch(page)
+ .then(function (res) {
+ if (!res.ok) {
+ throw new Error('Error ' + res.status + ': ' + res.statusText);
+ }
+ return res.text();
+ })
+ .then(function (text) {
+ renderedPage = page;
+ content.innerHTML = marked(text);
+ body.scrollTop = 0;
+ }).catch(function (e) {
+ content.innerHTML = '<p>Oops! There was a problem rendering the page.</p>'
+ + '<p>' + e.message + '</p>';
+ });
+ }
+
+ window.addEventListener('hashchange', function (e) {
+ e.preventDefault();
+ hashChange();
+ });
+
+ hashChange();
+ </script>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/index.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/index.js
new file mode 100644
index 00000000000..a12f90569fa
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/index.js
@@ -0,0 +1 @@
+module.exports = require('./lib/marked');
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/jasmine.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/jasmine.json
new file mode 100644
index 00000000000..8d1be919d17
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/jasmine.json
@@ -0,0 +1,11 @@
+{
+ "spec_dir": "test",
+ "spec_files": [
+ "**/*-spec.js"
+ ],
+ "helpers": [
+ "helpers/**/*.js"
+ ],
+ "stopSpecOnExpectationFailure": false,
+ "random": true
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/lib/marked.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/lib/marked.js
new file mode 100644
index 00000000000..33c02d9cf41
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/lib/marked.js
@@ -0,0 +1,1514 @@
+/**
+ * marked - a markdown parser
+ * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/markedjs/marked
+ */
+
+;(function(root) {
+'use strict';
+
+/**
+ * Block-Level Grammar
+ */
+
+var block = {
+ newline: /^\n+/,
+ code: /^( {4}[^\n]+\n*)+/,
+ fences: noop,
+ hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
+ heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
+ nptable: noop,
+ blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
+ list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
+ html: '^ {0,3}(?:' // optional indentation
+ + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
+ + '|comment[^\\n]*(\\n+|$)' // (2)
+ + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
+ + '|<![A-Z][\\s\\S]*?>\\n*' // (4)
+ + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
+ + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
+ + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
+ + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
+ + ')',
+ def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
+ table: noop,
+ lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
+ paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
+ text: /^[^\n]+/
+};
+
+block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
+block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
+block.def = edit(block.def)
+ .replace('label', block._label)
+ .replace('title', block._title)
+ .getRegex();
+
+block.bullet = /(?:[*+-]|\d+\.)/;
+block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
+block.item = edit(block.item, 'gm')
+ .replace(/bull/g, block.bullet)
+ .getRegex();
+
+block.list = edit(block.list)
+ .replace(/bull/g, block.bullet)
+ .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
+ .replace('def', '\\n+(?=' + block.def.source + ')')
+ .getRegex();
+
+block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
+ + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
+ + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
+ + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
+ + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
+ + '|track|ul';
+block._comment = /<!--(?!-?>)[\s\S]*?-->/;
+block.html = edit(block.html, 'i')
+ .replace('comment', block._comment)
+ .replace('tag', block._tag)
+ .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
+ .getRegex();
+
+block.paragraph = edit(block.paragraph)
+ .replace('hr', block.hr)
+ .replace('heading', block.heading)
+ .replace('lheading', block.lheading)
+ .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
+ .getRegex();
+
+block.blockquote = edit(block.blockquote)
+ .replace('paragraph', block.paragraph)
+ .getRegex();
+
+/**
+ * Normal Block Grammar
+ */
+
+block.normal = merge({}, block);
+
+/**
+ * GFM Block Grammar
+ */
+
+block.gfm = merge({}, block.normal, {
+ fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,
+ paragraph: /^/,
+ heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
+});
+
+block.gfm.paragraph = edit(block.paragraph)
+ .replace('(?!', '(?!'
+ + block.gfm.fences.source.replace('\\1', '\\2') + '|'
+ + block.list.source.replace('\\1', '\\3') + '|')
+ .getRegex();
+
+/**
+ * GFM + Tables Block Grammar
+ */
+
+block.tables = merge({}, block.gfm, {
+ nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
+ table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
+});
+
+/**
+ * Pedantic grammar
+ */
+
+block.pedantic = merge({}, block.normal, {
+ html: edit(
+ '^ *(?:comment *(?:\\n|\\s*$)'
+ + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
+ + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
+ .replace('comment', block._comment)
+ .replace(/tag/g, '(?!(?:'
+ + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
+ + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
+ + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
+ .getRegex(),
+ def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/
+});
+
+/**
+ * Block Lexer
+ */
+
+function Lexer(options) {
+ this.tokens = [];
+ this.tokens.links = {};
+ this.options = options || marked.defaults;
+ this.rules = block.normal;
+
+ if (this.options.pedantic) {
+ this.rules = block.pedantic;
+ } else if (this.options.gfm) {
+ if (this.options.tables) {
+ this.rules = block.tables;
+ } else {
+ this.rules = block.gfm;
+ }
+ }
+}
+
+/**
+ * Expose Block Rules
+ */
+
+Lexer.rules = block;
+
+/**
+ * Static Lex Method
+ */
+
+Lexer.lex = function(src, options) {
+ var lexer = new Lexer(options);
+ return lexer.lex(src);
+};
+
+/**
+ * Preprocessing
+ */
+
+Lexer.prototype.lex = function(src) {
+ src = src
+ .replace(/\r\n|\r/g, '\n')
+ .replace(/\t/g, ' ')
+ .replace(/\u00a0/g, ' ')
+ .replace(/\u2424/g, '\n');
+
+ return this.token(src, true);
+};
+
+/**
+ * Lexing
+ */
+
+Lexer.prototype.token = function(src, top) {
+ src = src.replace(/^ +$/gm, '');
+ var next,
+ loose,
+ cap,
+ bull,
+ b,
+ item,
+ space,
+ i,
+ tag,
+ l,
+ isordered,
+ istask,
+ ischecked;
+
+ while (src) {
+ // newline
+ if (cap = this.rules.newline.exec(src)) {
+ src = src.substring(cap[0].length);
+ if (cap[0].length > 1) {
+ this.tokens.push({
+ type: 'space'
+ });
+ }
+ }
+
+ // code
+ if (cap = this.rules.code.exec(src)) {
+ src = src.substring(cap[0].length);
+ cap = cap[0].replace(/^ {4}/gm, '');
+ this.tokens.push({
+ type: 'code',
+ text: !this.options.pedantic
+ ? cap.replace(/\n+$/, '')
+ : cap
+ });
+ continue;
+ }
+
+ // fences (gfm)
+ if (cap = this.rules.fences.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'code',
+ lang: cap[2],
+ text: cap[3] || ''
+ });
+ continue;
+ }
+
+ // heading
+ if (cap = this.rules.heading.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'heading',
+ depth: cap[1].length,
+ text: cap[2]
+ });
+ continue;
+ }
+
+ // table no leading pipe (gfm)
+ if (top && (cap = this.rules.nptable.exec(src))) {
+ item = {
+ type: 'table',
+ header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
+ align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+ cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
+ };
+
+ if (item.header.length === item.align.length) {
+ src = src.substring(cap[0].length);
+
+ for (i = 0; i < item.align.length; i++) {
+ if (/^ *-+: *$/.test(item.align[i])) {
+ item.align[i] = 'right';
+ } else if (/^ *:-+: *$/.test(item.align[i])) {
+ item.align[i] = 'center';
+ } else if (/^ *:-+ *$/.test(item.align[i])) {
+ item.align[i] = 'left';
+ } else {
+ item.align[i] = null;
+ }
+ }
+
+ for (i = 0; i < item.cells.length; i++) {
+ item.cells[i] = splitCells(item.cells[i], item.header.length);
+ }
+
+ this.tokens.push(item);
+
+ continue;
+ }
+ }
+
+ // hr
+ if (cap = this.rules.hr.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'hr'
+ });
+ continue;
+ }
+
+ // blockquote
+ if (cap = this.rules.blockquote.exec(src)) {
+ src = src.substring(cap[0].length);
+
+ this.tokens.push({
+ type: 'blockquote_start'
+ });
+
+ cap = cap[0].replace(/^ *> ?/gm, '');
+
+ // Pass `top` to keep the current
+ // "toplevel" state. This is exactly
+ // how markdown.pl works.
+ this.token(cap, top);
+
+ this.tokens.push({
+ type: 'blockquote_end'
+ });
+
+ continue;
+ }
+
+ // list
+ if (cap = this.rules.list.exec(src)) {
+ src = src.substring(cap[0].length);
+ bull = cap[2];
+ isordered = bull.length > 1;
+
+ this.tokens.push({
+ type: 'list_start',
+ ordered: isordered,
+ start: isordered ? +bull : ''
+ });
+
+ // Get each top-level item.
+ cap = cap[0].match(this.rules.item);
+
+ next = false;
+ l = cap.length;
+ i = 0;
+
+ for (; i < l; i++) {
+ item = cap[i];
+
+ // Remove the list item's bullet
+ // so it is seen as the next token.
+ space = item.length;
+ item = item.replace(/^ *([*+-]|\d+\.) +/, '');
+
+ // Outdent whatever the
+ // list item contains. Hacky.
+ if (~item.indexOf('\n ')) {
+ space -= item.length;
+ item = !this.options.pedantic
+ ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
+ : item.replace(/^ {1,4}/gm, '');
+ }
+
+ // Determine whether the next list item belongs here.
+ // Backpedal if it does not belong in this list.
+ if (this.options.smartLists && i !== l - 1) {
+ b = block.bullet.exec(cap[i + 1])[0];
+ if (bull !== b && !(bull.length > 1 && b.length > 1)) {
+ src = cap.slice(i + 1).join('\n') + src;
+ i = l - 1;
+ }
+ }
+
+ // Determine whether item is loose or not.
+ // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
+ // for discount behavior.
+ loose = next || /\n\n(?!\s*$)/.test(item);
+ if (i !== l - 1) {
+ next = item.charAt(item.length - 1) === '\n';
+ if (!loose) loose = next;
+ }
+
+ // Check for task list items
+ istask = /^\[[ xX]\] /.test(item);
+ ischecked = undefined;
+ if (istask) {
+ ischecked = item[1] !== ' ';
+ item = item.replace(/^\[[ xX]\] +/, '');
+ }
+
+ this.tokens.push({
+ type: loose
+ ? 'loose_item_start'
+ : 'list_item_start',
+ task: istask,
+ checked: ischecked
+ });
+
+ // Recurse.
+ this.token(item, false);
+
+ this.tokens.push({
+ type: 'list_item_end'
+ });
+ }
+
+ this.tokens.push({
+ type: 'list_end'
+ });
+
+ continue;
+ }
+
+ // html
+ if (cap = this.rules.html.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: this.options.sanitize
+ ? 'paragraph'
+ : 'html',
+ pre: !this.options.sanitizer
+ && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
+ text: cap[0]
+ });
+ continue;
+ }
+
+ // def
+ if (top && (cap = this.rules.def.exec(src))) {
+ src = src.substring(cap[0].length);
+ if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
+ tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
+ if (!this.tokens.links[tag]) {
+ this.tokens.links[tag] = {
+ href: cap[2],
+ title: cap[3]
+ };
+ }
+ continue;
+ }
+
+ // table (gfm)
+ if (top && (cap = this.rules.table.exec(src))) {
+ item = {
+ type: 'table',
+ header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
+ align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+ cells: cap[3] ? cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') : []
+ };
+
+ if (item.header.length === item.align.length) {
+ src = src.substring(cap[0].length);
+
+ for (i = 0; i < item.align.length; i++) {
+ if (/^ *-+: *$/.test(item.align[i])) {
+ item.align[i] = 'right';
+ } else if (/^ *:-+: *$/.test(item.align[i])) {
+ item.align[i] = 'center';
+ } else if (/^ *:-+ *$/.test(item.align[i])) {
+ item.align[i] = 'left';
+ } else {
+ item.align[i] = null;
+ }
+ }
+
+ for (i = 0; i < item.cells.length; i++) {
+ item.cells[i] = splitCells(
+ item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
+ item.header.length);
+ }
+
+ this.tokens.push(item);
+
+ continue;
+ }
+ }
+
+ // lheading
+ if (cap = this.rules.lheading.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'heading',
+ depth: cap[2] === '=' ? 1 : 2,
+ text: cap[1]
+ });
+ continue;
+ }
+
+ // top-level paragraph
+ if (top && (cap = this.rules.paragraph.exec(src))) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'paragraph',
+ text: cap[1].charAt(cap[1].length - 1) === '\n'
+ ? cap[1].slice(0, -1)
+ : cap[1]
+ });
+ continue;
+ }
+
+ // text
+ if (cap = this.rules.text.exec(src)) {
+ // Top-level should never reach here.
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'text',
+ text: cap[0]
+ });
+ continue;
+ }
+
+ if (src) {
+ throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
+ }
+ }
+
+ return this.tokens;
+};
+
+/**
+ * Inline-Level Grammar
+ */
+
+var inline = {
+ escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
+ autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
+ url: noop,
+ tag: '^comment'
+ + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
+ + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
+ + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
+ + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
+ + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
+ link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,
+ reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
+ nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
+ strong: /^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)|^__([^\s])__(?!_)|^\*\*([^\s])\*\*(?!\*)/,
+ em: /^_([^\s][\s\S]*?[^\s_])_(?!_)|^_([^\s_][\s\S]*?[^\s])_(?!_)|^\*([^\s][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*][\s\S]*?[^\s])\*(?!\*)|^_([^\s_])_(?!_)|^\*([^\s*])\*(?!\*)/,
+ code: /^(`+)\s*([\s\S]*?[^`]?)\s*\1(?!`)/,
+ br: /^ {2,}\n(?!\s*$)/,
+ del: noop,
+ text: /^[\s\S]+?(?=[\\<!\[`*]|\b_| {2,}\n|$)/
+};
+
+inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
+
+inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
+inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
+inline.autolink = edit(inline.autolink)
+ .replace('scheme', inline._scheme)
+ .replace('email', inline._email)
+ .getRegex();
+
+inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
+
+inline.tag = edit(inline.tag)
+ .replace('comment', block._comment)
+ .replace('attribute', inline._attribute)
+ .getRegex();
+
+inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/;
+inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f()\\]*\)|[^\s\x00-\x1f()\\])*?)/;
+inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
+
+inline.link = edit(inline.link)
+ .replace('label', inline._label)
+ .replace('href', inline._href)
+ .replace('title', inline._title)
+ .getRegex();
+
+inline.reflink = edit(inline.reflink)
+ .replace('label', inline._label)
+ .getRegex();
+
+/**
+ * Normal Inline Grammar
+ */
+
+inline.normal = merge({}, inline);
+
+/**
+ * Pedantic Inline Grammar
+ */
+
+inline.pedantic = merge({}, inline.normal, {
+ strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
+ em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
+ link: edit(/^!?\[(label)\]\((.*?)\)/)
+ .replace('label', inline._label)
+ .getRegex(),
+ reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
+ .replace('label', inline._label)
+ .getRegex()
+});
+
+/**
+ * GFM Inline Grammar
+ */
+
+inline.gfm = merge({}, inline.normal, {
+ escape: edit(inline.escape).replace('])', '~|])').getRegex(),
+ url: edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/)
+ .replace('email', inline._email)
+ .getRegex(),
+ _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
+ del: /^~~(?=\S)([\s\S]*?\S)~~/,
+ text: edit(inline.text)
+ .replace(']|', '~]|')
+ .replace('|', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|')
+ .getRegex()
+});
+
+/**
+ * GFM + Line Breaks Inline Grammar
+ */
+
+inline.breaks = merge({}, inline.gfm, {
+ br: edit(inline.br).replace('{2,}', '*').getRegex(),
+ text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()
+});
+
+/**
+ * Inline Lexer & Compiler
+ */
+
+function InlineLexer(links, options) {
+ this.options = options || marked.defaults;
+ this.links = links;
+ this.rules = inline.normal;
+ this.renderer = this.options.renderer || new Renderer();
+ this.renderer.options = this.options;
+
+ if (!this.links) {
+ throw new Error('Tokens array requires a `links` property.');
+ }
+
+ if (this.options.pedantic) {
+ this.rules = inline.pedantic;
+ } else if (this.options.gfm) {
+ if (this.options.breaks) {
+ this.rules = inline.breaks;
+ } else {
+ this.rules = inline.gfm;
+ }
+ }
+}
+
+/**
+ * Expose Inline Rules
+ */
+
+InlineLexer.rules = inline;
+
+/**
+ * Static Lexing/Compiling Method
+ */
+
+InlineLexer.output = function(src, links, options) {
+ var inline = new InlineLexer(links, options);
+ return inline.output(src);
+};
+
+/**
+ * Lexing/Compiling
+ */
+
+InlineLexer.prototype.output = function(src) {
+ var out = '',
+ link,
+ text,
+ href,
+ title,
+ cap;
+
+ while (src) {
+ // escape
+ if (cap = this.rules.escape.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += cap[1];
+ continue;
+ }
+
+ // autolink
+ if (cap = this.rules.autolink.exec(src)) {
+ src = src.substring(cap[0].length);
+ if (cap[2] === '@') {
+ text = escape(this.mangle(cap[1]));
+ href = 'mailto:' + text;
+ } else {
+ text = escape(cap[1]);
+ href = text;
+ }
+ out += this.renderer.link(href, null, text);
+ continue;
+ }
+
+ // url (gfm)
+ if (!this.inLink && (cap = this.rules.url.exec(src))) {
+ cap[0] = this.rules._backpedal.exec(cap[0])[0];
+ src = src.substring(cap[0].length);
+ if (cap[2] === '@') {
+ text = escape(cap[0]);
+ href = 'mailto:' + text;
+ } else {
+ text = escape(cap[0]);
+ if (cap[1] === 'www.') {
+ href = 'http://' + text;
+ } else {
+ href = text;
+ }
+ }
+ out += this.renderer.link(href, null, text);
+ continue;
+ }
+
+ // tag
+ if (cap = this.rules.tag.exec(src)) {
+ if (!this.inLink && /^<a /i.test(cap[0])) {
+ this.inLink = true;
+ } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
+ this.inLink = false;
+ }
+ src = src.substring(cap[0].length);
+ out += this.options.sanitize
+ ? this.options.sanitizer
+ ? this.options.sanitizer(cap[0])
+ : escape(cap[0])
+ : cap[0]
+ continue;
+ }
+
+ // link
+ if (cap = this.rules.link.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.inLink = true;
+ href = cap[2];
+ if (this.options.pedantic) {
+ link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
+
+ if (link) {
+ href = link[1];
+ title = link[3];
+ } else {
+ title = '';
+ }
+ } else {
+ title = cap[3] ? cap[3].slice(1, -1) : '';
+ }
+ href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
+ out += this.outputLink(cap, {
+ href: InlineLexer.escapes(href),
+ title: InlineLexer.escapes(title)
+ });
+ this.inLink = false;
+ continue;
+ }
+
+ // reflink, nolink
+ if ((cap = this.rules.reflink.exec(src))
+ || (cap = this.rules.nolink.exec(src))) {
+ src = src.substring(cap[0].length);
+ link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
+ link = this.links[link.toLowerCase()];
+ if (!link || !link.href) {
+ out += cap[0].charAt(0);
+ src = cap[0].substring(1) + src;
+ continue;
+ }
+ this.inLink = true;
+ out += this.outputLink(cap, link);
+ this.inLink = false;
+ continue;
+ }
+
+ // strong
+ if (cap = this.rules.strong.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
+ continue;
+ }
+
+ // em
+ if (cap = this.rules.em.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
+ continue;
+ }
+
+ // code
+ if (cap = this.rules.code.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.codespan(escape(cap[2].trim(), true));
+ continue;
+ }
+
+ // br
+ if (cap = this.rules.br.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.br();
+ continue;
+ }
+
+ // del (gfm)
+ if (cap = this.rules.del.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.del(this.output(cap[1]));
+ continue;
+ }
+
+ // text
+ if (cap = this.rules.text.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.text(escape(this.smartypants(cap[0])));
+ continue;
+ }
+
+ if (src) {
+ throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
+ }
+ }
+
+ return out;
+};
+
+InlineLexer.escapes = function(text) {
+ return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
+}
+
+/**
+ * Compile Link
+ */
+
+InlineLexer.prototype.outputLink = function(cap, link) {
+ var href = link.href,
+ title = link.title ? escape(link.title) : null;
+
+ return cap[0].charAt(0) !== '!'
+ ? this.renderer.link(href, title, this.output(cap[1]))
+ : this.renderer.image(href, title, escape(cap[1]));
+};
+
+/**
+ * Smartypants Transformations
+ */
+
+InlineLexer.prototype.smartypants = function(text) {
+ if (!this.options.smartypants) return text;
+ return text
+ // em-dashes
+ .replace(/---/g, '\u2014')
+ // en-dashes
+ .replace(/--/g, '\u2013')
+ // opening singles
+ .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
+ // closing singles & apostrophes
+ .replace(/'/g, '\u2019')
+ // opening doubles
+ .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
+ // closing doubles
+ .replace(/"/g, '\u201d')
+ // ellipses
+ .replace(/\.{3}/g, '\u2026');
+};
+
+/**
+ * Mangle Links
+ */
+
+InlineLexer.prototype.mangle = function(text) {
+ if (!this.options.mangle) return text;
+ var out = '',
+ l = text.length,
+ i = 0,
+ ch;
+
+ for (; i < l; i++) {
+ ch = text.charCodeAt(i);
+ if (Math.random() > 0.5) {
+ ch = 'x' + ch.toString(16);
+ }
+ out += '&#' + ch + ';';
+ }
+
+ return out;
+};
+
+/**
+ * Renderer
+ */
+
+function Renderer(options) {
+ this.options = options || marked.defaults;
+}
+
+Renderer.prototype.code = function(code, lang, escaped) {
+ if (this.options.highlight) {
+ var out = this.options.highlight(code, lang);
+ if (out != null && out !== code) {
+ escaped = true;
+ code = out;
+ }
+ }
+
+ if (!lang) {
+ return '<pre><code>'
+ + (escaped ? code : escape(code, true))
+ + '</code></pre>';
+ }
+
+ return '<pre><code class="'
+ + this.options.langPrefix
+ + escape(lang, true)
+ + '">'
+ + (escaped ? code : escape(code, true))
+ + '</code></pre>\n';
+};
+
+Renderer.prototype.blockquote = function(quote) {
+ return '<blockquote>\n' + quote + '</blockquote>\n';
+};
+
+Renderer.prototype.html = function(html) {
+ return html;
+};
+
+Renderer.prototype.heading = function(text, level, raw) {
+ if (this.options.headerIds) {
+ return '<h'
+ + level
+ + ' id="'
+ + this.options.headerPrefix
+ + raw.toLowerCase().replace(/[^\w]+/g, '-')
+ + '">'
+ + text
+ + '</h'
+ + level
+ + '>\n';
+ }
+ // ignore IDs
+ return '<h' + level + '>' + text + '</h' + level + '>\n';
+};
+
+Renderer.prototype.hr = function() {
+ return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
+};
+
+Renderer.prototype.list = function(body, ordered, start) {
+ var type = ordered ? 'ol' : 'ul',
+ startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
+ return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
+};
+
+Renderer.prototype.listitem = function(text) {
+ return '<li>' + text + '</li>\n';
+};
+
+Renderer.prototype.checkbox = function(checked) {
+ return '<input '
+ + (checked ? 'checked="" ' : '')
+ + 'disabled="" type="checkbox"'
+ + (this.options.xhtml ? ' /' : '')
+ + '> ';
+}
+
+Renderer.prototype.paragraph = function(text) {
+ return '<p>' + text + '</p>\n';
+};
+
+Renderer.prototype.table = function(header, body) {
+ if (body) body = '<tbody>' + body + '</tbody>';
+
+ return '<table>\n'
+ + '<thead>\n'
+ + header
+ + '</thead>\n'
+ + body
+ + '</table>\n';
+};
+
+Renderer.prototype.tablerow = function(content) {
+ return '<tr>\n' + content + '</tr>\n';
+};
+
+Renderer.prototype.tablecell = function(content, flags) {
+ var type = flags.header ? 'th' : 'td';
+ var tag = flags.align
+ ? '<' + type + ' align="' + flags.align + '">'
+ : '<' + type + '>';
+ return tag + content + '</' + type + '>\n';
+};
+
+// span level renderer
+Renderer.prototype.strong = function(text) {
+ return '<strong>' + text + '</strong>';
+};
+
+Renderer.prototype.em = function(text) {
+ return '<em>' + text + '</em>';
+};
+
+Renderer.prototype.codespan = function(text) {
+ return '<code>' + text + '</code>';
+};
+
+Renderer.prototype.br = function() {
+ return this.options.xhtml ? '<br/>' : '<br>';
+};
+
+Renderer.prototype.del = function(text) {
+ return '<del>' + text + '</del>';
+};
+
+Renderer.prototype.link = function(href, title, text) {
+ if (this.options.sanitize) {
+ try {
+ var prot = decodeURIComponent(unescape(href))
+ .replace(/[^\w:]/g, '')
+ .toLowerCase();
+ } catch (e) {
+ return text;
+ }
+ if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
+ return text;
+ }
+ }
+ if (this.options.baseUrl && !originIndependentUrl.test(href)) {
+ href = resolveUrl(this.options.baseUrl, href);
+ }
+ try {
+ href = encodeURI(href).replace(/%25/g, '%');
+ } catch (e) {
+ return text;
+ }
+ var out = '<a href="' + escape(href) + '"';
+ if (title) {
+ out += ' title="' + title + '"';
+ }
+ out += '>' + text + '</a>';
+ return out;
+};
+
+Renderer.prototype.image = function(href, title, text) {
+ if (this.options.baseUrl && !originIndependentUrl.test(href)) {
+ href = resolveUrl(this.options.baseUrl, href);
+ }
+ var out = '<img src="' + href + '" alt="' + text + '"';
+ if (title) {
+ out += ' title="' + title + '"';
+ }
+ out += this.options.xhtml ? '/>' : '>';
+ return out;
+};
+
+Renderer.prototype.text = function(text) {
+ return text;
+};
+
+/**
+ * TextRenderer
+ * returns only the textual part of the token
+ */
+
+function TextRenderer() {}
+
+// no need for block level renderers
+
+TextRenderer.prototype.strong =
+TextRenderer.prototype.em =
+TextRenderer.prototype.codespan =
+TextRenderer.prototype.del =
+TextRenderer.prototype.text = function (text) {
+ return text;
+}
+
+TextRenderer.prototype.link =
+TextRenderer.prototype.image = function(href, title, text) {
+ return '' + text;
+}
+
+TextRenderer.prototype.br = function() {
+ return '';
+}
+
+/**
+ * Parsing & Compiling
+ */
+
+function Parser(options) {
+ this.tokens = [];
+ this.token = null;
+ this.options = options || marked.defaults;
+ this.options.renderer = this.options.renderer || new Renderer();
+ this.renderer = this.options.renderer;
+ this.renderer.options = this.options;
+}
+
+/**
+ * Static Parse Method
+ */
+
+Parser.parse = function(src, options) {
+ var parser = new Parser(options);
+ return parser.parse(src);
+};
+
+/**
+ * Parse Loop
+ */
+
+Parser.prototype.parse = function(src) {
+ this.inline = new InlineLexer(src.links, this.options);
+ // use an InlineLexer with a TextRenderer to extract pure text
+ this.inlineText = new InlineLexer(
+ src.links,
+ merge({}, this.options, {renderer: new TextRenderer()})
+ );
+ this.tokens = src.reverse();
+
+ var out = '';
+ while (this.next()) {
+ out += this.tok();
+ }
+
+ return out;
+};
+
+/**
+ * Next Token
+ */
+
+Parser.prototype.next = function() {
+ return this.token = this.tokens.pop();
+};
+
+/**
+ * Preview Next Token
+ */
+
+Parser.prototype.peek = function() {
+ return this.tokens[this.tokens.length - 1] || 0;
+};
+
+/**
+ * Parse Text Tokens
+ */
+
+Parser.prototype.parseText = function() {
+ var body = this.token.text;
+
+ while (this.peek().type === 'text') {
+ body += '\n' + this.next().text;
+ }
+
+ return this.inline.output(body);
+};
+
+/**
+ * Parse Current Token
+ */
+
+Parser.prototype.tok = function() {
+ switch (this.token.type) {
+ case 'space': {
+ return '';
+ }
+ case 'hr': {
+ return this.renderer.hr();
+ }
+ case 'heading': {
+ return this.renderer.heading(
+ this.inline.output(this.token.text),
+ this.token.depth,
+ unescape(this.inlineText.output(this.token.text)));
+ }
+ case 'code': {
+ return this.renderer.code(this.token.text,
+ this.token.lang,
+ this.token.escaped);
+ }
+ case 'table': {
+ var header = '',
+ body = '',
+ i,
+ row,
+ cell,
+ j;
+
+ // header
+ cell = '';
+ for (i = 0; i < this.token.header.length; i++) {
+ cell += this.renderer.tablecell(
+ this.inline.output(this.token.header[i]),
+ { header: true, align: this.token.align[i] }
+ );
+ }
+ header += this.renderer.tablerow(cell);
+
+ for (i = 0; i < this.token.cells.length; i++) {
+ row = this.token.cells[i];
+
+ cell = '';
+ for (j = 0; j < row.length; j++) {
+ cell += this.renderer.tablecell(
+ this.inline.output(row[j]),
+ { header: false, align: this.token.align[j] }
+ );
+ }
+
+ body += this.renderer.tablerow(cell);
+ }
+ return this.renderer.table(header, body);
+ }
+ case 'blockquote_start': {
+ body = '';
+
+ while (this.next().type !== 'blockquote_end') {
+ body += this.tok();
+ }
+
+ return this.renderer.blockquote(body);
+ }
+ case 'list_start': {
+ body = '';
+ var ordered = this.token.ordered,
+ start = this.token.start;
+
+ while (this.next().type !== 'list_end') {
+ body += this.tok();
+ }
+
+ return this.renderer.list(body, ordered, start);
+ }
+ case 'list_item_start': {
+ body = '';
+
+ if (this.token.task) {
+ body += this.renderer.checkbox(this.token.checked);
+ }
+
+ while (this.next().type !== 'list_item_end') {
+ body += this.token.type === 'text'
+ ? this.parseText()
+ : this.tok();
+ }
+
+ return this.renderer.listitem(body);
+ }
+ case 'loose_item_start': {
+ body = '';
+
+ while (this.next().type !== 'list_item_end') {
+ body += this.tok();
+ }
+
+ return this.renderer.listitem(body);
+ }
+ case 'html': {
+ // TODO parse inline content if parameter markdown=1
+ return this.renderer.html(this.token.text);
+ }
+ case 'paragraph': {
+ return this.renderer.paragraph(this.inline.output(this.token.text));
+ }
+ case 'text': {
+ return this.renderer.paragraph(this.parseText());
+ }
+ }
+};
+
+/**
+ * Helpers
+ */
+
+function escape(html, encode) {
+ return html
+ .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&amp;')
+ .replace(/</g, '&lt;')
+ .replace(/>/g, '&gt;')
+ .replace(/"/g, '&quot;')
+ .replace(/'/g, '&#39;');
+}
+
+function unescape(html) {
+ // explicitly match decimal, hex, and named HTML entities
+ return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
+ n = n.toLowerCase();
+ if (n === 'colon') return ':';
+ if (n.charAt(0) === '#') {
+ return n.charAt(1) === 'x'
+ ? String.fromCharCode(parseInt(n.substring(2), 16))
+ : String.fromCharCode(+n.substring(1));
+ }
+ return '';
+ });
+}
+
+function edit(regex, opt) {
+ regex = regex.source || regex;
+ opt = opt || '';
+ return {
+ replace: function(name, val) {
+ val = val.source || val;
+ val = val.replace(/(^|[^\[])\^/g, '$1');
+ regex = regex.replace(name, val);
+ return this;
+ },
+ getRegex: function() {
+ return new RegExp(regex, opt);
+ }
+ };
+}
+
+function resolveUrl(base, href) {
+ if (!baseUrls[' ' + base]) {
+ // we can ignore everything in base after the last slash of its path component,
+ // but we might need to add _that_
+ // https://tools.ietf.org/html/rfc3986#section-3
+ if (/^[^:]+:\/*[^/]*$/.test(base)) {
+ baseUrls[' ' + base] = base + '/';
+ } else {
+ baseUrls[' ' + base] = base.replace(/[^/]*$/, '');
+ }
+ }
+ base = baseUrls[' ' + base];
+
+ if (href.slice(0, 2) === '//') {
+ return base.replace(/:[\s\S]*/, ':') + href;
+ } else if (href.charAt(0) === '/') {
+ return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
+ } else {
+ return base + href;
+ }
+}
+var baseUrls = {};
+var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
+
+function noop() {}
+noop.exec = noop;
+
+function merge(obj) {
+ var i = 1,
+ target,
+ key;
+
+ for (; i < arguments.length; i++) {
+ target = arguments[i];
+ for (key in target) {
+ if (Object.prototype.hasOwnProperty.call(target, key)) {
+ obj[key] = target[key];
+ }
+ }
+ }
+
+ return obj;
+}
+
+function splitCells(tableRow, count) {
+ var cells = tableRow.replace(/([^\\])\|/g, '$1 |').split(/ +\| */),
+ i = 0;
+
+ if (cells.length > count) {
+ cells.splice(count);
+ } else {
+ while (cells.length < count) cells.push('');
+ }
+
+ for (; i < cells.length; i++) {
+ cells[i] = cells[i].replace(/\\\|/g, '|');
+ }
+ return cells;
+}
+
+/**
+ * Marked
+ */
+
+function marked(src, opt, callback) {
+ // throw error in case of non string input
+ if (typeof src === 'undefined' || src === null) {
+ throw new Error('marked(): input parameter is undefined or null');
+ }
+ if (typeof src !== 'string') {
+ throw new Error('marked(): input parameter is of type '
+ + Object.prototype.toString.call(src) + ', string expected');
+ }
+
+ if (callback || typeof opt === 'function') {
+ if (!callback) {
+ callback = opt;
+ opt = null;
+ }
+
+ opt = merge({}, marked.defaults, opt || {});
+
+ var highlight = opt.highlight,
+ tokens,
+ pending,
+ i = 0;
+
+ try {
+ tokens = Lexer.lex(src, opt)
+ } catch (e) {
+ return callback(e);
+ }
+
+ pending = tokens.length;
+
+ var done = function(err) {
+ if (err) {
+ opt.highlight = highlight;
+ return callback(err);
+ }
+
+ var out;
+
+ try {
+ out = Parser.parse(tokens, opt);
+ } catch (e) {
+ err = e;
+ }
+
+ opt.highlight = highlight;
+
+ return err
+ ? callback(err)
+ : callback(null, out);
+ };
+
+ if (!highlight || highlight.length < 3) {
+ return done();
+ }
+
+ delete opt.highlight;
+
+ if (!pending) return done();
+
+ for (; i < tokens.length; i++) {
+ (function(token) {
+ if (token.type !== 'code') {
+ return --pending || done();
+ }
+ return highlight(token.text, token.lang, function(err, code) {
+ if (err) return done(err);
+ if (code == null || code === token.text) {
+ return --pending || done();
+ }
+ token.text = code;
+ token.escaped = true;
+ --pending || done();
+ });
+ })(tokens[i]);
+ }
+
+ return;
+ }
+ try {
+ if (opt) opt = merge({}, marked.defaults, opt);
+ return Parser.parse(Lexer.lex(src, opt), opt);
+ } catch (e) {
+ e.message += '\nPlease report this to https://github.com/markedjs/marked.';
+ if ((opt || marked.defaults).silent) {
+ return '<p>An error occurred:</p><pre>'
+ + escape(e.message + '', true)
+ + '</pre>';
+ }
+ throw e;
+ }
+}
+
+/**
+ * Options
+ */
+
+marked.options =
+marked.setOptions = function(opt) {
+ merge(marked.defaults, opt);
+ return marked;
+};
+
+marked.getDefaults = function () {
+ return {
+ baseUrl: null,
+ breaks: false,
+ gfm: true,
+ headerIds: true,
+ headerPrefix: '',
+ highlight: null,
+ langPrefix: 'language-',
+ mangle: true,
+ pedantic: false,
+ renderer: new Renderer(),
+ sanitize: false,
+ sanitizer: null,
+ silent: false,
+ smartLists: false,
+ smartypants: false,
+ tables: true,
+ xhtml: false
+ };
+}
+
+marked.defaults = marked.getDefaults();
+
+/**
+ * Expose
+ */
+
+marked.Parser = Parser;
+marked.parser = Parser.parse;
+
+marked.Renderer = Renderer;
+marked.TextRenderer = TextRenderer;
+
+marked.Lexer = Lexer;
+marked.lexer = Lexer.lex;
+
+marked.InlineLexer = InlineLexer;
+marked.inlineLexer = InlineLexer.output;
+
+marked.parse = marked;
+
+if (typeof module !== 'undefined' && typeof exports === 'object') {
+ module.exports = marked;
+} else if (typeof define === 'function' && define.amd) {
+ define(function() { return marked; });
+} else {
+ root.marked = marked;
+}
+})(this || (typeof window !== 'undefined' ? window : global));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/man/marked.1 b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/man/marked.1
new file mode 100644
index 00000000000..a8e41b50311
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/man/marked.1
@@ -0,0 +1,91 @@
+.ds q \N'34'
+.TH marked 1 "2014-01-31" "v0.3.1" "marked.js"
+
+.SH NAME
+marked \- a javascript markdown parser
+
+.SH SYNOPSIS
+.B marked
+[\-o \fI<output>\fP] [\-i \fI<input>\fP] [\-\-help]
+[\-\-tokens] [\-\-pedantic] [\-\-gfm]
+[\-\-breaks] [\-\-tables] [\-\-sanitize]
+[\-\-smart\-lists] [\-\-lang\-prefix \fI<prefix>\fP]
+[\-\-no\-etc...] [\-\-silent] [\fIfilename\fP]
+
+.SH DESCRIPTION
+.B marked
+is a full-featured javascript markdown parser, built for speed. It also includes
+multiple GFM features.
+
+.SH EXAMPLES
+.TP
+cat in.md | marked > out.html
+.TP
+echo "hello *world*" | marked
+.TP
+marked \-o out.html \-i in.md \-\-gfm
+.TP
+marked \-\-output="hello world.html" \-i in.md \-\-no-breaks
+
+.SH OPTIONS
+.TP
+.BI \-o,\ \-\-output\ [\fIoutput\fP]
+Specify file output. If none is specified, write to stdout.
+.TP
+.BI \-i,\ \-\-input\ [\fIinput\fP]
+Specify file input, otherwise use last argument as input file. If no input file
+is specified, read from stdin.
+.TP
+.BI \-t,\ \-\-tokens
+Output a token stream instead of html.
+.TP
+.BI \-\-pedantic
+Conform to obscure parts of markdown.pl as much as possible. Don't fix original
+markdown bugs.
+.TP
+.BI \-\-gfm
+Enable github flavored markdown.
+.TP
+.BI \-\-breaks
+Enable GFM line breaks. Only works with the gfm option.
+.TP
+.BI \-\-tables
+Enable GFM tables. Only works with the gfm option.
+.TP
+.BI \-\-sanitize
+Sanitize output. Ignore any HTML input.
+.TP
+.BI \-\-smart\-lists
+Use smarter list behavior than the original markdown.
+.TP
+.BI \-\-lang\-prefix\ [\fIprefix\fP]
+Set the prefix for code block classes.
+.TP
+.BI \-\-mangle
+Mangle email addresses.
+.TP
+.BI \-\-no\-sanitize,\ \-no-etc...
+The inverse of any of the marked options above.
+.TP
+.BI \-\-silent
+Silence error output.
+.TP
+.BI \-h,\ \-\-help
+Display help information.
+
+.SH CONFIGURATION
+For configuring and running programmatically.
+
+.B Example
+
+ require('marked')('*foo*', { gfm: true });
+
+.SH BUGS
+Please report any bugs to https://github.com/markedjs/marked.
+
+.SH LICENSE
+Copyright (c) 2011-2014, Christopher Jeffrey (MIT License).
+
+.SH "SEE ALSO"
+.BR markdown(1),
+.BR node.js(1)
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/man/marked.1.txt b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/man/marked.1.txt
new file mode 100644
index 00000000000..fd9b37ef334
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/man/marked.1.txt
@@ -0,0 +1,96 @@
+marked(1) marked.js marked(1)
+
+
+
+NAME
+ marked - a javascript markdown parser
+
+
+SYNOPSIS
+ marked [-o <output>] [-i <input>] [--help] [--tokens] [--pedantic]
+ [--gfm] [--breaks] [--tables] [--sanitize] [--smart-lists] [--lang-pre‐
+ fix <prefix>] [--no-etc...] [--silent] [filename]
+
+
+DESCRIPTION
+ marked is a full-featured javascript markdown parser, built for speed.
+ It also includes multiple GFM features.
+
+
+EXAMPLES
+ cat in.md | marked > out.html
+
+ echo "hello *world*" | marked
+
+ marked -o out.html -i in.md --gfm
+
+ marked --output="hello world.html" -i in.md --no-breaks
+
+
+OPTIONS
+ -o, --output [output]
+ Specify file output. If none is specified, write to stdout.
+
+ -i, --input [input]
+ Specify file input, otherwise use last argument as input file.
+ If no input file is specified, read from stdin.
+
+ -t, --tokens
+ Output a token stream instead of html.
+
+ --pedantic
+ Conform to obscure parts of markdown.pl as much as possible.
+ Don't fix original markdown bugs.
+
+ --gfm Enable github flavored markdown.
+
+ --breaks
+ Enable GFM line breaks. Only works with the gfm option.
+
+ --tables
+ Enable GFM tables. Only works with the gfm option.
+
+ --sanitize
+ Sanitize output. Ignore any HTML input.
+
+ --smart-lists
+ Use smarter list behavior than the original markdown.
+
+ --lang-prefix [prefix]
+ Set the prefix for code block classes.
+
+ --mangle
+ Mangle email addresses.
+
+ --no-sanitize, -no-etc...
+ The inverse of any of the marked options above.
+
+ --silent
+ Silence error output.
+
+ -h, --help
+ Display help information.
+
+
+CONFIGURATION
+ For configuring and running programmatically.
+
+ Example
+
+ require('marked')('*foo*', { gfm: true });
+
+
+BUGS
+ Please report any bugs to https://github.com/chjj/marked.
+
+
+LICENSE
+ Copyright (c) 2011-2014, Christopher Jeffrey (MIT License).
+
+
+SEE ALSO
+ markdown(1), node.js(1)
+
+
+
+v0.3.1 2014-01-31 marked(1)
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/marked.min.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/marked.min.js
new file mode 100644
index 00000000000..d6e5f23790a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/marked.min.js
@@ -0,0 +1,6 @@
+/**
+ * marked - a markdown parser
+ * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/markedjs/marked
+ */
+!function(e){"use strict";var t={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:d,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,nptable:d,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?\\?>\\n*|<![A-Z][\\s\\S]*?>\\n*|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,table:d,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,text:/^[^\n]+/};function n(e){this.tokens=[],this.tokens.links={},this.options=e||m.defaults,this.rules=t.normal,this.options.pedantic?this.rules=t.pedantic:this.options.gfm&&(this.options.tables?this.rules=t.tables:this.rules=t.gfm)}t._label=/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,t._title=/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/,t.def=p(t.def).replace("label",t._label).replace("title",t._title).getRegex(),t.bullet=/(?:[*+-]|\d+\.)/,t.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/,t.item=p(t.item,"gm").replace(/bull/g,t.bullet).getRegex(),t.list=p(t.list).replace(/bull/g,t.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+t.def.source+")").getRegex(),t._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",t._comment=/<!--(?!-?>)[\s\S]*?-->/,t.html=p(t.html,"i").replace("comment",t._comment).replace("tag",t._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),t.paragraph=p(t.paragraph).replace("hr",t.hr).replace("heading",t.heading).replace("lheading",t.lheading).replace("tag",t._tag).getRegex(),t.blockquote=p(t.blockquote).replace("paragraph",t.paragraph).getRegex(),t.normal=f({},t),t.gfm=f({},t.normal,{fences:/^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/}),t.gfm.paragraph=p(t.paragraph).replace("(?!","(?!"+t.gfm.fences.source.replace("\\1","\\2")+"|"+t.list.source.replace("\\1","\\3")+"|").getRegex(),t.tables=f({},t.gfm,{nptable:/^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,table:/^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/}),t.pedantic=f({},t.normal,{html:p("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\s[^'\"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",t._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/}),n.rules=t,n.lex=function(e,t){return new n(t).lex(e)},n.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0)},n.prototype.token=function(e,n){var r,s,i,l,o,a,h,p,u,c,g,d,f;for(e=e.replace(/^ +$/gm,"");e;)if((i=this.rules.newline.exec(e))&&(e=e.substring(i[0].length),i[0].length>1&&this.tokens.push({type:"space"})),i=this.rules.code.exec(e))e=e.substring(i[0].length),i=i[0].replace(/^ {4}/gm,""),this.tokens.push({type:"code",text:this.options.pedantic?i:i.replace(/\n+$/,"")});else if(i=this.rules.fences.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"code",lang:i[2],text:i[3]||""});else if(i=this.rules.heading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"heading",depth:i[1].length,text:i[2]});else if(n&&(i=this.rules.nptable.exec(e))&&(a={type:"table",header:b(i[1].replace(/^ *| *\| *$/g,"")),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3]?i[3].replace(/\n$/,"").split("\n"):[]}).header.length===a.align.length){for(e=e.substring(i[0].length),p=0;p<a.align.length;p++)/^ *-+: *$/.test(a.align[p])?a.align[p]="right":/^ *:-+: *$/.test(a.align[p])?a.align[p]="center":/^ *:-+ *$/.test(a.align[p])?a.align[p]="left":a.align[p]=null;for(p=0;p<a.cells.length;p++)a.cells[p]=b(a.cells[p],a.header.length);this.tokens.push(a)}else if(i=this.rules.hr.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"hr"});else if(i=this.rules.blockquote.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"blockquote_start"}),i=i[0].replace(/^ *> ?/gm,""),this.token(i,n),this.tokens.push({type:"blockquote_end"});else if(i=this.rules.list.exec(e)){for(e=e.substring(i[0].length),g=(l=i[2]).length>1,this.tokens.push({type:"list_start",ordered:g,start:g?+l:""}),r=!1,c=(i=i[0].match(this.rules.item)).length,p=0;p<c;p++)h=(a=i[p]).length,~(a=a.replace(/^ *([*+-]|\d+\.) +/,"")).indexOf("\n ")&&(h-=a.length,a=this.options.pedantic?a.replace(/^ {1,4}/gm,""):a.replace(new RegExp("^ {1,"+h+"}","gm"),"")),this.options.smartLists&&p!==c-1&&(l===(o=t.bullet.exec(i[p+1])[0])||l.length>1&&o.length>1||(e=i.slice(p+1).join("\n")+e,p=c-1)),s=r||/\n\n(?!\s*$)/.test(a),p!==c-1&&(r="\n"===a.charAt(a.length-1),s||(s=r)),f=void 0,(d=/^\[[ xX]\] /.test(a))&&(f=" "!==a[1],a=a.replace(/^\[[ xX]\] +/,"")),this.tokens.push({type:s?"loose_item_start":"list_item_start",task:d,checked:f}),this.token(a,!1),this.tokens.push({type:"list_item_end"});this.tokens.push({type:"list_end"})}else if(i=this.rules.html.exec(e))e=e.substring(i[0].length),this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&("pre"===i[1]||"script"===i[1]||"style"===i[1]),text:i[0]});else if(n&&(i=this.rules.def.exec(e)))e=e.substring(i[0].length),i[3]&&(i[3]=i[3].substring(1,i[3].length-1)),u=i[1].toLowerCase().replace(/\s+/g," "),this.tokens.links[u]||(this.tokens.links[u]={href:i[2],title:i[3]});else if(n&&(i=this.rules.table.exec(e))&&(a={type:"table",header:b(i[1].replace(/^ *| *\| *$/g,"")),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3]?i[3].replace(/(?: *\| *)?\n$/,"").split("\n"):[]}).header.length===a.align.length){for(e=e.substring(i[0].length),p=0;p<a.align.length;p++)/^ *-+: *$/.test(a.align[p])?a.align[p]="right":/^ *:-+: *$/.test(a.align[p])?a.align[p]="center":/^ *:-+ *$/.test(a.align[p])?a.align[p]="left":a.align[p]=null;for(p=0;p<a.cells.length;p++)a.cells[p]=b(a.cells[p].replace(/^ *\| *| *\| *$/g,""),a.header.length);this.tokens.push(a)}else if(i=this.rules.lheading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"heading",depth:"="===i[2]?1:2,text:i[1]});else if(n&&(i=this.rules.paragraph.exec(e)))e=e.substring(i[0].length),this.tokens.push({type:"paragraph",text:"\n"===i[1].charAt(i[1].length-1)?i[1].slice(0,-1):i[1]});else if(i=this.rules.text.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"text",text:i[0]});else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0));return this.tokens};var r={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:d,tag:"^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>",link:/^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,strong:/^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)|^__([^\s])__(?!_)|^\*\*([^\s])\*\*(?!\*)/,em:/^_([^\s][\s\S]*?[^\s_])_(?!_)|^_([^\s_][\s\S]*?[^\s])_(?!_)|^\*([^\s][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*][\s\S]*?[^\s])\*(?!\*)|^_([^\s_])_(?!_)|^\*([^\s*])\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`]?)\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:d,text:/^[\s\S]+?(?=[\\<!\[`*]|\b_| {2,}\n|$)/};function s(e,t){if(this.options=t||m.defaults,this.links=e,this.rules=r.normal,this.renderer=this.options.renderer||new i,this.renderer.options=this.options,!this.links)throw new Error("Tokens array requires a `links` property.");this.options.pedantic?this.rules=r.pedantic:this.options.gfm&&(this.options.breaks?this.rules=r.breaks:this.rules=r.gfm)}function i(e){this.options=e||m.defaults}function l(){}function o(e){this.tokens=[],this.token=null,this.options=e||m.defaults,this.options.renderer=this.options.renderer||new i,this.renderer=this.options.renderer,this.renderer.options=this.options}function a(e,t){return e.replace(t?/&/g:/&(?!#?\w+;)/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function h(e){return e.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}function p(e,t){return e=e.source||e,t=t||"",{replace:function(t,n){return n=(n=n.source||n).replace(/(^|[^\[])\^/g,"$1"),e=e.replace(t,n),this},getRegex:function(){return new RegExp(e,t)}}}function u(e,t){return c[" "+e]||(/^[^:]+:\/*[^/]*$/.test(e)?c[" "+e]=e+"/":c[" "+e]=e.replace(/[^/]*$/,"")),e=c[" "+e],"//"===t.slice(0,2)?e.replace(/:[\s\S]*/,":")+t:"/"===t.charAt(0)?e.replace(/(:\/*[^/]*)[\s\S]*/,"$1")+t:e+t}r._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,r._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,r._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,r.autolink=p(r.autolink).replace("scheme",r._scheme).replace("email",r._email).getRegex(),r._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,r.tag=p(r.tag).replace("comment",t._comment).replace("attribute",r._attribute).getRegex(),r._label=/(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/,r._href=/\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f()\\]*\)|[^\s\x00-\x1f()\\])*?)/,r._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,r.link=p(r.link).replace("label",r._label).replace("href",r._href).replace("title",r._title).getRegex(),r.reflink=p(r.reflink).replace("label",r._label).getRegex(),r.normal=f({},r),r.pedantic=f({},r.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,link:p(/^!?\[(label)\]\((.*?)\)/).replace("label",r._label).getRegex(),reflink:p(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",r._label).getRegex()}),r.gfm=f({},r.normal,{escape:p(r.escape).replace("])","~|])").getRegex(),url:p(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("email",r._email).getRegex(),_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:p(r.text).replace("]|","~]|").replace("|","|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&'*+/=?^_`{\\|}~-]+@|").getRegex()}),r.breaks=f({},r.gfm,{br:p(r.br).replace("{2,}","*").getRegex(),text:p(r.gfm.text).replace("{2,}","*").getRegex()}),s.rules=r,s.output=function(e,t,n){return new s(t,n).output(e)},s.prototype.output=function(e){for(var t,n,r,i,l,o="";e;)if(l=this.rules.escape.exec(e))e=e.substring(l[0].length),o+=l[1];else if(l=this.rules.autolink.exec(e))e=e.substring(l[0].length),r="@"===l[2]?"mailto:"+(n=a(this.mangle(l[1]))):n=a(l[1]),o+=this.renderer.link(r,null,n);else if(this.inLink||!(l=this.rules.url.exec(e))){if(l=this.rules.tag.exec(e))!this.inLink&&/^<a /i.test(l[0])?this.inLink=!0:this.inLink&&/^<\/a>/i.test(l[0])&&(this.inLink=!1),e=e.substring(l[0].length),o+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(l[0]):a(l[0]):l[0];else if(l=this.rules.link.exec(e))e=e.substring(l[0].length),this.inLink=!0,r=l[2],this.options.pedantic?(t=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(r))?(r=t[1],i=t[3]):i="":i=l[3]?l[3].slice(1,-1):"",r=r.trim().replace(/^<([\s\S]*)>$/,"$1"),o+=this.outputLink(l,{href:s.escapes(r),title:s.escapes(i)}),this.inLink=!1;else if((l=this.rules.reflink.exec(e))||(l=this.rules.nolink.exec(e))){if(e=e.substring(l[0].length),t=(l[2]||l[1]).replace(/\s+/g," "),!(t=this.links[t.toLowerCase()])||!t.href){o+=l[0].charAt(0),e=l[0].substring(1)+e;continue}this.inLink=!0,o+=this.outputLink(l,t),this.inLink=!1}else if(l=this.rules.strong.exec(e))e=e.substring(l[0].length),o+=this.renderer.strong(this.output(l[4]||l[3]||l[2]||l[1]));else if(l=this.rules.em.exec(e))e=e.substring(l[0].length),o+=this.renderer.em(this.output(l[6]||l[5]||l[4]||l[3]||l[2]||l[1]));else if(l=this.rules.code.exec(e))e=e.substring(l[0].length),o+=this.renderer.codespan(a(l[2].trim(),!0));else if(l=this.rules.br.exec(e))e=e.substring(l[0].length),o+=this.renderer.br();else if(l=this.rules.del.exec(e))e=e.substring(l[0].length),o+=this.renderer.del(this.output(l[1]));else if(l=this.rules.text.exec(e))e=e.substring(l[0].length),o+=this.renderer.text(a(this.smartypants(l[0])));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else l[0]=this.rules._backpedal.exec(l[0])[0],e=e.substring(l[0].length),"@"===l[2]?r="mailto:"+(n=a(l[0])):(n=a(l[0]),r="www."===l[1]?"http://"+n:n),o+=this.renderer.link(r,null,n);return o},s.escapes=function(e){return e?e.replace(s.rules._escapes,"$1"):e},s.prototype.outputLink=function(e,t){var n=t.href,r=t.title?a(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,a(e[1]))},s.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},s.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,n="",r=e.length,s=0;s<r;s++)t=e.charCodeAt(s),Math.random()>.5&&(t="x"+t.toString(16)),n+="&#"+t+";";return n},i.prototype.code=function(e,t,n){if(this.options.highlight){var r=this.options.highlight(e,t);null!=r&&r!==e&&(n=!0,e=r)}return t?'<pre><code class="'+this.options.langPrefix+a(t,!0)+'">'+(n?e:a(e,!0))+"</code></pre>\n":"<pre><code>"+(n?e:a(e,!0))+"</code></pre>"},i.prototype.blockquote=function(e){return"<blockquote>\n"+e+"</blockquote>\n"},i.prototype.html=function(e){return e},i.prototype.heading=function(e,t,n){return this.options.headerIds?"<h"+t+' id="'+this.options.headerPrefix+n.toLowerCase().replace(/[^\w]+/g,"-")+'">'+e+"</h"+t+">\n":"<h"+t+">"+e+"</h"+t+">\n"},i.prototype.hr=function(){return this.options.xhtml?"<hr/>\n":"<hr>\n"},i.prototype.list=function(e,t,n){var r=t?"ol":"ul";return"<"+r+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+"</"+r+">\n"},i.prototype.listitem=function(e){return"<li>"+e+"</li>\n"},i.prototype.checkbox=function(e){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox"'+(this.options.xhtml?" /":"")+"> "},i.prototype.paragraph=function(e){return"<p>"+e+"</p>\n"},i.prototype.table=function(e,t){return t&&(t="<tbody>"+t+"</tbody>"),"<table>\n<thead>\n"+e+"</thead>\n"+t+"</table>\n"},i.prototype.tablerow=function(e){return"<tr>\n"+e+"</tr>\n"},i.prototype.tablecell=function(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' align="'+t.align+'">':"<"+n+">")+e+"</"+n+">\n"},i.prototype.strong=function(e){return"<strong>"+e+"</strong>"},i.prototype.em=function(e){return"<em>"+e+"</em>"},i.prototype.codespan=function(e){return"<code>"+e+"</code>"},i.prototype.br=function(){return this.options.xhtml?"<br/>":"<br>"},i.prototype.del=function(e){return"<del>"+e+"</del>"},i.prototype.link=function(e,t,n){if(this.options.sanitize){try{var r=decodeURIComponent(h(e)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return n}if(0===r.indexOf("javascript:")||0===r.indexOf("vbscript:")||0===r.indexOf("data:"))return n}this.options.baseUrl&&!g.test(e)&&(e=u(this.options.baseUrl,e));try{e=encodeURI(e).replace(/%25/g,"%")}catch(e){return n}var s='<a href="'+a(e)+'"';return t&&(s+=' title="'+t+'"'),s+=">"+n+"</a>"},i.prototype.image=function(e,t,n){this.options.baseUrl&&!g.test(e)&&(e=u(this.options.baseUrl,e));var r='<img src="'+e+'" alt="'+n+'"';return t&&(r+=' title="'+t+'"'),r+=this.options.xhtml?"/>":">"},i.prototype.text=function(e){return e},l.prototype.strong=l.prototype.em=l.prototype.codespan=l.prototype.del=l.prototype.text=function(e){return e},l.prototype.link=l.prototype.image=function(e,t,n){return""+n},l.prototype.br=function(){return""},o.parse=function(e,t){return new o(t).parse(e)},o.prototype.parse=function(e){this.inline=new s(e.links,this.options),this.inlineText=new s(e.links,f({},this.options,{renderer:new l})),this.tokens=e.reverse();for(var t="";this.next();)t+=this.tok();return t},o.prototype.next=function(){return this.token=this.tokens.pop()},o.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},o.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},o.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,h(this.inlineText.output(this.token.text)));case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,r,s="",i="";for(n="",e=0;e<this.token.header.length;e++)n+=this.renderer.tablecell(this.inline.output(this.token.header[e]),{header:!0,align:this.token.align[e]});for(s+=this.renderer.tablerow(n),e=0;e<this.token.cells.length;e++){for(t=this.token.cells[e],n="",r=0;r<t.length;r++)n+=this.renderer.tablecell(this.inline.output(t[r]),{header:!1,align:this.token.align[r]});i+=this.renderer.tablerow(n)}return this.renderer.table(s,i);case"blockquote_start":for(i="";"blockquote_end"!==this.next().type;)i+=this.tok();return this.renderer.blockquote(i);case"list_start":i="";for(var l=this.token.ordered,o=this.token.start;"list_end"!==this.next().type;)i+=this.tok();return this.renderer.list(i,l,o);case"list_item_start":for(i="",this.token.task&&(i+=this.renderer.checkbox(this.token.checked));"list_item_end"!==this.next().type;)i+="text"===this.token.type?this.parseText():this.tok();return this.renderer.listitem(i);case"loose_item_start":for(i="";"list_item_end"!==this.next().type;)i+=this.tok();return this.renderer.listitem(i);case"html":return this.renderer.html(this.token.text);case"paragraph":return this.renderer.paragraph(this.inline.output(this.token.text));case"text":return this.renderer.paragraph(this.parseText())}};var c={},g=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function d(){}function f(e){for(var t,n,r=1;r<arguments.length;r++)for(n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}function b(e,t){var n=e.replace(/([^\\])\|/g,"$1 |").split(/ +\| */),r=0;if(n.length>t)n.splice(t);else for(;n.length<t;)n.push("");for(;r<n.length;r++)n[r]=n[r].replace(/\\\|/g,"|");return n}function m(e,t,r){if(null==e)throw new Error("marked(): input parameter is undefined or null");if("string"!=typeof e)throw new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected");if(r||"function"==typeof t){r||(r=t,t=null);var s,i,l=(t=f({},m.defaults,t||{})).highlight,h=0;try{s=n.lex(e,t)}catch(e){return r(e)}i=s.length;var p=function(e){if(e)return t.highlight=l,r(e);var n;try{n=o.parse(s,t)}catch(t){e=t}return t.highlight=l,e?r(e):r(null,n)};if(!l||l.length<3)return p();if(delete t.highlight,!i)return p();for(;h<s.length;h++)!function(e){"code"!==e.type?--i||p():l(e.text,e.lang,function(t,n){return t?p(t):null==n||n===e.text?--i||p():(e.text=n,e.escaped=!0,void(--i||p()))})}(s[h])}else try{return t&&(t=f({},m.defaults,t)),o.parse(n.lex(e,t),t)}catch(e){if(e.message+="\nPlease report this to https://github.com/markedjs/marked.",(t||m.defaults).silent)return"<p>An error occurred:</p><pre>"+a(e.message+"",!0)+"</pre>";throw e}}d.exec=d,m.options=m.setOptions=function(e){return f(m.defaults,e),m},m.getDefaults=function(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:new i,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tables:!0,xhtml:!1}},m.defaults=m.getDefaults(),m.Parser=o,m.parser=o.parse,m.Renderer=i,m.TextRenderer=l,m.Lexer=n,m.lexer=n.lex,m.InlineLexer=s,m.inlineLexer=s.output,m.parse=m,"undefined"!=typeof module&&"object"==typeof exports?module.exports=m:"function"==typeof define&&define.amd?define(function(){return m}):e.marked=m}(this||("undefined"!=typeof window?window:global)); \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/package-lock.json
new file mode 100644
index 00000000000..1602f8d5510
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/package-lock.json
@@ -0,0 +1,2501 @@
+{
+ "name": "marked",
+ "version": "0.4.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@types/concat-stream": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz",
+ "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.5"
+ }
+ },
+ "@types/form-data": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz",
+ "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.5"
+ }
+ },
+ "@types/node": {
+ "version": "9.6.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.5.tgz",
+ "integrity": "sha512-NOLEgsT6UiDTjnWG5Hd2Mg25LRyz/oe8ql3wbjzgSFeRzRROhPmtlsvIrei4B46UjERF0td9SZ1ZXPLOdcrBHg==",
+ "dev": true
+ },
+ "@types/qs": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.5.1.tgz",
+ "integrity": "sha512-mNhVdZHdtKHMMxbqzNK3RzkBcN1cux3AvuCYGTvjEIQT2uheH3eCAyYsbMbh2Bq8nXkeOWs1kyDiF7geWRFQ4Q==",
+ "dev": true
+ },
+ "abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "dev": true
+ },
+ "acorn": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz",
+ "integrity": "sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+ "dev": true,
+ "requires": {
+ "acorn": "3.3.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+ "dev": true
+ }
+ }
+ },
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "dev": true,
+ "requires": {
+ "co": "4.6.0",
+ "fast-deep-equal": "1.0.0",
+ "fast-json-stable-stringify": "2.0.0",
+ "json-schema-traverse": "0.3.1"
+ }
+ },
+ "ajv-keywords": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
+ "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
+ "dev": true
+ },
+ "ansi-escapes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz",
+ "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argparse": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
+ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "1.0.3"
+ }
+ },
+ "array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "dev": true,
+ "requires": {
+ "array-uniq": "1.0.3"
+ }
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+ "dev": true
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+ "dev": true
+ },
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+ "dev": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
+ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "caller-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+ "dev": true,
+ "requires": {
+ "callsites": "0.2.0"
+ }
+ },
+ "callsites": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "chardet": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
+ "dev": true
+ },
+ "circular-json": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
+ "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
+ "dev": true
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "2.0.0"
+ }
+ },
+ "cli-width": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+ "dev": true
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true
+ },
+ "coa": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/coa/-/coa-0.4.0.tgz",
+ "integrity": "sha1-JSvBvpdArxXYJuSQ6LE5PC/ioGI=",
+ "dev": true,
+ "requires": {
+ "q": "0.9.7"
+ }
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "dev": true
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
+ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "1.0.0"
+ }
+ },
+ "commander": {
+ "version": "2.14.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
+ "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "concat-stream": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
+ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.3",
+ "typedarray": "0.0.6"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
+ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ }
+ }
+ },
+ "contains-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "4.1.1",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
+ "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "1.0.2",
+ "yallist": "2.1.2"
+ }
+ }
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "del": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "dev": true,
+ "requires": {
+ "globby": "5.0.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.0",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "rimraf": "2.6.2"
+ },
+ "dependencies": {
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
+ }
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true
+ },
+ "diff": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.8.tgz",
+ "integrity": "sha1-NDJ2MI7Jkbe8giZ+1VvBQR+XFmY=",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "entities": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
+ "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
+ "dev": true
+ },
+ "error-ex": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "0.2.1"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "eslint": {
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.17.0.tgz",
+ "integrity": "sha512-AyxBUCANU/o/xC0ijGMKavo5Ls3oK6xykiOITlMdjFjrKOsqLrA7Nf5cnrDgcKrHzBirclAZt63XO7YZlVUPwA==",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "babel-code-frame": "6.26.0",
+ "chalk": "2.3.0",
+ "concat-stream": "1.6.0",
+ "cross-spawn": "5.1.0",
+ "debug": "3.1.0",
+ "doctrine": "2.1.0",
+ "eslint-scope": "3.7.1",
+ "eslint-visitor-keys": "1.0.0",
+ "espree": "3.5.3",
+ "esquery": "1.0.0",
+ "esutils": "2.0.2",
+ "file-entry-cache": "2.0.0",
+ "functional-red-black-tree": "1.0.1",
+ "glob": "7.1.2",
+ "globals": "11.3.0",
+ "ignore": "3.3.7",
+ "imurmurhash": "0.1.4",
+ "inquirer": "3.3.0",
+ "is-resolvable": "1.1.0",
+ "js-yaml": "3.10.0",
+ "json-stable-stringify-without-jsonify": "1.0.1",
+ "levn": "0.3.0",
+ "lodash": "4.17.5",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.1",
+ "natural-compare": "1.4.0",
+ "optionator": "0.8.2",
+ "path-is-inside": "1.0.2",
+ "pluralize": "7.0.0",
+ "progress": "2.0.0",
+ "require-uncached": "1.0.3",
+ "semver": "5.5.0",
+ "strip-ansi": "4.0.0",
+ "strip-json-comments": "2.0.1",
+ "table": "4.0.2",
+ "text-table": "0.2.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.3.3",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.8"
+ }
+ },
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "eslint-config-standard": {
+ "version": "11.0.0-beta.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0-beta.0.tgz",
+ "integrity": "sha512-f+vs5HAHQo7NRZ3hVe+UVdT5DbebMNaFTWFp95orJ0LUdYPoWdM8xw/bMeO/IZMvHOPmIteGKGc2QOhSXd5nRg==",
+ "dev": true
+ },
+ "eslint-import-resolver-node": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz",
+ "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "resolve": "1.5.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "eslint-module-utils": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz",
+ "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "pkg-dir": "1.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "eslint-plugin-import": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz",
+ "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==",
+ "dev": true,
+ "requires": {
+ "builtin-modules": "1.1.1",
+ "contains-path": "0.1.0",
+ "debug": "2.6.9",
+ "doctrine": "1.5.0",
+ "eslint-import-resolver-node": "0.3.2",
+ "eslint-module-utils": "2.1.1",
+ "has": "1.0.1",
+ "lodash.cond": "4.5.2",
+ "minimatch": "3.0.4",
+ "read-pkg-up": "2.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "doctrine": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "isarray": "1.0.0"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.8"
+ }
+ }
+ }
+ },
+ "eslint-plugin-node": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz",
+ "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==",
+ "dev": true,
+ "requires": {
+ "ignore": "3.3.7",
+ "minimatch": "3.0.4",
+ "resolve": "1.5.0",
+ "semver": "5.3.0"
+ },
+ "dependencies": {
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.8"
+ }
+ },
+ "semver": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+ "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-promise": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz",
+ "integrity": "sha512-YQzM6TLTlApAr7Li8vWKR+K3WghjwKcYzY0d2roWap4SLK+kzuagJX/leTetIDWsFcTFnKNJXWupDCD6aZkP2Q==",
+ "dev": true
+ },
+ "eslint-plugin-standard": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz",
+ "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=",
+ "dev": true
+ },
+ "eslint-plugin-vuln-regex-detector": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vuln-regex-detector/-/eslint-plugin-vuln-regex-detector-1.0.4.tgz",
+ "integrity": "sha512-MlGNEvfk/lmHrbp6gIXKP2NPedA+wX2+KwezolXLE6t9q0pcmohkYm2EKmgL9z5n57CAIYFJ/I4SSI3ANWyl/A==",
+ "dev": true,
+ "requires": {
+ "requireindex": "1.1.0",
+ "vuln-regex-detector": "1.3.0"
+ }
+ },
+ "eslint-scope": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
+ "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
+ "dev": true,
+ "requires": {
+ "esrecurse": "4.2.0",
+ "estraverse": "4.2.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
+ "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
+ "dev": true
+ },
+ "espree": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.3.tgz",
+ "integrity": "sha512-Zy3tAJDORxQZLl2baguiRU1syPERAIg0L+JB2MWorORgTu/CplzvxS9WWA7Xh4+Q+eOQihNs/1o1Xep8cvCxWQ==",
+ "dev": true,
+ "requires": {
+ "acorn": "5.4.1",
+ "acorn-jsx": "3.0.1"
+ }
+ },
+ "esprima": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
+ "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz",
+ "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=",
+ "dev": true,
+ "requires": {
+ "estraverse": "4.2.0"
+ }
+ },
+ "esrecurse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz",
+ "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=",
+ "dev": true,
+ "requires": {
+ "estraverse": "4.2.0",
+ "object-assign": "4.1.1"
+ },
+ "dependencies": {
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
+ }
+ }
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "5.1.0",
+ "get-stream": "3.0.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.2",
+ "strip-eof": "1.0.0"
+ }
+ },
+ "external-editor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz",
+ "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==",
+ "dev": true,
+ "requires": {
+ "chardet": "0.4.2",
+ "iconv-lite": "0.4.19",
+ "tmp": "0.0.33"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz",
+ "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "file-entry-cache": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
+ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+ "dev": true,
+ "requires": {
+ "flat-cache": "1.3.0",
+ "object-assign": "4.1.1"
+ },
+ "dependencies": {
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
+ }
+ }
+ },
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "requires": {
+ "locate-path": "2.0.0"
+ }
+ },
+ "flat-cache": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
+ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
+ "dev": true,
+ "requires": {
+ "circular-json": "0.3.3",
+ "del": "2.2.2",
+ "graceful-fs": "4.1.11",
+ "write": "0.2.1"
+ },
+ "dependencies": {
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ }
+ }
+ },
+ "form-data": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
+ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
+ "dev": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.6",
+ "mime-types": "2.1.18"
+ }
+ },
+ "front-matter": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-2.3.0.tgz",
+ "integrity": "sha1-cgOviWzjV+4E4qpFFp6pHtf2dQQ=",
+ "dev": true,
+ "requires": {
+ "js-yaml": "3.10.0"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
+ "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
+ "dev": true
+ },
+ "get-port": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
+ "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.3.3",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "11.3.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz",
+ "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==",
+ "dev": true
+ },
+ "globby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+ "dev": true,
+ "requires": {
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.3.3",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.8"
+ }
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
+ }
+ }
+ },
+ "has": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz",
+ "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=",
+ "dev": true,
+ "requires": {
+ "function-bind": "1.1.1"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+ "dev": true
+ },
+ "hosted-git-info": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
+ "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==",
+ "dev": true
+ },
+ "html-differ": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/html-differ/-/html-differ-1.3.4.tgz",
+ "integrity": "sha1-n0e66XV9JRPR7a2Cc8xeQ/wAbMY=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.0.0",
+ "coa": "0.4.0",
+ "diff": "1.0.8",
+ "lodash": "2.4.1",
+ "parse5": "1.1.3",
+ "vow": "0.4.3",
+ "vow-fs": "0.3.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz",
+ "integrity": "sha1-QchHGUZGN15qGl0Qw8oFTvn8mA0=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.0.0.tgz",
+ "integrity": "sha1-s89O0P9Tl8mcdbj2edsvUoMfltw=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "1.0.3",
+ "strip-ansi": "2.0.1",
+ "supports-color": "1.3.1"
+ }
+ },
+ "has-ansi": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-1.0.3.tgz",
+ "integrity": "sha1-wLWxYV2eOCsP9nFp2We0JeSMpTg=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "1.1.1",
+ "get-stdin": "4.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz",
+ "integrity": "sha1-32LBqpTtLxFOHQ8h/R1QSCt5pg4=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "1.1.1"
+ }
+ },
+ "supports-color": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.3.1.tgz",
+ "integrity": "sha1-FXWN8J2P87SswwdTn6vicJXhBC0=",
+ "dev": true
+ }
+ }
+ },
+ "http-basic": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-7.0.0.tgz",
+ "integrity": "sha1-gvClBr6UJzLsje6+6A50bvVzbbo=",
+ "dev": true,
+ "requires": {
+ "@types/concat-stream": "1.6.0",
+ "@types/node": "9.6.5",
+ "caseless": "0.12.0",
+ "concat-stream": "1.6.0",
+ "http-response-object": "3.0.1",
+ "parse-cache-control": "1.0.1"
+ }
+ },
+ "http-response-object": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.1.tgz",
+ "integrity": "sha512-6L0Fkd6TozA8kFSfh9Widst0wfza3U1Ex2RjJ6zNDK0vR1U1auUR6jY4Nn2Xl7CCy0ikFmxW1XcspVpb9RvwTg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.5"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.19",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
+ "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
+ "dev": true
+ },
+ "ignore": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
+ "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==",
+ "dev": true
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.3.3",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "inquirer": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
+ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "3.0.0",
+ "chalk": "2.3.0",
+ "cli-cursor": "2.1.0",
+ "cli-width": "2.2.0",
+ "external-editor": "2.1.0",
+ "figures": "2.0.0",
+ "lodash": "4.17.5",
+ "mute-stream": "0.0.7",
+ "run-async": "2.3.0",
+ "rx-lite": "4.0.8",
+ "rx-lite-aggregates": "4.0.8",
+ "string-width": "2.1.1",
+ "strip-ansi": "4.0.0",
+ "through": "2.3.8"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+ "dev": true
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+ "dev": true,
+ "requires": {
+ "builtin-modules": "1.1.1"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-path-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+ "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+ "dev": true
+ },
+ "is-path-in-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
+ "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
+ "dev": true,
+ "requires": {
+ "is-path-inside": "1.0.1"
+ }
+ },
+ "is-path-inside": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+ "dev": true,
+ "requires": {
+ "path-is-inside": "1.0.2"
+ }
+ },
+ "is-promise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
+ "dev": true
+ },
+ "is-resolvable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "jasmine": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.1.0.tgz",
+ "integrity": "sha1-K9Wf1+xuwOistk4J9Fpo7SrRlSo=",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2",
+ "jasmine-core": "3.1.0"
+ }
+ },
+ "jasmine-core": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.1.0.tgz",
+ "integrity": "sha1-pHheE11d9lAk38kiSVPfWFvSdmw=",
+ "dev": true
+ },
+ "jasmine2-custom-message": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/jasmine2-custom-message/-/jasmine2-custom-message-0.9.0.tgz",
+ "integrity": "sha512-HQMYCNaieAwVkt3KLNNcZz7ONpqMEJCtdAJFebTjD46GS20GZMppE7fYZY0qCd6fr0TjIFWtZcPz7vMc2VOtRg==",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz",
+ "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==",
+ "dev": true,
+ "requires": {
+ "argparse": "1.0.9",
+ "esprima": "4.0.0"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+ "dev": true
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "dev": true,
+ "requires": {
+ "invert-kv": "1.0.0"
+ }
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "linkify-it": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.3.tgz",
+ "integrity": "sha1-2UpGSPmxwXnWT6lykSaL22zpQ08=",
+ "dev": true,
+ "requires": {
+ "uc.micro": "1.0.3"
+ }
+ },
+ "load-json-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "strip-bom": "3.0.0"
+ },
+ "dependencies": {
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ }
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "dev": true,
+ "requires": {
+ "p-locate": "2.0.0",
+ "path-exists": "3.0.0"
+ }
+ },
+ "lodash": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz",
+ "integrity": "sha1-W3cjA03aTSYuWkb7LFjXzCL3FCA=",
+ "dev": true
+ },
+ "lodash.cond": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz",
+ "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
+ "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=",
+ "dev": true
+ },
+ "markdown": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/markdown/-/markdown-0.5.0.tgz",
+ "integrity": "sha1-KCBbVlqK51kt4gdGPWY33BgnIrI=",
+ "dev": true,
+ "requires": {
+ "nopt": "2.1.2"
+ }
+ },
+ "markdown-it": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.0.tgz",
+ "integrity": "sha512-tNuOCCfunY5v5uhcO2AUMArvKAyKMygX8tfup/JrgnsDqcCATQsAExBq7o5Ml9iMmO82bk6jYNLj6khcrl0JGA==",
+ "dev": true,
+ "requires": {
+ "argparse": "1.0.9",
+ "entities": "1.1.1",
+ "linkify-it": "2.0.3",
+ "mdurl": "1.0.1",
+ "uc.micro": "1.0.3"
+ }
+ },
+ "mdurl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
+ "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=",
+ "dev": true
+ },
+ "mem": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
+ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "1.1.0"
+ }
+ },
+ "mime-db": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
+ "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.18",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
+ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.33.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz",
+ "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.8"
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+ "dev": true
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "node-uuid": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.0.tgz",
+ "integrity": "sha1-B/myM3Vy/2J1x3Xh1IUT86RdemU=",
+ "dev": true
+ },
+ "nopt": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz",
+ "integrity": "sha1-bMzZd7gBMqB3MdbozljCyDA8+a8=",
+ "dev": true,
+ "requires": {
+ "abbrev": "1.1.1"
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "2.5.0",
+ "is-builtin-module": "1.0.0",
+ "semver": "4.3.6",
+ "validate-npm-package-license": "3.0.1"
+ }
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "dev": true,
+ "requires": {
+ "path-key": "2.0.1"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
+ "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "1.1.0"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "os-locale": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+ "dev": true,
+ "requires": {
+ "execa": "0.7.0",
+ "lcid": "1.0.0",
+ "mem": "1.1.0"
+ }
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "dev": true
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+ "dev": true
+ },
+ "p-limit": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz",
+ "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=",
+ "dev": true
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "dev": true,
+ "requires": {
+ "p-limit": "1.1.0"
+ }
+ },
+ "parse-cache-control": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
+ "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=",
+ "dev": true
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "requires": {
+ "error-ex": "1.3.1"
+ }
+ },
+ "parse5": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.1.3.tgz",
+ "integrity": "sha1-i6tY0GUl8A5ON9dVEW64LnJB8UI=",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "dev": true,
+ "requires": {
+ "pify": "2.3.0"
+ }
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
+ "requires": {
+ "pinkie": "2.0.4"
+ }
+ },
+ "pkg-dir": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
+ "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
+ "dev": true,
+ "requires": {
+ "find-up": "1.1.2"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "requires": {
+ "path-exists": "2.1.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "2.0.1"
+ }
+ }
+ }
+ },
+ "pluralize": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
+ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "dev": true
+ },
+ "progress": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
+ "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
+ "dev": true
+ },
+ "promise": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.1.tgz",
+ "integrity": "sha1-5F1osAoXZHttpxG/he1u1HII9FA=",
+ "dev": true,
+ "requires": {
+ "asap": "2.0.6"
+ }
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
+ },
+ "q": {
+ "version": "0.9.7",
+ "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz",
+ "integrity": "sha1-TeLmyzspCIyeTLwDv51C+5bOL3U=",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+ "dev": true
+ },
+ "read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "2.0.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "2.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "dev": true,
+ "requires": {
+ "find-up": "2.1.0",
+ "read-pkg": "2.0.0"
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "dev": true
+ },
+ "require-uncached": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+ "dev": true,
+ "requires": {
+ "caller-path": "0.1.0",
+ "resolve-from": "1.0.1"
+ }
+ },
+ "requireindex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz",
+ "integrity": "sha1-5UBLgVV+91225JxacgBIk/4D4WI=",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
+ "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-from": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
+ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
+ "dev": true
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "dev": true,
+ "requires": {
+ "onetime": "2.0.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.3.3",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.8"
+ }
+ }
+ }
+ },
+ "run-async": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+ "dev": true,
+ "requires": {
+ "is-promise": "2.1.0"
+ }
+ },
+ "rx-lite": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
+ "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
+ "dev": true
+ },
+ "rx-lite-aggregates": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
+ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
+ "dev": true,
+ "requires": {
+ "rx-lite": "4.0.8"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
+ "dev": true
+ },
+ "semver": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
+ "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
+ "dev": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true
+ },
+ "showdown": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/showdown/-/showdown-1.8.3.tgz",
+ "integrity": "sha1-ZE3TyPlDLHdExJtF6aGYoBcZQ14=",
+ "dev": true,
+ "requires": {
+ "yargs": "10.0.3"
+ },
+ "dependencies": {
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wrap-ansi": "2.1.0"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
+ }
+ },
+ "yargs": {
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.0.3.tgz",
+ "integrity": "sha512-DqBpQ8NAUX4GyPP/ijDGHsJya4tYqLQrjPr95HNsr1YwL3+daCfvBwg7+gIC6IdJhR2kATh3hb61vjzMWEtjdw==",
+ "dev": true,
+ "requires": {
+ "cliui": "3.2.0",
+ "decamelize": "1.2.0",
+ "find-up": "2.1.0",
+ "get-caller-file": "1.0.2",
+ "os-locale": "2.1.0",
+ "require-directory": "2.1.1",
+ "require-main-filename": "1.0.1",
+ "set-blocking": "2.0.0",
+ "string-width": "2.1.1",
+ "which-module": "2.0.0",
+ "y18n": "3.2.1",
+ "yargs-parser": "8.0.0"
+ }
+ }
+ }
+ },
+ "sigmund": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
+ "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
+ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "spdx-correct": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
+ "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
+ "dev": true,
+ "requires": {
+ "spdx-license-ids": "1.2.2"
+ }
+ },
+ "spdx-expression-parse": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
+ "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=",
+ "dev": true
+ },
+ "spdx-license-ids": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
+ "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "sync-request": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.0.0.tgz",
+ "integrity": "sha512-jGNIAlCi9iU4X3Dm4oQnNQshDD3h0/1A7r79LyqjbjUnj69sX6mShAXlhRXgImsfVKtTcnra1jfzabdZvp+Lmw==",
+ "dev": true,
+ "requires": {
+ "http-response-object": "3.0.1",
+ "sync-rpc": "1.3.3",
+ "then-request": "6.0.0"
+ }
+ },
+ "sync-rpc": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.3.tgz",
+ "integrity": "sha512-xtTZUAeFaescZALim6yqjMDsVQD7mKAkdZ0/FOvVjlrr4uQqrARlWxs4P7bKV2ZPnvOyTVyHyyxqztxtBF4iIw==",
+ "dev": true,
+ "requires": {
+ "get-port": "3.2.0"
+ }
+ },
+ "table": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
+ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "ajv-keywords": "2.1.1",
+ "chalk": "2.3.0",
+ "lodash": "4.17.5",
+ "slice-ansi": "1.0.0",
+ "string-width": "2.1.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "then-request": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.0.tgz",
+ "integrity": "sha512-xA+7uEMc+jsQIoyySJ93Ad08Kuqnik7u6jLS5hR91Z3smAoCfL3M8/MqMlobAa9gzBfO9pA88A/AntfepkkMJQ==",
+ "dev": true,
+ "requires": {
+ "@types/concat-stream": "1.6.0",
+ "@types/form-data": "0.0.33",
+ "@types/node": "8.10.8",
+ "@types/qs": "6.5.1",
+ "caseless": "0.12.0",
+ "concat-stream": "1.6.0",
+ "form-data": "2.3.2",
+ "http-basic": "7.0.0",
+ "http-response-object": "3.0.1",
+ "promise": "8.0.1",
+ "qs": "6.5.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "8.10.8",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.8.tgz",
+ "integrity": "sha512-BvcUxNZe9JgiiUVivtiQt3NrPVu9OAQzkxR1Ko9ESftCYU7V6Np5kpDzQwxd+34lsop7SNRdL292Flv52OvCaw==",
+ "dev": true
+ }
+ }
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "uc.micro": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.3.tgz",
+ "integrity": "sha1-ftUNXg+an7ClczeSWfKndFjVAZI=",
+ "dev": true
+ },
+ "uglify-js": {
+ "version": "3.3.10",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.10.tgz",
+ "integrity": "sha512-dNib7aUDNZFJNTXFyq0CDmLRVOsnY1F+IQgt2FAOdZFx2+LvKVLbbIb/fL+BYKCv3YH3bPCE/6M/JaxChtQLHQ==",
+ "dev": true,
+ "requires": {
+ "commander": "2.14.1",
+ "source-map": "0.6.1"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
+ "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "1.0.2",
+ "spdx-expression-parse": "1.0.4"
+ }
+ },
+ "vow": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/vow/-/vow-0.4.3.tgz",
+ "integrity": "sha1-1cOU1PHoRMmIEAtXtUCVbEoAW6Y=",
+ "dev": true
+ },
+ "vow-fs": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/vow-fs/-/vow-fs-0.3.1.tgz",
+ "integrity": "sha1-G3/GTXJzp8EmkAIWdMGpBM6rjK8=",
+ "dev": true,
+ "requires": {
+ "glob": "3.2.8",
+ "node-uuid": "1.4.0",
+ "vow-queue": "0.1.0"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "3.2.8",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.8.tgz",
+ "integrity": "sha1-VQb0MRchvMYYx9jboUQYh1AwcHM=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "minimatch": "0.2.14"
+ }
+ },
+ "minimatch": {
+ "version": "0.2.14",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
+ "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "2.7.3",
+ "sigmund": "1.0.1"
+ }
+ }
+ }
+ },
+ "vow-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/vow-queue/-/vow-queue-0.1.0.tgz",
+ "integrity": "sha1-qbVhR3x+pdVjsMqqUuQOZo3gwjg=",
+ "dev": true
+ },
+ "vuln-regex-detector": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/vuln-regex-detector/-/vuln-regex-detector-1.3.0.tgz",
+ "integrity": "sha512-QWm8buVznZjdcfMuFHYsiNfHd0YQ7dO41G0iEGVPlUng5eZUo8uy+QsVCmbgVZ2b96xprY1Tz9dQD7QtvbFHXw==",
+ "dev": true,
+ "requires": {
+ "sync-request": "6.0.0"
+ }
+ },
+ "which": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
+ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
+ "dev": true,
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+ "dev": true
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "write": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+ "dev": true,
+ "requires": {
+ "mkdirp": "0.5.1"
+ }
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ },
+ "yargs-parser": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.0.0.tgz",
+ "integrity": "sha1-IdR2Mw5agieaS4gTRb8GYQLiGcY=",
+ "dev": true,
+ "requires": {
+ "camelcase": "4.1.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ }
+ }
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/package.json
new file mode 100644
index 00000000000..22d6779f38e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/marked/package.json
@@ -0,0 +1,61 @@
+{
+ "name": "marked",
+ "description": "A markdown parser built for speed",
+ "author": "Christopher Jeffrey",
+ "version": "0.4.0",
+ "main": "./lib/marked.js",
+ "bin": "./bin/marked",
+ "man": "./man/marked.1",
+ "repository": "git://github.com/markedjs/marked.git",
+ "homepage": "https://marked.js.org",
+ "bugs": {
+ "url": "http://github.com/markedjs/marked/issues"
+ },
+ "license": "MIT",
+ "keywords": [
+ "markdown",
+ "markup",
+ "html"
+ ],
+ "tags": [
+ "markdown",
+ "markup",
+ "html"
+ ],
+ "devDependencies": {
+ "eslint": "^4.15.0",
+ "eslint-config-standard": "^11.0.0-beta.0",
+ "eslint-plugin-import": "^2.8.0",
+ "eslint-plugin-node": "^5.2.1",
+ "eslint-plugin-promise": "^3.6.0",
+ "eslint-plugin-standard": "^3.0.1",
+ "eslint-plugin-vuln-regex-detector": "^1.0.4",
+ "front-matter": "^2.3.0",
+ "glob-to-regexp": "0.3.0",
+ "html-differ": "^1.3.4",
+ "jasmine": "^3.1.0",
+ "jasmine2-custom-message": "^0.9.0",
+ "markdown": "*",
+ "markdown-it": "*",
+ "showdown": "*",
+ "uglify-js": "^3.3.10"
+ },
+ "scripts": {
+ "test": "jasmine --config=jasmine.json",
+ "test:unit": "npm test -- test/unit/**/*-spec.js",
+ "test:specs": "npm test -- test/specs/**/*-spec.js",
+ "test:cm": "npm test -- test/specs/commonmark/**/*-spec.js",
+ "test:gfm": "npm test -- test/specs/gfm/**/*-spec.js",
+ "test:marked": "npm test -- test/specs/marked/**/*-spec.js",
+ "test:old": "node test",
+ "test:lint": "eslint bin/marked .",
+ "test:redos": "eslint --plugin vuln-regex-detector --rule '\"vuln-regex-detector/no-vuln-regex\": 2' lib/marked.js",
+ "bench": "node test --bench",
+ "lint": "eslint --fix bin/marked .",
+ "build": "uglifyjs lib/marked.js -cm --comments /Copyright/ -o marked.min.js",
+ "preversion": "npm run build && (git diff --quiet || git commit -am 'minify')"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/.bower.json
new file mode 100644
index 00000000000..cfa71a658ce
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/.bower.json
@@ -0,0 +1,48 @@
+{
+ "name": "mocha",
+ "homepage": "https://mochajs.org",
+ "description": "simple, flexible, fun test framework",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/mochajs/mocha.git"
+ },
+ "main": [
+ "mocha.js",
+ "mocha.css"
+ ],
+ "ignore": [
+ "bin",
+ "editors",
+ "images",
+ "lib",
+ "scripts",
+ "test",
+ "assets",
+ "media",
+ ".*",
+ "index.js",
+ "karma.conf.js",
+ "browser-entry.js",
+ "Makefile",
+ "package.json",
+ "appveyor.yml"
+ ],
+ "keywords": [
+ "mocha",
+ "test",
+ "bdd",
+ "tdd",
+ "tap"
+ ],
+ "license": "MIT",
+ "version": "3.5.3",
+ "_release": "3.5.3",
+ "_resolution": {
+ "type": "version",
+ "tag": "v3.5.3",
+ "commit": "1ff41a05a599e8bffe90b2b13597b01a2031b88f"
+ },
+ "_source": "https://github.com/mochajs/mocha.git",
+ "_target": "^3.1.2",
+ "_originalSource": "mocha"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/CHANGELOG.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/CHANGELOG.md
new file mode 100644
index 00000000000..96fc1c50b1b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/CHANGELOG.md
@@ -0,0 +1,1711 @@
+# 3.5.3 / 2017-09-11
+
+## :bug: Fixes
+
+- [#3003]: Fix invalid entities in xUnit reporter first appearing in v3.5.1 ([@jkrems])
+
+[#3003]: https://github.com/mochajs/mocha/pull/3003
+
+# 3.5.2 / 2017-09-10
+
+## :bug: Fixes
+
+- [#3001]: Fix AMD-related failures first appearing in v3.5.1 ([@boneskull])
+
+[#3001]: https://github.com/mochajs/mocha/pull/3001
+
+# 3.5.1 / 2017-09-09
+
+## :newspaper: News
+
+- :mega: Mocha is now sponsoring [PDXNode](http://pdxnode.org)! If you're in the [Portland](https://wikipedia.org/wiki/Portland,_Oregon) area, come check out the monthly talks and hack nights!
+
+## :bug: Fixes
+
+- [#2997]: Fix missing `xit` export for "require" interface ([@solodynamo])
+- [#2957]: Fix unicode character handling in XUnit reporter failures ([@jkrems])
+
+## :nut_and_bolt: Other
+
+- [#2986]: Add issue and PR templates ([@kungapal])
+- [#2918]: Drop bash dependency for glob-related tests ([@ScottFreeCode])
+- [#2922]: Improve `--compilers` coverage ([@ScottFreeCode])
+- [#2981]: Fix tpyos and spelling errors ([@jsoref])
+
+[#2997]: https://github.com/mochajs/mocha/pull/2997
+[#2957]: https://github.com/mochajs/mocha/pull/2957
+[#2918]: https://github.com/mochajs/mocha/pull/2918
+[#2986]: https://github.com/mochajs/mocha/pull/2986
+[#2922]: https://github.com/mochajs/mocha/pull/2922
+[#2981]: https://github.com/mochajs/mocha/pull/2981
+[@solodynamo]: https://github.com/solodynamo
+[@jkrems]: https://github.com/jkrems
+[@jsoref]: https://github.com/jsoref
+
+# 3.5.0 / 2017-07-31
+
+## :newspaper: News
+
+- Mocha now has a [code of conduct](https://github.com/mochajs/mocha/blob/master/.github/CODE_OF_CONDUCT.md) (thanks [@kungapal]!).
+- Old issues and PRs are now being marked "stale" by [Probot's "Stale" plugin](https://github.com/probot/stale). If an issue is marked as such, and you would like to see it remain open, simply add a new comment to the ticket or PR.
+- **WARNING**: Support for non-ES5-compliant environments will be dropped starting with version 4.0.0 of Mocha!
+
+## :lock: Security Fixes
+
+- [#2860]: Address [CVE-2015-8315](https://nodesecurity.io/advisories/46) via upgrade of [debug](https://npm.im/debug) ([@boneskull])
+
+## :tada: Enhancements
+
+- [#2696]: Add `--forbid-only` and `--forbid-pending` flags. Use these in CI or hooks to ensure tests aren't accidentally being skipped! ([@charlierudolph])
+- [#2813]: Support Node.js 8's `--napi-modules` flag ([@jupp0r])
+
+## :nut_and_bolt: Other
+
+- Various CI-and-test-related fixes and improvements ([@boneskull], [@dasilvacontin], [@PopradiArpad], [@Munter], [@ScottFreeCode])
+- "Officially" support Node.js 8 ([@elergy])
+
+[#2860]: https://github.com/mochajs/mocha/pulls/2860
+[#2696]: https://github.com/mochajs/mocha/pulls/2696
+[#2813]: https://github.com/mochajs/mocha/pulls/2813
+[@charlierudolph]: https://github.com/charlierudolph
+[@PopradiArpad]: https://github.com/PopradiArpad
+[@kungapal]: https://github.com/kungapal
+[@elergy]: https://github.com/elergy
+[@jupp0r]: https://github.com/jupp0r
+
+# 3.4.2 / 2017-05-24
+
+## :bug: Fixes
+
+- [#2802]: Remove call to deprecated `os.tmpDir` ([@makepanic])
+- [#2820]: Eagerly set `process.exitCode` ([@chrisleck])
+
+## :nut_and_bolt: Other
+
+- [#2778]: Move linting into an npm script ([@Munter])
+
+[@chrisleck]: https://github.com/chrisleck
+[@makepanic]: https://github.com/makepanic
+[@Munter]: https://github.com/Munter
+
+[#2778]: https://github.com/mochajs/mocha/pulls/2778
+[#2802]: https://github.com/mochajs/mocha/issues/2802
+[#2820]: https://github.com/mochajs/mocha/pull/2820
+
+# 3.4.1 / 2017-05-14
+
+Fixed a publishing mishap with git's autocrlf settings.
+
+# 3.4.0 / 2017-05-14
+
+Mocha is now moving to a quicker release schedule: when non-breaking changes are merged, a release should happen that week.
+
+This week's highlights:
+
+- `allowUncaught` added to commandline as `--allow-uncaught` (and bugfixed)
+- warning-related Node flags
+
+## :tada: Enhancements
+
+- [#2793], [#2697]: add --allowUncaught to Node.js ([@lrowe])
+- [#2733]: Add `--no-warnings` and `--trace-warnings` flags ([@sonicdoe])
+
+## :bug: Fixes
+
+- [#2793], [#2697]: fix broken allowUncaught ([@lrowe])
+
+## :nut_and_bolt: Other
+
+- [#2778]: Add license report and scan status ([@xizhao])
+- [#2794]: no special case for macOS running Karma locally ([@boneskull])
+- [#2795]: reverts use of semistandard directly ([#2648]) ([@boneskull])
+
+[@lrowe]: https://github.com/lrowe
+[@sonicdoe]: https://github.com/sonicdoe
+[@xizhao]: https://github.com/xizhao
+[@boneskull]: https://github.com/boneskull
+
+[#2795]: https://github.com/mochajs/mocha/pull/2795
+[#2733]: https://github.com/mochajs/mocha/pull/2733
+[#2793]: https://github.com/mochajs/mocha/pull/2793
+[#2697]: https://github.com/mochajs/mocha/pull/2697
+[#2778]: https://github.com/mochajs/mocha/pull/2778
+[#2794]: https://github.com/mochajs/mocha/pull/2794
+
+# 3.3.0 / 2017-04-24
+
+Thanks to all our contributors, maintainers, sponsors, and users! ❤️
+
+As highlights:
+
+- We've got coverage now!
+- Testing is looking less flaky \o/.
+- No more nitpicking about "mocha.js" build on PRs.
+
+## :tada: Enhancements
+
+- [#2659]: Adds support for loading reporter from an absolute or relative path ([@sul4bh])
+- [#2769]: Support `--inspect-brk` on command-line ([@igwejk])
+
+## :bug: Fixes
+
+- [#2662]: Replace unicode chars w/ hex codes in HTML reporter ([@rotemdan])
+
+## :mag: Coverage
+
+- [#2672]: Add coverage for node tests ([@c089], [@Munter])
+- [#2680]: Increase tests coverage for base reporter ([@epallerols])
+- [#2690]: Increase tests coverage for doc reporter ([@craigtaub])
+- [#2701]: Increase tests coverage for landing, min, tap and list reporters ([@craigtaub])
+- [#2691]: Increase tests coverage for spec + dot reporters ([@craigtaub])
+- [#2698]: Increase tests coverage for xunit reporter ([@craigtaub])
+- [#2699]: Increase tests coverage for json-stream, markdown and progress reporters ([@craigtaub])
+- [#2703]: Cover .some() function in utils.js with tests ([@seppevs])
+- [#2773]: Add tests for loading reporters w/ relative/absolute paths ([@sul4bh])
+
+## :nut_and_bolt: Other
+
+- Remove bin/.eslintrc; ensure execs are linted ([@boneskull])
+- [#2542]: Expand CONTRIBUTING.md ([@boneskull])
+- [#2660]: Double timeouts on integration tests ([@Munter])
+- [#2653]: Update copyright year ([@Scottkao85], [@Munter])
+- [#2621]: Update dependencies to enable Greenkeeper ([@boneskull], [@greenkeeper])
+- [#2625]: Use trusty container in travis-ci; use "artifacts" addon ([@boneskull])
+- [#2670]: doc(CONTRIBUTING): fix link to org members ([@coderbyheart])
+- Add Mocha propaganda to README.md ([@boneskull])
+- [#2470]: Avoid test flake in "delay" test ([@boneskull])
+- [#2675]: Limit browser concurrency on sauce ([@boneskull])
+- [#2669]: Use temporary test-only build of mocha.js for browsers tests ([@Munter])
+- Fix "projects" link in README.md ([@boneskull])
+- [#2678]: Chore(Saucelabs): test on IE9, IE10 and IE11 ([@coderbyheart])
+- [#2648]: Use `semistandard` directly ([@kt3k])
+- [#2727]: Make the build reproducible ([@lamby])
+
+[@boneskull]: https://github.com/boneskull
+[@c089]: https://github.com/c089
+[@coderbyheart]: https://github.com/coderbyheart
+[@craigtaub]: https://github.com/craigtaub
+[@epallerols]: https://github.com/epallerols
+[@greenkeeper]: https://github.com/greenkeeper
+[@igwejk]: https://github.com/igwejk
+[@kt3k]: https://github.com/kt3k
+[@lamby]: https://github.com/lamby
+[@Munter]: https://github.com/Munter
+[@rotemdan]: https://github.com/rotemdan
+[@seppevs]: https://github.com/seppevs
+[@sul4bh]: https://github.com/sul4bh
+
+[#2470]: https://github.com/mochajs/mocha/pull/2470
+[#2542]: https://github.com/mochajs/mocha/issues/2542
+[#2621]: https://github.com/mochajs/mocha/pull/2621
+[#2625]: https://github.com/mochajs/mocha/pull/2625
+[#2648]: https://github.com/mochajs/mocha/pull/2648
+[#2653]: https://github.com/mochajs/mocha/pull/2653
+[#2659]: https://github.com/mochajs/mocha/pull/2659
+[#2660]: https://github.com/mochajs/mocha/pull/2660
+[#2662]: https://github.com/mochajs/mocha/pull/2662
+[#2669]: https://github.com/mochajs/mocha/pull/2669
+[#2670]: https://github.com/mochajs/mocha/pull/2670
+[#2672]: https://github.com/mochajs/mocha/pull/2672
+[#2675]: https://github.com/mochajs/mocha/pull/2675
+[#2678]: https://github.com/mochajs/mocha/pull/2678
+[#2680]: https://github.com/mochajs/mocha/pull/2680
+[#2690]: https://github.com/mochajs/mocha/pull/2690
+[#2691]: https://github.com/mochajs/mocha/pull/2691
+[#2698]: https://github.com/mochajs/mocha/pull/2698
+[#2699]: https://github.com/mochajs/mocha/pull/2699
+[#2701]: https://github.com/mochajs/mocha/pull/2701
+[#2703]: https://github.com/mochajs/mocha/pull/2703
+[#2727]: https://github.com/mochajs/mocha/pull/2727
+[#2769]: https://github.com/mochajs/mocha/pull/2769
+[#2773]: https://github.com/mochajs/mocha/pull/2773
+
+# 3.2.0 / 2016-11-24
+
+## :newspaper: News
+
+### Mocha is now a JS Foundation Project!
+
+Mocha is proud to have joined the [JS Foundation](https://js.foundation). For more information, [read the announcement](https://js.foundation/announcements/2016/10/17/Linux-Foundation-Unites-JavaScript-Community-Open-Web-Development/).
+
+### Contributor License Agreement
+
+Under the foundation, all contributors to Mocha must sign the [JS Foundation CLA](https://js.foundation/CLA/) before their code can be merged. When sending a PR--if you have not already signed the CLA--a friendly bot will ask you to do so.
+
+Mocha remains licensed under the [MIT license](https://github.com/mochajs/mocha/blob/master/LICENSE).
+
+## :bug: Bug Fix
+
+- [#2535]: Fix crash when `--watch` encounters broken symlinks ([@villesau])
+- [#2593]: Fix (old) regression; incorrect symbol shown in `list` reporter ([@Aldaviva])
+- [#2584]: Fix potential error when running XUnit reporter ([@vobujs])
+
+## :tada: Enhancement
+
+- [#2294]: Improve timeout error messaging ([@jeversmann], [@boneskull])
+- [#2520]: Add info about `--inspect` flag to CLI help ([@ughitsaaron])
+
+## :nut_and_bolt: Other
+
+- [#2570]: Use [karma-mocha](https://npmjs.com/package/karma-mocha) proper ([@boneskull])
+- Licenses updated to reflect new copyright, add link to license and browser matrix to `README.md` ([@boneskull], [@ScottFreeCode], [@dasilvacontin])
+
+[#2294]: https://github.com/mochajs/mocha/issues/2294
+[#2535]: https://github.com/mochajs/mocha/issues/2535
+[#2520]: https://github.com/mochajs/mocha/pull/2520
+[#2593]: https://github.com/mochajs/mocha/pull/2593
+[#2584]: https://github.com/mochajs/mocha/issues/2584
+[#2570]: https://github.com/mochajs/mocha/issues/2570
+[@Aldaviva]: https://github.com/Aldaviva
+[@jeversmann]: https://github.com/jeversmann
+[@ughitsaaron]: https://github.com/ughitsaaron
+[@villesau]: https://github.com/villesau
+[@vobujs]: https://github.com/vobujs
+
+Thanks to all our contributors, sponsors and backers! Keep on the lookout for a public roadmap and new contribution guide coming soon.
+
+# 3.1.2 / 2016-10-10
+
+## :bug: Bug Fix
+
+- [#2528]: Recovery gracefully if an `Error`'s `stack` property isn't writable ([@boneskull])
+
+[#2528]: https://github.com/mochajs/mocha/issues/2528
+
+# 3.1.1 / 2016-10-09
+
+## :bug: Bug Fix
+
+- [#1417]: Don't report `done()` was called multiple times when it wasn't ([@frankleonrose])
+
+## :nut_and_bolt: Other
+
+- [#2490]: Lint with [semistandard](https://npmjs.com/package/semistandard) config ([@makepanic])
+- [#2525]: Lint all `.js` files ([@boneskull])
+- [#2524]: Provide workaround for developers unable to run browser tests on macOS Sierra ([@boneskull])
+
+[#1417]: https://github.com/mochajs/mocha/issues/1417
+[#2490]: https://github.com/mochajs/mocha/issues/2490
+[#2525]: https://github.com/mochajs/mocha/issues/2525
+[#2524]: https://github.com/mochajs/mocha/issues/2524
+[@makepanic]: https://github.com/makepanic
+[@frankleonrose]: https://github.com/frankleonrose
+
+# 3.1.0 / 2016-09-27
+
+## :tada: Enhancement
+
+- [#2357]: Support `--inspect` on command-line ([@simov])
+- [#2194]: Human-friendly error if no files are matched on command-line ([@Munter])
+- [#1744]: Human-friendly error if a Suite has no callback (BDD/TDD only) ([@anton])
+
+## :bug: Bug Fix
+
+- [#2488]: Fix case in which *variables beginning with lowercase "D"* may not have been reported properly as global leaks ([@JustATrick]) :laughing:
+- [#2465]: Always halt execution in async function when `this.skip()` is called ([@boneskull])
+- [#2445]: Exits with expected code 130 when `SIGINT` encountered; exit code can no longer rollover at 256 ([@Munter])
+- [#2315]: Fix uncaught TypeError thrown from callback stack ([@1999])
+- Fix broken `only()`/`skip()` in IE7/IE8 ([@boneskull])
+- [#2502]: Fix broken stack trace filter on Node.js under Windows ([@boneskull])
+- [#2496]: Fix diff output for objects instantiated with `String` constructor ([more](https://youtrack.jetbrains.com/issue/WEB-23383)) ([@boneskull])
+
+[#2496]: https://github.com/mochajs/mocha/issues/2496
+[#2502]: https://github.com/mochajs/mocha/issues/2502
+[#2315]: https://github.com/mochajs/mocha/issues/2315
+[#2445]: https://github.com/mochajs/mocha/pull/2445
+[#2465]: https://github.com/mochajs/mocha/issues/2465
+[#2488]: https://github.com/mochajs/mocha/issues/2488
+[#1744]: https://github.com/mochajs/mocha/issues/1744
+[#2194]: https://github.com/mochajs/mocha/issues/2194
+[#2357]: https://github.com/mochajs/mocha/issues/2357
+[@1999]: https://github.com/1999
+[@JustATrick]: https://github.com/JustATrick
+[@anton]: https://github.com/anton
+[@simov]: https://github.com/simov
+
+# 3.0.2 / 2016-08-08
+
+## :bug: Bug Fix
+
+- [#2424]: Fix error loading Mocha via Require.js ([@boneskull])
+- [#2417]: Fix execution of *deeply* nested `describe.only()` suites ([@not-an-aardvark])
+- Remove references to `json-cov` and `html-cov` reporters in CLI ([@boneskull])
+
+[#2417]: https://github.com/mochajs/mocha/issues/2417
+[#2424]: https://github.com/mochajs/mocha/issues/2424
+
+# 3.0.1 / 2016-08-03
+
+## :bug: Bug Fix
+
+- [#2406]: Restore execution of nested `describe.only()` suites ([@not-an-aardvark])
+
+[#2406]: https://github.com/mochajs/mocha/issues/2406
+[@not-an-aardvark]: https://github.com/not-an-aardvark
+
+# 3.0.0 / 2016-07-31
+
+## :boom: Breaking Changes
+
+- :warning: Due to the increasing difficulty of applying security patches made within its dependency tree, as well as looming incompatibilities with Node.js v7.0, **Mocha no longer supports Node.js v0.8**.
+- :warning: **Mocha may no longer be installed by versions of `npm` less than `1.4.0`.** Previously, this requirement only affected Mocha's development dependencies. In short, this allows Mocha to depend on packages which have dependencies fixed to major versions (`^`).
+- `.only()` is no longer "fuzzy", can be used multiple times, and generally just works like you think it should. :joy:
+- To avoid common bugs, when a test injects a callback function (suggesting asynchronous execution), calls it, *and* returns a `Promise`, Mocha will now throw an exception:
+
+ ```js
+ const assert = require('assert');
+
+ it('should complete this test', function (done) {
+ return new Promise(function (resolve) {
+ assert.ok(true);
+ resolve();
+ })
+ .then(done);
+ });
+ ```
+
+ The above test will fail with `Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.`.
+- When a test timeout value *greater than* `2147483648` is specified in any context (`--timeout`, `mocha.setup()`, per-suite, per-test, etc.), the timeout will be *disabled* and the test(s) will be allowed to run indefinitely. This is equivalent to specifying a timeout value of `0`. See [MDN](https://developer.mozilla.org/docs/Web/API/WindowTimers/setTimeout#Maximum_delay_value) for reasoning.
+- The `dot` reporter now uses more visually distinctive characters when indicating "pending" and "failed" tests.
+- Mocha no longer supports [component](https://www.npmjs.com/package/component).
+- The long-forsaken `HTMLCov` and `JSONCov` reporters--and any relationship to the "node-jscoverage" project--have been removed.
+- `spec` reporter now omits leading carriage returns (`\r`) in non-TTY environment.
+
+## :tada: Enhancements
+
+- [#808]: Allow regular-expression-like strings in `--grep` and browser's `grep` querystring; enables flags such as `i` for case-insensitive matches and `u` for unicode. ([@a8m])
+- [#2000]: Use distinctive characters in `dot` reporter; `,` will denote a "pending" test and `!` will denote a "failing" test. ([@elliottcable])
+- [#1632]: Throw a useful exception when a suite or test lacks a title. ([@a8m])
+- [#1481]: Better `.only()` behavior. ([@a8m])
+- [#2334]: Allow `this.skip()` in async tests and hooks. ([@boneskull])
+- [#1320]: Throw a useful exception when test resolution method is overspecified. ([@jugglinmike])
+- [#2364]: Support `--preserve-symlinks`. ([@rosswarren])
+
+## :bug: Bug Fixes
+
+- [#2259]: Restore ES3 compatibility. Specifically, support an environment lacking `Date.prototype.toISOString()`, `JSON`, or has a non-standard implementation of `JSON`. ([@ndhoule], [@boneskull])
+- [#2286]: Fix `after()` failing to execute if test skipped using `this.skip()` in `beforeEach()`; no longer marks the entire suite as "pending". ([@dasilvacontin], [@boneskull])
+- [#2208]: Fix function name display in `markdown` and `html` (browser) reporters. ([@ScottFreeCode])
+- [#2299]: Fix progress bar in `html` (browser) reporter. ([@AviVahl])
+- [#2307]: Fix `doc` reporter crashing when test fails. ([@jleyba])
+- [#2323]: Ensure browser entry point (`browser-entry.js`) is published to npm (for use with bundlers). ([@boneskull])
+- [#2310]: Ensure custom reporter with an absolute path works in Windows. ([@silentcloud])
+- [#2311]: Fix problem wherein calling `this.slow()` without a value would blast any previously set value. ([@boneskull])
+- [#1813]: Ensure Mocha's own test suite will run in Windows. ([@tswaters], [@TimothyGu], [@boneskull])
+- [#2317]: Ensure all interfaces are displayed in `--help` on CLI. ([@ScottFreeCode])
+- [#1644]: Don't exhibit undefined behavior when calling `this.timeout()` with very large values ([@callumacrae], [@boneskull])
+- [#2361]: Don't truncate name of thrown anonymous exception. ([@boneskull])
+- [#2367]: Fix invalid CSS. ([@bensontrent])
+- [#2401]: Remove carriage return before each test line in spec reporter. ([@Munter])
+
+## :nut_and_bolt: Other
+
+- Upgrade production dependencies to address security advisories (and because now we can): `glob`, `commander`, `escape-string-regexp`,
+and `supports-color`. ([@boneskull], [@RobLoach])
+- Add Windows to CI. ([@boneskull], [@TimothyGu])
+- Ensure appropriate `engines` field in `package.json`. ([@shinnn], [@boneskull])
+- [#2348]: Upgrade ESLint to v2 ([@anthony-redfox])
+
+We :heart: our [backers and sponsors](https://opencollective.com/mochajs)!
+
+:shipit:
+
+[#2401]: https://github.com/mochajs/mocha/pull/2401
+[#2348]: https://github.com/mochajs/mocha/issues/2348
+[#808]: https://github.com/mochajs/mocha/issues/808
+[#2361]: https://github.com/mochajs/mocha/pull/2361
+[#2367]: https://github.com/mochajs/mocha/pull/2367
+[#2364]: https://github.com/mochajs/mocha/pull/2364
+[#1320]: https://github.com/mochajs/mocha/pull/1320
+[#2307]: https://github.com/mochajs/mocha/pull/2307
+[#2259]: https://github.com/mochajs/mocha/pull/2259
+[#2208]: https://github.com/mochajs/mocha/pull/2208
+[#2299]: https://github.com/mochajs/mocha/pull/2299
+[#2286]: https://github.com/mochajs/mocha/issues/2286
+[#1644]: https://github.com/mochajs/mocha/issues/1644
+[#2310]: https://github.com/mochajs/mocha/issues/2310
+[#2311]: https://github.com/mochajs/mocha/issues/2311
+[#2323]: https://github.com/mochajs/mocha/issues/2323
+[#2000]: https://github.com/mochajs/mocha/pull/2000
+[#1632]: https://github.com/mochajs/mocha/issues/1632
+[#1813]: https://github.com/mochajs/mocha/issues/1813
+[#2334]: https://github.com/mochajs/mocha/issues/2334
+[#2317]: https://github.com/mochajs/mocha/issues/2317
+[#1481]: https://github.com/mochajs/mocha/issues/1481
+[@elliottcable]: https://github.com/elliottcable
+[@RobLoach]: https://github.com/robloach
+[@AviVahl]: https://github.com/avivahl
+[@silentcloud]: https://github.com/silentcloud
+[@tswaters]: https://github.com/tswaters
+[@jleyba]: https://github.com/jleyba
+[@TimothyGu]: https://github.com/timothygu
+[@callumacrae]: https://github.com/callumacrae
+[@shinnn]: https://github.com/shinnn
+[@bensontrent]: https://github.com/bensontrent
+[@jugglinmike]: https://github.com/jugglinmike
+[@rosswarren]: https://github.com/rosswarren
+[@anthony-redfox]: https://github.com/anthony-redfox
+[@Munter]: https://github.com/munter
+
+# 2.5.3 / 2016-05-25
+
+- [#2112] - Fix HTML reporter regression causing duplicate error output ([@danielstjules] via 6d24063)
+- [#2119] - Make HTML reporter failure/passed links preventDefault to avoid SPA's hash navigation ([@jimenglish81] via 9e93efc)
+
+[@danielstjules]: https://github.com/danielstjules
+[@jimenglish81]: https://github.com/jimenglish81
+[#2112]: https://github.com/mochajs/mocha/pull/2112
+[#2119]: https://github.com/mochajs/mocha/pull/2119
+
+# 2.5.2 / 2016-05-24
+
+- [#2178] - Avoid double and triple xUnit XML escaping ([@graingert] via 49b5ff1)
+
+[@graingert]: https://github.com/graingert
+[#2178]: https://github.com/mochajs/mocha/pull/2178
+
+# 2.5.1 / 2016-05-23
+
+- Fix [to-iso-string](https://npmjs.com/package/to-iso-string) dependency ([@boneskull] via bd9450b)
+
+Thanks @entertainyou, @SimenB, @just-paja for the heads-up.
+
+# 2.5.0 / 2016-05-23
+
+> This has been awhile coming! We needed to feel confident that the next release wouldn't break browser compatibility (e.g. the last few patch releases).
+>
+> ### Browser Tests in CI
+>
+> We now run unit tests against PhantomJS v1.x and an assortment of browsers on [SauceLabs](https://saucelabs.com), including:
+> - Internet Explorer v8.0
+> - Chrome (latest)
+> - Firefox (latest)
+> - Safari (latest)
+> - Microsoft Edge (latest)
+>
+> To accomplish this, we now run Mocha's unit tests (and a handful of integration tests) via [Karma](https://npmjs.com/package/karma) and a modified [karma-mocha](https://npmjs.com/package/karma-mocha). Along the way, we had to solve issue [#880] (apologies to @mderijcke and @sukima who had PRs addressing this), as well as replace most usages of [should](https://npmjs.com/package/should) with [expect.js](https://npmjs.com/package/expect.js) for IE8.
+>
+> Going forward, when sending PRs, your code will *only* run against PhantomJS v1.x (and not hit SauceLabs) [because security](https://docs.travis-ci.com/user/pull-requests/#Security-Restrictions-when-testing-Pull-Requests).
+>
+> ### Node.js 6.x
+> Node.js 6.x "just worked" before, but now it's in the CI matrix, so it's "officially" supported. Mocha *still retains support* for Node.js 0.8.x.
+>
+> ### "Minor" Release
+> You'll see mostly bug fixes below, but also a couple features--as such, it's a "minor" release.
+>
+> ### TYVM
+>
+> Thanks to everyone who contributed, and our fabulous [sponsors and backers](https://opencollective.com/mochajs)!
+
+- [#2079] - Add browser checks to CI; update [browserify](https://npmjs.com/package/browserify) to v13.0.0 ([@dasilvacontin], [@ScottFreeCode], [@boneskull] via c04c1d7, 0b1e9b3, 0dde0fa, f8a3d86, 9e8cbaa)
+- [#880] - Make Mocha browserifyable ([@boneskull] via 524862b)
+- [#2121] - Update [glob](https://npmjs.com/package/glob) to v3.2.11 ([@astorije] via 7920fc4)
+- [#2126] - Fix dupe error messages in stack trace filter ([@Turbo87] via 4301caa)
+- [#2109] - Fix certain diffs when objects cannot be coerced into primitives ([@joshlory] via 61fbb7f)
+- [#1827] - Fix TWBS/`mocha.css` collisions ([@irnc] via 0543798)
+- [#1760], [#1936] - Fix `this.skip()` in HTML reporter ([@mislav] via cb4248b)
+- [#2115] - Fix exceptions thrown from hooks in HTML reporter ([@danielstjules] via e290bc0)
+- [#2089] - Handle Symbol values in `util.stringify()` ([@ryym] via ea61d05)
+- [#2097] - Fix diff for objects overriding `Object.prototype.hasOwnProperty` ([@mantoni] via b20fdfe)
+- [#2101] - Properly handle non-string "messages" thrown from assertion libraries ([@jkimbo] via 9c41051)
+- [#2124] - Update [growl](https://npmjs.com/package/growl) ([@benjamine] via 9ae6a85)
+- [#2162], [#2205] - JSDoc fixes ([@OlegTsyba] via 8031f20, [@ScottFreeCode] via f83b1d9)
+- [#2132] - Remove Growl-related cruft ([@julienw] via 00d6469)
+- [#2172] - Add [OpenCollective](https://opencollective.com) badge, sponsors & backers ([@xdamman], [@boneskull] via caee94f)
+- [#1841] - Add new logo, banner assets ([@dasilvacontin] via 00fd0e1)
+- [#2214] - Update `README.md` header ([@dasilvacontin] via c0f9be2)
+- [#2236] - Better checks for Node.js v0.8 compatibility in CI ([@dasilvacontin] via ba5637d)
+- [#2239] - Add Node.js v6.x to CI matrix ([@boneskull] via 3904da4)
+
+[#880]: https://github.com/mochajs/mocha/issues/880
+[#1841]: https://github.com/mochajs/mocha/pull/1841
+[#2239]: https://github.com/mochajs/mocha/issues/2239
+[#2153]: https://github.com/mochajs/mocha/pull/2153
+[#2214]: https://github.com/mochajs/mocha/pull/2214
+[#2236]: https://github.com/mochajs/mocha/pull/2236
+[#2079]: https://github.com/mochajs/mocha/issues/2079
+[#2231]: https://github.com/mochajs/mocha/pull/2231
+[#2089]: https://github.com/mochajs/mocha/issues/2089
+[#2097]: https://github.com/mochajs/mocha/pull/2097
+[#1760]: https://github.com/mochajs/mocha/issues/1760
+[#1936]: https://github.com/mochajs/mocha/issues/1936
+[#2115]: https://github.com/mochajs/mocha/pull/2115
+[#1827]: https://github.com/mochajs/mocha/pull/1827
+[#2101]: https://github.com/mochajs/mocha/pull/2101
+[#2124]: https://github.com/mochajs/mocha/pull/2124
+[#2109]: https://github.com/mochajs/mocha/issues/2109
+[#2162]: https://github.com/mochajs/mocha/pull/2162
+[#2132]: https://github.com/mochajs/mocha/issues/2132
+[#2126]: https://github.com/mochajs/mocha/issues/2126
+[#2121]: https://github.com/mochajs/mocha/issues/2121
+[#2205]: https://github.com/mochajs/mocha/pull/2205
+[#2172]: https://github.com/mochajs/mocha/pull/2172
+[@xdamman]: https://github.com/xdamman
+[@Turbo87]: https://github.com/Turbo87
+[@OlegTsyba]: https://github.com/OlegTsyba
+[@ryym]: https://github.com/ryym
+[@mantoni]: https://github.com/mantoni
+[@mislav]: https://github.com/mislav
+[@irnc]: https://github.com/irnc
+[@jkimbo]: https://github.com/jkimbo
+[@benjamine]: https://github.com/benjamine
+[@joshlory]: https://github.com/joshlory
+[@julienw]: https://github.com/julienw
+[@ScottFreeCode]: https://github.com/ScottFreeCode
+[@astorije]: https://github.com/astorije
+[@dasilvacontin]: https://github.com/dasilvacontin
+
+2.4.5 / 2016-01-28
+==================
+
+* [#2080], [#2078], [#2072], [#2073], [#1200] - Revert changes to console colors in changeset [1192914](https://github.com/mochajs/mocha/commit/119291449cd03a11cdeda9e37cf718a69a012896) and subsequent related changes thereafter. Restores compatibility with IE8 & PhantomJS. See also [mantoni/mochify.js#129](https://github.com/mantoni/mochify.js/issues/129) and [openlayers/ol3#4746](https://github.com/openlayers/ol3/pull/4746) ([@boneskull])
+* [#2082] - Fix several test assertions ([@mislav])
+
+[#1200]: https://github.com/mochajs/mocha/issues/1200
+[#2082]: https://github.com/mochajs/mocha/pull/2082
+
+2.4.4 / 2016-01-27
+==================
+
+* [#2080] - Fix broken RequireJS compatibility ([@boneskull])
+
+[#2080]: https://github.com/mochajs/mocha/issues/2080
+
+2.4.3 / 2016-01-27
+==================
+
+* [#2078] - Fix broken IE8 ([@boneskull])
+
+[#2078]: https://github.com/mochajs/mocha/issues/2078
+
+2.4.2 / 2016-01-26
+==================
+
+* [#2053] - Fix web worker compatibility ([@mislav])
+* [#2072] - Fix Windows color output ([@thedark1337])
+* [#2073] - Fix colors in `progress` and `landing` reporters ([@gyandeeps])
+
+[#2053]: https://github.com/mochajs/mocha/pull/2053
+[#2072]: https://github.com/mochajs/mocha/pull/2072
+[#2073]: https://github.com/mochajs/mocha/pull/2073
+[@gyandeeps]: https://github.com/gyandeeps
+[@thedark1337]: https://github.com/thedark1337
+
+2.4.1 / 2016-01-26
+==================
+
+* [#2067] - Fix HTML/doc reporter regressions ([@danielstjules])
+
+[#2067]: https://github.com/mochajs/mocha/pull/2067
+
+2.4.0 / 2016-01-25
+==================
+
+* [#1945] - Correctly skip tests when skipping in suite's before() ([@ryanshawty])
+* [#2056] - chore(license): update license year to 2016 ([@pra85])
+* [#2048] - Fix `this.skip` from spec with HTML reporter ([@mislav])
+* [#2033] - Update tests for newer versions of should.js ([@tomhughes])
+* [#2037] - Fix for memory leak caused by referenced to deferred test ([@bd82])
+* [#2038] - Also run Travis-CI on node.js 4 & 5 ([@bd82])
+* [#2028] - Remove reference to test before afterAll hook runs ([@stonelgh])
+* Bump mkdirp to 0.5.1 to support strict mode ([@danielstjules])
+* [#1977] - safely stringify PhantomJS undefined value ([@ahamid])
+* Add the ability to retry tests ([@@longlho])
+* [#1982] - Enable --log-timer-events option [@Alaneor]
+* Fix #1980: Load mocha.opts from bin/mocha and bin/_mocha ([@danielstjules])
+* [#1976] - Simplify function call ([@iclanzan])
+* [#1963] - Add support --perf-basic-prof ([@robraux])
+* [#1981] - Fix HTML reporter handling of done and exceptions ([@Standard8])
+* [#1993] - propagate "file" property for "exports" interface ([@segrey])
+* [#1999] - Add support for strict mode ([@tmont])
+* [#2005] - XUnit Reporter Writes to stdout, falls back to console.log ([@jonnyreeves])
+* [#2021] - Fix non ES5 compliant regexp ([@zetaben])
+* [#1965] - Don't double install BDD UI ([@cowboyd])
+* [#1995] - Make sure the xunit output dir exists before writing to it ([@ianwremmel])
+* Use chalk for the base reporter colors; closes #1200 ([@boneskull])
+* Fix requiring custom interfaces ([@jgkim])
+* [#1967] Silence Bluebird js warnings ([@krisr])
+
+[#1945]: https://github.com/mochajs/mocha/pull/1945
+[#2056]: https://github.com/mochajs/mocha/pull/2056
+[#2048]: https://github.com/mochajs/mocha/pull/2048
+[#2033]: https://github.com/mochajs/mocha/pull/2033
+[#2037]: https://github.com/mochajs/mocha/pull/2037
+[#2038]: https://github.com/mochajs/mocha/pull/2038
+[#2028]: https://github.com/mochajs/mocha/pull/2028
+[#1977]: https://github.com/mochajs/mocha/pull/1977
+[#1982]: https://github.com/mochajs/mocha/pull/1982
+[#1976]: https://github.com/mochajs/mocha/pull/1976
+[#1963]: https://github.com/mochajs/mocha/pull/1963
+[#1981]: https://github.com/mochajs/mocha/pull/1981
+[#1993]: https://github.com/mochajs/mocha/pull/1993
+[#1999]: https://github.com/mochajs/mocha/pull/1999
+[#2005]: https://github.com/mochajs/mocha/pull/2005
+[#2021]: https://github.com/mochajs/mocha/pull/2021
+[1965#]: https://github.com/mochajs/mocha/pull/1965
+[#1995]: https://github.com/mochajs/mocha/pull/1995
+[#1967]: https://github.com/mochajs/mocha/pull/1967
+[@ryanshawty]: https://github.com/ryanshawty
+[@pra85]: https://github.com/pra85
+[@mislav]: https://github.com/mislav
+[@tomhughes]: https://github.com/tomhughes
+[@bd82]: https://github.com/bd82
+[@stonelgh]: https://github.com/stonelgh
+[@danielstjules]: https://github.com/danielstjules
+[@ahamid]: https://github.com/ahamid
+[@longlho]: https://github.com/longlho
+[@Alaneor]: https://github.com/Alaneor
+[@iclanzan]: https://github.com/iclanzan
+[@robraux]: https://github.com/robraux
+[@Standard8]: https://github.com/Standard8
+[@segrey]: https://github.com/segrey
+[@tmont]: https://github.com/tmont
+[@jonnyreeves]: https://github.com/jonnyreeves
+[@zetaben]: https://github.com/zetaben
+[@cowboyd]: https://github.com/cowboyd
+[@ianwremmel]: https://github.com/ianwremmel
+[@boneskull]: https://github.com/boneskull
+[@jgkim]: https://github.com/jgkim
+[@krisr]: https://github.com/krisr
+
+2.3.4 / 2015-11-15
+==================
+
+ * Update debug dependency to 2.2.0
+ * remove duplication of mocha.opts on process.argv
+ * Fix typo in test/reporters/nyan.js
+
+2.3.3 / 2015-09-19
+==================
+
+ * [#1875] - Fix Markdown reporter exceeds maximum call stack size ([@danielstjules])
+ * [#1864] - Fix xunit missing output with --reporter-options output ([@danielstjules])
+ * [#1846] - Support all harmony flags ([@danielstjules])
+ * Fix fragile xunit reporter spec ([@danielstjules])
+ * [#1669] - Fix catch uncaught errors outside test suite execution ([@danielstjules])
+ * [#1868] - Revert jade to support npm < v1.3.7 ([@danielstjules])
+ * [#1766] - Don't remove modules/components from stack trace in the browser ([@danielstjules])
+ * [#1798] - Fix correctly attribute mutiple done err with hooks ([@danielstjules])
+ * Fix use utils.reduce for IE8 compatibility ([@wsw0108])
+ * Some linting errors fixed by [@danielstjules]
+ * Call the inspect() function if message is not set ([@kevinburke])
+
+[#1875]: https://github.com/mochajs/mocha/issues/1875
+[#1864]: https://github.com/mochajs/mocha/issues/1864
+[#1846]: https://github.com/mochajs/mocha/issues/1846
+[#1669]: https://github.com/mochajs/mocha/issues/1669
+[#1868]: https://github.com/mochajs/mocha/issues/1868
+[#1766]: https://github.com/mochajs/mocha/issues/1766
+[#1798]: https://github.com/mochajs/mocha/issues/1798
+[@danielstjules]: https://github.com/danielstjules
+[@wsw0108]: https://github.com/wsw0108
+[@kevinburke]: https://github.com/kevinburke
+
+2.3.2 / 2015-09-07
+==================
+ * [#1868] - Fix compatibility with older versions of NPM ([@boneskull])
+
+ [#1868]: https://github.com/mochajs/mocha/issues/1868
+
+2.3.1 / 2015-09-06
+==================
+
+ * [#1812] - Fix: Bail flag causes before() hooks to be run even after a failure ([@aaroncrows])
+
+ [#1812]: https://github.com/mochajs/mocha/issues/1812
+ [aaroncrows]: https://github.com/aaroncrows
+
+2.3.0 / 2015-08-30
+==================
+
+ * [#553] - added --allowUncaught option ([@amsul])
+ * [#1490] - Allow --async-only to be satisfied by returning a promise ([@jlai])
+ * [#1829] - support --max-old-space-size ([@gigadude])
+ * [#1811] - upgrade Jade dependency ([@outsideris])
+ * [#1769] - Fix async hook error handling ([@ajaykodali])
+ * [#1230] - More descriptive beforeEach/afterEach messages ([@duncanbeevers])
+ * [#1787] - Scope loading behaviour instead of using early return ([@aryeguy])
+ * [#1789] - Fix: html-runner crashing ([@sunesimonsen])
+ * [#1749] - Fix maximum call stack error on large amount of tests ([@tinganho])
+ * [#1230] - Decorate failed hook titles with test title ([@duncanbeevers])
+ * [#1260] - Build using Browserify ([@ndhoule])
+ * [#1728] - Don't use `__proto__` ([@ndhoule])
+ * [#1781] - Fix hook error tests ([@glenjamin])
+ * [#1754] - Allow boolean --reporter-options ([@papandreou])
+ * [#1766] - Fix overly aggressive stack suppression ([@moll])
+ * [#1752] - Avoid potential infinite loop ([@gsilk])
+ * [#1761] - Fix problems running under PhantomJS ([@chromakode])
+ * [#1700] - Fix more problems running under PhantomJS ([@jbnicolai])
+ * [#1774] - Support escaped spaces in CLI options ([@adamgruber])
+ * [#1687] - Fix HTML reporter links with special chars ([@benvinegar])
+ * [#1359] - Adopt code style and enforce it using ESLint ([@ndhoule] w/ assist from [@jbnicolai] & [@boneskull])
+ * various refactors ([@jbnicolai])
+ * [#1758] - Add cross-frame compatible Error checking ([@outdooricon])
+ * [#1741] - Remove moot `version` property from bower.json ([@kkirsche])
+ * [#1739] - Improve `HISTORY.md` ([@rstacruz])
+ * [#1730] - Support more io.js flags ([@ryedog])
+ * [#1349] - Allow HTML in HTML reporter errors ([@papandreou] / [@sunesimonsen])
+ * [#1572] - Prevent default browser behavior for failure/pass links ([@jschilli])
+ * [#1630] - Support underscored harmony flags ([@dominicbarnes])
+ * [#1718] - Support more harmony flags ([@slyg])
+ * [#1689] - Add stack to JSON-stream reporter ([@jonathandelgado])
+ * [#1654] - Fix `ReferenceError` "location is not defined" ([@jakemmarsh])
+
+ [#553]: https://github.com/mochajs/mocha/issues/553
+ [#1490]: https://github.com/mochajs/mocha/issues/1490
+ [#1829]: https://github.com/mochajs/mocha/issues/1829
+ [#1811]: https://github.com/mochajs/mocha/issues/1811
+ [#1769]: https://github.com/mochajs/mocha/issues/1769
+ [#1230]: https://github.com/mochajs/mocha/issues/1230
+ [#1787]: https://github.com/mochajs/mocha/issues/1787
+ [#1789]: https://github.com/mochajs/mocha/issues/1789
+ [#1749]: https://github.com/mochajs/mocha/issues/1749
+ [#1230]: https://github.com/mochajs/mocha/issues/1230
+ [#1260]: https://github.com/mochajs/mocha/issues/1260
+ [#1728]: https://github.com/mochajs/mocha/issues/1728
+ [#1781]: https://github.com/mochajs/mocha/issues/1781
+ [#1754]: https://github.com/mochajs/mocha/issues/1754
+ [#1766]: https://github.com/mochajs/mocha/issues/1766
+ [#1752]: https://github.com/mochajs/mocha/issues/1752
+ [#1761]: https://github.com/mochajs/mocha/issues/1761
+ [#1700]: https://github.com/mochajs/mocha/issues/1700
+ [#1774]: https://github.com/mochajs/mocha/issues/1774
+ [#1687]: https://github.com/mochajs/mocha/issues/1687
+ [#1359]: https://github.com/mochajs/mocha/issues/1359
+ [#1758]: https://github.com/mochajs/mocha/issues/1758
+ [#1741]: https://github.com/mochajs/mocha/issues/1741
+ [#1739]: https://github.com/mochajs/mocha/issues/1739
+ [#1730]: https://github.com/mochajs/mocha/issues/1730
+ [#1349]: https://github.com/mochajs/mocha/issues/1349
+ [#1572]: https://github.com/mochajs/mocha/issues/1572
+ [#1630]: https://github.com/mochajs/mocha/issues/1630
+ [#1718]: https://github.com/mochajs/mocha/issues/1718
+ [#1689]: https://github.com/mochajs/mocha/issues/1689
+ [#1654]: https://github.com/mochajs/mocha/issues/1654
+ [@adamgruber]: https://github.com/adamgruber
+ [@ajaykodali]: https://github.com/ajaykodali
+ [@amsul]: https://github.com/amsul
+ [@aryeguy]: https://github.com/aryeguy
+ [@benvinegar]: https://github.com/benvinegar
+ [@boneskull]: https://github.com/boneskull
+ [@chromakode]: https://github.com/chromakode
+ [@dominicbarnes]: https://github.com/dominicbarnes
+ [@duncanbeevers]: https://github.com/duncanbeevers
+ [@gigadude]: https://github.com/gigadude
+ [@glenjamin]: https://github.com/glenjamin
+ [@gsilk]: https://github.com/gsilk
+ [@jakemmarsh]: https://github.com/jakemmarsh
+ [@jbnicolai]: https://github.com/jbnicolai
+ [@jlai]: https://github.com/jlai
+ [@jonathandelgado]: https://github.com/jonathandelgado
+ [@jschilli]: https://github.com/jschilli
+ [@kkirsche]: https://github.com/kkirsche
+ [@moll]: https://github.com/moll
+ [@ndhoule]: https://github.com/ndhoule
+ [@outdooricon]: https://github.com/outdooricon
+ [@outsideris]: https://github.com/outsideris
+ [@papandreou]: https://github.com/papandreou
+ [@rstacruz]: https://github.com/rstacruz
+ [@ryedog]: https://github.com/ryedog
+ [@slyg]: https://github.com/slyg
+ [@sunesimonsen]: https://github.com/sunesimonsen
+ [@tinganho]: https://github.com/tinganho
+
+2.2.5 / 2015-05-14
+==================
+
+ * [#1699] - Upgrade jsdiff to v1.4.0 ([@nylen])
+ * [#1648] - fix diff background colors in the console ([@nylen])
+ * [#1327] - fix tests running twice, a regression issue. ([#1686], [@danielstjules])
+ * [#1675] - add integration tests ([@danielstjules])
+ * [#1682] - use a valid SPDX license identifier in package.json ([@kemitchell])
+ * [#1660] - fix assertion of invalid dates ([#1661], [@a8m])
+ * [#1241] - fix issue with multiline diffs appearing as single line ([#1655], [@a8m])
+
+[#1699]: https://github.com/mochajs/mocha/issues/1699
+[#1648]: https://github.com/mochajs/mocha/issues/1648
+[#1327]: https://github.com/mochajs/mocha/issues/1327
+[#1686]: https://github.com/mochajs/mocha/issues/1686
+[#1675]: https://github.com/mochajs/mocha/issues/1675
+[#1682]: https://github.com/mochajs/mocha/issues/1682
+[#1660]: https://github.com/mochajs/mocha/issues/1660
+[#1661]: https://github.com/mochajs/mocha/issues/1661
+[#1241]: https://github.com/mochajs/mocha/issues/1241
+[#1655]: https://github.com/mochajs/mocha/issues/1655
+[@nylen]: https://github.com/nylen
+[@danielstjules]: https://github.com/danielstjules
+[@kemitchell]: https://github.com/kemitchell
+[@a8m]: https://github.com/a8m
+
+2.2.4 / 2015-04-08
+==================
+
+ * Load mocha.opts in _mocha for now (close #1645)
+
+2.2.3 / 2015-04-07
+==================
+
+ * fix(reporter/base): string diff - issue #1241
+ * fix(reporter/base): string diff - issue #1241
+ * fix(reporter/base): don't show diffs for errors without expectation
+ * fix(reporter/base): don't assume error message is first line of stack
+ * improve: dry up reporter/base test
+ * fix(reporter/base): explicitly ignore showDiff #1614
+ * Add iojs to travis build
+ * Pass `--allow-natives-syntax` flag to node.
+ * Support --harmony_classes flag for io.js
+ * Fix 1556: Update utils.clean to handle newlines in func declarations
+ * Fix 1606: fix err handling in IE <= 8 and non-ES5 browsers
+ * Fix 1585: make _mocha executable again
+ * chore(package.json): add a8m as a contributor
+ * Fixed broken link on html-cov reporter
+ * support --es_staging flag
+ * fix issue where menu overlaps content.
+ * update contributors in package.json
+ * Remove trailing whitespace from reporter output
+ * Remove contributors list from readme
+ * log third-party reporter errors
+ * [Fix] Exclude not own properties when looping on options
+ * fix: support node args in mocha.opts (close #1573)
+ * fix(reporter/base): string diff - issue #1241
+
+2.2.1 / 2015-03-09
+==================
+
+ * Fix passing of args intended for node/iojs.
+
+2.2.0 / 2015-03-06
+==================
+
+ * Update mocha.js
+ * Add --fgrep. Use grep for RegExp, fgrep for str
+ * Ignore async global errors after spec resolution
+ * Fixing errors that prevent mocha.js from loading in the browser - fixes #1558
+ * fix(utils): issue #1558 + make
+ * add ability to delay root suite; closes #362, closes #1124
+ * fix insanity in http tests
+ * update travis: add node 0.12, add gitter, remove slack
+ * building
+ * resolve #1548: ensure the environment's "node" executable is used
+ * reporters/base: use supports-color to detect colorable term
+ * travis: use docker containers
+ * small fix: commander option for --expose-gc
+ * Ignore asynchronous errors after global failure
+ * Improve error output when a test fails with a non-error
+ * updated travis badge, uses svg instead of img
+ * Allow skip from test context for #332
+ * [JSHINT] Unnecessary semicolon fixed in bin/_mocha
+ * Added a reminder about the done() callback to test timeout error messages
+ * fixes #1496, in Mocha.run(fn), check if fn exists before executing it, added tests too
+ * Add Harmony Proxy flag for iojs
+ * test(utils|ms|*): test existing units
+ * add support for some iojs flags
+ * fix(utils.stringify): issue #1229, diff viewer
+ * Remove slack link
+ * Prevent multiple 'grep=' querystring params in html reporter
+ * Use grep as regexp (close #1381)
+ * utils.stringify should handle objects without an Object prototype
+ * in runnable test, comparing to undefined error's message rather than a literal
+ * Fix test running output truncation on async STDIO
+ * amended for deprecated customFds option in child_process
+
+2.1.0 / 2014-12-23
+==================
+
+ * showDiff: don’t stringify strings
+ * Clean up unused module dependencies.
+ * Filter zero-length strings from mocha.opts
+ * only write to stdout in reporters
+ * Revert "only write to stdout in reporters"
+ * Print colored output only to a tty
+ * update summary in README.md
+ * rename Readme.md/History.md to README.md/HISTORY.md because neurotic
+ * add .mailmap to fix "git shortlog" or "git summary" output
+ * fixes #1461: nyan-reporter now respects Base.useColors, fixed bug where Base.color would not return a string when str wasn't a string.
+ * Use existing test URL builder in failed replay links
+ * modify .travis.yml: use travis_retry; closes #1449
+ * fix -t 0 behavior; closes #1446
+ * fix tests (whoops)
+ * improve diff behavior
+ * Preserve pathname when linking to individual tests
+ * Fix test
+ * Tiny typo in comments fixed
+ * after hooks now being called on failed tests when using bail, fixes #1093
+ * fix throwing undefined/null now makes tests fail, fixes #1395
+ * compiler extensions are added as watched extensions, removed non-standard extensions from watch regex, resolves #1221
+ * prefix/namespace for suite titles in markdown reporter, fixes #554
+ * fix more bad markdown in CONTRIBUTING.md
+ * fix bad markdown in CONTRIBUTING.md
+ * add setImmediate/clearImmediate to globals; closes #1435
+ * Fix buffer diffs (closes #1132, closes #1433)
+ * add a CONTRIBUTING.md. closes #882
+ * fix intermittent build failures (maybe). closes #1407
+ * add Slack notification to .travis.yml
+ * Fix slack link
+ * Add slack room to readme
+ * Update maintainers
+ * update maintainers and contributors
+ * resolves #1393: kill children with more effort on SIGINT
+ * xunit reporter support for optionally writing to a file
+ * if a reporter has a .done method, call it before exiting
+ * add support for reporter options
+ * only write to stdout in reporters
+
+2.0.0 / 2014-10-21
+==================
+
+ * remove: support for node 0.6.x, 0.4.x
+ * fix: landing reporter with non ansi characters (#211)
+ * fix: html reporter - preserve query params when navigating to suites/tests (#1358)
+ * fix: json stream reporter add error message to failed test
+ * fix: fixes for visionmedia -> mochajs
+ * fix: use stdio, fixes node deprecation warnings (#1391)
+
+1.21.5 / 2014-10-11
+==================
+
+ * fix: build for NodeJS v0.6.x
+ * fix: do not attempt to highlight syntax when non-HTML reporter is used
+ * update: escape-string-regexp to 1.0.2.
+ * fix: botched indentation in canonicalize()
+ * fix: .gitignore: ignore .patch and .diff files
+ * fix: changed 'Catched' to 'Caught' in uncaught exception error handler messages
+ * add: `pending` field for json reporter
+ * fix: Runner.prototype.uncaught: don't double-end runnables that already have a state.
+ * fix: --recursive, broken by f0facd2e
+ * update: replaces escapeRegexp with the escape-string-regexp package.
+ * update: commander to 2.3.0.
+ * update: diff to 1.0.8.
+ * fix: ability to disable syntax highlighting (#1329)
+ * fix: added empty object to errorJSON() call to catch when no error is present
+ * fix: never time out after calling enableTimeouts(false)
+ * fix: timeout(0) will work at suite level (#1300)
+ * Fix for --watch+only() issue (#888 )
+ * fix: respect err.showDiff, add Base reporter test (#810)
+
+1.22.1-3 / 2014-07-27
+==================
+
+ * fix: disabling timeouts with this.timeout(0) (#1301)
+
+1.22.1-3 / 2014-07-27
+==================
+
+ * fix: local uis and reporters (#1288)
+ * fix: building 1.21.0's changes in the browser (#1284)
+
+1.21.0 / 2014-07-23
+==================
+
+ * add: --no-timeouts option (#1262, #1268)
+ * add: --*- deprecation node flags (#1217)
+ * add: --watch-extensions argument (#1247)
+ * change: spec reporter is default (#1228)
+ * fix: diff output showing incorrect +/- (#1182)
+ * fix: diffs of circular structures (#1179)
+ * fix: re-render the progress bar when progress has changed only (#1151)
+ * fix support for environments with global and window (#1159)
+ * fix: reverting to previously defined onerror handler (#1178)
+ * fix: stringify non error objects passed to done() (#1270)
+ * fix: using local ui, reporters (#1267)
+ * fix: cleaning es6 arrows (#1176)
+ * fix: don't include attrs in failure tag for xunit (#1244)
+ * fix: fail tests that return a promise if promise is rejected w/o a reason (#1224)
+ * fix: showing failed tests in doc reporter (#1117)
+ * fix: dot reporter dots being off (#1204)
+ * fix: catch empty throws (#1219)
+ * fix: honoring timeout for sync operations (#1242)
+ * update: growl to 1.8.0
+
+1.20.1 / 2014-06-03
+==================
+
+ * update: should dev dependency to ~4.0.0 (#1231)
+
+1.20.0 / 2014-05-28
+==================
+
+ * add: filenames to suite objects (#1222)
+
+1.19.0 / 2014-05-17
+==================
+
+ * add: browser script option to package.json
+ * add: export file in Mocha.Test objects (#1174)
+ * add: add docs for wrapped node flags
+ * fix: mocha.run() to return error status in browser (#1216)
+ * fix: clean() to show failure details (#1205)
+ * fix: regex that generates html for new keyword (#1201)
+ * fix: sibling suites have inherited but separate contexts (#1164)
+
+
+1.18.2 / 2014-03-18
+==================
+
+ * fix: html runner was prevented from using #mocha as the default root el (#1162)
+
+1.18.1 / 2014-03-18
+==================
+
+ * fix: named before/after hooks in bdd, tdd, qunit interfaces (#1161)
+
+1.18.0 / 2014-03-13
+==================
+
+ * add: promise support (#329)
+ * add: named before/after hooks (#966)
+
+1.17.1 / 2014-01-22
+==================
+
+ * fix: expected messages in should.js (should.js#168)
+ * fix: expect errno global in node versions < v0.9.11 (#1111)
+ * fix: unreliable checkGlobals optimization (#1110)
+
+1.17.0 / 2014-01-09
+==================
+
+ * add: able to require globals (describe, it, etc.) through mocha (#1077)
+ * fix: abort previous run on --watch change (#1100)
+ * fix: reset context for each --watch triggered run (#1099)
+ * fix: error when cli can't resolve path or pattern (#799)
+ * fix: canonicalize objects before stringifying and diffing them (#1079)
+ * fix: make CR call behave like carriage return for non tty (#1087)
+
+
+1.16.2 / 2013-12-23
+==================
+
+ * fix: couple issues with ie 8 (#1082, #1081)
+ * fix: issue running the xunit reporter in browsers (#1068)
+ * fix: issue with firefox < 3.5 (#725)
+
+
+1.16.1 / 2013-12-19
+==================
+
+ * fix: recompiled for missed changes from the last release
+
+
+1.16.0 / 2013-12-19
+==================
+
+ * add: Runnable.globals(arr) for per test global whitelist (#1046)
+ * add: mocha.throwError(err) for assertion libs to call (#985)
+ * remove: --watch's spinner (#806)
+ * fix: duplicate test output for multi-line specs in spec reporter (#1006)
+ * fix: gracefully exit on SIGINT (#1063)
+ * fix expose the specified ui only in the browser (#984)
+ * fix: ensure process exit code is preserved when using --no-exit (#1059)
+ * fix: return true from window.onerror handler (#868)
+ * fix: xunit reporter to use process.stdout.write (#1068)
+ * fix: utils.clean(str) indentation (#761)
+ * fix: xunit reporter returning test duration a NaN (#1039)
+
+1.15.1 / 2013-12-03
+==================
+
+ * fix: recompiled for missed changes from the last release
+
+1.15.0 / 2013-12-02
+==================
+
+ * add: `--no-exit` to prevent `process.exit()` (#1018)
+ * fix: using inline diffs (#1044)
+ * fix: show pending test details in xunit reporter (#1051)
+ * fix: faster global leak detection (#1024)
+ * fix: yui compression (#1035)
+ * fix: wrapping long lines in test results (#1030, #1031)
+ * fix: handle errors in hooks (#1043)
+
+1.14.0 / 2013-11-02
+==================
+
+ * add: unified diff (#862)
+ * add: set MOCHA_COLORS env var to use colors (#965)
+ * add: able to override tests links in html reporters (#776)
+ * remove: teamcity reporter (#954)
+ * update: commander dependency to 2.0.0 (#1010)
+ * fix: mocha --ui will try to require the ui if not built in, as --reporter does (#1022)
+ * fix: send cursor commands only if isatty (#184, #1003)
+ * fix: include assertion message in base reporter (#993, #991)
+ * fix: consistent return of it, it.only, and describe, describe.only (#840)
+
+1.13.0 / 2013-09-15
+==================
+
+ * add: sort test files with --sort (#813)
+ * update: diff dependency to 1.0.7
+ * update: glob dependency to 3.2.3 (#927)
+ * fix: diffs show whitespace differences (#976)
+ * fix: improve global leaks (#783)
+ * fix: firefox window.getInterface leak
+ * fix: accessing iframe via window[iframeIndex] leak
+ * fix: faster global leak checking
+ * fix: reporter pending css selector (#970)
+
+1.12.1 / 2013-08-29
+==================
+
+ * remove test.js from .gitignore
+ * update included version of ms.js
+
+1.12.0 / 2013-07-01
+==================
+
+ * add: prevent diffs for differing types. Closes #900
+ * add `Mocha.process` hack for phantomjs
+ * fix: use compilers with requires
+ * fix regexps in diffs. Closes #890
+ * fix xunit NaN on failure. Closes #894
+ * fix: strip tab indentation in `clean` utility method
+ * fix: textmate bundle installation
+
+1.11.0 / 2013-06-12
+==================
+
+ * add --prof support
+ * add --harmony support
+ * add --harmony-generators support
+ * add "Uncaught " prefix to uncaught exceptions
+ * add web workers support
+ * add `suite.skip()`
+ * change to output # of pending / passing even on failures. Closes #872
+ * fix: prevent hooks from being called if we are bailing
+ * fix `this.timeout(0)`
+
+1.10.0 / 2013-05-21
+==================
+
+ * add add better globbing support for windows via `glob` module
+ * add support to pass through flags such as --debug-brk=1234. Closes #852
+ * add test.only, test.skip to qunit interface
+ * change to always use word-based diffs for now. Closes #733
+ * change `mocha init` tests.html to index.html
+ * fix `process` global leak in the browser
+ * fix: use resolve() instead of join() for --require
+ * fix: filterLeaks() condition to not consider indices in global object as leaks
+ * fix: restrict mocha.css styling to #mocha id
+ * fix: save timer references to avoid Sinon interfering in the browser build.
+
+1.9.0 / 2013-04-03
+==================
+
+ * add improved setImmediate implementation
+ * replace --ignore-leaks with --check-leaks
+ * change default of ignoreLeaks to true. Closes #791
+ * remove scrolling for HTML reporter
+ * fix retina support
+ * fix tmbundle, restrict to js scope
+
+1.8.2 / 2013-03-11
+==================
+
+ * add `setImmediate` support for 0.10.x
+ * fix mocha -w spinner on windows
+
+1.8.1 / 2013-01-09
+==================
+
+ * fix .bail() arity check causing it to default to true
+
+1.8.0 / 2013-01-08
+==================
+
+ * add Mocha() options bail support
+ * add `Mocha#bail()` method
+ * add instanceof check back for inheriting from Error
+ * add component.json
+ * add diff.js to browser build
+ * update growl
+ * fix TAP reporter failures comment :D
+
+1.7.4 / 2012-12-06
+==================
+
+ * add total number of passes and failures to TAP
+ * remove .bind() calls. re #680
+ * fix indexOf. Closes #680
+
+1.7.3 / 2012-11-30
+==================
+
+ * fix uncaught error support for the browser
+ * revert uncaught "fix" which breaks node
+
+1.7.2 / 2012-11-28
+==================
+
+ * fix uncaught errors to expose the original error message
+
+1.7.0 / 2012-11-07
+==================
+
+ * add `--async-only` support to prevent false positives for missing `done()`
+ * add sorting by filename in code coverage
+ * add HTML 5 doctype to browser template.
+ * add play button to html reporter to rerun a single test
+ * add `this.timeout(ms)` as Suite#timeout(ms). Closes #599
+ * update growl dependency to 1.6.x
+ * fix encoding of test-case ?grep. Closes #637
+ * fix unicode chars on windows
+ * fix dom globals in Opera/IE. Closes #243
+ * fix markdown reporter a tags
+ * fix `this.timeout("5s")` support
+
+1.6.0 / 2012-10-02
+==================
+
+ * add object diffs when `err.showDiff` is present
+ * add hiding of empty suites when pass/failures are toggled
+ * add faster `.length` checks to `checkGlobals()` before performing the filter
+
+1.5.0 / 2012-09-21
+==================
+
+ * add `ms()` to `.slow()` and `.timeout()`
+ * add `Mocha#checkLeaks()` to re-enable global leak checks
+ * add `this.slow()` option [aheckmann]
+ * add tab, CR, LF to error diffs for now
+ * add faster `.checkGlobals()` solution [guille]
+ * remove `fn.call()` from reduce util
+ * remove `fn.call()` from filter util
+ * fix forEach. Closes #582
+ * fix relaying of signals [TooTallNate]
+ * fix TAP reporter grep number
+
+1.4.2 / 2012-09-01
+==================
+
+ * add support to multiple `Mocha#globals()` calls, and strings
+ * add `mocha.reporter()` constructor support [jfirebaugh]
+ * add `mocha.timeout()`
+ * move query-string parser to utils.js
+ * move highlight code to utils.js
+ * fix third-party reporter support [exogen]
+ * fix client-side API to match node-side [jfirebaugh]
+ * fix mocha in iframe [joliss]
+
+1.4.1 / 2012-08-28
+==================
+
+ * add missing `Markdown` export
+ * fix `Mocha#grep()`, escape regexp strings
+ * fix reference error when `devicePixelRatio` is not defined. Closes #549
+
+1.4.0 / 2012-08-22
+==================
+
+ * add mkdir -p to `mocha init`. Closes #539
+ * add `.only()`. Closes #524
+ * add `.skip()`. Closes #524
+ * change str.trim() to use utils.trim(). Closes #533
+ * fix HTML progress indicator retina display
+ * fix url-encoding of click-to-grep HTML functionality
+
+1.3.2 / 2012-08-01
+==================
+
+ * fix exports double-execution regression. Closes #531
+
+1.3.1 / 2012-08-01
+==================
+
+ * add passes/failures toggling to HTML reporter
+ * add pending state to `xit()` and `xdescribe()` [Brian Moore]
+ * add the @charset "UTF-8"; to fix #522 with FireFox. [Jonathan Creamer]
+ * add border-bottom to #stats links
+ * add check for runnable in `Runner#uncaught()`. Closes #494
+ * add 0.4 and 0.6 back to travis.yml
+ * add `-E, --growl-errors` to growl on failures only
+ * add prefixes to debug() names. Closes #497
+ * add `Mocha#invert()` to js api
+ * change dot reporter to use sexy unicode dots
+ * fix error when clicking pending test in HTML reporter
+ * fix `make tm`
+
+1.3.0 / 2012-07-05
+==================
+
+ * add window scrolling to `HTML` reporter
+ * add v8 `--trace-*` option support
+ * add support for custom reports via `--reporter MODULE`
+ * add `--invert` switch to invert `--grep` matches
+ * fix export of `Nyan` reporter. Closes #495
+ * fix escaping of `HTML` suite titles. Closes #486
+ * fix `done()` called multiple times with an error test
+ * change `--grep` - regexp escape the input
+
+1.2.2 / 2012-06-28
+==================
+
+ * Added 0.8.0 support
+
+1.2.1 / 2012-06-25
+==================
+
+ * Added `this.test.error(err)` support to after each hooks. Closes #287
+ * Added: export top-level suite on global mocha object (mocha.suite). Closes #448
+ * Fixed `js` code block format error in markdown reporter
+ * Fixed deprecation warning when using `path.existsSync`
+ * Fixed --globals with wildcard
+ * Fixed chars in nyan when his head moves back
+ * Remove `--growl` from test/mocha.opts. Closes #289
+
+1.2.0 / 2012-06-17
+==================
+
+ * Added `nyan` reporter [Atsuya Takagi]
+ * Added `mocha init <path>` to copy client files
+ * Added "specify" synonym for "it" [domenic]
+ * Added global leak wildcard support [nathanbowser]
+ * Fixed runner emitter leak. closes #432
+ * Fixed omission of .js extension. Closes #454
+
+1.1.0 / 2012-05-30
+==================
+
+ * Added: check each `mocha(1)` arg for directories to walk
+ * Added `--recursive` [tricknotes]
+ * Added `context` for BDD [hokaccha]
+ * Added styling for new clickable titles
+ * Added clickable suite titles to HTML reporter
+ * Added warning when strings are thrown as errors
+ * Changed: green arrows again in HTML reporter styling
+ * Changed ul/li elements instead of divs for better copy-and-pasting [joliss]
+ * Fixed issue #325 - add better grep support to js api
+ * Fixed: save timer references to avoid Sinon interfering.
+
+1.0.3 / 2012-04-30
+==================
+
+ * Fixed string diff newlines
+ * Fixed: removed mocha.css target. Closes #401
+
+1.0.2 / 2012-04-25
+==================
+
+ * Added HTML reporter duration. Closes #47
+ * Fixed: one postMessage event listener [exogen]
+ * Fixed: allow --globals to be used multiple times. Closes #100 [brendannee]
+ * Fixed #158: removes jquery include from browser tests
+ * Fixed grep. Closes #372 [brendannee]
+ * Fixed #166 - When grepping don't display the empty suites
+ * Removed test/browser/style.css. Closes #385
+
+1.0.1 / 2012-04-04
+==================
+
+ * Fixed `.timeout()` in hooks
+ * Fixed: allow callback for `mocha.run()` in client version
+ * Fixed browser hook error display. Closes #361
+
+1.0.0 / 2012-03-24
+==================
+
+ * Added js API. Closes #265
+ * Added: initial run of tests with `--watch`. Closes #345
+ * Added: mark `location` as a global on the CS. Closes #311
+ * Added `markdown` reporter (github flavour)
+ * Added: scrolling menu to coverage.html. Closes #335
+ * Added source line to html report for Safari [Tyson Tate]
+ * Added "min" reporter, useful for `--watch` [Jakub Nešetřil]
+ * Added support for arbitrary compilers via . Closes #338 [Ian Young]
+ * Added Teamcity export to lib/reporters/index [Michael Riley]
+ * Fixed chopping of first char in error reporting. Closes #334 [reported by topfunky]
+ * Fixed terrible FF / Opera stack traces
+
+0.14.1 / 2012-03-06
+==================
+
+ * Added lib-cov to _.npmignore_
+ * Added reporter to `mocha.run([reporter])` as argument
+ * Added some margin-top to the HTML reporter
+ * Removed jQuery dependency
+ * Fixed `--watch`: purge require cache. Closes #266
+
+0.14.0 / 2012-03-01
+==================
+
+ * Added string diff support for terminal reporters
+
+0.13.0 / 2012-02-23
+==================
+
+ * Added preliminary test coverage support. Closes #5
+ * Added `HTMLCov` reporter
+ * Added `JSONCov` reporter [kunklejr]
+ * Added `xdescribe()` and `xit()` to the BDD interface. Closes #263 (docs * Changed: make json reporter output pretty json
+ * Fixed node-inspector support, swapped `--debug` for `debug` to match node.
+needed)
+Closes #247
+
+0.12.1 / 2012-02-14
+==================
+
+ * Added `npm docs mocha` support [TooTallNate]
+ * Added a `Context` object used for hook and test-case this. Closes #253
+ * Fixed `Suite#clone()` `.ctx` reference. Closes #262
+
+0.12.0 / 2012-02-02
+==================
+
+ * Added .coffee `--watch` support. Closes #242
+ * Added support to `--require` files relative to the CWD. Closes #241
+ * Added quick n dirty syntax highlighting. Closes #248
+ * Changed: made HTML progress indicator smaller
+ * Fixed xunit errors attribute [dhendo]
+
+0.10.2 / 2012-01-21
+==================
+
+ * Fixed suite count in reporter stats. Closes #222
+ * Fixed `done()` after timeout error reporting [Phil Sung]
+ * Changed the 0-based errors to 1
+
+0.10.1 / 2012-01-17
+==================
+
+ * Added support for node 0.7.x
+ * Fixed absolute path support. Closes #215 [kompiro]
+ * Fixed `--no-colors` option [Jussi Virtanen]
+ * Fixed Arial CSS typo in the correct file
+
+0.10.0 / 2012-01-13
+==================
+
+ * Added `-b, --bail` to exit on first exception [guillermo]
+ * Added support for `-gc` / `--expose-gc` [TooTallNate]
+ * Added `qunit`-inspired interface
+ * Added MIT LICENSE. Closes #194
+ * Added: `--watch` all .js in the CWD. Closes #139
+ * Fixed `self.test` reference in runner. Closes #189
+ * Fixed double reporting of uncaught exceptions after timeout. Closes #195
+
+0.8.2 / 2012-01-05
+==================
+
+ * Added test-case context support. Closes #113
+ * Fixed exit status. Closes #187
+ * Update commander. Closes #190
+
+0.8.1 / 2011-12-30
+==================
+
+ * Fixed reporting of uncaught exceptions. Closes #183
+ * Fixed error message defaulting [indutny]
+ * Changed mocha(1) from bash to node for windows [Nathan Rajlich]
+
+0.8.0 / 2011-12-28
+==================
+
+ * Added `XUnit` reporter [FeeFighters/visionmedia]
+ * Added `say(1)` notification support [Maciej Małecki]
+ * Changed: fail when done() is invoked with a non-Error. Closes #171
+ * Fixed `err.stack`, defaulting to message. Closes #180
+ * Fixed: `make tm` mkdir -p the dest. Closes #137
+ * Fixed mocha(1) --help bin name
+ * Fixed `-d` for `--debug` support
+
+0.7.1 / 2011-12-22
+==================
+
+ * Removed `mocha-debug(1)`, use `mocha --debug`
+ * Fixed CWD relative requires
+ * Fixed growl issue on windows [Raynos]
+ * Fixed: platform specific line endings [TooTallNate]
+ * Fixed: escape strings in HTML reporter. Closes #164
+
+0.7.0 / 2011-12-18
+==================
+
+ * Added support for IE{7,8} [guille]
+ * Changed: better browser nextTick implementation [guille]
+
+0.6.0 / 2011-12-18
+==================
+
+ * Added setZeroTimeout timeout for browser (nicer stack traces). Closes #153
+ * Added "view source" on hover for HTML reporter to make it obvious
+ * Changed: replace custom growl with growl lib
+ * Fixed duplicate reporting for HTML reporter. Closes #154
+ * Fixed silent hook errors in the HTML reporter. Closes #150
+
+0.5.0 / 2011-12-14
+==================
+
+ * Added: push node_modules directory onto module.paths for relative require Closes #93
+ * Added teamcity reporter [blindsey]
+ * Fixed: recover from uncaught exceptions for tests. Closes #94
+ * Fixed: only emit "test end" for uncaught within test, not hook
+
+0.4.0 / 2011-12-14
+==================
+
+ * Added support for test-specific timeouts via `this.timeout(0)`. Closes #134
+ * Added guillermo's client-side EventEmitter. Closes #132
+ * Added progress indicator to the HTML reporter
+ * Fixed slow browser tests. Closes #135
+ * Fixed "suite" color for light terminals
+ * Fixed `require()` leak spotted by [guillermo]
+
+0.3.6 / 2011-12-09
+==================
+
+ * Removed suite merging (for now)
+
+0.3.5 / 2011-12-08
+==================
+
+ * Added support for `window.onerror` [guillermo]
+ * Fixed: clear timeout on uncaught exceptions. Closes #131 [guillermo]
+ * Added `mocha.css` to PHONY list.
+ * Added `mocha.js` to PHONY list.
+
+0.3.4 / 2011-12-08
+==================
+
+ * Added: allow `done()` to be called with non-Error
+ * Added: return Runner from `mocha.run()`. Closes #126
+ * Fixed: run afterEach even on failures. Closes #125
+ * Fixed clobbering of current runnable. Closes #121
+
+0.3.3 / 2011-12-08
+==================
+
+ * Fixed hook timeouts. Closes #120
+ * Fixed uncaught exceptions in hooks
+
+0.3.2 / 2011-12-05
+==================
+
+ * Fixed weird reporting when `err.message` is not present
+
+0.3.1 / 2011-12-04
+==================
+
+ * Fixed hook event emitter leak. Closes #117
+ * Fixed: export `Spec` constructor. Closes #116
+
+0.3.0 / 2011-12-04
+==================
+
+ * Added `-w, --watch`. Closes #72
+ * Added `--ignore-leaks` to ignore global leak checking
+ * Added browser `?grep=pattern` support
+ * Added `--globals <names>` to specify accepted globals. Closes #99
+ * Fixed `mocha-debug(1)` on some systems. Closes #232
+ * Fixed growl total, use `runner.total`
+
+0.2.0 / 2011-11-30
+==================
+
+ * Added `--globals <names>` to specify accepted globals. Closes #99
+ * Fixed funky highlighting of messages. Closes #97
+ * Fixed `mocha-debug(1)`. Closes #232
+ * Fixed growl total, use runner.total
+
+0.1.0 / 2011-11-29
+==================
+
+ * Added `suiteSetup` and `suiteTeardown` to TDD interface [David Henderson]
+ * Added growl icons. Closes #84
+ * Fixed coffee-script support
+
+0.0.8 / 2011-11-25
+==================
+
+ * Fixed: use `Runner#total` for accurate reporting
+
+0.0.7 / 2011-11-25
+==================
+
+ * Added `Hook`
+ * Added `Runnable`
+ * Changed: `Test` is `Runnable`
+ * Fixed global leak reporting in hooks
+ * Fixed: > 2 calls to done() only report the error once
+ * Fixed: clear timer on failure. Closes #80
+
+0.0.6 / 2011-11-25
+==================
+
+ * Fixed return on immediate async error. Closes #80
+
+0.0.5 / 2011-11-24
+==================
+
+ * Fixed: make mocha.opts whitespace less picky [kkaefer]
+
+0.0.4 / 2011-11-24
+==================
+
+ * Added `--interfaces`
+ * Added `--reporters`
+ * Added `-c, --colors`. Closes #69
+ * Fixed hook timeouts
+
+0.0.3 / 2011-11-23
+==================
+
+ * Added `-C, --no-colors` to explicitly disable
+ * Added coffee-script support
+
+0.0.2 / 2011-11-22
+==================
+
+ * Fixed global leak detection due to Safari bind() change
+ * Fixed: escape html entities in Doc reporter
+ * Fixed: escape html entities in HTML reporter
+ * Fixed pending test support for HTML reporter. Closes #66
+
+0.0.1 / 2011-11-22
+==================
+
+ * Added `--timeout` second shorthand support, ex `--timeout 3s`.
+ * Fixed "test end" event for uncaughtExceptions. Closes #61
+
+0.0.1-alpha6 / 2011-11-19
+==================
+
+ * Added travis CI support (needs enabling when public)
+ * Added preliminary browser support
+ * Added `make mocha.css` target. Closes #45
+ * Added stack trace to TAP errors. Closes #52
+ * Renamed tearDown to teardown. Closes #49
+ * Fixed: cascading hooksc. Closes #30
+ * Fixed some colors for non-tty
+ * Fixed errors thrown in sync test-cases due to nextTick
+ * Fixed Base.window.width... again give precedence to 0.6.x
+
+0.0.1-alpha5 / 2011-11-17
+==================
+
+ * Added `doc` reporter. Closes #33
+ * Added suite merging. Closes #28
+ * Added TextMate bundle and `make tm`. Closes #20
+
+0.0.1-alpha4 / 2011-11-15
+==================
+
+ * Fixed getWindowSize() for 0.4.x
+
+0.0.1-alpha3 / 2011-11-15
+==================
+
+ * Added `-s, --slow <ms>` to specify "slow" test threshold
+ * Added `mocha-debug(1)`
+ * Added `mocha.opts` support. Closes #31
+ * Added: default [files] to _test/*.js_
+ * Added protection against multiple calls to `done()`. Closes #35
+ * Changed: bright yellow for slow Dot reporter tests
+
+0.0.1-alpha1 / 2011-11-08
+==================
+
+ * Missed this one :)
+
+0.0.1-alpha1 / 2011-11-08
+==================
+
+ * Initial release
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/LICENSE b/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/LICENSE
new file mode 100644
index 00000000000..287db889936
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/LICENSE
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright (c) 2011-2017 JS Foundation and contributors, https://js.foundation
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/README.md
new file mode 100644
index 00000000000..9e4d4dcbeac
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/README.md
@@ -0,0 +1,124 @@
+# Mocha needs YOU!
+
+*Did you know* Mocha [is a dependency of over 100,000 projects](https://libraries.io/npm/mocha) published to npm alone?
+
+**Despite this, we're currently unable to merge most pull requests due to lack of maintenance resources.**
+
+**Are you interested in triaging issues or reviewing open PRs? Have some time to hack on its codebase?** If you would like to help maintain Mocha, please contact `@boneskull` on [Gitter](https://gitter.im/mochajs/mocha).
+
+*Thank you* :kissing_heart: to all of you interested in helping. These are Mocha's immediate needs:
+
+1. Increase test coverage on Node.js and browser
+ - Increase integration coverage for all reporters
+ - `html` reporter must be tested in browser
+ - ~~Basic console reporters (*not* `nyan`, `landing`, etc.) must be tested in **both** browser and Node.js contexts; PhantomJS can consume all console reporters~~
+ - ~~Filesystem-based reporters must be tested in Node.js context~~
+ - **UPDATE - May 24 2017**: Thanks to [community contributions](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md#mag-coverage), the coverage on most reporters has increased dramatically! The `html` reporter is still in [dire need of coverage](https://coveralls.io/builds/11674428/source?filename=lib%2Freporters%2Fhtml.js).
+ - Increase coverage against all interfaces (`exports` in particular). Ideally this becomes a "matrix" where we repeat sets of integration tests across all interfaces.
+ - Refactor non-Node.js-specific tests to allow them to run in a browser context. Node.js-specific tests include those which *require* the CLI or filesystem. Most everything else is fair game.
+2. Review current open pull requests
+ - We need individuals familiar with Mocha's codebase. Got questions? Ask them in [our chat room](https://gitter.im/mochajs/mocha).
+ - Pull requests **must** have supporting tests. The only exceptions are pure cosmetic or non-functional changes.
+ - Pull request contributors must sign the CLA.
+3. Close old, inactive issues and pull requests
+ - ~~A bot should do this. We need a bot. Got a bot?~~ We now use GitHub's own [probot-stale](https://www.npmjs.com/package/probot-stale).
+4. Triage issues
+ - If we run into "critical" bugs, they need fixing.
+ - "Critical" means Mocha is broken w/o workarounds for a *large percentage* of users
+ - Otherwise: respond to issues, close new dupe issues, confirm bugs, ask for more info, etc.
+
+Once we gain ground on the above items, we can work together formalize our contribution guidelines and governance. For further info & ideas, please see our [projects](https://github.com/mochajs/mocha/projects/).
+
+*You needn't be a maintainer to submit a pull request for test coverage!*
+
+-- @boneskull, *Jan 17 2016*
+
+<br><br>
+<p align="center">
+ <img src="https://cldup.com/xFVFxOioAU.svg" alt="Mocha test framework"/>
+</p>
+
+[![Build Status](https://api.travis-ci.org/mochajs/mocha.svg?branch=master)](http://travis-ci.org/mochajs/mocha)
+[![Coverage Status](https://coveralls.io/repos/github/mochajs/mocha/badge.svg)](https://coveralls.io/github/mochajs/mocha)
+[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fmochajs%2Fmocha.svg?type=shield)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fmochajs%2Fmocha?ref=badge_shield)
+[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mochajs/mocha?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+[![OpenCollective](https://opencollective.com/mochajs/backers/badge.svg)](#backers)
+[![OpenCollective](https://opencollective.com/mochajs/sponsors/badge.svg)](#sponsors)
+<br><img alt="Mocha Browser Support h/t SauceLabs" src="https://saucelabs.com/browser-matrix/mochajs.svg" width="354">
+
+ Mocha is a simple, flexible, fun JavaScript test framework for node.js and the browser. For more information view the [documentation](http://mochajs.org).
+
+## Links
+
+ - [Changelog](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md)
+ - [Google Group](http://groups.google.com/group/mochajs)
+ - [Wiki](https://github.com/mochajs/mocha/wiki)
+ - Mocha [Extensions and reporters](https://github.com/mochajs/mocha/wiki)
+
+
+## Backers
+
+[Become a backer]((https://opencollective.com/mochajs#backer)) and show your support to our open source project.
+
+<a href="https://opencollective.com/mochajs/backer/0/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/0/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/1/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/1/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/2/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/2/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/3/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/3/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/4/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/4/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/5/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/5/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/6/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/6/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/7/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/7/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/8/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/8/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/9/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/9/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/10/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/10/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/11/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/11/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/12/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/12/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/13/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/13/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/14/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/14/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/15/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/15/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/16/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/16/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/17/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/17/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/18/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/18/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/19/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/19/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/20/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/20/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/21/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/21/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/22/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/22/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/23/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/23/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/24/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/24/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/25/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/25/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/26/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/26/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/27/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/27/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/28/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/28/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/29/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/29/avatar"></a>
+
+
+## Sponsors
+
+Does your company use Mocha? Ask your manager or marketing team if your company would be interested in supporting our project. Support will allow the maintainers to dedicate more time for maintenance and new features for everyone. Also, your company's logo will show [on GitHub](https://github.com/mochajs/mocha#readme) and on [our site](https://mochajs.org)--who doesn't want a little extra exposure? [Here's the info](https://opencollective.com/mochajs#sponsor).
+
+<a href="https://opencollective.com/mochajs/sponsor/0/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/0/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/1/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/1/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/2/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/2/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/3/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/3/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/4/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/4/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/5/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/5/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/6/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/6/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/7/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/7/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/8/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/8/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/9/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/9/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/10/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/10/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/11/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/11/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/12/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/12/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/13/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/13/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/14/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/14/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/15/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/15/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/16/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/16/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/17/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/17/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/18/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/18/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/19/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/19/avatar"></a>
+
+## License
+
+[MIT](LICENSE)
+
+[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fmochajs%2Fmocha.svg?type=large)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fmochajs%2Fmocha?ref=badge_large)
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/bower.json
new file mode 100644
index 00000000000..e96cc9526d2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/bower.json
@@ -0,0 +1,38 @@
+{
+ "name": "mocha",
+ "homepage": "https://mochajs.org",
+ "description": "simple, flexible, fun test framework",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/mochajs/mocha.git"
+ },
+ "main": [
+ "mocha.js",
+ "mocha.css"
+ ],
+ "ignore": [
+ "bin",
+ "editors",
+ "images",
+ "lib",
+ "scripts",
+ "test",
+ "assets",
+ "media",
+ ".*",
+ "index.js",
+ "karma.conf.js",
+ "browser-entry.js",
+ "Makefile",
+ "package.json",
+ "appveyor.yml"
+ ],
+ "keywords": [
+ "mocha",
+ "test",
+ "bdd",
+ "tdd",
+ "tap"
+ ],
+ "license": "MIT"
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/mocha.css b/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/mocha.css
new file mode 100644
index 00000000000..ec96b003c98
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/mocha.css
@@ -0,0 +1,326 @@
+@charset "utf-8";
+
+body {
+ margin:0;
+}
+
+#mocha {
+ font: 20px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif;
+ margin: 60px 50px;
+}
+
+#mocha ul,
+#mocha li {
+ margin: 0;
+ padding: 0;
+}
+
+#mocha ul {
+ list-style: none;
+}
+
+#mocha h1,
+#mocha h2 {
+ margin: 0;
+}
+
+#mocha h1 {
+ margin-top: 15px;
+ font-size: 1em;
+ font-weight: 200;
+}
+
+#mocha h1 a {
+ text-decoration: none;
+ color: inherit;
+}
+
+#mocha h1 a:hover {
+ text-decoration: underline;
+}
+
+#mocha .suite .suite h1 {
+ margin-top: 0;
+ font-size: .8em;
+}
+
+#mocha .hidden {
+ display: none;
+}
+
+#mocha h2 {
+ font-size: 12px;
+ font-weight: normal;
+ cursor: pointer;
+}
+
+#mocha .suite {
+ margin-left: 15px;
+}
+
+#mocha .test {
+ margin-left: 15px;
+ overflow: hidden;
+}
+
+#mocha .test.pending:hover h2::after {
+ content: '(pending)';
+ font-family: arial, sans-serif;
+}
+
+#mocha .test.pass.medium .duration {
+ background: #c09853;
+}
+
+#mocha .test.pass.slow .duration {
+ background: #b94a48;
+}
+
+#mocha .test.pass::before {
+ content: '✓';
+ font-size: 12px;
+ display: block;
+ float: left;
+ margin-right: 5px;
+ color: #00d6b2;
+}
+
+#mocha .test.pass .duration {
+ font-size: 9px;
+ margin-left: 5px;
+ padding: 2px 5px;
+ color: #fff;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.2);
+ -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.2);
+ box-shadow: inset 0 1px 1px rgba(0,0,0,.2);
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ -ms-border-radius: 5px;
+ -o-border-radius: 5px;
+ border-radius: 5px;
+}
+
+#mocha .test.pass.fast .duration {
+ display: none;
+}
+
+#mocha .test.pending {
+ color: #0b97c4;
+}
+
+#mocha .test.pending::before {
+ content: '◦';
+ color: #0b97c4;
+}
+
+#mocha .test.fail {
+ color: #c00;
+}
+
+#mocha .test.fail pre {
+ color: black;
+}
+
+#mocha .test.fail::before {
+ content: '✖';
+ font-size: 12px;
+ display: block;
+ float: left;
+ margin-right: 5px;
+ color: #c00;
+}
+
+#mocha .test pre.error {
+ color: #c00;
+ max-height: 300px;
+ overflow: auto;
+}
+
+#mocha .test .html-error {
+ overflow: auto;
+ color: black;
+ line-height: 1.5;
+ display: block;
+ float: left;
+ clear: left;
+ font: 12px/1.5 monaco, monospace;
+ margin: 5px;
+ padding: 15px;
+ border: 1px solid #eee;
+ max-width: 85%; /*(1)*/
+ max-width: -webkit-calc(100% - 42px);
+ max-width: -moz-calc(100% - 42px);
+ max-width: calc(100% - 42px); /*(2)*/
+ max-height: 300px;
+ word-wrap: break-word;
+ border-bottom-color: #ddd;
+ -webkit-box-shadow: 0 1px 3px #eee;
+ -moz-box-shadow: 0 1px 3px #eee;
+ box-shadow: 0 1px 3px #eee;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+
+#mocha .test .html-error pre.error {
+ border: none;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+ -webkit-box-shadow: 0;
+ -moz-box-shadow: 0;
+ box-shadow: 0;
+ padding: 0;
+ margin: 0;
+ margin-top: 18px;
+ max-height: none;
+}
+
+/**
+ * (1): approximate for browsers not supporting calc
+ * (2): 42 = 2*15 + 2*10 + 2*1 (padding + margin + border)
+ * ^^ seriously
+ */
+#mocha .test pre {
+ display: block;
+ float: left;
+ clear: left;
+ font: 12px/1.5 monaco, monospace;
+ margin: 5px;
+ padding: 15px;
+ border: 1px solid #eee;
+ max-width: 85%; /*(1)*/
+ max-width: -webkit-calc(100% - 42px);
+ max-width: -moz-calc(100% - 42px);
+ max-width: calc(100% - 42px); /*(2)*/
+ word-wrap: break-word;
+ border-bottom-color: #ddd;
+ -webkit-box-shadow: 0 1px 3px #eee;
+ -moz-box-shadow: 0 1px 3px #eee;
+ box-shadow: 0 1px 3px #eee;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+
+#mocha .test h2 {
+ position: relative;
+}
+
+#mocha .test a.replay {
+ position: absolute;
+ top: 3px;
+ right: 0;
+ text-decoration: none;
+ vertical-align: middle;
+ display: block;
+ width: 15px;
+ height: 15px;
+ line-height: 15px;
+ text-align: center;
+ background: #eee;
+ font-size: 15px;
+ -webkit-border-radius: 15px;
+ -moz-border-radius: 15px;
+ border-radius: 15px;
+ -webkit-transition:opacity 200ms;
+ -moz-transition:opacity 200ms;
+ -o-transition:opacity 200ms;
+ transition: opacity 200ms;
+ opacity: 0.3;
+ color: #888;
+}
+
+#mocha .test:hover a.replay {
+ opacity: 1;
+}
+
+#mocha-report.pass .test.fail {
+ display: none;
+}
+
+#mocha-report.fail .test.pass {
+ display: none;
+}
+
+#mocha-report.pending .test.pass,
+#mocha-report.pending .test.fail {
+ display: none;
+}
+#mocha-report.pending .test.pass.pending {
+ display: block;
+}
+
+#mocha-error {
+ color: #c00;
+ font-size: 1.5em;
+ font-weight: 100;
+ letter-spacing: 1px;
+}
+
+#mocha-stats {
+ position: fixed;
+ top: 15px;
+ right: 10px;
+ font-size: 12px;
+ margin: 0;
+ color: #888;
+ z-index: 1;
+}
+
+#mocha-stats .progress {
+ float: right;
+ padding-top: 0;
+
+ /**
+ * Set safe initial values, so mochas .progress does not inherit these
+ * properties from Bootstrap .progress (which causes .progress height to
+ * equal line height set in Bootstrap).
+ */
+ height: auto;
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+ background-color: initial;
+}
+
+#mocha-stats em {
+ color: black;
+}
+
+#mocha-stats a {
+ text-decoration: none;
+ color: inherit;
+}
+
+#mocha-stats a:hover {
+ border-bottom: 1px solid #eee;
+}
+
+#mocha-stats li {
+ display: inline-block;
+ margin: 0 5px;
+ list-style: none;
+ padding-top: 11px;
+}
+
+#mocha-stats canvas {
+ width: 40px;
+ height: 40px;
+}
+
+#mocha code .comment { color: #ddd; }
+#mocha code .init { color: #2f6fad; }
+#mocha code .string { color: #5890ad; }
+#mocha code .keyword { color: #8a6343; }
+#mocha code .number { color: #2f6fad; }
+
+@media screen and (max-device-width: 480px) {
+ #mocha {
+ margin: 60px 0px;
+ }
+
+ #mocha #stats {
+ position: absolute;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/mocha.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/mocha.js
new file mode 100644
index 00000000000..9a40e98a328
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/mocha/mocha.js
@@ -0,0 +1,16590 @@
+(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);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+(function (process,global){
+'use strict';
+
+/* eslint no-unused-vars: off */
+/* eslint-env commonjs */
+
+/**
+ * Shim process.stdout.
+ */
+
+process.stdout = require('browser-stdout')();
+
+var Mocha = require('./lib/mocha');
+
+/**
+ * Create a Mocha instance.
+ *
+ * @return {undefined}
+ */
+
+var mocha = new Mocha({ reporter: 'html' });
+
+/**
+ * Save timer references to avoid Sinon interfering (see GH-237).
+ */
+
+var Date = global.Date;
+var setTimeout = global.setTimeout;
+var setInterval = global.setInterval;
+var clearTimeout = global.clearTimeout;
+var clearInterval = global.clearInterval;
+
+var uncaughtExceptionHandlers = [];
+
+var originalOnerrorHandler = global.onerror;
+
+/**
+ * Remove uncaughtException listener.
+ * Revert to original onerror handler if previously defined.
+ */
+
+process.removeListener = function (e, fn) {
+ if (e === 'uncaughtException') {
+ if (originalOnerrorHandler) {
+ global.onerror = originalOnerrorHandler;
+ } else {
+ global.onerror = function () {};
+ }
+ var i = Mocha.utils.indexOf(uncaughtExceptionHandlers, fn);
+ if (i !== -1) {
+ uncaughtExceptionHandlers.splice(i, 1);
+ }
+ }
+};
+
+/**
+ * Implements uncaughtException listener.
+ */
+
+process.on = function (e, fn) {
+ if (e === 'uncaughtException') {
+ global.onerror = function (err, url, line) {
+ fn(new Error(err + ' (' + url + ':' + line + ')'));
+ return !mocha.allowUncaught;
+ };
+ uncaughtExceptionHandlers.push(fn);
+ }
+};
+
+// The BDD UI is registered by default, but no UI will be functional in the
+// browser without an explicit call to the overridden `mocha.ui` (see below).
+// Ensure that this default UI does not expose its methods to the global scope.
+mocha.suite.removeAllListeners('pre-require');
+
+var immediateQueue = [];
+var immediateTimeout;
+
+function timeslice () {
+ var immediateStart = new Date().getTime();
+ while (immediateQueue.length && (new Date().getTime() - immediateStart) < 100) {
+ immediateQueue.shift()();
+ }
+ if (immediateQueue.length) {
+ immediateTimeout = setTimeout(timeslice, 0);
+ } else {
+ immediateTimeout = null;
+ }
+}
+
+/**
+ * High-performance override of Runner.immediately.
+ */
+
+Mocha.Runner.immediately = function (callback) {
+ immediateQueue.push(callback);
+ if (!immediateTimeout) {
+ immediateTimeout = setTimeout(timeslice, 0);
+ }
+};
+
+/**
+ * Function to allow assertion libraries to throw errors directly into mocha.
+ * This is useful when running tests in a browser because window.onerror will
+ * only receive the 'message' attribute of the Error.
+ */
+mocha.throwError = function (err) {
+ Mocha.utils.forEach(uncaughtExceptionHandlers, function (fn) {
+ fn(err);
+ });
+ throw err;
+};
+
+/**
+ * Override ui to ensure that the ui functions are initialized.
+ * Normally this would happen in Mocha.prototype.loadFiles.
+ */
+
+mocha.ui = function (ui) {
+ Mocha.prototype.ui.call(this, ui);
+ this.suite.emit('pre-require', global, null, this);
+ return this;
+};
+
+/**
+ * Setup mocha with the given setting options.
+ */
+
+mocha.setup = function (opts) {
+ if (typeof opts === 'string') {
+ opts = { ui: opts };
+ }
+ for (var opt in opts) {
+ if (opts.hasOwnProperty(opt)) {
+ this[opt](opts[opt]);
+ }
+ }
+ return this;
+};
+
+/**
+ * Run mocha, returning the Runner.
+ */
+
+mocha.run = function (fn) {
+ var options = mocha.options;
+ mocha.globals('location');
+
+ var query = Mocha.utils.parseQuery(global.location.search || '');
+ if (query.grep) {
+ mocha.grep(query.grep);
+ }
+ if (query.fgrep) {
+ mocha.fgrep(query.fgrep);
+ }
+ if (query.invert) {
+ mocha.invert();
+ }
+
+ return Mocha.prototype.run.call(mocha, function (err) {
+ // The DOM Document is not available in Web Workers.
+ var document = global.document;
+ if (document && document.getElementById('mocha') && options.noHighlighting !== true) {
+ Mocha.utils.highlightTags('code');
+ }
+ if (fn) {
+ fn(err);
+ }
+ });
+};
+
+/**
+ * Expose the process shim.
+ * https://github.com/mochajs/mocha/pull/916
+ */
+
+Mocha.process = process;
+
+/**
+ * Expose mocha.
+ */
+
+global.Mocha = Mocha;
+global.mocha = mocha;
+
+// this allows test/acceptance/required-tokens.js to pass; thus,
+// you can now do `const describe = require('mocha').describe` in a
+// browser context (assuming browserification). should fix #880
+module.exports = global;
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./lib/mocha":14,"_process":82,"browser-stdout":41}],2:[function(require,module,exports){
+'use strict';
+
+function noop () {}
+
+module.exports = function () {
+ return noop;
+};
+
+},{}],3:[function(require,module,exports){
+'use strict';
+
+/**
+ * Module exports.
+ */
+
+exports.EventEmitter = EventEmitter;
+
+/**
+ * Object#toString reference.
+ */
+var objToString = Object.prototype.toString;
+
+/**
+ * Check if a value is an array.
+ *
+ * @api private
+ * @param {*} val The value to test.
+ * @return {boolean} true if the value is an array, otherwise false.
+ */
+function isArray (val) {
+ return objToString.call(val) === '[object Array]';
+}
+
+/**
+ * Event emitter constructor.
+ *
+ * @api public
+ */
+function EventEmitter () {}
+
+/**
+ * Add a listener.
+ *
+ * @api public
+ * @param {string} name Event name.
+ * @param {Function} fn Event handler.
+ * @return {EventEmitter} Emitter instance.
+ */
+EventEmitter.prototype.on = function (name, fn) {
+ if (!this.$events) {
+ this.$events = {};
+ }
+
+ if (!this.$events[name]) {
+ this.$events[name] = fn;
+ } else if (isArray(this.$events[name])) {
+ this.$events[name].push(fn);
+ } else {
+ this.$events[name] = [this.$events[name], fn];
+ }
+
+ return this;
+};
+
+EventEmitter.prototype.addListener = EventEmitter.prototype.on;
+
+/**
+ * Adds a volatile listener.
+ *
+ * @api public
+ * @param {string} name Event name.
+ * @param {Function} fn Event handler.
+ * @return {EventEmitter} Emitter instance.
+ */
+EventEmitter.prototype.once = function (name, fn) {
+ var self = this;
+
+ function on () {
+ self.removeListener(name, on);
+ fn.apply(this, arguments);
+ }
+
+ on.listener = fn;
+ this.on(name, on);
+
+ return this;
+};
+
+/**
+ * Remove a listener.
+ *
+ * @api public
+ * @param {string} name Event name.
+ * @param {Function} fn Event handler.
+ * @return {EventEmitter} Emitter instance.
+ */
+EventEmitter.prototype.removeListener = function (name, fn) {
+ if (this.$events && this.$events[name]) {
+ var list = this.$events[name];
+
+ if (isArray(list)) {
+ var pos = -1;
+
+ for (var i = 0, l = list.length; i < l; i++) {
+ if (list[i] === fn || (list[i].listener && list[i].listener === fn)) {
+ pos = i;
+ break;
+ }
+ }
+
+ if (pos < 0) {
+ return this;
+ }
+
+ list.splice(pos, 1);
+
+ if (!list.length) {
+ delete this.$events[name];
+ }
+ } else if (list === fn || (list.listener && list.listener === fn)) {
+ delete this.$events[name];
+ }
+ }
+
+ return this;
+};
+
+/**
+ * Remove all listeners for an event.
+ *
+ * @api public
+ * @param {string} name Event name.
+ * @return {EventEmitter} Emitter instance.
+ */
+EventEmitter.prototype.removeAllListeners = function (name) {
+ if (name === undefined) {
+ this.$events = {};
+ return this;
+ }
+
+ if (this.$events && this.$events[name]) {
+ this.$events[name] = null;
+ }
+
+ return this;
+};
+
+/**
+ * Get all listeners for a given event.
+ *
+ * @api public
+ * @param {string} name Event name.
+ * @return {EventEmitter} Emitter instance.
+ */
+EventEmitter.prototype.listeners = function (name) {
+ if (!this.$events) {
+ this.$events = {};
+ }
+
+ if (!this.$events[name]) {
+ this.$events[name] = [];
+ }
+
+ if (!isArray(this.$events[name])) {
+ this.$events[name] = [this.$events[name]];
+ }
+
+ return this.$events[name];
+};
+
+/**
+ * Emit an event.
+ *
+ * @api public
+ * @param {string} name Event name.
+ * @return {boolean} true if at least one handler was invoked, else false.
+ */
+EventEmitter.prototype.emit = function (name) {
+ if (!this.$events) {
+ return false;
+ }
+
+ var handler = this.$events[name];
+
+ if (!handler) {
+ return false;
+ }
+
+ var args = Array.prototype.slice.call(arguments, 1);
+
+ if (typeof handler === 'function') {
+ handler.apply(this, args);
+ } else if (isArray(handler)) {
+ var listeners = handler.slice();
+
+ for (var i = 0, l = listeners.length; i < l; i++) {
+ listeners[i].apply(this, args);
+ }
+ } else {
+ return false;
+ }
+
+ return true;
+};
+
+},{}],4:[function(require,module,exports){
+'use strict';
+
+/**
+ * Expose `Progress`.
+ */
+
+module.exports = Progress;
+
+/**
+ * Initialize a new `Progress` indicator.
+ */
+function Progress () {
+ this.percent = 0;
+ this.size(0);
+ this.fontSize(11);
+ this.font('helvetica, arial, sans-serif');
+}
+
+/**
+ * Set progress size to `size`.
+ *
+ * @api public
+ * @param {number} size
+ * @return {Progress} Progress instance.
+ */
+Progress.prototype.size = function (size) {
+ this._size = size;
+ return this;
+};
+
+/**
+ * Set text to `text`.
+ *
+ * @api public
+ * @param {string} text
+ * @return {Progress} Progress instance.
+ */
+Progress.prototype.text = function (text) {
+ this._text = text;
+ return this;
+};
+
+/**
+ * Set font size to `size`.
+ *
+ * @api public
+ * @param {number} size
+ * @return {Progress} Progress instance.
+ */
+Progress.prototype.fontSize = function (size) {
+ this._fontSize = size;
+ return this;
+};
+
+/**
+ * Set font to `family`.
+ *
+ * @param {string} family
+ * @return {Progress} Progress instance.
+ */
+Progress.prototype.font = function (family) {
+ this._font = family;
+ return this;
+};
+
+/**
+ * Update percentage to `n`.
+ *
+ * @param {number} n
+ * @return {Progress} Progress instance.
+ */
+Progress.prototype.update = function (n) {
+ this.percent = n;
+ return this;
+};
+
+/**
+ * Draw on `ctx`.
+ *
+ * @param {CanvasRenderingContext2d} ctx
+ * @return {Progress} Progress instance.
+ */
+Progress.prototype.draw = function (ctx) {
+ try {
+ var percent = Math.min(this.percent, 100);
+ var size = this._size;
+ var half = size / 2;
+ var x = half;
+ var y = half;
+ var rad = half - 1;
+ var fontSize = this._fontSize;
+
+ ctx.font = fontSize + 'px ' + this._font;
+
+ var angle = Math.PI * 2 * (percent / 100);
+ ctx.clearRect(0, 0, size, size);
+
+ // outer circle
+ ctx.strokeStyle = '#9f9f9f';
+ ctx.beginPath();
+ ctx.arc(x, y, rad, 0, angle, false);
+ ctx.stroke();
+
+ // inner circle
+ ctx.strokeStyle = '#eee';
+ ctx.beginPath();
+ ctx.arc(x, y, rad - 1, 0, angle, true);
+ ctx.stroke();
+
+ // text
+ var text = this._text || (percent | 0) + '%';
+ var w = ctx.measureText(text).width;
+
+ ctx.fillText(text, x - w / 2 + 1, y + fontSize / 2 - 1);
+ } catch (err) {
+ // don't fail if we can't render progress
+ }
+ return this;
+};
+
+},{}],5:[function(require,module,exports){
+(function (global){
+'use strict';
+
+exports.isatty = function isatty () {
+ return true;
+};
+
+exports.getWindowSize = function getWindowSize () {
+ if ('innerHeight' in global) {
+ return [global.innerHeight, global.innerWidth];
+ }
+ // In a Web Worker, the DOM Window is not available.
+ return [640, 480];
+};
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],6:[function(require,module,exports){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var JSON = require('json3');
+
+/**
+ * Expose `Context`.
+ */
+
+module.exports = Context;
+
+/**
+ * Initialize a new `Context`.
+ *
+ * @api private
+ */
+function Context () {}
+
+/**
+ * Set or get the context `Runnable` to `runnable`.
+ *
+ * @api private
+ * @param {Runnable} runnable
+ * @return {Context}
+ */
+Context.prototype.runnable = function (runnable) {
+ if (!arguments.length) {
+ return this._runnable;
+ }
+ this.test = this._runnable = runnable;
+ return this;
+};
+
+/**
+ * Set test timeout `ms`.
+ *
+ * @api private
+ * @param {number} ms
+ * @return {Context} self
+ */
+Context.prototype.timeout = function (ms) {
+ if (!arguments.length) {
+ return this.runnable().timeout();
+ }
+ this.runnable().timeout(ms);
+ return this;
+};
+
+/**
+ * Set test timeout `enabled`.
+ *
+ * @api private
+ * @param {boolean} enabled
+ * @return {Context} self
+ */
+Context.prototype.enableTimeouts = function (enabled) {
+ this.runnable().enableTimeouts(enabled);
+ return this;
+};
+
+/**
+ * Set test slowness threshold `ms`.
+ *
+ * @api private
+ * @param {number} ms
+ * @return {Context} self
+ */
+Context.prototype.slow = function (ms) {
+ this.runnable().slow(ms);
+ return this;
+};
+
+/**
+ * Mark a test as skipped.
+ *
+ * @api private
+ * @return {Context} self
+ */
+Context.prototype.skip = function () {
+ this.runnable().skip();
+ return this;
+};
+
+/**
+ * Allow a number of retries on failed tests
+ *
+ * @api private
+ * @param {number} n
+ * @return {Context} self
+ */
+Context.prototype.retries = function (n) {
+ if (!arguments.length) {
+ return this.runnable().retries();
+ }
+ this.runnable().retries(n);
+ return this;
+};
+
+/**
+ * Inspect the context void of `._runnable`.
+ *
+ * @api private
+ * @return {string}
+ */
+Context.prototype.inspect = function () {
+ return JSON.stringify(this, function (key, val) {
+ return key === 'runnable' || key === 'test' ? undefined : val;
+ }, 2);
+};
+
+},{"json3":69}],7:[function(require,module,exports){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var Runnable = require('./runnable');
+var inherits = require('./utils').inherits;
+
+/**
+ * Expose `Hook`.
+ */
+
+module.exports = Hook;
+
+/**
+ * Initialize a new `Hook` with the given `title` and callback `fn`.
+ *
+ * @param {String} title
+ * @param {Function} fn
+ * @api private
+ */
+function Hook (title, fn) {
+ Runnable.call(this, title, fn);
+ this.type = 'hook';
+}
+
+/**
+ * Inherit from `Runnable.prototype`.
+ */
+inherits(Hook, Runnable);
+
+/**
+ * Get or set the test `err`.
+ *
+ * @param {Error} err
+ * @return {Error}
+ * @api public
+ */
+Hook.prototype.error = function (err) {
+ if (!arguments.length) {
+ err = this._error;
+ this._error = null;
+ return err;
+ }
+
+ this._error = err;
+};
+
+},{"./runnable":33,"./utils":38}],8:[function(require,module,exports){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var Test = require('../test');
+
+/**
+ * BDD-style interface:
+ *
+ * describe('Array', function() {
+ * describe('#indexOf()', function() {
+ * it('should return -1 when not present', function() {
+ * // ...
+ * });
+ *
+ * it('should return the index when present', function() {
+ * // ...
+ * });
+ * });
+ * });
+ *
+ * @param {Suite} suite Root suite.
+ */
+module.exports = function (suite) {
+ var suites = [suite];
+
+ suite.on('pre-require', function (context, file, mocha) {
+ var common = require('./common')(suites, context, mocha);
+
+ context.before = common.before;
+ context.after = common.after;
+ context.beforeEach = common.beforeEach;
+ context.afterEach = common.afterEach;
+ context.run = mocha.options.delay && common.runWithSuite(suite);
+ /**
+ * Describe a "suite" with the given `title`
+ * and callback `fn` containing nested suites
+ * and/or tests.
+ */
+
+ context.describe = context.context = function (title, fn) {
+ return common.suite.create({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+
+ /**
+ * Pending describe.
+ */
+
+ context.xdescribe = context.xcontext = context.describe.skip = function (title, fn) {
+ return common.suite.skip({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+
+ /**
+ * Exclusive suite.
+ */
+
+ context.describe.only = function (title, fn) {
+ return common.suite.only({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+
+ /**
+ * Describe a specification or test-case
+ * with the given `title` and callback `fn`
+ * acting as a thunk.
+ */
+
+ context.it = context.specify = function (title, fn) {
+ var suite = suites[0];
+ if (suite.isPending()) {
+ fn = null;
+ }
+ var test = new Test(title, fn);
+ test.file = file;
+ suite.addTest(test);
+ return test;
+ };
+
+ /**
+ * Exclusive test-case.
+ */
+
+ context.it.only = function (title, fn) {
+ return common.test.only(mocha, context.it(title, fn));
+ };
+
+ /**
+ * Pending test case.
+ */
+
+ context.xit = context.xspecify = context.it.skip = function (title) {
+ context.it(title);
+ };
+
+ /**
+ * Number of attempts to retry.
+ */
+ context.it.retries = function (n) {
+ context.retries(n);
+ };
+ });
+};
+
+},{"../test":36,"./common":9}],9:[function(require,module,exports){
+'use strict';
+
+var Suite = require('../suite');
+
+/**
+ * Functions common to more than one interface.
+ *
+ * @param {Suite[]} suites
+ * @param {Context} context
+ * @param {Mocha} mocha
+ * @return {Object} An object containing common functions.
+ */
+module.exports = function (suites, context, mocha) {
+ return {
+ /**
+ * This is only present if flag --delay is passed into Mocha. It triggers
+ * root suite execution.
+ *
+ * @param {Suite} suite The root suite.
+ * @return {Function} A function which runs the root suite
+ */
+ runWithSuite: function runWithSuite (suite) {
+ return function run () {
+ suite.run();
+ };
+ },
+
+ /**
+ * Execute before running tests.
+ *
+ * @param {string} name
+ * @param {Function} fn
+ */
+ before: function (name, fn) {
+ suites[0].beforeAll(name, fn);
+ },
+
+ /**
+ * Execute after running tests.
+ *
+ * @param {string} name
+ * @param {Function} fn
+ */
+ after: function (name, fn) {
+ suites[0].afterAll(name, fn);
+ },
+
+ /**
+ * Execute before each test case.
+ *
+ * @param {string} name
+ * @param {Function} fn
+ */
+ beforeEach: function (name, fn) {
+ suites[0].beforeEach(name, fn);
+ },
+
+ /**
+ * Execute after each test case.
+ *
+ * @param {string} name
+ * @param {Function} fn
+ */
+ afterEach: function (name, fn) {
+ suites[0].afterEach(name, fn);
+ },
+
+ suite: {
+ /**
+ * Create an exclusive Suite; convenience function
+ * See docstring for create() below.
+ *
+ * @param {Object} opts
+ * @returns {Suite}
+ */
+ only: function only (opts) {
+ mocha.options.hasOnly = true;
+ opts.isOnly = true;
+ return this.create(opts);
+ },
+
+ /**
+ * Create a Suite, but skip it; convenience function
+ * See docstring for create() below.
+ *
+ * @param {Object} opts
+ * @returns {Suite}
+ */
+ skip: function skip (opts) {
+ opts.pending = true;
+ return this.create(opts);
+ },
+
+ /**
+ * Creates a suite.
+ * @param {Object} opts Options
+ * @param {string} opts.title Title of Suite
+ * @param {Function} [opts.fn] Suite Function (not always applicable)
+ * @param {boolean} [opts.pending] Is Suite pending?
+ * @param {string} [opts.file] Filepath where this Suite resides
+ * @param {boolean} [opts.isOnly] Is Suite exclusive?
+ * @returns {Suite}
+ */
+ create: function create (opts) {
+ var suite = Suite.create(suites[0], opts.title);
+ suite.pending = Boolean(opts.pending);
+ suite.file = opts.file;
+ suites.unshift(suite);
+ if (opts.isOnly) {
+ suite.parent._onlySuites = suite.parent._onlySuites.concat(suite);
+ mocha.options.hasOnly = true;
+ }
+ if (typeof opts.fn === 'function') {
+ opts.fn.call(suite);
+ suites.shift();
+ } else if (typeof opts.fn === 'undefined' && !suite.pending) {
+ throw new Error('Suite "' + suite.fullTitle() + '" was defined but no callback was supplied. Supply a callback or explicitly skip the suite.');
+ }
+
+ return suite;
+ }
+ },
+
+ test: {
+
+ /**
+ * Exclusive test-case.
+ *
+ * @param {Object} mocha
+ * @param {Function} test
+ * @returns {*}
+ */
+ only: function (mocha, test) {
+ test.parent._onlyTests = test.parent._onlyTests.concat(test);
+ mocha.options.hasOnly = true;
+ return test;
+ },
+
+ /**
+ * Pending test case.
+ *
+ * @param {string} title
+ */
+ skip: function (title) {
+ context.test(title);
+ },
+
+ /**
+ * Number of retry attempts
+ *
+ * @param {number} n
+ */
+ retries: function (n) {
+ context.retries(n);
+ }
+ }
+ };
+};
+
+},{"../suite":35}],10:[function(require,module,exports){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var Suite = require('../suite');
+var Test = require('../test');
+
+/**
+ * Exports-style (as Node.js module) interface:
+ *
+ * exports.Array = {
+ * '#indexOf()': {
+ * 'should return -1 when the value is not present': function() {
+ *
+ * },
+ *
+ * 'should return the correct index when the value is present': function() {
+ *
+ * }
+ * }
+ * };
+ *
+ * @param {Suite} suite Root suite.
+ */
+module.exports = function (suite) {
+ var suites = [suite];
+
+ suite.on('require', visit);
+
+ function visit (obj, file) {
+ var suite;
+ for (var key in obj) {
+ if (typeof obj[key] === 'function') {
+ var fn = obj[key];
+ switch (key) {
+ case 'before':
+ suites[0].beforeAll(fn);
+ break;
+ case 'after':
+ suites[0].afterAll(fn);
+ break;
+ case 'beforeEach':
+ suites[0].beforeEach(fn);
+ break;
+ case 'afterEach':
+ suites[0].afterEach(fn);
+ break;
+ default:
+ var test = new Test(key, fn);
+ test.file = file;
+ suites[0].addTest(test);
+ }
+ } else {
+ suite = Suite.create(suites[0], key);
+ suites.unshift(suite);
+ visit(obj[key], file);
+ suites.shift();
+ }
+ }
+ }
+};
+
+},{"../suite":35,"../test":36}],11:[function(require,module,exports){
+'use strict';
+
+exports.bdd = require('./bdd');
+exports.tdd = require('./tdd');
+exports.qunit = require('./qunit');
+exports.exports = require('./exports');
+
+},{"./bdd":8,"./exports":10,"./qunit":12,"./tdd":13}],12:[function(require,module,exports){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var Test = require('../test');
+
+/**
+ * QUnit-style interface:
+ *
+ * suite('Array');
+ *
+ * test('#length', function() {
+ * var arr = [1,2,3];
+ * ok(arr.length == 3);
+ * });
+ *
+ * test('#indexOf()', function() {
+ * var arr = [1,2,3];
+ * ok(arr.indexOf(1) == 0);
+ * ok(arr.indexOf(2) == 1);
+ * ok(arr.indexOf(3) == 2);
+ * });
+ *
+ * suite('String');
+ *
+ * test('#length', function() {
+ * ok('foo'.length == 3);
+ * });
+ *
+ * @param {Suite} suite Root suite.
+ */
+module.exports = function (suite) {
+ var suites = [suite];
+
+ suite.on('pre-require', function (context, file, mocha) {
+ var common = require('./common')(suites, context, mocha);
+
+ context.before = common.before;
+ context.after = common.after;
+ context.beforeEach = common.beforeEach;
+ context.afterEach = common.afterEach;
+ context.run = mocha.options.delay && common.runWithSuite(suite);
+ /**
+ * Describe a "suite" with the given `title`.
+ */
+
+ context.suite = function (title) {
+ if (suites.length > 1) {
+ suites.shift();
+ }
+ return common.suite.create({
+ title: title,
+ file: file,
+ fn: false
+ });
+ };
+
+ /**
+ * Exclusive Suite.
+ */
+
+ context.suite.only = function (title) {
+ if (suites.length > 1) {
+ suites.shift();
+ }
+ return common.suite.only({
+ title: title,
+ file: file,
+ fn: false
+ });
+ };
+
+ /**
+ * Describe a specification or test-case
+ * with the given `title` and callback `fn`
+ * acting as a thunk.
+ */
+
+ context.test = function (title, fn) {
+ var test = new Test(title, fn);
+ test.file = file;
+ suites[0].addTest(test);
+ return test;
+ };
+
+ /**
+ * Exclusive test-case.
+ */
+
+ context.test.only = function (title, fn) {
+ return common.test.only(mocha, context.test(title, fn));
+ };
+
+ context.test.skip = common.test.skip;
+ context.test.retries = common.test.retries;
+ });
+};
+
+},{"../test":36,"./common":9}],13:[function(require,module,exports){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var Test = require('../test');
+
+/**
+ * TDD-style interface:
+ *
+ * suite('Array', function() {
+ * suite('#indexOf()', function() {
+ * suiteSetup(function() {
+ *
+ * });
+ *
+ * test('should return -1 when not present', function() {
+ *
+ * });
+ *
+ * test('should return the index when present', function() {
+ *
+ * });
+ *
+ * suiteTeardown(function() {
+ *
+ * });
+ * });
+ * });
+ *
+ * @param {Suite} suite Root suite.
+ */
+module.exports = function (suite) {
+ var suites = [suite];
+
+ suite.on('pre-require', function (context, file, mocha) {
+ var common = require('./common')(suites, context, mocha);
+
+ context.setup = common.beforeEach;
+ context.teardown = common.afterEach;
+ context.suiteSetup = common.before;
+ context.suiteTeardown = common.after;
+ context.run = mocha.options.delay && common.runWithSuite(suite);
+
+ /**
+ * Describe a "suite" with the given `title` and callback `fn` containing
+ * nested suites and/or tests.
+ */
+ context.suite = function (title, fn) {
+ return common.suite.create({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+
+ /**
+ * Pending suite.
+ */
+ context.suite.skip = function (title, fn) {
+ return common.suite.skip({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+
+ /**
+ * Exclusive test-case.
+ */
+ context.suite.only = function (title, fn) {
+ return common.suite.only({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+
+ /**
+ * Describe a specification or test-case with the given `title` and
+ * callback `fn` acting as a thunk.
+ */
+ context.test = function (title, fn) {
+ var suite = suites[0];
+ if (suite.isPending()) {
+ fn = null;
+ }
+ var test = new Test(title, fn);
+ test.file = file;
+ suite.addTest(test);
+ return test;
+ };
+
+ /**
+ * Exclusive test-case.
+ */
+
+ context.test.only = function (title, fn) {
+ return common.test.only(mocha, context.test(title, fn));
+ };
+
+ context.test.skip = common.test.skip;
+ context.test.retries = common.test.retries;
+ });
+};
+
+},{"../test":36,"./common":9}],14:[function(require,module,exports){
+(function (process,global,__dirname){
+'use strict';
+
+/*!
+ * mocha
+ * Copyright(c) 2011 TJ Holowaychuk <tj@vision-media.ca>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var escapeRe = require('escape-string-regexp');
+var path = require('path');
+var reporters = require('./reporters');
+var utils = require('./utils');
+
+/**
+ * Expose `Mocha`.
+ */
+
+exports = module.exports = Mocha;
+
+/**
+ * To require local UIs and reporters when running in node.
+ */
+
+if (!process.browser) {
+ var cwd = process.cwd();
+ module.paths.push(cwd, path.join(cwd, 'node_modules'));
+}
+
+/**
+ * Expose internals.
+ */
+
+exports.utils = utils;
+exports.interfaces = require('./interfaces');
+exports.reporters = reporters;
+exports.Runnable = require('./runnable');
+exports.Context = require('./context');
+exports.Runner = require('./runner');
+exports.Suite = require('./suite');
+exports.Hook = require('./hook');
+exports.Test = require('./test');
+
+/**
+ * Return image `name` path.
+ *
+ * @api private
+ * @param {string} name
+ * @return {string}
+ */
+function image (name) {
+ return path.join(__dirname, '../images', name + '.png');
+}
+
+/**
+ * Set up mocha with `options`.
+ *
+ * Options:
+ *
+ * - `ui` name "bdd", "tdd", "exports" etc
+ * - `reporter` reporter instance, defaults to `mocha.reporters.spec`
+ * - `globals` array of accepted globals
+ * - `timeout` timeout in milliseconds
+ * - `retries` number of times to retry failed tests
+ * - `bail` bail on the first test failure
+ * - `slow` milliseconds to wait before considering a test slow
+ * - `ignoreLeaks` ignore global leaks
+ * - `fullTrace` display the full stack-trace on failing
+ * - `grep` string or regexp to filter tests with
+ *
+ * @param {Object} options
+ * @api public
+ */
+function Mocha (options) {
+ options = options || {};
+ this.files = [];
+ this.options = options;
+ if (options.grep) {
+ this.grep(new RegExp(options.grep));
+ }
+ if (options.fgrep) {
+ this.fgrep(options.fgrep);
+ }
+ this.suite = new exports.Suite('', new exports.Context());
+ this.ui(options.ui);
+ this.bail(options.bail);
+ this.reporter(options.reporter, options.reporterOptions);
+ if (typeof options.timeout !== 'undefined' && options.timeout !== null) {
+ this.timeout(options.timeout);
+ }
+ if (typeof options.retries !== 'undefined' && options.retries !== null) {
+ this.retries(options.retries);
+ }
+ this.useColors(options.useColors);
+ if (options.enableTimeouts !== null) {
+ this.enableTimeouts(options.enableTimeouts);
+ }
+ if (options.slow) {
+ this.slow(options.slow);
+ }
+}
+
+/**
+ * Enable or disable bailing on the first failure.
+ *
+ * @api public
+ * @param {boolean} [bail]
+ */
+Mocha.prototype.bail = function (bail) {
+ if (!arguments.length) {
+ bail = true;
+ }
+ this.suite.bail(bail);
+ return this;
+};
+
+/**
+ * Add test `file`.
+ *
+ * @api public
+ * @param {string} file
+ */
+Mocha.prototype.addFile = function (file) {
+ this.files.push(file);
+ return this;
+};
+
+/**
+ * Set reporter to `reporter`, defaults to "spec".
+ *
+ * @param {String|Function} reporter name or constructor
+ * @param {Object} reporterOptions optional options
+ * @api public
+ * @param {string|Function} reporter name or constructor
+ * @param {Object} reporterOptions optional options
+ */
+Mocha.prototype.reporter = function (reporter, reporterOptions) {
+ if (typeof reporter === 'function') {
+ this._reporter = reporter;
+ } else {
+ reporter = reporter || 'spec';
+ var _reporter;
+ // Try to load a built-in reporter.
+ if (reporters[reporter]) {
+ _reporter = reporters[reporter];
+ }
+ // Try to load reporters from process.cwd() and node_modules
+ if (!_reporter) {
+ try {
+ _reporter = require(reporter);
+ } catch (err) {
+ if (err.message.indexOf('Cannot find module') !== -1) {
+ // Try to load reporters from a path (absolute or relative)
+ try {
+ _reporter = require(path.resolve(process.cwd(), reporter));
+ } catch (_err) {
+ err.message.indexOf('Cannot find module') !== -1 ? console.warn('"' + reporter + '" reporter not found')
+ : console.warn('"' + reporter + '" reporter blew up with error:\n' + err.stack);
+ }
+ } else {
+ console.warn('"' + reporter + '" reporter blew up with error:\n' + err.stack);
+ }
+ }
+ }
+ if (!_reporter && reporter === 'teamcity') {
+ console.warn('The Teamcity reporter was moved to a package named ' +
+ 'mocha-teamcity-reporter ' +
+ '(https://npmjs.org/package/mocha-teamcity-reporter).');
+ }
+ if (!_reporter) {
+ throw new Error('invalid reporter "' + reporter + '"');
+ }
+ this._reporter = _reporter;
+ }
+ this.options.reporterOptions = reporterOptions;
+ return this;
+};
+
+/**
+ * Set test UI `name`, defaults to "bdd".
+ *
+ * @api public
+ * @param {string} bdd
+ */
+Mocha.prototype.ui = function (name) {
+ name = name || 'bdd';
+ this._ui = exports.interfaces[name];
+ if (!this._ui) {
+ try {
+ this._ui = require(name);
+ } catch (err) {
+ throw new Error('invalid interface "' + name + '"');
+ }
+ }
+ this._ui = this._ui(this.suite);
+
+ this.suite.on('pre-require', function (context) {
+ exports.afterEach = context.afterEach || context.teardown;
+ exports.after = context.after || context.suiteTeardown;
+ exports.beforeEach = context.beforeEach || context.setup;
+ exports.before = context.before || context.suiteSetup;
+ exports.describe = context.describe || context.suite;
+ exports.it = context.it || context.test;
+ exports.xit = context.xit || context.test.skip;
+ exports.setup = context.setup || context.beforeEach;
+ exports.suiteSetup = context.suiteSetup || context.before;
+ exports.suiteTeardown = context.suiteTeardown || context.after;
+ exports.suite = context.suite || context.describe;
+ exports.teardown = context.teardown || context.afterEach;
+ exports.test = context.test || context.it;
+ exports.run = context.run;
+ });
+
+ return this;
+};
+
+/**
+ * Load registered files.
+ *
+ * @api private
+ */
+Mocha.prototype.loadFiles = function (fn) {
+ var self = this;
+ var suite = this.suite;
+ this.files.forEach(function (file) {
+ file = path.resolve(file);
+ suite.emit('pre-require', global, file, self);
+ suite.emit('require', require(file), file, self);
+ suite.emit('post-require', global, file, self);
+ });
+ fn && fn();
+};
+
+/**
+ * Enable growl support.
+ *
+ * @api private
+ */
+Mocha.prototype._growl = function (runner, reporter) {
+ var notify = require('growl');
+
+ runner.on('end', function () {
+ var stats = reporter.stats;
+ if (stats.failures) {
+ var msg = stats.failures + ' of ' + runner.total + ' tests failed';
+ notify(msg, { name: 'mocha', title: 'Failed', image: image('error') });
+ } else {
+ notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', {
+ name: 'mocha',
+ title: 'Passed',
+ image: image('ok')
+ });
+ }
+ });
+};
+
+/**
+ * Escape string and add it to grep as a regexp.
+ *
+ * @api public
+ * @param str
+ * @returns {Mocha}
+ */
+Mocha.prototype.fgrep = function (str) {
+ return this.grep(new RegExp(escapeRe(str)));
+};
+
+/**
+ * Add regexp to grep, if `re` is a string it is escaped.
+ *
+ * @param {RegExp|String} re
+ * @return {Mocha}
+ * @api public
+ * @param {RegExp|string} re
+ * @return {Mocha}
+ */
+Mocha.prototype.grep = function (re) {
+ if (utils.isString(re)) {
+ // extract args if it's regex-like, i.e: [string, pattern, flag]
+ var arg = re.match(/^\/(.*)\/(g|i|)$|.*/);
+ this.options.grep = new RegExp(arg[1] || arg[0], arg[2]);
+ } else {
+ this.options.grep = re;
+ }
+ return this;
+};
+/**
+ * Invert `.grep()` matches.
+ *
+ * @return {Mocha}
+ * @api public
+ */
+Mocha.prototype.invert = function () {
+ this.options.invert = true;
+ return this;
+};
+
+/**
+ * Ignore global leaks.
+ *
+ * @param {Boolean} ignore
+ * @return {Mocha}
+ * @api public
+ * @param {boolean} ignore
+ * @return {Mocha}
+ */
+Mocha.prototype.ignoreLeaks = function (ignore) {
+ this.options.ignoreLeaks = Boolean(ignore);
+ return this;
+};
+
+/**
+ * Enable global leak checking.
+ *
+ * @return {Mocha}
+ * @api public
+ */
+Mocha.prototype.checkLeaks = function () {
+ this.options.ignoreLeaks = false;
+ return this;
+};
+
+/**
+ * Display long stack-trace on failing
+ *
+ * @return {Mocha}
+ * @api public
+ */
+Mocha.prototype.fullTrace = function () {
+ this.options.fullStackTrace = true;
+ return this;
+};
+
+/**
+ * Enable growl support.
+ *
+ * @return {Mocha}
+ * @api public
+ */
+Mocha.prototype.growl = function () {
+ this.options.growl = true;
+ return this;
+};
+
+/**
+ * Ignore `globals` array or string.
+ *
+ * @param {Array|String} globals
+ * @return {Mocha}
+ * @api public
+ * @param {Array|string} globals
+ * @return {Mocha}
+ */
+Mocha.prototype.globals = function (globals) {
+ this.options.globals = (this.options.globals || []).concat(globals);
+ return this;
+};
+
+/**
+ * Emit color output.
+ *
+ * @param {Boolean} colors
+ * @return {Mocha}
+ * @api public
+ * @param {boolean} colors
+ * @return {Mocha}
+ */
+Mocha.prototype.useColors = function (colors) {
+ if (colors !== undefined) {
+ this.options.useColors = colors;
+ }
+ return this;
+};
+
+/**
+ * Use inline diffs rather than +/-.
+ *
+ * @param {Boolean} inlineDiffs
+ * @return {Mocha}
+ * @api public
+ * @param {boolean} inlineDiffs
+ * @return {Mocha}
+ */
+Mocha.prototype.useInlineDiffs = function (inlineDiffs) {
+ this.options.useInlineDiffs = inlineDiffs !== undefined && inlineDiffs;
+ return this;
+};
+
+/**
+ * Set the timeout in milliseconds.
+ *
+ * @param {Number} timeout
+ * @return {Mocha}
+ * @api public
+ * @param {number} timeout
+ * @return {Mocha}
+ */
+Mocha.prototype.timeout = function (timeout) {
+ this.suite.timeout(timeout);
+ return this;
+};
+
+/**
+ * Set the number of times to retry failed tests.
+ *
+ * @param {Number} retry times
+ * @return {Mocha}
+ * @api public
+ */
+Mocha.prototype.retries = function (n) {
+ this.suite.retries(n);
+ return this;
+};
+
+/**
+ * Set slowness threshold in milliseconds.
+ *
+ * @param {Number} slow
+ * @return {Mocha}
+ * @api public
+ * @param {number} slow
+ * @return {Mocha}
+ */
+Mocha.prototype.slow = function (slow) {
+ this.suite.slow(slow);
+ return this;
+};
+
+/**
+ * Enable timeouts.
+ *
+ * @param {Boolean} enabled
+ * @return {Mocha}
+ * @api public
+ * @param {boolean} enabled
+ * @return {Mocha}
+ */
+Mocha.prototype.enableTimeouts = function (enabled) {
+ this.suite.enableTimeouts(arguments.length && enabled !== undefined ? enabled : true);
+ return this;
+};
+
+/**
+ * Makes all tests async (accepting a callback)
+ *
+ * @return {Mocha}
+ * @api public
+ */
+Mocha.prototype.asyncOnly = function () {
+ this.options.asyncOnly = true;
+ return this;
+};
+
+/**
+ * Disable syntax highlighting (in browser).
+ *
+ * @api public
+ */
+Mocha.prototype.noHighlighting = function () {
+ this.options.noHighlighting = true;
+ return this;
+};
+
+/**
+ * Enable uncaught errors to propagate (in browser).
+ *
+ * @return {Mocha}
+ * @api public
+ */
+Mocha.prototype.allowUncaught = function () {
+ this.options.allowUncaught = true;
+ return this;
+};
+
+/**
+ * Delay root suite execution.
+ * @returns {Mocha}
+ */
+Mocha.prototype.delay = function delay () {
+ this.options.delay = true;
+ return this;
+};
+
+/**
+ * Tests marked only fail the suite
+ * @returns {Mocha}
+ */
+Mocha.prototype.forbidOnly = function () {
+ this.options.forbidOnly = true;
+ return this;
+};
+
+/**
+ * Pending tests and tests marked skip fail the suite
+ * @returns {Mocha}
+ */
+Mocha.prototype.forbidPending = function () {
+ this.options.forbidPending = true;
+ return this;
+};
+
+/**
+ * Run tests and invoke `fn()` when complete.
+ *
+ * @api public
+ * @param {Function} fn
+ * @return {Runner}
+ */
+Mocha.prototype.run = function (fn) {
+ if (this.files.length) {
+ this.loadFiles();
+ }
+ var suite = this.suite;
+ var options = this.options;
+ options.files = this.files;
+ var runner = new exports.Runner(suite, options.delay);
+ var reporter = new this._reporter(runner, options);
+ runner.ignoreLeaks = options.ignoreLeaks !== false;
+ runner.fullStackTrace = options.fullStackTrace;
+ runner.hasOnly = options.hasOnly;
+ runner.asyncOnly = options.asyncOnly;
+ runner.allowUncaught = options.allowUncaught;
+ runner.forbidOnly = options.forbidOnly;
+ runner.forbidPending = options.forbidPending;
+ if (options.grep) {
+ runner.grep(options.grep, options.invert);
+ }
+ if (options.globals) {
+ runner.globals(options.globals);
+ }
+ if (options.growl) {
+ this._growl(runner, reporter);
+ }
+ if (options.useColors !== undefined) {
+ exports.reporters.Base.useColors = options.useColors;
+ }
+ exports.reporters.Base.inlineDiffs = options.useInlineDiffs;
+
+ function done (failures) {
+ if (reporter.done) {
+ reporter.done(failures, fn);
+ } else {
+ fn && fn(failures);
+ }
+ }
+
+ return runner.run(done);
+};
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},"/lib")
+},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":21,"./runnable":33,"./runner":34,"./suite":35,"./test":36,"./utils":38,"_process":82,"escape-string-regexp":61,"growl":63,"path":42}],15:[function(require,module,exports){
+'use strict';
+
+/**
+ * Helpers.
+ */
+
+var s = 1000;
+var m = s * 60;
+var h = m * 60;
+var d = h * 24;
+var y = d * 365.25;
+
+/**
+ * Parse or format the given `val`.
+ *
+ * Options:
+ *
+ * - `long` verbose formatting [false]
+ *
+ * @api public
+ * @param {string|number} val
+ * @param {Object} options
+ * @return {string|number}
+ */
+module.exports = function (val, options) {
+ options = options || {};
+ if (typeof val === 'string') {
+ return parse(val);
+ }
+ // https://github.com/mochajs/mocha/pull/1035
+ return options['long'] ? longFormat(val) : shortFormat(val);
+};
+
+/**
+ * Parse the given `str` and return milliseconds.
+ *
+ * @api private
+ * @param {string} str
+ * @return {number}
+ */
+function parse (str) {
+ var match = (/^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i).exec(str);
+ if (!match) {
+ return;
+ }
+ var n = parseFloat(match[1]);
+ var type = (match[2] || 'ms').toLowerCase();
+ switch (type) {
+ case 'years':
+ case 'year':
+ case 'y':
+ return n * y;
+ case 'days':
+ case 'day':
+ case 'd':
+ return n * d;
+ case 'hours':
+ case 'hour':
+ case 'h':
+ return n * h;
+ case 'minutes':
+ case 'minute':
+ case 'm':
+ return n * m;
+ case 'seconds':
+ case 'second':
+ case 's':
+ return n * s;
+ case 'ms':
+ return n;
+ default:
+ // No default case
+ }
+}
+
+/**
+ * Short format for `ms`.
+ *
+ * @api private
+ * @param {number} ms
+ * @return {string}
+ */
+function shortFormat (ms) {
+ if (ms >= d) {
+ return Math.round(ms / d) + 'd';
+ }
+ if (ms >= h) {
+ return Math.round(ms / h) + 'h';
+ }
+ if (ms >= m) {
+ return Math.round(ms / m) + 'm';
+ }
+ if (ms >= s) {
+ return Math.round(ms / s) + 's';
+ }
+ return ms + 'ms';
+}
+
+/**
+ * Long format for `ms`.
+ *
+ * @api private
+ * @param {number} ms
+ * @return {string}
+ */
+function longFormat (ms) {
+ return plural(ms, d, 'day') ||
+ plural(ms, h, 'hour') ||
+ plural(ms, m, 'minute') ||
+ plural(ms, s, 'second') ||
+ ms + ' ms';
+}
+
+/**
+ * Pluralization helper.
+ *
+ * @api private
+ * @param {number} ms
+ * @param {number} n
+ * @param {string} name
+ */
+function plural (ms, n, name) {
+ if (ms < n) {
+ return;
+ }
+ if (ms < n * 1.5) {
+ return Math.floor(ms / n) + ' ' + name;
+ }
+ return Math.ceil(ms / n) + ' ' + name + 's';
+}
+
+},{}],16:[function(require,module,exports){
+'use strict';
+
+/**
+ * Expose `Pending`.
+ */
+
+module.exports = Pending;
+
+/**
+ * Initialize a new `Pending` error with the given message.
+ *
+ * @param {string} message
+ */
+function Pending (message) {
+ this.message = message;
+}
+
+},{}],17:[function(require,module,exports){
+(function (process,global){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var tty = require('tty');
+var diff = require('diff');
+var ms = require('../ms');
+var utils = require('../utils');
+var supportsColor = process.browser ? null : require('supports-color');
+
+/**
+ * Expose `Base`.
+ */
+
+exports = module.exports = Base;
+
+/**
+ * Save timer references to avoid Sinon interfering.
+ * See: https://github.com/mochajs/mocha/issues/237
+ */
+
+/* eslint-disable no-unused-vars, no-native-reassign */
+var Date = global.Date;
+var setTimeout = global.setTimeout;
+var setInterval = global.setInterval;
+var clearTimeout = global.clearTimeout;
+var clearInterval = global.clearInterval;
+/* eslint-enable no-unused-vars, no-native-reassign */
+
+/**
+ * Check if both stdio streams are associated with a tty.
+ */
+
+var isatty = tty.isatty(1) && tty.isatty(2);
+
+/**
+ * Enable coloring by default, except in the browser interface.
+ */
+
+exports.useColors = !process.browser && (supportsColor || (process.env.MOCHA_COLORS !== undefined));
+
+/**
+ * Inline diffs instead of +/-
+ */
+
+exports.inlineDiffs = false;
+
+/**
+ * Default color map.
+ */
+
+exports.colors = {
+ pass: 90,
+ fail: 31,
+ 'bright pass': 92,
+ 'bright fail': 91,
+ 'bright yellow': 93,
+ pending: 36,
+ suite: 0,
+ 'error title': 0,
+ 'error message': 31,
+ 'error stack': 90,
+ checkmark: 32,
+ fast: 90,
+ medium: 33,
+ slow: 31,
+ green: 32,
+ light: 90,
+ 'diff gutter': 90,
+ 'diff added': 32,
+ 'diff removed': 31
+};
+
+/**
+ * Default symbol map.
+ */
+
+exports.symbols = {
+ ok: '✓',
+ err: '✖',
+ dot: '․',
+ comma: ',',
+ bang: '!'
+};
+
+// With node.js on Windows: use symbols available in terminal default fonts
+if (process.platform === 'win32') {
+ exports.symbols.ok = '\u221A';
+ exports.symbols.err = '\u00D7';
+ exports.symbols.dot = '.';
+}
+
+/**
+ * Color `str` with the given `type`,
+ * allowing colors to be disabled,
+ * as well as user-defined color
+ * schemes.
+ *
+ * @param {string} type
+ * @param {string} str
+ * @return {string}
+ * @api private
+ */
+var color = exports.color = function (type, str) {
+ if (!exports.useColors) {
+ return String(str);
+ }
+ return '\u001b[' + exports.colors[type] + 'm' + str + '\u001b[0m';
+};
+
+/**
+ * Expose term window size, with some defaults for when stderr is not a tty.
+ */
+
+exports.window = {
+ width: 75
+};
+
+if (isatty) {
+ exports.window.width = process.stdout.getWindowSize
+ ? process.stdout.getWindowSize(1)[0]
+ : tty.getWindowSize()[1];
+}
+
+/**
+ * Expose some basic cursor interactions that are common among reporters.
+ */
+
+exports.cursor = {
+ hide: function () {
+ isatty && process.stdout.write('\u001b[?25l');
+ },
+
+ show: function () {
+ isatty && process.stdout.write('\u001b[?25h');
+ },
+
+ deleteLine: function () {
+ isatty && process.stdout.write('\u001b[2K');
+ },
+
+ beginningOfLine: function () {
+ isatty && process.stdout.write('\u001b[0G');
+ },
+
+ CR: function () {
+ if (isatty) {
+ exports.cursor.deleteLine();
+ exports.cursor.beginningOfLine();
+ } else {
+ process.stdout.write('\r');
+ }
+ }
+};
+
+/**
+ * Output the given `failures` as a list.
+ *
+ * @param {Array} failures
+ * @api public
+ */
+
+exports.list = function (failures) {
+ console.log();
+ failures.forEach(function (test, i) {
+ // format
+ var fmt = color('error title', ' %s) %s:\n') +
+ color('error message', ' %s') +
+ color('error stack', '\n%s\n');
+
+ // msg
+ var msg;
+ var err = test.err;
+ var message;
+ if (err.message && typeof err.message.toString === 'function') {
+ message = err.message + '';
+ } else if (typeof err.inspect === 'function') {
+ message = err.inspect() + '';
+ } else {
+ message = '';
+ }
+ var stack = err.stack || message;
+ var index = message ? stack.indexOf(message) : -1;
+ var actual = err.actual;
+ var expected = err.expected;
+ var escape = true;
+
+ if (index === -1) {
+ msg = message;
+ } else {
+ index += message.length;
+ msg = stack.slice(0, index);
+ // remove msg from stack
+ stack = stack.slice(index + 1);
+ }
+
+ // uncaught
+ if (err.uncaught) {
+ msg = 'Uncaught ' + msg;
+ }
+ // explicitly show diff
+ if (err.showDiff !== false && sameType(actual, expected) && expected !== undefined) {
+ escape = false;
+ if (!(utils.isString(actual) && utils.isString(expected))) {
+ err.actual = actual = utils.stringify(actual);
+ err.expected = expected = utils.stringify(expected);
+ }
+
+ fmt = color('error title', ' %s) %s:\n%s') + color('error stack', '\n%s\n');
+ var match = message.match(/^([^:]+): expected/);
+ msg = '\n ' + color('error message', match ? match[1] : msg);
+
+ if (exports.inlineDiffs) {
+ msg += inlineDiff(err, escape);
+ } else {
+ msg += unifiedDiff(err, escape);
+ }
+ }
+
+ // indent stack trace
+ stack = stack.replace(/^/gm, ' ');
+
+ console.log(fmt, (i + 1), test.fullTitle(), msg, stack);
+ });
+};
+
+/**
+ * Initialize a new `Base` reporter.
+ *
+ * All other reporters generally
+ * inherit from this reporter, providing
+ * stats such as test duration, number
+ * of tests passed / failed etc.
+ *
+ * @param {Runner} runner
+ * @api public
+ */
+
+function Base (runner) {
+ var stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 };
+ var failures = this.failures = [];
+
+ if (!runner) {
+ return;
+ }
+ this.runner = runner;
+
+ runner.stats = stats;
+
+ runner.on('start', function () {
+ stats.start = new Date();
+ });
+
+ runner.on('suite', function (suite) {
+ stats.suites = stats.suites || 0;
+ suite.root || stats.suites++;
+ });
+
+ runner.on('test end', function () {
+ stats.tests = stats.tests || 0;
+ stats.tests++;
+ });
+
+ runner.on('pass', function (test) {
+ stats.passes = stats.passes || 0;
+
+ if (test.duration > test.slow()) {
+ test.speed = 'slow';
+ } else if (test.duration > test.slow() / 2) {
+ test.speed = 'medium';
+ } else {
+ test.speed = 'fast';
+ }
+
+ stats.passes++;
+ });
+
+ runner.on('fail', function (test, err) {
+ stats.failures = stats.failures || 0;
+ stats.failures++;
+ test.err = err;
+ failures.push(test);
+ });
+
+ runner.on('end', function () {
+ stats.end = new Date();
+ stats.duration = new Date() - stats.start;
+ });
+
+ runner.on('pending', function () {
+ stats.pending++;
+ });
+}
+
+/**
+ * Output common epilogue used by many of
+ * the bundled reporters.
+ *
+ * @api public
+ */
+Base.prototype.epilogue = function () {
+ var stats = this.stats;
+ var fmt;
+
+ console.log();
+
+ // passes
+ fmt = color('bright pass', ' ') +
+ color('green', ' %d passing') +
+ color('light', ' (%s)');
+
+ console.log(fmt,
+ stats.passes || 0,
+ ms(stats.duration));
+
+ // pending
+ if (stats.pending) {
+ fmt = color('pending', ' ') +
+ color('pending', ' %d pending');
+
+ console.log(fmt, stats.pending);
+ }
+
+ // failures
+ if (stats.failures) {
+ fmt = color('fail', ' %d failing');
+
+ console.log(fmt, stats.failures);
+
+ Base.list(this.failures);
+ console.log();
+ }
+
+ console.log();
+};
+
+/**
+ * Pad the given `str` to `len`.
+ *
+ * @api private
+ * @param {string} str
+ * @param {string} len
+ * @return {string}
+ */
+function pad (str, len) {
+ str = String(str);
+ return Array(len - str.length + 1).join(' ') + str;
+}
+
+/**
+ * Returns an inline diff between 2 strings with coloured ANSI output
+ *
+ * @api private
+ * @param {Error} err with actual/expected
+ * @param {boolean} escape
+ * @return {string} Diff
+ */
+function inlineDiff (err, escape) {
+ var msg = errorDiff(err, 'WordsWithSpace', escape);
+
+ // linenos
+ var lines = msg.split('\n');
+ if (lines.length > 4) {
+ var width = String(lines.length).length;
+ msg = lines.map(function (str, i) {
+ return pad(++i, width) + ' |' + ' ' + str;
+ }).join('\n');
+ }
+
+ // legend
+ msg = '\n' +
+ color('diff removed', 'actual') +
+ ' ' +
+ color('diff added', 'expected') +
+ '\n\n' +
+ msg +
+ '\n';
+
+ // indent
+ msg = msg.replace(/^/gm, ' ');
+ return msg;
+}
+
+/**
+ * Returns a unified diff between two strings.
+ *
+ * @api private
+ * @param {Error} err with actual/expected
+ * @param {boolean} escape
+ * @return {string} The diff.
+ */
+function unifiedDiff (err, escape) {
+ var indent = ' ';
+ function cleanUp (line) {
+ if (escape) {
+ line = escapeInvisibles(line);
+ }
+ if (line[0] === '+') {
+ return indent + colorLines('diff added', line);
+ }
+ if (line[0] === '-') {
+ return indent + colorLines('diff removed', line);
+ }
+ if (line.match(/@@/)) {
+ return null;
+ }
+ if (line.match(/\\ No newline/)) {
+ return null;
+ }
+ return indent + line;
+ }
+ function notBlank (line) {
+ return typeof line !== 'undefined' && line !== null;
+ }
+ var msg = diff.createPatch('string', err.actual, err.expected);
+ var lines = msg.split('\n').splice(4);
+ return '\n ' +
+ colorLines('diff added', '+ expected') + ' ' +
+ colorLines('diff removed', '- actual') +
+ '\n\n' +
+ lines.map(cleanUp).filter(notBlank).join('\n');
+}
+
+/**
+ * Return a character diff for `err`.
+ *
+ * @api private
+ * @param {Error} err
+ * @param {string} type
+ * @param {boolean} escape
+ * @return {string}
+ */
+function errorDiff (err, type, escape) {
+ var actual = escape ? escapeInvisibles(err.actual) : err.actual;
+ var expected = escape ? escapeInvisibles(err.expected) : err.expected;
+ return diff['diff' + type](actual, expected).map(function (str) {
+ if (str.added) {
+ return colorLines('diff added', str.value);
+ }
+ if (str.removed) {
+ return colorLines('diff removed', str.value);
+ }
+ return str.value;
+ }).join('');
+}
+
+/**
+ * Returns a string with all invisible characters in plain text
+ *
+ * @api private
+ * @param {string} line
+ * @return {string}
+ */
+function escapeInvisibles (line) {
+ return line.replace(/\t/g, '<tab>')
+ .replace(/\r/g, '<CR>')
+ .replace(/\n/g, '<LF>\n');
+}
+
+/**
+ * Color lines for `str`, using the color `name`.
+ *
+ * @api private
+ * @param {string} name
+ * @param {string} str
+ * @return {string}
+ */
+function colorLines (name, str) {
+ return str.split('\n').map(function (str) {
+ return color(name, str);
+ }).join('\n');
+}
+
+/**
+ * Object#toString reference.
+ */
+var objToString = Object.prototype.toString;
+
+/**
+ * Check that a / b have the same type.
+ *
+ * @api private
+ * @param {Object} a
+ * @param {Object} b
+ * @return {boolean}
+ */
+function sameType (a, b) {
+ return objToString.call(a) === objToString.call(b);
+}
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"../ms":15,"../utils":38,"_process":82,"diff":55,"supports-color":42,"tty":5}],18:[function(require,module,exports){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var utils = require('../utils');
+
+/**
+ * Expose `Doc`.
+ */
+
+exports = module.exports = Doc;
+
+/**
+ * Initialize a new `Doc` reporter.
+ *
+ * @param {Runner} runner
+ * @api public
+ */
+function Doc (runner) {
+ Base.call(this, runner);
+
+ var indents = 2;
+
+ function indent () {
+ return Array(indents).join(' ');
+ }
+
+ runner.on('suite', function (suite) {
+ if (suite.root) {
+ return;
+ }
+ ++indents;
+ console.log('%s<section class="suite">', indent());
+ ++indents;
+ console.log('%s<h1>%s</h1>', indent(), utils.escape(suite.title));
+ console.log('%s<dl>', indent());
+ });
+
+ runner.on('suite end', function (suite) {
+ if (suite.root) {
+ return;
+ }
+ console.log('%s</dl>', indent());
+ --indents;
+ console.log('%s</section>', indent());
+ --indents;
+ });
+
+ runner.on('pass', function (test) {
+ console.log('%s <dt>%s</dt>', indent(), utils.escape(test.title));
+ var code = utils.escape(utils.clean(test.body));
+ console.log('%s <dd><pre><code>%s</code></pre></dd>', indent(), code);
+ });
+
+ runner.on('fail', function (test, err) {
+ console.log('%s <dt class="error">%s</dt>', indent(), utils.escape(test.title));
+ var code = utils.escape(utils.clean(test.body));
+ console.log('%s <dd class="error"><pre><code>%s</code></pre></dd>', indent(), code);
+ console.log('%s <dd class="error">%s</dd>', indent(), utils.escape(err));
+ });
+}
+
+},{"../utils":38,"./base":17}],19:[function(require,module,exports){
+(function (process){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var inherits = require('../utils').inherits;
+var color = Base.color;
+
+/**
+ * Expose `Dot`.
+ */
+
+exports = module.exports = Dot;
+
+/**
+ * Initialize a new `Dot` matrix test reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function Dot (runner) {
+ Base.call(this, runner);
+
+ var self = this;
+ var width = Base.window.width * 0.75 | 0;
+ var n = -1;
+
+ runner.on('start', function () {
+ process.stdout.write('\n');
+ });
+
+ runner.on('pending', function () {
+ if (++n % width === 0) {
+ process.stdout.write('\n ');
+ }
+ process.stdout.write(color('pending', Base.symbols.comma));
+ });
+
+ runner.on('pass', function (test) {
+ if (++n % width === 0) {
+ process.stdout.write('\n ');
+ }
+ if (test.speed === 'slow') {
+ process.stdout.write(color('bright yellow', Base.symbols.dot));
+ } else {
+ process.stdout.write(color(test.speed, Base.symbols.dot));
+ }
+ });
+
+ runner.on('fail', function () {
+ if (++n % width === 0) {
+ process.stdout.write('\n ');
+ }
+ process.stdout.write(color('fail', Base.symbols.bang));
+ });
+
+ runner.on('end', function () {
+ console.log();
+ self.epilogue();
+ });
+}
+
+/**
+ * Inherit from `Base.prototype`.
+ */
+inherits(Dot, Base);
+
+}).call(this,require('_process'))
+},{"../utils":38,"./base":17,"_process":82}],20:[function(require,module,exports){
+(function (global){
+'use strict';
+
+/* eslint-env browser */
+
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var utils = require('../utils');
+var Progress = require('../browser/progress');
+var escapeRe = require('escape-string-regexp');
+var escape = utils.escape;
+
+/**
+ * Save timer references to avoid Sinon interfering (see GH-237).
+ */
+
+/* eslint-disable no-unused-vars, no-native-reassign */
+var Date = global.Date;
+var setTimeout = global.setTimeout;
+var setInterval = global.setInterval;
+var clearTimeout = global.clearTimeout;
+var clearInterval = global.clearInterval;
+/* eslint-enable no-unused-vars, no-native-reassign */
+
+/**
+ * Expose `HTML`.
+ */
+
+exports = module.exports = HTML;
+
+/**
+ * Stats template.
+ */
+
+var statsTemplate = '<ul id="mocha-stats">' +
+ '<li class="progress"><canvas width="40" height="40"></canvas></li>' +
+ '<li class="passes"><a href="javascript:void(0);">passes:</a> <em>0</em></li>' +
+ '<li class="failures"><a href="javascript:void(0);">failures:</a> <em>0</em></li>' +
+ '<li class="duration">duration: <em>0</em>s</li>' +
+ '</ul>';
+
+var playIcon = '&#x2023;';
+
+/**
+ * Initialize a new `HTML` reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function HTML (runner) {
+ Base.call(this, runner);
+
+ var self = this;
+ var stats = this.stats;
+ var stat = fragment(statsTemplate);
+ var items = stat.getElementsByTagName('li');
+ var passes = items[1].getElementsByTagName('em')[0];
+ var passesLink = items[1].getElementsByTagName('a')[0];
+ var failures = items[2].getElementsByTagName('em')[0];
+ var failuresLink = items[2].getElementsByTagName('a')[0];
+ var duration = items[3].getElementsByTagName('em')[0];
+ var canvas = stat.getElementsByTagName('canvas')[0];
+ var report = fragment('<ul id="mocha-report"></ul>');
+ var stack = [report];
+ var progress;
+ var ctx;
+ var root = document.getElementById('mocha');
+
+ if (canvas.getContext) {
+ var ratio = window.devicePixelRatio || 1;
+ canvas.style.width = canvas.width;
+ canvas.style.height = canvas.height;
+ canvas.width *= ratio;
+ canvas.height *= ratio;
+ ctx = canvas.getContext('2d');
+ ctx.scale(ratio, ratio);
+ progress = new Progress();
+ }
+
+ if (!root) {
+ return error('#mocha div missing, add it to your document');
+ }
+
+ // pass toggle
+ on(passesLink, 'click', function (evt) {
+ evt.preventDefault();
+ unhide();
+ var name = (/pass/).test(report.className) ? '' : ' pass';
+ report.className = report.className.replace(/fail|pass/g, '') + name;
+ if (report.className.trim()) {
+ hideSuitesWithout('test pass');
+ }
+ });
+
+ // failure toggle
+ on(failuresLink, 'click', function (evt) {
+ evt.preventDefault();
+ unhide();
+ var name = (/fail/).test(report.className) ? '' : ' fail';
+ report.className = report.className.replace(/fail|pass/g, '') + name;
+ if (report.className.trim()) {
+ hideSuitesWithout('test fail');
+ }
+ });
+
+ root.appendChild(stat);
+ root.appendChild(report);
+
+ if (progress) {
+ progress.size(40);
+ }
+
+ runner.on('suite', function (suite) {
+ if (suite.root) {
+ return;
+ }
+
+ // suite
+ var url = self.suiteURL(suite);
+ var el = fragment('<li class="suite"><h1><a href="%s">%s</a></h1></li>', url, escape(suite.title));
+
+ // container
+ stack[0].appendChild(el);
+ stack.unshift(document.createElement('ul'));
+ el.appendChild(stack[0]);
+ });
+
+ runner.on('suite end', function (suite) {
+ if (suite.root) {
+ updateStats();
+ return;
+ }
+ stack.shift();
+ });
+
+ runner.on('pass', function (test) {
+ var url = self.testURL(test);
+ var markup = '<li class="test pass %e"><h2>%e<span class="duration">%ems</span> ' +
+ '<a href="%s" class="replay">' + playIcon + '</a></h2></li>';
+ var el = fragment(markup, test.speed, test.title, test.duration, url);
+ self.addCodeToggle(el, test.body);
+ appendToStack(el);
+ updateStats();
+ });
+
+ runner.on('fail', function (test) {
+ var el = fragment('<li class="test fail"><h2>%e <a href="%e" class="replay">' + playIcon + '</a></h2></li>',
+ test.title, self.testURL(test));
+ var stackString; // Note: Includes leading newline
+ var message = test.err.toString();
+
+ // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we
+ // check for the result of the stringifying.
+ if (message === '[object Error]') {
+ message = test.err.message;
+ }
+
+ if (test.err.stack) {
+ var indexOfMessage = test.err.stack.indexOf(test.err.message);
+ if (indexOfMessage === -1) {
+ stackString = test.err.stack;
+ } else {
+ stackString = test.err.stack.substr(test.err.message.length + indexOfMessage);
+ }
+ } else if (test.err.sourceURL && test.err.line !== undefined) {
+ // Safari doesn't give you a stack. Let's at least provide a source line.
+ stackString = '\n(' + test.err.sourceURL + ':' + test.err.line + ')';
+ }
+
+ stackString = stackString || '';
+
+ if (test.err.htmlMessage && stackString) {
+ el.appendChild(fragment('<div class="html-error">%s\n<pre class="error">%e</pre></div>',
+ test.err.htmlMessage, stackString));
+ } else if (test.err.htmlMessage) {
+ el.appendChild(fragment('<div class="html-error">%s</div>', test.err.htmlMessage));
+ } else {
+ el.appendChild(fragment('<pre class="error">%e%e</pre>', message, stackString));
+ }
+
+ self.addCodeToggle(el, test.body);
+ appendToStack(el);
+ updateStats();
+ });
+
+ runner.on('pending', function (test) {
+ var el = fragment('<li class="test pass pending"><h2>%e</h2></li>', test.title);
+ appendToStack(el);
+ updateStats();
+ });
+
+ function appendToStack (el) {
+ // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack.
+ if (stack[0]) {
+ stack[0].appendChild(el);
+ }
+ }
+
+ function updateStats () {
+ // TODO: add to stats
+ var percent = stats.tests / runner.total * 100 | 0;
+ if (progress) {
+ progress.update(percent).draw(ctx);
+ }
+
+ // update stats
+ var ms = new Date() - stats.start;
+ text(passes, stats.passes);
+ text(failures, stats.failures);
+ text(duration, (ms / 1000).toFixed(2));
+ }
+}
+
+/**
+ * Makes a URL, preserving querystring ("search") parameters.
+ *
+ * @param {string} s
+ * @return {string} A new URL.
+ */
+function makeUrl (s) {
+ var search = window.location.search;
+
+ // Remove previous grep query parameter if present
+ if (search) {
+ search = search.replace(/[?&]grep=[^&\s]*/g, '').replace(/^&/, '?');
+ }
+
+ return window.location.pathname + (search ? search + '&' : '?') + 'grep=' + encodeURIComponent(escapeRe(s));
+}
+
+/**
+ * Provide suite URL.
+ *
+ * @param {Object} [suite]
+ */
+HTML.prototype.suiteURL = function (suite) {
+ return makeUrl(suite.fullTitle());
+};
+
+/**
+ * Provide test URL.
+ *
+ * @param {Object} [test]
+ */
+HTML.prototype.testURL = function (test) {
+ return makeUrl(test.fullTitle());
+};
+
+/**
+ * Adds code toggle functionality for the provided test's list element.
+ *
+ * @param {HTMLLIElement} el
+ * @param {string} contents
+ */
+HTML.prototype.addCodeToggle = function (el, contents) {
+ var h2 = el.getElementsByTagName('h2')[0];
+
+ on(h2, 'click', function () {
+ pre.style.display = pre.style.display === 'none' ? 'block' : 'none';
+ });
+
+ var pre = fragment('<pre><code>%e</code></pre>', utils.clean(contents));
+ el.appendChild(pre);
+ pre.style.display = 'none';
+};
+
+/**
+ * Display error `msg`.
+ *
+ * @param {string} msg
+ */
+function error (msg) {
+ document.body.appendChild(fragment('<div id="mocha-error">%s</div>', msg));
+}
+
+/**
+ * Return a DOM fragment from `html`.
+ *
+ * @param {string} html
+ */
+function fragment (html) {
+ var args = arguments;
+ var div = document.createElement('div');
+ var i = 1;
+
+ div.innerHTML = html.replace(/%([se])/g, function (_, type) {
+ switch (type) {
+ case 's': return String(args[i++]);
+ case 'e': return escape(args[i++]);
+ // no default
+ }
+ });
+
+ return div.firstChild;
+}
+
+/**
+ * Check for suites that do not have elements
+ * with `classname`, and hide them.
+ *
+ * @param {text} classname
+ */
+function hideSuitesWithout (classname) {
+ var suites = document.getElementsByClassName('suite');
+ for (var i = 0; i < suites.length; i++) {
+ var els = suites[i].getElementsByClassName(classname);
+ if (!els.length) {
+ suites[i].className += ' hidden';
+ }
+ }
+}
+
+/**
+ * Unhide .hidden suites.
+ */
+function unhide () {
+ var els = document.getElementsByClassName('suite hidden');
+ for (var i = 0; i < els.length; ++i) {
+ els[i].className = els[i].className.replace('suite hidden', 'suite');
+ }
+}
+
+/**
+ * Set an element's text contents.
+ *
+ * @param {HTMLElement} el
+ * @param {string} contents
+ */
+function text (el, contents) {
+ if (el.textContent) {
+ el.textContent = contents;
+ } else {
+ el.innerText = contents;
+ }
+}
+
+/**
+ * Listen on `event` with callback `fn`.
+ */
+function on (el, event, fn) {
+ if (el.addEventListener) {
+ el.addEventListener(event, fn, false);
+ } else {
+ el.attachEvent('on' + event, fn);
+ }
+}
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"../browser/progress":4,"../utils":38,"./base":17,"escape-string-regexp":61}],21:[function(require,module,exports){
+'use strict';
+
+// Alias exports to a their normalized format Mocha#reporter to prevent a need
+// for dynamic (try/catch) requires, which Browserify doesn't handle.
+exports.Base = exports.base = require('./base');
+exports.Dot = exports.dot = require('./dot');
+exports.Doc = exports.doc = require('./doc');
+exports.TAP = exports.tap = require('./tap');
+exports.JSON = exports.json = require('./json');
+exports.HTML = exports.html = require('./html');
+exports.List = exports.list = require('./list');
+exports.Min = exports.min = require('./min');
+exports.Spec = exports.spec = require('./spec');
+exports.Nyan = exports.nyan = require('./nyan');
+exports.XUnit = exports.xunit = require('./xunit');
+exports.Markdown = exports.markdown = require('./markdown');
+exports.Progress = exports.progress = require('./progress');
+exports.Landing = exports.landing = require('./landing');
+exports.JSONStream = exports['json-stream'] = require('./json-stream');
+
+},{"./base":17,"./doc":18,"./dot":19,"./html":20,"./json":23,"./json-stream":22,"./landing":24,"./list":25,"./markdown":26,"./min":27,"./nyan":28,"./progress":29,"./spec":30,"./tap":31,"./xunit":32}],22:[function(require,module,exports){
+(function (process){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var JSON = require('json3');
+
+/**
+ * Expose `List`.
+ */
+
+exports = module.exports = List;
+
+/**
+ * Initialize a new `List` test reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function List (runner) {
+ Base.call(this, runner);
+
+ var self = this;
+ var total = runner.total;
+
+ runner.on('start', function () {
+ console.log(JSON.stringify(['start', { total: total }]));
+ });
+
+ runner.on('pass', function (test) {
+ console.log(JSON.stringify(['pass', clean(test)]));
+ });
+
+ runner.on('fail', function (test, err) {
+ test = clean(test);
+ test.err = err.message;
+ test.stack = err.stack || null;
+ console.log(JSON.stringify(['fail', test]));
+ });
+
+ runner.on('end', function () {
+ process.stdout.write(JSON.stringify(['end', self.stats]));
+ });
+}
+
+/**
+ * Return a plain-object representation of `test`
+ * free of cyclic properties etc.
+ *
+ * @api private
+ * @param {Object} test
+ * @return {Object}
+ */
+function clean (test) {
+ return {
+ title: test.title,
+ fullTitle: test.fullTitle(),
+ duration: test.duration,
+ currentRetry: test.currentRetry()
+ };
+}
+
+}).call(this,require('_process'))
+},{"./base":17,"_process":82,"json3":69}],23:[function(require,module,exports){
+(function (process){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+
+/**
+ * Expose `JSON`.
+ */
+
+exports = module.exports = JSONReporter;
+
+/**
+ * Initialize a new `JSON` reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function JSONReporter (runner) {
+ Base.call(this, runner);
+
+ var self = this;
+ var tests = [];
+ var pending = [];
+ var failures = [];
+ var passes = [];
+
+ runner.on('test end', function (test) {
+ tests.push(test);
+ });
+
+ runner.on('pass', function (test) {
+ passes.push(test);
+ });
+
+ runner.on('fail', function (test) {
+ failures.push(test);
+ });
+
+ runner.on('pending', function (test) {
+ pending.push(test);
+ });
+
+ runner.on('end', function () {
+ var obj = {
+ stats: self.stats,
+ tests: tests.map(clean),
+ pending: pending.map(clean),
+ failures: failures.map(clean),
+ passes: passes.map(clean)
+ };
+
+ runner.testResults = obj;
+
+ process.stdout.write(JSON.stringify(obj, null, 2));
+ });
+}
+
+/**
+ * Return a plain-object representation of `test`
+ * free of cyclic properties etc.
+ *
+ * @api private
+ * @param {Object} test
+ * @return {Object}
+ */
+function clean (test) {
+ return {
+ title: test.title,
+ fullTitle: test.fullTitle(),
+ duration: test.duration,
+ currentRetry: test.currentRetry(),
+ err: errorJSON(test.err || {})
+ };
+}
+
+/**
+ * Transform `error` into a JSON object.
+ *
+ * @api private
+ * @param {Error} err
+ * @return {Object}
+ */
+function errorJSON (err) {
+ var res = {};
+ Object.getOwnPropertyNames(err).forEach(function (key) {
+ res[key] = err[key];
+ }, err);
+ return res;
+}
+
+}).call(this,require('_process'))
+},{"./base":17,"_process":82}],24:[function(require,module,exports){
+(function (process){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var inherits = require('../utils').inherits;
+var cursor = Base.cursor;
+var color = Base.color;
+
+/**
+ * Expose `Landing`.
+ */
+
+exports = module.exports = Landing;
+
+/**
+ * Airplane color.
+ */
+
+Base.colors.plane = 0;
+
+/**
+ * Airplane crash color.
+ */
+
+Base.colors['plane crash'] = 31;
+
+/**
+ * Runway color.
+ */
+
+Base.colors.runway = 90;
+
+/**
+ * Initialize a new `Landing` reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function Landing (runner) {
+ Base.call(this, runner);
+
+ var self = this;
+ var width = Base.window.width * 0.75 | 0;
+ var total = runner.total;
+ var stream = process.stdout;
+ var plane = color('plane', '✈');
+ var crashed = -1;
+ var n = 0;
+
+ function runway () {
+ var buf = Array(width).join('-');
+ return ' ' + color('runway', buf);
+ }
+
+ runner.on('start', function () {
+ stream.write('\n\n\n ');
+ cursor.hide();
+ });
+
+ runner.on('test end', function (test) {
+ // check if the plane crashed
+ var col = crashed === -1 ? width * ++n / total | 0 : crashed;
+
+ // show the crash
+ if (test.state === 'failed') {
+ plane = color('plane crash', '✈');
+ crashed = col;
+ }
+
+ // render landing strip
+ stream.write('\u001b[' + (width + 1) + 'D\u001b[2A');
+ stream.write(runway());
+ stream.write('\n ');
+ stream.write(color('runway', Array(col).join('⋅')));
+ stream.write(plane);
+ stream.write(color('runway', Array(width - col).join('⋅') + '\n'));
+ stream.write(runway());
+ stream.write('\u001b[0m');
+ });
+
+ runner.on('end', function () {
+ cursor.show();
+ console.log();
+ self.epilogue();
+ });
+}
+
+/**
+ * Inherit from `Base.prototype`.
+ */
+inherits(Landing, Base);
+
+}).call(this,require('_process'))
+},{"../utils":38,"./base":17,"_process":82}],25:[function(require,module,exports){
+(function (process){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var inherits = require('../utils').inherits;
+var color = Base.color;
+var cursor = Base.cursor;
+
+/**
+ * Expose `List`.
+ */
+
+exports = module.exports = List;
+
+/**
+ * Initialize a new `List` test reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function List (runner) {
+ Base.call(this, runner);
+
+ var self = this;
+ var n = 0;
+
+ runner.on('start', function () {
+ console.log();
+ });
+
+ runner.on('test', function (test) {
+ process.stdout.write(color('pass', ' ' + test.fullTitle() + ': '));
+ });
+
+ runner.on('pending', function (test) {
+ var fmt = color('checkmark', ' -') +
+ color('pending', ' %s');
+ console.log(fmt, test.fullTitle());
+ });
+
+ runner.on('pass', function (test) {
+ var fmt = color('checkmark', ' ' + Base.symbols.ok) +
+ color('pass', ' %s: ') +
+ color(test.speed, '%dms');
+ cursor.CR();
+ console.log(fmt, test.fullTitle(), test.duration);
+ });
+
+ runner.on('fail', function (test) {
+ cursor.CR();
+ console.log(color('fail', ' %d) %s'), ++n, test.fullTitle());
+ });
+
+ runner.on('end', self.epilogue.bind(self));
+}
+
+/**
+ * Inherit from `Base.prototype`.
+ */
+inherits(List, Base);
+
+}).call(this,require('_process'))
+},{"../utils":38,"./base":17,"_process":82}],26:[function(require,module,exports){
+(function (process){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var utils = require('../utils');
+
+/**
+ * Constants
+ */
+
+var SUITE_PREFIX = '$';
+
+/**
+ * Expose `Markdown`.
+ */
+
+exports = module.exports = Markdown;
+
+/**
+ * Initialize a new `Markdown` reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function Markdown (runner) {
+ Base.call(this, runner);
+
+ var level = 0;
+ var buf = '';
+
+ function title (str) {
+ return Array(level).join('#') + ' ' + str;
+ }
+
+ function mapTOC (suite, obj) {
+ var ret = obj;
+ var key = SUITE_PREFIX + suite.title;
+
+ obj = obj[key] = obj[key] || { suite: suite };
+ suite.suites.forEach(function (suite) {
+ mapTOC(suite, obj);
+ });
+
+ return ret;
+ }
+
+ function stringifyTOC (obj, level) {
+ ++level;
+ var buf = '';
+ var link;
+ for (var key in obj) {
+ if (key === 'suite') {
+ continue;
+ }
+ if (key !== SUITE_PREFIX) {
+ link = ' - [' + key.substring(1) + ']';
+ link += '(#' + utils.slug(obj[key].suite.fullTitle()) + ')\n';
+ buf += Array(level).join(' ') + link;
+ }
+ buf += stringifyTOC(obj[key], level);
+ }
+ return buf;
+ }
+
+ function generateTOC (suite) {
+ var obj = mapTOC(suite, {});
+ return stringifyTOC(obj, 0);
+ }
+
+ generateTOC(runner.suite);
+
+ runner.on('suite', function (suite) {
+ ++level;
+ var slug = utils.slug(suite.fullTitle());
+ buf += '<a name="' + slug + '"></a>' + '\n';
+ buf += title(suite.title) + '\n';
+ });
+
+ runner.on('suite end', function () {
+ --level;
+ });
+
+ runner.on('pass', function (test) {
+ var code = utils.clean(test.body);
+ buf += test.title + '.\n';
+ buf += '\n```js\n';
+ buf += code + '\n';
+ buf += '```\n\n';
+ });
+
+ runner.on('end', function () {
+ process.stdout.write('# TOC\n');
+ process.stdout.write(generateTOC(runner.suite));
+ process.stdout.write(buf);
+ });
+}
+
+}).call(this,require('_process'))
+},{"../utils":38,"./base":17,"_process":82}],27:[function(require,module,exports){
+(function (process){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var inherits = require('../utils').inherits;
+
+/**
+ * Expose `Min`.
+ */
+
+exports = module.exports = Min;
+
+/**
+ * Initialize a new `Min` minimal test reporter (best used with --watch).
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function Min (runner) {
+ Base.call(this, runner);
+
+ runner.on('start', function () {
+ // clear screen
+ process.stdout.write('\u001b[2J');
+ // set cursor position
+ process.stdout.write('\u001b[1;3H');
+ });
+
+ runner.on('end', this.epilogue.bind(this));
+}
+
+/**
+ * Inherit from `Base.prototype`.
+ */
+inherits(Min, Base);
+
+}).call(this,require('_process'))
+},{"../utils":38,"./base":17,"_process":82}],28:[function(require,module,exports){
+(function (process){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var inherits = require('../utils').inherits;
+
+/**
+ * Expose `Dot`.
+ */
+
+exports = module.exports = NyanCat;
+
+/**
+ * Initialize a new `Dot` matrix test reporter.
+ *
+ * @param {Runner} runner
+ * @api public
+ */
+
+function NyanCat (runner) {
+ Base.call(this, runner);
+
+ var self = this;
+ var width = Base.window.width * 0.75 | 0;
+ var nyanCatWidth = this.nyanCatWidth = 11;
+
+ this.colorIndex = 0;
+ this.numberOfLines = 4;
+ this.rainbowColors = self.generateColors();
+ this.scoreboardWidth = 5;
+ this.tick = 0;
+ this.trajectories = [[], [], [], []];
+ this.trajectoryWidthMax = (width - nyanCatWidth);
+
+ runner.on('start', function () {
+ Base.cursor.hide();
+ self.draw();
+ });
+
+ runner.on('pending', function () {
+ self.draw();
+ });
+
+ runner.on('pass', function () {
+ self.draw();
+ });
+
+ runner.on('fail', function () {
+ self.draw();
+ });
+
+ runner.on('end', function () {
+ Base.cursor.show();
+ for (var i = 0; i < self.numberOfLines; i++) {
+ write('\n');
+ }
+ self.epilogue();
+ });
+}
+
+/**
+ * Inherit from `Base.prototype`.
+ */
+inherits(NyanCat, Base);
+
+/**
+ * Draw the nyan cat
+ *
+ * @api private
+ */
+
+NyanCat.prototype.draw = function () {
+ this.appendRainbow();
+ this.drawScoreboard();
+ this.drawRainbow();
+ this.drawNyanCat();
+ this.tick = !this.tick;
+};
+
+/**
+ * Draw the "scoreboard" showing the number
+ * of passes, failures and pending tests.
+ *
+ * @api private
+ */
+
+NyanCat.prototype.drawScoreboard = function () {
+ var stats = this.stats;
+
+ function draw (type, n) {
+ write(' ');
+ write(Base.color(type, n));
+ write('\n');
+ }
+
+ draw('green', stats.passes);
+ draw('fail', stats.failures);
+ draw('pending', stats.pending);
+ write('\n');
+
+ this.cursorUp(this.numberOfLines);
+};
+
+/**
+ * Append the rainbow.
+ *
+ * @api private
+ */
+
+NyanCat.prototype.appendRainbow = function () {
+ var segment = this.tick ? '_' : '-';
+ var rainbowified = this.rainbowify(segment);
+
+ for (var index = 0; index < this.numberOfLines; index++) {
+ var trajectory = this.trajectories[index];
+ if (trajectory.length >= this.trajectoryWidthMax) {
+ trajectory.shift();
+ }
+ trajectory.push(rainbowified);
+ }
+};
+
+/**
+ * Draw the rainbow.
+ *
+ * @api private
+ */
+
+NyanCat.prototype.drawRainbow = function () {
+ var self = this;
+
+ this.trajectories.forEach(function (line) {
+ write('\u001b[' + self.scoreboardWidth + 'C');
+ write(line.join(''));
+ write('\n');
+ });
+
+ this.cursorUp(this.numberOfLines);
+};
+
+/**
+ * Draw the nyan cat
+ *
+ * @api private
+ */
+NyanCat.prototype.drawNyanCat = function () {
+ var self = this;
+ var startWidth = this.scoreboardWidth + this.trajectories[0].length;
+ var dist = '\u001b[' + startWidth + 'C';
+ var padding = '';
+
+ write(dist);
+ write('_,------,');
+ write('\n');
+
+ write(dist);
+ padding = self.tick ? ' ' : ' ';
+ write('_|' + padding + '/\\_/\\ ');
+ write('\n');
+
+ write(dist);
+ padding = self.tick ? '_' : '__';
+ var tail = self.tick ? '~' : '^';
+ write(tail + '|' + padding + this.face() + ' ');
+ write('\n');
+
+ write(dist);
+ padding = self.tick ? ' ' : ' ';
+ write(padding + '"" "" ');
+ write('\n');
+
+ this.cursorUp(this.numberOfLines);
+};
+
+/**
+ * Draw nyan cat face.
+ *
+ * @api private
+ * @return {string}
+ */
+
+NyanCat.prototype.face = function () {
+ var stats = this.stats;
+ if (stats.failures) {
+ return '( x .x)';
+ } else if (stats.pending) {
+ return '( o .o)';
+ } else if (stats.passes) {
+ return '( ^ .^)';
+ }
+ return '( - .-)';
+};
+
+/**
+ * Move cursor up `n`.
+ *
+ * @api private
+ * @param {number} n
+ */
+
+NyanCat.prototype.cursorUp = function (n) {
+ write('\u001b[' + n + 'A');
+};
+
+/**
+ * Move cursor down `n`.
+ *
+ * @api private
+ * @param {number} n
+ */
+
+NyanCat.prototype.cursorDown = function (n) {
+ write('\u001b[' + n + 'B');
+};
+
+/**
+ * Generate rainbow colors.
+ *
+ * @api private
+ * @return {Array}
+ */
+NyanCat.prototype.generateColors = function () {
+ var colors = [];
+
+ for (var i = 0; i < (6 * 7); i++) {
+ var pi3 = Math.floor(Math.PI / 3);
+ var n = (i * (1.0 / 6));
+ var r = Math.floor(3 * Math.sin(n) + 3);
+ var g = Math.floor(3 * Math.sin(n + 2 * pi3) + 3);
+ var b = Math.floor(3 * Math.sin(n + 4 * pi3) + 3);
+ colors.push(36 * r + 6 * g + b + 16);
+ }
+
+ return colors;
+};
+
+/**
+ * Apply rainbow to the given `str`.
+ *
+ * @api private
+ * @param {string} str
+ * @return {string}
+ */
+NyanCat.prototype.rainbowify = function (str) {
+ if (!Base.useColors) {
+ return str;
+ }
+ var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length];
+ this.colorIndex += 1;
+ return '\u001b[38;5;' + color + 'm' + str + '\u001b[0m';
+};
+
+/**
+ * Stdout helper.
+ *
+ * @param {string} string A message to write to stdout.
+ */
+function write (string) {
+ process.stdout.write(string);
+}
+
+}).call(this,require('_process'))
+},{"../utils":38,"./base":17,"_process":82}],29:[function(require,module,exports){
+(function (process){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var inherits = require('../utils').inherits;
+var color = Base.color;
+var cursor = Base.cursor;
+
+/**
+ * Expose `Progress`.
+ */
+
+exports = module.exports = Progress;
+
+/**
+ * General progress bar color.
+ */
+
+Base.colors.progress = 90;
+
+/**
+ * Initialize a new `Progress` bar test reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ * @param {Object} options
+ */
+function Progress (runner, options) {
+ Base.call(this, runner);
+
+ var self = this;
+ var width = Base.window.width * 0.50 | 0;
+ var total = runner.total;
+ var complete = 0;
+ var lastN = -1;
+
+ // default chars
+ options = options || {};
+ options.open = options.open || '[';
+ options.complete = options.complete || '▬';
+ options.incomplete = options.incomplete || Base.symbols.dot;
+ options.close = options.close || ']';
+ options.verbose = false;
+
+ // tests started
+ runner.on('start', function () {
+ console.log();
+ cursor.hide();
+ });
+
+ // tests complete
+ runner.on('test end', function () {
+ complete++;
+
+ var percent = complete / total;
+ var n = width * percent | 0;
+ var i = width - n;
+
+ if (n === lastN && !options.verbose) {
+ // Don't re-render the line if it hasn't changed
+ return;
+ }
+ lastN = n;
+
+ cursor.CR();
+ process.stdout.write('\u001b[J');
+ process.stdout.write(color('progress', ' ' + options.open));
+ process.stdout.write(Array(n).join(options.complete));
+ process.stdout.write(Array(i).join(options.incomplete));
+ process.stdout.write(color('progress', options.close));
+ if (options.verbose) {
+ process.stdout.write(color('progress', ' ' + complete + ' of ' + total));
+ }
+ });
+
+ // tests are complete, output some stats
+ // and the failures if any
+ runner.on('end', function () {
+ cursor.show();
+ console.log();
+ self.epilogue();
+ });
+}
+
+/**
+ * Inherit from `Base.prototype`.
+ */
+inherits(Progress, Base);
+
+}).call(this,require('_process'))
+},{"../utils":38,"./base":17,"_process":82}],30:[function(require,module,exports){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var inherits = require('../utils').inherits;
+var color = Base.color;
+
+/**
+ * Expose `Spec`.
+ */
+
+exports = module.exports = Spec;
+
+/**
+ * Initialize a new `Spec` test reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function Spec (runner) {
+ Base.call(this, runner);
+
+ var self = this;
+ var indents = 0;
+ var n = 0;
+
+ function indent () {
+ return Array(indents).join(' ');
+ }
+
+ runner.on('start', function () {
+ console.log();
+ });
+
+ runner.on('suite', function (suite) {
+ ++indents;
+ console.log(color('suite', '%s%s'), indent(), suite.title);
+ });
+
+ runner.on('suite end', function () {
+ --indents;
+ if (indents === 1) {
+ console.log();
+ }
+ });
+
+ runner.on('pending', function (test) {
+ var fmt = indent() + color('pending', ' - %s');
+ console.log(fmt, test.title);
+ });
+
+ runner.on('pass', function (test) {
+ var fmt;
+ if (test.speed === 'fast') {
+ fmt = indent() +
+ color('checkmark', ' ' + Base.symbols.ok) +
+ color('pass', ' %s');
+ console.log(fmt, test.title);
+ } else {
+ fmt = indent() +
+ color('checkmark', ' ' + Base.symbols.ok) +
+ color('pass', ' %s') +
+ color(test.speed, ' (%dms)');
+ console.log(fmt, test.title, test.duration);
+ }
+ });
+
+ runner.on('fail', function (test) {
+ console.log(indent() + color('fail', ' %d) %s'), ++n, test.title);
+ });
+
+ runner.on('end', self.epilogue.bind(self));
+}
+
+/**
+ * Inherit from `Base.prototype`.
+ */
+inherits(Spec, Base);
+
+},{"../utils":38,"./base":17}],31:[function(require,module,exports){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+
+/**
+ * Expose `TAP`.
+ */
+
+exports = module.exports = TAP;
+
+/**
+ * Initialize a new `TAP` reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function TAP (runner) {
+ Base.call(this, runner);
+
+ var n = 1;
+ var passes = 0;
+ var failures = 0;
+
+ runner.on('start', function () {
+ var total = runner.grepTotal(runner.suite);
+ console.log('%d..%d', 1, total);
+ });
+
+ runner.on('test end', function () {
+ ++n;
+ });
+
+ runner.on('pending', function (test) {
+ console.log('ok %d %s # SKIP -', n, title(test));
+ });
+
+ runner.on('pass', function (test) {
+ passes++;
+ console.log('ok %d %s', n, title(test));
+ });
+
+ runner.on('fail', function (test, err) {
+ failures++;
+ console.log('not ok %d %s', n, title(test));
+ if (err.stack) {
+ console.log(err.stack.replace(/^/gm, ' '));
+ }
+ });
+
+ runner.on('end', function () {
+ console.log('# tests ' + (passes + failures));
+ console.log('# pass ' + passes);
+ console.log('# fail ' + failures);
+ });
+}
+
+/**
+ * Return a TAP-safe title of `test`
+ *
+ * @api private
+ * @param {Object} test
+ * @return {String}
+ */
+function title (test) {
+ return test.fullTitle().replace(/#/g, '');
+}
+
+},{"./base":17}],32:[function(require,module,exports){
+(function (process,global){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var utils = require('../utils');
+var inherits = utils.inherits;
+var fs = require('fs');
+var escape = utils.escape;
+var mkdirp = require('mkdirp');
+var path = require('path');
+
+/**
+ * Save timer references to avoid Sinon interfering (see GH-237).
+ */
+
+/* eslint-disable no-unused-vars, no-native-reassign */
+var Date = global.Date;
+var setTimeout = global.setTimeout;
+var setInterval = global.setInterval;
+var clearTimeout = global.clearTimeout;
+var clearInterval = global.clearInterval;
+/* eslint-enable no-unused-vars, no-native-reassign */
+
+/**
+ * Expose `XUnit`.
+ */
+
+exports = module.exports = XUnit;
+
+/**
+ * Initialize a new `XUnit` reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function XUnit (runner, options) {
+ Base.call(this, runner);
+
+ var stats = this.stats;
+ var tests = [];
+ var self = this;
+
+ if (options && options.reporterOptions && options.reporterOptions.output) {
+ if (!fs.createWriteStream) {
+ throw new Error('file output not supported in browser');
+ }
+ mkdirp.sync(path.dirname(options.reporterOptions.output));
+ self.fileStream = fs.createWriteStream(options.reporterOptions.output);
+ }
+
+ runner.on('pending', function (test) {
+ tests.push(test);
+ });
+
+ runner.on('pass', function (test) {
+ tests.push(test);
+ });
+
+ runner.on('fail', function (test) {
+ tests.push(test);
+ });
+
+ runner.on('end', function () {
+ self.write(tag('testsuite', {
+ name: 'Mocha Tests',
+ tests: stats.tests,
+ failures: stats.failures,
+ errors: stats.failures,
+ skipped: stats.tests - stats.failures - stats.passes,
+ timestamp: (new Date()).toUTCString(),
+ time: (stats.duration / 1000) || 0
+ }, false));
+
+ tests.forEach(function (t) {
+ self.test(t);
+ });
+
+ self.write('</testsuite>');
+ });
+}
+
+/**
+ * Inherit from `Base.prototype`.
+ */
+inherits(XUnit, Base);
+
+/**
+ * Override done to close the stream (if it's a file).
+ *
+ * @param failures
+ * @param {Function} fn
+ */
+XUnit.prototype.done = function (failures, fn) {
+ if (this.fileStream) {
+ this.fileStream.end(function () {
+ fn(failures);
+ });
+ } else {
+ fn(failures);
+ }
+};
+
+/**
+ * Write out the given line.
+ *
+ * @param {string} line
+ */
+XUnit.prototype.write = function (line) {
+ if (this.fileStream) {
+ this.fileStream.write(line + '\n');
+ } else if (typeof process === 'object' && process.stdout) {
+ process.stdout.write(line + '\n');
+ } else {
+ console.log(line);
+ }
+};
+
+/**
+ * Output tag for the given `test.`
+ *
+ * @param {Test} test
+ */
+XUnit.prototype.test = function (test) {
+ var attrs = {
+ classname: test.parent.fullTitle(),
+ name: test.title,
+ time: (test.duration / 1000) || 0
+ };
+
+ if (test.state === 'failed') {
+ var err = test.err;
+ this.write(tag('testcase', attrs, false, tag('failure', {}, false, escape(err.message) + '\n' + escape(err.stack))));
+ } else if (test.isPending()) {
+ this.write(tag('testcase', attrs, false, tag('skipped', {}, true)));
+ } else {
+ this.write(tag('testcase', attrs, true));
+ }
+};
+
+/**
+ * HTML tag helper.
+ *
+ * @param name
+ * @param attrs
+ * @param close
+ * @param content
+ * @return {string}
+ */
+function tag (name, attrs, close, content) {
+ var end = close ? '/>' : '>';
+ var pairs = [];
+ var tag;
+
+ for (var key in attrs) {
+ if (Object.prototype.hasOwnProperty.call(attrs, key)) {
+ pairs.push(key + '="' + escape(attrs[key]) + '"');
+ }
+ }
+
+ tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end;
+ if (content) {
+ tag += content + '</' + name + end;
+ }
+ return tag;
+}
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"../utils":38,"./base":17,"_process":82,"fs":42,"mkdirp":79,"path":42}],33:[function(require,module,exports){
+(function (global){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var EventEmitter = require('events').EventEmitter;
+var JSON = require('json3');
+var Pending = require('./pending');
+var debug = require('debug')('mocha:runnable');
+var milliseconds = require('./ms');
+var utils = require('./utils');
+var create = require('lodash.create');
+
+/**
+ * Save timer references to avoid Sinon interfering (see GH-237).
+ */
+
+/* eslint-disable no-unused-vars, no-native-reassign */
+var Date = global.Date;
+var setTimeout = global.setTimeout;
+var setInterval = global.setInterval;
+var clearTimeout = global.clearTimeout;
+var clearInterval = global.clearInterval;
+/* eslint-enable no-unused-vars, no-native-reassign */
+
+/**
+ * Object#toString().
+ */
+
+var toString = Object.prototype.toString;
+
+/**
+ * Expose `Runnable`.
+ */
+
+module.exports = Runnable;
+
+/**
+ * Initialize a new `Runnable` with the given `title` and callback `fn`.
+ *
+ * @param {String} title
+ * @param {Function} fn
+ * @api private
+ * @param {string} title
+ * @param {Function} fn
+ */
+function Runnable (title, fn) {
+ this.title = title;
+ this.fn = fn;
+ this.body = (fn || '').toString();
+ this.async = fn && fn.length;
+ this.sync = !this.async;
+ this._timeout = 2000;
+ this._slow = 75;
+ this._enableTimeouts = true;
+ this.timedOut = false;
+ this._trace = new Error('done() called multiple times');
+ this._retries = -1;
+ this._currentRetry = 0;
+ this.pending = false;
+}
+
+/**
+ * Inherit from `EventEmitter.prototype`.
+ */
+Runnable.prototype = create(EventEmitter.prototype, {
+ constructor: Runnable
+});
+
+/**
+ * Set & get timeout `ms`.
+ *
+ * @api private
+ * @param {number|string} ms
+ * @return {Runnable|number} ms or Runnable instance.
+ */
+Runnable.prototype.timeout = function (ms) {
+ if (!arguments.length) {
+ return this._timeout;
+ }
+ // see #1652 for reasoning
+ if (ms === 0 || ms > Math.pow(2, 31)) {
+ this._enableTimeouts = false;
+ }
+ if (typeof ms === 'string') {
+ ms = milliseconds(ms);
+ }
+ debug('timeout %d', ms);
+ this._timeout = ms;
+ if (this.timer) {
+ this.resetTimeout();
+ }
+ return this;
+};
+
+/**
+ * Set & get slow `ms`.
+ *
+ * @api private
+ * @param {number|string} ms
+ * @return {Runnable|number} ms or Runnable instance.
+ */
+Runnable.prototype.slow = function (ms) {
+ if (typeof ms === 'undefined') {
+ return this._slow;
+ }
+ if (typeof ms === 'string') {
+ ms = milliseconds(ms);
+ }
+ debug('timeout %d', ms);
+ this._slow = ms;
+ return this;
+};
+
+/**
+ * Set and get whether timeout is `enabled`.
+ *
+ * @api private
+ * @param {boolean} enabled
+ * @return {Runnable|boolean} enabled or Runnable instance.
+ */
+Runnable.prototype.enableTimeouts = function (enabled) {
+ if (!arguments.length) {
+ return this._enableTimeouts;
+ }
+ debug('enableTimeouts %s', enabled);
+ this._enableTimeouts = enabled;
+ return this;
+};
+
+/**
+ * Halt and mark as pending.
+ *
+ * @api public
+ */
+Runnable.prototype.skip = function () {
+ throw new Pending('sync skip');
+};
+
+/**
+ * Check if this runnable or its parent suite is marked as pending.
+ *
+ * @api private
+ */
+Runnable.prototype.isPending = function () {
+ return this.pending || (this.parent && this.parent.isPending());
+};
+
+/**
+ * Set number of retries.
+ *
+ * @api private
+ */
+Runnable.prototype.retries = function (n) {
+ if (!arguments.length) {
+ return this._retries;
+ }
+ this._retries = n;
+};
+
+/**
+ * Get current retry
+ *
+ * @api private
+ */
+Runnable.prototype.currentRetry = function (n) {
+ if (!arguments.length) {
+ return this._currentRetry;
+ }
+ this._currentRetry = n;
+};
+
+/**
+ * Return the full title generated by recursively concatenating the parent's
+ * full title.
+ *
+ * @api public
+ * @return {string}
+ */
+Runnable.prototype.fullTitle = function () {
+ return this.parent.fullTitle() + ' ' + this.title;
+};
+
+/**
+ * Clear the timeout.
+ *
+ * @api private
+ */
+Runnable.prototype.clearTimeout = function () {
+ clearTimeout(this.timer);
+};
+
+/**
+ * Inspect the runnable void of private properties.
+ *
+ * @api private
+ * @return {string}
+ */
+Runnable.prototype.inspect = function () {
+ return JSON.stringify(this, function (key, val) {
+ if (key[0] === '_') {
+ return;
+ }
+ if (key === 'parent') {
+ return '#<Suite>';
+ }
+ if (key === 'ctx') {
+ return '#<Context>';
+ }
+ return val;
+ }, 2);
+};
+
+/**
+ * Reset the timeout.
+ *
+ * @api private
+ */
+Runnable.prototype.resetTimeout = function () {
+ var self = this;
+ var ms = this.timeout() || 1e9;
+
+ if (!this._enableTimeouts) {
+ return;
+ }
+ this.clearTimeout();
+ this.timer = setTimeout(function () {
+ if (!self._enableTimeouts) {
+ return;
+ }
+ self.callback(new Error('Timeout of ' + ms +
+ 'ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.'));
+ self.timedOut = true;
+ }, ms);
+};
+
+/**
+ * Whitelist a list of globals for this test run.
+ *
+ * @api private
+ * @param {string[]} globals
+ */
+Runnable.prototype.globals = function (globals) {
+ if (!arguments.length) {
+ return this._allowedGlobals;
+ }
+ this._allowedGlobals = globals;
+};
+
+/**
+ * Run the test and invoke `fn(err)`.
+ *
+ * @param {Function} fn
+ * @api private
+ */
+Runnable.prototype.run = function (fn) {
+ var self = this;
+ var start = new Date();
+ var ctx = this.ctx;
+ var finished;
+ var emitted;
+
+ // Sometimes the ctx exists, but it is not runnable
+ if (ctx && ctx.runnable) {
+ ctx.runnable(this);
+ }
+
+ // called multiple times
+ function multiple (err) {
+ if (emitted) {
+ return;
+ }
+ emitted = true;
+ self.emit('error', err || new Error('done() called multiple times; stacktrace may be inaccurate'));
+ }
+
+ // finished
+ function done (err) {
+ var ms = self.timeout();
+ if (self.timedOut) {
+ return;
+ }
+ if (finished) {
+ return multiple(err || self._trace);
+ }
+
+ self.clearTimeout();
+ self.duration = new Date() - start;
+ finished = true;
+ if (!err && self.duration > ms && self._enableTimeouts) {
+ err = new Error('Timeout of ' + ms +
+ 'ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.');
+ }
+ fn(err);
+ }
+
+ // for .resetTimeout()
+ this.callback = done;
+
+ // explicit async with `done` argument
+ if (this.async) {
+ this.resetTimeout();
+
+ // allows skip() to be used in an explicit async context
+ this.skip = function asyncSkip () {
+ done(new Pending('async skip call'));
+ // halt execution. the Runnable will be marked pending
+ // by the previous call, and the uncaught handler will ignore
+ // the failure.
+ throw new Pending('async skip; aborting execution');
+ };
+
+ if (this.allowUncaught) {
+ return callFnAsync(this.fn);
+ }
+ try {
+ callFnAsync(this.fn);
+ } catch (err) {
+ emitted = true;
+ done(utils.getError(err));
+ }
+ return;
+ }
+
+ if (this.allowUncaught) {
+ if (this.isPending()) {
+ done();
+ } else {
+ callFn(this.fn);
+ }
+ return;
+ }
+
+ // sync or promise-returning
+ try {
+ if (this.isPending()) {
+ done();
+ } else {
+ callFn(this.fn);
+ }
+ } catch (err) {
+ emitted = true;
+ done(utils.getError(err));
+ }
+
+ function callFn (fn) {
+ var result = fn.call(ctx);
+ if (result && typeof result.then === 'function') {
+ self.resetTimeout();
+ result
+ .then(function () {
+ done();
+ // Return null so libraries like bluebird do not warn about
+ // subsequently constructed Promises.
+ return null;
+ },
+ function (reason) {
+ done(reason || new Error('Promise rejected with no or falsy reason'));
+ });
+ } else {
+ if (self.asyncOnly) {
+ return done(new Error('--async-only option in use without declaring `done()` or returning a promise'));
+ }
+
+ done();
+ }
+ }
+
+ function callFnAsync (fn) {
+ var result = fn.call(ctx, function (err) {
+ if (err instanceof Error || toString.call(err) === '[object Error]') {
+ return done(err);
+ }
+ if (err) {
+ if (Object.prototype.toString.call(err) === '[object Object]') {
+ return done(new Error('done() invoked with non-Error: ' +
+ JSON.stringify(err)));
+ }
+ return done(new Error('done() invoked with non-Error: ' + err));
+ }
+ if (result && utils.isPromise(result)) {
+ return done(new Error('Resolution method is overspecified. Specify a callback *or* return a Promise; not both.'));
+ }
+
+ done();
+ });
+ }
+};
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./ms":15,"./pending":16,"./utils":38,"debug":2,"events":3,"json3":69,"lodash.create":75}],34:[function(require,module,exports){
+(function (process,global){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var EventEmitter = require('events').EventEmitter;
+var Pending = require('./pending');
+var utils = require('./utils');
+var inherits = utils.inherits;
+var debug = require('debug')('mocha:runner');
+var Runnable = require('./runnable');
+var filter = utils.filter;
+var indexOf = utils.indexOf;
+var some = utils.some;
+var keys = utils.keys;
+var stackFilter = utils.stackTraceFilter();
+var stringify = utils.stringify;
+var type = utils.type;
+var undefinedError = utils.undefinedError;
+var isArray = utils.isArray;
+
+/**
+ * Non-enumerable globals.
+ */
+
+var globals = [
+ 'setTimeout',
+ 'clearTimeout',
+ 'setInterval',
+ 'clearInterval',
+ 'XMLHttpRequest',
+ 'Date',
+ 'setImmediate',
+ 'clearImmediate'
+];
+
+/**
+ * Expose `Runner`.
+ */
+
+module.exports = Runner;
+
+/**
+ * Initialize a `Runner` for the given `suite`.
+ *
+ * Events:
+ *
+ * - `start` execution started
+ * - `end` execution complete
+ * - `suite` (suite) test suite execution started
+ * - `suite end` (suite) all tests (and sub-suites) have finished
+ * - `test` (test) test execution started
+ * - `test end` (test) test completed
+ * - `hook` (hook) hook execution started
+ * - `hook end` (hook) hook complete
+ * - `pass` (test) test passed
+ * - `fail` (test, err) test failed
+ * - `pending` (test) test pending
+ *
+ * @api public
+ * @param {Suite} suite Root suite
+ * @param {boolean} [delay] Whether or not to delay execution of root suite
+ * until ready.
+ */
+function Runner (suite, delay) {
+ var self = this;
+ this._globals = [];
+ this._abort = false;
+ this._delay = delay;
+ this.suite = suite;
+ this.started = false;
+ this.total = suite.total();
+ this.failures = 0;
+ this.on('test end', function (test) {
+ self.checkGlobals(test);
+ });
+ this.on('hook end', function (hook) {
+ self.checkGlobals(hook);
+ });
+ this._defaultGrep = /.*/;
+ this.grep(this._defaultGrep);
+ this.globals(this.globalProps().concat(extraGlobals()));
+}
+
+/**
+ * Wrapper for setImmediate, process.nextTick, or browser polyfill.
+ *
+ * @param {Function} fn
+ * @api private
+ */
+Runner.immediately = global.setImmediate || process.nextTick;
+
+/**
+ * Inherit from `EventEmitter.prototype`.
+ */
+inherits(Runner, EventEmitter);
+
+/**
+ * Run tests with full titles matching `re`. Updates runner.total
+ * with number of tests matched.
+ *
+ * @param {RegExp} re
+ * @param {Boolean} invert
+ * @return {Runner} for chaining
+ * @api public
+ * @param {RegExp} re
+ * @param {boolean} invert
+ * @return {Runner} Runner instance.
+ */
+Runner.prototype.grep = function (re, invert) {
+ debug('grep %s', re);
+ this._grep = re;
+ this._invert = invert;
+ this.total = this.grepTotal(this.suite);
+ return this;
+};
+
+/**
+ * Returns the number of tests matching the grep search for the
+ * given suite.
+ *
+ * @param {Suite} suite
+ * @return {Number}
+ * @api public
+ * @param {Suite} suite
+ * @return {number}
+ */
+Runner.prototype.grepTotal = function (suite) {
+ var self = this;
+ var total = 0;
+
+ suite.eachTest(function (test) {
+ var match = self._grep.test(test.fullTitle());
+ if (self._invert) {
+ match = !match;
+ }
+ if (match) {
+ total++;
+ }
+ });
+
+ return total;
+};
+
+/**
+ * Return a list of global properties.
+ *
+ * @return {Array}
+ * @api private
+ */
+Runner.prototype.globalProps = function () {
+ var props = keys(global);
+
+ // non-enumerables
+ for (var i = 0; i < globals.length; ++i) {
+ if (~indexOf(props, globals[i])) {
+ continue;
+ }
+ props.push(globals[i]);
+ }
+
+ return props;
+};
+
+/**
+ * Allow the given `arr` of globals.
+ *
+ * @param {Array} arr
+ * @return {Runner} for chaining
+ * @api public
+ * @param {Array} arr
+ * @return {Runner} Runner instance.
+ */
+Runner.prototype.globals = function (arr) {
+ if (!arguments.length) {
+ return this._globals;
+ }
+ debug('globals %j', arr);
+ this._globals = this._globals.concat(arr);
+ return this;
+};
+
+/**
+ * Check for global variable leaks.
+ *
+ * @api private
+ */
+Runner.prototype.checkGlobals = function (test) {
+ if (this.ignoreLeaks) {
+ return;
+ }
+ var ok = this._globals;
+
+ var globals = this.globalProps();
+ var leaks;
+
+ if (test) {
+ ok = ok.concat(test._allowedGlobals || []);
+ }
+
+ if (this.prevGlobalsLength === globals.length) {
+ return;
+ }
+ this.prevGlobalsLength = globals.length;
+
+ leaks = filterLeaks(ok, globals);
+ this._globals = this._globals.concat(leaks);
+
+ if (leaks.length > 1) {
+ this.fail(test, new Error('global leaks detected: ' + leaks.join(', ') + ''));
+ } else if (leaks.length) {
+ this.fail(test, new Error('global leak detected: ' + leaks[0]));
+ }
+};
+
+/**
+ * Fail the given `test`.
+ *
+ * @api private
+ * @param {Test} test
+ * @param {Error} err
+ */
+Runner.prototype.fail = function (test, err) {
+ if (test.isPending()) {
+ return;
+ }
+
+ ++this.failures;
+ test.state = 'failed';
+
+ if (!(err instanceof Error || err && typeof err.message === 'string')) {
+ err = new Error('the ' + type(err) + ' ' + stringify(err) + ' was thrown, throw an Error :)');
+ }
+
+ try {
+ err.stack = (this.fullStackTrace || !err.stack)
+ ? err.stack
+ : stackFilter(err.stack);
+ } catch (ignored) {
+ // some environments do not take kindly to monkeying with the stack
+ }
+
+ this.emit('fail', test, err);
+};
+
+/**
+ * Fail the given `hook` with `err`.
+ *
+ * Hook failures work in the following pattern:
+ * - If bail, then exit
+ * - Failed `before` hook skips all tests in a suite and subsuites,
+ * but jumps to corresponding `after` hook
+ * - Failed `before each` hook skips remaining tests in a
+ * suite and jumps to corresponding `after each` hook,
+ * which is run only once
+ * - Failed `after` hook does not alter
+ * execution order
+ * - Failed `after each` hook skips remaining tests in a
+ * suite and subsuites, but executes other `after each`
+ * hooks
+ *
+ * @api private
+ * @param {Hook} hook
+ * @param {Error} err
+ */
+Runner.prototype.failHook = function (hook, err) {
+ if (hook.ctx && hook.ctx.currentTest) {
+ hook.originalTitle = hook.originalTitle || hook.title;
+ hook.title = hook.originalTitle + ' for "' + hook.ctx.currentTest.title + '"';
+ }
+
+ this.fail(hook, err);
+ if (this.suite.bail()) {
+ this.emit('end');
+ }
+};
+
+/**
+ * Run hook `name` callbacks and then invoke `fn()`.
+ *
+ * @api private
+ * @param {string} name
+ * @param {Function} fn
+ */
+
+Runner.prototype.hook = function (name, fn) {
+ var suite = this.suite;
+ var hooks = suite['_' + name];
+ var self = this;
+
+ function next (i) {
+ var hook = hooks[i];
+ if (!hook) {
+ return fn();
+ }
+ self.currentRunnable = hook;
+
+ hook.ctx.currentTest = self.test;
+
+ self.emit('hook', hook);
+
+ if (!hook.listeners('error').length) {
+ hook.on('error', function (err) {
+ self.failHook(hook, err);
+ });
+ }
+
+ hook.run(function (err) {
+ var testError = hook.error();
+ if (testError) {
+ self.fail(self.test, testError);
+ }
+ if (err) {
+ if (err instanceof Pending) {
+ if (name === 'beforeEach' || name === 'afterEach') {
+ self.test.pending = true;
+ } else {
+ utils.forEach(suite.tests, function (test) {
+ test.pending = true;
+ });
+ // a pending hook won't be executed twice.
+ hook.pending = true;
+ }
+ } else {
+ self.failHook(hook, err);
+
+ // stop executing hooks, notify callee of hook err
+ return fn(err);
+ }
+ }
+ self.emit('hook end', hook);
+ delete hook.ctx.currentTest;
+ next(++i);
+ });
+ }
+
+ Runner.immediately(function () {
+ next(0);
+ });
+};
+
+/**
+ * Run hook `name` for the given array of `suites`
+ * in order, and callback `fn(err, errSuite)`.
+ *
+ * @api private
+ * @param {string} name
+ * @param {Array} suites
+ * @param {Function} fn
+ */
+Runner.prototype.hooks = function (name, suites, fn) {
+ var self = this;
+ var orig = this.suite;
+
+ function next (suite) {
+ self.suite = suite;
+
+ if (!suite) {
+ self.suite = orig;
+ return fn();
+ }
+
+ self.hook(name, function (err) {
+ if (err) {
+ var errSuite = self.suite;
+ self.suite = orig;
+ return fn(err, errSuite);
+ }
+
+ next(suites.pop());
+ });
+ }
+
+ next(suites.pop());
+};
+
+/**
+ * Run hooks from the top level down.
+ *
+ * @param {String} name
+ * @param {Function} fn
+ * @api private
+ */
+Runner.prototype.hookUp = function (name, fn) {
+ var suites = [this.suite].concat(this.parents()).reverse();
+ this.hooks(name, suites, fn);
+};
+
+/**
+ * Run hooks from the bottom up.
+ *
+ * @param {String} name
+ * @param {Function} fn
+ * @api private
+ */
+Runner.prototype.hookDown = function (name, fn) {
+ var suites = [this.suite].concat(this.parents());
+ this.hooks(name, suites, fn);
+};
+
+/**
+ * Return an array of parent Suites from
+ * closest to furthest.
+ *
+ * @return {Array}
+ * @api private
+ */
+Runner.prototype.parents = function () {
+ var suite = this.suite;
+ var suites = [];
+ while (suite.parent) {
+ suite = suite.parent;
+ suites.push(suite);
+ }
+ return suites;
+};
+
+/**
+ * Run the current test and callback `fn(err)`.
+ *
+ * @param {Function} fn
+ * @api private
+ */
+Runner.prototype.runTest = function (fn) {
+ var self = this;
+ var test = this.test;
+
+ if (!test) {
+ return;
+ }
+ if (this.asyncOnly) {
+ test.asyncOnly = true;
+ }
+ test.on('error', function (err) {
+ self.fail(test, err);
+ });
+ if (this.allowUncaught) {
+ test.allowUncaught = true;
+ return test.run(fn);
+ }
+ try {
+ test.run(fn);
+ } catch (err) {
+ fn(err);
+ }
+};
+
+/**
+ * Run tests in the given `suite` and invoke the callback `fn()` when complete.
+ *
+ * @api private
+ * @param {Suite} suite
+ * @param {Function} fn
+ */
+Runner.prototype.runTests = function (suite, fn) {
+ var self = this;
+ var tests = suite.tests.slice();
+ var test;
+
+ function hookErr (_, errSuite, after) {
+ // before/after Each hook for errSuite failed:
+ var orig = self.suite;
+
+ // for failed 'after each' hook start from errSuite parent,
+ // otherwise start from errSuite itself
+ self.suite = after ? errSuite.parent : errSuite;
+
+ if (self.suite) {
+ // call hookUp afterEach
+ self.hookUp('afterEach', function (err2, errSuite2) {
+ self.suite = orig;
+ // some hooks may fail even now
+ if (err2) {
+ return hookErr(err2, errSuite2, true);
+ }
+ // report error suite
+ fn(errSuite);
+ });
+ } else {
+ // there is no need calling other 'after each' hooks
+ self.suite = orig;
+ fn(errSuite);
+ }
+ }
+
+ function next (err, errSuite) {
+ // if we bail after first err
+ if (self.failures && suite._bail) {
+ return fn();
+ }
+
+ if (self._abort) {
+ return fn();
+ }
+
+ if (err) {
+ return hookErr(err, errSuite, true);
+ }
+
+ // next test
+ test = tests.shift();
+
+ // all done
+ if (!test) {
+ return fn();
+ }
+
+ // grep
+ var match = self._grep.test(test.fullTitle());
+ if (self._invert) {
+ match = !match;
+ }
+ if (!match) {
+ // Run immediately only if we have defined a grep. When we
+ // define a grep — It can cause maximum callstack error if
+ // the grep is doing a large recursive loop by neglecting
+ // all tests. The run immediately function also comes with
+ // a performance cost. So we don't want to run immediately
+ // if we run the whole test suite, because running the whole
+ // test suite don't do any immediate recursive loops. Thus,
+ // allowing a JS runtime to breathe.
+ if (self._grep !== self._defaultGrep) {
+ Runner.immediately(next);
+ } else {
+ next();
+ }
+ return;
+ }
+
+ if (test.isPending()) {
+ self.emit('pending', test);
+ self.emit('test end', test);
+ return next();
+ }
+
+ // execute test and hook(s)
+ self.emit('test', self.test = test);
+ self.hookDown('beforeEach', function (err, errSuite) {
+ if (test.isPending()) {
+ self.emit('pending', test);
+ self.emit('test end', test);
+ return next();
+ }
+ if (err) {
+ return hookErr(err, errSuite, false);
+ }
+ self.currentRunnable = self.test;
+ self.runTest(function (err) {
+ test = self.test;
+ if (err) {
+ var retry = test.currentRetry();
+ if (err instanceof Pending) {
+ test.pending = true;
+ self.emit('pending', test);
+ } else if (retry < test.retries()) {
+ var clonedTest = test.clone();
+ clonedTest.currentRetry(retry + 1);
+ tests.unshift(clonedTest);
+
+ // Early return + hook trigger so that it doesn't
+ // increment the count wrong
+ return self.hookUp('afterEach', next);
+ } else {
+ self.fail(test, err);
+ }
+ self.emit('test end', test);
+
+ if (err instanceof Pending) {
+ return next();
+ }
+
+ return self.hookUp('afterEach', next);
+ }
+
+ test.state = 'passed';
+ self.emit('pass', test);
+ self.emit('test end', test);
+ self.hookUp('afterEach', next);
+ });
+ });
+ }
+
+ this.next = next;
+ this.hookErr = hookErr;
+ next();
+};
+
+/**
+ * Run the given `suite` and invoke the callback `fn()` when complete.
+ *
+ * @api private
+ * @param {Suite} suite
+ * @param {Function} fn
+ */
+Runner.prototype.runSuite = function (suite, fn) {
+ var i = 0;
+ var self = this;
+ var total = this.grepTotal(suite);
+ var afterAllHookCalled = false;
+
+ debug('run suite %s', suite.fullTitle());
+
+ if (!total || (self.failures && suite._bail)) {
+ return fn();
+ }
+
+ this.emit('suite', this.suite = suite);
+
+ function next (errSuite) {
+ if (errSuite) {
+ // current suite failed on a hook from errSuite
+ if (errSuite === suite) {
+ // if errSuite is current suite
+ // continue to the next sibling suite
+ return done();
+ }
+ // errSuite is among the parents of current suite
+ // stop execution of errSuite and all sub-suites
+ return done(errSuite);
+ }
+
+ if (self._abort) {
+ return done();
+ }
+
+ var curr = suite.suites[i++];
+ if (!curr) {
+ return done();
+ }
+
+ // Avoid grep neglecting large number of tests causing a
+ // huge recursive loop and thus a maximum call stack error.
+ // See comment in `this.runTests()` for more information.
+ if (self._grep !== self._defaultGrep) {
+ Runner.immediately(function () {
+ self.runSuite(curr, next);
+ });
+ } else {
+ self.runSuite(curr, next);
+ }
+ }
+
+ function done (errSuite) {
+ self.suite = suite;
+ self.nextSuite = next;
+
+ if (afterAllHookCalled) {
+ fn(errSuite);
+ } else {
+ // mark that the afterAll block has been called once
+ // and so can be skipped if there is an error in it.
+ afterAllHookCalled = true;
+
+ // remove reference to test
+ delete self.test;
+
+ self.hook('afterAll', function () {
+ self.emit('suite end', suite);
+ fn(errSuite);
+ });
+ }
+ }
+
+ this.nextSuite = next;
+
+ this.hook('beforeAll', function (err) {
+ if (err) {
+ return done();
+ }
+ self.runTests(suite, next);
+ });
+};
+
+/**
+ * Handle uncaught exceptions.
+ *
+ * @param {Error} err
+ * @api private
+ */
+Runner.prototype.uncaught = function (err) {
+ if (err) {
+ debug('uncaught exception %s', err === (function () {
+ return this;
+ }.call(err)) ? (err.message || err) : err);
+ } else {
+ debug('uncaught undefined exception');
+ err = undefinedError();
+ }
+ err.uncaught = true;
+
+ var runnable = this.currentRunnable;
+
+ if (!runnable) {
+ runnable = new Runnable('Uncaught error outside test suite');
+ runnable.parent = this.suite;
+
+ if (this.started) {
+ this.fail(runnable, err);
+ } else {
+ // Can't recover from this failure
+ this.emit('start');
+ this.fail(runnable, err);
+ this.emit('end');
+ }
+
+ return;
+ }
+
+ runnable.clearTimeout();
+
+ // Ignore errors if complete or pending
+ if (runnable.state || runnable.isPending()) {
+ return;
+ }
+ this.fail(runnable, err);
+
+ // recover from test
+ if (runnable.type === 'test') {
+ this.emit('test end', runnable);
+ this.hookUp('afterEach', this.next);
+ return;
+ }
+
+ // recover from hooks
+ if (runnable.type === 'hook') {
+ var errSuite = this.suite;
+ // if hook failure is in afterEach block
+ if (runnable.fullTitle().indexOf('after each') > -1) {
+ return this.hookErr(err, errSuite, true);
+ }
+ // if hook failure is in beforeEach block
+ if (runnable.fullTitle().indexOf('before each') > -1) {
+ return this.hookErr(err, errSuite, false);
+ }
+ // if hook failure is in after or before blocks
+ return this.nextSuite(errSuite);
+ }
+
+ // bail
+ this.emit('end');
+};
+
+/**
+ * Cleans up the references to all the deferred functions
+ * (before/after/beforeEach/afterEach) and tests of a Suite.
+ * These must be deleted otherwise a memory leak can happen,
+ * as those functions may reference variables from closures,
+ * thus those variables can never be garbage collected as long
+ * as the deferred functions exist.
+ *
+ * @param {Suite} suite
+ */
+function cleanSuiteReferences (suite) {
+ function cleanArrReferences (arr) {
+ for (var i = 0; i < arr.length; i++) {
+ delete arr[i].fn;
+ }
+ }
+
+ if (isArray(suite._beforeAll)) {
+ cleanArrReferences(suite._beforeAll);
+ }
+
+ if (isArray(suite._beforeEach)) {
+ cleanArrReferences(suite._beforeEach);
+ }
+
+ if (isArray(suite._afterAll)) {
+ cleanArrReferences(suite._afterAll);
+ }
+
+ if (isArray(suite._afterEach)) {
+ cleanArrReferences(suite._afterEach);
+ }
+
+ for (var i = 0; i < suite.tests.length; i++) {
+ delete suite.tests[i].fn;
+ }
+}
+
+/**
+ * Run the root suite and invoke `fn(failures)`
+ * on completion.
+ *
+ * @param {Function} fn
+ * @return {Runner} for chaining
+ * @api public
+ * @param {Function} fn
+ * @return {Runner} Runner instance.
+ */
+Runner.prototype.run = function (fn) {
+ var self = this;
+ var rootSuite = this.suite;
+
+ // If there is an `only` filter
+ if (this.hasOnly) {
+ filterOnly(rootSuite);
+ }
+
+ fn = fn || function () {};
+
+ function uncaught (err) {
+ self.uncaught(err);
+ }
+
+ function start () {
+ self.started = true;
+ self.emit('start');
+ self.runSuite(rootSuite, function () {
+ debug('finished running');
+ self.emit('end');
+ });
+ }
+
+ debug('start');
+
+ // references cleanup to avoid memory leaks
+ this.on('suite end', cleanSuiteReferences);
+
+ // callback
+ this.on('end', function () {
+ if (self.forbidOnly && self.hasOnly) {
+ self.failures += self.stats.tests;
+ }
+ if (self.forbidPending) {
+ self.failures += self.stats.pending;
+ }
+ debug('end');
+ process.removeListener('uncaughtException', uncaught);
+ fn(self.failures);
+ });
+
+ // uncaught exception
+ process.on('uncaughtException', uncaught);
+
+ if (this._delay) {
+ // for reporters, I guess.
+ // might be nice to debounce some dots while we wait.
+ this.emit('waiting', rootSuite);
+ rootSuite.once('run', start);
+ } else {
+ start();
+ }
+
+ return this;
+};
+
+/**
+ * Cleanly abort execution.
+ *
+ * @api public
+ * @return {Runner} Runner instance.
+ */
+Runner.prototype.abort = function () {
+ debug('aborting');
+ this._abort = true;
+
+ return this;
+};
+
+/**
+ * Filter suites based on `isOnly` logic.
+ *
+ * @param {Array} suite
+ * @returns {Boolean}
+ * @api private
+ */
+function filterOnly (suite) {
+ if (suite._onlyTests.length) {
+ // If the suite contains `only` tests, run those and ignore any nested suites.
+ suite.tests = suite._onlyTests;
+ suite.suites = [];
+ } else {
+ // Otherwise, do not run any of the tests in this suite.
+ suite.tests = [];
+ utils.forEach(suite._onlySuites, function (onlySuite) {
+ // If there are other `only` tests/suites nested in the current `only` suite, then filter that `only` suite.
+ // Otherwise, all of the tests on this `only` suite should be run, so don't filter it.
+ if (hasOnly(onlySuite)) {
+ filterOnly(onlySuite);
+ }
+ });
+ // Run the `only` suites, as well as any other suites that have `only` tests/suites as descendants.
+ suite.suites = filter(suite.suites, function (childSuite) {
+ return indexOf(suite._onlySuites, childSuite) !== -1 || filterOnly(childSuite);
+ });
+ }
+ // Keep the suite only if there is something to run
+ return suite.tests.length || suite.suites.length;
+}
+
+/**
+ * Determines whether a suite has an `only` test or suite as a descendant.
+ *
+ * @param {Array} suite
+ * @returns {Boolean}
+ * @api private
+ */
+function hasOnly (suite) {
+ return suite._onlyTests.length || suite._onlySuites.length || some(suite.suites, hasOnly);
+}
+
+/**
+ * Filter leaks with the given globals flagged as `ok`.
+ *
+ * @api private
+ * @param {Array} ok
+ * @param {Array} globals
+ * @return {Array}
+ */
+function filterLeaks (ok, globals) {
+ return filter(globals, function (key) {
+ // Firefox and Chrome exposes iframes as index inside the window object
+ if (/^\d+/.test(key)) {
+ return false;
+ }
+
+ // in firefox
+ // if runner runs in an iframe, this iframe's window.getInterface method
+ // not init at first it is assigned in some seconds
+ if (global.navigator && (/^getInterface/).test(key)) {
+ return false;
+ }
+
+ // an iframe could be approached by window[iframeIndex]
+ // in ie6,7,8 and opera, iframeIndex is enumerable, this could cause leak
+ if (global.navigator && (/^\d+/).test(key)) {
+ return false;
+ }
+
+ // Opera and IE expose global variables for HTML element IDs (issue #243)
+ if (/^mocha-/.test(key)) {
+ return false;
+ }
+
+ var matched = filter(ok, function (ok) {
+ if (~ok.indexOf('*')) {
+ return key.indexOf(ok.split('*')[0]) === 0;
+ }
+ return key === ok;
+ });
+ return !matched.length && (!global.navigator || key !== 'onerror');
+ });
+}
+
+/**
+ * Array of globals dependent on the environment.
+ *
+ * @return {Array}
+ * @api private
+ */
+function extraGlobals () {
+ if (typeof process === 'object' && typeof process.version === 'string') {
+ var parts = process.version.split('.');
+ var nodeVersion = utils.reduce(parts, function (a, v) {
+ return a << 8 | v;
+ });
+
+ // 'errno' was renamed to process._errno in v0.9.11.
+
+ if (nodeVersion < 0x00090B) {
+ return ['errno'];
+ }
+ }
+
+ return [];
+}
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./pending":16,"./runnable":33,"./utils":38,"_process":82,"debug":2,"events":3}],35:[function(require,module,exports){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var EventEmitter = require('events').EventEmitter;
+var Hook = require('./hook');
+var utils = require('./utils');
+var inherits = utils.inherits;
+var debug = require('debug')('mocha:suite');
+var milliseconds = require('./ms');
+
+/**
+ * Expose `Suite`.
+ */
+
+exports = module.exports = Suite;
+
+/**
+ * Create a new `Suite` with the given `title` and parent `Suite`. When a suite
+ * with the same title is already present, that suite is returned to provide
+ * nicer reporter and more flexible meta-testing.
+ *
+ * @api public
+ * @param {Suite} parent
+ * @param {string} title
+ * @return {Suite}
+ */
+exports.create = function (parent, title) {
+ var suite = new Suite(title, parent.ctx);
+ suite.parent = parent;
+ title = suite.fullTitle();
+ parent.addSuite(suite);
+ return suite;
+};
+
+/**
+ * Initialize a new `Suite` with the given `title` and `ctx`.
+ *
+ * @api private
+ * @param {string} title
+ * @param {Context} parentContext
+ */
+function Suite (title, parentContext) {
+ if (!utils.isString(title)) {
+ throw new Error('Suite `title` should be a "string" but "' + typeof title + '" was given instead.');
+ }
+ this.title = title;
+ function Context () {}
+ Context.prototype = parentContext;
+ this.ctx = new Context();
+ this.suites = [];
+ this.tests = [];
+ this.pending = false;
+ this._beforeEach = [];
+ this._beforeAll = [];
+ this._afterEach = [];
+ this._afterAll = [];
+ this.root = !title;
+ this._timeout = 2000;
+ this._enableTimeouts = true;
+ this._slow = 75;
+ this._bail = false;
+ this._retries = -1;
+ this._onlyTests = [];
+ this._onlySuites = [];
+ this.delayed = false;
+}
+
+/**
+ * Inherit from `EventEmitter.prototype`.
+ */
+inherits(Suite, EventEmitter);
+
+/**
+ * Return a clone of this `Suite`.
+ *
+ * @api private
+ * @return {Suite}
+ */
+Suite.prototype.clone = function () {
+ var suite = new Suite(this.title);
+ debug('clone');
+ suite.ctx = this.ctx;
+ suite.timeout(this.timeout());
+ suite.retries(this.retries());
+ suite.enableTimeouts(this.enableTimeouts());
+ suite.slow(this.slow());
+ suite.bail(this.bail());
+ return suite;
+};
+
+/**
+ * Set timeout `ms` or short-hand such as "2s".
+ *
+ * @api private
+ * @param {number|string} ms
+ * @return {Suite|number} for chaining
+ */
+Suite.prototype.timeout = function (ms) {
+ if (!arguments.length) {
+ return this._timeout;
+ }
+ if (ms.toString() === '0') {
+ this._enableTimeouts = false;
+ }
+ if (typeof ms === 'string') {
+ ms = milliseconds(ms);
+ }
+ debug('timeout %d', ms);
+ this._timeout = parseInt(ms, 10);
+ return this;
+};
+
+/**
+ * Set number of times to retry a failed test.
+ *
+ * @api private
+ * @param {number|string} n
+ * @return {Suite|number} for chaining
+ */
+Suite.prototype.retries = function (n) {
+ if (!arguments.length) {
+ return this._retries;
+ }
+ debug('retries %d', n);
+ this._retries = parseInt(n, 10) || 0;
+ return this;
+};
+
+/**
+ * Set timeout to `enabled`.
+ *
+ * @api private
+ * @param {boolean} enabled
+ * @return {Suite|boolean} self or enabled
+ */
+Suite.prototype.enableTimeouts = function (enabled) {
+ if (!arguments.length) {
+ return this._enableTimeouts;
+ }
+ debug('enableTimeouts %s', enabled);
+ this._enableTimeouts = enabled;
+ return this;
+};
+
+/**
+ * Set slow `ms` or short-hand such as "2s".
+ *
+ * @api private
+ * @param {number|string} ms
+ * @return {Suite|number} for chaining
+ */
+Suite.prototype.slow = function (ms) {
+ if (!arguments.length) {
+ return this._slow;
+ }
+ if (typeof ms === 'string') {
+ ms = milliseconds(ms);
+ }
+ debug('slow %d', ms);
+ this._slow = ms;
+ return this;
+};
+
+/**
+ * Sets whether to bail after first error.
+ *
+ * @api private
+ * @param {boolean} bail
+ * @return {Suite|number} for chaining
+ */
+Suite.prototype.bail = function (bail) {
+ if (!arguments.length) {
+ return this._bail;
+ }
+ debug('bail %s', bail);
+ this._bail = bail;
+ return this;
+};
+
+/**
+ * Check if this suite or its parent suite is marked as pending.
+ *
+ * @api private
+ */
+Suite.prototype.isPending = function () {
+ return this.pending || (this.parent && this.parent.isPending());
+};
+
+/**
+ * Run `fn(test[, done])` before running tests.
+ *
+ * @api private
+ * @param {string} title
+ * @param {Function} fn
+ * @return {Suite} for chaining
+ */
+Suite.prototype.beforeAll = function (title, fn) {
+ if (this.isPending()) {
+ return this;
+ }
+ if (typeof title === 'function') {
+ fn = title;
+ title = fn.name;
+ }
+ title = '"before all" hook' + (title ? ': ' + title : '');
+
+ var hook = new Hook(title, fn);
+ hook.parent = this;
+ hook.timeout(this.timeout());
+ hook.retries(this.retries());
+ hook.enableTimeouts(this.enableTimeouts());
+ hook.slow(this.slow());
+ hook.ctx = this.ctx;
+ this._beforeAll.push(hook);
+ this.emit('beforeAll', hook);
+ return this;
+};
+
+/**
+ * Run `fn(test[, done])` after running tests.
+ *
+ * @api private
+ * @param {string} title
+ * @param {Function} fn
+ * @return {Suite} for chaining
+ */
+Suite.prototype.afterAll = function (title, fn) {
+ if (this.isPending()) {
+ return this;
+ }
+ if (typeof title === 'function') {
+ fn = title;
+ title = fn.name;
+ }
+ title = '"after all" hook' + (title ? ': ' + title : '');
+
+ var hook = new Hook(title, fn);
+ hook.parent = this;
+ hook.timeout(this.timeout());
+ hook.retries(this.retries());
+ hook.enableTimeouts(this.enableTimeouts());
+ hook.slow(this.slow());
+ hook.ctx = this.ctx;
+ this._afterAll.push(hook);
+ this.emit('afterAll', hook);
+ return this;
+};
+
+/**
+ * Run `fn(test[, done])` before each test case.
+ *
+ * @api private
+ * @param {string} title
+ * @param {Function} fn
+ * @return {Suite} for chaining
+ */
+Suite.prototype.beforeEach = function (title, fn) {
+ if (this.isPending()) {
+ return this;
+ }
+ if (typeof title === 'function') {
+ fn = title;
+ title = fn.name;
+ }
+ title = '"before each" hook' + (title ? ': ' + title : '');
+
+ var hook = new Hook(title, fn);
+ hook.parent = this;
+ hook.timeout(this.timeout());
+ hook.retries(this.retries());
+ hook.enableTimeouts(this.enableTimeouts());
+ hook.slow(this.slow());
+ hook.ctx = this.ctx;
+ this._beforeEach.push(hook);
+ this.emit('beforeEach', hook);
+ return this;
+};
+
+/**
+ * Run `fn(test[, done])` after each test case.
+ *
+ * @api private
+ * @param {string} title
+ * @param {Function} fn
+ * @return {Suite} for chaining
+ */
+Suite.prototype.afterEach = function (title, fn) {
+ if (this.isPending()) {
+ return this;
+ }
+ if (typeof title === 'function') {
+ fn = title;
+ title = fn.name;
+ }
+ title = '"after each" hook' + (title ? ': ' + title : '');
+
+ var hook = new Hook(title, fn);
+ hook.parent = this;
+ hook.timeout(this.timeout());
+ hook.retries(this.retries());
+ hook.enableTimeouts(this.enableTimeouts());
+ hook.slow(this.slow());
+ hook.ctx = this.ctx;
+ this._afterEach.push(hook);
+ this.emit('afterEach', hook);
+ return this;
+};
+
+/**
+ * Add a test `suite`.
+ *
+ * @api private
+ * @param {Suite} suite
+ * @return {Suite} for chaining
+ */
+Suite.prototype.addSuite = function (suite) {
+ suite.parent = this;
+ suite.timeout(this.timeout());
+ suite.retries(this.retries());
+ suite.enableTimeouts(this.enableTimeouts());
+ suite.slow(this.slow());
+ suite.bail(this.bail());
+ this.suites.push(suite);
+ this.emit('suite', suite);
+ return this;
+};
+
+/**
+ * Add a `test` to this suite.
+ *
+ * @api private
+ * @param {Test} test
+ * @return {Suite} for chaining
+ */
+Suite.prototype.addTest = function (test) {
+ test.parent = this;
+ test.timeout(this.timeout());
+ test.retries(this.retries());
+ test.enableTimeouts(this.enableTimeouts());
+ test.slow(this.slow());
+ test.ctx = this.ctx;
+ this.tests.push(test);
+ this.emit('test', test);
+ return this;
+};
+
+/**
+ * Return the full title generated by recursively concatenating the parent's
+ * full title.
+ *
+ * @api public
+ * @return {string}
+ */
+Suite.prototype.fullTitle = function () {
+ if (this.parent) {
+ var full = this.parent.fullTitle();
+ if (full) {
+ return full + ' ' + this.title;
+ }
+ }
+ return this.title;
+};
+
+/**
+ * Return the total number of tests.
+ *
+ * @api public
+ * @return {number}
+ */
+Suite.prototype.total = function () {
+ return utils.reduce(this.suites, function (sum, suite) {
+ return sum + suite.total();
+ }, 0) + this.tests.length;
+};
+
+/**
+ * Iterates through each suite recursively to find all tests. Applies a
+ * function in the format `fn(test)`.
+ *
+ * @api private
+ * @param {Function} fn
+ * @return {Suite}
+ */
+Suite.prototype.eachTest = function (fn) {
+ utils.forEach(this.tests, fn);
+ utils.forEach(this.suites, function (suite) {
+ suite.eachTest(fn);
+ });
+ return this;
+};
+
+/**
+ * This will run the root suite if we happen to be running in delayed mode.
+ */
+Suite.prototype.run = function run () {
+ if (this.root) {
+ this.emit('run');
+ }
+};
+
+},{"./hook":7,"./ms":15,"./utils":38,"debug":2,"events":3}],36:[function(require,module,exports){
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var Runnable = require('./runnable');
+var create = require('lodash.create');
+var isString = require('./utils').isString;
+
+/**
+ * Expose `Test`.
+ */
+
+module.exports = Test;
+
+/**
+ * Initialize a new `Test` with the given `title` and callback `fn`.
+ *
+ * @api private
+ * @param {String} title
+ * @param {Function} fn
+ */
+function Test (title, fn) {
+ if (!isString(title)) {
+ throw new Error('Test `title` should be a "string" but "' + typeof title + '" was given instead.');
+ }
+ Runnable.call(this, title, fn);
+ this.pending = !fn;
+ this.type = 'test';
+}
+
+/**
+ * Inherit from `Runnable.prototype`.
+ */
+Test.prototype = create(Runnable.prototype, {
+ constructor: Test
+});
+
+Test.prototype.clone = function () {
+ var test = new Test(this.title, this.fn);
+ test.timeout(this.timeout());
+ test.slow(this.slow());
+ test.enableTimeouts(this.enableTimeouts());
+ test.retries(this.retries());
+ test.currentRetry(this.currentRetry());
+ test.globals(this.globals());
+ test.parent = this.parent;
+ test.file = this.file;
+ test.ctx = this.ctx;
+ return test;
+};
+
+},{"./runnable":33,"./utils":38,"lodash.create":75}],37:[function(require,module,exports){
+'use strict';
+
+/**
+ * Pad a `number` with a ten's place zero.
+ *
+ * @param {number} number
+ * @return {string}
+ */
+function pad(number) {
+ var n = number.toString();
+ return n.length === 1 ? '0' + n : n;
+}
+
+/**
+ * Turn a `date` into an ISO string.
+ *
+ * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
+ *
+ * @param {Date} date
+ * @return {string}
+ */
+function toISOString(date) {
+ return date.getUTCFullYear()
+ + '-' + pad(date.getUTCMonth() + 1)
+ + '-' + pad(date.getUTCDate())
+ + 'T' + pad(date.getUTCHours())
+ + ':' + pad(date.getUTCMinutes())
+ + ':' + pad(date.getUTCSeconds())
+ + '.' + String((date.getUTCMilliseconds()/1000).toFixed(3)).slice(2, 5)
+ + 'Z';
+}
+
+/*
+ * Exports.
+ */
+
+module.exports = toISOString;
+
+},{}],38:[function(require,module,exports){
+(function (process,Buffer){
+'use strict';
+
+/* eslint-env browser */
+
+/**
+ * Module dependencies.
+ */
+
+var JSON = require('json3');
+var basename = require('path').basename;
+var debug = require('debug')('mocha:watch');
+var exists = require('fs').existsSync || require('path').existsSync;
+var glob = require('glob');
+var path = require('path');
+var join = path.join;
+var readdirSync = require('fs').readdirSync;
+var statSync = require('fs').statSync;
+var watchFile = require('fs').watchFile;
+var lstatSync = require('fs').lstatSync;
+var toISOString = require('./to-iso-string');
+var he = require('he');
+
+/**
+ * Ignored directories.
+ */
+
+var ignore = ['node_modules', '.git'];
+
+exports.inherits = require('util').inherits;
+
+/**
+ * Escape special characters in the given string of html.
+ *
+ * @api private
+ * @param {string} html
+ * @return {string}
+ */
+exports.escape = function (html) {
+ return he.encode(String(html), { useNamedReferences: false });
+};
+
+/**
+ * Array#forEach (<=IE8)
+ *
+ * @api private
+ * @param {Array} arr
+ * @param {Function} fn
+ * @param {Object} scope
+ */
+exports.forEach = function (arr, fn, scope) {
+ for (var i = 0, l = arr.length; i < l; i++) {
+ fn.call(scope, arr[i], i);
+ }
+};
+
+/**
+ * Test if the given obj is type of string.
+ *
+ * @api private
+ * @param {Object} obj
+ * @return {boolean}
+ */
+exports.isString = function (obj) {
+ return typeof obj === 'string';
+};
+
+/**
+ * Array#map (<=IE8)
+ *
+ * @api private
+ * @param {Array} arr
+ * @param {Function} fn
+ * @param {Object} scope
+ * @return {Array}
+ */
+exports.map = function (arr, fn, scope) {
+ var result = [];
+ for (var i = 0, l = arr.length; i < l; i++) {
+ result.push(fn.call(scope, arr[i], i, arr));
+ }
+ return result;
+};
+
+/**
+ * Array#indexOf (<=IE8)
+ *
+ * @api private
+ * @param {Array} arr
+ * @param {Object} obj to find index of
+ * @param {number} start
+ * @return {number}
+ */
+var indexOf = exports.indexOf = function (arr, obj, start) {
+ for (var i = start || 0, l = arr.length; i < l; i++) {
+ if (arr[i] === obj) {
+ return i;
+ }
+ }
+ return -1;
+};
+
+/**
+ * Array#reduce (<=IE8)
+ *
+ * @api private
+ * @param {Array} arr
+ * @param {Function} fn
+ * @param {Object} val Initial value.
+ * @return {*}
+ */
+var reduce = exports.reduce = function (arr, fn, val) {
+ var rval = val;
+
+ for (var i = 0, l = arr.length; i < l; i++) {
+ rval = fn(rval, arr[i], i, arr);
+ }
+
+ return rval;
+};
+
+/**
+ * Array#filter (<=IE8)
+ *
+ * @api private
+ * @param {Array} arr
+ * @param {Function} fn
+ * @return {Array}
+ */
+exports.filter = function (arr, fn) {
+ var ret = [];
+
+ for (var i = 0, l = arr.length; i < l; i++) {
+ var val = arr[i];
+ if (fn(val, i, arr)) {
+ ret.push(val);
+ }
+ }
+
+ return ret;
+};
+
+/**
+ * Array#some (<=IE8)
+ *
+ * @api private
+ * @param {Array} arr
+ * @param {Function} fn
+ * @return {Array}
+ */
+exports.some = function (arr, fn) {
+ for (var i = 0, l = arr.length; i < l; i++) {
+ if (fn(arr[i])) {
+ return true;
+ }
+ }
+ return false;
+};
+
+/**
+ * Object.keys (<=IE8)
+ *
+ * @api private
+ * @param {Object} obj
+ * @return {Array} keys
+ */
+exports.keys = typeof Object.keys === 'function' ? Object.keys : function (obj) {
+ var keys = [];
+ var has = Object.prototype.hasOwnProperty; // for `window` on <=IE8
+
+ for (var key in obj) {
+ if (has.call(obj, key)) {
+ keys.push(key);
+ }
+ }
+
+ return keys;
+};
+
+/**
+ * Watch the given `files` for changes
+ * and invoke `fn(file)` on modification.
+ *
+ * @api private
+ * @param {Array} files
+ * @param {Function} fn
+ */
+exports.watch = function (files, fn) {
+ var options = { interval: 100 };
+ files.forEach(function (file) {
+ debug('file %s', file);
+ watchFile(file, options, function (curr, prev) {
+ if (prev.mtime < curr.mtime) {
+ fn(file);
+ }
+ });
+ });
+};
+
+/**
+ * Array.isArray (<=IE8)
+ *
+ * @api private
+ * @param {Object} obj
+ * @return {Boolean}
+ */
+var isArray = typeof Array.isArray === 'function' ? Array.isArray : function (obj) {
+ return Object.prototype.toString.call(obj) === '[object Array]';
+};
+
+exports.isArray = isArray;
+
+/**
+ * Buffer.prototype.toJSON polyfill.
+ *
+ * @type {Function}
+ */
+if (typeof Buffer !== 'undefined' && Buffer.prototype) {
+ Buffer.prototype.toJSON = Buffer.prototype.toJSON || function () {
+ return Array.prototype.slice.call(this, 0);
+ };
+}
+
+/**
+ * Ignored files.
+ *
+ * @api private
+ * @param {string} path
+ * @return {boolean}
+ */
+function ignored (path) {
+ return !~ignore.indexOf(path);
+}
+
+/**
+ * Lookup files in the given `dir`.
+ *
+ * @api private
+ * @param {string} dir
+ * @param {string[]} [ext=['.js']]
+ * @param {Array} [ret=[]]
+ * @return {Array}
+ */
+exports.files = function (dir, ext, ret) {
+ ret = ret || [];
+ ext = ext || ['js'];
+
+ var re = new RegExp('\\.(' + ext.join('|') + ')$');
+
+ readdirSync(dir)
+ .filter(ignored)
+ .forEach(function (path) {
+ path = join(dir, path);
+ if (lstatSync(path).isDirectory()) {
+ exports.files(path, ext, ret);
+ } else if (path.match(re)) {
+ ret.push(path);
+ }
+ });
+
+ return ret;
+};
+
+/**
+ * Compute a slug from the given `str`.
+ *
+ * @api private
+ * @param {string} str
+ * @return {string}
+ */
+exports.slug = function (str) {
+ return str
+ .toLowerCase()
+ .replace(/ +/g, '-')
+ .replace(/[^-\w]/g, '');
+};
+
+/**
+ * Strip the function definition from `str`, and re-indent for pre whitespace.
+ *
+ * @param {string} str
+ * @return {string}
+ */
+exports.clean = function (str) {
+ str = str
+ .replace(/\r\n?|[\n\u2028\u2029]/g, '\n').replace(/^\uFEFF/, '')
+ // (traditional)-> space/name parameters body (lambda)-> parameters body multi-statement/single keep body content
+ .replace(/^function(?:\s*|\s+[^(]*)\([^)]*\)\s*\{((?:.|\n)*?)\s*\}$|^\([^)]*\)\s*=>\s*(?:\{((?:.|\n)*?)\s*\}|((?:.|\n)*))$/, '$1$2$3');
+
+ var spaces = str.match(/^\n?( *)/)[1].length;
+ var tabs = str.match(/^\n?(\t*)/)[1].length;
+ var re = new RegExp('^\n?' + (tabs ? '\t' : ' ') + '{' + (tabs || spaces) + '}', 'gm');
+
+ str = str.replace(re, '');
+
+ return exports.trim(str);
+};
+
+/**
+ * Trim the given `str`.
+ *
+ * @api private
+ * @param {string} str
+ * @return {string}
+ */
+exports.trim = function (str) {
+ return str.replace(/^\s+|\s+$/g, '');
+};
+
+/**
+ * Parse the given `qs`.
+ *
+ * @api private
+ * @param {string} qs
+ * @return {Object}
+ */
+exports.parseQuery = function (qs) {
+ return reduce(qs.replace('?', '').split('&'), function (obj, pair) {
+ var i = pair.indexOf('=');
+ var key = pair.slice(0, i);
+ var val = pair.slice(++i);
+
+ // Due to how the URLSearchParams API treats spaces
+ obj[key] = decodeURIComponent(val.replace(/\+/g, '%20'));
+
+ return obj;
+ }, {});
+};
+
+/**
+ * Highlight the given string of `js`.
+ *
+ * @api private
+ * @param {string} js
+ * @return {string}
+ */
+function highlight (js) {
+ return js
+ .replace(/</g, '&lt;')
+ .replace(/>/g, '&gt;')
+ .replace(/\/\/(.*)/gm, '<span class="comment">//$1</span>')
+ .replace(/('.*?')/gm, '<span class="string">$1</span>')
+ .replace(/(\d+\.\d+)/gm, '<span class="number">$1</span>')
+ .replace(/(\d+)/gm, '<span class="number">$1</span>')
+ .replace(/\bnew[ \t]+(\w+)/gm, '<span class="keyword">new</span> <span class="init">$1</span>')
+ .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '<span class="keyword">$1</span>');
+}
+
+/**
+ * Highlight the contents of tag `name`.
+ *
+ * @api private
+ * @param {string} name
+ */
+exports.highlightTags = function (name) {
+ var code = document.getElementById('mocha').getElementsByTagName(name);
+ for (var i = 0, len = code.length; i < len; ++i) {
+ code[i].innerHTML = highlight(code[i].innerHTML);
+ }
+};
+
+/**
+ * If a value could have properties, and has none, this function is called,
+ * which returns a string representation of the empty value.
+ *
+ * Functions w/ no properties return `'[Function]'`
+ * Arrays w/ length === 0 return `'[]'`
+ * Objects w/ no properties return `'{}'`
+ * All else: return result of `value.toString()`
+ *
+ * @api private
+ * @param {*} value The value to inspect.
+ * @param {string} typeHint The type of the value
+ * @returns {string}
+ */
+function emptyRepresentation (value, typeHint) {
+ switch (typeHint) {
+ case 'function':
+ return '[Function]';
+ case 'object':
+ return '{}';
+ case 'array':
+ return '[]';
+ default:
+ return value.toString();
+ }
+}
+
+/**
+ * Takes some variable and asks `Object.prototype.toString()` what it thinks it
+ * is.
+ *
+ * @api private
+ * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
+ * @param {*} value The value to test.
+ * @returns {string} Computed type
+ * @example
+ * type({}) // 'object'
+ * type([]) // 'array'
+ * type(1) // 'number'
+ * type(false) // 'boolean'
+ * type(Infinity) // 'number'
+ * type(null) // 'null'
+ * type(new Date()) // 'date'
+ * type(/foo/) // 'regexp'
+ * type('type') // 'string'
+ * type(global) // 'global'
+ * type(new String('foo') // 'object'
+ */
+var type = exports.type = function type (value) {
+ if (value === undefined) {
+ return 'undefined';
+ } else if (value === null) {
+ return 'null';
+ } else if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {
+ return 'buffer';
+ }
+ return Object.prototype.toString.call(value)
+ .replace(/^\[.+\s(.+?)]$/, '$1')
+ .toLowerCase();
+};
+
+/**
+ * Stringify `value`. Different behavior depending on type of value:
+ *
+ * - If `value` is undefined or null, return `'[undefined]'` or `'[null]'`, respectively.
+ * - If `value` is not an object, function or array, return result of `value.toString()` wrapped in double-quotes.
+ * - If `value` is an *empty* object, function, or array, return result of function
+ * {@link emptyRepresentation}.
+ * - If `value` has properties, call {@link exports.canonicalize} on it, then return result of
+ * JSON.stringify().
+ *
+ * @api private
+ * @see exports.type
+ * @param {*} value
+ * @return {string}
+ */
+exports.stringify = function (value) {
+ var typeHint = type(value);
+
+ if (!~indexOf(['object', 'array', 'function'], typeHint)) {
+ if (typeHint === 'buffer') {
+ var json = value.toJSON();
+ // Based on the toJSON result
+ return jsonStringify(json.data && json.type ? json.data : json, 2)
+ .replace(/,(\n|$)/g, '$1');
+ }
+
+ // IE7/IE8 has a bizarre String constructor; needs to be coerced
+ // into an array and back to obj.
+ if (typeHint === 'string' && typeof value === 'object') {
+ value = reduce(value.split(''), function (acc, char, idx) {
+ acc[idx] = char;
+ return acc;
+ }, {});
+ typeHint = 'object';
+ } else {
+ return jsonStringify(value);
+ }
+ }
+
+ for (var prop in value) {
+ if (Object.prototype.hasOwnProperty.call(value, prop)) {
+ return jsonStringify(exports.canonicalize(value, null, typeHint), 2).replace(/,(\n|$)/g, '$1');
+ }
+ }
+
+ return emptyRepresentation(value, typeHint);
+};
+
+/**
+ * like JSON.stringify but more sense.
+ *
+ * @api private
+ * @param {Object} object
+ * @param {number=} spaces
+ * @param {number=} depth
+ * @returns {*}
+ */
+function jsonStringify (object, spaces, depth) {
+ if (typeof spaces === 'undefined') {
+ // primitive types
+ return _stringify(object);
+ }
+
+ depth = depth || 1;
+ var space = spaces * depth;
+ var str = isArray(object) ? '[' : '{';
+ var end = isArray(object) ? ']' : '}';
+ var length = typeof object.length === 'number' ? object.length : exports.keys(object).length;
+ // `.repeat()` polyfill
+ function repeat (s, n) {
+ return new Array(n).join(s);
+ }
+
+ function _stringify (val) {
+ switch (type(val)) {
+ case 'null':
+ case 'undefined':
+ val = '[' + val + ']';
+ break;
+ case 'array':
+ case 'object':
+ val = jsonStringify(val, spaces, depth + 1);
+ break;
+ case 'boolean':
+ case 'regexp':
+ case 'symbol':
+ case 'number':
+ val = val === 0 && (1 / val) === -Infinity // `-0`
+ ? '-0'
+ : val.toString();
+ break;
+ case 'date':
+ var sDate;
+ if (isNaN(val.getTime())) { // Invalid date
+ sDate = val.toString();
+ } else {
+ sDate = val.toISOString ? val.toISOString() : toISOString(val);
+ }
+ val = '[Date: ' + sDate + ']';
+ break;
+ case 'buffer':
+ var json = val.toJSON();
+ // Based on the toJSON result
+ json = json.data && json.type ? json.data : json;
+ val = '[Buffer: ' + jsonStringify(json, 2, depth + 1) + ']';
+ break;
+ default:
+ val = (val === '[Function]' || val === '[Circular]')
+ ? val
+ : JSON.stringify(val); // string
+ }
+ return val;
+ }
+
+ for (var i in object) {
+ if (!Object.prototype.hasOwnProperty.call(object, i)) {
+ continue; // not my business
+ }
+ --length;
+ str += '\n ' + repeat(' ', space) +
+ (isArray(object) ? '' : '"' + i + '": ') + // key
+ _stringify(object[i]) + // value
+ (length ? ',' : ''); // comma
+ }
+
+ return str +
+ // [], {}
+ (str.length !== 1 ? '\n' + repeat(' ', --space) + end : end);
+}
+
+/**
+ * Test if a value is a buffer.
+ *
+ * @api private
+ * @param {*} value The value to test.
+ * @return {boolean} True if `value` is a buffer, otherwise false
+ */
+exports.isBuffer = function (value) {
+ return typeof Buffer !== 'undefined' && Buffer.isBuffer(value);
+};
+
+/**
+ * Return a new Thing that has the keys in sorted order. Recursive.
+ *
+ * If the Thing...
+ * - has already been seen, return string `'[Circular]'`
+ * - is `undefined`, return string `'[undefined]'`
+ * - is `null`, return value `null`
+ * - is some other primitive, return the value
+ * - is not a primitive or an `Array`, `Object`, or `Function`, return the value of the Thing's `toString()` method
+ * - is a non-empty `Array`, `Object`, or `Function`, return the result of calling this function again.
+ * - is an empty `Array`, `Object`, or `Function`, return the result of calling `emptyRepresentation()`
+ *
+ * @api private
+ * @see {@link exports.stringify}
+ * @param {*} value Thing to inspect. May or may not have properties.
+ * @param {Array} [stack=[]] Stack of seen values
+ * @param {string} [typeHint] Type hint
+ * @return {(Object|Array|Function|string|undefined)}
+ */
+exports.canonicalize = function canonicalize (value, stack, typeHint) {
+ var canonicalizedObj;
+ /* eslint-disable no-unused-vars */
+ var prop;
+ /* eslint-enable no-unused-vars */
+ typeHint = typeHint || type(value);
+ function withStack (value, fn) {
+ stack.push(value);
+ fn();
+ stack.pop();
+ }
+
+ stack = stack || [];
+
+ if (indexOf(stack, value) !== -1) {
+ return '[Circular]';
+ }
+
+ switch (typeHint) {
+ case 'undefined':
+ case 'buffer':
+ case 'null':
+ canonicalizedObj = value;
+ break;
+ case 'array':
+ withStack(value, function () {
+ canonicalizedObj = exports.map(value, function (item) {
+ return exports.canonicalize(item, stack);
+ });
+ });
+ break;
+ case 'function':
+ /* eslint-disable guard-for-in */
+ for (prop in value) {
+ canonicalizedObj = {};
+ break;
+ }
+ /* eslint-enable guard-for-in */
+ if (!canonicalizedObj) {
+ canonicalizedObj = emptyRepresentation(value, typeHint);
+ break;
+ }
+ /* falls through */
+ case 'object':
+ canonicalizedObj = canonicalizedObj || {};
+ withStack(value, function () {
+ exports.forEach(exports.keys(value).sort(), function (key) {
+ canonicalizedObj[key] = exports.canonicalize(value[key], stack);
+ });
+ });
+ break;
+ case 'date':
+ case 'number':
+ case 'regexp':
+ case 'boolean':
+ case 'symbol':
+ canonicalizedObj = value;
+ break;
+ default:
+ canonicalizedObj = value + '';
+ }
+
+ return canonicalizedObj;
+};
+
+/**
+ * Lookup file names at the given `path`.
+ *
+ * @api public
+ * @param {string} path Base path to start searching from.
+ * @param {string[]} extensions File extensions to look for.
+ * @param {boolean} recursive Whether or not to recurse into subdirectories.
+ * @return {string[]} An array of paths.
+ */
+exports.lookupFiles = function lookupFiles (path, extensions, recursive) {
+ var files = [];
+ var re = new RegExp('\\.(' + extensions.join('|') + ')$');
+
+ if (!exists(path)) {
+ if (exists(path + '.js')) {
+ path += '.js';
+ } else {
+ files = glob.sync(path);
+ if (!files.length) {
+ throw new Error("cannot resolve path (or pattern) '" + path + "'");
+ }
+ return files;
+ }
+ }
+
+ try {
+ var stat = statSync(path);
+ if (stat.isFile()) {
+ return path;
+ }
+ } catch (err) {
+ // ignore error
+ return;
+ }
+
+ readdirSync(path).forEach(function (file) {
+ file = join(path, file);
+ try {
+ var stat = statSync(file);
+ if (stat.isDirectory()) {
+ if (recursive) {
+ files = files.concat(lookupFiles(file, extensions, recursive));
+ }
+ return;
+ }
+ } catch (err) {
+ // ignore error
+ return;
+ }
+ if (!stat.isFile() || !re.test(file) || basename(file)[0] === '.') {
+ return;
+ }
+ files.push(file);
+ });
+
+ return files;
+};
+
+/**
+ * Generate an undefined error with a message warning the user.
+ *
+ * @return {Error}
+ */
+
+exports.undefinedError = function () {
+ return new Error('Caught undefined error, did you throw without specifying what?');
+};
+
+/**
+ * Generate an undefined error if `err` is not defined.
+ *
+ * @param {Error} err
+ * @return {Error}
+ */
+
+exports.getError = function (err) {
+ return err || exports.undefinedError();
+};
+
+/**
+ * @summary
+ * This Filter based on `mocha-clean` module.(see: `github.com/rstacruz/mocha-clean`)
+ * @description
+ * When invoking this function you get a filter function that get the Error.stack as an input,
+ * and return a prettify output.
+ * (i.e: strip Mocha and internal node functions from stack trace).
+ * @returns {Function}
+ */
+exports.stackTraceFilter = function () {
+ // TODO: Replace with `process.browser`
+ var is = typeof document === 'undefined' ? { node: true } : { browser: true };
+ var slash = path.sep;
+ var cwd;
+ if (is.node) {
+ cwd = process.cwd() + slash;
+ } else {
+ cwd = (typeof location === 'undefined'
+ ? window.location
+ : location).href.replace(/\/[^/]*$/, '/');
+ slash = '/';
+ }
+
+ function isMochaInternal (line) {
+ return (~line.indexOf('node_modules' + slash + 'mocha' + slash)) ||
+ (~line.indexOf('node_modules' + slash + 'mocha.js')) ||
+ (~line.indexOf('bower_components' + slash + 'mocha.js')) ||
+ (~line.indexOf(slash + 'mocha.js'));
+ }
+
+ function isNodeInternal (line) {
+ return (~line.indexOf('(timers.js:')) ||
+ (~line.indexOf('(events.js:')) ||
+ (~line.indexOf('(node.js:')) ||
+ (~line.indexOf('(module.js:')) ||
+ (~line.indexOf('GeneratorFunctionPrototype.next (native)')) ||
+ false;
+ }
+
+ return function (stack) {
+ stack = stack.split('\n');
+
+ stack = reduce(stack, function (list, line) {
+ if (isMochaInternal(line)) {
+ return list;
+ }
+
+ if (is.node && isNodeInternal(line)) {
+ return list;
+ }
+
+ // Clean up cwd(absolute)
+ if (/\(?.+:\d+:\d+\)?$/.test(line)) {
+ line = line.replace(cwd, '');
+ }
+
+ list.push(line);
+ return list;
+ }, []);
+
+ return stack.join('\n');
+ };
+};
+
+/**
+ * Crude, but effective.
+ * @api
+ * @param {*} value
+ * @returns {boolean} Whether or not `value` is a Promise
+ */
+exports.isPromise = function isPromise (value) {
+ return typeof value === 'object' && typeof value.then === 'function';
+};
+
+/**
+ * It's a noop.
+ * @api
+ */
+exports.noop = function () {};
+
+}).call(this,require('_process'),require("buffer").Buffer)
+},{"./to-iso-string":37,"_process":82,"buffer":43,"debug":2,"fs":42,"glob":42,"he":64,"json3":69,"path":42,"util":102}],39:[function(require,module,exports){
+'use strict'
+
+exports.byteLength = byteLength
+exports.toByteArray = toByteArray
+exports.fromByteArray = fromByteArray
+
+var lookup = []
+var revLookup = []
+var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
+
+var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
+for (var i = 0, len = code.length; i < len; ++i) {
+ lookup[i] = code[i]
+ revLookup[code.charCodeAt(i)] = i
+}
+
+revLookup['-'.charCodeAt(0)] = 62
+revLookup['_'.charCodeAt(0)] = 63
+
+function placeHoldersCount (b64) {
+ var len = b64.length
+ if (len % 4 > 0) {
+ throw new Error('Invalid string. Length must be a multiple of 4')
+ }
+
+ // the number of equal signs (place holders)
+ // if there are two placeholders, than the two characters before it
+ // represent one byte
+ // if there is only one, then the three characters before it represent 2 bytes
+ // this is just a cheap hack to not do indexOf twice
+ return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0
+}
+
+function byteLength (b64) {
+ // base64 is 4/3 + up to two characters of the original data
+ return (b64.length * 3 / 4) - placeHoldersCount(b64)
+}
+
+function toByteArray (b64) {
+ var i, l, tmp, placeHolders, arr
+ var len = b64.length
+ placeHolders = placeHoldersCount(b64)
+
+ arr = new Arr((len * 3 / 4) - placeHolders)
+
+ // if there are placeholders, only get up to the last complete 4 chars
+ l = placeHolders > 0 ? len - 4 : len
+
+ var L = 0
+
+ for (i = 0; i < l; i += 4) {
+ tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]
+ arr[L++] = (tmp >> 16) & 0xFF
+ arr[L++] = (tmp >> 8) & 0xFF
+ arr[L++] = tmp & 0xFF
+ }
+
+ if (placeHolders === 2) {
+ tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)
+ arr[L++] = tmp & 0xFF
+ } else if (placeHolders === 1) {
+ tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)
+ arr[L++] = (tmp >> 8) & 0xFF
+ arr[L++] = tmp & 0xFF
+ }
+
+ return arr
+}
+
+function tripletToBase64 (num) {
+ return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
+}
+
+function encodeChunk (uint8, start, end) {
+ var tmp
+ var output = []
+ for (var i = start; i < end; i += 3) {
+ tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
+ output.push(tripletToBase64(tmp))
+ }
+ return output.join('')
+}
+
+function fromByteArray (uint8) {
+ var tmp
+ var len = uint8.length
+ var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
+ var output = ''
+ var parts = []
+ var maxChunkLength = 16383 // must be multiple of 3
+
+ // go through the array every three bytes, we'll deal with trailing stuff later
+ for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
+ parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
+ }
+
+ // pad the end with zeros, but make sure to not forget the extra bytes
+ if (extraBytes === 1) {
+ tmp = uint8[len - 1]
+ output += lookup[tmp >> 2]
+ output += lookup[(tmp << 4) & 0x3F]
+ output += '=='
+ } else if (extraBytes === 2) {
+ tmp = (uint8[len - 2] << 8) + (uint8[len - 1])
+ output += lookup[tmp >> 10]
+ output += lookup[(tmp >> 4) & 0x3F]
+ output += lookup[(tmp << 2) & 0x3F]
+ output += '='
+ }
+
+ parts.push(output)
+
+ return parts.join('')
+}
+
+},{}],40:[function(require,module,exports){
+
+},{}],41:[function(require,module,exports){
+(function (process){
+var WritableStream = require('stream').Writable
+var inherits = require('util').inherits
+
+module.exports = BrowserStdout
+
+
+inherits(BrowserStdout, WritableStream)
+
+function BrowserStdout(opts) {
+ if (!(this instanceof BrowserStdout)) return new BrowserStdout(opts)
+
+ opts = opts || {}
+ WritableStream.call(this, opts)
+ this.label = (opts.label !== undefined) ? opts.label : 'stdout'
+}
+
+BrowserStdout.prototype._write = function(chunks, encoding, cb) {
+ var output = chunks.toString ? chunks.toString() : chunks
+ if (this.label === false) {
+ console.log(output)
+ } else {
+ console.log(this.label+':', output)
+ }
+ process.nextTick(cb)
+}
+
+}).call(this,require('_process'))
+},{"_process":82,"stream":96,"util":102}],42:[function(require,module,exports){
+arguments[4][40][0].apply(exports,arguments)
+},{"dup":40}],43:[function(require,module,exports){
+(function (global){
+/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
+ * @license MIT
+ */
+/* eslint-disable no-proto */
+
+'use strict'
+
+var base64 = require('base64-js')
+var ieee754 = require('ieee754')
+var isArray = require('isarray')
+
+exports.Buffer = Buffer
+exports.SlowBuffer = SlowBuffer
+exports.INSPECT_MAX_BYTES = 50
+
+/**
+ * If `Buffer.TYPED_ARRAY_SUPPORT`:
+ * === true Use Uint8Array implementation (fastest)
+ * === false Use Object implementation (most compatible, even IE6)
+ *
+ * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
+ * Opera 11.6+, iOS 4.2+.
+ *
+ * Due to various browser bugs, sometimes the Object implementation will be used even
+ * when the browser supports typed arrays.
+ *
+ * Note:
+ *
+ * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
+ * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
+ *
+ * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
+ *
+ * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
+ * incorrect length in some situations.
+
+ * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
+ * get the Object implementation, which is slower but behaves correctly.
+ */
+Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
+ ? global.TYPED_ARRAY_SUPPORT
+ : typedArraySupport()
+
+/*
+ * Export kMaxLength after typed array support is determined.
+ */
+exports.kMaxLength = kMaxLength()
+
+function typedArraySupport () {
+ try {
+ var arr = new Uint8Array(1)
+ arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
+ return arr.foo() === 42 && // typed array instances can be augmented
+ typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
+ arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
+ } catch (e) {
+ return false
+ }
+}
+
+function kMaxLength () {
+ return Buffer.TYPED_ARRAY_SUPPORT
+ ? 0x7fffffff
+ : 0x3fffffff
+}
+
+function createBuffer (that, length) {
+ if (kMaxLength() < length) {
+ throw new RangeError('Invalid typed array length')
+ }
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ // Return an augmented `Uint8Array` instance, for best performance
+ that = new Uint8Array(length)
+ that.__proto__ = Buffer.prototype
+ } else {
+ // Fallback: Return an object instance of the Buffer class
+ if (that === null) {
+ that = new Buffer(length)
+ }
+ that.length = length
+ }
+
+ return that
+}
+
+/**
+ * The Buffer constructor returns instances of `Uint8Array` that have their
+ * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
+ * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
+ * and the `Uint8Array` methods. Square bracket notation works as expected -- it
+ * returns a single octet.
+ *
+ * The `Uint8Array` prototype remains unmodified.
+ */
+
+function Buffer (arg, encodingOrOffset, length) {
+ if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
+ return new Buffer(arg, encodingOrOffset, length)
+ }
+
+ // Common case.
+ if (typeof arg === 'number') {
+ if (typeof encodingOrOffset === 'string') {
+ throw new Error(
+ 'If encoding is specified then the first argument must be a string'
+ )
+ }
+ return allocUnsafe(this, arg)
+ }
+ return from(this, arg, encodingOrOffset, length)
+}
+
+Buffer.poolSize = 8192 // not used by this implementation
+
+// TODO: Legacy, not needed anymore. Remove in next major version.
+Buffer._augment = function (arr) {
+ arr.__proto__ = Buffer.prototype
+ return arr
+}
+
+function from (that, value, encodingOrOffset, length) {
+ if (typeof value === 'number') {
+ throw new TypeError('"value" argument must not be a number')
+ }
+
+ if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
+ return fromArrayBuffer(that, value, encodingOrOffset, length)
+ }
+
+ if (typeof value === 'string') {
+ return fromString(that, value, encodingOrOffset)
+ }
+
+ return fromObject(that, value)
+}
+
+/**
+ * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
+ * if value is a number.
+ * Buffer.from(str[, encoding])
+ * Buffer.from(array)
+ * Buffer.from(buffer)
+ * Buffer.from(arrayBuffer[, byteOffset[, length]])
+ **/
+Buffer.from = function (value, encodingOrOffset, length) {
+ return from(null, value, encodingOrOffset, length)
+}
+
+if (Buffer.TYPED_ARRAY_SUPPORT) {
+ Buffer.prototype.__proto__ = Uint8Array.prototype
+ Buffer.__proto__ = Uint8Array
+ if (typeof Symbol !== 'undefined' && Symbol.species &&
+ Buffer[Symbol.species] === Buffer) {
+ // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
+ Object.defineProperty(Buffer, Symbol.species, {
+ value: null,
+ configurable: true
+ })
+ }
+}
+
+function assertSize (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('"size" argument must be a number')
+ } else if (size < 0) {
+ throw new RangeError('"size" argument must not be negative')
+ }
+}
+
+function alloc (that, size, fill, encoding) {
+ assertSize(size)
+ if (size <= 0) {
+ return createBuffer(that, size)
+ }
+ if (fill !== undefined) {
+ // Only pay attention to encoding if it's a string. This
+ // prevents accidentally sending in a number that would
+ // be interpretted as a start offset.
+ return typeof encoding === 'string'
+ ? createBuffer(that, size).fill(fill, encoding)
+ : createBuffer(that, size).fill(fill)
+ }
+ return createBuffer(that, size)
+}
+
+/**
+ * Creates a new filled Buffer instance.
+ * alloc(size[, fill[, encoding]])
+ **/
+Buffer.alloc = function (size, fill, encoding) {
+ return alloc(null, size, fill, encoding)
+}
+
+function allocUnsafe (that, size) {
+ assertSize(size)
+ that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)
+ if (!Buffer.TYPED_ARRAY_SUPPORT) {
+ for (var i = 0; i < size; ++i) {
+ that[i] = 0
+ }
+ }
+ return that
+}
+
+/**
+ * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
+ * */
+Buffer.allocUnsafe = function (size) {
+ return allocUnsafe(null, size)
+}
+/**
+ * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
+ */
+Buffer.allocUnsafeSlow = function (size) {
+ return allocUnsafe(null, size)
+}
+
+function fromString (that, string, encoding) {
+ if (typeof encoding !== 'string' || encoding === '') {
+ encoding = 'utf8'
+ }
+
+ if (!Buffer.isEncoding(encoding)) {
+ throw new TypeError('"encoding" must be a valid string encoding')
+ }
+
+ var length = byteLength(string, encoding) | 0
+ that = createBuffer(that, length)
+
+ var actual = that.write(string, encoding)
+
+ if (actual !== length) {
+ // Writing a hex string, for example, that contains invalid characters will
+ // cause everything after the first invalid character to be ignored. (e.g.
+ // 'abxxcd' will be treated as 'ab')
+ that = that.slice(0, actual)
+ }
+
+ return that
+}
+
+function fromArrayLike (that, array) {
+ var length = array.length < 0 ? 0 : checked(array.length) | 0
+ that = createBuffer(that, length)
+ for (var i = 0; i < length; i += 1) {
+ that[i] = array[i] & 255
+ }
+ return that
+}
+
+function fromArrayBuffer (that, array, byteOffset, length) {
+ array.byteLength // this throws if `array` is not a valid ArrayBuffer
+
+ if (byteOffset < 0 || array.byteLength < byteOffset) {
+ throw new RangeError('\'offset\' is out of bounds')
+ }
+
+ if (array.byteLength < byteOffset + (length || 0)) {
+ throw new RangeError('\'length\' is out of bounds')
+ }
+
+ if (byteOffset === undefined && length === undefined) {
+ array = new Uint8Array(array)
+ } else if (length === undefined) {
+ array = new Uint8Array(array, byteOffset)
+ } else {
+ array = new Uint8Array(array, byteOffset, length)
+ }
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ // Return an augmented `Uint8Array` instance, for best performance
+ that = array
+ that.__proto__ = Buffer.prototype
+ } else {
+ // Fallback: Return an object instance of the Buffer class
+ that = fromArrayLike(that, array)
+ }
+ return that
+}
+
+function fromObject (that, obj) {
+ if (Buffer.isBuffer(obj)) {
+ var len = checked(obj.length) | 0
+ that = createBuffer(that, len)
+
+ if (that.length === 0) {
+ return that
+ }
+
+ obj.copy(that, 0, 0, len)
+ return that
+ }
+
+ if (obj) {
+ if ((typeof ArrayBuffer !== 'undefined' &&
+ obj.buffer instanceof ArrayBuffer) || 'length' in obj) {
+ if (typeof obj.length !== 'number' || isnan(obj.length)) {
+ return createBuffer(that, 0)
+ }
+ return fromArrayLike(that, obj)
+ }
+
+ if (obj.type === 'Buffer' && isArray(obj.data)) {
+ return fromArrayLike(that, obj.data)
+ }
+ }
+
+ throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
+}
+
+function checked (length) {
+ // Note: cannot use `length < kMaxLength()` here because that fails when
+ // length is NaN (which is otherwise coerced to zero.)
+ if (length >= kMaxLength()) {
+ throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
+ 'size: 0x' + kMaxLength().toString(16) + ' bytes')
+ }
+ return length | 0
+}
+
+function SlowBuffer (length) {
+ if (+length != length) { // eslint-disable-line eqeqeq
+ length = 0
+ }
+ return Buffer.alloc(+length)
+}
+
+Buffer.isBuffer = function isBuffer (b) {
+ return !!(b != null && b._isBuffer)
+}
+
+Buffer.compare = function compare (a, b) {
+ if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
+ throw new TypeError('Arguments must be Buffers')
+ }
+
+ if (a === b) return 0
+
+ var x = a.length
+ var y = b.length
+
+ for (var i = 0, len = Math.min(x, y); i < len; ++i) {
+ if (a[i] !== b[i]) {
+ x = a[i]
+ y = b[i]
+ break
+ }
+ }
+
+ if (x < y) return -1
+ if (y < x) return 1
+ return 0
+}
+
+Buffer.isEncoding = function isEncoding (encoding) {
+ switch (String(encoding).toLowerCase()) {
+ case 'hex':
+ case 'utf8':
+ case 'utf-8':
+ case 'ascii':
+ case 'latin1':
+ case 'binary':
+ case 'base64':
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return true
+ default:
+ return false
+ }
+}
+
+Buffer.concat = function concat (list, length) {
+ if (!isArray(list)) {
+ throw new TypeError('"list" argument must be an Array of Buffers')
+ }
+
+ if (list.length === 0) {
+ return Buffer.alloc(0)
+ }
+
+ var i
+ if (length === undefined) {
+ length = 0
+ for (i = 0; i < list.length; ++i) {
+ length += list[i].length
+ }
+ }
+
+ var buffer = Buffer.allocUnsafe(length)
+ var pos = 0
+ for (i = 0; i < list.length; ++i) {
+ var buf = list[i]
+ if (!Buffer.isBuffer(buf)) {
+ throw new TypeError('"list" argument must be an Array of Buffers')
+ }
+ buf.copy(buffer, pos)
+ pos += buf.length
+ }
+ return buffer
+}
+
+function byteLength (string, encoding) {
+ if (Buffer.isBuffer(string)) {
+ return string.length
+ }
+ if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&
+ (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
+ return string.byteLength
+ }
+ if (typeof string !== 'string') {
+ string = '' + string
+ }
+
+ var len = string.length
+ if (len === 0) return 0
+
+ // Use a for loop to avoid recursion
+ var loweredCase = false
+ for (;;) {
+ switch (encoding) {
+ case 'ascii':
+ case 'latin1':
+ case 'binary':
+ return len
+ case 'utf8':
+ case 'utf-8':
+ case undefined:
+ return utf8ToBytes(string).length
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return len * 2
+ case 'hex':
+ return len >>> 1
+ case 'base64':
+ return base64ToBytes(string).length
+ default:
+ if (loweredCase) return utf8ToBytes(string).length // assume utf8
+ encoding = ('' + encoding).toLowerCase()
+ loweredCase = true
+ }
+ }
+}
+Buffer.byteLength = byteLength
+
+function slowToString (encoding, start, end) {
+ var loweredCase = false
+
+ // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
+ // property of a typed array.
+
+ // This behaves neither like String nor Uint8Array in that we set start/end
+ // to their upper/lower bounds if the value passed is out of range.
+ // undefined is handled specially as per ECMA-262 6th Edition,
+ // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
+ if (start === undefined || start < 0) {
+ start = 0
+ }
+ // Return early if start > this.length. Done here to prevent potential uint32
+ // coercion fail below.
+ if (start > this.length) {
+ return ''
+ }
+
+ if (end === undefined || end > this.length) {
+ end = this.length
+ }
+
+ if (end <= 0) {
+ return ''
+ }
+
+ // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
+ end >>>= 0
+ start >>>= 0
+
+ if (end <= start) {
+ return ''
+ }
+
+ if (!encoding) encoding = 'utf8'
+
+ while (true) {
+ switch (encoding) {
+ case 'hex':
+ return hexSlice(this, start, end)
+
+ case 'utf8':
+ case 'utf-8':
+ return utf8Slice(this, start, end)
+
+ case 'ascii':
+ return asciiSlice(this, start, end)
+
+ case 'latin1':
+ case 'binary':
+ return latin1Slice(this, start, end)
+
+ case 'base64':
+ return base64Slice(this, start, end)
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return utf16leSlice(this, start, end)
+
+ default:
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
+ encoding = (encoding + '').toLowerCase()
+ loweredCase = true
+ }
+ }
+}
+
+// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
+// Buffer instances.
+Buffer.prototype._isBuffer = true
+
+function swap (b, n, m) {
+ var i = b[n]
+ b[n] = b[m]
+ b[m] = i
+}
+
+Buffer.prototype.swap16 = function swap16 () {
+ var len = this.length
+ if (len % 2 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 16-bits')
+ }
+ for (var i = 0; i < len; i += 2) {
+ swap(this, i, i + 1)
+ }
+ return this
+}
+
+Buffer.prototype.swap32 = function swap32 () {
+ var len = this.length
+ if (len % 4 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 32-bits')
+ }
+ for (var i = 0; i < len; i += 4) {
+ swap(this, i, i + 3)
+ swap(this, i + 1, i + 2)
+ }
+ return this
+}
+
+Buffer.prototype.swap64 = function swap64 () {
+ var len = this.length
+ if (len % 8 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 64-bits')
+ }
+ for (var i = 0; i < len; i += 8) {
+ swap(this, i, i + 7)
+ swap(this, i + 1, i + 6)
+ swap(this, i + 2, i + 5)
+ swap(this, i + 3, i + 4)
+ }
+ return this
+}
+
+Buffer.prototype.toString = function toString () {
+ var length = this.length | 0
+ if (length === 0) return ''
+ if (arguments.length === 0) return utf8Slice(this, 0, length)
+ return slowToString.apply(this, arguments)
+}
+
+Buffer.prototype.equals = function equals (b) {
+ if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
+ if (this === b) return true
+ return Buffer.compare(this, b) === 0
+}
+
+Buffer.prototype.inspect = function inspect () {
+ var str = ''
+ var max = exports.INSPECT_MAX_BYTES
+ if (this.length > 0) {
+ str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
+ if (this.length > max) str += ' ... '
+ }
+ return '<Buffer ' + str + '>'
+}
+
+Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
+ if (!Buffer.isBuffer(target)) {
+ throw new TypeError('Argument must be a Buffer')
+ }
+
+ if (start === undefined) {
+ start = 0
+ }
+ if (end === undefined) {
+ end = target ? target.length : 0
+ }
+ if (thisStart === undefined) {
+ thisStart = 0
+ }
+ if (thisEnd === undefined) {
+ thisEnd = this.length
+ }
+
+ if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
+ throw new RangeError('out of range index')
+ }
+
+ if (thisStart >= thisEnd && start >= end) {
+ return 0
+ }
+ if (thisStart >= thisEnd) {
+ return -1
+ }
+ if (start >= end) {
+ return 1
+ }
+
+ start >>>= 0
+ end >>>= 0
+ thisStart >>>= 0
+ thisEnd >>>= 0
+
+ if (this === target) return 0
+
+ var x = thisEnd - thisStart
+ var y = end - start
+ var len = Math.min(x, y)
+
+ var thisCopy = this.slice(thisStart, thisEnd)
+ var targetCopy = target.slice(start, end)
+
+ for (var i = 0; i < len; ++i) {
+ if (thisCopy[i] !== targetCopy[i]) {
+ x = thisCopy[i]
+ y = targetCopy[i]
+ break
+ }
+ }
+
+ if (x < y) return -1
+ if (y < x) return 1
+ return 0
+}
+
+// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
+// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
+//
+// Arguments:
+// - buffer - a Buffer to search
+// - val - a string, Buffer, or number
+// - byteOffset - an index into `buffer`; will be clamped to an int32
+// - encoding - an optional encoding, relevant is val is a string
+// - dir - true for indexOf, false for lastIndexOf
+function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
+ // Empty buffer means no match
+ if (buffer.length === 0) return -1
+
+ // Normalize byteOffset
+ if (typeof byteOffset === 'string') {
+ encoding = byteOffset
+ byteOffset = 0
+ } else if (byteOffset > 0x7fffffff) {
+ byteOffset = 0x7fffffff
+ } else if (byteOffset < -0x80000000) {
+ byteOffset = -0x80000000
+ }
+ byteOffset = +byteOffset // Coerce to Number.
+ if (isNaN(byteOffset)) {
+ // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
+ byteOffset = dir ? 0 : (buffer.length - 1)
+ }
+
+ // Normalize byteOffset: negative offsets start from the end of the buffer
+ if (byteOffset < 0) byteOffset = buffer.length + byteOffset
+ if (byteOffset >= buffer.length) {
+ if (dir) return -1
+ else byteOffset = buffer.length - 1
+ } else if (byteOffset < 0) {
+ if (dir) byteOffset = 0
+ else return -1
+ }
+
+ // Normalize val
+ if (typeof val === 'string') {
+ val = Buffer.from(val, encoding)
+ }
+
+ // Finally, search either indexOf (if dir is true) or lastIndexOf
+ if (Buffer.isBuffer(val)) {
+ // Special case: looking for empty string/buffer always fails
+ if (val.length === 0) {
+ return -1
+ }
+ return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
+ } else if (typeof val === 'number') {
+ val = val & 0xFF // Search for a byte value [0-255]
+ if (Buffer.TYPED_ARRAY_SUPPORT &&
+ typeof Uint8Array.prototype.indexOf === 'function') {
+ if (dir) {
+ return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
+ } else {
+ return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
+ }
+ }
+ return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
+ }
+
+ throw new TypeError('val must be string, number or Buffer')
+}
+
+function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
+ var indexSize = 1
+ var arrLength = arr.length
+ var valLength = val.length
+
+ if (encoding !== undefined) {
+ encoding = String(encoding).toLowerCase()
+ if (encoding === 'ucs2' || encoding === 'ucs-2' ||
+ encoding === 'utf16le' || encoding === 'utf-16le') {
+ if (arr.length < 2 || val.length < 2) {
+ return -1
+ }
+ indexSize = 2
+ arrLength /= 2
+ valLength /= 2
+ byteOffset /= 2
+ }
+ }
+
+ function read (buf, i) {
+ if (indexSize === 1) {
+ return buf[i]
+ } else {
+ return buf.readUInt16BE(i * indexSize)
+ }
+ }
+
+ var i
+ if (dir) {
+ var foundIndex = -1
+ for (i = byteOffset; i < arrLength; i++) {
+ if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
+ if (foundIndex === -1) foundIndex = i
+ if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
+ } else {
+ if (foundIndex !== -1) i -= i - foundIndex
+ foundIndex = -1
+ }
+ }
+ } else {
+ if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
+ for (i = byteOffset; i >= 0; i--) {
+ var found = true
+ for (var j = 0; j < valLength; j++) {
+ if (read(arr, i + j) !== read(val, j)) {
+ found = false
+ break
+ }
+ }
+ if (found) return i
+ }
+ }
+
+ return -1
+}
+
+Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
+ return this.indexOf(val, byteOffset, encoding) !== -1
+}
+
+Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
+ return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
+}
+
+Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
+ return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
+}
+
+function hexWrite (buf, string, offset, length) {
+ offset = Number(offset) || 0
+ var remaining = buf.length - offset
+ if (!length) {
+ length = remaining
+ } else {
+ length = Number(length)
+ if (length > remaining) {
+ length = remaining
+ }
+ }
+
+ // must be an even number of digits
+ var strLen = string.length
+ if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')
+
+ if (length > strLen / 2) {
+ length = strLen / 2
+ }
+ for (var i = 0; i < length; ++i) {
+ var parsed = parseInt(string.substr(i * 2, 2), 16)
+ if (isNaN(parsed)) return i
+ buf[offset + i] = parsed
+ }
+ return i
+}
+
+function utf8Write (buf, string, offset, length) {
+ return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
+}
+
+function asciiWrite (buf, string, offset, length) {
+ return blitBuffer(asciiToBytes(string), buf, offset, length)
+}
+
+function latin1Write (buf, string, offset, length) {
+ return asciiWrite(buf, string, offset, length)
+}
+
+function base64Write (buf, string, offset, length) {
+ return blitBuffer(base64ToBytes(string), buf, offset, length)
+}
+
+function ucs2Write (buf, string, offset, length) {
+ return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
+}
+
+Buffer.prototype.write = function write (string, offset, length, encoding) {
+ // Buffer#write(string)
+ if (offset === undefined) {
+ encoding = 'utf8'
+ length = this.length
+ offset = 0
+ // Buffer#write(string, encoding)
+ } else if (length === undefined && typeof offset === 'string') {
+ encoding = offset
+ length = this.length
+ offset = 0
+ // Buffer#write(string, offset[, length][, encoding])
+ } else if (isFinite(offset)) {
+ offset = offset | 0
+ if (isFinite(length)) {
+ length = length | 0
+ if (encoding === undefined) encoding = 'utf8'
+ } else {
+ encoding = length
+ length = undefined
+ }
+ // legacy write(string, encoding, offset, length) - remove in v0.13
+ } else {
+ throw new Error(
+ 'Buffer.write(string, encoding, offset[, length]) is no longer supported'
+ )
+ }
+
+ var remaining = this.length - offset
+ if (length === undefined || length > remaining) length = remaining
+
+ if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
+ throw new RangeError('Attempt to write outside buffer bounds')
+ }
+
+ if (!encoding) encoding = 'utf8'
+
+ var loweredCase = false
+ for (;;) {
+ switch (encoding) {
+ case 'hex':
+ return hexWrite(this, string, offset, length)
+
+ case 'utf8':
+ case 'utf-8':
+ return utf8Write(this, string, offset, length)
+
+ case 'ascii':
+ return asciiWrite(this, string, offset, length)
+
+ case 'latin1':
+ case 'binary':
+ return latin1Write(this, string, offset, length)
+
+ case 'base64':
+ // Warning: maxLength not taken into account in base64Write
+ return base64Write(this, string, offset, length)
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return ucs2Write(this, string, offset, length)
+
+ default:
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
+ encoding = ('' + encoding).toLowerCase()
+ loweredCase = true
+ }
+ }
+}
+
+Buffer.prototype.toJSON = function toJSON () {
+ return {
+ type: 'Buffer',
+ data: Array.prototype.slice.call(this._arr || this, 0)
+ }
+}
+
+function base64Slice (buf, start, end) {
+ if (start === 0 && end === buf.length) {
+ return base64.fromByteArray(buf)
+ } else {
+ return base64.fromByteArray(buf.slice(start, end))
+ }
+}
+
+function utf8Slice (buf, start, end) {
+ end = Math.min(buf.length, end)
+ var res = []
+
+ var i = start
+ while (i < end) {
+ var firstByte = buf[i]
+ var codePoint = null
+ var bytesPerSequence = (firstByte > 0xEF) ? 4
+ : (firstByte > 0xDF) ? 3
+ : (firstByte > 0xBF) ? 2
+ : 1
+
+ if (i + bytesPerSequence <= end) {
+ var secondByte, thirdByte, fourthByte, tempCodePoint
+
+ switch (bytesPerSequence) {
+ case 1:
+ if (firstByte < 0x80) {
+ codePoint = firstByte
+ }
+ break
+ case 2:
+ secondByte = buf[i + 1]
+ if ((secondByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
+ if (tempCodePoint > 0x7F) {
+ codePoint = tempCodePoint
+ }
+ }
+ break
+ case 3:
+ secondByte = buf[i + 1]
+ thirdByte = buf[i + 2]
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
+ if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
+ codePoint = tempCodePoint
+ }
+ }
+ break
+ case 4:
+ secondByte = buf[i + 1]
+ thirdByte = buf[i + 2]
+ fourthByte = buf[i + 3]
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
+ if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
+ codePoint = tempCodePoint
+ }
+ }
+ }
+ }
+
+ if (codePoint === null) {
+ // we did not generate a valid codePoint so insert a
+ // replacement char (U+FFFD) and advance only 1 byte
+ codePoint = 0xFFFD
+ bytesPerSequence = 1
+ } else if (codePoint > 0xFFFF) {
+ // encode to utf16 (surrogate pair dance)
+ codePoint -= 0x10000
+ res.push(codePoint >>> 10 & 0x3FF | 0xD800)
+ codePoint = 0xDC00 | codePoint & 0x3FF
+ }
+
+ res.push(codePoint)
+ i += bytesPerSequence
+ }
+
+ return decodeCodePointsArray(res)
+}
+
+// Based on http://stackoverflow.com/a/22747272/680742, the browser with
+// the lowest limit is Chrome, with 0x10000 args.
+// We go 1 magnitude less, for safety
+var MAX_ARGUMENTS_LENGTH = 0x1000
+
+function decodeCodePointsArray (codePoints) {
+ var len = codePoints.length
+ if (len <= MAX_ARGUMENTS_LENGTH) {
+ return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
+ }
+
+ // Decode in chunks to avoid "call stack size exceeded".
+ var res = ''
+ var i = 0
+ while (i < len) {
+ res += String.fromCharCode.apply(
+ String,
+ codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
+ )
+ }
+ return res
+}
+
+function asciiSlice (buf, start, end) {
+ var ret = ''
+ end = Math.min(buf.length, end)
+
+ for (var i = start; i < end; ++i) {
+ ret += String.fromCharCode(buf[i] & 0x7F)
+ }
+ return ret
+}
+
+function latin1Slice (buf, start, end) {
+ var ret = ''
+ end = Math.min(buf.length, end)
+
+ for (var i = start; i < end; ++i) {
+ ret += String.fromCharCode(buf[i])
+ }
+ return ret
+}
+
+function hexSlice (buf, start, end) {
+ var len = buf.length
+
+ if (!start || start < 0) start = 0
+ if (!end || end < 0 || end > len) end = len
+
+ var out = ''
+ for (var i = start; i < end; ++i) {
+ out += toHex(buf[i])
+ }
+ return out
+}
+
+function utf16leSlice (buf, start, end) {
+ var bytes = buf.slice(start, end)
+ var res = ''
+ for (var i = 0; i < bytes.length; i += 2) {
+ res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
+ }
+ return res
+}
+
+Buffer.prototype.slice = function slice (start, end) {
+ var len = this.length
+ start = ~~start
+ end = end === undefined ? len : ~~end
+
+ if (start < 0) {
+ start += len
+ if (start < 0) start = 0
+ } else if (start > len) {
+ start = len
+ }
+
+ if (end < 0) {
+ end += len
+ if (end < 0) end = 0
+ } else if (end > len) {
+ end = len
+ }
+
+ if (end < start) end = start
+
+ var newBuf
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ newBuf = this.subarray(start, end)
+ newBuf.__proto__ = Buffer.prototype
+ } else {
+ var sliceLen = end - start
+ newBuf = new Buffer(sliceLen, undefined)
+ for (var i = 0; i < sliceLen; ++i) {
+ newBuf[i] = this[i + start]
+ }
+ }
+
+ return newBuf
+}
+
+/*
+ * Need to make sure that buffer isn't trying to write out of bounds.
+ */
+function checkOffset (offset, ext, length) {
+ if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
+ if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
+}
+
+Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
+ offset = offset | 0
+ byteLength = byteLength | 0
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
+
+ var val = this[offset]
+ var mul = 1
+ var i = 0
+ while (++i < byteLength && (mul *= 0x100)) {
+ val += this[offset + i] * mul
+ }
+
+ return val
+}
+
+Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
+ offset = offset | 0
+ byteLength = byteLength | 0
+ if (!noAssert) {
+ checkOffset(offset, byteLength, this.length)
+ }
+
+ var val = this[offset + --byteLength]
+ var mul = 1
+ while (byteLength > 0 && (mul *= 0x100)) {
+ val += this[offset + --byteLength] * mul
+ }
+
+ return val
+}
+
+Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 1, this.length)
+ return this[offset]
+}
+
+Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length)
+ return this[offset] | (this[offset + 1] << 8)
+}
+
+Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length)
+ return (this[offset] << 8) | this[offset + 1]
+}
+
+Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length)
+
+ return ((this[offset]) |
+ (this[offset + 1] << 8) |
+ (this[offset + 2] << 16)) +
+ (this[offset + 3] * 0x1000000)
+}
+
+Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length)
+
+ return (this[offset] * 0x1000000) +
+ ((this[offset + 1] << 16) |
+ (this[offset + 2] << 8) |
+ this[offset + 3])
+}
+
+Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
+ offset = offset | 0
+ byteLength = byteLength | 0
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
+
+ var val = this[offset]
+ var mul = 1
+ var i = 0
+ while (++i < byteLength && (mul *= 0x100)) {
+ val += this[offset + i] * mul
+ }
+ mul *= 0x80
+
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength)
+
+ return val
+}
+
+Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
+ offset = offset | 0
+ byteLength = byteLength | 0
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
+
+ var i = byteLength
+ var mul = 1
+ var val = this[offset + --i]
+ while (i > 0 && (mul *= 0x100)) {
+ val += this[offset + --i] * mul
+ }
+ mul *= 0x80
+
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength)
+
+ return val
+}
+
+Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 1, this.length)
+ if (!(this[offset] & 0x80)) return (this[offset])
+ return ((0xff - this[offset] + 1) * -1)
+}
+
+Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length)
+ var val = this[offset] | (this[offset + 1] << 8)
+ return (val & 0x8000) ? val | 0xFFFF0000 : val
+}
+
+Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length)
+ var val = this[offset + 1] | (this[offset] << 8)
+ return (val & 0x8000) ? val | 0xFFFF0000 : val
+}
+
+Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length)
+
+ return (this[offset]) |
+ (this[offset + 1] << 8) |
+ (this[offset + 2] << 16) |
+ (this[offset + 3] << 24)
+}
+
+Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length)
+
+ return (this[offset] << 24) |
+ (this[offset + 1] << 16) |
+ (this[offset + 2] << 8) |
+ (this[offset + 3])
+}
+
+Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length)
+ return ieee754.read(this, offset, true, 23, 4)
+}
+
+Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length)
+ return ieee754.read(this, offset, false, 23, 4)
+}
+
+Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 8, this.length)
+ return ieee754.read(this, offset, true, 52, 8)
+}
+
+Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 8, this.length)
+ return ieee754.read(this, offset, false, 52, 8)
+}
+
+function checkInt (buf, value, offset, ext, max, min) {
+ if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
+ if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
+ if (offset + ext > buf.length) throw new RangeError('Index out of range')
+}
+
+Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
+ value = +value
+ offset = offset | 0
+ byteLength = byteLength | 0
+ if (!noAssert) {
+ var maxBytes = Math.pow(2, 8 * byteLength) - 1
+ checkInt(this, value, offset, byteLength, maxBytes, 0)
+ }
+
+ var mul = 1
+ var i = 0
+ this[offset] = value & 0xFF
+ while (++i < byteLength && (mul *= 0x100)) {
+ this[offset + i] = (value / mul) & 0xFF
+ }
+
+ return offset + byteLength
+}
+
+Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
+ value = +value
+ offset = offset | 0
+ byteLength = byteLength | 0
+ if (!noAssert) {
+ var maxBytes = Math.pow(2, 8 * byteLength) - 1
+ checkInt(this, value, offset, byteLength, maxBytes, 0)
+ }
+
+ var i = byteLength - 1
+ var mul = 1
+ this[offset + i] = value & 0xFF
+ while (--i >= 0 && (mul *= 0x100)) {
+ this[offset + i] = (value / mul) & 0xFF
+ }
+
+ return offset + byteLength
+}
+
+Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
+ if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
+ this[offset] = (value & 0xff)
+ return offset + 1
+}
+
+function objectWriteUInt16 (buf, value, offset, littleEndian) {
+ if (value < 0) value = 0xffff + value + 1
+ for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
+ buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
+ (littleEndian ? i : 1 - i) * 8
+ }
+}
+
+Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value & 0xff)
+ this[offset + 1] = (value >>> 8)
+ } else {
+ objectWriteUInt16(this, value, offset, true)
+ }
+ return offset + 2
+}
+
+Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value >>> 8)
+ this[offset + 1] = (value & 0xff)
+ } else {
+ objectWriteUInt16(this, value, offset, false)
+ }
+ return offset + 2
+}
+
+function objectWriteUInt32 (buf, value, offset, littleEndian) {
+ if (value < 0) value = 0xffffffff + value + 1
+ for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
+ buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
+ }
+}
+
+Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset + 3] = (value >>> 24)
+ this[offset + 2] = (value >>> 16)
+ this[offset + 1] = (value >>> 8)
+ this[offset] = (value & 0xff)
+ } else {
+ objectWriteUInt32(this, value, offset, true)
+ }
+ return offset + 4
+}
+
+Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value >>> 24)
+ this[offset + 1] = (value >>> 16)
+ this[offset + 2] = (value >>> 8)
+ this[offset + 3] = (value & 0xff)
+ } else {
+ objectWriteUInt32(this, value, offset, false)
+ }
+ return offset + 4
+}
+
+Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) {
+ var limit = Math.pow(2, 8 * byteLength - 1)
+
+ checkInt(this, value, offset, byteLength, limit - 1, -limit)
+ }
+
+ var i = 0
+ var mul = 1
+ var sub = 0
+ this[offset] = value & 0xFF
+ while (++i < byteLength && (mul *= 0x100)) {
+ if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
+ sub = 1
+ }
+ this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
+ }
+
+ return offset + byteLength
+}
+
+Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) {
+ var limit = Math.pow(2, 8 * byteLength - 1)
+
+ checkInt(this, value, offset, byteLength, limit - 1, -limit)
+ }
+
+ var i = byteLength - 1
+ var mul = 1
+ var sub = 0
+ this[offset + i] = value & 0xFF
+ while (--i >= 0 && (mul *= 0x100)) {
+ if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
+ sub = 1
+ }
+ this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
+ }
+
+ return offset + byteLength
+}
+
+Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
+ if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
+ if (value < 0) value = 0xff + value + 1
+ this[offset] = (value & 0xff)
+ return offset + 1
+}
+
+Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value & 0xff)
+ this[offset + 1] = (value >>> 8)
+ } else {
+ objectWriteUInt16(this, value, offset, true)
+ }
+ return offset + 2
+}
+
+Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value >>> 8)
+ this[offset + 1] = (value & 0xff)
+ } else {
+ objectWriteUInt16(this, value, offset, false)
+ }
+ return offset + 2
+}
+
+Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value & 0xff)
+ this[offset + 1] = (value >>> 8)
+ this[offset + 2] = (value >>> 16)
+ this[offset + 3] = (value >>> 24)
+ } else {
+ objectWriteUInt32(this, value, offset, true)
+ }
+ return offset + 4
+}
+
+Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
+ if (value < 0) value = 0xffffffff + value + 1
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value >>> 24)
+ this[offset + 1] = (value >>> 16)
+ this[offset + 2] = (value >>> 8)
+ this[offset + 3] = (value & 0xff)
+ } else {
+ objectWriteUInt32(this, value, offset, false)
+ }
+ return offset + 4
+}
+
+function checkIEEE754 (buf, value, offset, ext, max, min) {
+ if (offset + ext > buf.length) throw new RangeError('Index out of range')
+ if (offset < 0) throw new RangeError('Index out of range')
+}
+
+function writeFloat (buf, value, offset, littleEndian, noAssert) {
+ if (!noAssert) {
+ checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
+ }
+ ieee754.write(buf, value, offset, littleEndian, 23, 4)
+ return offset + 4
+}
+
+Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
+ return writeFloat(this, value, offset, true, noAssert)
+}
+
+Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
+ return writeFloat(this, value, offset, false, noAssert)
+}
+
+function writeDouble (buf, value, offset, littleEndian, noAssert) {
+ if (!noAssert) {
+ checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
+ }
+ ieee754.write(buf, value, offset, littleEndian, 52, 8)
+ return offset + 8
+}
+
+Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
+ return writeDouble(this, value, offset, true, noAssert)
+}
+
+Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
+ return writeDouble(this, value, offset, false, noAssert)
+}
+
+// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
+Buffer.prototype.copy = function copy (target, targetStart, start, end) {
+ if (!start) start = 0
+ if (!end && end !== 0) end = this.length
+ if (targetStart >= target.length) targetStart = target.length
+ if (!targetStart) targetStart = 0
+ if (end > 0 && end < start) end = start
+
+ // Copy 0 bytes; we're done
+ if (end === start) return 0
+ if (target.length === 0 || this.length === 0) return 0
+
+ // Fatal error conditions
+ if (targetStart < 0) {
+ throw new RangeError('targetStart out of bounds')
+ }
+ if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
+ if (end < 0) throw new RangeError('sourceEnd out of bounds')
+
+ // Are we oob?
+ if (end > this.length) end = this.length
+ if (target.length - targetStart < end - start) {
+ end = target.length - targetStart + start
+ }
+
+ var len = end - start
+ var i
+
+ if (this === target && start < targetStart && targetStart < end) {
+ // descending copy from end
+ for (i = len - 1; i >= 0; --i) {
+ target[i + targetStart] = this[i + start]
+ }
+ } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
+ // ascending copy from start
+ for (i = 0; i < len; ++i) {
+ target[i + targetStart] = this[i + start]
+ }
+ } else {
+ Uint8Array.prototype.set.call(
+ target,
+ this.subarray(start, start + len),
+ targetStart
+ )
+ }
+
+ return len
+}
+
+// Usage:
+// buffer.fill(number[, offset[, end]])
+// buffer.fill(buffer[, offset[, end]])
+// buffer.fill(string[, offset[, end]][, encoding])
+Buffer.prototype.fill = function fill (val, start, end, encoding) {
+ // Handle string cases:
+ if (typeof val === 'string') {
+ if (typeof start === 'string') {
+ encoding = start
+ start = 0
+ end = this.length
+ } else if (typeof end === 'string') {
+ encoding = end
+ end = this.length
+ }
+ if (val.length === 1) {
+ var code = val.charCodeAt(0)
+ if (code < 256) {
+ val = code
+ }
+ }
+ if (encoding !== undefined && typeof encoding !== 'string') {
+ throw new TypeError('encoding must be a string')
+ }
+ if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
+ throw new TypeError('Unknown encoding: ' + encoding)
+ }
+ } else if (typeof val === 'number') {
+ val = val & 255
+ }
+
+ // Invalid ranges are not set to a default, so can range check early.
+ if (start < 0 || this.length < start || this.length < end) {
+ throw new RangeError('Out of range index')
+ }
+
+ if (end <= start) {
+ return this
+ }
+
+ start = start >>> 0
+ end = end === undefined ? this.length : end >>> 0
+
+ if (!val) val = 0
+
+ var i
+ if (typeof val === 'number') {
+ for (i = start; i < end; ++i) {
+ this[i] = val
+ }
+ } else {
+ var bytes = Buffer.isBuffer(val)
+ ? val
+ : utf8ToBytes(new Buffer(val, encoding).toString())
+ var len = bytes.length
+ for (i = 0; i < end - start; ++i) {
+ this[i + start] = bytes[i % len]
+ }
+ }
+
+ return this
+}
+
+// HELPER FUNCTIONS
+// ================
+
+var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g
+
+function base64clean (str) {
+ // Node strips out invalid characters like \n and \t from the string, base64-js does not
+ str = stringtrim(str).replace(INVALID_BASE64_RE, '')
+ // Node converts strings with length < 2 to ''
+ if (str.length < 2) return ''
+ // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
+ while (str.length % 4 !== 0) {
+ str = str + '='
+ }
+ return str
+}
+
+function stringtrim (str) {
+ if (str.trim) return str.trim()
+ return str.replace(/^\s+|\s+$/g, '')
+}
+
+function toHex (n) {
+ if (n < 16) return '0' + n.toString(16)
+ return n.toString(16)
+}
+
+function utf8ToBytes (string, units) {
+ units = units || Infinity
+ var codePoint
+ var length = string.length
+ var leadSurrogate = null
+ var bytes = []
+
+ for (var i = 0; i < length; ++i) {
+ codePoint = string.charCodeAt(i)
+
+ // is surrogate component
+ if (codePoint > 0xD7FF && codePoint < 0xE000) {
+ // last char was a lead
+ if (!leadSurrogate) {
+ // no lead yet
+ if (codePoint > 0xDBFF) {
+ // unexpected trail
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+ continue
+ } else if (i + 1 === length) {
+ // unpaired lead
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+ continue
+ }
+
+ // valid lead
+ leadSurrogate = codePoint
+
+ continue
+ }
+
+ // 2 leads in a row
+ if (codePoint < 0xDC00) {
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+ leadSurrogate = codePoint
+ continue
+ }
+
+ // valid surrogate pair
+ codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
+ } else if (leadSurrogate) {
+ // valid bmp char, but last char was a lead
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+ }
+
+ leadSurrogate = null
+
+ // encode utf8
+ if (codePoint < 0x80) {
+ if ((units -= 1) < 0) break
+ bytes.push(codePoint)
+ } else if (codePoint < 0x800) {
+ if ((units -= 2) < 0) break
+ bytes.push(
+ codePoint >> 0x6 | 0xC0,
+ codePoint & 0x3F | 0x80
+ )
+ } else if (codePoint < 0x10000) {
+ if ((units -= 3) < 0) break
+ bytes.push(
+ codePoint >> 0xC | 0xE0,
+ codePoint >> 0x6 & 0x3F | 0x80,
+ codePoint & 0x3F | 0x80
+ )
+ } else if (codePoint < 0x110000) {
+ if ((units -= 4) < 0) break
+ bytes.push(
+ codePoint >> 0x12 | 0xF0,
+ codePoint >> 0xC & 0x3F | 0x80,
+ codePoint >> 0x6 & 0x3F | 0x80,
+ codePoint & 0x3F | 0x80
+ )
+ } else {
+ throw new Error('Invalid code point')
+ }
+ }
+
+ return bytes
+}
+
+function asciiToBytes (str) {
+ var byteArray = []
+ for (var i = 0; i < str.length; ++i) {
+ // Node's code seems to be doing this and not & 0x7F..
+ byteArray.push(str.charCodeAt(i) & 0xFF)
+ }
+ return byteArray
+}
+
+function utf16leToBytes (str, units) {
+ var c, hi, lo
+ var byteArray = []
+ for (var i = 0; i < str.length; ++i) {
+ if ((units -= 2) < 0) break
+
+ c = str.charCodeAt(i)
+ hi = c >> 8
+ lo = c % 256
+ byteArray.push(lo)
+ byteArray.push(hi)
+ }
+
+ return byteArray
+}
+
+function base64ToBytes (str) {
+ return base64.toByteArray(base64clean(str))
+}
+
+function blitBuffer (src, dst, offset, length) {
+ for (var i = 0; i < length; ++i) {
+ if ((i + offset >= dst.length) || (i >= src.length)) break
+ dst[i + offset] = src[i]
+ }
+ return i
+}
+
+function isnan (val) {
+ return val !== val // eslint-disable-line no-self-compare
+}
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"base64-js":39,"ieee754":65,"isarray":68}],44:[function(require,module,exports){
+(function (Buffer){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// NOTE: These type checking functions intentionally don't use `instanceof`
+// because it is fragile and can be easily faked with `Object.create()`.
+
+function isArray(arg) {
+ if (Array.isArray) {
+ return Array.isArray(arg);
+ }
+ return objectToString(arg) === '[object Array]';
+}
+exports.isArray = isArray;
+
+function isBoolean(arg) {
+ return typeof arg === 'boolean';
+}
+exports.isBoolean = isBoolean;
+
+function isNull(arg) {
+ return arg === null;
+}
+exports.isNull = isNull;
+
+function isNullOrUndefined(arg) {
+ return arg == null;
+}
+exports.isNullOrUndefined = isNullOrUndefined;
+
+function isNumber(arg) {
+ return typeof arg === 'number';
+}
+exports.isNumber = isNumber;
+
+function isString(arg) {
+ return typeof arg === 'string';
+}
+exports.isString = isString;
+
+function isSymbol(arg) {
+ return typeof arg === 'symbol';
+}
+exports.isSymbol = isSymbol;
+
+function isUndefined(arg) {
+ return arg === void 0;
+}
+exports.isUndefined = isUndefined;
+
+function isRegExp(re) {
+ return objectToString(re) === '[object RegExp]';
+}
+exports.isRegExp = isRegExp;
+
+function isObject(arg) {
+ return typeof arg === 'object' && arg !== null;
+}
+exports.isObject = isObject;
+
+function isDate(d) {
+ return objectToString(d) === '[object Date]';
+}
+exports.isDate = isDate;
+
+function isError(e) {
+ return (objectToString(e) === '[object Error]' || e instanceof Error);
+}
+exports.isError = isError;
+
+function isFunction(arg) {
+ return typeof arg === 'function';
+}
+exports.isFunction = isFunction;
+
+function isPrimitive(arg) {
+ return arg === null ||
+ typeof arg === 'boolean' ||
+ typeof arg === 'number' ||
+ typeof arg === 'string' ||
+ typeof arg === 'symbol' || // ES6 symbol
+ typeof arg === 'undefined';
+}
+exports.isPrimitive = isPrimitive;
+
+exports.isBuffer = Buffer.isBuffer;
+
+function objectToString(o) {
+ return Object.prototype.toString.call(o);
+}
+
+}).call(this,{"isBuffer":require("../../is-buffer/index.js")})
+},{"../../is-buffer/index.js":67}],45:[function(require,module,exports){
+/*istanbul ignore start*/"use strict";
+
+exports.__esModule = true;
+exports. /*istanbul ignore end*/convertChangesToDMP = convertChangesToDMP;
+// See: http://code.google.com/p/google-diff-match-patch/wiki/API
+function convertChangesToDMP(changes) {
+ var ret = [],
+ change = /*istanbul ignore start*/void 0 /*istanbul ignore end*/,
+ operation = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;
+ for (var i = 0; i < changes.length; i++) {
+ change = changes[i];
+ if (change.added) {
+ operation = 1;
+ } else if (change.removed) {
+ operation = -1;
+ } else {
+ operation = 0;
+ }
+
+ ret.push([operation, change.value]);
+ }
+ return ret;
+}
+
+
+},{}],46:[function(require,module,exports){
+/*istanbul ignore start*/'use strict';
+
+exports.__esModule = true;
+exports. /*istanbul ignore end*/convertChangesToXML = convertChangesToXML;
+function convertChangesToXML(changes) {
+ var ret = [];
+ for (var i = 0; i < changes.length; i++) {
+ var change = changes[i];
+ if (change.added) {
+ ret.push('<ins>');
+ } else if (change.removed) {
+ ret.push('<del>');
+ }
+
+ ret.push(escapeHTML(change.value));
+
+ if (change.added) {
+ ret.push('</ins>');
+ } else if (change.removed) {
+ ret.push('</del>');
+ }
+ }
+ return ret.join('');
+}
+
+function escapeHTML(s) {
+ var n = s;
+ n = n.replace(/&/g, '&amp;');
+ n = n.replace(/</g, '&lt;');
+ n = n.replace(/>/g, '&gt;');
+ n = n.replace(/"/g, '&quot;');
+
+ return n;
+}
+
+
+},{}],47:[function(require,module,exports){
+/*istanbul ignore start*/'use strict';
+
+exports.__esModule = true;
+exports.arrayDiff = undefined;
+exports. /*istanbul ignore end*/diffArrays = diffArrays;
+
+var /*istanbul ignore start*/_base = require('./base') /*istanbul ignore end*/;
+
+/*istanbul ignore start*/
+var _base2 = _interopRequireDefault(_base);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+/*istanbul ignore end*/var arrayDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/arrayDiff = new /*istanbul ignore start*/_base2['default']() /*istanbul ignore end*/;
+arrayDiff.tokenize = arrayDiff.join = function (value) {
+ return value.slice();
+};
+
+function diffArrays(oldArr, newArr, callback) {
+ return arrayDiff.diff(oldArr, newArr, callback);
+}
+
+
+},{"./base":48}],48:[function(require,module,exports){
+/*istanbul ignore start*/'use strict';
+
+exports.__esModule = true;
+exports['default'] = /*istanbul ignore end*/Diff;
+function Diff() {}
+
+Diff.prototype = { /*istanbul ignore start*/
+ /*istanbul ignore end*/diff: function diff(oldString, newString) {
+ /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
+
+ var callback = options.callback;
+ if (typeof options === 'function') {
+ callback = options;
+ options = {};
+ }
+ this.options = options;
+
+ var self = this;
+
+ function done(value) {
+ if (callback) {
+ setTimeout(function () {
+ callback(undefined, value);
+ }, 0);
+ return true;
+ } else {
+ return value;
+ }
+ }
+
+ // Allow subclasses to massage the input prior to running
+ oldString = this.castInput(oldString);
+ newString = this.castInput(newString);
+
+ oldString = this.removeEmpty(this.tokenize(oldString));
+ newString = this.removeEmpty(this.tokenize(newString));
+
+ var newLen = newString.length,
+ oldLen = oldString.length;
+ var editLength = 1;
+ var maxEditLength = newLen + oldLen;
+ var bestPath = [{ newPos: -1, components: [] }];
+
+ // Seed editLength = 0, i.e. the content starts with the same values
+ var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0);
+ if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) {
+ // Identity per the equality and tokenizer
+ return done([{ value: this.join(newString), count: newString.length }]);
+ }
+
+ // Main worker method. checks all permutations of a given edit length for acceptance.
+ function execEditLength() {
+ for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) {
+ var basePath = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;
+ var addPath = bestPath[diagonalPath - 1],
+ removePath = bestPath[diagonalPath + 1],
+ _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath;
+ if (addPath) {
+ // No one else is going to attempt to use this value, clear it
+ bestPath[diagonalPath - 1] = undefined;
+ }
+
+ var canAdd = addPath && addPath.newPos + 1 < newLen,
+ canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen;
+ if (!canAdd && !canRemove) {
+ // If this path is a terminal then prune
+ bestPath[diagonalPath] = undefined;
+ continue;
+ }
+
+ // Select the diagonal that we want to branch from. We select the prior
+ // path whose position in the new string is the farthest from the origin
+ // and does not pass the bounds of the diff graph
+ if (!canAdd || canRemove && addPath.newPos < removePath.newPos) {
+ basePath = clonePath(removePath);
+ self.pushComponent(basePath.components, undefined, true);
+ } else {
+ basePath = addPath; // No need to clone, we've pulled it from the list
+ basePath.newPos++;
+ self.pushComponent(basePath.components, true, undefined);
+ }
+
+ _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath);
+
+ // If we have hit the end of both strings, then we are done
+ if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) {
+ return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken));
+ } else {
+ // Otherwise track this path as a potential candidate and continue.
+ bestPath[diagonalPath] = basePath;
+ }
+ }
+
+ editLength++;
+ }
+
+ // Performs the length of edit iteration. Is a bit fugly as this has to support the
+ // sync and async mode which is never fun. Loops over execEditLength until a value
+ // is produced.
+ if (callback) {
+ (function exec() {
+ setTimeout(function () {
+ // This should not happen, but we want to be safe.
+ /* istanbul ignore next */
+ if (editLength > maxEditLength) {
+ return callback();
+ }
+
+ if (!execEditLength()) {
+ exec();
+ }
+ }, 0);
+ })();
+ } else {
+ while (editLength <= maxEditLength) {
+ var ret = execEditLength();
+ if (ret) {
+ return ret;
+ }
+ }
+ }
+ },
+ /*istanbul ignore start*/ /*istanbul ignore end*/pushComponent: function pushComponent(components, added, removed) {
+ var last = components[components.length - 1];
+ if (last && last.added === added && last.removed === removed) {
+ // We need to clone here as the component clone operation is just
+ // as shallow array clone
+ components[components.length - 1] = { count: last.count + 1, added: added, removed: removed };
+ } else {
+ components.push({ count: 1, added: added, removed: removed });
+ }
+ },
+ /*istanbul ignore start*/ /*istanbul ignore end*/extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) {
+ var newLen = newString.length,
+ oldLen = oldString.length,
+ newPos = basePath.newPos,
+ oldPos = newPos - diagonalPath,
+ commonCount = 0;
+ while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) {
+ newPos++;
+ oldPos++;
+ commonCount++;
+ }
+
+ if (commonCount) {
+ basePath.components.push({ count: commonCount });
+ }
+
+ basePath.newPos = newPos;
+ return oldPos;
+ },
+ /*istanbul ignore start*/ /*istanbul ignore end*/equals: function equals(left, right) {
+ return left === right;
+ },
+ /*istanbul ignore start*/ /*istanbul ignore end*/removeEmpty: function removeEmpty(array) {
+ var ret = [];
+ for (var i = 0; i < array.length; i++) {
+ if (array[i]) {
+ ret.push(array[i]);
+ }
+ }
+ return ret;
+ },
+ /*istanbul ignore start*/ /*istanbul ignore end*/castInput: function castInput(value) {
+ return value;
+ },
+ /*istanbul ignore start*/ /*istanbul ignore end*/tokenize: function tokenize(value) {
+ return value.split('');
+ },
+ /*istanbul ignore start*/ /*istanbul ignore end*/join: function join(chars) {
+ return chars.join('');
+ }
+};
+
+function buildValues(diff, components, newString, oldString, useLongestToken) {
+ var componentPos = 0,
+ componentLen = components.length,
+ newPos = 0,
+ oldPos = 0;
+
+ for (; componentPos < componentLen; componentPos++) {
+ var component = components[componentPos];
+ if (!component.removed) {
+ if (!component.added && useLongestToken) {
+ var value = newString.slice(newPos, newPos + component.count);
+ value = value.map(function (value, i) {
+ var oldValue = oldString[oldPos + i];
+ return oldValue.length > value.length ? oldValue : value;
+ });
+
+ component.value = diff.join(value);
+ } else {
+ component.value = diff.join(newString.slice(newPos, newPos + component.count));
+ }
+ newPos += component.count;
+
+ // Common case
+ if (!component.added) {
+ oldPos += component.count;
+ }
+ } else {
+ component.value = diff.join(oldString.slice(oldPos, oldPos + component.count));
+ oldPos += component.count;
+
+ // Reverse add and remove so removes are output first to match common convention
+ // The diffing algorithm is tied to add then remove output and this is the simplest
+ // route to get the desired output with minimal overhead.
+ if (componentPos && components[componentPos - 1].added) {
+ var tmp = components[componentPos - 1];
+ components[componentPos - 1] = components[componentPos];
+ components[componentPos] = tmp;
+ }
+ }
+ }
+
+ // Special case handle for when one terminal is ignored. For this case we merge the
+ // terminal into the prior string and drop the change.
+ var lastComponent = components[componentLen - 1];
+ if (componentLen > 1 && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) {
+ components[componentLen - 2].value += lastComponent.value;
+ components.pop();
+ }
+
+ return components;
+}
+
+function clonePath(path) {
+ return { newPos: path.newPos, components: path.components.slice(0) };
+}
+
+
+},{}],49:[function(require,module,exports){
+/*istanbul ignore start*/'use strict';
+
+exports.__esModule = true;
+exports.characterDiff = undefined;
+exports. /*istanbul ignore end*/diffChars = diffChars;
+
+var /*istanbul ignore start*/_base = require('./base') /*istanbul ignore end*/;
+
+/*istanbul ignore start*/
+var _base2 = _interopRequireDefault(_base);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+/*istanbul ignore end*/var characterDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/characterDiff = new /*istanbul ignore start*/_base2['default']() /*istanbul ignore end*/;
+function diffChars(oldStr, newStr, callback) {
+ return characterDiff.diff(oldStr, newStr, callback);
+}
+
+
+},{"./base":48}],50:[function(require,module,exports){
+/*istanbul ignore start*/'use strict';
+
+exports.__esModule = true;
+exports.cssDiff = undefined;
+exports. /*istanbul ignore end*/diffCss = diffCss;
+
+var /*istanbul ignore start*/_base = require('./base') /*istanbul ignore end*/;
+
+/*istanbul ignore start*/
+var _base2 = _interopRequireDefault(_base);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+/*istanbul ignore end*/var cssDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/cssDiff = new /*istanbul ignore start*/_base2['default']() /*istanbul ignore end*/;
+cssDiff.tokenize = function (value) {
+ return value.split(/([{}:;,]|\s+)/);
+};
+
+function diffCss(oldStr, newStr, callback) {
+ return cssDiff.diff(oldStr, newStr, callback);
+}
+
+
+},{"./base":48}],51:[function(require,module,exports){
+/*istanbul ignore start*/'use strict';
+
+exports.__esModule = true;
+exports.jsonDiff = undefined;
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
+
+exports. /*istanbul ignore end*/diffJson = diffJson;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/canonicalize = canonicalize;
+
+var /*istanbul ignore start*/_base = require('./base') /*istanbul ignore end*/;
+
+/*istanbul ignore start*/
+var _base2 = _interopRequireDefault(_base);
+
+/*istanbul ignore end*/
+var /*istanbul ignore start*/_line = require('./line') /*istanbul ignore end*/;
+
+/*istanbul ignore start*/
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+/*istanbul ignore end*/
+
+var objectPrototypeToString = Object.prototype.toString;
+
+var jsonDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/jsonDiff = new /*istanbul ignore start*/_base2['default']() /*istanbul ignore end*/;
+// Discriminate between two lines of pretty-printed, serialized JSON where one of them has a
+// dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output:
+jsonDiff.useLongestToken = true;
+
+jsonDiff.tokenize = /*istanbul ignore start*/_line.lineDiff. /*istanbul ignore end*/tokenize;
+jsonDiff.castInput = function (value) {
+ /*istanbul ignore start*/var /*istanbul ignore end*/undefinedReplacement = this.options.undefinedReplacement;
+
+
+ return typeof value === 'string' ? value : JSON.stringify(canonicalize(value), function (k, v) {
+ if (typeof v === 'undefined') {
+ return undefinedReplacement;
+ }
+
+ return v;
+ }, ' ');
+};
+jsonDiff.equals = function (left, right) {
+ return (/*istanbul ignore start*/_base2['default']. /*istanbul ignore end*/prototype.equals(left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1'))
+ );
+};
+
+function diffJson(oldObj, newObj, options) {
+ return jsonDiff.diff(oldObj, newObj, options);
+}
+
+// This function handles the presence of circular references by bailing out when encountering an
+// object that is already on the "stack" of items being processed.
+function canonicalize(obj, stack, replacementStack) {
+ stack = stack || [];
+ replacementStack = replacementStack || [];
+
+ var i = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;
+
+ for (i = 0; i < stack.length; i += 1) {
+ if (stack[i] === obj) {
+ return replacementStack[i];
+ }
+ }
+
+ var canonicalizedObj = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;
+
+ if ('[object Array]' === objectPrototypeToString.call(obj)) {
+ stack.push(obj);
+ canonicalizedObj = new Array(obj.length);
+ replacementStack.push(canonicalizedObj);
+ for (i = 0; i < obj.length; i += 1) {
+ canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack);
+ }
+ stack.pop();
+ replacementStack.pop();
+ return canonicalizedObj;
+ }
+
+ if (obj && obj.toJSON) {
+ obj = obj.toJSON();
+ }
+
+ if ( /*istanbul ignore start*/(typeof /*istanbul ignore end*/obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && obj !== null) {
+ stack.push(obj);
+ canonicalizedObj = {};
+ replacementStack.push(canonicalizedObj);
+ var sortedKeys = [],
+ key = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;
+ for (key in obj) {
+ /* istanbul ignore else */
+ if (obj.hasOwnProperty(key)) {
+ sortedKeys.push(key);
+ }
+ }
+ sortedKeys.sort();
+ for (i = 0; i < sortedKeys.length; i += 1) {
+ key = sortedKeys[i];
+ canonicalizedObj[key] = canonicalize(obj[key], stack, replacementStack);
+ }
+ stack.pop();
+ replacementStack.pop();
+ } else {
+ canonicalizedObj = obj;
+ }
+ return canonicalizedObj;
+}
+
+
+},{"./base":48,"./line":52}],52:[function(require,module,exports){
+/*istanbul ignore start*/'use strict';
+
+exports.__esModule = true;
+exports.lineDiff = undefined;
+exports. /*istanbul ignore end*/diffLines = diffLines;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/diffTrimmedLines = diffTrimmedLines;
+
+var /*istanbul ignore start*/_base = require('./base') /*istanbul ignore end*/;
+
+/*istanbul ignore start*/
+var _base2 = _interopRequireDefault(_base);
+
+/*istanbul ignore end*/
+var /*istanbul ignore start*/_params = require('../util/params') /*istanbul ignore end*/;
+
+/*istanbul ignore start*/
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+/*istanbul ignore end*/var lineDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/lineDiff = new /*istanbul ignore start*/_base2['default']() /*istanbul ignore end*/;
+lineDiff.tokenize = function (value) {
+ var retLines = [],
+ linesAndNewlines = value.split(/(\n|\r\n)/);
+
+ // Ignore the final empty token that occurs if the string ends with a new line
+ if (!linesAndNewlines[linesAndNewlines.length - 1]) {
+ linesAndNewlines.pop();
+ }
+
+ // Merge the content and line separators into single tokens
+ for (var i = 0; i < linesAndNewlines.length; i++) {
+ var line = linesAndNewlines[i];
+
+ if (i % 2 && !this.options.newlineIsToken) {
+ retLines[retLines.length - 1] += line;
+ } else {
+ if (this.options.ignoreWhitespace) {
+ line = line.trim();
+ }
+ retLines.push(line);
+ }
+ }
+
+ return retLines;
+};
+
+function diffLines(oldStr, newStr, callback) {
+ return lineDiff.diff(oldStr, newStr, callback);
+}
+function diffTrimmedLines(oldStr, newStr, callback) {
+ var options = /*istanbul ignore start*/(0, _params.generateOptions) /*istanbul ignore end*/(callback, { ignoreWhitespace: true });
+ return lineDiff.diff(oldStr, newStr, options);
+}
+
+
+},{"../util/params":60,"./base":48}],53:[function(require,module,exports){
+/*istanbul ignore start*/'use strict';
+
+exports.__esModule = true;
+exports.sentenceDiff = undefined;
+exports. /*istanbul ignore end*/diffSentences = diffSentences;
+
+var /*istanbul ignore start*/_base = require('./base') /*istanbul ignore end*/;
+
+/*istanbul ignore start*/
+var _base2 = _interopRequireDefault(_base);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+/*istanbul ignore end*/var sentenceDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/sentenceDiff = new /*istanbul ignore start*/_base2['default']() /*istanbul ignore end*/;
+sentenceDiff.tokenize = function (value) {
+ return value.split(/(\S.+?[.!?])(?=\s+|$)/);
+};
+
+function diffSentences(oldStr, newStr, callback) {
+ return sentenceDiff.diff(oldStr, newStr, callback);
+}
+
+
+},{"./base":48}],54:[function(require,module,exports){
+/*istanbul ignore start*/'use strict';
+
+exports.__esModule = true;
+exports.wordDiff = undefined;
+exports. /*istanbul ignore end*/diffWords = diffWords;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/diffWordsWithSpace = diffWordsWithSpace;
+
+var /*istanbul ignore start*/_base = require('./base') /*istanbul ignore end*/;
+
+/*istanbul ignore start*/
+var _base2 = _interopRequireDefault(_base);
+
+/*istanbul ignore end*/
+var /*istanbul ignore start*/_params = require('../util/params') /*istanbul ignore end*/;
+
+/*istanbul ignore start*/
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+/*istanbul ignore end*/
+
+// Based on https://en.wikipedia.org/wiki/Latin_script_in_Unicode
+//
+// Ranges and exceptions:
+// Latin-1 Supplement, 0080–00FF
+// - U+00D7 × Multiplication sign
+// - U+00F7 ÷ Division sign
+// Latin Extended-A, 0100–017F
+// Latin Extended-B, 0180–024F
+// IPA Extensions, 0250–02AF
+// Spacing Modifier Letters, 02B0–02FF
+// - U+02C7 ˇ &#711; Caron
+// - U+02D8 ˘ &#728; Breve
+// - U+02D9 ˙ &#729; Dot Above
+// - U+02DA ˚ &#730; Ring Above
+// - U+02DB ˛ &#731; Ogonek
+// - U+02DC ˜ &#732; Small Tilde
+// - U+02DD ˝ &#733; Double Acute Accent
+// Latin Extended Additional, 1E00–1EFF
+var extendedWordChars = /^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/;
+
+var reWhitespace = /\S/;
+
+var wordDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/wordDiff = new /*istanbul ignore start*/_base2['default']() /*istanbul ignore end*/;
+wordDiff.equals = function (left, right) {
+ return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right);
+};
+wordDiff.tokenize = function (value) {
+ var tokens = value.split(/(\s+|\b)/);
+
+ // Join the boundary splits that we do not consider to be boundaries. This is primarily the extended Latin character set.
+ for (var i = 0; i < tokens.length - 1; i++) {
+ // If we have an empty string in the next field and we have only word chars before and after, merge
+ if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) {
+ tokens[i] += tokens[i + 2];
+ tokens.splice(i + 1, 2);
+ i--;
+ }
+ }
+
+ return tokens;
+};
+
+function diffWords(oldStr, newStr, callback) {
+ var options = /*istanbul ignore start*/(0, _params.generateOptions) /*istanbul ignore end*/(callback, { ignoreWhitespace: true });
+ return wordDiff.diff(oldStr, newStr, options);
+}
+function diffWordsWithSpace(oldStr, newStr, callback) {
+ return wordDiff.diff(oldStr, newStr, callback);
+}
+
+
+},{"../util/params":60,"./base":48}],55:[function(require,module,exports){
+/*istanbul ignore start*/'use strict';
+
+exports.__esModule = true;
+exports.canonicalize = exports.convertChangesToXML = exports.convertChangesToDMP = exports.parsePatch = exports.applyPatches = exports.applyPatch = exports.createPatch = exports.createTwoFilesPatch = exports.structuredPatch = exports.diffArrays = exports.diffJson = exports.diffCss = exports.diffSentences = exports.diffTrimmedLines = exports.diffLines = exports.diffWordsWithSpace = exports.diffWords = exports.diffChars = exports.Diff = undefined;
+/*istanbul ignore end*/
+var /*istanbul ignore start*/_base = require('./diff/base') /*istanbul ignore end*/;
+
+/*istanbul ignore start*/
+var _base2 = _interopRequireDefault(_base);
+
+/*istanbul ignore end*/
+var /*istanbul ignore start*/_character = require('./diff/character') /*istanbul ignore end*/;
+
+var /*istanbul ignore start*/_word = require('./diff/word') /*istanbul ignore end*/;
+
+var /*istanbul ignore start*/_line = require('./diff/line') /*istanbul ignore end*/;
+
+var /*istanbul ignore start*/_sentence = require('./diff/sentence') /*istanbul ignore end*/;
+
+var /*istanbul ignore start*/_css = require('./diff/css') /*istanbul ignore end*/;
+
+var /*istanbul ignore start*/_json = require('./diff/json') /*istanbul ignore end*/;
+
+var /*istanbul ignore start*/_array = require('./diff/array') /*istanbul ignore end*/;
+
+var /*istanbul ignore start*/_apply = require('./patch/apply') /*istanbul ignore end*/;
+
+var /*istanbul ignore start*/_parse = require('./patch/parse') /*istanbul ignore end*/;
+
+var /*istanbul ignore start*/_create = require('./patch/create') /*istanbul ignore end*/;
+
+var /*istanbul ignore start*/_dmp = require('./convert/dmp') /*istanbul ignore end*/;
+
+var /*istanbul ignore start*/_xml = require('./convert/xml') /*istanbul ignore end*/;
+
+/*istanbul ignore start*/
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+exports. /*istanbul ignore end*/Diff = _base2['default'];
+/*istanbul ignore start*/exports. /*istanbul ignore end*/diffChars = _character.diffChars;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/diffWords = _word.diffWords;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/diffWordsWithSpace = _word.diffWordsWithSpace;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/diffLines = _line.diffLines;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/diffTrimmedLines = _line.diffTrimmedLines;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/diffSentences = _sentence.diffSentences;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/diffCss = _css.diffCss;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/diffJson = _json.diffJson;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/diffArrays = _array.diffArrays;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/structuredPatch = _create.structuredPatch;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/createTwoFilesPatch = _create.createTwoFilesPatch;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/createPatch = _create.createPatch;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatch = _apply.applyPatch;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatches = _apply.applyPatches;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/parsePatch = _parse.parsePatch;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/convertChangesToDMP = _dmp.convertChangesToDMP;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/convertChangesToXML = _xml.convertChangesToXML;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/canonicalize = _json.canonicalize; /* See LICENSE file for terms of use */
+
+/*
+ * Text diff implementation.
+ *
+ * This library supports the following APIS:
+ * JsDiff.diffChars: Character by character diff
+ * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace
+ * JsDiff.diffLines: Line based diff
+ *
+ * JsDiff.diffCss: Diff targeted at CSS content
+ *
+ * These methods are based on the implementation proposed in
+ * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986).
+ * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927
+ */
+
+
+},{"./convert/dmp":45,"./convert/xml":46,"./diff/array":47,"./diff/base":48,"./diff/character":49,"./diff/css":50,"./diff/json":51,"./diff/line":52,"./diff/sentence":53,"./diff/word":54,"./patch/apply":56,"./patch/create":57,"./patch/parse":58}],56:[function(require,module,exports){
+/*istanbul ignore start*/'use strict';
+
+exports.__esModule = true;
+exports. /*istanbul ignore end*/applyPatch = applyPatch;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatches = applyPatches;
+
+var /*istanbul ignore start*/_parse = require('./parse') /*istanbul ignore end*/;
+
+var /*istanbul ignore start*/_distanceIterator = require('../util/distance-iterator') /*istanbul ignore end*/;
+
+/*istanbul ignore start*/
+var _distanceIterator2 = _interopRequireDefault(_distanceIterator);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+/*istanbul ignore end*/function applyPatch(source, uniDiff) {
+ /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
+
+ if (typeof uniDiff === 'string') {
+ uniDiff = /*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(uniDiff);
+ }
+
+ if (Array.isArray(uniDiff)) {
+ if (uniDiff.length > 1) {
+ throw new Error('applyPatch only works with a single input.');
+ }
+
+ uniDiff = uniDiff[0];
+ }
+
+ // Apply the diff to the input
+ var lines = source.split(/\r\n|[\n\v\f\r\x85]/),
+ delimiters = source.match(/\r\n|[\n\v\f\r\x85]/g) || [],
+ hunks = uniDiff.hunks,
+ compareLine = options.compareLine || function (lineNumber, line, operation, patchContent) /*istanbul ignore start*/{
+ return (/*istanbul ignore end*/line === patchContent
+ );
+ },
+ errorCount = 0,
+ fuzzFactor = options.fuzzFactor || 0,
+ minLine = 0,
+ offset = 0,
+ removeEOFNL = /*istanbul ignore start*/void 0 /*istanbul ignore end*/,
+ addEOFNL = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;
+
+ /**
+ * Checks if the hunk exactly fits on the provided location
+ */
+ function hunkFits(hunk, toPos) {
+ for (var j = 0; j < hunk.lines.length; j++) {
+ var line = hunk.lines[j],
+ operation = line[0],
+ content = line.substr(1);
+
+ if (operation === ' ' || operation === '-') {
+ // Context sanity check
+ if (!compareLine(toPos + 1, lines[toPos], operation, content)) {
+ errorCount++;
+
+ if (errorCount > fuzzFactor) {
+ return false;
+ }
+ }
+ toPos++;
+ }
+ }
+
+ return true;
+ }
+
+ // Search best fit offsets for each hunk based on the previous ones
+ for (var i = 0; i < hunks.length; i++) {
+ var hunk = hunks[i],
+ maxLine = lines.length - hunk.oldLines,
+ localOffset = 0,
+ toPos = offset + hunk.oldStart - 1;
+
+ var iterator = /*istanbul ignore start*/(0, _distanceIterator2['default']) /*istanbul ignore end*/(toPos, minLine, maxLine);
+
+ for (; localOffset !== undefined; localOffset = iterator()) {
+ if (hunkFits(hunk, toPos + localOffset)) {
+ hunk.offset = offset += localOffset;
+ break;
+ }
+ }
+
+ if (localOffset === undefined) {
+ return false;
+ }
+
+ // Set lower text limit to end of the current hunk, so next ones don't try
+ // to fit over already patched text
+ minLine = hunk.offset + hunk.oldStart + hunk.oldLines;
+ }
+
+ // Apply patch hunks
+ for (var _i = 0; _i < hunks.length; _i++) {
+ var _hunk = hunks[_i],
+ _toPos = _hunk.offset + _hunk.newStart - 1;
+ if (_hunk.newLines == 0) {
+ _toPos++;
+ }
+
+ for (var j = 0; j < _hunk.lines.length; j++) {
+ var line = _hunk.lines[j],
+ operation = line[0],
+ content = line.substr(1),
+ delimiter = _hunk.linedelimiters[j];
+
+ if (operation === ' ') {
+ _toPos++;
+ } else if (operation === '-') {
+ lines.splice(_toPos, 1);
+ delimiters.splice(_toPos, 1);
+ /* istanbul ignore else */
+ } else if (operation === '+') {
+ lines.splice(_toPos, 0, content);
+ delimiters.splice(_toPos, 0, delimiter);
+ _toPos++;
+ } else if (operation === '\\') {
+ var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null;
+ if (previousOperation === '+') {
+ removeEOFNL = true;
+ } else if (previousOperation === '-') {
+ addEOFNL = true;
+ }
+ }
+ }
+ }
+
+ // Handle EOFNL insertion/removal
+ if (removeEOFNL) {
+ while (!lines[lines.length - 1]) {
+ lines.pop();
+ delimiters.pop();
+ }
+ } else if (addEOFNL) {
+ lines.push('');
+ delimiters.push('\n');
+ }
+ for (var _k = 0; _k < lines.length - 1; _k++) {
+ lines[_k] = lines[_k] + delimiters[_k];
+ }
+ return lines.join('');
+}
+
+// Wrapper that supports multiple file patches via callbacks.
+function applyPatches(uniDiff, options) {
+ if (typeof uniDiff === 'string') {
+ uniDiff = /*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(uniDiff);
+ }
+
+ var currentIndex = 0;
+ function processIndex() {
+ var index = uniDiff[currentIndex++];
+ if (!index) {
+ return options.complete();
+ }
+
+ options.loadFile(index, function (err, data) {
+ if (err) {
+ return options.complete(err);
+ }
+
+ var updatedContent = applyPatch(data, index, options);
+ options.patched(index, updatedContent, function (err) {
+ if (err) {
+ return options.complete(err);
+ }
+
+ processIndex();
+ });
+ });
+ }
+ processIndex();
+}
+
+
+},{"../util/distance-iterator":59,"./parse":58}],57:[function(require,module,exports){
+/*istanbul ignore start*/'use strict';
+
+exports.__esModule = true;
+exports. /*istanbul ignore end*/structuredPatch = structuredPatch;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/createTwoFilesPatch = createTwoFilesPatch;
+/*istanbul ignore start*/exports. /*istanbul ignore end*/createPatch = createPatch;
+
+var /*istanbul ignore start*/_line = require('../diff/line') /*istanbul ignore end*/;
+
+/*istanbul ignore start*/
+function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+
+/*istanbul ignore end*/function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {
+ if (!options) {
+ options = {};
+ }
+ if (typeof options.context === 'undefined') {
+ options.context = 4;
+ }
+
+ var diff = /*istanbul ignore start*/(0, _line.diffLines) /*istanbul ignore end*/(oldStr, newStr, options);
+ diff.push({ value: '', lines: [] }); // Append an empty value to make cleanup easier
+
+ function contextLines(lines) {
+ return lines.map(function (entry) {
+ return ' ' + entry;
+ });
+ }
+
+ var hunks = [];
+ var oldRangeStart = 0,
+ newRangeStart = 0,
+ curRange = [],
+ oldLine = 1,
+ newLine = 1;
+ /*istanbul ignore start*/
+ var _loop = function _loop( /*istanbul ignore end*/i) {
+ var current = diff[i],
+ lines = current.lines || current.value.replace(/\n$/, '').split('\n');
+ current.lines = lines;
+
+ if (current.added || current.removed) {
+ /*istanbul ignore start*/
+ var _curRange;
+
+ /*istanbul ignore end*/
+ // If we have previous context, start with that
+ if (!oldRangeStart) {
+ var prev = diff[i - 1];
+ oldRangeStart = oldLine;
+ newRangeStart = newLine;
+
+ if (prev) {
+ curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : [];
+ oldRangeStart -= curRange.length;
+ newRangeStart -= curRange.length;
+ }
+ }
+
+ // Output our changes
+ /*istanbul ignore start*/(_curRange = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/lines.map(function (entry) {
+ return (current.added ? '+' : '-') + entry;
+ })));
+
+ // Track the updated file position
+ if (current.added) {
+ newLine += lines.length;
+ } else {
+ oldLine += lines.length;
+ }
+ } else {
+ // Identical context lines. Track line changes
+ if (oldRangeStart) {
+ // Close out any changes that have been output (or join overlapping)
+ if (lines.length <= options.context * 2 && i < diff.length - 2) {
+ /*istanbul ignore start*/
+ var _curRange2;
+
+ /*istanbul ignore end*/
+ // Overlapping
+ /*istanbul ignore start*/(_curRange2 = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange2 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/contextLines(lines)));
+ } else {
+ /*istanbul ignore start*/
+ var _curRange3;
+
+ /*istanbul ignore end*/
+ // end the range and output
+ var contextSize = Math.min(lines.length, options.context);
+ /*istanbul ignore start*/(_curRange3 = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange3 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/contextLines(lines.slice(0, contextSize))));
+
+ var hunk = {
+ oldStart: oldRangeStart,
+ oldLines: oldLine - oldRangeStart + contextSize,
+ newStart: newRangeStart,
+ newLines: newLine - newRangeStart + contextSize,
+ lines: curRange
+ };
+ if (i >= diff.length - 2 && lines.length <= options.context) {
+ // EOF is inside this hunk
+ var oldEOFNewline = /\n$/.test(oldStr);
+ var newEOFNewline = /\n$/.test(newStr);
+ if (lines.length == 0 && !oldEOFNewline) {
+ // special case: old has no eol and no trailing context; no-nl can end up before adds
+ curRange.splice(hunk.oldLines, 0, '\\ No newline at end of file');
+ } else if (!oldEOFNewline || !newEOFNewline) {
+ curRange.push('\\ No newline at end of file');
+ }
+ }
+ hunks.push(hunk);
+
+ oldRangeStart = 0;
+ newRangeStart = 0;
+ curRange = [];
+ }
+ }
+ oldLine += lines.length;
+ newLine += lines.length;
+ }
+ };
+
+ for (var i = 0; i < diff.length; i++) {
+ /*istanbul ignore start*/
+ _loop( /*istanbul ignore end*/i);
+ }
+
+ return {
+ oldFileName: oldFileName, newFileName: newFileName,
+ oldHeader: oldHeader, newHeader: newHeader,
+ hunks: hunks
+ };
+}
+
+function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {
+ var diff = structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options);
+
+ var ret = [];
+ if (oldFileName == newFileName) {
+ ret.push('Index: ' + oldFileName);
+ }
+ ret.push('===================================================================');
+ ret.push('--- ' + diff.oldFileName + (typeof diff.oldHeader === 'undefined' ? '' : '\t' + diff.oldHeader));
+ ret.push('+++ ' + diff.newFileName + (typeof diff.newHeader === 'undefined' ? '' : '\t' + diff.newHeader));
+
+ for (var i = 0; i < diff.hunks.length; i++) {
+ var hunk = diff.hunks[i];
+ ret.push('@@ -' + hunk.oldStart + ',' + hunk.oldLines + ' +' + hunk.newStart + ',' + hunk.newLines + ' @@');
+ ret.push.apply(ret, hunk.lines);
+ }
+
+ return ret.join('\n') + '\n';
+}
+
+function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) {
+ return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options);
+}
+
+
+},{"../diff/line":52}],58:[function(require,module,exports){
+/*istanbul ignore start*/'use strict';
+
+exports.__esModule = true;
+exports. /*istanbul ignore end*/parsePatch = parsePatch;
+function parsePatch(uniDiff) {
+ /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
+
+ var diffstr = uniDiff.split(/\r\n|[\n\v\f\r\x85]/),
+ delimiters = uniDiff.match(/\r\n|[\n\v\f\r\x85]/g) || [],
+ list = [],
+ i = 0;
+
+ function parseIndex() {
+ var index = {};
+ list.push(index);
+
+ // Parse diff metadata
+ while (i < diffstr.length) {
+ var line = diffstr[i];
+
+ // File header found, end parsing diff metadata
+ if (/^(\-\-\-|\+\+\+|@@)\s/.test(line)) {
+ break;
+ }
+
+ // Diff index
+ var header = /^(?:Index:|diff(?: -r \w+)+)\s+(.+?)\s*$/.exec(line);
+ if (header) {
+ index.index = header[1];
+ }
+
+ i++;
+ }
+
+ // Parse file headers if they are defined. Unified diff requires them, but
+ // there's no technical issues to have an isolated hunk without file header
+ parseFileHeader(index);
+ parseFileHeader(index);
+
+ // Parse hunks
+ index.hunks = [];
+
+ while (i < diffstr.length) {
+ var _line = diffstr[i];
+
+ if (/^(Index:|diff|\-\-\-|\+\+\+)\s/.test(_line)) {
+ break;
+ } else if (/^@@/.test(_line)) {
+ index.hunks.push(parseHunk());
+ } else if (_line && options.strict) {
+ // Ignore unexpected content unless in strict mode
+ throw new Error('Unknown line ' + (i + 1) + ' ' + JSON.stringify(_line));
+ } else {
+ i++;
+ }
+ }
+ }
+
+ // Parses the --- and +++ headers, if none are found, no lines
+ // are consumed.
+ function parseFileHeader(index) {
+ var headerPattern = /^(---|\+\+\+)\s+([\S ]*)(?:\t(.*?)\s*)?$/;
+ var fileHeader = headerPattern.exec(diffstr[i]);
+ if (fileHeader) {
+ var keyPrefix = fileHeader[1] === '---' ? 'old' : 'new';
+ index[keyPrefix + 'FileName'] = fileHeader[2];
+ index[keyPrefix + 'Header'] = fileHeader[3];
+
+ i++;
+ }
+ }
+
+ // Parses a hunk
+ // This assumes that we are at the start of a hunk.
+ function parseHunk() {
+ var chunkHeaderIndex = i,
+ chunkHeaderLine = diffstr[i++],
+ chunkHeader = chunkHeaderLine.split(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/);
+
+ var hunk = {
+ oldStart: +chunkHeader[1],
+ oldLines: +chunkHeader[2] || 1,
+ newStart: +chunkHeader[3],
+ newLines: +chunkHeader[4] || 1,
+ lines: [],
+ linedelimiters: []
+ };
+
+ var addCount = 0,
+ removeCount = 0;
+ for (; i < diffstr.length; i++) {
+ // Lines starting with '---' could be mistaken for the "remove line" operation
+ // But they could be the header for the next file. Therefore prune such cases out.
+ if (diffstr[i].indexOf('--- ') === 0 && i + 2 < diffstr.length && diffstr[i + 1].indexOf('+++ ') === 0 && diffstr[i + 2].indexOf('@@') === 0) {
+ break;
+ }
+ var operation = diffstr[i][0];
+
+ if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\') {
+ hunk.lines.push(diffstr[i]);
+ hunk.linedelimiters.push(delimiters[i] || '\n');
+
+ if (operation === '+') {
+ addCount++;
+ } else if (operation === '-') {
+ removeCount++;
+ } else if (operation === ' ') {
+ addCount++;
+ removeCount++;
+ }
+ } else {
+ break;
+ }
+ }
+
+ // Handle the empty block count case
+ if (!addCount && hunk.newLines === 1) {
+ hunk.newLines = 0;
+ }
+ if (!removeCount && hunk.oldLines === 1) {
+ hunk.oldLines = 0;
+ }
+
+ // Perform optional sanity checking
+ if (options.strict) {
+ if (addCount !== hunk.newLines) {
+ throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1));
+ }
+ if (removeCount !== hunk.oldLines) {
+ throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1));
+ }
+ }
+
+ return hunk;
+ }
+
+ while (i < diffstr.length) {
+ parseIndex();
+ }
+
+ return list;
+}
+
+
+},{}],59:[function(require,module,exports){
+/*istanbul ignore start*/"use strict";
+
+exports.__esModule = true;
+
+exports["default"] = /*istanbul ignore end*/function (start, minLine, maxLine) {
+ var wantForward = true,
+ backwardExhausted = false,
+ forwardExhausted = false,
+ localOffset = 1;
+
+ return function iterator() {
+ if (wantForward && !forwardExhausted) {
+ if (backwardExhausted) {
+ localOffset++;
+ } else {
+ wantForward = false;
+ }
+
+ // Check if trying to fit beyond text length, and if not, check it fits
+ // after offset location (or desired location on first iteration)
+ if (start + localOffset <= maxLine) {
+ return localOffset;
+ }
+
+ forwardExhausted = true;
+ }
+
+ if (!backwardExhausted) {
+ if (!forwardExhausted) {
+ wantForward = true;
+ }
+
+ // Check if trying to fit before text beginning, and if not, check it fits
+ // before offset location
+ if (minLine <= start - localOffset) {
+ return -localOffset++;
+ }
+
+ backwardExhausted = true;
+ return iterator();
+ }
+
+ // We tried to fit hunk before text beginning and beyond text lenght, then
+ // hunk can't fit on the text. Return undefined
+ };
+};
+
+
+},{}],60:[function(require,module,exports){
+/*istanbul ignore start*/'use strict';
+
+exports.__esModule = true;
+exports. /*istanbul ignore end*/generateOptions = generateOptions;
+function generateOptions(options, defaults) {
+ if (typeof options === 'function') {
+ defaults.callback = options;
+ } else if (options) {
+ for (var name in options) {
+ /* istanbul ignore else */
+ if (options.hasOwnProperty(name)) {
+ defaults[name] = options[name];
+ }
+ }
+ }
+ return defaults;
+}
+
+
+},{}],61:[function(require,module,exports){
+'use strict';
+
+var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
+
+module.exports = function (str) {
+ if (typeof str !== 'string') {
+ throw new TypeError('Expected a string');
+ }
+
+ return str.replace(matchOperatorsRe, '\\$&');
+};
+
+},{}],62:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+function EventEmitter() {
+ this._events = this._events || {};
+ this._maxListeners = this._maxListeners || undefined;
+}
+module.exports = EventEmitter;
+
+// Backwards-compat with node 0.10.x
+EventEmitter.EventEmitter = EventEmitter;
+
+EventEmitter.prototype._events = undefined;
+EventEmitter.prototype._maxListeners = undefined;
+
+// By default EventEmitters will print a warning if more than 10 listeners are
+// added to it. This is a useful default which helps finding memory leaks.
+EventEmitter.defaultMaxListeners = 10;
+
+// Obviously not all Emitters should be limited to 10. This function allows
+// that to be increased. Set to zero for unlimited.
+EventEmitter.prototype.setMaxListeners = function(n) {
+ if (!isNumber(n) || n < 0 || isNaN(n))
+ throw TypeError('n must be a positive number');
+ this._maxListeners = n;
+ return this;
+};
+
+EventEmitter.prototype.emit = function(type) {
+ var er, handler, len, args, i, listeners;
+
+ if (!this._events)
+ this._events = {};
+
+ // If there is no 'error' event listener then throw.
+ if (type === 'error') {
+ if (!this._events.error ||
+ (isObject(this._events.error) && !this._events.error.length)) {
+ er = arguments[1];
+ if (er instanceof Error) {
+ throw er; // Unhandled 'error' event
+ } else {
+ // At least give some kind of context to the user
+ var err = new Error('Uncaught, unspecified "error" event. (' + er + ')');
+ err.context = er;
+ throw err;
+ }
+ }
+ }
+
+ handler = this._events[type];
+
+ if (isUndefined(handler))
+ return false;
+
+ if (isFunction(handler)) {
+ switch (arguments.length) {
+ // fast cases
+ case 1:
+ handler.call(this);
+ break;
+ case 2:
+ handler.call(this, arguments[1]);
+ break;
+ case 3:
+ handler.call(this, arguments[1], arguments[2]);
+ break;
+ // slower
+ default:
+ args = Array.prototype.slice.call(arguments, 1);
+ handler.apply(this, args);
+ }
+ } else if (isObject(handler)) {
+ args = Array.prototype.slice.call(arguments, 1);
+ listeners = handler.slice();
+ len = listeners.length;
+ for (i = 0; i < len; i++)
+ listeners[i].apply(this, args);
+ }
+
+ return true;
+};
+
+EventEmitter.prototype.addListener = function(type, listener) {
+ var m;
+
+ if (!isFunction(listener))
+ throw TypeError('listener must be a function');
+
+ if (!this._events)
+ this._events = {};
+
+ // To avoid recursion in the case that type === "newListener"! Before
+ // adding it to the listeners, first emit "newListener".
+ if (this._events.newListener)
+ this.emit('newListener', type,
+ isFunction(listener.listener) ?
+ listener.listener : listener);
+
+ if (!this._events[type])
+ // Optimize the case of one listener. Don't need the extra array object.
+ this._events[type] = listener;
+ else if (isObject(this._events[type]))
+ // If we've already got an array, just append.
+ this._events[type].push(listener);
+ else
+ // Adding the second element, need to change to array.
+ this._events[type] = [this._events[type], listener];
+
+ // Check for listener leak
+ if (isObject(this._events[type]) && !this._events[type].warned) {
+ if (!isUndefined(this._maxListeners)) {
+ m = this._maxListeners;
+ } else {
+ m = EventEmitter.defaultMaxListeners;
+ }
+
+ if (m && m > 0 && this._events[type].length > m) {
+ this._events[type].warned = true;
+ console.error('(node) warning: possible EventEmitter memory ' +
+ 'leak detected. %d listeners added. ' +
+ 'Use emitter.setMaxListeners() to increase limit.',
+ this._events[type].length);
+ if (typeof console.trace === 'function') {
+ // not supported in IE 10
+ console.trace();
+ }
+ }
+ }
+
+ return this;
+};
+
+EventEmitter.prototype.on = EventEmitter.prototype.addListener;
+
+EventEmitter.prototype.once = function(type, listener) {
+ if (!isFunction(listener))
+ throw TypeError('listener must be a function');
+
+ var fired = false;
+
+ function g() {
+ this.removeListener(type, g);
+
+ if (!fired) {
+ fired = true;
+ listener.apply(this, arguments);
+ }
+ }
+
+ g.listener = listener;
+ this.on(type, g);
+
+ return this;
+};
+
+// emits a 'removeListener' event iff the listener was removed
+EventEmitter.prototype.removeListener = function(type, listener) {
+ var list, position, length, i;
+
+ if (!isFunction(listener))
+ throw TypeError('listener must be a function');
+
+ if (!this._events || !this._events[type])
+ return this;
+
+ list = this._events[type];
+ length = list.length;
+ position = -1;
+
+ if (list === listener ||
+ (isFunction(list.listener) && list.listener === listener)) {
+ delete this._events[type];
+ if (this._events.removeListener)
+ this.emit('removeListener', type, listener);
+
+ } else if (isObject(list)) {
+ for (i = length; i-- > 0;) {
+ if (list[i] === listener ||
+ (list[i].listener && list[i].listener === listener)) {
+ position = i;
+ break;
+ }
+ }
+
+ if (position < 0)
+ return this;
+
+ if (list.length === 1) {
+ list.length = 0;
+ delete this._events[type];
+ } else {
+ list.splice(position, 1);
+ }
+
+ if (this._events.removeListener)
+ this.emit('removeListener', type, listener);
+ }
+
+ return this;
+};
+
+EventEmitter.prototype.removeAllListeners = function(type) {
+ var key, listeners;
+
+ if (!this._events)
+ return this;
+
+ // not listening for removeListener, no need to emit
+ if (!this._events.removeListener) {
+ if (arguments.length === 0)
+ this._events = {};
+ else if (this._events[type])
+ delete this._events[type];
+ return this;
+ }
+
+ // emit removeListener for all listeners on all events
+ if (arguments.length === 0) {
+ for (key in this._events) {
+ if (key === 'removeListener') continue;
+ this.removeAllListeners(key);
+ }
+ this.removeAllListeners('removeListener');
+ this._events = {};
+ return this;
+ }
+
+ listeners = this._events[type];
+
+ if (isFunction(listeners)) {
+ this.removeListener(type, listeners);
+ } else if (listeners) {
+ // LIFO order
+ while (listeners.length)
+ this.removeListener(type, listeners[listeners.length - 1]);
+ }
+ delete this._events[type];
+
+ return this;
+};
+
+EventEmitter.prototype.listeners = function(type) {
+ var ret;
+ if (!this._events || !this._events[type])
+ ret = [];
+ else if (isFunction(this._events[type]))
+ ret = [this._events[type]];
+ else
+ ret = this._events[type].slice();
+ return ret;
+};
+
+EventEmitter.prototype.listenerCount = function(type) {
+ if (this._events) {
+ var evlistener = this._events[type];
+
+ if (isFunction(evlistener))
+ return 1;
+ else if (evlistener)
+ return evlistener.length;
+ }
+ return 0;
+};
+
+EventEmitter.listenerCount = function(emitter, type) {
+ return emitter.listenerCount(type);
+};
+
+function isFunction(arg) {
+ return typeof arg === 'function';
+}
+
+function isNumber(arg) {
+ return typeof arg === 'number';
+}
+
+function isObject(arg) {
+ return typeof arg === 'object' && arg !== null;
+}
+
+function isUndefined(arg) {
+ return arg === void 0;
+}
+
+},{}],63:[function(require,module,exports){
+(function (process){
+// Growl - Copyright TJ Holowaychuk <tj@vision-media.ca> (MIT Licensed)
+
+/**
+ * Module dependencies.
+ */
+
+var exec = require('child_process').exec
+ , fs = require('fs')
+ , path = require('path')
+ , exists = fs.existsSync || path.existsSync
+ , os = require('os')
+ , quote = JSON.stringify
+ , cmd;
+
+function which(name) {
+ var paths = process.env.PATH.split(':');
+ var loc;
+
+ for (var i = 0, len = paths.length; i < len; ++i) {
+ loc = path.join(paths[i], name);
+ if (exists(loc)) return loc;
+ }
+}
+
+switch(os.type()) {
+ case 'Darwin':
+ if (which('terminal-notifier')) {
+ cmd = {
+ type: "Darwin-NotificationCenter"
+ , pkg: "terminal-notifier"
+ , msg: '-message'
+ , title: '-title'
+ , subtitle: '-subtitle'
+ , icon: '-appIcon'
+ , sound: '-sound'
+ , url: '-open'
+ , priority: {
+ cmd: '-execute'
+ , range: []
+ }
+ };
+ } else {
+ cmd = {
+ type: "Darwin-Growl"
+ , pkg: "growlnotify"
+ , msg: '-m'
+ , sticky: '--sticky'
+ , priority: {
+ cmd: '--priority'
+ , range: [
+ -2
+ , -1
+ , 0
+ , 1
+ , 2
+ , "Very Low"
+ , "Moderate"
+ , "Normal"
+ , "High"
+ , "Emergency"
+ ]
+ }
+ };
+ }
+ break;
+ case 'Linux':
+ if (which('growl')) {
+ cmd = {
+ type: "Linux-Growl"
+ , pkg: "growl"
+ , msg: '-m'
+ , title: '-title'
+ , subtitle: '-subtitle'
+ , host: {
+ cmd: '-H'
+ , hostname: '192.168.33.1'
+ }
+ };
+ } else {
+ cmd = {
+ type: "Linux"
+ , pkg: "notify-send"
+ , msg: ''
+ , sticky: '-t 0'
+ , icon: '-i'
+ , priority: {
+ cmd: '-u'
+ , range: [
+ "low"
+ , "normal"
+ , "critical"
+ ]
+ }
+ };
+ }
+ break;
+ case 'Windows_NT':
+ cmd = {
+ type: "Windows"
+ , pkg: "growlnotify"
+ , msg: ''
+ , sticky: '/s:true'
+ , title: '/t:'
+ , icon: '/i:'
+ , url: '/cu:'
+ , priority: {
+ cmd: '/p:'
+ , range: [
+ -2
+ , -1
+ , 0
+ , 1
+ , 2
+ ]
+ }
+ };
+ break;
+}
+
+/**
+ * Expose `growl`.
+ */
+
+exports = module.exports = growl;
+
+/**
+ * Node-growl version.
+ */
+
+exports.version = '1.4.1'
+
+/**
+ * Send growl notification _msg_ with _options_.
+ *
+ * Options:
+ *
+ * - title Notification title
+ * - sticky Make the notification stick (defaults to false)
+ * - priority Specify an int or named key (default is 0)
+ * - name Application name (defaults to growlnotify)
+ * - sound Sound efect ( in OSx defined in preferences -> sound -> effects) * works only in OSX > 10.8x
+ * - image
+ * - path to an icon sets --iconpath
+ * - path to an image sets --image
+ * - capitalized word sets --appIcon
+ * - filename uses extname as --icon
+ * - otherwise treated as --icon
+ *
+ * Examples:
+ *
+ * growl('New email')
+ * growl('5 new emails', { title: 'Thunderbird' })
+ * growl('5 new emails', { title: 'Thunderbird', sound: 'Purr' })
+ * growl('Email sent', function(){
+ * // ... notification sent
+ * })
+ *
+ * @param {string} msg
+ * @param {object} options
+ * @param {function} fn
+ * @api public
+ */
+
+function growl(msg, options, fn) {
+ var image
+ , args
+ , options = options || {}
+ , fn = fn || function(){};
+
+ if (options.exec) {
+ cmd = {
+ type: "Custom"
+ , pkg: options.exec
+ , range: []
+ };
+ }
+
+ // noop
+ if (!cmd) return fn(new Error('growl not supported on this platform'));
+ args = [cmd.pkg];
+
+ // image
+ if (image = options.image) {
+ switch(cmd.type) {
+ case 'Darwin-Growl':
+ var flag, ext = path.extname(image).substr(1)
+ flag = flag || ext == 'icns' && 'iconpath'
+ flag = flag || /^[A-Z]/.test(image) && 'appIcon'
+ flag = flag || /^png|gif|jpe?g$/.test(ext) && 'image'
+ flag = flag || ext && (image = ext) && 'icon'
+ flag = flag || 'icon'
+ args.push('--' + flag, quote(image))
+ break;
+ case 'Darwin-NotificationCenter':
+ args.push(cmd.icon, quote(image));
+ break;
+ case 'Linux':
+ args.push(cmd.icon, quote(image));
+ // libnotify defaults to sticky, set a hint for transient notifications
+ if (!options.sticky) args.push('--hint=int:transient:1');
+ break;
+ case 'Windows':
+ args.push(cmd.icon + quote(image));
+ break;
+ }
+ }
+
+ // sticky
+ if (options.sticky) args.push(cmd.sticky);
+
+ // priority
+ if (options.priority) {
+ var priority = options.priority + '';
+ var checkindexOf = cmd.priority.range.indexOf(priority);
+ if (~cmd.priority.range.indexOf(priority)) {
+ args.push(cmd.priority, options.priority);
+ }
+ }
+
+ //sound
+ if(options.sound && cmd.type === 'Darwin-NotificationCenter'){
+ args.push(cmd.sound, options.sound)
+ }
+
+ // name
+ if (options.name && cmd.type === "Darwin-Growl") {
+ args.push('--name', options.name);
+ }
+
+ switch(cmd.type) {
+ case 'Darwin-Growl':
+ args.push(cmd.msg);
+ args.push(quote(msg).replace(/\\n/g, '\n'));
+ if (options.title) args.push(quote(options.title));
+ break;
+ case 'Darwin-NotificationCenter':
+ args.push(cmd.msg);
+ var stringifiedMsg = quote(msg);
+ var escapedMsg = stringifiedMsg.replace(/\\n/g, '\n');
+ args.push(escapedMsg);
+ if (options.title) {
+ args.push(cmd.title);
+ args.push(quote(options.title));
+ }
+ if (options.subtitle) {
+ args.push(cmd.subtitle);
+ args.push(quote(options.subtitle));
+ }
+ if (options.url) {
+ args.push(cmd.url);
+ args.push(quote(options.url));
+ }
+ break;
+ case 'Linux-Growl':
+ args.push(cmd.msg);
+ args.push(quote(msg).replace(/\\n/g, '\n'));
+ if (options.title) args.push(quote(options.title));
+ if (cmd.host) {
+ args.push(cmd.host.cmd, cmd.host.hostname)
+ }
+ break;
+ case 'Linux':
+ if (options.title) {
+ args.push(quote(options.title));
+ args.push(cmd.msg);
+ args.push(quote(msg).replace(/\\n/g, '\n'));
+ } else {
+ args.push(quote(msg).replace(/\\n/g, '\n'));
+ }
+ break;
+ case 'Windows':
+ args.push(quote(msg).replace(/\\n/g, '\n'));
+ if (options.title) args.push(cmd.title + quote(options.title));
+ if (options.url) args.push(cmd.url + quote(options.url));
+ break;
+ case 'Custom':
+ args[0] = (function(origCommand) {
+ var message = options.title
+ ? options.title + ': ' + msg
+ : msg;
+ var command = origCommand.replace(/(^|[^%])%s/g, '$1' + quote(message));
+ if (command === origCommand) args.push(quote(message));
+ return command;
+ })(args[0]);
+ break;
+ }
+
+ // execute
+ exec(args.join(' '), fn);
+};
+
+}).call(this,require('_process'))
+},{"_process":82,"child_process":42,"fs":42,"os":80,"path":42}],64:[function(require,module,exports){
+(function (global){
+/*! https://mths.be/he v1.1.1 by @mathias | MIT license */
+;(function(root) {
+
+ // Detect free variables `exports`.
+ var freeExports = typeof exports == 'object' && exports;
+
+ // Detect free variable `module`.
+ var freeModule = typeof module == 'object' && module &&
+ module.exports == freeExports && module;
+
+ // Detect free variable `global`, from Node.js or Browserified code,
+ // and use it as `root`.
+ var freeGlobal = typeof global == 'object' && global;
+ if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
+ root = freeGlobal;
+ }
+
+ /*--------------------------------------------------------------------------*/
+
+ // All astral symbols.
+ var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
+ // All ASCII symbols (not just printable ASCII) except those listed in the
+ // first column of the overrides table.
+ // https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides
+ var regexAsciiWhitelist = /[\x01-\x7F]/g;
+ // All BMP symbols that are not ASCII newlines, printable ASCII symbols, or
+ // code points listed in the first column of the overrides table on
+ // https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides.
+ var regexBmpWhitelist = /[\x01-\t\x0B\f\x0E-\x1F\x7F\x81\x8D\x8F\x90\x9D\xA0-\uFFFF]/g;
+
+ var regexEncodeNonAscii = /<\u20D2|=\u20E5|>\u20D2|\u205F\u200A|\u219D\u0338|\u2202\u0338|\u2220\u20D2|\u2229\uFE00|\u222A\uFE00|\u223C\u20D2|\u223D\u0331|\u223E\u0333|\u2242\u0338|\u224B\u0338|\u224D\u20D2|\u224E\u0338|\u224F\u0338|\u2250\u0338|\u2261\u20E5|\u2264\u20D2|\u2265\u20D2|\u2266\u0338|\u2267\u0338|\u2268\uFE00|\u2269\uFE00|\u226A\u0338|\u226A\u20D2|\u226B\u0338|\u226B\u20D2|\u227F\u0338|\u2282\u20D2|\u2283\u20D2|\u228A\uFE00|\u228B\uFE00|\u228F\u0338|\u2290\u0338|\u2293\uFE00|\u2294\uFE00|\u22B4\u20D2|\u22B5\u20D2|\u22D8\u0338|\u22D9\u0338|\u22DA\uFE00|\u22DB\uFE00|\u22F5\u0338|\u22F9\u0338|\u2933\u0338|\u29CF\u0338|\u29D0\u0338|\u2A6D\u0338|\u2A70\u0338|\u2A7D\u0338|\u2A7E\u0338|\u2AA1\u0338|\u2AA2\u0338|\u2AAC\uFE00|\u2AAD\uFE00|\u2AAF\u0338|\u2AB0\u0338|\u2AC5\u0338|\u2AC6\u0338|\u2ACB\uFE00|\u2ACC\uFE00|\u2AFD\u20E5|[\xA0-\u0113\u0116-\u0122\u0124-\u012B\u012E-\u014D\u0150-\u017E\u0192\u01B5\u01F5\u0237\u02C6\u02C7\u02D8-\u02DD\u0311\u0391-\u03A1\u03A3-\u03A9\u03B1-\u03C9\u03D1\u03D2\u03D5\u03D6\u03DC\u03DD\u03F0\u03F1\u03F5\u03F6\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E\u045F\u2002-\u2005\u2007-\u2010\u2013-\u2016\u2018-\u201A\u201C-\u201E\u2020-\u2022\u2025\u2026\u2030-\u2035\u2039\u203A\u203E\u2041\u2043\u2044\u204F\u2057\u205F-\u2063\u20AC\u20DB\u20DC\u2102\u2105\u210A-\u2113\u2115-\u211E\u2122\u2124\u2127-\u2129\u212C\u212D\u212F-\u2131\u2133-\u2138\u2145-\u2148\u2153-\u215E\u2190-\u219B\u219D-\u21A7\u21A9-\u21AE\u21B0-\u21B3\u21B5-\u21B7\u21BA-\u21DB\u21DD\u21E4\u21E5\u21F5\u21FD-\u2205\u2207-\u2209\u220B\u220C\u220F-\u2214\u2216-\u2218\u221A\u221D-\u2238\u223A-\u2257\u2259\u225A\u225C\u225F-\u2262\u2264-\u228B\u228D-\u229B\u229D-\u22A5\u22A7-\u22B0\u22B2-\u22BB\u22BD-\u22DB\u22DE-\u22E3\u22E6-\u22F7\u22F9-\u22FE\u2305\u2306\u2308-\u2310\u2312\u2313\u2315\u2316\u231C-\u231F\u2322\u2323\u232D\u232E\u2336\u233D\u233F\u237C\u23B0\u23B1\u23B4-\u23B6\u23DC-\u23DF\u23E2\u23E7\u2423\u24C8\u2500\u2502\u250C\u2510\u2514\u2518\u251C\u2524\u252C\u2534\u253C\u2550-\u256C\u2580\u2584\u2588\u2591-\u2593\u25A1\u25AA\u25AB\u25AD\u25AE\u25B1\u25B3-\u25B5\u25B8\u25B9\u25BD-\u25BF\u25C2\u25C3\u25CA\u25CB\u25EC\u25EF\u25F8-\u25FC\u2605\u2606\u260E\u2640\u2642\u2660\u2663\u2665\u2666\u266A\u266D-\u266F\u2713\u2717\u2720\u2736\u2758\u2772\u2773\u27C8\u27C9\u27E6-\u27ED\u27F5-\u27FA\u27FC\u27FF\u2902-\u2905\u290C-\u2913\u2916\u2919-\u2920\u2923-\u292A\u2933\u2935-\u2939\u293C\u293D\u2945\u2948-\u294B\u294E-\u2976\u2978\u2979\u297B-\u297F\u2985\u2986\u298B-\u2996\u299A\u299C\u299D\u29A4-\u29B7\u29B9\u29BB\u29BC\u29BE-\u29C5\u29C9\u29CD-\u29D0\u29DC-\u29DE\u29E3-\u29E5\u29EB\u29F4\u29F6\u2A00-\u2A02\u2A04\u2A06\u2A0C\u2A0D\u2A10-\u2A17\u2A22-\u2A27\u2A29\u2A2A\u2A2D-\u2A31\u2A33-\u2A3C\u2A3F\u2A40\u2A42-\u2A4D\u2A50\u2A53-\u2A58\u2A5A-\u2A5D\u2A5F\u2A66\u2A6A\u2A6D-\u2A75\u2A77-\u2A9A\u2A9D-\u2AA2\u2AA4-\u2AB0\u2AB3-\u2AC8\u2ACB\u2ACC\u2ACF-\u2ADB\u2AE4\u2AE6-\u2AE9\u2AEB-\u2AF3\u2AFD\uFB00-\uFB04]|\uD835[\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDD6B]/g;
+ var encodeMap = {'\xAD':'shy','\u200C':'zwnj','\u200D':'zwj','\u200E':'lrm','\u2063':'ic','\u2062':'it','\u2061':'af','\u200F':'rlm','\u200B':'ZeroWidthSpace','\u2060':'NoBreak','\u0311':'DownBreve','\u20DB':'tdot','\u20DC':'DotDot','\t':'Tab','\n':'NewLine','\u2008':'puncsp','\u205F':'MediumSpace','\u2009':'thinsp','\u200A':'hairsp','\u2004':'emsp13','\u2002':'ensp','\u2005':'emsp14','\u2003':'emsp','\u2007':'numsp','\xA0':'nbsp','\u205F\u200A':'ThickSpace','\u203E':'oline','_':'lowbar','\u2010':'dash','\u2013':'ndash','\u2014':'mdash','\u2015':'horbar',',':'comma',';':'semi','\u204F':'bsemi',':':'colon','\u2A74':'Colone','!':'excl','\xA1':'iexcl','?':'quest','\xBF':'iquest','.':'period','\u2025':'nldr','\u2026':'mldr','\xB7':'middot','\'':'apos','\u2018':'lsquo','\u2019':'rsquo','\u201A':'sbquo','\u2039':'lsaquo','\u203A':'rsaquo','"':'quot','\u201C':'ldquo','\u201D':'rdquo','\u201E':'bdquo','\xAB':'laquo','\xBB':'raquo','(':'lpar',')':'rpar','[':'lsqb',']':'rsqb','{':'lcub','}':'rcub','\u2308':'lceil','\u2309':'rceil','\u230A':'lfloor','\u230B':'rfloor','\u2985':'lopar','\u2986':'ropar','\u298B':'lbrke','\u298C':'rbrke','\u298D':'lbrkslu','\u298E':'rbrksld','\u298F':'lbrksld','\u2990':'rbrkslu','\u2991':'langd','\u2992':'rangd','\u2993':'lparlt','\u2994':'rpargt','\u2995':'gtlPar','\u2996':'ltrPar','\u27E6':'lobrk','\u27E7':'robrk','\u27E8':'lang','\u27E9':'rang','\u27EA':'Lang','\u27EB':'Rang','\u27EC':'loang','\u27ED':'roang','\u2772':'lbbrk','\u2773':'rbbrk','\u2016':'Vert','\xA7':'sect','\xB6':'para','@':'commat','*':'ast','/':'sol','undefined':null,'&':'amp','#':'num','%':'percnt','\u2030':'permil','\u2031':'pertenk','\u2020':'dagger','\u2021':'Dagger','\u2022':'bull','\u2043':'hybull','\u2032':'prime','\u2033':'Prime','\u2034':'tprime','\u2057':'qprime','\u2035':'bprime','\u2041':'caret','`':'grave','\xB4':'acute','\u02DC':'tilde','^':'Hat','\xAF':'macr','\u02D8':'breve','\u02D9':'dot','\xA8':'die','\u02DA':'ring','\u02DD':'dblac','\xB8':'cedil','\u02DB':'ogon','\u02C6':'circ','\u02C7':'caron','\xB0':'deg','\xA9':'copy','\xAE':'reg','\u2117':'copysr','\u2118':'wp','\u211E':'rx','\u2127':'mho','\u2129':'iiota','\u2190':'larr','\u219A':'nlarr','\u2192':'rarr','\u219B':'nrarr','\u2191':'uarr','\u2193':'darr','\u2194':'harr','\u21AE':'nharr','\u2195':'varr','\u2196':'nwarr','\u2197':'nearr','\u2198':'searr','\u2199':'swarr','\u219D':'rarrw','\u219D\u0338':'nrarrw','\u219E':'Larr','\u219F':'Uarr','\u21A0':'Rarr','\u21A1':'Darr','\u21A2':'larrtl','\u21A3':'rarrtl','\u21A4':'mapstoleft','\u21A5':'mapstoup','\u21A6':'map','\u21A7':'mapstodown','\u21A9':'larrhk','\u21AA':'rarrhk','\u21AB':'larrlp','\u21AC':'rarrlp','\u21AD':'harrw','\u21B0':'lsh','\u21B1':'rsh','\u21B2':'ldsh','\u21B3':'rdsh','\u21B5':'crarr','\u21B6':'cularr','\u21B7':'curarr','\u21BA':'olarr','\u21BB':'orarr','\u21BC':'lharu','\u21BD':'lhard','\u21BE':'uharr','\u21BF':'uharl','\u21C0':'rharu','\u21C1':'rhard','\u21C2':'dharr','\u21C3':'dharl','\u21C4':'rlarr','\u21C5':'udarr','\u21C6':'lrarr','\u21C7':'llarr','\u21C8':'uuarr','\u21C9':'rrarr','\u21CA':'ddarr','\u21CB':'lrhar','\u21CC':'rlhar','\u21D0':'lArr','\u21CD':'nlArr','\u21D1':'uArr','\u21D2':'rArr','\u21CF':'nrArr','\u21D3':'dArr','\u21D4':'iff','\u21CE':'nhArr','\u21D5':'vArr','\u21D6':'nwArr','\u21D7':'neArr','\u21D8':'seArr','\u21D9':'swArr','\u21DA':'lAarr','\u21DB':'rAarr','\u21DD':'zigrarr','\u21E4':'larrb','\u21E5':'rarrb','\u21F5':'duarr','\u21FD':'loarr','\u21FE':'roarr','\u21FF':'hoarr','\u2200':'forall','\u2201':'comp','\u2202':'part','\u2202\u0338':'npart','\u2203':'exist','\u2204':'nexist','\u2205':'empty','\u2207':'Del','\u2208':'in','\u2209':'notin','\u220B':'ni','\u220C':'notni','\u03F6':'bepsi','\u220F':'prod','\u2210':'coprod','\u2211':'sum','+':'plus','\xB1':'pm','\xF7':'div','\xD7':'times','<':'lt','\u226E':'nlt','<\u20D2':'nvlt','=':'equals','\u2260':'ne','=\u20E5':'bne','\u2A75':'Equal','>':'gt','\u226F':'ngt','>\u20D2':'nvgt','\xAC':'not','|':'vert','\xA6':'brvbar','\u2212':'minus','\u2213':'mp','\u2214':'plusdo','\u2044':'frasl','\u2216':'setmn','\u2217':'lowast','\u2218':'compfn','\u221A':'Sqrt','\u221D':'prop','\u221E':'infin','\u221F':'angrt','\u2220':'ang','\u2220\u20D2':'nang','\u2221':'angmsd','\u2222':'angsph','\u2223':'mid','\u2224':'nmid','\u2225':'par','\u2226':'npar','\u2227':'and','\u2228':'or','\u2229':'cap','\u2229\uFE00':'caps','\u222A':'cup','\u222A\uFE00':'cups','\u222B':'int','\u222C':'Int','\u222D':'tint','\u2A0C':'qint','\u222E':'oint','\u222F':'Conint','\u2230':'Cconint','\u2231':'cwint','\u2232':'cwconint','\u2233':'awconint','\u2234':'there4','\u2235':'becaus','\u2236':'ratio','\u2237':'Colon','\u2238':'minusd','\u223A':'mDDot','\u223B':'homtht','\u223C':'sim','\u2241':'nsim','\u223C\u20D2':'nvsim','\u223D':'bsim','\u223D\u0331':'race','\u223E':'ac','\u223E\u0333':'acE','\u223F':'acd','\u2240':'wr','\u2242':'esim','\u2242\u0338':'nesim','\u2243':'sime','\u2244':'nsime','\u2245':'cong','\u2247':'ncong','\u2246':'simne','\u2248':'ap','\u2249':'nap','\u224A':'ape','\u224B':'apid','\u224B\u0338':'napid','\u224C':'bcong','\u224D':'CupCap','\u226D':'NotCupCap','\u224D\u20D2':'nvap','\u224E':'bump','\u224E\u0338':'nbump','\u224F':'bumpe','\u224F\u0338':'nbumpe','\u2250':'doteq','\u2250\u0338':'nedot','\u2251':'eDot','\u2252':'efDot','\u2253':'erDot','\u2254':'colone','\u2255':'ecolon','\u2256':'ecir','\u2257':'cire','\u2259':'wedgeq','\u225A':'veeeq','\u225C':'trie','\u225F':'equest','\u2261':'equiv','\u2262':'nequiv','\u2261\u20E5':'bnequiv','\u2264':'le','\u2270':'nle','\u2264\u20D2':'nvle','\u2265':'ge','\u2271':'nge','\u2265\u20D2':'nvge','\u2266':'lE','\u2266\u0338':'nlE','\u2267':'gE','\u2267\u0338':'ngE','\u2268\uFE00':'lvnE','\u2268':'lnE','\u2269':'gnE','\u2269\uFE00':'gvnE','\u226A':'ll','\u226A\u0338':'nLtv','\u226A\u20D2':'nLt','\u226B':'gg','\u226B\u0338':'nGtv','\u226B\u20D2':'nGt','\u226C':'twixt','\u2272':'lsim','\u2274':'nlsim','\u2273':'gsim','\u2275':'ngsim','\u2276':'lg','\u2278':'ntlg','\u2277':'gl','\u2279':'ntgl','\u227A':'pr','\u2280':'npr','\u227B':'sc','\u2281':'nsc','\u227C':'prcue','\u22E0':'nprcue','\u227D':'sccue','\u22E1':'nsccue','\u227E':'prsim','\u227F':'scsim','\u227F\u0338':'NotSucceedsTilde','\u2282':'sub','\u2284':'nsub','\u2282\u20D2':'vnsub','\u2283':'sup','\u2285':'nsup','\u2283\u20D2':'vnsup','\u2286':'sube','\u2288':'nsube','\u2287':'supe','\u2289':'nsupe','\u228A\uFE00':'vsubne','\u228A':'subne','\u228B\uFE00':'vsupne','\u228B':'supne','\u228D':'cupdot','\u228E':'uplus','\u228F':'sqsub','\u228F\u0338':'NotSquareSubset','\u2290':'sqsup','\u2290\u0338':'NotSquareSuperset','\u2291':'sqsube','\u22E2':'nsqsube','\u2292':'sqsupe','\u22E3':'nsqsupe','\u2293':'sqcap','\u2293\uFE00':'sqcaps','\u2294':'sqcup','\u2294\uFE00':'sqcups','\u2295':'oplus','\u2296':'ominus','\u2297':'otimes','\u2298':'osol','\u2299':'odot','\u229A':'ocir','\u229B':'oast','\u229D':'odash','\u229E':'plusb','\u229F':'minusb','\u22A0':'timesb','\u22A1':'sdotb','\u22A2':'vdash','\u22AC':'nvdash','\u22A3':'dashv','\u22A4':'top','\u22A5':'bot','\u22A7':'models','\u22A8':'vDash','\u22AD':'nvDash','\u22A9':'Vdash','\u22AE':'nVdash','\u22AA':'Vvdash','\u22AB':'VDash','\u22AF':'nVDash','\u22B0':'prurel','\u22B2':'vltri','\u22EA':'nltri','\u22B3':'vrtri','\u22EB':'nrtri','\u22B4':'ltrie','\u22EC':'nltrie','\u22B4\u20D2':'nvltrie','\u22B5':'rtrie','\u22ED':'nrtrie','\u22B5\u20D2':'nvrtrie','\u22B6':'origof','\u22B7':'imof','\u22B8':'mumap','\u22B9':'hercon','\u22BA':'intcal','\u22BB':'veebar','\u22BD':'barvee','\u22BE':'angrtvb','\u22BF':'lrtri','\u22C0':'Wedge','\u22C1':'Vee','\u22C2':'xcap','\u22C3':'xcup','\u22C4':'diam','\u22C5':'sdot','\u22C6':'Star','\u22C7':'divonx','\u22C8':'bowtie','\u22C9':'ltimes','\u22CA':'rtimes','\u22CB':'lthree','\u22CC':'rthree','\u22CD':'bsime','\u22CE':'cuvee','\u22CF':'cuwed','\u22D0':'Sub','\u22D1':'Sup','\u22D2':'Cap','\u22D3':'Cup','\u22D4':'fork','\u22D5':'epar','\u22D6':'ltdot','\u22D7':'gtdot','\u22D8':'Ll','\u22D8\u0338':'nLl','\u22D9':'Gg','\u22D9\u0338':'nGg','\u22DA\uFE00':'lesg','\u22DA':'leg','\u22DB':'gel','\u22DB\uFE00':'gesl','\u22DE':'cuepr','\u22DF':'cuesc','\u22E6':'lnsim','\u22E7':'gnsim','\u22E8':'prnsim','\u22E9':'scnsim','\u22EE':'vellip','\u22EF':'ctdot','\u22F0':'utdot','\u22F1':'dtdot','\u22F2':'disin','\u22F3':'isinsv','\u22F4':'isins','\u22F5':'isindot','\u22F5\u0338':'notindot','\u22F6':'notinvc','\u22F7':'notinvb','\u22F9':'isinE','\u22F9\u0338':'notinE','\u22FA':'nisd','\u22FB':'xnis','\u22FC':'nis','\u22FD':'notnivc','\u22FE':'notnivb','\u2305':'barwed','\u2306':'Barwed','\u230C':'drcrop','\u230D':'dlcrop','\u230E':'urcrop','\u230F':'ulcrop','\u2310':'bnot','\u2312':'profline','\u2313':'profsurf','\u2315':'telrec','\u2316':'target','\u231C':'ulcorn','\u231D':'urcorn','\u231E':'dlcorn','\u231F':'drcorn','\u2322':'frown','\u2323':'smile','\u232D':'cylcty','\u232E':'profalar','\u2336':'topbot','\u233D':'ovbar','\u233F':'solbar','\u237C':'angzarr','\u23B0':'lmoust','\u23B1':'rmoust','\u23B4':'tbrk','\u23B5':'bbrk','\u23B6':'bbrktbrk','\u23DC':'OverParenthesis','\u23DD':'UnderParenthesis','\u23DE':'OverBrace','\u23DF':'UnderBrace','\u23E2':'trpezium','\u23E7':'elinters','\u2423':'blank','\u2500':'boxh','\u2502':'boxv','\u250C':'boxdr','\u2510':'boxdl','\u2514':'boxur','\u2518':'boxul','\u251C':'boxvr','\u2524':'boxvl','\u252C':'boxhd','\u2534':'boxhu','\u253C':'boxvh','\u2550':'boxH','\u2551':'boxV','\u2552':'boxdR','\u2553':'boxDr','\u2554':'boxDR','\u2555':'boxdL','\u2556':'boxDl','\u2557':'boxDL','\u2558':'boxuR','\u2559':'boxUr','\u255A':'boxUR','\u255B':'boxuL','\u255C':'boxUl','\u255D':'boxUL','\u255E':'boxvR','\u255F':'boxVr','\u2560':'boxVR','\u2561':'boxvL','\u2562':'boxVl','\u2563':'boxVL','\u2564':'boxHd','\u2565':'boxhD','\u2566':'boxHD','\u2567':'boxHu','\u2568':'boxhU','\u2569':'boxHU','\u256A':'boxvH','\u256B':'boxVh','\u256C':'boxVH','\u2580':'uhblk','\u2584':'lhblk','\u2588':'block','\u2591':'blk14','\u2592':'blk12','\u2593':'blk34','\u25A1':'squ','\u25AA':'squf','\u25AB':'EmptyVerySmallSquare','\u25AD':'rect','\u25AE':'marker','\u25B1':'fltns','\u25B3':'xutri','\u25B4':'utrif','\u25B5':'utri','\u25B8':'rtrif','\u25B9':'rtri','\u25BD':'xdtri','\u25BE':'dtrif','\u25BF':'dtri','\u25C2':'ltrif','\u25C3':'ltri','\u25CA':'loz','\u25CB':'cir','\u25EC':'tridot','\u25EF':'xcirc','\u25F8':'ultri','\u25F9':'urtri','\u25FA':'lltri','\u25FB':'EmptySmallSquare','\u25FC':'FilledSmallSquare','\u2605':'starf','\u2606':'star','\u260E':'phone','\u2640':'female','\u2642':'male','\u2660':'spades','\u2663':'clubs','\u2665':'hearts','\u2666':'diams','\u266A':'sung','\u2713':'check','\u2717':'cross','\u2720':'malt','\u2736':'sext','\u2758':'VerticalSeparator','\u27C8':'bsolhsub','\u27C9':'suphsol','\u27F5':'xlarr','\u27F6':'xrarr','\u27F7':'xharr','\u27F8':'xlArr','\u27F9':'xrArr','\u27FA':'xhArr','\u27FC':'xmap','\u27FF':'dzigrarr','\u2902':'nvlArr','\u2903':'nvrArr','\u2904':'nvHarr','\u2905':'Map','\u290C':'lbarr','\u290D':'rbarr','\u290E':'lBarr','\u290F':'rBarr','\u2910':'RBarr','\u2911':'DDotrahd','\u2912':'UpArrowBar','\u2913':'DownArrowBar','\u2916':'Rarrtl','\u2919':'latail','\u291A':'ratail','\u291B':'lAtail','\u291C':'rAtail','\u291D':'larrfs','\u291E':'rarrfs','\u291F':'larrbfs','\u2920':'rarrbfs','\u2923':'nwarhk','\u2924':'nearhk','\u2925':'searhk','\u2926':'swarhk','\u2927':'nwnear','\u2928':'toea','\u2929':'tosa','\u292A':'swnwar','\u2933':'rarrc','\u2933\u0338':'nrarrc','\u2935':'cudarrr','\u2936':'ldca','\u2937':'rdca','\u2938':'cudarrl','\u2939':'larrpl','\u293C':'curarrm','\u293D':'cularrp','\u2945':'rarrpl','\u2948':'harrcir','\u2949':'Uarrocir','\u294A':'lurdshar','\u294B':'ldrushar','\u294E':'LeftRightVector','\u294F':'RightUpDownVector','\u2950':'DownLeftRightVector','\u2951':'LeftUpDownVector','\u2952':'LeftVectorBar','\u2953':'RightVectorBar','\u2954':'RightUpVectorBar','\u2955':'RightDownVectorBar','\u2956':'DownLeftVectorBar','\u2957':'DownRightVectorBar','\u2958':'LeftUpVectorBar','\u2959':'LeftDownVectorBar','\u295A':'LeftTeeVector','\u295B':'RightTeeVector','\u295C':'RightUpTeeVector','\u295D':'RightDownTeeVector','\u295E':'DownLeftTeeVector','\u295F':'DownRightTeeVector','\u2960':'LeftUpTeeVector','\u2961':'LeftDownTeeVector','\u2962':'lHar','\u2963':'uHar','\u2964':'rHar','\u2965':'dHar','\u2966':'luruhar','\u2967':'ldrdhar','\u2968':'ruluhar','\u2969':'rdldhar','\u296A':'lharul','\u296B':'llhard','\u296C':'rharul','\u296D':'lrhard','\u296E':'udhar','\u296F':'duhar','\u2970':'RoundImplies','\u2971':'erarr','\u2972':'simrarr','\u2973':'larrsim','\u2974':'rarrsim','\u2975':'rarrap','\u2976':'ltlarr','\u2978':'gtrarr','\u2979':'subrarr','\u297B':'suplarr','\u297C':'lfisht','\u297D':'rfisht','\u297E':'ufisht','\u297F':'dfisht','\u299A':'vzigzag','\u299C':'vangrt','\u299D':'angrtvbd','\u29A4':'ange','\u29A5':'range','\u29A6':'dwangle','\u29A7':'uwangle','\u29A8':'angmsdaa','\u29A9':'angmsdab','\u29AA':'angmsdac','\u29AB':'angmsdad','\u29AC':'angmsdae','\u29AD':'angmsdaf','\u29AE':'angmsdag','\u29AF':'angmsdah','\u29B0':'bemptyv','\u29B1':'demptyv','\u29B2':'cemptyv','\u29B3':'raemptyv','\u29B4':'laemptyv','\u29B5':'ohbar','\u29B6':'omid','\u29B7':'opar','\u29B9':'operp','\u29BB':'olcross','\u29BC':'odsold','\u29BE':'olcir','\u29BF':'ofcir','\u29C0':'olt','\u29C1':'ogt','\u29C2':'cirscir','\u29C3':'cirE','\u29C4':'solb','\u29C5':'bsolb','\u29C9':'boxbox','\u29CD':'trisb','\u29CE':'rtriltri','\u29CF':'LeftTriangleBar','\u29CF\u0338':'NotLeftTriangleBar','\u29D0':'RightTriangleBar','\u29D0\u0338':'NotRightTriangleBar','\u29DC':'iinfin','\u29DD':'infintie','\u29DE':'nvinfin','\u29E3':'eparsl','\u29E4':'smeparsl','\u29E5':'eqvparsl','\u29EB':'lozf','\u29F4':'RuleDelayed','\u29F6':'dsol','\u2A00':'xodot','\u2A01':'xoplus','\u2A02':'xotime','\u2A04':'xuplus','\u2A06':'xsqcup','\u2A0D':'fpartint','\u2A10':'cirfnint','\u2A11':'awint','\u2A12':'rppolint','\u2A13':'scpolint','\u2A14':'npolint','\u2A15':'pointint','\u2A16':'quatint','\u2A17':'intlarhk','\u2A22':'pluscir','\u2A23':'plusacir','\u2A24':'simplus','\u2A25':'plusdu','\u2A26':'plussim','\u2A27':'plustwo','\u2A29':'mcomma','\u2A2A':'minusdu','\u2A2D':'loplus','\u2A2E':'roplus','\u2A2F':'Cross','\u2A30':'timesd','\u2A31':'timesbar','\u2A33':'smashp','\u2A34':'lotimes','\u2A35':'rotimes','\u2A36':'otimesas','\u2A37':'Otimes','\u2A38':'odiv','\u2A39':'triplus','\u2A3A':'triminus','\u2A3B':'tritime','\u2A3C':'iprod','\u2A3F':'amalg','\u2A40':'capdot','\u2A42':'ncup','\u2A43':'ncap','\u2A44':'capand','\u2A45':'cupor','\u2A46':'cupcap','\u2A47':'capcup','\u2A48':'cupbrcap','\u2A49':'capbrcup','\u2A4A':'cupcup','\u2A4B':'capcap','\u2A4C':'ccups','\u2A4D':'ccaps','\u2A50':'ccupssm','\u2A53':'And','\u2A54':'Or','\u2A55':'andand','\u2A56':'oror','\u2A57':'orslope','\u2A58':'andslope','\u2A5A':'andv','\u2A5B':'orv','\u2A5C':'andd','\u2A5D':'ord','\u2A5F':'wedbar','\u2A66':'sdote','\u2A6A':'simdot','\u2A6D':'congdot','\u2A6D\u0338':'ncongdot','\u2A6E':'easter','\u2A6F':'apacir','\u2A70':'apE','\u2A70\u0338':'napE','\u2A71':'eplus','\u2A72':'pluse','\u2A73':'Esim','\u2A77':'eDDot','\u2A78':'equivDD','\u2A79':'ltcir','\u2A7A':'gtcir','\u2A7B':'ltquest','\u2A7C':'gtquest','\u2A7D':'les','\u2A7D\u0338':'nles','\u2A7E':'ges','\u2A7E\u0338':'nges','\u2A7F':'lesdot','\u2A80':'gesdot','\u2A81':'lesdoto','\u2A82':'gesdoto','\u2A83':'lesdotor','\u2A84':'gesdotol','\u2A85':'lap','\u2A86':'gap','\u2A87':'lne','\u2A88':'gne','\u2A89':'lnap','\u2A8A':'gnap','\u2A8B':'lEg','\u2A8C':'gEl','\u2A8D':'lsime','\u2A8E':'gsime','\u2A8F':'lsimg','\u2A90':'gsiml','\u2A91':'lgE','\u2A92':'glE','\u2A93':'lesges','\u2A94':'gesles','\u2A95':'els','\u2A96':'egs','\u2A97':'elsdot','\u2A98':'egsdot','\u2A99':'el','\u2A9A':'eg','\u2A9D':'siml','\u2A9E':'simg','\u2A9F':'simlE','\u2AA0':'simgE','\u2AA1':'LessLess','\u2AA1\u0338':'NotNestedLessLess','\u2AA2':'GreaterGreater','\u2AA2\u0338':'NotNestedGreaterGreater','\u2AA4':'glj','\u2AA5':'gla','\u2AA6':'ltcc','\u2AA7':'gtcc','\u2AA8':'lescc','\u2AA9':'gescc','\u2AAA':'smt','\u2AAB':'lat','\u2AAC':'smte','\u2AAC\uFE00':'smtes','\u2AAD':'late','\u2AAD\uFE00':'lates','\u2AAE':'bumpE','\u2AAF':'pre','\u2AAF\u0338':'npre','\u2AB0':'sce','\u2AB0\u0338':'nsce','\u2AB3':'prE','\u2AB4':'scE','\u2AB5':'prnE','\u2AB6':'scnE','\u2AB7':'prap','\u2AB8':'scap','\u2AB9':'prnap','\u2ABA':'scnap','\u2ABB':'Pr','\u2ABC':'Sc','\u2ABD':'subdot','\u2ABE':'supdot','\u2ABF':'subplus','\u2AC0':'supplus','\u2AC1':'submult','\u2AC2':'supmult','\u2AC3':'subedot','\u2AC4':'supedot','\u2AC5':'subE','\u2AC5\u0338':'nsubE','\u2AC6':'supE','\u2AC6\u0338':'nsupE','\u2AC7':'subsim','\u2AC8':'supsim','\u2ACB\uFE00':'vsubnE','\u2ACB':'subnE','\u2ACC\uFE00':'vsupnE','\u2ACC':'supnE','\u2ACF':'csub','\u2AD0':'csup','\u2AD1':'csube','\u2AD2':'csupe','\u2AD3':'subsup','\u2AD4':'supsub','\u2AD5':'subsub','\u2AD6':'supsup','\u2AD7':'suphsub','\u2AD8':'supdsub','\u2AD9':'forkv','\u2ADA':'topfork','\u2ADB':'mlcp','\u2AE4':'Dashv','\u2AE6':'Vdashl','\u2AE7':'Barv','\u2AE8':'vBar','\u2AE9':'vBarv','\u2AEB':'Vbar','\u2AEC':'Not','\u2AED':'bNot','\u2AEE':'rnmid','\u2AEF':'cirmid','\u2AF0':'midcir','\u2AF1':'topcir','\u2AF2':'nhpar','\u2AF3':'parsim','\u2AFD':'parsl','\u2AFD\u20E5':'nparsl','\u266D':'flat','\u266E':'natur','\u266F':'sharp','\xA4':'curren','\xA2':'cent','$':'dollar','\xA3':'pound','\xA5':'yen','\u20AC':'euro','\xB9':'sup1','\xBD':'half','\u2153':'frac13','\xBC':'frac14','\u2155':'frac15','\u2159':'frac16','\u215B':'frac18','\xB2':'sup2','\u2154':'frac23','\u2156':'frac25','\xB3':'sup3','\xBE':'frac34','\u2157':'frac35','\u215C':'frac38','\u2158':'frac45','\u215A':'frac56','\u215D':'frac58','\u215E':'frac78','\uD835\uDCB6':'ascr','\uD835\uDD52':'aopf','\uD835\uDD1E':'afr','\uD835\uDD38':'Aopf','\uD835\uDD04':'Afr','\uD835\uDC9C':'Ascr','\xAA':'ordf','\xE1':'aacute','\xC1':'Aacute','\xE0':'agrave','\xC0':'Agrave','\u0103':'abreve','\u0102':'Abreve','\xE2':'acirc','\xC2':'Acirc','\xE5':'aring','\xC5':'angst','\xE4':'auml','\xC4':'Auml','\xE3':'atilde','\xC3':'Atilde','\u0105':'aogon','\u0104':'Aogon','\u0101':'amacr','\u0100':'Amacr','\xE6':'aelig','\xC6':'AElig','\uD835\uDCB7':'bscr','\uD835\uDD53':'bopf','\uD835\uDD1F':'bfr','\uD835\uDD39':'Bopf','\u212C':'Bscr','\uD835\uDD05':'Bfr','\uD835\uDD20':'cfr','\uD835\uDCB8':'cscr','\uD835\uDD54':'copf','\u212D':'Cfr','\uD835\uDC9E':'Cscr','\u2102':'Copf','\u0107':'cacute','\u0106':'Cacute','\u0109':'ccirc','\u0108':'Ccirc','\u010D':'ccaron','\u010C':'Ccaron','\u010B':'cdot','\u010A':'Cdot','\xE7':'ccedil','\xC7':'Ccedil','\u2105':'incare','\uD835\uDD21':'dfr','\u2146':'dd','\uD835\uDD55':'dopf','\uD835\uDCB9':'dscr','\uD835\uDC9F':'Dscr','\uD835\uDD07':'Dfr','\u2145':'DD','\uD835\uDD3B':'Dopf','\u010F':'dcaron','\u010E':'Dcaron','\u0111':'dstrok','\u0110':'Dstrok','\xF0':'eth','\xD0':'ETH','\u2147':'ee','\u212F':'escr','\uD835\uDD22':'efr','\uD835\uDD56':'eopf','\u2130':'Escr','\uD835\uDD08':'Efr','\uD835\uDD3C':'Eopf','\xE9':'eacute','\xC9':'Eacute','\xE8':'egrave','\xC8':'Egrave','\xEA':'ecirc','\xCA':'Ecirc','\u011B':'ecaron','\u011A':'Ecaron','\xEB':'euml','\xCB':'Euml','\u0117':'edot','\u0116':'Edot','\u0119':'eogon','\u0118':'Eogon','\u0113':'emacr','\u0112':'Emacr','\uD835\uDD23':'ffr','\uD835\uDD57':'fopf','\uD835\uDCBB':'fscr','\uD835\uDD09':'Ffr','\uD835\uDD3D':'Fopf','\u2131':'Fscr','\uFB00':'fflig','\uFB03':'ffilig','\uFB04':'ffllig','\uFB01':'filig','fj':'fjlig','\uFB02':'fllig','\u0192':'fnof','\u210A':'gscr','\uD835\uDD58':'gopf','\uD835\uDD24':'gfr','\uD835\uDCA2':'Gscr','\uD835\uDD3E':'Gopf','\uD835\uDD0A':'Gfr','\u01F5':'gacute','\u011F':'gbreve','\u011E':'Gbreve','\u011D':'gcirc','\u011C':'Gcirc','\u0121':'gdot','\u0120':'Gdot','\u0122':'Gcedil','\uD835\uDD25':'hfr','\u210E':'planckh','\uD835\uDCBD':'hscr','\uD835\uDD59':'hopf','\u210B':'Hscr','\u210C':'Hfr','\u210D':'Hopf','\u0125':'hcirc','\u0124':'Hcirc','\u210F':'hbar','\u0127':'hstrok','\u0126':'Hstrok','\uD835\uDD5A':'iopf','\uD835\uDD26':'ifr','\uD835\uDCBE':'iscr','\u2148':'ii','\uD835\uDD40':'Iopf','\u2110':'Iscr','\u2111':'Im','\xED':'iacute','\xCD':'Iacute','\xEC':'igrave','\xCC':'Igrave','\xEE':'icirc','\xCE':'Icirc','\xEF':'iuml','\xCF':'Iuml','\u0129':'itilde','\u0128':'Itilde','\u0130':'Idot','\u012F':'iogon','\u012E':'Iogon','\u012B':'imacr','\u012A':'Imacr','\u0133':'ijlig','\u0132':'IJlig','\u0131':'imath','\uD835\uDCBF':'jscr','\uD835\uDD5B':'jopf','\uD835\uDD27':'jfr','\uD835\uDCA5':'Jscr','\uD835\uDD0D':'Jfr','\uD835\uDD41':'Jopf','\u0135':'jcirc','\u0134':'Jcirc','\u0237':'jmath','\uD835\uDD5C':'kopf','\uD835\uDCC0':'kscr','\uD835\uDD28':'kfr','\uD835\uDCA6':'Kscr','\uD835\uDD42':'Kopf','\uD835\uDD0E':'Kfr','\u0137':'kcedil','\u0136':'Kcedil','\uD835\uDD29':'lfr','\uD835\uDCC1':'lscr','\u2113':'ell','\uD835\uDD5D':'lopf','\u2112':'Lscr','\uD835\uDD0F':'Lfr','\uD835\uDD43':'Lopf','\u013A':'lacute','\u0139':'Lacute','\u013E':'lcaron','\u013D':'Lcaron','\u013C':'lcedil','\u013B':'Lcedil','\u0142':'lstrok','\u0141':'Lstrok','\u0140':'lmidot','\u013F':'Lmidot','\uD835\uDD2A':'mfr','\uD835\uDD5E':'mopf','\uD835\uDCC2':'mscr','\uD835\uDD10':'Mfr','\uD835\uDD44':'Mopf','\u2133':'Mscr','\uD835\uDD2B':'nfr','\uD835\uDD5F':'nopf','\uD835\uDCC3':'nscr','\u2115':'Nopf','\uD835\uDCA9':'Nscr','\uD835\uDD11':'Nfr','\u0144':'nacute','\u0143':'Nacute','\u0148':'ncaron','\u0147':'Ncaron','\xF1':'ntilde','\xD1':'Ntilde','\u0146':'ncedil','\u0145':'Ncedil','\u2116':'numero','\u014B':'eng','\u014A':'ENG','\uD835\uDD60':'oopf','\uD835\uDD2C':'ofr','\u2134':'oscr','\uD835\uDCAA':'Oscr','\uD835\uDD12':'Ofr','\uD835\uDD46':'Oopf','\xBA':'ordm','\xF3':'oacute','\xD3':'Oacute','\xF2':'ograve','\xD2':'Ograve','\xF4':'ocirc','\xD4':'Ocirc','\xF6':'ouml','\xD6':'Ouml','\u0151':'odblac','\u0150':'Odblac','\xF5':'otilde','\xD5':'Otilde','\xF8':'oslash','\xD8':'Oslash','\u014D':'omacr','\u014C':'Omacr','\u0153':'oelig','\u0152':'OElig','\uD835\uDD2D':'pfr','\uD835\uDCC5':'pscr','\uD835\uDD61':'popf','\u2119':'Popf','\uD835\uDD13':'Pfr','\uD835\uDCAB':'Pscr','\uD835\uDD62':'qopf','\uD835\uDD2E':'qfr','\uD835\uDCC6':'qscr','\uD835\uDCAC':'Qscr','\uD835\uDD14':'Qfr','\u211A':'Qopf','\u0138':'kgreen','\uD835\uDD2F':'rfr','\uD835\uDD63':'ropf','\uD835\uDCC7':'rscr','\u211B':'Rscr','\u211C':'Re','\u211D':'Ropf','\u0155':'racute','\u0154':'Racute','\u0159':'rcaron','\u0158':'Rcaron','\u0157':'rcedil','\u0156':'Rcedil','\uD835\uDD64':'sopf','\uD835\uDCC8':'sscr','\uD835\uDD30':'sfr','\uD835\uDD4A':'Sopf','\uD835\uDD16':'Sfr','\uD835\uDCAE':'Sscr','\u24C8':'oS','\u015B':'sacute','\u015A':'Sacute','\u015D':'scirc','\u015C':'Scirc','\u0161':'scaron','\u0160':'Scaron','\u015F':'scedil','\u015E':'Scedil','\xDF':'szlig','\uD835\uDD31':'tfr','\uD835\uDCC9':'tscr','\uD835\uDD65':'topf','\uD835\uDCAF':'Tscr','\uD835\uDD17':'Tfr','\uD835\uDD4B':'Topf','\u0165':'tcaron','\u0164':'Tcaron','\u0163':'tcedil','\u0162':'Tcedil','\u2122':'trade','\u0167':'tstrok','\u0166':'Tstrok','\uD835\uDCCA':'uscr','\uD835\uDD66':'uopf','\uD835\uDD32':'ufr','\uD835\uDD4C':'Uopf','\uD835\uDD18':'Ufr','\uD835\uDCB0':'Uscr','\xFA':'uacute','\xDA':'Uacute','\xF9':'ugrave','\xD9':'Ugrave','\u016D':'ubreve','\u016C':'Ubreve','\xFB':'ucirc','\xDB':'Ucirc','\u016F':'uring','\u016E':'Uring','\xFC':'uuml','\xDC':'Uuml','\u0171':'udblac','\u0170':'Udblac','\u0169':'utilde','\u0168':'Utilde','\u0173':'uogon','\u0172':'Uogon','\u016B':'umacr','\u016A':'Umacr','\uD835\uDD33':'vfr','\uD835\uDD67':'vopf','\uD835\uDCCB':'vscr','\uD835\uDD19':'Vfr','\uD835\uDD4D':'Vopf','\uD835\uDCB1':'Vscr','\uD835\uDD68':'wopf','\uD835\uDCCC':'wscr','\uD835\uDD34':'wfr','\uD835\uDCB2':'Wscr','\uD835\uDD4E':'Wopf','\uD835\uDD1A':'Wfr','\u0175':'wcirc','\u0174':'Wcirc','\uD835\uDD35':'xfr','\uD835\uDCCD':'xscr','\uD835\uDD69':'xopf','\uD835\uDD4F':'Xopf','\uD835\uDD1B':'Xfr','\uD835\uDCB3':'Xscr','\uD835\uDD36':'yfr','\uD835\uDCCE':'yscr','\uD835\uDD6A':'yopf','\uD835\uDCB4':'Yscr','\uD835\uDD1C':'Yfr','\uD835\uDD50':'Yopf','\xFD':'yacute','\xDD':'Yacute','\u0177':'ycirc','\u0176':'Ycirc','\xFF':'yuml','\u0178':'Yuml','\uD835\uDCCF':'zscr','\uD835\uDD37':'zfr','\uD835\uDD6B':'zopf','\u2128':'Zfr','\u2124':'Zopf','\uD835\uDCB5':'Zscr','\u017A':'zacute','\u0179':'Zacute','\u017E':'zcaron','\u017D':'Zcaron','\u017C':'zdot','\u017B':'Zdot','\u01B5':'imped','\xFE':'thorn','\xDE':'THORN','\u0149':'napos','\u03B1':'alpha','\u0391':'Alpha','\u03B2':'beta','\u0392':'Beta','\u03B3':'gamma','\u0393':'Gamma','\u03B4':'delta','\u0394':'Delta','\u03B5':'epsi','\u03F5':'epsiv','\u0395':'Epsilon','\u03DD':'gammad','\u03DC':'Gammad','\u03B6':'zeta','\u0396':'Zeta','\u03B7':'eta','\u0397':'Eta','\u03B8':'theta','\u03D1':'thetav','\u0398':'Theta','\u03B9':'iota','\u0399':'Iota','\u03BA':'kappa','\u03F0':'kappav','\u039A':'Kappa','\u03BB':'lambda','\u039B':'Lambda','\u03BC':'mu','\xB5':'micro','\u039C':'Mu','\u03BD':'nu','\u039D':'Nu','\u03BE':'xi','\u039E':'Xi','\u03BF':'omicron','\u039F':'Omicron','\u03C0':'pi','\u03D6':'piv','\u03A0':'Pi','\u03C1':'rho','\u03F1':'rhov','\u03A1':'Rho','\u03C3':'sigma','\u03A3':'Sigma','\u03C2':'sigmaf','\u03C4':'tau','\u03A4':'Tau','\u03C5':'upsi','\u03A5':'Upsilon','\u03D2':'Upsi','\u03C6':'phi','\u03D5':'phiv','\u03A6':'Phi','\u03C7':'chi','\u03A7':'Chi','\u03C8':'psi','\u03A8':'Psi','\u03C9':'omega','\u03A9':'ohm','\u0430':'acy','\u0410':'Acy','\u0431':'bcy','\u0411':'Bcy','\u0432':'vcy','\u0412':'Vcy','\u0433':'gcy','\u0413':'Gcy','\u0453':'gjcy','\u0403':'GJcy','\u0434':'dcy','\u0414':'Dcy','\u0452':'djcy','\u0402':'DJcy','\u0435':'iecy','\u0415':'IEcy','\u0451':'iocy','\u0401':'IOcy','\u0454':'jukcy','\u0404':'Jukcy','\u0436':'zhcy','\u0416':'ZHcy','\u0437':'zcy','\u0417':'Zcy','\u0455':'dscy','\u0405':'DScy','\u0438':'icy','\u0418':'Icy','\u0456':'iukcy','\u0406':'Iukcy','\u0457':'yicy','\u0407':'YIcy','\u0439':'jcy','\u0419':'Jcy','\u0458':'jsercy','\u0408':'Jsercy','\u043A':'kcy','\u041A':'Kcy','\u045C':'kjcy','\u040C':'KJcy','\u043B':'lcy','\u041B':'Lcy','\u0459':'ljcy','\u0409':'LJcy','\u043C':'mcy','\u041C':'Mcy','\u043D':'ncy','\u041D':'Ncy','\u045A':'njcy','\u040A':'NJcy','\u043E':'ocy','\u041E':'Ocy','\u043F':'pcy','\u041F':'Pcy','\u0440':'rcy','\u0420':'Rcy','\u0441':'scy','\u0421':'Scy','\u0442':'tcy','\u0422':'Tcy','\u045B':'tshcy','\u040B':'TSHcy','\u0443':'ucy','\u0423':'Ucy','\u045E':'ubrcy','\u040E':'Ubrcy','\u0444':'fcy','\u0424':'Fcy','\u0445':'khcy','\u0425':'KHcy','\u0446':'tscy','\u0426':'TScy','\u0447':'chcy','\u0427':'CHcy','\u045F':'dzcy','\u040F':'DZcy','\u0448':'shcy','\u0428':'SHcy','\u0449':'shchcy','\u0429':'SHCHcy','\u044A':'hardcy','\u042A':'HARDcy','\u044B':'ycy','\u042B':'Ycy','\u044C':'softcy','\u042C':'SOFTcy','\u044D':'ecy','\u042D':'Ecy','\u044E':'yucy','\u042E':'YUcy','\u044F':'yacy','\u042F':'YAcy','\u2135':'aleph','\u2136':'beth','\u2137':'gimel','\u2138':'daleth'};
+
+ var regexEscape = /["&'<>`]/g;
+ var escapeMap = {
+ '"': '&quot;',
+ '&': '&amp;',
+ '\'': '&#x27;',
+ '<': '&lt;',
+ // See https://mathiasbynens.be/notes/ambiguous-ampersands: in HTML, the
+ // following is not strictly necessary unless it’s part of a tag or an
+ // unquoted attribute value. We’re only escaping it to support those
+ // situations, and for XML support.
+ '>': '&gt;',
+ // In Internet Explorer ≤ 8, the backtick character can be used
+ // to break out of (un)quoted attribute values or HTML comments.
+ // See http://html5sec.org/#102, http://html5sec.org/#108, and
+ // http://html5sec.org/#133.
+ '`': '&#x60;'
+ };
+
+ var regexInvalidEntity = /&#(?:[xX][^a-fA-F0-9]|[^0-9xX])/;
+ var regexInvalidRawCodePoint = /[\0-\x08\x0B\x0E-\x1F\x7F-\x9F\uFDD0-\uFDEF\uFFFE\uFFFF]|[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;
+ var regexDecode = /&#([0-9]+)(;?)|&#[xX]([a-fA-F0-9]+)(;?)|&([0-9a-zA-Z]+);|&(Aacute|Agrave|Atilde|Ccedil|Eacute|Egrave|Iacute|Igrave|Ntilde|Oacute|Ograve|Oslash|Otilde|Uacute|Ugrave|Yacute|aacute|agrave|atilde|brvbar|ccedil|curren|divide|eacute|egrave|frac12|frac14|frac34|iacute|igrave|iquest|middot|ntilde|oacute|ograve|oslash|otilde|plusmn|uacute|ugrave|yacute|AElig|Acirc|Aring|Ecirc|Icirc|Ocirc|THORN|Ucirc|acirc|acute|aelig|aring|cedil|ecirc|icirc|iexcl|laquo|micro|ocirc|pound|raquo|szlig|thorn|times|ucirc|Auml|COPY|Euml|Iuml|Ouml|QUOT|Uuml|auml|cent|copy|euml|iuml|macr|nbsp|ordf|ordm|ouml|para|quot|sect|sup1|sup2|sup3|uuml|yuml|AMP|ETH|REG|amp|deg|eth|not|reg|shy|uml|yen|GT|LT|gt|lt)([=a-zA-Z0-9])?/g;
+ var decodeMap = {'aacute':'\xE1','Aacute':'\xC1','abreve':'\u0103','Abreve':'\u0102','ac':'\u223E','acd':'\u223F','acE':'\u223E\u0333','acirc':'\xE2','Acirc':'\xC2','acute':'\xB4','acy':'\u0430','Acy':'\u0410','aelig':'\xE6','AElig':'\xC6','af':'\u2061','afr':'\uD835\uDD1E','Afr':'\uD835\uDD04','agrave':'\xE0','Agrave':'\xC0','alefsym':'\u2135','aleph':'\u2135','alpha':'\u03B1','Alpha':'\u0391','amacr':'\u0101','Amacr':'\u0100','amalg':'\u2A3F','amp':'&','AMP':'&','and':'\u2227','And':'\u2A53','andand':'\u2A55','andd':'\u2A5C','andslope':'\u2A58','andv':'\u2A5A','ang':'\u2220','ange':'\u29A4','angle':'\u2220','angmsd':'\u2221','angmsdaa':'\u29A8','angmsdab':'\u29A9','angmsdac':'\u29AA','angmsdad':'\u29AB','angmsdae':'\u29AC','angmsdaf':'\u29AD','angmsdag':'\u29AE','angmsdah':'\u29AF','angrt':'\u221F','angrtvb':'\u22BE','angrtvbd':'\u299D','angsph':'\u2222','angst':'\xC5','angzarr':'\u237C','aogon':'\u0105','Aogon':'\u0104','aopf':'\uD835\uDD52','Aopf':'\uD835\uDD38','ap':'\u2248','apacir':'\u2A6F','ape':'\u224A','apE':'\u2A70','apid':'\u224B','apos':'\'','ApplyFunction':'\u2061','approx':'\u2248','approxeq':'\u224A','aring':'\xE5','Aring':'\xC5','ascr':'\uD835\uDCB6','Ascr':'\uD835\uDC9C','Assign':'\u2254','ast':'*','asymp':'\u2248','asympeq':'\u224D','atilde':'\xE3','Atilde':'\xC3','auml':'\xE4','Auml':'\xC4','awconint':'\u2233','awint':'\u2A11','backcong':'\u224C','backepsilon':'\u03F6','backprime':'\u2035','backsim':'\u223D','backsimeq':'\u22CD','Backslash':'\u2216','Barv':'\u2AE7','barvee':'\u22BD','barwed':'\u2305','Barwed':'\u2306','barwedge':'\u2305','bbrk':'\u23B5','bbrktbrk':'\u23B6','bcong':'\u224C','bcy':'\u0431','Bcy':'\u0411','bdquo':'\u201E','becaus':'\u2235','because':'\u2235','Because':'\u2235','bemptyv':'\u29B0','bepsi':'\u03F6','bernou':'\u212C','Bernoullis':'\u212C','beta':'\u03B2','Beta':'\u0392','beth':'\u2136','between':'\u226C','bfr':'\uD835\uDD1F','Bfr':'\uD835\uDD05','bigcap':'\u22C2','bigcirc':'\u25EF','bigcup':'\u22C3','bigodot':'\u2A00','bigoplus':'\u2A01','bigotimes':'\u2A02','bigsqcup':'\u2A06','bigstar':'\u2605','bigtriangledown':'\u25BD','bigtriangleup':'\u25B3','biguplus':'\u2A04','bigvee':'\u22C1','bigwedge':'\u22C0','bkarow':'\u290D','blacklozenge':'\u29EB','blacksquare':'\u25AA','blacktriangle':'\u25B4','blacktriangledown':'\u25BE','blacktriangleleft':'\u25C2','blacktriangleright':'\u25B8','blank':'\u2423','blk12':'\u2592','blk14':'\u2591','blk34':'\u2593','block':'\u2588','bne':'=\u20E5','bnequiv':'\u2261\u20E5','bnot':'\u2310','bNot':'\u2AED','bopf':'\uD835\uDD53','Bopf':'\uD835\uDD39','bot':'\u22A5','bottom':'\u22A5','bowtie':'\u22C8','boxbox':'\u29C9','boxdl':'\u2510','boxdL':'\u2555','boxDl':'\u2556','boxDL':'\u2557','boxdr':'\u250C','boxdR':'\u2552','boxDr':'\u2553','boxDR':'\u2554','boxh':'\u2500','boxH':'\u2550','boxhd':'\u252C','boxhD':'\u2565','boxHd':'\u2564','boxHD':'\u2566','boxhu':'\u2534','boxhU':'\u2568','boxHu':'\u2567','boxHU':'\u2569','boxminus':'\u229F','boxplus':'\u229E','boxtimes':'\u22A0','boxul':'\u2518','boxuL':'\u255B','boxUl':'\u255C','boxUL':'\u255D','boxur':'\u2514','boxuR':'\u2558','boxUr':'\u2559','boxUR':'\u255A','boxv':'\u2502','boxV':'\u2551','boxvh':'\u253C','boxvH':'\u256A','boxVh':'\u256B','boxVH':'\u256C','boxvl':'\u2524','boxvL':'\u2561','boxVl':'\u2562','boxVL':'\u2563','boxvr':'\u251C','boxvR':'\u255E','boxVr':'\u255F','boxVR':'\u2560','bprime':'\u2035','breve':'\u02D8','Breve':'\u02D8','brvbar':'\xA6','bscr':'\uD835\uDCB7','Bscr':'\u212C','bsemi':'\u204F','bsim':'\u223D','bsime':'\u22CD','bsol':'\\','bsolb':'\u29C5','bsolhsub':'\u27C8','bull':'\u2022','bullet':'\u2022','bump':'\u224E','bumpe':'\u224F','bumpE':'\u2AAE','bumpeq':'\u224F','Bumpeq':'\u224E','cacute':'\u0107','Cacute':'\u0106','cap':'\u2229','Cap':'\u22D2','capand':'\u2A44','capbrcup':'\u2A49','capcap':'\u2A4B','capcup':'\u2A47','capdot':'\u2A40','CapitalDifferentialD':'\u2145','caps':'\u2229\uFE00','caret':'\u2041','caron':'\u02C7','Cayleys':'\u212D','ccaps':'\u2A4D','ccaron':'\u010D','Ccaron':'\u010C','ccedil':'\xE7','Ccedil':'\xC7','ccirc':'\u0109','Ccirc':'\u0108','Cconint':'\u2230','ccups':'\u2A4C','ccupssm':'\u2A50','cdot':'\u010B','Cdot':'\u010A','cedil':'\xB8','Cedilla':'\xB8','cemptyv':'\u29B2','cent':'\xA2','centerdot':'\xB7','CenterDot':'\xB7','cfr':'\uD835\uDD20','Cfr':'\u212D','chcy':'\u0447','CHcy':'\u0427','check':'\u2713','checkmark':'\u2713','chi':'\u03C7','Chi':'\u03A7','cir':'\u25CB','circ':'\u02C6','circeq':'\u2257','circlearrowleft':'\u21BA','circlearrowright':'\u21BB','circledast':'\u229B','circledcirc':'\u229A','circleddash':'\u229D','CircleDot':'\u2299','circledR':'\xAE','circledS':'\u24C8','CircleMinus':'\u2296','CirclePlus':'\u2295','CircleTimes':'\u2297','cire':'\u2257','cirE':'\u29C3','cirfnint':'\u2A10','cirmid':'\u2AEF','cirscir':'\u29C2','ClockwiseContourIntegral':'\u2232','CloseCurlyDoubleQuote':'\u201D','CloseCurlyQuote':'\u2019','clubs':'\u2663','clubsuit':'\u2663','colon':':','Colon':'\u2237','colone':'\u2254','Colone':'\u2A74','coloneq':'\u2254','comma':',','commat':'@','comp':'\u2201','compfn':'\u2218','complement':'\u2201','complexes':'\u2102','cong':'\u2245','congdot':'\u2A6D','Congruent':'\u2261','conint':'\u222E','Conint':'\u222F','ContourIntegral':'\u222E','copf':'\uD835\uDD54','Copf':'\u2102','coprod':'\u2210','Coproduct':'\u2210','copy':'\xA9','COPY':'\xA9','copysr':'\u2117','CounterClockwiseContourIntegral':'\u2233','crarr':'\u21B5','cross':'\u2717','Cross':'\u2A2F','cscr':'\uD835\uDCB8','Cscr':'\uD835\uDC9E','csub':'\u2ACF','csube':'\u2AD1','csup':'\u2AD0','csupe':'\u2AD2','ctdot':'\u22EF','cudarrl':'\u2938','cudarrr':'\u2935','cuepr':'\u22DE','cuesc':'\u22DF','cularr':'\u21B6','cularrp':'\u293D','cup':'\u222A','Cup':'\u22D3','cupbrcap':'\u2A48','cupcap':'\u2A46','CupCap':'\u224D','cupcup':'\u2A4A','cupdot':'\u228D','cupor':'\u2A45','cups':'\u222A\uFE00','curarr':'\u21B7','curarrm':'\u293C','curlyeqprec':'\u22DE','curlyeqsucc':'\u22DF','curlyvee':'\u22CE','curlywedge':'\u22CF','curren':'\xA4','curvearrowleft':'\u21B6','curvearrowright':'\u21B7','cuvee':'\u22CE','cuwed':'\u22CF','cwconint':'\u2232','cwint':'\u2231','cylcty':'\u232D','dagger':'\u2020','Dagger':'\u2021','daleth':'\u2138','darr':'\u2193','dArr':'\u21D3','Darr':'\u21A1','dash':'\u2010','dashv':'\u22A3','Dashv':'\u2AE4','dbkarow':'\u290F','dblac':'\u02DD','dcaron':'\u010F','Dcaron':'\u010E','dcy':'\u0434','Dcy':'\u0414','dd':'\u2146','DD':'\u2145','ddagger':'\u2021','ddarr':'\u21CA','DDotrahd':'\u2911','ddotseq':'\u2A77','deg':'\xB0','Del':'\u2207','delta':'\u03B4','Delta':'\u0394','demptyv':'\u29B1','dfisht':'\u297F','dfr':'\uD835\uDD21','Dfr':'\uD835\uDD07','dHar':'\u2965','dharl':'\u21C3','dharr':'\u21C2','DiacriticalAcute':'\xB4','DiacriticalDot':'\u02D9','DiacriticalDoubleAcute':'\u02DD','DiacriticalGrave':'`','DiacriticalTilde':'\u02DC','diam':'\u22C4','diamond':'\u22C4','Diamond':'\u22C4','diamondsuit':'\u2666','diams':'\u2666','die':'\xA8','DifferentialD':'\u2146','digamma':'\u03DD','disin':'\u22F2','div':'\xF7','divide':'\xF7','divideontimes':'\u22C7','divonx':'\u22C7','djcy':'\u0452','DJcy':'\u0402','dlcorn':'\u231E','dlcrop':'\u230D','dollar':'$','dopf':'\uD835\uDD55','Dopf':'\uD835\uDD3B','dot':'\u02D9','Dot':'\xA8','DotDot':'\u20DC','doteq':'\u2250','doteqdot':'\u2251','DotEqual':'\u2250','dotminus':'\u2238','dotplus':'\u2214','dotsquare':'\u22A1','doublebarwedge':'\u2306','DoubleContourIntegral':'\u222F','DoubleDot':'\xA8','DoubleDownArrow':'\u21D3','DoubleLeftArrow':'\u21D0','DoubleLeftRightArrow':'\u21D4','DoubleLeftTee':'\u2AE4','DoubleLongLeftArrow':'\u27F8','DoubleLongLeftRightArrow':'\u27FA','DoubleLongRightArrow':'\u27F9','DoubleRightArrow':'\u21D2','DoubleRightTee':'\u22A8','DoubleUpArrow':'\u21D1','DoubleUpDownArrow':'\u21D5','DoubleVerticalBar':'\u2225','downarrow':'\u2193','Downarrow':'\u21D3','DownArrow':'\u2193','DownArrowBar':'\u2913','DownArrowUpArrow':'\u21F5','DownBreve':'\u0311','downdownarrows':'\u21CA','downharpoonleft':'\u21C3','downharpoonright':'\u21C2','DownLeftRightVector':'\u2950','DownLeftTeeVector':'\u295E','DownLeftVector':'\u21BD','DownLeftVectorBar':'\u2956','DownRightTeeVector':'\u295F','DownRightVector':'\u21C1','DownRightVectorBar':'\u2957','DownTee':'\u22A4','DownTeeArrow':'\u21A7','drbkarow':'\u2910','drcorn':'\u231F','drcrop':'\u230C','dscr':'\uD835\uDCB9','Dscr':'\uD835\uDC9F','dscy':'\u0455','DScy':'\u0405','dsol':'\u29F6','dstrok':'\u0111','Dstrok':'\u0110','dtdot':'\u22F1','dtri':'\u25BF','dtrif':'\u25BE','duarr':'\u21F5','duhar':'\u296F','dwangle':'\u29A6','dzcy':'\u045F','DZcy':'\u040F','dzigrarr':'\u27FF','eacute':'\xE9','Eacute':'\xC9','easter':'\u2A6E','ecaron':'\u011B','Ecaron':'\u011A','ecir':'\u2256','ecirc':'\xEA','Ecirc':'\xCA','ecolon':'\u2255','ecy':'\u044D','Ecy':'\u042D','eDDot':'\u2A77','edot':'\u0117','eDot':'\u2251','Edot':'\u0116','ee':'\u2147','efDot':'\u2252','efr':'\uD835\uDD22','Efr':'\uD835\uDD08','eg':'\u2A9A','egrave':'\xE8','Egrave':'\xC8','egs':'\u2A96','egsdot':'\u2A98','el':'\u2A99','Element':'\u2208','elinters':'\u23E7','ell':'\u2113','els':'\u2A95','elsdot':'\u2A97','emacr':'\u0113','Emacr':'\u0112','empty':'\u2205','emptyset':'\u2205','EmptySmallSquare':'\u25FB','emptyv':'\u2205','EmptyVerySmallSquare':'\u25AB','emsp':'\u2003','emsp13':'\u2004','emsp14':'\u2005','eng':'\u014B','ENG':'\u014A','ensp':'\u2002','eogon':'\u0119','Eogon':'\u0118','eopf':'\uD835\uDD56','Eopf':'\uD835\uDD3C','epar':'\u22D5','eparsl':'\u29E3','eplus':'\u2A71','epsi':'\u03B5','epsilon':'\u03B5','Epsilon':'\u0395','epsiv':'\u03F5','eqcirc':'\u2256','eqcolon':'\u2255','eqsim':'\u2242','eqslantgtr':'\u2A96','eqslantless':'\u2A95','Equal':'\u2A75','equals':'=','EqualTilde':'\u2242','equest':'\u225F','Equilibrium':'\u21CC','equiv':'\u2261','equivDD':'\u2A78','eqvparsl':'\u29E5','erarr':'\u2971','erDot':'\u2253','escr':'\u212F','Escr':'\u2130','esdot':'\u2250','esim':'\u2242','Esim':'\u2A73','eta':'\u03B7','Eta':'\u0397','eth':'\xF0','ETH':'\xD0','euml':'\xEB','Euml':'\xCB','euro':'\u20AC','excl':'!','exist':'\u2203','Exists':'\u2203','expectation':'\u2130','exponentiale':'\u2147','ExponentialE':'\u2147','fallingdotseq':'\u2252','fcy':'\u0444','Fcy':'\u0424','female':'\u2640','ffilig':'\uFB03','fflig':'\uFB00','ffllig':'\uFB04','ffr':'\uD835\uDD23','Ffr':'\uD835\uDD09','filig':'\uFB01','FilledSmallSquare':'\u25FC','FilledVerySmallSquare':'\u25AA','fjlig':'fj','flat':'\u266D','fllig':'\uFB02','fltns':'\u25B1','fnof':'\u0192','fopf':'\uD835\uDD57','Fopf':'\uD835\uDD3D','forall':'\u2200','ForAll':'\u2200','fork':'\u22D4','forkv':'\u2AD9','Fouriertrf':'\u2131','fpartint':'\u2A0D','frac12':'\xBD','frac13':'\u2153','frac14':'\xBC','frac15':'\u2155','frac16':'\u2159','frac18':'\u215B','frac23':'\u2154','frac25':'\u2156','frac34':'\xBE','frac35':'\u2157','frac38':'\u215C','frac45':'\u2158','frac56':'\u215A','frac58':'\u215D','frac78':'\u215E','frasl':'\u2044','frown':'\u2322','fscr':'\uD835\uDCBB','Fscr':'\u2131','gacute':'\u01F5','gamma':'\u03B3','Gamma':'\u0393','gammad':'\u03DD','Gammad':'\u03DC','gap':'\u2A86','gbreve':'\u011F','Gbreve':'\u011E','Gcedil':'\u0122','gcirc':'\u011D','Gcirc':'\u011C','gcy':'\u0433','Gcy':'\u0413','gdot':'\u0121','Gdot':'\u0120','ge':'\u2265','gE':'\u2267','gel':'\u22DB','gEl':'\u2A8C','geq':'\u2265','geqq':'\u2267','geqslant':'\u2A7E','ges':'\u2A7E','gescc':'\u2AA9','gesdot':'\u2A80','gesdoto':'\u2A82','gesdotol':'\u2A84','gesl':'\u22DB\uFE00','gesles':'\u2A94','gfr':'\uD835\uDD24','Gfr':'\uD835\uDD0A','gg':'\u226B','Gg':'\u22D9','ggg':'\u22D9','gimel':'\u2137','gjcy':'\u0453','GJcy':'\u0403','gl':'\u2277','gla':'\u2AA5','glE':'\u2A92','glj':'\u2AA4','gnap':'\u2A8A','gnapprox':'\u2A8A','gne':'\u2A88','gnE':'\u2269','gneq':'\u2A88','gneqq':'\u2269','gnsim':'\u22E7','gopf':'\uD835\uDD58','Gopf':'\uD835\uDD3E','grave':'`','GreaterEqual':'\u2265','GreaterEqualLess':'\u22DB','GreaterFullEqual':'\u2267','GreaterGreater':'\u2AA2','GreaterLess':'\u2277','GreaterSlantEqual':'\u2A7E','GreaterTilde':'\u2273','gscr':'\u210A','Gscr':'\uD835\uDCA2','gsim':'\u2273','gsime':'\u2A8E','gsiml':'\u2A90','gt':'>','Gt':'\u226B','GT':'>','gtcc':'\u2AA7','gtcir':'\u2A7A','gtdot':'\u22D7','gtlPar':'\u2995','gtquest':'\u2A7C','gtrapprox':'\u2A86','gtrarr':'\u2978','gtrdot':'\u22D7','gtreqless':'\u22DB','gtreqqless':'\u2A8C','gtrless':'\u2277','gtrsim':'\u2273','gvertneqq':'\u2269\uFE00','gvnE':'\u2269\uFE00','Hacek':'\u02C7','hairsp':'\u200A','half':'\xBD','hamilt':'\u210B','hardcy':'\u044A','HARDcy':'\u042A','harr':'\u2194','hArr':'\u21D4','harrcir':'\u2948','harrw':'\u21AD','Hat':'^','hbar':'\u210F','hcirc':'\u0125','Hcirc':'\u0124','hearts':'\u2665','heartsuit':'\u2665','hellip':'\u2026','hercon':'\u22B9','hfr':'\uD835\uDD25','Hfr':'\u210C','HilbertSpace':'\u210B','hksearow':'\u2925','hkswarow':'\u2926','hoarr':'\u21FF','homtht':'\u223B','hookleftarrow':'\u21A9','hookrightarrow':'\u21AA','hopf':'\uD835\uDD59','Hopf':'\u210D','horbar':'\u2015','HorizontalLine':'\u2500','hscr':'\uD835\uDCBD','Hscr':'\u210B','hslash':'\u210F','hstrok':'\u0127','Hstrok':'\u0126','HumpDownHump':'\u224E','HumpEqual':'\u224F','hybull':'\u2043','hyphen':'\u2010','iacute':'\xED','Iacute':'\xCD','ic':'\u2063','icirc':'\xEE','Icirc':'\xCE','icy':'\u0438','Icy':'\u0418','Idot':'\u0130','iecy':'\u0435','IEcy':'\u0415','iexcl':'\xA1','iff':'\u21D4','ifr':'\uD835\uDD26','Ifr':'\u2111','igrave':'\xEC','Igrave':'\xCC','ii':'\u2148','iiiint':'\u2A0C','iiint':'\u222D','iinfin':'\u29DC','iiota':'\u2129','ijlig':'\u0133','IJlig':'\u0132','Im':'\u2111','imacr':'\u012B','Imacr':'\u012A','image':'\u2111','ImaginaryI':'\u2148','imagline':'\u2110','imagpart':'\u2111','imath':'\u0131','imof':'\u22B7','imped':'\u01B5','Implies':'\u21D2','in':'\u2208','incare':'\u2105','infin':'\u221E','infintie':'\u29DD','inodot':'\u0131','int':'\u222B','Int':'\u222C','intcal':'\u22BA','integers':'\u2124','Integral':'\u222B','intercal':'\u22BA','Intersection':'\u22C2','intlarhk':'\u2A17','intprod':'\u2A3C','InvisibleComma':'\u2063','InvisibleTimes':'\u2062','iocy':'\u0451','IOcy':'\u0401','iogon':'\u012F','Iogon':'\u012E','iopf':'\uD835\uDD5A','Iopf':'\uD835\uDD40','iota':'\u03B9','Iota':'\u0399','iprod':'\u2A3C','iquest':'\xBF','iscr':'\uD835\uDCBE','Iscr':'\u2110','isin':'\u2208','isindot':'\u22F5','isinE':'\u22F9','isins':'\u22F4','isinsv':'\u22F3','isinv':'\u2208','it':'\u2062','itilde':'\u0129','Itilde':'\u0128','iukcy':'\u0456','Iukcy':'\u0406','iuml':'\xEF','Iuml':'\xCF','jcirc':'\u0135','Jcirc':'\u0134','jcy':'\u0439','Jcy':'\u0419','jfr':'\uD835\uDD27','Jfr':'\uD835\uDD0D','jmath':'\u0237','jopf':'\uD835\uDD5B','Jopf':'\uD835\uDD41','jscr':'\uD835\uDCBF','Jscr':'\uD835\uDCA5','jsercy':'\u0458','Jsercy':'\u0408','jukcy':'\u0454','Jukcy':'\u0404','kappa':'\u03BA','Kappa':'\u039A','kappav':'\u03F0','kcedil':'\u0137','Kcedil':'\u0136','kcy':'\u043A','Kcy':'\u041A','kfr':'\uD835\uDD28','Kfr':'\uD835\uDD0E','kgreen':'\u0138','khcy':'\u0445','KHcy':'\u0425','kjcy':'\u045C','KJcy':'\u040C','kopf':'\uD835\uDD5C','Kopf':'\uD835\uDD42','kscr':'\uD835\uDCC0','Kscr':'\uD835\uDCA6','lAarr':'\u21DA','lacute':'\u013A','Lacute':'\u0139','laemptyv':'\u29B4','lagran':'\u2112','lambda':'\u03BB','Lambda':'\u039B','lang':'\u27E8','Lang':'\u27EA','langd':'\u2991','langle':'\u27E8','lap':'\u2A85','Laplacetrf':'\u2112','laquo':'\xAB','larr':'\u2190','lArr':'\u21D0','Larr':'\u219E','larrb':'\u21E4','larrbfs':'\u291F','larrfs':'\u291D','larrhk':'\u21A9','larrlp':'\u21AB','larrpl':'\u2939','larrsim':'\u2973','larrtl':'\u21A2','lat':'\u2AAB','latail':'\u2919','lAtail':'\u291B','late':'\u2AAD','lates':'\u2AAD\uFE00','lbarr':'\u290C','lBarr':'\u290E','lbbrk':'\u2772','lbrace':'{','lbrack':'[','lbrke':'\u298B','lbrksld':'\u298F','lbrkslu':'\u298D','lcaron':'\u013E','Lcaron':'\u013D','lcedil':'\u013C','Lcedil':'\u013B','lceil':'\u2308','lcub':'{','lcy':'\u043B','Lcy':'\u041B','ldca':'\u2936','ldquo':'\u201C','ldquor':'\u201E','ldrdhar':'\u2967','ldrushar':'\u294B','ldsh':'\u21B2','le':'\u2264','lE':'\u2266','LeftAngleBracket':'\u27E8','leftarrow':'\u2190','Leftarrow':'\u21D0','LeftArrow':'\u2190','LeftArrowBar':'\u21E4','LeftArrowRightArrow':'\u21C6','leftarrowtail':'\u21A2','LeftCeiling':'\u2308','LeftDoubleBracket':'\u27E6','LeftDownTeeVector':'\u2961','LeftDownVector':'\u21C3','LeftDownVectorBar':'\u2959','LeftFloor':'\u230A','leftharpoondown':'\u21BD','leftharpoonup':'\u21BC','leftleftarrows':'\u21C7','leftrightarrow':'\u2194','Leftrightarrow':'\u21D4','LeftRightArrow':'\u2194','leftrightarrows':'\u21C6','leftrightharpoons':'\u21CB','leftrightsquigarrow':'\u21AD','LeftRightVector':'\u294E','LeftTee':'\u22A3','LeftTeeArrow':'\u21A4','LeftTeeVector':'\u295A','leftthreetimes':'\u22CB','LeftTriangle':'\u22B2','LeftTriangleBar':'\u29CF','LeftTriangleEqual':'\u22B4','LeftUpDownVector':'\u2951','LeftUpTeeVector':'\u2960','LeftUpVector':'\u21BF','LeftUpVectorBar':'\u2958','LeftVector':'\u21BC','LeftVectorBar':'\u2952','leg':'\u22DA','lEg':'\u2A8B','leq':'\u2264','leqq':'\u2266','leqslant':'\u2A7D','les':'\u2A7D','lescc':'\u2AA8','lesdot':'\u2A7F','lesdoto':'\u2A81','lesdotor':'\u2A83','lesg':'\u22DA\uFE00','lesges':'\u2A93','lessapprox':'\u2A85','lessdot':'\u22D6','lesseqgtr':'\u22DA','lesseqqgtr':'\u2A8B','LessEqualGreater':'\u22DA','LessFullEqual':'\u2266','LessGreater':'\u2276','lessgtr':'\u2276','LessLess':'\u2AA1','lesssim':'\u2272','LessSlantEqual':'\u2A7D','LessTilde':'\u2272','lfisht':'\u297C','lfloor':'\u230A','lfr':'\uD835\uDD29','Lfr':'\uD835\uDD0F','lg':'\u2276','lgE':'\u2A91','lHar':'\u2962','lhard':'\u21BD','lharu':'\u21BC','lharul':'\u296A','lhblk':'\u2584','ljcy':'\u0459','LJcy':'\u0409','ll':'\u226A','Ll':'\u22D8','llarr':'\u21C7','llcorner':'\u231E','Lleftarrow':'\u21DA','llhard':'\u296B','lltri':'\u25FA','lmidot':'\u0140','Lmidot':'\u013F','lmoust':'\u23B0','lmoustache':'\u23B0','lnap':'\u2A89','lnapprox':'\u2A89','lne':'\u2A87','lnE':'\u2268','lneq':'\u2A87','lneqq':'\u2268','lnsim':'\u22E6','loang':'\u27EC','loarr':'\u21FD','lobrk':'\u27E6','longleftarrow':'\u27F5','Longleftarrow':'\u27F8','LongLeftArrow':'\u27F5','longleftrightarrow':'\u27F7','Longleftrightarrow':'\u27FA','LongLeftRightArrow':'\u27F7','longmapsto':'\u27FC','longrightarrow':'\u27F6','Longrightarrow':'\u27F9','LongRightArrow':'\u27F6','looparrowleft':'\u21AB','looparrowright':'\u21AC','lopar':'\u2985','lopf':'\uD835\uDD5D','Lopf':'\uD835\uDD43','loplus':'\u2A2D','lotimes':'\u2A34','lowast':'\u2217','lowbar':'_','LowerLeftArrow':'\u2199','LowerRightArrow':'\u2198','loz':'\u25CA','lozenge':'\u25CA','lozf':'\u29EB','lpar':'(','lparlt':'\u2993','lrarr':'\u21C6','lrcorner':'\u231F','lrhar':'\u21CB','lrhard':'\u296D','lrm':'\u200E','lrtri':'\u22BF','lsaquo':'\u2039','lscr':'\uD835\uDCC1','Lscr':'\u2112','lsh':'\u21B0','Lsh':'\u21B0','lsim':'\u2272','lsime':'\u2A8D','lsimg':'\u2A8F','lsqb':'[','lsquo':'\u2018','lsquor':'\u201A','lstrok':'\u0142','Lstrok':'\u0141','lt':'<','Lt':'\u226A','LT':'<','ltcc':'\u2AA6','ltcir':'\u2A79','ltdot':'\u22D6','lthree':'\u22CB','ltimes':'\u22C9','ltlarr':'\u2976','ltquest':'\u2A7B','ltri':'\u25C3','ltrie':'\u22B4','ltrif':'\u25C2','ltrPar':'\u2996','lurdshar':'\u294A','luruhar':'\u2966','lvertneqq':'\u2268\uFE00','lvnE':'\u2268\uFE00','macr':'\xAF','male':'\u2642','malt':'\u2720','maltese':'\u2720','map':'\u21A6','Map':'\u2905','mapsto':'\u21A6','mapstodown':'\u21A7','mapstoleft':'\u21A4','mapstoup':'\u21A5','marker':'\u25AE','mcomma':'\u2A29','mcy':'\u043C','Mcy':'\u041C','mdash':'\u2014','mDDot':'\u223A','measuredangle':'\u2221','MediumSpace':'\u205F','Mellintrf':'\u2133','mfr':'\uD835\uDD2A','Mfr':'\uD835\uDD10','mho':'\u2127','micro':'\xB5','mid':'\u2223','midast':'*','midcir':'\u2AF0','middot':'\xB7','minus':'\u2212','minusb':'\u229F','minusd':'\u2238','minusdu':'\u2A2A','MinusPlus':'\u2213','mlcp':'\u2ADB','mldr':'\u2026','mnplus':'\u2213','models':'\u22A7','mopf':'\uD835\uDD5E','Mopf':'\uD835\uDD44','mp':'\u2213','mscr':'\uD835\uDCC2','Mscr':'\u2133','mstpos':'\u223E','mu':'\u03BC','Mu':'\u039C','multimap':'\u22B8','mumap':'\u22B8','nabla':'\u2207','nacute':'\u0144','Nacute':'\u0143','nang':'\u2220\u20D2','nap':'\u2249','napE':'\u2A70\u0338','napid':'\u224B\u0338','napos':'\u0149','napprox':'\u2249','natur':'\u266E','natural':'\u266E','naturals':'\u2115','nbsp':'\xA0','nbump':'\u224E\u0338','nbumpe':'\u224F\u0338','ncap':'\u2A43','ncaron':'\u0148','Ncaron':'\u0147','ncedil':'\u0146','Ncedil':'\u0145','ncong':'\u2247','ncongdot':'\u2A6D\u0338','ncup':'\u2A42','ncy':'\u043D','Ncy':'\u041D','ndash':'\u2013','ne':'\u2260','nearhk':'\u2924','nearr':'\u2197','neArr':'\u21D7','nearrow':'\u2197','nedot':'\u2250\u0338','NegativeMediumSpace':'\u200B','NegativeThickSpace':'\u200B','NegativeThinSpace':'\u200B','NegativeVeryThinSpace':'\u200B','nequiv':'\u2262','nesear':'\u2928','nesim':'\u2242\u0338','NestedGreaterGreater':'\u226B','NestedLessLess':'\u226A','NewLine':'\n','nexist':'\u2204','nexists':'\u2204','nfr':'\uD835\uDD2B','Nfr':'\uD835\uDD11','nge':'\u2271','ngE':'\u2267\u0338','ngeq':'\u2271','ngeqq':'\u2267\u0338','ngeqslant':'\u2A7E\u0338','nges':'\u2A7E\u0338','nGg':'\u22D9\u0338','ngsim':'\u2275','ngt':'\u226F','nGt':'\u226B\u20D2','ngtr':'\u226F','nGtv':'\u226B\u0338','nharr':'\u21AE','nhArr':'\u21CE','nhpar':'\u2AF2','ni':'\u220B','nis':'\u22FC','nisd':'\u22FA','niv':'\u220B','njcy':'\u045A','NJcy':'\u040A','nlarr':'\u219A','nlArr':'\u21CD','nldr':'\u2025','nle':'\u2270','nlE':'\u2266\u0338','nleftarrow':'\u219A','nLeftarrow':'\u21CD','nleftrightarrow':'\u21AE','nLeftrightarrow':'\u21CE','nleq':'\u2270','nleqq':'\u2266\u0338','nleqslant':'\u2A7D\u0338','nles':'\u2A7D\u0338','nless':'\u226E','nLl':'\u22D8\u0338','nlsim':'\u2274','nlt':'\u226E','nLt':'\u226A\u20D2','nltri':'\u22EA','nltrie':'\u22EC','nLtv':'\u226A\u0338','nmid':'\u2224','NoBreak':'\u2060','NonBreakingSpace':'\xA0','nopf':'\uD835\uDD5F','Nopf':'\u2115','not':'\xAC','Not':'\u2AEC','NotCongruent':'\u2262','NotCupCap':'\u226D','NotDoubleVerticalBar':'\u2226','NotElement':'\u2209','NotEqual':'\u2260','NotEqualTilde':'\u2242\u0338','NotExists':'\u2204','NotGreater':'\u226F','NotGreaterEqual':'\u2271','NotGreaterFullEqual':'\u2267\u0338','NotGreaterGreater':'\u226B\u0338','NotGreaterLess':'\u2279','NotGreaterSlantEqual':'\u2A7E\u0338','NotGreaterTilde':'\u2275','NotHumpDownHump':'\u224E\u0338','NotHumpEqual':'\u224F\u0338','notin':'\u2209','notindot':'\u22F5\u0338','notinE':'\u22F9\u0338','notinva':'\u2209','notinvb':'\u22F7','notinvc':'\u22F6','NotLeftTriangle':'\u22EA','NotLeftTriangleBar':'\u29CF\u0338','NotLeftTriangleEqual':'\u22EC','NotLess':'\u226E','NotLessEqual':'\u2270','NotLessGreater':'\u2278','NotLessLess':'\u226A\u0338','NotLessSlantEqual':'\u2A7D\u0338','NotLessTilde':'\u2274','NotNestedGreaterGreater':'\u2AA2\u0338','NotNestedLessLess':'\u2AA1\u0338','notni':'\u220C','notniva':'\u220C','notnivb':'\u22FE','notnivc':'\u22FD','NotPrecedes':'\u2280','NotPrecedesEqual':'\u2AAF\u0338','NotPrecedesSlantEqual':'\u22E0','NotReverseElement':'\u220C','NotRightTriangle':'\u22EB','NotRightTriangleBar':'\u29D0\u0338','NotRightTriangleEqual':'\u22ED','NotSquareSubset':'\u228F\u0338','NotSquareSubsetEqual':'\u22E2','NotSquareSuperset':'\u2290\u0338','NotSquareSupersetEqual':'\u22E3','NotSubset':'\u2282\u20D2','NotSubsetEqual':'\u2288','NotSucceeds':'\u2281','NotSucceedsEqual':'\u2AB0\u0338','NotSucceedsSlantEqual':'\u22E1','NotSucceedsTilde':'\u227F\u0338','NotSuperset':'\u2283\u20D2','NotSupersetEqual':'\u2289','NotTilde':'\u2241','NotTildeEqual':'\u2244','NotTildeFullEqual':'\u2247','NotTildeTilde':'\u2249','NotVerticalBar':'\u2224','npar':'\u2226','nparallel':'\u2226','nparsl':'\u2AFD\u20E5','npart':'\u2202\u0338','npolint':'\u2A14','npr':'\u2280','nprcue':'\u22E0','npre':'\u2AAF\u0338','nprec':'\u2280','npreceq':'\u2AAF\u0338','nrarr':'\u219B','nrArr':'\u21CF','nrarrc':'\u2933\u0338','nrarrw':'\u219D\u0338','nrightarrow':'\u219B','nRightarrow':'\u21CF','nrtri':'\u22EB','nrtrie':'\u22ED','nsc':'\u2281','nsccue':'\u22E1','nsce':'\u2AB0\u0338','nscr':'\uD835\uDCC3','Nscr':'\uD835\uDCA9','nshortmid':'\u2224','nshortparallel':'\u2226','nsim':'\u2241','nsime':'\u2244','nsimeq':'\u2244','nsmid':'\u2224','nspar':'\u2226','nsqsube':'\u22E2','nsqsupe':'\u22E3','nsub':'\u2284','nsube':'\u2288','nsubE':'\u2AC5\u0338','nsubset':'\u2282\u20D2','nsubseteq':'\u2288','nsubseteqq':'\u2AC5\u0338','nsucc':'\u2281','nsucceq':'\u2AB0\u0338','nsup':'\u2285','nsupe':'\u2289','nsupE':'\u2AC6\u0338','nsupset':'\u2283\u20D2','nsupseteq':'\u2289','nsupseteqq':'\u2AC6\u0338','ntgl':'\u2279','ntilde':'\xF1','Ntilde':'\xD1','ntlg':'\u2278','ntriangleleft':'\u22EA','ntrianglelefteq':'\u22EC','ntriangleright':'\u22EB','ntrianglerighteq':'\u22ED','nu':'\u03BD','Nu':'\u039D','num':'#','numero':'\u2116','numsp':'\u2007','nvap':'\u224D\u20D2','nvdash':'\u22AC','nvDash':'\u22AD','nVdash':'\u22AE','nVDash':'\u22AF','nvge':'\u2265\u20D2','nvgt':'>\u20D2','nvHarr':'\u2904','nvinfin':'\u29DE','nvlArr':'\u2902','nvle':'\u2264\u20D2','nvlt':'<\u20D2','nvltrie':'\u22B4\u20D2','nvrArr':'\u2903','nvrtrie':'\u22B5\u20D2','nvsim':'\u223C\u20D2','nwarhk':'\u2923','nwarr':'\u2196','nwArr':'\u21D6','nwarrow':'\u2196','nwnear':'\u2927','oacute':'\xF3','Oacute':'\xD3','oast':'\u229B','ocir':'\u229A','ocirc':'\xF4','Ocirc':'\xD4','ocy':'\u043E','Ocy':'\u041E','odash':'\u229D','odblac':'\u0151','Odblac':'\u0150','odiv':'\u2A38','odot':'\u2299','odsold':'\u29BC','oelig':'\u0153','OElig':'\u0152','ofcir':'\u29BF','ofr':'\uD835\uDD2C','Ofr':'\uD835\uDD12','ogon':'\u02DB','ograve':'\xF2','Ograve':'\xD2','ogt':'\u29C1','ohbar':'\u29B5','ohm':'\u03A9','oint':'\u222E','olarr':'\u21BA','olcir':'\u29BE','olcross':'\u29BB','oline':'\u203E','olt':'\u29C0','omacr':'\u014D','Omacr':'\u014C','omega':'\u03C9','Omega':'\u03A9','omicron':'\u03BF','Omicron':'\u039F','omid':'\u29B6','ominus':'\u2296','oopf':'\uD835\uDD60','Oopf':'\uD835\uDD46','opar':'\u29B7','OpenCurlyDoubleQuote':'\u201C','OpenCurlyQuote':'\u2018','operp':'\u29B9','oplus':'\u2295','or':'\u2228','Or':'\u2A54','orarr':'\u21BB','ord':'\u2A5D','order':'\u2134','orderof':'\u2134','ordf':'\xAA','ordm':'\xBA','origof':'\u22B6','oror':'\u2A56','orslope':'\u2A57','orv':'\u2A5B','oS':'\u24C8','oscr':'\u2134','Oscr':'\uD835\uDCAA','oslash':'\xF8','Oslash':'\xD8','osol':'\u2298','otilde':'\xF5','Otilde':'\xD5','otimes':'\u2297','Otimes':'\u2A37','otimesas':'\u2A36','ouml':'\xF6','Ouml':'\xD6','ovbar':'\u233D','OverBar':'\u203E','OverBrace':'\u23DE','OverBracket':'\u23B4','OverParenthesis':'\u23DC','par':'\u2225','para':'\xB6','parallel':'\u2225','parsim':'\u2AF3','parsl':'\u2AFD','part':'\u2202','PartialD':'\u2202','pcy':'\u043F','Pcy':'\u041F','percnt':'%','period':'.','permil':'\u2030','perp':'\u22A5','pertenk':'\u2031','pfr':'\uD835\uDD2D','Pfr':'\uD835\uDD13','phi':'\u03C6','Phi':'\u03A6','phiv':'\u03D5','phmmat':'\u2133','phone':'\u260E','pi':'\u03C0','Pi':'\u03A0','pitchfork':'\u22D4','piv':'\u03D6','planck':'\u210F','planckh':'\u210E','plankv':'\u210F','plus':'+','plusacir':'\u2A23','plusb':'\u229E','pluscir':'\u2A22','plusdo':'\u2214','plusdu':'\u2A25','pluse':'\u2A72','PlusMinus':'\xB1','plusmn':'\xB1','plussim':'\u2A26','plustwo':'\u2A27','pm':'\xB1','Poincareplane':'\u210C','pointint':'\u2A15','popf':'\uD835\uDD61','Popf':'\u2119','pound':'\xA3','pr':'\u227A','Pr':'\u2ABB','prap':'\u2AB7','prcue':'\u227C','pre':'\u2AAF','prE':'\u2AB3','prec':'\u227A','precapprox':'\u2AB7','preccurlyeq':'\u227C','Precedes':'\u227A','PrecedesEqual':'\u2AAF','PrecedesSlantEqual':'\u227C','PrecedesTilde':'\u227E','preceq':'\u2AAF','precnapprox':'\u2AB9','precneqq':'\u2AB5','precnsim':'\u22E8','precsim':'\u227E','prime':'\u2032','Prime':'\u2033','primes':'\u2119','prnap':'\u2AB9','prnE':'\u2AB5','prnsim':'\u22E8','prod':'\u220F','Product':'\u220F','profalar':'\u232E','profline':'\u2312','profsurf':'\u2313','prop':'\u221D','Proportion':'\u2237','Proportional':'\u221D','propto':'\u221D','prsim':'\u227E','prurel':'\u22B0','pscr':'\uD835\uDCC5','Pscr':'\uD835\uDCAB','psi':'\u03C8','Psi':'\u03A8','puncsp':'\u2008','qfr':'\uD835\uDD2E','Qfr':'\uD835\uDD14','qint':'\u2A0C','qopf':'\uD835\uDD62','Qopf':'\u211A','qprime':'\u2057','qscr':'\uD835\uDCC6','Qscr':'\uD835\uDCAC','quaternions':'\u210D','quatint':'\u2A16','quest':'?','questeq':'\u225F','quot':'"','QUOT':'"','rAarr':'\u21DB','race':'\u223D\u0331','racute':'\u0155','Racute':'\u0154','radic':'\u221A','raemptyv':'\u29B3','rang':'\u27E9','Rang':'\u27EB','rangd':'\u2992','range':'\u29A5','rangle':'\u27E9','raquo':'\xBB','rarr':'\u2192','rArr':'\u21D2','Rarr':'\u21A0','rarrap':'\u2975','rarrb':'\u21E5','rarrbfs':'\u2920','rarrc':'\u2933','rarrfs':'\u291E','rarrhk':'\u21AA','rarrlp':'\u21AC','rarrpl':'\u2945','rarrsim':'\u2974','rarrtl':'\u21A3','Rarrtl':'\u2916','rarrw':'\u219D','ratail':'\u291A','rAtail':'\u291C','ratio':'\u2236','rationals':'\u211A','rbarr':'\u290D','rBarr':'\u290F','RBarr':'\u2910','rbbrk':'\u2773','rbrace':'}','rbrack':']','rbrke':'\u298C','rbrksld':'\u298E','rbrkslu':'\u2990','rcaron':'\u0159','Rcaron':'\u0158','rcedil':'\u0157','Rcedil':'\u0156','rceil':'\u2309','rcub':'}','rcy':'\u0440','Rcy':'\u0420','rdca':'\u2937','rdldhar':'\u2969','rdquo':'\u201D','rdquor':'\u201D','rdsh':'\u21B3','Re':'\u211C','real':'\u211C','realine':'\u211B','realpart':'\u211C','reals':'\u211D','rect':'\u25AD','reg':'\xAE','REG':'\xAE','ReverseElement':'\u220B','ReverseEquilibrium':'\u21CB','ReverseUpEquilibrium':'\u296F','rfisht':'\u297D','rfloor':'\u230B','rfr':'\uD835\uDD2F','Rfr':'\u211C','rHar':'\u2964','rhard':'\u21C1','rharu':'\u21C0','rharul':'\u296C','rho':'\u03C1','Rho':'\u03A1','rhov':'\u03F1','RightAngleBracket':'\u27E9','rightarrow':'\u2192','Rightarrow':'\u21D2','RightArrow':'\u2192','RightArrowBar':'\u21E5','RightArrowLeftArrow':'\u21C4','rightarrowtail':'\u21A3','RightCeiling':'\u2309','RightDoubleBracket':'\u27E7','RightDownTeeVector':'\u295D','RightDownVector':'\u21C2','RightDownVectorBar':'\u2955','RightFloor':'\u230B','rightharpoondown':'\u21C1','rightharpoonup':'\u21C0','rightleftarrows':'\u21C4','rightleftharpoons':'\u21CC','rightrightarrows':'\u21C9','rightsquigarrow':'\u219D','RightTee':'\u22A2','RightTeeArrow':'\u21A6','RightTeeVector':'\u295B','rightthreetimes':'\u22CC','RightTriangle':'\u22B3','RightTriangleBar':'\u29D0','RightTriangleEqual':'\u22B5','RightUpDownVector':'\u294F','RightUpTeeVector':'\u295C','RightUpVector':'\u21BE','RightUpVectorBar':'\u2954','RightVector':'\u21C0','RightVectorBar':'\u2953','ring':'\u02DA','risingdotseq':'\u2253','rlarr':'\u21C4','rlhar':'\u21CC','rlm':'\u200F','rmoust':'\u23B1','rmoustache':'\u23B1','rnmid':'\u2AEE','roang':'\u27ED','roarr':'\u21FE','robrk':'\u27E7','ropar':'\u2986','ropf':'\uD835\uDD63','Ropf':'\u211D','roplus':'\u2A2E','rotimes':'\u2A35','RoundImplies':'\u2970','rpar':')','rpargt':'\u2994','rppolint':'\u2A12','rrarr':'\u21C9','Rrightarrow':'\u21DB','rsaquo':'\u203A','rscr':'\uD835\uDCC7','Rscr':'\u211B','rsh':'\u21B1','Rsh':'\u21B1','rsqb':']','rsquo':'\u2019','rsquor':'\u2019','rthree':'\u22CC','rtimes':'\u22CA','rtri':'\u25B9','rtrie':'\u22B5','rtrif':'\u25B8','rtriltri':'\u29CE','RuleDelayed':'\u29F4','ruluhar':'\u2968','rx':'\u211E','sacute':'\u015B','Sacute':'\u015A','sbquo':'\u201A','sc':'\u227B','Sc':'\u2ABC','scap':'\u2AB8','scaron':'\u0161','Scaron':'\u0160','sccue':'\u227D','sce':'\u2AB0','scE':'\u2AB4','scedil':'\u015F','Scedil':'\u015E','scirc':'\u015D','Scirc':'\u015C','scnap':'\u2ABA','scnE':'\u2AB6','scnsim':'\u22E9','scpolint':'\u2A13','scsim':'\u227F','scy':'\u0441','Scy':'\u0421','sdot':'\u22C5','sdotb':'\u22A1','sdote':'\u2A66','searhk':'\u2925','searr':'\u2198','seArr':'\u21D8','searrow':'\u2198','sect':'\xA7','semi':';','seswar':'\u2929','setminus':'\u2216','setmn':'\u2216','sext':'\u2736','sfr':'\uD835\uDD30','Sfr':'\uD835\uDD16','sfrown':'\u2322','sharp':'\u266F','shchcy':'\u0449','SHCHcy':'\u0429','shcy':'\u0448','SHcy':'\u0428','ShortDownArrow':'\u2193','ShortLeftArrow':'\u2190','shortmid':'\u2223','shortparallel':'\u2225','ShortRightArrow':'\u2192','ShortUpArrow':'\u2191','shy':'\xAD','sigma':'\u03C3','Sigma':'\u03A3','sigmaf':'\u03C2','sigmav':'\u03C2','sim':'\u223C','simdot':'\u2A6A','sime':'\u2243','simeq':'\u2243','simg':'\u2A9E','simgE':'\u2AA0','siml':'\u2A9D','simlE':'\u2A9F','simne':'\u2246','simplus':'\u2A24','simrarr':'\u2972','slarr':'\u2190','SmallCircle':'\u2218','smallsetminus':'\u2216','smashp':'\u2A33','smeparsl':'\u29E4','smid':'\u2223','smile':'\u2323','smt':'\u2AAA','smte':'\u2AAC','smtes':'\u2AAC\uFE00','softcy':'\u044C','SOFTcy':'\u042C','sol':'/','solb':'\u29C4','solbar':'\u233F','sopf':'\uD835\uDD64','Sopf':'\uD835\uDD4A','spades':'\u2660','spadesuit':'\u2660','spar':'\u2225','sqcap':'\u2293','sqcaps':'\u2293\uFE00','sqcup':'\u2294','sqcups':'\u2294\uFE00','Sqrt':'\u221A','sqsub':'\u228F','sqsube':'\u2291','sqsubset':'\u228F','sqsubseteq':'\u2291','sqsup':'\u2290','sqsupe':'\u2292','sqsupset':'\u2290','sqsupseteq':'\u2292','squ':'\u25A1','square':'\u25A1','Square':'\u25A1','SquareIntersection':'\u2293','SquareSubset':'\u228F','SquareSubsetEqual':'\u2291','SquareSuperset':'\u2290','SquareSupersetEqual':'\u2292','SquareUnion':'\u2294','squarf':'\u25AA','squf':'\u25AA','srarr':'\u2192','sscr':'\uD835\uDCC8','Sscr':'\uD835\uDCAE','ssetmn':'\u2216','ssmile':'\u2323','sstarf':'\u22C6','star':'\u2606','Star':'\u22C6','starf':'\u2605','straightepsilon':'\u03F5','straightphi':'\u03D5','strns':'\xAF','sub':'\u2282','Sub':'\u22D0','subdot':'\u2ABD','sube':'\u2286','subE':'\u2AC5','subedot':'\u2AC3','submult':'\u2AC1','subne':'\u228A','subnE':'\u2ACB','subplus':'\u2ABF','subrarr':'\u2979','subset':'\u2282','Subset':'\u22D0','subseteq':'\u2286','subseteqq':'\u2AC5','SubsetEqual':'\u2286','subsetneq':'\u228A','subsetneqq':'\u2ACB','subsim':'\u2AC7','subsub':'\u2AD5','subsup':'\u2AD3','succ':'\u227B','succapprox':'\u2AB8','succcurlyeq':'\u227D','Succeeds':'\u227B','SucceedsEqual':'\u2AB0','SucceedsSlantEqual':'\u227D','SucceedsTilde':'\u227F','succeq':'\u2AB0','succnapprox':'\u2ABA','succneqq':'\u2AB6','succnsim':'\u22E9','succsim':'\u227F','SuchThat':'\u220B','sum':'\u2211','Sum':'\u2211','sung':'\u266A','sup':'\u2283','Sup':'\u22D1','sup1':'\xB9','sup2':'\xB2','sup3':'\xB3','supdot':'\u2ABE','supdsub':'\u2AD8','supe':'\u2287','supE':'\u2AC6','supedot':'\u2AC4','Superset':'\u2283','SupersetEqual':'\u2287','suphsol':'\u27C9','suphsub':'\u2AD7','suplarr':'\u297B','supmult':'\u2AC2','supne':'\u228B','supnE':'\u2ACC','supplus':'\u2AC0','supset':'\u2283','Supset':'\u22D1','supseteq':'\u2287','supseteqq':'\u2AC6','supsetneq':'\u228B','supsetneqq':'\u2ACC','supsim':'\u2AC8','supsub':'\u2AD4','supsup':'\u2AD6','swarhk':'\u2926','swarr':'\u2199','swArr':'\u21D9','swarrow':'\u2199','swnwar':'\u292A','szlig':'\xDF','Tab':'\t','target':'\u2316','tau':'\u03C4','Tau':'\u03A4','tbrk':'\u23B4','tcaron':'\u0165','Tcaron':'\u0164','tcedil':'\u0163','Tcedil':'\u0162','tcy':'\u0442','Tcy':'\u0422','tdot':'\u20DB','telrec':'\u2315','tfr':'\uD835\uDD31','Tfr':'\uD835\uDD17','there4':'\u2234','therefore':'\u2234','Therefore':'\u2234','theta':'\u03B8','Theta':'\u0398','thetasym':'\u03D1','thetav':'\u03D1','thickapprox':'\u2248','thicksim':'\u223C','ThickSpace':'\u205F\u200A','thinsp':'\u2009','ThinSpace':'\u2009','thkap':'\u2248','thksim':'\u223C','thorn':'\xFE','THORN':'\xDE','tilde':'\u02DC','Tilde':'\u223C','TildeEqual':'\u2243','TildeFullEqual':'\u2245','TildeTilde':'\u2248','times':'\xD7','timesb':'\u22A0','timesbar':'\u2A31','timesd':'\u2A30','tint':'\u222D','toea':'\u2928','top':'\u22A4','topbot':'\u2336','topcir':'\u2AF1','topf':'\uD835\uDD65','Topf':'\uD835\uDD4B','topfork':'\u2ADA','tosa':'\u2929','tprime':'\u2034','trade':'\u2122','TRADE':'\u2122','triangle':'\u25B5','triangledown':'\u25BF','triangleleft':'\u25C3','trianglelefteq':'\u22B4','triangleq':'\u225C','triangleright':'\u25B9','trianglerighteq':'\u22B5','tridot':'\u25EC','trie':'\u225C','triminus':'\u2A3A','TripleDot':'\u20DB','triplus':'\u2A39','trisb':'\u29CD','tritime':'\u2A3B','trpezium':'\u23E2','tscr':'\uD835\uDCC9','Tscr':'\uD835\uDCAF','tscy':'\u0446','TScy':'\u0426','tshcy':'\u045B','TSHcy':'\u040B','tstrok':'\u0167','Tstrok':'\u0166','twixt':'\u226C','twoheadleftarrow':'\u219E','twoheadrightarrow':'\u21A0','uacute':'\xFA','Uacute':'\xDA','uarr':'\u2191','uArr':'\u21D1','Uarr':'\u219F','Uarrocir':'\u2949','ubrcy':'\u045E','Ubrcy':'\u040E','ubreve':'\u016D','Ubreve':'\u016C','ucirc':'\xFB','Ucirc':'\xDB','ucy':'\u0443','Ucy':'\u0423','udarr':'\u21C5','udblac':'\u0171','Udblac':'\u0170','udhar':'\u296E','ufisht':'\u297E','ufr':'\uD835\uDD32','Ufr':'\uD835\uDD18','ugrave':'\xF9','Ugrave':'\xD9','uHar':'\u2963','uharl':'\u21BF','uharr':'\u21BE','uhblk':'\u2580','ulcorn':'\u231C','ulcorner':'\u231C','ulcrop':'\u230F','ultri':'\u25F8','umacr':'\u016B','Umacr':'\u016A','uml':'\xA8','UnderBar':'_','UnderBrace':'\u23DF','UnderBracket':'\u23B5','UnderParenthesis':'\u23DD','Union':'\u22C3','UnionPlus':'\u228E','uogon':'\u0173','Uogon':'\u0172','uopf':'\uD835\uDD66','Uopf':'\uD835\uDD4C','uparrow':'\u2191','Uparrow':'\u21D1','UpArrow':'\u2191','UpArrowBar':'\u2912','UpArrowDownArrow':'\u21C5','updownarrow':'\u2195','Updownarrow':'\u21D5','UpDownArrow':'\u2195','UpEquilibrium':'\u296E','upharpoonleft':'\u21BF','upharpoonright':'\u21BE','uplus':'\u228E','UpperLeftArrow':'\u2196','UpperRightArrow':'\u2197','upsi':'\u03C5','Upsi':'\u03D2','upsih':'\u03D2','upsilon':'\u03C5','Upsilon':'\u03A5','UpTee':'\u22A5','UpTeeArrow':'\u21A5','upuparrows':'\u21C8','urcorn':'\u231D','urcorner':'\u231D','urcrop':'\u230E','uring':'\u016F','Uring':'\u016E','urtri':'\u25F9','uscr':'\uD835\uDCCA','Uscr':'\uD835\uDCB0','utdot':'\u22F0','utilde':'\u0169','Utilde':'\u0168','utri':'\u25B5','utrif':'\u25B4','uuarr':'\u21C8','uuml':'\xFC','Uuml':'\xDC','uwangle':'\u29A7','vangrt':'\u299C','varepsilon':'\u03F5','varkappa':'\u03F0','varnothing':'\u2205','varphi':'\u03D5','varpi':'\u03D6','varpropto':'\u221D','varr':'\u2195','vArr':'\u21D5','varrho':'\u03F1','varsigma':'\u03C2','varsubsetneq':'\u228A\uFE00','varsubsetneqq':'\u2ACB\uFE00','varsupsetneq':'\u228B\uFE00','varsupsetneqq':'\u2ACC\uFE00','vartheta':'\u03D1','vartriangleleft':'\u22B2','vartriangleright':'\u22B3','vBar':'\u2AE8','Vbar':'\u2AEB','vBarv':'\u2AE9','vcy':'\u0432','Vcy':'\u0412','vdash':'\u22A2','vDash':'\u22A8','Vdash':'\u22A9','VDash':'\u22AB','Vdashl':'\u2AE6','vee':'\u2228','Vee':'\u22C1','veebar':'\u22BB','veeeq':'\u225A','vellip':'\u22EE','verbar':'|','Verbar':'\u2016','vert':'|','Vert':'\u2016','VerticalBar':'\u2223','VerticalLine':'|','VerticalSeparator':'\u2758','VerticalTilde':'\u2240','VeryThinSpace':'\u200A','vfr':'\uD835\uDD33','Vfr':'\uD835\uDD19','vltri':'\u22B2','vnsub':'\u2282\u20D2','vnsup':'\u2283\u20D2','vopf':'\uD835\uDD67','Vopf':'\uD835\uDD4D','vprop':'\u221D','vrtri':'\u22B3','vscr':'\uD835\uDCCB','Vscr':'\uD835\uDCB1','vsubne':'\u228A\uFE00','vsubnE':'\u2ACB\uFE00','vsupne':'\u228B\uFE00','vsupnE':'\u2ACC\uFE00','Vvdash':'\u22AA','vzigzag':'\u299A','wcirc':'\u0175','Wcirc':'\u0174','wedbar':'\u2A5F','wedge':'\u2227','Wedge':'\u22C0','wedgeq':'\u2259','weierp':'\u2118','wfr':'\uD835\uDD34','Wfr':'\uD835\uDD1A','wopf':'\uD835\uDD68','Wopf':'\uD835\uDD4E','wp':'\u2118','wr':'\u2240','wreath':'\u2240','wscr':'\uD835\uDCCC','Wscr':'\uD835\uDCB2','xcap':'\u22C2','xcirc':'\u25EF','xcup':'\u22C3','xdtri':'\u25BD','xfr':'\uD835\uDD35','Xfr':'\uD835\uDD1B','xharr':'\u27F7','xhArr':'\u27FA','xi':'\u03BE','Xi':'\u039E','xlarr':'\u27F5','xlArr':'\u27F8','xmap':'\u27FC','xnis':'\u22FB','xodot':'\u2A00','xopf':'\uD835\uDD69','Xopf':'\uD835\uDD4F','xoplus':'\u2A01','xotime':'\u2A02','xrarr':'\u27F6','xrArr':'\u27F9','xscr':'\uD835\uDCCD','Xscr':'\uD835\uDCB3','xsqcup':'\u2A06','xuplus':'\u2A04','xutri':'\u25B3','xvee':'\u22C1','xwedge':'\u22C0','yacute':'\xFD','Yacute':'\xDD','yacy':'\u044F','YAcy':'\u042F','ycirc':'\u0177','Ycirc':'\u0176','ycy':'\u044B','Ycy':'\u042B','yen':'\xA5','yfr':'\uD835\uDD36','Yfr':'\uD835\uDD1C','yicy':'\u0457','YIcy':'\u0407','yopf':'\uD835\uDD6A','Yopf':'\uD835\uDD50','yscr':'\uD835\uDCCE','Yscr':'\uD835\uDCB4','yucy':'\u044E','YUcy':'\u042E','yuml':'\xFF','Yuml':'\u0178','zacute':'\u017A','Zacute':'\u0179','zcaron':'\u017E','Zcaron':'\u017D','zcy':'\u0437','Zcy':'\u0417','zdot':'\u017C','Zdot':'\u017B','zeetrf':'\u2128','ZeroWidthSpace':'\u200B','zeta':'\u03B6','Zeta':'\u0396','zfr':'\uD835\uDD37','Zfr':'\u2128','zhcy':'\u0436','ZHcy':'\u0416','zigrarr':'\u21DD','zopf':'\uD835\uDD6B','Zopf':'\u2124','zscr':'\uD835\uDCCF','Zscr':'\uD835\uDCB5','zwj':'\u200D','zwnj':'\u200C'};
+ var decodeMapLegacy = {'aacute':'\xE1','Aacute':'\xC1','acirc':'\xE2','Acirc':'\xC2','acute':'\xB4','aelig':'\xE6','AElig':'\xC6','agrave':'\xE0','Agrave':'\xC0','amp':'&','AMP':'&','aring':'\xE5','Aring':'\xC5','atilde':'\xE3','Atilde':'\xC3','auml':'\xE4','Auml':'\xC4','brvbar':'\xA6','ccedil':'\xE7','Ccedil':'\xC7','cedil':'\xB8','cent':'\xA2','copy':'\xA9','COPY':'\xA9','curren':'\xA4','deg':'\xB0','divide':'\xF7','eacute':'\xE9','Eacute':'\xC9','ecirc':'\xEA','Ecirc':'\xCA','egrave':'\xE8','Egrave':'\xC8','eth':'\xF0','ETH':'\xD0','euml':'\xEB','Euml':'\xCB','frac12':'\xBD','frac14':'\xBC','frac34':'\xBE','gt':'>','GT':'>','iacute':'\xED','Iacute':'\xCD','icirc':'\xEE','Icirc':'\xCE','iexcl':'\xA1','igrave':'\xEC','Igrave':'\xCC','iquest':'\xBF','iuml':'\xEF','Iuml':'\xCF','laquo':'\xAB','lt':'<','LT':'<','macr':'\xAF','micro':'\xB5','middot':'\xB7','nbsp':'\xA0','not':'\xAC','ntilde':'\xF1','Ntilde':'\xD1','oacute':'\xF3','Oacute':'\xD3','ocirc':'\xF4','Ocirc':'\xD4','ograve':'\xF2','Ograve':'\xD2','ordf':'\xAA','ordm':'\xBA','oslash':'\xF8','Oslash':'\xD8','otilde':'\xF5','Otilde':'\xD5','ouml':'\xF6','Ouml':'\xD6','para':'\xB6','plusmn':'\xB1','pound':'\xA3','quot':'"','QUOT':'"','raquo':'\xBB','reg':'\xAE','REG':'\xAE','sect':'\xA7','shy':'\xAD','sup1':'\xB9','sup2':'\xB2','sup3':'\xB3','szlig':'\xDF','thorn':'\xFE','THORN':'\xDE','times':'\xD7','uacute':'\xFA','Uacute':'\xDA','ucirc':'\xFB','Ucirc':'\xDB','ugrave':'\xF9','Ugrave':'\xD9','uml':'\xA8','uuml':'\xFC','Uuml':'\xDC','yacute':'\xFD','Yacute':'\xDD','yen':'\xA5','yuml':'\xFF'};
+ var decodeMapNumeric = {'0':'\uFFFD','128':'\u20AC','130':'\u201A','131':'\u0192','132':'\u201E','133':'\u2026','134':'\u2020','135':'\u2021','136':'\u02C6','137':'\u2030','138':'\u0160','139':'\u2039','140':'\u0152','142':'\u017D','145':'\u2018','146':'\u2019','147':'\u201C','148':'\u201D','149':'\u2022','150':'\u2013','151':'\u2014','152':'\u02DC','153':'\u2122','154':'\u0161','155':'\u203A','156':'\u0153','158':'\u017E','159':'\u0178'};
+ var invalidReferenceCodePoints = [1,2,3,4,5,6,7,8,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,64976,64977,64978,64979,64980,64981,64982,64983,64984,64985,64986,64987,64988,64989,64990,64991,64992,64993,64994,64995,64996,64997,64998,64999,65000,65001,65002,65003,65004,65005,65006,65007,65534,65535,131070,131071,196606,196607,262142,262143,327678,327679,393214,393215,458750,458751,524286,524287,589822,589823,655358,655359,720894,720895,786430,786431,851966,851967,917502,917503,983038,983039,1048574,1048575,1114110,1114111];
+
+ /*--------------------------------------------------------------------------*/
+
+ var stringFromCharCode = String.fromCharCode;
+
+ var object = {};
+ var hasOwnProperty = object.hasOwnProperty;
+ var has = function(object, propertyName) {
+ return hasOwnProperty.call(object, propertyName);
+ };
+
+ var contains = function(array, value) {
+ var index = -1;
+ var length = array.length;
+ while (++index < length) {
+ if (array[index] == value) {
+ return true;
+ }
+ }
+ return false;
+ };
+
+ var merge = function(options, defaults) {
+ if (!options) {
+ return defaults;
+ }
+ var result = {};
+ var key;
+ for (key in defaults) {
+ // A `hasOwnProperty` check is not needed here, since only recognized
+ // option names are used anyway. Any others are ignored.
+ result[key] = has(options, key) ? options[key] : defaults[key];
+ }
+ return result;
+ };
+
+ // Modified version of `ucs2encode`; see https://mths.be/punycode.
+ var codePointToSymbol = function(codePoint, strict) {
+ var output = '';
+ if ((codePoint >= 0xD800 && codePoint <= 0xDFFF) || codePoint > 0x10FFFF) {
+ // See issue #4:
+ // “Otherwise, if the number is in the range 0xD800 to 0xDFFF or is
+ // greater than 0x10FFFF, then this is a parse error. Return a U+FFFD
+ // REPLACEMENT CHARACTER.”
+ if (strict) {
+ parseError('character reference outside the permissible Unicode range');
+ }
+ return '\uFFFD';
+ }
+ if (has(decodeMapNumeric, codePoint)) {
+ if (strict) {
+ parseError('disallowed character reference');
+ }
+ return decodeMapNumeric[codePoint];
+ }
+ if (strict && contains(invalidReferenceCodePoints, codePoint)) {
+ parseError('disallowed character reference');
+ }
+ if (codePoint > 0xFFFF) {
+ codePoint -= 0x10000;
+ output += stringFromCharCode(codePoint >>> 10 & 0x3FF | 0xD800);
+ codePoint = 0xDC00 | codePoint & 0x3FF;
+ }
+ output += stringFromCharCode(codePoint);
+ return output;
+ };
+
+ var hexEscape = function(codePoint) {
+ return '&#x' + codePoint.toString(16).toUpperCase() + ';';
+ };
+
+ var decEscape = function(codePoint) {
+ return '&#' + codePoint + ';';
+ };
+
+ var parseError = function(message) {
+ throw Error('Parse error: ' + message);
+ };
+
+ /*--------------------------------------------------------------------------*/
+
+ var encode = function(string, options) {
+ options = merge(options, encode.options);
+ var strict = options.strict;
+ if (strict && regexInvalidRawCodePoint.test(string)) {
+ parseError('forbidden code point');
+ }
+ var encodeEverything = options.encodeEverything;
+ var useNamedReferences = options.useNamedReferences;
+ var allowUnsafeSymbols = options.allowUnsafeSymbols;
+ var escapeCodePoint = options.decimal ? decEscape : hexEscape;
+
+ var escapeBmpSymbol = function(symbol) {
+ return escapeCodePoint(symbol.charCodeAt(0));
+ };
+
+ if (encodeEverything) {
+ // Encode ASCII symbols.
+ string = string.replace(regexAsciiWhitelist, function(symbol) {
+ // Use named references if requested & possible.
+ if (useNamedReferences && has(encodeMap, symbol)) {
+ return '&' + encodeMap[symbol] + ';';
+ }
+ return escapeBmpSymbol(symbol);
+ });
+ // Shorten a few escapes that represent two symbols, of which at least one
+ // is within the ASCII range.
+ if (useNamedReferences) {
+ string = string
+ .replace(/&gt;\u20D2/g, '&nvgt;')
+ .replace(/&lt;\u20D2/g, '&nvlt;')
+ .replace(/&#x66;&#x6A;/g, '&fjlig;');
+ }
+ // Encode non-ASCII symbols.
+ if (useNamedReferences) {
+ // Encode non-ASCII symbols that can be replaced with a named reference.
+ string = string.replace(regexEncodeNonAscii, function(string) {
+ // Note: there is no need to check `has(encodeMap, string)` here.
+ return '&' + encodeMap[string] + ';';
+ });
+ }
+ // Note: any remaining non-ASCII symbols are handled outside of the `if`.
+ } else if (useNamedReferences) {
+ // Apply named character references.
+ // Encode `<>"'&` using named character references.
+ if (!allowUnsafeSymbols) {
+ string = string.replace(regexEscape, function(string) {
+ return '&' + encodeMap[string] + ';'; // no need to check `has()` here
+ });
+ }
+ // Shorten escapes that represent two symbols, of which at least one is
+ // `<>"'&`.
+ string = string
+ .replace(/&gt;\u20D2/g, '&nvgt;')
+ .replace(/&lt;\u20D2/g, '&nvlt;');
+ // Encode non-ASCII symbols that can be replaced with a named reference.
+ string = string.replace(regexEncodeNonAscii, function(string) {
+ // Note: there is no need to check `has(encodeMap, string)` here.
+ return '&' + encodeMap[string] + ';';
+ });
+ } else if (!allowUnsafeSymbols) {
+ // Encode `<>"'&` using hexadecimal escapes, now that they’re not handled
+ // using named character references.
+ string = string.replace(regexEscape, escapeBmpSymbol);
+ }
+ return string
+ // Encode astral symbols.
+ .replace(regexAstralSymbols, function($0) {
+ // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
+ var high = $0.charCodeAt(0);
+ var low = $0.charCodeAt(1);
+ var codePoint = (high - 0xD800) * 0x400 + low - 0xDC00 + 0x10000;
+ return escapeCodePoint(codePoint);
+ })
+ // Encode any remaining BMP symbols that are not printable ASCII symbols
+ // using a hexadecimal escape.
+ .replace(regexBmpWhitelist, escapeBmpSymbol);
+ };
+ // Expose default options (so they can be overridden globally).
+ encode.options = {
+ 'allowUnsafeSymbols': false,
+ 'encodeEverything': false,
+ 'strict': false,
+ 'useNamedReferences': false,
+ 'decimal' : false
+ };
+
+ var decode = function(html, options) {
+ options = merge(options, decode.options);
+ var strict = options.strict;
+ if (strict && regexInvalidEntity.test(html)) {
+ parseError('malformed character reference');
+ }
+ return html.replace(regexDecode, function($0, $1, $2, $3, $4, $5, $6, $7) {
+ var codePoint;
+ var semicolon;
+ var decDigits;
+ var hexDigits;
+ var reference;
+ var next;
+ if ($1) {
+ // Decode decimal escapes, e.g. `&#119558;`.
+ decDigits = $1;
+ semicolon = $2;
+ if (strict && !semicolon) {
+ parseError('character reference was not terminated by a semicolon');
+ }
+ codePoint = parseInt(decDigits, 10);
+ return codePointToSymbol(codePoint, strict);
+ }
+ if ($3) {
+ // Decode hexadecimal escapes, e.g. `&#x1D306;`.
+ hexDigits = $3;
+ semicolon = $4;
+ if (strict && !semicolon) {
+ parseError('character reference was not terminated by a semicolon');
+ }
+ codePoint = parseInt(hexDigits, 16);
+ return codePointToSymbol(codePoint, strict);
+ }
+ if ($5) {
+ // Decode named character references with trailing `;`, e.g. `&copy;`.
+ reference = $5;
+ if (has(decodeMap, reference)) {
+ return decodeMap[reference];
+ } else {
+ // Ambiguous ampersand. https://mths.be/notes/ambiguous-ampersands
+ if (strict) {
+ parseError(
+ 'named character reference was not terminated by a semicolon'
+ );
+ }
+ return $0;
+ }
+ }
+ // If we’re still here, it’s a legacy reference for sure. No need for an
+ // extra `if` check.
+ // Decode named character references without trailing `;`, e.g. `&amp`
+ // This is only a parse error if it gets converted to `&`, or if it is
+ // followed by `=` in an attribute context.
+ reference = $6;
+ next = $7;
+ if (next && options.isAttributeValue) {
+ if (strict && next == '=') {
+ parseError('`&` did not start a character reference');
+ }
+ return $0;
+ } else {
+ if (strict) {
+ parseError(
+ 'named character reference was not terminated by a semicolon'
+ );
+ }
+ // Note: there is no need to check `has(decodeMapLegacy, reference)`.
+ return decodeMapLegacy[reference] + (next || '');
+ }
+ });
+ };
+ // Expose default options (so they can be overridden globally).
+ decode.options = {
+ 'isAttributeValue': false,
+ 'strict': false
+ };
+
+ var escape = function(string) {
+ return string.replace(regexEscape, function($0) {
+ // Note: there is no need to check `has(escapeMap, $0)` here.
+ return escapeMap[$0];
+ });
+ };
+
+ /*--------------------------------------------------------------------------*/
+
+ var he = {
+ 'version': '1.1.1',
+ 'encode': encode,
+ 'decode': decode,
+ 'escape': escape,
+ 'unescape': decode
+ };
+
+ // Some AMD build optimizers, like r.js, check for specific condition patterns
+ // like the following:
+ if (
+ false
+ ) {
+ define(function() {
+ return he;
+ });
+ } else if (freeExports && !freeExports.nodeType) {
+ if (freeModule) { // in Node.js, io.js, or RingoJS v0.8.0+
+ freeModule.exports = he;
+ } else { // in Narwhal or RingoJS v0.7.0-
+ for (var key in he) {
+ has(he, key) && (freeExports[key] = he[key]);
+ }
+ }
+ } else { // in Rhino or a web browser
+ root.he = he;
+ }
+
+}(this));
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],65:[function(require,module,exports){
+exports.read = function (buffer, offset, isLE, mLen, nBytes) {
+ var e, m
+ var eLen = nBytes * 8 - mLen - 1
+ var eMax = (1 << eLen) - 1
+ var eBias = eMax >> 1
+ var nBits = -7
+ var i = isLE ? (nBytes - 1) : 0
+ var d = isLE ? -1 : 1
+ var s = buffer[offset + i]
+
+ i += d
+
+ e = s & ((1 << (-nBits)) - 1)
+ s >>= (-nBits)
+ nBits += eLen
+ for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
+
+ m = e & ((1 << (-nBits)) - 1)
+ e >>= (-nBits)
+ nBits += mLen
+ for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
+
+ if (e === 0) {
+ e = 1 - eBias
+ } else if (e === eMax) {
+ return m ? NaN : ((s ? -1 : 1) * Infinity)
+ } else {
+ m = m + Math.pow(2, mLen)
+ e = e - eBias
+ }
+ return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
+}
+
+exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
+ var e, m, c
+ var eLen = nBytes * 8 - mLen - 1
+ var eMax = (1 << eLen) - 1
+ var eBias = eMax >> 1
+ var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
+ var i = isLE ? 0 : (nBytes - 1)
+ var d = isLE ? 1 : -1
+ var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
+
+ value = Math.abs(value)
+
+ if (isNaN(value) || value === Infinity) {
+ m = isNaN(value) ? 1 : 0
+ e = eMax
+ } else {
+ e = Math.floor(Math.log(value) / Math.LN2)
+ if (value * (c = Math.pow(2, -e)) < 1) {
+ e--
+ c *= 2
+ }
+ if (e + eBias >= 1) {
+ value += rt / c
+ } else {
+ value += rt * Math.pow(2, 1 - eBias)
+ }
+ if (value * c >= 2) {
+ e++
+ c /= 2
+ }
+
+ if (e + eBias >= eMax) {
+ m = 0
+ e = eMax
+ } else if (e + eBias >= 1) {
+ m = (value * c - 1) * Math.pow(2, mLen)
+ e = e + eBias
+ } else {
+ m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
+ e = 0
+ }
+ }
+
+ for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
+
+ e = (e << mLen) | m
+ eLen += mLen
+ for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
+
+ buffer[offset + i - d] |= s * 128
+}
+
+},{}],66:[function(require,module,exports){
+if (typeof Object.create === 'function') {
+ // implementation from standard node.js 'util' module
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor
+ ctor.prototype = Object.create(superCtor.prototype, {
+ constructor: {
+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ };
+} else {
+ // old school shim for old browsers
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor
+ var TempCtor = function () {}
+ TempCtor.prototype = superCtor.prototype
+ ctor.prototype = new TempCtor()
+ ctor.prototype.constructor = ctor
+ }
+}
+
+},{}],67:[function(require,module,exports){
+/*!
+ * Determine if an object is a Buffer
+ *
+ * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
+ * @license MIT
+ */
+
+// The _isBuffer check is for Safari 5-7 support, because it's missing
+// Object.prototype.constructor. Remove this eventually
+module.exports = function (obj) {
+ return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)
+}
+
+function isBuffer (obj) {
+ return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
+}
+
+// For Node v0.10 support. Remove this eventually.
+function isSlowBuffer (obj) {
+ return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))
+}
+
+},{}],68:[function(require,module,exports){
+var toString = {}.toString;
+
+module.exports = Array.isArray || function (arr) {
+ return toString.call(arr) == '[object Array]';
+};
+
+},{}],69:[function(require,module,exports){
+(function (global){
+/*! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */
+;(function () {
+ // Detect the `define` function exposed by asynchronous module loaders. The
+ // strict `define` check is necessary for compatibility with `r.js`.
+ var isLoader = false;
+
+ // A set of types used to distinguish objects from primitives.
+ var objectTypes = {
+ "function": true,
+ "object": true
+ };
+
+ // Detect the `exports` object exposed by CommonJS implementations.
+ var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;
+
+ // Use the `global` object exposed by Node (including Browserify via
+ // `insert-module-globals`), Narwhal, and Ringo as the default context,
+ // and the `window` object in browsers. Rhino exports a `global` function
+ // instead.
+ var root = objectTypes[typeof window] && window || this,
+ freeGlobal = freeExports && objectTypes[typeof module] && module && !module.nodeType && typeof global == "object" && global;
+
+ if (freeGlobal && (freeGlobal["global"] === freeGlobal || freeGlobal["window"] === freeGlobal || freeGlobal["self"] === freeGlobal)) {
+ root = freeGlobal;
+ }
+
+ // Public: Initializes JSON 3 using the given `context` object, attaching the
+ // `stringify` and `parse` functions to the specified `exports` object.
+ function runInContext(context, exports) {
+ context || (context = root["Object"]());
+ exports || (exports = root["Object"]());
+
+ // Native constructor aliases.
+ var Number = context["Number"] || root["Number"],
+ String = context["String"] || root["String"],
+ Object = context["Object"] || root["Object"],
+ Date = context["Date"] || root["Date"],
+ SyntaxError = context["SyntaxError"] || root["SyntaxError"],
+ TypeError = context["TypeError"] || root["TypeError"],
+ Math = context["Math"] || root["Math"],
+ nativeJSON = context["JSON"] || root["JSON"];
+
+ // Delegate to the native `stringify` and `parse` implementations.
+ if (typeof nativeJSON == "object" && nativeJSON) {
+ exports.stringify = nativeJSON.stringify;
+ exports.parse = nativeJSON.parse;
+ }
+
+ // Convenience aliases.
+ var objectProto = Object.prototype,
+ getClass = objectProto.toString,
+ isProperty, forEach, undef;
+
+ // Test the `Date#getUTC*` methods. Based on work by @Yaffle.
+ var isExtended = new Date(-3509827334573292);
+ try {
+ // The `getUTCFullYear`, `Month`, and `Date` methods return nonsensical
+ // results for certain dates in Opera >= 10.53.
+ isExtended = isExtended.getUTCFullYear() == -109252 && isExtended.getUTCMonth() === 0 && isExtended.getUTCDate() === 1 &&
+ // Safari < 2.0.2 stores the internal millisecond time value correctly,
+ // but clips the values returned by the date methods to the range of
+ // signed 32-bit integers ([-2 ** 31, 2 ** 31 - 1]).
+ isExtended.getUTCHours() == 10 && isExtended.getUTCMinutes() == 37 && isExtended.getUTCSeconds() == 6 && isExtended.getUTCMilliseconds() == 708;
+ } catch (exception) {}
+
+ // Internal: Determines whether the native `JSON.stringify` and `parse`
+ // implementations are spec-compliant. Based on work by Ken Snyder.
+ function has(name) {
+ if (has[name] !== undef) {
+ // Return cached feature test result.
+ return has[name];
+ }
+ var isSupported;
+ if (name == "bug-string-char-index") {
+ // IE <= 7 doesn't support accessing string characters using square
+ // bracket notation. IE 8 only supports this for primitives.
+ isSupported = "a"[0] != "a";
+ } else if (name == "json") {
+ // Indicates whether both `JSON.stringify` and `JSON.parse` are
+ // supported.
+ isSupported = has("json-stringify") && has("json-parse");
+ } else {
+ var value, serialized = '{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';
+ // Test `JSON.stringify`.
+ if (name == "json-stringify") {
+ var stringify = exports.stringify, stringifySupported = typeof stringify == "function" && isExtended;
+ if (stringifySupported) {
+ // A test function object with a custom `toJSON` method.
+ (value = function () {
+ return 1;
+ }).toJSON = value;
+ try {
+ stringifySupported =
+ // Firefox 3.1b1 and b2 serialize string, number, and boolean
+ // primitives as object literals.
+ stringify(0) === "0" &&
+ // FF 3.1b1, b2, and JSON 2 serialize wrapped primitives as object
+ // literals.
+ stringify(new Number()) === "0" &&
+ stringify(new String()) == '""' &&
+ // FF 3.1b1, 2 throw an error if the value is `null`, `undefined`, or
+ // does not define a canonical JSON representation (this applies to
+ // objects with `toJSON` properties as well, *unless* they are nested
+ // within an object or array).
+ stringify(getClass) === undef &&
+ // IE 8 serializes `undefined` as `"undefined"`. Safari <= 5.1.7 and
+ // FF 3.1b3 pass this test.
+ stringify(undef) === undef &&
+ // Safari <= 5.1.7 and FF 3.1b3 throw `Error`s and `TypeError`s,
+ // respectively, if the value is omitted entirely.
+ stringify() === undef &&
+ // FF 3.1b1, 2 throw an error if the given value is not a number,
+ // string, array, object, Boolean, or `null` literal. This applies to
+ // objects with custom `toJSON` methods as well, unless they are nested
+ // inside object or array literals. YUI 3.0.0b1 ignores custom `toJSON`
+ // methods entirely.
+ stringify(value) === "1" &&
+ stringify([value]) == "[1]" &&
+ // Prototype <= 1.6.1 serializes `[undefined]` as `"[]"` instead of
+ // `"[null]"`.
+ stringify([undef]) == "[null]" &&
+ // YUI 3.0.0b1 fails to serialize `null` literals.
+ stringify(null) == "null" &&
+ // FF 3.1b1, 2 halts serialization if an array contains a function:
+ // `[1, true, getClass, 1]` serializes as "[1,true,],". FF 3.1b3
+ // elides non-JSON values from objects and arrays, unless they
+ // define custom `toJSON` methods.
+ stringify([undef, getClass, null]) == "[null,null,null]" &&
+ // Simple serialization test. FF 3.1b1 uses Unicode escape sequences
+ // where character escape codes are expected (e.g., `\b` => `\u0008`).
+ stringify({ "a": [value, true, false, null, "\x00\b\n\f\r\t"] }) == serialized &&
+ // FF 3.1b1 and b2 ignore the `filter` and `width` arguments.
+ stringify(null, value) === "1" &&
+ stringify([1, 2], null, 1) == "[\n 1,\n 2\n]" &&
+ // JSON 2, Prototype <= 1.7, and older WebKit builds incorrectly
+ // serialize extended years.
+ stringify(new Date(-8.64e15)) == '"-271821-04-20T00:00:00.000Z"' &&
+ // The milliseconds are optional in ES 5, but required in 5.1.
+ stringify(new Date(8.64e15)) == '"+275760-09-13T00:00:00.000Z"' &&
+ // Firefox <= 11.0 incorrectly serializes years prior to 0 as negative
+ // four-digit years instead of six-digit years. Credits: @Yaffle.
+ stringify(new Date(-621987552e5)) == '"-000001-01-01T00:00:00.000Z"' &&
+ // Safari <= 5.1.5 and Opera >= 10.53 incorrectly serialize millisecond
+ // values less than 1000. Credits: @Yaffle.
+ stringify(new Date(-1)) == '"1969-12-31T23:59:59.999Z"';
+ } catch (exception) {
+ stringifySupported = false;
+ }
+ }
+ isSupported = stringifySupported;
+ }
+ // Test `JSON.parse`.
+ if (name == "json-parse") {
+ var parse = exports.parse;
+ if (typeof parse == "function") {
+ try {
+ // FF 3.1b1, b2 will throw an exception if a bare literal is provided.
+ // Conforming implementations should also coerce the initial argument to
+ // a string prior to parsing.
+ if (parse("0") === 0 && !parse(false)) {
+ // Simple parsing test.
+ value = parse(serialized);
+ var parseSupported = value["a"].length == 5 && value["a"][0] === 1;
+ if (parseSupported) {
+ try {
+ // Safari <= 5.1.2 and FF 3.1b1 allow unescaped tabs in strings.
+ parseSupported = !parse('"\t"');
+ } catch (exception) {}
+ if (parseSupported) {
+ try {
+ // FF 4.0 and 4.0.1 allow leading `+` signs and leading
+ // decimal points. FF 4.0, 4.0.1, and IE 9-10 also allow
+ // certain octal literals.
+ parseSupported = parse("01") !== 1;
+ } catch (exception) {}
+ }
+ if (parseSupported) {
+ try {
+ // FF 4.0, 4.0.1, and Rhino 1.7R3-R4 allow trailing decimal
+ // points. These environments, along with FF 3.1b1 and 2,
+ // also allow trailing commas in JSON objects and arrays.
+ parseSupported = parse("1.") !== 1;
+ } catch (exception) {}
+ }
+ }
+ }
+ } catch (exception) {
+ parseSupported = false;
+ }
+ }
+ isSupported = parseSupported;
+ }
+ }
+ return has[name] = !!isSupported;
+ }
+
+ if (!has("json")) {
+ // Common `[[Class]]` name aliases.
+ var functionClass = "[object Function]",
+ dateClass = "[object Date]",
+ numberClass = "[object Number]",
+ stringClass = "[object String]",
+ arrayClass = "[object Array]",
+ booleanClass = "[object Boolean]";
+
+ // Detect incomplete support for accessing string characters by index.
+ var charIndexBuggy = has("bug-string-char-index");
+
+ // Define additional utility methods if the `Date` methods are buggy.
+ if (!isExtended) {
+ var floor = Math.floor;
+ // A mapping between the months of the year and the number of days between
+ // January 1st and the first of the respective month.
+ var Months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
+ // Internal: Calculates the number of days between the Unix epoch and the
+ // first day of the given month.
+ var getDay = function (year, month) {
+ return Months[month] + 365 * (year - 1970) + floor((year - 1969 + (month = +(month > 1))) / 4) - floor((year - 1901 + month) / 100) + floor((year - 1601 + month) / 400);
+ };
+ }
+
+ // Internal: Determines if a property is a direct property of the given
+ // object. Delegates to the native `Object#hasOwnProperty` method.
+ if (!(isProperty = objectProto.hasOwnProperty)) {
+ isProperty = function (property) {
+ var members = {}, constructor;
+ if ((members.__proto__ = null, members.__proto__ = {
+ // The *proto* property cannot be set multiple times in recent
+ // versions of Firefox and SeaMonkey.
+ "toString": 1
+ }, members).toString != getClass) {
+ // Safari <= 2.0.3 doesn't implement `Object#hasOwnProperty`, but
+ // supports the mutable *proto* property.
+ isProperty = function (property) {
+ // Capture and break the object's prototype chain (see section 8.6.2
+ // of the ES 5.1 spec). The parenthesized expression prevents an
+ // unsafe transformation by the Closure Compiler.
+ var original = this.__proto__, result = property in (this.__proto__ = null, this);
+ // Restore the original prototype chain.
+ this.__proto__ = original;
+ return result;
+ };
+ } else {
+ // Capture a reference to the top-level `Object` constructor.
+ constructor = members.constructor;
+ // Use the `constructor` property to simulate `Object#hasOwnProperty` in
+ // other environments.
+ isProperty = function (property) {
+ var parent = (this.constructor || constructor).prototype;
+ return property in this && !(property in parent && this[property] === parent[property]);
+ };
+ }
+ members = null;
+ return isProperty.call(this, property);
+ };
+ }
+
+ // Internal: Normalizes the `for...in` iteration algorithm across
+ // environments. Each enumerated key is yielded to a `callback` function.
+ forEach = function (object, callback) {
+ var size = 0, Properties, members, property;
+
+ // Tests for bugs in the current environment's `for...in` algorithm. The
+ // `valueOf` property inherits the non-enumerable flag from
+ // `Object.prototype` in older versions of IE, Netscape, and Mozilla.
+ (Properties = function () {
+ this.valueOf = 0;
+ }).prototype.valueOf = 0;
+
+ // Iterate over a new instance of the `Properties` class.
+ members = new Properties();
+ for (property in members) {
+ // Ignore all properties inherited from `Object.prototype`.
+ if (isProperty.call(members, property)) {
+ size++;
+ }
+ }
+ Properties = members = null;
+
+ // Normalize the iteration algorithm.
+ if (!size) {
+ // A list of non-enumerable properties inherited from `Object.prototype`.
+ members = ["valueOf", "toString", "toLocaleString", "propertyIsEnumerable", "isPrototypeOf", "hasOwnProperty", "constructor"];
+ // IE <= 8, Mozilla 1.0, and Netscape 6.2 ignore shadowed non-enumerable
+ // properties.
+ forEach = function (object, callback) {
+ var isFunction = getClass.call(object) == functionClass, property, length;
+ var hasProperty = !isFunction && typeof object.constructor != "function" && objectTypes[typeof object.hasOwnProperty] && object.hasOwnProperty || isProperty;
+ for (property in object) {
+ // Gecko <= 1.0 enumerates the `prototype` property of functions under
+ // certain conditions; IE does not.
+ if (!(isFunction && property == "prototype") && hasProperty.call(object, property)) {
+ callback(property);
+ }
+ }
+ // Manually invoke the callback for each non-enumerable property.
+ for (length = members.length; property = members[--length]; hasProperty.call(object, property) && callback(property));
+ };
+ } else if (size == 2) {
+ // Safari <= 2.0.4 enumerates shadowed properties twice.
+ forEach = function (object, callback) {
+ // Create a set of iterated properties.
+ var members = {}, isFunction = getClass.call(object) == functionClass, property;
+ for (property in object) {
+ // Store each property name to prevent double enumeration. The
+ // `prototype` property of functions is not enumerated due to cross-
+ // environment inconsistencies.
+ if (!(isFunction && property == "prototype") && !isProperty.call(members, property) && (members[property] = 1) && isProperty.call(object, property)) {
+ callback(property);
+ }
+ }
+ };
+ } else {
+ // No bugs detected; use the standard `for...in` algorithm.
+ forEach = function (object, callback) {
+ var isFunction = getClass.call(object) == functionClass, property, isConstructor;
+ for (property in object) {
+ if (!(isFunction && property == "prototype") && isProperty.call(object, property) && !(isConstructor = property === "constructor")) {
+ callback(property);
+ }
+ }
+ // Manually invoke the callback for the `constructor` property due to
+ // cross-environment inconsistencies.
+ if (isConstructor || isProperty.call(object, (property = "constructor"))) {
+ callback(property);
+ }
+ };
+ }
+ return forEach(object, callback);
+ };
+
+ // Public: Serializes a JavaScript `value` as a JSON string. The optional
+ // `filter` argument may specify either a function that alters how object and
+ // array members are serialized, or an array of strings and numbers that
+ // indicates which properties should be serialized. The optional `width`
+ // argument may be either a string or number that specifies the indentation
+ // level of the output.
+ if (!has("json-stringify")) {
+ // Internal: A map of control characters and their escaped equivalents.
+ var Escapes = {
+ 92: "\\\\",
+ 34: '\\"',
+ 8: "\\b",
+ 12: "\\f",
+ 10: "\\n",
+ 13: "\\r",
+ 9: "\\t"
+ };
+
+ // Internal: Converts `value` into a zero-padded string such that its
+ // length is at least equal to `width`. The `width` must be <= 6.
+ var leadingZeroes = "000000";
+ var toPaddedString = function (width, value) {
+ // The `|| 0` expression is necessary to work around a bug in
+ // Opera <= 7.54u2 where `0 == -0`, but `String(-0) !== "0"`.
+ return (leadingZeroes + (value || 0)).slice(-width);
+ };
+
+ // Internal: Double-quotes a string `value`, replacing all ASCII control
+ // characters (characters with code unit values between 0 and 31) with
+ // their escaped equivalents. This is an implementation of the
+ // `Quote(value)` operation defined in ES 5.1 section 15.12.3.
+ var unicodePrefix = "\\u00";
+ var quote = function (value) {
+ var result = '"', index = 0, length = value.length, useCharIndex = !charIndexBuggy || length > 10;
+ var symbols = useCharIndex && (charIndexBuggy ? value.split("") : value);
+ for (; index < length; index++) {
+ var charCode = value.charCodeAt(index);
+ // If the character is a control character, append its Unicode or
+ // shorthand escape sequence; otherwise, append the character as-is.
+ switch (charCode) {
+ case 8: case 9: case 10: case 12: case 13: case 34: case 92:
+ result += Escapes[charCode];
+ break;
+ default:
+ if (charCode < 32) {
+ result += unicodePrefix + toPaddedString(2, charCode.toString(16));
+ break;
+ }
+ result += useCharIndex ? symbols[index] : value.charAt(index);
+ }
+ }
+ return result + '"';
+ };
+
+ // Internal: Recursively serializes an object. Implements the
+ // `Str(key, holder)`, `JO(value)`, and `JA(value)` operations.
+ var serialize = function (property, object, callback, properties, whitespace, indentation, stack) {
+ var value, className, year, month, date, time, hours, minutes, seconds, milliseconds, results, element, index, length, prefix, result;
+ try {
+ // Necessary for host object support.
+ value = object[property];
+ } catch (exception) {}
+ if (typeof value == "object" && value) {
+ className = getClass.call(value);
+ if (className == dateClass && !isProperty.call(value, "toJSON")) {
+ if (value > -1 / 0 && value < 1 / 0) {
+ // Dates are serialized according to the `Date#toJSON` method
+ // specified in ES 5.1 section 15.9.5.44. See section 15.9.1.15
+ // for the ISO 8601 date time string format.
+ if (getDay) {
+ // Manually compute the year, month, date, hours, minutes,
+ // seconds, and milliseconds if the `getUTC*` methods are
+ // buggy. Adapted from @Yaffle's `date-shim` project.
+ date = floor(value / 864e5);
+ for (year = floor(date / 365.2425) + 1970 - 1; getDay(year + 1, 0) <= date; year++);
+ for (month = floor((date - getDay(year, 0)) / 30.42); getDay(year, month + 1) <= date; month++);
+ date = 1 + date - getDay(year, month);
+ // The `time` value specifies the time within the day (see ES
+ // 5.1 section 15.9.1.2). The formula `(A % B + B) % B` is used
+ // to compute `A modulo B`, as the `%` operator does not
+ // correspond to the `modulo` operation for negative numbers.
+ time = (value % 864e5 + 864e5) % 864e5;
+ // The hours, minutes, seconds, and milliseconds are obtained by
+ // decomposing the time within the day. See section 15.9.1.10.
+ hours = floor(time / 36e5) % 24;
+ minutes = floor(time / 6e4) % 60;
+ seconds = floor(time / 1e3) % 60;
+ milliseconds = time % 1e3;
+ } else {
+ year = value.getUTCFullYear();
+ month = value.getUTCMonth();
+ date = value.getUTCDate();
+ hours = value.getUTCHours();
+ minutes = value.getUTCMinutes();
+ seconds = value.getUTCSeconds();
+ milliseconds = value.getUTCMilliseconds();
+ }
+ // Serialize extended years correctly.
+ value = (year <= 0 || year >= 1e4 ? (year < 0 ? "-" : "+") + toPaddedString(6, year < 0 ? -year : year) : toPaddedString(4, year)) +
+ "-" + toPaddedString(2, month + 1) + "-" + toPaddedString(2, date) +
+ // Months, dates, hours, minutes, and seconds should have two
+ // digits; milliseconds should have three.
+ "T" + toPaddedString(2, hours) + ":" + toPaddedString(2, minutes) + ":" + toPaddedString(2, seconds) +
+ // Milliseconds are optional in ES 5.0, but required in 5.1.
+ "." + toPaddedString(3, milliseconds) + "Z";
+ } else {
+ value = null;
+ }
+ } else if (typeof value.toJSON == "function" && ((className != numberClass && className != stringClass && className != arrayClass) || isProperty.call(value, "toJSON"))) {
+ // Prototype <= 1.6.1 adds non-standard `toJSON` methods to the
+ // `Number`, `String`, `Date`, and `Array` prototypes. JSON 3
+ // ignores all `toJSON` methods on these objects unless they are
+ // defined directly on an instance.
+ value = value.toJSON(property);
+ }
+ }
+ if (callback) {
+ // If a replacement function was provided, call it to obtain the value
+ // for serialization.
+ value = callback.call(object, property, value);
+ }
+ if (value === null) {
+ return "null";
+ }
+ className = getClass.call(value);
+ if (className == booleanClass) {
+ // Booleans are represented literally.
+ return "" + value;
+ } else if (className == numberClass) {
+ // JSON numbers must be finite. `Infinity` and `NaN` are serialized as
+ // `"null"`.
+ return value > -1 / 0 && value < 1 / 0 ? "" + value : "null";
+ } else if (className == stringClass) {
+ // Strings are double-quoted and escaped.
+ return quote("" + value);
+ }
+ // Recursively serialize objects and arrays.
+ if (typeof value == "object") {
+ // Check for cyclic structures. This is a linear search; performance
+ // is inversely proportional to the number of unique nested objects.
+ for (length = stack.length; length--;) {
+ if (stack[length] === value) {
+ // Cyclic structures cannot be serialized by `JSON.stringify`.
+ throw TypeError();
+ }
+ }
+ // Add the object to the stack of traversed objects.
+ stack.push(value);
+ results = [];
+ // Save the current indentation level and indent one additional level.
+ prefix = indentation;
+ indentation += whitespace;
+ if (className == arrayClass) {
+ // Recursively serialize array elements.
+ for (index = 0, length = value.length; index < length; index++) {
+ element = serialize(index, value, callback, properties, whitespace, indentation, stack);
+ results.push(element === undef ? "null" : element);
+ }
+ result = results.length ? (whitespace ? "[\n" + indentation + results.join(",\n" + indentation) + "\n" + prefix + "]" : ("[" + results.join(",") + "]")) : "[]";
+ } else {
+ // Recursively serialize object members. Members are selected from
+ // either a user-specified list of property names, or the object
+ // itself.
+ forEach(properties || value, function (property) {
+ var element = serialize(property, value, callback, properties, whitespace, indentation, stack);
+ if (element !== undef) {
+ // According to ES 5.1 section 15.12.3: "If `gap` {whitespace}
+ // is not the empty string, let `member` {quote(property) + ":"}
+ // be the concatenation of `member` and the `space` character."
+ // The "`space` character" refers to the literal space
+ // character, not the `space` {width} argument provided to
+ // `JSON.stringify`.
+ results.push(quote(property) + ":" + (whitespace ? " " : "") + element);
+ }
+ });
+ result = results.length ? (whitespace ? "{\n" + indentation + results.join(",\n" + indentation) + "\n" + prefix + "}" : ("{" + results.join(",") + "}")) : "{}";
+ }
+ // Remove the object from the traversed object stack.
+ stack.pop();
+ return result;
+ }
+ };
+
+ // Public: `JSON.stringify`. See ES 5.1 section 15.12.3.
+ exports.stringify = function (source, filter, width) {
+ var whitespace, callback, properties, className;
+ if (objectTypes[typeof filter] && filter) {
+ if ((className = getClass.call(filter)) == functionClass) {
+ callback = filter;
+ } else if (className == arrayClass) {
+ // Convert the property names array into a makeshift set.
+ properties = {};
+ for (var index = 0, length = filter.length, value; index < length; value = filter[index++], ((className = getClass.call(value)), className == stringClass || className == numberClass) && (properties[value] = 1));
+ }
+ }
+ if (width) {
+ if ((className = getClass.call(width)) == numberClass) {
+ // Convert the `width` to an integer and create a string containing
+ // `width` number of space characters.
+ if ((width -= width % 1) > 0) {
+ for (whitespace = "", width > 10 && (width = 10); whitespace.length < width; whitespace += " ");
+ }
+ } else if (className == stringClass) {
+ whitespace = width.length <= 10 ? width : width.slice(0, 10);
+ }
+ }
+ // Opera <= 7.54u2 discards the values associated with empty string keys
+ // (`""`) only if they are used directly within an object member list
+ // (e.g., `!("" in { "": 1})`).
+ return serialize("", (value = {}, value[""] = source, value), callback, properties, whitespace, "", []);
+ };
+ }
+
+ // Public: Parses a JSON source string.
+ if (!has("json-parse")) {
+ var fromCharCode = String.fromCharCode;
+
+ // Internal: A map of escaped control characters and their unescaped
+ // equivalents.
+ var Unescapes = {
+ 92: "\\",
+ 34: '"',
+ 47: "/",
+ 98: "\b",
+ 116: "\t",
+ 110: "\n",
+ 102: "\f",
+ 114: "\r"
+ };
+
+ // Internal: Stores the parser state.
+ var Index, Source;
+
+ // Internal: Resets the parser state and throws a `SyntaxError`.
+ var abort = function () {
+ Index = Source = null;
+ throw SyntaxError();
+ };
+
+ // Internal: Returns the next token, or `"$"` if the parser has reached
+ // the end of the source string. A token may be a string, number, `null`
+ // literal, or Boolean literal.
+ var lex = function () {
+ var source = Source, length = source.length, value, begin, position, isSigned, charCode;
+ while (Index < length) {
+ charCode = source.charCodeAt(Index);
+ switch (charCode) {
+ case 9: case 10: case 13: case 32:
+ // Skip whitespace tokens, including tabs, carriage returns, line
+ // feeds, and space characters.
+ Index++;
+ break;
+ case 123: case 125: case 91: case 93: case 58: case 44:
+ // Parse a punctuator token (`{`, `}`, `[`, `]`, `:`, or `,`) at
+ // the current position.
+ value = charIndexBuggy ? source.charAt(Index) : source[Index];
+ Index++;
+ return value;
+ case 34:
+ // `"` delimits a JSON string; advance to the next character and
+ // begin parsing the string. String tokens are prefixed with the
+ // sentinel `@` character to distinguish them from punctuators and
+ // end-of-string tokens.
+ for (value = "@", Index++; Index < length;) {
+ charCode = source.charCodeAt(Index);
+ if (charCode < 32) {
+ // Unescaped ASCII control characters (those with a code unit
+ // less than the space character) are not permitted.
+ abort();
+ } else if (charCode == 92) {
+ // A reverse solidus (`\`) marks the beginning of an escaped
+ // control character (including `"`, `\`, and `/`) or Unicode
+ // escape sequence.
+ charCode = source.charCodeAt(++Index);
+ switch (charCode) {
+ case 92: case 34: case 47: case 98: case 116: case 110: case 102: case 114:
+ // Revive escaped control characters.
+ value += Unescapes[charCode];
+ Index++;
+ break;
+ case 117:
+ // `\u` marks the beginning of a Unicode escape sequence.
+ // Advance to the first character and validate the
+ // four-digit code point.
+ begin = ++Index;
+ for (position = Index + 4; Index < position; Index++) {
+ charCode = source.charCodeAt(Index);
+ // A valid sequence comprises four hexdigits (case-
+ // insensitive) that form a single hexadecimal value.
+ if (!(charCode >= 48 && charCode <= 57 || charCode >= 97 && charCode <= 102 || charCode >= 65 && charCode <= 70)) {
+ // Invalid Unicode escape sequence.
+ abort();
+ }
+ }
+ // Revive the escaped character.
+ value += fromCharCode("0x" + source.slice(begin, Index));
+ break;
+ default:
+ // Invalid escape sequence.
+ abort();
+ }
+ } else {
+ if (charCode == 34) {
+ // An unescaped double-quote character marks the end of the
+ // string.
+ break;
+ }
+ charCode = source.charCodeAt(Index);
+ begin = Index;
+ // Optimize for the common case where a string is valid.
+ while (charCode >= 32 && charCode != 92 && charCode != 34) {
+ charCode = source.charCodeAt(++Index);
+ }
+ // Append the string as-is.
+ value += source.slice(begin, Index);
+ }
+ }
+ if (source.charCodeAt(Index) == 34) {
+ // Advance to the next character and return the revived string.
+ Index++;
+ return value;
+ }
+ // Unterminated string.
+ abort();
+ default:
+ // Parse numbers and literals.
+ begin = Index;
+ // Advance past the negative sign, if one is specified.
+ if (charCode == 45) {
+ isSigned = true;
+ charCode = source.charCodeAt(++Index);
+ }
+ // Parse an integer or floating-point value.
+ if (charCode >= 48 && charCode <= 57) {
+ // Leading zeroes are interpreted as octal literals.
+ if (charCode == 48 && ((charCode = source.charCodeAt(Index + 1)), charCode >= 48 && charCode <= 57)) {
+ // Illegal octal literal.
+ abort();
+ }
+ isSigned = false;
+ // Parse the integer component.
+ for (; Index < length && ((charCode = source.charCodeAt(Index)), charCode >= 48 && charCode <= 57); Index++);
+ // Floats cannot contain a leading decimal point; however, this
+ // case is already accounted for by the parser.
+ if (source.charCodeAt(Index) == 46) {
+ position = ++Index;
+ // Parse the decimal component.
+ for (; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++);
+ if (position == Index) {
+ // Illegal trailing decimal.
+ abort();
+ }
+ Index = position;
+ }
+ // Parse exponents. The `e` denoting the exponent is
+ // case-insensitive.
+ charCode = source.charCodeAt(Index);
+ if (charCode == 101 || charCode == 69) {
+ charCode = source.charCodeAt(++Index);
+ // Skip past the sign following the exponent, if one is
+ // specified.
+ if (charCode == 43 || charCode == 45) {
+ Index++;
+ }
+ // Parse the exponential component.
+ for (position = Index; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++);
+ if (position == Index) {
+ // Illegal empty exponent.
+ abort();
+ }
+ Index = position;
+ }
+ // Coerce the parsed value to a JavaScript number.
+ return +source.slice(begin, Index);
+ }
+ // A negative sign may only precede numbers.
+ if (isSigned) {
+ abort();
+ }
+ // `true`, `false`, and `null` literals.
+ if (source.slice(Index, Index + 4) == "true") {
+ Index += 4;
+ return true;
+ } else if (source.slice(Index, Index + 5) == "false") {
+ Index += 5;
+ return false;
+ } else if (source.slice(Index, Index + 4) == "null") {
+ Index += 4;
+ return null;
+ }
+ // Unrecognized token.
+ abort();
+ }
+ }
+ // Return the sentinel `$` character if the parser has reached the end
+ // of the source string.
+ return "$";
+ };
+
+ // Internal: Parses a JSON `value` token.
+ var get = function (value) {
+ var results, hasMembers;
+ if (value == "$") {
+ // Unexpected end of input.
+ abort();
+ }
+ if (typeof value == "string") {
+ if ((charIndexBuggy ? value.charAt(0) : value[0]) == "@") {
+ // Remove the sentinel `@` character.
+ return value.slice(1);
+ }
+ // Parse object and array literals.
+ if (value == "[") {
+ // Parses a JSON array, returning a new JavaScript array.
+ results = [];
+ for (;; hasMembers || (hasMembers = true)) {
+ value = lex();
+ // A closing square bracket marks the end of the array literal.
+ if (value == "]") {
+ break;
+ }
+ // If the array literal contains elements, the current token
+ // should be a comma separating the previous element from the
+ // next.
+ if (hasMembers) {
+ if (value == ",") {
+ value = lex();
+ if (value == "]") {
+ // Unexpected trailing `,` in array literal.
+ abort();
+ }
+ } else {
+ // A `,` must separate each array element.
+ abort();
+ }
+ }
+ // Elisions and leading commas are not permitted.
+ if (value == ",") {
+ abort();
+ }
+ results.push(get(value));
+ }
+ return results;
+ } else if (value == "{") {
+ // Parses a JSON object, returning a new JavaScript object.
+ results = {};
+ for (;; hasMembers || (hasMembers = true)) {
+ value = lex();
+ // A closing curly brace marks the end of the object literal.
+ if (value == "}") {
+ break;
+ }
+ // If the object literal contains members, the current token
+ // should be a comma separator.
+ if (hasMembers) {
+ if (value == ",") {
+ value = lex();
+ if (value == "}") {
+ // Unexpected trailing `,` in object literal.
+ abort();
+ }
+ } else {
+ // A `,` must separate each object member.
+ abort();
+ }
+ }
+ // Leading commas are not permitted, object property names must be
+ // double-quoted strings, and a `:` must separate each property
+ // name and value.
+ if (value == "," || typeof value != "string" || (charIndexBuggy ? value.charAt(0) : value[0]) != "@" || lex() != ":") {
+ abort();
+ }
+ results[value.slice(1)] = get(lex());
+ }
+ return results;
+ }
+ // Unexpected token encountered.
+ abort();
+ }
+ return value;
+ };
+
+ // Internal: Updates a traversed object member.
+ var update = function (source, property, callback) {
+ var element = walk(source, property, callback);
+ if (element === undef) {
+ delete source[property];
+ } else {
+ source[property] = element;
+ }
+ };
+
+ // Internal: Recursively traverses a parsed JSON object, invoking the
+ // `callback` function for each value. This is an implementation of the
+ // `Walk(holder, name)` operation defined in ES 5.1 section 15.12.2.
+ var walk = function (source, property, callback) {
+ var value = source[property], length;
+ if (typeof value == "object" && value) {
+ // `forEach` can't be used to traverse an array in Opera <= 8.54
+ // because its `Object#hasOwnProperty` implementation returns `false`
+ // for array indices (e.g., `![1, 2, 3].hasOwnProperty("0")`).
+ if (getClass.call(value) == arrayClass) {
+ for (length = value.length; length--;) {
+ update(value, length, callback);
+ }
+ } else {
+ forEach(value, function (property) {
+ update(value, property, callback);
+ });
+ }
+ }
+ return callback.call(source, property, value);
+ };
+
+ // Public: `JSON.parse`. See ES 5.1 section 15.12.2.
+ exports.parse = function (source, callback) {
+ var result, value;
+ Index = 0;
+ Source = "" + source;
+ result = get(lex());
+ // If a JSON string contains multiple tokens, it is invalid.
+ if (lex() != "$") {
+ abort();
+ }
+ // Reset the parser state.
+ Index = Source = null;
+ return callback && getClass.call(callback) == functionClass ? walk((value = {}, value[""] = result, value), "", callback) : result;
+ };
+ }
+ }
+
+ exports["runInContext"] = runInContext;
+ return exports;
+ }
+
+ if (freeExports && !isLoader) {
+ // Export for CommonJS environments.
+ runInContext(root, freeExports);
+ } else {
+ // Export for web browsers and JavaScript engines.
+ var nativeJSON = root.JSON,
+ previousJSON = root["JSON3"],
+ isRestored = false;
+
+ var JSON3 = runInContext(root, (root["JSON3"] = {
+ // Public: Restores the original value of the global `JSON` object and
+ // returns a reference to the `JSON3` object.
+ "noConflict": function () {
+ if (!isRestored) {
+ isRestored = true;
+ root.JSON = nativeJSON;
+ root["JSON3"] = previousJSON;
+ nativeJSON = previousJSON = null;
+ }
+ return JSON3;
+ }
+ }));
+
+ root.JSON = {
+ "parse": JSON3.parse,
+ "stringify": JSON3.stringify
+ };
+ }
+
+ // Export for asynchronous module loaders.
+ if (isLoader) {
+ define(function () {
+ return JSON3;
+ });
+ }
+}).call(this);
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],70:[function(require,module,exports){
+/**
+ * lodash 3.2.0 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+var baseCopy = require('lodash._basecopy'),
+ keys = require('lodash.keys');
+
+/**
+ * The base implementation of `_.assign` without support for argument juggling,
+ * multiple sources, and `customizer` functions.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @returns {Object} Returns `object`.
+ */
+function baseAssign(object, source) {
+ return source == null
+ ? object
+ : baseCopy(source, keys(source), object);
+}
+
+module.exports = baseAssign;
+
+},{"lodash._basecopy":71,"lodash.keys":78}],71:[function(require,module,exports){
+/**
+ * lodash 3.0.1 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+
+/**
+ * Copies properties of `source` to `object`.
+ *
+ * @private
+ * @param {Object} source The object to copy properties from.
+ * @param {Array} props The property names to copy.
+ * @param {Object} [object={}] The object to copy properties to.
+ * @returns {Object} Returns `object`.
+ */
+function baseCopy(source, props, object) {
+ object || (object = {});
+
+ var index = -1,
+ length = props.length;
+
+ while (++index < length) {
+ var key = props[index];
+ object[key] = source[key];
+ }
+ return object;
+}
+
+module.exports = baseCopy;
+
+},{}],72:[function(require,module,exports){
+/**
+ * lodash 3.0.3 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+
+/**
+ * The base implementation of `_.create` without support for assigning
+ * properties to the created object.
+ *
+ * @private
+ * @param {Object} prototype The object to inherit from.
+ * @returns {Object} Returns the new object.
+ */
+var baseCreate = (function() {
+ function object() {}
+ return function(prototype) {
+ if (isObject(prototype)) {
+ object.prototype = prototype;
+ var result = new object;
+ object.prototype = undefined;
+ }
+ return result || {};
+ };
+}());
+
+/**
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
+ * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(1);
+ * // => false
+ */
+function isObject(value) {
+ // Avoid a V8 JIT bug in Chrome 19-20.
+ // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
+ var type = typeof value;
+ return !!value && (type == 'object' || type == 'function');
+}
+
+module.exports = baseCreate;
+
+},{}],73:[function(require,module,exports){
+/**
+ * lodash 3.9.1 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+
+/** `Object#toString` result references. */
+var funcTag = '[object Function]';
+
+/** Used to detect host constructors (Safari > 5). */
+var reIsHostCtor = /^\[object .+?Constructor\]$/;
+
+/**
+ * Checks if `value` is object-like.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ */
+function isObjectLike(value) {
+ return !!value && typeof value == 'object';
+}
+
+/** Used for native method references. */
+var objectProto = Object.prototype;
+
+/** Used to resolve the decompiled source of functions. */
+var fnToString = Function.prototype.toString;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var objToString = objectProto.toString;
+
+/** Used to detect if a method is native. */
+var reIsNative = RegExp('^' +
+ fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
+ .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
+);
+
+/**
+ * Gets the native function at `key` of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {string} key The key of the method to get.
+ * @returns {*} Returns the function if it's native, else `undefined`.
+ */
+function getNative(object, key) {
+ var value = object == null ? undefined : object[key];
+ return isNative(value) ? value : undefined;
+}
+
+/**
+ * Checks if `value` is classified as a `Function` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isFunction(_);
+ * // => true
+ *
+ * _.isFunction(/abc/);
+ * // => false
+ */
+function isFunction(value) {
+ // The use of `Object#toString` avoids issues with the `typeof` operator
+ // in older versions of Chrome and Safari which return 'function' for regexes
+ // and Safari 8 equivalents which return 'object' for typed array constructors.
+ return isObject(value) && objToString.call(value) == funcTag;
+}
+
+/**
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
+ * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(1);
+ * // => false
+ */
+function isObject(value) {
+ // Avoid a V8 JIT bug in Chrome 19-20.
+ // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
+ var type = typeof value;
+ return !!value && (type == 'object' || type == 'function');
+}
+
+/**
+ * Checks if `value` is a native function.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
+ * @example
+ *
+ * _.isNative(Array.prototype.push);
+ * // => true
+ *
+ * _.isNative(_);
+ * // => false
+ */
+function isNative(value) {
+ if (value == null) {
+ return false;
+ }
+ if (isFunction(value)) {
+ return reIsNative.test(fnToString.call(value));
+ }
+ return isObjectLike(value) && reIsHostCtor.test(value);
+}
+
+module.exports = getNative;
+
+},{}],74:[function(require,module,exports){
+/**
+ * lodash 3.0.9 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+
+/** Used to detect unsigned integer values. */
+var reIsUint = /^\d+$/;
+
+/**
+ * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)
+ * of an array-like value.
+ */
+var MAX_SAFE_INTEGER = 9007199254740991;
+
+/**
+ * The base implementation of `_.property` without support for deep paths.
+ *
+ * @private
+ * @param {string} key The key of the property to get.
+ * @returns {Function} Returns the new function.
+ */
+function baseProperty(key) {
+ return function(object) {
+ return object == null ? undefined : object[key];
+ };
+}
+
+/**
+ * Gets the "length" property value of `object`.
+ *
+ * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
+ * that affects Safari on at least iOS 8.1-8.3 ARM64.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {*} Returns the "length" value.
+ */
+var getLength = baseProperty('length');
+
+/**
+ * Checks if `value` is array-like.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
+ */
+function isArrayLike(value) {
+ return value != null && isLength(getLength(value));
+}
+
+/**
+ * Checks if `value` is a valid array-like index.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
+ * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
+ */
+function isIndex(value, length) {
+ value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
+ length = length == null ? MAX_SAFE_INTEGER : length;
+ return value > -1 && value % 1 == 0 && value < length;
+}
+
+/**
+ * Checks if the provided arguments are from an iteratee call.
+ *
+ * @private
+ * @param {*} value The potential iteratee value argument.
+ * @param {*} index The potential iteratee index or key argument.
+ * @param {*} object The potential iteratee object argument.
+ * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.
+ */
+function isIterateeCall(value, index, object) {
+ if (!isObject(object)) {
+ return false;
+ }
+ var type = typeof index;
+ if (type == 'number'
+ ? (isArrayLike(object) && isIndex(index, object.length))
+ : (type == 'string' && index in object)) {
+ var other = object[index];
+ return value === value ? (value === other) : (other !== other);
+ }
+ return false;
+}
+
+/**
+ * Checks if `value` is a valid array-like length.
+ *
+ * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength).
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+ */
+function isLength(value) {
+ return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+}
+
+/**
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
+ * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(1);
+ * // => false
+ */
+function isObject(value) {
+ // Avoid a V8 JIT bug in Chrome 19-20.
+ // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
+ var type = typeof value;
+ return !!value && (type == 'object' || type == 'function');
+}
+
+module.exports = isIterateeCall;
+
+},{}],75:[function(require,module,exports){
+/**
+ * lodash 3.1.1 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+var baseAssign = require('lodash._baseassign'),
+ baseCreate = require('lodash._basecreate'),
+ isIterateeCall = require('lodash._isiterateecall');
+
+/**
+ * Creates an object that inherits from the given `prototype` object. If a
+ * `properties` object is provided its own enumerable properties are assigned
+ * to the created object.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} prototype The object to inherit from.
+ * @param {Object} [properties] The properties to assign to the object.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * function Shape() {
+ * this.x = 0;
+ * this.y = 0;
+ * }
+ *
+ * function Circle() {
+ * Shape.call(this);
+ * }
+ *
+ * Circle.prototype = _.create(Shape.prototype, {
+ * 'constructor': Circle
+ * });
+ *
+ * var circle = new Circle;
+ * circle instanceof Circle;
+ * // => true
+ *
+ * circle instanceof Shape;
+ * // => true
+ */
+function create(prototype, properties, guard) {
+ var result = baseCreate(prototype);
+ if (guard && isIterateeCall(prototype, properties, guard)) {
+ properties = undefined;
+ }
+ return properties ? baseAssign(result, properties) : result;
+}
+
+module.exports = create;
+
+},{"lodash._baseassign":70,"lodash._basecreate":72,"lodash._isiterateecall":74}],76:[function(require,module,exports){
+/**
+ * lodash (Custom Build) <https://lodash.com/>
+ * Build: `lodash modularize exports="npm" -o ./`
+ * Copyright jQuery Foundation and other contributors <https://jquery.org/>
+ * Released under MIT license <https://lodash.com/license>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ */
+
+/** Used as references for various `Number` constants. */
+var MAX_SAFE_INTEGER = 9007199254740991;
+
+/** `Object#toString` result references. */
+var argsTag = '[object Arguments]',
+ funcTag = '[object Function]',
+ genTag = '[object GeneratorFunction]';
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var objectToString = objectProto.toString;
+
+/** Built-in value references. */
+var propertyIsEnumerable = objectProto.propertyIsEnumerable;
+
+/**
+ * Checks if `value` is likely an `arguments` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an `arguments` object,
+ * else `false`.
+ * @example
+ *
+ * _.isArguments(function() { return arguments; }());
+ * // => true
+ *
+ * _.isArguments([1, 2, 3]);
+ * // => false
+ */
+function isArguments(value) {
+ // Safari 8.1 makes `arguments.callee` enumerable in strict mode.
+ return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&
+ (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);
+}
+
+/**
+ * Checks if `value` is array-like. A value is considered array-like if it's
+ * not a function and has a `value.length` that's an integer greater than or
+ * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
+ * @example
+ *
+ * _.isArrayLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLike(document.body.children);
+ * // => true
+ *
+ * _.isArrayLike('abc');
+ * // => true
+ *
+ * _.isArrayLike(_.noop);
+ * // => false
+ */
+function isArrayLike(value) {
+ return value != null && isLength(value.length) && !isFunction(value);
+}
+
+/**
+ * This method is like `_.isArrayLike` except that it also checks if `value`
+ * is an object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array-like object,
+ * else `false`.
+ * @example
+ *
+ * _.isArrayLikeObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLikeObject(document.body.children);
+ * // => true
+ *
+ * _.isArrayLikeObject('abc');
+ * // => false
+ *
+ * _.isArrayLikeObject(_.noop);
+ * // => false
+ */
+function isArrayLikeObject(value) {
+ return isObjectLike(value) && isArrayLike(value);
+}
+
+/**
+ * Checks if `value` is classified as a `Function` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a function, else `false`.
+ * @example
+ *
+ * _.isFunction(_);
+ * // => true
+ *
+ * _.isFunction(/abc/);
+ * // => false
+ */
+function isFunction(value) {
+ // The use of `Object#toString` avoids issues with the `typeof` operator
+ // in Safari 8-9 which returns 'object' for typed array and other constructors.
+ var tag = isObject(value) ? objectToString.call(value) : '';
+ return tag == funcTag || tag == genTag;
+}
+
+/**
+ * Checks if `value` is a valid array-like length.
+ *
+ * **Note:** This method is loosely based on
+ * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+ * @example
+ *
+ * _.isLength(3);
+ * // => true
+ *
+ * _.isLength(Number.MIN_VALUE);
+ * // => false
+ *
+ * _.isLength(Infinity);
+ * // => false
+ *
+ * _.isLength('3');
+ * // => false
+ */
+function isLength(value) {
+ return typeof value == 'number' &&
+ value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+}
+
+/**
+ * Checks if `value` is the
+ * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
+ * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(_.noop);
+ * // => true
+ *
+ * _.isObject(null);
+ * // => false
+ */
+function isObject(value) {
+ var type = typeof value;
+ return !!value && (type == 'object' || type == 'function');
+}
+
+/**
+ * Checks if `value` is object-like. A value is object-like if it's not `null`
+ * and has a `typeof` result of "object".
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ * @example
+ *
+ * _.isObjectLike({});
+ * // => true
+ *
+ * _.isObjectLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isObjectLike(_.noop);
+ * // => false
+ *
+ * _.isObjectLike(null);
+ * // => false
+ */
+function isObjectLike(value) {
+ return !!value && typeof value == 'object';
+}
+
+module.exports = isArguments;
+
+},{}],77:[function(require,module,exports){
+/**
+ * lodash 3.0.4 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+
+/** `Object#toString` result references. */
+var arrayTag = '[object Array]',
+ funcTag = '[object Function]';
+
+/** Used to detect host constructors (Safari > 5). */
+var reIsHostCtor = /^\[object .+?Constructor\]$/;
+
+/**
+ * Checks if `value` is object-like.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ */
+function isObjectLike(value) {
+ return !!value && typeof value == 'object';
+}
+
+/** Used for native method references. */
+var objectProto = Object.prototype;
+
+/** Used to resolve the decompiled source of functions. */
+var fnToString = Function.prototype.toString;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var objToString = objectProto.toString;
+
+/** Used to detect if a method is native. */
+var reIsNative = RegExp('^' +
+ fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
+ .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
+);
+
+/* Native method references for those with the same name as other `lodash` methods. */
+var nativeIsArray = getNative(Array, 'isArray');
+
+/**
+ * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
+ * of an array-like value.
+ */
+var MAX_SAFE_INTEGER = 9007199254740991;
+
+/**
+ * Gets the native function at `key` of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {string} key The key of the method to get.
+ * @returns {*} Returns the function if it's native, else `undefined`.
+ */
+function getNative(object, key) {
+ var value = object == null ? undefined : object[key];
+ return isNative(value) ? value : undefined;
+}
+
+/**
+ * Checks if `value` is a valid array-like length.
+ *
+ * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+ */
+function isLength(value) {
+ return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+}
+
+/**
+ * Checks if `value` is classified as an `Array` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isArray([1, 2, 3]);
+ * // => true
+ *
+ * _.isArray(function() { return arguments; }());
+ * // => false
+ */
+var isArray = nativeIsArray || function(value) {
+ return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;
+};
+
+/**
+ * Checks if `value` is classified as a `Function` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isFunction(_);
+ * // => true
+ *
+ * _.isFunction(/abc/);
+ * // => false
+ */
+function isFunction(value) {
+ // The use of `Object#toString` avoids issues with the `typeof` operator
+ // in older versions of Chrome and Safari which return 'function' for regexes
+ // and Safari 8 equivalents which return 'object' for typed array constructors.
+ return isObject(value) && objToString.call(value) == funcTag;
+}
+
+/**
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
+ * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(1);
+ * // => false
+ */
+function isObject(value) {
+ // Avoid a V8 JIT bug in Chrome 19-20.
+ // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
+ var type = typeof value;
+ return !!value && (type == 'object' || type == 'function');
+}
+
+/**
+ * Checks if `value` is a native function.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
+ * @example
+ *
+ * _.isNative(Array.prototype.push);
+ * // => true
+ *
+ * _.isNative(_);
+ * // => false
+ */
+function isNative(value) {
+ if (value == null) {
+ return false;
+ }
+ if (isFunction(value)) {
+ return reIsNative.test(fnToString.call(value));
+ }
+ return isObjectLike(value) && reIsHostCtor.test(value);
+}
+
+module.exports = isArray;
+
+},{}],78:[function(require,module,exports){
+/**
+ * lodash 3.1.2 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+var getNative = require('lodash._getnative'),
+ isArguments = require('lodash.isarguments'),
+ isArray = require('lodash.isarray');
+
+/** Used to detect unsigned integer values. */
+var reIsUint = /^\d+$/;
+
+/** Used for native method references. */
+var objectProto = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/* Native method references for those with the same name as other `lodash` methods. */
+var nativeKeys = getNative(Object, 'keys');
+
+/**
+ * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
+ * of an array-like value.
+ */
+var MAX_SAFE_INTEGER = 9007199254740991;
+
+/**
+ * The base implementation of `_.property` without support for deep paths.
+ *
+ * @private
+ * @param {string} key The key of the property to get.
+ * @returns {Function} Returns the new function.
+ */
+function baseProperty(key) {
+ return function(object) {
+ return object == null ? undefined : object[key];
+ };
+}
+
+/**
+ * Gets the "length" property value of `object`.
+ *
+ * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
+ * that affects Safari on at least iOS 8.1-8.3 ARM64.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {*} Returns the "length" value.
+ */
+var getLength = baseProperty('length');
+
+/**
+ * Checks if `value` is array-like.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
+ */
+function isArrayLike(value) {
+ return value != null && isLength(getLength(value));
+}
+
+/**
+ * Checks if `value` is a valid array-like index.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
+ * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
+ */
+function isIndex(value, length) {
+ value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
+ length = length == null ? MAX_SAFE_INTEGER : length;
+ return value > -1 && value % 1 == 0 && value < length;
+}
+
+/**
+ * Checks if `value` is a valid array-like length.
+ *
+ * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+ */
+function isLength(value) {
+ return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+}
+
+/**
+ * A fallback implementation of `Object.keys` which creates an array of the
+ * own enumerable property names of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ */
+function shimKeys(object) {
+ var props = keysIn(object),
+ propsLength = props.length,
+ length = propsLength && object.length;
+
+ var allowIndexes = !!length && isLength(length) &&
+ (isArray(object) || isArguments(object));
+
+ var index = -1,
+ result = [];
+
+ while (++index < propsLength) {
+ var key = props[index];
+ if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {
+ result.push(key);
+ }
+ }
+ return result;
+}
+
+/**
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
+ * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(1);
+ * // => false
+ */
+function isObject(value) {
+ // Avoid a V8 JIT bug in Chrome 19-20.
+ // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
+ var type = typeof value;
+ return !!value && (type == 'object' || type == 'function');
+}
+
+/**
+ * Creates an array of the own enumerable property names of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects. See the
+ * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)
+ * for more details.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.keys(new Foo);
+ * // => ['a', 'b'] (iteration order is not guaranteed)
+ *
+ * _.keys('hi');
+ * // => ['0', '1']
+ */
+var keys = !nativeKeys ? shimKeys : function(object) {
+ var Ctor = object == null ? undefined : object.constructor;
+ if ((typeof Ctor == 'function' && Ctor.prototype === object) ||
+ (typeof object != 'function' && isArrayLike(object))) {
+ return shimKeys(object);
+ }
+ return isObject(object) ? nativeKeys(object) : [];
+};
+
+/**
+ * Creates an array of the own and inherited enumerable property names of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.keysIn(new Foo);
+ * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
+ */
+function keysIn(object) {
+ if (object == null) {
+ return [];
+ }
+ if (!isObject(object)) {
+ object = Object(object);
+ }
+ var length = object.length;
+ length = (length && isLength(length) &&
+ (isArray(object) || isArguments(object)) && length) || 0;
+
+ var Ctor = object.constructor,
+ index = -1,
+ isProto = typeof Ctor == 'function' && Ctor.prototype === object,
+ result = Array(length),
+ skipIndexes = length > 0;
+
+ while (++index < length) {
+ result[index] = (index + '');
+ }
+ for (var key in object) {
+ if (!(skipIndexes && isIndex(key, length)) &&
+ !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
+ result.push(key);
+ }
+ }
+ return result;
+}
+
+module.exports = keys;
+
+},{"lodash._getnative":73,"lodash.isarguments":76,"lodash.isarray":77}],79:[function(require,module,exports){
+(function (process){
+var path = require('path');
+var fs = require('fs');
+var _0777 = parseInt('0777', 8);
+
+module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP;
+
+function mkdirP (p, opts, f, made) {
+ if (typeof opts === 'function') {
+ f = opts;
+ opts = {};
+ }
+ else if (!opts || typeof opts !== 'object') {
+ opts = { mode: opts };
+ }
+
+ var mode = opts.mode;
+ var xfs = opts.fs || fs;
+
+ if (mode === undefined) {
+ mode = _0777 & (~process.umask());
+ }
+ if (!made) made = null;
+
+ var cb = f || function () {};
+ p = path.resolve(p);
+
+ xfs.mkdir(p, mode, function (er) {
+ if (!er) {
+ made = made || p;
+ return cb(null, made);
+ }
+ switch (er.code) {
+ case 'ENOENT':
+ mkdirP(path.dirname(p), opts, function (er, made) {
+ if (er) cb(er, made);
+ else mkdirP(p, opts, cb, made);
+ });
+ break;
+
+ // In the case of any other error, just see if there's a dir
+ // there already. If so, then hooray! If not, then something
+ // is borked.
+ default:
+ xfs.stat(p, function (er2, stat) {
+ // if the stat fails, then that's super weird.
+ // let the original error be the failure reason.
+ if (er2 || !stat.isDirectory()) cb(er, made)
+ else cb(null, made);
+ });
+ break;
+ }
+ });
+}
+
+mkdirP.sync = function sync (p, opts, made) {
+ if (!opts || typeof opts !== 'object') {
+ opts = { mode: opts };
+ }
+
+ var mode = opts.mode;
+ var xfs = opts.fs || fs;
+
+ if (mode === undefined) {
+ mode = _0777 & (~process.umask());
+ }
+ if (!made) made = null;
+
+ p = path.resolve(p);
+
+ try {
+ xfs.mkdirSync(p, mode);
+ made = made || p;
+ }
+ catch (err0) {
+ switch (err0.code) {
+ case 'ENOENT' :
+ made = sync(path.dirname(p), opts, made);
+ sync(p, opts, made);
+ break;
+
+ // In the case of any other error, just see if there's a dir
+ // there already. If so, then hooray! If not, then something
+ // is borked.
+ default:
+ var stat;
+ try {
+ stat = xfs.statSync(p);
+ }
+ catch (err1) {
+ throw err0;
+ }
+ if (!stat.isDirectory()) throw err0;
+ break;
+ }
+ }
+
+ return made;
+};
+
+}).call(this,require('_process'))
+},{"_process":82,"fs":42,"path":42}],80:[function(require,module,exports){
+exports.endianness = function () { return 'LE' };
+
+exports.hostname = function () {
+ if (typeof location !== 'undefined') {
+ return location.hostname
+ }
+ else return '';
+};
+
+exports.loadavg = function () { return [] };
+
+exports.uptime = function () { return 0 };
+
+exports.freemem = function () {
+ return Number.MAX_VALUE;
+};
+
+exports.totalmem = function () {
+ return Number.MAX_VALUE;
+};
+
+exports.cpus = function () { return [] };
+
+exports.type = function () { return 'Browser' };
+
+exports.release = function () {
+ if (typeof navigator !== 'undefined') {
+ return navigator.appVersion;
+ }
+ return '';
+};
+
+exports.networkInterfaces
+= exports.getNetworkInterfaces
+= function () { return {} };
+
+exports.arch = function () { return 'javascript' };
+
+exports.platform = function () { return 'browser' };
+
+exports.tmpdir = exports.tmpDir = function () {
+ return '/tmp';
+};
+
+exports.EOL = '\n';
+
+},{}],81:[function(require,module,exports){
+(function (process){
+'use strict';
+
+if (!process.version ||
+ process.version.indexOf('v0.') === 0 ||
+ process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
+ module.exports = nextTick;
+} else {
+ module.exports = process.nextTick;
+}
+
+function nextTick(fn, arg1, arg2, arg3) {
+ if (typeof fn !== 'function') {
+ throw new TypeError('"callback" argument must be a function');
+ }
+ var len = arguments.length;
+ var args, i;
+ switch (len) {
+ case 0:
+ case 1:
+ return process.nextTick(fn);
+ case 2:
+ return process.nextTick(function afterTickOne() {
+ fn.call(null, arg1);
+ });
+ case 3:
+ return process.nextTick(function afterTickTwo() {
+ fn.call(null, arg1, arg2);
+ });
+ case 4:
+ return process.nextTick(function afterTickThree() {
+ fn.call(null, arg1, arg2, arg3);
+ });
+ default:
+ args = new Array(len - 1);
+ i = 0;
+ while (i < args.length) {
+ args[i++] = arguments[i];
+ }
+ return process.nextTick(function afterTick() {
+ fn.apply(null, args);
+ });
+ }
+}
+
+}).call(this,require('_process'))
+},{"_process":82}],82:[function(require,module,exports){
+// shim for using process in browser
+var process = module.exports = {};
+
+// cached from whatever global is present so that test runners that stub it
+// don't break things. But we need to wrap it in a try catch in case it is
+// wrapped in strict mode code which doesn't define any globals. It's inside a
+// function because try/catches deoptimize in certain engines.
+
+var cachedSetTimeout;
+var cachedClearTimeout;
+
+function defaultSetTimout() {
+ throw new Error('setTimeout has not been defined');
+}
+function defaultClearTimeout () {
+ throw new Error('clearTimeout has not been defined');
+}
+(function () {
+ try {
+ if (typeof setTimeout === 'function') {
+ cachedSetTimeout = setTimeout;
+ } else {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ } catch (e) {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ try {
+ if (typeof clearTimeout === 'function') {
+ cachedClearTimeout = clearTimeout;
+ } else {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+ } catch (e) {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+} ())
+function runTimeout(fun) {
+ if (cachedSetTimeout === setTimeout) {
+ //normal enviroments in sane situations
+ return setTimeout(fun, 0);
+ }
+ // if setTimeout wasn't available but was latter defined
+ if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+ cachedSetTimeout = setTimeout;
+ return setTimeout(fun, 0);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedSetTimeout(fun, 0);
+ } catch(e){
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedSetTimeout.call(null, fun, 0);
+ } catch(e){
+ // 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
+ return cachedSetTimeout.call(this, fun, 0);
+ }
+ }
+
+
+}
+function runClearTimeout(marker) {
+ if (cachedClearTimeout === clearTimeout) {
+ //normal enviroments in sane situations
+ return clearTimeout(marker);
+ }
+ // if clearTimeout wasn't available but was latter defined
+ if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+ cachedClearTimeout = clearTimeout;
+ return clearTimeout(marker);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedClearTimeout(marker);
+ } catch (e){
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedClearTimeout.call(null, marker);
+ } catch (e){
+ // 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.
+ // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+ return cachedClearTimeout.call(this, marker);
+ }
+ }
+
+
+
+}
+var queue = [];
+var draining = false;
+var currentQueue;
+var queueIndex = -1;
+
+function cleanUpNextTick() {
+ if (!draining || !currentQueue) {
+ return;
+ }
+ draining = false;
+ if (currentQueue.length) {
+ queue = currentQueue.concat(queue);
+ } else {
+ queueIndex = -1;
+ }
+ if (queue.length) {
+ drainQueue();
+ }
+}
+
+function drainQueue() {
+ if (draining) {
+ return;
+ }
+ var timeout = runTimeout(cleanUpNextTick);
+ draining = true;
+
+ var len = queue.length;
+ while(len) {
+ currentQueue = queue;
+ queue = [];
+ while (++queueIndex < len) {
+ if (currentQueue) {
+ currentQueue[queueIndex].run();
+ }
+ }
+ queueIndex = -1;
+ len = queue.length;
+ }
+ currentQueue = null;
+ draining = false;
+ runClearTimeout(timeout);
+}
+
+process.nextTick = function (fun) {
+ var args = new Array(arguments.length - 1);
+ if (arguments.length > 1) {
+ for (var i = 1; i < arguments.length; i++) {
+ args[i - 1] = arguments[i];
+ }
+ }
+ queue.push(new Item(fun, args));
+ if (queue.length === 1 && !draining) {
+ runTimeout(drainQueue);
+ }
+};
+
+// v8 likes predictible objects
+function Item(fun, array) {
+ this.fun = fun;
+ this.array = array;
+}
+Item.prototype.run = function () {
+ this.fun.apply(null, this.array);
+};
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+process.version = ''; // empty string to avoid regexp issues
+process.versions = {};
+
+function noop() {}
+
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+process.prependListener = noop;
+process.prependOnceListener = noop;
+
+process.listeners = function (name) { return [] }
+
+process.binding = function (name) {
+ throw new Error('process.binding is not supported');
+};
+
+process.cwd = function () { return '/' };
+process.chdir = function (dir) {
+ throw new Error('process.chdir is not supported');
+};
+process.umask = function() { return 0; };
+
+},{}],83:[function(require,module,exports){
+module.exports = require('./lib/_stream_duplex.js');
+
+},{"./lib/_stream_duplex.js":84}],84:[function(require,module,exports){
+// a duplex stream is just a stream that is both readable and writable.
+// Since JS doesn't have multiple prototypal inheritance, this class
+// prototypally inherits from Readable, and then parasitically from
+// Writable.
+
+'use strict';
+
+/*<replacement>*/
+
+var objectKeys = Object.keys || function (obj) {
+ var keys = [];
+ for (var key in obj) {
+ keys.push(key);
+ }return keys;
+};
+/*</replacement>*/
+
+module.exports = Duplex;
+
+/*<replacement>*/
+var processNextTick = require('process-nextick-args');
+/*</replacement>*/
+
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+
+var Readable = require('./_stream_readable');
+var Writable = require('./_stream_writable');
+
+util.inherits(Duplex, Readable);
+
+var keys = objectKeys(Writable.prototype);
+for (var v = 0; v < keys.length; v++) {
+ var method = keys[v];
+ if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
+}
+
+function Duplex(options) {
+ if (!(this instanceof Duplex)) return new Duplex(options);
+
+ Readable.call(this, options);
+ Writable.call(this, options);
+
+ if (options && options.readable === false) this.readable = false;
+
+ if (options && options.writable === false) this.writable = false;
+
+ this.allowHalfOpen = true;
+ if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;
+
+ this.once('end', onend);
+}
+
+// the no-half-open enforcer
+function onend() {
+ // if we allow half-open state, or if the writable side ended,
+ // then we're ok.
+ if (this.allowHalfOpen || this._writableState.ended) return;
+
+ // no more data can be written.
+ // But allow more writes to happen in this tick.
+ processNextTick(onEndNT, this);
+}
+
+function onEndNT(self) {
+ self.end();
+}
+
+function forEach(xs, f) {
+ for (var i = 0, l = xs.length; i < l; i++) {
+ f(xs[i], i);
+ }
+}
+},{"./_stream_readable":86,"./_stream_writable":88,"core-util-is":44,"inherits":66,"process-nextick-args":81}],85:[function(require,module,exports){
+// a passthrough stream.
+// basically just the most minimal sort of Transform stream.
+// Every written chunk gets output as-is.
+
+'use strict';
+
+module.exports = PassThrough;
+
+var Transform = require('./_stream_transform');
+
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+
+util.inherits(PassThrough, Transform);
+
+function PassThrough(options) {
+ if (!(this instanceof PassThrough)) return new PassThrough(options);
+
+ Transform.call(this, options);
+}
+
+PassThrough.prototype._transform = function (chunk, encoding, cb) {
+ cb(null, chunk);
+};
+},{"./_stream_transform":87,"core-util-is":44,"inherits":66}],86:[function(require,module,exports){
+(function (process){
+'use strict';
+
+module.exports = Readable;
+
+/*<replacement>*/
+var processNextTick = require('process-nextick-args');
+/*</replacement>*/
+
+/*<replacement>*/
+var isArray = require('isarray');
+/*</replacement>*/
+
+/*<replacement>*/
+var Duplex;
+/*</replacement>*/
+
+Readable.ReadableState = ReadableState;
+
+/*<replacement>*/
+var EE = require('events').EventEmitter;
+
+var EElistenerCount = function (emitter, type) {
+ return emitter.listeners(type).length;
+};
+/*</replacement>*/
+
+/*<replacement>*/
+var Stream = require('./internal/streams/stream');
+/*</replacement>*/
+
+/*<replacement>*/
+var Buffer = require('safe-buffer').Buffer;
+/*</replacement>*/
+
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+
+/*<replacement>*/
+var debugUtil = require('util');
+var debug = void 0;
+if (debugUtil && debugUtil.debuglog) {
+ debug = debugUtil.debuglog('stream');
+} else {
+ debug = function () {};
+}
+/*</replacement>*/
+
+var BufferList = require('./internal/streams/BufferList');
+var StringDecoder;
+
+util.inherits(Readable, Stream);
+
+var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
+
+function prependListener(emitter, event, fn) {
+ // Sadly this is not cacheable as some libraries bundle their own
+ // event emitter implementation with them.
+ if (typeof emitter.prependListener === 'function') {
+ return emitter.prependListener(event, fn);
+ } else {
+ // This is a hack to make sure that our error handler is attached before any
+ // userland ones. NEVER DO THIS. This is here only because this code needs
+ // to continue to work with older versions of Node.js that do not include
+ // the prependListener() method. The goal is to eventually remove this hack.
+ if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
+ }
+}
+
+function ReadableState(options, stream) {
+ Duplex = Duplex || require('./_stream_duplex');
+
+ options = options || {};
+
+ // object stream flag. Used to make read(n) ignore n and to
+ // make all the buffer merging and length checks go away
+ this.objectMode = !!options.objectMode;
+
+ if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
+
+ // the point at which it stops calling _read() to fill the buffer
+ // Note: 0 is a valid value, means "don't call _read preemptively ever"
+ var hwm = options.highWaterMark;
+ var defaultHwm = this.objectMode ? 16 : 16 * 1024;
+ this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;
+
+ // cast to ints.
+ this.highWaterMark = ~~this.highWaterMark;
+
+ // A linked list is used to store data chunks instead of an array because the
+ // linked list can remove elements from the beginning faster than
+ // array.shift()
+ this.buffer = new BufferList();
+ this.length = 0;
+ this.pipes = null;
+ this.pipesCount = 0;
+ this.flowing = null;
+ this.ended = false;
+ this.endEmitted = false;
+ this.reading = false;
+
+ // a flag to be able to tell if the onwrite cb is called immediately,
+ // or on a later tick. We set this to true at first, because any
+ // actions that shouldn't happen until "later" should generally also
+ // not happen before the first write call.
+ this.sync = true;
+
+ // whenever we return null, then we set a flag to say
+ // that we're awaiting a 'readable' event emission.
+ this.needReadable = false;
+ this.emittedReadable = false;
+ this.readableListening = false;
+ this.resumeScheduled = false;
+
+ // Crypto is kind of old and crusty. Historically, its default string
+ // encoding is 'binary' so we have to make this configurable.
+ // Everything else in the universe uses 'utf8', though.
+ this.defaultEncoding = options.defaultEncoding || 'utf8';
+
+ // when piping, we only care about 'readable' events that happen
+ // after read()ing all the bytes and not getting any pushback.
+ this.ranOut = false;
+
+ // the number of writers that are awaiting a drain event in .pipe()s
+ this.awaitDrain = 0;
+
+ // if true, a maybeReadMore has been scheduled
+ this.readingMore = false;
+
+ this.decoder = null;
+ this.encoding = null;
+ if (options.encoding) {
+ if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
+ this.decoder = new StringDecoder(options.encoding);
+ this.encoding = options.encoding;
+ }
+}
+
+function Readable(options) {
+ Duplex = Duplex || require('./_stream_duplex');
+
+ if (!(this instanceof Readable)) return new Readable(options);
+
+ this._readableState = new ReadableState(options, this);
+
+ // legacy
+ this.readable = true;
+
+ if (options && typeof options.read === 'function') this._read = options.read;
+
+ Stream.call(this);
+}
+
+// Manually shove something into the read() buffer.
+// This returns true if the highWaterMark has not been hit yet,
+// similar to how Writable.write() returns true if you should
+// write() some more.
+Readable.prototype.push = function (chunk, encoding) {
+ var state = this._readableState;
+
+ if (!state.objectMode && typeof chunk === 'string') {
+ encoding = encoding || state.defaultEncoding;
+ if (encoding !== state.encoding) {
+ chunk = Buffer.from(chunk, encoding);
+ encoding = '';
+ }
+ }
+
+ return readableAddChunk(this, state, chunk, encoding, false);
+};
+
+// Unshift should *always* be something directly out of read()
+Readable.prototype.unshift = function (chunk) {
+ var state = this._readableState;
+ return readableAddChunk(this, state, chunk, '', true);
+};
+
+Readable.prototype.isPaused = function () {
+ return this._readableState.flowing === false;
+};
+
+function readableAddChunk(stream, state, chunk, encoding, addToFront) {
+ var er = chunkInvalid(state, chunk);
+ if (er) {
+ stream.emit('error', er);
+ } else if (chunk === null) {
+ state.reading = false;
+ onEofChunk(stream, state);
+ } else if (state.objectMode || chunk && chunk.length > 0) {
+ if (state.ended && !addToFront) {
+ var e = new Error('stream.push() after EOF');
+ stream.emit('error', e);
+ } else if (state.endEmitted && addToFront) {
+ var _e = new Error('stream.unshift() after end event');
+ stream.emit('error', _e);
+ } else {
+ var skipAdd;
+ if (state.decoder && !addToFront && !encoding) {
+ chunk = state.decoder.write(chunk);
+ skipAdd = !state.objectMode && chunk.length === 0;
+ }
+
+ if (!addToFront) state.reading = false;
+
+ // Don't add to the buffer if we've decoded to an empty string chunk and
+ // we're not in object mode
+ if (!skipAdd) {
+ // if we want the data now, just emit it.
+ if (state.flowing && state.length === 0 && !state.sync) {
+ stream.emit('data', chunk);
+ stream.read(0);
+ } else {
+ // update the buffer info.
+ state.length += state.objectMode ? 1 : chunk.length;
+ if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
+
+ if (state.needReadable) emitReadable(stream);
+ }
+ }
+
+ maybeReadMore(stream, state);
+ }
+ } else if (!addToFront) {
+ state.reading = false;
+ }
+
+ return needMoreData(state);
+}
+
+// if it's past the high water mark, we can push in some more.
+// Also, if we have no data yet, we can stand some
+// more bytes. This is to work around cases where hwm=0,
+// such as the repl. Also, if the push() triggered a
+// readable event, and the user called read(largeNumber) such that
+// needReadable was set, then we ought to push more, so that another
+// 'readable' event will be triggered.
+function needMoreData(state) {
+ return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
+}
+
+// backwards compatibility.
+Readable.prototype.setEncoding = function (enc) {
+ if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
+ this._readableState.decoder = new StringDecoder(enc);
+ this._readableState.encoding = enc;
+ return this;
+};
+
+// Don't raise the hwm > 8MB
+var MAX_HWM = 0x800000;
+function computeNewHighWaterMark(n) {
+ if (n >= MAX_HWM) {
+ n = MAX_HWM;
+ } else {
+ // Get the next highest power of 2 to prevent increasing hwm excessively in
+ // tiny amounts
+ n--;
+ n |= n >>> 1;
+ n |= n >>> 2;
+ n |= n >>> 4;
+ n |= n >>> 8;
+ n |= n >>> 16;
+ n++;
+ }
+ return n;
+}
+
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function howMuchToRead(n, state) {
+ if (n <= 0 || state.length === 0 && state.ended) return 0;
+ if (state.objectMode) return 1;
+ if (n !== n) {
+ // Only flow one buffer at a time
+ if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
+ }
+ // If we're asking for more than the current hwm, then raise the hwm.
+ if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
+ if (n <= state.length) return n;
+ // Don't have enough
+ if (!state.ended) {
+ state.needReadable = true;
+ return 0;
+ }
+ return state.length;
+}
+
+// you can override either this method, or the async _read(n) below.
+Readable.prototype.read = function (n) {
+ debug('read', n);
+ n = parseInt(n, 10);
+ var state = this._readableState;
+ var nOrig = n;
+
+ if (n !== 0) state.emittedReadable = false;
+
+ // if we're doing read(0) to trigger a readable event, but we
+ // already have a bunch of data in the buffer, then just trigger
+ // the 'readable' event and move on.
+ if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
+ debug('read: emitReadable', state.length, state.ended);
+ if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
+ return null;
+ }
+
+ n = howMuchToRead(n, state);
+
+ // if we've ended, and we're now clear, then finish it up.
+ if (n === 0 && state.ended) {
+ if (state.length === 0) endReadable(this);
+ return null;
+ }
+
+ // All the actual chunk generation logic needs to be
+ // *below* the call to _read. The reason is that in certain
+ // synthetic stream cases, such as passthrough streams, _read
+ // may be a completely synchronous operation which may change
+ // the state of the read buffer, providing enough data when
+ // before there was *not* enough.
+ //
+ // So, the steps are:
+ // 1. Figure out what the state of things will be after we do
+ // a read from the buffer.
+ //
+ // 2. If that resulting state will trigger a _read, then call _read.
+ // Note that this may be asynchronous, or synchronous. Yes, it is
+ // deeply ugly to write APIs this way, but that still doesn't mean
+ // that the Readable class should behave improperly, as streams are
+ // designed to be sync/async agnostic.
+ // Take note if the _read call is sync or async (ie, if the read call
+ // has returned yet), so that we know whether or not it's safe to emit
+ // 'readable' etc.
+ //
+ // 3. Actually pull the requested chunks out of the buffer and return.
+
+ // if we need a readable event, then we need to do some reading.
+ var doRead = state.needReadable;
+ debug('need readable', doRead);
+
+ // if we currently have less than the highWaterMark, then also read some
+ if (state.length === 0 || state.length - n < state.highWaterMark) {
+ doRead = true;
+ debug('length less than watermark', doRead);
+ }
+
+ // however, if we've ended, then there's no point, and if we're already
+ // reading, then it's unnecessary.
+ if (state.ended || state.reading) {
+ doRead = false;
+ debug('reading or ended', doRead);
+ } else if (doRead) {
+ debug('do read');
+ state.reading = true;
+ state.sync = true;
+ // if the length is currently zero, then we *need* a readable event.
+ if (state.length === 0) state.needReadable = true;
+ // call internal read method
+ this._read(state.highWaterMark);
+ state.sync = false;
+ // If _read pushed data synchronously, then `reading` will be false,
+ // and we need to re-evaluate how much data we can return to the user.
+ if (!state.reading) n = howMuchToRead(nOrig, state);
+ }
+
+ var ret;
+ if (n > 0) ret = fromList(n, state);else ret = null;
+
+ if (ret === null) {
+ state.needReadable = true;
+ n = 0;
+ } else {
+ state.length -= n;
+ }
+
+ if (state.length === 0) {
+ // If we have nothing in the buffer, then we want to know
+ // as soon as we *do* get something into the buffer.
+ if (!state.ended) state.needReadable = true;
+
+ // If we tried to read() past the EOF, then emit end on the next tick.
+ if (nOrig !== n && state.ended) endReadable(this);
+ }
+
+ if (ret !== null) this.emit('data', ret);
+
+ return ret;
+};
+
+function chunkInvalid(state, chunk) {
+ var er = null;
+ if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) {
+ er = new TypeError('Invalid non-string/buffer chunk');
+ }
+ return er;
+}
+
+function onEofChunk(stream, state) {
+ if (state.ended) return;
+ if (state.decoder) {
+ var chunk = state.decoder.end();
+ if (chunk && chunk.length) {
+ state.buffer.push(chunk);
+ state.length += state.objectMode ? 1 : chunk.length;
+ }
+ }
+ state.ended = true;
+
+ // emit 'readable' now to make sure it gets picked up.
+ emitReadable(stream);
+}
+
+// Don't emit readable right away in sync mode, because this can trigger
+// another read() call => stack overflow. This way, it might trigger
+// a nextTick recursion warning, but that's not so bad.
+function emitReadable(stream) {
+ var state = stream._readableState;
+ state.needReadable = false;
+ if (!state.emittedReadable) {
+ debug('emitReadable', state.flowing);
+ state.emittedReadable = true;
+ if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream);
+ }
+}
+
+function emitReadable_(stream) {
+ debug('emit readable');
+ stream.emit('readable');
+ flow(stream);
+}
+
+// at this point, the user has presumably seen the 'readable' event,
+// and called read() to consume some data. that may have triggered
+// in turn another _read(n) call, in which case reading = true if
+// it's in progress.
+// However, if we're not ended, or reading, and the length < hwm,
+// then go ahead and try to read some more preemptively.
+function maybeReadMore(stream, state) {
+ if (!state.readingMore) {
+ state.readingMore = true;
+ processNextTick(maybeReadMore_, stream, state);
+ }
+}
+
+function maybeReadMore_(stream, state) {
+ var len = state.length;
+ while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
+ debug('maybeReadMore read 0');
+ stream.read(0);
+ if (len === state.length)
+ // didn't get any data, stop spinning.
+ break;else len = state.length;
+ }
+ state.readingMore = false;
+}
+
+// abstract method. to be overridden in specific implementation classes.
+// call cb(er, data) where data is <= n in length.
+// for virtual (non-string, non-buffer) streams, "length" is somewhat
+// arbitrary, and perhaps not very meaningful.
+Readable.prototype._read = function (n) {
+ this.emit('error', new Error('_read() is not implemented'));
+};
+
+Readable.prototype.pipe = function (dest, pipeOpts) {
+ var src = this;
+ var state = this._readableState;
+
+ switch (state.pipesCount) {
+ case 0:
+ state.pipes = dest;
+ break;
+ case 1:
+ state.pipes = [state.pipes, dest];
+ break;
+ default:
+ state.pipes.push(dest);
+ break;
+ }
+ state.pipesCount += 1;
+ debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
+
+ var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
+
+ var endFn = doEnd ? onend : unpipe;
+ if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn);
+
+ dest.on('unpipe', onunpipe);
+ function onunpipe(readable) {
+ debug('onunpipe');
+ if (readable === src) {
+ cleanup();
+ }
+ }
+
+ function onend() {
+ debug('onend');
+ dest.end();
+ }
+
+ // when the dest drains, it reduces the awaitDrain counter
+ // on the source. This would be more elegant with a .once()
+ // handler in flow(), but adding and removing repeatedly is
+ // too slow.
+ var ondrain = pipeOnDrain(src);
+ dest.on('drain', ondrain);
+
+ var cleanedUp = false;
+ function cleanup() {
+ debug('cleanup');
+ // cleanup event handlers once the pipe is broken
+ dest.removeListener('close', onclose);
+ dest.removeListener('finish', onfinish);
+ dest.removeListener('drain', ondrain);
+ dest.removeListener('error', onerror);
+ dest.removeListener('unpipe', onunpipe);
+ src.removeListener('end', onend);
+ src.removeListener('end', unpipe);
+ src.removeListener('data', ondata);
+
+ cleanedUp = true;
+
+ // if the reader is waiting for a drain event from this
+ // specific writer, then it would cause it to never start
+ // flowing again.
+ // So, if this is awaiting a drain, then we just call it now.
+ // If we don't know, then assume that we are waiting for one.
+ if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
+ }
+
+ // If the user pushes more data while we're writing to dest then we'll end up
+ // in ondata again. However, we only want to increase awaitDrain once because
+ // dest will only emit one 'drain' event for the multiple writes.
+ // => Introduce a guard on increasing awaitDrain.
+ var increasedAwaitDrain = false;
+ src.on('data', ondata);
+ function ondata(chunk) {
+ debug('ondata');
+ increasedAwaitDrain = false;
+ var ret = dest.write(chunk);
+ if (false === ret && !increasedAwaitDrain) {
+ // If the user unpiped during `dest.write()`, it is possible
+ // to get stuck in a permanently paused state if that write
+ // also returned false.
+ // => Check whether `dest` is still a piping destination.
+ if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
+ debug('false write response, pause', src._readableState.awaitDrain);
+ src._readableState.awaitDrain++;
+ increasedAwaitDrain = true;
+ }
+ src.pause();
+ }
+ }
+
+ // if the dest has an error, then stop piping into it.
+ // however, don't suppress the throwing behavior for this.
+ function onerror(er) {
+ debug('onerror', er);
+ unpipe();
+ dest.removeListener('error', onerror);
+ if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
+ }
+
+ // Make sure our error handler is attached before userland ones.
+ prependListener(dest, 'error', onerror);
+
+ // Both close and finish should trigger unpipe, but only once.
+ function onclose() {
+ dest.removeListener('finish', onfinish);
+ unpipe();
+ }
+ dest.once('close', onclose);
+ function onfinish() {
+ debug('onfinish');
+ dest.removeListener('close', onclose);
+ unpipe();
+ }
+ dest.once('finish', onfinish);
+
+ function unpipe() {
+ debug('unpipe');
+ src.unpipe(dest);
+ }
+
+ // tell the dest that it's being piped to
+ dest.emit('pipe', src);
+
+ // start the flow if it hasn't been started already.
+ if (!state.flowing) {
+ debug('pipe resume');
+ src.resume();
+ }
+
+ return dest;
+};
+
+function pipeOnDrain(src) {
+ return function () {
+ var state = src._readableState;
+ debug('pipeOnDrain', state.awaitDrain);
+ if (state.awaitDrain) state.awaitDrain--;
+ if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
+ state.flowing = true;
+ flow(src);
+ }
+ };
+}
+
+Readable.prototype.unpipe = function (dest) {
+ var state = this._readableState;
+
+ // if we're not piping anywhere, then do nothing.
+ if (state.pipesCount === 0) return this;
+
+ // just one destination. most common case.
+ if (state.pipesCount === 1) {
+ // passed in one, but it's not the right one.
+ if (dest && dest !== state.pipes) return this;
+
+ if (!dest) dest = state.pipes;
+
+ // got a match.
+ state.pipes = null;
+ state.pipesCount = 0;
+ state.flowing = false;
+ if (dest) dest.emit('unpipe', this);
+ return this;
+ }
+
+ // slow case. multiple pipe destinations.
+
+ if (!dest) {
+ // remove all.
+ var dests = state.pipes;
+ var len = state.pipesCount;
+ state.pipes = null;
+ state.pipesCount = 0;
+ state.flowing = false;
+
+ for (var i = 0; i < len; i++) {
+ dests[i].emit('unpipe', this);
+ }return this;
+ }
+
+ // try to find the right one.
+ var index = indexOf(state.pipes, dest);
+ if (index === -1) return this;
+
+ state.pipes.splice(index, 1);
+ state.pipesCount -= 1;
+ if (state.pipesCount === 1) state.pipes = state.pipes[0];
+
+ dest.emit('unpipe', this);
+
+ return this;
+};
+
+// set up data events if they are asked for
+// Ensure readable listeners eventually get something
+Readable.prototype.on = function (ev, fn) {
+ var res = Stream.prototype.on.call(this, ev, fn);
+
+ if (ev === 'data') {
+ // Start flowing on next tick if stream isn't explicitly paused
+ if (this._readableState.flowing !== false) this.resume();
+ } else if (ev === 'readable') {
+ var state = this._readableState;
+ if (!state.endEmitted && !state.readableListening) {
+ state.readableListening = state.needReadable = true;
+ state.emittedReadable = false;
+ if (!state.reading) {
+ processNextTick(nReadingNextTick, this);
+ } else if (state.length) {
+ emitReadable(this, state);
+ }
+ }
+ }
+
+ return res;
+};
+Readable.prototype.addListener = Readable.prototype.on;
+
+function nReadingNextTick(self) {
+ debug('readable nexttick read 0');
+ self.read(0);
+}
+
+// pause() and resume() are remnants of the legacy readable stream API
+// If the user uses them, then switch into old mode.
+Readable.prototype.resume = function () {
+ var state = this._readableState;
+ if (!state.flowing) {
+ debug('resume');
+ state.flowing = true;
+ resume(this, state);
+ }
+ return this;
+};
+
+function resume(stream, state) {
+ if (!state.resumeScheduled) {
+ state.resumeScheduled = true;
+ processNextTick(resume_, stream, state);
+ }
+}
+
+function resume_(stream, state) {
+ if (!state.reading) {
+ debug('resume read 0');
+ stream.read(0);
+ }
+
+ state.resumeScheduled = false;
+ state.awaitDrain = 0;
+ stream.emit('resume');
+ flow(stream);
+ if (state.flowing && !state.reading) stream.read(0);
+}
+
+Readable.prototype.pause = function () {
+ debug('call pause flowing=%j', this._readableState.flowing);
+ if (false !== this._readableState.flowing) {
+ debug('pause');
+ this._readableState.flowing = false;
+ this.emit('pause');
+ }
+ return this;
+};
+
+function flow(stream) {
+ var state = stream._readableState;
+ debug('flow', state.flowing);
+ while (state.flowing && stream.read() !== null) {}
+}
+
+// wrap an old-style stream as the async data source.
+// This is *not* part of the readable stream interface.
+// It is an ugly unfortunate mess of history.
+Readable.prototype.wrap = function (stream) {
+ var state = this._readableState;
+ var paused = false;
+
+ var self = this;
+ stream.on('end', function () {
+ debug('wrapped end');
+ if (state.decoder && !state.ended) {
+ var chunk = state.decoder.end();
+ if (chunk && chunk.length) self.push(chunk);
+ }
+
+ self.push(null);
+ });
+
+ stream.on('data', function (chunk) {
+ debug('wrapped data');
+ if (state.decoder) chunk = state.decoder.write(chunk);
+
+ // don't skip over falsy values in objectMode
+ if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
+
+ var ret = self.push(chunk);
+ if (!ret) {
+ paused = true;
+ stream.pause();
+ }
+ });
+
+ // proxy all the other methods.
+ // important when wrapping filters and duplexes.
+ for (var i in stream) {
+ if (this[i] === undefined && typeof stream[i] === 'function') {
+ this[i] = function (method) {
+ return function () {
+ return stream[method].apply(stream, arguments);
+ };
+ }(i);
+ }
+ }
+
+ // proxy certain important events.
+ for (var n = 0; n < kProxyEvents.length; n++) {
+ stream.on(kProxyEvents[n], self.emit.bind(self, kProxyEvents[n]));
+ }
+
+ // when we try to consume some more bytes, simply unpause the
+ // underlying stream.
+ self._read = function (n) {
+ debug('wrapped _read', n);
+ if (paused) {
+ paused = false;
+ stream.resume();
+ }
+ };
+
+ return self;
+};
+
+// exposed for testing purposes only.
+Readable._fromList = fromList;
+
+// Pluck off n bytes from an array of buffers.
+// Length is the combined lengths of all the buffers in the list.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function fromList(n, state) {
+ // nothing buffered
+ if (state.length === 0) return null;
+
+ var ret;
+ if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
+ // read it all, truncate the list
+ if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);
+ state.buffer.clear();
+ } else {
+ // read part of list
+ ret = fromListPartial(n, state.buffer, state.decoder);
+ }
+
+ return ret;
+}
+
+// Extracts only enough buffered data to satisfy the amount requested.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function fromListPartial(n, list, hasStrings) {
+ var ret;
+ if (n < list.head.data.length) {
+ // slice is the same for buffers and strings
+ ret = list.head.data.slice(0, n);
+ list.head.data = list.head.data.slice(n);
+ } else if (n === list.head.data.length) {
+ // first chunk is a perfect match
+ ret = list.shift();
+ } else {
+ // result spans more than one buffer
+ ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
+ }
+ return ret;
+}
+
+// Copies a specified amount of characters from the list of buffered data
+// chunks.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function copyFromBufferString(n, list) {
+ var p = list.head;
+ var c = 1;
+ var ret = p.data;
+ n -= ret.length;
+ while (p = p.next) {
+ var str = p.data;
+ var nb = n > str.length ? str.length : n;
+ if (nb === str.length) ret += str;else ret += str.slice(0, n);
+ n -= nb;
+ if (n === 0) {
+ if (nb === str.length) {
+ ++c;
+ if (p.next) list.head = p.next;else list.head = list.tail = null;
+ } else {
+ list.head = p;
+ p.data = str.slice(nb);
+ }
+ break;
+ }
+ ++c;
+ }
+ list.length -= c;
+ return ret;
+}
+
+// Copies a specified amount of bytes from the list of buffered data chunks.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function copyFromBuffer(n, list) {
+ var ret = Buffer.allocUnsafe(n);
+ var p = list.head;
+ var c = 1;
+ p.data.copy(ret);
+ n -= p.data.length;
+ while (p = p.next) {
+ var buf = p.data;
+ var nb = n > buf.length ? buf.length : n;
+ buf.copy(ret, ret.length - n, 0, nb);
+ n -= nb;
+ if (n === 0) {
+ if (nb === buf.length) {
+ ++c;
+ if (p.next) list.head = p.next;else list.head = list.tail = null;
+ } else {
+ list.head = p;
+ p.data = buf.slice(nb);
+ }
+ break;
+ }
+ ++c;
+ }
+ list.length -= c;
+ return ret;
+}
+
+function endReadable(stream) {
+ var state = stream._readableState;
+
+ // If we get here before consuming all the bytes, then that is a
+ // bug in node. Should never happen.
+ if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
+
+ if (!state.endEmitted) {
+ state.ended = true;
+ processNextTick(endReadableNT, state, stream);
+ }
+}
+
+function endReadableNT(state, stream) {
+ // Check that we didn't get one last unshift.
+ if (!state.endEmitted && state.length === 0) {
+ state.endEmitted = true;
+ stream.readable = false;
+ stream.emit('end');
+ }
+}
+
+function forEach(xs, f) {
+ for (var i = 0, l = xs.length; i < l; i++) {
+ f(xs[i], i);
+ }
+}
+
+function indexOf(xs, x) {
+ for (var i = 0, l = xs.length; i < l; i++) {
+ if (xs[i] === x) return i;
+ }
+ return -1;
+}
+}).call(this,require('_process'))
+},{"./_stream_duplex":84,"./internal/streams/BufferList":89,"./internal/streams/stream":90,"_process":82,"core-util-is":44,"events":62,"inherits":66,"isarray":68,"process-nextick-args":81,"safe-buffer":95,"string_decoder/":97,"util":40}],87:[function(require,module,exports){
+// a transform stream is a readable/writable stream where you do
+// something with the data. Sometimes it's called a "filter",
+// but that's not a great name for it, since that implies a thing where
+// some bits pass through, and others are simply ignored. (That would
+// be a valid example of a transform, of course.)
+//
+// While the output is causally related to the input, it's not a
+// necessarily symmetric or synchronous transformation. For example,
+// a zlib stream might take multiple plain-text writes(), and then
+// emit a single compressed chunk some time in the future.
+//
+// Here's how this works:
+//
+// The Transform stream has all the aspects of the readable and writable
+// stream classes. When you write(chunk), that calls _write(chunk,cb)
+// internally, and returns false if there's a lot of pending writes
+// buffered up. When you call read(), that calls _read(n) until
+// there's enough pending readable data buffered up.
+//
+// In a transform stream, the written data is placed in a buffer. When
+// _read(n) is called, it transforms the queued up data, calling the
+// buffered _write cb's as it consumes chunks. If consuming a single
+// written chunk would result in multiple output chunks, then the first
+// outputted bit calls the readcb, and subsequent chunks just go into
+// the read buffer, and will cause it to emit 'readable' if necessary.
+//
+// This way, back-pressure is actually determined by the reading side,
+// since _read has to be called to start processing a new chunk. However,
+// a pathological inflate type of transform can cause excessive buffering
+// here. For example, imagine a stream where every byte of input is
+// interpreted as an integer from 0-255, and then results in that many
+// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
+// 1kb of data being output. In this case, you could write a very small
+// amount of input, and end up with a very large amount of output. In
+// such a pathological inflating mechanism, there'd be no way to tell
+// the system to stop doing the transform. A single 4MB write could
+// cause the system to run out of memory.
+//
+// However, even in such a pathological case, only a single written chunk
+// would be consumed, and then the rest would wait (un-transformed) until
+// the results of the previous transformed chunk were consumed.
+
+'use strict';
+
+module.exports = Transform;
+
+var Duplex = require('./_stream_duplex');
+
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+
+util.inherits(Transform, Duplex);
+
+function TransformState(stream) {
+ this.afterTransform = function (er, data) {
+ return afterTransform(stream, er, data);
+ };
+
+ this.needTransform = false;
+ this.transforming = false;
+ this.writecb = null;
+ this.writechunk = null;
+ this.writeencoding = null;
+}
+
+function afterTransform(stream, er, data) {
+ var ts = stream._transformState;
+ ts.transforming = false;
+
+ var cb = ts.writecb;
+
+ if (!cb) return stream.emit('error', new Error('no writecb in Transform class'));
+
+ ts.writechunk = null;
+ ts.writecb = null;
+
+ if (data !== null && data !== undefined) stream.push(data);
+
+ cb(er);
+
+ var rs = stream._readableState;
+ rs.reading = false;
+ if (rs.needReadable || rs.length < rs.highWaterMark) {
+ stream._read(rs.highWaterMark);
+ }
+}
+
+function Transform(options) {
+ if (!(this instanceof Transform)) return new Transform(options);
+
+ Duplex.call(this, options);
+
+ this._transformState = new TransformState(this);
+
+ var stream = this;
+
+ // start out asking for a readable event once data is transformed.
+ this._readableState.needReadable = true;
+
+ // we have implemented the _read method, and done the other things
+ // that Readable wants before the first _read call, so unset the
+ // sync guard flag.
+ this._readableState.sync = false;
+
+ if (options) {
+ if (typeof options.transform === 'function') this._transform = options.transform;
+
+ if (typeof options.flush === 'function') this._flush = options.flush;
+ }
+
+ // When the writable side finishes, then flush out anything remaining.
+ this.once('prefinish', function () {
+ if (typeof this._flush === 'function') this._flush(function (er, data) {
+ done(stream, er, data);
+ });else done(stream);
+ });
+}
+
+Transform.prototype.push = function (chunk, encoding) {
+ this._transformState.needTransform = false;
+ return Duplex.prototype.push.call(this, chunk, encoding);
+};
+
+// This is the part where you do stuff!
+// override this function in implementation classes.
+// 'chunk' is an input chunk.
+//
+// Call `push(newChunk)` to pass along transformed output
+// to the readable side. You may call 'push' zero or more times.
+//
+// Call `cb(err)` when you are done with this chunk. If you pass
+// an error, then that'll put the hurt on the whole operation. If you
+// never call cb(), then you'll never get another chunk.
+Transform.prototype._transform = function (chunk, encoding, cb) {
+ throw new Error('_transform() is not implemented');
+};
+
+Transform.prototype._write = function (chunk, encoding, cb) {
+ var ts = this._transformState;
+ ts.writecb = cb;
+ ts.writechunk = chunk;
+ ts.writeencoding = encoding;
+ if (!ts.transforming) {
+ var rs = this._readableState;
+ if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
+ }
+};
+
+// Doesn't matter what the args are here.
+// _transform does all the work.
+// That we got here means that the readable side wants more data.
+Transform.prototype._read = function (n) {
+ var ts = this._transformState;
+
+ if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
+ ts.transforming = true;
+ this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
+ } else {
+ // mark that we need a transform, so that any data that comes in
+ // will get processed, now that we've asked for it.
+ ts.needTransform = true;
+ }
+};
+
+function done(stream, er, data) {
+ if (er) return stream.emit('error', er);
+
+ if (data !== null && data !== undefined) stream.push(data);
+
+ // if there's nothing in the write buffer, then that means
+ // that nothing more will ever be provided
+ var ws = stream._writableState;
+ var ts = stream._transformState;
+
+ if (ws.length) throw new Error('Calling transform done when ws.length != 0');
+
+ if (ts.transforming) throw new Error('Calling transform done when still transforming');
+
+ return stream.push(null);
+}
+},{"./_stream_duplex":84,"core-util-is":44,"inherits":66}],88:[function(require,module,exports){
+(function (process){
+// A bit simpler than readable streams.
+// Implement an async ._write(chunk, encoding, cb), and it'll handle all
+// the drain event emission and buffering.
+
+'use strict';
+
+module.exports = Writable;
+
+/*<replacement>*/
+var processNextTick = require('process-nextick-args');
+/*</replacement>*/
+
+/*<replacement>*/
+var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick;
+/*</replacement>*/
+
+/*<replacement>*/
+var Duplex;
+/*</replacement>*/
+
+Writable.WritableState = WritableState;
+
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+
+/*<replacement>*/
+var internalUtil = {
+ deprecate: require('util-deprecate')
+};
+/*</replacement>*/
+
+/*<replacement>*/
+var Stream = require('./internal/streams/stream');
+/*</replacement>*/
+
+/*<replacement>*/
+var Buffer = require('safe-buffer').Buffer;
+/*</replacement>*/
+
+util.inherits(Writable, Stream);
+
+function nop() {}
+
+function WriteReq(chunk, encoding, cb) {
+ this.chunk = chunk;
+ this.encoding = encoding;
+ this.callback = cb;
+ this.next = null;
+}
+
+function WritableState(options, stream) {
+ Duplex = Duplex || require('./_stream_duplex');
+
+ options = options || {};
+
+ // object stream flag to indicate whether or not this stream
+ // contains buffers or objects.
+ this.objectMode = !!options.objectMode;
+
+ if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode;
+
+ // the point at which write() starts returning false
+ // Note: 0 is a valid value, means that we always return false if
+ // the entire buffer is not flushed immediately on write()
+ var hwm = options.highWaterMark;
+ var defaultHwm = this.objectMode ? 16 : 16 * 1024;
+ this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;
+
+ // cast to ints.
+ this.highWaterMark = ~~this.highWaterMark;
+
+ // drain event flag.
+ this.needDrain = false;
+ // at the start of calling end()
+ this.ending = false;
+ // when end() has been called, and returned
+ this.ended = false;
+ // when 'finish' is emitted
+ this.finished = false;
+
+ // should we decode strings into buffers before passing to _write?
+ // this is here so that some node-core streams can optimize string
+ // handling at a lower level.
+ var noDecode = options.decodeStrings === false;
+ this.decodeStrings = !noDecode;
+
+ // Crypto is kind of old and crusty. Historically, its default string
+ // encoding is 'binary' so we have to make this configurable.
+ // Everything else in the universe uses 'utf8', though.
+ this.defaultEncoding = options.defaultEncoding || 'utf8';
+
+ // not an actual buffer we keep track of, but a measurement
+ // of how much we're waiting to get pushed to some underlying
+ // socket or file.
+ this.length = 0;
+
+ // a flag to see when we're in the middle of a write.
+ this.writing = false;
+
+ // when true all writes will be buffered until .uncork() call
+ this.corked = 0;
+
+ // a flag to be able to tell if the onwrite cb is called immediately,
+ // or on a later tick. We set this to true at first, because any
+ // actions that shouldn't happen until "later" should generally also
+ // not happen before the first write call.
+ this.sync = true;
+
+ // a flag to know if we're processing previously buffered items, which
+ // may call the _write() callback in the same tick, so that we don't
+ // end up in an overlapped onwrite situation.
+ this.bufferProcessing = false;
+
+ // the callback that's passed to _write(chunk,cb)
+ this.onwrite = function (er) {
+ onwrite(stream, er);
+ };
+
+ // the callback that the user supplies to write(chunk,encoding,cb)
+ this.writecb = null;
+
+ // the amount that is being written when _write is called.
+ this.writelen = 0;
+
+ this.bufferedRequest = null;
+ this.lastBufferedRequest = null;
+
+ // number of pending user-supplied write callbacks
+ // this must be 0 before 'finish' can be emitted
+ this.pendingcb = 0;
+
+ // emit prefinish if the only thing we're waiting for is _write cbs
+ // This is relevant for synchronous Transform streams
+ this.prefinished = false;
+
+ // True if the error was already emitted and should not be thrown again
+ this.errorEmitted = false;
+
+ // count buffered requests
+ this.bufferedRequestCount = 0;
+
+ // allocate the first CorkedRequest, there is always
+ // one allocated and free to use, and we maintain at most two
+ this.corkedRequestsFree = new CorkedRequest(this);
+}
+
+WritableState.prototype.getBuffer = function getBuffer() {
+ var current = this.bufferedRequest;
+ var out = [];
+ while (current) {
+ out.push(current);
+ current = current.next;
+ }
+ return out;
+};
+
+(function () {
+ try {
+ Object.defineProperty(WritableState.prototype, 'buffer', {
+ get: internalUtil.deprecate(function () {
+ return this.getBuffer();
+ }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.')
+ });
+ } catch (_) {}
+})();
+
+// Test _writableState for inheritance to account for Duplex streams,
+// whose prototype chain only points to Readable.
+var realHasInstance;
+if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
+ realHasInstance = Function.prototype[Symbol.hasInstance];
+ Object.defineProperty(Writable, Symbol.hasInstance, {
+ value: function (object) {
+ if (realHasInstance.call(this, object)) return true;
+
+ return object && object._writableState instanceof WritableState;
+ }
+ });
+} else {
+ realHasInstance = function (object) {
+ return object instanceof this;
+ };
+}
+
+function Writable(options) {
+ Duplex = Duplex || require('./_stream_duplex');
+
+ // Writable ctor is applied to Duplexes, too.
+ // `realHasInstance` is necessary because using plain `instanceof`
+ // would return false, as no `_writableState` property is attached.
+
+ // Trying to use the custom `instanceof` for Writable here will also break the
+ // Node.js LazyTransform implementation, which has a non-trivial getter for
+ // `_writableState` that would lead to infinite recursion.
+ if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {
+ return new Writable(options);
+ }
+
+ this._writableState = new WritableState(options, this);
+
+ // legacy.
+ this.writable = true;
+
+ if (options) {
+ if (typeof options.write === 'function') this._write = options.write;
+
+ if (typeof options.writev === 'function') this._writev = options.writev;
+ }
+
+ Stream.call(this);
+}
+
+// Otherwise people can pipe Writable streams, which is just wrong.
+Writable.prototype.pipe = function () {
+ this.emit('error', new Error('Cannot pipe, not readable'));
+};
+
+function writeAfterEnd(stream, cb) {
+ var er = new Error('write after end');
+ // TODO: defer error events consistently everywhere, not just the cb
+ stream.emit('error', er);
+ processNextTick(cb, er);
+}
+
+// Checks that a user-supplied chunk is valid, especially for the particular
+// mode the stream is in. Currently this means that `null` is never accepted
+// and undefined/non-string values are only allowed in object mode.
+function validChunk(stream, state, chunk, cb) {
+ var valid = true;
+ var er = false;
+
+ if (chunk === null) {
+ er = new TypeError('May not write null values to stream');
+ } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
+ er = new TypeError('Invalid non-string/buffer chunk');
+ }
+ if (er) {
+ stream.emit('error', er);
+ processNextTick(cb, er);
+ valid = false;
+ }
+ return valid;
+}
+
+Writable.prototype.write = function (chunk, encoding, cb) {
+ var state = this._writableState;
+ var ret = false;
+ var isBuf = Buffer.isBuffer(chunk);
+
+ if (typeof encoding === 'function') {
+ cb = encoding;
+ encoding = null;
+ }
+
+ if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
+
+ if (typeof cb !== 'function') cb = nop;
+
+ if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
+ state.pendingcb++;
+ ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
+ }
+
+ return ret;
+};
+
+Writable.prototype.cork = function () {
+ var state = this._writableState;
+
+ state.corked++;
+};
+
+Writable.prototype.uncork = function () {
+ var state = this._writableState;
+
+ if (state.corked) {
+ state.corked--;
+
+ if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
+ }
+};
+
+Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
+ // node::ParseEncoding() requires lower case.
+ if (typeof encoding === 'string') encoding = encoding.toLowerCase();
+ if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
+ this._writableState.defaultEncoding = encoding;
+ return this;
+};
+
+function decodeChunk(state, chunk, encoding) {
+ if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
+ chunk = Buffer.from(chunk, encoding);
+ }
+ return chunk;
+}
+
+// if we're already writing something, then just put this
+// in the queue, and wait our turn. Otherwise, call _write
+// If we return false, then we need a drain event, so set that flag.
+function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
+ if (!isBuf) {
+ chunk = decodeChunk(state, chunk, encoding);
+ if (Buffer.isBuffer(chunk)) encoding = 'buffer';
+ }
+ var len = state.objectMode ? 1 : chunk.length;
+
+ state.length += len;
+
+ var ret = state.length < state.highWaterMark;
+ // we must ensure that previous needDrain will not be reset to false.
+ if (!ret) state.needDrain = true;
+
+ if (state.writing || state.corked) {
+ var last = state.lastBufferedRequest;
+ state.lastBufferedRequest = new WriteReq(chunk, encoding, cb);
+ if (last) {
+ last.next = state.lastBufferedRequest;
+ } else {
+ state.bufferedRequest = state.lastBufferedRequest;
+ }
+ state.bufferedRequestCount += 1;
+ } else {
+ doWrite(stream, state, false, len, chunk, encoding, cb);
+ }
+
+ return ret;
+}
+
+function doWrite(stream, state, writev, len, chunk, encoding, cb) {
+ state.writelen = len;
+ state.writecb = cb;
+ state.writing = true;
+ state.sync = true;
+ if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
+ state.sync = false;
+}
+
+function onwriteError(stream, state, sync, er, cb) {
+ --state.pendingcb;
+ if (sync) processNextTick(cb, er);else cb(er);
+
+ stream._writableState.errorEmitted = true;
+ stream.emit('error', er);
+}
+
+function onwriteStateUpdate(state) {
+ state.writing = false;
+ state.writecb = null;
+ state.length -= state.writelen;
+ state.writelen = 0;
+}
+
+function onwrite(stream, er) {
+ var state = stream._writableState;
+ var sync = state.sync;
+ var cb = state.writecb;
+
+ onwriteStateUpdate(state);
+
+ if (er) onwriteError(stream, state, sync, er, cb);else {
+ // Check if we're actually ready to finish, but don't emit yet
+ var finished = needFinish(state);
+
+ if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
+ clearBuffer(stream, state);
+ }
+
+ if (sync) {
+ /*<replacement>*/
+ asyncWrite(afterWrite, stream, state, finished, cb);
+ /*</replacement>*/
+ } else {
+ afterWrite(stream, state, finished, cb);
+ }
+ }
+}
+
+function afterWrite(stream, state, finished, cb) {
+ if (!finished) onwriteDrain(stream, state);
+ state.pendingcb--;
+ cb();
+ finishMaybe(stream, state);
+}
+
+// Must force callback to be called on nextTick, so that we don't
+// emit 'drain' before the write() consumer gets the 'false' return
+// value, and has a chance to attach a 'drain' listener.
+function onwriteDrain(stream, state) {
+ if (state.length === 0 && state.needDrain) {
+ state.needDrain = false;
+ stream.emit('drain');
+ }
+}
+
+// if there's something in the buffer waiting, then process it
+function clearBuffer(stream, state) {
+ state.bufferProcessing = true;
+ var entry = state.bufferedRequest;
+
+ if (stream._writev && entry && entry.next) {
+ // Fast case, write everything using _writev()
+ var l = state.bufferedRequestCount;
+ var buffer = new Array(l);
+ var holder = state.corkedRequestsFree;
+ holder.entry = entry;
+
+ var count = 0;
+ while (entry) {
+ buffer[count] = entry;
+ entry = entry.next;
+ count += 1;
+ }
+
+ doWrite(stream, state, true, state.length, buffer, '', holder.finish);
+
+ // doWrite is almost always async, defer these to save a bit of time
+ // as the hot path ends with doWrite
+ state.pendingcb++;
+ state.lastBufferedRequest = null;
+ if (holder.next) {
+ state.corkedRequestsFree = holder.next;
+ holder.next = null;
+ } else {
+ state.corkedRequestsFree = new CorkedRequest(state);
+ }
+ } else {
+ // Slow case, write chunks one-by-one
+ while (entry) {
+ var chunk = entry.chunk;
+ var encoding = entry.encoding;
+ var cb = entry.callback;
+ var len = state.objectMode ? 1 : chunk.length;
+
+ doWrite(stream, state, false, len, chunk, encoding, cb);
+ entry = entry.next;
+ // if we didn't call the onwrite immediately, then
+ // it means that we need to wait until it does.
+ // also, that means that the chunk and cb are currently
+ // being processed, so move the buffer counter past them.
+ if (state.writing) {
+ break;
+ }
+ }
+
+ if (entry === null) state.lastBufferedRequest = null;
+ }
+
+ state.bufferedRequestCount = 0;
+ state.bufferedRequest = entry;
+ state.bufferProcessing = false;
+}
+
+Writable.prototype._write = function (chunk, encoding, cb) {
+ cb(new Error('_write() is not implemented'));
+};
+
+Writable.prototype._writev = null;
+
+Writable.prototype.end = function (chunk, encoding, cb) {
+ var state = this._writableState;
+
+ if (typeof chunk === 'function') {
+ cb = chunk;
+ chunk = null;
+ encoding = null;
+ } else if (typeof encoding === 'function') {
+ cb = encoding;
+ encoding = null;
+ }
+
+ if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
+
+ // .end() fully uncorks
+ if (state.corked) {
+ state.corked = 1;
+ this.uncork();
+ }
+
+ // ignore unnecessary end() calls.
+ if (!state.ending && !state.finished) endWritable(this, state, cb);
+};
+
+function needFinish(state) {
+ return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
+}
+
+function prefinish(stream, state) {
+ if (!state.prefinished) {
+ state.prefinished = true;
+ stream.emit('prefinish');
+ }
+}
+
+function finishMaybe(stream, state) {
+ var need = needFinish(state);
+ if (need) {
+ if (state.pendingcb === 0) {
+ prefinish(stream, state);
+ state.finished = true;
+ stream.emit('finish');
+ } else {
+ prefinish(stream, state);
+ }
+ }
+ return need;
+}
+
+function endWritable(stream, state, cb) {
+ state.ending = true;
+ finishMaybe(stream, state);
+ if (cb) {
+ if (state.finished) processNextTick(cb);else stream.once('finish', cb);
+ }
+ state.ended = true;
+ stream.writable = false;
+}
+
+// It seems a linked list but it is not
+// there will be only 2 of these for each stream
+function CorkedRequest(state) {
+ var _this = this;
+
+ this.next = null;
+ this.entry = null;
+ this.finish = function (err) {
+ var entry = _this.entry;
+ _this.entry = null;
+ while (entry) {
+ var cb = entry.callback;
+ state.pendingcb--;
+ cb(err);
+ entry = entry.next;
+ }
+ if (state.corkedRequestsFree) {
+ state.corkedRequestsFree.next = _this;
+ } else {
+ state.corkedRequestsFree = _this;
+ }
+ };
+}
+}).call(this,require('_process'))
+},{"./_stream_duplex":84,"./internal/streams/stream":90,"_process":82,"core-util-is":44,"inherits":66,"process-nextick-args":81,"safe-buffer":95,"util-deprecate":99}],89:[function(require,module,exports){
+'use strict';
+
+/*<replacement>*/
+
+var Buffer = require('safe-buffer').Buffer;
+/*</replacement>*/
+
+module.exports = BufferList;
+
+function BufferList() {
+ this.head = null;
+ this.tail = null;
+ this.length = 0;
+}
+
+BufferList.prototype.push = function (v) {
+ var entry = { data: v, next: null };
+ if (this.length > 0) this.tail.next = entry;else this.head = entry;
+ this.tail = entry;
+ ++this.length;
+};
+
+BufferList.prototype.unshift = function (v) {
+ var entry = { data: v, next: this.head };
+ if (this.length === 0) this.tail = entry;
+ this.head = entry;
+ ++this.length;
+};
+
+BufferList.prototype.shift = function () {
+ if (this.length === 0) return;
+ var ret = this.head.data;
+ if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
+ --this.length;
+ return ret;
+};
+
+BufferList.prototype.clear = function () {
+ this.head = this.tail = null;
+ this.length = 0;
+};
+
+BufferList.prototype.join = function (s) {
+ if (this.length === 0) return '';
+ var p = this.head;
+ var ret = '' + p.data;
+ while (p = p.next) {
+ ret += s + p.data;
+ }return ret;
+};
+
+BufferList.prototype.concat = function (n) {
+ if (this.length === 0) return Buffer.alloc(0);
+ if (this.length === 1) return this.head.data;
+ var ret = Buffer.allocUnsafe(n >>> 0);
+ var p = this.head;
+ var i = 0;
+ while (p) {
+ p.data.copy(ret, i);
+ i += p.data.length;
+ p = p.next;
+ }
+ return ret;
+};
+},{"safe-buffer":95}],90:[function(require,module,exports){
+module.exports = require('events').EventEmitter;
+
+},{"events":62}],91:[function(require,module,exports){
+module.exports = require('./readable').PassThrough
+
+},{"./readable":92}],92:[function(require,module,exports){
+exports = module.exports = require('./lib/_stream_readable.js');
+exports.Stream = exports;
+exports.Readable = exports;
+exports.Writable = require('./lib/_stream_writable.js');
+exports.Duplex = require('./lib/_stream_duplex.js');
+exports.Transform = require('./lib/_stream_transform.js');
+exports.PassThrough = require('./lib/_stream_passthrough.js');
+
+},{"./lib/_stream_duplex.js":84,"./lib/_stream_passthrough.js":85,"./lib/_stream_readable.js":86,"./lib/_stream_transform.js":87,"./lib/_stream_writable.js":88}],93:[function(require,module,exports){
+module.exports = require('./readable').Transform
+
+},{"./readable":92}],94:[function(require,module,exports){
+module.exports = require('./lib/_stream_writable.js');
+
+},{"./lib/_stream_writable.js":88}],95:[function(require,module,exports){
+module.exports = require('buffer')
+
+},{"buffer":43}],96:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+module.exports = Stream;
+
+var EE = require('events').EventEmitter;
+var inherits = require('inherits');
+
+inherits(Stream, EE);
+Stream.Readable = require('readable-stream/readable.js');
+Stream.Writable = require('readable-stream/writable.js');
+Stream.Duplex = require('readable-stream/duplex.js');
+Stream.Transform = require('readable-stream/transform.js');
+Stream.PassThrough = require('readable-stream/passthrough.js');
+
+// Backwards-compat with node 0.4.x
+Stream.Stream = Stream;
+
+
+
+// old-style streams. Note that the pipe method (the only relevant
+// part of this class) is overridden in the Readable class.
+
+function Stream() {
+ EE.call(this);
+}
+
+Stream.prototype.pipe = function(dest, options) {
+ var source = this;
+
+ function ondata(chunk) {
+ if (dest.writable) {
+ if (false === dest.write(chunk) && source.pause) {
+ source.pause();
+ }
+ }
+ }
+
+ source.on('data', ondata);
+
+ function ondrain() {
+ if (source.readable && source.resume) {
+ source.resume();
+ }
+ }
+
+ dest.on('drain', ondrain);
+
+ // If the 'end' option is not supplied, dest.end() will be called when
+ // source gets the 'end' or 'close' events. Only dest.end() once.
+ if (!dest._isStdio && (!options || options.end !== false)) {
+ source.on('end', onend);
+ source.on('close', onclose);
+ }
+
+ var didOnEnd = false;
+ function onend() {
+ if (didOnEnd) return;
+ didOnEnd = true;
+
+ dest.end();
+ }
+
+
+ function onclose() {
+ if (didOnEnd) return;
+ didOnEnd = true;
+
+ if (typeof dest.destroy === 'function') dest.destroy();
+ }
+
+ // don't leave dangling pipes when there are errors.
+ function onerror(er) {
+ cleanup();
+ if (EE.listenerCount(this, 'error') === 0) {
+ throw er; // Unhandled stream error in pipe.
+ }
+ }
+
+ source.on('error', onerror);
+ dest.on('error', onerror);
+
+ // remove all the event listeners that were added.
+ function cleanup() {
+ source.removeListener('data', ondata);
+ dest.removeListener('drain', ondrain);
+
+ source.removeListener('end', onend);
+ source.removeListener('close', onclose);
+
+ source.removeListener('error', onerror);
+ dest.removeListener('error', onerror);
+
+ source.removeListener('end', cleanup);
+ source.removeListener('close', cleanup);
+
+ dest.removeListener('close', cleanup);
+ }
+
+ source.on('end', cleanup);
+ source.on('close', cleanup);
+
+ dest.on('close', cleanup);
+
+ dest.emit('pipe', source);
+
+ // Allow for unix-like usage: A.pipe(B).pipe(C)
+ return dest;
+};
+
+},{"events":62,"inherits":66,"readable-stream/duplex.js":83,"readable-stream/passthrough.js":91,"readable-stream/readable.js":92,"readable-stream/transform.js":93,"readable-stream/writable.js":94}],97:[function(require,module,exports){
+'use strict';
+
+var Buffer = require('safe-buffer').Buffer;
+
+var isEncoding = Buffer.isEncoding || function (encoding) {
+ encoding = '' + encoding;
+ switch (encoding && encoding.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 true;
+ default:
+ return false;
+ }
+};
+
+function _normalizeEncoding(enc) {
+ if (!enc) return 'utf8';
+ var retried;
+ while (true) {
+ switch (enc) {
+ 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 enc;
+ default:
+ if (retried) return; // undefined
+ enc = ('' + enc).toLowerCase();
+ retried = true;
+ }
+ }
+};
+
+// Do not cache `Buffer.isEncoding` when checking encoding names as some
+// modules monkey-patch it to support additional encodings
+function normalizeEncoding(enc) {
+ var nenc = _normalizeEncoding(enc);
+ if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);
+ return nenc || enc;
+}
+
+// StringDecoder provides an interface for efficiently splitting a series of
+// buffers into a series of JS strings without breaking apart multi-byte
+// characters.
+exports.StringDecoder = StringDecoder;
+function StringDecoder(encoding) {
+ this.encoding = normalizeEncoding(encoding);
+ var nb;
+ switch (this.encoding) {
+ case 'utf16le':
+ this.text = utf16Text;
+ this.end = utf16End;
+ nb = 4;
+ break;
+ case 'utf8':
+ this.fillLast = utf8FillLast;
+ nb = 4;
+ break;
+ case 'base64':
+ this.text = base64Text;
+ this.end = base64End;
+ nb = 3;
+ break;
+ default:
+ this.write = simpleWrite;
+ this.end = simpleEnd;
+ return;
+ }
+ this.lastNeed = 0;
+ this.lastTotal = 0;
+ this.lastChar = Buffer.allocUnsafe(nb);
+}
+
+StringDecoder.prototype.write = function (buf) {
+ if (buf.length === 0) return '';
+ var r;
+ var i;
+ if (this.lastNeed) {
+ r = this.fillLast(buf);
+ if (r === undefined) return '';
+ i = this.lastNeed;
+ this.lastNeed = 0;
+ } else {
+ i = 0;
+ }
+ if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
+ return r || '';
+};
+
+StringDecoder.prototype.end = utf8End;
+
+// Returns only complete characters in a Buffer
+StringDecoder.prototype.text = utf8Text;
+
+// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
+StringDecoder.prototype.fillLast = function (buf) {
+ if (this.lastNeed <= buf.length) {
+ buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
+ return this.lastChar.toString(this.encoding, 0, this.lastTotal);
+ }
+ buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
+ this.lastNeed -= buf.length;
+};
+
+// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
+// continuation byte.
+function utf8CheckByte(byte) {
+ if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
+ return -1;
+}
+
+// Checks at most 3 bytes at the end of a Buffer in order to detect an
+// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
+// needed to complete the UTF-8 character (if applicable) are returned.
+function utf8CheckIncomplete(self, buf, i) {
+ var j = buf.length - 1;
+ if (j < i) return 0;
+ var nb = utf8CheckByte(buf[j]);
+ if (nb >= 0) {
+ if (nb > 0) self.lastNeed = nb - 1;
+ return nb;
+ }
+ if (--j < i) return 0;
+ nb = utf8CheckByte(buf[j]);
+ if (nb >= 0) {
+ if (nb > 0) self.lastNeed = nb - 2;
+ return nb;
+ }
+ if (--j < i) return 0;
+ nb = utf8CheckByte(buf[j]);
+ if (nb >= 0) {
+ if (nb > 0) {
+ if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
+ }
+ return nb;
+ }
+ return 0;
+}
+
+// Validates as many continuation bytes for a multi-byte UTF-8 character as
+// needed or are available. If we see a non-continuation byte where we expect
+// one, we "replace" the validated continuation bytes we've seen so far with
+// UTF-8 replacement characters ('\ufffd'), to match v8's UTF-8 decoding
+// behavior. The continuation byte check is included three times in the case
+// where all of the continuation bytes for a character exist in the same buffer.
+// It is also done this way as a slight performance increase instead of using a
+// loop.
+function utf8CheckExtraBytes(self, buf, p) {
+ if ((buf[0] & 0xC0) !== 0x80) {
+ self.lastNeed = 0;
+ return '\ufffd'.repeat(p);
+ }
+ if (self.lastNeed > 1 && buf.length > 1) {
+ if ((buf[1] & 0xC0) !== 0x80) {
+ self.lastNeed = 1;
+ return '\ufffd'.repeat(p + 1);
+ }
+ if (self.lastNeed > 2 && buf.length > 2) {
+ if ((buf[2] & 0xC0) !== 0x80) {
+ self.lastNeed = 2;
+ return '\ufffd'.repeat(p + 2);
+ }
+ }
+ }
+}
+
+// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
+function utf8FillLast(buf) {
+ var p = this.lastTotal - this.lastNeed;
+ var r = utf8CheckExtraBytes(this, buf, p);
+ if (r !== undefined) return r;
+ if (this.lastNeed <= buf.length) {
+ buf.copy(this.lastChar, p, 0, this.lastNeed);
+ return this.lastChar.toString(this.encoding, 0, this.lastTotal);
+ }
+ buf.copy(this.lastChar, p, 0, buf.length);
+ this.lastNeed -= buf.length;
+}
+
+// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
+// partial character, the character's bytes are buffered until the required
+// number of bytes are available.
+function utf8Text(buf, i) {
+ var total = utf8CheckIncomplete(this, buf, i);
+ if (!this.lastNeed) return buf.toString('utf8', i);
+ this.lastTotal = total;
+ var end = buf.length - (total - this.lastNeed);
+ buf.copy(this.lastChar, 0, end);
+ return buf.toString('utf8', i, end);
+}
+
+// For UTF-8, a replacement character for each buffered byte of a (partial)
+// character needs to be added to the output.
+function utf8End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+ if (this.lastNeed) return r + '\ufffd'.repeat(this.lastTotal - this.lastNeed);
+ return r;
+}
+
+// UTF-16LE typically needs two bytes per character, but even if we have an even
+// number of bytes available, we need to check if we end on a leading/high
+// surrogate. In that case, we need to wait for the next two bytes in order to
+// decode the last character properly.
+function utf16Text(buf, i) {
+ if ((buf.length - i) % 2 === 0) {
+ var r = buf.toString('utf16le', i);
+ if (r) {
+ var c = r.charCodeAt(r.length - 1);
+ if (c >= 0xD800 && c <= 0xDBFF) {
+ this.lastNeed = 2;
+ this.lastTotal = 4;
+ this.lastChar[0] = buf[buf.length - 2];
+ this.lastChar[1] = buf[buf.length - 1];
+ return r.slice(0, -1);
+ }
+ }
+ return r;
+ }
+ this.lastNeed = 1;
+ this.lastTotal = 2;
+ this.lastChar[0] = buf[buf.length - 1];
+ return buf.toString('utf16le', i, buf.length - 1);
+}
+
+// For UTF-16LE we do not explicitly append special replacement characters if we
+// end on a partial character, we simply let v8 handle that.
+function utf16End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+ if (this.lastNeed) {
+ var end = this.lastTotal - this.lastNeed;
+ return r + this.lastChar.toString('utf16le', 0, end);
+ }
+ return r;
+}
+
+function base64Text(buf, i) {
+ var n = (buf.length - i) % 3;
+ if (n === 0) return buf.toString('base64', i);
+ this.lastNeed = 3 - n;
+ this.lastTotal = 3;
+ if (n === 1) {
+ this.lastChar[0] = buf[buf.length - 1];
+ } else {
+ this.lastChar[0] = buf[buf.length - 2];
+ this.lastChar[1] = buf[buf.length - 1];
+ }
+ return buf.toString('base64', i, buf.length - n);
+}
+
+function base64End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+ if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
+ return r;
+}
+
+// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
+function simpleWrite(buf) {
+ return buf.toString(this.encoding);
+}
+
+function simpleEnd(buf) {
+ return buf && buf.length ? this.write(buf) : '';
+}
+},{"safe-buffer":98}],98:[function(require,module,exports){
+/* eslint-disable node/no-deprecated-api */
+var buffer = require('buffer')
+var Buffer = buffer.Buffer
+
+// alternative to using Object.keys for old browsers
+function copyProps (src, dst) {
+ for (var key in src) {
+ dst[key] = src[key]
+ }
+}
+if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
+ module.exports = buffer
+} else {
+ // Copy properties from require('buffer')
+ copyProps(buffer, exports)
+ exports.Buffer = SafeBuffer
+}
+
+function SafeBuffer (arg, encodingOrOffset, length) {
+ return Buffer(arg, encodingOrOffset, length)
+}
+
+// Copy static methods from Buffer
+copyProps(Buffer, SafeBuffer)
+
+SafeBuffer.from = function (arg, encodingOrOffset, length) {
+ if (typeof arg === 'number') {
+ throw new TypeError('Argument must not be a number')
+ }
+ return Buffer(arg, encodingOrOffset, length)
+}
+
+SafeBuffer.alloc = function (size, fill, encoding) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number')
+ }
+ var buf = Buffer(size)
+ if (fill !== undefined) {
+ if (typeof encoding === 'string') {
+ buf.fill(fill, encoding)
+ } else {
+ buf.fill(fill)
+ }
+ } else {
+ buf.fill(0)
+ }
+ return buf
+}
+
+SafeBuffer.allocUnsafe = function (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number')
+ }
+ return Buffer(size)
+}
+
+SafeBuffer.allocUnsafeSlow = function (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number')
+ }
+ return buffer.SlowBuffer(size)
+}
+
+},{"buffer":43}],99:[function(require,module,exports){
+(function (global){
+
+/**
+ * Module exports.
+ */
+
+module.exports = deprecate;
+
+/**
+ * Mark that a method should not be used.
+ * Returns a modified function which warns once by default.
+ *
+ * If `localStorage.noDeprecation = true` is set, then it is a no-op.
+ *
+ * If `localStorage.throwDeprecation = true` is set, then deprecated functions
+ * will throw an Error when invoked.
+ *
+ * If `localStorage.traceDeprecation = true` is set, then deprecated functions
+ * will invoke `console.trace()` instead of `console.error()`.
+ *
+ * @param {Function} fn - the function to deprecate
+ * @param {String} msg - the string to print to the console when `fn` is invoked
+ * @returns {Function} a new "deprecated" version of `fn`
+ * @api public
+ */
+
+function deprecate (fn, msg) {
+ if (config('noDeprecation')) {
+ return fn;
+ }
+
+ var warned = false;
+ function deprecated() {
+ if (!warned) {
+ if (config('throwDeprecation')) {
+ throw new Error(msg);
+ } else if (config('traceDeprecation')) {
+ console.trace(msg);
+ } else {
+ console.warn(msg);
+ }
+ warned = true;
+ }
+ return fn.apply(this, arguments);
+ }
+
+ return deprecated;
+}
+
+/**
+ * Checks `localStorage` for boolean values for the given `name`.
+ *
+ * @param {String} name
+ * @returns {Boolean}
+ * @api private
+ */
+
+function config (name) {
+ // accessing global.localStorage can trigger a DOMException in sandboxed iframes
+ try {
+ if (!global.localStorage) return false;
+ } catch (_) {
+ return false;
+ }
+ var val = global.localStorage[name];
+ if (null == val) return false;
+ return String(val).toLowerCase() === 'true';
+}
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],100:[function(require,module,exports){
+arguments[4][66][0].apply(exports,arguments)
+},{"dup":66}],101:[function(require,module,exports){
+module.exports = function isBuffer(arg) {
+ return arg && typeof arg === 'object'
+ && typeof arg.copy === 'function'
+ && typeof arg.fill === 'function'
+ && typeof arg.readUInt8 === 'function';
+}
+},{}],102:[function(require,module,exports){
+(function (process,global){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var formatRegExp = /%[sdj%]/g;
+exports.format = function(f) {
+ if (!isString(f)) {
+ var objects = [];
+ for (var i = 0; i < arguments.length; i++) {
+ objects.push(inspect(arguments[i]));
+ }
+ return objects.join(' ');
+ }
+
+ var i = 1;
+ var args = arguments;
+ var len = args.length;
+ var str = String(f).replace(formatRegExp, function(x) {
+ if (x === '%%') return '%';
+ if (i >= len) return x;
+ switch (x) {
+ case '%s': return String(args[i++]);
+ case '%d': return Number(args[i++]);
+ case '%j':
+ try {
+ return JSON.stringify(args[i++]);
+ } catch (_) {
+ return '[Circular]';
+ }
+ default:
+ return x;
+ }
+ });
+ for (var x = args[i]; i < len; x = args[++i]) {
+ if (isNull(x) || !isObject(x)) {
+ str += ' ' + x;
+ } else {
+ str += ' ' + inspect(x);
+ }
+ }
+ return str;
+};
+
+
+// Mark that a method should not be used.
+// Returns a modified function which warns once by default.
+// If --no-deprecation is set, then it is a no-op.
+exports.deprecate = function(fn, msg) {
+ // Allow for deprecating things in the process of starting up.
+ if (isUndefined(global.process)) {
+ return function() {
+ return exports.deprecate(fn, msg).apply(this, arguments);
+ };
+ }
+
+ if (process.noDeprecation === true) {
+ return fn;
+ }
+
+ var warned = false;
+ function deprecated() {
+ if (!warned) {
+ if (process.throwDeprecation) {
+ throw new Error(msg);
+ } else if (process.traceDeprecation) {
+ console.trace(msg);
+ } else {
+ console.error(msg);
+ }
+ warned = true;
+ }
+ return fn.apply(this, arguments);
+ }
+
+ return deprecated;
+};
+
+
+var debugs = {};
+var debugEnviron;
+exports.debuglog = function(set) {
+ if (isUndefined(debugEnviron))
+ debugEnviron = process.env.NODE_DEBUG || '';
+ set = set.toUpperCase();
+ if (!debugs[set]) {
+ if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
+ var pid = process.pid;
+ debugs[set] = function() {
+ var msg = exports.format.apply(exports, arguments);
+ console.error('%s %d: %s', set, pid, msg);
+ };
+ } else {
+ debugs[set] = function() {};
+ }
+ }
+ return debugs[set];
+};
+
+
+/**
+ * Echos the value of a value. Trys to print the value out
+ * in the best way possible given the different types.
+ *
+ * @param {Object} obj The object to print out.
+ * @param {Object} opts Optional options object that alters the output.
+ */
+/* legacy: obj, showHidden, depth, colors*/
+function inspect(obj, opts) {
+ // default options
+ var ctx = {
+ seen: [],
+ stylize: stylizeNoColor
+ };
+ // legacy...
+ if (arguments.length >= 3) ctx.depth = arguments[2];
+ if (arguments.length >= 4) ctx.colors = arguments[3];
+ if (isBoolean(opts)) {
+ // legacy...
+ ctx.showHidden = opts;
+ } else if (opts) {
+ // got an "options" object
+ exports._extend(ctx, opts);
+ }
+ // set default options
+ if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
+ if (isUndefined(ctx.depth)) ctx.depth = 2;
+ if (isUndefined(ctx.colors)) ctx.colors = false;
+ if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
+ if (ctx.colors) ctx.stylize = stylizeWithColor;
+ return formatValue(ctx, obj, ctx.depth);
+}
+exports.inspect = inspect;
+
+
+// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
+inspect.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]
+};
+
+// Don't use 'blue' not visible on cmd.exe
+inspect.styles = {
+ 'special': 'cyan',
+ 'number': 'yellow',
+ 'boolean': 'yellow',
+ 'undefined': 'grey',
+ 'null': 'bold',
+ 'string': 'green',
+ 'date': 'magenta',
+ // "name": intentionally not styling
+ 'regexp': 'red'
+};
+
+
+function stylizeWithColor(str, styleType) {
+ var style = inspect.styles[styleType];
+
+ if (style) {
+ return '\u001b[' + inspect.colors[style][0] + 'm' + str +
+ '\u001b[' + inspect.colors[style][1] + 'm';
+ } else {
+ return str;
+ }
+}
+
+
+function stylizeNoColor(str, styleType) {
+ return str;
+}
+
+
+function arrayToHash(array) {
+ var hash = {};
+
+ array.forEach(function(val, idx) {
+ hash[val] = true;
+ });
+
+ return hash;
+}
+
+
+function formatValue(ctx, value, recurseTimes) {
+ // Provide a hook for user-specified inspect functions.
+ // Check that value is an object with an inspect function on it
+ if (ctx.customInspect &&
+ value &&
+ isFunction(value.inspect) &&
+ // Filter out the util module, it's inspect function is special
+ value.inspect !== exports.inspect &&
+ // Also filter out any prototype objects using the circular check.
+ !(value.constructor && value.constructor.prototype === value)) {
+ var ret = value.inspect(recurseTimes, ctx);
+ if (!isString(ret)) {
+ ret = formatValue(ctx, ret, recurseTimes);
+ }
+ return ret;
+ }
+
+ // Primitive types cannot have properties
+ var primitive = formatPrimitive(ctx, value);
+ if (primitive) {
+ return primitive;
+ }
+
+ // Look up the keys of the object.
+ var keys = Object.keys(value);
+ var visibleKeys = arrayToHash(keys);
+
+ if (ctx.showHidden) {
+ keys = Object.getOwnPropertyNames(value);
+ }
+
+ // IE doesn't make error fields non-enumerable
+ // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
+ if (isError(value)
+ && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
+ return formatError(value);
+ }
+
+ // Some type of object without properties can be shortcutted.
+ if (keys.length === 0) {
+ if (isFunction(value)) {
+ var name = value.name ? ': ' + value.name : '';
+ return ctx.stylize('[Function' + name + ']', 'special');
+ }
+ if (isRegExp(value)) {
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+ }
+ if (isDate(value)) {
+ return ctx.stylize(Date.prototype.toString.call(value), 'date');
+ }
+ if (isError(value)) {
+ return formatError(value);
+ }
+ }
+
+ var base = '', array = false, braces = ['{', '}'];
+
+ // Make Array say that they are Array
+ if (isArray(value)) {
+ array = true;
+ braces = ['[', ']'];
+ }
+
+ // Make functions say that they are functions
+ if (isFunction(value)) {
+ var n = value.name ? ': ' + value.name : '';
+ base = ' [Function' + n + ']';
+ }
+
+ // Make RegExps say that they are RegExps
+ if (isRegExp(value)) {
+ base = ' ' + RegExp.prototype.toString.call(value);
+ }
+
+ // Make dates with properties first say the date
+ if (isDate(value)) {
+ base = ' ' + Date.prototype.toUTCString.call(value);
+ }
+
+ // Make error with message first say the error
+ if (isError(value)) {
+ base = ' ' + formatError(value);
+ }
+
+ if (keys.length === 0 && (!array || value.length == 0)) {
+ return braces[0] + base + braces[1];
+ }
+
+ if (recurseTimes < 0) {
+ if (isRegExp(value)) {
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+ } else {
+ return ctx.stylize('[Object]', 'special');
+ }
+ }
+
+ ctx.seen.push(value);
+
+ var output;
+ if (array) {
+ output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
+ } else {
+ output = keys.map(function(key) {
+ return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
+ });
+ }
+
+ ctx.seen.pop();
+
+ return reduceToSingleString(output, base, braces);
+}
+
+
+function formatPrimitive(ctx, value) {
+ if (isUndefined(value))
+ return ctx.stylize('undefined', 'undefined');
+ if (isString(value)) {
+ var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
+ .replace(/'/g, "\\'")
+ .replace(/\\"/g, '"') + '\'';
+ return ctx.stylize(simple, 'string');
+ }
+ if (isNumber(value))
+ return ctx.stylize('' + value, 'number');
+ if (isBoolean(value))
+ return ctx.stylize('' + value, 'boolean');
+ // For some reason typeof null is "object", so special case here.
+ if (isNull(value))
+ return ctx.stylize('null', 'null');
+}
+
+
+function formatError(value) {
+ return '[' + Error.prototype.toString.call(value) + ']';
+}
+
+
+function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
+ var output = [];
+ for (var i = 0, l = value.length; i < l; ++i) {
+ if (hasOwnProperty(value, String(i))) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+ String(i), true));
+ } else {
+ output.push('');
+ }
+ }
+ keys.forEach(function(key) {
+ if (!key.match(/^\d+$/)) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+ key, true));
+ }
+ });
+ return output;
+}
+
+
+function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
+ var name, str, desc;
+ desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
+ if (desc.get) {
+ if (desc.set) {
+ str = ctx.stylize('[Getter/Setter]', 'special');
+ } else {
+ str = ctx.stylize('[Getter]', 'special');
+ }
+ } else {
+ if (desc.set) {
+ str = ctx.stylize('[Setter]', 'special');
+ }
+ }
+ if (!hasOwnProperty(visibleKeys, key)) {
+ name = '[' + key + ']';
+ }
+ if (!str) {
+ if (ctx.seen.indexOf(desc.value) < 0) {
+ if (isNull(recurseTimes)) {
+ str = formatValue(ctx, desc.value, null);
+ } else {
+ str = formatValue(ctx, desc.value, recurseTimes - 1);
+ }
+ if (str.indexOf('\n') > -1) {
+ if (array) {
+ str = str.split('\n').map(function(line) {
+ return ' ' + line;
+ }).join('\n').substr(2);
+ } else {
+ str = '\n' + str.split('\n').map(function(line) {
+ return ' ' + line;
+ }).join('\n');
+ }
+ }
+ } else {
+ str = ctx.stylize('[Circular]', 'special');
+ }
+ }
+ if (isUndefined(name)) {
+ if (array && key.match(/^\d+$/)) {
+ return str;
+ }
+ name = JSON.stringify('' + key);
+ if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
+ name = name.substr(1, name.length - 2);
+ name = ctx.stylize(name, 'name');
+ } else {
+ name = name.replace(/'/g, "\\'")
+ .replace(/\\"/g, '"')
+ .replace(/(^"|"$)/g, "'");
+ name = ctx.stylize(name, 'string');
+ }
+ }
+
+ return name + ': ' + str;
+}
+
+
+function reduceToSingleString(output, base, braces) {
+ var numLinesEst = 0;
+ var length = output.reduce(function(prev, cur) {
+ numLinesEst++;
+ if (cur.indexOf('\n') >= 0) numLinesEst++;
+ return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
+ }, 0);
+
+ if (length > 60) {
+ return braces[0] +
+ (base === '' ? '' : base + '\n ') +
+ ' ' +
+ output.join(',\n ') +
+ ' ' +
+ braces[1];
+ }
+
+ return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
+}
+
+
+// NOTE: These type checking functions intentionally don't use `instanceof`
+// because it is fragile and can be easily faked with `Object.create()`.
+function isArray(ar) {
+ return Array.isArray(ar);
+}
+exports.isArray = isArray;
+
+function isBoolean(arg) {
+ return typeof arg === 'boolean';
+}
+exports.isBoolean = isBoolean;
+
+function isNull(arg) {
+ return arg === null;
+}
+exports.isNull = isNull;
+
+function isNullOrUndefined(arg) {
+ return arg == null;
+}
+exports.isNullOrUndefined = isNullOrUndefined;
+
+function isNumber(arg) {
+ return typeof arg === 'number';
+}
+exports.isNumber = isNumber;
+
+function isString(arg) {
+ return typeof arg === 'string';
+}
+exports.isString = isString;
+
+function isSymbol(arg) {
+ return typeof arg === 'symbol';
+}
+exports.isSymbol = isSymbol;
+
+function isUndefined(arg) {
+ return arg === void 0;
+}
+exports.isUndefined = isUndefined;
+
+function isRegExp(re) {
+ return isObject(re) && objectToString(re) === '[object RegExp]';
+}
+exports.isRegExp = isRegExp;
+
+function isObject(arg) {
+ return typeof arg === 'object' && arg !== null;
+}
+exports.isObject = isObject;
+
+function isDate(d) {
+ return isObject(d) && objectToString(d) === '[object Date]';
+}
+exports.isDate = isDate;
+
+function isError(e) {
+ return isObject(e) &&
+ (objectToString(e) === '[object Error]' || e instanceof Error);
+}
+exports.isError = isError;
+
+function isFunction(arg) {
+ return typeof arg === 'function';
+}
+exports.isFunction = isFunction;
+
+function isPrimitive(arg) {
+ return arg === null ||
+ typeof arg === 'boolean' ||
+ typeof arg === 'number' ||
+ typeof arg === 'string' ||
+ typeof arg === 'symbol' || // ES6 symbol
+ typeof arg === 'undefined';
+}
+exports.isPrimitive = isPrimitive;
+
+exports.isBuffer = require('./support/isBuffer');
+
+function objectToString(o) {
+ return Object.prototype.toString.call(o);
+}
+
+
+function pad(n) {
+ return n < 10 ? '0' + n.toString(10) : n.toString(10);
+}
+
+
+var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
+ 'Oct', 'Nov', 'Dec'];
+
+// 26 Feb 16:19:34
+function timestamp() {
+ var d = new Date();
+ var time = [pad(d.getHours()),
+ pad(d.getMinutes()),
+ pad(d.getSeconds())].join(':');
+ return [d.getDate(), months[d.getMonth()], time].join(' ');
+}
+
+
+// log is just a thin wrapper to console.log that prepends a timestamp
+exports.log = function() {
+ console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
+};
+
+
+/**
+ * Inherit the prototype methods from one constructor into another.
+ *
+ * The Function.prototype.inherits from lang.js rewritten as a standalone
+ * function (not on Function.prototype). NOTE: If this file is to be loaded
+ * during bootstrapping this function needs to be rewritten using some native
+ * functions as prototype setup using normal JavaScript does not work as
+ * expected during bootstrapping (see mirror.js in r114903).
+ *
+ * @param {function} ctor Constructor function which needs to inherit the
+ * prototype.
+ * @param {function} superCtor Constructor function to inherit prototype from.
+ */
+exports.inherits = require('inherits');
+
+exports._extend = function(origin, add) {
+ // Don't do anything if add isn't an object
+ if (!add || !isObject(add)) return origin;
+
+ var keys = Object.keys(add);
+ var i = keys.length;
+ while (i--) {
+ origin[keys[i]] = add[keys[i]];
+ }
+ return origin;
+};
+
+function hasOwnProperty(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+}
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./support/isBuffer":101,"_process":82,"inherits":100}]},{},[1]);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/.bower.json
new file mode 100644
index 00000000000..2dba1857e37
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/.bower.json
@@ -0,0 +1,30 @@
+{
+ "name": "moment-timezone",
+ "description": "Parse and display moments in any timezone.",
+ "license": "MIT",
+ "main": "builds/moment-timezone-with-data-2012-2022.js",
+ "dependencies": {
+ "moment": ">= 2.9.0"
+ },
+ "ignore": [
+ "**/.*",
+ "tests",
+ "tasks",
+ "data/*/20*.json",
+ "contributing.md",
+ "Gruntfile.js",
+ "index.js",
+ "package.json"
+ ],
+ "homepage": "https://github.com/moment/moment-timezone",
+ "version": "0.5.17",
+ "_release": "0.5.17",
+ "_resolution": {
+ "type": "version",
+ "tag": "0.5.17",
+ "commit": "75f9e6e7bf95e363b97a4d4376325272bcf5946b"
+ },
+ "_source": "https://github.com/moment/moment-timezone.git",
+ "_target": "^0.5.10",
+ "_originalSource": "moment-timezone"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/LICENSE b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/LICENSE
new file mode 100644
index 00000000000..f0bb3b4bb46
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) JS Foundation and other contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/README.md
new file mode 100644
index 00000000000..06b2681e228
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/README.md
@@ -0,0 +1,36 @@
+# [Moment Timezone](http://momentjs.com/timezone)
+
+[![Join the chat at https://gitter.im/moment/moment-timezone](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/moment/moment-timezone?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+[![NPM version][npm-version-image]][npm-url] [![NPM downloads][npm-downloads-image]][npm-url] [![MIT License][license-image]][license-url] [![Build Status][travis-image]][travis-url]
+
+IANA Time Zone Database + [Moment.js](http://momentjs.com).
+
+```js
+var june = moment("2014-06-01T12:00:00Z");
+june.tz('America/Los_Angeles').format('ha z'); // 5am PDT
+june.tz('America/New_York').format('ha z'); // 8am EDT
+june.tz('Asia/Tokyo').format('ha z'); // 9pm JST
+june.tz('Australia/Sydney').format('ha z'); // 10pm EST
+
+var dec = moment("2014-12-01T12:00:00Z");
+dec.tz('America/Los_Angeles').format('ha z'); // 4am PST
+dec.tz('America/New_York').format('ha z'); // 7am EST
+dec.tz('Asia/Tokyo').format('ha z'); // 9pm JST
+dec.tz('Australia/Sydney').format('ha z'); // 11pm EST
+```
+
+#### [Contribute code or compile time zone data](contributing.md)
+
+#### [Read the changelog](changelog.md)
+
+
+[license-image]: http://img.shields.io/badge/license-MIT-blue.svg?style=flat
+[license-url]: LICENSE
+
+[npm-url]: https://npmjs.org/package/moment-timezone
+[npm-version-image]: http://img.shields.io/npm/v/moment-timezone.svg?style=flat
+[npm-downloads-image]: http://img.shields.io/npm/dm/moment-timezone.svg?style=flat
+
+[travis-url]: http://travis-ci.org/moment/moment-timezone
+[travis-image]: http://img.shields.io/travis/moment/moment-timezone/develop.svg?style=flat
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/bower.json
new file mode 100644
index 00000000000..041bf7d092d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/bower.json
@@ -0,0 +1,19 @@
+{
+ "name": "moment-timezone",
+ "description" : "Parse and display moments in any timezone.",
+ "license" : "MIT",
+ "main": "builds/moment-timezone-with-data-2012-2022.js",
+ "dependencies" : {
+ "moment" : ">= 2.9.0"
+ },
+ "ignore": [
+ "**/.*",
+ "tests",
+ "tasks",
+ "data/*/20*.json",
+ "contributing.md",
+ "Gruntfile.js",
+ "index.js",
+ "package.json"
+ ]
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/builds/moment-timezone-with-data-2012-2022.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/builds/moment-timezone-with-data-2012-2022.js
new file mode 100644
index 00000000000..23071c125c6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/builds/moment-timezone-with-data-2012-2022.js
@@ -0,0 +1,1204 @@
+//! moment-timezone.js
+//! version : 0.5.17
+//! Copyright (c) JS Foundation and other contributors
+//! license : MIT
+//! github.com/moment/moment-timezone
+
+(function (root, factory) {
+ "use strict";
+
+ /*global define*/
+ if (typeof define === 'function' && define.amd) {
+ define(['moment'], factory); // AMD
+ } else if (typeof module === 'object' && module.exports) {
+ module.exports = factory(require('moment')); // Node
+ } else {
+ factory(root.moment); // Browser
+ }
+}(this, function (moment) {
+ "use strict";
+
+ // Do not load moment-timezone a second time.
+ // if (moment.tz !== undefined) {
+ // logError('Moment Timezone ' + moment.tz.version + ' was already loaded ' + (moment.tz.dataVersion ? 'with data from ' : 'without any data') + moment.tz.dataVersion);
+ // return moment;
+ // }
+
+ var VERSION = "0.5.17",
+ zones = {},
+ links = {},
+ names = {},
+ guesses = {},
+ cachedGuess,
+
+ momentVersion = moment.version.split('.'),
+ major = +momentVersion[0],
+ minor = +momentVersion[1];
+
+ // Moment.js version check
+ if (major < 2 || (major === 2 && minor < 6)) {
+ logError('Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js ' + moment.version + '. See momentjs.com');
+ }
+
+ /************************************
+ Unpacking
+ ************************************/
+
+ function charCodeToInt(charCode) {
+ if (charCode > 96) {
+ return charCode - 87;
+ } else if (charCode > 64) {
+ return charCode - 29;
+ }
+ return charCode - 48;
+ }
+
+ function unpackBase60(string) {
+ var i = 0,
+ parts = string.split('.'),
+ whole = parts[0],
+ fractional = parts[1] || '',
+ multiplier = 1,
+ num,
+ out = 0,
+ sign = 1;
+
+ // handle negative numbers
+ if (string.charCodeAt(0) === 45) {
+ i = 1;
+ sign = -1;
+ }
+
+ // handle digits before the decimal
+ for (i; i < whole.length; i++) {
+ num = charCodeToInt(whole.charCodeAt(i));
+ out = 60 * out + num;
+ }
+
+ // handle digits after the decimal
+ for (i = 0; i < fractional.length; i++) {
+ multiplier = multiplier / 60;
+ num = charCodeToInt(fractional.charCodeAt(i));
+ out += num * multiplier;
+ }
+
+ return out * sign;
+ }
+
+ function arrayToInt (array) {
+ for (var i = 0; i < array.length; i++) {
+ array[i] = unpackBase60(array[i]);
+ }
+ }
+
+ function intToUntil (array, length) {
+ for (var i = 0; i < length; i++) {
+ array[i] = Math.round((array[i - 1] || 0) + (array[i] * 60000)); // minutes to milliseconds
+ }
+
+ array[length - 1] = Infinity;
+ }
+
+ function mapIndices (source, indices) {
+ var out = [], i;
+
+ for (i = 0; i < indices.length; i++) {
+ out[i] = source[indices[i]];
+ }
+
+ return out;
+ }
+
+ function unpack (string) {
+ var data = string.split('|'),
+ offsets = data[2].split(' '),
+ indices = data[3].split(''),
+ untils = data[4].split(' ');
+
+ arrayToInt(offsets);
+ arrayToInt(indices);
+ arrayToInt(untils);
+
+ intToUntil(untils, indices.length);
+
+ return {
+ name : data[0],
+ abbrs : mapIndices(data[1].split(' '), indices),
+ offsets : mapIndices(offsets, indices),
+ untils : untils,
+ population : data[5] | 0
+ };
+ }
+
+ /************************************
+ Zone object
+ ************************************/
+
+ function Zone (packedString) {
+ if (packedString) {
+ this._set(unpack(packedString));
+ }
+ }
+
+ Zone.prototype = {
+ _set : function (unpacked) {
+ this.name = unpacked.name;
+ this.abbrs = unpacked.abbrs;
+ this.untils = unpacked.untils;
+ this.offsets = unpacked.offsets;
+ this.population = unpacked.population;
+ },
+
+ _index : function (timestamp) {
+ var target = +timestamp,
+ untils = this.untils,
+ i;
+
+ for (i = 0; i < untils.length; i++) {
+ if (target < untils[i]) {
+ return i;
+ }
+ }
+ },
+
+ parse : function (timestamp) {
+ var target = +timestamp,
+ offsets = this.offsets,
+ untils = this.untils,
+ max = untils.length - 1,
+ offset, offsetNext, offsetPrev, i;
+
+ for (i = 0; i < max; i++) {
+ offset = offsets[i];
+ offsetNext = offsets[i + 1];
+ offsetPrev = offsets[i ? i - 1 : i];
+
+ if (offset < offsetNext && tz.moveAmbiguousForward) {
+ offset = offsetNext;
+ } else if (offset > offsetPrev && tz.moveInvalidForward) {
+ offset = offsetPrev;
+ }
+
+ if (target < untils[i] - (offset * 60000)) {
+ return offsets[i];
+ }
+ }
+
+ return offsets[max];
+ },
+
+ abbr : function (mom) {
+ return this.abbrs[this._index(mom)];
+ },
+
+ offset : function (mom) {
+ logError("zone.offset has been deprecated in favor of zone.utcOffset");
+ return this.offsets[this._index(mom)];
+ },
+
+ utcOffset : function (mom) {
+ return this.offsets[this._index(mom)];
+ }
+ };
+
+ /************************************
+ Current Timezone
+ ************************************/
+
+ function OffsetAt(at) {
+ var timeString = at.toTimeString();
+ var abbr = timeString.match(/\([a-z ]+\)/i);
+ if (abbr && abbr[0]) {
+ // 17:56:31 GMT-0600 (CST)
+ // 17:56:31 GMT-0600 (Central Standard Time)
+ abbr = abbr[0].match(/[A-Z]/g);
+ abbr = abbr ? abbr.join('') : undefined;
+ } else {
+ // 17:56:31 CST
+ // 17:56:31 GMT+0800 (台北標準時間)
+ abbr = timeString.match(/[A-Z]{3,5}/g);
+ abbr = abbr ? abbr[0] : undefined;
+ }
+
+ if (abbr === 'GMT') {
+ abbr = undefined;
+ }
+
+ this.at = +at;
+ this.abbr = abbr;
+ this.offset = at.getTimezoneOffset();
+ }
+
+ function ZoneScore(zone) {
+ this.zone = zone;
+ this.offsetScore = 0;
+ this.abbrScore = 0;
+ }
+
+ ZoneScore.prototype.scoreOffsetAt = function (offsetAt) {
+ this.offsetScore += Math.abs(this.zone.utcOffset(offsetAt.at) - offsetAt.offset);
+ if (this.zone.abbr(offsetAt.at).replace(/[^A-Z]/g, '') !== offsetAt.abbr) {
+ this.abbrScore++;
+ }
+ };
+
+ function findChange(low, high) {
+ var mid, diff;
+
+ while ((diff = ((high.at - low.at) / 12e4 | 0) * 6e4)) {
+ mid = new OffsetAt(new Date(low.at + diff));
+ if (mid.offset === low.offset) {
+ low = mid;
+ } else {
+ high = mid;
+ }
+ }
+
+ return low;
+ }
+
+ function userOffsets() {
+ var startYear = new Date().getFullYear() - 2,
+ last = new OffsetAt(new Date(startYear, 0, 1)),
+ offsets = [last],
+ change, next, i;
+
+ for (i = 1; i < 48; i++) {
+ next = new OffsetAt(new Date(startYear, i, 1));
+ if (next.offset !== last.offset) {
+ change = findChange(last, next);
+ offsets.push(change);
+ offsets.push(new OffsetAt(new Date(change.at + 6e4)));
+ }
+ last = next;
+ }
+
+ for (i = 0; i < 4; i++) {
+ offsets.push(new OffsetAt(new Date(startYear + i, 0, 1)));
+ offsets.push(new OffsetAt(new Date(startYear + i, 6, 1)));
+ }
+
+ return offsets;
+ }
+
+ function sortZoneScores (a, b) {
+ if (a.offsetScore !== b.offsetScore) {
+ return a.offsetScore - b.offsetScore;
+ }
+ if (a.abbrScore !== b.abbrScore) {
+ return a.abbrScore - b.abbrScore;
+ }
+ return b.zone.population - a.zone.population;
+ }
+
+ function addToGuesses (name, offsets) {
+ var i, offset;
+ arrayToInt(offsets);
+ for (i = 0; i < offsets.length; i++) {
+ offset = offsets[i];
+ guesses[offset] = guesses[offset] || {};
+ guesses[offset][name] = true;
+ }
+ }
+
+ function guessesForUserOffsets (offsets) {
+ var offsetsLength = offsets.length,
+ filteredGuesses = {},
+ out = [],
+ i, j, guessesOffset;
+
+ for (i = 0; i < offsetsLength; i++) {
+ guessesOffset = guesses[offsets[i].offset] || {};
+ for (j in guessesOffset) {
+ if (guessesOffset.hasOwnProperty(j)) {
+ filteredGuesses[j] = true;
+ }
+ }
+ }
+
+ for (i in filteredGuesses) {
+ if (filteredGuesses.hasOwnProperty(i)) {
+ out.push(names[i]);
+ }
+ }
+
+ return out;
+ }
+
+ function rebuildGuess () {
+
+ // use Intl API when available and returning valid time zone
+ try {
+ var intlName = Intl.DateTimeFormat().resolvedOptions().timeZone;
+ if (intlName && intlName.length > 3) {
+ var name = names[normalizeName(intlName)];
+ if (name) {
+ return name;
+ }
+ logError("Moment Timezone found " + intlName + " from the Intl api, but did not have that data loaded.");
+ }
+ } catch (e) {
+ // Intl unavailable, fall back to manual guessing.
+ }
+
+ var offsets = userOffsets(),
+ offsetsLength = offsets.length,
+ guesses = guessesForUserOffsets(offsets),
+ zoneScores = [],
+ zoneScore, i, j;
+
+ for (i = 0; i < guesses.length; i++) {
+ zoneScore = new ZoneScore(getZone(guesses[i]), offsetsLength);
+ for (j = 0; j < offsetsLength; j++) {
+ zoneScore.scoreOffsetAt(offsets[j]);
+ }
+ zoneScores.push(zoneScore);
+ }
+
+ zoneScores.sort(sortZoneScores);
+
+ return zoneScores.length > 0 ? zoneScores[0].zone.name : undefined;
+ }
+
+ function guess (ignoreCache) {
+ if (!cachedGuess || ignoreCache) {
+ cachedGuess = rebuildGuess();
+ }
+ return cachedGuess;
+ }
+
+ /************************************
+ Global Methods
+ ************************************/
+
+ function normalizeName (name) {
+ return (name || '').toLowerCase().replace(/\//g, '_');
+ }
+
+ function addZone (packed) {
+ var i, name, split, normalized;
+
+ if (typeof packed === "string") {
+ packed = [packed];
+ }
+
+ for (i = 0; i < packed.length; i++) {
+ split = packed[i].split('|');
+ name = split[0];
+ normalized = normalizeName(name);
+ zones[normalized] = packed[i];
+ names[normalized] = name;
+ addToGuesses(normalized, split[2].split(' '));
+ }
+ }
+
+ function getZone (name, caller) {
+ name = normalizeName(name);
+
+ var zone = zones[name];
+ var link;
+
+ if (zone instanceof Zone) {
+ return zone;
+ }
+
+ if (typeof zone === 'string') {
+ zone = new Zone(zone);
+ zones[name] = zone;
+ return zone;
+ }
+
+ // Pass getZone to prevent recursion more than 1 level deep
+ if (links[name] && caller !== getZone && (link = getZone(links[name], getZone))) {
+ zone = zones[name] = new Zone();
+ zone._set(link);
+ zone.name = names[name];
+ return zone;
+ }
+
+ return null;
+ }
+
+ function getNames () {
+ var i, out = [];
+
+ for (i in names) {
+ if (names.hasOwnProperty(i) && (zones[i] || zones[links[i]]) && names[i]) {
+ out.push(names[i]);
+ }
+ }
+
+ return out.sort();
+ }
+
+ function addLink (aliases) {
+ var i, alias, normal0, normal1;
+
+ if (typeof aliases === "string") {
+ aliases = [aliases];
+ }
+
+ for (i = 0; i < aliases.length; i++) {
+ alias = aliases[i].split('|');
+
+ normal0 = normalizeName(alias[0]);
+ normal1 = normalizeName(alias[1]);
+
+ links[normal0] = normal1;
+ names[normal0] = alias[0];
+
+ links[normal1] = normal0;
+ names[normal1] = alias[1];
+ }
+ }
+
+ function loadData (data) {
+ addZone(data.zones);
+ addLink(data.links);
+ tz.dataVersion = data.version;
+ }
+
+ function zoneExists (name) {
+ if (!zoneExists.didShowError) {
+ zoneExists.didShowError = true;
+ logError("moment.tz.zoneExists('" + name + "') has been deprecated in favor of !moment.tz.zone('" + name + "')");
+ }
+ return !!getZone(name);
+ }
+
+ function needsOffset (m) {
+ var isUnixTimestamp = (m._f === 'X' || m._f === 'x');
+ return !!(m._a && (m._tzm === undefined) && !isUnixTimestamp);
+ }
+
+ function logError (message) {
+ if (typeof console !== 'undefined' && typeof console.error === 'function') {
+ console.error(message);
+ }
+ }
+
+ /************************************
+ moment.tz namespace
+ ************************************/
+
+ function tz (input) {
+ var args = Array.prototype.slice.call(arguments, 0, -1),
+ name = arguments[arguments.length - 1],
+ zone = getZone(name),
+ out = moment.utc.apply(null, args);
+
+ if (zone && !moment.isMoment(input) && needsOffset(out)) {
+ out.add(zone.parse(out), 'minutes');
+ }
+
+ out.tz(name);
+
+ return out;
+ }
+
+ tz.version = VERSION;
+ tz.dataVersion = '';
+ tz._zones = zones;
+ tz._links = links;
+ tz._names = names;
+ tz.add = addZone;
+ tz.link = addLink;
+ tz.load = loadData;
+ tz.zone = getZone;
+ tz.zoneExists = zoneExists; // deprecated in 0.1.0
+ tz.guess = guess;
+ tz.names = getNames;
+ tz.Zone = Zone;
+ tz.unpack = unpack;
+ tz.unpackBase60 = unpackBase60;
+ tz.needsOffset = needsOffset;
+ tz.moveInvalidForward = true;
+ tz.moveAmbiguousForward = false;
+
+ /************************************
+ Interface with Moment.js
+ ************************************/
+
+ var fn = moment.fn;
+
+ moment.tz = tz;
+
+ moment.defaultZone = null;
+
+ moment.updateOffset = function (mom, keepTime) {
+ var zone = moment.defaultZone,
+ offset;
+
+ if (mom._z === undefined) {
+ if (zone && needsOffset(mom) && !mom._isUTC) {
+ mom._d = moment.utc(mom._a)._d;
+ mom.utc().add(zone.parse(mom), 'minutes');
+ }
+ mom._z = zone;
+ }
+ if (mom._z) {
+ offset = mom._z.utcOffset(mom);
+ if (Math.abs(offset) < 16) {
+ offset = offset / 60;
+ }
+ if (mom.utcOffset !== undefined) {
+ mom.utcOffset(-offset, keepTime);
+ } else {
+ mom.zone(offset, keepTime);
+ }
+ }
+ };
+
+ fn.tz = function (name, keepTime) {
+ if (name) {
+ this._z = getZone(name);
+ if (this._z) {
+ moment.updateOffset(this, keepTime);
+ } else {
+ logError("Moment Timezone has no data for " + name + ". See http://momentjs.com/timezone/docs/#/data-loading/.");
+ }
+ return this;
+ }
+ if (this._z) { return this._z.name; }
+ };
+
+ function abbrWrap (old) {
+ return function () {
+ if (this._z) { return this._z.abbr(this); }
+ return old.call(this);
+ };
+ }
+
+ function resetZoneWrap (old) {
+ return function () {
+ this._z = null;
+ return old.apply(this, arguments);
+ };
+ }
+
+ fn.zoneName = abbrWrap(fn.zoneName);
+ fn.zoneAbbr = abbrWrap(fn.zoneAbbr);
+ fn.utc = resetZoneWrap(fn.utc);
+
+ moment.tz.setDefault = function(name) {
+ if (major < 2 || (major === 2 && minor < 9)) {
+ logError('Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js ' + moment.version + '.');
+ }
+ moment.defaultZone = name ? getZone(name) : null;
+ return moment;
+ };
+
+ // Cloning a moment should include the _z property.
+ var momentProperties = moment.momentProperties;
+ if (Object.prototype.toString.call(momentProperties) === '[object Array]') {
+ // moment 2.8.1+
+ momentProperties.push('_z');
+ momentProperties.push('_a');
+ } else if (momentProperties) {
+ // moment 2.7.0
+ momentProperties._z = null;
+ }
+
+ loadData({
+ "version": "2018e",
+ "zones": [
+ "Africa/Abidjan|GMT|0|0||48e5",
+ "Africa/Nairobi|EAT|-30|0||47e5",
+ "Africa/Algiers|CET|-10|0||26e5",
+ "Africa/Lagos|WAT|-10|0||17e6",
+ "Africa/Maputo|CAT|-20|0||26e5",
+ "Africa/Cairo|EET EEST|-20 -30|01010|1M2m0 gL0 e10 mn0|15e6",
+ "Africa/Casablanca|WET WEST|0 -10|0101010101010101010101010101010101010101010|1H3C0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 Rc0 11A0 e00 e00 U00 11A0 8o0 e00 11A0 11A0 5A0 e00 17c0 1fA0 1a00|32e5",
+ "Europe/Paris|CET CEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|11e6",
+ "Africa/Johannesburg|SAST|-20|0||84e5",
+ "Africa/Khartoum|EAT CAT|-30 -20|01|1Usl0|51e5",
+ "Africa/Sao_Tome|GMT WAT|0 -10|01|1UQN0",
+ "Africa/Tripoli|EET CET CEST|-20 -10 -20|0120|1IlA0 TA0 1o00|11e5",
+ "Africa/Windhoek|CAT WAT|-20 -10|0101010101010|1GQo0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|32e4",
+ "America/Adak|HST HDT|a0 90|01010101010101010101010|1GIc0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|326",
+ "America/Anchorage|AKST AKDT|90 80|01010101010101010101010|1GIb0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|30e4",
+ "America/Santo_Domingo|AST|40|0||29e5",
+ "America/Araguaina|-03 -02|30 20|010|1IdD0 Lz0|14e4",
+ "America/Fortaleza|-03|30|0||34e5",
+ "America/Asuncion|-03 -04|30 40|01010101010101010101010|1GTf0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0|28e5",
+ "America/Panama|EST|50|0||15e5",
+ "America/Mexico_City|CST CDT|60 50|01010101010101010101010|1GQw0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0|20e6",
+ "America/Bahia|-02 -03|20 30|01|1GCq0|27e5",
+ "America/Managua|CST|60|0||22e5",
+ "America/La_Paz|-04|40|0||19e5",
+ "America/Lima|-05|50|0||11e6",
+ "America/Denver|MST MDT|70 60|01010101010101010101010|1GI90 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|26e5",
+ "America/Campo_Grande|-03 -04|30 40|01010101010101010101010|1GCr0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0|77e4",
+ "America/Cancun|CST CDT EST|60 50 50|01010102|1GQw0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4",
+ "America/Caracas|-0430 -04|4u 40|01|1QMT0|29e5",
+ "America/Chicago|CST CDT|60 50|01010101010101010101010|1GI80 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|92e5",
+ "America/Chihuahua|MST MDT|70 60|01010101010101010101010|1GQx0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0|81e4",
+ "America/Phoenix|MST|70|0||42e5",
+ "America/Los_Angeles|PST PDT|80 70|01010101010101010101010|1GIa0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|15e6",
+ "America/New_York|EST EDT|50 40|01010101010101010101010|1GI70 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|21e6",
+ "America/Rio_Branco|-04 -05|40 50|01|1KLE0|31e4",
+ "America/Fort_Nelson|PST PDT MST|80 70 70|01010102|1GIa0 1zb0 Op0 1zb0 Op0 1zb0 Op0|39e2",
+ "America/Halifax|AST ADT|40 30|01010101010101010101010|1GI60 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|39e4",
+ "America/Godthab|-03 -02|30 20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|17e3",
+ "America/Grand_Turk|EST EDT AST|50 40 40|0101010121010101010|1GI70 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 5Ip0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|37e2",
+ "America/Havana|CST CDT|50 40|01010101010101010101010|1GQt0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0|21e5",
+ "America/Metlakatla|PST AKST AKDT|80 90 80|0121212121212121|1PAa0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|14e2",
+ "America/Miquelon|-03 -02|30 20|01010101010101010101010|1GI50 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|61e2",
+ "America/Montevideo|-02 -03|20 30|01010101|1GI40 1o10 11z0 1o10 11z0 1o10 11z0|17e5",
+ "America/Noronha|-02|20|0||30e2",
+ "America/Port-au-Prince|EST EDT|50 40|010101010101010101010|1GI70 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 3iN0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|23e5",
+ "Antarctica/Palmer|-03 -04|30 40|010101010|1H3D0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|40",
+ "America/Santiago|-03 -04|30 40|010101010101010101010|1H3D0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0|62e5",
+ "America/Sao_Paulo|-02 -03|20 30|01010101010101010101010|1GCq0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0|20e6",
+ "Atlantic/Azores|-01 +00|10 0|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|25e4",
+ "America/St_Johns|NST NDT|3u 2u|01010101010101010101010|1GI5u 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|11e4",
+ "Antarctica/Casey|+11 +08|-b0 -80|0101|1GAF0 blz0 3m10|10",
+ "Antarctica/Davis|+05 +07|-50 -70|01|1GAI0|70",
+ "Pacific/Port_Moresby|+10|-a0|0||25e4",
+ "Pacific/Guadalcanal|+11|-b0|0||11e4",
+ "Asia/Tashkent|+05|-50|0||23e5",
+ "Pacific/Auckland|NZDT NZST|-d0 -c0|01010101010101010101010|1GQe0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00|14e5",
+ "Asia/Baghdad|+03|-30|0||66e5",
+ "Antarctica/Troll|+00 +02|0 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|40",
+ "Asia/Dhaka|+06|-60|0||16e6",
+ "Asia/Amman|EET EEST|-20 -30|010101010101010101010|1GPy0 4bX0 Dd0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00|25e5",
+ "Asia/Kamchatka|+12|-c0|0||18e4",
+ "Asia/Baku|+04 +05|-40 -50|010101010|1GNA0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5",
+ "Asia/Bangkok|+07|-70|0||15e6",
+ "Asia/Barnaul|+07 +06|-70 -60|010|1N7v0 3rd0",
+ "Asia/Beirut|EET EEST|-20 -30|01010101010101010101010|1GNy0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0|22e5",
+ "Asia/Manila|+08|-80|0||24e6",
+ "Asia/Kolkata|IST|-5u|0||15e6",
+ "Asia/Chita|+10 +08 +09|-a0 -80 -90|012|1N7s0 3re0|33e4",
+ "Asia/Ulaanbaatar|+08 +09|-80 -90|01010|1O8G0 1cJ0 1cP0 1cJ0|12e5",
+ "Asia/Shanghai|CST|-80|0||23e6",
+ "Asia/Colombo|+0530|-5u|0||22e5",
+ "Asia/Damascus|EET EEST|-20 -30|01010101010101010101010|1GPy0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0|26e5",
+ "Asia/Dili|+09|-90|0||19e4",
+ "Asia/Dubai|+04|-40|0||39e5",
+ "Asia/Famagusta|EET EEST +03|-20 -30 -30|0101010101201010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0",
+ "Asia/Gaza|EET EEST|-20 -30|01010101010101010101010|1GPy0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nz0 1220 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0|18e5",
+ "Asia/Hong_Kong|HKT|-80|0||73e5",
+ "Asia/Hovd|+07 +08|-70 -80|01010|1O8H0 1cJ0 1cP0 1cJ0|81e3",
+ "Asia/Irkutsk|+09 +08|-90 -80|01|1N7t0|60e4",
+ "Europe/Istanbul|EET EEST +03|-20 -30 -30|01010101012|1GNB0 1qM0 11A0 1o00 1200 1nA0 11A0 1tA0 U00 15w0|13e6",
+ "Asia/Jakarta|WIB|-70|0||31e6",
+ "Asia/Jayapura|WIT|-90|0||26e4",
+ "Asia/Jerusalem|IST IDT|-20 -30|01010101010101010101010|1GPA0 1aL0 1eN0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0|81e4",
+ "Asia/Kabul|+0430|-4u|0||46e5",
+ "Asia/Karachi|PKT|-50|0||24e6",
+ "Asia/Kathmandu|+0545|-5J|0||12e5",
+ "Asia/Yakutsk|+10 +09|-a0 -90|01|1N7s0|28e4",
+ "Asia/Krasnoyarsk|+08 +07|-80 -70|01|1N7u0|10e5",
+ "Asia/Magadan|+12 +10 +11|-c0 -a0 -b0|012|1N7q0 3Cq0|95e3",
+ "Asia/Makassar|WITA|-80|0||15e5",
+ "Europe/Athens|EET EEST|-20 -30|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|35e5",
+ "Asia/Novosibirsk|+07 +06|-70 -60|010|1N7v0 4eN0|15e5",
+ "Asia/Omsk|+07 +06|-70 -60|01|1N7v0|12e5",
+ "Asia/Pyongyang|KST KST|-90 -8u|010|1P4D0 6BAu|29e5",
+ "Asia/Rangoon|+0630|-6u|0||48e5",
+ "Asia/Sakhalin|+11 +10|-b0 -a0|010|1N7r0 3rd0|58e4",
+ "Asia/Seoul|KST|-90|0||23e6",
+ "Asia/Srednekolymsk|+12 +11|-c0 -b0|01|1N7q0|35e2",
+ "Asia/Tehran|+0330 +0430|-3u -4u|01010101010101010101010|1GLUu 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0|14e6",
+ "Asia/Tokyo|JST|-90|0||38e6",
+ "Asia/Tomsk|+07 +06|-70 -60|010|1N7v0 3Qp0|10e5",
+ "Asia/Vladivostok|+11 +10|-b0 -a0|01|1N7r0|60e4",
+ "Asia/Yekaterinburg|+06 +05|-60 -50|01|1N7w0|14e5",
+ "Europe/Lisbon|WET WEST|0 -10|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|27e5",
+ "Atlantic/Cape_Verde|-01|10|0||50e4",
+ "Australia/Sydney|AEDT AEST|-b0 -a0|01010101010101010101010|1GQg0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|40e5",
+ "Australia/Adelaide|ACDT ACST|-au -9u|01010101010101010101010|1GQgu 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|11e5",
+ "Australia/Brisbane|AEST|-a0|0||20e5",
+ "Australia/Darwin|ACST|-9u|0||12e4",
+ "Australia/Eucla|+0845|-8J|0||368",
+ "Australia/Lord_Howe|+11 +1030|-b0 -au|01010101010101010101010|1GQf0 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu|347",
+ "Australia/Perth|AWST|-80|0||18e5",
+ "Pacific/Easter|-05 -06|50 60|010101010101010101010|1H3D0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0|30e2",
+ "Europe/Dublin|GMT IST|0 -10|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|12e5",
+ "Etc/GMT-1|+01|-10|0|",
+ "Pacific/Fakaofo|+13|-d0|0||483",
+ "Pacific/Kiritimati|+14|-e0|0||51e2",
+ "Etc/GMT-2|+02|-20|0|",
+ "Pacific/Tahiti|-10|a0|0||18e4",
+ "Pacific/Niue|-11|b0|0||12e2",
+ "Etc/GMT+12|-12|c0|0|",
+ "Pacific/Galapagos|-06|60|0||25e3",
+ "Etc/GMT+7|-07|70|0|",
+ "Pacific/Pitcairn|-08|80|0||56",
+ "Pacific/Gambier|-09|90|0||125",
+ "Etc/UCT|UCT|0|0|",
+ "Etc/UTC|UTC|0|0|",
+ "Europe/Astrakhan|+04 +03|-40 -30|010|1N7y0 3rd0",
+ "Europe/London|GMT BST|0 -10|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|10e6",
+ "Europe/Chisinau|EET EEST|-20 -30|01010101010101010101010|1GNA0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|67e4",
+ "Europe/Kaliningrad|+03 EET|-30 -20|01|1N7z0|44e4",
+ "Europe/Volgograd|+04 +03|-40 -30|01|1N7y0|10e5",
+ "Europe/Moscow|MSK MSK|-40 -30|01|1N7y0|16e6",
+ "Europe/Saratov|+04 +03|-40 -30|010|1N7y0 5810",
+ "Europe/Simferopol|EET EEST MSK MSK|-20 -30 -40 -30|0101023|1GNB0 1qM0 11A0 1o00 11z0 1nW0|33e4",
+ "Pacific/Honolulu|HST|a0|0||37e4",
+ "MET|MET MEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0",
+ "Pacific/Chatham|+1345 +1245|-dJ -cJ|01010101010101010101010|1GQe0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00|600",
+ "Pacific/Apia|+14 +13|-e0 -d0|01010101010101010101010|1GQe0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00|37e3",
+ "Pacific/Bougainville|+10 +11|-a0 -b0|01|1NwE0|18e4",
+ "Pacific/Fiji|+13 +12|-d0 -c0|01010101010101010101010|1Goe0 1Nc0 Ao0 1Q00 xz0 1SN0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0|88e4",
+ "Pacific/Guam|ChST|-a0|0||17e4",
+ "Pacific/Marquesas|-0930|9u|0||86e2",
+ "Pacific/Pago_Pago|SST|b0|0||37e2",
+ "Pacific/Norfolk|+1130 +11|-bu -b0|01|1PoCu|25e4",
+ "Pacific/Tongatapu|+13 +14|-d0 -e0|010|1S4d0 s00|75e3"
+ ],
+ "links": [
+ "Africa/Abidjan|Africa/Accra",
+ "Africa/Abidjan|Africa/Bamako",
+ "Africa/Abidjan|Africa/Banjul",
+ "Africa/Abidjan|Africa/Bissau",
+ "Africa/Abidjan|Africa/Conakry",
+ "Africa/Abidjan|Africa/Dakar",
+ "Africa/Abidjan|Africa/Freetown",
+ "Africa/Abidjan|Africa/Lome",
+ "Africa/Abidjan|Africa/Monrovia",
+ "Africa/Abidjan|Africa/Nouakchott",
+ "Africa/Abidjan|Africa/Ouagadougou",
+ "Africa/Abidjan|Africa/Timbuktu",
+ "Africa/Abidjan|America/Danmarkshavn",
+ "Africa/Abidjan|Atlantic/Reykjavik",
+ "Africa/Abidjan|Atlantic/St_Helena",
+ "Africa/Abidjan|Etc/GMT",
+ "Africa/Abidjan|Etc/GMT+0",
+ "Africa/Abidjan|Etc/GMT-0",
+ "Africa/Abidjan|Etc/GMT0",
+ "Africa/Abidjan|Etc/Greenwich",
+ "Africa/Abidjan|GMT",
+ "Africa/Abidjan|GMT+0",
+ "Africa/Abidjan|GMT-0",
+ "Africa/Abidjan|GMT0",
+ "Africa/Abidjan|Greenwich",
+ "Africa/Abidjan|Iceland",
+ "Africa/Algiers|Africa/Tunis",
+ "Africa/Cairo|Egypt",
+ "Africa/Casablanca|Africa/El_Aaiun",
+ "Africa/Johannesburg|Africa/Maseru",
+ "Africa/Johannesburg|Africa/Mbabane",
+ "Africa/Lagos|Africa/Bangui",
+ "Africa/Lagos|Africa/Brazzaville",
+ "Africa/Lagos|Africa/Douala",
+ "Africa/Lagos|Africa/Kinshasa",
+ "Africa/Lagos|Africa/Libreville",
+ "Africa/Lagos|Africa/Luanda",
+ "Africa/Lagos|Africa/Malabo",
+ "Africa/Lagos|Africa/Ndjamena",
+ "Africa/Lagos|Africa/Niamey",
+ "Africa/Lagos|Africa/Porto-Novo",
+ "Africa/Maputo|Africa/Blantyre",
+ "Africa/Maputo|Africa/Bujumbura",
+ "Africa/Maputo|Africa/Gaborone",
+ "Africa/Maputo|Africa/Harare",
+ "Africa/Maputo|Africa/Kigali",
+ "Africa/Maputo|Africa/Lubumbashi",
+ "Africa/Maputo|Africa/Lusaka",
+ "Africa/Nairobi|Africa/Addis_Ababa",
+ "Africa/Nairobi|Africa/Asmara",
+ "Africa/Nairobi|Africa/Asmera",
+ "Africa/Nairobi|Africa/Dar_es_Salaam",
+ "Africa/Nairobi|Africa/Djibouti",
+ "Africa/Nairobi|Africa/Juba",
+ "Africa/Nairobi|Africa/Kampala",
+ "Africa/Nairobi|Africa/Mogadishu",
+ "Africa/Nairobi|Indian/Antananarivo",
+ "Africa/Nairobi|Indian/Comoro",
+ "Africa/Nairobi|Indian/Mayotte",
+ "Africa/Tripoli|Libya",
+ "America/Adak|America/Atka",
+ "America/Adak|US/Aleutian",
+ "America/Anchorage|America/Juneau",
+ "America/Anchorage|America/Nome",
+ "America/Anchorage|America/Sitka",
+ "America/Anchorage|America/Yakutat",
+ "America/Anchorage|US/Alaska",
+ "America/Campo_Grande|America/Cuiaba",
+ "America/Chicago|America/Indiana/Knox",
+ "America/Chicago|America/Indiana/Tell_City",
+ "America/Chicago|America/Knox_IN",
+ "America/Chicago|America/Matamoros",
+ "America/Chicago|America/Menominee",
+ "America/Chicago|America/North_Dakota/Beulah",
+ "America/Chicago|America/North_Dakota/Center",
+ "America/Chicago|America/North_Dakota/New_Salem",
+ "America/Chicago|America/Rainy_River",
+ "America/Chicago|America/Rankin_Inlet",
+ "America/Chicago|America/Resolute",
+ "America/Chicago|America/Winnipeg",
+ "America/Chicago|CST6CDT",
+ "America/Chicago|Canada/Central",
+ "America/Chicago|US/Central",
+ "America/Chicago|US/Indiana-Starke",
+ "America/Chihuahua|America/Mazatlan",
+ "America/Chihuahua|Mexico/BajaSur",
+ "America/Denver|America/Boise",
+ "America/Denver|America/Cambridge_Bay",
+ "America/Denver|America/Edmonton",
+ "America/Denver|America/Inuvik",
+ "America/Denver|America/Ojinaga",
+ "America/Denver|America/Shiprock",
+ "America/Denver|America/Yellowknife",
+ "America/Denver|Canada/Mountain",
+ "America/Denver|MST7MDT",
+ "America/Denver|Navajo",
+ "America/Denver|US/Mountain",
+ "America/Fortaleza|America/Argentina/Buenos_Aires",
+ "America/Fortaleza|America/Argentina/Catamarca",
+ "America/Fortaleza|America/Argentina/ComodRivadavia",
+ "America/Fortaleza|America/Argentina/Cordoba",
+ "America/Fortaleza|America/Argentina/Jujuy",
+ "America/Fortaleza|America/Argentina/La_Rioja",
+ "America/Fortaleza|America/Argentina/Mendoza",
+ "America/Fortaleza|America/Argentina/Rio_Gallegos",
+ "America/Fortaleza|America/Argentina/Salta",
+ "America/Fortaleza|America/Argentina/San_Juan",
+ "America/Fortaleza|America/Argentina/San_Luis",
+ "America/Fortaleza|America/Argentina/Tucuman",
+ "America/Fortaleza|America/Argentina/Ushuaia",
+ "America/Fortaleza|America/Belem",
+ "America/Fortaleza|America/Buenos_Aires",
+ "America/Fortaleza|America/Catamarca",
+ "America/Fortaleza|America/Cayenne",
+ "America/Fortaleza|America/Cordoba",
+ "America/Fortaleza|America/Jujuy",
+ "America/Fortaleza|America/Maceio",
+ "America/Fortaleza|America/Mendoza",
+ "America/Fortaleza|America/Paramaribo",
+ "America/Fortaleza|America/Recife",
+ "America/Fortaleza|America/Rosario",
+ "America/Fortaleza|America/Santarem",
+ "America/Fortaleza|Antarctica/Rothera",
+ "America/Fortaleza|Atlantic/Stanley",
+ "America/Fortaleza|Etc/GMT+3",
+ "America/Halifax|America/Glace_Bay",
+ "America/Halifax|America/Goose_Bay",
+ "America/Halifax|America/Moncton",
+ "America/Halifax|America/Thule",
+ "America/Halifax|Atlantic/Bermuda",
+ "America/Halifax|Canada/Atlantic",
+ "America/Havana|Cuba",
+ "America/La_Paz|America/Boa_Vista",
+ "America/La_Paz|America/Guyana",
+ "America/La_Paz|America/Manaus",
+ "America/La_Paz|America/Porto_Velho",
+ "America/La_Paz|Brazil/West",
+ "America/La_Paz|Etc/GMT+4",
+ "America/Lima|America/Bogota",
+ "America/Lima|America/Guayaquil",
+ "America/Lima|Etc/GMT+5",
+ "America/Los_Angeles|America/Dawson",
+ "America/Los_Angeles|America/Ensenada",
+ "America/Los_Angeles|America/Santa_Isabel",
+ "America/Los_Angeles|America/Tijuana",
+ "America/Los_Angeles|America/Vancouver",
+ "America/Los_Angeles|America/Whitehorse",
+ "America/Los_Angeles|Canada/Pacific",
+ "America/Los_Angeles|Canada/Yukon",
+ "America/Los_Angeles|Mexico/BajaNorte",
+ "America/Los_Angeles|PST8PDT",
+ "America/Los_Angeles|US/Pacific",
+ "America/Los_Angeles|US/Pacific-New",
+ "America/Managua|America/Belize",
+ "America/Managua|America/Costa_Rica",
+ "America/Managua|America/El_Salvador",
+ "America/Managua|America/Guatemala",
+ "America/Managua|America/Regina",
+ "America/Managua|America/Swift_Current",
+ "America/Managua|America/Tegucigalpa",
+ "America/Managua|Canada/Saskatchewan",
+ "America/Mexico_City|America/Bahia_Banderas",
+ "America/Mexico_City|America/Merida",
+ "America/Mexico_City|America/Monterrey",
+ "America/Mexico_City|Mexico/General",
+ "America/New_York|America/Detroit",
+ "America/New_York|America/Fort_Wayne",
+ "America/New_York|America/Indiana/Indianapolis",
+ "America/New_York|America/Indiana/Marengo",
+ "America/New_York|America/Indiana/Petersburg",
+ "America/New_York|America/Indiana/Vevay",
+ "America/New_York|America/Indiana/Vincennes",
+ "America/New_York|America/Indiana/Winamac",
+ "America/New_York|America/Indianapolis",
+ "America/New_York|America/Iqaluit",
+ "America/New_York|America/Kentucky/Louisville",
+ "America/New_York|America/Kentucky/Monticello",
+ "America/New_York|America/Louisville",
+ "America/New_York|America/Montreal",
+ "America/New_York|America/Nassau",
+ "America/New_York|America/Nipigon",
+ "America/New_York|America/Pangnirtung",
+ "America/New_York|America/Thunder_Bay",
+ "America/New_York|America/Toronto",
+ "America/New_York|Canada/Eastern",
+ "America/New_York|EST5EDT",
+ "America/New_York|US/East-Indiana",
+ "America/New_York|US/Eastern",
+ "America/New_York|US/Michigan",
+ "America/Noronha|Atlantic/South_Georgia",
+ "America/Noronha|Brazil/DeNoronha",
+ "America/Noronha|Etc/GMT+2",
+ "America/Panama|America/Atikokan",
+ "America/Panama|America/Cayman",
+ "America/Panama|America/Coral_Harbour",
+ "America/Panama|America/Jamaica",
+ "America/Panama|EST",
+ "America/Panama|Jamaica",
+ "America/Phoenix|America/Creston",
+ "America/Phoenix|America/Dawson_Creek",
+ "America/Phoenix|America/Hermosillo",
+ "America/Phoenix|MST",
+ "America/Phoenix|US/Arizona",
+ "America/Rio_Branco|America/Eirunepe",
+ "America/Rio_Branco|America/Porto_Acre",
+ "America/Rio_Branco|Brazil/Acre",
+ "America/Santiago|Chile/Continental",
+ "America/Santo_Domingo|America/Anguilla",
+ "America/Santo_Domingo|America/Antigua",
+ "America/Santo_Domingo|America/Aruba",
+ "America/Santo_Domingo|America/Barbados",
+ "America/Santo_Domingo|America/Blanc-Sablon",
+ "America/Santo_Domingo|America/Curacao",
+ "America/Santo_Domingo|America/Dominica",
+ "America/Santo_Domingo|America/Grenada",
+ "America/Santo_Domingo|America/Guadeloupe",
+ "America/Santo_Domingo|America/Kralendijk",
+ "America/Santo_Domingo|America/Lower_Princes",
+ "America/Santo_Domingo|America/Marigot",
+ "America/Santo_Domingo|America/Martinique",
+ "America/Santo_Domingo|America/Montserrat",
+ "America/Santo_Domingo|America/Port_of_Spain",
+ "America/Santo_Domingo|America/Puerto_Rico",
+ "America/Santo_Domingo|America/St_Barthelemy",
+ "America/Santo_Domingo|America/St_Kitts",
+ "America/Santo_Domingo|America/St_Lucia",
+ "America/Santo_Domingo|America/St_Thomas",
+ "America/Santo_Domingo|America/St_Vincent",
+ "America/Santo_Domingo|America/Tortola",
+ "America/Santo_Domingo|America/Virgin",
+ "America/Sao_Paulo|Brazil/East",
+ "America/St_Johns|Canada/Newfoundland",
+ "Antarctica/Palmer|America/Punta_Arenas",
+ "Asia/Baghdad|Antarctica/Syowa",
+ "Asia/Baghdad|Asia/Aden",
+ "Asia/Baghdad|Asia/Bahrain",
+ "Asia/Baghdad|Asia/Kuwait",
+ "Asia/Baghdad|Asia/Qatar",
+ "Asia/Baghdad|Asia/Riyadh",
+ "Asia/Baghdad|Etc/GMT-3",
+ "Asia/Baghdad|Europe/Minsk",
+ "Asia/Bangkok|Asia/Ho_Chi_Minh",
+ "Asia/Bangkok|Asia/Novokuznetsk",
+ "Asia/Bangkok|Asia/Phnom_Penh",
+ "Asia/Bangkok|Asia/Saigon",
+ "Asia/Bangkok|Asia/Vientiane",
+ "Asia/Bangkok|Etc/GMT-7",
+ "Asia/Bangkok|Indian/Christmas",
+ "Asia/Dhaka|Antarctica/Vostok",
+ "Asia/Dhaka|Asia/Almaty",
+ "Asia/Dhaka|Asia/Bishkek",
+ "Asia/Dhaka|Asia/Dacca",
+ "Asia/Dhaka|Asia/Kashgar",
+ "Asia/Dhaka|Asia/Qyzylorda",
+ "Asia/Dhaka|Asia/Thimbu",
+ "Asia/Dhaka|Asia/Thimphu",
+ "Asia/Dhaka|Asia/Urumqi",
+ "Asia/Dhaka|Etc/GMT-6",
+ "Asia/Dhaka|Indian/Chagos",
+ "Asia/Dili|Etc/GMT-9",
+ "Asia/Dili|Pacific/Palau",
+ "Asia/Dubai|Asia/Muscat",
+ "Asia/Dubai|Asia/Tbilisi",
+ "Asia/Dubai|Asia/Yerevan",
+ "Asia/Dubai|Etc/GMT-4",
+ "Asia/Dubai|Europe/Samara",
+ "Asia/Dubai|Indian/Mahe",
+ "Asia/Dubai|Indian/Mauritius",
+ "Asia/Dubai|Indian/Reunion",
+ "Asia/Gaza|Asia/Hebron",
+ "Asia/Hong_Kong|Hongkong",
+ "Asia/Jakarta|Asia/Pontianak",
+ "Asia/Jerusalem|Asia/Tel_Aviv",
+ "Asia/Jerusalem|Israel",
+ "Asia/Kamchatka|Asia/Anadyr",
+ "Asia/Kamchatka|Etc/GMT-12",
+ "Asia/Kamchatka|Kwajalein",
+ "Asia/Kamchatka|Pacific/Funafuti",
+ "Asia/Kamchatka|Pacific/Kwajalein",
+ "Asia/Kamchatka|Pacific/Majuro",
+ "Asia/Kamchatka|Pacific/Nauru",
+ "Asia/Kamchatka|Pacific/Tarawa",
+ "Asia/Kamchatka|Pacific/Wake",
+ "Asia/Kamchatka|Pacific/Wallis",
+ "Asia/Kathmandu|Asia/Katmandu",
+ "Asia/Kolkata|Asia/Calcutta",
+ "Asia/Makassar|Asia/Ujung_Pandang",
+ "Asia/Manila|Asia/Brunei",
+ "Asia/Manila|Asia/Kuala_Lumpur",
+ "Asia/Manila|Asia/Kuching",
+ "Asia/Manila|Asia/Singapore",
+ "Asia/Manila|Etc/GMT-8",
+ "Asia/Manila|Singapore",
+ "Asia/Rangoon|Asia/Yangon",
+ "Asia/Rangoon|Indian/Cocos",
+ "Asia/Seoul|ROK",
+ "Asia/Shanghai|Asia/Chongqing",
+ "Asia/Shanghai|Asia/Chungking",
+ "Asia/Shanghai|Asia/Harbin",
+ "Asia/Shanghai|Asia/Macao",
+ "Asia/Shanghai|Asia/Macau",
+ "Asia/Shanghai|Asia/Taipei",
+ "Asia/Shanghai|PRC",
+ "Asia/Shanghai|ROC",
+ "Asia/Tashkent|Antarctica/Mawson",
+ "Asia/Tashkent|Asia/Aqtau",
+ "Asia/Tashkent|Asia/Aqtobe",
+ "Asia/Tashkent|Asia/Ashgabat",
+ "Asia/Tashkent|Asia/Ashkhabad",
+ "Asia/Tashkent|Asia/Atyrau",
+ "Asia/Tashkent|Asia/Dushanbe",
+ "Asia/Tashkent|Asia/Oral",
+ "Asia/Tashkent|Asia/Samarkand",
+ "Asia/Tashkent|Etc/GMT-5",
+ "Asia/Tashkent|Indian/Kerguelen",
+ "Asia/Tashkent|Indian/Maldives",
+ "Asia/Tehran|Iran",
+ "Asia/Tokyo|Japan",
+ "Asia/Ulaanbaatar|Asia/Choibalsan",
+ "Asia/Ulaanbaatar|Asia/Ulan_Bator",
+ "Asia/Vladivostok|Asia/Ust-Nera",
+ "Asia/Yakutsk|Asia/Khandyga",
+ "Atlantic/Azores|America/Scoresbysund",
+ "Atlantic/Cape_Verde|Etc/GMT+1",
+ "Australia/Adelaide|Australia/Broken_Hill",
+ "Australia/Adelaide|Australia/South",
+ "Australia/Adelaide|Australia/Yancowinna",
+ "Australia/Brisbane|Australia/Lindeman",
+ "Australia/Brisbane|Australia/Queensland",
+ "Australia/Darwin|Australia/North",
+ "Australia/Lord_Howe|Australia/LHI",
+ "Australia/Perth|Australia/West",
+ "Australia/Sydney|Australia/ACT",
+ "Australia/Sydney|Australia/Canberra",
+ "Australia/Sydney|Australia/Currie",
+ "Australia/Sydney|Australia/Hobart",
+ "Australia/Sydney|Australia/Melbourne",
+ "Australia/Sydney|Australia/NSW",
+ "Australia/Sydney|Australia/Tasmania",
+ "Australia/Sydney|Australia/Victoria",
+ "Etc/UCT|UCT",
+ "Etc/UTC|Etc/Universal",
+ "Etc/UTC|Etc/Zulu",
+ "Etc/UTC|UTC",
+ "Etc/UTC|Universal",
+ "Etc/UTC|Zulu",
+ "Europe/Astrakhan|Europe/Ulyanovsk",
+ "Europe/Athens|Asia/Nicosia",
+ "Europe/Athens|EET",
+ "Europe/Athens|Europe/Bucharest",
+ "Europe/Athens|Europe/Helsinki",
+ "Europe/Athens|Europe/Kiev",
+ "Europe/Athens|Europe/Mariehamn",
+ "Europe/Athens|Europe/Nicosia",
+ "Europe/Athens|Europe/Riga",
+ "Europe/Athens|Europe/Sofia",
+ "Europe/Athens|Europe/Tallinn",
+ "Europe/Athens|Europe/Uzhgorod",
+ "Europe/Athens|Europe/Vilnius",
+ "Europe/Athens|Europe/Zaporozhye",
+ "Europe/Chisinau|Europe/Tiraspol",
+ "Europe/Dublin|Eire",
+ "Europe/Istanbul|Asia/Istanbul",
+ "Europe/Istanbul|Turkey",
+ "Europe/Lisbon|Atlantic/Canary",
+ "Europe/Lisbon|Atlantic/Faeroe",
+ "Europe/Lisbon|Atlantic/Faroe",
+ "Europe/Lisbon|Atlantic/Madeira",
+ "Europe/Lisbon|Portugal",
+ "Europe/Lisbon|WET",
+ "Europe/London|Europe/Belfast",
+ "Europe/London|Europe/Guernsey",
+ "Europe/London|Europe/Isle_of_Man",
+ "Europe/London|Europe/Jersey",
+ "Europe/London|GB",
+ "Europe/London|GB-Eire",
+ "Europe/Moscow|W-SU",
+ "Europe/Paris|Africa/Ceuta",
+ "Europe/Paris|Arctic/Longyearbyen",
+ "Europe/Paris|Atlantic/Jan_Mayen",
+ "Europe/Paris|CET",
+ "Europe/Paris|Europe/Amsterdam",
+ "Europe/Paris|Europe/Andorra",
+ "Europe/Paris|Europe/Belgrade",
+ "Europe/Paris|Europe/Berlin",
+ "Europe/Paris|Europe/Bratislava",
+ "Europe/Paris|Europe/Brussels",
+ "Europe/Paris|Europe/Budapest",
+ "Europe/Paris|Europe/Busingen",
+ "Europe/Paris|Europe/Copenhagen",
+ "Europe/Paris|Europe/Gibraltar",
+ "Europe/Paris|Europe/Ljubljana",
+ "Europe/Paris|Europe/Luxembourg",
+ "Europe/Paris|Europe/Madrid",
+ "Europe/Paris|Europe/Malta",
+ "Europe/Paris|Europe/Monaco",
+ "Europe/Paris|Europe/Oslo",
+ "Europe/Paris|Europe/Podgorica",
+ "Europe/Paris|Europe/Prague",
+ "Europe/Paris|Europe/Rome",
+ "Europe/Paris|Europe/San_Marino",
+ "Europe/Paris|Europe/Sarajevo",
+ "Europe/Paris|Europe/Skopje",
+ "Europe/Paris|Europe/Stockholm",
+ "Europe/Paris|Europe/Tirane",
+ "Europe/Paris|Europe/Vaduz",
+ "Europe/Paris|Europe/Vatican",
+ "Europe/Paris|Europe/Vienna",
+ "Europe/Paris|Europe/Warsaw",
+ "Europe/Paris|Europe/Zagreb",
+ "Europe/Paris|Europe/Zurich",
+ "Europe/Paris|Poland",
+ "Europe/Volgograd|Europe/Kirov",
+ "Pacific/Auckland|Antarctica/McMurdo",
+ "Pacific/Auckland|Antarctica/South_Pole",
+ "Pacific/Auckland|NZ",
+ "Pacific/Chatham|NZ-CHAT",
+ "Pacific/Easter|Chile/EasterIsland",
+ "Pacific/Fakaofo|Etc/GMT-13",
+ "Pacific/Fakaofo|Pacific/Enderbury",
+ "Pacific/Galapagos|Etc/GMT+6",
+ "Pacific/Gambier|Etc/GMT+9",
+ "Pacific/Guadalcanal|Antarctica/Macquarie",
+ "Pacific/Guadalcanal|Etc/GMT-11",
+ "Pacific/Guadalcanal|Pacific/Efate",
+ "Pacific/Guadalcanal|Pacific/Kosrae",
+ "Pacific/Guadalcanal|Pacific/Noumea",
+ "Pacific/Guadalcanal|Pacific/Pohnpei",
+ "Pacific/Guadalcanal|Pacific/Ponape",
+ "Pacific/Guam|Pacific/Saipan",
+ "Pacific/Honolulu|HST",
+ "Pacific/Honolulu|Pacific/Johnston",
+ "Pacific/Honolulu|US/Hawaii",
+ "Pacific/Kiritimati|Etc/GMT-14",
+ "Pacific/Niue|Etc/GMT+11",
+ "Pacific/Pago_Pago|Pacific/Midway",
+ "Pacific/Pago_Pago|Pacific/Samoa",
+ "Pacific/Pago_Pago|US/Samoa",
+ "Pacific/Pitcairn|Etc/GMT+8",
+ "Pacific/Port_Moresby|Antarctica/DumontDUrville",
+ "Pacific/Port_Moresby|Etc/GMT-10",
+ "Pacific/Port_Moresby|Pacific/Chuuk",
+ "Pacific/Port_Moresby|Pacific/Truk",
+ "Pacific/Port_Moresby|Pacific/Yap",
+ "Pacific/Tahiti|Etc/GMT+10",
+ "Pacific/Tahiti|Pacific/Rarotonga"
+ ]
+ });
+
+
+ return moment;
+}));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/builds/moment-timezone-with-data-2012-2022.min.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/builds/moment-timezone-with-data-2012-2022.min.js
new file mode 100644
index 00000000000..1e827a7c842
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/builds/moment-timezone-with-data-2012-2022.min.js
@@ -0,0 +1 @@
+!function(a,i){"use strict";"function"==typeof define&&define.amd?define(["moment"],i):"object"==typeof module&&module.exports?module.exports=i(require("moment")):i(a.moment)}(this,function(A){"use strict";var i,c={},n={},s={},u={},a=A.version.split("."),e=+a[0],r=+a[1];function t(a){return 96<a?a-87:64<a?a-29:a-48}function o(a){var i=0,e=a.split("."),r=e[0],o=e[1]||"",A=1,c=0,n=1;for(45===a.charCodeAt(0)&&(n=-(i=1));i<r.length;i++)c=60*c+t(r.charCodeAt(i));for(i=0;i<o.length;i++)A/=60,c+=t(o.charCodeAt(i))*A;return c*n}function m(a){for(var i=0;i<a.length;i++)a[i]=o(a[i])}function f(a,i){var e,r=[];for(e=0;e<i.length;e++)r[e]=a[i[e]];return r}function l(a){var i=a.split("|"),e=i[2].split(" "),r=i[3].split(""),o=i[4].split(" ");return m(e),m(r),m(o),function(a,i){for(var e=0;e<i;e++)a[e]=Math.round((a[e-1]||0)+6e4*a[e]);a[i-1]=1/0}(o,r.length),{name:i[0],abbrs:f(i[1].split(" "),r),offsets:f(e,r),untils:o,population:0|i[5]}}function p(a){a&&this._set(l(a))}function b(a){var i=a.toTimeString(),e=i.match(/\([a-z ]+\)/i);"GMT"===(e=e&&e[0]?(e=e[0].match(/[A-Z]/g))?e.join(""):void 0:(e=i.match(/[A-Z]{3,5}/g))?e[0]:void 0)&&(e=void 0),this.at=+a,this.abbr=e,this.offset=a.getTimezoneOffset()}function M(a){this.zone=a,this.offsetScore=0,this.abbrScore=0}function d(a,i){for(var e,r;r=6e4*((i.at-a.at)/12e4|0);)(e=new b(new Date(a.at+r))).offset===a.offset?a=e:i=e;return a}function h(a,i){return a.offsetScore!==i.offsetScore?a.offsetScore-i.offsetScore:a.abbrScore!==i.abbrScore?a.abbrScore-i.abbrScore:i.zone.population-a.zone.population}function z(a,i){var e,r;for(m(i),e=0;e<i.length;e++)r=i[e],u[r]=u[r]||{},u[r][a]=!0}function E(){try{var a=Intl.DateTimeFormat().resolvedOptions().timeZone;if(a&&3<a.length){var i=s[g(a)];if(i)return i;N("Moment Timezone found "+a+" from the Intl api, but did not have that data loaded.")}}catch(a){}var e,r,o,A=function(){var a,i,e,r=(new Date).getFullYear()-2,o=new b(new Date(r,0,1)),A=[o];for(e=1;e<48;e++)(i=new b(new Date(r,e,1))).offset!==o.offset&&(a=d(o,i),A.push(a),A.push(new b(new Date(a.at+6e4)))),o=i;for(e=0;e<4;e++)A.push(new b(new Date(r+e,0,1))),A.push(new b(new Date(r+e,6,1)));return A}(),c=A.length,n=function(a){var i,e,r,o=a.length,A={},c=[];for(i=0;i<o;i++)for(e in r=u[a[i].offset]||{})r.hasOwnProperty(e)&&(A[e]=!0);for(i in A)A.hasOwnProperty(i)&&c.push(s[i]);return c}(A),t=[];for(r=0;r<n.length;r++){for(e=new M(S(n[r]),c),o=0;o<c;o++)e.scoreOffsetAt(A[o]);t.push(e)}return t.sort(h),0<t.length?t[0].zone.name:void 0}function g(a){return(a||"").toLowerCase().replace(/\//g,"_")}function T(a){var i,e,r,o;for("string"==typeof a&&(a=[a]),i=0;i<a.length;i++)o=g(e=(r=a[i].split("|"))[0]),c[o]=a[i],s[o]=e,z(o,r[2].split(" "))}function S(a,i){a=g(a);var e,r=c[a];return r instanceof p?r:"string"==typeof r?(r=new p(r),c[a]=r):n[a]&&i!==S&&(e=S(n[a],S))?((r=c[a]=new p)._set(e),r.name=s[a],r):null}function P(a){var i,e,r,o;for("string"==typeof a&&(a=[a]),i=0;i<a.length;i++)r=g((e=a[i].split("|"))[0]),o=g(e[1]),n[r]=o,s[r]=e[0],n[o]=r,s[o]=e[1]}function _(a){T(a.zones),P(a.links),C.dataVersion=a.version}function k(a){var i="X"===a._f||"x"===a._f;return!(!a._a||void 0!==a._tzm||i)}function N(a){"undefined"!=typeof console&&"function"==typeof console.error&&console.error(a)}function C(a){var i=Array.prototype.slice.call(arguments,0,-1),e=arguments[arguments.length-1],r=S(e),o=A.utc.apply(null,i);return r&&!A.isMoment(a)&&k(o)&&o.add(r.parse(o),"minutes"),o.tz(e),o}(e<2||2===e&&r<6)&&N("Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js "+A.version+". See momentjs.com"),p.prototype={_set:function(a){this.name=a.name,this.abbrs=a.abbrs,this.untils=a.untils,this.offsets=a.offsets,this.population=a.population},_index:function(a){var i,e=+a,r=this.untils;for(i=0;i<r.length;i++)if(e<r[i])return i},parse:function(a){var i,e,r,o,A=+a,c=this.offsets,n=this.untils,t=n.length-1;for(o=0;o<t;o++)if(i=c[o],e=c[o+1],r=c[o?o-1:o],i<e&&C.moveAmbiguousForward?i=e:r<i&&C.moveInvalidForward&&(i=r),A<n[o]-6e4*i)return c[o];return c[t]},abbr:function(a){return this.abbrs[this._index(a)]},offset:function(a){return N("zone.offset has been deprecated in favor of zone.utcOffset"),this.offsets[this._index(a)]},utcOffset:function(a){return this.offsets[this._index(a)]}},M.prototype.scoreOffsetAt=function(a){this.offsetScore+=Math.abs(this.zone.utcOffset(a.at)-a.offset),this.zone.abbr(a.at).replace(/[^A-Z]/g,"")!==a.abbr&&this.abbrScore++},C.version="0.5.17",C.dataVersion="",C._zones=c,C._links=n,C._names=s,C.add=T,C.link=P,C.load=_,C.zone=S,C.zoneExists=function a(i){return a.didShowError||(a.didShowError=!0,N("moment.tz.zoneExists('"+i+"') has been deprecated in favor of !moment.tz.zone('"+i+"')")),!!S(i)},C.guess=function(a){return i&&!a||(i=E()),i},C.names=function(){var a,i=[];for(a in s)s.hasOwnProperty(a)&&(c[a]||c[n[a]])&&s[a]&&i.push(s[a]);return i.sort()},C.Zone=p,C.unpack=l,C.unpackBase60=o,C.needsOffset=k,C.moveInvalidForward=!0,C.moveAmbiguousForward=!1;var O,B=A.fn;function G(a){return function(){return this._z?this._z.abbr(this):a.call(this)}}A.tz=C,A.defaultZone=null,A.updateOffset=function(a,i){var e,r=A.defaultZone;void 0===a._z&&(r&&k(a)&&!a._isUTC&&(a._d=A.utc(a._a)._d,a.utc().add(r.parse(a),"minutes")),a._z=r),a._z&&(e=a._z.utcOffset(a),Math.abs(e)<16&&(e/=60),void 0!==a.utcOffset?a.utcOffset(-e,i):a.zone(e,i))},B.tz=function(a,i){return a?(this._z=S(a),this._z?A.updateOffset(this,i):N("Moment Timezone has no data for "+a+". See http://momentjs.com/timezone/docs/#/data-loading/."),this):this._z?this._z.name:void 0},B.zoneName=G(B.zoneName),B.zoneAbbr=G(B.zoneAbbr),B.utc=(O=B.utc,function(){return this._z=null,O.apply(this,arguments)}),A.tz.setDefault=function(a){return(e<2||2===e&&r<9)&&N("Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js "+A.version+"."),A.defaultZone=a?S(a):null,A};var D=A.momentProperties;return"[object Array]"===Object.prototype.toString.call(D)?(D.push("_z"),D.push("_a")):D&&(D._z=null),_({version:"2018e",zones:["Africa/Abidjan|GMT|0|0||48e5","Africa/Nairobi|EAT|-30|0||47e5","Africa/Algiers|CET|-10|0||26e5","Africa/Lagos|WAT|-10|0||17e6","Africa/Maputo|CAT|-20|0||26e5","Africa/Cairo|EET EEST|-20 -30|01010|1M2m0 gL0 e10 mn0|15e6","Africa/Casablanca|WET WEST|0 -10|0101010101010101010101010101010101010101010|1H3C0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 Rc0 11A0 e00 e00 U00 11A0 8o0 e00 11A0 11A0 5A0 e00 17c0 1fA0 1a00|32e5","Europe/Paris|CET CEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|11e6","Africa/Johannesburg|SAST|-20|0||84e5","Africa/Khartoum|EAT CAT|-30 -20|01|1Usl0|51e5","Africa/Sao_Tome|GMT WAT|0 -10|01|1UQN0","Africa/Tripoli|EET CET CEST|-20 -10 -20|0120|1IlA0 TA0 1o00|11e5","Africa/Windhoek|CAT WAT|-20 -10|0101010101010|1GQo0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|32e4","America/Adak|HST HDT|a0 90|01010101010101010101010|1GIc0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|326","America/Anchorage|AKST AKDT|90 80|01010101010101010101010|1GIb0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|30e4","America/Santo_Domingo|AST|40|0||29e5","America/Araguaina|-03 -02|30 20|010|1IdD0 Lz0|14e4","America/Fortaleza|-03|30|0||34e5","America/Asuncion|-03 -04|30 40|01010101010101010101010|1GTf0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0|28e5","America/Panama|EST|50|0||15e5","America/Mexico_City|CST CDT|60 50|01010101010101010101010|1GQw0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0|20e6","America/Bahia|-02 -03|20 30|01|1GCq0|27e5","America/Managua|CST|60|0||22e5","America/La_Paz|-04|40|0||19e5","America/Lima|-05|50|0||11e6","America/Denver|MST MDT|70 60|01010101010101010101010|1GI90 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|26e5","America/Campo_Grande|-03 -04|30 40|01010101010101010101010|1GCr0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0|77e4","America/Cancun|CST CDT EST|60 50 50|01010102|1GQw0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4","America/Caracas|-0430 -04|4u 40|01|1QMT0|29e5","America/Chicago|CST CDT|60 50|01010101010101010101010|1GI80 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|92e5","America/Chihuahua|MST MDT|70 60|01010101010101010101010|1GQx0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0|81e4","America/Phoenix|MST|70|0||42e5","America/Los_Angeles|PST PDT|80 70|01010101010101010101010|1GIa0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|15e6","America/New_York|EST EDT|50 40|01010101010101010101010|1GI70 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|21e6","America/Rio_Branco|-04 -05|40 50|01|1KLE0|31e4","America/Fort_Nelson|PST PDT MST|80 70 70|01010102|1GIa0 1zb0 Op0 1zb0 Op0 1zb0 Op0|39e2","America/Halifax|AST ADT|40 30|01010101010101010101010|1GI60 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|39e4","America/Godthab|-03 -02|30 20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|17e3","America/Grand_Turk|EST EDT AST|50 40 40|0101010121010101010|1GI70 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 5Ip0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|37e2","America/Havana|CST CDT|50 40|01010101010101010101010|1GQt0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0|21e5","America/Metlakatla|PST AKST AKDT|80 90 80|0121212121212121|1PAa0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|14e2","America/Miquelon|-03 -02|30 20|01010101010101010101010|1GI50 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|61e2","America/Montevideo|-02 -03|20 30|01010101|1GI40 1o10 11z0 1o10 11z0 1o10 11z0|17e5","America/Noronha|-02|20|0||30e2","America/Port-au-Prince|EST EDT|50 40|010101010101010101010|1GI70 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 3iN0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|23e5","Antarctica/Palmer|-03 -04|30 40|010101010|1H3D0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|40","America/Santiago|-03 -04|30 40|010101010101010101010|1H3D0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0|62e5","America/Sao_Paulo|-02 -03|20 30|01010101010101010101010|1GCq0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0|20e6","Atlantic/Azores|-01 +00|10 0|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|25e4","America/St_Johns|NST NDT|3u 2u|01010101010101010101010|1GI5u 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|11e4","Antarctica/Casey|+11 +08|-b0 -80|0101|1GAF0 blz0 3m10|10","Antarctica/Davis|+05 +07|-50 -70|01|1GAI0|70","Pacific/Port_Moresby|+10|-a0|0||25e4","Pacific/Guadalcanal|+11|-b0|0||11e4","Asia/Tashkent|+05|-50|0||23e5","Pacific/Auckland|NZDT NZST|-d0 -c0|01010101010101010101010|1GQe0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00|14e5","Asia/Baghdad|+03|-30|0||66e5","Antarctica/Troll|+00 +02|0 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|40","Asia/Dhaka|+06|-60|0||16e6","Asia/Amman|EET EEST|-20 -30|010101010101010101010|1GPy0 4bX0 Dd0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00|25e5","Asia/Kamchatka|+12|-c0|0||18e4","Asia/Baku|+04 +05|-40 -50|010101010|1GNA0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5","Asia/Bangkok|+07|-70|0||15e6","Asia/Barnaul|+07 +06|-70 -60|010|1N7v0 3rd0","Asia/Beirut|EET EEST|-20 -30|01010101010101010101010|1GNy0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0|22e5","Asia/Manila|+08|-80|0||24e6","Asia/Kolkata|IST|-5u|0||15e6","Asia/Chita|+10 +08 +09|-a0 -80 -90|012|1N7s0 3re0|33e4","Asia/Ulaanbaatar|+08 +09|-80 -90|01010|1O8G0 1cJ0 1cP0 1cJ0|12e5","Asia/Shanghai|CST|-80|0||23e6","Asia/Colombo|+0530|-5u|0||22e5","Asia/Damascus|EET EEST|-20 -30|01010101010101010101010|1GPy0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0|26e5","Asia/Dili|+09|-90|0||19e4","Asia/Dubai|+04|-40|0||39e5","Asia/Famagusta|EET EEST +03|-20 -30 -30|0101010101201010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0","Asia/Gaza|EET EEST|-20 -30|01010101010101010101010|1GPy0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nz0 1220 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0|18e5","Asia/Hong_Kong|HKT|-80|0||73e5","Asia/Hovd|+07 +08|-70 -80|01010|1O8H0 1cJ0 1cP0 1cJ0|81e3","Asia/Irkutsk|+09 +08|-90 -80|01|1N7t0|60e4","Europe/Istanbul|EET EEST +03|-20 -30 -30|01010101012|1GNB0 1qM0 11A0 1o00 1200 1nA0 11A0 1tA0 U00 15w0|13e6","Asia/Jakarta|WIB|-70|0||31e6","Asia/Jayapura|WIT|-90|0||26e4","Asia/Jerusalem|IST IDT|-20 -30|01010101010101010101010|1GPA0 1aL0 1eN0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0|81e4","Asia/Kabul|+0430|-4u|0||46e5","Asia/Karachi|PKT|-50|0||24e6","Asia/Kathmandu|+0545|-5J|0||12e5","Asia/Yakutsk|+10 +09|-a0 -90|01|1N7s0|28e4","Asia/Krasnoyarsk|+08 +07|-80 -70|01|1N7u0|10e5","Asia/Magadan|+12 +10 +11|-c0 -a0 -b0|012|1N7q0 3Cq0|95e3","Asia/Makassar|WITA|-80|0||15e5","Europe/Athens|EET EEST|-20 -30|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|35e5","Asia/Novosibirsk|+07 +06|-70 -60|010|1N7v0 4eN0|15e5","Asia/Omsk|+07 +06|-70 -60|01|1N7v0|12e5","Asia/Pyongyang|KST KST|-90 -8u|010|1P4D0 6BAu|29e5","Asia/Rangoon|+0630|-6u|0||48e5","Asia/Sakhalin|+11 +10|-b0 -a0|010|1N7r0 3rd0|58e4","Asia/Seoul|KST|-90|0||23e6","Asia/Srednekolymsk|+12 +11|-c0 -b0|01|1N7q0|35e2","Asia/Tehran|+0330 +0430|-3u -4u|01010101010101010101010|1GLUu 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0|14e6","Asia/Tokyo|JST|-90|0||38e6","Asia/Tomsk|+07 +06|-70 -60|010|1N7v0 3Qp0|10e5","Asia/Vladivostok|+11 +10|-b0 -a0|01|1N7r0|60e4","Asia/Yekaterinburg|+06 +05|-60 -50|01|1N7w0|14e5","Europe/Lisbon|WET WEST|0 -10|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|27e5","Atlantic/Cape_Verde|-01|10|0||50e4","Australia/Sydney|AEDT AEST|-b0 -a0|01010101010101010101010|1GQg0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|40e5","Australia/Adelaide|ACDT ACST|-au -9u|01010101010101010101010|1GQgu 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|11e5","Australia/Brisbane|AEST|-a0|0||20e5","Australia/Darwin|ACST|-9u|0||12e4","Australia/Eucla|+0845|-8J|0||368","Australia/Lord_Howe|+11 +1030|-b0 -au|01010101010101010101010|1GQf0 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu|347","Australia/Perth|AWST|-80|0||18e5","Pacific/Easter|-05 -06|50 60|010101010101010101010|1H3D0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0|30e2","Europe/Dublin|GMT IST|0 -10|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|12e5","Etc/GMT-1|+01|-10|0|","Pacific/Fakaofo|+13|-d0|0||483","Pacific/Kiritimati|+14|-e0|0||51e2","Etc/GMT-2|+02|-20|0|","Pacific/Tahiti|-10|a0|0||18e4","Pacific/Niue|-11|b0|0||12e2","Etc/GMT+12|-12|c0|0|","Pacific/Galapagos|-06|60|0||25e3","Etc/GMT+7|-07|70|0|","Pacific/Pitcairn|-08|80|0||56","Pacific/Gambier|-09|90|0||125","Etc/UCT|UCT|0|0|","Etc/UTC|UTC|0|0|","Europe/Astrakhan|+04 +03|-40 -30|010|1N7y0 3rd0","Europe/London|GMT BST|0 -10|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|10e6","Europe/Chisinau|EET EEST|-20 -30|01010101010101010101010|1GNA0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|67e4","Europe/Kaliningrad|+03 EET|-30 -20|01|1N7z0|44e4","Europe/Volgograd|+04 +03|-40 -30|01|1N7y0|10e5","Europe/Moscow|MSK MSK|-40 -30|01|1N7y0|16e6","Europe/Saratov|+04 +03|-40 -30|010|1N7y0 5810","Europe/Simferopol|EET EEST MSK MSK|-20 -30 -40 -30|0101023|1GNB0 1qM0 11A0 1o00 11z0 1nW0|33e4","Pacific/Honolulu|HST|a0|0||37e4","MET|MET MEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0","Pacific/Chatham|+1345 +1245|-dJ -cJ|01010101010101010101010|1GQe0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00|600","Pacific/Apia|+14 +13|-e0 -d0|01010101010101010101010|1GQe0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00|37e3","Pacific/Bougainville|+10 +11|-a0 -b0|01|1NwE0|18e4","Pacific/Fiji|+13 +12|-d0 -c0|01010101010101010101010|1Goe0 1Nc0 Ao0 1Q00 xz0 1SN0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0|88e4","Pacific/Guam|ChST|-a0|0||17e4","Pacific/Marquesas|-0930|9u|0||86e2","Pacific/Pago_Pago|SST|b0|0||37e2","Pacific/Norfolk|+1130 +11|-bu -b0|01|1PoCu|25e4","Pacific/Tongatapu|+13 +14|-d0 -e0|010|1S4d0 s00|75e3"],links:["Africa/Abidjan|Africa/Accra","Africa/Abidjan|Africa/Bamako","Africa/Abidjan|Africa/Banjul","Africa/Abidjan|Africa/Bissau","Africa/Abidjan|Africa/Conakry","Africa/Abidjan|Africa/Dakar","Africa/Abidjan|Africa/Freetown","Africa/Abidjan|Africa/Lome","Africa/Abidjan|Africa/Monrovia","Africa/Abidjan|Africa/Nouakchott","Africa/Abidjan|Africa/Ouagadougou","Africa/Abidjan|Africa/Timbuktu","Africa/Abidjan|America/Danmarkshavn","Africa/Abidjan|Atlantic/Reykjavik","Africa/Abidjan|Atlantic/St_Helena","Africa/Abidjan|Etc/GMT","Africa/Abidjan|Etc/GMT+0","Africa/Abidjan|Etc/GMT-0","Africa/Abidjan|Etc/GMT0","Africa/Abidjan|Etc/Greenwich","Africa/Abidjan|GMT","Africa/Abidjan|GMT+0","Africa/Abidjan|GMT-0","Africa/Abidjan|GMT0","Africa/Abidjan|Greenwich","Africa/Abidjan|Iceland","Africa/Algiers|Africa/Tunis","Africa/Cairo|Egypt","Africa/Casablanca|Africa/El_Aaiun","Africa/Johannesburg|Africa/Maseru","Africa/Johannesburg|Africa/Mbabane","Africa/Lagos|Africa/Bangui","Africa/Lagos|Africa/Brazzaville","Africa/Lagos|Africa/Douala","Africa/Lagos|Africa/Kinshasa","Africa/Lagos|Africa/Libreville","Africa/Lagos|Africa/Luanda","Africa/Lagos|Africa/Malabo","Africa/Lagos|Africa/Ndjamena","Africa/Lagos|Africa/Niamey","Africa/Lagos|Africa/Porto-Novo","Africa/Maputo|Africa/Blantyre","Africa/Maputo|Africa/Bujumbura","Africa/Maputo|Africa/Gaborone","Africa/Maputo|Africa/Harare","Africa/Maputo|Africa/Kigali","Africa/Maputo|Africa/Lubumbashi","Africa/Maputo|Africa/Lusaka","Africa/Nairobi|Africa/Addis_Ababa","Africa/Nairobi|Africa/Asmara","Africa/Nairobi|Africa/Asmera","Africa/Nairobi|Africa/Dar_es_Salaam","Africa/Nairobi|Africa/Djibouti","Africa/Nairobi|Africa/Juba","Africa/Nairobi|Africa/Kampala","Africa/Nairobi|Africa/Mogadishu","Africa/Nairobi|Indian/Antananarivo","Africa/Nairobi|Indian/Comoro","Africa/Nairobi|Indian/Mayotte","Africa/Tripoli|Libya","America/Adak|America/Atka","America/Adak|US/Aleutian","America/Anchorage|America/Juneau","America/Anchorage|America/Nome","America/Anchorage|America/Sitka","America/Anchorage|America/Yakutat","America/Anchorage|US/Alaska","America/Campo_Grande|America/Cuiaba","America/Chicago|America/Indiana/Knox","America/Chicago|America/Indiana/Tell_City","America/Chicago|America/Knox_IN","America/Chicago|America/Matamoros","America/Chicago|America/Menominee","America/Chicago|America/North_Dakota/Beulah","America/Chicago|America/North_Dakota/Center","America/Chicago|America/North_Dakota/New_Salem","America/Chicago|America/Rainy_River","America/Chicago|America/Rankin_Inlet","America/Chicago|America/Resolute","America/Chicago|America/Winnipeg","America/Chicago|CST6CDT","America/Chicago|Canada/Central","America/Chicago|US/Central","America/Chicago|US/Indiana-Starke","America/Chihuahua|America/Mazatlan","America/Chihuahua|Mexico/BajaSur","America/Denver|America/Boise","America/Denver|America/Cambridge_Bay","America/Denver|America/Edmonton","America/Denver|America/Inuvik","America/Denver|America/Ojinaga","America/Denver|America/Shiprock","America/Denver|America/Yellowknife","America/Denver|Canada/Mountain","America/Denver|MST7MDT","America/Denver|Navajo","America/Denver|US/Mountain","America/Fortaleza|America/Argentina/Buenos_Aires","America/Fortaleza|America/Argentina/Catamarca","America/Fortaleza|America/Argentina/ComodRivadavia","America/Fortaleza|America/Argentina/Cordoba","America/Fortaleza|America/Argentina/Jujuy","America/Fortaleza|America/Argentina/La_Rioja","America/Fortaleza|America/Argentina/Mendoza","America/Fortaleza|America/Argentina/Rio_Gallegos","America/Fortaleza|America/Argentina/Salta","America/Fortaleza|America/Argentina/San_Juan","America/Fortaleza|America/Argentina/San_Luis","America/Fortaleza|America/Argentina/Tucuman","America/Fortaleza|America/Argentina/Ushuaia","America/Fortaleza|America/Belem","America/Fortaleza|America/Buenos_Aires","America/Fortaleza|America/Catamarca","America/Fortaleza|America/Cayenne","America/Fortaleza|America/Cordoba","America/Fortaleza|America/Jujuy","America/Fortaleza|America/Maceio","America/Fortaleza|America/Mendoza","America/Fortaleza|America/Paramaribo","America/Fortaleza|America/Recife","America/Fortaleza|America/Rosario","America/Fortaleza|America/Santarem","America/Fortaleza|Antarctica/Rothera","America/Fortaleza|Atlantic/Stanley","America/Fortaleza|Etc/GMT+3","America/Halifax|America/Glace_Bay","America/Halifax|America/Goose_Bay","America/Halifax|America/Moncton","America/Halifax|America/Thule","America/Halifax|Atlantic/Bermuda","America/Halifax|Canada/Atlantic","America/Havana|Cuba","America/La_Paz|America/Boa_Vista","America/La_Paz|America/Guyana","America/La_Paz|America/Manaus","America/La_Paz|America/Porto_Velho","America/La_Paz|Brazil/West","America/La_Paz|Etc/GMT+4","America/Lima|America/Bogota","America/Lima|America/Guayaquil","America/Lima|Etc/GMT+5","America/Los_Angeles|America/Dawson","America/Los_Angeles|America/Ensenada","America/Los_Angeles|America/Santa_Isabel","America/Los_Angeles|America/Tijuana","America/Los_Angeles|America/Vancouver","America/Los_Angeles|America/Whitehorse","America/Los_Angeles|Canada/Pacific","America/Los_Angeles|Canada/Yukon","America/Los_Angeles|Mexico/BajaNorte","America/Los_Angeles|PST8PDT","America/Los_Angeles|US/Pacific","America/Los_Angeles|US/Pacific-New","America/Managua|America/Belize","America/Managua|America/Costa_Rica","America/Managua|America/El_Salvador","America/Managua|America/Guatemala","America/Managua|America/Regina","America/Managua|America/Swift_Current","America/Managua|America/Tegucigalpa","America/Managua|Canada/Saskatchewan","America/Mexico_City|America/Bahia_Banderas","America/Mexico_City|America/Merida","America/Mexico_City|America/Monterrey","America/Mexico_City|Mexico/General","America/New_York|America/Detroit","America/New_York|America/Fort_Wayne","America/New_York|America/Indiana/Indianapolis","America/New_York|America/Indiana/Marengo","America/New_York|America/Indiana/Petersburg","America/New_York|America/Indiana/Vevay","America/New_York|America/Indiana/Vincennes","America/New_York|America/Indiana/Winamac","America/New_York|America/Indianapolis","America/New_York|America/Iqaluit","America/New_York|America/Kentucky/Louisville","America/New_York|America/Kentucky/Monticello","America/New_York|America/Louisville","America/New_York|America/Montreal","America/New_York|America/Nassau","America/New_York|America/Nipigon","America/New_York|America/Pangnirtung","America/New_York|America/Thunder_Bay","America/New_York|America/Toronto","America/New_York|Canada/Eastern","America/New_York|EST5EDT","America/New_York|US/East-Indiana","America/New_York|US/Eastern","America/New_York|US/Michigan","America/Noronha|Atlantic/South_Georgia","America/Noronha|Brazil/DeNoronha","America/Noronha|Etc/GMT+2","America/Panama|America/Atikokan","America/Panama|America/Cayman","America/Panama|America/Coral_Harbour","America/Panama|America/Jamaica","America/Panama|EST","America/Panama|Jamaica","America/Phoenix|America/Creston","America/Phoenix|America/Dawson_Creek","America/Phoenix|America/Hermosillo","America/Phoenix|MST","America/Phoenix|US/Arizona","America/Rio_Branco|America/Eirunepe","America/Rio_Branco|America/Porto_Acre","America/Rio_Branco|Brazil/Acre","America/Santiago|Chile/Continental","America/Santo_Domingo|America/Anguilla","America/Santo_Domingo|America/Antigua","America/Santo_Domingo|America/Aruba","America/Santo_Domingo|America/Barbados","America/Santo_Domingo|America/Blanc-Sablon","America/Santo_Domingo|America/Curacao","America/Santo_Domingo|America/Dominica","America/Santo_Domingo|America/Grenada","America/Santo_Domingo|America/Guadeloupe","America/Santo_Domingo|America/Kralendijk","America/Santo_Domingo|America/Lower_Princes","America/Santo_Domingo|America/Marigot","America/Santo_Domingo|America/Martinique","America/Santo_Domingo|America/Montserrat","America/Santo_Domingo|America/Port_of_Spain","America/Santo_Domingo|America/Puerto_Rico","America/Santo_Domingo|America/St_Barthelemy","America/Santo_Domingo|America/St_Kitts","America/Santo_Domingo|America/St_Lucia","America/Santo_Domingo|America/St_Thomas","America/Santo_Domingo|America/St_Vincent","America/Santo_Domingo|America/Tortola","America/Santo_Domingo|America/Virgin","America/Sao_Paulo|Brazil/East","America/St_Johns|Canada/Newfoundland","Antarctica/Palmer|America/Punta_Arenas","Asia/Baghdad|Antarctica/Syowa","Asia/Baghdad|Asia/Aden","Asia/Baghdad|Asia/Bahrain","Asia/Baghdad|Asia/Kuwait","Asia/Baghdad|Asia/Qatar","Asia/Baghdad|Asia/Riyadh","Asia/Baghdad|Etc/GMT-3","Asia/Baghdad|Europe/Minsk","Asia/Bangkok|Asia/Ho_Chi_Minh","Asia/Bangkok|Asia/Novokuznetsk","Asia/Bangkok|Asia/Phnom_Penh","Asia/Bangkok|Asia/Saigon","Asia/Bangkok|Asia/Vientiane","Asia/Bangkok|Etc/GMT-7","Asia/Bangkok|Indian/Christmas","Asia/Dhaka|Antarctica/Vostok","Asia/Dhaka|Asia/Almaty","Asia/Dhaka|Asia/Bishkek","Asia/Dhaka|Asia/Dacca","Asia/Dhaka|Asia/Kashgar","Asia/Dhaka|Asia/Qyzylorda","Asia/Dhaka|Asia/Thimbu","Asia/Dhaka|Asia/Thimphu","Asia/Dhaka|Asia/Urumqi","Asia/Dhaka|Etc/GMT-6","Asia/Dhaka|Indian/Chagos","Asia/Dili|Etc/GMT-9","Asia/Dili|Pacific/Palau","Asia/Dubai|Asia/Muscat","Asia/Dubai|Asia/Tbilisi","Asia/Dubai|Asia/Yerevan","Asia/Dubai|Etc/GMT-4","Asia/Dubai|Europe/Samara","Asia/Dubai|Indian/Mahe","Asia/Dubai|Indian/Mauritius","Asia/Dubai|Indian/Reunion","Asia/Gaza|Asia/Hebron","Asia/Hong_Kong|Hongkong","Asia/Jakarta|Asia/Pontianak","Asia/Jerusalem|Asia/Tel_Aviv","Asia/Jerusalem|Israel","Asia/Kamchatka|Asia/Anadyr","Asia/Kamchatka|Etc/GMT-12","Asia/Kamchatka|Kwajalein","Asia/Kamchatka|Pacific/Funafuti","Asia/Kamchatka|Pacific/Kwajalein","Asia/Kamchatka|Pacific/Majuro","Asia/Kamchatka|Pacific/Nauru","Asia/Kamchatka|Pacific/Tarawa","Asia/Kamchatka|Pacific/Wake","Asia/Kamchatka|Pacific/Wallis","Asia/Kathmandu|Asia/Katmandu","Asia/Kolkata|Asia/Calcutta","Asia/Makassar|Asia/Ujung_Pandang","Asia/Manila|Asia/Brunei","Asia/Manila|Asia/Kuala_Lumpur","Asia/Manila|Asia/Kuching","Asia/Manila|Asia/Singapore","Asia/Manila|Etc/GMT-8","Asia/Manila|Singapore","Asia/Rangoon|Asia/Yangon","Asia/Rangoon|Indian/Cocos","Asia/Seoul|ROK","Asia/Shanghai|Asia/Chongqing","Asia/Shanghai|Asia/Chungking","Asia/Shanghai|Asia/Harbin","Asia/Shanghai|Asia/Macao","Asia/Shanghai|Asia/Macau","Asia/Shanghai|Asia/Taipei","Asia/Shanghai|PRC","Asia/Shanghai|ROC","Asia/Tashkent|Antarctica/Mawson","Asia/Tashkent|Asia/Aqtau","Asia/Tashkent|Asia/Aqtobe","Asia/Tashkent|Asia/Ashgabat","Asia/Tashkent|Asia/Ashkhabad","Asia/Tashkent|Asia/Atyrau","Asia/Tashkent|Asia/Dushanbe","Asia/Tashkent|Asia/Oral","Asia/Tashkent|Asia/Samarkand","Asia/Tashkent|Etc/GMT-5","Asia/Tashkent|Indian/Kerguelen","Asia/Tashkent|Indian/Maldives","Asia/Tehran|Iran","Asia/Tokyo|Japan","Asia/Ulaanbaatar|Asia/Choibalsan","Asia/Ulaanbaatar|Asia/Ulan_Bator","Asia/Vladivostok|Asia/Ust-Nera","Asia/Yakutsk|Asia/Khandyga","Atlantic/Azores|America/Scoresbysund","Atlantic/Cape_Verde|Etc/GMT+1","Australia/Adelaide|Australia/Broken_Hill","Australia/Adelaide|Australia/South","Australia/Adelaide|Australia/Yancowinna","Australia/Brisbane|Australia/Lindeman","Australia/Brisbane|Australia/Queensland","Australia/Darwin|Australia/North","Australia/Lord_Howe|Australia/LHI","Australia/Perth|Australia/West","Australia/Sydney|Australia/ACT","Australia/Sydney|Australia/Canberra","Australia/Sydney|Australia/Currie","Australia/Sydney|Australia/Hobart","Australia/Sydney|Australia/Melbourne","Australia/Sydney|Australia/NSW","Australia/Sydney|Australia/Tasmania","Australia/Sydney|Australia/Victoria","Etc/UCT|UCT","Etc/UTC|Etc/Universal","Etc/UTC|Etc/Zulu","Etc/UTC|UTC","Etc/UTC|Universal","Etc/UTC|Zulu","Europe/Astrakhan|Europe/Ulyanovsk","Europe/Athens|Asia/Nicosia","Europe/Athens|EET","Europe/Athens|Europe/Bucharest","Europe/Athens|Europe/Helsinki","Europe/Athens|Europe/Kiev","Europe/Athens|Europe/Mariehamn","Europe/Athens|Europe/Nicosia","Europe/Athens|Europe/Riga","Europe/Athens|Europe/Sofia","Europe/Athens|Europe/Tallinn","Europe/Athens|Europe/Uzhgorod","Europe/Athens|Europe/Vilnius","Europe/Athens|Europe/Zaporozhye","Europe/Chisinau|Europe/Tiraspol","Europe/Dublin|Eire","Europe/Istanbul|Asia/Istanbul","Europe/Istanbul|Turkey","Europe/Lisbon|Atlantic/Canary","Europe/Lisbon|Atlantic/Faeroe","Europe/Lisbon|Atlantic/Faroe","Europe/Lisbon|Atlantic/Madeira","Europe/Lisbon|Portugal","Europe/Lisbon|WET","Europe/London|Europe/Belfast","Europe/London|Europe/Guernsey","Europe/London|Europe/Isle_of_Man","Europe/London|Europe/Jersey","Europe/London|GB","Europe/London|GB-Eire","Europe/Moscow|W-SU","Europe/Paris|Africa/Ceuta","Europe/Paris|Arctic/Longyearbyen","Europe/Paris|Atlantic/Jan_Mayen","Europe/Paris|CET","Europe/Paris|Europe/Amsterdam","Europe/Paris|Europe/Andorra","Europe/Paris|Europe/Belgrade","Europe/Paris|Europe/Berlin","Europe/Paris|Europe/Bratislava","Europe/Paris|Europe/Brussels","Europe/Paris|Europe/Budapest","Europe/Paris|Europe/Busingen","Europe/Paris|Europe/Copenhagen","Europe/Paris|Europe/Gibraltar","Europe/Paris|Europe/Ljubljana","Europe/Paris|Europe/Luxembourg","Europe/Paris|Europe/Madrid","Europe/Paris|Europe/Malta","Europe/Paris|Europe/Monaco","Europe/Paris|Europe/Oslo","Europe/Paris|Europe/Podgorica","Europe/Paris|Europe/Prague","Europe/Paris|Europe/Rome","Europe/Paris|Europe/San_Marino","Europe/Paris|Europe/Sarajevo","Europe/Paris|Europe/Skopje","Europe/Paris|Europe/Stockholm","Europe/Paris|Europe/Tirane","Europe/Paris|Europe/Vaduz","Europe/Paris|Europe/Vatican","Europe/Paris|Europe/Vienna","Europe/Paris|Europe/Warsaw","Europe/Paris|Europe/Zagreb","Europe/Paris|Europe/Zurich","Europe/Paris|Poland","Europe/Volgograd|Europe/Kirov","Pacific/Auckland|Antarctica/McMurdo","Pacific/Auckland|Antarctica/South_Pole","Pacific/Auckland|NZ","Pacific/Chatham|NZ-CHAT","Pacific/Easter|Chile/EasterIsland","Pacific/Fakaofo|Etc/GMT-13","Pacific/Fakaofo|Pacific/Enderbury","Pacific/Galapagos|Etc/GMT+6","Pacific/Gambier|Etc/GMT+9","Pacific/Guadalcanal|Antarctica/Macquarie","Pacific/Guadalcanal|Etc/GMT-11","Pacific/Guadalcanal|Pacific/Efate","Pacific/Guadalcanal|Pacific/Kosrae","Pacific/Guadalcanal|Pacific/Noumea","Pacific/Guadalcanal|Pacific/Pohnpei","Pacific/Guadalcanal|Pacific/Ponape","Pacific/Guam|Pacific/Saipan","Pacific/Honolulu|HST","Pacific/Honolulu|Pacific/Johnston","Pacific/Honolulu|US/Hawaii","Pacific/Kiritimati|Etc/GMT-14","Pacific/Niue|Etc/GMT+11","Pacific/Pago_Pago|Pacific/Midway","Pacific/Pago_Pago|Pacific/Samoa","Pacific/Pago_Pago|US/Samoa","Pacific/Pitcairn|Etc/GMT+8","Pacific/Port_Moresby|Antarctica/DumontDUrville","Pacific/Port_Moresby|Etc/GMT-10","Pacific/Port_Moresby|Pacific/Chuuk","Pacific/Port_Moresby|Pacific/Truk","Pacific/Port_Moresby|Pacific/Yap","Pacific/Tahiti|Etc/GMT+10","Pacific/Tahiti|Pacific/Rarotonga"]}),A}); \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/builds/moment-timezone-with-data.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/builds/moment-timezone-with-data.js
new file mode 100644
index 00000000000..23a50faa422
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/builds/moment-timezone-with-data.js
@@ -0,0 +1,1204 @@
+//! moment-timezone.js
+//! version : 0.5.17
+//! Copyright (c) JS Foundation and other contributors
+//! license : MIT
+//! github.com/moment/moment-timezone
+
+(function (root, factory) {
+ "use strict";
+
+ /*global define*/
+ if (typeof define === 'function' && define.amd) {
+ define(['moment'], factory); // AMD
+ } else if (typeof module === 'object' && module.exports) {
+ module.exports = factory(require('moment')); // Node
+ } else {
+ factory(root.moment); // Browser
+ }
+}(this, function (moment) {
+ "use strict";
+
+ // Do not load moment-timezone a second time.
+ // if (moment.tz !== undefined) {
+ // logError('Moment Timezone ' + moment.tz.version + ' was already loaded ' + (moment.tz.dataVersion ? 'with data from ' : 'without any data') + moment.tz.dataVersion);
+ // return moment;
+ // }
+
+ var VERSION = "0.5.17",
+ zones = {},
+ links = {},
+ names = {},
+ guesses = {},
+ cachedGuess,
+
+ momentVersion = moment.version.split('.'),
+ major = +momentVersion[0],
+ minor = +momentVersion[1];
+
+ // Moment.js version check
+ if (major < 2 || (major === 2 && minor < 6)) {
+ logError('Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js ' + moment.version + '. See momentjs.com');
+ }
+
+ /************************************
+ Unpacking
+ ************************************/
+
+ function charCodeToInt(charCode) {
+ if (charCode > 96) {
+ return charCode - 87;
+ } else if (charCode > 64) {
+ return charCode - 29;
+ }
+ return charCode - 48;
+ }
+
+ function unpackBase60(string) {
+ var i = 0,
+ parts = string.split('.'),
+ whole = parts[0],
+ fractional = parts[1] || '',
+ multiplier = 1,
+ num,
+ out = 0,
+ sign = 1;
+
+ // handle negative numbers
+ if (string.charCodeAt(0) === 45) {
+ i = 1;
+ sign = -1;
+ }
+
+ // handle digits before the decimal
+ for (i; i < whole.length; i++) {
+ num = charCodeToInt(whole.charCodeAt(i));
+ out = 60 * out + num;
+ }
+
+ // handle digits after the decimal
+ for (i = 0; i < fractional.length; i++) {
+ multiplier = multiplier / 60;
+ num = charCodeToInt(fractional.charCodeAt(i));
+ out += num * multiplier;
+ }
+
+ return out * sign;
+ }
+
+ function arrayToInt (array) {
+ for (var i = 0; i < array.length; i++) {
+ array[i] = unpackBase60(array[i]);
+ }
+ }
+
+ function intToUntil (array, length) {
+ for (var i = 0; i < length; i++) {
+ array[i] = Math.round((array[i - 1] || 0) + (array[i] * 60000)); // minutes to milliseconds
+ }
+
+ array[length - 1] = Infinity;
+ }
+
+ function mapIndices (source, indices) {
+ var out = [], i;
+
+ for (i = 0; i < indices.length; i++) {
+ out[i] = source[indices[i]];
+ }
+
+ return out;
+ }
+
+ function unpack (string) {
+ var data = string.split('|'),
+ offsets = data[2].split(' '),
+ indices = data[3].split(''),
+ untils = data[4].split(' ');
+
+ arrayToInt(offsets);
+ arrayToInt(indices);
+ arrayToInt(untils);
+
+ intToUntil(untils, indices.length);
+
+ return {
+ name : data[0],
+ abbrs : mapIndices(data[1].split(' '), indices),
+ offsets : mapIndices(offsets, indices),
+ untils : untils,
+ population : data[5] | 0
+ };
+ }
+
+ /************************************
+ Zone object
+ ************************************/
+
+ function Zone (packedString) {
+ if (packedString) {
+ this._set(unpack(packedString));
+ }
+ }
+
+ Zone.prototype = {
+ _set : function (unpacked) {
+ this.name = unpacked.name;
+ this.abbrs = unpacked.abbrs;
+ this.untils = unpacked.untils;
+ this.offsets = unpacked.offsets;
+ this.population = unpacked.population;
+ },
+
+ _index : function (timestamp) {
+ var target = +timestamp,
+ untils = this.untils,
+ i;
+
+ for (i = 0; i < untils.length; i++) {
+ if (target < untils[i]) {
+ return i;
+ }
+ }
+ },
+
+ parse : function (timestamp) {
+ var target = +timestamp,
+ offsets = this.offsets,
+ untils = this.untils,
+ max = untils.length - 1,
+ offset, offsetNext, offsetPrev, i;
+
+ for (i = 0; i < max; i++) {
+ offset = offsets[i];
+ offsetNext = offsets[i + 1];
+ offsetPrev = offsets[i ? i - 1 : i];
+
+ if (offset < offsetNext && tz.moveAmbiguousForward) {
+ offset = offsetNext;
+ } else if (offset > offsetPrev && tz.moveInvalidForward) {
+ offset = offsetPrev;
+ }
+
+ if (target < untils[i] - (offset * 60000)) {
+ return offsets[i];
+ }
+ }
+
+ return offsets[max];
+ },
+
+ abbr : function (mom) {
+ return this.abbrs[this._index(mom)];
+ },
+
+ offset : function (mom) {
+ logError("zone.offset has been deprecated in favor of zone.utcOffset");
+ return this.offsets[this._index(mom)];
+ },
+
+ utcOffset : function (mom) {
+ return this.offsets[this._index(mom)];
+ }
+ };
+
+ /************************************
+ Current Timezone
+ ************************************/
+
+ function OffsetAt(at) {
+ var timeString = at.toTimeString();
+ var abbr = timeString.match(/\([a-z ]+\)/i);
+ if (abbr && abbr[0]) {
+ // 17:56:31 GMT-0600 (CST)
+ // 17:56:31 GMT-0600 (Central Standard Time)
+ abbr = abbr[0].match(/[A-Z]/g);
+ abbr = abbr ? abbr.join('') : undefined;
+ } else {
+ // 17:56:31 CST
+ // 17:56:31 GMT+0800 (台北標準時間)
+ abbr = timeString.match(/[A-Z]{3,5}/g);
+ abbr = abbr ? abbr[0] : undefined;
+ }
+
+ if (abbr === 'GMT') {
+ abbr = undefined;
+ }
+
+ this.at = +at;
+ this.abbr = abbr;
+ this.offset = at.getTimezoneOffset();
+ }
+
+ function ZoneScore(zone) {
+ this.zone = zone;
+ this.offsetScore = 0;
+ this.abbrScore = 0;
+ }
+
+ ZoneScore.prototype.scoreOffsetAt = function (offsetAt) {
+ this.offsetScore += Math.abs(this.zone.utcOffset(offsetAt.at) - offsetAt.offset);
+ if (this.zone.abbr(offsetAt.at).replace(/[^A-Z]/g, '') !== offsetAt.abbr) {
+ this.abbrScore++;
+ }
+ };
+
+ function findChange(low, high) {
+ var mid, diff;
+
+ while ((diff = ((high.at - low.at) / 12e4 | 0) * 6e4)) {
+ mid = new OffsetAt(new Date(low.at + diff));
+ if (mid.offset === low.offset) {
+ low = mid;
+ } else {
+ high = mid;
+ }
+ }
+
+ return low;
+ }
+
+ function userOffsets() {
+ var startYear = new Date().getFullYear() - 2,
+ last = new OffsetAt(new Date(startYear, 0, 1)),
+ offsets = [last],
+ change, next, i;
+
+ for (i = 1; i < 48; i++) {
+ next = new OffsetAt(new Date(startYear, i, 1));
+ if (next.offset !== last.offset) {
+ change = findChange(last, next);
+ offsets.push(change);
+ offsets.push(new OffsetAt(new Date(change.at + 6e4)));
+ }
+ last = next;
+ }
+
+ for (i = 0; i < 4; i++) {
+ offsets.push(new OffsetAt(new Date(startYear + i, 0, 1)));
+ offsets.push(new OffsetAt(new Date(startYear + i, 6, 1)));
+ }
+
+ return offsets;
+ }
+
+ function sortZoneScores (a, b) {
+ if (a.offsetScore !== b.offsetScore) {
+ return a.offsetScore - b.offsetScore;
+ }
+ if (a.abbrScore !== b.abbrScore) {
+ return a.abbrScore - b.abbrScore;
+ }
+ return b.zone.population - a.zone.population;
+ }
+
+ function addToGuesses (name, offsets) {
+ var i, offset;
+ arrayToInt(offsets);
+ for (i = 0; i < offsets.length; i++) {
+ offset = offsets[i];
+ guesses[offset] = guesses[offset] || {};
+ guesses[offset][name] = true;
+ }
+ }
+
+ function guessesForUserOffsets (offsets) {
+ var offsetsLength = offsets.length,
+ filteredGuesses = {},
+ out = [],
+ i, j, guessesOffset;
+
+ for (i = 0; i < offsetsLength; i++) {
+ guessesOffset = guesses[offsets[i].offset] || {};
+ for (j in guessesOffset) {
+ if (guessesOffset.hasOwnProperty(j)) {
+ filteredGuesses[j] = true;
+ }
+ }
+ }
+
+ for (i in filteredGuesses) {
+ if (filteredGuesses.hasOwnProperty(i)) {
+ out.push(names[i]);
+ }
+ }
+
+ return out;
+ }
+
+ function rebuildGuess () {
+
+ // use Intl API when available and returning valid time zone
+ try {
+ var intlName = Intl.DateTimeFormat().resolvedOptions().timeZone;
+ if (intlName && intlName.length > 3) {
+ var name = names[normalizeName(intlName)];
+ if (name) {
+ return name;
+ }
+ logError("Moment Timezone found " + intlName + " from the Intl api, but did not have that data loaded.");
+ }
+ } catch (e) {
+ // Intl unavailable, fall back to manual guessing.
+ }
+
+ var offsets = userOffsets(),
+ offsetsLength = offsets.length,
+ guesses = guessesForUserOffsets(offsets),
+ zoneScores = [],
+ zoneScore, i, j;
+
+ for (i = 0; i < guesses.length; i++) {
+ zoneScore = new ZoneScore(getZone(guesses[i]), offsetsLength);
+ for (j = 0; j < offsetsLength; j++) {
+ zoneScore.scoreOffsetAt(offsets[j]);
+ }
+ zoneScores.push(zoneScore);
+ }
+
+ zoneScores.sort(sortZoneScores);
+
+ return zoneScores.length > 0 ? zoneScores[0].zone.name : undefined;
+ }
+
+ function guess (ignoreCache) {
+ if (!cachedGuess || ignoreCache) {
+ cachedGuess = rebuildGuess();
+ }
+ return cachedGuess;
+ }
+
+ /************************************
+ Global Methods
+ ************************************/
+
+ function normalizeName (name) {
+ return (name || '').toLowerCase().replace(/\//g, '_');
+ }
+
+ function addZone (packed) {
+ var i, name, split, normalized;
+
+ if (typeof packed === "string") {
+ packed = [packed];
+ }
+
+ for (i = 0; i < packed.length; i++) {
+ split = packed[i].split('|');
+ name = split[0];
+ normalized = normalizeName(name);
+ zones[normalized] = packed[i];
+ names[normalized] = name;
+ addToGuesses(normalized, split[2].split(' '));
+ }
+ }
+
+ function getZone (name, caller) {
+ name = normalizeName(name);
+
+ var zone = zones[name];
+ var link;
+
+ if (zone instanceof Zone) {
+ return zone;
+ }
+
+ if (typeof zone === 'string') {
+ zone = new Zone(zone);
+ zones[name] = zone;
+ return zone;
+ }
+
+ // Pass getZone to prevent recursion more than 1 level deep
+ if (links[name] && caller !== getZone && (link = getZone(links[name], getZone))) {
+ zone = zones[name] = new Zone();
+ zone._set(link);
+ zone.name = names[name];
+ return zone;
+ }
+
+ return null;
+ }
+
+ function getNames () {
+ var i, out = [];
+
+ for (i in names) {
+ if (names.hasOwnProperty(i) && (zones[i] || zones[links[i]]) && names[i]) {
+ out.push(names[i]);
+ }
+ }
+
+ return out.sort();
+ }
+
+ function addLink (aliases) {
+ var i, alias, normal0, normal1;
+
+ if (typeof aliases === "string") {
+ aliases = [aliases];
+ }
+
+ for (i = 0; i < aliases.length; i++) {
+ alias = aliases[i].split('|');
+
+ normal0 = normalizeName(alias[0]);
+ normal1 = normalizeName(alias[1]);
+
+ links[normal0] = normal1;
+ names[normal0] = alias[0];
+
+ links[normal1] = normal0;
+ names[normal1] = alias[1];
+ }
+ }
+
+ function loadData (data) {
+ addZone(data.zones);
+ addLink(data.links);
+ tz.dataVersion = data.version;
+ }
+
+ function zoneExists (name) {
+ if (!zoneExists.didShowError) {
+ zoneExists.didShowError = true;
+ logError("moment.tz.zoneExists('" + name + "') has been deprecated in favor of !moment.tz.zone('" + name + "')");
+ }
+ return !!getZone(name);
+ }
+
+ function needsOffset (m) {
+ var isUnixTimestamp = (m._f === 'X' || m._f === 'x');
+ return !!(m._a && (m._tzm === undefined) && !isUnixTimestamp);
+ }
+
+ function logError (message) {
+ if (typeof console !== 'undefined' && typeof console.error === 'function') {
+ console.error(message);
+ }
+ }
+
+ /************************************
+ moment.tz namespace
+ ************************************/
+
+ function tz (input) {
+ var args = Array.prototype.slice.call(arguments, 0, -1),
+ name = arguments[arguments.length - 1],
+ zone = getZone(name),
+ out = moment.utc.apply(null, args);
+
+ if (zone && !moment.isMoment(input) && needsOffset(out)) {
+ out.add(zone.parse(out), 'minutes');
+ }
+
+ out.tz(name);
+
+ return out;
+ }
+
+ tz.version = VERSION;
+ tz.dataVersion = '';
+ tz._zones = zones;
+ tz._links = links;
+ tz._names = names;
+ tz.add = addZone;
+ tz.link = addLink;
+ tz.load = loadData;
+ tz.zone = getZone;
+ tz.zoneExists = zoneExists; // deprecated in 0.1.0
+ tz.guess = guess;
+ tz.names = getNames;
+ tz.Zone = Zone;
+ tz.unpack = unpack;
+ tz.unpackBase60 = unpackBase60;
+ tz.needsOffset = needsOffset;
+ tz.moveInvalidForward = true;
+ tz.moveAmbiguousForward = false;
+
+ /************************************
+ Interface with Moment.js
+ ************************************/
+
+ var fn = moment.fn;
+
+ moment.tz = tz;
+
+ moment.defaultZone = null;
+
+ moment.updateOffset = function (mom, keepTime) {
+ var zone = moment.defaultZone,
+ offset;
+
+ if (mom._z === undefined) {
+ if (zone && needsOffset(mom) && !mom._isUTC) {
+ mom._d = moment.utc(mom._a)._d;
+ mom.utc().add(zone.parse(mom), 'minutes');
+ }
+ mom._z = zone;
+ }
+ if (mom._z) {
+ offset = mom._z.utcOffset(mom);
+ if (Math.abs(offset) < 16) {
+ offset = offset / 60;
+ }
+ if (mom.utcOffset !== undefined) {
+ mom.utcOffset(-offset, keepTime);
+ } else {
+ mom.zone(offset, keepTime);
+ }
+ }
+ };
+
+ fn.tz = function (name, keepTime) {
+ if (name) {
+ this._z = getZone(name);
+ if (this._z) {
+ moment.updateOffset(this, keepTime);
+ } else {
+ logError("Moment Timezone has no data for " + name + ". See http://momentjs.com/timezone/docs/#/data-loading/.");
+ }
+ return this;
+ }
+ if (this._z) { return this._z.name; }
+ };
+
+ function abbrWrap (old) {
+ return function () {
+ if (this._z) { return this._z.abbr(this); }
+ return old.call(this);
+ };
+ }
+
+ function resetZoneWrap (old) {
+ return function () {
+ this._z = null;
+ return old.apply(this, arguments);
+ };
+ }
+
+ fn.zoneName = abbrWrap(fn.zoneName);
+ fn.zoneAbbr = abbrWrap(fn.zoneAbbr);
+ fn.utc = resetZoneWrap(fn.utc);
+
+ moment.tz.setDefault = function(name) {
+ if (major < 2 || (major === 2 && minor < 9)) {
+ logError('Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js ' + moment.version + '.');
+ }
+ moment.defaultZone = name ? getZone(name) : null;
+ return moment;
+ };
+
+ // Cloning a moment should include the _z property.
+ var momentProperties = moment.momentProperties;
+ if (Object.prototype.toString.call(momentProperties) === '[object Array]') {
+ // moment 2.8.1+
+ momentProperties.push('_z');
+ momentProperties.push('_a');
+ } else if (momentProperties) {
+ // moment 2.7.0
+ momentProperties._z = null;
+ }
+
+ loadData({
+ "version": "2018e",
+ "zones": [
+ "Africa/Abidjan|LMT GMT|g.8 0|01|-2ldXH.Q|48e5",
+ "Africa/Accra|LMT GMT +0020|.Q 0 -k|012121212121212121212121212121212121212121212121|-26BbX.8 6tzX.8 MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE|41e5",
+ "Africa/Nairobi|LMT EAT +0230 +0245|-2r.g -30 -2u -2J|01231|-1F3Cr.g 3Dzr.g okMu MFXJ|47e5",
+ "Africa/Algiers|PMT WET WEST CET CEST|-9.l 0 -10 -10 -20|0121212121212121343431312123431213|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 DA0 Imo0 rd0 De0 9Xz0 1fb0 1ap0 16K0 2yo0 mEp0 hwL0 jxA0 11A0 dDd0 17b0 11B0 1cN0 2Dy0 1cN0 1fB0 1cL0|26e5",
+ "Africa/Lagos|LMT WAT|-d.A -10|01|-22y0d.A|17e6",
+ "Africa/Bissau|LMT -01 GMT|12.k 10 0|012|-2ldX0 2xoo0|39e4",
+ "Africa/Maputo|LMT CAT|-2a.k -20|01|-2GJea.k|26e5",
+ "Africa/Cairo|EET EEST|-20 -30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1bIO0 vb0 1ip0 11z0 1iN0 1nz0 12p0 1pz0 10N0 1pz0 16p0 1jz0 s3d0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1WL0 rd0 1Rz0 wp0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1qL0 Xd0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1ny0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 WL0 1qN0 Rb0 1wp0 On0 1zd0 Lz0 1EN0 Fb0 c10 8n0 8Nd0 gL0 e10 mn0|15e6",
+ "Africa/Casablanca|LMT WET WEST CET|u.k 0 -10 -10|0121212121212121213121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2gMnt.E 130Lt.E rb0 Dd0 dVb0 b6p0 TX0 EoB0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4mn0 SyN0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 Rc0 11A0 e00 e00 U00 11A0 8o0 e00 11A0 11A0 5A0 e00 17c0 1fA0 1a00 1a00 1fA0 17c0 1io0 14o0 1lc0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1lc0 14o0 1fA0|32e5",
+ "Africa/Ceuta|WET WEST CET CEST|0 -10 -10 -20|010101010101010101010232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-25KN0 11z0 drd0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1y7o0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4VB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|85e3",
+ "Africa/El_Aaiun|LMT -01 WET WEST|Q.M 10 0 -10|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1rDz7.c 1GVA7.c 6L0 AL0 1Nd0 XX0 1Cp0 pz0 1cBB0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 Rc0 11A0 e00 e00 U00 11A0 8o0 e00 11A0 11A0 5A0 e00 17c0 1fA0 1a00 1a00 1fA0 17c0 1io0 14o0 1lc0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1lc0 14o0 1fA0|20e4",
+ "Africa/Johannesburg|SAST SAST SAST|-1u -20 -30|012121|-2GJdu 1Ajdu 1cL0 1cN0 1cL0|84e5",
+ "Africa/Juba|LMT CAT CAST EAT|-26.s -20 -30 -30|01212121212121212121212121212121213|-1yW26.s 1zK06.s 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0",
+ "Africa/Khartoum|LMT CAT CAST EAT|-2a.8 -20 -30 -30|012121212121212121212121212121212131|-1yW2a.8 1zK0a.8 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0 HjL0|51e5",
+ "Africa/Monrovia|MMT MMT GMT|H.8 I.u 0|012|-23Lzg.Q 28G01.m|11e5",
+ "Africa/Ndjamena|LMT WAT WAST|-10.c -10 -20|0121|-2le10.c 2J3c0.c Wn0|13e5",
+ "Africa/Sao_Tome|LMT GMT WAT|A.J 0 -10|012|-2le00 4i6N0",
+ "Africa/Tripoli|LMT CET CEST EET|-Q.I -10 -20 -20|012121213121212121212121213123123|-21JcQ.I 1hnBQ.I vx0 4iP0 xx0 4eN0 Bb0 7ip0 U0n0 A10 1db0 1cN0 1db0 1dd0 1db0 1eN0 1bb0 1e10 1cL0 1c10 1db0 1dd0 1db0 1cN0 1db0 1q10 fAn0 1ep0 1db0 AKq0 TA0 1o00|11e5",
+ "Africa/Tunis|PMT CET CEST|-9.l -10 -20|0121212121212121212121212121212121|-2nco9.l 18pa9.l 1qM0 DA0 3Tc0 11B0 1ze0 WM0 7z0 3d0 14L0 1cN0 1f90 1ar0 16J0 1gXB0 WM0 1rA0 11c0 nwo0 Ko0 1cM0 1cM0 1rA0 10M0 zuM0 10N0 1aN0 1qM0 WM0 1qM0 11A0 1o00|20e5",
+ "Africa/Windhoek|+0130 SAST SAST CAT WAT|-1u -20 -30 -20 -10|01213434343434343434343434343434343434343434343434343|-2GJdu 1Ajdu 1cL0 1SqL0 9Io0 16P0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|32e4",
+ "America/Adak|NST NWT NPT BST BDT AHST HST HDT|b0 a0 a0 b0 a0 a0 a0 90|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|326",
+ "America/Anchorage|AST AWT APT AHST AHDT YST AKST AKDT|a0 90 90 a0 90 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T00 8wX0 iA0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|30e4",
+ "America/Port_of_Spain|LMT AST|46.4 40|01|-2kNvR.U|43e3",
+ "America/Araguaina|LMT -03 -02|3c.M 30 20|0121212121212121212121212121212121212121212121212121|-2glwL.c HdKL.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 ny10 Lz0|14e4",
+ "America/Argentina/Buenos_Aires|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 A4p0 uL0 1qN0 WL0",
+ "America/Argentina/Catamarca|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 7B0 8zb0 uL0",
+ "America/Argentina/Cordoba|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0 1qN0 WL0",
+ "America/Argentina/Jujuy|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1ze0 TX0 1ld0 WK0 1wp0 TX0 A4p0 uL0",
+ "America/Argentina/La_Rioja|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0",
+ "America/Argentina/Mendoza|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232312121321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1u20 SL0 1vd0 Tb0 1wp0 TW0 ri10 Op0 7TX0 uL0",
+ "America/Argentina/Rio_Gallegos|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0",
+ "America/Argentina/Salta|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0",
+ "America/Argentina/San_Juan|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rld0 m10 8lb0 uL0",
+ "America/Argentina/San_Luis|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121212321212|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 XX0 1q20 SL0 AN0 vDb0 m10 8lb0 8L0 jd0 1qN0 WL0 1qN0",
+ "America/Argentina/Tucuman|CMT -04 -03 -02|4g.M 40 30 20|0121212121212121212121212121212121212121212323232313232123232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 4N0 8BX0 uL0 1qN0 WL0",
+ "America/Argentina/Ushuaia|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rkN0 8p0 8zb0 uL0",
+ "America/Curacao|LMT -0430 AST|4z.L 4u 40|012|-2kV7o.d 28KLS.d|15e4",
+ "America/Asuncion|AMT -04 -03|3O.E 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-1x589.k 1DKM9.k 3CL0 3Dd0 10L0 1pB0 10n0 1pB0 10n0 1pB0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1lB0 14n0 1dd0 1cL0 1fd0 WL0 1rd0 1aL0 1dB0 Xz0 1qp0 Xb0 1qN0 10L0 1rB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 WN0 1qL0 11B0 1nX0 1ip0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 TX0 1tB0 19X0 1a10 1fz0 1a10 1fz0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0|28e5",
+ "America/Atikokan|CST CDT CWT CPT EST|60 50 50 50 50|0101234|-25TQ0 1in0 Rnb0 3je0 8x30 iw0|28e2",
+ "America/Bahia_Banderas|LMT MST CST PST MDT CDT|71 70 60 80 60 50|0121212131414141414141414141414141414152525252525252525252525252525252525252525252525252525252|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nW0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|84e3",
+ "America/Bahia|LMT -03 -02|2y.4 30 20|01212121212121212121212121212121212121212121212121212121212121|-2glxp.U HdLp.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 l5B0 Rb0|27e5",
+ "America/Barbados|LMT BMT AST ADT|3W.t 3W.t 40 30|01232323232|-1Q0I1.v jsM0 1ODC1.v IL0 1ip0 17b0 1ip0 17b0 1ld0 13b0|28e4",
+ "America/Belem|LMT -03 -02|3d.U 30 20|012121212121212121212121212121|-2glwK.4 HdKK.4 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|20e5",
+ "America/Belize|LMT CST -0530 CDT|5Q.M 60 5u 50|01212121212121212121212121212121212121212121212121213131|-2kBu7.c fPA7.c Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1f0Mu qn0 lxB0 mn0|57e3",
+ "America/Blanc-Sablon|AST ADT AWT APT|40 30 30 30|010230|-25TS0 1in0 UGp0 8x50 iu0|11e2",
+ "America/Boa_Vista|LMT -04 -03|42.E 40 30|0121212121212121212121212121212121|-2glvV.k HdKV.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 smp0 WL0 1tB0 2L0|62e2",
+ "America/Bogota|BMT -05 -04|4U.g 50 40|0121|-2eb73.I 38yo3.I 2en0|90e5",
+ "America/Boise|PST PDT MST MWT MPT MDT|80 70 70 60 60 60|0101023425252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-261q0 1nX0 11B0 1nX0 8C10 JCL0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 Dd0 1Kn0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e4",
+ "America/Cambridge_Bay|-00 MST MWT MPT MDDT MDT CST CDT EST|0 70 60 60 50 60 60 50 50|0123141515151515151515151515151515151515151515678651515151515151515151515151515151515151515151515151515151515151515151515151|-21Jc0 RO90 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11A0 1nX0 2K0 WQ0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e2",
+ "America/Campo_Grande|LMT -04 -03|3C.s 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2glwl.w HdLl.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0|77e4",
+ "America/Cancun|LMT CST EST EDT CDT|5L.4 60 50 40 50|0123232341414141414141414141414141414141412|-1UQG0 2q2o0 yLB0 1lb0 14p0 1lb0 14p0 Lz0 xB0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4",
+ "America/Caracas|CMT -0430 -04|4r.E 4u 40|01212|-2kV7w.k 28KM2.k 1IwOu kqo0|29e5",
+ "America/Cayenne|LMT -04 -03|3t.k 40 30|012|-2mrwu.E 2gWou.E|58e3",
+ "America/Panama|CMT EST|5j.A 50|01|-2uduE.o|15e5",
+ "America/Chicago|CST CDT EST CWT CPT|60 50 50 50 50|01010101010101010101010101010101010102010101010103401010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 1wp0 TX0 WN0 1qL0 1cN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 11B0 1Hz0 14p0 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|92e5",
+ "America/Chihuahua|LMT MST CST CDT MDT|74.k 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|81e4",
+ "America/Costa_Rica|SJMT CST CDT|5A.d 60 50|0121212121|-1Xd6n.L 2lu0n.L Db0 1Kp0 Db0 pRB0 15b0 1kp0 mL0|12e5",
+ "America/Creston|MST PST|70 80|010|-29DR0 43B0|53e2",
+ "America/Cuiaba|LMT -04 -03|3I.k 40 30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2glwf.E HdLf.E 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 4a10 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0|54e4",
+ "America/Danmarkshavn|LMT -03 -02 GMT|1e.E 30 20 0|01212121212121212121212121212121213|-2a5WJ.k 2z5fJ.k 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 DC0|8",
+ "America/Dawson_Creek|PST PDT PWT PPT MST|80 70 70 70 70|0102301010101010101010101010101010101010101010101010101014|-25TO0 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 ML0|12e3",
+ "America/Dawson|YST YDT YWT YPT YDDT PST PDT|90 80 80 80 70 80 70|0101023040565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-25TN0 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 jrA0 fNd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|13e2",
+ "America/Denver|MST MDT MWT MPT|70 60 60 60|01010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 11B0 1qL0 WN0 mn0 Ord0 8x20 ix0 LCN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e5",
+ "America/Detroit|LMT CST EST EWT EPT EDT|5w.b 60 50 40 40 40|012342525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2Cgir.N peqr.N 156L0 8x40 iv0 6fd0 11z0 XQp0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e5",
+ "America/Edmonton|LMT MST MDT MWT MPT|7x.Q 70 60 60 60|01212121212121341212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2yd4q.8 shdq.8 1in0 17d0 hz0 2dB0 1fz0 1a10 11z0 1qN0 WL0 1qN0 11z0 IGN0 8x20 ix0 3NB0 11z0 LFB0 1cL0 3Cp0 1cL0 66N0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|10e5",
+ "America/Eirunepe|LMT -05 -04|4D.s 50 40|0121212121212121212121212121212121|-2glvk.w HdLk.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0 yTd0 d5X0|31e3",
+ "America/El_Salvador|LMT CST CDT|5U.M 60 50|012121|-1XiG3.c 2Fvc3.c WL0 1qN0 WL0|11e5",
+ "America/Tijuana|LMT MST PST PDT PWT PPT|7M.4 70 80 70 70 70|012123245232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQE0 4PX0 8mM0 8lc0 SN0 1cL0 pHB0 83r0 zI0 5O10 1Rz0 cOO0 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 BUp0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|20e5",
+ "America/Fort_Nelson|PST PDT PWT PPT MST|80 70 70 70 70|01023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010104|-25TO0 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0|39e2",
+ "America/Fort_Wayne|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|010101023010101010101010101040454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 QI10 Db0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 5Tz0 1o10 qLb0 1cL0 1cN0 1cL0 1qhd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/Fortaleza|LMT -03 -02|2y 30 20|0121212121212121212121212121212121212121|-2glxq HdLq 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 5z0 2mN0 On0|34e5",
+ "America/Glace_Bay|LMT AST ADT AWT APT|3X.M 40 30 30 30|012134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsI0.c CwO0.c 1in0 UGp0 8x50 iu0 iq10 11z0 Jg10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3",
+ "America/Godthab|LMT -03 -02|3q.U 30 20|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5Ux.4 2z5dx.4 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e3",
+ "America/Goose_Bay|NST NDT NST NDT NWT NPT AST ADT ADDT|3u.Q 2u.Q 3u 2u 2u 2u 40 30 20|010232323232323245232323232323232323232323232323232323232326767676767676767676767676767676767676767676768676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-25TSt.8 1in0 DXb0 2HbX.8 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 S10 g0u 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|76e2",
+ "America/Grand_Turk|KMT EST EDT AST|57.a 50 40 40|01212121212121212121212121212121212121212121212121212121212121212121212121232121212121212121212121212121212121212121|-2l1uQ.O 2HHBQ.O 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 5Ip0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e2",
+ "America/Guatemala|LMT CST CDT|62.4 60 50|0121212121|-24KhV.U 2efXV.U An0 mtd0 Nz0 ifB0 17b0 zDB0 11z0|13e5",
+ "America/Guayaquil|QMT -05 -04|5e 50 40|0121|-1yVSK 2uILK rz0|27e5",
+ "America/Guyana|LMT -0345 -03 -04|3Q.E 3J 30 40|0123|-2dvU7.k 2r6LQ.k Bxbf|80e4",
+ "America/Halifax|LMT AST ADT AWT APT|4e.o 40 30 30 30|0121212121212121212121212121212121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsHJ.A xzzJ.A 1db0 3I30 1in0 3HX0 IL0 1E10 ML0 1yN0 Pb0 1Bd0 Mn0 1Bd0 Rz0 1w10 Xb0 1w10 LX0 1w10 Xb0 1w10 Lz0 1C10 Jz0 1E10 OL0 1yN0 Un0 1qp0 Xb0 1qp0 11X0 1w10 Lz0 1HB0 LX0 1C10 FX0 1w10 Xb0 1qp0 Xb0 1BB0 LX0 1td0 Xb0 1qp0 Xb0 Rf0 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 6i10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|39e4",
+ "America/Havana|HMT CST CDT|5t.A 50 40|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Meuu.o 72zu.o ML0 sld0 An0 1Nd0 Db0 1Nd0 An0 6Ep0 An0 1Nd0 An0 JDd0 Mn0 1Ap0 On0 1fd0 11X0 1qN0 WL0 1wp0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 14n0 1ld0 14L0 1kN0 15b0 1kp0 1cL0 1cN0 1fz0 1a10 1fz0 1fB0 11z0 14p0 1nX0 11B0 1nX0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 1a10 1in0 1a10 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 17c0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 11A0 6i00 Rc0 1wo0 U00 1tA0 Rc0 1wo0 U00 1wo0 U00 1zc0 U00 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0|21e5",
+ "America/Hermosillo|LMT MST CST PST MDT|7n.Q 70 60 80 60|0121212131414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0|64e4",
+ "America/Indiana/Knox|CST CDT CWT CPT EST|60 50 50 50 50|0101023010101010101010101010101010101040101010101010101010101010101010101010101010101010141010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 3Cn0 8wp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 z8o0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/Indiana/Marengo|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101023010101010101010104545454545414545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 dyN0 11z0 6fd0 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1e6p0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/Indiana/Petersburg|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010104010101010101010101010141014545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 njX0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 3Fb0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 19co0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/Indiana/Tell_City|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010454541010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 g0p0 11z0 1o10 11z0 1qL0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 caL0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/Indiana/Vevay|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|010102304545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 kPB0 Awn0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1lnd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/Indiana/Vincennes|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010454541014545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 g0p0 11z0 1o10 11z0 1qL0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 caL0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/Indiana/Winamac|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010101010454541054545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1za0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/Inuvik|-00 PST PDDT MST MDT|0 80 60 70 60|0121343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-FnA0 tWU0 1fA0 wPe0 2pz0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|35e2",
+ "America/Iqaluit|-00 EWT EPT EST EDDT EDT CST CDT|0 40 40 50 30 40 60 50|01234353535353535353535353535353535353535353567353535353535353535353535353535353535353535353535353535353535353535353535353|-16K00 7nX0 iv0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|67e2",
+ "America/Jamaica|KMT EST EDT|57.a 50 40|0121212121212121212121|-2l1uQ.O 2uM1Q.O 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0|94e4",
+ "America/Juneau|PST PWT PPT PDT YDT YST AKST AKDT|80 70 70 70 80 90 90 80|01203030303030303030303030403030356767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cM0 1cM0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|33e3",
+ "America/Kentucky/Louisville|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101010102301010101010101010101010101454545454545414545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 3Fd0 Nb0 LPd0 11z0 RB0 8x30 iw0 Bb0 10N0 2bB0 8in0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 xz0 gso0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/Kentucky/Monticello|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101023010101010101010101010101010101010101010101010101010101010101010101454545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 SWp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/La_Paz|CMT BST -04|4w.A 3w.A 40|012|-1x37r.o 13b0|19e5",
+ "America/Lima|LMT -05 -04|58.A 50 40|0121212121212121|-2tyGP.o 1bDzP.o zX0 1aN0 1cL0 1cN0 1cL0 1PrB0 zX0 1O10 zX0 6Gp0 zX0 98p0 zX0|11e6",
+ "America/Los_Angeles|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 5Wp1 1VaX 3dA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e6",
+ "America/Maceio|LMT -03 -02|2m.Q 30 20|012121212121212121212121212121212121212121|-2glxB.8 HdLB.8 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 8Q10 WL0 1tB0 5z0 2mN0 On0|93e4",
+ "America/Managua|MMT CST EST CDT|5J.c 60 50 50|0121313121213131|-1quie.M 1yAMe.M 4mn0 9Up0 Dz0 1K10 Dz0 s3F0 1KH0 DB0 9In0 k8p0 19X0 1o30 11y0|22e5",
+ "America/Manaus|LMT -04 -03|40.4 40 30|01212121212121212121212121212121|-2glvX.U HdKX.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0|19e5",
+ "America/Martinique|FFMT AST ADT|44.k 40 30|0121|-2mPTT.E 2LPbT.E 19X0|39e4",
+ "America/Matamoros|LMT CST CDT|6E 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|45e4",
+ "America/Mazatlan|LMT MST CST PST MDT|75.E 70 60 80 60|0121212131414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|44e4",
+ "America/Menominee|CST CDT CWT CPT EST|60 50 50 50 50|01010230101041010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 LCN0 1fz0 6410 9Jb0 1cM0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|85e2",
+ "America/Merida|LMT CST EST CDT|5W.s 60 50 50|0121313131313131313131313131313131313131313131313131313131313131313131313131313131313131|-1UQG0 2q2o0 2hz0 wu30 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|11e5",
+ "America/Metlakatla|PST PWT PPT PDT AKST AKDT|80 70 70 70 90 80|0120303030303030303030303030303030454545454545454545454545454545454545454545454|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1hU10 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2",
+ "America/Mexico_City|LMT MST CST CDT CWT|6A.A 70 60 50 50|012121232324232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 gEn0 TX0 3xd0 Jb0 6zB0 SL0 e5d0 17b0 1Pff0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|20e6",
+ "America/Miquelon|LMT AST -03 -02|3I.E 40 30 20|012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2mKkf.k 2LTAf.k gQ10 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|61e2",
+ "America/Moncton|EST AST ADT AWT APT|50 40 30 30 30|012121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsH0 CwN0 1in0 zAo0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1K10 Lz0 1zB0 NX0 1u10 Wn0 S20 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14n1 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 ReX 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|64e3",
+ "America/Monterrey|LMT CST CDT|6F.g 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|41e5",
+ "America/Montevideo|LMT MMT -04 -03 -0330 -0230 -02 -0130|3I.P 3I.P 40 30 3u 2u 20 1u|012343434343434343434343435353636353636375363636363636363636363636363636363636363636363|-2tRUf.9 sVc0 8jcf.9 1db0 1dcu 1cLu 1dcu 1cLu ircu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu WLu 1fAu 1cLu 1o0u 11zu NAu 3jXu zXu Dq0u 19Xu pcu jz0 cm10 19X0 6tB0 1fbu 3o0u jX0 4vB0 xz0 3Cp0 mmu 1a10 IMu Db0 4c10 uL0 1Nd0 An0 1SN0 uL0 mp0 28L0 iPB0 un0 1SN0 xz0 1zd0 Lz0 1zd0 Rb0 1zd0 On0 1wp0 Rb0 s8p0 1fB0 1ip0 11z0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 11z0|17e5",
+ "America/Toronto|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101012301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TR0 1in0 11Wu 1nzu 1fD0 WJ0 1wr0 Nb0 1Ap0 On0 1zd0 On0 1wp0 TX0 1tB0 TX0 1tB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 4kM0 8x40 iv0 1o10 11z0 1nX0 11z0 1o10 11z0 1o10 1qL0 11D0 1nX0 11B0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e5",
+ "America/Nassau|LMT EST EDT|59.u 50 40|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2kNuO.u 26XdO.u 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|24e4",
+ "America/New_York|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 11B0 1qL0 1a10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x40 iv0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e6",
+ "America/Nipigon|EST EDT EWT EPT|50 40 40 40|010123010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TR0 1in0 Rnb0 3je0 8x40 iv0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|16e2",
+ "America/Nome|NST NWT NPT BST BDT YST AKST AKDT|b0 a0 a0 b0 a0 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cl0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|38e2",
+ "America/Noronha|LMT -02 -01|29.E 20 10|0121212121212121212121212121212121212121|-2glxO.k HdKO.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|30e2",
+ "America/North_Dakota/Beulah|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101014545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/North_Dakota/Center|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101014545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/North_Dakota/New_Salem|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101454545454545454545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/Ojinaga|LMT MST CST CDT MDT|6V.E 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e3",
+ "America/Pangnirtung|-00 AST AWT APT ADDT ADT EDT EST CST CDT|0 40 30 30 20 30 40 50 60 50|012314151515151515151515151515151515167676767689767676767676767676767676767676767676767676767676767676767676767676767676767|-1XiM0 PnG0 8x50 iu0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1o00 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2",
+ "America/Paramaribo|LMT PMT PMT -0330 -03|3E.E 3E.Q 3E.A 3u 30|01234|-2nDUj.k Wqo0.c qanX.I 1yVXN.o|24e4",
+ "America/Phoenix|MST MDT MWT|70 60 60|01010202010|-261r0 1nX0 11B0 1nX0 SgN0 4Al1 Ap0 1db0 SWqX 1cL0|42e5",
+ "America/Port-au-Prince|PPMT EST EDT|4N 50 40|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-28RHb 2FnMb 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14q0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 i6n0 1nX0 11B0 1nX0 d430 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 3iN0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5",
+ "America/Rio_Branco|LMT -05 -04|4v.c 50 40|01212121212121212121212121212121|-2glvs.M HdLs.M 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0 d5X0|31e4",
+ "America/Porto_Velho|LMT -04 -03|4f.A 40 30|012121212121212121212121212121|-2glvI.o HdKI.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|37e4",
+ "America/Puerto_Rico|AST AWT APT|40 30 30|0120|-17lU0 7XT0 iu0|24e5",
+ "America/Punta_Arenas|SMT -05 -04 -03|4G.K 50 40 30|0102021212121212121232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-2q2jh.e fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 blz0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0",
+ "America/Rainy_River|CST CDT CWT CPT|60 50 50 50|010123010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TQ0 1in0 Rnb0 3je0 8x30 iw0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|842",
+ "America/Rankin_Inlet|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313131313131313131313131313131313131313131313131313131313131313131|-vDc0 keu0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e2",
+ "America/Recife|LMT -03 -02|2j.A 30 20|0121212121212121212121212121212121212121|-2glxE.o HdLE.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|33e5",
+ "America/Regina|LMT MST MDT MWT MPT CST|6W.A 70 60 60 60 60|012121212121212121212121341212121212121212121212121215|-2AD51.o uHe1.o 1in0 s2L0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 66N0 1cL0 1cN0 19X0 1fB0 1cL0 1fB0 1cL0 1cN0 1cL0 M30 8x20 ix0 1ip0 1cL0 1ip0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 3NB0 1cL0 1cN0|19e4",
+ "America/Resolute|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313431313131313131313131313131313131313131313131313131313131313131|-SnA0 GWS0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|229",
+ "America/Santarem|LMT -04 -03|3C.M 40 30|0121212121212121212121212121212|-2glwl.c HdLl.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0|21e4",
+ "America/Santiago|SMT -05 -04 -03|4G.K 50 40 30|010202121212121212321232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-2q2jh.e fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 9Bz0 jb0 1oN0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0|62e5",
+ "America/Santo_Domingo|SDMT EST EDT -0430 AST|4E 50 40 4u 40|01213131313131414|-1ttjk 1lJMk Mn0 6sp0 Lbu 1Cou yLu 1RAu wLu 1QMu xzu 1Q0u xXu 1PAu 13jB0 e00|29e5",
+ "America/Sao_Paulo|LMT -03 -02|36.s 30 20|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2glwR.w HdKR.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 pTd0 PX0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0|20e6",
+ "America/Scoresbysund|LMT -02 -01 +00|1r.Q 20 10 0|0121323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2a5Ww.8 2z5ew.8 1a00 1cK0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|452",
+ "America/Sitka|PST PWT PPT PDT YST AKST AKDT|80 70 70 70 90 90 80|01203030303030303030303030303030345656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|90e2",
+ "America/St_Johns|NST NDT NST NDT NWT NPT NDDT|3u.Q 2u.Q 3u 2u 2u 2u 1u|01010101010101010101010101010101010102323232323232324523232323232323232323232323232323232323232323232323232323232323232323232323232323232326232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-28oit.8 14L0 1nB0 1in0 1gm0 Dz0 1JB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1fB0 19X0 1fB0 19X0 10O0 eKX.8 19X0 1iq0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4",
+ "America/Swift_Current|LMT MST MDT MWT MPT CST|7b.k 70 60 60 60 60|012134121212121212121215|-2AD4M.E uHdM.E 1in0 UGp0 8x20 ix0 1o10 17b0 1ip0 11z0 1o10 11z0 1o10 11z0 isN0 1cL0 3Cp0 1cL0 1cN0 11z0 1qN0 WL0 pMp0|16e3",
+ "America/Tegucigalpa|LMT CST CDT|5M.Q 60 50|01212121|-1WGGb.8 2ETcb.8 WL0 1qN0 WL0 GRd0 AL0|11e5",
+ "America/Thule|LMT AST ADT|4z.8 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5To.Q 31NBo.Q 1cL0 1cN0 1cL0 1fB0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|656",
+ "America/Thunder_Bay|CST EST EWT EPT EDT|60 50 40 40 40|0123141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-2q5S0 1iaN0 8x40 iv0 XNB0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4",
+ "America/Vancouver|PST PDT PWT PPT|80 70 70 70|0102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TO0 1in0 UGp0 8x10 iy0 1o10 17b0 1ip0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5",
+ "America/Whitehorse|YST YDT YWT YPT YDDT PST PDT|90 80 80 80 70 80 70|0101023040565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-25TN0 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 3NA0 vrd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e3",
+ "America/Winnipeg|CST CDT CWT CPT|60 50 50 50|010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aIi0 WL0 3ND0 1in0 Jap0 Rb0 aCN0 8x30 iw0 1tB0 11z0 1ip0 11z0 1o10 11z0 1o10 11z0 1rd0 10L0 1op0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 1cL0 1cN0 11z0 6i10 WL0 6i10 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|66e4",
+ "America/Yakutat|YST YWT YPT YDT AKST AKDT|90 80 80 80 90 80|01203030303030303030303030303030304545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-17T10 8x00 iz0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cn0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|642",
+ "America/Yellowknife|-00 MST MWT MPT MDDT MDT|0 70 60 60 50 60|012314151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151|-1pdA0 hix0 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3",
+ "Antarctica/Casey|-00 +08 +11|0 -80 -b0|01212121|-2q00 1DjS0 T90 40P0 KL0 blz0 3m10|10",
+ "Antarctica/Davis|-00 +07 +05|0 -70 -50|01012121|-vyo0 iXt0 alj0 1D7v0 VB0 3Wn0 KN0|70",
+ "Antarctica/DumontDUrville|-00 +10|0 -a0|0101|-U0o0 cfq0 bFm0|80",
+ "Antarctica/Macquarie|AEST AEDT -00 +11|-a0 -b0 0 -b0|0102010101010101010101010101010101010101010101010101010101010101010101010101010101010101013|-29E80 19X0 4SL0 1ayy0 Lvs0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0|1",
+ "Antarctica/Mawson|-00 +06 +05|0 -60 -50|012|-CEo0 2fyk0|60",
+ "Pacific/Auckland|NZMT NZST NZST NZDT|-bu -cu -c0 -d0|01020202020202020202020202023232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1GCVu Lz0 1tB0 11zu 1o0u 11zu 1o0u 11zu 1o0u 14nu 1lcu 14nu 1lcu 1lbu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1qLu WMu 1qLu 11Au 1n1bu IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|14e5",
+ "Antarctica/Palmer|-00 -03 -04 -02|0 30 40 20|0121212121213121212121212121212121212121212121212121212121212121212121212121212121|-cao0 nD0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 jsN0 14N0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|40",
+ "Antarctica/Rothera|-00 -03|0 30|01|gOo0|130",
+ "Antarctica/Syowa|-00 +03|0 -30|01|-vs00|20",
+ "Antarctica/Troll|-00 +00 +02|0 0 -20|01212121212121212121212121212121212121212121212121212121212121212121|1puo0 hd0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|40",
+ "Antarctica/Vostok|-00 +06|0 -60|01|-tjA0|25",
+ "Europe/Oslo|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2awM0 Qm0 W6o0 5pf0 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 wJc0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1qM0 WM0 zpc0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|62e4",
+ "Asia/Riyadh|LMT +03|-36.Q -30|01|-TvD6.Q|57e5",
+ "Asia/Almaty|LMT +05 +06 +07|-57.M -50 -60 -70|012323232323232323232321232323232323232323232323232|-1Pc57.M eUo7.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|15e5",
+ "Asia/Amman|LMT EET EEST|-2n.I -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1yW2n.I 1HiMn.I KL0 1oN0 11b0 1oN0 11b0 1pd0 1dz0 1cp0 11b0 1op0 11b0 fO10 1db0 1e10 1cL0 1cN0 1cL0 1cN0 1fz0 1pd0 10n0 1ld0 14n0 1hB0 15b0 1ip0 19X0 1cN0 1cL0 1cN0 17b0 1ld0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1So0 y00 1fc0 1dc0 1co0 1dc0 1cM0 1cM0 1cM0 1o00 11A0 1lc0 17c0 1cM0 1cM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 4bX0 Dd0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|25e5",
+ "Asia/Anadyr|LMT +12 +13 +14 +11|-bN.U -c0 -d0 -e0 -b0|01232121212121212121214121212121212121212121212121212121212141|-1PcbN.U eUnN.U 23CL0 1db0 2q10 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|13e3",
+ "Asia/Aqtau|LMT +04 +05 +06|-3l.4 -40 -50 -60|012323232323232323232123232312121212121212121212|-1Pc3l.4 eUnl.4 24PX0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|15e4",
+ "Asia/Aqtobe|LMT +04 +05 +06|-3M.E -40 -50 -60|0123232323232323232321232323232323232323232323232|-1Pc3M.E eUnM.E 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|27e4",
+ "Asia/Ashgabat|LMT +04 +05 +06|-3R.w -40 -50 -60|0123232323232323232323212|-1Pc3R.w eUnR.w 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0|41e4",
+ "Asia/Atyrau|LMT +03 +05 +06 +04|-3r.I -30 -50 -60 -40|01232323232323232323242323232323232324242424242|-1Pc3r.I eUor.I 24PW0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 2sp0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0",
+ "Asia/Baghdad|BMT +03 +04|-2V.A -30 -40|012121212121212121212121212121212121212121212121212121|-26BeV.A 2ACnV.A 11b0 1cp0 1dz0 1dd0 1db0 1cN0 1cp0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1de0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0|66e5",
+ "Asia/Qatar|LMT +04 +03|-3q.8 -40 -30|012|-21Jfq.8 27BXq.8|96e4",
+ "Asia/Baku|LMT +03 +04 +05|-3j.o -30 -40 -50|01232323232323232323232123232323232323232323232323232323232323232|-1Pc3j.o 1jUoj.o WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 9Je0 1o00 11z0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5",
+ "Asia/Bangkok|BMT +07|-6G.4 -70|01|-218SG.4|15e6",
+ "Asia/Barnaul|LMT +06 +07 +08|-5z -60 -70 -80|0123232323232323232323212323232321212121212121212121212121212121212|-21S5z pCnz 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 p90 LE0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0",
+ "Asia/Beirut|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-21aq0 1on0 1410 1db0 19B0 1in0 1ip0 WL0 1lQp0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 q6N0 En0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1op0 11b0 dA10 17b0 1iN0 17b0 1iN0 17b0 1iN0 17b0 1vB0 SL0 1mp0 13z0 1iN0 17b0 1iN0 17b0 1jd0 12n0 1a10 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0|22e5",
+ "Asia/Bishkek|LMT +05 +06 +07|-4W.o -50 -60 -70|012323232323232323232321212121212121212121212121212|-1Pc4W.o eUnW.o 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2e00 1tX0 17b0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1cPu 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0|87e4",
+ "Asia/Brunei|LMT +0730 +08|-7D.E -7u -80|012|-1KITD.E gDc9.E|42e4",
+ "Asia/Kolkata|MMT IST +0630|-5l.a -5u -6u|012121|-2zOtl.a 1r2LP.a 1un0 HB0 7zX0|15e6",
+ "Asia/Chita|LMT +08 +09 +10|-7x.Q -80 -90 -a0|012323232323232323232321232323232323232323232323232323232323232312|-21Q7x.Q pAnx.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3re0|33e4",
+ "Asia/Choibalsan|LMT +07 +08 +10 +09|-7C -70 -80 -a0 -90|0123434343434343434343434343434343434343434343424242|-2APHC 2UkoC cKn0 1da0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 3Db0 h1f0 1cJ0 1cP0 1cJ0|38e3",
+ "Asia/Shanghai|CST CDT|-80 -90|01010101010101010|-1c1I0 LX0 16p0 1jz0 1Myp0 Rb0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0|23e6",
+ "Asia/Colombo|MMT +0530 +06 +0630|-5j.w -5u -60 -6u|01231321|-2zOtj.w 1rFbN.w 1zzu 7Apu 23dz0 11zu n3cu|22e5",
+ "Asia/Dhaka|HMT +0630 +0530 +06 +07|-5R.k -6u -5u -60 -70|0121343|-18LFR.k 1unn.k HB0 m6n0 2kxbu 1i00|16e6",
+ "Asia/Damascus|LMT EET EEST|-2p.c -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-21Jep.c Hep.c 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1xRB0 11X0 1oN0 10L0 1pB0 11b0 1oN0 10L0 1mp0 13X0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 Nb0 1AN0 Nb0 bcp0 19X0 1gp0 19X0 3ld0 1xX0 Vd0 1Bz0 Sp0 1vX0 10p0 1dz0 1cN0 1cL0 1db0 1db0 1g10 1an0 1ap0 1db0 1fd0 1db0 1cN0 1db0 1dd0 1db0 1cp0 1dz0 1c10 1dX0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 19z0 1fB0 1qL0 11B0 1on0 Wp0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0|26e5",
+ "Asia/Dili|LMT +08 +09|-8m.k -80 -90|01212|-2le8m.k 1dnXm.k 1nfA0 Xld0|19e4",
+ "Asia/Dubai|LMT +04|-3F.c -40|01|-21JfF.c|39e5",
+ "Asia/Dushanbe|LMT +05 +06 +07|-4z.c -50 -60 -70|012323232323232323232321|-1Pc4z.c eUnz.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2hB0|76e4",
+ "Asia/Famagusta|LMT EET EEST +03|-2f.M -20 -30 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212312121212121212121212121212121212121212121|-1Vc2f.M 2a3cf.M 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00",
+ "Asia/Gaza|EET EEST IST IDT|-20 -30 -20 -30|010101010101010101010101010101012323232323232323232323232320101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1c2q0 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 pBd0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 npB0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 11z0 1o10 14o0 1lA1 SKX 1xd1 MKX 1AN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nz0 1220 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0|18e5",
+ "Asia/Hebron|EET EEST IST IDT|-20 -30 -20 -30|01010101010101010101010101010101232323232323232323232323232010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1c2q0 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 pBd0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 npB0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 12L0 1mN0 14o0 1lc0 Tb0 1xd1 MKX bB0 cn0 1cN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nz0 1220 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0|25e4",
+ "Asia/Ho_Chi_Minh|LMT PLMT +07 +08 +09|-76.E -76.u -70 -80 -90|0123423232|-2yC76.E bK00.a 1h7b6.u 5lz0 18o0 3Oq0 k5b0 aW00 BAM0|90e5",
+ "Asia/Hong_Kong|LMT HKT HKST JST|-7A.G -80 -90 -90|0121312121212121212121212121212121212121212121212121212121212121212121|-2CFHA.G 1sEP6.G 1cL0 ylu 93X0 1qQu 1tX0 Rd0 1In0 NB0 1cL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1kL0 14N0 1nX0 U10 1tz0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 Rd0 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 17d0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|73e5",
+ "Asia/Hovd|LMT +06 +07 +08|-66.A -60 -70 -80|012323232323232323232323232323232323232323232323232|-2APG6.A 2Uko6.A cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|81e3",
+ "Asia/Irkutsk|IMT +07 +08 +09|-6V.5 -70 -80 -90|01232323232323232323232123232323232323232323232323232323232323232|-21zGV.5 pjXV.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4",
+ "Europe/Istanbul|IMT EET EEST +04 +03|-1U.U -20 -30 -40 -30|012121212121212121212121212121212121212121212121212121234343434342121212121212121212121212121212121212121212121212121212121212124|-2ogNU.U dzzU.U 11b0 8tB0 1on0 1410 1db0 19B0 1in0 3Rd0 Un0 1oN0 11b0 zSp0 CL0 mN0 1Vz0 1gN0 1pz0 5Rd0 1fz0 1yp0 ML0 1kp0 17b0 1ip0 17b0 1fB0 19X0 1jB0 18L0 1ip0 17z0 qdd0 xX0 3S10 Tz0 dA10 11z0 1o10 11z0 1qN0 11z0 1ze0 11B0 WM0 1qO0 WI0 1nX0 1rB0 10L0 11B0 1in0 17d0 1in0 2pX0 19E0 1fU0 16Q0 1iI0 16Q0 1iI0 1Vd0 pb0 3Kp0 14o0 1de0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1a00 1fA0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WO0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 Xc0 1qo0 WM0 1qM0 11A0 1o00 1200 1nA0 11A0 1tA0 U00 15w0|13e6",
+ "Asia/Jakarta|BMT +0720 +0730 +09 +08 WIB|-77.c -7k -7u -90 -80 -70|01232425|-1Q0Tk luM0 mPzO 8vWu 6kpu 4PXu xhcu|31e6",
+ "Asia/Jayapura|LMT +09 +0930 WIT|-9m.M -90 -9u -90|0123|-1uu9m.M sMMm.M L4nu|26e4",
+ "Asia/Jerusalem|JMT IST IDT IDDT|-2k.E -20 -30 -40|01212121212132121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-26Bek.E SyMk.E 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 3LB0 Em0 or0 1cn0 1dB0 16n0 10O0 1ja0 1tC0 14o0 1cM0 1a00 11A0 1Na0 An0 1MP0 AJ0 1Kp0 LC0 1oo0 Wl0 EQN0 Db0 1fB0 Rb0 npB0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 1hB0 1dX0 1ep0 1aL0 1eN0 17X0 1nf0 11z0 1tB0 19W0 1e10 17b0 1ep0 1gL0 18N0 1fz0 1eN0 17b0 1gq0 1gn0 19d0 1dz0 1c10 17X0 1hB0 1gn0 19d0 1dz0 1c10 17X0 1kp0 1dz0 1c10 1aL0 1eN0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0|81e4",
+ "Asia/Kabul|+04 +0430|-40 -4u|01|-10Qs0|46e5",
+ "Asia/Kamchatka|LMT +11 +12 +13|-ay.A -b0 -c0 -d0|012323232323232323232321232323232323232323232323232323232323212|-1SLKy.A ivXy.A 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|18e4",
+ "Asia/Karachi|LMT +0530 +0630 +05 PKT PKST|-4s.c -5u -6u -50 -50 -60|012134545454|-2xoss.c 1qOKW.c 7zX0 eup0 LqMu 1fy00 1cL0 dK10 11b0 1610 1jX0|24e6",
+ "Asia/Urumqi|LMT +06|-5O.k -60|01|-1GgtO.k|32e5",
+ "Asia/Kathmandu|LMT +0530 +0545|-5F.g -5u -5J|012|-21JhF.g 2EGMb.g|12e5",
+ "Asia/Khandyga|LMT +08 +09 +10 +11|-92.d -80 -90 -a0 -b0|0123232323232323232323212323232323232323232323232343434343434343432|-21Q92.d pAp2.d 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 qK0 yN0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|66e2",
+ "Asia/Krasnoyarsk|LMT +06 +07 +08|-6b.q -60 -70 -80|01232323232323232323232123232323232323232323232323232323232323232|-21Hib.q prAb.q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|10e5",
+ "Asia/Kuala_Lumpur|SMT +07 +0720 +0730 +09 +08|-6T.p -70 -7k -7u -90 -80|0123435|-2Bg6T.p 17anT.p l5XE 17bO 8Fyu 1so1u|71e5",
+ "Asia/Kuching|LMT +0730 +08 +0820 +09|-7l.k -7u -80 -8k -90|0123232323232323242|-1KITl.k gDbP.k 6ynu AnE 1O0k AnE 1NAk AnE 1NAk AnE 1NAk AnE 1O0k AnE 1NAk AnE pAk 8Fz0|13e4",
+ "Asia/Macau|LMT CST CDT|-7y.k -80 -90|012121212121212121212121212121212121212121|-2le80 1XO3u 1wn0 Rd0 1wn0 R9u 1wqu U10 1tz0 TVu 1tz0 17gu 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cJu 1cL0 1cN0 1fz0 1cN0 1cOu 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cJu 1cL0 1cN0 1fz0 1cN0 1cL0|57e4",
+ "Asia/Magadan|LMT +10 +11 +12|-a3.c -a0 -b0 -c0|012323232323232323232321232323232323232323232323232323232323232312|-1Pca3.c eUo3.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Cq0|95e3",
+ "Asia/Makassar|LMT MMT +08 +09 WITA|-7V.A -7V.A -80 -90 -80|01234|-21JjV.A vfc0 myLV.A 8ML0|15e5",
+ "Asia/Manila|+08 +09|-80 -90|010101010|-1kJI0 AL0 cK10 65X0 mXB0 vX0 VK10 1db0|24e6",
+ "Asia/Nicosia|LMT EET EEST|-2d.s -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Vc2d.s 2a3cd.s 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|32e4",
+ "Asia/Novokuznetsk|LMT +06 +07 +08|-5M.M -60 -70 -80|012323232323232323232321232323232323232323232323232323232323212|-1PctM.M eULM.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|55e4",
+ "Asia/Novosibirsk|LMT +06 +07 +08|-5v.E -60 -70 -80|0123232323232323232323212323212121212121212121212121212121212121212|-21Qnv.E pAFv.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 ml0 Os0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 4eN0|15e5",
+ "Asia/Omsk|LMT +05 +06 +07|-4R.u -50 -60 -70|01232323232323232323232123232323232323232323232323232323232323232|-224sR.u pMLR.u 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|12e5",
+ "Asia/Oral|LMT +03 +05 +06 +04|-3p.o -30 -50 -60 -40|01232323232323232424242424242424242424242424242|-1Pc3p.o eUop.o 23CK0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 1cM0 IM0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|27e4",
+ "Asia/Pontianak|LMT PMT +0730 +09 +08 WITA WIB|-7h.k -7h.k -7u -90 -80 -80 -70|012324256|-2ua7h.k XE00 munL.k 8Rau 6kpu 4PXu xhcu Wqnu|23e4",
+ "Asia/Pyongyang|LMT KST JST KST|-8n -8u -90 -90|012313|-2um8n 97XR 1lTzu 2Onc0 6BAu|29e5",
+ "Asia/Qyzylorda|LMT +04 +05 +06|-4l.Q -40 -50 -60|0123232323232323232323232323232323232323232323|-1Pc4l.Q eUol.Q 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 3ao0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|73e4",
+ "Asia/Rangoon|RMT +0630 +09|-6o.L -6u -90|0121|-21Jio.L SmnS.L 7j9u|48e5",
+ "Asia/Sakhalin|LMT +09 +11 +12 +10|-9u.M -90 -b0 -c0 -a0|01232323232323232323232423232323232424242424242424242424242424242|-2AGVu.M 1BoMu.M 1qFa0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 2pB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|58e4",
+ "Asia/Samarkand|LMT +04 +05 +06|-4r.R -40 -50 -60|01232323232323232323232|-1Pc4r.R eUor.R 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|36e4",
+ "Asia/Seoul|LMT KST JST KST KDT KDT|-8r.Q -8u -90 -90 -9u -a0|0123141414141414135353|-2um8r.Q 97XV.Q 1m1zu kKo0 2I0u OL0 1FB0 Rb0 1qN0 TX0 1tB0 TX0 1tB0 TX0 1tB0 TX0 2ap0 12FBu 11A0 1o00 11A0|23e6",
+ "Asia/Srednekolymsk|LMT +10 +11 +12|-ae.Q -a0 -b0 -c0|01232323232323232323232123232323232323232323232323232323232323232|-1Pcae.Q eUoe.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|35e2",
+ "Asia/Taipei|CST JST CDT|-80 -90 -90|01020202020202020202020202020202020202020|-1iw80 joM0 1yo0 Tz0 1ip0 1jX0 1cN0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 10N0 1BX0 10p0 1pz0 10p0 1pz0 10p0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1BB0 ML0 1Bd0 ML0 uq10 1db0 1cN0 1db0 97B0 AL0|74e5",
+ "Asia/Tashkent|LMT +05 +06 +07|-4B.b -50 -60 -70|012323232323232323232321|-1Pc4B.b eUnB.b 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0|23e5",
+ "Asia/Tbilisi|TBMT +03 +04 +05|-2X.b -30 -40 -50|0123232323232323232323212121232323232323232323212|-1Pc2X.b 1jUnX.b WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cK0 1cL0 1cN0 1cL0 1cN0 2pz0 1cL0 1fB0 3Nz0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 An0 Os0 WM0|11e5",
+ "Asia/Tehran|LMT TMT +0330 +04 +05 +0430|-3p.I -3p.I -3u -40 -50 -4u|01234325252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2btDp.I 1d3c0 1huLT.I TXu 1pz0 sN0 vAu 1cL0 1dB0 1en0 pNB0 UL0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 64p0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0|14e6",
+ "Asia/Thimphu|LMT +0530 +06|-5W.A -5u -60|012|-Su5W.A 1BGMs.A|79e3",
+ "Asia/Tokyo|JST JDT|-90 -a0|010101010|-QJJ0 Rb0 1ld0 14n0 1zd0 On0 1zd0 On0|38e6",
+ "Asia/Tomsk|LMT +06 +07 +08|-5D.P -60 -70 -80|0123232323232323232323212323232323232323232323212121212121212121212|-21NhD.P pxzD.P 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 co0 1bB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Qp0|10e5",
+ "Asia/Ulaanbaatar|LMT +07 +08 +09|-77.w -70 -80 -90|012323232323232323232323232323232323232323232323232|-2APH7.w 2Uko7.w cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|12e5",
+ "Asia/Ust-Nera|LMT +08 +09 +12 +11 +10|-9w.S -80 -90 -c0 -b0 -a0|012343434343434343434345434343434343434343434343434343434343434345|-21Q9w.S pApw.S 23CL0 1d90 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|65e2",
+ "Asia/Vladivostok|LMT +09 +10 +11|-8L.v -90 -a0 -b0|01232323232323232323232123232323232323232323232323232323232323232|-1SJIL.v itXL.v 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4",
+ "Asia/Yakutsk|LMT +08 +09 +10|-8C.W -80 -90 -a0|01232323232323232323232123232323232323232323232323232323232323232|-21Q8C.W pAoC.W 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|28e4",
+ "Asia/Yekaterinburg|LMT PMT +04 +05 +06|-42.x -3J.5 -40 -50 -60|012343434343434343434343234343434343434343434343434343434343434343|-2ag42.x 7mQh.s qBvJ.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|14e5",
+ "Asia/Yerevan|LMT +03 +04 +05|-2W -30 -40 -50|0123232323232323232323212121212323232323232323232323232323232|-1Pc2W 1jUnW WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 4RX0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|13e5",
+ "Atlantic/Azores|HMT -02 -01 +00 WET|1S.w 20 10 0 0|01212121212121212121212121212121212121212121232123212321232121212121212121212121212121212121212121232323232323232323232323232323234323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2ldW0 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|25e4",
+ "Atlantic/Bermuda|LMT AST ADT|4j.i 40 30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1BnRE.G 1LTbE.G 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e3",
+ "Atlantic/Canary|LMT -01 WET WEST|11.A 10 0 -10|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UtaW.o XPAW.o 1lAK0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4",
+ "Atlantic/Cape_Verde|LMT -02 -01|1y.4 20 10|01212|-2ldW0 1eEo0 7zX0 1djf0|50e4",
+ "Atlantic/Faroe|LMT WET WEST|r.4 0 -10|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2uSnw.U 2Wgow.U 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|49e3",
+ "Atlantic/Madeira|FMT -01 +00 +01 WET WEST|17.A 10 0 -10 0 -10|01212121212121212121212121212121212121212121232123212321232121212121212121212121212121212121212121454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2ldX0 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|27e4",
+ "Atlantic/Reykjavik|LMT -01 +00 GMT|1s 10 0 0|012121212121212121212121212121212121212121212121212121212121212121213|-2uWmw mfaw 1Bd0 ML0 1LB0 Cn0 1LB0 3fX0 C10 HrX0 1cO0 LB0 1EL0 LA0 1C00 Oo0 1wo0 Rc0 1wo0 Rc0 1wo0 Rc0 1zc0 Oo0 1zc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0|12e4",
+ "Atlantic/South_Georgia|-02|20|0||30",
+ "Atlantic/Stanley|SMT -04 -03 -02|3P.o 40 30 20|012121212121212323212121212121212121212121212121212121212121212121212|-2kJw8.A 12bA8.A 19X0 1fB0 19X0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 Cn0 1Cc10 WL0 1qL0 U10 1tz0 2mN0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 U10 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qN0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 U10 1tz0 U10 1tz0 U10|21e2",
+ "Australia/Sydney|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|40e5",
+ "Australia/Adelaide|ACST ACDT|-9u -au|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lt xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 WM0 1qM0 Rc0 1zc0 U00 1tA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|11e5",
+ "Australia/Brisbane|AEST AEDT|-a0 -b0|01010101010101010|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0|20e5",
+ "Australia/Broken_Hill|ACST ACDT|-9u -au|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lt xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|18e3",
+ "Australia/Currie|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-29E80 19X0 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|746",
+ "Australia/Darwin|ACST ACDT|-9u -au|010101010|-293lt xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0|12e4",
+ "Australia/Eucla|+0845 +0945|-8J -9J|0101010101010101010|-293kI xcX 10jd0 yL0 1cN0 1cL0 1gSp0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|368",
+ "Australia/Hobart|AEST AEDT|-a0 -b0|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-29E80 19X0 10jd0 yL0 1cN0 1cL0 1fB0 19X0 VfB0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|21e4",
+ "Australia/Lord_Howe|AEST +1030 +1130 +11|-a0 -au -bu -b0|0121212121313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313|raC0 1zdu Rb0 1zd0 On0 1zd0 On0 1zd0 On0 1zd0 TXu 1qMu WLu 1tAu WLu 1tAu TXu 1tAu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 11Au 1nXu 1qMu 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu 11zu 1o0u WLu 1qMu 14nu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu|347",
+ "Australia/Lindeman|AEST AEDT|-a0 -b0|010101010101010101010|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0|10",
+ "Australia/Melbourne|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1qM0 11A0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|39e5",
+ "Australia/Perth|AWST AWDT|-80 -90|0101010101010101010|-293jX xcX 10jd0 yL0 1cN0 1cL0 1gSp0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|18e5",
+ "CET|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00",
+ "Pacific/Easter|EMT -07 -06 -05|7h.s 70 60 50|012121212121212121212121212123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1uSgG.w 1s4IG.w WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 2pA0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0|30e2",
+ "CST6CDT|CST CDT CWT CPT|60 50 50 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "EET|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00",
+ "Europe/Dublin|DMT IST GMT BST IST|p.l -y.D 0 -10 -10|01232323232324242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242|-2ax9y.D Rc0 1fzy.D 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 g600 14o0 1wo0 17c0 1io0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
+ "EST|EST|50|0|",
+ "EST5EDT|EST EDT EWT EPT|50 40 40 40|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 SgN0 8x40 iv0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "Etc/GMT-0|GMT|0|0|",
+ "Etc/GMT-1|+01|-10|0|",
+ "Pacific/Port_Moresby|+10|-a0|0||25e4",
+ "Pacific/Pohnpei|+11|-b0|0||34e3",
+ "Pacific/Tarawa|+12|-c0|0||29e3",
+ "Etc/GMT-13|+13|-d0|0|",
+ "Etc/GMT-14|+14|-e0|0|",
+ "Etc/GMT-2|+02|-20|0|",
+ "Etc/GMT-3|+03|-30|0|",
+ "Etc/GMT-4|+04|-40|0|",
+ "Etc/GMT-5|+05|-50|0|",
+ "Etc/GMT-6|+06|-60|0|",
+ "Indian/Christmas|+07|-70|0||21e2",
+ "Etc/GMT-8|+08|-80|0|",
+ "Pacific/Palau|+09|-90|0||21e3",
+ "Etc/GMT+1|-01|10|0|",
+ "Etc/GMT+10|-10|a0|0|",
+ "Etc/GMT+11|-11|b0|0|",
+ "Etc/GMT+12|-12|c0|0|",
+ "Etc/GMT+3|-03|30|0|",
+ "Etc/GMT+4|-04|40|0|",
+ "Etc/GMT+5|-05|50|0|",
+ "Etc/GMT+6|-06|60|0|",
+ "Etc/GMT+7|-07|70|0|",
+ "Etc/GMT+8|-08|80|0|",
+ "Etc/GMT+9|-09|90|0|",
+ "Etc/UCT|UCT|0|0|",
+ "Etc/UTC|UTC|0|0|",
+ "Europe/Amsterdam|AMT NST +0120 +0020 CEST CET|-j.w -1j.w -1k -k -20 -10|010101010101010101010101010101010101010101012323234545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545|-2aFcj.w 11b0 1iP0 11A0 1io0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1co0 1io0 1yo0 Pc0 1a00 1fA0 1Bc0 Mo0 1tc0 Uo0 1tA0 U00 1uo0 W00 1s00 VA0 1so0 Vc0 1sM0 UM0 1wo0 Rc0 1u00 Wo0 1rA0 W00 1s00 VA0 1sM0 UM0 1w00 fV0 BCX.w 1tA0 U00 1u00 Wo0 1sm0 601k WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|16e5",
+ "Europe/Andorra|WET CET CEST|0 -10 -20|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-UBA0 1xIN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|79e3",
+ "Europe/Astrakhan|LMT +03 +04 +05|-3c.c -30 -40 -50|012323232323232323212121212121212121212121212121212121212121212|-1Pcrc.c eUMc.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0",
+ "Europe/Athens|AMT EET EEST CEST CET|-1y.Q -20 -30 -20 -10|012123434121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a61x.Q CNbx.Q mn0 kU10 9b0 3Es0 Xa0 1fb0 1dd0 k3X0 Nz0 SCp0 1vc0 SO0 1cM0 1a00 1ao0 1fc0 1a10 1fG0 1cg0 1dX0 1bX0 1cQ0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|35e5",
+ "Europe/London|GMT BST BDST|0 -10 -20|0101010101010101010101010101010101010101010101010121212121210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|10e6",
+ "Europe/Belgrade|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-19RC0 3IP0 WM0 1fA0 1cM0 1cM0 1rc0 Qo0 1vmo0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
+ "Europe/Berlin|CET CEST CEMT|-10 -20 -30|01010101010101210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 kL0 Nc0 m10 WM0 1ao0 1cp0 dX0 jz0 Dd0 1io0 17c0 1fA0 1a00 1ehA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e5",
+ "Europe/Prague|CET CEST GMT|-10 -20 0|01010101010101010201010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 1qM0 11c0 mp0 xA0 mn0 17c0 1io0 17c0 1fc0 1ao0 1bNc0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|13e5",
+ "Europe/Brussels|WET CET CEST WEST|0 -10 -20 -10|0121212103030303030303030303030303030303030303030303212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ehc0 3zX0 11c0 1iO0 11A0 1o00 11A0 my0 Ic0 1qM0 Rc0 1EM0 UM0 1u00 10o0 1io0 1io0 17c0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a30 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 y00 5Wn0 WM0 1fA0 1cM0 16M0 1iM0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|21e5",
+ "Europe/Bucharest|BMT EET EEST|-1I.o -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1xApI.o 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Axc0 On0 1fA0 1a10 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|19e5",
+ "Europe/Budapest|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1ip0 17b0 1op0 1tb0 Q2m0 3Ne0 WM0 1fA0 1cM0 1cM0 1oJ0 1dc0 1030 1fA0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1iM0 1fA0 8Ha0 Rb0 1wN0 Rb0 1BB0 Lz0 1C20 LB0 SNX0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e5",
+ "Europe/Zurich|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-19Lc0 11A0 1o00 11A0 1xG10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|38e4",
+ "Europe/Chisinau|CMT BMT EET EEST CEST CET MSK MSD|-1T -1I.o -20 -30 -20 -10 -30 -40|012323232323232323234545467676767676767676767323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-26jdT wGMa.A 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 27A0 2en0 39g0 WM0 1fA0 1cM0 V90 1t7z0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 gL0 WO0 1cM0 1cM0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11D0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|67e4",
+ "Europe/Copenhagen|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2azC0 Tz0 VuO0 60q0 WM0 1fA0 1cM0 1cM0 1cM0 S00 1HA0 Nc0 1C00 Dc0 1Nc0 Ao0 1h5A0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
+ "Europe/Gibraltar|GMT BST BDST CET CEST|0 -10 -20 -10 -20|010101010101010101010101010101010101010101010101012121212121010121010101010101010101034343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 10Jz0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|30e3",
+ "Europe/Helsinki|HMT EET EEST|-1D.N -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1WuND.N OULD.N 1dA0 1xGq0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
+ "Europe/Kaliningrad|CET CEST CET CEST MSK MSD EEST EET +03|-10 -20 -20 -30 -30 -40 -30 -20 -30|0101010101010232454545454545454546767676767676767676767676767676767676767676787|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 Am0 Lb0 1en0 op0 1pNz0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|44e4",
+ "Europe/Kiev|KMT EET MSK CEST CET MSD EEST|-22.4 -20 -30 -20 -10 -40 -30|0123434252525252525252525256161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161|-1Pc22.4 eUo2.4 rnz0 2Hg0 WM0 1fA0 da0 1v4m0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 Db0 3220 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|34e5",
+ "Europe/Kirov|LMT +03 +04 +05|-3i.M -30 -40 -50|01232323232323232321212121212121212121212121212121212121212121|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|48e4",
+ "Europe/Lisbon|LMT WET WEST WEMT CET CEST|A.J 0 -10 -20 -10 -20|012121212121212121212121212121212121212121212321232123212321212121212121212121212121212121212121214121212121212121212121212121212124545454212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2le00 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 pvy0 1cM0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|27e5",
+ "Europe/Luxembourg|LMT CET CEST WET WEST WEST WET|-o.A -10 -20 0 -10 -20 -10|0121212134343434343434343434343434343434343434343434565651212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2DG0o.A t6mo.A TB0 1nX0 Up0 1o20 11A0 rW0 CM0 1qP0 R90 1EO0 UK0 1u20 10m0 1ip0 1in0 17e0 19W0 1fB0 1db0 1cp0 1in0 17d0 1fz0 1a10 1in0 1a10 1in0 17f0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 vA0 60L0 WM0 1fA0 1cM0 17c0 1io0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4",
+ "Europe/Madrid|WET WEST WEMT CET CEST|0 -10 -20 -10 -20|010101010101010101210343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-25Td0 19B0 1cL0 1dd0 b1z0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1in0 17d0 iIn0 Hd0 1cL0 bb0 1200 2s20 14n0 5aL0 Mp0 1vz0 17d0 1in0 17d0 1in0 17d0 1in0 17d0 6hX0 11B0 XHX0 1a10 1fz0 1a10 19X0 1cN0 1fz0 1a10 1fC0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|62e5",
+ "Europe/Malta|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2arB0 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1co0 17c0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1co0 1cM0 1lA0 Xc0 1qq0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1iN0 19z0 1fB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|42e4",
+ "Europe/Minsk|MMT EET MSK CEST CET MSD EEST +03|-1O -20 -30 -20 -10 -40 -30 -30|01234343252525252525252525261616161616161616161616161616161616161617|-1Pc1O eUnO qNX0 3gQ0 WM0 1fA0 1cM0 Al0 1tsn0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 3Fc0 1cN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0|19e5",
+ "Europe/Monaco|PMT WET WEST WEMT CET CEST|-9.l 0 -10 -20 -10 -20|01212121212121212121212121212121212121212121212121232323232345454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 2RV0 11z0 11B0 1ze0 WM0 1fA0 1cM0 1fa0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|38e3",
+ "Europe/Moscow|MMT MMT MST MDST MSD MSK +05 EET EEST MSK|-2u.h -2v.j -3v.j -4v.j -40 -30 -50 -20 -30 -40|012132345464575454545454545454545458754545454545454545454545454545454545454595|-2ag2u.h 2pyW.W 1bA0 11X0 GN0 1Hb0 c4v.j ik0 3DA0 dz0 15A0 c10 2q10 iM10 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|16e6",
+ "Europe/Paris|PMT WET WEST CEST CET WEMT|-9.l 0 -10 -20 -10 -20|0121212121212121212121212121212121212121212121212123434352543434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434|-2nco8.l cNb8.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 Ik0 5M30 WM0 1fA0 1cM0 Vx0 hB0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|11e6",
+ "Europe/Riga|RMT LST EET MSK CEST CET MSD EEST|-1A.y -2A.y -20 -30 -20 -10 -40 -30|010102345454536363636363636363727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272|-25TzA.y 11A0 1iM0 ko0 gWm0 yDXA.y 2bX0 3fE0 WM0 1fA0 1cM0 1cM0 4m0 1sLy0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 1o00 11A0 1o00 11A0 1qM0 3oo0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|64e4",
+ "Europe/Rome|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2arB0 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1cM0 16M0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1C00 LA0 1zc0 Oo0 1C00 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1zc0 Oo0 1fC0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|39e5",
+ "Europe/Samara|LMT +03 +04 +05|-3k.k -30 -40 -50|0123232323232323232121232323232323232323232323232323232323212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2y10 14m0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|12e5",
+ "Europe/Saratov|LMT +03 +04 +05|-34.i -30 -40 -50|012323232323232321212121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 5810",
+ "Europe/Simferopol|SMT EET MSK CEST CET MSD EEST MSK|-2g -20 -30 -20 -10 -40 -30 -40|012343432525252525252525252161616525252616161616161616161616161616161616172|-1Pc2g eUog rEn0 2qs0 WM0 1fA0 1cM0 3V0 1u0L0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 4eL0 1cL0 1cN0 1cL0 1cN0 dX0 WL0 1cN0 1cL0 1fB0 1o30 11B0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11z0 1nW0|33e4",
+ "Europe/Sofia|EET CET CEST EEST|-20 -10 -20 -30|01212103030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030|-168L0 WM0 1fA0 1cM0 1cM0 1cN0 1mKH0 1dd0 1fb0 1ap0 1fb0 1a20 1fy0 1a30 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
+ "Europe/Stockholm|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2azC0 TB0 2yDe0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|15e5",
+ "Europe/Tallinn|TMT CET CEST EET MSK MSD EEST|-1D -10 -20 -20 -30 -40 -30|012103421212454545454545454546363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363|-26oND teD 11A0 1Ta0 4rXl KSLD 2FX0 2Jg0 WM0 1fA0 1cM0 18J0 1sTX0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o10 11A0 1qM0 5QM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e4",
+ "Europe/Tirane|LMT CET CEST|-1j.k -10 -20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glBj.k 14pcj.k 5LC0 WM0 4M0 1fCK0 10n0 1op0 11z0 1pd0 11z0 1qN0 WL0 1qp0 Xb0 1qp0 Xb0 1qp0 11z0 1lB0 11z0 1qN0 11z0 1iN0 16n0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|42e4",
+ "Europe/Ulyanovsk|LMT +03 +04 +05 +02|-3d.A -30 -40 -50 -20|01232323232323232321214121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0",
+ "Europe/Uzhgorod|CET CEST MSK MSD EET EEST|-10 -20 -30 -40 -20 -30|010101023232323232323232320454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-1cqL0 6i00 WM0 1fA0 1cM0 1ml0 1Cp0 1r3W0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 1Nf0 2pw0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|11e4",
+ "Europe/Vienna|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 3KM0 14o0 LA00 6i00 WM0 1fA0 1cM0 1cM0 1cM0 400 2qM0 1a00 1cM0 1cM0 1io0 17c0 1gHa0 19X0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|18e5",
+ "Europe/Vilnius|WMT KMT CET EET MSK CEST MSD EEST|-1o -1z.A -10 -20 -30 -20 -40 -30|012324525254646464646464646473737373737373737352537373737373737373737373737373737373737373737373737373737373737373737373|-293do 6ILM.o 1Ooz.A zz0 Mfd0 29W0 3is0 WM0 1fA0 1cM0 LV0 1tgL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11B0 1o00 11A0 1qM0 8io0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4",
+ "Europe/Volgograd|LMT +03 +04 +05|-2V.E -30 -40 -50|01232323232323232121212121212121212121212121212121212121212121|-21IqV.E psLV.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|10e5",
+ "Europe/Warsaw|WMT CET CEST EET EEST|-1o -10 -20 -20 -30|012121234312121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ctdo 1LXo 11d0 1iO0 11A0 1o00 11A0 1on0 11A0 6zy0 HWP0 5IM0 WM0 1fA0 1cM0 1dz0 1mL0 1en0 15B0 1aq0 1nA0 11A0 1io0 17c0 1fA0 1a00 iDX0 LA0 1cM0 1cM0 1C00 Oo0 1cM0 1cM0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1C00 LA0 uso0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e5",
+ "Europe/Zaporozhye|+0220 EET MSK CEST CET MSD EEST|-2k -20 -30 -20 -10 -40 -30|01234342525252525252525252526161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161|-1Pc2k eUok rdb0 2RE0 WM0 1fA0 8m0 1v9a0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cK0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|77e4",
+ "HST|HST|a0|0|",
+ "Indian/Chagos|LMT +05 +06|-4N.E -50 -60|012|-2xosN.E 3AGLN.E|30e2",
+ "Indian/Cocos|+0630|-6u|0||596",
+ "Indian/Kerguelen|-00 +05|0 -50|01|-MG00|130",
+ "Indian/Mahe|LMT +04|-3F.M -40|01|-2yO3F.M|79e3",
+ "Indian/Maldives|MMT +05|-4S -50|01|-olgS|35e4",
+ "Indian/Mauritius|LMT +04 +05|-3O -40 -50|012121|-2xorO 34unO 14L0 12kr0 11z0|15e4",
+ "Indian/Reunion|LMT +04|-3F.Q -40|01|-2mDDF.Q|84e4",
+ "Pacific/Kwajalein|+11 -12 +12|-b0 c0 -c0|012|-AX0 W9X0|14e3",
+ "MET|MET MEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00",
+ "MST|MST|70|0|",
+ "MST7MDT|MST MDT MWT MPT|70 60 60 60|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "Pacific/Chatham|+1215 +1245 +1345|-cf -cJ -dJ|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-WqAf 1adef IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|600",
+ "Pacific/Apia|LMT -1130 -11 -10 +14 +13|bq.U bu b0 a0 -e0 -d0|01232345454545454545454545454545454545454545454545454545454|-2nDMx.4 1yW03.4 2rRbu 1ff0 1a00 CI0 AQ0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|37e3",
+ "Pacific/Bougainville|+10 +09 +11|-a0 -90 -b0|0102|-16Wy0 7CN0 2MQp0|18e4",
+ "Pacific/Efate|LMT +11 +12|-bd.g -b0 -c0|0121212121212121212121|-2l9nd.g 2Szcd.g 1cL0 1oN0 10L0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 Lz0 1Nd0 An0|66e3",
+ "Pacific/Enderbury|-12 -11 +13|c0 b0 -d0|012|nIc0 B7X0|1",
+ "Pacific/Fakaofo|-11 +13|b0 -d0|01|1Gfn0|483",
+ "Pacific/Fiji|LMT +12 +13|-bT.I -c0 -d0|0121212121212121212121212121212121212121212121212121212121212121|-2bUzT.I 3m8NT.I LA0 1EM0 IM0 nJc0 LA0 1o00 Rc0 1wo0 Ao0 1Nc0 Ao0 1Q00 xz0 1SN0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0|88e4",
+ "Pacific/Galapagos|LMT -05 -06|5W.o 50 60|01212|-1yVS1.A 2dTz1.A gNd0 rz0|25e3",
+ "Pacific/Gambier|LMT -09|8X.M 90|01|-2jof0.c|125",
+ "Pacific/Guadalcanal|LMT +11|-aD.M -b0|01|-2joyD.M|11e4",
+ "Pacific/Guam|GST ChST|-a0 -a0|01|1fpq0|17e4",
+ "Pacific/Honolulu|HST HDT HST|au 9u a0|010102|-1thLu 8x0 lef0 8Pz0 46p0|37e4",
+ "Pacific/Kiritimati|-1040 -10 +14|aE a0 -e0|012|nIaE B7Xk|51e2",
+ "Pacific/Kosrae|+11 +12|-b0 -c0|010|-AX0 1bdz0|66e2",
+ "Pacific/Majuro|+11 +12|-b0 -c0|01|-AX0|28e3",
+ "Pacific/Marquesas|LMT -0930|9i 9u|01|-2joeG|86e2",
+ "Pacific/Pago_Pago|LMT SST|bm.M b0|01|-2nDMB.c|37e2",
+ "Pacific/Nauru|LMT +1130 +09 +12|-b7.E -bu -90 -c0|01213|-1Xdn7.E PvzB.E 5RCu 1ouJu|10e3",
+ "Pacific/Niue|-1120 -1130 -11|bk bu b0|012|-KfME 17y0a|12e2",
+ "Pacific/Norfolk|+1112 +1130 +1230 +11|-bc -bu -cu -b0|01213|-Kgbc W01G On0 1COp0|25e4",
+ "Pacific/Noumea|LMT +11 +12|-b5.M -b0 -c0|01212121|-2l9n5.M 2EqM5.M xX0 1PB0 yn0 HeP0 Ao0|98e3",
+ "Pacific/Pitcairn|-0830 -08|8u 80|01|18Vku|56",
+ "Pacific/Rarotonga|-1030 -0930 -10|au 9u a0|012121212121212121212121212|lyWu IL0 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu|13e3",
+ "Pacific/Tahiti|LMT -10|9W.g a0|01|-2joe1.I|18e4",
+ "Pacific/Tongatapu|+1220 +13 +14|-ck -d0 -e0|0121212121|-1aB0k 2n5dk 15A0 1wo0 xz0 1Q10 xz0 zWN0 s00|75e3",
+ "PST8PDT|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "WET|WET WEST|0 -10|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00"
+ ],
+ "links": [
+ "Africa/Abidjan|Africa/Bamako",
+ "Africa/Abidjan|Africa/Banjul",
+ "Africa/Abidjan|Africa/Conakry",
+ "Africa/Abidjan|Africa/Dakar",
+ "Africa/Abidjan|Africa/Freetown",
+ "Africa/Abidjan|Africa/Lome",
+ "Africa/Abidjan|Africa/Nouakchott",
+ "Africa/Abidjan|Africa/Ouagadougou",
+ "Africa/Abidjan|Africa/Timbuktu",
+ "Africa/Abidjan|Atlantic/St_Helena",
+ "Africa/Cairo|Egypt",
+ "Africa/Johannesburg|Africa/Maseru",
+ "Africa/Johannesburg|Africa/Mbabane",
+ "Africa/Lagos|Africa/Bangui",
+ "Africa/Lagos|Africa/Brazzaville",
+ "Africa/Lagos|Africa/Douala",
+ "Africa/Lagos|Africa/Kinshasa",
+ "Africa/Lagos|Africa/Libreville",
+ "Africa/Lagos|Africa/Luanda",
+ "Africa/Lagos|Africa/Malabo",
+ "Africa/Lagos|Africa/Niamey",
+ "Africa/Lagos|Africa/Porto-Novo",
+ "Africa/Maputo|Africa/Blantyre",
+ "Africa/Maputo|Africa/Bujumbura",
+ "Africa/Maputo|Africa/Gaborone",
+ "Africa/Maputo|Africa/Harare",
+ "Africa/Maputo|Africa/Kigali",
+ "Africa/Maputo|Africa/Lubumbashi",
+ "Africa/Maputo|Africa/Lusaka",
+ "Africa/Nairobi|Africa/Addis_Ababa",
+ "Africa/Nairobi|Africa/Asmara",
+ "Africa/Nairobi|Africa/Asmera",
+ "Africa/Nairobi|Africa/Dar_es_Salaam",
+ "Africa/Nairobi|Africa/Djibouti",
+ "Africa/Nairobi|Africa/Kampala",
+ "Africa/Nairobi|Africa/Mogadishu",
+ "Africa/Nairobi|Indian/Antananarivo",
+ "Africa/Nairobi|Indian/Comoro",
+ "Africa/Nairobi|Indian/Mayotte",
+ "Africa/Tripoli|Libya",
+ "America/Adak|America/Atka",
+ "America/Adak|US/Aleutian",
+ "America/Anchorage|US/Alaska",
+ "America/Argentina/Buenos_Aires|America/Buenos_Aires",
+ "America/Argentina/Catamarca|America/Argentina/ComodRivadavia",
+ "America/Argentina/Catamarca|America/Catamarca",
+ "America/Argentina/Cordoba|America/Cordoba",
+ "America/Argentina/Cordoba|America/Rosario",
+ "America/Argentina/Jujuy|America/Jujuy",
+ "America/Argentina/Mendoza|America/Mendoza",
+ "America/Atikokan|America/Coral_Harbour",
+ "America/Chicago|US/Central",
+ "America/Curacao|America/Aruba",
+ "America/Curacao|America/Kralendijk",
+ "America/Curacao|America/Lower_Princes",
+ "America/Denver|America/Shiprock",
+ "America/Denver|Navajo",
+ "America/Denver|US/Mountain",
+ "America/Detroit|US/Michigan",
+ "America/Edmonton|Canada/Mountain",
+ "America/Fort_Wayne|America/Indiana/Indianapolis",
+ "America/Fort_Wayne|America/Indianapolis",
+ "America/Fort_Wayne|US/East-Indiana",
+ "America/Halifax|Canada/Atlantic",
+ "America/Havana|Cuba",
+ "America/Indiana/Knox|America/Knox_IN",
+ "America/Indiana/Knox|US/Indiana-Starke",
+ "America/Jamaica|Jamaica",
+ "America/Kentucky/Louisville|America/Louisville",
+ "America/Los_Angeles|US/Pacific",
+ "America/Los_Angeles|US/Pacific-New",
+ "America/Manaus|Brazil/West",
+ "America/Mazatlan|Mexico/BajaSur",
+ "America/Mexico_City|Mexico/General",
+ "America/New_York|US/Eastern",
+ "America/Noronha|Brazil/DeNoronha",
+ "America/Panama|America/Cayman",
+ "America/Phoenix|US/Arizona",
+ "America/Port_of_Spain|America/Anguilla",
+ "America/Port_of_Spain|America/Antigua",
+ "America/Port_of_Spain|America/Dominica",
+ "America/Port_of_Spain|America/Grenada",
+ "America/Port_of_Spain|America/Guadeloupe",
+ "America/Port_of_Spain|America/Marigot",
+ "America/Port_of_Spain|America/Montserrat",
+ "America/Port_of_Spain|America/St_Barthelemy",
+ "America/Port_of_Spain|America/St_Kitts",
+ "America/Port_of_Spain|America/St_Lucia",
+ "America/Port_of_Spain|America/St_Thomas",
+ "America/Port_of_Spain|America/St_Vincent",
+ "America/Port_of_Spain|America/Tortola",
+ "America/Port_of_Spain|America/Virgin",
+ "America/Regina|Canada/Saskatchewan",
+ "America/Rio_Branco|America/Porto_Acre",
+ "America/Rio_Branco|Brazil/Acre",
+ "America/Santiago|Chile/Continental",
+ "America/Sao_Paulo|Brazil/East",
+ "America/St_Johns|Canada/Newfoundland",
+ "America/Tijuana|America/Ensenada",
+ "America/Tijuana|America/Santa_Isabel",
+ "America/Tijuana|Mexico/BajaNorte",
+ "America/Toronto|America/Montreal",
+ "America/Toronto|Canada/Eastern",
+ "America/Vancouver|Canada/Pacific",
+ "America/Whitehorse|Canada/Yukon",
+ "America/Winnipeg|Canada/Central",
+ "Asia/Ashgabat|Asia/Ashkhabad",
+ "Asia/Bangkok|Asia/Phnom_Penh",
+ "Asia/Bangkok|Asia/Vientiane",
+ "Asia/Dhaka|Asia/Dacca",
+ "Asia/Dubai|Asia/Muscat",
+ "Asia/Ho_Chi_Minh|Asia/Saigon",
+ "Asia/Hong_Kong|Hongkong",
+ "Asia/Jerusalem|Asia/Tel_Aviv",
+ "Asia/Jerusalem|Israel",
+ "Asia/Kathmandu|Asia/Katmandu",
+ "Asia/Kolkata|Asia/Calcutta",
+ "Asia/Kuala_Lumpur|Asia/Singapore",
+ "Asia/Kuala_Lumpur|Singapore",
+ "Asia/Macau|Asia/Macao",
+ "Asia/Makassar|Asia/Ujung_Pandang",
+ "Asia/Nicosia|Europe/Nicosia",
+ "Asia/Qatar|Asia/Bahrain",
+ "Asia/Rangoon|Asia/Yangon",
+ "Asia/Riyadh|Asia/Aden",
+ "Asia/Riyadh|Asia/Kuwait",
+ "Asia/Seoul|ROK",
+ "Asia/Shanghai|Asia/Chongqing",
+ "Asia/Shanghai|Asia/Chungking",
+ "Asia/Shanghai|Asia/Harbin",
+ "Asia/Shanghai|PRC",
+ "Asia/Taipei|ROC",
+ "Asia/Tehran|Iran",
+ "Asia/Thimphu|Asia/Thimbu",
+ "Asia/Tokyo|Japan",
+ "Asia/Ulaanbaatar|Asia/Ulan_Bator",
+ "Asia/Urumqi|Asia/Kashgar",
+ "Atlantic/Faroe|Atlantic/Faeroe",
+ "Atlantic/Reykjavik|Iceland",
+ "Atlantic/South_Georgia|Etc/GMT+2",
+ "Australia/Adelaide|Australia/South",
+ "Australia/Brisbane|Australia/Queensland",
+ "Australia/Broken_Hill|Australia/Yancowinna",
+ "Australia/Darwin|Australia/North",
+ "Australia/Hobart|Australia/Tasmania",
+ "Australia/Lord_Howe|Australia/LHI",
+ "Australia/Melbourne|Australia/Victoria",
+ "Australia/Perth|Australia/West",
+ "Australia/Sydney|Australia/ACT",
+ "Australia/Sydney|Australia/Canberra",
+ "Australia/Sydney|Australia/NSW",
+ "Etc/GMT-0|Etc/GMT",
+ "Etc/GMT-0|Etc/GMT+0",
+ "Etc/GMT-0|Etc/GMT0",
+ "Etc/GMT-0|Etc/Greenwich",
+ "Etc/GMT-0|GMT",
+ "Etc/GMT-0|GMT+0",
+ "Etc/GMT-0|GMT-0",
+ "Etc/GMT-0|GMT0",
+ "Etc/GMT-0|Greenwich",
+ "Etc/UCT|UCT",
+ "Etc/UTC|Etc/Universal",
+ "Etc/UTC|Etc/Zulu",
+ "Etc/UTC|UTC",
+ "Etc/UTC|Universal",
+ "Etc/UTC|Zulu",
+ "Europe/Belgrade|Europe/Ljubljana",
+ "Europe/Belgrade|Europe/Podgorica",
+ "Europe/Belgrade|Europe/Sarajevo",
+ "Europe/Belgrade|Europe/Skopje",
+ "Europe/Belgrade|Europe/Zagreb",
+ "Europe/Chisinau|Europe/Tiraspol",
+ "Europe/Dublin|Eire",
+ "Europe/Helsinki|Europe/Mariehamn",
+ "Europe/Istanbul|Asia/Istanbul",
+ "Europe/Istanbul|Turkey",
+ "Europe/Lisbon|Portugal",
+ "Europe/London|Europe/Belfast",
+ "Europe/London|Europe/Guernsey",
+ "Europe/London|Europe/Isle_of_Man",
+ "Europe/London|Europe/Jersey",
+ "Europe/London|GB",
+ "Europe/London|GB-Eire",
+ "Europe/Moscow|W-SU",
+ "Europe/Oslo|Arctic/Longyearbyen",
+ "Europe/Oslo|Atlantic/Jan_Mayen",
+ "Europe/Prague|Europe/Bratislava",
+ "Europe/Rome|Europe/San_Marino",
+ "Europe/Rome|Europe/Vatican",
+ "Europe/Warsaw|Poland",
+ "Europe/Zurich|Europe/Busingen",
+ "Europe/Zurich|Europe/Vaduz",
+ "Indian/Christmas|Etc/GMT-7",
+ "Pacific/Auckland|Antarctica/McMurdo",
+ "Pacific/Auckland|Antarctica/South_Pole",
+ "Pacific/Auckland|NZ",
+ "Pacific/Chatham|NZ-CHAT",
+ "Pacific/Easter|Chile/EasterIsland",
+ "Pacific/Guam|Pacific/Saipan",
+ "Pacific/Honolulu|Pacific/Johnston",
+ "Pacific/Honolulu|US/Hawaii",
+ "Pacific/Kwajalein|Kwajalein",
+ "Pacific/Pago_Pago|Pacific/Midway",
+ "Pacific/Pago_Pago|Pacific/Samoa",
+ "Pacific/Pago_Pago|US/Samoa",
+ "Pacific/Palau|Etc/GMT-9",
+ "Pacific/Pohnpei|Etc/GMT-11",
+ "Pacific/Pohnpei|Pacific/Ponape",
+ "Pacific/Port_Moresby|Etc/GMT-10",
+ "Pacific/Port_Moresby|Pacific/Chuuk",
+ "Pacific/Port_Moresby|Pacific/Truk",
+ "Pacific/Port_Moresby|Pacific/Yap",
+ "Pacific/Tarawa|Etc/GMT-12",
+ "Pacific/Tarawa|Pacific/Funafuti",
+ "Pacific/Tarawa|Pacific/Wake",
+ "Pacific/Tarawa|Pacific/Wallis"
+ ]
+ });
+
+
+ return moment;
+}));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/builds/moment-timezone-with-data.min.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/builds/moment-timezone-with-data.min.js
new file mode 100644
index 00000000000..1d3235d3ada
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/builds/moment-timezone-with-data.min.js
@@ -0,0 +1 @@
+!function(c,M){"use strict";"function"==typeof define&&define.amd?define(["moment"],M):"object"==typeof module&&module.exports?module.exports=M(require("moment")):M(c.moment)}(this,function(o){"use strict";var M,p={},n={},L={},q={},c=o.version.split("."),z=+c[0],A=+c[1];function a(c){return 96<c?c-87:64<c?c-29:c-48}function b(c){var M=0,z=c.split("."),A=z[0],b=z[1]||"",o=1,p=0,n=1;for(45===c.charCodeAt(0)&&(n=-(M=1));M<A.length;M++)p=60*p+a(A.charCodeAt(M));for(M=0;M<b.length;M++)o/=60,p+=a(b.charCodeAt(M))*o;return p*n}function O(c){for(var M=0;M<c.length;M++)c[M]=b(c[M])}function N(c,M){var z,A=[];for(z=0;z<M.length;z++)A[z]=c[M[z]];return A}function i(c){var M=c.split("|"),z=M[2].split(" "),A=M[3].split(""),b=M[4].split(" ");return O(z),O(A),O(b),function(c,M){for(var z=0;z<M;z++)c[z]=Math.round((c[z-1]||0)+6e4*c[z]);c[M-1]=1/0}(b,A.length),{name:M[0],abbrs:N(M[1].split(" "),A),offsets:N(z,A),untils:b,population:0|M[5]}}function W(c){c&&this._set(i(c))}function d(c){var M=c.toTimeString(),z=M.match(/\([a-z ]+\)/i);"GMT"===(z=z&&z[0]?(z=z[0].match(/[A-Z]/g))?z.join(""):void 0:(z=M.match(/[A-Z]{3,5}/g))?z[0]:void 0)&&(z=void 0),this.at=+c,this.abbr=z,this.offset=c.getTimezoneOffset()}function e(c){this.zone=c,this.offsetScore=0,this.abbrScore=0}function X(c,M){for(var z,A;A=6e4*((M.at-c.at)/12e4|0);)(z=new d(new Date(c.at+A))).offset===c.offset?c=z:M=z;return c}function f(c,M){return c.offsetScore!==M.offsetScore?c.offsetScore-M.offsetScore:c.abbrScore!==M.abbrScore?c.abbrScore-M.abbrScore:M.zone.population-c.zone.population}function B(c,M){var z,A;for(O(M),z=0;z<M.length;z++)A=M[z],q[A]=q[A]||{},q[A][c]=!0}function r(){try{var c=Intl.DateTimeFormat().resolvedOptions().timeZone;if(c&&3<c.length){var M=L[T(c)];if(M)return M;C("Moment Timezone found "+c+" from the Intl api, but did not have that data loaded.")}}catch(c){}var z,A,b,o=function(){var c,M,z,A=(new Date).getFullYear()-2,b=new d(new Date(A,0,1)),o=[b];for(z=1;z<48;z++)(M=new d(new Date(A,z,1))).offset!==b.offset&&(c=X(b,M),o.push(c),o.push(new d(new Date(c.at+6e4)))),b=M;for(z=0;z<4;z++)o.push(new d(new Date(A+z,0,1))),o.push(new d(new Date(A+z,6,1)));return o}(),p=o.length,n=function(c){var M,z,A,b=c.length,o={},p=[];for(M=0;M<b;M++)for(z in A=q[c[M].offset]||{})A.hasOwnProperty(z)&&(o[z]=!0);for(M in o)o.hasOwnProperty(M)&&p.push(L[M]);return p}(o),a=[];for(A=0;A<n.length;A++){for(z=new e(u(n[A]),p),b=0;b<p;b++)z.scoreOffsetAt(o[b]);a.push(z)}return a.sort(f),0<a.length?a[0].zone.name:void 0}function T(c){return(c||"").toLowerCase().replace(/\//g,"_")}function l(c){var M,z,A,b;for("string"==typeof c&&(c=[c]),M=0;M<c.length;M++)b=T(z=(A=c[M].split("|"))[0]),p[b]=c[M],L[b]=z,B(b,A[2].split(" "))}function u(c,M){c=T(c);var z,A=p[c];return A instanceof W?A:"string"==typeof A?(A=new W(A),p[c]=A):n[c]&&M!==u&&(z=u(n[c],u))?((A=p[c]=new W)._set(z),A.name=L[c],A):null}function t(c){var M,z,A,b;for("string"==typeof c&&(c=[c]),M=0;M<c.length;M++)A=T((z=c[M].split("|"))[0]),b=T(z[1]),n[A]=b,L[A]=z[0],n[b]=A,L[b]=z[1]}function s(c){l(c.zones),t(c.links),R.dataVersion=c.version}function E(c){var M="X"===c._f||"x"===c._f;return!(!c._a||void 0!==c._tzm||M)}function C(c){"undefined"!=typeof console&&"function"==typeof console.error&&console.error(c)}function R(c){var M=Array.prototype.slice.call(arguments,0,-1),z=arguments[arguments.length-1],A=u(z),b=o.utc.apply(null,M);return A&&!o.isMoment(c)&&E(b)&&b.add(A.parse(b),"minutes"),b.tz(z),b}(z<2||2===z&&A<6)&&C("Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js "+o.version+". See momentjs.com"),W.prototype={_set:function(c){this.name=c.name,this.abbrs=c.abbrs,this.untils=c.untils,this.offsets=c.offsets,this.population=c.population},_index:function(c){var M,z=+c,A=this.untils;for(M=0;M<A.length;M++)if(z<A[M])return M},parse:function(c){var M,z,A,b,o=+c,p=this.offsets,n=this.untils,a=n.length-1;for(b=0;b<a;b++)if(M=p[b],z=p[b+1],A=p[b?b-1:b],M<z&&R.moveAmbiguousForward?M=z:A<M&&R.moveInvalidForward&&(M=A),o<n[b]-6e4*M)return p[b];return p[a]},abbr:function(c){return this.abbrs[this._index(c)]},offset:function(c){return C("zone.offset has been deprecated in favor of zone.utcOffset"),this.offsets[this._index(c)]},utcOffset:function(c){return this.offsets[this._index(c)]}},e.prototype.scoreOffsetAt=function(c){this.offsetScore+=Math.abs(this.zone.utcOffset(c.at)-c.offset),this.zone.abbr(c.at).replace(/[^A-Z]/g,"")!==c.abbr&&this.abbrScore++},R.version="0.5.17",R.dataVersion="",R._zones=p,R._links=n,R._names=L,R.add=l,R.link=t,R.load=s,R.zone=u,R.zoneExists=function c(M){return c.didShowError||(c.didShowError=!0,C("moment.tz.zoneExists('"+M+"') has been deprecated in favor of !moment.tz.zone('"+M+"')")),!!u(M)},R.guess=function(c){return M&&!c||(M=r()),M},R.names=function(){var c,M=[];for(c in L)L.hasOwnProperty(c)&&(p[c]||p[n[c]])&&L[c]&&M.push(L[c]);return M.sort()},R.Zone=W,R.unpack=i,R.unpackBase60=b,R.needsOffset=E,R.moveInvalidForward=!0,R.moveAmbiguousForward=!1;var S,m=o.fn;function D(c){return function(){return this._z?this._z.abbr(this):c.call(this)}}o.tz=R,o.defaultZone=null,o.updateOffset=function(c,M){var z,A=o.defaultZone;void 0===c._z&&(A&&E(c)&&!c._isUTC&&(c._d=o.utc(c._a)._d,c.utc().add(A.parse(c),"minutes")),c._z=A),c._z&&(z=c._z.utcOffset(c),Math.abs(z)<16&&(z/=60),void 0!==c.utcOffset?c.utcOffset(-z,M):c.zone(z,M))},m.tz=function(c,M){return c?(this._z=u(c),this._z?o.updateOffset(this,M):C("Moment Timezone has no data for "+c+". See http://momentjs.com/timezone/docs/#/data-loading/."),this):this._z?this._z.name:void 0},m.zoneName=D(m.zoneName),m.zoneAbbr=D(m.zoneAbbr),m.utc=(S=m.utc,function(){return this._z=null,S.apply(this,arguments)}),o.tz.setDefault=function(c){return(z<2||2===z&&A<9)&&C("Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js "+o.version+"."),o.defaultZone=c?u(c):null,o};var P=o.momentProperties;return"[object Array]"===Object.prototype.toString.call(P)?(P.push("_z"),P.push("_a")):P&&(P._z=null),s({version:"2018e",zones:["Africa/Abidjan|LMT GMT|g.8 0|01|-2ldXH.Q|48e5","Africa/Accra|LMT GMT +0020|.Q 0 -k|012121212121212121212121212121212121212121212121|-26BbX.8 6tzX.8 MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE|41e5","Africa/Nairobi|LMT EAT +0230 +0245|-2r.g -30 -2u -2J|01231|-1F3Cr.g 3Dzr.g okMu MFXJ|47e5","Africa/Algiers|PMT WET WEST CET CEST|-9.l 0 -10 -10 -20|0121212121212121343431312123431213|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 DA0 Imo0 rd0 De0 9Xz0 1fb0 1ap0 16K0 2yo0 mEp0 hwL0 jxA0 11A0 dDd0 17b0 11B0 1cN0 2Dy0 1cN0 1fB0 1cL0|26e5","Africa/Lagos|LMT WAT|-d.A -10|01|-22y0d.A|17e6","Africa/Bissau|LMT -01 GMT|12.k 10 0|012|-2ldX0 2xoo0|39e4","Africa/Maputo|LMT CAT|-2a.k -20|01|-2GJea.k|26e5","Africa/Cairo|EET EEST|-20 -30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1bIO0 vb0 1ip0 11z0 1iN0 1nz0 12p0 1pz0 10N0 1pz0 16p0 1jz0 s3d0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1WL0 rd0 1Rz0 wp0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1qL0 Xd0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1ny0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 WL0 1qN0 Rb0 1wp0 On0 1zd0 Lz0 1EN0 Fb0 c10 8n0 8Nd0 gL0 e10 mn0|15e6","Africa/Casablanca|LMT WET WEST CET|u.k 0 -10 -10|0121212121212121213121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2gMnt.E 130Lt.E rb0 Dd0 dVb0 b6p0 TX0 EoB0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4mn0 SyN0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 Rc0 11A0 e00 e00 U00 11A0 8o0 e00 11A0 11A0 5A0 e00 17c0 1fA0 1a00 1a00 1fA0 17c0 1io0 14o0 1lc0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1lc0 14o0 1fA0|32e5","Africa/Ceuta|WET WEST CET CEST|0 -10 -10 -20|010101010101010101010232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-25KN0 11z0 drd0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1y7o0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4VB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|85e3","Africa/El_Aaiun|LMT -01 WET WEST|Q.M 10 0 -10|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1rDz7.c 1GVA7.c 6L0 AL0 1Nd0 XX0 1Cp0 pz0 1cBB0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 Rc0 11A0 e00 e00 U00 11A0 8o0 e00 11A0 11A0 5A0 e00 17c0 1fA0 1a00 1a00 1fA0 17c0 1io0 14o0 1lc0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1lc0 14o0 1fA0|20e4","Africa/Johannesburg|SAST SAST SAST|-1u -20 -30|012121|-2GJdu 1Ajdu 1cL0 1cN0 1cL0|84e5","Africa/Juba|LMT CAT CAST EAT|-26.s -20 -30 -30|01212121212121212121212121212121213|-1yW26.s 1zK06.s 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0","Africa/Khartoum|LMT CAT CAST EAT|-2a.8 -20 -30 -30|012121212121212121212121212121212131|-1yW2a.8 1zK0a.8 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0 HjL0|51e5","Africa/Monrovia|MMT MMT GMT|H.8 I.u 0|012|-23Lzg.Q 28G01.m|11e5","Africa/Ndjamena|LMT WAT WAST|-10.c -10 -20|0121|-2le10.c 2J3c0.c Wn0|13e5","Africa/Sao_Tome|LMT GMT WAT|A.J 0 -10|012|-2le00 4i6N0","Africa/Tripoli|LMT CET CEST EET|-Q.I -10 -20 -20|012121213121212121212121213123123|-21JcQ.I 1hnBQ.I vx0 4iP0 xx0 4eN0 Bb0 7ip0 U0n0 A10 1db0 1cN0 1db0 1dd0 1db0 1eN0 1bb0 1e10 1cL0 1c10 1db0 1dd0 1db0 1cN0 1db0 1q10 fAn0 1ep0 1db0 AKq0 TA0 1o00|11e5","Africa/Tunis|PMT CET CEST|-9.l -10 -20|0121212121212121212121212121212121|-2nco9.l 18pa9.l 1qM0 DA0 3Tc0 11B0 1ze0 WM0 7z0 3d0 14L0 1cN0 1f90 1ar0 16J0 1gXB0 WM0 1rA0 11c0 nwo0 Ko0 1cM0 1cM0 1rA0 10M0 zuM0 10N0 1aN0 1qM0 WM0 1qM0 11A0 1o00|20e5","Africa/Windhoek|+0130 SAST SAST CAT WAT|-1u -20 -30 -20 -10|01213434343434343434343434343434343434343434343434343|-2GJdu 1Ajdu 1cL0 1SqL0 9Io0 16P0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|32e4","America/Adak|NST NWT NPT BST BDT AHST HST HDT|b0 a0 a0 b0 a0 a0 a0 90|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|326","America/Anchorage|AST AWT APT AHST AHDT YST AKST AKDT|a0 90 90 a0 90 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T00 8wX0 iA0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|30e4","America/Port_of_Spain|LMT AST|46.4 40|01|-2kNvR.U|43e3","America/Araguaina|LMT -03 -02|3c.M 30 20|0121212121212121212121212121212121212121212121212121|-2glwL.c HdKL.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 ny10 Lz0|14e4","America/Argentina/Buenos_Aires|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 A4p0 uL0 1qN0 WL0","America/Argentina/Catamarca|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 7B0 8zb0 uL0","America/Argentina/Cordoba|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0 1qN0 WL0","America/Argentina/Jujuy|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1ze0 TX0 1ld0 WK0 1wp0 TX0 A4p0 uL0","America/Argentina/La_Rioja|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0","America/Argentina/Mendoza|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232312121321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1u20 SL0 1vd0 Tb0 1wp0 TW0 ri10 Op0 7TX0 uL0","America/Argentina/Rio_Gallegos|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0","America/Argentina/Salta|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0","America/Argentina/San_Juan|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rld0 m10 8lb0 uL0","America/Argentina/San_Luis|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121212321212|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 XX0 1q20 SL0 AN0 vDb0 m10 8lb0 8L0 jd0 1qN0 WL0 1qN0","America/Argentina/Tucuman|CMT -04 -03 -02|4g.M 40 30 20|0121212121212121212121212121212121212121212323232313232123232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 4N0 8BX0 uL0 1qN0 WL0","America/Argentina/Ushuaia|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rkN0 8p0 8zb0 uL0","America/Curacao|LMT -0430 AST|4z.L 4u 40|012|-2kV7o.d 28KLS.d|15e4","America/Asuncion|AMT -04 -03|3O.E 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-1x589.k 1DKM9.k 3CL0 3Dd0 10L0 1pB0 10n0 1pB0 10n0 1pB0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1lB0 14n0 1dd0 1cL0 1fd0 WL0 1rd0 1aL0 1dB0 Xz0 1qp0 Xb0 1qN0 10L0 1rB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 WN0 1qL0 11B0 1nX0 1ip0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 TX0 1tB0 19X0 1a10 1fz0 1a10 1fz0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0|28e5","America/Atikokan|CST CDT CWT CPT EST|60 50 50 50 50|0101234|-25TQ0 1in0 Rnb0 3je0 8x30 iw0|28e2","America/Bahia_Banderas|LMT MST CST PST MDT CDT|71 70 60 80 60 50|0121212131414141414141414141414141414152525252525252525252525252525252525252525252525252525252|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nW0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|84e3","America/Bahia|LMT -03 -02|2y.4 30 20|01212121212121212121212121212121212121212121212121212121212121|-2glxp.U HdLp.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 l5B0 Rb0|27e5","America/Barbados|LMT BMT AST ADT|3W.t 3W.t 40 30|01232323232|-1Q0I1.v jsM0 1ODC1.v IL0 1ip0 17b0 1ip0 17b0 1ld0 13b0|28e4","America/Belem|LMT -03 -02|3d.U 30 20|012121212121212121212121212121|-2glwK.4 HdKK.4 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|20e5","America/Belize|LMT CST -0530 CDT|5Q.M 60 5u 50|01212121212121212121212121212121212121212121212121213131|-2kBu7.c fPA7.c Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1f0Mu qn0 lxB0 mn0|57e3","America/Blanc-Sablon|AST ADT AWT APT|40 30 30 30|010230|-25TS0 1in0 UGp0 8x50 iu0|11e2","America/Boa_Vista|LMT -04 -03|42.E 40 30|0121212121212121212121212121212121|-2glvV.k HdKV.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 smp0 WL0 1tB0 2L0|62e2","America/Bogota|BMT -05 -04|4U.g 50 40|0121|-2eb73.I 38yo3.I 2en0|90e5","America/Boise|PST PDT MST MWT MPT MDT|80 70 70 60 60 60|0101023425252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-261q0 1nX0 11B0 1nX0 8C10 JCL0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 Dd0 1Kn0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e4","America/Cambridge_Bay|-00 MST MWT MPT MDDT MDT CST CDT EST|0 70 60 60 50 60 60 50 50|0123141515151515151515151515151515151515151515678651515151515151515151515151515151515151515151515151515151515151515151515151|-21Jc0 RO90 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11A0 1nX0 2K0 WQ0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e2","America/Campo_Grande|LMT -04 -03|3C.s 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2glwl.w HdLl.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0|77e4","America/Cancun|LMT CST EST EDT CDT|5L.4 60 50 40 50|0123232341414141414141414141414141414141412|-1UQG0 2q2o0 yLB0 1lb0 14p0 1lb0 14p0 Lz0 xB0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4","America/Caracas|CMT -0430 -04|4r.E 4u 40|01212|-2kV7w.k 28KM2.k 1IwOu kqo0|29e5","America/Cayenne|LMT -04 -03|3t.k 40 30|012|-2mrwu.E 2gWou.E|58e3","America/Panama|CMT EST|5j.A 50|01|-2uduE.o|15e5","America/Chicago|CST CDT EST CWT CPT|60 50 50 50 50|01010101010101010101010101010101010102010101010103401010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 1wp0 TX0 WN0 1qL0 1cN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 11B0 1Hz0 14p0 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|92e5","America/Chihuahua|LMT MST CST CDT MDT|74.k 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|81e4","America/Costa_Rica|SJMT CST CDT|5A.d 60 50|0121212121|-1Xd6n.L 2lu0n.L Db0 1Kp0 Db0 pRB0 15b0 1kp0 mL0|12e5","America/Creston|MST PST|70 80|010|-29DR0 43B0|53e2","America/Cuiaba|LMT -04 -03|3I.k 40 30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2glwf.E HdLf.E 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 4a10 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0|54e4","America/Danmarkshavn|LMT -03 -02 GMT|1e.E 30 20 0|01212121212121212121212121212121213|-2a5WJ.k 2z5fJ.k 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 DC0|8","America/Dawson_Creek|PST PDT PWT PPT MST|80 70 70 70 70|0102301010101010101010101010101010101010101010101010101014|-25TO0 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 ML0|12e3","America/Dawson|YST YDT YWT YPT YDDT PST PDT|90 80 80 80 70 80 70|0101023040565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-25TN0 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 jrA0 fNd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|13e2","America/Denver|MST MDT MWT MPT|70 60 60 60|01010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 11B0 1qL0 WN0 mn0 Ord0 8x20 ix0 LCN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e5","America/Detroit|LMT CST EST EWT EPT EDT|5w.b 60 50 40 40 40|012342525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2Cgir.N peqr.N 156L0 8x40 iv0 6fd0 11z0 XQp0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e5","America/Edmonton|LMT MST MDT MWT MPT|7x.Q 70 60 60 60|01212121212121341212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2yd4q.8 shdq.8 1in0 17d0 hz0 2dB0 1fz0 1a10 11z0 1qN0 WL0 1qN0 11z0 IGN0 8x20 ix0 3NB0 11z0 LFB0 1cL0 3Cp0 1cL0 66N0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|10e5","America/Eirunepe|LMT -05 -04|4D.s 50 40|0121212121212121212121212121212121|-2glvk.w HdLk.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0 yTd0 d5X0|31e3","America/El_Salvador|LMT CST CDT|5U.M 60 50|012121|-1XiG3.c 2Fvc3.c WL0 1qN0 WL0|11e5","America/Tijuana|LMT MST PST PDT PWT PPT|7M.4 70 80 70 70 70|012123245232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQE0 4PX0 8mM0 8lc0 SN0 1cL0 pHB0 83r0 zI0 5O10 1Rz0 cOO0 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 BUp0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|20e5","America/Fort_Nelson|PST PDT PWT PPT MST|80 70 70 70 70|01023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010104|-25TO0 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0|39e2","America/Fort_Wayne|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|010101023010101010101010101040454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 QI10 Db0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 5Tz0 1o10 qLb0 1cL0 1cN0 1cL0 1qhd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Fortaleza|LMT -03 -02|2y 30 20|0121212121212121212121212121212121212121|-2glxq HdLq 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 5z0 2mN0 On0|34e5","America/Glace_Bay|LMT AST ADT AWT APT|3X.M 40 30 30 30|012134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsI0.c CwO0.c 1in0 UGp0 8x50 iu0 iq10 11z0 Jg10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3","America/Godthab|LMT -03 -02|3q.U 30 20|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5Ux.4 2z5dx.4 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e3","America/Goose_Bay|NST NDT NST NDT NWT NPT AST ADT ADDT|3u.Q 2u.Q 3u 2u 2u 2u 40 30 20|010232323232323245232323232323232323232323232323232323232326767676767676767676767676767676767676767676768676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-25TSt.8 1in0 DXb0 2HbX.8 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 S10 g0u 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|76e2","America/Grand_Turk|KMT EST EDT AST|57.a 50 40 40|01212121212121212121212121212121212121212121212121212121212121212121212121232121212121212121212121212121212121212121|-2l1uQ.O 2HHBQ.O 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 5Ip0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e2","America/Guatemala|LMT CST CDT|62.4 60 50|0121212121|-24KhV.U 2efXV.U An0 mtd0 Nz0 ifB0 17b0 zDB0 11z0|13e5","America/Guayaquil|QMT -05 -04|5e 50 40|0121|-1yVSK 2uILK rz0|27e5","America/Guyana|LMT -0345 -03 -04|3Q.E 3J 30 40|0123|-2dvU7.k 2r6LQ.k Bxbf|80e4","America/Halifax|LMT AST ADT AWT APT|4e.o 40 30 30 30|0121212121212121212121212121212121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsHJ.A xzzJ.A 1db0 3I30 1in0 3HX0 IL0 1E10 ML0 1yN0 Pb0 1Bd0 Mn0 1Bd0 Rz0 1w10 Xb0 1w10 LX0 1w10 Xb0 1w10 Lz0 1C10 Jz0 1E10 OL0 1yN0 Un0 1qp0 Xb0 1qp0 11X0 1w10 Lz0 1HB0 LX0 1C10 FX0 1w10 Xb0 1qp0 Xb0 1BB0 LX0 1td0 Xb0 1qp0 Xb0 Rf0 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 6i10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|39e4","America/Havana|HMT CST CDT|5t.A 50 40|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Meuu.o 72zu.o ML0 sld0 An0 1Nd0 Db0 1Nd0 An0 6Ep0 An0 1Nd0 An0 JDd0 Mn0 1Ap0 On0 1fd0 11X0 1qN0 WL0 1wp0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 14n0 1ld0 14L0 1kN0 15b0 1kp0 1cL0 1cN0 1fz0 1a10 1fz0 1fB0 11z0 14p0 1nX0 11B0 1nX0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 1a10 1in0 1a10 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 17c0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 11A0 6i00 Rc0 1wo0 U00 1tA0 Rc0 1wo0 U00 1wo0 U00 1zc0 U00 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0|21e5","America/Hermosillo|LMT MST CST PST MDT|7n.Q 70 60 80 60|0121212131414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0|64e4","America/Indiana/Knox|CST CDT CWT CPT EST|60 50 50 50 50|0101023010101010101010101010101010101040101010101010101010101010101010101010101010101010141010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 3Cn0 8wp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 z8o0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Indiana/Marengo|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101023010101010101010104545454545414545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 dyN0 11z0 6fd0 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1e6p0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Indiana/Petersburg|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010104010101010101010101010141014545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 njX0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 3Fb0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 19co0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Indiana/Tell_City|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010454541010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 g0p0 11z0 1o10 11z0 1qL0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 caL0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Indiana/Vevay|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|010102304545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 kPB0 Awn0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1lnd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Indiana/Vincennes|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010454541014545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 g0p0 11z0 1o10 11z0 1qL0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 caL0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Indiana/Winamac|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010101010454541054545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1za0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Inuvik|-00 PST PDDT MST MDT|0 80 60 70 60|0121343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-FnA0 tWU0 1fA0 wPe0 2pz0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|35e2","America/Iqaluit|-00 EWT EPT EST EDDT EDT CST CDT|0 40 40 50 30 40 60 50|01234353535353535353535353535353535353535353567353535353535353535353535353535353535353535353535353535353535353535353535353|-16K00 7nX0 iv0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|67e2","America/Jamaica|KMT EST EDT|57.a 50 40|0121212121212121212121|-2l1uQ.O 2uM1Q.O 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0|94e4","America/Juneau|PST PWT PPT PDT YDT YST AKST AKDT|80 70 70 70 80 90 90 80|01203030303030303030303030403030356767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cM0 1cM0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|33e3","America/Kentucky/Louisville|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101010102301010101010101010101010101454545454545414545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 3Fd0 Nb0 LPd0 11z0 RB0 8x30 iw0 Bb0 10N0 2bB0 8in0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 xz0 gso0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Kentucky/Monticello|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101023010101010101010101010101010101010101010101010101010101010101010101454545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 SWp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/La_Paz|CMT BST -04|4w.A 3w.A 40|012|-1x37r.o 13b0|19e5","America/Lima|LMT -05 -04|58.A 50 40|0121212121212121|-2tyGP.o 1bDzP.o zX0 1aN0 1cL0 1cN0 1cL0 1PrB0 zX0 1O10 zX0 6Gp0 zX0 98p0 zX0|11e6","America/Los_Angeles|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 5Wp1 1VaX 3dA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e6","America/Maceio|LMT -03 -02|2m.Q 30 20|012121212121212121212121212121212121212121|-2glxB.8 HdLB.8 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 8Q10 WL0 1tB0 5z0 2mN0 On0|93e4","America/Managua|MMT CST EST CDT|5J.c 60 50 50|0121313121213131|-1quie.M 1yAMe.M 4mn0 9Up0 Dz0 1K10 Dz0 s3F0 1KH0 DB0 9In0 k8p0 19X0 1o30 11y0|22e5","America/Manaus|LMT -04 -03|40.4 40 30|01212121212121212121212121212121|-2glvX.U HdKX.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0|19e5","America/Martinique|FFMT AST ADT|44.k 40 30|0121|-2mPTT.E 2LPbT.E 19X0|39e4","America/Matamoros|LMT CST CDT|6E 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|45e4","America/Mazatlan|LMT MST CST PST MDT|75.E 70 60 80 60|0121212131414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|44e4","America/Menominee|CST CDT CWT CPT EST|60 50 50 50 50|01010230101041010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 LCN0 1fz0 6410 9Jb0 1cM0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|85e2","America/Merida|LMT CST EST CDT|5W.s 60 50 50|0121313131313131313131313131313131313131313131313131313131313131313131313131313131313131|-1UQG0 2q2o0 2hz0 wu30 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|11e5","America/Metlakatla|PST PWT PPT PDT AKST AKDT|80 70 70 70 90 80|0120303030303030303030303030303030454545454545454545454545454545454545454545454|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1hU10 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2","America/Mexico_City|LMT MST CST CDT CWT|6A.A 70 60 50 50|012121232324232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 gEn0 TX0 3xd0 Jb0 6zB0 SL0 e5d0 17b0 1Pff0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|20e6","America/Miquelon|LMT AST -03 -02|3I.E 40 30 20|012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2mKkf.k 2LTAf.k gQ10 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|61e2","America/Moncton|EST AST ADT AWT APT|50 40 30 30 30|012121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsH0 CwN0 1in0 zAo0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1K10 Lz0 1zB0 NX0 1u10 Wn0 S20 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14n1 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 ReX 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|64e3","America/Monterrey|LMT CST CDT|6F.g 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|41e5","America/Montevideo|LMT MMT -04 -03 -0330 -0230 -02 -0130|3I.P 3I.P 40 30 3u 2u 20 1u|012343434343434343434343435353636353636375363636363636363636363636363636363636363636363|-2tRUf.9 sVc0 8jcf.9 1db0 1dcu 1cLu 1dcu 1cLu ircu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu WLu 1fAu 1cLu 1o0u 11zu NAu 3jXu zXu Dq0u 19Xu pcu jz0 cm10 19X0 6tB0 1fbu 3o0u jX0 4vB0 xz0 3Cp0 mmu 1a10 IMu Db0 4c10 uL0 1Nd0 An0 1SN0 uL0 mp0 28L0 iPB0 un0 1SN0 xz0 1zd0 Lz0 1zd0 Rb0 1zd0 On0 1wp0 Rb0 s8p0 1fB0 1ip0 11z0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 11z0|17e5","America/Toronto|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101012301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TR0 1in0 11Wu 1nzu 1fD0 WJ0 1wr0 Nb0 1Ap0 On0 1zd0 On0 1wp0 TX0 1tB0 TX0 1tB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 4kM0 8x40 iv0 1o10 11z0 1nX0 11z0 1o10 11z0 1o10 1qL0 11D0 1nX0 11B0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e5","America/Nassau|LMT EST EDT|59.u 50 40|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2kNuO.u 26XdO.u 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|24e4","America/New_York|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 11B0 1qL0 1a10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x40 iv0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e6","America/Nipigon|EST EDT EWT EPT|50 40 40 40|010123010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TR0 1in0 Rnb0 3je0 8x40 iv0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|16e2","America/Nome|NST NWT NPT BST BDT YST AKST AKDT|b0 a0 a0 b0 a0 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cl0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|38e2","America/Noronha|LMT -02 -01|29.E 20 10|0121212121212121212121212121212121212121|-2glxO.k HdKO.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|30e2","America/North_Dakota/Beulah|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101014545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/North_Dakota/Center|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101014545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/North_Dakota/New_Salem|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101454545454545454545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","America/Ojinaga|LMT MST CST CDT MDT|6V.E 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e3","America/Pangnirtung|-00 AST AWT APT ADDT ADT EDT EST CST CDT|0 40 30 30 20 30 40 50 60 50|012314151515151515151515151515151515167676767689767676767676767676767676767676767676767676767676767676767676767676767676767|-1XiM0 PnG0 8x50 iu0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1o00 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2","America/Paramaribo|LMT PMT PMT -0330 -03|3E.E 3E.Q 3E.A 3u 30|01234|-2nDUj.k Wqo0.c qanX.I 1yVXN.o|24e4","America/Phoenix|MST MDT MWT|70 60 60|01010202010|-261r0 1nX0 11B0 1nX0 SgN0 4Al1 Ap0 1db0 SWqX 1cL0|42e5","America/Port-au-Prince|PPMT EST EDT|4N 50 40|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-28RHb 2FnMb 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14q0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 i6n0 1nX0 11B0 1nX0 d430 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 3iN0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5","America/Rio_Branco|LMT -05 -04|4v.c 50 40|01212121212121212121212121212121|-2glvs.M HdLs.M 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0 d5X0|31e4","America/Porto_Velho|LMT -04 -03|4f.A 40 30|012121212121212121212121212121|-2glvI.o HdKI.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|37e4","America/Puerto_Rico|AST AWT APT|40 30 30|0120|-17lU0 7XT0 iu0|24e5","America/Punta_Arenas|SMT -05 -04 -03|4G.K 50 40 30|0102021212121212121232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-2q2jh.e fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 blz0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0","America/Rainy_River|CST CDT CWT CPT|60 50 50 50|010123010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TQ0 1in0 Rnb0 3je0 8x30 iw0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|842","America/Rankin_Inlet|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313131313131313131313131313131313131313131313131313131313131313131|-vDc0 keu0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e2","America/Recife|LMT -03 -02|2j.A 30 20|0121212121212121212121212121212121212121|-2glxE.o HdLE.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|33e5","America/Regina|LMT MST MDT MWT MPT CST|6W.A 70 60 60 60 60|012121212121212121212121341212121212121212121212121215|-2AD51.o uHe1.o 1in0 s2L0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 66N0 1cL0 1cN0 19X0 1fB0 1cL0 1fB0 1cL0 1cN0 1cL0 M30 8x20 ix0 1ip0 1cL0 1ip0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 3NB0 1cL0 1cN0|19e4","America/Resolute|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313431313131313131313131313131313131313131313131313131313131313131|-SnA0 GWS0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|229","America/Santarem|LMT -04 -03|3C.M 40 30|0121212121212121212121212121212|-2glwl.c HdLl.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0|21e4","America/Santiago|SMT -05 -04 -03|4G.K 50 40 30|010202121212121212321232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-2q2jh.e fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 9Bz0 jb0 1oN0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0|62e5","America/Santo_Domingo|SDMT EST EDT -0430 AST|4E 50 40 4u 40|01213131313131414|-1ttjk 1lJMk Mn0 6sp0 Lbu 1Cou yLu 1RAu wLu 1QMu xzu 1Q0u xXu 1PAu 13jB0 e00|29e5","America/Sao_Paulo|LMT -03 -02|36.s 30 20|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2glwR.w HdKR.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 pTd0 PX0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0|20e6","America/Scoresbysund|LMT -02 -01 +00|1r.Q 20 10 0|0121323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2a5Ww.8 2z5ew.8 1a00 1cK0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|452","America/Sitka|PST PWT PPT PDT YST AKST AKDT|80 70 70 70 90 90 80|01203030303030303030303030303030345656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|90e2","America/St_Johns|NST NDT NST NDT NWT NPT NDDT|3u.Q 2u.Q 3u 2u 2u 2u 1u|01010101010101010101010101010101010102323232323232324523232323232323232323232323232323232323232323232323232323232323232323232323232323232326232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-28oit.8 14L0 1nB0 1in0 1gm0 Dz0 1JB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1fB0 19X0 1fB0 19X0 10O0 eKX.8 19X0 1iq0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4","America/Swift_Current|LMT MST MDT MWT MPT CST|7b.k 70 60 60 60 60|012134121212121212121215|-2AD4M.E uHdM.E 1in0 UGp0 8x20 ix0 1o10 17b0 1ip0 11z0 1o10 11z0 1o10 11z0 isN0 1cL0 3Cp0 1cL0 1cN0 11z0 1qN0 WL0 pMp0|16e3","America/Tegucigalpa|LMT CST CDT|5M.Q 60 50|01212121|-1WGGb.8 2ETcb.8 WL0 1qN0 WL0 GRd0 AL0|11e5","America/Thule|LMT AST ADT|4z.8 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5To.Q 31NBo.Q 1cL0 1cN0 1cL0 1fB0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|656","America/Thunder_Bay|CST EST EWT EPT EDT|60 50 40 40 40|0123141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-2q5S0 1iaN0 8x40 iv0 XNB0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4","America/Vancouver|PST PDT PWT PPT|80 70 70 70|0102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TO0 1in0 UGp0 8x10 iy0 1o10 17b0 1ip0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5","America/Whitehorse|YST YDT YWT YPT YDDT PST PDT|90 80 80 80 70 80 70|0101023040565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-25TN0 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 3NA0 vrd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e3","America/Winnipeg|CST CDT CWT CPT|60 50 50 50|010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aIi0 WL0 3ND0 1in0 Jap0 Rb0 aCN0 8x30 iw0 1tB0 11z0 1ip0 11z0 1o10 11z0 1o10 11z0 1rd0 10L0 1op0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 1cL0 1cN0 11z0 6i10 WL0 6i10 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|66e4","America/Yakutat|YST YWT YPT YDT AKST AKDT|90 80 80 80 90 80|01203030303030303030303030303030304545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-17T10 8x00 iz0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cn0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|642","America/Yellowknife|-00 MST MWT MPT MDDT MDT|0 70 60 60 50 60|012314151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151|-1pdA0 hix0 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3","Antarctica/Casey|-00 +08 +11|0 -80 -b0|01212121|-2q00 1DjS0 T90 40P0 KL0 blz0 3m10|10","Antarctica/Davis|-00 +07 +05|0 -70 -50|01012121|-vyo0 iXt0 alj0 1D7v0 VB0 3Wn0 KN0|70","Antarctica/DumontDUrville|-00 +10|0 -a0|0101|-U0o0 cfq0 bFm0|80","Antarctica/Macquarie|AEST AEDT -00 +11|-a0 -b0 0 -b0|0102010101010101010101010101010101010101010101010101010101010101010101010101010101010101013|-29E80 19X0 4SL0 1ayy0 Lvs0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0|1","Antarctica/Mawson|-00 +06 +05|0 -60 -50|012|-CEo0 2fyk0|60","Pacific/Auckland|NZMT NZST NZST NZDT|-bu -cu -c0 -d0|01020202020202020202020202023232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1GCVu Lz0 1tB0 11zu 1o0u 11zu 1o0u 11zu 1o0u 14nu 1lcu 14nu 1lcu 1lbu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1qLu WMu 1qLu 11Au 1n1bu IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|14e5","Antarctica/Palmer|-00 -03 -04 -02|0 30 40 20|0121212121213121212121212121212121212121212121212121212121212121212121212121212121|-cao0 nD0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 jsN0 14N0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|40","Antarctica/Rothera|-00 -03|0 30|01|gOo0|130","Antarctica/Syowa|-00 +03|0 -30|01|-vs00|20","Antarctica/Troll|-00 +00 +02|0 0 -20|01212121212121212121212121212121212121212121212121212121212121212121|1puo0 hd0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|40","Antarctica/Vostok|-00 +06|0 -60|01|-tjA0|25","Europe/Oslo|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2awM0 Qm0 W6o0 5pf0 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 wJc0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1qM0 WM0 zpc0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|62e4","Asia/Riyadh|LMT +03|-36.Q -30|01|-TvD6.Q|57e5","Asia/Almaty|LMT +05 +06 +07|-57.M -50 -60 -70|012323232323232323232321232323232323232323232323232|-1Pc57.M eUo7.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|15e5","Asia/Amman|LMT EET EEST|-2n.I -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1yW2n.I 1HiMn.I KL0 1oN0 11b0 1oN0 11b0 1pd0 1dz0 1cp0 11b0 1op0 11b0 fO10 1db0 1e10 1cL0 1cN0 1cL0 1cN0 1fz0 1pd0 10n0 1ld0 14n0 1hB0 15b0 1ip0 19X0 1cN0 1cL0 1cN0 17b0 1ld0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1So0 y00 1fc0 1dc0 1co0 1dc0 1cM0 1cM0 1cM0 1o00 11A0 1lc0 17c0 1cM0 1cM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 4bX0 Dd0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|25e5","Asia/Anadyr|LMT +12 +13 +14 +11|-bN.U -c0 -d0 -e0 -b0|01232121212121212121214121212121212121212121212121212121212141|-1PcbN.U eUnN.U 23CL0 1db0 2q10 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|13e3","Asia/Aqtau|LMT +04 +05 +06|-3l.4 -40 -50 -60|012323232323232323232123232312121212121212121212|-1Pc3l.4 eUnl.4 24PX0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|15e4","Asia/Aqtobe|LMT +04 +05 +06|-3M.E -40 -50 -60|0123232323232323232321232323232323232323232323232|-1Pc3M.E eUnM.E 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|27e4","Asia/Ashgabat|LMT +04 +05 +06|-3R.w -40 -50 -60|0123232323232323232323212|-1Pc3R.w eUnR.w 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0|41e4","Asia/Atyrau|LMT +03 +05 +06 +04|-3r.I -30 -50 -60 -40|01232323232323232323242323232323232324242424242|-1Pc3r.I eUor.I 24PW0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 2sp0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0","Asia/Baghdad|BMT +03 +04|-2V.A -30 -40|012121212121212121212121212121212121212121212121212121|-26BeV.A 2ACnV.A 11b0 1cp0 1dz0 1dd0 1db0 1cN0 1cp0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1de0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0|66e5","Asia/Qatar|LMT +04 +03|-3q.8 -40 -30|012|-21Jfq.8 27BXq.8|96e4","Asia/Baku|LMT +03 +04 +05|-3j.o -30 -40 -50|01232323232323232323232123232323232323232323232323232323232323232|-1Pc3j.o 1jUoj.o WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 9Je0 1o00 11z0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5","Asia/Bangkok|BMT +07|-6G.4 -70|01|-218SG.4|15e6","Asia/Barnaul|LMT +06 +07 +08|-5z -60 -70 -80|0123232323232323232323212323232321212121212121212121212121212121212|-21S5z pCnz 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 p90 LE0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0","Asia/Beirut|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-21aq0 1on0 1410 1db0 19B0 1in0 1ip0 WL0 1lQp0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 q6N0 En0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1op0 11b0 dA10 17b0 1iN0 17b0 1iN0 17b0 1iN0 17b0 1vB0 SL0 1mp0 13z0 1iN0 17b0 1iN0 17b0 1jd0 12n0 1a10 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0|22e5","Asia/Bishkek|LMT +05 +06 +07|-4W.o -50 -60 -70|012323232323232323232321212121212121212121212121212|-1Pc4W.o eUnW.o 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2e00 1tX0 17b0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1cPu 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0|87e4","Asia/Brunei|LMT +0730 +08|-7D.E -7u -80|012|-1KITD.E gDc9.E|42e4","Asia/Kolkata|MMT IST +0630|-5l.a -5u -6u|012121|-2zOtl.a 1r2LP.a 1un0 HB0 7zX0|15e6","Asia/Chita|LMT +08 +09 +10|-7x.Q -80 -90 -a0|012323232323232323232321232323232323232323232323232323232323232312|-21Q7x.Q pAnx.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3re0|33e4","Asia/Choibalsan|LMT +07 +08 +10 +09|-7C -70 -80 -a0 -90|0123434343434343434343434343434343434343434343424242|-2APHC 2UkoC cKn0 1da0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 3Db0 h1f0 1cJ0 1cP0 1cJ0|38e3","Asia/Shanghai|CST CDT|-80 -90|01010101010101010|-1c1I0 LX0 16p0 1jz0 1Myp0 Rb0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0|23e6","Asia/Colombo|MMT +0530 +06 +0630|-5j.w -5u -60 -6u|01231321|-2zOtj.w 1rFbN.w 1zzu 7Apu 23dz0 11zu n3cu|22e5","Asia/Dhaka|HMT +0630 +0530 +06 +07|-5R.k -6u -5u -60 -70|0121343|-18LFR.k 1unn.k HB0 m6n0 2kxbu 1i00|16e6","Asia/Damascus|LMT EET EEST|-2p.c -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-21Jep.c Hep.c 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1xRB0 11X0 1oN0 10L0 1pB0 11b0 1oN0 10L0 1mp0 13X0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 Nb0 1AN0 Nb0 bcp0 19X0 1gp0 19X0 3ld0 1xX0 Vd0 1Bz0 Sp0 1vX0 10p0 1dz0 1cN0 1cL0 1db0 1db0 1g10 1an0 1ap0 1db0 1fd0 1db0 1cN0 1db0 1dd0 1db0 1cp0 1dz0 1c10 1dX0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 19z0 1fB0 1qL0 11B0 1on0 Wp0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0|26e5","Asia/Dili|LMT +08 +09|-8m.k -80 -90|01212|-2le8m.k 1dnXm.k 1nfA0 Xld0|19e4","Asia/Dubai|LMT +04|-3F.c -40|01|-21JfF.c|39e5","Asia/Dushanbe|LMT +05 +06 +07|-4z.c -50 -60 -70|012323232323232323232321|-1Pc4z.c eUnz.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2hB0|76e4","Asia/Famagusta|LMT EET EEST +03|-2f.M -20 -30 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212312121212121212121212121212121212121212121|-1Vc2f.M 2a3cf.M 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00","Asia/Gaza|EET EEST IST IDT|-20 -30 -20 -30|010101010101010101010101010101012323232323232323232323232320101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1c2q0 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 pBd0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 npB0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 11z0 1o10 14o0 1lA1 SKX 1xd1 MKX 1AN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nz0 1220 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0|18e5","Asia/Hebron|EET EEST IST IDT|-20 -30 -20 -30|01010101010101010101010101010101232323232323232323232323232010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1c2q0 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 pBd0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 npB0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 12L0 1mN0 14o0 1lc0 Tb0 1xd1 MKX bB0 cn0 1cN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nz0 1220 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0|25e4","Asia/Ho_Chi_Minh|LMT PLMT +07 +08 +09|-76.E -76.u -70 -80 -90|0123423232|-2yC76.E bK00.a 1h7b6.u 5lz0 18o0 3Oq0 k5b0 aW00 BAM0|90e5","Asia/Hong_Kong|LMT HKT HKST JST|-7A.G -80 -90 -90|0121312121212121212121212121212121212121212121212121212121212121212121|-2CFHA.G 1sEP6.G 1cL0 ylu 93X0 1qQu 1tX0 Rd0 1In0 NB0 1cL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1kL0 14N0 1nX0 U10 1tz0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 Rd0 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 17d0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|73e5","Asia/Hovd|LMT +06 +07 +08|-66.A -60 -70 -80|012323232323232323232323232323232323232323232323232|-2APG6.A 2Uko6.A cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|81e3","Asia/Irkutsk|IMT +07 +08 +09|-6V.5 -70 -80 -90|01232323232323232323232123232323232323232323232323232323232323232|-21zGV.5 pjXV.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4","Europe/Istanbul|IMT EET EEST +04 +03|-1U.U -20 -30 -40 -30|012121212121212121212121212121212121212121212121212121234343434342121212121212121212121212121212121212121212121212121212121212124|-2ogNU.U dzzU.U 11b0 8tB0 1on0 1410 1db0 19B0 1in0 3Rd0 Un0 1oN0 11b0 zSp0 CL0 mN0 1Vz0 1gN0 1pz0 5Rd0 1fz0 1yp0 ML0 1kp0 17b0 1ip0 17b0 1fB0 19X0 1jB0 18L0 1ip0 17z0 qdd0 xX0 3S10 Tz0 dA10 11z0 1o10 11z0 1qN0 11z0 1ze0 11B0 WM0 1qO0 WI0 1nX0 1rB0 10L0 11B0 1in0 17d0 1in0 2pX0 19E0 1fU0 16Q0 1iI0 16Q0 1iI0 1Vd0 pb0 3Kp0 14o0 1de0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1a00 1fA0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WO0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 Xc0 1qo0 WM0 1qM0 11A0 1o00 1200 1nA0 11A0 1tA0 U00 15w0|13e6","Asia/Jakarta|BMT +0720 +0730 +09 +08 WIB|-77.c -7k -7u -90 -80 -70|01232425|-1Q0Tk luM0 mPzO 8vWu 6kpu 4PXu xhcu|31e6","Asia/Jayapura|LMT +09 +0930 WIT|-9m.M -90 -9u -90|0123|-1uu9m.M sMMm.M L4nu|26e4","Asia/Jerusalem|JMT IST IDT IDDT|-2k.E -20 -30 -40|01212121212132121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-26Bek.E SyMk.E 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 3LB0 Em0 or0 1cn0 1dB0 16n0 10O0 1ja0 1tC0 14o0 1cM0 1a00 11A0 1Na0 An0 1MP0 AJ0 1Kp0 LC0 1oo0 Wl0 EQN0 Db0 1fB0 Rb0 npB0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 1hB0 1dX0 1ep0 1aL0 1eN0 17X0 1nf0 11z0 1tB0 19W0 1e10 17b0 1ep0 1gL0 18N0 1fz0 1eN0 17b0 1gq0 1gn0 19d0 1dz0 1c10 17X0 1hB0 1gn0 19d0 1dz0 1c10 17X0 1kp0 1dz0 1c10 1aL0 1eN0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0|81e4","Asia/Kabul|+04 +0430|-40 -4u|01|-10Qs0|46e5","Asia/Kamchatka|LMT +11 +12 +13|-ay.A -b0 -c0 -d0|012323232323232323232321232323232323232323232323232323232323212|-1SLKy.A ivXy.A 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|18e4","Asia/Karachi|LMT +0530 +0630 +05 PKT PKST|-4s.c -5u -6u -50 -50 -60|012134545454|-2xoss.c 1qOKW.c 7zX0 eup0 LqMu 1fy00 1cL0 dK10 11b0 1610 1jX0|24e6","Asia/Urumqi|LMT +06|-5O.k -60|01|-1GgtO.k|32e5","Asia/Kathmandu|LMT +0530 +0545|-5F.g -5u -5J|012|-21JhF.g 2EGMb.g|12e5","Asia/Khandyga|LMT +08 +09 +10 +11|-92.d -80 -90 -a0 -b0|0123232323232323232323212323232323232323232323232343434343434343432|-21Q92.d pAp2.d 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 qK0 yN0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|66e2","Asia/Krasnoyarsk|LMT +06 +07 +08|-6b.q -60 -70 -80|01232323232323232323232123232323232323232323232323232323232323232|-21Hib.q prAb.q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|10e5","Asia/Kuala_Lumpur|SMT +07 +0720 +0730 +09 +08|-6T.p -70 -7k -7u -90 -80|0123435|-2Bg6T.p 17anT.p l5XE 17bO 8Fyu 1so1u|71e5","Asia/Kuching|LMT +0730 +08 +0820 +09|-7l.k -7u -80 -8k -90|0123232323232323242|-1KITl.k gDbP.k 6ynu AnE 1O0k AnE 1NAk AnE 1NAk AnE 1NAk AnE 1O0k AnE 1NAk AnE pAk 8Fz0|13e4","Asia/Macau|LMT CST CDT|-7y.k -80 -90|012121212121212121212121212121212121212121|-2le80 1XO3u 1wn0 Rd0 1wn0 R9u 1wqu U10 1tz0 TVu 1tz0 17gu 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cJu 1cL0 1cN0 1fz0 1cN0 1cOu 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cJu 1cL0 1cN0 1fz0 1cN0 1cL0|57e4","Asia/Magadan|LMT +10 +11 +12|-a3.c -a0 -b0 -c0|012323232323232323232321232323232323232323232323232323232323232312|-1Pca3.c eUo3.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Cq0|95e3","Asia/Makassar|LMT MMT +08 +09 WITA|-7V.A -7V.A -80 -90 -80|01234|-21JjV.A vfc0 myLV.A 8ML0|15e5","Asia/Manila|+08 +09|-80 -90|010101010|-1kJI0 AL0 cK10 65X0 mXB0 vX0 VK10 1db0|24e6","Asia/Nicosia|LMT EET EEST|-2d.s -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Vc2d.s 2a3cd.s 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|32e4","Asia/Novokuznetsk|LMT +06 +07 +08|-5M.M -60 -70 -80|012323232323232323232321232323232323232323232323232323232323212|-1PctM.M eULM.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|55e4","Asia/Novosibirsk|LMT +06 +07 +08|-5v.E -60 -70 -80|0123232323232323232323212323212121212121212121212121212121212121212|-21Qnv.E pAFv.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 ml0 Os0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 4eN0|15e5","Asia/Omsk|LMT +05 +06 +07|-4R.u -50 -60 -70|01232323232323232323232123232323232323232323232323232323232323232|-224sR.u pMLR.u 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|12e5","Asia/Oral|LMT +03 +05 +06 +04|-3p.o -30 -50 -60 -40|01232323232323232424242424242424242424242424242|-1Pc3p.o eUop.o 23CK0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 1cM0 IM0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|27e4","Asia/Pontianak|LMT PMT +0730 +09 +08 WITA WIB|-7h.k -7h.k -7u -90 -80 -80 -70|012324256|-2ua7h.k XE00 munL.k 8Rau 6kpu 4PXu xhcu Wqnu|23e4","Asia/Pyongyang|LMT KST JST KST|-8n -8u -90 -90|012313|-2um8n 97XR 1lTzu 2Onc0 6BAu|29e5","Asia/Qyzylorda|LMT +04 +05 +06|-4l.Q -40 -50 -60|0123232323232323232323232323232323232323232323|-1Pc4l.Q eUol.Q 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 3ao0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|73e4","Asia/Rangoon|RMT +0630 +09|-6o.L -6u -90|0121|-21Jio.L SmnS.L 7j9u|48e5","Asia/Sakhalin|LMT +09 +11 +12 +10|-9u.M -90 -b0 -c0 -a0|01232323232323232323232423232323232424242424242424242424242424242|-2AGVu.M 1BoMu.M 1qFa0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 2pB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|58e4","Asia/Samarkand|LMT +04 +05 +06|-4r.R -40 -50 -60|01232323232323232323232|-1Pc4r.R eUor.R 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|36e4","Asia/Seoul|LMT KST JST KST KDT KDT|-8r.Q -8u -90 -90 -9u -a0|0123141414141414135353|-2um8r.Q 97XV.Q 1m1zu kKo0 2I0u OL0 1FB0 Rb0 1qN0 TX0 1tB0 TX0 1tB0 TX0 1tB0 TX0 2ap0 12FBu 11A0 1o00 11A0|23e6","Asia/Srednekolymsk|LMT +10 +11 +12|-ae.Q -a0 -b0 -c0|01232323232323232323232123232323232323232323232323232323232323232|-1Pcae.Q eUoe.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|35e2","Asia/Taipei|CST JST CDT|-80 -90 -90|01020202020202020202020202020202020202020|-1iw80 joM0 1yo0 Tz0 1ip0 1jX0 1cN0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 10N0 1BX0 10p0 1pz0 10p0 1pz0 10p0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1BB0 ML0 1Bd0 ML0 uq10 1db0 1cN0 1db0 97B0 AL0|74e5","Asia/Tashkent|LMT +05 +06 +07|-4B.b -50 -60 -70|012323232323232323232321|-1Pc4B.b eUnB.b 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0|23e5","Asia/Tbilisi|TBMT +03 +04 +05|-2X.b -30 -40 -50|0123232323232323232323212121232323232323232323212|-1Pc2X.b 1jUnX.b WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cK0 1cL0 1cN0 1cL0 1cN0 2pz0 1cL0 1fB0 3Nz0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 An0 Os0 WM0|11e5","Asia/Tehran|LMT TMT +0330 +04 +05 +0430|-3p.I -3p.I -3u -40 -50 -4u|01234325252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2btDp.I 1d3c0 1huLT.I TXu 1pz0 sN0 vAu 1cL0 1dB0 1en0 pNB0 UL0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 64p0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0|14e6","Asia/Thimphu|LMT +0530 +06|-5W.A -5u -60|012|-Su5W.A 1BGMs.A|79e3","Asia/Tokyo|JST JDT|-90 -a0|010101010|-QJJ0 Rb0 1ld0 14n0 1zd0 On0 1zd0 On0|38e6","Asia/Tomsk|LMT +06 +07 +08|-5D.P -60 -70 -80|0123232323232323232323212323232323232323232323212121212121212121212|-21NhD.P pxzD.P 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 co0 1bB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Qp0|10e5","Asia/Ulaanbaatar|LMT +07 +08 +09|-77.w -70 -80 -90|012323232323232323232323232323232323232323232323232|-2APH7.w 2Uko7.w cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|12e5","Asia/Ust-Nera|LMT +08 +09 +12 +11 +10|-9w.S -80 -90 -c0 -b0 -a0|012343434343434343434345434343434343434343434343434343434343434345|-21Q9w.S pApw.S 23CL0 1d90 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|65e2","Asia/Vladivostok|LMT +09 +10 +11|-8L.v -90 -a0 -b0|01232323232323232323232123232323232323232323232323232323232323232|-1SJIL.v itXL.v 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4","Asia/Yakutsk|LMT +08 +09 +10|-8C.W -80 -90 -a0|01232323232323232323232123232323232323232323232323232323232323232|-21Q8C.W pAoC.W 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|28e4","Asia/Yekaterinburg|LMT PMT +04 +05 +06|-42.x -3J.5 -40 -50 -60|012343434343434343434343234343434343434343434343434343434343434343|-2ag42.x 7mQh.s qBvJ.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|14e5","Asia/Yerevan|LMT +03 +04 +05|-2W -30 -40 -50|0123232323232323232323212121212323232323232323232323232323232|-1Pc2W 1jUnW WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 4RX0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|13e5","Atlantic/Azores|HMT -02 -01 +00 WET|1S.w 20 10 0 0|01212121212121212121212121212121212121212121232123212321232121212121212121212121212121212121212121232323232323232323232323232323234323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2ldW0 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|25e4","Atlantic/Bermuda|LMT AST ADT|4j.i 40 30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1BnRE.G 1LTbE.G 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e3","Atlantic/Canary|LMT -01 WET WEST|11.A 10 0 -10|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UtaW.o XPAW.o 1lAK0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4","Atlantic/Cape_Verde|LMT -02 -01|1y.4 20 10|01212|-2ldW0 1eEo0 7zX0 1djf0|50e4","Atlantic/Faroe|LMT WET WEST|r.4 0 -10|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2uSnw.U 2Wgow.U 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|49e3","Atlantic/Madeira|FMT -01 +00 +01 WET WEST|17.A 10 0 -10 0 -10|01212121212121212121212121212121212121212121232123212321232121212121212121212121212121212121212121454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2ldX0 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|27e4","Atlantic/Reykjavik|LMT -01 +00 GMT|1s 10 0 0|012121212121212121212121212121212121212121212121212121212121212121213|-2uWmw mfaw 1Bd0 ML0 1LB0 Cn0 1LB0 3fX0 C10 HrX0 1cO0 LB0 1EL0 LA0 1C00 Oo0 1wo0 Rc0 1wo0 Rc0 1wo0 Rc0 1zc0 Oo0 1zc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0|12e4","Atlantic/South_Georgia|-02|20|0||30","Atlantic/Stanley|SMT -04 -03 -02|3P.o 40 30 20|012121212121212323212121212121212121212121212121212121212121212121212|-2kJw8.A 12bA8.A 19X0 1fB0 19X0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 Cn0 1Cc10 WL0 1qL0 U10 1tz0 2mN0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 U10 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qN0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 U10 1tz0 U10 1tz0 U10|21e2","Australia/Sydney|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|40e5","Australia/Adelaide|ACST ACDT|-9u -au|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lt xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 WM0 1qM0 Rc0 1zc0 U00 1tA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|11e5","Australia/Brisbane|AEST AEDT|-a0 -b0|01010101010101010|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0|20e5","Australia/Broken_Hill|ACST ACDT|-9u -au|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lt xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|18e3","Australia/Currie|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-29E80 19X0 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|746","Australia/Darwin|ACST ACDT|-9u -au|010101010|-293lt xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0|12e4","Australia/Eucla|+0845 +0945|-8J -9J|0101010101010101010|-293kI xcX 10jd0 yL0 1cN0 1cL0 1gSp0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|368","Australia/Hobart|AEST AEDT|-a0 -b0|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-29E80 19X0 10jd0 yL0 1cN0 1cL0 1fB0 19X0 VfB0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|21e4","Australia/Lord_Howe|AEST +1030 +1130 +11|-a0 -au -bu -b0|0121212121313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313|raC0 1zdu Rb0 1zd0 On0 1zd0 On0 1zd0 On0 1zd0 TXu 1qMu WLu 1tAu WLu 1tAu TXu 1tAu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 11Au 1nXu 1qMu 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu 11zu 1o0u WLu 1qMu 14nu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu|347","Australia/Lindeman|AEST AEDT|-a0 -b0|010101010101010101010|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0|10","Australia/Melbourne|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1qM0 11A0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|39e5","Australia/Perth|AWST AWDT|-80 -90|0101010101010101010|-293jX xcX 10jd0 yL0 1cN0 1cL0 1gSp0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|18e5","CET|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00","Pacific/Easter|EMT -07 -06 -05|7h.s 70 60 50|012121212121212121212121212123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1uSgG.w 1s4IG.w WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 2pA0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0|30e2","CST6CDT|CST CDT CWT CPT|60 50 50 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","EET|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00","Europe/Dublin|DMT IST GMT BST IST|p.l -y.D 0 -10 -10|01232323232324242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242|-2ax9y.D Rc0 1fzy.D 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 g600 14o0 1wo0 17c0 1io0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5","EST|EST|50|0|","EST5EDT|EST EDT EWT EPT|50 40 40 40|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 SgN0 8x40 iv0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","Etc/GMT-0|GMT|0|0|","Etc/GMT-1|+01|-10|0|","Pacific/Port_Moresby|+10|-a0|0||25e4","Pacific/Pohnpei|+11|-b0|0||34e3","Pacific/Tarawa|+12|-c0|0||29e3","Etc/GMT-13|+13|-d0|0|","Etc/GMT-14|+14|-e0|0|","Etc/GMT-2|+02|-20|0|","Etc/GMT-3|+03|-30|0|","Etc/GMT-4|+04|-40|0|","Etc/GMT-5|+05|-50|0|","Etc/GMT-6|+06|-60|0|","Indian/Christmas|+07|-70|0||21e2","Etc/GMT-8|+08|-80|0|","Pacific/Palau|+09|-90|0||21e3","Etc/GMT+1|-01|10|0|","Etc/GMT+10|-10|a0|0|","Etc/GMT+11|-11|b0|0|","Etc/GMT+12|-12|c0|0|","Etc/GMT+3|-03|30|0|","Etc/GMT+4|-04|40|0|","Etc/GMT+5|-05|50|0|","Etc/GMT+6|-06|60|0|","Etc/GMT+7|-07|70|0|","Etc/GMT+8|-08|80|0|","Etc/GMT+9|-09|90|0|","Etc/UCT|UCT|0|0|","Etc/UTC|UTC|0|0|","Europe/Amsterdam|AMT NST +0120 +0020 CEST CET|-j.w -1j.w -1k -k -20 -10|010101010101010101010101010101010101010101012323234545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545|-2aFcj.w 11b0 1iP0 11A0 1io0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1co0 1io0 1yo0 Pc0 1a00 1fA0 1Bc0 Mo0 1tc0 Uo0 1tA0 U00 1uo0 W00 1s00 VA0 1so0 Vc0 1sM0 UM0 1wo0 Rc0 1u00 Wo0 1rA0 W00 1s00 VA0 1sM0 UM0 1w00 fV0 BCX.w 1tA0 U00 1u00 Wo0 1sm0 601k WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|16e5","Europe/Andorra|WET CET CEST|0 -10 -20|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-UBA0 1xIN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|79e3","Europe/Astrakhan|LMT +03 +04 +05|-3c.c -30 -40 -50|012323232323232323212121212121212121212121212121212121212121212|-1Pcrc.c eUMc.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0","Europe/Athens|AMT EET EEST CEST CET|-1y.Q -20 -30 -20 -10|012123434121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a61x.Q CNbx.Q mn0 kU10 9b0 3Es0 Xa0 1fb0 1dd0 k3X0 Nz0 SCp0 1vc0 SO0 1cM0 1a00 1ao0 1fc0 1a10 1fG0 1cg0 1dX0 1bX0 1cQ0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|35e5","Europe/London|GMT BST BDST|0 -10 -20|0101010101010101010101010101010101010101010101010121212121210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|10e6","Europe/Belgrade|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-19RC0 3IP0 WM0 1fA0 1cM0 1cM0 1rc0 Qo0 1vmo0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5","Europe/Berlin|CET CEST CEMT|-10 -20 -30|01010101010101210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 kL0 Nc0 m10 WM0 1ao0 1cp0 dX0 jz0 Dd0 1io0 17c0 1fA0 1a00 1ehA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e5","Europe/Prague|CET CEST GMT|-10 -20 0|01010101010101010201010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 1qM0 11c0 mp0 xA0 mn0 17c0 1io0 17c0 1fc0 1ao0 1bNc0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|13e5","Europe/Brussels|WET CET CEST WEST|0 -10 -20 -10|0121212103030303030303030303030303030303030303030303212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ehc0 3zX0 11c0 1iO0 11A0 1o00 11A0 my0 Ic0 1qM0 Rc0 1EM0 UM0 1u00 10o0 1io0 1io0 17c0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a30 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 y00 5Wn0 WM0 1fA0 1cM0 16M0 1iM0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|21e5","Europe/Bucharest|BMT EET EEST|-1I.o -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1xApI.o 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Axc0 On0 1fA0 1a10 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|19e5","Europe/Budapest|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1ip0 17b0 1op0 1tb0 Q2m0 3Ne0 WM0 1fA0 1cM0 1cM0 1oJ0 1dc0 1030 1fA0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1iM0 1fA0 8Ha0 Rb0 1wN0 Rb0 1BB0 Lz0 1C20 LB0 SNX0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e5","Europe/Zurich|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-19Lc0 11A0 1o00 11A0 1xG10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|38e4","Europe/Chisinau|CMT BMT EET EEST CEST CET MSK MSD|-1T -1I.o -20 -30 -20 -10 -30 -40|012323232323232323234545467676767676767676767323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-26jdT wGMa.A 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 27A0 2en0 39g0 WM0 1fA0 1cM0 V90 1t7z0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 gL0 WO0 1cM0 1cM0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11D0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|67e4","Europe/Copenhagen|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2azC0 Tz0 VuO0 60q0 WM0 1fA0 1cM0 1cM0 1cM0 S00 1HA0 Nc0 1C00 Dc0 1Nc0 Ao0 1h5A0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5","Europe/Gibraltar|GMT BST BDST CET CEST|0 -10 -20 -10 -20|010101010101010101010101010101010101010101010101012121212121010121010101010101010101034343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 10Jz0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|30e3","Europe/Helsinki|HMT EET EEST|-1D.N -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1WuND.N OULD.N 1dA0 1xGq0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5","Europe/Kaliningrad|CET CEST CET CEST MSK MSD EEST EET +03|-10 -20 -20 -30 -30 -40 -30 -20 -30|0101010101010232454545454545454546767676767676767676767676767676767676767676787|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 Am0 Lb0 1en0 op0 1pNz0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|44e4","Europe/Kiev|KMT EET MSK CEST CET MSD EEST|-22.4 -20 -30 -20 -10 -40 -30|0123434252525252525252525256161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161|-1Pc22.4 eUo2.4 rnz0 2Hg0 WM0 1fA0 da0 1v4m0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 Db0 3220 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|34e5","Europe/Kirov|LMT +03 +04 +05|-3i.M -30 -40 -50|01232323232323232321212121212121212121212121212121212121212121|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|48e4","Europe/Lisbon|LMT WET WEST WEMT CET CEST|A.J 0 -10 -20 -10 -20|012121212121212121212121212121212121212121212321232123212321212121212121212121212121212121212121214121212121212121212121212121212124545454212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2le00 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 pvy0 1cM0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|27e5","Europe/Luxembourg|LMT CET CEST WET WEST WEST WET|-o.A -10 -20 0 -10 -20 -10|0121212134343434343434343434343434343434343434343434565651212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2DG0o.A t6mo.A TB0 1nX0 Up0 1o20 11A0 rW0 CM0 1qP0 R90 1EO0 UK0 1u20 10m0 1ip0 1in0 17e0 19W0 1fB0 1db0 1cp0 1in0 17d0 1fz0 1a10 1in0 1a10 1in0 17f0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 vA0 60L0 WM0 1fA0 1cM0 17c0 1io0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4","Europe/Madrid|WET WEST WEMT CET CEST|0 -10 -20 -10 -20|010101010101010101210343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-25Td0 19B0 1cL0 1dd0 b1z0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1in0 17d0 iIn0 Hd0 1cL0 bb0 1200 2s20 14n0 5aL0 Mp0 1vz0 17d0 1in0 17d0 1in0 17d0 1in0 17d0 6hX0 11B0 XHX0 1a10 1fz0 1a10 19X0 1cN0 1fz0 1a10 1fC0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|62e5","Europe/Malta|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2arB0 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1co0 17c0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1co0 1cM0 1lA0 Xc0 1qq0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1iN0 19z0 1fB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|42e4","Europe/Minsk|MMT EET MSK CEST CET MSD EEST +03|-1O -20 -30 -20 -10 -40 -30 -30|01234343252525252525252525261616161616161616161616161616161616161617|-1Pc1O eUnO qNX0 3gQ0 WM0 1fA0 1cM0 Al0 1tsn0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 3Fc0 1cN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0|19e5","Europe/Monaco|PMT WET WEST WEMT CET CEST|-9.l 0 -10 -20 -10 -20|01212121212121212121212121212121212121212121212121232323232345454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 2RV0 11z0 11B0 1ze0 WM0 1fA0 1cM0 1fa0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|38e3","Europe/Moscow|MMT MMT MST MDST MSD MSK +05 EET EEST MSK|-2u.h -2v.j -3v.j -4v.j -40 -30 -50 -20 -30 -40|012132345464575454545454545454545458754545454545454545454545454545454545454595|-2ag2u.h 2pyW.W 1bA0 11X0 GN0 1Hb0 c4v.j ik0 3DA0 dz0 15A0 c10 2q10 iM10 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|16e6","Europe/Paris|PMT WET WEST CEST CET WEMT|-9.l 0 -10 -20 -10 -20|0121212121212121212121212121212121212121212121212123434352543434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434|-2nco8.l cNb8.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 Ik0 5M30 WM0 1fA0 1cM0 Vx0 hB0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|11e6","Europe/Riga|RMT LST EET MSK CEST CET MSD EEST|-1A.y -2A.y -20 -30 -20 -10 -40 -30|010102345454536363636363636363727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272|-25TzA.y 11A0 1iM0 ko0 gWm0 yDXA.y 2bX0 3fE0 WM0 1fA0 1cM0 1cM0 4m0 1sLy0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 1o00 11A0 1o00 11A0 1qM0 3oo0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|64e4","Europe/Rome|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2arB0 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1cM0 16M0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1C00 LA0 1zc0 Oo0 1C00 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1zc0 Oo0 1fC0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|39e5","Europe/Samara|LMT +03 +04 +05|-3k.k -30 -40 -50|0123232323232323232121232323232323232323232323232323232323212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2y10 14m0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|12e5","Europe/Saratov|LMT +03 +04 +05|-34.i -30 -40 -50|012323232323232321212121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 5810","Europe/Simferopol|SMT EET MSK CEST CET MSD EEST MSK|-2g -20 -30 -20 -10 -40 -30 -40|012343432525252525252525252161616525252616161616161616161616161616161616172|-1Pc2g eUog rEn0 2qs0 WM0 1fA0 1cM0 3V0 1u0L0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 4eL0 1cL0 1cN0 1cL0 1cN0 dX0 WL0 1cN0 1cL0 1fB0 1o30 11B0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11z0 1nW0|33e4","Europe/Sofia|EET CET CEST EEST|-20 -10 -20 -30|01212103030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030|-168L0 WM0 1fA0 1cM0 1cM0 1cN0 1mKH0 1dd0 1fb0 1ap0 1fb0 1a20 1fy0 1a30 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5","Europe/Stockholm|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2azC0 TB0 2yDe0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|15e5","Europe/Tallinn|TMT CET CEST EET MSK MSD EEST|-1D -10 -20 -20 -30 -40 -30|012103421212454545454545454546363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363|-26oND teD 11A0 1Ta0 4rXl KSLD 2FX0 2Jg0 WM0 1fA0 1cM0 18J0 1sTX0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o10 11A0 1qM0 5QM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e4","Europe/Tirane|LMT CET CEST|-1j.k -10 -20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glBj.k 14pcj.k 5LC0 WM0 4M0 1fCK0 10n0 1op0 11z0 1pd0 11z0 1qN0 WL0 1qp0 Xb0 1qp0 Xb0 1qp0 11z0 1lB0 11z0 1qN0 11z0 1iN0 16n0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|42e4","Europe/Ulyanovsk|LMT +03 +04 +05 +02|-3d.A -30 -40 -50 -20|01232323232323232321214121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0","Europe/Uzhgorod|CET CEST MSK MSD EET EEST|-10 -20 -30 -40 -20 -30|010101023232323232323232320454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-1cqL0 6i00 WM0 1fA0 1cM0 1ml0 1Cp0 1r3W0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 1Nf0 2pw0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|11e4","Europe/Vienna|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 3KM0 14o0 LA00 6i00 WM0 1fA0 1cM0 1cM0 1cM0 400 2qM0 1a00 1cM0 1cM0 1io0 17c0 1gHa0 19X0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|18e5","Europe/Vilnius|WMT KMT CET EET MSK CEST MSD EEST|-1o -1z.A -10 -20 -30 -20 -40 -30|012324525254646464646464646473737373737373737352537373737373737373737373737373737373737373737373737373737373737373737373|-293do 6ILM.o 1Ooz.A zz0 Mfd0 29W0 3is0 WM0 1fA0 1cM0 LV0 1tgL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11B0 1o00 11A0 1qM0 8io0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4","Europe/Volgograd|LMT +03 +04 +05|-2V.E -30 -40 -50|01232323232323232121212121212121212121212121212121212121212121|-21IqV.E psLV.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|10e5","Europe/Warsaw|WMT CET CEST EET EEST|-1o -10 -20 -20 -30|012121234312121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ctdo 1LXo 11d0 1iO0 11A0 1o00 11A0 1on0 11A0 6zy0 HWP0 5IM0 WM0 1fA0 1cM0 1dz0 1mL0 1en0 15B0 1aq0 1nA0 11A0 1io0 17c0 1fA0 1a00 iDX0 LA0 1cM0 1cM0 1C00 Oo0 1cM0 1cM0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1C00 LA0 uso0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e5","Europe/Zaporozhye|+0220 EET MSK CEST CET MSD EEST|-2k -20 -30 -20 -10 -40 -30|01234342525252525252525252526161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161|-1Pc2k eUok rdb0 2RE0 WM0 1fA0 8m0 1v9a0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cK0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|77e4","HST|HST|a0|0|","Indian/Chagos|LMT +05 +06|-4N.E -50 -60|012|-2xosN.E 3AGLN.E|30e2","Indian/Cocos|+0630|-6u|0||596","Indian/Kerguelen|-00 +05|0 -50|01|-MG00|130","Indian/Mahe|LMT +04|-3F.M -40|01|-2yO3F.M|79e3","Indian/Maldives|MMT +05|-4S -50|01|-olgS|35e4","Indian/Mauritius|LMT +04 +05|-3O -40 -50|012121|-2xorO 34unO 14L0 12kr0 11z0|15e4","Indian/Reunion|LMT +04|-3F.Q -40|01|-2mDDF.Q|84e4","Pacific/Kwajalein|+11 -12 +12|-b0 c0 -c0|012|-AX0 W9X0|14e3","MET|MET MEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00","MST|MST|70|0|","MST7MDT|MST MDT MWT MPT|70 60 60 60|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","Pacific/Chatham|+1215 +1245 +1345|-cf -cJ -dJ|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-WqAf 1adef IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|600","Pacific/Apia|LMT -1130 -11 -10 +14 +13|bq.U bu b0 a0 -e0 -d0|01232345454545454545454545454545454545454545454545454545454|-2nDMx.4 1yW03.4 2rRbu 1ff0 1a00 CI0 AQ0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|37e3","Pacific/Bougainville|+10 +09 +11|-a0 -90 -b0|0102|-16Wy0 7CN0 2MQp0|18e4","Pacific/Efate|LMT +11 +12|-bd.g -b0 -c0|0121212121212121212121|-2l9nd.g 2Szcd.g 1cL0 1oN0 10L0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 Lz0 1Nd0 An0|66e3","Pacific/Enderbury|-12 -11 +13|c0 b0 -d0|012|nIc0 B7X0|1","Pacific/Fakaofo|-11 +13|b0 -d0|01|1Gfn0|483","Pacific/Fiji|LMT +12 +13|-bT.I -c0 -d0|0121212121212121212121212121212121212121212121212121212121212121|-2bUzT.I 3m8NT.I LA0 1EM0 IM0 nJc0 LA0 1o00 Rc0 1wo0 Ao0 1Nc0 Ao0 1Q00 xz0 1SN0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0|88e4","Pacific/Galapagos|LMT -05 -06|5W.o 50 60|01212|-1yVS1.A 2dTz1.A gNd0 rz0|25e3","Pacific/Gambier|LMT -09|8X.M 90|01|-2jof0.c|125","Pacific/Guadalcanal|LMT +11|-aD.M -b0|01|-2joyD.M|11e4","Pacific/Guam|GST ChST|-a0 -a0|01|1fpq0|17e4","Pacific/Honolulu|HST HDT HST|au 9u a0|010102|-1thLu 8x0 lef0 8Pz0 46p0|37e4","Pacific/Kiritimati|-1040 -10 +14|aE a0 -e0|012|nIaE B7Xk|51e2","Pacific/Kosrae|+11 +12|-b0 -c0|010|-AX0 1bdz0|66e2","Pacific/Majuro|+11 +12|-b0 -c0|01|-AX0|28e3","Pacific/Marquesas|LMT -0930|9i 9u|01|-2joeG|86e2","Pacific/Pago_Pago|LMT SST|bm.M b0|01|-2nDMB.c|37e2","Pacific/Nauru|LMT +1130 +09 +12|-b7.E -bu -90 -c0|01213|-1Xdn7.E PvzB.E 5RCu 1ouJu|10e3","Pacific/Niue|-1120 -1130 -11|bk bu b0|012|-KfME 17y0a|12e2","Pacific/Norfolk|+1112 +1130 +1230 +11|-bc -bu -cu -b0|01213|-Kgbc W01G On0 1COp0|25e4","Pacific/Noumea|LMT +11 +12|-b5.M -b0 -c0|01212121|-2l9n5.M 2EqM5.M xX0 1PB0 yn0 HeP0 Ao0|98e3","Pacific/Pitcairn|-0830 -08|8u 80|01|18Vku|56","Pacific/Rarotonga|-1030 -0930 -10|au 9u a0|012121212121212121212121212|lyWu IL0 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu|13e3","Pacific/Tahiti|LMT -10|9W.g a0|01|-2joe1.I|18e4","Pacific/Tongatapu|+1220 +13 +14|-ck -d0 -e0|0121212121|-1aB0k 2n5dk 15A0 1wo0 xz0 1Q10 xz0 zWN0 s00|75e3","PST8PDT|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0","WET|WET WEST|0 -10|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00"],links:["Africa/Abidjan|Africa/Bamako","Africa/Abidjan|Africa/Banjul","Africa/Abidjan|Africa/Conakry","Africa/Abidjan|Africa/Dakar","Africa/Abidjan|Africa/Freetown","Africa/Abidjan|Africa/Lome","Africa/Abidjan|Africa/Nouakchott","Africa/Abidjan|Africa/Ouagadougou","Africa/Abidjan|Africa/Timbuktu","Africa/Abidjan|Atlantic/St_Helena","Africa/Cairo|Egypt","Africa/Johannesburg|Africa/Maseru","Africa/Johannesburg|Africa/Mbabane","Africa/Lagos|Africa/Bangui","Africa/Lagos|Africa/Brazzaville","Africa/Lagos|Africa/Douala","Africa/Lagos|Africa/Kinshasa","Africa/Lagos|Africa/Libreville","Africa/Lagos|Africa/Luanda","Africa/Lagos|Africa/Malabo","Africa/Lagos|Africa/Niamey","Africa/Lagos|Africa/Porto-Novo","Africa/Maputo|Africa/Blantyre","Africa/Maputo|Africa/Bujumbura","Africa/Maputo|Africa/Gaborone","Africa/Maputo|Africa/Harare","Africa/Maputo|Africa/Kigali","Africa/Maputo|Africa/Lubumbashi","Africa/Maputo|Africa/Lusaka","Africa/Nairobi|Africa/Addis_Ababa","Africa/Nairobi|Africa/Asmara","Africa/Nairobi|Africa/Asmera","Africa/Nairobi|Africa/Dar_es_Salaam","Africa/Nairobi|Africa/Djibouti","Africa/Nairobi|Africa/Kampala","Africa/Nairobi|Africa/Mogadishu","Africa/Nairobi|Indian/Antananarivo","Africa/Nairobi|Indian/Comoro","Africa/Nairobi|Indian/Mayotte","Africa/Tripoli|Libya","America/Adak|America/Atka","America/Adak|US/Aleutian","America/Anchorage|US/Alaska","America/Argentina/Buenos_Aires|America/Buenos_Aires","America/Argentina/Catamarca|America/Argentina/ComodRivadavia","America/Argentina/Catamarca|America/Catamarca","America/Argentina/Cordoba|America/Cordoba","America/Argentina/Cordoba|America/Rosario","America/Argentina/Jujuy|America/Jujuy","America/Argentina/Mendoza|America/Mendoza","America/Atikokan|America/Coral_Harbour","America/Chicago|US/Central","America/Curacao|America/Aruba","America/Curacao|America/Kralendijk","America/Curacao|America/Lower_Princes","America/Denver|America/Shiprock","America/Denver|Navajo","America/Denver|US/Mountain","America/Detroit|US/Michigan","America/Edmonton|Canada/Mountain","America/Fort_Wayne|America/Indiana/Indianapolis","America/Fort_Wayne|America/Indianapolis","America/Fort_Wayne|US/East-Indiana","America/Halifax|Canada/Atlantic","America/Havana|Cuba","America/Indiana/Knox|America/Knox_IN","America/Indiana/Knox|US/Indiana-Starke","America/Jamaica|Jamaica","America/Kentucky/Louisville|America/Louisville","America/Los_Angeles|US/Pacific","America/Los_Angeles|US/Pacific-New","America/Manaus|Brazil/West","America/Mazatlan|Mexico/BajaSur","America/Mexico_City|Mexico/General","America/New_York|US/Eastern","America/Noronha|Brazil/DeNoronha","America/Panama|America/Cayman","America/Phoenix|US/Arizona","America/Port_of_Spain|America/Anguilla","America/Port_of_Spain|America/Antigua","America/Port_of_Spain|America/Dominica","America/Port_of_Spain|America/Grenada","America/Port_of_Spain|America/Guadeloupe","America/Port_of_Spain|America/Marigot","America/Port_of_Spain|America/Montserrat","America/Port_of_Spain|America/St_Barthelemy","America/Port_of_Spain|America/St_Kitts","America/Port_of_Spain|America/St_Lucia","America/Port_of_Spain|America/St_Thomas","America/Port_of_Spain|America/St_Vincent","America/Port_of_Spain|America/Tortola","America/Port_of_Spain|America/Virgin","America/Regina|Canada/Saskatchewan","America/Rio_Branco|America/Porto_Acre","America/Rio_Branco|Brazil/Acre","America/Santiago|Chile/Continental","America/Sao_Paulo|Brazil/East","America/St_Johns|Canada/Newfoundland","America/Tijuana|America/Ensenada","America/Tijuana|America/Santa_Isabel","America/Tijuana|Mexico/BajaNorte","America/Toronto|America/Montreal","America/Toronto|Canada/Eastern","America/Vancouver|Canada/Pacific","America/Whitehorse|Canada/Yukon","America/Winnipeg|Canada/Central","Asia/Ashgabat|Asia/Ashkhabad","Asia/Bangkok|Asia/Phnom_Penh","Asia/Bangkok|Asia/Vientiane","Asia/Dhaka|Asia/Dacca","Asia/Dubai|Asia/Muscat","Asia/Ho_Chi_Minh|Asia/Saigon","Asia/Hong_Kong|Hongkong","Asia/Jerusalem|Asia/Tel_Aviv","Asia/Jerusalem|Israel","Asia/Kathmandu|Asia/Katmandu","Asia/Kolkata|Asia/Calcutta","Asia/Kuala_Lumpur|Asia/Singapore","Asia/Kuala_Lumpur|Singapore","Asia/Macau|Asia/Macao","Asia/Makassar|Asia/Ujung_Pandang","Asia/Nicosia|Europe/Nicosia","Asia/Qatar|Asia/Bahrain","Asia/Rangoon|Asia/Yangon","Asia/Riyadh|Asia/Aden","Asia/Riyadh|Asia/Kuwait","Asia/Seoul|ROK","Asia/Shanghai|Asia/Chongqing","Asia/Shanghai|Asia/Chungking","Asia/Shanghai|Asia/Harbin","Asia/Shanghai|PRC","Asia/Taipei|ROC","Asia/Tehran|Iran","Asia/Thimphu|Asia/Thimbu","Asia/Tokyo|Japan","Asia/Ulaanbaatar|Asia/Ulan_Bator","Asia/Urumqi|Asia/Kashgar","Atlantic/Faroe|Atlantic/Faeroe","Atlantic/Reykjavik|Iceland","Atlantic/South_Georgia|Etc/GMT+2","Australia/Adelaide|Australia/South","Australia/Brisbane|Australia/Queensland","Australia/Broken_Hill|Australia/Yancowinna","Australia/Darwin|Australia/North","Australia/Hobart|Australia/Tasmania","Australia/Lord_Howe|Australia/LHI","Australia/Melbourne|Australia/Victoria","Australia/Perth|Australia/West","Australia/Sydney|Australia/ACT","Australia/Sydney|Australia/Canberra","Australia/Sydney|Australia/NSW","Etc/GMT-0|Etc/GMT","Etc/GMT-0|Etc/GMT+0","Etc/GMT-0|Etc/GMT0","Etc/GMT-0|Etc/Greenwich","Etc/GMT-0|GMT","Etc/GMT-0|GMT+0","Etc/GMT-0|GMT-0","Etc/GMT-0|GMT0","Etc/GMT-0|Greenwich","Etc/UCT|UCT","Etc/UTC|Etc/Universal","Etc/UTC|Etc/Zulu","Etc/UTC|UTC","Etc/UTC|Universal","Etc/UTC|Zulu","Europe/Belgrade|Europe/Ljubljana","Europe/Belgrade|Europe/Podgorica","Europe/Belgrade|Europe/Sarajevo","Europe/Belgrade|Europe/Skopje","Europe/Belgrade|Europe/Zagreb","Europe/Chisinau|Europe/Tiraspol","Europe/Dublin|Eire","Europe/Helsinki|Europe/Mariehamn","Europe/Istanbul|Asia/Istanbul","Europe/Istanbul|Turkey","Europe/Lisbon|Portugal","Europe/London|Europe/Belfast","Europe/London|Europe/Guernsey","Europe/London|Europe/Isle_of_Man","Europe/London|Europe/Jersey","Europe/London|GB","Europe/London|GB-Eire","Europe/Moscow|W-SU","Europe/Oslo|Arctic/Longyearbyen","Europe/Oslo|Atlantic/Jan_Mayen","Europe/Prague|Europe/Bratislava","Europe/Rome|Europe/San_Marino","Europe/Rome|Europe/Vatican","Europe/Warsaw|Poland","Europe/Zurich|Europe/Busingen","Europe/Zurich|Europe/Vaduz","Indian/Christmas|Etc/GMT-7","Pacific/Auckland|Antarctica/McMurdo","Pacific/Auckland|Antarctica/South_Pole","Pacific/Auckland|NZ","Pacific/Chatham|NZ-CHAT","Pacific/Easter|Chile/EasterIsland","Pacific/Guam|Pacific/Saipan","Pacific/Honolulu|Pacific/Johnston","Pacific/Honolulu|US/Hawaii","Pacific/Kwajalein|Kwajalein","Pacific/Pago_Pago|Pacific/Midway","Pacific/Pago_Pago|Pacific/Samoa","Pacific/Pago_Pago|US/Samoa","Pacific/Palau|Etc/GMT-9","Pacific/Pohnpei|Etc/GMT-11","Pacific/Pohnpei|Pacific/Ponape","Pacific/Port_Moresby|Etc/GMT-10","Pacific/Port_Moresby|Pacific/Chuuk","Pacific/Port_Moresby|Pacific/Truk","Pacific/Port_Moresby|Pacific/Yap","Pacific/Tarawa|Etc/GMT-12","Pacific/Tarawa|Pacific/Funafuti","Pacific/Tarawa|Pacific/Wake","Pacific/Tarawa|Pacific/Wallis"]}),o}); \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/builds/moment-timezone.min.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/builds/moment-timezone.min.js
new file mode 100644
index 00000000000..54a67a74c75
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/builds/moment-timezone.min.js
@@ -0,0 +1 @@
+!function(t,e){"use strict";"function"==typeof define&&define.amd?define(["moment"],e):"object"==typeof module&&module.exports?module.exports=e(require("moment")):e(t.moment)}(this,function(s){"use strict";var e,i={},f={},u={},c={},t=s.version.split("."),n=+t[0],o=+t[1];function a(t){return 96<t?t-87:64<t?t-29:t-48}function r(t){var e=0,n=t.split("."),o=n[0],r=n[1]||"",s=1,i=0,f=1;for(45===t.charCodeAt(0)&&(f=-(e=1));e<o.length;e++)i=60*i+a(o.charCodeAt(e));for(e=0;e<r.length;e++)s/=60,i+=a(r.charCodeAt(e))*s;return i*f}function h(t){for(var e=0;e<t.length;e++)t[e]=r(t[e])}function l(t,e){var n,o=[];for(n=0;n<e.length;n++)o[n]=t[e[n]];return o}function p(t){var e=t.split("|"),n=e[2].split(" "),o=e[3].split(""),r=e[4].split(" ");return h(n),h(o),h(r),function(t,e){for(var n=0;n<e;n++)t[n]=Math.round((t[n-1]||0)+6e4*t[n]);t[e-1]=1/0}(r,o.length),{name:e[0],abbrs:l(e[1].split(" "),o),offsets:l(n,o),untils:r,population:0|e[5]}}function d(t){t&&this._set(p(t))}function m(t){var e=t.toTimeString(),n=e.match(/\([a-z ]+\)/i);"GMT"===(n=n&&n[0]?(n=n[0].match(/[A-Z]/g))?n.join(""):void 0:(n=e.match(/[A-Z]{3,5}/g))?n[0]:void 0)&&(n=void 0),this.at=+t,this.abbr=n,this.offset=t.getTimezoneOffset()}function v(t){this.zone=t,this.offsetScore=0,this.abbrScore=0}function z(t,e){for(var n,o;o=6e4*((e.at-t.at)/12e4|0);)(n=new m(new Date(t.at+o))).offset===t.offset?t=n:e=n;return t}function b(t,e){return t.offsetScore!==e.offsetScore?t.offsetScore-e.offsetScore:t.abbrScore!==e.abbrScore?t.abbrScore-e.abbrScore:e.zone.population-t.zone.population}function g(t,e){var n,o;for(h(e),n=0;n<e.length;n++)o=e[n],c[o]=c[o]||{},c[o][t]=!0}function _(){try{var t=Intl.DateTimeFormat().resolvedOptions().timeZone;if(t&&3<t.length){var e=u[w(t)];if(e)return e;M("Moment Timezone found "+t+" from the Intl api, but did not have that data loaded.")}}catch(t){}var n,o,r,s=function(){var t,e,n,o=(new Date).getFullYear()-2,r=new m(new Date(o,0,1)),s=[r];for(n=1;n<48;n++)(e=new m(new Date(o,n,1))).offset!==r.offset&&(t=z(r,e),s.push(t),s.push(new m(new Date(t.at+6e4)))),r=e;for(n=0;n<4;n++)s.push(new m(new Date(o+n,0,1))),s.push(new m(new Date(o+n,6,1)));return s}(),i=s.length,f=function(t){var e,n,o,r=t.length,s={},i=[];for(e=0;e<r;e++)for(n in o=c[t[e].offset]||{})o.hasOwnProperty(n)&&(s[n]=!0);for(e in s)s.hasOwnProperty(e)&&i.push(u[e]);return i}(s),a=[];for(o=0;o<f.length;o++){for(n=new v(S(f[o]),i),r=0;r<i;r++)n.scoreOffsetAt(s[r]);a.push(n)}return a.sort(b),0<a.length?a[0].zone.name:void 0}function w(t){return(t||"").toLowerCase().replace(/\//g,"_")}function y(t){var e,n,o,r;for("string"==typeof t&&(t=[t]),e=0;e<t.length;e++)r=w(n=(o=t[e].split("|"))[0]),i[r]=t[e],u[r]=n,g(r,o[2].split(" "))}function S(t,e){t=w(t);var n,o=i[t];return o instanceof d?o:"string"==typeof o?(o=new d(o),i[t]=o):f[t]&&e!==S&&(n=S(f[t],S))?((o=i[t]=new d)._set(n),o.name=u[t],o):null}function O(t){var e,n,o,r;for("string"==typeof t&&(t=[t]),e=0;e<t.length;e++)o=w((n=t[e].split("|"))[0]),r=w(n[1]),f[o]=r,u[o]=n[0],f[r]=o,u[r]=n[1]}function A(t){var e="X"===t._f||"x"===t._f;return!(!t._a||void 0!==t._tzm||e)}function M(t){"undefined"!=typeof console&&"function"==typeof console.error&&console.error(t)}function j(t){var e=Array.prototype.slice.call(arguments,0,-1),n=arguments[arguments.length-1],o=S(n),r=s.utc.apply(null,e);return o&&!s.isMoment(t)&&A(r)&&r.add(o.parse(r),"minutes"),r.tz(n),r}(n<2||2===n&&o<6)&&M("Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js "+s.version+". See momentjs.com"),d.prototype={_set:function(t){this.name=t.name,this.abbrs=t.abbrs,this.untils=t.untils,this.offsets=t.offsets,this.population=t.population},_index:function(t){var e,n=+t,o=this.untils;for(e=0;e<o.length;e++)if(n<o[e])return e},parse:function(t){var e,n,o,r,s=+t,i=this.offsets,f=this.untils,a=f.length-1;for(r=0;r<a;r++)if(e=i[r],n=i[r+1],o=i[r?r-1:r],e<n&&j.moveAmbiguousForward?e=n:o<e&&j.moveInvalidForward&&(e=o),s<f[r]-6e4*e)return i[r];return i[a]},abbr:function(t){return this.abbrs[this._index(t)]},offset:function(t){return M("zone.offset has been deprecated in favor of zone.utcOffset"),this.offsets[this._index(t)]},utcOffset:function(t){return this.offsets[this._index(t)]}},v.prototype.scoreOffsetAt=function(t){this.offsetScore+=Math.abs(this.zone.utcOffset(t.at)-t.offset),this.zone.abbr(t.at).replace(/[^A-Z]/g,"")!==t.abbr&&this.abbrScore++},j.version="0.5.17",j.dataVersion="",j._zones=i,j._links=f,j._names=u,j.add=y,j.link=O,j.load=function(t){y(t.zones),O(t.links),j.dataVersion=t.version},j.zone=S,j.zoneExists=function t(e){return t.didShowError||(t.didShowError=!0,M("moment.tz.zoneExists('"+e+"') has been deprecated in favor of !moment.tz.zone('"+e+"')")),!!S(e)},j.guess=function(t){return e&&!t||(e=_()),e},j.names=function(){var t,e=[];for(t in u)u.hasOwnProperty(t)&&(i[t]||i[f[t]])&&u[t]&&e.push(u[t]);return e.sort()},j.Zone=d,j.unpack=p,j.unpackBase60=r,j.needsOffset=A,j.moveInvalidForward=!0,j.moveAmbiguousForward=!1;var D,x=s.fn;function T(t){return function(){return this._z?this._z.abbr(this):t.call(this)}}s.tz=j,s.defaultZone=null,s.updateOffset=function(t,e){var n,o=s.defaultZone;void 0===t._z&&(o&&A(t)&&!t._isUTC&&(t._d=s.utc(t._a)._d,t.utc().add(o.parse(t),"minutes")),t._z=o),t._z&&(n=t._z.utcOffset(t),Math.abs(n)<16&&(n/=60),void 0!==t.utcOffset?t.utcOffset(-n,e):t.zone(n,e))},x.tz=function(t,e){return t?(this._z=S(t),this._z?s.updateOffset(this,e):M("Moment Timezone has no data for "+t+". See http://momentjs.com/timezone/docs/#/data-loading/."),this):this._z?this._z.name:void 0},x.zoneName=T(x.zoneName),x.zoneAbbr=T(x.zoneAbbr),x.utc=(D=x.utc,function(){return this._z=null,D.apply(this,arguments)}),s.tz.setDefault=function(t){return(n<2||2===n&&o<9)&&M("Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js "+s.version+"."),s.defaultZone=t?S(t):null,s};var Z=s.momentProperties;return"[object Array]"===Object.prototype.toString.call(Z)?(Z.push("_z"),Z.push("_a")):Z&&(Z._z=null),s}); \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/changelog.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/changelog.md
new file mode 100644
index 00000000000..1cc50755489
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/changelog.md
@@ -0,0 +1,154 @@
+### `0.5.16` _2018-04-18_
+* Fixed Etc/UTC timezone recognition, updated tests. [#599](https://github.com/moment/moment-timezone/pull/599)
+* Updated minified files to contain IANA TZDB `2018d` data
+
+### `0.5.15` _2018-04-17_
+* Updated data to IANA TZDB `2018d`. [#596](https://github.com/moment/moment-timezone/pull/596)
+
+### `0.5.14` _2017-10-30_
+* Ensure Intl response is valid when guessing time zone. [#553](https://github.com/moment/moment-timezone/pull/553)
+* Updated data to IANA TZDB `2017c`. [#552](https://github.com/moment/moment-timezone/pull/552)
+* Convert to tz keeping wall time [#505](https://github.com/moment/moment-timezone/pull/505)
+* Make all time zones available for guessing. [#483](https://github.com/moment/moment-timezone/pull/483)
+* zone.offset has been deprecated in favor of zone.utcOffset [#398](https://github.com/moment/moment-timezone/pull/398)
+* Check for timestamp formats when parsing [#348](https://github.com/moment/moment-timezone/pull/348)
+
+### `0.5.13` _2017-04-04_
+* Bumped version to address Bower cache issues with last release. [#474](https://github.com/moment/moment-timezone/issues/474)
+* (No actual changes otherwise)
+
+### `0.5.12` _2017-04-02_
+* Updated data to IANA TZDB `2017b`. [#422](https://github.com/moment/moment-timezone/pull/460)
+* Build the truncated data file as 2012-2022 (+/- 5 years).
+
+### `0.5.11` _2016-12-23_
+* Remove log statement when data is loaded twice. [#352](https://github.com/moment/moment-timezone/pull/352)
+
+### `0.5.10` _2016-11-27_
+* Updated data to IANA TZDB `2016j`. [#422](https://github.com/moment/moment-timezone/pull/422)
+
+### `0.5.9` _2016-11-03_
+* Fixed the output of `moment.tz.version`. [#413](https://github.com/moment/moment-timezone/issues/413)
+
+### `0.5.8` _2016-11-03_
+* Updated data to IANA TZDB `2016i`. [#411](https://github.com/moment/moment-timezone/pull/411)
+
+### `0.5.7` _2016-10-21_
+* Updated data to IANA TZDB `2016h`. [#403](https://github.com/moment/moment-timezone/pull/403)
+
+### `0.5.6` _2016-10-08_
+* Updated data to IANA TZDB `2016g`. [#394](https://github.com/moment/moment-timezone/pull/394)
+
+### `0.5.5` _2016-07-24_
+* Updated data to IANA TZDB `2016f`. [#360](https://github.com/moment/moment-timezone/pull/360)
+
+### `0.5.4` _2016-05-03_
+* Updated data to IANA TZDB `2016d`. [#336](https://github.com/moment/moment-timezone/pull/336)
+* Ignore the results from `Intl.DateTimeFormat().resolvedOptions().timeZone` if it is undefined. [#322](https://github.com/moment/moment-timezone/pull/322)
+
+### `0.5.3` _2016-03-24_
+* Updated data to IANA TZDB `2016c`. [#321](https://github.com/moment/moment-timezone/pull/321)
+
+### `0.5.2` _2016-03-15_
+* Updated data to IANA TZDB `2016b`. [#315](https://github.com/moment/moment-timezone/pull/315)
+
+### `0.5.1` _2016-03-01_
+* Updated data to IANA TZDB `2016a`. [#299](https://github.com/moment/moment-timezone/pull/299)
+* Fixed bug when `Date#toTimeString` did not return a known format. [#302](https://github.com/moment/moment-timezone/pull/302) [#303](https://github.com/moment/moment-timezone/pull/303)
+* Added lookup on `Intl.DateTimeFormat().resolvedOptions().timeZone` to `moment.tz.guess()`. [#304](https://github.com/moment/moment-timezone/pull/304) [#291](https://github.com/moment/moment-timezone/pull/291)
+
+### `0.5.0` _2015-12-28_
+* Added support for guessing the user's timezone via `moment.tz.guess()`. [#285](https://github.com/moment/moment-timezone/pull/285)
+* Fixed UMD export issue when there was an html element with `id=exports`. [#275](https://github.com/moment/moment-timezone/pull/275)
+* Removed jspm specific dependencies from `package.json`. [#284](https://github.com/moment/moment-timezone/pull/284)
+
+### `0.4.1` _2015-10-07_
+* Updated data to IANA TZDB `2015e`. [#253](https://github.com/moment/moment-timezone/pull/253)
+* Updated data to IANA TZDB `2015f`. [#253](https://github.com/moment/moment-timezone/pull/253)
+* Updated data to IANA TZDB `2015g`. [#255](https://github.com/moment/moment-timezone/pull/255)
+* Added jspm dependencies for moment. [#234](https://github.com/moment/moment-timezone/pull/234)
+* Included builds directory in npm. [#237](https://github.com/moment/moment-timezone/pull/237)
+* Removed version field from bower.json. [#230](https://github.com/moment/moment-timezone/pull/230)
+
+### `0.4.0` _2015-05-30_
+* Updated data to IANA TZDB `2015b`. [#201](https://github.com/moment/moment-timezone/pull/201)
+* Updated data to IANA TZDB `2015c`. [#214](https://github.com/moment/moment-timezone/pull/214)
+* Updated data to IANA TZDB `2015d`. [#214](https://github.com/moment/moment-timezone/pull/214)
+* Updated zone getter to allow lazy unpacking to improve initial page load times. [#216](https://github.com/moment/moment-timezone/pull/216)
+* Added a `package.json` `jspm:main` entry point. [#194](https://github.com/moment/moment-timezone/pull/194)
+* Added `composer.json`. [#222](https://github.com/moment/moment-timezone/pull/222)
+* Added an error message when trying to load moment-timezone twice. [#212](https://github.com/moment/moment-timezone/pull/212)
+
+### `0.3.1` _2015-03-16_
+* Updated data to IANA TZDB `2015a`. [#183](https://github.com/moment/moment-timezone/pull/183)
+
+### `0.3.0` _2015-01-13_
+
+* *Breaking:* Added country data to the `meta/*.json` files. Restructured the data to support multiple countries per zone. [#162](https://github.com/moment/moment-timezone/pull/162)
+* Added the ability to set a default timezone for all new moments. [#152](https://github.com/moment/moment-timezone/pull/152)
+* Fixed a bug when passing a moment with an offset to `moment.tz`. [#169](https://github.com/moment/moment-timezone/pull/169)
+* Fixed a deprecation in moment core, changing `moment#zone` to `moment#utcOffset`. [#168](https://github.com/moment/moment-timezone/pull/168)
+
+### `0.2.5` _2014-11-12_
+* Updated data to IANA TZDB `2014j`. [#151](https://github.com/moment/moment-timezone/pull/151)
+
+### `0.2.4` _2014-10-20_
+* Updated data to IANA TZDB `2014i`. [#142](https://github.com/moment/moment-timezone/pull/142)
+
+### `0.2.3` _2014-10-20_
+* Updated data to IANA TZDB `2014h`. [#141](https://github.com/moment/moment-timezone/pull/141)
+
+### `0.2.2` _2014-09-04_
+* Updated data to IANA TZDB `2014g`. [#126](https://github.com/moment/moment-timezone/pull/126)
+* Added a warning when using `moment-timezone` with `moment<2.6.0`.
+
+### `0.2.1` _2014-08-02_
+* Fixed support for `moment@2.8.1+`.
+
+### `0.2.0` _2014-07-21_
+* Added the ability to configure whether ambiguous or invalid input is rolled forward or backward. [#101](https://github.com/moment/moment-timezone/pull/101)
+* Added `moment>=2.6.0` as a dependency in `bower.json`. [#107](https://github.com/moment/moment-timezone/issues/107)
+* Fixed getting the name of a zone that was added as a linked zone. [#104](https://github.com/moment/moment-timezone/pull/104)
+* Added an error message when a zone was not loaded. [#106](https://github.com/moment/moment-timezone/issues/106)
+
+### `0.1.0` _2014-06-23_
+* *Breaking:* Changed data format from Zones+Rules to just Zones. [#82](https://github.com/moment/moment-timezone/pull/82)
+* *Breaking:* Removed `moment.tz.{addRule,addZone,zoneExists,zones}` as they are no longer relevant with the new data format.
+* Made library 20x faster. [JSPerf results](http://jsperf.com/moment-timezone-0-1-0/2)
+* Completely rewrote internals to support new data format.
+* Updated the data collection process to get data directly from http://www.iana.org/time-zones.
+* Updated data to IANA TZDB `2014e`.
+* Updated `bower.json` to use a browser specific `main:` entry point.
+* Added built files with included data.
+* Added support for accurately parsing input around DST changes. [#93](https://github.com/moment/moment-timezone/pull/93)
+* Added comprehensive documentation at [momentjs.com/timezone/docs/](http://momentjs.com/timezone/docs/).
+* Added `moment.tz.link` for linking two identical zones.
+* Added `moment.tz.zone` for getting a loaded zone.
+* Added `moment.tz.load` for loading a bundled version of data from the IANA TZDB.
+* Added `moment.tz.names` for getting the names of all the loaded timezones.
+* Added `moment.tz.unpack` and `moment.tz.unpackBase60` for unpacking data.
+* Added `moment-timezone-utils.js` for working with the packed and unpacked data.
+* Fixed major memory leak. [#79](https://github.com/moment/moment-timezone/issues/79)
+* Fixed global export to allow use in web workers. [#78](https://github.com/moment/moment-timezone/pull/78)
+* Fixed global export in browser environments that define `window.module`. [#76](https://github.com/moment/moment-timezone/pull/76)
+
+### `0.0.6` _2014-04-20_
+* Fixed issue with preventing loading moment-timezone more than once. [#75](https://github.com/moment/moment-timezone/pull/75)
+
+### `0.0.5` _2014-04-17_
+* Improved performance with memoization. [#39](https://github.com/moment/moment-timezone/issues/39)
+* Published only necessary files to npm. [#46](https://github.com/moment/moment-timezone/issues/46)
+* Added better handling of timezones around DST. [#53](https://github.com/moment/moment-timezone/issues/53) [#61](https://github.com/moment/moment-timezone/issues/61) [#70](https://github.com/moment/moment-timezone/issues/70)
+* Added Browserify support. [#41](https://github.com/moment/moment-timezone/issues/41)
+* Added `moment.tz.zoneExists` [#73](https://github.com/moment/moment-timezone/issues/73)
+* Fixed cloning moments with a timezone. [#71](https://github.com/moment/moment-timezone/issues/71)
+* Prevent loading moment-timezone more than once. [#74](https://github.com/moment/moment-timezone/issues/74)
+
+### `0.0.3` _2013-10-10_
+* Added Bower support.
+* Added support for newer versions of moment.
+* Added support for constructing a moment with a string and zone.
+* Added more links and timezone names in moment-timezone.json
+
+### `0.0.1` _2013-07-17_
+* Initial version.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/composer.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/composer.json
new file mode 100644
index 00000000000..ae847d62bc4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/composer.json
@@ -0,0 +1,43 @@
+{
+ "name": "moment/moment-timezone",
+ "description": "Parse and display dates in any timezone",
+ "version": "0.5.17",
+ "keywords": [
+ "moment",
+ "date",
+ "time",
+ "timezone",
+ "olson",
+ "iana",
+ "zone",
+ "tz"
+ ],
+ "homepage": "http://momentjs.com/timezone/",
+ "license": "MIT",
+ "support": {
+ "issues": "https://github.com/moment/moment-timezone/issues",
+ "source": "https://github.com/moment/moment-timezone"
+ },
+ "authors": [
+ {
+ "name": "Tim Wood",
+ "email": "washwithcare@gmail.com",
+ "homepage": "http://timwoodcreates.com/"
+ }
+ ],
+ "type": "component",
+ "require": {
+ "robloach/component-installer": "*",
+ "moment/moment": ">=2.9.0"
+ },
+ "extra": {
+ "component": {
+ "scripts": [
+ "moment-timezone.js"
+ ],
+ "files": [
+ "builds/*.js"
+ ]
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/data/meta/latest.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/data/meta/latest.json
new file mode 100644
index 00000000000..d57ed80af97
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/data/meta/latest.json
@@ -0,0 +1,5118 @@
+{
+ "countries": {
+ "AD": {
+ "name": "Andorra",
+ "abbr": "AD",
+ "zones": [
+ "Europe/Andorra"
+ ]
+ },
+ "AE": {
+ "name": "United Arab Emirates",
+ "abbr": "AE",
+ "zones": [
+ "Asia/Dubai"
+ ]
+ },
+ "AF": {
+ "name": "Afghanistan",
+ "abbr": "AF",
+ "zones": [
+ "Asia/Kabul"
+ ]
+ },
+ "AG": {
+ "name": "Antigua & Barbuda",
+ "abbr": "AG",
+ "zones": [
+ "America/Port_of_Spain"
+ ]
+ },
+ "AI": {
+ "name": "Anguilla",
+ "abbr": "AI",
+ "zones": [
+ "America/Port_of_Spain"
+ ]
+ },
+ "AL": {
+ "name": "Albania",
+ "abbr": "AL",
+ "zones": [
+ "Europe/Tirane"
+ ]
+ },
+ "AM": {
+ "name": "Armenia",
+ "abbr": "AM",
+ "zones": [
+ "Asia/Yerevan"
+ ]
+ },
+ "AO": {
+ "name": "Angola",
+ "abbr": "AO",
+ "zones": [
+ "Africa/Lagos"
+ ]
+ },
+ "AQ": {
+ "name": "Antarctica",
+ "abbr": "AQ",
+ "zones": [
+ "Antarctica/Casey",
+ "Antarctica/Davis",
+ "Antarctica/DumontDUrville",
+ "Antarctica/Mawson",
+ "Antarctica/Palmer",
+ "Antarctica/Rothera",
+ "Antarctica/Syowa",
+ "Antarctica/Troll",
+ "Antarctica/Vostok",
+ "Pacific/Auckland"
+ ]
+ },
+ "AR": {
+ "name": "Argentina",
+ "abbr": "AR",
+ "zones": [
+ "America/Argentina/Buenos_Aires",
+ "America/Argentina/Cordoba",
+ "America/Argentina/Salta",
+ "America/Argentina/Jujuy",
+ "America/Argentina/Tucuman",
+ "America/Argentina/Catamarca",
+ "America/Argentina/La_Rioja",
+ "America/Argentina/San_Juan",
+ "America/Argentina/Mendoza",
+ "America/Argentina/San_Luis",
+ "America/Argentina/Rio_Gallegos",
+ "America/Argentina/Ushuaia"
+ ]
+ },
+ "AS": {
+ "name": "Samoa (American)",
+ "abbr": "AS",
+ "zones": [
+ "Pacific/Pago_Pago"
+ ]
+ },
+ "AT": {
+ "name": "Austria",
+ "abbr": "AT",
+ "zones": [
+ "Europe/Vienna"
+ ]
+ },
+ "AU": {
+ "name": "Australia",
+ "abbr": "AU",
+ "zones": [
+ "Australia/Lord_Howe",
+ "Antarctica/Macquarie",
+ "Australia/Hobart",
+ "Australia/Currie",
+ "Australia/Melbourne",
+ "Australia/Sydney",
+ "Australia/Broken_Hill",
+ "Australia/Brisbane",
+ "Australia/Lindeman",
+ "Australia/Adelaide",
+ "Australia/Darwin",
+ "Australia/Perth",
+ "Australia/Eucla"
+ ]
+ },
+ "AW": {
+ "name": "Aruba",
+ "abbr": "AW",
+ "zones": [
+ "America/Curacao"
+ ]
+ },
+ "AX": {
+ "name": "Åland Islands",
+ "abbr": "AX",
+ "zones": [
+ "Europe/Helsinki"
+ ]
+ },
+ "AZ": {
+ "name": "Azerbaijan",
+ "abbr": "AZ",
+ "zones": [
+ "Asia/Baku"
+ ]
+ },
+ "BA": {
+ "name": "Bosnia & Herzegovina",
+ "abbr": "BA",
+ "zones": [
+ "Europe/Belgrade"
+ ]
+ },
+ "BB": {
+ "name": "Barbados",
+ "abbr": "BB",
+ "zones": [
+ "America/Barbados"
+ ]
+ },
+ "BD": {
+ "name": "Bangladesh",
+ "abbr": "BD",
+ "zones": [
+ "Asia/Dhaka"
+ ]
+ },
+ "BE": {
+ "name": "Belgium",
+ "abbr": "BE",
+ "zones": [
+ "Europe/Brussels"
+ ]
+ },
+ "BF": {
+ "name": "Burkina Faso",
+ "abbr": "BF",
+ "zones": [
+ "Africa/Abidjan"
+ ]
+ },
+ "BG": {
+ "name": "Bulgaria",
+ "abbr": "BG",
+ "zones": [
+ "Europe/Sofia"
+ ]
+ },
+ "BH": {
+ "name": "Bahrain",
+ "abbr": "BH",
+ "zones": [
+ "Asia/Qatar"
+ ]
+ },
+ "BI": {
+ "name": "Burundi",
+ "abbr": "BI",
+ "zones": [
+ "Africa/Maputo"
+ ]
+ },
+ "BJ": {
+ "name": "Benin",
+ "abbr": "BJ",
+ "zones": [
+ "Africa/Lagos"
+ ]
+ },
+ "BL": {
+ "name": "St Barthelemy",
+ "abbr": "BL",
+ "zones": [
+ "America/Port_of_Spain"
+ ]
+ },
+ "BM": {
+ "name": "Bermuda",
+ "abbr": "BM",
+ "zones": [
+ "Atlantic/Bermuda"
+ ]
+ },
+ "BN": {
+ "name": "Brunei",
+ "abbr": "BN",
+ "zones": [
+ "Asia/Brunei"
+ ]
+ },
+ "BO": {
+ "name": "Bolivia",
+ "abbr": "BO",
+ "zones": [
+ "America/La_Paz"
+ ]
+ },
+ "BQ": {
+ "name": "Caribbean NL",
+ "abbr": "BQ",
+ "zones": [
+ "America/Curacao"
+ ]
+ },
+ "BR": {
+ "name": "Brazil",
+ "abbr": "BR",
+ "zones": [
+ "America/Noronha",
+ "America/Belem",
+ "America/Fortaleza",
+ "America/Recife",
+ "America/Araguaina",
+ "America/Maceio",
+ "America/Bahia",
+ "America/Sao_Paulo",
+ "America/Campo_Grande",
+ "America/Cuiaba",
+ "America/Santarem",
+ "America/Porto_Velho",
+ "America/Boa_Vista",
+ "America/Manaus",
+ "America/Eirunepe",
+ "America/Rio_Branco"
+ ]
+ },
+ "BS": {
+ "name": "Bahamas",
+ "abbr": "BS",
+ "zones": [
+ "America/Nassau"
+ ]
+ },
+ "BT": {
+ "name": "Bhutan",
+ "abbr": "BT",
+ "zones": [
+ "Asia/Thimphu"
+ ]
+ },
+ "BW": {
+ "name": "Botswana",
+ "abbr": "BW",
+ "zones": [
+ "Africa/Maputo"
+ ]
+ },
+ "BY": {
+ "name": "Belarus",
+ "abbr": "BY",
+ "zones": [
+ "Europe/Minsk"
+ ]
+ },
+ "BZ": {
+ "name": "Belize",
+ "abbr": "BZ",
+ "zones": [
+ "America/Belize"
+ ]
+ },
+ "CA": {
+ "name": "Canada",
+ "abbr": "CA",
+ "zones": [
+ "America/St_Johns",
+ "America/Halifax",
+ "America/Glace_Bay",
+ "America/Moncton",
+ "America/Goose_Bay",
+ "America/Blanc-Sablon",
+ "America/Toronto",
+ "America/Nipigon",
+ "America/Thunder_Bay",
+ "America/Iqaluit",
+ "America/Pangnirtung",
+ "America/Atikokan",
+ "America/Winnipeg",
+ "America/Rainy_River",
+ "America/Resolute",
+ "America/Rankin_Inlet",
+ "America/Regina",
+ "America/Swift_Current",
+ "America/Edmonton",
+ "America/Cambridge_Bay",
+ "America/Yellowknife",
+ "America/Inuvik",
+ "America/Creston",
+ "America/Dawson_Creek",
+ "America/Fort_Nelson",
+ "America/Vancouver",
+ "America/Whitehorse",
+ "America/Dawson"
+ ]
+ },
+ "CC": {
+ "name": "Cocos (Keeling) Islands",
+ "abbr": "CC",
+ "zones": [
+ "Indian/Cocos"
+ ]
+ },
+ "CD": {
+ "name": "Congo (Dem. Rep.)",
+ "abbr": "CD",
+ "zones": [
+ "Africa/Maputo",
+ "Africa/Lagos"
+ ]
+ },
+ "CF": {
+ "name": "Central African Rep.",
+ "abbr": "CF",
+ "zones": [
+ "Africa/Lagos"
+ ]
+ },
+ "CG": {
+ "name": "Congo (Rep.)",
+ "abbr": "CG",
+ "zones": [
+ "Africa/Lagos"
+ ]
+ },
+ "CH": {
+ "name": "Switzerland",
+ "abbr": "CH",
+ "zones": [
+ "Europe/Zurich"
+ ]
+ },
+ "CI": {
+ "name": "Côte d'Ivoire",
+ "abbr": "CI",
+ "zones": [
+ "Africa/Abidjan"
+ ]
+ },
+ "CK": {
+ "name": "Cook Islands",
+ "abbr": "CK",
+ "zones": [
+ "Pacific/Rarotonga"
+ ]
+ },
+ "CL": {
+ "name": "Chile",
+ "abbr": "CL",
+ "zones": [
+ "America/Santiago",
+ "America/Punta_Arenas",
+ "Pacific/Easter"
+ ]
+ },
+ "CM": {
+ "name": "Cameroon",
+ "abbr": "CM",
+ "zones": [
+ "Africa/Lagos"
+ ]
+ },
+ "CN": {
+ "name": "China",
+ "abbr": "CN",
+ "zones": [
+ "Asia/Shanghai",
+ "Asia/Urumqi"
+ ]
+ },
+ "CO": {
+ "name": "Colombia",
+ "abbr": "CO",
+ "zones": [
+ "America/Bogota"
+ ]
+ },
+ "CR": {
+ "name": "Costa Rica",
+ "abbr": "CR",
+ "zones": [
+ "America/Costa_Rica"
+ ]
+ },
+ "CU": {
+ "name": "Cuba",
+ "abbr": "CU",
+ "zones": [
+ "America/Havana"
+ ]
+ },
+ "CV": {
+ "name": "Cape Verde",
+ "abbr": "CV",
+ "zones": [
+ "Atlantic/Cape_Verde"
+ ]
+ },
+ "CW": {
+ "name": "Curaçao",
+ "abbr": "CW",
+ "zones": [
+ "America/Curacao"
+ ]
+ },
+ "CX": {
+ "name": "Christmas Island",
+ "abbr": "CX",
+ "zones": [
+ "Indian/Christmas"
+ ]
+ },
+ "CY": {
+ "name": "Cyprus",
+ "abbr": "CY",
+ "zones": [
+ "Asia/Nicosia",
+ "Asia/Famagusta"
+ ]
+ },
+ "CZ": {
+ "name": "Czech Republic",
+ "abbr": "CZ",
+ "zones": [
+ "Europe/Prague"
+ ]
+ },
+ "DE": {
+ "name": "Germany",
+ "abbr": "DE",
+ "zones": [
+ "Europe/Zurich",
+ "Europe/Berlin"
+ ]
+ },
+ "DJ": {
+ "name": "Djibouti",
+ "abbr": "DJ",
+ "zones": [
+ "Africa/Nairobi"
+ ]
+ },
+ "DK": {
+ "name": "Denmark",
+ "abbr": "DK",
+ "zones": [
+ "Europe/Copenhagen"
+ ]
+ },
+ "DM": {
+ "name": "Dominica",
+ "abbr": "DM",
+ "zones": [
+ "America/Port_of_Spain"
+ ]
+ },
+ "DO": {
+ "name": "Dominican Republic",
+ "abbr": "DO",
+ "zones": [
+ "America/Santo_Domingo"
+ ]
+ },
+ "DZ": {
+ "name": "Algeria",
+ "abbr": "DZ",
+ "zones": [
+ "Africa/Algiers"
+ ]
+ },
+ "EC": {
+ "name": "Ecuador",
+ "abbr": "EC",
+ "zones": [
+ "America/Guayaquil",
+ "Pacific/Galapagos"
+ ]
+ },
+ "EE": {
+ "name": "Estonia",
+ "abbr": "EE",
+ "zones": [
+ "Europe/Tallinn"
+ ]
+ },
+ "EG": {
+ "name": "Egypt",
+ "abbr": "EG",
+ "zones": [
+ "Africa/Cairo"
+ ]
+ },
+ "EH": {
+ "name": "Western Sahara",
+ "abbr": "EH",
+ "zones": [
+ "Africa/El_Aaiun"
+ ]
+ },
+ "ER": {
+ "name": "Eritrea",
+ "abbr": "ER",
+ "zones": [
+ "Africa/Nairobi"
+ ]
+ },
+ "ES": {
+ "name": "Spain",
+ "abbr": "ES",
+ "zones": [
+ "Europe/Madrid",
+ "Africa/Ceuta",
+ "Atlantic/Canary"
+ ]
+ },
+ "ET": {
+ "name": "Ethiopia",
+ "abbr": "ET",
+ "zones": [
+ "Africa/Nairobi"
+ ]
+ },
+ "FI": {
+ "name": "Finland",
+ "abbr": "FI",
+ "zones": [
+ "Europe/Helsinki"
+ ]
+ },
+ "FJ": {
+ "name": "Fiji",
+ "abbr": "FJ",
+ "zones": [
+ "Pacific/Fiji"
+ ]
+ },
+ "FK": {
+ "name": "Falkland Islands",
+ "abbr": "FK",
+ "zones": [
+ "Atlantic/Stanley"
+ ]
+ },
+ "FM": {
+ "name": "Micronesia",
+ "abbr": "FM",
+ "zones": [
+ "Pacific/Chuuk",
+ "Pacific/Pohnpei",
+ "Pacific/Kosrae"
+ ]
+ },
+ "FO": {
+ "name": "Faroe Islands",
+ "abbr": "FO",
+ "zones": [
+ "Atlantic/Faroe"
+ ]
+ },
+ "FR": {
+ "name": "France",
+ "abbr": "FR",
+ "zones": [
+ "Europe/Paris"
+ ]
+ },
+ "GA": {
+ "name": "Gabon",
+ "abbr": "GA",
+ "zones": [
+ "Africa/Lagos"
+ ]
+ },
+ "GB": {
+ "name": "Britain (UK)",
+ "abbr": "GB",
+ "zones": [
+ "Europe/London"
+ ]
+ },
+ "GD": {
+ "name": "Grenada",
+ "abbr": "GD",
+ "zones": [
+ "America/Port_of_Spain"
+ ]
+ },
+ "GE": {
+ "name": "Georgia",
+ "abbr": "GE",
+ "zones": [
+ "Asia/Tbilisi"
+ ]
+ },
+ "GF": {
+ "name": "French Guiana",
+ "abbr": "GF",
+ "zones": [
+ "America/Cayenne"
+ ]
+ },
+ "GG": {
+ "name": "Guernsey",
+ "abbr": "GG",
+ "zones": [
+ "Europe/London"
+ ]
+ },
+ "GH": {
+ "name": "Ghana",
+ "abbr": "GH",
+ "zones": [
+ "Africa/Accra"
+ ]
+ },
+ "GI": {
+ "name": "Gibraltar",
+ "abbr": "GI",
+ "zones": [
+ "Europe/Gibraltar"
+ ]
+ },
+ "GL": {
+ "name": "Greenland",
+ "abbr": "GL",
+ "zones": [
+ "America/Godthab",
+ "America/Danmarkshavn",
+ "America/Scoresbysund",
+ "America/Thule"
+ ]
+ },
+ "GM": {
+ "name": "Gambia",
+ "abbr": "GM",
+ "zones": [
+ "Africa/Abidjan"
+ ]
+ },
+ "GN": {
+ "name": "Guinea",
+ "abbr": "GN",
+ "zones": [
+ "Africa/Abidjan"
+ ]
+ },
+ "GP": {
+ "name": "Guadeloupe",
+ "abbr": "GP",
+ "zones": [
+ "America/Port_of_Spain"
+ ]
+ },
+ "GQ": {
+ "name": "Equatorial Guinea",
+ "abbr": "GQ",
+ "zones": [
+ "Africa/Lagos"
+ ]
+ },
+ "GR": {
+ "name": "Greece",
+ "abbr": "GR",
+ "zones": [
+ "Europe/Athens"
+ ]
+ },
+ "GS": {
+ "name": "South Georgia & the South Sandwich Islands",
+ "abbr": "GS",
+ "zones": [
+ "Atlantic/South_Georgia"
+ ]
+ },
+ "GT": {
+ "name": "Guatemala",
+ "abbr": "GT",
+ "zones": [
+ "America/Guatemala"
+ ]
+ },
+ "GU": {
+ "name": "Guam",
+ "abbr": "GU",
+ "zones": [
+ "Pacific/Guam"
+ ]
+ },
+ "GW": {
+ "name": "Guinea-Bissau",
+ "abbr": "GW",
+ "zones": [
+ "Africa/Bissau"
+ ]
+ },
+ "GY": {
+ "name": "Guyana",
+ "abbr": "GY",
+ "zones": [
+ "America/Guyana"
+ ]
+ },
+ "HK": {
+ "name": "Hong Kong",
+ "abbr": "HK",
+ "zones": [
+ "Asia/Hong_Kong"
+ ]
+ },
+ "HN": {
+ "name": "Honduras",
+ "abbr": "HN",
+ "zones": [
+ "America/Tegucigalpa"
+ ]
+ },
+ "HR": {
+ "name": "Croatia",
+ "abbr": "HR",
+ "zones": [
+ "Europe/Belgrade"
+ ]
+ },
+ "HT": {
+ "name": "Haiti",
+ "abbr": "HT",
+ "zones": [
+ "America/Port-au-Prince"
+ ]
+ },
+ "HU": {
+ "name": "Hungary",
+ "abbr": "HU",
+ "zones": [
+ "Europe/Budapest"
+ ]
+ },
+ "ID": {
+ "name": "Indonesia",
+ "abbr": "ID",
+ "zones": [
+ "Asia/Jakarta",
+ "Asia/Pontianak",
+ "Asia/Makassar",
+ "Asia/Jayapura"
+ ]
+ },
+ "IE": {
+ "name": "Ireland",
+ "abbr": "IE",
+ "zones": [
+ "Europe/Dublin"
+ ]
+ },
+ "IL": {
+ "name": "Israel",
+ "abbr": "IL",
+ "zones": [
+ "Asia/Jerusalem"
+ ]
+ },
+ "IM": {
+ "name": "Isle of Man",
+ "abbr": "IM",
+ "zones": [
+ "Europe/London"
+ ]
+ },
+ "IN": {
+ "name": "India",
+ "abbr": "IN",
+ "zones": [
+ "Asia/Kolkata"
+ ]
+ },
+ "IO": {
+ "name": "British Indian Ocean Territory",
+ "abbr": "IO",
+ "zones": [
+ "Indian/Chagos"
+ ]
+ },
+ "IQ": {
+ "name": "Iraq",
+ "abbr": "IQ",
+ "zones": [
+ "Asia/Baghdad"
+ ]
+ },
+ "IR": {
+ "name": "Iran",
+ "abbr": "IR",
+ "zones": [
+ "Asia/Tehran"
+ ]
+ },
+ "IS": {
+ "name": "Iceland",
+ "abbr": "IS",
+ "zones": [
+ "Atlantic/Reykjavik"
+ ]
+ },
+ "IT": {
+ "name": "Italy",
+ "abbr": "IT",
+ "zones": [
+ "Europe/Rome"
+ ]
+ },
+ "JE": {
+ "name": "Jersey",
+ "abbr": "JE",
+ "zones": [
+ "Europe/London"
+ ]
+ },
+ "JM": {
+ "name": "Jamaica",
+ "abbr": "JM",
+ "zones": [
+ "America/Jamaica"
+ ]
+ },
+ "JO": {
+ "name": "Jordan",
+ "abbr": "JO",
+ "zones": [
+ "Asia/Amman"
+ ]
+ },
+ "JP": {
+ "name": "Japan",
+ "abbr": "JP",
+ "zones": [
+ "Asia/Tokyo"
+ ]
+ },
+ "KE": {
+ "name": "Kenya",
+ "abbr": "KE",
+ "zones": [
+ "Africa/Nairobi"
+ ]
+ },
+ "KG": {
+ "name": "Kyrgyzstan",
+ "abbr": "KG",
+ "zones": [
+ "Asia/Bishkek"
+ ]
+ },
+ "KH": {
+ "name": "Cambodia",
+ "abbr": "KH",
+ "zones": [
+ "Asia/Bangkok"
+ ]
+ },
+ "KI": {
+ "name": "Kiribati",
+ "abbr": "KI",
+ "zones": [
+ "Pacific/Tarawa",
+ "Pacific/Enderbury",
+ "Pacific/Kiritimati"
+ ]
+ },
+ "KM": {
+ "name": "Comoros",
+ "abbr": "KM",
+ "zones": [
+ "Africa/Nairobi"
+ ]
+ },
+ "KN": {
+ "name": "St Kitts & Nevis",
+ "abbr": "KN",
+ "zones": [
+ "America/Port_of_Spain"
+ ]
+ },
+ "KP": {
+ "name": "Korea (North)",
+ "abbr": "KP",
+ "zones": [
+ "Asia/Pyongyang"
+ ]
+ },
+ "KR": {
+ "name": "Korea (South)",
+ "abbr": "KR",
+ "zones": [
+ "Asia/Seoul"
+ ]
+ },
+ "KW": {
+ "name": "Kuwait",
+ "abbr": "KW",
+ "zones": [
+ "Asia/Riyadh"
+ ]
+ },
+ "KY": {
+ "name": "Cayman Islands",
+ "abbr": "KY",
+ "zones": [
+ "America/Panama"
+ ]
+ },
+ "KZ": {
+ "name": "Kazakhstan",
+ "abbr": "KZ",
+ "zones": [
+ "Asia/Almaty",
+ "Asia/Qyzylorda",
+ "Asia/Aqtobe",
+ "Asia/Aqtau",
+ "Asia/Atyrau",
+ "Asia/Oral"
+ ]
+ },
+ "LA": {
+ "name": "Laos",
+ "abbr": "LA",
+ "zones": [
+ "Asia/Bangkok"
+ ]
+ },
+ "LB": {
+ "name": "Lebanon",
+ "abbr": "LB",
+ "zones": [
+ "Asia/Beirut"
+ ]
+ },
+ "LC": {
+ "name": "St Lucia",
+ "abbr": "LC",
+ "zones": [
+ "America/Port_of_Spain"
+ ]
+ },
+ "LI": {
+ "name": "Liechtenstein",
+ "abbr": "LI",
+ "zones": [
+ "Europe/Zurich"
+ ]
+ },
+ "LK": {
+ "name": "Sri Lanka",
+ "abbr": "LK",
+ "zones": [
+ "Asia/Colombo"
+ ]
+ },
+ "LR": {
+ "name": "Liberia",
+ "abbr": "LR",
+ "zones": [
+ "Africa/Monrovia"
+ ]
+ },
+ "LS": {
+ "name": "Lesotho",
+ "abbr": "LS",
+ "zones": [
+ "Africa/Johannesburg"
+ ]
+ },
+ "LT": {
+ "name": "Lithuania",
+ "abbr": "LT",
+ "zones": [
+ "Europe/Vilnius"
+ ]
+ },
+ "LU": {
+ "name": "Luxembourg",
+ "abbr": "LU",
+ "zones": [
+ "Europe/Luxembourg"
+ ]
+ },
+ "LV": {
+ "name": "Latvia",
+ "abbr": "LV",
+ "zones": [
+ "Europe/Riga"
+ ]
+ },
+ "LY": {
+ "name": "Libya",
+ "abbr": "LY",
+ "zones": [
+ "Africa/Tripoli"
+ ]
+ },
+ "MA": {
+ "name": "Morocco",
+ "abbr": "MA",
+ "zones": [
+ "Africa/Casablanca"
+ ]
+ },
+ "MC": {
+ "name": "Monaco",
+ "abbr": "MC",
+ "zones": [
+ "Europe/Monaco"
+ ]
+ },
+ "MD": {
+ "name": "Moldova",
+ "abbr": "MD",
+ "zones": [
+ "Europe/Chisinau"
+ ]
+ },
+ "ME": {
+ "name": "Montenegro",
+ "abbr": "ME",
+ "zones": [
+ "Europe/Belgrade"
+ ]
+ },
+ "MF": {
+ "name": "St Martin (French)",
+ "abbr": "MF",
+ "zones": [
+ "America/Port_of_Spain"
+ ]
+ },
+ "MG": {
+ "name": "Madagascar",
+ "abbr": "MG",
+ "zones": [
+ "Africa/Nairobi"
+ ]
+ },
+ "MH": {
+ "name": "Marshall Islands",
+ "abbr": "MH",
+ "zones": [
+ "Pacific/Majuro",
+ "Pacific/Kwajalein"
+ ]
+ },
+ "MK": {
+ "name": "Macedonia",
+ "abbr": "MK",
+ "zones": [
+ "Europe/Belgrade"
+ ]
+ },
+ "ML": {
+ "name": "Mali",
+ "abbr": "ML",
+ "zones": [
+ "Africa/Abidjan"
+ ]
+ },
+ "MM": {
+ "name": "Myanmar (Burma)",
+ "abbr": "MM",
+ "zones": [
+ "Asia/Yangon"
+ ]
+ },
+ "MN": {
+ "name": "Mongolia",
+ "abbr": "MN",
+ "zones": [
+ "Asia/Ulaanbaatar",
+ "Asia/Hovd",
+ "Asia/Choibalsan"
+ ]
+ },
+ "MO": {
+ "name": "Macau",
+ "abbr": "MO",
+ "zones": [
+ "Asia/Macau"
+ ]
+ },
+ "MP": {
+ "name": "Northern Mariana Islands",
+ "abbr": "MP",
+ "zones": [
+ "Pacific/Guam"
+ ]
+ },
+ "MQ": {
+ "name": "Martinique",
+ "abbr": "MQ",
+ "zones": [
+ "America/Martinique"
+ ]
+ },
+ "MR": {
+ "name": "Mauritania",
+ "abbr": "MR",
+ "zones": [
+ "Africa/Abidjan"
+ ]
+ },
+ "MS": {
+ "name": "Montserrat",
+ "abbr": "MS",
+ "zones": [
+ "America/Port_of_Spain"
+ ]
+ },
+ "MT": {
+ "name": "Malta",
+ "abbr": "MT",
+ "zones": [
+ "Europe/Malta"
+ ]
+ },
+ "MU": {
+ "name": "Mauritius",
+ "abbr": "MU",
+ "zones": [
+ "Indian/Mauritius"
+ ]
+ },
+ "MV": {
+ "name": "Maldives",
+ "abbr": "MV",
+ "zones": [
+ "Indian/Maldives"
+ ]
+ },
+ "MW": {
+ "name": "Malawi",
+ "abbr": "MW",
+ "zones": [
+ "Africa/Maputo"
+ ]
+ },
+ "MX": {
+ "name": "Mexico",
+ "abbr": "MX",
+ "zones": [
+ "America/Mexico_City",
+ "America/Cancun",
+ "America/Merida",
+ "America/Monterrey",
+ "America/Matamoros",
+ "America/Mazatlan",
+ "America/Chihuahua",
+ "America/Ojinaga",
+ "America/Hermosillo",
+ "America/Tijuana",
+ "America/Bahia_Banderas"
+ ]
+ },
+ "MY": {
+ "name": "Malaysia",
+ "abbr": "MY",
+ "zones": [
+ "Asia/Kuala_Lumpur",
+ "Asia/Kuching"
+ ]
+ },
+ "MZ": {
+ "name": "Mozambique",
+ "abbr": "MZ",
+ "zones": [
+ "Africa/Maputo"
+ ]
+ },
+ "NA": {
+ "name": "Namibia",
+ "abbr": "NA",
+ "zones": [
+ "Africa/Windhoek"
+ ]
+ },
+ "NC": {
+ "name": "New Caledonia",
+ "abbr": "NC",
+ "zones": [
+ "Pacific/Noumea"
+ ]
+ },
+ "NE": {
+ "name": "Niger",
+ "abbr": "NE",
+ "zones": [
+ "Africa/Lagos"
+ ]
+ },
+ "NF": {
+ "name": "Norfolk Island",
+ "abbr": "NF",
+ "zones": [
+ "Pacific/Norfolk"
+ ]
+ },
+ "NG": {
+ "name": "Nigeria",
+ "abbr": "NG",
+ "zones": [
+ "Africa/Lagos"
+ ]
+ },
+ "NI": {
+ "name": "Nicaragua",
+ "abbr": "NI",
+ "zones": [
+ "America/Managua"
+ ]
+ },
+ "NL": {
+ "name": "Netherlands",
+ "abbr": "NL",
+ "zones": [
+ "Europe/Amsterdam"
+ ]
+ },
+ "NO": {
+ "name": "Norway",
+ "abbr": "NO",
+ "zones": [
+ "Europe/Oslo"
+ ]
+ },
+ "NP": {
+ "name": "Nepal",
+ "abbr": "NP",
+ "zones": [
+ "Asia/Kathmandu"
+ ]
+ },
+ "NR": {
+ "name": "Nauru",
+ "abbr": "NR",
+ "zones": [
+ "Pacific/Nauru"
+ ]
+ },
+ "NU": {
+ "name": "Niue",
+ "abbr": "NU",
+ "zones": [
+ "Pacific/Niue"
+ ]
+ },
+ "NZ": {
+ "name": "New Zealand",
+ "abbr": "NZ",
+ "zones": [
+ "Pacific/Auckland",
+ "Pacific/Chatham"
+ ]
+ },
+ "OM": {
+ "name": "Oman",
+ "abbr": "OM",
+ "zones": [
+ "Asia/Dubai"
+ ]
+ },
+ "PA": {
+ "name": "Panama",
+ "abbr": "PA",
+ "zones": [
+ "America/Panama"
+ ]
+ },
+ "PE": {
+ "name": "Peru",
+ "abbr": "PE",
+ "zones": [
+ "America/Lima"
+ ]
+ },
+ "PF": {
+ "name": "French Polynesia",
+ "abbr": "PF",
+ "zones": [
+ "Pacific/Tahiti",
+ "Pacific/Marquesas",
+ "Pacific/Gambier"
+ ]
+ },
+ "PG": {
+ "name": "Papua New Guinea",
+ "abbr": "PG",
+ "zones": [
+ "Pacific/Port_Moresby",
+ "Pacific/Bougainville"
+ ]
+ },
+ "PH": {
+ "name": "Philippines",
+ "abbr": "PH",
+ "zones": [
+ "Asia/Manila"
+ ]
+ },
+ "PK": {
+ "name": "Pakistan",
+ "abbr": "PK",
+ "zones": [
+ "Asia/Karachi"
+ ]
+ },
+ "PL": {
+ "name": "Poland",
+ "abbr": "PL",
+ "zones": [
+ "Europe/Warsaw"
+ ]
+ },
+ "PM": {
+ "name": "St Pierre & Miquelon",
+ "abbr": "PM",
+ "zones": [
+ "America/Miquelon"
+ ]
+ },
+ "PN": {
+ "name": "Pitcairn",
+ "abbr": "PN",
+ "zones": [
+ "Pacific/Pitcairn"
+ ]
+ },
+ "PR": {
+ "name": "Puerto Rico",
+ "abbr": "PR",
+ "zones": [
+ "America/Puerto_Rico"
+ ]
+ },
+ "PS": {
+ "name": "Palestine",
+ "abbr": "PS",
+ "zones": [
+ "Asia/Gaza",
+ "Asia/Hebron"
+ ]
+ },
+ "PT": {
+ "name": "Portugal",
+ "abbr": "PT",
+ "zones": [
+ "Europe/Lisbon",
+ "Atlantic/Madeira",
+ "Atlantic/Azores"
+ ]
+ },
+ "PW": {
+ "name": "Palau",
+ "abbr": "PW",
+ "zones": [
+ "Pacific/Palau"
+ ]
+ },
+ "PY": {
+ "name": "Paraguay",
+ "abbr": "PY",
+ "zones": [
+ "America/Asuncion"
+ ]
+ },
+ "QA": {
+ "name": "Qatar",
+ "abbr": "QA",
+ "zones": [
+ "Asia/Qatar"
+ ]
+ },
+ "RE": {
+ "name": "Réunion",
+ "abbr": "RE",
+ "zones": [
+ "Indian/Reunion"
+ ]
+ },
+ "RO": {
+ "name": "Romania",
+ "abbr": "RO",
+ "zones": [
+ "Europe/Bucharest"
+ ]
+ },
+ "RS": {
+ "name": "Serbia",
+ "abbr": "RS",
+ "zones": [
+ "Europe/Belgrade"
+ ]
+ },
+ "RU": {
+ "name": "Russia",
+ "abbr": "RU",
+ "zones": [
+ "Europe/Kaliningrad",
+ "Europe/Moscow",
+ "Europe/Simferopol",
+ "Europe/Volgograd",
+ "Europe/Kirov",
+ "Europe/Astrakhan",
+ "Europe/Saratov",
+ "Europe/Ulyanovsk",
+ "Europe/Samara",
+ "Asia/Yekaterinburg",
+ "Asia/Omsk",
+ "Asia/Novosibirsk",
+ "Asia/Barnaul",
+ "Asia/Tomsk",
+ "Asia/Novokuznetsk",
+ "Asia/Krasnoyarsk",
+ "Asia/Irkutsk",
+ "Asia/Chita",
+ "Asia/Yakutsk",
+ "Asia/Khandyga",
+ "Asia/Vladivostok",
+ "Asia/Ust-Nera",
+ "Asia/Magadan",
+ "Asia/Sakhalin",
+ "Asia/Srednekolymsk",
+ "Asia/Kamchatka",
+ "Asia/Anadyr"
+ ]
+ },
+ "RW": {
+ "name": "Rwanda",
+ "abbr": "RW",
+ "zones": [
+ "Africa/Maputo"
+ ]
+ },
+ "SA": {
+ "name": "Saudi Arabia",
+ "abbr": "SA",
+ "zones": [
+ "Asia/Riyadh"
+ ]
+ },
+ "SB": {
+ "name": "Solomon Islands",
+ "abbr": "SB",
+ "zones": [
+ "Pacific/Guadalcanal"
+ ]
+ },
+ "SC": {
+ "name": "Seychelles",
+ "abbr": "SC",
+ "zones": [
+ "Indian/Mahe"
+ ]
+ },
+ "SD": {
+ "name": "Sudan",
+ "abbr": "SD",
+ "zones": [
+ "Africa/Khartoum"
+ ]
+ },
+ "SE": {
+ "name": "Sweden",
+ "abbr": "SE",
+ "zones": [
+ "Europe/Stockholm"
+ ]
+ },
+ "SG": {
+ "name": "Singapore",
+ "abbr": "SG",
+ "zones": [
+ "Asia/Singapore"
+ ]
+ },
+ "SH": {
+ "name": "St Helena",
+ "abbr": "SH",
+ "zones": [
+ "Africa/Abidjan"
+ ]
+ },
+ "SI": {
+ "name": "Slovenia",
+ "abbr": "SI",
+ "zones": [
+ "Europe/Belgrade"
+ ]
+ },
+ "SJ": {
+ "name": "Svalbard & Jan Mayen",
+ "abbr": "SJ",
+ "zones": [
+ "Europe/Oslo"
+ ]
+ },
+ "SK": {
+ "name": "Slovakia",
+ "abbr": "SK",
+ "zones": [
+ "Europe/Prague"
+ ]
+ },
+ "SL": {
+ "name": "Sierra Leone",
+ "abbr": "SL",
+ "zones": [
+ "Africa/Abidjan"
+ ]
+ },
+ "SM": {
+ "name": "San Marino",
+ "abbr": "SM",
+ "zones": [
+ "Europe/Rome"
+ ]
+ },
+ "SN": {
+ "name": "Senegal",
+ "abbr": "SN",
+ "zones": [
+ "Africa/Abidjan"
+ ]
+ },
+ "SO": {
+ "name": "Somalia",
+ "abbr": "SO",
+ "zones": [
+ "Africa/Nairobi"
+ ]
+ },
+ "SR": {
+ "name": "Suriname",
+ "abbr": "SR",
+ "zones": [
+ "America/Paramaribo"
+ ]
+ },
+ "SS": {
+ "name": "South Sudan",
+ "abbr": "SS",
+ "zones": [
+ "Africa/Juba"
+ ]
+ },
+ "ST": {
+ "name": "Sao Tome & Principe",
+ "abbr": "ST",
+ "zones": [
+ "Africa/Sao_Tome"
+ ]
+ },
+ "SV": {
+ "name": "El Salvador",
+ "abbr": "SV",
+ "zones": [
+ "America/El_Salvador"
+ ]
+ },
+ "SX": {
+ "name": "St Maarten (Dutch)",
+ "abbr": "SX",
+ "zones": [
+ "America/Curacao"
+ ]
+ },
+ "SY": {
+ "name": "Syria",
+ "abbr": "SY",
+ "zones": [
+ "Asia/Damascus"
+ ]
+ },
+ "SZ": {
+ "name": "Swaziland",
+ "abbr": "SZ",
+ "zones": [
+ "Africa/Johannesburg"
+ ]
+ },
+ "TC": {
+ "name": "Turks & Caicos Is",
+ "abbr": "TC",
+ "zones": [
+ "America/Grand_Turk"
+ ]
+ },
+ "TD": {
+ "name": "Chad",
+ "abbr": "TD",
+ "zones": [
+ "Africa/Ndjamena"
+ ]
+ },
+ "TF": {
+ "name": "French Southern & Antarctic Lands",
+ "abbr": "TF",
+ "zones": [
+ "Indian/Reunion",
+ "Indian/Kerguelen"
+ ]
+ },
+ "TG": {
+ "name": "Togo",
+ "abbr": "TG",
+ "zones": [
+ "Africa/Abidjan"
+ ]
+ },
+ "TH": {
+ "name": "Thailand",
+ "abbr": "TH",
+ "zones": [
+ "Asia/Bangkok"
+ ]
+ },
+ "TJ": {
+ "name": "Tajikistan",
+ "abbr": "TJ",
+ "zones": [
+ "Asia/Dushanbe"
+ ]
+ },
+ "TK": {
+ "name": "Tokelau",
+ "abbr": "TK",
+ "zones": [
+ "Pacific/Fakaofo"
+ ]
+ },
+ "TL": {
+ "name": "East Timor",
+ "abbr": "TL",
+ "zones": [
+ "Asia/Dili"
+ ]
+ },
+ "TM": {
+ "name": "Turkmenistan",
+ "abbr": "TM",
+ "zones": [
+ "Asia/Ashgabat"
+ ]
+ },
+ "TN": {
+ "name": "Tunisia",
+ "abbr": "TN",
+ "zones": [
+ "Africa/Tunis"
+ ]
+ },
+ "TO": {
+ "name": "Tonga",
+ "abbr": "TO",
+ "zones": [
+ "Pacific/Tongatapu"
+ ]
+ },
+ "TR": {
+ "name": "Turkey",
+ "abbr": "TR",
+ "zones": [
+ "Europe/Istanbul"
+ ]
+ },
+ "TT": {
+ "name": "Trinidad & Tobago",
+ "abbr": "TT",
+ "zones": [
+ "America/Port_of_Spain"
+ ]
+ },
+ "TV": {
+ "name": "Tuvalu",
+ "abbr": "TV",
+ "zones": [
+ "Pacific/Funafuti"
+ ]
+ },
+ "TW": {
+ "name": "Taiwan",
+ "abbr": "TW",
+ "zones": [
+ "Asia/Taipei"
+ ]
+ },
+ "TZ": {
+ "name": "Tanzania",
+ "abbr": "TZ",
+ "zones": [
+ "Africa/Nairobi"
+ ]
+ },
+ "UA": {
+ "name": "Ukraine",
+ "abbr": "UA",
+ "zones": [
+ "Europe/Kiev",
+ "Europe/Uzhgorod",
+ "Europe/Zaporozhye"
+ ]
+ },
+ "UG": {
+ "name": "Uganda",
+ "abbr": "UG",
+ "zones": [
+ "Africa/Nairobi"
+ ]
+ },
+ "UM": {
+ "name": "US minor outlying islands",
+ "abbr": "UM",
+ "zones": [
+ "Pacific/Pago_Pago",
+ "Pacific/Wake",
+ "Pacific/Honolulu"
+ ]
+ },
+ "US": {
+ "name": "United States",
+ "abbr": "US",
+ "zones": [
+ "America/New_York",
+ "America/Detroit",
+ "America/Kentucky/Louisville",
+ "America/Kentucky/Monticello",
+ "America/Indiana/Indianapolis",
+ "America/Indiana/Vincennes",
+ "America/Indiana/Winamac",
+ "America/Indiana/Marengo",
+ "America/Indiana/Petersburg",
+ "America/Indiana/Vevay",
+ "America/Chicago",
+ "America/Indiana/Tell_City",
+ "America/Indiana/Knox",
+ "America/Menominee",
+ "America/North_Dakota/Center",
+ "America/North_Dakota/New_Salem",
+ "America/North_Dakota/Beulah",
+ "America/Denver",
+ "America/Boise",
+ "America/Phoenix",
+ "America/Los_Angeles",
+ "America/Anchorage",
+ "America/Juneau",
+ "America/Sitka",
+ "America/Metlakatla",
+ "America/Yakutat",
+ "America/Nome",
+ "America/Adak",
+ "Pacific/Honolulu"
+ ]
+ },
+ "UY": {
+ "name": "Uruguay",
+ "abbr": "UY",
+ "zones": [
+ "America/Montevideo"
+ ]
+ },
+ "UZ": {
+ "name": "Uzbekistan",
+ "abbr": "UZ",
+ "zones": [
+ "Asia/Samarkand",
+ "Asia/Tashkent"
+ ]
+ },
+ "VA": {
+ "name": "Vatican City",
+ "abbr": "VA",
+ "zones": [
+ "Europe/Rome"
+ ]
+ },
+ "VC": {
+ "name": "St Vincent",
+ "abbr": "VC",
+ "zones": [
+ "America/Port_of_Spain"
+ ]
+ },
+ "VE": {
+ "name": "Venezuela",
+ "abbr": "VE",
+ "zones": [
+ "America/Caracas"
+ ]
+ },
+ "VG": {
+ "name": "Virgin Islands (UK)",
+ "abbr": "VG",
+ "zones": [
+ "America/Port_of_Spain"
+ ]
+ },
+ "VI": {
+ "name": "Virgin Islands (US)",
+ "abbr": "VI",
+ "zones": [
+ "America/Port_of_Spain"
+ ]
+ },
+ "VN": {
+ "name": "Vietnam",
+ "abbr": "VN",
+ "zones": [
+ "Asia/Bangkok",
+ "Asia/Ho_Chi_Minh"
+ ]
+ },
+ "VU": {
+ "name": "Vanuatu",
+ "abbr": "VU",
+ "zones": [
+ "Pacific/Efate"
+ ]
+ },
+ "WF": {
+ "name": "Wallis & Futuna",
+ "abbr": "WF",
+ "zones": [
+ "Pacific/Wallis"
+ ]
+ },
+ "WS": {
+ "name": "Samoa (western)",
+ "abbr": "WS",
+ "zones": [
+ "Pacific/Apia"
+ ]
+ },
+ "YE": {
+ "name": "Yemen",
+ "abbr": "YE",
+ "zones": [
+ "Asia/Riyadh"
+ ]
+ },
+ "YT": {
+ "name": "Mayotte",
+ "abbr": "YT",
+ "zones": [
+ "Africa/Nairobi"
+ ]
+ },
+ "ZA": {
+ "name": "South Africa",
+ "abbr": "ZA",
+ "zones": [
+ "Africa/Johannesburg"
+ ]
+ },
+ "ZM": {
+ "name": "Zambia",
+ "abbr": "ZM",
+ "zones": [
+ "Africa/Maputo"
+ ]
+ },
+ "ZW": {
+ "name": "Zimbabwe",
+ "abbr": "ZW",
+ "zones": [
+ "Africa/Maputo"
+ ]
+ }
+ },
+ "zones": {
+ "Europe/Andorra": {
+ "name": "Europe/Andorra",
+ "lat": 42.5,
+ "long": 1.5167,
+ "countries": [
+ "AD"
+ ],
+ "comments": ""
+ },
+ "Asia/Dubai": {
+ "name": "Asia/Dubai",
+ "lat": 25.3,
+ "long": 55.3,
+ "countries": [
+ "AE",
+ "OM"
+ ],
+ "comments": ""
+ },
+ "Asia/Kabul": {
+ "name": "Asia/Kabul",
+ "lat": 34.5167,
+ "long": 69.2,
+ "countries": [
+ "AF"
+ ],
+ "comments": ""
+ },
+ "Europe/Tirane": {
+ "name": "Europe/Tirane",
+ "lat": 41.3333,
+ "long": 19.8333,
+ "countries": [
+ "AL"
+ ],
+ "comments": ""
+ },
+ "Asia/Yerevan": {
+ "name": "Asia/Yerevan",
+ "lat": 40.1833,
+ "long": 44.5,
+ "countries": [
+ "AM"
+ ],
+ "comments": ""
+ },
+ "Antarctica/Casey": {
+ "name": "Antarctica/Casey",
+ "lat": -65.7167,
+ "long": 110.5167,
+ "countries": [
+ "AQ"
+ ],
+ "comments": "Casey"
+ },
+ "Antarctica/Davis": {
+ "name": "Antarctica/Davis",
+ "lat": -67.4167,
+ "long": 77.9667,
+ "countries": [
+ "AQ"
+ ],
+ "comments": "Davis"
+ },
+ "Antarctica/DumontDUrville": {
+ "name": "Antarctica/DumontDUrville",
+ "lat": -65.3333,
+ "long": 140.0167,
+ "countries": [
+ "AQ"
+ ],
+ "comments": "Dumont-d'Urville"
+ },
+ "Antarctica/Mawson": {
+ "name": "Antarctica/Mawson",
+ "lat": -66.4,
+ "long": 62.8833,
+ "countries": [
+ "AQ"
+ ],
+ "comments": "Mawson"
+ },
+ "Antarctica/Palmer": {
+ "name": "Antarctica/Palmer",
+ "lat": -63.2,
+ "long": -63.9,
+ "countries": [
+ "AQ"
+ ],
+ "comments": "Palmer"
+ },
+ "Antarctica/Rothera": {
+ "name": "Antarctica/Rothera",
+ "lat": -66.4333,
+ "long": -67.8667,
+ "countries": [
+ "AQ"
+ ],
+ "comments": "Rothera"
+ },
+ "Antarctica/Syowa": {
+ "name": "Antarctica/Syowa",
+ "lat": -68.9939,
+ "long": 39.59,
+ "countries": [
+ "AQ"
+ ],
+ "comments": "Syowa"
+ },
+ "Antarctica/Troll": {
+ "name": "Antarctica/Troll",
+ "lat": -71.9886,
+ "long": 2.535,
+ "countries": [
+ "AQ"
+ ],
+ "comments": "Troll"
+ },
+ "Antarctica/Vostok": {
+ "name": "Antarctica/Vostok",
+ "lat": -77.6,
+ "long": 106.9,
+ "countries": [
+ "AQ"
+ ],
+ "comments": "Vostok"
+ },
+ "America/Argentina/Buenos_Aires": {
+ "name": "America/Argentina/Buenos_Aires",
+ "lat": -33.4,
+ "long": -57.55,
+ "countries": [
+ "AR"
+ ],
+ "comments": "Buenos Aires (BA, CF)"
+ },
+ "America/Argentina/Cordoba": {
+ "name": "America/Argentina/Cordoba",
+ "lat": -30.6,
+ "long": -63.8167,
+ "countries": [
+ "AR"
+ ],
+ "comments": "Argentina (most areas: CB, CC, CN, ER, FM, MN, SE, SF)"
+ },
+ "America/Argentina/Salta": {
+ "name": "America/Argentina/Salta",
+ "lat": -23.2167,
+ "long": -64.5833,
+ "countries": [
+ "AR"
+ ],
+ "comments": "Salta (SA, LP, NQ, RN)"
+ },
+ "America/Argentina/Jujuy": {
+ "name": "America/Argentina/Jujuy",
+ "lat": -23.8167,
+ "long": -64.7,
+ "countries": [
+ "AR"
+ ],
+ "comments": "Jujuy (JY)"
+ },
+ "America/Argentina/Tucuman": {
+ "name": "America/Argentina/Tucuman",
+ "lat": -25.1833,
+ "long": -64.7833,
+ "countries": [
+ "AR"
+ ],
+ "comments": "Tucumán (TM)"
+ },
+ "America/Argentina/Catamarca": {
+ "name": "America/Argentina/Catamarca",
+ "lat": -27.5333,
+ "long": -64.2167,
+ "countries": [
+ "AR"
+ ],
+ "comments": "Catamarca (CT); Chubut (CH)"
+ },
+ "America/Argentina/La_Rioja": {
+ "name": "America/Argentina/La_Rioja",
+ "lat": -28.5667,
+ "long": -65.15,
+ "countries": [
+ "AR"
+ ],
+ "comments": "La Rioja (LR)"
+ },
+ "America/Argentina/San_Juan": {
+ "name": "America/Argentina/San_Juan",
+ "lat": -30.4667,
+ "long": -67.4833,
+ "countries": [
+ "AR"
+ ],
+ "comments": "San Juan (SJ)"
+ },
+ "America/Argentina/Mendoza": {
+ "name": "America/Argentina/Mendoza",
+ "lat": -31.1167,
+ "long": -67.1833,
+ "countries": [
+ "AR"
+ ],
+ "comments": "Mendoza (MZ)"
+ },
+ "America/Argentina/San_Luis": {
+ "name": "America/Argentina/San_Luis",
+ "lat": -32.6833,
+ "long": -65.65,
+ "countries": [
+ "AR"
+ ],
+ "comments": "San Luis (SL)"
+ },
+ "America/Argentina/Rio_Gallegos": {
+ "name": "America/Argentina/Rio_Gallegos",
+ "lat": -50.3667,
+ "long": -68.7833,
+ "countries": [
+ "AR"
+ ],
+ "comments": "Santa Cruz (SC)"
+ },
+ "America/Argentina/Ushuaia": {
+ "name": "America/Argentina/Ushuaia",
+ "lat": -53.2,
+ "long": -67.7,
+ "countries": [
+ "AR"
+ ],
+ "comments": "Tierra del Fuego (TF)"
+ },
+ "Pacific/Pago_Pago": {
+ "name": "Pacific/Pago_Pago",
+ "lat": -13.7333,
+ "long": -169.3,
+ "countries": [
+ "AS",
+ "UM"
+ ],
+ "comments": "Samoa, Midway"
+ },
+ "Europe/Vienna": {
+ "name": "Europe/Vienna",
+ "lat": 48.2167,
+ "long": 16.3333,
+ "countries": [
+ "AT"
+ ],
+ "comments": ""
+ },
+ "Australia/Lord_Howe": {
+ "name": "Australia/Lord_Howe",
+ "lat": -30.45,
+ "long": 159.0833,
+ "countries": [
+ "AU"
+ ],
+ "comments": "Lord Howe Island"
+ },
+ "Antarctica/Macquarie": {
+ "name": "Antarctica/Macquarie",
+ "lat": -53.5,
+ "long": 158.95,
+ "countries": [
+ "AU"
+ ],
+ "comments": "Macquarie Island"
+ },
+ "Australia/Hobart": {
+ "name": "Australia/Hobart",
+ "lat": -41.1167,
+ "long": 147.3167,
+ "countries": [
+ "AU"
+ ],
+ "comments": "Tasmania (most areas)"
+ },
+ "Australia/Currie": {
+ "name": "Australia/Currie",
+ "lat": -38.0667,
+ "long": 143.8667,
+ "countries": [
+ "AU"
+ ],
+ "comments": "Tasmania (King Island)"
+ },
+ "Australia/Melbourne": {
+ "name": "Australia/Melbourne",
+ "lat": -36.1833,
+ "long": 144.9667,
+ "countries": [
+ "AU"
+ ],
+ "comments": "Victoria"
+ },
+ "Australia/Sydney": {
+ "name": "Australia/Sydney",
+ "lat": -32.1333,
+ "long": 151.2167,
+ "countries": [
+ "AU"
+ ],
+ "comments": "New South Wales (most areas)"
+ },
+ "Australia/Broken_Hill": {
+ "name": "Australia/Broken_Hill",
+ "lat": -30.05,
+ "long": 141.45,
+ "countries": [
+ "AU"
+ ],
+ "comments": "New South Wales (Yancowinna)"
+ },
+ "Australia/Brisbane": {
+ "name": "Australia/Brisbane",
+ "lat": -26.5333,
+ "long": 153.0333,
+ "countries": [
+ "AU"
+ ],
+ "comments": "Queensland (most areas)"
+ },
+ "Australia/Lindeman": {
+ "name": "Australia/Lindeman",
+ "lat": -19.7333,
+ "long": 149,
+ "countries": [
+ "AU"
+ ],
+ "comments": "Queensland (Whitsunday Islands)"
+ },
+ "Australia/Adelaide": {
+ "name": "Australia/Adelaide",
+ "lat": -33.0833,
+ "long": 138.5833,
+ "countries": [
+ "AU"
+ ],
+ "comments": "South Australia"
+ },
+ "Australia/Darwin": {
+ "name": "Australia/Darwin",
+ "lat": -11.5333,
+ "long": 130.8333,
+ "countries": [
+ "AU"
+ ],
+ "comments": "Northern Territory"
+ },
+ "Australia/Perth": {
+ "name": "Australia/Perth",
+ "lat": -30.05,
+ "long": 115.85,
+ "countries": [
+ "AU"
+ ],
+ "comments": "Western Australia (most areas)"
+ },
+ "Australia/Eucla": {
+ "name": "Australia/Eucla",
+ "lat": -30.2833,
+ "long": 128.8667,
+ "countries": [
+ "AU"
+ ],
+ "comments": "Western Australia (Eucla)"
+ },
+ "Asia/Baku": {
+ "name": "Asia/Baku",
+ "lat": 40.3833,
+ "long": 49.85,
+ "countries": [
+ "AZ"
+ ],
+ "comments": ""
+ },
+ "America/Barbados": {
+ "name": "America/Barbados",
+ "lat": 13.1,
+ "long": -58.3833,
+ "countries": [
+ "BB"
+ ],
+ "comments": ""
+ },
+ "Asia/Dhaka": {
+ "name": "Asia/Dhaka",
+ "lat": 23.7167,
+ "long": 90.4167,
+ "countries": [
+ "BD"
+ ],
+ "comments": ""
+ },
+ "Europe/Brussels": {
+ "name": "Europe/Brussels",
+ "lat": 50.8333,
+ "long": 4.3333,
+ "countries": [
+ "BE"
+ ],
+ "comments": ""
+ },
+ "Europe/Sofia": {
+ "name": "Europe/Sofia",
+ "lat": 42.6833,
+ "long": 23.3167,
+ "countries": [
+ "BG"
+ ],
+ "comments": ""
+ },
+ "Atlantic/Bermuda": {
+ "name": "Atlantic/Bermuda",
+ "lat": 32.2833,
+ "long": -63.2333,
+ "countries": [
+ "BM"
+ ],
+ "comments": ""
+ },
+ "Asia/Brunei": {
+ "name": "Asia/Brunei",
+ "lat": 4.9333,
+ "long": 114.9167,
+ "countries": [
+ "BN"
+ ],
+ "comments": ""
+ },
+ "America/La_Paz": {
+ "name": "America/La_Paz",
+ "lat": -15.5,
+ "long": -67.85,
+ "countries": [
+ "BO"
+ ],
+ "comments": ""
+ },
+ "America/Noronha": {
+ "name": "America/Noronha",
+ "lat": -2.15,
+ "long": -31.5833,
+ "countries": [
+ "BR"
+ ],
+ "comments": "Atlantic islands"
+ },
+ "America/Belem": {
+ "name": "America/Belem",
+ "lat": -0.55,
+ "long": -47.5167,
+ "countries": [
+ "BR"
+ ],
+ "comments": "Pará (east); Amapá"
+ },
+ "America/Fortaleza": {
+ "name": "America/Fortaleza",
+ "lat": -2.2833,
+ "long": -37.5,
+ "countries": [
+ "BR"
+ ],
+ "comments": "Brazil (northeast: MA, PI, CE, RN, PB)"
+ },
+ "America/Recife": {
+ "name": "America/Recife",
+ "lat": -7.95,
+ "long": -33.1,
+ "countries": [
+ "BR"
+ ],
+ "comments": "Pernambuco"
+ },
+ "America/Araguaina": {
+ "name": "America/Araguaina",
+ "lat": -6.8,
+ "long": -47.8,
+ "countries": [
+ "BR"
+ ],
+ "comments": "Tocantins"
+ },
+ "America/Maceio": {
+ "name": "America/Maceio",
+ "lat": -8.3333,
+ "long": -34.2833,
+ "countries": [
+ "BR"
+ ],
+ "comments": "Alagoas, Sergipe"
+ },
+ "America/Bahia": {
+ "name": "America/Bahia",
+ "lat": -11.0167,
+ "long": -37.4833,
+ "countries": [
+ "BR"
+ ],
+ "comments": "Bahia"
+ },
+ "America/Sao_Paulo": {
+ "name": "America/Sao_Paulo",
+ "lat": -22.4667,
+ "long": -45.3833,
+ "countries": [
+ "BR"
+ ],
+ "comments": "Brazil (southeast: GO, DF, MG, ES, RJ, SP, PR, SC, RS)"
+ },
+ "America/Campo_Grande": {
+ "name": "America/Campo_Grande",
+ "lat": -19.55,
+ "long": -53.3833,
+ "countries": [
+ "BR"
+ ],
+ "comments": "Mato Grosso do Sul"
+ },
+ "America/Cuiaba": {
+ "name": "America/Cuiaba",
+ "lat": -14.4167,
+ "long": -55.9167,
+ "countries": [
+ "BR"
+ ],
+ "comments": "Mato Grosso"
+ },
+ "America/Santarem": {
+ "name": "America/Santarem",
+ "lat": -1.5667,
+ "long": -53.1333,
+ "countries": [
+ "BR"
+ ],
+ "comments": "Pará (west)"
+ },
+ "America/Porto_Velho": {
+ "name": "America/Porto_Velho",
+ "lat": -7.2333,
+ "long": -62.1,
+ "countries": [
+ "BR"
+ ],
+ "comments": "Rondônia"
+ },
+ "America/Boa_Vista": {
+ "name": "America/Boa_Vista",
+ "lat": 2.8167,
+ "long": -59.3333,
+ "countries": [
+ "BR"
+ ],
+ "comments": "Roraima"
+ },
+ "America/Manaus": {
+ "name": "America/Manaus",
+ "lat": -2.8667,
+ "long": -59.9833,
+ "countries": [
+ "BR"
+ ],
+ "comments": "Amazonas (east)"
+ },
+ "America/Eirunepe": {
+ "name": "America/Eirunepe",
+ "lat": -5.3333,
+ "long": -68.1333,
+ "countries": [
+ "BR"
+ ],
+ "comments": "Amazonas (west)"
+ },
+ "America/Rio_Branco": {
+ "name": "America/Rio_Branco",
+ "lat": -8.0333,
+ "long": -66.2,
+ "countries": [
+ "BR"
+ ],
+ "comments": "Acre"
+ },
+ "America/Nassau": {
+ "name": "America/Nassau",
+ "lat": 25.0833,
+ "long": -76.65,
+ "countries": [
+ "BS"
+ ],
+ "comments": ""
+ },
+ "Asia/Thimphu": {
+ "name": "Asia/Thimphu",
+ "lat": 27.4667,
+ "long": 89.65,
+ "countries": [
+ "BT"
+ ],
+ "comments": ""
+ },
+ "Europe/Minsk": {
+ "name": "Europe/Minsk",
+ "lat": 53.9,
+ "long": 27.5667,
+ "countries": [
+ "BY"
+ ],
+ "comments": ""
+ },
+ "America/Belize": {
+ "name": "America/Belize",
+ "lat": 17.5,
+ "long": -87.8,
+ "countries": [
+ "BZ"
+ ],
+ "comments": ""
+ },
+ "America/St_Johns": {
+ "name": "America/St_Johns",
+ "lat": 47.5667,
+ "long": -51.2833,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Newfoundland; Labrador (southeast)"
+ },
+ "America/Halifax": {
+ "name": "America/Halifax",
+ "lat": 44.65,
+ "long": -62.4,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Atlantic - NS (most areas); PE"
+ },
+ "America/Glace_Bay": {
+ "name": "America/Glace_Bay",
+ "lat": 46.2,
+ "long": -58.05,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Atlantic - NS (Cape Breton)"
+ },
+ "America/Moncton": {
+ "name": "America/Moncton",
+ "lat": 46.1,
+ "long": -63.2167,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Atlantic - New Brunswick"
+ },
+ "America/Goose_Bay": {
+ "name": "America/Goose_Bay",
+ "lat": 53.3333,
+ "long": -59.5833,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Atlantic - Labrador (most areas)"
+ },
+ "America/Blanc-Sablon": {
+ "name": "America/Blanc-Sablon",
+ "lat": 51.4167,
+ "long": -56.8833,
+ "countries": [
+ "CA"
+ ],
+ "comments": "AST - QC (Lower North Shore)"
+ },
+ "America/Toronto": {
+ "name": "America/Toronto",
+ "lat": 43.65,
+ "long": -78.6167,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Eastern - ON, QC (most areas)"
+ },
+ "America/Nipigon": {
+ "name": "America/Nipigon",
+ "lat": 49.0167,
+ "long": -87.7333,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Eastern - ON, QC (no DST 1967-73)"
+ },
+ "America/Thunder_Bay": {
+ "name": "America/Thunder_Bay",
+ "lat": 48.3833,
+ "long": -88.75,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Eastern - ON (Thunder Bay)"
+ },
+ "America/Iqaluit": {
+ "name": "America/Iqaluit",
+ "lat": 63.7333,
+ "long": -67.5333,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Eastern - NU (most east areas)"
+ },
+ "America/Pangnirtung": {
+ "name": "America/Pangnirtung",
+ "lat": 66.1333,
+ "long": -64.2667,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Eastern - NU (Pangnirtung)"
+ },
+ "America/Atikokan": {
+ "name": "America/Atikokan",
+ "lat": 48.7586,
+ "long": -90.3783,
+ "countries": [
+ "CA"
+ ],
+ "comments": "EST - ON (Atikokan); NU (Coral H)"
+ },
+ "America/Winnipeg": {
+ "name": "America/Winnipeg",
+ "lat": 49.8833,
+ "long": -96.85,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Central - ON (west); Manitoba"
+ },
+ "America/Rainy_River": {
+ "name": "America/Rainy_River",
+ "lat": 48.7167,
+ "long": -93.4333,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Central - ON (Rainy R, Ft Frances)"
+ },
+ "America/Resolute": {
+ "name": "America/Resolute",
+ "lat": 74.6956,
+ "long": -93.1708,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Central - NU (Resolute)"
+ },
+ "America/Rankin_Inlet": {
+ "name": "America/Rankin_Inlet",
+ "lat": 62.8167,
+ "long": -91.9169,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Central - NU (central)"
+ },
+ "America/Regina": {
+ "name": "America/Regina",
+ "lat": 50.4,
+ "long": -103.35,
+ "countries": [
+ "CA"
+ ],
+ "comments": "CST - SK (most areas)"
+ },
+ "America/Swift_Current": {
+ "name": "America/Swift_Current",
+ "lat": 50.2833,
+ "long": -106.1667,
+ "countries": [
+ "CA"
+ ],
+ "comments": "CST - SK (midwest)"
+ },
+ "America/Edmonton": {
+ "name": "America/Edmonton",
+ "lat": 53.55,
+ "long": -112.5333,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Mountain - AB; BC (E); SK (W)"
+ },
+ "America/Cambridge_Bay": {
+ "name": "America/Cambridge_Bay",
+ "lat": 69.1139,
+ "long": -104.9472,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Mountain - NU (west)"
+ },
+ "America/Yellowknife": {
+ "name": "America/Yellowknife",
+ "lat": 62.45,
+ "long": -113.65,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Mountain - NT (central)"
+ },
+ "America/Inuvik": {
+ "name": "America/Inuvik",
+ "lat": 68.3497,
+ "long": -132.2833,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Mountain - NT (west)"
+ },
+ "America/Creston": {
+ "name": "America/Creston",
+ "lat": 49.1,
+ "long": -115.4833,
+ "countries": [
+ "CA"
+ ],
+ "comments": "MST - BC (Creston)"
+ },
+ "America/Dawson_Creek": {
+ "name": "America/Dawson_Creek",
+ "lat": 59.7667,
+ "long": -119.7667,
+ "countries": [
+ "CA"
+ ],
+ "comments": "MST - BC (Dawson Cr, Ft St John)"
+ },
+ "America/Fort_Nelson": {
+ "name": "America/Fort_Nelson",
+ "lat": 58.8,
+ "long": -121.3,
+ "countries": [
+ "CA"
+ ],
+ "comments": "MST - BC (Ft Nelson)"
+ },
+ "America/Vancouver": {
+ "name": "America/Vancouver",
+ "lat": 49.2667,
+ "long": -122.8833,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Pacific - BC (most areas)"
+ },
+ "America/Whitehorse": {
+ "name": "America/Whitehorse",
+ "lat": 60.7167,
+ "long": -134.95,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Pacific - Yukon (south)"
+ },
+ "America/Dawson": {
+ "name": "America/Dawson",
+ "lat": 64.0667,
+ "long": -138.5833,
+ "countries": [
+ "CA"
+ ],
+ "comments": "Pacific - Yukon (north)"
+ },
+ "Indian/Cocos": {
+ "name": "Indian/Cocos",
+ "lat": -11.8333,
+ "long": 96.9167,
+ "countries": [
+ "CC"
+ ],
+ "comments": ""
+ },
+ "Europe/Zurich": {
+ "name": "Europe/Zurich",
+ "lat": 47.3833,
+ "long": 8.5333,
+ "countries": [
+ "CH",
+ "DE",
+ "LI"
+ ],
+ "comments": "Swiss time"
+ },
+ "Africa/Abidjan": {
+ "name": "Africa/Abidjan",
+ "lat": 5.3167,
+ "long": -3.9667,
+ "countries": [
+ "CI",
+ "BF",
+ "GM",
+ "GN",
+ "ML",
+ "MR",
+ "SH",
+ "SL",
+ "SN",
+ "TG"
+ ],
+ "comments": ""
+ },
+ "Pacific/Rarotonga": {
+ "name": "Pacific/Rarotonga",
+ "lat": -20.7667,
+ "long": -158.2333,
+ "countries": [
+ "CK"
+ ],
+ "comments": ""
+ },
+ "America/Santiago": {
+ "name": "America/Santiago",
+ "lat": -32.55,
+ "long": -69.3333,
+ "countries": [
+ "CL"
+ ],
+ "comments": "Chile (most areas)"
+ },
+ "America/Punta_Arenas": {
+ "name": "America/Punta_Arenas",
+ "lat": -52.85,
+ "long": -69.0833,
+ "countries": [
+ "CL"
+ ],
+ "comments": "Region of Magallanes"
+ },
+ "Pacific/Easter": {
+ "name": "Pacific/Easter",
+ "lat": -26.85,
+ "long": -108.5667,
+ "countries": [
+ "CL"
+ ],
+ "comments": "Easter Island"
+ },
+ "Asia/Shanghai": {
+ "name": "Asia/Shanghai",
+ "lat": 31.2333,
+ "long": 121.4667,
+ "countries": [
+ "CN"
+ ],
+ "comments": "Beijing Time"
+ },
+ "Asia/Urumqi": {
+ "name": "Asia/Urumqi",
+ "lat": 43.8,
+ "long": 87.5833,
+ "countries": [
+ "CN"
+ ],
+ "comments": "Xinjiang Time"
+ },
+ "America/Bogota": {
+ "name": "America/Bogota",
+ "lat": 4.6,
+ "long": -73.9167,
+ "countries": [
+ "CO"
+ ],
+ "comments": ""
+ },
+ "America/Costa_Rica": {
+ "name": "America/Costa_Rica",
+ "lat": 9.9333,
+ "long": -83.9167,
+ "countries": [
+ "CR"
+ ],
+ "comments": ""
+ },
+ "America/Havana": {
+ "name": "America/Havana",
+ "lat": 23.1333,
+ "long": -81.6333,
+ "countries": [
+ "CU"
+ ],
+ "comments": ""
+ },
+ "Atlantic/Cape_Verde": {
+ "name": "Atlantic/Cape_Verde",
+ "lat": 14.9167,
+ "long": -22.4833,
+ "countries": [
+ "CV"
+ ],
+ "comments": ""
+ },
+ "America/Curacao": {
+ "name": "America/Curacao",
+ "lat": 12.1833,
+ "long": -69,
+ "countries": [
+ "CW",
+ "AW",
+ "BQ",
+ "SX"
+ ],
+ "comments": ""
+ },
+ "Indian/Christmas": {
+ "name": "Indian/Christmas",
+ "lat": -9.5833,
+ "long": 105.7167,
+ "countries": [
+ "CX"
+ ],
+ "comments": ""
+ },
+ "Asia/Nicosia": {
+ "name": "Asia/Nicosia",
+ "lat": 35.1667,
+ "long": 33.3667,
+ "countries": [
+ "CY"
+ ],
+ "comments": "Cyprus (most areas)"
+ },
+ "Asia/Famagusta": {
+ "name": "Asia/Famagusta",
+ "lat": 35.1167,
+ "long": 33.95,
+ "countries": [
+ "CY"
+ ],
+ "comments": "Northern Cyprus"
+ },
+ "Europe/Prague": {
+ "name": "Europe/Prague",
+ "lat": 50.0833,
+ "long": 14.4333,
+ "countries": [
+ "CZ",
+ "SK"
+ ],
+ "comments": ""
+ },
+ "Europe/Berlin": {
+ "name": "Europe/Berlin",
+ "lat": 52.5,
+ "long": 13.3667,
+ "countries": [
+ "DE"
+ ],
+ "comments": "Germany (most areas)"
+ },
+ "Europe/Copenhagen": {
+ "name": "Europe/Copenhagen",
+ "lat": 55.6667,
+ "long": 12.5833,
+ "countries": [
+ "DK"
+ ],
+ "comments": ""
+ },
+ "America/Santo_Domingo": {
+ "name": "America/Santo_Domingo",
+ "lat": 18.4667,
+ "long": -68.1,
+ "countries": [
+ "DO"
+ ],
+ "comments": ""
+ },
+ "Africa/Algiers": {
+ "name": "Africa/Algiers",
+ "lat": 36.7833,
+ "long": 3.05,
+ "countries": [
+ "DZ"
+ ],
+ "comments": ""
+ },
+ "America/Guayaquil": {
+ "name": "America/Guayaquil",
+ "lat": -1.8333,
+ "long": -78.1667,
+ "countries": [
+ "EC"
+ ],
+ "comments": "Ecuador (mainland)"
+ },
+ "Pacific/Galapagos": {
+ "name": "Pacific/Galapagos",
+ "lat": 0.9,
+ "long": -88.4,
+ "countries": [
+ "EC"
+ ],
+ "comments": "Galápagos Islands"
+ },
+ "Europe/Tallinn": {
+ "name": "Europe/Tallinn",
+ "lat": 59.4167,
+ "long": 24.75,
+ "countries": [
+ "EE"
+ ],
+ "comments": ""
+ },
+ "Africa/Cairo": {
+ "name": "Africa/Cairo",
+ "lat": 30.05,
+ "long": 31.25,
+ "countries": [
+ "EG"
+ ],
+ "comments": ""
+ },
+ "Africa/El_Aaiun": {
+ "name": "Africa/El_Aaiun",
+ "lat": 27.15,
+ "long": -12.8,
+ "countries": [
+ "EH"
+ ],
+ "comments": ""
+ },
+ "Europe/Madrid": {
+ "name": "Europe/Madrid",
+ "lat": 40.4,
+ "long": -2.3167,
+ "countries": [
+ "ES"
+ ],
+ "comments": "Spain (mainland)"
+ },
+ "Africa/Ceuta": {
+ "name": "Africa/Ceuta",
+ "lat": 35.8833,
+ "long": -4.6833,
+ "countries": [
+ "ES"
+ ],
+ "comments": "Ceuta, Melilla"
+ },
+ "Atlantic/Canary": {
+ "name": "Atlantic/Canary",
+ "lat": 28.1,
+ "long": -14.6,
+ "countries": [
+ "ES"
+ ],
+ "comments": "Canary Islands"
+ },
+ "Europe/Helsinki": {
+ "name": "Europe/Helsinki",
+ "lat": 60.1667,
+ "long": 24.9667,
+ "countries": [
+ "FI",
+ "AX"
+ ],
+ "comments": ""
+ },
+ "Pacific/Fiji": {
+ "name": "Pacific/Fiji",
+ "lat": -17.8667,
+ "long": 178.4167,
+ "countries": [
+ "FJ"
+ ],
+ "comments": ""
+ },
+ "Atlantic/Stanley": {
+ "name": "Atlantic/Stanley",
+ "lat": -50.3,
+ "long": -56.15,
+ "countries": [
+ "FK"
+ ],
+ "comments": ""
+ },
+ "Pacific/Chuuk": {
+ "name": "Pacific/Chuuk",
+ "lat": 7.4167,
+ "long": 151.7833,
+ "countries": [
+ "FM"
+ ],
+ "comments": "Chuuk/Truk, Yap"
+ },
+ "Pacific/Pohnpei": {
+ "name": "Pacific/Pohnpei",
+ "lat": 6.9667,
+ "long": 158.2167,
+ "countries": [
+ "FM"
+ ],
+ "comments": "Pohnpei/Ponape"
+ },
+ "Pacific/Kosrae": {
+ "name": "Pacific/Kosrae",
+ "lat": 5.3167,
+ "long": 162.9833,
+ "countries": [
+ "FM"
+ ],
+ "comments": "Kosrae"
+ },
+ "Atlantic/Faroe": {
+ "name": "Atlantic/Faroe",
+ "lat": 62.0167,
+ "long": -5.2333,
+ "countries": [
+ "FO"
+ ],
+ "comments": ""
+ },
+ "Europe/Paris": {
+ "name": "Europe/Paris",
+ "lat": 48.8667,
+ "long": 2.3333,
+ "countries": [
+ "FR"
+ ],
+ "comments": ""
+ },
+ "Europe/London": {
+ "name": "Europe/London",
+ "lat": 51.5083,
+ "long": 0.1253,
+ "countries": [
+ "GB",
+ "GG",
+ "IM",
+ "JE"
+ ],
+ "comments": ""
+ },
+ "Asia/Tbilisi": {
+ "name": "Asia/Tbilisi",
+ "lat": 41.7167,
+ "long": 44.8167,
+ "countries": [
+ "GE"
+ ],
+ "comments": ""
+ },
+ "America/Cayenne": {
+ "name": "America/Cayenne",
+ "lat": 4.9333,
+ "long": -51.6667,
+ "countries": [
+ "GF"
+ ],
+ "comments": ""
+ },
+ "Africa/Accra": {
+ "name": "Africa/Accra",
+ "lat": 5.55,
+ "long": 0.2167,
+ "countries": [
+ "GH"
+ ],
+ "comments": ""
+ },
+ "Europe/Gibraltar": {
+ "name": "Europe/Gibraltar",
+ "lat": 36.1333,
+ "long": -4.65,
+ "countries": [
+ "GI"
+ ],
+ "comments": ""
+ },
+ "America/Godthab": {
+ "name": "America/Godthab",
+ "lat": 64.1833,
+ "long": -50.2667,
+ "countries": [
+ "GL"
+ ],
+ "comments": "Greenland (most areas)"
+ },
+ "America/Danmarkshavn": {
+ "name": "America/Danmarkshavn",
+ "lat": 76.7667,
+ "long": -17.3333,
+ "countries": [
+ "GL"
+ ],
+ "comments": "National Park (east coast)"
+ },
+ "America/Scoresbysund": {
+ "name": "America/Scoresbysund",
+ "lat": 70.4833,
+ "long": -20.0333,
+ "countries": [
+ "GL"
+ ],
+ "comments": "Scoresbysund/Ittoqqortoormiit"
+ },
+ "America/Thule": {
+ "name": "America/Thule",
+ "lat": 76.5667,
+ "long": -67.2167,
+ "countries": [
+ "GL"
+ ],
+ "comments": "Thule/Pituffik"
+ },
+ "Europe/Athens": {
+ "name": "Europe/Athens",
+ "lat": 37.9667,
+ "long": 23.7167,
+ "countries": [
+ "GR"
+ ],
+ "comments": ""
+ },
+ "Atlantic/South_Georgia": {
+ "name": "Atlantic/South_Georgia",
+ "lat": -53.7333,
+ "long": -35.4667,
+ "countries": [
+ "GS"
+ ],
+ "comments": ""
+ },
+ "America/Guatemala": {
+ "name": "America/Guatemala",
+ "lat": 14.6333,
+ "long": -89.4833,
+ "countries": [
+ "GT"
+ ],
+ "comments": ""
+ },
+ "Pacific/Guam": {
+ "name": "Pacific/Guam",
+ "lat": 13.4667,
+ "long": 144.75,
+ "countries": [
+ "GU",
+ "MP"
+ ],
+ "comments": ""
+ },
+ "Africa/Bissau": {
+ "name": "Africa/Bissau",
+ "lat": 11.85,
+ "long": -14.4167,
+ "countries": [
+ "GW"
+ ],
+ "comments": ""
+ },
+ "America/Guyana": {
+ "name": "America/Guyana",
+ "lat": 6.8,
+ "long": -57.8333,
+ "countries": [
+ "GY"
+ ],
+ "comments": ""
+ },
+ "Asia/Hong_Kong": {
+ "name": "Asia/Hong_Kong",
+ "lat": 22.2833,
+ "long": 114.15,
+ "countries": [
+ "HK"
+ ],
+ "comments": ""
+ },
+ "America/Tegucigalpa": {
+ "name": "America/Tegucigalpa",
+ "lat": 14.1,
+ "long": -86.7833,
+ "countries": [
+ "HN"
+ ],
+ "comments": ""
+ },
+ "America/Port-au-Prince": {
+ "name": "America/Port-au-Prince",
+ "lat": 18.5333,
+ "long": -71.6667,
+ "countries": [
+ "HT"
+ ],
+ "comments": ""
+ },
+ "Europe/Budapest": {
+ "name": "Europe/Budapest",
+ "lat": 47.5,
+ "long": 19.0833,
+ "countries": [
+ "HU"
+ ],
+ "comments": ""
+ },
+ "Asia/Jakarta": {
+ "name": "Asia/Jakarta",
+ "lat": -5.8333,
+ "long": 106.8,
+ "countries": [
+ "ID"
+ ],
+ "comments": "Java, Sumatra"
+ },
+ "Asia/Pontianak": {
+ "name": "Asia/Pontianak",
+ "lat": 0.0333,
+ "long": 109.3333,
+ "countries": [
+ "ID"
+ ],
+ "comments": "Borneo (west, central)"
+ },
+ "Asia/Makassar": {
+ "name": "Asia/Makassar",
+ "lat": -4.8833,
+ "long": 119.4,
+ "countries": [
+ "ID"
+ ],
+ "comments": "Borneo (east, south); Sulawesi/Celebes, Bali, Nusa Tengarra; Timor (west)"
+ },
+ "Asia/Jayapura": {
+ "name": "Asia/Jayapura",
+ "lat": -1.4667,
+ "long": 140.7,
+ "countries": [
+ "ID"
+ ],
+ "comments": "New Guinea (West Papua / Irian Jaya); Malukus/Moluccas"
+ },
+ "Europe/Dublin": {
+ "name": "Europe/Dublin",
+ "lat": 53.3333,
+ "long": -5.75,
+ "countries": [
+ "IE"
+ ],
+ "comments": ""
+ },
+ "Asia/Jerusalem": {
+ "name": "Asia/Jerusalem",
+ "lat": 31.7806,
+ "long": 35.2239,
+ "countries": [
+ "IL"
+ ],
+ "comments": ""
+ },
+ "Asia/Kolkata": {
+ "name": "Asia/Kolkata",
+ "lat": 22.5333,
+ "long": 88.3667,
+ "countries": [
+ "IN"
+ ],
+ "comments": ""
+ },
+ "Indian/Chagos": {
+ "name": "Indian/Chagos",
+ "lat": -6.6667,
+ "long": 72.4167,
+ "countries": [
+ "IO"
+ ],
+ "comments": ""
+ },
+ "Asia/Baghdad": {
+ "name": "Asia/Baghdad",
+ "lat": 33.35,
+ "long": 44.4167,
+ "countries": [
+ "IQ"
+ ],
+ "comments": ""
+ },
+ "Asia/Tehran": {
+ "name": "Asia/Tehran",
+ "lat": 35.6667,
+ "long": 51.4333,
+ "countries": [
+ "IR"
+ ],
+ "comments": ""
+ },
+ "Atlantic/Reykjavik": {
+ "name": "Atlantic/Reykjavik",
+ "lat": 64.15,
+ "long": -20.15,
+ "countries": [
+ "IS"
+ ],
+ "comments": ""
+ },
+ "Europe/Rome": {
+ "name": "Europe/Rome",
+ "lat": 41.9,
+ "long": 12.4833,
+ "countries": [
+ "IT",
+ "SM",
+ "VA"
+ ],
+ "comments": ""
+ },
+ "America/Jamaica": {
+ "name": "America/Jamaica",
+ "lat": 17.9681,
+ "long": -75.2067,
+ "countries": [
+ "JM"
+ ],
+ "comments": ""
+ },
+ "Asia/Amman": {
+ "name": "Asia/Amman",
+ "lat": 31.95,
+ "long": 35.9333,
+ "countries": [
+ "JO"
+ ],
+ "comments": ""
+ },
+ "Asia/Tokyo": {
+ "name": "Asia/Tokyo",
+ "lat": 35.6544,
+ "long": 139.7447,
+ "countries": [
+ "JP"
+ ],
+ "comments": ""
+ },
+ "Africa/Nairobi": {
+ "name": "Africa/Nairobi",
+ "lat": -0.7167,
+ "long": 36.8167,
+ "countries": [
+ "KE",
+ "DJ",
+ "ER",
+ "ET",
+ "KM",
+ "MG",
+ "SO",
+ "TZ",
+ "UG",
+ "YT"
+ ],
+ "comments": ""
+ },
+ "Asia/Bishkek": {
+ "name": "Asia/Bishkek",
+ "lat": 42.9,
+ "long": 74.6,
+ "countries": [
+ "KG"
+ ],
+ "comments": ""
+ },
+ "Pacific/Tarawa": {
+ "name": "Pacific/Tarawa",
+ "lat": 1.4167,
+ "long": 173,
+ "countries": [
+ "KI"
+ ],
+ "comments": "Gilbert Islands"
+ },
+ "Pacific/Enderbury": {
+ "name": "Pacific/Enderbury",
+ "lat": -2.8667,
+ "long": -170.9167,
+ "countries": [
+ "KI"
+ ],
+ "comments": "Phoenix Islands"
+ },
+ "Pacific/Kiritimati": {
+ "name": "Pacific/Kiritimati",
+ "lat": 1.8667,
+ "long": -156.6667,
+ "countries": [
+ "KI"
+ ],
+ "comments": "Line Islands"
+ },
+ "Asia/Pyongyang": {
+ "name": "Asia/Pyongyang",
+ "lat": 39.0167,
+ "long": 125.75,
+ "countries": [
+ "KP"
+ ],
+ "comments": ""
+ },
+ "Asia/Seoul": {
+ "name": "Asia/Seoul",
+ "lat": 37.55,
+ "long": 126.9667,
+ "countries": [
+ "KR"
+ ],
+ "comments": ""
+ },
+ "Asia/Almaty": {
+ "name": "Asia/Almaty",
+ "lat": 43.25,
+ "long": 76.95,
+ "countries": [
+ "KZ"
+ ],
+ "comments": "Kazakhstan (most areas)"
+ },
+ "Asia/Qyzylorda": {
+ "name": "Asia/Qyzylorda",
+ "lat": 44.8,
+ "long": 65.4667,
+ "countries": [
+ "KZ"
+ ],
+ "comments": "Qyzylorda/Kyzylorda/Kzyl-Orda"
+ },
+ "Asia/Aqtobe": {
+ "name": "Asia/Aqtobe",
+ "lat": 50.2833,
+ "long": 57.1667,
+ "countries": [
+ "KZ"
+ ],
+ "comments": "Aqtöbe/Aktobe"
+ },
+ "Asia/Aqtau": {
+ "name": "Asia/Aqtau",
+ "lat": 44.5167,
+ "long": 50.2667,
+ "countries": [
+ "KZ"
+ ],
+ "comments": "Mangghystaū/Mankistau"
+ },
+ "Asia/Atyrau": {
+ "name": "Asia/Atyrau",
+ "lat": 47.1167,
+ "long": 51.9333,
+ "countries": [
+ "KZ"
+ ],
+ "comments": "Atyraū/Atirau/Gur'yev"
+ },
+ "Asia/Oral": {
+ "name": "Asia/Oral",
+ "lat": 51.2167,
+ "long": 51.35,
+ "countries": [
+ "KZ"
+ ],
+ "comments": "West Kazakhstan"
+ },
+ "Asia/Beirut": {
+ "name": "Asia/Beirut",
+ "lat": 33.8833,
+ "long": 35.5,
+ "countries": [
+ "LB"
+ ],
+ "comments": ""
+ },
+ "Asia/Colombo": {
+ "name": "Asia/Colombo",
+ "lat": 6.9333,
+ "long": 79.85,
+ "countries": [
+ "LK"
+ ],
+ "comments": ""
+ },
+ "Africa/Monrovia": {
+ "name": "Africa/Monrovia",
+ "lat": 6.3,
+ "long": -9.2167,
+ "countries": [
+ "LR"
+ ],
+ "comments": ""
+ },
+ "Europe/Vilnius": {
+ "name": "Europe/Vilnius",
+ "lat": 54.6833,
+ "long": 25.3167,
+ "countries": [
+ "LT"
+ ],
+ "comments": ""
+ },
+ "Europe/Luxembourg": {
+ "name": "Europe/Luxembourg",
+ "lat": 49.6,
+ "long": 6.15,
+ "countries": [
+ "LU"
+ ],
+ "comments": ""
+ },
+ "Europe/Riga": {
+ "name": "Europe/Riga",
+ "lat": 56.95,
+ "long": 24.1,
+ "countries": [
+ "LV"
+ ],
+ "comments": ""
+ },
+ "Africa/Tripoli": {
+ "name": "Africa/Tripoli",
+ "lat": 32.9,
+ "long": 13.1833,
+ "countries": [
+ "LY"
+ ],
+ "comments": ""
+ },
+ "Africa/Casablanca": {
+ "name": "Africa/Casablanca",
+ "lat": 33.65,
+ "long": -6.4167,
+ "countries": [
+ "MA"
+ ],
+ "comments": ""
+ },
+ "Europe/Monaco": {
+ "name": "Europe/Monaco",
+ "lat": 43.7,
+ "long": 7.3833,
+ "countries": [
+ "MC"
+ ],
+ "comments": ""
+ },
+ "Europe/Chisinau": {
+ "name": "Europe/Chisinau",
+ "lat": 47,
+ "long": 28.8333,
+ "countries": [
+ "MD"
+ ],
+ "comments": ""
+ },
+ "Pacific/Majuro": {
+ "name": "Pacific/Majuro",
+ "lat": 7.15,
+ "long": 171.2,
+ "countries": [
+ "MH"
+ ],
+ "comments": "Marshall Islands (most areas)"
+ },
+ "Pacific/Kwajalein": {
+ "name": "Pacific/Kwajalein",
+ "lat": 9.0833,
+ "long": 167.3333,
+ "countries": [
+ "MH"
+ ],
+ "comments": "Kwajalein"
+ },
+ "Asia/Yangon": {
+ "name": "Asia/Yangon",
+ "lat": 16.7833,
+ "long": 96.1667,
+ "countries": [
+ "MM"
+ ],
+ "comments": ""
+ },
+ "Asia/Ulaanbaatar": {
+ "name": "Asia/Ulaanbaatar",
+ "lat": 47.9167,
+ "long": 106.8833,
+ "countries": [
+ "MN"
+ ],
+ "comments": "Mongolia (most areas)"
+ },
+ "Asia/Hovd": {
+ "name": "Asia/Hovd",
+ "lat": 48.0167,
+ "long": 91.65,
+ "countries": [
+ "MN"
+ ],
+ "comments": "Bayan-Ölgii, Govi-Altai, Hovd, Uvs, Zavkhan"
+ },
+ "Asia/Choibalsan": {
+ "name": "Asia/Choibalsan",
+ "lat": 48.0667,
+ "long": 114.5,
+ "countries": [
+ "MN"
+ ],
+ "comments": "Dornod, Sükhbaatar"
+ },
+ "Asia/Macau": {
+ "name": "Asia/Macau",
+ "lat": 22.2333,
+ "long": 113.5833,
+ "countries": [
+ "MO"
+ ],
+ "comments": ""
+ },
+ "America/Martinique": {
+ "name": "America/Martinique",
+ "lat": 14.6,
+ "long": -60.9167,
+ "countries": [
+ "MQ"
+ ],
+ "comments": ""
+ },
+ "Europe/Malta": {
+ "name": "Europe/Malta",
+ "lat": 35.9,
+ "long": 14.5167,
+ "countries": [
+ "MT"
+ ],
+ "comments": ""
+ },
+ "Indian/Mauritius": {
+ "name": "Indian/Mauritius",
+ "lat": -19.8333,
+ "long": 57.5,
+ "countries": [
+ "MU"
+ ],
+ "comments": ""
+ },
+ "Indian/Maldives": {
+ "name": "Indian/Maldives",
+ "lat": 4.1667,
+ "long": 73.5,
+ "countries": [
+ "MV"
+ ],
+ "comments": ""
+ },
+ "America/Mexico_City": {
+ "name": "America/Mexico_City",
+ "lat": 19.4,
+ "long": -98.85,
+ "countries": [
+ "MX"
+ ],
+ "comments": "Central Time"
+ },
+ "America/Cancun": {
+ "name": "America/Cancun",
+ "lat": 21.0833,
+ "long": -85.2333,
+ "countries": [
+ "MX"
+ ],
+ "comments": "Eastern Standard Time - Quintana Roo"
+ },
+ "America/Merida": {
+ "name": "America/Merida",
+ "lat": 20.9667,
+ "long": -88.3833,
+ "countries": [
+ "MX"
+ ],
+ "comments": "Central Time - Campeche, Yucatán"
+ },
+ "America/Monterrey": {
+ "name": "America/Monterrey",
+ "lat": 25.6667,
+ "long": -99.6833,
+ "countries": [
+ "MX"
+ ],
+ "comments": "Central Time - Durango; Coahuila, Nuevo León, Tamaulipas (most areas)"
+ },
+ "America/Matamoros": {
+ "name": "America/Matamoros",
+ "lat": 25.8333,
+ "long": -96.5,
+ "countries": [
+ "MX"
+ ],
+ "comments": "Central Time US - Coahuila, Nuevo León, Tamaulipas (US border)"
+ },
+ "America/Mazatlan": {
+ "name": "America/Mazatlan",
+ "lat": 23.2167,
+ "long": -105.5833,
+ "countries": [
+ "MX"
+ ],
+ "comments": "Mountain Time - Baja California Sur, Nayarit, Sinaloa"
+ },
+ "America/Chihuahua": {
+ "name": "America/Chihuahua",
+ "lat": 28.6333,
+ "long": -105.9167,
+ "countries": [
+ "MX"
+ ],
+ "comments": "Mountain Time - Chihuahua (most areas)"
+ },
+ "America/Ojinaga": {
+ "name": "America/Ojinaga",
+ "lat": 29.5667,
+ "long": -103.5833,
+ "countries": [
+ "MX"
+ ],
+ "comments": "Mountain Time US - Chihuahua (US border)"
+ },
+ "America/Hermosillo": {
+ "name": "America/Hermosillo",
+ "lat": 29.0667,
+ "long": -109.0333,
+ "countries": [
+ "MX"
+ ],
+ "comments": "Mountain Standard Time - Sonora"
+ },
+ "America/Tijuana": {
+ "name": "America/Tijuana",
+ "lat": 32.5333,
+ "long": -116.9833,
+ "countries": [
+ "MX"
+ ],
+ "comments": "Pacific Time US - Baja California"
+ },
+ "America/Bahia_Banderas": {
+ "name": "America/Bahia_Banderas",
+ "lat": 20.8,
+ "long": -104.75,
+ "countries": [
+ "MX"
+ ],
+ "comments": "Central Time - Bahía de Banderas"
+ },
+ "Asia/Kuala_Lumpur": {
+ "name": "Asia/Kuala_Lumpur",
+ "lat": 3.1667,
+ "long": 101.7,
+ "countries": [
+ "MY"
+ ],
+ "comments": "Malaysia (peninsula)"
+ },
+ "Asia/Kuching": {
+ "name": "Asia/Kuching",
+ "lat": 1.55,
+ "long": 110.3333,
+ "countries": [
+ "MY"
+ ],
+ "comments": "Sabah, Sarawak"
+ },
+ "Africa/Maputo": {
+ "name": "Africa/Maputo",
+ "lat": -24.0333,
+ "long": 32.5833,
+ "countries": [
+ "MZ",
+ "BI",
+ "BW",
+ "CD",
+ "MW",
+ "RW",
+ "ZM",
+ "ZW"
+ ],
+ "comments": "Central Africa Time"
+ },
+ "Africa/Windhoek": {
+ "name": "Africa/Windhoek",
+ "lat": -21.4333,
+ "long": 17.1,
+ "countries": [
+ "NA"
+ ],
+ "comments": ""
+ },
+ "Pacific/Noumea": {
+ "name": "Pacific/Noumea",
+ "lat": -21.7333,
+ "long": 166.45,
+ "countries": [
+ "NC"
+ ],
+ "comments": ""
+ },
+ "Pacific/Norfolk": {
+ "name": "Pacific/Norfolk",
+ "lat": -28.95,
+ "long": 167.9667,
+ "countries": [
+ "NF"
+ ],
+ "comments": ""
+ },
+ "Africa/Lagos": {
+ "name": "Africa/Lagos",
+ "lat": 6.45,
+ "long": 3.4,
+ "countries": [
+ "NG",
+ "AO",
+ "BJ",
+ "CD",
+ "CF",
+ "CG",
+ "CM",
+ "GA",
+ "GQ",
+ "NE"
+ ],
+ "comments": "West Africa Time"
+ },
+ "America/Managua": {
+ "name": "America/Managua",
+ "lat": 12.15,
+ "long": -85.7167,
+ "countries": [
+ "NI"
+ ],
+ "comments": ""
+ },
+ "Europe/Amsterdam": {
+ "name": "Europe/Amsterdam",
+ "lat": 52.3667,
+ "long": 4.9,
+ "countries": [
+ "NL"
+ ],
+ "comments": ""
+ },
+ "Europe/Oslo": {
+ "name": "Europe/Oslo",
+ "lat": 59.9167,
+ "long": 10.75,
+ "countries": [
+ "NO",
+ "SJ"
+ ],
+ "comments": ""
+ },
+ "Asia/Kathmandu": {
+ "name": "Asia/Kathmandu",
+ "lat": 27.7167,
+ "long": 85.3167,
+ "countries": [
+ "NP"
+ ],
+ "comments": ""
+ },
+ "Pacific/Nauru": {
+ "name": "Pacific/Nauru",
+ "lat": 0.5167,
+ "long": 166.9167,
+ "countries": [
+ "NR"
+ ],
+ "comments": ""
+ },
+ "Pacific/Niue": {
+ "name": "Pacific/Niue",
+ "lat": -18.9833,
+ "long": -168.0833,
+ "countries": [
+ "NU"
+ ],
+ "comments": ""
+ },
+ "Pacific/Auckland": {
+ "name": "Pacific/Auckland",
+ "lat": -35.1333,
+ "long": 174.7667,
+ "countries": [
+ "NZ",
+ "AQ"
+ ],
+ "comments": "New Zealand time"
+ },
+ "Pacific/Chatham": {
+ "name": "Pacific/Chatham",
+ "lat": -42.05,
+ "long": -175.45,
+ "countries": [
+ "NZ"
+ ],
+ "comments": "Chatham Islands"
+ },
+ "America/Panama": {
+ "name": "America/Panama",
+ "lat": 8.9667,
+ "long": -78.4667,
+ "countries": [
+ "PA",
+ "KY"
+ ],
+ "comments": ""
+ },
+ "America/Lima": {
+ "name": "America/Lima",
+ "lat": -11.95,
+ "long": -76.95,
+ "countries": [
+ "PE"
+ ],
+ "comments": ""
+ },
+ "Pacific/Tahiti": {
+ "name": "Pacific/Tahiti",
+ "lat": -16.4667,
+ "long": -148.4333,
+ "countries": [
+ "PF"
+ ],
+ "comments": "Society Islands"
+ },
+ "Pacific/Marquesas": {
+ "name": "Pacific/Marquesas",
+ "lat": -9,
+ "long": -138.5,
+ "countries": [
+ "PF"
+ ],
+ "comments": "Marquesas Islands"
+ },
+ "Pacific/Gambier": {
+ "name": "Pacific/Gambier",
+ "lat": -22.8667,
+ "long": -133.05,
+ "countries": [
+ "PF"
+ ],
+ "comments": "Gambier Islands"
+ },
+ "Pacific/Port_Moresby": {
+ "name": "Pacific/Port_Moresby",
+ "lat": -8.5,
+ "long": 147.1667,
+ "countries": [
+ "PG"
+ ],
+ "comments": "Papua New Guinea (most areas)"
+ },
+ "Pacific/Bougainville": {
+ "name": "Pacific/Bougainville",
+ "lat": -5.7833,
+ "long": 155.5667,
+ "countries": [
+ "PG"
+ ],
+ "comments": "Bougainville"
+ },
+ "Asia/Manila": {
+ "name": "Asia/Manila",
+ "lat": 14.5833,
+ "long": 121,
+ "countries": [
+ "PH"
+ ],
+ "comments": ""
+ },
+ "Asia/Karachi": {
+ "name": "Asia/Karachi",
+ "lat": 24.8667,
+ "long": 67.05,
+ "countries": [
+ "PK"
+ ],
+ "comments": ""
+ },
+ "Europe/Warsaw": {
+ "name": "Europe/Warsaw",
+ "lat": 52.25,
+ "long": 21,
+ "countries": [
+ "PL"
+ ],
+ "comments": ""
+ },
+ "America/Miquelon": {
+ "name": "America/Miquelon",
+ "lat": 47.05,
+ "long": -55.6667,
+ "countries": [
+ "PM"
+ ],
+ "comments": ""
+ },
+ "Pacific/Pitcairn": {
+ "name": "Pacific/Pitcairn",
+ "lat": -24.9333,
+ "long": -129.9167,
+ "countries": [
+ "PN"
+ ],
+ "comments": ""
+ },
+ "America/Puerto_Rico": {
+ "name": "America/Puerto_Rico",
+ "lat": 18.4683,
+ "long": -65.8939,
+ "countries": [
+ "PR"
+ ],
+ "comments": ""
+ },
+ "Asia/Gaza": {
+ "name": "Asia/Gaza",
+ "lat": 31.5,
+ "long": 34.4667,
+ "countries": [
+ "PS"
+ ],
+ "comments": "Gaza Strip"
+ },
+ "Asia/Hebron": {
+ "name": "Asia/Hebron",
+ "lat": 31.5333,
+ "long": 35.095,
+ "countries": [
+ "PS"
+ ],
+ "comments": "West Bank"
+ },
+ "Europe/Lisbon": {
+ "name": "Europe/Lisbon",
+ "lat": 38.7167,
+ "long": -8.8667,
+ "countries": [
+ "PT"
+ ],
+ "comments": "Portugal (mainland)"
+ },
+ "Atlantic/Madeira": {
+ "name": "Atlantic/Madeira",
+ "lat": 32.6333,
+ "long": -15.1,
+ "countries": [
+ "PT"
+ ],
+ "comments": "Madeira Islands"
+ },
+ "Atlantic/Azores": {
+ "name": "Atlantic/Azores",
+ "lat": 37.7333,
+ "long": -24.3333,
+ "countries": [
+ "PT"
+ ],
+ "comments": "Azores"
+ },
+ "Pacific/Palau": {
+ "name": "Pacific/Palau",
+ "lat": 7.3333,
+ "long": 134.4833,
+ "countries": [
+ "PW"
+ ],
+ "comments": ""
+ },
+ "America/Asuncion": {
+ "name": "America/Asuncion",
+ "lat": -24.7333,
+ "long": -56.3333,
+ "countries": [
+ "PY"
+ ],
+ "comments": ""
+ },
+ "Asia/Qatar": {
+ "name": "Asia/Qatar",
+ "lat": 25.2833,
+ "long": 51.5333,
+ "countries": [
+ "QA",
+ "BH"
+ ],
+ "comments": ""
+ },
+ "Indian/Reunion": {
+ "name": "Indian/Reunion",
+ "lat": -19.1333,
+ "long": 55.4667,
+ "countries": [
+ "RE",
+ "TF"
+ ],
+ "comments": "Réunion, Crozet, Scattered Islands"
+ },
+ "Europe/Bucharest": {
+ "name": "Europe/Bucharest",
+ "lat": 44.4333,
+ "long": 26.1,
+ "countries": [
+ "RO"
+ ],
+ "comments": ""
+ },
+ "Europe/Belgrade": {
+ "name": "Europe/Belgrade",
+ "lat": 44.8333,
+ "long": 20.5,
+ "countries": [
+ "RS",
+ "BA",
+ "HR",
+ "ME",
+ "MK",
+ "SI"
+ ],
+ "comments": ""
+ },
+ "Europe/Kaliningrad": {
+ "name": "Europe/Kaliningrad",
+ "lat": 54.7167,
+ "long": 20.5,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK-01 - Kaliningrad"
+ },
+ "Europe/Moscow": {
+ "name": "Europe/Moscow",
+ "lat": 55.7558,
+ "long": 37.6178,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+00 - Moscow area"
+ },
+ "Europe/Simferopol": {
+ "name": "Europe/Simferopol",
+ "lat": 44.95,
+ "long": 34.1,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+00 - Crimea"
+ },
+ "Europe/Volgograd": {
+ "name": "Europe/Volgograd",
+ "lat": 48.7333,
+ "long": 44.4167,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+00 - Volgograd"
+ },
+ "Europe/Kirov": {
+ "name": "Europe/Kirov",
+ "lat": 58.6,
+ "long": 49.65,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+00 - Kirov"
+ },
+ "Europe/Astrakhan": {
+ "name": "Europe/Astrakhan",
+ "lat": 46.35,
+ "long": 48.05,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+01 - Astrakhan"
+ },
+ "Europe/Saratov": {
+ "name": "Europe/Saratov",
+ "lat": 51.5667,
+ "long": 46.0333,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+01 - Saratov"
+ },
+ "Europe/Ulyanovsk": {
+ "name": "Europe/Ulyanovsk",
+ "lat": 54.3333,
+ "long": 48.4,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+01 - Ulyanovsk"
+ },
+ "Europe/Samara": {
+ "name": "Europe/Samara",
+ "lat": 53.2,
+ "long": 50.15,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+01 - Samara, Udmurtia"
+ },
+ "Asia/Yekaterinburg": {
+ "name": "Asia/Yekaterinburg",
+ "lat": 56.85,
+ "long": 60.6,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+02 - Urals"
+ },
+ "Asia/Omsk": {
+ "name": "Asia/Omsk",
+ "lat": 55,
+ "long": 73.4,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+03 - Omsk"
+ },
+ "Asia/Novosibirsk": {
+ "name": "Asia/Novosibirsk",
+ "lat": 55.0333,
+ "long": 82.9167,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+04 - Novosibirsk"
+ },
+ "Asia/Barnaul": {
+ "name": "Asia/Barnaul",
+ "lat": 53.3667,
+ "long": 83.75,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+04 - Altai"
+ },
+ "Asia/Tomsk": {
+ "name": "Asia/Tomsk",
+ "lat": 56.5,
+ "long": 84.9667,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+04 - Tomsk"
+ },
+ "Asia/Novokuznetsk": {
+ "name": "Asia/Novokuznetsk",
+ "lat": 53.75,
+ "long": 87.1167,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+04 - Kemerovo"
+ },
+ "Asia/Krasnoyarsk": {
+ "name": "Asia/Krasnoyarsk",
+ "lat": 56.0167,
+ "long": 92.8333,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+04 - Krasnoyarsk area"
+ },
+ "Asia/Irkutsk": {
+ "name": "Asia/Irkutsk",
+ "lat": 52.2667,
+ "long": 104.3333,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+05 - Irkutsk, Buryatia"
+ },
+ "Asia/Chita": {
+ "name": "Asia/Chita",
+ "lat": 52.05,
+ "long": 113.4667,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+06 - Zabaykalsky"
+ },
+ "Asia/Yakutsk": {
+ "name": "Asia/Yakutsk",
+ "lat": 62,
+ "long": 129.6667,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+06 - Lena River"
+ },
+ "Asia/Khandyga": {
+ "name": "Asia/Khandyga",
+ "lat": 62.6564,
+ "long": 135.5539,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+06 - Tomponsky, Ust-Maysky"
+ },
+ "Asia/Vladivostok": {
+ "name": "Asia/Vladivostok",
+ "lat": 43.1667,
+ "long": 131.9333,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+07 - Amur River"
+ },
+ "Asia/Ust-Nera": {
+ "name": "Asia/Ust-Nera",
+ "lat": 64.5603,
+ "long": 143.2267,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+07 - Oymyakonsky"
+ },
+ "Asia/Magadan": {
+ "name": "Asia/Magadan",
+ "lat": 59.5667,
+ "long": 150.8,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+08 - Magadan"
+ },
+ "Asia/Sakhalin": {
+ "name": "Asia/Sakhalin",
+ "lat": 46.9667,
+ "long": 142.7,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+08 - Sakhalin Island"
+ },
+ "Asia/Srednekolymsk": {
+ "name": "Asia/Srednekolymsk",
+ "lat": 67.4667,
+ "long": 153.7167,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+08 - Sakha (E); North Kuril Is"
+ },
+ "Asia/Kamchatka": {
+ "name": "Asia/Kamchatka",
+ "lat": 53.0167,
+ "long": 158.65,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+09 - Kamchatka"
+ },
+ "Asia/Anadyr": {
+ "name": "Asia/Anadyr",
+ "lat": 64.75,
+ "long": 177.4833,
+ "countries": [
+ "RU"
+ ],
+ "comments": "MSK+09 - Bering Sea"
+ },
+ "Asia/Riyadh": {
+ "name": "Asia/Riyadh",
+ "lat": 24.6333,
+ "long": 46.7167,
+ "countries": [
+ "SA",
+ "KW",
+ "YE"
+ ],
+ "comments": ""
+ },
+ "Pacific/Guadalcanal": {
+ "name": "Pacific/Guadalcanal",
+ "lat": -8.4667,
+ "long": 160.2,
+ "countries": [
+ "SB"
+ ],
+ "comments": ""
+ },
+ "Indian/Mahe": {
+ "name": "Indian/Mahe",
+ "lat": -3.3333,
+ "long": 55.4667,
+ "countries": [
+ "SC"
+ ],
+ "comments": ""
+ },
+ "Africa/Khartoum": {
+ "name": "Africa/Khartoum",
+ "lat": 15.6,
+ "long": 32.5333,
+ "countries": [
+ "SD"
+ ],
+ "comments": ""
+ },
+ "Europe/Stockholm": {
+ "name": "Europe/Stockholm",
+ "lat": 59.3333,
+ "long": 18.05,
+ "countries": [
+ "SE"
+ ],
+ "comments": ""
+ },
+ "Asia/Singapore": {
+ "name": "Asia/Singapore",
+ "lat": 1.2833,
+ "long": 103.85,
+ "countries": [
+ "SG"
+ ],
+ "comments": ""
+ },
+ "America/Paramaribo": {
+ "name": "America/Paramaribo",
+ "lat": 5.8333,
+ "long": -54.8333,
+ "countries": [
+ "SR"
+ ],
+ "comments": ""
+ },
+ "Africa/Juba": {
+ "name": "Africa/Juba",
+ "lat": 4.85,
+ "long": 31.6167,
+ "countries": [
+ "SS"
+ ],
+ "comments": ""
+ },
+ "Africa/Sao_Tome": {
+ "name": "Africa/Sao_Tome",
+ "lat": 0.3333,
+ "long": 6.7333,
+ "countries": [
+ "ST"
+ ],
+ "comments": ""
+ },
+ "America/El_Salvador": {
+ "name": "America/El_Salvador",
+ "lat": 13.7,
+ "long": -88.8,
+ "countries": [
+ "SV"
+ ],
+ "comments": ""
+ },
+ "Asia/Damascus": {
+ "name": "Asia/Damascus",
+ "lat": 33.5,
+ "long": 36.3,
+ "countries": [
+ "SY"
+ ],
+ "comments": ""
+ },
+ "America/Grand_Turk": {
+ "name": "America/Grand_Turk",
+ "lat": 21.4667,
+ "long": -70.8667,
+ "countries": [
+ "TC"
+ ],
+ "comments": ""
+ },
+ "Africa/Ndjamena": {
+ "name": "Africa/Ndjamena",
+ "lat": 12.1167,
+ "long": 15.05,
+ "countries": [
+ "TD"
+ ],
+ "comments": ""
+ },
+ "Indian/Kerguelen": {
+ "name": "Indian/Kerguelen",
+ "lat": -48.6472,
+ "long": 70.2175,
+ "countries": [
+ "TF"
+ ],
+ "comments": "Kerguelen, St Paul Island, Amsterdam Island"
+ },
+ "Asia/Bangkok": {
+ "name": "Asia/Bangkok",
+ "lat": 13.75,
+ "long": 100.5167,
+ "countries": [
+ "TH",
+ "KH",
+ "LA",
+ "VN"
+ ],
+ "comments": "Indochina (most areas)"
+ },
+ "Asia/Dushanbe": {
+ "name": "Asia/Dushanbe",
+ "lat": 38.5833,
+ "long": 68.8,
+ "countries": [
+ "TJ"
+ ],
+ "comments": ""
+ },
+ "Pacific/Fakaofo": {
+ "name": "Pacific/Fakaofo",
+ "lat": -8.6333,
+ "long": -170.7667,
+ "countries": [
+ "TK"
+ ],
+ "comments": ""
+ },
+ "Asia/Dili": {
+ "name": "Asia/Dili",
+ "lat": -7.45,
+ "long": 125.5833,
+ "countries": [
+ "TL"
+ ],
+ "comments": ""
+ },
+ "Asia/Ashgabat": {
+ "name": "Asia/Ashgabat",
+ "lat": 37.95,
+ "long": 58.3833,
+ "countries": [
+ "TM"
+ ],
+ "comments": ""
+ },
+ "Africa/Tunis": {
+ "name": "Africa/Tunis",
+ "lat": 36.8,
+ "long": 10.1833,
+ "countries": [
+ "TN"
+ ],
+ "comments": ""
+ },
+ "Pacific/Tongatapu": {
+ "name": "Pacific/Tongatapu",
+ "lat": -20.8333,
+ "long": -174.8333,
+ "countries": [
+ "TO"
+ ],
+ "comments": ""
+ },
+ "Europe/Istanbul": {
+ "name": "Europe/Istanbul",
+ "lat": 41.0167,
+ "long": 28.9667,
+ "countries": [
+ "TR"
+ ],
+ "comments": ""
+ },
+ "America/Port_of_Spain": {
+ "name": "America/Port_of_Spain",
+ "lat": 10.65,
+ "long": -60.4833,
+ "countries": [
+ "TT",
+ "AG",
+ "AI",
+ "BL",
+ "DM",
+ "GD",
+ "GP",
+ "KN",
+ "LC",
+ "MF",
+ "MS",
+ "VC",
+ "VG",
+ "VI"
+ ],
+ "comments": ""
+ },
+ "Pacific/Funafuti": {
+ "name": "Pacific/Funafuti",
+ "lat": -7.4833,
+ "long": 179.2167,
+ "countries": [
+ "TV"
+ ],
+ "comments": ""
+ },
+ "Asia/Taipei": {
+ "name": "Asia/Taipei",
+ "lat": 25.05,
+ "long": 121.5,
+ "countries": [
+ "TW"
+ ],
+ "comments": ""
+ },
+ "Europe/Kiev": {
+ "name": "Europe/Kiev",
+ "lat": 50.4333,
+ "long": 30.5167,
+ "countries": [
+ "UA"
+ ],
+ "comments": "Ukraine (most areas)"
+ },
+ "Europe/Uzhgorod": {
+ "name": "Europe/Uzhgorod",
+ "lat": 48.6167,
+ "long": 22.3,
+ "countries": [
+ "UA"
+ ],
+ "comments": "Ruthenia"
+ },
+ "Europe/Zaporozhye": {
+ "name": "Europe/Zaporozhye",
+ "lat": 47.8333,
+ "long": 35.1667,
+ "countries": [
+ "UA"
+ ],
+ "comments": "Zaporozh'ye/Zaporizhia; Lugansk/Luhansk (east)"
+ },
+ "Pacific/Wake": {
+ "name": "Pacific/Wake",
+ "lat": 19.2833,
+ "long": 166.6167,
+ "countries": [
+ "UM"
+ ],
+ "comments": "Wake Island"
+ },
+ "America/New_York": {
+ "name": "America/New_York",
+ "lat": 40.7142,
+ "long": -73.9936,
+ "countries": [
+ "US"
+ ],
+ "comments": "Eastern (most areas)"
+ },
+ "America/Detroit": {
+ "name": "America/Detroit",
+ "lat": 42.3314,
+ "long": -82.9542,
+ "countries": [
+ "US"
+ ],
+ "comments": "Eastern - MI (most areas)"
+ },
+ "America/Kentucky/Louisville": {
+ "name": "America/Kentucky/Louisville",
+ "lat": 38.2542,
+ "long": -84.2406,
+ "countries": [
+ "US"
+ ],
+ "comments": "Eastern - KY (Louisville area)"
+ },
+ "America/Kentucky/Monticello": {
+ "name": "America/Kentucky/Monticello",
+ "lat": 36.8297,
+ "long": -83.1508,
+ "countries": [
+ "US"
+ ],
+ "comments": "Eastern - KY (Wayne)"
+ },
+ "America/Indiana/Indianapolis": {
+ "name": "America/Indiana/Indianapolis",
+ "lat": 39.7683,
+ "long": -85.8419,
+ "countries": [
+ "US"
+ ],
+ "comments": "Eastern - IN (most areas)"
+ },
+ "America/Indiana/Vincennes": {
+ "name": "America/Indiana/Vincennes",
+ "lat": 38.6772,
+ "long": -86.4714,
+ "countries": [
+ "US"
+ ],
+ "comments": "Eastern - IN (Da, Du, K, Mn)"
+ },
+ "America/Indiana/Winamac": {
+ "name": "America/Indiana/Winamac",
+ "lat": 41.0514,
+ "long": -85.3969,
+ "countries": [
+ "US"
+ ],
+ "comments": "Eastern - IN (Pulaski)"
+ },
+ "America/Indiana/Marengo": {
+ "name": "America/Indiana/Marengo",
+ "lat": 38.3756,
+ "long": -85.6553,
+ "countries": [
+ "US"
+ ],
+ "comments": "Eastern - IN (Crawford)"
+ },
+ "America/Indiana/Petersburg": {
+ "name": "America/Indiana/Petersburg",
+ "lat": 38.4919,
+ "long": -86.7214,
+ "countries": [
+ "US"
+ ],
+ "comments": "Eastern - IN (Pike)"
+ },
+ "America/Indiana/Vevay": {
+ "name": "America/Indiana/Vevay",
+ "lat": 38.7478,
+ "long": -84.9328,
+ "countries": [
+ "US"
+ ],
+ "comments": "Eastern - IN (Switzerland)"
+ },
+ "America/Chicago": {
+ "name": "America/Chicago",
+ "lat": 41.85,
+ "long": -86.35,
+ "countries": [
+ "US"
+ ],
+ "comments": "Central (most areas)"
+ },
+ "America/Indiana/Tell_City": {
+ "name": "America/Indiana/Tell_City",
+ "lat": 37.9531,
+ "long": -85.2386,
+ "countries": [
+ "US"
+ ],
+ "comments": "Central - IN (Perry)"
+ },
+ "America/Indiana/Knox": {
+ "name": "America/Indiana/Knox",
+ "lat": 41.2958,
+ "long": -85.375,
+ "countries": [
+ "US"
+ ],
+ "comments": "Central - IN (Starke)"
+ },
+ "America/Menominee": {
+ "name": "America/Menominee",
+ "lat": 45.1078,
+ "long": -86.3858,
+ "countries": [
+ "US"
+ ],
+ "comments": "Central - MI (Wisconsin border)"
+ },
+ "America/North_Dakota/Center": {
+ "name": "America/North_Dakota/Center",
+ "lat": 47.1164,
+ "long": -100.7008,
+ "countries": [
+ "US"
+ ],
+ "comments": "Central - ND (Oliver)"
+ },
+ "America/North_Dakota/New_Salem": {
+ "name": "America/North_Dakota/New_Salem",
+ "lat": 46.845,
+ "long": -100.5892,
+ "countries": [
+ "US"
+ ],
+ "comments": "Central - ND (Morton rural)"
+ },
+ "America/North_Dakota/Beulah": {
+ "name": "America/North_Dakota/Beulah",
+ "lat": 47.2642,
+ "long": -100.2222,
+ "countries": [
+ "US"
+ ],
+ "comments": "Central - ND (Mercer)"
+ },
+ "America/Denver": {
+ "name": "America/Denver",
+ "lat": 39.7392,
+ "long": -103.0158,
+ "countries": [
+ "US"
+ ],
+ "comments": "Mountain (most areas)"
+ },
+ "America/Boise": {
+ "name": "America/Boise",
+ "lat": 43.6136,
+ "long": -115.7975,
+ "countries": [
+ "US"
+ ],
+ "comments": "Mountain - ID (south); OR (east)"
+ },
+ "America/Phoenix": {
+ "name": "America/Phoenix",
+ "lat": 33.4483,
+ "long": -111.9267,
+ "countries": [
+ "US"
+ ],
+ "comments": "MST - Arizona (except Navajo)"
+ },
+ "America/Los_Angeles": {
+ "name": "America/Los_Angeles",
+ "lat": 34.0522,
+ "long": -117.7572,
+ "countries": [
+ "US"
+ ],
+ "comments": "Pacific"
+ },
+ "America/Anchorage": {
+ "name": "America/Anchorage",
+ "lat": 61.2181,
+ "long": -148.0997,
+ "countries": [
+ "US"
+ ],
+ "comments": "Alaska (most areas)"
+ },
+ "America/Juneau": {
+ "name": "America/Juneau",
+ "lat": 58.3019,
+ "long": -133.5803,
+ "countries": [
+ "US"
+ ],
+ "comments": "Alaska - Juneau area"
+ },
+ "America/Sitka": {
+ "name": "America/Sitka",
+ "lat": 57.1764,
+ "long": -134.6981,
+ "countries": [
+ "US"
+ ],
+ "comments": "Alaska - Sitka area"
+ },
+ "America/Metlakatla": {
+ "name": "America/Metlakatla",
+ "lat": 55.1269,
+ "long": -130.4236,
+ "countries": [
+ "US"
+ ],
+ "comments": "Alaska - Annette Island"
+ },
+ "America/Yakutat": {
+ "name": "America/Yakutat",
+ "lat": 59.5469,
+ "long": -138.2728,
+ "countries": [
+ "US"
+ ],
+ "comments": "Alaska - Yakutat"
+ },
+ "America/Nome": {
+ "name": "America/Nome",
+ "lat": 64.5011,
+ "long": -164.5936,
+ "countries": [
+ "US"
+ ],
+ "comments": "Alaska (west)"
+ },
+ "America/Adak": {
+ "name": "America/Adak",
+ "lat": 51.88,
+ "long": -175.3419,
+ "countries": [
+ "US"
+ ],
+ "comments": "Aleutian Islands"
+ },
+ "Pacific/Honolulu": {
+ "name": "Pacific/Honolulu",
+ "lat": 21.3069,
+ "long": -156.1417,
+ "countries": [
+ "US",
+ "UM"
+ ],
+ "comments": "Hawaii"
+ },
+ "America/Montevideo": {
+ "name": "America/Montevideo",
+ "lat": -33.0908,
+ "long": -55.7875,
+ "countries": [
+ "UY"
+ ],
+ "comments": ""
+ },
+ "Asia/Samarkand": {
+ "name": "Asia/Samarkand",
+ "lat": 39.6667,
+ "long": 66.8,
+ "countries": [
+ "UZ"
+ ],
+ "comments": "Uzbekistan (west)"
+ },
+ "Asia/Tashkent": {
+ "name": "Asia/Tashkent",
+ "lat": 41.3333,
+ "long": 69.3,
+ "countries": [
+ "UZ"
+ ],
+ "comments": "Uzbekistan (east)"
+ },
+ "America/Caracas": {
+ "name": "America/Caracas",
+ "lat": 10.5,
+ "long": -65.0667,
+ "countries": [
+ "VE"
+ ],
+ "comments": ""
+ },
+ "Asia/Ho_Chi_Minh": {
+ "name": "Asia/Ho_Chi_Minh",
+ "lat": 10.75,
+ "long": 106.6667,
+ "countries": [
+ "VN"
+ ],
+ "comments": "Vietnam (south)"
+ },
+ "Pacific/Efate": {
+ "name": "Pacific/Efate",
+ "lat": -16.3333,
+ "long": 168.4167,
+ "countries": [
+ "VU"
+ ],
+ "comments": ""
+ },
+ "Pacific/Wallis": {
+ "name": "Pacific/Wallis",
+ "lat": -12.7,
+ "long": -175.8333,
+ "countries": [
+ "WF"
+ ],
+ "comments": ""
+ },
+ "Pacific/Apia": {
+ "name": "Pacific/Apia",
+ "lat": -12.1667,
+ "long": -170.2667,
+ "countries": [
+ "WS"
+ ],
+ "comments": ""
+ },
+ "Africa/Johannesburg": {
+ "name": "Africa/Johannesburg",
+ "lat": -25.75,
+ "long": 28,
+ "countries": [
+ "ZA",
+ "LS",
+ "SZ"
+ ],
+ "comments": ""
+ }
+ }
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/data/packed/latest.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/data/packed/latest.json
new file mode 100644
index 00000000000..2c7aed01678
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/data/packed/latest.json
@@ -0,0 +1,599 @@
+{
+ "version": "2018e",
+ "zones": [
+ "Africa/Abidjan|LMT GMT|g.8 0|01|-2ldXH.Q|48e5",
+ "Africa/Accra|LMT GMT +0020|.Q 0 -k|012121212121212121212121212121212121212121212121|-26BbX.8 6tzX.8 MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE|41e5",
+ "Africa/Nairobi|LMT EAT +0230 +0245|-2r.g -30 -2u -2J|01231|-1F3Cr.g 3Dzr.g okMu MFXJ|47e5",
+ "Africa/Algiers|PMT WET WEST CET CEST|-9.l 0 -10 -10 -20|0121212121212121343431312123431213|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 DA0 Imo0 rd0 De0 9Xz0 1fb0 1ap0 16K0 2yo0 mEp0 hwL0 jxA0 11A0 dDd0 17b0 11B0 1cN0 2Dy0 1cN0 1fB0 1cL0|26e5",
+ "Africa/Lagos|LMT WAT|-d.A -10|01|-22y0d.A|17e6",
+ "Africa/Bissau|LMT -01 GMT|12.k 10 0|012|-2ldX0 2xoo0|39e4",
+ "Africa/Maputo|LMT CAT|-2a.k -20|01|-2GJea.k|26e5",
+ "Africa/Cairo|EET EEST|-20 -30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1bIO0 vb0 1ip0 11z0 1iN0 1nz0 12p0 1pz0 10N0 1pz0 16p0 1jz0 s3d0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1WL0 rd0 1Rz0 wp0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1qL0 Xd0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1ny0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 WL0 1qN0 Rb0 1wp0 On0 1zd0 Lz0 1EN0 Fb0 c10 8n0 8Nd0 gL0 e10 mn0|15e6",
+ "Africa/Casablanca|LMT WET WEST CET|u.k 0 -10 -10|0121212121212121213121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2gMnt.E 130Lt.E rb0 Dd0 dVb0 b6p0 TX0 EoB0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4mn0 SyN0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 Rc0 11A0 e00 e00 U00 11A0 8o0 e00 11A0 11A0 5A0 e00 17c0 1fA0 1a00 1a00 1fA0 17c0 1io0 14o0 1lc0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1lc0 14o0 1fA0|32e5",
+ "Africa/Ceuta|WET WEST CET CEST|0 -10 -10 -20|010101010101010101010232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-25KN0 11z0 drd0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1y7o0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4VB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|85e3",
+ "Africa/El_Aaiun|LMT -01 WET WEST|Q.M 10 0 -10|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1rDz7.c 1GVA7.c 6L0 AL0 1Nd0 XX0 1Cp0 pz0 1cBB0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 Rc0 11A0 e00 e00 U00 11A0 8o0 e00 11A0 11A0 5A0 e00 17c0 1fA0 1a00 1a00 1fA0 17c0 1io0 14o0 1lc0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1lc0 14o0 1fA0|20e4",
+ "Africa/Johannesburg|SAST SAST SAST|-1u -20 -30|012121|-2GJdu 1Ajdu 1cL0 1cN0 1cL0|84e5",
+ "Africa/Juba|LMT CAT CAST EAT|-26.s -20 -30 -30|01212121212121212121212121212121213|-1yW26.s 1zK06.s 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0",
+ "Africa/Khartoum|LMT CAT CAST EAT|-2a.8 -20 -30 -30|012121212121212121212121212121212131|-1yW2a.8 1zK0a.8 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0 HjL0|51e5",
+ "Africa/Monrovia|MMT MMT GMT|H.8 I.u 0|012|-23Lzg.Q 28G01.m|11e5",
+ "Africa/Ndjamena|LMT WAT WAST|-10.c -10 -20|0121|-2le10.c 2J3c0.c Wn0|13e5",
+ "Africa/Sao_Tome|LMT GMT WAT|A.J 0 -10|012|-2le00 4i6N0",
+ "Africa/Tripoli|LMT CET CEST EET|-Q.I -10 -20 -20|012121213121212121212121213123123|-21JcQ.I 1hnBQ.I vx0 4iP0 xx0 4eN0 Bb0 7ip0 U0n0 A10 1db0 1cN0 1db0 1dd0 1db0 1eN0 1bb0 1e10 1cL0 1c10 1db0 1dd0 1db0 1cN0 1db0 1q10 fAn0 1ep0 1db0 AKq0 TA0 1o00|11e5",
+ "Africa/Tunis|PMT CET CEST|-9.l -10 -20|0121212121212121212121212121212121|-2nco9.l 18pa9.l 1qM0 DA0 3Tc0 11B0 1ze0 WM0 7z0 3d0 14L0 1cN0 1f90 1ar0 16J0 1gXB0 WM0 1rA0 11c0 nwo0 Ko0 1cM0 1cM0 1rA0 10M0 zuM0 10N0 1aN0 1qM0 WM0 1qM0 11A0 1o00|20e5",
+ "Africa/Windhoek|+0130 SAST SAST CAT WAT|-1u -20 -30 -20 -10|01213434343434343434343434343434343434343434343434343|-2GJdu 1Ajdu 1cL0 1SqL0 9Io0 16P0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|32e4",
+ "America/Adak|NST NWT NPT BST BDT AHST HST HDT|b0 a0 a0 b0 a0 a0 a0 90|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|326",
+ "America/Anchorage|AST AWT APT AHST AHDT YST AKST AKDT|a0 90 90 a0 90 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T00 8wX0 iA0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|30e4",
+ "America/Port_of_Spain|LMT AST|46.4 40|01|-2kNvR.U|43e3",
+ "America/Araguaina|LMT -03 -02|3c.M 30 20|0121212121212121212121212121212121212121212121212121|-2glwL.c HdKL.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 ny10 Lz0|14e4",
+ "America/Argentina/Buenos_Aires|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 A4p0 uL0 1qN0 WL0",
+ "America/Argentina/Catamarca|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 7B0 8zb0 uL0",
+ "America/Argentina/Cordoba|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0 1qN0 WL0",
+ "America/Argentina/Jujuy|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1ze0 TX0 1ld0 WK0 1wp0 TX0 A4p0 uL0",
+ "America/Argentina/La_Rioja|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0",
+ "America/Argentina/Mendoza|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232312121321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1u20 SL0 1vd0 Tb0 1wp0 TW0 ri10 Op0 7TX0 uL0",
+ "America/Argentina/Rio_Gallegos|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0",
+ "America/Argentina/Salta|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0",
+ "America/Argentina/San_Juan|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rld0 m10 8lb0 uL0",
+ "America/Argentina/San_Luis|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121212321212|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 XX0 1q20 SL0 AN0 vDb0 m10 8lb0 8L0 jd0 1qN0 WL0 1qN0",
+ "America/Argentina/Tucuman|CMT -04 -03 -02|4g.M 40 30 20|0121212121212121212121212121212121212121212323232313232123232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 4N0 8BX0 uL0 1qN0 WL0",
+ "America/Argentina/Ushuaia|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rkN0 8p0 8zb0 uL0",
+ "America/Curacao|LMT -0430 AST|4z.L 4u 40|012|-2kV7o.d 28KLS.d|15e4",
+ "America/Asuncion|AMT -04 -03|3O.E 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-1x589.k 1DKM9.k 3CL0 3Dd0 10L0 1pB0 10n0 1pB0 10n0 1pB0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1lB0 14n0 1dd0 1cL0 1fd0 WL0 1rd0 1aL0 1dB0 Xz0 1qp0 Xb0 1qN0 10L0 1rB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 WN0 1qL0 11B0 1nX0 1ip0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 TX0 1tB0 19X0 1a10 1fz0 1a10 1fz0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0|28e5",
+ "America/Atikokan|CST CDT CWT CPT EST|60 50 50 50 50|0101234|-25TQ0 1in0 Rnb0 3je0 8x30 iw0|28e2",
+ "America/Bahia_Banderas|LMT MST CST PST MDT CDT|71 70 60 80 60 50|0121212131414141414141414141414141414152525252525252525252525252525252525252525252525252525252|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nW0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|84e3",
+ "America/Bahia|LMT -03 -02|2y.4 30 20|01212121212121212121212121212121212121212121212121212121212121|-2glxp.U HdLp.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 l5B0 Rb0|27e5",
+ "America/Barbados|LMT BMT AST ADT|3W.t 3W.t 40 30|01232323232|-1Q0I1.v jsM0 1ODC1.v IL0 1ip0 17b0 1ip0 17b0 1ld0 13b0|28e4",
+ "America/Belem|LMT -03 -02|3d.U 30 20|012121212121212121212121212121|-2glwK.4 HdKK.4 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|20e5",
+ "America/Belize|LMT CST -0530 CDT|5Q.M 60 5u 50|01212121212121212121212121212121212121212121212121213131|-2kBu7.c fPA7.c Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1f0Mu qn0 lxB0 mn0|57e3",
+ "America/Blanc-Sablon|AST ADT AWT APT|40 30 30 30|010230|-25TS0 1in0 UGp0 8x50 iu0|11e2",
+ "America/Boa_Vista|LMT -04 -03|42.E 40 30|0121212121212121212121212121212121|-2glvV.k HdKV.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 smp0 WL0 1tB0 2L0|62e2",
+ "America/Bogota|BMT -05 -04|4U.g 50 40|0121|-2eb73.I 38yo3.I 2en0|90e5",
+ "America/Boise|PST PDT MST MWT MPT MDT|80 70 70 60 60 60|0101023425252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-261q0 1nX0 11B0 1nX0 8C10 JCL0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 Dd0 1Kn0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e4",
+ "America/Cambridge_Bay|-00 MST MWT MPT MDDT MDT CST CDT EST|0 70 60 60 50 60 60 50 50|0123141515151515151515151515151515151515151515678651515151515151515151515151515151515151515151515151515151515151515151515151|-21Jc0 RO90 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11A0 1nX0 2K0 WQ0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e2",
+ "America/Campo_Grande|LMT -04 -03|3C.s 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2glwl.w HdLl.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0|77e4",
+ "America/Cancun|LMT CST EST EDT CDT|5L.4 60 50 40 50|0123232341414141414141414141414141414141412|-1UQG0 2q2o0 yLB0 1lb0 14p0 1lb0 14p0 Lz0 xB0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4",
+ "America/Caracas|CMT -0430 -04|4r.E 4u 40|01212|-2kV7w.k 28KM2.k 1IwOu kqo0|29e5",
+ "America/Cayenne|LMT -04 -03|3t.k 40 30|012|-2mrwu.E 2gWou.E|58e3",
+ "America/Panama|CMT EST|5j.A 50|01|-2uduE.o|15e5",
+ "America/Chicago|CST CDT EST CWT CPT|60 50 50 50 50|01010101010101010101010101010101010102010101010103401010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 1wp0 TX0 WN0 1qL0 1cN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 11B0 1Hz0 14p0 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|92e5",
+ "America/Chihuahua|LMT MST CST CDT MDT|74.k 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|81e4",
+ "America/Costa_Rica|SJMT CST CDT|5A.d 60 50|0121212121|-1Xd6n.L 2lu0n.L Db0 1Kp0 Db0 pRB0 15b0 1kp0 mL0|12e5",
+ "America/Creston|MST PST|70 80|010|-29DR0 43B0|53e2",
+ "America/Cuiaba|LMT -04 -03|3I.k 40 30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2glwf.E HdLf.E 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 4a10 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0|54e4",
+ "America/Danmarkshavn|LMT -03 -02 GMT|1e.E 30 20 0|01212121212121212121212121212121213|-2a5WJ.k 2z5fJ.k 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 DC0|8",
+ "America/Dawson_Creek|PST PDT PWT PPT MST|80 70 70 70 70|0102301010101010101010101010101010101010101010101010101014|-25TO0 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 ML0|12e3",
+ "America/Dawson|YST YDT YWT YPT YDDT PST PDT|90 80 80 80 70 80 70|0101023040565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-25TN0 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 jrA0 fNd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|13e2",
+ "America/Denver|MST MDT MWT MPT|70 60 60 60|01010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 11B0 1qL0 WN0 mn0 Ord0 8x20 ix0 LCN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e5",
+ "America/Detroit|LMT CST EST EWT EPT EDT|5w.b 60 50 40 40 40|012342525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2Cgir.N peqr.N 156L0 8x40 iv0 6fd0 11z0 XQp0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e5",
+ "America/Edmonton|LMT MST MDT MWT MPT|7x.Q 70 60 60 60|01212121212121341212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2yd4q.8 shdq.8 1in0 17d0 hz0 2dB0 1fz0 1a10 11z0 1qN0 WL0 1qN0 11z0 IGN0 8x20 ix0 3NB0 11z0 LFB0 1cL0 3Cp0 1cL0 66N0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|10e5",
+ "America/Eirunepe|LMT -05 -04|4D.s 50 40|0121212121212121212121212121212121|-2glvk.w HdLk.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0 yTd0 d5X0|31e3",
+ "America/El_Salvador|LMT CST CDT|5U.M 60 50|012121|-1XiG3.c 2Fvc3.c WL0 1qN0 WL0|11e5",
+ "America/Tijuana|LMT MST PST PDT PWT PPT|7M.4 70 80 70 70 70|012123245232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQE0 4PX0 8mM0 8lc0 SN0 1cL0 pHB0 83r0 zI0 5O10 1Rz0 cOO0 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 BUp0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|20e5",
+ "America/Fort_Nelson|PST PDT PWT PPT MST|80 70 70 70 70|01023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010104|-25TO0 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0|39e2",
+ "America/Fort_Wayne|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|010101023010101010101010101040454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 QI10 Db0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 5Tz0 1o10 qLb0 1cL0 1cN0 1cL0 1qhd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/Fortaleza|LMT -03 -02|2y 30 20|0121212121212121212121212121212121212121|-2glxq HdLq 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 5z0 2mN0 On0|34e5",
+ "America/Glace_Bay|LMT AST ADT AWT APT|3X.M 40 30 30 30|012134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsI0.c CwO0.c 1in0 UGp0 8x50 iu0 iq10 11z0 Jg10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3",
+ "America/Godthab|LMT -03 -02|3q.U 30 20|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5Ux.4 2z5dx.4 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e3",
+ "America/Goose_Bay|NST NDT NST NDT NWT NPT AST ADT ADDT|3u.Q 2u.Q 3u 2u 2u 2u 40 30 20|010232323232323245232323232323232323232323232323232323232326767676767676767676767676767676767676767676768676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-25TSt.8 1in0 DXb0 2HbX.8 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 S10 g0u 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|76e2",
+ "America/Grand_Turk|KMT EST EDT AST|57.a 50 40 40|01212121212121212121212121212121212121212121212121212121212121212121212121232121212121212121212121212121212121212121|-2l1uQ.O 2HHBQ.O 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 5Ip0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e2",
+ "America/Guatemala|LMT CST CDT|62.4 60 50|0121212121|-24KhV.U 2efXV.U An0 mtd0 Nz0 ifB0 17b0 zDB0 11z0|13e5",
+ "America/Guayaquil|QMT -05 -04|5e 50 40|0121|-1yVSK 2uILK rz0|27e5",
+ "America/Guyana|LMT -0345 -03 -04|3Q.E 3J 30 40|0123|-2dvU7.k 2r6LQ.k Bxbf|80e4",
+ "America/Halifax|LMT AST ADT AWT APT|4e.o 40 30 30 30|0121212121212121212121212121212121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsHJ.A xzzJ.A 1db0 3I30 1in0 3HX0 IL0 1E10 ML0 1yN0 Pb0 1Bd0 Mn0 1Bd0 Rz0 1w10 Xb0 1w10 LX0 1w10 Xb0 1w10 Lz0 1C10 Jz0 1E10 OL0 1yN0 Un0 1qp0 Xb0 1qp0 11X0 1w10 Lz0 1HB0 LX0 1C10 FX0 1w10 Xb0 1qp0 Xb0 1BB0 LX0 1td0 Xb0 1qp0 Xb0 Rf0 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 6i10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|39e4",
+ "America/Havana|HMT CST CDT|5t.A 50 40|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Meuu.o 72zu.o ML0 sld0 An0 1Nd0 Db0 1Nd0 An0 6Ep0 An0 1Nd0 An0 JDd0 Mn0 1Ap0 On0 1fd0 11X0 1qN0 WL0 1wp0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 14n0 1ld0 14L0 1kN0 15b0 1kp0 1cL0 1cN0 1fz0 1a10 1fz0 1fB0 11z0 14p0 1nX0 11B0 1nX0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 1a10 1in0 1a10 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 17c0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 11A0 6i00 Rc0 1wo0 U00 1tA0 Rc0 1wo0 U00 1wo0 U00 1zc0 U00 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0|21e5",
+ "America/Hermosillo|LMT MST CST PST MDT|7n.Q 70 60 80 60|0121212131414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0|64e4",
+ "America/Indiana/Knox|CST CDT CWT CPT EST|60 50 50 50 50|0101023010101010101010101010101010101040101010101010101010101010101010101010101010101010141010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 3Cn0 8wp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 z8o0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/Indiana/Marengo|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101023010101010101010104545454545414545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 dyN0 11z0 6fd0 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1e6p0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/Indiana/Petersburg|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010104010101010101010101010141014545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 njX0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 3Fb0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 19co0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/Indiana/Tell_City|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010454541010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 g0p0 11z0 1o10 11z0 1qL0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 caL0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/Indiana/Vevay|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|010102304545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 kPB0 Awn0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1lnd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/Indiana/Vincennes|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010454541014545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 g0p0 11z0 1o10 11z0 1qL0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 caL0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/Indiana/Winamac|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010101010454541054545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1za0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/Inuvik|-00 PST PDDT MST MDT|0 80 60 70 60|0121343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-FnA0 tWU0 1fA0 wPe0 2pz0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|35e2",
+ "America/Iqaluit|-00 EWT EPT EST EDDT EDT CST CDT|0 40 40 50 30 40 60 50|01234353535353535353535353535353535353535353567353535353535353535353535353535353535353535353535353535353535353535353535353|-16K00 7nX0 iv0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|67e2",
+ "America/Jamaica|KMT EST EDT|57.a 50 40|0121212121212121212121|-2l1uQ.O 2uM1Q.O 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0|94e4",
+ "America/Juneau|PST PWT PPT PDT YDT YST AKST AKDT|80 70 70 70 80 90 90 80|01203030303030303030303030403030356767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cM0 1cM0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|33e3",
+ "America/Kentucky/Louisville|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101010102301010101010101010101010101454545454545414545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 3Fd0 Nb0 LPd0 11z0 RB0 8x30 iw0 Bb0 10N0 2bB0 8in0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 xz0 gso0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/Kentucky/Monticello|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101023010101010101010101010101010101010101010101010101010101010101010101454545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 SWp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/La_Paz|CMT BST -04|4w.A 3w.A 40|012|-1x37r.o 13b0|19e5",
+ "America/Lima|LMT -05 -04|58.A 50 40|0121212121212121|-2tyGP.o 1bDzP.o zX0 1aN0 1cL0 1cN0 1cL0 1PrB0 zX0 1O10 zX0 6Gp0 zX0 98p0 zX0|11e6",
+ "America/Los_Angeles|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 5Wp1 1VaX 3dA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e6",
+ "America/Maceio|LMT -03 -02|2m.Q 30 20|012121212121212121212121212121212121212121|-2glxB.8 HdLB.8 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 8Q10 WL0 1tB0 5z0 2mN0 On0|93e4",
+ "America/Managua|MMT CST EST CDT|5J.c 60 50 50|0121313121213131|-1quie.M 1yAMe.M 4mn0 9Up0 Dz0 1K10 Dz0 s3F0 1KH0 DB0 9In0 k8p0 19X0 1o30 11y0|22e5",
+ "America/Manaus|LMT -04 -03|40.4 40 30|01212121212121212121212121212121|-2glvX.U HdKX.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0|19e5",
+ "America/Martinique|FFMT AST ADT|44.k 40 30|0121|-2mPTT.E 2LPbT.E 19X0|39e4",
+ "America/Matamoros|LMT CST CDT|6E 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|45e4",
+ "America/Mazatlan|LMT MST CST PST MDT|75.E 70 60 80 60|0121212131414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|44e4",
+ "America/Menominee|CST CDT CWT CPT EST|60 50 50 50 50|01010230101041010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 LCN0 1fz0 6410 9Jb0 1cM0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|85e2",
+ "America/Merida|LMT CST EST CDT|5W.s 60 50 50|0121313131313131313131313131313131313131313131313131313131313131313131313131313131313131|-1UQG0 2q2o0 2hz0 wu30 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|11e5",
+ "America/Metlakatla|PST PWT PPT PDT AKST AKDT|80 70 70 70 90 80|0120303030303030303030303030303030454545454545454545454545454545454545454545454|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1hU10 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2",
+ "America/Mexico_City|LMT MST CST CDT CWT|6A.A 70 60 50 50|012121232324232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 gEn0 TX0 3xd0 Jb0 6zB0 SL0 e5d0 17b0 1Pff0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|20e6",
+ "America/Miquelon|LMT AST -03 -02|3I.E 40 30 20|012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2mKkf.k 2LTAf.k gQ10 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|61e2",
+ "America/Moncton|EST AST ADT AWT APT|50 40 30 30 30|012121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsH0 CwN0 1in0 zAo0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1K10 Lz0 1zB0 NX0 1u10 Wn0 S20 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14n1 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 ReX 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|64e3",
+ "America/Monterrey|LMT CST CDT|6F.g 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|41e5",
+ "America/Montevideo|LMT MMT -04 -03 -0330 -0230 -02 -0130|3I.P 3I.P 40 30 3u 2u 20 1u|012343434343434343434343435353636353636375363636363636363636363636363636363636363636363|-2tRUf.9 sVc0 8jcf.9 1db0 1dcu 1cLu 1dcu 1cLu ircu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu WLu 1fAu 1cLu 1o0u 11zu NAu 3jXu zXu Dq0u 19Xu pcu jz0 cm10 19X0 6tB0 1fbu 3o0u jX0 4vB0 xz0 3Cp0 mmu 1a10 IMu Db0 4c10 uL0 1Nd0 An0 1SN0 uL0 mp0 28L0 iPB0 un0 1SN0 xz0 1zd0 Lz0 1zd0 Rb0 1zd0 On0 1wp0 Rb0 s8p0 1fB0 1ip0 11z0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 11z0|17e5",
+ "America/Toronto|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101012301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TR0 1in0 11Wu 1nzu 1fD0 WJ0 1wr0 Nb0 1Ap0 On0 1zd0 On0 1wp0 TX0 1tB0 TX0 1tB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 4kM0 8x40 iv0 1o10 11z0 1nX0 11z0 1o10 11z0 1o10 1qL0 11D0 1nX0 11B0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e5",
+ "America/Nassau|LMT EST EDT|59.u 50 40|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2kNuO.u 26XdO.u 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|24e4",
+ "America/New_York|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 11B0 1qL0 1a10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x40 iv0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e6",
+ "America/Nipigon|EST EDT EWT EPT|50 40 40 40|010123010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TR0 1in0 Rnb0 3je0 8x40 iv0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|16e2",
+ "America/Nome|NST NWT NPT BST BDT YST AKST AKDT|b0 a0 a0 b0 a0 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cl0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|38e2",
+ "America/Noronha|LMT -02 -01|29.E 20 10|0121212121212121212121212121212121212121|-2glxO.k HdKO.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|30e2",
+ "America/North_Dakota/Beulah|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101014545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/North_Dakota/Center|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101014545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/North_Dakota/New_Salem|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101454545454545454545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "America/Ojinaga|LMT MST CST CDT MDT|6V.E 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e3",
+ "America/Pangnirtung|-00 AST AWT APT ADDT ADT EDT EST CST CDT|0 40 30 30 20 30 40 50 60 50|012314151515151515151515151515151515167676767689767676767676767676767676767676767676767676767676767676767676767676767676767|-1XiM0 PnG0 8x50 iu0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1o00 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2",
+ "America/Paramaribo|LMT PMT PMT -0330 -03|3E.E 3E.Q 3E.A 3u 30|01234|-2nDUj.k Wqo0.c qanX.I 1yVXN.o|24e4",
+ "America/Phoenix|MST MDT MWT|70 60 60|01010202010|-261r0 1nX0 11B0 1nX0 SgN0 4Al1 Ap0 1db0 SWqX 1cL0|42e5",
+ "America/Port-au-Prince|PPMT EST EDT|4N 50 40|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-28RHb 2FnMb 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14q0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 i6n0 1nX0 11B0 1nX0 d430 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 3iN0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5",
+ "America/Rio_Branco|LMT -05 -04|4v.c 50 40|01212121212121212121212121212121|-2glvs.M HdLs.M 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0 d5X0|31e4",
+ "America/Porto_Velho|LMT -04 -03|4f.A 40 30|012121212121212121212121212121|-2glvI.o HdKI.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|37e4",
+ "America/Puerto_Rico|AST AWT APT|40 30 30|0120|-17lU0 7XT0 iu0|24e5",
+ "America/Punta_Arenas|SMT -05 -04 -03|4G.K 50 40 30|0102021212121212121232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-2q2jh.e fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 blz0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0",
+ "America/Rainy_River|CST CDT CWT CPT|60 50 50 50|010123010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TQ0 1in0 Rnb0 3je0 8x30 iw0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|842",
+ "America/Rankin_Inlet|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313131313131313131313131313131313131313131313131313131313131313131|-vDc0 keu0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e2",
+ "America/Recife|LMT -03 -02|2j.A 30 20|0121212121212121212121212121212121212121|-2glxE.o HdLE.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|33e5",
+ "America/Regina|LMT MST MDT MWT MPT CST|6W.A 70 60 60 60 60|012121212121212121212121341212121212121212121212121215|-2AD51.o uHe1.o 1in0 s2L0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 66N0 1cL0 1cN0 19X0 1fB0 1cL0 1fB0 1cL0 1cN0 1cL0 M30 8x20 ix0 1ip0 1cL0 1ip0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 3NB0 1cL0 1cN0|19e4",
+ "America/Resolute|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313431313131313131313131313131313131313131313131313131313131313131|-SnA0 GWS0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|229",
+ "America/Santarem|LMT -04 -03|3C.M 40 30|0121212121212121212121212121212|-2glwl.c HdLl.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0|21e4",
+ "America/Santiago|SMT -05 -04 -03|4G.K 50 40 30|010202121212121212321232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-2q2jh.e fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 9Bz0 jb0 1oN0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0|62e5",
+ "America/Santo_Domingo|SDMT EST EDT -0430 AST|4E 50 40 4u 40|01213131313131414|-1ttjk 1lJMk Mn0 6sp0 Lbu 1Cou yLu 1RAu wLu 1QMu xzu 1Q0u xXu 1PAu 13jB0 e00|29e5",
+ "America/Sao_Paulo|LMT -03 -02|36.s 30 20|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2glwR.w HdKR.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 pTd0 PX0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0 1HB0 FX0 1HB0 IL0 1HB0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0 IL0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1HB0 FX0 1Kp0 FX0 1HB0 IL0 1EN0 FX0 1HB0 FX0 1HB0 IL0 1EN0|20e6",
+ "America/Scoresbysund|LMT -02 -01 +00|1r.Q 20 10 0|0121323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2a5Ww.8 2z5ew.8 1a00 1cK0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|452",
+ "America/Sitka|PST PWT PPT PDT YST AKST AKDT|80 70 70 70 90 90 80|01203030303030303030303030303030345656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|90e2",
+ "America/St_Johns|NST NDT NST NDT NWT NPT NDDT|3u.Q 2u.Q 3u 2u 2u 2u 1u|01010101010101010101010101010101010102323232323232324523232323232323232323232323232323232323232323232323232323232323232323232323232323232326232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-28oit.8 14L0 1nB0 1in0 1gm0 Dz0 1JB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1fB0 19X0 1fB0 19X0 10O0 eKX.8 19X0 1iq0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4",
+ "America/Swift_Current|LMT MST MDT MWT MPT CST|7b.k 70 60 60 60 60|012134121212121212121215|-2AD4M.E uHdM.E 1in0 UGp0 8x20 ix0 1o10 17b0 1ip0 11z0 1o10 11z0 1o10 11z0 isN0 1cL0 3Cp0 1cL0 1cN0 11z0 1qN0 WL0 pMp0|16e3",
+ "America/Tegucigalpa|LMT CST CDT|5M.Q 60 50|01212121|-1WGGb.8 2ETcb.8 WL0 1qN0 WL0 GRd0 AL0|11e5",
+ "America/Thule|LMT AST ADT|4z.8 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5To.Q 31NBo.Q 1cL0 1cN0 1cL0 1fB0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|656",
+ "America/Thunder_Bay|CST EST EWT EPT EDT|60 50 40 40 40|0123141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-2q5S0 1iaN0 8x40 iv0 XNB0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4",
+ "America/Vancouver|PST PDT PWT PPT|80 70 70 70|0102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TO0 1in0 UGp0 8x10 iy0 1o10 17b0 1ip0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5",
+ "America/Whitehorse|YST YDT YWT YPT YDDT PST PDT|90 80 80 80 70 80 70|0101023040565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-25TN0 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 3NA0 vrd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e3",
+ "America/Winnipeg|CST CDT CWT CPT|60 50 50 50|010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aIi0 WL0 3ND0 1in0 Jap0 Rb0 aCN0 8x30 iw0 1tB0 11z0 1ip0 11z0 1o10 11z0 1o10 11z0 1rd0 10L0 1op0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 1cL0 1cN0 11z0 6i10 WL0 6i10 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|66e4",
+ "America/Yakutat|YST YWT YPT YDT AKST AKDT|90 80 80 80 90 80|01203030303030303030303030303030304545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-17T10 8x00 iz0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cn0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|642",
+ "America/Yellowknife|-00 MST MWT MPT MDDT MDT|0 70 60 60 50 60|012314151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151|-1pdA0 hix0 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3",
+ "Antarctica/Casey|-00 +08 +11|0 -80 -b0|01212121|-2q00 1DjS0 T90 40P0 KL0 blz0 3m10|10",
+ "Antarctica/Davis|-00 +07 +05|0 -70 -50|01012121|-vyo0 iXt0 alj0 1D7v0 VB0 3Wn0 KN0|70",
+ "Antarctica/DumontDUrville|-00 +10|0 -a0|0101|-U0o0 cfq0 bFm0|80",
+ "Antarctica/Macquarie|AEST AEDT -00 +11|-a0 -b0 0 -b0|0102010101010101010101010101010101010101010101010101010101010101010101010101010101010101013|-29E80 19X0 4SL0 1ayy0 Lvs0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0|1",
+ "Antarctica/Mawson|-00 +06 +05|0 -60 -50|012|-CEo0 2fyk0|60",
+ "Pacific/Auckland|NZMT NZST NZST NZDT|-bu -cu -c0 -d0|01020202020202020202020202023232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1GCVu Lz0 1tB0 11zu 1o0u 11zu 1o0u 11zu 1o0u 14nu 1lcu 14nu 1lcu 1lbu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1qLu WMu 1qLu 11Au 1n1bu IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|14e5",
+ "Antarctica/Palmer|-00 -03 -04 -02|0 30 40 20|0121212121213121212121212121212121212121212121212121212121212121212121212121212121|-cao0 nD0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 jsN0 14N0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|40",
+ "Antarctica/Rothera|-00 -03|0 30|01|gOo0|130",
+ "Antarctica/Syowa|-00 +03|0 -30|01|-vs00|20",
+ "Antarctica/Troll|-00 +00 +02|0 0 -20|01212121212121212121212121212121212121212121212121212121212121212121|1puo0 hd0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|40",
+ "Antarctica/Vostok|-00 +06|0 -60|01|-tjA0|25",
+ "Europe/Oslo|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2awM0 Qm0 W6o0 5pf0 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 wJc0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1qM0 WM0 zpc0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|62e4",
+ "Asia/Riyadh|LMT +03|-36.Q -30|01|-TvD6.Q|57e5",
+ "Asia/Almaty|LMT +05 +06 +07|-57.M -50 -60 -70|012323232323232323232321232323232323232323232323232|-1Pc57.M eUo7.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|15e5",
+ "Asia/Amman|LMT EET EEST|-2n.I -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1yW2n.I 1HiMn.I KL0 1oN0 11b0 1oN0 11b0 1pd0 1dz0 1cp0 11b0 1op0 11b0 fO10 1db0 1e10 1cL0 1cN0 1cL0 1cN0 1fz0 1pd0 10n0 1ld0 14n0 1hB0 15b0 1ip0 19X0 1cN0 1cL0 1cN0 17b0 1ld0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1So0 y00 1fc0 1dc0 1co0 1dc0 1cM0 1cM0 1cM0 1o00 11A0 1lc0 17c0 1cM0 1cM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 4bX0 Dd0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|25e5",
+ "Asia/Anadyr|LMT +12 +13 +14 +11|-bN.U -c0 -d0 -e0 -b0|01232121212121212121214121212121212121212121212121212121212141|-1PcbN.U eUnN.U 23CL0 1db0 2q10 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|13e3",
+ "Asia/Aqtau|LMT +04 +05 +06|-3l.4 -40 -50 -60|012323232323232323232123232312121212121212121212|-1Pc3l.4 eUnl.4 24PX0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|15e4",
+ "Asia/Aqtobe|LMT +04 +05 +06|-3M.E -40 -50 -60|0123232323232323232321232323232323232323232323232|-1Pc3M.E eUnM.E 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|27e4",
+ "Asia/Ashgabat|LMT +04 +05 +06|-3R.w -40 -50 -60|0123232323232323232323212|-1Pc3R.w eUnR.w 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0|41e4",
+ "Asia/Atyrau|LMT +03 +05 +06 +04|-3r.I -30 -50 -60 -40|01232323232323232323242323232323232324242424242|-1Pc3r.I eUor.I 24PW0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 2sp0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0",
+ "Asia/Baghdad|BMT +03 +04|-2V.A -30 -40|012121212121212121212121212121212121212121212121212121|-26BeV.A 2ACnV.A 11b0 1cp0 1dz0 1dd0 1db0 1cN0 1cp0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1de0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0|66e5",
+ "Asia/Qatar|LMT +04 +03|-3q.8 -40 -30|012|-21Jfq.8 27BXq.8|96e4",
+ "Asia/Baku|LMT +03 +04 +05|-3j.o -30 -40 -50|01232323232323232323232123232323232323232323232323232323232323232|-1Pc3j.o 1jUoj.o WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 9Je0 1o00 11z0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5",
+ "Asia/Bangkok|BMT +07|-6G.4 -70|01|-218SG.4|15e6",
+ "Asia/Barnaul|LMT +06 +07 +08|-5z -60 -70 -80|0123232323232323232323212323232321212121212121212121212121212121212|-21S5z pCnz 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 p90 LE0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0",
+ "Asia/Beirut|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-21aq0 1on0 1410 1db0 19B0 1in0 1ip0 WL0 1lQp0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 q6N0 En0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1op0 11b0 dA10 17b0 1iN0 17b0 1iN0 17b0 1iN0 17b0 1vB0 SL0 1mp0 13z0 1iN0 17b0 1iN0 17b0 1jd0 12n0 1a10 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0|22e5",
+ "Asia/Bishkek|LMT +05 +06 +07|-4W.o -50 -60 -70|012323232323232323232321212121212121212121212121212|-1Pc4W.o eUnW.o 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2e00 1tX0 17b0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1cPu 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0|87e4",
+ "Asia/Brunei|LMT +0730 +08|-7D.E -7u -80|012|-1KITD.E gDc9.E|42e4",
+ "Asia/Kolkata|MMT IST +0630|-5l.a -5u -6u|012121|-2zOtl.a 1r2LP.a 1un0 HB0 7zX0|15e6",
+ "Asia/Chita|LMT +08 +09 +10|-7x.Q -80 -90 -a0|012323232323232323232321232323232323232323232323232323232323232312|-21Q7x.Q pAnx.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3re0|33e4",
+ "Asia/Choibalsan|LMT +07 +08 +10 +09|-7C -70 -80 -a0 -90|0123434343434343434343434343434343434343434343424242|-2APHC 2UkoC cKn0 1da0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 3Db0 h1f0 1cJ0 1cP0 1cJ0|38e3",
+ "Asia/Shanghai|CST CDT|-80 -90|01010101010101010|-1c1I0 LX0 16p0 1jz0 1Myp0 Rb0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0|23e6",
+ "Asia/Colombo|MMT +0530 +06 +0630|-5j.w -5u -60 -6u|01231321|-2zOtj.w 1rFbN.w 1zzu 7Apu 23dz0 11zu n3cu|22e5",
+ "Asia/Dhaka|HMT +0630 +0530 +06 +07|-5R.k -6u -5u -60 -70|0121343|-18LFR.k 1unn.k HB0 m6n0 2kxbu 1i00|16e6",
+ "Asia/Damascus|LMT EET EEST|-2p.c -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-21Jep.c Hep.c 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1xRB0 11X0 1oN0 10L0 1pB0 11b0 1oN0 10L0 1mp0 13X0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 Nb0 1AN0 Nb0 bcp0 19X0 1gp0 19X0 3ld0 1xX0 Vd0 1Bz0 Sp0 1vX0 10p0 1dz0 1cN0 1cL0 1db0 1db0 1g10 1an0 1ap0 1db0 1fd0 1db0 1cN0 1db0 1dd0 1db0 1cp0 1dz0 1c10 1dX0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 19z0 1fB0 1qL0 11B0 1on0 Wp0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0|26e5",
+ "Asia/Dili|LMT +08 +09|-8m.k -80 -90|01212|-2le8m.k 1dnXm.k 1nfA0 Xld0|19e4",
+ "Asia/Dubai|LMT +04|-3F.c -40|01|-21JfF.c|39e5",
+ "Asia/Dushanbe|LMT +05 +06 +07|-4z.c -50 -60 -70|012323232323232323232321|-1Pc4z.c eUnz.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2hB0|76e4",
+ "Asia/Famagusta|LMT EET EEST +03|-2f.M -20 -30 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212312121212121212121212121212121212121212121|-1Vc2f.M 2a3cf.M 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00",
+ "Asia/Gaza|EET EEST IST IDT|-20 -30 -20 -30|010101010101010101010101010101012323232323232323232323232320101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1c2q0 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 pBd0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 npB0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 11z0 1o10 14o0 1lA1 SKX 1xd1 MKX 1AN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nz0 1220 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0|18e5",
+ "Asia/Hebron|EET EEST IST IDT|-20 -30 -20 -30|01010101010101010101010101010101232323232323232323232323232010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1c2q0 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 pBd0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 npB0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 12L0 1mN0 14o0 1lc0 Tb0 1xd1 MKX bB0 cn0 1cN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nz0 1220 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1qL0|25e4",
+ "Asia/Ho_Chi_Minh|LMT PLMT +07 +08 +09|-76.E -76.u -70 -80 -90|0123423232|-2yC76.E bK00.a 1h7b6.u 5lz0 18o0 3Oq0 k5b0 aW00 BAM0|90e5",
+ "Asia/Hong_Kong|LMT HKT HKST JST|-7A.G -80 -90 -90|0121312121212121212121212121212121212121212121212121212121212121212121|-2CFHA.G 1sEP6.G 1cL0 ylu 93X0 1qQu 1tX0 Rd0 1In0 NB0 1cL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1kL0 14N0 1nX0 U10 1tz0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 Rd0 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 17d0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|73e5",
+ "Asia/Hovd|LMT +06 +07 +08|-66.A -60 -70 -80|012323232323232323232323232323232323232323232323232|-2APG6.A 2Uko6.A cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|81e3",
+ "Asia/Irkutsk|IMT +07 +08 +09|-6V.5 -70 -80 -90|01232323232323232323232123232323232323232323232323232323232323232|-21zGV.5 pjXV.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4",
+ "Europe/Istanbul|IMT EET EEST +04 +03|-1U.U -20 -30 -40 -30|012121212121212121212121212121212121212121212121212121234343434342121212121212121212121212121212121212121212121212121212121212124|-2ogNU.U dzzU.U 11b0 8tB0 1on0 1410 1db0 19B0 1in0 3Rd0 Un0 1oN0 11b0 zSp0 CL0 mN0 1Vz0 1gN0 1pz0 5Rd0 1fz0 1yp0 ML0 1kp0 17b0 1ip0 17b0 1fB0 19X0 1jB0 18L0 1ip0 17z0 qdd0 xX0 3S10 Tz0 dA10 11z0 1o10 11z0 1qN0 11z0 1ze0 11B0 WM0 1qO0 WI0 1nX0 1rB0 10L0 11B0 1in0 17d0 1in0 2pX0 19E0 1fU0 16Q0 1iI0 16Q0 1iI0 1Vd0 pb0 3Kp0 14o0 1de0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1a00 1fA0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WO0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 Xc0 1qo0 WM0 1qM0 11A0 1o00 1200 1nA0 11A0 1tA0 U00 15w0|13e6",
+ "Asia/Jakarta|BMT +0720 +0730 +09 +08 WIB|-77.c -7k -7u -90 -80 -70|01232425|-1Q0Tk luM0 mPzO 8vWu 6kpu 4PXu xhcu|31e6",
+ "Asia/Jayapura|LMT +09 +0930 WIT|-9m.M -90 -9u -90|0123|-1uu9m.M sMMm.M L4nu|26e4",
+ "Asia/Jerusalem|JMT IST IDT IDDT|-2k.E -20 -30 -40|01212121212132121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-26Bek.E SyMk.E 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 3LB0 Em0 or0 1cn0 1dB0 16n0 10O0 1ja0 1tC0 14o0 1cM0 1a00 11A0 1Na0 An0 1MP0 AJ0 1Kp0 LC0 1oo0 Wl0 EQN0 Db0 1fB0 Rb0 npB0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 1hB0 1dX0 1ep0 1aL0 1eN0 17X0 1nf0 11z0 1tB0 19W0 1e10 17b0 1ep0 1gL0 18N0 1fz0 1eN0 17b0 1gq0 1gn0 19d0 1dz0 1c10 17X0 1hB0 1gn0 19d0 1dz0 1c10 17X0 1kp0 1dz0 1c10 1aL0 1eN0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0|81e4",
+ "Asia/Kabul|+04 +0430|-40 -4u|01|-10Qs0|46e5",
+ "Asia/Kamchatka|LMT +11 +12 +13|-ay.A -b0 -c0 -d0|012323232323232323232321232323232323232323232323232323232323212|-1SLKy.A ivXy.A 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|18e4",
+ "Asia/Karachi|LMT +0530 +0630 +05 PKT PKST|-4s.c -5u -6u -50 -50 -60|012134545454|-2xoss.c 1qOKW.c 7zX0 eup0 LqMu 1fy00 1cL0 dK10 11b0 1610 1jX0|24e6",
+ "Asia/Urumqi|LMT +06|-5O.k -60|01|-1GgtO.k|32e5",
+ "Asia/Kathmandu|LMT +0530 +0545|-5F.g -5u -5J|012|-21JhF.g 2EGMb.g|12e5",
+ "Asia/Khandyga|LMT +08 +09 +10 +11|-92.d -80 -90 -a0 -b0|0123232323232323232323212323232323232323232323232343434343434343432|-21Q92.d pAp2.d 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 qK0 yN0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|66e2",
+ "Asia/Krasnoyarsk|LMT +06 +07 +08|-6b.q -60 -70 -80|01232323232323232323232123232323232323232323232323232323232323232|-21Hib.q prAb.q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|10e5",
+ "Asia/Kuala_Lumpur|SMT +07 +0720 +0730 +09 +08|-6T.p -70 -7k -7u -90 -80|0123435|-2Bg6T.p 17anT.p l5XE 17bO 8Fyu 1so1u|71e5",
+ "Asia/Kuching|LMT +0730 +08 +0820 +09|-7l.k -7u -80 -8k -90|0123232323232323242|-1KITl.k gDbP.k 6ynu AnE 1O0k AnE 1NAk AnE 1NAk AnE 1NAk AnE 1O0k AnE 1NAk AnE pAk 8Fz0|13e4",
+ "Asia/Macau|LMT CST CDT|-7y.k -80 -90|012121212121212121212121212121212121212121|-2le80 1XO3u 1wn0 Rd0 1wn0 R9u 1wqu U10 1tz0 TVu 1tz0 17gu 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cJu 1cL0 1cN0 1fz0 1cN0 1cOu 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cJu 1cL0 1cN0 1fz0 1cN0 1cL0|57e4",
+ "Asia/Magadan|LMT +10 +11 +12|-a3.c -a0 -b0 -c0|012323232323232323232321232323232323232323232323232323232323232312|-1Pca3.c eUo3.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Cq0|95e3",
+ "Asia/Makassar|LMT MMT +08 +09 WITA|-7V.A -7V.A -80 -90 -80|01234|-21JjV.A vfc0 myLV.A 8ML0|15e5",
+ "Asia/Manila|+08 +09|-80 -90|010101010|-1kJI0 AL0 cK10 65X0 mXB0 vX0 VK10 1db0|24e6",
+ "Asia/Nicosia|LMT EET EEST|-2d.s -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Vc2d.s 2a3cd.s 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|32e4",
+ "Asia/Novokuznetsk|LMT +06 +07 +08|-5M.M -60 -70 -80|012323232323232323232321232323232323232323232323232323232323212|-1PctM.M eULM.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|55e4",
+ "Asia/Novosibirsk|LMT +06 +07 +08|-5v.E -60 -70 -80|0123232323232323232323212323212121212121212121212121212121212121212|-21Qnv.E pAFv.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 ml0 Os0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 4eN0|15e5",
+ "Asia/Omsk|LMT +05 +06 +07|-4R.u -50 -60 -70|01232323232323232323232123232323232323232323232323232323232323232|-224sR.u pMLR.u 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|12e5",
+ "Asia/Oral|LMT +03 +05 +06 +04|-3p.o -30 -50 -60 -40|01232323232323232424242424242424242424242424242|-1Pc3p.o eUop.o 23CK0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 1cM0 IM0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|27e4",
+ "Asia/Pontianak|LMT PMT +0730 +09 +08 WITA WIB|-7h.k -7h.k -7u -90 -80 -80 -70|012324256|-2ua7h.k XE00 munL.k 8Rau 6kpu 4PXu xhcu Wqnu|23e4",
+ "Asia/Pyongyang|LMT KST JST KST|-8n -8u -90 -90|012313|-2um8n 97XR 1lTzu 2Onc0 6BAu|29e5",
+ "Asia/Qyzylorda|LMT +04 +05 +06|-4l.Q -40 -50 -60|0123232323232323232323232323232323232323232323|-1Pc4l.Q eUol.Q 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 3ao0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|73e4",
+ "Asia/Rangoon|RMT +0630 +09|-6o.L -6u -90|0121|-21Jio.L SmnS.L 7j9u|48e5",
+ "Asia/Sakhalin|LMT +09 +11 +12 +10|-9u.M -90 -b0 -c0 -a0|01232323232323232323232423232323232424242424242424242424242424242|-2AGVu.M 1BoMu.M 1qFa0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 2pB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|58e4",
+ "Asia/Samarkand|LMT +04 +05 +06|-4r.R -40 -50 -60|01232323232323232323232|-1Pc4r.R eUor.R 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|36e4",
+ "Asia/Seoul|LMT KST JST KST KDT KDT|-8r.Q -8u -90 -90 -9u -a0|0123141414141414135353|-2um8r.Q 97XV.Q 1m1zu kKo0 2I0u OL0 1FB0 Rb0 1qN0 TX0 1tB0 TX0 1tB0 TX0 1tB0 TX0 2ap0 12FBu 11A0 1o00 11A0|23e6",
+ "Asia/Srednekolymsk|LMT +10 +11 +12|-ae.Q -a0 -b0 -c0|01232323232323232323232123232323232323232323232323232323232323232|-1Pcae.Q eUoe.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|35e2",
+ "Asia/Taipei|CST JST CDT|-80 -90 -90|01020202020202020202020202020202020202020|-1iw80 joM0 1yo0 Tz0 1ip0 1jX0 1cN0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 10N0 1BX0 10p0 1pz0 10p0 1pz0 10p0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1BB0 ML0 1Bd0 ML0 uq10 1db0 1cN0 1db0 97B0 AL0|74e5",
+ "Asia/Tashkent|LMT +05 +06 +07|-4B.b -50 -60 -70|012323232323232323232321|-1Pc4B.b eUnB.b 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0|23e5",
+ "Asia/Tbilisi|TBMT +03 +04 +05|-2X.b -30 -40 -50|0123232323232323232323212121232323232323232323212|-1Pc2X.b 1jUnX.b WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cK0 1cL0 1cN0 1cL0 1cN0 2pz0 1cL0 1fB0 3Nz0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 An0 Os0 WM0|11e5",
+ "Asia/Tehran|LMT TMT +0330 +04 +05 +0430|-3p.I -3p.I -3u -40 -50 -4u|01234325252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2btDp.I 1d3c0 1huLT.I TXu 1pz0 sN0 vAu 1cL0 1dB0 1en0 pNB0 UL0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 64p0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0|14e6",
+ "Asia/Thimphu|LMT +0530 +06|-5W.A -5u -60|012|-Su5W.A 1BGMs.A|79e3",
+ "Asia/Tokyo|JST JDT|-90 -a0|010101010|-QJJ0 Rb0 1ld0 14n0 1zd0 On0 1zd0 On0|38e6",
+ "Asia/Tomsk|LMT +06 +07 +08|-5D.P -60 -70 -80|0123232323232323232323212323232323232323232323212121212121212121212|-21NhD.P pxzD.P 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 co0 1bB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Qp0|10e5",
+ "Asia/Ulaanbaatar|LMT +07 +08 +09|-77.w -70 -80 -90|012323232323232323232323232323232323232323232323232|-2APH7.w 2Uko7.w cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|12e5",
+ "Asia/Ust-Nera|LMT +08 +09 +12 +11 +10|-9w.S -80 -90 -c0 -b0 -a0|012343434343434343434345434343434343434343434343434343434343434345|-21Q9w.S pApw.S 23CL0 1d90 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|65e2",
+ "Asia/Vladivostok|LMT +09 +10 +11|-8L.v -90 -a0 -b0|01232323232323232323232123232323232323232323232323232323232323232|-1SJIL.v itXL.v 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4",
+ "Asia/Yakutsk|LMT +08 +09 +10|-8C.W -80 -90 -a0|01232323232323232323232123232323232323232323232323232323232323232|-21Q8C.W pAoC.W 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|28e4",
+ "Asia/Yekaterinburg|LMT PMT +04 +05 +06|-42.x -3J.5 -40 -50 -60|012343434343434343434343234343434343434343434343434343434343434343|-2ag42.x 7mQh.s qBvJ.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|14e5",
+ "Asia/Yerevan|LMT +03 +04 +05|-2W -30 -40 -50|0123232323232323232323212121212323232323232323232323232323232|-1Pc2W 1jUnW WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 4RX0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|13e5",
+ "Atlantic/Azores|HMT -02 -01 +00 WET|1S.w 20 10 0 0|01212121212121212121212121212121212121212121232123212321232121212121212121212121212121212121212121232323232323232323232323232323234323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2ldW0 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|25e4",
+ "Atlantic/Bermuda|LMT AST ADT|4j.i 40 30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1BnRE.G 1LTbE.G 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e3",
+ "Atlantic/Canary|LMT -01 WET WEST|11.A 10 0 -10|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UtaW.o XPAW.o 1lAK0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4",
+ "Atlantic/Cape_Verde|LMT -02 -01|1y.4 20 10|01212|-2ldW0 1eEo0 7zX0 1djf0|50e4",
+ "Atlantic/Faroe|LMT WET WEST|r.4 0 -10|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2uSnw.U 2Wgow.U 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|49e3",
+ "Atlantic/Madeira|FMT -01 +00 +01 WET WEST|17.A 10 0 -10 0 -10|01212121212121212121212121212121212121212121232123212321232121212121212121212121212121212121212121454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2ldX0 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|27e4",
+ "Atlantic/Reykjavik|LMT -01 +00 GMT|1s 10 0 0|012121212121212121212121212121212121212121212121212121212121212121213|-2uWmw mfaw 1Bd0 ML0 1LB0 Cn0 1LB0 3fX0 C10 HrX0 1cO0 LB0 1EL0 LA0 1C00 Oo0 1wo0 Rc0 1wo0 Rc0 1wo0 Rc0 1zc0 Oo0 1zc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0|12e4",
+ "Atlantic/South_Georgia|-02|20|0||30",
+ "Atlantic/Stanley|SMT -04 -03 -02|3P.o 40 30 20|012121212121212323212121212121212121212121212121212121212121212121212|-2kJw8.A 12bA8.A 19X0 1fB0 19X0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 Cn0 1Cc10 WL0 1qL0 U10 1tz0 2mN0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 U10 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qN0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 U10 1tz0 U10 1tz0 U10|21e2",
+ "Australia/Sydney|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|40e5",
+ "Australia/Adelaide|ACST ACDT|-9u -au|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lt xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 WM0 1qM0 Rc0 1zc0 U00 1tA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|11e5",
+ "Australia/Brisbane|AEST AEDT|-a0 -b0|01010101010101010|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0|20e5",
+ "Australia/Broken_Hill|ACST ACDT|-9u -au|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lt xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|18e3",
+ "Australia/Currie|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-29E80 19X0 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|746",
+ "Australia/Darwin|ACST ACDT|-9u -au|010101010|-293lt xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0|12e4",
+ "Australia/Eucla|+0845 +0945|-8J -9J|0101010101010101010|-293kI xcX 10jd0 yL0 1cN0 1cL0 1gSp0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|368",
+ "Australia/Hobart|AEST AEDT|-a0 -b0|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-29E80 19X0 10jd0 yL0 1cN0 1cL0 1fB0 19X0 VfB0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|21e4",
+ "Australia/Lord_Howe|AEST +1030 +1130 +11|-a0 -au -bu -b0|0121212121313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313|raC0 1zdu Rb0 1zd0 On0 1zd0 On0 1zd0 On0 1zd0 TXu 1qMu WLu 1tAu WLu 1tAu TXu 1tAu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 11Au 1nXu 1qMu 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu 11zu 1o0u WLu 1qMu 14nu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu|347",
+ "Australia/Lindeman|AEST AEDT|-a0 -b0|010101010101010101010|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0|10",
+ "Australia/Melbourne|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1qM0 11A0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|39e5",
+ "Australia/Perth|AWST AWDT|-80 -90|0101010101010101010|-293jX xcX 10jd0 yL0 1cN0 1cL0 1gSp0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|18e5",
+ "CET|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00",
+ "Pacific/Easter|EMT -07 -06 -05|7h.s 70 60 50|012121212121212121212121212123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1uSgG.w 1s4IG.w WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 2pA0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0|30e2",
+ "CST6CDT|CST CDT CWT CPT|60 50 50 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "EET|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00",
+ "Europe/Dublin|DMT IST GMT BST IST|p.l -y.D 0 -10 -10|01232323232324242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242|-2ax9y.D Rc0 1fzy.D 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 g600 14o0 1wo0 17c0 1io0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
+ "EST|EST|50|0|",
+ "EST5EDT|EST EDT EWT EPT|50 40 40 40|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 SgN0 8x40 iv0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "Etc/GMT-0|GMT|0|0|",
+ "Etc/GMT-1|+01|-10|0|",
+ "Pacific/Port_Moresby|+10|-a0|0||25e4",
+ "Pacific/Pohnpei|+11|-b0|0||34e3",
+ "Pacific/Tarawa|+12|-c0|0||29e3",
+ "Etc/GMT-13|+13|-d0|0|",
+ "Etc/GMT-14|+14|-e0|0|",
+ "Etc/GMT-2|+02|-20|0|",
+ "Etc/GMT-3|+03|-30|0|",
+ "Etc/GMT-4|+04|-40|0|",
+ "Etc/GMT-5|+05|-50|0|",
+ "Etc/GMT-6|+06|-60|0|",
+ "Indian/Christmas|+07|-70|0||21e2",
+ "Etc/GMT-8|+08|-80|0|",
+ "Pacific/Palau|+09|-90|0||21e3",
+ "Etc/GMT+1|-01|10|0|",
+ "Etc/GMT+10|-10|a0|0|",
+ "Etc/GMT+11|-11|b0|0|",
+ "Etc/GMT+12|-12|c0|0|",
+ "Etc/GMT+3|-03|30|0|",
+ "Etc/GMT+4|-04|40|0|",
+ "Etc/GMT+5|-05|50|0|",
+ "Etc/GMT+6|-06|60|0|",
+ "Etc/GMT+7|-07|70|0|",
+ "Etc/GMT+8|-08|80|0|",
+ "Etc/GMT+9|-09|90|0|",
+ "Etc/UCT|UCT|0|0|",
+ "Etc/UTC|UTC|0|0|",
+ "Europe/Amsterdam|AMT NST +0120 +0020 CEST CET|-j.w -1j.w -1k -k -20 -10|010101010101010101010101010101010101010101012323234545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545|-2aFcj.w 11b0 1iP0 11A0 1io0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1co0 1io0 1yo0 Pc0 1a00 1fA0 1Bc0 Mo0 1tc0 Uo0 1tA0 U00 1uo0 W00 1s00 VA0 1so0 Vc0 1sM0 UM0 1wo0 Rc0 1u00 Wo0 1rA0 W00 1s00 VA0 1sM0 UM0 1w00 fV0 BCX.w 1tA0 U00 1u00 Wo0 1sm0 601k WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|16e5",
+ "Europe/Andorra|WET CET CEST|0 -10 -20|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-UBA0 1xIN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|79e3",
+ "Europe/Astrakhan|LMT +03 +04 +05|-3c.c -30 -40 -50|012323232323232323212121212121212121212121212121212121212121212|-1Pcrc.c eUMc.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0",
+ "Europe/Athens|AMT EET EEST CEST CET|-1y.Q -20 -30 -20 -10|012123434121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a61x.Q CNbx.Q mn0 kU10 9b0 3Es0 Xa0 1fb0 1dd0 k3X0 Nz0 SCp0 1vc0 SO0 1cM0 1a00 1ao0 1fc0 1a10 1fG0 1cg0 1dX0 1bX0 1cQ0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|35e5",
+ "Europe/London|GMT BST BDST|0 -10 -20|0101010101010101010101010101010101010101010101010121212121210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|10e6",
+ "Europe/Belgrade|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-19RC0 3IP0 WM0 1fA0 1cM0 1cM0 1rc0 Qo0 1vmo0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
+ "Europe/Berlin|CET CEST CEMT|-10 -20 -30|01010101010101210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 kL0 Nc0 m10 WM0 1ao0 1cp0 dX0 jz0 Dd0 1io0 17c0 1fA0 1a00 1ehA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e5",
+ "Europe/Prague|CET CEST GMT|-10 -20 0|01010101010101010201010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 1qM0 11c0 mp0 xA0 mn0 17c0 1io0 17c0 1fc0 1ao0 1bNc0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|13e5",
+ "Europe/Brussels|WET CET CEST WEST|0 -10 -20 -10|0121212103030303030303030303030303030303030303030303212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ehc0 3zX0 11c0 1iO0 11A0 1o00 11A0 my0 Ic0 1qM0 Rc0 1EM0 UM0 1u00 10o0 1io0 1io0 17c0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a30 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 y00 5Wn0 WM0 1fA0 1cM0 16M0 1iM0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|21e5",
+ "Europe/Bucharest|BMT EET EEST|-1I.o -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1xApI.o 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Axc0 On0 1fA0 1a10 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|19e5",
+ "Europe/Budapest|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1ip0 17b0 1op0 1tb0 Q2m0 3Ne0 WM0 1fA0 1cM0 1cM0 1oJ0 1dc0 1030 1fA0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1iM0 1fA0 8Ha0 Rb0 1wN0 Rb0 1BB0 Lz0 1C20 LB0 SNX0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e5",
+ "Europe/Zurich|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-19Lc0 11A0 1o00 11A0 1xG10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|38e4",
+ "Europe/Chisinau|CMT BMT EET EEST CEST CET MSK MSD|-1T -1I.o -20 -30 -20 -10 -30 -40|012323232323232323234545467676767676767676767323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-26jdT wGMa.A 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 27A0 2en0 39g0 WM0 1fA0 1cM0 V90 1t7z0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 gL0 WO0 1cM0 1cM0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11D0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|67e4",
+ "Europe/Copenhagen|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2azC0 Tz0 VuO0 60q0 WM0 1fA0 1cM0 1cM0 1cM0 S00 1HA0 Nc0 1C00 Dc0 1Nc0 Ao0 1h5A0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
+ "Europe/Gibraltar|GMT BST BDST CET CEST|0 -10 -20 -10 -20|010101010101010101010101010101010101010101010101012121212121010121010101010101010101034343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 10Jz0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|30e3",
+ "Europe/Helsinki|HMT EET EEST|-1D.N -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1WuND.N OULD.N 1dA0 1xGq0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
+ "Europe/Kaliningrad|CET CEST CET CEST MSK MSD EEST EET +03|-10 -20 -20 -30 -30 -40 -30 -20 -30|0101010101010232454545454545454546767676767676767676767676767676767676767676787|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 Am0 Lb0 1en0 op0 1pNz0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|44e4",
+ "Europe/Kiev|KMT EET MSK CEST CET MSD EEST|-22.4 -20 -30 -20 -10 -40 -30|0123434252525252525252525256161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161|-1Pc22.4 eUo2.4 rnz0 2Hg0 WM0 1fA0 da0 1v4m0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 Db0 3220 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|34e5",
+ "Europe/Kirov|LMT +03 +04 +05|-3i.M -30 -40 -50|01232323232323232321212121212121212121212121212121212121212121|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|48e4",
+ "Europe/Lisbon|LMT WET WEST WEMT CET CEST|A.J 0 -10 -20 -10 -20|012121212121212121212121212121212121212121212321232123212321212121212121212121212121212121212121214121212121212121212121212121212124545454212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2le00 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 pvy0 1cM0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|27e5",
+ "Europe/Luxembourg|LMT CET CEST WET WEST WEST WET|-o.A -10 -20 0 -10 -20 -10|0121212134343434343434343434343434343434343434343434565651212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2DG0o.A t6mo.A TB0 1nX0 Up0 1o20 11A0 rW0 CM0 1qP0 R90 1EO0 UK0 1u20 10m0 1ip0 1in0 17e0 19W0 1fB0 1db0 1cp0 1in0 17d0 1fz0 1a10 1in0 1a10 1in0 17f0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 vA0 60L0 WM0 1fA0 1cM0 17c0 1io0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4",
+ "Europe/Madrid|WET WEST WEMT CET CEST|0 -10 -20 -10 -20|010101010101010101210343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-25Td0 19B0 1cL0 1dd0 b1z0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1in0 17d0 iIn0 Hd0 1cL0 bb0 1200 2s20 14n0 5aL0 Mp0 1vz0 17d0 1in0 17d0 1in0 17d0 1in0 17d0 6hX0 11B0 XHX0 1a10 1fz0 1a10 19X0 1cN0 1fz0 1a10 1fC0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|62e5",
+ "Europe/Malta|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2arB0 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1co0 17c0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1co0 1cM0 1lA0 Xc0 1qq0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1iN0 19z0 1fB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|42e4",
+ "Europe/Minsk|MMT EET MSK CEST CET MSD EEST +03|-1O -20 -30 -20 -10 -40 -30 -30|01234343252525252525252525261616161616161616161616161616161616161617|-1Pc1O eUnO qNX0 3gQ0 WM0 1fA0 1cM0 Al0 1tsn0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 3Fc0 1cN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0|19e5",
+ "Europe/Monaco|PMT WET WEST WEMT CET CEST|-9.l 0 -10 -20 -10 -20|01212121212121212121212121212121212121212121212121232323232345454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 2RV0 11z0 11B0 1ze0 WM0 1fA0 1cM0 1fa0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|38e3",
+ "Europe/Moscow|MMT MMT MST MDST MSD MSK +05 EET EEST MSK|-2u.h -2v.j -3v.j -4v.j -40 -30 -50 -20 -30 -40|012132345464575454545454545454545458754545454545454545454545454545454545454595|-2ag2u.h 2pyW.W 1bA0 11X0 GN0 1Hb0 c4v.j ik0 3DA0 dz0 15A0 c10 2q10 iM10 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|16e6",
+ "Europe/Paris|PMT WET WEST CEST CET WEMT|-9.l 0 -10 -20 -10 -20|0121212121212121212121212121212121212121212121212123434352543434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434|-2nco8.l cNb8.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 Ik0 5M30 WM0 1fA0 1cM0 Vx0 hB0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|11e6",
+ "Europe/Riga|RMT LST EET MSK CEST CET MSD EEST|-1A.y -2A.y -20 -30 -20 -10 -40 -30|010102345454536363636363636363727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272|-25TzA.y 11A0 1iM0 ko0 gWm0 yDXA.y 2bX0 3fE0 WM0 1fA0 1cM0 1cM0 4m0 1sLy0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 1o00 11A0 1o00 11A0 1qM0 3oo0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|64e4",
+ "Europe/Rome|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2arB0 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1cM0 16M0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1C00 LA0 1zc0 Oo0 1C00 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1zc0 Oo0 1fC0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|39e5",
+ "Europe/Samara|LMT +03 +04 +05|-3k.k -30 -40 -50|0123232323232323232121232323232323232323232323232323232323212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2y10 14m0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|12e5",
+ "Europe/Saratov|LMT +03 +04 +05|-34.i -30 -40 -50|012323232323232321212121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 5810",
+ "Europe/Simferopol|SMT EET MSK CEST CET MSD EEST MSK|-2g -20 -30 -20 -10 -40 -30 -40|012343432525252525252525252161616525252616161616161616161616161616161616172|-1Pc2g eUog rEn0 2qs0 WM0 1fA0 1cM0 3V0 1u0L0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 4eL0 1cL0 1cN0 1cL0 1cN0 dX0 WL0 1cN0 1cL0 1fB0 1o30 11B0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11z0 1nW0|33e4",
+ "Europe/Sofia|EET CET CEST EEST|-20 -10 -20 -30|01212103030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030|-168L0 WM0 1fA0 1cM0 1cM0 1cN0 1mKH0 1dd0 1fb0 1ap0 1fb0 1a20 1fy0 1a30 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
+ "Europe/Stockholm|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2azC0 TB0 2yDe0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|15e5",
+ "Europe/Tallinn|TMT CET CEST EET MSK MSD EEST|-1D -10 -20 -20 -30 -40 -30|012103421212454545454545454546363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363|-26oND teD 11A0 1Ta0 4rXl KSLD 2FX0 2Jg0 WM0 1fA0 1cM0 18J0 1sTX0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o10 11A0 1qM0 5QM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e4",
+ "Europe/Tirane|LMT CET CEST|-1j.k -10 -20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glBj.k 14pcj.k 5LC0 WM0 4M0 1fCK0 10n0 1op0 11z0 1pd0 11z0 1qN0 WL0 1qp0 Xb0 1qp0 Xb0 1qp0 11z0 1lB0 11z0 1qN0 11z0 1iN0 16n0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|42e4",
+ "Europe/Ulyanovsk|LMT +03 +04 +05 +02|-3d.A -30 -40 -50 -20|01232323232323232321214121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0",
+ "Europe/Uzhgorod|CET CEST MSK MSD EET EEST|-10 -20 -30 -40 -20 -30|010101023232323232323232320454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-1cqL0 6i00 WM0 1fA0 1cM0 1ml0 1Cp0 1r3W0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 1Nf0 2pw0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|11e4",
+ "Europe/Vienna|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 3KM0 14o0 LA00 6i00 WM0 1fA0 1cM0 1cM0 1cM0 400 2qM0 1a00 1cM0 1cM0 1io0 17c0 1gHa0 19X0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|18e5",
+ "Europe/Vilnius|WMT KMT CET EET MSK CEST MSD EEST|-1o -1z.A -10 -20 -30 -20 -40 -30|012324525254646464646464646473737373737373737352537373737373737373737373737373737373737373737373737373737373737373737373|-293do 6ILM.o 1Ooz.A zz0 Mfd0 29W0 3is0 WM0 1fA0 1cM0 LV0 1tgL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11B0 1o00 11A0 1qM0 8io0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4",
+ "Europe/Volgograd|LMT +03 +04 +05|-2V.E -30 -40 -50|01232323232323232121212121212121212121212121212121212121212121|-21IqV.E psLV.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|10e5",
+ "Europe/Warsaw|WMT CET CEST EET EEST|-1o -10 -20 -20 -30|012121234312121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ctdo 1LXo 11d0 1iO0 11A0 1o00 11A0 1on0 11A0 6zy0 HWP0 5IM0 WM0 1fA0 1cM0 1dz0 1mL0 1en0 15B0 1aq0 1nA0 11A0 1io0 17c0 1fA0 1a00 iDX0 LA0 1cM0 1cM0 1C00 Oo0 1cM0 1cM0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1C00 LA0 uso0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e5",
+ "Europe/Zaporozhye|+0220 EET MSK CEST CET MSD EEST|-2k -20 -30 -20 -10 -40 -30|01234342525252525252525252526161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161|-1Pc2k eUok rdb0 2RE0 WM0 1fA0 8m0 1v9a0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cK0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|77e4",
+ "HST|HST|a0|0|",
+ "Indian/Chagos|LMT +05 +06|-4N.E -50 -60|012|-2xosN.E 3AGLN.E|30e2",
+ "Indian/Cocos|+0630|-6u|0||596",
+ "Indian/Kerguelen|-00 +05|0 -50|01|-MG00|130",
+ "Indian/Mahe|LMT +04|-3F.M -40|01|-2yO3F.M|79e3",
+ "Indian/Maldives|MMT +05|-4S -50|01|-olgS|35e4",
+ "Indian/Mauritius|LMT +04 +05|-3O -40 -50|012121|-2xorO 34unO 14L0 12kr0 11z0|15e4",
+ "Indian/Reunion|LMT +04|-3F.Q -40|01|-2mDDF.Q|84e4",
+ "Pacific/Kwajalein|+11 -12 +12|-b0 c0 -c0|012|-AX0 W9X0|14e3",
+ "MET|MET MEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00",
+ "MST|MST|70|0|",
+ "MST7MDT|MST MDT MWT MPT|70 60 60 60|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "Pacific/Chatham|+1215 +1245 +1345|-cf -cJ -dJ|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-WqAf 1adef IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|600",
+ "Pacific/Apia|LMT -1130 -11 -10 +14 +13|bq.U bu b0 a0 -e0 -d0|01232345454545454545454545454545454545454545454545454545454|-2nDMx.4 1yW03.4 2rRbu 1ff0 1a00 CI0 AQ0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|37e3",
+ "Pacific/Bougainville|+10 +09 +11|-a0 -90 -b0|0102|-16Wy0 7CN0 2MQp0|18e4",
+ "Pacific/Efate|LMT +11 +12|-bd.g -b0 -c0|0121212121212121212121|-2l9nd.g 2Szcd.g 1cL0 1oN0 10L0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 Lz0 1Nd0 An0|66e3",
+ "Pacific/Enderbury|-12 -11 +13|c0 b0 -d0|012|nIc0 B7X0|1",
+ "Pacific/Fakaofo|-11 +13|b0 -d0|01|1Gfn0|483",
+ "Pacific/Fiji|LMT +12 +13|-bT.I -c0 -d0|0121212121212121212121212121212121212121212121212121212121212121|-2bUzT.I 3m8NT.I LA0 1EM0 IM0 nJc0 LA0 1o00 Rc0 1wo0 Ao0 1Nc0 Ao0 1Q00 xz0 1SN0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0|88e4",
+ "Pacific/Galapagos|LMT -05 -06|5W.o 50 60|01212|-1yVS1.A 2dTz1.A gNd0 rz0|25e3",
+ "Pacific/Gambier|LMT -09|8X.M 90|01|-2jof0.c|125",
+ "Pacific/Guadalcanal|LMT +11|-aD.M -b0|01|-2joyD.M|11e4",
+ "Pacific/Guam|GST ChST|-a0 -a0|01|1fpq0|17e4",
+ "Pacific/Honolulu|HST HDT HST|au 9u a0|010102|-1thLu 8x0 lef0 8Pz0 46p0|37e4",
+ "Pacific/Kiritimati|-1040 -10 +14|aE a0 -e0|012|nIaE B7Xk|51e2",
+ "Pacific/Kosrae|+11 +12|-b0 -c0|010|-AX0 1bdz0|66e2",
+ "Pacific/Majuro|+11 +12|-b0 -c0|01|-AX0|28e3",
+ "Pacific/Marquesas|LMT -0930|9i 9u|01|-2joeG|86e2",
+ "Pacific/Pago_Pago|LMT SST|bm.M b0|01|-2nDMB.c|37e2",
+ "Pacific/Nauru|LMT +1130 +09 +12|-b7.E -bu -90 -c0|01213|-1Xdn7.E PvzB.E 5RCu 1ouJu|10e3",
+ "Pacific/Niue|-1120 -1130 -11|bk bu b0|012|-KfME 17y0a|12e2",
+ "Pacific/Norfolk|+1112 +1130 +1230 +11|-bc -bu -cu -b0|01213|-Kgbc W01G On0 1COp0|25e4",
+ "Pacific/Noumea|LMT +11 +12|-b5.M -b0 -c0|01212121|-2l9n5.M 2EqM5.M xX0 1PB0 yn0 HeP0 Ao0|98e3",
+ "Pacific/Pitcairn|-0830 -08|8u 80|01|18Vku|56",
+ "Pacific/Rarotonga|-1030 -0930 -10|au 9u a0|012121212121212121212121212|lyWu IL0 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu|13e3",
+ "Pacific/Tahiti|LMT -10|9W.g a0|01|-2joe1.I|18e4",
+ "Pacific/Tongatapu|+1220 +13 +14|-ck -d0 -e0|0121212121|-1aB0k 2n5dk 15A0 1wo0 xz0 1Q10 xz0 zWN0 s00|75e3",
+ "PST8PDT|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
+ "WET|WET WEST|0 -10|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00"
+ ],
+ "links": [
+ "Africa/Abidjan|Africa/Bamako",
+ "Africa/Abidjan|Africa/Banjul",
+ "Africa/Abidjan|Africa/Conakry",
+ "Africa/Abidjan|Africa/Dakar",
+ "Africa/Abidjan|Africa/Freetown",
+ "Africa/Abidjan|Africa/Lome",
+ "Africa/Abidjan|Africa/Nouakchott",
+ "Africa/Abidjan|Africa/Ouagadougou",
+ "Africa/Abidjan|Africa/Timbuktu",
+ "Africa/Abidjan|Atlantic/St_Helena",
+ "Africa/Cairo|Egypt",
+ "Africa/Johannesburg|Africa/Maseru",
+ "Africa/Johannesburg|Africa/Mbabane",
+ "Africa/Lagos|Africa/Bangui",
+ "Africa/Lagos|Africa/Brazzaville",
+ "Africa/Lagos|Africa/Douala",
+ "Africa/Lagos|Africa/Kinshasa",
+ "Africa/Lagos|Africa/Libreville",
+ "Africa/Lagos|Africa/Luanda",
+ "Africa/Lagos|Africa/Malabo",
+ "Africa/Lagos|Africa/Niamey",
+ "Africa/Lagos|Africa/Porto-Novo",
+ "Africa/Maputo|Africa/Blantyre",
+ "Africa/Maputo|Africa/Bujumbura",
+ "Africa/Maputo|Africa/Gaborone",
+ "Africa/Maputo|Africa/Harare",
+ "Africa/Maputo|Africa/Kigali",
+ "Africa/Maputo|Africa/Lubumbashi",
+ "Africa/Maputo|Africa/Lusaka",
+ "Africa/Nairobi|Africa/Addis_Ababa",
+ "Africa/Nairobi|Africa/Asmara",
+ "Africa/Nairobi|Africa/Asmera",
+ "Africa/Nairobi|Africa/Dar_es_Salaam",
+ "Africa/Nairobi|Africa/Djibouti",
+ "Africa/Nairobi|Africa/Kampala",
+ "Africa/Nairobi|Africa/Mogadishu",
+ "Africa/Nairobi|Indian/Antananarivo",
+ "Africa/Nairobi|Indian/Comoro",
+ "Africa/Nairobi|Indian/Mayotte",
+ "Africa/Tripoli|Libya",
+ "America/Adak|America/Atka",
+ "America/Adak|US/Aleutian",
+ "America/Anchorage|US/Alaska",
+ "America/Argentina/Buenos_Aires|America/Buenos_Aires",
+ "America/Argentina/Catamarca|America/Argentina/ComodRivadavia",
+ "America/Argentina/Catamarca|America/Catamarca",
+ "America/Argentina/Cordoba|America/Cordoba",
+ "America/Argentina/Cordoba|America/Rosario",
+ "America/Argentina/Jujuy|America/Jujuy",
+ "America/Argentina/Mendoza|America/Mendoza",
+ "America/Atikokan|America/Coral_Harbour",
+ "America/Chicago|US/Central",
+ "America/Curacao|America/Aruba",
+ "America/Curacao|America/Kralendijk",
+ "America/Curacao|America/Lower_Princes",
+ "America/Denver|America/Shiprock",
+ "America/Denver|Navajo",
+ "America/Denver|US/Mountain",
+ "America/Detroit|US/Michigan",
+ "America/Edmonton|Canada/Mountain",
+ "America/Fort_Wayne|America/Indiana/Indianapolis",
+ "America/Fort_Wayne|America/Indianapolis",
+ "America/Fort_Wayne|US/East-Indiana",
+ "America/Halifax|Canada/Atlantic",
+ "America/Havana|Cuba",
+ "America/Indiana/Knox|America/Knox_IN",
+ "America/Indiana/Knox|US/Indiana-Starke",
+ "America/Jamaica|Jamaica",
+ "America/Kentucky/Louisville|America/Louisville",
+ "America/Los_Angeles|US/Pacific",
+ "America/Los_Angeles|US/Pacific-New",
+ "America/Manaus|Brazil/West",
+ "America/Mazatlan|Mexico/BajaSur",
+ "America/Mexico_City|Mexico/General",
+ "America/New_York|US/Eastern",
+ "America/Noronha|Brazil/DeNoronha",
+ "America/Panama|America/Cayman",
+ "America/Phoenix|US/Arizona",
+ "America/Port_of_Spain|America/Anguilla",
+ "America/Port_of_Spain|America/Antigua",
+ "America/Port_of_Spain|America/Dominica",
+ "America/Port_of_Spain|America/Grenada",
+ "America/Port_of_Spain|America/Guadeloupe",
+ "America/Port_of_Spain|America/Marigot",
+ "America/Port_of_Spain|America/Montserrat",
+ "America/Port_of_Spain|America/St_Barthelemy",
+ "America/Port_of_Spain|America/St_Kitts",
+ "America/Port_of_Spain|America/St_Lucia",
+ "America/Port_of_Spain|America/St_Thomas",
+ "America/Port_of_Spain|America/St_Vincent",
+ "America/Port_of_Spain|America/Tortola",
+ "America/Port_of_Spain|America/Virgin",
+ "America/Regina|Canada/Saskatchewan",
+ "America/Rio_Branco|America/Porto_Acre",
+ "America/Rio_Branco|Brazil/Acre",
+ "America/Santiago|Chile/Continental",
+ "America/Sao_Paulo|Brazil/East",
+ "America/St_Johns|Canada/Newfoundland",
+ "America/Tijuana|America/Ensenada",
+ "America/Tijuana|America/Santa_Isabel",
+ "America/Tijuana|Mexico/BajaNorte",
+ "America/Toronto|America/Montreal",
+ "America/Toronto|Canada/Eastern",
+ "America/Vancouver|Canada/Pacific",
+ "America/Whitehorse|Canada/Yukon",
+ "America/Winnipeg|Canada/Central",
+ "Asia/Ashgabat|Asia/Ashkhabad",
+ "Asia/Bangkok|Asia/Phnom_Penh",
+ "Asia/Bangkok|Asia/Vientiane",
+ "Asia/Dhaka|Asia/Dacca",
+ "Asia/Dubai|Asia/Muscat",
+ "Asia/Ho_Chi_Minh|Asia/Saigon",
+ "Asia/Hong_Kong|Hongkong",
+ "Asia/Jerusalem|Asia/Tel_Aviv",
+ "Asia/Jerusalem|Israel",
+ "Asia/Kathmandu|Asia/Katmandu",
+ "Asia/Kolkata|Asia/Calcutta",
+ "Asia/Kuala_Lumpur|Asia/Singapore",
+ "Asia/Kuala_Lumpur|Singapore",
+ "Asia/Macau|Asia/Macao",
+ "Asia/Makassar|Asia/Ujung_Pandang",
+ "Asia/Nicosia|Europe/Nicosia",
+ "Asia/Qatar|Asia/Bahrain",
+ "Asia/Rangoon|Asia/Yangon",
+ "Asia/Riyadh|Asia/Aden",
+ "Asia/Riyadh|Asia/Kuwait",
+ "Asia/Seoul|ROK",
+ "Asia/Shanghai|Asia/Chongqing",
+ "Asia/Shanghai|Asia/Chungking",
+ "Asia/Shanghai|Asia/Harbin",
+ "Asia/Shanghai|PRC",
+ "Asia/Taipei|ROC",
+ "Asia/Tehran|Iran",
+ "Asia/Thimphu|Asia/Thimbu",
+ "Asia/Tokyo|Japan",
+ "Asia/Ulaanbaatar|Asia/Ulan_Bator",
+ "Asia/Urumqi|Asia/Kashgar",
+ "Atlantic/Faroe|Atlantic/Faeroe",
+ "Atlantic/Reykjavik|Iceland",
+ "Atlantic/South_Georgia|Etc/GMT+2",
+ "Australia/Adelaide|Australia/South",
+ "Australia/Brisbane|Australia/Queensland",
+ "Australia/Broken_Hill|Australia/Yancowinna",
+ "Australia/Darwin|Australia/North",
+ "Australia/Hobart|Australia/Tasmania",
+ "Australia/Lord_Howe|Australia/LHI",
+ "Australia/Melbourne|Australia/Victoria",
+ "Australia/Perth|Australia/West",
+ "Australia/Sydney|Australia/ACT",
+ "Australia/Sydney|Australia/Canberra",
+ "Australia/Sydney|Australia/NSW",
+ "Etc/GMT-0|Etc/GMT",
+ "Etc/GMT-0|Etc/GMT+0",
+ "Etc/GMT-0|Etc/GMT0",
+ "Etc/GMT-0|Etc/Greenwich",
+ "Etc/GMT-0|GMT",
+ "Etc/GMT-0|GMT+0",
+ "Etc/GMT-0|GMT-0",
+ "Etc/GMT-0|GMT0",
+ "Etc/GMT-0|Greenwich",
+ "Etc/UCT|UCT",
+ "Etc/UTC|Etc/Universal",
+ "Etc/UTC|Etc/Zulu",
+ "Etc/UTC|UTC",
+ "Etc/UTC|Universal",
+ "Etc/UTC|Zulu",
+ "Europe/Belgrade|Europe/Ljubljana",
+ "Europe/Belgrade|Europe/Podgorica",
+ "Europe/Belgrade|Europe/Sarajevo",
+ "Europe/Belgrade|Europe/Skopje",
+ "Europe/Belgrade|Europe/Zagreb",
+ "Europe/Chisinau|Europe/Tiraspol",
+ "Europe/Dublin|Eire",
+ "Europe/Helsinki|Europe/Mariehamn",
+ "Europe/Istanbul|Asia/Istanbul",
+ "Europe/Istanbul|Turkey",
+ "Europe/Lisbon|Portugal",
+ "Europe/London|Europe/Belfast",
+ "Europe/London|Europe/Guernsey",
+ "Europe/London|Europe/Isle_of_Man",
+ "Europe/London|Europe/Jersey",
+ "Europe/London|GB",
+ "Europe/London|GB-Eire",
+ "Europe/Moscow|W-SU",
+ "Europe/Oslo|Arctic/Longyearbyen",
+ "Europe/Oslo|Atlantic/Jan_Mayen",
+ "Europe/Prague|Europe/Bratislava",
+ "Europe/Rome|Europe/San_Marino",
+ "Europe/Rome|Europe/Vatican",
+ "Europe/Warsaw|Poland",
+ "Europe/Zurich|Europe/Busingen",
+ "Europe/Zurich|Europe/Vaduz",
+ "Indian/Christmas|Etc/GMT-7",
+ "Pacific/Auckland|Antarctica/McMurdo",
+ "Pacific/Auckland|Antarctica/South_Pole",
+ "Pacific/Auckland|NZ",
+ "Pacific/Chatham|NZ-CHAT",
+ "Pacific/Easter|Chile/EasterIsland",
+ "Pacific/Guam|Pacific/Saipan",
+ "Pacific/Honolulu|Pacific/Johnston",
+ "Pacific/Honolulu|US/Hawaii",
+ "Pacific/Kwajalein|Kwajalein",
+ "Pacific/Pago_Pago|Pacific/Midway",
+ "Pacific/Pago_Pago|Pacific/Samoa",
+ "Pacific/Pago_Pago|US/Samoa",
+ "Pacific/Palau|Etc/GMT-9",
+ "Pacific/Pohnpei|Etc/GMT-11",
+ "Pacific/Pohnpei|Pacific/Ponape",
+ "Pacific/Port_Moresby|Etc/GMT-10",
+ "Pacific/Port_Moresby|Pacific/Chuuk",
+ "Pacific/Port_Moresby|Pacific/Truk",
+ "Pacific/Port_Moresby|Pacific/Yap",
+ "Pacific/Tarawa|Etc/GMT-12",
+ "Pacific/Tarawa|Pacific/Funafuti",
+ "Pacific/Tarawa|Pacific/Wake",
+ "Pacific/Tarawa|Pacific/Wallis"
+ ]
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/data/unpacked/latest.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/data/unpacked/latest.json
new file mode 100644
index 00000000000..527a634a7b5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/data/unpacked/latest.json
@@ -0,0 +1,125209 @@
+{
+ "version": "2018e",
+ "zones": [
+ {
+ "name": "Africa/Abidjan",
+ "abbrs": [
+ "LMT",
+ "GMT"
+ ],
+ "untils": [
+ -1830383032000,
+ null
+ ],
+ "offsets": [
+ 16.1333,
+ 0
+ ],
+ "population": 4800000
+ },
+ {
+ "name": "Africa/Accra",
+ "abbrs": [
+ "LMT",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT",
+ "+0020",
+ "GMT"
+ ],
+ "untils": [
+ -1640995148000,
+ -1556841600000,
+ -1546388400000,
+ -1525305600000,
+ -1514852400000,
+ -1493769600000,
+ -1483316400000,
+ -1462233600000,
+ -1451780400000,
+ -1430611200000,
+ -1420158000000,
+ -1399075200000,
+ -1388622000000,
+ -1367539200000,
+ -1357086000000,
+ -1336003200000,
+ -1325550000000,
+ -1304380800000,
+ -1293927600000,
+ -1272844800000,
+ -1262391600000,
+ -1241308800000,
+ -1230855600000,
+ -1209772800000,
+ -1199319600000,
+ -1178150400000,
+ -1167697200000,
+ -1146614400000,
+ -1136161200000,
+ -1115078400000,
+ -1104625200000,
+ -1083542400000,
+ -1073089200000,
+ -1051920000000,
+ -1041466800000,
+ -1020384000000,
+ -1009930800000,
+ -988848000000,
+ -978394800000,
+ -957312000000,
+ -946858800000,
+ -925689600000,
+ -915236400000,
+ -894153600000,
+ -883700400000,
+ -862617600000,
+ -852164400000,
+ null
+ ],
+ "offsets": [
+ 0.8667,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0,
+ -20,
+ 0
+ ],
+ "population": 4145000
+ },
+ {
+ "name": "Africa/Addis_Ababa",
+ "abbrs": [
+ "LMT",
+ "EAT",
+ "+0230",
+ "+0245",
+ "EAT"
+ ],
+ "untils": [
+ -1309746436000,
+ -1262314800000,
+ -946780200000,
+ -315629100000,
+ null
+ ],
+ "offsets": [
+ -147.2667,
+ -180,
+ -150,
+ -165,
+ -180
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Algiers",
+ "abbrs": [
+ "PMT",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "WET",
+ "CET",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "CET",
+ "CEST",
+ "CET",
+ "WET",
+ "WEST",
+ "WET",
+ "CET"
+ ],
+ "untils": [
+ -1855958961000,
+ -1689814800000,
+ -1680397200000,
+ -1665363600000,
+ -1648342800000,
+ -1635123600000,
+ -1616893200000,
+ -1604278800000,
+ -1585443600000,
+ -1574038800000,
+ -1552266000000,
+ -1539997200000,
+ -1531443600000,
+ -956365200000,
+ -950486400000,
+ -942012000000,
+ -812502000000,
+ -796262400000,
+ -781052400000,
+ -766630800000,
+ -733280400000,
+ -439430400000,
+ -212029200000,
+ 41468400000,
+ 54774000000,
+ 231724800000,
+ 246236400000,
+ 259545600000,
+ 275274000000,
+ 309740400000,
+ 325468800000,
+ 341802000000,
+ 357523200000,
+ null
+ ],
+ "offsets": [
+ -9.35,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60
+ ],
+ "population": 2590000
+ },
+ {
+ "name": "Africa/Asmara",
+ "abbrs": [
+ "LMT",
+ "EAT",
+ "+0230",
+ "+0245",
+ "EAT"
+ ],
+ "untils": [
+ -1309746436000,
+ -1262314800000,
+ -946780200000,
+ -315629100000,
+ null
+ ],
+ "offsets": [
+ -147.2667,
+ -180,
+ -150,
+ -165,
+ -180
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Asmera",
+ "abbrs": [
+ "LMT",
+ "EAT",
+ "+0230",
+ "+0245",
+ "EAT"
+ ],
+ "untils": [
+ -1309746436000,
+ -1262314800000,
+ -946780200000,
+ -315629100000,
+ null
+ ],
+ "offsets": [
+ -147.2667,
+ -180,
+ -150,
+ -165,
+ -180
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Bamako",
+ "abbrs": [
+ "LMT",
+ "GMT"
+ ],
+ "untils": [
+ -1830383032000,
+ null
+ ],
+ "offsets": [
+ 16.1333,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Bangui",
+ "abbrs": [
+ "LMT",
+ "WAT"
+ ],
+ "untils": [
+ -1588464816000,
+ null
+ ],
+ "offsets": [
+ -13.6,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Banjul",
+ "abbrs": [
+ "LMT",
+ "GMT"
+ ],
+ "untils": [
+ -1830383032000,
+ null
+ ],
+ "offsets": [
+ 16.1333,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Bissau",
+ "abbrs": [
+ "LMT",
+ "-01",
+ "GMT"
+ ],
+ "untils": [
+ -1830380400000,
+ 157770000000,
+ null
+ ],
+ "offsets": [
+ 62.3333,
+ 60,
+ 0
+ ],
+ "population": 387909
+ },
+ {
+ "name": "Africa/Blantyre",
+ "abbrs": [
+ "LMT",
+ "CAT"
+ ],
+ "untils": [
+ -2109291020000,
+ null
+ ],
+ "offsets": [
+ -130.3333,
+ -120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Brazzaville",
+ "abbrs": [
+ "LMT",
+ "WAT"
+ ],
+ "untils": [
+ -1588464816000,
+ null
+ ],
+ "offsets": [
+ -13.6,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Bujumbura",
+ "abbrs": [
+ "LMT",
+ "CAT"
+ ],
+ "untils": [
+ -2109291020000,
+ null
+ ],
+ "offsets": [
+ -130.3333,
+ -120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Cairo",
+ "abbrs": [
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -929844000000,
+ -923108400000,
+ -906170400000,
+ -892868400000,
+ -875844000000,
+ -857790000000,
+ -844308000000,
+ -825822000000,
+ -812685600000,
+ -794199600000,
+ -779853600000,
+ -762663600000,
+ -399088800000,
+ -386650800000,
+ -368330400000,
+ -355114800000,
+ -336790800000,
+ -323654400000,
+ -305168400000,
+ -292032000000,
+ -273632400000,
+ -260496000000,
+ -242096400000,
+ -228960000000,
+ -210560400000,
+ -197424000000,
+ -178938000000,
+ -165801600000,
+ -147402000000,
+ -134265600000,
+ -115866000000,
+ -102643200000,
+ -84330000000,
+ -71107200000,
+ -52707600000,
+ -39484800000,
+ -21171600000,
+ -7948800000,
+ 10364400000,
+ 23587200000,
+ 41900400000,
+ 55123200000,
+ 73522800000,
+ 86745600000,
+ 105058800000,
+ 118281600000,
+ 136594800000,
+ 149817600000,
+ 168130800000,
+ 181353600000,
+ 199753200000,
+ 212976000000,
+ 231289200000,
+ 244512000000,
+ 262825200000,
+ 276048000000,
+ 294361200000,
+ 307584000000,
+ 325983600000,
+ 339206400000,
+ 357519600000,
+ 370742400000,
+ 396399600000,
+ 402278400000,
+ 426812400000,
+ 433814400000,
+ 452214000000,
+ 465436800000,
+ 483750000000,
+ 496972800000,
+ 515286000000,
+ 528508800000,
+ 546822000000,
+ 560044800000,
+ 578444400000,
+ 591667200000,
+ 610412400000,
+ 623203200000,
+ 641516400000,
+ 654739200000,
+ 673052400000,
+ 686275200000,
+ 704674800000,
+ 717897600000,
+ 736210800000,
+ 749433600000,
+ 767746800000,
+ 780969600000,
+ 799020000000,
+ 812322000000,
+ 830469600000,
+ 843771600000,
+ 861919200000,
+ 875221200000,
+ 893368800000,
+ 906670800000,
+ 925423200000,
+ 938725200000,
+ 956872800000,
+ 970174800000,
+ 988322400000,
+ 1001624400000,
+ 1019772000000,
+ 1033074000000,
+ 1051221600000,
+ 1064523600000,
+ 1083276000000,
+ 1096578000000,
+ 1114725600000,
+ 1128027600000,
+ 1146175200000,
+ 1158872400000,
+ 1177624800000,
+ 1189112400000,
+ 1209074400000,
+ 1219957200000,
+ 1240524000000,
+ 1250802000000,
+ 1272578400000,
+ 1281474000000,
+ 1284069600000,
+ 1285880400000,
+ 1400191200000,
+ 1403816400000,
+ 1406844000000,
+ 1411678800000,
+ null
+ ],
+ "offsets": [
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 15071000
+ },
+ {
+ "name": "Africa/Casablanca",
+ "abbrs": [
+ "LMT",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "CET",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET"
+ ],
+ "untils": [
+ -1773012580000,
+ -956361600000,
+ -950490000000,
+ -942019200000,
+ -761187600000,
+ -617241600000,
+ -605149200000,
+ -81432000000,
+ -71110800000,
+ 141264000000,
+ 147222000000,
+ 199756800000,
+ 207702000000,
+ 231292800000,
+ 244249200000,
+ 265507200000,
+ 271033200000,
+ 448243200000,
+ 504918000000,
+ 1212278400000,
+ 1220223600000,
+ 1243814400000,
+ 1250809200000,
+ 1272758400000,
+ 1281222000000,
+ 1301788800000,
+ 1312066800000,
+ 1335664800000,
+ 1342749600000,
+ 1345428000000,
+ 1348970400000,
+ 1367114400000,
+ 1373162400000,
+ 1376100000000,
+ 1382839200000,
+ 1396144800000,
+ 1403920800000,
+ 1406944800000,
+ 1414288800000,
+ 1427594400000,
+ 1434247200000,
+ 1437271200000,
+ 1445738400000,
+ 1459044000000,
+ 1465092000000,
+ 1468116000000,
+ 1477792800000,
+ 1490493600000,
+ 1495332000000,
+ 1498960800000,
+ 1509242400000,
+ 1521943200000,
+ 1526176800000,
+ 1529200800000,
+ 1540692000000,
+ 1553997600000,
+ 1557021600000,
+ 1560045600000,
+ 1572141600000,
+ 1585447200000,
+ 1587261600000,
+ 1590285600000,
+ 1603591200000,
+ 1616896800000,
+ 1618106400000,
+ 1621130400000,
+ 1635645600000,
+ 1651975200000,
+ 1667095200000,
+ 1682215200000,
+ 1698544800000,
+ 1713060000000,
+ 1729994400000,
+ 1743904800000,
+ 1761444000000,
+ 1774749600000,
+ 1792893600000,
+ 1806199200000,
+ 1824948000000,
+ 1837648800000,
+ 1856397600000,
+ 1869098400000,
+ 1887847200000,
+ 1901152800000,
+ 1919296800000,
+ 1932602400000,
+ 1950746400000,
+ 1964052000000,
+ 1982800800000,
+ 1995501600000,
+ 2014250400000,
+ 2026951200000,
+ 2045700000000,
+ 2058400800000,
+ 2077149600000,
+ 2090455200000,
+ 2107994400000,
+ 2121904800000,
+ 2138234400000,
+ null
+ ],
+ "offsets": [
+ 30.3333,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0
+ ],
+ "population": 3211000
+ },
+ {
+ "name": "Africa/Ceuta",
+ "abbrs": [
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1630112400000,
+ -1616810400000,
+ -1442451600000,
+ -1427673600000,
+ -1379293200000,
+ -1364774400000,
+ -1348448400000,
+ -1333324800000,
+ -1316390400000,
+ -1301270400000,
+ -81432000000,
+ -71110800000,
+ 141264000000,
+ 147222000000,
+ 199756800000,
+ 207702000000,
+ 231292800000,
+ 244249200000,
+ 265507200000,
+ 271033200000,
+ 448243200000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 84963
+ },
+ {
+ "name": "Africa/Conakry",
+ "abbrs": [
+ "LMT",
+ "GMT"
+ ],
+ "untils": [
+ -1830383032000,
+ null
+ ],
+ "offsets": [
+ 16.1333,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Dakar",
+ "abbrs": [
+ "LMT",
+ "GMT"
+ ],
+ "untils": [
+ -1830383032000,
+ null
+ ],
+ "offsets": [
+ 16.1333,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Dar_es_Salaam",
+ "abbrs": [
+ "LMT",
+ "EAT",
+ "+0230",
+ "+0245",
+ "EAT"
+ ],
+ "untils": [
+ -1309746436000,
+ -1262314800000,
+ -946780200000,
+ -315629100000,
+ null
+ ],
+ "offsets": [
+ -147.2667,
+ -180,
+ -150,
+ -165,
+ -180
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Djibouti",
+ "abbrs": [
+ "LMT",
+ "EAT",
+ "+0230",
+ "+0245",
+ "EAT"
+ ],
+ "untils": [
+ -1309746436000,
+ -1262314800000,
+ -946780200000,
+ -315629100000,
+ null
+ ],
+ "offsets": [
+ -147.2667,
+ -180,
+ -150,
+ -165,
+ -180
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Douala",
+ "abbrs": [
+ "LMT",
+ "WAT"
+ ],
+ "untils": [
+ -1588464816000,
+ null
+ ],
+ "offsets": [
+ -13.6,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/El_Aaiun",
+ "abbrs": [
+ "LMT",
+ "-01",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET"
+ ],
+ "untils": [
+ -1136070432000,
+ 198291600000,
+ 199756800000,
+ 207702000000,
+ 231292800000,
+ 244249200000,
+ 265507200000,
+ 271033200000,
+ 1212278400000,
+ 1220223600000,
+ 1243814400000,
+ 1250809200000,
+ 1272758400000,
+ 1281222000000,
+ 1301788800000,
+ 1312066800000,
+ 1335664800000,
+ 1342749600000,
+ 1345428000000,
+ 1348970400000,
+ 1367114400000,
+ 1373162400000,
+ 1376100000000,
+ 1382839200000,
+ 1396144800000,
+ 1403920800000,
+ 1406944800000,
+ 1414288800000,
+ 1427594400000,
+ 1434247200000,
+ 1437271200000,
+ 1445738400000,
+ 1459044000000,
+ 1465092000000,
+ 1468116000000,
+ 1477792800000,
+ 1490493600000,
+ 1495332000000,
+ 1498960800000,
+ 1509242400000,
+ 1521943200000,
+ 1526176800000,
+ 1529200800000,
+ 1540692000000,
+ 1553997600000,
+ 1557021600000,
+ 1560045600000,
+ 1572141600000,
+ 1585447200000,
+ 1587261600000,
+ 1590285600000,
+ 1603591200000,
+ 1616896800000,
+ 1618106400000,
+ 1621130400000,
+ 1635645600000,
+ 1651975200000,
+ 1667095200000,
+ 1682215200000,
+ 1698544800000,
+ 1713060000000,
+ 1729994400000,
+ 1743904800000,
+ 1761444000000,
+ 1774749600000,
+ 1792893600000,
+ 1806199200000,
+ 1824948000000,
+ 1837648800000,
+ 1856397600000,
+ 1869098400000,
+ 1887847200000,
+ 1901152800000,
+ 1919296800000,
+ 1932602400000,
+ 1950746400000,
+ 1964052000000,
+ 1982800800000,
+ 1995501600000,
+ 2014250400000,
+ 2026951200000,
+ 2045700000000,
+ 2058400800000,
+ 2077149600000,
+ 2090455200000,
+ 2107994400000,
+ 2121904800000,
+ 2138234400000,
+ null
+ ],
+ "offsets": [
+ 52.8,
+ 60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0
+ ],
+ "population": 196331
+ },
+ {
+ "name": "Africa/Freetown",
+ "abbrs": [
+ "LMT",
+ "GMT"
+ ],
+ "untils": [
+ -1830383032000,
+ null
+ ],
+ "offsets": [
+ 16.1333,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Gaborone",
+ "abbrs": [
+ "LMT",
+ "CAT"
+ ],
+ "untils": [
+ -2109291020000,
+ null
+ ],
+ "offsets": [
+ -130.3333,
+ -120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Harare",
+ "abbrs": [
+ "LMT",
+ "CAT"
+ ],
+ "untils": [
+ -2109291020000,
+ null
+ ],
+ "offsets": [
+ -130.3333,
+ -120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Johannesburg",
+ "abbrs": [
+ "SAST",
+ "SAST",
+ "SAST",
+ "SAST",
+ "SAST",
+ "SAST"
+ ],
+ "untils": [
+ -2109288600000,
+ -860976000000,
+ -845254800000,
+ -829526400000,
+ -813805200000,
+ null
+ ],
+ "offsets": [
+ -90,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 8432000
+ },
+ {
+ "name": "Africa/Juba",
+ "abbrs": [
+ "LMT",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "EAT"
+ ],
+ "untils": [
+ -1230775588000,
+ 10360800000,
+ 24786000000,
+ 41810400000,
+ 56322000000,
+ 73432800000,
+ 87944400000,
+ 104882400000,
+ 119480400000,
+ 136332000000,
+ 151016400000,
+ 167781600000,
+ 182552400000,
+ 199231200000,
+ 214174800000,
+ 230680800000,
+ 245710800000,
+ 262735200000,
+ 277246800000,
+ 294184800000,
+ 308782800000,
+ 325634400000,
+ 340405200000,
+ 357084000000,
+ 371941200000,
+ 388533600000,
+ 403477200000,
+ 419983200000,
+ 435013200000,
+ 452037600000,
+ 466635600000,
+ 483487200000,
+ 498171600000,
+ 947930400000,
+ null
+ ],
+ "offsets": [
+ -126.4667,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Kampala",
+ "abbrs": [
+ "LMT",
+ "EAT",
+ "+0230",
+ "+0245",
+ "EAT"
+ ],
+ "untils": [
+ -1309746436000,
+ -1262314800000,
+ -946780200000,
+ -315629100000,
+ null
+ ],
+ "offsets": [
+ -147.2667,
+ -180,
+ -150,
+ -165,
+ -180
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Khartoum",
+ "abbrs": [
+ "LMT",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "CAST",
+ "CAT",
+ "EAT",
+ "CAT"
+ ],
+ "untils": [
+ -1230775808000,
+ 10360800000,
+ 24786000000,
+ 41810400000,
+ 56322000000,
+ 73432800000,
+ 87944400000,
+ 104882400000,
+ 119480400000,
+ 136332000000,
+ 151016400000,
+ 167781600000,
+ 182552400000,
+ 199231200000,
+ 214174800000,
+ 230680800000,
+ 245710800000,
+ 262735200000,
+ 277246800000,
+ 294184800000,
+ 308782800000,
+ 325634400000,
+ 340405200000,
+ 357084000000,
+ 371941200000,
+ 388533600000,
+ 403477200000,
+ 419983200000,
+ 435013200000,
+ 452037600000,
+ 466635600000,
+ 483487200000,
+ 498171600000,
+ 947930400000,
+ 1509483600000,
+ null
+ ],
+ "offsets": [
+ -130.1333,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 5125000
+ },
+ {
+ "name": "Africa/Kigali",
+ "abbrs": [
+ "LMT",
+ "CAT"
+ ],
+ "untils": [
+ -2109291020000,
+ null
+ ],
+ "offsets": [
+ -130.3333,
+ -120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Kinshasa",
+ "abbrs": [
+ "LMT",
+ "WAT"
+ ],
+ "untils": [
+ -1588464816000,
+ null
+ ],
+ "offsets": [
+ -13.6,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Lagos",
+ "abbrs": [
+ "LMT",
+ "WAT"
+ ],
+ "untils": [
+ -1588464816000,
+ null
+ ],
+ "offsets": [
+ -13.6,
+ -60
+ ],
+ "population": 17060307
+ },
+ {
+ "name": "Africa/Libreville",
+ "abbrs": [
+ "LMT",
+ "WAT"
+ ],
+ "untils": [
+ -1588464816000,
+ null
+ ],
+ "offsets": [
+ -13.6,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Lome",
+ "abbrs": [
+ "LMT",
+ "GMT"
+ ],
+ "untils": [
+ -1830383032000,
+ null
+ ],
+ "offsets": [
+ 16.1333,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Luanda",
+ "abbrs": [
+ "LMT",
+ "WAT"
+ ],
+ "untils": [
+ -1588464816000,
+ null
+ ],
+ "offsets": [
+ -13.6,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Lubumbashi",
+ "abbrs": [
+ "LMT",
+ "CAT"
+ ],
+ "untils": [
+ -2109291020000,
+ null
+ ],
+ "offsets": [
+ -130.3333,
+ -120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Lusaka",
+ "abbrs": [
+ "LMT",
+ "CAT"
+ ],
+ "untils": [
+ -2109291020000,
+ null
+ ],
+ "offsets": [
+ -130.3333,
+ -120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Malabo",
+ "abbrs": [
+ "LMT",
+ "WAT"
+ ],
+ "untils": [
+ -1588464816000,
+ null
+ ],
+ "offsets": [
+ -13.6,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Maputo",
+ "abbrs": [
+ "LMT",
+ "CAT"
+ ],
+ "untils": [
+ -2109291020000,
+ null
+ ],
+ "offsets": [
+ -130.3333,
+ -120
+ ],
+ "population": 2615000
+ },
+ {
+ "name": "Africa/Maseru",
+ "abbrs": [
+ "SAST",
+ "SAST",
+ "SAST",
+ "SAST",
+ "SAST",
+ "SAST"
+ ],
+ "untils": [
+ -2109288600000,
+ -860976000000,
+ -845254800000,
+ -829526400000,
+ -813805200000,
+ null
+ ],
+ "offsets": [
+ -90,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Mbabane",
+ "abbrs": [
+ "SAST",
+ "SAST",
+ "SAST",
+ "SAST",
+ "SAST",
+ "SAST"
+ ],
+ "untils": [
+ -2109288600000,
+ -860976000000,
+ -845254800000,
+ -829526400000,
+ -813805200000,
+ null
+ ],
+ "offsets": [
+ -90,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Mogadishu",
+ "abbrs": [
+ "LMT",
+ "EAT",
+ "+0230",
+ "+0245",
+ "EAT"
+ ],
+ "untils": [
+ -1309746436000,
+ -1262314800000,
+ -946780200000,
+ -315629100000,
+ null
+ ],
+ "offsets": [
+ -147.2667,
+ -180,
+ -150,
+ -165,
+ -180
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Monrovia",
+ "abbrs": [
+ "MMT",
+ "MMT",
+ "GMT"
+ ],
+ "untils": [
+ -1604359012000,
+ 63593070000,
+ null
+ ],
+ "offsets": [
+ 43.1333,
+ 44.5,
+ 0
+ ],
+ "population": 1100000
+ },
+ {
+ "name": "Africa/Nairobi",
+ "abbrs": [
+ "LMT",
+ "EAT",
+ "+0230",
+ "+0245",
+ "EAT"
+ ],
+ "untils": [
+ -1309746436000,
+ -1262314800000,
+ -946780200000,
+ -315629100000,
+ null
+ ],
+ "offsets": [
+ -147.2667,
+ -180,
+ -150,
+ -165,
+ -180
+ ],
+ "population": 4738000
+ },
+ {
+ "name": "Africa/Ndjamena",
+ "abbrs": [
+ "LMT",
+ "WAT",
+ "WAST",
+ "WAT"
+ ],
+ "untils": [
+ -1830387612000,
+ 308703600000,
+ 321314400000,
+ null
+ ],
+ "offsets": [
+ -60.2,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 1260000
+ },
+ {
+ "name": "Africa/Niamey",
+ "abbrs": [
+ "LMT",
+ "WAT"
+ ],
+ "untils": [
+ -1588464816000,
+ null
+ ],
+ "offsets": [
+ -13.6,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Nouakchott",
+ "abbrs": [
+ "LMT",
+ "GMT"
+ ],
+ "untils": [
+ -1830383032000,
+ null
+ ],
+ "offsets": [
+ 16.1333,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Ouagadougou",
+ "abbrs": [
+ "LMT",
+ "GMT"
+ ],
+ "untils": [
+ -1830383032000,
+ null
+ ],
+ "offsets": [
+ 16.1333,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Porto-Novo",
+ "abbrs": [
+ "LMT",
+ "WAT"
+ ],
+ "untils": [
+ -1588464816000,
+ null
+ ],
+ "offsets": [
+ -13.6,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Sao_Tome",
+ "abbrs": [
+ "LMT",
+ "GMT",
+ "WAT"
+ ],
+ "untils": [
+ -1830384000000,
+ 1514768400000,
+ null
+ ],
+ "offsets": [
+ 36.75,
+ 0,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Timbuktu",
+ "abbrs": [
+ "LMT",
+ "GMT"
+ ],
+ "untils": [
+ -1830383032000,
+ null
+ ],
+ "offsets": [
+ 16.1333,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Africa/Tripoli",
+ "abbrs": [
+ "LMT",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "EET",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "EET",
+ "CET",
+ "CEST",
+ "EET",
+ "CET",
+ "CEST",
+ "EET"
+ ],
+ "untils": [
+ -1577926364000,
+ -574902000000,
+ -568087200000,
+ -512175600000,
+ -504928800000,
+ -449888400000,
+ -441856800000,
+ -347158800000,
+ 378684000000,
+ 386463600000,
+ 402271200000,
+ 417999600000,
+ 433807200000,
+ 449622000000,
+ 465429600000,
+ 481590000000,
+ 496965600000,
+ 512953200000,
+ 528674400000,
+ 544230000000,
+ 560037600000,
+ 575852400000,
+ 591660000000,
+ 607388400000,
+ 623196000000,
+ 641775600000,
+ 844034400000,
+ 860108400000,
+ 875916000000,
+ 1352505600000,
+ 1364515200000,
+ 1382659200000,
+ null
+ ],
+ "offsets": [
+ -52.7333,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -120,
+ -60,
+ -120,
+ -120
+ ],
+ "population": 1110000
+ },
+ {
+ "name": "Africa/Tunis",
+ "abbrs": [
+ "PMT",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1855958961000,
+ -969242400000,
+ -950493600000,
+ -941940000000,
+ -891136800000,
+ -877827600000,
+ -857257200000,
+ -844556400000,
+ -842918400000,
+ -842223600000,
+ -828230400000,
+ -812502000000,
+ -796269600000,
+ -781052400000,
+ -766634400000,
+ 231202800000,
+ 243903600000,
+ 262825200000,
+ 276044400000,
+ 581122800000,
+ 591145200000,
+ 606870000000,
+ 622594800000,
+ 641516400000,
+ 654649200000,
+ 1114902000000,
+ 1128038400000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ null
+ ],
+ "offsets": [
+ -9.35,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 1990000
+ },
+ {
+ "name": "Africa/Windhoek",
+ "abbrs": [
+ "+0130",
+ "SAST",
+ "SAST",
+ "SAST",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT",
+ "WAT",
+ "CAT"
+ ],
+ "untils": [
+ -2109288600000,
+ -860976000000,
+ -845254800000,
+ 637970400000,
+ 764200800000,
+ 778640400000,
+ 796780800000,
+ 810090000000,
+ 828835200000,
+ 841539600000,
+ 860284800000,
+ 873594000000,
+ 891734400000,
+ 905043600000,
+ 923184000000,
+ 936493200000,
+ 954633600000,
+ 967942800000,
+ 986083200000,
+ 999392400000,
+ 1018137600000,
+ 1030842000000,
+ 1049587200000,
+ 1062896400000,
+ 1081036800000,
+ 1094346000000,
+ 1112486400000,
+ 1125795600000,
+ 1143936000000,
+ 1157245200000,
+ 1175385600000,
+ 1188694800000,
+ 1207440000000,
+ 1220749200000,
+ 1238889600000,
+ 1252198800000,
+ 1270339200000,
+ 1283648400000,
+ 1301788800000,
+ 1315098000000,
+ 1333238400000,
+ 1346547600000,
+ 1365292800000,
+ 1377997200000,
+ 1396742400000,
+ 1410051600000,
+ 1428192000000,
+ 1441501200000,
+ 1459641600000,
+ 1472950800000,
+ 1491091200000,
+ 1504400400000,
+ null
+ ],
+ "offsets": [
+ -90,
+ -120,
+ -180,
+ -120,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120
+ ],
+ "population": 322500
+ },
+ {
+ "name": "America/Adak",
+ "abbrs": [
+ "NST",
+ "NWT",
+ "NPT",
+ "NST",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "AHST",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST"
+ ],
+ "untils": [
+ -880196400000,
+ -769395600000,
+ -765374400000,
+ -86878800000,
+ -21466800000,
+ -5745600000,
+ 9982800000,
+ 25704000000,
+ 41432400000,
+ 57758400000,
+ 73486800000,
+ 89208000000,
+ 104936400000,
+ 120657600000,
+ 126709200000,
+ 152107200000,
+ 162392400000,
+ 183556800000,
+ 199285200000,
+ 215611200000,
+ 230734800000,
+ 247060800000,
+ 262789200000,
+ 278510400000,
+ 294238800000,
+ 309960000000,
+ 325688400000,
+ 341409600000,
+ 357138000000,
+ 372859200000,
+ 388587600000,
+ 404913600000,
+ 420037200000,
+ 436363200000,
+ 439034400000,
+ 452088000000,
+ 467809200000,
+ 483537600000,
+ 499258800000,
+ 514987200000,
+ 530708400000,
+ 544622400000,
+ 562158000000,
+ 576072000000,
+ 594212400000,
+ 607521600000,
+ 625662000000,
+ 638971200000,
+ 657111600000,
+ 671025600000,
+ 688561200000,
+ 702475200000,
+ 720010800000,
+ 733924800000,
+ 752065200000,
+ 765374400000,
+ 783514800000,
+ 796824000000,
+ 814964400000,
+ 828878400000,
+ 846414000000,
+ 860328000000,
+ 877863600000,
+ 891777600000,
+ 909313200000,
+ 923227200000,
+ 941367600000,
+ 954676800000,
+ 972817200000,
+ 986126400000,
+ 1004266800000,
+ 1018180800000,
+ 1035716400000,
+ 1049630400000,
+ 1067166000000,
+ 1081080000000,
+ 1099220400000,
+ 1112529600000,
+ 1130670000000,
+ 1143979200000,
+ 1162119600000,
+ 1173614400000,
+ 1194174000000,
+ 1205064000000,
+ 1225623600000,
+ 1236513600000,
+ 1257073200000,
+ 1268568000000,
+ 1289127600000,
+ 1300017600000,
+ 1320577200000,
+ 1331467200000,
+ 1352026800000,
+ 1362916800000,
+ 1383476400000,
+ 1394366400000,
+ 1414926000000,
+ 1425816000000,
+ 1446375600000,
+ 1457870400000,
+ 1478430000000,
+ 1489320000000,
+ 1509879600000,
+ 1520769600000,
+ 1541329200000,
+ 1552219200000,
+ 1572778800000,
+ 1583668800000,
+ 1604228400000,
+ 1615723200000,
+ 1636282800000,
+ 1647172800000,
+ 1667732400000,
+ 1678622400000,
+ 1699182000000,
+ 1710072000000,
+ 1730631600000,
+ 1741521600000,
+ 1762081200000,
+ 1772971200000,
+ 1793530800000,
+ 1805025600000,
+ 1825585200000,
+ 1836475200000,
+ 1857034800000,
+ 1867924800000,
+ 1888484400000,
+ 1899374400000,
+ 1919934000000,
+ 1930824000000,
+ 1951383600000,
+ 1962878400000,
+ 1983438000000,
+ 1994328000000,
+ 2014887600000,
+ 2025777600000,
+ 2046337200000,
+ 2057227200000,
+ 2077786800000,
+ 2088676800000,
+ 2109236400000,
+ 2120126400000,
+ 2140686000000,
+ null
+ ],
+ "offsets": [
+ 660,
+ 600,
+ 600,
+ 660,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 600,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600
+ ],
+ "population": 326
+ },
+ {
+ "name": "America/Anchorage",
+ "abbrs": [
+ "AST",
+ "AWT",
+ "APT",
+ "AST",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "YST",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST"
+ ],
+ "untils": [
+ -880200000000,
+ -769395600000,
+ -765378000000,
+ -86882400000,
+ -21470400000,
+ -5749200000,
+ 9979200000,
+ 25700400000,
+ 41428800000,
+ 57754800000,
+ 73483200000,
+ 89204400000,
+ 104932800000,
+ 120654000000,
+ 126705600000,
+ 152103600000,
+ 162388800000,
+ 183553200000,
+ 199281600000,
+ 215607600000,
+ 230731200000,
+ 247057200000,
+ 262785600000,
+ 278506800000,
+ 294235200000,
+ 309956400000,
+ 325684800000,
+ 341406000000,
+ 357134400000,
+ 372855600000,
+ 388584000000,
+ 404910000000,
+ 420033600000,
+ 436359600000,
+ 439030800000,
+ 452084400000,
+ 467805600000,
+ 483534000000,
+ 499255200000,
+ 514983600000,
+ 530704800000,
+ 544618800000,
+ 562154400000,
+ 576068400000,
+ 594208800000,
+ 607518000000,
+ 625658400000,
+ 638967600000,
+ 657108000000,
+ 671022000000,
+ 688557600000,
+ 702471600000,
+ 720007200000,
+ 733921200000,
+ 752061600000,
+ 765370800000,
+ 783511200000,
+ 796820400000,
+ 814960800000,
+ 828874800000,
+ 846410400000,
+ 860324400000,
+ 877860000000,
+ 891774000000,
+ 909309600000,
+ 923223600000,
+ 941364000000,
+ 954673200000,
+ 972813600000,
+ 986122800000,
+ 1004263200000,
+ 1018177200000,
+ 1035712800000,
+ 1049626800000,
+ 1067162400000,
+ 1081076400000,
+ 1099216800000,
+ 1112526000000,
+ 1130666400000,
+ 1143975600000,
+ 1162116000000,
+ 1173610800000,
+ 1194170400000,
+ 1205060400000,
+ 1225620000000,
+ 1236510000000,
+ 1257069600000,
+ 1268564400000,
+ 1289124000000,
+ 1300014000000,
+ 1320573600000,
+ 1331463600000,
+ 1352023200000,
+ 1362913200000,
+ 1383472800000,
+ 1394362800000,
+ 1414922400000,
+ 1425812400000,
+ 1446372000000,
+ 1457866800000,
+ 1478426400000,
+ 1489316400000,
+ 1509876000000,
+ 1520766000000,
+ 1541325600000,
+ 1552215600000,
+ 1572775200000,
+ 1583665200000,
+ 1604224800000,
+ 1615719600000,
+ 1636279200000,
+ 1647169200000,
+ 1667728800000,
+ 1678618800000,
+ 1699178400000,
+ 1710068400000,
+ 1730628000000,
+ 1741518000000,
+ 1762077600000,
+ 1772967600000,
+ 1793527200000,
+ 1805022000000,
+ 1825581600000,
+ 1836471600000,
+ 1857031200000,
+ 1867921200000,
+ 1888480800000,
+ 1899370800000,
+ 1919930400000,
+ 1930820400000,
+ 1951380000000,
+ 1962874800000,
+ 1983434400000,
+ 1994324400000,
+ 2014884000000,
+ 2025774000000,
+ 2046333600000,
+ 2057223600000,
+ 2077783200000,
+ 2088673200000,
+ 2109232800000,
+ 2120122800000,
+ 2140682400000,
+ null
+ ],
+ "offsets": [
+ 600,
+ 540,
+ 540,
+ 600,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 540,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540
+ ],
+ "population": 300950
+ },
+ {
+ "name": "America/Anguilla",
+ "abbrs": [
+ "LMT",
+ "AST"
+ ],
+ "untils": [
+ -1825098836000,
+ null
+ ],
+ "offsets": [
+ 246.0667,
+ 240
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Antigua",
+ "abbrs": [
+ "LMT",
+ "AST"
+ ],
+ "untils": [
+ -1825098836000,
+ null
+ ],
+ "offsets": [
+ 246.0667,
+ 240
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Araguaina",
+ "abbrs": [
+ "LMT",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1767214032000,
+ -1206957600000,
+ -1191362400000,
+ -1175374800000,
+ -1159826400000,
+ -633819600000,
+ -622069200000,
+ -602283600000,
+ -591832800000,
+ -570747600000,
+ -560210400000,
+ -539125200000,
+ -531352800000,
+ -191365200000,
+ -184197600000,
+ -155163600000,
+ -150069600000,
+ -128898000000,
+ -121125600000,
+ -99954000000,
+ -89589600000,
+ -68418000000,
+ -57967200000,
+ 499748400000,
+ 511236000000,
+ 530593200000,
+ 540266400000,
+ 562129200000,
+ 571197600000,
+ 592974000000,
+ 602042400000,
+ 624423600000,
+ 634701600000,
+ 813726000000,
+ 824004000000,
+ 844570800000,
+ 856058400000,
+ 876106800000,
+ 888717600000,
+ 908074800000,
+ 919562400000,
+ 938919600000,
+ 951616800000,
+ 970974000000,
+ 982461600000,
+ 1003028400000,
+ 1013911200000,
+ 1036292400000,
+ 1045360800000,
+ 1350788400000,
+ 1361066400000,
+ null
+ ],
+ "offsets": [
+ 192.8,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 142925
+ },
+ {
+ "name": "America/Argentina/Buenos_Aires",
+ "abbrs": [
+ "CMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1567453392000,
+ -1233432000000,
+ -1222981200000,
+ -1205956800000,
+ -1194037200000,
+ -1172865600000,
+ -1162501200000,
+ -1141329600000,
+ -1130965200000,
+ -1109793600000,
+ -1099429200000,
+ -1078257600000,
+ -1067806800000,
+ -1046635200000,
+ -1036270800000,
+ -1015099200000,
+ -1004734800000,
+ -983563200000,
+ -973198800000,
+ -952027200000,
+ -941576400000,
+ -931032000000,
+ -900882000000,
+ -890337600000,
+ -833749200000,
+ -827265600000,
+ -752274000000,
+ -733780800000,
+ -197326800000,
+ -190843200000,
+ -184194000000,
+ -164491200000,
+ -152658000000,
+ -132955200000,
+ -121122000000,
+ -101419200000,
+ -86821200000,
+ -71092800000,
+ -54766800000,
+ -39038400000,
+ -23317200000,
+ -7588800000,
+ 128142000000,
+ 136605600000,
+ 596948400000,
+ 605066400000,
+ 624423600000,
+ 636516000000,
+ 656478000000,
+ 667965600000,
+ 687927600000,
+ 699415200000,
+ 719377200000,
+ 731469600000,
+ 1198983600000,
+ 1205632800000,
+ 1224385200000,
+ 1237082400000,
+ null
+ ],
+ "offsets": [
+ 256.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Argentina/Catamarca",
+ "abbrs": [
+ "CMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-04",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1567453392000,
+ -1233432000000,
+ -1222981200000,
+ -1205956800000,
+ -1194037200000,
+ -1172865600000,
+ -1162501200000,
+ -1141329600000,
+ -1130965200000,
+ -1109793600000,
+ -1099429200000,
+ -1078257600000,
+ -1067806800000,
+ -1046635200000,
+ -1036270800000,
+ -1015099200000,
+ -1004734800000,
+ -983563200000,
+ -973198800000,
+ -952027200000,
+ -941576400000,
+ -931032000000,
+ -900882000000,
+ -890337600000,
+ -833749200000,
+ -827265600000,
+ -752274000000,
+ -733780800000,
+ -197326800000,
+ -190843200000,
+ -184194000000,
+ -164491200000,
+ -152658000000,
+ -132955200000,
+ -121122000000,
+ -101419200000,
+ -86821200000,
+ -71092800000,
+ -54766800000,
+ -39038400000,
+ -23317200000,
+ -7588800000,
+ 128142000000,
+ 136605600000,
+ 596948400000,
+ 605066400000,
+ 624423600000,
+ 636516000000,
+ 656478000000,
+ 667965600000,
+ 687931200000,
+ 699415200000,
+ 719377200000,
+ 731469600000,
+ 1086058800000,
+ 1087704000000,
+ 1198983600000,
+ 1205632800000,
+ null
+ ],
+ "offsets": [
+ 256.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 240,
+ 120,
+ 180,
+ 120,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Argentina/ComodRivadavia",
+ "abbrs": [
+ "CMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-04",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1567453392000,
+ -1233432000000,
+ -1222981200000,
+ -1205956800000,
+ -1194037200000,
+ -1172865600000,
+ -1162501200000,
+ -1141329600000,
+ -1130965200000,
+ -1109793600000,
+ -1099429200000,
+ -1078257600000,
+ -1067806800000,
+ -1046635200000,
+ -1036270800000,
+ -1015099200000,
+ -1004734800000,
+ -983563200000,
+ -973198800000,
+ -952027200000,
+ -941576400000,
+ -931032000000,
+ -900882000000,
+ -890337600000,
+ -833749200000,
+ -827265600000,
+ -752274000000,
+ -733780800000,
+ -197326800000,
+ -190843200000,
+ -184194000000,
+ -164491200000,
+ -152658000000,
+ -132955200000,
+ -121122000000,
+ -101419200000,
+ -86821200000,
+ -71092800000,
+ -54766800000,
+ -39038400000,
+ -23317200000,
+ -7588800000,
+ 128142000000,
+ 136605600000,
+ 596948400000,
+ 605066400000,
+ 624423600000,
+ 636516000000,
+ 656478000000,
+ 667965600000,
+ 687931200000,
+ 699415200000,
+ 719377200000,
+ 731469600000,
+ 1086058800000,
+ 1087704000000,
+ 1198983600000,
+ 1205632800000,
+ null
+ ],
+ "offsets": [
+ 256.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 240,
+ 120,
+ 180,
+ 120,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Argentina/Cordoba",
+ "abbrs": [
+ "CMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-04",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1567453392000,
+ -1233432000000,
+ -1222981200000,
+ -1205956800000,
+ -1194037200000,
+ -1172865600000,
+ -1162501200000,
+ -1141329600000,
+ -1130965200000,
+ -1109793600000,
+ -1099429200000,
+ -1078257600000,
+ -1067806800000,
+ -1046635200000,
+ -1036270800000,
+ -1015099200000,
+ -1004734800000,
+ -983563200000,
+ -973198800000,
+ -952027200000,
+ -941576400000,
+ -931032000000,
+ -900882000000,
+ -890337600000,
+ -833749200000,
+ -827265600000,
+ -752274000000,
+ -733780800000,
+ -197326800000,
+ -190843200000,
+ -184194000000,
+ -164491200000,
+ -152658000000,
+ -132955200000,
+ -121122000000,
+ -101419200000,
+ -86821200000,
+ -71092800000,
+ -54766800000,
+ -39038400000,
+ -23317200000,
+ -7588800000,
+ 128142000000,
+ 136605600000,
+ 596948400000,
+ 605066400000,
+ 624423600000,
+ 636516000000,
+ 656478000000,
+ 667965600000,
+ 687931200000,
+ 699415200000,
+ 719377200000,
+ 731469600000,
+ 1198983600000,
+ 1205632800000,
+ 1224385200000,
+ 1237082400000,
+ null
+ ],
+ "offsets": [
+ 256.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 240,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Argentina/Jujuy",
+ "abbrs": [
+ "CMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-04",
+ "-03",
+ "-04",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1567453392000,
+ -1233432000000,
+ -1222981200000,
+ -1205956800000,
+ -1194037200000,
+ -1172865600000,
+ -1162501200000,
+ -1141329600000,
+ -1130965200000,
+ -1109793600000,
+ -1099429200000,
+ -1078257600000,
+ -1067806800000,
+ -1046635200000,
+ -1036270800000,
+ -1015099200000,
+ -1004734800000,
+ -983563200000,
+ -973198800000,
+ -952027200000,
+ -941576400000,
+ -931032000000,
+ -900882000000,
+ -890337600000,
+ -833749200000,
+ -827265600000,
+ -752274000000,
+ -733780800000,
+ -197326800000,
+ -190843200000,
+ -184194000000,
+ -164491200000,
+ -152658000000,
+ -132955200000,
+ -121122000000,
+ -101419200000,
+ -86821200000,
+ -71092800000,
+ -54766800000,
+ -39038400000,
+ -23317200000,
+ -7588800000,
+ 128142000000,
+ 136605600000,
+ 596948400000,
+ 605066400000,
+ 624423600000,
+ 636516000000,
+ 657086400000,
+ 669178800000,
+ 686721600000,
+ 699415200000,
+ 719377200000,
+ 731469600000,
+ 1198983600000,
+ 1205632800000,
+ null
+ ],
+ "offsets": [
+ 256.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 240,
+ 180,
+ 240,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Argentina/La_Rioja",
+ "abbrs": [
+ "CMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1567453392000,
+ -1233432000000,
+ -1222981200000,
+ -1205956800000,
+ -1194037200000,
+ -1172865600000,
+ -1162501200000,
+ -1141329600000,
+ -1130965200000,
+ -1109793600000,
+ -1099429200000,
+ -1078257600000,
+ -1067806800000,
+ -1046635200000,
+ -1036270800000,
+ -1015099200000,
+ -1004734800000,
+ -983563200000,
+ -973198800000,
+ -952027200000,
+ -941576400000,
+ -931032000000,
+ -900882000000,
+ -890337600000,
+ -833749200000,
+ -827265600000,
+ -752274000000,
+ -733780800000,
+ -197326800000,
+ -190843200000,
+ -184194000000,
+ -164491200000,
+ -152658000000,
+ -132955200000,
+ -121122000000,
+ -101419200000,
+ -86821200000,
+ -71092800000,
+ -54766800000,
+ -39038400000,
+ -23317200000,
+ -7588800000,
+ 128142000000,
+ 136605600000,
+ 596948400000,
+ 605066400000,
+ 624423600000,
+ 636516000000,
+ 656478000000,
+ 667792800000,
+ 673588800000,
+ 687927600000,
+ 699415200000,
+ 719377200000,
+ 731469600000,
+ 1086058800000,
+ 1087704000000,
+ 1198983600000,
+ 1205632800000,
+ null
+ ],
+ "offsets": [
+ 256.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Argentina/Mendoza",
+ "abbrs": [
+ "CMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-02",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1567453392000,
+ -1233432000000,
+ -1222981200000,
+ -1205956800000,
+ -1194037200000,
+ -1172865600000,
+ -1162501200000,
+ -1141329600000,
+ -1130965200000,
+ -1109793600000,
+ -1099429200000,
+ -1078257600000,
+ -1067806800000,
+ -1046635200000,
+ -1036270800000,
+ -1015099200000,
+ -1004734800000,
+ -983563200000,
+ -973198800000,
+ -952027200000,
+ -941576400000,
+ -931032000000,
+ -900882000000,
+ -890337600000,
+ -833749200000,
+ -827265600000,
+ -752274000000,
+ -733780800000,
+ -197326800000,
+ -190843200000,
+ -184194000000,
+ -164491200000,
+ -152658000000,
+ -132955200000,
+ -121122000000,
+ -101419200000,
+ -86821200000,
+ -71092800000,
+ -54766800000,
+ -39038400000,
+ -23317200000,
+ -7588800000,
+ 128142000000,
+ 136605600000,
+ 596948400000,
+ 605066400000,
+ 624423600000,
+ 636516000000,
+ 655963200000,
+ 667796400000,
+ 687499200000,
+ 699418800000,
+ 719380800000,
+ 731469600000,
+ 1085281200000,
+ 1096171200000,
+ 1198983600000,
+ 1205632800000,
+ null
+ ],
+ "offsets": [
+ 256.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 120,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Argentina/Rio_Gallegos",
+ "abbrs": [
+ "CMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1567453392000,
+ -1233432000000,
+ -1222981200000,
+ -1205956800000,
+ -1194037200000,
+ -1172865600000,
+ -1162501200000,
+ -1141329600000,
+ -1130965200000,
+ -1109793600000,
+ -1099429200000,
+ -1078257600000,
+ -1067806800000,
+ -1046635200000,
+ -1036270800000,
+ -1015099200000,
+ -1004734800000,
+ -983563200000,
+ -973198800000,
+ -952027200000,
+ -941576400000,
+ -931032000000,
+ -900882000000,
+ -890337600000,
+ -833749200000,
+ -827265600000,
+ -752274000000,
+ -733780800000,
+ -197326800000,
+ -190843200000,
+ -184194000000,
+ -164491200000,
+ -152658000000,
+ -132955200000,
+ -121122000000,
+ -101419200000,
+ -86821200000,
+ -71092800000,
+ -54766800000,
+ -39038400000,
+ -23317200000,
+ -7588800000,
+ 128142000000,
+ 136605600000,
+ 596948400000,
+ 605066400000,
+ 624423600000,
+ 636516000000,
+ 656478000000,
+ 667965600000,
+ 687927600000,
+ 699415200000,
+ 719377200000,
+ 731469600000,
+ 1086058800000,
+ 1087704000000,
+ 1198983600000,
+ 1205632800000,
+ null
+ ],
+ "offsets": [
+ 256.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Argentina/Salta",
+ "abbrs": [
+ "CMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-04",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1567453392000,
+ -1233432000000,
+ -1222981200000,
+ -1205956800000,
+ -1194037200000,
+ -1172865600000,
+ -1162501200000,
+ -1141329600000,
+ -1130965200000,
+ -1109793600000,
+ -1099429200000,
+ -1078257600000,
+ -1067806800000,
+ -1046635200000,
+ -1036270800000,
+ -1015099200000,
+ -1004734800000,
+ -983563200000,
+ -973198800000,
+ -952027200000,
+ -941576400000,
+ -931032000000,
+ -900882000000,
+ -890337600000,
+ -833749200000,
+ -827265600000,
+ -752274000000,
+ -733780800000,
+ -197326800000,
+ -190843200000,
+ -184194000000,
+ -164491200000,
+ -152658000000,
+ -132955200000,
+ -121122000000,
+ -101419200000,
+ -86821200000,
+ -71092800000,
+ -54766800000,
+ -39038400000,
+ -23317200000,
+ -7588800000,
+ 128142000000,
+ 136605600000,
+ 596948400000,
+ 605066400000,
+ 624423600000,
+ 636516000000,
+ 656478000000,
+ 667965600000,
+ 687931200000,
+ 699415200000,
+ 719377200000,
+ 731469600000,
+ 1198983600000,
+ 1205632800000,
+ null
+ ],
+ "offsets": [
+ 256.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 240,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Argentina/San_Juan",
+ "abbrs": [
+ "CMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1567453392000,
+ -1233432000000,
+ -1222981200000,
+ -1205956800000,
+ -1194037200000,
+ -1172865600000,
+ -1162501200000,
+ -1141329600000,
+ -1130965200000,
+ -1109793600000,
+ -1099429200000,
+ -1078257600000,
+ -1067806800000,
+ -1046635200000,
+ -1036270800000,
+ -1015099200000,
+ -1004734800000,
+ -983563200000,
+ -973198800000,
+ -952027200000,
+ -941576400000,
+ -931032000000,
+ -900882000000,
+ -890337600000,
+ -833749200000,
+ -827265600000,
+ -752274000000,
+ -733780800000,
+ -197326800000,
+ -190843200000,
+ -184194000000,
+ -164491200000,
+ -152658000000,
+ -132955200000,
+ -121122000000,
+ -101419200000,
+ -86821200000,
+ -71092800000,
+ -54766800000,
+ -39038400000,
+ -23317200000,
+ -7588800000,
+ 128142000000,
+ 136605600000,
+ 596948400000,
+ 605066400000,
+ 624423600000,
+ 636516000000,
+ 656478000000,
+ 667792800000,
+ 673588800000,
+ 687927600000,
+ 699415200000,
+ 719377200000,
+ 731469600000,
+ 1085972400000,
+ 1090728000000,
+ 1198983600000,
+ 1205632800000,
+ null
+ ],
+ "offsets": [
+ 256.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Argentina/San_Luis",
+ "abbrs": [
+ "CMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03"
+ ],
+ "untils": [
+ -1567453392000,
+ -1233432000000,
+ -1222981200000,
+ -1205956800000,
+ -1194037200000,
+ -1172865600000,
+ -1162501200000,
+ -1141329600000,
+ -1130965200000,
+ -1109793600000,
+ -1099429200000,
+ -1078257600000,
+ -1067806800000,
+ -1046635200000,
+ -1036270800000,
+ -1015099200000,
+ -1004734800000,
+ -983563200000,
+ -973198800000,
+ -952027200000,
+ -941576400000,
+ -931032000000,
+ -900882000000,
+ -890337600000,
+ -833749200000,
+ -827265600000,
+ -752274000000,
+ -733780800000,
+ -197326800000,
+ -190843200000,
+ -184194000000,
+ -164491200000,
+ -152658000000,
+ -132955200000,
+ -121122000000,
+ -101419200000,
+ -86821200000,
+ -71092800000,
+ -54766800000,
+ -39038400000,
+ -23317200000,
+ -7588800000,
+ 128142000000,
+ 136605600000,
+ 596948400000,
+ 605066400000,
+ 624423600000,
+ 637380000000,
+ 655963200000,
+ 667796400000,
+ 675748800000,
+ 1085972400000,
+ 1090728000000,
+ 1198983600000,
+ 1200880800000,
+ 1205031600000,
+ 1223784000000,
+ 1236481200000,
+ 1255233600000,
+ null
+ ],
+ "offsets": [
+ 256.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Argentina/Tucuman",
+ "abbrs": [
+ "CMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-04",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1567453392000,
+ -1233432000000,
+ -1222981200000,
+ -1205956800000,
+ -1194037200000,
+ -1172865600000,
+ -1162501200000,
+ -1141329600000,
+ -1130965200000,
+ -1109793600000,
+ -1099429200000,
+ -1078257600000,
+ -1067806800000,
+ -1046635200000,
+ -1036270800000,
+ -1015099200000,
+ -1004734800000,
+ -983563200000,
+ -973198800000,
+ -952027200000,
+ -941576400000,
+ -931032000000,
+ -900882000000,
+ -890337600000,
+ -833749200000,
+ -827265600000,
+ -752274000000,
+ -733780800000,
+ -197326800000,
+ -190843200000,
+ -184194000000,
+ -164491200000,
+ -152658000000,
+ -132955200000,
+ -121122000000,
+ -101419200000,
+ -86821200000,
+ -71092800000,
+ -54766800000,
+ -39038400000,
+ -23317200000,
+ -7588800000,
+ 128142000000,
+ 136605600000,
+ 596948400000,
+ 605066400000,
+ 624423600000,
+ 636516000000,
+ 656478000000,
+ 667965600000,
+ 687931200000,
+ 699415200000,
+ 719377200000,
+ 731469600000,
+ 1086058800000,
+ 1087099200000,
+ 1198983600000,
+ 1205632800000,
+ 1224385200000,
+ 1237082400000,
+ null
+ ],
+ "offsets": [
+ 256.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 240,
+ 120,
+ 180,
+ 120,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Argentina/Ushuaia",
+ "abbrs": [
+ "CMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1567453392000,
+ -1233432000000,
+ -1222981200000,
+ -1205956800000,
+ -1194037200000,
+ -1172865600000,
+ -1162501200000,
+ -1141329600000,
+ -1130965200000,
+ -1109793600000,
+ -1099429200000,
+ -1078257600000,
+ -1067806800000,
+ -1046635200000,
+ -1036270800000,
+ -1015099200000,
+ -1004734800000,
+ -983563200000,
+ -973198800000,
+ -952027200000,
+ -941576400000,
+ -931032000000,
+ -900882000000,
+ -890337600000,
+ -833749200000,
+ -827265600000,
+ -752274000000,
+ -733780800000,
+ -197326800000,
+ -190843200000,
+ -184194000000,
+ -164491200000,
+ -152658000000,
+ -132955200000,
+ -121122000000,
+ -101419200000,
+ -86821200000,
+ -71092800000,
+ -54766800000,
+ -39038400000,
+ -23317200000,
+ -7588800000,
+ 128142000000,
+ 136605600000,
+ 596948400000,
+ 605066400000,
+ 624423600000,
+ 636516000000,
+ 656478000000,
+ 667965600000,
+ 687927600000,
+ 699415200000,
+ 719377200000,
+ 731469600000,
+ 1085886000000,
+ 1087704000000,
+ 1198983600000,
+ 1205632800000,
+ null
+ ],
+ "offsets": [
+ 256.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Aruba",
+ "abbrs": [
+ "LMT",
+ "-0430",
+ "AST"
+ ],
+ "untils": [
+ -1826738653000,
+ -157750200000,
+ null
+ ],
+ "offsets": [
+ 275.7833,
+ 270,
+ 240
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Asuncion",
+ "abbrs": [
+ "AMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03"
+ ],
+ "untils": [
+ -1206389360000,
+ 86760000000,
+ 134017200000,
+ 181368000000,
+ 194497200000,
+ 212990400000,
+ 226033200000,
+ 244526400000,
+ 257569200000,
+ 276062400000,
+ 291783600000,
+ 307598400000,
+ 323406000000,
+ 339220800000,
+ 354942000000,
+ 370756800000,
+ 386478000000,
+ 402292800000,
+ 418014000000,
+ 433828800000,
+ 449636400000,
+ 465451200000,
+ 481172400000,
+ 496987200000,
+ 512708400000,
+ 528523200000,
+ 544244400000,
+ 560059200000,
+ 575866800000,
+ 591681600000,
+ 607402800000,
+ 625032000000,
+ 638938800000,
+ 654753600000,
+ 670474800000,
+ 686721600000,
+ 699418800000,
+ 718257600000,
+ 733546800000,
+ 749448000000,
+ 762318000000,
+ 780984000000,
+ 793767600000,
+ 812520000000,
+ 825649200000,
+ 844574400000,
+ 856666800000,
+ 876024000000,
+ 888721200000,
+ 907473600000,
+ 920775600000,
+ 938923200000,
+ 952225200000,
+ 970372800000,
+ 983674800000,
+ 1002427200000,
+ 1018148400000,
+ 1030852800000,
+ 1049598000000,
+ 1062907200000,
+ 1081047600000,
+ 1097985600000,
+ 1110682800000,
+ 1129435200000,
+ 1142132400000,
+ 1160884800000,
+ 1173582000000,
+ 1192939200000,
+ 1205031600000,
+ 1224388800000,
+ 1236481200000,
+ 1255838400000,
+ 1270954800000,
+ 1286078400000,
+ 1302404400000,
+ 1317528000000,
+ 1333854000000,
+ 1349582400000,
+ 1364094000000,
+ 1381032000000,
+ 1395543600000,
+ 1412481600000,
+ 1426993200000,
+ 1443931200000,
+ 1459047600000,
+ 1475380800000,
+ 1490497200000,
+ 1506830400000,
+ 1521946800000,
+ 1538884800000,
+ 1553396400000,
+ 1570334400000,
+ 1584846000000,
+ 1601784000000,
+ 1616900400000,
+ 1633233600000,
+ 1648350000000,
+ 1664683200000,
+ 1679799600000,
+ 1696132800000,
+ 1711249200000,
+ 1728187200000,
+ 1742698800000,
+ 1759636800000,
+ 1774148400000,
+ 1791086400000,
+ 1806202800000,
+ 1822536000000,
+ 1837652400000,
+ 1853985600000,
+ 1869102000000,
+ 1886040000000,
+ 1900551600000,
+ 1917489600000,
+ 1932001200000,
+ 1948939200000,
+ 1964055600000,
+ 1980388800000,
+ 1995505200000,
+ 2011838400000,
+ 2026954800000,
+ 2043288000000,
+ 2058404400000,
+ 2075342400000,
+ 2089854000000,
+ 2106792000000,
+ 2121303600000,
+ 2138241600000,
+ null
+ ],
+ "offsets": [
+ 230.6667,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180
+ ],
+ "population": 2827000
+ },
+ {
+ "name": "America/Atikokan",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CWT",
+ "CPT",
+ "EST"
+ ],
+ "untils": [
+ -1632067200000,
+ -1615136400000,
+ -923248800000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 300,
+ 300
+ ],
+ "population": 2787
+ },
+ {
+ "name": "America/Atka",
+ "abbrs": [
+ "NST",
+ "NWT",
+ "NPT",
+ "NST",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "AHST",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST"
+ ],
+ "untils": [
+ -880196400000,
+ -769395600000,
+ -765374400000,
+ -86878800000,
+ -21466800000,
+ -5745600000,
+ 9982800000,
+ 25704000000,
+ 41432400000,
+ 57758400000,
+ 73486800000,
+ 89208000000,
+ 104936400000,
+ 120657600000,
+ 126709200000,
+ 152107200000,
+ 162392400000,
+ 183556800000,
+ 199285200000,
+ 215611200000,
+ 230734800000,
+ 247060800000,
+ 262789200000,
+ 278510400000,
+ 294238800000,
+ 309960000000,
+ 325688400000,
+ 341409600000,
+ 357138000000,
+ 372859200000,
+ 388587600000,
+ 404913600000,
+ 420037200000,
+ 436363200000,
+ 439034400000,
+ 452088000000,
+ 467809200000,
+ 483537600000,
+ 499258800000,
+ 514987200000,
+ 530708400000,
+ 544622400000,
+ 562158000000,
+ 576072000000,
+ 594212400000,
+ 607521600000,
+ 625662000000,
+ 638971200000,
+ 657111600000,
+ 671025600000,
+ 688561200000,
+ 702475200000,
+ 720010800000,
+ 733924800000,
+ 752065200000,
+ 765374400000,
+ 783514800000,
+ 796824000000,
+ 814964400000,
+ 828878400000,
+ 846414000000,
+ 860328000000,
+ 877863600000,
+ 891777600000,
+ 909313200000,
+ 923227200000,
+ 941367600000,
+ 954676800000,
+ 972817200000,
+ 986126400000,
+ 1004266800000,
+ 1018180800000,
+ 1035716400000,
+ 1049630400000,
+ 1067166000000,
+ 1081080000000,
+ 1099220400000,
+ 1112529600000,
+ 1130670000000,
+ 1143979200000,
+ 1162119600000,
+ 1173614400000,
+ 1194174000000,
+ 1205064000000,
+ 1225623600000,
+ 1236513600000,
+ 1257073200000,
+ 1268568000000,
+ 1289127600000,
+ 1300017600000,
+ 1320577200000,
+ 1331467200000,
+ 1352026800000,
+ 1362916800000,
+ 1383476400000,
+ 1394366400000,
+ 1414926000000,
+ 1425816000000,
+ 1446375600000,
+ 1457870400000,
+ 1478430000000,
+ 1489320000000,
+ 1509879600000,
+ 1520769600000,
+ 1541329200000,
+ 1552219200000,
+ 1572778800000,
+ 1583668800000,
+ 1604228400000,
+ 1615723200000,
+ 1636282800000,
+ 1647172800000,
+ 1667732400000,
+ 1678622400000,
+ 1699182000000,
+ 1710072000000,
+ 1730631600000,
+ 1741521600000,
+ 1762081200000,
+ 1772971200000,
+ 1793530800000,
+ 1805025600000,
+ 1825585200000,
+ 1836475200000,
+ 1857034800000,
+ 1867924800000,
+ 1888484400000,
+ 1899374400000,
+ 1919934000000,
+ 1930824000000,
+ 1951383600000,
+ 1962878400000,
+ 1983438000000,
+ 1994328000000,
+ 2014887600000,
+ 2025777600000,
+ 2046337200000,
+ 2057227200000,
+ 2077786800000,
+ 2088676800000,
+ 2109236400000,
+ 2120126400000,
+ 2140686000000,
+ null
+ ],
+ "offsets": [
+ 660,
+ 600,
+ 600,
+ 660,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 600,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Bahia_Banderas",
+ "abbrs": [
+ "LMT",
+ "MST",
+ "CST",
+ "MST",
+ "CST",
+ "MST",
+ "CST",
+ "MST",
+ "PST",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1514739600000,
+ -1343066400000,
+ -1234807200000,
+ -1220292000000,
+ -1207159200000,
+ -1191344400000,
+ -873828000000,
+ -661539600000,
+ 28800000,
+ 828867600000,
+ 846403200000,
+ 860317200000,
+ 877852800000,
+ 891766800000,
+ 909302400000,
+ 923216400000,
+ 941356800000,
+ 954666000000,
+ 972806400000,
+ 989139600000,
+ 1001836800000,
+ 1018170000000,
+ 1035705600000,
+ 1049619600000,
+ 1067155200000,
+ 1081069200000,
+ 1099209600000,
+ 1112518800000,
+ 1130659200000,
+ 1143968400000,
+ 1162108800000,
+ 1175418000000,
+ 1193558400000,
+ 1207472400000,
+ 1225008000000,
+ 1238922000000,
+ 1256457600000,
+ 1270371600000,
+ 1288508400000,
+ 1301817600000,
+ 1319958000000,
+ 1333267200000,
+ 1351407600000,
+ 1365321600000,
+ 1382857200000,
+ 1396771200000,
+ 1414306800000,
+ 1428220800000,
+ 1445756400000,
+ 1459670400000,
+ 1477810800000,
+ 1491120000000,
+ 1509260400000,
+ 1522569600000,
+ 1540710000000,
+ 1554624000000,
+ 1572159600000,
+ 1586073600000,
+ 1603609200000,
+ 1617523200000,
+ 1635663600000,
+ 1648972800000,
+ 1667113200000,
+ 1680422400000,
+ 1698562800000,
+ 1712476800000,
+ 1730012400000,
+ 1743926400000,
+ 1761462000000,
+ 1775376000000,
+ 1792911600000,
+ 1806825600000,
+ 1824966000000,
+ 1838275200000,
+ 1856415600000,
+ 1869724800000,
+ 1887865200000,
+ 1901779200000,
+ 1919314800000,
+ 1933228800000,
+ 1950764400000,
+ 1964678400000,
+ 1982818800000,
+ 1996128000000,
+ 2014268400000,
+ 2027577600000,
+ 2045718000000,
+ 2059027200000,
+ 2077167600000,
+ 2091081600000,
+ 2108617200000,
+ 2122531200000,
+ 2140066800000,
+ null
+ ],
+ "offsets": [
+ 421,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 480,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 83739
+ },
+ {
+ "name": "America/Bahia",
+ "abbrs": [
+ "LMT",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1767216356000,
+ -1206957600000,
+ -1191362400000,
+ -1175374800000,
+ -1159826400000,
+ -633819600000,
+ -622069200000,
+ -602283600000,
+ -591832800000,
+ -570747600000,
+ -560210400000,
+ -539125200000,
+ -531352800000,
+ -191365200000,
+ -184197600000,
+ -155163600000,
+ -150069600000,
+ -128898000000,
+ -121125600000,
+ -99954000000,
+ -89589600000,
+ -68418000000,
+ -57967200000,
+ 499748400000,
+ 511236000000,
+ 530593200000,
+ 540266400000,
+ 562129200000,
+ 571197600000,
+ 592974000000,
+ 602042400000,
+ 624423600000,
+ 634701600000,
+ 656478000000,
+ 666756000000,
+ 687927600000,
+ 697600800000,
+ 719982000000,
+ 728445600000,
+ 750826800000,
+ 761709600000,
+ 782276400000,
+ 793159200000,
+ 813726000000,
+ 824004000000,
+ 844570800000,
+ 856058400000,
+ 876106800000,
+ 888717600000,
+ 908074800000,
+ 919562400000,
+ 938919600000,
+ 951616800000,
+ 970974000000,
+ 982461600000,
+ 1003028400000,
+ 1013911200000,
+ 1036292400000,
+ 1045360800000,
+ 1318734000000,
+ 1330221600000,
+ null
+ ],
+ "offsets": [
+ 154.0667,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 2675000
+ },
+ {
+ "name": "America/Barbados",
+ "abbrs": [
+ "LMT",
+ "BMT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST"
+ ],
+ "untils": [
+ -1451678491000,
+ -1199217691000,
+ 234943200000,
+ 244616400000,
+ 261554400000,
+ 276066000000,
+ 293004000000,
+ 307515600000,
+ 325058400000,
+ 338706000000,
+ null
+ ],
+ "offsets": [
+ 238.4833,
+ 238.4833,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240
+ ],
+ "population": 284644
+ },
+ {
+ "name": "America/Belem",
+ "abbrs": [
+ "LMT",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1767213964000,
+ -1206957600000,
+ -1191362400000,
+ -1175374800000,
+ -1159826400000,
+ -633819600000,
+ -622069200000,
+ -602283600000,
+ -591832800000,
+ -570747600000,
+ -560210400000,
+ -539125200000,
+ -531352800000,
+ -191365200000,
+ -184197600000,
+ -155163600000,
+ -150069600000,
+ -128898000000,
+ -121125600000,
+ -99954000000,
+ -89589600000,
+ -68418000000,
+ -57967200000,
+ 499748400000,
+ 511236000000,
+ 530593200000,
+ 540266400000,
+ 562129200000,
+ 571197600000,
+ null
+ ],
+ "offsets": [
+ 193.9333,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 1979000
+ },
+ {
+ "name": "America/Belize",
+ "abbrs": [
+ "LMT",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "-0530",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1822500432000,
+ -1616954400000,
+ -1606069800000,
+ -1585504800000,
+ -1574015400000,
+ -1554055200000,
+ -1542565800000,
+ -1522605600000,
+ -1511116200000,
+ -1490551200000,
+ -1479666600000,
+ -1459101600000,
+ -1448217000000,
+ -1427652000000,
+ -1416162600000,
+ -1396202400000,
+ -1384713000000,
+ -1364752800000,
+ -1353263400000,
+ -1333303200000,
+ -1321813800000,
+ -1301248800000,
+ -1290364200000,
+ -1269799200000,
+ -1258914600000,
+ -1238349600000,
+ -1226860200000,
+ -1206900000000,
+ -1195410600000,
+ -1175450400000,
+ -1163961000000,
+ -1143396000000,
+ -1132511400000,
+ -1111946400000,
+ -1101061800000,
+ -1080496800000,
+ -1069612200000,
+ -1049047200000,
+ -1037557800000,
+ -1017597600000,
+ -1006108200000,
+ -986148000000,
+ -974658600000,
+ -954093600000,
+ -943209000000,
+ -922644000000,
+ -911759400000,
+ -891194400000,
+ -879705000000,
+ -859744800000,
+ -848255400000,
+ 123919200000,
+ 129618000000,
+ 409039200000,
+ 413874000000,
+ null
+ ],
+ "offsets": [
+ 352.8,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 330,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 57169
+ },
+ {
+ "name": "America/Blanc-Sablon",
+ "abbrs": [
+ "AST",
+ "ADT",
+ "AST",
+ "AWT",
+ "APT",
+ "AST"
+ ],
+ "untils": [
+ -1632074400000,
+ -1615143600000,
+ -880221600000,
+ -769395600000,
+ -765399600000,
+ null
+ ],
+ "offsets": [
+ 240,
+ 180,
+ 240,
+ 180,
+ 180,
+ 240
+ ],
+ "population": 1118
+ },
+ {
+ "name": "America/Boa_Vista",
+ "abbrs": [
+ "LMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04"
+ ],
+ "untils": [
+ -1767211040000,
+ -1206954000000,
+ -1191358800000,
+ -1175371200000,
+ -1159822800000,
+ -633816000000,
+ -622065600000,
+ -602280000000,
+ -591829200000,
+ -570744000000,
+ -560206800000,
+ -539121600000,
+ -531349200000,
+ -191361600000,
+ -184194000000,
+ -155160000000,
+ -150066000000,
+ -128894400000,
+ -121122000000,
+ -99950400000,
+ -89586000000,
+ -68414400000,
+ -57963600000,
+ 499752000000,
+ 511239600000,
+ 530596800000,
+ 540270000000,
+ 562132800000,
+ 571201200000,
+ 938923200000,
+ 951620400000,
+ 970977600000,
+ 971578800000,
+ null
+ ],
+ "offsets": [
+ 242.6667,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240
+ ],
+ "population": 6233
+ },
+ {
+ "name": "America/Bogota",
+ "abbrs": [
+ "BMT",
+ "-05",
+ "-04",
+ "-05"
+ ],
+ "untils": [
+ -1739041424000,
+ 704869200000,
+ 733896000000,
+ null
+ ],
+ "offsets": [
+ 296.2667,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 8991000
+ },
+ {
+ "name": "America/Boise",
+ "abbrs": [
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "MST",
+ "MWT",
+ "MPT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST"
+ ],
+ "untils": [
+ -1633269600000,
+ -1615129200000,
+ -1601820000000,
+ -1583679600000,
+ -1471788000000,
+ -880210800000,
+ -769395600000,
+ -765388800000,
+ -84380400000,
+ -68659200000,
+ -52930800000,
+ -37209600000,
+ -21481200000,
+ -5760000000,
+ 9968400000,
+ 25689600000,
+ 41418000000,
+ 57744000000,
+ 73472400000,
+ 89193600000,
+ 104922000000,
+ 120643200000,
+ 129114000000,
+ 152092800000,
+ 162378000000,
+ 183542400000,
+ 199270800000,
+ 215596800000,
+ 230720400000,
+ 247046400000,
+ 262774800000,
+ 278496000000,
+ 294224400000,
+ 309945600000,
+ 325674000000,
+ 341395200000,
+ 357123600000,
+ 372844800000,
+ 388573200000,
+ 404899200000,
+ 420022800000,
+ 436348800000,
+ 452077200000,
+ 467798400000,
+ 483526800000,
+ 499248000000,
+ 514976400000,
+ 530697600000,
+ 544611600000,
+ 562147200000,
+ 576061200000,
+ 594201600000,
+ 607510800000,
+ 625651200000,
+ 638960400000,
+ 657100800000,
+ 671014800000,
+ 688550400000,
+ 702464400000,
+ 720000000000,
+ 733914000000,
+ 752054400000,
+ 765363600000,
+ 783504000000,
+ 796813200000,
+ 814953600000,
+ 828867600000,
+ 846403200000,
+ 860317200000,
+ 877852800000,
+ 891766800000,
+ 909302400000,
+ 923216400000,
+ 941356800000,
+ 954666000000,
+ 972806400000,
+ 986115600000,
+ 1004256000000,
+ 1018170000000,
+ 1035705600000,
+ 1049619600000,
+ 1067155200000,
+ 1081069200000,
+ 1099209600000,
+ 1112518800000,
+ 1130659200000,
+ 1143968400000,
+ 1162108800000,
+ 1173603600000,
+ 1194163200000,
+ 1205053200000,
+ 1225612800000,
+ 1236502800000,
+ 1257062400000,
+ 1268557200000,
+ 1289116800000,
+ 1300006800000,
+ 1320566400000,
+ 1331456400000,
+ 1352016000000,
+ 1362906000000,
+ 1383465600000,
+ 1394355600000,
+ 1414915200000,
+ 1425805200000,
+ 1446364800000,
+ 1457859600000,
+ 1478419200000,
+ 1489309200000,
+ 1509868800000,
+ 1520758800000,
+ 1541318400000,
+ 1552208400000,
+ 1572768000000,
+ 1583658000000,
+ 1604217600000,
+ 1615712400000,
+ 1636272000000,
+ 1647162000000,
+ 1667721600000,
+ 1678611600000,
+ 1699171200000,
+ 1710061200000,
+ 1730620800000,
+ 1741510800000,
+ 1762070400000,
+ 1772960400000,
+ 1793520000000,
+ 1805014800000,
+ 1825574400000,
+ 1836464400000,
+ 1857024000000,
+ 1867914000000,
+ 1888473600000,
+ 1899363600000,
+ 1919923200000,
+ 1930813200000,
+ 1951372800000,
+ 1962867600000,
+ 1983427200000,
+ 1994317200000,
+ 2014876800000,
+ 2025766800000,
+ 2046326400000,
+ 2057216400000,
+ 2077776000000,
+ 2088666000000,
+ 2109225600000,
+ 2120115600000,
+ 2140675200000,
+ null
+ ],
+ "offsets": [
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 360,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420
+ ],
+ "population": 214237
+ },
+ {
+ "name": "America/Buenos_Aires",
+ "abbrs": [
+ "CMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1567453392000,
+ -1233432000000,
+ -1222981200000,
+ -1205956800000,
+ -1194037200000,
+ -1172865600000,
+ -1162501200000,
+ -1141329600000,
+ -1130965200000,
+ -1109793600000,
+ -1099429200000,
+ -1078257600000,
+ -1067806800000,
+ -1046635200000,
+ -1036270800000,
+ -1015099200000,
+ -1004734800000,
+ -983563200000,
+ -973198800000,
+ -952027200000,
+ -941576400000,
+ -931032000000,
+ -900882000000,
+ -890337600000,
+ -833749200000,
+ -827265600000,
+ -752274000000,
+ -733780800000,
+ -197326800000,
+ -190843200000,
+ -184194000000,
+ -164491200000,
+ -152658000000,
+ -132955200000,
+ -121122000000,
+ -101419200000,
+ -86821200000,
+ -71092800000,
+ -54766800000,
+ -39038400000,
+ -23317200000,
+ -7588800000,
+ 128142000000,
+ 136605600000,
+ 596948400000,
+ 605066400000,
+ 624423600000,
+ 636516000000,
+ 656478000000,
+ 667965600000,
+ 687927600000,
+ 699415200000,
+ 719377200000,
+ 731469600000,
+ 1198983600000,
+ 1205632800000,
+ 1224385200000,
+ 1237082400000,
+ null
+ ],
+ "offsets": [
+ 256.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Cambridge_Bay",
+ "abbrs": [
+ "-00",
+ "MST",
+ "MWT",
+ "MPT",
+ "MST",
+ "MDDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "CST",
+ "CDT",
+ "EST",
+ "CST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST"
+ ],
+ "untils": [
+ -1577923200000,
+ -880210800000,
+ -769395600000,
+ -765388800000,
+ -147891600000,
+ -131562000000,
+ 325674000000,
+ 341395200000,
+ 357123600000,
+ 372844800000,
+ 388573200000,
+ 404899200000,
+ 420022800000,
+ 436348800000,
+ 452077200000,
+ 467798400000,
+ 483526800000,
+ 499248000000,
+ 514976400000,
+ 530697600000,
+ 544611600000,
+ 562147200000,
+ 576061200000,
+ 594201600000,
+ 607510800000,
+ 625651200000,
+ 638960400000,
+ 657100800000,
+ 671014800000,
+ 688550400000,
+ 702464400000,
+ 720000000000,
+ 733914000000,
+ 752054400000,
+ 765363600000,
+ 783504000000,
+ 796813200000,
+ 814953600000,
+ 828867600000,
+ 846403200000,
+ 860317200000,
+ 877852800000,
+ 891766800000,
+ 909302400000,
+ 923216400000,
+ 941356800000,
+ 954662400000,
+ 972802800000,
+ 973400400000,
+ 986115600000,
+ 1004256000000,
+ 1018170000000,
+ 1035705600000,
+ 1049619600000,
+ 1067155200000,
+ 1081069200000,
+ 1099209600000,
+ 1112518800000,
+ 1130659200000,
+ 1143968400000,
+ 1162108800000,
+ 1173603600000,
+ 1194163200000,
+ 1205053200000,
+ 1225612800000,
+ 1236502800000,
+ 1257062400000,
+ 1268557200000,
+ 1289116800000,
+ 1300006800000,
+ 1320566400000,
+ 1331456400000,
+ 1352016000000,
+ 1362906000000,
+ 1383465600000,
+ 1394355600000,
+ 1414915200000,
+ 1425805200000,
+ 1446364800000,
+ 1457859600000,
+ 1478419200000,
+ 1489309200000,
+ 1509868800000,
+ 1520758800000,
+ 1541318400000,
+ 1552208400000,
+ 1572768000000,
+ 1583658000000,
+ 1604217600000,
+ 1615712400000,
+ 1636272000000,
+ 1647162000000,
+ 1667721600000,
+ 1678611600000,
+ 1699171200000,
+ 1710061200000,
+ 1730620800000,
+ 1741510800000,
+ 1762070400000,
+ 1772960400000,
+ 1793520000000,
+ 1805014800000,
+ 1825574400000,
+ 1836464400000,
+ 1857024000000,
+ 1867914000000,
+ 1888473600000,
+ 1899363600000,
+ 1919923200000,
+ 1930813200000,
+ 1951372800000,
+ 1962867600000,
+ 1983427200000,
+ 1994317200000,
+ 2014876800000,
+ 2025766800000,
+ 2046326400000,
+ 2057216400000,
+ 2077776000000,
+ 2088666000000,
+ 2109225600000,
+ 2120115600000,
+ 2140675200000,
+ null
+ ],
+ "offsets": [
+ 0,
+ 420,
+ 360,
+ 360,
+ 420,
+ 300,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 360,
+ 300,
+ 300,
+ 360,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420
+ ],
+ "population": 1477
+ },
+ {
+ "name": "America/Campo_Grande",
+ "abbrs": [
+ "LMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03"
+ ],
+ "untils": [
+ -1767212492000,
+ -1206954000000,
+ -1191358800000,
+ -1175371200000,
+ -1159822800000,
+ -633816000000,
+ -622065600000,
+ -602280000000,
+ -591829200000,
+ -570744000000,
+ -560206800000,
+ -539121600000,
+ -531349200000,
+ -191361600000,
+ -184194000000,
+ -155160000000,
+ -150066000000,
+ -128894400000,
+ -121122000000,
+ -99950400000,
+ -89586000000,
+ -68414400000,
+ -57963600000,
+ 499752000000,
+ 511239600000,
+ 530596800000,
+ 540270000000,
+ 562132800000,
+ 571201200000,
+ 592977600000,
+ 602046000000,
+ 624427200000,
+ 634705200000,
+ 656481600000,
+ 666759600000,
+ 687931200000,
+ 697604400000,
+ 719985600000,
+ 728449200000,
+ 750830400000,
+ 761713200000,
+ 782280000000,
+ 793162800000,
+ 813729600000,
+ 824007600000,
+ 844574400000,
+ 856062000000,
+ 876110400000,
+ 888721200000,
+ 908078400000,
+ 919566000000,
+ 938923200000,
+ 951620400000,
+ 970977600000,
+ 982465200000,
+ 1003032000000,
+ 1013914800000,
+ 1036296000000,
+ 1045364400000,
+ 1066536000000,
+ 1076814000000,
+ 1099368000000,
+ 1108868400000,
+ 1129435200000,
+ 1140318000000,
+ 1162699200000,
+ 1172372400000,
+ 1192334400000,
+ 1203217200000,
+ 1224388800000,
+ 1234666800000,
+ 1255838400000,
+ 1266721200000,
+ 1287288000000,
+ 1298170800000,
+ 1318737600000,
+ 1330225200000,
+ 1350792000000,
+ 1361070000000,
+ 1382241600000,
+ 1392519600000,
+ 1413691200000,
+ 1424574000000,
+ 1445140800000,
+ 1456023600000,
+ 1476590400000,
+ 1487473200000,
+ 1508040000000,
+ 1518922800000,
+ 1541304000000,
+ 1550372400000,
+ 1572753600000,
+ 1581822000000,
+ 1604203200000,
+ 1613876400000,
+ 1636257600000,
+ 1645326000000,
+ 1667707200000,
+ 1677380400000,
+ 1699156800000,
+ 1708225200000,
+ 1730606400000,
+ 1739674800000,
+ 1762056000000,
+ 1771729200000,
+ 1793505600000,
+ 1803178800000,
+ 1825560000000,
+ 1834628400000,
+ 1857009600000,
+ 1866078000000,
+ 1888459200000,
+ 1897527600000,
+ 1919908800000,
+ 1928977200000,
+ 1951358400000,
+ 1960426800000,
+ 1983412800000,
+ 1992481200000,
+ 2014862400000,
+ 2024535600000,
+ 2046312000000,
+ 2055380400000,
+ 2077761600000,
+ 2086830000000,
+ 2109211200000,
+ 2118884400000,
+ 2140660800000,
+ null
+ ],
+ "offsets": [
+ 218.4667,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180
+ ],
+ "population": 774202
+ },
+ {
+ "name": "America/Cancun",
+ "abbrs": [
+ "LMT",
+ "CST",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "EST"
+ ],
+ "untils": [
+ -1514743200000,
+ 377935200000,
+ 828860400000,
+ 846396000000,
+ 860310000000,
+ 877845600000,
+ 891759600000,
+ 902037600000,
+ 909298800000,
+ 923212800000,
+ 941353200000,
+ 954662400000,
+ 972802800000,
+ 989136000000,
+ 1001833200000,
+ 1018166400000,
+ 1035702000000,
+ 1049616000000,
+ 1067151600000,
+ 1081065600000,
+ 1099206000000,
+ 1112515200000,
+ 1130655600000,
+ 1143964800000,
+ 1162105200000,
+ 1175414400000,
+ 1193554800000,
+ 1207468800000,
+ 1225004400000,
+ 1238918400000,
+ 1256454000000,
+ 1270368000000,
+ 1288508400000,
+ 1301817600000,
+ 1319958000000,
+ 1333267200000,
+ 1351407600000,
+ 1365321600000,
+ 1382857200000,
+ 1396771200000,
+ 1414306800000,
+ 1422777600000,
+ null
+ ],
+ "offsets": [
+ 347.0667,
+ 360,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300
+ ],
+ "population": 628306
+ },
+ {
+ "name": "America/Caracas",
+ "abbrs": [
+ "CMT",
+ "-0430",
+ "-04",
+ "-0430",
+ "-04"
+ ],
+ "untils": [
+ -1826739140000,
+ -157750200000,
+ 1197183600000,
+ 1462086000000,
+ null
+ ],
+ "offsets": [
+ 267.6667,
+ 270,
+ 240,
+ 270,
+ 240
+ ],
+ "population": 2861000
+ },
+ {
+ "name": "America/Catamarca",
+ "abbrs": [
+ "CMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-04",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1567453392000,
+ -1233432000000,
+ -1222981200000,
+ -1205956800000,
+ -1194037200000,
+ -1172865600000,
+ -1162501200000,
+ -1141329600000,
+ -1130965200000,
+ -1109793600000,
+ -1099429200000,
+ -1078257600000,
+ -1067806800000,
+ -1046635200000,
+ -1036270800000,
+ -1015099200000,
+ -1004734800000,
+ -983563200000,
+ -973198800000,
+ -952027200000,
+ -941576400000,
+ -931032000000,
+ -900882000000,
+ -890337600000,
+ -833749200000,
+ -827265600000,
+ -752274000000,
+ -733780800000,
+ -197326800000,
+ -190843200000,
+ -184194000000,
+ -164491200000,
+ -152658000000,
+ -132955200000,
+ -121122000000,
+ -101419200000,
+ -86821200000,
+ -71092800000,
+ -54766800000,
+ -39038400000,
+ -23317200000,
+ -7588800000,
+ 128142000000,
+ 136605600000,
+ 596948400000,
+ 605066400000,
+ 624423600000,
+ 636516000000,
+ 656478000000,
+ 667965600000,
+ 687931200000,
+ 699415200000,
+ 719377200000,
+ 731469600000,
+ 1086058800000,
+ 1087704000000,
+ 1198983600000,
+ 1205632800000,
+ null
+ ],
+ "offsets": [
+ 256.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 240,
+ 120,
+ 180,
+ 120,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Cayenne",
+ "abbrs": [
+ "LMT",
+ "-04",
+ "-03"
+ ],
+ "untils": [
+ -1846269040000,
+ -71092800000,
+ null
+ ],
+ "offsets": [
+ 209.3333,
+ 240,
+ 180
+ ],
+ "population": 58004
+ },
+ {
+ "name": "America/Cayman",
+ "abbrs": [
+ "CMT",
+ "EST"
+ ],
+ "untils": [
+ -1946918424000,
+ null
+ ],
+ "offsets": [
+ 319.6,
+ 300
+ ],
+ "population": 58435
+ },
+ {
+ "name": "America/Chicago",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "EST",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1633276800000,
+ -1615136400000,
+ -1601827200000,
+ -1583686800000,
+ -1563724800000,
+ -1551632400000,
+ -1538928000000,
+ -1520182800000,
+ -1504454400000,
+ -1491757200000,
+ -1473004800000,
+ -1459702800000,
+ -1441555200000,
+ -1428253200000,
+ -1410105600000,
+ -1396803600000,
+ -1378656000000,
+ -1365354000000,
+ -1347206400000,
+ -1333904400000,
+ -1315152000000,
+ -1301850000000,
+ -1283702400000,
+ -1270400400000,
+ -1252252800000,
+ -1238950800000,
+ -1220803200000,
+ -1207501200000,
+ -1189353600000,
+ -1176051600000,
+ -1157299200000,
+ -1144602000000,
+ -1125849600000,
+ -1112547600000,
+ -1094400000000,
+ -1081098000000,
+ -1067788800000,
+ -1045414800000,
+ -1031500800000,
+ -1018198800000,
+ -1000051200000,
+ -986749200000,
+ -967996800000,
+ -955299600000,
+ -936547200000,
+ -923245200000,
+ -905097600000,
+ -891795600000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -747244800000,
+ -733942800000,
+ -715795200000,
+ -702493200000,
+ -684345600000,
+ -671043600000,
+ -652896000000,
+ -639594000000,
+ -620841600000,
+ -608144400000,
+ -589392000000,
+ -576090000000,
+ -557942400000,
+ -544640400000,
+ -526492800000,
+ -513190800000,
+ -495043200000,
+ -481741200000,
+ -463593600000,
+ -447267600000,
+ -431539200000,
+ -415818000000,
+ -400089600000,
+ -384368400000,
+ -368640000000,
+ -352918800000,
+ -337190400000,
+ -321469200000,
+ -305740800000,
+ -289414800000,
+ -273686400000,
+ -257965200000,
+ -242236800000,
+ -226515600000,
+ -210787200000,
+ -195066000000,
+ -179337600000,
+ -163616400000,
+ -147888000000,
+ -131562000000,
+ -116438400000,
+ -100112400000,
+ -84384000000,
+ -68662800000,
+ -52934400000,
+ -37213200000,
+ -21484800000,
+ -5763600000,
+ 9964800000,
+ 25686000000,
+ 41414400000,
+ 57740400000,
+ 73468800000,
+ 89190000000,
+ 104918400000,
+ 120639600000,
+ 126691200000,
+ 152089200000,
+ 162374400000,
+ 183538800000,
+ 199267200000,
+ 215593200000,
+ 230716800000,
+ 247042800000,
+ 262771200000,
+ 278492400000,
+ 294220800000,
+ 309942000000,
+ 325670400000,
+ 341391600000,
+ 357120000000,
+ 372841200000,
+ 388569600000,
+ 404895600000,
+ 420019200000,
+ 436345200000,
+ 452073600000,
+ 467794800000,
+ 483523200000,
+ 499244400000,
+ 514972800000,
+ 530694000000,
+ 544608000000,
+ 562143600000,
+ 576057600000,
+ 594198000000,
+ 607507200000,
+ 625647600000,
+ 638956800000,
+ 657097200000,
+ 671011200000,
+ 688546800000,
+ 702460800000,
+ 719996400000,
+ 733910400000,
+ 752050800000,
+ 765360000000,
+ 783500400000,
+ 796809600000,
+ 814950000000,
+ 828864000000,
+ 846399600000,
+ 860313600000,
+ 877849200000,
+ 891763200000,
+ 909298800000,
+ 923212800000,
+ 941353200000,
+ 954662400000,
+ 972802800000,
+ 986112000000,
+ 1004252400000,
+ 1018166400000,
+ 1035702000000,
+ 1049616000000,
+ 1067151600000,
+ 1081065600000,
+ 1099206000000,
+ 1112515200000,
+ 1130655600000,
+ 1143964800000,
+ 1162105200000,
+ 1173600000000,
+ 1194159600000,
+ 1205049600000,
+ 1225609200000,
+ 1236499200000,
+ 1257058800000,
+ 1268553600000,
+ 1289113200000,
+ 1300003200000,
+ 1320562800000,
+ 1331452800000,
+ 1352012400000,
+ 1362902400000,
+ 1383462000000,
+ 1394352000000,
+ 1414911600000,
+ 1425801600000,
+ 1446361200000,
+ 1457856000000,
+ 1478415600000,
+ 1489305600000,
+ 1509865200000,
+ 1520755200000,
+ 1541314800000,
+ 1552204800000,
+ 1572764400000,
+ 1583654400000,
+ 1604214000000,
+ 1615708800000,
+ 1636268400000,
+ 1647158400000,
+ 1667718000000,
+ 1678608000000,
+ 1699167600000,
+ 1710057600000,
+ 1730617200000,
+ 1741507200000,
+ 1762066800000,
+ 1772956800000,
+ 1793516400000,
+ 1805011200000,
+ 1825570800000,
+ 1836460800000,
+ 1857020400000,
+ 1867910400000,
+ 1888470000000,
+ 1899360000000,
+ 1919919600000,
+ 1930809600000,
+ 1951369200000,
+ 1962864000000,
+ 1983423600000,
+ 1994313600000,
+ 2014873200000,
+ 2025763200000,
+ 2046322800000,
+ 2057212800000,
+ 2077772400000,
+ 2088662400000,
+ 2109222000000,
+ 2120112000000,
+ 2140671600000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 9156000
+ },
+ {
+ "name": "America/Chihuahua",
+ "abbrs": [
+ "LMT",
+ "MST",
+ "CST",
+ "MST",
+ "CST",
+ "MST",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST"
+ ],
+ "untils": [
+ -1514739600000,
+ -1343066400000,
+ -1234807200000,
+ -1220292000000,
+ -1207159200000,
+ -1191344400000,
+ 828864000000,
+ 846399600000,
+ 860313600000,
+ 877849200000,
+ 891766800000,
+ 909302400000,
+ 923216400000,
+ 941356800000,
+ 954666000000,
+ 972806400000,
+ 989139600000,
+ 1001836800000,
+ 1018170000000,
+ 1035705600000,
+ 1049619600000,
+ 1067155200000,
+ 1081069200000,
+ 1099209600000,
+ 1112518800000,
+ 1130659200000,
+ 1143968400000,
+ 1162108800000,
+ 1175418000000,
+ 1193558400000,
+ 1207472400000,
+ 1225008000000,
+ 1238922000000,
+ 1256457600000,
+ 1270371600000,
+ 1288512000000,
+ 1301821200000,
+ 1319961600000,
+ 1333270800000,
+ 1351411200000,
+ 1365325200000,
+ 1382860800000,
+ 1396774800000,
+ 1414310400000,
+ 1428224400000,
+ 1445760000000,
+ 1459674000000,
+ 1477814400000,
+ 1491123600000,
+ 1509264000000,
+ 1522573200000,
+ 1540713600000,
+ 1554627600000,
+ 1572163200000,
+ 1586077200000,
+ 1603612800000,
+ 1617526800000,
+ 1635667200000,
+ 1648976400000,
+ 1667116800000,
+ 1680426000000,
+ 1698566400000,
+ 1712480400000,
+ 1730016000000,
+ 1743930000000,
+ 1761465600000,
+ 1775379600000,
+ 1792915200000,
+ 1806829200000,
+ 1824969600000,
+ 1838278800000,
+ 1856419200000,
+ 1869728400000,
+ 1887868800000,
+ 1901782800000,
+ 1919318400000,
+ 1933232400000,
+ 1950768000000,
+ 1964682000000,
+ 1982822400000,
+ 1996131600000,
+ 2014272000000,
+ 2027581200000,
+ 2045721600000,
+ 2059030800000,
+ 2077171200000,
+ 2091085200000,
+ 2108620800000,
+ 2122534800000,
+ 2140070400000,
+ null
+ ],
+ "offsets": [
+ 424.3333,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420
+ ],
+ "population": 809232
+ },
+ {
+ "name": "America/Coral_Harbour",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CWT",
+ "CPT",
+ "EST"
+ ],
+ "untils": [
+ -1632067200000,
+ -1615136400000,
+ -923248800000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 300,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Cordoba",
+ "abbrs": [
+ "CMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-04",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1567453392000,
+ -1233432000000,
+ -1222981200000,
+ -1205956800000,
+ -1194037200000,
+ -1172865600000,
+ -1162501200000,
+ -1141329600000,
+ -1130965200000,
+ -1109793600000,
+ -1099429200000,
+ -1078257600000,
+ -1067806800000,
+ -1046635200000,
+ -1036270800000,
+ -1015099200000,
+ -1004734800000,
+ -983563200000,
+ -973198800000,
+ -952027200000,
+ -941576400000,
+ -931032000000,
+ -900882000000,
+ -890337600000,
+ -833749200000,
+ -827265600000,
+ -752274000000,
+ -733780800000,
+ -197326800000,
+ -190843200000,
+ -184194000000,
+ -164491200000,
+ -152658000000,
+ -132955200000,
+ -121122000000,
+ -101419200000,
+ -86821200000,
+ -71092800000,
+ -54766800000,
+ -39038400000,
+ -23317200000,
+ -7588800000,
+ 128142000000,
+ 136605600000,
+ 596948400000,
+ 605066400000,
+ 624423600000,
+ 636516000000,
+ 656478000000,
+ 667965600000,
+ 687931200000,
+ 699415200000,
+ 719377200000,
+ 731469600000,
+ 1198983600000,
+ 1205632800000,
+ 1224385200000,
+ 1237082400000,
+ null
+ ],
+ "offsets": [
+ 256.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 240,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Costa_Rica",
+ "abbrs": [
+ "SJMT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1545071027000,
+ 288770400000,
+ 297234000000,
+ 320220000000,
+ 328683600000,
+ 664264800000,
+ 678344400000,
+ 695714400000,
+ 700635600000,
+ null
+ ],
+ "offsets": [
+ 336.2167,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 1170000
+ },
+ {
+ "name": "America/Creston",
+ "abbrs": [
+ "MST",
+ "PST",
+ "MST"
+ ],
+ "untils": [
+ -1680454800000,
+ -1627833600000,
+ null
+ ],
+ "offsets": [
+ 420,
+ 480,
+ 420
+ ],
+ "population": 5306
+ },
+ {
+ "name": "America/Cuiaba",
+ "abbrs": [
+ "LMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03"
+ ],
+ "untils": [
+ -1767212140000,
+ -1206954000000,
+ -1191358800000,
+ -1175371200000,
+ -1159822800000,
+ -633816000000,
+ -622065600000,
+ -602280000000,
+ -591829200000,
+ -570744000000,
+ -560206800000,
+ -539121600000,
+ -531349200000,
+ -191361600000,
+ -184194000000,
+ -155160000000,
+ -150066000000,
+ -128894400000,
+ -121122000000,
+ -99950400000,
+ -89586000000,
+ -68414400000,
+ -57963600000,
+ 499752000000,
+ 511239600000,
+ 530596800000,
+ 540270000000,
+ 562132800000,
+ 571201200000,
+ 592977600000,
+ 602046000000,
+ 624427200000,
+ 634705200000,
+ 656481600000,
+ 666759600000,
+ 687931200000,
+ 697604400000,
+ 719985600000,
+ 728449200000,
+ 750830400000,
+ 761713200000,
+ 782280000000,
+ 793162800000,
+ 813729600000,
+ 824007600000,
+ 844574400000,
+ 856062000000,
+ 876110400000,
+ 888721200000,
+ 908078400000,
+ 919566000000,
+ 938923200000,
+ 951620400000,
+ 970977600000,
+ 982465200000,
+ 1003032000000,
+ 1013914800000,
+ 1036296000000,
+ 1045364400000,
+ 1099368000000,
+ 1108868400000,
+ 1129435200000,
+ 1140318000000,
+ 1162699200000,
+ 1172372400000,
+ 1192334400000,
+ 1203217200000,
+ 1224388800000,
+ 1234666800000,
+ 1255838400000,
+ 1266721200000,
+ 1287288000000,
+ 1298170800000,
+ 1318737600000,
+ 1330225200000,
+ 1350792000000,
+ 1361070000000,
+ 1382241600000,
+ 1392519600000,
+ 1413691200000,
+ 1424574000000,
+ 1445140800000,
+ 1456023600000,
+ 1476590400000,
+ 1487473200000,
+ 1508040000000,
+ 1518922800000,
+ 1541304000000,
+ 1550372400000,
+ 1572753600000,
+ 1581822000000,
+ 1604203200000,
+ 1613876400000,
+ 1636257600000,
+ 1645326000000,
+ 1667707200000,
+ 1677380400000,
+ 1699156800000,
+ 1708225200000,
+ 1730606400000,
+ 1739674800000,
+ 1762056000000,
+ 1771729200000,
+ 1793505600000,
+ 1803178800000,
+ 1825560000000,
+ 1834628400000,
+ 1857009600000,
+ 1866078000000,
+ 1888459200000,
+ 1897527600000,
+ 1919908800000,
+ 1928977200000,
+ 1951358400000,
+ 1960426800000,
+ 1983412800000,
+ 1992481200000,
+ 2014862400000,
+ 2024535600000,
+ 2046312000000,
+ 2055380400000,
+ 2077761600000,
+ 2086830000000,
+ 2109211200000,
+ 2118884400000,
+ 2140660800000,
+ null
+ ],
+ "offsets": [
+ 224.3333,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180
+ ],
+ "population": 542861
+ },
+ {
+ "name": "America/Curacao",
+ "abbrs": [
+ "LMT",
+ "-0430",
+ "AST"
+ ],
+ "untils": [
+ -1826738653000,
+ -157750200000,
+ null
+ ],
+ "offsets": [
+ 275.7833,
+ 270,
+ 240
+ ],
+ "population": 153500
+ },
+ {
+ "name": "America/Danmarkshavn",
+ "abbrs": [
+ "LMT",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "GMT"
+ ],
+ "untils": [
+ -1686091520000,
+ 323845200000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 820465200000,
+ null
+ ],
+ "offsets": [
+ 74.6667,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 0
+ ],
+ "population": 8
+ },
+ {
+ "name": "America/Dawson_Creek",
+ "abbrs": [
+ "PST",
+ "PDT",
+ "PST",
+ "PWT",
+ "PPT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "MST"
+ ],
+ "untils": [
+ -1632060000000,
+ -1615129200000,
+ -880207200000,
+ -769395600000,
+ -765385200000,
+ -715788000000,
+ -702486000000,
+ -684338400000,
+ -671036400000,
+ -652888800000,
+ -639586800000,
+ -620834400000,
+ -608137200000,
+ -589384800000,
+ -576082800000,
+ -557935200000,
+ -544633200000,
+ -526485600000,
+ -513183600000,
+ -495036000000,
+ -481734000000,
+ -463586400000,
+ -450284400000,
+ -431532000000,
+ -418230000000,
+ -400082400000,
+ -386780400000,
+ -368632800000,
+ -355330800000,
+ -337183200000,
+ -323881200000,
+ -305733600000,
+ -292431600000,
+ -273679200000,
+ -260982000000,
+ -242229600000,
+ -226508400000,
+ -210780000000,
+ -195058800000,
+ -179330400000,
+ -163609200000,
+ -147880800000,
+ -131554800000,
+ -116431200000,
+ -100105200000,
+ -84376800000,
+ -68655600000,
+ -52927200000,
+ -37206000000,
+ -21477600000,
+ -5756400000,
+ 9972000000,
+ 25693200000,
+ 41421600000,
+ 57747600000,
+ 73476000000,
+ 84013200000,
+ null
+ ],
+ "offsets": [
+ 480,
+ 420,
+ 480,
+ 420,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 420
+ ],
+ "population": 11583
+ },
+ {
+ "name": "America/Dawson",
+ "abbrs": [
+ "YST",
+ "YDT",
+ "YST",
+ "YDT",
+ "YST",
+ "YWT",
+ "YPT",
+ "YST",
+ "YDDT",
+ "YST",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST"
+ ],
+ "untils": [
+ -1632056400000,
+ -1615125600000,
+ -1596978000000,
+ -1583164800000,
+ -880203600000,
+ -769395600000,
+ -765381600000,
+ -147884400000,
+ -131554800000,
+ 120646800000,
+ 325677600000,
+ 341398800000,
+ 357127200000,
+ 372848400000,
+ 388576800000,
+ 404902800000,
+ 420026400000,
+ 436352400000,
+ 452080800000,
+ 467802000000,
+ 483530400000,
+ 499251600000,
+ 514980000000,
+ 530701200000,
+ 544615200000,
+ 562150800000,
+ 576064800000,
+ 594205200000,
+ 607514400000,
+ 625654800000,
+ 638964000000,
+ 657104400000,
+ 671018400000,
+ 688554000000,
+ 702468000000,
+ 720003600000,
+ 733917600000,
+ 752058000000,
+ 765367200000,
+ 783507600000,
+ 796816800000,
+ 814957200000,
+ 828871200000,
+ 846406800000,
+ 860320800000,
+ 877856400000,
+ 891770400000,
+ 909306000000,
+ 923220000000,
+ 941360400000,
+ 954669600000,
+ 972810000000,
+ 986119200000,
+ 1004259600000,
+ 1018173600000,
+ 1035709200000,
+ 1049623200000,
+ 1067158800000,
+ 1081072800000,
+ 1099213200000,
+ 1112522400000,
+ 1130662800000,
+ 1143972000000,
+ 1162112400000,
+ 1173607200000,
+ 1194166800000,
+ 1205056800000,
+ 1225616400000,
+ 1236506400000,
+ 1257066000000,
+ 1268560800000,
+ 1289120400000,
+ 1300010400000,
+ 1320570000000,
+ 1331460000000,
+ 1352019600000,
+ 1362909600000,
+ 1383469200000,
+ 1394359200000,
+ 1414918800000,
+ 1425808800000,
+ 1446368400000,
+ 1457863200000,
+ 1478422800000,
+ 1489312800000,
+ 1509872400000,
+ 1520762400000,
+ 1541322000000,
+ 1552212000000,
+ 1572771600000,
+ 1583661600000,
+ 1604221200000,
+ 1615716000000,
+ 1636275600000,
+ 1647165600000,
+ 1667725200000,
+ 1678615200000,
+ 1699174800000,
+ 1710064800000,
+ 1730624400000,
+ 1741514400000,
+ 1762074000000,
+ 1772964000000,
+ 1793523600000,
+ 1805018400000,
+ 1825578000000,
+ 1836468000000,
+ 1857027600000,
+ 1867917600000,
+ 1888477200000,
+ 1899367200000,
+ 1919926800000,
+ 1930816800000,
+ 1951376400000,
+ 1962871200000,
+ 1983430800000,
+ 1994320800000,
+ 2014880400000,
+ 2025770400000,
+ 2046330000000,
+ 2057220000000,
+ 2077779600000,
+ 2088669600000,
+ 2109229200000,
+ 2120119200000,
+ 2140678800000,
+ null
+ ],
+ "offsets": [
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 480,
+ 540,
+ 420,
+ 540,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480
+ ],
+ "population": 1319
+ },
+ {
+ "name": "America/Denver",
+ "abbrs": [
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MWT",
+ "MPT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST"
+ ],
+ "untils": [
+ -1633273200000,
+ -1615132800000,
+ -1601823600000,
+ -1583683200000,
+ -1570374000000,
+ -1551628800000,
+ -1538924400000,
+ -1534089600000,
+ -880210800000,
+ -769395600000,
+ -765388800000,
+ -147884400000,
+ -131558400000,
+ -116434800000,
+ -100108800000,
+ -84380400000,
+ -68659200000,
+ -52930800000,
+ -37209600000,
+ -21481200000,
+ -5760000000,
+ 9968400000,
+ 25689600000,
+ 41418000000,
+ 57744000000,
+ 73472400000,
+ 89193600000,
+ 104922000000,
+ 120643200000,
+ 126694800000,
+ 152092800000,
+ 162378000000,
+ 183542400000,
+ 199270800000,
+ 215596800000,
+ 230720400000,
+ 247046400000,
+ 262774800000,
+ 278496000000,
+ 294224400000,
+ 309945600000,
+ 325674000000,
+ 341395200000,
+ 357123600000,
+ 372844800000,
+ 388573200000,
+ 404899200000,
+ 420022800000,
+ 436348800000,
+ 452077200000,
+ 467798400000,
+ 483526800000,
+ 499248000000,
+ 514976400000,
+ 530697600000,
+ 544611600000,
+ 562147200000,
+ 576061200000,
+ 594201600000,
+ 607510800000,
+ 625651200000,
+ 638960400000,
+ 657100800000,
+ 671014800000,
+ 688550400000,
+ 702464400000,
+ 720000000000,
+ 733914000000,
+ 752054400000,
+ 765363600000,
+ 783504000000,
+ 796813200000,
+ 814953600000,
+ 828867600000,
+ 846403200000,
+ 860317200000,
+ 877852800000,
+ 891766800000,
+ 909302400000,
+ 923216400000,
+ 941356800000,
+ 954666000000,
+ 972806400000,
+ 986115600000,
+ 1004256000000,
+ 1018170000000,
+ 1035705600000,
+ 1049619600000,
+ 1067155200000,
+ 1081069200000,
+ 1099209600000,
+ 1112518800000,
+ 1130659200000,
+ 1143968400000,
+ 1162108800000,
+ 1173603600000,
+ 1194163200000,
+ 1205053200000,
+ 1225612800000,
+ 1236502800000,
+ 1257062400000,
+ 1268557200000,
+ 1289116800000,
+ 1300006800000,
+ 1320566400000,
+ 1331456400000,
+ 1352016000000,
+ 1362906000000,
+ 1383465600000,
+ 1394355600000,
+ 1414915200000,
+ 1425805200000,
+ 1446364800000,
+ 1457859600000,
+ 1478419200000,
+ 1489309200000,
+ 1509868800000,
+ 1520758800000,
+ 1541318400000,
+ 1552208400000,
+ 1572768000000,
+ 1583658000000,
+ 1604217600000,
+ 1615712400000,
+ 1636272000000,
+ 1647162000000,
+ 1667721600000,
+ 1678611600000,
+ 1699171200000,
+ 1710061200000,
+ 1730620800000,
+ 1741510800000,
+ 1762070400000,
+ 1772960400000,
+ 1793520000000,
+ 1805014800000,
+ 1825574400000,
+ 1836464400000,
+ 1857024000000,
+ 1867914000000,
+ 1888473600000,
+ 1899363600000,
+ 1919923200000,
+ 1930813200000,
+ 1951372800000,
+ 1962867600000,
+ 1983427200000,
+ 1994317200000,
+ 2014876800000,
+ 2025766800000,
+ 2046326400000,
+ 2057216400000,
+ 2077776000000,
+ 2088666000000,
+ 2109225600000,
+ 2120115600000,
+ 2140675200000,
+ null
+ ],
+ "offsets": [
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420
+ ],
+ "population": 2559000
+ },
+ {
+ "name": "America/Detroit",
+ "abbrs": [
+ "LMT",
+ "CST",
+ "EST",
+ "EWT",
+ "EPT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -2051202469000,
+ -1724083200000,
+ -880218000000,
+ -769395600000,
+ -765396000000,
+ -684349200000,
+ -671047200000,
+ 104914800000,
+ 120636000000,
+ 126687600000,
+ 152085600000,
+ 167814000000,
+ 183535200000,
+ 199263600000,
+ 215589600000,
+ 230713200000,
+ 247039200000,
+ 262767600000,
+ 278488800000,
+ 294217200000,
+ 309938400000,
+ 325666800000,
+ 341388000000,
+ 357116400000,
+ 372837600000,
+ 388566000000,
+ 404892000000,
+ 420015600000,
+ 436341600000,
+ 452070000000,
+ 467791200000,
+ 483519600000,
+ 499240800000,
+ 514969200000,
+ 530690400000,
+ 544604400000,
+ 562140000000,
+ 576054000000,
+ 594194400000,
+ 607503600000,
+ 625644000000,
+ 638953200000,
+ 657093600000,
+ 671007600000,
+ 688543200000,
+ 702457200000,
+ 719992800000,
+ 733906800000,
+ 752047200000,
+ 765356400000,
+ 783496800000,
+ 796806000000,
+ 814946400000,
+ 828860400000,
+ 846396000000,
+ 860310000000,
+ 877845600000,
+ 891759600000,
+ 909295200000,
+ 923209200000,
+ 941349600000,
+ 954658800000,
+ 972799200000,
+ 986108400000,
+ 1004248800000,
+ 1018162800000,
+ 1035698400000,
+ 1049612400000,
+ 1067148000000,
+ 1081062000000,
+ 1099202400000,
+ 1112511600000,
+ 1130652000000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 332.1833,
+ 360,
+ 300,
+ 240,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 3672000
+ },
+ {
+ "name": "America/Dominica",
+ "abbrs": [
+ "LMT",
+ "AST"
+ ],
+ "untils": [
+ -1825098836000,
+ null
+ ],
+ "offsets": [
+ 246.0667,
+ 240
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Edmonton",
+ "abbrs": [
+ "LMT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MWT",
+ "MPT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST"
+ ],
+ "untils": [
+ -1998663968000,
+ -1632063600000,
+ -1615132800000,
+ -1600614000000,
+ -1596816000000,
+ -1567954800000,
+ -1551628800000,
+ -1536505200000,
+ -1523203200000,
+ -1504450800000,
+ -1491753600000,
+ -1473001200000,
+ -1459699200000,
+ -880210800000,
+ -769395600000,
+ -765388800000,
+ -715791600000,
+ -702489600000,
+ -84380400000,
+ -68659200000,
+ -21481200000,
+ -5760000000,
+ 73472400000,
+ 89193600000,
+ 104922000000,
+ 120643200000,
+ 136371600000,
+ 152092800000,
+ 167821200000,
+ 183542400000,
+ 199270800000,
+ 215596800000,
+ 230720400000,
+ 247046400000,
+ 262774800000,
+ 278496000000,
+ 294224400000,
+ 309945600000,
+ 325674000000,
+ 341395200000,
+ 357123600000,
+ 372844800000,
+ 388573200000,
+ 404899200000,
+ 420022800000,
+ 436348800000,
+ 452077200000,
+ 467798400000,
+ 483526800000,
+ 499248000000,
+ 514976400000,
+ 530697600000,
+ 544611600000,
+ 562147200000,
+ 576061200000,
+ 594201600000,
+ 607510800000,
+ 625651200000,
+ 638960400000,
+ 657100800000,
+ 671014800000,
+ 688550400000,
+ 702464400000,
+ 720000000000,
+ 733914000000,
+ 752054400000,
+ 765363600000,
+ 783504000000,
+ 796813200000,
+ 814953600000,
+ 828867600000,
+ 846403200000,
+ 860317200000,
+ 877852800000,
+ 891766800000,
+ 909302400000,
+ 923216400000,
+ 941356800000,
+ 954666000000,
+ 972806400000,
+ 986115600000,
+ 1004256000000,
+ 1018170000000,
+ 1035705600000,
+ 1049619600000,
+ 1067155200000,
+ 1081069200000,
+ 1099209600000,
+ 1112518800000,
+ 1130659200000,
+ 1143968400000,
+ 1162108800000,
+ 1173603600000,
+ 1194163200000,
+ 1205053200000,
+ 1225612800000,
+ 1236502800000,
+ 1257062400000,
+ 1268557200000,
+ 1289116800000,
+ 1300006800000,
+ 1320566400000,
+ 1331456400000,
+ 1352016000000,
+ 1362906000000,
+ 1383465600000,
+ 1394355600000,
+ 1414915200000,
+ 1425805200000,
+ 1446364800000,
+ 1457859600000,
+ 1478419200000,
+ 1489309200000,
+ 1509868800000,
+ 1520758800000,
+ 1541318400000,
+ 1552208400000,
+ 1572768000000,
+ 1583658000000,
+ 1604217600000,
+ 1615712400000,
+ 1636272000000,
+ 1647162000000,
+ 1667721600000,
+ 1678611600000,
+ 1699171200000,
+ 1710061200000,
+ 1730620800000,
+ 1741510800000,
+ 1762070400000,
+ 1772960400000,
+ 1793520000000,
+ 1805014800000,
+ 1825574400000,
+ 1836464400000,
+ 1857024000000,
+ 1867914000000,
+ 1888473600000,
+ 1899363600000,
+ 1919923200000,
+ 1930813200000,
+ 1951372800000,
+ 1962867600000,
+ 1983427200000,
+ 1994317200000,
+ 2014876800000,
+ 2025766800000,
+ 2046326400000,
+ 2057216400000,
+ 2077776000000,
+ 2088666000000,
+ 2109225600000,
+ 2120115600000,
+ 2140675200000,
+ null
+ ],
+ "offsets": [
+ 453.8667,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420
+ ],
+ "population": 1040000
+ },
+ {
+ "name": "America/Eirunepe",
+ "abbrs": [
+ "LMT",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05"
+ ],
+ "untils": [
+ -1767208832000,
+ -1206950400000,
+ -1191355200000,
+ -1175367600000,
+ -1159819200000,
+ -633812400000,
+ -622062000000,
+ -602276400000,
+ -591825600000,
+ -570740400000,
+ -560203200000,
+ -539118000000,
+ -531345600000,
+ -191358000000,
+ -184190400000,
+ -155156400000,
+ -150062400000,
+ -128890800000,
+ -121118400000,
+ -99946800000,
+ -89582400000,
+ -68410800000,
+ -57960000000,
+ 499755600000,
+ 511243200000,
+ 530600400000,
+ 540273600000,
+ 562136400000,
+ 571204800000,
+ 750834000000,
+ 761716800000,
+ 1214283600000,
+ 1384056000000,
+ null
+ ],
+ "offsets": [
+ 279.4667,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 30901
+ },
+ {
+ "name": "America/El_Salvador",
+ "abbrs": [
+ "LMT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1546279392000,
+ 547020000000,
+ 559717200000,
+ 578469600000,
+ 591166800000,
+ null
+ ],
+ "offsets": [
+ 356.8,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 1100000
+ },
+ {
+ "name": "America/Ensenada",
+ "abbrs": [
+ "LMT",
+ "MST",
+ "PST",
+ "MST",
+ "PST",
+ "PDT",
+ "PST",
+ "PWT",
+ "PPT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST"
+ ],
+ "untils": [
+ -1514736000000,
+ -1451667600000,
+ -1343062800000,
+ -1234803600000,
+ -1222963200000,
+ -1207242000000,
+ -873820800000,
+ -769395600000,
+ -761677200000,
+ -686073600000,
+ -661539600000,
+ -495039600000,
+ -481734000000,
+ -463590000000,
+ -450284400000,
+ -431535600000,
+ -418230000000,
+ -400086000000,
+ -386780400000,
+ -368636400000,
+ -355330800000,
+ -337186800000,
+ -323881200000,
+ -305737200000,
+ -292431600000,
+ 199274400000,
+ 215600400000,
+ 230724000000,
+ 247050000000,
+ 262778400000,
+ 278499600000,
+ 294228000000,
+ 309949200000,
+ 325677600000,
+ 341398800000,
+ 357127200000,
+ 372848400000,
+ 388576800000,
+ 404902800000,
+ 420026400000,
+ 436352400000,
+ 452080800000,
+ 467802000000,
+ 483530400000,
+ 499251600000,
+ 514980000000,
+ 530701200000,
+ 544615200000,
+ 562150800000,
+ 576064800000,
+ 594205200000,
+ 607514400000,
+ 625654800000,
+ 638964000000,
+ 657104400000,
+ 671018400000,
+ 688554000000,
+ 702468000000,
+ 720003600000,
+ 733917600000,
+ 752058000000,
+ 765367200000,
+ 783507600000,
+ 796816800000,
+ 814957200000,
+ 828871200000,
+ 846406800000,
+ 860320800000,
+ 877856400000,
+ 891770400000,
+ 909306000000,
+ 923220000000,
+ 941360400000,
+ 954669600000,
+ 972810000000,
+ 986119200000,
+ 1004259600000,
+ 1018173600000,
+ 1035709200000,
+ 1049623200000,
+ 1067158800000,
+ 1081072800000,
+ 1099213200000,
+ 1112522400000,
+ 1130662800000,
+ 1143972000000,
+ 1162112400000,
+ 1175421600000,
+ 1193562000000,
+ 1207476000000,
+ 1225011600000,
+ 1238925600000,
+ 1256461200000,
+ 1268560800000,
+ 1289120400000,
+ 1300010400000,
+ 1320570000000,
+ 1331460000000,
+ 1352019600000,
+ 1362909600000,
+ 1383469200000,
+ 1394359200000,
+ 1414918800000,
+ 1425808800000,
+ 1446368400000,
+ 1457863200000,
+ 1478422800000,
+ 1489312800000,
+ 1509872400000,
+ 1520762400000,
+ 1541322000000,
+ 1552212000000,
+ 1572771600000,
+ 1583661600000,
+ 1604221200000,
+ 1615716000000,
+ 1636275600000,
+ 1647165600000,
+ 1667725200000,
+ 1678615200000,
+ 1699174800000,
+ 1710064800000,
+ 1730624400000,
+ 1741514400000,
+ 1762074000000,
+ 1772964000000,
+ 1793523600000,
+ 1805018400000,
+ 1825578000000,
+ 1836468000000,
+ 1857027600000,
+ 1867917600000,
+ 1888477200000,
+ 1899367200000,
+ 1919926800000,
+ 1930816800000,
+ 1951376400000,
+ 1962871200000,
+ 1983430800000,
+ 1994320800000,
+ 2014880400000,
+ 2025770400000,
+ 2046330000000,
+ 2057220000000,
+ 2077779600000,
+ 2088669600000,
+ 2109229200000,
+ 2120119200000,
+ 2140678800000,
+ null
+ ],
+ "offsets": [
+ 468.0667,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Fort_Nelson",
+ "abbrs": [
+ "PST",
+ "PDT",
+ "PST",
+ "PWT",
+ "PPT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "MST"
+ ],
+ "untils": [
+ -1632060000000,
+ -1615129200000,
+ -880207200000,
+ -769395600000,
+ -765385200000,
+ -715788000000,
+ -702486000000,
+ -684338400000,
+ -671036400000,
+ -652888800000,
+ -639586800000,
+ -620834400000,
+ -608137200000,
+ -589384800000,
+ -576082800000,
+ -557935200000,
+ -544633200000,
+ -526485600000,
+ -513183600000,
+ -495036000000,
+ -481734000000,
+ -463586400000,
+ -450284400000,
+ -431532000000,
+ -418230000000,
+ -400082400000,
+ -386780400000,
+ -368632800000,
+ -355330800000,
+ -337183200000,
+ -323881200000,
+ -305733600000,
+ -292431600000,
+ -273679200000,
+ -260982000000,
+ -242229600000,
+ -226508400000,
+ -210780000000,
+ -195058800000,
+ -179330400000,
+ -163609200000,
+ -147880800000,
+ -131554800000,
+ -116431200000,
+ -100105200000,
+ -84376800000,
+ -68655600000,
+ -52927200000,
+ -37206000000,
+ -21477600000,
+ -5756400000,
+ 9972000000,
+ 25693200000,
+ 41421600000,
+ 57747600000,
+ 73476000000,
+ 89197200000,
+ 104925600000,
+ 120646800000,
+ 136375200000,
+ 152096400000,
+ 167824800000,
+ 183546000000,
+ 199274400000,
+ 215600400000,
+ 230724000000,
+ 247050000000,
+ 262778400000,
+ 278499600000,
+ 294228000000,
+ 309949200000,
+ 325677600000,
+ 341398800000,
+ 357127200000,
+ 372848400000,
+ 388576800000,
+ 404902800000,
+ 420026400000,
+ 436352400000,
+ 452080800000,
+ 467802000000,
+ 483530400000,
+ 499251600000,
+ 514980000000,
+ 530701200000,
+ 544615200000,
+ 562150800000,
+ 576064800000,
+ 594205200000,
+ 607514400000,
+ 625654800000,
+ 638964000000,
+ 657104400000,
+ 671018400000,
+ 688554000000,
+ 702468000000,
+ 720003600000,
+ 733917600000,
+ 752058000000,
+ 765367200000,
+ 783507600000,
+ 796816800000,
+ 814957200000,
+ 828871200000,
+ 846406800000,
+ 860320800000,
+ 877856400000,
+ 891770400000,
+ 909306000000,
+ 923220000000,
+ 941360400000,
+ 954669600000,
+ 972810000000,
+ 986119200000,
+ 1004259600000,
+ 1018173600000,
+ 1035709200000,
+ 1049623200000,
+ 1067158800000,
+ 1081072800000,
+ 1099213200000,
+ 1112522400000,
+ 1130662800000,
+ 1143972000000,
+ 1162112400000,
+ 1173607200000,
+ 1194166800000,
+ 1205056800000,
+ 1225616400000,
+ 1236506400000,
+ 1257066000000,
+ 1268560800000,
+ 1289120400000,
+ 1300010400000,
+ 1320570000000,
+ 1331460000000,
+ 1352019600000,
+ 1362909600000,
+ 1383469200000,
+ 1394359200000,
+ 1414918800000,
+ 1425808800000,
+ null
+ ],
+ "offsets": [
+ 480,
+ 420,
+ 480,
+ 420,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420
+ ],
+ "population": 3902
+ },
+ {
+ "name": "America/Fort_Wayne",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "EST",
+ "CST",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1633276800000,
+ -1615136400000,
+ -1601827200000,
+ -1583686800000,
+ -900259200000,
+ -891795600000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -747244800000,
+ -733942800000,
+ -715795200000,
+ -702493200000,
+ -684345600000,
+ -671043600000,
+ -652896000000,
+ -639594000000,
+ -620841600000,
+ -608144400000,
+ -589392000000,
+ -576090000000,
+ -557942400000,
+ -544640400000,
+ -526492800000,
+ -513190800000,
+ -495043200000,
+ -481741200000,
+ -463593600000,
+ -386787600000,
+ -368640000000,
+ -21488400000,
+ -5767200000,
+ 9961200000,
+ 25682400000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Fortaleza",
+ "abbrs": [
+ "LMT",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1767216360000,
+ -1206957600000,
+ -1191362400000,
+ -1175374800000,
+ -1159826400000,
+ -633819600000,
+ -622069200000,
+ -602283600000,
+ -591832800000,
+ -570747600000,
+ -560210400000,
+ -539125200000,
+ -531352800000,
+ -191365200000,
+ -184197600000,
+ -155163600000,
+ -150069600000,
+ -128898000000,
+ -121125600000,
+ -99954000000,
+ -89589600000,
+ -68418000000,
+ -57967200000,
+ 499748400000,
+ 511236000000,
+ 530593200000,
+ 540266400000,
+ 562129200000,
+ 571197600000,
+ 592974000000,
+ 602042400000,
+ 624423600000,
+ 634701600000,
+ 938919600000,
+ 951616800000,
+ 970974000000,
+ 972180000000,
+ 1003028400000,
+ 1013911200000,
+ null
+ ],
+ "offsets": [
+ 154,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 3401000
+ },
+ {
+ "name": "America/Glace_Bay",
+ "abbrs": [
+ "LMT",
+ "AST",
+ "ADT",
+ "AST",
+ "AWT",
+ "APT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST"
+ ],
+ "untils": [
+ -2131646412000,
+ -1632074400000,
+ -1615143600000,
+ -880221600000,
+ -769395600000,
+ -765399600000,
+ -526500000000,
+ -513198000000,
+ 73461600000,
+ 89182800000,
+ 104911200000,
+ 120632400000,
+ 136360800000,
+ 152082000000,
+ 167810400000,
+ 183531600000,
+ 199260000000,
+ 215586000000,
+ 230709600000,
+ 247035600000,
+ 262764000000,
+ 278485200000,
+ 294213600000,
+ 309934800000,
+ 325663200000,
+ 341384400000,
+ 357112800000,
+ 372834000000,
+ 388562400000,
+ 404888400000,
+ 420012000000,
+ 436338000000,
+ 452066400000,
+ 467787600000,
+ 483516000000,
+ 499237200000,
+ 514965600000,
+ 530686800000,
+ 544600800000,
+ 562136400000,
+ 576050400000,
+ 594190800000,
+ 607500000000,
+ 625640400000,
+ 638949600000,
+ 657090000000,
+ 671004000000,
+ 688539600000,
+ 702453600000,
+ 719989200000,
+ 733903200000,
+ 752043600000,
+ 765352800000,
+ 783493200000,
+ 796802400000,
+ 814942800000,
+ 828856800000,
+ 846392400000,
+ 860306400000,
+ 877842000000,
+ 891756000000,
+ 909291600000,
+ 923205600000,
+ 941346000000,
+ 954655200000,
+ 972795600000,
+ 986104800000,
+ 1004245200000,
+ 1018159200000,
+ 1035694800000,
+ 1049608800000,
+ 1067144400000,
+ 1081058400000,
+ 1099198800000,
+ 1112508000000,
+ 1130648400000,
+ 1143957600000,
+ 1162098000000,
+ 1173592800000,
+ 1194152400000,
+ 1205042400000,
+ 1225602000000,
+ 1236492000000,
+ 1257051600000,
+ 1268546400000,
+ 1289106000000,
+ 1299996000000,
+ 1320555600000,
+ 1331445600000,
+ 1352005200000,
+ 1362895200000,
+ 1383454800000,
+ 1394344800000,
+ 1414904400000,
+ 1425794400000,
+ 1446354000000,
+ 1457848800000,
+ 1478408400000,
+ 1489298400000,
+ 1509858000000,
+ 1520748000000,
+ 1541307600000,
+ 1552197600000,
+ 1572757200000,
+ 1583647200000,
+ 1604206800000,
+ 1615701600000,
+ 1636261200000,
+ 1647151200000,
+ 1667710800000,
+ 1678600800000,
+ 1699160400000,
+ 1710050400000,
+ 1730610000000,
+ 1741500000000,
+ 1762059600000,
+ 1772949600000,
+ 1793509200000,
+ 1805004000000,
+ 1825563600000,
+ 1836453600000,
+ 1857013200000,
+ 1867903200000,
+ 1888462800000,
+ 1899352800000,
+ 1919912400000,
+ 1930802400000,
+ 1951362000000,
+ 1962856800000,
+ 1983416400000,
+ 1994306400000,
+ 2014866000000,
+ 2025756000000,
+ 2046315600000,
+ 2057205600000,
+ 2077765200000,
+ 2088655200000,
+ 2109214800000,
+ 2120104800000,
+ 2140664400000,
+ null
+ ],
+ "offsets": [
+ 239.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240
+ ],
+ "population": 19076
+ },
+ {
+ "name": "America/Godthab",
+ "abbrs": [
+ "LMT",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1686083584000,
+ 323845200000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 206.9333,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 16583
+ },
+ {
+ "name": "America/Goose_Bay",
+ "abbrs": [
+ "NST",
+ "NDT",
+ "NST",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NWT",
+ "NPT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADDT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST"
+ ],
+ "untils": [
+ -1632076148000,
+ -1615145348000,
+ -1096921748000,
+ -1061670600000,
+ -1048973400000,
+ -1030221000000,
+ -1017523800000,
+ -998771400000,
+ -986074200000,
+ -966717000000,
+ -954624600000,
+ -935267400000,
+ -922570200000,
+ -903817800000,
+ -891120600000,
+ -872368200000,
+ -769395600000,
+ -765401400000,
+ -746044200000,
+ -733347000000,
+ -714594600000,
+ -701897400000,
+ -683145000000,
+ -670447800000,
+ -651695400000,
+ -638998200000,
+ -619641000000,
+ -606943800000,
+ -589401000000,
+ -576099000000,
+ -557951400000,
+ -544649400000,
+ -526501800000,
+ -513199800000,
+ -495052200000,
+ -481750200000,
+ -463602600000,
+ -450300600000,
+ -431548200000,
+ -418246200000,
+ -400098600000,
+ -386796600000,
+ -368649000000,
+ -355347000000,
+ -337199400000,
+ -323897400000,
+ -305749800000,
+ -289423800000,
+ -273695400000,
+ -257974200000,
+ -242245800000,
+ -226524600000,
+ -210796200000,
+ -195075000000,
+ -179346600000,
+ -163625400000,
+ -147897000000,
+ -131571000000,
+ -119903400000,
+ -116445600000,
+ -100119600000,
+ -84391200000,
+ -68670000000,
+ -52941600000,
+ -37220400000,
+ -21492000000,
+ -5770800000,
+ 9957600000,
+ 25678800000,
+ 41407200000,
+ 57733200000,
+ 73461600000,
+ 89182800000,
+ 104911200000,
+ 120632400000,
+ 136360800000,
+ 152082000000,
+ 167810400000,
+ 183531600000,
+ 199260000000,
+ 215586000000,
+ 230709600000,
+ 247035600000,
+ 262764000000,
+ 278485200000,
+ 294213600000,
+ 309934800000,
+ 325663200000,
+ 341384400000,
+ 357112800000,
+ 372834000000,
+ 388562400000,
+ 404888400000,
+ 420012000000,
+ 436338000000,
+ 452066400000,
+ 467787600000,
+ 483516000000,
+ 499237200000,
+ 514965600000,
+ 530686800000,
+ 544593660000,
+ 562129260000,
+ 576043260000,
+ 594180060000,
+ 607492860000,
+ 625633260000,
+ 638942460000,
+ 657082860000,
+ 670996860000,
+ 688532460000,
+ 702446460000,
+ 719982060000,
+ 733896060000,
+ 752036460000,
+ 765345660000,
+ 783486060000,
+ 796795260000,
+ 814935660000,
+ 828849660000,
+ 846385260000,
+ 860299260000,
+ 877834860000,
+ 891748860000,
+ 909284460000,
+ 923198460000,
+ 941338860000,
+ 954648060000,
+ 972788460000,
+ 986097660000,
+ 1004238060000,
+ 1018152060000,
+ 1035687660000,
+ 1049601660000,
+ 1067137260000,
+ 1081051260000,
+ 1099191660000,
+ 1112500860000,
+ 1130641260000,
+ 1143950460000,
+ 1162090860000,
+ 1173585660000,
+ 1194145260000,
+ 1205035260000,
+ 1225594860000,
+ 1236484860000,
+ 1257044460000,
+ 1268539260000,
+ 1289098860000,
+ 1299988860000,
+ 1320555600000,
+ 1331445600000,
+ 1352005200000,
+ 1362895200000,
+ 1383454800000,
+ 1394344800000,
+ 1414904400000,
+ 1425794400000,
+ 1446354000000,
+ 1457848800000,
+ 1478408400000,
+ 1489298400000,
+ 1509858000000,
+ 1520748000000,
+ 1541307600000,
+ 1552197600000,
+ 1572757200000,
+ 1583647200000,
+ 1604206800000,
+ 1615701600000,
+ 1636261200000,
+ 1647151200000,
+ 1667710800000,
+ 1678600800000,
+ 1699160400000,
+ 1710050400000,
+ 1730610000000,
+ 1741500000000,
+ 1762059600000,
+ 1772949600000,
+ 1793509200000,
+ 1805004000000,
+ 1825563600000,
+ 1836453600000,
+ 1857013200000,
+ 1867903200000,
+ 1888462800000,
+ 1899352800000,
+ 1919912400000,
+ 1930802400000,
+ 1951362000000,
+ 1962856800000,
+ 1983416400000,
+ 1994306400000,
+ 2014866000000,
+ 2025756000000,
+ 2046315600000,
+ 2057205600000,
+ 2077765200000,
+ 2088655200000,
+ 2109214800000,
+ 2120104800000,
+ 2140664400000,
+ null
+ ],
+ "offsets": [
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 120,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240
+ ],
+ "population": 7552
+ },
+ {
+ "name": "America/Grand_Turk",
+ "abbrs": [
+ "KMT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "AST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1827687170000,
+ 294217200000,
+ 309938400000,
+ 325666800000,
+ 341388000000,
+ 357116400000,
+ 372837600000,
+ 388566000000,
+ 404892000000,
+ 420015600000,
+ 436341600000,
+ 452070000000,
+ 467791200000,
+ 483519600000,
+ 499240800000,
+ 514969200000,
+ 530690400000,
+ 544604400000,
+ 562140000000,
+ 576054000000,
+ 594194400000,
+ 607503600000,
+ 625644000000,
+ 638953200000,
+ 657093600000,
+ 671007600000,
+ 688543200000,
+ 702457200000,
+ 719992800000,
+ 733906800000,
+ 752047200000,
+ 765356400000,
+ 783496800000,
+ 796806000000,
+ 814946400000,
+ 828860400000,
+ 846396000000,
+ 860310000000,
+ 877845600000,
+ 891759600000,
+ 909295200000,
+ 923209200000,
+ 941349600000,
+ 954658800000,
+ 972799200000,
+ 986108400000,
+ 1004248800000,
+ 1018162800000,
+ 1035698400000,
+ 1049612400000,
+ 1067148000000,
+ 1081062000000,
+ 1099202400000,
+ 1112511600000,
+ 1130652000000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 307.1667,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 240,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 3720
+ },
+ {
+ "name": "America/Grenada",
+ "abbrs": [
+ "LMT",
+ "AST"
+ ],
+ "untils": [
+ -1825098836000,
+ null
+ ],
+ "offsets": [
+ 246.0667,
+ 240
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Guadeloupe",
+ "abbrs": [
+ "LMT",
+ "AST"
+ ],
+ "untils": [
+ -1825098836000,
+ null
+ ],
+ "offsets": [
+ 246.0667,
+ 240
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Guatemala",
+ "abbrs": [
+ "LMT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1617040676000,
+ 123055200000,
+ 130914000000,
+ 422344800000,
+ 433054800000,
+ 669708000000,
+ 684219600000,
+ 1146376800000,
+ 1159678800000,
+ null
+ ],
+ "offsets": [
+ 362.0667,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 1289000
+ },
+ {
+ "name": "America/Guayaquil",
+ "abbrs": [
+ "QMT",
+ "-05",
+ "-04",
+ "-05"
+ ],
+ "untils": [
+ -1230749160000,
+ 722926800000,
+ 728884800000,
+ null
+ ],
+ "offsets": [
+ 314,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 2700000
+ },
+ {
+ "name": "America/Guyana",
+ "abbrs": [
+ "LMT",
+ "-0345",
+ "-03",
+ "-04"
+ ],
+ "untils": [
+ -1730578040000,
+ 176010300000,
+ 662698800000,
+ null
+ ],
+ "offsets": [
+ 232.6667,
+ 225,
+ 180,
+ 240
+ ],
+ "population": 799613
+ },
+ {
+ "name": "America/Halifax",
+ "abbrs": [
+ "LMT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "AWT",
+ "APT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST"
+ ],
+ "untils": [
+ -2131645536000,
+ -1696276800000,
+ -1680469200000,
+ -1632074400000,
+ -1615143600000,
+ -1566763200000,
+ -1557090000000,
+ -1535486400000,
+ -1524949200000,
+ -1504468800000,
+ -1493413200000,
+ -1472414400000,
+ -1461963600000,
+ -1440964800000,
+ -1429390800000,
+ -1409515200000,
+ -1396731600000,
+ -1376856000000,
+ -1366491600000,
+ -1346616000000,
+ -1333832400000,
+ -1313956800000,
+ -1303678800000,
+ -1282507200000,
+ -1272661200000,
+ -1251057600000,
+ -1240088400000,
+ -1219608000000,
+ -1207429200000,
+ -1188763200000,
+ -1175979600000,
+ -1157313600000,
+ -1143925200000,
+ -1124049600000,
+ -1113771600000,
+ -1091390400000,
+ -1081026000000,
+ -1059854400000,
+ -1050786000000,
+ -1030910400000,
+ -1018126800000,
+ -999460800000,
+ -986677200000,
+ -965592000000,
+ -955227600000,
+ -935956800000,
+ -923173200000,
+ -904507200000,
+ -891723600000,
+ -880221600000,
+ -769395600000,
+ -765399600000,
+ -747252000000,
+ -733950000000,
+ -715802400000,
+ -702500400000,
+ -684352800000,
+ -671050800000,
+ -652903200000,
+ -639601200000,
+ -589399200000,
+ -576097200000,
+ -557949600000,
+ -544647600000,
+ -526500000000,
+ -513198000000,
+ -495050400000,
+ -481748400000,
+ -431546400000,
+ -418244400000,
+ -400096800000,
+ -386794800000,
+ -368647200000,
+ -355345200000,
+ -337197600000,
+ -323895600000,
+ -242244000000,
+ -226522800000,
+ -210794400000,
+ -195073200000,
+ -179344800000,
+ -163623600000,
+ -147895200000,
+ -131569200000,
+ -116445600000,
+ -100119600000,
+ -84391200000,
+ -68670000000,
+ -52941600000,
+ -37220400000,
+ -21492000000,
+ -5770800000,
+ 9957600000,
+ 25678800000,
+ 41407200000,
+ 57733200000,
+ 73461600000,
+ 89182800000,
+ 104911200000,
+ 120632400000,
+ 136360800000,
+ 152082000000,
+ 167810400000,
+ 183531600000,
+ 199260000000,
+ 215586000000,
+ 230709600000,
+ 247035600000,
+ 262764000000,
+ 278485200000,
+ 294213600000,
+ 309934800000,
+ 325663200000,
+ 341384400000,
+ 357112800000,
+ 372834000000,
+ 388562400000,
+ 404888400000,
+ 420012000000,
+ 436338000000,
+ 452066400000,
+ 467787600000,
+ 483516000000,
+ 499237200000,
+ 514965600000,
+ 530686800000,
+ 544600800000,
+ 562136400000,
+ 576050400000,
+ 594190800000,
+ 607500000000,
+ 625640400000,
+ 638949600000,
+ 657090000000,
+ 671004000000,
+ 688539600000,
+ 702453600000,
+ 719989200000,
+ 733903200000,
+ 752043600000,
+ 765352800000,
+ 783493200000,
+ 796802400000,
+ 814942800000,
+ 828856800000,
+ 846392400000,
+ 860306400000,
+ 877842000000,
+ 891756000000,
+ 909291600000,
+ 923205600000,
+ 941346000000,
+ 954655200000,
+ 972795600000,
+ 986104800000,
+ 1004245200000,
+ 1018159200000,
+ 1035694800000,
+ 1049608800000,
+ 1067144400000,
+ 1081058400000,
+ 1099198800000,
+ 1112508000000,
+ 1130648400000,
+ 1143957600000,
+ 1162098000000,
+ 1173592800000,
+ 1194152400000,
+ 1205042400000,
+ 1225602000000,
+ 1236492000000,
+ 1257051600000,
+ 1268546400000,
+ 1289106000000,
+ 1299996000000,
+ 1320555600000,
+ 1331445600000,
+ 1352005200000,
+ 1362895200000,
+ 1383454800000,
+ 1394344800000,
+ 1414904400000,
+ 1425794400000,
+ 1446354000000,
+ 1457848800000,
+ 1478408400000,
+ 1489298400000,
+ 1509858000000,
+ 1520748000000,
+ 1541307600000,
+ 1552197600000,
+ 1572757200000,
+ 1583647200000,
+ 1604206800000,
+ 1615701600000,
+ 1636261200000,
+ 1647151200000,
+ 1667710800000,
+ 1678600800000,
+ 1699160400000,
+ 1710050400000,
+ 1730610000000,
+ 1741500000000,
+ 1762059600000,
+ 1772949600000,
+ 1793509200000,
+ 1805004000000,
+ 1825563600000,
+ 1836453600000,
+ 1857013200000,
+ 1867903200000,
+ 1888462800000,
+ 1899352800000,
+ 1919912400000,
+ 1930802400000,
+ 1951362000000,
+ 1962856800000,
+ 1983416400000,
+ 1994306400000,
+ 2014866000000,
+ 2025756000000,
+ 2046315600000,
+ 2057205600000,
+ 2077765200000,
+ 2088655200000,
+ 2109214800000,
+ 2120104800000,
+ 2140664400000,
+ null
+ ],
+ "offsets": [
+ 254.4,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240
+ ],
+ "population": 390095
+ },
+ {
+ "name": "America/Havana",
+ "abbrs": [
+ "HMT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1402813824000,
+ -1311534000000,
+ -1300996800000,
+ -933534000000,
+ -925675200000,
+ -902084400000,
+ -893620800000,
+ -870030000000,
+ -862171200000,
+ -775681200000,
+ -767822400000,
+ -744231600000,
+ -736372800000,
+ -144702000000,
+ -134251200000,
+ -113425200000,
+ -102542400000,
+ -86295600000,
+ -72907200000,
+ -54154800000,
+ -41457600000,
+ -21495600000,
+ -5774400000,
+ 9954000000,
+ 25675200000,
+ 41403600000,
+ 57729600000,
+ 73458000000,
+ 87364800000,
+ 104907600000,
+ 118900800000,
+ 136357200000,
+ 150436800000,
+ 167806800000,
+ 183528000000,
+ 199256400000,
+ 215582400000,
+ 230706000000,
+ 247032000000,
+ 263365200000,
+ 276667200000,
+ 290581200000,
+ 308721600000,
+ 322030800000,
+ 340171200000,
+ 358318800000,
+ 371620800000,
+ 389768400000,
+ 403070400000,
+ 421218000000,
+ 434520000000,
+ 452667600000,
+ 466574400000,
+ 484117200000,
+ 498024000000,
+ 511333200000,
+ 529473600000,
+ 542782800000,
+ 560923200000,
+ 574837200000,
+ 592372800000,
+ 606286800000,
+ 623822400000,
+ 638946000000,
+ 655876800000,
+ 671000400000,
+ 687330000000,
+ 702450000000,
+ 718779600000,
+ 733899600000,
+ 750229200000,
+ 765349200000,
+ 781678800000,
+ 796798800000,
+ 813128400000,
+ 828853200000,
+ 844578000000,
+ 860302800000,
+ 876632400000,
+ 891147600000,
+ 909291600000,
+ 922597200000,
+ 941346000000,
+ 954651600000,
+ 972795600000,
+ 986101200000,
+ 1004245200000,
+ 1018155600000,
+ 1035694800000,
+ 1049605200000,
+ 1067144400000,
+ 1080450000000,
+ 1162098000000,
+ 1173589200000,
+ 1193547600000,
+ 1205643600000,
+ 1224997200000,
+ 1236488400000,
+ 1256446800000,
+ 1268542800000,
+ 1288501200000,
+ 1300597200000,
+ 1321160400000,
+ 1333256400000,
+ 1352005200000,
+ 1362891600000,
+ 1383454800000,
+ 1394341200000,
+ 1414904400000,
+ 1425790800000,
+ 1446354000000,
+ 1457845200000,
+ 1478408400000,
+ 1489294800000,
+ 1509858000000,
+ 1520744400000,
+ 1541307600000,
+ 1552194000000,
+ 1572757200000,
+ 1583643600000,
+ 1604206800000,
+ 1615698000000,
+ 1636261200000,
+ 1647147600000,
+ 1667710800000,
+ 1678597200000,
+ 1699160400000,
+ 1710046800000,
+ 1730610000000,
+ 1741496400000,
+ 1762059600000,
+ 1772946000000,
+ 1793509200000,
+ 1805000400000,
+ 1825563600000,
+ 1836450000000,
+ 1857013200000,
+ 1867899600000,
+ 1888462800000,
+ 1899349200000,
+ 1919912400000,
+ 1930798800000,
+ 1951362000000,
+ 1962853200000,
+ 1983416400000,
+ 1994302800000,
+ 2014866000000,
+ 2025752400000,
+ 2046315600000,
+ 2057202000000,
+ 2077765200000,
+ 2088651600000,
+ 2109214800000,
+ 2120101200000,
+ 2140664400000,
+ null
+ ],
+ "offsets": [
+ 329.6,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 2130000
+ },
+ {
+ "name": "America/Hermosillo",
+ "abbrs": [
+ "LMT",
+ "MST",
+ "CST",
+ "MST",
+ "CST",
+ "MST",
+ "CST",
+ "MST",
+ "PST",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST"
+ ],
+ "untils": [
+ -1514739600000,
+ -1343066400000,
+ -1234807200000,
+ -1220292000000,
+ -1207159200000,
+ -1191344400000,
+ -873828000000,
+ -661539600000,
+ 28800000,
+ 828867600000,
+ 846403200000,
+ 860317200000,
+ 877852800000,
+ 891766800000,
+ 909302400000,
+ null
+ ],
+ "offsets": [
+ 443.8667,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 480,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420
+ ],
+ "population": 641791
+ },
+ {
+ "name": "America/Indiana/Indianapolis",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "EST",
+ "CST",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1633276800000,
+ -1615136400000,
+ -1601827200000,
+ -1583686800000,
+ -900259200000,
+ -891795600000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -747244800000,
+ -733942800000,
+ -715795200000,
+ -702493200000,
+ -684345600000,
+ -671043600000,
+ -652896000000,
+ -639594000000,
+ -620841600000,
+ -608144400000,
+ -589392000000,
+ -576090000000,
+ -557942400000,
+ -544640400000,
+ -526492800000,
+ -513190800000,
+ -495043200000,
+ -481741200000,
+ -463593600000,
+ -386787600000,
+ -368640000000,
+ -21488400000,
+ -5767200000,
+ 9961200000,
+ 25682400000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Indiana/Knox",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "EST",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "EST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1633276800000,
+ -1615136400000,
+ -1601827200000,
+ -1583686800000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -715795200000,
+ -702493200000,
+ -684345600000,
+ -671043600000,
+ -652896000000,
+ -639594000000,
+ -620841600000,
+ -608144400000,
+ -589392000000,
+ -576090000000,
+ -557942400000,
+ -544640400000,
+ -526492800000,
+ -513190800000,
+ -495043200000,
+ -481741200000,
+ -463593600000,
+ -447267600000,
+ -431539200000,
+ -415818000000,
+ -400089600000,
+ -386787600000,
+ -368640000000,
+ -355338000000,
+ -337190400000,
+ -321469200000,
+ -305740800000,
+ -289414800000,
+ -273686400000,
+ -257965200000,
+ -242236800000,
+ -195066000000,
+ -84384000000,
+ -68662800000,
+ -52934400000,
+ -37213200000,
+ -21484800000,
+ -5763600000,
+ 9964800000,
+ 25686000000,
+ 41414400000,
+ 57740400000,
+ 73468800000,
+ 89190000000,
+ 104918400000,
+ 120639600000,
+ 126691200000,
+ 152089200000,
+ 162374400000,
+ 183538800000,
+ 199267200000,
+ 215593200000,
+ 230716800000,
+ 247042800000,
+ 262771200000,
+ 278492400000,
+ 294220800000,
+ 309942000000,
+ 325670400000,
+ 341391600000,
+ 357120000000,
+ 372841200000,
+ 388569600000,
+ 404895600000,
+ 420019200000,
+ 436345200000,
+ 452073600000,
+ 467794800000,
+ 483523200000,
+ 499244400000,
+ 514972800000,
+ 530694000000,
+ 544608000000,
+ 562143600000,
+ 576057600000,
+ 594198000000,
+ 607507200000,
+ 625647600000,
+ 638956800000,
+ 657097200000,
+ 671011200000,
+ 688546800000,
+ 1143961200000,
+ 1162105200000,
+ 1173600000000,
+ 1194159600000,
+ 1205049600000,
+ 1225609200000,
+ 1236499200000,
+ 1257058800000,
+ 1268553600000,
+ 1289113200000,
+ 1300003200000,
+ 1320562800000,
+ 1331452800000,
+ 1352012400000,
+ 1362902400000,
+ 1383462000000,
+ 1394352000000,
+ 1414911600000,
+ 1425801600000,
+ 1446361200000,
+ 1457856000000,
+ 1478415600000,
+ 1489305600000,
+ 1509865200000,
+ 1520755200000,
+ 1541314800000,
+ 1552204800000,
+ 1572764400000,
+ 1583654400000,
+ 1604214000000,
+ 1615708800000,
+ 1636268400000,
+ 1647158400000,
+ 1667718000000,
+ 1678608000000,
+ 1699167600000,
+ 1710057600000,
+ 1730617200000,
+ 1741507200000,
+ 1762066800000,
+ 1772956800000,
+ 1793516400000,
+ 1805011200000,
+ 1825570800000,
+ 1836460800000,
+ 1857020400000,
+ 1867910400000,
+ 1888470000000,
+ 1899360000000,
+ 1919919600000,
+ 1930809600000,
+ 1951369200000,
+ 1962864000000,
+ 1983423600000,
+ 1994313600000,
+ 2014873200000,
+ 2025763200000,
+ 2046322800000,
+ 2057212800000,
+ 2077772400000,
+ 2088662400000,
+ 2109222000000,
+ 2120112000000,
+ 2140671600000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Indiana/Marengo",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "CDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1633276800000,
+ -1615136400000,
+ -1601827200000,
+ -1583686800000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -589392000000,
+ -576090000000,
+ -495043200000,
+ -481741200000,
+ -463593600000,
+ -450291600000,
+ -431539200000,
+ -418237200000,
+ -400089600000,
+ -386787600000,
+ -368640000000,
+ -355338000000,
+ -337190400000,
+ -323888400000,
+ -305740800000,
+ -292438800000,
+ -273686400000,
+ -21488400000,
+ -5767200000,
+ 9961200000,
+ 25682400000,
+ 41410800000,
+ 57736800000,
+ 73465200000,
+ 89186400000,
+ 104914800000,
+ 120636000000,
+ 126687600000,
+ 152089200000,
+ 162370800000,
+ 183535200000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 300,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Indiana/Petersburg",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "EST",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "EST",
+ "CDT",
+ "CST",
+ "CDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1633276800000,
+ -1615136400000,
+ -1601827200000,
+ -1583686800000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -462996000000,
+ -450291600000,
+ -431539200000,
+ -418237200000,
+ -400089600000,
+ -386787600000,
+ -368640000000,
+ -355338000000,
+ -337190400000,
+ -323888400000,
+ -305740800000,
+ -292438800000,
+ -273686400000,
+ -257965200000,
+ -242236800000,
+ -226515600000,
+ -210787200000,
+ -195066000000,
+ -179337600000,
+ -163616400000,
+ -147888000000,
+ -100112400000,
+ -84384000000,
+ -68662800000,
+ -52934400000,
+ -37213200000,
+ -21484800000,
+ -5763600000,
+ 9964800000,
+ 25686000000,
+ 41414400000,
+ 57740400000,
+ 73468800000,
+ 89190000000,
+ 104918400000,
+ 120639600000,
+ 126691200000,
+ 152089200000,
+ 162374400000,
+ 183538800000,
+ 199267200000,
+ 215593200000,
+ 230716800000,
+ 247042800000,
+ 1143961200000,
+ 1162105200000,
+ 1173600000000,
+ 1194159600000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 300,
+ 360,
+ 300,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Indiana/Tell_City",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1633276800000,
+ -1615136400000,
+ -1601827200000,
+ -1583686800000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -747244800000,
+ -733942800000,
+ -526492800000,
+ -513190800000,
+ -495043200000,
+ -481741200000,
+ -462996000000,
+ -450291600000,
+ -431539200000,
+ -418237200000,
+ -400089600000,
+ -386787600000,
+ -368640000000,
+ -355338000000,
+ -337190400000,
+ -323888400000,
+ -305740800000,
+ -289414800000,
+ -273686400000,
+ -260989200000,
+ -242236800000,
+ -226515600000,
+ -210787200000,
+ -195066000000,
+ -179337600000,
+ -21488400000,
+ -5767200000,
+ 9961200000,
+ 25682400000,
+ 1143961200000,
+ 1162105200000,
+ 1173600000000,
+ 1194159600000,
+ 1205049600000,
+ 1225609200000,
+ 1236499200000,
+ 1257058800000,
+ 1268553600000,
+ 1289113200000,
+ 1300003200000,
+ 1320562800000,
+ 1331452800000,
+ 1352012400000,
+ 1362902400000,
+ 1383462000000,
+ 1394352000000,
+ 1414911600000,
+ 1425801600000,
+ 1446361200000,
+ 1457856000000,
+ 1478415600000,
+ 1489305600000,
+ 1509865200000,
+ 1520755200000,
+ 1541314800000,
+ 1552204800000,
+ 1572764400000,
+ 1583654400000,
+ 1604214000000,
+ 1615708800000,
+ 1636268400000,
+ 1647158400000,
+ 1667718000000,
+ 1678608000000,
+ 1699167600000,
+ 1710057600000,
+ 1730617200000,
+ 1741507200000,
+ 1762066800000,
+ 1772956800000,
+ 1793516400000,
+ 1805011200000,
+ 1825570800000,
+ 1836460800000,
+ 1857020400000,
+ 1867910400000,
+ 1888470000000,
+ 1899360000000,
+ 1919919600000,
+ 1930809600000,
+ 1951369200000,
+ 1962864000000,
+ 1983423600000,
+ 1994313600000,
+ 2014873200000,
+ 2025763200000,
+ 2046322800000,
+ 2057212800000,
+ 2077772400000,
+ 2088662400000,
+ 2109222000000,
+ 2120112000000,
+ 2140671600000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Indiana/Vevay",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1633276800000,
+ -1615136400000,
+ -1601827200000,
+ -1583686800000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -495043200000,
+ -21488400000,
+ -5767200000,
+ 9961200000,
+ 25682400000,
+ 41410800000,
+ 57736800000,
+ 73465200000,
+ 89186400000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Indiana/Vincennes",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "CDT",
+ "CST",
+ "CDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1633276800000,
+ -1615136400000,
+ -1601827200000,
+ -1583686800000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -747244800000,
+ -733942800000,
+ -526492800000,
+ -513190800000,
+ -495043200000,
+ -481741200000,
+ -462996000000,
+ -450291600000,
+ -431539200000,
+ -418237200000,
+ -400089600000,
+ -386787600000,
+ -368640000000,
+ -355338000000,
+ -337190400000,
+ -323888400000,
+ -305740800000,
+ -289414800000,
+ -273686400000,
+ -260989200000,
+ -242236800000,
+ -226515600000,
+ -210787200000,
+ -195066000000,
+ -179337600000,
+ -21488400000,
+ -5767200000,
+ 9961200000,
+ 25682400000,
+ 1143961200000,
+ 1162105200000,
+ 1173600000000,
+ 1194159600000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 300,
+ 360,
+ 300,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Indiana/Winamac",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "CDT",
+ "CST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1633276800000,
+ -1615136400000,
+ -1601827200000,
+ -1583686800000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -747244800000,
+ -733942800000,
+ -715795200000,
+ -702493200000,
+ -684345600000,
+ -671043600000,
+ -652896000000,
+ -639594000000,
+ -620841600000,
+ -608144400000,
+ -589392000000,
+ -576090000000,
+ -557942400000,
+ -544640400000,
+ -526492800000,
+ -513190800000,
+ -495043200000,
+ -481741200000,
+ -463593600000,
+ -447267600000,
+ -431539200000,
+ -415818000000,
+ -400089600000,
+ -386787600000,
+ -368640000000,
+ -355338000000,
+ -337190400000,
+ -323888400000,
+ -305740800000,
+ -292438800000,
+ -273686400000,
+ -21488400000,
+ -5767200000,
+ 9961200000,
+ 25682400000,
+ 1143961200000,
+ 1162105200000,
+ 1173600000000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 300,
+ 360,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Indianapolis",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "EST",
+ "CST",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1633276800000,
+ -1615136400000,
+ -1601827200000,
+ -1583686800000,
+ -900259200000,
+ -891795600000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -747244800000,
+ -733942800000,
+ -715795200000,
+ -702493200000,
+ -684345600000,
+ -671043600000,
+ -652896000000,
+ -639594000000,
+ -620841600000,
+ -608144400000,
+ -589392000000,
+ -576090000000,
+ -557942400000,
+ -544640400000,
+ -526492800000,
+ -513190800000,
+ -495043200000,
+ -481741200000,
+ -463593600000,
+ -386787600000,
+ -368640000000,
+ -21488400000,
+ -5767200000,
+ 9961200000,
+ 25682400000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Inuvik",
+ "abbrs": [
+ "-00",
+ "PST",
+ "PDDT",
+ "PST",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST"
+ ],
+ "untils": [
+ -536457600000,
+ -147888000000,
+ -131558400000,
+ 294228000000,
+ 325674000000,
+ 341395200000,
+ 357123600000,
+ 372844800000,
+ 388573200000,
+ 404899200000,
+ 420022800000,
+ 436348800000,
+ 452077200000,
+ 467798400000,
+ 483526800000,
+ 499248000000,
+ 514976400000,
+ 530697600000,
+ 544611600000,
+ 562147200000,
+ 576061200000,
+ 594201600000,
+ 607510800000,
+ 625651200000,
+ 638960400000,
+ 657100800000,
+ 671014800000,
+ 688550400000,
+ 702464400000,
+ 720000000000,
+ 733914000000,
+ 752054400000,
+ 765363600000,
+ 783504000000,
+ 796813200000,
+ 814953600000,
+ 828867600000,
+ 846403200000,
+ 860317200000,
+ 877852800000,
+ 891766800000,
+ 909302400000,
+ 923216400000,
+ 941356800000,
+ 954666000000,
+ 972806400000,
+ 986115600000,
+ 1004256000000,
+ 1018170000000,
+ 1035705600000,
+ 1049619600000,
+ 1067155200000,
+ 1081069200000,
+ 1099209600000,
+ 1112518800000,
+ 1130659200000,
+ 1143968400000,
+ 1162108800000,
+ 1173603600000,
+ 1194163200000,
+ 1205053200000,
+ 1225612800000,
+ 1236502800000,
+ 1257062400000,
+ 1268557200000,
+ 1289116800000,
+ 1300006800000,
+ 1320566400000,
+ 1331456400000,
+ 1352016000000,
+ 1362906000000,
+ 1383465600000,
+ 1394355600000,
+ 1414915200000,
+ 1425805200000,
+ 1446364800000,
+ 1457859600000,
+ 1478419200000,
+ 1489309200000,
+ 1509868800000,
+ 1520758800000,
+ 1541318400000,
+ 1552208400000,
+ 1572768000000,
+ 1583658000000,
+ 1604217600000,
+ 1615712400000,
+ 1636272000000,
+ 1647162000000,
+ 1667721600000,
+ 1678611600000,
+ 1699171200000,
+ 1710061200000,
+ 1730620800000,
+ 1741510800000,
+ 1762070400000,
+ 1772960400000,
+ 1793520000000,
+ 1805014800000,
+ 1825574400000,
+ 1836464400000,
+ 1857024000000,
+ 1867914000000,
+ 1888473600000,
+ 1899363600000,
+ 1919923200000,
+ 1930813200000,
+ 1951372800000,
+ 1962867600000,
+ 1983427200000,
+ 1994317200000,
+ 2014876800000,
+ 2025766800000,
+ 2046326400000,
+ 2057216400000,
+ 2077776000000,
+ 2088666000000,
+ 2109225600000,
+ 2120115600000,
+ 2140675200000,
+ null
+ ],
+ "offsets": [
+ 0,
+ 480,
+ 360,
+ 480,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420
+ ],
+ "population": 3463
+ },
+ {
+ "name": "America/Iqaluit",
+ "abbrs": [
+ "-00",
+ "EWT",
+ "EPT",
+ "EST",
+ "EDDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "CST",
+ "CDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -865296000000,
+ -769395600000,
+ -765396000000,
+ -147898800000,
+ -131569200000,
+ 325666800000,
+ 341388000000,
+ 357116400000,
+ 372837600000,
+ 388566000000,
+ 404892000000,
+ 420015600000,
+ 436341600000,
+ 452070000000,
+ 467791200000,
+ 483519600000,
+ 499240800000,
+ 514969200000,
+ 530690400000,
+ 544604400000,
+ 562140000000,
+ 576054000000,
+ 594194400000,
+ 607503600000,
+ 625644000000,
+ 638953200000,
+ 657093600000,
+ 671007600000,
+ 688543200000,
+ 702457200000,
+ 719992800000,
+ 733906800000,
+ 752047200000,
+ 765356400000,
+ 783496800000,
+ 796806000000,
+ 814946400000,
+ 828860400000,
+ 846396000000,
+ 860310000000,
+ 877845600000,
+ 891759600000,
+ 909295200000,
+ 923209200000,
+ 941349600000,
+ 954662400000,
+ 972802800000,
+ 986108400000,
+ 1004248800000,
+ 1018162800000,
+ 1035698400000,
+ 1049612400000,
+ 1067148000000,
+ 1081062000000,
+ 1099202400000,
+ 1112511600000,
+ 1130652000000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 0,
+ 240,
+ 240,
+ 300,
+ 180,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 360,
+ 300,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 6699
+ },
+ {
+ "name": "America/Jamaica",
+ "abbrs": [
+ "KMT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1827687170000,
+ 126687600000,
+ 152085600000,
+ 162370800000,
+ 183535200000,
+ 199263600000,
+ 215589600000,
+ 230713200000,
+ 247039200000,
+ 262767600000,
+ 278488800000,
+ 294217200000,
+ 309938400000,
+ 325666800000,
+ 341388000000,
+ 357116400000,
+ 372837600000,
+ 388566000000,
+ 404892000000,
+ 420015600000,
+ 436341600000,
+ null
+ ],
+ "offsets": [
+ 307.1667,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 937700
+ },
+ {
+ "name": "America/Jujuy",
+ "abbrs": [
+ "CMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-04",
+ "-03",
+ "-04",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1567453392000,
+ -1233432000000,
+ -1222981200000,
+ -1205956800000,
+ -1194037200000,
+ -1172865600000,
+ -1162501200000,
+ -1141329600000,
+ -1130965200000,
+ -1109793600000,
+ -1099429200000,
+ -1078257600000,
+ -1067806800000,
+ -1046635200000,
+ -1036270800000,
+ -1015099200000,
+ -1004734800000,
+ -983563200000,
+ -973198800000,
+ -952027200000,
+ -941576400000,
+ -931032000000,
+ -900882000000,
+ -890337600000,
+ -833749200000,
+ -827265600000,
+ -752274000000,
+ -733780800000,
+ -197326800000,
+ -190843200000,
+ -184194000000,
+ -164491200000,
+ -152658000000,
+ -132955200000,
+ -121122000000,
+ -101419200000,
+ -86821200000,
+ -71092800000,
+ -54766800000,
+ -39038400000,
+ -23317200000,
+ -7588800000,
+ 128142000000,
+ 136605600000,
+ 596948400000,
+ 605066400000,
+ 624423600000,
+ 636516000000,
+ 657086400000,
+ 669178800000,
+ 686721600000,
+ 699415200000,
+ 719377200000,
+ 731469600000,
+ 1198983600000,
+ 1205632800000,
+ null
+ ],
+ "offsets": [
+ 256.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 240,
+ 180,
+ 240,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Juneau",
+ "abbrs": [
+ "PST",
+ "PWT",
+ "PPT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "YDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "YST",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST"
+ ],
+ "untils": [
+ -880207200000,
+ -769395600000,
+ -765385200000,
+ -21477600000,
+ -5756400000,
+ 9972000000,
+ 25693200000,
+ 41421600000,
+ 57747600000,
+ 73476000000,
+ 89197200000,
+ 104925600000,
+ 120646800000,
+ 126698400000,
+ 152096400000,
+ 162381600000,
+ 183546000000,
+ 199274400000,
+ 215600400000,
+ 230724000000,
+ 247050000000,
+ 262778400000,
+ 278499600000,
+ 294228000000,
+ 309949200000,
+ 325677600000,
+ 341402400000,
+ 357127200000,
+ 372848400000,
+ 388576800000,
+ 404902800000,
+ 420026400000,
+ 436352400000,
+ 439030800000,
+ 452084400000,
+ 467805600000,
+ 483534000000,
+ 499255200000,
+ 514983600000,
+ 530704800000,
+ 544618800000,
+ 562154400000,
+ 576068400000,
+ 594208800000,
+ 607518000000,
+ 625658400000,
+ 638967600000,
+ 657108000000,
+ 671022000000,
+ 688557600000,
+ 702471600000,
+ 720007200000,
+ 733921200000,
+ 752061600000,
+ 765370800000,
+ 783511200000,
+ 796820400000,
+ 814960800000,
+ 828874800000,
+ 846410400000,
+ 860324400000,
+ 877860000000,
+ 891774000000,
+ 909309600000,
+ 923223600000,
+ 941364000000,
+ 954673200000,
+ 972813600000,
+ 986122800000,
+ 1004263200000,
+ 1018177200000,
+ 1035712800000,
+ 1049626800000,
+ 1067162400000,
+ 1081076400000,
+ 1099216800000,
+ 1112526000000,
+ 1130666400000,
+ 1143975600000,
+ 1162116000000,
+ 1173610800000,
+ 1194170400000,
+ 1205060400000,
+ 1225620000000,
+ 1236510000000,
+ 1257069600000,
+ 1268564400000,
+ 1289124000000,
+ 1300014000000,
+ 1320573600000,
+ 1331463600000,
+ 1352023200000,
+ 1362913200000,
+ 1383472800000,
+ 1394362800000,
+ 1414922400000,
+ 1425812400000,
+ 1446372000000,
+ 1457866800000,
+ 1478426400000,
+ 1489316400000,
+ 1509876000000,
+ 1520766000000,
+ 1541325600000,
+ 1552215600000,
+ 1572775200000,
+ 1583665200000,
+ 1604224800000,
+ 1615719600000,
+ 1636279200000,
+ 1647169200000,
+ 1667728800000,
+ 1678618800000,
+ 1699178400000,
+ 1710068400000,
+ 1730628000000,
+ 1741518000000,
+ 1762077600000,
+ 1772967600000,
+ 1793527200000,
+ 1805022000000,
+ 1825581600000,
+ 1836471600000,
+ 1857031200000,
+ 1867921200000,
+ 1888480800000,
+ 1899370800000,
+ 1919930400000,
+ 1930820400000,
+ 1951380000000,
+ 1962874800000,
+ 1983434400000,
+ 1994324400000,
+ 2014884000000,
+ 2025774000000,
+ 2046333600000,
+ 2057223600000,
+ 2077783200000,
+ 2088673200000,
+ 2109232800000,
+ 2120122800000,
+ 2140682400000,
+ null
+ ],
+ "offsets": [
+ 480,
+ 420,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 480,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 540,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540
+ ],
+ "population": 32660
+ },
+ {
+ "name": "America/Kentucky/Louisville",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "CDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1633276800000,
+ -1615136400000,
+ -1601827200000,
+ -1583686800000,
+ -1535904000000,
+ -1525280400000,
+ -905097600000,
+ -891795600000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -757360800000,
+ -744224400000,
+ -715795200000,
+ -608144400000,
+ -589392000000,
+ -576090000000,
+ -557942400000,
+ -544640400000,
+ -526492800000,
+ -513190800000,
+ -495043200000,
+ -481741200000,
+ -463593600000,
+ -450291600000,
+ -431539200000,
+ -415818000000,
+ -400089600000,
+ -384368400000,
+ -368640000000,
+ -352918800000,
+ -337190400000,
+ -321469200000,
+ -305740800000,
+ -289414800000,
+ -273686400000,
+ -266432400000,
+ -52938000000,
+ -37216800000,
+ -21488400000,
+ -5767200000,
+ 9961200000,
+ 25682400000,
+ 41410800000,
+ 57736800000,
+ 73465200000,
+ 89186400000,
+ 104914800000,
+ 120636000000,
+ 126687600000,
+ 152089200000,
+ 162370800000,
+ 183535200000,
+ 199263600000,
+ 215589600000,
+ 230713200000,
+ 247039200000,
+ 262767600000,
+ 278488800000,
+ 294217200000,
+ 309938400000,
+ 325666800000,
+ 341388000000,
+ 357116400000,
+ 372837600000,
+ 388566000000,
+ 404892000000,
+ 420015600000,
+ 436341600000,
+ 452070000000,
+ 467791200000,
+ 483519600000,
+ 499240800000,
+ 514969200000,
+ 530690400000,
+ 544604400000,
+ 562140000000,
+ 576054000000,
+ 594194400000,
+ 607503600000,
+ 625644000000,
+ 638953200000,
+ 657093600000,
+ 671007600000,
+ 688543200000,
+ 702457200000,
+ 719992800000,
+ 733906800000,
+ 752047200000,
+ 765356400000,
+ 783496800000,
+ 796806000000,
+ 814946400000,
+ 828860400000,
+ 846396000000,
+ 860310000000,
+ 877845600000,
+ 891759600000,
+ 909295200000,
+ 923209200000,
+ 941349600000,
+ 954658800000,
+ 972799200000,
+ 986108400000,
+ 1004248800000,
+ 1018162800000,
+ 1035698400000,
+ 1049612400000,
+ 1067148000000,
+ 1081062000000,
+ 1099202400000,
+ 1112511600000,
+ 1130652000000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 300,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Kentucky/Monticello",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1633276800000,
+ -1615136400000,
+ -1601827200000,
+ -1583686800000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -52934400000,
+ -37213200000,
+ -21484800000,
+ -5763600000,
+ 9964800000,
+ 25686000000,
+ 41414400000,
+ 57740400000,
+ 73468800000,
+ 89190000000,
+ 104918400000,
+ 120639600000,
+ 126691200000,
+ 152089200000,
+ 162374400000,
+ 183538800000,
+ 199267200000,
+ 215593200000,
+ 230716800000,
+ 247042800000,
+ 262771200000,
+ 278492400000,
+ 294220800000,
+ 309942000000,
+ 325670400000,
+ 341391600000,
+ 357120000000,
+ 372841200000,
+ 388569600000,
+ 404895600000,
+ 420019200000,
+ 436345200000,
+ 452073600000,
+ 467794800000,
+ 483523200000,
+ 499244400000,
+ 514972800000,
+ 530694000000,
+ 544608000000,
+ 562143600000,
+ 576057600000,
+ 594198000000,
+ 607507200000,
+ 625647600000,
+ 638956800000,
+ 657097200000,
+ 671011200000,
+ 688546800000,
+ 702460800000,
+ 719996400000,
+ 733910400000,
+ 752050800000,
+ 765360000000,
+ 783500400000,
+ 796809600000,
+ 814950000000,
+ 828864000000,
+ 846399600000,
+ 860313600000,
+ 877849200000,
+ 891763200000,
+ 909298800000,
+ 923212800000,
+ 941353200000,
+ 954662400000,
+ 972802800000,
+ 986108400000,
+ 1004248800000,
+ 1018162800000,
+ 1035698400000,
+ 1049612400000,
+ 1067148000000,
+ 1081062000000,
+ 1099202400000,
+ 1112511600000,
+ 1130652000000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Knox_IN",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "EST",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "EST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1633276800000,
+ -1615136400000,
+ -1601827200000,
+ -1583686800000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -715795200000,
+ -702493200000,
+ -684345600000,
+ -671043600000,
+ -652896000000,
+ -639594000000,
+ -620841600000,
+ -608144400000,
+ -589392000000,
+ -576090000000,
+ -557942400000,
+ -544640400000,
+ -526492800000,
+ -513190800000,
+ -495043200000,
+ -481741200000,
+ -463593600000,
+ -447267600000,
+ -431539200000,
+ -415818000000,
+ -400089600000,
+ -386787600000,
+ -368640000000,
+ -355338000000,
+ -337190400000,
+ -321469200000,
+ -305740800000,
+ -289414800000,
+ -273686400000,
+ -257965200000,
+ -242236800000,
+ -195066000000,
+ -84384000000,
+ -68662800000,
+ -52934400000,
+ -37213200000,
+ -21484800000,
+ -5763600000,
+ 9964800000,
+ 25686000000,
+ 41414400000,
+ 57740400000,
+ 73468800000,
+ 89190000000,
+ 104918400000,
+ 120639600000,
+ 126691200000,
+ 152089200000,
+ 162374400000,
+ 183538800000,
+ 199267200000,
+ 215593200000,
+ 230716800000,
+ 247042800000,
+ 262771200000,
+ 278492400000,
+ 294220800000,
+ 309942000000,
+ 325670400000,
+ 341391600000,
+ 357120000000,
+ 372841200000,
+ 388569600000,
+ 404895600000,
+ 420019200000,
+ 436345200000,
+ 452073600000,
+ 467794800000,
+ 483523200000,
+ 499244400000,
+ 514972800000,
+ 530694000000,
+ 544608000000,
+ 562143600000,
+ 576057600000,
+ 594198000000,
+ 607507200000,
+ 625647600000,
+ 638956800000,
+ 657097200000,
+ 671011200000,
+ 688546800000,
+ 1143961200000,
+ 1162105200000,
+ 1173600000000,
+ 1194159600000,
+ 1205049600000,
+ 1225609200000,
+ 1236499200000,
+ 1257058800000,
+ 1268553600000,
+ 1289113200000,
+ 1300003200000,
+ 1320562800000,
+ 1331452800000,
+ 1352012400000,
+ 1362902400000,
+ 1383462000000,
+ 1394352000000,
+ 1414911600000,
+ 1425801600000,
+ 1446361200000,
+ 1457856000000,
+ 1478415600000,
+ 1489305600000,
+ 1509865200000,
+ 1520755200000,
+ 1541314800000,
+ 1552204800000,
+ 1572764400000,
+ 1583654400000,
+ 1604214000000,
+ 1615708800000,
+ 1636268400000,
+ 1647158400000,
+ 1667718000000,
+ 1678608000000,
+ 1699167600000,
+ 1710057600000,
+ 1730617200000,
+ 1741507200000,
+ 1762066800000,
+ 1772956800000,
+ 1793516400000,
+ 1805011200000,
+ 1825570800000,
+ 1836460800000,
+ 1857020400000,
+ 1867910400000,
+ 1888470000000,
+ 1899360000000,
+ 1919919600000,
+ 1930809600000,
+ 1951369200000,
+ 1962864000000,
+ 1983423600000,
+ 1994313600000,
+ 2014873200000,
+ 2025763200000,
+ 2046322800000,
+ 2057212800000,
+ 2077772400000,
+ 2088662400000,
+ 2109222000000,
+ 2120112000000,
+ 2140671600000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Kralendijk",
+ "abbrs": [
+ "LMT",
+ "-0430",
+ "AST"
+ ],
+ "untils": [
+ -1826738653000,
+ -157750200000,
+ null
+ ],
+ "offsets": [
+ 275.7833,
+ 270,
+ 240
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/La_Paz",
+ "abbrs": [
+ "CMT",
+ "BST",
+ "-04"
+ ],
+ "untils": [
+ -1205954844000,
+ -1192307244000,
+ null
+ ],
+ "offsets": [
+ 272.6,
+ 212.6,
+ 240
+ ],
+ "population": 1907000
+ },
+ {
+ "name": "America/Lima",
+ "abbrs": [
+ "LMT",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05"
+ ],
+ "untils": [
+ -1938538284000,
+ -1009825200000,
+ -1002052800000,
+ -986756400000,
+ -971035200000,
+ -955306800000,
+ -939585600000,
+ 504939600000,
+ 512712000000,
+ 536475600000,
+ 544248000000,
+ 631170000000,
+ 638942400000,
+ 757400400000,
+ 765172800000,
+ null
+ ],
+ "offsets": [
+ 308.6,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 10750000
+ },
+ {
+ "name": "America/Los_Angeles",
+ "abbrs": [
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PWT",
+ "PPT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST"
+ ],
+ "untils": [
+ -1633269600000,
+ -1615129200000,
+ -1601820000000,
+ -1583679600000,
+ -880207200000,
+ -769395600000,
+ -765385200000,
+ -687967140000,
+ -662655600000,
+ -620838000000,
+ -608137200000,
+ -589388400000,
+ -576082800000,
+ -557938800000,
+ -544633200000,
+ -526489200000,
+ -513183600000,
+ -495039600000,
+ -481734000000,
+ -463590000000,
+ -450284400000,
+ -431535600000,
+ -418230000000,
+ -400086000000,
+ -386780400000,
+ -368636400000,
+ -355330800000,
+ -337186800000,
+ -323881200000,
+ -305737200000,
+ -292431600000,
+ -273682800000,
+ -260982000000,
+ -242233200000,
+ -226508400000,
+ -210783600000,
+ -195058800000,
+ -179334000000,
+ -163609200000,
+ -147884400000,
+ -131554800000,
+ -116434800000,
+ -100105200000,
+ -84376800000,
+ -68655600000,
+ -52927200000,
+ -37206000000,
+ -21477600000,
+ -5756400000,
+ 9972000000,
+ 25693200000,
+ 41421600000,
+ 57747600000,
+ 73476000000,
+ 89197200000,
+ 104925600000,
+ 120646800000,
+ 126698400000,
+ 152096400000,
+ 162381600000,
+ 183546000000,
+ 199274400000,
+ 215600400000,
+ 230724000000,
+ 247050000000,
+ 262778400000,
+ 278499600000,
+ 294228000000,
+ 309949200000,
+ 325677600000,
+ 341398800000,
+ 357127200000,
+ 372848400000,
+ 388576800000,
+ 404902800000,
+ 420026400000,
+ 436352400000,
+ 452080800000,
+ 467802000000,
+ 483530400000,
+ 499251600000,
+ 514980000000,
+ 530701200000,
+ 544615200000,
+ 562150800000,
+ 576064800000,
+ 594205200000,
+ 607514400000,
+ 625654800000,
+ 638964000000,
+ 657104400000,
+ 671018400000,
+ 688554000000,
+ 702468000000,
+ 720003600000,
+ 733917600000,
+ 752058000000,
+ 765367200000,
+ 783507600000,
+ 796816800000,
+ 814957200000,
+ 828871200000,
+ 846406800000,
+ 860320800000,
+ 877856400000,
+ 891770400000,
+ 909306000000,
+ 923220000000,
+ 941360400000,
+ 954669600000,
+ 972810000000,
+ 986119200000,
+ 1004259600000,
+ 1018173600000,
+ 1035709200000,
+ 1049623200000,
+ 1067158800000,
+ 1081072800000,
+ 1099213200000,
+ 1112522400000,
+ 1130662800000,
+ 1143972000000,
+ 1162112400000,
+ 1173607200000,
+ 1194166800000,
+ 1205056800000,
+ 1225616400000,
+ 1236506400000,
+ 1257066000000,
+ 1268560800000,
+ 1289120400000,
+ 1300010400000,
+ 1320570000000,
+ 1331460000000,
+ 1352019600000,
+ 1362909600000,
+ 1383469200000,
+ 1394359200000,
+ 1414918800000,
+ 1425808800000,
+ 1446368400000,
+ 1457863200000,
+ 1478422800000,
+ 1489312800000,
+ 1509872400000,
+ 1520762400000,
+ 1541322000000,
+ 1552212000000,
+ 1572771600000,
+ 1583661600000,
+ 1604221200000,
+ 1615716000000,
+ 1636275600000,
+ 1647165600000,
+ 1667725200000,
+ 1678615200000,
+ 1699174800000,
+ 1710064800000,
+ 1730624400000,
+ 1741514400000,
+ 1762074000000,
+ 1772964000000,
+ 1793523600000,
+ 1805018400000,
+ 1825578000000,
+ 1836468000000,
+ 1857027600000,
+ 1867917600000,
+ 1888477200000,
+ 1899367200000,
+ 1919926800000,
+ 1930816800000,
+ 1951376400000,
+ 1962871200000,
+ 1983430800000,
+ 1994320800000,
+ 2014880400000,
+ 2025770400000,
+ 2046330000000,
+ 2057220000000,
+ 2077779600000,
+ 2088669600000,
+ 2109229200000,
+ 2120119200000,
+ 2140678800000,
+ null
+ ],
+ "offsets": [
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480
+ ],
+ "population": 15058000
+ },
+ {
+ "name": "America/Louisville",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "CDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1633276800000,
+ -1615136400000,
+ -1601827200000,
+ -1583686800000,
+ -1535904000000,
+ -1525280400000,
+ -905097600000,
+ -891795600000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -757360800000,
+ -744224400000,
+ -715795200000,
+ -608144400000,
+ -589392000000,
+ -576090000000,
+ -557942400000,
+ -544640400000,
+ -526492800000,
+ -513190800000,
+ -495043200000,
+ -481741200000,
+ -463593600000,
+ -450291600000,
+ -431539200000,
+ -415818000000,
+ -400089600000,
+ -384368400000,
+ -368640000000,
+ -352918800000,
+ -337190400000,
+ -321469200000,
+ -305740800000,
+ -289414800000,
+ -273686400000,
+ -266432400000,
+ -52938000000,
+ -37216800000,
+ -21488400000,
+ -5767200000,
+ 9961200000,
+ 25682400000,
+ 41410800000,
+ 57736800000,
+ 73465200000,
+ 89186400000,
+ 104914800000,
+ 120636000000,
+ 126687600000,
+ 152089200000,
+ 162370800000,
+ 183535200000,
+ 199263600000,
+ 215589600000,
+ 230713200000,
+ 247039200000,
+ 262767600000,
+ 278488800000,
+ 294217200000,
+ 309938400000,
+ 325666800000,
+ 341388000000,
+ 357116400000,
+ 372837600000,
+ 388566000000,
+ 404892000000,
+ 420015600000,
+ 436341600000,
+ 452070000000,
+ 467791200000,
+ 483519600000,
+ 499240800000,
+ 514969200000,
+ 530690400000,
+ 544604400000,
+ 562140000000,
+ 576054000000,
+ 594194400000,
+ 607503600000,
+ 625644000000,
+ 638953200000,
+ 657093600000,
+ 671007600000,
+ 688543200000,
+ 702457200000,
+ 719992800000,
+ 733906800000,
+ 752047200000,
+ 765356400000,
+ 783496800000,
+ 796806000000,
+ 814946400000,
+ 828860400000,
+ 846396000000,
+ 860310000000,
+ 877845600000,
+ 891759600000,
+ 909295200000,
+ 923209200000,
+ 941349600000,
+ 954658800000,
+ 972799200000,
+ 986108400000,
+ 1004248800000,
+ 1018162800000,
+ 1035698400000,
+ 1049612400000,
+ 1067148000000,
+ 1081062000000,
+ 1099202400000,
+ 1112511600000,
+ 1130652000000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 300,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Lower_Princes",
+ "abbrs": [
+ "LMT",
+ "-0430",
+ "AST"
+ ],
+ "untils": [
+ -1826738653000,
+ -157750200000,
+ null
+ ],
+ "offsets": [
+ 275.7833,
+ 270,
+ 240
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Maceio",
+ "abbrs": [
+ "LMT",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1767217028000,
+ -1206957600000,
+ -1191362400000,
+ -1175374800000,
+ -1159826400000,
+ -633819600000,
+ -622069200000,
+ -602283600000,
+ -591832800000,
+ -570747600000,
+ -560210400000,
+ -539125200000,
+ -531352800000,
+ -191365200000,
+ -184197600000,
+ -155163600000,
+ -150069600000,
+ -128898000000,
+ -121125600000,
+ -99954000000,
+ -89589600000,
+ -68418000000,
+ -57967200000,
+ 499748400000,
+ 511236000000,
+ 530593200000,
+ 540266400000,
+ 562129200000,
+ 571197600000,
+ 592974000000,
+ 602042400000,
+ 624423600000,
+ 634701600000,
+ 813726000000,
+ 824004000000,
+ 938919600000,
+ 951616800000,
+ 970974000000,
+ 972180000000,
+ 1003028400000,
+ 1013911200000,
+ null
+ ],
+ "offsets": [
+ 142.8667,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 932078
+ },
+ {
+ "name": "America/Managua",
+ "abbrs": [
+ "MMT",
+ "CST",
+ "EST",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "EST",
+ "CST",
+ "EST",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1121105688000,
+ 105084000000,
+ 161758800000,
+ 290584800000,
+ 299134800000,
+ 322034400000,
+ 330584400000,
+ 694260000000,
+ 717310800000,
+ 725868000000,
+ 852094800000,
+ 1113112800000,
+ 1128229200000,
+ 1146384000000,
+ 1159682400000,
+ null
+ ],
+ "offsets": [
+ 345.2,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 2223000
+ },
+ {
+ "name": "America/Manaus",
+ "abbrs": [
+ "LMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04"
+ ],
+ "untils": [
+ -1767211196000,
+ -1206954000000,
+ -1191358800000,
+ -1175371200000,
+ -1159822800000,
+ -633816000000,
+ -622065600000,
+ -602280000000,
+ -591829200000,
+ -570744000000,
+ -560206800000,
+ -539121600000,
+ -531349200000,
+ -191361600000,
+ -184194000000,
+ -155160000000,
+ -150066000000,
+ -128894400000,
+ -121122000000,
+ -99950400000,
+ -89586000000,
+ -68414400000,
+ -57963600000,
+ 499752000000,
+ 511239600000,
+ 530596800000,
+ 540270000000,
+ 562132800000,
+ 571201200000,
+ 750830400000,
+ 761713200000,
+ null
+ ],
+ "offsets": [
+ 240.0667,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240
+ ],
+ "population": 1893000
+ },
+ {
+ "name": "America/Marigot",
+ "abbrs": [
+ "LMT",
+ "AST"
+ ],
+ "untils": [
+ -1825098836000,
+ null
+ ],
+ "offsets": [
+ 246.0667,
+ 240
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Martinique",
+ "abbrs": [
+ "FFMT",
+ "AST",
+ "ADT",
+ "AST"
+ ],
+ "untils": [
+ -1851537340000,
+ 323841600000,
+ 338958000000,
+ null
+ ],
+ "offsets": [
+ 244.3333,
+ 240,
+ 180,
+ 240
+ ],
+ "population": 386486
+ },
+ {
+ "name": "America/Matamoros",
+ "abbrs": [
+ "LMT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1514743200000,
+ 576057600000,
+ 594198000000,
+ 828864000000,
+ 846399600000,
+ 860313600000,
+ 877849200000,
+ 891763200000,
+ 909298800000,
+ 923212800000,
+ 941353200000,
+ 954662400000,
+ 972802800000,
+ 989136000000,
+ 1001833200000,
+ 1018166400000,
+ 1035702000000,
+ 1049616000000,
+ 1067151600000,
+ 1081065600000,
+ 1099206000000,
+ 1112515200000,
+ 1130655600000,
+ 1143964800000,
+ 1162105200000,
+ 1175414400000,
+ 1193554800000,
+ 1207468800000,
+ 1225004400000,
+ 1238918400000,
+ 1256454000000,
+ 1268553600000,
+ 1289113200000,
+ 1300003200000,
+ 1320562800000,
+ 1331452800000,
+ 1352012400000,
+ 1362902400000,
+ 1383462000000,
+ 1394352000000,
+ 1414911600000,
+ 1425801600000,
+ 1446361200000,
+ 1457856000000,
+ 1478415600000,
+ 1489305600000,
+ 1509865200000,
+ 1520755200000,
+ 1541314800000,
+ 1552204800000,
+ 1572764400000,
+ 1583654400000,
+ 1604214000000,
+ 1615708800000,
+ 1636268400000,
+ 1647158400000,
+ 1667718000000,
+ 1678608000000,
+ 1699167600000,
+ 1710057600000,
+ 1730617200000,
+ 1741507200000,
+ 1762066800000,
+ 1772956800000,
+ 1793516400000,
+ 1805011200000,
+ 1825570800000,
+ 1836460800000,
+ 1857020400000,
+ 1867910400000,
+ 1888470000000,
+ 1899360000000,
+ 1919919600000,
+ 1930809600000,
+ 1951369200000,
+ 1962864000000,
+ 1983423600000,
+ 1994313600000,
+ 2014873200000,
+ 2025763200000,
+ 2046322800000,
+ 2057212800000,
+ 2077772400000,
+ 2088662400000,
+ 2109222000000,
+ 2120112000000,
+ 2140671600000,
+ null
+ ],
+ "offsets": [
+ 400,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 449815
+ },
+ {
+ "name": "America/Mazatlan",
+ "abbrs": [
+ "LMT",
+ "MST",
+ "CST",
+ "MST",
+ "CST",
+ "MST",
+ "CST",
+ "MST",
+ "PST",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST"
+ ],
+ "untils": [
+ -1514739600000,
+ -1343066400000,
+ -1234807200000,
+ -1220292000000,
+ -1207159200000,
+ -1191344400000,
+ -873828000000,
+ -661539600000,
+ 28800000,
+ 828867600000,
+ 846403200000,
+ 860317200000,
+ 877852800000,
+ 891766800000,
+ 909302400000,
+ 923216400000,
+ 941356800000,
+ 954666000000,
+ 972806400000,
+ 989139600000,
+ 1001836800000,
+ 1018170000000,
+ 1035705600000,
+ 1049619600000,
+ 1067155200000,
+ 1081069200000,
+ 1099209600000,
+ 1112518800000,
+ 1130659200000,
+ 1143968400000,
+ 1162108800000,
+ 1175418000000,
+ 1193558400000,
+ 1207472400000,
+ 1225008000000,
+ 1238922000000,
+ 1256457600000,
+ 1270371600000,
+ 1288512000000,
+ 1301821200000,
+ 1319961600000,
+ 1333270800000,
+ 1351411200000,
+ 1365325200000,
+ 1382860800000,
+ 1396774800000,
+ 1414310400000,
+ 1428224400000,
+ 1445760000000,
+ 1459674000000,
+ 1477814400000,
+ 1491123600000,
+ 1509264000000,
+ 1522573200000,
+ 1540713600000,
+ 1554627600000,
+ 1572163200000,
+ 1586077200000,
+ 1603612800000,
+ 1617526800000,
+ 1635667200000,
+ 1648976400000,
+ 1667116800000,
+ 1680426000000,
+ 1698566400000,
+ 1712480400000,
+ 1730016000000,
+ 1743930000000,
+ 1761465600000,
+ 1775379600000,
+ 1792915200000,
+ 1806829200000,
+ 1824969600000,
+ 1838278800000,
+ 1856419200000,
+ 1869728400000,
+ 1887868800000,
+ 1901782800000,
+ 1919318400000,
+ 1933232400000,
+ 1950768000000,
+ 1964682000000,
+ 1982822400000,
+ 1996131600000,
+ 2014272000000,
+ 2027581200000,
+ 2045721600000,
+ 2059030800000,
+ 2077171200000,
+ 2091085200000,
+ 2108620800000,
+ 2122534800000,
+ 2140070400000,
+ null
+ ],
+ "offsets": [
+ 425.6667,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 480,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420
+ ],
+ "population": 438434
+ },
+ {
+ "name": "America/Mendoza",
+ "abbrs": [
+ "CMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-02",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1567453392000,
+ -1233432000000,
+ -1222981200000,
+ -1205956800000,
+ -1194037200000,
+ -1172865600000,
+ -1162501200000,
+ -1141329600000,
+ -1130965200000,
+ -1109793600000,
+ -1099429200000,
+ -1078257600000,
+ -1067806800000,
+ -1046635200000,
+ -1036270800000,
+ -1015099200000,
+ -1004734800000,
+ -983563200000,
+ -973198800000,
+ -952027200000,
+ -941576400000,
+ -931032000000,
+ -900882000000,
+ -890337600000,
+ -833749200000,
+ -827265600000,
+ -752274000000,
+ -733780800000,
+ -197326800000,
+ -190843200000,
+ -184194000000,
+ -164491200000,
+ -152658000000,
+ -132955200000,
+ -121122000000,
+ -101419200000,
+ -86821200000,
+ -71092800000,
+ -54766800000,
+ -39038400000,
+ -23317200000,
+ -7588800000,
+ 128142000000,
+ 136605600000,
+ 596948400000,
+ 605066400000,
+ 624423600000,
+ 636516000000,
+ 655963200000,
+ 667796400000,
+ 687499200000,
+ 699418800000,
+ 719380800000,
+ 731469600000,
+ 1085281200000,
+ 1096171200000,
+ 1198983600000,
+ 1205632800000,
+ null
+ ],
+ "offsets": [
+ 256.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 120,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Menominee",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "EST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1633276800000,
+ -1615136400000,
+ -1601827200000,
+ -1583686800000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -747244800000,
+ -733942800000,
+ -116438400000,
+ -100112400000,
+ -21484800000,
+ 104914800000,
+ 120639600000,
+ 126691200000,
+ 152089200000,
+ 162374400000,
+ 183538800000,
+ 199267200000,
+ 215593200000,
+ 230716800000,
+ 247042800000,
+ 262771200000,
+ 278492400000,
+ 294220800000,
+ 309942000000,
+ 325670400000,
+ 341391600000,
+ 357120000000,
+ 372841200000,
+ 388569600000,
+ 404895600000,
+ 420019200000,
+ 436345200000,
+ 452073600000,
+ 467794800000,
+ 483523200000,
+ 499244400000,
+ 514972800000,
+ 530694000000,
+ 544608000000,
+ 562143600000,
+ 576057600000,
+ 594198000000,
+ 607507200000,
+ 625647600000,
+ 638956800000,
+ 657097200000,
+ 671011200000,
+ 688546800000,
+ 702460800000,
+ 719996400000,
+ 733910400000,
+ 752050800000,
+ 765360000000,
+ 783500400000,
+ 796809600000,
+ 814950000000,
+ 828864000000,
+ 846399600000,
+ 860313600000,
+ 877849200000,
+ 891763200000,
+ 909298800000,
+ 923212800000,
+ 941353200000,
+ 954662400000,
+ 972802800000,
+ 986112000000,
+ 1004252400000,
+ 1018166400000,
+ 1035702000000,
+ 1049616000000,
+ 1067151600000,
+ 1081065600000,
+ 1099206000000,
+ 1112515200000,
+ 1130655600000,
+ 1143964800000,
+ 1162105200000,
+ 1173600000000,
+ 1194159600000,
+ 1205049600000,
+ 1225609200000,
+ 1236499200000,
+ 1257058800000,
+ 1268553600000,
+ 1289113200000,
+ 1300003200000,
+ 1320562800000,
+ 1331452800000,
+ 1352012400000,
+ 1362902400000,
+ 1383462000000,
+ 1394352000000,
+ 1414911600000,
+ 1425801600000,
+ 1446361200000,
+ 1457856000000,
+ 1478415600000,
+ 1489305600000,
+ 1509865200000,
+ 1520755200000,
+ 1541314800000,
+ 1552204800000,
+ 1572764400000,
+ 1583654400000,
+ 1604214000000,
+ 1615708800000,
+ 1636268400000,
+ 1647158400000,
+ 1667718000000,
+ 1678608000000,
+ 1699167600000,
+ 1710057600000,
+ 1730617200000,
+ 1741507200000,
+ 1762066800000,
+ 1772956800000,
+ 1793516400000,
+ 1805011200000,
+ 1825570800000,
+ 1836460800000,
+ 1857020400000,
+ 1867910400000,
+ 1888470000000,
+ 1899360000000,
+ 1919919600000,
+ 1930809600000,
+ 1951369200000,
+ 1962864000000,
+ 1983423600000,
+ 1994313600000,
+ 2014873200000,
+ 2025763200000,
+ 2046322800000,
+ 2057212800000,
+ 2077772400000,
+ 2088662400000,
+ 2109222000000,
+ 2120112000000,
+ 2140671600000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 8494
+ },
+ {
+ "name": "America/Merida",
+ "abbrs": [
+ "LMT",
+ "CST",
+ "EST",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1514743200000,
+ 377935200000,
+ 407653200000,
+ 828864000000,
+ 846399600000,
+ 860313600000,
+ 877849200000,
+ 891763200000,
+ 909298800000,
+ 923212800000,
+ 941353200000,
+ 954662400000,
+ 972802800000,
+ 989136000000,
+ 1001833200000,
+ 1018166400000,
+ 1035702000000,
+ 1049616000000,
+ 1067151600000,
+ 1081065600000,
+ 1099206000000,
+ 1112515200000,
+ 1130655600000,
+ 1143964800000,
+ 1162105200000,
+ 1175414400000,
+ 1193554800000,
+ 1207468800000,
+ 1225004400000,
+ 1238918400000,
+ 1256454000000,
+ 1270368000000,
+ 1288508400000,
+ 1301817600000,
+ 1319958000000,
+ 1333267200000,
+ 1351407600000,
+ 1365321600000,
+ 1382857200000,
+ 1396771200000,
+ 1414306800000,
+ 1428220800000,
+ 1445756400000,
+ 1459670400000,
+ 1477810800000,
+ 1491120000000,
+ 1509260400000,
+ 1522569600000,
+ 1540710000000,
+ 1554624000000,
+ 1572159600000,
+ 1586073600000,
+ 1603609200000,
+ 1617523200000,
+ 1635663600000,
+ 1648972800000,
+ 1667113200000,
+ 1680422400000,
+ 1698562800000,
+ 1712476800000,
+ 1730012400000,
+ 1743926400000,
+ 1761462000000,
+ 1775376000000,
+ 1792911600000,
+ 1806825600000,
+ 1824966000000,
+ 1838275200000,
+ 1856415600000,
+ 1869724800000,
+ 1887865200000,
+ 1901779200000,
+ 1919314800000,
+ 1933228800000,
+ 1950764400000,
+ 1964678400000,
+ 1982818800000,
+ 1996128000000,
+ 2014268400000,
+ 2027577600000,
+ 2045718000000,
+ 2059027200000,
+ 2077167600000,
+ 2091081600000,
+ 2108617200000,
+ 2122531200000,
+ 2140066800000,
+ null
+ ],
+ "offsets": [
+ 358.4667,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 1111000
+ },
+ {
+ "name": "America/Metlakatla",
+ "abbrs": [
+ "PST",
+ "PWT",
+ "PPT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST"
+ ],
+ "untils": [
+ -880207200000,
+ -769395600000,
+ -765385200000,
+ -21477600000,
+ -5756400000,
+ 9972000000,
+ 25693200000,
+ 41421600000,
+ 57747600000,
+ 73476000000,
+ 89197200000,
+ 104925600000,
+ 120646800000,
+ 126698400000,
+ 152096400000,
+ 162381600000,
+ 183546000000,
+ 199274400000,
+ 215600400000,
+ 230724000000,
+ 247050000000,
+ 262778400000,
+ 278499600000,
+ 294228000000,
+ 309949200000,
+ 325677600000,
+ 341398800000,
+ 357127200000,
+ 372848400000,
+ 388576800000,
+ 404902800000,
+ 420026400000,
+ 436352400000,
+ 1446372000000,
+ 1457866800000,
+ 1478426400000,
+ 1489316400000,
+ 1509876000000,
+ 1520766000000,
+ 1541325600000,
+ 1552215600000,
+ 1572775200000,
+ 1583665200000,
+ 1604224800000,
+ 1615719600000,
+ 1636279200000,
+ 1647169200000,
+ 1667728800000,
+ 1678618800000,
+ 1699178400000,
+ 1710068400000,
+ 1730628000000,
+ 1741518000000,
+ 1762077600000,
+ 1772967600000,
+ 1793527200000,
+ 1805022000000,
+ 1825581600000,
+ 1836471600000,
+ 1857031200000,
+ 1867921200000,
+ 1888480800000,
+ 1899370800000,
+ 1919930400000,
+ 1930820400000,
+ 1951380000000,
+ 1962874800000,
+ 1983434400000,
+ 1994324400000,
+ 2014884000000,
+ 2025774000000,
+ 2046333600000,
+ 2057223600000,
+ 2077783200000,
+ 2088673200000,
+ 2109232800000,
+ 2120122800000,
+ 2140682400000,
+ null
+ ],
+ "offsets": [
+ 480,
+ 420,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540
+ ],
+ "population": 1375
+ },
+ {
+ "name": "America/Mexico_City",
+ "abbrs": [
+ "LMT",
+ "MST",
+ "CST",
+ "MST",
+ "CST",
+ "MST",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1514739600000,
+ -1343066400000,
+ -1234807200000,
+ -1220292000000,
+ -1207159200000,
+ -1191344400000,
+ -975261600000,
+ -963169200000,
+ -917114400000,
+ -907354800000,
+ -821901600000,
+ -810068400000,
+ -627501600000,
+ -612990000000,
+ 828864000000,
+ 846399600000,
+ 860313600000,
+ 877849200000,
+ 891763200000,
+ 909298800000,
+ 923212800000,
+ 941353200000,
+ 954662400000,
+ 972802800000,
+ 989136000000,
+ 1001833200000,
+ 1018166400000,
+ 1035702000000,
+ 1049616000000,
+ 1067151600000,
+ 1081065600000,
+ 1099206000000,
+ 1112515200000,
+ 1130655600000,
+ 1143964800000,
+ 1162105200000,
+ 1175414400000,
+ 1193554800000,
+ 1207468800000,
+ 1225004400000,
+ 1238918400000,
+ 1256454000000,
+ 1270368000000,
+ 1288508400000,
+ 1301817600000,
+ 1319958000000,
+ 1333267200000,
+ 1351407600000,
+ 1365321600000,
+ 1382857200000,
+ 1396771200000,
+ 1414306800000,
+ 1428220800000,
+ 1445756400000,
+ 1459670400000,
+ 1477810800000,
+ 1491120000000,
+ 1509260400000,
+ 1522569600000,
+ 1540710000000,
+ 1554624000000,
+ 1572159600000,
+ 1586073600000,
+ 1603609200000,
+ 1617523200000,
+ 1635663600000,
+ 1648972800000,
+ 1667113200000,
+ 1680422400000,
+ 1698562800000,
+ 1712476800000,
+ 1730012400000,
+ 1743926400000,
+ 1761462000000,
+ 1775376000000,
+ 1792911600000,
+ 1806825600000,
+ 1824966000000,
+ 1838275200000,
+ 1856415600000,
+ 1869724800000,
+ 1887865200000,
+ 1901779200000,
+ 1919314800000,
+ 1933228800000,
+ 1950764400000,
+ 1964678400000,
+ 1982818800000,
+ 1996128000000,
+ 2014268400000,
+ 2027577600000,
+ 2045718000000,
+ 2059027200000,
+ 2077167600000,
+ 2091081600000,
+ 2108617200000,
+ 2122531200000,
+ 2140066800000,
+ null
+ ],
+ "offsets": [
+ 396.6,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 20063000
+ },
+ {
+ "name": "America/Miquelon",
+ "abbrs": [
+ "LMT",
+ "AST",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1850328920000,
+ 326001600000,
+ 544597200000,
+ 562132800000,
+ 576046800000,
+ 594187200000,
+ 607496400000,
+ 625636800000,
+ 638946000000,
+ 657086400000,
+ 671000400000,
+ 688536000000,
+ 702450000000,
+ 719985600000,
+ 733899600000,
+ 752040000000,
+ 765349200000,
+ 783489600000,
+ 796798800000,
+ 814939200000,
+ 828853200000,
+ 846388800000,
+ 860302800000,
+ 877838400000,
+ 891752400000,
+ 909288000000,
+ 923202000000,
+ 941342400000,
+ 954651600000,
+ 972792000000,
+ 986101200000,
+ 1004241600000,
+ 1018155600000,
+ 1035691200000,
+ 1049605200000,
+ 1067140800000,
+ 1081054800000,
+ 1099195200000,
+ 1112504400000,
+ 1130644800000,
+ 1143954000000,
+ 1162094400000,
+ 1173589200000,
+ 1194148800000,
+ 1205038800000,
+ 1225598400000,
+ 1236488400000,
+ 1257048000000,
+ 1268542800000,
+ 1289102400000,
+ 1299992400000,
+ 1320552000000,
+ 1331442000000,
+ 1352001600000,
+ 1362891600000,
+ 1383451200000,
+ 1394341200000,
+ 1414900800000,
+ 1425790800000,
+ 1446350400000,
+ 1457845200000,
+ 1478404800000,
+ 1489294800000,
+ 1509854400000,
+ 1520744400000,
+ 1541304000000,
+ 1552194000000,
+ 1572753600000,
+ 1583643600000,
+ 1604203200000,
+ 1615698000000,
+ 1636257600000,
+ 1647147600000,
+ 1667707200000,
+ 1678597200000,
+ 1699156800000,
+ 1710046800000,
+ 1730606400000,
+ 1741496400000,
+ 1762056000000,
+ 1772946000000,
+ 1793505600000,
+ 1805000400000,
+ 1825560000000,
+ 1836450000000,
+ 1857009600000,
+ 1867899600000,
+ 1888459200000,
+ 1899349200000,
+ 1919908800000,
+ 1930798800000,
+ 1951358400000,
+ 1962853200000,
+ 1983412800000,
+ 1994302800000,
+ 2014862400000,
+ 2025752400000,
+ 2046312000000,
+ 2057202000000,
+ 2077761600000,
+ 2088651600000,
+ 2109211200000,
+ 2120101200000,
+ 2140660800000,
+ null
+ ],
+ "offsets": [
+ 224.6667,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 6080
+ },
+ {
+ "name": "America/Moncton",
+ "abbrs": [
+ "EST",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "AWT",
+ "APT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST"
+ ],
+ "untils": [
+ -2131642800000,
+ -1632074400000,
+ -1615143600000,
+ -1153681200000,
+ -1145822400000,
+ -1122231600000,
+ -1114372800000,
+ -1090782000000,
+ -1082923200000,
+ -1059332400000,
+ -1051473600000,
+ -1027882800000,
+ -1020024000000,
+ -996433200000,
+ -988574400000,
+ -965674800000,
+ -955396800000,
+ -934743600000,
+ -923947200000,
+ -904503600000,
+ -891892800000,
+ -880221600000,
+ -769395600000,
+ -765399600000,
+ -747252000000,
+ -733950000000,
+ -715802400000,
+ -702500400000,
+ -684352800000,
+ -671050800000,
+ -652903200000,
+ -639601200000,
+ -620848800000,
+ -608151600000,
+ -589399200000,
+ -576097200000,
+ -557949600000,
+ -544647600000,
+ -526500000000,
+ -513198000000,
+ -495050400000,
+ -481748400000,
+ -463600800000,
+ -450298800000,
+ -431546400000,
+ -418244400000,
+ -400096800000,
+ -384375600000,
+ -368647200000,
+ -352926000000,
+ -337197600000,
+ -321476400000,
+ -305748000000,
+ -289422000000,
+ -273693600000,
+ -257972400000,
+ -242244000000,
+ -226522800000,
+ -210794400000,
+ -195073200000,
+ -179344800000,
+ -163623600000,
+ -147895200000,
+ -131569200000,
+ -116445600000,
+ -100119600000,
+ -84391200000,
+ -68670000000,
+ -52941600000,
+ -37220400000,
+ -21492000000,
+ -5770800000,
+ 9957600000,
+ 25678800000,
+ 41407200000,
+ 57733200000,
+ 73461600000,
+ 89182800000,
+ 136360800000,
+ 152082000000,
+ 167810400000,
+ 183531600000,
+ 199260000000,
+ 215586000000,
+ 230709600000,
+ 247035600000,
+ 262764000000,
+ 278485200000,
+ 294213600000,
+ 309934800000,
+ 325663200000,
+ 341384400000,
+ 357112800000,
+ 372834000000,
+ 388562400000,
+ 404888400000,
+ 420012000000,
+ 436338000000,
+ 452066400000,
+ 467787600000,
+ 483516000000,
+ 499237200000,
+ 514965600000,
+ 530686800000,
+ 544600800000,
+ 562136400000,
+ 576050400000,
+ 594190800000,
+ 607500000000,
+ 625640400000,
+ 638949600000,
+ 657090000000,
+ 671004000000,
+ 688539600000,
+ 702453600000,
+ 719989200000,
+ 733896060000,
+ 752036460000,
+ 765345660000,
+ 783486060000,
+ 796795260000,
+ 814935660000,
+ 828849660000,
+ 846385260000,
+ 860299260000,
+ 877834860000,
+ 891748860000,
+ 909284460000,
+ 923198460000,
+ 941338860000,
+ 954648060000,
+ 972788460000,
+ 986097660000,
+ 1004238060000,
+ 1018152060000,
+ 1035687660000,
+ 1049601660000,
+ 1067137260000,
+ 1081051260000,
+ 1099191660000,
+ 1112500860000,
+ 1130641260000,
+ 1143950460000,
+ 1162090860000,
+ 1173592800000,
+ 1194152400000,
+ 1205042400000,
+ 1225602000000,
+ 1236492000000,
+ 1257051600000,
+ 1268546400000,
+ 1289106000000,
+ 1299996000000,
+ 1320555600000,
+ 1331445600000,
+ 1352005200000,
+ 1362895200000,
+ 1383454800000,
+ 1394344800000,
+ 1414904400000,
+ 1425794400000,
+ 1446354000000,
+ 1457848800000,
+ 1478408400000,
+ 1489298400000,
+ 1509858000000,
+ 1520748000000,
+ 1541307600000,
+ 1552197600000,
+ 1572757200000,
+ 1583647200000,
+ 1604206800000,
+ 1615701600000,
+ 1636261200000,
+ 1647151200000,
+ 1667710800000,
+ 1678600800000,
+ 1699160400000,
+ 1710050400000,
+ 1730610000000,
+ 1741500000000,
+ 1762059600000,
+ 1772949600000,
+ 1793509200000,
+ 1805004000000,
+ 1825563600000,
+ 1836453600000,
+ 1857013200000,
+ 1867903200000,
+ 1888462800000,
+ 1899352800000,
+ 1919912400000,
+ 1930802400000,
+ 1951362000000,
+ 1962856800000,
+ 1983416400000,
+ 1994306400000,
+ 2014866000000,
+ 2025756000000,
+ 2046315600000,
+ 2057205600000,
+ 2077765200000,
+ 2088655200000,
+ 2109214800000,
+ 2120104800000,
+ 2140664400000,
+ null
+ ],
+ "offsets": [
+ 300,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240
+ ],
+ "population": 64128
+ },
+ {
+ "name": "America/Monterrey",
+ "abbrs": [
+ "LMT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1514743200000,
+ 576057600000,
+ 594198000000,
+ 828864000000,
+ 846399600000,
+ 860313600000,
+ 877849200000,
+ 891763200000,
+ 909298800000,
+ 923212800000,
+ 941353200000,
+ 954662400000,
+ 972802800000,
+ 989136000000,
+ 1001833200000,
+ 1018166400000,
+ 1035702000000,
+ 1049616000000,
+ 1067151600000,
+ 1081065600000,
+ 1099206000000,
+ 1112515200000,
+ 1130655600000,
+ 1143964800000,
+ 1162105200000,
+ 1175414400000,
+ 1193554800000,
+ 1207468800000,
+ 1225004400000,
+ 1238918400000,
+ 1256454000000,
+ 1270368000000,
+ 1288508400000,
+ 1301817600000,
+ 1319958000000,
+ 1333267200000,
+ 1351407600000,
+ 1365321600000,
+ 1382857200000,
+ 1396771200000,
+ 1414306800000,
+ 1428220800000,
+ 1445756400000,
+ 1459670400000,
+ 1477810800000,
+ 1491120000000,
+ 1509260400000,
+ 1522569600000,
+ 1540710000000,
+ 1554624000000,
+ 1572159600000,
+ 1586073600000,
+ 1603609200000,
+ 1617523200000,
+ 1635663600000,
+ 1648972800000,
+ 1667113200000,
+ 1680422400000,
+ 1698562800000,
+ 1712476800000,
+ 1730012400000,
+ 1743926400000,
+ 1761462000000,
+ 1775376000000,
+ 1792911600000,
+ 1806825600000,
+ 1824966000000,
+ 1838275200000,
+ 1856415600000,
+ 1869724800000,
+ 1887865200000,
+ 1901779200000,
+ 1919314800000,
+ 1933228800000,
+ 1950764400000,
+ 1964678400000,
+ 1982818800000,
+ 1996128000000,
+ 2014268400000,
+ 2027577600000,
+ 2045718000000,
+ 2059027200000,
+ 2077167600000,
+ 2091081600000,
+ 2108617200000,
+ 2122531200000,
+ 2140066800000,
+ null
+ ],
+ "offsets": [
+ 401.2667,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 4083000
+ },
+ {
+ "name": "America/Montevideo",
+ "abbrs": [
+ "LMT",
+ "MMT",
+ "-04",
+ "-03",
+ "-0330",
+ "-03",
+ "-0330",
+ "-03",
+ "-0330",
+ "-03",
+ "-0330",
+ "-03",
+ "-0330",
+ "-03",
+ "-0330",
+ "-03",
+ "-0330",
+ "-03",
+ "-0330",
+ "-03",
+ "-0330",
+ "-03",
+ "-0330",
+ "-03",
+ "-0330",
+ "-03",
+ "-0230",
+ "-03",
+ "-0230",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-0230",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-0130",
+ "-0230",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1942690509000,
+ -1567455309000,
+ -1459627200000,
+ -1443819600000,
+ -1428006600000,
+ -1412283600000,
+ -1396470600000,
+ -1380747600000,
+ -1141590600000,
+ -1128286800000,
+ -1110141000000,
+ -1096837200000,
+ -1078691400000,
+ -1065387600000,
+ -1047241800000,
+ -1033938000000,
+ -1015187400000,
+ -1002488400000,
+ -983737800000,
+ -971038800000,
+ -954707400000,
+ -938984400000,
+ -920838600000,
+ -907534800000,
+ -896819400000,
+ -853621200000,
+ -845847000000,
+ -334789200000,
+ -319671000000,
+ -314226000000,
+ -309996000000,
+ -149720400000,
+ -134604000000,
+ -50446800000,
+ -34205400000,
+ 9860400000,
+ 14176800000,
+ 72846000000,
+ 80100000000,
+ 127278000000,
+ 132111000000,
+ 147234600000,
+ 156913200000,
+ 165376800000,
+ 219812400000,
+ 226461600000,
+ 250052400000,
+ 257911200000,
+ 282711600000,
+ 289360800000,
+ 294202800000,
+ 322020000000,
+ 566449200000,
+ 573012000000,
+ 597812400000,
+ 605066400000,
+ 625633200000,
+ 635911200000,
+ 656478000000,
+ 667965600000,
+ 688532400000,
+ 699415200000,
+ 719377200000,
+ 730864800000,
+ 1095562800000,
+ 1111896000000,
+ 1128834000000,
+ 1142136000000,
+ 1159678800000,
+ 1173585600000,
+ 1191733200000,
+ 1205035200000,
+ 1223182800000,
+ 1236484800000,
+ 1254632400000,
+ 1268539200000,
+ 1286082000000,
+ 1299988800000,
+ 1317531600000,
+ 1331438400000,
+ 1349586000000,
+ 1362888000000,
+ 1381035600000,
+ 1394337600000,
+ 1412485200000,
+ 1425787200000,
+ null
+ ],
+ "offsets": [
+ 224.85,
+ 224.85,
+ 240,
+ 180,
+ 210,
+ 180,
+ 210,
+ 180,
+ 210,
+ 180,
+ 210,
+ 180,
+ 210,
+ 180,
+ 210,
+ 180,
+ 210,
+ 180,
+ 210,
+ 180,
+ 210,
+ 180,
+ 210,
+ 180,
+ 210,
+ 180,
+ 150,
+ 180,
+ 150,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 150,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 90,
+ 150,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 1700000
+ },
+ {
+ "name": "America/Montreal",
+ "abbrs": [
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EWT",
+ "EPT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1632070800000,
+ -1615140000000,
+ -1601753400000,
+ -1583697600000,
+ -1567357200000,
+ -1554667200000,
+ -1534698000000,
+ -1524074400000,
+ -1503248400000,
+ -1492365600000,
+ -1471798800000,
+ -1460916000000,
+ -1440954000000,
+ -1428861600000,
+ -1409504400000,
+ -1397412000000,
+ -1378054800000,
+ -1365962400000,
+ -1346605200000,
+ -1333908000000,
+ -1315155600000,
+ -1301853600000,
+ -1283706000000,
+ -1270404000000,
+ -1252256400000,
+ -1238954400000,
+ -1220806800000,
+ -1207504800000,
+ -1188752400000,
+ -1176055200000,
+ -1157302800000,
+ -1144000800000,
+ -1125853200000,
+ -1112551200000,
+ -1094403600000,
+ -1081101600000,
+ -1062954000000,
+ -1049652000000,
+ -1031504400000,
+ -1018202400000,
+ -1000054800000,
+ -986752800000,
+ -968000400000,
+ -955303200000,
+ -936550800000,
+ -880218000000,
+ -769395600000,
+ -765396000000,
+ -747248400000,
+ -733946400000,
+ -715806000000,
+ -702504000000,
+ -684356400000,
+ -671054400000,
+ -652906800000,
+ -634161600000,
+ -620845200000,
+ -602704800000,
+ -589395600000,
+ -576093600000,
+ -557946000000,
+ -544644000000,
+ -526496400000,
+ -513194400000,
+ -495046800000,
+ -481744800000,
+ -463597200000,
+ -450295200000,
+ -431542800000,
+ -418240800000,
+ -400093200000,
+ -384372000000,
+ -368643600000,
+ -352922400000,
+ -337194000000,
+ -321472800000,
+ -305744400000,
+ -289418400000,
+ -273690000000,
+ -257968800000,
+ -242240400000,
+ -226519200000,
+ -210790800000,
+ -195069600000,
+ -179341200000,
+ -163620000000,
+ -147891600000,
+ -131565600000,
+ -116442000000,
+ -100116000000,
+ -84387600000,
+ -68666400000,
+ -52938000000,
+ -37216800000,
+ -21488400000,
+ -5767200000,
+ 9961200000,
+ 25682400000,
+ 41410800000,
+ 57736800000,
+ 73465200000,
+ 89186400000,
+ 104914800000,
+ 120636000000,
+ 136364400000,
+ 152085600000,
+ 167814000000,
+ 183535200000,
+ 199263600000,
+ 215589600000,
+ 230713200000,
+ 247039200000,
+ 262767600000,
+ 278488800000,
+ 294217200000,
+ 309938400000,
+ 325666800000,
+ 341388000000,
+ 357116400000,
+ 372837600000,
+ 388566000000,
+ 404892000000,
+ 420015600000,
+ 436341600000,
+ 452070000000,
+ 467791200000,
+ 483519600000,
+ 499240800000,
+ 514969200000,
+ 530690400000,
+ 544604400000,
+ 562140000000,
+ 576054000000,
+ 594194400000,
+ 607503600000,
+ 625644000000,
+ 638953200000,
+ 657093600000,
+ 671007600000,
+ 688543200000,
+ 702457200000,
+ 719992800000,
+ 733906800000,
+ 752047200000,
+ 765356400000,
+ 783496800000,
+ 796806000000,
+ 814946400000,
+ 828860400000,
+ 846396000000,
+ 860310000000,
+ 877845600000,
+ 891759600000,
+ 909295200000,
+ 923209200000,
+ 941349600000,
+ 954658800000,
+ 972799200000,
+ 986108400000,
+ 1004248800000,
+ 1018162800000,
+ 1035698400000,
+ 1049612400000,
+ 1067148000000,
+ 1081062000000,
+ 1099202400000,
+ 1112511600000,
+ 1130652000000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 240,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Montserrat",
+ "abbrs": [
+ "LMT",
+ "AST"
+ ],
+ "untils": [
+ -1825098836000,
+ null
+ ],
+ "offsets": [
+ 246.0667,
+ 240
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Nassau",
+ "abbrs": [
+ "LMT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1825095030000,
+ -179341200000,
+ -163620000000,
+ -147891600000,
+ -131565600000,
+ -116442000000,
+ -100116000000,
+ -84387600000,
+ -68666400000,
+ -52938000000,
+ -37216800000,
+ -21488400000,
+ -5767200000,
+ 9961200000,
+ 25682400000,
+ 41410800000,
+ 57736800000,
+ 73465200000,
+ 89186400000,
+ 104914800000,
+ 120636000000,
+ 136364400000,
+ 152085600000,
+ 167814000000,
+ 183535200000,
+ 199263600000,
+ 215589600000,
+ 230713200000,
+ 247039200000,
+ 262767600000,
+ 278488800000,
+ 294217200000,
+ 309938400000,
+ 325666800000,
+ 341388000000,
+ 357116400000,
+ 372837600000,
+ 388566000000,
+ 404892000000,
+ 420015600000,
+ 436341600000,
+ 452070000000,
+ 467791200000,
+ 483519600000,
+ 499240800000,
+ 514969200000,
+ 530690400000,
+ 544604400000,
+ 562140000000,
+ 576054000000,
+ 594194400000,
+ 607503600000,
+ 625644000000,
+ 638953200000,
+ 657093600000,
+ 671007600000,
+ 688543200000,
+ 702457200000,
+ 719992800000,
+ 733906800000,
+ 752047200000,
+ 765356400000,
+ 783496800000,
+ 796806000000,
+ 814946400000,
+ 828860400000,
+ 846396000000,
+ 860310000000,
+ 877845600000,
+ 891759600000,
+ 909295200000,
+ 923209200000,
+ 941349600000,
+ 954658800000,
+ 972799200000,
+ 986108400000,
+ 1004248800000,
+ 1018162800000,
+ 1035698400000,
+ 1049612400000,
+ 1067148000000,
+ 1081062000000,
+ 1099202400000,
+ 1112511600000,
+ 1130652000000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 309.5,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 244400
+ },
+ {
+ "name": "America/New_York",
+ "abbrs": [
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EWT",
+ "EPT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1633280400000,
+ -1615140000000,
+ -1601830800000,
+ -1583690400000,
+ -1570381200000,
+ -1551636000000,
+ -1536512400000,
+ -1523210400000,
+ -1504458000000,
+ -1491760800000,
+ -1473008400000,
+ -1459706400000,
+ -1441558800000,
+ -1428256800000,
+ -1410109200000,
+ -1396807200000,
+ -1378659600000,
+ -1365357600000,
+ -1347210000000,
+ -1333908000000,
+ -1315155600000,
+ -1301853600000,
+ -1283706000000,
+ -1270404000000,
+ -1252256400000,
+ -1238954400000,
+ -1220806800000,
+ -1207504800000,
+ -1189357200000,
+ -1176055200000,
+ -1157302800000,
+ -1144605600000,
+ -1125853200000,
+ -1112551200000,
+ -1094403600000,
+ -1081101600000,
+ -1062954000000,
+ -1049652000000,
+ -1031504400000,
+ -1018202400000,
+ -1000054800000,
+ -986752800000,
+ -968000400000,
+ -955303200000,
+ -936550800000,
+ -923248800000,
+ -905101200000,
+ -891799200000,
+ -880218000000,
+ -769395600000,
+ -765396000000,
+ -747248400000,
+ -733946400000,
+ -715798800000,
+ -702496800000,
+ -684349200000,
+ -671047200000,
+ -652899600000,
+ -639597600000,
+ -620845200000,
+ -608148000000,
+ -589395600000,
+ -576093600000,
+ -557946000000,
+ -544644000000,
+ -526496400000,
+ -513194400000,
+ -495046800000,
+ -481744800000,
+ -463597200000,
+ -447271200000,
+ -431542800000,
+ -415821600000,
+ -400093200000,
+ -384372000000,
+ -368643600000,
+ -352922400000,
+ -337194000000,
+ -321472800000,
+ -305744400000,
+ -289418400000,
+ -273690000000,
+ -257968800000,
+ -242240400000,
+ -226519200000,
+ -210790800000,
+ -195069600000,
+ -179341200000,
+ -163620000000,
+ -147891600000,
+ -131565600000,
+ -116442000000,
+ -100116000000,
+ -84387600000,
+ -68666400000,
+ -52938000000,
+ -37216800000,
+ -21488400000,
+ -5767200000,
+ 9961200000,
+ 25682400000,
+ 41410800000,
+ 57736800000,
+ 73465200000,
+ 89186400000,
+ 104914800000,
+ 120636000000,
+ 126687600000,
+ 152085600000,
+ 162370800000,
+ 183535200000,
+ 199263600000,
+ 215589600000,
+ 230713200000,
+ 247039200000,
+ 262767600000,
+ 278488800000,
+ 294217200000,
+ 309938400000,
+ 325666800000,
+ 341388000000,
+ 357116400000,
+ 372837600000,
+ 388566000000,
+ 404892000000,
+ 420015600000,
+ 436341600000,
+ 452070000000,
+ 467791200000,
+ 483519600000,
+ 499240800000,
+ 514969200000,
+ 530690400000,
+ 544604400000,
+ 562140000000,
+ 576054000000,
+ 594194400000,
+ 607503600000,
+ 625644000000,
+ 638953200000,
+ 657093600000,
+ 671007600000,
+ 688543200000,
+ 702457200000,
+ 719992800000,
+ 733906800000,
+ 752047200000,
+ 765356400000,
+ 783496800000,
+ 796806000000,
+ 814946400000,
+ 828860400000,
+ 846396000000,
+ 860310000000,
+ 877845600000,
+ 891759600000,
+ 909295200000,
+ 923209200000,
+ 941349600000,
+ 954658800000,
+ 972799200000,
+ 986108400000,
+ 1004248800000,
+ 1018162800000,
+ 1035698400000,
+ 1049612400000,
+ 1067148000000,
+ 1081062000000,
+ 1099202400000,
+ 1112511600000,
+ 1130652000000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 20630000
+ },
+ {
+ "name": "America/Nipigon",
+ "abbrs": [
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EWT",
+ "EPT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1632070800000,
+ -1615140000000,
+ -923252400000,
+ -880218000000,
+ -769395600000,
+ -765396000000,
+ 136364400000,
+ 152085600000,
+ 167814000000,
+ 183535200000,
+ 199263600000,
+ 215589600000,
+ 230713200000,
+ 247039200000,
+ 262767600000,
+ 278488800000,
+ 294217200000,
+ 309938400000,
+ 325666800000,
+ 341388000000,
+ 357116400000,
+ 372837600000,
+ 388566000000,
+ 404892000000,
+ 420015600000,
+ 436341600000,
+ 452070000000,
+ 467791200000,
+ 483519600000,
+ 499240800000,
+ 514969200000,
+ 530690400000,
+ 544604400000,
+ 562140000000,
+ 576054000000,
+ 594194400000,
+ 607503600000,
+ 625644000000,
+ 638953200000,
+ 657093600000,
+ 671007600000,
+ 688543200000,
+ 702457200000,
+ 719992800000,
+ 733906800000,
+ 752047200000,
+ 765356400000,
+ 783496800000,
+ 796806000000,
+ 814946400000,
+ 828860400000,
+ 846396000000,
+ 860310000000,
+ 877845600000,
+ 891759600000,
+ 909295200000,
+ 923209200000,
+ 941349600000,
+ 954658800000,
+ 972799200000,
+ 986108400000,
+ 1004248800000,
+ 1018162800000,
+ 1035698400000,
+ 1049612400000,
+ 1067148000000,
+ 1081062000000,
+ 1099202400000,
+ 1112511600000,
+ 1130652000000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 300,
+ 240,
+ 300,
+ 240,
+ 240,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 1631
+ },
+ {
+ "name": "America/Nome",
+ "abbrs": [
+ "NST",
+ "NWT",
+ "NPT",
+ "NST",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "YST",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST"
+ ],
+ "untils": [
+ -880196400000,
+ -769395600000,
+ -765374400000,
+ -86878800000,
+ -21466800000,
+ -5745600000,
+ 9982800000,
+ 25704000000,
+ 41432400000,
+ 57758400000,
+ 73486800000,
+ 89208000000,
+ 104936400000,
+ 120657600000,
+ 126709200000,
+ 152107200000,
+ 162392400000,
+ 183556800000,
+ 199285200000,
+ 215611200000,
+ 230734800000,
+ 247060800000,
+ 262789200000,
+ 278510400000,
+ 294238800000,
+ 309960000000,
+ 325688400000,
+ 341409600000,
+ 357138000000,
+ 372859200000,
+ 388587600000,
+ 404913600000,
+ 420037200000,
+ 436363200000,
+ 439030800000,
+ 452084400000,
+ 467805600000,
+ 483534000000,
+ 499255200000,
+ 514983600000,
+ 530704800000,
+ 544618800000,
+ 562154400000,
+ 576068400000,
+ 594208800000,
+ 607518000000,
+ 625658400000,
+ 638967600000,
+ 657108000000,
+ 671022000000,
+ 688557600000,
+ 702471600000,
+ 720007200000,
+ 733921200000,
+ 752061600000,
+ 765370800000,
+ 783511200000,
+ 796820400000,
+ 814960800000,
+ 828874800000,
+ 846410400000,
+ 860324400000,
+ 877860000000,
+ 891774000000,
+ 909309600000,
+ 923223600000,
+ 941364000000,
+ 954673200000,
+ 972813600000,
+ 986122800000,
+ 1004263200000,
+ 1018177200000,
+ 1035712800000,
+ 1049626800000,
+ 1067162400000,
+ 1081076400000,
+ 1099216800000,
+ 1112526000000,
+ 1130666400000,
+ 1143975600000,
+ 1162116000000,
+ 1173610800000,
+ 1194170400000,
+ 1205060400000,
+ 1225620000000,
+ 1236510000000,
+ 1257069600000,
+ 1268564400000,
+ 1289124000000,
+ 1300014000000,
+ 1320573600000,
+ 1331463600000,
+ 1352023200000,
+ 1362913200000,
+ 1383472800000,
+ 1394362800000,
+ 1414922400000,
+ 1425812400000,
+ 1446372000000,
+ 1457866800000,
+ 1478426400000,
+ 1489316400000,
+ 1509876000000,
+ 1520766000000,
+ 1541325600000,
+ 1552215600000,
+ 1572775200000,
+ 1583665200000,
+ 1604224800000,
+ 1615719600000,
+ 1636279200000,
+ 1647169200000,
+ 1667728800000,
+ 1678618800000,
+ 1699178400000,
+ 1710068400000,
+ 1730628000000,
+ 1741518000000,
+ 1762077600000,
+ 1772967600000,
+ 1793527200000,
+ 1805022000000,
+ 1825581600000,
+ 1836471600000,
+ 1857031200000,
+ 1867921200000,
+ 1888480800000,
+ 1899370800000,
+ 1919930400000,
+ 1930820400000,
+ 1951380000000,
+ 1962874800000,
+ 1983434400000,
+ 1994324400000,
+ 2014884000000,
+ 2025774000000,
+ 2046333600000,
+ 2057223600000,
+ 2077783200000,
+ 2088673200000,
+ 2109232800000,
+ 2120122800000,
+ 2140682400000,
+ null
+ ],
+ "offsets": [
+ 660,
+ 600,
+ 600,
+ 660,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 540,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540
+ ],
+ "population": 3797
+ },
+ {
+ "name": "America/Noronha",
+ "abbrs": [
+ "LMT",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02"
+ ],
+ "untils": [
+ -1767217820000,
+ -1206961200000,
+ -1191366000000,
+ -1175378400000,
+ -1159830000000,
+ -633823200000,
+ -622072800000,
+ -602287200000,
+ -591836400000,
+ -570751200000,
+ -560214000000,
+ -539128800000,
+ -531356400000,
+ -191368800000,
+ -184201200000,
+ -155167200000,
+ -150073200000,
+ -128901600000,
+ -121129200000,
+ -99957600000,
+ -89593200000,
+ -68421600000,
+ -57970800000,
+ 499744800000,
+ 511232400000,
+ 530589600000,
+ 540262800000,
+ 562125600000,
+ 571194000000,
+ 592970400000,
+ 602038800000,
+ 624420000000,
+ 634698000000,
+ 938916000000,
+ 951613200000,
+ 970970400000,
+ 971571600000,
+ 1003024800000,
+ 1013907600000,
+ null
+ ],
+ "offsets": [
+ 129.6667,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120
+ ],
+ "population": 3012
+ },
+ {
+ "name": "America/North_Dakota/Beulah",
+ "abbrs": [
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MWT",
+ "MPT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1633273200000,
+ -1615132800000,
+ -1601823600000,
+ -1583683200000,
+ -880210800000,
+ -769395600000,
+ -765388800000,
+ -84380400000,
+ -68659200000,
+ -52930800000,
+ -37209600000,
+ -21481200000,
+ -5760000000,
+ 9968400000,
+ 25689600000,
+ 41418000000,
+ 57744000000,
+ 73472400000,
+ 89193600000,
+ 104922000000,
+ 120643200000,
+ 126694800000,
+ 152092800000,
+ 162378000000,
+ 183542400000,
+ 199270800000,
+ 215596800000,
+ 230720400000,
+ 247046400000,
+ 262774800000,
+ 278496000000,
+ 294224400000,
+ 309945600000,
+ 325674000000,
+ 341395200000,
+ 357123600000,
+ 372844800000,
+ 388573200000,
+ 404899200000,
+ 420022800000,
+ 436348800000,
+ 452077200000,
+ 467798400000,
+ 483526800000,
+ 499248000000,
+ 514976400000,
+ 530697600000,
+ 544611600000,
+ 562147200000,
+ 576061200000,
+ 594201600000,
+ 607510800000,
+ 625651200000,
+ 638960400000,
+ 657100800000,
+ 671014800000,
+ 688550400000,
+ 702464400000,
+ 720000000000,
+ 733914000000,
+ 752054400000,
+ 765363600000,
+ 783504000000,
+ 796813200000,
+ 814953600000,
+ 828867600000,
+ 846403200000,
+ 860317200000,
+ 877852800000,
+ 891766800000,
+ 909302400000,
+ 923216400000,
+ 941356800000,
+ 954666000000,
+ 972806400000,
+ 986115600000,
+ 1004256000000,
+ 1018170000000,
+ 1035705600000,
+ 1049619600000,
+ 1067155200000,
+ 1081069200000,
+ 1099209600000,
+ 1112518800000,
+ 1130659200000,
+ 1143968400000,
+ 1162108800000,
+ 1173603600000,
+ 1194163200000,
+ 1205053200000,
+ 1225612800000,
+ 1236502800000,
+ 1257062400000,
+ 1268557200000,
+ 1289116800000,
+ 1300003200000,
+ 1320562800000,
+ 1331452800000,
+ 1352012400000,
+ 1362902400000,
+ 1383462000000,
+ 1394352000000,
+ 1414911600000,
+ 1425801600000,
+ 1446361200000,
+ 1457856000000,
+ 1478415600000,
+ 1489305600000,
+ 1509865200000,
+ 1520755200000,
+ 1541314800000,
+ 1552204800000,
+ 1572764400000,
+ 1583654400000,
+ 1604214000000,
+ 1615708800000,
+ 1636268400000,
+ 1647158400000,
+ 1667718000000,
+ 1678608000000,
+ 1699167600000,
+ 1710057600000,
+ 1730617200000,
+ 1741507200000,
+ 1762066800000,
+ 1772956800000,
+ 1793516400000,
+ 1805011200000,
+ 1825570800000,
+ 1836460800000,
+ 1857020400000,
+ 1867910400000,
+ 1888470000000,
+ 1899360000000,
+ 1919919600000,
+ 1930809600000,
+ 1951369200000,
+ 1962864000000,
+ 1983423600000,
+ 1994313600000,
+ 2014873200000,
+ 2025763200000,
+ 2046322800000,
+ 2057212800000,
+ 2077772400000,
+ 2088662400000,
+ 2109222000000,
+ 2120112000000,
+ 2140671600000,
+ null
+ ],
+ "offsets": [
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/North_Dakota/Center",
+ "abbrs": [
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MWT",
+ "MPT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1633273200000,
+ -1615132800000,
+ -1601823600000,
+ -1583683200000,
+ -880210800000,
+ -769395600000,
+ -765388800000,
+ -84380400000,
+ -68659200000,
+ -52930800000,
+ -37209600000,
+ -21481200000,
+ -5760000000,
+ 9968400000,
+ 25689600000,
+ 41418000000,
+ 57744000000,
+ 73472400000,
+ 89193600000,
+ 104922000000,
+ 120643200000,
+ 126694800000,
+ 152092800000,
+ 162378000000,
+ 183542400000,
+ 199270800000,
+ 215596800000,
+ 230720400000,
+ 247046400000,
+ 262774800000,
+ 278496000000,
+ 294224400000,
+ 309945600000,
+ 325674000000,
+ 341395200000,
+ 357123600000,
+ 372844800000,
+ 388573200000,
+ 404899200000,
+ 420022800000,
+ 436348800000,
+ 452077200000,
+ 467798400000,
+ 483526800000,
+ 499248000000,
+ 514976400000,
+ 530697600000,
+ 544611600000,
+ 562147200000,
+ 576061200000,
+ 594201600000,
+ 607510800000,
+ 625651200000,
+ 638960400000,
+ 657100800000,
+ 671014800000,
+ 688550400000,
+ 702464400000,
+ 720000000000,
+ 733910400000,
+ 752050800000,
+ 765360000000,
+ 783500400000,
+ 796809600000,
+ 814950000000,
+ 828864000000,
+ 846399600000,
+ 860313600000,
+ 877849200000,
+ 891763200000,
+ 909298800000,
+ 923212800000,
+ 941353200000,
+ 954662400000,
+ 972802800000,
+ 986112000000,
+ 1004252400000,
+ 1018166400000,
+ 1035702000000,
+ 1049616000000,
+ 1067151600000,
+ 1081065600000,
+ 1099206000000,
+ 1112515200000,
+ 1130655600000,
+ 1143964800000,
+ 1162105200000,
+ 1173600000000,
+ 1194159600000,
+ 1205049600000,
+ 1225609200000,
+ 1236499200000,
+ 1257058800000,
+ 1268553600000,
+ 1289113200000,
+ 1300003200000,
+ 1320562800000,
+ 1331452800000,
+ 1352012400000,
+ 1362902400000,
+ 1383462000000,
+ 1394352000000,
+ 1414911600000,
+ 1425801600000,
+ 1446361200000,
+ 1457856000000,
+ 1478415600000,
+ 1489305600000,
+ 1509865200000,
+ 1520755200000,
+ 1541314800000,
+ 1552204800000,
+ 1572764400000,
+ 1583654400000,
+ 1604214000000,
+ 1615708800000,
+ 1636268400000,
+ 1647158400000,
+ 1667718000000,
+ 1678608000000,
+ 1699167600000,
+ 1710057600000,
+ 1730617200000,
+ 1741507200000,
+ 1762066800000,
+ 1772956800000,
+ 1793516400000,
+ 1805011200000,
+ 1825570800000,
+ 1836460800000,
+ 1857020400000,
+ 1867910400000,
+ 1888470000000,
+ 1899360000000,
+ 1919919600000,
+ 1930809600000,
+ 1951369200000,
+ 1962864000000,
+ 1983423600000,
+ 1994313600000,
+ 2014873200000,
+ 2025763200000,
+ 2046322800000,
+ 2057212800000,
+ 2077772400000,
+ 2088662400000,
+ 2109222000000,
+ 2120112000000,
+ 2140671600000,
+ null
+ ],
+ "offsets": [
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/North_Dakota/New_Salem",
+ "abbrs": [
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MWT",
+ "MPT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1633273200000,
+ -1615132800000,
+ -1601823600000,
+ -1583683200000,
+ -880210800000,
+ -769395600000,
+ -765388800000,
+ -84380400000,
+ -68659200000,
+ -52930800000,
+ -37209600000,
+ -21481200000,
+ -5760000000,
+ 9968400000,
+ 25689600000,
+ 41418000000,
+ 57744000000,
+ 73472400000,
+ 89193600000,
+ 104922000000,
+ 120643200000,
+ 126694800000,
+ 152092800000,
+ 162378000000,
+ 183542400000,
+ 199270800000,
+ 215596800000,
+ 230720400000,
+ 247046400000,
+ 262774800000,
+ 278496000000,
+ 294224400000,
+ 309945600000,
+ 325674000000,
+ 341395200000,
+ 357123600000,
+ 372844800000,
+ 388573200000,
+ 404899200000,
+ 420022800000,
+ 436348800000,
+ 452077200000,
+ 467798400000,
+ 483526800000,
+ 499248000000,
+ 514976400000,
+ 530697600000,
+ 544611600000,
+ 562147200000,
+ 576061200000,
+ 594201600000,
+ 607510800000,
+ 625651200000,
+ 638960400000,
+ 657100800000,
+ 671014800000,
+ 688550400000,
+ 702464400000,
+ 720000000000,
+ 733914000000,
+ 752054400000,
+ 765363600000,
+ 783504000000,
+ 796813200000,
+ 814953600000,
+ 828867600000,
+ 846403200000,
+ 860317200000,
+ 877852800000,
+ 891766800000,
+ 909302400000,
+ 923216400000,
+ 941356800000,
+ 954666000000,
+ 972806400000,
+ 986115600000,
+ 1004256000000,
+ 1018170000000,
+ 1035705600000,
+ 1049619600000,
+ 1067155200000,
+ 1081065600000,
+ 1099206000000,
+ 1112515200000,
+ 1130655600000,
+ 1143964800000,
+ 1162105200000,
+ 1173600000000,
+ 1194159600000,
+ 1205049600000,
+ 1225609200000,
+ 1236499200000,
+ 1257058800000,
+ 1268553600000,
+ 1289113200000,
+ 1300003200000,
+ 1320562800000,
+ 1331452800000,
+ 1352012400000,
+ 1362902400000,
+ 1383462000000,
+ 1394352000000,
+ 1414911600000,
+ 1425801600000,
+ 1446361200000,
+ 1457856000000,
+ 1478415600000,
+ 1489305600000,
+ 1509865200000,
+ 1520755200000,
+ 1541314800000,
+ 1552204800000,
+ 1572764400000,
+ 1583654400000,
+ 1604214000000,
+ 1615708800000,
+ 1636268400000,
+ 1647158400000,
+ 1667718000000,
+ 1678608000000,
+ 1699167600000,
+ 1710057600000,
+ 1730617200000,
+ 1741507200000,
+ 1762066800000,
+ 1772956800000,
+ 1793516400000,
+ 1805011200000,
+ 1825570800000,
+ 1836460800000,
+ 1857020400000,
+ 1867910400000,
+ 1888470000000,
+ 1899360000000,
+ 1919919600000,
+ 1930809600000,
+ 1951369200000,
+ 1962864000000,
+ 1983423600000,
+ 1994313600000,
+ 2014873200000,
+ 2025763200000,
+ 2046322800000,
+ 2057212800000,
+ 2077772400000,
+ 2088662400000,
+ 2109222000000,
+ 2120112000000,
+ 2140671600000,
+ null
+ ],
+ "offsets": [
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Ojinaga",
+ "abbrs": [
+ "LMT",
+ "MST",
+ "CST",
+ "MST",
+ "CST",
+ "MST",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST"
+ ],
+ "untils": [
+ -1514739600000,
+ -1343066400000,
+ -1234807200000,
+ -1220292000000,
+ -1207159200000,
+ -1191344400000,
+ 828864000000,
+ 846399600000,
+ 860313600000,
+ 877849200000,
+ 891766800000,
+ 909302400000,
+ 923216400000,
+ 941356800000,
+ 954666000000,
+ 972806400000,
+ 989139600000,
+ 1001836800000,
+ 1018170000000,
+ 1035705600000,
+ 1049619600000,
+ 1067155200000,
+ 1081069200000,
+ 1099209600000,
+ 1112518800000,
+ 1130659200000,
+ 1143968400000,
+ 1162108800000,
+ 1175418000000,
+ 1193558400000,
+ 1207472400000,
+ 1225008000000,
+ 1238922000000,
+ 1256457600000,
+ 1268557200000,
+ 1289116800000,
+ 1300006800000,
+ 1320566400000,
+ 1331456400000,
+ 1352016000000,
+ 1362906000000,
+ 1383465600000,
+ 1394355600000,
+ 1414915200000,
+ 1425805200000,
+ 1446364800000,
+ 1457859600000,
+ 1478419200000,
+ 1489309200000,
+ 1509868800000,
+ 1520758800000,
+ 1541318400000,
+ 1552208400000,
+ 1572768000000,
+ 1583658000000,
+ 1604217600000,
+ 1615712400000,
+ 1636272000000,
+ 1647162000000,
+ 1667721600000,
+ 1678611600000,
+ 1699171200000,
+ 1710061200000,
+ 1730620800000,
+ 1741510800000,
+ 1762070400000,
+ 1772960400000,
+ 1793520000000,
+ 1805014800000,
+ 1825574400000,
+ 1836464400000,
+ 1857024000000,
+ 1867914000000,
+ 1888473600000,
+ 1899363600000,
+ 1919923200000,
+ 1930813200000,
+ 1951372800000,
+ 1962867600000,
+ 1983427200000,
+ 1994317200000,
+ 2014876800000,
+ 2025766800000,
+ 2046326400000,
+ 2057216400000,
+ 2077776000000,
+ 2088666000000,
+ 2109225600000,
+ 2120115600000,
+ 2140675200000,
+ null
+ ],
+ "offsets": [
+ 417.6667,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420
+ ],
+ "population": 22744
+ },
+ {
+ "name": "America/Panama",
+ "abbrs": [
+ "CMT",
+ "EST"
+ ],
+ "untils": [
+ -1946918424000,
+ null
+ ],
+ "offsets": [
+ 319.6,
+ 300
+ ],
+ "population": 1498000
+ },
+ {
+ "name": "America/Pangnirtung",
+ "abbrs": [
+ "-00",
+ "AST",
+ "AWT",
+ "APT",
+ "AST",
+ "ADDT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "CST",
+ "CDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1546300800000,
+ -880221600000,
+ -769395600000,
+ -765399600000,
+ -147902400000,
+ -131572800000,
+ 325663200000,
+ 341384400000,
+ 357112800000,
+ 372834000000,
+ 388562400000,
+ 404888400000,
+ 420012000000,
+ 436338000000,
+ 452066400000,
+ 467787600000,
+ 483516000000,
+ 499237200000,
+ 514965600000,
+ 530686800000,
+ 544600800000,
+ 562136400000,
+ 576050400000,
+ 594190800000,
+ 607500000000,
+ 625640400000,
+ 638949600000,
+ 657090000000,
+ 671004000000,
+ 688539600000,
+ 702453600000,
+ 719989200000,
+ 733903200000,
+ 752043600000,
+ 765352800000,
+ 783493200000,
+ 796802400000,
+ 814946400000,
+ 828860400000,
+ 846396000000,
+ 860310000000,
+ 877845600000,
+ 891759600000,
+ 909295200000,
+ 923209200000,
+ 941349600000,
+ 954662400000,
+ 972802800000,
+ 986108400000,
+ 1004248800000,
+ 1018162800000,
+ 1035698400000,
+ 1049612400000,
+ 1067148000000,
+ 1081062000000,
+ 1099202400000,
+ 1112511600000,
+ 1130652000000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 0,
+ 240,
+ 180,
+ 180,
+ 240,
+ 120,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 360,
+ 300,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 1425
+ },
+ {
+ "name": "America/Paramaribo",
+ "abbrs": [
+ "LMT",
+ "PMT",
+ "PMT",
+ "-0330",
+ "-03"
+ ],
+ "untils": [
+ -1861906760000,
+ -1104524348000,
+ -765317964000,
+ 465449400000,
+ null
+ ],
+ "offsets": [
+ 220.6667,
+ 220.8667,
+ 220.6,
+ 210,
+ 180
+ ],
+ "population": 243556
+ },
+ {
+ "name": "America/Phoenix",
+ "abbrs": [
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MWT",
+ "MST",
+ "MWT",
+ "MST",
+ "MDT",
+ "MST"
+ ],
+ "untils": [
+ -1633273200000,
+ -1615132800000,
+ -1601823600000,
+ -1583683200000,
+ -880210800000,
+ -820519140000,
+ -812653140000,
+ -796845540000,
+ -84380400000,
+ -68659200000,
+ null
+ ],
+ "offsets": [
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420
+ ],
+ "population": 4194000
+ },
+ {
+ "name": "America/Port_of_Spain",
+ "abbrs": [
+ "LMT",
+ "AST"
+ ],
+ "untils": [
+ -1825098836000,
+ null
+ ],
+ "offsets": [
+ 246.0667,
+ 240
+ ],
+ "population": 43396
+ },
+ {
+ "name": "America/Port-au-Prince",
+ "abbrs": [
+ "PPMT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1670483460000,
+ 421218000000,
+ 436334400000,
+ 452062800000,
+ 467784000000,
+ 483512400000,
+ 499233600000,
+ 514962000000,
+ 530683200000,
+ 546411600000,
+ 562132800000,
+ 576050400000,
+ 594194400000,
+ 607500000000,
+ 625644000000,
+ 638949600000,
+ 657093600000,
+ 671004000000,
+ 688543200000,
+ 702453600000,
+ 719992800000,
+ 733903200000,
+ 752047200000,
+ 765352800000,
+ 783496800000,
+ 796802400000,
+ 814946400000,
+ 828856800000,
+ 846396000000,
+ 860306400000,
+ 877845600000,
+ 1112504400000,
+ 1130644800000,
+ 1143954000000,
+ 1162094400000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 289,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 2332000
+ },
+ {
+ "name": "America/Porto_Acre",
+ "abbrs": [
+ "LMT",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05"
+ ],
+ "untils": [
+ -1767209328000,
+ -1206950400000,
+ -1191355200000,
+ -1175367600000,
+ -1159819200000,
+ -633812400000,
+ -622062000000,
+ -602276400000,
+ -591825600000,
+ -570740400000,
+ -560203200000,
+ -539118000000,
+ -531345600000,
+ -191358000000,
+ -184190400000,
+ -155156400000,
+ -150062400000,
+ -128890800000,
+ -121118400000,
+ -99946800000,
+ -89582400000,
+ -68410800000,
+ -57960000000,
+ 499755600000,
+ 511243200000,
+ 530600400000,
+ 540273600000,
+ 562136400000,
+ 571204800000,
+ 1214283600000,
+ 1384056000000,
+ null
+ ],
+ "offsets": [
+ 271.2,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Porto_Velho",
+ "abbrs": [
+ "LMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04"
+ ],
+ "untils": [
+ -1767210264000,
+ -1206954000000,
+ -1191358800000,
+ -1175371200000,
+ -1159822800000,
+ -633816000000,
+ -622065600000,
+ -602280000000,
+ -591829200000,
+ -570744000000,
+ -560206800000,
+ -539121600000,
+ -531349200000,
+ -191361600000,
+ -184194000000,
+ -155160000000,
+ -150066000000,
+ -128894400000,
+ -121122000000,
+ -99950400000,
+ -89586000000,
+ -68414400000,
+ -57963600000,
+ 499752000000,
+ 511239600000,
+ 530596800000,
+ 540270000000,
+ 562132800000,
+ 571201200000,
+ null
+ ],
+ "offsets": [
+ 255.6,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240
+ ],
+ "population": 369259
+ },
+ {
+ "name": "America/Puerto_Rico",
+ "abbrs": [
+ "AST",
+ "AWT",
+ "APT",
+ "AST"
+ ],
+ "untils": [
+ -873057600000,
+ -769395600000,
+ -765399600000,
+ null
+ ],
+ "offsets": [
+ 240,
+ 180,
+ 180,
+ 240
+ ],
+ "population": 2350126
+ },
+ {
+ "name": "America/Punta_Arenas",
+ "abbrs": [
+ "SMT",
+ "-05",
+ "SMT",
+ "-04",
+ "SMT",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03"
+ ],
+ "untils": [
+ -1892661434000,
+ -1688410800000,
+ -1619205434000,
+ -1593806400000,
+ -1335986234000,
+ -1317585600000,
+ -1304362800000,
+ -1286049600000,
+ -1272826800000,
+ -1254513600000,
+ -1241290800000,
+ -1222977600000,
+ -1209754800000,
+ -1191355200000,
+ -1178132400000,
+ -870552000000,
+ -865278000000,
+ -718056000000,
+ -713649600000,
+ -36619200000,
+ -23922000000,
+ -3355200000,
+ 7527600000,
+ 24465600000,
+ 37767600000,
+ 55915200000,
+ 69217200000,
+ 87969600000,
+ 100666800000,
+ 118209600000,
+ 132116400000,
+ 150868800000,
+ 163566000000,
+ 182318400000,
+ 195620400000,
+ 213768000000,
+ 227070000000,
+ 245217600000,
+ 258519600000,
+ 277272000000,
+ 289969200000,
+ 308721600000,
+ 321418800000,
+ 340171200000,
+ 353473200000,
+ 371620800000,
+ 384922800000,
+ 403070400000,
+ 416372400000,
+ 434520000000,
+ 447822000000,
+ 466574400000,
+ 479271600000,
+ 498024000000,
+ 510721200000,
+ 529473600000,
+ 545194800000,
+ 560923200000,
+ 574225200000,
+ 592372800000,
+ 605674800000,
+ 624427200000,
+ 637124400000,
+ 653457600000,
+ 668574000000,
+ 687326400000,
+ 700628400000,
+ 718776000000,
+ 732078000000,
+ 750225600000,
+ 763527600000,
+ 781675200000,
+ 794977200000,
+ 813729600000,
+ 826426800000,
+ 845179200000,
+ 859690800000,
+ 876628800000,
+ 889930800000,
+ 906868800000,
+ 923194800000,
+ 939528000000,
+ 952830000000,
+ 971582400000,
+ 984279600000,
+ 1003032000000,
+ 1015729200000,
+ 1034481600000,
+ 1047178800000,
+ 1065931200000,
+ 1079233200000,
+ 1097380800000,
+ 1110682800000,
+ 1128830400000,
+ 1142132400000,
+ 1160884800000,
+ 1173582000000,
+ 1192334400000,
+ 1206846000000,
+ 1223784000000,
+ 1237086000000,
+ 1255233600000,
+ 1270350000000,
+ 1286683200000,
+ 1304823600000,
+ 1313899200000,
+ 1335668400000,
+ 1346558400000,
+ 1367118000000,
+ 1378612800000,
+ 1398567600000,
+ 1410062400000,
+ 1463281200000,
+ 1471147200000,
+ null
+ ],
+ "offsets": [
+ 282.7667,
+ 300,
+ 282.7667,
+ 240,
+ 282.7667,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Rainy_River",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1632067200000,
+ -1615136400000,
+ -923248800000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ 136368000000,
+ 152089200000,
+ 167817600000,
+ 183538800000,
+ 199267200000,
+ 215593200000,
+ 230716800000,
+ 247042800000,
+ 262771200000,
+ 278492400000,
+ 294220800000,
+ 309942000000,
+ 325670400000,
+ 341391600000,
+ 357120000000,
+ 372841200000,
+ 388569600000,
+ 404895600000,
+ 420019200000,
+ 436345200000,
+ 452073600000,
+ 467794800000,
+ 483523200000,
+ 499244400000,
+ 514972800000,
+ 530694000000,
+ 544608000000,
+ 562143600000,
+ 576057600000,
+ 594198000000,
+ 607507200000,
+ 625647600000,
+ 638956800000,
+ 657097200000,
+ 671011200000,
+ 688546800000,
+ 702460800000,
+ 719996400000,
+ 733910400000,
+ 752050800000,
+ 765360000000,
+ 783500400000,
+ 796809600000,
+ 814950000000,
+ 828864000000,
+ 846399600000,
+ 860313600000,
+ 877849200000,
+ 891763200000,
+ 909298800000,
+ 923212800000,
+ 941353200000,
+ 954662400000,
+ 972802800000,
+ 986112000000,
+ 1004252400000,
+ 1018166400000,
+ 1035702000000,
+ 1049616000000,
+ 1067151600000,
+ 1081065600000,
+ 1099206000000,
+ 1112515200000,
+ 1130655600000,
+ 1143964800000,
+ 1162105200000,
+ 1173600000000,
+ 1194159600000,
+ 1205049600000,
+ 1225609200000,
+ 1236499200000,
+ 1257058800000,
+ 1268553600000,
+ 1289113200000,
+ 1300003200000,
+ 1320562800000,
+ 1331452800000,
+ 1352012400000,
+ 1362902400000,
+ 1383462000000,
+ 1394352000000,
+ 1414911600000,
+ 1425801600000,
+ 1446361200000,
+ 1457856000000,
+ 1478415600000,
+ 1489305600000,
+ 1509865200000,
+ 1520755200000,
+ 1541314800000,
+ 1552204800000,
+ 1572764400000,
+ 1583654400000,
+ 1604214000000,
+ 1615708800000,
+ 1636268400000,
+ 1647158400000,
+ 1667718000000,
+ 1678608000000,
+ 1699167600000,
+ 1710057600000,
+ 1730617200000,
+ 1741507200000,
+ 1762066800000,
+ 1772956800000,
+ 1793516400000,
+ 1805011200000,
+ 1825570800000,
+ 1836460800000,
+ 1857020400000,
+ 1867910400000,
+ 1888470000000,
+ 1899360000000,
+ 1919919600000,
+ 1930809600000,
+ 1951369200000,
+ 1962864000000,
+ 1983423600000,
+ 1994313600000,
+ 2014873200000,
+ 2025763200000,
+ 2046322800000,
+ 2057212800000,
+ 2077772400000,
+ 2088662400000,
+ 2109222000000,
+ 2120112000000,
+ 2140671600000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 842
+ },
+ {
+ "name": "America/Rankin_Inlet",
+ "abbrs": [
+ "-00",
+ "CST",
+ "CDDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "EST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -410227200000,
+ -147895200000,
+ -131565600000,
+ 325670400000,
+ 341391600000,
+ 357120000000,
+ 372841200000,
+ 388569600000,
+ 404895600000,
+ 420019200000,
+ 436345200000,
+ 452073600000,
+ 467794800000,
+ 483523200000,
+ 499244400000,
+ 514972800000,
+ 530694000000,
+ 544608000000,
+ 562143600000,
+ 576057600000,
+ 594198000000,
+ 607507200000,
+ 625647600000,
+ 638956800000,
+ 657097200000,
+ 671011200000,
+ 688546800000,
+ 702460800000,
+ 719996400000,
+ 733910400000,
+ 752050800000,
+ 765360000000,
+ 783500400000,
+ 796809600000,
+ 814950000000,
+ 828864000000,
+ 846399600000,
+ 860313600000,
+ 877849200000,
+ 891763200000,
+ 909298800000,
+ 923212800000,
+ 941353200000,
+ 954662400000,
+ 972802800000,
+ 986112000000,
+ 1004252400000,
+ 1018166400000,
+ 1035702000000,
+ 1049616000000,
+ 1067151600000,
+ 1081065600000,
+ 1099206000000,
+ 1112515200000,
+ 1130655600000,
+ 1143964800000,
+ 1162105200000,
+ 1173600000000,
+ 1194159600000,
+ 1205049600000,
+ 1225609200000,
+ 1236499200000,
+ 1257058800000,
+ 1268553600000,
+ 1289113200000,
+ 1300003200000,
+ 1320562800000,
+ 1331452800000,
+ 1352012400000,
+ 1362902400000,
+ 1383462000000,
+ 1394352000000,
+ 1414911600000,
+ 1425801600000,
+ 1446361200000,
+ 1457856000000,
+ 1478415600000,
+ 1489305600000,
+ 1509865200000,
+ 1520755200000,
+ 1541314800000,
+ 1552204800000,
+ 1572764400000,
+ 1583654400000,
+ 1604214000000,
+ 1615708800000,
+ 1636268400000,
+ 1647158400000,
+ 1667718000000,
+ 1678608000000,
+ 1699167600000,
+ 1710057600000,
+ 1730617200000,
+ 1741507200000,
+ 1762066800000,
+ 1772956800000,
+ 1793516400000,
+ 1805011200000,
+ 1825570800000,
+ 1836460800000,
+ 1857020400000,
+ 1867910400000,
+ 1888470000000,
+ 1899360000000,
+ 1919919600000,
+ 1930809600000,
+ 1951369200000,
+ 1962864000000,
+ 1983423600000,
+ 1994313600000,
+ 2014873200000,
+ 2025763200000,
+ 2046322800000,
+ 2057212800000,
+ 2077772400000,
+ 2088662400000,
+ 2109222000000,
+ 2120112000000,
+ 2140671600000,
+ null
+ ],
+ "offsets": [
+ 0,
+ 360,
+ 240,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 2577
+ },
+ {
+ "name": "America/Recife",
+ "abbrs": [
+ "LMT",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1767217224000,
+ -1206957600000,
+ -1191362400000,
+ -1175374800000,
+ -1159826400000,
+ -633819600000,
+ -622069200000,
+ -602283600000,
+ -591832800000,
+ -570747600000,
+ -560210400000,
+ -539125200000,
+ -531352800000,
+ -191365200000,
+ -184197600000,
+ -155163600000,
+ -150069600000,
+ -128898000000,
+ -121125600000,
+ -99954000000,
+ -89589600000,
+ -68418000000,
+ -57967200000,
+ 499748400000,
+ 511236000000,
+ 530593200000,
+ 540266400000,
+ 562129200000,
+ 571197600000,
+ 592974000000,
+ 602042400000,
+ 624423600000,
+ 634701600000,
+ 938919600000,
+ 951616800000,
+ 970974000000,
+ 971575200000,
+ 1003028400000,
+ 1013911200000,
+ null
+ ],
+ "offsets": [
+ 139.6,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 3347000
+ },
+ {
+ "name": "America/Regina",
+ "abbrs": [
+ "LMT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MWT",
+ "MPT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "CST"
+ ],
+ "untils": [
+ -2030202084000,
+ -1632063600000,
+ -1615132800000,
+ -1251651600000,
+ -1238349600000,
+ -1220202000000,
+ -1206900000000,
+ -1188752400000,
+ -1175450400000,
+ -1156698000000,
+ -1144000800000,
+ -1125248400000,
+ -1111946400000,
+ -1032714000000,
+ -1016992800000,
+ -1001264400000,
+ -986148000000,
+ -969814800000,
+ -954093600000,
+ -937760400000,
+ -922039200000,
+ -906310800000,
+ -890589600000,
+ -880210800000,
+ -769395600000,
+ -765388800000,
+ -748450800000,
+ -732729600000,
+ -715791600000,
+ -702489600000,
+ -684342000000,
+ -671040000000,
+ -652892400000,
+ -639590400000,
+ -620838000000,
+ -608140800000,
+ -589388400000,
+ -576086400000,
+ -557938800000,
+ -544636800000,
+ -526489200000,
+ -513187200000,
+ -495039600000,
+ -481737600000,
+ -463590000000,
+ -450288000000,
+ -431535600000,
+ -418233600000,
+ -400086000000,
+ -386784000000,
+ -337186800000,
+ -321465600000,
+ -305737200000,
+ null
+ ],
+ "offsets": [
+ 418.6,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360
+ ],
+ "population": 193100
+ },
+ {
+ "name": "America/Resolute",
+ "abbrs": [
+ "-00",
+ "CST",
+ "CDDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "EST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "EST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -704937600000,
+ -147895200000,
+ -131565600000,
+ 325670400000,
+ 341391600000,
+ 357120000000,
+ 372841200000,
+ 388569600000,
+ 404895600000,
+ 420019200000,
+ 436345200000,
+ 452073600000,
+ 467794800000,
+ 483523200000,
+ 499244400000,
+ 514972800000,
+ 530694000000,
+ 544608000000,
+ 562143600000,
+ 576057600000,
+ 594198000000,
+ 607507200000,
+ 625647600000,
+ 638956800000,
+ 657097200000,
+ 671011200000,
+ 688546800000,
+ 702460800000,
+ 719996400000,
+ 733910400000,
+ 752050800000,
+ 765360000000,
+ 783500400000,
+ 796809600000,
+ 814950000000,
+ 828864000000,
+ 846399600000,
+ 860313600000,
+ 877849200000,
+ 891763200000,
+ 909298800000,
+ 923212800000,
+ 941353200000,
+ 954662400000,
+ 972802800000,
+ 986112000000,
+ 1004252400000,
+ 1018166400000,
+ 1035702000000,
+ 1049616000000,
+ 1067151600000,
+ 1081065600000,
+ 1099206000000,
+ 1112515200000,
+ 1130655600000,
+ 1143964800000,
+ 1162105200000,
+ 1173600000000,
+ 1194159600000,
+ 1205049600000,
+ 1225609200000,
+ 1236499200000,
+ 1257058800000,
+ 1268553600000,
+ 1289113200000,
+ 1300003200000,
+ 1320562800000,
+ 1331452800000,
+ 1352012400000,
+ 1362902400000,
+ 1383462000000,
+ 1394352000000,
+ 1414911600000,
+ 1425801600000,
+ 1446361200000,
+ 1457856000000,
+ 1478415600000,
+ 1489305600000,
+ 1509865200000,
+ 1520755200000,
+ 1541314800000,
+ 1552204800000,
+ 1572764400000,
+ 1583654400000,
+ 1604214000000,
+ 1615708800000,
+ 1636268400000,
+ 1647158400000,
+ 1667718000000,
+ 1678608000000,
+ 1699167600000,
+ 1710057600000,
+ 1730617200000,
+ 1741507200000,
+ 1762066800000,
+ 1772956800000,
+ 1793516400000,
+ 1805011200000,
+ 1825570800000,
+ 1836460800000,
+ 1857020400000,
+ 1867910400000,
+ 1888470000000,
+ 1899360000000,
+ 1919919600000,
+ 1930809600000,
+ 1951369200000,
+ 1962864000000,
+ 1983423600000,
+ 1994313600000,
+ 2014873200000,
+ 2025763200000,
+ 2046322800000,
+ 2057212800000,
+ 2077772400000,
+ 2088662400000,
+ 2109222000000,
+ 2120112000000,
+ 2140671600000,
+ null
+ ],
+ "offsets": [
+ 0,
+ 360,
+ 240,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 229
+ },
+ {
+ "name": "America/Rio_Branco",
+ "abbrs": [
+ "LMT",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05"
+ ],
+ "untils": [
+ -1767209328000,
+ -1206950400000,
+ -1191355200000,
+ -1175367600000,
+ -1159819200000,
+ -633812400000,
+ -622062000000,
+ -602276400000,
+ -591825600000,
+ -570740400000,
+ -560203200000,
+ -539118000000,
+ -531345600000,
+ -191358000000,
+ -184190400000,
+ -155156400000,
+ -150062400000,
+ -128890800000,
+ -121118400000,
+ -99946800000,
+ -89582400000,
+ -68410800000,
+ -57960000000,
+ 499755600000,
+ 511243200000,
+ 530600400000,
+ 540273600000,
+ 562136400000,
+ 571204800000,
+ 1214283600000,
+ 1384056000000,
+ null
+ ],
+ "offsets": [
+ 271.2,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 308545
+ },
+ {
+ "name": "America/Rosario",
+ "abbrs": [
+ "CMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-04",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03"
+ ],
+ "untils": [
+ -1567453392000,
+ -1233432000000,
+ -1222981200000,
+ -1205956800000,
+ -1194037200000,
+ -1172865600000,
+ -1162501200000,
+ -1141329600000,
+ -1130965200000,
+ -1109793600000,
+ -1099429200000,
+ -1078257600000,
+ -1067806800000,
+ -1046635200000,
+ -1036270800000,
+ -1015099200000,
+ -1004734800000,
+ -983563200000,
+ -973198800000,
+ -952027200000,
+ -941576400000,
+ -931032000000,
+ -900882000000,
+ -890337600000,
+ -833749200000,
+ -827265600000,
+ -752274000000,
+ -733780800000,
+ -197326800000,
+ -190843200000,
+ -184194000000,
+ -164491200000,
+ -152658000000,
+ -132955200000,
+ -121122000000,
+ -101419200000,
+ -86821200000,
+ -71092800000,
+ -54766800000,
+ -39038400000,
+ -23317200000,
+ -7588800000,
+ 128142000000,
+ 136605600000,
+ 596948400000,
+ 605066400000,
+ 624423600000,
+ 636516000000,
+ 656478000000,
+ 667965600000,
+ 687931200000,
+ 699415200000,
+ 719377200000,
+ 731469600000,
+ 1198983600000,
+ 1205632800000,
+ 1224385200000,
+ 1237082400000,
+ null
+ ],
+ "offsets": [
+ 256.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 240,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Santa_Isabel",
+ "abbrs": [
+ "LMT",
+ "MST",
+ "PST",
+ "MST",
+ "PST",
+ "PDT",
+ "PST",
+ "PWT",
+ "PPT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST"
+ ],
+ "untils": [
+ -1514736000000,
+ -1451667600000,
+ -1343062800000,
+ -1234803600000,
+ -1222963200000,
+ -1207242000000,
+ -873820800000,
+ -769395600000,
+ -761677200000,
+ -686073600000,
+ -661539600000,
+ -495039600000,
+ -481734000000,
+ -463590000000,
+ -450284400000,
+ -431535600000,
+ -418230000000,
+ -400086000000,
+ -386780400000,
+ -368636400000,
+ -355330800000,
+ -337186800000,
+ -323881200000,
+ -305737200000,
+ -292431600000,
+ 199274400000,
+ 215600400000,
+ 230724000000,
+ 247050000000,
+ 262778400000,
+ 278499600000,
+ 294228000000,
+ 309949200000,
+ 325677600000,
+ 341398800000,
+ 357127200000,
+ 372848400000,
+ 388576800000,
+ 404902800000,
+ 420026400000,
+ 436352400000,
+ 452080800000,
+ 467802000000,
+ 483530400000,
+ 499251600000,
+ 514980000000,
+ 530701200000,
+ 544615200000,
+ 562150800000,
+ 576064800000,
+ 594205200000,
+ 607514400000,
+ 625654800000,
+ 638964000000,
+ 657104400000,
+ 671018400000,
+ 688554000000,
+ 702468000000,
+ 720003600000,
+ 733917600000,
+ 752058000000,
+ 765367200000,
+ 783507600000,
+ 796816800000,
+ 814957200000,
+ 828871200000,
+ 846406800000,
+ 860320800000,
+ 877856400000,
+ 891770400000,
+ 909306000000,
+ 923220000000,
+ 941360400000,
+ 954669600000,
+ 972810000000,
+ 986119200000,
+ 1004259600000,
+ 1018173600000,
+ 1035709200000,
+ 1049623200000,
+ 1067158800000,
+ 1081072800000,
+ 1099213200000,
+ 1112522400000,
+ 1130662800000,
+ 1143972000000,
+ 1162112400000,
+ 1175421600000,
+ 1193562000000,
+ 1207476000000,
+ 1225011600000,
+ 1238925600000,
+ 1256461200000,
+ 1268560800000,
+ 1289120400000,
+ 1300010400000,
+ 1320570000000,
+ 1331460000000,
+ 1352019600000,
+ 1362909600000,
+ 1383469200000,
+ 1394359200000,
+ 1414918800000,
+ 1425808800000,
+ 1446368400000,
+ 1457863200000,
+ 1478422800000,
+ 1489312800000,
+ 1509872400000,
+ 1520762400000,
+ 1541322000000,
+ 1552212000000,
+ 1572771600000,
+ 1583661600000,
+ 1604221200000,
+ 1615716000000,
+ 1636275600000,
+ 1647165600000,
+ 1667725200000,
+ 1678615200000,
+ 1699174800000,
+ 1710064800000,
+ 1730624400000,
+ 1741514400000,
+ 1762074000000,
+ 1772964000000,
+ 1793523600000,
+ 1805018400000,
+ 1825578000000,
+ 1836468000000,
+ 1857027600000,
+ 1867917600000,
+ 1888477200000,
+ 1899367200000,
+ 1919926800000,
+ 1930816800000,
+ 1951376400000,
+ 1962871200000,
+ 1983430800000,
+ 1994320800000,
+ 2014880400000,
+ 2025770400000,
+ 2046330000000,
+ 2057220000000,
+ 2077779600000,
+ 2088669600000,
+ 2109229200000,
+ 2120119200000,
+ 2140678800000,
+ null
+ ],
+ "offsets": [
+ 468.0667,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480
+ ],
+ "population": 23389
+ },
+ {
+ "name": "America/Santarem",
+ "abbrs": [
+ "LMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03"
+ ],
+ "untils": [
+ -1767212472000,
+ -1206954000000,
+ -1191358800000,
+ -1175371200000,
+ -1159822800000,
+ -633816000000,
+ -622065600000,
+ -602280000000,
+ -591829200000,
+ -570744000000,
+ -560206800000,
+ -539121600000,
+ -531349200000,
+ -191361600000,
+ -184194000000,
+ -155160000000,
+ -150066000000,
+ -128894400000,
+ -121122000000,
+ -99950400000,
+ -89586000000,
+ -68414400000,
+ -57963600000,
+ 499752000000,
+ 511239600000,
+ 530596800000,
+ 540270000000,
+ 562132800000,
+ 571201200000,
+ 1214280000000,
+ null
+ ],
+ "offsets": [
+ 218.8,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180
+ ],
+ "population": 205711
+ },
+ {
+ "name": "America/Santiago",
+ "abbrs": [
+ "SMT",
+ "-05",
+ "SMT",
+ "-04",
+ "SMT",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-03",
+ "-04",
+ "-05",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03"
+ ],
+ "untils": [
+ -1892661434000,
+ -1688410800000,
+ -1619205434000,
+ -1593806400000,
+ -1335986234000,
+ -1317585600000,
+ -1304362800000,
+ -1286049600000,
+ -1272826800000,
+ -1254513600000,
+ -1241290800000,
+ -1222977600000,
+ -1209754800000,
+ -1191355200000,
+ -1178132400000,
+ -870552000000,
+ -865278000000,
+ -740520000000,
+ -736376400000,
+ -718056000000,
+ -713649600000,
+ -36619200000,
+ -23922000000,
+ -3355200000,
+ 7527600000,
+ 24465600000,
+ 37767600000,
+ 55915200000,
+ 69217200000,
+ 87969600000,
+ 100666800000,
+ 118209600000,
+ 132116400000,
+ 150868800000,
+ 163566000000,
+ 182318400000,
+ 195620400000,
+ 213768000000,
+ 227070000000,
+ 245217600000,
+ 258519600000,
+ 277272000000,
+ 289969200000,
+ 308721600000,
+ 321418800000,
+ 340171200000,
+ 353473200000,
+ 371620800000,
+ 384922800000,
+ 403070400000,
+ 416372400000,
+ 434520000000,
+ 447822000000,
+ 466574400000,
+ 479271600000,
+ 498024000000,
+ 510721200000,
+ 529473600000,
+ 545194800000,
+ 560923200000,
+ 574225200000,
+ 592372800000,
+ 605674800000,
+ 624427200000,
+ 637124400000,
+ 653457600000,
+ 668574000000,
+ 687326400000,
+ 700628400000,
+ 718776000000,
+ 732078000000,
+ 750225600000,
+ 763527600000,
+ 781675200000,
+ 794977200000,
+ 813729600000,
+ 826426800000,
+ 845179200000,
+ 859690800000,
+ 876628800000,
+ 889930800000,
+ 906868800000,
+ 923194800000,
+ 939528000000,
+ 952830000000,
+ 971582400000,
+ 984279600000,
+ 1003032000000,
+ 1015729200000,
+ 1034481600000,
+ 1047178800000,
+ 1065931200000,
+ 1079233200000,
+ 1097380800000,
+ 1110682800000,
+ 1128830400000,
+ 1142132400000,
+ 1160884800000,
+ 1173582000000,
+ 1192334400000,
+ 1206846000000,
+ 1223784000000,
+ 1237086000000,
+ 1255233600000,
+ 1270350000000,
+ 1286683200000,
+ 1304823600000,
+ 1313899200000,
+ 1335668400000,
+ 1346558400000,
+ 1367118000000,
+ 1378612800000,
+ 1398567600000,
+ 1410062400000,
+ 1463281200000,
+ 1471147200000,
+ 1494730800000,
+ 1502596800000,
+ 1526180400000,
+ 1534046400000,
+ 1557630000000,
+ 1565496000000,
+ 1589079600000,
+ 1596945600000,
+ 1620529200000,
+ 1629000000000,
+ 1652583600000,
+ 1660449600000,
+ 1684033200000,
+ 1691899200000,
+ 1715482800000,
+ 1723348800000,
+ 1746932400000,
+ 1754798400000,
+ 1778382000000,
+ 1786248000000,
+ 1809831600000,
+ 1818302400000,
+ 1841886000000,
+ 1849752000000,
+ 1873335600000,
+ 1881201600000,
+ 1904785200000,
+ 1912651200000,
+ 1936234800000,
+ 1944100800000,
+ 1967684400000,
+ 1976155200000,
+ 1999738800000,
+ 2007604800000,
+ 2031188400000,
+ 2039054400000,
+ 2062638000000,
+ 2070504000000,
+ 2094087600000,
+ 2101953600000,
+ 2125537200000,
+ 2133403200000,
+ null
+ ],
+ "offsets": [
+ 282.7667,
+ 300,
+ 282.7667,
+ 240,
+ 282.7667,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 180,
+ 240,
+ 300,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180
+ ],
+ "population": 6225000
+ },
+ {
+ "name": "America/Santo_Domingo",
+ "abbrs": [
+ "SDMT",
+ "EST",
+ "EDT",
+ "EST",
+ "-0430",
+ "EST",
+ "-0430",
+ "EST",
+ "-0430",
+ "EST",
+ "-0430",
+ "EST",
+ "-0430",
+ "EST",
+ "AST",
+ "EST",
+ "AST"
+ ],
+ "untils": [
+ -1159773600000,
+ -100119600000,
+ -89668800000,
+ -5770800000,
+ 4422600000,
+ 25678800000,
+ 33193800000,
+ 57733200000,
+ 64816200000,
+ 89182800000,
+ 96438600000,
+ 120632400000,
+ 127974600000,
+ 152082000000,
+ 972799200000,
+ 975823200000,
+ null
+ ],
+ "offsets": [
+ 280,
+ 300,
+ 240,
+ 300,
+ 270,
+ 300,
+ 270,
+ 300,
+ 270,
+ 300,
+ 270,
+ 300,
+ 270,
+ 300,
+ 240,
+ 300,
+ 240
+ ],
+ "population": 2925000
+ },
+ {
+ "name": "America/Sao_Paulo",
+ "abbrs": [
+ "LMT",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02"
+ ],
+ "untils": [
+ -1767214412000,
+ -1206957600000,
+ -1191362400000,
+ -1175374800000,
+ -1159826400000,
+ -633819600000,
+ -622069200000,
+ -602283600000,
+ -591832800000,
+ -570747600000,
+ -560210400000,
+ -539125200000,
+ -531352800000,
+ -195426000000,
+ -184197600000,
+ -155163600000,
+ -150069600000,
+ -128898000000,
+ -121125600000,
+ -99954000000,
+ -89589600000,
+ -68418000000,
+ -57967200000,
+ 499748400000,
+ 511236000000,
+ 530593200000,
+ 540266400000,
+ 562129200000,
+ 571197600000,
+ 592974000000,
+ 602042400000,
+ 624423600000,
+ 634701600000,
+ 656478000000,
+ 666756000000,
+ 687927600000,
+ 697600800000,
+ 719982000000,
+ 728445600000,
+ 750826800000,
+ 761709600000,
+ 782276400000,
+ 793159200000,
+ 813726000000,
+ 824004000000,
+ 844570800000,
+ 856058400000,
+ 876106800000,
+ 888717600000,
+ 908074800000,
+ 919562400000,
+ 938919600000,
+ 951616800000,
+ 970974000000,
+ 982461600000,
+ 1003028400000,
+ 1013911200000,
+ 1036292400000,
+ 1045360800000,
+ 1066532400000,
+ 1076810400000,
+ 1099364400000,
+ 1108864800000,
+ 1129431600000,
+ 1140314400000,
+ 1162695600000,
+ 1172368800000,
+ 1192330800000,
+ 1203213600000,
+ 1224385200000,
+ 1234663200000,
+ 1255834800000,
+ 1266717600000,
+ 1287284400000,
+ 1298167200000,
+ 1318734000000,
+ 1330221600000,
+ 1350788400000,
+ 1361066400000,
+ 1382238000000,
+ 1392516000000,
+ 1413687600000,
+ 1424570400000,
+ 1445137200000,
+ 1456020000000,
+ 1476586800000,
+ 1487469600000,
+ 1508036400000,
+ 1518919200000,
+ 1541300400000,
+ 1550368800000,
+ 1572750000000,
+ 1581818400000,
+ 1604199600000,
+ 1613872800000,
+ 1636254000000,
+ 1645322400000,
+ 1667703600000,
+ 1677376800000,
+ 1699153200000,
+ 1708221600000,
+ 1730602800000,
+ 1739671200000,
+ 1762052400000,
+ 1771725600000,
+ 1793502000000,
+ 1803175200000,
+ 1825556400000,
+ 1834624800000,
+ 1857006000000,
+ 1866074400000,
+ 1888455600000,
+ 1897524000000,
+ 1919905200000,
+ 1928973600000,
+ 1951354800000,
+ 1960423200000,
+ 1983409200000,
+ 1992477600000,
+ 2014858800000,
+ 2024532000000,
+ 2046308400000,
+ 2055376800000,
+ 2077758000000,
+ 2086826400000,
+ 2109207600000,
+ 2118880800000,
+ 2140657200000,
+ null
+ ],
+ "offsets": [
+ 186.4667,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120
+ ],
+ "population": 20365000
+ },
+ {
+ "name": "America/Scoresbysund",
+ "abbrs": [
+ "LMT",
+ "-02",
+ "-01",
+ "-02",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01"
+ ],
+ "untils": [
+ -1686090728000,
+ 323841600000,
+ 338961600000,
+ 354679200000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 87.8667,
+ 120,
+ 60,
+ 120,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60
+ ],
+ "population": 452
+ },
+ {
+ "name": "America/Shiprock",
+ "abbrs": [
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MWT",
+ "MPT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST"
+ ],
+ "untils": [
+ -1633273200000,
+ -1615132800000,
+ -1601823600000,
+ -1583683200000,
+ -1570374000000,
+ -1551628800000,
+ -1538924400000,
+ -1534089600000,
+ -880210800000,
+ -769395600000,
+ -765388800000,
+ -147884400000,
+ -131558400000,
+ -116434800000,
+ -100108800000,
+ -84380400000,
+ -68659200000,
+ -52930800000,
+ -37209600000,
+ -21481200000,
+ -5760000000,
+ 9968400000,
+ 25689600000,
+ 41418000000,
+ 57744000000,
+ 73472400000,
+ 89193600000,
+ 104922000000,
+ 120643200000,
+ 126694800000,
+ 152092800000,
+ 162378000000,
+ 183542400000,
+ 199270800000,
+ 215596800000,
+ 230720400000,
+ 247046400000,
+ 262774800000,
+ 278496000000,
+ 294224400000,
+ 309945600000,
+ 325674000000,
+ 341395200000,
+ 357123600000,
+ 372844800000,
+ 388573200000,
+ 404899200000,
+ 420022800000,
+ 436348800000,
+ 452077200000,
+ 467798400000,
+ 483526800000,
+ 499248000000,
+ 514976400000,
+ 530697600000,
+ 544611600000,
+ 562147200000,
+ 576061200000,
+ 594201600000,
+ 607510800000,
+ 625651200000,
+ 638960400000,
+ 657100800000,
+ 671014800000,
+ 688550400000,
+ 702464400000,
+ 720000000000,
+ 733914000000,
+ 752054400000,
+ 765363600000,
+ 783504000000,
+ 796813200000,
+ 814953600000,
+ 828867600000,
+ 846403200000,
+ 860317200000,
+ 877852800000,
+ 891766800000,
+ 909302400000,
+ 923216400000,
+ 941356800000,
+ 954666000000,
+ 972806400000,
+ 986115600000,
+ 1004256000000,
+ 1018170000000,
+ 1035705600000,
+ 1049619600000,
+ 1067155200000,
+ 1081069200000,
+ 1099209600000,
+ 1112518800000,
+ 1130659200000,
+ 1143968400000,
+ 1162108800000,
+ 1173603600000,
+ 1194163200000,
+ 1205053200000,
+ 1225612800000,
+ 1236502800000,
+ 1257062400000,
+ 1268557200000,
+ 1289116800000,
+ 1300006800000,
+ 1320566400000,
+ 1331456400000,
+ 1352016000000,
+ 1362906000000,
+ 1383465600000,
+ 1394355600000,
+ 1414915200000,
+ 1425805200000,
+ 1446364800000,
+ 1457859600000,
+ 1478419200000,
+ 1489309200000,
+ 1509868800000,
+ 1520758800000,
+ 1541318400000,
+ 1552208400000,
+ 1572768000000,
+ 1583658000000,
+ 1604217600000,
+ 1615712400000,
+ 1636272000000,
+ 1647162000000,
+ 1667721600000,
+ 1678611600000,
+ 1699171200000,
+ 1710061200000,
+ 1730620800000,
+ 1741510800000,
+ 1762070400000,
+ 1772960400000,
+ 1793520000000,
+ 1805014800000,
+ 1825574400000,
+ 1836464400000,
+ 1857024000000,
+ 1867914000000,
+ 1888473600000,
+ 1899363600000,
+ 1919923200000,
+ 1930813200000,
+ 1951372800000,
+ 1962867600000,
+ 1983427200000,
+ 1994317200000,
+ 2014876800000,
+ 2025766800000,
+ 2046326400000,
+ 2057216400000,
+ 2077776000000,
+ 2088666000000,
+ 2109225600000,
+ 2120115600000,
+ 2140675200000,
+ null
+ ],
+ "offsets": [
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Sitka",
+ "abbrs": [
+ "PST",
+ "PWT",
+ "PPT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "YST",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST"
+ ],
+ "untils": [
+ -880207200000,
+ -769395600000,
+ -765385200000,
+ -21477600000,
+ -5756400000,
+ 9972000000,
+ 25693200000,
+ 41421600000,
+ 57747600000,
+ 73476000000,
+ 89197200000,
+ 104925600000,
+ 120646800000,
+ 126698400000,
+ 152096400000,
+ 162381600000,
+ 183546000000,
+ 199274400000,
+ 215600400000,
+ 230724000000,
+ 247050000000,
+ 262778400000,
+ 278499600000,
+ 294228000000,
+ 309949200000,
+ 325677600000,
+ 341398800000,
+ 357127200000,
+ 372848400000,
+ 388576800000,
+ 404902800000,
+ 420026400000,
+ 436352400000,
+ 439030800000,
+ 452084400000,
+ 467805600000,
+ 483534000000,
+ 499255200000,
+ 514983600000,
+ 530704800000,
+ 544618800000,
+ 562154400000,
+ 576068400000,
+ 594208800000,
+ 607518000000,
+ 625658400000,
+ 638967600000,
+ 657108000000,
+ 671022000000,
+ 688557600000,
+ 702471600000,
+ 720007200000,
+ 733921200000,
+ 752061600000,
+ 765370800000,
+ 783511200000,
+ 796820400000,
+ 814960800000,
+ 828874800000,
+ 846410400000,
+ 860324400000,
+ 877860000000,
+ 891774000000,
+ 909309600000,
+ 923223600000,
+ 941364000000,
+ 954673200000,
+ 972813600000,
+ 986122800000,
+ 1004263200000,
+ 1018177200000,
+ 1035712800000,
+ 1049626800000,
+ 1067162400000,
+ 1081076400000,
+ 1099216800000,
+ 1112526000000,
+ 1130666400000,
+ 1143975600000,
+ 1162116000000,
+ 1173610800000,
+ 1194170400000,
+ 1205060400000,
+ 1225620000000,
+ 1236510000000,
+ 1257069600000,
+ 1268564400000,
+ 1289124000000,
+ 1300014000000,
+ 1320573600000,
+ 1331463600000,
+ 1352023200000,
+ 1362913200000,
+ 1383472800000,
+ 1394362800000,
+ 1414922400000,
+ 1425812400000,
+ 1446372000000,
+ 1457866800000,
+ 1478426400000,
+ 1489316400000,
+ 1509876000000,
+ 1520766000000,
+ 1541325600000,
+ 1552215600000,
+ 1572775200000,
+ 1583665200000,
+ 1604224800000,
+ 1615719600000,
+ 1636279200000,
+ 1647169200000,
+ 1667728800000,
+ 1678618800000,
+ 1699178400000,
+ 1710068400000,
+ 1730628000000,
+ 1741518000000,
+ 1762077600000,
+ 1772967600000,
+ 1793527200000,
+ 1805022000000,
+ 1825581600000,
+ 1836471600000,
+ 1857031200000,
+ 1867921200000,
+ 1888480800000,
+ 1899370800000,
+ 1919930400000,
+ 1930820400000,
+ 1951380000000,
+ 1962874800000,
+ 1983434400000,
+ 1994324400000,
+ 2014884000000,
+ 2025774000000,
+ 2046333600000,
+ 2057223600000,
+ 2077783200000,
+ 2088673200000,
+ 2109232800000,
+ 2120122800000,
+ 2140682400000,
+ null
+ ],
+ "offsets": [
+ 480,
+ 420,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 540,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540
+ ],
+ "population": 9020
+ },
+ {
+ "name": "America/St_Barthelemy",
+ "abbrs": [
+ "LMT",
+ "AST"
+ ],
+ "untils": [
+ -1825098836000,
+ null
+ ],
+ "offsets": [
+ 246.0667,
+ 240
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/St_Johns",
+ "abbrs": [
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NWT",
+ "NPT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST"
+ ],
+ "untils": [
+ -1664130548000,
+ -1650137348000,
+ -1632076148000,
+ -1615145348000,
+ -1598650148000,
+ -1590100148000,
+ -1567286948000,
+ -1551565748000,
+ -1535837348000,
+ -1520116148000,
+ -1503782948000,
+ -1488666548000,
+ -1472333348000,
+ -1457216948000,
+ -1440883748000,
+ -1425767348000,
+ -1409434148000,
+ -1394317748000,
+ -1377984548000,
+ -1362263348000,
+ -1346534948000,
+ -1330813748000,
+ -1314480548000,
+ -1299364148000,
+ -1283030948000,
+ -1267914548000,
+ -1251581348000,
+ -1236464948000,
+ -1220131748000,
+ -1205015348000,
+ -1188682148000,
+ -1172960948000,
+ -1156627748000,
+ -1141511348000,
+ -1125178148000,
+ -1110061748000,
+ -1096921748000,
+ -1093728600000,
+ -1078612200000,
+ -1061670600000,
+ -1048973400000,
+ -1030221000000,
+ -1017523800000,
+ -998771400000,
+ -986074200000,
+ -966717000000,
+ -954624600000,
+ -935267400000,
+ -922570200000,
+ -903817800000,
+ -891120600000,
+ -872368200000,
+ -769395600000,
+ -765401400000,
+ -746044200000,
+ -733347000000,
+ -714594600000,
+ -701897400000,
+ -683145000000,
+ -670447800000,
+ -651695400000,
+ -638998200000,
+ -619641000000,
+ -606943800000,
+ -589401000000,
+ -576099000000,
+ -557951400000,
+ -544649400000,
+ -526501800000,
+ -513199800000,
+ -495052200000,
+ -481750200000,
+ -463602600000,
+ -450300600000,
+ -431548200000,
+ -418246200000,
+ -400098600000,
+ -386796600000,
+ -368649000000,
+ -355347000000,
+ -337199400000,
+ -323897400000,
+ -305749800000,
+ -289423800000,
+ -273695400000,
+ -257974200000,
+ -242245800000,
+ -226524600000,
+ -210796200000,
+ -195075000000,
+ -179346600000,
+ -163625400000,
+ -147897000000,
+ -131571000000,
+ -116447400000,
+ -100121400000,
+ -84393000000,
+ -68671800000,
+ -52943400000,
+ -37222200000,
+ -21493800000,
+ -5772600000,
+ 9955800000,
+ 25677000000,
+ 41405400000,
+ 57731400000,
+ 73459800000,
+ 89181000000,
+ 104909400000,
+ 120630600000,
+ 136359000000,
+ 152080200000,
+ 167808600000,
+ 183529800000,
+ 199258200000,
+ 215584200000,
+ 230707800000,
+ 247033800000,
+ 262762200000,
+ 278483400000,
+ 294211800000,
+ 309933000000,
+ 325661400000,
+ 341382600000,
+ 357111000000,
+ 372832200000,
+ 388560600000,
+ 404886600000,
+ 420010200000,
+ 436336200000,
+ 452064600000,
+ 467785800000,
+ 483514200000,
+ 499235400000,
+ 514963800000,
+ 530685000000,
+ 544591860000,
+ 562127460000,
+ 576041460000,
+ 594178260000,
+ 607491060000,
+ 625631460000,
+ 638940660000,
+ 657081060000,
+ 670995060000,
+ 688530660000,
+ 702444660000,
+ 719980260000,
+ 733894260000,
+ 752034660000,
+ 765343860000,
+ 783484260000,
+ 796793460000,
+ 814933860000,
+ 828847860000,
+ 846383460000,
+ 860297460000,
+ 877833060000,
+ 891747060000,
+ 909282660000,
+ 923196660000,
+ 941337060000,
+ 954646260000,
+ 972786660000,
+ 986095860000,
+ 1004236260000,
+ 1018150260000,
+ 1035685860000,
+ 1049599860000,
+ 1067135460000,
+ 1081049460000,
+ 1099189860000,
+ 1112499060000,
+ 1130639460000,
+ 1143948660000,
+ 1162089060000,
+ 1173583860000,
+ 1194143460000,
+ 1205033460000,
+ 1225593060000,
+ 1236483060000,
+ 1257042660000,
+ 1268537460000,
+ 1289097060000,
+ 1299987060000,
+ 1320553800000,
+ 1331443800000,
+ 1352003400000,
+ 1362893400000,
+ 1383453000000,
+ 1394343000000,
+ 1414902600000,
+ 1425792600000,
+ 1446352200000,
+ 1457847000000,
+ 1478406600000,
+ 1489296600000,
+ 1509856200000,
+ 1520746200000,
+ 1541305800000,
+ 1552195800000,
+ 1572755400000,
+ 1583645400000,
+ 1604205000000,
+ 1615699800000,
+ 1636259400000,
+ 1647149400000,
+ 1667709000000,
+ 1678599000000,
+ 1699158600000,
+ 1710048600000,
+ 1730608200000,
+ 1741498200000,
+ 1762057800000,
+ 1772947800000,
+ 1793507400000,
+ 1805002200000,
+ 1825561800000,
+ 1836451800000,
+ 1857011400000,
+ 1867901400000,
+ 1888461000000,
+ 1899351000000,
+ 1919910600000,
+ 1930800600000,
+ 1951360200000,
+ 1962855000000,
+ 1983414600000,
+ 1994304600000,
+ 2014864200000,
+ 2025754200000,
+ 2046313800000,
+ 2057203800000,
+ 2077763400000,
+ 2088653400000,
+ 2109213000000,
+ 2120103000000,
+ 2140662600000,
+ null
+ ],
+ "offsets": [
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 90,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210
+ ],
+ "population": 106172
+ },
+ {
+ "name": "America/St_Kitts",
+ "abbrs": [
+ "LMT",
+ "AST"
+ ],
+ "untils": [
+ -1825098836000,
+ null
+ ],
+ "offsets": [
+ 246.0667,
+ 240
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/St_Lucia",
+ "abbrs": [
+ "LMT",
+ "AST"
+ ],
+ "untils": [
+ -1825098836000,
+ null
+ ],
+ "offsets": [
+ 246.0667,
+ 240
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/St_Thomas",
+ "abbrs": [
+ "LMT",
+ "AST"
+ ],
+ "untils": [
+ -1825098836000,
+ null
+ ],
+ "offsets": [
+ 246.0667,
+ 240
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/St_Vincent",
+ "abbrs": [
+ "LMT",
+ "AST"
+ ],
+ "untils": [
+ -1825098836000,
+ null
+ ],
+ "offsets": [
+ 246.0667,
+ 240
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Swift_Current",
+ "abbrs": [
+ "LMT",
+ "MST",
+ "MDT",
+ "MST",
+ "MWT",
+ "MPT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "CST"
+ ],
+ "untils": [
+ -2030201320000,
+ -1632063600000,
+ -1615132800000,
+ -880210800000,
+ -769395600000,
+ -765388800000,
+ -747241200000,
+ -732729600000,
+ -715791600000,
+ -702489600000,
+ -684342000000,
+ -671040000000,
+ -652892400000,
+ -639590400000,
+ -400086000000,
+ -384364800000,
+ -337186800000,
+ -321465600000,
+ -305737200000,
+ -292435200000,
+ -273682800000,
+ -260985600000,
+ 73472400000,
+ null
+ ],
+ "offsets": [
+ 431.3333,
+ 420,
+ 360,
+ 420,
+ 360,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360
+ ],
+ "population": 15503
+ },
+ {
+ "name": "America/Tegucigalpa",
+ "abbrs": [
+ "LMT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1538503868000,
+ 547020000000,
+ 559717200000,
+ 578469600000,
+ 591166800000,
+ 1146981600000,
+ 1154926800000,
+ null
+ ],
+ "offsets": [
+ 348.8667,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 1120000
+ },
+ {
+ "name": "America/Thule",
+ "abbrs": [
+ "LMT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST"
+ ],
+ "untils": [
+ -1686079492000,
+ 670399200000,
+ 686120400000,
+ 701848800000,
+ 717570000000,
+ 733903200000,
+ 752043600000,
+ 765352800000,
+ 783493200000,
+ 796802400000,
+ 814942800000,
+ 828856800000,
+ 846392400000,
+ 860306400000,
+ 877842000000,
+ 891756000000,
+ 909291600000,
+ 923205600000,
+ 941346000000,
+ 954655200000,
+ 972795600000,
+ 986104800000,
+ 1004245200000,
+ 1018159200000,
+ 1035694800000,
+ 1049608800000,
+ 1067144400000,
+ 1081058400000,
+ 1099198800000,
+ 1112508000000,
+ 1130648400000,
+ 1143957600000,
+ 1162098000000,
+ 1173592800000,
+ 1194152400000,
+ 1205042400000,
+ 1225602000000,
+ 1236492000000,
+ 1257051600000,
+ 1268546400000,
+ 1289106000000,
+ 1299996000000,
+ 1320555600000,
+ 1331445600000,
+ 1352005200000,
+ 1362895200000,
+ 1383454800000,
+ 1394344800000,
+ 1414904400000,
+ 1425794400000,
+ 1446354000000,
+ 1457848800000,
+ 1478408400000,
+ 1489298400000,
+ 1509858000000,
+ 1520748000000,
+ 1541307600000,
+ 1552197600000,
+ 1572757200000,
+ 1583647200000,
+ 1604206800000,
+ 1615701600000,
+ 1636261200000,
+ 1647151200000,
+ 1667710800000,
+ 1678600800000,
+ 1699160400000,
+ 1710050400000,
+ 1730610000000,
+ 1741500000000,
+ 1762059600000,
+ 1772949600000,
+ 1793509200000,
+ 1805004000000,
+ 1825563600000,
+ 1836453600000,
+ 1857013200000,
+ 1867903200000,
+ 1888462800000,
+ 1899352800000,
+ 1919912400000,
+ 1930802400000,
+ 1951362000000,
+ 1962856800000,
+ 1983416400000,
+ 1994306400000,
+ 2014866000000,
+ 2025756000000,
+ 2046315600000,
+ 2057205600000,
+ 2077765200000,
+ 2088655200000,
+ 2109214800000,
+ 2120104800000,
+ 2140664400000,
+ null
+ ],
+ "offsets": [
+ 275.1333,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240
+ ],
+ "population": 656
+ },
+ {
+ "name": "America/Thunder_Bay",
+ "abbrs": [
+ "CST",
+ "EST",
+ "EWT",
+ "EPT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1893434400000,
+ -880218000000,
+ -769395600000,
+ -765396000000,
+ 9961200000,
+ 25682400000,
+ 41410800000,
+ 57736800000,
+ 73465200000,
+ 89186400000,
+ 136364400000,
+ 152085600000,
+ 167814000000,
+ 183535200000,
+ 199263600000,
+ 215589600000,
+ 230713200000,
+ 247039200000,
+ 262767600000,
+ 278488800000,
+ 294217200000,
+ 309938400000,
+ 325666800000,
+ 341388000000,
+ 357116400000,
+ 372837600000,
+ 388566000000,
+ 404892000000,
+ 420015600000,
+ 436341600000,
+ 452070000000,
+ 467791200000,
+ 483519600000,
+ 499240800000,
+ 514969200000,
+ 530690400000,
+ 544604400000,
+ 562140000000,
+ 576054000000,
+ 594194400000,
+ 607503600000,
+ 625644000000,
+ 638953200000,
+ 657093600000,
+ 671007600000,
+ 688543200000,
+ 702457200000,
+ 719992800000,
+ 733906800000,
+ 752047200000,
+ 765356400000,
+ 783496800000,
+ 796806000000,
+ 814946400000,
+ 828860400000,
+ 846396000000,
+ 860310000000,
+ 877845600000,
+ 891759600000,
+ 909295200000,
+ 923209200000,
+ 941349600000,
+ 954658800000,
+ 972799200000,
+ 986108400000,
+ 1004248800000,
+ 1018162800000,
+ 1035698400000,
+ 1049612400000,
+ 1067148000000,
+ 1081062000000,
+ 1099202400000,
+ 1112511600000,
+ 1130652000000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 240,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 109140
+ },
+ {
+ "name": "America/Tijuana",
+ "abbrs": [
+ "LMT",
+ "MST",
+ "PST",
+ "MST",
+ "PST",
+ "PDT",
+ "PST",
+ "PWT",
+ "PPT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST"
+ ],
+ "untils": [
+ -1514736000000,
+ -1451667600000,
+ -1343062800000,
+ -1234803600000,
+ -1222963200000,
+ -1207242000000,
+ -873820800000,
+ -769395600000,
+ -761677200000,
+ -686073600000,
+ -661539600000,
+ -495039600000,
+ -481734000000,
+ -463590000000,
+ -450284400000,
+ -431535600000,
+ -418230000000,
+ -400086000000,
+ -386780400000,
+ -368636400000,
+ -355330800000,
+ -337186800000,
+ -323881200000,
+ -305737200000,
+ -292431600000,
+ 199274400000,
+ 215600400000,
+ 230724000000,
+ 247050000000,
+ 262778400000,
+ 278499600000,
+ 294228000000,
+ 309949200000,
+ 325677600000,
+ 341398800000,
+ 357127200000,
+ 372848400000,
+ 388576800000,
+ 404902800000,
+ 420026400000,
+ 436352400000,
+ 452080800000,
+ 467802000000,
+ 483530400000,
+ 499251600000,
+ 514980000000,
+ 530701200000,
+ 544615200000,
+ 562150800000,
+ 576064800000,
+ 594205200000,
+ 607514400000,
+ 625654800000,
+ 638964000000,
+ 657104400000,
+ 671018400000,
+ 688554000000,
+ 702468000000,
+ 720003600000,
+ 733917600000,
+ 752058000000,
+ 765367200000,
+ 783507600000,
+ 796816800000,
+ 814957200000,
+ 828871200000,
+ 846406800000,
+ 860320800000,
+ 877856400000,
+ 891770400000,
+ 909306000000,
+ 923220000000,
+ 941360400000,
+ 954669600000,
+ 972810000000,
+ 986119200000,
+ 1004259600000,
+ 1018173600000,
+ 1035709200000,
+ 1049623200000,
+ 1067158800000,
+ 1081072800000,
+ 1099213200000,
+ 1112522400000,
+ 1130662800000,
+ 1143972000000,
+ 1162112400000,
+ 1175421600000,
+ 1193562000000,
+ 1207476000000,
+ 1225011600000,
+ 1238925600000,
+ 1256461200000,
+ 1268560800000,
+ 1289120400000,
+ 1300010400000,
+ 1320570000000,
+ 1331460000000,
+ 1352019600000,
+ 1362909600000,
+ 1383469200000,
+ 1394359200000,
+ 1414918800000,
+ 1425808800000,
+ 1446368400000,
+ 1457863200000,
+ 1478422800000,
+ 1489312800000,
+ 1509872400000,
+ 1520762400000,
+ 1541322000000,
+ 1552212000000,
+ 1572771600000,
+ 1583661600000,
+ 1604221200000,
+ 1615716000000,
+ 1636275600000,
+ 1647165600000,
+ 1667725200000,
+ 1678615200000,
+ 1699174800000,
+ 1710064800000,
+ 1730624400000,
+ 1741514400000,
+ 1762074000000,
+ 1772964000000,
+ 1793523600000,
+ 1805018400000,
+ 1825578000000,
+ 1836468000000,
+ 1857027600000,
+ 1867917600000,
+ 1888477200000,
+ 1899367200000,
+ 1919926800000,
+ 1930816800000,
+ 1951376400000,
+ 1962871200000,
+ 1983430800000,
+ 1994320800000,
+ 2014880400000,
+ 2025770400000,
+ 2046330000000,
+ 2057220000000,
+ 2077779600000,
+ 2088669600000,
+ 2109229200000,
+ 2120119200000,
+ 2140678800000,
+ null
+ ],
+ "offsets": [
+ 468.0667,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480
+ ],
+ "population": 1968000
+ },
+ {
+ "name": "America/Toronto",
+ "abbrs": [
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EWT",
+ "EPT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1632070800000,
+ -1615140000000,
+ -1601753400000,
+ -1583697600000,
+ -1567357200000,
+ -1554667200000,
+ -1534698000000,
+ -1524074400000,
+ -1503248400000,
+ -1492365600000,
+ -1471798800000,
+ -1460916000000,
+ -1440954000000,
+ -1428861600000,
+ -1409504400000,
+ -1397412000000,
+ -1378054800000,
+ -1365962400000,
+ -1346605200000,
+ -1333908000000,
+ -1315155600000,
+ -1301853600000,
+ -1283706000000,
+ -1270404000000,
+ -1252256400000,
+ -1238954400000,
+ -1220806800000,
+ -1207504800000,
+ -1188752400000,
+ -1176055200000,
+ -1157302800000,
+ -1144000800000,
+ -1125853200000,
+ -1112551200000,
+ -1094403600000,
+ -1081101600000,
+ -1062954000000,
+ -1049652000000,
+ -1031504400000,
+ -1018202400000,
+ -1000054800000,
+ -986752800000,
+ -968000400000,
+ -955303200000,
+ -936550800000,
+ -880218000000,
+ -769395600000,
+ -765396000000,
+ -747248400000,
+ -733946400000,
+ -715806000000,
+ -702504000000,
+ -684356400000,
+ -671054400000,
+ -652906800000,
+ -634161600000,
+ -620845200000,
+ -602704800000,
+ -589395600000,
+ -576093600000,
+ -557946000000,
+ -544644000000,
+ -526496400000,
+ -513194400000,
+ -495046800000,
+ -481744800000,
+ -463597200000,
+ -450295200000,
+ -431542800000,
+ -418240800000,
+ -400093200000,
+ -384372000000,
+ -368643600000,
+ -352922400000,
+ -337194000000,
+ -321472800000,
+ -305744400000,
+ -289418400000,
+ -273690000000,
+ -257968800000,
+ -242240400000,
+ -226519200000,
+ -210790800000,
+ -195069600000,
+ -179341200000,
+ -163620000000,
+ -147891600000,
+ -131565600000,
+ -116442000000,
+ -100116000000,
+ -84387600000,
+ -68666400000,
+ -52938000000,
+ -37216800000,
+ -21488400000,
+ -5767200000,
+ 9961200000,
+ 25682400000,
+ 41410800000,
+ 57736800000,
+ 73465200000,
+ 89186400000,
+ 104914800000,
+ 120636000000,
+ 136364400000,
+ 152085600000,
+ 167814000000,
+ 183535200000,
+ 199263600000,
+ 215589600000,
+ 230713200000,
+ 247039200000,
+ 262767600000,
+ 278488800000,
+ 294217200000,
+ 309938400000,
+ 325666800000,
+ 341388000000,
+ 357116400000,
+ 372837600000,
+ 388566000000,
+ 404892000000,
+ 420015600000,
+ 436341600000,
+ 452070000000,
+ 467791200000,
+ 483519600000,
+ 499240800000,
+ 514969200000,
+ 530690400000,
+ 544604400000,
+ 562140000000,
+ 576054000000,
+ 594194400000,
+ 607503600000,
+ 625644000000,
+ 638953200000,
+ 657093600000,
+ 671007600000,
+ 688543200000,
+ 702457200000,
+ 719992800000,
+ 733906800000,
+ 752047200000,
+ 765356400000,
+ 783496800000,
+ 796806000000,
+ 814946400000,
+ 828860400000,
+ 846396000000,
+ 860310000000,
+ 877845600000,
+ 891759600000,
+ 909295200000,
+ 923209200000,
+ 941349600000,
+ 954658800000,
+ 972799200000,
+ 986108400000,
+ 1004248800000,
+ 1018162800000,
+ 1035698400000,
+ 1049612400000,
+ 1067148000000,
+ 1081062000000,
+ 1099202400000,
+ 1112511600000,
+ 1130652000000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 240,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 6456000
+ },
+ {
+ "name": "America/Tortola",
+ "abbrs": [
+ "LMT",
+ "AST"
+ ],
+ "untils": [
+ -1825098836000,
+ null
+ ],
+ "offsets": [
+ 246.0667,
+ 240
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Vancouver",
+ "abbrs": [
+ "PST",
+ "PDT",
+ "PST",
+ "PWT",
+ "PPT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST"
+ ],
+ "untils": [
+ -1632060000000,
+ -1615129200000,
+ -880207200000,
+ -769395600000,
+ -765385200000,
+ -747237600000,
+ -732726000000,
+ -715788000000,
+ -702486000000,
+ -684338400000,
+ -671036400000,
+ -652888800000,
+ -639586800000,
+ -620834400000,
+ -608137200000,
+ -589384800000,
+ -576082800000,
+ -557935200000,
+ -544633200000,
+ -526485600000,
+ -513183600000,
+ -495036000000,
+ -481734000000,
+ -463586400000,
+ -450284400000,
+ -431532000000,
+ -418230000000,
+ -400082400000,
+ -386780400000,
+ -368632800000,
+ -355330800000,
+ -337183200000,
+ -323881200000,
+ -305733600000,
+ -292431600000,
+ -273679200000,
+ -260982000000,
+ -242229600000,
+ -226508400000,
+ -210780000000,
+ -195058800000,
+ -179330400000,
+ -163609200000,
+ -147880800000,
+ -131554800000,
+ -116431200000,
+ -100105200000,
+ -84376800000,
+ -68655600000,
+ -52927200000,
+ -37206000000,
+ -21477600000,
+ -5756400000,
+ 9972000000,
+ 25693200000,
+ 41421600000,
+ 57747600000,
+ 73476000000,
+ 89197200000,
+ 104925600000,
+ 120646800000,
+ 136375200000,
+ 152096400000,
+ 167824800000,
+ 183546000000,
+ 199274400000,
+ 215600400000,
+ 230724000000,
+ 247050000000,
+ 262778400000,
+ 278499600000,
+ 294228000000,
+ 309949200000,
+ 325677600000,
+ 341398800000,
+ 357127200000,
+ 372848400000,
+ 388576800000,
+ 404902800000,
+ 420026400000,
+ 436352400000,
+ 452080800000,
+ 467802000000,
+ 483530400000,
+ 499251600000,
+ 514980000000,
+ 530701200000,
+ 544615200000,
+ 562150800000,
+ 576064800000,
+ 594205200000,
+ 607514400000,
+ 625654800000,
+ 638964000000,
+ 657104400000,
+ 671018400000,
+ 688554000000,
+ 702468000000,
+ 720003600000,
+ 733917600000,
+ 752058000000,
+ 765367200000,
+ 783507600000,
+ 796816800000,
+ 814957200000,
+ 828871200000,
+ 846406800000,
+ 860320800000,
+ 877856400000,
+ 891770400000,
+ 909306000000,
+ 923220000000,
+ 941360400000,
+ 954669600000,
+ 972810000000,
+ 986119200000,
+ 1004259600000,
+ 1018173600000,
+ 1035709200000,
+ 1049623200000,
+ 1067158800000,
+ 1081072800000,
+ 1099213200000,
+ 1112522400000,
+ 1130662800000,
+ 1143972000000,
+ 1162112400000,
+ 1173607200000,
+ 1194166800000,
+ 1205056800000,
+ 1225616400000,
+ 1236506400000,
+ 1257066000000,
+ 1268560800000,
+ 1289120400000,
+ 1300010400000,
+ 1320570000000,
+ 1331460000000,
+ 1352019600000,
+ 1362909600000,
+ 1383469200000,
+ 1394359200000,
+ 1414918800000,
+ 1425808800000,
+ 1446368400000,
+ 1457863200000,
+ 1478422800000,
+ 1489312800000,
+ 1509872400000,
+ 1520762400000,
+ 1541322000000,
+ 1552212000000,
+ 1572771600000,
+ 1583661600000,
+ 1604221200000,
+ 1615716000000,
+ 1636275600000,
+ 1647165600000,
+ 1667725200000,
+ 1678615200000,
+ 1699174800000,
+ 1710064800000,
+ 1730624400000,
+ 1741514400000,
+ 1762074000000,
+ 1772964000000,
+ 1793523600000,
+ 1805018400000,
+ 1825578000000,
+ 1836468000000,
+ 1857027600000,
+ 1867917600000,
+ 1888477200000,
+ 1899367200000,
+ 1919926800000,
+ 1930816800000,
+ 1951376400000,
+ 1962871200000,
+ 1983430800000,
+ 1994320800000,
+ 2014880400000,
+ 2025770400000,
+ 2046330000000,
+ 2057220000000,
+ 2077779600000,
+ 2088669600000,
+ 2109229200000,
+ 2120119200000,
+ 2140678800000,
+ null
+ ],
+ "offsets": [
+ 480,
+ 420,
+ 480,
+ 420,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480
+ ],
+ "population": 2313000
+ },
+ {
+ "name": "America/Virgin",
+ "abbrs": [
+ "LMT",
+ "AST"
+ ],
+ "untils": [
+ -1825098836000,
+ null
+ ],
+ "offsets": [
+ 246.0667,
+ 240
+ ],
+ "population": 0
+ },
+ {
+ "name": "America/Whitehorse",
+ "abbrs": [
+ "YST",
+ "YDT",
+ "YST",
+ "YDT",
+ "YST",
+ "YWT",
+ "YPT",
+ "YST",
+ "YDDT",
+ "YST",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST"
+ ],
+ "untils": [
+ -1632056400000,
+ -1615125600000,
+ -1596978000000,
+ -1583164800000,
+ -880203600000,
+ -769395600000,
+ -765381600000,
+ -147884400000,
+ -131554800000,
+ -81961200000,
+ 325677600000,
+ 341398800000,
+ 357127200000,
+ 372848400000,
+ 388576800000,
+ 404902800000,
+ 420026400000,
+ 436352400000,
+ 452080800000,
+ 467802000000,
+ 483530400000,
+ 499251600000,
+ 514980000000,
+ 530701200000,
+ 544615200000,
+ 562150800000,
+ 576064800000,
+ 594205200000,
+ 607514400000,
+ 625654800000,
+ 638964000000,
+ 657104400000,
+ 671018400000,
+ 688554000000,
+ 702468000000,
+ 720003600000,
+ 733917600000,
+ 752058000000,
+ 765367200000,
+ 783507600000,
+ 796816800000,
+ 814957200000,
+ 828871200000,
+ 846406800000,
+ 860320800000,
+ 877856400000,
+ 891770400000,
+ 909306000000,
+ 923220000000,
+ 941360400000,
+ 954669600000,
+ 972810000000,
+ 986119200000,
+ 1004259600000,
+ 1018173600000,
+ 1035709200000,
+ 1049623200000,
+ 1067158800000,
+ 1081072800000,
+ 1099213200000,
+ 1112522400000,
+ 1130662800000,
+ 1143972000000,
+ 1162112400000,
+ 1173607200000,
+ 1194166800000,
+ 1205056800000,
+ 1225616400000,
+ 1236506400000,
+ 1257066000000,
+ 1268560800000,
+ 1289120400000,
+ 1300010400000,
+ 1320570000000,
+ 1331460000000,
+ 1352019600000,
+ 1362909600000,
+ 1383469200000,
+ 1394359200000,
+ 1414918800000,
+ 1425808800000,
+ 1446368400000,
+ 1457863200000,
+ 1478422800000,
+ 1489312800000,
+ 1509872400000,
+ 1520762400000,
+ 1541322000000,
+ 1552212000000,
+ 1572771600000,
+ 1583661600000,
+ 1604221200000,
+ 1615716000000,
+ 1636275600000,
+ 1647165600000,
+ 1667725200000,
+ 1678615200000,
+ 1699174800000,
+ 1710064800000,
+ 1730624400000,
+ 1741514400000,
+ 1762074000000,
+ 1772964000000,
+ 1793523600000,
+ 1805018400000,
+ 1825578000000,
+ 1836468000000,
+ 1857027600000,
+ 1867917600000,
+ 1888477200000,
+ 1899367200000,
+ 1919926800000,
+ 1930816800000,
+ 1951376400000,
+ 1962871200000,
+ 1983430800000,
+ 1994320800000,
+ 2014880400000,
+ 2025770400000,
+ 2046330000000,
+ 2057220000000,
+ 2077779600000,
+ 2088669600000,
+ 2109229200000,
+ 2120119200000,
+ 2140678800000,
+ null
+ ],
+ "offsets": [
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 480,
+ 540,
+ 420,
+ 540,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480
+ ],
+ "population": 23276
+ },
+ {
+ "name": "America/Winnipeg",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1694368800000,
+ -1681671600000,
+ -1632067200000,
+ -1615136400000,
+ -1029686400000,
+ -1018198800000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -746035200000,
+ -732733200000,
+ -715795200000,
+ -702493200000,
+ -684345600000,
+ -671043600000,
+ -652896000000,
+ -639594000000,
+ -620755200000,
+ -607626000000,
+ -589392000000,
+ -576090000000,
+ -557942400000,
+ -544640400000,
+ -526492800000,
+ -513190800000,
+ -495043200000,
+ -481741200000,
+ -463593600000,
+ -450291600000,
+ -431539200000,
+ -418237200000,
+ -400089600000,
+ -386787600000,
+ -368640000000,
+ -355338000000,
+ -337190400000,
+ -321469200000,
+ -305740800000,
+ -292438800000,
+ -210787200000,
+ -198090000000,
+ -116438400000,
+ -100108800000,
+ -84384000000,
+ -68659200000,
+ -52934400000,
+ -37209600000,
+ -21484800000,
+ -5760000000,
+ 9964800000,
+ 25689600000,
+ 41414400000,
+ 57744000000,
+ 73468800000,
+ 89193600000,
+ 104918400000,
+ 120643200000,
+ 136368000000,
+ 152092800000,
+ 167817600000,
+ 183542400000,
+ 199267200000,
+ 215596800000,
+ 230716800000,
+ 247046400000,
+ 262771200000,
+ 278496000000,
+ 294220800000,
+ 309945600000,
+ 325670400000,
+ 341395200000,
+ 357120000000,
+ 372844800000,
+ 388569600000,
+ 404899200000,
+ 420019200000,
+ 436348800000,
+ 452073600000,
+ 467798400000,
+ 483523200000,
+ 499248000000,
+ 514972800000,
+ 530697600000,
+ 544608000000,
+ 562147200000,
+ 576057600000,
+ 594201600000,
+ 607507200000,
+ 625651200000,
+ 638956800000,
+ 657100800000,
+ 671011200000,
+ 688550400000,
+ 702460800000,
+ 720000000000,
+ 733910400000,
+ 752054400000,
+ 765360000000,
+ 783504000000,
+ 796809600000,
+ 814953600000,
+ 828864000000,
+ 846403200000,
+ 860313600000,
+ 877852800000,
+ 891763200000,
+ 909302400000,
+ 923212800000,
+ 941356800000,
+ 954662400000,
+ 972806400000,
+ 986112000000,
+ 1004256000000,
+ 1018166400000,
+ 1035705600000,
+ 1049616000000,
+ 1067155200000,
+ 1081065600000,
+ 1099209600000,
+ 1112515200000,
+ 1130659200000,
+ 1143964800000,
+ 1162105200000,
+ 1173600000000,
+ 1194159600000,
+ 1205049600000,
+ 1225609200000,
+ 1236499200000,
+ 1257058800000,
+ 1268553600000,
+ 1289113200000,
+ 1300003200000,
+ 1320562800000,
+ 1331452800000,
+ 1352012400000,
+ 1362902400000,
+ 1383462000000,
+ 1394352000000,
+ 1414911600000,
+ 1425801600000,
+ 1446361200000,
+ 1457856000000,
+ 1478415600000,
+ 1489305600000,
+ 1509865200000,
+ 1520755200000,
+ 1541314800000,
+ 1552204800000,
+ 1572764400000,
+ 1583654400000,
+ 1604214000000,
+ 1615708800000,
+ 1636268400000,
+ 1647158400000,
+ 1667718000000,
+ 1678608000000,
+ 1699167600000,
+ 1710057600000,
+ 1730617200000,
+ 1741507200000,
+ 1762066800000,
+ 1772956800000,
+ 1793516400000,
+ 1805011200000,
+ 1825570800000,
+ 1836460800000,
+ 1857020400000,
+ 1867910400000,
+ 1888470000000,
+ 1899360000000,
+ 1919919600000,
+ 1930809600000,
+ 1951369200000,
+ 1962864000000,
+ 1983423600000,
+ 1994313600000,
+ 2014873200000,
+ 2025763200000,
+ 2046322800000,
+ 2057212800000,
+ 2077772400000,
+ 2088662400000,
+ 2109222000000,
+ 2120112000000,
+ 2140671600000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 663615
+ },
+ {
+ "name": "America/Yakutat",
+ "abbrs": [
+ "YST",
+ "YWT",
+ "YPT",
+ "YST",
+ "YDT",
+ "YST",
+ "YDT",
+ "YST",
+ "YDT",
+ "YST",
+ "YDT",
+ "YST",
+ "YDT",
+ "YST",
+ "YDT",
+ "YST",
+ "YDT",
+ "YST",
+ "YDT",
+ "YST",
+ "YDT",
+ "YST",
+ "YDT",
+ "YST",
+ "YDT",
+ "YST",
+ "YDT",
+ "YST",
+ "YDT",
+ "YST",
+ "YDT",
+ "YST",
+ "YDT",
+ "YST",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST"
+ ],
+ "untils": [
+ -880203600000,
+ -769395600000,
+ -765381600000,
+ -21474000000,
+ -5752800000,
+ 9975600000,
+ 25696800000,
+ 41425200000,
+ 57751200000,
+ 73479600000,
+ 89200800000,
+ 104929200000,
+ 120650400000,
+ 126702000000,
+ 152100000000,
+ 162385200000,
+ 183549600000,
+ 199278000000,
+ 215604000000,
+ 230727600000,
+ 247053600000,
+ 262782000000,
+ 278503200000,
+ 294231600000,
+ 309952800000,
+ 325681200000,
+ 341402400000,
+ 357130800000,
+ 372852000000,
+ 388580400000,
+ 404906400000,
+ 420030000000,
+ 436356000000,
+ 439030800000,
+ 452084400000,
+ 467805600000,
+ 483534000000,
+ 499255200000,
+ 514983600000,
+ 530704800000,
+ 544618800000,
+ 562154400000,
+ 576068400000,
+ 594208800000,
+ 607518000000,
+ 625658400000,
+ 638967600000,
+ 657108000000,
+ 671022000000,
+ 688557600000,
+ 702471600000,
+ 720007200000,
+ 733921200000,
+ 752061600000,
+ 765370800000,
+ 783511200000,
+ 796820400000,
+ 814960800000,
+ 828874800000,
+ 846410400000,
+ 860324400000,
+ 877860000000,
+ 891774000000,
+ 909309600000,
+ 923223600000,
+ 941364000000,
+ 954673200000,
+ 972813600000,
+ 986122800000,
+ 1004263200000,
+ 1018177200000,
+ 1035712800000,
+ 1049626800000,
+ 1067162400000,
+ 1081076400000,
+ 1099216800000,
+ 1112526000000,
+ 1130666400000,
+ 1143975600000,
+ 1162116000000,
+ 1173610800000,
+ 1194170400000,
+ 1205060400000,
+ 1225620000000,
+ 1236510000000,
+ 1257069600000,
+ 1268564400000,
+ 1289124000000,
+ 1300014000000,
+ 1320573600000,
+ 1331463600000,
+ 1352023200000,
+ 1362913200000,
+ 1383472800000,
+ 1394362800000,
+ 1414922400000,
+ 1425812400000,
+ 1446372000000,
+ 1457866800000,
+ 1478426400000,
+ 1489316400000,
+ 1509876000000,
+ 1520766000000,
+ 1541325600000,
+ 1552215600000,
+ 1572775200000,
+ 1583665200000,
+ 1604224800000,
+ 1615719600000,
+ 1636279200000,
+ 1647169200000,
+ 1667728800000,
+ 1678618800000,
+ 1699178400000,
+ 1710068400000,
+ 1730628000000,
+ 1741518000000,
+ 1762077600000,
+ 1772967600000,
+ 1793527200000,
+ 1805022000000,
+ 1825581600000,
+ 1836471600000,
+ 1857031200000,
+ 1867921200000,
+ 1888480800000,
+ 1899370800000,
+ 1919930400000,
+ 1930820400000,
+ 1951380000000,
+ 1962874800000,
+ 1983434400000,
+ 1994324400000,
+ 2014884000000,
+ 2025774000000,
+ 2046333600000,
+ 2057223600000,
+ 2077783200000,
+ 2088673200000,
+ 2109232800000,
+ 2120122800000,
+ 2140682400000,
+ null
+ ],
+ "offsets": [
+ 540,
+ 480,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540
+ ],
+ "population": 642
+ },
+ {
+ "name": "America/Yellowknife",
+ "abbrs": [
+ "-00",
+ "MST",
+ "MWT",
+ "MPT",
+ "MST",
+ "MDDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST"
+ ],
+ "untils": [
+ -1104537600000,
+ -880210800000,
+ -769395600000,
+ -765388800000,
+ -147891600000,
+ -131562000000,
+ 325674000000,
+ 341395200000,
+ 357123600000,
+ 372844800000,
+ 388573200000,
+ 404899200000,
+ 420022800000,
+ 436348800000,
+ 452077200000,
+ 467798400000,
+ 483526800000,
+ 499248000000,
+ 514976400000,
+ 530697600000,
+ 544611600000,
+ 562147200000,
+ 576061200000,
+ 594201600000,
+ 607510800000,
+ 625651200000,
+ 638960400000,
+ 657100800000,
+ 671014800000,
+ 688550400000,
+ 702464400000,
+ 720000000000,
+ 733914000000,
+ 752054400000,
+ 765363600000,
+ 783504000000,
+ 796813200000,
+ 814953600000,
+ 828867600000,
+ 846403200000,
+ 860317200000,
+ 877852800000,
+ 891766800000,
+ 909302400000,
+ 923216400000,
+ 941356800000,
+ 954666000000,
+ 972806400000,
+ 986115600000,
+ 1004256000000,
+ 1018170000000,
+ 1035705600000,
+ 1049619600000,
+ 1067155200000,
+ 1081069200000,
+ 1099209600000,
+ 1112518800000,
+ 1130659200000,
+ 1143968400000,
+ 1162108800000,
+ 1173603600000,
+ 1194163200000,
+ 1205053200000,
+ 1225612800000,
+ 1236502800000,
+ 1257062400000,
+ 1268557200000,
+ 1289116800000,
+ 1300006800000,
+ 1320566400000,
+ 1331456400000,
+ 1352016000000,
+ 1362906000000,
+ 1383465600000,
+ 1394355600000,
+ 1414915200000,
+ 1425805200000,
+ 1446364800000,
+ 1457859600000,
+ 1478419200000,
+ 1489309200000,
+ 1509868800000,
+ 1520758800000,
+ 1541318400000,
+ 1552208400000,
+ 1572768000000,
+ 1583658000000,
+ 1604217600000,
+ 1615712400000,
+ 1636272000000,
+ 1647162000000,
+ 1667721600000,
+ 1678611600000,
+ 1699171200000,
+ 1710061200000,
+ 1730620800000,
+ 1741510800000,
+ 1762070400000,
+ 1772960400000,
+ 1793520000000,
+ 1805014800000,
+ 1825574400000,
+ 1836464400000,
+ 1857024000000,
+ 1867914000000,
+ 1888473600000,
+ 1899363600000,
+ 1919923200000,
+ 1930813200000,
+ 1951372800000,
+ 1962867600000,
+ 1983427200000,
+ 1994317200000,
+ 2014876800000,
+ 2025766800000,
+ 2046326400000,
+ 2057216400000,
+ 2077776000000,
+ 2088666000000,
+ 2109225600000,
+ 2120115600000,
+ 2140675200000,
+ null
+ ],
+ "offsets": [
+ 0,
+ 420,
+ 360,
+ 360,
+ 420,
+ 300,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420
+ ],
+ "population": 19234
+ },
+ {
+ "name": "Antarctica/Casey",
+ "abbrs": [
+ "-00",
+ "+08",
+ "+11",
+ "+08",
+ "+11",
+ "+08",
+ "+11",
+ "+08"
+ ],
+ "untils": [
+ -31536000000,
+ 1255802400000,
+ 1267714800000,
+ 1319738400000,
+ 1329843600000,
+ 1477065600000,
+ 1520701200000,
+ null
+ ],
+ "offsets": [
+ 0,
+ -480,
+ -660,
+ -480,
+ -660,
+ -480,
+ -660,
+ -480
+ ],
+ "population": 10
+ },
+ {
+ "name": "Antarctica/Davis",
+ "abbrs": [
+ "-00",
+ "+07",
+ "-00",
+ "+07",
+ "+05",
+ "+07",
+ "+05",
+ "+07"
+ ],
+ "untils": [
+ -409190400000,
+ -163062000000,
+ -28857600000,
+ 1255806000000,
+ 1268251200000,
+ 1319742000000,
+ 1329854400000,
+ null
+ ],
+ "offsets": [
+ 0,
+ -420,
+ 0,
+ -420,
+ -300,
+ -420,
+ -300,
+ -420
+ ],
+ "population": 70
+ },
+ {
+ "name": "Antarctica/DumontDUrville",
+ "abbrs": [
+ "-00",
+ "+10",
+ "-00",
+ "+10"
+ ],
+ "untils": [
+ -725846400000,
+ -566992800000,
+ -415497600000,
+ null
+ ],
+ "offsets": [
+ 0,
+ -600,
+ 0,
+ -600
+ ],
+ "population": 80
+ },
+ {
+ "name": "Antarctica/Macquarie",
+ "abbrs": [
+ "AEST",
+ "AEDT",
+ "AEST",
+ "-00",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "+11"
+ ],
+ "untils": [
+ -1680508800000,
+ -1665392400000,
+ -1601719200000,
+ -687052800000,
+ -71136000000,
+ -55411200000,
+ -37267200000,
+ -25776000000,
+ -5817600000,
+ 5673600000,
+ 25632000000,
+ 37728000000,
+ 57686400000,
+ 67968000000,
+ 89136000000,
+ 100022400000,
+ 120585600000,
+ 131472000000,
+ 152035200000,
+ 162921600000,
+ 183484800000,
+ 194976000000,
+ 215539200000,
+ 226425600000,
+ 246988800000,
+ 257875200000,
+ 278438400000,
+ 289324800000,
+ 309888000000,
+ 320774400000,
+ 341337600000,
+ 352224000000,
+ 372787200000,
+ 386092800000,
+ 404841600000,
+ 417542400000,
+ 436291200000,
+ 447177600000,
+ 467740800000,
+ 478627200000,
+ 499190400000,
+ 510076800000,
+ 530035200000,
+ 542736000000,
+ 562089600000,
+ 574790400000,
+ 594144000000,
+ 606240000000,
+ 625593600000,
+ 637689600000,
+ 657043200000,
+ 670348800000,
+ 686678400000,
+ 701798400000,
+ 718128000000,
+ 733248000000,
+ 749577600000,
+ 764697600000,
+ 781027200000,
+ 796147200000,
+ 812476800000,
+ 828201600000,
+ 844531200000,
+ 859651200000,
+ 875980800000,
+ 891100800000,
+ 907430400000,
+ 922550400000,
+ 938880000000,
+ 954000000000,
+ 967305600000,
+ 985449600000,
+ 1002384000000,
+ 1017504000000,
+ 1033833600000,
+ 1048953600000,
+ 1065283200000,
+ 1080403200000,
+ 1096732800000,
+ 1111852800000,
+ 1128182400000,
+ 1143907200000,
+ 1159632000000,
+ 1174752000000,
+ 1191686400000,
+ 1207411200000,
+ 1223136000000,
+ 1238860800000,
+ 1254585600000,
+ 1270310400000,
+ null
+ ],
+ "offsets": [
+ -600,
+ -660,
+ -600,
+ 0,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -660
+ ],
+ "population": 1
+ },
+ {
+ "name": "Antarctica/Mawson",
+ "abbrs": [
+ "-00",
+ "+06",
+ "+05"
+ ],
+ "untils": [
+ -501206400000,
+ 1255809600000,
+ null
+ ],
+ "offsets": [
+ 0,
+ -360,
+ -300
+ ],
+ "population": 60
+ },
+ {
+ "name": "Antarctica/McMurdo",
+ "abbrs": [
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT"
+ ],
+ "untils": [
+ -1330335000000,
+ -1320057000000,
+ -1300699800000,
+ -1287396000000,
+ -1269250200000,
+ -1255946400000,
+ -1237800600000,
+ -1224496800000,
+ -1206351000000,
+ -1192442400000,
+ -1174901400000,
+ -1160992800000,
+ -1143451800000,
+ -1125914400000,
+ -1112607000000,
+ -1094464800000,
+ -1081157400000,
+ -1063015200000,
+ -1049707800000,
+ -1031565600000,
+ -1018258200000,
+ -1000116000000,
+ -986808600000,
+ -968061600000,
+ -955359000000,
+ -936612000000,
+ -923304600000,
+ 152632800000,
+ 162309600000,
+ 183477600000,
+ 194968800000,
+ 215532000000,
+ 226418400000,
+ 246981600000,
+ 257868000000,
+ 278431200000,
+ 289317600000,
+ 309880800000,
+ 320767200000,
+ 341330400000,
+ 352216800000,
+ 372780000000,
+ 384271200000,
+ 404834400000,
+ 415720800000,
+ 436284000000,
+ 447170400000,
+ 467733600000,
+ 478620000000,
+ 499183200000,
+ 510069600000,
+ 530632800000,
+ 541519200000,
+ 562082400000,
+ 573573600000,
+ 594136800000,
+ 605023200000,
+ 623772000000,
+ 637682400000,
+ 655221600000,
+ 669132000000,
+ 686671200000,
+ 700581600000,
+ 718120800000,
+ 732636000000,
+ 749570400000,
+ 764085600000,
+ 781020000000,
+ 795535200000,
+ 812469600000,
+ 826984800000,
+ 844524000000,
+ 858434400000,
+ 875973600000,
+ 889884000000,
+ 907423200000,
+ 921938400000,
+ 938872800000,
+ 953388000000,
+ 970322400000,
+ 984837600000,
+ 1002376800000,
+ 1016287200000,
+ 1033826400000,
+ 1047736800000,
+ 1065276000000,
+ 1079791200000,
+ 1096725600000,
+ 1111240800000,
+ 1128175200000,
+ 1142690400000,
+ 1159624800000,
+ 1174140000000,
+ 1191074400000,
+ 1207404000000,
+ 1222524000000,
+ 1238853600000,
+ 1253973600000,
+ 1270303200000,
+ 1285423200000,
+ 1301752800000,
+ 1316872800000,
+ 1333202400000,
+ 1348927200000,
+ 1365256800000,
+ 1380376800000,
+ 1396706400000,
+ 1411826400000,
+ 1428156000000,
+ 1443276000000,
+ 1459605600000,
+ 1474725600000,
+ 1491055200000,
+ 1506175200000,
+ 1522504800000,
+ 1538229600000,
+ 1554559200000,
+ 1569679200000,
+ 1586008800000,
+ 1601128800000,
+ 1617458400000,
+ 1632578400000,
+ 1648908000000,
+ 1664028000000,
+ 1680357600000,
+ 1695477600000,
+ 1712412000000,
+ 1727532000000,
+ 1743861600000,
+ 1758981600000,
+ 1775311200000,
+ 1790431200000,
+ 1806760800000,
+ 1821880800000,
+ 1838210400000,
+ 1853330400000,
+ 1869660000000,
+ 1885384800000,
+ 1901714400000,
+ 1916834400000,
+ 1933164000000,
+ 1948284000000,
+ 1964613600000,
+ 1979733600000,
+ 1996063200000,
+ 2011183200000,
+ 2027512800000,
+ 2042632800000,
+ 2058962400000,
+ 2074687200000,
+ 2091016800000,
+ 2106136800000,
+ 2122466400000,
+ 2137586400000,
+ null
+ ],
+ "offsets": [
+ -690,
+ -750,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780
+ ],
+ "population": 0
+ },
+ {
+ "name": "Antarctica/Palmer",
+ "abbrs": [
+ "-00",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03"
+ ],
+ "untils": [
+ -157766400000,
+ -152658000000,
+ -132955200000,
+ -121122000000,
+ -101419200000,
+ -86821200000,
+ -71092800000,
+ -54766800000,
+ -39038400000,
+ -23317200000,
+ -7588800000,
+ 128142000000,
+ 136605600000,
+ 389070000000,
+ 403070400000,
+ 416372400000,
+ 434520000000,
+ 447822000000,
+ 466574400000,
+ 479271600000,
+ 498024000000,
+ 510721200000,
+ 529473600000,
+ 545194800000,
+ 560923200000,
+ 574225200000,
+ 592372800000,
+ 605674800000,
+ 624427200000,
+ 637124400000,
+ 653457600000,
+ 668574000000,
+ 687326400000,
+ 700628400000,
+ 718776000000,
+ 732078000000,
+ 750225600000,
+ 763527600000,
+ 781675200000,
+ 794977200000,
+ 813729600000,
+ 826426800000,
+ 845179200000,
+ 859690800000,
+ 876628800000,
+ 889930800000,
+ 906868800000,
+ 923194800000,
+ 939528000000,
+ 952830000000,
+ 971582400000,
+ 984279600000,
+ 1003032000000,
+ 1015729200000,
+ 1034481600000,
+ 1047178800000,
+ 1065931200000,
+ 1079233200000,
+ 1097380800000,
+ 1110682800000,
+ 1128830400000,
+ 1142132400000,
+ 1160884800000,
+ 1173582000000,
+ 1192334400000,
+ 1206846000000,
+ 1223784000000,
+ 1237086000000,
+ 1255233600000,
+ 1270350000000,
+ 1286683200000,
+ 1304823600000,
+ 1313899200000,
+ 1335668400000,
+ 1346558400000,
+ 1367118000000,
+ 1378612800000,
+ 1398567600000,
+ 1410062400000,
+ 1463281200000,
+ 1471147200000,
+ null
+ ],
+ "offsets": [
+ 0,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180
+ ],
+ "population": 40
+ },
+ {
+ "name": "Antarctica/Rothera",
+ "abbrs": [
+ "-00",
+ "-03"
+ ],
+ "untils": [
+ 218246400000,
+ null
+ ],
+ "offsets": [
+ 0,
+ 180
+ ],
+ "population": 130
+ },
+ {
+ "name": "Antarctica/South_Pole",
+ "abbrs": [
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT"
+ ],
+ "untils": [
+ -1330335000000,
+ -1320057000000,
+ -1300699800000,
+ -1287396000000,
+ -1269250200000,
+ -1255946400000,
+ -1237800600000,
+ -1224496800000,
+ -1206351000000,
+ -1192442400000,
+ -1174901400000,
+ -1160992800000,
+ -1143451800000,
+ -1125914400000,
+ -1112607000000,
+ -1094464800000,
+ -1081157400000,
+ -1063015200000,
+ -1049707800000,
+ -1031565600000,
+ -1018258200000,
+ -1000116000000,
+ -986808600000,
+ -968061600000,
+ -955359000000,
+ -936612000000,
+ -923304600000,
+ 152632800000,
+ 162309600000,
+ 183477600000,
+ 194968800000,
+ 215532000000,
+ 226418400000,
+ 246981600000,
+ 257868000000,
+ 278431200000,
+ 289317600000,
+ 309880800000,
+ 320767200000,
+ 341330400000,
+ 352216800000,
+ 372780000000,
+ 384271200000,
+ 404834400000,
+ 415720800000,
+ 436284000000,
+ 447170400000,
+ 467733600000,
+ 478620000000,
+ 499183200000,
+ 510069600000,
+ 530632800000,
+ 541519200000,
+ 562082400000,
+ 573573600000,
+ 594136800000,
+ 605023200000,
+ 623772000000,
+ 637682400000,
+ 655221600000,
+ 669132000000,
+ 686671200000,
+ 700581600000,
+ 718120800000,
+ 732636000000,
+ 749570400000,
+ 764085600000,
+ 781020000000,
+ 795535200000,
+ 812469600000,
+ 826984800000,
+ 844524000000,
+ 858434400000,
+ 875973600000,
+ 889884000000,
+ 907423200000,
+ 921938400000,
+ 938872800000,
+ 953388000000,
+ 970322400000,
+ 984837600000,
+ 1002376800000,
+ 1016287200000,
+ 1033826400000,
+ 1047736800000,
+ 1065276000000,
+ 1079791200000,
+ 1096725600000,
+ 1111240800000,
+ 1128175200000,
+ 1142690400000,
+ 1159624800000,
+ 1174140000000,
+ 1191074400000,
+ 1207404000000,
+ 1222524000000,
+ 1238853600000,
+ 1253973600000,
+ 1270303200000,
+ 1285423200000,
+ 1301752800000,
+ 1316872800000,
+ 1333202400000,
+ 1348927200000,
+ 1365256800000,
+ 1380376800000,
+ 1396706400000,
+ 1411826400000,
+ 1428156000000,
+ 1443276000000,
+ 1459605600000,
+ 1474725600000,
+ 1491055200000,
+ 1506175200000,
+ 1522504800000,
+ 1538229600000,
+ 1554559200000,
+ 1569679200000,
+ 1586008800000,
+ 1601128800000,
+ 1617458400000,
+ 1632578400000,
+ 1648908000000,
+ 1664028000000,
+ 1680357600000,
+ 1695477600000,
+ 1712412000000,
+ 1727532000000,
+ 1743861600000,
+ 1758981600000,
+ 1775311200000,
+ 1790431200000,
+ 1806760800000,
+ 1821880800000,
+ 1838210400000,
+ 1853330400000,
+ 1869660000000,
+ 1885384800000,
+ 1901714400000,
+ 1916834400000,
+ 1933164000000,
+ 1948284000000,
+ 1964613600000,
+ 1979733600000,
+ 1996063200000,
+ 2011183200000,
+ 2027512800000,
+ 2042632800000,
+ 2058962400000,
+ 2074687200000,
+ 2091016800000,
+ 2106136800000,
+ 2122466400000,
+ 2137586400000,
+ null
+ ],
+ "offsets": [
+ -690,
+ -750,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780
+ ],
+ "population": 0
+ },
+ {
+ "name": "Antarctica/Syowa",
+ "abbrs": [
+ "-00",
+ "+03"
+ ],
+ "untils": [
+ -407808000000,
+ null
+ ],
+ "offsets": [
+ 0,
+ -180
+ ],
+ "population": 20
+ },
+ {
+ "name": "Antarctica/Troll",
+ "abbrs": [
+ "-00",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00",
+ "+02",
+ "+00"
+ ],
+ "untils": [
+ 1108166400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 0,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0,
+ -120,
+ 0
+ ],
+ "population": 40
+ },
+ {
+ "name": "Antarctica/Vostok",
+ "abbrs": [
+ "-00",
+ "+06"
+ ],
+ "untils": [
+ -380073600000,
+ null
+ ],
+ "offsets": [
+ 0,
+ -360
+ ],
+ "population": 25
+ },
+ {
+ "name": "Arctic/Longyearbyen",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1691884800000,
+ -1680573600000,
+ -927511200000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -781052400000,
+ -765327600000,
+ -340844400000,
+ -324514800000,
+ -308790000000,
+ -293065200000,
+ -277340400000,
+ -261615600000,
+ -245890800000,
+ -230166000000,
+ -214441200000,
+ -198716400000,
+ -182991600000,
+ -166662000000,
+ -147913200000,
+ -135212400000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Aden",
+ "abbrs": [
+ "LMT",
+ "+03"
+ ],
+ "untils": [
+ -719636812000,
+ null
+ ],
+ "offsets": [
+ -186.8667,
+ -180
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Almaty",
+ "abbrs": [
+ "LMT",
+ "+05",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+05",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06"
+ ],
+ "untils": [
+ -1441170468000,
+ -1247547600000,
+ 354909600000,
+ 370717200000,
+ 386445600000,
+ 402253200000,
+ 417981600000,
+ 433789200000,
+ 449604000000,
+ 465336000000,
+ 481060800000,
+ 496785600000,
+ 512510400000,
+ 528235200000,
+ 543960000000,
+ 559684800000,
+ 575409600000,
+ 591134400000,
+ 606859200000,
+ 622584000000,
+ 638308800000,
+ 654638400000,
+ 686091600000,
+ 695768400000,
+ 701812800000,
+ 717537600000,
+ 733262400000,
+ 748987200000,
+ 764712000000,
+ 780436800000,
+ 796161600000,
+ 811886400000,
+ 828216000000,
+ 846360000000,
+ 859665600000,
+ 877809600000,
+ 891115200000,
+ 909259200000,
+ 922564800000,
+ 941313600000,
+ 954014400000,
+ 972763200000,
+ 985464000000,
+ 1004212800000,
+ 1017518400000,
+ 1035662400000,
+ 1048968000000,
+ 1067112000000,
+ 1080417600000,
+ 1099166400000,
+ null
+ ],
+ "offsets": [
+ -307.8,
+ -300,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -300,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360
+ ],
+ "population": 1500000
+ },
+ {
+ "name": "Asia/Amman",
+ "abbrs": [
+ "LMT",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -1230776624000,
+ 108165600000,
+ 118270800000,
+ 136591200000,
+ 149806800000,
+ 168127200000,
+ 181342800000,
+ 199749600000,
+ 215643600000,
+ 231285600000,
+ 244501200000,
+ 262735200000,
+ 275950800000,
+ 481154400000,
+ 496962000000,
+ 512949600000,
+ 528670800000,
+ 544399200000,
+ 560120400000,
+ 575848800000,
+ 592174800000,
+ 610581600000,
+ 623624400000,
+ 641167200000,
+ 655074000000,
+ 671839200000,
+ 685918800000,
+ 702856800000,
+ 717973200000,
+ 733701600000,
+ 749422800000,
+ 765151200000,
+ 779662800000,
+ 797205600000,
+ 811116000000,
+ 828655200000,
+ 843170400000,
+ 860104800000,
+ 874620000000,
+ 891554400000,
+ 906069600000,
+ 930780000000,
+ 938124000000,
+ 954367200000,
+ 970178400000,
+ 985816800000,
+ 1001628000000,
+ 1017352800000,
+ 1033077600000,
+ 1048802400000,
+ 1066946400000,
+ 1080252000000,
+ 1097791200000,
+ 1112306400000,
+ 1128031200000,
+ 1143756000000,
+ 1161900000000,
+ 1175205600000,
+ 1193349600000,
+ 1206655200000,
+ 1225404000000,
+ 1238104800000,
+ 1256853600000,
+ 1269554400000,
+ 1288303200000,
+ 1301608800000,
+ 1319752800000,
+ 1333058400000,
+ 1387486800000,
+ 1395957600000,
+ 1414706400000,
+ 1427407200000,
+ 1446156000000,
+ 1459461600000,
+ 1477605600000,
+ 1490911200000,
+ 1509055200000,
+ 1522360800000,
+ 1540504800000,
+ 1553810400000,
+ 1571954400000,
+ 1585260000000,
+ 1604008800000,
+ 1616709600000,
+ 1635458400000,
+ 1648764000000,
+ 1666908000000,
+ 1680213600000,
+ 1698357600000,
+ 1711663200000,
+ 1729807200000,
+ 1743112800000,
+ 1761861600000,
+ 1774562400000,
+ 1793311200000,
+ 1806012000000,
+ 1824760800000,
+ 1838066400000,
+ 1856210400000,
+ 1869516000000,
+ 1887660000000,
+ 1900965600000,
+ 1919109600000,
+ 1932415200000,
+ 1951164000000,
+ 1963864800000,
+ 1982613600000,
+ 1995919200000,
+ 2014063200000,
+ 2027368800000,
+ 2045512800000,
+ 2058818400000,
+ 2076962400000,
+ 2090268000000,
+ 2109016800000,
+ 2121717600000,
+ 2140466400000,
+ null
+ ],
+ "offsets": [
+ -143.7333,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 2468000
+ },
+ {
+ "name": "Asia/Anadyr",
+ "abbrs": [
+ "LMT",
+ "+12",
+ "+13",
+ "+14",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+11",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+11",
+ "+12"
+ ],
+ "untils": [
+ -1441194596000,
+ -1247572800000,
+ 354884400000,
+ 370692000000,
+ 402231600000,
+ 417960000000,
+ 433767600000,
+ 449582400000,
+ 465314400000,
+ 481039200000,
+ 496764000000,
+ 512488800000,
+ 528213600000,
+ 543938400000,
+ 559663200000,
+ 575388000000,
+ 591112800000,
+ 606837600000,
+ 622562400000,
+ 638287200000,
+ 654616800000,
+ 686070000000,
+ 695746800000,
+ 701791200000,
+ 717516000000,
+ 733240800000,
+ 748965600000,
+ 764690400000,
+ 780415200000,
+ 796140000000,
+ 811864800000,
+ 828194400000,
+ 846338400000,
+ 859644000000,
+ 877788000000,
+ 891093600000,
+ 909237600000,
+ 922543200000,
+ 941292000000,
+ 953992800000,
+ 972741600000,
+ 985442400000,
+ 1004191200000,
+ 1017496800000,
+ 1035640800000,
+ 1048946400000,
+ 1067090400000,
+ 1080396000000,
+ 1099144800000,
+ 1111845600000,
+ 1130594400000,
+ 1143295200000,
+ 1162044000000,
+ 1174744800000,
+ 1193493600000,
+ 1206799200000,
+ 1224943200000,
+ 1238248800000,
+ 1256392800000,
+ 1288450800000,
+ 1301151600000,
+ null
+ ],
+ "offsets": [
+ -709.9333,
+ -720,
+ -780,
+ -840,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -660,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -660,
+ -720
+ ],
+ "population": 13045
+ },
+ {
+ "name": "Asia/Aqtau",
+ "abbrs": [
+ "LMT",
+ "+04",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+04",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05"
+ ],
+ "untils": [
+ -1441164064000,
+ -1247544000000,
+ 370724400000,
+ 402256800000,
+ 417985200000,
+ 433792800000,
+ 449607600000,
+ 465339600000,
+ 481064400000,
+ 496789200000,
+ 512514000000,
+ 528238800000,
+ 543963600000,
+ 559688400000,
+ 575413200000,
+ 591138000000,
+ 606862800000,
+ 622587600000,
+ 638312400000,
+ 654642000000,
+ 686095200000,
+ 695772000000,
+ 701816400000,
+ 717541200000,
+ 733266000000,
+ 748990800000,
+ 764715600000,
+ 780440400000,
+ 796168800000,
+ 811893600000,
+ 828223200000,
+ 846367200000,
+ 859672800000,
+ 877816800000,
+ 891122400000,
+ 909266400000,
+ 922572000000,
+ 941320800000,
+ 954021600000,
+ 972770400000,
+ 985471200000,
+ 1004220000000,
+ 1017525600000,
+ 1035669600000,
+ 1048975200000,
+ 1067119200000,
+ 1080424800000,
+ null
+ ],
+ "offsets": [
+ -201.0667,
+ -240,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -240,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300
+ ],
+ "population": 152227
+ },
+ {
+ "name": "Asia/Aqtobe",
+ "abbrs": [
+ "LMT",
+ "+04",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+04",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05"
+ ],
+ "untils": [
+ -1441165720000,
+ -1247544000000,
+ 354913200000,
+ 402256800000,
+ 417985200000,
+ 433792800000,
+ 449607600000,
+ 465339600000,
+ 481064400000,
+ 496789200000,
+ 512514000000,
+ 528238800000,
+ 543963600000,
+ 559688400000,
+ 575413200000,
+ 591138000000,
+ 606862800000,
+ 622587600000,
+ 638312400000,
+ 654642000000,
+ 686095200000,
+ 695772000000,
+ 701816400000,
+ 717541200000,
+ 733266000000,
+ 748990800000,
+ 764715600000,
+ 780440400000,
+ 796165200000,
+ 811890000000,
+ 828219600000,
+ 846363600000,
+ 859669200000,
+ 877813200000,
+ 891118800000,
+ 909262800000,
+ 922568400000,
+ 941317200000,
+ 954018000000,
+ 972766800000,
+ 985467600000,
+ 1004216400000,
+ 1017522000000,
+ 1035666000000,
+ 1048971600000,
+ 1067115600000,
+ 1080421200000,
+ 1099170000000,
+ null
+ ],
+ "offsets": [
+ -228.6667,
+ -240,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -240,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300
+ ],
+ "population": 273599
+ },
+ {
+ "name": "Asia/Ashgabat",
+ "abbrs": [
+ "LMT",
+ "+04",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+04",
+ "+05"
+ ],
+ "untils": [
+ -1441166012000,
+ -1247544000000,
+ 354913200000,
+ 370720800000,
+ 386449200000,
+ 402256800000,
+ 417985200000,
+ 433792800000,
+ 449607600000,
+ 465339600000,
+ 481064400000,
+ 496789200000,
+ 512514000000,
+ 528238800000,
+ 543963600000,
+ 559688400000,
+ 575413200000,
+ 591138000000,
+ 606862800000,
+ 622587600000,
+ 638312400000,
+ 654642000000,
+ 686095200000,
+ 695772000000,
+ null
+ ],
+ "offsets": [
+ -233.5333,
+ -240,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -240,
+ -300
+ ],
+ "population": 407000
+ },
+ {
+ "name": "Asia/Ashkhabad",
+ "abbrs": [
+ "LMT",
+ "+04",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+04",
+ "+05"
+ ],
+ "untils": [
+ -1441166012000,
+ -1247544000000,
+ 354913200000,
+ 370720800000,
+ 386449200000,
+ 402256800000,
+ 417985200000,
+ 433792800000,
+ 449607600000,
+ 465339600000,
+ 481064400000,
+ 496789200000,
+ 512514000000,
+ 528238800000,
+ 543963600000,
+ 559688400000,
+ 575413200000,
+ 591138000000,
+ 606862800000,
+ 622587600000,
+ 638312400000,
+ 654642000000,
+ 686095200000,
+ 695772000000,
+ null
+ ],
+ "offsets": [
+ -233.5333,
+ -240,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -240,
+ -300
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Atyrau",
+ "abbrs": [
+ "LMT",
+ "+03",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+04",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05"
+ ],
+ "untils": [
+ -1441164464000,
+ -1247540400000,
+ 370724400000,
+ 402256800000,
+ 417985200000,
+ 433792800000,
+ 449607600000,
+ 465339600000,
+ 481064400000,
+ 496789200000,
+ 512514000000,
+ 528238800000,
+ 543963600000,
+ 559688400000,
+ 575413200000,
+ 591138000000,
+ 606862800000,
+ 622587600000,
+ 638312400000,
+ 654642000000,
+ 686095200000,
+ 695772000000,
+ 701816400000,
+ 717541200000,
+ 733266000000,
+ 748990800000,
+ 764715600000,
+ 780440400000,
+ 796165200000,
+ 811890000000,
+ 828219600000,
+ 846363600000,
+ 859669200000,
+ 877813200000,
+ 891118800000,
+ 909262800000,
+ 941320800000,
+ 954021600000,
+ 972770400000,
+ 985471200000,
+ 1004220000000,
+ 1017525600000,
+ 1035669600000,
+ 1048975200000,
+ 1067119200000,
+ 1080424800000,
+ null
+ ],
+ "offsets": [
+ -207.7333,
+ -180,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -240,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Baghdad",
+ "abbrs": [
+ "BMT",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03"
+ ],
+ "untils": [
+ -1641005856000,
+ 389048400000,
+ 402264000000,
+ 417906000000,
+ 433800000000,
+ 449614800000,
+ 465422400000,
+ 481150800000,
+ 496792800000,
+ 512517600000,
+ 528242400000,
+ 543967200000,
+ 559692000000,
+ 575416800000,
+ 591141600000,
+ 606866400000,
+ 622591200000,
+ 638316000000,
+ 654645600000,
+ 670464000000,
+ 686275200000,
+ 702086400000,
+ 717897600000,
+ 733622400000,
+ 749433600000,
+ 765158400000,
+ 780969600000,
+ 796694400000,
+ 812505600000,
+ 828316800000,
+ 844128000000,
+ 859852800000,
+ 875664000000,
+ 891388800000,
+ 907200000000,
+ 922924800000,
+ 938736000000,
+ 954547200000,
+ 970358400000,
+ 986083200000,
+ 1001894400000,
+ 1017619200000,
+ 1033430400000,
+ 1049155200000,
+ 1064966400000,
+ 1080777600000,
+ 1096588800000,
+ 1112313600000,
+ 1128124800000,
+ 1143849600000,
+ 1159660800000,
+ 1175385600000,
+ 1191196800000,
+ null
+ ],
+ "offsets": [
+ -177.6,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180
+ ],
+ "population": 6625000
+ },
+ {
+ "name": "Asia/Bahrain",
+ "abbrs": [
+ "LMT",
+ "+04",
+ "+03"
+ ],
+ "untils": [
+ -1577935568000,
+ 76190400000,
+ null
+ ],
+ "offsets": [
+ -206.1333,
+ -240,
+ -180
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Baku",
+ "abbrs": [
+ "LMT",
+ "+03",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+03",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04"
+ ],
+ "untils": [
+ -1441163964000,
+ -405140400000,
+ 354916800000,
+ 370724400000,
+ 386452800000,
+ 402260400000,
+ 417988800000,
+ 433796400000,
+ 449611200000,
+ 465343200000,
+ 481068000000,
+ 496792800000,
+ 512517600000,
+ 528242400000,
+ 543967200000,
+ 559692000000,
+ 575416800000,
+ 591141600000,
+ 606866400000,
+ 622591200000,
+ 638316000000,
+ 654645600000,
+ 686098800000,
+ 701823600000,
+ 828234000000,
+ 846378000000,
+ 859680000000,
+ 877824000000,
+ 891129600000,
+ 909273600000,
+ 922579200000,
+ 941328000000,
+ 954028800000,
+ 972777600000,
+ 985478400000,
+ 1004227200000,
+ 1017532800000,
+ 1035676800000,
+ 1048982400000,
+ 1067126400000,
+ 1080432000000,
+ 1099180800000,
+ 1111881600000,
+ 1130630400000,
+ 1143331200000,
+ 1162080000000,
+ 1174780800000,
+ 1193529600000,
+ 1206835200000,
+ 1224979200000,
+ 1238284800000,
+ 1256428800000,
+ 1269734400000,
+ 1288483200000,
+ 1301184000000,
+ 1319932800000,
+ 1332633600000,
+ 1351382400000,
+ 1364688000000,
+ 1382832000000,
+ 1396137600000,
+ 1414281600000,
+ 1427587200000,
+ 1445731200000,
+ null
+ ],
+ "offsets": [
+ -199.4,
+ -180,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -180,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240
+ ],
+ "population": 2661000
+ },
+ {
+ "name": "Asia/Bangkok",
+ "abbrs": [
+ "BMT",
+ "+07"
+ ],
+ "untils": [
+ -1570084924000,
+ null
+ ],
+ "offsets": [
+ -402.0667,
+ -420
+ ],
+ "population": 14998000
+ },
+ {
+ "name": "Asia/Barnaul",
+ "abbrs": [
+ "LMT",
+ "+06",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+06",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07"
+ ],
+ "untils": [
+ -1579844100000,
+ -1247551200000,
+ 354906000000,
+ 370713600000,
+ 386442000000,
+ 402249600000,
+ 417978000000,
+ 433785600000,
+ 449600400000,
+ 465332400000,
+ 481057200000,
+ 496782000000,
+ 512506800000,
+ 528231600000,
+ 543956400000,
+ 559681200000,
+ 575406000000,
+ 591130800000,
+ 606855600000,
+ 622580400000,
+ 638305200000,
+ 654634800000,
+ 686088000000,
+ 695764800000,
+ 701809200000,
+ 717534000000,
+ 733258800000,
+ 748983600000,
+ 764708400000,
+ 780433200000,
+ 796158000000,
+ 801590400000,
+ 811886400000,
+ 828216000000,
+ 846360000000,
+ 859665600000,
+ 877809600000,
+ 891115200000,
+ 909259200000,
+ 922564800000,
+ 941313600000,
+ 954014400000,
+ 972763200000,
+ 985464000000,
+ 1004212800000,
+ 1017518400000,
+ 1035662400000,
+ 1048968000000,
+ 1067112000000,
+ 1080417600000,
+ 1099166400000,
+ 1111867200000,
+ 1130616000000,
+ 1143316800000,
+ 1162065600000,
+ 1174766400000,
+ 1193515200000,
+ 1206820800000,
+ 1224964800000,
+ 1238270400000,
+ 1256414400000,
+ 1269720000000,
+ 1288468800000,
+ 1301169600000,
+ 1414263600000,
+ 1459022400000,
+ null
+ ],
+ "offsets": [
+ -335,
+ -360,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -360,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Beirut",
+ "abbrs": [
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -1570413600000,
+ -1552186800000,
+ -1538359200000,
+ -1522551600000,
+ -1507514400000,
+ -1490583600000,
+ -1473645600000,
+ -1460948400000,
+ -399866400000,
+ -386650800000,
+ -368330400000,
+ -355114800000,
+ -336794400000,
+ -323578800000,
+ -305172000000,
+ -291956400000,
+ -273636000000,
+ -260420400000,
+ 78012000000,
+ 86734800000,
+ 105055200000,
+ 118270800000,
+ 136591200000,
+ 149806800000,
+ 168127200000,
+ 181342800000,
+ 199749600000,
+ 212965200000,
+ 231285600000,
+ 244501200000,
+ 262735200000,
+ 275950800000,
+ 452210400000,
+ 466722000000,
+ 483746400000,
+ 498258000000,
+ 515282400000,
+ 529794000000,
+ 546818400000,
+ 561330000000,
+ 581119200000,
+ 592952400000,
+ 610754400000,
+ 624488400000,
+ 641512800000,
+ 656024400000,
+ 673048800000,
+ 687560400000,
+ 704671200000,
+ 718146000000,
+ 733269600000,
+ 748990800000,
+ 764719200000,
+ 780440400000,
+ 796168800000,
+ 811890000000,
+ 828223200000,
+ 843944400000,
+ 859672800000,
+ 875394000000,
+ 891122400000,
+ 906843600000,
+ 922572000000,
+ 941317200000,
+ 954021600000,
+ 972766800000,
+ 985471200000,
+ 1004216400000,
+ 1017525600000,
+ 1035666000000,
+ 1048975200000,
+ 1067115600000,
+ 1080424800000,
+ 1099170000000,
+ 1111874400000,
+ 1130619600000,
+ 1143324000000,
+ 1162069200000,
+ 1174773600000,
+ 1193518800000,
+ 1206828000000,
+ 1224968400000,
+ 1238277600000,
+ 1256418000000,
+ 1269727200000,
+ 1288472400000,
+ 1301176800000,
+ 1319922000000,
+ 1332626400000,
+ 1351371600000,
+ 1364680800000,
+ 1382821200000,
+ 1396130400000,
+ 1414270800000,
+ 1427580000000,
+ 1445720400000,
+ 1459029600000,
+ 1477774800000,
+ 1490479200000,
+ 1509224400000,
+ 1521928800000,
+ 1540674000000,
+ 1553983200000,
+ 1572123600000,
+ 1585432800000,
+ 1603573200000,
+ 1616882400000,
+ 1635627600000,
+ 1648332000000,
+ 1667077200000,
+ 1679781600000,
+ 1698526800000,
+ 1711836000000,
+ 1729976400000,
+ 1743285600000,
+ 1761426000000,
+ 1774735200000,
+ 1792875600000,
+ 1806184800000,
+ 1824930000000,
+ 1837634400000,
+ 1856379600000,
+ 1869084000000,
+ 1887829200000,
+ 1901138400000,
+ 1919278800000,
+ 1932588000000,
+ 1950728400000,
+ 1964037600000,
+ 1982782800000,
+ 1995487200000,
+ 2014232400000,
+ 2026936800000,
+ 2045682000000,
+ 2058386400000,
+ 2077131600000,
+ 2090440800000,
+ 2108581200000,
+ 2121890400000,
+ 2140030800000,
+ null
+ ],
+ "offsets": [
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 2200000
+ },
+ {
+ "name": "Asia/Bishkek",
+ "abbrs": [
+ "LMT",
+ "+05",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06"
+ ],
+ "untils": [
+ -1441169904000,
+ -1247547600000,
+ 354909600000,
+ 370717200000,
+ 386445600000,
+ 402253200000,
+ 417981600000,
+ 433789200000,
+ 449604000000,
+ 465336000000,
+ 481060800000,
+ 496785600000,
+ 512510400000,
+ 528235200000,
+ 543960000000,
+ 559684800000,
+ 575409600000,
+ 591134400000,
+ 606859200000,
+ 622584000000,
+ 638308800000,
+ 654638400000,
+ 683582400000,
+ 703018800000,
+ 717530400000,
+ 734468400000,
+ 748980000000,
+ 765918000000,
+ 780429600000,
+ 797367600000,
+ 811879200000,
+ 828817200000,
+ 843933600000,
+ 859671000000,
+ 877811400000,
+ 891120600000,
+ 909261000000,
+ 922570200000,
+ 941315400000,
+ 954019800000,
+ 972765000000,
+ 985469400000,
+ 1004214600000,
+ 1017523800000,
+ 1035664200000,
+ 1048973400000,
+ 1067113800000,
+ 1080423000000,
+ 1099168200000,
+ 1111872600000,
+ null
+ ],
+ "offsets": [
+ -298.4,
+ -300,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360
+ ],
+ "population": 870663
+ },
+ {
+ "name": "Asia/Brunei",
+ "abbrs": [
+ "LMT",
+ "+0730",
+ "+08"
+ ],
+ "untils": [
+ -1383464380000,
+ -1167636600000,
+ null
+ ],
+ "offsets": [
+ -459.6667,
+ -450,
+ -480
+ ],
+ "population": 417784
+ },
+ {
+ "name": "Asia/Calcutta",
+ "abbrs": [
+ "MMT",
+ "IST",
+ "+0630",
+ "IST",
+ "+0630",
+ "IST"
+ ],
+ "untils": [
+ -2019705670000,
+ -891581400000,
+ -872058600000,
+ -862637400000,
+ -764145000000,
+ null
+ ],
+ "offsets": [
+ -321.1667,
+ -330,
+ -390,
+ -330,
+ -390,
+ -330
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Chita",
+ "abbrs": [
+ "LMT",
+ "+08",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+08",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+08",
+ "+09"
+ ],
+ "untils": [
+ -1579419232000,
+ -1247558400000,
+ 354898800000,
+ 370706400000,
+ 386434800000,
+ 402242400000,
+ 417970800000,
+ 433778400000,
+ 449593200000,
+ 465325200000,
+ 481050000000,
+ 496774800000,
+ 512499600000,
+ 528224400000,
+ 543949200000,
+ 559674000000,
+ 575398800000,
+ 591123600000,
+ 606848400000,
+ 622573200000,
+ 638298000000,
+ 654627600000,
+ 686080800000,
+ 695757600000,
+ 701802000000,
+ 717526800000,
+ 733251600000,
+ 748976400000,
+ 764701200000,
+ 780426000000,
+ 796150800000,
+ 811875600000,
+ 828205200000,
+ 846349200000,
+ 859654800000,
+ 877798800000,
+ 891104400000,
+ 909248400000,
+ 922554000000,
+ 941302800000,
+ 954003600000,
+ 972752400000,
+ 985453200000,
+ 1004202000000,
+ 1017507600000,
+ 1035651600000,
+ 1048957200000,
+ 1067101200000,
+ 1080406800000,
+ 1099155600000,
+ 1111856400000,
+ 1130605200000,
+ 1143306000000,
+ 1162054800000,
+ 1174755600000,
+ 1193504400000,
+ 1206810000000,
+ 1224954000000,
+ 1238259600000,
+ 1256403600000,
+ 1269709200000,
+ 1288458000000,
+ 1301158800000,
+ 1414252800000,
+ 1459015200000,
+ null
+ ],
+ "offsets": [
+ -453.8667,
+ -480,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -480,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -480,
+ -540
+ ],
+ "population": 329391
+ },
+ {
+ "name": "Asia/Choibalsan",
+ "abbrs": [
+ "LMT",
+ "+07",
+ "+08",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08"
+ ],
+ "untils": [
+ -2032933080000,
+ 252435600000,
+ 417974400000,
+ 433778400000,
+ 449593200000,
+ 465314400000,
+ 481042800000,
+ 496764000000,
+ 512492400000,
+ 528213600000,
+ 543942000000,
+ 559663200000,
+ 575391600000,
+ 591112800000,
+ 606841200000,
+ 622562400000,
+ 638290800000,
+ 654616800000,
+ 670345200000,
+ 686066400000,
+ 701794800000,
+ 717516000000,
+ 733244400000,
+ 748965600000,
+ 764694000000,
+ 780415200000,
+ 796143600000,
+ 811864800000,
+ 828198000000,
+ 843919200000,
+ 859647600000,
+ 875368800000,
+ 891097200000,
+ 906818400000,
+ 988390800000,
+ 1001692800000,
+ 1017421200000,
+ 1033142400000,
+ 1048870800000,
+ 1064592000000,
+ 1080320400000,
+ 1096041600000,
+ 1111770000000,
+ 1127491200000,
+ 1143219600000,
+ 1159545600000,
+ 1206889200000,
+ 1427479200000,
+ 1443193200000,
+ 1458928800000,
+ 1474642800000,
+ null
+ ],
+ "offsets": [
+ -458,
+ -420,
+ -480,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 38150
+ },
+ {
+ "name": "Asia/Chongqing",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -933494400000,
+ -923130000000,
+ -908784000000,
+ -891594000000,
+ 515520000000,
+ 527007600000,
+ 545155200000,
+ 558457200000,
+ 576604800000,
+ 589906800000,
+ 608659200000,
+ 621961200000,
+ 640108800000,
+ 653410800000,
+ 671558400000,
+ 684860400000,
+ null
+ ],
+ "offsets": [
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Chungking",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -933494400000,
+ -923130000000,
+ -908784000000,
+ -891594000000,
+ 515520000000,
+ 527007600000,
+ 545155200000,
+ 558457200000,
+ 576604800000,
+ 589906800000,
+ 608659200000,
+ 621961200000,
+ 640108800000,
+ 653410800000,
+ 671558400000,
+ 684860400000,
+ null
+ ],
+ "offsets": [
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Colombo",
+ "abbrs": [
+ "MMT",
+ "+0530",
+ "+06",
+ "+0630",
+ "+0530",
+ "+0630",
+ "+06",
+ "+0530"
+ ],
+ "untils": [
+ -2019705572000,
+ -883287000000,
+ -862639200000,
+ -764051400000,
+ 832962600000,
+ 846266400000,
+ 1145039400000,
+ null
+ ],
+ "offsets": [
+ -319.5333,
+ -330,
+ -360,
+ -390,
+ -330,
+ -390,
+ -360,
+ -330
+ ],
+ "population": 2180000
+ },
+ {
+ "name": "Asia/Dacca",
+ "abbrs": [
+ "HMT",
+ "+0630",
+ "+0530",
+ "+0630",
+ "+06",
+ "+07",
+ "+06"
+ ],
+ "untils": [
+ -891582800000,
+ -872058600000,
+ -862637400000,
+ -576138600000,
+ 1245430800000,
+ 1262278800000,
+ null
+ ],
+ "offsets": [
+ -353.3333,
+ -390,
+ -330,
+ -390,
+ -360,
+ -420,
+ -360
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Damascus",
+ "abbrs": [
+ "LMT",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -1577931912000,
+ -1568592000000,
+ -1554080400000,
+ -1537142400000,
+ -1522630800000,
+ -1505692800000,
+ -1491181200000,
+ -1474243200000,
+ -1459126800000,
+ -242265600000,
+ -228877200000,
+ -210556800000,
+ -197427600000,
+ -178934400000,
+ -165718800000,
+ -147398400000,
+ -134269200000,
+ -116467200000,
+ -102646800000,
+ -84326400000,
+ -71110800000,
+ -52704000000,
+ -39488400000,
+ -21168000000,
+ -7952400000,
+ 10368000000,
+ 23583600000,
+ 41904000000,
+ 55119600000,
+ 73526400000,
+ 86742000000,
+ 105062400000,
+ 118278000000,
+ 136598400000,
+ 149814000000,
+ 168134400000,
+ 181350000000,
+ 199756800000,
+ 212972400000,
+ 231292800000,
+ 241916400000,
+ 262828800000,
+ 273452400000,
+ 418694400000,
+ 433810800000,
+ 450316800000,
+ 465433200000,
+ 508896000000,
+ 529196400000,
+ 541555200000,
+ 562633200000,
+ 574387200000,
+ 594255600000,
+ 607305600000,
+ 623199600000,
+ 638928000000,
+ 654649200000,
+ 670456800000,
+ 686264400000,
+ 702684000000,
+ 717886800000,
+ 733096800000,
+ 748904400000,
+ 765151200000,
+ 780958800000,
+ 796687200000,
+ 812494800000,
+ 828309600000,
+ 844117200000,
+ 859759200000,
+ 875653200000,
+ 891208800000,
+ 907189200000,
+ 922917600000,
+ 938725200000,
+ 954540000000,
+ 970347600000,
+ 986076000000,
+ 1001883600000,
+ 1017612000000,
+ 1033419600000,
+ 1049148000000,
+ 1064955600000,
+ 1080770400000,
+ 1096578000000,
+ 1112306400000,
+ 1128114000000,
+ 1143842400000,
+ 1158872400000,
+ 1175205600000,
+ 1193950800000,
+ 1207260000000,
+ 1225486800000,
+ 1238104800000,
+ 1256850000000,
+ 1270159200000,
+ 1288299600000,
+ 1301608800000,
+ 1319749200000,
+ 1333058400000,
+ 1351198800000,
+ 1364508000000,
+ 1382648400000,
+ 1395957600000,
+ 1414702800000,
+ 1427407200000,
+ 1446152400000,
+ 1458856800000,
+ 1477602000000,
+ 1490911200000,
+ 1509051600000,
+ 1522360800000,
+ 1540501200000,
+ 1553810400000,
+ 1571950800000,
+ 1585260000000,
+ 1604005200000,
+ 1616709600000,
+ 1635454800000,
+ 1648159200000,
+ 1666904400000,
+ 1680213600000,
+ 1698354000000,
+ 1711663200000,
+ 1729803600000,
+ 1743112800000,
+ 1761858000000,
+ 1774562400000,
+ 1793307600000,
+ 1806012000000,
+ 1824757200000,
+ 1838066400000,
+ 1856206800000,
+ 1869516000000,
+ 1887656400000,
+ 1900965600000,
+ 1919106000000,
+ 1932415200000,
+ 1951160400000,
+ 1963864800000,
+ 1982610000000,
+ 1995314400000,
+ 2014059600000,
+ 2027368800000,
+ 2045509200000,
+ 2058818400000,
+ 2076958800000,
+ 2090268000000,
+ 2109013200000,
+ 2121717600000,
+ 2140462800000,
+ null
+ ],
+ "offsets": [
+ -145.2,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 2560000
+ },
+ {
+ "name": "Asia/Dhaka",
+ "abbrs": [
+ "HMT",
+ "+0630",
+ "+0530",
+ "+0630",
+ "+06",
+ "+07",
+ "+06"
+ ],
+ "untils": [
+ -891582800000,
+ -872058600000,
+ -862637400000,
+ -576138600000,
+ 1245430800000,
+ 1262278800000,
+ null
+ ],
+ "offsets": [
+ -353.3333,
+ -390,
+ -330,
+ -390,
+ -360,
+ -420,
+ -360
+ ],
+ "population": 15669000
+ },
+ {
+ "name": "Asia/Dili",
+ "abbrs": [
+ "LMT",
+ "+08",
+ "+09",
+ "+08",
+ "+09"
+ ],
+ "untils": [
+ -1830414140000,
+ -879152400000,
+ 199897200000,
+ 969120000000,
+ null
+ ],
+ "offsets": [
+ -502.3333,
+ -480,
+ -540,
+ -480,
+ -540
+ ],
+ "population": 193563
+ },
+ {
+ "name": "Asia/Dubai",
+ "abbrs": [
+ "LMT",
+ "+04"
+ ],
+ "untils": [
+ -1577936472000,
+ null
+ ],
+ "offsets": [
+ -221.2,
+ -240
+ ],
+ "population": 3933000
+ },
+ {
+ "name": "Asia/Dushanbe",
+ "abbrs": [
+ "LMT",
+ "+05",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+05"
+ ],
+ "untils": [
+ -1441168512000,
+ -1247547600000,
+ 354909600000,
+ 370717200000,
+ 386445600000,
+ 402253200000,
+ 417981600000,
+ 433789200000,
+ 449604000000,
+ 465336000000,
+ 481060800000,
+ 496785600000,
+ 512510400000,
+ 528235200000,
+ 543960000000,
+ 559684800000,
+ 575409600000,
+ 591134400000,
+ 606859200000,
+ 622584000000,
+ 638308800000,
+ 654638400000,
+ 684363600000,
+ null
+ ],
+ "offsets": [
+ -275.2,
+ -300,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -300
+ ],
+ "population": 756143
+ },
+ {
+ "name": "Asia/Famagusta",
+ "abbrs": [
+ "LMT",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "+03",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -1518920148000,
+ 166572000000,
+ 182293200000,
+ 200959200000,
+ 213829200000,
+ 228866400000,
+ 243982800000,
+ 260316000000,
+ 276123600000,
+ 291765600000,
+ 307486800000,
+ 323820000000,
+ 338936400000,
+ 354664800000,
+ 370386000000,
+ 386114400000,
+ 401835600000,
+ 417564000000,
+ 433285200000,
+ 449013600000,
+ 465339600000,
+ 481068000000,
+ 496789200000,
+ 512517600000,
+ 528238800000,
+ 543967200000,
+ 559688400000,
+ 575416800000,
+ 591138000000,
+ 606866400000,
+ 622587600000,
+ 638316000000,
+ 654642000000,
+ 670370400000,
+ 686091600000,
+ 701820000000,
+ 717541200000,
+ 733269600000,
+ 748990800000,
+ 764719200000,
+ 780440400000,
+ 796168800000,
+ 811890000000,
+ 828223200000,
+ 843944400000,
+ 859672800000,
+ 875394000000,
+ 891122400000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1473282000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -135.8,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Gaza",
+ "abbrs": [
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -933645600000,
+ -857358000000,
+ -844300800000,
+ -825822000000,
+ -812685600000,
+ -794199600000,
+ -779853600000,
+ -762656400000,
+ -748310400000,
+ -731127600000,
+ -399088800000,
+ -386650800000,
+ -368330400000,
+ -355114800000,
+ -336790800000,
+ -323654400000,
+ -305168400000,
+ -292032000000,
+ -273632400000,
+ -260496000000,
+ -242096400000,
+ -228960000000,
+ -210560400000,
+ -197424000000,
+ -178938000000,
+ -165801600000,
+ -147402000000,
+ -134265600000,
+ -115866000000,
+ -102643200000,
+ -84330000000,
+ -81313200000,
+ 142380000000,
+ 150843600000,
+ 167176800000,
+ 178664400000,
+ 482277600000,
+ 495579600000,
+ 516751200000,
+ 526424400000,
+ 545436000000,
+ 558478800000,
+ 576626400000,
+ 589323600000,
+ 609890400000,
+ 620773200000,
+ 638316000000,
+ 651618000000,
+ 669765600000,
+ 683672400000,
+ 701820000000,
+ 715726800000,
+ 733701600000,
+ 747176400000,
+ 765151200000,
+ 778021200000,
+ 796600800000,
+ 810075600000,
+ 820447200000,
+ 828655200000,
+ 843170400000,
+ 860104800000,
+ 874620000000,
+ 891554400000,
+ 906069600000,
+ 924213600000,
+ 939934800000,
+ 956268000000,
+ 971989200000,
+ 987717600000,
+ 1003438800000,
+ 1019167200000,
+ 1034888400000,
+ 1050616800000,
+ 1066338000000,
+ 1082066400000,
+ 1096581600000,
+ 1113516000000,
+ 1128380400000,
+ 1143842400000,
+ 1158872400000,
+ 1175378400000,
+ 1189638000000,
+ 1206655200000,
+ 1219957200000,
+ 1238104800000,
+ 1252015200000,
+ 1269640860000,
+ 1281474000000,
+ 1301608860000,
+ 1312146000000,
+ 1333058400000,
+ 1348178400000,
+ 1364508000000,
+ 1380229200000,
+ 1395957600000,
+ 1414098000000,
+ 1427493600000,
+ 1445547600000,
+ 1458946800000,
+ 1477692000000,
+ 1490396400000,
+ 1509141600000,
+ 1521846000000,
+ 1540591200000,
+ 1553295600000,
+ 1572040800000,
+ 1585350000000,
+ 1604095200000,
+ 1616799600000,
+ 1635544800000,
+ 1648249200000,
+ 1666994400000,
+ 1679698800000,
+ 1698444000000,
+ 1711148400000,
+ 1729893600000,
+ 1742598000000,
+ 1761343200000,
+ 1774652400000,
+ 1793397600000,
+ 1806102000000,
+ 1824847200000,
+ 1837551600000,
+ 1856296800000,
+ 1869001200000,
+ 1887746400000,
+ 1900450800000,
+ 1919196000000,
+ 1931900400000,
+ 1950645600000,
+ 1963954800000,
+ 1982700000000,
+ 1995404400000,
+ 2014149600000,
+ 2026854000000,
+ 2045599200000,
+ 2058303600000,
+ 2077048800000,
+ 2089753200000,
+ 2108498400000,
+ 2121807600000,
+ 2140552800000,
+ null
+ ],
+ "offsets": [
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 1816000
+ },
+ {
+ "name": "Asia/Harbin",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -933494400000,
+ -923130000000,
+ -908784000000,
+ -891594000000,
+ 515520000000,
+ 527007600000,
+ 545155200000,
+ 558457200000,
+ 576604800000,
+ 589906800000,
+ 608659200000,
+ 621961200000,
+ 640108800000,
+ 653410800000,
+ 671558400000,
+ 684860400000,
+ null
+ ],
+ "offsets": [
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Hebron",
+ "abbrs": [
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -933645600000,
+ -857358000000,
+ -844300800000,
+ -825822000000,
+ -812685600000,
+ -794199600000,
+ -779853600000,
+ -762656400000,
+ -748310400000,
+ -731127600000,
+ -399088800000,
+ -386650800000,
+ -368330400000,
+ -355114800000,
+ -336790800000,
+ -323654400000,
+ -305168400000,
+ -292032000000,
+ -273632400000,
+ -260496000000,
+ -242096400000,
+ -228960000000,
+ -210560400000,
+ -197424000000,
+ -178938000000,
+ -165801600000,
+ -147402000000,
+ -134265600000,
+ -115866000000,
+ -102643200000,
+ -84330000000,
+ -81313200000,
+ 142380000000,
+ 150843600000,
+ 167176800000,
+ 178664400000,
+ 482277600000,
+ 495579600000,
+ 516751200000,
+ 526424400000,
+ 545436000000,
+ 558478800000,
+ 576626400000,
+ 589323600000,
+ 609890400000,
+ 620773200000,
+ 638316000000,
+ 651618000000,
+ 669765600000,
+ 683672400000,
+ 701820000000,
+ 715726800000,
+ 733701600000,
+ 747176400000,
+ 765151200000,
+ 778021200000,
+ 796600800000,
+ 810075600000,
+ 820447200000,
+ 828655200000,
+ 843170400000,
+ 860104800000,
+ 874620000000,
+ 891554400000,
+ 906069600000,
+ 924213600000,
+ 939934800000,
+ 956268000000,
+ 971989200000,
+ 987717600000,
+ 1003438800000,
+ 1019167200000,
+ 1034888400000,
+ 1050616800000,
+ 1066338000000,
+ 1082066400000,
+ 1096581600000,
+ 1113516000000,
+ 1128380400000,
+ 1143842400000,
+ 1158872400000,
+ 1175378400000,
+ 1189638000000,
+ 1206655200000,
+ 1220216400000,
+ 1238104800000,
+ 1252015200000,
+ 1269554400000,
+ 1281474000000,
+ 1301608860000,
+ 1312146000000,
+ 1314655200000,
+ 1317330000000,
+ 1333058400000,
+ 1348178400000,
+ 1364508000000,
+ 1380229200000,
+ 1395957600000,
+ 1414098000000,
+ 1427493600000,
+ 1445547600000,
+ 1458946800000,
+ 1477692000000,
+ 1490396400000,
+ 1509141600000,
+ 1521846000000,
+ 1540591200000,
+ 1553295600000,
+ 1572040800000,
+ 1585350000000,
+ 1604095200000,
+ 1616799600000,
+ 1635544800000,
+ 1648249200000,
+ 1666994400000,
+ 1679698800000,
+ 1698444000000,
+ 1711148400000,
+ 1729893600000,
+ 1742598000000,
+ 1761343200000,
+ 1774652400000,
+ 1793397600000,
+ 1806102000000,
+ 1824847200000,
+ 1837551600000,
+ 1856296800000,
+ 1869001200000,
+ 1887746400000,
+ 1900450800000,
+ 1919196000000,
+ 1931900400000,
+ 1950645600000,
+ 1963954800000,
+ 1982700000000,
+ 1995404400000,
+ 2014149600000,
+ 2026854000000,
+ 2045599200000,
+ 2058303600000,
+ 2077048800000,
+ 2089753200000,
+ 2108498400000,
+ 2121807600000,
+ 2140552800000,
+ null
+ ],
+ "offsets": [
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 250000
+ },
+ {
+ "name": "Asia/Ho_Chi_Minh",
+ "abbrs": [
+ "LMT",
+ "PLMT",
+ "+07",
+ "+08",
+ "+09",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07"
+ ],
+ "untils": [
+ -2004073600000,
+ -1851577590000,
+ -852105600000,
+ -782643600000,
+ -767869200000,
+ -718095600000,
+ -457776000000,
+ -315648000000,
+ 171820800000,
+ null
+ ],
+ "offsets": [
+ -426.6667,
+ -426.5,
+ -420,
+ -480,
+ -540,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420
+ ],
+ "population": 8957000
+ },
+ {
+ "name": "Asia/Hong_Kong",
+ "abbrs": [
+ "LMT",
+ "HKT",
+ "HKST",
+ "HKT",
+ "JST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT"
+ ],
+ "untils": [
+ -2056693002000,
+ -907389000000,
+ -891667800000,
+ -884246400000,
+ -766746000000,
+ -747981000000,
+ -728544600000,
+ -717049800000,
+ -694503000000,
+ -683785800000,
+ -668064600000,
+ -654755400000,
+ -636615000000,
+ -623305800000,
+ -605165400000,
+ -591856200000,
+ -573715800000,
+ -559801800000,
+ -542352600000,
+ -528352200000,
+ -510211800000,
+ -498112200000,
+ -478762200000,
+ -466662600000,
+ -446707800000,
+ -435213000000,
+ -415258200000,
+ -403158600000,
+ -383808600000,
+ -371709000000,
+ -352359000000,
+ -340259400000,
+ -320909400000,
+ -308809800000,
+ -288855000000,
+ -277360200000,
+ -257405400000,
+ -245910600000,
+ -225955800000,
+ -213856200000,
+ -194506200000,
+ -182406600000,
+ -163056600000,
+ -148537800000,
+ -132816600000,
+ -117088200000,
+ -101367000000,
+ -85638600000,
+ -69312600000,
+ -53584200000,
+ -37863000000,
+ -22134600000,
+ -6413400000,
+ 9315000000,
+ 25036200000,
+ 40764600000,
+ 56485800000,
+ 72214200000,
+ 88540200000,
+ 104268600000,
+ 119989800000,
+ 126041400000,
+ 151439400000,
+ 167167800000,
+ 182889000000,
+ 198617400000,
+ 214338600000,
+ 295385400000,
+ 309292200000,
+ null
+ ],
+ "offsets": [
+ -456.7,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 7275000
+ },
+ {
+ "name": "Asia/Hovd",
+ "abbrs": [
+ "LMT",
+ "+06",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07"
+ ],
+ "untils": [
+ -2032927596000,
+ 252439200000,
+ 417978000000,
+ 433785600000,
+ 449600400000,
+ 465321600000,
+ 481050000000,
+ 496771200000,
+ 512499600000,
+ 528220800000,
+ 543949200000,
+ 559670400000,
+ 575398800000,
+ 591120000000,
+ 606848400000,
+ 622569600000,
+ 638298000000,
+ 654624000000,
+ 670352400000,
+ 686073600000,
+ 701802000000,
+ 717523200000,
+ 733251600000,
+ 748972800000,
+ 764701200000,
+ 780422400000,
+ 796150800000,
+ 811872000000,
+ 828205200000,
+ 843926400000,
+ 859654800000,
+ 875376000000,
+ 891104400000,
+ 906825600000,
+ 988398000000,
+ 1001700000000,
+ 1017428400000,
+ 1033149600000,
+ 1048878000000,
+ 1064599200000,
+ 1080327600000,
+ 1096048800000,
+ 1111777200000,
+ 1127498400000,
+ 1143226800000,
+ 1159552800000,
+ 1427482800000,
+ 1443196800000,
+ 1458932400000,
+ 1474646400000,
+ null
+ ],
+ "offsets": [
+ -366.6,
+ -360,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420
+ ],
+ "population": 81479
+ },
+ {
+ "name": "Asia/Irkutsk",
+ "abbrs": [
+ "IMT",
+ "+07",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+07",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08"
+ ],
+ "untils": [
+ -1575874625000,
+ -1247554800000,
+ 354902400000,
+ 370710000000,
+ 386438400000,
+ 402246000000,
+ 417974400000,
+ 433782000000,
+ 449596800000,
+ 465328800000,
+ 481053600000,
+ 496778400000,
+ 512503200000,
+ 528228000000,
+ 543952800000,
+ 559677600000,
+ 575402400000,
+ 591127200000,
+ 606852000000,
+ 622576800000,
+ 638301600000,
+ 654631200000,
+ 686084400000,
+ 695761200000,
+ 701805600000,
+ 717530400000,
+ 733255200000,
+ 748980000000,
+ 764704800000,
+ 780429600000,
+ 796154400000,
+ 811879200000,
+ 828208800000,
+ 846352800000,
+ 859658400000,
+ 877802400000,
+ 891108000000,
+ 909252000000,
+ 922557600000,
+ 941306400000,
+ 954007200000,
+ 972756000000,
+ 985456800000,
+ 1004205600000,
+ 1017511200000,
+ 1035655200000,
+ 1048960800000,
+ 1067104800000,
+ 1080410400000,
+ 1099159200000,
+ 1111860000000,
+ 1130608800000,
+ 1143309600000,
+ 1162058400000,
+ 1174759200000,
+ 1193508000000,
+ 1206813600000,
+ 1224957600000,
+ 1238263200000,
+ 1256407200000,
+ 1269712800000,
+ 1288461600000,
+ 1301162400000,
+ 1414256400000,
+ null
+ ],
+ "offsets": [
+ -417.0833,
+ -420,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -420,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 601993
+ },
+ {
+ "name": "Asia/Istanbul",
+ "abbrs": [
+ "IMT",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "+03"
+ ],
+ "untils": [
+ -1869875816000,
+ -1693706400000,
+ -1680490800000,
+ -1570413600000,
+ -1552186800000,
+ -1538359200000,
+ -1522551600000,
+ -1507514400000,
+ -1490583600000,
+ -1440208800000,
+ -1428030000000,
+ -1409709600000,
+ -1396494000000,
+ -931140000000,
+ -922762800000,
+ -917834400000,
+ -892436400000,
+ -875844000000,
+ -857358000000,
+ -781063200000,
+ -764737200000,
+ -744343200000,
+ -733806000000,
+ -716436000000,
+ -701924400000,
+ -684986400000,
+ -670474800000,
+ -654141600000,
+ -639025200000,
+ -621828000000,
+ -606970800000,
+ -590032800000,
+ -575434800000,
+ -235620000000,
+ -228279600000,
+ -177732000000,
+ -165726000000,
+ 10533600000,
+ 23835600000,
+ 41983200000,
+ 55285200000,
+ 74037600000,
+ 87339600000,
+ 107910000000,
+ 121219200000,
+ 133920000000,
+ 152676000000,
+ 165362400000,
+ 183502800000,
+ 202428000000,
+ 215557200000,
+ 228866400000,
+ 245797200000,
+ 260316000000,
+ 277246800000,
+ 308779200000,
+ 323827200000,
+ 340228800000,
+ 354672000000,
+ 371678400000,
+ 386121600000,
+ 403128000000,
+ 428446800000,
+ 433886400000,
+ 482792400000,
+ 496702800000,
+ 512521200000,
+ 528246000000,
+ 543970800000,
+ 559695600000,
+ 575420400000,
+ 591145200000,
+ 606870000000,
+ 622594800000,
+ 638319600000,
+ 654649200000,
+ 670374000000,
+ 686098800000,
+ 701823600000,
+ 717548400000,
+ 733273200000,
+ 748998000000,
+ 764118000000,
+ 780447600000,
+ 796172400000,
+ 811897200000,
+ 828226800000,
+ 846370800000,
+ 859676400000,
+ 877820400000,
+ 891126000000,
+ 909270000000,
+ 922575600000,
+ 941324400000,
+ 954025200000,
+ 972774000000,
+ 985474800000,
+ 1004223600000,
+ 1017529200000,
+ 1035673200000,
+ 1048978800000,
+ 1067122800000,
+ 1080428400000,
+ 1099177200000,
+ 1111878000000,
+ 1130626800000,
+ 1143327600000,
+ 1162076400000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301274000000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396227600000,
+ 1414285200000,
+ 1427590800000,
+ 1446944400000,
+ 1459040400000,
+ 1473195600000,
+ null
+ ],
+ "offsets": [
+ -116.9333,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -180
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Jakarta",
+ "abbrs": [
+ "BMT",
+ "+0720",
+ "+0730",
+ "+09",
+ "+0730",
+ "+08",
+ "+0730",
+ "WIB"
+ ],
+ "untils": [
+ -1451719200000,
+ -1172906400000,
+ -876641400000,
+ -766054800000,
+ -683883000000,
+ -620812800000,
+ -189415800000,
+ null
+ ],
+ "offsets": [
+ -427.2,
+ -440,
+ -450,
+ -540,
+ -450,
+ -480,
+ -450,
+ -420
+ ],
+ "population": 30539000
+ },
+ {
+ "name": "Asia/Jayapura",
+ "abbrs": [
+ "LMT",
+ "+09",
+ "+0930",
+ "WIT"
+ ],
+ "untils": [
+ -1172913768000,
+ -799491600000,
+ -189423000000,
+ null
+ ],
+ "offsets": [
+ -562.8,
+ -540,
+ -570,
+ -540
+ ],
+ "population": 256705
+ },
+ {
+ "name": "Asia/Jerusalem",
+ "abbrs": [
+ "JMT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDDT",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST"
+ ],
+ "untils": [
+ -1641003640000,
+ -933645600000,
+ -857358000000,
+ -844300800000,
+ -825822000000,
+ -812685600000,
+ -794199600000,
+ -779853600000,
+ -762656400000,
+ -748310400000,
+ -731127600000,
+ -681962400000,
+ -673243200000,
+ -667962000000,
+ -652327200000,
+ -636426000000,
+ -622087200000,
+ -608947200000,
+ -591847200000,
+ -572486400000,
+ -558576000000,
+ -542851200000,
+ -527731200000,
+ -514425600000,
+ -490845600000,
+ -482986800000,
+ -459475200000,
+ -451537200000,
+ -428551200000,
+ -418262400000,
+ -400032000000,
+ -387428400000,
+ 142380000000,
+ 150843600000,
+ 167176800000,
+ 178664400000,
+ 482277600000,
+ 495579600000,
+ 516751200000,
+ 526424400000,
+ 545436000000,
+ 558478800000,
+ 576626400000,
+ 589323600000,
+ 609890400000,
+ 620773200000,
+ 638316000000,
+ 651618000000,
+ 669765600000,
+ 683672400000,
+ 701820000000,
+ 715726800000,
+ 733701600000,
+ 747176400000,
+ 765151200000,
+ 778021200000,
+ 796600800000,
+ 810075600000,
+ 826840800000,
+ 842821200000,
+ 858895200000,
+ 874184400000,
+ 890344800000,
+ 905029200000,
+ 923011200000,
+ 936313200000,
+ 955670400000,
+ 970783200000,
+ 986770800000,
+ 1001282400000,
+ 1017356400000,
+ 1033941600000,
+ 1048806000000,
+ 1065132000000,
+ 1081292400000,
+ 1095804000000,
+ 1112313600000,
+ 1128812400000,
+ 1143763200000,
+ 1159657200000,
+ 1175212800000,
+ 1189897200000,
+ 1206662400000,
+ 1223161200000,
+ 1238112000000,
+ 1254006000000,
+ 1269561600000,
+ 1284246000000,
+ 1301616000000,
+ 1317510000000,
+ 1333065600000,
+ 1348354800000,
+ 1364515200000,
+ 1382828400000,
+ 1395964800000,
+ 1414278000000,
+ 1427414400000,
+ 1445727600000,
+ 1458864000000,
+ 1477782000000,
+ 1490313600000,
+ 1509231600000,
+ 1521763200000,
+ 1540681200000,
+ 1553817600000,
+ 1572130800000,
+ 1585267200000,
+ 1603580400000,
+ 1616716800000,
+ 1635634800000,
+ 1648166400000,
+ 1667084400000,
+ 1679616000000,
+ 1698534000000,
+ 1711670400000,
+ 1729983600000,
+ 1743120000000,
+ 1761433200000,
+ 1774569600000,
+ 1792882800000,
+ 1806019200000,
+ 1824937200000,
+ 1837468800000,
+ 1856386800000,
+ 1868918400000,
+ 1887836400000,
+ 1900972800000,
+ 1919286000000,
+ 1932422400000,
+ 1950735600000,
+ 1963872000000,
+ 1982790000000,
+ 1995321600000,
+ 2014239600000,
+ 2026771200000,
+ 2045689200000,
+ 2058220800000,
+ 2077138800000,
+ 2090275200000,
+ 2108588400000,
+ 2121724800000,
+ 2140038000000,
+ null
+ ],
+ "offsets": [
+ -140.6667,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -240,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 809112
+ },
+ {
+ "name": "Asia/Kabul",
+ "abbrs": [
+ "+04",
+ "+0430"
+ ],
+ "untils": [
+ -788932800000,
+ null
+ ],
+ "offsets": [
+ -240,
+ -270
+ ],
+ "population": 4635000
+ },
+ {
+ "name": "Asia/Kamchatka",
+ "abbrs": [
+ "LMT",
+ "+11",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+11",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+11",
+ "+12"
+ ],
+ "untils": [
+ -1487759676000,
+ -1247569200000,
+ 354888000000,
+ 370695600000,
+ 386424000000,
+ 402231600000,
+ 417960000000,
+ 433767600000,
+ 449582400000,
+ 465314400000,
+ 481039200000,
+ 496764000000,
+ 512488800000,
+ 528213600000,
+ 543938400000,
+ 559663200000,
+ 575388000000,
+ 591112800000,
+ 606837600000,
+ 622562400000,
+ 638287200000,
+ 654616800000,
+ 686070000000,
+ 695746800000,
+ 701791200000,
+ 717516000000,
+ 733240800000,
+ 748965600000,
+ 764690400000,
+ 780415200000,
+ 796140000000,
+ 811864800000,
+ 828194400000,
+ 846338400000,
+ 859644000000,
+ 877788000000,
+ 891093600000,
+ 909237600000,
+ 922543200000,
+ 941292000000,
+ 953992800000,
+ 972741600000,
+ 985442400000,
+ 1004191200000,
+ 1017496800000,
+ 1035640800000,
+ 1048946400000,
+ 1067090400000,
+ 1080396000000,
+ 1099144800000,
+ 1111845600000,
+ 1130594400000,
+ 1143295200000,
+ 1162044000000,
+ 1174744800000,
+ 1193493600000,
+ 1206799200000,
+ 1224943200000,
+ 1238248800000,
+ 1256392800000,
+ 1288450800000,
+ 1301151600000,
+ null
+ ],
+ "offsets": [
+ -634.6,
+ -660,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -660,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -660,
+ -720
+ ],
+ "population": 179526
+ },
+ {
+ "name": "Asia/Karachi",
+ "abbrs": [
+ "LMT",
+ "+0530",
+ "+0630",
+ "+0530",
+ "+05",
+ "PKT",
+ "PKST",
+ "PKT",
+ "PKST",
+ "PKT",
+ "PKST",
+ "PKT"
+ ],
+ "untils": [
+ -1988166492000,
+ -862637400000,
+ -764145000000,
+ -576135000000,
+ 38775600000,
+ 1018119600000,
+ 1033840800000,
+ 1212260400000,
+ 1225476000000,
+ 1239735600000,
+ 1257012000000,
+ null
+ ],
+ "offsets": [
+ -268.2,
+ -330,
+ -390,
+ -330,
+ -300,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300
+ ],
+ "population": 23500000
+ },
+ {
+ "name": "Asia/Kashgar",
+ "abbrs": [
+ "LMT",
+ "+06"
+ ],
+ "untils": [
+ -1325483420000,
+ null
+ ],
+ "offsets": [
+ -350.3333,
+ -360
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Kathmandu",
+ "abbrs": [
+ "LMT",
+ "+0530",
+ "+0545"
+ ],
+ "untils": [
+ -1577943676000,
+ 504901800000,
+ null
+ ],
+ "offsets": [
+ -341.2667,
+ -330,
+ -345
+ ],
+ "population": 1180000
+ },
+ {
+ "name": "Asia/Katmandu",
+ "abbrs": [
+ "LMT",
+ "+0530",
+ "+0545"
+ ],
+ "untils": [
+ -1577943676000,
+ 504901800000,
+ null
+ ],
+ "offsets": [
+ -341.2667,
+ -330,
+ -345
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Khandyga",
+ "abbrs": [
+ "LMT",
+ "+08",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+08",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+09"
+ ],
+ "untils": [
+ -1579424533000,
+ -1247558400000,
+ 354898800000,
+ 370706400000,
+ 386434800000,
+ 402242400000,
+ 417970800000,
+ 433778400000,
+ 449593200000,
+ 465325200000,
+ 481050000000,
+ 496774800000,
+ 512499600000,
+ 528224400000,
+ 543949200000,
+ 559674000000,
+ 575398800000,
+ 591123600000,
+ 606848400000,
+ 622573200000,
+ 638298000000,
+ 654627600000,
+ 686080800000,
+ 695757600000,
+ 701802000000,
+ 717526800000,
+ 733251600000,
+ 748976400000,
+ 764701200000,
+ 780426000000,
+ 796150800000,
+ 811875600000,
+ 828205200000,
+ 846349200000,
+ 859654800000,
+ 877798800000,
+ 891104400000,
+ 909248400000,
+ 922554000000,
+ 941302800000,
+ 954003600000,
+ 972752400000,
+ 985453200000,
+ 1004202000000,
+ 1017507600000,
+ 1035651600000,
+ 1048957200000,
+ 1067101200000,
+ 1072882800000,
+ 1080403200000,
+ 1099152000000,
+ 1111852800000,
+ 1130601600000,
+ 1143302400000,
+ 1162051200000,
+ 1174752000000,
+ 1193500800000,
+ 1206806400000,
+ 1224950400000,
+ 1238256000000,
+ 1256400000000,
+ 1269705600000,
+ 1288454400000,
+ 1301155200000,
+ 1315832400000,
+ 1414252800000,
+ null
+ ],
+ "offsets": [
+ -542.2167,
+ -480,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -480,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -540
+ ],
+ "population": 6638
+ },
+ {
+ "name": "Asia/Kolkata",
+ "abbrs": [
+ "MMT",
+ "IST",
+ "+0630",
+ "IST",
+ "+0630",
+ "IST"
+ ],
+ "untils": [
+ -2019705670000,
+ -891581400000,
+ -872058600000,
+ -862637400000,
+ -764145000000,
+ null
+ ],
+ "offsets": [
+ -321.1667,
+ -330,
+ -390,
+ -330,
+ -390,
+ -330
+ ],
+ "population": 14667000
+ },
+ {
+ "name": "Asia/Krasnoyarsk",
+ "abbrs": [
+ "LMT",
+ "+06",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+06",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07"
+ ],
+ "untils": [
+ -1577513486000,
+ -1247551200000,
+ 354906000000,
+ 370713600000,
+ 386442000000,
+ 402249600000,
+ 417978000000,
+ 433785600000,
+ 449600400000,
+ 465332400000,
+ 481057200000,
+ 496782000000,
+ 512506800000,
+ 528231600000,
+ 543956400000,
+ 559681200000,
+ 575406000000,
+ 591130800000,
+ 606855600000,
+ 622580400000,
+ 638305200000,
+ 654634800000,
+ 686088000000,
+ 695764800000,
+ 701809200000,
+ 717534000000,
+ 733258800000,
+ 748983600000,
+ 764708400000,
+ 780433200000,
+ 796158000000,
+ 811882800000,
+ 828212400000,
+ 846356400000,
+ 859662000000,
+ 877806000000,
+ 891111600000,
+ 909255600000,
+ 922561200000,
+ 941310000000,
+ 954010800000,
+ 972759600000,
+ 985460400000,
+ 1004209200000,
+ 1017514800000,
+ 1035658800000,
+ 1048964400000,
+ 1067108400000,
+ 1080414000000,
+ 1099162800000,
+ 1111863600000,
+ 1130612400000,
+ 1143313200000,
+ 1162062000000,
+ 1174762800000,
+ 1193511600000,
+ 1206817200000,
+ 1224961200000,
+ 1238266800000,
+ 1256410800000,
+ 1269716400000,
+ 1288465200000,
+ 1301166000000,
+ 1414260000000,
+ null
+ ],
+ "offsets": [
+ -371.4333,
+ -360,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -360,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420
+ ],
+ "population": 1007000
+ },
+ {
+ "name": "Asia/Kuala_Lumpur",
+ "abbrs": [
+ "SMT",
+ "+07",
+ "+0720",
+ "+0730",
+ "+09",
+ "+0730",
+ "+08"
+ ],
+ "untils": [
+ -2038200925000,
+ -1167634800000,
+ -894180000000,
+ -879665400000,
+ -767005200000,
+ 378664200000,
+ null
+ ],
+ "offsets": [
+ -415.4167,
+ -420,
+ -440,
+ -450,
+ -540,
+ -450,
+ -480
+ ],
+ "population": 7088000
+ },
+ {
+ "name": "Asia/Kuching",
+ "abbrs": [
+ "LMT",
+ "+0730",
+ "+08",
+ "+0820",
+ "+08",
+ "+0820",
+ "+08",
+ "+0820",
+ "+08",
+ "+0820",
+ "+08",
+ "+0820",
+ "+08",
+ "+0820",
+ "+08",
+ "+0820",
+ "+08",
+ "+09",
+ "+08"
+ ],
+ "untils": [
+ -1383463280000,
+ -1167636600000,
+ -1082448000000,
+ -1074586800000,
+ -1050825600000,
+ -1042964400000,
+ -1019289600000,
+ -1011428400000,
+ -987753600000,
+ -979892400000,
+ -956217600000,
+ -948356400000,
+ -924595200000,
+ -916734000000,
+ -893059200000,
+ -885198000000,
+ -879667200000,
+ -767005200000,
+ null
+ ],
+ "offsets": [
+ -441.3333,
+ -450,
+ -480,
+ -500,
+ -480,
+ -500,
+ -480,
+ -500,
+ -480,
+ -500,
+ -480,
+ -500,
+ -480,
+ -500,
+ -480,
+ -500,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 134317
+ },
+ {
+ "name": "Asia/Kuwait",
+ "abbrs": [
+ "LMT",
+ "+03"
+ ],
+ "untils": [
+ -719636812000,
+ null
+ ],
+ "offsets": [
+ -186.8667,
+ -180
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Macao",
+ "abbrs": [
+ "LMT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1830412800000,
+ -277360200000,
+ -257405400000,
+ -245910600000,
+ -225955800000,
+ -214473600000,
+ -194506200000,
+ -182406600000,
+ -163056600000,
+ -150969600000,
+ -131619600000,
+ -117088200000,
+ -101367000000,
+ -85638600000,
+ -69312600000,
+ -53584200000,
+ -37863000000,
+ -22134600000,
+ -6413400000,
+ 9315000000,
+ 25036200000,
+ 40764600000,
+ 56485800000,
+ 72201600000,
+ 87922800000,
+ 103651200000,
+ 119977200000,
+ 135705600000,
+ 151439400000,
+ 167167800000,
+ 182889000000,
+ 198617400000,
+ 214338600000,
+ 230067000000,
+ 245788200000,
+ 261504000000,
+ 277225200000,
+ 292953600000,
+ 309279600000,
+ 325008000000,
+ 340729200000,
+ null
+ ],
+ "offsets": [
+ -454.3333,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Macau",
+ "abbrs": [
+ "LMT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1830412800000,
+ -277360200000,
+ -257405400000,
+ -245910600000,
+ -225955800000,
+ -214473600000,
+ -194506200000,
+ -182406600000,
+ -163056600000,
+ -150969600000,
+ -131619600000,
+ -117088200000,
+ -101367000000,
+ -85638600000,
+ -69312600000,
+ -53584200000,
+ -37863000000,
+ -22134600000,
+ -6413400000,
+ 9315000000,
+ 25036200000,
+ 40764600000,
+ 56485800000,
+ 72201600000,
+ 87922800000,
+ 103651200000,
+ 119977200000,
+ 135705600000,
+ 151439400000,
+ 167167800000,
+ 182889000000,
+ 198617400000,
+ 214338600000,
+ 230067000000,
+ 245788200000,
+ 261504000000,
+ 277225200000,
+ 292953600000,
+ 309279600000,
+ 325008000000,
+ 340729200000,
+ null
+ ],
+ "offsets": [
+ -454.3333,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 566375
+ },
+ {
+ "name": "Asia/Magadan",
+ "abbrs": [
+ "LMT",
+ "+10",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+10",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+10",
+ "+11"
+ ],
+ "untils": [
+ -1441188192000,
+ -1247565600000,
+ 354891600000,
+ 370699200000,
+ 386427600000,
+ 402235200000,
+ 417963600000,
+ 433771200000,
+ 449586000000,
+ 465318000000,
+ 481042800000,
+ 496767600000,
+ 512492400000,
+ 528217200000,
+ 543942000000,
+ 559666800000,
+ 575391600000,
+ 591116400000,
+ 606841200000,
+ 622566000000,
+ 638290800000,
+ 654620400000,
+ 686073600000,
+ 695750400000,
+ 701794800000,
+ 717519600000,
+ 733244400000,
+ 748969200000,
+ 764694000000,
+ 780418800000,
+ 796143600000,
+ 811868400000,
+ 828198000000,
+ 846342000000,
+ 859647600000,
+ 877791600000,
+ 891097200000,
+ 909241200000,
+ 922546800000,
+ 941295600000,
+ 953996400000,
+ 972745200000,
+ 985446000000,
+ 1004194800000,
+ 1017500400000,
+ 1035644400000,
+ 1048950000000,
+ 1067094000000,
+ 1080399600000,
+ 1099148400000,
+ 1111849200000,
+ 1130598000000,
+ 1143298800000,
+ 1162047600000,
+ 1174748400000,
+ 1193497200000,
+ 1206802800000,
+ 1224946800000,
+ 1238252400000,
+ 1256396400000,
+ 1269702000000,
+ 1288450800000,
+ 1301151600000,
+ 1414245600000,
+ 1461427200000,
+ null
+ ],
+ "offsets": [
+ -603.2,
+ -600,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -600,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -600,
+ -660
+ ],
+ "population": 95263
+ },
+ {
+ "name": "Asia/Makassar",
+ "abbrs": [
+ "LMT",
+ "MMT",
+ "+08",
+ "+09",
+ "WITA"
+ ],
+ "untils": [
+ -1577951856000,
+ -1172908656000,
+ -880272000000,
+ -766054800000,
+ null
+ ],
+ "offsets": [
+ -477.6,
+ -477.6,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 1484000
+ },
+ {
+ "name": "Asia/Manila",
+ "abbrs": [
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08"
+ ],
+ "untils": [
+ -1046678400000,
+ -1038733200000,
+ -873273600000,
+ -794221200000,
+ -496224000000,
+ -489315600000,
+ 259344000000,
+ 275151600000,
+ null
+ ],
+ "offsets": [
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 24123000
+ },
+ {
+ "name": "Asia/Muscat",
+ "abbrs": [
+ "LMT",
+ "+04"
+ ],
+ "untils": [
+ -1577936472000,
+ null
+ ],
+ "offsets": [
+ -221.2,
+ -240
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Nicosia",
+ "abbrs": [
+ "LMT",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -1518920008000,
+ 166572000000,
+ 182293200000,
+ 200959200000,
+ 213829200000,
+ 228866400000,
+ 243982800000,
+ 260316000000,
+ 276123600000,
+ 291765600000,
+ 307486800000,
+ 323820000000,
+ 338936400000,
+ 354664800000,
+ 370386000000,
+ 386114400000,
+ 401835600000,
+ 417564000000,
+ 433285200000,
+ 449013600000,
+ 465339600000,
+ 481068000000,
+ 496789200000,
+ 512517600000,
+ 528238800000,
+ 543967200000,
+ 559688400000,
+ 575416800000,
+ 591138000000,
+ 606866400000,
+ 622587600000,
+ 638316000000,
+ 654642000000,
+ 670370400000,
+ 686091600000,
+ 701820000000,
+ 717541200000,
+ 733269600000,
+ 748990800000,
+ 764719200000,
+ 780440400000,
+ 796168800000,
+ 811890000000,
+ 828223200000,
+ 843944400000,
+ 859672800000,
+ 875394000000,
+ 891122400000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -133.4667,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 321816
+ },
+ {
+ "name": "Asia/Novokuznetsk",
+ "abbrs": [
+ "LMT",
+ "+06",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+06",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+06",
+ "+07"
+ ],
+ "untils": [
+ -1441259328000,
+ -1247551200000,
+ 354906000000,
+ 370713600000,
+ 386442000000,
+ 402249600000,
+ 417978000000,
+ 433785600000,
+ 449600400000,
+ 465332400000,
+ 481057200000,
+ 496782000000,
+ 512506800000,
+ 528231600000,
+ 543956400000,
+ 559681200000,
+ 575406000000,
+ 591130800000,
+ 606855600000,
+ 622580400000,
+ 638305200000,
+ 654634800000,
+ 686088000000,
+ 695764800000,
+ 701809200000,
+ 717534000000,
+ 733258800000,
+ 748983600000,
+ 764708400000,
+ 780433200000,
+ 796158000000,
+ 811882800000,
+ 828212400000,
+ 846356400000,
+ 859662000000,
+ 877806000000,
+ 891111600000,
+ 909255600000,
+ 922561200000,
+ 941310000000,
+ 954010800000,
+ 972759600000,
+ 985460400000,
+ 1004209200000,
+ 1017514800000,
+ 1035658800000,
+ 1048964400000,
+ 1067108400000,
+ 1080414000000,
+ 1099162800000,
+ 1111863600000,
+ 1130612400000,
+ 1143313200000,
+ 1162062000000,
+ 1174762800000,
+ 1193511600000,
+ 1206817200000,
+ 1224961200000,
+ 1238266800000,
+ 1256410800000,
+ 1288468800000,
+ 1301169600000,
+ null
+ ],
+ "offsets": [
+ -348.8,
+ -360,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -360,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -360,
+ -420
+ ],
+ "population": 549383
+ },
+ {
+ "name": "Asia/Novosibirsk",
+ "abbrs": [
+ "LMT",
+ "+06",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+06",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07"
+ ],
+ "untils": [
+ -1579476700000,
+ -1247551200000,
+ 354906000000,
+ 370713600000,
+ 386442000000,
+ 402249600000,
+ 417978000000,
+ 433785600000,
+ 449600400000,
+ 465332400000,
+ 481057200000,
+ 496782000000,
+ 512506800000,
+ 528231600000,
+ 543956400000,
+ 559681200000,
+ 575406000000,
+ 591130800000,
+ 606855600000,
+ 622580400000,
+ 638305200000,
+ 654634800000,
+ 686088000000,
+ 695764800000,
+ 701809200000,
+ 717534000000,
+ 733258800000,
+ 738086400000,
+ 748987200000,
+ 764712000000,
+ 780436800000,
+ 796161600000,
+ 811886400000,
+ 828216000000,
+ 846360000000,
+ 859665600000,
+ 877809600000,
+ 891115200000,
+ 909259200000,
+ 922564800000,
+ 941313600000,
+ 954014400000,
+ 972763200000,
+ 985464000000,
+ 1004212800000,
+ 1017518400000,
+ 1035662400000,
+ 1048968000000,
+ 1067112000000,
+ 1080417600000,
+ 1099166400000,
+ 1111867200000,
+ 1130616000000,
+ 1143316800000,
+ 1162065600000,
+ 1174766400000,
+ 1193515200000,
+ 1206820800000,
+ 1224964800000,
+ 1238270400000,
+ 1256414400000,
+ 1269720000000,
+ 1288468800000,
+ 1301169600000,
+ 1414263600000,
+ 1469304000000,
+ null
+ ],
+ "offsets": [
+ -331.6667,
+ -360,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -360,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420
+ ],
+ "population": 1486000
+ },
+ {
+ "name": "Asia/Omsk",
+ "abbrs": [
+ "LMT",
+ "+05",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+05",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06"
+ ],
+ "untils": [
+ -1582088010000,
+ -1247547600000,
+ 354909600000,
+ 370717200000,
+ 386445600000,
+ 402253200000,
+ 417981600000,
+ 433789200000,
+ 449604000000,
+ 465336000000,
+ 481060800000,
+ 496785600000,
+ 512510400000,
+ 528235200000,
+ 543960000000,
+ 559684800000,
+ 575409600000,
+ 591134400000,
+ 606859200000,
+ 622584000000,
+ 638308800000,
+ 654638400000,
+ 686091600000,
+ 695768400000,
+ 701812800000,
+ 717537600000,
+ 733262400000,
+ 748987200000,
+ 764712000000,
+ 780436800000,
+ 796161600000,
+ 811886400000,
+ 828216000000,
+ 846360000000,
+ 859665600000,
+ 877809600000,
+ 891115200000,
+ 909259200000,
+ 922564800000,
+ 941313600000,
+ 954014400000,
+ 972763200000,
+ 985464000000,
+ 1004212800000,
+ 1017518400000,
+ 1035662400000,
+ 1048968000000,
+ 1067112000000,
+ 1080417600000,
+ 1099166400000,
+ 1111867200000,
+ 1130616000000,
+ 1143316800000,
+ 1162065600000,
+ 1174766400000,
+ 1193515200000,
+ 1206820800000,
+ 1224964800000,
+ 1238270400000,
+ 1256414400000,
+ 1269720000000,
+ 1288468800000,
+ 1301169600000,
+ 1414263600000,
+ null
+ ],
+ "offsets": [
+ -293.5,
+ -300,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -300,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360
+ ],
+ "population": 1154000
+ },
+ {
+ "name": "Asia/Oral",
+ "abbrs": [
+ "LMT",
+ "+03",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05"
+ ],
+ "untils": [
+ -1441164324000,
+ -1247540400000,
+ 354913200000,
+ 402256800000,
+ 417985200000,
+ 433792800000,
+ 449607600000,
+ 465339600000,
+ 481064400000,
+ 496789200000,
+ 512514000000,
+ 528238800000,
+ 543963600000,
+ 559688400000,
+ 575413200000,
+ 591138000000,
+ 622591200000,
+ 638316000000,
+ 654645600000,
+ 670370400000,
+ 686095200000,
+ 695772000000,
+ 717544800000,
+ 733269600000,
+ 748994400000,
+ 764719200000,
+ 780444000000,
+ 796168800000,
+ 811893600000,
+ 828223200000,
+ 846367200000,
+ 859672800000,
+ 877816800000,
+ 891122400000,
+ 909266400000,
+ 922572000000,
+ 941320800000,
+ 954021600000,
+ 972770400000,
+ 985471200000,
+ 1004220000000,
+ 1017525600000,
+ 1035669600000,
+ 1048975200000,
+ 1067119200000,
+ 1080424800000,
+ null
+ ],
+ "offsets": [
+ -205.4,
+ -180,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300
+ ],
+ "population": 271900
+ },
+ {
+ "name": "Asia/Phnom_Penh",
+ "abbrs": [
+ "BMT",
+ "+07"
+ ],
+ "untils": [
+ -1570084924000,
+ null
+ ],
+ "offsets": [
+ -402.0667,
+ -420
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Pontianak",
+ "abbrs": [
+ "LMT",
+ "PMT",
+ "+0730",
+ "+09",
+ "+0730",
+ "+08",
+ "+0730",
+ "WITA",
+ "WIB"
+ ],
+ "untils": [
+ -1946186240000,
+ -1172906240000,
+ -881220600000,
+ -766054800000,
+ -683883000000,
+ -620812800000,
+ -189415800000,
+ 567964800000,
+ null
+ ],
+ "offsets": [
+ -437.3333,
+ -437.3333,
+ -450,
+ -540,
+ -450,
+ -480,
+ -450,
+ -480,
+ -420
+ ],
+ "population": 234021
+ },
+ {
+ "name": "Asia/Pyongyang",
+ "abbrs": [
+ "LMT",
+ "KST",
+ "JST",
+ "KST",
+ "KST",
+ "KST"
+ ],
+ "untils": [
+ -1948782180000,
+ -1830414600000,
+ -768646800000,
+ 1439564400000,
+ 1525447800000,
+ null
+ ],
+ "offsets": [
+ -503,
+ -510,
+ -540,
+ -540,
+ -510,
+ -540
+ ],
+ "population": 2850000
+ },
+ {
+ "name": "Asia/Qatar",
+ "abbrs": [
+ "LMT",
+ "+04",
+ "+03"
+ ],
+ "untils": [
+ -1577935568000,
+ 76190400000,
+ null
+ ],
+ "offsets": [
+ -206.1333,
+ -240,
+ -180
+ ],
+ "population": 956460
+ },
+ {
+ "name": "Asia/Qyzylorda",
+ "abbrs": [
+ "LMT",
+ "+04",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06"
+ ],
+ "untils": [
+ -1441167712000,
+ -1247544000000,
+ 354913200000,
+ 402256800000,
+ 417985200000,
+ 433792800000,
+ 449607600000,
+ 465339600000,
+ 481064400000,
+ 496789200000,
+ 512514000000,
+ 528238800000,
+ 543963600000,
+ 559688400000,
+ 575413200000,
+ 591138000000,
+ 606862800000,
+ 622587600000,
+ 638312400000,
+ 654642000000,
+ 695768400000,
+ 717541200000,
+ 733266000000,
+ 748990800000,
+ 764715600000,
+ 780440400000,
+ 796165200000,
+ 811890000000,
+ 828219600000,
+ 846363600000,
+ 859669200000,
+ 877813200000,
+ 891118800000,
+ 909262800000,
+ 922568400000,
+ 941317200000,
+ 954018000000,
+ 972766800000,
+ 985467600000,
+ 1004216400000,
+ 1017522000000,
+ 1035666000000,
+ 1048971600000,
+ 1067115600000,
+ 1080421200000,
+ null
+ ],
+ "offsets": [
+ -261.8667,
+ -240,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360
+ ],
+ "population": 727990
+ },
+ {
+ "name": "Asia/Rangoon",
+ "abbrs": [
+ "RMT",
+ "+0630",
+ "+09",
+ "+0630"
+ ],
+ "untils": [
+ -1577946287000,
+ -873268200000,
+ -778410000000,
+ null
+ ],
+ "offsets": [
+ -384.7833,
+ -390,
+ -540,
+ -390
+ ],
+ "population": 4800000
+ },
+ {
+ "name": "Asia/Riyadh",
+ "abbrs": [
+ "LMT",
+ "+03"
+ ],
+ "untils": [
+ -719636812000,
+ null
+ ],
+ "offsets": [
+ -186.8667,
+ -180
+ ],
+ "population": 5666000
+ },
+ {
+ "name": "Asia/Saigon",
+ "abbrs": [
+ "LMT",
+ "PLMT",
+ "+07",
+ "+08",
+ "+09",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07"
+ ],
+ "untils": [
+ -2004073600000,
+ -1851577590000,
+ -852105600000,
+ -782643600000,
+ -767869200000,
+ -718095600000,
+ -457776000000,
+ -315648000000,
+ 171820800000,
+ null
+ ],
+ "offsets": [
+ -426.6667,
+ -426.5,
+ -420,
+ -480,
+ -540,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Sakhalin",
+ "abbrs": [
+ "LMT",
+ "+09",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+10",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11"
+ ],
+ "untils": [
+ -2031039048000,
+ -768560400000,
+ 354891600000,
+ 370699200000,
+ 386427600000,
+ 402235200000,
+ 417963600000,
+ 433771200000,
+ 449586000000,
+ 465318000000,
+ 481042800000,
+ 496767600000,
+ 512492400000,
+ 528217200000,
+ 543942000000,
+ 559666800000,
+ 575391600000,
+ 591116400000,
+ 606841200000,
+ 622566000000,
+ 638290800000,
+ 654620400000,
+ 686073600000,
+ 695750400000,
+ 701794800000,
+ 717519600000,
+ 733244400000,
+ 748969200000,
+ 764694000000,
+ 780418800000,
+ 796143600000,
+ 811868400000,
+ 828198000000,
+ 846342000000,
+ 877795200000,
+ 891100800000,
+ 909244800000,
+ 922550400000,
+ 941299200000,
+ 954000000000,
+ 972748800000,
+ 985449600000,
+ 1004198400000,
+ 1017504000000,
+ 1035648000000,
+ 1048953600000,
+ 1067097600000,
+ 1080403200000,
+ 1099152000000,
+ 1111852800000,
+ 1130601600000,
+ 1143302400000,
+ 1162051200000,
+ 1174752000000,
+ 1193500800000,
+ 1206806400000,
+ 1224950400000,
+ 1238256000000,
+ 1256400000000,
+ 1269705600000,
+ 1288454400000,
+ 1301155200000,
+ 1414249200000,
+ 1459008000000,
+ null
+ ],
+ "offsets": [
+ -570.8,
+ -540,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -600,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660
+ ],
+ "population": 580000
+ },
+ {
+ "name": "Asia/Samarkand",
+ "abbrs": [
+ "LMT",
+ "+04",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05"
+ ],
+ "untils": [
+ -1441168073000,
+ -1247544000000,
+ 354913200000,
+ 402256800000,
+ 417985200000,
+ 433792800000,
+ 449607600000,
+ 465339600000,
+ 481064400000,
+ 496789200000,
+ 512514000000,
+ 528238800000,
+ 543963600000,
+ 559688400000,
+ 575413200000,
+ 591138000000,
+ 606862800000,
+ 622587600000,
+ 638312400000,
+ 654642000000,
+ 670366800000,
+ 686091600000,
+ null
+ ],
+ "offsets": [
+ -267.8833,
+ -240,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300
+ ],
+ "population": 361339
+ },
+ {
+ "name": "Asia/Seoul",
+ "abbrs": [
+ "LMT",
+ "KST",
+ "JST",
+ "KST",
+ "KST",
+ "KDT",
+ "KST",
+ "KDT",
+ "KST",
+ "KDT",
+ "KST",
+ "KDT",
+ "KST",
+ "KDT",
+ "KST",
+ "KDT",
+ "KST",
+ "KST",
+ "KDT",
+ "KST",
+ "KDT",
+ "KST"
+ ],
+ "untils": [
+ -1948782472000,
+ -1830414600000,
+ -767350800000,
+ -498128400000,
+ -462702600000,
+ -451733400000,
+ -429784200000,
+ -418296600000,
+ -399544200000,
+ -387451800000,
+ -368094600000,
+ -356002200000,
+ -336645000000,
+ -324552600000,
+ -305195400000,
+ -293103000000,
+ -264933000000,
+ 547578000000,
+ 560883600000,
+ 579027600000,
+ 592333200000,
+ null
+ ],
+ "offsets": [
+ -507.8667,
+ -510,
+ -540,
+ -540,
+ -510,
+ -570,
+ -510,
+ -570,
+ -510,
+ -570,
+ -510,
+ -570,
+ -510,
+ -570,
+ -510,
+ -570,
+ -510,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540
+ ],
+ "population": 23480000
+ },
+ {
+ "name": "Asia/Shanghai",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -933494400000,
+ -923130000000,
+ -908784000000,
+ -891594000000,
+ 515520000000,
+ 527007600000,
+ 545155200000,
+ 558457200000,
+ 576604800000,
+ 589906800000,
+ 608659200000,
+ 621961200000,
+ 640108800000,
+ 653410800000,
+ 671558400000,
+ 684860400000,
+ null
+ ],
+ "offsets": [
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 23416000
+ },
+ {
+ "name": "Asia/Singapore",
+ "abbrs": [
+ "SMT",
+ "+07",
+ "+0720",
+ "+0730",
+ "+09",
+ "+0730",
+ "+08"
+ ],
+ "untils": [
+ -2038200925000,
+ -1167634800000,
+ -894180000000,
+ -879665400000,
+ -767005200000,
+ 378664200000,
+ null
+ ],
+ "offsets": [
+ -415.4167,
+ -420,
+ -440,
+ -450,
+ -540,
+ -450,
+ -480
+ ],
+ "population": 5624000
+ },
+ {
+ "name": "Asia/Srednekolymsk",
+ "abbrs": [
+ "LMT",
+ "+10",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+10",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11"
+ ],
+ "untils": [
+ -1441188892000,
+ -1247565600000,
+ 354891600000,
+ 370699200000,
+ 386427600000,
+ 402235200000,
+ 417963600000,
+ 433771200000,
+ 449586000000,
+ 465318000000,
+ 481042800000,
+ 496767600000,
+ 512492400000,
+ 528217200000,
+ 543942000000,
+ 559666800000,
+ 575391600000,
+ 591116400000,
+ 606841200000,
+ 622566000000,
+ 638290800000,
+ 654620400000,
+ 686073600000,
+ 695750400000,
+ 701794800000,
+ 717519600000,
+ 733244400000,
+ 748969200000,
+ 764694000000,
+ 780418800000,
+ 796143600000,
+ 811868400000,
+ 828198000000,
+ 846342000000,
+ 859647600000,
+ 877791600000,
+ 891097200000,
+ 909241200000,
+ 922546800000,
+ 941295600000,
+ 953996400000,
+ 972745200000,
+ 985446000000,
+ 1004194800000,
+ 1017500400000,
+ 1035644400000,
+ 1048950000000,
+ 1067094000000,
+ 1080399600000,
+ 1099148400000,
+ 1111849200000,
+ 1130598000000,
+ 1143298800000,
+ 1162047600000,
+ 1174748400000,
+ 1193497200000,
+ 1206802800000,
+ 1224946800000,
+ 1238252400000,
+ 1256396400000,
+ 1269702000000,
+ 1288450800000,
+ 1301151600000,
+ 1414245600000,
+ null
+ ],
+ "offsets": [
+ -614.8667,
+ -600,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -600,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660
+ ],
+ "population": 3525
+ },
+ {
+ "name": "Asia/Taipei",
+ "abbrs": [
+ "CST",
+ "JST",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1017820800000,
+ -766224000000,
+ -745833600000,
+ -733827600000,
+ -716889600000,
+ -699613200000,
+ -683884800000,
+ -670669200000,
+ -652348800000,
+ -639133200000,
+ -620812800000,
+ -607597200000,
+ -589276800000,
+ -576061200000,
+ -562924800000,
+ -541760400000,
+ -528710400000,
+ -510224400000,
+ -497174400000,
+ -478688400000,
+ -465638400000,
+ -449830800000,
+ -434016000000,
+ -418208400000,
+ -402480000000,
+ -386672400000,
+ -370944000000,
+ -355136400000,
+ -339408000000,
+ -323600400000,
+ -302515200000,
+ -291978000000,
+ -270979200000,
+ -260442000000,
+ 133977600000,
+ 149785200000,
+ 165513600000,
+ 181321200000,
+ 299606400000,
+ 307551600000,
+ null
+ ],
+ "offsets": [
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 7438000
+ },
+ {
+ "name": "Asia/Tashkent",
+ "abbrs": [
+ "LMT",
+ "+05",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+05"
+ ],
+ "untils": [
+ -1441168631000,
+ -1247547600000,
+ 354909600000,
+ 370717200000,
+ 386445600000,
+ 402253200000,
+ 417981600000,
+ 433789200000,
+ 449604000000,
+ 465336000000,
+ 481060800000,
+ 496785600000,
+ 512510400000,
+ 528235200000,
+ 543960000000,
+ 559684800000,
+ 575409600000,
+ 591134400000,
+ 606859200000,
+ 622584000000,
+ 638308800000,
+ 654638400000,
+ 686091600000,
+ null
+ ],
+ "offsets": [
+ -277.1833,
+ -300,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -300
+ ],
+ "population": 2250000
+ },
+ {
+ "name": "Asia/Tbilisi",
+ "abbrs": [
+ "TBMT",
+ "+03",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+03",
+ "+04"
+ ],
+ "untils": [
+ -1441162751000,
+ -405140400000,
+ 354916800000,
+ 370724400000,
+ 386452800000,
+ 402260400000,
+ 417988800000,
+ 433796400000,
+ 449611200000,
+ 465343200000,
+ 481068000000,
+ 496792800000,
+ 512517600000,
+ 528242400000,
+ 543967200000,
+ 559692000000,
+ 575416800000,
+ 591141600000,
+ 606866400000,
+ 622591200000,
+ 638316000000,
+ 654645600000,
+ 686098800000,
+ 701816400000,
+ 717537600000,
+ 733266000000,
+ 748987200000,
+ 764715600000,
+ 796161600000,
+ 811882800000,
+ 828216000000,
+ 877806000000,
+ 891115200000,
+ 909255600000,
+ 922564800000,
+ 941310000000,
+ 954014400000,
+ 972759600000,
+ 985464000000,
+ 1004209200000,
+ 1017518400000,
+ 1035658800000,
+ 1048968000000,
+ 1067108400000,
+ 1080417600000,
+ 1088276400000,
+ 1099177200000,
+ 1111878000000,
+ null
+ ],
+ "offsets": [
+ -179.1833,
+ -180,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -180,
+ -240
+ ],
+ "population": 1125000
+ },
+ {
+ "name": "Asia/Tehran",
+ "abbrs": [
+ "LMT",
+ "TMT",
+ "+0330",
+ "+04",
+ "+05",
+ "+04",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330"
+ ],
+ "untils": [
+ -1704165944000,
+ -757394744000,
+ 247177800000,
+ 259272000000,
+ 277758000000,
+ 283982400000,
+ 290809800000,
+ 306531000000,
+ 322432200000,
+ 338499000000,
+ 673216200000,
+ 685481400000,
+ 701209800000,
+ 717103800000,
+ 732745800000,
+ 748639800000,
+ 764281800000,
+ 780175800000,
+ 795817800000,
+ 811711800000,
+ 827353800000,
+ 843247800000,
+ 858976200000,
+ 874870200000,
+ 890512200000,
+ 906406200000,
+ 922048200000,
+ 937942200000,
+ 953584200000,
+ 969478200000,
+ 985206600000,
+ 1001100600000,
+ 1016742600000,
+ 1032636600000,
+ 1048278600000,
+ 1064172600000,
+ 1079814600000,
+ 1095708600000,
+ 1111437000000,
+ 1127331000000,
+ 1206045000000,
+ 1221939000000,
+ 1237667400000,
+ 1253561400000,
+ 1269203400000,
+ 1285097400000,
+ 1300739400000,
+ 1316633400000,
+ 1332275400000,
+ 1348169400000,
+ 1363897800000,
+ 1379791800000,
+ 1395433800000,
+ 1411327800000,
+ 1426969800000,
+ 1442863800000,
+ 1458505800000,
+ 1474399800000,
+ 1490128200000,
+ 1506022200000,
+ 1521664200000,
+ 1537558200000,
+ 1553200200000,
+ 1569094200000,
+ 1584736200000,
+ 1600630200000,
+ 1616358600000,
+ 1632252600000,
+ 1647894600000,
+ 1663788600000,
+ 1679430600000,
+ 1695324600000,
+ 1710966600000,
+ 1726860600000,
+ 1742589000000,
+ 1758483000000,
+ 1774125000000,
+ 1790019000000,
+ 1805661000000,
+ 1821555000000,
+ 1837197000000,
+ 1853091000000,
+ 1868733000000,
+ 1884627000000,
+ 1900355400000,
+ 1916249400000,
+ 1931891400000,
+ 1947785400000,
+ 1963427400000,
+ 1979321400000,
+ 1994963400000,
+ 2010857400000,
+ 2026585800000,
+ 2042479800000,
+ 2058121800000,
+ 2074015800000,
+ 2089657800000,
+ 2105551800000,
+ 2121193800000,
+ 2137087800000,
+ null
+ ],
+ "offsets": [
+ -205.7333,
+ -205.7333,
+ -210,
+ -240,
+ -300,
+ -240,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210
+ ],
+ "population": 13532000
+ },
+ {
+ "name": "Asia/Tel_Aviv",
+ "abbrs": [
+ "JMT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDDT",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST"
+ ],
+ "untils": [
+ -1641003640000,
+ -933645600000,
+ -857358000000,
+ -844300800000,
+ -825822000000,
+ -812685600000,
+ -794199600000,
+ -779853600000,
+ -762656400000,
+ -748310400000,
+ -731127600000,
+ -681962400000,
+ -673243200000,
+ -667962000000,
+ -652327200000,
+ -636426000000,
+ -622087200000,
+ -608947200000,
+ -591847200000,
+ -572486400000,
+ -558576000000,
+ -542851200000,
+ -527731200000,
+ -514425600000,
+ -490845600000,
+ -482986800000,
+ -459475200000,
+ -451537200000,
+ -428551200000,
+ -418262400000,
+ -400032000000,
+ -387428400000,
+ 142380000000,
+ 150843600000,
+ 167176800000,
+ 178664400000,
+ 482277600000,
+ 495579600000,
+ 516751200000,
+ 526424400000,
+ 545436000000,
+ 558478800000,
+ 576626400000,
+ 589323600000,
+ 609890400000,
+ 620773200000,
+ 638316000000,
+ 651618000000,
+ 669765600000,
+ 683672400000,
+ 701820000000,
+ 715726800000,
+ 733701600000,
+ 747176400000,
+ 765151200000,
+ 778021200000,
+ 796600800000,
+ 810075600000,
+ 826840800000,
+ 842821200000,
+ 858895200000,
+ 874184400000,
+ 890344800000,
+ 905029200000,
+ 923011200000,
+ 936313200000,
+ 955670400000,
+ 970783200000,
+ 986770800000,
+ 1001282400000,
+ 1017356400000,
+ 1033941600000,
+ 1048806000000,
+ 1065132000000,
+ 1081292400000,
+ 1095804000000,
+ 1112313600000,
+ 1128812400000,
+ 1143763200000,
+ 1159657200000,
+ 1175212800000,
+ 1189897200000,
+ 1206662400000,
+ 1223161200000,
+ 1238112000000,
+ 1254006000000,
+ 1269561600000,
+ 1284246000000,
+ 1301616000000,
+ 1317510000000,
+ 1333065600000,
+ 1348354800000,
+ 1364515200000,
+ 1382828400000,
+ 1395964800000,
+ 1414278000000,
+ 1427414400000,
+ 1445727600000,
+ 1458864000000,
+ 1477782000000,
+ 1490313600000,
+ 1509231600000,
+ 1521763200000,
+ 1540681200000,
+ 1553817600000,
+ 1572130800000,
+ 1585267200000,
+ 1603580400000,
+ 1616716800000,
+ 1635634800000,
+ 1648166400000,
+ 1667084400000,
+ 1679616000000,
+ 1698534000000,
+ 1711670400000,
+ 1729983600000,
+ 1743120000000,
+ 1761433200000,
+ 1774569600000,
+ 1792882800000,
+ 1806019200000,
+ 1824937200000,
+ 1837468800000,
+ 1856386800000,
+ 1868918400000,
+ 1887836400000,
+ 1900972800000,
+ 1919286000000,
+ 1932422400000,
+ 1950735600000,
+ 1963872000000,
+ 1982790000000,
+ 1995321600000,
+ 2014239600000,
+ 2026771200000,
+ 2045689200000,
+ 2058220800000,
+ 2077138800000,
+ 2090275200000,
+ 2108588400000,
+ 2121724800000,
+ 2140038000000,
+ null
+ ],
+ "offsets": [
+ -140.6667,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -240,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Thimbu",
+ "abbrs": [
+ "LMT",
+ "+0530",
+ "+06"
+ ],
+ "untils": [
+ -706341516000,
+ 560025000000,
+ null
+ ],
+ "offsets": [
+ -358.6,
+ -330,
+ -360
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Thimphu",
+ "abbrs": [
+ "LMT",
+ "+0530",
+ "+06"
+ ],
+ "untils": [
+ -706341516000,
+ 560025000000,
+ null
+ ],
+ "offsets": [
+ -358.6,
+ -330,
+ -360
+ ],
+ "population": 79185
+ },
+ {
+ "name": "Asia/Tokyo",
+ "abbrs": [
+ "JST",
+ "JDT",
+ "JST",
+ "JDT",
+ "JST",
+ "JDT",
+ "JST",
+ "JDT",
+ "JST"
+ ],
+ "untils": [
+ -683802000000,
+ -672314400000,
+ -654771600000,
+ -640864800000,
+ -620298000000,
+ -609415200000,
+ -588848400000,
+ -577965600000,
+ null
+ ],
+ "offsets": [
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540
+ ],
+ "population": 37843000
+ },
+ {
+ "name": "Asia/Tomsk",
+ "abbrs": [
+ "LMT",
+ "+06",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+06",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+08",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07",
+ "+06",
+ "+07"
+ ],
+ "untils": [
+ -1578807591000,
+ -1247551200000,
+ 354906000000,
+ 370713600000,
+ 386442000000,
+ 402249600000,
+ 417978000000,
+ 433785600000,
+ 449600400000,
+ 465332400000,
+ 481057200000,
+ 496782000000,
+ 512506800000,
+ 528231600000,
+ 543956400000,
+ 559681200000,
+ 575406000000,
+ 591130800000,
+ 606855600000,
+ 622580400000,
+ 638305200000,
+ 654634800000,
+ 686088000000,
+ 695764800000,
+ 701809200000,
+ 717534000000,
+ 733258800000,
+ 748983600000,
+ 764708400000,
+ 780433200000,
+ 796158000000,
+ 811882800000,
+ 828212400000,
+ 846356400000,
+ 859662000000,
+ 877806000000,
+ 891111600000,
+ 909255600000,
+ 922561200000,
+ 941310000000,
+ 954010800000,
+ 972759600000,
+ 985460400000,
+ 1004209200000,
+ 1017514800000,
+ 1020193200000,
+ 1035662400000,
+ 1048968000000,
+ 1067112000000,
+ 1080417600000,
+ 1099166400000,
+ 1111867200000,
+ 1130616000000,
+ 1143316800000,
+ 1162065600000,
+ 1174766400000,
+ 1193515200000,
+ 1206820800000,
+ 1224964800000,
+ 1238270400000,
+ 1256414400000,
+ 1269720000000,
+ 1288468800000,
+ 1301169600000,
+ 1414263600000,
+ 1464465600000,
+ null
+ ],
+ "offsets": [
+ -339.85,
+ -360,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -360,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -480,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420,
+ -360,
+ -420
+ ],
+ "population": 1047394
+ },
+ {
+ "name": "Asia/Ujung_Pandang",
+ "abbrs": [
+ "LMT",
+ "MMT",
+ "+08",
+ "+09",
+ "WITA"
+ ],
+ "untils": [
+ -1577951856000,
+ -1172908656000,
+ -880272000000,
+ -766054800000,
+ null
+ ],
+ "offsets": [
+ -477.6,
+ -477.6,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Ulaanbaatar",
+ "abbrs": [
+ "LMT",
+ "+07",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08"
+ ],
+ "untils": [
+ -2032931252000,
+ 252435600000,
+ 417974400000,
+ 433782000000,
+ 449596800000,
+ 465318000000,
+ 481046400000,
+ 496767600000,
+ 512496000000,
+ 528217200000,
+ 543945600000,
+ 559666800000,
+ 575395200000,
+ 591116400000,
+ 606844800000,
+ 622566000000,
+ 638294400000,
+ 654620400000,
+ 670348800000,
+ 686070000000,
+ 701798400000,
+ 717519600000,
+ 733248000000,
+ 748969200000,
+ 764697600000,
+ 780418800000,
+ 796147200000,
+ 811868400000,
+ 828201600000,
+ 843922800000,
+ 859651200000,
+ 875372400000,
+ 891100800000,
+ 906822000000,
+ 988394400000,
+ 1001696400000,
+ 1017424800000,
+ 1033146000000,
+ 1048874400000,
+ 1064595600000,
+ 1080324000000,
+ 1096045200000,
+ 1111773600000,
+ 1127494800000,
+ 1143223200000,
+ 1159549200000,
+ 1427479200000,
+ 1443193200000,
+ 1458928800000,
+ 1474642800000,
+ null
+ ],
+ "offsets": [
+ -427.5333,
+ -420,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 1237000
+ },
+ {
+ "name": "Asia/Ulan_Bator",
+ "abbrs": [
+ "LMT",
+ "+07",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08",
+ "+09",
+ "+08"
+ ],
+ "untils": [
+ -2032931252000,
+ 252435600000,
+ 417974400000,
+ 433782000000,
+ 449596800000,
+ 465318000000,
+ 481046400000,
+ 496767600000,
+ 512496000000,
+ 528217200000,
+ 543945600000,
+ 559666800000,
+ 575395200000,
+ 591116400000,
+ 606844800000,
+ 622566000000,
+ 638294400000,
+ 654620400000,
+ 670348800000,
+ 686070000000,
+ 701798400000,
+ 717519600000,
+ 733248000000,
+ 748969200000,
+ 764697600000,
+ 780418800000,
+ 796147200000,
+ 811868400000,
+ 828201600000,
+ 843922800000,
+ 859651200000,
+ 875372400000,
+ 891100800000,
+ 906822000000,
+ 988394400000,
+ 1001696400000,
+ 1017424800000,
+ 1033146000000,
+ 1048874400000,
+ 1064595600000,
+ 1080324000000,
+ 1096045200000,
+ 1111773600000,
+ 1127494800000,
+ 1143223200000,
+ 1159549200000,
+ 1427479200000,
+ 1443193200000,
+ 1458928800000,
+ 1474642800000,
+ null
+ ],
+ "offsets": [
+ -427.5333,
+ -420,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Urumqi",
+ "abbrs": [
+ "LMT",
+ "+06"
+ ],
+ "untils": [
+ -1325483420000,
+ null
+ ],
+ "offsets": [
+ -350.3333,
+ -360
+ ],
+ "population": 3184000
+ },
+ {
+ "name": "Asia/Ust-Nera",
+ "abbrs": [
+ "LMT",
+ "+08",
+ "+09",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+10",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+10"
+ ],
+ "untils": [
+ -1579426374000,
+ -1247558400000,
+ 354898800000,
+ 370699200000,
+ 386427600000,
+ 402235200000,
+ 417963600000,
+ 433771200000,
+ 449586000000,
+ 465318000000,
+ 481042800000,
+ 496767600000,
+ 512492400000,
+ 528217200000,
+ 543942000000,
+ 559666800000,
+ 575391600000,
+ 591116400000,
+ 606841200000,
+ 622566000000,
+ 638290800000,
+ 654620400000,
+ 686073600000,
+ 695750400000,
+ 701794800000,
+ 717519600000,
+ 733244400000,
+ 748969200000,
+ 764694000000,
+ 780418800000,
+ 796143600000,
+ 811868400000,
+ 828198000000,
+ 846342000000,
+ 859647600000,
+ 877791600000,
+ 891097200000,
+ 909241200000,
+ 922546800000,
+ 941295600000,
+ 953996400000,
+ 972745200000,
+ 985446000000,
+ 1004194800000,
+ 1017500400000,
+ 1035644400000,
+ 1048950000000,
+ 1067094000000,
+ 1080399600000,
+ 1099148400000,
+ 1111849200000,
+ 1130598000000,
+ 1143298800000,
+ 1162047600000,
+ 1174748400000,
+ 1193497200000,
+ 1206802800000,
+ 1224946800000,
+ 1238252400000,
+ 1256396400000,
+ 1269702000000,
+ 1288450800000,
+ 1301151600000,
+ 1315828800000,
+ 1414249200000,
+ null
+ ],
+ "offsets": [
+ -572.9,
+ -480,
+ -540,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -600,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -600
+ ],
+ "population": 6463
+ },
+ {
+ "name": "Asia/Vientiane",
+ "abbrs": [
+ "BMT",
+ "+07"
+ ],
+ "untils": [
+ -1570084924000,
+ null
+ ],
+ "offsets": [
+ -402.0667,
+ -420
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Vladivostok",
+ "abbrs": [
+ "LMT",
+ "+09",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+09",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10",
+ "+11",
+ "+10"
+ ],
+ "untils": [
+ -1487321251000,
+ -1247562000000,
+ 354895200000,
+ 370702800000,
+ 386431200000,
+ 402238800000,
+ 417967200000,
+ 433774800000,
+ 449589600000,
+ 465321600000,
+ 481046400000,
+ 496771200000,
+ 512496000000,
+ 528220800000,
+ 543945600000,
+ 559670400000,
+ 575395200000,
+ 591120000000,
+ 606844800000,
+ 622569600000,
+ 638294400000,
+ 654624000000,
+ 686077200000,
+ 695754000000,
+ 701798400000,
+ 717523200000,
+ 733248000000,
+ 748972800000,
+ 764697600000,
+ 780422400000,
+ 796147200000,
+ 811872000000,
+ 828201600000,
+ 846345600000,
+ 859651200000,
+ 877795200000,
+ 891100800000,
+ 909244800000,
+ 922550400000,
+ 941299200000,
+ 954000000000,
+ 972748800000,
+ 985449600000,
+ 1004198400000,
+ 1017504000000,
+ 1035648000000,
+ 1048953600000,
+ 1067097600000,
+ 1080403200000,
+ 1099152000000,
+ 1111852800000,
+ 1130601600000,
+ 1143302400000,
+ 1162051200000,
+ 1174752000000,
+ 1193500800000,
+ 1206806400000,
+ 1224950400000,
+ 1238256000000,
+ 1256400000000,
+ 1269705600000,
+ 1288454400000,
+ 1301155200000,
+ 1414249200000,
+ null
+ ],
+ "offsets": [
+ -527.5167,
+ -540,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -540,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600
+ ],
+ "population": 598927
+ },
+ {
+ "name": "Asia/Yakutsk",
+ "abbrs": [
+ "LMT",
+ "+08",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+08",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09",
+ "+10",
+ "+09"
+ ],
+ "untils": [
+ -1579423138000,
+ -1247558400000,
+ 354898800000,
+ 370706400000,
+ 386434800000,
+ 402242400000,
+ 417970800000,
+ 433778400000,
+ 449593200000,
+ 465325200000,
+ 481050000000,
+ 496774800000,
+ 512499600000,
+ 528224400000,
+ 543949200000,
+ 559674000000,
+ 575398800000,
+ 591123600000,
+ 606848400000,
+ 622573200000,
+ 638298000000,
+ 654627600000,
+ 686080800000,
+ 695757600000,
+ 701802000000,
+ 717526800000,
+ 733251600000,
+ 748976400000,
+ 764701200000,
+ 780426000000,
+ 796150800000,
+ 811875600000,
+ 828205200000,
+ 846349200000,
+ 859654800000,
+ 877798800000,
+ 891104400000,
+ 909248400000,
+ 922554000000,
+ 941302800000,
+ 954003600000,
+ 972752400000,
+ 985453200000,
+ 1004202000000,
+ 1017507600000,
+ 1035651600000,
+ 1048957200000,
+ 1067101200000,
+ 1080406800000,
+ 1099155600000,
+ 1111856400000,
+ 1130605200000,
+ 1143306000000,
+ 1162054800000,
+ 1174755600000,
+ 1193504400000,
+ 1206810000000,
+ 1224954000000,
+ 1238259600000,
+ 1256403600000,
+ 1269709200000,
+ 1288458000000,
+ 1301158800000,
+ 1414252800000,
+ null
+ ],
+ "offsets": [
+ -518.9667,
+ -480,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -480,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540
+ ],
+ "population": 282419
+ },
+ {
+ "name": "Asia/Yangon",
+ "abbrs": [
+ "RMT",
+ "+0630",
+ "+09",
+ "+0630"
+ ],
+ "untils": [
+ -1577946287000,
+ -873268200000,
+ -778410000000,
+ null
+ ],
+ "offsets": [
+ -384.7833,
+ -390,
+ -540,
+ -390
+ ],
+ "population": 0
+ },
+ {
+ "name": "Asia/Yekaterinburg",
+ "abbrs": [
+ "LMT",
+ "PMT",
+ "+04",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+04",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05",
+ "+06",
+ "+05"
+ ],
+ "untils": [
+ -1688270553000,
+ -1592610305000,
+ -1247544000000,
+ 354913200000,
+ 370720800000,
+ 386449200000,
+ 402256800000,
+ 417985200000,
+ 433792800000,
+ 449607600000,
+ 465339600000,
+ 481064400000,
+ 496789200000,
+ 512514000000,
+ 528238800000,
+ 543963600000,
+ 559688400000,
+ 575413200000,
+ 591138000000,
+ 606862800000,
+ 622587600000,
+ 638312400000,
+ 654642000000,
+ 686095200000,
+ 695772000000,
+ 701816400000,
+ 717541200000,
+ 733266000000,
+ 748990800000,
+ 764715600000,
+ 780440400000,
+ 796165200000,
+ 811890000000,
+ 828219600000,
+ 846363600000,
+ 859669200000,
+ 877813200000,
+ 891118800000,
+ 909262800000,
+ 922568400000,
+ 941317200000,
+ 954018000000,
+ 972766800000,
+ 985467600000,
+ 1004216400000,
+ 1017522000000,
+ 1035666000000,
+ 1048971600000,
+ 1067115600000,
+ 1080421200000,
+ 1099170000000,
+ 1111870800000,
+ 1130619600000,
+ 1143320400000,
+ 1162069200000,
+ 1174770000000,
+ 1193518800000,
+ 1206824400000,
+ 1224968400000,
+ 1238274000000,
+ 1256418000000,
+ 1269723600000,
+ 1288472400000,
+ 1301173200000,
+ 1414267200000,
+ null
+ ],
+ "offsets": [
+ -242.55,
+ -225.0833,
+ -240,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -240,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300,
+ -360,
+ -300
+ ],
+ "population": 1361000
+ },
+ {
+ "name": "Asia/Yerevan",
+ "abbrs": [
+ "LMT",
+ "+03",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04"
+ ],
+ "untils": [
+ -1441162680000,
+ -405140400000,
+ 354916800000,
+ 370724400000,
+ 386452800000,
+ 402260400000,
+ 417988800000,
+ 433796400000,
+ 449611200000,
+ 465343200000,
+ 481068000000,
+ 496792800000,
+ 512517600000,
+ 528242400000,
+ 543967200000,
+ 559692000000,
+ 575416800000,
+ 591141600000,
+ 606866400000,
+ 622591200000,
+ 638316000000,
+ 654645600000,
+ 686098800000,
+ 701823600000,
+ 717548400000,
+ 733273200000,
+ 748998000000,
+ 764722800000,
+ 780447600000,
+ 796172400000,
+ 859672800000,
+ 877816800000,
+ 891122400000,
+ 909266400000,
+ 922572000000,
+ 941320800000,
+ 954021600000,
+ 972770400000,
+ 985471200000,
+ 1004220000000,
+ 1017525600000,
+ 1035669600000,
+ 1048975200000,
+ 1067119200000,
+ 1080424800000,
+ 1099173600000,
+ 1111874400000,
+ 1130623200000,
+ 1143324000000,
+ 1162072800000,
+ 1174773600000,
+ 1193522400000,
+ 1206828000000,
+ 1224972000000,
+ 1238277600000,
+ 1256421600000,
+ 1269727200000,
+ 1288476000000,
+ 1301176800000,
+ 1319925600000,
+ null
+ ],
+ "offsets": [
+ -178,
+ -180,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240
+ ],
+ "population": 1274000
+ },
+ {
+ "name": "Atlantic/Azores",
+ "abbrs": [
+ "HMT",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "+00",
+ "-01",
+ "-02",
+ "-01",
+ "+00",
+ "-01",
+ "-02",
+ "-01",
+ "+00",
+ "-01",
+ "-02",
+ "-01",
+ "+00",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "WET",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01"
+ ],
+ "untils": [
+ -1830376800000,
+ -1689548400000,
+ -1677794400000,
+ -1667430000000,
+ -1647730800000,
+ -1635807600000,
+ -1616194800000,
+ -1604358000000,
+ -1584658800000,
+ -1572735600000,
+ -1553036400000,
+ -1541199600000,
+ -1521500400000,
+ -1442444400000,
+ -1426806000000,
+ -1379286000000,
+ -1364770800000,
+ -1348441200000,
+ -1333321200000,
+ -1316386800000,
+ -1301266800000,
+ -1284332400000,
+ -1269817200000,
+ -1221433200000,
+ -1206918000000,
+ -1191193200000,
+ -1175468400000,
+ -1127689200000,
+ -1111964400000,
+ -1096844400000,
+ -1080514800000,
+ -1063580400000,
+ -1049065200000,
+ -1033340400000,
+ -1017615600000,
+ -1002495600000,
+ -986166000000,
+ -969231600000,
+ -950482800000,
+ -942015600000,
+ -922662000000,
+ -906937200000,
+ -891126000000,
+ -877302000000,
+ -873676800000,
+ -864000000000,
+ -857948400000,
+ -845852400000,
+ -842832000000,
+ -831340800000,
+ -825894000000,
+ -814402800000,
+ -810777600000,
+ -799891200000,
+ -794444400000,
+ -782953200000,
+ -779328000000,
+ -768441600000,
+ -762994800000,
+ -749084400000,
+ -733359600000,
+ -717624000000,
+ -701899200000,
+ -686174400000,
+ -670449600000,
+ -654724800000,
+ -639000000000,
+ -591825600000,
+ -575496000000,
+ -559771200000,
+ -544046400000,
+ -528321600000,
+ -512596800000,
+ -496872000000,
+ -481147200000,
+ -465422400000,
+ -449697600000,
+ -433972800000,
+ -417643200000,
+ -401918400000,
+ -386193600000,
+ -370468800000,
+ -354744000000,
+ -339019200000,
+ -323294400000,
+ -307569600000,
+ -291844800000,
+ -276120000000,
+ -260395200000,
+ -244670400000,
+ -228340800000,
+ -212616000000,
+ -196891200000,
+ -181166400000,
+ -165441600000,
+ -149716800000,
+ -133992000000,
+ -118267200000,
+ 228272400000,
+ 243997200000,
+ 260326800000,
+ 276051600000,
+ 291776400000,
+ 307504800000,
+ 323226000000,
+ 338954400000,
+ 354679200000,
+ 370404000000,
+ 386128800000,
+ 401853600000,
+ 417582000000,
+ 433303200000,
+ 449028000000,
+ 465357600000,
+ 481082400000,
+ 496807200000,
+ 512532000000,
+ 528256800000,
+ 543981600000,
+ 559706400000,
+ 575431200000,
+ 591156000000,
+ 606880800000,
+ 622605600000,
+ 638330400000,
+ 654660000000,
+ 670384800000,
+ 686109600000,
+ 701834400000,
+ 717559200000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 114.5333,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 0,
+ 60,
+ 120,
+ 60,
+ 0,
+ 60,
+ 120,
+ 60,
+ 0,
+ 60,
+ 120,
+ 60,
+ 0,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 0,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60
+ ],
+ "population": 245746
+ },
+ {
+ "name": "Atlantic/Bermuda",
+ "abbrs": [
+ "LMT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST"
+ ],
+ "untils": [
+ -1262281242000,
+ 136360800000,
+ 152082000000,
+ 167810400000,
+ 183531600000,
+ 199260000000,
+ 215586000000,
+ 230709600000,
+ 247035600000,
+ 262764000000,
+ 278485200000,
+ 294213600000,
+ 309934800000,
+ 325663200000,
+ 341384400000,
+ 357112800000,
+ 372834000000,
+ 388562400000,
+ 404888400000,
+ 420012000000,
+ 436338000000,
+ 452066400000,
+ 467787600000,
+ 483516000000,
+ 499237200000,
+ 514965600000,
+ 530686800000,
+ 544600800000,
+ 562136400000,
+ 576050400000,
+ 594190800000,
+ 607500000000,
+ 625640400000,
+ 638949600000,
+ 657090000000,
+ 671004000000,
+ 688539600000,
+ 702453600000,
+ 719989200000,
+ 733903200000,
+ 752043600000,
+ 765352800000,
+ 783493200000,
+ 796802400000,
+ 814942800000,
+ 828856800000,
+ 846392400000,
+ 860306400000,
+ 877842000000,
+ 891756000000,
+ 909291600000,
+ 923205600000,
+ 941346000000,
+ 954655200000,
+ 972795600000,
+ 986104800000,
+ 1004245200000,
+ 1018159200000,
+ 1035694800000,
+ 1049608800000,
+ 1067144400000,
+ 1081058400000,
+ 1099198800000,
+ 1112508000000,
+ 1130648400000,
+ 1143957600000,
+ 1162098000000,
+ 1173592800000,
+ 1194152400000,
+ 1205042400000,
+ 1225602000000,
+ 1236492000000,
+ 1257051600000,
+ 1268546400000,
+ 1289106000000,
+ 1299996000000,
+ 1320555600000,
+ 1331445600000,
+ 1352005200000,
+ 1362895200000,
+ 1383454800000,
+ 1394344800000,
+ 1414904400000,
+ 1425794400000,
+ 1446354000000,
+ 1457848800000,
+ 1478408400000,
+ 1489298400000,
+ 1509858000000,
+ 1520748000000,
+ 1541307600000,
+ 1552197600000,
+ 1572757200000,
+ 1583647200000,
+ 1604206800000,
+ 1615701600000,
+ 1636261200000,
+ 1647151200000,
+ 1667710800000,
+ 1678600800000,
+ 1699160400000,
+ 1710050400000,
+ 1730610000000,
+ 1741500000000,
+ 1762059600000,
+ 1772949600000,
+ 1793509200000,
+ 1805004000000,
+ 1825563600000,
+ 1836453600000,
+ 1857013200000,
+ 1867903200000,
+ 1888462800000,
+ 1899352800000,
+ 1919912400000,
+ 1930802400000,
+ 1951362000000,
+ 1962856800000,
+ 1983416400000,
+ 1994306400000,
+ 2014866000000,
+ 2025756000000,
+ 2046315600000,
+ 2057205600000,
+ 2077765200000,
+ 2088655200000,
+ 2109214800000,
+ 2120104800000,
+ 2140664400000,
+ null
+ ],
+ "offsets": [
+ 259.3,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240
+ ],
+ "population": 65024
+ },
+ {
+ "name": "Atlantic/Canary",
+ "abbrs": [
+ "LMT",
+ "-01",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET"
+ ],
+ "untils": [
+ -1509663504000,
+ -733874400000,
+ 323827200000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 61.6,
+ 60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0
+ ],
+ "population": 538000
+ },
+ {
+ "name": "Atlantic/Cape_Verde",
+ "abbrs": [
+ "LMT",
+ "-02",
+ "-01",
+ "-02",
+ "-01"
+ ],
+ "untils": [
+ -1830376800000,
+ -862610400000,
+ -764118000000,
+ 186120000000,
+ null
+ ],
+ "offsets": [
+ 94.0667,
+ 120,
+ 60,
+ 120,
+ 60
+ ],
+ "population": 498897
+ },
+ {
+ "name": "Atlantic/Faeroe",
+ "abbrs": [
+ "LMT",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET"
+ ],
+ "untils": [
+ -1955748776000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 27.0667,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Atlantic/Faroe",
+ "abbrs": [
+ "LMT",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET"
+ ],
+ "untils": [
+ -1955748776000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 27.0667,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0
+ ],
+ "population": 49469
+ },
+ {
+ "name": "Atlantic/Jan_Mayen",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1691884800000,
+ -1680573600000,
+ -927511200000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -781052400000,
+ -765327600000,
+ -340844400000,
+ -324514800000,
+ -308790000000,
+ -293065200000,
+ -277340400000,
+ -261615600000,
+ -245890800000,
+ -230166000000,
+ -214441200000,
+ -198716400000,
+ -182991600000,
+ -166662000000,
+ -147913200000,
+ -135212400000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Atlantic/Madeira",
+ "abbrs": [
+ "FMT",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "+01",
+ "+00",
+ "-01",
+ "+00",
+ "+01",
+ "+00",
+ "-01",
+ "+00",
+ "+01",
+ "+00",
+ "-01",
+ "+00",
+ "+01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET"
+ ],
+ "untils": [
+ -1830380400000,
+ -1689552000000,
+ -1677798000000,
+ -1667433600000,
+ -1647734400000,
+ -1635811200000,
+ -1616198400000,
+ -1604361600000,
+ -1584662400000,
+ -1572739200000,
+ -1553040000000,
+ -1541203200000,
+ -1521504000000,
+ -1442448000000,
+ -1426809600000,
+ -1379289600000,
+ -1364774400000,
+ -1348444800000,
+ -1333324800000,
+ -1316390400000,
+ -1301270400000,
+ -1284336000000,
+ -1269820800000,
+ -1221436800000,
+ -1206921600000,
+ -1191196800000,
+ -1175472000000,
+ -1127692800000,
+ -1111968000000,
+ -1096848000000,
+ -1080518400000,
+ -1063584000000,
+ -1049068800000,
+ -1033344000000,
+ -1017619200000,
+ -1002499200000,
+ -986169600000,
+ -969235200000,
+ -950486400000,
+ -942019200000,
+ -922665600000,
+ -906940800000,
+ -891129600000,
+ -877305600000,
+ -873680400000,
+ -864003600000,
+ -857952000000,
+ -845856000000,
+ -842835600000,
+ -831344400000,
+ -825897600000,
+ -814406400000,
+ -810781200000,
+ -799894800000,
+ -794448000000,
+ -782956800000,
+ -779331600000,
+ -768445200000,
+ -762998400000,
+ -749088000000,
+ -733363200000,
+ -717627600000,
+ -701902800000,
+ -686178000000,
+ -670453200000,
+ -654728400000,
+ -639003600000,
+ -591829200000,
+ -575499600000,
+ -559774800000,
+ -544050000000,
+ -528325200000,
+ -512600400000,
+ -496875600000,
+ -481150800000,
+ -465426000000,
+ -449701200000,
+ -433976400000,
+ -417646800000,
+ -401922000000,
+ -386197200000,
+ -370472400000,
+ -354747600000,
+ -339022800000,
+ -323298000000,
+ -307573200000,
+ -291848400000,
+ -276123600000,
+ -260398800000,
+ -244674000000,
+ -228344400000,
+ -212619600000,
+ -196894800000,
+ -181170000000,
+ -165445200000,
+ -149720400000,
+ -133995600000,
+ -118270800000,
+ 228268800000,
+ 243993600000,
+ 260323200000,
+ 276048000000,
+ 291772800000,
+ 307501200000,
+ 323222400000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417578400000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 67.6,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ -60,
+ 0,
+ 60,
+ 0,
+ -60,
+ 0,
+ 60,
+ 0,
+ -60,
+ 0,
+ 60,
+ 0,
+ -60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0
+ ],
+ "population": 267785
+ },
+ {
+ "name": "Atlantic/Reykjavik",
+ "abbrs": [
+ "LMT",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "GMT"
+ ],
+ "untils": [
+ -1956609120000,
+ -1668211200000,
+ -1647212400000,
+ -1636675200000,
+ -1613430000000,
+ -1605139200000,
+ -1581894000000,
+ -1539561600000,
+ -1531350000000,
+ -968025600000,
+ -952293600000,
+ -942008400000,
+ -920239200000,
+ -909957600000,
+ -888789600000,
+ -877903200000,
+ -857944800000,
+ -846453600000,
+ -826495200000,
+ -815004000000,
+ -795045600000,
+ -783554400000,
+ -762991200000,
+ -752104800000,
+ -731541600000,
+ -717631200000,
+ -700092000000,
+ -686181600000,
+ -668642400000,
+ -654732000000,
+ -636588000000,
+ -623282400000,
+ -605743200000,
+ -591832800000,
+ -573688800000,
+ -559778400000,
+ -542239200000,
+ -528328800000,
+ -510789600000,
+ -496879200000,
+ -479340000000,
+ -465429600000,
+ -447890400000,
+ -433980000000,
+ -415836000000,
+ -401925600000,
+ -384386400000,
+ -370476000000,
+ -352936800000,
+ -339026400000,
+ -321487200000,
+ -307576800000,
+ -290037600000,
+ -276127200000,
+ -258588000000,
+ -244677600000,
+ -226533600000,
+ -212623200000,
+ -195084000000,
+ -181173600000,
+ -163634400000,
+ -149724000000,
+ -132184800000,
+ -118274400000,
+ -100735200000,
+ -86824800000,
+ -68680800000,
+ -54770400000,
+ null
+ ],
+ "offsets": [
+ 88,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0
+ ],
+ "population": 119289
+ },
+ {
+ "name": "Atlantic/South_Georgia",
+ "abbrs": [
+ "-02"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 120
+ ],
+ "population": 30
+ },
+ {
+ "name": "Atlantic/St_Helena",
+ "abbrs": [
+ "LMT",
+ "GMT"
+ ],
+ "untils": [
+ -1830383032000,
+ null
+ ],
+ "offsets": [
+ 16.1333,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Atlantic/Stanley",
+ "abbrs": [
+ "SMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03"
+ ],
+ "untils": [
+ -1824235716000,
+ -1018209600000,
+ -1003093200000,
+ -986760000000,
+ -971643600000,
+ -954705600000,
+ -939589200000,
+ -923256000000,
+ -908139600000,
+ -891806400000,
+ -876690000000,
+ -860356800000,
+ -852066000000,
+ 420609600000,
+ 433306800000,
+ 452052000000,
+ 464151600000,
+ 483501600000,
+ 514350000000,
+ 527054400000,
+ 545799600000,
+ 558504000000,
+ 577249200000,
+ 589953600000,
+ 608698800000,
+ 621403200000,
+ 640753200000,
+ 652852800000,
+ 672202800000,
+ 684907200000,
+ 703652400000,
+ 716356800000,
+ 735102000000,
+ 747806400000,
+ 766551600000,
+ 779256000000,
+ 798001200000,
+ 810705600000,
+ 830055600000,
+ 842760000000,
+ 861505200000,
+ 874209600000,
+ 892954800000,
+ 905659200000,
+ 924404400000,
+ 937108800000,
+ 955854000000,
+ 968558400000,
+ 987310800000,
+ 999410400000,
+ 1019365200000,
+ 1030860000000,
+ 1050814800000,
+ 1062914400000,
+ 1082264400000,
+ 1094364000000,
+ 1113714000000,
+ 1125813600000,
+ 1145163600000,
+ 1157263200000,
+ 1176613200000,
+ 1188712800000,
+ 1208667600000,
+ 1220767200000,
+ 1240117200000,
+ 1252216800000,
+ 1271566800000,
+ 1283666400000,
+ null
+ ],
+ "offsets": [
+ 231.4,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180
+ ],
+ "population": 2121
+ },
+ {
+ "name": "Australia/ACT",
+ "abbrs": [
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT"
+ ],
+ "untils": [
+ -1672567140000,
+ -1665392400000,
+ -883641600000,
+ -876128400000,
+ -860400000000,
+ -844678800000,
+ -828345600000,
+ -813229200000,
+ 57686400000,
+ 67968000000,
+ 89136000000,
+ 100022400000,
+ 120585600000,
+ 131472000000,
+ 152035200000,
+ 162921600000,
+ 183484800000,
+ 194976000000,
+ 215539200000,
+ 226425600000,
+ 246988800000,
+ 257875200000,
+ 278438400000,
+ 289324800000,
+ 309888000000,
+ 320774400000,
+ 341337600000,
+ 352224000000,
+ 372787200000,
+ 386697600000,
+ 404841600000,
+ 415728000000,
+ 436291200000,
+ 447177600000,
+ 467740800000,
+ 478627200000,
+ 499190400000,
+ 511286400000,
+ 530035200000,
+ 542736000000,
+ 562089600000,
+ 574790400000,
+ 594144000000,
+ 606240000000,
+ 625593600000,
+ 636480000000,
+ 657043200000,
+ 667929600000,
+ 688492800000,
+ 699379200000,
+ 719942400000,
+ 731433600000,
+ 751996800000,
+ 762883200000,
+ 783446400000,
+ 794332800000,
+ 814896000000,
+ 828201600000,
+ 846345600000,
+ 859651200000,
+ 877795200000,
+ 891100800000,
+ 909244800000,
+ 922550400000,
+ 941299200000,
+ 954000000000,
+ 967305600000,
+ 985449600000,
+ 1004198400000,
+ 1017504000000,
+ 1035648000000,
+ 1048953600000,
+ 1067097600000,
+ 1080403200000,
+ 1099152000000,
+ 1111852800000,
+ 1130601600000,
+ 1143907200000,
+ 1162051200000,
+ 1174752000000,
+ 1193500800000,
+ 1207411200000,
+ 1223136000000,
+ 1238860800000,
+ 1254585600000,
+ 1270310400000,
+ 1286035200000,
+ 1301760000000,
+ 1317484800000,
+ 1333209600000,
+ 1349539200000,
+ 1365264000000,
+ 1380988800000,
+ 1396713600000,
+ 1412438400000,
+ 1428163200000,
+ 1443888000000,
+ 1459612800000,
+ 1475337600000,
+ 1491062400000,
+ 1506787200000,
+ 1522512000000,
+ 1538841600000,
+ 1554566400000,
+ 1570291200000,
+ 1586016000000,
+ 1601740800000,
+ 1617465600000,
+ 1633190400000,
+ 1648915200000,
+ 1664640000000,
+ 1680364800000,
+ 1696089600000,
+ 1712419200000,
+ 1728144000000,
+ 1743868800000,
+ 1759593600000,
+ 1775318400000,
+ 1791043200000,
+ 1806768000000,
+ 1822492800000,
+ 1838217600000,
+ 1853942400000,
+ 1869667200000,
+ 1885996800000,
+ 1901721600000,
+ 1917446400000,
+ 1933171200000,
+ 1948896000000,
+ 1964620800000,
+ 1980345600000,
+ 1996070400000,
+ 2011795200000,
+ 2027520000000,
+ 2043244800000,
+ 2058969600000,
+ 2075299200000,
+ 2091024000000,
+ 2106748800000,
+ 2122473600000,
+ 2138198400000,
+ null
+ ],
+ "offsets": [
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660
+ ],
+ "population": 0
+ },
+ {
+ "name": "Australia/Adelaide",
+ "abbrs": [
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT"
+ ],
+ "untils": [
+ -1672565340000,
+ -1665390600000,
+ -883639800000,
+ -876126600000,
+ -860398200000,
+ -844677000000,
+ -828343800000,
+ -813227400000,
+ 57688200000,
+ 67969800000,
+ 89137800000,
+ 100024200000,
+ 120587400000,
+ 131473800000,
+ 152037000000,
+ 162923400000,
+ 183486600000,
+ 194977800000,
+ 215541000000,
+ 226427400000,
+ 246990600000,
+ 257877000000,
+ 278440200000,
+ 289326600000,
+ 309889800000,
+ 320776200000,
+ 341339400000,
+ 352225800000,
+ 372789000000,
+ 384280200000,
+ 404843400000,
+ 415729800000,
+ 436293000000,
+ 447179400000,
+ 467742600000,
+ 478629000000,
+ 499192200000,
+ 511288200000,
+ 530037000000,
+ 542737800000,
+ 562091400000,
+ 574792200000,
+ 594145800000,
+ 606241800000,
+ 625595400000,
+ 637691400000,
+ 657045000000,
+ 667931400000,
+ 688494600000,
+ 701195400000,
+ 719944200000,
+ 731435400000,
+ 751998600000,
+ 764094600000,
+ 783448200000,
+ 796149000000,
+ 814897800000,
+ 828203400000,
+ 846347400000,
+ 859653000000,
+ 877797000000,
+ 891102600000,
+ 909246600000,
+ 922552200000,
+ 941301000000,
+ 954001800000,
+ 972750600000,
+ 985451400000,
+ 1004200200000,
+ 1017505800000,
+ 1035649800000,
+ 1048955400000,
+ 1067099400000,
+ 1080405000000,
+ 1099153800000,
+ 1111854600000,
+ 1130603400000,
+ 1143909000000,
+ 1162053000000,
+ 1174753800000,
+ 1193502600000,
+ 1207413000000,
+ 1223137800000,
+ 1238862600000,
+ 1254587400000,
+ 1270312200000,
+ 1286037000000,
+ 1301761800000,
+ 1317486600000,
+ 1333211400000,
+ 1349541000000,
+ 1365265800000,
+ 1380990600000,
+ 1396715400000,
+ 1412440200000,
+ 1428165000000,
+ 1443889800000,
+ 1459614600000,
+ 1475339400000,
+ 1491064200000,
+ 1506789000000,
+ 1522513800000,
+ 1538843400000,
+ 1554568200000,
+ 1570293000000,
+ 1586017800000,
+ 1601742600000,
+ 1617467400000,
+ 1633192200000,
+ 1648917000000,
+ 1664641800000,
+ 1680366600000,
+ 1696091400000,
+ 1712421000000,
+ 1728145800000,
+ 1743870600000,
+ 1759595400000,
+ 1775320200000,
+ 1791045000000,
+ 1806769800000,
+ 1822494600000,
+ 1838219400000,
+ 1853944200000,
+ 1869669000000,
+ 1885998600000,
+ 1901723400000,
+ 1917448200000,
+ 1933173000000,
+ 1948897800000,
+ 1964622600000,
+ 1980347400000,
+ 1996072200000,
+ 2011797000000,
+ 2027521800000,
+ 2043246600000,
+ 2058971400000,
+ 2075301000000,
+ 2091025800000,
+ 2106750600000,
+ 2122475400000,
+ 2138200200000,
+ null
+ ],
+ "offsets": [
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630
+ ],
+ "population": 1140000
+ },
+ {
+ "name": "Australia/Brisbane",
+ "abbrs": [
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST"
+ ],
+ "untils": [
+ -1672567140000,
+ -1665392400000,
+ -883641600000,
+ -876128400000,
+ -860400000000,
+ -844678800000,
+ -828345600000,
+ -813229200000,
+ 57686400000,
+ 67968000000,
+ 625593600000,
+ 636480000000,
+ 657043200000,
+ 667929600000,
+ 688492800000,
+ 699379200000,
+ null
+ ],
+ "offsets": [
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600
+ ],
+ "population": 1999000
+ },
+ {
+ "name": "Australia/Broken_Hill",
+ "abbrs": [
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT"
+ ],
+ "untils": [
+ -1672565340000,
+ -1665390600000,
+ -883639800000,
+ -876126600000,
+ -860398200000,
+ -844677000000,
+ -828343800000,
+ -813227400000,
+ 57688200000,
+ 67969800000,
+ 89137800000,
+ 100024200000,
+ 120587400000,
+ 131473800000,
+ 152037000000,
+ 162923400000,
+ 183486600000,
+ 194977800000,
+ 215541000000,
+ 226427400000,
+ 246990600000,
+ 257877000000,
+ 278440200000,
+ 289326600000,
+ 309889800000,
+ 320776200000,
+ 341339400000,
+ 352225800000,
+ 372789000000,
+ 386699400000,
+ 404843400000,
+ 415729800000,
+ 436293000000,
+ 447179400000,
+ 467742600000,
+ 478629000000,
+ 499192200000,
+ 511288200000,
+ 530037000000,
+ 542737800000,
+ 562091400000,
+ 574792200000,
+ 594145800000,
+ 606241800000,
+ 625595400000,
+ 636481800000,
+ 657045000000,
+ 667931400000,
+ 688494600000,
+ 699381000000,
+ 719944200000,
+ 731435400000,
+ 751998600000,
+ 762885000000,
+ 783448200000,
+ 794334600000,
+ 814897800000,
+ 828203400000,
+ 846347400000,
+ 859653000000,
+ 877797000000,
+ 891102600000,
+ 909246600000,
+ 922552200000,
+ 941301000000,
+ 954001800000,
+ 972750600000,
+ 985451400000,
+ 1004200200000,
+ 1017505800000,
+ 1035649800000,
+ 1048955400000,
+ 1067099400000,
+ 1080405000000,
+ 1099153800000,
+ 1111854600000,
+ 1130603400000,
+ 1143909000000,
+ 1162053000000,
+ 1174753800000,
+ 1193502600000,
+ 1207413000000,
+ 1223137800000,
+ 1238862600000,
+ 1254587400000,
+ 1270312200000,
+ 1286037000000,
+ 1301761800000,
+ 1317486600000,
+ 1333211400000,
+ 1349541000000,
+ 1365265800000,
+ 1380990600000,
+ 1396715400000,
+ 1412440200000,
+ 1428165000000,
+ 1443889800000,
+ 1459614600000,
+ 1475339400000,
+ 1491064200000,
+ 1506789000000,
+ 1522513800000,
+ 1538843400000,
+ 1554568200000,
+ 1570293000000,
+ 1586017800000,
+ 1601742600000,
+ 1617467400000,
+ 1633192200000,
+ 1648917000000,
+ 1664641800000,
+ 1680366600000,
+ 1696091400000,
+ 1712421000000,
+ 1728145800000,
+ 1743870600000,
+ 1759595400000,
+ 1775320200000,
+ 1791045000000,
+ 1806769800000,
+ 1822494600000,
+ 1838219400000,
+ 1853944200000,
+ 1869669000000,
+ 1885998600000,
+ 1901723400000,
+ 1917448200000,
+ 1933173000000,
+ 1948897800000,
+ 1964622600000,
+ 1980347400000,
+ 1996072200000,
+ 2011797000000,
+ 2027521800000,
+ 2043246600000,
+ 2058971400000,
+ 2075301000000,
+ 2091025800000,
+ 2106750600000,
+ 2122475400000,
+ 2138200200000,
+ null
+ ],
+ "offsets": [
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630
+ ],
+ "population": 18430
+ },
+ {
+ "name": "Australia/Canberra",
+ "abbrs": [
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT"
+ ],
+ "untils": [
+ -1672567140000,
+ -1665392400000,
+ -883641600000,
+ -876128400000,
+ -860400000000,
+ -844678800000,
+ -828345600000,
+ -813229200000,
+ 57686400000,
+ 67968000000,
+ 89136000000,
+ 100022400000,
+ 120585600000,
+ 131472000000,
+ 152035200000,
+ 162921600000,
+ 183484800000,
+ 194976000000,
+ 215539200000,
+ 226425600000,
+ 246988800000,
+ 257875200000,
+ 278438400000,
+ 289324800000,
+ 309888000000,
+ 320774400000,
+ 341337600000,
+ 352224000000,
+ 372787200000,
+ 386697600000,
+ 404841600000,
+ 415728000000,
+ 436291200000,
+ 447177600000,
+ 467740800000,
+ 478627200000,
+ 499190400000,
+ 511286400000,
+ 530035200000,
+ 542736000000,
+ 562089600000,
+ 574790400000,
+ 594144000000,
+ 606240000000,
+ 625593600000,
+ 636480000000,
+ 657043200000,
+ 667929600000,
+ 688492800000,
+ 699379200000,
+ 719942400000,
+ 731433600000,
+ 751996800000,
+ 762883200000,
+ 783446400000,
+ 794332800000,
+ 814896000000,
+ 828201600000,
+ 846345600000,
+ 859651200000,
+ 877795200000,
+ 891100800000,
+ 909244800000,
+ 922550400000,
+ 941299200000,
+ 954000000000,
+ 967305600000,
+ 985449600000,
+ 1004198400000,
+ 1017504000000,
+ 1035648000000,
+ 1048953600000,
+ 1067097600000,
+ 1080403200000,
+ 1099152000000,
+ 1111852800000,
+ 1130601600000,
+ 1143907200000,
+ 1162051200000,
+ 1174752000000,
+ 1193500800000,
+ 1207411200000,
+ 1223136000000,
+ 1238860800000,
+ 1254585600000,
+ 1270310400000,
+ 1286035200000,
+ 1301760000000,
+ 1317484800000,
+ 1333209600000,
+ 1349539200000,
+ 1365264000000,
+ 1380988800000,
+ 1396713600000,
+ 1412438400000,
+ 1428163200000,
+ 1443888000000,
+ 1459612800000,
+ 1475337600000,
+ 1491062400000,
+ 1506787200000,
+ 1522512000000,
+ 1538841600000,
+ 1554566400000,
+ 1570291200000,
+ 1586016000000,
+ 1601740800000,
+ 1617465600000,
+ 1633190400000,
+ 1648915200000,
+ 1664640000000,
+ 1680364800000,
+ 1696089600000,
+ 1712419200000,
+ 1728144000000,
+ 1743868800000,
+ 1759593600000,
+ 1775318400000,
+ 1791043200000,
+ 1806768000000,
+ 1822492800000,
+ 1838217600000,
+ 1853942400000,
+ 1869667200000,
+ 1885996800000,
+ 1901721600000,
+ 1917446400000,
+ 1933171200000,
+ 1948896000000,
+ 1964620800000,
+ 1980345600000,
+ 1996070400000,
+ 2011795200000,
+ 2027520000000,
+ 2043244800000,
+ 2058969600000,
+ 2075299200000,
+ 2091024000000,
+ 2106748800000,
+ 2122473600000,
+ 2138198400000,
+ null
+ ],
+ "offsets": [
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660
+ ],
+ "population": 0
+ },
+ {
+ "name": "Australia/Currie",
+ "abbrs": [
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT"
+ ],
+ "untils": [
+ -1680508800000,
+ -1665392400000,
+ -883641600000,
+ -876128400000,
+ -860400000000,
+ -844678800000,
+ -828345600000,
+ -813229200000,
+ 57686400000,
+ 67968000000,
+ 89136000000,
+ 100022400000,
+ 120585600000,
+ 131472000000,
+ 152035200000,
+ 162921600000,
+ 183484800000,
+ 194976000000,
+ 215539200000,
+ 226425600000,
+ 246988800000,
+ 257875200000,
+ 278438400000,
+ 289324800000,
+ 309888000000,
+ 320774400000,
+ 341337600000,
+ 352224000000,
+ 372787200000,
+ 386092800000,
+ 404841600000,
+ 417542400000,
+ 436291200000,
+ 447177600000,
+ 467740800000,
+ 478627200000,
+ 499190400000,
+ 510076800000,
+ 530035200000,
+ 542736000000,
+ 562089600000,
+ 574790400000,
+ 594144000000,
+ 606240000000,
+ 625593600000,
+ 637689600000,
+ 657043200000,
+ 670348800000,
+ 686678400000,
+ 701798400000,
+ 718128000000,
+ 733248000000,
+ 749577600000,
+ 764697600000,
+ 781027200000,
+ 796147200000,
+ 812476800000,
+ 828201600000,
+ 844531200000,
+ 859651200000,
+ 875980800000,
+ 891100800000,
+ 907430400000,
+ 922550400000,
+ 938880000000,
+ 954000000000,
+ 967305600000,
+ 985449600000,
+ 1002384000000,
+ 1017504000000,
+ 1033833600000,
+ 1048953600000,
+ 1065283200000,
+ 1080403200000,
+ 1096732800000,
+ 1111852800000,
+ 1128182400000,
+ 1143907200000,
+ 1159632000000,
+ 1174752000000,
+ 1191686400000,
+ 1207411200000,
+ 1223136000000,
+ 1238860800000,
+ 1254585600000,
+ 1270310400000,
+ 1286035200000,
+ 1301760000000,
+ 1317484800000,
+ 1333209600000,
+ 1349539200000,
+ 1365264000000,
+ 1380988800000,
+ 1396713600000,
+ 1412438400000,
+ 1428163200000,
+ 1443888000000,
+ 1459612800000,
+ 1475337600000,
+ 1491062400000,
+ 1506787200000,
+ 1522512000000,
+ 1538841600000,
+ 1554566400000,
+ 1570291200000,
+ 1586016000000,
+ 1601740800000,
+ 1617465600000,
+ 1633190400000,
+ 1648915200000,
+ 1664640000000,
+ 1680364800000,
+ 1696089600000,
+ 1712419200000,
+ 1728144000000,
+ 1743868800000,
+ 1759593600000,
+ 1775318400000,
+ 1791043200000,
+ 1806768000000,
+ 1822492800000,
+ 1838217600000,
+ 1853942400000,
+ 1869667200000,
+ 1885996800000,
+ 1901721600000,
+ 1917446400000,
+ 1933171200000,
+ 1948896000000,
+ 1964620800000,
+ 1980345600000,
+ 1996070400000,
+ 2011795200000,
+ 2027520000000,
+ 2043244800000,
+ 2058969600000,
+ 2075299200000,
+ 2091024000000,
+ 2106748800000,
+ 2122473600000,
+ 2138198400000,
+ null
+ ],
+ "offsets": [
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660
+ ],
+ "population": 746
+ },
+ {
+ "name": "Australia/Darwin",
+ "abbrs": [
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST"
+ ],
+ "untils": [
+ -1672565340000,
+ -1665390600000,
+ -883639800000,
+ -876126600000,
+ -860398200000,
+ -844677000000,
+ -828343800000,
+ -813227400000,
+ null
+ ],
+ "offsets": [
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570
+ ],
+ "population": 116215
+ },
+ {
+ "name": "Australia/Eucla",
+ "abbrs": [
+ "+0845",
+ "+0945",
+ "+0845",
+ "+0945",
+ "+0845",
+ "+0945",
+ "+0845",
+ "+0945",
+ "+0845",
+ "+0945",
+ "+0845",
+ "+0945",
+ "+0845",
+ "+0945",
+ "+0845",
+ "+0945",
+ "+0845",
+ "+0945",
+ "+0845"
+ ],
+ "untils": [
+ -1672562640000,
+ -1665387900000,
+ -883637100000,
+ -876123900000,
+ -860395500000,
+ -844674300000,
+ 152039700000,
+ 162926100000,
+ 436295700000,
+ 447182100000,
+ 690311700000,
+ 699383700000,
+ 1165079700000,
+ 1174756500000,
+ 1193505300000,
+ 1206810900000,
+ 1224954900000,
+ 1238260500000,
+ null
+ ],
+ "offsets": [
+ -525,
+ -585,
+ -525,
+ -585,
+ -525,
+ -585,
+ -525,
+ -585,
+ -525,
+ -585,
+ -525,
+ -585,
+ -525,
+ -585,
+ -525,
+ -585,
+ -525,
+ -585,
+ -525
+ ],
+ "population": 368
+ },
+ {
+ "name": "Australia/Hobart",
+ "abbrs": [
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT"
+ ],
+ "untils": [
+ -1680508800000,
+ -1665392400000,
+ -883641600000,
+ -876128400000,
+ -860400000000,
+ -844678800000,
+ -828345600000,
+ -813229200000,
+ -71136000000,
+ -55411200000,
+ -37267200000,
+ -25776000000,
+ -5817600000,
+ 5673600000,
+ 25632000000,
+ 37728000000,
+ 57686400000,
+ 67968000000,
+ 89136000000,
+ 100022400000,
+ 120585600000,
+ 131472000000,
+ 152035200000,
+ 162921600000,
+ 183484800000,
+ 194976000000,
+ 215539200000,
+ 226425600000,
+ 246988800000,
+ 257875200000,
+ 278438400000,
+ 289324800000,
+ 309888000000,
+ 320774400000,
+ 341337600000,
+ 352224000000,
+ 372787200000,
+ 386092800000,
+ 404841600000,
+ 417542400000,
+ 436291200000,
+ 447177600000,
+ 467740800000,
+ 478627200000,
+ 499190400000,
+ 510076800000,
+ 530035200000,
+ 542736000000,
+ 562089600000,
+ 574790400000,
+ 594144000000,
+ 606240000000,
+ 625593600000,
+ 637689600000,
+ 657043200000,
+ 670348800000,
+ 686678400000,
+ 701798400000,
+ 718128000000,
+ 733248000000,
+ 749577600000,
+ 764697600000,
+ 781027200000,
+ 796147200000,
+ 812476800000,
+ 828201600000,
+ 844531200000,
+ 859651200000,
+ 875980800000,
+ 891100800000,
+ 907430400000,
+ 922550400000,
+ 938880000000,
+ 954000000000,
+ 967305600000,
+ 985449600000,
+ 1002384000000,
+ 1017504000000,
+ 1033833600000,
+ 1048953600000,
+ 1065283200000,
+ 1080403200000,
+ 1096732800000,
+ 1111852800000,
+ 1128182400000,
+ 1143907200000,
+ 1159632000000,
+ 1174752000000,
+ 1191686400000,
+ 1207411200000,
+ 1223136000000,
+ 1238860800000,
+ 1254585600000,
+ 1270310400000,
+ 1286035200000,
+ 1301760000000,
+ 1317484800000,
+ 1333209600000,
+ 1349539200000,
+ 1365264000000,
+ 1380988800000,
+ 1396713600000,
+ 1412438400000,
+ 1428163200000,
+ 1443888000000,
+ 1459612800000,
+ 1475337600000,
+ 1491062400000,
+ 1506787200000,
+ 1522512000000,
+ 1538841600000,
+ 1554566400000,
+ 1570291200000,
+ 1586016000000,
+ 1601740800000,
+ 1617465600000,
+ 1633190400000,
+ 1648915200000,
+ 1664640000000,
+ 1680364800000,
+ 1696089600000,
+ 1712419200000,
+ 1728144000000,
+ 1743868800000,
+ 1759593600000,
+ 1775318400000,
+ 1791043200000,
+ 1806768000000,
+ 1822492800000,
+ 1838217600000,
+ 1853942400000,
+ 1869667200000,
+ 1885996800000,
+ 1901721600000,
+ 1917446400000,
+ 1933171200000,
+ 1948896000000,
+ 1964620800000,
+ 1980345600000,
+ 1996070400000,
+ 2011795200000,
+ 2027520000000,
+ 2043244800000,
+ 2058969600000,
+ 2075299200000,
+ 2091024000000,
+ 2106748800000,
+ 2122473600000,
+ 2138198400000,
+ null
+ ],
+ "offsets": [
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660
+ ],
+ "population": 205557
+ },
+ {
+ "name": "Australia/LHI",
+ "abbrs": [
+ "AEST",
+ "+1030",
+ "+1130",
+ "+1030",
+ "+1130",
+ "+1030",
+ "+1130",
+ "+1030",
+ "+1130",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11"
+ ],
+ "untils": [
+ 352216800000,
+ 372785400000,
+ 384273000000,
+ 404839800000,
+ 415722600000,
+ 436289400000,
+ 447172200000,
+ 467739000000,
+ 478621800000,
+ 499188600000,
+ 511282800000,
+ 530033400000,
+ 542732400000,
+ 562087800000,
+ 574786800000,
+ 594142200000,
+ 606236400000,
+ 625591800000,
+ 636476400000,
+ 657041400000,
+ 667926000000,
+ 688491000000,
+ 699375600000,
+ 719940600000,
+ 731430000000,
+ 751995000000,
+ 762879600000,
+ 783444600000,
+ 794329200000,
+ 814894200000,
+ 828198000000,
+ 846343800000,
+ 859647600000,
+ 877793400000,
+ 891097200000,
+ 909243000000,
+ 922546800000,
+ 941297400000,
+ 953996400000,
+ 967303800000,
+ 985446000000,
+ 1004196600000,
+ 1017500400000,
+ 1035646200000,
+ 1048950000000,
+ 1067095800000,
+ 1080399600000,
+ 1099150200000,
+ 1111849200000,
+ 1130599800000,
+ 1143903600000,
+ 1162049400000,
+ 1174748400000,
+ 1193499000000,
+ 1207407600000,
+ 1223134200000,
+ 1238857200000,
+ 1254583800000,
+ 1270306800000,
+ 1286033400000,
+ 1301756400000,
+ 1317483000000,
+ 1333206000000,
+ 1349537400000,
+ 1365260400000,
+ 1380987000000,
+ 1396710000000,
+ 1412436600000,
+ 1428159600000,
+ 1443886200000,
+ 1459609200000,
+ 1475335800000,
+ 1491058800000,
+ 1506785400000,
+ 1522508400000,
+ 1538839800000,
+ 1554562800000,
+ 1570289400000,
+ 1586012400000,
+ 1601739000000,
+ 1617462000000,
+ 1633188600000,
+ 1648911600000,
+ 1664638200000,
+ 1680361200000,
+ 1696087800000,
+ 1712415600000,
+ 1728142200000,
+ 1743865200000,
+ 1759591800000,
+ 1775314800000,
+ 1791041400000,
+ 1806764400000,
+ 1822491000000,
+ 1838214000000,
+ 1853940600000,
+ 1869663600000,
+ 1885995000000,
+ 1901718000000,
+ 1917444600000,
+ 1933167600000,
+ 1948894200000,
+ 1964617200000,
+ 1980343800000,
+ 1996066800000,
+ 2011793400000,
+ 2027516400000,
+ 2043243000000,
+ 2058966000000,
+ 2075297400000,
+ 2091020400000,
+ 2106747000000,
+ 2122470000000,
+ 2138196600000,
+ null
+ ],
+ "offsets": [
+ -600,
+ -630,
+ -690,
+ -630,
+ -690,
+ -630,
+ -690,
+ -630,
+ -690,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660
+ ],
+ "population": 0
+ },
+ {
+ "name": "Australia/Lindeman",
+ "abbrs": [
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST"
+ ],
+ "untils": [
+ -1672567140000,
+ -1665392400000,
+ -883641600000,
+ -876128400000,
+ -860400000000,
+ -844678800000,
+ -828345600000,
+ -813229200000,
+ 57686400000,
+ 67968000000,
+ 625593600000,
+ 636480000000,
+ 657043200000,
+ 667929600000,
+ 688492800000,
+ 699379200000,
+ 719942400000,
+ 731433600000,
+ 751996800000,
+ 762883200000,
+ null
+ ],
+ "offsets": [
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600
+ ],
+ "population": 10
+ },
+ {
+ "name": "Australia/Lord_Howe",
+ "abbrs": [
+ "AEST",
+ "+1030",
+ "+1130",
+ "+1030",
+ "+1130",
+ "+1030",
+ "+1130",
+ "+1030",
+ "+1130",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11",
+ "+1030",
+ "+11"
+ ],
+ "untils": [
+ 352216800000,
+ 372785400000,
+ 384273000000,
+ 404839800000,
+ 415722600000,
+ 436289400000,
+ 447172200000,
+ 467739000000,
+ 478621800000,
+ 499188600000,
+ 511282800000,
+ 530033400000,
+ 542732400000,
+ 562087800000,
+ 574786800000,
+ 594142200000,
+ 606236400000,
+ 625591800000,
+ 636476400000,
+ 657041400000,
+ 667926000000,
+ 688491000000,
+ 699375600000,
+ 719940600000,
+ 731430000000,
+ 751995000000,
+ 762879600000,
+ 783444600000,
+ 794329200000,
+ 814894200000,
+ 828198000000,
+ 846343800000,
+ 859647600000,
+ 877793400000,
+ 891097200000,
+ 909243000000,
+ 922546800000,
+ 941297400000,
+ 953996400000,
+ 967303800000,
+ 985446000000,
+ 1004196600000,
+ 1017500400000,
+ 1035646200000,
+ 1048950000000,
+ 1067095800000,
+ 1080399600000,
+ 1099150200000,
+ 1111849200000,
+ 1130599800000,
+ 1143903600000,
+ 1162049400000,
+ 1174748400000,
+ 1193499000000,
+ 1207407600000,
+ 1223134200000,
+ 1238857200000,
+ 1254583800000,
+ 1270306800000,
+ 1286033400000,
+ 1301756400000,
+ 1317483000000,
+ 1333206000000,
+ 1349537400000,
+ 1365260400000,
+ 1380987000000,
+ 1396710000000,
+ 1412436600000,
+ 1428159600000,
+ 1443886200000,
+ 1459609200000,
+ 1475335800000,
+ 1491058800000,
+ 1506785400000,
+ 1522508400000,
+ 1538839800000,
+ 1554562800000,
+ 1570289400000,
+ 1586012400000,
+ 1601739000000,
+ 1617462000000,
+ 1633188600000,
+ 1648911600000,
+ 1664638200000,
+ 1680361200000,
+ 1696087800000,
+ 1712415600000,
+ 1728142200000,
+ 1743865200000,
+ 1759591800000,
+ 1775314800000,
+ 1791041400000,
+ 1806764400000,
+ 1822491000000,
+ 1838214000000,
+ 1853940600000,
+ 1869663600000,
+ 1885995000000,
+ 1901718000000,
+ 1917444600000,
+ 1933167600000,
+ 1948894200000,
+ 1964617200000,
+ 1980343800000,
+ 1996066800000,
+ 2011793400000,
+ 2027516400000,
+ 2043243000000,
+ 2058966000000,
+ 2075297400000,
+ 2091020400000,
+ 2106747000000,
+ 2122470000000,
+ 2138196600000,
+ null
+ ],
+ "offsets": [
+ -600,
+ -630,
+ -690,
+ -630,
+ -690,
+ -630,
+ -690,
+ -630,
+ -690,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660,
+ -630,
+ -660
+ ],
+ "population": 347
+ },
+ {
+ "name": "Australia/Melbourne",
+ "abbrs": [
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT"
+ ],
+ "untils": [
+ -1672567140000,
+ -1665392400000,
+ -883641600000,
+ -876128400000,
+ -860400000000,
+ -844678800000,
+ -828345600000,
+ -813229200000,
+ 57686400000,
+ 67968000000,
+ 89136000000,
+ 100022400000,
+ 120585600000,
+ 131472000000,
+ 152035200000,
+ 162921600000,
+ 183484800000,
+ 194976000000,
+ 215539200000,
+ 226425600000,
+ 246988800000,
+ 257875200000,
+ 278438400000,
+ 289324800000,
+ 309888000000,
+ 320774400000,
+ 341337600000,
+ 352224000000,
+ 372787200000,
+ 384278400000,
+ 404841600000,
+ 415728000000,
+ 436291200000,
+ 447177600000,
+ 467740800000,
+ 478627200000,
+ 499190400000,
+ 511286400000,
+ 530035200000,
+ 542736000000,
+ 561484800000,
+ 574790400000,
+ 594144000000,
+ 606240000000,
+ 625593600000,
+ 637689600000,
+ 657043200000,
+ 667929600000,
+ 688492800000,
+ 699379200000,
+ 719942400000,
+ 731433600000,
+ 751996800000,
+ 762883200000,
+ 783446400000,
+ 796147200000,
+ 814896000000,
+ 828201600000,
+ 846345600000,
+ 859651200000,
+ 877795200000,
+ 891100800000,
+ 909244800000,
+ 922550400000,
+ 941299200000,
+ 954000000000,
+ 967305600000,
+ 985449600000,
+ 1004198400000,
+ 1017504000000,
+ 1035648000000,
+ 1048953600000,
+ 1067097600000,
+ 1080403200000,
+ 1099152000000,
+ 1111852800000,
+ 1130601600000,
+ 1143907200000,
+ 1162051200000,
+ 1174752000000,
+ 1193500800000,
+ 1207411200000,
+ 1223136000000,
+ 1238860800000,
+ 1254585600000,
+ 1270310400000,
+ 1286035200000,
+ 1301760000000,
+ 1317484800000,
+ 1333209600000,
+ 1349539200000,
+ 1365264000000,
+ 1380988800000,
+ 1396713600000,
+ 1412438400000,
+ 1428163200000,
+ 1443888000000,
+ 1459612800000,
+ 1475337600000,
+ 1491062400000,
+ 1506787200000,
+ 1522512000000,
+ 1538841600000,
+ 1554566400000,
+ 1570291200000,
+ 1586016000000,
+ 1601740800000,
+ 1617465600000,
+ 1633190400000,
+ 1648915200000,
+ 1664640000000,
+ 1680364800000,
+ 1696089600000,
+ 1712419200000,
+ 1728144000000,
+ 1743868800000,
+ 1759593600000,
+ 1775318400000,
+ 1791043200000,
+ 1806768000000,
+ 1822492800000,
+ 1838217600000,
+ 1853942400000,
+ 1869667200000,
+ 1885996800000,
+ 1901721600000,
+ 1917446400000,
+ 1933171200000,
+ 1948896000000,
+ 1964620800000,
+ 1980345600000,
+ 1996070400000,
+ 2011795200000,
+ 2027520000000,
+ 2043244800000,
+ 2058969600000,
+ 2075299200000,
+ 2091024000000,
+ 2106748800000,
+ 2122473600000,
+ 2138198400000,
+ null
+ ],
+ "offsets": [
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660
+ ],
+ "population": 3906000
+ },
+ {
+ "name": "Australia/North",
+ "abbrs": [
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST"
+ ],
+ "untils": [
+ -1672565340000,
+ -1665390600000,
+ -883639800000,
+ -876126600000,
+ -860398200000,
+ -844677000000,
+ -828343800000,
+ -813227400000,
+ null
+ ],
+ "offsets": [
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570
+ ],
+ "population": 0
+ },
+ {
+ "name": "Australia/NSW",
+ "abbrs": [
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT"
+ ],
+ "untils": [
+ -1672567140000,
+ -1665392400000,
+ -883641600000,
+ -876128400000,
+ -860400000000,
+ -844678800000,
+ -828345600000,
+ -813229200000,
+ 57686400000,
+ 67968000000,
+ 89136000000,
+ 100022400000,
+ 120585600000,
+ 131472000000,
+ 152035200000,
+ 162921600000,
+ 183484800000,
+ 194976000000,
+ 215539200000,
+ 226425600000,
+ 246988800000,
+ 257875200000,
+ 278438400000,
+ 289324800000,
+ 309888000000,
+ 320774400000,
+ 341337600000,
+ 352224000000,
+ 372787200000,
+ 386697600000,
+ 404841600000,
+ 415728000000,
+ 436291200000,
+ 447177600000,
+ 467740800000,
+ 478627200000,
+ 499190400000,
+ 511286400000,
+ 530035200000,
+ 542736000000,
+ 562089600000,
+ 574790400000,
+ 594144000000,
+ 606240000000,
+ 625593600000,
+ 636480000000,
+ 657043200000,
+ 667929600000,
+ 688492800000,
+ 699379200000,
+ 719942400000,
+ 731433600000,
+ 751996800000,
+ 762883200000,
+ 783446400000,
+ 794332800000,
+ 814896000000,
+ 828201600000,
+ 846345600000,
+ 859651200000,
+ 877795200000,
+ 891100800000,
+ 909244800000,
+ 922550400000,
+ 941299200000,
+ 954000000000,
+ 967305600000,
+ 985449600000,
+ 1004198400000,
+ 1017504000000,
+ 1035648000000,
+ 1048953600000,
+ 1067097600000,
+ 1080403200000,
+ 1099152000000,
+ 1111852800000,
+ 1130601600000,
+ 1143907200000,
+ 1162051200000,
+ 1174752000000,
+ 1193500800000,
+ 1207411200000,
+ 1223136000000,
+ 1238860800000,
+ 1254585600000,
+ 1270310400000,
+ 1286035200000,
+ 1301760000000,
+ 1317484800000,
+ 1333209600000,
+ 1349539200000,
+ 1365264000000,
+ 1380988800000,
+ 1396713600000,
+ 1412438400000,
+ 1428163200000,
+ 1443888000000,
+ 1459612800000,
+ 1475337600000,
+ 1491062400000,
+ 1506787200000,
+ 1522512000000,
+ 1538841600000,
+ 1554566400000,
+ 1570291200000,
+ 1586016000000,
+ 1601740800000,
+ 1617465600000,
+ 1633190400000,
+ 1648915200000,
+ 1664640000000,
+ 1680364800000,
+ 1696089600000,
+ 1712419200000,
+ 1728144000000,
+ 1743868800000,
+ 1759593600000,
+ 1775318400000,
+ 1791043200000,
+ 1806768000000,
+ 1822492800000,
+ 1838217600000,
+ 1853942400000,
+ 1869667200000,
+ 1885996800000,
+ 1901721600000,
+ 1917446400000,
+ 1933171200000,
+ 1948896000000,
+ 1964620800000,
+ 1980345600000,
+ 1996070400000,
+ 2011795200000,
+ 2027520000000,
+ 2043244800000,
+ 2058969600000,
+ 2075299200000,
+ 2091024000000,
+ 2106748800000,
+ 2122473600000,
+ 2138198400000,
+ null
+ ],
+ "offsets": [
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660
+ ],
+ "population": 0
+ },
+ {
+ "name": "Australia/Perth",
+ "abbrs": [
+ "AWST",
+ "AWDT",
+ "AWST",
+ "AWDT",
+ "AWST",
+ "AWDT",
+ "AWST",
+ "AWDT",
+ "AWST",
+ "AWDT",
+ "AWST",
+ "AWDT",
+ "AWST",
+ "AWDT",
+ "AWST",
+ "AWDT",
+ "AWST",
+ "AWDT",
+ "AWST"
+ ],
+ "untils": [
+ -1672559940000,
+ -1665385200000,
+ -883634400000,
+ -876121200000,
+ -860392800000,
+ -844671600000,
+ 152042400000,
+ 162928800000,
+ 436298400000,
+ 447184800000,
+ 690314400000,
+ 699386400000,
+ 1165082400000,
+ 1174759200000,
+ 1193508000000,
+ 1206813600000,
+ 1224957600000,
+ 1238263200000,
+ null
+ ],
+ "offsets": [
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 1751000
+ },
+ {
+ "name": "Australia/Queensland",
+ "abbrs": [
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST"
+ ],
+ "untils": [
+ -1672567140000,
+ -1665392400000,
+ -883641600000,
+ -876128400000,
+ -860400000000,
+ -844678800000,
+ -828345600000,
+ -813229200000,
+ 57686400000,
+ 67968000000,
+ 625593600000,
+ 636480000000,
+ 657043200000,
+ 667929600000,
+ 688492800000,
+ 699379200000,
+ null
+ ],
+ "offsets": [
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600
+ ],
+ "population": 0
+ },
+ {
+ "name": "Australia/South",
+ "abbrs": [
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT"
+ ],
+ "untils": [
+ -1672565340000,
+ -1665390600000,
+ -883639800000,
+ -876126600000,
+ -860398200000,
+ -844677000000,
+ -828343800000,
+ -813227400000,
+ 57688200000,
+ 67969800000,
+ 89137800000,
+ 100024200000,
+ 120587400000,
+ 131473800000,
+ 152037000000,
+ 162923400000,
+ 183486600000,
+ 194977800000,
+ 215541000000,
+ 226427400000,
+ 246990600000,
+ 257877000000,
+ 278440200000,
+ 289326600000,
+ 309889800000,
+ 320776200000,
+ 341339400000,
+ 352225800000,
+ 372789000000,
+ 384280200000,
+ 404843400000,
+ 415729800000,
+ 436293000000,
+ 447179400000,
+ 467742600000,
+ 478629000000,
+ 499192200000,
+ 511288200000,
+ 530037000000,
+ 542737800000,
+ 562091400000,
+ 574792200000,
+ 594145800000,
+ 606241800000,
+ 625595400000,
+ 637691400000,
+ 657045000000,
+ 667931400000,
+ 688494600000,
+ 701195400000,
+ 719944200000,
+ 731435400000,
+ 751998600000,
+ 764094600000,
+ 783448200000,
+ 796149000000,
+ 814897800000,
+ 828203400000,
+ 846347400000,
+ 859653000000,
+ 877797000000,
+ 891102600000,
+ 909246600000,
+ 922552200000,
+ 941301000000,
+ 954001800000,
+ 972750600000,
+ 985451400000,
+ 1004200200000,
+ 1017505800000,
+ 1035649800000,
+ 1048955400000,
+ 1067099400000,
+ 1080405000000,
+ 1099153800000,
+ 1111854600000,
+ 1130603400000,
+ 1143909000000,
+ 1162053000000,
+ 1174753800000,
+ 1193502600000,
+ 1207413000000,
+ 1223137800000,
+ 1238862600000,
+ 1254587400000,
+ 1270312200000,
+ 1286037000000,
+ 1301761800000,
+ 1317486600000,
+ 1333211400000,
+ 1349541000000,
+ 1365265800000,
+ 1380990600000,
+ 1396715400000,
+ 1412440200000,
+ 1428165000000,
+ 1443889800000,
+ 1459614600000,
+ 1475339400000,
+ 1491064200000,
+ 1506789000000,
+ 1522513800000,
+ 1538843400000,
+ 1554568200000,
+ 1570293000000,
+ 1586017800000,
+ 1601742600000,
+ 1617467400000,
+ 1633192200000,
+ 1648917000000,
+ 1664641800000,
+ 1680366600000,
+ 1696091400000,
+ 1712421000000,
+ 1728145800000,
+ 1743870600000,
+ 1759595400000,
+ 1775320200000,
+ 1791045000000,
+ 1806769800000,
+ 1822494600000,
+ 1838219400000,
+ 1853944200000,
+ 1869669000000,
+ 1885998600000,
+ 1901723400000,
+ 1917448200000,
+ 1933173000000,
+ 1948897800000,
+ 1964622600000,
+ 1980347400000,
+ 1996072200000,
+ 2011797000000,
+ 2027521800000,
+ 2043246600000,
+ 2058971400000,
+ 2075301000000,
+ 2091025800000,
+ 2106750600000,
+ 2122475400000,
+ 2138200200000,
+ null
+ ],
+ "offsets": [
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630
+ ],
+ "population": 0
+ },
+ {
+ "name": "Australia/Sydney",
+ "abbrs": [
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT"
+ ],
+ "untils": [
+ -1672567140000,
+ -1665392400000,
+ -883641600000,
+ -876128400000,
+ -860400000000,
+ -844678800000,
+ -828345600000,
+ -813229200000,
+ 57686400000,
+ 67968000000,
+ 89136000000,
+ 100022400000,
+ 120585600000,
+ 131472000000,
+ 152035200000,
+ 162921600000,
+ 183484800000,
+ 194976000000,
+ 215539200000,
+ 226425600000,
+ 246988800000,
+ 257875200000,
+ 278438400000,
+ 289324800000,
+ 309888000000,
+ 320774400000,
+ 341337600000,
+ 352224000000,
+ 372787200000,
+ 386697600000,
+ 404841600000,
+ 415728000000,
+ 436291200000,
+ 447177600000,
+ 467740800000,
+ 478627200000,
+ 499190400000,
+ 511286400000,
+ 530035200000,
+ 542736000000,
+ 562089600000,
+ 574790400000,
+ 594144000000,
+ 606240000000,
+ 625593600000,
+ 636480000000,
+ 657043200000,
+ 667929600000,
+ 688492800000,
+ 699379200000,
+ 719942400000,
+ 731433600000,
+ 751996800000,
+ 762883200000,
+ 783446400000,
+ 794332800000,
+ 814896000000,
+ 828201600000,
+ 846345600000,
+ 859651200000,
+ 877795200000,
+ 891100800000,
+ 909244800000,
+ 922550400000,
+ 941299200000,
+ 954000000000,
+ 967305600000,
+ 985449600000,
+ 1004198400000,
+ 1017504000000,
+ 1035648000000,
+ 1048953600000,
+ 1067097600000,
+ 1080403200000,
+ 1099152000000,
+ 1111852800000,
+ 1130601600000,
+ 1143907200000,
+ 1162051200000,
+ 1174752000000,
+ 1193500800000,
+ 1207411200000,
+ 1223136000000,
+ 1238860800000,
+ 1254585600000,
+ 1270310400000,
+ 1286035200000,
+ 1301760000000,
+ 1317484800000,
+ 1333209600000,
+ 1349539200000,
+ 1365264000000,
+ 1380988800000,
+ 1396713600000,
+ 1412438400000,
+ 1428163200000,
+ 1443888000000,
+ 1459612800000,
+ 1475337600000,
+ 1491062400000,
+ 1506787200000,
+ 1522512000000,
+ 1538841600000,
+ 1554566400000,
+ 1570291200000,
+ 1586016000000,
+ 1601740800000,
+ 1617465600000,
+ 1633190400000,
+ 1648915200000,
+ 1664640000000,
+ 1680364800000,
+ 1696089600000,
+ 1712419200000,
+ 1728144000000,
+ 1743868800000,
+ 1759593600000,
+ 1775318400000,
+ 1791043200000,
+ 1806768000000,
+ 1822492800000,
+ 1838217600000,
+ 1853942400000,
+ 1869667200000,
+ 1885996800000,
+ 1901721600000,
+ 1917446400000,
+ 1933171200000,
+ 1948896000000,
+ 1964620800000,
+ 1980345600000,
+ 1996070400000,
+ 2011795200000,
+ 2027520000000,
+ 2043244800000,
+ 2058969600000,
+ 2075299200000,
+ 2091024000000,
+ 2106748800000,
+ 2122473600000,
+ 2138198400000,
+ null
+ ],
+ "offsets": [
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660
+ ],
+ "population": 4036000
+ },
+ {
+ "name": "Australia/Tasmania",
+ "abbrs": [
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT"
+ ],
+ "untils": [
+ -1680508800000,
+ -1665392400000,
+ -883641600000,
+ -876128400000,
+ -860400000000,
+ -844678800000,
+ -828345600000,
+ -813229200000,
+ -71136000000,
+ -55411200000,
+ -37267200000,
+ -25776000000,
+ -5817600000,
+ 5673600000,
+ 25632000000,
+ 37728000000,
+ 57686400000,
+ 67968000000,
+ 89136000000,
+ 100022400000,
+ 120585600000,
+ 131472000000,
+ 152035200000,
+ 162921600000,
+ 183484800000,
+ 194976000000,
+ 215539200000,
+ 226425600000,
+ 246988800000,
+ 257875200000,
+ 278438400000,
+ 289324800000,
+ 309888000000,
+ 320774400000,
+ 341337600000,
+ 352224000000,
+ 372787200000,
+ 386092800000,
+ 404841600000,
+ 417542400000,
+ 436291200000,
+ 447177600000,
+ 467740800000,
+ 478627200000,
+ 499190400000,
+ 510076800000,
+ 530035200000,
+ 542736000000,
+ 562089600000,
+ 574790400000,
+ 594144000000,
+ 606240000000,
+ 625593600000,
+ 637689600000,
+ 657043200000,
+ 670348800000,
+ 686678400000,
+ 701798400000,
+ 718128000000,
+ 733248000000,
+ 749577600000,
+ 764697600000,
+ 781027200000,
+ 796147200000,
+ 812476800000,
+ 828201600000,
+ 844531200000,
+ 859651200000,
+ 875980800000,
+ 891100800000,
+ 907430400000,
+ 922550400000,
+ 938880000000,
+ 954000000000,
+ 967305600000,
+ 985449600000,
+ 1002384000000,
+ 1017504000000,
+ 1033833600000,
+ 1048953600000,
+ 1065283200000,
+ 1080403200000,
+ 1096732800000,
+ 1111852800000,
+ 1128182400000,
+ 1143907200000,
+ 1159632000000,
+ 1174752000000,
+ 1191686400000,
+ 1207411200000,
+ 1223136000000,
+ 1238860800000,
+ 1254585600000,
+ 1270310400000,
+ 1286035200000,
+ 1301760000000,
+ 1317484800000,
+ 1333209600000,
+ 1349539200000,
+ 1365264000000,
+ 1380988800000,
+ 1396713600000,
+ 1412438400000,
+ 1428163200000,
+ 1443888000000,
+ 1459612800000,
+ 1475337600000,
+ 1491062400000,
+ 1506787200000,
+ 1522512000000,
+ 1538841600000,
+ 1554566400000,
+ 1570291200000,
+ 1586016000000,
+ 1601740800000,
+ 1617465600000,
+ 1633190400000,
+ 1648915200000,
+ 1664640000000,
+ 1680364800000,
+ 1696089600000,
+ 1712419200000,
+ 1728144000000,
+ 1743868800000,
+ 1759593600000,
+ 1775318400000,
+ 1791043200000,
+ 1806768000000,
+ 1822492800000,
+ 1838217600000,
+ 1853942400000,
+ 1869667200000,
+ 1885996800000,
+ 1901721600000,
+ 1917446400000,
+ 1933171200000,
+ 1948896000000,
+ 1964620800000,
+ 1980345600000,
+ 1996070400000,
+ 2011795200000,
+ 2027520000000,
+ 2043244800000,
+ 2058969600000,
+ 2075299200000,
+ 2091024000000,
+ 2106748800000,
+ 2122473600000,
+ 2138198400000,
+ null
+ ],
+ "offsets": [
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660
+ ],
+ "population": 0
+ },
+ {
+ "name": "Australia/Victoria",
+ "abbrs": [
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT",
+ "AEST",
+ "AEDT"
+ ],
+ "untils": [
+ -1672567140000,
+ -1665392400000,
+ -883641600000,
+ -876128400000,
+ -860400000000,
+ -844678800000,
+ -828345600000,
+ -813229200000,
+ 57686400000,
+ 67968000000,
+ 89136000000,
+ 100022400000,
+ 120585600000,
+ 131472000000,
+ 152035200000,
+ 162921600000,
+ 183484800000,
+ 194976000000,
+ 215539200000,
+ 226425600000,
+ 246988800000,
+ 257875200000,
+ 278438400000,
+ 289324800000,
+ 309888000000,
+ 320774400000,
+ 341337600000,
+ 352224000000,
+ 372787200000,
+ 384278400000,
+ 404841600000,
+ 415728000000,
+ 436291200000,
+ 447177600000,
+ 467740800000,
+ 478627200000,
+ 499190400000,
+ 511286400000,
+ 530035200000,
+ 542736000000,
+ 561484800000,
+ 574790400000,
+ 594144000000,
+ 606240000000,
+ 625593600000,
+ 637689600000,
+ 657043200000,
+ 667929600000,
+ 688492800000,
+ 699379200000,
+ 719942400000,
+ 731433600000,
+ 751996800000,
+ 762883200000,
+ 783446400000,
+ 796147200000,
+ 814896000000,
+ 828201600000,
+ 846345600000,
+ 859651200000,
+ 877795200000,
+ 891100800000,
+ 909244800000,
+ 922550400000,
+ 941299200000,
+ 954000000000,
+ 967305600000,
+ 985449600000,
+ 1004198400000,
+ 1017504000000,
+ 1035648000000,
+ 1048953600000,
+ 1067097600000,
+ 1080403200000,
+ 1099152000000,
+ 1111852800000,
+ 1130601600000,
+ 1143907200000,
+ 1162051200000,
+ 1174752000000,
+ 1193500800000,
+ 1207411200000,
+ 1223136000000,
+ 1238860800000,
+ 1254585600000,
+ 1270310400000,
+ 1286035200000,
+ 1301760000000,
+ 1317484800000,
+ 1333209600000,
+ 1349539200000,
+ 1365264000000,
+ 1380988800000,
+ 1396713600000,
+ 1412438400000,
+ 1428163200000,
+ 1443888000000,
+ 1459612800000,
+ 1475337600000,
+ 1491062400000,
+ 1506787200000,
+ 1522512000000,
+ 1538841600000,
+ 1554566400000,
+ 1570291200000,
+ 1586016000000,
+ 1601740800000,
+ 1617465600000,
+ 1633190400000,
+ 1648915200000,
+ 1664640000000,
+ 1680364800000,
+ 1696089600000,
+ 1712419200000,
+ 1728144000000,
+ 1743868800000,
+ 1759593600000,
+ 1775318400000,
+ 1791043200000,
+ 1806768000000,
+ 1822492800000,
+ 1838217600000,
+ 1853942400000,
+ 1869667200000,
+ 1885996800000,
+ 1901721600000,
+ 1917446400000,
+ 1933171200000,
+ 1948896000000,
+ 1964620800000,
+ 1980345600000,
+ 1996070400000,
+ 2011795200000,
+ 2027520000000,
+ 2043244800000,
+ 2058969600000,
+ 2075299200000,
+ 2091024000000,
+ 2106748800000,
+ 2122473600000,
+ 2138198400000,
+ null
+ ],
+ "offsets": [
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660,
+ -600,
+ -660
+ ],
+ "population": 0
+ },
+ {
+ "name": "Australia/West",
+ "abbrs": [
+ "AWST",
+ "AWDT",
+ "AWST",
+ "AWDT",
+ "AWST",
+ "AWDT",
+ "AWST",
+ "AWDT",
+ "AWST",
+ "AWDT",
+ "AWST",
+ "AWDT",
+ "AWST",
+ "AWDT",
+ "AWST",
+ "AWDT",
+ "AWST",
+ "AWDT",
+ "AWST"
+ ],
+ "untils": [
+ -1672559940000,
+ -1665385200000,
+ -883634400000,
+ -876121200000,
+ -860392800000,
+ -844671600000,
+ 152042400000,
+ 162928800000,
+ 436298400000,
+ 447184800000,
+ 690314400000,
+ 699386400000,
+ 1165082400000,
+ 1174759200000,
+ 1193508000000,
+ 1206813600000,
+ 1224957600000,
+ 1238263200000,
+ null
+ ],
+ "offsets": [
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 0
+ },
+ {
+ "name": "Australia/Yancowinna",
+ "abbrs": [
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT",
+ "ACST",
+ "ACDT"
+ ],
+ "untils": [
+ -1672565340000,
+ -1665390600000,
+ -883639800000,
+ -876126600000,
+ -860398200000,
+ -844677000000,
+ -828343800000,
+ -813227400000,
+ 57688200000,
+ 67969800000,
+ 89137800000,
+ 100024200000,
+ 120587400000,
+ 131473800000,
+ 152037000000,
+ 162923400000,
+ 183486600000,
+ 194977800000,
+ 215541000000,
+ 226427400000,
+ 246990600000,
+ 257877000000,
+ 278440200000,
+ 289326600000,
+ 309889800000,
+ 320776200000,
+ 341339400000,
+ 352225800000,
+ 372789000000,
+ 386699400000,
+ 404843400000,
+ 415729800000,
+ 436293000000,
+ 447179400000,
+ 467742600000,
+ 478629000000,
+ 499192200000,
+ 511288200000,
+ 530037000000,
+ 542737800000,
+ 562091400000,
+ 574792200000,
+ 594145800000,
+ 606241800000,
+ 625595400000,
+ 636481800000,
+ 657045000000,
+ 667931400000,
+ 688494600000,
+ 699381000000,
+ 719944200000,
+ 731435400000,
+ 751998600000,
+ 762885000000,
+ 783448200000,
+ 794334600000,
+ 814897800000,
+ 828203400000,
+ 846347400000,
+ 859653000000,
+ 877797000000,
+ 891102600000,
+ 909246600000,
+ 922552200000,
+ 941301000000,
+ 954001800000,
+ 972750600000,
+ 985451400000,
+ 1004200200000,
+ 1017505800000,
+ 1035649800000,
+ 1048955400000,
+ 1067099400000,
+ 1080405000000,
+ 1099153800000,
+ 1111854600000,
+ 1130603400000,
+ 1143909000000,
+ 1162053000000,
+ 1174753800000,
+ 1193502600000,
+ 1207413000000,
+ 1223137800000,
+ 1238862600000,
+ 1254587400000,
+ 1270312200000,
+ 1286037000000,
+ 1301761800000,
+ 1317486600000,
+ 1333211400000,
+ 1349541000000,
+ 1365265800000,
+ 1380990600000,
+ 1396715400000,
+ 1412440200000,
+ 1428165000000,
+ 1443889800000,
+ 1459614600000,
+ 1475339400000,
+ 1491064200000,
+ 1506789000000,
+ 1522513800000,
+ 1538843400000,
+ 1554568200000,
+ 1570293000000,
+ 1586017800000,
+ 1601742600000,
+ 1617467400000,
+ 1633192200000,
+ 1648917000000,
+ 1664641800000,
+ 1680366600000,
+ 1696091400000,
+ 1712421000000,
+ 1728145800000,
+ 1743870600000,
+ 1759595400000,
+ 1775320200000,
+ 1791045000000,
+ 1806769800000,
+ 1822494600000,
+ 1838219400000,
+ 1853944200000,
+ 1869669000000,
+ 1885998600000,
+ 1901723400000,
+ 1917448200000,
+ 1933173000000,
+ 1948897800000,
+ 1964622600000,
+ 1980347400000,
+ 1996072200000,
+ 2011797000000,
+ 2027521800000,
+ 2043246600000,
+ 2058971400000,
+ 2075301000000,
+ 2091025800000,
+ 2106750600000,
+ 2122475400000,
+ 2138200200000,
+ null
+ ],
+ "offsets": [
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630,
+ -570,
+ -630
+ ],
+ "population": 0
+ },
+ {
+ "name": "Brazil/Acre",
+ "abbrs": [
+ "LMT",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05"
+ ],
+ "untils": [
+ -1767209328000,
+ -1206950400000,
+ -1191355200000,
+ -1175367600000,
+ -1159819200000,
+ -633812400000,
+ -622062000000,
+ -602276400000,
+ -591825600000,
+ -570740400000,
+ -560203200000,
+ -539118000000,
+ -531345600000,
+ -191358000000,
+ -184190400000,
+ -155156400000,
+ -150062400000,
+ -128890800000,
+ -121118400000,
+ -99946800000,
+ -89582400000,
+ -68410800000,
+ -57960000000,
+ 499755600000,
+ 511243200000,
+ 530600400000,
+ 540273600000,
+ 562136400000,
+ 571204800000,
+ 1214283600000,
+ 1384056000000,
+ null
+ ],
+ "offsets": [
+ 271.2,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "Brazil/DeNoronha",
+ "abbrs": [
+ "LMT",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02",
+ "-01",
+ "-02"
+ ],
+ "untils": [
+ -1767217820000,
+ -1206961200000,
+ -1191366000000,
+ -1175378400000,
+ -1159830000000,
+ -633823200000,
+ -622072800000,
+ -602287200000,
+ -591836400000,
+ -570751200000,
+ -560214000000,
+ -539128800000,
+ -531356400000,
+ -191368800000,
+ -184201200000,
+ -155167200000,
+ -150073200000,
+ -128901600000,
+ -121129200000,
+ -99957600000,
+ -89593200000,
+ -68421600000,
+ -57970800000,
+ 499744800000,
+ 511232400000,
+ 530589600000,
+ 540262800000,
+ 562125600000,
+ 571194000000,
+ 592970400000,
+ 602038800000,
+ 624420000000,
+ 634698000000,
+ 938916000000,
+ 951613200000,
+ 970970400000,
+ 971571600000,
+ 1003024800000,
+ 1013907600000,
+ null
+ ],
+ "offsets": [
+ 129.6667,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120,
+ 60,
+ 120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Brazil/East",
+ "abbrs": [
+ "LMT",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02",
+ "-03",
+ "-02"
+ ],
+ "untils": [
+ -1767214412000,
+ -1206957600000,
+ -1191362400000,
+ -1175374800000,
+ -1159826400000,
+ -633819600000,
+ -622069200000,
+ -602283600000,
+ -591832800000,
+ -570747600000,
+ -560210400000,
+ -539125200000,
+ -531352800000,
+ -195426000000,
+ -184197600000,
+ -155163600000,
+ -150069600000,
+ -128898000000,
+ -121125600000,
+ -99954000000,
+ -89589600000,
+ -68418000000,
+ -57967200000,
+ 499748400000,
+ 511236000000,
+ 530593200000,
+ 540266400000,
+ 562129200000,
+ 571197600000,
+ 592974000000,
+ 602042400000,
+ 624423600000,
+ 634701600000,
+ 656478000000,
+ 666756000000,
+ 687927600000,
+ 697600800000,
+ 719982000000,
+ 728445600000,
+ 750826800000,
+ 761709600000,
+ 782276400000,
+ 793159200000,
+ 813726000000,
+ 824004000000,
+ 844570800000,
+ 856058400000,
+ 876106800000,
+ 888717600000,
+ 908074800000,
+ 919562400000,
+ 938919600000,
+ 951616800000,
+ 970974000000,
+ 982461600000,
+ 1003028400000,
+ 1013911200000,
+ 1036292400000,
+ 1045360800000,
+ 1066532400000,
+ 1076810400000,
+ 1099364400000,
+ 1108864800000,
+ 1129431600000,
+ 1140314400000,
+ 1162695600000,
+ 1172368800000,
+ 1192330800000,
+ 1203213600000,
+ 1224385200000,
+ 1234663200000,
+ 1255834800000,
+ 1266717600000,
+ 1287284400000,
+ 1298167200000,
+ 1318734000000,
+ 1330221600000,
+ 1350788400000,
+ 1361066400000,
+ 1382238000000,
+ 1392516000000,
+ 1413687600000,
+ 1424570400000,
+ 1445137200000,
+ 1456020000000,
+ 1476586800000,
+ 1487469600000,
+ 1508036400000,
+ 1518919200000,
+ 1541300400000,
+ 1550368800000,
+ 1572750000000,
+ 1581818400000,
+ 1604199600000,
+ 1613872800000,
+ 1636254000000,
+ 1645322400000,
+ 1667703600000,
+ 1677376800000,
+ 1699153200000,
+ 1708221600000,
+ 1730602800000,
+ 1739671200000,
+ 1762052400000,
+ 1771725600000,
+ 1793502000000,
+ 1803175200000,
+ 1825556400000,
+ 1834624800000,
+ 1857006000000,
+ 1866074400000,
+ 1888455600000,
+ 1897524000000,
+ 1919905200000,
+ 1928973600000,
+ 1951354800000,
+ 1960423200000,
+ 1983409200000,
+ 1992477600000,
+ 2014858800000,
+ 2024532000000,
+ 2046308400000,
+ 2055376800000,
+ 2077758000000,
+ 2086826400000,
+ 2109207600000,
+ 2118880800000,
+ 2140657200000,
+ null
+ ],
+ "offsets": [
+ 186.4667,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120,
+ 180,
+ 120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Brazil/West",
+ "abbrs": [
+ "LMT",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04"
+ ],
+ "untils": [
+ -1767211196000,
+ -1206954000000,
+ -1191358800000,
+ -1175371200000,
+ -1159822800000,
+ -633816000000,
+ -622065600000,
+ -602280000000,
+ -591829200000,
+ -570744000000,
+ -560206800000,
+ -539121600000,
+ -531349200000,
+ -191361600000,
+ -184194000000,
+ -155160000000,
+ -150066000000,
+ -128894400000,
+ -121122000000,
+ -99950400000,
+ -89586000000,
+ -68414400000,
+ -57963600000,
+ 499752000000,
+ 511239600000,
+ 530596800000,
+ 540270000000,
+ 562132800000,
+ 571201200000,
+ 750830400000,
+ 761713200000,
+ null
+ ],
+ "offsets": [
+ 240.0667,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240
+ ],
+ "population": 0
+ },
+ {
+ "name": "Canada/Atlantic",
+ "abbrs": [
+ "LMT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "AWT",
+ "APT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST",
+ "ADT",
+ "AST"
+ ],
+ "untils": [
+ -2131645536000,
+ -1696276800000,
+ -1680469200000,
+ -1632074400000,
+ -1615143600000,
+ -1566763200000,
+ -1557090000000,
+ -1535486400000,
+ -1524949200000,
+ -1504468800000,
+ -1493413200000,
+ -1472414400000,
+ -1461963600000,
+ -1440964800000,
+ -1429390800000,
+ -1409515200000,
+ -1396731600000,
+ -1376856000000,
+ -1366491600000,
+ -1346616000000,
+ -1333832400000,
+ -1313956800000,
+ -1303678800000,
+ -1282507200000,
+ -1272661200000,
+ -1251057600000,
+ -1240088400000,
+ -1219608000000,
+ -1207429200000,
+ -1188763200000,
+ -1175979600000,
+ -1157313600000,
+ -1143925200000,
+ -1124049600000,
+ -1113771600000,
+ -1091390400000,
+ -1081026000000,
+ -1059854400000,
+ -1050786000000,
+ -1030910400000,
+ -1018126800000,
+ -999460800000,
+ -986677200000,
+ -965592000000,
+ -955227600000,
+ -935956800000,
+ -923173200000,
+ -904507200000,
+ -891723600000,
+ -880221600000,
+ -769395600000,
+ -765399600000,
+ -747252000000,
+ -733950000000,
+ -715802400000,
+ -702500400000,
+ -684352800000,
+ -671050800000,
+ -652903200000,
+ -639601200000,
+ -589399200000,
+ -576097200000,
+ -557949600000,
+ -544647600000,
+ -526500000000,
+ -513198000000,
+ -495050400000,
+ -481748400000,
+ -431546400000,
+ -418244400000,
+ -400096800000,
+ -386794800000,
+ -368647200000,
+ -355345200000,
+ -337197600000,
+ -323895600000,
+ -242244000000,
+ -226522800000,
+ -210794400000,
+ -195073200000,
+ -179344800000,
+ -163623600000,
+ -147895200000,
+ -131569200000,
+ -116445600000,
+ -100119600000,
+ -84391200000,
+ -68670000000,
+ -52941600000,
+ -37220400000,
+ -21492000000,
+ -5770800000,
+ 9957600000,
+ 25678800000,
+ 41407200000,
+ 57733200000,
+ 73461600000,
+ 89182800000,
+ 104911200000,
+ 120632400000,
+ 136360800000,
+ 152082000000,
+ 167810400000,
+ 183531600000,
+ 199260000000,
+ 215586000000,
+ 230709600000,
+ 247035600000,
+ 262764000000,
+ 278485200000,
+ 294213600000,
+ 309934800000,
+ 325663200000,
+ 341384400000,
+ 357112800000,
+ 372834000000,
+ 388562400000,
+ 404888400000,
+ 420012000000,
+ 436338000000,
+ 452066400000,
+ 467787600000,
+ 483516000000,
+ 499237200000,
+ 514965600000,
+ 530686800000,
+ 544600800000,
+ 562136400000,
+ 576050400000,
+ 594190800000,
+ 607500000000,
+ 625640400000,
+ 638949600000,
+ 657090000000,
+ 671004000000,
+ 688539600000,
+ 702453600000,
+ 719989200000,
+ 733903200000,
+ 752043600000,
+ 765352800000,
+ 783493200000,
+ 796802400000,
+ 814942800000,
+ 828856800000,
+ 846392400000,
+ 860306400000,
+ 877842000000,
+ 891756000000,
+ 909291600000,
+ 923205600000,
+ 941346000000,
+ 954655200000,
+ 972795600000,
+ 986104800000,
+ 1004245200000,
+ 1018159200000,
+ 1035694800000,
+ 1049608800000,
+ 1067144400000,
+ 1081058400000,
+ 1099198800000,
+ 1112508000000,
+ 1130648400000,
+ 1143957600000,
+ 1162098000000,
+ 1173592800000,
+ 1194152400000,
+ 1205042400000,
+ 1225602000000,
+ 1236492000000,
+ 1257051600000,
+ 1268546400000,
+ 1289106000000,
+ 1299996000000,
+ 1320555600000,
+ 1331445600000,
+ 1352005200000,
+ 1362895200000,
+ 1383454800000,
+ 1394344800000,
+ 1414904400000,
+ 1425794400000,
+ 1446354000000,
+ 1457848800000,
+ 1478408400000,
+ 1489298400000,
+ 1509858000000,
+ 1520748000000,
+ 1541307600000,
+ 1552197600000,
+ 1572757200000,
+ 1583647200000,
+ 1604206800000,
+ 1615701600000,
+ 1636261200000,
+ 1647151200000,
+ 1667710800000,
+ 1678600800000,
+ 1699160400000,
+ 1710050400000,
+ 1730610000000,
+ 1741500000000,
+ 1762059600000,
+ 1772949600000,
+ 1793509200000,
+ 1805004000000,
+ 1825563600000,
+ 1836453600000,
+ 1857013200000,
+ 1867903200000,
+ 1888462800000,
+ 1899352800000,
+ 1919912400000,
+ 1930802400000,
+ 1951362000000,
+ 1962856800000,
+ 1983416400000,
+ 1994306400000,
+ 2014866000000,
+ 2025756000000,
+ 2046315600000,
+ 2057205600000,
+ 2077765200000,
+ 2088655200000,
+ 2109214800000,
+ 2120104800000,
+ 2140664400000,
+ null
+ ],
+ "offsets": [
+ 254.4,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240
+ ],
+ "population": 0
+ },
+ {
+ "name": "Canada/Central",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1694368800000,
+ -1681671600000,
+ -1632067200000,
+ -1615136400000,
+ -1029686400000,
+ -1018198800000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -746035200000,
+ -732733200000,
+ -715795200000,
+ -702493200000,
+ -684345600000,
+ -671043600000,
+ -652896000000,
+ -639594000000,
+ -620755200000,
+ -607626000000,
+ -589392000000,
+ -576090000000,
+ -557942400000,
+ -544640400000,
+ -526492800000,
+ -513190800000,
+ -495043200000,
+ -481741200000,
+ -463593600000,
+ -450291600000,
+ -431539200000,
+ -418237200000,
+ -400089600000,
+ -386787600000,
+ -368640000000,
+ -355338000000,
+ -337190400000,
+ -321469200000,
+ -305740800000,
+ -292438800000,
+ -210787200000,
+ -198090000000,
+ -116438400000,
+ -100108800000,
+ -84384000000,
+ -68659200000,
+ -52934400000,
+ -37209600000,
+ -21484800000,
+ -5760000000,
+ 9964800000,
+ 25689600000,
+ 41414400000,
+ 57744000000,
+ 73468800000,
+ 89193600000,
+ 104918400000,
+ 120643200000,
+ 136368000000,
+ 152092800000,
+ 167817600000,
+ 183542400000,
+ 199267200000,
+ 215596800000,
+ 230716800000,
+ 247046400000,
+ 262771200000,
+ 278496000000,
+ 294220800000,
+ 309945600000,
+ 325670400000,
+ 341395200000,
+ 357120000000,
+ 372844800000,
+ 388569600000,
+ 404899200000,
+ 420019200000,
+ 436348800000,
+ 452073600000,
+ 467798400000,
+ 483523200000,
+ 499248000000,
+ 514972800000,
+ 530697600000,
+ 544608000000,
+ 562147200000,
+ 576057600000,
+ 594201600000,
+ 607507200000,
+ 625651200000,
+ 638956800000,
+ 657100800000,
+ 671011200000,
+ 688550400000,
+ 702460800000,
+ 720000000000,
+ 733910400000,
+ 752054400000,
+ 765360000000,
+ 783504000000,
+ 796809600000,
+ 814953600000,
+ 828864000000,
+ 846403200000,
+ 860313600000,
+ 877852800000,
+ 891763200000,
+ 909302400000,
+ 923212800000,
+ 941356800000,
+ 954662400000,
+ 972806400000,
+ 986112000000,
+ 1004256000000,
+ 1018166400000,
+ 1035705600000,
+ 1049616000000,
+ 1067155200000,
+ 1081065600000,
+ 1099209600000,
+ 1112515200000,
+ 1130659200000,
+ 1143964800000,
+ 1162105200000,
+ 1173600000000,
+ 1194159600000,
+ 1205049600000,
+ 1225609200000,
+ 1236499200000,
+ 1257058800000,
+ 1268553600000,
+ 1289113200000,
+ 1300003200000,
+ 1320562800000,
+ 1331452800000,
+ 1352012400000,
+ 1362902400000,
+ 1383462000000,
+ 1394352000000,
+ 1414911600000,
+ 1425801600000,
+ 1446361200000,
+ 1457856000000,
+ 1478415600000,
+ 1489305600000,
+ 1509865200000,
+ 1520755200000,
+ 1541314800000,
+ 1552204800000,
+ 1572764400000,
+ 1583654400000,
+ 1604214000000,
+ 1615708800000,
+ 1636268400000,
+ 1647158400000,
+ 1667718000000,
+ 1678608000000,
+ 1699167600000,
+ 1710057600000,
+ 1730617200000,
+ 1741507200000,
+ 1762066800000,
+ 1772956800000,
+ 1793516400000,
+ 1805011200000,
+ 1825570800000,
+ 1836460800000,
+ 1857020400000,
+ 1867910400000,
+ 1888470000000,
+ 1899360000000,
+ 1919919600000,
+ 1930809600000,
+ 1951369200000,
+ 1962864000000,
+ 1983423600000,
+ 1994313600000,
+ 2014873200000,
+ 2025763200000,
+ 2046322800000,
+ 2057212800000,
+ 2077772400000,
+ 2088662400000,
+ 2109222000000,
+ 2120112000000,
+ 2140671600000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 0
+ },
+ {
+ "name": "Canada/Eastern",
+ "abbrs": [
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EWT",
+ "EPT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1632070800000,
+ -1615140000000,
+ -1601753400000,
+ -1583697600000,
+ -1567357200000,
+ -1554667200000,
+ -1534698000000,
+ -1524074400000,
+ -1503248400000,
+ -1492365600000,
+ -1471798800000,
+ -1460916000000,
+ -1440954000000,
+ -1428861600000,
+ -1409504400000,
+ -1397412000000,
+ -1378054800000,
+ -1365962400000,
+ -1346605200000,
+ -1333908000000,
+ -1315155600000,
+ -1301853600000,
+ -1283706000000,
+ -1270404000000,
+ -1252256400000,
+ -1238954400000,
+ -1220806800000,
+ -1207504800000,
+ -1188752400000,
+ -1176055200000,
+ -1157302800000,
+ -1144000800000,
+ -1125853200000,
+ -1112551200000,
+ -1094403600000,
+ -1081101600000,
+ -1062954000000,
+ -1049652000000,
+ -1031504400000,
+ -1018202400000,
+ -1000054800000,
+ -986752800000,
+ -968000400000,
+ -955303200000,
+ -936550800000,
+ -880218000000,
+ -769395600000,
+ -765396000000,
+ -747248400000,
+ -733946400000,
+ -715806000000,
+ -702504000000,
+ -684356400000,
+ -671054400000,
+ -652906800000,
+ -634161600000,
+ -620845200000,
+ -602704800000,
+ -589395600000,
+ -576093600000,
+ -557946000000,
+ -544644000000,
+ -526496400000,
+ -513194400000,
+ -495046800000,
+ -481744800000,
+ -463597200000,
+ -450295200000,
+ -431542800000,
+ -418240800000,
+ -400093200000,
+ -384372000000,
+ -368643600000,
+ -352922400000,
+ -337194000000,
+ -321472800000,
+ -305744400000,
+ -289418400000,
+ -273690000000,
+ -257968800000,
+ -242240400000,
+ -226519200000,
+ -210790800000,
+ -195069600000,
+ -179341200000,
+ -163620000000,
+ -147891600000,
+ -131565600000,
+ -116442000000,
+ -100116000000,
+ -84387600000,
+ -68666400000,
+ -52938000000,
+ -37216800000,
+ -21488400000,
+ -5767200000,
+ 9961200000,
+ 25682400000,
+ 41410800000,
+ 57736800000,
+ 73465200000,
+ 89186400000,
+ 104914800000,
+ 120636000000,
+ 136364400000,
+ 152085600000,
+ 167814000000,
+ 183535200000,
+ 199263600000,
+ 215589600000,
+ 230713200000,
+ 247039200000,
+ 262767600000,
+ 278488800000,
+ 294217200000,
+ 309938400000,
+ 325666800000,
+ 341388000000,
+ 357116400000,
+ 372837600000,
+ 388566000000,
+ 404892000000,
+ 420015600000,
+ 436341600000,
+ 452070000000,
+ 467791200000,
+ 483519600000,
+ 499240800000,
+ 514969200000,
+ 530690400000,
+ 544604400000,
+ 562140000000,
+ 576054000000,
+ 594194400000,
+ 607503600000,
+ 625644000000,
+ 638953200000,
+ 657093600000,
+ 671007600000,
+ 688543200000,
+ 702457200000,
+ 719992800000,
+ 733906800000,
+ 752047200000,
+ 765356400000,
+ 783496800000,
+ 796806000000,
+ 814946400000,
+ 828860400000,
+ 846396000000,
+ 860310000000,
+ 877845600000,
+ 891759600000,
+ 909295200000,
+ 923209200000,
+ 941349600000,
+ 954658800000,
+ 972799200000,
+ 986108400000,
+ 1004248800000,
+ 1018162800000,
+ 1035698400000,
+ 1049612400000,
+ 1067148000000,
+ 1081062000000,
+ 1099202400000,
+ 1112511600000,
+ 1130652000000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 240,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "Canada/Mountain",
+ "abbrs": [
+ "LMT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MWT",
+ "MPT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST"
+ ],
+ "untils": [
+ -1998663968000,
+ -1632063600000,
+ -1615132800000,
+ -1600614000000,
+ -1596816000000,
+ -1567954800000,
+ -1551628800000,
+ -1536505200000,
+ -1523203200000,
+ -1504450800000,
+ -1491753600000,
+ -1473001200000,
+ -1459699200000,
+ -880210800000,
+ -769395600000,
+ -765388800000,
+ -715791600000,
+ -702489600000,
+ -84380400000,
+ -68659200000,
+ -21481200000,
+ -5760000000,
+ 73472400000,
+ 89193600000,
+ 104922000000,
+ 120643200000,
+ 136371600000,
+ 152092800000,
+ 167821200000,
+ 183542400000,
+ 199270800000,
+ 215596800000,
+ 230720400000,
+ 247046400000,
+ 262774800000,
+ 278496000000,
+ 294224400000,
+ 309945600000,
+ 325674000000,
+ 341395200000,
+ 357123600000,
+ 372844800000,
+ 388573200000,
+ 404899200000,
+ 420022800000,
+ 436348800000,
+ 452077200000,
+ 467798400000,
+ 483526800000,
+ 499248000000,
+ 514976400000,
+ 530697600000,
+ 544611600000,
+ 562147200000,
+ 576061200000,
+ 594201600000,
+ 607510800000,
+ 625651200000,
+ 638960400000,
+ 657100800000,
+ 671014800000,
+ 688550400000,
+ 702464400000,
+ 720000000000,
+ 733914000000,
+ 752054400000,
+ 765363600000,
+ 783504000000,
+ 796813200000,
+ 814953600000,
+ 828867600000,
+ 846403200000,
+ 860317200000,
+ 877852800000,
+ 891766800000,
+ 909302400000,
+ 923216400000,
+ 941356800000,
+ 954666000000,
+ 972806400000,
+ 986115600000,
+ 1004256000000,
+ 1018170000000,
+ 1035705600000,
+ 1049619600000,
+ 1067155200000,
+ 1081069200000,
+ 1099209600000,
+ 1112518800000,
+ 1130659200000,
+ 1143968400000,
+ 1162108800000,
+ 1173603600000,
+ 1194163200000,
+ 1205053200000,
+ 1225612800000,
+ 1236502800000,
+ 1257062400000,
+ 1268557200000,
+ 1289116800000,
+ 1300006800000,
+ 1320566400000,
+ 1331456400000,
+ 1352016000000,
+ 1362906000000,
+ 1383465600000,
+ 1394355600000,
+ 1414915200000,
+ 1425805200000,
+ 1446364800000,
+ 1457859600000,
+ 1478419200000,
+ 1489309200000,
+ 1509868800000,
+ 1520758800000,
+ 1541318400000,
+ 1552208400000,
+ 1572768000000,
+ 1583658000000,
+ 1604217600000,
+ 1615712400000,
+ 1636272000000,
+ 1647162000000,
+ 1667721600000,
+ 1678611600000,
+ 1699171200000,
+ 1710061200000,
+ 1730620800000,
+ 1741510800000,
+ 1762070400000,
+ 1772960400000,
+ 1793520000000,
+ 1805014800000,
+ 1825574400000,
+ 1836464400000,
+ 1857024000000,
+ 1867914000000,
+ 1888473600000,
+ 1899363600000,
+ 1919923200000,
+ 1930813200000,
+ 1951372800000,
+ 1962867600000,
+ 1983427200000,
+ 1994317200000,
+ 2014876800000,
+ 2025766800000,
+ 2046326400000,
+ 2057216400000,
+ 2077776000000,
+ 2088666000000,
+ 2109225600000,
+ 2120115600000,
+ 2140675200000,
+ null
+ ],
+ "offsets": [
+ 453.8667,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420
+ ],
+ "population": 0
+ },
+ {
+ "name": "Canada/Newfoundland",
+ "abbrs": [
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NWT",
+ "NPT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST",
+ "NDT",
+ "NST"
+ ],
+ "untils": [
+ -1664130548000,
+ -1650137348000,
+ -1632076148000,
+ -1615145348000,
+ -1598650148000,
+ -1590100148000,
+ -1567286948000,
+ -1551565748000,
+ -1535837348000,
+ -1520116148000,
+ -1503782948000,
+ -1488666548000,
+ -1472333348000,
+ -1457216948000,
+ -1440883748000,
+ -1425767348000,
+ -1409434148000,
+ -1394317748000,
+ -1377984548000,
+ -1362263348000,
+ -1346534948000,
+ -1330813748000,
+ -1314480548000,
+ -1299364148000,
+ -1283030948000,
+ -1267914548000,
+ -1251581348000,
+ -1236464948000,
+ -1220131748000,
+ -1205015348000,
+ -1188682148000,
+ -1172960948000,
+ -1156627748000,
+ -1141511348000,
+ -1125178148000,
+ -1110061748000,
+ -1096921748000,
+ -1093728600000,
+ -1078612200000,
+ -1061670600000,
+ -1048973400000,
+ -1030221000000,
+ -1017523800000,
+ -998771400000,
+ -986074200000,
+ -966717000000,
+ -954624600000,
+ -935267400000,
+ -922570200000,
+ -903817800000,
+ -891120600000,
+ -872368200000,
+ -769395600000,
+ -765401400000,
+ -746044200000,
+ -733347000000,
+ -714594600000,
+ -701897400000,
+ -683145000000,
+ -670447800000,
+ -651695400000,
+ -638998200000,
+ -619641000000,
+ -606943800000,
+ -589401000000,
+ -576099000000,
+ -557951400000,
+ -544649400000,
+ -526501800000,
+ -513199800000,
+ -495052200000,
+ -481750200000,
+ -463602600000,
+ -450300600000,
+ -431548200000,
+ -418246200000,
+ -400098600000,
+ -386796600000,
+ -368649000000,
+ -355347000000,
+ -337199400000,
+ -323897400000,
+ -305749800000,
+ -289423800000,
+ -273695400000,
+ -257974200000,
+ -242245800000,
+ -226524600000,
+ -210796200000,
+ -195075000000,
+ -179346600000,
+ -163625400000,
+ -147897000000,
+ -131571000000,
+ -116447400000,
+ -100121400000,
+ -84393000000,
+ -68671800000,
+ -52943400000,
+ -37222200000,
+ -21493800000,
+ -5772600000,
+ 9955800000,
+ 25677000000,
+ 41405400000,
+ 57731400000,
+ 73459800000,
+ 89181000000,
+ 104909400000,
+ 120630600000,
+ 136359000000,
+ 152080200000,
+ 167808600000,
+ 183529800000,
+ 199258200000,
+ 215584200000,
+ 230707800000,
+ 247033800000,
+ 262762200000,
+ 278483400000,
+ 294211800000,
+ 309933000000,
+ 325661400000,
+ 341382600000,
+ 357111000000,
+ 372832200000,
+ 388560600000,
+ 404886600000,
+ 420010200000,
+ 436336200000,
+ 452064600000,
+ 467785800000,
+ 483514200000,
+ 499235400000,
+ 514963800000,
+ 530685000000,
+ 544591860000,
+ 562127460000,
+ 576041460000,
+ 594178260000,
+ 607491060000,
+ 625631460000,
+ 638940660000,
+ 657081060000,
+ 670995060000,
+ 688530660000,
+ 702444660000,
+ 719980260000,
+ 733894260000,
+ 752034660000,
+ 765343860000,
+ 783484260000,
+ 796793460000,
+ 814933860000,
+ 828847860000,
+ 846383460000,
+ 860297460000,
+ 877833060000,
+ 891747060000,
+ 909282660000,
+ 923196660000,
+ 941337060000,
+ 954646260000,
+ 972786660000,
+ 986095860000,
+ 1004236260000,
+ 1018150260000,
+ 1035685860000,
+ 1049599860000,
+ 1067135460000,
+ 1081049460000,
+ 1099189860000,
+ 1112499060000,
+ 1130639460000,
+ 1143948660000,
+ 1162089060000,
+ 1173583860000,
+ 1194143460000,
+ 1205033460000,
+ 1225593060000,
+ 1236483060000,
+ 1257042660000,
+ 1268537460000,
+ 1289097060000,
+ 1299987060000,
+ 1320553800000,
+ 1331443800000,
+ 1352003400000,
+ 1362893400000,
+ 1383453000000,
+ 1394343000000,
+ 1414902600000,
+ 1425792600000,
+ 1446352200000,
+ 1457847000000,
+ 1478406600000,
+ 1489296600000,
+ 1509856200000,
+ 1520746200000,
+ 1541305800000,
+ 1552195800000,
+ 1572755400000,
+ 1583645400000,
+ 1604205000000,
+ 1615699800000,
+ 1636259400000,
+ 1647149400000,
+ 1667709000000,
+ 1678599000000,
+ 1699158600000,
+ 1710048600000,
+ 1730608200000,
+ 1741498200000,
+ 1762057800000,
+ 1772947800000,
+ 1793507400000,
+ 1805002200000,
+ 1825561800000,
+ 1836451800000,
+ 1857011400000,
+ 1867901400000,
+ 1888461000000,
+ 1899351000000,
+ 1919910600000,
+ 1930800600000,
+ 1951360200000,
+ 1962855000000,
+ 1983414600000,
+ 1994304600000,
+ 2014864200000,
+ 2025754200000,
+ 2046313800000,
+ 2057203800000,
+ 2077763400000,
+ 2088653400000,
+ 2109213000000,
+ 2120103000000,
+ 2140662600000,
+ null
+ ],
+ "offsets": [
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 150.8667,
+ 210.8667,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 90,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210,
+ 150,
+ 210
+ ],
+ "population": 0
+ },
+ {
+ "name": "Canada/Pacific",
+ "abbrs": [
+ "PST",
+ "PDT",
+ "PST",
+ "PWT",
+ "PPT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST"
+ ],
+ "untils": [
+ -1632060000000,
+ -1615129200000,
+ -880207200000,
+ -769395600000,
+ -765385200000,
+ -747237600000,
+ -732726000000,
+ -715788000000,
+ -702486000000,
+ -684338400000,
+ -671036400000,
+ -652888800000,
+ -639586800000,
+ -620834400000,
+ -608137200000,
+ -589384800000,
+ -576082800000,
+ -557935200000,
+ -544633200000,
+ -526485600000,
+ -513183600000,
+ -495036000000,
+ -481734000000,
+ -463586400000,
+ -450284400000,
+ -431532000000,
+ -418230000000,
+ -400082400000,
+ -386780400000,
+ -368632800000,
+ -355330800000,
+ -337183200000,
+ -323881200000,
+ -305733600000,
+ -292431600000,
+ -273679200000,
+ -260982000000,
+ -242229600000,
+ -226508400000,
+ -210780000000,
+ -195058800000,
+ -179330400000,
+ -163609200000,
+ -147880800000,
+ -131554800000,
+ -116431200000,
+ -100105200000,
+ -84376800000,
+ -68655600000,
+ -52927200000,
+ -37206000000,
+ -21477600000,
+ -5756400000,
+ 9972000000,
+ 25693200000,
+ 41421600000,
+ 57747600000,
+ 73476000000,
+ 89197200000,
+ 104925600000,
+ 120646800000,
+ 136375200000,
+ 152096400000,
+ 167824800000,
+ 183546000000,
+ 199274400000,
+ 215600400000,
+ 230724000000,
+ 247050000000,
+ 262778400000,
+ 278499600000,
+ 294228000000,
+ 309949200000,
+ 325677600000,
+ 341398800000,
+ 357127200000,
+ 372848400000,
+ 388576800000,
+ 404902800000,
+ 420026400000,
+ 436352400000,
+ 452080800000,
+ 467802000000,
+ 483530400000,
+ 499251600000,
+ 514980000000,
+ 530701200000,
+ 544615200000,
+ 562150800000,
+ 576064800000,
+ 594205200000,
+ 607514400000,
+ 625654800000,
+ 638964000000,
+ 657104400000,
+ 671018400000,
+ 688554000000,
+ 702468000000,
+ 720003600000,
+ 733917600000,
+ 752058000000,
+ 765367200000,
+ 783507600000,
+ 796816800000,
+ 814957200000,
+ 828871200000,
+ 846406800000,
+ 860320800000,
+ 877856400000,
+ 891770400000,
+ 909306000000,
+ 923220000000,
+ 941360400000,
+ 954669600000,
+ 972810000000,
+ 986119200000,
+ 1004259600000,
+ 1018173600000,
+ 1035709200000,
+ 1049623200000,
+ 1067158800000,
+ 1081072800000,
+ 1099213200000,
+ 1112522400000,
+ 1130662800000,
+ 1143972000000,
+ 1162112400000,
+ 1173607200000,
+ 1194166800000,
+ 1205056800000,
+ 1225616400000,
+ 1236506400000,
+ 1257066000000,
+ 1268560800000,
+ 1289120400000,
+ 1300010400000,
+ 1320570000000,
+ 1331460000000,
+ 1352019600000,
+ 1362909600000,
+ 1383469200000,
+ 1394359200000,
+ 1414918800000,
+ 1425808800000,
+ 1446368400000,
+ 1457863200000,
+ 1478422800000,
+ 1489312800000,
+ 1509872400000,
+ 1520762400000,
+ 1541322000000,
+ 1552212000000,
+ 1572771600000,
+ 1583661600000,
+ 1604221200000,
+ 1615716000000,
+ 1636275600000,
+ 1647165600000,
+ 1667725200000,
+ 1678615200000,
+ 1699174800000,
+ 1710064800000,
+ 1730624400000,
+ 1741514400000,
+ 1762074000000,
+ 1772964000000,
+ 1793523600000,
+ 1805018400000,
+ 1825578000000,
+ 1836468000000,
+ 1857027600000,
+ 1867917600000,
+ 1888477200000,
+ 1899367200000,
+ 1919926800000,
+ 1930816800000,
+ 1951376400000,
+ 1962871200000,
+ 1983430800000,
+ 1994320800000,
+ 2014880400000,
+ 2025770400000,
+ 2046330000000,
+ 2057220000000,
+ 2077779600000,
+ 2088669600000,
+ 2109229200000,
+ 2120119200000,
+ 2140678800000,
+ null
+ ],
+ "offsets": [
+ 480,
+ 420,
+ 480,
+ 420,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480
+ ],
+ "population": 0
+ },
+ {
+ "name": "Canada/Saskatchewan",
+ "abbrs": [
+ "LMT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MWT",
+ "MPT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "CST"
+ ],
+ "untils": [
+ -2030202084000,
+ -1632063600000,
+ -1615132800000,
+ -1251651600000,
+ -1238349600000,
+ -1220202000000,
+ -1206900000000,
+ -1188752400000,
+ -1175450400000,
+ -1156698000000,
+ -1144000800000,
+ -1125248400000,
+ -1111946400000,
+ -1032714000000,
+ -1016992800000,
+ -1001264400000,
+ -986148000000,
+ -969814800000,
+ -954093600000,
+ -937760400000,
+ -922039200000,
+ -906310800000,
+ -890589600000,
+ -880210800000,
+ -769395600000,
+ -765388800000,
+ -748450800000,
+ -732729600000,
+ -715791600000,
+ -702489600000,
+ -684342000000,
+ -671040000000,
+ -652892400000,
+ -639590400000,
+ -620838000000,
+ -608140800000,
+ -589388400000,
+ -576086400000,
+ -557938800000,
+ -544636800000,
+ -526489200000,
+ -513187200000,
+ -495039600000,
+ -481737600000,
+ -463590000000,
+ -450288000000,
+ -431535600000,
+ -418233600000,
+ -400086000000,
+ -386784000000,
+ -337186800000,
+ -321465600000,
+ -305737200000,
+ null
+ ],
+ "offsets": [
+ 418.6,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360
+ ],
+ "population": 0
+ },
+ {
+ "name": "Canada/Yukon",
+ "abbrs": [
+ "YST",
+ "YDT",
+ "YST",
+ "YDT",
+ "YST",
+ "YWT",
+ "YPT",
+ "YST",
+ "YDDT",
+ "YST",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST"
+ ],
+ "untils": [
+ -1632056400000,
+ -1615125600000,
+ -1596978000000,
+ -1583164800000,
+ -880203600000,
+ -769395600000,
+ -765381600000,
+ -147884400000,
+ -131554800000,
+ -81961200000,
+ 325677600000,
+ 341398800000,
+ 357127200000,
+ 372848400000,
+ 388576800000,
+ 404902800000,
+ 420026400000,
+ 436352400000,
+ 452080800000,
+ 467802000000,
+ 483530400000,
+ 499251600000,
+ 514980000000,
+ 530701200000,
+ 544615200000,
+ 562150800000,
+ 576064800000,
+ 594205200000,
+ 607514400000,
+ 625654800000,
+ 638964000000,
+ 657104400000,
+ 671018400000,
+ 688554000000,
+ 702468000000,
+ 720003600000,
+ 733917600000,
+ 752058000000,
+ 765367200000,
+ 783507600000,
+ 796816800000,
+ 814957200000,
+ 828871200000,
+ 846406800000,
+ 860320800000,
+ 877856400000,
+ 891770400000,
+ 909306000000,
+ 923220000000,
+ 941360400000,
+ 954669600000,
+ 972810000000,
+ 986119200000,
+ 1004259600000,
+ 1018173600000,
+ 1035709200000,
+ 1049623200000,
+ 1067158800000,
+ 1081072800000,
+ 1099213200000,
+ 1112522400000,
+ 1130662800000,
+ 1143972000000,
+ 1162112400000,
+ 1173607200000,
+ 1194166800000,
+ 1205056800000,
+ 1225616400000,
+ 1236506400000,
+ 1257066000000,
+ 1268560800000,
+ 1289120400000,
+ 1300010400000,
+ 1320570000000,
+ 1331460000000,
+ 1352019600000,
+ 1362909600000,
+ 1383469200000,
+ 1394359200000,
+ 1414918800000,
+ 1425808800000,
+ 1446368400000,
+ 1457863200000,
+ 1478422800000,
+ 1489312800000,
+ 1509872400000,
+ 1520762400000,
+ 1541322000000,
+ 1552212000000,
+ 1572771600000,
+ 1583661600000,
+ 1604221200000,
+ 1615716000000,
+ 1636275600000,
+ 1647165600000,
+ 1667725200000,
+ 1678615200000,
+ 1699174800000,
+ 1710064800000,
+ 1730624400000,
+ 1741514400000,
+ 1762074000000,
+ 1772964000000,
+ 1793523600000,
+ 1805018400000,
+ 1825578000000,
+ 1836468000000,
+ 1857027600000,
+ 1867917600000,
+ 1888477200000,
+ 1899367200000,
+ 1919926800000,
+ 1930816800000,
+ 1951376400000,
+ 1962871200000,
+ 1983430800000,
+ 1994320800000,
+ 2014880400000,
+ 2025770400000,
+ 2046330000000,
+ 2057220000000,
+ 2077779600000,
+ 2088669600000,
+ 2109229200000,
+ 2120119200000,
+ 2140678800000,
+ null
+ ],
+ "offsets": [
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 480,
+ 540,
+ 420,
+ 540,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480
+ ],
+ "population": 0
+ },
+ {
+ "name": "CET",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1693706400000,
+ -1680483600000,
+ -1663455600000,
+ -1650150000000,
+ -1632006000000,
+ -1618700400000,
+ -938905200000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -781052400000,
+ -766623600000,
+ 228877200000,
+ 243997200000,
+ 260326800000,
+ 276051600000,
+ 291776400000,
+ 307501200000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Chile/Continental",
+ "abbrs": [
+ "SMT",
+ "-05",
+ "SMT",
+ "-04",
+ "SMT",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-05",
+ "-04",
+ "-03",
+ "-04",
+ "-05",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03",
+ "-04",
+ "-03"
+ ],
+ "untils": [
+ -1892661434000,
+ -1688410800000,
+ -1619205434000,
+ -1593806400000,
+ -1335986234000,
+ -1317585600000,
+ -1304362800000,
+ -1286049600000,
+ -1272826800000,
+ -1254513600000,
+ -1241290800000,
+ -1222977600000,
+ -1209754800000,
+ -1191355200000,
+ -1178132400000,
+ -870552000000,
+ -865278000000,
+ -740520000000,
+ -736376400000,
+ -718056000000,
+ -713649600000,
+ -36619200000,
+ -23922000000,
+ -3355200000,
+ 7527600000,
+ 24465600000,
+ 37767600000,
+ 55915200000,
+ 69217200000,
+ 87969600000,
+ 100666800000,
+ 118209600000,
+ 132116400000,
+ 150868800000,
+ 163566000000,
+ 182318400000,
+ 195620400000,
+ 213768000000,
+ 227070000000,
+ 245217600000,
+ 258519600000,
+ 277272000000,
+ 289969200000,
+ 308721600000,
+ 321418800000,
+ 340171200000,
+ 353473200000,
+ 371620800000,
+ 384922800000,
+ 403070400000,
+ 416372400000,
+ 434520000000,
+ 447822000000,
+ 466574400000,
+ 479271600000,
+ 498024000000,
+ 510721200000,
+ 529473600000,
+ 545194800000,
+ 560923200000,
+ 574225200000,
+ 592372800000,
+ 605674800000,
+ 624427200000,
+ 637124400000,
+ 653457600000,
+ 668574000000,
+ 687326400000,
+ 700628400000,
+ 718776000000,
+ 732078000000,
+ 750225600000,
+ 763527600000,
+ 781675200000,
+ 794977200000,
+ 813729600000,
+ 826426800000,
+ 845179200000,
+ 859690800000,
+ 876628800000,
+ 889930800000,
+ 906868800000,
+ 923194800000,
+ 939528000000,
+ 952830000000,
+ 971582400000,
+ 984279600000,
+ 1003032000000,
+ 1015729200000,
+ 1034481600000,
+ 1047178800000,
+ 1065931200000,
+ 1079233200000,
+ 1097380800000,
+ 1110682800000,
+ 1128830400000,
+ 1142132400000,
+ 1160884800000,
+ 1173582000000,
+ 1192334400000,
+ 1206846000000,
+ 1223784000000,
+ 1237086000000,
+ 1255233600000,
+ 1270350000000,
+ 1286683200000,
+ 1304823600000,
+ 1313899200000,
+ 1335668400000,
+ 1346558400000,
+ 1367118000000,
+ 1378612800000,
+ 1398567600000,
+ 1410062400000,
+ 1463281200000,
+ 1471147200000,
+ 1494730800000,
+ 1502596800000,
+ 1526180400000,
+ 1534046400000,
+ 1557630000000,
+ 1565496000000,
+ 1589079600000,
+ 1596945600000,
+ 1620529200000,
+ 1629000000000,
+ 1652583600000,
+ 1660449600000,
+ 1684033200000,
+ 1691899200000,
+ 1715482800000,
+ 1723348800000,
+ 1746932400000,
+ 1754798400000,
+ 1778382000000,
+ 1786248000000,
+ 1809831600000,
+ 1818302400000,
+ 1841886000000,
+ 1849752000000,
+ 1873335600000,
+ 1881201600000,
+ 1904785200000,
+ 1912651200000,
+ 1936234800000,
+ 1944100800000,
+ 1967684400000,
+ 1976155200000,
+ 1999738800000,
+ 2007604800000,
+ 2031188400000,
+ 2039054400000,
+ 2062638000000,
+ 2070504000000,
+ 2094087600000,
+ 2101953600000,
+ 2125537200000,
+ 2133403200000,
+ null
+ ],
+ "offsets": [
+ 282.7667,
+ 300,
+ 282.7667,
+ 240,
+ 282.7667,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 180,
+ 240,
+ 300,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180,
+ 240,
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "Chile/EasterIsland",
+ "abbrs": [
+ "EMT",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05"
+ ],
+ "untils": [
+ -1178124152000,
+ -36619200000,
+ -23922000000,
+ -3355200000,
+ 7527600000,
+ 24465600000,
+ 37767600000,
+ 55915200000,
+ 69217200000,
+ 87969600000,
+ 100666800000,
+ 118209600000,
+ 132116400000,
+ 150868800000,
+ 163566000000,
+ 182318400000,
+ 195620400000,
+ 213768000000,
+ 227070000000,
+ 245217600000,
+ 258519600000,
+ 277272000000,
+ 289969200000,
+ 308721600000,
+ 321418800000,
+ 340171200000,
+ 353473200000,
+ 371620800000,
+ 403070400000,
+ 416372400000,
+ 434520000000,
+ 447822000000,
+ 466574400000,
+ 479271600000,
+ 498024000000,
+ 510721200000,
+ 529473600000,
+ 545194800000,
+ 560923200000,
+ 574225200000,
+ 592372800000,
+ 605674800000,
+ 624427200000,
+ 637124400000,
+ 653457600000,
+ 668574000000,
+ 687326400000,
+ 700628400000,
+ 718776000000,
+ 732078000000,
+ 750225600000,
+ 763527600000,
+ 781675200000,
+ 794977200000,
+ 813729600000,
+ 826426800000,
+ 845179200000,
+ 859690800000,
+ 876628800000,
+ 889930800000,
+ 906868800000,
+ 923194800000,
+ 939528000000,
+ 952830000000,
+ 971582400000,
+ 984279600000,
+ 1003032000000,
+ 1015729200000,
+ 1034481600000,
+ 1047178800000,
+ 1065931200000,
+ 1079233200000,
+ 1097380800000,
+ 1110682800000,
+ 1128830400000,
+ 1142132400000,
+ 1160884800000,
+ 1173582000000,
+ 1192334400000,
+ 1206846000000,
+ 1223784000000,
+ 1237086000000,
+ 1255233600000,
+ 1270350000000,
+ 1286683200000,
+ 1304823600000,
+ 1313899200000,
+ 1335668400000,
+ 1346558400000,
+ 1367118000000,
+ 1378612800000,
+ 1398567600000,
+ 1410062400000,
+ 1463281200000,
+ 1471147200000,
+ 1494730800000,
+ 1502596800000,
+ 1526180400000,
+ 1534046400000,
+ 1557630000000,
+ 1565496000000,
+ 1589079600000,
+ 1596945600000,
+ 1620529200000,
+ 1629000000000,
+ 1652583600000,
+ 1660449600000,
+ 1684033200000,
+ 1691899200000,
+ 1715482800000,
+ 1723348800000,
+ 1746932400000,
+ 1754798400000,
+ 1778382000000,
+ 1786248000000,
+ 1809831600000,
+ 1818302400000,
+ 1841886000000,
+ 1849752000000,
+ 1873335600000,
+ 1881201600000,
+ 1904785200000,
+ 1912651200000,
+ 1936234800000,
+ 1944100800000,
+ 1967684400000,
+ 1976155200000,
+ 1999738800000,
+ 2007604800000,
+ 2031188400000,
+ 2039054400000,
+ 2062638000000,
+ 2070504000000,
+ 2094087600000,
+ 2101953600000,
+ 2125537200000,
+ 2133403200000,
+ null
+ ],
+ "offsets": [
+ 437.4667,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "CST6CDT",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1633276800000,
+ -1615136400000,
+ -1601827200000,
+ -1583686800000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -84384000000,
+ -68662800000,
+ -52934400000,
+ -37213200000,
+ -21484800000,
+ -5763600000,
+ 9964800000,
+ 25686000000,
+ 41414400000,
+ 57740400000,
+ 73468800000,
+ 89190000000,
+ 104918400000,
+ 120639600000,
+ 126691200000,
+ 152089200000,
+ 162374400000,
+ 183538800000,
+ 199267200000,
+ 215593200000,
+ 230716800000,
+ 247042800000,
+ 262771200000,
+ 278492400000,
+ 294220800000,
+ 309942000000,
+ 325670400000,
+ 341391600000,
+ 357120000000,
+ 372841200000,
+ 388569600000,
+ 404895600000,
+ 420019200000,
+ 436345200000,
+ 452073600000,
+ 467794800000,
+ 483523200000,
+ 499244400000,
+ 514972800000,
+ 530694000000,
+ 544608000000,
+ 562143600000,
+ 576057600000,
+ 594198000000,
+ 607507200000,
+ 625647600000,
+ 638956800000,
+ 657097200000,
+ 671011200000,
+ 688546800000,
+ 702460800000,
+ 719996400000,
+ 733910400000,
+ 752050800000,
+ 765360000000,
+ 783500400000,
+ 796809600000,
+ 814950000000,
+ 828864000000,
+ 846399600000,
+ 860313600000,
+ 877849200000,
+ 891763200000,
+ 909298800000,
+ 923212800000,
+ 941353200000,
+ 954662400000,
+ 972802800000,
+ 986112000000,
+ 1004252400000,
+ 1018166400000,
+ 1035702000000,
+ 1049616000000,
+ 1067151600000,
+ 1081065600000,
+ 1099206000000,
+ 1112515200000,
+ 1130655600000,
+ 1143964800000,
+ 1162105200000,
+ 1173600000000,
+ 1194159600000,
+ 1205049600000,
+ 1225609200000,
+ 1236499200000,
+ 1257058800000,
+ 1268553600000,
+ 1289113200000,
+ 1300003200000,
+ 1320562800000,
+ 1331452800000,
+ 1352012400000,
+ 1362902400000,
+ 1383462000000,
+ 1394352000000,
+ 1414911600000,
+ 1425801600000,
+ 1446361200000,
+ 1457856000000,
+ 1478415600000,
+ 1489305600000,
+ 1509865200000,
+ 1520755200000,
+ 1541314800000,
+ 1552204800000,
+ 1572764400000,
+ 1583654400000,
+ 1604214000000,
+ 1615708800000,
+ 1636268400000,
+ 1647158400000,
+ 1667718000000,
+ 1678608000000,
+ 1699167600000,
+ 1710057600000,
+ 1730617200000,
+ 1741507200000,
+ 1762066800000,
+ 1772956800000,
+ 1793516400000,
+ 1805011200000,
+ 1825570800000,
+ 1836460800000,
+ 1857020400000,
+ 1867910400000,
+ 1888470000000,
+ 1899360000000,
+ 1919919600000,
+ 1930809600000,
+ 1951369200000,
+ 1962864000000,
+ 1983423600000,
+ 1994313600000,
+ 2014873200000,
+ 2025763200000,
+ 2046322800000,
+ 2057212800000,
+ 2077772400000,
+ 2088662400000,
+ 2109222000000,
+ 2120112000000,
+ 2140671600000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 0
+ },
+ {
+ "name": "Cuba",
+ "abbrs": [
+ "HMT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1402813824000,
+ -1311534000000,
+ -1300996800000,
+ -933534000000,
+ -925675200000,
+ -902084400000,
+ -893620800000,
+ -870030000000,
+ -862171200000,
+ -775681200000,
+ -767822400000,
+ -744231600000,
+ -736372800000,
+ -144702000000,
+ -134251200000,
+ -113425200000,
+ -102542400000,
+ -86295600000,
+ -72907200000,
+ -54154800000,
+ -41457600000,
+ -21495600000,
+ -5774400000,
+ 9954000000,
+ 25675200000,
+ 41403600000,
+ 57729600000,
+ 73458000000,
+ 87364800000,
+ 104907600000,
+ 118900800000,
+ 136357200000,
+ 150436800000,
+ 167806800000,
+ 183528000000,
+ 199256400000,
+ 215582400000,
+ 230706000000,
+ 247032000000,
+ 263365200000,
+ 276667200000,
+ 290581200000,
+ 308721600000,
+ 322030800000,
+ 340171200000,
+ 358318800000,
+ 371620800000,
+ 389768400000,
+ 403070400000,
+ 421218000000,
+ 434520000000,
+ 452667600000,
+ 466574400000,
+ 484117200000,
+ 498024000000,
+ 511333200000,
+ 529473600000,
+ 542782800000,
+ 560923200000,
+ 574837200000,
+ 592372800000,
+ 606286800000,
+ 623822400000,
+ 638946000000,
+ 655876800000,
+ 671000400000,
+ 687330000000,
+ 702450000000,
+ 718779600000,
+ 733899600000,
+ 750229200000,
+ 765349200000,
+ 781678800000,
+ 796798800000,
+ 813128400000,
+ 828853200000,
+ 844578000000,
+ 860302800000,
+ 876632400000,
+ 891147600000,
+ 909291600000,
+ 922597200000,
+ 941346000000,
+ 954651600000,
+ 972795600000,
+ 986101200000,
+ 1004245200000,
+ 1018155600000,
+ 1035694800000,
+ 1049605200000,
+ 1067144400000,
+ 1080450000000,
+ 1162098000000,
+ 1173589200000,
+ 1193547600000,
+ 1205643600000,
+ 1224997200000,
+ 1236488400000,
+ 1256446800000,
+ 1268542800000,
+ 1288501200000,
+ 1300597200000,
+ 1321160400000,
+ 1333256400000,
+ 1352005200000,
+ 1362891600000,
+ 1383454800000,
+ 1394341200000,
+ 1414904400000,
+ 1425790800000,
+ 1446354000000,
+ 1457845200000,
+ 1478408400000,
+ 1489294800000,
+ 1509858000000,
+ 1520744400000,
+ 1541307600000,
+ 1552194000000,
+ 1572757200000,
+ 1583643600000,
+ 1604206800000,
+ 1615698000000,
+ 1636261200000,
+ 1647147600000,
+ 1667710800000,
+ 1678597200000,
+ 1699160400000,
+ 1710046800000,
+ 1730610000000,
+ 1741496400000,
+ 1762059600000,
+ 1772946000000,
+ 1793509200000,
+ 1805000400000,
+ 1825563600000,
+ 1836450000000,
+ 1857013200000,
+ 1867899600000,
+ 1888462800000,
+ 1899349200000,
+ 1919912400000,
+ 1930798800000,
+ 1951362000000,
+ 1962853200000,
+ 1983416400000,
+ 1994302800000,
+ 2014866000000,
+ 2025752400000,
+ 2046315600000,
+ 2057202000000,
+ 2077765200000,
+ 2088651600000,
+ 2109214800000,
+ 2120101200000,
+ 2140664400000,
+ null
+ ],
+ "offsets": [
+ 329.6,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "EET",
+ "abbrs": [
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ 228877200000,
+ 243997200000,
+ 260326800000,
+ 276051600000,
+ 291776400000,
+ 307501200000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Egypt",
+ "abbrs": [
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -929844000000,
+ -923108400000,
+ -906170400000,
+ -892868400000,
+ -875844000000,
+ -857790000000,
+ -844308000000,
+ -825822000000,
+ -812685600000,
+ -794199600000,
+ -779853600000,
+ -762663600000,
+ -399088800000,
+ -386650800000,
+ -368330400000,
+ -355114800000,
+ -336790800000,
+ -323654400000,
+ -305168400000,
+ -292032000000,
+ -273632400000,
+ -260496000000,
+ -242096400000,
+ -228960000000,
+ -210560400000,
+ -197424000000,
+ -178938000000,
+ -165801600000,
+ -147402000000,
+ -134265600000,
+ -115866000000,
+ -102643200000,
+ -84330000000,
+ -71107200000,
+ -52707600000,
+ -39484800000,
+ -21171600000,
+ -7948800000,
+ 10364400000,
+ 23587200000,
+ 41900400000,
+ 55123200000,
+ 73522800000,
+ 86745600000,
+ 105058800000,
+ 118281600000,
+ 136594800000,
+ 149817600000,
+ 168130800000,
+ 181353600000,
+ 199753200000,
+ 212976000000,
+ 231289200000,
+ 244512000000,
+ 262825200000,
+ 276048000000,
+ 294361200000,
+ 307584000000,
+ 325983600000,
+ 339206400000,
+ 357519600000,
+ 370742400000,
+ 396399600000,
+ 402278400000,
+ 426812400000,
+ 433814400000,
+ 452214000000,
+ 465436800000,
+ 483750000000,
+ 496972800000,
+ 515286000000,
+ 528508800000,
+ 546822000000,
+ 560044800000,
+ 578444400000,
+ 591667200000,
+ 610412400000,
+ 623203200000,
+ 641516400000,
+ 654739200000,
+ 673052400000,
+ 686275200000,
+ 704674800000,
+ 717897600000,
+ 736210800000,
+ 749433600000,
+ 767746800000,
+ 780969600000,
+ 799020000000,
+ 812322000000,
+ 830469600000,
+ 843771600000,
+ 861919200000,
+ 875221200000,
+ 893368800000,
+ 906670800000,
+ 925423200000,
+ 938725200000,
+ 956872800000,
+ 970174800000,
+ 988322400000,
+ 1001624400000,
+ 1019772000000,
+ 1033074000000,
+ 1051221600000,
+ 1064523600000,
+ 1083276000000,
+ 1096578000000,
+ 1114725600000,
+ 1128027600000,
+ 1146175200000,
+ 1158872400000,
+ 1177624800000,
+ 1189112400000,
+ 1209074400000,
+ 1219957200000,
+ 1240524000000,
+ 1250802000000,
+ 1272578400000,
+ 1281474000000,
+ 1284069600000,
+ 1285880400000,
+ 1400191200000,
+ 1403816400000,
+ 1406844000000,
+ 1411678800000,
+ null
+ ],
+ "offsets": [
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Eire",
+ "abbrs": [
+ "DMT",
+ "IST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT"
+ ],
+ "untils": [
+ -1691962479000,
+ -1680471279000,
+ -1664143200000,
+ -1650146400000,
+ -1633903200000,
+ -1617487200000,
+ -1601848800000,
+ -1586037600000,
+ -1570399200000,
+ -1552168800000,
+ -1538344800000,
+ -1522533600000,
+ -1507500000000,
+ -1490565600000,
+ -1473631200000,
+ -1460930400000,
+ -1442786400000,
+ -1428876000000,
+ -1410732000000,
+ -1396216800000,
+ -1379282400000,
+ -1364767200000,
+ -1348437600000,
+ -1333317600000,
+ -1315778400000,
+ -1301263200000,
+ -1284328800000,
+ -1269813600000,
+ -1253484000000,
+ -1238364000000,
+ -1221429600000,
+ -1206914400000,
+ -1189980000000,
+ -1175464800000,
+ -1159135200000,
+ -1143410400000,
+ -1126476000000,
+ -1111960800000,
+ -1095631200000,
+ -1080511200000,
+ -1063576800000,
+ -1049061600000,
+ -1032127200000,
+ -1017612000000,
+ -1001282400000,
+ -986162400000,
+ -969228000000,
+ -950479200000,
+ -942012000000,
+ -733356000000,
+ -719445600000,
+ -699487200000,
+ -684972000000,
+ -668037600000,
+ -654732000000,
+ -636588000000,
+ -622072800000,
+ -605743200000,
+ -590623200000,
+ -574293600000,
+ -558568800000,
+ -542239200000,
+ -527119200000,
+ -512604000000,
+ -496274400000,
+ -481154400000,
+ -464220000000,
+ -449704800000,
+ -432165600000,
+ -417650400000,
+ -401320800000,
+ -386200800000,
+ -369266400000,
+ -354751200000,
+ -337816800000,
+ -323301600000,
+ -306972000000,
+ -291852000000,
+ -276732000000,
+ -257983200000,
+ -245282400000,
+ -226533600000,
+ -213228000000,
+ -195084000000,
+ -182383200000,
+ -163634400000,
+ -150933600000,
+ -132184800000,
+ -119484000000,
+ -100735200000,
+ -88034400000,
+ -68680800000,
+ -59004000000,
+ 57722400000,
+ 69818400000,
+ 89172000000,
+ 101268000000,
+ 120621600000,
+ 132717600000,
+ 152071200000,
+ 164167200000,
+ 183520800000,
+ 196221600000,
+ 214970400000,
+ 227671200000,
+ 246420000000,
+ 259120800000,
+ 278474400000,
+ 290570400000,
+ 309924000000,
+ 322020000000,
+ 341373600000,
+ 354675600000,
+ 372819600000,
+ 386125200000,
+ 404269200000,
+ 417574800000,
+ 435718800000,
+ 449024400000,
+ 467773200000,
+ 481078800000,
+ 499222800000,
+ 512528400000,
+ 530672400000,
+ 543978000000,
+ 562122000000,
+ 575427600000,
+ 593571600000,
+ 606877200000,
+ 625626000000,
+ 638326800000,
+ 657075600000,
+ 670381200000,
+ 688525200000,
+ 701830800000,
+ 719974800000,
+ 733280400000,
+ 751424400000,
+ 764730000000,
+ 782874000000,
+ 796179600000,
+ 814323600000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 25.35,
+ -34.65,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "EST",
+ "abbrs": [
+ "EST"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "EST5EDT",
+ "abbrs": [
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EWT",
+ "EPT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1633280400000,
+ -1615140000000,
+ -1601830800000,
+ -1583690400000,
+ -880218000000,
+ -769395600000,
+ -765396000000,
+ -84387600000,
+ -68666400000,
+ -52938000000,
+ -37216800000,
+ -21488400000,
+ -5767200000,
+ 9961200000,
+ 25682400000,
+ 41410800000,
+ 57736800000,
+ 73465200000,
+ 89186400000,
+ 104914800000,
+ 120636000000,
+ 126687600000,
+ 152085600000,
+ 162370800000,
+ 183535200000,
+ 199263600000,
+ 215589600000,
+ 230713200000,
+ 247039200000,
+ 262767600000,
+ 278488800000,
+ 294217200000,
+ 309938400000,
+ 325666800000,
+ 341388000000,
+ 357116400000,
+ 372837600000,
+ 388566000000,
+ 404892000000,
+ 420015600000,
+ 436341600000,
+ 452070000000,
+ 467791200000,
+ 483519600000,
+ 499240800000,
+ 514969200000,
+ 530690400000,
+ 544604400000,
+ 562140000000,
+ 576054000000,
+ 594194400000,
+ 607503600000,
+ 625644000000,
+ 638953200000,
+ 657093600000,
+ 671007600000,
+ 688543200000,
+ 702457200000,
+ 719992800000,
+ 733906800000,
+ 752047200000,
+ 765356400000,
+ 783496800000,
+ 796806000000,
+ 814946400000,
+ 828860400000,
+ 846396000000,
+ 860310000000,
+ 877845600000,
+ 891759600000,
+ 909295200000,
+ 923209200000,
+ 941349600000,
+ 954658800000,
+ 972799200000,
+ 986108400000,
+ 1004248800000,
+ 1018162800000,
+ 1035698400000,
+ 1049612400000,
+ 1067148000000,
+ 1081062000000,
+ 1099202400000,
+ 1112511600000,
+ 1130652000000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT-0",
+ "abbrs": [
+ "GMT"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT-1",
+ "abbrs": [
+ "+01"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT-10",
+ "abbrs": [
+ "+10"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -600
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT-11",
+ "abbrs": [
+ "+11"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -660
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT-12",
+ "abbrs": [
+ "+12"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -720
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT-13",
+ "abbrs": [
+ "+13"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -780
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT-14",
+ "abbrs": [
+ "+14"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -840
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT-2",
+ "abbrs": [
+ "+02"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT-3",
+ "abbrs": [
+ "+03"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -180
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT-4",
+ "abbrs": [
+ "+04"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -240
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT-5",
+ "abbrs": [
+ "+05"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -300
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT-6",
+ "abbrs": [
+ "+06"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -360
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT-7",
+ "abbrs": [
+ "+07"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -420
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT-8",
+ "abbrs": [
+ "+08"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -480
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT-9",
+ "abbrs": [
+ "+09"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -540
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT",
+ "abbrs": [
+ "GMT"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT+0",
+ "abbrs": [
+ "GMT"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT+1",
+ "abbrs": [
+ "-01"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT+10",
+ "abbrs": [
+ "-10"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 600
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT+11",
+ "abbrs": [
+ "-11"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 660
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT+12",
+ "abbrs": [
+ "-12"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 720
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT+2",
+ "abbrs": [
+ "-02"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT+3",
+ "abbrs": [
+ "-03"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 180
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT+4",
+ "abbrs": [
+ "-04"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 240
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT+5",
+ "abbrs": [
+ "-05"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT+6",
+ "abbrs": [
+ "-06"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 360
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT+7",
+ "abbrs": [
+ "-07"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 420
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT+8",
+ "abbrs": [
+ "-08"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 480
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT+9",
+ "abbrs": [
+ "-09"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 540
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/GMT0",
+ "abbrs": [
+ "GMT"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/Greenwich",
+ "abbrs": [
+ "GMT"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/UCT",
+ "abbrs": [
+ "UCT"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/Universal",
+ "abbrs": [
+ "UTC"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/UTC",
+ "abbrs": [
+ "UTC"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Etc/Zulu",
+ "abbrs": [
+ "UTC"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/Amsterdam",
+ "abbrs": [
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "AMT",
+ "NST",
+ "+0120",
+ "+0020",
+ "+0120",
+ "+0020",
+ "+0120",
+ "+0020",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1693700372000,
+ -1680484772000,
+ -1663453172000,
+ -1650147572000,
+ -1633213172000,
+ -1617488372000,
+ -1601158772000,
+ -1586038772000,
+ -1569709172000,
+ -1554589172000,
+ -1538259572000,
+ -1523139572000,
+ -1507501172000,
+ -1490566772000,
+ -1470176372000,
+ -1459117172000,
+ -1443997172000,
+ -1427667572000,
+ -1406672372000,
+ -1396217972000,
+ -1376950772000,
+ -1364768372000,
+ -1345414772000,
+ -1333318772000,
+ -1313792372000,
+ -1301264372000,
+ -1282256372000,
+ -1269814772000,
+ -1250720372000,
+ -1238365172000,
+ -1219184372000,
+ -1206915572000,
+ -1186957172000,
+ -1175465972000,
+ -1156025972000,
+ -1143411572000,
+ -1124489972000,
+ -1111961972000,
+ -1092953972000,
+ -1080512372000,
+ -1061331572000,
+ -1049062772000,
+ -1029190772000,
+ -1025745572000,
+ -1017613200000,
+ -998259600000,
+ -986163600000,
+ -966723600000,
+ -954109200000,
+ -935022000000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -781052400000,
+ -766623600000,
+ 228877200000,
+ 243997200000,
+ 260326800000,
+ 276051600000,
+ 291776400000,
+ 307501200000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -19.5333,
+ -79.5333,
+ -80,
+ -20,
+ -80,
+ -20,
+ -80,
+ -20,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 1624000
+ },
+ {
+ "name": "Europe/Andorra",
+ "abbrs": [
+ "WET",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -733881600000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 0,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 79218
+ },
+ {
+ "name": "Europe/Astrakhan",
+ "abbrs": [
+ "LMT",
+ "+03",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04"
+ ],
+ "untils": [
+ -1441249932000,
+ -1247540400000,
+ 354916800000,
+ 370724400000,
+ 386452800000,
+ 402260400000,
+ 417988800000,
+ 433796400000,
+ 449611200000,
+ 465343200000,
+ 481068000000,
+ 496792800000,
+ 512517600000,
+ 528242400000,
+ 543967200000,
+ 559692000000,
+ 575416800000,
+ 591141600000,
+ 622594800000,
+ 638319600000,
+ 654649200000,
+ 670374000000,
+ 717548400000,
+ 733273200000,
+ 748998000000,
+ 764722800000,
+ 780447600000,
+ 796172400000,
+ 811897200000,
+ 828226800000,
+ 846370800000,
+ 859676400000,
+ 877820400000,
+ 891126000000,
+ 909270000000,
+ 922575600000,
+ 941324400000,
+ 954025200000,
+ 972774000000,
+ 985474800000,
+ 1004223600000,
+ 1017529200000,
+ 1035673200000,
+ 1048978800000,
+ 1067122800000,
+ 1080428400000,
+ 1099177200000,
+ 1111878000000,
+ 1130626800000,
+ 1143327600000,
+ 1162076400000,
+ 1174777200000,
+ 1193526000000,
+ 1206831600000,
+ 1224975600000,
+ 1238281200000,
+ 1256425200000,
+ 1269730800000,
+ 1288479600000,
+ 1301180400000,
+ 1414274400000,
+ 1459033200000,
+ null
+ ],
+ "offsets": [
+ -192.2,
+ -180,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/Athens",
+ "abbrs": [
+ "AMT",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -1686101632000,
+ -1182996000000,
+ -1178161200000,
+ -906861600000,
+ -904878000000,
+ -857257200000,
+ -844477200000,
+ -828237600000,
+ -812422800000,
+ -552362400000,
+ -541652400000,
+ 166485600000,
+ 186184800000,
+ 198028800000,
+ 213753600000,
+ 228873600000,
+ 244080000000,
+ 260323200000,
+ 275446800000,
+ 291798000000,
+ 307407600000,
+ 323388000000,
+ 338936400000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -94.8667,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 3484000
+ },
+ {
+ "name": "Europe/Belfast",
+ "abbrs": [
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "BDST",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT"
+ ],
+ "untils": [
+ -1691964000000,
+ -1680472800000,
+ -1664143200000,
+ -1650146400000,
+ -1633903200000,
+ -1617487200000,
+ -1601848800000,
+ -1586037600000,
+ -1570399200000,
+ -1552168800000,
+ -1538344800000,
+ -1522533600000,
+ -1507500000000,
+ -1490565600000,
+ -1473631200000,
+ -1460930400000,
+ -1442786400000,
+ -1428876000000,
+ -1410732000000,
+ -1396216800000,
+ -1379282400000,
+ -1364767200000,
+ -1348437600000,
+ -1333317600000,
+ -1315778400000,
+ -1301263200000,
+ -1284328800000,
+ -1269813600000,
+ -1253484000000,
+ -1238364000000,
+ -1221429600000,
+ -1206914400000,
+ -1189980000000,
+ -1175464800000,
+ -1159135200000,
+ -1143410400000,
+ -1126476000000,
+ -1111960800000,
+ -1095631200000,
+ -1080511200000,
+ -1063576800000,
+ -1049061600000,
+ -1032127200000,
+ -1017612000000,
+ -1001282400000,
+ -986162400000,
+ -969228000000,
+ -950479200000,
+ -942012000000,
+ -904518000000,
+ -896050800000,
+ -875487600000,
+ -864601200000,
+ -844038000000,
+ -832546800000,
+ -812588400000,
+ -798073200000,
+ -781052400000,
+ -772066800000,
+ -764805600000,
+ -748476000000,
+ -733356000000,
+ -719445600000,
+ -717030000000,
+ -706748400000,
+ -699487200000,
+ -687996000000,
+ -668037600000,
+ -654732000000,
+ -636588000000,
+ -622072800000,
+ -605743200000,
+ -590623200000,
+ -574293600000,
+ -558568800000,
+ -542239200000,
+ -527119200000,
+ -512604000000,
+ -496274400000,
+ -481154400000,
+ -464220000000,
+ -449704800000,
+ -432165600000,
+ -417650400000,
+ -401320800000,
+ -386200800000,
+ -369266400000,
+ -354751200000,
+ -337816800000,
+ -323301600000,
+ -306972000000,
+ -291852000000,
+ -276732000000,
+ -257983200000,
+ -245282400000,
+ -226533600000,
+ -213228000000,
+ -195084000000,
+ -182383200000,
+ -163634400000,
+ -150933600000,
+ -132184800000,
+ -119484000000,
+ -100735200000,
+ -88034400000,
+ -68680800000,
+ -59004000000,
+ 57722400000,
+ 69818400000,
+ 89172000000,
+ 101268000000,
+ 120621600000,
+ 132717600000,
+ 152071200000,
+ 164167200000,
+ 183520800000,
+ 196221600000,
+ 214970400000,
+ 227671200000,
+ 246420000000,
+ 259120800000,
+ 278474400000,
+ 290570400000,
+ 309924000000,
+ 322020000000,
+ 341373600000,
+ 354675600000,
+ 372819600000,
+ 386125200000,
+ 404269200000,
+ 417574800000,
+ 435718800000,
+ 449024400000,
+ 467773200000,
+ 481078800000,
+ 499222800000,
+ 512528400000,
+ 530672400000,
+ 543978000000,
+ 562122000000,
+ 575427600000,
+ 593571600000,
+ 606877200000,
+ 625626000000,
+ 638326800000,
+ 657075600000,
+ 670381200000,
+ 688525200000,
+ 701830800000,
+ 719974800000,
+ 733280400000,
+ 751424400000,
+ 764730000000,
+ 782874000000,
+ 796179600000,
+ 814323600000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/Belgrade",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -905824800000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -777942000000,
+ -766623600000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 1180000
+ },
+ {
+ "name": "Europe/Berlin",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CEMT",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CEMT",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1693706400000,
+ -1680483600000,
+ -1663455600000,
+ -1650150000000,
+ -1632006000000,
+ -1618700400000,
+ -938905200000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -781052400000,
+ -776563200000,
+ -765936000000,
+ -761180400000,
+ -748479600000,
+ -733273200000,
+ -717631200000,
+ -714610800000,
+ -710380800000,
+ -701910000000,
+ -684975600000,
+ -670460400000,
+ -654130800000,
+ -639010800000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -180,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -180,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 4069000
+ },
+ {
+ "name": "Europe/Bratislava",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "GMT",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1693706400000,
+ -1680483600000,
+ -1663455600000,
+ -1650150000000,
+ -1632006000000,
+ -1618700400000,
+ -938905200000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -781052400000,
+ -765327600000,
+ -746578800000,
+ -733359600000,
+ -728517600000,
+ -721260000000,
+ -716425200000,
+ -701910000000,
+ -684975600000,
+ -670460400000,
+ -654217200000,
+ -639010800000,
+ 291776400000,
+ 307501200000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/Brussels",
+ "abbrs": [
+ "WET",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1740355200000,
+ -1693702800000,
+ -1680483600000,
+ -1663455600000,
+ -1650150000000,
+ -1632006000000,
+ -1618700400000,
+ -1613826000000,
+ -1604278800000,
+ -1585530000000,
+ -1574038800000,
+ -1552266000000,
+ -1539997200000,
+ -1520557200000,
+ -1507510800000,
+ -1490576400000,
+ -1473642000000,
+ -1459126800000,
+ -1444006800000,
+ -1427677200000,
+ -1411952400000,
+ -1396227600000,
+ -1379293200000,
+ -1364778000000,
+ -1348448400000,
+ -1333328400000,
+ -1316394000000,
+ -1301263200000,
+ -1284328800000,
+ -1269813600000,
+ -1253484000000,
+ -1238364000000,
+ -1221429600000,
+ -1206914400000,
+ -1191189600000,
+ -1175464800000,
+ -1160344800000,
+ -1143410400000,
+ -1127685600000,
+ -1111960800000,
+ -1096840800000,
+ -1080511200000,
+ -1063576800000,
+ -1049061600000,
+ -1033336800000,
+ -1017612000000,
+ -1002492000000,
+ -986162400000,
+ -969228000000,
+ -950479200000,
+ -942012000000,
+ -934668000000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -798073200000,
+ -781052400000,
+ -766623600000,
+ -745455600000,
+ -733273200000,
+ 228877200000,
+ 243997200000,
+ 260326800000,
+ 276051600000,
+ 291776400000,
+ 307501200000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 0,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 2089000
+ },
+ {
+ "name": "Europe/Bucharest",
+ "abbrs": [
+ "BMT",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -1213148664000,
+ -1187056800000,
+ -1175479200000,
+ -1159754400000,
+ -1144029600000,
+ -1127700000000,
+ -1111975200000,
+ -1096250400000,
+ -1080525600000,
+ -1064800800000,
+ -1049076000000,
+ -1033351200000,
+ -1017626400000,
+ -1001901600000,
+ -986176800000,
+ -970452000000,
+ -954727200000,
+ 296604000000,
+ 307486800000,
+ 323816400000,
+ 338940000000,
+ 354672000000,
+ 370396800000,
+ 386121600000,
+ 401846400000,
+ 417571200000,
+ 433296000000,
+ 449020800000,
+ 465350400000,
+ 481075200000,
+ 496800000000,
+ 512524800000,
+ 528249600000,
+ 543974400000,
+ 559699200000,
+ 575424000000,
+ 591148800000,
+ 606873600000,
+ 622598400000,
+ 638323200000,
+ 654652800000,
+ 670370400000,
+ 686095200000,
+ 701820000000,
+ 717544800000,
+ 733269600000,
+ 748994400000,
+ 764719200000,
+ 780440400000,
+ 796168800000,
+ 811890000000,
+ 828223200000,
+ 846363600000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -104.4,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 1860000
+ },
+ {
+ "name": "Europe/Budapest",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1693706400000,
+ -1680483600000,
+ -1663455600000,
+ -1650150000000,
+ -1633212000000,
+ -1618700400000,
+ -1600466400000,
+ -1581202800000,
+ -906771600000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -778471200000,
+ -762660000000,
+ -749689200000,
+ -733359600000,
+ -717634800000,
+ -701910000000,
+ -686185200000,
+ -670460400000,
+ -654130800000,
+ -639010800000,
+ -621990000000,
+ -605660400000,
+ -492656400000,
+ -481168800000,
+ -461120400000,
+ -449632800000,
+ -428547600000,
+ -418269600000,
+ -397094400000,
+ -386809200000,
+ 323827200000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 1710000
+ },
+ {
+ "name": "Europe/Busingen",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -904435200000,
+ -891129600000,
+ -872985600000,
+ -859680000000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/Chisinau",
+ "abbrs": [
+ "CMT",
+ "BMT",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -1637114100000,
+ -1213148664000,
+ -1187056800000,
+ -1175479200000,
+ -1159754400000,
+ -1144029600000,
+ -1127700000000,
+ -1111975200000,
+ -1096250400000,
+ -1080525600000,
+ -1064800800000,
+ -1049076000000,
+ -1033351200000,
+ -1017626400000,
+ -1001901600000,
+ -986176800000,
+ -970452000000,
+ -954727200000,
+ -927165600000,
+ -898138800000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -800157600000,
+ 354920400000,
+ 370728000000,
+ 386456400000,
+ 402264000000,
+ 417992400000,
+ 433800000000,
+ 449614800000,
+ 465346800000,
+ 481071600000,
+ 496796400000,
+ 512521200000,
+ 528246000000,
+ 543970800000,
+ 559695600000,
+ 575420400000,
+ 591145200000,
+ 606870000000,
+ 622594800000,
+ 638319600000,
+ 641944800000,
+ 654652800000,
+ 670377600000,
+ 686102400000,
+ 701820000000,
+ 717541200000,
+ 733269600000,
+ 748990800000,
+ 764719200000,
+ 780440400000,
+ 796168800000,
+ 811890000000,
+ 828223200000,
+ 846363600000,
+ 859680000000,
+ 877824000000,
+ 891129600000,
+ 909273600000,
+ 922579200000,
+ 941328000000,
+ 954028800000,
+ 972777600000,
+ 985478400000,
+ 1004227200000,
+ 1017532800000,
+ 1035676800000,
+ 1048982400000,
+ 1067126400000,
+ 1080432000000,
+ 1099180800000,
+ 1111881600000,
+ 1130630400000,
+ 1143331200000,
+ 1162080000000,
+ 1174780800000,
+ 1193529600000,
+ 1206835200000,
+ 1224979200000,
+ 1238284800000,
+ 1256428800000,
+ 1269734400000,
+ 1288483200000,
+ 1301184000000,
+ 1319932800000,
+ 1332633600000,
+ 1351382400000,
+ 1364688000000,
+ 1382832000000,
+ 1396137600000,
+ 1414281600000,
+ 1427587200000,
+ 1445731200000,
+ 1459036800000,
+ 1477785600000,
+ 1490486400000,
+ 1509235200000,
+ 1521936000000,
+ 1540684800000,
+ 1553990400000,
+ 1572134400000,
+ 1585440000000,
+ 1603584000000,
+ 1616889600000,
+ 1635638400000,
+ 1648339200000,
+ 1667088000000,
+ 1679788800000,
+ 1698537600000,
+ 1711843200000,
+ 1729987200000,
+ 1743292800000,
+ 1761436800000,
+ 1774742400000,
+ 1792886400000,
+ 1806192000000,
+ 1824940800000,
+ 1837641600000,
+ 1856390400000,
+ 1869091200000,
+ 1887840000000,
+ 1901145600000,
+ 1919289600000,
+ 1932595200000,
+ 1950739200000,
+ 1964044800000,
+ 1982793600000,
+ 1995494400000,
+ 2014243200000,
+ 2026944000000,
+ 2045692800000,
+ 2058393600000,
+ 2077142400000,
+ 2090448000000,
+ 2108592000000,
+ 2121897600000,
+ 2140041600000,
+ null
+ ],
+ "offsets": [
+ -115,
+ -104.4,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 669694
+ },
+ {
+ "name": "Europe/Copenhagen",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1692496800000,
+ -1680490800000,
+ -935110800000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -781052400000,
+ -769388400000,
+ -747010800000,
+ -736383600000,
+ -715215600000,
+ -706748400000,
+ -683161200000,
+ -675298800000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 1248000
+ },
+ {
+ "name": "Europe/Dublin",
+ "abbrs": [
+ "DMT",
+ "IST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT",
+ "IST",
+ "GMT"
+ ],
+ "untils": [
+ -1691962479000,
+ -1680471279000,
+ -1664143200000,
+ -1650146400000,
+ -1633903200000,
+ -1617487200000,
+ -1601848800000,
+ -1586037600000,
+ -1570399200000,
+ -1552168800000,
+ -1538344800000,
+ -1522533600000,
+ -1507500000000,
+ -1490565600000,
+ -1473631200000,
+ -1460930400000,
+ -1442786400000,
+ -1428876000000,
+ -1410732000000,
+ -1396216800000,
+ -1379282400000,
+ -1364767200000,
+ -1348437600000,
+ -1333317600000,
+ -1315778400000,
+ -1301263200000,
+ -1284328800000,
+ -1269813600000,
+ -1253484000000,
+ -1238364000000,
+ -1221429600000,
+ -1206914400000,
+ -1189980000000,
+ -1175464800000,
+ -1159135200000,
+ -1143410400000,
+ -1126476000000,
+ -1111960800000,
+ -1095631200000,
+ -1080511200000,
+ -1063576800000,
+ -1049061600000,
+ -1032127200000,
+ -1017612000000,
+ -1001282400000,
+ -986162400000,
+ -969228000000,
+ -950479200000,
+ -942012000000,
+ -733356000000,
+ -719445600000,
+ -699487200000,
+ -684972000000,
+ -668037600000,
+ -654732000000,
+ -636588000000,
+ -622072800000,
+ -605743200000,
+ -590623200000,
+ -574293600000,
+ -558568800000,
+ -542239200000,
+ -527119200000,
+ -512604000000,
+ -496274400000,
+ -481154400000,
+ -464220000000,
+ -449704800000,
+ -432165600000,
+ -417650400000,
+ -401320800000,
+ -386200800000,
+ -369266400000,
+ -354751200000,
+ -337816800000,
+ -323301600000,
+ -306972000000,
+ -291852000000,
+ -276732000000,
+ -257983200000,
+ -245282400000,
+ -226533600000,
+ -213228000000,
+ -195084000000,
+ -182383200000,
+ -163634400000,
+ -150933600000,
+ -132184800000,
+ -119484000000,
+ -100735200000,
+ -88034400000,
+ -68680800000,
+ -59004000000,
+ 57722400000,
+ 69818400000,
+ 89172000000,
+ 101268000000,
+ 120621600000,
+ 132717600000,
+ 152071200000,
+ 164167200000,
+ 183520800000,
+ 196221600000,
+ 214970400000,
+ 227671200000,
+ 246420000000,
+ 259120800000,
+ 278474400000,
+ 290570400000,
+ 309924000000,
+ 322020000000,
+ 341373600000,
+ 354675600000,
+ 372819600000,
+ 386125200000,
+ 404269200000,
+ 417574800000,
+ 435718800000,
+ 449024400000,
+ 467773200000,
+ 481078800000,
+ 499222800000,
+ 512528400000,
+ 530672400000,
+ 543978000000,
+ 562122000000,
+ 575427600000,
+ 593571600000,
+ 606877200000,
+ 625626000000,
+ 638326800000,
+ 657075600000,
+ 670381200000,
+ 688525200000,
+ 701830800000,
+ 719974800000,
+ 733280400000,
+ 751424400000,
+ 764730000000,
+ 782874000000,
+ 796179600000,
+ 814323600000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 25.35,
+ -34.65,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0
+ ],
+ "population": 1160000
+ },
+ {
+ "name": "Europe/Gibraltar",
+ "abbrs": [
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "BDST",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1691964000000,
+ -1680472800000,
+ -1664143200000,
+ -1650146400000,
+ -1633903200000,
+ -1617487200000,
+ -1601848800000,
+ -1586037600000,
+ -1570399200000,
+ -1552168800000,
+ -1538344800000,
+ -1522533600000,
+ -1507500000000,
+ -1490565600000,
+ -1473631200000,
+ -1460930400000,
+ -1442786400000,
+ -1428876000000,
+ -1410732000000,
+ -1396216800000,
+ -1379282400000,
+ -1364767200000,
+ -1348437600000,
+ -1333317600000,
+ -1315778400000,
+ -1301263200000,
+ -1284328800000,
+ -1269813600000,
+ -1253484000000,
+ -1238364000000,
+ -1221429600000,
+ -1206914400000,
+ -1189980000000,
+ -1175464800000,
+ -1159135200000,
+ -1143410400000,
+ -1126476000000,
+ -1111960800000,
+ -1095631200000,
+ -1080511200000,
+ -1063576800000,
+ -1049061600000,
+ -1032127200000,
+ -1017612000000,
+ -1001282400000,
+ -986162400000,
+ -969228000000,
+ -950479200000,
+ -942012000000,
+ -904518000000,
+ -896050800000,
+ -875487600000,
+ -864601200000,
+ -844038000000,
+ -832546800000,
+ -812588400000,
+ -798073200000,
+ -781052400000,
+ -772066800000,
+ -764805600000,
+ -748476000000,
+ -733356000000,
+ -719445600000,
+ -717030000000,
+ -706748400000,
+ -699487200000,
+ -687996000000,
+ -668037600000,
+ -654732000000,
+ -636588000000,
+ -622072800000,
+ -605743200000,
+ -590623200000,
+ -574293600000,
+ -558568800000,
+ -542239200000,
+ -527119200000,
+ -512604000000,
+ -496274400000,
+ -481154400000,
+ -464220000000,
+ -449704800000,
+ -432165600000,
+ -417650400000,
+ -401320800000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 30001
+ },
+ {
+ "name": "Europe/Guernsey",
+ "abbrs": [
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "BDST",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT"
+ ],
+ "untils": [
+ -1691964000000,
+ -1680472800000,
+ -1664143200000,
+ -1650146400000,
+ -1633903200000,
+ -1617487200000,
+ -1601848800000,
+ -1586037600000,
+ -1570399200000,
+ -1552168800000,
+ -1538344800000,
+ -1522533600000,
+ -1507500000000,
+ -1490565600000,
+ -1473631200000,
+ -1460930400000,
+ -1442786400000,
+ -1428876000000,
+ -1410732000000,
+ -1396216800000,
+ -1379282400000,
+ -1364767200000,
+ -1348437600000,
+ -1333317600000,
+ -1315778400000,
+ -1301263200000,
+ -1284328800000,
+ -1269813600000,
+ -1253484000000,
+ -1238364000000,
+ -1221429600000,
+ -1206914400000,
+ -1189980000000,
+ -1175464800000,
+ -1159135200000,
+ -1143410400000,
+ -1126476000000,
+ -1111960800000,
+ -1095631200000,
+ -1080511200000,
+ -1063576800000,
+ -1049061600000,
+ -1032127200000,
+ -1017612000000,
+ -1001282400000,
+ -986162400000,
+ -969228000000,
+ -950479200000,
+ -942012000000,
+ -904518000000,
+ -896050800000,
+ -875487600000,
+ -864601200000,
+ -844038000000,
+ -832546800000,
+ -812588400000,
+ -798073200000,
+ -781052400000,
+ -772066800000,
+ -764805600000,
+ -748476000000,
+ -733356000000,
+ -719445600000,
+ -717030000000,
+ -706748400000,
+ -699487200000,
+ -687996000000,
+ -668037600000,
+ -654732000000,
+ -636588000000,
+ -622072800000,
+ -605743200000,
+ -590623200000,
+ -574293600000,
+ -558568800000,
+ -542239200000,
+ -527119200000,
+ -512604000000,
+ -496274400000,
+ -481154400000,
+ -464220000000,
+ -449704800000,
+ -432165600000,
+ -417650400000,
+ -401320800000,
+ -386200800000,
+ -369266400000,
+ -354751200000,
+ -337816800000,
+ -323301600000,
+ -306972000000,
+ -291852000000,
+ -276732000000,
+ -257983200000,
+ -245282400000,
+ -226533600000,
+ -213228000000,
+ -195084000000,
+ -182383200000,
+ -163634400000,
+ -150933600000,
+ -132184800000,
+ -119484000000,
+ -100735200000,
+ -88034400000,
+ -68680800000,
+ -59004000000,
+ 57722400000,
+ 69818400000,
+ 89172000000,
+ 101268000000,
+ 120621600000,
+ 132717600000,
+ 152071200000,
+ 164167200000,
+ 183520800000,
+ 196221600000,
+ 214970400000,
+ 227671200000,
+ 246420000000,
+ 259120800000,
+ 278474400000,
+ 290570400000,
+ 309924000000,
+ 322020000000,
+ 341373600000,
+ 354675600000,
+ 372819600000,
+ 386125200000,
+ 404269200000,
+ 417574800000,
+ 435718800000,
+ 449024400000,
+ 467773200000,
+ 481078800000,
+ 499222800000,
+ 512528400000,
+ 530672400000,
+ 543978000000,
+ 562122000000,
+ 575427600000,
+ 593571600000,
+ 606877200000,
+ 625626000000,
+ 638326800000,
+ 657075600000,
+ 670381200000,
+ 688525200000,
+ 701830800000,
+ 719974800000,
+ 733280400000,
+ 751424400000,
+ 764730000000,
+ 782874000000,
+ 796179600000,
+ 814323600000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/Helsinki",
+ "abbrs": [
+ "HMT",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -1535938789000,
+ -875671200000,
+ -859773600000,
+ 354672000000,
+ 370396800000,
+ 386121600000,
+ 401846400000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -99.8167,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 1208000
+ },
+ {
+ "name": "Europe/Isle_of_Man",
+ "abbrs": [
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "BDST",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT"
+ ],
+ "untils": [
+ -1691964000000,
+ -1680472800000,
+ -1664143200000,
+ -1650146400000,
+ -1633903200000,
+ -1617487200000,
+ -1601848800000,
+ -1586037600000,
+ -1570399200000,
+ -1552168800000,
+ -1538344800000,
+ -1522533600000,
+ -1507500000000,
+ -1490565600000,
+ -1473631200000,
+ -1460930400000,
+ -1442786400000,
+ -1428876000000,
+ -1410732000000,
+ -1396216800000,
+ -1379282400000,
+ -1364767200000,
+ -1348437600000,
+ -1333317600000,
+ -1315778400000,
+ -1301263200000,
+ -1284328800000,
+ -1269813600000,
+ -1253484000000,
+ -1238364000000,
+ -1221429600000,
+ -1206914400000,
+ -1189980000000,
+ -1175464800000,
+ -1159135200000,
+ -1143410400000,
+ -1126476000000,
+ -1111960800000,
+ -1095631200000,
+ -1080511200000,
+ -1063576800000,
+ -1049061600000,
+ -1032127200000,
+ -1017612000000,
+ -1001282400000,
+ -986162400000,
+ -969228000000,
+ -950479200000,
+ -942012000000,
+ -904518000000,
+ -896050800000,
+ -875487600000,
+ -864601200000,
+ -844038000000,
+ -832546800000,
+ -812588400000,
+ -798073200000,
+ -781052400000,
+ -772066800000,
+ -764805600000,
+ -748476000000,
+ -733356000000,
+ -719445600000,
+ -717030000000,
+ -706748400000,
+ -699487200000,
+ -687996000000,
+ -668037600000,
+ -654732000000,
+ -636588000000,
+ -622072800000,
+ -605743200000,
+ -590623200000,
+ -574293600000,
+ -558568800000,
+ -542239200000,
+ -527119200000,
+ -512604000000,
+ -496274400000,
+ -481154400000,
+ -464220000000,
+ -449704800000,
+ -432165600000,
+ -417650400000,
+ -401320800000,
+ -386200800000,
+ -369266400000,
+ -354751200000,
+ -337816800000,
+ -323301600000,
+ -306972000000,
+ -291852000000,
+ -276732000000,
+ -257983200000,
+ -245282400000,
+ -226533600000,
+ -213228000000,
+ -195084000000,
+ -182383200000,
+ -163634400000,
+ -150933600000,
+ -132184800000,
+ -119484000000,
+ -100735200000,
+ -88034400000,
+ -68680800000,
+ -59004000000,
+ 57722400000,
+ 69818400000,
+ 89172000000,
+ 101268000000,
+ 120621600000,
+ 132717600000,
+ 152071200000,
+ 164167200000,
+ 183520800000,
+ 196221600000,
+ 214970400000,
+ 227671200000,
+ 246420000000,
+ 259120800000,
+ 278474400000,
+ 290570400000,
+ 309924000000,
+ 322020000000,
+ 341373600000,
+ 354675600000,
+ 372819600000,
+ 386125200000,
+ 404269200000,
+ 417574800000,
+ 435718800000,
+ 449024400000,
+ 467773200000,
+ 481078800000,
+ 499222800000,
+ 512528400000,
+ 530672400000,
+ 543978000000,
+ 562122000000,
+ 575427600000,
+ 593571600000,
+ 606877200000,
+ 625626000000,
+ 638326800000,
+ 657075600000,
+ 670381200000,
+ 688525200000,
+ 701830800000,
+ 719974800000,
+ 733280400000,
+ 751424400000,
+ 764730000000,
+ 782874000000,
+ 796179600000,
+ 814323600000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/Istanbul",
+ "abbrs": [
+ "IMT",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "+03"
+ ],
+ "untils": [
+ -1869875816000,
+ -1693706400000,
+ -1680490800000,
+ -1570413600000,
+ -1552186800000,
+ -1538359200000,
+ -1522551600000,
+ -1507514400000,
+ -1490583600000,
+ -1440208800000,
+ -1428030000000,
+ -1409709600000,
+ -1396494000000,
+ -931140000000,
+ -922762800000,
+ -917834400000,
+ -892436400000,
+ -875844000000,
+ -857358000000,
+ -781063200000,
+ -764737200000,
+ -744343200000,
+ -733806000000,
+ -716436000000,
+ -701924400000,
+ -684986400000,
+ -670474800000,
+ -654141600000,
+ -639025200000,
+ -621828000000,
+ -606970800000,
+ -590032800000,
+ -575434800000,
+ -235620000000,
+ -228279600000,
+ -177732000000,
+ -165726000000,
+ 10533600000,
+ 23835600000,
+ 41983200000,
+ 55285200000,
+ 74037600000,
+ 87339600000,
+ 107910000000,
+ 121219200000,
+ 133920000000,
+ 152676000000,
+ 165362400000,
+ 183502800000,
+ 202428000000,
+ 215557200000,
+ 228866400000,
+ 245797200000,
+ 260316000000,
+ 277246800000,
+ 308779200000,
+ 323827200000,
+ 340228800000,
+ 354672000000,
+ 371678400000,
+ 386121600000,
+ 403128000000,
+ 428446800000,
+ 433886400000,
+ 482792400000,
+ 496702800000,
+ 512521200000,
+ 528246000000,
+ 543970800000,
+ 559695600000,
+ 575420400000,
+ 591145200000,
+ 606870000000,
+ 622594800000,
+ 638319600000,
+ 654649200000,
+ 670374000000,
+ 686098800000,
+ 701823600000,
+ 717548400000,
+ 733273200000,
+ 748998000000,
+ 764118000000,
+ 780447600000,
+ 796172400000,
+ 811897200000,
+ 828226800000,
+ 846370800000,
+ 859676400000,
+ 877820400000,
+ 891126000000,
+ 909270000000,
+ 922575600000,
+ 941324400000,
+ 954025200000,
+ 972774000000,
+ 985474800000,
+ 1004223600000,
+ 1017529200000,
+ 1035673200000,
+ 1048978800000,
+ 1067122800000,
+ 1080428400000,
+ 1099177200000,
+ 1111878000000,
+ 1130626800000,
+ 1143327600000,
+ 1162076400000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301274000000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396227600000,
+ 1414285200000,
+ 1427590800000,
+ 1446944400000,
+ 1459040400000,
+ 1473195600000,
+ null
+ ],
+ "offsets": [
+ -116.9333,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -180
+ ],
+ "population": 13287000
+ },
+ {
+ "name": "Europe/Jersey",
+ "abbrs": [
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "BDST",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT"
+ ],
+ "untils": [
+ -1691964000000,
+ -1680472800000,
+ -1664143200000,
+ -1650146400000,
+ -1633903200000,
+ -1617487200000,
+ -1601848800000,
+ -1586037600000,
+ -1570399200000,
+ -1552168800000,
+ -1538344800000,
+ -1522533600000,
+ -1507500000000,
+ -1490565600000,
+ -1473631200000,
+ -1460930400000,
+ -1442786400000,
+ -1428876000000,
+ -1410732000000,
+ -1396216800000,
+ -1379282400000,
+ -1364767200000,
+ -1348437600000,
+ -1333317600000,
+ -1315778400000,
+ -1301263200000,
+ -1284328800000,
+ -1269813600000,
+ -1253484000000,
+ -1238364000000,
+ -1221429600000,
+ -1206914400000,
+ -1189980000000,
+ -1175464800000,
+ -1159135200000,
+ -1143410400000,
+ -1126476000000,
+ -1111960800000,
+ -1095631200000,
+ -1080511200000,
+ -1063576800000,
+ -1049061600000,
+ -1032127200000,
+ -1017612000000,
+ -1001282400000,
+ -986162400000,
+ -969228000000,
+ -950479200000,
+ -942012000000,
+ -904518000000,
+ -896050800000,
+ -875487600000,
+ -864601200000,
+ -844038000000,
+ -832546800000,
+ -812588400000,
+ -798073200000,
+ -781052400000,
+ -772066800000,
+ -764805600000,
+ -748476000000,
+ -733356000000,
+ -719445600000,
+ -717030000000,
+ -706748400000,
+ -699487200000,
+ -687996000000,
+ -668037600000,
+ -654732000000,
+ -636588000000,
+ -622072800000,
+ -605743200000,
+ -590623200000,
+ -574293600000,
+ -558568800000,
+ -542239200000,
+ -527119200000,
+ -512604000000,
+ -496274400000,
+ -481154400000,
+ -464220000000,
+ -449704800000,
+ -432165600000,
+ -417650400000,
+ -401320800000,
+ -386200800000,
+ -369266400000,
+ -354751200000,
+ -337816800000,
+ -323301600000,
+ -306972000000,
+ -291852000000,
+ -276732000000,
+ -257983200000,
+ -245282400000,
+ -226533600000,
+ -213228000000,
+ -195084000000,
+ -182383200000,
+ -163634400000,
+ -150933600000,
+ -132184800000,
+ -119484000000,
+ -100735200000,
+ -88034400000,
+ -68680800000,
+ -59004000000,
+ 57722400000,
+ 69818400000,
+ 89172000000,
+ 101268000000,
+ 120621600000,
+ 132717600000,
+ 152071200000,
+ 164167200000,
+ 183520800000,
+ 196221600000,
+ 214970400000,
+ 227671200000,
+ 246420000000,
+ 259120800000,
+ 278474400000,
+ 290570400000,
+ 309924000000,
+ 322020000000,
+ 341373600000,
+ 354675600000,
+ 372819600000,
+ 386125200000,
+ 404269200000,
+ 417574800000,
+ 435718800000,
+ 449024400000,
+ 467773200000,
+ 481078800000,
+ 499222800000,
+ 512528400000,
+ 530672400000,
+ 543978000000,
+ 562122000000,
+ 575427600000,
+ 593571600000,
+ 606877200000,
+ 625626000000,
+ 638326800000,
+ 657075600000,
+ 670381200000,
+ 688525200000,
+ 701830800000,
+ 719974800000,
+ 733280400000,
+ 751424400000,
+ 764730000000,
+ 782874000000,
+ 796179600000,
+ 814323600000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/Kaliningrad",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CET",
+ "CEST",
+ "CET",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "+03",
+ "EET"
+ ],
+ "untils": [
+ -1693706400000,
+ -1680483600000,
+ -1663455600000,
+ -1650150000000,
+ -1632006000000,
+ -1618700400000,
+ -938905200000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -788922000000,
+ -778730400000,
+ -762663600000,
+ -757389600000,
+ 354920400000,
+ 370728000000,
+ 386456400000,
+ 402264000000,
+ 417992400000,
+ 433800000000,
+ 449614800000,
+ 465346800000,
+ 481071600000,
+ 496796400000,
+ 512521200000,
+ 528246000000,
+ 543970800000,
+ 559695600000,
+ 575420400000,
+ 591145200000,
+ 606870000000,
+ 622598400000,
+ 638323200000,
+ 654652800000,
+ 670377600000,
+ 686102400000,
+ 701827200000,
+ 717552000000,
+ 733276800000,
+ 749001600000,
+ 764726400000,
+ 780451200000,
+ 796176000000,
+ 811900800000,
+ 828230400000,
+ 846374400000,
+ 859680000000,
+ 877824000000,
+ 891129600000,
+ 909273600000,
+ 922579200000,
+ 941328000000,
+ 954028800000,
+ 972777600000,
+ 985478400000,
+ 1004227200000,
+ 1017532800000,
+ 1035676800000,
+ 1048982400000,
+ 1067126400000,
+ 1080432000000,
+ 1099180800000,
+ 1111881600000,
+ 1130630400000,
+ 1143331200000,
+ 1162080000000,
+ 1174780800000,
+ 1193529600000,
+ 1206835200000,
+ 1224979200000,
+ 1238284800000,
+ 1256428800000,
+ 1269734400000,
+ 1288483200000,
+ 1301184000000,
+ 1414278000000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -180,
+ -120,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 437456
+ },
+ {
+ "name": "Europe/Kiev",
+ "abbrs": [
+ "KMT",
+ "EET",
+ "MSK",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -1441159324000,
+ -1247536800000,
+ -892522800000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -825382800000,
+ 354920400000,
+ 370728000000,
+ 386456400000,
+ 402264000000,
+ 417992400000,
+ 433800000000,
+ 449614800000,
+ 465346800000,
+ 481071600000,
+ 496796400000,
+ 512521200000,
+ 528246000000,
+ 543970800000,
+ 559695600000,
+ 575420400000,
+ 591145200000,
+ 606870000000,
+ 622594800000,
+ 638319600000,
+ 646783200000,
+ 686102400000,
+ 701820000000,
+ 717541200000,
+ 733269600000,
+ 748990800000,
+ 764719200000,
+ 780440400000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -122.0667,
+ -120,
+ -180,
+ -120,
+ -60,
+ -120,
+ -60,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 3375000
+ },
+ {
+ "name": "Europe/Kirov",
+ "abbrs": [
+ "LMT",
+ "+03",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03"
+ ],
+ "untils": [
+ -1593820800000,
+ -1247540400000,
+ 354916800000,
+ 370724400000,
+ 386452800000,
+ 402260400000,
+ 417988800000,
+ 433796400000,
+ 449611200000,
+ 465343200000,
+ 481068000000,
+ 496792800000,
+ 512517600000,
+ 528242400000,
+ 543967200000,
+ 559692000000,
+ 575416800000,
+ 591141600000,
+ 622594800000,
+ 638319600000,
+ 654649200000,
+ 670374000000,
+ 717548400000,
+ 733273200000,
+ 748998000000,
+ 764722800000,
+ 780447600000,
+ 796172400000,
+ 811897200000,
+ 828226800000,
+ 846370800000,
+ 859676400000,
+ 877820400000,
+ 891126000000,
+ 909270000000,
+ 922575600000,
+ 941324400000,
+ 954025200000,
+ 972774000000,
+ 985474800000,
+ 1004223600000,
+ 1017529200000,
+ 1035673200000,
+ 1048978800000,
+ 1067122800000,
+ 1080428400000,
+ 1099177200000,
+ 1111878000000,
+ 1130626800000,
+ 1143327600000,
+ 1162076400000,
+ 1174777200000,
+ 1193526000000,
+ 1206831600000,
+ 1224975600000,
+ 1238281200000,
+ 1256425200000,
+ 1269730800000,
+ 1288479600000,
+ 1301180400000,
+ 1414274400000,
+ null
+ ],
+ "offsets": [
+ -198.8,
+ -180,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180
+ ],
+ "population": 480594
+ },
+ {
+ "name": "Europe/Lisbon",
+ "abbrs": [
+ "LMT",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WEMT",
+ "WEST",
+ "WET",
+ "WEST",
+ "WEMT",
+ "WEST",
+ "WET",
+ "WEST",
+ "WEMT",
+ "WEST",
+ "WET",
+ "WEST",
+ "WEMT",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "CET",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET"
+ ],
+ "untils": [
+ -1830384000000,
+ -1689555600000,
+ -1677801600000,
+ -1667437200000,
+ -1647738000000,
+ -1635814800000,
+ -1616202000000,
+ -1604365200000,
+ -1584666000000,
+ -1572742800000,
+ -1553043600000,
+ -1541206800000,
+ -1521507600000,
+ -1442451600000,
+ -1426813200000,
+ -1379293200000,
+ -1364778000000,
+ -1348448400000,
+ -1333328400000,
+ -1316394000000,
+ -1301274000000,
+ -1284339600000,
+ -1269824400000,
+ -1221440400000,
+ -1206925200000,
+ -1191200400000,
+ -1175475600000,
+ -1127696400000,
+ -1111971600000,
+ -1096851600000,
+ -1080522000000,
+ -1063587600000,
+ -1049072400000,
+ -1033347600000,
+ -1017622800000,
+ -1002502800000,
+ -986173200000,
+ -969238800000,
+ -950490000000,
+ -942022800000,
+ -922669200000,
+ -906944400000,
+ -891133200000,
+ -877309200000,
+ -873684000000,
+ -864007200000,
+ -857955600000,
+ -845859600000,
+ -842839200000,
+ -831348000000,
+ -825901200000,
+ -814410000000,
+ -810784800000,
+ -799898400000,
+ -794451600000,
+ -782960400000,
+ -779335200000,
+ -768448800000,
+ -763002000000,
+ -749091600000,
+ -733366800000,
+ -717631200000,
+ -701906400000,
+ -686181600000,
+ -670456800000,
+ -654732000000,
+ -639007200000,
+ -591832800000,
+ -575503200000,
+ -559778400000,
+ -544053600000,
+ -528328800000,
+ -512604000000,
+ -496879200000,
+ -481154400000,
+ -465429600000,
+ -449704800000,
+ -433980000000,
+ -417650400000,
+ -401925600000,
+ -386200800000,
+ -370476000000,
+ -354751200000,
+ -339026400000,
+ -323301600000,
+ -307576800000,
+ -291852000000,
+ -276127200000,
+ -260402400000,
+ -244677600000,
+ -228348000000,
+ -212623200000,
+ -196898400000,
+ -181173600000,
+ -165448800000,
+ -149724000000,
+ -133999200000,
+ -118274400000,
+ 212544000000,
+ 228268800000,
+ 243993600000,
+ 260323200000,
+ 276048000000,
+ 291772800000,
+ 307501200000,
+ 323222400000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417578400000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 36.75,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0
+ ],
+ "population": 2666000
+ },
+ {
+ "name": "Europe/Ljubljana",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -905824800000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -777942000000,
+ -766623600000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/London",
+ "abbrs": [
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "BDST",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT"
+ ],
+ "untils": [
+ -1691964000000,
+ -1680472800000,
+ -1664143200000,
+ -1650146400000,
+ -1633903200000,
+ -1617487200000,
+ -1601848800000,
+ -1586037600000,
+ -1570399200000,
+ -1552168800000,
+ -1538344800000,
+ -1522533600000,
+ -1507500000000,
+ -1490565600000,
+ -1473631200000,
+ -1460930400000,
+ -1442786400000,
+ -1428876000000,
+ -1410732000000,
+ -1396216800000,
+ -1379282400000,
+ -1364767200000,
+ -1348437600000,
+ -1333317600000,
+ -1315778400000,
+ -1301263200000,
+ -1284328800000,
+ -1269813600000,
+ -1253484000000,
+ -1238364000000,
+ -1221429600000,
+ -1206914400000,
+ -1189980000000,
+ -1175464800000,
+ -1159135200000,
+ -1143410400000,
+ -1126476000000,
+ -1111960800000,
+ -1095631200000,
+ -1080511200000,
+ -1063576800000,
+ -1049061600000,
+ -1032127200000,
+ -1017612000000,
+ -1001282400000,
+ -986162400000,
+ -969228000000,
+ -950479200000,
+ -942012000000,
+ -904518000000,
+ -896050800000,
+ -875487600000,
+ -864601200000,
+ -844038000000,
+ -832546800000,
+ -812588400000,
+ -798073200000,
+ -781052400000,
+ -772066800000,
+ -764805600000,
+ -748476000000,
+ -733356000000,
+ -719445600000,
+ -717030000000,
+ -706748400000,
+ -699487200000,
+ -687996000000,
+ -668037600000,
+ -654732000000,
+ -636588000000,
+ -622072800000,
+ -605743200000,
+ -590623200000,
+ -574293600000,
+ -558568800000,
+ -542239200000,
+ -527119200000,
+ -512604000000,
+ -496274400000,
+ -481154400000,
+ -464220000000,
+ -449704800000,
+ -432165600000,
+ -417650400000,
+ -401320800000,
+ -386200800000,
+ -369266400000,
+ -354751200000,
+ -337816800000,
+ -323301600000,
+ -306972000000,
+ -291852000000,
+ -276732000000,
+ -257983200000,
+ -245282400000,
+ -226533600000,
+ -213228000000,
+ -195084000000,
+ -182383200000,
+ -163634400000,
+ -150933600000,
+ -132184800000,
+ -119484000000,
+ -100735200000,
+ -88034400000,
+ -68680800000,
+ -59004000000,
+ 57722400000,
+ 69818400000,
+ 89172000000,
+ 101268000000,
+ 120621600000,
+ 132717600000,
+ 152071200000,
+ 164167200000,
+ 183520800000,
+ 196221600000,
+ 214970400000,
+ 227671200000,
+ 246420000000,
+ 259120800000,
+ 278474400000,
+ 290570400000,
+ 309924000000,
+ 322020000000,
+ 341373600000,
+ 354675600000,
+ 372819600000,
+ 386125200000,
+ 404269200000,
+ 417574800000,
+ 435718800000,
+ 449024400000,
+ 467773200000,
+ 481078800000,
+ 499222800000,
+ 512528400000,
+ 530672400000,
+ 543978000000,
+ 562122000000,
+ 575427600000,
+ 593571600000,
+ 606877200000,
+ 625626000000,
+ 638326800000,
+ 657075600000,
+ 670381200000,
+ 688525200000,
+ 701830800000,
+ 719974800000,
+ 733280400000,
+ 751424400000,
+ 764730000000,
+ 782874000000,
+ 796179600000,
+ 814323600000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0
+ ],
+ "population": 10236000
+ },
+ {
+ "name": "Europe/Luxembourg",
+ "abbrs": [
+ "LMT",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -2069713476000,
+ -1692496800000,
+ -1680483600000,
+ -1662343200000,
+ -1650157200000,
+ -1632006000000,
+ -1618700400000,
+ -1612659600000,
+ -1604278800000,
+ -1585519200000,
+ -1574038800000,
+ -1552258800000,
+ -1539997200000,
+ -1520550000000,
+ -1507510800000,
+ -1490572800000,
+ -1473642000000,
+ -1459119600000,
+ -1444006800000,
+ -1427673600000,
+ -1411866000000,
+ -1396224000000,
+ -1379293200000,
+ -1364774400000,
+ -1348448400000,
+ -1333324800000,
+ -1316394000000,
+ -1301270400000,
+ -1284339600000,
+ -1269813600000,
+ -1253484000000,
+ -1238364000000,
+ -1221429600000,
+ -1206914400000,
+ -1191189600000,
+ -1175464800000,
+ -1160344800000,
+ -1143410400000,
+ -1127685600000,
+ -1111960800000,
+ -1096840800000,
+ -1080511200000,
+ -1063576800000,
+ -1049061600000,
+ -1033336800000,
+ -1017612000000,
+ -1002492000000,
+ -986162400000,
+ -969228000000,
+ -950479200000,
+ -942012000000,
+ -935186400000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -797986800000,
+ -781052400000,
+ -766623600000,
+ -745455600000,
+ -733273200000,
+ 228877200000,
+ 243997200000,
+ 260326800000,
+ 276051600000,
+ 291776400000,
+ 307501200000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -24.6,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 543202
+ },
+ {
+ "name": "Europe/Madrid",
+ "abbrs": [
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WEMT",
+ "WEST",
+ "WET",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1631926800000,
+ -1616889600000,
+ -1601168400000,
+ -1585353600000,
+ -1442451600000,
+ -1427673600000,
+ -1379293200000,
+ -1364774400000,
+ -1348448400000,
+ -1333324800000,
+ -1316390400000,
+ -1301270400000,
+ -1284339600000,
+ -1269820800000,
+ -1026954000000,
+ -1017619200000,
+ -1001898000000,
+ -999482400000,
+ -986090400000,
+ -954115200000,
+ -940208400000,
+ -873079200000,
+ -862621200000,
+ -842839200000,
+ -828320400000,
+ -811389600000,
+ -796870800000,
+ -779940000000,
+ -765421200000,
+ -748490400000,
+ -733971600000,
+ -652327200000,
+ -639018000000,
+ 135122400000,
+ 150246000000,
+ 166572000000,
+ 181695600000,
+ 196812000000,
+ 212540400000,
+ 228866400000,
+ 243990000000,
+ 260326800000,
+ 276051600000,
+ 291776400000,
+ 307501200000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 6171000
+ },
+ {
+ "name": "Europe/Malta",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1690765200000,
+ -1680487200000,
+ -1664758800000,
+ -1648951200000,
+ -1635123600000,
+ -1616896800000,
+ -1604278800000,
+ -1585533600000,
+ -1571014800000,
+ -1555293600000,
+ -932432400000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812588400000,
+ -798073200000,
+ -781052400000,
+ -766717200000,
+ -750898800000,
+ -733359600000,
+ -719456400000,
+ -701917200000,
+ -689209200000,
+ -670460400000,
+ -114051600000,
+ -103168800000,
+ -81997200000,
+ -71715600000,
+ -50547600000,
+ -40266000000,
+ -18493200000,
+ -8211600000,
+ 12956400000,
+ 23238000000,
+ 43801200000,
+ 54687600000,
+ 75855600000,
+ 86742000000,
+ 102380400000,
+ 118105200000,
+ 135730800000,
+ 148518000000,
+ 167187600000,
+ 180489600000,
+ 198637200000,
+ 211939200000,
+ 230086800000,
+ 243388800000,
+ 261536400000,
+ 274838400000,
+ 292986000000,
+ 306288000000,
+ 323312400000,
+ 338342400000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 423282
+ },
+ {
+ "name": "Europe/Mariehamn",
+ "abbrs": [
+ "HMT",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -1535938789000,
+ -875671200000,
+ -859773600000,
+ 354672000000,
+ 370396800000,
+ 386121600000,
+ 401846400000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -99.8167,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/Minsk",
+ "abbrs": [
+ "MMT",
+ "EET",
+ "MSK",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "+03"
+ ],
+ "untils": [
+ -1441158600000,
+ -1247536800000,
+ -899780400000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -804650400000,
+ 354920400000,
+ 370728000000,
+ 386456400000,
+ 402264000000,
+ 417992400000,
+ 433800000000,
+ 449614800000,
+ 465346800000,
+ 481071600000,
+ 496796400000,
+ 512521200000,
+ 528246000000,
+ 543970800000,
+ 559695600000,
+ 575420400000,
+ 591145200000,
+ 606870000000,
+ 622594800000,
+ 670374000000,
+ 686102400000,
+ 701827200000,
+ 717552000000,
+ 733276800000,
+ 749001600000,
+ 764726400000,
+ 780451200000,
+ 796176000000,
+ 811900800000,
+ 828230400000,
+ 846374400000,
+ 859680000000,
+ 877824000000,
+ 891129600000,
+ 909273600000,
+ 922579200000,
+ 941328000000,
+ 954028800000,
+ 972777600000,
+ 985478400000,
+ 1004227200000,
+ 1017532800000,
+ 1035676800000,
+ 1048982400000,
+ 1067126400000,
+ 1080432000000,
+ 1099180800000,
+ 1111881600000,
+ 1130630400000,
+ 1143331200000,
+ 1162080000000,
+ 1174780800000,
+ 1193529600000,
+ 1206835200000,
+ 1224979200000,
+ 1238284800000,
+ 1256428800000,
+ 1269734400000,
+ 1288483200000,
+ 1301184000000,
+ null
+ ],
+ "offsets": [
+ -110,
+ -120,
+ -180,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180
+ ],
+ "population": 1910000
+ },
+ {
+ "name": "Europe/Monaco",
+ "abbrs": [
+ "PMT",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WEMT",
+ "WEST",
+ "WEMT",
+ "WEST",
+ "WEMT",
+ "WEST",
+ "WEMT",
+ "WEST",
+ "WEMT",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1855958961000,
+ -1689814800000,
+ -1680397200000,
+ -1665363600000,
+ -1648342800000,
+ -1635123600000,
+ -1616893200000,
+ -1604278800000,
+ -1585443600000,
+ -1574038800000,
+ -1552266000000,
+ -1539997200000,
+ -1520557200000,
+ -1507510800000,
+ -1490576400000,
+ -1470618000000,
+ -1459126800000,
+ -1444006800000,
+ -1427677200000,
+ -1411952400000,
+ -1396227600000,
+ -1379293200000,
+ -1364778000000,
+ -1348448400000,
+ -1333328400000,
+ -1316394000000,
+ -1301274000000,
+ -1284339600000,
+ -1269824400000,
+ -1253494800000,
+ -1238374800000,
+ -1221440400000,
+ -1206925200000,
+ -1191200400000,
+ -1175475600000,
+ -1160355600000,
+ -1143421200000,
+ -1127696400000,
+ -1111971600000,
+ -1096851600000,
+ -1080522000000,
+ -1063587600000,
+ -1049072400000,
+ -1033347600000,
+ -1017622800000,
+ -1002502800000,
+ -986173200000,
+ -969238800000,
+ -950490000000,
+ -942012000000,
+ -904438800000,
+ -891136800000,
+ -877827600000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796266000000,
+ -781052400000,
+ -766623600000,
+ 196819200000,
+ 212540400000,
+ 228877200000,
+ 243997200000,
+ 260326800000,
+ 276051600000,
+ 291776400000,
+ 307501200000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -9.35,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 37831
+ },
+ {
+ "name": "Europe/Moscow",
+ "abbrs": [
+ "MMT",
+ "MMT",
+ "MST",
+ "MMT",
+ "MDST",
+ "MST",
+ "MDST",
+ "MSD",
+ "MSK",
+ "MSD",
+ "+05",
+ "MSD",
+ "MSK",
+ "EET",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "EEST",
+ "EET",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSK",
+ "MSK"
+ ],
+ "untils": [
+ -1688265017000,
+ -1656819079000,
+ -1641353479000,
+ -1627965079000,
+ -1618716679000,
+ -1596429079000,
+ -1593820800000,
+ -1589860800000,
+ -1542427200000,
+ -1539493200000,
+ -1525323600000,
+ -1522728000000,
+ -1491188400000,
+ -1247536800000,
+ 354920400000,
+ 370728000000,
+ 386456400000,
+ 402264000000,
+ 417992400000,
+ 433800000000,
+ 449614800000,
+ 465346800000,
+ 481071600000,
+ 496796400000,
+ 512521200000,
+ 528246000000,
+ 543970800000,
+ 559695600000,
+ 575420400000,
+ 591145200000,
+ 606870000000,
+ 622594800000,
+ 638319600000,
+ 654649200000,
+ 670374000000,
+ 686102400000,
+ 695779200000,
+ 701823600000,
+ 717548400000,
+ 733273200000,
+ 748998000000,
+ 764722800000,
+ 780447600000,
+ 796172400000,
+ 811897200000,
+ 828226800000,
+ 846370800000,
+ 859676400000,
+ 877820400000,
+ 891126000000,
+ 909270000000,
+ 922575600000,
+ 941324400000,
+ 954025200000,
+ 972774000000,
+ 985474800000,
+ 1004223600000,
+ 1017529200000,
+ 1035673200000,
+ 1048978800000,
+ 1067122800000,
+ 1080428400000,
+ 1099177200000,
+ 1111878000000,
+ 1130626800000,
+ 1143327600000,
+ 1162076400000,
+ 1174777200000,
+ 1193526000000,
+ 1206831600000,
+ 1224975600000,
+ 1238281200000,
+ 1256425200000,
+ 1269730800000,
+ 1288479600000,
+ 1301180400000,
+ 1414274400000,
+ null
+ ],
+ "offsets": [
+ -150.2833,
+ -151.3167,
+ -211.3167,
+ -151.3167,
+ -271.3167,
+ -211.3167,
+ -271.3167,
+ -240,
+ -180,
+ -240,
+ -300,
+ -240,
+ -180,
+ -120,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -180,
+ -120,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180
+ ],
+ "population": 16170000
+ },
+ {
+ "name": "Europe/Nicosia",
+ "abbrs": [
+ "LMT",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -1518920008000,
+ 166572000000,
+ 182293200000,
+ 200959200000,
+ 213829200000,
+ 228866400000,
+ 243982800000,
+ 260316000000,
+ 276123600000,
+ 291765600000,
+ 307486800000,
+ 323820000000,
+ 338936400000,
+ 354664800000,
+ 370386000000,
+ 386114400000,
+ 401835600000,
+ 417564000000,
+ 433285200000,
+ 449013600000,
+ 465339600000,
+ 481068000000,
+ 496789200000,
+ 512517600000,
+ 528238800000,
+ 543967200000,
+ 559688400000,
+ 575416800000,
+ 591138000000,
+ 606866400000,
+ 622587600000,
+ 638316000000,
+ 654642000000,
+ 670370400000,
+ 686091600000,
+ 701820000000,
+ 717541200000,
+ 733269600000,
+ 748990800000,
+ 764719200000,
+ 780440400000,
+ 796168800000,
+ 811890000000,
+ 828223200000,
+ 843944400000,
+ 859672800000,
+ 875394000000,
+ 891122400000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -133.4667,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/Oslo",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1691884800000,
+ -1680573600000,
+ -927511200000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -781052400000,
+ -765327600000,
+ -340844400000,
+ -324514800000,
+ -308790000000,
+ -293065200000,
+ -277340400000,
+ -261615600000,
+ -245890800000,
+ -230166000000,
+ -214441200000,
+ -198716400000,
+ -182991600000,
+ -166662000000,
+ -147913200000,
+ -135212400000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 618683
+ },
+ {
+ "name": "Europe/Paris",
+ "abbrs": [
+ "PMT",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "WEMT",
+ "WEST",
+ "WEMT",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1855958901000,
+ -1689814800000,
+ -1680397200000,
+ -1665363600000,
+ -1648342800000,
+ -1635123600000,
+ -1616893200000,
+ -1604278800000,
+ -1585443600000,
+ -1574038800000,
+ -1552266000000,
+ -1539997200000,
+ -1520557200000,
+ -1507510800000,
+ -1490576400000,
+ -1470618000000,
+ -1459126800000,
+ -1444006800000,
+ -1427677200000,
+ -1411952400000,
+ -1396227600000,
+ -1379293200000,
+ -1364778000000,
+ -1348448400000,
+ -1333328400000,
+ -1316394000000,
+ -1301274000000,
+ -1284339600000,
+ -1269824400000,
+ -1253494800000,
+ -1238374800000,
+ -1221440400000,
+ -1206925200000,
+ -1191200400000,
+ -1175475600000,
+ -1160355600000,
+ -1143421200000,
+ -1127696400000,
+ -1111971600000,
+ -1096851600000,
+ -1080522000000,
+ -1063587600000,
+ -1049072400000,
+ -1033347600000,
+ -1017622800000,
+ -1002502800000,
+ -986173200000,
+ -969238800000,
+ -950490000000,
+ -942012000000,
+ -932436000000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -800071200000,
+ -796266000000,
+ -781052400000,
+ -766623600000,
+ 196819200000,
+ 212540400000,
+ 228877200000,
+ 243997200000,
+ 260326800000,
+ 276051600000,
+ 291776400000,
+ 307501200000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -9.35,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 10858000
+ },
+ {
+ "name": "Europe/Podgorica",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -905824800000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -777942000000,
+ -766623600000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/Prague",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "GMT",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1693706400000,
+ -1680483600000,
+ -1663455600000,
+ -1650150000000,
+ -1632006000000,
+ -1618700400000,
+ -938905200000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -781052400000,
+ -765327600000,
+ -746578800000,
+ -733359600000,
+ -728517600000,
+ -721260000000,
+ -716425200000,
+ -701910000000,
+ -684975600000,
+ -670460400000,
+ -654217200000,
+ -639010800000,
+ 291776400000,
+ 307501200000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 1310000
+ },
+ {
+ "name": "Europe/Riga",
+ "abbrs": [
+ "RMT",
+ "LST",
+ "RMT",
+ "LST",
+ "RMT",
+ "EET",
+ "MSK",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -1632008194000,
+ -1618702594000,
+ -1601681794000,
+ -1597275394000,
+ -1377308194000,
+ -928029600000,
+ -899521200000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -795834000000,
+ 354920400000,
+ 370728000000,
+ 386456400000,
+ 402264000000,
+ 417992400000,
+ 433800000000,
+ 449614800000,
+ 465346800000,
+ 481071600000,
+ 496796400000,
+ 512521200000,
+ 528246000000,
+ 543970800000,
+ 559695600000,
+ 575420400000,
+ 591145200000,
+ 606870000000,
+ 622598400000,
+ 638323200000,
+ 654652800000,
+ 670377600000,
+ 686102400000,
+ 701827200000,
+ 717552000000,
+ 733276800000,
+ 749001600000,
+ 764726400000,
+ 780451200000,
+ 796176000000,
+ 811900800000,
+ 828230400000,
+ 843955200000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -96.5667,
+ -156.5667,
+ -96.5667,
+ -156.5667,
+ -96.5667,
+ -120,
+ -180,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 643615
+ },
+ {
+ "name": "Europe/Rome",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1690765200000,
+ -1680487200000,
+ -1664758800000,
+ -1648951200000,
+ -1635123600000,
+ -1616896800000,
+ -1604278800000,
+ -1585533600000,
+ -1571014800000,
+ -1555293600000,
+ -932432400000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -798073200000,
+ -781052400000,
+ -766717200000,
+ -750898800000,
+ -733359600000,
+ -719456400000,
+ -701917200000,
+ -689209200000,
+ -670460400000,
+ -114051600000,
+ -103168800000,
+ -81997200000,
+ -71715600000,
+ -50547600000,
+ -40266000000,
+ -18493200000,
+ -8211600000,
+ 12956400000,
+ 23238000000,
+ 43801200000,
+ 54687600000,
+ 75855600000,
+ 86742000000,
+ 107910000000,
+ 118191600000,
+ 138754800000,
+ 149641200000,
+ 170809200000,
+ 181090800000,
+ 202258800000,
+ 212540400000,
+ 233103600000,
+ 243990000000,
+ 265158000000,
+ 276044400000,
+ 296607600000,
+ 307494000000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 3906000
+ },
+ {
+ "name": "Europe/Samara",
+ "abbrs": [
+ "LMT",
+ "+03",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+03",
+ "+04"
+ ],
+ "untils": [
+ -1593820800000,
+ -1247540400000,
+ 354916800000,
+ 370724400000,
+ 386452800000,
+ 402260400000,
+ 417988800000,
+ 433796400000,
+ 449611200000,
+ 465343200000,
+ 481068000000,
+ 496792800000,
+ 512517600000,
+ 528242400000,
+ 543967200000,
+ 559692000000,
+ 575416800000,
+ 591141600000,
+ 622594800000,
+ 638319600000,
+ 654649200000,
+ 687916800000,
+ 701820000000,
+ 717544800000,
+ 733269600000,
+ 748994400000,
+ 764719200000,
+ 780444000000,
+ 796168800000,
+ 811893600000,
+ 828223200000,
+ 846367200000,
+ 859672800000,
+ 877816800000,
+ 891122400000,
+ 909266400000,
+ 922572000000,
+ 941320800000,
+ 954021600000,
+ 972770400000,
+ 985471200000,
+ 1004220000000,
+ 1017525600000,
+ 1035669600000,
+ 1048975200000,
+ 1067119200000,
+ 1080424800000,
+ 1099173600000,
+ 1111874400000,
+ 1130623200000,
+ 1143324000000,
+ 1162072800000,
+ 1174773600000,
+ 1193522400000,
+ 1206828000000,
+ 1224972000000,
+ 1238277600000,
+ 1256421600000,
+ 1288479600000,
+ 1301180400000,
+ null
+ ],
+ "offsets": [
+ -200.3333,
+ -180,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -180,
+ -240
+ ],
+ "population": 1162000
+ },
+ {
+ "name": "Europe/San_Marino",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1690765200000,
+ -1680487200000,
+ -1664758800000,
+ -1648951200000,
+ -1635123600000,
+ -1616896800000,
+ -1604278800000,
+ -1585533600000,
+ -1571014800000,
+ -1555293600000,
+ -932432400000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -798073200000,
+ -781052400000,
+ -766717200000,
+ -750898800000,
+ -733359600000,
+ -719456400000,
+ -701917200000,
+ -689209200000,
+ -670460400000,
+ -114051600000,
+ -103168800000,
+ -81997200000,
+ -71715600000,
+ -50547600000,
+ -40266000000,
+ -18493200000,
+ -8211600000,
+ 12956400000,
+ 23238000000,
+ 43801200000,
+ 54687600000,
+ 75855600000,
+ 86742000000,
+ 107910000000,
+ 118191600000,
+ 138754800000,
+ 149641200000,
+ 170809200000,
+ 181090800000,
+ 202258800000,
+ 212540400000,
+ 233103600000,
+ 243990000000,
+ 265158000000,
+ 276044400000,
+ 296607600000,
+ 307494000000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/Sarajevo",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -905824800000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -777942000000,
+ -766623600000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/Saratov",
+ "abbrs": [
+ "LMT",
+ "+03",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04"
+ ],
+ "untils": [
+ -1593820800000,
+ -1247540400000,
+ 354916800000,
+ 370724400000,
+ 386452800000,
+ 402260400000,
+ 417988800000,
+ 433796400000,
+ 449611200000,
+ 465343200000,
+ 481068000000,
+ 496792800000,
+ 512517600000,
+ 528242400000,
+ 543967200000,
+ 559692000000,
+ 591145200000,
+ 606870000000,
+ 622594800000,
+ 638319600000,
+ 654649200000,
+ 670374000000,
+ 717548400000,
+ 733273200000,
+ 748998000000,
+ 764722800000,
+ 780447600000,
+ 796172400000,
+ 811897200000,
+ 828226800000,
+ 846370800000,
+ 859676400000,
+ 877820400000,
+ 891126000000,
+ 909270000000,
+ 922575600000,
+ 941324400000,
+ 954025200000,
+ 972774000000,
+ 985474800000,
+ 1004223600000,
+ 1017529200000,
+ 1035673200000,
+ 1048978800000,
+ 1067122800000,
+ 1080428400000,
+ 1099177200000,
+ 1111878000000,
+ 1130626800000,
+ 1143327600000,
+ 1162076400000,
+ 1174777200000,
+ 1193526000000,
+ 1206831600000,
+ 1224975600000,
+ 1238281200000,
+ 1256425200000,
+ 1269730800000,
+ 1288479600000,
+ 1301180400000,
+ 1414274400000,
+ 1480806000000,
+ null
+ ],
+ "offsets": [
+ -184.3,
+ -180,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/Simferopol",
+ "abbrs": [
+ "SMT",
+ "EET",
+ "MSK",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "MSK",
+ "MSK"
+ ],
+ "untils": [
+ -1441160160000,
+ -1247536800000,
+ -888894000000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -811648800000,
+ 354920400000,
+ 370728000000,
+ 386456400000,
+ 402264000000,
+ 417992400000,
+ 433800000000,
+ 449614800000,
+ 465346800000,
+ 481071600000,
+ 496796400000,
+ 512521200000,
+ 528246000000,
+ 543970800000,
+ 559695600000,
+ 575420400000,
+ 591145200000,
+ 606870000000,
+ 622594800000,
+ 646786800000,
+ 701820000000,
+ 717541200000,
+ 733269600000,
+ 748990800000,
+ 764719200000,
+ 767739600000,
+ 780436800000,
+ 796165200000,
+ 811886400000,
+ 828219600000,
+ 846374400000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396137600000,
+ 1414274400000,
+ null
+ ],
+ "offsets": [
+ -136,
+ -120,
+ -180,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -240,
+ -180
+ ],
+ "population": 331936
+ },
+ {
+ "name": "Europe/Skopje",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -905824800000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -777942000000,
+ -766623600000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/Sofia",
+ "abbrs": [
+ "EET",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -781048800000,
+ 291762000000,
+ 307576800000,
+ 323816400000,
+ 339026400000,
+ 355266000000,
+ 370393200000,
+ 386715600000,
+ 401846400000,
+ 417571200000,
+ 433296000000,
+ 449020800000,
+ 465350400000,
+ 481075200000,
+ 496800000000,
+ 512524800000,
+ 528249600000,
+ 543974400000,
+ 559699200000,
+ 575424000000,
+ 591148800000,
+ 606873600000,
+ 622598400000,
+ 638323200000,
+ 654652800000,
+ 670370400000,
+ 686091600000,
+ 701820000000,
+ 717541200000,
+ 733269600000,
+ 748990800000,
+ 764719200000,
+ 780440400000,
+ 796168800000,
+ 811890000000,
+ 828223200000,
+ 846363600000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 1195000
+ },
+ {
+ "name": "Europe/Stockholm",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1692496800000,
+ -1680483600000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 1484000
+ },
+ {
+ "name": "Europe/Tallinn",
+ "abbrs": [
+ "TMT",
+ "CET",
+ "CEST",
+ "CET",
+ "TMT",
+ "EET",
+ "MSK",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -1638322740000,
+ -1632006000000,
+ -1618700400000,
+ -1593824400000,
+ -1535938740000,
+ -927943200000,
+ -892954800000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -797652000000,
+ 354920400000,
+ 370728000000,
+ 386456400000,
+ 402264000000,
+ 417992400000,
+ 433800000000,
+ 449614800000,
+ 465346800000,
+ 481071600000,
+ 496796400000,
+ 512521200000,
+ 528246000000,
+ 543970800000,
+ 559695600000,
+ 575420400000,
+ 591145200000,
+ 606870000000,
+ 622598400000,
+ 638323200000,
+ 654652800000,
+ 670377600000,
+ 686102400000,
+ 701827200000,
+ 717552000000,
+ 733276800000,
+ 749001600000,
+ 764726400000,
+ 780451200000,
+ 796176000000,
+ 811900800000,
+ 828230400000,
+ 846374400000,
+ 859680000000,
+ 877824000000,
+ 891129600000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -99,
+ -60,
+ -120,
+ -60,
+ -99,
+ -120,
+ -180,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 407947
+ },
+ {
+ "name": "Europe/Tirane",
+ "abbrs": [
+ "LMT",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1767230360000,
+ -932346000000,
+ -857257200000,
+ -844556400000,
+ -843519600000,
+ 136854000000,
+ 149896800000,
+ 168130800000,
+ 181432800000,
+ 199839600000,
+ 213141600000,
+ 231894000000,
+ 244591200000,
+ 263257200000,
+ 276040800000,
+ 294706800000,
+ 307490400000,
+ 326156400000,
+ 339458400000,
+ 357087600000,
+ 370389600000,
+ 389142000000,
+ 402444000000,
+ 419468400000,
+ 433807200000,
+ 449622000000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -79.3333,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 418495
+ },
+ {
+ "name": "Europe/Tiraspol",
+ "abbrs": [
+ "CMT",
+ "BMT",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -1637114100000,
+ -1213148664000,
+ -1187056800000,
+ -1175479200000,
+ -1159754400000,
+ -1144029600000,
+ -1127700000000,
+ -1111975200000,
+ -1096250400000,
+ -1080525600000,
+ -1064800800000,
+ -1049076000000,
+ -1033351200000,
+ -1017626400000,
+ -1001901600000,
+ -986176800000,
+ -970452000000,
+ -954727200000,
+ -927165600000,
+ -898138800000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -800157600000,
+ 354920400000,
+ 370728000000,
+ 386456400000,
+ 402264000000,
+ 417992400000,
+ 433800000000,
+ 449614800000,
+ 465346800000,
+ 481071600000,
+ 496796400000,
+ 512521200000,
+ 528246000000,
+ 543970800000,
+ 559695600000,
+ 575420400000,
+ 591145200000,
+ 606870000000,
+ 622594800000,
+ 638319600000,
+ 641944800000,
+ 654652800000,
+ 670377600000,
+ 686102400000,
+ 701820000000,
+ 717541200000,
+ 733269600000,
+ 748990800000,
+ 764719200000,
+ 780440400000,
+ 796168800000,
+ 811890000000,
+ 828223200000,
+ 846363600000,
+ 859680000000,
+ 877824000000,
+ 891129600000,
+ 909273600000,
+ 922579200000,
+ 941328000000,
+ 954028800000,
+ 972777600000,
+ 985478400000,
+ 1004227200000,
+ 1017532800000,
+ 1035676800000,
+ 1048982400000,
+ 1067126400000,
+ 1080432000000,
+ 1099180800000,
+ 1111881600000,
+ 1130630400000,
+ 1143331200000,
+ 1162080000000,
+ 1174780800000,
+ 1193529600000,
+ 1206835200000,
+ 1224979200000,
+ 1238284800000,
+ 1256428800000,
+ 1269734400000,
+ 1288483200000,
+ 1301184000000,
+ 1319932800000,
+ 1332633600000,
+ 1351382400000,
+ 1364688000000,
+ 1382832000000,
+ 1396137600000,
+ 1414281600000,
+ 1427587200000,
+ 1445731200000,
+ 1459036800000,
+ 1477785600000,
+ 1490486400000,
+ 1509235200000,
+ 1521936000000,
+ 1540684800000,
+ 1553990400000,
+ 1572134400000,
+ 1585440000000,
+ 1603584000000,
+ 1616889600000,
+ 1635638400000,
+ 1648339200000,
+ 1667088000000,
+ 1679788800000,
+ 1698537600000,
+ 1711843200000,
+ 1729987200000,
+ 1743292800000,
+ 1761436800000,
+ 1774742400000,
+ 1792886400000,
+ 1806192000000,
+ 1824940800000,
+ 1837641600000,
+ 1856390400000,
+ 1869091200000,
+ 1887840000000,
+ 1901145600000,
+ 1919289600000,
+ 1932595200000,
+ 1950739200000,
+ 1964044800000,
+ 1982793600000,
+ 1995494400000,
+ 2014243200000,
+ 2026944000000,
+ 2045692800000,
+ 2058393600000,
+ 2077142400000,
+ 2090448000000,
+ 2108592000000,
+ 2121897600000,
+ 2140041600000,
+ null
+ ],
+ "offsets": [
+ -115,
+ -104.4,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/Ulyanovsk",
+ "abbrs": [
+ "LMT",
+ "+03",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+02",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04"
+ ],
+ "untils": [
+ -1593820800000,
+ -1247540400000,
+ 354916800000,
+ 370724400000,
+ 386452800000,
+ 402260400000,
+ 417988800000,
+ 433796400000,
+ 449611200000,
+ 465343200000,
+ 481068000000,
+ 496792800000,
+ 512517600000,
+ 528242400000,
+ 543967200000,
+ 559692000000,
+ 575416800000,
+ 591141600000,
+ 622594800000,
+ 638319600000,
+ 654649200000,
+ 686102400000,
+ 695779200000,
+ 701823600000,
+ 717548400000,
+ 733273200000,
+ 748998000000,
+ 764722800000,
+ 780447600000,
+ 796172400000,
+ 811897200000,
+ 828226800000,
+ 846370800000,
+ 859676400000,
+ 877820400000,
+ 891126000000,
+ 909270000000,
+ 922575600000,
+ 941324400000,
+ 954025200000,
+ 972774000000,
+ 985474800000,
+ 1004223600000,
+ 1017529200000,
+ 1035673200000,
+ 1048978800000,
+ 1067122800000,
+ 1080428400000,
+ 1099177200000,
+ 1111878000000,
+ 1130626800000,
+ 1143327600000,
+ 1162076400000,
+ 1174777200000,
+ 1193526000000,
+ 1206831600000,
+ 1224975600000,
+ 1238281200000,
+ 1256425200000,
+ 1269730800000,
+ 1288479600000,
+ 1301180400000,
+ 1414274400000,
+ 1459033200000,
+ null
+ ],
+ "offsets": [
+ -193.6,
+ -180,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -180,
+ -240,
+ -180,
+ -120,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/Uzhgorod",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "CET",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -938905200000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -794714400000,
+ -773456400000,
+ 354920400000,
+ 370728000000,
+ 386456400000,
+ 402264000000,
+ 417992400000,
+ 433800000000,
+ 449614800000,
+ 465346800000,
+ 481071600000,
+ 496796400000,
+ 512521200000,
+ 528246000000,
+ 543970800000,
+ 559695600000,
+ 575420400000,
+ 591145200000,
+ 606870000000,
+ 622594800000,
+ 646786800000,
+ 670384800000,
+ 701820000000,
+ 717541200000,
+ 733269600000,
+ 748990800000,
+ 764719200000,
+ 780440400000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -60,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 114789
+ },
+ {
+ "name": "Europe/Vaduz",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -904435200000,
+ -891129600000,
+ -872985600000,
+ -859680000000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/Vatican",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1690765200000,
+ -1680487200000,
+ -1664758800000,
+ -1648951200000,
+ -1635123600000,
+ -1616896800000,
+ -1604278800000,
+ -1585533600000,
+ -1571014800000,
+ -1555293600000,
+ -932432400000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -798073200000,
+ -781052400000,
+ -766717200000,
+ -750898800000,
+ -733359600000,
+ -719456400000,
+ -701917200000,
+ -689209200000,
+ -670460400000,
+ -114051600000,
+ -103168800000,
+ -81997200000,
+ -71715600000,
+ -50547600000,
+ -40266000000,
+ -18493200000,
+ -8211600000,
+ 12956400000,
+ 23238000000,
+ 43801200000,
+ 54687600000,
+ 75855600000,
+ 86742000000,
+ 107910000000,
+ 118191600000,
+ 138754800000,
+ 149641200000,
+ 170809200000,
+ 181090800000,
+ 202258800000,
+ 212540400000,
+ 233103600000,
+ 243990000000,
+ 265158000000,
+ 276044400000,
+ 296607600000,
+ 307494000000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/Vienna",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1693706400000,
+ -1680483600000,
+ -1663455600000,
+ -1650150000000,
+ -1632006000000,
+ -1618700400000,
+ -1569711600000,
+ -1555801200000,
+ -938905200000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -781052400000,
+ -780188400000,
+ -748479600000,
+ -733359600000,
+ -717634800000,
+ -701910000000,
+ -684975600000,
+ -670460400000,
+ 323823600000,
+ 338940000000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 1763000
+ },
+ {
+ "name": "Europe/Vilnius",
+ "abbrs": [
+ "WMT",
+ "KMT",
+ "CET",
+ "EET",
+ "CET",
+ "MSK",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "CEST",
+ "CET",
+ "CEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -1672536240000,
+ -1585100136000,
+ -1561251600000,
+ -1553565600000,
+ -928198800000,
+ -900126000000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -802144800000,
+ 354920400000,
+ 370728000000,
+ 386456400000,
+ 402264000000,
+ 417992400000,
+ 433800000000,
+ 449614800000,
+ 465346800000,
+ 481071600000,
+ 496796400000,
+ 512521200000,
+ 528246000000,
+ 543970800000,
+ 559695600000,
+ 575420400000,
+ 591145200000,
+ 606870000000,
+ 622598400000,
+ 638323200000,
+ 654652800000,
+ 670377600000,
+ 686102400000,
+ 701827200000,
+ 717552000000,
+ 733276800000,
+ 749001600000,
+ 764726400000,
+ 780451200000,
+ 796176000000,
+ 811900800000,
+ 828230400000,
+ 846374400000,
+ 859680000000,
+ 877824000000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -84,
+ -95.6,
+ -60,
+ -120,
+ -60,
+ -180,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -120,
+ -60,
+ -120,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 535216
+ },
+ {
+ "name": "Europe/Volgograd",
+ "abbrs": [
+ "LMT",
+ "+03",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03"
+ ],
+ "untils": [
+ -1577761060000,
+ -1247540400000,
+ 354916800000,
+ 370724400000,
+ 386452800000,
+ 402260400000,
+ 417988800000,
+ 433796400000,
+ 449611200000,
+ 465343200000,
+ 481068000000,
+ 496792800000,
+ 512517600000,
+ 528242400000,
+ 543967200000,
+ 559692000000,
+ 591145200000,
+ 606870000000,
+ 622594800000,
+ 638319600000,
+ 654649200000,
+ 670374000000,
+ 717548400000,
+ 733273200000,
+ 748998000000,
+ 764722800000,
+ 780447600000,
+ 796172400000,
+ 811897200000,
+ 828226800000,
+ 846370800000,
+ 859676400000,
+ 877820400000,
+ 891126000000,
+ 909270000000,
+ 922575600000,
+ 941324400000,
+ 954025200000,
+ 972774000000,
+ 985474800000,
+ 1004223600000,
+ 1017529200000,
+ 1035673200000,
+ 1048978800000,
+ 1067122800000,
+ 1080428400000,
+ 1099177200000,
+ 1111878000000,
+ 1130626800000,
+ 1143327600000,
+ 1162076400000,
+ 1174777200000,
+ 1193526000000,
+ 1206831600000,
+ 1224975600000,
+ 1238281200000,
+ 1256425200000,
+ 1269730800000,
+ 1288479600000,
+ 1301180400000,
+ 1414274400000,
+ null
+ ],
+ "offsets": [
+ -177.6667,
+ -180,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180
+ ],
+ "population": 1019000
+ },
+ {
+ "name": "Europe/Warsaw",
+ "abbrs": [
+ "WMT",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "EET",
+ "EEST",
+ "EET",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1717032240000,
+ -1693706400000,
+ -1680483600000,
+ -1663455600000,
+ -1650150000000,
+ -1632006000000,
+ -1618700400000,
+ -1600473600000,
+ -1587168000000,
+ -1501725600000,
+ -931734000000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796608000000,
+ -778726800000,
+ -762660000000,
+ -748486800000,
+ -733273200000,
+ -715215600000,
+ -701910000000,
+ -684975600000,
+ -670460400000,
+ -654130800000,
+ -639010800000,
+ -397094400000,
+ -386812800000,
+ -371088000000,
+ -355363200000,
+ -334195200000,
+ -323308800000,
+ -307584000000,
+ -291859200000,
+ -271296000000,
+ -260409600000,
+ -239846400000,
+ -228960000000,
+ -208396800000,
+ -197510400000,
+ -176342400000,
+ -166060800000,
+ 228873600000,
+ 243993600000,
+ 260323200000,
+ 276048000000,
+ 291772800000,
+ 307497600000,
+ 323827200000,
+ 338947200000,
+ 354672000000,
+ 370396800000,
+ 386121600000,
+ 401846400000,
+ 417571200000,
+ 433296000000,
+ 449020800000,
+ 465350400000,
+ 481075200000,
+ 496800000000,
+ 512524800000,
+ 528249600000,
+ 543974400000,
+ 559699200000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -84,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -120,
+ -180,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 1720000
+ },
+ {
+ "name": "Europe/Zagreb",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -905824800000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -777942000000,
+ -766623600000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Europe/Zaporozhye",
+ "abbrs": [
+ "+0220",
+ "EET",
+ "MSK",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET"
+ ],
+ "untils": [
+ -1441160400000,
+ -1247536800000,
+ -894769200000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -826419600000,
+ 354920400000,
+ 370728000000,
+ 386456400000,
+ 402264000000,
+ 417992400000,
+ 433800000000,
+ 449614800000,
+ 465346800000,
+ 481071600000,
+ 496796400000,
+ 512521200000,
+ 528246000000,
+ 543970800000,
+ 559695600000,
+ 575420400000,
+ 591145200000,
+ 606870000000,
+ 622594800000,
+ 638319600000,
+ 654649200000,
+ 670374000000,
+ 686091600000,
+ 701820000000,
+ 717541200000,
+ 733269600000,
+ 748990800000,
+ 764719200000,
+ 780440400000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -140,
+ -120,
+ -180,
+ -120,
+ -60,
+ -120,
+ -60,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 766736
+ },
+ {
+ "name": "Europe/Zurich",
+ "abbrs": [
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -904435200000,
+ -891129600000,
+ -872985600000,
+ -859680000000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 378884
+ },
+ {
+ "name": "GB-Eire",
+ "abbrs": [
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "BDST",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT"
+ ],
+ "untils": [
+ -1691964000000,
+ -1680472800000,
+ -1664143200000,
+ -1650146400000,
+ -1633903200000,
+ -1617487200000,
+ -1601848800000,
+ -1586037600000,
+ -1570399200000,
+ -1552168800000,
+ -1538344800000,
+ -1522533600000,
+ -1507500000000,
+ -1490565600000,
+ -1473631200000,
+ -1460930400000,
+ -1442786400000,
+ -1428876000000,
+ -1410732000000,
+ -1396216800000,
+ -1379282400000,
+ -1364767200000,
+ -1348437600000,
+ -1333317600000,
+ -1315778400000,
+ -1301263200000,
+ -1284328800000,
+ -1269813600000,
+ -1253484000000,
+ -1238364000000,
+ -1221429600000,
+ -1206914400000,
+ -1189980000000,
+ -1175464800000,
+ -1159135200000,
+ -1143410400000,
+ -1126476000000,
+ -1111960800000,
+ -1095631200000,
+ -1080511200000,
+ -1063576800000,
+ -1049061600000,
+ -1032127200000,
+ -1017612000000,
+ -1001282400000,
+ -986162400000,
+ -969228000000,
+ -950479200000,
+ -942012000000,
+ -904518000000,
+ -896050800000,
+ -875487600000,
+ -864601200000,
+ -844038000000,
+ -832546800000,
+ -812588400000,
+ -798073200000,
+ -781052400000,
+ -772066800000,
+ -764805600000,
+ -748476000000,
+ -733356000000,
+ -719445600000,
+ -717030000000,
+ -706748400000,
+ -699487200000,
+ -687996000000,
+ -668037600000,
+ -654732000000,
+ -636588000000,
+ -622072800000,
+ -605743200000,
+ -590623200000,
+ -574293600000,
+ -558568800000,
+ -542239200000,
+ -527119200000,
+ -512604000000,
+ -496274400000,
+ -481154400000,
+ -464220000000,
+ -449704800000,
+ -432165600000,
+ -417650400000,
+ -401320800000,
+ -386200800000,
+ -369266400000,
+ -354751200000,
+ -337816800000,
+ -323301600000,
+ -306972000000,
+ -291852000000,
+ -276732000000,
+ -257983200000,
+ -245282400000,
+ -226533600000,
+ -213228000000,
+ -195084000000,
+ -182383200000,
+ -163634400000,
+ -150933600000,
+ -132184800000,
+ -119484000000,
+ -100735200000,
+ -88034400000,
+ -68680800000,
+ -59004000000,
+ 57722400000,
+ 69818400000,
+ 89172000000,
+ 101268000000,
+ 120621600000,
+ 132717600000,
+ 152071200000,
+ 164167200000,
+ 183520800000,
+ 196221600000,
+ 214970400000,
+ 227671200000,
+ 246420000000,
+ 259120800000,
+ 278474400000,
+ 290570400000,
+ 309924000000,
+ 322020000000,
+ 341373600000,
+ 354675600000,
+ 372819600000,
+ 386125200000,
+ 404269200000,
+ 417574800000,
+ 435718800000,
+ 449024400000,
+ 467773200000,
+ 481078800000,
+ 499222800000,
+ 512528400000,
+ 530672400000,
+ 543978000000,
+ 562122000000,
+ 575427600000,
+ 593571600000,
+ 606877200000,
+ 625626000000,
+ 638326800000,
+ 657075600000,
+ 670381200000,
+ 688525200000,
+ 701830800000,
+ 719974800000,
+ 733280400000,
+ 751424400000,
+ 764730000000,
+ 782874000000,
+ 796179600000,
+ 814323600000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "GB",
+ "abbrs": [
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "BDST",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "BDST",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT",
+ "BST",
+ "GMT"
+ ],
+ "untils": [
+ -1691964000000,
+ -1680472800000,
+ -1664143200000,
+ -1650146400000,
+ -1633903200000,
+ -1617487200000,
+ -1601848800000,
+ -1586037600000,
+ -1570399200000,
+ -1552168800000,
+ -1538344800000,
+ -1522533600000,
+ -1507500000000,
+ -1490565600000,
+ -1473631200000,
+ -1460930400000,
+ -1442786400000,
+ -1428876000000,
+ -1410732000000,
+ -1396216800000,
+ -1379282400000,
+ -1364767200000,
+ -1348437600000,
+ -1333317600000,
+ -1315778400000,
+ -1301263200000,
+ -1284328800000,
+ -1269813600000,
+ -1253484000000,
+ -1238364000000,
+ -1221429600000,
+ -1206914400000,
+ -1189980000000,
+ -1175464800000,
+ -1159135200000,
+ -1143410400000,
+ -1126476000000,
+ -1111960800000,
+ -1095631200000,
+ -1080511200000,
+ -1063576800000,
+ -1049061600000,
+ -1032127200000,
+ -1017612000000,
+ -1001282400000,
+ -986162400000,
+ -969228000000,
+ -950479200000,
+ -942012000000,
+ -904518000000,
+ -896050800000,
+ -875487600000,
+ -864601200000,
+ -844038000000,
+ -832546800000,
+ -812588400000,
+ -798073200000,
+ -781052400000,
+ -772066800000,
+ -764805600000,
+ -748476000000,
+ -733356000000,
+ -719445600000,
+ -717030000000,
+ -706748400000,
+ -699487200000,
+ -687996000000,
+ -668037600000,
+ -654732000000,
+ -636588000000,
+ -622072800000,
+ -605743200000,
+ -590623200000,
+ -574293600000,
+ -558568800000,
+ -542239200000,
+ -527119200000,
+ -512604000000,
+ -496274400000,
+ -481154400000,
+ -464220000000,
+ -449704800000,
+ -432165600000,
+ -417650400000,
+ -401320800000,
+ -386200800000,
+ -369266400000,
+ -354751200000,
+ -337816800000,
+ -323301600000,
+ -306972000000,
+ -291852000000,
+ -276732000000,
+ -257983200000,
+ -245282400000,
+ -226533600000,
+ -213228000000,
+ -195084000000,
+ -182383200000,
+ -163634400000,
+ -150933600000,
+ -132184800000,
+ -119484000000,
+ -100735200000,
+ -88034400000,
+ -68680800000,
+ -59004000000,
+ 57722400000,
+ 69818400000,
+ 89172000000,
+ 101268000000,
+ 120621600000,
+ 132717600000,
+ 152071200000,
+ 164167200000,
+ 183520800000,
+ 196221600000,
+ 214970400000,
+ 227671200000,
+ 246420000000,
+ 259120800000,
+ 278474400000,
+ 290570400000,
+ 309924000000,
+ 322020000000,
+ 341373600000,
+ 354675600000,
+ 372819600000,
+ 386125200000,
+ 404269200000,
+ 417574800000,
+ 435718800000,
+ 449024400000,
+ 467773200000,
+ 481078800000,
+ 499222800000,
+ 512528400000,
+ 530672400000,
+ 543978000000,
+ 562122000000,
+ 575427600000,
+ 593571600000,
+ 606877200000,
+ 625626000000,
+ 638326800000,
+ 657075600000,
+ 670381200000,
+ 688525200000,
+ 701830800000,
+ 719974800000,
+ 733280400000,
+ 751424400000,
+ 764730000000,
+ 782874000000,
+ 796179600000,
+ 814323600000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "GMT-0",
+ "abbrs": [
+ "GMT"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "GMT",
+ "abbrs": [
+ "GMT"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "GMT+0",
+ "abbrs": [
+ "GMT"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "GMT0",
+ "abbrs": [
+ "GMT"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Greenwich",
+ "abbrs": [
+ "GMT"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Hongkong",
+ "abbrs": [
+ "LMT",
+ "HKT",
+ "HKST",
+ "HKT",
+ "JST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT",
+ "HKST",
+ "HKT"
+ ],
+ "untils": [
+ -2056693002000,
+ -907389000000,
+ -891667800000,
+ -884246400000,
+ -766746000000,
+ -747981000000,
+ -728544600000,
+ -717049800000,
+ -694503000000,
+ -683785800000,
+ -668064600000,
+ -654755400000,
+ -636615000000,
+ -623305800000,
+ -605165400000,
+ -591856200000,
+ -573715800000,
+ -559801800000,
+ -542352600000,
+ -528352200000,
+ -510211800000,
+ -498112200000,
+ -478762200000,
+ -466662600000,
+ -446707800000,
+ -435213000000,
+ -415258200000,
+ -403158600000,
+ -383808600000,
+ -371709000000,
+ -352359000000,
+ -340259400000,
+ -320909400000,
+ -308809800000,
+ -288855000000,
+ -277360200000,
+ -257405400000,
+ -245910600000,
+ -225955800000,
+ -213856200000,
+ -194506200000,
+ -182406600000,
+ -163056600000,
+ -148537800000,
+ -132816600000,
+ -117088200000,
+ -101367000000,
+ -85638600000,
+ -69312600000,
+ -53584200000,
+ -37863000000,
+ -22134600000,
+ -6413400000,
+ 9315000000,
+ 25036200000,
+ 40764600000,
+ 56485800000,
+ 72214200000,
+ 88540200000,
+ 104268600000,
+ 119989800000,
+ 126041400000,
+ 151439400000,
+ 167167800000,
+ 182889000000,
+ 198617400000,
+ 214338600000,
+ 295385400000,
+ 309292200000,
+ null
+ ],
+ "offsets": [
+ -456.7,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 0
+ },
+ {
+ "name": "HST",
+ "abbrs": [
+ "HST"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 600
+ ],
+ "population": 0
+ },
+ {
+ "name": "Iceland",
+ "abbrs": [
+ "LMT",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "+00",
+ "-01",
+ "GMT"
+ ],
+ "untils": [
+ -1956609120000,
+ -1668211200000,
+ -1647212400000,
+ -1636675200000,
+ -1613430000000,
+ -1605139200000,
+ -1581894000000,
+ -1539561600000,
+ -1531350000000,
+ -968025600000,
+ -952293600000,
+ -942008400000,
+ -920239200000,
+ -909957600000,
+ -888789600000,
+ -877903200000,
+ -857944800000,
+ -846453600000,
+ -826495200000,
+ -815004000000,
+ -795045600000,
+ -783554400000,
+ -762991200000,
+ -752104800000,
+ -731541600000,
+ -717631200000,
+ -700092000000,
+ -686181600000,
+ -668642400000,
+ -654732000000,
+ -636588000000,
+ -623282400000,
+ -605743200000,
+ -591832800000,
+ -573688800000,
+ -559778400000,
+ -542239200000,
+ -528328800000,
+ -510789600000,
+ -496879200000,
+ -479340000000,
+ -465429600000,
+ -447890400000,
+ -433980000000,
+ -415836000000,
+ -401925600000,
+ -384386400000,
+ -370476000000,
+ -352936800000,
+ -339026400000,
+ -321487200000,
+ -307576800000,
+ -290037600000,
+ -276127200000,
+ -258588000000,
+ -244677600000,
+ -226533600000,
+ -212623200000,
+ -195084000000,
+ -181173600000,
+ -163634400000,
+ -149724000000,
+ -132184800000,
+ -118274400000,
+ -100735200000,
+ -86824800000,
+ -68680800000,
+ -54770400000,
+ null
+ ],
+ "offsets": [
+ 88,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0,
+ 60,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Indian/Antananarivo",
+ "abbrs": [
+ "LMT",
+ "EAT",
+ "+0230",
+ "+0245",
+ "EAT"
+ ],
+ "untils": [
+ -1309746436000,
+ -1262314800000,
+ -946780200000,
+ -315629100000,
+ null
+ ],
+ "offsets": [
+ -147.2667,
+ -180,
+ -150,
+ -165,
+ -180
+ ],
+ "population": 0
+ },
+ {
+ "name": "Indian/Chagos",
+ "abbrs": [
+ "LMT",
+ "+05",
+ "+06"
+ ],
+ "untils": [
+ -1988167780000,
+ 820436400000,
+ null
+ ],
+ "offsets": [
+ -289.6667,
+ -300,
+ -360
+ ],
+ "population": 3000
+ },
+ {
+ "name": "Indian/Christmas",
+ "abbrs": [
+ "+07"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -420
+ ],
+ "population": 2072
+ },
+ {
+ "name": "Indian/Cocos",
+ "abbrs": [
+ "+0630"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -390
+ ],
+ "population": 596
+ },
+ {
+ "name": "Indian/Comoro",
+ "abbrs": [
+ "LMT",
+ "EAT",
+ "+0230",
+ "+0245",
+ "EAT"
+ ],
+ "untils": [
+ -1309746436000,
+ -1262314800000,
+ -946780200000,
+ -315629100000,
+ null
+ ],
+ "offsets": [
+ -147.2667,
+ -180,
+ -150,
+ -165,
+ -180
+ ],
+ "population": 0
+ },
+ {
+ "name": "Indian/Kerguelen",
+ "abbrs": [
+ "-00",
+ "+05"
+ ],
+ "untils": [
+ -631152000000,
+ null
+ ],
+ "offsets": [
+ 0,
+ -300
+ ],
+ "population": 130
+ },
+ {
+ "name": "Indian/Mahe",
+ "abbrs": [
+ "LMT",
+ "+04"
+ ],
+ "untils": [
+ -2006653308000,
+ null
+ ],
+ "offsets": [
+ -221.8,
+ -240
+ ],
+ "population": 78539
+ },
+ {
+ "name": "Indian/Maldives",
+ "abbrs": [
+ "MMT",
+ "+05"
+ ],
+ "untils": [
+ -315636840000,
+ null
+ ],
+ "offsets": [
+ -294,
+ -300
+ ],
+ "population": 345023
+ },
+ {
+ "name": "Indian/Mauritius",
+ "abbrs": [
+ "LMT",
+ "+04",
+ "+05",
+ "+04",
+ "+05",
+ "+04"
+ ],
+ "untils": [
+ -1988164200000,
+ 403041600000,
+ 417034800000,
+ 1224972000000,
+ 1238274000000,
+ null
+ ],
+ "offsets": [
+ -230,
+ -240,
+ -300,
+ -240,
+ -300,
+ -240
+ ],
+ "population": 148001
+ },
+ {
+ "name": "Indian/Mayotte",
+ "abbrs": [
+ "LMT",
+ "EAT",
+ "+0230",
+ "+0245",
+ "EAT"
+ ],
+ "untils": [
+ -1309746436000,
+ -1262314800000,
+ -946780200000,
+ -315629100000,
+ null
+ ],
+ "offsets": [
+ -147.2667,
+ -180,
+ -150,
+ -165,
+ -180
+ ],
+ "population": 0
+ },
+ {
+ "name": "Indian/Reunion",
+ "abbrs": [
+ "LMT",
+ "+04"
+ ],
+ "untils": [
+ -1848886912000,
+ null
+ ],
+ "offsets": [
+ -221.8667,
+ -240
+ ],
+ "population": 843617
+ },
+ {
+ "name": "Iran",
+ "abbrs": [
+ "LMT",
+ "TMT",
+ "+0330",
+ "+04",
+ "+05",
+ "+04",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330",
+ "+0430",
+ "+0330"
+ ],
+ "untils": [
+ -1704165944000,
+ -757394744000,
+ 247177800000,
+ 259272000000,
+ 277758000000,
+ 283982400000,
+ 290809800000,
+ 306531000000,
+ 322432200000,
+ 338499000000,
+ 673216200000,
+ 685481400000,
+ 701209800000,
+ 717103800000,
+ 732745800000,
+ 748639800000,
+ 764281800000,
+ 780175800000,
+ 795817800000,
+ 811711800000,
+ 827353800000,
+ 843247800000,
+ 858976200000,
+ 874870200000,
+ 890512200000,
+ 906406200000,
+ 922048200000,
+ 937942200000,
+ 953584200000,
+ 969478200000,
+ 985206600000,
+ 1001100600000,
+ 1016742600000,
+ 1032636600000,
+ 1048278600000,
+ 1064172600000,
+ 1079814600000,
+ 1095708600000,
+ 1111437000000,
+ 1127331000000,
+ 1206045000000,
+ 1221939000000,
+ 1237667400000,
+ 1253561400000,
+ 1269203400000,
+ 1285097400000,
+ 1300739400000,
+ 1316633400000,
+ 1332275400000,
+ 1348169400000,
+ 1363897800000,
+ 1379791800000,
+ 1395433800000,
+ 1411327800000,
+ 1426969800000,
+ 1442863800000,
+ 1458505800000,
+ 1474399800000,
+ 1490128200000,
+ 1506022200000,
+ 1521664200000,
+ 1537558200000,
+ 1553200200000,
+ 1569094200000,
+ 1584736200000,
+ 1600630200000,
+ 1616358600000,
+ 1632252600000,
+ 1647894600000,
+ 1663788600000,
+ 1679430600000,
+ 1695324600000,
+ 1710966600000,
+ 1726860600000,
+ 1742589000000,
+ 1758483000000,
+ 1774125000000,
+ 1790019000000,
+ 1805661000000,
+ 1821555000000,
+ 1837197000000,
+ 1853091000000,
+ 1868733000000,
+ 1884627000000,
+ 1900355400000,
+ 1916249400000,
+ 1931891400000,
+ 1947785400000,
+ 1963427400000,
+ 1979321400000,
+ 1994963400000,
+ 2010857400000,
+ 2026585800000,
+ 2042479800000,
+ 2058121800000,
+ 2074015800000,
+ 2089657800000,
+ 2105551800000,
+ 2121193800000,
+ 2137087800000,
+ null
+ ],
+ "offsets": [
+ -205.7333,
+ -205.7333,
+ -210,
+ -240,
+ -300,
+ -240,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210,
+ -270,
+ -210
+ ],
+ "population": 0
+ },
+ {
+ "name": "Israel",
+ "abbrs": [
+ "JMT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDDT",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST",
+ "IDT",
+ "IST"
+ ],
+ "untils": [
+ -1641003640000,
+ -933645600000,
+ -857358000000,
+ -844300800000,
+ -825822000000,
+ -812685600000,
+ -794199600000,
+ -779853600000,
+ -762656400000,
+ -748310400000,
+ -731127600000,
+ -681962400000,
+ -673243200000,
+ -667962000000,
+ -652327200000,
+ -636426000000,
+ -622087200000,
+ -608947200000,
+ -591847200000,
+ -572486400000,
+ -558576000000,
+ -542851200000,
+ -527731200000,
+ -514425600000,
+ -490845600000,
+ -482986800000,
+ -459475200000,
+ -451537200000,
+ -428551200000,
+ -418262400000,
+ -400032000000,
+ -387428400000,
+ 142380000000,
+ 150843600000,
+ 167176800000,
+ 178664400000,
+ 482277600000,
+ 495579600000,
+ 516751200000,
+ 526424400000,
+ 545436000000,
+ 558478800000,
+ 576626400000,
+ 589323600000,
+ 609890400000,
+ 620773200000,
+ 638316000000,
+ 651618000000,
+ 669765600000,
+ 683672400000,
+ 701820000000,
+ 715726800000,
+ 733701600000,
+ 747176400000,
+ 765151200000,
+ 778021200000,
+ 796600800000,
+ 810075600000,
+ 826840800000,
+ 842821200000,
+ 858895200000,
+ 874184400000,
+ 890344800000,
+ 905029200000,
+ 923011200000,
+ 936313200000,
+ 955670400000,
+ 970783200000,
+ 986770800000,
+ 1001282400000,
+ 1017356400000,
+ 1033941600000,
+ 1048806000000,
+ 1065132000000,
+ 1081292400000,
+ 1095804000000,
+ 1112313600000,
+ 1128812400000,
+ 1143763200000,
+ 1159657200000,
+ 1175212800000,
+ 1189897200000,
+ 1206662400000,
+ 1223161200000,
+ 1238112000000,
+ 1254006000000,
+ 1269561600000,
+ 1284246000000,
+ 1301616000000,
+ 1317510000000,
+ 1333065600000,
+ 1348354800000,
+ 1364515200000,
+ 1382828400000,
+ 1395964800000,
+ 1414278000000,
+ 1427414400000,
+ 1445727600000,
+ 1458864000000,
+ 1477782000000,
+ 1490313600000,
+ 1509231600000,
+ 1521763200000,
+ 1540681200000,
+ 1553817600000,
+ 1572130800000,
+ 1585267200000,
+ 1603580400000,
+ 1616716800000,
+ 1635634800000,
+ 1648166400000,
+ 1667084400000,
+ 1679616000000,
+ 1698534000000,
+ 1711670400000,
+ 1729983600000,
+ 1743120000000,
+ 1761433200000,
+ 1774569600000,
+ 1792882800000,
+ 1806019200000,
+ 1824937200000,
+ 1837468800000,
+ 1856386800000,
+ 1868918400000,
+ 1887836400000,
+ 1900972800000,
+ 1919286000000,
+ 1932422400000,
+ 1950735600000,
+ 1963872000000,
+ 1982790000000,
+ 1995321600000,
+ 2014239600000,
+ 2026771200000,
+ 2045689200000,
+ 2058220800000,
+ 2077138800000,
+ 2090275200000,
+ 2108588400000,
+ 2121724800000,
+ 2140038000000,
+ null
+ ],
+ "offsets": [
+ -140.6667,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -240,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120
+ ],
+ "population": 0
+ },
+ {
+ "name": "Jamaica",
+ "abbrs": [
+ "KMT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1827687170000,
+ 126687600000,
+ 152085600000,
+ 162370800000,
+ 183535200000,
+ 199263600000,
+ 215589600000,
+ 230713200000,
+ 247039200000,
+ 262767600000,
+ 278488800000,
+ 294217200000,
+ 309938400000,
+ 325666800000,
+ 341388000000,
+ 357116400000,
+ 372837600000,
+ 388566000000,
+ 404892000000,
+ 420015600000,
+ 436341600000,
+ null
+ ],
+ "offsets": [
+ 307.1667,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "Japan",
+ "abbrs": [
+ "JST",
+ "JDT",
+ "JST",
+ "JDT",
+ "JST",
+ "JDT",
+ "JST",
+ "JDT",
+ "JST"
+ ],
+ "untils": [
+ -683802000000,
+ -672314400000,
+ -654771600000,
+ -640864800000,
+ -620298000000,
+ -609415200000,
+ -588848400000,
+ -577965600000,
+ null
+ ],
+ "offsets": [
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540
+ ],
+ "population": 0
+ },
+ {
+ "name": "Kwajalein",
+ "abbrs": [
+ "+11",
+ "-12",
+ "+12"
+ ],
+ "untils": [
+ -7988400000,
+ 745848000000,
+ null
+ ],
+ "offsets": [
+ -660,
+ 720,
+ -720
+ ],
+ "population": 0
+ },
+ {
+ "name": "Libya",
+ "abbrs": [
+ "LMT",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "EET",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "EET",
+ "CET",
+ "CEST",
+ "EET",
+ "CET",
+ "CEST",
+ "EET"
+ ],
+ "untils": [
+ -1577926364000,
+ -574902000000,
+ -568087200000,
+ -512175600000,
+ -504928800000,
+ -449888400000,
+ -441856800000,
+ -347158800000,
+ 378684000000,
+ 386463600000,
+ 402271200000,
+ 417999600000,
+ 433807200000,
+ 449622000000,
+ 465429600000,
+ 481590000000,
+ 496965600000,
+ 512953200000,
+ 528674400000,
+ 544230000000,
+ 560037600000,
+ 575852400000,
+ 591660000000,
+ 607388400000,
+ 623196000000,
+ 641775600000,
+ 844034400000,
+ 860108400000,
+ 875916000000,
+ 1352505600000,
+ 1364515200000,
+ 1382659200000,
+ null
+ ],
+ "offsets": [
+ -52.7333,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -120,
+ -60,
+ -120,
+ -120
+ ],
+ "population": 0
+ },
+ {
+ "name": "MET",
+ "abbrs": [
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET",
+ "MEST",
+ "MET"
+ ],
+ "untils": [
+ -1693706400000,
+ -1680483600000,
+ -1663455600000,
+ -1650150000000,
+ -1632006000000,
+ -1618700400000,
+ -938905200000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796777200000,
+ -781052400000,
+ -766623600000,
+ 228877200000,
+ 243997200000,
+ 260326800000,
+ 276051600000,
+ 291776400000,
+ 307501200000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Mexico/BajaNorte",
+ "abbrs": [
+ "LMT",
+ "MST",
+ "PST",
+ "MST",
+ "PST",
+ "PDT",
+ "PST",
+ "PWT",
+ "PPT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST"
+ ],
+ "untils": [
+ -1514736000000,
+ -1451667600000,
+ -1343062800000,
+ -1234803600000,
+ -1222963200000,
+ -1207242000000,
+ -873820800000,
+ -769395600000,
+ -761677200000,
+ -686073600000,
+ -661539600000,
+ -495039600000,
+ -481734000000,
+ -463590000000,
+ -450284400000,
+ -431535600000,
+ -418230000000,
+ -400086000000,
+ -386780400000,
+ -368636400000,
+ -355330800000,
+ -337186800000,
+ -323881200000,
+ -305737200000,
+ -292431600000,
+ 199274400000,
+ 215600400000,
+ 230724000000,
+ 247050000000,
+ 262778400000,
+ 278499600000,
+ 294228000000,
+ 309949200000,
+ 325677600000,
+ 341398800000,
+ 357127200000,
+ 372848400000,
+ 388576800000,
+ 404902800000,
+ 420026400000,
+ 436352400000,
+ 452080800000,
+ 467802000000,
+ 483530400000,
+ 499251600000,
+ 514980000000,
+ 530701200000,
+ 544615200000,
+ 562150800000,
+ 576064800000,
+ 594205200000,
+ 607514400000,
+ 625654800000,
+ 638964000000,
+ 657104400000,
+ 671018400000,
+ 688554000000,
+ 702468000000,
+ 720003600000,
+ 733917600000,
+ 752058000000,
+ 765367200000,
+ 783507600000,
+ 796816800000,
+ 814957200000,
+ 828871200000,
+ 846406800000,
+ 860320800000,
+ 877856400000,
+ 891770400000,
+ 909306000000,
+ 923220000000,
+ 941360400000,
+ 954669600000,
+ 972810000000,
+ 986119200000,
+ 1004259600000,
+ 1018173600000,
+ 1035709200000,
+ 1049623200000,
+ 1067158800000,
+ 1081072800000,
+ 1099213200000,
+ 1112522400000,
+ 1130662800000,
+ 1143972000000,
+ 1162112400000,
+ 1175421600000,
+ 1193562000000,
+ 1207476000000,
+ 1225011600000,
+ 1238925600000,
+ 1256461200000,
+ 1268560800000,
+ 1289120400000,
+ 1300010400000,
+ 1320570000000,
+ 1331460000000,
+ 1352019600000,
+ 1362909600000,
+ 1383469200000,
+ 1394359200000,
+ 1414918800000,
+ 1425808800000,
+ 1446368400000,
+ 1457863200000,
+ 1478422800000,
+ 1489312800000,
+ 1509872400000,
+ 1520762400000,
+ 1541322000000,
+ 1552212000000,
+ 1572771600000,
+ 1583661600000,
+ 1604221200000,
+ 1615716000000,
+ 1636275600000,
+ 1647165600000,
+ 1667725200000,
+ 1678615200000,
+ 1699174800000,
+ 1710064800000,
+ 1730624400000,
+ 1741514400000,
+ 1762074000000,
+ 1772964000000,
+ 1793523600000,
+ 1805018400000,
+ 1825578000000,
+ 1836468000000,
+ 1857027600000,
+ 1867917600000,
+ 1888477200000,
+ 1899367200000,
+ 1919926800000,
+ 1930816800000,
+ 1951376400000,
+ 1962871200000,
+ 1983430800000,
+ 1994320800000,
+ 2014880400000,
+ 2025770400000,
+ 2046330000000,
+ 2057220000000,
+ 2077779600000,
+ 2088669600000,
+ 2109229200000,
+ 2120119200000,
+ 2140678800000,
+ null
+ ],
+ "offsets": [
+ 468.0667,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480
+ ],
+ "population": 0
+ },
+ {
+ "name": "Mexico/BajaSur",
+ "abbrs": [
+ "LMT",
+ "MST",
+ "CST",
+ "MST",
+ "CST",
+ "MST",
+ "CST",
+ "MST",
+ "PST",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST"
+ ],
+ "untils": [
+ -1514739600000,
+ -1343066400000,
+ -1234807200000,
+ -1220292000000,
+ -1207159200000,
+ -1191344400000,
+ -873828000000,
+ -661539600000,
+ 28800000,
+ 828867600000,
+ 846403200000,
+ 860317200000,
+ 877852800000,
+ 891766800000,
+ 909302400000,
+ 923216400000,
+ 941356800000,
+ 954666000000,
+ 972806400000,
+ 989139600000,
+ 1001836800000,
+ 1018170000000,
+ 1035705600000,
+ 1049619600000,
+ 1067155200000,
+ 1081069200000,
+ 1099209600000,
+ 1112518800000,
+ 1130659200000,
+ 1143968400000,
+ 1162108800000,
+ 1175418000000,
+ 1193558400000,
+ 1207472400000,
+ 1225008000000,
+ 1238922000000,
+ 1256457600000,
+ 1270371600000,
+ 1288512000000,
+ 1301821200000,
+ 1319961600000,
+ 1333270800000,
+ 1351411200000,
+ 1365325200000,
+ 1382860800000,
+ 1396774800000,
+ 1414310400000,
+ 1428224400000,
+ 1445760000000,
+ 1459674000000,
+ 1477814400000,
+ 1491123600000,
+ 1509264000000,
+ 1522573200000,
+ 1540713600000,
+ 1554627600000,
+ 1572163200000,
+ 1586077200000,
+ 1603612800000,
+ 1617526800000,
+ 1635667200000,
+ 1648976400000,
+ 1667116800000,
+ 1680426000000,
+ 1698566400000,
+ 1712480400000,
+ 1730016000000,
+ 1743930000000,
+ 1761465600000,
+ 1775379600000,
+ 1792915200000,
+ 1806829200000,
+ 1824969600000,
+ 1838278800000,
+ 1856419200000,
+ 1869728400000,
+ 1887868800000,
+ 1901782800000,
+ 1919318400000,
+ 1933232400000,
+ 1950768000000,
+ 1964682000000,
+ 1982822400000,
+ 1996131600000,
+ 2014272000000,
+ 2027581200000,
+ 2045721600000,
+ 2059030800000,
+ 2077171200000,
+ 2091085200000,
+ 2108620800000,
+ 2122534800000,
+ 2140070400000,
+ null
+ ],
+ "offsets": [
+ 425.6667,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 480,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420
+ ],
+ "population": 0
+ },
+ {
+ "name": "Mexico/General",
+ "abbrs": [
+ "LMT",
+ "MST",
+ "CST",
+ "MST",
+ "CST",
+ "MST",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1514739600000,
+ -1343066400000,
+ -1234807200000,
+ -1220292000000,
+ -1207159200000,
+ -1191344400000,
+ -975261600000,
+ -963169200000,
+ -917114400000,
+ -907354800000,
+ -821901600000,
+ -810068400000,
+ -627501600000,
+ -612990000000,
+ 828864000000,
+ 846399600000,
+ 860313600000,
+ 877849200000,
+ 891763200000,
+ 909298800000,
+ 923212800000,
+ 941353200000,
+ 954662400000,
+ 972802800000,
+ 989136000000,
+ 1001833200000,
+ 1018166400000,
+ 1035702000000,
+ 1049616000000,
+ 1067151600000,
+ 1081065600000,
+ 1099206000000,
+ 1112515200000,
+ 1130655600000,
+ 1143964800000,
+ 1162105200000,
+ 1175414400000,
+ 1193554800000,
+ 1207468800000,
+ 1225004400000,
+ 1238918400000,
+ 1256454000000,
+ 1270368000000,
+ 1288508400000,
+ 1301817600000,
+ 1319958000000,
+ 1333267200000,
+ 1351407600000,
+ 1365321600000,
+ 1382857200000,
+ 1396771200000,
+ 1414306800000,
+ 1428220800000,
+ 1445756400000,
+ 1459670400000,
+ 1477810800000,
+ 1491120000000,
+ 1509260400000,
+ 1522569600000,
+ 1540710000000,
+ 1554624000000,
+ 1572159600000,
+ 1586073600000,
+ 1603609200000,
+ 1617523200000,
+ 1635663600000,
+ 1648972800000,
+ 1667113200000,
+ 1680422400000,
+ 1698562800000,
+ 1712476800000,
+ 1730012400000,
+ 1743926400000,
+ 1761462000000,
+ 1775376000000,
+ 1792911600000,
+ 1806825600000,
+ 1824966000000,
+ 1838275200000,
+ 1856415600000,
+ 1869724800000,
+ 1887865200000,
+ 1901779200000,
+ 1919314800000,
+ 1933228800000,
+ 1950764400000,
+ 1964678400000,
+ 1982818800000,
+ 1996128000000,
+ 2014268400000,
+ 2027577600000,
+ 2045718000000,
+ 2059027200000,
+ 2077167600000,
+ 2091081600000,
+ 2108617200000,
+ 2122531200000,
+ 2140066800000,
+ null
+ ],
+ "offsets": [
+ 396.6,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 0
+ },
+ {
+ "name": "MST",
+ "abbrs": [
+ "MST"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 420
+ ],
+ "population": 0
+ },
+ {
+ "name": "MST7MDT",
+ "abbrs": [
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MWT",
+ "MPT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST"
+ ],
+ "untils": [
+ -1633273200000,
+ -1615132800000,
+ -1601823600000,
+ -1583683200000,
+ -880210800000,
+ -769395600000,
+ -765388800000,
+ -84380400000,
+ -68659200000,
+ -52930800000,
+ -37209600000,
+ -21481200000,
+ -5760000000,
+ 9968400000,
+ 25689600000,
+ 41418000000,
+ 57744000000,
+ 73472400000,
+ 89193600000,
+ 104922000000,
+ 120643200000,
+ 126694800000,
+ 152092800000,
+ 162378000000,
+ 183542400000,
+ 199270800000,
+ 215596800000,
+ 230720400000,
+ 247046400000,
+ 262774800000,
+ 278496000000,
+ 294224400000,
+ 309945600000,
+ 325674000000,
+ 341395200000,
+ 357123600000,
+ 372844800000,
+ 388573200000,
+ 404899200000,
+ 420022800000,
+ 436348800000,
+ 452077200000,
+ 467798400000,
+ 483526800000,
+ 499248000000,
+ 514976400000,
+ 530697600000,
+ 544611600000,
+ 562147200000,
+ 576061200000,
+ 594201600000,
+ 607510800000,
+ 625651200000,
+ 638960400000,
+ 657100800000,
+ 671014800000,
+ 688550400000,
+ 702464400000,
+ 720000000000,
+ 733914000000,
+ 752054400000,
+ 765363600000,
+ 783504000000,
+ 796813200000,
+ 814953600000,
+ 828867600000,
+ 846403200000,
+ 860317200000,
+ 877852800000,
+ 891766800000,
+ 909302400000,
+ 923216400000,
+ 941356800000,
+ 954666000000,
+ 972806400000,
+ 986115600000,
+ 1004256000000,
+ 1018170000000,
+ 1035705600000,
+ 1049619600000,
+ 1067155200000,
+ 1081069200000,
+ 1099209600000,
+ 1112518800000,
+ 1130659200000,
+ 1143968400000,
+ 1162108800000,
+ 1173603600000,
+ 1194163200000,
+ 1205053200000,
+ 1225612800000,
+ 1236502800000,
+ 1257062400000,
+ 1268557200000,
+ 1289116800000,
+ 1300006800000,
+ 1320566400000,
+ 1331456400000,
+ 1352016000000,
+ 1362906000000,
+ 1383465600000,
+ 1394355600000,
+ 1414915200000,
+ 1425805200000,
+ 1446364800000,
+ 1457859600000,
+ 1478419200000,
+ 1489309200000,
+ 1509868800000,
+ 1520758800000,
+ 1541318400000,
+ 1552208400000,
+ 1572768000000,
+ 1583658000000,
+ 1604217600000,
+ 1615712400000,
+ 1636272000000,
+ 1647162000000,
+ 1667721600000,
+ 1678611600000,
+ 1699171200000,
+ 1710061200000,
+ 1730620800000,
+ 1741510800000,
+ 1762070400000,
+ 1772960400000,
+ 1793520000000,
+ 1805014800000,
+ 1825574400000,
+ 1836464400000,
+ 1857024000000,
+ 1867914000000,
+ 1888473600000,
+ 1899363600000,
+ 1919923200000,
+ 1930813200000,
+ 1951372800000,
+ 1962867600000,
+ 1983427200000,
+ 1994317200000,
+ 2014876800000,
+ 2025766800000,
+ 2046326400000,
+ 2057216400000,
+ 2077776000000,
+ 2088666000000,
+ 2109225600000,
+ 2120115600000,
+ 2140675200000,
+ null
+ ],
+ "offsets": [
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420
+ ],
+ "population": 0
+ },
+ {
+ "name": "Navajo",
+ "abbrs": [
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MWT",
+ "MPT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST"
+ ],
+ "untils": [
+ -1633273200000,
+ -1615132800000,
+ -1601823600000,
+ -1583683200000,
+ -1570374000000,
+ -1551628800000,
+ -1538924400000,
+ -1534089600000,
+ -880210800000,
+ -769395600000,
+ -765388800000,
+ -147884400000,
+ -131558400000,
+ -116434800000,
+ -100108800000,
+ -84380400000,
+ -68659200000,
+ -52930800000,
+ -37209600000,
+ -21481200000,
+ -5760000000,
+ 9968400000,
+ 25689600000,
+ 41418000000,
+ 57744000000,
+ 73472400000,
+ 89193600000,
+ 104922000000,
+ 120643200000,
+ 126694800000,
+ 152092800000,
+ 162378000000,
+ 183542400000,
+ 199270800000,
+ 215596800000,
+ 230720400000,
+ 247046400000,
+ 262774800000,
+ 278496000000,
+ 294224400000,
+ 309945600000,
+ 325674000000,
+ 341395200000,
+ 357123600000,
+ 372844800000,
+ 388573200000,
+ 404899200000,
+ 420022800000,
+ 436348800000,
+ 452077200000,
+ 467798400000,
+ 483526800000,
+ 499248000000,
+ 514976400000,
+ 530697600000,
+ 544611600000,
+ 562147200000,
+ 576061200000,
+ 594201600000,
+ 607510800000,
+ 625651200000,
+ 638960400000,
+ 657100800000,
+ 671014800000,
+ 688550400000,
+ 702464400000,
+ 720000000000,
+ 733914000000,
+ 752054400000,
+ 765363600000,
+ 783504000000,
+ 796813200000,
+ 814953600000,
+ 828867600000,
+ 846403200000,
+ 860317200000,
+ 877852800000,
+ 891766800000,
+ 909302400000,
+ 923216400000,
+ 941356800000,
+ 954666000000,
+ 972806400000,
+ 986115600000,
+ 1004256000000,
+ 1018170000000,
+ 1035705600000,
+ 1049619600000,
+ 1067155200000,
+ 1081069200000,
+ 1099209600000,
+ 1112518800000,
+ 1130659200000,
+ 1143968400000,
+ 1162108800000,
+ 1173603600000,
+ 1194163200000,
+ 1205053200000,
+ 1225612800000,
+ 1236502800000,
+ 1257062400000,
+ 1268557200000,
+ 1289116800000,
+ 1300006800000,
+ 1320566400000,
+ 1331456400000,
+ 1352016000000,
+ 1362906000000,
+ 1383465600000,
+ 1394355600000,
+ 1414915200000,
+ 1425805200000,
+ 1446364800000,
+ 1457859600000,
+ 1478419200000,
+ 1489309200000,
+ 1509868800000,
+ 1520758800000,
+ 1541318400000,
+ 1552208400000,
+ 1572768000000,
+ 1583658000000,
+ 1604217600000,
+ 1615712400000,
+ 1636272000000,
+ 1647162000000,
+ 1667721600000,
+ 1678611600000,
+ 1699171200000,
+ 1710061200000,
+ 1730620800000,
+ 1741510800000,
+ 1762070400000,
+ 1772960400000,
+ 1793520000000,
+ 1805014800000,
+ 1825574400000,
+ 1836464400000,
+ 1857024000000,
+ 1867914000000,
+ 1888473600000,
+ 1899363600000,
+ 1919923200000,
+ 1930813200000,
+ 1951372800000,
+ 1962867600000,
+ 1983427200000,
+ 1994317200000,
+ 2014876800000,
+ 2025766800000,
+ 2046326400000,
+ 2057216400000,
+ 2077776000000,
+ 2088666000000,
+ 2109225600000,
+ 2120115600000,
+ 2140675200000,
+ null
+ ],
+ "offsets": [
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420
+ ],
+ "population": 0
+ },
+ {
+ "name": "NZ-CHAT",
+ "abbrs": [
+ "+1215",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345"
+ ],
+ "untils": [
+ -757426500000,
+ 152632800000,
+ 162309600000,
+ 183477600000,
+ 194968800000,
+ 215532000000,
+ 226418400000,
+ 246981600000,
+ 257868000000,
+ 278431200000,
+ 289317600000,
+ 309880800000,
+ 320767200000,
+ 341330400000,
+ 352216800000,
+ 372780000000,
+ 384271200000,
+ 404834400000,
+ 415720800000,
+ 436284000000,
+ 447170400000,
+ 467733600000,
+ 478620000000,
+ 499183200000,
+ 510069600000,
+ 530632800000,
+ 541519200000,
+ 562082400000,
+ 573573600000,
+ 594136800000,
+ 605023200000,
+ 623772000000,
+ 637682400000,
+ 655221600000,
+ 669132000000,
+ 686671200000,
+ 700581600000,
+ 718120800000,
+ 732636000000,
+ 749570400000,
+ 764085600000,
+ 781020000000,
+ 795535200000,
+ 812469600000,
+ 826984800000,
+ 844524000000,
+ 858434400000,
+ 875973600000,
+ 889884000000,
+ 907423200000,
+ 921938400000,
+ 938872800000,
+ 953388000000,
+ 970322400000,
+ 984837600000,
+ 1002376800000,
+ 1016287200000,
+ 1033826400000,
+ 1047736800000,
+ 1065276000000,
+ 1079791200000,
+ 1096725600000,
+ 1111240800000,
+ 1128175200000,
+ 1142690400000,
+ 1159624800000,
+ 1174140000000,
+ 1191074400000,
+ 1207404000000,
+ 1222524000000,
+ 1238853600000,
+ 1253973600000,
+ 1270303200000,
+ 1285423200000,
+ 1301752800000,
+ 1316872800000,
+ 1333202400000,
+ 1348927200000,
+ 1365256800000,
+ 1380376800000,
+ 1396706400000,
+ 1411826400000,
+ 1428156000000,
+ 1443276000000,
+ 1459605600000,
+ 1474725600000,
+ 1491055200000,
+ 1506175200000,
+ 1522504800000,
+ 1538229600000,
+ 1554559200000,
+ 1569679200000,
+ 1586008800000,
+ 1601128800000,
+ 1617458400000,
+ 1632578400000,
+ 1648908000000,
+ 1664028000000,
+ 1680357600000,
+ 1695477600000,
+ 1712412000000,
+ 1727532000000,
+ 1743861600000,
+ 1758981600000,
+ 1775311200000,
+ 1790431200000,
+ 1806760800000,
+ 1821880800000,
+ 1838210400000,
+ 1853330400000,
+ 1869660000000,
+ 1885384800000,
+ 1901714400000,
+ 1916834400000,
+ 1933164000000,
+ 1948284000000,
+ 1964613600000,
+ 1979733600000,
+ 1996063200000,
+ 2011183200000,
+ 2027512800000,
+ 2042632800000,
+ 2058962400000,
+ 2074687200000,
+ 2091016800000,
+ 2106136800000,
+ 2122466400000,
+ 2137586400000,
+ null
+ ],
+ "offsets": [
+ -735,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825
+ ],
+ "population": 0
+ },
+ {
+ "name": "NZ",
+ "abbrs": [
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT"
+ ],
+ "untils": [
+ -1330335000000,
+ -1320057000000,
+ -1300699800000,
+ -1287396000000,
+ -1269250200000,
+ -1255946400000,
+ -1237800600000,
+ -1224496800000,
+ -1206351000000,
+ -1192442400000,
+ -1174901400000,
+ -1160992800000,
+ -1143451800000,
+ -1125914400000,
+ -1112607000000,
+ -1094464800000,
+ -1081157400000,
+ -1063015200000,
+ -1049707800000,
+ -1031565600000,
+ -1018258200000,
+ -1000116000000,
+ -986808600000,
+ -968061600000,
+ -955359000000,
+ -936612000000,
+ -923304600000,
+ 152632800000,
+ 162309600000,
+ 183477600000,
+ 194968800000,
+ 215532000000,
+ 226418400000,
+ 246981600000,
+ 257868000000,
+ 278431200000,
+ 289317600000,
+ 309880800000,
+ 320767200000,
+ 341330400000,
+ 352216800000,
+ 372780000000,
+ 384271200000,
+ 404834400000,
+ 415720800000,
+ 436284000000,
+ 447170400000,
+ 467733600000,
+ 478620000000,
+ 499183200000,
+ 510069600000,
+ 530632800000,
+ 541519200000,
+ 562082400000,
+ 573573600000,
+ 594136800000,
+ 605023200000,
+ 623772000000,
+ 637682400000,
+ 655221600000,
+ 669132000000,
+ 686671200000,
+ 700581600000,
+ 718120800000,
+ 732636000000,
+ 749570400000,
+ 764085600000,
+ 781020000000,
+ 795535200000,
+ 812469600000,
+ 826984800000,
+ 844524000000,
+ 858434400000,
+ 875973600000,
+ 889884000000,
+ 907423200000,
+ 921938400000,
+ 938872800000,
+ 953388000000,
+ 970322400000,
+ 984837600000,
+ 1002376800000,
+ 1016287200000,
+ 1033826400000,
+ 1047736800000,
+ 1065276000000,
+ 1079791200000,
+ 1096725600000,
+ 1111240800000,
+ 1128175200000,
+ 1142690400000,
+ 1159624800000,
+ 1174140000000,
+ 1191074400000,
+ 1207404000000,
+ 1222524000000,
+ 1238853600000,
+ 1253973600000,
+ 1270303200000,
+ 1285423200000,
+ 1301752800000,
+ 1316872800000,
+ 1333202400000,
+ 1348927200000,
+ 1365256800000,
+ 1380376800000,
+ 1396706400000,
+ 1411826400000,
+ 1428156000000,
+ 1443276000000,
+ 1459605600000,
+ 1474725600000,
+ 1491055200000,
+ 1506175200000,
+ 1522504800000,
+ 1538229600000,
+ 1554559200000,
+ 1569679200000,
+ 1586008800000,
+ 1601128800000,
+ 1617458400000,
+ 1632578400000,
+ 1648908000000,
+ 1664028000000,
+ 1680357600000,
+ 1695477600000,
+ 1712412000000,
+ 1727532000000,
+ 1743861600000,
+ 1758981600000,
+ 1775311200000,
+ 1790431200000,
+ 1806760800000,
+ 1821880800000,
+ 1838210400000,
+ 1853330400000,
+ 1869660000000,
+ 1885384800000,
+ 1901714400000,
+ 1916834400000,
+ 1933164000000,
+ 1948284000000,
+ 1964613600000,
+ 1979733600000,
+ 1996063200000,
+ 2011183200000,
+ 2027512800000,
+ 2042632800000,
+ 2058962400000,
+ 2074687200000,
+ 2091016800000,
+ 2106136800000,
+ 2122466400000,
+ 2137586400000,
+ null
+ ],
+ "offsets": [
+ -690,
+ -750,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780
+ ],
+ "population": 0
+ },
+ {
+ "name": "Pacific/Apia",
+ "abbrs": [
+ "LMT",
+ "-1130",
+ "-11",
+ "-10",
+ "-11",
+ "-10",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14"
+ ],
+ "untils": [
+ -1861878784000,
+ -631110600000,
+ 1285498800000,
+ 1301752800000,
+ 1316872800000,
+ 1325239200000,
+ 1333202400000,
+ 1348927200000,
+ 1365256800000,
+ 1380376800000,
+ 1396706400000,
+ 1411826400000,
+ 1428156000000,
+ 1443276000000,
+ 1459605600000,
+ 1474725600000,
+ 1491055200000,
+ 1506175200000,
+ 1522504800000,
+ 1538229600000,
+ 1554559200000,
+ 1569679200000,
+ 1586008800000,
+ 1601128800000,
+ 1617458400000,
+ 1632578400000,
+ 1648908000000,
+ 1664028000000,
+ 1680357600000,
+ 1695477600000,
+ 1712412000000,
+ 1727532000000,
+ 1743861600000,
+ 1758981600000,
+ 1775311200000,
+ 1790431200000,
+ 1806760800000,
+ 1821880800000,
+ 1838210400000,
+ 1853330400000,
+ 1869660000000,
+ 1885384800000,
+ 1901714400000,
+ 1916834400000,
+ 1933164000000,
+ 1948284000000,
+ 1964613600000,
+ 1979733600000,
+ 1996063200000,
+ 2011183200000,
+ 2027512800000,
+ 2042632800000,
+ 2058962400000,
+ 2074687200000,
+ 2091016800000,
+ 2106136800000,
+ 2122466400000,
+ 2137586400000,
+ null
+ ],
+ "offsets": [
+ 686.9333,
+ 690,
+ 660,
+ 600,
+ 660,
+ 600,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840
+ ],
+ "population": 36735
+ },
+ {
+ "name": "Pacific/Auckland",
+ "abbrs": [
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZMT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT",
+ "NZST",
+ "NZDT"
+ ],
+ "untils": [
+ -1330335000000,
+ -1320057000000,
+ -1300699800000,
+ -1287396000000,
+ -1269250200000,
+ -1255946400000,
+ -1237800600000,
+ -1224496800000,
+ -1206351000000,
+ -1192442400000,
+ -1174901400000,
+ -1160992800000,
+ -1143451800000,
+ -1125914400000,
+ -1112607000000,
+ -1094464800000,
+ -1081157400000,
+ -1063015200000,
+ -1049707800000,
+ -1031565600000,
+ -1018258200000,
+ -1000116000000,
+ -986808600000,
+ -968061600000,
+ -955359000000,
+ -936612000000,
+ -923304600000,
+ 152632800000,
+ 162309600000,
+ 183477600000,
+ 194968800000,
+ 215532000000,
+ 226418400000,
+ 246981600000,
+ 257868000000,
+ 278431200000,
+ 289317600000,
+ 309880800000,
+ 320767200000,
+ 341330400000,
+ 352216800000,
+ 372780000000,
+ 384271200000,
+ 404834400000,
+ 415720800000,
+ 436284000000,
+ 447170400000,
+ 467733600000,
+ 478620000000,
+ 499183200000,
+ 510069600000,
+ 530632800000,
+ 541519200000,
+ 562082400000,
+ 573573600000,
+ 594136800000,
+ 605023200000,
+ 623772000000,
+ 637682400000,
+ 655221600000,
+ 669132000000,
+ 686671200000,
+ 700581600000,
+ 718120800000,
+ 732636000000,
+ 749570400000,
+ 764085600000,
+ 781020000000,
+ 795535200000,
+ 812469600000,
+ 826984800000,
+ 844524000000,
+ 858434400000,
+ 875973600000,
+ 889884000000,
+ 907423200000,
+ 921938400000,
+ 938872800000,
+ 953388000000,
+ 970322400000,
+ 984837600000,
+ 1002376800000,
+ 1016287200000,
+ 1033826400000,
+ 1047736800000,
+ 1065276000000,
+ 1079791200000,
+ 1096725600000,
+ 1111240800000,
+ 1128175200000,
+ 1142690400000,
+ 1159624800000,
+ 1174140000000,
+ 1191074400000,
+ 1207404000000,
+ 1222524000000,
+ 1238853600000,
+ 1253973600000,
+ 1270303200000,
+ 1285423200000,
+ 1301752800000,
+ 1316872800000,
+ 1333202400000,
+ 1348927200000,
+ 1365256800000,
+ 1380376800000,
+ 1396706400000,
+ 1411826400000,
+ 1428156000000,
+ 1443276000000,
+ 1459605600000,
+ 1474725600000,
+ 1491055200000,
+ 1506175200000,
+ 1522504800000,
+ 1538229600000,
+ 1554559200000,
+ 1569679200000,
+ 1586008800000,
+ 1601128800000,
+ 1617458400000,
+ 1632578400000,
+ 1648908000000,
+ 1664028000000,
+ 1680357600000,
+ 1695477600000,
+ 1712412000000,
+ 1727532000000,
+ 1743861600000,
+ 1758981600000,
+ 1775311200000,
+ 1790431200000,
+ 1806760800000,
+ 1821880800000,
+ 1838210400000,
+ 1853330400000,
+ 1869660000000,
+ 1885384800000,
+ 1901714400000,
+ 1916834400000,
+ 1933164000000,
+ 1948284000000,
+ 1964613600000,
+ 1979733600000,
+ 1996063200000,
+ 2011183200000,
+ 2027512800000,
+ 2042632800000,
+ 2058962400000,
+ 2074687200000,
+ 2091016800000,
+ 2106136800000,
+ 2122466400000,
+ 2137586400000,
+ null
+ ],
+ "offsets": [
+ -690,
+ -750,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -690,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780
+ ],
+ "population": 1356000
+ },
+ {
+ "name": "Pacific/Bougainville",
+ "abbrs": [
+ "+10",
+ "+09",
+ "+10",
+ "+11"
+ ],
+ "untils": [
+ -868010400000,
+ -768906000000,
+ 1419696000000,
+ null
+ ],
+ "offsets": [
+ -600,
+ -540,
+ -600,
+ -660
+ ],
+ "population": 175160
+ },
+ {
+ "name": "Pacific/Chatham",
+ "abbrs": [
+ "+1215",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345",
+ "+1245",
+ "+1345"
+ ],
+ "untils": [
+ -757426500000,
+ 152632800000,
+ 162309600000,
+ 183477600000,
+ 194968800000,
+ 215532000000,
+ 226418400000,
+ 246981600000,
+ 257868000000,
+ 278431200000,
+ 289317600000,
+ 309880800000,
+ 320767200000,
+ 341330400000,
+ 352216800000,
+ 372780000000,
+ 384271200000,
+ 404834400000,
+ 415720800000,
+ 436284000000,
+ 447170400000,
+ 467733600000,
+ 478620000000,
+ 499183200000,
+ 510069600000,
+ 530632800000,
+ 541519200000,
+ 562082400000,
+ 573573600000,
+ 594136800000,
+ 605023200000,
+ 623772000000,
+ 637682400000,
+ 655221600000,
+ 669132000000,
+ 686671200000,
+ 700581600000,
+ 718120800000,
+ 732636000000,
+ 749570400000,
+ 764085600000,
+ 781020000000,
+ 795535200000,
+ 812469600000,
+ 826984800000,
+ 844524000000,
+ 858434400000,
+ 875973600000,
+ 889884000000,
+ 907423200000,
+ 921938400000,
+ 938872800000,
+ 953388000000,
+ 970322400000,
+ 984837600000,
+ 1002376800000,
+ 1016287200000,
+ 1033826400000,
+ 1047736800000,
+ 1065276000000,
+ 1079791200000,
+ 1096725600000,
+ 1111240800000,
+ 1128175200000,
+ 1142690400000,
+ 1159624800000,
+ 1174140000000,
+ 1191074400000,
+ 1207404000000,
+ 1222524000000,
+ 1238853600000,
+ 1253973600000,
+ 1270303200000,
+ 1285423200000,
+ 1301752800000,
+ 1316872800000,
+ 1333202400000,
+ 1348927200000,
+ 1365256800000,
+ 1380376800000,
+ 1396706400000,
+ 1411826400000,
+ 1428156000000,
+ 1443276000000,
+ 1459605600000,
+ 1474725600000,
+ 1491055200000,
+ 1506175200000,
+ 1522504800000,
+ 1538229600000,
+ 1554559200000,
+ 1569679200000,
+ 1586008800000,
+ 1601128800000,
+ 1617458400000,
+ 1632578400000,
+ 1648908000000,
+ 1664028000000,
+ 1680357600000,
+ 1695477600000,
+ 1712412000000,
+ 1727532000000,
+ 1743861600000,
+ 1758981600000,
+ 1775311200000,
+ 1790431200000,
+ 1806760800000,
+ 1821880800000,
+ 1838210400000,
+ 1853330400000,
+ 1869660000000,
+ 1885384800000,
+ 1901714400000,
+ 1916834400000,
+ 1933164000000,
+ 1948284000000,
+ 1964613600000,
+ 1979733600000,
+ 1996063200000,
+ 2011183200000,
+ 2027512800000,
+ 2042632800000,
+ 2058962400000,
+ 2074687200000,
+ 2091016800000,
+ 2106136800000,
+ 2122466400000,
+ 2137586400000,
+ null
+ ],
+ "offsets": [
+ -735,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825,
+ -765,
+ -825
+ ],
+ "population": 600
+ },
+ {
+ "name": "Pacific/Chuuk",
+ "abbrs": [
+ "+10"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -600
+ ],
+ "population": 48654
+ },
+ {
+ "name": "Pacific/Easter",
+ "abbrs": [
+ "EMT",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-07",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05",
+ "-06",
+ "-05"
+ ],
+ "untils": [
+ -1178124152000,
+ -36619200000,
+ -23922000000,
+ -3355200000,
+ 7527600000,
+ 24465600000,
+ 37767600000,
+ 55915200000,
+ 69217200000,
+ 87969600000,
+ 100666800000,
+ 118209600000,
+ 132116400000,
+ 150868800000,
+ 163566000000,
+ 182318400000,
+ 195620400000,
+ 213768000000,
+ 227070000000,
+ 245217600000,
+ 258519600000,
+ 277272000000,
+ 289969200000,
+ 308721600000,
+ 321418800000,
+ 340171200000,
+ 353473200000,
+ 371620800000,
+ 403070400000,
+ 416372400000,
+ 434520000000,
+ 447822000000,
+ 466574400000,
+ 479271600000,
+ 498024000000,
+ 510721200000,
+ 529473600000,
+ 545194800000,
+ 560923200000,
+ 574225200000,
+ 592372800000,
+ 605674800000,
+ 624427200000,
+ 637124400000,
+ 653457600000,
+ 668574000000,
+ 687326400000,
+ 700628400000,
+ 718776000000,
+ 732078000000,
+ 750225600000,
+ 763527600000,
+ 781675200000,
+ 794977200000,
+ 813729600000,
+ 826426800000,
+ 845179200000,
+ 859690800000,
+ 876628800000,
+ 889930800000,
+ 906868800000,
+ 923194800000,
+ 939528000000,
+ 952830000000,
+ 971582400000,
+ 984279600000,
+ 1003032000000,
+ 1015729200000,
+ 1034481600000,
+ 1047178800000,
+ 1065931200000,
+ 1079233200000,
+ 1097380800000,
+ 1110682800000,
+ 1128830400000,
+ 1142132400000,
+ 1160884800000,
+ 1173582000000,
+ 1192334400000,
+ 1206846000000,
+ 1223784000000,
+ 1237086000000,
+ 1255233600000,
+ 1270350000000,
+ 1286683200000,
+ 1304823600000,
+ 1313899200000,
+ 1335668400000,
+ 1346558400000,
+ 1367118000000,
+ 1378612800000,
+ 1398567600000,
+ 1410062400000,
+ 1463281200000,
+ 1471147200000,
+ 1494730800000,
+ 1502596800000,
+ 1526180400000,
+ 1534046400000,
+ 1557630000000,
+ 1565496000000,
+ 1589079600000,
+ 1596945600000,
+ 1620529200000,
+ 1629000000000,
+ 1652583600000,
+ 1660449600000,
+ 1684033200000,
+ 1691899200000,
+ 1715482800000,
+ 1723348800000,
+ 1746932400000,
+ 1754798400000,
+ 1778382000000,
+ 1786248000000,
+ 1809831600000,
+ 1818302400000,
+ 1841886000000,
+ 1849752000000,
+ 1873335600000,
+ 1881201600000,
+ 1904785200000,
+ 1912651200000,
+ 1936234800000,
+ 1944100800000,
+ 1967684400000,
+ 1976155200000,
+ 1999738800000,
+ 2007604800000,
+ 2031188400000,
+ 2039054400000,
+ 2062638000000,
+ 2070504000000,
+ 2094087600000,
+ 2101953600000,
+ 2125537200000,
+ 2133403200000,
+ null
+ ],
+ "offsets": [
+ 437.4667,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300
+ ],
+ "population": 3000
+ },
+ {
+ "name": "Pacific/Efate",
+ "abbrs": [
+ "LMT",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11"
+ ],
+ "untils": [
+ -1829387596000,
+ 433256400000,
+ 448977600000,
+ 467298000000,
+ 480427200000,
+ 496760400000,
+ 511876800000,
+ 528210000000,
+ 543931200000,
+ 559659600000,
+ 575380800000,
+ 591109200000,
+ 606830400000,
+ 622558800000,
+ 638280000000,
+ 654008400000,
+ 669729600000,
+ 686062800000,
+ 696340800000,
+ 719931600000,
+ 727790400000,
+ null
+ ],
+ "offsets": [
+ -673.2667,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660
+ ],
+ "population": 65829
+ },
+ {
+ "name": "Pacific/Enderbury",
+ "abbrs": [
+ "-12",
+ "-11",
+ "+13"
+ ],
+ "untils": [
+ 307627200000,
+ 788871600000,
+ null
+ ],
+ "offsets": [
+ 720,
+ 660,
+ -780
+ ],
+ "population": 1
+ },
+ {
+ "name": "Pacific/Fakaofo",
+ "abbrs": [
+ "-11",
+ "+13"
+ ],
+ "untils": [
+ 1325242800000,
+ null
+ ],
+ "offsets": [
+ 660,
+ -780
+ ],
+ "population": 483
+ },
+ {
+ "name": "Pacific/Fiji",
+ "abbrs": [
+ "LMT",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12",
+ "+13",
+ "+12"
+ ],
+ "untils": [
+ -1709985344000,
+ 909842400000,
+ 920124000000,
+ 941896800000,
+ 951573600000,
+ 1259416800000,
+ 1269698400000,
+ 1287842400000,
+ 1299333600000,
+ 1319292000000,
+ 1327154400000,
+ 1350741600000,
+ 1358604000000,
+ 1382796000000,
+ 1390050000000,
+ 1414850400000,
+ 1421503200000,
+ 1446300000000,
+ 1452952800000,
+ 1478354400000,
+ 1484402400000,
+ 1509804000000,
+ 1515852000000,
+ 1541253600000,
+ 1547906400000,
+ 1572703200000,
+ 1579356000000,
+ 1604152800000,
+ 1610805600000,
+ 1636207200000,
+ 1642255200000,
+ 1667656800000,
+ 1673704800000,
+ 1699106400000,
+ 1705154400000,
+ 1730556000000,
+ 1737208800000,
+ 1762005600000,
+ 1768658400000,
+ 1793455200000,
+ 1800108000000,
+ 1825509600000,
+ 1831557600000,
+ 1856959200000,
+ 1863007200000,
+ 1888408800000,
+ 1895061600000,
+ 1919858400000,
+ 1926511200000,
+ 1951308000000,
+ 1957960800000,
+ 1983362400000,
+ 1989410400000,
+ 2014812000000,
+ 2020860000000,
+ 2046261600000,
+ 2052309600000,
+ 2077711200000,
+ 2084364000000,
+ 2109160800000,
+ 2115813600000,
+ 2140610400000,
+ 2147263200000,
+ null
+ ],
+ "offsets": [
+ -715.7333,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720,
+ -780,
+ -720
+ ],
+ "population": 881065
+ },
+ {
+ "name": "Pacific/Funafuti",
+ "abbrs": [
+ "+12"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -720
+ ],
+ "population": 4492
+ },
+ {
+ "name": "Pacific/Galapagos",
+ "abbrs": [
+ "LMT",
+ "-05",
+ "-06",
+ "-05",
+ "-06"
+ ],
+ "untils": [
+ -1230746496000,
+ 504939600000,
+ 722930400000,
+ 728888400000,
+ null
+ ],
+ "offsets": [
+ 358.4,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 25000
+ },
+ {
+ "name": "Pacific/Gambier",
+ "abbrs": [
+ "LMT",
+ "-09"
+ ],
+ "untils": [
+ -1806678012000,
+ null
+ ],
+ "offsets": [
+ 539.8,
+ 540
+ ],
+ "population": 125
+ },
+ {
+ "name": "Pacific/Guadalcanal",
+ "abbrs": [
+ "LMT",
+ "+11"
+ ],
+ "untils": [
+ -1806748788000,
+ null
+ ],
+ "offsets": [
+ -639.8,
+ -660
+ ],
+ "population": 109382
+ },
+ {
+ "name": "Pacific/Guam",
+ "abbrs": [
+ "GST",
+ "ChST"
+ ],
+ "untils": [
+ 977493600000,
+ null
+ ],
+ "offsets": [
+ -600,
+ -600
+ ],
+ "population": 165124
+ },
+ {
+ "name": "Pacific/Honolulu",
+ "abbrs": [
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HST"
+ ],
+ "untils": [
+ -1157283000000,
+ -1155436200000,
+ -880198200000,
+ -765376200000,
+ -712150200000,
+ null
+ ],
+ "offsets": [
+ 630,
+ 570,
+ 630,
+ 570,
+ 630,
+ 600
+ ],
+ "population": 374658
+ },
+ {
+ "name": "Pacific/Johnston",
+ "abbrs": [
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HST"
+ ],
+ "untils": [
+ -1157283000000,
+ -1155436200000,
+ -880198200000,
+ -765376200000,
+ -712150200000,
+ null
+ ],
+ "offsets": [
+ 630,
+ 570,
+ 630,
+ 570,
+ 630,
+ 600
+ ],
+ "population": 0
+ },
+ {
+ "name": "Pacific/Kiritimati",
+ "abbrs": [
+ "-1040",
+ "-10",
+ "+14"
+ ],
+ "untils": [
+ 307622400000,
+ 788868000000,
+ null
+ ],
+ "offsets": [
+ 640,
+ 600,
+ -840
+ ],
+ "population": 5115
+ },
+ {
+ "name": "Pacific/Kosrae",
+ "abbrs": [
+ "+11",
+ "+12",
+ "+11"
+ ],
+ "untils": [
+ -7988400000,
+ 915105600000,
+ null
+ ],
+ "offsets": [
+ -660,
+ -720,
+ -660
+ ],
+ "population": 6616
+ },
+ {
+ "name": "Pacific/Kwajalein",
+ "abbrs": [
+ "+11",
+ "-12",
+ "+12"
+ ],
+ "untils": [
+ -7988400000,
+ 745848000000,
+ null
+ ],
+ "offsets": [
+ -660,
+ 720,
+ -720
+ ],
+ "population": 13500
+ },
+ {
+ "name": "Pacific/Majuro",
+ "abbrs": [
+ "+11",
+ "+12"
+ ],
+ "untils": [
+ -7988400000,
+ null
+ ],
+ "offsets": [
+ -660,
+ -720
+ ],
+ "population": 27797
+ },
+ {
+ "name": "Pacific/Marquesas",
+ "abbrs": [
+ "LMT",
+ "-0930"
+ ],
+ "untils": [
+ -1806676920000,
+ null
+ ],
+ "offsets": [
+ 558,
+ 570
+ ],
+ "population": 8632
+ },
+ {
+ "name": "Pacific/Midway",
+ "abbrs": [
+ "LMT",
+ "SST"
+ ],
+ "untils": [
+ -1861879032000,
+ null
+ ],
+ "offsets": [
+ 682.8,
+ 660
+ ],
+ "population": 0
+ },
+ {
+ "name": "Pacific/Nauru",
+ "abbrs": [
+ "LMT",
+ "+1130",
+ "+09",
+ "+1130",
+ "+12"
+ ],
+ "untils": [
+ -1545131260000,
+ -877347000000,
+ -800960400000,
+ 294323400000,
+ null
+ ],
+ "offsets": [
+ -667.6667,
+ -690,
+ -540,
+ -690,
+ -720
+ ],
+ "population": 10084
+ },
+ {
+ "name": "Pacific/Niue",
+ "abbrs": [
+ "-1120",
+ "-1130",
+ "-11"
+ ],
+ "untils": [
+ -599575200000,
+ 276089400000,
+ null
+ ],
+ "offsets": [
+ 680,
+ 690,
+ 660
+ ],
+ "population": 1190
+ },
+ {
+ "name": "Pacific/Norfolk",
+ "abbrs": [
+ "+1112",
+ "+1130",
+ "+1230",
+ "+1130",
+ "+11"
+ ],
+ "untils": [
+ -599656320000,
+ 152029800000,
+ 162912600000,
+ 1443882600000,
+ null
+ ],
+ "offsets": [
+ -672,
+ -690,
+ -750,
+ -690,
+ -660
+ ],
+ "population": 246139
+ },
+ {
+ "name": "Pacific/Noumea",
+ "abbrs": [
+ "LMT",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11",
+ "+12",
+ "+11"
+ ],
+ "untils": [
+ -1829387148000,
+ 250002000000,
+ 257342400000,
+ 281451600000,
+ 288878400000,
+ 849366000000,
+ 857228400000,
+ null
+ ],
+ "offsets": [
+ -665.8,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660,
+ -720,
+ -660
+ ],
+ "population": 97579
+ },
+ {
+ "name": "Pacific/Pago_Pago",
+ "abbrs": [
+ "LMT",
+ "SST"
+ ],
+ "untils": [
+ -1861879032000,
+ null
+ ],
+ "offsets": [
+ 682.8,
+ 660
+ ],
+ "population": 3656
+ },
+ {
+ "name": "Pacific/Palau",
+ "abbrs": [
+ "+09"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -540
+ ],
+ "population": 20918
+ },
+ {
+ "name": "Pacific/Pitcairn",
+ "abbrs": [
+ "-0830",
+ "-08"
+ ],
+ "untils": [
+ 893665800000,
+ null
+ ],
+ "offsets": [
+ 510,
+ 480
+ ],
+ "population": 56
+ },
+ {
+ "name": "Pacific/Pohnpei",
+ "abbrs": [
+ "+11"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -660
+ ],
+ "population": 34000
+ },
+ {
+ "name": "Pacific/Ponape",
+ "abbrs": [
+ "+11"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -660
+ ],
+ "population": 0
+ },
+ {
+ "name": "Pacific/Port_Moresby",
+ "abbrs": [
+ "+10"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -600
+ ],
+ "population": 254158
+ },
+ {
+ "name": "Pacific/Rarotonga",
+ "abbrs": [
+ "-1030",
+ "-0930",
+ "-10",
+ "-0930",
+ "-10",
+ "-0930",
+ "-10",
+ "-0930",
+ "-10",
+ "-0930",
+ "-10",
+ "-0930",
+ "-10",
+ "-0930",
+ "-10",
+ "-0930",
+ "-10",
+ "-0930",
+ "-10",
+ "-0930",
+ "-10",
+ "-0930",
+ "-10",
+ "-0930",
+ "-10",
+ "-0930",
+ "-10"
+ ],
+ "untils": [
+ 279714600000,
+ 289387800000,
+ 309952800000,
+ 320837400000,
+ 341402400000,
+ 352287000000,
+ 372852000000,
+ 384341400000,
+ 404906400000,
+ 415791000000,
+ 436356000000,
+ 447240600000,
+ 467805600000,
+ 478690200000,
+ 499255200000,
+ 510139800000,
+ 530704800000,
+ 541589400000,
+ 562154400000,
+ 573643800000,
+ 594208800000,
+ 605093400000,
+ 625658400000,
+ 636543000000,
+ 657108000000,
+ 667992600000,
+ null
+ ],
+ "offsets": [
+ 630,
+ 570,
+ 600,
+ 570,
+ 600,
+ 570,
+ 600,
+ 570,
+ 600,
+ 570,
+ 600,
+ 570,
+ 600,
+ 570,
+ 600,
+ 570,
+ 600,
+ 570,
+ 600,
+ 570,
+ 600,
+ 570,
+ 600,
+ 570,
+ 600,
+ 570,
+ 600
+ ],
+ "population": 13095
+ },
+ {
+ "name": "Pacific/Saipan",
+ "abbrs": [
+ "GST",
+ "ChST"
+ ],
+ "untils": [
+ 977493600000,
+ null
+ ],
+ "offsets": [
+ -600,
+ -600
+ ],
+ "population": 0
+ },
+ {
+ "name": "Pacific/Samoa",
+ "abbrs": [
+ "LMT",
+ "SST"
+ ],
+ "untils": [
+ -1861879032000,
+ null
+ ],
+ "offsets": [
+ 682.8,
+ 660
+ ],
+ "population": 0
+ },
+ {
+ "name": "Pacific/Tahiti",
+ "abbrs": [
+ "LMT",
+ "-10"
+ ],
+ "untils": [
+ -1806674504000,
+ null
+ ],
+ "offsets": [
+ 598.2667,
+ 600
+ ],
+ "population": 178133
+ },
+ {
+ "name": "Pacific/Tarawa",
+ "abbrs": [
+ "+12"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -720
+ ],
+ "population": 28802
+ },
+ {
+ "name": "Pacific/Tongatapu",
+ "abbrs": [
+ "+1220",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13",
+ "+14",
+ "+13"
+ ],
+ "untils": [
+ -915193200000,
+ 939214800000,
+ 953384400000,
+ 973342800000,
+ 980596800000,
+ 1004792400000,
+ 1012046400000,
+ 1478350800000,
+ 1484398800000,
+ null
+ ],
+ "offsets": [
+ -740,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780,
+ -840,
+ -780
+ ],
+ "population": 75416
+ },
+ {
+ "name": "Pacific/Truk",
+ "abbrs": [
+ "+10"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -600
+ ],
+ "population": 0
+ },
+ {
+ "name": "Pacific/Wake",
+ "abbrs": [
+ "+12"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -720
+ ],
+ "population": 15500
+ },
+ {
+ "name": "Pacific/Wallis",
+ "abbrs": [
+ "+12"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -720
+ ],
+ "population": 94
+ },
+ {
+ "name": "Pacific/Yap",
+ "abbrs": [
+ "+10"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ -600
+ ],
+ "population": 0
+ },
+ {
+ "name": "Poland",
+ "abbrs": [
+ "WMT",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "EET",
+ "EEST",
+ "EET",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET"
+ ],
+ "untils": [
+ -1717032240000,
+ -1693706400000,
+ -1680483600000,
+ -1663455600000,
+ -1650150000000,
+ -1632006000000,
+ -1618700400000,
+ -1600473600000,
+ -1587168000000,
+ -1501725600000,
+ -931734000000,
+ -857257200000,
+ -844556400000,
+ -828226800000,
+ -812502000000,
+ -796608000000,
+ -778726800000,
+ -762660000000,
+ -748486800000,
+ -733273200000,
+ -715215600000,
+ -701910000000,
+ -684975600000,
+ -670460400000,
+ -654130800000,
+ -639010800000,
+ -397094400000,
+ -386812800000,
+ -371088000000,
+ -355363200000,
+ -334195200000,
+ -323308800000,
+ -307584000000,
+ -291859200000,
+ -271296000000,
+ -260409600000,
+ -239846400000,
+ -228960000000,
+ -208396800000,
+ -197510400000,
+ -176342400000,
+ -166060800000,
+ 228873600000,
+ 243993600000,
+ 260323200000,
+ 276048000000,
+ 291772800000,
+ 307497600000,
+ 323827200000,
+ 338947200000,
+ 354672000000,
+ 370396800000,
+ 386121600000,
+ 401846400000,
+ 417571200000,
+ 433296000000,
+ 449020800000,
+ 465350400000,
+ 481075200000,
+ 496800000000,
+ 512524800000,
+ 528249600000,
+ 543974400000,
+ 559699200000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ -84,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -120,
+ -180,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60
+ ],
+ "population": 0
+ },
+ {
+ "name": "Portugal",
+ "abbrs": [
+ "LMT",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WEMT",
+ "WEST",
+ "WET",
+ "WEST",
+ "WEMT",
+ "WEST",
+ "WET",
+ "WEST",
+ "WEMT",
+ "WEST",
+ "WET",
+ "WEST",
+ "WEMT",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "CET",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "CEST",
+ "CET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET"
+ ],
+ "untils": [
+ -1830384000000,
+ -1689555600000,
+ -1677801600000,
+ -1667437200000,
+ -1647738000000,
+ -1635814800000,
+ -1616202000000,
+ -1604365200000,
+ -1584666000000,
+ -1572742800000,
+ -1553043600000,
+ -1541206800000,
+ -1521507600000,
+ -1442451600000,
+ -1426813200000,
+ -1379293200000,
+ -1364778000000,
+ -1348448400000,
+ -1333328400000,
+ -1316394000000,
+ -1301274000000,
+ -1284339600000,
+ -1269824400000,
+ -1221440400000,
+ -1206925200000,
+ -1191200400000,
+ -1175475600000,
+ -1127696400000,
+ -1111971600000,
+ -1096851600000,
+ -1080522000000,
+ -1063587600000,
+ -1049072400000,
+ -1033347600000,
+ -1017622800000,
+ -1002502800000,
+ -986173200000,
+ -969238800000,
+ -950490000000,
+ -942022800000,
+ -922669200000,
+ -906944400000,
+ -891133200000,
+ -877309200000,
+ -873684000000,
+ -864007200000,
+ -857955600000,
+ -845859600000,
+ -842839200000,
+ -831348000000,
+ -825901200000,
+ -814410000000,
+ -810784800000,
+ -799898400000,
+ -794451600000,
+ -782960400000,
+ -779335200000,
+ -768448800000,
+ -763002000000,
+ -749091600000,
+ -733366800000,
+ -717631200000,
+ -701906400000,
+ -686181600000,
+ -670456800000,
+ -654732000000,
+ -639007200000,
+ -591832800000,
+ -575503200000,
+ -559778400000,
+ -544053600000,
+ -528328800000,
+ -512604000000,
+ -496879200000,
+ -481154400000,
+ -465429600000,
+ -449704800000,
+ -433980000000,
+ -417650400000,
+ -401925600000,
+ -386200800000,
+ -370476000000,
+ -354751200000,
+ -339026400000,
+ -323301600000,
+ -307576800000,
+ -291852000000,
+ -276127200000,
+ -260402400000,
+ -244677600000,
+ -228348000000,
+ -212623200000,
+ -196898400000,
+ -181173600000,
+ -165448800000,
+ -149724000000,
+ -133999200000,
+ -118274400000,
+ 212544000000,
+ 228268800000,
+ 243993600000,
+ 260323200000,
+ 276048000000,
+ 291772800000,
+ 307501200000,
+ 323222400000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417578400000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 36.75,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ -120,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -120,
+ -60,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "PRC",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -933494400000,
+ -923130000000,
+ -908784000000,
+ -891594000000,
+ 515520000000,
+ 527007600000,
+ 545155200000,
+ 558457200000,
+ 576604800000,
+ 589906800000,
+ 608659200000,
+ 621961200000,
+ 640108800000,
+ 653410800000,
+ 671558400000,
+ 684860400000,
+ null
+ ],
+ "offsets": [
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 0
+ },
+ {
+ "name": "PST8PDT",
+ "abbrs": [
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PWT",
+ "PPT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST"
+ ],
+ "untils": [
+ -1633269600000,
+ -1615129200000,
+ -1601820000000,
+ -1583679600000,
+ -880207200000,
+ -769395600000,
+ -765385200000,
+ -84376800000,
+ -68655600000,
+ -52927200000,
+ -37206000000,
+ -21477600000,
+ -5756400000,
+ 9972000000,
+ 25693200000,
+ 41421600000,
+ 57747600000,
+ 73476000000,
+ 89197200000,
+ 104925600000,
+ 120646800000,
+ 126698400000,
+ 152096400000,
+ 162381600000,
+ 183546000000,
+ 199274400000,
+ 215600400000,
+ 230724000000,
+ 247050000000,
+ 262778400000,
+ 278499600000,
+ 294228000000,
+ 309949200000,
+ 325677600000,
+ 341398800000,
+ 357127200000,
+ 372848400000,
+ 388576800000,
+ 404902800000,
+ 420026400000,
+ 436352400000,
+ 452080800000,
+ 467802000000,
+ 483530400000,
+ 499251600000,
+ 514980000000,
+ 530701200000,
+ 544615200000,
+ 562150800000,
+ 576064800000,
+ 594205200000,
+ 607514400000,
+ 625654800000,
+ 638964000000,
+ 657104400000,
+ 671018400000,
+ 688554000000,
+ 702468000000,
+ 720003600000,
+ 733917600000,
+ 752058000000,
+ 765367200000,
+ 783507600000,
+ 796816800000,
+ 814957200000,
+ 828871200000,
+ 846406800000,
+ 860320800000,
+ 877856400000,
+ 891770400000,
+ 909306000000,
+ 923220000000,
+ 941360400000,
+ 954669600000,
+ 972810000000,
+ 986119200000,
+ 1004259600000,
+ 1018173600000,
+ 1035709200000,
+ 1049623200000,
+ 1067158800000,
+ 1081072800000,
+ 1099213200000,
+ 1112522400000,
+ 1130662800000,
+ 1143972000000,
+ 1162112400000,
+ 1173607200000,
+ 1194166800000,
+ 1205056800000,
+ 1225616400000,
+ 1236506400000,
+ 1257066000000,
+ 1268560800000,
+ 1289120400000,
+ 1300010400000,
+ 1320570000000,
+ 1331460000000,
+ 1352019600000,
+ 1362909600000,
+ 1383469200000,
+ 1394359200000,
+ 1414918800000,
+ 1425808800000,
+ 1446368400000,
+ 1457863200000,
+ 1478422800000,
+ 1489312800000,
+ 1509872400000,
+ 1520762400000,
+ 1541322000000,
+ 1552212000000,
+ 1572771600000,
+ 1583661600000,
+ 1604221200000,
+ 1615716000000,
+ 1636275600000,
+ 1647165600000,
+ 1667725200000,
+ 1678615200000,
+ 1699174800000,
+ 1710064800000,
+ 1730624400000,
+ 1741514400000,
+ 1762074000000,
+ 1772964000000,
+ 1793523600000,
+ 1805018400000,
+ 1825578000000,
+ 1836468000000,
+ 1857027600000,
+ 1867917600000,
+ 1888477200000,
+ 1899367200000,
+ 1919926800000,
+ 1930816800000,
+ 1951376400000,
+ 1962871200000,
+ 1983430800000,
+ 1994320800000,
+ 2014880400000,
+ 2025770400000,
+ 2046330000000,
+ 2057220000000,
+ 2077779600000,
+ 2088669600000,
+ 2109229200000,
+ 2120119200000,
+ 2140678800000,
+ null
+ ],
+ "offsets": [
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480
+ ],
+ "population": 0
+ },
+ {
+ "name": "ROC",
+ "abbrs": [
+ "CST",
+ "JST",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1017820800000,
+ -766224000000,
+ -745833600000,
+ -733827600000,
+ -716889600000,
+ -699613200000,
+ -683884800000,
+ -670669200000,
+ -652348800000,
+ -639133200000,
+ -620812800000,
+ -607597200000,
+ -589276800000,
+ -576061200000,
+ -562924800000,
+ -541760400000,
+ -528710400000,
+ -510224400000,
+ -497174400000,
+ -478688400000,
+ -465638400000,
+ -449830800000,
+ -434016000000,
+ -418208400000,
+ -402480000000,
+ -386672400000,
+ -370944000000,
+ -355136400000,
+ -339408000000,
+ -323600400000,
+ -302515200000,
+ -291978000000,
+ -270979200000,
+ -260442000000,
+ 133977600000,
+ 149785200000,
+ 165513600000,
+ 181321200000,
+ 299606400000,
+ 307551600000,
+ null
+ ],
+ "offsets": [
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480,
+ -540,
+ -480
+ ],
+ "population": 0
+ },
+ {
+ "name": "ROK",
+ "abbrs": [
+ "LMT",
+ "KST",
+ "JST",
+ "KST",
+ "KST",
+ "KDT",
+ "KST",
+ "KDT",
+ "KST",
+ "KDT",
+ "KST",
+ "KDT",
+ "KST",
+ "KDT",
+ "KST",
+ "KDT",
+ "KST",
+ "KST",
+ "KDT",
+ "KST",
+ "KDT",
+ "KST"
+ ],
+ "untils": [
+ -1948782472000,
+ -1830414600000,
+ -767350800000,
+ -498128400000,
+ -462702600000,
+ -451733400000,
+ -429784200000,
+ -418296600000,
+ -399544200000,
+ -387451800000,
+ -368094600000,
+ -356002200000,
+ -336645000000,
+ -324552600000,
+ -305195400000,
+ -293103000000,
+ -264933000000,
+ 547578000000,
+ 560883600000,
+ 579027600000,
+ 592333200000,
+ null
+ ],
+ "offsets": [
+ -507.8667,
+ -510,
+ -540,
+ -540,
+ -510,
+ -570,
+ -510,
+ -570,
+ -510,
+ -570,
+ -510,
+ -570,
+ -510,
+ -570,
+ -510,
+ -570,
+ -510,
+ -540,
+ -600,
+ -540,
+ -600,
+ -540
+ ],
+ "population": 0
+ },
+ {
+ "name": "Singapore",
+ "abbrs": [
+ "SMT",
+ "+07",
+ "+0720",
+ "+0730",
+ "+09",
+ "+0730",
+ "+08"
+ ],
+ "untils": [
+ -2038200925000,
+ -1167634800000,
+ -894180000000,
+ -879665400000,
+ -767005200000,
+ 378664200000,
+ null
+ ],
+ "offsets": [
+ -415.4167,
+ -420,
+ -440,
+ -450,
+ -540,
+ -450,
+ -480
+ ],
+ "population": 0
+ },
+ {
+ "name": "Turkey",
+ "abbrs": [
+ "IMT",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "+04",
+ "+03",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "EET",
+ "EEST",
+ "+03"
+ ],
+ "untils": [
+ -1869875816000,
+ -1693706400000,
+ -1680490800000,
+ -1570413600000,
+ -1552186800000,
+ -1538359200000,
+ -1522551600000,
+ -1507514400000,
+ -1490583600000,
+ -1440208800000,
+ -1428030000000,
+ -1409709600000,
+ -1396494000000,
+ -931140000000,
+ -922762800000,
+ -917834400000,
+ -892436400000,
+ -875844000000,
+ -857358000000,
+ -781063200000,
+ -764737200000,
+ -744343200000,
+ -733806000000,
+ -716436000000,
+ -701924400000,
+ -684986400000,
+ -670474800000,
+ -654141600000,
+ -639025200000,
+ -621828000000,
+ -606970800000,
+ -590032800000,
+ -575434800000,
+ -235620000000,
+ -228279600000,
+ -177732000000,
+ -165726000000,
+ 10533600000,
+ 23835600000,
+ 41983200000,
+ 55285200000,
+ 74037600000,
+ 87339600000,
+ 107910000000,
+ 121219200000,
+ 133920000000,
+ 152676000000,
+ 165362400000,
+ 183502800000,
+ 202428000000,
+ 215557200000,
+ 228866400000,
+ 245797200000,
+ 260316000000,
+ 277246800000,
+ 308779200000,
+ 323827200000,
+ 340228800000,
+ 354672000000,
+ 371678400000,
+ 386121600000,
+ 403128000000,
+ 428446800000,
+ 433886400000,
+ 482792400000,
+ 496702800000,
+ 512521200000,
+ 528246000000,
+ 543970800000,
+ 559695600000,
+ 575420400000,
+ 591145200000,
+ 606870000000,
+ 622594800000,
+ 638319600000,
+ 654649200000,
+ 670374000000,
+ 686098800000,
+ 701823600000,
+ 717548400000,
+ 733273200000,
+ 748998000000,
+ 764118000000,
+ 780447600000,
+ 796172400000,
+ 811897200000,
+ 828226800000,
+ 846370800000,
+ 859676400000,
+ 877820400000,
+ 891126000000,
+ 909270000000,
+ 922575600000,
+ 941324400000,
+ 954025200000,
+ 972774000000,
+ 985474800000,
+ 1004223600000,
+ 1017529200000,
+ 1035673200000,
+ 1048978800000,
+ 1067122800000,
+ 1080428400000,
+ 1099177200000,
+ 1111878000000,
+ 1130626800000,
+ 1143327600000,
+ 1162076400000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301274000000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396227600000,
+ 1414285200000,
+ 1427590800000,
+ 1446944400000,
+ 1459040400000,
+ 1473195600000,
+ null
+ ],
+ "offsets": [
+ -116.9333,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -120,
+ -180,
+ -180
+ ],
+ "population": 0
+ },
+ {
+ "name": "UCT",
+ "abbrs": [
+ "UCT"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Universal",
+ "abbrs": [
+ "UTC"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "US/Alaska",
+ "abbrs": [
+ "AST",
+ "AWT",
+ "APT",
+ "AST",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "AHST",
+ "AHDT",
+ "YST",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST",
+ "AKDT",
+ "AKST"
+ ],
+ "untils": [
+ -880200000000,
+ -769395600000,
+ -765378000000,
+ -86882400000,
+ -21470400000,
+ -5749200000,
+ 9979200000,
+ 25700400000,
+ 41428800000,
+ 57754800000,
+ 73483200000,
+ 89204400000,
+ 104932800000,
+ 120654000000,
+ 126705600000,
+ 152103600000,
+ 162388800000,
+ 183553200000,
+ 199281600000,
+ 215607600000,
+ 230731200000,
+ 247057200000,
+ 262785600000,
+ 278506800000,
+ 294235200000,
+ 309956400000,
+ 325684800000,
+ 341406000000,
+ 357134400000,
+ 372855600000,
+ 388584000000,
+ 404910000000,
+ 420033600000,
+ 436359600000,
+ 439030800000,
+ 452084400000,
+ 467805600000,
+ 483534000000,
+ 499255200000,
+ 514983600000,
+ 530704800000,
+ 544618800000,
+ 562154400000,
+ 576068400000,
+ 594208800000,
+ 607518000000,
+ 625658400000,
+ 638967600000,
+ 657108000000,
+ 671022000000,
+ 688557600000,
+ 702471600000,
+ 720007200000,
+ 733921200000,
+ 752061600000,
+ 765370800000,
+ 783511200000,
+ 796820400000,
+ 814960800000,
+ 828874800000,
+ 846410400000,
+ 860324400000,
+ 877860000000,
+ 891774000000,
+ 909309600000,
+ 923223600000,
+ 941364000000,
+ 954673200000,
+ 972813600000,
+ 986122800000,
+ 1004263200000,
+ 1018177200000,
+ 1035712800000,
+ 1049626800000,
+ 1067162400000,
+ 1081076400000,
+ 1099216800000,
+ 1112526000000,
+ 1130666400000,
+ 1143975600000,
+ 1162116000000,
+ 1173610800000,
+ 1194170400000,
+ 1205060400000,
+ 1225620000000,
+ 1236510000000,
+ 1257069600000,
+ 1268564400000,
+ 1289124000000,
+ 1300014000000,
+ 1320573600000,
+ 1331463600000,
+ 1352023200000,
+ 1362913200000,
+ 1383472800000,
+ 1394362800000,
+ 1414922400000,
+ 1425812400000,
+ 1446372000000,
+ 1457866800000,
+ 1478426400000,
+ 1489316400000,
+ 1509876000000,
+ 1520766000000,
+ 1541325600000,
+ 1552215600000,
+ 1572775200000,
+ 1583665200000,
+ 1604224800000,
+ 1615719600000,
+ 1636279200000,
+ 1647169200000,
+ 1667728800000,
+ 1678618800000,
+ 1699178400000,
+ 1710068400000,
+ 1730628000000,
+ 1741518000000,
+ 1762077600000,
+ 1772967600000,
+ 1793527200000,
+ 1805022000000,
+ 1825581600000,
+ 1836471600000,
+ 1857031200000,
+ 1867921200000,
+ 1888480800000,
+ 1899370800000,
+ 1919930400000,
+ 1930820400000,
+ 1951380000000,
+ 1962874800000,
+ 1983434400000,
+ 1994324400000,
+ 2014884000000,
+ 2025774000000,
+ 2046333600000,
+ 2057223600000,
+ 2077783200000,
+ 2088673200000,
+ 2109232800000,
+ 2120122800000,
+ 2140682400000,
+ null
+ ],
+ "offsets": [
+ 600,
+ 540,
+ 540,
+ 600,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 540,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540,
+ 480,
+ 540
+ ],
+ "population": 0
+ },
+ {
+ "name": "US/Aleutian",
+ "abbrs": [
+ "NST",
+ "NWT",
+ "NPT",
+ "NST",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "BST",
+ "BDT",
+ "AHST",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST"
+ ],
+ "untils": [
+ -880196400000,
+ -769395600000,
+ -765374400000,
+ -86878800000,
+ -21466800000,
+ -5745600000,
+ 9982800000,
+ 25704000000,
+ 41432400000,
+ 57758400000,
+ 73486800000,
+ 89208000000,
+ 104936400000,
+ 120657600000,
+ 126709200000,
+ 152107200000,
+ 162392400000,
+ 183556800000,
+ 199285200000,
+ 215611200000,
+ 230734800000,
+ 247060800000,
+ 262789200000,
+ 278510400000,
+ 294238800000,
+ 309960000000,
+ 325688400000,
+ 341409600000,
+ 357138000000,
+ 372859200000,
+ 388587600000,
+ 404913600000,
+ 420037200000,
+ 436363200000,
+ 439034400000,
+ 452088000000,
+ 467809200000,
+ 483537600000,
+ 499258800000,
+ 514987200000,
+ 530708400000,
+ 544622400000,
+ 562158000000,
+ 576072000000,
+ 594212400000,
+ 607521600000,
+ 625662000000,
+ 638971200000,
+ 657111600000,
+ 671025600000,
+ 688561200000,
+ 702475200000,
+ 720010800000,
+ 733924800000,
+ 752065200000,
+ 765374400000,
+ 783514800000,
+ 796824000000,
+ 814964400000,
+ 828878400000,
+ 846414000000,
+ 860328000000,
+ 877863600000,
+ 891777600000,
+ 909313200000,
+ 923227200000,
+ 941367600000,
+ 954676800000,
+ 972817200000,
+ 986126400000,
+ 1004266800000,
+ 1018180800000,
+ 1035716400000,
+ 1049630400000,
+ 1067166000000,
+ 1081080000000,
+ 1099220400000,
+ 1112529600000,
+ 1130670000000,
+ 1143979200000,
+ 1162119600000,
+ 1173614400000,
+ 1194174000000,
+ 1205064000000,
+ 1225623600000,
+ 1236513600000,
+ 1257073200000,
+ 1268568000000,
+ 1289127600000,
+ 1300017600000,
+ 1320577200000,
+ 1331467200000,
+ 1352026800000,
+ 1362916800000,
+ 1383476400000,
+ 1394366400000,
+ 1414926000000,
+ 1425816000000,
+ 1446375600000,
+ 1457870400000,
+ 1478430000000,
+ 1489320000000,
+ 1509879600000,
+ 1520769600000,
+ 1541329200000,
+ 1552219200000,
+ 1572778800000,
+ 1583668800000,
+ 1604228400000,
+ 1615723200000,
+ 1636282800000,
+ 1647172800000,
+ 1667732400000,
+ 1678622400000,
+ 1699182000000,
+ 1710072000000,
+ 1730631600000,
+ 1741521600000,
+ 1762081200000,
+ 1772971200000,
+ 1793530800000,
+ 1805025600000,
+ 1825585200000,
+ 1836475200000,
+ 1857034800000,
+ 1867924800000,
+ 1888484400000,
+ 1899374400000,
+ 1919934000000,
+ 1930824000000,
+ 1951383600000,
+ 1962878400000,
+ 1983438000000,
+ 1994328000000,
+ 2014887600000,
+ 2025777600000,
+ 2046337200000,
+ 2057227200000,
+ 2077786800000,
+ 2088676800000,
+ 2109236400000,
+ 2120126400000,
+ 2140686000000,
+ null
+ ],
+ "offsets": [
+ 660,
+ 600,
+ 600,
+ 660,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 660,
+ 600,
+ 600,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600,
+ 540,
+ 600
+ ],
+ "population": 0
+ },
+ {
+ "name": "US/Arizona",
+ "abbrs": [
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MWT",
+ "MST",
+ "MWT",
+ "MST",
+ "MDT",
+ "MST"
+ ],
+ "untils": [
+ -1633273200000,
+ -1615132800000,
+ -1601823600000,
+ -1583683200000,
+ -880210800000,
+ -820519140000,
+ -812653140000,
+ -796845540000,
+ -84380400000,
+ -68659200000,
+ null
+ ],
+ "offsets": [
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420
+ ],
+ "population": 0
+ },
+ {
+ "name": "US/Central",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "EST",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1633276800000,
+ -1615136400000,
+ -1601827200000,
+ -1583686800000,
+ -1563724800000,
+ -1551632400000,
+ -1538928000000,
+ -1520182800000,
+ -1504454400000,
+ -1491757200000,
+ -1473004800000,
+ -1459702800000,
+ -1441555200000,
+ -1428253200000,
+ -1410105600000,
+ -1396803600000,
+ -1378656000000,
+ -1365354000000,
+ -1347206400000,
+ -1333904400000,
+ -1315152000000,
+ -1301850000000,
+ -1283702400000,
+ -1270400400000,
+ -1252252800000,
+ -1238950800000,
+ -1220803200000,
+ -1207501200000,
+ -1189353600000,
+ -1176051600000,
+ -1157299200000,
+ -1144602000000,
+ -1125849600000,
+ -1112547600000,
+ -1094400000000,
+ -1081098000000,
+ -1067788800000,
+ -1045414800000,
+ -1031500800000,
+ -1018198800000,
+ -1000051200000,
+ -986749200000,
+ -967996800000,
+ -955299600000,
+ -936547200000,
+ -923245200000,
+ -905097600000,
+ -891795600000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -747244800000,
+ -733942800000,
+ -715795200000,
+ -702493200000,
+ -684345600000,
+ -671043600000,
+ -652896000000,
+ -639594000000,
+ -620841600000,
+ -608144400000,
+ -589392000000,
+ -576090000000,
+ -557942400000,
+ -544640400000,
+ -526492800000,
+ -513190800000,
+ -495043200000,
+ -481741200000,
+ -463593600000,
+ -447267600000,
+ -431539200000,
+ -415818000000,
+ -400089600000,
+ -384368400000,
+ -368640000000,
+ -352918800000,
+ -337190400000,
+ -321469200000,
+ -305740800000,
+ -289414800000,
+ -273686400000,
+ -257965200000,
+ -242236800000,
+ -226515600000,
+ -210787200000,
+ -195066000000,
+ -179337600000,
+ -163616400000,
+ -147888000000,
+ -131562000000,
+ -116438400000,
+ -100112400000,
+ -84384000000,
+ -68662800000,
+ -52934400000,
+ -37213200000,
+ -21484800000,
+ -5763600000,
+ 9964800000,
+ 25686000000,
+ 41414400000,
+ 57740400000,
+ 73468800000,
+ 89190000000,
+ 104918400000,
+ 120639600000,
+ 126691200000,
+ 152089200000,
+ 162374400000,
+ 183538800000,
+ 199267200000,
+ 215593200000,
+ 230716800000,
+ 247042800000,
+ 262771200000,
+ 278492400000,
+ 294220800000,
+ 309942000000,
+ 325670400000,
+ 341391600000,
+ 357120000000,
+ 372841200000,
+ 388569600000,
+ 404895600000,
+ 420019200000,
+ 436345200000,
+ 452073600000,
+ 467794800000,
+ 483523200000,
+ 499244400000,
+ 514972800000,
+ 530694000000,
+ 544608000000,
+ 562143600000,
+ 576057600000,
+ 594198000000,
+ 607507200000,
+ 625647600000,
+ 638956800000,
+ 657097200000,
+ 671011200000,
+ 688546800000,
+ 702460800000,
+ 719996400000,
+ 733910400000,
+ 752050800000,
+ 765360000000,
+ 783500400000,
+ 796809600000,
+ 814950000000,
+ 828864000000,
+ 846399600000,
+ 860313600000,
+ 877849200000,
+ 891763200000,
+ 909298800000,
+ 923212800000,
+ 941353200000,
+ 954662400000,
+ 972802800000,
+ 986112000000,
+ 1004252400000,
+ 1018166400000,
+ 1035702000000,
+ 1049616000000,
+ 1067151600000,
+ 1081065600000,
+ 1099206000000,
+ 1112515200000,
+ 1130655600000,
+ 1143964800000,
+ 1162105200000,
+ 1173600000000,
+ 1194159600000,
+ 1205049600000,
+ 1225609200000,
+ 1236499200000,
+ 1257058800000,
+ 1268553600000,
+ 1289113200000,
+ 1300003200000,
+ 1320562800000,
+ 1331452800000,
+ 1352012400000,
+ 1362902400000,
+ 1383462000000,
+ 1394352000000,
+ 1414911600000,
+ 1425801600000,
+ 1446361200000,
+ 1457856000000,
+ 1478415600000,
+ 1489305600000,
+ 1509865200000,
+ 1520755200000,
+ 1541314800000,
+ 1552204800000,
+ 1572764400000,
+ 1583654400000,
+ 1604214000000,
+ 1615708800000,
+ 1636268400000,
+ 1647158400000,
+ 1667718000000,
+ 1678608000000,
+ 1699167600000,
+ 1710057600000,
+ 1730617200000,
+ 1741507200000,
+ 1762066800000,
+ 1772956800000,
+ 1793516400000,
+ 1805011200000,
+ 1825570800000,
+ 1836460800000,
+ 1857020400000,
+ 1867910400000,
+ 1888470000000,
+ 1899360000000,
+ 1919919600000,
+ 1930809600000,
+ 1951369200000,
+ 1962864000000,
+ 1983423600000,
+ 1994313600000,
+ 2014873200000,
+ 2025763200000,
+ 2046322800000,
+ 2057212800000,
+ 2077772400000,
+ 2088662400000,
+ 2109222000000,
+ 2120112000000,
+ 2140671600000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 0
+ },
+ {
+ "name": "US/East-Indiana",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "EST",
+ "CST",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1633276800000,
+ -1615136400000,
+ -1601827200000,
+ -1583686800000,
+ -900259200000,
+ -891795600000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -747244800000,
+ -733942800000,
+ -715795200000,
+ -702493200000,
+ -684345600000,
+ -671043600000,
+ -652896000000,
+ -639594000000,
+ -620841600000,
+ -608144400000,
+ -589392000000,
+ -576090000000,
+ -557942400000,
+ -544640400000,
+ -526492800000,
+ -513190800000,
+ -495043200000,
+ -481741200000,
+ -463593600000,
+ -386787600000,
+ -368640000000,
+ -21488400000,
+ -5767200000,
+ 9961200000,
+ 25682400000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "US/Eastern",
+ "abbrs": [
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EWT",
+ "EPT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -1633280400000,
+ -1615140000000,
+ -1601830800000,
+ -1583690400000,
+ -1570381200000,
+ -1551636000000,
+ -1536512400000,
+ -1523210400000,
+ -1504458000000,
+ -1491760800000,
+ -1473008400000,
+ -1459706400000,
+ -1441558800000,
+ -1428256800000,
+ -1410109200000,
+ -1396807200000,
+ -1378659600000,
+ -1365357600000,
+ -1347210000000,
+ -1333908000000,
+ -1315155600000,
+ -1301853600000,
+ -1283706000000,
+ -1270404000000,
+ -1252256400000,
+ -1238954400000,
+ -1220806800000,
+ -1207504800000,
+ -1189357200000,
+ -1176055200000,
+ -1157302800000,
+ -1144605600000,
+ -1125853200000,
+ -1112551200000,
+ -1094403600000,
+ -1081101600000,
+ -1062954000000,
+ -1049652000000,
+ -1031504400000,
+ -1018202400000,
+ -1000054800000,
+ -986752800000,
+ -968000400000,
+ -955303200000,
+ -936550800000,
+ -923248800000,
+ -905101200000,
+ -891799200000,
+ -880218000000,
+ -769395600000,
+ -765396000000,
+ -747248400000,
+ -733946400000,
+ -715798800000,
+ -702496800000,
+ -684349200000,
+ -671047200000,
+ -652899600000,
+ -639597600000,
+ -620845200000,
+ -608148000000,
+ -589395600000,
+ -576093600000,
+ -557946000000,
+ -544644000000,
+ -526496400000,
+ -513194400000,
+ -495046800000,
+ -481744800000,
+ -463597200000,
+ -447271200000,
+ -431542800000,
+ -415821600000,
+ -400093200000,
+ -384372000000,
+ -368643600000,
+ -352922400000,
+ -337194000000,
+ -321472800000,
+ -305744400000,
+ -289418400000,
+ -273690000000,
+ -257968800000,
+ -242240400000,
+ -226519200000,
+ -210790800000,
+ -195069600000,
+ -179341200000,
+ -163620000000,
+ -147891600000,
+ -131565600000,
+ -116442000000,
+ -100116000000,
+ -84387600000,
+ -68666400000,
+ -52938000000,
+ -37216800000,
+ -21488400000,
+ -5767200000,
+ 9961200000,
+ 25682400000,
+ 41410800000,
+ 57736800000,
+ 73465200000,
+ 89186400000,
+ 104914800000,
+ 120636000000,
+ 126687600000,
+ 152085600000,
+ 162370800000,
+ 183535200000,
+ 199263600000,
+ 215589600000,
+ 230713200000,
+ 247039200000,
+ 262767600000,
+ 278488800000,
+ 294217200000,
+ 309938400000,
+ 325666800000,
+ 341388000000,
+ 357116400000,
+ 372837600000,
+ 388566000000,
+ 404892000000,
+ 420015600000,
+ 436341600000,
+ 452070000000,
+ 467791200000,
+ 483519600000,
+ 499240800000,
+ 514969200000,
+ 530690400000,
+ 544604400000,
+ 562140000000,
+ 576054000000,
+ 594194400000,
+ 607503600000,
+ 625644000000,
+ 638953200000,
+ 657093600000,
+ 671007600000,
+ 688543200000,
+ 702457200000,
+ 719992800000,
+ 733906800000,
+ 752047200000,
+ 765356400000,
+ 783496800000,
+ 796806000000,
+ 814946400000,
+ 828860400000,
+ 846396000000,
+ 860310000000,
+ 877845600000,
+ 891759600000,
+ 909295200000,
+ 923209200000,
+ 941349600000,
+ 954658800000,
+ 972799200000,
+ 986108400000,
+ 1004248800000,
+ 1018162800000,
+ 1035698400000,
+ 1049612400000,
+ 1067148000000,
+ 1081062000000,
+ 1099202400000,
+ 1112511600000,
+ 1130652000000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "US/Hawaii",
+ "abbrs": [
+ "HST",
+ "HDT",
+ "HST",
+ "HDT",
+ "HST",
+ "HST"
+ ],
+ "untils": [
+ -1157283000000,
+ -1155436200000,
+ -880198200000,
+ -765376200000,
+ -712150200000,
+ null
+ ],
+ "offsets": [
+ 630,
+ 570,
+ 630,
+ 570,
+ 630,
+ 600
+ ],
+ "population": 0
+ },
+ {
+ "name": "US/Indiana-Starke",
+ "abbrs": [
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CWT",
+ "CPT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "EST",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "EST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST",
+ "CDT",
+ "CST"
+ ],
+ "untils": [
+ -1633276800000,
+ -1615136400000,
+ -1601827200000,
+ -1583686800000,
+ -880214400000,
+ -769395600000,
+ -765392400000,
+ -715795200000,
+ -702493200000,
+ -684345600000,
+ -671043600000,
+ -652896000000,
+ -639594000000,
+ -620841600000,
+ -608144400000,
+ -589392000000,
+ -576090000000,
+ -557942400000,
+ -544640400000,
+ -526492800000,
+ -513190800000,
+ -495043200000,
+ -481741200000,
+ -463593600000,
+ -447267600000,
+ -431539200000,
+ -415818000000,
+ -400089600000,
+ -386787600000,
+ -368640000000,
+ -355338000000,
+ -337190400000,
+ -321469200000,
+ -305740800000,
+ -289414800000,
+ -273686400000,
+ -257965200000,
+ -242236800000,
+ -195066000000,
+ -84384000000,
+ -68662800000,
+ -52934400000,
+ -37213200000,
+ -21484800000,
+ -5763600000,
+ 9964800000,
+ 25686000000,
+ 41414400000,
+ 57740400000,
+ 73468800000,
+ 89190000000,
+ 104918400000,
+ 120639600000,
+ 126691200000,
+ 152089200000,
+ 162374400000,
+ 183538800000,
+ 199267200000,
+ 215593200000,
+ 230716800000,
+ 247042800000,
+ 262771200000,
+ 278492400000,
+ 294220800000,
+ 309942000000,
+ 325670400000,
+ 341391600000,
+ 357120000000,
+ 372841200000,
+ 388569600000,
+ 404895600000,
+ 420019200000,
+ 436345200000,
+ 452073600000,
+ 467794800000,
+ 483523200000,
+ 499244400000,
+ 514972800000,
+ 530694000000,
+ 544608000000,
+ 562143600000,
+ 576057600000,
+ 594198000000,
+ 607507200000,
+ 625647600000,
+ 638956800000,
+ 657097200000,
+ 671011200000,
+ 688546800000,
+ 1143961200000,
+ 1162105200000,
+ 1173600000000,
+ 1194159600000,
+ 1205049600000,
+ 1225609200000,
+ 1236499200000,
+ 1257058800000,
+ 1268553600000,
+ 1289113200000,
+ 1300003200000,
+ 1320562800000,
+ 1331452800000,
+ 1352012400000,
+ 1362902400000,
+ 1383462000000,
+ 1394352000000,
+ 1414911600000,
+ 1425801600000,
+ 1446361200000,
+ 1457856000000,
+ 1478415600000,
+ 1489305600000,
+ 1509865200000,
+ 1520755200000,
+ 1541314800000,
+ 1552204800000,
+ 1572764400000,
+ 1583654400000,
+ 1604214000000,
+ 1615708800000,
+ 1636268400000,
+ 1647158400000,
+ 1667718000000,
+ 1678608000000,
+ 1699167600000,
+ 1710057600000,
+ 1730617200000,
+ 1741507200000,
+ 1762066800000,
+ 1772956800000,
+ 1793516400000,
+ 1805011200000,
+ 1825570800000,
+ 1836460800000,
+ 1857020400000,
+ 1867910400000,
+ 1888470000000,
+ 1899360000000,
+ 1919919600000,
+ 1930809600000,
+ 1951369200000,
+ 1962864000000,
+ 1983423600000,
+ 1994313600000,
+ 2014873200000,
+ 2025763200000,
+ 2046322800000,
+ 2057212800000,
+ 2077772400000,
+ 2088662400000,
+ 2109222000000,
+ 2120112000000,
+ 2140671600000,
+ null
+ ],
+ "offsets": [
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 300,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360,
+ 300,
+ 360
+ ],
+ "population": 0
+ },
+ {
+ "name": "US/Michigan",
+ "abbrs": [
+ "LMT",
+ "CST",
+ "EST",
+ "EWT",
+ "EPT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST",
+ "EDT",
+ "EST"
+ ],
+ "untils": [
+ -2051202469000,
+ -1724083200000,
+ -880218000000,
+ -769395600000,
+ -765396000000,
+ -684349200000,
+ -671047200000,
+ 104914800000,
+ 120636000000,
+ 126687600000,
+ 152085600000,
+ 167814000000,
+ 183535200000,
+ 199263600000,
+ 215589600000,
+ 230713200000,
+ 247039200000,
+ 262767600000,
+ 278488800000,
+ 294217200000,
+ 309938400000,
+ 325666800000,
+ 341388000000,
+ 357116400000,
+ 372837600000,
+ 388566000000,
+ 404892000000,
+ 420015600000,
+ 436341600000,
+ 452070000000,
+ 467791200000,
+ 483519600000,
+ 499240800000,
+ 514969200000,
+ 530690400000,
+ 544604400000,
+ 562140000000,
+ 576054000000,
+ 594194400000,
+ 607503600000,
+ 625644000000,
+ 638953200000,
+ 657093600000,
+ 671007600000,
+ 688543200000,
+ 702457200000,
+ 719992800000,
+ 733906800000,
+ 752047200000,
+ 765356400000,
+ 783496800000,
+ 796806000000,
+ 814946400000,
+ 828860400000,
+ 846396000000,
+ 860310000000,
+ 877845600000,
+ 891759600000,
+ 909295200000,
+ 923209200000,
+ 941349600000,
+ 954658800000,
+ 972799200000,
+ 986108400000,
+ 1004248800000,
+ 1018162800000,
+ 1035698400000,
+ 1049612400000,
+ 1067148000000,
+ 1081062000000,
+ 1099202400000,
+ 1112511600000,
+ 1130652000000,
+ 1143961200000,
+ 1162101600000,
+ 1173596400000,
+ 1194156000000,
+ 1205046000000,
+ 1225605600000,
+ 1236495600000,
+ 1257055200000,
+ 1268550000000,
+ 1289109600000,
+ 1299999600000,
+ 1320559200000,
+ 1331449200000,
+ 1352008800000,
+ 1362898800000,
+ 1383458400000,
+ 1394348400000,
+ 1414908000000,
+ 1425798000000,
+ 1446357600000,
+ 1457852400000,
+ 1478412000000,
+ 1489302000000,
+ 1509861600000,
+ 1520751600000,
+ 1541311200000,
+ 1552201200000,
+ 1572760800000,
+ 1583650800000,
+ 1604210400000,
+ 1615705200000,
+ 1636264800000,
+ 1647154800000,
+ 1667714400000,
+ 1678604400000,
+ 1699164000000,
+ 1710054000000,
+ 1730613600000,
+ 1741503600000,
+ 1762063200000,
+ 1772953200000,
+ 1793512800000,
+ 1805007600000,
+ 1825567200000,
+ 1836457200000,
+ 1857016800000,
+ 1867906800000,
+ 1888466400000,
+ 1899356400000,
+ 1919916000000,
+ 1930806000000,
+ 1951365600000,
+ 1962860400000,
+ 1983420000000,
+ 1994310000000,
+ 2014869600000,
+ 2025759600000,
+ 2046319200000,
+ 2057209200000,
+ 2077768800000,
+ 2088658800000,
+ 2109218400000,
+ 2120108400000,
+ 2140668000000,
+ null
+ ],
+ "offsets": [
+ 332.1833,
+ 360,
+ 300,
+ 240,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300,
+ 240,
+ 300
+ ],
+ "population": 0
+ },
+ {
+ "name": "US/Mountain",
+ "abbrs": [
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MWT",
+ "MPT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST",
+ "MDT",
+ "MST"
+ ],
+ "untils": [
+ -1633273200000,
+ -1615132800000,
+ -1601823600000,
+ -1583683200000,
+ -1570374000000,
+ -1551628800000,
+ -1538924400000,
+ -1534089600000,
+ -880210800000,
+ -769395600000,
+ -765388800000,
+ -147884400000,
+ -131558400000,
+ -116434800000,
+ -100108800000,
+ -84380400000,
+ -68659200000,
+ -52930800000,
+ -37209600000,
+ -21481200000,
+ -5760000000,
+ 9968400000,
+ 25689600000,
+ 41418000000,
+ 57744000000,
+ 73472400000,
+ 89193600000,
+ 104922000000,
+ 120643200000,
+ 126694800000,
+ 152092800000,
+ 162378000000,
+ 183542400000,
+ 199270800000,
+ 215596800000,
+ 230720400000,
+ 247046400000,
+ 262774800000,
+ 278496000000,
+ 294224400000,
+ 309945600000,
+ 325674000000,
+ 341395200000,
+ 357123600000,
+ 372844800000,
+ 388573200000,
+ 404899200000,
+ 420022800000,
+ 436348800000,
+ 452077200000,
+ 467798400000,
+ 483526800000,
+ 499248000000,
+ 514976400000,
+ 530697600000,
+ 544611600000,
+ 562147200000,
+ 576061200000,
+ 594201600000,
+ 607510800000,
+ 625651200000,
+ 638960400000,
+ 657100800000,
+ 671014800000,
+ 688550400000,
+ 702464400000,
+ 720000000000,
+ 733914000000,
+ 752054400000,
+ 765363600000,
+ 783504000000,
+ 796813200000,
+ 814953600000,
+ 828867600000,
+ 846403200000,
+ 860317200000,
+ 877852800000,
+ 891766800000,
+ 909302400000,
+ 923216400000,
+ 941356800000,
+ 954666000000,
+ 972806400000,
+ 986115600000,
+ 1004256000000,
+ 1018170000000,
+ 1035705600000,
+ 1049619600000,
+ 1067155200000,
+ 1081069200000,
+ 1099209600000,
+ 1112518800000,
+ 1130659200000,
+ 1143968400000,
+ 1162108800000,
+ 1173603600000,
+ 1194163200000,
+ 1205053200000,
+ 1225612800000,
+ 1236502800000,
+ 1257062400000,
+ 1268557200000,
+ 1289116800000,
+ 1300006800000,
+ 1320566400000,
+ 1331456400000,
+ 1352016000000,
+ 1362906000000,
+ 1383465600000,
+ 1394355600000,
+ 1414915200000,
+ 1425805200000,
+ 1446364800000,
+ 1457859600000,
+ 1478419200000,
+ 1489309200000,
+ 1509868800000,
+ 1520758800000,
+ 1541318400000,
+ 1552208400000,
+ 1572768000000,
+ 1583658000000,
+ 1604217600000,
+ 1615712400000,
+ 1636272000000,
+ 1647162000000,
+ 1667721600000,
+ 1678611600000,
+ 1699171200000,
+ 1710061200000,
+ 1730620800000,
+ 1741510800000,
+ 1762070400000,
+ 1772960400000,
+ 1793520000000,
+ 1805014800000,
+ 1825574400000,
+ 1836464400000,
+ 1857024000000,
+ 1867914000000,
+ 1888473600000,
+ 1899363600000,
+ 1919923200000,
+ 1930813200000,
+ 1951372800000,
+ 1962867600000,
+ 1983427200000,
+ 1994317200000,
+ 2014876800000,
+ 2025766800000,
+ 2046326400000,
+ 2057216400000,
+ 2077776000000,
+ 2088666000000,
+ 2109225600000,
+ 2120115600000,
+ 2140675200000,
+ null
+ ],
+ "offsets": [
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420,
+ 360,
+ 420
+ ],
+ "population": 0
+ },
+ {
+ "name": "US/Pacific-New",
+ "abbrs": [
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PWT",
+ "PPT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST"
+ ],
+ "untils": [
+ -1633269600000,
+ -1615129200000,
+ -1601820000000,
+ -1583679600000,
+ -880207200000,
+ -769395600000,
+ -765385200000,
+ -687967140000,
+ -662655600000,
+ -620838000000,
+ -608137200000,
+ -589388400000,
+ -576082800000,
+ -557938800000,
+ -544633200000,
+ -526489200000,
+ -513183600000,
+ -495039600000,
+ -481734000000,
+ -463590000000,
+ -450284400000,
+ -431535600000,
+ -418230000000,
+ -400086000000,
+ -386780400000,
+ -368636400000,
+ -355330800000,
+ -337186800000,
+ -323881200000,
+ -305737200000,
+ -292431600000,
+ -273682800000,
+ -260982000000,
+ -242233200000,
+ -226508400000,
+ -210783600000,
+ -195058800000,
+ -179334000000,
+ -163609200000,
+ -147884400000,
+ -131554800000,
+ -116434800000,
+ -100105200000,
+ -84376800000,
+ -68655600000,
+ -52927200000,
+ -37206000000,
+ -21477600000,
+ -5756400000,
+ 9972000000,
+ 25693200000,
+ 41421600000,
+ 57747600000,
+ 73476000000,
+ 89197200000,
+ 104925600000,
+ 120646800000,
+ 126698400000,
+ 152096400000,
+ 162381600000,
+ 183546000000,
+ 199274400000,
+ 215600400000,
+ 230724000000,
+ 247050000000,
+ 262778400000,
+ 278499600000,
+ 294228000000,
+ 309949200000,
+ 325677600000,
+ 341398800000,
+ 357127200000,
+ 372848400000,
+ 388576800000,
+ 404902800000,
+ 420026400000,
+ 436352400000,
+ 452080800000,
+ 467802000000,
+ 483530400000,
+ 499251600000,
+ 514980000000,
+ 530701200000,
+ 544615200000,
+ 562150800000,
+ 576064800000,
+ 594205200000,
+ 607514400000,
+ 625654800000,
+ 638964000000,
+ 657104400000,
+ 671018400000,
+ 688554000000,
+ 702468000000,
+ 720003600000,
+ 733917600000,
+ 752058000000,
+ 765367200000,
+ 783507600000,
+ 796816800000,
+ 814957200000,
+ 828871200000,
+ 846406800000,
+ 860320800000,
+ 877856400000,
+ 891770400000,
+ 909306000000,
+ 923220000000,
+ 941360400000,
+ 954669600000,
+ 972810000000,
+ 986119200000,
+ 1004259600000,
+ 1018173600000,
+ 1035709200000,
+ 1049623200000,
+ 1067158800000,
+ 1081072800000,
+ 1099213200000,
+ 1112522400000,
+ 1130662800000,
+ 1143972000000,
+ 1162112400000,
+ 1173607200000,
+ 1194166800000,
+ 1205056800000,
+ 1225616400000,
+ 1236506400000,
+ 1257066000000,
+ 1268560800000,
+ 1289120400000,
+ 1300010400000,
+ 1320570000000,
+ 1331460000000,
+ 1352019600000,
+ 1362909600000,
+ 1383469200000,
+ 1394359200000,
+ 1414918800000,
+ 1425808800000,
+ 1446368400000,
+ 1457863200000,
+ 1478422800000,
+ 1489312800000,
+ 1509872400000,
+ 1520762400000,
+ 1541322000000,
+ 1552212000000,
+ 1572771600000,
+ 1583661600000,
+ 1604221200000,
+ 1615716000000,
+ 1636275600000,
+ 1647165600000,
+ 1667725200000,
+ 1678615200000,
+ 1699174800000,
+ 1710064800000,
+ 1730624400000,
+ 1741514400000,
+ 1762074000000,
+ 1772964000000,
+ 1793523600000,
+ 1805018400000,
+ 1825578000000,
+ 1836468000000,
+ 1857027600000,
+ 1867917600000,
+ 1888477200000,
+ 1899367200000,
+ 1919926800000,
+ 1930816800000,
+ 1951376400000,
+ 1962871200000,
+ 1983430800000,
+ 1994320800000,
+ 2014880400000,
+ 2025770400000,
+ 2046330000000,
+ 2057220000000,
+ 2077779600000,
+ 2088669600000,
+ 2109229200000,
+ 2120119200000,
+ 2140678800000,
+ null
+ ],
+ "offsets": [
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480
+ ],
+ "population": 0
+ },
+ {
+ "name": "US/Pacific",
+ "abbrs": [
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PWT",
+ "PPT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST",
+ "PDT",
+ "PST"
+ ],
+ "untils": [
+ -1633269600000,
+ -1615129200000,
+ -1601820000000,
+ -1583679600000,
+ -880207200000,
+ -769395600000,
+ -765385200000,
+ -687967140000,
+ -662655600000,
+ -620838000000,
+ -608137200000,
+ -589388400000,
+ -576082800000,
+ -557938800000,
+ -544633200000,
+ -526489200000,
+ -513183600000,
+ -495039600000,
+ -481734000000,
+ -463590000000,
+ -450284400000,
+ -431535600000,
+ -418230000000,
+ -400086000000,
+ -386780400000,
+ -368636400000,
+ -355330800000,
+ -337186800000,
+ -323881200000,
+ -305737200000,
+ -292431600000,
+ -273682800000,
+ -260982000000,
+ -242233200000,
+ -226508400000,
+ -210783600000,
+ -195058800000,
+ -179334000000,
+ -163609200000,
+ -147884400000,
+ -131554800000,
+ -116434800000,
+ -100105200000,
+ -84376800000,
+ -68655600000,
+ -52927200000,
+ -37206000000,
+ -21477600000,
+ -5756400000,
+ 9972000000,
+ 25693200000,
+ 41421600000,
+ 57747600000,
+ 73476000000,
+ 89197200000,
+ 104925600000,
+ 120646800000,
+ 126698400000,
+ 152096400000,
+ 162381600000,
+ 183546000000,
+ 199274400000,
+ 215600400000,
+ 230724000000,
+ 247050000000,
+ 262778400000,
+ 278499600000,
+ 294228000000,
+ 309949200000,
+ 325677600000,
+ 341398800000,
+ 357127200000,
+ 372848400000,
+ 388576800000,
+ 404902800000,
+ 420026400000,
+ 436352400000,
+ 452080800000,
+ 467802000000,
+ 483530400000,
+ 499251600000,
+ 514980000000,
+ 530701200000,
+ 544615200000,
+ 562150800000,
+ 576064800000,
+ 594205200000,
+ 607514400000,
+ 625654800000,
+ 638964000000,
+ 657104400000,
+ 671018400000,
+ 688554000000,
+ 702468000000,
+ 720003600000,
+ 733917600000,
+ 752058000000,
+ 765367200000,
+ 783507600000,
+ 796816800000,
+ 814957200000,
+ 828871200000,
+ 846406800000,
+ 860320800000,
+ 877856400000,
+ 891770400000,
+ 909306000000,
+ 923220000000,
+ 941360400000,
+ 954669600000,
+ 972810000000,
+ 986119200000,
+ 1004259600000,
+ 1018173600000,
+ 1035709200000,
+ 1049623200000,
+ 1067158800000,
+ 1081072800000,
+ 1099213200000,
+ 1112522400000,
+ 1130662800000,
+ 1143972000000,
+ 1162112400000,
+ 1173607200000,
+ 1194166800000,
+ 1205056800000,
+ 1225616400000,
+ 1236506400000,
+ 1257066000000,
+ 1268560800000,
+ 1289120400000,
+ 1300010400000,
+ 1320570000000,
+ 1331460000000,
+ 1352019600000,
+ 1362909600000,
+ 1383469200000,
+ 1394359200000,
+ 1414918800000,
+ 1425808800000,
+ 1446368400000,
+ 1457863200000,
+ 1478422800000,
+ 1489312800000,
+ 1509872400000,
+ 1520762400000,
+ 1541322000000,
+ 1552212000000,
+ 1572771600000,
+ 1583661600000,
+ 1604221200000,
+ 1615716000000,
+ 1636275600000,
+ 1647165600000,
+ 1667725200000,
+ 1678615200000,
+ 1699174800000,
+ 1710064800000,
+ 1730624400000,
+ 1741514400000,
+ 1762074000000,
+ 1772964000000,
+ 1793523600000,
+ 1805018400000,
+ 1825578000000,
+ 1836468000000,
+ 1857027600000,
+ 1867917600000,
+ 1888477200000,
+ 1899367200000,
+ 1919926800000,
+ 1930816800000,
+ 1951376400000,
+ 1962871200000,
+ 1983430800000,
+ 1994320800000,
+ 2014880400000,
+ 2025770400000,
+ 2046330000000,
+ 2057220000000,
+ 2077779600000,
+ 2088669600000,
+ 2109229200000,
+ 2120119200000,
+ 2140678800000,
+ null
+ ],
+ "offsets": [
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480,
+ 420,
+ 480
+ ],
+ "population": 0
+ },
+ {
+ "name": "US/Samoa",
+ "abbrs": [
+ "LMT",
+ "SST"
+ ],
+ "untils": [
+ -1861879032000,
+ null
+ ],
+ "offsets": [
+ 682.8,
+ 660
+ ],
+ "population": 0
+ },
+ {
+ "name": "UTC",
+ "abbrs": [
+ "UTC"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "W-SU",
+ "abbrs": [
+ "MMT",
+ "MMT",
+ "MST",
+ "MMT",
+ "MDST",
+ "MST",
+ "MDST",
+ "MSD",
+ "MSK",
+ "MSD",
+ "+05",
+ "MSD",
+ "MSK",
+ "EET",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "EEST",
+ "EET",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSD",
+ "MSK",
+ "MSK",
+ "MSK"
+ ],
+ "untils": [
+ -1688265017000,
+ -1656819079000,
+ -1641353479000,
+ -1627965079000,
+ -1618716679000,
+ -1596429079000,
+ -1593820800000,
+ -1589860800000,
+ -1542427200000,
+ -1539493200000,
+ -1525323600000,
+ -1522728000000,
+ -1491188400000,
+ -1247536800000,
+ 354920400000,
+ 370728000000,
+ 386456400000,
+ 402264000000,
+ 417992400000,
+ 433800000000,
+ 449614800000,
+ 465346800000,
+ 481071600000,
+ 496796400000,
+ 512521200000,
+ 528246000000,
+ 543970800000,
+ 559695600000,
+ 575420400000,
+ 591145200000,
+ 606870000000,
+ 622594800000,
+ 638319600000,
+ 654649200000,
+ 670374000000,
+ 686102400000,
+ 695779200000,
+ 701823600000,
+ 717548400000,
+ 733273200000,
+ 748998000000,
+ 764722800000,
+ 780447600000,
+ 796172400000,
+ 811897200000,
+ 828226800000,
+ 846370800000,
+ 859676400000,
+ 877820400000,
+ 891126000000,
+ 909270000000,
+ 922575600000,
+ 941324400000,
+ 954025200000,
+ 972774000000,
+ 985474800000,
+ 1004223600000,
+ 1017529200000,
+ 1035673200000,
+ 1048978800000,
+ 1067122800000,
+ 1080428400000,
+ 1099177200000,
+ 1111878000000,
+ 1130626800000,
+ 1143327600000,
+ 1162076400000,
+ 1174777200000,
+ 1193526000000,
+ 1206831600000,
+ 1224975600000,
+ 1238281200000,
+ 1256425200000,
+ 1269730800000,
+ 1288479600000,
+ 1301180400000,
+ 1414274400000,
+ null
+ ],
+ "offsets": [
+ -150.2833,
+ -151.3167,
+ -211.3167,
+ -151.3167,
+ -271.3167,
+ -211.3167,
+ -271.3167,
+ -240,
+ -180,
+ -240,
+ -300,
+ -240,
+ -180,
+ -120,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -180,
+ -120,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180,
+ -240,
+ -180
+ ],
+ "population": 0
+ },
+ {
+ "name": "WET",
+ "abbrs": [
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET",
+ "WEST",
+ "WET"
+ ],
+ "untils": [
+ 228877200000,
+ 243997200000,
+ 260326800000,
+ 276051600000,
+ 291776400000,
+ 307501200000,
+ 323830800000,
+ 338950800000,
+ 354675600000,
+ 370400400000,
+ 386125200000,
+ 401850000000,
+ 417574800000,
+ 433299600000,
+ 449024400000,
+ 465354000000,
+ 481078800000,
+ 496803600000,
+ 512528400000,
+ 528253200000,
+ 543978000000,
+ 559702800000,
+ 575427600000,
+ 591152400000,
+ 606877200000,
+ 622602000000,
+ 638326800000,
+ 654656400000,
+ 670381200000,
+ 686106000000,
+ 701830800000,
+ 717555600000,
+ 733280400000,
+ 749005200000,
+ 764730000000,
+ 780454800000,
+ 796179600000,
+ 811904400000,
+ 828234000000,
+ 846378000000,
+ 859683600000,
+ 877827600000,
+ 891133200000,
+ 909277200000,
+ 922582800000,
+ 941331600000,
+ 954032400000,
+ 972781200000,
+ 985482000000,
+ 1004230800000,
+ 1017536400000,
+ 1035680400000,
+ 1048986000000,
+ 1067130000000,
+ 1080435600000,
+ 1099184400000,
+ 1111885200000,
+ 1130634000000,
+ 1143334800000,
+ 1162083600000,
+ 1174784400000,
+ 1193533200000,
+ 1206838800000,
+ 1224982800000,
+ 1238288400000,
+ 1256432400000,
+ 1269738000000,
+ 1288486800000,
+ 1301187600000,
+ 1319936400000,
+ 1332637200000,
+ 1351386000000,
+ 1364691600000,
+ 1382835600000,
+ 1396141200000,
+ 1414285200000,
+ 1427590800000,
+ 1445734800000,
+ 1459040400000,
+ 1477789200000,
+ 1490490000000,
+ 1509238800000,
+ 1521939600000,
+ 1540688400000,
+ 1553994000000,
+ 1572138000000,
+ 1585443600000,
+ 1603587600000,
+ 1616893200000,
+ 1635642000000,
+ 1648342800000,
+ 1667091600000,
+ 1679792400000,
+ 1698541200000,
+ 1711846800000,
+ 1729990800000,
+ 1743296400000,
+ 1761440400000,
+ 1774746000000,
+ 1792890000000,
+ 1806195600000,
+ 1824944400000,
+ 1837645200000,
+ 1856394000000,
+ 1869094800000,
+ 1887843600000,
+ 1901149200000,
+ 1919293200000,
+ 1932598800000,
+ 1950742800000,
+ 1964048400000,
+ 1982797200000,
+ 1995498000000,
+ 2014246800000,
+ 2026947600000,
+ 2045696400000,
+ 2058397200000,
+ 2077146000000,
+ 2090451600000,
+ 2108595600000,
+ 2121901200000,
+ 2140045200000,
+ null
+ ],
+ "offsets": [
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0,
+ -60,
+ 0
+ ],
+ "population": 0
+ },
+ {
+ "name": "Zulu",
+ "abbrs": [
+ "UTC"
+ ],
+ "untils": [
+ null
+ ],
+ "offsets": [
+ 0
+ ],
+ "population": 0
+ }
+ ],
+ "links": []
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/moment-timezone-utils.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/moment-timezone-utils.js
new file mode 100644
index 00000000000..7c10e395cf2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/moment-timezone-utils.js
@@ -0,0 +1,318 @@
+//! moment-timezone-utils.js
+//! version : 0.5.17
+//! Copyright (c) JS Foundation and other contributors
+//! license : MIT
+//! github.com/moment/moment-timezone
+
+(function (root, factory) {
+ "use strict";
+
+ /*global define*/
+ if (typeof define === 'function' && define.amd) {
+ define(['moment'], factory); // AMD
+ } else if (typeof module === 'object' && module.exports) {
+ module.exports = factory(require('./')); // Node
+ } else {
+ factory(root.moment); // Browser
+ }
+}(this, function (moment) {
+ "use strict";
+
+ if (!moment.tz) {
+ throw new Error("moment-timezone-utils.js must be loaded after moment-timezone.js");
+ }
+
+ /************************************
+ Pack Base 60
+ ************************************/
+
+ var BASE60 = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX',
+ EPSILON = 0.000001; // Used to fix floating point rounding errors
+
+ function packBase60Fraction(fraction, precision) {
+ var buffer = '.',
+ output = '',
+ current;
+
+ while (precision > 0) {
+ precision -= 1;
+ fraction *= 60;
+ current = Math.floor(fraction + EPSILON);
+ buffer += BASE60[current];
+ fraction -= current;
+
+ // Only add buffer to output once we have a non-zero value.
+ // This makes '.000' output '', and '.100' output '.1'
+ if (current) {
+ output += buffer;
+ buffer = '';
+ }
+ }
+
+ return output;
+ }
+
+ function packBase60(number, precision) {
+ var output = '',
+ absolute = Math.abs(number),
+ whole = Math.floor(absolute),
+ fraction = packBase60Fraction(absolute - whole, Math.min(~~precision, 10));
+
+ while (whole > 0) {
+ output = BASE60[whole % 60] + output;
+ whole = Math.floor(whole / 60);
+ }
+
+ if (number < 0) {
+ output = '-' + output;
+ }
+
+ if (output && fraction) {
+ return output + fraction;
+ }
+
+ if (!fraction && output === '-') {
+ return '0';
+ }
+
+ return output || fraction || '0';
+ }
+
+ /************************************
+ Pack
+ ************************************/
+
+ function packUntils(untils) {
+ var out = [],
+ last = 0,
+ i;
+
+ for (i = 0; i < untils.length - 1; i++) {
+ out[i] = packBase60(Math.round((untils[i] - last) / 1000) / 60, 1);
+ last = untils[i];
+ }
+
+ return out.join(' ');
+ }
+
+ function packAbbrsAndOffsets(source) {
+ var index = 0,
+ abbrs = [],
+ offsets = [],
+ indices = [],
+ map = {},
+ i, key;
+
+ for (i = 0; i < source.abbrs.length; i++) {
+ key = source.abbrs[i] + '|' + source.offsets[i];
+ if (map[key] === undefined) {
+ map[key] = index;
+ abbrs[index] = source.abbrs[i];
+ offsets[index] = packBase60(Math.round(source.offsets[i] * 60) / 60, 1);
+ index++;
+ }
+ indices[i] = packBase60(map[key], 0);
+ }
+
+ return abbrs.join(' ') + '|' + offsets.join(' ') + '|' + indices.join('');
+ }
+
+ function packPopulation (number) {
+ if (!number) {
+ return '';
+ }
+ if (number < 1000) {
+ return '|' + number;
+ }
+ var exponent = String(number | 0).length - 2;
+ var precision = Math.round(number / Math.pow(10, exponent));
+ return '|' + precision + 'e' + exponent;
+ }
+
+ function validatePackData (source) {
+ if (!source.name) { throw new Error("Missing name"); }
+ if (!source.abbrs) { throw new Error("Missing abbrs"); }
+ if (!source.untils) { throw new Error("Missing untils"); }
+ if (!source.offsets) { throw new Error("Missing offsets"); }
+ if (
+ source.offsets.length !== source.untils.length ||
+ source.offsets.length !== source.abbrs.length
+ ) {
+ throw new Error("Mismatched array lengths");
+ }
+ }
+
+ function pack (source) {
+ validatePackData(source);
+ return [
+ source.name,
+ packAbbrsAndOffsets(source),
+ packUntils(source.untils) + packPopulation(source.population)
+ ].join('|');
+ }
+
+ /************************************
+ Create Links
+ ************************************/
+
+ function arraysAreEqual(a, b) {
+ var i;
+
+ if (a.length !== b.length) { return false; }
+
+ for (i = 0; i < a.length; i++) {
+ if (a[i] !== b[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function zonesAreEqual(a, b) {
+ return arraysAreEqual(a.offsets, b.offsets) && arraysAreEqual(a.abbrs, b.abbrs) && arraysAreEqual(a.untils, b.untils);
+ }
+
+ function findAndCreateLinks (input, output, links, groupLeaders) {
+ var i, j, a, b, group, foundGroup, groups = [];
+
+ for (i = 0; i < input.length; i++) {
+ foundGroup = false;
+ a = input[i];
+
+ for (j = 0; j < groups.length; j++) {
+ group = groups[j];
+ b = group[0];
+ if (zonesAreEqual(a, b)) {
+ if (a.population > b.population) {
+ group.unshift(a);
+ } else if (a.population === b.population && groupLeaders && groupLeaders[a.name]) {
+ group.unshift(a);
+ } else {
+ group.push(a);
+ }
+ foundGroup = true;
+ }
+ }
+
+ if (!foundGroup) {
+ groups.push([a]);
+ }
+ }
+
+ for (i = 0; i < groups.length; i++) {
+ group = groups[i];
+ output.push(group[0]);
+ for (j = 1; j < group.length; j++) {
+ links.push(group[0].name + '|' + group[j].name);
+ }
+ }
+ }
+
+ function createLinks (source, groupLeaders) {
+ var zones = [],
+ links = [];
+
+ if (source.links) {
+ links = source.links.slice();
+ }
+
+ findAndCreateLinks(source.zones, zones, links, groupLeaders);
+
+ return {
+ version : source.version,
+ zones : zones,
+ links : links.sort()
+ };
+ }
+
+ /************************************
+ Filter Years
+ ************************************/
+
+ function findStartAndEndIndex (untils, start, end) {
+ var startI = 0,
+ endI = untils.length + 1,
+ untilYear,
+ i;
+
+ if (!end) {
+ end = start;
+ }
+
+ if (start > end) {
+ i = start;
+ start = end;
+ end = i;
+ }
+
+ for (i = 0; i < untils.length; i++) {
+ if (untils[i] == null) {
+ continue;
+ }
+ untilYear = new Date(untils[i]).getUTCFullYear();
+ if (untilYear < start) {
+ startI = i + 1;
+ }
+ if (untilYear > end) {
+ endI = Math.min(endI, i + 1);
+ }
+ }
+
+ return [startI, endI];
+ }
+
+ function filterYears (source, start, end) {
+ var slice = Array.prototype.slice,
+ indices = findStartAndEndIndex(source.untils, start, end),
+ untils = slice.apply(source.untils, indices);
+
+ untils[untils.length - 1] = null;
+
+ return {
+ name : source.name,
+ abbrs : slice.apply(source.abbrs, indices),
+ untils : untils,
+ offsets : slice.apply(source.offsets, indices),
+ population : source.population
+ };
+ }
+
+ /************************************
+ Filter, Link, and Pack
+ ************************************/
+
+ function filterLinkPack (input, start, end, groupLeaders) {
+ var i,
+ inputZones = input.zones,
+ outputZones = [],
+ output;
+
+ for (i = 0; i < inputZones.length; i++) {
+ outputZones[i] = filterYears(inputZones[i], start, end);
+ }
+
+ output = createLinks({
+ zones : outputZones,
+ links : input.links.slice(),
+ version : input.version
+ }, groupLeaders);
+
+ for (i = 0; i < output.zones.length; i++) {
+ output.zones[i] = pack(output.zones[i]);
+ }
+
+ return output;
+ }
+
+ /************************************
+ Exports
+ ************************************/
+
+ moment.tz.pack = pack;
+ moment.tz.packBase60 = packBase60;
+ moment.tz.createLinks = createLinks;
+ moment.tz.filterYears = filterYears;
+ moment.tz.filterLinkPack = filterLinkPack;
+
+ return moment;
+}));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/moment-timezone.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/moment-timezone.js
new file mode 100644
index 00000000000..5079eb0d4ef
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment-timezone/moment-timezone.js
@@ -0,0 +1,605 @@
+//! moment-timezone.js
+//! version : 0.5.17
+//! Copyright (c) JS Foundation and other contributors
+//! license : MIT
+//! github.com/moment/moment-timezone
+
+(function (root, factory) {
+ "use strict";
+
+ /*global define*/
+ if (typeof define === 'function' && define.amd) {
+ define(['moment'], factory); // AMD
+ } else if (typeof module === 'object' && module.exports) {
+ module.exports = factory(require('moment')); // Node
+ } else {
+ factory(root.moment); // Browser
+ }
+}(this, function (moment) {
+ "use strict";
+
+ // Do not load moment-timezone a second time.
+ // if (moment.tz !== undefined) {
+ // logError('Moment Timezone ' + moment.tz.version + ' was already loaded ' + (moment.tz.dataVersion ? 'with data from ' : 'without any data') + moment.tz.dataVersion);
+ // return moment;
+ // }
+
+ var VERSION = "0.5.17",
+ zones = {},
+ links = {},
+ names = {},
+ guesses = {},
+ cachedGuess,
+
+ momentVersion = moment.version.split('.'),
+ major = +momentVersion[0],
+ minor = +momentVersion[1];
+
+ // Moment.js version check
+ if (major < 2 || (major === 2 && minor < 6)) {
+ logError('Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js ' + moment.version + '. See momentjs.com');
+ }
+
+ /************************************
+ Unpacking
+ ************************************/
+
+ function charCodeToInt(charCode) {
+ if (charCode > 96) {
+ return charCode - 87;
+ } else if (charCode > 64) {
+ return charCode - 29;
+ }
+ return charCode - 48;
+ }
+
+ function unpackBase60(string) {
+ var i = 0,
+ parts = string.split('.'),
+ whole = parts[0],
+ fractional = parts[1] || '',
+ multiplier = 1,
+ num,
+ out = 0,
+ sign = 1;
+
+ // handle negative numbers
+ if (string.charCodeAt(0) === 45) {
+ i = 1;
+ sign = -1;
+ }
+
+ // handle digits before the decimal
+ for (i; i < whole.length; i++) {
+ num = charCodeToInt(whole.charCodeAt(i));
+ out = 60 * out + num;
+ }
+
+ // handle digits after the decimal
+ for (i = 0; i < fractional.length; i++) {
+ multiplier = multiplier / 60;
+ num = charCodeToInt(fractional.charCodeAt(i));
+ out += num * multiplier;
+ }
+
+ return out * sign;
+ }
+
+ function arrayToInt (array) {
+ for (var i = 0; i < array.length; i++) {
+ array[i] = unpackBase60(array[i]);
+ }
+ }
+
+ function intToUntil (array, length) {
+ for (var i = 0; i < length; i++) {
+ array[i] = Math.round((array[i - 1] || 0) + (array[i] * 60000)); // minutes to milliseconds
+ }
+
+ array[length - 1] = Infinity;
+ }
+
+ function mapIndices (source, indices) {
+ var out = [], i;
+
+ for (i = 0; i < indices.length; i++) {
+ out[i] = source[indices[i]];
+ }
+
+ return out;
+ }
+
+ function unpack (string) {
+ var data = string.split('|'),
+ offsets = data[2].split(' '),
+ indices = data[3].split(''),
+ untils = data[4].split(' ');
+
+ arrayToInt(offsets);
+ arrayToInt(indices);
+ arrayToInt(untils);
+
+ intToUntil(untils, indices.length);
+
+ return {
+ name : data[0],
+ abbrs : mapIndices(data[1].split(' '), indices),
+ offsets : mapIndices(offsets, indices),
+ untils : untils,
+ population : data[5] | 0
+ };
+ }
+
+ /************************************
+ Zone object
+ ************************************/
+
+ function Zone (packedString) {
+ if (packedString) {
+ this._set(unpack(packedString));
+ }
+ }
+
+ Zone.prototype = {
+ _set : function (unpacked) {
+ this.name = unpacked.name;
+ this.abbrs = unpacked.abbrs;
+ this.untils = unpacked.untils;
+ this.offsets = unpacked.offsets;
+ this.population = unpacked.population;
+ },
+
+ _index : function (timestamp) {
+ var target = +timestamp,
+ untils = this.untils,
+ i;
+
+ for (i = 0; i < untils.length; i++) {
+ if (target < untils[i]) {
+ return i;
+ }
+ }
+ },
+
+ parse : function (timestamp) {
+ var target = +timestamp,
+ offsets = this.offsets,
+ untils = this.untils,
+ max = untils.length - 1,
+ offset, offsetNext, offsetPrev, i;
+
+ for (i = 0; i < max; i++) {
+ offset = offsets[i];
+ offsetNext = offsets[i + 1];
+ offsetPrev = offsets[i ? i - 1 : i];
+
+ if (offset < offsetNext && tz.moveAmbiguousForward) {
+ offset = offsetNext;
+ } else if (offset > offsetPrev && tz.moveInvalidForward) {
+ offset = offsetPrev;
+ }
+
+ if (target < untils[i] - (offset * 60000)) {
+ return offsets[i];
+ }
+ }
+
+ return offsets[max];
+ },
+
+ abbr : function (mom) {
+ return this.abbrs[this._index(mom)];
+ },
+
+ offset : function (mom) {
+ logError("zone.offset has been deprecated in favor of zone.utcOffset");
+ return this.offsets[this._index(mom)];
+ },
+
+ utcOffset : function (mom) {
+ return this.offsets[this._index(mom)];
+ }
+ };
+
+ /************************************
+ Current Timezone
+ ************************************/
+
+ function OffsetAt(at) {
+ var timeString = at.toTimeString();
+ var abbr = timeString.match(/\([a-z ]+\)/i);
+ if (abbr && abbr[0]) {
+ // 17:56:31 GMT-0600 (CST)
+ // 17:56:31 GMT-0600 (Central Standard Time)
+ abbr = abbr[0].match(/[A-Z]/g);
+ abbr = abbr ? abbr.join('') : undefined;
+ } else {
+ // 17:56:31 CST
+ // 17:56:31 GMT+0800 (台北標準時間)
+ abbr = timeString.match(/[A-Z]{3,5}/g);
+ abbr = abbr ? abbr[0] : undefined;
+ }
+
+ if (abbr === 'GMT') {
+ abbr = undefined;
+ }
+
+ this.at = +at;
+ this.abbr = abbr;
+ this.offset = at.getTimezoneOffset();
+ }
+
+ function ZoneScore(zone) {
+ this.zone = zone;
+ this.offsetScore = 0;
+ this.abbrScore = 0;
+ }
+
+ ZoneScore.prototype.scoreOffsetAt = function (offsetAt) {
+ this.offsetScore += Math.abs(this.zone.utcOffset(offsetAt.at) - offsetAt.offset);
+ if (this.zone.abbr(offsetAt.at).replace(/[^A-Z]/g, '') !== offsetAt.abbr) {
+ this.abbrScore++;
+ }
+ };
+
+ function findChange(low, high) {
+ var mid, diff;
+
+ while ((diff = ((high.at - low.at) / 12e4 | 0) * 6e4)) {
+ mid = new OffsetAt(new Date(low.at + diff));
+ if (mid.offset === low.offset) {
+ low = mid;
+ } else {
+ high = mid;
+ }
+ }
+
+ return low;
+ }
+
+ function userOffsets() {
+ var startYear = new Date().getFullYear() - 2,
+ last = new OffsetAt(new Date(startYear, 0, 1)),
+ offsets = [last],
+ change, next, i;
+
+ for (i = 1; i < 48; i++) {
+ next = new OffsetAt(new Date(startYear, i, 1));
+ if (next.offset !== last.offset) {
+ change = findChange(last, next);
+ offsets.push(change);
+ offsets.push(new OffsetAt(new Date(change.at + 6e4)));
+ }
+ last = next;
+ }
+
+ for (i = 0; i < 4; i++) {
+ offsets.push(new OffsetAt(new Date(startYear + i, 0, 1)));
+ offsets.push(new OffsetAt(new Date(startYear + i, 6, 1)));
+ }
+
+ return offsets;
+ }
+
+ function sortZoneScores (a, b) {
+ if (a.offsetScore !== b.offsetScore) {
+ return a.offsetScore - b.offsetScore;
+ }
+ if (a.abbrScore !== b.abbrScore) {
+ return a.abbrScore - b.abbrScore;
+ }
+ return b.zone.population - a.zone.population;
+ }
+
+ function addToGuesses (name, offsets) {
+ var i, offset;
+ arrayToInt(offsets);
+ for (i = 0; i < offsets.length; i++) {
+ offset = offsets[i];
+ guesses[offset] = guesses[offset] || {};
+ guesses[offset][name] = true;
+ }
+ }
+
+ function guessesForUserOffsets (offsets) {
+ var offsetsLength = offsets.length,
+ filteredGuesses = {},
+ out = [],
+ i, j, guessesOffset;
+
+ for (i = 0; i < offsetsLength; i++) {
+ guessesOffset = guesses[offsets[i].offset] || {};
+ for (j in guessesOffset) {
+ if (guessesOffset.hasOwnProperty(j)) {
+ filteredGuesses[j] = true;
+ }
+ }
+ }
+
+ for (i in filteredGuesses) {
+ if (filteredGuesses.hasOwnProperty(i)) {
+ out.push(names[i]);
+ }
+ }
+
+ return out;
+ }
+
+ function rebuildGuess () {
+
+ // use Intl API when available and returning valid time zone
+ try {
+ var intlName = Intl.DateTimeFormat().resolvedOptions().timeZone;
+ if (intlName && intlName.length > 3) {
+ var name = names[normalizeName(intlName)];
+ if (name) {
+ return name;
+ }
+ logError("Moment Timezone found " + intlName + " from the Intl api, but did not have that data loaded.");
+ }
+ } catch (e) {
+ // Intl unavailable, fall back to manual guessing.
+ }
+
+ var offsets = userOffsets(),
+ offsetsLength = offsets.length,
+ guesses = guessesForUserOffsets(offsets),
+ zoneScores = [],
+ zoneScore, i, j;
+
+ for (i = 0; i < guesses.length; i++) {
+ zoneScore = new ZoneScore(getZone(guesses[i]), offsetsLength);
+ for (j = 0; j < offsetsLength; j++) {
+ zoneScore.scoreOffsetAt(offsets[j]);
+ }
+ zoneScores.push(zoneScore);
+ }
+
+ zoneScores.sort(sortZoneScores);
+
+ return zoneScores.length > 0 ? zoneScores[0].zone.name : undefined;
+ }
+
+ function guess (ignoreCache) {
+ if (!cachedGuess || ignoreCache) {
+ cachedGuess = rebuildGuess();
+ }
+ return cachedGuess;
+ }
+
+ /************************************
+ Global Methods
+ ************************************/
+
+ function normalizeName (name) {
+ return (name || '').toLowerCase().replace(/\//g, '_');
+ }
+
+ function addZone (packed) {
+ var i, name, split, normalized;
+
+ if (typeof packed === "string") {
+ packed = [packed];
+ }
+
+ for (i = 0; i < packed.length; i++) {
+ split = packed[i].split('|');
+ name = split[0];
+ normalized = normalizeName(name);
+ zones[normalized] = packed[i];
+ names[normalized] = name;
+ addToGuesses(normalized, split[2].split(' '));
+ }
+ }
+
+ function getZone (name, caller) {
+ name = normalizeName(name);
+
+ var zone = zones[name];
+ var link;
+
+ if (zone instanceof Zone) {
+ return zone;
+ }
+
+ if (typeof zone === 'string') {
+ zone = new Zone(zone);
+ zones[name] = zone;
+ return zone;
+ }
+
+ // Pass getZone to prevent recursion more than 1 level deep
+ if (links[name] && caller !== getZone && (link = getZone(links[name], getZone))) {
+ zone = zones[name] = new Zone();
+ zone._set(link);
+ zone.name = names[name];
+ return zone;
+ }
+
+ return null;
+ }
+
+ function getNames () {
+ var i, out = [];
+
+ for (i in names) {
+ if (names.hasOwnProperty(i) && (zones[i] || zones[links[i]]) && names[i]) {
+ out.push(names[i]);
+ }
+ }
+
+ return out.sort();
+ }
+
+ function addLink (aliases) {
+ var i, alias, normal0, normal1;
+
+ if (typeof aliases === "string") {
+ aliases = [aliases];
+ }
+
+ for (i = 0; i < aliases.length; i++) {
+ alias = aliases[i].split('|');
+
+ normal0 = normalizeName(alias[0]);
+ normal1 = normalizeName(alias[1]);
+
+ links[normal0] = normal1;
+ names[normal0] = alias[0];
+
+ links[normal1] = normal0;
+ names[normal1] = alias[1];
+ }
+ }
+
+ function loadData (data) {
+ addZone(data.zones);
+ addLink(data.links);
+ tz.dataVersion = data.version;
+ }
+
+ function zoneExists (name) {
+ if (!zoneExists.didShowError) {
+ zoneExists.didShowError = true;
+ logError("moment.tz.zoneExists('" + name + "') has been deprecated in favor of !moment.tz.zone('" + name + "')");
+ }
+ return !!getZone(name);
+ }
+
+ function needsOffset (m) {
+ var isUnixTimestamp = (m._f === 'X' || m._f === 'x');
+ return !!(m._a && (m._tzm === undefined) && !isUnixTimestamp);
+ }
+
+ function logError (message) {
+ if (typeof console !== 'undefined' && typeof console.error === 'function') {
+ console.error(message);
+ }
+ }
+
+ /************************************
+ moment.tz namespace
+ ************************************/
+
+ function tz (input) {
+ var args = Array.prototype.slice.call(arguments, 0, -1),
+ name = arguments[arguments.length - 1],
+ zone = getZone(name),
+ out = moment.utc.apply(null, args);
+
+ if (zone && !moment.isMoment(input) && needsOffset(out)) {
+ out.add(zone.parse(out), 'minutes');
+ }
+
+ out.tz(name);
+
+ return out;
+ }
+
+ tz.version = VERSION;
+ tz.dataVersion = '';
+ tz._zones = zones;
+ tz._links = links;
+ tz._names = names;
+ tz.add = addZone;
+ tz.link = addLink;
+ tz.load = loadData;
+ tz.zone = getZone;
+ tz.zoneExists = zoneExists; // deprecated in 0.1.0
+ tz.guess = guess;
+ tz.names = getNames;
+ tz.Zone = Zone;
+ tz.unpack = unpack;
+ tz.unpackBase60 = unpackBase60;
+ tz.needsOffset = needsOffset;
+ tz.moveInvalidForward = true;
+ tz.moveAmbiguousForward = false;
+
+ /************************************
+ Interface with Moment.js
+ ************************************/
+
+ var fn = moment.fn;
+
+ moment.tz = tz;
+
+ moment.defaultZone = null;
+
+ moment.updateOffset = function (mom, keepTime) {
+ var zone = moment.defaultZone,
+ offset;
+
+ if (mom._z === undefined) {
+ if (zone && needsOffset(mom) && !mom._isUTC) {
+ mom._d = moment.utc(mom._a)._d;
+ mom.utc().add(zone.parse(mom), 'minutes');
+ }
+ mom._z = zone;
+ }
+ if (mom._z) {
+ offset = mom._z.utcOffset(mom);
+ if (Math.abs(offset) < 16) {
+ offset = offset / 60;
+ }
+ if (mom.utcOffset !== undefined) {
+ mom.utcOffset(-offset, keepTime);
+ } else {
+ mom.zone(offset, keepTime);
+ }
+ }
+ };
+
+ fn.tz = function (name, keepTime) {
+ if (name) {
+ this._z = getZone(name);
+ if (this._z) {
+ moment.updateOffset(this, keepTime);
+ } else {
+ logError("Moment Timezone has no data for " + name + ". See http://momentjs.com/timezone/docs/#/data-loading/.");
+ }
+ return this;
+ }
+ if (this._z) { return this._z.name; }
+ };
+
+ function abbrWrap (old) {
+ return function () {
+ if (this._z) { return this._z.abbr(this); }
+ return old.call(this);
+ };
+ }
+
+ function resetZoneWrap (old) {
+ return function () {
+ this._z = null;
+ return old.apply(this, arguments);
+ };
+ }
+
+ fn.zoneName = abbrWrap(fn.zoneName);
+ fn.zoneAbbr = abbrWrap(fn.zoneAbbr);
+ fn.utc = resetZoneWrap(fn.utc);
+
+ moment.tz.setDefault = function(name) {
+ if (major < 2 || (major === 2 && minor < 9)) {
+ logError('Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js ' + moment.version + '.');
+ }
+ moment.defaultZone = name ? getZone(name) : null;
+ return moment;
+ };
+
+ // Cloning a moment should include the _z property.
+ var momentProperties = moment.momentProperties;
+ if (Object.prototype.toString.call(momentProperties) === '[object Array]') {
+ // moment 2.8.1+
+ momentProperties.push('_z');
+ momentProperties.push('_a');
+ } else if (momentProperties) {
+ // moment 2.7.0
+ momentProperties._z = null;
+ }
+
+ // INJECT DATA
+
+ return moment;
+}));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/.bower.json
new file mode 100644
index 00000000000..89344d3e756
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/.bower.json
@@ -0,0 +1,36 @@
+{
+ "name": "moment",
+ "license": "MIT",
+ "main": "moment.js",
+ "ignore": [
+ "**/.*",
+ "benchmarks",
+ "bower_components",
+ "meteor",
+ "node_modules",
+ "scripts",
+ "tasks",
+ "test",
+ "component.json",
+ "composer.json",
+ "CONTRIBUTING.md",
+ "ender.js",
+ "Gruntfile.js",
+ "Moment.js.nuspec",
+ "package.js",
+ "package.json",
+ "ISSUE_TEMPLATE.md",
+ "typing-tests"
+ ],
+ "homepage": "https://github.com/moment/moment",
+ "version": "2.17.1",
+ "_release": "2.17.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "2.17.1",
+ "commit": "c83c4058b4c88d0a2ab10aac28ac787e31993c39"
+ },
+ "_source": "https://github.com/moment/moment.git",
+ "_target": "2.17.1",
+ "_originalSource": "moment"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/CHANGELOG.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/CHANGELOG.md
new file mode 100644
index 00000000000..59ec40c335f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/CHANGELOG.md
@@ -0,0 +1,737 @@
+Changelog
+=========
+
+### 2.17.1 [Also available here](https://gist.github.com/ichernev/f38280b2b29c4932914a6d3a4e50bfb2)
+* Release Dec 03, 2016
+
+* [#3638](https://github.com/moment/moment/pull/3638) [misc] TS: Make typescript definitions work with 1.x
+* [#3628](https://github.com/moment/moment/pull/3628) [misc] Adds "sign CLA" link to `CONTRIBUTING.md`
+* [#3640](https://github.com/moment/moment/pull/3640) [misc] Fix locale issues
+
+### 2.17.0 [Also available here](https://gist.github.com/ichernev/ed58f76fb95205eeac653d719972b90c)
+* Release Nov 22, 2016
+
+* [#3435](https://github.com/moment/moment/pull/3435) [new locale] yo: Yoruba (Nigeria) locale
+* [#3595](https://github.com/moment/moment/pull/3595) [bugfix] Fix accidental reference to global "value" variable
+* [#3506](https://github.com/moment/moment/pull/3506) [bugfix] Fix invalid moments returning valid dates to method calls
+* [#3563](https://github.com/moment/moment/pull/3563) [locale] ca: Change future relative time
+* [#3504](https://github.com/moment/moment/pull/3504) [tests] Fixes [#3463](https://github.com/moment/moment/issues/3463), parseZone not handling Z correctly (tests only)
+* [#3591](https://github.com/moment/moment/pull/3591) [misc] typescript: update typescript to 2.0.8, add strictNullChecks=true
+* [#3597](https://github.com/moment/moment/pull/3597) [misc] Fixed capitalization in nuget spec
+
+### 2.16.0 [See full changelog](https://gist.github.com/ichernev/17bffc1005a032cb1a8ac4c1558b4994)
+* Release Nov 9, 2016
+
+## Features
+* [#3530](https://github.com/moment/moment/pull/3530) [feature] Check whether input is date before checking if format is array
+* [#3515](https://github.com/moment/moment/pull/3515) [feature] Fix [#2300](https://github.com/moment/moment/issues/2300): Default to current week.
+
+## Bugfixes
+* [#3546](https://github.com/moment/moment/pull/3546) [bugfix] Implement lazy-loading of child locales with missing prents
+* [#3523](https://github.com/moment/moment/pull/3523) [bugfix] parseZone should handle UTC
+* [#3502](https://github.com/moment/moment/pull/3502) [bugfix] Fix [#3500](https://github.com/moment/moment/issues/3500): ISO 8601 parsing should match the full string, not the beginning of the string.
+* [#3581](https://github.com/moment/moment/pull/3581) [bugfix] Fix parseZone, redo [#3504](https://github.com/moment/moment/issues/3504), fix [#3463](https://github.com/moment/moment/issues/3463)
+
+## New Locales
+* [#3416](https://github.com/moment/moment/pull/3416) [new locale] nl-be: Dutch (Belgium) locale
+* [#3393](https://github.com/moment/moment/pull/3393) [new locale] ar-dz: Arabic (Algeria) locale
+* [#3342](https://github.com/moment/moment/pull/3342) [new locale] tet: Tetun Dili (East Timor) locale
+
+And more locale, build and typescript improvements
+
+### 2.15.2
+* Release Oct 23, 2016
+* [#3525](https://github.com/moment/moment/pull/3525) Speedup month standalone/format regexes **(IMPORTANT)**
+* [#3466](https://github.com/moment/moment/pull/3466) Fix typo of Javanese
+
+### 2.15.1
+* Release Sept 20, 2016
+* [#3438](https://github.com/moment/moment/pull/3438) Fix locale autoload, revert [#3344](https://github.com/moment/moment/pull/3344)
+
+### 2.15.0 [See full changelog](https://gist.github.com/ichernev/10e1c5bf647545c72ca30e9628a09ed3)
+- Release Sept 12, 2016
+
+## New Locales
+* [#3255](https://github.com/moment/moment/pull/3255) [new locale] mi: Maori language
+* [#3267](https://github.com/moment/moment/pull/3267) [new locale] ar-ly: Arabic (Libya) locale
+* [#3333](https://github.com/moment/moment/pull/3333) [new locale] zh-hk: Chinese (Hong Kong) locale
+
+## Bugfixes
+* [#3276](https://github.com/moment/moment/pull/3276) [bugfix] duration: parser: Support ms durations in .NET syntax
+* [#3312](https://github.com/moment/moment/pull/3312) [bugfix] locales: Enable locale-data getters without moment (fixes [#3284](https://github.com/moment/moment/issues/3284))
+* [#3381](https://github.com/moment/moment/pull/3381) [bugfix] parsing: Fix parseZone without timezone in string, fixes [#3083](https://github.com/moment/moment/issues/3083)
+* [#3383](https://github.com/moment/moment/pull/3383) [bugfix] toJSON: Fix isValid so that toJSON works after a moment is frozen
+* [#3427](https://github.com/moment/moment/pull/3427) [bugfix] ie8: Fix IE8 (regression in 2.14.x)
+
+## Packaging
+* [#3299](https://github.com/moment/moment/pull/3299) [pkg] npm: Do not include .npmignore in npm package
+* [#3273](https://github.com/moment/moment/pull/3273) [pkg] jspm: Include moment.d.ts file in package
+* [#3344](https://github.com/moment/moment/pull/3344) [pkg] exports: use module.require for nodejs
+
+Also some locale and typescript improvements
+
+### 2.14.1
+- Release July 20, 2016
+* [#3280](https://github.com/moment/moment/pull/3280) Fix typescript definitions
+
+
+### 2.14.0 [See full changelog](https://gist.github.com/ichernev/812e79ac36a7829a22598fe964bfc18a)
+
+- Release July 20, 2016
+
+## New Features
+* [#3233](http://github.com/moment/moment/pull/3233) Introduce month.isFormat for format/standalone discovery
+* [#2848](http://github.com/moment/moment/pull/2848) Allow user to get/set the rounding method used when calculating relative time
+* [#3112](http://github.com/moment/moment/pull/3112) optimize configFromStringAndFormat
+* [#3147](http://github.com/moment/moment/pull/3147) Call calendar format function with moment context
+* [#3160](http://github.com/moment/moment/pull/3160) deprecate isDSTShifted
+* [#3175](http://github.com/moment/moment/pull/3175) make moment calendar extensible with ad-hoc options
+* [#3191](http://github.com/moment/moment/pull/3191) toDate returns a copy of the internal date object
+* [#3192](http://github.com/moment/moment/pull/3192) Adding support for rollup import.
+* [#3238](http://github.com/moment/moment/pull/3238) Handle empty object and empty array for creation as now
+* [#3082](http://github.com/moment/moment/pull/3082) Use relative AMD moment dependency
+
+## Bugfixes
+* [#3241](http://github.com/moment/moment/pull/3241) Escape all 24 mixed pieces, not only first 12 in computeMonthsParse
+* [#3008](http://github.com/moment/moment/pull/3008) Object setter orders sets based on size of unit
+* [#3177](http://github.com/moment/moment/pull/3177) Bug Fix [#2704](http://github.com/moment/moment/pull/2704) - isoWeekday(String) inconsistent with isoWeekday(Number)
+* [#3230](http://github.com/moment/moment/pull/3230) fix passing date with format string to ignore format string
+* [#3232](http://github.com/moment/moment/pull/3232) Fix negative 0 in certain diff cases
+* [#3235](http://github.com/moment/moment/pull/3235) Use proper locale inheritance for the base locale, fixes [#3137](http://github.com/moment/moment/pull/3137)
+
+Plus es-do locale and locale bugfixes
+
+### 2.13.0 [See full changelog](https://gist.github.com/ichernev/0132fcf5b61f7fc140b0bb0090480d49)
+- Release April 18, 2016
+## Enhancements:
+* [#2982](https://github.com/moment/moment/pull/2982) Add 'date' as alias to 'day' for startOf() and endOf().
+* [#2955](https://github.com/moment/moment/pull/2955) Add parsing negative components in durations when ISO 8601
+* [#2991](https://github.com/moment/moment/pull/2991) isBetween support for both open and closed intervals
+* [#3105](https://github.com/moment/moment/pull/3105) Add localeSorted argument to weekday listers
+* [#3102](https://github.com/moment/moment/pull/3102) Add k and kk formatting tokens
+
+## Bugfixes
+* [#3109](https://github.com/moment/moment/pull/3109) Fix [#1756](https://github.com/moment/moment/issues/1756) Resolved thread-safe issue on server side.
+* [#3078](https://github.com/moment/moment/pull/3078) Fix parsing for months/weekdays with weird characters
+* [#3098](https://github.com/moment/moment/pull/3098) Use Z suffix when in UTC mode ([#3020](https://github.com/moment/moment/issues/3020))
+* [#2995](https://github.com/moment/moment/pull/2995) Fix floating point rounding errors in durations
+* [#3059](https://github.com/moment/moment/pull/3059) fix bug where diff returns -0 in month-related diffs
+* [#3045](https://github.com/moment/moment/pull/3045) Fix mistaking any input for 'a' token
+* [#2877](https://github.com/moment/moment/pull/2877) Use explicit .valueOf() calls instead of coercion
+* [#3036](https://github.com/moment/moment/pull/3036) Year setter should keep time when DST changes
+
+Plus 3 new locales and locale fixes.
+
+### 2.12.0 [See full changelog](https://gist.github.com/ichernev/6e5bfdf8d6522fc4ac73)
+
+- Release March 7, 2016
+
+## Enhancements:
+* [#2932](https://github.com/moment/moment/pull/2932) List loaded locales
+* [#2818](https://github.com/moment/moment/pull/2818) Parse ISO-8061 duration containing both day and week values
+* [#2774](https://github.com/moment/moment/pull/2774) Implement locale inheritance and locale updating
+
+## Bugfixes:
+* [#2970](https://github.com/moment/moment/pull/2970) change add subtract to handle decimal values by rounding
+* [#2887](https://github.com/moment/moment/pull/2887) Fix toJSON casting of invalid moment
+* [#2897](https://github.com/moment/moment/pull/2897) parse string arguments for month() correctly, closes #2884
+* [#2946](https://github.com/moment/moment/pull/2946) Fix usage suggestions for min and max
+
+## New locales:
+* [#2917](https://github.com/moment/moment/pull/2917) Locale Punjabi(Gurmukhi) India format conversion
+
+And more
+
+### 2.11.2 (Fix ReDoS attack vector)
+
+- Release February 7, 2016
+
+* [#2939](https://github.com/moment/moment/pull/2939) use full-string match to speed up aspnet regex match
+
+### 2.11.1 [See full changelog](https://gist.github.com/ichernev/8ec3ee25b749b4cff3c2)
+
+- Release January 9, 2016
+
+## Bugfixes:
+* [#2881](https://github.com/moment/moment/pull/2881) Revert "Merge pull request #2746 from mbad0la:develop" Sep->Sept
+* [#2868](https://github.com/moment/moment/pull/2868) Add format and parse token Y, so it actually works
+* [#2865](https://github.com/moment/moment/pull/2865) Use typeof checks for undefined for global variables
+* [#2858](https://github.com/moment/moment/pull/2858) Fix Date mocking regression introduced in 2.11.0
+* [#2864](https://github.com/moment/moment/pull/2864) Include changelog in npm release
+* [#2830](https://github.com/moment/moment/pull/2830) dep: add grunt-cli
+* [#2869](https://github.com/moment/moment/pull/2869) Fix months parsing for some locales
+
+### 2.11.0 [See full changelog](https://gist.github.com/ichernev/6594bc29719dde6b2f66)
+
+- Release January 4, 2016
+
+* [#2624](https://github.com/moment/moment/pull/2624) Proper handling of invalid moments
+* [#2634](https://github.com/moment/moment/pull/2634) Fix strict month parsing issue in cs,ru,sk
+* [#2735](https://github.com/moment/moment/pull/2735) Reset the locale back to 'en' after defining all locales in min/locales.js
+* [#2702](https://github.com/moment/moment/pull/2702) Week rework
+* [#2746](https://github.com/moment/moment/pull/2746) Changed September Abbreviation to "Sept" in locale-specific english
+ files and default locale file
+* [#2646](https://github.com/moment/moment/pull/2646) Fix [#2645](https://github.com/moment/moment/pull/2645) - invalid dates pre-1970
+
+* [#2641](https://github.com/moment/moment/pull/2641) Implement basic format and comma as ms separator in ISO 8601
+* [#2665](https://github.com/moment/moment/pull/2665) Implement stricter weekday parsing
+* [#2700](https://github.com/moment/moment/pull/2700) Add [Hh]mm and [Hh]mmss formatting tokens, so you can parse 123 with
+ hmm for example
+* [#2565](https://github.com/moment/moment/pull/2565) [#2835](https://github.com/moment/moment/pull/2835) Expose arguments used for moment creation with creationData
+ (fix [#2443](https://github.com/moment/moment/pull/2443))
+* [#2648](https://github.com/moment/moment/pull/2648) fix issue [#2640](https://github.com/moment/moment/pull/2640): support instanceof operator
+* [#2709](https://github.com/moment/moment/pull/2709) Add isSameOrAfter and isSameOrBefore comparison methods
+* [#2721](https://github.com/moment/moment/pull/2721) Fix moment creation from object with strings values
+* [#2740](https://github.com/moment/moment/pull/2740) Enable 'd hh:mm:ss.sss' format for durations
+* [#2766](https://github.com/moment/moment/pull/2766) [#2833](https://github.com/moment/moment/pull/2833) Alternate Clock Source Support
+
+### 2.10.6
+
+- Release July 28, 2015
+
+[#2515](https://github.com/moment/moment/pull/2515) Fix regression introduced
+in `2.10.5` related to `moment.ISO_8601` parsing.
+
+### 2.10.5 [See full changelog](https://gist.github.com/ichernev/6ec13ac7efc396da44b2)
+
+- Release July 26, 2015
+
+Important changes:
+* [#2357](https://github.com/moment/moment/pull/2357) Improve unit bubbling for ISO dates
+ this fixes day to year conversions to work around end-of-year (~365 days). As
+ a side effect 365 days is 11 months and 30 days, and 366 days is one year.
+* [#2438](https://github.com/moment/moment/pull/2438) Fix inconsistent moment.min and moment.max results
+ Return invalid result if any of the inputs is invalid
+* [#2494](https://github.com/moment/moment/pull/2494) Fix two digit year parsing with YYYY format
+ This brings the benefits of YY to YYYY
+* [#2368](https://github.com/moment/moment/pull/2368) perf: use faster form of copying dates, across the board improvement
+
+
+### 2.10.3 [See full changelog](https://gist.github.com/ichernev/f264b9bed5b00f8b1b7f)
+
+- Release May 13, 2015
+
+* add `moment.fn.to` and `moment.fn.toNow` (similar to `from` and `fromNow`)
+* new locales (Sinhalese (si), Montenegrin (me), Javanese (ja))
+* performance improvements
+
+### 2.10.2
+
+- Release April 9, 2015
+
+* fixed moment-with-locales in browser env caused by esperanto change
+
+### 2.10.1
+
+* regression: Add moment.duration.fn back
+
+### 2.10.0
+
+Ported code to es6 modules.
+
+### 2.9.0 [See full changelog](https://gist.github.com/ichernev/0c9a9b49951111a27ce7)
+
+- Release January 8, 2015
+
+languages:
+* [2104](https://github.com/moment/moment/issues/2104) Frisian (fy) language file with unit test
+* [2097](https://github.com/moment/moment/issues/2097) add ar-tn locale
+
+deprecations:
+* [2074](https://github.com/moment/moment/issues/2074) Implement `moment.fn.utcOffset`, deprecate `moment.fn.zone`
+
+features:
+* [2088](https://github.com/moment/moment/issues/2088) add moment.fn.isBetween
+* [2054](https://github.com/moment/moment/issues/2054) Call updateOffset when creating moment (needed for default timezone in
+ moment-timezone)
+* [1893](https://github.com/moment/moment/issues/1893) Add moment.isDate method
+* [1825](https://github.com/moment/moment/issues/1825) Implement toJSON function on Duration
+* [1809](https://github.com/moment/moment/issues/1809) Allowing moment.set() to accept a hash of units
+* [2128](https://github.com/moment/moment/issues/2128) Add firstDayOfWeek, firstDayOfYear locale getters
+* [2131](https://github.com/moment/moment/issues/2131) Add quarter diff support
+
+Some bugfixes and language improvements -- [full changelog](https://gist.github.com/ichernev/0c9a9b49951111a27ce7)
+
+### 2.8.4 [See full changelog](https://gist.github.com/ichernev/a4fcb0a46d74e4b9b996)
+
+- Release November 19, 2014
+
+Features:
+
+* [#2000](https://github.com/moment/moment/issues/2000) Add LTS localised format that includes seconds
+* [#1960](https://github.com/moment/moment/issues/1960) added formatToken 'x' for unix offset in milliseconds #1938
+* [#1965](https://github.com/moment/moment/issues/1965) Support 24:00:00.000 to mean next day, at midnight.
+* [#2002](https://github.com/moment/moment/issues/2002) Accept 'date' key when creating moment with object
+* [#2009](https://github.com/moment/moment/issues/2009) Use native toISOString when we can
+
+Some bugfixes and language improvements -- [full changelog](https://gist.github.com/ichernev/a4fcb0a46d74e4b9b996)
+
+### 2.8.3
+
+- Release September 5, 2014
+
+Bugfixes:
+
+* [#1801](https://github.com/moment/moment/issues/1801) proper pluralization for Arabic
+* [#1833](https://github.com/moment/moment/issues/1833) improve spm integration
+* [#1871](https://github.com/moment/moment/issues/1871) fix zone bug caused by Firefox 24
+* [#1882](https://github.com/moment/moment/issues/1882) Use hh:mm in Czech
+* [#1883](https://github.com/moment/moment/issues/1883) Fix 2.8.0 regression in duration as conversions
+* [#1890](https://github.com/moment/moment/issues/1890) Faster travis builds
+* [#1892](https://github.com/moment/moment/issues/1892) Faster isBefore/After/Same
+* [#1848](https://github.com/moment/moment/issues/1848) Fix flaky month diffs
+* [#1895](https://github.com/moment/moment/issues/1895) Fix 2.8.0 regression in moment.utc with format array
+* [#1896](https://github.com/moment/moment/issues/1896) Support setting invalid instance locale (noop)
+* [#1897](https://github.com/moment/moment/issues/1897) Support moment([str]) in addition to moment([int])
+
+### 2.8.2
+
+- Release August 22, 2014
+
+Minor bugfixes:
+
+* [#1874](https://github.com/moment/moment/issues/1874) use `Object.prototype.hasOwnProperty`
+ instead of `obj.hasOwnProperty` (ie8 bug)
+* [#1873](https://github.com/moment/moment/issues/1873) add `duration#toString()`
+* [#1859](https://github.com/moment/moment/issues/1859) better month/weekday names in norwegian
+* [#1812](https://github.com/moment/moment/issues/1812) meridiem parsing for greek
+* [#1804](https://github.com/moment/moment/issues/1804) spanish del -> de
+* [#1800](https://github.com/moment/moment/issues/1800) korean LT improvement
+
+### 2.8.1
+
+- Release August 1, 2014
+
+* bugfix [#1813](https://github.com/moment/moment/issues/1813): fix moment().lang([key]) incompatibility
+
+### 2.8.0 [See changelog](https://gist.github.com/ichernev/ac3899324a5fa6c8c9b4)
+
+- Release July 31, 2014
+
+* incompatible changes
+ * [#1761](https://github.com/moment/moment/issues/1761): moments created without a language are no longer following the global language, in case it changes. Only newly created moments take the global language by default. In case you're affected by this, wait, comment on [#1797](https://github.com/moment/moment/issues/1797) and wait for a proper reimplementation
+ * [#1642](https://github.com/moment/moment/issues/1642): 45 days is no longer "a month" according to humanize, cutoffs for month, and year have changed. Hopefully your code does not depend on a particular answer from humanize (which it shouldn't anyway)
+ * [#1784](https://github.com/moment/moment/issues/1784): if you use the human readable English datetime format in a weird way (like storing them in a database) that would break when the format changes you're at risk.
+
+* deprecations (old behavior will be dropped in 3.0)
+ * [#1761](https://github.com/moment/moment/issues/1761) `lang` is renamed to `locale`, `langData` -> `localeData`. Also there is now `defineLocale` that should be used when creating new locales
+ * [#1763](https://github.com/moment/moment/issues/1763) `add(unit, value)` and `subtract(unit, value)` are now deprecated. Use `add(value, unit)` and `subtract(value, unit)` instead.
+ * [#1759](https://github.com/moment/moment/issues/1759) rename `duration.toIsoString` to `duration.toISOString`. The js standard library and moment's `toISOString` follow that convention.
+
+* new locales
+ * [#1789](https://github.com/moment/moment/issues/1789) Tibetan (bo)
+ * [#1786](https://github.com/moment/moment/issues/1786) Africaans (af)
+ * [#1778](https://github.com/moment/moment/issues/1778) Burmese (my)
+ * [#1727](https://github.com/moment/moment/issues/1727) Belarusian (be)
+
+* bugfixes, locale bugfixes, performance improvements, features
+
+### 2.7.0 [See changelog](https://gist.github.com/ichernev/b0a3d456d5a84c9901d7)
+
+- Release June 12, 2014
+
+* new languages
+
+ * [#1678](https://github.com/moment/moment/issues/1678) Bengali (bn)
+ * [#1628](https://github.com/moment/moment/issues/1628) Azerbaijani (az)
+ * [#1633](https://github.com/moment/moment/issues/1633) Arabic, Saudi Arabia (ar-sa)
+ * [#1648](https://github.com/moment/moment/issues/1648) Austrian German (de-at)
+
+* features
+
+ * [#1663](https://github.com/moment/moment/issues/1663) configurable relative time thresholds
+ * [#1554](https://github.com/moment/moment/issues/1554) support anchor time in moment.calendar
+ * [#1693](https://github.com/moment/moment/issues/1693) support moment.ISO_8601 as parsing format
+ * [#1637](https://github.com/moment/moment/issues/1637) add moment.min and moment.max and deprecate min/max instance methods
+ * [#1704](https://github.com/moment/moment/issues/1704) support string value in add/subtract
+ * [#1647](https://github.com/moment/moment/issues/1647) add spm support (package manager)
+
+* bugfixes
+
+### 2.6.0 [See changelog](https://gist.github.com/ichernev/10544682)
+
+- Release April 12 , 2014
+
+* languages
+ * [#1529](https://github.com/moment/moment/issues/1529) Serbian-Cyrillic (sr-cyr)
+ * [#1544](https://github.com/moment/moment/issues/1544), [#1546](https://github.com/moment/moment/issues/1546) Khmer Cambodia (km)
+
+* features
+ * [#1419](https://github.com/moment/moment/issues/1419), [#1468](https://github.com/moment/moment/issues/1468), [#1467](https://github.com/moment/moment/issues/1467), [#1546](https://github.com/moment/moment/issues/1546) better handling of timezone-d moments around DST
+ * [#1462](https://github.com/moment/moment/issues/1462) add weeksInYear and isoWeeksInYear
+ * [#1475](https://github.com/moment/moment/issues/1475) support ordinal parsing
+ * [#1499](https://github.com/moment/moment/issues/1499) composer support
+ * [#1577](https://github.com/moment/moment/issues/1577), [#1604](https://github.com/moment/moment/issues/1604) put Date parsing in moment.createFromInputFallback so it can be properly deprecated and controlled in the future
+ * [#1545](https://github.com/moment/moment/issues/1545) extract two-digit year parsing in moment.parseTwoDigitYear, so it can be overwritten
+ * [#1590](https://github.com/moment/moment/issues/1590) (see [#1574](https://github.com/moment/moment/issues/1574)) set AMD global before module definition to better support non AMD module dependencies used in AMD environment
+ * [#1589](https://github.com/moment/moment/issues/1589) remove global in Node.JS environment (was not working before, nobody complained, was scheduled for removal anyway)
+ * [#1586](https://github.com/moment/moment/issues/1586) support quarter setting and parsing
+
+* 18 bugs fixed
+
+### 2.5.1
+
+- Release January 22, 2014
+
+* languages
+ * [#1392](https://github.com/moment/moment/issues/1392) Armenian (hy-am)
+
+* bugfixes
+ * [#1429](https://github.com/moment/moment/issues/1429) fixes [#1423](https://github.com/moment/moment/issues/1423) weird chrome-32 bug with js object creation
+ * [#1421](https://github.com/moment/moment/issues/1421) remove html entities from Welsh
+ * [#1418](https://github.com/moment/moment/issues/1418) fixes [#1401](https://github.com/moment/moment/issues/1401) improved non-padded tokens in strict matching
+ * [#1417](https://github.com/moment/moment/issues/1417) fixes [#1404](https://github.com/moment/moment/issues/1404) handle buggy moment object created by property cloning
+ * [#1398](https://github.com/moment/moment/issues/1398) fixes [#1397](https://github.com/moment/moment/issues/1397) fix Arabic-like week number parsing
+ * [#1396](https://github.com/moment/moment/issues/1396) add leftZeroFill(4) to GGGG and gggg formats
+ * [#1373](https://github.com/moment/moment/issues/1373) use lowercase for months and days in Catalan
+
+* testing
+ * [#1374](https://github.com/moment/moment/issues/1374) run tests on multiple browser/os combos via SauceLabs and Travis
+
+### 2.5.0 [See changelog](https://gist.github.com/ichernev/8104451)
+
+- Release Dec 24, 2013
+
+* New languages
+ * Luxemburish (lb) [1247](https://github.com/moment/moment/issues/1247)
+ * Serbian (rs) [1319](https://github.com/moment/moment/issues/1319)
+ * Tamil (ta) [1324](https://github.com/moment/moment/issues/1324)
+ * Macedonian (mk) [1337](https://github.com/moment/moment/issues/1337)
+
+* Features
+ * [1311](https://github.com/moment/moment/issues/1311) Add quarter getter and format token `Q`
+ * [1303](https://github.com/moment/moment/issues/1303) strict parsing now respects number of digits per token (fix [1196](https://github.com/moment/moment/issues/1196))
+ * 0d30bb7 add jspm support
+ * [1347](https://github.com/moment/moment/issues/1347) improve zone parsing
+ * [1362](https://github.com/moment/moment/issues/1362) support merideam parsing in Korean
+
+* 22 bugfixes
+
+### 2.4.0
+
+- Release Oct 27, 2013
+
+* **Deprecate** globally exported moment, will be removed in next major
+* New languages
+ * Farose (fo) [#1206](https://github.com/moment/moment/issues/1206)
+ * Tagalog/Filipino (tl-ph) [#1197](https://github.com/moment/moment/issues/1197)
+ * Welsh (cy) [#1215](https://github.com/moment/moment/issues/1215)
+* Bugfixes
+ * properly handle Z at the end of iso RegExp [#1187](https://github.com/moment/moment/issues/1187)
+ * chinese meridian time improvements [#1076](https://github.com/moment/moment/issues/1076)
+ * fix language tests [#1177](https://github.com/moment/moment/issues/1177)
+ * remove some failing tests (that should have never existed :))
+ [#1185](https://github.com/moment/moment/issues/1185)
+ [#1183](https://github.com/moment/moment/issues/1183)
+ * handle russian noun cases in weird cases [#1195](https://github.com/moment/moment/issues/1195)
+
+### 2.3.1
+
+- Release Oct 9, 2013
+
+Removed a trailing comma [1169] and fixed a bug with `months`, `weekdays` getters [#1171](https://github.com/moment/moment/issues/1171).
+
+### 2.3.0 [See changelog](https://gist.github.com/ichernev/6864354)
+
+- Release Oct 7, 2013
+
+Changed isValid, added strict parsing.
+Week tokens parsing.
+
+### 2.2.1
+
+- Release Sep 12, 2013
+
+Fixed bug in string prototype test.
+Updated authors and contributors.
+
+### 2.2.0 [See changelog](https://gist.github.com/ichernev/00f837a9baf46a3565e4)
+
+- Release Sep 11, 2013
+
+Added bower support.
+
+Language files now use UMD.
+
+Creating moment defaults to current date/month/year.
+
+Added a bundle of moment and all language files.
+
+### 2.1.0 [See changelog](https://gist.github.com/timrwood/b8c2d90d528eddb53ab5)
+
+- Release Jul 8, 2013
+
+Added better week support.
+
+Added ability to set offset with `moment#zone`.
+
+Added ability to set month or weekday from a string.
+
+Added `moment#min` and `moment#max`
+
+### 2.0.0 [See changelog](https://gist.github.com/timrwood/e72f2eef320ed9e37c51)
+
+- Release Feb 9, 2013
+
+Added short form localized tokens.
+
+Added ability to define language a string should be parsed in.
+
+Added support for reversed add/subtract arguments.
+
+Added support for `endOf('week')` and `startOf('week')`.
+
+Fixed the logic for `moment#diff(Moment, 'months')` and `moment#diff(Moment, 'years')`
+
+`moment#diff` now floors instead of rounds.
+
+Normalized `moment#toString`.
+
+Added `isSame`, `isAfter`, and `isBefore` methods.
+
+Added better week support.
+
+Added `moment#toJSON`
+
+Bugfix: Fixed parsing of first century dates
+
+Bugfix: Parsing 10Sep2001 should work as expected
+
+Bugfix: Fixed weirdness with `moment.utc()` parsing.
+
+Changed language ordinal method to return the number + ordinal instead of just the ordinal.
+
+Changed two digit year parsing cutoff to match strptime.
+
+Removed `moment#sod` and `moment#eod` in favor of `moment#startOf` and `moment#endOf`.
+
+Removed `moment.humanizeDuration()` in favor of `moment.duration().humanize()`.
+
+Removed the lang data objects from the top level namespace.
+
+Duplicate `Date` passed to `moment()` instead of referencing it.
+
+### 1.7.2 [See discussion](https://github.com/timrwood/moment/issues/456)
+
+- Release Oct 2, 2012
+
+Bugfixes
+
+### 1.7.1 [See discussion](https://github.com/timrwood/moment/issues/384)
+
+- Release Oct 1, 2012
+
+Bugfixes
+
+### 1.7.0 [See discussion](https://github.com/timrwood/moment/issues/288)
+
+- Release Jul 26, 2012
+
+Added `moment.fn.endOf()` and `moment.fn.startOf()`.
+
+Added validation via `moment.fn.isValid()`.
+
+Made formatting method 3x faster. http://jsperf.com/momentjs-cached-format-functions
+
+Add support for month/weekday callbacks in `moment.fn.format()`
+
+Added instance specific languages.
+
+Added two letter weekday abbreviations with the formatting token `dd`.
+
+Various language updates.
+
+Various bugfixes.
+
+### 1.6.0 [See discussion](https://github.com/timrwood/moment/pull/268)
+
+- Release Apr 26, 2012
+
+Added Durations.
+
+Revamped parser to support parsing non-separated strings (YYYYMMDD vs YYYY-MM-DD).
+
+Added support for millisecond parsing and formatting tokens (S SS SSS)
+
+Added a getter for `moment.lang()`
+
+Various bugfixes.
+
+There are a few things deprecated in the 1.6.0 release.
+
+1. The format tokens `z` and `zz` (timezone abbreviations like EST CST MST etc) will no longer be supported. Due to inconsistent browser support, we are unable to consistently produce this value. See [this issue](https://github.com/timrwood/moment/issues/162) for more background.
+
+2. The method `moment.fn.native` is deprecated in favor of `moment.fn.toDate`. There continue to be issues with Google Closure Compiler throwing errors when using `native`, even in valid instances.
+
+3. The way to customize am/pm strings is being changed. This would only affect you if you created a custom language file. For more information, see [this issue](https://github.com/timrwood/moment/pull/222).
+
+### 1.5.0 [See milestone](https://github.com/timrwood/moment/issues?milestone=10&page=1&state=closed)
+
+- Release Mar 20, 2012
+
+Added UTC mode.
+
+Added automatic ISO8601 parsing.
+
+Various bugfixes.
+
+### 1.4.0 [See milestone](https://github.com/timrwood/moment/issues?milestone=8&state=closed)
+
+- Release Feb 4, 2012
+
+Added `moment.fn.toDate` as a replacement for `moment.fn.native`.
+
+Added `moment.fn.sod` and `moment.fn.eod` to get the start and end of day.
+
+Various bugfixes.
+
+### 1.3.0 [See milestone](https://github.com/timrwood/moment/issues?milestone=7&state=closed)
+
+- Release Jan 5, 2012
+
+Added support for parsing month names in the current language.
+
+Added escape blocks for parsing tokens.
+
+Added `moment.fn.calendar` to format strings like 'Today 2:30 PM', 'Tomorrow 1:25 AM', and 'Last Sunday 4:30 AM'.
+
+Added `moment.fn.day` as a setter.
+
+Various bugfixes
+
+### 1.2.0 [See milestone](https://github.com/timrwood/moment/issues?milestone=4&state=closed)
+
+- Release Dec 7, 2011
+
+Added timezones to parser and formatter.
+
+Added `moment.fn.isDST`.
+
+Added `moment.fn.zone` to get the timezone offset in minutes.
+
+### 1.1.2 [See milestone](https://github.com/timrwood/moment/issues?milestone=6&state=closed)
+
+- Release Nov 18, 2011
+
+Various bugfixes
+
+### 1.1.1 [See milestone](https://github.com/timrwood/moment/issues?milestone=5&state=closed)
+
+- Release Nov 12, 2011
+
+Added time specific diffs (months, days, hours, etc)
+
+### 1.1.0
+
+- Release Oct 28, 2011
+
+Added `moment.fn.format` localized masks. 'L LL LLL LLLL' [issue 29](https://github.com/timrwood/moment/pull/29)
+
+Fixed [issue 31](https://github.com/timrwood/moment/pull/31).
+
+### 1.0.1
+
+- Release Oct 18, 2011
+
+Added `moment.version` to get the current version.
+
+Removed `window !== undefined` when checking if module exists to support browserify. [issue 25](https://github.com/timrwood/moment/pull/25)
+
+### 1.0.0
+
+- Release
+
+Added convenience methods for getting and setting date parts.
+
+Added better support for `moment.add()`.
+
+Added better lang support in NodeJS.
+
+Renamed library from underscore.date to Moment.js
+
+### 0.6.1
+
+- Release Oct 12, 2011
+
+Added Portuguese, Italian, and French language support
+
+### 0.6.0
+
+- Release Sep 21, 2011
+
+Added _date.lang() support.
+Added support for passing multiple formats to try to parse a date. _date("07-10-1986", ["MM-DD-YYYY", "YYYY-MM-DD"]);
+Made parse from string and single format 25% faster.
+
+### 0.5.2
+
+- Release Jul 11, 2011
+
+Bugfix for [issue 8](https://github.com/timrwood/underscore.date/pull/8) and [issue 9](https://github.com/timrwood/underscore.date/pull/9).
+
+### 0.5.1
+
+- Release Jun 17, 2011
+
+Bugfix for [issue 5](https://github.com/timrwood/underscore.date/pull/5).
+
+### 0.5.0
+
+- Release Jun 13, 2011
+
+Dropped the redundant `_date.date()` in favor of `_date()`.
+Removed `_date.now()`, as it is a duplicate of `_date()` with no parameters.
+Removed `_date.isLeapYear(yearNumber)`. Use `_date([yearNumber]).isLeapYear()` instead.
+Exposed customization options through the `_date.relativeTime`, `_date.weekdays`, `_date.weekdaysShort`, `_date.months`, `_date.monthsShort`, and `_date.ordinal` variables instead of the `_date.customize()` function.
+
+### 0.4.1
+
+- Release May 9, 2011
+
+Added date input formats for input strings.
+
+### 0.4.0
+
+- Release May 9, 2011
+
+Added underscore.date to npm. Removed dependencies on underscore.
+
+### 0.3.2
+
+- Release Apr 9, 2011
+
+Added `'z'` and `'zz'` to `_.date().format()`. Cleaned up some redundant code to trim off some bytes.
+
+### 0.3.1
+
+- Release Mar 25, 2011
+
+Cleaned up the namespace. Moved all date manipulation and display functions to the _.date() object.
+
+### 0.3.0
+
+- Release Mar 25, 2011
+
+Switched to the Underscore methodology of not mucking with the native objects' prototypes.
+Made chaining possible.
+
+### 0.2.1
+
+- Release
+
+Changed date names to be a more pseudo standardized 'dddd, MMMM Do YYYY, h:mm:ss a'.
+Added `Date.prototype` functions `add`, `subtract`, `isdst`, and `isleapyear`.
+
+### 0.2.0
+
+- Release
+
+Changed function names to be more concise.
+Changed date format from php date format to custom format.
+
+### 0.1.0
+
+- Release
+
+Initial release
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/LICENSE b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/LICENSE
new file mode 100644
index 00000000000..8618b7333d6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) JS Foundation and other contributors
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/README.md
new file mode 100644
index 00000000000..c45e9d62450
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/README.md
@@ -0,0 +1,58 @@
+[![Join the chat at https://gitter.im/moment/moment](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/moment/moment?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+[![NPM version][npm-version-image]][npm-url] [![NPM downloads][npm-downloads-image]][npm-url] [![MIT License][license-image]][license-url] [![Build Status][travis-image]][travis-url]
+[![Coverage Status](https://coveralls.io/repos/moment/moment/badge.svg?branch=develop)](https://coveralls.io/r/moment/moment?branch=develop)
+
+A lightweight JavaScript date library for parsing, validating, manipulating, and formatting dates.
+
+**[Documentation](http://momentjs.com/docs/)**
+
+## Port to ECMAScript 6 (version 2.10.0)
+
+Moment 2.10.0 does not bring any new features, but the code is now written in
+ECMAScript 6 modules and placed inside `src/`. Previously `moment.js`, `locale/*.js` and
+`test/moment/*.js`, `test/locale/*.js` contained the source of the project. Now
+the source is in `src/`, temporary build (ECMAScript 5) files are placed under
+`build/umd/` (for running tests during development), and the `moment.js` and
+`locale/*.js` files are updated only on release.
+
+If you want to use a particular revision of the code, make sure to run
+`grunt transpile update-index`, so `moment.js` and `locales/*.js` are synced
+with `src/*`. We might place that in a commit hook in the future.
+
+## Upgrading to 2.0.0
+
+There are a number of small backwards incompatible changes with version 2.0.0. [See the full descriptions here](https://gist.github.com/timrwood/e72f2eef320ed9e37c51#backwards-incompatible-changes)
+
+ * Changed language ordinal method to return the number + ordinal instead of just the ordinal.
+
+ * Changed two digit year parsing cutoff to match strptime.
+
+ * Removed `moment#sod` and `moment#eod` in favor of `moment#startOf` and `moment#endOf`.
+
+ * Removed `moment.humanizeDuration()` in favor of `moment.duration().humanize()`.
+
+ * Removed the lang data objects from the top level namespace.
+
+ * Duplicate `Date` passed to `moment()` instead of referencing it.
+
+## [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md)
+
+## [Contributing](https://github.com/moment/moment/blob/develop/CONTRIBUTING.md)
+
+We're looking for co-maintainers! If you want to become a master of time please
+write to [ichernev](https://github.com/ichernev).
+
+## License
+
+Moment.js is freely distributable under the terms of the [MIT license](https://github.com/moment/moment/blob/develop/LICENSE).
+
+[license-image]: http://img.shields.io/badge/license-MIT-blue.svg?style=flat
+[license-url]: LICENSE
+
+[npm-url]: https://npmjs.org/package/moment
+[npm-version-image]: http://img.shields.io/npm/v/moment.svg?style=flat
+[npm-downloads-image]: http://img.shields.io/npm/dm/moment.svg?style=flat
+
+[travis-url]: http://travis-ci.org/moment/moment
+[travis-image]: http://img.shields.io/travis/moment/moment/develop.svg?style=flat
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/bower.json
new file mode 100644
index 00000000000..992086f26cd
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/bower.json
@@ -0,0 +1,25 @@
+{
+ "name": "moment",
+ "license": "MIT",
+ "main": "moment.js",
+ "ignore": [
+ "**/.*",
+ "benchmarks",
+ "bower_components",
+ "meteor",
+ "node_modules",
+ "scripts",
+ "tasks",
+ "test",
+ "component.json",
+ "composer.json",
+ "CONTRIBUTING.md",
+ "ender.js",
+ "Gruntfile.js",
+ "Moment.js.nuspec",
+ "package.js",
+ "package.json",
+ "ISSUE_TEMPLATE.md",
+ "typing-tests"
+ ]
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/af.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/af.js
new file mode 100644
index 00000000000..08bb705022f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/af.js
@@ -0,0 +1,73 @@
+//! moment.js locale configuration
+//! locale : Afrikaans [af]
+//! author : Werner Mollentze : https://github.com/wernerm
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var af = moment.defineLocale('af', {
+ months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'),
+ monthsShort : 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),
+ weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'),
+ weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),
+ weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),
+ meridiemParse: /vm|nm/i,
+ isPM : function (input) {
+ return /^nm$/i.test(input);
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 12) {
+ return isLower ? 'vm' : 'VM';
+ } else {
+ return isLower ? 'nm' : 'NM';
+ }
+ },
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Vandag om] LT',
+ nextDay : '[Môre om] LT',
+ nextWeek : 'dddd [om] LT',
+ lastDay : '[Gister om] LT',
+ lastWeek : '[Laas] dddd [om] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'oor %s',
+ past : '%s gelede',
+ s : '\'n paar sekondes',
+ m : '\'n minuut',
+ mm : '%d minute',
+ h : '\'n uur',
+ hh : '%d ure',
+ d : '\'n dag',
+ dd : '%d dae',
+ M : '\'n maand',
+ MM : '%d maande',
+ y : '\'n jaar',
+ yy : '%d jaar'
+ },
+ ordinalParse: /\d{1,2}(ste|de)/,
+ ordinal : function (number) {
+ return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter
+ },
+ week : {
+ dow : 1, // Maandag is die eerste dag van die week.
+ doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
+ }
+});
+
+return af;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar-dz.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar-dz.js
new file mode 100644
index 00000000000..f3945944635
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar-dz.js
@@ -0,0 +1,59 @@
+//! moment.js locale configuration
+//! locale : Arabic (Algeria) [ar-dz]
+//! author : Noureddine LOUAHEDJ : https://github.com/noureddineme
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var arDz = moment.defineLocale('ar-dz', {
+ months : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ monthsShort : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort : 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin : 'أح_إث_ثلا_أر_خم_جم_سب'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[اليوم على الساعة] LT',
+ nextDay: '[غدا على الساعة] LT',
+ nextWeek: 'dddd [على الساعة] LT',
+ lastDay: '[أمس على الساعة] LT',
+ lastWeek: 'dddd [على الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'في %s',
+ past : 'منذ %s',
+ s : 'ثوان',
+ m : 'دقيقة',
+ mm : '%d دقائق',
+ h : 'ساعة',
+ hh : '%d ساعات',
+ d : 'يوم',
+ dd : '%d أيام',
+ M : 'شهر',
+ MM : '%d أشهر',
+ y : 'سنة',
+ yy : '%d سنوات'
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 4 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return arDz;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar-ly.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar-ly.js
new file mode 100644
index 00000000000..7180ed4ed8f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar-ly.js
@@ -0,0 +1,126 @@
+//! moment.js locale configuration
+//! locale : Arabic (Lybia) [ar-ly]
+//! author : Ali Hmer: https://github.com/kikoanis
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var symbolMap = {
+ '1': '1',
+ '2': '2',
+ '3': '3',
+ '4': '4',
+ '5': '5',
+ '6': '6',
+ '7': '7',
+ '8': '8',
+ '9': '9',
+ '0': '0'
+};
+var pluralForm = function (n) {
+ return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5;
+};
+var plurals = {
+ s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'],
+ m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'],
+ h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'],
+ d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'],
+ M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'],
+ y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام']
+};
+var pluralize = function (u) {
+ return function (number, withoutSuffix, string, isFuture) {
+ var f = pluralForm(number),
+ str = plurals[u][pluralForm(number)];
+ if (f === 2) {
+ str = str[withoutSuffix ? 0 : 1];
+ }
+ return str.replace(/%d/i, number);
+ };
+};
+var months = [
+ 'يناير',
+ 'فبراير',
+ 'مارس',
+ 'أبريل',
+ 'مايو',
+ 'يونيو',
+ 'يوليو',
+ 'أغسطس',
+ 'سبتمبر',
+ 'أكتوبر',
+ 'نوفمبر',
+ 'ديسمبر'
+];
+
+var arLy = moment.defineLocale('ar-ly', {
+ months : months,
+ monthsShort : months,
+ weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'D/\u200FM/\u200FYYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /ص|م/,
+ isPM : function (input) {
+ return 'م' === input;
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'ص';
+ } else {
+ return 'م';
+ }
+ },
+ calendar : {
+ sameDay: '[اليوم عند الساعة] LT',
+ nextDay: '[غدًا عند الساعة] LT',
+ nextWeek: 'dddd [عند الساعة] LT',
+ lastDay: '[أمس عند الساعة] LT',
+ lastWeek: 'dddd [عند الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'بعد %s',
+ past : 'منذ %s',
+ s : pluralize('s'),
+ m : pluralize('m'),
+ mm : pluralize('m'),
+ h : pluralize('h'),
+ hh : pluralize('h'),
+ d : pluralize('d'),
+ dd : pluralize('d'),
+ M : pluralize('M'),
+ MM : pluralize('M'),
+ y : pluralize('y'),
+ yy : pluralize('y')
+ },
+ preparse: function (string) {
+ return string.replace(/\u200f/g, '').replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ }).replace(/,/g, '،');
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return arLy;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar-ma.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar-ma.js
new file mode 100644
index 00000000000..cbd810ba79b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar-ma.js
@@ -0,0 +1,60 @@
+//! moment.js locale configuration
+//! locale : Arabic (Morocco) [ar-ma]
+//! author : ElFadili Yassine : https://github.com/ElFadiliY
+//! author : Abdel Said : https://github.com/abdelsaid
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var arMa = moment.defineLocale('ar-ma', {
+ months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
+ monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
+ weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[اليوم على الساعة] LT',
+ nextDay: '[غدا على الساعة] LT',
+ nextWeek: 'dddd [على الساعة] LT',
+ lastDay: '[أمس على الساعة] LT',
+ lastWeek: 'dddd [على الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'في %s',
+ past : 'منذ %s',
+ s : 'ثوان',
+ m : 'دقيقة',
+ mm : '%d دقائق',
+ h : 'ساعة',
+ hh : '%d ساعات',
+ d : 'يوم',
+ dd : '%d أيام',
+ M : 'شهر',
+ MM : '%d أشهر',
+ y : 'سنة',
+ yy : '%d سنوات'
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return arMa;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar-sa.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar-sa.js
new file mode 100644
index 00000000000..dccd0d83309
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar-sa.js
@@ -0,0 +1,105 @@
+//! moment.js locale configuration
+//! locale : Arabic (Saudi Arabia) [ar-sa]
+//! author : Suhail Alkowaileet : https://github.com/xsoh
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var symbolMap = {
+ '1': '١',
+ '2': '٢',
+ '3': '٣',
+ '4': '٤',
+ '5': '٥',
+ '6': '٦',
+ '7': '٧',
+ '8': '٨',
+ '9': '٩',
+ '0': '٠'
+};
+var numberMap = {
+ '١': '1',
+ '٢': '2',
+ '٣': '3',
+ '٤': '4',
+ '٥': '5',
+ '٦': '6',
+ '٧': '7',
+ '٨': '8',
+ '٩': '9',
+ '٠': '0'
+};
+
+var arSa = moment.defineLocale('ar-sa', {
+ months : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ monthsShort : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /ص|م/,
+ isPM : function (input) {
+ return 'م' === input;
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'ص';
+ } else {
+ return 'م';
+ }
+ },
+ calendar : {
+ sameDay: '[اليوم على الساعة] LT',
+ nextDay: '[غدا على الساعة] LT',
+ nextWeek: 'dddd [على الساعة] LT',
+ lastDay: '[أمس على الساعة] LT',
+ lastWeek: 'dddd [على الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'في %s',
+ past : 'منذ %s',
+ s : 'ثوان',
+ m : 'دقيقة',
+ mm : '%d دقائق',
+ h : 'ساعة',
+ hh : '%d ساعات',
+ d : 'يوم',
+ dd : '%d أيام',
+ M : 'شهر',
+ MM : '%d أشهر',
+ y : 'سنة',
+ yy : '%d سنوات'
+ },
+ preparse: function (string) {
+ return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
+ return numberMap[match];
+ }).replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ }).replace(/,/g, '،');
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return arSa;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar-tn.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar-tn.js
new file mode 100644
index 00000000000..5f0d38bb06e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar-tn.js
@@ -0,0 +1,59 @@
+//! moment.js locale configuration
+//! locale : Arabic (Tunisia) [ar-tn]
+//! author : Nader Toukabri : https://github.com/naderio
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var arTn = moment.defineLocale('ar-tn', {
+ months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY HH:mm',
+ LLLL: 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar: {
+ sameDay: '[اليوم على الساعة] LT',
+ nextDay: '[غدا على الساعة] LT',
+ nextWeek: 'dddd [على الساعة] LT',
+ lastDay: '[أمس على الساعة] LT',
+ lastWeek: 'dddd [على الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: 'في %s',
+ past: 'منذ %s',
+ s: 'ثوان',
+ m: 'دقيقة',
+ mm: '%d دقائق',
+ h: 'ساعة',
+ hh: '%d ساعات',
+ d: 'يوم',
+ dd: '%d أيام',
+ M: 'شهر',
+ MM: '%d أشهر',
+ y: 'سنة',
+ yy: '%d سنوات'
+ },
+ week: {
+ dow: 1, // Monday is the first day of the week.
+ doy: 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return arTn;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar.js
new file mode 100644
index 00000000000..d263e4c4f8d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ar.js
@@ -0,0 +1,142 @@
+//! moment.js locale configuration
+//! locale : Arabic [ar]
+//! author : Abdel Said: https://github.com/abdelsaid
+//! author : Ahmed Elkhatib
+//! author : forabi https://github.com/forabi
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var symbolMap = {
+ '1': '١',
+ '2': '٢',
+ '3': '٣',
+ '4': '٤',
+ '5': '٥',
+ '6': '٦',
+ '7': '٧',
+ '8': '٨',
+ '9': '٩',
+ '0': '٠'
+};
+var numberMap = {
+ '١': '1',
+ '٢': '2',
+ '٣': '3',
+ '٤': '4',
+ '٥': '5',
+ '٦': '6',
+ '٧': '7',
+ '٨': '8',
+ '٩': '9',
+ '٠': '0'
+};
+var pluralForm = function (n) {
+ return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5;
+};
+var plurals = {
+ s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'],
+ m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'],
+ h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'],
+ d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'],
+ M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'],
+ y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام']
+};
+var pluralize = function (u) {
+ return function (number, withoutSuffix, string, isFuture) {
+ var f = pluralForm(number),
+ str = plurals[u][pluralForm(number)];
+ if (f === 2) {
+ str = str[withoutSuffix ? 0 : 1];
+ }
+ return str.replace(/%d/i, number);
+ };
+};
+var months = [
+ 'كانون الثاني يناير',
+ 'شباط فبراير',
+ 'آذار مارس',
+ 'نيسان أبريل',
+ 'أيار مايو',
+ 'حزيران يونيو',
+ 'تموز يوليو',
+ 'آب أغسطس',
+ 'أيلول سبتمبر',
+ 'تشرين الأول أكتوبر',
+ 'تشرين الثاني نوفمبر',
+ 'كانون الأول ديسمبر'
+];
+
+var ar = moment.defineLocale('ar', {
+ months : months,
+ monthsShort : months,
+ weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'D/\u200FM/\u200FYYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /ص|م/,
+ isPM : function (input) {
+ return 'م' === input;
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'ص';
+ } else {
+ return 'م';
+ }
+ },
+ calendar : {
+ sameDay: '[اليوم عند الساعة] LT',
+ nextDay: '[غدًا عند الساعة] LT',
+ nextWeek: 'dddd [عند الساعة] LT',
+ lastDay: '[أمس عند الساعة] LT',
+ lastWeek: 'dddd [عند الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'بعد %s',
+ past : 'منذ %s',
+ s : pluralize('s'),
+ m : pluralize('m'),
+ mm : pluralize('m'),
+ h : pluralize('h'),
+ hh : pluralize('h'),
+ d : pluralize('d'),
+ dd : pluralize('d'),
+ M : pluralize('M'),
+ MM : pluralize('M'),
+ y : pluralize('y'),
+ yy : pluralize('y')
+ },
+ preparse: function (string) {
+ return string.replace(/\u200f/g, '').replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
+ return numberMap[match];
+ }).replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ }).replace(/,/g, '،');
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return ar;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/az.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/az.js
new file mode 100644
index 00000000000..054cb472427
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/az.js
@@ -0,0 +1,105 @@
+//! moment.js locale configuration
+//! locale : Azerbaijani [az]
+//! author : topchiyev : https://github.com/topchiyev
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var suffixes = {
+ 1: '-inci',
+ 5: '-inci',
+ 8: '-inci',
+ 70: '-inci',
+ 80: '-inci',
+ 2: '-nci',
+ 7: '-nci',
+ 20: '-nci',
+ 50: '-nci',
+ 3: '-üncü',
+ 4: '-üncü',
+ 100: '-üncü',
+ 6: '-ncı',
+ 9: '-uncu',
+ 10: '-uncu',
+ 30: '-uncu',
+ 60: '-ıncı',
+ 90: '-ıncı'
+};
+
+var az = moment.defineLocale('az', {
+ months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'),
+ monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),
+ weekdays : 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'),
+ weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'),
+ weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[bugün saat] LT',
+ nextDay : '[sabah saat] LT',
+ nextWeek : '[gələn həftə] dddd [saat] LT',
+ lastDay : '[dünən] LT',
+ lastWeek : '[keçən həftə] dddd [saat] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s sonra',
+ past : '%s əvvəl',
+ s : 'birneçə saniyyə',
+ m : 'bir dəqiqə',
+ mm : '%d dəqiqə',
+ h : 'bir saat',
+ hh : '%d saat',
+ d : 'bir gün',
+ dd : '%d gün',
+ M : 'bir ay',
+ MM : '%d ay',
+ y : 'bir il',
+ yy : '%d il'
+ },
+ meridiemParse: /gecə|səhər|gündüz|axşam/,
+ isPM : function (input) {
+ return /^(gündüz|axşam)$/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'gecə';
+ } else if (hour < 12) {
+ return 'səhər';
+ } else if (hour < 17) {
+ return 'gündüz';
+ } else {
+ return 'axşam';
+ }
+ },
+ ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,
+ ordinal : function (number) {
+ if (number === 0) { // special case for zero
+ return number + '-ıncı';
+ }
+ var a = number % 10,
+ b = number % 100 - a,
+ c = number >= 100 ? 100 : null;
+ return number + (suffixes[a] || suffixes[b] || suffixes[c]);
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return az;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/be.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/be.js
new file mode 100644
index 00000000000..e8c269f5f8f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/be.js
@@ -0,0 +1,134 @@
+//! moment.js locale configuration
+//! locale : Belarusian [be]
+//! author : Dmitry Demidov : https://github.com/demidov91
+//! author: Praleska: http://praleska.pro/
+//! Author : Menelion Elensúle : https://github.com/Oire
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+function plural(word, num) {
+ var forms = word.split('_');
+ return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+}
+function relativeTimeWithPlural(number, withoutSuffix, key) {
+ var format = {
+ 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',
+ 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін',
+ 'dd': 'дзень_дні_дзён',
+ 'MM': 'месяц_месяцы_месяцаў',
+ 'yy': 'год_гады_гадоў'
+ };
+ if (key === 'm') {
+ return withoutSuffix ? 'хвіліна' : 'хвіліну';
+ }
+ else if (key === 'h') {
+ return withoutSuffix ? 'гадзіна' : 'гадзіну';
+ }
+ else {
+ return number + ' ' + plural(format[key], +number);
+ }
+}
+
+var be = moment.defineLocale('be', {
+ months : {
+ format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_'),
+ standalone: 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_')
+ },
+ monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),
+ weekdays : {
+ format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_'),
+ standalone: 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'),
+ isFormat: /\[ ?[Вв] ?(?:мінулую|наступную)? ?\] ?dddd/
+ },
+ weekdaysShort : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
+ weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY г.',
+ LLL : 'D MMMM YYYY г., HH:mm',
+ LLLL : 'dddd, D MMMM YYYY г., HH:mm'
+ },
+ calendar : {
+ sameDay: '[Сёння ў] LT',
+ nextDay: '[Заўтра ў] LT',
+ lastDay: '[Учора ў] LT',
+ nextWeek: function () {
+ return '[У] dddd [ў] LT';
+ },
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ case 5:
+ case 6:
+ return '[У мінулую] dddd [ў] LT';
+ case 1:
+ case 2:
+ case 4:
+ return '[У мінулы] dddd [ў] LT';
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'праз %s',
+ past : '%s таму',
+ s : 'некалькі секунд',
+ m : relativeTimeWithPlural,
+ mm : relativeTimeWithPlural,
+ h : relativeTimeWithPlural,
+ hh : relativeTimeWithPlural,
+ d : 'дзень',
+ dd : relativeTimeWithPlural,
+ M : 'месяц',
+ MM : relativeTimeWithPlural,
+ y : 'год',
+ yy : relativeTimeWithPlural
+ },
+ meridiemParse: /ночы|раніцы|дня|вечара/,
+ isPM : function (input) {
+ return /^(дня|вечара)$/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'ночы';
+ } else if (hour < 12) {
+ return 'раніцы';
+ } else if (hour < 17) {
+ return 'дня';
+ } else {
+ return 'вечара';
+ }
+ },
+ ordinalParse: /\d{1,2}-(і|ы|га)/,
+ ordinal: function (number, period) {
+ switch (period) {
+ case 'M':
+ case 'd':
+ case 'DDD':
+ case 'w':
+ case 'W':
+ return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы';
+ case 'D':
+ return number + '-га';
+ default:
+ return number;
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return be;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/bg.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/bg.js
new file mode 100644
index 00000000000..663f5be8132
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/bg.js
@@ -0,0 +1,90 @@
+//! moment.js locale configuration
+//! locale : Bulgarian [bg]
+//! author : Krasen Borisov : https://github.com/kraz
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var bg = moment.defineLocale('bg', {
+ months : 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'),
+ monthsShort : 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),
+ weekdays : 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'),
+ weekdaysShort : 'нед_пон_вто_сря_чет_пет_съб'.split('_'),
+ weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'D.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY H:mm',
+ LLLL : 'dddd, D MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[Днес в] LT',
+ nextDay : '[Утре в] LT',
+ nextWeek : 'dddd [в] LT',
+ lastDay : '[Вчера в] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ case 6:
+ return '[В изминалата] dddd [в] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[В изминалия] dddd [в] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'след %s',
+ past : 'преди %s',
+ s : 'няколко секунди',
+ m : 'минута',
+ mm : '%d минути',
+ h : 'час',
+ hh : '%d часа',
+ d : 'ден',
+ dd : '%d дни',
+ M : 'месец',
+ MM : '%d месеца',
+ y : 'година',
+ yy : '%d години'
+ },
+ ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
+ ordinal : function (number) {
+ var lastDigit = number % 10,
+ last2Digits = number % 100;
+ if (number === 0) {
+ return number + '-ев';
+ } else if (last2Digits === 0) {
+ return number + '-ен';
+ } else if (last2Digits > 10 && last2Digits < 20) {
+ return number + '-ти';
+ } else if (lastDigit === 1) {
+ return number + '-ви';
+ } else if (lastDigit === 2) {
+ return number + '-ри';
+ } else if (lastDigit === 7 || lastDigit === 8) {
+ return number + '-ми';
+ } else {
+ return number + '-ти';
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return bg;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/bn.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/bn.js
new file mode 100644
index 00000000000..b6f942a6dca
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/bn.js
@@ -0,0 +1,119 @@
+//! moment.js locale configuration
+//! locale : Bengali [bn]
+//! author : Kaushik Gandhi : https://github.com/kaushikgandhi
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var symbolMap = {
+ '1': '১',
+ '2': '২',
+ '3': '৩',
+ '4': '৪',
+ '5': '৫',
+ '6': '৬',
+ '7': '৭',
+ '8': '৮',
+ '9': '৯',
+ '0': '০'
+};
+var numberMap = {
+ '১': '1',
+ '২': '2',
+ '৩': '3',
+ '৪': '4',
+ '৫': '5',
+ '৬': '6',
+ '৭': '7',
+ '৮': '8',
+ '৯': '9',
+ '০': '0'
+};
+
+var bn = moment.defineLocale('bn', {
+ months : 'জানুয়ারী_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'),
+ monthsShort : 'জানু_ফেব_মার্চ_এপ্র_মে_জুন_জুল_আগ_সেপ্ট_অক্টো_নভে_ডিসে'.split('_'),
+ weekdays : 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split('_'),
+ weekdaysShort : 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),
+ weekdaysMin : 'রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm সময়',
+ LTS : 'A h:mm:ss সময়',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm সময়',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm সময়'
+ },
+ calendar : {
+ sameDay : '[আজ] LT',
+ nextDay : '[আগামীকাল] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[গতকাল] LT',
+ lastWeek : '[গত] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s পরে',
+ past : '%s আগে',
+ s : 'কয়েক সেকেন্ড',
+ m : 'এক মিনিট',
+ mm : '%d মিনিট',
+ h : 'এক ঘন্টা',
+ hh : '%d ঘন্টা',
+ d : 'এক দিন',
+ dd : '%d দিন',
+ M : 'এক মাস',
+ MM : '%d মাস',
+ y : 'এক বছর',
+ yy : '%d বছর'
+ },
+ preparse: function (string) {
+ return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if ((meridiem === 'রাত' && hour >= 4) ||
+ (meridiem === 'দুপুর' && hour < 5) ||
+ meridiem === 'বিকাল') {
+ return hour + 12;
+ } else {
+ return hour;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'রাত';
+ } else if (hour < 10) {
+ return 'সকাল';
+ } else if (hour < 17) {
+ return 'দুপুর';
+ } else if (hour < 20) {
+ return 'বিকাল';
+ } else {
+ return 'রাত';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return bn;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/bo.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/bo.js
new file mode 100644
index 00000000000..eb6db476d8d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/bo.js
@@ -0,0 +1,119 @@
+//! moment.js locale configuration
+//! locale : Tibetan [bo]
+//! author : Thupten N. Chakrishar : https://github.com/vajradog
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var symbolMap = {
+ '1': '༡',
+ '2': '༢',
+ '3': '༣',
+ '4': '༤',
+ '5': '༥',
+ '6': '༦',
+ '7': '༧',
+ '8': '༨',
+ '9': '༩',
+ '0': '༠'
+};
+var numberMap = {
+ '༡': '1',
+ '༢': '2',
+ '༣': '3',
+ '༤': '4',
+ '༥': '5',
+ '༦': '6',
+ '༧': '7',
+ '༨': '8',
+ '༩': '9',
+ '༠': '0'
+};
+
+var bo = moment.defineLocale('bo', {
+ months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
+ monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
+ weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'),
+ weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
+ weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm',
+ LTS : 'A h:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm'
+ },
+ calendar : {
+ sameDay : '[དི་རིང] LT',
+ nextDay : '[སང་ཉིན] LT',
+ nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT',
+ lastDay : '[ཁ་སང] LT',
+ lastWeek : '[བདུན་ཕྲག་མཐའ་མ] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s ལ་',
+ past : '%s སྔན་ལ',
+ s : 'ལམ་སང',
+ m : 'སྐར་མ་གཅིག',
+ mm : '%d སྐར་མ',
+ h : 'ཆུ་ཚོད་གཅིག',
+ hh : '%d ཆུ་ཚོད',
+ d : 'ཉིན་གཅིག',
+ dd : '%d ཉིན་',
+ M : 'ཟླ་བ་གཅིག',
+ MM : '%d ཟླ་བ',
+ y : 'ལོ་གཅིག',
+ yy : '%d ལོ'
+ },
+ preparse: function (string) {
+ return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if ((meridiem === 'མཚན་མོ' && hour >= 4) ||
+ (meridiem === 'ཉིན་གུང' && hour < 5) ||
+ meridiem === 'དགོང་དག') {
+ return hour + 12;
+ } else {
+ return hour;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'མཚན་མོ';
+ } else if (hour < 10) {
+ return 'ཞོགས་ཀས';
+ } else if (hour < 17) {
+ return 'ཉིན་གུང';
+ } else if (hour < 20) {
+ return 'དགོང་དག';
+ } else {
+ return 'མཚན་མོ';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return bo;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/br.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/br.js
new file mode 100644
index 00000000000..4e1829962f7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/br.js
@@ -0,0 +1,108 @@
+//! moment.js locale configuration
+//! locale : Breton [br]
+//! author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+function relativeTimeWithMutation(number, withoutSuffix, key) {
+ var format = {
+ 'mm': 'munutenn',
+ 'MM': 'miz',
+ 'dd': 'devezh'
+ };
+ return number + ' ' + mutation(format[key], number);
+}
+function specialMutationForYears(number) {
+ switch (lastNumber(number)) {
+ case 1:
+ case 3:
+ case 4:
+ case 5:
+ case 9:
+ return number + ' bloaz';
+ default:
+ return number + ' vloaz';
+ }
+}
+function lastNumber(number) {
+ if (number > 9) {
+ return lastNumber(number % 10);
+ }
+ return number;
+}
+function mutation(text, number) {
+ if (number === 2) {
+ return softMutation(text);
+ }
+ return text;
+}
+function softMutation(text) {
+ var mutationTable = {
+ 'm': 'v',
+ 'b': 'v',
+ 'd': 'z'
+ };
+ if (mutationTable[text.charAt(0)] === undefined) {
+ return text;
+ }
+ return mutationTable[text.charAt(0)] + text.substring(1);
+}
+
+var br = moment.defineLocale('br', {
+ months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'),
+ monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),
+ weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'),
+ weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),
+ weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'h[e]mm A',
+ LTS : 'h[e]mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D [a viz] MMMM YYYY',
+ LLL : 'D [a viz] MMMM YYYY h[e]mm A',
+ LLLL : 'dddd, D [a viz] MMMM YYYY h[e]mm A'
+ },
+ calendar : {
+ sameDay : '[Hiziv da] LT',
+ nextDay : '[Warc\'hoazh da] LT',
+ nextWeek : 'dddd [da] LT',
+ lastDay : '[Dec\'h da] LT',
+ lastWeek : 'dddd [paset da] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'a-benn %s',
+ past : '%s \'zo',
+ s : 'un nebeud segondennoù',
+ m : 'ur vunutenn',
+ mm : relativeTimeWithMutation,
+ h : 'un eur',
+ hh : '%d eur',
+ d : 'un devezh',
+ dd : relativeTimeWithMutation,
+ M : 'ur miz',
+ MM : relativeTimeWithMutation,
+ y : 'ur bloaz',
+ yy : specialMutationForYears
+ },
+ ordinalParse: /\d{1,2}(añ|vet)/,
+ ordinal : function (number) {
+ var output = (number === 1) ? 'añ' : 'vet';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return br;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/bs.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/bs.js
new file mode 100644
index 00000000000..f2b8725c531
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/bs.js
@@ -0,0 +1,143 @@
+//! moment.js locale configuration
+//! locale : Bosnian [bs]
+//! author : Nedim Cholich : https://github.com/frontyard
+//! based on (hr) translation by Bojan Marković
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+function translate(number, withoutSuffix, key) {
+ var result = number + ' ';
+ switch (key) {
+ case 'm':
+ return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+ case 'mm':
+ if (number === 1) {
+ result += 'minuta';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'minute';
+ } else {
+ result += 'minuta';
+ }
+ return result;
+ case 'h':
+ return withoutSuffix ? 'jedan sat' : 'jednog sata';
+ case 'hh':
+ if (number === 1) {
+ result += 'sat';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'sata';
+ } else {
+ result += 'sati';
+ }
+ return result;
+ case 'dd':
+ if (number === 1) {
+ result += 'dan';
+ } else {
+ result += 'dana';
+ }
+ return result;
+ case 'MM':
+ if (number === 1) {
+ result += 'mjesec';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'mjeseca';
+ } else {
+ result += 'mjeseci';
+ }
+ return result;
+ case 'yy':
+ if (number === 1) {
+ result += 'godina';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'godine';
+ } else {
+ result += 'godina';
+ }
+ return result;
+ }
+}
+
+var bs = moment.defineLocale('bs', {
+ months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'),
+ monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
+ weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
+ weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[danas u] LT',
+ nextDay : '[sutra u] LT',
+ nextWeek : function () {
+ switch (this.day()) {
+ case 0:
+ return '[u] [nedjelju] [u] LT';
+ case 3:
+ return '[u] [srijedu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ },
+ lastDay : '[jučer u] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ return '[prošlu] dddd [u] LT';
+ case 6:
+ return '[prošle] [subote] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[prošli] dddd [u] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'prije %s',
+ s : 'par sekundi',
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : 'dan',
+ dd : translate,
+ M : 'mjesec',
+ MM : translate,
+ y : 'godinu',
+ yy : translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return bs;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ca.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ca.js
new file mode 100644
index 00000000000..3a4c62f1781
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ca.js
@@ -0,0 +1,81 @@
+//! moment.js locale configuration
+//! locale : Catalan [ca]
+//! author : Juan G. Hurtado : https://github.com/juanghurtado
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var ca = moment.defineLocale('ca', {
+ months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'),
+ monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'),
+ weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),
+ weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY H:mm',
+ LLLL : 'dddd D MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : function () {
+ return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ nextDay : function () {
+ return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ lastDay : function () {
+ return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ lastWeek : function () {
+ return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'd\'aquí %s',
+ past : 'fa %s',
+ s : 'uns segons',
+ m : 'un minut',
+ mm : '%d minuts',
+ h : 'una hora',
+ hh : '%d hores',
+ d : 'un dia',
+ dd : '%d dies',
+ M : 'un mes',
+ MM : '%d mesos',
+ y : 'un any',
+ yy : '%d anys'
+ },
+ ordinalParse: /\d{1,2}(r|n|t|è|a)/,
+ ordinal : function (number, period) {
+ var output = (number === 1) ? 'r' :
+ (number === 2) ? 'n' :
+ (number === 3) ? 'r' :
+ (number === 4) ? 't' : 'è';
+ if (period === 'w' || period === 'W') {
+ output = 'a';
+ }
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return ca;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/cs.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/cs.js
new file mode 100644
index 00000000000..35a8a5a781e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/cs.js
@@ -0,0 +1,172 @@
+//! moment.js locale configuration
+//! locale : Czech [cs]
+//! author : petrbela : https://github.com/petrbela
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var months = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_');
+var monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_');
+function plural(n) {
+ return (n > 1) && (n < 5) && (~~(n / 10) !== 1);
+}
+function translate(number, withoutSuffix, key, isFuture) {
+ var result = number + ' ';
+ switch (key) {
+ case 's': // a few seconds / in a few seconds / a few seconds ago
+ return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami';
+ case 'm': // a minute / in a minute / a minute ago
+ return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');
+ case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'minuty' : 'minut');
+ } else {
+ return result + 'minutami';
+ }
+ break;
+ case 'h': // an hour / in an hour / an hour ago
+ return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+ case 'hh': // 9 hours / in 9 hours / 9 hours ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'hodiny' : 'hodin');
+ } else {
+ return result + 'hodinami';
+ }
+ break;
+ case 'd': // a day / in a day / a day ago
+ return (withoutSuffix || isFuture) ? 'den' : 'dnem';
+ case 'dd': // 9 days / in 9 days / 9 days ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'dny' : 'dní');
+ } else {
+ return result + 'dny';
+ }
+ break;
+ case 'M': // a month / in a month / a month ago
+ return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';
+ case 'MM': // 9 months / in 9 months / 9 months ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'měsíce' : 'měsíců');
+ } else {
+ return result + 'měsíci';
+ }
+ break;
+ case 'y': // a year / in a year / a year ago
+ return (withoutSuffix || isFuture) ? 'rok' : 'rokem';
+ case 'yy': // 9 years / in 9 years / 9 years ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'roky' : 'let');
+ } else {
+ return result + 'lety';
+ }
+ break;
+ }
+}
+
+var cs = moment.defineLocale('cs', {
+ months : months,
+ monthsShort : monthsShort,
+ monthsParse : (function (months, monthsShort) {
+ var i, _monthsParse = [];
+ for (i = 0; i < 12; i++) {
+ // use custom parser to solve problem with July (červenec)
+ _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
+ }
+ return _monthsParse;
+ }(months, monthsShort)),
+ shortMonthsParse : (function (monthsShort) {
+ var i, _shortMonthsParse = [];
+ for (i = 0; i < 12; i++) {
+ _shortMonthsParse[i] = new RegExp('^' + monthsShort[i] + '$', 'i');
+ }
+ return _shortMonthsParse;
+ }(monthsShort)),
+ longMonthsParse : (function (months) {
+ var i, _longMonthsParse = [];
+ for (i = 0; i < 12; i++) {
+ _longMonthsParse[i] = new RegExp('^' + months[i] + '$', 'i');
+ }
+ return _longMonthsParse;
+ }(months)),
+ weekdays : 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),
+ weekdaysShort : 'ne_po_út_st_čt_pá_so'.split('_'),
+ weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'),
+ longDateFormat : {
+ LT: 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd D. MMMM YYYY H:mm',
+ l : 'D. M. YYYY'
+ },
+ calendar : {
+ sameDay: '[dnes v] LT',
+ nextDay: '[zítra v] LT',
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[v neděli v] LT';
+ case 1:
+ case 2:
+ return '[v] dddd [v] LT';
+ case 3:
+ return '[ve středu v] LT';
+ case 4:
+ return '[ve čtvrtek v] LT';
+ case 5:
+ return '[v pátek v] LT';
+ case 6:
+ return '[v sobotu v] LT';
+ }
+ },
+ lastDay: '[včera v] LT',
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[minulou neděli v] LT';
+ case 1:
+ case 2:
+ return '[minulé] dddd [v] LT';
+ case 3:
+ return '[minulou středu v] LT';
+ case 4:
+ case 5:
+ return '[minulý] dddd [v] LT';
+ case 6:
+ return '[minulou sobotu v] LT';
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'před %s',
+ s : translate,
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : translate,
+ dd : translate,
+ M : translate,
+ MM : translate,
+ y : translate,
+ yy : translate
+ },
+ ordinalParse : /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return cs;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/cv.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/cv.js
new file mode 100644
index 00000000000..59ad1445a56
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/cv.js
@@ -0,0 +1,63 @@
+//! moment.js locale configuration
+//! locale : Chuvash [cv]
+//! author : Anatoly Mironov : https://github.com/mirontoli
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var cv = moment.defineLocale('cv', {
+ months : 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'),
+ monthsShort : 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'),
+ weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'),
+ weekdaysShort : 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'),
+ weekdaysMin : 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD-MM-YYYY',
+ LL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]',
+ LLL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',
+ LLLL : 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm'
+ },
+ calendar : {
+ sameDay: '[Паян] LT [сехетре]',
+ nextDay: '[Ыран] LT [сехетре]',
+ lastDay: '[Ӗнер] LT [сехетре]',
+ nextWeek: '[Ҫитес] dddd LT [сехетре]',
+ lastWeek: '[Иртнӗ] dddd LT [сехетре]',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : function (output) {
+ var affix = /сехет$/i.exec(output) ? 'рен' : /ҫул$/i.exec(output) ? 'тан' : 'ран';
+ return output + affix;
+ },
+ past : '%s каялла',
+ s : 'пӗр-ик ҫеккунт',
+ m : 'пӗр минут',
+ mm : '%d минут',
+ h : 'пӗр сехет',
+ hh : '%d сехет',
+ d : 'пӗр кун',
+ dd : '%d кун',
+ M : 'пӗр уйӑх',
+ MM : '%d уйӑх',
+ y : 'пӗр ҫул',
+ yy : '%d ҫул'
+ },
+ ordinalParse: /\d{1,2}-мӗш/,
+ ordinal : '%d-мӗш',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return cv;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/cy.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/cy.js
new file mode 100644
index 00000000000..022b1062574
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/cy.js
@@ -0,0 +1,81 @@
+//! moment.js locale configuration
+//! locale : Welsh [cy]
+//! author : Robert Allen : https://github.com/robgallen
+//! author : https://github.com/ryangreaves
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var cy = moment.defineLocale('cy', {
+ months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'),
+ monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'),
+ weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'),
+ weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),
+ weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),
+ weekdaysParseExact : true,
+ // time formats are the same as en-gb
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY HH:mm',
+ LLLL: 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar: {
+ sameDay: '[Heddiw am] LT',
+ nextDay: '[Yfory am] LT',
+ nextWeek: 'dddd [am] LT',
+ lastDay: '[Ddoe am] LT',
+ lastWeek: 'dddd [diwethaf am] LT',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: 'mewn %s',
+ past: '%s yn ôl',
+ s: 'ychydig eiliadau',
+ m: 'munud',
+ mm: '%d munud',
+ h: 'awr',
+ hh: '%d awr',
+ d: 'diwrnod',
+ dd: '%d diwrnod',
+ M: 'mis',
+ MM: '%d mis',
+ y: 'blwyddyn',
+ yy: '%d flynedd'
+ },
+ ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,
+ // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
+ ordinal: function (number) {
+ var b = number,
+ output = '',
+ lookup = [
+ '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed
+ 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed
+ ];
+ if (b > 20) {
+ if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
+ output = 'fed'; // not 30ain, 70ain or 90ain
+ } else {
+ output = 'ain';
+ }
+ } else if (b > 0) {
+ output = lookup[b];
+ }
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return cy;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/da.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/da.js
new file mode 100644
index 00000000000..223c3d7e45a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/da.js
@@ -0,0 +1,60 @@
+//! moment.js locale configuration
+//! locale : Danish [da]
+//! author : Ulrik Nielsen : https://github.com/mrbase
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var da = moment.defineLocale('da', {
+ months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
+ weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
+ weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'),
+ weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY HH:mm',
+ LLLL : 'dddd [d.] D. MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[I dag kl.] LT',
+ nextDay : '[I morgen kl.] LT',
+ nextWeek : 'dddd [kl.] LT',
+ lastDay : '[I går kl.] LT',
+ lastWeek : '[sidste] dddd [kl] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'om %s',
+ past : '%s siden',
+ s : 'få sekunder',
+ m : 'et minut',
+ mm : '%d minutter',
+ h : 'en time',
+ hh : '%d timer',
+ d : 'en dag',
+ dd : '%d dage',
+ M : 'en måned',
+ MM : '%d måneder',
+ y : 'et år',
+ yy : '%d år'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return da;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/de-at.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/de-at.js
new file mode 100644
index 00000000000..e72c124dc50
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/de-at.js
@@ -0,0 +1,79 @@
+//! moment.js locale configuration
+//! locale : German (Austria) [de-at]
+//! author : lluchs : https://github.com/lluchs
+//! author: Menelion Elensúle: https://github.com/Oire
+//! author : Martin Groller : https://github.com/MadMG
+//! author : Mikolaj Dadela : https://github.com/mik01aj
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+function processRelativeTime(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 'm': ['eine Minute', 'einer Minute'],
+ 'h': ['eine Stunde', 'einer Stunde'],
+ 'd': ['ein Tag', 'einem Tag'],
+ 'dd': [number + ' Tage', number + ' Tagen'],
+ 'M': ['ein Monat', 'einem Monat'],
+ 'MM': [number + ' Monate', number + ' Monaten'],
+ 'y': ['ein Jahr', 'einem Jahr'],
+ 'yy': [number + ' Jahre', number + ' Jahren']
+ };
+ return withoutSuffix ? format[key][0] : format[key][1];
+}
+
+var deAt = moment.defineLocale('de-at', {
+ months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
+ monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
+ weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
+ weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY HH:mm',
+ LLLL : 'dddd, D. MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[heute um] LT [Uhr]',
+ sameElse: 'L',
+ nextDay: '[morgen um] LT [Uhr]',
+ nextWeek: 'dddd [um] LT [Uhr]',
+ lastDay: '[gestern um] LT [Uhr]',
+ lastWeek: '[letzten] dddd [um] LT [Uhr]'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : 'vor %s',
+ s : 'ein paar Sekunden',
+ m : processRelativeTime,
+ mm : '%d Minuten',
+ h : processRelativeTime,
+ hh : '%d Stunden',
+ d : processRelativeTime,
+ dd : processRelativeTime,
+ M : processRelativeTime,
+ MM : processRelativeTime,
+ y : processRelativeTime,
+ yy : processRelativeTime
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return deAt;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/de.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/de.js
new file mode 100644
index 00000000000..bb7197e48bb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/de.js
@@ -0,0 +1,78 @@
+//! moment.js locale configuration
+//! locale : German [de]
+//! author : lluchs : https://github.com/lluchs
+//! author: Menelion Elensúle: https://github.com/Oire
+//! author : Mikolaj Dadela : https://github.com/mik01aj
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+function processRelativeTime(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 'm': ['eine Minute', 'einer Minute'],
+ 'h': ['eine Stunde', 'einer Stunde'],
+ 'd': ['ein Tag', 'einem Tag'],
+ 'dd': [number + ' Tage', number + ' Tagen'],
+ 'M': ['ein Monat', 'einem Monat'],
+ 'MM': [number + ' Monate', number + ' Monaten'],
+ 'y': ['ein Jahr', 'einem Jahr'],
+ 'yy': [number + ' Jahre', number + ' Jahren']
+ };
+ return withoutSuffix ? format[key][0] : format[key][1];
+}
+
+var de = moment.defineLocale('de', {
+ months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
+ monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
+ weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
+ weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY HH:mm',
+ LLLL : 'dddd, D. MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[heute um] LT [Uhr]',
+ sameElse: 'L',
+ nextDay: '[morgen um] LT [Uhr]',
+ nextWeek: 'dddd [um] LT [Uhr]',
+ lastDay: '[gestern um] LT [Uhr]',
+ lastWeek: '[letzten] dddd [um] LT [Uhr]'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : 'vor %s',
+ s : 'ein paar Sekunden',
+ m : processRelativeTime,
+ mm : '%d Minuten',
+ h : processRelativeTime,
+ hh : '%d Stunden',
+ d : processRelativeTime,
+ dd : processRelativeTime,
+ M : processRelativeTime,
+ MM : processRelativeTime,
+ y : processRelativeTime,
+ yy : processRelativeTime
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return de;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/dv.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/dv.js
new file mode 100644
index 00000000000..065df78c364
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/dv.js
@@ -0,0 +1,100 @@
+//! moment.js locale configuration
+//! locale : Maldivian [dv]
+//! author : Jawish Hameed : https://github.com/jawish
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var months = [
+ 'ޖެނުއަރީ',
+ 'ފެބްރުއަރީ',
+ 'މާރިޗު',
+ 'އޭޕްރީލު',
+ 'މޭ',
+ 'ޖޫން',
+ 'ޖުލައި',
+ 'އޯގަސްޓު',
+ 'ސެޕްޓެމްބަރު',
+ 'އޮކްޓޯބަރު',
+ 'ނޮވެމްބަރު',
+ 'ޑިސެމްބަރު'
+];
+var weekdays = [
+ 'އާދިއްތަ',
+ 'ހޯމަ',
+ 'އަންގާރަ',
+ 'ބުދަ',
+ 'ބުރާސްފަތި',
+ 'ހުކުރު',
+ 'ހޮނިހިރު'
+];
+
+var dv = moment.defineLocale('dv', {
+ months : months,
+ monthsShort : months,
+ weekdays : weekdays,
+ weekdaysShort : weekdays,
+ weekdaysMin : 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'),
+ longDateFormat : {
+
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'D/M/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /މކ|މފ/,
+ isPM : function (input) {
+ return 'މފ' === input;
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'މކ';
+ } else {
+ return 'މފ';
+ }
+ },
+ calendar : {
+ sameDay : '[މިއަދު] LT',
+ nextDay : '[މާދަމާ] LT',
+ nextWeek : 'dddd LT',
+ lastDay : '[އިއްޔެ] LT',
+ lastWeek : '[ފާއިތުވި] dddd LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'ތެރޭގައި %s',
+ past : 'ކުރިން %s',
+ s : 'ސިކުންތުކޮޅެއް',
+ m : 'މިނިޓެއް',
+ mm : 'މިނިޓު %d',
+ h : 'ގަޑިއިރެއް',
+ hh : 'ގަޑިއިރު %d',
+ d : 'ދުވަހެއް',
+ dd : 'ދުވަސް %d',
+ M : 'މަހެއް',
+ MM : 'މަސް %d',
+ y : 'އަހަރެއް',
+ yy : 'އަހަރު %d'
+ },
+ preparse: function (string) {
+ return string.replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/,/g, '،');
+ },
+ week : {
+ dow : 7, // Sunday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return dv;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/el.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/el.js
new file mode 100644
index 00000000000..8396665ce76
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/el.js
@@ -0,0 +1,98 @@
+//! moment.js locale configuration
+//! locale : Greek [el]
+//! author : Aggelos Karalias : https://github.com/mehiel
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function isFunction(input) {
+ return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';
+}
+
+
+var el = moment.defineLocale('el', {
+ monthsNominativeEl : 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'),
+ monthsGenitiveEl : 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'),
+ months : function (momentToFormat, format) {
+ if (/D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM'
+ return this._monthsGenitiveEl[momentToFormat.month()];
+ } else {
+ return this._monthsNominativeEl[momentToFormat.month()];
+ }
+ },
+ monthsShort : 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'),
+ weekdays : 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split('_'),
+ weekdaysShort : 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'),
+ weekdaysMin : 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'),
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'μμ' : 'ΜΜ';
+ } else {
+ return isLower ? 'πμ' : 'ΠΜ';
+ }
+ },
+ isPM : function (input) {
+ return ((input + '').toLowerCase()[0] === 'μ');
+ },
+ meridiemParse : /[ΠΜ]\.?Μ?\.?/i,
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendarEl : {
+ sameDay : '[Σήμερα {}] LT',
+ nextDay : '[Αύριο {}] LT',
+ nextWeek : 'dddd [{}] LT',
+ lastDay : '[Χθες {}] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 6:
+ return '[το προηγούμενο] dddd [{}] LT';
+ default:
+ return '[την προηγούμενη] dddd [{}] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ calendar : function (key, mom) {
+ var output = this._calendarEl[key],
+ hours = mom && mom.hours();
+ if (isFunction(output)) {
+ output = output.apply(mom);
+ }
+ return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις'));
+ },
+ relativeTime : {
+ future : 'σε %s',
+ past : '%s πριν',
+ s : 'λίγα δευτερόλεπτα',
+ m : 'ένα λεπτό',
+ mm : '%d λεπτά',
+ h : 'μία ώρα',
+ hh : '%d ώρες',
+ d : 'μία μέρα',
+ dd : '%d μέρες',
+ M : 'ένας μήνας',
+ MM : '%d μήνες',
+ y : 'ένας χρόνος',
+ yy : '%d χρόνια'
+ },
+ ordinalParse: /\d{1,2}η/,
+ ordinal: '%dη',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4st is the first week of the year.
+ }
+});
+
+return el;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/en-au.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/en-au.js
new file mode 100644
index 00000000000..d13415796e2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/en-au.js
@@ -0,0 +1,67 @@
+//! moment.js locale configuration
+//! locale : English (Australia) [en-au]
+//! author : Jared Morse : https://github.com/jarcoal
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var enAu = moment.defineLocale('en-au', {
+ months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+ weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+ weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+ weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return enAu;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/en-ca.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/en-ca.js
new file mode 100644
index 00000000000..358b1837a2e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/en-ca.js
@@ -0,0 +1,63 @@
+//! moment.js locale configuration
+//! locale : English (Canada) [en-ca]
+//! author : Jonathan Abourbih : https://github.com/jonbca
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var enCa = moment.defineLocale('en-ca', {
+ months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+ weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+ weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+ weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'YYYY-MM-DD',
+ LL : 'MMMM D, YYYY',
+ LLL : 'MMMM D, YYYY h:mm A',
+ LLLL : 'dddd, MMMM D, YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ }
+});
+
+return enCa;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/en-gb.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/en-gb.js
new file mode 100644
index 00000000000..ed382905f35
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/en-gb.js
@@ -0,0 +1,67 @@
+//! moment.js locale configuration
+//! locale : English (United Kingdom) [en-gb]
+//! author : Chris Gedrim : https://github.com/chrisgedrim
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var enGb = moment.defineLocale('en-gb', {
+ months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+ weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+ weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+ weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return enGb;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/en-ie.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/en-ie.js
new file mode 100644
index 00000000000..54c3065ebe7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/en-ie.js
@@ -0,0 +1,67 @@
+//! moment.js locale configuration
+//! locale : English (Ireland) [en-ie]
+//! author : Chris Cartlidge : https://github.com/chriscartlidge
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var enIe = moment.defineLocale('en-ie', {
+ months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+ weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+ weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+ weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD-MM-YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return enIe;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/en-nz.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/en-nz.js
new file mode 100644
index 00000000000..c6c60302c65
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/en-nz.js
@@ -0,0 +1,67 @@
+//! moment.js locale configuration
+//! locale : English (New Zealand) [en-nz]
+//! author : Luke McGregor : https://github.com/lukemcgregor
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var enNz = moment.defineLocale('en-nz', {
+ months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+ weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+ weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+ weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return enNz;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/eo.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/eo.js
new file mode 100644
index 00000000000..75193181b91
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/eo.js
@@ -0,0 +1,73 @@
+//! moment.js locale configuration
+//! locale : Esperanto [eo]
+//! author : Colin Dean : https://github.com/colindean
+//! komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
+//! Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var eo = moment.defineLocale('eo', {
+ months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'),
+ weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato'.split('_'),
+ weekdaysShort : 'Dim_Lun_Mard_Merk_Ĵaŭ_Ven_Sab'.split('_'),
+ weekdaysMin : 'Di_Lu_Ma_Me_Ĵa_Ve_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'YYYY-MM-DD',
+ LL : 'D[-an de] MMMM, YYYY',
+ LLL : 'D[-an de] MMMM, YYYY HH:mm',
+ LLLL : 'dddd, [la] D[-an de] MMMM, YYYY HH:mm'
+ },
+ meridiemParse: /[ap]\.t\.m/i,
+ isPM: function (input) {
+ return input.charAt(0).toLowerCase() === 'p';
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'p.t.m.' : 'P.T.M.';
+ } else {
+ return isLower ? 'a.t.m.' : 'A.T.M.';
+ }
+ },
+ calendar : {
+ sameDay : '[Hodiaŭ je] LT',
+ nextDay : '[Morgaŭ je] LT',
+ nextWeek : 'dddd [je] LT',
+ lastDay : '[Hieraŭ je] LT',
+ lastWeek : '[pasinta] dddd [je] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'je %s',
+ past : 'antaŭ %s',
+ s : 'sekundoj',
+ m : 'minuto',
+ mm : '%d minutoj',
+ h : 'horo',
+ hh : '%d horoj',
+ d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo
+ dd : '%d tagoj',
+ M : 'monato',
+ MM : '%d monatoj',
+ y : 'jaro',
+ yy : '%d jaroj'
+ },
+ ordinalParse: /\d{1,2}a/,
+ ordinal : '%da',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return eo;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/es-do.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/es-do.js
new file mode 100644
index 00000000000..e86282ad0cd
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/es-do.js
@@ -0,0 +1,80 @@
+//! moment.js locale configuration
+//! locale : Spanish (Dominican Republic) [es-do]
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_');
+var monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');
+
+var esDo = moment.defineLocale('es-do', {
+ months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShort[m.month()];
+ } else {
+ return monthsShortDot[m.month()];
+ }
+ },
+ monthsParseExact : true,
+ weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
+ weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
+ weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D [de] MMMM [de] YYYY',
+ LLL : 'D [de] MMMM [de] YYYY h:mm A',
+ LLLL : 'dddd, D [de] MMMM [de] YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : function () {
+ return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ nextDay : function () {
+ return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ lastDay : function () {
+ return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ lastWeek : function () {
+ return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'en %s',
+ past : 'hace %s',
+ s : 'unos segundos',
+ m : 'un minuto',
+ mm : '%d minutos',
+ h : 'una hora',
+ hh : '%d horas',
+ d : 'un día',
+ dd : '%d días',
+ M : 'un mes',
+ MM : '%d meses',
+ y : 'un año',
+ yy : '%d años'
+ },
+ ordinalParse : /\d{1,2}º/,
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return esDo;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/es.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/es.js
new file mode 100644
index 00000000000..eb9e0809dfe
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/es.js
@@ -0,0 +1,81 @@
+//! moment.js locale configuration
+//! locale : Spanish [es]
+//! author : Julio Napurí : https://github.com/julionc
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_');
+var monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');
+
+var es = moment.defineLocale('es', {
+ months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShort[m.month()];
+ } else {
+ return monthsShortDot[m.month()];
+ }
+ },
+ monthsParseExact : true,
+ weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
+ weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
+ weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D [de] MMMM [de] YYYY',
+ LLL : 'D [de] MMMM [de] YYYY H:mm',
+ LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm'
+ },
+ calendar : {
+ sameDay : function () {
+ return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ nextDay : function () {
+ return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ lastDay : function () {
+ return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ lastWeek : function () {
+ return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'en %s',
+ past : 'hace %s',
+ s : 'unos segundos',
+ m : 'un minuto',
+ mm : '%d minutos',
+ h : 'una hora',
+ hh : '%d horas',
+ d : 'un día',
+ dd : '%d días',
+ M : 'un mes',
+ MM : '%d meses',
+ y : 'un año',
+ yy : '%d años'
+ },
+ ordinalParse : /\d{1,2}º/,
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return es;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/et.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/et.js
new file mode 100644
index 00000000000..dc40ac5044a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/et.js
@@ -0,0 +1,80 @@
+//! moment.js locale configuration
+//! locale : Estonian [et]
+//! author : Henry Kehlmann : https://github.com/madhenry
+//! improvements : Illimar Tambek : https://github.com/ragulka
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+function processRelativeTime(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'],
+ 'm' : ['ühe minuti', 'üks minut'],
+ 'mm': [number + ' minuti', number + ' minutit'],
+ 'h' : ['ühe tunni', 'tund aega', 'üks tund'],
+ 'hh': [number + ' tunni', number + ' tundi'],
+ 'd' : ['ühe päeva', 'üks päev'],
+ 'M' : ['kuu aja', 'kuu aega', 'üks kuu'],
+ 'MM': [number + ' kuu', number + ' kuud'],
+ 'y' : ['ühe aasta', 'aasta', 'üks aasta'],
+ 'yy': [number + ' aasta', number + ' aastat']
+ };
+ if (withoutSuffix) {
+ return format[key][2] ? format[key][2] : format[key][1];
+ }
+ return isFuture ? format[key][0] : format[key][1];
+}
+
+var et = moment.defineLocale('et', {
+ months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'),
+ monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),
+ weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'),
+ weekdaysShort : 'P_E_T_K_N_R_L'.split('_'),
+ weekdaysMin : 'P_E_T_K_N_R_L'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[Täna,] LT',
+ nextDay : '[Homme,] LT',
+ nextWeek : '[Järgmine] dddd LT',
+ lastDay : '[Eile,] LT',
+ lastWeek : '[Eelmine] dddd LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s pärast',
+ past : '%s tagasi',
+ s : processRelativeTime,
+ m : processRelativeTime,
+ mm : processRelativeTime,
+ h : processRelativeTime,
+ hh : processRelativeTime,
+ d : processRelativeTime,
+ dd : '%d päeva',
+ M : processRelativeTime,
+ MM : processRelativeTime,
+ y : processRelativeTime,
+ yy : processRelativeTime
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return et;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/eu.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/eu.js
new file mode 100644
index 00000000000..7db2443b70a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/eu.js
@@ -0,0 +1,66 @@
+//! moment.js locale configuration
+//! locale : Basque [eu]
+//! author : Eneko Illarramendi : https://github.com/eillarra
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var eu = moment.defineLocale('eu', {
+ months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'),
+ monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'),
+ weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'),
+ weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'YYYY-MM-DD',
+ LL : 'YYYY[ko] MMMM[ren] D[a]',
+ LLL : 'YYYY[ko] MMMM[ren] D[a] HH:mm',
+ LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm',
+ l : 'YYYY-M-D',
+ ll : 'YYYY[ko] MMM D[a]',
+ lll : 'YYYY[ko] MMM D[a] HH:mm',
+ llll : 'ddd, YYYY[ko] MMM D[a] HH:mm'
+ },
+ calendar : {
+ sameDay : '[gaur] LT[etan]',
+ nextDay : '[bihar] LT[etan]',
+ nextWeek : 'dddd LT[etan]',
+ lastDay : '[atzo] LT[etan]',
+ lastWeek : '[aurreko] dddd LT[etan]',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s barru',
+ past : 'duela %s',
+ s : 'segundo batzuk',
+ m : 'minutu bat',
+ mm : '%d minutu',
+ h : 'ordu bat',
+ hh : '%d ordu',
+ d : 'egun bat',
+ dd : '%d egun',
+ M : 'hilabete bat',
+ MM : '%d hilabete',
+ y : 'urte bat',
+ yy : '%d urte'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return eu;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fa.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fa.js
new file mode 100644
index 00000000000..7743b4f4f5a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fa.js
@@ -0,0 +1,107 @@
+//! moment.js locale configuration
+//! locale : Persian [fa]
+//! author : Ebrahim Byagowi : https://github.com/ebraminio
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var symbolMap = {
+ '1': '۱',
+ '2': '۲',
+ '3': '۳',
+ '4': '۴',
+ '5': '۵',
+ '6': '۶',
+ '7': '۷',
+ '8': '۸',
+ '9': '۹',
+ '0': '۰'
+};
+var numberMap = {
+ '۱': '1',
+ '۲': '2',
+ '۳': '3',
+ '۴': '4',
+ '۵': '5',
+ '۶': '6',
+ '۷': '7',
+ '۸': '8',
+ '۹': '9',
+ '۰': '0'
+};
+
+var fa = moment.defineLocale('fa', {
+ months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+ monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+ weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
+ weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
+ weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /قبل از ظهر|بعد از ظهر/,
+ isPM: function (input) {
+ return /بعد از ظهر/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'قبل از ظهر';
+ } else {
+ return 'بعد از ظهر';
+ }
+ },
+ calendar : {
+ sameDay : '[امروز ساعت] LT',
+ nextDay : '[فردا ساعت] LT',
+ nextWeek : 'dddd [ساعت] LT',
+ lastDay : '[دیروز ساعت] LT',
+ lastWeek : 'dddd [پیش] [ساعت] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'در %s',
+ past : '%s پیش',
+ s : 'چندین ثانیه',
+ m : 'یک دقیقه',
+ mm : '%d دقیقه',
+ h : 'یک ساعت',
+ hh : '%d ساعت',
+ d : 'یک روز',
+ dd : '%d روز',
+ M : 'یک ماه',
+ MM : '%d ماه',
+ y : 'یک سال',
+ yy : '%d سال'
+ },
+ preparse: function (string) {
+ return string.replace(/[۰-۹]/g, function (match) {
+ return numberMap[match];
+ }).replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ }).replace(/,/g, '،');
+ },
+ ordinalParse: /\d{1,2}م/,
+ ordinal : '%dم',
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return fa;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fi.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fi.js
new file mode 100644
index 00000000000..4cbe4eec6d3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fi.js
@@ -0,0 +1,107 @@
+//! moment.js locale configuration
+//! locale : Finnish [fi]
+//! author : Tarmo Aidantausta : https://github.com/bleadof
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' ');
+var numbersFuture = [
+ 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden',
+ numbersPast[7], numbersPast[8], numbersPast[9]
+ ];
+function translate(number, withoutSuffix, key, isFuture) {
+ var result = '';
+ switch (key) {
+ case 's':
+ return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
+ case 'm':
+ return isFuture ? 'minuutin' : 'minuutti';
+ case 'mm':
+ result = isFuture ? 'minuutin' : 'minuuttia';
+ break;
+ case 'h':
+ return isFuture ? 'tunnin' : 'tunti';
+ case 'hh':
+ result = isFuture ? 'tunnin' : 'tuntia';
+ break;
+ case 'd':
+ return isFuture ? 'päivän' : 'päivä';
+ case 'dd':
+ result = isFuture ? 'päivän' : 'päivää';
+ break;
+ case 'M':
+ return isFuture ? 'kuukauden' : 'kuukausi';
+ case 'MM':
+ result = isFuture ? 'kuukauden' : 'kuukautta';
+ break;
+ case 'y':
+ return isFuture ? 'vuoden' : 'vuosi';
+ case 'yy':
+ result = isFuture ? 'vuoden' : 'vuotta';
+ break;
+ }
+ result = verbalNumber(number, isFuture) + ' ' + result;
+ return result;
+}
+function verbalNumber(number, isFuture) {
+ return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number;
+}
+
+var fi = moment.defineLocale('fi', {
+ months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'),
+ monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'),
+ weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'),
+ weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'),
+ weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD.MM.YYYY',
+ LL : 'Do MMMM[ta] YYYY',
+ LLL : 'Do MMMM[ta] YYYY, [klo] HH.mm',
+ LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm',
+ l : 'D.M.YYYY',
+ ll : 'Do MMM YYYY',
+ lll : 'Do MMM YYYY, [klo] HH.mm',
+ llll : 'ddd, Do MMM YYYY, [klo] HH.mm'
+ },
+ calendar : {
+ sameDay : '[tänään] [klo] LT',
+ nextDay : '[huomenna] [klo] LT',
+ nextWeek : 'dddd [klo] LT',
+ lastDay : '[eilen] [klo] LT',
+ lastWeek : '[viime] dddd[na] [klo] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s päästä',
+ past : '%s sitten',
+ s : translate,
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : translate,
+ dd : translate,
+ M : translate,
+ MM : translate,
+ y : translate,
+ yy : translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return fi;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fo.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fo.js
new file mode 100644
index 00000000000..344ab5eed4d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fo.js
@@ -0,0 +1,60 @@
+//! moment.js locale configuration
+//! locale : Faroese [fo]
+//! author : Ragnar Johannesen : https://github.com/ragnar123
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var fo = moment.defineLocale('fo', {
+ months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
+ weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'),
+ weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'),
+ weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D. MMMM, YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Í dag kl.] LT',
+ nextDay : '[Í morgin kl.] LT',
+ nextWeek : 'dddd [kl.] LT',
+ lastDay : '[Í gjár kl.] LT',
+ lastWeek : '[síðstu] dddd [kl] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'um %s',
+ past : '%s síðani',
+ s : 'fá sekund',
+ m : 'ein minutt',
+ mm : '%d minuttir',
+ h : 'ein tími',
+ hh : '%d tímar',
+ d : 'ein dagur',
+ dd : '%d dagar',
+ M : 'ein mánaði',
+ MM : '%d mánaðir',
+ y : 'eitt ár',
+ yy : '%d ár'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return fo;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fr-ca.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fr-ca.js
new file mode 100644
index 00000000000..9aada335e3d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fr-ca.js
@@ -0,0 +1,60 @@
+//! moment.js locale configuration
+//! locale : French (Canada) [fr-ca]
+//! author : Jonathan Abourbih : https://github.com/jonbca
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var frCa = moment.defineLocale('fr-ca', {
+ months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
+ monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
+ weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
+ weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'YYYY-MM-DD',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Aujourd\'hui à] LT',
+ nextDay: '[Demain à] LT',
+ nextWeek: 'dddd [à] LT',
+ lastDay: '[Hier à] LT',
+ lastWeek: 'dddd [dernier à] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'dans %s',
+ past : 'il y a %s',
+ s : 'quelques secondes',
+ m : 'une minute',
+ mm : '%d minutes',
+ h : 'une heure',
+ hh : '%d heures',
+ d : 'un jour',
+ dd : '%d jours',
+ M : 'un mois',
+ MM : '%d mois',
+ y : 'un an',
+ yy : '%d ans'
+ },
+ ordinalParse: /\d{1,2}(er|e)/,
+ ordinal : function (number) {
+ return number + (number === 1 ? 'er' : 'e');
+ }
+});
+
+return frCa;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fr-ch.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fr-ch.js
new file mode 100644
index 00000000000..aade5acbe91
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fr-ch.js
@@ -0,0 +1,64 @@
+//! moment.js locale configuration
+//! locale : French (Switzerland) [fr-ch]
+//! author : Gaspard Bucher : https://github.com/gaspard
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var frCh = moment.defineLocale('fr-ch', {
+ months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
+ monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
+ weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
+ weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Aujourd\'hui à] LT',
+ nextDay: '[Demain à] LT',
+ nextWeek: 'dddd [à] LT',
+ lastDay: '[Hier à] LT',
+ lastWeek: 'dddd [dernier à] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'dans %s',
+ past : 'il y a %s',
+ s : 'quelques secondes',
+ m : 'une minute',
+ mm : '%d minutes',
+ h : 'une heure',
+ hh : '%d heures',
+ d : 'un jour',
+ dd : '%d jours',
+ M : 'un mois',
+ MM : '%d mois',
+ y : 'un an',
+ yy : '%d ans'
+ },
+ ordinalParse: /\d{1,2}(er|e)/,
+ ordinal : function (number) {
+ return number + (number === 1 ? 'er' : 'e');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return frCh;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fr.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fr.js
new file mode 100644
index 00000000000..8079ee755ad
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fr.js
@@ -0,0 +1,64 @@
+//! moment.js locale configuration
+//! locale : French [fr]
+//! author : John Fischer : https://github.com/jfroffice
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var fr = moment.defineLocale('fr', {
+ months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
+ monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
+ weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
+ weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Aujourd\'hui à] LT',
+ nextDay: '[Demain à] LT',
+ nextWeek: 'dddd [à] LT',
+ lastDay: '[Hier à] LT',
+ lastWeek: 'dddd [dernier à] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'dans %s',
+ past : 'il y a %s',
+ s : 'quelques secondes',
+ m : 'une minute',
+ mm : '%d minutes',
+ h : 'une heure',
+ hh : '%d heures',
+ d : 'un jour',
+ dd : '%d jours',
+ M : 'un mois',
+ MM : '%d mois',
+ y : 'un an',
+ yy : '%d ans'
+ },
+ ordinalParse: /\d{1,2}(er|)/,
+ ordinal : function (number) {
+ return number + (number === 1 ? 'er' : '');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return fr;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fy.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fy.js
new file mode 100644
index 00000000000..13a32d80eed
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/fy.js
@@ -0,0 +1,73 @@
+//! moment.js locale configuration
+//! locale : Frisian [fy]
+//! author : Robin van der Vliet : https://github.com/robin0van0der0v
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_');
+var monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_');
+
+var fy = moment.defineLocale('fy', {
+ months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShortWithoutDots[m.month()];
+ } else {
+ return monthsShortWithDots[m.month()];
+ }
+ },
+ monthsParseExact : true,
+ weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'),
+ weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'),
+ weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD-MM-YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[hjoed om] LT',
+ nextDay: '[moarn om] LT',
+ nextWeek: 'dddd [om] LT',
+ lastDay: '[juster om] LT',
+ lastWeek: '[ôfrûne] dddd [om] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'oer %s',
+ past : '%s lyn',
+ s : 'in pear sekonden',
+ m : 'ien minút',
+ mm : '%d minuten',
+ h : 'ien oere',
+ hh : '%d oeren',
+ d : 'ien dei',
+ dd : '%d dagen',
+ M : 'ien moanne',
+ MM : '%d moannen',
+ y : 'ien jier',
+ yy : '%d jierren'
+ },
+ ordinalParse: /\d{1,2}(ste|de)/,
+ ordinal : function (number) {
+ return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return fy;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/gd.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/gd.js
new file mode 100644
index 00000000000..542005e14b5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/gd.js
@@ -0,0 +1,76 @@
+//! moment.js locale configuration
+//! locale : Scottish Gaelic [gd]
+//! author : Jon Ashdown : https://github.com/jonashdown
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var months = [
+ 'Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd'
+];
+
+var monthsShort = ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh'];
+
+var weekdays = ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne'];
+
+var weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis'];
+
+var weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa'];
+
+var gd = moment.defineLocale('gd', {
+ months : months,
+ monthsShort : monthsShort,
+ monthsParseExact : true,
+ weekdays : weekdays,
+ weekdaysShort : weekdaysShort,
+ weekdaysMin : weekdaysMin,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[An-diugh aig] LT',
+ nextDay : '[A-màireach aig] LT',
+ nextWeek : 'dddd [aig] LT',
+ lastDay : '[An-dè aig] LT',
+ lastWeek : 'dddd [seo chaidh] [aig] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'ann an %s',
+ past : 'bho chionn %s',
+ s : 'beagan diogan',
+ m : 'mionaid',
+ mm : '%d mionaidean',
+ h : 'uair',
+ hh : '%d uairean',
+ d : 'latha',
+ dd : '%d latha',
+ M : 'mìos',
+ MM : '%d mìosan',
+ y : 'bliadhna',
+ yy : '%d bliadhna'
+ },
+ ordinalParse : /\d{1,2}(d|na|mh)/,
+ ordinal : function (number) {
+ var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return gd;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/gl.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/gl.js
new file mode 100644
index 00000000000..205819eea18
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/gl.js
@@ -0,0 +1,77 @@
+//! moment.js locale configuration
+//! locale : Galician [gl]
+//! author : Juan G. Hurtado : https://github.com/juanghurtado
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var gl = moment.defineLocale('gl', {
+ months : 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split('_'),
+ monthsShort : 'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'),
+ weekdaysShort : 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'),
+ weekdaysMin : 'do_lu_ma_mé_xo_ve_sá'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D [de] MMMM [de] YYYY',
+ LLL : 'D [de] MMMM [de] YYYY H:mm',
+ LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm'
+ },
+ calendar : {
+ sameDay : function () {
+ return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
+ },
+ nextDay : function () {
+ return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
+ },
+ lastDay : function () {
+ return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT';
+ },
+ lastWeek : function () {
+ return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : function (str) {
+ if (str.indexOf('un') === 0) {
+ return 'n' + str;
+ }
+ return 'en ' + str;
+ },
+ past : 'hai %s',
+ s : 'uns segundos',
+ m : 'un minuto',
+ mm : '%d minutos',
+ h : 'unha hora',
+ hh : '%d horas',
+ d : 'un día',
+ dd : '%d días',
+ M : 'un mes',
+ MM : '%d meses',
+ y : 'un ano',
+ yy : '%d anos'
+ },
+ ordinalParse : /\d{1,2}º/,
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return gl;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/he.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/he.js
new file mode 100644
index 00000000000..e884381105b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/he.js
@@ -0,0 +1,99 @@
+//! moment.js locale configuration
+//! locale : Hebrew [he]
+//! author : Tomer Cohen : https://github.com/tomer
+//! author : Moshe Simantov : https://github.com/DevelopmentIL
+//! author : Tal Ater : https://github.com/TalAter
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var he = moment.defineLocale('he', {
+ months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'),
+ monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),
+ weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),
+ weekdaysShort : 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'),
+ weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D [ב]MMMM YYYY',
+ LLL : 'D [ב]MMMM YYYY HH:mm',
+ LLLL : 'dddd, D [ב]MMMM YYYY HH:mm',
+ l : 'D/M/YYYY',
+ ll : 'D MMM YYYY',
+ lll : 'D MMM YYYY HH:mm',
+ llll : 'ddd, D MMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[היום ב־]LT',
+ nextDay : '[מחר ב־]LT',
+ nextWeek : 'dddd [בשעה] LT',
+ lastDay : '[אתמול ב־]LT',
+ lastWeek : '[ביום] dddd [האחרון בשעה] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'בעוד %s',
+ past : 'לפני %s',
+ s : 'מספר שניות',
+ m : 'דקה',
+ mm : '%d דקות',
+ h : 'שעה',
+ hh : function (number) {
+ if (number === 2) {
+ return 'שעתיים';
+ }
+ return number + ' שעות';
+ },
+ d : 'יום',
+ dd : function (number) {
+ if (number === 2) {
+ return 'יומיים';
+ }
+ return number + ' ימים';
+ },
+ M : 'חודש',
+ MM : function (number) {
+ if (number === 2) {
+ return 'חודשיים';
+ }
+ return number + ' חודשים';
+ },
+ y : 'שנה',
+ yy : function (number) {
+ if (number === 2) {
+ return 'שנתיים';
+ } else if (number % 10 === 0 && number !== 10) {
+ return number + ' שנה';
+ }
+ return number + ' שנים';
+ }
+ },
+ meridiemParse: /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,
+ isPM : function (input) {
+ return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 5) {
+ return 'לפנות בוקר';
+ } else if (hour < 10) {
+ return 'בבוקר';
+ } else if (hour < 12) {
+ return isLower ? 'לפנה"צ' : 'לפני הצהריים';
+ } else if (hour < 18) {
+ return isLower ? 'אחה"צ' : 'אחרי הצהריים';
+ } else {
+ return 'בערב';
+ }
+ }
+});
+
+return he;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/hi.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/hi.js
new file mode 100644
index 00000000000..58afc6b1dd0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/hi.js
@@ -0,0 +1,124 @@
+//! moment.js locale configuration
+//! locale : Hindi [hi]
+//! author : Mayank Singhal : https://github.com/mayanksinghal
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var symbolMap = {
+ '1': '१',
+ '2': '२',
+ '3': '३',
+ '4': '४',
+ '5': '५',
+ '6': '६',
+ '7': '७',
+ '8': '८',
+ '9': '९',
+ '0': '०'
+};
+var numberMap = {
+ '१': '1',
+ '२': '2',
+ '३': '3',
+ '४': '4',
+ '५': '5',
+ '६': '6',
+ '७': '7',
+ '८': '8',
+ '९': '9',
+ '०': '0'
+};
+
+var hi = moment.defineLocale('hi', {
+ months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'),
+ monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
+ weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'),
+ weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm बजे',
+ LTS : 'A h:mm:ss बजे',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm बजे',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm बजे'
+ },
+ calendar : {
+ sameDay : '[आज] LT',
+ nextDay : '[कल] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[कल] LT',
+ lastWeek : '[पिछले] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s में',
+ past : '%s पहले',
+ s : 'कुछ ही क्षण',
+ m : 'एक मिनट',
+ mm : '%d मिनट',
+ h : 'एक घंटा',
+ hh : '%d घंटे',
+ d : 'एक दिन',
+ dd : '%d दिन',
+ M : 'एक महीने',
+ MM : '%d महीने',
+ y : 'एक वर्ष',
+ yy : '%d वर्ष'
+ },
+ preparse: function (string) {
+ return string.replace(/[१२३४५६७८९०]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ // Hindi notation for meridiems are quite fuzzy in practice. While there exists
+ // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
+ meridiemParse: /रात|सुबह|दोपहर|शाम/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'रात') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'सुबह') {
+ return hour;
+ } else if (meridiem === 'दोपहर') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'शाम') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'रात';
+ } else if (hour < 10) {
+ return 'सुबह';
+ } else if (hour < 17) {
+ return 'दोपहर';
+ } else if (hour < 20) {
+ return 'शाम';
+ } else {
+ return 'रात';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return hi;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/hr.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/hr.js
new file mode 100644
index 00000000000..c2e04e61db8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/hr.js
@@ -0,0 +1,145 @@
+//! moment.js locale configuration
+//! locale : Croatian [hr]
+//! author : Bojan Marković : https://github.com/bmarkovic
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+function translate(number, withoutSuffix, key) {
+ var result = number + ' ';
+ switch (key) {
+ case 'm':
+ return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+ case 'mm':
+ if (number === 1) {
+ result += 'minuta';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'minute';
+ } else {
+ result += 'minuta';
+ }
+ return result;
+ case 'h':
+ return withoutSuffix ? 'jedan sat' : 'jednog sata';
+ case 'hh':
+ if (number === 1) {
+ result += 'sat';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'sata';
+ } else {
+ result += 'sati';
+ }
+ return result;
+ case 'dd':
+ if (number === 1) {
+ result += 'dan';
+ } else {
+ result += 'dana';
+ }
+ return result;
+ case 'MM':
+ if (number === 1) {
+ result += 'mjesec';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'mjeseca';
+ } else {
+ result += 'mjeseci';
+ }
+ return result;
+ case 'yy':
+ if (number === 1) {
+ result += 'godina';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'godine';
+ } else {
+ result += 'godina';
+ }
+ return result;
+ }
+}
+
+var hr = moment.defineLocale('hr', {
+ months : {
+ format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_'),
+ standalone: 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_')
+ },
+ monthsShort : 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
+ weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
+ weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[danas u] LT',
+ nextDay : '[sutra u] LT',
+ nextWeek : function () {
+ switch (this.day()) {
+ case 0:
+ return '[u] [nedjelju] [u] LT';
+ case 3:
+ return '[u] [srijedu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ },
+ lastDay : '[jučer u] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ return '[prošlu] dddd [u] LT';
+ case 6:
+ return '[prošle] [subote] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[prošli] dddd [u] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'prije %s',
+ s : 'par sekundi',
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : 'dan',
+ dd : translate,
+ M : 'mjesec',
+ MM : translate,
+ y : 'godinu',
+ yy : translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return hr;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/hu.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/hu.js
new file mode 100644
index 00000000000..c81036b2a83
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/hu.js
@@ -0,0 +1,109 @@
+//! moment.js locale configuration
+//! locale : Hungarian [hu]
+//! author : Adam Brunner : https://github.com/adambrunner
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
+function translate(number, withoutSuffix, key, isFuture) {
+ var num = number,
+ suffix;
+ switch (key) {
+ case 's':
+ return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce';
+ case 'm':
+ return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
+ case 'mm':
+ return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
+ case 'h':
+ return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
+ case 'hh':
+ return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
+ case 'd':
+ return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
+ case 'dd':
+ return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
+ case 'M':
+ return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+ case 'MM':
+ return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+ case 'y':
+ return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
+ case 'yy':
+ return num + (isFuture || withoutSuffix ? ' év' : ' éve');
+ }
+ return '';
+}
+function week(isFuture) {
+ return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]';
+}
+
+var hu = moment.defineLocale('hu', {
+ months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'),
+ monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'),
+ weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'),
+ weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'),
+ weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'YYYY.MM.DD.',
+ LL : 'YYYY. MMMM D.',
+ LLL : 'YYYY. MMMM D. H:mm',
+ LLLL : 'YYYY. MMMM D., dddd H:mm'
+ },
+ meridiemParse: /de|du/i,
+ isPM: function (input) {
+ return input.charAt(1).toLowerCase() === 'u';
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 12) {
+ return isLower === true ? 'de' : 'DE';
+ } else {
+ return isLower === true ? 'du' : 'DU';
+ }
+ },
+ calendar : {
+ sameDay : '[ma] LT[-kor]',
+ nextDay : '[holnap] LT[-kor]',
+ nextWeek : function () {
+ return week.call(this, true);
+ },
+ lastDay : '[tegnap] LT[-kor]',
+ lastWeek : function () {
+ return week.call(this, false);
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s múlva',
+ past : '%s',
+ s : translate,
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : translate,
+ dd : translate,
+ M : translate,
+ MM : translate,
+ y : translate,
+ yy : translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return hu;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/hy-am.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/hy-am.js
new file mode 100644
index 00000000000..58045b7565b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/hy-am.js
@@ -0,0 +1,95 @@
+//! moment.js locale configuration
+//! locale : Armenian [hy-am]
+//! author : Armendarabyan : https://github.com/armendarabyan
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var hyAm = moment.defineLocale('hy-am', {
+ months : {
+ format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'),
+ standalone: 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_')
+ },
+ monthsShort : 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'),
+ weekdays : 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'),
+ weekdaysShort : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
+ weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY թ.',
+ LLL : 'D MMMM YYYY թ., HH:mm',
+ LLLL : 'dddd, D MMMM YYYY թ., HH:mm'
+ },
+ calendar : {
+ sameDay: '[այսօր] LT',
+ nextDay: '[վաղը] LT',
+ lastDay: '[երեկ] LT',
+ nextWeek: function () {
+ return 'dddd [օրը ժամը] LT';
+ },
+ lastWeek: function () {
+ return '[անցած] dddd [օրը ժամը] LT';
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : '%s հետո',
+ past : '%s առաջ',
+ s : 'մի քանի վայրկյան',
+ m : 'րոպե',
+ mm : '%d րոպե',
+ h : 'ժամ',
+ hh : '%d ժամ',
+ d : 'օր',
+ dd : '%d օր',
+ M : 'ամիս',
+ MM : '%d ամիս',
+ y : 'տարի',
+ yy : '%d տարի'
+ },
+ meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,
+ isPM: function (input) {
+ return /^(ցերեկվա|երեկոյան)$/.test(input);
+ },
+ meridiem : function (hour) {
+ if (hour < 4) {
+ return 'գիշերվա';
+ } else if (hour < 12) {
+ return 'առավոտվա';
+ } else if (hour < 17) {
+ return 'ցերեկվա';
+ } else {
+ return 'երեկոյան';
+ }
+ },
+ ordinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/,
+ ordinal: function (number, period) {
+ switch (period) {
+ case 'DDD':
+ case 'w':
+ case 'W':
+ case 'DDDo':
+ if (number === 1) {
+ return number + '-ին';
+ }
+ return number + '-րդ';
+ default:
+ return number;
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return hyAm;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/id.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/id.js
new file mode 100644
index 00000000000..a1cfb183459
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/id.js
@@ -0,0 +1,83 @@
+//! moment.js locale configuration
+//! locale : Indonesian [id]
+//! author : Mohammad Satrio Utomo : https://github.com/tyok
+//! reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var id = moment.defineLocale('id', {
+ months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'),
+ weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),
+ weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'),
+ weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [pukul] HH.mm',
+ LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+ },
+ meridiemParse: /pagi|siang|sore|malam/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'pagi') {
+ return hour;
+ } else if (meridiem === 'siang') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'sore' || meridiem === 'malam') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'pagi';
+ } else if (hours < 15) {
+ return 'siang';
+ } else if (hours < 19) {
+ return 'sore';
+ } else {
+ return 'malam';
+ }
+ },
+ calendar : {
+ sameDay : '[Hari ini pukul] LT',
+ nextDay : '[Besok pukul] LT',
+ nextWeek : 'dddd [pukul] LT',
+ lastDay : '[Kemarin pukul] LT',
+ lastWeek : 'dddd [lalu pukul] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'dalam %s',
+ past : '%s yang lalu',
+ s : 'beberapa detik',
+ m : 'semenit',
+ mm : '%d menit',
+ h : 'sejam',
+ hh : '%d jam',
+ d : 'sehari',
+ dd : '%d hari',
+ M : 'sebulan',
+ MM : '%d bulan',
+ y : 'setahun',
+ yy : '%d tahun'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return id;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/is.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/is.js
new file mode 100644
index 00000000000..9658aab2f9d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/is.js
@@ -0,0 +1,127 @@
+//! moment.js locale configuration
+//! locale : Icelandic [is]
+//! author : Hinrik Örn Sigurðsson : https://github.com/hinrik
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+function plural(n) {
+ if (n % 100 === 11) {
+ return true;
+ } else if (n % 10 === 1) {
+ return false;
+ }
+ return true;
+}
+function translate(number, withoutSuffix, key, isFuture) {
+ var result = number + ' ';
+ switch (key) {
+ case 's':
+ return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum';
+ case 'm':
+ return withoutSuffix ? 'mínúta' : 'mínútu';
+ case 'mm':
+ if (plural(number)) {
+ return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');
+ } else if (withoutSuffix) {
+ return result + 'mínúta';
+ }
+ return result + 'mínútu';
+ case 'hh':
+ if (plural(number)) {
+ return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');
+ }
+ return result + 'klukkustund';
+ case 'd':
+ if (withoutSuffix) {
+ return 'dagur';
+ }
+ return isFuture ? 'dag' : 'degi';
+ case 'dd':
+ if (plural(number)) {
+ if (withoutSuffix) {
+ return result + 'dagar';
+ }
+ return result + (isFuture ? 'daga' : 'dögum');
+ } else if (withoutSuffix) {
+ return result + 'dagur';
+ }
+ return result + (isFuture ? 'dag' : 'degi');
+ case 'M':
+ if (withoutSuffix) {
+ return 'mánuður';
+ }
+ return isFuture ? 'mánuð' : 'mánuði';
+ case 'MM':
+ if (plural(number)) {
+ if (withoutSuffix) {
+ return result + 'mánuðir';
+ }
+ return result + (isFuture ? 'mánuði' : 'mánuðum');
+ } else if (withoutSuffix) {
+ return result + 'mánuður';
+ }
+ return result + (isFuture ? 'mánuð' : 'mánuði');
+ case 'y':
+ return withoutSuffix || isFuture ? 'ár' : 'ári';
+ case 'yy':
+ if (plural(number)) {
+ return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
+ }
+ return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
+ }
+}
+
+var is = moment.defineLocale('is', {
+ months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'),
+ weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'),
+ weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'),
+ weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY [kl.] H:mm',
+ LLLL : 'dddd, D. MMMM YYYY [kl.] H:mm'
+ },
+ calendar : {
+ sameDay : '[í dag kl.] LT',
+ nextDay : '[á morgun kl.] LT',
+ nextWeek : 'dddd [kl.] LT',
+ lastDay : '[í gær kl.] LT',
+ lastWeek : '[síðasta] dddd [kl.] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'eftir %s',
+ past : 'fyrir %s síðan',
+ s : translate,
+ m : translate,
+ mm : translate,
+ h : 'klukkustund',
+ hh : translate,
+ d : translate,
+ dd : translate,
+ M : translate,
+ MM : translate,
+ y : translate,
+ yy : translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return is;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/it.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/it.js
new file mode 100644
index 00000000000..d5ddf18e83c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/it.js
@@ -0,0 +1,70 @@
+//! moment.js locale configuration
+//! locale : Italian [it]
+//! author : Lorenzo : https://github.com/aliem
+//! author: Mattia Larentis: https://github.com/nostalgiaz
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var it = moment.defineLocale('it', {
+ months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'),
+ monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
+ weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'),
+ weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'),
+ weekdaysMin : 'Do_Lu_Ma_Me_Gi_Ve_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Oggi alle] LT',
+ nextDay: '[Domani alle] LT',
+ nextWeek: 'dddd [alle] LT',
+ lastDay: '[Ieri alle] LT',
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[la scorsa] dddd [alle] LT';
+ default:
+ return '[lo scorso] dddd [alle] LT';
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : function (s) {
+ return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s;
+ },
+ past : '%s fa',
+ s : 'alcuni secondi',
+ m : 'un minuto',
+ mm : '%d minuti',
+ h : 'un\'ora',
+ hh : '%d ore',
+ d : 'un giorno',
+ dd : '%d giorni',
+ M : 'un mese',
+ MM : '%d mesi',
+ y : 'un anno',
+ yy : '%d anni'
+ },
+ ordinalParse : /\d{1,2}º/,
+ ordinal: '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return it;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ja.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ja.js
new file mode 100644
index 00000000000..4df51ad03cf
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ja.js
@@ -0,0 +1,76 @@
+//! moment.js locale configuration
+//! locale : Japanese [ja]
+//! author : LI Long : https://github.com/baryon
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var ja = moment.defineLocale('ja', {
+ months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+ monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+ weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),
+ weekdaysShort : '日_月_火_水_木_金_土'.split('_'),
+ weekdaysMin : '日_月_火_水_木_金_土'.split('_'),
+ longDateFormat : {
+ LT : 'Ah時m分',
+ LTS : 'Ah時m分s秒',
+ L : 'YYYY/MM/DD',
+ LL : 'YYYY年M月D日',
+ LLL : 'YYYY年M月D日Ah時m分',
+ LLLL : 'YYYY年M月D日Ah時m分 dddd'
+ },
+ meridiemParse: /午前|午後/i,
+ isPM : function (input) {
+ return input === '午後';
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return '午前';
+ } else {
+ return '午後';
+ }
+ },
+ calendar : {
+ sameDay : '[今日] LT',
+ nextDay : '[明日] LT',
+ nextWeek : '[来週]dddd LT',
+ lastDay : '[昨日] LT',
+ lastWeek : '[前週]dddd LT',
+ sameElse : 'L'
+ },
+ ordinalParse : /\d{1,2}日/,
+ ordinal : function (number, period) {
+ switch (period) {
+ case 'd':
+ case 'D':
+ case 'DDD':
+ return number + '日';
+ default:
+ return number;
+ }
+ },
+ relativeTime : {
+ future : '%s後',
+ past : '%s前',
+ s : '数秒',
+ m : '1分',
+ mm : '%d分',
+ h : '1時間',
+ hh : '%d時間',
+ d : '1日',
+ dd : '%d日',
+ M : '1ヶ月',
+ MM : '%dヶ月',
+ y : '1年',
+ yy : '%d年'
+ }
+});
+
+return ja;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/jv.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/jv.js
new file mode 100644
index 00000000000..5b939e0fcb1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/jv.js
@@ -0,0 +1,83 @@
+//! moment.js locale configuration
+//! locale : Javanese [jv]
+//! author : Rony Lantip : https://github.com/lantip
+//! reference: http://jv.wikipedia.org/wiki/Basa_Jawa
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var jv = moment.defineLocale('jv', {
+ months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'),
+ weekdays : 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'),
+ weekdaysShort : 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'),
+ weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [pukul] HH.mm',
+ LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+ },
+ meridiemParse: /enjing|siyang|sonten|ndalu/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'enjing') {
+ return hour;
+ } else if (meridiem === 'siyang') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'sonten' || meridiem === 'ndalu') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'enjing';
+ } else if (hours < 15) {
+ return 'siyang';
+ } else if (hours < 19) {
+ return 'sonten';
+ } else {
+ return 'ndalu';
+ }
+ },
+ calendar : {
+ sameDay : '[Dinten puniko pukul] LT',
+ nextDay : '[Mbenjang pukul] LT',
+ nextWeek : 'dddd [pukul] LT',
+ lastDay : '[Kala wingi pukul] LT',
+ lastWeek : 'dddd [kepengker pukul] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'wonten ing %s',
+ past : '%s ingkang kepengker',
+ s : 'sawetawis detik',
+ m : 'setunggal menit',
+ mm : '%d menit',
+ h : 'setunggal jam',
+ hh : '%d jam',
+ d : 'sedinten',
+ dd : '%d dinten',
+ M : 'sewulan',
+ MM : '%d wulan',
+ y : 'setaun',
+ yy : '%d taun'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return jv;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ka.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ka.js
new file mode 100644
index 00000000000..be866c8b6c9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ka.js
@@ -0,0 +1,89 @@
+//! moment.js locale configuration
+//! locale : Georgian [ka]
+//! author : Irakli Janiashvili : https://github.com/irakli-janiashvili
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var ka = moment.defineLocale('ka', {
+ months : {
+ standalone: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),
+ format: 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_')
+ },
+ monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),
+ weekdays : {
+ standalone: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),
+ format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_'),
+ isFormat: /(წინა|შემდეგ)/
+ },
+ weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),
+ weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[დღეს] LT[-ზე]',
+ nextDay : '[ხვალ] LT[-ზე]',
+ lastDay : '[გუშინ] LT[-ზე]',
+ nextWeek : '[შემდეგ] dddd LT[-ზე]',
+ lastWeek : '[წინა] dddd LT-ზე',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : function (s) {
+ return (/(წამი|წუთი|საათი|წელი)/).test(s) ?
+ s.replace(/ი$/, 'ში') :
+ s + 'ში';
+ },
+ past : function (s) {
+ if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) {
+ return s.replace(/(ი|ე)$/, 'ის წინ');
+ }
+ if ((/წელი/).test(s)) {
+ return s.replace(/წელი$/, 'წლის წინ');
+ }
+ },
+ s : 'რამდენიმე წამი',
+ m : 'წუთი',
+ mm : '%d წუთი',
+ h : 'საათი',
+ hh : '%d საათი',
+ d : 'დღე',
+ dd : '%d დღე',
+ M : 'თვე',
+ MM : '%d თვე',
+ y : 'წელი',
+ yy : '%d წელი'
+ },
+ ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,
+ ordinal : function (number) {
+ if (number === 0) {
+ return number;
+ }
+ if (number === 1) {
+ return number + '-ლი';
+ }
+ if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) {
+ return 'მე-' + number;
+ }
+ return number + '-ე';
+ },
+ week : {
+ dow : 1,
+ doy : 7
+ }
+});
+
+return ka;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/kk.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/kk.js
new file mode 100644
index 00000000000..94a231258a6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/kk.js
@@ -0,0 +1,87 @@
+//! moment.js locale configuration
+//! locale : Kazakh [kk]
+//! authors : Nurlan Rakhimzhanov : https://github.com/nurlan
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var suffixes = {
+ 0: '-ші',
+ 1: '-ші',
+ 2: '-ші',
+ 3: '-ші',
+ 4: '-ші',
+ 5: '-ші',
+ 6: '-шы',
+ 7: '-ші',
+ 8: '-ші',
+ 9: '-шы',
+ 10: '-шы',
+ 20: '-шы',
+ 30: '-шы',
+ 40: '-шы',
+ 50: '-ші',
+ 60: '-шы',
+ 70: '-ші',
+ 80: '-ші',
+ 90: '-шы',
+ 100: '-ші'
+};
+
+var kk = moment.defineLocale('kk', {
+ months : 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split('_'),
+ monthsShort : 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'),
+ weekdays : 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split('_'),
+ weekdaysShort : 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'),
+ weekdaysMin : 'жк_дй_сй_ср_бй_жм_сн'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Бүгін сағат] LT',
+ nextDay : '[Ертең сағат] LT',
+ nextWeek : 'dddd [сағат] LT',
+ lastDay : '[Кеше сағат] LT',
+ lastWeek : '[Өткен аптаның] dddd [сағат] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s ішінде',
+ past : '%s бұрын',
+ s : 'бірнеше секунд',
+ m : 'бір минут',
+ mm : '%d минут',
+ h : 'бір сағат',
+ hh : '%d сағат',
+ d : 'бір күн',
+ dd : '%d күн',
+ M : 'бір ай',
+ MM : '%d ай',
+ y : 'бір жыл',
+ yy : '%d жыл'
+ },
+ ordinalParse: /\d{1,2}-(ші|шы)/,
+ ordinal : function (number) {
+ var a = number % 10,
+ b = number >= 100 ? 100 : null;
+ return number + (suffixes[number] || suffixes[a] || suffixes[b]);
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return kk;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/km.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/km.js
new file mode 100644
index 00000000000..71482a7b52d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/km.js
@@ -0,0 +1,58 @@
+//! moment.js locale configuration
+//! locale : Cambodian [km]
+//! author : Kruy Vanna : https://github.com/kruyvanna
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var km = moment.defineLocale('km', {
+ months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
+ monthsShort: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
+ weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
+ weekdaysShort: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
+ weekdaysMin: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY HH:mm',
+ LLLL: 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar: {
+ sameDay: '[ថ្ងៃនេះ ម៉ោង] LT',
+ nextDay: '[ស្អែក ម៉ោង] LT',
+ nextWeek: 'dddd [ម៉ោង] LT',
+ lastDay: '[ម្សិលមិញ ម៉ោង] LT',
+ lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: '%sទៀត',
+ past: '%sមុន',
+ s: 'ប៉ុន្មានវិនាទី',
+ m: 'មួយនាទី',
+ mm: '%d នាទី',
+ h: 'មួយម៉ោង',
+ hh: '%d ម៉ោង',
+ d: 'មួយថ្ងៃ',
+ dd: '%d ថ្ងៃ',
+ M: 'មួយខែ',
+ MM: '%d ខែ',
+ y: 'មួយឆ្នាំ',
+ yy: '%d ឆ្នាំ'
+ },
+ week: {
+ dow: 1, // Monday is the first day of the week.
+ doy: 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return km;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ko.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ko.js
new file mode 100644
index 00000000000..b736583e8cc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ko.js
@@ -0,0 +1,65 @@
+//! moment.js locale configuration
+//! locale : Korean [ko]
+//! author : Kyungwook, Park : https://github.com/kyungw00k
+//! author : Jeeeyul Lee <jeeeyul@gmail.com>
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var ko = moment.defineLocale('ko', {
+ months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
+ monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
+ weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),
+ weekdaysShort : '일_월_화_수_목_금_토'.split('_'),
+ weekdaysMin : '일_월_화_수_목_금_토'.split('_'),
+ longDateFormat : {
+ LT : 'A h시 m분',
+ LTS : 'A h시 m분 s초',
+ L : 'YYYY.MM.DD',
+ LL : 'YYYY년 MMMM D일',
+ LLL : 'YYYY년 MMMM D일 A h시 m분',
+ LLLL : 'YYYY년 MMMM D일 dddd A h시 m분'
+ },
+ calendar : {
+ sameDay : '오늘 LT',
+ nextDay : '내일 LT',
+ nextWeek : 'dddd LT',
+ lastDay : '어제 LT',
+ lastWeek : '지난주 dddd LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s 후',
+ past : '%s 전',
+ s : '몇 초',
+ ss : '%d초',
+ m : '일분',
+ mm : '%d분',
+ h : '한 시간',
+ hh : '%d시간',
+ d : '하루',
+ dd : '%d일',
+ M : '한 달',
+ MM : '%d달',
+ y : '일 년',
+ yy : '%d년'
+ },
+ ordinalParse : /\d{1,2}일/,
+ ordinal : '%d일',
+ meridiemParse : /오전|오후/,
+ isPM : function (token) {
+ return token === '오후';
+ },
+ meridiem : function (hour, minute, isUpper) {
+ return hour < 12 ? '오전' : '오후';
+ }
+});
+
+return ko;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ky.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ky.js
new file mode 100644
index 00000000000..baf241813e1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ky.js
@@ -0,0 +1,88 @@
+//! moment.js locale configuration
+//! locale : Kyrgyz [ky]
+//! author : Chyngyz Arystan uulu : https://github.com/chyngyz
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+
+var suffixes = {
+ 0: '-чү',
+ 1: '-чи',
+ 2: '-чи',
+ 3: '-чү',
+ 4: '-чү',
+ 5: '-чи',
+ 6: '-чы',
+ 7: '-чи',
+ 8: '-чи',
+ 9: '-чу',
+ 10: '-чу',
+ 20: '-чы',
+ 30: '-чу',
+ 40: '-чы',
+ 50: '-чү',
+ 60: '-чы',
+ 70: '-чи',
+ 80: '-чи',
+ 90: '-чу',
+ 100: '-чү'
+};
+
+var ky = moment.defineLocale('ky', {
+ months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
+ monthsShort : 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),
+ weekdays : 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split('_'),
+ weekdaysShort : 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'),
+ weekdaysMin : 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Бүгүн саат] LT',
+ nextDay : '[Эртең саат] LT',
+ nextWeek : 'dddd [саат] LT',
+ lastDay : '[Кече саат] LT',
+ lastWeek : '[Өткен аптанын] dddd [күнү] [саат] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s ичинде',
+ past : '%s мурун',
+ s : 'бирнече секунд',
+ m : 'бир мүнөт',
+ mm : '%d мүнөт',
+ h : 'бир саат',
+ hh : '%d саат',
+ d : 'бир күн',
+ dd : '%d күн',
+ M : 'бир ай',
+ MM : '%d ай',
+ y : 'бир жыл',
+ yy : '%d жыл'
+ },
+ ordinalParse: /\d{1,2}-(чи|чы|чү|чу)/,
+ ordinal : function (number) {
+ var a = number % 10,
+ b = number >= 100 ? 100 : null;
+ return number + (suffixes[number] || suffixes[a] || suffixes[b]);
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return ky;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/lb.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/lb.js
new file mode 100644
index 00000000000..e55d57bad1e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/lb.js
@@ -0,0 +1,137 @@
+//! moment.js locale configuration
+//! locale : Luxembourgish [lb]
+//! author : mweimerskirch : https://github.com/mweimerskirch
+//! author : David Raison : https://github.com/kwisatz
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+function processRelativeTime(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 'm': ['eng Minutt', 'enger Minutt'],
+ 'h': ['eng Stonn', 'enger Stonn'],
+ 'd': ['een Dag', 'engem Dag'],
+ 'M': ['ee Mount', 'engem Mount'],
+ 'y': ['ee Joer', 'engem Joer']
+ };
+ return withoutSuffix ? format[key][0] : format[key][1];
+}
+function processFutureTime(string) {
+ var number = string.substr(0, string.indexOf(' '));
+ if (eifelerRegelAppliesToNumber(number)) {
+ return 'a ' + string;
+ }
+ return 'an ' + string;
+}
+function processPastTime(string) {
+ var number = string.substr(0, string.indexOf(' '));
+ if (eifelerRegelAppliesToNumber(number)) {
+ return 'viru ' + string;
+ }
+ return 'virun ' + string;
+}
+/**
+ * Returns true if the word before the given number loses the '-n' ending.
+ * e.g. 'an 10 Deeg' but 'a 5 Deeg'
+ *
+ * @param number {integer}
+ * @returns {boolean}
+ */
+function eifelerRegelAppliesToNumber(number) {
+ number = parseInt(number, 10);
+ if (isNaN(number)) {
+ return false;
+ }
+ if (number < 0) {
+ // Negative Number --> always true
+ return true;
+ } else if (number < 10) {
+ // Only 1 digit
+ if (4 <= number && number <= 7) {
+ return true;
+ }
+ return false;
+ } else if (number < 100) {
+ // 2 digits
+ var lastDigit = number % 10, firstDigit = number / 10;
+ if (lastDigit === 0) {
+ return eifelerRegelAppliesToNumber(firstDigit);
+ }
+ return eifelerRegelAppliesToNumber(lastDigit);
+ } else if (number < 10000) {
+ // 3 or 4 digits --> recursively check first digit
+ while (number >= 10) {
+ number = number / 10;
+ }
+ return eifelerRegelAppliesToNumber(number);
+ } else {
+ // Anything larger than 4 digits: recursively check first n-3 digits
+ number = number / 1000;
+ return eifelerRegelAppliesToNumber(number);
+ }
+}
+
+var lb = moment.defineLocale('lb', {
+ months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
+ monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+ monthsParseExact : true,
+ weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'),
+ weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'),
+ weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat: {
+ LT: 'H:mm [Auer]',
+ LTS: 'H:mm:ss [Auer]',
+ L: 'DD.MM.YYYY',
+ LL: 'D. MMMM YYYY',
+ LLL: 'D. MMMM YYYY H:mm [Auer]',
+ LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]'
+ },
+ calendar: {
+ sameDay: '[Haut um] LT',
+ sameElse: 'L',
+ nextDay: '[Muer um] LT',
+ nextWeek: 'dddd [um] LT',
+ lastDay: '[Gëschter um] LT',
+ lastWeek: function () {
+ // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule
+ switch (this.day()) {
+ case 2:
+ case 4:
+ return '[Leschten] dddd [um] LT';
+ default:
+ return '[Leschte] dddd [um] LT';
+ }
+ }
+ },
+ relativeTime : {
+ future : processFutureTime,
+ past : processPastTime,
+ s : 'e puer Sekonnen',
+ m : processRelativeTime,
+ mm : '%d Minutten',
+ h : processRelativeTime,
+ hh : '%d Stonnen',
+ d : processRelativeTime,
+ dd : '%d Deeg',
+ M : processRelativeTime,
+ MM : '%d Méint',
+ y : processRelativeTime,
+ yy : '%d Joer'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal: '%d.',
+ week: {
+ dow: 1, // Monday is the first day of the week.
+ doy: 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return lb;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/lo.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/lo.js
new file mode 100644
index 00000000000..27065c97b92
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/lo.js
@@ -0,0 +1,70 @@
+//! moment.js locale configuration
+//! locale : Lao [lo]
+//! author : Ryan Hart : https://github.com/ryanhart2
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var lo = moment.defineLocale('lo', {
+ months : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'),
+ monthsShort : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'),
+ weekdays : 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
+ weekdaysShort : 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
+ weekdaysMin : 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'ວັນdddd D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/,
+ isPM: function (input) {
+ return input === 'ຕອນແລງ';
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'ຕອນເຊົ້າ';
+ } else {
+ return 'ຕອນແລງ';
+ }
+ },
+ calendar : {
+ sameDay : '[ມື້ນີ້ເວລາ] LT',
+ nextDay : '[ມື້ອື່ນເວລາ] LT',
+ nextWeek : '[ວັນ]dddd[ໜ້າເວລາ] LT',
+ lastDay : '[ມື້ວານນີ້ເວລາ] LT',
+ lastWeek : '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'ອີກ %s',
+ past : '%sຜ່ານມາ',
+ s : 'ບໍ່ເທົ່າໃດວິນາທີ',
+ m : '1 ນາທີ',
+ mm : '%d ນາທີ',
+ h : '1 ຊົ່ວໂມງ',
+ hh : '%d ຊົ່ວໂມງ',
+ d : '1 ມື້',
+ dd : '%d ມື້',
+ M : '1 ເດືອນ',
+ MM : '%d ເດືອນ',
+ y : '1 ປີ',
+ yy : '%d ປີ'
+ },
+ ordinalParse: /(ທີ່)\d{1,2}/,
+ ordinal : function (number) {
+ return 'ທີ່' + number;
+ }
+});
+
+return lo;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/lt.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/lt.js
new file mode 100644
index 00000000000..37990261af1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/lt.js
@@ -0,0 +1,117 @@
+//! moment.js locale configuration
+//! locale : Lithuanian [lt]
+//! author : Mindaugas Mozūras : https://github.com/mmozuras
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var units = {
+ 'm' : 'minutė_minutės_minutę',
+ 'mm': 'minutės_minučių_minutes',
+ 'h' : 'valanda_valandos_valandą',
+ 'hh': 'valandos_valandų_valandas',
+ 'd' : 'diena_dienos_dieną',
+ 'dd': 'dienos_dienų_dienas',
+ 'M' : 'mėnuo_mėnesio_mėnesį',
+ 'MM': 'mėnesiai_mėnesių_mėnesius',
+ 'y' : 'metai_metų_metus',
+ 'yy': 'metai_metų_metus'
+};
+function translateSeconds(number, withoutSuffix, key, isFuture) {
+ if (withoutSuffix) {
+ return 'kelios sekundės';
+ } else {
+ return isFuture ? 'kelių sekundžių' : 'kelias sekundes';
+ }
+}
+function translateSingular(number, withoutSuffix, key, isFuture) {
+ return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]);
+}
+function special(number) {
+ return number % 10 === 0 || (number > 10 && number < 20);
+}
+function forms(key) {
+ return units[key].split('_');
+}
+function translate(number, withoutSuffix, key, isFuture) {
+ var result = number + ' ';
+ if (number === 1) {
+ return result + translateSingular(number, withoutSuffix, key[0], isFuture);
+ } else if (withoutSuffix) {
+ return result + (special(number) ? forms(key)[1] : forms(key)[0]);
+ } else {
+ if (isFuture) {
+ return result + forms(key)[1];
+ } else {
+ return result + (special(number) ? forms(key)[1] : forms(key)[2]);
+ }
+ }
+}
+var lt = moment.defineLocale('lt', {
+ months : {
+ format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'),
+ standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'),
+ isFormat: /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/
+ },
+ monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),
+ weekdays : {
+ format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split('_'),
+ standalone: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'),
+ isFormat: /dddd HH:mm/
+ },
+ weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'),
+ weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'YYYY-MM-DD',
+ LL : 'YYYY [m.] MMMM D [d.]',
+ LLL : 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
+ LLLL : 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]',
+ l : 'YYYY-MM-DD',
+ ll : 'YYYY [m.] MMMM D [d.]',
+ lll : 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
+ llll : 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]'
+ },
+ calendar : {
+ sameDay : '[Šiandien] LT',
+ nextDay : '[Rytoj] LT',
+ nextWeek : 'dddd LT',
+ lastDay : '[Vakar] LT',
+ lastWeek : '[Praėjusį] dddd LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'po %s',
+ past : 'prieš %s',
+ s : translateSeconds,
+ m : translateSingular,
+ mm : translate,
+ h : translateSingular,
+ hh : translate,
+ d : translateSingular,
+ dd : translate,
+ M : translateSingular,
+ MM : translate,
+ y : translateSingular,
+ yy : translate
+ },
+ ordinalParse: /\d{1,2}-oji/,
+ ordinal : function (number) {
+ return number + '-oji';
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return lt;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/lv.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/lv.js
new file mode 100644
index 00000000000..d9699119934
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/lv.js
@@ -0,0 +1,97 @@
+//! moment.js locale configuration
+//! locale : Latvian [lv]
+//! author : Kristaps Karlsons : https://github.com/skakri
+//! author : Jānis Elmeris : https://github.com/JanisE
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var units = {
+ 'm': 'minūtes_minūtēm_minūte_minūtes'.split('_'),
+ 'mm': 'minūtes_minūtēm_minūte_minūtes'.split('_'),
+ 'h': 'stundas_stundām_stunda_stundas'.split('_'),
+ 'hh': 'stundas_stundām_stunda_stundas'.split('_'),
+ 'd': 'dienas_dienām_diena_dienas'.split('_'),
+ 'dd': 'dienas_dienām_diena_dienas'.split('_'),
+ 'M': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
+ 'MM': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
+ 'y': 'gada_gadiem_gads_gadi'.split('_'),
+ 'yy': 'gada_gadiem_gads_gadi'.split('_')
+};
+/**
+ * @param withoutSuffix boolean true = a length of time; false = before/after a period of time.
+ */
+function format(forms, number, withoutSuffix) {
+ if (withoutSuffix) {
+ // E.g. "21 minūte", "3 minūtes".
+ return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3];
+ } else {
+ // E.g. "21 minūtes" as in "pēc 21 minūtes".
+ // E.g. "3 minūtēm" as in "pēc 3 minūtēm".
+ return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1];
+ }
+}
+function relativeTimeWithPlural(number, withoutSuffix, key) {
+ return number + ' ' + format(units[key], number, withoutSuffix);
+}
+function relativeTimeWithSingular(number, withoutSuffix, key) {
+ return format(units[key], number, withoutSuffix);
+}
+function relativeSeconds(number, withoutSuffix) {
+ return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm';
+}
+
+var lv = moment.defineLocale('lv', {
+ months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),
+ weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'),
+ weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'),
+ weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY.',
+ LL : 'YYYY. [gada] D. MMMM',
+ LLL : 'YYYY. [gada] D. MMMM, HH:mm',
+ LLLL : 'YYYY. [gada] D. MMMM, dddd, HH:mm'
+ },
+ calendar : {
+ sameDay : '[Šodien pulksten] LT',
+ nextDay : '[Rīt pulksten] LT',
+ nextWeek : 'dddd [pulksten] LT',
+ lastDay : '[Vakar pulksten] LT',
+ lastWeek : '[Pagājušā] dddd [pulksten] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'pēc %s',
+ past : 'pirms %s',
+ s : relativeSeconds,
+ m : relativeTimeWithSingular,
+ mm : relativeTimeWithPlural,
+ h : relativeTimeWithSingular,
+ hh : relativeTimeWithPlural,
+ d : relativeTimeWithSingular,
+ dd : relativeTimeWithPlural,
+ M : relativeTimeWithSingular,
+ MM : relativeTimeWithPlural,
+ y : relativeTimeWithSingular,
+ yy : relativeTimeWithPlural
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return lv;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/me.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/me.js
new file mode 100644
index 00000000000..292970e72d5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/me.js
@@ -0,0 +1,111 @@
+//! moment.js locale configuration
+//! locale : Montenegrin [me]
+//! author : Miodrag Nikač <miodrag@restartit.me> : https://github.com/miodragnikac
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var translator = {
+ words: { //Different grammatical cases
+ m: ['jedan minut', 'jednog minuta'],
+ mm: ['minut', 'minuta', 'minuta'],
+ h: ['jedan sat', 'jednog sata'],
+ hh: ['sat', 'sata', 'sati'],
+ dd: ['dan', 'dana', 'dana'],
+ MM: ['mjesec', 'mjeseca', 'mjeseci'],
+ yy: ['godina', 'godine', 'godina']
+ },
+ correctGrammaticalCase: function (number, wordKey) {
+ return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
+ },
+ translate: function (number, withoutSuffix, key) {
+ var wordKey = translator.words[key];
+ if (key.length === 1) {
+ return withoutSuffix ? wordKey[0] : wordKey[1];
+ } else {
+ return number + ' ' + translator.correctGrammaticalCase(number, wordKey);
+ }
+ }
+};
+
+var me = moment.defineLocale('me', {
+ months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'),
+ monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
+ monthsParseExact : true,
+ weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
+ weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
+ weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat: {
+ LT: 'H:mm',
+ LTS : 'H:mm:ss',
+ L: 'DD.MM.YYYY',
+ LL: 'D. MMMM YYYY',
+ LLL: 'D. MMMM YYYY H:mm',
+ LLLL: 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar: {
+ sameDay: '[danas u] LT',
+ nextDay: '[sjutra u] LT',
+
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[u] [nedjelju] [u] LT';
+ case 3:
+ return '[u] [srijedu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ },
+ lastDay : '[juče u] LT',
+ lastWeek : function () {
+ var lastWeekDays = [
+ '[prošle] [nedjelje] [u] LT',
+ '[prošlog] [ponedjeljka] [u] LT',
+ '[prošlog] [utorka] [u] LT',
+ '[prošle] [srijede] [u] LT',
+ '[prošlog] [četvrtka] [u] LT',
+ '[prošlog] [petka] [u] LT',
+ '[prošle] [subote] [u] LT'
+ ];
+ return lastWeekDays[this.day()];
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'prije %s',
+ s : 'nekoliko sekundi',
+ m : translator.translate,
+ mm : translator.translate,
+ h : translator.translate,
+ hh : translator.translate,
+ d : 'dan',
+ dd : translator.translate,
+ M : 'mjesec',
+ MM : translator.translate,
+ y : 'godinu',
+ yy : translator.translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return me;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/mi.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/mi.js
new file mode 100644
index 00000000000..03b65a47e97
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/mi.js
@@ -0,0 +1,64 @@
+//! moment.js locale configuration
+//! locale : Maori [mi]
+//! author : John Corrigan <robbiecloset@gmail.com> : https://github.com/johnideal
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var mi = moment.defineLocale('mi', {
+ months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split('_'),
+ monthsShort: 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split('_'),
+ monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
+ monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
+ monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
+ monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,
+ weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'),
+ weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
+ weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY [i] HH:mm',
+ LLLL: 'dddd, D MMMM YYYY [i] HH:mm'
+ },
+ calendar: {
+ sameDay: '[i teie mahana, i] LT',
+ nextDay: '[apopo i] LT',
+ nextWeek: 'dddd [i] LT',
+ lastDay: '[inanahi i] LT',
+ lastWeek: 'dddd [whakamutunga i] LT',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: 'i roto i %s',
+ past: '%s i mua',
+ s: 'te hēkona ruarua',
+ m: 'he meneti',
+ mm: '%d meneti',
+ h: 'te haora',
+ hh: '%d haora',
+ d: 'he ra',
+ dd: '%d ra',
+ M: 'he marama',
+ MM: '%d marama',
+ y: 'he tau',
+ yy: '%d tau'
+ },
+ ordinalParse: /\d{1,2}º/,
+ ordinal: '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return mi;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/mk.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/mk.js
new file mode 100644
index 00000000000..52758d3e8aa
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/mk.js
@@ -0,0 +1,90 @@
+//! moment.js locale configuration
+//! locale : Macedonian [mk]
+//! author : Borislav Mickov : https://github.com/B0k0
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var mk = moment.defineLocale('mk', {
+ months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'),
+ monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),
+ weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'),
+ weekdaysShort : 'нед_пон_вто_сре_чет_пет_саб'.split('_'),
+ weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'D.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY H:mm',
+ LLLL : 'dddd, D MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[Денес во] LT',
+ nextDay : '[Утре во] LT',
+ nextWeek : '[Во] dddd [во] LT',
+ lastDay : '[Вчера во] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ case 6:
+ return '[Изминатата] dddd [во] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[Изминатиот] dddd [во] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'после %s',
+ past : 'пред %s',
+ s : 'неколку секунди',
+ m : 'минута',
+ mm : '%d минути',
+ h : 'час',
+ hh : '%d часа',
+ d : 'ден',
+ dd : '%d дена',
+ M : 'месец',
+ MM : '%d месеци',
+ y : 'година',
+ yy : '%d години'
+ },
+ ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
+ ordinal : function (number) {
+ var lastDigit = number % 10,
+ last2Digits = number % 100;
+ if (number === 0) {
+ return number + '-ев';
+ } else if (last2Digits === 0) {
+ return number + '-ен';
+ } else if (last2Digits > 10 && last2Digits < 20) {
+ return number + '-ти';
+ } else if (lastDigit === 1) {
+ return number + '-ви';
+ } else if (lastDigit === 2) {
+ return number + '-ри';
+ } else if (lastDigit === 7 || lastDigit === 8) {
+ return number + '-ми';
+ } else {
+ return number + '-ти';
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return mk;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ml.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ml.js
new file mode 100644
index 00000000000..e5f52e9c9a9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ml.js
@@ -0,0 +1,81 @@
+//! moment.js locale configuration
+//! locale : Malayalam [ml]
+//! author : Floyd Pink : https://github.com/floydpink
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var ml = moment.defineLocale('ml', {
+ months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'),
+ monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'),
+ weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'),
+ weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm -നു',
+ LTS : 'A h:mm:ss -നു',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm -നു',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm -നു'
+ },
+ calendar : {
+ sameDay : '[ഇന്ന്] LT',
+ nextDay : '[നാളെ] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[ഇന്നലെ] LT',
+ lastWeek : '[കഴിഞ്ഞ] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s കഴിഞ്ഞ്',
+ past : '%s മുൻപ്',
+ s : 'അൽപ നിമിഷങ്ങൾ',
+ m : 'ഒരു മിനിറ്റ്',
+ mm : '%d മിനിറ്റ്',
+ h : 'ഒരു മണിക്കൂർ',
+ hh : '%d മണിക്കൂർ',
+ d : 'ഒരു ദിവസം',
+ dd : '%d ദിവസം',
+ M : 'ഒരു മാസം',
+ MM : '%d മാസം',
+ y : 'ഒരു വർഷം',
+ yy : '%d വർഷം'
+ },
+ meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if ((meridiem === 'രാത്രി' && hour >= 4) ||
+ meridiem === 'ഉച്ച കഴിഞ്ഞ്' ||
+ meridiem === 'വൈകുന്നേരം') {
+ return hour + 12;
+ } else {
+ return hour;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'രാത്രി';
+ } else if (hour < 12) {
+ return 'രാവിലെ';
+ } else if (hour < 17) {
+ return 'ഉച്ച കഴിഞ്ഞ്';
+ } else if (hour < 20) {
+ return 'വൈകുന്നേരം';
+ } else {
+ return 'രാത്രി';
+ }
+ }
+});
+
+return ml;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/mr.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/mr.js
new file mode 100644
index 00000000000..abe1024b131
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/mr.js
@@ -0,0 +1,159 @@
+//! moment.js locale configuration
+//! locale : Marathi [mr]
+//! author : Harshad Kale : https://github.com/kalehv
+//! author : Vivek Athalye : https://github.com/vnathalye
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var symbolMap = {
+ '1': '१',
+ '2': '२',
+ '3': '३',
+ '4': '४',
+ '5': '५',
+ '6': '६',
+ '7': '७',
+ '8': '८',
+ '9': '९',
+ '0': '०'
+};
+var numberMap = {
+ '१': '1',
+ '२': '2',
+ '३': '3',
+ '४': '4',
+ '५': '5',
+ '६': '6',
+ '७': '7',
+ '८': '8',
+ '९': '9',
+ '०': '0'
+};
+
+function relativeTimeMr(number, withoutSuffix, string, isFuture)
+{
+ var output = '';
+ if (withoutSuffix) {
+ switch (string) {
+ case 's': output = 'काही सेकंद'; break;
+ case 'm': output = 'एक मिनिट'; break;
+ case 'mm': output = '%d मिनिटे'; break;
+ case 'h': output = 'एक तास'; break;
+ case 'hh': output = '%d तास'; break;
+ case 'd': output = 'एक दिवस'; break;
+ case 'dd': output = '%d दिवस'; break;
+ case 'M': output = 'एक महिना'; break;
+ case 'MM': output = '%d महिने'; break;
+ case 'y': output = 'एक वर्ष'; break;
+ case 'yy': output = '%d वर्षे'; break;
+ }
+ }
+ else {
+ switch (string) {
+ case 's': output = 'काही सेकंदां'; break;
+ case 'm': output = 'एका मिनिटा'; break;
+ case 'mm': output = '%d मिनिटां'; break;
+ case 'h': output = 'एका तासा'; break;
+ case 'hh': output = '%d तासां'; break;
+ case 'd': output = 'एका दिवसा'; break;
+ case 'dd': output = '%d दिवसां'; break;
+ case 'M': output = 'एका महिन्या'; break;
+ case 'MM': output = '%d महिन्यां'; break;
+ case 'y': output = 'एका वर्षा'; break;
+ case 'yy': output = '%d वर्षां'; break;
+ }
+ }
+ return output.replace(/%d/i, number);
+}
+
+var mr = moment.defineLocale('mr', {
+ months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'),
+ monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
+ weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'),
+ weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm वाजता',
+ LTS : 'A h:mm:ss वाजता',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm वाजता',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm वाजता'
+ },
+ calendar : {
+ sameDay : '[आज] LT',
+ nextDay : '[उद्या] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[काल] LT',
+ lastWeek: '[मागील] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future: '%sमध्ये',
+ past: '%sपूर्वी',
+ s: relativeTimeMr,
+ m: relativeTimeMr,
+ mm: relativeTimeMr,
+ h: relativeTimeMr,
+ hh: relativeTimeMr,
+ d: relativeTimeMr,
+ dd: relativeTimeMr,
+ M: relativeTimeMr,
+ MM: relativeTimeMr,
+ y: relativeTimeMr,
+ yy: relativeTimeMr
+ },
+ preparse: function (string) {
+ return string.replace(/[१२३४५६७८९०]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ meridiemParse: /रात्री|सकाळी|दुपारी|सायंकाळी/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'रात्री') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'सकाळी') {
+ return hour;
+ } else if (meridiem === 'दुपारी') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'सायंकाळी') {
+ return hour + 12;
+ }
+ },
+ meridiem: function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'रात्री';
+ } else if (hour < 10) {
+ return 'सकाळी';
+ } else if (hour < 17) {
+ return 'दुपारी';
+ } else if (hour < 20) {
+ return 'सायंकाळी';
+ } else {
+ return 'रात्री';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return mr;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ms-my.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ms-my.js
new file mode 100644
index 00000000000..0cb403d347a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ms-my.js
@@ -0,0 +1,83 @@
+//! moment.js locale configuration
+//! locale : Malay [ms-my]
+//! note : DEPRECATED, the correct one is [ms]
+//! author : Weldan Jamili : https://github.com/weldan
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var msMy = moment.defineLocale('ms-my', {
+ months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),
+ monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
+ weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
+ weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
+ weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [pukul] HH.mm',
+ LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+ },
+ meridiemParse: /pagi|tengahari|petang|malam/,
+ meridiemHour: function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'pagi') {
+ return hour;
+ } else if (meridiem === 'tengahari') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'petang' || meridiem === 'malam') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'pagi';
+ } else if (hours < 15) {
+ return 'tengahari';
+ } else if (hours < 19) {
+ return 'petang';
+ } else {
+ return 'malam';
+ }
+ },
+ calendar : {
+ sameDay : '[Hari ini pukul] LT',
+ nextDay : '[Esok pukul] LT',
+ nextWeek : 'dddd [pukul] LT',
+ lastDay : '[Kelmarin pukul] LT',
+ lastWeek : 'dddd [lepas pukul] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'dalam %s',
+ past : '%s yang lepas',
+ s : 'beberapa saat',
+ m : 'seminit',
+ mm : '%d minit',
+ h : 'sejam',
+ hh : '%d jam',
+ d : 'sehari',
+ dd : '%d hari',
+ M : 'sebulan',
+ MM : '%d bulan',
+ y : 'setahun',
+ yy : '%d tahun'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return msMy;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ms.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ms.js
new file mode 100644
index 00000000000..4d4afff5dfc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ms.js
@@ -0,0 +1,82 @@
+//! moment.js locale configuration
+//! locale : Malay [ms]
+//! author : Weldan Jamili : https://github.com/weldan
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var ms = moment.defineLocale('ms', {
+ months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),
+ monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
+ weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
+ weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
+ weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [pukul] HH.mm',
+ LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+ },
+ meridiemParse: /pagi|tengahari|petang|malam/,
+ meridiemHour: function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'pagi') {
+ return hour;
+ } else if (meridiem === 'tengahari') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'petang' || meridiem === 'malam') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'pagi';
+ } else if (hours < 15) {
+ return 'tengahari';
+ } else if (hours < 19) {
+ return 'petang';
+ } else {
+ return 'malam';
+ }
+ },
+ calendar : {
+ sameDay : '[Hari ini pukul] LT',
+ nextDay : '[Esok pukul] LT',
+ nextWeek : 'dddd [pukul] LT',
+ lastDay : '[Kelmarin pukul] LT',
+ lastWeek : 'dddd [lepas pukul] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'dalam %s',
+ past : '%s yang lepas',
+ s : 'beberapa saat',
+ m : 'seminit',
+ mm : '%d minit',
+ h : 'sejam',
+ hh : '%d jam',
+ d : 'sehari',
+ dd : '%d hari',
+ M : 'sebulan',
+ MM : '%d bulan',
+ y : 'setahun',
+ yy : '%d tahun'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return ms;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/my.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/my.js
new file mode 100644
index 00000000000..32d67e2bae5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/my.js
@@ -0,0 +1,96 @@
+//! moment.js locale configuration
+//! locale : Burmese [my]
+//! author : Squar team, mysquar.com
+//! author : David Rossellat : https://github.com/gholadr
+//! author : Tin Aung Lin : https://github.com/thanyawzinmin
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var symbolMap = {
+ '1': '၁',
+ '2': '၂',
+ '3': '၃',
+ '4': '၄',
+ '5': '၅',
+ '6': '၆',
+ '7': '၇',
+ '8': '၈',
+ '9': '၉',
+ '0': '၀'
+};
+var numberMap = {
+ '၁': '1',
+ '၂': '2',
+ '၃': '3',
+ '၄': '4',
+ '၅': '5',
+ '၆': '6',
+ '၇': '7',
+ '၈': '8',
+ '၉': '9',
+ '၀': '0'
+};
+
+var my = moment.defineLocale('my', {
+ months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'),
+ monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'),
+ weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'),
+ weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+ weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY HH:mm',
+ LLLL: 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar: {
+ sameDay: '[ယနေ.] LT [မှာ]',
+ nextDay: '[မနက်ဖြန်] LT [မှာ]',
+ nextWeek: 'dddd LT [မှာ]',
+ lastDay: '[မနေ.က] LT [မှာ]',
+ lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: 'လာမည့် %s မှာ',
+ past: 'လွန်ခဲ့သော %s က',
+ s: 'စက္ကန်.အနည်းငယ်',
+ m: 'တစ်မိနစ်',
+ mm: '%d မိနစ်',
+ h: 'တစ်နာရီ',
+ hh: '%d နာရီ',
+ d: 'တစ်ရက်',
+ dd: '%d ရက်',
+ M: 'တစ်လ',
+ MM: '%d လ',
+ y: 'တစ်နှစ်',
+ yy: '%d နှစ်'
+ },
+ preparse: function (string) {
+ return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ week: {
+ dow: 1, // Monday is the first day of the week.
+ doy: 4 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return my;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/nb.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/nb.js
new file mode 100644
index 00000000000..b77e576dc6c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/nb.js
@@ -0,0 +1,63 @@
+//! moment.js locale configuration
+//! locale : Norwegian Bokmål [nb]
+//! authors : Espen Hovlandsdal : https://github.com/rexxars
+//! Sigurd Gartmann : https://github.com/sigurdga
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var nb = moment.defineLocale('nb', {
+ months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
+ monthsShort : 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
+ weekdaysShort : 'sø._ma._ti._on._to._fr._lø.'.split('_'),
+ weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY [kl.] HH:mm',
+ LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm'
+ },
+ calendar : {
+ sameDay: '[i dag kl.] LT',
+ nextDay: '[i morgen kl.] LT',
+ nextWeek: 'dddd [kl.] LT',
+ lastDay: '[i går kl.] LT',
+ lastWeek: '[forrige] dddd [kl.] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'om %s',
+ past : '%s siden',
+ s : 'noen sekunder',
+ m : 'ett minutt',
+ mm : '%d minutter',
+ h : 'en time',
+ hh : '%d timer',
+ d : 'en dag',
+ dd : '%d dager',
+ M : 'en måned',
+ MM : '%d måneder',
+ y : 'ett år',
+ yy : '%d år'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return nb;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ne.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ne.js
new file mode 100644
index 00000000000..a35947a9e31
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ne.js
@@ -0,0 +1,123 @@
+//! moment.js locale configuration
+//! locale : Nepalese [ne]
+//! author : suvash : https://github.com/suvash
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var symbolMap = {
+ '1': '१',
+ '2': '२',
+ '3': '३',
+ '4': '४',
+ '5': '५',
+ '6': '६',
+ '7': '७',
+ '8': '८',
+ '9': '९',
+ '0': '०'
+};
+var numberMap = {
+ '१': '1',
+ '२': '2',
+ '३': '3',
+ '४': '4',
+ '५': '5',
+ '६': '6',
+ '७': '7',
+ '८': '8',
+ '९': '9',
+ '०': '0'
+};
+
+var ne = moment.defineLocale('ne', {
+ months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'),
+ monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'),
+ weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'),
+ weekdaysMin : 'आ._सो._मं._बु._बि._शु._श.'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'Aको h:mm बजे',
+ LTS : 'Aको h:mm:ss बजे',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, Aको h:mm बजे',
+ LLLL : 'dddd, D MMMM YYYY, Aको h:mm बजे'
+ },
+ preparse: function (string) {
+ return string.replace(/[१२३४५६७८९०]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ meridiemParse: /राति|बिहान|दिउँसो|साँझ/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'राति') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'बिहान') {
+ return hour;
+ } else if (meridiem === 'दिउँसो') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'साँझ') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 3) {
+ return 'राति';
+ } else if (hour < 12) {
+ return 'बिहान';
+ } else if (hour < 16) {
+ return 'दिउँसो';
+ } else if (hour < 20) {
+ return 'साँझ';
+ } else {
+ return 'राति';
+ }
+ },
+ calendar : {
+ sameDay : '[आज] LT',
+ nextDay : '[भोलि] LT',
+ nextWeek : '[आउँदो] dddd[,] LT',
+ lastDay : '[हिजो] LT',
+ lastWeek : '[गएको] dddd[,] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%sमा',
+ past : '%s अगाडि',
+ s : 'केही क्षण',
+ m : 'एक मिनेट',
+ mm : '%d मिनेट',
+ h : 'एक घण्टा',
+ hh : '%d घण्टा',
+ d : 'एक दिन',
+ dd : '%d दिन',
+ M : 'एक महिना',
+ MM : '%d महिना',
+ y : 'एक बर्ष',
+ yy : '%d बर्ष'
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return ne;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/nl-be.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/nl-be.js
new file mode 100644
index 00000000000..aaa5d74ac2b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/nl-be.js
@@ -0,0 +1,86 @@
+//! moment.js locale configuration
+//! locale : Dutch (Belgium) [nl-be]
+//! author : Joris Röling : https://github.com/jorisroling
+//! author : Jacob Middag : https://github.com/middagj
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_');
+var monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_');
+
+var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i];
+var monthsRegex = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;
+
+var nlBe = moment.defineLocale('nl-be', {
+ months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShortWithoutDots[m.month()];
+ } else {
+ return monthsShortWithDots[m.month()];
+ }
+ },
+
+ monthsRegex: monthsRegex,
+ monthsShortRegex: monthsRegex,
+ monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,
+ monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,
+
+ monthsParse : monthsParse,
+ longMonthsParse : monthsParse,
+ shortMonthsParse : monthsParse,
+
+ weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
+ weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'),
+ weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[vandaag om] LT',
+ nextDay: '[morgen om] LT',
+ nextWeek: 'dddd [om] LT',
+ lastDay: '[gisteren om] LT',
+ lastWeek: '[afgelopen] dddd [om] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'over %s',
+ past : '%s geleden',
+ s : 'een paar seconden',
+ m : 'één minuut',
+ mm : '%d minuten',
+ h : 'één uur',
+ hh : '%d uur',
+ d : 'één dag',
+ dd : '%d dagen',
+ M : 'één maand',
+ MM : '%d maanden',
+ y : 'één jaar',
+ yy : '%d jaar'
+ },
+ ordinalParse: /\d{1,2}(ste|de)/,
+ ordinal : function (number) {
+ return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return nlBe;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/nl.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/nl.js
new file mode 100644
index 00000000000..15beaef13cf
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/nl.js
@@ -0,0 +1,86 @@
+//! moment.js locale configuration
+//! locale : Dutch [nl]
+//! author : Joris Röling : https://github.com/jorisroling
+//! author : Jacob Middag : https://github.com/middagj
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_');
+var monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_');
+
+var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i];
+var monthsRegex = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;
+
+var nl = moment.defineLocale('nl', {
+ months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShortWithoutDots[m.month()];
+ } else {
+ return monthsShortWithDots[m.month()];
+ }
+ },
+
+ monthsRegex: monthsRegex,
+ monthsShortRegex: monthsRegex,
+ monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,
+ monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,
+
+ monthsParse : monthsParse,
+ longMonthsParse : monthsParse,
+ shortMonthsParse : monthsParse,
+
+ weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
+ weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'),
+ weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD-MM-YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[vandaag om] LT',
+ nextDay: '[morgen om] LT',
+ nextWeek: 'dddd [om] LT',
+ lastDay: '[gisteren om] LT',
+ lastWeek: '[afgelopen] dddd [om] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'over %s',
+ past : '%s geleden',
+ s : 'een paar seconden',
+ m : 'één minuut',
+ mm : '%d minuten',
+ h : 'één uur',
+ hh : '%d uur',
+ d : 'één dag',
+ dd : '%d dagen',
+ M : 'één maand',
+ MM : '%d maanden',
+ y : 'één jaar',
+ yy : '%d jaar'
+ },
+ ordinalParse: /\d{1,2}(ste|de)/,
+ ordinal : function (number) {
+ return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return nl;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/nn.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/nn.js
new file mode 100644
index 00000000000..cf39af5e7b9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/nn.js
@@ -0,0 +1,60 @@
+//! moment.js locale configuration
+//! locale : Nynorsk [nn]
+//! author : https://github.com/mechuwind
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var nn = moment.defineLocale('nn', {
+ months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
+ weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),
+ weekdaysShort : 'sun_mån_tys_ons_tor_fre_lau'.split('_'),
+ weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY [kl.] H:mm',
+ LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm'
+ },
+ calendar : {
+ sameDay: '[I dag klokka] LT',
+ nextDay: '[I morgon klokka] LT',
+ nextWeek: 'dddd [klokka] LT',
+ lastDay: '[I går klokka] LT',
+ lastWeek: '[Føregåande] dddd [klokka] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'om %s',
+ past : '%s sidan',
+ s : 'nokre sekund',
+ m : 'eit minutt',
+ mm : '%d minutt',
+ h : 'ein time',
+ hh : '%d timar',
+ d : 'ein dag',
+ dd : '%d dagar',
+ M : 'ein månad',
+ MM : '%d månader',
+ y : 'eit år',
+ yy : '%d år'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return nn;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/pa-in.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/pa-in.js
new file mode 100644
index 00000000000..6dec8d17243
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/pa-in.js
@@ -0,0 +1,124 @@
+//! moment.js locale configuration
+//! locale : Punjabi (India) [pa-in]
+//! author : Harpreet Singh : https://github.com/harpreetkhalsagtbit
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var symbolMap = {
+ '1': '੧',
+ '2': '੨',
+ '3': '੩',
+ '4': '੪',
+ '5': '੫',
+ '6': '੬',
+ '7': '੭',
+ '8': '੮',
+ '9': '੯',
+ '0': '੦'
+};
+var numberMap = {
+ '੧': '1',
+ '੨': '2',
+ '੩': '3',
+ '੪': '4',
+ '੫': '5',
+ '੬': '6',
+ '੭': '7',
+ '੮': '8',
+ '੯': '9',
+ '੦': '0'
+};
+
+var paIn = moment.defineLocale('pa-in', {
+ // There are months name as per Nanakshahi Calender but they are not used as rigidly in modern Punjabi.
+ months : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'),
+ monthsShort : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'),
+ weekdays : 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split('_'),
+ weekdaysShort : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
+ weekdaysMin : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm ਵਜੇ',
+ LTS : 'A h:mm:ss ਵਜੇ',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm ਵਜੇ',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm ਵਜੇ'
+ },
+ calendar : {
+ sameDay : '[ਅਜ] LT',
+ nextDay : '[ਕਲ] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[ਕਲ] LT',
+ lastWeek : '[ਪਿਛਲੇ] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s ਵਿੱਚ',
+ past : '%s ਪਿਛਲੇ',
+ s : 'ਕੁਝ ਸਕਿੰਟ',
+ m : 'ਇਕ ਮਿੰਟ',
+ mm : '%d ਮਿੰਟ',
+ h : 'ਇੱਕ ਘੰਟਾ',
+ hh : '%d ਘੰਟੇ',
+ d : 'ਇੱਕ ਦਿਨ',
+ dd : '%d ਦਿਨ',
+ M : 'ਇੱਕ ਮਹੀਨਾ',
+ MM : '%d ਮਹੀਨੇ',
+ y : 'ਇੱਕ ਸਾਲ',
+ yy : '%d ਸਾਲ'
+ },
+ preparse: function (string) {
+ return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ // Punjabi notation for meridiems are quite fuzzy in practice. While there exists
+ // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi.
+ meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'ਰਾਤ') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'ਸਵੇਰ') {
+ return hour;
+ } else if (meridiem === 'ਦੁਪਹਿਰ') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'ਸ਼ਾਮ') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'ਰਾਤ';
+ } else if (hour < 10) {
+ return 'ਸਵੇਰ';
+ } else if (hour < 17) {
+ return 'ਦੁਪਹਿਰ';
+ } else if (hour < 20) {
+ return 'ਸ਼ਾਮ';
+ } else {
+ return 'ਰਾਤ';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return paIn;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/pl.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/pl.js
new file mode 100644
index 00000000000..aab946b0d7c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/pl.js
@@ -0,0 +1,105 @@
+//! moment.js locale configuration
+//! locale : Polish [pl]
+//! author : Rafal Hirsz : https://github.com/evoL
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_');
+var monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_');
+function plural(n) {
+ return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1);
+}
+function translate(number, withoutSuffix, key) {
+ var result = number + ' ';
+ switch (key) {
+ case 'm':
+ return withoutSuffix ? 'minuta' : 'minutę';
+ case 'mm':
+ return result + (plural(number) ? 'minuty' : 'minut');
+ case 'h':
+ return withoutSuffix ? 'godzina' : 'godzinę';
+ case 'hh':
+ return result + (plural(number) ? 'godziny' : 'godzin');
+ case 'MM':
+ return result + (plural(number) ? 'miesiące' : 'miesięcy');
+ case 'yy':
+ return result + (plural(number) ? 'lata' : 'lat');
+ }
+}
+
+var pl = moment.defineLocale('pl', {
+ months : function (momentToFormat, format) {
+ if (format === '') {
+ // Hack: if format empty we know this is used to generate
+ // RegExp by moment. Give then back both valid forms of months
+ // in RegExp ready format.
+ return '(' + monthsSubjective[momentToFormat.month()] + '|' + monthsNominative[momentToFormat.month()] + ')';
+ } else if (/D MMMM/.test(format)) {
+ return monthsSubjective[momentToFormat.month()];
+ } else {
+ return monthsNominative[momentToFormat.month()];
+ }
+ },
+ monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'),
+ weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'),
+ weekdaysShort : 'ndz_pon_wt_śr_czw_pt_sob'.split('_'),
+ weekdaysMin : 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Dziś o] LT',
+ nextDay: '[Jutro o] LT',
+ nextWeek: '[W] dddd [o] LT',
+ lastDay: '[Wczoraj o] LT',
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[W zeszłą niedzielę o] LT';
+ case 3:
+ return '[W zeszłą środę o] LT';
+ case 6:
+ return '[W zeszłą sobotę o] LT';
+ default:
+ return '[W zeszły] dddd [o] LT';
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : '%s temu',
+ s : 'kilka sekund',
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : '1 dzień',
+ dd : '%d dni',
+ M : 'miesiąc',
+ MM : translate,
+ y : 'rok',
+ yy : translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return pl;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/pt-br.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/pt-br.js
new file mode 100644
index 00000000000..20897f78af8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/pt-br.js
@@ -0,0 +1,61 @@
+//! moment.js locale configuration
+//! locale : Portuguese (Brazil) [pt-br]
+//! author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var ptBr = moment.defineLocale('pt-br', {
+ months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'),
+ monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
+ weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'),
+ weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
+ weekdaysMin : 'Dom_2ª_3ª_4ª_5ª_6ª_Sáb'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D [de] MMMM [de] YYYY',
+ LLL : 'D [de] MMMM [de] YYYY [às] HH:mm',
+ LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm'
+ },
+ calendar : {
+ sameDay: '[Hoje às] LT',
+ nextDay: '[Amanhã às] LT',
+ nextWeek: 'dddd [às] LT',
+ lastDay: '[Ontem às] LT',
+ lastWeek: function () {
+ return (this.day() === 0 || this.day() === 6) ?
+ '[Último] dddd [às] LT' : // Saturday + Sunday
+ '[Última] dddd [às] LT'; // Monday - Friday
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'em %s',
+ past : '%s atrás',
+ s : 'poucos segundos',
+ m : 'um minuto',
+ mm : '%d minutos',
+ h : 'uma hora',
+ hh : '%d horas',
+ d : 'um dia',
+ dd : '%d dias',
+ M : 'um mês',
+ MM : '%d meses',
+ y : 'um ano',
+ yy : '%d anos'
+ },
+ ordinalParse: /\d{1,2}º/,
+ ordinal : '%dº'
+});
+
+return ptBr;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/pt.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/pt.js
new file mode 100644
index 00000000000..7a852285698
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/pt.js
@@ -0,0 +1,65 @@
+//! moment.js locale configuration
+//! locale : Portuguese [pt]
+//! author : Jefferson : https://github.com/jalex79
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var pt = moment.defineLocale('pt', {
+ months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'),
+ monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
+ weekdays : 'Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado'.split('_'),
+ weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
+ weekdaysMin : 'Dom_2ª_3ª_4ª_5ª_6ª_Sáb'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D [de] MMMM [de] YYYY',
+ LLL : 'D [de] MMMM [de] YYYY HH:mm',
+ LLLL : 'dddd, D [de] MMMM [de] YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Hoje às] LT',
+ nextDay: '[Amanhã às] LT',
+ nextWeek: 'dddd [às] LT',
+ lastDay: '[Ontem às] LT',
+ lastWeek: function () {
+ return (this.day() === 0 || this.day() === 6) ?
+ '[Último] dddd [às] LT' : // Saturday + Sunday
+ '[Última] dddd [às] LT'; // Monday - Friday
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'em %s',
+ past : 'há %s',
+ s : 'segundos',
+ m : 'um minuto',
+ mm : '%d minutos',
+ h : 'uma hora',
+ hh : '%d horas',
+ d : 'um dia',
+ dd : '%d dias',
+ M : 'um mês',
+ MM : '%d meses',
+ y : 'um ano',
+ yy : '%d anos'
+ },
+ ordinalParse: /\d{1,2}º/,
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return pt;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ro.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ro.js
new file mode 100644
index 00000000000..8a0cd7501ad
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ro.js
@@ -0,0 +1,75 @@
+//! moment.js locale configuration
+//! locale : Romanian [ro]
+//! author : Vlad Gurdiga : https://github.com/gurdiga
+//! author : Valentin Agachi : https://github.com/avaly
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+function relativeTimeWithPlural(number, withoutSuffix, key) {
+ var format = {
+ 'mm': 'minute',
+ 'hh': 'ore',
+ 'dd': 'zile',
+ 'MM': 'luni',
+ 'yy': 'ani'
+ },
+ separator = ' ';
+ if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {
+ separator = ' de ';
+ }
+ return number + separator + format[key];
+}
+
+var ro = moment.defineLocale('ro', {
+ months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'),
+ monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'),
+ weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'),
+ weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY H:mm',
+ LLLL : 'dddd, D MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay: '[azi la] LT',
+ nextDay: '[mâine la] LT',
+ nextWeek: 'dddd [la] LT',
+ lastDay: '[ieri la] LT',
+ lastWeek: '[fosta] dddd [la] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'peste %s',
+ past : '%s în urmă',
+ s : 'câteva secunde',
+ m : 'un minut',
+ mm : relativeTimeWithPlural,
+ h : 'o oră',
+ hh : relativeTimeWithPlural,
+ d : 'o zi',
+ dd : relativeTimeWithPlural,
+ M : 'o lună',
+ MM : relativeTimeWithPlural,
+ y : 'un an',
+ yy : relativeTimeWithPlural
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return ro;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ru.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ru.js
new file mode 100644
index 00000000000..35bba86a2ee
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ru.js
@@ -0,0 +1,183 @@
+//! moment.js locale configuration
+//! locale : Russian [ru]
+//! author : Viktorminator : https://github.com/Viktorminator
+//! Author : Menelion Elensúle : https://github.com/Oire
+//! author : Коренберг Марк : https://github.com/socketpair
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+function plural(word, num) {
+ var forms = word.split('_');
+ return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+}
+function relativeTimeWithPlural(number, withoutSuffix, key) {
+ var format = {
+ 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',
+ 'hh': 'час_часа_часов',
+ 'dd': 'день_дня_дней',
+ 'MM': 'месяц_месяца_месяцев',
+ 'yy': 'год_года_лет'
+ };
+ if (key === 'm') {
+ return withoutSuffix ? 'минута' : 'минуту';
+ }
+ else {
+ return number + ' ' + plural(format[key], +number);
+ }
+}
+var monthsParse = [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[йя]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i];
+
+// http://new.gramota.ru/spravka/rules/139-prop : § 103
+// Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637
+// CLDR data: http://www.unicode.org/cldr/charts/28/summary/ru.html#1753
+var ru = moment.defineLocale('ru', {
+ months : {
+ format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_'),
+ standalone: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_')
+ },
+ monthsShort : {
+ // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку ?
+ format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_'),
+ standalone: 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_')
+ },
+ weekdays : {
+ standalone: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),
+ format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_'),
+ isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/
+ },
+ weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
+ weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
+ monthsParse : monthsParse,
+ longMonthsParse : monthsParse,
+ shortMonthsParse : monthsParse,
+
+ // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки
+ monthsRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,
+
+ // копия предыдущего
+ monthsShortRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,
+
+ // полные названия с падежами
+ monthsStrictRegex: /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,
+
+ // Выражение, которое соотвествует только сокращённым формам
+ monthsShortStrictRegex: /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY г.',
+ LLL : 'D MMMM YYYY г., HH:mm',
+ LLLL : 'dddd, D MMMM YYYY г., HH:mm'
+ },
+ calendar : {
+ sameDay: '[Сегодня в] LT',
+ nextDay: '[Завтра в] LT',
+ lastDay: '[Вчера в] LT',
+ nextWeek: function (now) {
+ if (now.week() !== this.week()) {
+ switch (this.day()) {
+ case 0:
+ return '[В следующее] dddd [в] LT';
+ case 1:
+ case 2:
+ case 4:
+ return '[В следующий] dddd [в] LT';
+ case 3:
+ case 5:
+ case 6:
+ return '[В следующую] dddd [в] LT';
+ }
+ } else {
+ if (this.day() === 2) {
+ return '[Во] dddd [в] LT';
+ } else {
+ return '[В] dddd [в] LT';
+ }
+ }
+ },
+ lastWeek: function (now) {
+ if (now.week() !== this.week()) {
+ switch (this.day()) {
+ case 0:
+ return '[В прошлое] dddd [в] LT';
+ case 1:
+ case 2:
+ case 4:
+ return '[В прошлый] dddd [в] LT';
+ case 3:
+ case 5:
+ case 6:
+ return '[В прошлую] dddd [в] LT';
+ }
+ } else {
+ if (this.day() === 2) {
+ return '[Во] dddd [в] LT';
+ } else {
+ return '[В] dddd [в] LT';
+ }
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'через %s',
+ past : '%s назад',
+ s : 'несколько секунд',
+ m : relativeTimeWithPlural,
+ mm : relativeTimeWithPlural,
+ h : 'час',
+ hh : relativeTimeWithPlural,
+ d : 'день',
+ dd : relativeTimeWithPlural,
+ M : 'месяц',
+ MM : relativeTimeWithPlural,
+ y : 'год',
+ yy : relativeTimeWithPlural
+ },
+ meridiemParse: /ночи|утра|дня|вечера/i,
+ isPM : function (input) {
+ return /^(дня|вечера)$/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'ночи';
+ } else if (hour < 12) {
+ return 'утра';
+ } else if (hour < 17) {
+ return 'дня';
+ } else {
+ return 'вечера';
+ }
+ },
+ ordinalParse: /\d{1,2}-(й|го|я)/,
+ ordinal: function (number, period) {
+ switch (period) {
+ case 'M':
+ case 'd':
+ case 'DDD':
+ return number + '-й';
+ case 'D':
+ return number + '-го';
+ case 'w':
+ case 'W':
+ return number + '-я';
+ default:
+ return number;
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return ru;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/se.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/se.js
new file mode 100644
index 00000000000..ab52fdff2ad
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/se.js
@@ -0,0 +1,61 @@
+//! moment.js locale configuration
+//! locale : Northern Sami [se]
+//! authors : Bård Rolstad Henriksen : https://github.com/karamell
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+
+var se = moment.defineLocale('se', {
+ months : 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'),
+ monthsShort : 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'),
+ weekdays : 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'),
+ weekdaysShort : 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'),
+ weekdaysMin : 's_v_m_g_d_b_L'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'MMMM D. [b.] YYYY',
+ LLL : 'MMMM D. [b.] YYYY [ti.] HH:mm',
+ LLLL : 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm'
+ },
+ calendar : {
+ sameDay: '[otne ti] LT',
+ nextDay: '[ihttin ti] LT',
+ nextWeek: 'dddd [ti] LT',
+ lastDay: '[ikte ti] LT',
+ lastWeek: '[ovddit] dddd [ti] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : '%s geažes',
+ past : 'maŋit %s',
+ s : 'moadde sekunddat',
+ m : 'okta minuhta',
+ mm : '%d minuhtat',
+ h : 'okta diimmu',
+ hh : '%d diimmut',
+ d : 'okta beaivi',
+ dd : '%d beaivvit',
+ M : 'okta mánnu',
+ MM : '%d mánut',
+ y : 'okta jahki',
+ yy : '%d jagit'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return se;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/si.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/si.js
new file mode 100644
index 00000000000..47d435b8313
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/si.js
@@ -0,0 +1,71 @@
+//! moment.js locale configuration
+//! locale : Sinhalese [si]
+//! author : Sampath Sitinamaluwa : https://github.com/sampathsris
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+/*jshint -W100*/
+var si = moment.defineLocale('si', {
+ months : 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'),
+ monthsShort : 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'),
+ weekdays : 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'),
+ weekdaysShort : 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'),
+ weekdaysMin : 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'a h:mm',
+ LTS : 'a h:mm:ss',
+ L : 'YYYY/MM/DD',
+ LL : 'YYYY MMMM D',
+ LLL : 'YYYY MMMM D, a h:mm',
+ LLLL : 'YYYY MMMM D [වැනි] dddd, a h:mm:ss'
+ },
+ calendar : {
+ sameDay : '[අද] LT[ට]',
+ nextDay : '[හෙට] LT[ට]',
+ nextWeek : 'dddd LT[ට]',
+ lastDay : '[ඊයේ] LT[ට]',
+ lastWeek : '[පසුගිය] dddd LT[ට]',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%sකින්',
+ past : '%sකට පෙර',
+ s : 'තත්පර කිහිපය',
+ m : 'මිනිත්තුව',
+ mm : 'මිනිත්තු %d',
+ h : 'පැය',
+ hh : 'පැය %d',
+ d : 'දිනය',
+ dd : 'දින %d',
+ M : 'මාසය',
+ MM : 'මාස %d',
+ y : 'වසර',
+ yy : 'වසර %d'
+ },
+ ordinalParse: /\d{1,2} වැනි/,
+ ordinal : function (number) {
+ return number + ' වැනි';
+ },
+ meridiemParse : /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,
+ isPM : function (input) {
+ return input === 'ප.ව.' || input === 'පස් වරු';
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'ප.ව.' : 'පස් වරු';
+ } else {
+ return isLower ? 'පෙ.ව.' : 'පෙර වරු';
+ }
+ }
+});
+
+return si;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sk.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sk.js
new file mode 100644
index 00000000000..f31291f4d13
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sk.js
@@ -0,0 +1,150 @@
+//! moment.js locale configuration
+//! locale : Slovak [sk]
+//! author : Martin Minka : https://github.com/k2s
+//! based on work of petrbela : https://github.com/petrbela
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_');
+var monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');
+function plural(n) {
+ return (n > 1) && (n < 5);
+}
+function translate(number, withoutSuffix, key, isFuture) {
+ var result = number + ' ';
+ switch (key) {
+ case 's': // a few seconds / in a few seconds / a few seconds ago
+ return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami';
+ case 'm': // a minute / in a minute / a minute ago
+ return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou');
+ case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'minúty' : 'minút');
+ } else {
+ return result + 'minútami';
+ }
+ break;
+ case 'h': // an hour / in an hour / an hour ago
+ return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+ case 'hh': // 9 hours / in 9 hours / 9 hours ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'hodiny' : 'hodín');
+ } else {
+ return result + 'hodinami';
+ }
+ break;
+ case 'd': // a day / in a day / a day ago
+ return (withoutSuffix || isFuture) ? 'deň' : 'dňom';
+ case 'dd': // 9 days / in 9 days / 9 days ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'dni' : 'dní');
+ } else {
+ return result + 'dňami';
+ }
+ break;
+ case 'M': // a month / in a month / a month ago
+ return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom';
+ case 'MM': // 9 months / in 9 months / 9 months ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'mesiace' : 'mesiacov');
+ } else {
+ return result + 'mesiacmi';
+ }
+ break;
+ case 'y': // a year / in a year / a year ago
+ return (withoutSuffix || isFuture) ? 'rok' : 'rokom';
+ case 'yy': // 9 years / in 9 years / 9 years ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'roky' : 'rokov');
+ } else {
+ return result + 'rokmi';
+ }
+ break;
+ }
+}
+
+var sk = moment.defineLocale('sk', {
+ months : months,
+ monthsShort : monthsShort,
+ weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),
+ weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'),
+ weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'),
+ longDateFormat : {
+ LT: 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd D. MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay: '[dnes o] LT',
+ nextDay: '[zajtra o] LT',
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[v nedeľu o] LT';
+ case 1:
+ case 2:
+ return '[v] dddd [o] LT';
+ case 3:
+ return '[v stredu o] LT';
+ case 4:
+ return '[vo štvrtok o] LT';
+ case 5:
+ return '[v piatok o] LT';
+ case 6:
+ return '[v sobotu o] LT';
+ }
+ },
+ lastDay: '[včera o] LT',
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[minulú nedeľu o] LT';
+ case 1:
+ case 2:
+ return '[minulý] dddd [o] LT';
+ case 3:
+ return '[minulú stredu o] LT';
+ case 4:
+ case 5:
+ return '[minulý] dddd [o] LT';
+ case 6:
+ return '[minulú sobotu o] LT';
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'pred %s',
+ s : translate,
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : translate,
+ dd : translate,
+ M : translate,
+ MM : translate,
+ y : translate,
+ yy : translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return sk;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sl.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sl.js
new file mode 100644
index 00000000000..d9b36245a74
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sl.js
@@ -0,0 +1,162 @@
+//! moment.js locale configuration
+//! locale : Slovenian [sl]
+//! author : Robert Sedovšek : https://github.com/sedovsek
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+function processRelativeTime(number, withoutSuffix, key, isFuture) {
+ var result = number + ' ';
+ switch (key) {
+ case 's':
+ return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami';
+ case 'm':
+ return withoutSuffix ? 'ena minuta' : 'eno minuto';
+ case 'mm':
+ if (number === 1) {
+ result += withoutSuffix ? 'minuta' : 'minuto';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'minuti' : 'minutama';
+ } else if (number < 5) {
+ result += withoutSuffix || isFuture ? 'minute' : 'minutami';
+ } else {
+ result += withoutSuffix || isFuture ? 'minut' : 'minutami';
+ }
+ return result;
+ case 'h':
+ return withoutSuffix ? 'ena ura' : 'eno uro';
+ case 'hh':
+ if (number === 1) {
+ result += withoutSuffix ? 'ura' : 'uro';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'uri' : 'urama';
+ } else if (number < 5) {
+ result += withoutSuffix || isFuture ? 'ure' : 'urami';
+ } else {
+ result += withoutSuffix || isFuture ? 'ur' : 'urami';
+ }
+ return result;
+ case 'd':
+ return withoutSuffix || isFuture ? 'en dan' : 'enim dnem';
+ case 'dd':
+ if (number === 1) {
+ result += withoutSuffix || isFuture ? 'dan' : 'dnem';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'dni' : 'dnevoma';
+ } else {
+ result += withoutSuffix || isFuture ? 'dni' : 'dnevi';
+ }
+ return result;
+ case 'M':
+ return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem';
+ case 'MM':
+ if (number === 1) {
+ result += withoutSuffix || isFuture ? 'mesec' : 'mesecem';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'meseca' : 'mesecema';
+ } else if (number < 5) {
+ result += withoutSuffix || isFuture ? 'mesece' : 'meseci';
+ } else {
+ result += withoutSuffix || isFuture ? 'mesecev' : 'meseci';
+ }
+ return result;
+ case 'y':
+ return withoutSuffix || isFuture ? 'eno leto' : 'enim letom';
+ case 'yy':
+ if (number === 1) {
+ result += withoutSuffix || isFuture ? 'leto' : 'letom';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'leti' : 'letoma';
+ } else if (number < 5) {
+ result += withoutSuffix || isFuture ? 'leta' : 'leti';
+ } else {
+ result += withoutSuffix || isFuture ? 'let' : 'leti';
+ }
+ return result;
+ }
+}
+
+var sl = moment.defineLocale('sl', {
+ months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'),
+ monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),
+ weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'),
+ weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[danes ob] LT',
+ nextDay : '[jutri ob] LT',
+
+ nextWeek : function () {
+ switch (this.day()) {
+ case 0:
+ return '[v] [nedeljo] [ob] LT';
+ case 3:
+ return '[v] [sredo] [ob] LT';
+ case 6:
+ return '[v] [soboto] [ob] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[v] dddd [ob] LT';
+ }
+ },
+ lastDay : '[včeraj ob] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ return '[prejšnjo] [nedeljo] [ob] LT';
+ case 3:
+ return '[prejšnjo] [sredo] [ob] LT';
+ case 6:
+ return '[prejšnjo] [soboto] [ob] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[prejšnji] dddd [ob] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'čez %s',
+ past : 'pred %s',
+ s : processRelativeTime,
+ m : processRelativeTime,
+ mm : processRelativeTime,
+ h : processRelativeTime,
+ hh : processRelativeTime,
+ d : processRelativeTime,
+ dd : processRelativeTime,
+ M : processRelativeTime,
+ MM : processRelativeTime,
+ y : processRelativeTime,
+ yy : processRelativeTime
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return sl;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sq.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sq.js
new file mode 100644
index 00000000000..1ca3fdd821b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sq.js
@@ -0,0 +1,70 @@
+//! moment.js locale configuration
+//! locale : Albanian [sq]
+//! author : Flakërim Ismani : https://github.com/flakerimi
+//! author : Menelion Elensúle : https://github.com/Oire
+//! author : Oerd Cukalla : https://github.com/oerd
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var sq = moment.defineLocale('sq', {
+ months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'),
+ monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'),
+ weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'),
+ weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'),
+ weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'),
+ weekdaysParseExact : true,
+ meridiemParse: /PD|MD/,
+ isPM: function (input) {
+ return input.charAt(0) === 'M';
+ },
+ meridiem : function (hours, minutes, isLower) {
+ return hours < 12 ? 'PD' : 'MD';
+ },
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Sot në] LT',
+ nextDay : '[Nesër në] LT',
+ nextWeek : 'dddd [në] LT',
+ lastDay : '[Dje në] LT',
+ lastWeek : 'dddd [e kaluar në] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'në %s',
+ past : '%s më parë',
+ s : 'disa sekonda',
+ m : 'një minutë',
+ mm : '%d minuta',
+ h : 'një orë',
+ hh : '%d orë',
+ d : 'një ditë',
+ dd : '%d ditë',
+ M : 'një muaj',
+ MM : '%d muaj',
+ y : 'një vit',
+ yy : '%d vite'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return sq;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sr-cyrl.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sr-cyrl.js
new file mode 100644
index 00000000000..caeef089e7c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sr-cyrl.js
@@ -0,0 +1,110 @@
+//! moment.js locale configuration
+//! locale : Serbian Cyrillic [sr-cyrl]
+//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var translator = {
+ words: { //Different grammatical cases
+ m: ['један минут', 'једне минуте'],
+ mm: ['минут', 'минуте', 'минута'],
+ h: ['један сат', 'једног сата'],
+ hh: ['сат', 'сата', 'сати'],
+ dd: ['дан', 'дана', 'дана'],
+ MM: ['месец', 'месеца', 'месеци'],
+ yy: ['година', 'године', 'година']
+ },
+ correctGrammaticalCase: function (number, wordKey) {
+ return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
+ },
+ translate: function (number, withoutSuffix, key) {
+ var wordKey = translator.words[key];
+ if (key.length === 1) {
+ return withoutSuffix ? wordKey[0] : wordKey[1];
+ } else {
+ return number + ' ' + translator.correctGrammaticalCase(number, wordKey);
+ }
+ }
+};
+
+var srCyrl = moment.defineLocale('sr-cyrl', {
+ months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split('_'),
+ monthsShort: 'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'),
+ monthsParseExact: true,
+ weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'),
+ weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'),
+ weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat: {
+ LT: 'H:mm',
+ LTS : 'H:mm:ss',
+ L: 'DD.MM.YYYY',
+ LL: 'D. MMMM YYYY',
+ LLL: 'D. MMMM YYYY H:mm',
+ LLLL: 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar: {
+ sameDay: '[данас у] LT',
+ nextDay: '[сутра у] LT',
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[у] [недељу] [у] LT';
+ case 3:
+ return '[у] [среду] [у] LT';
+ case 6:
+ return '[у] [суботу] [у] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[у] dddd [у] LT';
+ }
+ },
+ lastDay : '[јуче у] LT',
+ lastWeek : function () {
+ var lastWeekDays = [
+ '[прошле] [недеље] [у] LT',
+ '[прошлог] [понедељка] [у] LT',
+ '[прошлог] [уторка] [у] LT',
+ '[прошле] [среде] [у] LT',
+ '[прошлог] [четвртка] [у] LT',
+ '[прошлог] [петка] [у] LT',
+ '[прошле] [суботе] [у] LT'
+ ];
+ return lastWeekDays[this.day()];
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'за %s',
+ past : 'пре %s',
+ s : 'неколико секунди',
+ m : translator.translate,
+ mm : translator.translate,
+ h : translator.translate,
+ hh : translator.translate,
+ d : 'дан',
+ dd : translator.translate,
+ M : 'месец',
+ MM : translator.translate,
+ y : 'годину',
+ yy : translator.translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return srCyrl;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sr.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sr.js
new file mode 100644
index 00000000000..9c254444ff3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sr.js
@@ -0,0 +1,110 @@
+//! moment.js locale configuration
+//! locale : Serbian [sr]
+//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var translator = {
+ words: { //Different grammatical cases
+ m: ['jedan minut', 'jedne minute'],
+ mm: ['minut', 'minute', 'minuta'],
+ h: ['jedan sat', 'jednog sata'],
+ hh: ['sat', 'sata', 'sati'],
+ dd: ['dan', 'dana', 'dana'],
+ MM: ['mesec', 'meseca', 'meseci'],
+ yy: ['godina', 'godine', 'godina']
+ },
+ correctGrammaticalCase: function (number, wordKey) {
+ return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
+ },
+ translate: function (number, withoutSuffix, key) {
+ var wordKey = translator.words[key];
+ if (key.length === 1) {
+ return withoutSuffix ? wordKey[0] : wordKey[1];
+ } else {
+ return number + ' ' + translator.correctGrammaticalCase(number, wordKey);
+ }
+ }
+};
+
+var sr = moment.defineLocale('sr', {
+ months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'),
+ monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
+ monthsParseExact: true,
+ weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split('_'),
+ weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'),
+ weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat: {
+ LT: 'H:mm',
+ LTS : 'H:mm:ss',
+ L: 'DD.MM.YYYY',
+ LL: 'D. MMMM YYYY',
+ LLL: 'D. MMMM YYYY H:mm',
+ LLLL: 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar: {
+ sameDay: '[danas u] LT',
+ nextDay: '[sutra u] LT',
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[u] [nedelju] [u] LT';
+ case 3:
+ return '[u] [sredu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ },
+ lastDay : '[juče u] LT',
+ lastWeek : function () {
+ var lastWeekDays = [
+ '[prošle] [nedelje] [u] LT',
+ '[prošlog] [ponedeljka] [u] LT',
+ '[prošlog] [utorka] [u] LT',
+ '[prošle] [srede] [u] LT',
+ '[prošlog] [četvrtka] [u] LT',
+ '[prošlog] [petka] [u] LT',
+ '[prošle] [subote] [u] LT'
+ ];
+ return lastWeekDays[this.day()];
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'pre %s',
+ s : 'nekoliko sekundi',
+ m : translator.translate,
+ mm : translator.translate,
+ h : translator.translate,
+ hh : translator.translate,
+ d : 'dan',
+ dd : translator.translate,
+ M : 'mesec',
+ MM : translator.translate,
+ y : 'godinu',
+ yy : translator.translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return sr;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ss.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ss.js
new file mode 100644
index 00000000000..f2363573870
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ss.js
@@ -0,0 +1,89 @@
+//! moment.js locale configuration
+//! locale : siSwati [ss]
+//! author : Nicolai Davies<mail@nicolai.io> : https://github.com/nicolaidavies
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+
+var ss = moment.defineLocale('ss', {
+ months : "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split('_'),
+ monthsShort : 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'),
+ weekdays : 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split('_'),
+ weekdaysShort : 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'),
+ weekdaysMin : 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[Namuhla nga] LT',
+ nextDay : '[Kusasa nga] LT',
+ nextWeek : 'dddd [nga] LT',
+ lastDay : '[Itolo nga] LT',
+ lastWeek : 'dddd [leliphelile] [nga] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'nga %s',
+ past : 'wenteka nga %s',
+ s : 'emizuzwana lomcane',
+ m : 'umzuzu',
+ mm : '%d emizuzu',
+ h : 'lihora',
+ hh : '%d emahora',
+ d : 'lilanga',
+ dd : '%d emalanga',
+ M : 'inyanga',
+ MM : '%d tinyanga',
+ y : 'umnyaka',
+ yy : '%d iminyaka'
+ },
+ meridiemParse: /ekuseni|emini|entsambama|ebusuku/,
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'ekuseni';
+ } else if (hours < 15) {
+ return 'emini';
+ } else if (hours < 19) {
+ return 'entsambama';
+ } else {
+ return 'ebusuku';
+ }
+ },
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'ekuseni') {
+ return hour;
+ } else if (meridiem === 'emini') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') {
+ if (hour === 0) {
+ return 0;
+ }
+ return hour + 12;
+ }
+ },
+ ordinalParse: /\d{1,2}/,
+ ordinal : '%d',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return ss;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sv.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sv.js
new file mode 100644
index 00000000000..77a3402b229
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sv.js
@@ -0,0 +1,69 @@
+//! moment.js locale configuration
+//! locale : Swedish [sv]
+//! author : Jens Alm : https://github.com/ulmus
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var sv = moment.defineLocale('sv', {
+ months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
+ weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),
+ weekdaysShort : 'sön_mån_tis_ons_tor_fre_lör'.split('_'),
+ weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'YYYY-MM-DD',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [kl.] HH:mm',
+ LLLL : 'dddd D MMMM YYYY [kl.] HH:mm',
+ lll : 'D MMM YYYY HH:mm',
+ llll : 'ddd D MMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Idag] LT',
+ nextDay: '[Imorgon] LT',
+ lastDay: '[Igår] LT',
+ nextWeek: '[På] dddd LT',
+ lastWeek: '[I] dddd[s] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'om %s',
+ past : 'för %s sedan',
+ s : 'några sekunder',
+ m : 'en minut',
+ mm : '%d minuter',
+ h : 'en timme',
+ hh : '%d timmar',
+ d : 'en dag',
+ dd : '%d dagar',
+ M : 'en månad',
+ MM : '%d månader',
+ y : 'ett år',
+ yy : '%d år'
+ },
+ ordinalParse: /\d{1,2}(e|a)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'e' :
+ (b === 1) ? 'a' :
+ (b === 2) ? 'a' :
+ (b === 3) ? 'e' : 'e';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return sv;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sw.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sw.js
new file mode 100644
index 00000000000..9ed314f5631
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/sw.js
@@ -0,0 +1,59 @@
+//! moment.js locale configuration
+//! locale : Swahili [sw]
+//! author : Fahad Kassim : https://github.com/fadsel
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var sw = moment.defineLocale('sw', {
+ months : 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'),
+ monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'),
+ weekdays : 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'),
+ weekdaysShort : 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'),
+ weekdaysMin : 'J2_J3_J4_J5_Al_Ij_J1'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[leo saa] LT',
+ nextDay : '[kesho saa] LT',
+ nextWeek : '[wiki ijayo] dddd [saat] LT',
+ lastDay : '[jana] LT',
+ lastWeek : '[wiki iliyopita] dddd [saat] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s baadaye',
+ past : 'tokea %s',
+ s : 'hivi punde',
+ m : 'dakika moja',
+ mm : 'dakika %d',
+ h : 'saa limoja',
+ hh : 'masaa %d',
+ d : 'siku moja',
+ dd : 'masiku %d',
+ M : 'mwezi mmoja',
+ MM : 'miezi %d',
+ y : 'mwaka mmoja',
+ yy : 'miaka %d'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return sw;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ta.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ta.js
new file mode 100644
index 00000000000..043ae6007ad
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/ta.js
@@ -0,0 +1,130 @@
+//! moment.js locale configuration
+//! locale : Tamil [ta]
+//! author : Arjunkumar Krishnamoorthy : https://github.com/tk120404
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var symbolMap = {
+ '1': '௧',
+ '2': '௨',
+ '3': '௩',
+ '4': '௪',
+ '5': '௫',
+ '6': '௬',
+ '7': '௭',
+ '8': '௮',
+ '9': '௯',
+ '0': '௦'
+};
+var numberMap = {
+ '௧': '1',
+ '௨': '2',
+ '௩': '3',
+ '௪': '4',
+ '௫': '5',
+ '௬': '6',
+ '௭': '7',
+ '௮': '8',
+ '௯': '9',
+ '௦': '0'
+};
+
+var ta = moment.defineLocale('ta', {
+ months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),
+ monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),
+ weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'),
+ weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split('_'),
+ weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, HH:mm',
+ LLLL : 'dddd, D MMMM YYYY, HH:mm'
+ },
+ calendar : {
+ sameDay : '[இன்று] LT',
+ nextDay : '[நாளை] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[நேற்று] LT',
+ lastWeek : '[கடந்த வாரம்] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s இல்',
+ past : '%s முன்',
+ s : 'ஒரு சில விநாடிகள்',
+ m : 'ஒரு நிமிடம்',
+ mm : '%d நிமிடங்கள்',
+ h : 'ஒரு மணி நேரம்',
+ hh : '%d மணி நேரம்',
+ d : 'ஒரு நாள்',
+ dd : '%d நாட்கள்',
+ M : 'ஒரு மாதம்',
+ MM : '%d மாதங்கள்',
+ y : 'ஒரு வருடம்',
+ yy : '%d ஆண்டுகள்'
+ },
+ ordinalParse: /\d{1,2}வது/,
+ ordinal : function (number) {
+ return number + 'வது';
+ },
+ preparse: function (string) {
+ return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ // refer http://ta.wikipedia.org/s/1er1
+ meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 2) {
+ return ' யாமம்';
+ } else if (hour < 6) {
+ return ' வைகறை'; // வைகறை
+ } else if (hour < 10) {
+ return ' காலை'; // காலை
+ } else if (hour < 14) {
+ return ' நண்பகல்'; // நண்பகல்
+ } else if (hour < 18) {
+ return ' எற்பாடு'; // எற்பாடு
+ } else if (hour < 22) {
+ return ' மாலை'; // மாலை
+ } else {
+ return ' யாமம்';
+ }
+ },
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'யாமம்') {
+ return hour < 2 ? hour : hour + 12;
+ } else if (meridiem === 'வைகறை' || meridiem === 'காலை') {
+ return hour;
+ } else if (meridiem === 'நண்பகல்') {
+ return hour >= 10 ? hour : hour + 12;
+ } else {
+ return hour + 12;
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return ta;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/te.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/te.js
new file mode 100644
index 00000000000..ac6ef033752
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/te.js
@@ -0,0 +1,89 @@
+//! moment.js locale configuration
+//! locale : Telugu [te]
+//! author : Krishna Chaitanya Thota : https://github.com/kcthota
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var te = moment.defineLocale('te', {
+ months : 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జూలై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'),
+ monthsShort : 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జూలై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split('_'),
+ weekdaysShort : 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'),
+ weekdaysMin : 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm',
+ LTS : 'A h:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm'
+ },
+ calendar : {
+ sameDay : '[నేడు] LT',
+ nextDay : '[రేపు] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[నిన్న] LT',
+ lastWeek : '[గత] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s లో',
+ past : '%s క్రితం',
+ s : 'కొన్ని క్షణాలు',
+ m : 'ఒక నిమిషం',
+ mm : '%d నిమిషాలు',
+ h : 'ఒక గంట',
+ hh : '%d గంటలు',
+ d : 'ఒక రోజు',
+ dd : '%d రోజులు',
+ M : 'ఒక నెల',
+ MM : '%d నెలలు',
+ y : 'ఒక సంవత్సరం',
+ yy : '%d సంవత్సరాలు'
+ },
+ ordinalParse : /\d{1,2}వ/,
+ ordinal : '%dవ',
+ meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'రాత్రి') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'ఉదయం') {
+ return hour;
+ } else if (meridiem === 'మధ్యాహ్నం') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'సాయంత్రం') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'రాత్రి';
+ } else if (hour < 10) {
+ return 'ఉదయం';
+ } else if (hour < 17) {
+ return 'మధ్యాహ్నం';
+ } else if (hour < 20) {
+ return 'సాయంత్రం';
+ } else {
+ return 'రాత్రి';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return te;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tet.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tet.js
new file mode 100644
index 00000000000..e419ef32339
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tet.js
@@ -0,0 +1,68 @@
+//! moment.js locale configuration
+//! locale : Tetun Dili (East Timor) [tet]
+//! author : Joshua Brooks : https://github.com/joshbrooks
+//! author : Onorio De J. Afonso : https://github.com/marobo
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var tet = moment.defineLocale('tet', {
+ months : 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juniu_Juliu_Augustu_Setembru_Outubru_Novembru_Dezembru'.split('_'),
+ monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Aug_Set_Out_Nov_Dez'.split('_'),
+ weekdays : 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sexta_Sabadu'.split('_'),
+ weekdaysShort : 'Dom_Seg_Ters_Kua_Kint_Sext_Sab'.split('_'),
+ weekdaysMin : 'Do_Seg_Te_Ku_Ki_Sex_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Ohin iha] LT',
+ nextDay: '[Aban iha] LT',
+ nextWeek: 'dddd [iha] LT',
+ lastDay: '[Horiseik iha] LT',
+ lastWeek: 'dddd [semana kotuk] [iha] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'iha %s',
+ past : '%s liuba',
+ s : 'minutu balun',
+ m : 'minutu ida',
+ mm : 'minutus %d',
+ h : 'horas ida',
+ hh : 'horas %d',
+ d : 'loron ida',
+ dd : 'loron %d',
+ M : 'fulan ida',
+ MM : 'fulan %d',
+ y : 'tinan ida',
+ yy : 'tinan %d'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return tet;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/th.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/th.js
new file mode 100644
index 00000000000..22f6ab9a480
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/th.js
@@ -0,0 +1,67 @@
+//! moment.js locale configuration
+//! locale : Thai [th]
+//! author : Kridsada Thanabulpong : https://github.com/sirn
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var th = moment.defineLocale('th', {
+ months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'),
+ monthsShort : 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),
+ weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference
+ weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'YYYY/MM/DD',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY เวลา H:mm',
+ LLLL : 'วันddddที่ D MMMM YYYY เวลา H:mm'
+ },
+ meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/,
+ isPM: function (input) {
+ return input === 'หลังเที่ยง';
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'ก่อนเที่ยง';
+ } else {
+ return 'หลังเที่ยง';
+ }
+ },
+ calendar : {
+ sameDay : '[วันนี้ เวลา] LT',
+ nextDay : '[พรุ่งนี้ เวลา] LT',
+ nextWeek : 'dddd[หน้า เวลา] LT',
+ lastDay : '[เมื่อวานนี้ เวลา] LT',
+ lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'อีก %s',
+ past : '%sที่แล้ว',
+ s : 'ไม่กี่วินาที',
+ m : '1 นาที',
+ mm : '%d นาที',
+ h : '1 ชั่วโมง',
+ hh : '%d ชั่วโมง',
+ d : '1 วัน',
+ dd : '%d วัน',
+ M : '1 เดือน',
+ MM : '%d เดือน',
+ y : '1 ปี',
+ yy : '%d ปี'
+ }
+});
+
+return th;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tl-ph.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tl-ph.js
new file mode 100644
index 00000000000..a37b86e7131
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tl-ph.js
@@ -0,0 +1,62 @@
+//! moment.js locale configuration
+//! locale : Tagalog (Philippines) [tl-ph]
+//! author : Dan Hagman : https://github.com/hagmandan
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var tlPh = moment.defineLocale('tl-ph', {
+ months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'),
+ monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),
+ weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'),
+ weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),
+ weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'MM/D/YYYY',
+ LL : 'MMMM D, YYYY',
+ LLL : 'MMMM D, YYYY HH:mm',
+ LLLL : 'dddd, MMMM DD, YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: 'LT [ngayong araw]',
+ nextDay: '[Bukas ng] LT',
+ nextWeek: 'LT [sa susunod na] dddd',
+ lastDay: 'LT [kahapon]',
+ lastWeek: 'LT [noong nakaraang] dddd',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'sa loob ng %s',
+ past : '%s ang nakalipas',
+ s : 'ilang segundo',
+ m : 'isang minuto',
+ mm : '%d minuto',
+ h : 'isang oras',
+ hh : '%d oras',
+ d : 'isang araw',
+ dd : '%d araw',
+ M : 'isang buwan',
+ MM : '%d buwan',
+ y : 'isang taon',
+ yy : '%d taon'
+ },
+ ordinalParse: /\d{1,2}/,
+ ordinal : function (number) {
+ return number;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return tlPh;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tlh.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tlh.js
new file mode 100644
index 00000000000..7eb7df9c520
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tlh.js
@@ -0,0 +1,120 @@
+//! moment.js locale configuration
+//! locale : Klingon [tlh]
+//! author : Dominika Kruk : https://github.com/amaranthrose
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_');
+
+function translateFuture(output) {
+ var time = output;
+ time = (output.indexOf('jaj') !== -1) ?
+ time.slice(0, -3) + 'leS' :
+ (output.indexOf('jar') !== -1) ?
+ time.slice(0, -3) + 'waQ' :
+ (output.indexOf('DIS') !== -1) ?
+ time.slice(0, -3) + 'nem' :
+ time + ' pIq';
+ return time;
+}
+
+function translatePast(output) {
+ var time = output;
+ time = (output.indexOf('jaj') !== -1) ?
+ time.slice(0, -3) + 'Hu’' :
+ (output.indexOf('jar') !== -1) ?
+ time.slice(0, -3) + 'wen' :
+ (output.indexOf('DIS') !== -1) ?
+ time.slice(0, -3) + 'ben' :
+ time + ' ret';
+ return time;
+}
+
+function translate(number, withoutSuffix, string, isFuture) {
+ var numberNoun = numberAsNoun(number);
+ switch (string) {
+ case 'mm':
+ return numberNoun + ' tup';
+ case 'hh':
+ return numberNoun + ' rep';
+ case 'dd':
+ return numberNoun + ' jaj';
+ case 'MM':
+ return numberNoun + ' jar';
+ case 'yy':
+ return numberNoun + ' DIS';
+ }
+}
+
+function numberAsNoun(number) {
+ var hundred = Math.floor((number % 1000) / 100),
+ ten = Math.floor((number % 100) / 10),
+ one = number % 10,
+ word = '';
+ if (hundred > 0) {
+ word += numbersNouns[hundred] + 'vatlh';
+ }
+ if (ten > 0) {
+ word += ((word !== '') ? ' ' : '') + numbersNouns[ten] + 'maH';
+ }
+ if (one > 0) {
+ word += ((word !== '') ? ' ' : '') + numbersNouns[one];
+ }
+ return (word === '') ? 'pagh' : word;
+}
+
+var tlh = moment.defineLocale('tlh', {
+ months : 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split('_'),
+ monthsShort : 'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
+ weekdaysShort : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
+ weekdaysMin : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[DaHjaj] LT',
+ nextDay: '[wa’leS] LT',
+ nextWeek: 'LLL',
+ lastDay: '[wa’Hu’] LT',
+ lastWeek: 'LLL',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : translateFuture,
+ past : translatePast,
+ s : 'puS lup',
+ m : 'wa’ tup',
+ mm : translate,
+ h : 'wa’ rep',
+ hh : translate,
+ d : 'wa’ jaj',
+ dd : translate,
+ M : 'wa’ jar',
+ MM : translate,
+ y : 'wa’ DIS',
+ yy : translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return tlh;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tr.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tr.js
new file mode 100644
index 00000000000..425386f369a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tr.js
@@ -0,0 +1,90 @@
+//! moment.js locale configuration
+//! locale : Turkish [tr]
+//! authors : Erhan Gundogan : https://github.com/erhangundogan,
+//! Burak Yiğit Kaya: https://github.com/BYK
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var suffixes = {
+ 1: '\'inci',
+ 5: '\'inci',
+ 8: '\'inci',
+ 70: '\'inci',
+ 80: '\'inci',
+ 2: '\'nci',
+ 7: '\'nci',
+ 20: '\'nci',
+ 50: '\'nci',
+ 3: '\'üncü',
+ 4: '\'üncü',
+ 100: '\'üncü',
+ 6: '\'ncı',
+ 9: '\'uncu',
+ 10: '\'uncu',
+ 30: '\'uncu',
+ 60: '\'ıncı',
+ 90: '\'ıncı'
+};
+
+var tr = moment.defineLocale('tr', {
+ months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'),
+ monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'),
+ weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'),
+ weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'),
+ weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[bugün saat] LT',
+ nextDay : '[yarın saat] LT',
+ nextWeek : '[haftaya] dddd [saat] LT',
+ lastDay : '[dün] LT',
+ lastWeek : '[geçen hafta] dddd [saat] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s sonra',
+ past : '%s önce',
+ s : 'birkaç saniye',
+ m : 'bir dakika',
+ mm : '%d dakika',
+ h : 'bir saat',
+ hh : '%d saat',
+ d : 'bir gün',
+ dd : '%d gün',
+ M : 'bir ay',
+ MM : '%d ay',
+ y : 'bir yıl',
+ yy : '%d yıl'
+ },
+ ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,
+ ordinal : function (number) {
+ if (number === 0) { // special case for zero
+ return number + '\'ıncı';
+ }
+ var a = number % 10,
+ b = number % 100 - a,
+ c = number >= 100 ? 100 : null;
+ return number + (suffixes[a] || suffixes[b] || suffixes[c]);
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return tr;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tzl.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tzl.js
new file mode 100644
index 00000000000..bd7537c54cd
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tzl.js
@@ -0,0 +1,91 @@
+//! moment.js locale configuration
+//! locale : Talossan [tzl]
+//! author : Robin van der Vliet : https://github.com/robin0van0der0v
+//! author : Iustì Canun
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+// After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals.
+// This is currently too difficult (maybe even impossible) to add.
+var tzl = moment.defineLocale('tzl', {
+ months : 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split('_'),
+ monthsShort : 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'),
+ weekdays : 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'),
+ weekdaysShort : 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'),
+ weekdaysMin : 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM [dallas] YYYY',
+ LLL : 'D. MMMM [dallas] YYYY HH.mm',
+ LLLL : 'dddd, [li] D. MMMM [dallas] YYYY HH.mm'
+ },
+ meridiemParse: /d\'o|d\'a/i,
+ isPM : function (input) {
+ return 'd\'o' === input.toLowerCase();
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'd\'o' : 'D\'O';
+ } else {
+ return isLower ? 'd\'a' : 'D\'A';
+ }
+ },
+ calendar : {
+ sameDay : '[oxhi à] LT',
+ nextDay : '[demà à] LT',
+ nextWeek : 'dddd [à] LT',
+ lastDay : '[ieiri à] LT',
+ lastWeek : '[sür el] dddd [lasteu à] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'osprei %s',
+ past : 'ja%s',
+ s : processRelativeTime,
+ m : processRelativeTime,
+ mm : processRelativeTime,
+ h : processRelativeTime,
+ hh : processRelativeTime,
+ d : processRelativeTime,
+ dd : processRelativeTime,
+ M : processRelativeTime,
+ MM : processRelativeTime,
+ y : processRelativeTime,
+ yy : processRelativeTime
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+function processRelativeTime(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 's': ['viensas secunds', '\'iensas secunds'],
+ 'm': ['\'n míut', '\'iens míut'],
+ 'mm': [number + ' míuts', '' + number + ' míuts'],
+ 'h': ['\'n þora', '\'iensa þora'],
+ 'hh': [number + ' þoras', '' + number + ' þoras'],
+ 'd': ['\'n ziua', '\'iensa ziua'],
+ 'dd': [number + ' ziuas', '' + number + ' ziuas'],
+ 'M': ['\'n mes', '\'iens mes'],
+ 'MM': [number + ' mesen', '' + number + ' mesen'],
+ 'y': ['\'n ar', '\'iens ar'],
+ 'yy': [number + ' ars', '' + number + ' ars']
+ };
+ return isFuture ? format[key][0] : (withoutSuffix ? format[key][0] : format[key][1]);
+}
+
+return tzl;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tzm-latn.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tzm-latn.js
new file mode 100644
index 00000000000..4d742c52fe8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tzm-latn.js
@@ -0,0 +1,58 @@
+//! moment.js locale configuration
+//! locale : Central Atlas Tamazight Latin [tzm-latn]
+//! author : Abdel Said : https://github.com/abdelsaid
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var tzmLatn = moment.defineLocale('tzm-latn', {
+ months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),
+ monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),
+ weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
+ weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
+ weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[asdkh g] LT',
+ nextDay: '[aska g] LT',
+ nextWeek: 'dddd [g] LT',
+ lastDay: '[assant g] LT',
+ lastWeek: 'dddd [g] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'dadkh s yan %s',
+ past : 'yan %s',
+ s : 'imik',
+ m : 'minuḍ',
+ mm : '%d minuḍ',
+ h : 'saɛa',
+ hh : '%d tassaɛin',
+ d : 'ass',
+ dd : '%d ossan',
+ M : 'ayowr',
+ MM : '%d iyyirn',
+ y : 'asgas',
+ yy : '%d isgasn'
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return tzmLatn;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tzm.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tzm.js
new file mode 100644
index 00000000000..1d1c26006d3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/tzm.js
@@ -0,0 +1,58 @@
+//! moment.js locale configuration
+//! locale : Central Atlas Tamazight [tzm]
+//! author : Abdel Said : https://github.com/abdelsaid
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var tzm = moment.defineLocale('tzm', {
+ months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),
+ monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),
+ weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
+ weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
+ weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[ⴰⵙⴷⵅ ⴴ] LT',
+ nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',
+ nextWeek: 'dddd [ⴴ] LT',
+ lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',
+ lastWeek: 'dddd [ⴴ] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s',
+ past : 'ⵢⴰⵏ %s',
+ s : 'ⵉⵎⵉⴽ',
+ m : 'ⵎⵉⵏⵓⴺ',
+ mm : '%d ⵎⵉⵏⵓⴺ',
+ h : 'ⵙⴰⵄⴰ',
+ hh : '%d ⵜⴰⵙⵙⴰⵄⵉⵏ',
+ d : 'ⴰⵙⵙ',
+ dd : '%d oⵙⵙⴰⵏ',
+ M : 'ⴰⵢoⵓⵔ',
+ MM : '%d ⵉⵢⵢⵉⵔⵏ',
+ y : 'ⴰⵙⴳⴰⵙ',
+ yy : '%d ⵉⵙⴳⴰⵙⵏ'
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return tzm;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/uk.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/uk.js
new file mode 100644
index 00000000000..af79fab5042
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/uk.js
@@ -0,0 +1,146 @@
+//! moment.js locale configuration
+//! locale : Ukrainian [uk]
+//! author : zemlanin : https://github.com/zemlanin
+//! Author : Menelion Elensúle : https://github.com/Oire
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+function plural(word, num) {
+ var forms = word.split('_');
+ return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+}
+function relativeTimeWithPlural(number, withoutSuffix, key) {
+ var format = {
+ 'mm': withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин',
+ 'hh': withoutSuffix ? 'година_години_годин' : 'годину_години_годин',
+ 'dd': 'день_дні_днів',
+ 'MM': 'місяць_місяці_місяців',
+ 'yy': 'рік_роки_років'
+ };
+ if (key === 'm') {
+ return withoutSuffix ? 'хвилина' : 'хвилину';
+ }
+ else if (key === 'h') {
+ return withoutSuffix ? 'година' : 'годину';
+ }
+ else {
+ return number + ' ' + plural(format[key], +number);
+ }
+}
+function weekdaysCaseReplace(m, format) {
+ var weekdays = {
+ 'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'),
+ 'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'),
+ 'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_')
+ },
+ nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ?
+ 'accusative' :
+ ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ?
+ 'genitive' :
+ 'nominative');
+ return weekdays[nounCase][m.day()];
+}
+function processHoursFunction(str) {
+ return function () {
+ return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
+ };
+}
+
+var uk = moment.defineLocale('uk', {
+ months : {
+ 'format': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_'),
+ 'standalone': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_')
+ },
+ monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'),
+ weekdays : weekdaysCaseReplace,
+ weekdaysShort : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
+ weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY р.',
+ LLL : 'D MMMM YYYY р., HH:mm',
+ LLLL : 'dddd, D MMMM YYYY р., HH:mm'
+ },
+ calendar : {
+ sameDay: processHoursFunction('[Сьогодні '),
+ nextDay: processHoursFunction('[Завтра '),
+ lastDay: processHoursFunction('[Вчора '),
+ nextWeek: processHoursFunction('[У] dddd ['),
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ case 5:
+ case 6:
+ return processHoursFunction('[Минулої] dddd [').call(this);
+ case 1:
+ case 2:
+ case 4:
+ return processHoursFunction('[Минулого] dddd [').call(this);
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'за %s',
+ past : '%s тому',
+ s : 'декілька секунд',
+ m : relativeTimeWithPlural,
+ mm : relativeTimeWithPlural,
+ h : 'годину',
+ hh : relativeTimeWithPlural,
+ d : 'день',
+ dd : relativeTimeWithPlural,
+ M : 'місяць',
+ MM : relativeTimeWithPlural,
+ y : 'рік',
+ yy : relativeTimeWithPlural
+ },
+ // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
+ meridiemParse: /ночі|ранку|дня|вечора/,
+ isPM: function (input) {
+ return /^(дня|вечора)$/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'ночі';
+ } else if (hour < 12) {
+ return 'ранку';
+ } else if (hour < 17) {
+ return 'дня';
+ } else {
+ return 'вечора';
+ }
+ },
+ ordinalParse: /\d{1,2}-(й|го)/,
+ ordinal: function (number, period) {
+ switch (period) {
+ case 'M':
+ case 'd':
+ case 'DDD':
+ case 'w':
+ case 'W':
+ return number + '-й';
+ case 'D':
+ return number + '-го';
+ default:
+ return number;
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+return uk;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/uz.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/uz.js
new file mode 100644
index 00000000000..378461eb003
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/uz.js
@@ -0,0 +1,58 @@
+//! moment.js locale configuration
+//! locale : Uzbek [uz]
+//! author : Sardor Muminov : https://github.com/muminoff
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var uz = moment.defineLocale('uz', {
+ months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'),
+ monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
+ weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),
+ weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'),
+ weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'D MMMM YYYY, dddd HH:mm'
+ },
+ calendar : {
+ sameDay : '[Бугун соат] LT [да]',
+ nextDay : '[Эртага] LT [да]',
+ nextWeek : 'dddd [куни соат] LT [да]',
+ lastDay : '[Кеча соат] LT [да]',
+ lastWeek : '[Утган] dddd [куни соат] LT [да]',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'Якин %s ичида',
+ past : 'Бир неча %s олдин',
+ s : 'фурсат',
+ m : 'бир дакика',
+ mm : '%d дакика',
+ h : 'бир соат',
+ hh : '%d соат',
+ d : 'бир кун',
+ dd : '%d кун',
+ M : 'бир ой',
+ MM : '%d ой',
+ y : 'бир йил',
+ yy : '%d йил'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return uz;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/vi.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/vi.js
new file mode 100644
index 00000000000..7af5cce188e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/vi.js
@@ -0,0 +1,79 @@
+//! moment.js locale configuration
+//! locale : Vietnamese [vi]
+//! author : Bang Nguyen : https://github.com/bangnk
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var vi = moment.defineLocale('vi', {
+ months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'),
+ monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'),
+ weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
+ weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
+ weekdaysParseExact : true,
+ meridiemParse: /sa|ch/i,
+ isPM : function (input) {
+ return /^ch$/i.test(input);
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 12) {
+ return isLower ? 'sa' : 'SA';
+ } else {
+ return isLower ? 'ch' : 'CH';
+ }
+ },
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM [năm] YYYY',
+ LLL : 'D MMMM [năm] YYYY HH:mm',
+ LLLL : 'dddd, D MMMM [năm] YYYY HH:mm',
+ l : 'DD/M/YYYY',
+ ll : 'D MMM YYYY',
+ lll : 'D MMM YYYY HH:mm',
+ llll : 'ddd, D MMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Hôm nay lúc] LT',
+ nextDay: '[Ngày mai lúc] LT',
+ nextWeek: 'dddd [tuần tới lúc] LT',
+ lastDay: '[Hôm qua lúc] LT',
+ lastWeek: 'dddd [tuần rồi lúc] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : '%s tới',
+ past : '%s trước',
+ s : 'vài giây',
+ m : 'một phút',
+ mm : '%d phút',
+ h : 'một giờ',
+ hh : '%d giờ',
+ d : 'một ngày',
+ dd : '%d ngày',
+ M : 'một tháng',
+ MM : '%d tháng',
+ y : 'một năm',
+ yy : '%d năm'
+ },
+ ordinalParse: /\d{1,2}/,
+ ordinal : function (number) {
+ return number;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return vi;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/x-pseudo.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/x-pseudo.js
new file mode 100644
index 00000000000..ee24b9f0951
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/x-pseudo.js
@@ -0,0 +1,68 @@
+//! moment.js locale configuration
+//! locale : Pseudo [x-pseudo]
+//! author : Andrew Hood : https://github.com/andrewhood125
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var xPseudo = moment.defineLocale('x-pseudo', {
+ months : 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split('_'),
+ monthsShort : 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split('_'),
+ weekdaysShort : 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'),
+ weekdaysMin : 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[T~ódá~ý át] LT',
+ nextDay : '[T~ómó~rró~w át] LT',
+ nextWeek : 'dddd [át] LT',
+ lastDay : '[Ý~ést~érdá~ý át] LT',
+ lastWeek : '[L~ást] dddd [át] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'í~ñ %s',
+ past : '%s á~gó',
+ s : 'á ~féw ~sécó~ñds',
+ m : 'á ~míñ~úté',
+ mm : '%d m~íñú~tés',
+ h : 'á~ñ hó~úr',
+ hh : '%d h~óúrs',
+ d : 'á ~dáý',
+ dd : '%d d~áýs',
+ M : 'á ~móñ~th',
+ MM : '%d m~óñt~hs',
+ y : 'á ~ýéár',
+ yy : '%d ý~éárs'
+ },
+ ordinalParse: /\d{1,2}(th|st|nd|rd)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return xPseudo;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/yo.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/yo.js
new file mode 100644
index 00000000000..760ac96254c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/yo.js
@@ -0,0 +1,60 @@
+//! moment.js locale configuration
+//! locale : Yoruba Nigeria [yo]
+//! author : Atolagbe Abisoye : https://github.com/andela-batolagbe
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var yo = moment.defineLocale('yo', {
+ months : 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split('_'),
+ monthsShort : 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'),
+ weekdays : 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'),
+ weekdaysShort : 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'),
+ weekdaysMin : 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'),
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[Ònì ni] LT',
+ nextDay : '[Ọ̀la ni] LT',
+ nextWeek : 'dddd [Ọsẹ̀ tón\'bọ] [ni] LT',
+ lastDay : '[Àna ni] LT',
+ lastWeek : 'dddd [Ọsẹ̀ tólọ́] [ni] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'ní %s',
+ past : '%s kọjá',
+ s : 'ìsẹjú aayá die',
+ m : 'ìsẹjú kan',
+ mm : 'ìsẹjú %d',
+ h : 'wákati kan',
+ hh : 'wákati %d',
+ d : 'ọjọ́ kan',
+ dd : 'ọjọ́ %d',
+ M : 'osù kan',
+ MM : 'osù %d',
+ y : 'ọdún kan',
+ yy : 'ọdún %d'
+ },
+ ordinalParse : /ọjọ́\s\d{1,2}/,
+ ordinal : 'ọjọ́ %d',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return yo;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/zh-cn.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/zh-cn.js
new file mode 100644
index 00000000000..df5d2039464
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/zh-cn.js
@@ -0,0 +1,127 @@
+//! moment.js locale configuration
+//! locale : Chinese (China) [zh-cn]
+//! author : suupic : https://github.com/suupic
+//! author : Zeno Zeng : https://github.com/zenozeng
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var zhCn = moment.defineLocale('zh-cn', {
+ months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
+ monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+ weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
+ weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'),
+ weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
+ longDateFormat : {
+ LT : 'Ah点mm分',
+ LTS : 'Ah点m分s秒',
+ L : 'YYYY-MM-DD',
+ LL : 'YYYY年MMMD日',
+ LLL : 'YYYY年MMMD日Ah点mm分',
+ LLLL : 'YYYY年MMMD日ddddAh点mm分',
+ l : 'YYYY-MM-DD',
+ ll : 'YYYY年MMMD日',
+ lll : 'YYYY年MMMD日Ah点mm分',
+ llll : 'YYYY年MMMD日ddddAh点mm分'
+ },
+ meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
+ meridiemHour: function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === '凌晨' || meridiem === '早上' ||
+ meridiem === '上午') {
+ return hour;
+ } else if (meridiem === '下午' || meridiem === '晚上') {
+ return hour + 12;
+ } else {
+ // '中午'
+ return hour >= 11 ? hour : hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ var hm = hour * 100 + minute;
+ if (hm < 600) {
+ return '凌晨';
+ } else if (hm < 900) {
+ return '早上';
+ } else if (hm < 1130) {
+ return '上午';
+ } else if (hm < 1230) {
+ return '中午';
+ } else if (hm < 1800) {
+ return '下午';
+ } else {
+ return '晚上';
+ }
+ },
+ calendar : {
+ sameDay : function () {
+ return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT';
+ },
+ nextDay : function () {
+ return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT';
+ },
+ lastDay : function () {
+ return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT';
+ },
+ nextWeek : function () {
+ var startOfWeek, prefix;
+ startOfWeek = moment().startOf('week');
+ prefix = this.diff(startOfWeek, 'days') >= 7 ? '[下]' : '[本]';
+ return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
+ },
+ lastWeek : function () {
+ var startOfWeek, prefix;
+ startOfWeek = moment().startOf('week');
+ prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]';
+ return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
+ },
+ sameElse : 'LL'
+ },
+ ordinalParse: /\d{1,2}(日|月|周)/,
+ ordinal : function (number, period) {
+ switch (period) {
+ case 'd':
+ case 'D':
+ case 'DDD':
+ return number + '日';
+ case 'M':
+ return number + '月';
+ case 'w':
+ case 'W':
+ return number + '周';
+ default:
+ return number;
+ }
+ },
+ relativeTime : {
+ future : '%s内',
+ past : '%s前',
+ s : '几秒',
+ m : '1 分钟',
+ mm : '%d 分钟',
+ h : '1 小时',
+ hh : '%d 小时',
+ d : '1 天',
+ dd : '%d 天',
+ M : '1 个月',
+ MM : '%d 个月',
+ y : '1 年',
+ yy : '%d 年'
+ },
+ week : {
+ // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+return zhCn;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/zh-hk.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/zh-hk.js
new file mode 100644
index 00000000000..f39fe3fbfc9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/zh-hk.js
@@ -0,0 +1,105 @@
+//! moment.js locale configuration
+//! locale : Chinese (Hong Kong) [zh-hk]
+//! author : Ben : https://github.com/ben-lin
+//! author : Chris Lam : https://github.com/hehachris
+//! author : Konstantin : https://github.com/skfd
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var zhHk = moment.defineLocale('zh-hk', {
+ months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
+ monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+ weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
+ weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'),
+ weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
+ longDateFormat : {
+ LT : 'Ah點mm分',
+ LTS : 'Ah點m分s秒',
+ L : 'YYYY年MMMD日',
+ LL : 'YYYY年MMMD日',
+ LLL : 'YYYY年MMMD日Ah點mm分',
+ LLLL : 'YYYY年MMMD日ddddAh點mm分',
+ l : 'YYYY年MMMD日',
+ ll : 'YYYY年MMMD日',
+ lll : 'YYYY年MMMD日Ah點mm分',
+ llll : 'YYYY年MMMD日ddddAh點mm分'
+ },
+ meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
+ return hour;
+ } else if (meridiem === '中午') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === '下午' || meridiem === '晚上') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ var hm = hour * 100 + minute;
+ if (hm < 600) {
+ return '凌晨';
+ } else if (hm < 900) {
+ return '早上';
+ } else if (hm < 1130) {
+ return '上午';
+ } else if (hm < 1230) {
+ return '中午';
+ } else if (hm < 1800) {
+ return '下午';
+ } else {
+ return '晚上';
+ }
+ },
+ calendar : {
+ sameDay : '[今天]LT',
+ nextDay : '[明天]LT',
+ nextWeek : '[下]ddddLT',
+ lastDay : '[昨天]LT',
+ lastWeek : '[上]ddddLT',
+ sameElse : 'L'
+ },
+ ordinalParse: /\d{1,2}(日|月|週)/,
+ ordinal : function (number, period) {
+ switch (period) {
+ case 'd' :
+ case 'D' :
+ case 'DDD' :
+ return number + '日';
+ case 'M' :
+ return number + '月';
+ case 'w' :
+ case 'W' :
+ return number + '週';
+ default :
+ return number;
+ }
+ },
+ relativeTime : {
+ future : '%s內',
+ past : '%s前',
+ s : '幾秒',
+ m : '1 分鐘',
+ mm : '%d 分鐘',
+ h : '1 小時',
+ hh : '%d 小時',
+ d : '1 天',
+ dd : '%d 天',
+ M : '1 個月',
+ MM : '%d 個月',
+ y : '1 年',
+ yy : '%d 年'
+ }
+});
+
+return zhHk;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/zh-tw.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/zh-tw.js
new file mode 100644
index 00000000000..2e385fb2739
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/locale/zh-tw.js
@@ -0,0 +1,104 @@
+//! moment.js locale configuration
+//! locale : Chinese (Taiwan) [zh-tw]
+//! author : Ben : https://github.com/ben-lin
+//! author : Chris Lam : https://github.com/hehachris
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+
+var zhTw = moment.defineLocale('zh-tw', {
+ months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
+ monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+ weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
+ weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'),
+ weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
+ longDateFormat : {
+ LT : 'Ah點mm分',
+ LTS : 'Ah點m分s秒',
+ L : 'YYYY年MMMD日',
+ LL : 'YYYY年MMMD日',
+ LLL : 'YYYY年MMMD日Ah點mm分',
+ LLLL : 'YYYY年MMMD日ddddAh點mm分',
+ l : 'YYYY年MMMD日',
+ ll : 'YYYY年MMMD日',
+ lll : 'YYYY年MMMD日Ah點mm分',
+ llll : 'YYYY年MMMD日ddddAh點mm分'
+ },
+ meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
+ return hour;
+ } else if (meridiem === '中午') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === '下午' || meridiem === '晚上') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ var hm = hour * 100 + minute;
+ if (hm < 600) {
+ return '凌晨';
+ } else if (hm < 900) {
+ return '早上';
+ } else if (hm < 1130) {
+ return '上午';
+ } else if (hm < 1230) {
+ return '中午';
+ } else if (hm < 1800) {
+ return '下午';
+ } else {
+ return '晚上';
+ }
+ },
+ calendar : {
+ sameDay : '[今天]LT',
+ nextDay : '[明天]LT',
+ nextWeek : '[下]ddddLT',
+ lastDay : '[昨天]LT',
+ lastWeek : '[上]ddddLT',
+ sameElse : 'L'
+ },
+ ordinalParse: /\d{1,2}(日|月|週)/,
+ ordinal : function (number, period) {
+ switch (period) {
+ case 'd' :
+ case 'D' :
+ case 'DDD' :
+ return number + '日';
+ case 'M' :
+ return number + '月';
+ case 'w' :
+ case 'W' :
+ return number + '週';
+ default :
+ return number;
+ }
+ },
+ relativeTime : {
+ future : '%s內',
+ past : '%s前',
+ s : '幾秒',
+ m : '1 分鐘',
+ mm : '%d 分鐘',
+ h : '1 小時',
+ hh : '%d 小時',
+ d : '1 天',
+ dd : '%d 天',
+ M : '1 個月',
+ MM : '%d 個月',
+ y : '1 年',
+ yy : '%d 年'
+ }
+});
+
+return zhTw;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/locales.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/locales.js
new file mode 100644
index 00000000000..a77817a8875
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/locales.js
@@ -0,0 +1,8624 @@
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+//! moment.js locale configuration
+//! locale : Afrikaans [af]
+//! author : Werner Mollentze : https://github.com/wernerm
+
+moment.defineLocale('af', {
+ months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'),
+ monthsShort : 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),
+ weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'),
+ weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),
+ weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),
+ meridiemParse: /vm|nm/i,
+ isPM : function (input) {
+ return /^nm$/i.test(input);
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 12) {
+ return isLower ? 'vm' : 'VM';
+ } else {
+ return isLower ? 'nm' : 'NM';
+ }
+ },
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Vandag om] LT',
+ nextDay : '[Môre om] LT',
+ nextWeek : 'dddd [om] LT',
+ lastDay : '[Gister om] LT',
+ lastWeek : '[Laas] dddd [om] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'oor %s',
+ past : '%s gelede',
+ s : '\'n paar sekondes',
+ m : '\'n minuut',
+ mm : '%d minute',
+ h : '\'n uur',
+ hh : '%d ure',
+ d : '\'n dag',
+ dd : '%d dae',
+ M : '\'n maand',
+ MM : '%d maande',
+ y : '\'n jaar',
+ yy : '%d jaar'
+ },
+ ordinalParse: /\d{1,2}(ste|de)/,
+ ordinal : function (number) {
+ return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter
+ },
+ week : {
+ dow : 1, // Maandag is die eerste dag van die week.
+ doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Arabic (Algeria) [ar-dz]
+//! author : Noureddine LOUAHEDJ : https://github.com/noureddineme
+
+moment.defineLocale('ar-dz', {
+ months : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ monthsShort : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort : 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin : 'أح_إث_ثلا_أر_خم_جم_سب'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[اليوم على الساعة] LT',
+ nextDay: '[غدا على الساعة] LT',
+ nextWeek: 'dddd [على الساعة] LT',
+ lastDay: '[أمس على الساعة] LT',
+ lastWeek: 'dddd [على الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'في %s',
+ past : 'منذ %s',
+ s : 'ثوان',
+ m : 'دقيقة',
+ mm : '%d دقائق',
+ h : 'ساعة',
+ hh : '%d ساعات',
+ d : 'يوم',
+ dd : '%d أيام',
+ M : 'شهر',
+ MM : '%d أشهر',
+ y : 'سنة',
+ yy : '%d سنوات'
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 4 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Arabic (Lybia) [ar-ly]
+//! author : Ali Hmer: https://github.com/kikoanis
+
+var symbolMap = {
+ '1': '1',
+ '2': '2',
+ '3': '3',
+ '4': '4',
+ '5': '5',
+ '6': '6',
+ '7': '7',
+ '8': '8',
+ '9': '9',
+ '0': '0'
+};
+var pluralForm = function (n) {
+ return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5;
+};
+var plurals = {
+ s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'],
+ m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'],
+ h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'],
+ d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'],
+ M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'],
+ y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام']
+};
+var pluralize = function (u) {
+ return function (number, withoutSuffix, string, isFuture) {
+ var f = pluralForm(number),
+ str = plurals[u][pluralForm(number)];
+ if (f === 2) {
+ str = str[withoutSuffix ? 0 : 1];
+ }
+ return str.replace(/%d/i, number);
+ };
+};
+var months = [
+ 'يناير',
+ 'فبراير',
+ 'مارس',
+ 'أبريل',
+ 'مايو',
+ 'يونيو',
+ 'يوليو',
+ 'أغسطس',
+ 'سبتمبر',
+ 'أكتوبر',
+ 'نوفمبر',
+ 'ديسمبر'
+];
+
+moment.defineLocale('ar-ly', {
+ months : months,
+ monthsShort : months,
+ weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'D/\u200FM/\u200FYYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /ص|م/,
+ isPM : function (input) {
+ return 'م' === input;
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'ص';
+ } else {
+ return 'م';
+ }
+ },
+ calendar : {
+ sameDay: '[اليوم عند الساعة] LT',
+ nextDay: '[غدًا عند الساعة] LT',
+ nextWeek: 'dddd [عند الساعة] LT',
+ lastDay: '[أمس عند الساعة] LT',
+ lastWeek: 'dddd [عند الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'بعد %s',
+ past : 'منذ %s',
+ s : pluralize('s'),
+ m : pluralize('m'),
+ mm : pluralize('m'),
+ h : pluralize('h'),
+ hh : pluralize('h'),
+ d : pluralize('d'),
+ dd : pluralize('d'),
+ M : pluralize('M'),
+ MM : pluralize('M'),
+ y : pluralize('y'),
+ yy : pluralize('y')
+ },
+ preparse: function (string) {
+ return string.replace(/\u200f/g, '').replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ }).replace(/,/g, '،');
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Arabic (Morocco) [ar-ma]
+//! author : ElFadili Yassine : https://github.com/ElFadiliY
+//! author : Abdel Said : https://github.com/abdelsaid
+
+moment.defineLocale('ar-ma', {
+ months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
+ monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
+ weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[اليوم على الساعة] LT',
+ nextDay: '[غدا على الساعة] LT',
+ nextWeek: 'dddd [على الساعة] LT',
+ lastDay: '[أمس على الساعة] LT',
+ lastWeek: 'dddd [على الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'في %s',
+ past : 'منذ %s',
+ s : 'ثوان',
+ m : 'دقيقة',
+ mm : '%d دقائق',
+ h : 'ساعة',
+ hh : '%d ساعات',
+ d : 'يوم',
+ dd : '%d أيام',
+ M : 'شهر',
+ MM : '%d أشهر',
+ y : 'سنة',
+ yy : '%d سنوات'
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Arabic (Saudi Arabia) [ar-sa]
+//! author : Suhail Alkowaileet : https://github.com/xsoh
+
+var symbolMap$1 = {
+ '1': '١',
+ '2': '٢',
+ '3': '٣',
+ '4': '٤',
+ '5': '٥',
+ '6': '٦',
+ '7': '٧',
+ '8': '٨',
+ '9': '٩',
+ '0': '٠'
+};
+var numberMap = {
+ '١': '1',
+ '٢': '2',
+ '٣': '3',
+ '٤': '4',
+ '٥': '5',
+ '٦': '6',
+ '٧': '7',
+ '٨': '8',
+ '٩': '9',
+ '٠': '0'
+};
+
+moment.defineLocale('ar-sa', {
+ months : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ monthsShort : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /ص|م/,
+ isPM : function (input) {
+ return 'م' === input;
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'ص';
+ } else {
+ return 'م';
+ }
+ },
+ calendar : {
+ sameDay: '[اليوم على الساعة] LT',
+ nextDay: '[غدا على الساعة] LT',
+ nextWeek: 'dddd [على الساعة] LT',
+ lastDay: '[أمس على الساعة] LT',
+ lastWeek: 'dddd [على الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'في %s',
+ past : 'منذ %s',
+ s : 'ثوان',
+ m : 'دقيقة',
+ mm : '%d دقائق',
+ h : 'ساعة',
+ hh : '%d ساعات',
+ d : 'يوم',
+ dd : '%d أيام',
+ M : 'شهر',
+ MM : '%d أشهر',
+ y : 'سنة',
+ yy : '%d سنوات'
+ },
+ preparse: function (string) {
+ return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
+ return numberMap[match];
+ }).replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$1[match];
+ }).replace(/,/g, '،');
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Arabic (Tunisia) [ar-tn]
+//! author : Nader Toukabri : https://github.com/naderio
+
+moment.defineLocale('ar-tn', {
+ months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY HH:mm',
+ LLLL: 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar: {
+ sameDay: '[اليوم على الساعة] LT',
+ nextDay: '[غدا على الساعة] LT',
+ nextWeek: 'dddd [على الساعة] LT',
+ lastDay: '[أمس على الساعة] LT',
+ lastWeek: 'dddd [على الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: 'في %s',
+ past: 'منذ %s',
+ s: 'ثوان',
+ m: 'دقيقة',
+ mm: '%d دقائق',
+ h: 'ساعة',
+ hh: '%d ساعات',
+ d: 'يوم',
+ dd: '%d أيام',
+ M: 'شهر',
+ MM: '%d أشهر',
+ y: 'سنة',
+ yy: '%d سنوات'
+ },
+ week: {
+ dow: 1, // Monday is the first day of the week.
+ doy: 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Arabic [ar]
+//! author : Abdel Said: https://github.com/abdelsaid
+//! author : Ahmed Elkhatib
+//! author : forabi https://github.com/forabi
+
+var symbolMap$2 = {
+ '1': '١',
+ '2': '٢',
+ '3': '٣',
+ '4': '٤',
+ '5': '٥',
+ '6': '٦',
+ '7': '٧',
+ '8': '٨',
+ '9': '٩',
+ '0': '٠'
+};
+var numberMap$1 = {
+ '١': '1',
+ '٢': '2',
+ '٣': '3',
+ '٤': '4',
+ '٥': '5',
+ '٦': '6',
+ '٧': '7',
+ '٨': '8',
+ '٩': '9',
+ '٠': '0'
+};
+var pluralForm$1 = function (n) {
+ return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5;
+};
+var plurals$1 = {
+ s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'],
+ m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'],
+ h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'],
+ d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'],
+ M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'],
+ y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام']
+};
+var pluralize$1 = function (u) {
+ return function (number, withoutSuffix, string, isFuture) {
+ var f = pluralForm$1(number),
+ str = plurals$1[u][pluralForm$1(number)];
+ if (f === 2) {
+ str = str[withoutSuffix ? 0 : 1];
+ }
+ return str.replace(/%d/i, number);
+ };
+};
+var months$1 = [
+ 'كانون الثاني يناير',
+ 'شباط فبراير',
+ 'آذار مارس',
+ 'نيسان أبريل',
+ 'أيار مايو',
+ 'حزيران يونيو',
+ 'تموز يوليو',
+ 'آب أغسطس',
+ 'أيلول سبتمبر',
+ 'تشرين الأول أكتوبر',
+ 'تشرين الثاني نوفمبر',
+ 'كانون الأول ديسمبر'
+];
+
+moment.defineLocale('ar', {
+ months : months$1,
+ monthsShort : months$1,
+ weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'D/\u200FM/\u200FYYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /ص|م/,
+ isPM : function (input) {
+ return 'م' === input;
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'ص';
+ } else {
+ return 'م';
+ }
+ },
+ calendar : {
+ sameDay: '[اليوم عند الساعة] LT',
+ nextDay: '[غدًا عند الساعة] LT',
+ nextWeek: 'dddd [عند الساعة] LT',
+ lastDay: '[أمس عند الساعة] LT',
+ lastWeek: 'dddd [عند الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'بعد %s',
+ past : 'منذ %s',
+ s : pluralize$1('s'),
+ m : pluralize$1('m'),
+ mm : pluralize$1('m'),
+ h : pluralize$1('h'),
+ hh : pluralize$1('h'),
+ d : pluralize$1('d'),
+ dd : pluralize$1('d'),
+ M : pluralize$1('M'),
+ MM : pluralize$1('M'),
+ y : pluralize$1('y'),
+ yy : pluralize$1('y')
+ },
+ preparse: function (string) {
+ return string.replace(/\u200f/g, '').replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
+ return numberMap$1[match];
+ }).replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$2[match];
+ }).replace(/,/g, '،');
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Azerbaijani [az]
+//! author : topchiyev : https://github.com/topchiyev
+
+var suffixes = {
+ 1: '-inci',
+ 5: '-inci',
+ 8: '-inci',
+ 70: '-inci',
+ 80: '-inci',
+ 2: '-nci',
+ 7: '-nci',
+ 20: '-nci',
+ 50: '-nci',
+ 3: '-üncü',
+ 4: '-üncü',
+ 100: '-üncü',
+ 6: '-ncı',
+ 9: '-uncu',
+ 10: '-uncu',
+ 30: '-uncu',
+ 60: '-ıncı',
+ 90: '-ıncı'
+};
+
+moment.defineLocale('az', {
+ months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'),
+ monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),
+ weekdays : 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'),
+ weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'),
+ weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[bugün saat] LT',
+ nextDay : '[sabah saat] LT',
+ nextWeek : '[gələn həftə] dddd [saat] LT',
+ lastDay : '[dünən] LT',
+ lastWeek : '[keçən həftə] dddd [saat] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s sonra',
+ past : '%s əvvəl',
+ s : 'birneçə saniyyə',
+ m : 'bir dəqiqə',
+ mm : '%d dəqiqə',
+ h : 'bir saat',
+ hh : '%d saat',
+ d : 'bir gün',
+ dd : '%d gün',
+ M : 'bir ay',
+ MM : '%d ay',
+ y : 'bir il',
+ yy : '%d il'
+ },
+ meridiemParse: /gecə|səhər|gündüz|axşam/,
+ isPM : function (input) {
+ return /^(gündüz|axşam)$/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'gecə';
+ } else if (hour < 12) {
+ return 'səhər';
+ } else if (hour < 17) {
+ return 'gündüz';
+ } else {
+ return 'axşam';
+ }
+ },
+ ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,
+ ordinal : function (number) {
+ if (number === 0) { // special case for zero
+ return number + '-ıncı';
+ }
+ var a = number % 10,
+ b = number % 100 - a,
+ c = number >= 100 ? 100 : null;
+ return number + (suffixes[a] || suffixes[b] || suffixes[c]);
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Belarusian [be]
+//! author : Dmitry Demidov : https://github.com/demidov91
+//! author: Praleska: http://praleska.pro/
+//! Author : Menelion Elensúle : https://github.com/Oire
+
+function plural(word, num) {
+ var forms = word.split('_');
+ return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+}
+function relativeTimeWithPlural(number, withoutSuffix, key) {
+ var format = {
+ 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',
+ 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін',
+ 'dd': 'дзень_дні_дзён',
+ 'MM': 'месяц_месяцы_месяцаў',
+ 'yy': 'год_гады_гадоў'
+ };
+ if (key === 'm') {
+ return withoutSuffix ? 'хвіліна' : 'хвіліну';
+ }
+ else if (key === 'h') {
+ return withoutSuffix ? 'гадзіна' : 'гадзіну';
+ }
+ else {
+ return number + ' ' + plural(format[key], +number);
+ }
+}
+
+moment.defineLocale('be', {
+ months : {
+ format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_'),
+ standalone: 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_')
+ },
+ monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),
+ weekdays : {
+ format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_'),
+ standalone: 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'),
+ isFormat: /\[ ?[Вв] ?(?:мінулую|наступную)? ?\] ?dddd/
+ },
+ weekdaysShort : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
+ weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY г.',
+ LLL : 'D MMMM YYYY г., HH:mm',
+ LLLL : 'dddd, D MMMM YYYY г., HH:mm'
+ },
+ calendar : {
+ sameDay: '[Сёння ў] LT',
+ nextDay: '[Заўтра ў] LT',
+ lastDay: '[Учора ў] LT',
+ nextWeek: function () {
+ return '[У] dddd [ў] LT';
+ },
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ case 5:
+ case 6:
+ return '[У мінулую] dddd [ў] LT';
+ case 1:
+ case 2:
+ case 4:
+ return '[У мінулы] dddd [ў] LT';
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'праз %s',
+ past : '%s таму',
+ s : 'некалькі секунд',
+ m : relativeTimeWithPlural,
+ mm : relativeTimeWithPlural,
+ h : relativeTimeWithPlural,
+ hh : relativeTimeWithPlural,
+ d : 'дзень',
+ dd : relativeTimeWithPlural,
+ M : 'месяц',
+ MM : relativeTimeWithPlural,
+ y : 'год',
+ yy : relativeTimeWithPlural
+ },
+ meridiemParse: /ночы|раніцы|дня|вечара/,
+ isPM : function (input) {
+ return /^(дня|вечара)$/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'ночы';
+ } else if (hour < 12) {
+ return 'раніцы';
+ } else if (hour < 17) {
+ return 'дня';
+ } else {
+ return 'вечара';
+ }
+ },
+ ordinalParse: /\d{1,2}-(і|ы|га)/,
+ ordinal: function (number, period) {
+ switch (period) {
+ case 'M':
+ case 'd':
+ case 'DDD':
+ case 'w':
+ case 'W':
+ return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы';
+ case 'D':
+ return number + '-га';
+ default:
+ return number;
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Bulgarian [bg]
+//! author : Krasen Borisov : https://github.com/kraz
+
+moment.defineLocale('bg', {
+ months : 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'),
+ monthsShort : 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),
+ weekdays : 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'),
+ weekdaysShort : 'нед_пон_вто_сря_чет_пет_съб'.split('_'),
+ weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'D.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY H:mm',
+ LLLL : 'dddd, D MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[Днес в] LT',
+ nextDay : '[Утре в] LT',
+ nextWeek : 'dddd [в] LT',
+ lastDay : '[Вчера в] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ case 6:
+ return '[В изминалата] dddd [в] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[В изминалия] dddd [в] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'след %s',
+ past : 'преди %s',
+ s : 'няколко секунди',
+ m : 'минута',
+ mm : '%d минути',
+ h : 'час',
+ hh : '%d часа',
+ d : 'ден',
+ dd : '%d дни',
+ M : 'месец',
+ MM : '%d месеца',
+ y : 'година',
+ yy : '%d години'
+ },
+ ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
+ ordinal : function (number) {
+ var lastDigit = number % 10,
+ last2Digits = number % 100;
+ if (number === 0) {
+ return number + '-ев';
+ } else if (last2Digits === 0) {
+ return number + '-ен';
+ } else if (last2Digits > 10 && last2Digits < 20) {
+ return number + '-ти';
+ } else if (lastDigit === 1) {
+ return number + '-ви';
+ } else if (lastDigit === 2) {
+ return number + '-ри';
+ } else if (lastDigit === 7 || lastDigit === 8) {
+ return number + '-ми';
+ } else {
+ return number + '-ти';
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Bengali [bn]
+//! author : Kaushik Gandhi : https://github.com/kaushikgandhi
+
+var symbolMap$3 = {
+ '1': '১',
+ '2': '২',
+ '3': '৩',
+ '4': '৪',
+ '5': '৫',
+ '6': '৬',
+ '7': '৭',
+ '8': '৮',
+ '9': '৯',
+ '0': '০'
+};
+var numberMap$2 = {
+ '১': '1',
+ '২': '2',
+ '৩': '3',
+ '৪': '4',
+ '৫': '5',
+ '৬': '6',
+ '৭': '7',
+ '৮': '8',
+ '৯': '9',
+ '০': '0'
+};
+
+moment.defineLocale('bn', {
+ months : 'জানুয়ারী_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'),
+ monthsShort : 'জানু_ফেব_মার্চ_এপ্র_মে_জুন_জুল_আগ_সেপ্ট_অক্টো_নভে_ডিসে'.split('_'),
+ weekdays : 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split('_'),
+ weekdaysShort : 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),
+ weekdaysMin : 'রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm সময়',
+ LTS : 'A h:mm:ss সময়',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm সময়',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm সময়'
+ },
+ calendar : {
+ sameDay : '[আজ] LT',
+ nextDay : '[আগামীকাল] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[গতকাল] LT',
+ lastWeek : '[গত] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s পরে',
+ past : '%s আগে',
+ s : 'কয়েক সেকেন্ড',
+ m : 'এক মিনিট',
+ mm : '%d মিনিট',
+ h : 'এক ঘন্টা',
+ hh : '%d ঘন্টা',
+ d : 'এক দিন',
+ dd : '%d দিন',
+ M : 'এক মাস',
+ MM : '%d মাস',
+ y : 'এক বছর',
+ yy : '%d বছর'
+ },
+ preparse: function (string) {
+ return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
+ return numberMap$2[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$3[match];
+ });
+ },
+ meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if ((meridiem === 'রাত' && hour >= 4) ||
+ (meridiem === 'দুপুর' && hour < 5) ||
+ meridiem === 'বিকাল') {
+ return hour + 12;
+ } else {
+ return hour;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'রাত';
+ } else if (hour < 10) {
+ return 'সকাল';
+ } else if (hour < 17) {
+ return 'দুপুর';
+ } else if (hour < 20) {
+ return 'বিকাল';
+ } else {
+ return 'রাত';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Tibetan [bo]
+//! author : Thupten N. Chakrishar : https://github.com/vajradog
+
+var symbolMap$4 = {
+ '1': '༡',
+ '2': '༢',
+ '3': '༣',
+ '4': '༤',
+ '5': '༥',
+ '6': '༦',
+ '7': '༧',
+ '8': '༨',
+ '9': '༩',
+ '0': '༠'
+};
+var numberMap$3 = {
+ '༡': '1',
+ '༢': '2',
+ '༣': '3',
+ '༤': '4',
+ '༥': '5',
+ '༦': '6',
+ '༧': '7',
+ '༨': '8',
+ '༩': '9',
+ '༠': '0'
+};
+
+moment.defineLocale('bo', {
+ months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
+ monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
+ weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'),
+ weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
+ weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm',
+ LTS : 'A h:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm'
+ },
+ calendar : {
+ sameDay : '[དི་རིང] LT',
+ nextDay : '[སང་ཉིན] LT',
+ nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT',
+ lastDay : '[ཁ་སང] LT',
+ lastWeek : '[བདུན་ཕྲག་མཐའ་མ] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s ལ་',
+ past : '%s སྔན་ལ',
+ s : 'ལམ་སང',
+ m : 'སྐར་མ་གཅིག',
+ mm : '%d སྐར་མ',
+ h : 'ཆུ་ཚོད་གཅིག',
+ hh : '%d ཆུ་ཚོད',
+ d : 'ཉིན་གཅིག',
+ dd : '%d ཉིན་',
+ M : 'ཟླ་བ་གཅིག',
+ MM : '%d ཟླ་བ',
+ y : 'ལོ་གཅིག',
+ yy : '%d ལོ'
+ },
+ preparse: function (string) {
+ return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) {
+ return numberMap$3[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$4[match];
+ });
+ },
+ meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if ((meridiem === 'མཚན་མོ' && hour >= 4) ||
+ (meridiem === 'ཉིན་གུང' && hour < 5) ||
+ meridiem === 'དགོང་དག') {
+ return hour + 12;
+ } else {
+ return hour;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'མཚན་མོ';
+ } else if (hour < 10) {
+ return 'ཞོགས་ཀས';
+ } else if (hour < 17) {
+ return 'ཉིན་གུང';
+ } else if (hour < 20) {
+ return 'དགོང་དག';
+ } else {
+ return 'མཚན་མོ';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Breton [br]
+//! author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
+
+function relativeTimeWithMutation(number, withoutSuffix, key) {
+ var format = {
+ 'mm': 'munutenn',
+ 'MM': 'miz',
+ 'dd': 'devezh'
+ };
+ return number + ' ' + mutation(format[key], number);
+}
+function specialMutationForYears(number) {
+ switch (lastNumber(number)) {
+ case 1:
+ case 3:
+ case 4:
+ case 5:
+ case 9:
+ return number + ' bloaz';
+ default:
+ return number + ' vloaz';
+ }
+}
+function lastNumber(number) {
+ if (number > 9) {
+ return lastNumber(number % 10);
+ }
+ return number;
+}
+function mutation(text, number) {
+ if (number === 2) {
+ return softMutation(text);
+ }
+ return text;
+}
+function softMutation(text) {
+ var mutationTable = {
+ 'm': 'v',
+ 'b': 'v',
+ 'd': 'z'
+ };
+ if (mutationTable[text.charAt(0)] === undefined) {
+ return text;
+ }
+ return mutationTable[text.charAt(0)] + text.substring(1);
+}
+
+moment.defineLocale('br', {
+ months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'),
+ monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),
+ weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'),
+ weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),
+ weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'h[e]mm A',
+ LTS : 'h[e]mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D [a viz] MMMM YYYY',
+ LLL : 'D [a viz] MMMM YYYY h[e]mm A',
+ LLLL : 'dddd, D [a viz] MMMM YYYY h[e]mm A'
+ },
+ calendar : {
+ sameDay : '[Hiziv da] LT',
+ nextDay : '[Warc\'hoazh da] LT',
+ nextWeek : 'dddd [da] LT',
+ lastDay : '[Dec\'h da] LT',
+ lastWeek : 'dddd [paset da] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'a-benn %s',
+ past : '%s \'zo',
+ s : 'un nebeud segondennoù',
+ m : 'ur vunutenn',
+ mm : relativeTimeWithMutation,
+ h : 'un eur',
+ hh : '%d eur',
+ d : 'un devezh',
+ dd : relativeTimeWithMutation,
+ M : 'ur miz',
+ MM : relativeTimeWithMutation,
+ y : 'ur bloaz',
+ yy : specialMutationForYears
+ },
+ ordinalParse: /\d{1,2}(añ|vet)/,
+ ordinal : function (number) {
+ var output = (number === 1) ? 'añ' : 'vet';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Bosnian [bs]
+//! author : Nedim Cholich : https://github.com/frontyard
+//! based on (hr) translation by Bojan Marković
+
+function translate(number, withoutSuffix, key) {
+ var result = number + ' ';
+ switch (key) {
+ case 'm':
+ return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+ case 'mm':
+ if (number === 1) {
+ result += 'minuta';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'minute';
+ } else {
+ result += 'minuta';
+ }
+ return result;
+ case 'h':
+ return withoutSuffix ? 'jedan sat' : 'jednog sata';
+ case 'hh':
+ if (number === 1) {
+ result += 'sat';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'sata';
+ } else {
+ result += 'sati';
+ }
+ return result;
+ case 'dd':
+ if (number === 1) {
+ result += 'dan';
+ } else {
+ result += 'dana';
+ }
+ return result;
+ case 'MM':
+ if (number === 1) {
+ result += 'mjesec';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'mjeseca';
+ } else {
+ result += 'mjeseci';
+ }
+ return result;
+ case 'yy':
+ if (number === 1) {
+ result += 'godina';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'godine';
+ } else {
+ result += 'godina';
+ }
+ return result;
+ }
+}
+
+moment.defineLocale('bs', {
+ months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'),
+ monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
+ weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
+ weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[danas u] LT',
+ nextDay : '[sutra u] LT',
+ nextWeek : function () {
+ switch (this.day()) {
+ case 0:
+ return '[u] [nedjelju] [u] LT';
+ case 3:
+ return '[u] [srijedu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ },
+ lastDay : '[jučer u] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ return '[prošlu] dddd [u] LT';
+ case 6:
+ return '[prošle] [subote] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[prošli] dddd [u] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'prije %s',
+ s : 'par sekundi',
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : 'dan',
+ dd : translate,
+ M : 'mjesec',
+ MM : translate,
+ y : 'godinu',
+ yy : translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Catalan [ca]
+//! author : Juan G. Hurtado : https://github.com/juanghurtado
+
+moment.defineLocale('ca', {
+ months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'),
+ monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'),
+ weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),
+ weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY H:mm',
+ LLLL : 'dddd D MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : function () {
+ return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ nextDay : function () {
+ return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ lastDay : function () {
+ return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ lastWeek : function () {
+ return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'd\'aquí %s',
+ past : 'fa %s',
+ s : 'uns segons',
+ m : 'un minut',
+ mm : '%d minuts',
+ h : 'una hora',
+ hh : '%d hores',
+ d : 'un dia',
+ dd : '%d dies',
+ M : 'un mes',
+ MM : '%d mesos',
+ y : 'un any',
+ yy : '%d anys'
+ },
+ ordinalParse: /\d{1,2}(r|n|t|è|a)/,
+ ordinal : function (number, period) {
+ var output = (number === 1) ? 'r' :
+ (number === 2) ? 'n' :
+ (number === 3) ? 'r' :
+ (number === 4) ? 't' : 'è';
+ if (period === 'w' || period === 'W') {
+ output = 'a';
+ }
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Czech [cs]
+//! author : petrbela : https://github.com/petrbela
+
+var months$2 = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_');
+var monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_');
+function plural$1(n) {
+ return (n > 1) && (n < 5) && (~~(n / 10) !== 1);
+}
+function translate$1(number, withoutSuffix, key, isFuture) {
+ var result = number + ' ';
+ switch (key) {
+ case 's': // a few seconds / in a few seconds / a few seconds ago
+ return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami';
+ case 'm': // a minute / in a minute / a minute ago
+ return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');
+ case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural$1(number) ? 'minuty' : 'minut');
+ } else {
+ return result + 'minutami';
+ }
+ break;
+ case 'h': // an hour / in an hour / an hour ago
+ return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+ case 'hh': // 9 hours / in 9 hours / 9 hours ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural$1(number) ? 'hodiny' : 'hodin');
+ } else {
+ return result + 'hodinami';
+ }
+ break;
+ case 'd': // a day / in a day / a day ago
+ return (withoutSuffix || isFuture) ? 'den' : 'dnem';
+ case 'dd': // 9 days / in 9 days / 9 days ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural$1(number) ? 'dny' : 'dní');
+ } else {
+ return result + 'dny';
+ }
+ break;
+ case 'M': // a month / in a month / a month ago
+ return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';
+ case 'MM': // 9 months / in 9 months / 9 months ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural$1(number) ? 'měsíce' : 'měsíců');
+ } else {
+ return result + 'měsíci';
+ }
+ break;
+ case 'y': // a year / in a year / a year ago
+ return (withoutSuffix || isFuture) ? 'rok' : 'rokem';
+ case 'yy': // 9 years / in 9 years / 9 years ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural$1(number) ? 'roky' : 'let');
+ } else {
+ return result + 'lety';
+ }
+ break;
+ }
+}
+
+moment.defineLocale('cs', {
+ months : months$2,
+ monthsShort : monthsShort,
+ monthsParse : (function (months, monthsShort) {
+ var i, _monthsParse = [];
+ for (i = 0; i < 12; i++) {
+ // use custom parser to solve problem with July (červenec)
+ _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
+ }
+ return _monthsParse;
+ }(months$2, monthsShort)),
+ shortMonthsParse : (function (monthsShort) {
+ var i, _shortMonthsParse = [];
+ for (i = 0; i < 12; i++) {
+ _shortMonthsParse[i] = new RegExp('^' + monthsShort[i] + '$', 'i');
+ }
+ return _shortMonthsParse;
+ }(monthsShort)),
+ longMonthsParse : (function (months) {
+ var i, _longMonthsParse = [];
+ for (i = 0; i < 12; i++) {
+ _longMonthsParse[i] = new RegExp('^' + months[i] + '$', 'i');
+ }
+ return _longMonthsParse;
+ }(months$2)),
+ weekdays : 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),
+ weekdaysShort : 'ne_po_út_st_čt_pá_so'.split('_'),
+ weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'),
+ longDateFormat : {
+ LT: 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd D. MMMM YYYY H:mm',
+ l : 'D. M. YYYY'
+ },
+ calendar : {
+ sameDay: '[dnes v] LT',
+ nextDay: '[zítra v] LT',
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[v neděli v] LT';
+ case 1:
+ case 2:
+ return '[v] dddd [v] LT';
+ case 3:
+ return '[ve středu v] LT';
+ case 4:
+ return '[ve čtvrtek v] LT';
+ case 5:
+ return '[v pátek v] LT';
+ case 6:
+ return '[v sobotu v] LT';
+ }
+ },
+ lastDay: '[včera v] LT',
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[minulou neděli v] LT';
+ case 1:
+ case 2:
+ return '[minulé] dddd [v] LT';
+ case 3:
+ return '[minulou středu v] LT';
+ case 4:
+ case 5:
+ return '[minulý] dddd [v] LT';
+ case 6:
+ return '[minulou sobotu v] LT';
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'před %s',
+ s : translate$1,
+ m : translate$1,
+ mm : translate$1,
+ h : translate$1,
+ hh : translate$1,
+ d : translate$1,
+ dd : translate$1,
+ M : translate$1,
+ MM : translate$1,
+ y : translate$1,
+ yy : translate$1
+ },
+ ordinalParse : /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Chuvash [cv]
+//! author : Anatoly Mironov : https://github.com/mirontoli
+
+moment.defineLocale('cv', {
+ months : 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'),
+ monthsShort : 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'),
+ weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'),
+ weekdaysShort : 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'),
+ weekdaysMin : 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD-MM-YYYY',
+ LL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]',
+ LLL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',
+ LLLL : 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm'
+ },
+ calendar : {
+ sameDay: '[Паян] LT [сехетре]',
+ nextDay: '[Ыран] LT [сехетре]',
+ lastDay: '[Ӗнер] LT [сехетре]',
+ nextWeek: '[Ҫитес] dddd LT [сехетре]',
+ lastWeek: '[Иртнӗ] dddd LT [сехетре]',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : function (output) {
+ var affix = /сехет$/i.exec(output) ? 'рен' : /ҫул$/i.exec(output) ? 'тан' : 'ран';
+ return output + affix;
+ },
+ past : '%s каялла',
+ s : 'пӗр-ик ҫеккунт',
+ m : 'пӗр минут',
+ mm : '%d минут',
+ h : 'пӗр сехет',
+ hh : '%d сехет',
+ d : 'пӗр кун',
+ dd : '%d кун',
+ M : 'пӗр уйӑх',
+ MM : '%d уйӑх',
+ y : 'пӗр ҫул',
+ yy : '%d ҫул'
+ },
+ ordinalParse: /\d{1,2}-мӗш/,
+ ordinal : '%d-мӗш',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Welsh [cy]
+//! author : Robert Allen : https://github.com/robgallen
+//! author : https://github.com/ryangreaves
+
+moment.defineLocale('cy', {
+ months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'),
+ monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'),
+ weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'),
+ weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),
+ weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),
+ weekdaysParseExact : true,
+ // time formats are the same as en-gb
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY HH:mm',
+ LLLL: 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar: {
+ sameDay: '[Heddiw am] LT',
+ nextDay: '[Yfory am] LT',
+ nextWeek: 'dddd [am] LT',
+ lastDay: '[Ddoe am] LT',
+ lastWeek: 'dddd [diwethaf am] LT',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: 'mewn %s',
+ past: '%s yn ôl',
+ s: 'ychydig eiliadau',
+ m: 'munud',
+ mm: '%d munud',
+ h: 'awr',
+ hh: '%d awr',
+ d: 'diwrnod',
+ dd: '%d diwrnod',
+ M: 'mis',
+ MM: '%d mis',
+ y: 'blwyddyn',
+ yy: '%d flynedd'
+ },
+ ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,
+ // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
+ ordinal: function (number) {
+ var b = number,
+ output = '',
+ lookup = [
+ '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed
+ 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed
+ ];
+ if (b > 20) {
+ if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
+ output = 'fed'; // not 30ain, 70ain or 90ain
+ } else {
+ output = 'ain';
+ }
+ } else if (b > 0) {
+ output = lookup[b];
+ }
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Danish [da]
+//! author : Ulrik Nielsen : https://github.com/mrbase
+
+moment.defineLocale('da', {
+ months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
+ weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
+ weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'),
+ weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY HH:mm',
+ LLLL : 'dddd [d.] D. MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[I dag kl.] LT',
+ nextDay : '[I morgen kl.] LT',
+ nextWeek : 'dddd [kl.] LT',
+ lastDay : '[I går kl.] LT',
+ lastWeek : '[sidste] dddd [kl] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'om %s',
+ past : '%s siden',
+ s : 'få sekunder',
+ m : 'et minut',
+ mm : '%d minutter',
+ h : 'en time',
+ hh : '%d timer',
+ d : 'en dag',
+ dd : '%d dage',
+ M : 'en måned',
+ MM : '%d måneder',
+ y : 'et år',
+ yy : '%d år'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : German (Austria) [de-at]
+//! author : lluchs : https://github.com/lluchs
+//! author: Menelion Elensúle: https://github.com/Oire
+//! author : Martin Groller : https://github.com/MadMG
+//! author : Mikolaj Dadela : https://github.com/mik01aj
+
+function processRelativeTime(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 'm': ['eine Minute', 'einer Minute'],
+ 'h': ['eine Stunde', 'einer Stunde'],
+ 'd': ['ein Tag', 'einem Tag'],
+ 'dd': [number + ' Tage', number + ' Tagen'],
+ 'M': ['ein Monat', 'einem Monat'],
+ 'MM': [number + ' Monate', number + ' Monaten'],
+ 'y': ['ein Jahr', 'einem Jahr'],
+ 'yy': [number + ' Jahre', number + ' Jahren']
+ };
+ return withoutSuffix ? format[key][0] : format[key][1];
+}
+
+moment.defineLocale('de-at', {
+ months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
+ monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
+ weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
+ weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY HH:mm',
+ LLLL : 'dddd, D. MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[heute um] LT [Uhr]',
+ sameElse: 'L',
+ nextDay: '[morgen um] LT [Uhr]',
+ nextWeek: 'dddd [um] LT [Uhr]',
+ lastDay: '[gestern um] LT [Uhr]',
+ lastWeek: '[letzten] dddd [um] LT [Uhr]'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : 'vor %s',
+ s : 'ein paar Sekunden',
+ m : processRelativeTime,
+ mm : '%d Minuten',
+ h : processRelativeTime,
+ hh : '%d Stunden',
+ d : processRelativeTime,
+ dd : processRelativeTime,
+ M : processRelativeTime,
+ MM : processRelativeTime,
+ y : processRelativeTime,
+ yy : processRelativeTime
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : German [de]
+//! author : lluchs : https://github.com/lluchs
+//! author: Menelion Elensúle: https://github.com/Oire
+//! author : Mikolaj Dadela : https://github.com/mik01aj
+
+function processRelativeTime$1(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 'm': ['eine Minute', 'einer Minute'],
+ 'h': ['eine Stunde', 'einer Stunde'],
+ 'd': ['ein Tag', 'einem Tag'],
+ 'dd': [number + ' Tage', number + ' Tagen'],
+ 'M': ['ein Monat', 'einem Monat'],
+ 'MM': [number + ' Monate', number + ' Monaten'],
+ 'y': ['ein Jahr', 'einem Jahr'],
+ 'yy': [number + ' Jahre', number + ' Jahren']
+ };
+ return withoutSuffix ? format[key][0] : format[key][1];
+}
+
+moment.defineLocale('de', {
+ months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
+ monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
+ weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
+ weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY HH:mm',
+ LLLL : 'dddd, D. MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[heute um] LT [Uhr]',
+ sameElse: 'L',
+ nextDay: '[morgen um] LT [Uhr]',
+ nextWeek: 'dddd [um] LT [Uhr]',
+ lastDay: '[gestern um] LT [Uhr]',
+ lastWeek: '[letzten] dddd [um] LT [Uhr]'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : 'vor %s',
+ s : 'ein paar Sekunden',
+ m : processRelativeTime$1,
+ mm : '%d Minuten',
+ h : processRelativeTime$1,
+ hh : '%d Stunden',
+ d : processRelativeTime$1,
+ dd : processRelativeTime$1,
+ M : processRelativeTime$1,
+ MM : processRelativeTime$1,
+ y : processRelativeTime$1,
+ yy : processRelativeTime$1
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Maldivian [dv]
+//! author : Jawish Hameed : https://github.com/jawish
+
+var months$3 = [
+ 'ޖެނުއަރީ',
+ 'ފެބްރުއަރީ',
+ 'މާރިޗު',
+ 'އޭޕްރީލު',
+ 'މޭ',
+ 'ޖޫން',
+ 'ޖުލައި',
+ 'އޯގަސްޓު',
+ 'ސެޕްޓެމްބަރު',
+ 'އޮކްޓޯބަރު',
+ 'ނޮވެމްބަރު',
+ 'ޑިސެމްބަރު'
+];
+var weekdays = [
+ 'އާދިއްތަ',
+ 'ހޯމަ',
+ 'އަންގާރަ',
+ 'ބުދަ',
+ 'ބުރާސްފަތި',
+ 'ހުކުރު',
+ 'ހޮނިހިރު'
+];
+
+moment.defineLocale('dv', {
+ months : months$3,
+ monthsShort : months$3,
+ weekdays : weekdays,
+ weekdaysShort : weekdays,
+ weekdaysMin : 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'),
+ longDateFormat : {
+
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'D/M/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /މކ|މފ/,
+ isPM : function (input) {
+ return 'މފ' === input;
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'މކ';
+ } else {
+ return 'މފ';
+ }
+ },
+ calendar : {
+ sameDay : '[މިއަދު] LT',
+ nextDay : '[މާދަމާ] LT',
+ nextWeek : 'dddd LT',
+ lastDay : '[އިއްޔެ] LT',
+ lastWeek : '[ފާއިތުވި] dddd LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'ތެރޭގައި %s',
+ past : 'ކުރިން %s',
+ s : 'ސިކުންތުކޮޅެއް',
+ m : 'މިނިޓެއް',
+ mm : 'މިނިޓު %d',
+ h : 'ގަޑިއިރެއް',
+ hh : 'ގަޑިއިރު %d',
+ d : 'ދުވަހެއް',
+ dd : 'ދުވަސް %d',
+ M : 'މަހެއް',
+ MM : 'މަސް %d',
+ y : 'އަހަރެއް',
+ yy : 'އަހަރު %d'
+ },
+ preparse: function (string) {
+ return string.replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/,/g, '،');
+ },
+ week : {
+ dow : 7, // Sunday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+function isFunction(input) {
+ return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';
+}
+
+//! moment.js locale configuration
+//! locale : Greek [el]
+//! author : Aggelos Karalias : https://github.com/mehiel
+
+moment.defineLocale('el', {
+ monthsNominativeEl : 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'),
+ monthsGenitiveEl : 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'),
+ months : function (momentToFormat, format) {
+ if (/D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM'
+ return this._monthsGenitiveEl[momentToFormat.month()];
+ } else {
+ return this._monthsNominativeEl[momentToFormat.month()];
+ }
+ },
+ monthsShort : 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'),
+ weekdays : 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split('_'),
+ weekdaysShort : 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'),
+ weekdaysMin : 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'),
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'μμ' : 'ΜΜ';
+ } else {
+ return isLower ? 'πμ' : 'ΠΜ';
+ }
+ },
+ isPM : function (input) {
+ return ((input + '').toLowerCase()[0] === 'μ');
+ },
+ meridiemParse : /[ΠΜ]\.?Μ?\.?/i,
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendarEl : {
+ sameDay : '[Σήμερα {}] LT',
+ nextDay : '[Αύριο {}] LT',
+ nextWeek : 'dddd [{}] LT',
+ lastDay : '[Χθες {}] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 6:
+ return '[το προηγούμενο] dddd [{}] LT';
+ default:
+ return '[την προηγούμενη] dddd [{}] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ calendar : function (key, mom) {
+ var output = this._calendarEl[key],
+ hours = mom && mom.hours();
+ if (isFunction(output)) {
+ output = output.apply(mom);
+ }
+ return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις'));
+ },
+ relativeTime : {
+ future : 'σε %s',
+ past : '%s πριν',
+ s : 'λίγα δευτερόλεπτα',
+ m : 'ένα λεπτό',
+ mm : '%d λεπτά',
+ h : 'μία ώρα',
+ hh : '%d ώρες',
+ d : 'μία μέρα',
+ dd : '%d μέρες',
+ M : 'ένας μήνας',
+ MM : '%d μήνες',
+ y : 'ένας χρόνος',
+ yy : '%d χρόνια'
+ },
+ ordinalParse: /\d{1,2}η/,
+ ordinal: '%dη',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : English (Australia) [en-au]
+//! author : Jared Morse : https://github.com/jarcoal
+
+moment.defineLocale('en-au', {
+ months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+ weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+ weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+ weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : English (Canada) [en-ca]
+//! author : Jonathan Abourbih : https://github.com/jonbca
+
+moment.defineLocale('en-ca', {
+ months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+ weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+ weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+ weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'YYYY-MM-DD',
+ LL : 'MMMM D, YYYY',
+ LLL : 'MMMM D, YYYY h:mm A',
+ LLLL : 'dddd, MMMM D, YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ }
+});
+
+//! moment.js locale configuration
+//! locale : English (United Kingdom) [en-gb]
+//! author : Chris Gedrim : https://github.com/chrisgedrim
+
+moment.defineLocale('en-gb', {
+ months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+ weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+ weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+ weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : English (Ireland) [en-ie]
+//! author : Chris Cartlidge : https://github.com/chriscartlidge
+
+moment.defineLocale('en-ie', {
+ months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+ weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+ weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+ weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD-MM-YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : English (New Zealand) [en-nz]
+//! author : Luke McGregor : https://github.com/lukemcgregor
+
+moment.defineLocale('en-nz', {
+ months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+ weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+ weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+ weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Esperanto [eo]
+//! author : Colin Dean : https://github.com/colindean
+//! komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
+//! Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
+
+moment.defineLocale('eo', {
+ months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'),
+ weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato'.split('_'),
+ weekdaysShort : 'Dim_Lun_Mard_Merk_Ĵaŭ_Ven_Sab'.split('_'),
+ weekdaysMin : 'Di_Lu_Ma_Me_Ĵa_Ve_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'YYYY-MM-DD',
+ LL : 'D[-an de] MMMM, YYYY',
+ LLL : 'D[-an de] MMMM, YYYY HH:mm',
+ LLLL : 'dddd, [la] D[-an de] MMMM, YYYY HH:mm'
+ },
+ meridiemParse: /[ap]\.t\.m/i,
+ isPM: function (input) {
+ return input.charAt(0).toLowerCase() === 'p';
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'p.t.m.' : 'P.T.M.';
+ } else {
+ return isLower ? 'a.t.m.' : 'A.T.M.';
+ }
+ },
+ calendar : {
+ sameDay : '[Hodiaŭ je] LT',
+ nextDay : '[Morgaŭ je] LT',
+ nextWeek : 'dddd [je] LT',
+ lastDay : '[Hieraŭ je] LT',
+ lastWeek : '[pasinta] dddd [je] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'je %s',
+ past : 'antaŭ %s',
+ s : 'sekundoj',
+ m : 'minuto',
+ mm : '%d minutoj',
+ h : 'horo',
+ hh : '%d horoj',
+ d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo
+ dd : '%d tagoj',
+ M : 'monato',
+ MM : '%d monatoj',
+ y : 'jaro',
+ yy : '%d jaroj'
+ },
+ ordinalParse: /\d{1,2}a/,
+ ordinal : '%da',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Spanish (Dominican Republic) [es-do]
+
+var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_');
+var monthsShort$1 = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');
+
+moment.defineLocale('es-do', {
+ months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShort$1[m.month()];
+ } else {
+ return monthsShortDot[m.month()];
+ }
+ },
+ monthsParseExact : true,
+ weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
+ weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
+ weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D [de] MMMM [de] YYYY',
+ LLL : 'D [de] MMMM [de] YYYY h:mm A',
+ LLLL : 'dddd, D [de] MMMM [de] YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : function () {
+ return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ nextDay : function () {
+ return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ lastDay : function () {
+ return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ lastWeek : function () {
+ return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'en %s',
+ past : 'hace %s',
+ s : 'unos segundos',
+ m : 'un minuto',
+ mm : '%d minutos',
+ h : 'una hora',
+ hh : '%d horas',
+ d : 'un día',
+ dd : '%d días',
+ M : 'un mes',
+ MM : '%d meses',
+ y : 'un año',
+ yy : '%d años'
+ },
+ ordinalParse : /\d{1,2}º/,
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Spanish [es]
+//! author : Julio Napurí : https://github.com/julionc
+
+var monthsShortDot$1 = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_');
+var monthsShort$2 = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');
+
+moment.defineLocale('es', {
+ months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShort$2[m.month()];
+ } else {
+ return monthsShortDot$1[m.month()];
+ }
+ },
+ monthsParseExact : true,
+ weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
+ weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
+ weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D [de] MMMM [de] YYYY',
+ LLL : 'D [de] MMMM [de] YYYY H:mm',
+ LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm'
+ },
+ calendar : {
+ sameDay : function () {
+ return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ nextDay : function () {
+ return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ lastDay : function () {
+ return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ lastWeek : function () {
+ return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'en %s',
+ past : 'hace %s',
+ s : 'unos segundos',
+ m : 'un minuto',
+ mm : '%d minutos',
+ h : 'una hora',
+ hh : '%d horas',
+ d : 'un día',
+ dd : '%d días',
+ M : 'un mes',
+ MM : '%d meses',
+ y : 'un año',
+ yy : '%d años'
+ },
+ ordinalParse : /\d{1,2}º/,
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Estonian [et]
+//! author : Henry Kehlmann : https://github.com/madhenry
+//! improvements : Illimar Tambek : https://github.com/ragulka
+
+function processRelativeTime$2(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'],
+ 'm' : ['ühe minuti', 'üks minut'],
+ 'mm': [number + ' minuti', number + ' minutit'],
+ 'h' : ['ühe tunni', 'tund aega', 'üks tund'],
+ 'hh': [number + ' tunni', number + ' tundi'],
+ 'd' : ['ühe päeva', 'üks päev'],
+ 'M' : ['kuu aja', 'kuu aega', 'üks kuu'],
+ 'MM': [number + ' kuu', number + ' kuud'],
+ 'y' : ['ühe aasta', 'aasta', 'üks aasta'],
+ 'yy': [number + ' aasta', number + ' aastat']
+ };
+ if (withoutSuffix) {
+ return format[key][2] ? format[key][2] : format[key][1];
+ }
+ return isFuture ? format[key][0] : format[key][1];
+}
+
+moment.defineLocale('et', {
+ months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'),
+ monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),
+ weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'),
+ weekdaysShort : 'P_E_T_K_N_R_L'.split('_'),
+ weekdaysMin : 'P_E_T_K_N_R_L'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[Täna,] LT',
+ nextDay : '[Homme,] LT',
+ nextWeek : '[Järgmine] dddd LT',
+ lastDay : '[Eile,] LT',
+ lastWeek : '[Eelmine] dddd LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s pärast',
+ past : '%s tagasi',
+ s : processRelativeTime$2,
+ m : processRelativeTime$2,
+ mm : processRelativeTime$2,
+ h : processRelativeTime$2,
+ hh : processRelativeTime$2,
+ d : processRelativeTime$2,
+ dd : '%d päeva',
+ M : processRelativeTime$2,
+ MM : processRelativeTime$2,
+ y : processRelativeTime$2,
+ yy : processRelativeTime$2
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Basque [eu]
+//! author : Eneko Illarramendi : https://github.com/eillarra
+
+moment.defineLocale('eu', {
+ months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'),
+ monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'),
+ weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'),
+ weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'YYYY-MM-DD',
+ LL : 'YYYY[ko] MMMM[ren] D[a]',
+ LLL : 'YYYY[ko] MMMM[ren] D[a] HH:mm',
+ LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm',
+ l : 'YYYY-M-D',
+ ll : 'YYYY[ko] MMM D[a]',
+ lll : 'YYYY[ko] MMM D[a] HH:mm',
+ llll : 'ddd, YYYY[ko] MMM D[a] HH:mm'
+ },
+ calendar : {
+ sameDay : '[gaur] LT[etan]',
+ nextDay : '[bihar] LT[etan]',
+ nextWeek : 'dddd LT[etan]',
+ lastDay : '[atzo] LT[etan]',
+ lastWeek : '[aurreko] dddd LT[etan]',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s barru',
+ past : 'duela %s',
+ s : 'segundo batzuk',
+ m : 'minutu bat',
+ mm : '%d minutu',
+ h : 'ordu bat',
+ hh : '%d ordu',
+ d : 'egun bat',
+ dd : '%d egun',
+ M : 'hilabete bat',
+ MM : '%d hilabete',
+ y : 'urte bat',
+ yy : '%d urte'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Persian [fa]
+//! author : Ebrahim Byagowi : https://github.com/ebraminio
+
+var symbolMap$5 = {
+ '1': '۱',
+ '2': '۲',
+ '3': '۳',
+ '4': '۴',
+ '5': '۵',
+ '6': '۶',
+ '7': '۷',
+ '8': '۸',
+ '9': '۹',
+ '0': '۰'
+};
+var numberMap$4 = {
+ '۱': '1',
+ '۲': '2',
+ '۳': '3',
+ '۴': '4',
+ '۵': '5',
+ '۶': '6',
+ '۷': '7',
+ '۸': '8',
+ '۹': '9',
+ '۰': '0'
+};
+
+moment.defineLocale('fa', {
+ months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+ monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+ weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
+ weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
+ weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /قبل از ظهر|بعد از ظهر/,
+ isPM: function (input) {
+ return /بعد از ظهر/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'قبل از ظهر';
+ } else {
+ return 'بعد از ظهر';
+ }
+ },
+ calendar : {
+ sameDay : '[امروز ساعت] LT',
+ nextDay : '[فردا ساعت] LT',
+ nextWeek : 'dddd [ساعت] LT',
+ lastDay : '[دیروز ساعت] LT',
+ lastWeek : 'dddd [پیش] [ساعت] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'در %s',
+ past : '%s پیش',
+ s : 'چندین ثانیه',
+ m : 'یک دقیقه',
+ mm : '%d دقیقه',
+ h : 'یک ساعت',
+ hh : '%d ساعت',
+ d : 'یک روز',
+ dd : '%d روز',
+ M : 'یک ماه',
+ MM : '%d ماه',
+ y : 'یک سال',
+ yy : '%d سال'
+ },
+ preparse: function (string) {
+ return string.replace(/[۰-۹]/g, function (match) {
+ return numberMap$4[match];
+ }).replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$5[match];
+ }).replace(/,/g, '،');
+ },
+ ordinalParse: /\d{1,2}م/,
+ ordinal : '%dم',
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Finnish [fi]
+//! author : Tarmo Aidantausta : https://github.com/bleadof
+
+var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' ');
+var numbersFuture = [
+ 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden',
+ numbersPast[7], numbersPast[8], numbersPast[9]
+ ];
+function translate$2(number, withoutSuffix, key, isFuture) {
+ var result = '';
+ switch (key) {
+ case 's':
+ return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
+ case 'm':
+ return isFuture ? 'minuutin' : 'minuutti';
+ case 'mm':
+ result = isFuture ? 'minuutin' : 'minuuttia';
+ break;
+ case 'h':
+ return isFuture ? 'tunnin' : 'tunti';
+ case 'hh':
+ result = isFuture ? 'tunnin' : 'tuntia';
+ break;
+ case 'd':
+ return isFuture ? 'päivän' : 'päivä';
+ case 'dd':
+ result = isFuture ? 'päivän' : 'päivää';
+ break;
+ case 'M':
+ return isFuture ? 'kuukauden' : 'kuukausi';
+ case 'MM':
+ result = isFuture ? 'kuukauden' : 'kuukautta';
+ break;
+ case 'y':
+ return isFuture ? 'vuoden' : 'vuosi';
+ case 'yy':
+ result = isFuture ? 'vuoden' : 'vuotta';
+ break;
+ }
+ result = verbalNumber(number, isFuture) + ' ' + result;
+ return result;
+}
+function verbalNumber(number, isFuture) {
+ return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number;
+}
+
+moment.defineLocale('fi', {
+ months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'),
+ monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'),
+ weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'),
+ weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'),
+ weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD.MM.YYYY',
+ LL : 'Do MMMM[ta] YYYY',
+ LLL : 'Do MMMM[ta] YYYY, [klo] HH.mm',
+ LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm',
+ l : 'D.M.YYYY',
+ ll : 'Do MMM YYYY',
+ lll : 'Do MMM YYYY, [klo] HH.mm',
+ llll : 'ddd, Do MMM YYYY, [klo] HH.mm'
+ },
+ calendar : {
+ sameDay : '[tänään] [klo] LT',
+ nextDay : '[huomenna] [klo] LT',
+ nextWeek : 'dddd [klo] LT',
+ lastDay : '[eilen] [klo] LT',
+ lastWeek : '[viime] dddd[na] [klo] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s päästä',
+ past : '%s sitten',
+ s : translate$2,
+ m : translate$2,
+ mm : translate$2,
+ h : translate$2,
+ hh : translate$2,
+ d : translate$2,
+ dd : translate$2,
+ M : translate$2,
+ MM : translate$2,
+ y : translate$2,
+ yy : translate$2
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Faroese [fo]
+//! author : Ragnar Johannesen : https://github.com/ragnar123
+
+moment.defineLocale('fo', {
+ months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
+ weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'),
+ weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'),
+ weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D. MMMM, YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Í dag kl.] LT',
+ nextDay : '[Í morgin kl.] LT',
+ nextWeek : 'dddd [kl.] LT',
+ lastDay : '[Í gjár kl.] LT',
+ lastWeek : '[síðstu] dddd [kl] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'um %s',
+ past : '%s síðani',
+ s : 'fá sekund',
+ m : 'ein minutt',
+ mm : '%d minuttir',
+ h : 'ein tími',
+ hh : '%d tímar',
+ d : 'ein dagur',
+ dd : '%d dagar',
+ M : 'ein mánaði',
+ MM : '%d mánaðir',
+ y : 'eitt ár',
+ yy : '%d ár'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : French (Canada) [fr-ca]
+//! author : Jonathan Abourbih : https://github.com/jonbca
+
+moment.defineLocale('fr-ca', {
+ months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
+ monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
+ weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
+ weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'YYYY-MM-DD',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Aujourd\'hui à] LT',
+ nextDay: '[Demain à] LT',
+ nextWeek: 'dddd [à] LT',
+ lastDay: '[Hier à] LT',
+ lastWeek: 'dddd [dernier à] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'dans %s',
+ past : 'il y a %s',
+ s : 'quelques secondes',
+ m : 'une minute',
+ mm : '%d minutes',
+ h : 'une heure',
+ hh : '%d heures',
+ d : 'un jour',
+ dd : '%d jours',
+ M : 'un mois',
+ MM : '%d mois',
+ y : 'un an',
+ yy : '%d ans'
+ },
+ ordinalParse: /\d{1,2}(er|e)/,
+ ordinal : function (number) {
+ return number + (number === 1 ? 'er' : 'e');
+ }
+});
+
+//! moment.js locale configuration
+//! locale : French (Switzerland) [fr-ch]
+//! author : Gaspard Bucher : https://github.com/gaspard
+
+moment.defineLocale('fr-ch', {
+ months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
+ monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
+ weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
+ weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Aujourd\'hui à] LT',
+ nextDay: '[Demain à] LT',
+ nextWeek: 'dddd [à] LT',
+ lastDay: '[Hier à] LT',
+ lastWeek: 'dddd [dernier à] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'dans %s',
+ past : 'il y a %s',
+ s : 'quelques secondes',
+ m : 'une minute',
+ mm : '%d minutes',
+ h : 'une heure',
+ hh : '%d heures',
+ d : 'un jour',
+ dd : '%d jours',
+ M : 'un mois',
+ MM : '%d mois',
+ y : 'un an',
+ yy : '%d ans'
+ },
+ ordinalParse: /\d{1,2}(er|e)/,
+ ordinal : function (number) {
+ return number + (number === 1 ? 'er' : 'e');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : French [fr]
+//! author : John Fischer : https://github.com/jfroffice
+
+moment.defineLocale('fr', {
+ months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
+ monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
+ weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
+ weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Aujourd\'hui à] LT',
+ nextDay: '[Demain à] LT',
+ nextWeek: 'dddd [à] LT',
+ lastDay: '[Hier à] LT',
+ lastWeek: 'dddd [dernier à] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'dans %s',
+ past : 'il y a %s',
+ s : 'quelques secondes',
+ m : 'une minute',
+ mm : '%d minutes',
+ h : 'une heure',
+ hh : '%d heures',
+ d : 'un jour',
+ dd : '%d jours',
+ M : 'un mois',
+ MM : '%d mois',
+ y : 'un an',
+ yy : '%d ans'
+ },
+ ordinalParse: /\d{1,2}(er|)/,
+ ordinal : function (number) {
+ return number + (number === 1 ? 'er' : '');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Frisian [fy]
+//! author : Robin van der Vliet : https://github.com/robin0van0der0v
+
+var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_');
+var monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_');
+
+moment.defineLocale('fy', {
+ months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShortWithoutDots[m.month()];
+ } else {
+ return monthsShortWithDots[m.month()];
+ }
+ },
+ monthsParseExact : true,
+ weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'),
+ weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'),
+ weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD-MM-YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[hjoed om] LT',
+ nextDay: '[moarn om] LT',
+ nextWeek: 'dddd [om] LT',
+ lastDay: '[juster om] LT',
+ lastWeek: '[ôfrûne] dddd [om] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'oer %s',
+ past : '%s lyn',
+ s : 'in pear sekonden',
+ m : 'ien minút',
+ mm : '%d minuten',
+ h : 'ien oere',
+ hh : '%d oeren',
+ d : 'ien dei',
+ dd : '%d dagen',
+ M : 'ien moanne',
+ MM : '%d moannen',
+ y : 'ien jier',
+ yy : '%d jierren'
+ },
+ ordinalParse: /\d{1,2}(ste|de)/,
+ ordinal : function (number) {
+ return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Scottish Gaelic [gd]
+//! author : Jon Ashdown : https://github.com/jonashdown
+
+var months$4 = [
+ 'Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd'
+];
+
+var monthsShort$3 = ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh'];
+
+var weekdays$1 = ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne'];
+
+var weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis'];
+
+var weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa'];
+
+moment.defineLocale('gd', {
+ months : months$4,
+ monthsShort : monthsShort$3,
+ monthsParseExact : true,
+ weekdays : weekdays$1,
+ weekdaysShort : weekdaysShort,
+ weekdaysMin : weekdaysMin,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[An-diugh aig] LT',
+ nextDay : '[A-màireach aig] LT',
+ nextWeek : 'dddd [aig] LT',
+ lastDay : '[An-dè aig] LT',
+ lastWeek : 'dddd [seo chaidh] [aig] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'ann an %s',
+ past : 'bho chionn %s',
+ s : 'beagan diogan',
+ m : 'mionaid',
+ mm : '%d mionaidean',
+ h : 'uair',
+ hh : '%d uairean',
+ d : 'latha',
+ dd : '%d latha',
+ M : 'mìos',
+ MM : '%d mìosan',
+ y : 'bliadhna',
+ yy : '%d bliadhna'
+ },
+ ordinalParse : /\d{1,2}(d|na|mh)/,
+ ordinal : function (number) {
+ var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Galician [gl]
+//! author : Juan G. Hurtado : https://github.com/juanghurtado
+
+moment.defineLocale('gl', {
+ months : 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split('_'),
+ monthsShort : 'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'),
+ weekdaysShort : 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'),
+ weekdaysMin : 'do_lu_ma_mé_xo_ve_sá'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D [de] MMMM [de] YYYY',
+ LLL : 'D [de] MMMM [de] YYYY H:mm',
+ LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm'
+ },
+ calendar : {
+ sameDay : function () {
+ return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
+ },
+ nextDay : function () {
+ return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
+ },
+ lastDay : function () {
+ return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT';
+ },
+ lastWeek : function () {
+ return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : function (str) {
+ if (str.indexOf('un') === 0) {
+ return 'n' + str;
+ }
+ return 'en ' + str;
+ },
+ past : 'hai %s',
+ s : 'uns segundos',
+ m : 'un minuto',
+ mm : '%d minutos',
+ h : 'unha hora',
+ hh : '%d horas',
+ d : 'un día',
+ dd : '%d días',
+ M : 'un mes',
+ MM : '%d meses',
+ y : 'un ano',
+ yy : '%d anos'
+ },
+ ordinalParse : /\d{1,2}º/,
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Hebrew [he]
+//! author : Tomer Cohen : https://github.com/tomer
+//! author : Moshe Simantov : https://github.com/DevelopmentIL
+//! author : Tal Ater : https://github.com/TalAter
+
+moment.defineLocale('he', {
+ months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'),
+ monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),
+ weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),
+ weekdaysShort : 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'),
+ weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D [ב]MMMM YYYY',
+ LLL : 'D [ב]MMMM YYYY HH:mm',
+ LLLL : 'dddd, D [ב]MMMM YYYY HH:mm',
+ l : 'D/M/YYYY',
+ ll : 'D MMM YYYY',
+ lll : 'D MMM YYYY HH:mm',
+ llll : 'ddd, D MMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[היום ב־]LT',
+ nextDay : '[מחר ב־]LT',
+ nextWeek : 'dddd [בשעה] LT',
+ lastDay : '[אתמול ב־]LT',
+ lastWeek : '[ביום] dddd [האחרון בשעה] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'בעוד %s',
+ past : 'לפני %s',
+ s : 'מספר שניות',
+ m : 'דקה',
+ mm : '%d דקות',
+ h : 'שעה',
+ hh : function (number) {
+ if (number === 2) {
+ return 'שעתיים';
+ }
+ return number + ' שעות';
+ },
+ d : 'יום',
+ dd : function (number) {
+ if (number === 2) {
+ return 'יומיים';
+ }
+ return number + ' ימים';
+ },
+ M : 'חודש',
+ MM : function (number) {
+ if (number === 2) {
+ return 'חודשיים';
+ }
+ return number + ' חודשים';
+ },
+ y : 'שנה',
+ yy : function (number) {
+ if (number === 2) {
+ return 'שנתיים';
+ } else if (number % 10 === 0 && number !== 10) {
+ return number + ' שנה';
+ }
+ return number + ' שנים';
+ }
+ },
+ meridiemParse: /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,
+ isPM : function (input) {
+ return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 5) {
+ return 'לפנות בוקר';
+ } else if (hour < 10) {
+ return 'בבוקר';
+ } else if (hour < 12) {
+ return isLower ? 'לפנה"צ' : 'לפני הצהריים';
+ } else if (hour < 18) {
+ return isLower ? 'אחה"צ' : 'אחרי הצהריים';
+ } else {
+ return 'בערב';
+ }
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Hindi [hi]
+//! author : Mayank Singhal : https://github.com/mayanksinghal
+
+var symbolMap$6 = {
+ '1': '१',
+ '2': '२',
+ '3': '३',
+ '4': '४',
+ '5': '५',
+ '6': '६',
+ '7': '७',
+ '8': '८',
+ '9': '९',
+ '0': '०'
+};
+var numberMap$5 = {
+ '१': '1',
+ '२': '2',
+ '३': '3',
+ '४': '4',
+ '५': '5',
+ '६': '6',
+ '७': '7',
+ '८': '8',
+ '९': '9',
+ '०': '0'
+};
+
+moment.defineLocale('hi', {
+ months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'),
+ monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
+ weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'),
+ weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm बजे',
+ LTS : 'A h:mm:ss बजे',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm बजे',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm बजे'
+ },
+ calendar : {
+ sameDay : '[आज] LT',
+ nextDay : '[कल] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[कल] LT',
+ lastWeek : '[पिछले] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s में',
+ past : '%s पहले',
+ s : 'कुछ ही क्षण',
+ m : 'एक मिनट',
+ mm : '%d मिनट',
+ h : 'एक घंटा',
+ hh : '%d घंटे',
+ d : 'एक दिन',
+ dd : '%d दिन',
+ M : 'एक महीने',
+ MM : '%d महीने',
+ y : 'एक वर्ष',
+ yy : '%d वर्ष'
+ },
+ preparse: function (string) {
+ return string.replace(/[१२३४५६७८९०]/g, function (match) {
+ return numberMap$5[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$6[match];
+ });
+ },
+ // Hindi notation for meridiems are quite fuzzy in practice. While there exists
+ // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
+ meridiemParse: /रात|सुबह|दोपहर|शाम/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'रात') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'सुबह') {
+ return hour;
+ } else if (meridiem === 'दोपहर') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'शाम') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'रात';
+ } else if (hour < 10) {
+ return 'सुबह';
+ } else if (hour < 17) {
+ return 'दोपहर';
+ } else if (hour < 20) {
+ return 'शाम';
+ } else {
+ return 'रात';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Croatian [hr]
+//! author : Bojan Marković : https://github.com/bmarkovic
+
+function translate$3(number, withoutSuffix, key) {
+ var result = number + ' ';
+ switch (key) {
+ case 'm':
+ return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+ case 'mm':
+ if (number === 1) {
+ result += 'minuta';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'minute';
+ } else {
+ result += 'minuta';
+ }
+ return result;
+ case 'h':
+ return withoutSuffix ? 'jedan sat' : 'jednog sata';
+ case 'hh':
+ if (number === 1) {
+ result += 'sat';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'sata';
+ } else {
+ result += 'sati';
+ }
+ return result;
+ case 'dd':
+ if (number === 1) {
+ result += 'dan';
+ } else {
+ result += 'dana';
+ }
+ return result;
+ case 'MM':
+ if (number === 1) {
+ result += 'mjesec';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'mjeseca';
+ } else {
+ result += 'mjeseci';
+ }
+ return result;
+ case 'yy':
+ if (number === 1) {
+ result += 'godina';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'godine';
+ } else {
+ result += 'godina';
+ }
+ return result;
+ }
+}
+
+moment.defineLocale('hr', {
+ months : {
+ format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_'),
+ standalone: 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_')
+ },
+ monthsShort : 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
+ weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
+ weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[danas u] LT',
+ nextDay : '[sutra u] LT',
+ nextWeek : function () {
+ switch (this.day()) {
+ case 0:
+ return '[u] [nedjelju] [u] LT';
+ case 3:
+ return '[u] [srijedu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ },
+ lastDay : '[jučer u] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ return '[prošlu] dddd [u] LT';
+ case 6:
+ return '[prošle] [subote] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[prošli] dddd [u] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'prije %s',
+ s : 'par sekundi',
+ m : translate$3,
+ mm : translate$3,
+ h : translate$3,
+ hh : translate$3,
+ d : 'dan',
+ dd : translate$3,
+ M : 'mjesec',
+ MM : translate$3,
+ y : 'godinu',
+ yy : translate$3
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Hungarian [hu]
+//! author : Adam Brunner : https://github.com/adambrunner
+
+var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
+function translate$4(number, withoutSuffix, key, isFuture) {
+ var num = number,
+ suffix;
+ switch (key) {
+ case 's':
+ return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce';
+ case 'm':
+ return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
+ case 'mm':
+ return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
+ case 'h':
+ return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
+ case 'hh':
+ return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
+ case 'd':
+ return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
+ case 'dd':
+ return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
+ case 'M':
+ return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+ case 'MM':
+ return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+ case 'y':
+ return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
+ case 'yy':
+ return num + (isFuture || withoutSuffix ? ' év' : ' éve');
+ }
+ return '';
+}
+function week(isFuture) {
+ return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]';
+}
+
+moment.defineLocale('hu', {
+ months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'),
+ monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'),
+ weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'),
+ weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'),
+ weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'YYYY.MM.DD.',
+ LL : 'YYYY. MMMM D.',
+ LLL : 'YYYY. MMMM D. H:mm',
+ LLLL : 'YYYY. MMMM D., dddd H:mm'
+ },
+ meridiemParse: /de|du/i,
+ isPM: function (input) {
+ return input.charAt(1).toLowerCase() === 'u';
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 12) {
+ return isLower === true ? 'de' : 'DE';
+ } else {
+ return isLower === true ? 'du' : 'DU';
+ }
+ },
+ calendar : {
+ sameDay : '[ma] LT[-kor]',
+ nextDay : '[holnap] LT[-kor]',
+ nextWeek : function () {
+ return week.call(this, true);
+ },
+ lastDay : '[tegnap] LT[-kor]',
+ lastWeek : function () {
+ return week.call(this, false);
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s múlva',
+ past : '%s',
+ s : translate$4,
+ m : translate$4,
+ mm : translate$4,
+ h : translate$4,
+ hh : translate$4,
+ d : translate$4,
+ dd : translate$4,
+ M : translate$4,
+ MM : translate$4,
+ y : translate$4,
+ yy : translate$4
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Armenian [hy-am]
+//! author : Armendarabyan : https://github.com/armendarabyan
+
+moment.defineLocale('hy-am', {
+ months : {
+ format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'),
+ standalone: 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_')
+ },
+ monthsShort : 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'),
+ weekdays : 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'),
+ weekdaysShort : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
+ weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY թ.',
+ LLL : 'D MMMM YYYY թ., HH:mm',
+ LLLL : 'dddd, D MMMM YYYY թ., HH:mm'
+ },
+ calendar : {
+ sameDay: '[այսօր] LT',
+ nextDay: '[վաղը] LT',
+ lastDay: '[երեկ] LT',
+ nextWeek: function () {
+ return 'dddd [օրը ժամը] LT';
+ },
+ lastWeek: function () {
+ return '[անցած] dddd [օրը ժամը] LT';
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : '%s հետո',
+ past : '%s առաջ',
+ s : 'մի քանի վայրկյան',
+ m : 'րոպե',
+ mm : '%d րոպե',
+ h : 'ժամ',
+ hh : '%d ժամ',
+ d : 'օր',
+ dd : '%d օր',
+ M : 'ամիս',
+ MM : '%d ամիս',
+ y : 'տարի',
+ yy : '%d տարի'
+ },
+ meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,
+ isPM: function (input) {
+ return /^(ցերեկվա|երեկոյան)$/.test(input);
+ },
+ meridiem : function (hour) {
+ if (hour < 4) {
+ return 'գիշերվա';
+ } else if (hour < 12) {
+ return 'առավոտվա';
+ } else if (hour < 17) {
+ return 'ցերեկվա';
+ } else {
+ return 'երեկոյան';
+ }
+ },
+ ordinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/,
+ ordinal: function (number, period) {
+ switch (period) {
+ case 'DDD':
+ case 'w':
+ case 'W':
+ case 'DDDo':
+ if (number === 1) {
+ return number + '-ին';
+ }
+ return number + '-րդ';
+ default:
+ return number;
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Indonesian [id]
+//! author : Mohammad Satrio Utomo : https://github.com/tyok
+//! reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
+
+moment.defineLocale('id', {
+ months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'),
+ weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),
+ weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'),
+ weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [pukul] HH.mm',
+ LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+ },
+ meridiemParse: /pagi|siang|sore|malam/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'pagi') {
+ return hour;
+ } else if (meridiem === 'siang') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'sore' || meridiem === 'malam') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'pagi';
+ } else if (hours < 15) {
+ return 'siang';
+ } else if (hours < 19) {
+ return 'sore';
+ } else {
+ return 'malam';
+ }
+ },
+ calendar : {
+ sameDay : '[Hari ini pukul] LT',
+ nextDay : '[Besok pukul] LT',
+ nextWeek : 'dddd [pukul] LT',
+ lastDay : '[Kemarin pukul] LT',
+ lastWeek : 'dddd [lalu pukul] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'dalam %s',
+ past : '%s yang lalu',
+ s : 'beberapa detik',
+ m : 'semenit',
+ mm : '%d menit',
+ h : 'sejam',
+ hh : '%d jam',
+ d : 'sehari',
+ dd : '%d hari',
+ M : 'sebulan',
+ MM : '%d bulan',
+ y : 'setahun',
+ yy : '%d tahun'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Icelandic [is]
+//! author : Hinrik Örn Sigurðsson : https://github.com/hinrik
+
+function plural$2(n) {
+ if (n % 100 === 11) {
+ return true;
+ } else if (n % 10 === 1) {
+ return false;
+ }
+ return true;
+}
+function translate$5(number, withoutSuffix, key, isFuture) {
+ var result = number + ' ';
+ switch (key) {
+ case 's':
+ return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum';
+ case 'm':
+ return withoutSuffix ? 'mínúta' : 'mínútu';
+ case 'mm':
+ if (plural$2(number)) {
+ return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');
+ } else if (withoutSuffix) {
+ return result + 'mínúta';
+ }
+ return result + 'mínútu';
+ case 'hh':
+ if (plural$2(number)) {
+ return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');
+ }
+ return result + 'klukkustund';
+ case 'd':
+ if (withoutSuffix) {
+ return 'dagur';
+ }
+ return isFuture ? 'dag' : 'degi';
+ case 'dd':
+ if (plural$2(number)) {
+ if (withoutSuffix) {
+ return result + 'dagar';
+ }
+ return result + (isFuture ? 'daga' : 'dögum');
+ } else if (withoutSuffix) {
+ return result + 'dagur';
+ }
+ return result + (isFuture ? 'dag' : 'degi');
+ case 'M':
+ if (withoutSuffix) {
+ return 'mánuður';
+ }
+ return isFuture ? 'mánuð' : 'mánuði';
+ case 'MM':
+ if (plural$2(number)) {
+ if (withoutSuffix) {
+ return result + 'mánuðir';
+ }
+ return result + (isFuture ? 'mánuði' : 'mánuðum');
+ } else if (withoutSuffix) {
+ return result + 'mánuður';
+ }
+ return result + (isFuture ? 'mánuð' : 'mánuði');
+ case 'y':
+ return withoutSuffix || isFuture ? 'ár' : 'ári';
+ case 'yy':
+ if (plural$2(number)) {
+ return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
+ }
+ return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
+ }
+}
+
+moment.defineLocale('is', {
+ months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'),
+ weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'),
+ weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'),
+ weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY [kl.] H:mm',
+ LLLL : 'dddd, D. MMMM YYYY [kl.] H:mm'
+ },
+ calendar : {
+ sameDay : '[í dag kl.] LT',
+ nextDay : '[á morgun kl.] LT',
+ nextWeek : 'dddd [kl.] LT',
+ lastDay : '[í gær kl.] LT',
+ lastWeek : '[síðasta] dddd [kl.] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'eftir %s',
+ past : 'fyrir %s síðan',
+ s : translate$5,
+ m : translate$5,
+ mm : translate$5,
+ h : 'klukkustund',
+ hh : translate$5,
+ d : translate$5,
+ dd : translate$5,
+ M : translate$5,
+ MM : translate$5,
+ y : translate$5,
+ yy : translate$5
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Italian [it]
+//! author : Lorenzo : https://github.com/aliem
+//! author: Mattia Larentis: https://github.com/nostalgiaz
+
+moment.defineLocale('it', {
+ months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'),
+ monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
+ weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'),
+ weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'),
+ weekdaysMin : 'Do_Lu_Ma_Me_Gi_Ve_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Oggi alle] LT',
+ nextDay: '[Domani alle] LT',
+ nextWeek: 'dddd [alle] LT',
+ lastDay: '[Ieri alle] LT',
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[la scorsa] dddd [alle] LT';
+ default:
+ return '[lo scorso] dddd [alle] LT';
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : function (s) {
+ return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s;
+ },
+ past : '%s fa',
+ s : 'alcuni secondi',
+ m : 'un minuto',
+ mm : '%d minuti',
+ h : 'un\'ora',
+ hh : '%d ore',
+ d : 'un giorno',
+ dd : '%d giorni',
+ M : 'un mese',
+ MM : '%d mesi',
+ y : 'un anno',
+ yy : '%d anni'
+ },
+ ordinalParse : /\d{1,2}º/,
+ ordinal: '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Japanese [ja]
+//! author : LI Long : https://github.com/baryon
+
+moment.defineLocale('ja', {
+ months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+ monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+ weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),
+ weekdaysShort : '日_月_火_水_木_金_土'.split('_'),
+ weekdaysMin : '日_月_火_水_木_金_土'.split('_'),
+ longDateFormat : {
+ LT : 'Ah時m分',
+ LTS : 'Ah時m分s秒',
+ L : 'YYYY/MM/DD',
+ LL : 'YYYY年M月D日',
+ LLL : 'YYYY年M月D日Ah時m分',
+ LLLL : 'YYYY年M月D日Ah時m分 dddd'
+ },
+ meridiemParse: /午前|午後/i,
+ isPM : function (input) {
+ return input === '午後';
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return '午前';
+ } else {
+ return '午後';
+ }
+ },
+ calendar : {
+ sameDay : '[今日] LT',
+ nextDay : '[明日] LT',
+ nextWeek : '[来週]dddd LT',
+ lastDay : '[昨日] LT',
+ lastWeek : '[前週]dddd LT',
+ sameElse : 'L'
+ },
+ ordinalParse : /\d{1,2}日/,
+ ordinal : function (number, period) {
+ switch (period) {
+ case 'd':
+ case 'D':
+ case 'DDD':
+ return number + '日';
+ default:
+ return number;
+ }
+ },
+ relativeTime : {
+ future : '%s後',
+ past : '%s前',
+ s : '数秒',
+ m : '1分',
+ mm : '%d分',
+ h : '1時間',
+ hh : '%d時間',
+ d : '1日',
+ dd : '%d日',
+ M : '1ヶ月',
+ MM : '%dヶ月',
+ y : '1年',
+ yy : '%d年'
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Javanese [jv]
+//! author : Rony Lantip : https://github.com/lantip
+//! reference: http://jv.wikipedia.org/wiki/Basa_Jawa
+
+moment.defineLocale('jv', {
+ months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'),
+ weekdays : 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'),
+ weekdaysShort : 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'),
+ weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [pukul] HH.mm',
+ LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+ },
+ meridiemParse: /enjing|siyang|sonten|ndalu/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'enjing') {
+ return hour;
+ } else if (meridiem === 'siyang') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'sonten' || meridiem === 'ndalu') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'enjing';
+ } else if (hours < 15) {
+ return 'siyang';
+ } else if (hours < 19) {
+ return 'sonten';
+ } else {
+ return 'ndalu';
+ }
+ },
+ calendar : {
+ sameDay : '[Dinten puniko pukul] LT',
+ nextDay : '[Mbenjang pukul] LT',
+ nextWeek : 'dddd [pukul] LT',
+ lastDay : '[Kala wingi pukul] LT',
+ lastWeek : 'dddd [kepengker pukul] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'wonten ing %s',
+ past : '%s ingkang kepengker',
+ s : 'sawetawis detik',
+ m : 'setunggal menit',
+ mm : '%d menit',
+ h : 'setunggal jam',
+ hh : '%d jam',
+ d : 'sedinten',
+ dd : '%d dinten',
+ M : 'sewulan',
+ MM : '%d wulan',
+ y : 'setaun',
+ yy : '%d taun'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Georgian [ka]
+//! author : Irakli Janiashvili : https://github.com/irakli-janiashvili
+
+moment.defineLocale('ka', {
+ months : {
+ standalone: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),
+ format: 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_')
+ },
+ monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),
+ weekdays : {
+ standalone: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),
+ format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_'),
+ isFormat: /(წინა|შემდეგ)/
+ },
+ weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),
+ weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[დღეს] LT[-ზე]',
+ nextDay : '[ხვალ] LT[-ზე]',
+ lastDay : '[გუშინ] LT[-ზე]',
+ nextWeek : '[შემდეგ] dddd LT[-ზე]',
+ lastWeek : '[წინა] dddd LT-ზე',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : function (s) {
+ return (/(წამი|წუთი|საათი|წელი)/).test(s) ?
+ s.replace(/ი$/, 'ში') :
+ s + 'ში';
+ },
+ past : function (s) {
+ if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) {
+ return s.replace(/(ი|ე)$/, 'ის წინ');
+ }
+ if ((/წელი/).test(s)) {
+ return s.replace(/წელი$/, 'წლის წინ');
+ }
+ },
+ s : 'რამდენიმე წამი',
+ m : 'წუთი',
+ mm : '%d წუთი',
+ h : 'საათი',
+ hh : '%d საათი',
+ d : 'დღე',
+ dd : '%d დღე',
+ M : 'თვე',
+ MM : '%d თვე',
+ y : 'წელი',
+ yy : '%d წელი'
+ },
+ ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,
+ ordinal : function (number) {
+ if (number === 0) {
+ return number;
+ }
+ if (number === 1) {
+ return number + '-ლი';
+ }
+ if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) {
+ return 'მე-' + number;
+ }
+ return number + '-ე';
+ },
+ week : {
+ dow : 1,
+ doy : 7
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Kazakh [kk]
+//! authors : Nurlan Rakhimzhanov : https://github.com/nurlan
+
+var suffixes$1 = {
+ 0: '-ші',
+ 1: '-ші',
+ 2: '-ші',
+ 3: '-ші',
+ 4: '-ші',
+ 5: '-ші',
+ 6: '-шы',
+ 7: '-ші',
+ 8: '-ші',
+ 9: '-шы',
+ 10: '-шы',
+ 20: '-шы',
+ 30: '-шы',
+ 40: '-шы',
+ 50: '-ші',
+ 60: '-шы',
+ 70: '-ші',
+ 80: '-ші',
+ 90: '-шы',
+ 100: '-ші'
+};
+
+moment.defineLocale('kk', {
+ months : 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split('_'),
+ monthsShort : 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'),
+ weekdays : 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split('_'),
+ weekdaysShort : 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'),
+ weekdaysMin : 'жк_дй_сй_ср_бй_жм_сн'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Бүгін сағат] LT',
+ nextDay : '[Ертең сағат] LT',
+ nextWeek : 'dddd [сағат] LT',
+ lastDay : '[Кеше сағат] LT',
+ lastWeek : '[Өткен аптаның] dddd [сағат] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s ішінде',
+ past : '%s бұрын',
+ s : 'бірнеше секунд',
+ m : 'бір минут',
+ mm : '%d минут',
+ h : 'бір сағат',
+ hh : '%d сағат',
+ d : 'бір күн',
+ dd : '%d күн',
+ M : 'бір ай',
+ MM : '%d ай',
+ y : 'бір жыл',
+ yy : '%d жыл'
+ },
+ ordinalParse: /\d{1,2}-(ші|шы)/,
+ ordinal : function (number) {
+ var a = number % 10,
+ b = number >= 100 ? 100 : null;
+ return number + (suffixes$1[number] || suffixes$1[a] || suffixes$1[b]);
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Cambodian [km]
+//! author : Kruy Vanna : https://github.com/kruyvanna
+
+moment.defineLocale('km', {
+ months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
+ monthsShort: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
+ weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
+ weekdaysShort: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
+ weekdaysMin: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY HH:mm',
+ LLLL: 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar: {
+ sameDay: '[ថ្ងៃនេះ ម៉ោង] LT',
+ nextDay: '[ស្អែក ម៉ោង] LT',
+ nextWeek: 'dddd [ម៉ោង] LT',
+ lastDay: '[ម្សិលមិញ ម៉ោង] LT',
+ lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: '%sទៀត',
+ past: '%sមុន',
+ s: 'ប៉ុន្មានវិនាទី',
+ m: 'មួយនាទី',
+ mm: '%d នាទី',
+ h: 'មួយម៉ោង',
+ hh: '%d ម៉ោង',
+ d: 'មួយថ្ងៃ',
+ dd: '%d ថ្ងៃ',
+ M: 'មួយខែ',
+ MM: '%d ខែ',
+ y: 'មួយឆ្នាំ',
+ yy: '%d ឆ្នាំ'
+ },
+ week: {
+ dow: 1, // Monday is the first day of the week.
+ doy: 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Korean [ko]
+//! author : Kyungwook, Park : https://github.com/kyungw00k
+//! author : Jeeeyul Lee <jeeeyul@gmail.com>
+
+moment.defineLocale('ko', {
+ months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
+ monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
+ weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),
+ weekdaysShort : '일_월_화_수_목_금_토'.split('_'),
+ weekdaysMin : '일_월_화_수_목_금_토'.split('_'),
+ longDateFormat : {
+ LT : 'A h시 m분',
+ LTS : 'A h시 m분 s초',
+ L : 'YYYY.MM.DD',
+ LL : 'YYYY년 MMMM D일',
+ LLL : 'YYYY년 MMMM D일 A h시 m분',
+ LLLL : 'YYYY년 MMMM D일 dddd A h시 m분'
+ },
+ calendar : {
+ sameDay : '오늘 LT',
+ nextDay : '내일 LT',
+ nextWeek : 'dddd LT',
+ lastDay : '어제 LT',
+ lastWeek : '지난주 dddd LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s 후',
+ past : '%s 전',
+ s : '몇 초',
+ ss : '%d초',
+ m : '일분',
+ mm : '%d분',
+ h : '한 시간',
+ hh : '%d시간',
+ d : '하루',
+ dd : '%d일',
+ M : '한 달',
+ MM : '%d달',
+ y : '일 년',
+ yy : '%d년'
+ },
+ ordinalParse : /\d{1,2}일/,
+ ordinal : '%d일',
+ meridiemParse : /오전|오후/,
+ isPM : function (token) {
+ return token === '오후';
+ },
+ meridiem : function (hour, minute, isUpper) {
+ return hour < 12 ? '오전' : '오후';
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Kyrgyz [ky]
+//! author : Chyngyz Arystan uulu : https://github.com/chyngyz
+
+
+var suffixes$2 = {
+ 0: '-чү',
+ 1: '-чи',
+ 2: '-чи',
+ 3: '-чү',
+ 4: '-чү',
+ 5: '-чи',
+ 6: '-чы',
+ 7: '-чи',
+ 8: '-чи',
+ 9: '-чу',
+ 10: '-чу',
+ 20: '-чы',
+ 30: '-чу',
+ 40: '-чы',
+ 50: '-чү',
+ 60: '-чы',
+ 70: '-чи',
+ 80: '-чи',
+ 90: '-чу',
+ 100: '-чү'
+};
+
+moment.defineLocale('ky', {
+ months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
+ monthsShort : 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),
+ weekdays : 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split('_'),
+ weekdaysShort : 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'),
+ weekdaysMin : 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Бүгүн саат] LT',
+ nextDay : '[Эртең саат] LT',
+ nextWeek : 'dddd [саат] LT',
+ lastDay : '[Кече саат] LT',
+ lastWeek : '[Өткен аптанын] dddd [күнү] [саат] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s ичинде',
+ past : '%s мурун',
+ s : 'бирнече секунд',
+ m : 'бир мүнөт',
+ mm : '%d мүнөт',
+ h : 'бир саат',
+ hh : '%d саат',
+ d : 'бир күн',
+ dd : '%d күн',
+ M : 'бир ай',
+ MM : '%d ай',
+ y : 'бир жыл',
+ yy : '%d жыл'
+ },
+ ordinalParse: /\d{1,2}-(чи|чы|чү|чу)/,
+ ordinal : function (number) {
+ var a = number % 10,
+ b = number >= 100 ? 100 : null;
+ return number + (suffixes$2[number] || suffixes$2[a] || suffixes$2[b]);
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Luxembourgish [lb]
+//! author : mweimerskirch : https://github.com/mweimerskirch
+//! author : David Raison : https://github.com/kwisatz
+
+function processRelativeTime$3(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 'm': ['eng Minutt', 'enger Minutt'],
+ 'h': ['eng Stonn', 'enger Stonn'],
+ 'd': ['een Dag', 'engem Dag'],
+ 'M': ['ee Mount', 'engem Mount'],
+ 'y': ['ee Joer', 'engem Joer']
+ };
+ return withoutSuffix ? format[key][0] : format[key][1];
+}
+function processFutureTime(string) {
+ var number = string.substr(0, string.indexOf(' '));
+ if (eifelerRegelAppliesToNumber(number)) {
+ return 'a ' + string;
+ }
+ return 'an ' + string;
+}
+function processPastTime(string) {
+ var number = string.substr(0, string.indexOf(' '));
+ if (eifelerRegelAppliesToNumber(number)) {
+ return 'viru ' + string;
+ }
+ return 'virun ' + string;
+}
+/**
+ * Returns true if the word before the given number loses the '-n' ending.
+ * e.g. 'an 10 Deeg' but 'a 5 Deeg'
+ *
+ * @param number {integer}
+ * @returns {boolean}
+ */
+function eifelerRegelAppliesToNumber(number) {
+ number = parseInt(number, 10);
+ if (isNaN(number)) {
+ return false;
+ }
+ if (number < 0) {
+ // Negative Number --> always true
+ return true;
+ } else if (number < 10) {
+ // Only 1 digit
+ if (4 <= number && number <= 7) {
+ return true;
+ }
+ return false;
+ } else if (number < 100) {
+ // 2 digits
+ var lastDigit = number % 10, firstDigit = number / 10;
+ if (lastDigit === 0) {
+ return eifelerRegelAppliesToNumber(firstDigit);
+ }
+ return eifelerRegelAppliesToNumber(lastDigit);
+ } else if (number < 10000) {
+ // 3 or 4 digits --> recursively check first digit
+ while (number >= 10) {
+ number = number / 10;
+ }
+ return eifelerRegelAppliesToNumber(number);
+ } else {
+ // Anything larger than 4 digits: recursively check first n-3 digits
+ number = number / 1000;
+ return eifelerRegelAppliesToNumber(number);
+ }
+}
+
+moment.defineLocale('lb', {
+ months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
+ monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+ monthsParseExact : true,
+ weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'),
+ weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'),
+ weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat: {
+ LT: 'H:mm [Auer]',
+ LTS: 'H:mm:ss [Auer]',
+ L: 'DD.MM.YYYY',
+ LL: 'D. MMMM YYYY',
+ LLL: 'D. MMMM YYYY H:mm [Auer]',
+ LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]'
+ },
+ calendar: {
+ sameDay: '[Haut um] LT',
+ sameElse: 'L',
+ nextDay: '[Muer um] LT',
+ nextWeek: 'dddd [um] LT',
+ lastDay: '[Gëschter um] LT',
+ lastWeek: function () {
+ // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule
+ switch (this.day()) {
+ case 2:
+ case 4:
+ return '[Leschten] dddd [um] LT';
+ default:
+ return '[Leschte] dddd [um] LT';
+ }
+ }
+ },
+ relativeTime : {
+ future : processFutureTime,
+ past : processPastTime,
+ s : 'e puer Sekonnen',
+ m : processRelativeTime$3,
+ mm : '%d Minutten',
+ h : processRelativeTime$3,
+ hh : '%d Stonnen',
+ d : processRelativeTime$3,
+ dd : '%d Deeg',
+ M : processRelativeTime$3,
+ MM : '%d Méint',
+ y : processRelativeTime$3,
+ yy : '%d Joer'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal: '%d.',
+ week: {
+ dow: 1, // Monday is the first day of the week.
+ doy: 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Lao [lo]
+//! author : Ryan Hart : https://github.com/ryanhart2
+
+moment.defineLocale('lo', {
+ months : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'),
+ monthsShort : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'),
+ weekdays : 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
+ weekdaysShort : 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
+ weekdaysMin : 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'ວັນdddd D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/,
+ isPM: function (input) {
+ return input === 'ຕອນແລງ';
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'ຕອນເຊົ້າ';
+ } else {
+ return 'ຕອນແລງ';
+ }
+ },
+ calendar : {
+ sameDay : '[ມື້ນີ້ເວລາ] LT',
+ nextDay : '[ມື້ອື່ນເວລາ] LT',
+ nextWeek : '[ວັນ]dddd[ໜ້າເວລາ] LT',
+ lastDay : '[ມື້ວານນີ້ເວລາ] LT',
+ lastWeek : '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'ອີກ %s',
+ past : '%sຜ່ານມາ',
+ s : 'ບໍ່ເທົ່າໃດວິນາທີ',
+ m : '1 ນາທີ',
+ mm : '%d ນາທີ',
+ h : '1 ຊົ່ວໂມງ',
+ hh : '%d ຊົ່ວໂມງ',
+ d : '1 ມື້',
+ dd : '%d ມື້',
+ M : '1 ເດືອນ',
+ MM : '%d ເດືອນ',
+ y : '1 ປີ',
+ yy : '%d ປີ'
+ },
+ ordinalParse: /(ທີ່)\d{1,2}/,
+ ordinal : function (number) {
+ return 'ທີ່' + number;
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Lithuanian [lt]
+//! author : Mindaugas Mozūras : https://github.com/mmozuras
+
+var units = {
+ 'm' : 'minutė_minutės_minutę',
+ 'mm': 'minutės_minučių_minutes',
+ 'h' : 'valanda_valandos_valandą',
+ 'hh': 'valandos_valandų_valandas',
+ 'd' : 'diena_dienos_dieną',
+ 'dd': 'dienos_dienų_dienas',
+ 'M' : 'mėnuo_mėnesio_mėnesį',
+ 'MM': 'mėnesiai_mėnesių_mėnesius',
+ 'y' : 'metai_metų_metus',
+ 'yy': 'metai_metų_metus'
+};
+function translateSeconds(number, withoutSuffix, key, isFuture) {
+ if (withoutSuffix) {
+ return 'kelios sekundės';
+ } else {
+ return isFuture ? 'kelių sekundžių' : 'kelias sekundes';
+ }
+}
+function translateSingular(number, withoutSuffix, key, isFuture) {
+ return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]);
+}
+function special(number) {
+ return number % 10 === 0 || (number > 10 && number < 20);
+}
+function forms(key) {
+ return units[key].split('_');
+}
+function translate$6(number, withoutSuffix, key, isFuture) {
+ var result = number + ' ';
+ if (number === 1) {
+ return result + translateSingular(number, withoutSuffix, key[0], isFuture);
+ } else if (withoutSuffix) {
+ return result + (special(number) ? forms(key)[1] : forms(key)[0]);
+ } else {
+ if (isFuture) {
+ return result + forms(key)[1];
+ } else {
+ return result + (special(number) ? forms(key)[1] : forms(key)[2]);
+ }
+ }
+}
+moment.defineLocale('lt', {
+ months : {
+ format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'),
+ standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'),
+ isFormat: /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/
+ },
+ monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),
+ weekdays : {
+ format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split('_'),
+ standalone: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'),
+ isFormat: /dddd HH:mm/
+ },
+ weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'),
+ weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'YYYY-MM-DD',
+ LL : 'YYYY [m.] MMMM D [d.]',
+ LLL : 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
+ LLLL : 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]',
+ l : 'YYYY-MM-DD',
+ ll : 'YYYY [m.] MMMM D [d.]',
+ lll : 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
+ llll : 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]'
+ },
+ calendar : {
+ sameDay : '[Šiandien] LT',
+ nextDay : '[Rytoj] LT',
+ nextWeek : 'dddd LT',
+ lastDay : '[Vakar] LT',
+ lastWeek : '[Praėjusį] dddd LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'po %s',
+ past : 'prieš %s',
+ s : translateSeconds,
+ m : translateSingular,
+ mm : translate$6,
+ h : translateSingular,
+ hh : translate$6,
+ d : translateSingular,
+ dd : translate$6,
+ M : translateSingular,
+ MM : translate$6,
+ y : translateSingular,
+ yy : translate$6
+ },
+ ordinalParse: /\d{1,2}-oji/,
+ ordinal : function (number) {
+ return number + '-oji';
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Latvian [lv]
+//! author : Kristaps Karlsons : https://github.com/skakri
+//! author : Jānis Elmeris : https://github.com/JanisE
+
+var units$1 = {
+ 'm': 'minūtes_minūtēm_minūte_minūtes'.split('_'),
+ 'mm': 'minūtes_minūtēm_minūte_minūtes'.split('_'),
+ 'h': 'stundas_stundām_stunda_stundas'.split('_'),
+ 'hh': 'stundas_stundām_stunda_stundas'.split('_'),
+ 'd': 'dienas_dienām_diena_dienas'.split('_'),
+ 'dd': 'dienas_dienām_diena_dienas'.split('_'),
+ 'M': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
+ 'MM': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
+ 'y': 'gada_gadiem_gads_gadi'.split('_'),
+ 'yy': 'gada_gadiem_gads_gadi'.split('_')
+};
+/**
+ * @param withoutSuffix boolean true = a length of time; false = before/after a period of time.
+ */
+function format(forms, number, withoutSuffix) {
+ if (withoutSuffix) {
+ // E.g. "21 minūte", "3 minūtes".
+ return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3];
+ } else {
+ // E.g. "21 minūtes" as in "pēc 21 minūtes".
+ // E.g. "3 minūtēm" as in "pēc 3 minūtēm".
+ return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1];
+ }
+}
+function relativeTimeWithPlural$1(number, withoutSuffix, key) {
+ return number + ' ' + format(units$1[key], number, withoutSuffix);
+}
+function relativeTimeWithSingular(number, withoutSuffix, key) {
+ return format(units$1[key], number, withoutSuffix);
+}
+function relativeSeconds(number, withoutSuffix) {
+ return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm';
+}
+
+moment.defineLocale('lv', {
+ months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),
+ weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'),
+ weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'),
+ weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY.',
+ LL : 'YYYY. [gada] D. MMMM',
+ LLL : 'YYYY. [gada] D. MMMM, HH:mm',
+ LLLL : 'YYYY. [gada] D. MMMM, dddd, HH:mm'
+ },
+ calendar : {
+ sameDay : '[Šodien pulksten] LT',
+ nextDay : '[Rīt pulksten] LT',
+ nextWeek : 'dddd [pulksten] LT',
+ lastDay : '[Vakar pulksten] LT',
+ lastWeek : '[Pagājušā] dddd [pulksten] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'pēc %s',
+ past : 'pirms %s',
+ s : relativeSeconds,
+ m : relativeTimeWithSingular,
+ mm : relativeTimeWithPlural$1,
+ h : relativeTimeWithSingular,
+ hh : relativeTimeWithPlural$1,
+ d : relativeTimeWithSingular,
+ dd : relativeTimeWithPlural$1,
+ M : relativeTimeWithSingular,
+ MM : relativeTimeWithPlural$1,
+ y : relativeTimeWithSingular,
+ yy : relativeTimeWithPlural$1
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Montenegrin [me]
+//! author : Miodrag Nikač <miodrag@restartit.me> : https://github.com/miodragnikac
+
+var translator = {
+ words: { //Different grammatical cases
+ m: ['jedan minut', 'jednog minuta'],
+ mm: ['minut', 'minuta', 'minuta'],
+ h: ['jedan sat', 'jednog sata'],
+ hh: ['sat', 'sata', 'sati'],
+ dd: ['dan', 'dana', 'dana'],
+ MM: ['mjesec', 'mjeseca', 'mjeseci'],
+ yy: ['godina', 'godine', 'godina']
+ },
+ correctGrammaticalCase: function (number, wordKey) {
+ return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
+ },
+ translate: function (number, withoutSuffix, key) {
+ var wordKey = translator.words[key];
+ if (key.length === 1) {
+ return withoutSuffix ? wordKey[0] : wordKey[1];
+ } else {
+ return number + ' ' + translator.correctGrammaticalCase(number, wordKey);
+ }
+ }
+};
+
+moment.defineLocale('me', {
+ months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'),
+ monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
+ monthsParseExact : true,
+ weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
+ weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
+ weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat: {
+ LT: 'H:mm',
+ LTS : 'H:mm:ss',
+ L: 'DD.MM.YYYY',
+ LL: 'D. MMMM YYYY',
+ LLL: 'D. MMMM YYYY H:mm',
+ LLLL: 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar: {
+ sameDay: '[danas u] LT',
+ nextDay: '[sjutra u] LT',
+
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[u] [nedjelju] [u] LT';
+ case 3:
+ return '[u] [srijedu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ },
+ lastDay : '[juče u] LT',
+ lastWeek : function () {
+ var lastWeekDays = [
+ '[prošle] [nedjelje] [u] LT',
+ '[prošlog] [ponedjeljka] [u] LT',
+ '[prošlog] [utorka] [u] LT',
+ '[prošle] [srijede] [u] LT',
+ '[prošlog] [četvrtka] [u] LT',
+ '[prošlog] [petka] [u] LT',
+ '[prošle] [subote] [u] LT'
+ ];
+ return lastWeekDays[this.day()];
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'prije %s',
+ s : 'nekoliko sekundi',
+ m : translator.translate,
+ mm : translator.translate,
+ h : translator.translate,
+ hh : translator.translate,
+ d : 'dan',
+ dd : translator.translate,
+ M : 'mjesec',
+ MM : translator.translate,
+ y : 'godinu',
+ yy : translator.translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Maori [mi]
+//! author : John Corrigan <robbiecloset@gmail.com> : https://github.com/johnideal
+
+moment.defineLocale('mi', {
+ months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split('_'),
+ monthsShort: 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split('_'),
+ monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
+ monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
+ monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
+ monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,
+ weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'),
+ weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
+ weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY [i] HH:mm',
+ LLLL: 'dddd, D MMMM YYYY [i] HH:mm'
+ },
+ calendar: {
+ sameDay: '[i teie mahana, i] LT',
+ nextDay: '[apopo i] LT',
+ nextWeek: 'dddd [i] LT',
+ lastDay: '[inanahi i] LT',
+ lastWeek: 'dddd [whakamutunga i] LT',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: 'i roto i %s',
+ past: '%s i mua',
+ s: 'te hēkona ruarua',
+ m: 'he meneti',
+ mm: '%d meneti',
+ h: 'te haora',
+ hh: '%d haora',
+ d: 'he ra',
+ dd: '%d ra',
+ M: 'he marama',
+ MM: '%d marama',
+ y: 'he tau',
+ yy: '%d tau'
+ },
+ ordinalParse: /\d{1,2}º/,
+ ordinal: '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Macedonian [mk]
+//! author : Borislav Mickov : https://github.com/B0k0
+
+moment.defineLocale('mk', {
+ months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'),
+ monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),
+ weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'),
+ weekdaysShort : 'нед_пон_вто_сре_чет_пет_саб'.split('_'),
+ weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'D.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY H:mm',
+ LLLL : 'dddd, D MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[Денес во] LT',
+ nextDay : '[Утре во] LT',
+ nextWeek : '[Во] dddd [во] LT',
+ lastDay : '[Вчера во] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ case 6:
+ return '[Изминатата] dddd [во] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[Изминатиот] dddd [во] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'после %s',
+ past : 'пред %s',
+ s : 'неколку секунди',
+ m : 'минута',
+ mm : '%d минути',
+ h : 'час',
+ hh : '%d часа',
+ d : 'ден',
+ dd : '%d дена',
+ M : 'месец',
+ MM : '%d месеци',
+ y : 'година',
+ yy : '%d години'
+ },
+ ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
+ ordinal : function (number) {
+ var lastDigit = number % 10,
+ last2Digits = number % 100;
+ if (number === 0) {
+ return number + '-ев';
+ } else if (last2Digits === 0) {
+ return number + '-ен';
+ } else if (last2Digits > 10 && last2Digits < 20) {
+ return number + '-ти';
+ } else if (lastDigit === 1) {
+ return number + '-ви';
+ } else if (lastDigit === 2) {
+ return number + '-ри';
+ } else if (lastDigit === 7 || lastDigit === 8) {
+ return number + '-ми';
+ } else {
+ return number + '-ти';
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Malayalam [ml]
+//! author : Floyd Pink : https://github.com/floydpink
+
+moment.defineLocale('ml', {
+ months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'),
+ monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'),
+ weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'),
+ weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm -നു',
+ LTS : 'A h:mm:ss -നു',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm -നു',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm -നു'
+ },
+ calendar : {
+ sameDay : '[ഇന്ന്] LT',
+ nextDay : '[നാളെ] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[ഇന്നലെ] LT',
+ lastWeek : '[കഴിഞ്ഞ] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s കഴിഞ്ഞ്',
+ past : '%s മുൻപ്',
+ s : 'അൽപ നിമിഷങ്ങൾ',
+ m : 'ഒരു മിനിറ്റ്',
+ mm : '%d മിനിറ്റ്',
+ h : 'ഒരു മണിക്കൂർ',
+ hh : '%d മണിക്കൂർ',
+ d : 'ഒരു ദിവസം',
+ dd : '%d ദിവസം',
+ M : 'ഒരു മാസം',
+ MM : '%d മാസം',
+ y : 'ഒരു വർഷം',
+ yy : '%d വർഷം'
+ },
+ meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if ((meridiem === 'രാത്രി' && hour >= 4) ||
+ meridiem === 'ഉച്ച കഴിഞ്ഞ്' ||
+ meridiem === 'വൈകുന്നേരം') {
+ return hour + 12;
+ } else {
+ return hour;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'രാത്രി';
+ } else if (hour < 12) {
+ return 'രാവിലെ';
+ } else if (hour < 17) {
+ return 'ഉച്ച കഴിഞ്ഞ്';
+ } else if (hour < 20) {
+ return 'വൈകുന്നേരം';
+ } else {
+ return 'രാത്രി';
+ }
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Marathi [mr]
+//! author : Harshad Kale : https://github.com/kalehv
+//! author : Vivek Athalye : https://github.com/vnathalye
+
+var symbolMap$7 = {
+ '1': '१',
+ '2': '२',
+ '3': '३',
+ '4': '४',
+ '5': '५',
+ '6': '६',
+ '7': '७',
+ '8': '८',
+ '9': '९',
+ '0': '०'
+};
+var numberMap$6 = {
+ '१': '1',
+ '२': '2',
+ '३': '3',
+ '४': '4',
+ '५': '5',
+ '६': '6',
+ '७': '7',
+ '८': '8',
+ '९': '9',
+ '०': '0'
+};
+
+function relativeTimeMr(number, withoutSuffix, string, isFuture)
+{
+ var output = '';
+ if (withoutSuffix) {
+ switch (string) {
+ case 's': output = 'काही सेकंद'; break;
+ case 'm': output = 'एक मिनिट'; break;
+ case 'mm': output = '%d मिनिटे'; break;
+ case 'h': output = 'एक तास'; break;
+ case 'hh': output = '%d तास'; break;
+ case 'd': output = 'एक दिवस'; break;
+ case 'dd': output = '%d दिवस'; break;
+ case 'M': output = 'एक महिना'; break;
+ case 'MM': output = '%d महिने'; break;
+ case 'y': output = 'एक वर्ष'; break;
+ case 'yy': output = '%d वर्षे'; break;
+ }
+ }
+ else {
+ switch (string) {
+ case 's': output = 'काही सेकंदां'; break;
+ case 'm': output = 'एका मिनिटा'; break;
+ case 'mm': output = '%d मिनिटां'; break;
+ case 'h': output = 'एका तासा'; break;
+ case 'hh': output = '%d तासां'; break;
+ case 'd': output = 'एका दिवसा'; break;
+ case 'dd': output = '%d दिवसां'; break;
+ case 'M': output = 'एका महिन्या'; break;
+ case 'MM': output = '%d महिन्यां'; break;
+ case 'y': output = 'एका वर्षा'; break;
+ case 'yy': output = '%d वर्षां'; break;
+ }
+ }
+ return output.replace(/%d/i, number);
+}
+
+moment.defineLocale('mr', {
+ months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'),
+ monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
+ weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'),
+ weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm वाजता',
+ LTS : 'A h:mm:ss वाजता',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm वाजता',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm वाजता'
+ },
+ calendar : {
+ sameDay : '[आज] LT',
+ nextDay : '[उद्या] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[काल] LT',
+ lastWeek: '[मागील] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future: '%sमध्ये',
+ past: '%sपूर्वी',
+ s: relativeTimeMr,
+ m: relativeTimeMr,
+ mm: relativeTimeMr,
+ h: relativeTimeMr,
+ hh: relativeTimeMr,
+ d: relativeTimeMr,
+ dd: relativeTimeMr,
+ M: relativeTimeMr,
+ MM: relativeTimeMr,
+ y: relativeTimeMr,
+ yy: relativeTimeMr
+ },
+ preparse: function (string) {
+ return string.replace(/[१२३४५६७८९०]/g, function (match) {
+ return numberMap$6[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$7[match];
+ });
+ },
+ meridiemParse: /रात्री|सकाळी|दुपारी|सायंकाळी/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'रात्री') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'सकाळी') {
+ return hour;
+ } else if (meridiem === 'दुपारी') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'सायंकाळी') {
+ return hour + 12;
+ }
+ },
+ meridiem: function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'रात्री';
+ } else if (hour < 10) {
+ return 'सकाळी';
+ } else if (hour < 17) {
+ return 'दुपारी';
+ } else if (hour < 20) {
+ return 'सायंकाळी';
+ } else {
+ return 'रात्री';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Malay [ms-my]
+//! note : DEPRECATED, the correct one is [ms]
+//! author : Weldan Jamili : https://github.com/weldan
+
+moment.defineLocale('ms-my', {
+ months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),
+ monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
+ weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
+ weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
+ weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [pukul] HH.mm',
+ LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+ },
+ meridiemParse: /pagi|tengahari|petang|malam/,
+ meridiemHour: function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'pagi') {
+ return hour;
+ } else if (meridiem === 'tengahari') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'petang' || meridiem === 'malam') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'pagi';
+ } else if (hours < 15) {
+ return 'tengahari';
+ } else if (hours < 19) {
+ return 'petang';
+ } else {
+ return 'malam';
+ }
+ },
+ calendar : {
+ sameDay : '[Hari ini pukul] LT',
+ nextDay : '[Esok pukul] LT',
+ nextWeek : 'dddd [pukul] LT',
+ lastDay : '[Kelmarin pukul] LT',
+ lastWeek : 'dddd [lepas pukul] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'dalam %s',
+ past : '%s yang lepas',
+ s : 'beberapa saat',
+ m : 'seminit',
+ mm : '%d minit',
+ h : 'sejam',
+ hh : '%d jam',
+ d : 'sehari',
+ dd : '%d hari',
+ M : 'sebulan',
+ MM : '%d bulan',
+ y : 'setahun',
+ yy : '%d tahun'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Malay [ms]
+//! author : Weldan Jamili : https://github.com/weldan
+
+moment.defineLocale('ms', {
+ months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),
+ monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
+ weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
+ weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
+ weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [pukul] HH.mm',
+ LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+ },
+ meridiemParse: /pagi|tengahari|petang|malam/,
+ meridiemHour: function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'pagi') {
+ return hour;
+ } else if (meridiem === 'tengahari') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'petang' || meridiem === 'malam') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'pagi';
+ } else if (hours < 15) {
+ return 'tengahari';
+ } else if (hours < 19) {
+ return 'petang';
+ } else {
+ return 'malam';
+ }
+ },
+ calendar : {
+ sameDay : '[Hari ini pukul] LT',
+ nextDay : '[Esok pukul] LT',
+ nextWeek : 'dddd [pukul] LT',
+ lastDay : '[Kelmarin pukul] LT',
+ lastWeek : 'dddd [lepas pukul] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'dalam %s',
+ past : '%s yang lepas',
+ s : 'beberapa saat',
+ m : 'seminit',
+ mm : '%d minit',
+ h : 'sejam',
+ hh : '%d jam',
+ d : 'sehari',
+ dd : '%d hari',
+ M : 'sebulan',
+ MM : '%d bulan',
+ y : 'setahun',
+ yy : '%d tahun'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Burmese [my]
+//! author : Squar team, mysquar.com
+//! author : David Rossellat : https://github.com/gholadr
+//! author : Tin Aung Lin : https://github.com/thanyawzinmin
+
+var symbolMap$8 = {
+ '1': '၁',
+ '2': '၂',
+ '3': '၃',
+ '4': '၄',
+ '5': '၅',
+ '6': '၆',
+ '7': '၇',
+ '8': '၈',
+ '9': '၉',
+ '0': '၀'
+};
+var numberMap$7 = {
+ '၁': '1',
+ '၂': '2',
+ '၃': '3',
+ '၄': '4',
+ '၅': '5',
+ '၆': '6',
+ '၇': '7',
+ '၈': '8',
+ '၉': '9',
+ '၀': '0'
+};
+
+moment.defineLocale('my', {
+ months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'),
+ monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'),
+ weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'),
+ weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+ weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY HH:mm',
+ LLLL: 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar: {
+ sameDay: '[ယနေ.] LT [မှာ]',
+ nextDay: '[မနက်ဖြန်] LT [မှာ]',
+ nextWeek: 'dddd LT [မှာ]',
+ lastDay: '[မနေ.က] LT [မှာ]',
+ lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: 'လာမည့် %s မှာ',
+ past: 'လွန်ခဲ့သော %s က',
+ s: 'စက္ကန်.အနည်းငယ်',
+ m: 'တစ်မိနစ်',
+ mm: '%d မိနစ်',
+ h: 'တစ်နာရီ',
+ hh: '%d နာရီ',
+ d: 'တစ်ရက်',
+ dd: '%d ရက်',
+ M: 'တစ်လ',
+ MM: '%d လ',
+ y: 'တစ်နှစ်',
+ yy: '%d နှစ်'
+ },
+ preparse: function (string) {
+ return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) {
+ return numberMap$7[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$8[match];
+ });
+ },
+ week: {
+ dow: 1, // Monday is the first day of the week.
+ doy: 4 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Norwegian Bokmål [nb]
+//! authors : Espen Hovlandsdal : https://github.com/rexxars
+//! Sigurd Gartmann : https://github.com/sigurdga
+
+moment.defineLocale('nb', {
+ months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
+ monthsShort : 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
+ weekdaysShort : 'sø._ma._ti._on._to._fr._lø.'.split('_'),
+ weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY [kl.] HH:mm',
+ LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm'
+ },
+ calendar : {
+ sameDay: '[i dag kl.] LT',
+ nextDay: '[i morgen kl.] LT',
+ nextWeek: 'dddd [kl.] LT',
+ lastDay: '[i går kl.] LT',
+ lastWeek: '[forrige] dddd [kl.] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'om %s',
+ past : '%s siden',
+ s : 'noen sekunder',
+ m : 'ett minutt',
+ mm : '%d minutter',
+ h : 'en time',
+ hh : '%d timer',
+ d : 'en dag',
+ dd : '%d dager',
+ M : 'en måned',
+ MM : '%d måneder',
+ y : 'ett år',
+ yy : '%d år'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Nepalese [ne]
+//! author : suvash : https://github.com/suvash
+
+var symbolMap$9 = {
+ '1': '१',
+ '2': '२',
+ '3': '३',
+ '4': '४',
+ '5': '५',
+ '6': '६',
+ '7': '७',
+ '8': '८',
+ '9': '९',
+ '0': '०'
+};
+var numberMap$8 = {
+ '१': '1',
+ '२': '2',
+ '३': '3',
+ '४': '4',
+ '५': '5',
+ '६': '6',
+ '७': '7',
+ '८': '8',
+ '९': '9',
+ '०': '0'
+};
+
+moment.defineLocale('ne', {
+ months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'),
+ monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'),
+ weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'),
+ weekdaysMin : 'आ._सो._मं._बु._बि._शु._श.'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'Aको h:mm बजे',
+ LTS : 'Aको h:mm:ss बजे',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, Aको h:mm बजे',
+ LLLL : 'dddd, D MMMM YYYY, Aको h:mm बजे'
+ },
+ preparse: function (string) {
+ return string.replace(/[१२३४५६७८९०]/g, function (match) {
+ return numberMap$8[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$9[match];
+ });
+ },
+ meridiemParse: /राति|बिहान|दिउँसो|साँझ/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'राति') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'बिहान') {
+ return hour;
+ } else if (meridiem === 'दिउँसो') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'साँझ') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 3) {
+ return 'राति';
+ } else if (hour < 12) {
+ return 'बिहान';
+ } else if (hour < 16) {
+ return 'दिउँसो';
+ } else if (hour < 20) {
+ return 'साँझ';
+ } else {
+ return 'राति';
+ }
+ },
+ calendar : {
+ sameDay : '[आज] LT',
+ nextDay : '[भोलि] LT',
+ nextWeek : '[आउँदो] dddd[,] LT',
+ lastDay : '[हिजो] LT',
+ lastWeek : '[गएको] dddd[,] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%sमा',
+ past : '%s अगाडि',
+ s : 'केही क्षण',
+ m : 'एक मिनेट',
+ mm : '%d मिनेट',
+ h : 'एक घण्टा',
+ hh : '%d घण्टा',
+ d : 'एक दिन',
+ dd : '%d दिन',
+ M : 'एक महिना',
+ MM : '%d महिना',
+ y : 'एक बर्ष',
+ yy : '%d बर्ष'
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Dutch (Belgium) [nl-be]
+//! author : Joris Röling : https://github.com/jorisroling
+//! author : Jacob Middag : https://github.com/middagj
+
+var monthsShortWithDots$1 = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_');
+var monthsShortWithoutDots$1 = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_');
+
+var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i];
+var monthsRegex = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;
+
+moment.defineLocale('nl-be', {
+ months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShortWithoutDots$1[m.month()];
+ } else {
+ return monthsShortWithDots$1[m.month()];
+ }
+ },
+
+ monthsRegex: monthsRegex,
+ monthsShortRegex: monthsRegex,
+ monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,
+ monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,
+
+ monthsParse : monthsParse,
+ longMonthsParse : monthsParse,
+ shortMonthsParse : monthsParse,
+
+ weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
+ weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'),
+ weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[vandaag om] LT',
+ nextDay: '[morgen om] LT',
+ nextWeek: 'dddd [om] LT',
+ lastDay: '[gisteren om] LT',
+ lastWeek: '[afgelopen] dddd [om] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'over %s',
+ past : '%s geleden',
+ s : 'een paar seconden',
+ m : 'één minuut',
+ mm : '%d minuten',
+ h : 'één uur',
+ hh : '%d uur',
+ d : 'één dag',
+ dd : '%d dagen',
+ M : 'één maand',
+ MM : '%d maanden',
+ y : 'één jaar',
+ yy : '%d jaar'
+ },
+ ordinalParse: /\d{1,2}(ste|de)/,
+ ordinal : function (number) {
+ return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Dutch [nl]
+//! author : Joris Röling : https://github.com/jorisroling
+//! author : Jacob Middag : https://github.com/middagj
+
+var monthsShortWithDots$2 = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_');
+var monthsShortWithoutDots$2 = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_');
+
+var monthsParse$1 = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i];
+var monthsRegex$1 = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;
+
+moment.defineLocale('nl', {
+ months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShortWithoutDots$2[m.month()];
+ } else {
+ return monthsShortWithDots$2[m.month()];
+ }
+ },
+
+ monthsRegex: monthsRegex$1,
+ monthsShortRegex: monthsRegex$1,
+ monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,
+ monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,
+
+ monthsParse : monthsParse$1,
+ longMonthsParse : monthsParse$1,
+ shortMonthsParse : monthsParse$1,
+
+ weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
+ weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'),
+ weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD-MM-YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[vandaag om] LT',
+ nextDay: '[morgen om] LT',
+ nextWeek: 'dddd [om] LT',
+ lastDay: '[gisteren om] LT',
+ lastWeek: '[afgelopen] dddd [om] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'over %s',
+ past : '%s geleden',
+ s : 'een paar seconden',
+ m : 'één minuut',
+ mm : '%d minuten',
+ h : 'één uur',
+ hh : '%d uur',
+ d : 'één dag',
+ dd : '%d dagen',
+ M : 'één maand',
+ MM : '%d maanden',
+ y : 'één jaar',
+ yy : '%d jaar'
+ },
+ ordinalParse: /\d{1,2}(ste|de)/,
+ ordinal : function (number) {
+ return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Nynorsk [nn]
+//! author : https://github.com/mechuwind
+
+moment.defineLocale('nn', {
+ months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
+ weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),
+ weekdaysShort : 'sun_mån_tys_ons_tor_fre_lau'.split('_'),
+ weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY [kl.] H:mm',
+ LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm'
+ },
+ calendar : {
+ sameDay: '[I dag klokka] LT',
+ nextDay: '[I morgon klokka] LT',
+ nextWeek: 'dddd [klokka] LT',
+ lastDay: '[I går klokka] LT',
+ lastWeek: '[Føregåande] dddd [klokka] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'om %s',
+ past : '%s sidan',
+ s : 'nokre sekund',
+ m : 'eit minutt',
+ mm : '%d minutt',
+ h : 'ein time',
+ hh : '%d timar',
+ d : 'ein dag',
+ dd : '%d dagar',
+ M : 'ein månad',
+ MM : '%d månader',
+ y : 'eit år',
+ yy : '%d år'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Punjabi (India) [pa-in]
+//! author : Harpreet Singh : https://github.com/harpreetkhalsagtbit
+
+var symbolMap$10 = {
+ '1': '੧',
+ '2': '੨',
+ '3': '੩',
+ '4': '੪',
+ '5': '੫',
+ '6': '੬',
+ '7': '੭',
+ '8': '੮',
+ '9': '੯',
+ '0': '੦'
+};
+var numberMap$9 = {
+ '੧': '1',
+ '੨': '2',
+ '੩': '3',
+ '੪': '4',
+ '੫': '5',
+ '੬': '6',
+ '੭': '7',
+ '੮': '8',
+ '੯': '9',
+ '੦': '0'
+};
+
+moment.defineLocale('pa-in', {
+ // There are months name as per Nanakshahi Calender but they are not used as rigidly in modern Punjabi.
+ months : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'),
+ monthsShort : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'),
+ weekdays : 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split('_'),
+ weekdaysShort : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
+ weekdaysMin : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm ਵਜੇ',
+ LTS : 'A h:mm:ss ਵਜੇ',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm ਵਜੇ',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm ਵਜੇ'
+ },
+ calendar : {
+ sameDay : '[ਅਜ] LT',
+ nextDay : '[ਕਲ] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[ਕਲ] LT',
+ lastWeek : '[ਪਿਛਲੇ] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s ਵਿੱਚ',
+ past : '%s ਪਿਛਲੇ',
+ s : 'ਕੁਝ ਸਕਿੰਟ',
+ m : 'ਇਕ ਮਿੰਟ',
+ mm : '%d ਮਿੰਟ',
+ h : 'ਇੱਕ ਘੰਟਾ',
+ hh : '%d ਘੰਟੇ',
+ d : 'ਇੱਕ ਦਿਨ',
+ dd : '%d ਦਿਨ',
+ M : 'ਇੱਕ ਮਹੀਨਾ',
+ MM : '%d ਮਹੀਨੇ',
+ y : 'ਇੱਕ ਸਾਲ',
+ yy : '%d ਸਾਲ'
+ },
+ preparse: function (string) {
+ return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) {
+ return numberMap$9[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$10[match];
+ });
+ },
+ // Punjabi notation for meridiems are quite fuzzy in practice. While there exists
+ // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi.
+ meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'ਰਾਤ') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'ਸਵੇਰ') {
+ return hour;
+ } else if (meridiem === 'ਦੁਪਹਿਰ') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'ਸ਼ਾਮ') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'ਰਾਤ';
+ } else if (hour < 10) {
+ return 'ਸਵੇਰ';
+ } else if (hour < 17) {
+ return 'ਦੁਪਹਿਰ';
+ } else if (hour < 20) {
+ return 'ਸ਼ਾਮ';
+ } else {
+ return 'ਰਾਤ';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Polish [pl]
+//! author : Rafal Hirsz : https://github.com/evoL
+
+var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_');
+var monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_');
+function plural$3(n) {
+ return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1);
+}
+function translate$7(number, withoutSuffix, key) {
+ var result = number + ' ';
+ switch (key) {
+ case 'm':
+ return withoutSuffix ? 'minuta' : 'minutę';
+ case 'mm':
+ return result + (plural$3(number) ? 'minuty' : 'minut');
+ case 'h':
+ return withoutSuffix ? 'godzina' : 'godzinę';
+ case 'hh':
+ return result + (plural$3(number) ? 'godziny' : 'godzin');
+ case 'MM':
+ return result + (plural$3(number) ? 'miesiące' : 'miesięcy');
+ case 'yy':
+ return result + (plural$3(number) ? 'lata' : 'lat');
+ }
+}
+
+moment.defineLocale('pl', {
+ months : function (momentToFormat, format) {
+ if (format === '') {
+ // Hack: if format empty we know this is used to generate
+ // RegExp by moment. Give then back both valid forms of months
+ // in RegExp ready format.
+ return '(' + monthsSubjective[momentToFormat.month()] + '|' + monthsNominative[momentToFormat.month()] + ')';
+ } else if (/D MMMM/.test(format)) {
+ return monthsSubjective[momentToFormat.month()];
+ } else {
+ return monthsNominative[momentToFormat.month()];
+ }
+ },
+ monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'),
+ weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'),
+ weekdaysShort : 'ndz_pon_wt_śr_czw_pt_sob'.split('_'),
+ weekdaysMin : 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Dziś o] LT',
+ nextDay: '[Jutro o] LT',
+ nextWeek: '[W] dddd [o] LT',
+ lastDay: '[Wczoraj o] LT',
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[W zeszłą niedzielę o] LT';
+ case 3:
+ return '[W zeszłą środę o] LT';
+ case 6:
+ return '[W zeszłą sobotę o] LT';
+ default:
+ return '[W zeszły] dddd [o] LT';
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : '%s temu',
+ s : 'kilka sekund',
+ m : translate$7,
+ mm : translate$7,
+ h : translate$7,
+ hh : translate$7,
+ d : '1 dzień',
+ dd : '%d dni',
+ M : 'miesiąc',
+ MM : translate$7,
+ y : 'rok',
+ yy : translate$7
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Portuguese (Brazil) [pt-br]
+//! author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
+
+moment.defineLocale('pt-br', {
+ months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'),
+ monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
+ weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'),
+ weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
+ weekdaysMin : 'Dom_2ª_3ª_4ª_5ª_6ª_Sáb'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D [de] MMMM [de] YYYY',
+ LLL : 'D [de] MMMM [de] YYYY [às] HH:mm',
+ LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm'
+ },
+ calendar : {
+ sameDay: '[Hoje às] LT',
+ nextDay: '[Amanhã às] LT',
+ nextWeek: 'dddd [às] LT',
+ lastDay: '[Ontem às] LT',
+ lastWeek: function () {
+ return (this.day() === 0 || this.day() === 6) ?
+ '[Último] dddd [às] LT' : // Saturday + Sunday
+ '[Última] dddd [às] LT'; // Monday - Friday
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'em %s',
+ past : '%s atrás',
+ s : 'poucos segundos',
+ m : 'um minuto',
+ mm : '%d minutos',
+ h : 'uma hora',
+ hh : '%d horas',
+ d : 'um dia',
+ dd : '%d dias',
+ M : 'um mês',
+ MM : '%d meses',
+ y : 'um ano',
+ yy : '%d anos'
+ },
+ ordinalParse: /\d{1,2}º/,
+ ordinal : '%dº'
+});
+
+//! moment.js locale configuration
+//! locale : Portuguese [pt]
+//! author : Jefferson : https://github.com/jalex79
+
+moment.defineLocale('pt', {
+ months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'),
+ monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
+ weekdays : 'Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado'.split('_'),
+ weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
+ weekdaysMin : 'Dom_2ª_3ª_4ª_5ª_6ª_Sáb'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D [de] MMMM [de] YYYY',
+ LLL : 'D [de] MMMM [de] YYYY HH:mm',
+ LLLL : 'dddd, D [de] MMMM [de] YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Hoje às] LT',
+ nextDay: '[Amanhã às] LT',
+ nextWeek: 'dddd [às] LT',
+ lastDay: '[Ontem às] LT',
+ lastWeek: function () {
+ return (this.day() === 0 || this.day() === 6) ?
+ '[Último] dddd [às] LT' : // Saturday + Sunday
+ '[Última] dddd [às] LT'; // Monday - Friday
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'em %s',
+ past : 'há %s',
+ s : 'segundos',
+ m : 'um minuto',
+ mm : '%d minutos',
+ h : 'uma hora',
+ hh : '%d horas',
+ d : 'um dia',
+ dd : '%d dias',
+ M : 'um mês',
+ MM : '%d meses',
+ y : 'um ano',
+ yy : '%d anos'
+ },
+ ordinalParse: /\d{1,2}º/,
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Romanian [ro]
+//! author : Vlad Gurdiga : https://github.com/gurdiga
+//! author : Valentin Agachi : https://github.com/avaly
+
+function relativeTimeWithPlural$2(number, withoutSuffix, key) {
+ var format = {
+ 'mm': 'minute',
+ 'hh': 'ore',
+ 'dd': 'zile',
+ 'MM': 'luni',
+ 'yy': 'ani'
+ },
+ separator = ' ';
+ if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {
+ separator = ' de ';
+ }
+ return number + separator + format[key];
+}
+
+moment.defineLocale('ro', {
+ months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'),
+ monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'),
+ weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'),
+ weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY H:mm',
+ LLLL : 'dddd, D MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay: '[azi la] LT',
+ nextDay: '[mâine la] LT',
+ nextWeek: 'dddd [la] LT',
+ lastDay: '[ieri la] LT',
+ lastWeek: '[fosta] dddd [la] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'peste %s',
+ past : '%s în urmă',
+ s : 'câteva secunde',
+ m : 'un minut',
+ mm : relativeTimeWithPlural$2,
+ h : 'o oră',
+ hh : relativeTimeWithPlural$2,
+ d : 'o zi',
+ dd : relativeTimeWithPlural$2,
+ M : 'o lună',
+ MM : relativeTimeWithPlural$2,
+ y : 'un an',
+ yy : relativeTimeWithPlural$2
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Russian [ru]
+//! author : Viktorminator : https://github.com/Viktorminator
+//! Author : Menelion Elensúle : https://github.com/Oire
+//! author : Коренберг Марк : https://github.com/socketpair
+
+function plural$4(word, num) {
+ var forms = word.split('_');
+ return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+}
+function relativeTimeWithPlural$3(number, withoutSuffix, key) {
+ var format = {
+ 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',
+ 'hh': 'час_часа_часов',
+ 'dd': 'день_дня_дней',
+ 'MM': 'месяц_месяца_месяцев',
+ 'yy': 'год_года_лет'
+ };
+ if (key === 'm') {
+ return withoutSuffix ? 'минута' : 'минуту';
+ }
+ else {
+ return number + ' ' + plural$4(format[key], +number);
+ }
+}
+var monthsParse$2 = [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[йя]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i];
+
+// http://new.gramota.ru/spravka/rules/139-prop : § 103
+// Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637
+// CLDR data: http://www.unicode.org/cldr/charts/28/summary/ru.html#1753
+moment.defineLocale('ru', {
+ months : {
+ format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_'),
+ standalone: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_')
+ },
+ monthsShort : {
+ // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку ?
+ format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_'),
+ standalone: 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_')
+ },
+ weekdays : {
+ standalone: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),
+ format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_'),
+ isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/
+ },
+ weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
+ weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
+ monthsParse : monthsParse$2,
+ longMonthsParse : monthsParse$2,
+ shortMonthsParse : monthsParse$2,
+
+ // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки
+ monthsRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,
+
+ // копия предыдущего
+ monthsShortRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,
+
+ // полные названия с падежами
+ monthsStrictRegex: /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,
+
+ // Выражение, которое соотвествует только сокращённым формам
+ monthsShortStrictRegex: /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY г.',
+ LLL : 'D MMMM YYYY г., HH:mm',
+ LLLL : 'dddd, D MMMM YYYY г., HH:mm'
+ },
+ calendar : {
+ sameDay: '[Сегодня в] LT',
+ nextDay: '[Завтра в] LT',
+ lastDay: '[Вчера в] LT',
+ nextWeek: function (now) {
+ if (now.week() !== this.week()) {
+ switch (this.day()) {
+ case 0:
+ return '[В следующее] dddd [в] LT';
+ case 1:
+ case 2:
+ case 4:
+ return '[В следующий] dddd [в] LT';
+ case 3:
+ case 5:
+ case 6:
+ return '[В следующую] dddd [в] LT';
+ }
+ } else {
+ if (this.day() === 2) {
+ return '[Во] dddd [в] LT';
+ } else {
+ return '[В] dddd [в] LT';
+ }
+ }
+ },
+ lastWeek: function (now) {
+ if (now.week() !== this.week()) {
+ switch (this.day()) {
+ case 0:
+ return '[В прошлое] dddd [в] LT';
+ case 1:
+ case 2:
+ case 4:
+ return '[В прошлый] dddd [в] LT';
+ case 3:
+ case 5:
+ case 6:
+ return '[В прошлую] dddd [в] LT';
+ }
+ } else {
+ if (this.day() === 2) {
+ return '[Во] dddd [в] LT';
+ } else {
+ return '[В] dddd [в] LT';
+ }
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'через %s',
+ past : '%s назад',
+ s : 'несколько секунд',
+ m : relativeTimeWithPlural$3,
+ mm : relativeTimeWithPlural$3,
+ h : 'час',
+ hh : relativeTimeWithPlural$3,
+ d : 'день',
+ dd : relativeTimeWithPlural$3,
+ M : 'месяц',
+ MM : relativeTimeWithPlural$3,
+ y : 'год',
+ yy : relativeTimeWithPlural$3
+ },
+ meridiemParse: /ночи|утра|дня|вечера/i,
+ isPM : function (input) {
+ return /^(дня|вечера)$/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'ночи';
+ } else if (hour < 12) {
+ return 'утра';
+ } else if (hour < 17) {
+ return 'дня';
+ } else {
+ return 'вечера';
+ }
+ },
+ ordinalParse: /\d{1,2}-(й|го|я)/,
+ ordinal: function (number, period) {
+ switch (period) {
+ case 'M':
+ case 'd':
+ case 'DDD':
+ return number + '-й';
+ case 'D':
+ return number + '-го';
+ case 'w':
+ case 'W':
+ return number + '-я';
+ default:
+ return number;
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Northern Sami [se]
+//! authors : Bård Rolstad Henriksen : https://github.com/karamell
+
+
+moment.defineLocale('se', {
+ months : 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'),
+ monthsShort : 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'),
+ weekdays : 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'),
+ weekdaysShort : 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'),
+ weekdaysMin : 's_v_m_g_d_b_L'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'MMMM D. [b.] YYYY',
+ LLL : 'MMMM D. [b.] YYYY [ti.] HH:mm',
+ LLLL : 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm'
+ },
+ calendar : {
+ sameDay: '[otne ti] LT',
+ nextDay: '[ihttin ti] LT',
+ nextWeek: 'dddd [ti] LT',
+ lastDay: '[ikte ti] LT',
+ lastWeek: '[ovddit] dddd [ti] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : '%s geažes',
+ past : 'maŋit %s',
+ s : 'moadde sekunddat',
+ m : 'okta minuhta',
+ mm : '%d minuhtat',
+ h : 'okta diimmu',
+ hh : '%d diimmut',
+ d : 'okta beaivi',
+ dd : '%d beaivvit',
+ M : 'okta mánnu',
+ MM : '%d mánut',
+ y : 'okta jahki',
+ yy : '%d jagit'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Sinhalese [si]
+//! author : Sampath Sitinamaluwa : https://github.com/sampathsris
+
+/*jshint -W100*/
+moment.defineLocale('si', {
+ months : 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'),
+ monthsShort : 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'),
+ weekdays : 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'),
+ weekdaysShort : 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'),
+ weekdaysMin : 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'a h:mm',
+ LTS : 'a h:mm:ss',
+ L : 'YYYY/MM/DD',
+ LL : 'YYYY MMMM D',
+ LLL : 'YYYY MMMM D, a h:mm',
+ LLLL : 'YYYY MMMM D [වැනි] dddd, a h:mm:ss'
+ },
+ calendar : {
+ sameDay : '[අද] LT[ට]',
+ nextDay : '[හෙට] LT[ට]',
+ nextWeek : 'dddd LT[ට]',
+ lastDay : '[ඊයේ] LT[ට]',
+ lastWeek : '[පසුගිය] dddd LT[ට]',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%sකින්',
+ past : '%sකට පෙර',
+ s : 'තත්පර කිහිපය',
+ m : 'මිනිත්තුව',
+ mm : 'මිනිත්තු %d',
+ h : 'පැය',
+ hh : 'පැය %d',
+ d : 'දිනය',
+ dd : 'දින %d',
+ M : 'මාසය',
+ MM : 'මාස %d',
+ y : 'වසර',
+ yy : 'වසර %d'
+ },
+ ordinalParse: /\d{1,2} වැනි/,
+ ordinal : function (number) {
+ return number + ' වැනි';
+ },
+ meridiemParse : /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,
+ isPM : function (input) {
+ return input === 'ප.ව.' || input === 'පස් වරු';
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'ප.ව.' : 'පස් වරු';
+ } else {
+ return isLower ? 'පෙ.ව.' : 'පෙර වරු';
+ }
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Slovak [sk]
+//! author : Martin Minka : https://github.com/k2s
+//! based on work of petrbela : https://github.com/petrbela
+
+var months$5 = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_');
+var monthsShort$4 = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');
+function plural$5(n) {
+ return (n > 1) && (n < 5);
+}
+function translate$8(number, withoutSuffix, key, isFuture) {
+ var result = number + ' ';
+ switch (key) {
+ case 's': // a few seconds / in a few seconds / a few seconds ago
+ return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami';
+ case 'm': // a minute / in a minute / a minute ago
+ return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou');
+ case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural$5(number) ? 'minúty' : 'minút');
+ } else {
+ return result + 'minútami';
+ }
+ break;
+ case 'h': // an hour / in an hour / an hour ago
+ return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+ case 'hh': // 9 hours / in 9 hours / 9 hours ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural$5(number) ? 'hodiny' : 'hodín');
+ } else {
+ return result + 'hodinami';
+ }
+ break;
+ case 'd': // a day / in a day / a day ago
+ return (withoutSuffix || isFuture) ? 'deň' : 'dňom';
+ case 'dd': // 9 days / in 9 days / 9 days ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural$5(number) ? 'dni' : 'dní');
+ } else {
+ return result + 'dňami';
+ }
+ break;
+ case 'M': // a month / in a month / a month ago
+ return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom';
+ case 'MM': // 9 months / in 9 months / 9 months ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural$5(number) ? 'mesiace' : 'mesiacov');
+ } else {
+ return result + 'mesiacmi';
+ }
+ break;
+ case 'y': // a year / in a year / a year ago
+ return (withoutSuffix || isFuture) ? 'rok' : 'rokom';
+ case 'yy': // 9 years / in 9 years / 9 years ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural$5(number) ? 'roky' : 'rokov');
+ } else {
+ return result + 'rokmi';
+ }
+ break;
+ }
+}
+
+moment.defineLocale('sk', {
+ months : months$5,
+ monthsShort : monthsShort$4,
+ weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),
+ weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'),
+ weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'),
+ longDateFormat : {
+ LT: 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd D. MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay: '[dnes o] LT',
+ nextDay: '[zajtra o] LT',
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[v nedeľu o] LT';
+ case 1:
+ case 2:
+ return '[v] dddd [o] LT';
+ case 3:
+ return '[v stredu o] LT';
+ case 4:
+ return '[vo štvrtok o] LT';
+ case 5:
+ return '[v piatok o] LT';
+ case 6:
+ return '[v sobotu o] LT';
+ }
+ },
+ lastDay: '[včera o] LT',
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[minulú nedeľu o] LT';
+ case 1:
+ case 2:
+ return '[minulý] dddd [o] LT';
+ case 3:
+ return '[minulú stredu o] LT';
+ case 4:
+ case 5:
+ return '[minulý] dddd [o] LT';
+ case 6:
+ return '[minulú sobotu o] LT';
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'pred %s',
+ s : translate$8,
+ m : translate$8,
+ mm : translate$8,
+ h : translate$8,
+ hh : translate$8,
+ d : translate$8,
+ dd : translate$8,
+ M : translate$8,
+ MM : translate$8,
+ y : translate$8,
+ yy : translate$8
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Slovenian [sl]
+//! author : Robert Sedovšek : https://github.com/sedovsek
+
+function processRelativeTime$4(number, withoutSuffix, key, isFuture) {
+ var result = number + ' ';
+ switch (key) {
+ case 's':
+ return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami';
+ case 'm':
+ return withoutSuffix ? 'ena minuta' : 'eno minuto';
+ case 'mm':
+ if (number === 1) {
+ result += withoutSuffix ? 'minuta' : 'minuto';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'minuti' : 'minutama';
+ } else if (number < 5) {
+ result += withoutSuffix || isFuture ? 'minute' : 'minutami';
+ } else {
+ result += withoutSuffix || isFuture ? 'minut' : 'minutami';
+ }
+ return result;
+ case 'h':
+ return withoutSuffix ? 'ena ura' : 'eno uro';
+ case 'hh':
+ if (number === 1) {
+ result += withoutSuffix ? 'ura' : 'uro';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'uri' : 'urama';
+ } else if (number < 5) {
+ result += withoutSuffix || isFuture ? 'ure' : 'urami';
+ } else {
+ result += withoutSuffix || isFuture ? 'ur' : 'urami';
+ }
+ return result;
+ case 'd':
+ return withoutSuffix || isFuture ? 'en dan' : 'enim dnem';
+ case 'dd':
+ if (number === 1) {
+ result += withoutSuffix || isFuture ? 'dan' : 'dnem';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'dni' : 'dnevoma';
+ } else {
+ result += withoutSuffix || isFuture ? 'dni' : 'dnevi';
+ }
+ return result;
+ case 'M':
+ return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem';
+ case 'MM':
+ if (number === 1) {
+ result += withoutSuffix || isFuture ? 'mesec' : 'mesecem';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'meseca' : 'mesecema';
+ } else if (number < 5) {
+ result += withoutSuffix || isFuture ? 'mesece' : 'meseci';
+ } else {
+ result += withoutSuffix || isFuture ? 'mesecev' : 'meseci';
+ }
+ return result;
+ case 'y':
+ return withoutSuffix || isFuture ? 'eno leto' : 'enim letom';
+ case 'yy':
+ if (number === 1) {
+ result += withoutSuffix || isFuture ? 'leto' : 'letom';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'leti' : 'letoma';
+ } else if (number < 5) {
+ result += withoutSuffix || isFuture ? 'leta' : 'leti';
+ } else {
+ result += withoutSuffix || isFuture ? 'let' : 'leti';
+ }
+ return result;
+ }
+}
+
+moment.defineLocale('sl', {
+ months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'),
+ monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),
+ weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'),
+ weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[danes ob] LT',
+ nextDay : '[jutri ob] LT',
+
+ nextWeek : function () {
+ switch (this.day()) {
+ case 0:
+ return '[v] [nedeljo] [ob] LT';
+ case 3:
+ return '[v] [sredo] [ob] LT';
+ case 6:
+ return '[v] [soboto] [ob] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[v] dddd [ob] LT';
+ }
+ },
+ lastDay : '[včeraj ob] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ return '[prejšnjo] [nedeljo] [ob] LT';
+ case 3:
+ return '[prejšnjo] [sredo] [ob] LT';
+ case 6:
+ return '[prejšnjo] [soboto] [ob] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[prejšnji] dddd [ob] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'čez %s',
+ past : 'pred %s',
+ s : processRelativeTime$4,
+ m : processRelativeTime$4,
+ mm : processRelativeTime$4,
+ h : processRelativeTime$4,
+ hh : processRelativeTime$4,
+ d : processRelativeTime$4,
+ dd : processRelativeTime$4,
+ M : processRelativeTime$4,
+ MM : processRelativeTime$4,
+ y : processRelativeTime$4,
+ yy : processRelativeTime$4
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Albanian [sq]
+//! author : Flakërim Ismani : https://github.com/flakerimi
+//! author : Menelion Elensúle : https://github.com/Oire
+//! author : Oerd Cukalla : https://github.com/oerd
+
+moment.defineLocale('sq', {
+ months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'),
+ monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'),
+ weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'),
+ weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'),
+ weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'),
+ weekdaysParseExact : true,
+ meridiemParse: /PD|MD/,
+ isPM: function (input) {
+ return input.charAt(0) === 'M';
+ },
+ meridiem : function (hours, minutes, isLower) {
+ return hours < 12 ? 'PD' : 'MD';
+ },
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Sot në] LT',
+ nextDay : '[Nesër në] LT',
+ nextWeek : 'dddd [në] LT',
+ lastDay : '[Dje në] LT',
+ lastWeek : 'dddd [e kaluar në] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'në %s',
+ past : '%s më parë',
+ s : 'disa sekonda',
+ m : 'një minutë',
+ mm : '%d minuta',
+ h : 'një orë',
+ hh : '%d orë',
+ d : 'një ditë',
+ dd : '%d ditë',
+ M : 'një muaj',
+ MM : '%d muaj',
+ y : 'një vit',
+ yy : '%d vite'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Serbian Cyrillic [sr-cyrl]
+//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+
+var translator$1 = {
+ words: { //Different grammatical cases
+ m: ['један минут', 'једне минуте'],
+ mm: ['минут', 'минуте', 'минута'],
+ h: ['један сат', 'једног сата'],
+ hh: ['сат', 'сата', 'сати'],
+ dd: ['дан', 'дана', 'дана'],
+ MM: ['месец', 'месеца', 'месеци'],
+ yy: ['година', 'године', 'година']
+ },
+ correctGrammaticalCase: function (number, wordKey) {
+ return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
+ },
+ translate: function (number, withoutSuffix, key) {
+ var wordKey = translator$1.words[key];
+ if (key.length === 1) {
+ return withoutSuffix ? wordKey[0] : wordKey[1];
+ } else {
+ return number + ' ' + translator$1.correctGrammaticalCase(number, wordKey);
+ }
+ }
+};
+
+moment.defineLocale('sr-cyrl', {
+ months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split('_'),
+ monthsShort: 'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'),
+ monthsParseExact: true,
+ weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'),
+ weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'),
+ weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat: {
+ LT: 'H:mm',
+ LTS : 'H:mm:ss',
+ L: 'DD.MM.YYYY',
+ LL: 'D. MMMM YYYY',
+ LLL: 'D. MMMM YYYY H:mm',
+ LLLL: 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar: {
+ sameDay: '[данас у] LT',
+ nextDay: '[сутра у] LT',
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[у] [недељу] [у] LT';
+ case 3:
+ return '[у] [среду] [у] LT';
+ case 6:
+ return '[у] [суботу] [у] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[у] dddd [у] LT';
+ }
+ },
+ lastDay : '[јуче у] LT',
+ lastWeek : function () {
+ var lastWeekDays = [
+ '[прошле] [недеље] [у] LT',
+ '[прошлог] [понедељка] [у] LT',
+ '[прошлог] [уторка] [у] LT',
+ '[прошле] [среде] [у] LT',
+ '[прошлог] [четвртка] [у] LT',
+ '[прошлог] [петка] [у] LT',
+ '[прошле] [суботе] [у] LT'
+ ];
+ return lastWeekDays[this.day()];
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'за %s',
+ past : 'пре %s',
+ s : 'неколико секунди',
+ m : translator$1.translate,
+ mm : translator$1.translate,
+ h : translator$1.translate,
+ hh : translator$1.translate,
+ d : 'дан',
+ dd : translator$1.translate,
+ M : 'месец',
+ MM : translator$1.translate,
+ y : 'годину',
+ yy : translator$1.translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Serbian [sr]
+//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+
+var translator$2 = {
+ words: { //Different grammatical cases
+ m: ['jedan minut', 'jedne minute'],
+ mm: ['minut', 'minute', 'minuta'],
+ h: ['jedan sat', 'jednog sata'],
+ hh: ['sat', 'sata', 'sati'],
+ dd: ['dan', 'dana', 'dana'],
+ MM: ['mesec', 'meseca', 'meseci'],
+ yy: ['godina', 'godine', 'godina']
+ },
+ correctGrammaticalCase: function (number, wordKey) {
+ return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
+ },
+ translate: function (number, withoutSuffix, key) {
+ var wordKey = translator$2.words[key];
+ if (key.length === 1) {
+ return withoutSuffix ? wordKey[0] : wordKey[1];
+ } else {
+ return number + ' ' + translator$2.correctGrammaticalCase(number, wordKey);
+ }
+ }
+};
+
+moment.defineLocale('sr', {
+ months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'),
+ monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
+ monthsParseExact: true,
+ weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split('_'),
+ weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'),
+ weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat: {
+ LT: 'H:mm',
+ LTS : 'H:mm:ss',
+ L: 'DD.MM.YYYY',
+ LL: 'D. MMMM YYYY',
+ LLL: 'D. MMMM YYYY H:mm',
+ LLLL: 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar: {
+ sameDay: '[danas u] LT',
+ nextDay: '[sutra u] LT',
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[u] [nedelju] [u] LT';
+ case 3:
+ return '[u] [sredu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ },
+ lastDay : '[juče u] LT',
+ lastWeek : function () {
+ var lastWeekDays = [
+ '[prošle] [nedelje] [u] LT',
+ '[prošlog] [ponedeljka] [u] LT',
+ '[prošlog] [utorka] [u] LT',
+ '[prošle] [srede] [u] LT',
+ '[prošlog] [četvrtka] [u] LT',
+ '[prošlog] [petka] [u] LT',
+ '[prošle] [subote] [u] LT'
+ ];
+ return lastWeekDays[this.day()];
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'pre %s',
+ s : 'nekoliko sekundi',
+ m : translator$2.translate,
+ mm : translator$2.translate,
+ h : translator$2.translate,
+ hh : translator$2.translate,
+ d : 'dan',
+ dd : translator$2.translate,
+ M : 'mesec',
+ MM : translator$2.translate,
+ y : 'godinu',
+ yy : translator$2.translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : siSwati [ss]
+//! author : Nicolai Davies<mail@nicolai.io> : https://github.com/nicolaidavies
+
+
+moment.defineLocale('ss', {
+ months : "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split('_'),
+ monthsShort : 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'),
+ weekdays : 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split('_'),
+ weekdaysShort : 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'),
+ weekdaysMin : 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[Namuhla nga] LT',
+ nextDay : '[Kusasa nga] LT',
+ nextWeek : 'dddd [nga] LT',
+ lastDay : '[Itolo nga] LT',
+ lastWeek : 'dddd [leliphelile] [nga] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'nga %s',
+ past : 'wenteka nga %s',
+ s : 'emizuzwana lomcane',
+ m : 'umzuzu',
+ mm : '%d emizuzu',
+ h : 'lihora',
+ hh : '%d emahora',
+ d : 'lilanga',
+ dd : '%d emalanga',
+ M : 'inyanga',
+ MM : '%d tinyanga',
+ y : 'umnyaka',
+ yy : '%d iminyaka'
+ },
+ meridiemParse: /ekuseni|emini|entsambama|ebusuku/,
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'ekuseni';
+ } else if (hours < 15) {
+ return 'emini';
+ } else if (hours < 19) {
+ return 'entsambama';
+ } else {
+ return 'ebusuku';
+ }
+ },
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'ekuseni') {
+ return hour;
+ } else if (meridiem === 'emini') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') {
+ if (hour === 0) {
+ return 0;
+ }
+ return hour + 12;
+ }
+ },
+ ordinalParse: /\d{1,2}/,
+ ordinal : '%d',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Swedish [sv]
+//! author : Jens Alm : https://github.com/ulmus
+
+moment.defineLocale('sv', {
+ months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
+ weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),
+ weekdaysShort : 'sön_mån_tis_ons_tor_fre_lör'.split('_'),
+ weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'YYYY-MM-DD',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [kl.] HH:mm',
+ LLLL : 'dddd D MMMM YYYY [kl.] HH:mm',
+ lll : 'D MMM YYYY HH:mm',
+ llll : 'ddd D MMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Idag] LT',
+ nextDay: '[Imorgon] LT',
+ lastDay: '[Igår] LT',
+ nextWeek: '[På] dddd LT',
+ lastWeek: '[I] dddd[s] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'om %s',
+ past : 'för %s sedan',
+ s : 'några sekunder',
+ m : 'en minut',
+ mm : '%d minuter',
+ h : 'en timme',
+ hh : '%d timmar',
+ d : 'en dag',
+ dd : '%d dagar',
+ M : 'en månad',
+ MM : '%d månader',
+ y : 'ett år',
+ yy : '%d år'
+ },
+ ordinalParse: /\d{1,2}(e|a)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'e' :
+ (b === 1) ? 'a' :
+ (b === 2) ? 'a' :
+ (b === 3) ? 'e' : 'e';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Swahili [sw]
+//! author : Fahad Kassim : https://github.com/fadsel
+
+moment.defineLocale('sw', {
+ months : 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'),
+ monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'),
+ weekdays : 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'),
+ weekdaysShort : 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'),
+ weekdaysMin : 'J2_J3_J4_J5_Al_Ij_J1'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[leo saa] LT',
+ nextDay : '[kesho saa] LT',
+ nextWeek : '[wiki ijayo] dddd [saat] LT',
+ lastDay : '[jana] LT',
+ lastWeek : '[wiki iliyopita] dddd [saat] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s baadaye',
+ past : 'tokea %s',
+ s : 'hivi punde',
+ m : 'dakika moja',
+ mm : 'dakika %d',
+ h : 'saa limoja',
+ hh : 'masaa %d',
+ d : 'siku moja',
+ dd : 'masiku %d',
+ M : 'mwezi mmoja',
+ MM : 'miezi %d',
+ y : 'mwaka mmoja',
+ yy : 'miaka %d'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Tamil [ta]
+//! author : Arjunkumar Krishnamoorthy : https://github.com/tk120404
+
+var symbolMap$11 = {
+ '1': '௧',
+ '2': '௨',
+ '3': '௩',
+ '4': '௪',
+ '5': '௫',
+ '6': '௬',
+ '7': '௭',
+ '8': '௮',
+ '9': '௯',
+ '0': '௦'
+};
+var numberMap$10 = {
+ '௧': '1',
+ '௨': '2',
+ '௩': '3',
+ '௪': '4',
+ '௫': '5',
+ '௬': '6',
+ '௭': '7',
+ '௮': '8',
+ '௯': '9',
+ '௦': '0'
+};
+
+moment.defineLocale('ta', {
+ months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),
+ monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),
+ weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'),
+ weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split('_'),
+ weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, HH:mm',
+ LLLL : 'dddd, D MMMM YYYY, HH:mm'
+ },
+ calendar : {
+ sameDay : '[இன்று] LT',
+ nextDay : '[நாளை] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[நேற்று] LT',
+ lastWeek : '[கடந்த வாரம்] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s இல்',
+ past : '%s முன்',
+ s : 'ஒரு சில விநாடிகள்',
+ m : 'ஒரு நிமிடம்',
+ mm : '%d நிமிடங்கள்',
+ h : 'ஒரு மணி நேரம்',
+ hh : '%d மணி நேரம்',
+ d : 'ஒரு நாள்',
+ dd : '%d நாட்கள்',
+ M : 'ஒரு மாதம்',
+ MM : '%d மாதங்கள்',
+ y : 'ஒரு வருடம்',
+ yy : '%d ஆண்டுகள்'
+ },
+ ordinalParse: /\d{1,2}வது/,
+ ordinal : function (number) {
+ return number + 'வது';
+ },
+ preparse: function (string) {
+ return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {
+ return numberMap$10[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$11[match];
+ });
+ },
+ // refer http://ta.wikipedia.org/s/1er1
+ meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 2) {
+ return ' யாமம்';
+ } else if (hour < 6) {
+ return ' வைகறை'; // வைகறை
+ } else if (hour < 10) {
+ return ' காலை'; // காலை
+ } else if (hour < 14) {
+ return ' நண்பகல்'; // நண்பகல்
+ } else if (hour < 18) {
+ return ' எற்பாடு'; // எற்பாடு
+ } else if (hour < 22) {
+ return ' மாலை'; // மாலை
+ } else {
+ return ' யாமம்';
+ }
+ },
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'யாமம்') {
+ return hour < 2 ? hour : hour + 12;
+ } else if (meridiem === 'வைகறை' || meridiem === 'காலை') {
+ return hour;
+ } else if (meridiem === 'நண்பகல்') {
+ return hour >= 10 ? hour : hour + 12;
+ } else {
+ return hour + 12;
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Telugu [te]
+//! author : Krishna Chaitanya Thota : https://github.com/kcthota
+
+moment.defineLocale('te', {
+ months : 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జూలై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'),
+ monthsShort : 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జూలై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split('_'),
+ weekdaysShort : 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'),
+ weekdaysMin : 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm',
+ LTS : 'A h:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm'
+ },
+ calendar : {
+ sameDay : '[నేడు] LT',
+ nextDay : '[రేపు] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[నిన్న] LT',
+ lastWeek : '[గత] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s లో',
+ past : '%s క్రితం',
+ s : 'కొన్ని క్షణాలు',
+ m : 'ఒక నిమిషం',
+ mm : '%d నిమిషాలు',
+ h : 'ఒక గంట',
+ hh : '%d గంటలు',
+ d : 'ఒక రోజు',
+ dd : '%d రోజులు',
+ M : 'ఒక నెల',
+ MM : '%d నెలలు',
+ y : 'ఒక సంవత్సరం',
+ yy : '%d సంవత్సరాలు'
+ },
+ ordinalParse : /\d{1,2}వ/,
+ ordinal : '%dవ',
+ meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'రాత్రి') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'ఉదయం') {
+ return hour;
+ } else if (meridiem === 'మధ్యాహ్నం') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'సాయంత్రం') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'రాత్రి';
+ } else if (hour < 10) {
+ return 'ఉదయం';
+ } else if (hour < 17) {
+ return 'మధ్యాహ్నం';
+ } else if (hour < 20) {
+ return 'సాయంత్రం';
+ } else {
+ return 'రాత్రి';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Tetun Dili (East Timor) [tet]
+//! author : Joshua Brooks : https://github.com/joshbrooks
+//! author : Onorio De J. Afonso : https://github.com/marobo
+
+moment.defineLocale('tet', {
+ months : 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juniu_Juliu_Augustu_Setembru_Outubru_Novembru_Dezembru'.split('_'),
+ monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Aug_Set_Out_Nov_Dez'.split('_'),
+ weekdays : 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sexta_Sabadu'.split('_'),
+ weekdaysShort : 'Dom_Seg_Ters_Kua_Kint_Sext_Sab'.split('_'),
+ weekdaysMin : 'Do_Seg_Te_Ku_Ki_Sex_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Ohin iha] LT',
+ nextDay: '[Aban iha] LT',
+ nextWeek: 'dddd [iha] LT',
+ lastDay: '[Horiseik iha] LT',
+ lastWeek: 'dddd [semana kotuk] [iha] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'iha %s',
+ past : '%s liuba',
+ s : 'minutu balun',
+ m : 'minutu ida',
+ mm : 'minutus %d',
+ h : 'horas ida',
+ hh : 'horas %d',
+ d : 'loron ida',
+ dd : 'loron %d',
+ M : 'fulan ida',
+ MM : 'fulan %d',
+ y : 'tinan ida',
+ yy : 'tinan %d'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Thai [th]
+//! author : Kridsada Thanabulpong : https://github.com/sirn
+
+moment.defineLocale('th', {
+ months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'),
+ monthsShort : 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),
+ weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference
+ weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'YYYY/MM/DD',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY เวลา H:mm',
+ LLLL : 'วันddddที่ D MMMM YYYY เวลา H:mm'
+ },
+ meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/,
+ isPM: function (input) {
+ return input === 'หลังเที่ยง';
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'ก่อนเที่ยง';
+ } else {
+ return 'หลังเที่ยง';
+ }
+ },
+ calendar : {
+ sameDay : '[วันนี้ เวลา] LT',
+ nextDay : '[พรุ่งนี้ เวลา] LT',
+ nextWeek : 'dddd[หน้า เวลา] LT',
+ lastDay : '[เมื่อวานนี้ เวลา] LT',
+ lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'อีก %s',
+ past : '%sที่แล้ว',
+ s : 'ไม่กี่วินาที',
+ m : '1 นาที',
+ mm : '%d นาที',
+ h : '1 ชั่วโมง',
+ hh : '%d ชั่วโมง',
+ d : '1 วัน',
+ dd : '%d วัน',
+ M : '1 เดือน',
+ MM : '%d เดือน',
+ y : '1 ปี',
+ yy : '%d ปี'
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Tagalog (Philippines) [tl-ph]
+//! author : Dan Hagman : https://github.com/hagmandan
+
+moment.defineLocale('tl-ph', {
+ months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'),
+ monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),
+ weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'),
+ weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),
+ weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'MM/D/YYYY',
+ LL : 'MMMM D, YYYY',
+ LLL : 'MMMM D, YYYY HH:mm',
+ LLLL : 'dddd, MMMM DD, YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: 'LT [ngayong araw]',
+ nextDay: '[Bukas ng] LT',
+ nextWeek: 'LT [sa susunod na] dddd',
+ lastDay: 'LT [kahapon]',
+ lastWeek: 'LT [noong nakaraang] dddd',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'sa loob ng %s',
+ past : '%s ang nakalipas',
+ s : 'ilang segundo',
+ m : 'isang minuto',
+ mm : '%d minuto',
+ h : 'isang oras',
+ hh : '%d oras',
+ d : 'isang araw',
+ dd : '%d araw',
+ M : 'isang buwan',
+ MM : '%d buwan',
+ y : 'isang taon',
+ yy : '%d taon'
+ },
+ ordinalParse: /\d{1,2}/,
+ ordinal : function (number) {
+ return number;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Klingon [tlh]
+//! author : Dominika Kruk : https://github.com/amaranthrose
+
+var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_');
+
+function translateFuture(output) {
+ var time = output;
+ time = (output.indexOf('jaj') !== -1) ?
+ time.slice(0, -3) + 'leS' :
+ (output.indexOf('jar') !== -1) ?
+ time.slice(0, -3) + 'waQ' :
+ (output.indexOf('DIS') !== -1) ?
+ time.slice(0, -3) + 'nem' :
+ time + ' pIq';
+ return time;
+}
+
+function translatePast(output) {
+ var time = output;
+ time = (output.indexOf('jaj') !== -1) ?
+ time.slice(0, -3) + 'Hu’' :
+ (output.indexOf('jar') !== -1) ?
+ time.slice(0, -3) + 'wen' :
+ (output.indexOf('DIS') !== -1) ?
+ time.slice(0, -3) + 'ben' :
+ time + ' ret';
+ return time;
+}
+
+function translate$9(number, withoutSuffix, string, isFuture) {
+ var numberNoun = numberAsNoun(number);
+ switch (string) {
+ case 'mm':
+ return numberNoun + ' tup';
+ case 'hh':
+ return numberNoun + ' rep';
+ case 'dd':
+ return numberNoun + ' jaj';
+ case 'MM':
+ return numberNoun + ' jar';
+ case 'yy':
+ return numberNoun + ' DIS';
+ }
+}
+
+function numberAsNoun(number) {
+ var hundred = Math.floor((number % 1000) / 100),
+ ten = Math.floor((number % 100) / 10),
+ one = number % 10,
+ word = '';
+ if (hundred > 0) {
+ word += numbersNouns[hundred] + 'vatlh';
+ }
+ if (ten > 0) {
+ word += ((word !== '') ? ' ' : '') + numbersNouns[ten] + 'maH';
+ }
+ if (one > 0) {
+ word += ((word !== '') ? ' ' : '') + numbersNouns[one];
+ }
+ return (word === '') ? 'pagh' : word;
+}
+
+moment.defineLocale('tlh', {
+ months : 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split('_'),
+ monthsShort : 'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
+ weekdaysShort : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
+ weekdaysMin : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[DaHjaj] LT',
+ nextDay: '[wa’leS] LT',
+ nextWeek: 'LLL',
+ lastDay: '[wa’Hu’] LT',
+ lastWeek: 'LLL',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : translateFuture,
+ past : translatePast,
+ s : 'puS lup',
+ m : 'wa’ tup',
+ mm : translate$9,
+ h : 'wa’ rep',
+ hh : translate$9,
+ d : 'wa’ jaj',
+ dd : translate$9,
+ M : 'wa’ jar',
+ MM : translate$9,
+ y : 'wa’ DIS',
+ yy : translate$9
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Turkish [tr]
+//! authors : Erhan Gundogan : https://github.com/erhangundogan,
+//! Burak Yiğit Kaya: https://github.com/BYK
+
+var suffixes$3 = {
+ 1: '\'inci',
+ 5: '\'inci',
+ 8: '\'inci',
+ 70: '\'inci',
+ 80: '\'inci',
+ 2: '\'nci',
+ 7: '\'nci',
+ 20: '\'nci',
+ 50: '\'nci',
+ 3: '\'üncü',
+ 4: '\'üncü',
+ 100: '\'üncü',
+ 6: '\'ncı',
+ 9: '\'uncu',
+ 10: '\'uncu',
+ 30: '\'uncu',
+ 60: '\'ıncı',
+ 90: '\'ıncı'
+};
+
+moment.defineLocale('tr', {
+ months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'),
+ monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'),
+ weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'),
+ weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'),
+ weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[bugün saat] LT',
+ nextDay : '[yarın saat] LT',
+ nextWeek : '[haftaya] dddd [saat] LT',
+ lastDay : '[dün] LT',
+ lastWeek : '[geçen hafta] dddd [saat] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s sonra',
+ past : '%s önce',
+ s : 'birkaç saniye',
+ m : 'bir dakika',
+ mm : '%d dakika',
+ h : 'bir saat',
+ hh : '%d saat',
+ d : 'bir gün',
+ dd : '%d gün',
+ M : 'bir ay',
+ MM : '%d ay',
+ y : 'bir yıl',
+ yy : '%d yıl'
+ },
+ ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,
+ ordinal : function (number) {
+ if (number === 0) { // special case for zero
+ return number + '\'ıncı';
+ }
+ var a = number % 10,
+ b = number % 100 - a,
+ c = number >= 100 ? 100 : null;
+ return number + (suffixes$3[a] || suffixes$3[b] || suffixes$3[c]);
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Talossan [tzl]
+//! author : Robin van der Vliet : https://github.com/robin0van0der0v
+//! author : Iustì Canun
+
+// After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals.
+// This is currently too difficult (maybe even impossible) to add.
+moment.defineLocale('tzl', {
+ months : 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split('_'),
+ monthsShort : 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'),
+ weekdays : 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'),
+ weekdaysShort : 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'),
+ weekdaysMin : 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM [dallas] YYYY',
+ LLL : 'D. MMMM [dallas] YYYY HH.mm',
+ LLLL : 'dddd, [li] D. MMMM [dallas] YYYY HH.mm'
+ },
+ meridiemParse: /d\'o|d\'a/i,
+ isPM : function (input) {
+ return 'd\'o' === input.toLowerCase();
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'd\'o' : 'D\'O';
+ } else {
+ return isLower ? 'd\'a' : 'D\'A';
+ }
+ },
+ calendar : {
+ sameDay : '[oxhi à] LT',
+ nextDay : '[demà à] LT',
+ nextWeek : 'dddd [à] LT',
+ lastDay : '[ieiri à] LT',
+ lastWeek : '[sür el] dddd [lasteu à] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'osprei %s',
+ past : 'ja%s',
+ s : processRelativeTime$5,
+ m : processRelativeTime$5,
+ mm : processRelativeTime$5,
+ h : processRelativeTime$5,
+ hh : processRelativeTime$5,
+ d : processRelativeTime$5,
+ dd : processRelativeTime$5,
+ M : processRelativeTime$5,
+ MM : processRelativeTime$5,
+ y : processRelativeTime$5,
+ yy : processRelativeTime$5
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+function processRelativeTime$5(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 's': ['viensas secunds', '\'iensas secunds'],
+ 'm': ['\'n míut', '\'iens míut'],
+ 'mm': [number + ' míuts', '' + number + ' míuts'],
+ 'h': ['\'n þora', '\'iensa þora'],
+ 'hh': [number + ' þoras', '' + number + ' þoras'],
+ 'd': ['\'n ziua', '\'iensa ziua'],
+ 'dd': [number + ' ziuas', '' + number + ' ziuas'],
+ 'M': ['\'n mes', '\'iens mes'],
+ 'MM': [number + ' mesen', '' + number + ' mesen'],
+ 'y': ['\'n ar', '\'iens ar'],
+ 'yy': [number + ' ars', '' + number + ' ars']
+ };
+ return isFuture ? format[key][0] : (withoutSuffix ? format[key][0] : format[key][1]);
+}
+
+//! moment.js locale configuration
+//! locale : Central Atlas Tamazight Latin [tzm-latn]
+//! author : Abdel Said : https://github.com/abdelsaid
+
+moment.defineLocale('tzm-latn', {
+ months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),
+ monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),
+ weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
+ weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
+ weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[asdkh g] LT',
+ nextDay: '[aska g] LT',
+ nextWeek: 'dddd [g] LT',
+ lastDay: '[assant g] LT',
+ lastWeek: 'dddd [g] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'dadkh s yan %s',
+ past : 'yan %s',
+ s : 'imik',
+ m : 'minuḍ',
+ mm : '%d minuḍ',
+ h : 'saɛa',
+ hh : '%d tassaɛin',
+ d : 'ass',
+ dd : '%d ossan',
+ M : 'ayowr',
+ MM : '%d iyyirn',
+ y : 'asgas',
+ yy : '%d isgasn'
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Central Atlas Tamazight [tzm]
+//! author : Abdel Said : https://github.com/abdelsaid
+
+moment.defineLocale('tzm', {
+ months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),
+ monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),
+ weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
+ weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
+ weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[ⴰⵙⴷⵅ ⴴ] LT',
+ nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',
+ nextWeek: 'dddd [ⴴ] LT',
+ lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',
+ lastWeek: 'dddd [ⴴ] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s',
+ past : 'ⵢⴰⵏ %s',
+ s : 'ⵉⵎⵉⴽ',
+ m : 'ⵎⵉⵏⵓⴺ',
+ mm : '%d ⵎⵉⵏⵓⴺ',
+ h : 'ⵙⴰⵄⴰ',
+ hh : '%d ⵜⴰⵙⵙⴰⵄⵉⵏ',
+ d : 'ⴰⵙⵙ',
+ dd : '%d oⵙⵙⴰⵏ',
+ M : 'ⴰⵢoⵓⵔ',
+ MM : '%d ⵉⵢⵢⵉⵔⵏ',
+ y : 'ⴰⵙⴳⴰⵙ',
+ yy : '%d ⵉⵙⴳⴰⵙⵏ'
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Ukrainian [uk]
+//! author : zemlanin : https://github.com/zemlanin
+//! Author : Menelion Elensúle : https://github.com/Oire
+
+function plural$6(word, num) {
+ var forms = word.split('_');
+ return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+}
+function relativeTimeWithPlural$4(number, withoutSuffix, key) {
+ var format = {
+ 'mm': withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин',
+ 'hh': withoutSuffix ? 'година_години_годин' : 'годину_години_годин',
+ 'dd': 'день_дні_днів',
+ 'MM': 'місяць_місяці_місяців',
+ 'yy': 'рік_роки_років'
+ };
+ if (key === 'm') {
+ return withoutSuffix ? 'хвилина' : 'хвилину';
+ }
+ else if (key === 'h') {
+ return withoutSuffix ? 'година' : 'годину';
+ }
+ else {
+ return number + ' ' + plural$6(format[key], +number);
+ }
+}
+function weekdaysCaseReplace(m, format) {
+ var weekdays = {
+ 'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'),
+ 'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'),
+ 'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_')
+ },
+ nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ?
+ 'accusative' :
+ ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ?
+ 'genitive' :
+ 'nominative');
+ return weekdays[nounCase][m.day()];
+}
+function processHoursFunction(str) {
+ return function () {
+ return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
+ };
+}
+
+moment.defineLocale('uk', {
+ months : {
+ 'format': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_'),
+ 'standalone': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_')
+ },
+ monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'),
+ weekdays : weekdaysCaseReplace,
+ weekdaysShort : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
+ weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY р.',
+ LLL : 'D MMMM YYYY р., HH:mm',
+ LLLL : 'dddd, D MMMM YYYY р., HH:mm'
+ },
+ calendar : {
+ sameDay: processHoursFunction('[Сьогодні '),
+ nextDay: processHoursFunction('[Завтра '),
+ lastDay: processHoursFunction('[Вчора '),
+ nextWeek: processHoursFunction('[У] dddd ['),
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ case 5:
+ case 6:
+ return processHoursFunction('[Минулої] dddd [').call(this);
+ case 1:
+ case 2:
+ case 4:
+ return processHoursFunction('[Минулого] dddd [').call(this);
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'за %s',
+ past : '%s тому',
+ s : 'декілька секунд',
+ m : relativeTimeWithPlural$4,
+ mm : relativeTimeWithPlural$4,
+ h : 'годину',
+ hh : relativeTimeWithPlural$4,
+ d : 'день',
+ dd : relativeTimeWithPlural$4,
+ M : 'місяць',
+ MM : relativeTimeWithPlural$4,
+ y : 'рік',
+ yy : relativeTimeWithPlural$4
+ },
+ // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
+ meridiemParse: /ночі|ранку|дня|вечора/,
+ isPM: function (input) {
+ return /^(дня|вечора)$/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'ночі';
+ } else if (hour < 12) {
+ return 'ранку';
+ } else if (hour < 17) {
+ return 'дня';
+ } else {
+ return 'вечора';
+ }
+ },
+ ordinalParse: /\d{1,2}-(й|го)/,
+ ordinal: function (number, period) {
+ switch (period) {
+ case 'M':
+ case 'd':
+ case 'DDD':
+ case 'w':
+ case 'W':
+ return number + '-й';
+ case 'D':
+ return number + '-го';
+ default:
+ return number;
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Uzbek [uz]
+//! author : Sardor Muminov : https://github.com/muminoff
+
+moment.defineLocale('uz', {
+ months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'),
+ monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
+ weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),
+ weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'),
+ weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'D MMMM YYYY, dddd HH:mm'
+ },
+ calendar : {
+ sameDay : '[Бугун соат] LT [да]',
+ nextDay : '[Эртага] LT [да]',
+ nextWeek : 'dddd [куни соат] LT [да]',
+ lastDay : '[Кеча соат] LT [да]',
+ lastWeek : '[Утган] dddd [куни соат] LT [да]',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'Якин %s ичида',
+ past : 'Бир неча %s олдин',
+ s : 'фурсат',
+ m : 'бир дакика',
+ mm : '%d дакика',
+ h : 'бир соат',
+ hh : '%d соат',
+ d : 'бир кун',
+ dd : '%d кун',
+ M : 'бир ой',
+ MM : '%d ой',
+ y : 'бир йил',
+ yy : '%d йил'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Vietnamese [vi]
+//! author : Bang Nguyen : https://github.com/bangnk
+
+moment.defineLocale('vi', {
+ months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'),
+ monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'),
+ weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
+ weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
+ weekdaysParseExact : true,
+ meridiemParse: /sa|ch/i,
+ isPM : function (input) {
+ return /^ch$/i.test(input);
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 12) {
+ return isLower ? 'sa' : 'SA';
+ } else {
+ return isLower ? 'ch' : 'CH';
+ }
+ },
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM [năm] YYYY',
+ LLL : 'D MMMM [năm] YYYY HH:mm',
+ LLLL : 'dddd, D MMMM [năm] YYYY HH:mm',
+ l : 'DD/M/YYYY',
+ ll : 'D MMM YYYY',
+ lll : 'D MMM YYYY HH:mm',
+ llll : 'ddd, D MMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Hôm nay lúc] LT',
+ nextDay: '[Ngày mai lúc] LT',
+ nextWeek: 'dddd [tuần tới lúc] LT',
+ lastDay: '[Hôm qua lúc] LT',
+ lastWeek: 'dddd [tuần rồi lúc] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : '%s tới',
+ past : '%s trước',
+ s : 'vài giây',
+ m : 'một phút',
+ mm : '%d phút',
+ h : 'một giờ',
+ hh : '%d giờ',
+ d : 'một ngày',
+ dd : '%d ngày',
+ M : 'một tháng',
+ MM : '%d tháng',
+ y : 'một năm',
+ yy : '%d năm'
+ },
+ ordinalParse: /\d{1,2}/,
+ ordinal : function (number) {
+ return number;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Pseudo [x-pseudo]
+//! author : Andrew Hood : https://github.com/andrewhood125
+
+moment.defineLocale('x-pseudo', {
+ months : 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split('_'),
+ monthsShort : 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split('_'),
+ weekdaysShort : 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'),
+ weekdaysMin : 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[T~ódá~ý át] LT',
+ nextDay : '[T~ómó~rró~w át] LT',
+ nextWeek : 'dddd [át] LT',
+ lastDay : '[Ý~ést~érdá~ý át] LT',
+ lastWeek : '[L~ást] dddd [át] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'í~ñ %s',
+ past : '%s á~gó',
+ s : 'á ~féw ~sécó~ñds',
+ m : 'á ~míñ~úté',
+ mm : '%d m~íñú~tés',
+ h : 'á~ñ hó~úr',
+ hh : '%d h~óúrs',
+ d : 'á ~dáý',
+ dd : '%d d~áýs',
+ M : 'á ~móñ~th',
+ MM : '%d m~óñt~hs',
+ y : 'á ~ýéár',
+ yy : '%d ý~éárs'
+ },
+ ordinalParse: /\d{1,2}(th|st|nd|rd)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Yoruba Nigeria [yo]
+//! author : Atolagbe Abisoye : https://github.com/andela-batolagbe
+
+moment.defineLocale('yo', {
+ months : 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split('_'),
+ monthsShort : 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'),
+ weekdays : 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'),
+ weekdaysShort : 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'),
+ weekdaysMin : 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'),
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[Ònì ni] LT',
+ nextDay : '[Ọ̀la ni] LT',
+ nextWeek : 'dddd [Ọsẹ̀ tón\'bọ] [ni] LT',
+ lastDay : '[Àna ni] LT',
+ lastWeek : 'dddd [Ọsẹ̀ tólọ́] [ni] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'ní %s',
+ past : '%s kọjá',
+ s : 'ìsẹjú aayá die',
+ m : 'ìsẹjú kan',
+ mm : 'ìsẹjú %d',
+ h : 'wákati kan',
+ hh : 'wákati %d',
+ d : 'ọjọ́ kan',
+ dd : 'ọjọ́ %d',
+ M : 'osù kan',
+ MM : 'osù %d',
+ y : 'ọdún kan',
+ yy : 'ọdún %d'
+ },
+ ordinalParse : /ọjọ́\s\d{1,2}/,
+ ordinal : 'ọjọ́ %d',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Chinese (China) [zh-cn]
+//! author : suupic : https://github.com/suupic
+//! author : Zeno Zeng : https://github.com/zenozeng
+
+moment.defineLocale('zh-cn', {
+ months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
+ monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+ weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
+ weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'),
+ weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
+ longDateFormat : {
+ LT : 'Ah点mm分',
+ LTS : 'Ah点m分s秒',
+ L : 'YYYY-MM-DD',
+ LL : 'YYYY年MMMD日',
+ LLL : 'YYYY年MMMD日Ah点mm分',
+ LLLL : 'YYYY年MMMD日ddddAh点mm分',
+ l : 'YYYY-MM-DD',
+ ll : 'YYYY年MMMD日',
+ lll : 'YYYY年MMMD日Ah点mm分',
+ llll : 'YYYY年MMMD日ddddAh点mm分'
+ },
+ meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
+ meridiemHour: function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === '凌晨' || meridiem === '早上' ||
+ meridiem === '上午') {
+ return hour;
+ } else if (meridiem === '下午' || meridiem === '晚上') {
+ return hour + 12;
+ } else {
+ // '中午'
+ return hour >= 11 ? hour : hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ var hm = hour * 100 + minute;
+ if (hm < 600) {
+ return '凌晨';
+ } else if (hm < 900) {
+ return '早上';
+ } else if (hm < 1130) {
+ return '上午';
+ } else if (hm < 1230) {
+ return '中午';
+ } else if (hm < 1800) {
+ return '下午';
+ } else {
+ return '晚上';
+ }
+ },
+ calendar : {
+ sameDay : function () {
+ return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT';
+ },
+ nextDay : function () {
+ return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT';
+ },
+ lastDay : function () {
+ return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT';
+ },
+ nextWeek : function () {
+ var startOfWeek, prefix;
+ startOfWeek = moment().startOf('week');
+ prefix = this.diff(startOfWeek, 'days') >= 7 ? '[下]' : '[本]';
+ return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
+ },
+ lastWeek : function () {
+ var startOfWeek, prefix;
+ startOfWeek = moment().startOf('week');
+ prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]';
+ return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
+ },
+ sameElse : 'LL'
+ },
+ ordinalParse: /\d{1,2}(日|月|周)/,
+ ordinal : function (number, period) {
+ switch (period) {
+ case 'd':
+ case 'D':
+ case 'DDD':
+ return number + '日';
+ case 'M':
+ return number + '月';
+ case 'w':
+ case 'W':
+ return number + '周';
+ default:
+ return number;
+ }
+ },
+ relativeTime : {
+ future : '%s内',
+ past : '%s前',
+ s : '几秒',
+ m : '1 分钟',
+ mm : '%d 分钟',
+ h : '1 小时',
+ hh : '%d 小时',
+ d : '1 天',
+ dd : '%d 天',
+ M : '1 个月',
+ MM : '%d 个月',
+ y : '1 年',
+ yy : '%d 年'
+ },
+ week : {
+ // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Chinese (Hong Kong) [zh-hk]
+//! author : Ben : https://github.com/ben-lin
+//! author : Chris Lam : https://github.com/hehachris
+//! author : Konstantin : https://github.com/skfd
+
+moment.defineLocale('zh-hk', {
+ months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
+ monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+ weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
+ weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'),
+ weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
+ longDateFormat : {
+ LT : 'Ah點mm分',
+ LTS : 'Ah點m分s秒',
+ L : 'YYYY年MMMD日',
+ LL : 'YYYY年MMMD日',
+ LLL : 'YYYY年MMMD日Ah點mm分',
+ LLLL : 'YYYY年MMMD日ddddAh點mm分',
+ l : 'YYYY年MMMD日',
+ ll : 'YYYY年MMMD日',
+ lll : 'YYYY年MMMD日Ah點mm分',
+ llll : 'YYYY年MMMD日ddddAh點mm分'
+ },
+ meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
+ return hour;
+ } else if (meridiem === '中午') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === '下午' || meridiem === '晚上') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ var hm = hour * 100 + minute;
+ if (hm < 600) {
+ return '凌晨';
+ } else if (hm < 900) {
+ return '早上';
+ } else if (hm < 1130) {
+ return '上午';
+ } else if (hm < 1230) {
+ return '中午';
+ } else if (hm < 1800) {
+ return '下午';
+ } else {
+ return '晚上';
+ }
+ },
+ calendar : {
+ sameDay : '[今天]LT',
+ nextDay : '[明天]LT',
+ nextWeek : '[下]ddddLT',
+ lastDay : '[昨天]LT',
+ lastWeek : '[上]ddddLT',
+ sameElse : 'L'
+ },
+ ordinalParse: /\d{1,2}(日|月|週)/,
+ ordinal : function (number, period) {
+ switch (period) {
+ case 'd' :
+ case 'D' :
+ case 'DDD' :
+ return number + '日';
+ case 'M' :
+ return number + '月';
+ case 'w' :
+ case 'W' :
+ return number + '週';
+ default :
+ return number;
+ }
+ },
+ relativeTime : {
+ future : '%s內',
+ past : '%s前',
+ s : '幾秒',
+ m : '1 分鐘',
+ mm : '%d 分鐘',
+ h : '1 小時',
+ hh : '%d 小時',
+ d : '1 天',
+ dd : '%d 天',
+ M : '1 個月',
+ MM : '%d 個月',
+ y : '1 年',
+ yy : '%d 年'
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Chinese (Taiwan) [zh-tw]
+//! author : Ben : https://github.com/ben-lin
+//! author : Chris Lam : https://github.com/hehachris
+
+moment.defineLocale('zh-tw', {
+ months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
+ monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+ weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
+ weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'),
+ weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
+ longDateFormat : {
+ LT : 'Ah點mm分',
+ LTS : 'Ah點m分s秒',
+ L : 'YYYY年MMMD日',
+ LL : 'YYYY年MMMD日',
+ LLL : 'YYYY年MMMD日Ah點mm分',
+ LLLL : 'YYYY年MMMD日ddddAh點mm分',
+ l : 'YYYY年MMMD日',
+ ll : 'YYYY年MMMD日',
+ lll : 'YYYY年MMMD日Ah點mm分',
+ llll : 'YYYY年MMMD日ddddAh點mm分'
+ },
+ meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
+ return hour;
+ } else if (meridiem === '中午') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === '下午' || meridiem === '晚上') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ var hm = hour * 100 + minute;
+ if (hm < 600) {
+ return '凌晨';
+ } else if (hm < 900) {
+ return '早上';
+ } else if (hm < 1130) {
+ return '上午';
+ } else if (hm < 1230) {
+ return '中午';
+ } else if (hm < 1800) {
+ return '下午';
+ } else {
+ return '晚上';
+ }
+ },
+ calendar : {
+ sameDay : '[今天]LT',
+ nextDay : '[明天]LT',
+ nextWeek : '[下]ddddLT',
+ lastDay : '[昨天]LT',
+ lastWeek : '[上]ddddLT',
+ sameElse : 'L'
+ },
+ ordinalParse: /\d{1,2}(日|月|週)/,
+ ordinal : function (number, period) {
+ switch (period) {
+ case 'd' :
+ case 'D' :
+ case 'DDD' :
+ return number + '日';
+ case 'M' :
+ return number + '月';
+ case 'w' :
+ case 'W' :
+ return number + '週';
+ default :
+ return number;
+ }
+ },
+ relativeTime : {
+ future : '%s內',
+ past : '%s前',
+ s : '幾秒',
+ m : '1 分鐘',
+ mm : '%d 分鐘',
+ h : '1 小時',
+ hh : '%d 小時',
+ d : '1 天',
+ dd : '%d 天',
+ M : '1 個月',
+ MM : '%d 個月',
+ y : '1 年',
+ yy : '%d 年'
+ }
+});
+
+moment.locale('en');
+
+return moment;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/locales.min.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/locales.min.js
new file mode 100644
index 00000000000..f97270b250b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/locales.min.js
@@ -0,0 +1,663 @@
+!function(a,b){"object"==typeof exports&&"undefined"!=typeof module&&"function"==typeof require?b(require("../moment")):"function"==typeof define&&define.amd?define(["../moment"],b):b(a.moment)}(this,function(a){"use strict";
+//! moment.js locale configuration
+//! locale : Belarusian [be]
+//! author : Dmitry Demidov : https://github.com/demidov91
+//! author: Praleska: http://praleska.pro/
+//! Author : Menelion Elensúle : https://github.com/Oire
+function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&b%10<=4&&(b%100<10||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:c?"хвіліна_хвіліны_хвілін":"хвіліну_хвіліны_хвілін",hh:c?"гадзіна_гадзіны_гадзін":"гадзіну_гадзіны_гадзін",dd:"дзень_дні_дзён",MM:"месяц_месяцы_месяцаў",yy:"год_гады_гадоў"};return"m"===d?c?"хвіліна":"хвіліну":"h"===d?c?"гадзіна":"гадзіну":a+" "+b(e[d],+a)}
+//! moment.js locale configuration
+//! locale : Breton [br]
+//! author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
+function d(a,b,c){var d={mm:"munutenn",MM:"miz",dd:"devezh"};return a+" "+g(d[c],a)}function e(a){switch(f(a)){case 1:case 3:case 4:case 5:case 9:return a+" bloaz";default:return a+" vloaz"}}function f(a){return a>9?f(a%10):a}function g(a,b){return 2===b?h(a):a}function h(a){var b={m:"v",b:"v",d:"z"};return void 0===b[a.charAt(0)]?a:b[a.charAt(0)]+a.substring(1)}
+//! moment.js locale configuration
+//! locale : Bosnian [bs]
+//! author : Nedim Cholich : https://github.com/frontyard
+//! based on (hr) translation by Bojan Marković
+function i(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}function j(a){return a>1&&a<5&&1!==~~(a/10)}function k(a,b,c,d){var e=a+" ";switch(c){case"s":// a few seconds / in a few seconds / a few seconds ago
+return b||d?"pár sekund":"pár sekundami";case"m":// a minute / in a minute / a minute ago
+return b?"minuta":d?"minutu":"minutou";case"mm":// 9 minutes / in 9 minutes / 9 minutes ago
+// 9 minutes / in 9 minutes / 9 minutes ago
+return b||d?e+(j(a)?"minuty":"minut"):e+"minutami";break;case"h":// an hour / in an hour / an hour ago
+return b?"hodina":d?"hodinu":"hodinou";case"hh":// 9 hours / in 9 hours / 9 hours ago
+// 9 hours / in 9 hours / 9 hours ago
+return b||d?e+(j(a)?"hodiny":"hodin"):e+"hodinami";break;case"d":// a day / in a day / a day ago
+return b||d?"den":"dnem";case"dd":// 9 days / in 9 days / 9 days ago
+// 9 days / in 9 days / 9 days ago
+return b||d?e+(j(a)?"dny":"dní"):e+"dny";break;case"M":// a month / in a month / a month ago
+return b||d?"měsíc":"měsícem";case"MM":// 9 months / in 9 months / 9 months ago
+// 9 months / in 9 months / 9 months ago
+return b||d?e+(j(a)?"měsíce":"měsíců"):e+"měsíci";break;case"y":// a year / in a year / a year ago
+return b||d?"rok":"rokem";case"yy":// 9 years / in 9 years / 9 years ago
+// 9 years / in 9 years / 9 years ago
+return b||d?e+(j(a)?"roky":"let"):e+"lety"}}
+//! moment.js locale configuration
+//! locale : German (Austria) [de-at]
+//! author : lluchs : https://github.com/lluchs
+//! author: Menelion Elensúle: https://github.com/Oire
+//! author : Martin Groller : https://github.com/MadMG
+//! author : Mikolaj Dadela : https://github.com/mik01aj
+function l(a,b,c,d){var e={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?e[c][0]:e[c][1]}
+//! moment.js locale configuration
+//! locale : German [de]
+//! author : lluchs : https://github.com/lluchs
+//! author: Menelion Elensúle: https://github.com/Oire
+//! author : Mikolaj Dadela : https://github.com/mik01aj
+function m(a,b,c,d){var e={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?e[c][0]:e[c][1]}function n(a){return a instanceof Function||"[object Function]"===Object.prototype.toString.call(a)}
+//! moment.js locale configuration
+//! locale : Estonian [et]
+//! author : Henry Kehlmann : https://github.com/madhenry
+//! improvements : Illimar Tambek : https://github.com/ragulka
+function o(a,b,c,d){var e={s:["mõne sekundi","mõni sekund","paar sekundit"],m:["ühe minuti","üks minut"],mm:[a+" minuti",a+" minutit"],h:["ühe tunni","tund aega","üks tund"],hh:[a+" tunni",a+" tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:[a+" kuu",a+" kuud"],y:["ühe aasta","aasta","üks aasta"],yy:[a+" aasta",a+" aastat"]};return b?e[c][2]?e[c][2]:e[c][1]:d?e[c][0]:e[c][1]}function p(a,b,c,d){var e="";switch(c){case"s":return d?"muutaman sekunnin":"muutama sekunti";case"m":return d?"minuutin":"minuutti";case"mm":e=d?"minuutin":"minuuttia";break;case"h":return d?"tunnin":"tunti";case"hh":e=d?"tunnin":"tuntia";break;case"d":return d?"päivän":"päivä";case"dd":e=d?"päivän":"päivää";break;case"M":return d?"kuukauden":"kuukausi";case"MM":e=d?"kuukauden":"kuukautta";break;case"y":return d?"vuoden":"vuosi";case"yy":e=d?"vuoden":"vuotta"}return e=q(a,d)+" "+e}function q(a,b){return a<10?b?Ca[a]:Ba[a]:a}
+//! moment.js locale configuration
+//! locale : Croatian [hr]
+//! author : Bojan Marković : https://github.com/bmarkovic
+function r(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}function s(a,b,c,d){var e=a;switch(c){case"s":return d||b?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(d||b?" perc":" perce");case"mm":return e+(d||b?" perc":" perce");case"h":return"egy"+(d||b?" óra":" órája");case"hh":return e+(d||b?" óra":" órája");case"d":return"egy"+(d||b?" nap":" napja");case"dd":return e+(d||b?" nap":" napja");case"M":return"egy"+(d||b?" hónap":" hónapja");case"MM":return e+(d||b?" hónap":" hónapja");case"y":return"egy"+(d||b?" év":" éve");case"yy":return e+(d||b?" év":" éve")}return""}function t(a){return(a?"":"[múlt] ")+"["+Ma[this.day()]+"] LT[-kor]"}
+//! moment.js locale configuration
+//! locale : Icelandic [is]
+//! author : Hinrik Örn Sigurðsson : https://github.com/hinrik
+function u(a){return a%100===11||a%10!==1}function v(a,b,c,d){var e=a+" ";switch(c){case"s":return b||d?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return b?"mínúta":"mínútu";case"mm":return u(a)?e+(b||d?"mínútur":"mínútum"):b?e+"mínúta":e+"mínútu";case"hh":return u(a)?e+(b||d?"klukkustundir":"klukkustundum"):e+"klukkustund";case"d":return b?"dagur":d?"dag":"degi";case"dd":return u(a)?b?e+"dagar":e+(d?"daga":"dögum"):b?e+"dagur":e+(d?"dag":"degi");case"M":return b?"mánuður":d?"mánuð":"mánuði";case"MM":return u(a)?b?e+"mánuðir":e+(d?"mánuði":"mánuðum"):b?e+"mánuður":e+(d?"mánuð":"mánuði");case"y":return b||d?"ár":"ári";case"yy":return u(a)?e+(b||d?"ár":"árum"):e+(b||d?"ár":"ári")}}
+//! moment.js locale configuration
+//! locale : Luxembourgish [lb]
+//! author : mweimerskirch : https://github.com/mweimerskirch
+//! author : David Raison : https://github.com/kwisatz
+function w(a,b,c,d){var e={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return b?e[c][0]:e[c][1]}function x(a){var b=a.substr(0,a.indexOf(" "));return z(b)?"a "+a:"an "+a}function y(a){var b=a.substr(0,a.indexOf(" "));return z(b)?"viru "+a:"virun "+a}/**
+ * Returns true if the word before the given number loses the '-n' ending.
+ * e.g. 'an 10 Deeg' but 'a 5 Deeg'
+ *
+ * @param number {integer}
+ * @returns {boolean}
+ */
+function z(a){if(a=parseInt(a,10),isNaN(a))return!1;if(a<0)
+// Negative Number --> always true
+return!0;if(a<10)
+// Only 1 digit
+return 4<=a&&a<=7;if(a<100){
+// 2 digits
+var b=a%10,c=a/10;return z(0===b?c:b)}if(a<1e4){
+// 3 or 4 digits --> recursively check first digit
+for(;a>=10;)a/=10;return z(a)}
+// Anything larger than 4 digits: recursively check first n-3 digits
+return a/=1e3,z(a)}function A(a,b,c,d){return b?"kelios sekundės":d?"kelių sekundžių":"kelias sekundes"}function B(a,b,c,d){return b?D(c)[0]:d?D(c)[1]:D(c)[2]}function C(a){return a%10===0||a>10&&a<20}function D(a){return Pa[a].split("_")}function E(a,b,c,d){var e=a+" ";return 1===a?e+B(a,b,c[0],d):b?e+(C(a)?D(c)[1]:D(c)[0]):d?e+D(c)[1]:e+(C(a)?D(c)[1]:D(c)[2])}/**
+ * @param withoutSuffix boolean true = a length of time; false = before/after a period of time.
+ */
+function F(a,b,c){return c?b%10===1&&b%100!==11?a[2]:a[3]:b%10===1&&b%100!==11?a[0]:a[1]}function G(a,b,c){return a+" "+F(Qa[c],a,b)}function H(a,b,c){return F(Qa[c],a,b)}function I(a,b){return b?"dažas sekundes":"dažām sekundēm"}function J(a,b,c,d){var e="";if(b)switch(c){case"s":e="काही सेकंद";break;case"m":e="एक मिनिट";break;case"mm":e="%d मिनिटे";break;case"h":e="एक तास";break;case"hh":e="%d तास";break;case"d":e="एक दिवस";break;case"dd":e="%d दिवस";break;case"M":e="एक महिना";break;case"MM":e="%d महिने";break;case"y":e="एक वर्ष";break;case"yy":e="%d वर्षे"}else switch(c){case"s":e="काही सेकंदां";break;case"m":e="एका मिनिटा";break;case"mm":e="%d मिनिटां";break;case"h":e="एका तासा";break;case"hh":e="%d तासां";break;case"d":e="एका दिवसा";break;case"dd":e="%d दिवसां";break;case"M":e="एका महिन्या";break;case"MM":e="%d महिन्यां";break;case"y":e="एका वर्षा";break;case"yy":e="%d वर्षां"}return e.replace(/%d/i,a)}function K(a){return a%10<5&&a%10>1&&~~(a/10)%10!==1}function L(a,b,c){var d=a+" ";switch(c){case"m":return b?"minuta":"minutę";case"mm":return d+(K(a)?"minuty":"minut");case"h":return b?"godzina":"godzinę";case"hh":return d+(K(a)?"godziny":"godzin");case"MM":return d+(K(a)?"miesiące":"miesięcy");case"yy":return d+(K(a)?"lata":"lat")}}
+//! moment.js locale configuration
+//! locale : Romanian [ro]
+//! author : Vlad Gurdiga : https://github.com/gurdiga
+//! author : Valentin Agachi : https://github.com/avaly
+function M(a,b,c){var d={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},e=" ";return(a%100>=20||a>=100&&a%100===0)&&(e=" de "),a+e+d[c]}
+//! moment.js locale configuration
+//! locale : Russian [ru]
+//! author : Viktorminator : https://github.com/Viktorminator
+//! Author : Menelion Elensúle : https://github.com/Oire
+//! author : Коренберг Марк : https://github.com/socketpair
+function N(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&b%10<=4&&(b%100<10||b%100>=20)?c[1]:c[2]}function O(a,b,c){var d={mm:b?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",MM:"месяц_месяца_месяцев",yy:"год_года_лет"};return"m"===c?b?"минута":"минуту":a+" "+N(d[c],+a)}function P(a){return a>1&&a<5}function Q(a,b,c,d){var e=a+" ";switch(c){case"s":// a few seconds / in a few seconds / a few seconds ago
+return b||d?"pár sekúnd":"pár sekundami";case"m":// a minute / in a minute / a minute ago
+return b?"minúta":d?"minútu":"minútou";case"mm":// 9 minutes / in 9 minutes / 9 minutes ago
+// 9 minutes / in 9 minutes / 9 minutes ago
+return b||d?e+(P(a)?"minúty":"minút"):e+"minútami";break;case"h":// an hour / in an hour / an hour ago
+return b?"hodina":d?"hodinu":"hodinou";case"hh":// 9 hours / in 9 hours / 9 hours ago
+// 9 hours / in 9 hours / 9 hours ago
+return b||d?e+(P(a)?"hodiny":"hodín"):e+"hodinami";break;case"d":// a day / in a day / a day ago
+return b||d?"deň":"dňom";case"dd":// 9 days / in 9 days / 9 days ago
+// 9 days / in 9 days / 9 days ago
+return b||d?e+(P(a)?"dni":"dní"):e+"dňami";break;case"M":// a month / in a month / a month ago
+return b||d?"mesiac":"mesiacom";case"MM":// 9 months / in 9 months / 9 months ago
+// 9 months / in 9 months / 9 months ago
+return b||d?e+(P(a)?"mesiace":"mesiacov"):e+"mesiacmi";break;case"y":// a year / in a year / a year ago
+return b||d?"rok":"rokom";case"yy":// 9 years / in 9 years / 9 years ago
+// 9 years / in 9 years / 9 years ago
+return b||d?e+(P(a)?"roky":"rokov"):e+"rokmi"}}
+//! moment.js locale configuration
+//! locale : Slovenian [sl]
+//! author : Robert Sedovšek : https://github.com/sedovsek
+function R(a,b,c,d){var e=a+" ";switch(c){case"s":return b||d?"nekaj sekund":"nekaj sekundami";case"m":return b?"ena minuta":"eno minuto";case"mm":return e+=1===a?b?"minuta":"minuto":2===a?b||d?"minuti":"minutama":a<5?b||d?"minute":"minutami":b||d?"minut":"minutami";case"h":return b?"ena ura":"eno uro";case"hh":return e+=1===a?b?"ura":"uro":2===a?b||d?"uri":"urama":a<5?b||d?"ure":"urami":b||d?"ur":"urami";case"d":return b||d?"en dan":"enim dnem";case"dd":return e+=1===a?b||d?"dan":"dnem":2===a?b||d?"dni":"dnevoma":b||d?"dni":"dnevi";case"M":return b||d?"en mesec":"enim mesecem";case"MM":return e+=1===a?b||d?"mesec":"mesecem":2===a?b||d?"meseca":"mesecema":a<5?b||d?"mesece":"meseci":b||d?"mesecev":"meseci";case"y":return b||d?"eno leto":"enim letom";case"yy":return e+=1===a?b||d?"leto":"letom":2===a?b||d?"leti":"letoma":a<5?b||d?"leta":"leti":b||d?"let":"leti"}}function S(a){var b=a;return b=a.indexOf("jaj")!==-1?b.slice(0,-3)+"leS":a.indexOf("jar")!==-1?b.slice(0,-3)+"waQ":a.indexOf("DIS")!==-1?b.slice(0,-3)+"nem":b+" pIq"}function T(a){var b=a;return b=a.indexOf("jaj")!==-1?b.slice(0,-3)+"Hu’":a.indexOf("jar")!==-1?b.slice(0,-3)+"wen":a.indexOf("DIS")!==-1?b.slice(0,-3)+"ben":b+" ret"}function U(a,b,c,d){var e=V(a);switch(c){case"mm":return e+" tup";case"hh":return e+" rep";case"dd":return e+" jaj";case"MM":return e+" jar";case"yy":return e+" DIS"}}function V(a){var b=Math.floor(a%1e3/100),c=Math.floor(a%100/10),d=a%10,e="";return b>0&&(e+=pb[b]+"vatlh"),c>0&&(e+=(""!==e?" ":"")+pb[c]+"maH"),d>0&&(e+=(""!==e?" ":"")+pb[d]),""===e?"pagh":e}function W(a,b,c,d){var e={s:["viensas secunds","'iensas secunds"],m:["'n míut","'iens míut"],mm:[a+" míuts",""+a+" míuts"],h:["'n þora","'iensa þora"],hh:[a+" þoras",""+a+" þoras"],d:["'n ziua","'iensa ziua"],dd:[a+" ziuas",""+a+" ziuas"],M:["'n mes","'iens mes"],MM:[a+" mesen",""+a+" mesen"],y:["'n ar","'iens ar"],yy:[a+" ars",""+a+" ars"]};return d?e[c][0]:b?e[c][0]:e[c][1]}
+//! moment.js locale configuration
+//! locale : Ukrainian [uk]
+//! author : zemlanin : https://github.com/zemlanin
+//! Author : Menelion Elensúle : https://github.com/Oire
+function X(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&b%10<=4&&(b%100<10||b%100>=20)?c[1]:c[2]}function Y(a,b,c){var d={mm:b?"хвилина_хвилини_хвилин":"хвилину_хвилини_хвилин",hh:b?"година_години_годин":"годину_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"};return"m"===c?b?"хвилина":"хвилину":"h"===c?b?"година":"годину":a+" "+X(d[c],+a)}function Z(a,b){var c={nominative:"неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота".split("_"),accusative:"неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу".split("_"),genitive:"неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи".split("_")},d=/(\[[ВвУу]\]) ?dddd/.test(b)?"accusative":/\[?(?:минулої|наступної)? ?\] ?dddd/.test(b)?"genitive":"nominative";return c[d][a.day()]}function $(a){return function(){return a+"о"+(11===this.hours()?"б":"")+"] LT"}}
+//! moment.js locale configuration
+//! locale : Afrikaans [af]
+//! author : Werner Mollentze : https://github.com/wernerm
+a.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(a){return/^nm$/i.test(a)},meridiem:function(a,b,c){return a<12?c?"vm":"VM":c?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,// Maandag is die eerste dag van die week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Arabic (Algeria) [ar-dz]
+//! author : Noureddine LOUAHEDJ : https://github.com/noureddineme
+a.defineLocale("ar-dz",{months:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"أح_إث_ثلا_أر_خم_جم_سب".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:0,// Sunday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Arabic (Lybia) [ar-ly]
+//! author : Ali Hmer: https://github.com/kikoanis
+var _={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},aa=function(a){return 0===a?0:1===a?1:2===a?2:a%100>=3&&a%100<=10?3:a%100>=11?4:5},ba={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},ca=function(a){return function(b,c,d,e){var f=aa(b),g=ba[a][aa(b)];return 2===f&&(g=g[c?0:1]),g.replace(/%d/i,b)}},da=["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"];a.defineLocale("ar-ly",{months:da,monthsShort:da,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(a){return"م"===a},meridiem:function(a,b,c){return a<12?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:ca("s"),m:ca("m"),mm:ca("m"),h:ca("h"),hh:ca("h"),d:ca("d"),dd:ca("d"),M:ca("M"),MM:ca("M"),y:ca("y"),yy:ca("y")},preparse:function(a){return a.replace(/\u200f/g,"").replace(/،/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return _[a]}).replace(/,/g,"،")},week:{dow:6,// Saturday is the first day of the week.
+doy:12}}),
+//! moment.js locale configuration
+//! locale : Arabic (Morocco) [ar-ma]
+//! author : ElFadili Yassine : https://github.com/ElFadiliY
+//! author : Abdel Said : https://github.com/abdelsaid
+a.defineLocale("ar-ma",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,// Saturday is the first day of the week.
+doy:12}});
+//! moment.js locale configuration
+//! locale : Arabic (Saudi Arabia) [ar-sa]
+//! author : Suhail Alkowaileet : https://github.com/xsoh
+var ea={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},fa={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"};a.defineLocale("ar-sa",{months:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(a){return"م"===a},meridiem:function(a,b,c){return a<12?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(a){return a.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return fa[a]}).replace(/،/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return ea[a]}).replace(/,/g,"،")},week:{dow:0,// Sunday is the first day of the week.
+doy:6}}),
+//! moment.js locale configuration
+//! locale : Arabic (Tunisia) [ar-tn]
+//! author : Nader Toukabri : https://github.com/naderio
+a.defineLocale("ar-tn",{months:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Arabic [ar]
+//! author : Abdel Said: https://github.com/abdelsaid
+//! author : Ahmed Elkhatib
+//! author : forabi https://github.com/forabi
+var ga={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},ha={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},ia=function(a){return 0===a?0:1===a?1:2===a?2:a%100>=3&&a%100<=10?3:a%100>=11?4:5},ja={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},ka=function(a){return function(b,c,d,e){var f=ia(b),g=ja[a][ia(b)];return 2===f&&(g=g[c?0:1]),g.replace(/%d/i,b)}},la=["كانون الثاني يناير","شباط فبراير","آذار مارس","نيسان أبريل","أيار مايو","حزيران يونيو","تموز يوليو","آب أغسطس","أيلول سبتمبر","تشرين الأول أكتوبر","تشرين الثاني نوفمبر","كانون الأول ديسمبر"];a.defineLocale("ar",{months:la,monthsShort:la,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(a){return"م"===a},meridiem:function(a,b,c){return a<12?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:ka("s"),m:ka("m"),mm:ka("m"),h:ka("h"),hh:ka("h"),d:ka("d"),dd:ka("d"),M:ka("M"),MM:ka("M"),y:ka("y"),yy:ka("y")},preparse:function(a){return a.replace(/\u200f/g,"").replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return ha[a]}).replace(/،/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return ga[a]}).replace(/,/g,"،")},week:{dow:6,// Saturday is the first day of the week.
+doy:12}});
+//! moment.js locale configuration
+//! locale : Azerbaijani [az]
+//! author : topchiyev : https://github.com/topchiyev
+var ma={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-üncü",4:"-üncü",100:"-üncü",6:"-ncı",9:"-uncu",10:"-uncu",30:"-uncu",60:"-ıncı",90:"-ıncı"};a.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə".split("_"),weekdaysShort:"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),weekdaysMin:"Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[gələn həftə] dddd [saat] LT",lastDay:"[dünən] LT",lastWeek:"[keçən həftə] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s əvvəl",s:"birneçə saniyyə",m:"bir dəqiqə",mm:"%d dəqiqə",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gecə|səhər|gündüz|axşam/,isPM:function(a){return/^(gündüz|axşam)$/.test(a)},meridiem:function(a,b,c){return a<4?"gecə":a<12?"səhər":a<17?"gündüz":"axşam"},ordinalParse:/\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,ordinal:function(a){if(0===a)// special case for zero
+return a+"-ıncı";var b=a%10,c=a%100-b,d=a>=100?100:null;return a+(ma[b]||ma[c]||ma[d])},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),a.defineLocale("be",{months:{format:"студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня".split("_"),standalone:"студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань".split("_")},monthsShort:"студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж".split("_"),weekdays:{format:"нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу".split("_"),standalone:"нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота".split("_"),isFormat:/\[ ?[Вв] ?(?:мінулую|наступную)? ?\] ?dddd/},weekdaysShort:"нд_пн_ат_ср_чц_пт_сб".split("_"),weekdaysMin:"нд_пн_ат_ср_чц_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., HH:mm",LLLL:"dddd, D MMMM YYYY г., HH:mm"},calendar:{sameDay:"[Сёння ў] LT",nextDay:"[Заўтра ў] LT",lastDay:"[Учора ў] LT",nextWeek:function(){return"[У] dddd [ў] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[У мінулую] dddd [ў] LT";case 1:case 2:case 4:return"[У мінулы] dddd [ў] LT"}},sameElse:"L"},relativeTime:{future:"праз %s",past:"%s таму",s:"некалькі секунд",m:c,mm:c,h:c,hh:c,d:"дзень",dd:c,M:"месяц",MM:c,y:"год",yy:c},meridiemParse:/ночы|раніцы|дня|вечара/,isPM:function(a){return/^(дня|вечара)$/.test(a)},meridiem:function(a,b,c){return a<4?"ночы":a<12?"раніцы":a<17?"дня":"вечара"},ordinalParse:/\d{1,2}-(і|ы|га)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a%10!==2&&a%10!==3||a%100===12||a%100===13?a+"-ы":a+"-і";case"D":return a+"-га";default:return a}},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Bulgarian [bg]
+//! author : Krasen Borisov : https://github.com/kraz
+a.defineLocale("bg",{months:"януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),monthsShort:"янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),weekdays:"неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),weekdaysShort:"нед_пон_вто_сря_чет_пет_съб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Днес в] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[В изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[В изминалия] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"след %s",past:"преди %s",s:"няколко секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дни",M:"месец",MM:"%d месеца",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&c<20?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,// Monday is the first day of the week.
+doy:7}});
+//! moment.js locale configuration
+//! locale : Bengali [bn]
+//! author : Kaushik Gandhi : https://github.com/kaushikgandhi
+var na={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},oa={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};a.defineLocale("bn",{months:"জানুয়ারী_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর".split("_"),monthsShort:"জানু_ফেব_মার্চ_এপ্র_মে_জুন_জুল_আগ_সেপ্ট_অক্টো_নভে_ডিসে".split("_"),weekdays:"রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি".split("_"),weekdaysMin:"রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",LTS:"A h:mm:ss সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm সময়",LLLL:"dddd, D MMMM YYYY, A h:mm সময়"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কয়েক সেকেন্ড",m:"এক মিনিট",mm:"%d মিনিট",h:"এক ঘন্টা",hh:"%d ঘন্টা",d:"এক দিন",dd:"%d দিন",M:"এক মাস",MM:"%d মাস",y:"এক বছর",yy:"%d বছর"},preparse:function(a){return a.replace(/[১২৩৪৫৬৭৮৯০]/g,function(a){return oa[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return na[a]})},meridiemParse:/রাত|সকাল|দুপুর|বিকাল|রাত/,meridiemHour:function(a,b){return 12===a&&(a=0),"রাত"===b&&a>=4||"দুপুর"===b&&a<5||"বিকাল"===b?a+12:a},meridiem:function(a,b,c){return a<4?"রাত":a<10?"সকাল":a<17?"দুপুর":a<20?"বিকাল":"রাত"},week:{dow:0,// Sunday is the first day of the week.
+doy:6}});
+//! moment.js locale configuration
+//! locale : Tibetan [bo]
+//! author : Thupten N. Chakrishar : https://github.com/vajradog
+var pa={1:"༡",2:"༢",3:"༣",4:"༤",5:"༥",6:"༦",7:"༧",8:"༨",9:"༩",0:"༠"},qa={"༡":"1","༢":"2","༣":"3","༤":"4","༥":"5","༦":"6","༧":"7","༨":"8","༩":"9","༠":"0"};a.defineLocale("bo",{months:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),monthsShort:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),weekdays:"གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་".split("_"),weekdaysShort:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),weekdaysMin:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[དི་རིང] LT",nextDay:"[སང་ཉིན] LT",nextWeek:"[བདུན་ཕྲག་རྗེས་མ], LT",lastDay:"[ཁ་སང] LT",lastWeek:"[བདུན་ཕྲག་མཐའ་མ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ལ་",past:"%s སྔན་ལ",s:"ལམ་སང",m:"སྐར་མ་གཅིག",mm:"%d སྐར་མ",h:"ཆུ་ཚོད་གཅིག",hh:"%d ཆུ་ཚོད",d:"ཉིན་གཅིག",dd:"%d ཉིན་",M:"ཟླ་བ་གཅིག",MM:"%d ཟླ་བ",y:"ལོ་གཅིག",yy:"%d ལོ"},preparse:function(a){return a.replace(/[༡༢༣༤༥༦༧༨༩༠]/g,function(a){return qa[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return pa[a]})},meridiemParse:/མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,meridiemHour:function(a,b){return 12===a&&(a=0),"མཚན་མོ"===b&&a>=4||"ཉིན་གུང"===b&&a<5||"དགོང་དག"===b?a+12:a},meridiem:function(a,b,c){return a<4?"མཚན་མོ":a<10?"ཞོགས་ཀས":a<17?"ཉིན་གུང":a<20?"དགོང་དག":"མཚན་མོ"},week:{dow:0,// Sunday is the first day of the week.
+doy:6}}),a.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY h[e]mm A",LLLL:"dddd, D [a viz] MMMM YYYY h[e]mm A"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondennoù",m:"ur vunutenn",mm:d,h:"un eur",hh:"%d eur",d:"un devezh",dd:d,M:"ur miz",MM:d,y:"ur bloaz",yy:e},ordinalParse:/\d{1,2}(añ|vet)/,ordinal:function(a){var b=1===a?"añ":"vet";return a+b},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:i,mm:i,h:i,hh:i,d:"dan",dd:i,M:"mjesec",MM:i,y:"godinu",yy:i},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Catalan [ca]
+//! author : Juan G. Hurtado : https://github.com/juanghurtado
+a.defineLocale("ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd D MMMM YYYY H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aquí %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(a,b){var c=1===a?"r":2===a?"n":3===a?"r":4===a?"t":"è";return"w"!==b&&"W"!==b||(c="a"),a+c},week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Czech [cs]
+//! author : petrbela : https://github.com/petrbela
+var ra="leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),sa="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_");a.defineLocale("cs",{months:ra,monthsShort:sa,monthsParse:function(a,b){var c,d=[];for(c=0;c<12;c++)
+// use custom parser to solve problem with July (červenec)
+d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(ra,sa),shortMonthsParse:function(a){var b,c=[];for(b=0;b<12;b++)c[b]=new RegExp("^"+a[b]+"$","i");return c}(sa),longMonthsParse:function(a){var b,c=[];for(b=0;b<12;b++)c[b]=new RegExp("^"+a[b]+"$","i");return c}(ra),weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v neděli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve středu v] LT";case 4:return"[ve čtvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[včera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou neděli v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou středu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"před %s",s:k,m:k,mm:k,h:k,hh:k,d:k,dd:k,M:k,MM:k,y:k,yy:k},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Chuvash [cv]
+//! author : Anatoly Mironov : https://github.com/mirontoli
+a.defineLocale("cv",{months:"кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав".split("_"),monthsShort:"кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш".split("_"),weekdays:"вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кӗҫ_эрн_шӑм".split("_"),weekdaysMin:"вр_тн_ыт_юн_кҫ_эр_шм".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]",LLL:"YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm",LLLL:"dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm"},calendar:{sameDay:"[Паян] LT [сехетре]",nextDay:"[Ыран] LT [сехетре]",lastDay:"[Ӗнер] LT [сехетре]",nextWeek:"[Ҫитес] dddd LT [сехетре]",lastWeek:"[Иртнӗ] dddd LT [сехетре]",sameElse:"L"},relativeTime:{future:function(a){var b=/сехет$/i.exec(a)?"рен":/ҫул$/i.exec(a)?"тан":"ран";return a+b},past:"%s каялла",s:"пӗр-ик ҫеккунт",m:"пӗр минут",mm:"%d минут",h:"пӗр сехет",hh:"%d сехет",d:"пӗр кун",dd:"%d кун",M:"пӗр уйӑх",MM:"%d уйӑх",y:"пӗр ҫул",yy:"%d ҫул"},ordinalParse:/\d{1,2}-мӗш/,ordinal:"%d-мӗш",week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Welsh [cy]
+//! author : Robert Allen : https://github.com/robgallen
+//! author : https://github.com/ryangreaves
+a.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),weekdaysParseExact:!0,
+// time formats are the same as en-gb
+longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn ôl",s:"ychydig eiliadau",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},ordinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,
+// traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
+ordinal:function(a){var b=a,c="",d=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed",// 1af to 10fed
+"eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"];return b>20?c=40===b||50===b||60===b||80===b||100===b?"fed":"ain":b>0&&(c=d[b]),a+c},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Danish [da]
+//! author : Ulrik Nielsen : https://github.com/mrbase
+a.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY HH:mm"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I går kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"få sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en måned",MM:"%d måneder",y:"et år",yy:"%d år"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:l,mm:"%d Minuten",h:l,hh:"%d Stunden",d:l,dd:l,M:l,MM:l,y:l,yy:l},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:m,mm:"%d Minuten",h:m,hh:"%d Stunden",d:m,dd:m,M:m,MM:m,y:m,yy:m},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Maldivian [dv]
+//! author : Jawish Hameed : https://github.com/jawish
+var ta=["ޖެނުއަރީ","ފެބްރުއަރީ","މާރިޗު","އޭޕްރީލު","މޭ","ޖޫން","ޖުލައި","އޯގަސްޓު","ސެޕްޓެމްބަރު","އޮކްޓޯބަރު","ނޮވެމްބަރު","ޑިސެމްބަރު"],ua=["އާދިއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"];a.defineLocale("dv",{months:ta,monthsShort:ta,weekdays:ua,weekdaysShort:ua,weekdaysMin:"އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/މކ|މފ/,isPM:function(a){return"މފ"===a},meridiem:function(a,b,c){return a<12?"މކ":"މފ"},calendar:{sameDay:"[މިއަދު] LT",nextDay:"[މާދަމާ] LT",nextWeek:"dddd LT",lastDay:"[އިއްޔެ] LT",lastWeek:"[ފާއިތުވި] dddd LT",sameElse:"L"},relativeTime:{future:"ތެރޭގައި %s",past:"ކުރިން %s",s:"ސިކުންތުކޮޅެއް",m:"މިނިޓެއް",mm:"މިނިޓު %d",h:"ގަޑިއިރެއް",hh:"ގަޑިއިރު %d",d:"ދުވަހެއް",dd:"ދުވަސް %d",M:"މަހެއް",MM:"މަސް %d",y:"އަހަރެއް",yy:"އަހަރު %d"},preparse:function(a){return a.replace(/،/g,",")},postformat:function(a){return a.replace(/,/g,"،")},week:{dow:7,// Sunday is the first day of the week.
+doy:12}}),
+//! moment.js locale configuration
+//! locale : Greek [el]
+//! author : Aggelos Karalias : https://github.com/mehiel
+a.defineLocale("el",{monthsNominativeEl:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsGenitiveEl:"Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),months:function(a,b){return/D/.test(b.substring(0,b.indexOf("MMMM")))?this._monthsGenitiveEl[a.month()]:this._monthsNominativeEl[a.month()]},monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(a,b,c){return a>11?c?"μμ":"ΜΜ":c?"πμ":"ΠΜ"},isPM:function(a){return"μ"===(a+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Μ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[Σήμερα {}] LT",nextDay:"[Αύριο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το προηγούμενο] dddd [{}] LT";default:return"[την προηγούμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(a,b){var c=this._calendarEl[a],d=b&&b.hours();return n(c)&&(c=c.apply(b)),c.replace("{}",d%12===1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s πριν",s:"λίγα δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χρόνος",yy:"%d χρόνια"},ordinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : English (Australia) [en-au]
+//! author : Jared Morse : https://github.com/jarcoal
+a.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : English (Canada) [en-ca]
+//! author : Jonathan Abourbih : https://github.com/jonbca
+a.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),
+//! moment.js locale configuration
+//! locale : English (United Kingdom) [en-gb]
+//! author : Chris Gedrim : https://github.com/chrisgedrim
+a.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : English (Ireland) [en-ie]
+//! author : Chris Cartlidge : https://github.com/chriscartlidge
+a.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : English (New Zealand) [en-nz]
+//! author : Luke McGregor : https://github.com/lukemcgregor
+a.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Esperanto [eo]
+//! author : Colin Dean : https://github.com/colindean
+//! komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
+//! Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
+a.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec".split("_"),weekdays:"Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato".split("_"),weekdaysShort:"Dim_Lun_Mard_Merk_Ĵaŭ_Ven_Sab".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Ĵa_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D[-an de] MMMM, YYYY",LLL:"D[-an de] MMMM, YYYY HH:mm",LLLL:"dddd, [la] D[-an de] MMMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(a){return"p"===a.charAt(0).toLowerCase()},meridiem:function(a,b,c){return a>11?c?"p.t.m.":"P.T.M.":c?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodiaŭ je] LT",nextDay:"[Morgaŭ je] LT",nextWeek:"dddd [je] LT",lastDay:"[Hieraŭ je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"je %s",past:"antaŭ %s",s:"sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",//ne 'diurno', ĉar estas uzita por proksimumo
+dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},ordinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,// Monday is the first day of the week.
+doy:7}});
+//! moment.js locale configuration
+//! locale : Spanish (Dominican Republic) [es-do]
+var va="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),wa="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");a.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(a,b){return/-MMM-/.test(b)?wa[a.month()]:va[a.month()]},monthsParseExact:!0,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Spanish [es]
+//! author : Julio Napurí : https://github.com/julionc
+var xa="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),ya="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");a.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(a,b){return/-MMM-/.test(b)?ya[a.month()]:xa[a.month()]},monthsParseExact:!0,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:o,m:o,mm:o,h:o,hh:o,d:o,dd:"%d päeva",M:o,MM:o,y:o,yy:o},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Basque [eu]
+//! author : Eneko Illarramendi : https://github.com/eillarra
+a.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:7}});
+//! moment.js locale configuration
+//! locale : Persian [fa]
+//! author : Ebrahim Byagowi : https://github.com/ebraminio
+var za={1:"۱",2:"۲",3:"۳",4:"۴",5:"۵",6:"۶",7:"۷",8:"۸",9:"۹",0:"۰"},Aa={"۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","۰":"0"};a.defineLocale("fa",{months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ی_د_س_چ_پ_ج_ش".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(a){return/بعد از ظهر/.test(a)},meridiem:function(a,b,c){return a<12?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[فردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(a){return a.replace(/[۰-۹]/g,function(a){return Aa[a]}).replace(/،/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return za[a]}).replace(/,/g,"،")},ordinalParse:/\d{1,2}م/,ordinal:"%dم",week:{dow:6,// Saturday is the first day of the week.
+doy:12}});
+//! moment.js locale configuration
+//! locale : Finnish [fi]
+//! author : Tarmo Aidantausta : https://github.com/bleadof
+var Ba="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),Ca=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",Ba[7],Ba[8],Ba[9]];a.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:p,m:p,mm:p,h:p,hh:p,d:p,dd:p,M:p,MM:p,y:p,yy:p},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Faroese [fo]
+//! author : Ragnar Johannesen : https://github.com/ragnar123
+a.defineLocale("fo",{months:"januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),weekdaysShort:"sun_mán_týs_mik_hós_frí_ley".split("_"),weekdaysMin:"su_má_tý_mi_hó_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[Í dag kl.] LT",nextDay:"[Í morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[Í gjár kl.] LT",lastWeek:"[síðstu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s síðani",s:"fá sekund",m:"ein minutt",mm:"%d minuttir",h:"ein tími",hh:"%d tímar",d:"ein dagur",dd:"%d dagar",M:"ein mánaði",MM:"%d mánaðir",y:"eitt ár",yy:"%d ár"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : French (Canada) [fr-ca]
+//! author : Jonathan Abourbih : https://github.com/jonbca
+a.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|e)/,ordinal:function(a){return a+(1===a?"er":"e")}}),
+//! moment.js locale configuration
+//! locale : French (Switzerland) [fr-ch]
+//! author : Gaspard Bucher : https://github.com/gaspard
+a.defineLocale("fr-ch",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|e)/,ordinal:function(a){return a+(1===a?"er":"e")},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : French [fr]
+//! author : John Fischer : https://github.com/jfroffice
+a.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")},week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Frisian [fy]
+//! author : Robin van der Vliet : https://github.com/robin0van0der0v
+var Da="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),Ea="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");a.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(a,b){return/-MMM-/.test(b)?Ea[a.month()]:Da[a.month()]},monthsParseExact:!0,weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[ôfrûne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",m:"ien minút",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Scottish Gaelic [gd]
+//! author : Jon Ashdown : https://github.com/jonashdown
+var Fa=["Am Faoilleach","An Gearran","Am Màrt","An Giblean","An Cèitean","An t-Ògmhios","An t-Iuchar","An Lùnastal","An t-Sultain","An Dàmhair","An t-Samhain","An Dùbhlachd"],Ga=["Faoi","Gear","Màrt","Gibl","Cèit","Ògmh","Iuch","Lùn","Sult","Dàmh","Samh","Dùbh"],Ha=["Didòmhnaich","Diluain","Dimàirt","Diciadain","Diardaoin","Dihaoine","Disathairne"],Ia=["Did","Dil","Dim","Dic","Dia","Dih","Dis"],Ja=["Dò","Lu","Mà","Ci","Ar","Ha","Sa"];a.defineLocale("gd",{months:Fa,monthsShort:Ga,monthsParseExact:!0,weekdays:Ha,weekdaysShort:Ia,weekdaysMin:Ja,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-màireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-dè aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"mìos",MM:"%d mìosan",y:"bliadhna",yy:"%d bliadhna"},ordinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(a){var b=1===a?"d":a%10===2?"na":"mh";return a+b},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Galician [gl]
+//! author : Juan G. Hurtado : https://github.com/juanghurtado
+a.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_mércores_xoves_venres_sábado".split("_"),weekdaysShort:"dom._lun._mar._mér._xov._ven._sáb.".split("_"),weekdaysMin:"do_lu_ma_mé_xo_ve_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(a){return 0===a.indexOf("un")?"n"+a:"en "+a},past:"hai %s",s:"uns segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Hebrew [he]
+//! author : Tomer Cohen : https://github.com/tomer
+//! author : Moshe Simantov : https://github.com/DevelopmentIL
+//! author : Tal Ater : https://github.com/TalAter
+a.defineLocale("he",{months:"ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳".split("_"),weekdays:"ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"א_ב_ג_ד_ה_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY HH:mm",LLLL:"dddd, D [ב]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[היום ב־]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[אתמול ב־]LT",lastWeek:"[ביום] dddd [האחרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(a){return 2===a?"שעתיים":a+" שעות"},d:"יום",dd:function(a){return 2===a?"יומיים":a+" ימים"},M:"חודש",MM:function(a){return 2===a?"חודשיים":a+" חודשים"},y:"שנה",yy:function(a){return 2===a?"שנתיים":a%10===0&&10!==a?a+" שנה":a+" שנים"}},meridiemParse:/אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,isPM:function(a){return/^(אחה"צ|אחרי הצהריים|בערב)$/.test(a)},meridiem:function(a,b,c){return a<5?"לפנות בוקר":a<10?"בבוקר":a<12?c?'לפנה"צ':"לפני הצהריים":a<18?c?'אחה"צ':"אחרי הצהריים":"בערב"}});
+//! moment.js locale configuration
+//! locale : Hindi [hi]
+//! author : Mayank Singhal : https://github.com/mayanksinghal
+var Ka={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},La={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};a.defineLocale("hi",{months:"जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर".split("_"),monthsShort:"जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.".split("_"),monthsParseExact:!0,weekdays:"रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm बजे",LLLL:"dddd, D MMMM YYYY, A h:mm बजे"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कुछ ही क्षण",m:"एक मिनट",mm:"%d मिनट",h:"एक घंटा",hh:"%d घंटे",d:"एक दिन",dd:"%d दिन",M:"एक महीने",MM:"%d महीने",y:"एक वर्ष",yy:"%d वर्ष"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return La[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return Ka[a]})},
+// Hindi notation for meridiems are quite fuzzy in practice. While there exists
+// a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
+meridiemParse:/रात|सुबह|दोपहर|शाम/,meridiemHour:function(a,b){return 12===a&&(a=0),"रात"===b?a<4?a:a+12:"सुबह"===b?a:"दोपहर"===b?a>=10?a:a+12:"शाम"===b?a+12:void 0},meridiem:function(a,b,c){return a<4?"रात":a<10?"सुबह":a<17?"दोपहर":a<20?"शाम":"रात"},week:{dow:0,// Sunday is the first day of the week.
+doy:6}}),a.defineLocale("hr",{months:{format:"siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:r,mm:r,h:r,hh:r,d:"dan",dd:r,M:"mjesec",MM:r,y:"godinu",yy:r},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:7}});
+//! moment.js locale configuration
+//! locale : Hungarian [hu]
+//! author : Adam Brunner : https://github.com/adambrunner
+var Ma="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" ");a.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(a){return"u"===a.charAt(1).toLowerCase()},meridiem:function(a,b,c){return a<12?c===!0?"de":"DE":c===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return t.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return t.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:s,m:s,mm:s,h:s,hh:s,d:s,dd:s,M:s,MM:s,y:s,yy:s},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Armenian [hy-am]
+//! author : Armendarabyan : https://github.com/armendarabyan
+a.defineLocale("hy-am",{months:{format:"հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի".split("_"),standalone:"հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր".split("_")},monthsShort:"հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ".split("_"),weekdays:"կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ".split("_"),weekdaysShort:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),weekdaysMin:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY թ.",LLL:"D MMMM YYYY թ., HH:mm",LLLL:"dddd, D MMMM YYYY թ., HH:mm"},calendar:{sameDay:"[այսօր] LT",nextDay:"[վաղը] LT",lastDay:"[երեկ] LT",nextWeek:function(){return"dddd [օրը ժամը] LT"},lastWeek:function(){return"[անցած] dddd [օրը ժամը] LT"},sameElse:"L"},relativeTime:{future:"%s հետո",past:"%s առաջ",s:"մի քանի վայրկյան",m:"րոպե",mm:"%d րոպե",h:"ժամ",hh:"%d ժամ",d:"օր",dd:"%d օր",M:"ամիս",MM:"%d ամիս",y:"տարի",yy:"%d տարի"},meridiemParse:/գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,isPM:function(a){return/^(ցերեկվա|երեկոյան)$/.test(a)},meridiem:function(a){return a<4?"գիշերվա":a<12?"առավոտվա":a<17?"ցերեկվա":"երեկոյան"},ordinalParse:/\d{1,2}|\d{1,2}-(ին|րդ)/,ordinal:function(a,b){switch(b){case"DDD":case"w":case"W":case"DDDo":return 1===a?a+"-ին":a+"-րդ";default:return a}},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Indonesian [id]
+//! author : Mohammad Satrio Utomo : https://github.com/tyok
+//! reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
+a.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"siang"===b?a>=11?a:a+12:"sore"===b||"malam"===b?a+12:void 0},meridiem:function(a,b,c){return a<11?"pagi":a<15?"siang":a<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),a.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:v,m:v,mm:v,h:"klukkustund",hh:v,d:v,dd:v,M:v,MM:v,y:v,yy:v},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Italian [it]
+//! author : Lorenzo : https://github.com/aliem
+//! author: Mattia Larentis: https://github.com/nostalgiaz
+a.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"Do_Lu_Ma_Me_Gi_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(a){return(/^[0-9].+$/.test(a)?"tra":"in")+" "+a},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Japanese [ja]
+//! author : LI Long : https://github.com/baryon
+a.defineLocale("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",LTS:"Ah時m分s秒",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah時m分",LLLL:"YYYY年M月D日Ah時m分 dddd"},meridiemParse:/午前|午後/i,isPM:function(a){return"午後"===a},meridiem:function(a,b,c){return a<12?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[来週]dddd LT",lastDay:"[昨日] LT",lastWeek:"[前週]dddd LT",sameElse:"L"},ordinalParse:/\d{1,2}日/,ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"日";default:return a}},relativeTime:{future:"%s後",past:"%s前",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}}),
+//! moment.js locale configuration
+//! locale : Javanese [jv]
+//! author : Rony Lantip : https://github.com/lantip
+//! reference: http://jv.wikipedia.org/wiki/Basa_Jawa
+a.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(a,b){return 12===a&&(a=0),"enjing"===b?a:"siyang"===b?a>=11?a:a+12:"sonten"===b||"ndalu"===b?a+12:void 0},meridiem:function(a,b,c){return a<11?"enjing":a<15?"siyang":a<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Georgian [ka]
+//! author : Irakli Janiashvili : https://github.com/irakli-janiashvili
+a.defineLocale("ka",{months:{standalone:"იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი".split("_"),format:"იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს".split("_")},monthsShort:"იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ".split("_"),weekdays:{standalone:"კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი".split("_"),format:"კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს".split("_"),isFormat:/(წინა|შემდეგ)/},weekdaysShort:"კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ".split("_"),weekdaysMin:"კვ_ორ_სა_ოთ_ხუ_პა_შა".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვალ] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინა] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(a){return/(წამი|წუთი|საათი|წელი)/.test(a)?a.replace(/ი$/,"ში"):a+"ში"},past:function(a){return/(წამი|წუთი|საათი|დღე|თვე)/.test(a)?a.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(a)?a.replace(/წელი$/,"წლის წინ"):void 0},s:"რამდენიმე წამი",m:"წუთი",mm:"%d წუთი",h:"საათი",hh:"%d საათი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},ordinalParse:/0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,ordinal:function(a){return 0===a?a:1===a?a+"-ლი":a<20||a<=100&&a%20===0||a%100===0?"მე-"+a:a+"-ე"},week:{dow:1,doy:7}});
+//! moment.js locale configuration
+//! locale : Kazakh [kk]
+//! authors : Nurlan Rakhimzhanov : https://github.com/nurlan
+var Na={0:"-ші",1:"-ші",2:"-ші",3:"-ші",4:"-ші",5:"-ші",6:"-шы",7:"-ші",8:"-ші",9:"-шы",10:"-шы",20:"-шы",30:"-шы",40:"-шы",50:"-ші",60:"-шы",70:"-ші",80:"-ші",90:"-шы",100:"-ші"};a.defineLocale("kk",{months:"қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан".split("_"),monthsShort:"қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел".split("_"),weekdays:"жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі".split("_"),weekdaysShort:"жек_дүй_сей_сәр_бей_жұм_сен".split("_"),weekdaysMin:"жк_дй_сй_ср_бй_жм_сн".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Бүгін сағат] LT",nextDay:"[Ертең сағат] LT",nextWeek:"dddd [сағат] LT",lastDay:"[Кеше сағат] LT",lastWeek:"[Өткен аптаның] dddd [сағат] LT",sameElse:"L"},relativeTime:{future:"%s ішінде",past:"%s бұрын",s:"бірнеше секунд",m:"бір минут",mm:"%d минут",h:"бір сағат",hh:"%d сағат",d:"бір күн",dd:"%d күн",M:"бір ай",MM:"%d ай",y:"бір жыл",yy:"%d жыл"},ordinalParse:/\d{1,2}-(ші|шы)/,ordinal:function(a){var b=a%10,c=a>=100?100:null;return a+(Na[a]||Na[b]||Na[c])},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Cambodian [km]
+//! author : Kruy Vanna : https://github.com/kruyvanna
+a.defineLocale("km",{months:"មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),monthsShort:"មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),weekdays:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),weekdaysShort:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),weekdaysMin:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[ថ្ងៃនេះ ម៉ោង] LT",nextDay:"[ស្អែក ម៉ោង] LT",nextWeek:"dddd [ម៉ោង] LT",lastDay:"[ម្សិលមិញ ម៉ោង] LT",lastWeek:"dddd [សប្តាហ៍មុន] [ម៉ោង] LT",sameElse:"L"},relativeTime:{future:"%sទៀត",past:"%sមុន",s:"ប៉ុន្មានវិនាទី",m:"មួយនាទី",mm:"%d នាទី",h:"មួយម៉ោង",hh:"%d ម៉ោង",d:"មួយថ្ងៃ",dd:"%d ថ្ងៃ",M:"មួយខែ",MM:"%d ខែ",y:"មួយឆ្នាំ",yy:"%d ឆ្នាំ"},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Korean [ko]
+//! author : Kyungwook, Park : https://github.com/kyungw00k
+//! author : Jeeeyul Lee <jeeeyul@gmail.com>
+a.defineLocale("ko",{months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),longDateFormat:{LT:"A h시 m분",LTS:"A h시 m분 s초",L:"YYYY.MM.DD",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 A h시 m분",LLLL:"YYYY년 MMMM D일 dddd A h시 m분"},calendar:{sameDay:"오늘 LT",nextDay:"내일 LT",nextWeek:"dddd LT",lastDay:"어제 LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇 초",ss:"%d초",m:"일분",mm:"%d분",h:"한 시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한 달",MM:"%d달",y:"일 년",yy:"%d년"},ordinalParse:/\d{1,2}일/,ordinal:"%d일",meridiemParse:/오전|오후/,isPM:function(a){return"오후"===a},meridiem:function(a,b,c){return a<12?"오전":"오후"}});
+//! moment.js locale configuration
+//! locale : Kyrgyz [ky]
+//! author : Chyngyz Arystan uulu : https://github.com/chyngyz
+var Oa={0:"-чү",1:"-чи",2:"-чи",3:"-чү",4:"-чү",5:"-чи",6:"-чы",7:"-чи",8:"-чи",9:"-чу",10:"-чу",20:"-чы",30:"-чу",40:"-чы",50:"-чү",60:"-чы",70:"-чи",80:"-чи",90:"-чу",100:"-чү"};a.defineLocale("ky",{months:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),monthsShort:"янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек".split("_"),weekdays:"Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби".split("_"),weekdaysShort:"Жек_Дүй_Шей_Шар_Бей_Жум_Ише".split("_"),weekdaysMin:"Жк_Дй_Шй_Шр_Бй_Жм_Иш".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Бүгүн саат] LT",nextDay:"[Эртең саат] LT",nextWeek:"dddd [саат] LT",lastDay:"[Кече саат] LT",lastWeek:"[Өткен аптанын] dddd [күнү] [саат] LT",sameElse:"L"},relativeTime:{future:"%s ичинде",past:"%s мурун",s:"бирнече секунд",m:"бир мүнөт",mm:"%d мүнөт",h:"бир саат",hh:"%d саат",d:"бир күн",dd:"%d күн",M:"бир ай",MM:"%d ай",y:"бир жыл",yy:"%d жыл"},ordinalParse:/\d{1,2}-(чи|чы|чү|чу)/,ordinal:function(a){var b=a%10,c=a>=100?100:null;return a+(Oa[a]||Oa[b]||Oa[c])},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),a.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){
+// Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule
+switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:x,past:y,s:"e puer Sekonnen",m:w,mm:"%d Minutten",h:w,hh:"%d Stonnen",d:w,dd:"%d Deeg",M:w,MM:"%d Méint",y:w,yy:"%d Joer"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Lao [lo]
+//! author : Ryan Hart : https://github.com/ryanhart2
+a.defineLocale("lo",{months:"ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ".split("_"),monthsShort:"ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ".split("_"),weekdays:"ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ".split("_"),weekdaysShort:"ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ".split("_"),weekdaysMin:"ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"ວັນdddd D MMMM YYYY HH:mm"},meridiemParse:/ຕອນເຊົ້າ|ຕອນແລງ/,isPM:function(a){return"ຕອນແລງ"===a},meridiem:function(a,b,c){return a<12?"ຕອນເຊົ້າ":"ຕອນແລງ"},calendar:{sameDay:"[ມື້ນີ້ເວລາ] LT",nextDay:"[ມື້ອື່ນເວລາ] LT",nextWeek:"[ວັນ]dddd[ໜ້າເວລາ] LT",lastDay:"[ມື້ວານນີ້ເວລາ] LT",lastWeek:"[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT",sameElse:"L"},relativeTime:{future:"ອີກ %s",past:"%sຜ່ານມາ",s:"ບໍ່ເທົ່າໃດວິນາທີ",m:"1 ນາທີ",mm:"%d ນາທີ",h:"1 ຊົ່ວໂມງ",hh:"%d ຊົ່ວໂມງ",d:"1 ມື້",dd:"%d ມື້",M:"1 ເດືອນ",MM:"%d ເດືອນ",y:"1 ປີ",yy:"%d ປີ"},ordinalParse:/(ທີ່)\d{1,2}/,ordinal:function(a){return"ທີ່"+a}});
+//! moment.js locale configuration
+//! locale : Lithuanian [lt]
+//! author : Mindaugas Mozūras : https://github.com/mmozuras
+var Pa={m:"minutė_minutės_minutę",mm:"minutės_minučių_minutes",h:"valanda_valandos_valandą",hh:"valandos_valandų_valandas",d:"diena_dienos_dieną",dd:"dienos_dienų_dienas",M:"mėnuo_mėnesio_mėnesį",MM:"mėnesiai_mėnesių_mėnesius",y:"metai_metų_metus",yy:"metai_metų_metus"};a.defineLocale("lt",{months:{format:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Š".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[Šiandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Praėjusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieš %s",s:A,m:B,mm:E,h:B,hh:E,d:B,dd:E,M:B,MM:E,y:B,yy:E},ordinalParse:/\d{1,2}-oji/,ordinal:function(a){return a+"-oji"},week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Latvian [lv]
+//! author : Kristaps Karlsons : https://github.com/skakri
+//! author : Jānis Elmeris : https://github.com/JanisE
+var Qa={m:"minūtes_minūtēm_minūte_minūtes".split("_"),mm:"minūtes_minūtēm_minūte_minūtes".split("_"),h:"stundas_stundām_stunda_stundas".split("_"),hh:"stundas_stundām_stunda_stundas".split("_"),d:"dienas_dienām_diena_dienas".split("_"),dd:"dienas_dienām_diena_dienas".split("_"),M:"mēneša_mēnešiem_mēnesis_mēneši".split("_"),MM:"mēneša_mēnešiem_mēnesis_mēneši".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};a.defineLocale("lv",{months:"janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),weekdays:"svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[Šodien pulksten] LT",nextDay:"[Rīt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pagājušā] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"pēc %s",past:"pirms %s",s:I,m:H,mm:G,h:H,hh:G,d:H,dd:G,M:H,MM:G,y:H,yy:G},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Montenegrin [me]
+//! author : Miodrag Nikač <miodrag@restartit.me> : https://github.com/miodragnikac
+var Ra={words:{//Different grammatical cases
+m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&a<=4?b[1]:b[2]},translate:function(a,b,c){var d=Ra.words[c];return 1===c.length?b?d[0]:d[1]:a+" "+Ra.correctGrammaticalCase(a,d)}};a.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){var a=["[prošle] [nedjelje] [u] LT","[prošlog] [ponedjeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srijede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",m:Ra.translate,mm:Ra.translate,h:Ra.translate,hh:Ra.translate,d:"dan",dd:Ra.translate,M:"mjesec",MM:Ra.translate,y:"godinu",yy:Ra.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Maori [mi]
+//! author : John Corrigan <robbiecloset@gmail.com> : https://github.com/johnideal
+a.defineLocale("mi",{months:"Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei".split("_"),weekdaysShort:"Ta_Ma_Tū_We_Tāi_Pa_Hā".split("_"),weekdaysMin:"Ta_Ma_Tū_We_Tāi_Pa_Hā".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te hēkona ruarua",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Macedonian [mk]
+//! author : Borislav Mickov : https://github.com/B0k0
+a.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_среда_четврток_петок_сабота".split("_"),weekdaysShort:"нед_пон_вто_сре_чет_пет_саб".split("_"),weekdaysMin:"нe_пo_вт_ср_че_пе_сa".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Денес во] LT",nextDay:"[Утре во] LT",nextWeek:"[Во] dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"после %s",past:"пред %s",s:"неколку секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дена",M:"месец",MM:"%d месеци",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&c<20?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Malayalam [ml]
+//! author : Floyd Pink : https://github.com/floydpink
+a.defineLocale("ml",{months:"ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.".split("_"),monthsParseExact:!0,weekdays:"ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച".split("_"),weekdaysShort:"ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി".split("_"),weekdaysMin:"ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ".split("_"),longDateFormat:{LT:"A h:mm -നു",LTS:"A h:mm:ss -നു",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -നു",LLLL:"dddd, D MMMM YYYY, A h:mm -നു"},calendar:{sameDay:"[ഇന്ന്] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇന്നലെ] LT",lastWeek:"[കഴിഞ്ഞ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s കഴിഞ്ഞ്",past:"%s മുൻപ്",s:"അൽപ നിമിഷങ്ങൾ",m:"ഒരു മിനിറ്റ്",mm:"%d മിനിറ്റ്",h:"ഒരു മണിക്കൂർ",hh:"%d മണിക്കൂർ",d:"ഒരു ദിവസം",dd:"%d ദിവസം",M:"ഒരു മാസം",MM:"%d മാസം",y:"ഒരു വർഷം",yy:"%d വർഷം"},meridiemParse:/രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,meridiemHour:function(a,b){return 12===a&&(a=0),"രാത്രി"===b&&a>=4||"ഉച്ച കഴിഞ്ഞ്"===b||"വൈകുന്നേരം"===b?a+12:a},meridiem:function(a,b,c){return a<4?"രാത്രി":a<12?"രാവിലെ":a<17?"ഉച്ച കഴിഞ്ഞ്":a<20?"വൈകുന്നേരം":"രാത്രി"}});
+//! moment.js locale configuration
+//! locale : Marathi [mr]
+//! author : Harshad Kale : https://github.com/kalehv
+//! author : Vivek Athalye : https://github.com/vnathalye
+var Sa={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},Ta={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};a.defineLocale("mr",{months:"जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर".split("_"),monthsShort:"जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.".split("_"),monthsParseExact:!0,weekdays:"रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",LTS:"A h:mm:ss वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm वाजता",LLLL:"dddd, D MMMM YYYY, A h:mm वाजता"},calendar:{sameDay:"[आज] LT",nextDay:"[उद्या] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%sमध्ये",past:"%sपूर्वी",s:J,m:J,mm:J,h:J,hh:J,d:J,dd:J,M:J,MM:J,y:J,yy:J},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return Ta[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return Sa[a]})},meridiemParse:/रात्री|सकाळी|दुपारी|सायंकाळी/,meridiemHour:function(a,b){return 12===a&&(a=0),"रात्री"===b?a<4?a:a+12:"सकाळी"===b?a:"दुपारी"===b?a>=10?a:a+12:"सायंकाळी"===b?a+12:void 0},meridiem:function(a,b,c){return a<4?"रात्री":a<10?"सकाळी":a<17?"दुपारी":a<20?"सायंकाळी":"रात्री"},week:{dow:0,// Sunday is the first day of the week.
+doy:6}}),
+//! moment.js locale configuration
+//! locale : Malay [ms-my]
+//! note : DEPRECATED, the correct one is [ms]
+//! author : Weldan Jamili : https://github.com/weldan
+a.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"tengahari"===b?a>=11?a:a+12:"petang"===b||"malam"===b?a+12:void 0},meridiem:function(a,b,c){return a<11?"pagi":a<15?"tengahari":a<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Malay [ms]
+//! author : Weldan Jamili : https://github.com/weldan
+a.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"tengahari"===b?a>=11?a:a+12:"petang"===b||"malam"===b?a+12:void 0},meridiem:function(a,b,c){return a<11?"pagi":a<15?"tengahari":a<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,// Monday is the first day of the week.
+doy:7}});
+//! moment.js locale configuration
+//! locale : Burmese [my]
+//! author : Squar team, mysquar.com
+//! author : David Rossellat : https://github.com/gholadr
+//! author : Tin Aung Lin : https://github.com/thanyawzinmin
+var Ua={1:"၁",2:"၂",3:"၃",4:"၄",5:"၅",6:"၆",7:"၇",8:"၈",9:"၉",0:"၀"},Va={"၁":"1","၂":"2","၃":"3","၄":"4","၅":"5","၆":"6","၇":"7","၈":"8","၉":"9","၀":"0"};a.defineLocale("my",{months:"ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ".split("_"),monthsShort:"ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ".split("_"),weekdays:"တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ".split("_"),weekdaysShort:"နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),weekdaysMin:"နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[ယနေ.] LT [မှာ]",nextDay:"[မနက်ဖြန်] LT [မှာ]",nextWeek:"dddd LT [မှာ]",lastDay:"[မနေ.က] LT [မှာ]",lastWeek:"[ပြီးခဲ့သော] dddd LT [မှာ]",sameElse:"L"},relativeTime:{future:"လာမည့် %s မှာ",past:"လွန်ခဲ့သော %s က",s:"စက္ကန်.အနည်းငယ်",m:"တစ်မိနစ်",mm:"%d မိနစ်",h:"တစ်နာရီ",hh:"%d နာရီ",d:"တစ်ရက်",dd:"%d ရက်",M:"တစ်လ",MM:"%d လ",y:"တစ်နှစ်",yy:"%d နှစ်"},preparse:function(a){return a.replace(/[၁၂၃၄၅၆၇၈၉၀]/g,function(a){return Va[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return Ua[a]})},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Norwegian Bokmål [nb]
+//! authors : Espen Hovlandsdal : https://github.com/rexxars
+//! Sigurd Gartmann : https://github.com/sigurdga
+a.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"sø._ma._ti._on._to._fr._lø.".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en måned",MM:"%d måneder",y:"ett år",yy:"%d år"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Nepalese [ne]
+//! author : suvash : https://github.com/suvash
+var Wa={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},Xa={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};a.defineLocale("ne",{months:"जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर".split("_"),monthsShort:"जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.".split("_"),monthsParseExact:!0,weekdays:"आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.".split("_"),weekdaysMin:"आ._सो._मं._बु._बि._शु._श.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"Aको h:mm बजे",LTS:"Aको h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, Aको h:mm बजे",LLLL:"dddd, D MMMM YYYY, Aको h:mm बजे"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return Xa[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return Wa[a]})},meridiemParse:/राति|बिहान|दिउँसो|साँझ/,meridiemHour:function(a,b){return 12===a&&(a=0),"राति"===b?a<4?a:a+12:"बिहान"===b?a:"दिउँसो"===b?a>=10?a:a+12:"साँझ"===b?a+12:void 0},meridiem:function(a,b,c){return a<3?"राति":a<12?"बिहान":a<16?"दिउँसो":a<20?"साँझ":"राति"},calendar:{sameDay:"[आज] LT",nextDay:"[भोलि] LT",nextWeek:"[आउँदो] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गएको] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडि",s:"केही क्षण",m:"एक मिनेट",mm:"%d मिनेट",h:"एक घण्टा",hh:"%d घण्टा",d:"एक दिन",dd:"%d दिन",M:"एक महिना",MM:"%d महिना",y:"एक बर्ष",yy:"%d बर्ष"},week:{dow:0,// Sunday is the first day of the week.
+doy:6}});
+//! moment.js locale configuration
+//! locale : Dutch (Belgium) [nl-be]
+//! author : Joris Röling : https://github.com/jorisroling
+//! author : Jacob Middag : https://github.com/middagj
+var Ya="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),Za="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),$a=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],_a=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;a.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,b){return/-MMM-/.test(b)?Za[a.month()]:Ya[a.month()]},monthsRegex:_a,monthsShortRegex:_a,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:$a,longMonthsParse:$a,shortMonthsParse:$a,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Dutch [nl]
+//! author : Joris Röling : https://github.com/jorisroling
+//! author : Jacob Middag : https://github.com/middagj
+var ab="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),bb="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),cb=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],db=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;a.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,b){return/-MMM-/.test(b)?bb[a.month()]:ab[a.month()]},monthsRegex:db,monthsShortRegex:db,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:cb,longMonthsParse:cb,shortMonthsParse:cb,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Nynorsk [nn]
+//! author : https://github.com/mechuwind
+a.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mån_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_må_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I går klokka] LT",lastWeek:"[Føregåande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein månad",MM:"%d månader",y:"eit år",yy:"%d år"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Punjabi (India) [pa-in]
+//! author : Harpreet Singh : https://github.com/harpreetkhalsagtbit
+var eb={1:"੧",2:"੨",3:"੩",4:"੪",5:"੫",6:"੬",7:"੭",8:"੮",9:"੯",0:"੦"},fb={"੧":"1","੨":"2","੩":"3","੪":"4","੫":"5","੬":"6","੭":"7","੮":"8","੯":"9","੦":"0"};a.defineLocale("pa-in",{
+// There are months name as per Nanakshahi Calender but they are not used as rigidly in modern Punjabi.
+months:"ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ".split("_"),monthsShort:"ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ".split("_"),weekdays:"ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ".split("_"),weekdaysShort:"ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ".split("_"),weekdaysMin:"ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ".split("_"),longDateFormat:{LT:"A h:mm ਵਜੇ",LTS:"A h:mm:ss ਵਜੇ",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm ਵਜੇ",LLLL:"dddd, D MMMM YYYY, A h:mm ਵਜੇ"},calendar:{sameDay:"[ਅਜ] LT",nextDay:"[ਕਲ] LT",nextWeek:"dddd, LT",lastDay:"[ਕਲ] LT",lastWeek:"[ਪਿਛਲੇ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ਵਿੱਚ",past:"%s ਪਿਛਲੇ",s:"ਕੁਝ ਸਕਿੰਟ",m:"ਇਕ ਮਿੰਟ",mm:"%d ਮਿੰਟ",h:"ਇੱਕ ਘੰਟਾ",hh:"%d ਘੰਟੇ",d:"ਇੱਕ ਦਿਨ",dd:"%d ਦਿਨ",M:"ਇੱਕ ਮਹੀਨਾ",MM:"%d ਮਹੀਨੇ",y:"ਇੱਕ ਸਾਲ",yy:"%d ਸਾਲ"},preparse:function(a){return a.replace(/[੧੨੩੪੫੬੭੮੯੦]/g,function(a){return fb[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return eb[a]})},
+// Punjabi notation for meridiems are quite fuzzy in practice. While there exists
+// a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi.
+meridiemParse:/ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,meridiemHour:function(a,b){return 12===a&&(a=0),"ਰਾਤ"===b?a<4?a:a+12:"ਸਵੇਰ"===b?a:"ਦੁਪਹਿਰ"===b?a>=10?a:a+12:"ਸ਼ਾਮ"===b?a+12:void 0},meridiem:function(a,b,c){return a<4?"ਰਾਤ":a<10?"ਸਵੇਰ":a<17?"ਦੁਪਹਿਰ":a<20?"ਸ਼ਾਮ":"ਰਾਤ"},week:{dow:0,// Sunday is the first day of the week.
+doy:6}});
+//! moment.js locale configuration
+//! locale : Polish [pl]
+//! author : Rafal Hirsz : https://github.com/evoL
+var gb="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),hb="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");a.defineLocale("pl",{months:function(a,b){return""===b?"("+hb[a.month()]+"|"+gb[a.month()]+")":/D MMMM/.test(b)?hb[a.month()]:gb[a.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_śr_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:L,mm:L,h:L,hh:L,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:L,y:"rok",yy:L},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Portuguese (Brazil) [pt-br]
+//! author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
+a.defineLocale("pt-br",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [às] HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){// Saturday + Sunday
+return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"poucos segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº"}),
+//! moment.js locale configuration
+//! locale : Portuguese [pt]
+//! author : Jefferson : https://github.com/jalex79
+a.defineLocale("pt",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){// Saturday + Sunday
+return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:M,h:"o oră",hh:M,d:"o zi",dd:M,M:"o lună",MM:M,y:"un an",yy:M},week:{dow:1,// Monday is the first day of the week.
+doy:7}});var ib=[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[йя]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i];
+// http://new.gramota.ru/spravka/rules/139-prop : § 103
+// Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637
+// CLDR data: http://www.unicode.org/cldr/charts/28/summary/ru.html#1753
+a.defineLocale("ru",{months:{format:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_"),standalone:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_")},monthsShort:{
+// по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку ?
+format:"янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.".split("_"),standalone:"янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.".split("_")},weekdays:{standalone:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),format:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_"),isFormat:/\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/},weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:ib,longMonthsParse:ib,shortMonthsParse:ib,
+// полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки
+monthsRegex:/^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,
+// копия предыдущего
+monthsShortRegex:/^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,
+// полные названия с падежами
+monthsStrictRegex:/^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,
+// Выражение, которое соотвествует только сокращённым формам
+monthsShortStrictRegex:/^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., HH:mm",LLLL:"dddd, D MMMM YYYY г., HH:mm"},calendar:{sameDay:"[Сегодня в] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(a){if(a.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[В] dddd [в] LT";switch(this.day()){case 0:return"[В следующее] dddd [в] LT";case 1:case 2:case 4:return"[В следующий] dddd [в] LT";case 3:case 5:case 6:return"[В следующую] dddd [в] LT"}},lastWeek:function(a){if(a.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[В] dddd [в] LT";switch(this.day()){case 0:return"[В прошлое] dddd [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",m:O,mm:O,h:"час",hh:O,d:"день",dd:O,M:"месяц",MM:O,y:"год",yy:O},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(a){return/^(дня|вечера)$/.test(a)},meridiem:function(a,b,c){return a<4?"ночи":a<12?"утра":a<17?"дня":"вечера"},ordinalParse:/\d{1,2}-(й|го|я)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":return a+"-й";case"D":return a+"-го";case"w":case"W":return a+"-я";default:return a}},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Northern Sami [se]
+//! authors : Bård Rolstad Henriksen : https://github.com/karamell
+a.defineLocale("se",{months:"ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu".split("_"),monthsShort:"ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov".split("_"),weekdays:"sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat".split("_"),weekdaysShort:"sotn_vuos_maŋ_gask_duor_bear_láv".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s geažes",past:"maŋit %s",s:"moadde sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta mánnu",MM:"%d mánut",y:"okta jahki",yy:"%d jagit"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Sinhalese [si]
+//! author : Sampath Sitinamaluwa : https://github.com/sampathsris
+/*jshint -W100*/
+a.defineLocale("si",{months:"ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්".split("_"),monthsShort:"ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ".split("_"),weekdays:"ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා".split("_"),weekdaysShort:"ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන".split("_"),weekdaysMin:"ඉ_ස_අ_බ_බ්‍ර_සි_සෙ".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [වැනි] dddd, a h:mm:ss"},calendar:{sameDay:"[අද] LT[ට]",nextDay:"[හෙට] LT[ට]",nextWeek:"dddd LT[ට]",lastDay:"[ඊයේ] LT[ට]",lastWeek:"[පසුගිය] dddd LT[ට]",sameElse:"L"},relativeTime:{future:"%sකින්",past:"%sකට පෙර",s:"තත්පර කිහිපය",m:"මිනිත්තුව",mm:"මිනිත්තු %d",h:"පැය",hh:"පැය %d",d:"දිනය",dd:"දින %d",M:"මාසය",MM:"මාස %d",y:"වසර",yy:"වසර %d"},ordinalParse:/\d{1,2} වැනි/,ordinal:function(a){return a+" වැනි"},meridiemParse:/පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,isPM:function(a){return"ප.ව."===a||"පස් වරු"===a},meridiem:function(a,b,c){return a>11?c?"ප.ව.":"පස් වරු":c?"පෙ.ව.":"පෙර වරු"}});
+//! moment.js locale configuration
+//! locale : Slovak [sk]
+//! author : Martin Minka : https://github.com/k2s
+//! based on work of petrbela : https://github.com/petrbela
+var jb="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),kb="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");a.defineLocale("sk",{months:jb,monthsShort:kb,weekdays:"nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_št_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_št_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo štvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[včera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:Q,m:Q,mm:Q,h:Q,hh:Q,d:Q,dd:Q,M:Q,MM:Q,y:Q,yy:Q},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._čet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_če_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[včeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prejšnjo] [nedeljo] [ob] LT";case 3:return"[prejšnjo] [sredo] [ob] LT";case 6:return"[prejšnjo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prejšnji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"čez %s",past:"pred %s",s:R,m:R,mm:R,h:R,hh:R,d:R,dd:R,M:R,MM:R,y:R,yy:R},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Albanian [sq]
+//! author : Flakërim Ismani : https://github.com/flakerimi
+//! author : Menelion Elensúle : https://github.com/Oire
+//! author : Oerd Cukalla : https://github.com/oerd
+a.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),weekdaysParseExact:!0,meridiemParse:/PD|MD/,isPM:function(a){return"M"===a.charAt(0)},meridiem:function(a,b,c){return a<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Nesër në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s më parë",s:"disa sekonda",m:"një minutë",mm:"%d minuta",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Serbian Cyrillic [sr-cyrl]
+//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+var lb={words:{//Different grammatical cases
+m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један сат","једног сата"],hh:["сат","сата","сати"],dd:["дан","дана","дана"],MM:["месец","месеца","месеци"],yy:["година","године","година"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&a<=4?b[1]:b[2]},translate:function(a,b,c){var d=lb.words[c];return 1===c.length?b?d[0]:d[1]:a+" "+lb.correctGrammaticalCase(a,d)}};a.defineLocale("sr-cyrl",{months:"јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар".split("_"),monthsShort:"јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.".split("_"),monthsParseExact:!0,weekdays:"недеља_понедељак_уторак_среда_четвртак_петак_субота".split("_"),weekdaysShort:"нед._пон._уто._сре._чет._пет._суб.".split("_"),weekdaysMin:"не_по_ут_ср_че_пе_су".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[данас у] LT",nextDay:"[сутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [среду] [у] LT";case 6:return"[у] [суботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var a=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [среде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [суботе] [у] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико секунди",m:lb.translate,mm:lb.translate,h:lb.translate,hh:lb.translate,d:"дан",dd:lb.translate,M:"месец",MM:lb.translate,y:"годину",yy:lb.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:7}});
+//! moment.js locale configuration
+//! locale : Serbian [sr]
+//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+var mb={words:{//Different grammatical cases
+m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&a<=4?b[1]:b[2]},translate:function(a,b,c){var d=mb.words[c];return 1===c.length?b?d[0]:d[1]:a+" "+mb.correctGrammaticalCase(a,d)}};a.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){var a=["[prošle] [nedelje] [u] LT","[prošlog] [ponedeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:mb.translate,mm:mb.translate,h:mb.translate,hh:mb.translate,d:"dan",dd:mb.translate,M:"mesec",MM:mb.translate,y:"godinu",yy:mb.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : siSwati [ss]
+//! author : Nicolai Davies<mail@nicolai.io> : https://github.com/nicolaidavies
+a.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(a,b,c){return a<11?"ekuseni":a<15?"emini":a<19?"entsambama":"ebusuku"},meridiemHour:function(a,b){return 12===a&&(a=0),"ekuseni"===b?a:"emini"===b?a>=11?a:a+12:"entsambama"===b||"ebusuku"===b?0===a?0:a+12:void 0},ordinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Swedish [sv]
+//! author : Jens Alm : https://github.com/ulmus
+a.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mån_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_må_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Igår] LT",nextWeek:"[På] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"några sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en månad",MM:"%d månader",y:"ett år",yy:"%d år"},ordinalParse:/\d{1,2}(e|a)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"e":1===b?"a":2===b?"a":"e";return a+c},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Swahili [sw]
+//! author : Fahad Kassim : https://github.com/fadsel
+a.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"masiku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,// Monday is the first day of the week.
+doy:7}});
+//! moment.js locale configuration
+//! locale : Tamil [ta]
+//! author : Arjunkumar Krishnamoorthy : https://github.com/tk120404
+var nb={1:"௧",2:"௨",3:"௩",4:"௪",5:"௫",6:"௬",7:"௭",8:"௮",9:"௯",0:"௦"},ob={"௧":"1","௨":"2","௩":"3","௪":"4","௫":"5","௬":"6","௭":"7","௮":"8","௯":"9","௦":"0"};a.defineLocale("ta",{months:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),monthsShort:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),weekdays:"ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை".split("_"),weekdaysShort:"ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி".split("_"),weekdaysMin:"ஞா_தி_செ_பு_வி_வெ_ச".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[இன்று] LT",nextDay:"[நாளை] LT",nextWeek:"dddd, LT",lastDay:"[நேற்று] LT",lastWeek:"[கடந்த வாரம்] dddd, LT",sameElse:"L"},relativeTime:{future:"%s இல்",past:"%s முன்",s:"ஒரு சில விநாடிகள்",m:"ஒரு நிமிடம்",mm:"%d நிமிடங்கள்",h:"ஒரு மணி நேரம்",hh:"%d மணி நேரம்",d:"ஒரு நாள்",dd:"%d நாட்கள்",M:"ஒரு மாதம்",MM:"%d மாதங்கள்",y:"ஒரு வருடம்",yy:"%d ஆண்டுகள்"},ordinalParse:/\d{1,2}வது/,ordinal:function(a){return a+"வது"},preparse:function(a){return a.replace(/[௧௨௩௪௫௬௭௮௯௦]/g,function(a){return ob[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return nb[a]})},
+// refer http://ta.wikipedia.org/s/1er1
+meridiemParse:/யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,meridiem:function(a,b,c){return a<2?" யாமம்":a<6?" வைகறை":a<10?" காலை":a<14?" நண்பகல்":a<18?" எற்பாடு":a<22?" மாலை":" யாமம்"},meridiemHour:function(a,b){return 12===a&&(a=0),"யாமம்"===b?a<2?a:a+12:"வைகறை"===b||"காலை"===b?a:"நண்பகல்"===b&&a>=10?a:a+12},week:{dow:0,// Sunday is the first day of the week.
+doy:6}}),
+//! moment.js locale configuration
+//! locale : Telugu [te]
+//! author : Krishna Chaitanya Thota : https://github.com/kcthota
+a.defineLocale("te",{months:"జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జూలై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్".split("_"),monthsShort:"జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జూలై_ఆగ._సెప్._అక్టో._నవ._డిసె.".split("_"),monthsParseExact:!0,weekdays:"ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం".split("_"),weekdaysShort:"ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని".split("_"),weekdaysMin:"ఆ_సో_మం_బు_గు_శు_శ".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[నేడు] LT",nextDay:"[రేపు] LT",nextWeek:"dddd, LT",lastDay:"[నిన్న] LT",lastWeek:"[గత] dddd, LT",sameElse:"L"},relativeTime:{future:"%s లో",past:"%s క్రితం",s:"కొన్ని క్షణాలు",m:"ఒక నిమిషం",mm:"%d నిమిషాలు",h:"ఒక గంట",hh:"%d గంటలు",d:"ఒక రోజు",dd:"%d రోజులు",M:"ఒక నెల",MM:"%d నెలలు",y:"ఒక సంవత్సరం",yy:"%d సంవత్సరాలు"},ordinalParse:/\d{1,2}వ/,ordinal:"%dవ",meridiemParse:/రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,meridiemHour:function(a,b){return 12===a&&(a=0),"రాత్రి"===b?a<4?a:a+12:"ఉదయం"===b?a:"మధ్యాహ్నం"===b?a>=10?a:a+12:"సాయంత్రం"===b?a+12:void 0},meridiem:function(a,b,c){return a<4?"రాత్రి":a<10?"ఉదయం":a<17?"మధ్యాహ్నం":a<20?"సాయంత్రం":"రాత్రి"},week:{dow:0,// Sunday is the first day of the week.
+doy:6}}),
+//! moment.js locale configuration
+//! locale : Tetun Dili (East Timor) [tet]
+//! author : Joshua Brooks : https://github.com/joshbrooks
+//! author : Onorio De J. Afonso : https://github.com/marobo
+a.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Juniu_Juliu_Augustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Aug_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sexta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sext_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Sex_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"minutu balun",m:"minutu ida",mm:"minutus %d",h:"horas ida",hh:"horas %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Thai [th]
+//! author : Kridsada Thanabulpong : https://github.com/sirn
+a.defineLocale("th",{months:"มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),monthsShort:"ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.".split("_"),monthsParseExact:!0,weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"),// yes, three characters difference
+weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา H:mm",LLLL:"วันddddที่ D MMMM YYYY เวลา H:mm"},meridiemParse:/ก่อนเที่ยง|หลังเที่ยง/,isPM:function(a){return"หลังเที่ยง"===a},meridiem:function(a,b,c){return a<12?"ก่อนเที่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่แล้ว เวลา] LT",sameElse:"L"},relativeTime:{future:"อีก %s",past:"%sที่แล้ว",s:"ไม่กี่วินาที",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}}),
+//! moment.js locale configuration
+//! locale : Tagalog (Philippines) [tl-ph]
+//! author : Dan Hagman : https://github.com/hagmandan
+a.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Klingon [tlh]
+//! author : Dominika Kruk : https://github.com/amaranthrose
+var pb="pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");a.defineLocale("tlh",{months:"tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’".split("_"),monthsShort:"jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa’leS] LT",nextWeek:"LLL",lastDay:"[wa’Hu’] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:S,past:T,s:"puS lup",m:"wa’ tup",mm:U,h:"wa’ rep",hh:U,d:"wa’ jaj",dd:U,M:"wa’ jar",MM:U,y:"wa’ DIS",yy:U},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Turkish [tr]
+//! authors : Erhan Gundogan : https://github.com/erhangundogan,
+//! Burak Yiğit Kaya: https://github.com/BYK
+var qb={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};
+//! moment.js locale configuration
+//! locale : Talossan [tzl]
+//! author : Robin van der Vliet : https://github.com/robin0van0der0v
+//! author : Iustì Canun
+// After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals.
+// This is currently too difficult (maybe even impossible) to add.
+//! moment.js locale configuration
+//! locale : Central Atlas Tamazight Latin [tzm-latn]
+//! author : Abdel Said : https://github.com/abdelsaid
+//! moment.js locale configuration
+//! locale : Central Atlas Tamazight [tzm]
+//! author : Abdel Said : https://github.com/abdelsaid
+//! moment.js locale configuration
+//! locale : Uzbek [uz]
+//! author : Sardor Muminov : https://github.com/muminoff
+//! moment.js locale configuration
+//! locale : Vietnamese [vi]
+//! author : Bang Nguyen : https://github.com/bangnk
+//! moment.js locale configuration
+//! locale : Pseudo [x-pseudo]
+//! author : Andrew Hood : https://github.com/andrewhood125
+//! moment.js locale configuration
+//! locale : Yoruba Nigeria [yo]
+//! author : Atolagbe Abisoye : https://github.com/andela-batolagbe
+//! moment.js locale configuration
+//! locale : Chinese (China) [zh-cn]
+//! author : suupic : https://github.com/suupic
+//! author : Zeno Zeng : https://github.com/zenozeng
+//! moment.js locale configuration
+//! locale : Chinese (Hong Kong) [zh-hk]
+//! author : Ben : https://github.com/ben-lin
+//! author : Chris Lam : https://github.com/hehachris
+//! author : Konstantin : https://github.com/skfd
+//! moment.js locale configuration
+//! locale : Chinese (Taiwan) [zh-tw]
+//! author : Ben : https://github.com/ben-lin
+//! author : Chris Lam : https://github.com/hehachris
+return a.defineLocale("tr",{months:"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinalParse:/\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,ordinal:function(a){if(0===a)// special case for zero
+return a+"'ıncı";var b=a%10,c=a%100-b,d=a>=100?100:null;return a+(qb[b]||qb[c]||qb[d])},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),a.defineLocale("tzl",{months:"Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi".split("_"),weekdaysShort:"Súl_Lún_Mai_Már_Xhú_Vié_Sát".split("_"),weekdaysMin:"Sú_Lú_Ma_Má_Xh_Vi_Sá".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(a){return"d'o"===a.toLowerCase()},meridiem:function(a,b,c){return a>11?c?"d'o":"D'O":c?"d'a":"D'A"},calendar:{sameDay:"[oxhi à] LT",nextDay:"[demà à] LT",nextWeek:"dddd [à] LT",lastDay:"[ieiri à] LT",lastWeek:"[sür el] dddd [lasteu à] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:W,m:W,mm:W,h:W,hh:W,d:W,dd:W,M:W,MM:W,y:W,yy:W},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("tzm-latn",{months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",m:"minuḍ",mm:"%d minuḍ",h:"saɛa",hh:"%d tassaɛin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,// Saturday is the first day of the week.
+doy:12}}),a.defineLocale("tzm",{months:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),monthsShort:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),weekdays:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[ⴰⵙⴷⵅ ⴴ] LT",nextDay:"[ⴰⵙⴽⴰ ⴴ] LT",nextWeek:"dddd [ⴴ] LT",lastDay:"[ⴰⵚⴰⵏⵜ ⴴ] LT",lastWeek:"dddd [ⴴ] LT",sameElse:"L"},relativeTime:{future:"ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s",past:"ⵢⴰⵏ %s",s:"ⵉⵎⵉⴽ",m:"ⵎⵉⵏⵓⴺ",mm:"%d ⵎⵉⵏⵓⴺ",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉⵏ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰⵏ",M:"ⴰⵢoⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔⵏ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙⵏ"},week:{dow:6,// Saturday is the first day of the week.
+doy:12}}),a.defineLocale("uk",{months:{format:"січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня".split("_"),standalone:"січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень".split("_")},monthsShort:"січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),weekdays:Z,weekdaysShort:"нд_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY р.",LLL:"D MMMM YYYY р., HH:mm",LLLL:"dddd, D MMMM YYYY р., HH:mm"},calendar:{sameDay:$("[Сьогодні "),nextDay:$("[Завтра "),lastDay:$("[Вчора "),nextWeek:$("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return $("[Минулої] dddd [").call(this);case 1:case 2:case 4:return $("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька секунд",m:Y,mm:Y,h:"годину",hh:Y,d:"день",dd:Y,M:"місяць",MM:Y,y:"рік",yy:Y},
+// M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
+meridiemParse:/ночі|ранку|дня|вечора/,isPM:function(a){return/^(дня|вечора)$/.test(a)},meridiem:function(a,b,c){return a<4?"ночі":a<12?"ранку":a<17?"дня":"вечора"},ordinalParse:/\d{1,2}-(й|го)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a+"-й";case"D":return a+"-го";default:return a}},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),a.defineLocale("uz",{months:"январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр".split("_"),monthsShort:"янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Бугун соат] LT [да]",nextDay:"[Эртага] LT [да]",nextWeek:"dddd [куни соат] LT [да]",lastDay:"[Кеча соат] LT [да]",lastWeek:"[Утган] dddd [куни соат] LT [да]",sameElse:"L"},relativeTime:{future:"Якин %s ичида",past:"Бир неча %s олдин",s:"фурсат",m:"бир дакика",mm:"%d дакика",h:"бир соат",hh:"%d соат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),a.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),monthsParseExact:!0,weekdays:"chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(a){return/^ch$/i.test(a)},meridiem:function(a,b,c){return a<12?c?"sa":"SA":c?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY HH:mm",LLLL:"dddd, D MMMM [năm] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tới lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tới",past:"%s trước",s:"vài giây",m:"một phút",mm:"%d phút",h:"một giờ",hh:"%d giờ",d:"một ngày",dd:"%d ngày",M:"một tháng",MM:"%d tháng",y:"một năm",yy:"%d năm"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("x-pseudo",{months:"J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér".split("_"),monthsShort:"J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc".split("_"),monthsParseExact:!0,weekdays:"S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý".split("_"),weekdaysShort:"S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát".split("_"),weekdaysMin:"S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[T~ódá~ý át] LT",nextDay:"[T~ómó~rró~w át] LT",nextWeek:"dddd [át] LT",lastDay:"[Ý~ést~érdá~ý át] LT",lastWeek:"[L~ást] dddd [át] LT",sameElse:"L"},relativeTime:{future:"í~ñ %s",past:"%s á~gó",s:"á ~féw ~sécó~ñds",m:"á ~míñ~úté",mm:"%d m~íñú~tés",h:"á~ñ hó~úr",hh:"%d h~óúrs",d:"á ~dáý",dd:"%d d~áýs",M:"á ~móñ~th",MM:"%d m~óñt~hs",y:"á ~ýéár",yy:"%d ý~éárs"},ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("yo",{months:"Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀".split("_"),monthsShort:"Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀".split("_"),weekdays:"Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta".split("_"),weekdaysShort:"Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá".split("_"),weekdaysMin:"Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Ònì ni] LT",nextDay:"[Ọ̀la ni] LT",nextWeek:"dddd [Ọsẹ̀ tón'bọ] [ni] LT",lastDay:"[Àna ni] LT",lastWeek:"dddd [Ọsẹ̀ tólọ́] [ni] LT",sameElse:"L"},relativeTime:{future:"ní %s",past:"%s kọjá",s:"ìsẹjú aayá die",m:"ìsẹjú kan",mm:"ìsẹjú %d",h:"wákati kan",hh:"wákati %d",d:"ọjọ́ kan",dd:"ọjọ́ %d",M:"osù kan",MM:"osù %d",y:"ọdún kan",yy:"ọdún %d"},ordinalParse:/ọjọ́\s\d{1,2}/,ordinal:"ọjọ́ %d",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"Ah点mm分",LTS:"Ah点m分s秒",L:"YYYY-MM-DD",LL:"YYYY年MMMD日",LLL:"YYYY年MMMD日Ah点mm分",LLLL:"YYYY年MMMD日ddddAh点mm分",l:"YYYY-MM-DD",ll:"YYYY年MMMD日",lll:"YYYY年MMMD日Ah点mm分",llll:"YYYY年MMMD日ddddAh点mm分"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(a,b){return 12===a&&(a=0),"凌晨"===b||"早上"===b||"上午"===b?a:"下午"===b||"晚上"===b?a+12:a>=11?a:a+12},meridiem:function(a,b,c){var d=100*a+b;return d<600?"凌晨":d<900?"早上":d<1130?"上午":d<1230?"中午":d<1800?"下午":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var b,c;return b=a().startOf("week"),c=this.diff(b,"days")>=7?"[下]":"[本]",0===this.minutes()?c+"dddAh点整":c+"dddAh点mm"},lastWeek:function(){var b,c;return b=a().startOf("week"),c=this.unix()<b.unix()?"[上]":"[本]",0===this.minutes()?c+"dddAh点整":c+"dddAh点mm"},sameElse:"LL"},ordinalParse:/\d{1,2}(日|月|周)/,ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"日";case"M":return a+"月";case"w":case"W":return a+"周";default:return a}},relativeTime:{future:"%s内",past:"%s前",s:"几秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},week:{
+// GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
+dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("zh-hk",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"Ah點mm分",LTS:"Ah點m分s秒",L:"YYYY年MMMD日",LL:"YYYY年MMMD日",LLL:"YYYY年MMMD日Ah點mm分",LLLL:"YYYY年MMMD日ddddAh點mm分",l:"YYYY年MMMD日",ll:"YYYY年MMMD日",lll:"YYYY年MMMD日Ah點mm分",llll:"YYYY年MMMD日ddddAh點mm分"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(a,b){return 12===a&&(a=0),"凌晨"===b||"早上"===b||"上午"===b?a:"中午"===b?a>=11?a:a+12:"下午"===b||"晚上"===b?a+12:void 0},meridiem:function(a,b,c){var d=100*a+b;return d<600?"凌晨":d<900?"早上":d<1130?"上午":d<1230?"中午":d<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinalParse:/\d{1,2}(日|月|週)/,ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"日";case"M":return a+"月";case"w":case"W":return a+"週";default:return a}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}}),a.defineLocale("zh-tw",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"Ah點mm分",LTS:"Ah點m分s秒",L:"YYYY年MMMD日",LL:"YYYY年MMMD日",LLL:"YYYY年MMMD日Ah點mm分",LLLL:"YYYY年MMMD日ddddAh點mm分",l:"YYYY年MMMD日",ll:"YYYY年MMMD日",lll:"YYYY年MMMD日Ah點mm分",llll:"YYYY年MMMD日ddddAh點mm分"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(a,b){return 12===a&&(a=0),"凌晨"===b||"早上"===b||"上午"===b?a:"中午"===b?a>=11?a:a+12:"下午"===b||"晚上"===b?a+12:void 0},meridiem:function(a,b,c){var d=100*a+b;return d<600?"凌晨":d<900?"早上":d<1130?"上午":d<1230?"中午":d<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinalParse:/\d{1,2}(日|月|週)/,ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"日";case"M":return a+"月";case"w":case"W":return a+"週";default:return a}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}}),a.locale("en"),a}); \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/moment-with-locales.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/moment-with-locales.js
new file mode 100644
index 00000000000..b5b0668736a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/moment-with-locales.js
@@ -0,0 +1,12910 @@
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ global.moment = factory()
+}(this, (function () { 'use strict';
+
+var hookCallback;
+
+function hooks () {
+ return hookCallback.apply(null, arguments);
+}
+
+// This is done to register the method called with moment()
+// without creating circular dependencies.
+function setHookCallback (callback) {
+ hookCallback = callback;
+}
+
+function isArray(input) {
+ return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';
+}
+
+function isObject(input) {
+ // IE8 will treat undefined and null as object if it wasn't for
+ // input != null
+ return input != null && Object.prototype.toString.call(input) === '[object Object]';
+}
+
+function isObjectEmpty(obj) {
+ var k;
+ for (k in obj) {
+ // even if its not own property I'd still call it non-empty
+ return false;
+ }
+ return true;
+}
+
+function isNumber(input) {
+ return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';
+}
+
+function isDate(input) {
+ return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';
+}
+
+function map(arr, fn) {
+ var res = [], i;
+ for (i = 0; i < arr.length; ++i) {
+ res.push(fn(arr[i], i));
+ }
+ return res;
+}
+
+function hasOwnProp(a, b) {
+ return Object.prototype.hasOwnProperty.call(a, b);
+}
+
+function extend(a, b) {
+ for (var i in b) {
+ if (hasOwnProp(b, i)) {
+ a[i] = b[i];
+ }
+ }
+
+ if (hasOwnProp(b, 'toString')) {
+ a.toString = b.toString;
+ }
+
+ if (hasOwnProp(b, 'valueOf')) {
+ a.valueOf = b.valueOf;
+ }
+
+ return a;
+}
+
+function createUTC (input, format, locale, strict) {
+ return createLocalOrUTC(input, format, locale, strict, true).utc();
+}
+
+function defaultParsingFlags() {
+ // We need to deep clone this object.
+ return {
+ empty : false,
+ unusedTokens : [],
+ unusedInput : [],
+ overflow : -2,
+ charsLeftOver : 0,
+ nullInput : false,
+ invalidMonth : null,
+ invalidFormat : false,
+ userInvalidated : false,
+ iso : false,
+ parsedDateParts : [],
+ meridiem : null
+ };
+}
+
+function getParsingFlags(m) {
+ if (m._pf == null) {
+ m._pf = defaultParsingFlags();
+ }
+ return m._pf;
+}
+
+var some;
+if (Array.prototype.some) {
+ some = Array.prototype.some;
+} else {
+ some = function (fun) {
+ var t = Object(this);
+ var len = t.length >>> 0;
+
+ for (var i = 0; i < len; i++) {
+ if (i in t && fun.call(this, t[i], i, t)) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+}
+
+var some$1 = some;
+
+function isValid(m) {
+ if (m._isValid == null) {
+ var flags = getParsingFlags(m);
+ var parsedParts = some$1.call(flags.parsedDateParts, function (i) {
+ return i != null;
+ });
+ var isNowValid = !isNaN(m._d.getTime()) &&
+ flags.overflow < 0 &&
+ !flags.empty &&
+ !flags.invalidMonth &&
+ !flags.invalidWeekday &&
+ !flags.nullInput &&
+ !flags.invalidFormat &&
+ !flags.userInvalidated &&
+ (!flags.meridiem || (flags.meridiem && parsedParts));
+
+ if (m._strict) {
+ isNowValid = isNowValid &&
+ flags.charsLeftOver === 0 &&
+ flags.unusedTokens.length === 0 &&
+ flags.bigHour === undefined;
+ }
+
+ if (Object.isFrozen == null || !Object.isFrozen(m)) {
+ m._isValid = isNowValid;
+ }
+ else {
+ return isNowValid;
+ }
+ }
+ return m._isValid;
+}
+
+function createInvalid (flags) {
+ var m = createUTC(NaN);
+ if (flags != null) {
+ extend(getParsingFlags(m), flags);
+ }
+ else {
+ getParsingFlags(m).userInvalidated = true;
+ }
+
+ return m;
+}
+
+function isUndefined(input) {
+ return input === void 0;
+}
+
+// Plugins that add properties should also add the key here (null value),
+// so we can properly clone ourselves.
+var momentProperties = hooks.momentProperties = [];
+
+function copyConfig(to, from) {
+ var i, prop, val;
+
+ if (!isUndefined(from._isAMomentObject)) {
+ to._isAMomentObject = from._isAMomentObject;
+ }
+ if (!isUndefined(from._i)) {
+ to._i = from._i;
+ }
+ if (!isUndefined(from._f)) {
+ to._f = from._f;
+ }
+ if (!isUndefined(from._l)) {
+ to._l = from._l;
+ }
+ if (!isUndefined(from._strict)) {
+ to._strict = from._strict;
+ }
+ if (!isUndefined(from._tzm)) {
+ to._tzm = from._tzm;
+ }
+ if (!isUndefined(from._isUTC)) {
+ to._isUTC = from._isUTC;
+ }
+ if (!isUndefined(from._offset)) {
+ to._offset = from._offset;
+ }
+ if (!isUndefined(from._pf)) {
+ to._pf = getParsingFlags(from);
+ }
+ if (!isUndefined(from._locale)) {
+ to._locale = from._locale;
+ }
+
+ if (momentProperties.length > 0) {
+ for (i in momentProperties) {
+ prop = momentProperties[i];
+ val = from[prop];
+ if (!isUndefined(val)) {
+ to[prop] = val;
+ }
+ }
+ }
+
+ return to;
+}
+
+var updateInProgress = false;
+
+// Moment prototype object
+function Moment(config) {
+ copyConfig(this, config);
+ this._d = new Date(config._d != null ? config._d.getTime() : NaN);
+ if (!this.isValid()) {
+ this._d = new Date(NaN);
+ }
+ // Prevent infinite loop in case updateOffset creates new moment
+ // objects.
+ if (updateInProgress === false) {
+ updateInProgress = true;
+ hooks.updateOffset(this);
+ updateInProgress = false;
+ }
+}
+
+function isMoment (obj) {
+ return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);
+}
+
+function absFloor (number) {
+ if (number < 0) {
+ // -0 -> 0
+ return Math.ceil(number) || 0;
+ } else {
+ return Math.floor(number);
+ }
+}
+
+function toInt(argumentForCoercion) {
+ var coercedNumber = +argumentForCoercion,
+ value = 0;
+
+ if (coercedNumber !== 0 && isFinite(coercedNumber)) {
+ value = absFloor(coercedNumber);
+ }
+
+ return value;
+}
+
+// compare two arrays, return the number of differences
+function compareArrays(array1, array2, dontConvert) {
+ var len = Math.min(array1.length, array2.length),
+ lengthDiff = Math.abs(array1.length - array2.length),
+ diffs = 0,
+ i;
+ for (i = 0; i < len; i++) {
+ if ((dontConvert && array1[i] !== array2[i]) ||
+ (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
+ diffs++;
+ }
+ }
+ return diffs + lengthDiff;
+}
+
+function warn(msg) {
+ if (hooks.suppressDeprecationWarnings === false &&
+ (typeof console !== 'undefined') && console.warn) {
+ console.warn('Deprecation warning: ' + msg);
+ }
+}
+
+function deprecate(msg, fn) {
+ var firstTime = true;
+
+ return extend(function () {
+ if (hooks.deprecationHandler != null) {
+ hooks.deprecationHandler(null, msg);
+ }
+ if (firstTime) {
+ var args = [];
+ var arg;
+ for (var i = 0; i < arguments.length; i++) {
+ arg = '';
+ if (typeof arguments[i] === 'object') {
+ arg += '\n[' + i + '] ';
+ for (var key in arguments[0]) {
+ arg += key + ': ' + arguments[0][key] + ', ';
+ }
+ arg = arg.slice(0, -2); // Remove trailing comma and space
+ } else {
+ arg = arguments[i];
+ }
+ args.push(arg);
+ }
+ warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack);
+ firstTime = false;
+ }
+ return fn.apply(this, arguments);
+ }, fn);
+}
+
+var deprecations = {};
+
+function deprecateSimple(name, msg) {
+ if (hooks.deprecationHandler != null) {
+ hooks.deprecationHandler(name, msg);
+ }
+ if (!deprecations[name]) {
+ warn(msg);
+ deprecations[name] = true;
+ }
+}
+
+hooks.suppressDeprecationWarnings = false;
+hooks.deprecationHandler = null;
+
+function isFunction(input) {
+ return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';
+}
+
+function set (config) {
+ var prop, i;
+ for (i in config) {
+ prop = config[i];
+ if (isFunction(prop)) {
+ this[i] = prop;
+ } else {
+ this['_' + i] = prop;
+ }
+ }
+ this._config = config;
+ // Lenient ordinal parsing accepts just a number in addition to
+ // number + (possibly) stuff coming from _ordinalParseLenient.
+ this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\d{1,2}/).source);
+}
+
+function mergeConfigs(parentConfig, childConfig) {
+ var res = extend({}, parentConfig), prop;
+ for (prop in childConfig) {
+ if (hasOwnProp(childConfig, prop)) {
+ if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
+ res[prop] = {};
+ extend(res[prop], parentConfig[prop]);
+ extend(res[prop], childConfig[prop]);
+ } else if (childConfig[prop] != null) {
+ res[prop] = childConfig[prop];
+ } else {
+ delete res[prop];
+ }
+ }
+ }
+ for (prop in parentConfig) {
+ if (hasOwnProp(parentConfig, prop) &&
+ !hasOwnProp(childConfig, prop) &&
+ isObject(parentConfig[prop])) {
+ // make sure changes to properties don't modify parent config
+ res[prop] = extend({}, res[prop]);
+ }
+ }
+ return res;
+}
+
+function Locale(config) {
+ if (config != null) {
+ this.set(config);
+ }
+}
+
+var keys;
+
+if (Object.keys) {
+ keys = Object.keys;
+} else {
+ keys = function (obj) {
+ var i, res = [];
+ for (i in obj) {
+ if (hasOwnProp(obj, i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ };
+}
+
+var keys$1 = keys;
+
+var defaultCalendar = {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+};
+
+function calendar (key, mom, now) {
+ var output = this._calendar[key] || this._calendar['sameElse'];
+ return isFunction(output) ? output.call(mom, now) : output;
+}
+
+var defaultLongDateFormat = {
+ LTS : 'h:mm:ss A',
+ LT : 'h:mm A',
+ L : 'MM/DD/YYYY',
+ LL : 'MMMM D, YYYY',
+ LLL : 'MMMM D, YYYY h:mm A',
+ LLLL : 'dddd, MMMM D, YYYY h:mm A'
+};
+
+function longDateFormat (key) {
+ var format = this._longDateFormat[key],
+ formatUpper = this._longDateFormat[key.toUpperCase()];
+
+ if (format || !formatUpper) {
+ return format;
+ }
+
+ this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {
+ return val.slice(1);
+ });
+
+ return this._longDateFormat[key];
+}
+
+var defaultInvalidDate = 'Invalid date';
+
+function invalidDate () {
+ return this._invalidDate;
+}
+
+var defaultOrdinal = '%d';
+var defaultOrdinalParse = /\d{1,2}/;
+
+function ordinal (number) {
+ return this._ordinal.replace('%d', number);
+}
+
+var defaultRelativeTime = {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+};
+
+function relativeTime (number, withoutSuffix, string, isFuture) {
+ var output = this._relativeTime[string];
+ return (isFunction(output)) ?
+ output(number, withoutSuffix, string, isFuture) :
+ output.replace(/%d/i, number);
+}
+
+function pastFuture (diff, output) {
+ var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
+ return isFunction(format) ? format(output) : format.replace(/%s/i, output);
+}
+
+var aliases = {};
+
+function addUnitAlias (unit, shorthand) {
+ var lowerCase = unit.toLowerCase();
+ aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
+}
+
+function normalizeUnits(units) {
+ return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;
+}
+
+function normalizeObjectUnits(inputObject) {
+ var normalizedInput = {},
+ normalizedProp,
+ prop;
+
+ for (prop in inputObject) {
+ if (hasOwnProp(inputObject, prop)) {
+ normalizedProp = normalizeUnits(prop);
+ if (normalizedProp) {
+ normalizedInput[normalizedProp] = inputObject[prop];
+ }
+ }
+ }
+
+ return normalizedInput;
+}
+
+var priorities = {};
+
+function addUnitPriority(unit, priority) {
+ priorities[unit] = priority;
+}
+
+function getPrioritizedUnits(unitsObj) {
+ var units = [];
+ for (var u in unitsObj) {
+ units.push({unit: u, priority: priorities[u]});
+ }
+ units.sort(function (a, b) {
+ return a.priority - b.priority;
+ });
+ return units;
+}
+
+function makeGetSet (unit, keepTime) {
+ return function (value) {
+ if (value != null) {
+ set$1(this, unit, value);
+ hooks.updateOffset(this, keepTime);
+ return this;
+ } else {
+ return get(this, unit);
+ }
+ };
+}
+
+function get (mom, unit) {
+ return mom.isValid() ?
+ mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;
+}
+
+function set$1 (mom, unit, value) {
+ if (mom.isValid()) {
+ mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
+ }
+}
+
+// MOMENTS
+
+function stringGet (units) {
+ units = normalizeUnits(units);
+ if (isFunction(this[units])) {
+ return this[units]();
+ }
+ return this;
+}
+
+
+function stringSet (units, value) {
+ if (typeof units === 'object') {
+ units = normalizeObjectUnits(units);
+ var prioritized = getPrioritizedUnits(units);
+ for (var i = 0; i < prioritized.length; i++) {
+ this[prioritized[i].unit](units[prioritized[i].unit]);
+ }
+ } else {
+ units = normalizeUnits(units);
+ if (isFunction(this[units])) {
+ return this[units](value);
+ }
+ }
+ return this;
+}
+
+function zeroFill(number, targetLength, forceSign) {
+ var absNumber = '' + Math.abs(number),
+ zerosToFill = targetLength - absNumber.length,
+ sign = number >= 0;
+ return (sign ? (forceSign ? '+' : '') : '-') +
+ Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;
+}
+
+var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;
+
+var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;
+
+var formatFunctions = {};
+
+var formatTokenFunctions = {};
+
+// token: 'M'
+// padded: ['MM', 2]
+// ordinal: 'Mo'
+// callback: function () { this.month() + 1 }
+function addFormatToken (token, padded, ordinal, callback) {
+ var func = callback;
+ if (typeof callback === 'string') {
+ func = function () {
+ return this[callback]();
+ };
+ }
+ if (token) {
+ formatTokenFunctions[token] = func;
+ }
+ if (padded) {
+ formatTokenFunctions[padded[0]] = function () {
+ return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
+ };
+ }
+ if (ordinal) {
+ formatTokenFunctions[ordinal] = function () {
+ return this.localeData().ordinal(func.apply(this, arguments), token);
+ };
+ }
+}
+
+function removeFormattingTokens(input) {
+ if (input.match(/\[[\s\S]/)) {
+ return input.replace(/^\[|\]$/g, '');
+ }
+ return input.replace(/\\/g, '');
+}
+
+function makeFormatFunction(format) {
+ var array = format.match(formattingTokens), i, length;
+
+ for (i = 0, length = array.length; i < length; i++) {
+ if (formatTokenFunctions[array[i]]) {
+ array[i] = formatTokenFunctions[array[i]];
+ } else {
+ array[i] = removeFormattingTokens(array[i]);
+ }
+ }
+
+ return function (mom) {
+ var output = '', i;
+ for (i = 0; i < length; i++) {
+ output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];
+ }
+ return output;
+ };
+}
+
+// format date using native date object
+function formatMoment(m, format) {
+ if (!m.isValid()) {
+ return m.localeData().invalidDate();
+ }
+
+ format = expandFormat(format, m.localeData());
+ formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);
+
+ return formatFunctions[format](m);
+}
+
+function expandFormat(format, locale) {
+ var i = 5;
+
+ function replaceLongDateFormatTokens(input) {
+ return locale.longDateFormat(input) || input;
+ }
+
+ localFormattingTokens.lastIndex = 0;
+ while (i >= 0 && localFormattingTokens.test(format)) {
+ format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
+ localFormattingTokens.lastIndex = 0;
+ i -= 1;
+ }
+
+ return format;
+}
+
+var match1 = /\d/; // 0 - 9
+var match2 = /\d\d/; // 00 - 99
+var match3 = /\d{3}/; // 000 - 999
+var match4 = /\d{4}/; // 0000 - 9999
+var match6 = /[+-]?\d{6}/; // -999999 - 999999
+var match1to2 = /\d\d?/; // 0 - 99
+var match3to4 = /\d\d\d\d?/; // 999 - 9999
+var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999
+var match1to3 = /\d{1,3}/; // 0 - 999
+var match1to4 = /\d{1,4}/; // 0 - 9999
+var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999
+
+var matchUnsigned = /\d+/; // 0 - inf
+var matchSigned = /[+-]?\d+/; // -inf - inf
+
+var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z
+var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z
+
+var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123
+
+// any word (or two) characters or numbers including two/three word month in arabic.
+// includes scottish gaelic two word and hyphenated months
+var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i;
+
+
+var regexes = {};
+
+function addRegexToken (token, regex, strictRegex) {
+ regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {
+ return (isStrict && strictRegex) ? strictRegex : regex;
+ };
+}
+
+function getParseRegexForToken (token, config) {
+ if (!hasOwnProp(regexes, token)) {
+ return new RegExp(unescapeFormat(token));
+ }
+
+ return regexes[token](config._strict, config._locale);
+}
+
+// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
+function unescapeFormat(s) {
+ return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
+ return p1 || p2 || p3 || p4;
+ }));
+}
+
+function regexEscape(s) {
+ return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
+}
+
+var tokens = {};
+
+function addParseToken (token, callback) {
+ var i, func = callback;
+ if (typeof token === 'string') {
+ token = [token];
+ }
+ if (isNumber(callback)) {
+ func = function (input, array) {
+ array[callback] = toInt(input);
+ };
+ }
+ for (i = 0; i < token.length; i++) {
+ tokens[token[i]] = func;
+ }
+}
+
+function addWeekParseToken (token, callback) {
+ addParseToken(token, function (input, array, config, token) {
+ config._w = config._w || {};
+ callback(input, config._w, config, token);
+ });
+}
+
+function addTimeToArrayFromToken(token, input, config) {
+ if (input != null && hasOwnProp(tokens, token)) {
+ tokens[token](input, config._a, config, token);
+ }
+}
+
+var YEAR = 0;
+var MONTH = 1;
+var DATE = 2;
+var HOUR = 3;
+var MINUTE = 4;
+var SECOND = 5;
+var MILLISECOND = 6;
+var WEEK = 7;
+var WEEKDAY = 8;
+
+var indexOf;
+
+if (Array.prototype.indexOf) {
+ indexOf = Array.prototype.indexOf;
+} else {
+ indexOf = function (o) {
+ // I know
+ var i;
+ for (i = 0; i < this.length; ++i) {
+ if (this[i] === o) {
+ return i;
+ }
+ }
+ return -1;
+ };
+}
+
+var indexOf$1 = indexOf;
+
+function daysInMonth(year, month) {
+ return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
+}
+
+// FORMATTING
+
+addFormatToken('M', ['MM', 2], 'Mo', function () {
+ return this.month() + 1;
+});
+
+addFormatToken('MMM', 0, 0, function (format) {
+ return this.localeData().monthsShort(this, format);
+});
+
+addFormatToken('MMMM', 0, 0, function (format) {
+ return this.localeData().months(this, format);
+});
+
+// ALIASES
+
+addUnitAlias('month', 'M');
+
+// PRIORITY
+
+addUnitPriority('month', 8);
+
+// PARSING
+
+addRegexToken('M', match1to2);
+addRegexToken('MM', match1to2, match2);
+addRegexToken('MMM', function (isStrict, locale) {
+ return locale.monthsShortRegex(isStrict);
+});
+addRegexToken('MMMM', function (isStrict, locale) {
+ return locale.monthsRegex(isStrict);
+});
+
+addParseToken(['M', 'MM'], function (input, array) {
+ array[MONTH] = toInt(input) - 1;
+});
+
+addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
+ var month = config._locale.monthsParse(input, token, config._strict);
+ // if we didn't find a month name, mark the date as invalid.
+ if (month != null) {
+ array[MONTH] = month;
+ } else {
+ getParsingFlags(config).invalidMonth = input;
+ }
+});
+
+// LOCALES
+
+var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/;
+var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');
+function localeMonths (m, format) {
+ if (!m) {
+ return this._months;
+ }
+ return isArray(this._months) ? this._months[m.month()] :
+ this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];
+}
+
+var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
+function localeMonthsShort (m, format) {
+ if (!m) {
+ return this._monthsShort;
+ }
+ return isArray(this._monthsShort) ? this._monthsShort[m.month()] :
+ this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];
+}
+
+function handleStrictParse(monthName, format, strict) {
+ var i, ii, mom, llc = monthName.toLocaleLowerCase();
+ if (!this._monthsParse) {
+ // this is not used
+ this._monthsParse = [];
+ this._longMonthsParse = [];
+ this._shortMonthsParse = [];
+ for (i = 0; i < 12; ++i) {
+ mom = createUTC([2000, i]);
+ this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();
+ this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
+ }
+ }
+
+ if (strict) {
+ if (format === 'MMM') {
+ ii = indexOf$1.call(this._shortMonthsParse, llc);
+ return ii !== -1 ? ii : null;
+ } else {
+ ii = indexOf$1.call(this._longMonthsParse, llc);
+ return ii !== -1 ? ii : null;
+ }
+ } else {
+ if (format === 'MMM') {
+ ii = indexOf$1.call(this._shortMonthsParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf$1.call(this._longMonthsParse, llc);
+ return ii !== -1 ? ii : null;
+ } else {
+ ii = indexOf$1.call(this._longMonthsParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf$1.call(this._shortMonthsParse, llc);
+ return ii !== -1 ? ii : null;
+ }
+ }
+}
+
+function localeMonthsParse (monthName, format, strict) {
+ var i, mom, regex;
+
+ if (this._monthsParseExact) {
+ return handleStrictParse.call(this, monthName, format, strict);
+ }
+
+ if (!this._monthsParse) {
+ this._monthsParse = [];
+ this._longMonthsParse = [];
+ this._shortMonthsParse = [];
+ }
+
+ // TODO: add sorting
+ // Sorting makes sure if one month (or abbr) is a prefix of another
+ // see sorting in computeMonthsParse
+ for (i = 0; i < 12; i++) {
+ // make the regex if we don't have it already
+ mom = createUTC([2000, i]);
+ if (strict && !this._longMonthsParse[i]) {
+ this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');
+ this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');
+ }
+ if (!strict && !this._monthsParse[i]) {
+ regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
+ this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
+ }
+ // test the regex
+ if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {
+ return i;
+ } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {
+ return i;
+ } else if (!strict && this._monthsParse[i].test(monthName)) {
+ return i;
+ }
+ }
+}
+
+// MOMENTS
+
+function setMonth (mom, value) {
+ var dayOfMonth;
+
+ if (!mom.isValid()) {
+ // No op
+ return mom;
+ }
+
+ if (typeof value === 'string') {
+ if (/^\d+$/.test(value)) {
+ value = toInt(value);
+ } else {
+ value = mom.localeData().monthsParse(value);
+ // TODO: Another silent failure?
+ if (!isNumber(value)) {
+ return mom;
+ }
+ }
+ }
+
+ dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
+ mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
+ return mom;
+}
+
+function getSetMonth (value) {
+ if (value != null) {
+ setMonth(this, value);
+ hooks.updateOffset(this, true);
+ return this;
+ } else {
+ return get(this, 'Month');
+ }
+}
+
+function getDaysInMonth () {
+ return daysInMonth(this.year(), this.month());
+}
+
+var defaultMonthsShortRegex = matchWord;
+function monthsShortRegex (isStrict) {
+ if (this._monthsParseExact) {
+ if (!hasOwnProp(this, '_monthsRegex')) {
+ computeMonthsParse.call(this);
+ }
+ if (isStrict) {
+ return this._monthsShortStrictRegex;
+ } else {
+ return this._monthsShortRegex;
+ }
+ } else {
+ if (!hasOwnProp(this, '_monthsShortRegex')) {
+ this._monthsShortRegex = defaultMonthsShortRegex;
+ }
+ return this._monthsShortStrictRegex && isStrict ?
+ this._monthsShortStrictRegex : this._monthsShortRegex;
+ }
+}
+
+var defaultMonthsRegex = matchWord;
+function monthsRegex (isStrict) {
+ if (this._monthsParseExact) {
+ if (!hasOwnProp(this, '_monthsRegex')) {
+ computeMonthsParse.call(this);
+ }
+ if (isStrict) {
+ return this._monthsStrictRegex;
+ } else {
+ return this._monthsRegex;
+ }
+ } else {
+ if (!hasOwnProp(this, '_monthsRegex')) {
+ this._monthsRegex = defaultMonthsRegex;
+ }
+ return this._monthsStrictRegex && isStrict ?
+ this._monthsStrictRegex : this._monthsRegex;
+ }
+}
+
+function computeMonthsParse () {
+ function cmpLenRev(a, b) {
+ return b.length - a.length;
+ }
+
+ var shortPieces = [], longPieces = [], mixedPieces = [],
+ i, mom;
+ for (i = 0; i < 12; i++) {
+ // make the regex if we don't have it already
+ mom = createUTC([2000, i]);
+ shortPieces.push(this.monthsShort(mom, ''));
+ longPieces.push(this.months(mom, ''));
+ mixedPieces.push(this.months(mom, ''));
+ mixedPieces.push(this.monthsShort(mom, ''));
+ }
+ // Sorting makes sure if one month (or abbr) is a prefix of another it
+ // will match the longer piece.
+ shortPieces.sort(cmpLenRev);
+ longPieces.sort(cmpLenRev);
+ mixedPieces.sort(cmpLenRev);
+ for (i = 0; i < 12; i++) {
+ shortPieces[i] = regexEscape(shortPieces[i]);
+ longPieces[i] = regexEscape(longPieces[i]);
+ }
+ for (i = 0; i < 24; i++) {
+ mixedPieces[i] = regexEscape(mixedPieces[i]);
+ }
+
+ this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
+ this._monthsShortRegex = this._monthsRegex;
+ this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
+ this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
+}
+
+// FORMATTING
+
+addFormatToken('Y', 0, 0, function () {
+ var y = this.year();
+ return y <= 9999 ? '' + y : '+' + y;
+});
+
+addFormatToken(0, ['YY', 2], 0, function () {
+ return this.year() % 100;
+});
+
+addFormatToken(0, ['YYYY', 4], 0, 'year');
+addFormatToken(0, ['YYYYY', 5], 0, 'year');
+addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
+
+// ALIASES
+
+addUnitAlias('year', 'y');
+
+// PRIORITIES
+
+addUnitPriority('year', 1);
+
+// PARSING
+
+addRegexToken('Y', matchSigned);
+addRegexToken('YY', match1to2, match2);
+addRegexToken('YYYY', match1to4, match4);
+addRegexToken('YYYYY', match1to6, match6);
+addRegexToken('YYYYYY', match1to6, match6);
+
+addParseToken(['YYYYY', 'YYYYYY'], YEAR);
+addParseToken('YYYY', function (input, array) {
+ array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
+});
+addParseToken('YY', function (input, array) {
+ array[YEAR] = hooks.parseTwoDigitYear(input);
+});
+addParseToken('Y', function (input, array) {
+ array[YEAR] = parseInt(input, 10);
+});
+
+// HELPERS
+
+function daysInYear(year) {
+ return isLeapYear(year) ? 366 : 365;
+}
+
+function isLeapYear(year) {
+ return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
+}
+
+// HOOKS
+
+hooks.parseTwoDigitYear = function (input) {
+ return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
+};
+
+// MOMENTS
+
+var getSetYear = makeGetSet('FullYear', true);
+
+function getIsLeapYear () {
+ return isLeapYear(this.year());
+}
+
+function createDate (y, m, d, h, M, s, ms) {
+ //can't just apply() to create a date:
+ //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
+ var date = new Date(y, m, d, h, M, s, ms);
+
+ //the date constructor remaps years 0-99 to 1900-1999
+ if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {
+ date.setFullYear(y);
+ }
+ return date;
+}
+
+function createUTCDate (y) {
+ var date = new Date(Date.UTC.apply(null, arguments));
+
+ //the Date.UTC function remaps years 0-99 to 1900-1999
+ if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {
+ date.setUTCFullYear(y);
+ }
+ return date;
+}
+
+// start-of-first-week - start-of-year
+function firstWeekOffset(year, dow, doy) {
+ var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
+ fwd = 7 + dow - doy,
+ // first-week day local weekday -- which local weekday is fwd
+ fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
+
+ return -fwdlw + fwd - 1;
+}
+
+//http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
+function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
+ var localWeekday = (7 + weekday - dow) % 7,
+ weekOffset = firstWeekOffset(year, dow, doy),
+ dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
+ resYear, resDayOfYear;
+
+ if (dayOfYear <= 0) {
+ resYear = year - 1;
+ resDayOfYear = daysInYear(resYear) + dayOfYear;
+ } else if (dayOfYear > daysInYear(year)) {
+ resYear = year + 1;
+ resDayOfYear = dayOfYear - daysInYear(year);
+ } else {
+ resYear = year;
+ resDayOfYear = dayOfYear;
+ }
+
+ return {
+ year: resYear,
+ dayOfYear: resDayOfYear
+ };
+}
+
+function weekOfYear(mom, dow, doy) {
+ var weekOffset = firstWeekOffset(mom.year(), dow, doy),
+ week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
+ resWeek, resYear;
+
+ if (week < 1) {
+ resYear = mom.year() - 1;
+ resWeek = week + weeksInYear(resYear, dow, doy);
+ } else if (week > weeksInYear(mom.year(), dow, doy)) {
+ resWeek = week - weeksInYear(mom.year(), dow, doy);
+ resYear = mom.year() + 1;
+ } else {
+ resYear = mom.year();
+ resWeek = week;
+ }
+
+ return {
+ week: resWeek,
+ year: resYear
+ };
+}
+
+function weeksInYear(year, dow, doy) {
+ var weekOffset = firstWeekOffset(year, dow, doy),
+ weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
+ return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
+}
+
+// FORMATTING
+
+addFormatToken('w', ['ww', 2], 'wo', 'week');
+addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
+
+// ALIASES
+
+addUnitAlias('week', 'w');
+addUnitAlias('isoWeek', 'W');
+
+// PRIORITIES
+
+addUnitPriority('week', 5);
+addUnitPriority('isoWeek', 5);
+
+// PARSING
+
+addRegexToken('w', match1to2);
+addRegexToken('ww', match1to2, match2);
+addRegexToken('W', match1to2);
+addRegexToken('WW', match1to2, match2);
+
+addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {
+ week[token.substr(0, 1)] = toInt(input);
+});
+
+// HELPERS
+
+// LOCALES
+
+function localeWeek (mom) {
+ return weekOfYear(mom, this._week.dow, this._week.doy).week;
+}
+
+var defaultLocaleWeek = {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+};
+
+function localeFirstDayOfWeek () {
+ return this._week.dow;
+}
+
+function localeFirstDayOfYear () {
+ return this._week.doy;
+}
+
+// MOMENTS
+
+function getSetWeek (input) {
+ var week = this.localeData().week(this);
+ return input == null ? week : this.add((input - week) * 7, 'd');
+}
+
+function getSetISOWeek (input) {
+ var week = weekOfYear(this, 1, 4).week;
+ return input == null ? week : this.add((input - week) * 7, 'd');
+}
+
+// FORMATTING
+
+addFormatToken('d', 0, 'do', 'day');
+
+addFormatToken('dd', 0, 0, function (format) {
+ return this.localeData().weekdaysMin(this, format);
+});
+
+addFormatToken('ddd', 0, 0, function (format) {
+ return this.localeData().weekdaysShort(this, format);
+});
+
+addFormatToken('dddd', 0, 0, function (format) {
+ return this.localeData().weekdays(this, format);
+});
+
+addFormatToken('e', 0, 0, 'weekday');
+addFormatToken('E', 0, 0, 'isoWeekday');
+
+// ALIASES
+
+addUnitAlias('day', 'd');
+addUnitAlias('weekday', 'e');
+addUnitAlias('isoWeekday', 'E');
+
+// PRIORITY
+addUnitPriority('day', 11);
+addUnitPriority('weekday', 11);
+addUnitPriority('isoWeekday', 11);
+
+// PARSING
+
+addRegexToken('d', match1to2);
+addRegexToken('e', match1to2);
+addRegexToken('E', match1to2);
+addRegexToken('dd', function (isStrict, locale) {
+ return locale.weekdaysMinRegex(isStrict);
+});
+addRegexToken('ddd', function (isStrict, locale) {
+ return locale.weekdaysShortRegex(isStrict);
+});
+addRegexToken('dddd', function (isStrict, locale) {
+ return locale.weekdaysRegex(isStrict);
+});
+
+addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
+ var weekday = config._locale.weekdaysParse(input, token, config._strict);
+ // if we didn't get a weekday name, mark the date as invalid
+ if (weekday != null) {
+ week.d = weekday;
+ } else {
+ getParsingFlags(config).invalidWeekday = input;
+ }
+});
+
+addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
+ week[token] = toInt(input);
+});
+
+// HELPERS
+
+function parseWeekday(input, locale) {
+ if (typeof input !== 'string') {
+ return input;
+ }
+
+ if (!isNaN(input)) {
+ return parseInt(input, 10);
+ }
+
+ input = locale.weekdaysParse(input);
+ if (typeof input === 'number') {
+ return input;
+ }
+
+ return null;
+}
+
+function parseIsoWeekday(input, locale) {
+ if (typeof input === 'string') {
+ return locale.weekdaysParse(input) % 7 || 7;
+ }
+ return isNaN(input) ? null : input;
+}
+
+// LOCALES
+
+var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');
+function localeWeekdays (m, format) {
+ if (!m) {
+ return this._weekdays;
+ }
+ return isArray(this._weekdays) ? this._weekdays[m.day()] :
+ this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];
+}
+
+var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');
+function localeWeekdaysShort (m) {
+ return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;
+}
+
+var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');
+function localeWeekdaysMin (m) {
+ return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;
+}
+
+function handleStrictParse$1(weekdayName, format, strict) {
+ var i, ii, mom, llc = weekdayName.toLocaleLowerCase();
+ if (!this._weekdaysParse) {
+ this._weekdaysParse = [];
+ this._shortWeekdaysParse = [];
+ this._minWeekdaysParse = [];
+
+ for (i = 0; i < 7; ++i) {
+ mom = createUTC([2000, 1]).day(i);
+ this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();
+ this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();
+ this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
+ }
+ }
+
+ if (strict) {
+ if (format === 'dddd') {
+ ii = indexOf$1.call(this._weekdaysParse, llc);
+ return ii !== -1 ? ii : null;
+ } else if (format === 'ddd') {
+ ii = indexOf$1.call(this._shortWeekdaysParse, llc);
+ return ii !== -1 ? ii : null;
+ } else {
+ ii = indexOf$1.call(this._minWeekdaysParse, llc);
+ return ii !== -1 ? ii : null;
+ }
+ } else {
+ if (format === 'dddd') {
+ ii = indexOf$1.call(this._weekdaysParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf$1.call(this._shortWeekdaysParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf$1.call(this._minWeekdaysParse, llc);
+ return ii !== -1 ? ii : null;
+ } else if (format === 'ddd') {
+ ii = indexOf$1.call(this._shortWeekdaysParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf$1.call(this._weekdaysParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf$1.call(this._minWeekdaysParse, llc);
+ return ii !== -1 ? ii : null;
+ } else {
+ ii = indexOf$1.call(this._minWeekdaysParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf$1.call(this._weekdaysParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf$1.call(this._shortWeekdaysParse, llc);
+ return ii !== -1 ? ii : null;
+ }
+ }
+}
+
+function localeWeekdaysParse (weekdayName, format, strict) {
+ var i, mom, regex;
+
+ if (this._weekdaysParseExact) {
+ return handleStrictParse$1.call(this, weekdayName, format, strict);
+ }
+
+ if (!this._weekdaysParse) {
+ this._weekdaysParse = [];
+ this._minWeekdaysParse = [];
+ this._shortWeekdaysParse = [];
+ this._fullWeekdaysParse = [];
+ }
+
+ for (i = 0; i < 7; i++) {
+ // make the regex if we don't have it already
+
+ mom = createUTC([2000, 1]).day(i);
+ if (strict && !this._fullWeekdaysParse[i]) {
+ this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i');
+ this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i');
+ this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i');
+ }
+ if (!this._weekdaysParse[i]) {
+ regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
+ this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
+ }
+ // test the regex
+ if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {
+ return i;
+ } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {
+ return i;
+ } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {
+ return i;
+ } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
+ return i;
+ }
+ }
+}
+
+// MOMENTS
+
+function getSetDayOfWeek (input) {
+ if (!this.isValid()) {
+ return input != null ? this : NaN;
+ }
+ var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
+ if (input != null) {
+ input = parseWeekday(input, this.localeData());
+ return this.add(input - day, 'd');
+ } else {
+ return day;
+ }
+}
+
+function getSetLocaleDayOfWeek (input) {
+ if (!this.isValid()) {
+ return input != null ? this : NaN;
+ }
+ var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
+ return input == null ? weekday : this.add(input - weekday, 'd');
+}
+
+function getSetISODayOfWeek (input) {
+ if (!this.isValid()) {
+ return input != null ? this : NaN;
+ }
+
+ // behaves the same as moment#day except
+ // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
+ // as a setter, sunday should belong to the previous week.
+
+ if (input != null) {
+ var weekday = parseIsoWeekday(input, this.localeData());
+ return this.day(this.day() % 7 ? weekday : weekday - 7);
+ } else {
+ return this.day() || 7;
+ }
+}
+
+var defaultWeekdaysRegex = matchWord;
+function weekdaysRegex (isStrict) {
+ if (this._weekdaysParseExact) {
+ if (!hasOwnProp(this, '_weekdaysRegex')) {
+ computeWeekdaysParse.call(this);
+ }
+ if (isStrict) {
+ return this._weekdaysStrictRegex;
+ } else {
+ return this._weekdaysRegex;
+ }
+ } else {
+ if (!hasOwnProp(this, '_weekdaysRegex')) {
+ this._weekdaysRegex = defaultWeekdaysRegex;
+ }
+ return this._weekdaysStrictRegex && isStrict ?
+ this._weekdaysStrictRegex : this._weekdaysRegex;
+ }
+}
+
+var defaultWeekdaysShortRegex = matchWord;
+function weekdaysShortRegex (isStrict) {
+ if (this._weekdaysParseExact) {
+ if (!hasOwnProp(this, '_weekdaysRegex')) {
+ computeWeekdaysParse.call(this);
+ }
+ if (isStrict) {
+ return this._weekdaysShortStrictRegex;
+ } else {
+ return this._weekdaysShortRegex;
+ }
+ } else {
+ if (!hasOwnProp(this, '_weekdaysShortRegex')) {
+ this._weekdaysShortRegex = defaultWeekdaysShortRegex;
+ }
+ return this._weekdaysShortStrictRegex && isStrict ?
+ this._weekdaysShortStrictRegex : this._weekdaysShortRegex;
+ }
+}
+
+var defaultWeekdaysMinRegex = matchWord;
+function weekdaysMinRegex (isStrict) {
+ if (this._weekdaysParseExact) {
+ if (!hasOwnProp(this, '_weekdaysRegex')) {
+ computeWeekdaysParse.call(this);
+ }
+ if (isStrict) {
+ return this._weekdaysMinStrictRegex;
+ } else {
+ return this._weekdaysMinRegex;
+ }
+ } else {
+ if (!hasOwnProp(this, '_weekdaysMinRegex')) {
+ this._weekdaysMinRegex = defaultWeekdaysMinRegex;
+ }
+ return this._weekdaysMinStrictRegex && isStrict ?
+ this._weekdaysMinStrictRegex : this._weekdaysMinRegex;
+ }
+}
+
+
+function computeWeekdaysParse () {
+ function cmpLenRev(a, b) {
+ return b.length - a.length;
+ }
+
+ var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],
+ i, mom, minp, shortp, longp;
+ for (i = 0; i < 7; i++) {
+ // make the regex if we don't have it already
+ mom = createUTC([2000, 1]).day(i);
+ minp = this.weekdaysMin(mom, '');
+ shortp = this.weekdaysShort(mom, '');
+ longp = this.weekdays(mom, '');
+ minPieces.push(minp);
+ shortPieces.push(shortp);
+ longPieces.push(longp);
+ mixedPieces.push(minp);
+ mixedPieces.push(shortp);
+ mixedPieces.push(longp);
+ }
+ // Sorting makes sure if one weekday (or abbr) is a prefix of another it
+ // will match the longer piece.
+ minPieces.sort(cmpLenRev);
+ shortPieces.sort(cmpLenRev);
+ longPieces.sort(cmpLenRev);
+ mixedPieces.sort(cmpLenRev);
+ for (i = 0; i < 7; i++) {
+ shortPieces[i] = regexEscape(shortPieces[i]);
+ longPieces[i] = regexEscape(longPieces[i]);
+ mixedPieces[i] = regexEscape(mixedPieces[i]);
+ }
+
+ this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
+ this._weekdaysShortRegex = this._weekdaysRegex;
+ this._weekdaysMinRegex = this._weekdaysRegex;
+
+ this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
+ this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
+ this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');
+}
+
+// FORMATTING
+
+function hFormat() {
+ return this.hours() % 12 || 12;
+}
+
+function kFormat() {
+ return this.hours() || 24;
+}
+
+addFormatToken('H', ['HH', 2], 0, 'hour');
+addFormatToken('h', ['hh', 2], 0, hFormat);
+addFormatToken('k', ['kk', 2], 0, kFormat);
+
+addFormatToken('hmm', 0, 0, function () {
+ return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
+});
+
+addFormatToken('hmmss', 0, 0, function () {
+ return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +
+ zeroFill(this.seconds(), 2);
+});
+
+addFormatToken('Hmm', 0, 0, function () {
+ return '' + this.hours() + zeroFill(this.minutes(), 2);
+});
+
+addFormatToken('Hmmss', 0, 0, function () {
+ return '' + this.hours() + zeroFill(this.minutes(), 2) +
+ zeroFill(this.seconds(), 2);
+});
+
+function meridiem (token, lowercase) {
+ addFormatToken(token, 0, 0, function () {
+ return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);
+ });
+}
+
+meridiem('a', true);
+meridiem('A', false);
+
+// ALIASES
+
+addUnitAlias('hour', 'h');
+
+// PRIORITY
+addUnitPriority('hour', 13);
+
+// PARSING
+
+function matchMeridiem (isStrict, locale) {
+ return locale._meridiemParse;
+}
+
+addRegexToken('a', matchMeridiem);
+addRegexToken('A', matchMeridiem);
+addRegexToken('H', match1to2);
+addRegexToken('h', match1to2);
+addRegexToken('HH', match1to2, match2);
+addRegexToken('hh', match1to2, match2);
+
+addRegexToken('hmm', match3to4);
+addRegexToken('hmmss', match5to6);
+addRegexToken('Hmm', match3to4);
+addRegexToken('Hmmss', match5to6);
+
+addParseToken(['H', 'HH'], HOUR);
+addParseToken(['a', 'A'], function (input, array, config) {
+ config._isPm = config._locale.isPM(input);
+ config._meridiem = input;
+});
+addParseToken(['h', 'hh'], function (input, array, config) {
+ array[HOUR] = toInt(input);
+ getParsingFlags(config).bigHour = true;
+});
+addParseToken('hmm', function (input, array, config) {
+ var pos = input.length - 2;
+ array[HOUR] = toInt(input.substr(0, pos));
+ array[MINUTE] = toInt(input.substr(pos));
+ getParsingFlags(config).bigHour = true;
+});
+addParseToken('hmmss', function (input, array, config) {
+ var pos1 = input.length - 4;
+ var pos2 = input.length - 2;
+ array[HOUR] = toInt(input.substr(0, pos1));
+ array[MINUTE] = toInt(input.substr(pos1, 2));
+ array[SECOND] = toInt(input.substr(pos2));
+ getParsingFlags(config).bigHour = true;
+});
+addParseToken('Hmm', function (input, array, config) {
+ var pos = input.length - 2;
+ array[HOUR] = toInt(input.substr(0, pos));
+ array[MINUTE] = toInt(input.substr(pos));
+});
+addParseToken('Hmmss', function (input, array, config) {
+ var pos1 = input.length - 4;
+ var pos2 = input.length - 2;
+ array[HOUR] = toInt(input.substr(0, pos1));
+ array[MINUTE] = toInt(input.substr(pos1, 2));
+ array[SECOND] = toInt(input.substr(pos2));
+});
+
+// LOCALES
+
+function localeIsPM (input) {
+ // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
+ // Using charAt should be more compatible.
+ return ((input + '').toLowerCase().charAt(0) === 'p');
+}
+
+var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i;
+function localeMeridiem (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'pm' : 'PM';
+ } else {
+ return isLower ? 'am' : 'AM';
+ }
+}
+
+
+// MOMENTS
+
+// Setting the hour should keep the time, because the user explicitly
+// specified which hour he wants. So trying to maintain the same hour (in
+// a new timezone) makes sense. Adding/subtracting hours does not follow
+// this rule.
+var getSetHour = makeGetSet('Hours', true);
+
+// months
+// week
+// weekdays
+// meridiem
+var baseConfig = {
+ calendar: defaultCalendar,
+ longDateFormat: defaultLongDateFormat,
+ invalidDate: defaultInvalidDate,
+ ordinal: defaultOrdinal,
+ ordinalParse: defaultOrdinalParse,
+ relativeTime: defaultRelativeTime,
+
+ months: defaultLocaleMonths,
+ monthsShort: defaultLocaleMonthsShort,
+
+ week: defaultLocaleWeek,
+
+ weekdays: defaultLocaleWeekdays,
+ weekdaysMin: defaultLocaleWeekdaysMin,
+ weekdaysShort: defaultLocaleWeekdaysShort,
+
+ meridiemParse: defaultLocaleMeridiemParse
+};
+
+// internal storage for locale config files
+var locales = {};
+var localeFamilies = {};
+var globalLocale;
+
+function normalizeLocale(key) {
+ return key ? key.toLowerCase().replace('_', '-') : key;
+}
+
+// pick the locale from the array
+// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
+// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
+function chooseLocale(names) {
+ var i = 0, j, next, locale, split;
+
+ while (i < names.length) {
+ split = normalizeLocale(names[i]).split('-');
+ j = split.length;
+ next = normalizeLocale(names[i + 1]);
+ next = next ? next.split('-') : null;
+ while (j > 0) {
+ locale = loadLocale(split.slice(0, j).join('-'));
+ if (locale) {
+ return locale;
+ }
+ if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
+ //the next array item is better than a shallower substring of this one
+ break;
+ }
+ j--;
+ }
+ i++;
+ }
+ return null;
+}
+
+function loadLocale(name) {
+ var oldLocale = null;
+ // TODO: Find a better way to register and load all the locales in Node
+ if (!locales[name] && (typeof module !== 'undefined') &&
+ module && module.exports) {
+ try {
+ oldLocale = globalLocale._abbr;
+ require('./locale/' + name);
+ // because defineLocale currently also sets the global locale, we
+ // want to undo that for lazy loaded locales
+ getSetGlobalLocale(oldLocale);
+ } catch (e) { }
+ }
+ return locales[name];
+}
+
+// This function will load locale and then set the global locale. If
+// no arguments are passed in, it will simply return the current global
+// locale key.
+function getSetGlobalLocale (key, values) {
+ var data;
+ if (key) {
+ if (isUndefined(values)) {
+ data = getLocale(key);
+ }
+ else {
+ data = defineLocale(key, values);
+ }
+
+ if (data) {
+ // moment.duration._locale = moment._locale = data;
+ globalLocale = data;
+ }
+ }
+
+ return globalLocale._abbr;
+}
+
+function defineLocale (name, config) {
+ if (config !== null) {
+ var parentConfig = baseConfig;
+ config.abbr = name;
+ if (locales[name] != null) {
+ deprecateSimple('defineLocaleOverride',
+ 'use moment.updateLocale(localeName, config) to change ' +
+ 'an existing locale. moment.defineLocale(localeName, ' +
+ 'config) should only be used for creating a new locale ' +
+ 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');
+ parentConfig = locales[name]._config;
+ } else if (config.parentLocale != null) {
+ if (locales[config.parentLocale] != null) {
+ parentConfig = locales[config.parentLocale]._config;
+ } else {
+ if (!localeFamilies[config.parentLocale]) {
+ localeFamilies[config.parentLocale] = [];
+ }
+ localeFamilies[config.parentLocale].push({
+ name: name,
+ config: config
+ });
+ return null;
+ }
+ }
+ locales[name] = new Locale(mergeConfigs(parentConfig, config));
+
+ if (localeFamilies[name]) {
+ localeFamilies[name].forEach(function (x) {
+ defineLocale(x.name, x.config);
+ });
+ }
+
+ // backwards compat for now: also set the locale
+ // make sure we set the locale AFTER all child locales have been
+ // created, so we won't end up with the child locale set.
+ getSetGlobalLocale(name);
+
+
+ return locales[name];
+ } else {
+ // useful for testing
+ delete locales[name];
+ return null;
+ }
+}
+
+function updateLocale(name, config) {
+ if (config != null) {
+ var locale, parentConfig = baseConfig;
+ // MERGE
+ if (locales[name] != null) {
+ parentConfig = locales[name]._config;
+ }
+ config = mergeConfigs(parentConfig, config);
+ locale = new Locale(config);
+ locale.parentLocale = locales[name];
+ locales[name] = locale;
+
+ // backwards compat for now: also set the locale
+ getSetGlobalLocale(name);
+ } else {
+ // pass null for config to unupdate, useful for tests
+ if (locales[name] != null) {
+ if (locales[name].parentLocale != null) {
+ locales[name] = locales[name].parentLocale;
+ } else if (locales[name] != null) {
+ delete locales[name];
+ }
+ }
+ }
+ return locales[name];
+}
+
+// returns locale data
+function getLocale (key) {
+ var locale;
+
+ if (key && key._locale && key._locale._abbr) {
+ key = key._locale._abbr;
+ }
+
+ if (!key) {
+ return globalLocale;
+ }
+
+ if (!isArray(key)) {
+ //short-circuit everything else
+ locale = loadLocale(key);
+ if (locale) {
+ return locale;
+ }
+ key = [key];
+ }
+
+ return chooseLocale(key);
+}
+
+function listLocales() {
+ return keys$1(locales);
+}
+
+function checkOverflow (m) {
+ var overflow;
+ var a = m._a;
+
+ if (a && getParsingFlags(m).overflow === -2) {
+ overflow =
+ a[MONTH] < 0 || a[MONTH] > 11 ? MONTH :
+ a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE :
+ a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :
+ a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :
+ a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :
+ a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :
+ -1;
+
+ if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
+ overflow = DATE;
+ }
+ if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
+ overflow = WEEK;
+ }
+ if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
+ overflow = WEEKDAY;
+ }
+
+ getParsingFlags(m).overflow = overflow;
+ }
+
+ return m;
+}
+
+// iso 8601 regex
+// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
+var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
+var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
+
+var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/;
+
+var isoDates = [
+ ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
+ ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
+ ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
+ ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
+ ['YYYY-DDD', /\d{4}-\d{3}/],
+ ['YYYY-MM', /\d{4}-\d\d/, false],
+ ['YYYYYYMMDD', /[+-]\d{10}/],
+ ['YYYYMMDD', /\d{8}/],
+ // YYYYMM is NOT allowed by the standard
+ ['GGGG[W]WWE', /\d{4}W\d{3}/],
+ ['GGGG[W]WW', /\d{4}W\d{2}/, false],
+ ['YYYYDDD', /\d{7}/]
+];
+
+// iso time formats and regexes
+var isoTimes = [
+ ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
+ ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
+ ['HH:mm:ss', /\d\d:\d\d:\d\d/],
+ ['HH:mm', /\d\d:\d\d/],
+ ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
+ ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
+ ['HHmmss', /\d\d\d\d\d\d/],
+ ['HHmm', /\d\d\d\d/],
+ ['HH', /\d\d/]
+];
+
+var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i;
+
+// date from iso format
+function configFromISO(config) {
+ var i, l,
+ string = config._i,
+ match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
+ allowTime, dateFormat, timeFormat, tzFormat;
+
+ if (match) {
+ getParsingFlags(config).iso = true;
+
+ for (i = 0, l = isoDates.length; i < l; i++) {
+ if (isoDates[i][1].exec(match[1])) {
+ dateFormat = isoDates[i][0];
+ allowTime = isoDates[i][2] !== false;
+ break;
+ }
+ }
+ if (dateFormat == null) {
+ config._isValid = false;
+ return;
+ }
+ if (match[3]) {
+ for (i = 0, l = isoTimes.length; i < l; i++) {
+ if (isoTimes[i][1].exec(match[3])) {
+ // match[2] should be 'T' or space
+ timeFormat = (match[2] || ' ') + isoTimes[i][0];
+ break;
+ }
+ }
+ if (timeFormat == null) {
+ config._isValid = false;
+ return;
+ }
+ }
+ if (!allowTime && timeFormat != null) {
+ config._isValid = false;
+ return;
+ }
+ if (match[4]) {
+ if (tzRegex.exec(match[4])) {
+ tzFormat = 'Z';
+ } else {
+ config._isValid = false;
+ return;
+ }
+ }
+ config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
+ configFromStringAndFormat(config);
+ } else {
+ config._isValid = false;
+ }
+}
+
+// date from iso format or fallback
+function configFromString(config) {
+ var matched = aspNetJsonRegex.exec(config._i);
+
+ if (matched !== null) {
+ config._d = new Date(+matched[1]);
+ return;
+ }
+
+ configFromISO(config);
+ if (config._isValid === false) {
+ delete config._isValid;
+ hooks.createFromInputFallback(config);
+ }
+}
+
+hooks.createFromInputFallback = deprecate(
+ 'value provided is not in a recognized ISO format. moment construction falls back to js Date(), ' +
+ 'which is not reliable across all browsers and versions. Non ISO date formats are ' +
+ 'discouraged and will be removed in an upcoming major release. Please refer to ' +
+ 'http://momentjs.com/guides/#/warnings/js-date/ for more info.',
+ function (config) {
+ config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
+ }
+);
+
+// Pick the first defined of two or three arguments.
+function defaults(a, b, c) {
+ if (a != null) {
+ return a;
+ }
+ if (b != null) {
+ return b;
+ }
+ return c;
+}
+
+function currentDateArray(config) {
+ // hooks is actually the exported moment object
+ var nowValue = new Date(hooks.now());
+ if (config._useUTC) {
+ return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];
+ }
+ return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
+}
+
+// convert an array to a date.
+// the array should mirror the parameters below
+// note: all values past the year are optional and will default to the lowest possible value.
+// [year, month, day , hour, minute, second, millisecond]
+function configFromArray (config) {
+ var i, date, input = [], currentDate, yearToUse;
+
+ if (config._d) {
+ return;
+ }
+
+ currentDate = currentDateArray(config);
+
+ //compute day of the year from weeks and weekdays
+ if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
+ dayOfYearFromWeekInfo(config);
+ }
+
+ //if the day of the year is set, figure out what it is
+ if (config._dayOfYear) {
+ yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);
+
+ if (config._dayOfYear > daysInYear(yearToUse)) {
+ getParsingFlags(config)._overflowDayOfYear = true;
+ }
+
+ date = createUTCDate(yearToUse, 0, config._dayOfYear);
+ config._a[MONTH] = date.getUTCMonth();
+ config._a[DATE] = date.getUTCDate();
+ }
+
+ // Default to current date.
+ // * if no year, month, day of month are given, default to today
+ // * if day of month is given, default month and year
+ // * if month is given, default only year
+ // * if year is given, don't default anything
+ for (i = 0; i < 3 && config._a[i] == null; ++i) {
+ config._a[i] = input[i] = currentDate[i];
+ }
+
+ // Zero out whatever was not defaulted, including time
+ for (; i < 7; i++) {
+ config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
+ }
+
+ // Check for 24:00:00.000
+ if (config._a[HOUR] === 24 &&
+ config._a[MINUTE] === 0 &&
+ config._a[SECOND] === 0 &&
+ config._a[MILLISECOND] === 0) {
+ config._nextDay = true;
+ config._a[HOUR] = 0;
+ }
+
+ config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
+ // Apply timezone offset from input. The actual utcOffset can be changed
+ // with parseZone.
+ if (config._tzm != null) {
+ config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
+ }
+
+ if (config._nextDay) {
+ config._a[HOUR] = 24;
+ }
+}
+
+function dayOfYearFromWeekInfo(config) {
+ var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;
+
+ w = config._w;
+ if (w.GG != null || w.W != null || w.E != null) {
+ dow = 1;
+ doy = 4;
+
+ // TODO: We need to take the current isoWeekYear, but that depends on
+ // how we interpret now (local, utc, fixed offset). So create
+ // a now version of current config (take local/utc/offset flags, and
+ // create now).
+ weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);
+ week = defaults(w.W, 1);
+ weekday = defaults(w.E, 1);
+ if (weekday < 1 || weekday > 7) {
+ weekdayOverflow = true;
+ }
+ } else {
+ dow = config._locale._week.dow;
+ doy = config._locale._week.doy;
+
+ var curWeek = weekOfYear(createLocal(), dow, doy);
+
+ weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);
+
+ // Default to current week.
+ week = defaults(w.w, curWeek.week);
+
+ if (w.d != null) {
+ // weekday -- low day numbers are considered next week
+ weekday = w.d;
+ if (weekday < 0 || weekday > 6) {
+ weekdayOverflow = true;
+ }
+ } else if (w.e != null) {
+ // local weekday -- counting starts from begining of week
+ weekday = w.e + dow;
+ if (w.e < 0 || w.e > 6) {
+ weekdayOverflow = true;
+ }
+ } else {
+ // default to begining of week
+ weekday = dow;
+ }
+ }
+ if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
+ getParsingFlags(config)._overflowWeeks = true;
+ } else if (weekdayOverflow != null) {
+ getParsingFlags(config)._overflowWeekday = true;
+ } else {
+ temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
+ config._a[YEAR] = temp.year;
+ config._dayOfYear = temp.dayOfYear;
+ }
+}
+
+// constant that refers to the ISO standard
+hooks.ISO_8601 = function () {};
+
+// date from string and format string
+function configFromStringAndFormat(config) {
+ // TODO: Move this to another part of the creation flow to prevent circular deps
+ if (config._f === hooks.ISO_8601) {
+ configFromISO(config);
+ return;
+ }
+
+ config._a = [];
+ getParsingFlags(config).empty = true;
+
+ // This array is used to make a Date, either with `new Date` or `Date.UTC`
+ var string = '' + config._i,
+ i, parsedInput, tokens, token, skipped,
+ stringLength = string.length,
+ totalParsedInputLength = 0;
+
+ tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];
+
+ for (i = 0; i < tokens.length; i++) {
+ token = tokens[i];
+ parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
+ // console.log('token', token, 'parsedInput', parsedInput,
+ // 'regex', getParseRegexForToken(token, config));
+ if (parsedInput) {
+ skipped = string.substr(0, string.indexOf(parsedInput));
+ if (skipped.length > 0) {
+ getParsingFlags(config).unusedInput.push(skipped);
+ }
+ string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
+ totalParsedInputLength += parsedInput.length;
+ }
+ // don't parse if it's not a known token
+ if (formatTokenFunctions[token]) {
+ if (parsedInput) {
+ getParsingFlags(config).empty = false;
+ }
+ else {
+ getParsingFlags(config).unusedTokens.push(token);
+ }
+ addTimeToArrayFromToken(token, parsedInput, config);
+ }
+ else if (config._strict && !parsedInput) {
+ getParsingFlags(config).unusedTokens.push(token);
+ }
+ }
+
+ // add remaining unparsed input length to the string
+ getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;
+ if (string.length > 0) {
+ getParsingFlags(config).unusedInput.push(string);
+ }
+
+ // clear _12h flag if hour is <= 12
+ if (config._a[HOUR] <= 12 &&
+ getParsingFlags(config).bigHour === true &&
+ config._a[HOUR] > 0) {
+ getParsingFlags(config).bigHour = undefined;
+ }
+
+ getParsingFlags(config).parsedDateParts = config._a.slice(0);
+ getParsingFlags(config).meridiem = config._meridiem;
+ // handle meridiem
+ config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);
+
+ configFromArray(config);
+ checkOverflow(config);
+}
+
+
+function meridiemFixWrap (locale, hour, meridiem) {
+ var isPm;
+
+ if (meridiem == null) {
+ // nothing to do
+ return hour;
+ }
+ if (locale.meridiemHour != null) {
+ return locale.meridiemHour(hour, meridiem);
+ } else if (locale.isPM != null) {
+ // Fallback
+ isPm = locale.isPM(meridiem);
+ if (isPm && hour < 12) {
+ hour += 12;
+ }
+ if (!isPm && hour === 12) {
+ hour = 0;
+ }
+ return hour;
+ } else {
+ // this is not supposed to happen
+ return hour;
+ }
+}
+
+// date from string and array of format strings
+function configFromStringAndArray(config) {
+ var tempConfig,
+ bestMoment,
+
+ scoreToBeat,
+ i,
+ currentScore;
+
+ if (config._f.length === 0) {
+ getParsingFlags(config).invalidFormat = true;
+ config._d = new Date(NaN);
+ return;
+ }
+
+ for (i = 0; i < config._f.length; i++) {
+ currentScore = 0;
+ tempConfig = copyConfig({}, config);
+ if (config._useUTC != null) {
+ tempConfig._useUTC = config._useUTC;
+ }
+ tempConfig._f = config._f[i];
+ configFromStringAndFormat(tempConfig);
+
+ if (!isValid(tempConfig)) {
+ continue;
+ }
+
+ // if there is any input that was not parsed add a penalty for that format
+ currentScore += getParsingFlags(tempConfig).charsLeftOver;
+
+ //or tokens
+ currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
+
+ getParsingFlags(tempConfig).score = currentScore;
+
+ if (scoreToBeat == null || currentScore < scoreToBeat) {
+ scoreToBeat = currentScore;
+ bestMoment = tempConfig;
+ }
+ }
+
+ extend(config, bestMoment || tempConfig);
+}
+
+function configFromObject(config) {
+ if (config._d) {
+ return;
+ }
+
+ var i = normalizeObjectUnits(config._i);
+ config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {
+ return obj && parseInt(obj, 10);
+ });
+
+ configFromArray(config);
+}
+
+function createFromConfig (config) {
+ var res = new Moment(checkOverflow(prepareConfig(config)));
+ if (res._nextDay) {
+ // Adding is smart enough around DST
+ res.add(1, 'd');
+ res._nextDay = undefined;
+ }
+
+ return res;
+}
+
+function prepareConfig (config) {
+ var input = config._i,
+ format = config._f;
+
+ config._locale = config._locale || getLocale(config._l);
+
+ if (input === null || (format === undefined && input === '')) {
+ return createInvalid({nullInput: true});
+ }
+
+ if (typeof input === 'string') {
+ config._i = input = config._locale.preparse(input);
+ }
+
+ if (isMoment(input)) {
+ return new Moment(checkOverflow(input));
+ } else if (isDate(input)) {
+ config._d = input;
+ } else if (isArray(format)) {
+ configFromStringAndArray(config);
+ } else if (format) {
+ configFromStringAndFormat(config);
+ } else {
+ configFromInput(config);
+ }
+
+ if (!isValid(config)) {
+ config._d = null;
+ }
+
+ return config;
+}
+
+function configFromInput(config) {
+ var input = config._i;
+ if (input === undefined) {
+ config._d = new Date(hooks.now());
+ } else if (isDate(input)) {
+ config._d = new Date(input.valueOf());
+ } else if (typeof input === 'string') {
+ configFromString(config);
+ } else if (isArray(input)) {
+ config._a = map(input.slice(0), function (obj) {
+ return parseInt(obj, 10);
+ });
+ configFromArray(config);
+ } else if (typeof(input) === 'object') {
+ configFromObject(config);
+ } else if (isNumber(input)) {
+ // from milliseconds
+ config._d = new Date(input);
+ } else {
+ hooks.createFromInputFallback(config);
+ }
+}
+
+function createLocalOrUTC (input, format, locale, strict, isUTC) {
+ var c = {};
+
+ if (locale === true || locale === false) {
+ strict = locale;
+ locale = undefined;
+ }
+
+ if ((isObject(input) && isObjectEmpty(input)) ||
+ (isArray(input) && input.length === 0)) {
+ input = undefined;
+ }
+ // object construction must be done this way.
+ // https://github.com/moment/moment/issues/1423
+ c._isAMomentObject = true;
+ c._useUTC = c._isUTC = isUTC;
+ c._l = locale;
+ c._i = input;
+ c._f = format;
+ c._strict = strict;
+
+ return createFromConfig(c);
+}
+
+function createLocal (input, format, locale, strict) {
+ return createLocalOrUTC(input, format, locale, strict, false);
+}
+
+var prototypeMin = deprecate(
+ 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
+ function () {
+ var other = createLocal.apply(null, arguments);
+ if (this.isValid() && other.isValid()) {
+ return other < this ? this : other;
+ } else {
+ return createInvalid();
+ }
+ }
+);
+
+var prototypeMax = deprecate(
+ 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
+ function () {
+ var other = createLocal.apply(null, arguments);
+ if (this.isValid() && other.isValid()) {
+ return other > this ? this : other;
+ } else {
+ return createInvalid();
+ }
+ }
+);
+
+// Pick a moment m from moments so that m[fn](other) is true for all
+// other. This relies on the function fn to be transitive.
+//
+// moments should either be an array of moment objects or an array, whose
+// first element is an array of moment objects.
+function pickBy(fn, moments) {
+ var res, i;
+ if (moments.length === 1 && isArray(moments[0])) {
+ moments = moments[0];
+ }
+ if (!moments.length) {
+ return createLocal();
+ }
+ res = moments[0];
+ for (i = 1; i < moments.length; ++i) {
+ if (!moments[i].isValid() || moments[i][fn](res)) {
+ res = moments[i];
+ }
+ }
+ return res;
+}
+
+// TODO: Use [].sort instead?
+function min () {
+ var args = [].slice.call(arguments, 0);
+
+ return pickBy('isBefore', args);
+}
+
+function max () {
+ var args = [].slice.call(arguments, 0);
+
+ return pickBy('isAfter', args);
+}
+
+var now = function () {
+ return Date.now ? Date.now() : +(new Date());
+};
+
+function Duration (duration) {
+ var normalizedInput = normalizeObjectUnits(duration),
+ years = normalizedInput.year || 0,
+ quarters = normalizedInput.quarter || 0,
+ months = normalizedInput.month || 0,
+ weeks = normalizedInput.week || 0,
+ days = normalizedInput.day || 0,
+ hours = normalizedInput.hour || 0,
+ minutes = normalizedInput.minute || 0,
+ seconds = normalizedInput.second || 0,
+ milliseconds = normalizedInput.millisecond || 0;
+
+ // representation for dateAddRemove
+ this._milliseconds = +milliseconds +
+ seconds * 1e3 + // 1000
+ minutes * 6e4 + // 1000 * 60
+ hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
+ // Because of dateAddRemove treats 24 hours as different from a
+ // day when working around DST, we need to store them separately
+ this._days = +days +
+ weeks * 7;
+ // It is impossible translate months into days without knowing
+ // which months you are are talking about, so we have to store
+ // it separately.
+ this._months = +months +
+ quarters * 3 +
+ years * 12;
+
+ this._data = {};
+
+ this._locale = getLocale();
+
+ this._bubble();
+}
+
+function isDuration (obj) {
+ return obj instanceof Duration;
+}
+
+function absRound (number) {
+ if (number < 0) {
+ return Math.round(-1 * number) * -1;
+ } else {
+ return Math.round(number);
+ }
+}
+
+// FORMATTING
+
+function offset (token, separator) {
+ addFormatToken(token, 0, 0, function () {
+ var offset = this.utcOffset();
+ var sign = '+';
+ if (offset < 0) {
+ offset = -offset;
+ sign = '-';
+ }
+ return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);
+ });
+}
+
+offset('Z', ':');
+offset('ZZ', '');
+
+// PARSING
+
+addRegexToken('Z', matchShortOffset);
+addRegexToken('ZZ', matchShortOffset);
+addParseToken(['Z', 'ZZ'], function (input, array, config) {
+ config._useUTC = true;
+ config._tzm = offsetFromString(matchShortOffset, input);
+});
+
+// HELPERS
+
+// timezone chunker
+// '+10:00' > ['10', '00']
+// '-1530' > ['-15', '30']
+var chunkOffset = /([\+\-]|\d\d)/gi;
+
+function offsetFromString(matcher, string) {
+ var matches = (string || '').match(matcher);
+
+ if (matches === null) {
+ return null;
+ }
+
+ var chunk = matches[matches.length - 1] || [];
+ var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];
+ var minutes = +(parts[1] * 60) + toInt(parts[2]);
+
+ return minutes === 0 ?
+ 0 :
+ parts[0] === '+' ? minutes : -minutes;
+}
+
+// Return a moment from input, that is local/utc/zone equivalent to model.
+function cloneWithOffset(input, model) {
+ var res, diff;
+ if (model._isUTC) {
+ res = model.clone();
+ diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();
+ // Use low-level api, because this fn is low-level api.
+ res._d.setTime(res._d.valueOf() + diff);
+ hooks.updateOffset(res, false);
+ return res;
+ } else {
+ return createLocal(input).local();
+ }
+}
+
+function getDateOffset (m) {
+ // On Firefox.24 Date#getTimezoneOffset returns a floating point.
+ // https://github.com/moment/moment/pull/1871
+ return -Math.round(m._d.getTimezoneOffset() / 15) * 15;
+}
+
+// HOOKS
+
+// This function will be called whenever a moment is mutated.
+// It is intended to keep the offset in sync with the timezone.
+hooks.updateOffset = function () {};
+
+// MOMENTS
+
+// keepLocalTime = true means only change the timezone, without
+// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
+// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
+// +0200, so we adjust the time as needed, to be valid.
+//
+// Keeping the time actually adds/subtracts (one hour)
+// from the actual represented time. That is why we call updateOffset
+// a second time. In case it wants us to change the offset again
+// _changeInProgress == true case, then we have to adjust, because
+// there is no such time in the given timezone.
+function getSetOffset (input, keepLocalTime) {
+ var offset = this._offset || 0,
+ localAdjust;
+ if (!this.isValid()) {
+ return input != null ? this : NaN;
+ }
+ if (input != null) {
+ if (typeof input === 'string') {
+ input = offsetFromString(matchShortOffset, input);
+ if (input === null) {
+ return this;
+ }
+ } else if (Math.abs(input) < 16) {
+ input = input * 60;
+ }
+ if (!this._isUTC && keepLocalTime) {
+ localAdjust = getDateOffset(this);
+ }
+ this._offset = input;
+ this._isUTC = true;
+ if (localAdjust != null) {
+ this.add(localAdjust, 'm');
+ }
+ if (offset !== input) {
+ if (!keepLocalTime || this._changeInProgress) {
+ addSubtract(this, createDuration(input - offset, 'm'), 1, false);
+ } else if (!this._changeInProgress) {
+ this._changeInProgress = true;
+ hooks.updateOffset(this, true);
+ this._changeInProgress = null;
+ }
+ }
+ return this;
+ } else {
+ return this._isUTC ? offset : getDateOffset(this);
+ }
+}
+
+function getSetZone (input, keepLocalTime) {
+ if (input != null) {
+ if (typeof input !== 'string') {
+ input = -input;
+ }
+
+ this.utcOffset(input, keepLocalTime);
+
+ return this;
+ } else {
+ return -this.utcOffset();
+ }
+}
+
+function setOffsetToUTC (keepLocalTime) {
+ return this.utcOffset(0, keepLocalTime);
+}
+
+function setOffsetToLocal (keepLocalTime) {
+ if (this._isUTC) {
+ this.utcOffset(0, keepLocalTime);
+ this._isUTC = false;
+
+ if (keepLocalTime) {
+ this.subtract(getDateOffset(this), 'm');
+ }
+ }
+ return this;
+}
+
+function setOffsetToParsedOffset () {
+ if (this._tzm != null) {
+ this.utcOffset(this._tzm);
+ } else if (typeof this._i === 'string') {
+ var tZone = offsetFromString(matchOffset, this._i);
+ if (tZone != null) {
+ this.utcOffset(tZone);
+ }
+ else {
+ this.utcOffset(0, true);
+ }
+ }
+ return this;
+}
+
+function hasAlignedHourOffset (input) {
+ if (!this.isValid()) {
+ return false;
+ }
+ input = input ? createLocal(input).utcOffset() : 0;
+
+ return (this.utcOffset() - input) % 60 === 0;
+}
+
+function isDaylightSavingTime () {
+ return (
+ this.utcOffset() > this.clone().month(0).utcOffset() ||
+ this.utcOffset() > this.clone().month(5).utcOffset()
+ );
+}
+
+function isDaylightSavingTimeShifted () {
+ if (!isUndefined(this._isDSTShifted)) {
+ return this._isDSTShifted;
+ }
+
+ var c = {};
+
+ copyConfig(c, this);
+ c = prepareConfig(c);
+
+ if (c._a) {
+ var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
+ this._isDSTShifted = this.isValid() &&
+ compareArrays(c._a, other.toArray()) > 0;
+ } else {
+ this._isDSTShifted = false;
+ }
+
+ return this._isDSTShifted;
+}
+
+function isLocal () {
+ return this.isValid() ? !this._isUTC : false;
+}
+
+function isUtcOffset () {
+ return this.isValid() ? this._isUTC : false;
+}
+
+function isUtc () {
+ return this.isValid() ? this._isUTC && this._offset === 0 : false;
+}
+
+// ASP.NET json date format regex
+var aspNetRegex = /^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/;
+
+// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
+// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
+// and further modified to allow for strings containing both week and day
+var isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;
+
+function createDuration (input, key) {
+ var duration = input,
+ // matching against regexp is expensive, do it on demand
+ match = null,
+ sign,
+ ret,
+ diffRes;
+
+ if (isDuration(input)) {
+ duration = {
+ ms : input._milliseconds,
+ d : input._days,
+ M : input._months
+ };
+ } else if (isNumber(input)) {
+ duration = {};
+ if (key) {
+ duration[key] = input;
+ } else {
+ duration.milliseconds = input;
+ }
+ } else if (!!(match = aspNetRegex.exec(input))) {
+ sign = (match[1] === '-') ? -1 : 1;
+ duration = {
+ y : 0,
+ d : toInt(match[DATE]) * sign,
+ h : toInt(match[HOUR]) * sign,
+ m : toInt(match[MINUTE]) * sign,
+ s : toInt(match[SECOND]) * sign,
+ ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match
+ };
+ } else if (!!(match = isoRegex.exec(input))) {
+ sign = (match[1] === '-') ? -1 : 1;
+ duration = {
+ y : parseIso(match[2], sign),
+ M : parseIso(match[3], sign),
+ w : parseIso(match[4], sign),
+ d : parseIso(match[5], sign),
+ h : parseIso(match[6], sign),
+ m : parseIso(match[7], sign),
+ s : parseIso(match[8], sign)
+ };
+ } else if (duration == null) {// checks for null or undefined
+ duration = {};
+ } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {
+ diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));
+
+ duration = {};
+ duration.ms = diffRes.milliseconds;
+ duration.M = diffRes.months;
+ }
+
+ ret = new Duration(duration);
+
+ if (isDuration(input) && hasOwnProp(input, '_locale')) {
+ ret._locale = input._locale;
+ }
+
+ return ret;
+}
+
+createDuration.fn = Duration.prototype;
+
+function parseIso (inp, sign) {
+ // We'd normally use ~~inp for this, but unfortunately it also
+ // converts floats to ints.
+ // inp may be undefined, so careful calling replace on it.
+ var res = inp && parseFloat(inp.replace(',', '.'));
+ // apply sign while we're at it
+ return (isNaN(res) ? 0 : res) * sign;
+}
+
+function positiveMomentsDifference(base, other) {
+ var res = {milliseconds: 0, months: 0};
+
+ res.months = other.month() - base.month() +
+ (other.year() - base.year()) * 12;
+ if (base.clone().add(res.months, 'M').isAfter(other)) {
+ --res.months;
+ }
+
+ res.milliseconds = +other - +(base.clone().add(res.months, 'M'));
+
+ return res;
+}
+
+function momentsDifference(base, other) {
+ var res;
+ if (!(base.isValid() && other.isValid())) {
+ return {milliseconds: 0, months: 0};
+ }
+
+ other = cloneWithOffset(other, base);
+ if (base.isBefore(other)) {
+ res = positiveMomentsDifference(base, other);
+ } else {
+ res = positiveMomentsDifference(other, base);
+ res.milliseconds = -res.milliseconds;
+ res.months = -res.months;
+ }
+
+ return res;
+}
+
+// TODO: remove 'name' arg after deprecation is removed
+function createAdder(direction, name) {
+ return function (val, period) {
+ var dur, tmp;
+ //invert the arguments, but complain about it
+ if (period !== null && !isNaN(+period)) {
+ deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +
+ 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');
+ tmp = val; val = period; period = tmp;
+ }
+
+ val = typeof val === 'string' ? +val : val;
+ dur = createDuration(val, period);
+ addSubtract(this, dur, direction);
+ return this;
+ };
+}
+
+function addSubtract (mom, duration, isAdding, updateOffset) {
+ var milliseconds = duration._milliseconds,
+ days = absRound(duration._days),
+ months = absRound(duration._months);
+
+ if (!mom.isValid()) {
+ // No op
+ return;
+ }
+
+ updateOffset = updateOffset == null ? true : updateOffset;
+
+ if (milliseconds) {
+ mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
+ }
+ if (days) {
+ set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);
+ }
+ if (months) {
+ setMonth(mom, get(mom, 'Month') + months * isAdding);
+ }
+ if (updateOffset) {
+ hooks.updateOffset(mom, days || months);
+ }
+}
+
+var add = createAdder(1, 'add');
+var subtract = createAdder(-1, 'subtract');
+
+function getCalendarFormat(myMoment, now) {
+ var diff = myMoment.diff(now, 'days', true);
+ return diff < -6 ? 'sameElse' :
+ diff < -1 ? 'lastWeek' :
+ diff < 0 ? 'lastDay' :
+ diff < 1 ? 'sameDay' :
+ diff < 2 ? 'nextDay' :
+ diff < 7 ? 'nextWeek' : 'sameElse';
+}
+
+function calendar$1 (time, formats) {
+ // We want to compare the start of today, vs this.
+ // Getting start-of-today depends on whether we're local/utc/offset or not.
+ var now = time || createLocal(),
+ sod = cloneWithOffset(now, this).startOf('day'),
+ format = hooks.calendarFormat(this, sod) || 'sameElse';
+
+ var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);
+
+ return this.format(output || this.localeData().calendar(format, this, createLocal(now)));
+}
+
+function clone () {
+ return new Moment(this);
+}
+
+function isAfter (input, units) {
+ var localInput = isMoment(input) ? input : createLocal(input);
+ if (!(this.isValid() && localInput.isValid())) {
+ return false;
+ }
+ units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
+ if (units === 'millisecond') {
+ return this.valueOf() > localInput.valueOf();
+ } else {
+ return localInput.valueOf() < this.clone().startOf(units).valueOf();
+ }
+}
+
+function isBefore (input, units) {
+ var localInput = isMoment(input) ? input : createLocal(input);
+ if (!(this.isValid() && localInput.isValid())) {
+ return false;
+ }
+ units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
+ if (units === 'millisecond') {
+ return this.valueOf() < localInput.valueOf();
+ } else {
+ return this.clone().endOf(units).valueOf() < localInput.valueOf();
+ }
+}
+
+function isBetween (from, to, units, inclusivity) {
+ inclusivity = inclusivity || '()';
+ return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&
+ (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));
+}
+
+function isSame (input, units) {
+ var localInput = isMoment(input) ? input : createLocal(input),
+ inputMs;
+ if (!(this.isValid() && localInput.isValid())) {
+ return false;
+ }
+ units = normalizeUnits(units || 'millisecond');
+ if (units === 'millisecond') {
+ return this.valueOf() === localInput.valueOf();
+ } else {
+ inputMs = localInput.valueOf();
+ return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();
+ }
+}
+
+function isSameOrAfter (input, units) {
+ return this.isSame(input, units) || this.isAfter(input,units);
+}
+
+function isSameOrBefore (input, units) {
+ return this.isSame(input, units) || this.isBefore(input,units);
+}
+
+function diff (input, units, asFloat) {
+ var that,
+ zoneDelta,
+ delta, output;
+
+ if (!this.isValid()) {
+ return NaN;
+ }
+
+ that = cloneWithOffset(input, this);
+
+ if (!that.isValid()) {
+ return NaN;
+ }
+
+ zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;
+
+ units = normalizeUnits(units);
+
+ if (units === 'year' || units === 'month' || units === 'quarter') {
+ output = monthDiff(this, that);
+ if (units === 'quarter') {
+ output = output / 3;
+ } else if (units === 'year') {
+ output = output / 12;
+ }
+ } else {
+ delta = this - that;
+ output = units === 'second' ? delta / 1e3 : // 1000
+ units === 'minute' ? delta / 6e4 : // 1000 * 60
+ units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60
+ units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
+ units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
+ delta;
+ }
+ return asFloat ? output : absFloor(output);
+}
+
+function monthDiff (a, b) {
+ // difference in months
+ var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),
+ // b is in (anchor - 1 month, anchor + 1 month)
+ anchor = a.clone().add(wholeMonthDiff, 'months'),
+ anchor2, adjust;
+
+ if (b - anchor < 0) {
+ anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
+ // linear across the month
+ adjust = (b - anchor) / (anchor - anchor2);
+ } else {
+ anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
+ // linear across the month
+ adjust = (b - anchor) / (anchor2 - anchor);
+ }
+
+ //check for negative zero, return zero if negative zero
+ return -(wholeMonthDiff + adjust) || 0;
+}
+
+hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
+hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';
+
+function toString () {
+ return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
+}
+
+function toISOString () {
+ var m = this.clone().utc();
+ if (0 < m.year() && m.year() <= 9999) {
+ if (isFunction(Date.prototype.toISOString)) {
+ // native implementation is ~50x faster, use it when we can
+ return this.toDate().toISOString();
+ } else {
+ return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
+ }
+ } else {
+ return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
+ }
+}
+
+/**
+ * Return a human readable representation of a moment that can
+ * also be evaluated to get a new moment which is the same
+ *
+ * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
+ */
+function inspect () {
+ if (!this.isValid()) {
+ return 'moment.invalid(/* ' + this._i + ' */)';
+ }
+ var func = 'moment';
+ var zone = '';
+ if (!this.isLocal()) {
+ func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
+ zone = 'Z';
+ }
+ var prefix = '[' + func + '("]';
+ var year = (0 < this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';
+ var datetime = '-MM-DD[T]HH:mm:ss.SSS';
+ var suffix = zone + '[")]';
+
+ return this.format(prefix + year + datetime + suffix);
+}
+
+function format (inputString) {
+ if (!inputString) {
+ inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;
+ }
+ var output = formatMoment(this, inputString);
+ return this.localeData().postformat(output);
+}
+
+function from (time, withoutSuffix) {
+ if (this.isValid() &&
+ ((isMoment(time) && time.isValid()) ||
+ createLocal(time).isValid())) {
+ return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
+ } else {
+ return this.localeData().invalidDate();
+ }
+}
+
+function fromNow (withoutSuffix) {
+ return this.from(createLocal(), withoutSuffix);
+}
+
+function to (time, withoutSuffix) {
+ if (this.isValid() &&
+ ((isMoment(time) && time.isValid()) ||
+ createLocal(time).isValid())) {
+ return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);
+ } else {
+ return this.localeData().invalidDate();
+ }
+}
+
+function toNow (withoutSuffix) {
+ return this.to(createLocal(), withoutSuffix);
+}
+
+// If passed a locale key, it will set the locale for this
+// instance. Otherwise, it will return the locale configuration
+// variables for this instance.
+function locale (key) {
+ var newLocaleData;
+
+ if (key === undefined) {
+ return this._locale._abbr;
+ } else {
+ newLocaleData = getLocale(key);
+ if (newLocaleData != null) {
+ this._locale = newLocaleData;
+ }
+ return this;
+ }
+}
+
+var lang = deprecate(
+ 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
+ function (key) {
+ if (key === undefined) {
+ return this.localeData();
+ } else {
+ return this.locale(key);
+ }
+ }
+);
+
+function localeData () {
+ return this._locale;
+}
+
+function startOf (units) {
+ units = normalizeUnits(units);
+ // the following switch intentionally omits break keywords
+ // to utilize falling through the cases.
+ switch (units) {
+ case 'year':
+ this.month(0);
+ /* falls through */
+ case 'quarter':
+ case 'month':
+ this.date(1);
+ /* falls through */
+ case 'week':
+ case 'isoWeek':
+ case 'day':
+ case 'date':
+ this.hours(0);
+ /* falls through */
+ case 'hour':
+ this.minutes(0);
+ /* falls through */
+ case 'minute':
+ this.seconds(0);
+ /* falls through */
+ case 'second':
+ this.milliseconds(0);
+ }
+
+ // weeks are a special case
+ if (units === 'week') {
+ this.weekday(0);
+ }
+ if (units === 'isoWeek') {
+ this.isoWeekday(1);
+ }
+
+ // quarters are also special
+ if (units === 'quarter') {
+ this.month(Math.floor(this.month() / 3) * 3);
+ }
+
+ return this;
+}
+
+function endOf (units) {
+ units = normalizeUnits(units);
+ if (units === undefined || units === 'millisecond') {
+ return this;
+ }
+
+ // 'date' is an alias for 'day', so it should be considered as such.
+ if (units === 'date') {
+ units = 'day';
+ }
+
+ return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');
+}
+
+function valueOf () {
+ return this._d.valueOf() - ((this._offset || 0) * 60000);
+}
+
+function unix () {
+ return Math.floor(this.valueOf() / 1000);
+}
+
+function toDate () {
+ return new Date(this.valueOf());
+}
+
+function toArray () {
+ var m = this;
+ return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];
+}
+
+function toObject () {
+ var m = this;
+ return {
+ years: m.year(),
+ months: m.month(),
+ date: m.date(),
+ hours: m.hours(),
+ minutes: m.minutes(),
+ seconds: m.seconds(),
+ milliseconds: m.milliseconds()
+ };
+}
+
+function toJSON () {
+ // new Date(NaN).toJSON() === null
+ return this.isValid() ? this.toISOString() : null;
+}
+
+function isValid$1 () {
+ return isValid(this);
+}
+
+function parsingFlags () {
+ return extend({}, getParsingFlags(this));
+}
+
+function invalidAt () {
+ return getParsingFlags(this).overflow;
+}
+
+function creationData() {
+ return {
+ input: this._i,
+ format: this._f,
+ locale: this._locale,
+ isUTC: this._isUTC,
+ strict: this._strict
+ };
+}
+
+// FORMATTING
+
+addFormatToken(0, ['gg', 2], 0, function () {
+ return this.weekYear() % 100;
+});
+
+addFormatToken(0, ['GG', 2], 0, function () {
+ return this.isoWeekYear() % 100;
+});
+
+function addWeekYearFormatToken (token, getter) {
+ addFormatToken(0, [token, token.length], 0, getter);
+}
+
+addWeekYearFormatToken('gggg', 'weekYear');
+addWeekYearFormatToken('ggggg', 'weekYear');
+addWeekYearFormatToken('GGGG', 'isoWeekYear');
+addWeekYearFormatToken('GGGGG', 'isoWeekYear');
+
+// ALIASES
+
+addUnitAlias('weekYear', 'gg');
+addUnitAlias('isoWeekYear', 'GG');
+
+// PRIORITY
+
+addUnitPriority('weekYear', 1);
+addUnitPriority('isoWeekYear', 1);
+
+
+// PARSING
+
+addRegexToken('G', matchSigned);
+addRegexToken('g', matchSigned);
+addRegexToken('GG', match1to2, match2);
+addRegexToken('gg', match1to2, match2);
+addRegexToken('GGGG', match1to4, match4);
+addRegexToken('gggg', match1to4, match4);
+addRegexToken('GGGGG', match1to6, match6);
+addRegexToken('ggggg', match1to6, match6);
+
+addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {
+ week[token.substr(0, 2)] = toInt(input);
+});
+
+addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
+ week[token] = hooks.parseTwoDigitYear(input);
+});
+
+// MOMENTS
+
+function getSetWeekYear (input) {
+ return getSetWeekYearHelper.call(this,
+ input,
+ this.week(),
+ this.weekday(),
+ this.localeData()._week.dow,
+ this.localeData()._week.doy);
+}
+
+function getSetISOWeekYear (input) {
+ return getSetWeekYearHelper.call(this,
+ input, this.isoWeek(), this.isoWeekday(), 1, 4);
+}
+
+function getISOWeeksInYear () {
+ return weeksInYear(this.year(), 1, 4);
+}
+
+function getWeeksInYear () {
+ var weekInfo = this.localeData()._week;
+ return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
+}
+
+function getSetWeekYearHelper(input, week, weekday, dow, doy) {
+ var weeksTarget;
+ if (input == null) {
+ return weekOfYear(this, dow, doy).year;
+ } else {
+ weeksTarget = weeksInYear(input, dow, doy);
+ if (week > weeksTarget) {
+ week = weeksTarget;
+ }
+ return setWeekAll.call(this, input, week, weekday, dow, doy);
+ }
+}
+
+function setWeekAll(weekYear, week, weekday, dow, doy) {
+ var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
+ date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);
+
+ this.year(date.getUTCFullYear());
+ this.month(date.getUTCMonth());
+ this.date(date.getUTCDate());
+ return this;
+}
+
+// FORMATTING
+
+addFormatToken('Q', 0, 'Qo', 'quarter');
+
+// ALIASES
+
+addUnitAlias('quarter', 'Q');
+
+// PRIORITY
+
+addUnitPriority('quarter', 7);
+
+// PARSING
+
+addRegexToken('Q', match1);
+addParseToken('Q', function (input, array) {
+ array[MONTH] = (toInt(input) - 1) * 3;
+});
+
+// MOMENTS
+
+function getSetQuarter (input) {
+ return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
+}
+
+// FORMATTING
+
+addFormatToken('D', ['DD', 2], 'Do', 'date');
+
+// ALIASES
+
+addUnitAlias('date', 'D');
+
+// PRIOROITY
+addUnitPriority('date', 9);
+
+// PARSING
+
+addRegexToken('D', match1to2);
+addRegexToken('DD', match1to2, match2);
+addRegexToken('Do', function (isStrict, locale) {
+ return isStrict ? locale._ordinalParse : locale._ordinalParseLenient;
+});
+
+addParseToken(['D', 'DD'], DATE);
+addParseToken('Do', function (input, array) {
+ array[DATE] = toInt(input.match(match1to2)[0], 10);
+});
+
+// MOMENTS
+
+var getSetDayOfMonth = makeGetSet('Date', true);
+
+// FORMATTING
+
+addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
+
+// ALIASES
+
+addUnitAlias('dayOfYear', 'DDD');
+
+// PRIORITY
+addUnitPriority('dayOfYear', 4);
+
+// PARSING
+
+addRegexToken('DDD', match1to3);
+addRegexToken('DDDD', match3);
+addParseToken(['DDD', 'DDDD'], function (input, array, config) {
+ config._dayOfYear = toInt(input);
+});
+
+// HELPERS
+
+// MOMENTS
+
+function getSetDayOfYear (input) {
+ var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;
+ return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
+}
+
+// FORMATTING
+
+addFormatToken('m', ['mm', 2], 0, 'minute');
+
+// ALIASES
+
+addUnitAlias('minute', 'm');
+
+// PRIORITY
+
+addUnitPriority('minute', 14);
+
+// PARSING
+
+addRegexToken('m', match1to2);
+addRegexToken('mm', match1to2, match2);
+addParseToken(['m', 'mm'], MINUTE);
+
+// MOMENTS
+
+var getSetMinute = makeGetSet('Minutes', false);
+
+// FORMATTING
+
+addFormatToken('s', ['ss', 2], 0, 'second');
+
+// ALIASES
+
+addUnitAlias('second', 's');
+
+// PRIORITY
+
+addUnitPriority('second', 15);
+
+// PARSING
+
+addRegexToken('s', match1to2);
+addRegexToken('ss', match1to2, match2);
+addParseToken(['s', 'ss'], SECOND);
+
+// MOMENTS
+
+var getSetSecond = makeGetSet('Seconds', false);
+
+// FORMATTING
+
+addFormatToken('S', 0, 0, function () {
+ return ~~(this.millisecond() / 100);
+});
+
+addFormatToken(0, ['SS', 2], 0, function () {
+ return ~~(this.millisecond() / 10);
+});
+
+addFormatToken(0, ['SSS', 3], 0, 'millisecond');
+addFormatToken(0, ['SSSS', 4], 0, function () {
+ return this.millisecond() * 10;
+});
+addFormatToken(0, ['SSSSS', 5], 0, function () {
+ return this.millisecond() * 100;
+});
+addFormatToken(0, ['SSSSSS', 6], 0, function () {
+ return this.millisecond() * 1000;
+});
+addFormatToken(0, ['SSSSSSS', 7], 0, function () {
+ return this.millisecond() * 10000;
+});
+addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
+ return this.millisecond() * 100000;
+});
+addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
+ return this.millisecond() * 1000000;
+});
+
+
+// ALIASES
+
+addUnitAlias('millisecond', 'ms');
+
+// PRIORITY
+
+addUnitPriority('millisecond', 16);
+
+// PARSING
+
+addRegexToken('S', match1to3, match1);
+addRegexToken('SS', match1to3, match2);
+addRegexToken('SSS', match1to3, match3);
+
+var token;
+for (token = 'SSSS'; token.length <= 9; token += 'S') {
+ addRegexToken(token, matchUnsigned);
+}
+
+function parseMs(input, array) {
+ array[MILLISECOND] = toInt(('0.' + input) * 1000);
+}
+
+for (token = 'S'; token.length <= 9; token += 'S') {
+ addParseToken(token, parseMs);
+}
+// MOMENTS
+
+var getSetMillisecond = makeGetSet('Milliseconds', false);
+
+// FORMATTING
+
+addFormatToken('z', 0, 0, 'zoneAbbr');
+addFormatToken('zz', 0, 0, 'zoneName');
+
+// MOMENTS
+
+function getZoneAbbr () {
+ return this._isUTC ? 'UTC' : '';
+}
+
+function getZoneName () {
+ return this._isUTC ? 'Coordinated Universal Time' : '';
+}
+
+var proto = Moment.prototype;
+
+proto.add = add;
+proto.calendar = calendar$1;
+proto.clone = clone;
+proto.diff = diff;
+proto.endOf = endOf;
+proto.format = format;
+proto.from = from;
+proto.fromNow = fromNow;
+proto.to = to;
+proto.toNow = toNow;
+proto.get = stringGet;
+proto.invalidAt = invalidAt;
+proto.isAfter = isAfter;
+proto.isBefore = isBefore;
+proto.isBetween = isBetween;
+proto.isSame = isSame;
+proto.isSameOrAfter = isSameOrAfter;
+proto.isSameOrBefore = isSameOrBefore;
+proto.isValid = isValid$1;
+proto.lang = lang;
+proto.locale = locale;
+proto.localeData = localeData;
+proto.max = prototypeMax;
+proto.min = prototypeMin;
+proto.parsingFlags = parsingFlags;
+proto.set = stringSet;
+proto.startOf = startOf;
+proto.subtract = subtract;
+proto.toArray = toArray;
+proto.toObject = toObject;
+proto.toDate = toDate;
+proto.toISOString = toISOString;
+proto.inspect = inspect;
+proto.toJSON = toJSON;
+proto.toString = toString;
+proto.unix = unix;
+proto.valueOf = valueOf;
+proto.creationData = creationData;
+
+// Year
+proto.year = getSetYear;
+proto.isLeapYear = getIsLeapYear;
+
+// Week Year
+proto.weekYear = getSetWeekYear;
+proto.isoWeekYear = getSetISOWeekYear;
+
+// Quarter
+proto.quarter = proto.quarters = getSetQuarter;
+
+// Month
+proto.month = getSetMonth;
+proto.daysInMonth = getDaysInMonth;
+
+// Week
+proto.week = proto.weeks = getSetWeek;
+proto.isoWeek = proto.isoWeeks = getSetISOWeek;
+proto.weeksInYear = getWeeksInYear;
+proto.isoWeeksInYear = getISOWeeksInYear;
+
+// Day
+proto.date = getSetDayOfMonth;
+proto.day = proto.days = getSetDayOfWeek;
+proto.weekday = getSetLocaleDayOfWeek;
+proto.isoWeekday = getSetISODayOfWeek;
+proto.dayOfYear = getSetDayOfYear;
+
+// Hour
+proto.hour = proto.hours = getSetHour;
+
+// Minute
+proto.minute = proto.minutes = getSetMinute;
+
+// Second
+proto.second = proto.seconds = getSetSecond;
+
+// Millisecond
+proto.millisecond = proto.milliseconds = getSetMillisecond;
+
+// Offset
+proto.utcOffset = getSetOffset;
+proto.utc = setOffsetToUTC;
+proto.local = setOffsetToLocal;
+proto.parseZone = setOffsetToParsedOffset;
+proto.hasAlignedHourOffset = hasAlignedHourOffset;
+proto.isDST = isDaylightSavingTime;
+proto.isLocal = isLocal;
+proto.isUtcOffset = isUtcOffset;
+proto.isUtc = isUtc;
+proto.isUTC = isUtc;
+
+// Timezone
+proto.zoneAbbr = getZoneAbbr;
+proto.zoneName = getZoneName;
+
+// Deprecations
+proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);
+proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);
+proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);
+proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);
+proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);
+
+function createUnix (input) {
+ return createLocal(input * 1000);
+}
+
+function createInZone () {
+ return createLocal.apply(null, arguments).parseZone();
+}
+
+function preParsePostFormat (string) {
+ return string;
+}
+
+var proto$1 = Locale.prototype;
+
+proto$1.calendar = calendar;
+proto$1.longDateFormat = longDateFormat;
+proto$1.invalidDate = invalidDate;
+proto$1.ordinal = ordinal;
+proto$1.preparse = preParsePostFormat;
+proto$1.postformat = preParsePostFormat;
+proto$1.relativeTime = relativeTime;
+proto$1.pastFuture = pastFuture;
+proto$1.set = set;
+
+// Month
+proto$1.months = localeMonths;
+proto$1.monthsShort = localeMonthsShort;
+proto$1.monthsParse = localeMonthsParse;
+proto$1.monthsRegex = monthsRegex;
+proto$1.monthsShortRegex = monthsShortRegex;
+
+// Week
+proto$1.week = localeWeek;
+proto$1.firstDayOfYear = localeFirstDayOfYear;
+proto$1.firstDayOfWeek = localeFirstDayOfWeek;
+
+// Day of Week
+proto$1.weekdays = localeWeekdays;
+proto$1.weekdaysMin = localeWeekdaysMin;
+proto$1.weekdaysShort = localeWeekdaysShort;
+proto$1.weekdaysParse = localeWeekdaysParse;
+
+proto$1.weekdaysRegex = weekdaysRegex;
+proto$1.weekdaysShortRegex = weekdaysShortRegex;
+proto$1.weekdaysMinRegex = weekdaysMinRegex;
+
+// Hours
+proto$1.isPM = localeIsPM;
+proto$1.meridiem = localeMeridiem;
+
+function get$1 (format, index, field, setter) {
+ var locale = getLocale();
+ var utc = createUTC().set(setter, index);
+ return locale[field](utc, format);
+}
+
+function listMonthsImpl (format, index, field) {
+ if (isNumber(format)) {
+ index = format;
+ format = undefined;
+ }
+
+ format = format || '';
+
+ if (index != null) {
+ return get$1(format, index, field, 'month');
+ }
+
+ var i;
+ var out = [];
+ for (i = 0; i < 12; i++) {
+ out[i] = get$1(format, i, field, 'month');
+ }
+ return out;
+}
+
+// ()
+// (5)
+// (fmt, 5)
+// (fmt)
+// (true)
+// (true, 5)
+// (true, fmt, 5)
+// (true, fmt)
+function listWeekdaysImpl (localeSorted, format, index, field) {
+ if (typeof localeSorted === 'boolean') {
+ if (isNumber(format)) {
+ index = format;
+ format = undefined;
+ }
+
+ format = format || '';
+ } else {
+ format = localeSorted;
+ index = format;
+ localeSorted = false;
+
+ if (isNumber(format)) {
+ index = format;
+ format = undefined;
+ }
+
+ format = format || '';
+ }
+
+ var locale = getLocale(),
+ shift = localeSorted ? locale._week.dow : 0;
+
+ if (index != null) {
+ return get$1(format, (index + shift) % 7, field, 'day');
+ }
+
+ var i;
+ var out = [];
+ for (i = 0; i < 7; i++) {
+ out[i] = get$1(format, (i + shift) % 7, field, 'day');
+ }
+ return out;
+}
+
+function listMonths (format, index) {
+ return listMonthsImpl(format, index, 'months');
+}
+
+function listMonthsShort (format, index) {
+ return listMonthsImpl(format, index, 'monthsShort');
+}
+
+function listWeekdays (localeSorted, format, index) {
+ return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
+}
+
+function listWeekdaysShort (localeSorted, format, index) {
+ return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
+}
+
+function listWeekdaysMin (localeSorted, format, index) {
+ return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
+}
+
+getSetGlobalLocale('en', {
+ ordinalParse: /\d{1,2}(th|st|nd|rd)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (toInt(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ }
+});
+
+// Side effect imports
+hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);
+hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);
+
+var mathAbs = Math.abs;
+
+function abs () {
+ var data = this._data;
+
+ this._milliseconds = mathAbs(this._milliseconds);
+ this._days = mathAbs(this._days);
+ this._months = mathAbs(this._months);
+
+ data.milliseconds = mathAbs(data.milliseconds);
+ data.seconds = mathAbs(data.seconds);
+ data.minutes = mathAbs(data.minutes);
+ data.hours = mathAbs(data.hours);
+ data.months = mathAbs(data.months);
+ data.years = mathAbs(data.years);
+
+ return this;
+}
+
+function addSubtract$1 (duration, input, value, direction) {
+ var other = createDuration(input, value);
+
+ duration._milliseconds += direction * other._milliseconds;
+ duration._days += direction * other._days;
+ duration._months += direction * other._months;
+
+ return duration._bubble();
+}
+
+// supports only 2.0-style add(1, 's') or add(duration)
+function add$1 (input, value) {
+ return addSubtract$1(this, input, value, 1);
+}
+
+// supports only 2.0-style subtract(1, 's') or subtract(duration)
+function subtract$1 (input, value) {
+ return addSubtract$1(this, input, value, -1);
+}
+
+function absCeil (number) {
+ if (number < 0) {
+ return Math.floor(number);
+ } else {
+ return Math.ceil(number);
+ }
+}
+
+function bubble () {
+ var milliseconds = this._milliseconds;
+ var days = this._days;
+ var months = this._months;
+ var data = this._data;
+ var seconds, minutes, hours, years, monthsFromDays;
+
+ // if we have a mix of positive and negative values, bubble down first
+ // check: https://github.com/moment/moment/issues/2166
+ if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||
+ (milliseconds <= 0 && days <= 0 && months <= 0))) {
+ milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
+ days = 0;
+ months = 0;
+ }
+
+ // The following code bubbles up values, see the tests for
+ // examples of what that means.
+ data.milliseconds = milliseconds % 1000;
+
+ seconds = absFloor(milliseconds / 1000);
+ data.seconds = seconds % 60;
+
+ minutes = absFloor(seconds / 60);
+ data.minutes = minutes % 60;
+
+ hours = absFloor(minutes / 60);
+ data.hours = hours % 24;
+
+ days += absFloor(hours / 24);
+
+ // convert days to months
+ monthsFromDays = absFloor(daysToMonths(days));
+ months += monthsFromDays;
+ days -= absCeil(monthsToDays(monthsFromDays));
+
+ // 12 months -> 1 year
+ years = absFloor(months / 12);
+ months %= 12;
+
+ data.days = days;
+ data.months = months;
+ data.years = years;
+
+ return this;
+}
+
+function daysToMonths (days) {
+ // 400 years have 146097 days (taking into account leap year rules)
+ // 400 years have 12 months === 4800
+ return days * 4800 / 146097;
+}
+
+function monthsToDays (months) {
+ // the reverse of daysToMonths
+ return months * 146097 / 4800;
+}
+
+function as (units) {
+ var days;
+ var months;
+ var milliseconds = this._milliseconds;
+
+ units = normalizeUnits(units);
+
+ if (units === 'month' || units === 'year') {
+ days = this._days + milliseconds / 864e5;
+ months = this._months + daysToMonths(days);
+ return units === 'month' ? months : months / 12;
+ } else {
+ // handle milliseconds separately because of floating point math errors (issue #1867)
+ days = this._days + Math.round(monthsToDays(this._months));
+ switch (units) {
+ case 'week' : return days / 7 + milliseconds / 6048e5;
+ case 'day' : return days + milliseconds / 864e5;
+ case 'hour' : return days * 24 + milliseconds / 36e5;
+ case 'minute' : return days * 1440 + milliseconds / 6e4;
+ case 'second' : return days * 86400 + milliseconds / 1000;
+ // Math.floor prevents floating point math errors here
+ case 'millisecond': return Math.floor(days * 864e5) + milliseconds;
+ default: throw new Error('Unknown unit ' + units);
+ }
+ }
+}
+
+// TODO: Use this.as('ms')?
+function valueOf$1 () {
+ return (
+ this._milliseconds +
+ this._days * 864e5 +
+ (this._months % 12) * 2592e6 +
+ toInt(this._months / 12) * 31536e6
+ );
+}
+
+function makeAs (alias) {
+ return function () {
+ return this.as(alias);
+ };
+}
+
+var asMilliseconds = makeAs('ms');
+var asSeconds = makeAs('s');
+var asMinutes = makeAs('m');
+var asHours = makeAs('h');
+var asDays = makeAs('d');
+var asWeeks = makeAs('w');
+var asMonths = makeAs('M');
+var asYears = makeAs('y');
+
+function get$2 (units) {
+ units = normalizeUnits(units);
+ return this[units + 's']();
+}
+
+function makeGetter(name) {
+ return function () {
+ return this._data[name];
+ };
+}
+
+var milliseconds = makeGetter('milliseconds');
+var seconds = makeGetter('seconds');
+var minutes = makeGetter('minutes');
+var hours = makeGetter('hours');
+var days = makeGetter('days');
+var months = makeGetter('months');
+var years = makeGetter('years');
+
+function weeks () {
+ return absFloor(this.days() / 7);
+}
+
+var round = Math.round;
+var thresholds = {
+ s: 45, // seconds to minute
+ m: 45, // minutes to hour
+ h: 22, // hours to day
+ d: 26, // days to month
+ M: 11 // months to year
+};
+
+// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
+function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
+ return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
+}
+
+function relativeTime$1 (posNegDuration, withoutSuffix, locale) {
+ var duration = createDuration(posNegDuration).abs();
+ var seconds = round(duration.as('s'));
+ var minutes = round(duration.as('m'));
+ var hours = round(duration.as('h'));
+ var days = round(duration.as('d'));
+ var months = round(duration.as('M'));
+ var years = round(duration.as('y'));
+
+ var a = seconds < thresholds.s && ['s', seconds] ||
+ minutes <= 1 && ['m'] ||
+ minutes < thresholds.m && ['mm', minutes] ||
+ hours <= 1 && ['h'] ||
+ hours < thresholds.h && ['hh', hours] ||
+ days <= 1 && ['d'] ||
+ days < thresholds.d && ['dd', days] ||
+ months <= 1 && ['M'] ||
+ months < thresholds.M && ['MM', months] ||
+ years <= 1 && ['y'] || ['yy', years];
+
+ a[2] = withoutSuffix;
+ a[3] = +posNegDuration > 0;
+ a[4] = locale;
+ return substituteTimeAgo.apply(null, a);
+}
+
+// This function allows you to set the rounding function for relative time strings
+function getSetRelativeTimeRounding (roundingFunction) {
+ if (roundingFunction === undefined) {
+ return round;
+ }
+ if (typeof(roundingFunction) === 'function') {
+ round = roundingFunction;
+ return true;
+ }
+ return false;
+}
+
+// This function allows you to set a threshold for relative time strings
+function getSetRelativeTimeThreshold (threshold, limit) {
+ if (thresholds[threshold] === undefined) {
+ return false;
+ }
+ if (limit === undefined) {
+ return thresholds[threshold];
+ }
+ thresholds[threshold] = limit;
+ return true;
+}
+
+function humanize (withSuffix) {
+ var locale = this.localeData();
+ var output = relativeTime$1(this, !withSuffix, locale);
+
+ if (withSuffix) {
+ output = locale.pastFuture(+this, output);
+ }
+
+ return locale.postformat(output);
+}
+
+var abs$1 = Math.abs;
+
+function toISOString$1() {
+ // for ISO strings we do not use the normal bubbling rules:
+ // * milliseconds bubble up until they become hours
+ // * days do not bubble at all
+ // * months bubble up until they become years
+ // This is because there is no context-free conversion between hours and days
+ // (think of clock changes)
+ // and also not between days and months (28-31 days per month)
+ var seconds = abs$1(this._milliseconds) / 1000;
+ var days = abs$1(this._days);
+ var months = abs$1(this._months);
+ var minutes, hours, years;
+
+ // 3600 seconds -> 60 minutes -> 1 hour
+ minutes = absFloor(seconds / 60);
+ hours = absFloor(minutes / 60);
+ seconds %= 60;
+ minutes %= 60;
+
+ // 12 months -> 1 year
+ years = absFloor(months / 12);
+ months %= 12;
+
+
+ // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
+ var Y = years;
+ var M = months;
+ var D = days;
+ var h = hours;
+ var m = minutes;
+ var s = seconds;
+ var total = this.asSeconds();
+
+ if (!total) {
+ // this is the same as C#'s (Noda) and python (isodate)...
+ // but not other JS (goog.date)
+ return 'P0D';
+ }
+
+ return (total < 0 ? '-' : '') +
+ 'P' +
+ (Y ? Y + 'Y' : '') +
+ (M ? M + 'M' : '') +
+ (D ? D + 'D' : '') +
+ ((h || m || s) ? 'T' : '') +
+ (h ? h + 'H' : '') +
+ (m ? m + 'M' : '') +
+ (s ? s + 'S' : '');
+}
+
+var proto$2 = Duration.prototype;
+
+proto$2.abs = abs;
+proto$2.add = add$1;
+proto$2.subtract = subtract$1;
+proto$2.as = as;
+proto$2.asMilliseconds = asMilliseconds;
+proto$2.asSeconds = asSeconds;
+proto$2.asMinutes = asMinutes;
+proto$2.asHours = asHours;
+proto$2.asDays = asDays;
+proto$2.asWeeks = asWeeks;
+proto$2.asMonths = asMonths;
+proto$2.asYears = asYears;
+proto$2.valueOf = valueOf$1;
+proto$2._bubble = bubble;
+proto$2.get = get$2;
+proto$2.milliseconds = milliseconds;
+proto$2.seconds = seconds;
+proto$2.minutes = minutes;
+proto$2.hours = hours;
+proto$2.days = days;
+proto$2.weeks = weeks;
+proto$2.months = months;
+proto$2.years = years;
+proto$2.humanize = humanize;
+proto$2.toISOString = toISOString$1;
+proto$2.toString = toISOString$1;
+proto$2.toJSON = toISOString$1;
+proto$2.locale = locale;
+proto$2.localeData = localeData;
+
+// Deprecations
+proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);
+proto$2.lang = lang;
+
+// Side effect imports
+
+// FORMATTING
+
+addFormatToken('X', 0, 0, 'unix');
+addFormatToken('x', 0, 0, 'valueOf');
+
+// PARSING
+
+addRegexToken('x', matchSigned);
+addRegexToken('X', matchTimestamp);
+addParseToken('X', function (input, array, config) {
+ config._d = new Date(parseFloat(input, 10) * 1000);
+});
+addParseToken('x', function (input, array, config) {
+ config._d = new Date(toInt(input));
+});
+
+// Side effect imports
+
+//! moment.js
+//! version : 2.17.1
+//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
+//! license : MIT
+//! momentjs.com
+
+hooks.version = '2.17.1';
+
+setHookCallback(createLocal);
+
+hooks.fn = proto;
+hooks.min = min;
+hooks.max = max;
+hooks.now = now;
+hooks.utc = createUTC;
+hooks.unix = createUnix;
+hooks.months = listMonths;
+hooks.isDate = isDate;
+hooks.locale = getSetGlobalLocale;
+hooks.invalid = createInvalid;
+hooks.duration = createDuration;
+hooks.isMoment = isMoment;
+hooks.weekdays = listWeekdays;
+hooks.parseZone = createInZone;
+hooks.localeData = getLocale;
+hooks.isDuration = isDuration;
+hooks.monthsShort = listMonthsShort;
+hooks.weekdaysMin = listWeekdaysMin;
+hooks.defineLocale = defineLocale;
+hooks.updateLocale = updateLocale;
+hooks.locales = listLocales;
+hooks.weekdaysShort = listWeekdaysShort;
+hooks.normalizeUnits = normalizeUnits;
+hooks.relativeTimeRounding = getSetRelativeTimeRounding;
+hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
+hooks.calendarFormat = getCalendarFormat;
+hooks.prototype = proto;
+
+//! moment.js locale configuration
+//! locale : Afrikaans [af]
+//! author : Werner Mollentze : https://github.com/wernerm
+
+hooks.defineLocale('af', {
+ months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'),
+ monthsShort : 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),
+ weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'),
+ weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),
+ weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),
+ meridiemParse: /vm|nm/i,
+ isPM : function (input) {
+ return /^nm$/i.test(input);
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 12) {
+ return isLower ? 'vm' : 'VM';
+ } else {
+ return isLower ? 'nm' : 'NM';
+ }
+ },
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Vandag om] LT',
+ nextDay : '[Môre om] LT',
+ nextWeek : 'dddd [om] LT',
+ lastDay : '[Gister om] LT',
+ lastWeek : '[Laas] dddd [om] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'oor %s',
+ past : '%s gelede',
+ s : '\'n paar sekondes',
+ m : '\'n minuut',
+ mm : '%d minute',
+ h : '\'n uur',
+ hh : '%d ure',
+ d : '\'n dag',
+ dd : '%d dae',
+ M : '\'n maand',
+ MM : '%d maande',
+ y : '\'n jaar',
+ yy : '%d jaar'
+ },
+ ordinalParse: /\d{1,2}(ste|de)/,
+ ordinal : function (number) {
+ return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter
+ },
+ week : {
+ dow : 1, // Maandag is die eerste dag van die week.
+ doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Arabic (Algeria) [ar-dz]
+//! author : Noureddine LOUAHEDJ : https://github.com/noureddineme
+
+hooks.defineLocale('ar-dz', {
+ months : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ monthsShort : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort : 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin : 'أح_إث_ثلا_أر_خم_جم_سب'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[اليوم على الساعة] LT',
+ nextDay: '[غدا على الساعة] LT',
+ nextWeek: 'dddd [على الساعة] LT',
+ lastDay: '[أمس على الساعة] LT',
+ lastWeek: 'dddd [على الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'في %s',
+ past : 'منذ %s',
+ s : 'ثوان',
+ m : 'دقيقة',
+ mm : '%d دقائق',
+ h : 'ساعة',
+ hh : '%d ساعات',
+ d : 'يوم',
+ dd : '%d أيام',
+ M : 'شهر',
+ MM : '%d أشهر',
+ y : 'سنة',
+ yy : '%d سنوات'
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 4 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Arabic (Lybia) [ar-ly]
+//! author : Ali Hmer: https://github.com/kikoanis
+
+var symbolMap = {
+ '1': '1',
+ '2': '2',
+ '3': '3',
+ '4': '4',
+ '5': '5',
+ '6': '6',
+ '7': '7',
+ '8': '8',
+ '9': '9',
+ '0': '0'
+};
+var pluralForm = function (n) {
+ return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5;
+};
+var plurals = {
+ s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'],
+ m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'],
+ h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'],
+ d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'],
+ M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'],
+ y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام']
+};
+var pluralize = function (u) {
+ return function (number, withoutSuffix, string, isFuture) {
+ var f = pluralForm(number),
+ str = plurals[u][pluralForm(number)];
+ if (f === 2) {
+ str = str[withoutSuffix ? 0 : 1];
+ }
+ return str.replace(/%d/i, number);
+ };
+};
+var months$1 = [
+ 'يناير',
+ 'فبراير',
+ 'مارس',
+ 'أبريل',
+ 'مايو',
+ 'يونيو',
+ 'يوليو',
+ 'أغسطس',
+ 'سبتمبر',
+ 'أكتوبر',
+ 'نوفمبر',
+ 'ديسمبر'
+];
+
+hooks.defineLocale('ar-ly', {
+ months : months$1,
+ monthsShort : months$1,
+ weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'D/\u200FM/\u200FYYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /ص|م/,
+ isPM : function (input) {
+ return 'م' === input;
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'ص';
+ } else {
+ return 'م';
+ }
+ },
+ calendar : {
+ sameDay: '[اليوم عند الساعة] LT',
+ nextDay: '[غدًا عند الساعة] LT',
+ nextWeek: 'dddd [عند الساعة] LT',
+ lastDay: '[أمس عند الساعة] LT',
+ lastWeek: 'dddd [عند الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'بعد %s',
+ past : 'منذ %s',
+ s : pluralize('s'),
+ m : pluralize('m'),
+ mm : pluralize('m'),
+ h : pluralize('h'),
+ hh : pluralize('h'),
+ d : pluralize('d'),
+ dd : pluralize('d'),
+ M : pluralize('M'),
+ MM : pluralize('M'),
+ y : pluralize('y'),
+ yy : pluralize('y')
+ },
+ preparse: function (string) {
+ return string.replace(/\u200f/g, '').replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ }).replace(/,/g, '،');
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Arabic (Morocco) [ar-ma]
+//! author : ElFadili Yassine : https://github.com/ElFadiliY
+//! author : Abdel Said : https://github.com/abdelsaid
+
+hooks.defineLocale('ar-ma', {
+ months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
+ monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
+ weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[اليوم على الساعة] LT',
+ nextDay: '[غدا على الساعة] LT',
+ nextWeek: 'dddd [على الساعة] LT',
+ lastDay: '[أمس على الساعة] LT',
+ lastWeek: 'dddd [على الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'في %s',
+ past : 'منذ %s',
+ s : 'ثوان',
+ m : 'دقيقة',
+ mm : '%d دقائق',
+ h : 'ساعة',
+ hh : '%d ساعات',
+ d : 'يوم',
+ dd : '%d أيام',
+ M : 'شهر',
+ MM : '%d أشهر',
+ y : 'سنة',
+ yy : '%d سنوات'
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Arabic (Saudi Arabia) [ar-sa]
+//! author : Suhail Alkowaileet : https://github.com/xsoh
+
+var symbolMap$1 = {
+ '1': '١',
+ '2': '٢',
+ '3': '٣',
+ '4': '٤',
+ '5': '٥',
+ '6': '٦',
+ '7': '٧',
+ '8': '٨',
+ '9': '٩',
+ '0': '٠'
+};
+var numberMap = {
+ '١': '1',
+ '٢': '2',
+ '٣': '3',
+ '٤': '4',
+ '٥': '5',
+ '٦': '6',
+ '٧': '7',
+ '٨': '8',
+ '٩': '9',
+ '٠': '0'
+};
+
+hooks.defineLocale('ar-sa', {
+ months : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ monthsShort : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /ص|م/,
+ isPM : function (input) {
+ return 'م' === input;
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'ص';
+ } else {
+ return 'م';
+ }
+ },
+ calendar : {
+ sameDay: '[اليوم على الساعة] LT',
+ nextDay: '[غدا على الساعة] LT',
+ nextWeek: 'dddd [على الساعة] LT',
+ lastDay: '[أمس على الساعة] LT',
+ lastWeek: 'dddd [على الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'في %s',
+ past : 'منذ %s',
+ s : 'ثوان',
+ m : 'دقيقة',
+ mm : '%d دقائق',
+ h : 'ساعة',
+ hh : '%d ساعات',
+ d : 'يوم',
+ dd : '%d أيام',
+ M : 'شهر',
+ MM : '%d أشهر',
+ y : 'سنة',
+ yy : '%d سنوات'
+ },
+ preparse: function (string) {
+ return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
+ return numberMap[match];
+ }).replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$1[match];
+ }).replace(/,/g, '،');
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Arabic (Tunisia) [ar-tn]
+//! author : Nader Toukabri : https://github.com/naderio
+
+hooks.defineLocale('ar-tn', {
+ months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY HH:mm',
+ LLLL: 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar: {
+ sameDay: '[اليوم على الساعة] LT',
+ nextDay: '[غدا على الساعة] LT',
+ nextWeek: 'dddd [على الساعة] LT',
+ lastDay: '[أمس على الساعة] LT',
+ lastWeek: 'dddd [على الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: 'في %s',
+ past: 'منذ %s',
+ s: 'ثوان',
+ m: 'دقيقة',
+ mm: '%d دقائق',
+ h: 'ساعة',
+ hh: '%d ساعات',
+ d: 'يوم',
+ dd: '%d أيام',
+ M: 'شهر',
+ MM: '%d أشهر',
+ y: 'سنة',
+ yy: '%d سنوات'
+ },
+ week: {
+ dow: 1, // Monday is the first day of the week.
+ doy: 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Arabic [ar]
+//! author : Abdel Said: https://github.com/abdelsaid
+//! author : Ahmed Elkhatib
+//! author : forabi https://github.com/forabi
+
+var symbolMap$2 = {
+ '1': '١',
+ '2': '٢',
+ '3': '٣',
+ '4': '٤',
+ '5': '٥',
+ '6': '٦',
+ '7': '٧',
+ '8': '٨',
+ '9': '٩',
+ '0': '٠'
+};
+var numberMap$1 = {
+ '١': '1',
+ '٢': '2',
+ '٣': '3',
+ '٤': '4',
+ '٥': '5',
+ '٦': '6',
+ '٧': '7',
+ '٨': '8',
+ '٩': '9',
+ '٠': '0'
+};
+var pluralForm$1 = function (n) {
+ return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5;
+};
+var plurals$1 = {
+ s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'],
+ m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'],
+ h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'],
+ d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'],
+ M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'],
+ y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام']
+};
+var pluralize$1 = function (u) {
+ return function (number, withoutSuffix, string, isFuture) {
+ var f = pluralForm$1(number),
+ str = plurals$1[u][pluralForm$1(number)];
+ if (f === 2) {
+ str = str[withoutSuffix ? 0 : 1];
+ }
+ return str.replace(/%d/i, number);
+ };
+};
+var months$2 = [
+ 'كانون الثاني يناير',
+ 'شباط فبراير',
+ 'آذار مارس',
+ 'نيسان أبريل',
+ 'أيار مايو',
+ 'حزيران يونيو',
+ 'تموز يوليو',
+ 'آب أغسطس',
+ 'أيلول سبتمبر',
+ 'تشرين الأول أكتوبر',
+ 'تشرين الثاني نوفمبر',
+ 'كانون الأول ديسمبر'
+];
+
+hooks.defineLocale('ar', {
+ months : months$2,
+ monthsShort : months$2,
+ weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'D/\u200FM/\u200FYYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /ص|م/,
+ isPM : function (input) {
+ return 'م' === input;
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'ص';
+ } else {
+ return 'م';
+ }
+ },
+ calendar : {
+ sameDay: '[اليوم عند الساعة] LT',
+ nextDay: '[غدًا عند الساعة] LT',
+ nextWeek: 'dddd [عند الساعة] LT',
+ lastDay: '[أمس عند الساعة] LT',
+ lastWeek: 'dddd [عند الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'بعد %s',
+ past : 'منذ %s',
+ s : pluralize$1('s'),
+ m : pluralize$1('m'),
+ mm : pluralize$1('m'),
+ h : pluralize$1('h'),
+ hh : pluralize$1('h'),
+ d : pluralize$1('d'),
+ dd : pluralize$1('d'),
+ M : pluralize$1('M'),
+ MM : pluralize$1('M'),
+ y : pluralize$1('y'),
+ yy : pluralize$1('y')
+ },
+ preparse: function (string) {
+ return string.replace(/\u200f/g, '').replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
+ return numberMap$1[match];
+ }).replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$2[match];
+ }).replace(/,/g, '،');
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Azerbaijani [az]
+//! author : topchiyev : https://github.com/topchiyev
+
+var suffixes = {
+ 1: '-inci',
+ 5: '-inci',
+ 8: '-inci',
+ 70: '-inci',
+ 80: '-inci',
+ 2: '-nci',
+ 7: '-nci',
+ 20: '-nci',
+ 50: '-nci',
+ 3: '-üncü',
+ 4: '-üncü',
+ 100: '-üncü',
+ 6: '-ncı',
+ 9: '-uncu',
+ 10: '-uncu',
+ 30: '-uncu',
+ 60: '-ıncı',
+ 90: '-ıncı'
+};
+
+hooks.defineLocale('az', {
+ months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'),
+ monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),
+ weekdays : 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'),
+ weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'),
+ weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[bugün saat] LT',
+ nextDay : '[sabah saat] LT',
+ nextWeek : '[gələn həftə] dddd [saat] LT',
+ lastDay : '[dünən] LT',
+ lastWeek : '[keçən həftə] dddd [saat] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s sonra',
+ past : '%s əvvəl',
+ s : 'birneçə saniyyə',
+ m : 'bir dəqiqə',
+ mm : '%d dəqiqə',
+ h : 'bir saat',
+ hh : '%d saat',
+ d : 'bir gün',
+ dd : '%d gün',
+ M : 'bir ay',
+ MM : '%d ay',
+ y : 'bir il',
+ yy : '%d il'
+ },
+ meridiemParse: /gecə|səhər|gündüz|axşam/,
+ isPM : function (input) {
+ return /^(gündüz|axşam)$/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'gecə';
+ } else if (hour < 12) {
+ return 'səhər';
+ } else if (hour < 17) {
+ return 'gündüz';
+ } else {
+ return 'axşam';
+ }
+ },
+ ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,
+ ordinal : function (number) {
+ if (number === 0) { // special case for zero
+ return number + '-ıncı';
+ }
+ var a = number % 10,
+ b = number % 100 - a,
+ c = number >= 100 ? 100 : null;
+ return number + (suffixes[a] || suffixes[b] || suffixes[c]);
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Belarusian [be]
+//! author : Dmitry Demidov : https://github.com/demidov91
+//! author: Praleska: http://praleska.pro/
+//! Author : Menelion Elensúle : https://github.com/Oire
+
+function plural(word, num) {
+ var forms = word.split('_');
+ return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+}
+function relativeTimeWithPlural(number, withoutSuffix, key) {
+ var format = {
+ 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',
+ 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін',
+ 'dd': 'дзень_дні_дзён',
+ 'MM': 'месяц_месяцы_месяцаў',
+ 'yy': 'год_гады_гадоў'
+ };
+ if (key === 'm') {
+ return withoutSuffix ? 'хвіліна' : 'хвіліну';
+ }
+ else if (key === 'h') {
+ return withoutSuffix ? 'гадзіна' : 'гадзіну';
+ }
+ else {
+ return number + ' ' + plural(format[key], +number);
+ }
+}
+
+hooks.defineLocale('be', {
+ months : {
+ format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_'),
+ standalone: 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_')
+ },
+ monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),
+ weekdays : {
+ format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_'),
+ standalone: 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'),
+ isFormat: /\[ ?[Вв] ?(?:мінулую|наступную)? ?\] ?dddd/
+ },
+ weekdaysShort : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
+ weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY г.',
+ LLL : 'D MMMM YYYY г., HH:mm',
+ LLLL : 'dddd, D MMMM YYYY г., HH:mm'
+ },
+ calendar : {
+ sameDay: '[Сёння ў] LT',
+ nextDay: '[Заўтра ў] LT',
+ lastDay: '[Учора ў] LT',
+ nextWeek: function () {
+ return '[У] dddd [ў] LT';
+ },
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ case 5:
+ case 6:
+ return '[У мінулую] dddd [ў] LT';
+ case 1:
+ case 2:
+ case 4:
+ return '[У мінулы] dddd [ў] LT';
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'праз %s',
+ past : '%s таму',
+ s : 'некалькі секунд',
+ m : relativeTimeWithPlural,
+ mm : relativeTimeWithPlural,
+ h : relativeTimeWithPlural,
+ hh : relativeTimeWithPlural,
+ d : 'дзень',
+ dd : relativeTimeWithPlural,
+ M : 'месяц',
+ MM : relativeTimeWithPlural,
+ y : 'год',
+ yy : relativeTimeWithPlural
+ },
+ meridiemParse: /ночы|раніцы|дня|вечара/,
+ isPM : function (input) {
+ return /^(дня|вечара)$/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'ночы';
+ } else if (hour < 12) {
+ return 'раніцы';
+ } else if (hour < 17) {
+ return 'дня';
+ } else {
+ return 'вечара';
+ }
+ },
+ ordinalParse: /\d{1,2}-(і|ы|га)/,
+ ordinal: function (number, period) {
+ switch (period) {
+ case 'M':
+ case 'd':
+ case 'DDD':
+ case 'w':
+ case 'W':
+ return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы';
+ case 'D':
+ return number + '-га';
+ default:
+ return number;
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Bulgarian [bg]
+//! author : Krasen Borisov : https://github.com/kraz
+
+hooks.defineLocale('bg', {
+ months : 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'),
+ monthsShort : 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),
+ weekdays : 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'),
+ weekdaysShort : 'нед_пон_вто_сря_чет_пет_съб'.split('_'),
+ weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'D.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY H:mm',
+ LLLL : 'dddd, D MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[Днес в] LT',
+ nextDay : '[Утре в] LT',
+ nextWeek : 'dddd [в] LT',
+ lastDay : '[Вчера в] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ case 6:
+ return '[В изминалата] dddd [в] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[В изминалия] dddd [в] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'след %s',
+ past : 'преди %s',
+ s : 'няколко секунди',
+ m : 'минута',
+ mm : '%d минути',
+ h : 'час',
+ hh : '%d часа',
+ d : 'ден',
+ dd : '%d дни',
+ M : 'месец',
+ MM : '%d месеца',
+ y : 'година',
+ yy : '%d години'
+ },
+ ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
+ ordinal : function (number) {
+ var lastDigit = number % 10,
+ last2Digits = number % 100;
+ if (number === 0) {
+ return number + '-ев';
+ } else if (last2Digits === 0) {
+ return number + '-ен';
+ } else if (last2Digits > 10 && last2Digits < 20) {
+ return number + '-ти';
+ } else if (lastDigit === 1) {
+ return number + '-ви';
+ } else if (lastDigit === 2) {
+ return number + '-ри';
+ } else if (lastDigit === 7 || lastDigit === 8) {
+ return number + '-ми';
+ } else {
+ return number + '-ти';
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Bengali [bn]
+//! author : Kaushik Gandhi : https://github.com/kaushikgandhi
+
+var symbolMap$3 = {
+ '1': '১',
+ '2': '২',
+ '3': '৩',
+ '4': '৪',
+ '5': '৫',
+ '6': '৬',
+ '7': '৭',
+ '8': '৮',
+ '9': '৯',
+ '0': '০'
+};
+var numberMap$2 = {
+ '১': '1',
+ '২': '2',
+ '৩': '3',
+ '৪': '4',
+ '৫': '5',
+ '৬': '6',
+ '৭': '7',
+ '৮': '8',
+ '৯': '9',
+ '০': '0'
+};
+
+hooks.defineLocale('bn', {
+ months : 'জানুয়ারী_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'),
+ monthsShort : 'জানু_ফেব_মার্চ_এপ্র_মে_জুন_জুল_আগ_সেপ্ট_অক্টো_নভে_ডিসে'.split('_'),
+ weekdays : 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split('_'),
+ weekdaysShort : 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),
+ weekdaysMin : 'রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm সময়',
+ LTS : 'A h:mm:ss সময়',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm সময়',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm সময়'
+ },
+ calendar : {
+ sameDay : '[আজ] LT',
+ nextDay : '[আগামীকাল] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[গতকাল] LT',
+ lastWeek : '[গত] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s পরে',
+ past : '%s আগে',
+ s : 'কয়েক সেকেন্ড',
+ m : 'এক মিনিট',
+ mm : '%d মিনিট',
+ h : 'এক ঘন্টা',
+ hh : '%d ঘন্টা',
+ d : 'এক দিন',
+ dd : '%d দিন',
+ M : 'এক মাস',
+ MM : '%d মাস',
+ y : 'এক বছর',
+ yy : '%d বছর'
+ },
+ preparse: function (string) {
+ return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
+ return numberMap$2[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$3[match];
+ });
+ },
+ meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if ((meridiem === 'রাত' && hour >= 4) ||
+ (meridiem === 'দুপুর' && hour < 5) ||
+ meridiem === 'বিকাল') {
+ return hour + 12;
+ } else {
+ return hour;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'রাত';
+ } else if (hour < 10) {
+ return 'সকাল';
+ } else if (hour < 17) {
+ return 'দুপুর';
+ } else if (hour < 20) {
+ return 'বিকাল';
+ } else {
+ return 'রাত';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Tibetan [bo]
+//! author : Thupten N. Chakrishar : https://github.com/vajradog
+
+var symbolMap$4 = {
+ '1': '༡',
+ '2': '༢',
+ '3': '༣',
+ '4': '༤',
+ '5': '༥',
+ '6': '༦',
+ '7': '༧',
+ '8': '༨',
+ '9': '༩',
+ '0': '༠'
+};
+var numberMap$3 = {
+ '༡': '1',
+ '༢': '2',
+ '༣': '3',
+ '༤': '4',
+ '༥': '5',
+ '༦': '6',
+ '༧': '7',
+ '༨': '8',
+ '༩': '9',
+ '༠': '0'
+};
+
+hooks.defineLocale('bo', {
+ months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
+ monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
+ weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'),
+ weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
+ weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm',
+ LTS : 'A h:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm'
+ },
+ calendar : {
+ sameDay : '[དི་རིང] LT',
+ nextDay : '[སང་ཉིན] LT',
+ nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT',
+ lastDay : '[ཁ་སང] LT',
+ lastWeek : '[བདུན་ཕྲག་མཐའ་མ] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s ལ་',
+ past : '%s སྔན་ལ',
+ s : 'ལམ་སང',
+ m : 'སྐར་མ་གཅིག',
+ mm : '%d སྐར་མ',
+ h : 'ཆུ་ཚོད་གཅིག',
+ hh : '%d ཆུ་ཚོད',
+ d : 'ཉིན་གཅིག',
+ dd : '%d ཉིན་',
+ M : 'ཟླ་བ་གཅིག',
+ MM : '%d ཟླ་བ',
+ y : 'ལོ་གཅིག',
+ yy : '%d ལོ'
+ },
+ preparse: function (string) {
+ return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) {
+ return numberMap$3[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$4[match];
+ });
+ },
+ meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if ((meridiem === 'མཚན་མོ' && hour >= 4) ||
+ (meridiem === 'ཉིན་གུང' && hour < 5) ||
+ meridiem === 'དགོང་དག') {
+ return hour + 12;
+ } else {
+ return hour;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'མཚན་མོ';
+ } else if (hour < 10) {
+ return 'ཞོགས་ཀས';
+ } else if (hour < 17) {
+ return 'ཉིན་གུང';
+ } else if (hour < 20) {
+ return 'དགོང་དག';
+ } else {
+ return 'མཚན་མོ';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Breton [br]
+//! author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
+
+function relativeTimeWithMutation(number, withoutSuffix, key) {
+ var format = {
+ 'mm': 'munutenn',
+ 'MM': 'miz',
+ 'dd': 'devezh'
+ };
+ return number + ' ' + mutation(format[key], number);
+}
+function specialMutationForYears(number) {
+ switch (lastNumber(number)) {
+ case 1:
+ case 3:
+ case 4:
+ case 5:
+ case 9:
+ return number + ' bloaz';
+ default:
+ return number + ' vloaz';
+ }
+}
+function lastNumber(number) {
+ if (number > 9) {
+ return lastNumber(number % 10);
+ }
+ return number;
+}
+function mutation(text, number) {
+ if (number === 2) {
+ return softMutation(text);
+ }
+ return text;
+}
+function softMutation(text) {
+ var mutationTable = {
+ 'm': 'v',
+ 'b': 'v',
+ 'd': 'z'
+ };
+ if (mutationTable[text.charAt(0)] === undefined) {
+ return text;
+ }
+ return mutationTable[text.charAt(0)] + text.substring(1);
+}
+
+hooks.defineLocale('br', {
+ months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'),
+ monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),
+ weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'),
+ weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),
+ weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'h[e]mm A',
+ LTS : 'h[e]mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D [a viz] MMMM YYYY',
+ LLL : 'D [a viz] MMMM YYYY h[e]mm A',
+ LLLL : 'dddd, D [a viz] MMMM YYYY h[e]mm A'
+ },
+ calendar : {
+ sameDay : '[Hiziv da] LT',
+ nextDay : '[Warc\'hoazh da] LT',
+ nextWeek : 'dddd [da] LT',
+ lastDay : '[Dec\'h da] LT',
+ lastWeek : 'dddd [paset da] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'a-benn %s',
+ past : '%s \'zo',
+ s : 'un nebeud segondennoù',
+ m : 'ur vunutenn',
+ mm : relativeTimeWithMutation,
+ h : 'un eur',
+ hh : '%d eur',
+ d : 'un devezh',
+ dd : relativeTimeWithMutation,
+ M : 'ur miz',
+ MM : relativeTimeWithMutation,
+ y : 'ur bloaz',
+ yy : specialMutationForYears
+ },
+ ordinalParse: /\d{1,2}(añ|vet)/,
+ ordinal : function (number) {
+ var output = (number === 1) ? 'añ' : 'vet';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Bosnian [bs]
+//! author : Nedim Cholich : https://github.com/frontyard
+//! based on (hr) translation by Bojan Marković
+
+function translate(number, withoutSuffix, key) {
+ var result = number + ' ';
+ switch (key) {
+ case 'm':
+ return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+ case 'mm':
+ if (number === 1) {
+ result += 'minuta';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'minute';
+ } else {
+ result += 'minuta';
+ }
+ return result;
+ case 'h':
+ return withoutSuffix ? 'jedan sat' : 'jednog sata';
+ case 'hh':
+ if (number === 1) {
+ result += 'sat';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'sata';
+ } else {
+ result += 'sati';
+ }
+ return result;
+ case 'dd':
+ if (number === 1) {
+ result += 'dan';
+ } else {
+ result += 'dana';
+ }
+ return result;
+ case 'MM':
+ if (number === 1) {
+ result += 'mjesec';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'mjeseca';
+ } else {
+ result += 'mjeseci';
+ }
+ return result;
+ case 'yy':
+ if (number === 1) {
+ result += 'godina';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'godine';
+ } else {
+ result += 'godina';
+ }
+ return result;
+ }
+}
+
+hooks.defineLocale('bs', {
+ months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'),
+ monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
+ weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
+ weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[danas u] LT',
+ nextDay : '[sutra u] LT',
+ nextWeek : function () {
+ switch (this.day()) {
+ case 0:
+ return '[u] [nedjelju] [u] LT';
+ case 3:
+ return '[u] [srijedu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ },
+ lastDay : '[jučer u] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ return '[prošlu] dddd [u] LT';
+ case 6:
+ return '[prošle] [subote] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[prošli] dddd [u] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'prije %s',
+ s : 'par sekundi',
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : 'dan',
+ dd : translate,
+ M : 'mjesec',
+ MM : translate,
+ y : 'godinu',
+ yy : translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Catalan [ca]
+//! author : Juan G. Hurtado : https://github.com/juanghurtado
+
+hooks.defineLocale('ca', {
+ months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'),
+ monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'),
+ weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),
+ weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY H:mm',
+ LLLL : 'dddd D MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : function () {
+ return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ nextDay : function () {
+ return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ lastDay : function () {
+ return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ lastWeek : function () {
+ return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'd\'aquí %s',
+ past : 'fa %s',
+ s : 'uns segons',
+ m : 'un minut',
+ mm : '%d minuts',
+ h : 'una hora',
+ hh : '%d hores',
+ d : 'un dia',
+ dd : '%d dies',
+ M : 'un mes',
+ MM : '%d mesos',
+ y : 'un any',
+ yy : '%d anys'
+ },
+ ordinalParse: /\d{1,2}(r|n|t|è|a)/,
+ ordinal : function (number, period) {
+ var output = (number === 1) ? 'r' :
+ (number === 2) ? 'n' :
+ (number === 3) ? 'r' :
+ (number === 4) ? 't' : 'è';
+ if (period === 'w' || period === 'W') {
+ output = 'a';
+ }
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Czech [cs]
+//! author : petrbela : https://github.com/petrbela
+
+var months$3 = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_');
+var monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_');
+function plural$1(n) {
+ return (n > 1) && (n < 5) && (~~(n / 10) !== 1);
+}
+function translate$1(number, withoutSuffix, key, isFuture) {
+ var result = number + ' ';
+ switch (key) {
+ case 's': // a few seconds / in a few seconds / a few seconds ago
+ return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami';
+ case 'm': // a minute / in a minute / a minute ago
+ return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');
+ case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural$1(number) ? 'minuty' : 'minut');
+ } else {
+ return result + 'minutami';
+ }
+ break;
+ case 'h': // an hour / in an hour / an hour ago
+ return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+ case 'hh': // 9 hours / in 9 hours / 9 hours ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural$1(number) ? 'hodiny' : 'hodin');
+ } else {
+ return result + 'hodinami';
+ }
+ break;
+ case 'd': // a day / in a day / a day ago
+ return (withoutSuffix || isFuture) ? 'den' : 'dnem';
+ case 'dd': // 9 days / in 9 days / 9 days ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural$1(number) ? 'dny' : 'dní');
+ } else {
+ return result + 'dny';
+ }
+ break;
+ case 'M': // a month / in a month / a month ago
+ return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';
+ case 'MM': // 9 months / in 9 months / 9 months ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural$1(number) ? 'měsíce' : 'měsíců');
+ } else {
+ return result + 'měsíci';
+ }
+ break;
+ case 'y': // a year / in a year / a year ago
+ return (withoutSuffix || isFuture) ? 'rok' : 'rokem';
+ case 'yy': // 9 years / in 9 years / 9 years ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural$1(number) ? 'roky' : 'let');
+ } else {
+ return result + 'lety';
+ }
+ break;
+ }
+}
+
+hooks.defineLocale('cs', {
+ months : months$3,
+ monthsShort : monthsShort,
+ monthsParse : (function (months, monthsShort) {
+ var i, _monthsParse = [];
+ for (i = 0; i < 12; i++) {
+ // use custom parser to solve problem with July (červenec)
+ _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
+ }
+ return _monthsParse;
+ }(months$3, monthsShort)),
+ shortMonthsParse : (function (monthsShort) {
+ var i, _shortMonthsParse = [];
+ for (i = 0; i < 12; i++) {
+ _shortMonthsParse[i] = new RegExp('^' + monthsShort[i] + '$', 'i');
+ }
+ return _shortMonthsParse;
+ }(monthsShort)),
+ longMonthsParse : (function (months) {
+ var i, _longMonthsParse = [];
+ for (i = 0; i < 12; i++) {
+ _longMonthsParse[i] = new RegExp('^' + months[i] + '$', 'i');
+ }
+ return _longMonthsParse;
+ }(months$3)),
+ weekdays : 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),
+ weekdaysShort : 'ne_po_út_st_čt_pá_so'.split('_'),
+ weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'),
+ longDateFormat : {
+ LT: 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd D. MMMM YYYY H:mm',
+ l : 'D. M. YYYY'
+ },
+ calendar : {
+ sameDay: '[dnes v] LT',
+ nextDay: '[zítra v] LT',
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[v neděli v] LT';
+ case 1:
+ case 2:
+ return '[v] dddd [v] LT';
+ case 3:
+ return '[ve středu v] LT';
+ case 4:
+ return '[ve čtvrtek v] LT';
+ case 5:
+ return '[v pátek v] LT';
+ case 6:
+ return '[v sobotu v] LT';
+ }
+ },
+ lastDay: '[včera v] LT',
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[minulou neděli v] LT';
+ case 1:
+ case 2:
+ return '[minulé] dddd [v] LT';
+ case 3:
+ return '[minulou středu v] LT';
+ case 4:
+ case 5:
+ return '[minulý] dddd [v] LT';
+ case 6:
+ return '[minulou sobotu v] LT';
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'před %s',
+ s : translate$1,
+ m : translate$1,
+ mm : translate$1,
+ h : translate$1,
+ hh : translate$1,
+ d : translate$1,
+ dd : translate$1,
+ M : translate$1,
+ MM : translate$1,
+ y : translate$1,
+ yy : translate$1
+ },
+ ordinalParse : /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Chuvash [cv]
+//! author : Anatoly Mironov : https://github.com/mirontoli
+
+hooks.defineLocale('cv', {
+ months : 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'),
+ monthsShort : 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'),
+ weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'),
+ weekdaysShort : 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'),
+ weekdaysMin : 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD-MM-YYYY',
+ LL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]',
+ LLL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',
+ LLLL : 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm'
+ },
+ calendar : {
+ sameDay: '[Паян] LT [сехетре]',
+ nextDay: '[Ыран] LT [сехетре]',
+ lastDay: '[Ӗнер] LT [сехетре]',
+ nextWeek: '[Ҫитес] dddd LT [сехетре]',
+ lastWeek: '[Иртнӗ] dddd LT [сехетре]',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : function (output) {
+ var affix = /сехет$/i.exec(output) ? 'рен' : /ҫул$/i.exec(output) ? 'тан' : 'ран';
+ return output + affix;
+ },
+ past : '%s каялла',
+ s : 'пӗр-ик ҫеккунт',
+ m : 'пӗр минут',
+ mm : '%d минут',
+ h : 'пӗр сехет',
+ hh : '%d сехет',
+ d : 'пӗр кун',
+ dd : '%d кун',
+ M : 'пӗр уйӑх',
+ MM : '%d уйӑх',
+ y : 'пӗр ҫул',
+ yy : '%d ҫул'
+ },
+ ordinalParse: /\d{1,2}-мӗш/,
+ ordinal : '%d-мӗш',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Welsh [cy]
+//! author : Robert Allen : https://github.com/robgallen
+//! author : https://github.com/ryangreaves
+
+hooks.defineLocale('cy', {
+ months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'),
+ monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'),
+ weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'),
+ weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),
+ weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),
+ weekdaysParseExact : true,
+ // time formats are the same as en-gb
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY HH:mm',
+ LLLL: 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar: {
+ sameDay: '[Heddiw am] LT',
+ nextDay: '[Yfory am] LT',
+ nextWeek: 'dddd [am] LT',
+ lastDay: '[Ddoe am] LT',
+ lastWeek: 'dddd [diwethaf am] LT',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: 'mewn %s',
+ past: '%s yn ôl',
+ s: 'ychydig eiliadau',
+ m: 'munud',
+ mm: '%d munud',
+ h: 'awr',
+ hh: '%d awr',
+ d: 'diwrnod',
+ dd: '%d diwrnod',
+ M: 'mis',
+ MM: '%d mis',
+ y: 'blwyddyn',
+ yy: '%d flynedd'
+ },
+ ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,
+ // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
+ ordinal: function (number) {
+ var b = number,
+ output = '',
+ lookup = [
+ '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed
+ 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed
+ ];
+ if (b > 20) {
+ if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
+ output = 'fed'; // not 30ain, 70ain or 90ain
+ } else {
+ output = 'ain';
+ }
+ } else if (b > 0) {
+ output = lookup[b];
+ }
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Danish [da]
+//! author : Ulrik Nielsen : https://github.com/mrbase
+
+hooks.defineLocale('da', {
+ months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
+ weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
+ weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'),
+ weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY HH:mm',
+ LLLL : 'dddd [d.] D. MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[I dag kl.] LT',
+ nextDay : '[I morgen kl.] LT',
+ nextWeek : 'dddd [kl.] LT',
+ lastDay : '[I går kl.] LT',
+ lastWeek : '[sidste] dddd [kl] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'om %s',
+ past : '%s siden',
+ s : 'få sekunder',
+ m : 'et minut',
+ mm : '%d minutter',
+ h : 'en time',
+ hh : '%d timer',
+ d : 'en dag',
+ dd : '%d dage',
+ M : 'en måned',
+ MM : '%d måneder',
+ y : 'et år',
+ yy : '%d år'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : German (Austria) [de-at]
+//! author : lluchs : https://github.com/lluchs
+//! author: Menelion Elensúle: https://github.com/Oire
+//! author : Martin Groller : https://github.com/MadMG
+//! author : Mikolaj Dadela : https://github.com/mik01aj
+
+function processRelativeTime(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 'm': ['eine Minute', 'einer Minute'],
+ 'h': ['eine Stunde', 'einer Stunde'],
+ 'd': ['ein Tag', 'einem Tag'],
+ 'dd': [number + ' Tage', number + ' Tagen'],
+ 'M': ['ein Monat', 'einem Monat'],
+ 'MM': [number + ' Monate', number + ' Monaten'],
+ 'y': ['ein Jahr', 'einem Jahr'],
+ 'yy': [number + ' Jahre', number + ' Jahren']
+ };
+ return withoutSuffix ? format[key][0] : format[key][1];
+}
+
+hooks.defineLocale('de-at', {
+ months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
+ monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
+ weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
+ weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY HH:mm',
+ LLLL : 'dddd, D. MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[heute um] LT [Uhr]',
+ sameElse: 'L',
+ nextDay: '[morgen um] LT [Uhr]',
+ nextWeek: 'dddd [um] LT [Uhr]',
+ lastDay: '[gestern um] LT [Uhr]',
+ lastWeek: '[letzten] dddd [um] LT [Uhr]'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : 'vor %s',
+ s : 'ein paar Sekunden',
+ m : processRelativeTime,
+ mm : '%d Minuten',
+ h : processRelativeTime,
+ hh : '%d Stunden',
+ d : processRelativeTime,
+ dd : processRelativeTime,
+ M : processRelativeTime,
+ MM : processRelativeTime,
+ y : processRelativeTime,
+ yy : processRelativeTime
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : German [de]
+//! author : lluchs : https://github.com/lluchs
+//! author: Menelion Elensúle: https://github.com/Oire
+//! author : Mikolaj Dadela : https://github.com/mik01aj
+
+function processRelativeTime$1(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 'm': ['eine Minute', 'einer Minute'],
+ 'h': ['eine Stunde', 'einer Stunde'],
+ 'd': ['ein Tag', 'einem Tag'],
+ 'dd': [number + ' Tage', number + ' Tagen'],
+ 'M': ['ein Monat', 'einem Monat'],
+ 'MM': [number + ' Monate', number + ' Monaten'],
+ 'y': ['ein Jahr', 'einem Jahr'],
+ 'yy': [number + ' Jahre', number + ' Jahren']
+ };
+ return withoutSuffix ? format[key][0] : format[key][1];
+}
+
+hooks.defineLocale('de', {
+ months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
+ monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
+ weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
+ weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY HH:mm',
+ LLLL : 'dddd, D. MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[heute um] LT [Uhr]',
+ sameElse: 'L',
+ nextDay: '[morgen um] LT [Uhr]',
+ nextWeek: 'dddd [um] LT [Uhr]',
+ lastDay: '[gestern um] LT [Uhr]',
+ lastWeek: '[letzten] dddd [um] LT [Uhr]'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : 'vor %s',
+ s : 'ein paar Sekunden',
+ m : processRelativeTime$1,
+ mm : '%d Minuten',
+ h : processRelativeTime$1,
+ hh : '%d Stunden',
+ d : processRelativeTime$1,
+ dd : processRelativeTime$1,
+ M : processRelativeTime$1,
+ MM : processRelativeTime$1,
+ y : processRelativeTime$1,
+ yy : processRelativeTime$1
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Maldivian [dv]
+//! author : Jawish Hameed : https://github.com/jawish
+
+var months$4 = [
+ 'ޖެނުއަރީ',
+ 'ފެބްރުއަރީ',
+ 'މާރިޗު',
+ 'އޭޕްރީލު',
+ 'މޭ',
+ 'ޖޫން',
+ 'ޖުލައި',
+ 'އޯގަސްޓު',
+ 'ސެޕްޓެމްބަރު',
+ 'އޮކްޓޯބަރު',
+ 'ނޮވެމްބަރު',
+ 'ޑިސެމްބަރު'
+];
+var weekdays = [
+ 'އާދިއްތަ',
+ 'ހޯމަ',
+ 'އަންގާރަ',
+ 'ބުދަ',
+ 'ބުރާސްފަތި',
+ 'ހުކުރު',
+ 'ހޮނިހިރު'
+];
+
+hooks.defineLocale('dv', {
+ months : months$4,
+ monthsShort : months$4,
+ weekdays : weekdays,
+ weekdaysShort : weekdays,
+ weekdaysMin : 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'),
+ longDateFormat : {
+
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'D/M/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /މކ|މފ/,
+ isPM : function (input) {
+ return 'މފ' === input;
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'މކ';
+ } else {
+ return 'މފ';
+ }
+ },
+ calendar : {
+ sameDay : '[މިއަދު] LT',
+ nextDay : '[މާދަމާ] LT',
+ nextWeek : 'dddd LT',
+ lastDay : '[އިއްޔެ] LT',
+ lastWeek : '[ފާއިތުވި] dddd LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'ތެރޭގައި %s',
+ past : 'ކުރިން %s',
+ s : 'ސިކުންތުކޮޅެއް',
+ m : 'މިނިޓެއް',
+ mm : 'މިނިޓު %d',
+ h : 'ގަޑިއިރެއް',
+ hh : 'ގަޑިއިރު %d',
+ d : 'ދުވަހެއް',
+ dd : 'ދުވަސް %d',
+ M : 'މަހެއް',
+ MM : 'މަސް %d',
+ y : 'އަހަރެއް',
+ yy : 'އަހަރު %d'
+ },
+ preparse: function (string) {
+ return string.replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/,/g, '،');
+ },
+ week : {
+ dow : 7, // Sunday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Greek [el]
+//! author : Aggelos Karalias : https://github.com/mehiel
+
+hooks.defineLocale('el', {
+ monthsNominativeEl : 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'),
+ monthsGenitiveEl : 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'),
+ months : function (momentToFormat, format) {
+ if (/D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM'
+ return this._monthsGenitiveEl[momentToFormat.month()];
+ } else {
+ return this._monthsNominativeEl[momentToFormat.month()];
+ }
+ },
+ monthsShort : 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'),
+ weekdays : 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split('_'),
+ weekdaysShort : 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'),
+ weekdaysMin : 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'),
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'μμ' : 'ΜΜ';
+ } else {
+ return isLower ? 'πμ' : 'ΠΜ';
+ }
+ },
+ isPM : function (input) {
+ return ((input + '').toLowerCase()[0] === 'μ');
+ },
+ meridiemParse : /[ΠΜ]\.?Μ?\.?/i,
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendarEl : {
+ sameDay : '[Σήμερα {}] LT',
+ nextDay : '[Αύριο {}] LT',
+ nextWeek : 'dddd [{}] LT',
+ lastDay : '[Χθες {}] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 6:
+ return '[το προηγούμενο] dddd [{}] LT';
+ default:
+ return '[την προηγούμενη] dddd [{}] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ calendar : function (key, mom) {
+ var output = this._calendarEl[key],
+ hours = mom && mom.hours();
+ if (isFunction(output)) {
+ output = output.apply(mom);
+ }
+ return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις'));
+ },
+ relativeTime : {
+ future : 'σε %s',
+ past : '%s πριν',
+ s : 'λίγα δευτερόλεπτα',
+ m : 'ένα λεπτό',
+ mm : '%d λεπτά',
+ h : 'μία ώρα',
+ hh : '%d ώρες',
+ d : 'μία μέρα',
+ dd : '%d μέρες',
+ M : 'ένας μήνας',
+ MM : '%d μήνες',
+ y : 'ένας χρόνος',
+ yy : '%d χρόνια'
+ },
+ ordinalParse: /\d{1,2}η/,
+ ordinal: '%dη',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : English (Australia) [en-au]
+//! author : Jared Morse : https://github.com/jarcoal
+
+hooks.defineLocale('en-au', {
+ months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+ weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+ weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+ weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : English (Canada) [en-ca]
+//! author : Jonathan Abourbih : https://github.com/jonbca
+
+hooks.defineLocale('en-ca', {
+ months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+ weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+ weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+ weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'YYYY-MM-DD',
+ LL : 'MMMM D, YYYY',
+ LLL : 'MMMM D, YYYY h:mm A',
+ LLLL : 'dddd, MMMM D, YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ }
+});
+
+//! moment.js locale configuration
+//! locale : English (United Kingdom) [en-gb]
+//! author : Chris Gedrim : https://github.com/chrisgedrim
+
+hooks.defineLocale('en-gb', {
+ months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+ weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+ weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+ weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : English (Ireland) [en-ie]
+//! author : Chris Cartlidge : https://github.com/chriscartlidge
+
+hooks.defineLocale('en-ie', {
+ months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+ weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+ weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+ weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD-MM-YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : English (New Zealand) [en-nz]
+//! author : Luke McGregor : https://github.com/lukemcgregor
+
+hooks.defineLocale('en-nz', {
+ months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+ weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+ weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+ weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Esperanto [eo]
+//! author : Colin Dean : https://github.com/colindean
+//! komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
+//! Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
+
+hooks.defineLocale('eo', {
+ months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'),
+ weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato'.split('_'),
+ weekdaysShort : 'Dim_Lun_Mard_Merk_Ĵaŭ_Ven_Sab'.split('_'),
+ weekdaysMin : 'Di_Lu_Ma_Me_Ĵa_Ve_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'YYYY-MM-DD',
+ LL : 'D[-an de] MMMM, YYYY',
+ LLL : 'D[-an de] MMMM, YYYY HH:mm',
+ LLLL : 'dddd, [la] D[-an de] MMMM, YYYY HH:mm'
+ },
+ meridiemParse: /[ap]\.t\.m/i,
+ isPM: function (input) {
+ return input.charAt(0).toLowerCase() === 'p';
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'p.t.m.' : 'P.T.M.';
+ } else {
+ return isLower ? 'a.t.m.' : 'A.T.M.';
+ }
+ },
+ calendar : {
+ sameDay : '[Hodiaŭ je] LT',
+ nextDay : '[Morgaŭ je] LT',
+ nextWeek : 'dddd [je] LT',
+ lastDay : '[Hieraŭ je] LT',
+ lastWeek : '[pasinta] dddd [je] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'je %s',
+ past : 'antaŭ %s',
+ s : 'sekundoj',
+ m : 'minuto',
+ mm : '%d minutoj',
+ h : 'horo',
+ hh : '%d horoj',
+ d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo
+ dd : '%d tagoj',
+ M : 'monato',
+ MM : '%d monatoj',
+ y : 'jaro',
+ yy : '%d jaroj'
+ },
+ ordinalParse: /\d{1,2}a/,
+ ordinal : '%da',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Spanish (Dominican Republic) [es-do]
+
+var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_');
+var monthsShort$1 = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');
+
+hooks.defineLocale('es-do', {
+ months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShort$1[m.month()];
+ } else {
+ return monthsShortDot[m.month()];
+ }
+ },
+ monthsParseExact : true,
+ weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
+ weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
+ weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D [de] MMMM [de] YYYY',
+ LLL : 'D [de] MMMM [de] YYYY h:mm A',
+ LLLL : 'dddd, D [de] MMMM [de] YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : function () {
+ return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ nextDay : function () {
+ return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ lastDay : function () {
+ return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ lastWeek : function () {
+ return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'en %s',
+ past : 'hace %s',
+ s : 'unos segundos',
+ m : 'un minuto',
+ mm : '%d minutos',
+ h : 'una hora',
+ hh : '%d horas',
+ d : 'un día',
+ dd : '%d días',
+ M : 'un mes',
+ MM : '%d meses',
+ y : 'un año',
+ yy : '%d años'
+ },
+ ordinalParse : /\d{1,2}º/,
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Spanish [es]
+//! author : Julio Napurí : https://github.com/julionc
+
+var monthsShortDot$1 = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_');
+var monthsShort$2 = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');
+
+hooks.defineLocale('es', {
+ months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShort$2[m.month()];
+ } else {
+ return monthsShortDot$1[m.month()];
+ }
+ },
+ monthsParseExact : true,
+ weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
+ weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
+ weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D [de] MMMM [de] YYYY',
+ LLL : 'D [de] MMMM [de] YYYY H:mm',
+ LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm'
+ },
+ calendar : {
+ sameDay : function () {
+ return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ nextDay : function () {
+ return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ lastDay : function () {
+ return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ lastWeek : function () {
+ return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'en %s',
+ past : 'hace %s',
+ s : 'unos segundos',
+ m : 'un minuto',
+ mm : '%d minutos',
+ h : 'una hora',
+ hh : '%d horas',
+ d : 'un día',
+ dd : '%d días',
+ M : 'un mes',
+ MM : '%d meses',
+ y : 'un año',
+ yy : '%d años'
+ },
+ ordinalParse : /\d{1,2}º/,
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Estonian [et]
+//! author : Henry Kehlmann : https://github.com/madhenry
+//! improvements : Illimar Tambek : https://github.com/ragulka
+
+function processRelativeTime$2(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'],
+ 'm' : ['ühe minuti', 'üks minut'],
+ 'mm': [number + ' minuti', number + ' minutit'],
+ 'h' : ['ühe tunni', 'tund aega', 'üks tund'],
+ 'hh': [number + ' tunni', number + ' tundi'],
+ 'd' : ['ühe päeva', 'üks päev'],
+ 'M' : ['kuu aja', 'kuu aega', 'üks kuu'],
+ 'MM': [number + ' kuu', number + ' kuud'],
+ 'y' : ['ühe aasta', 'aasta', 'üks aasta'],
+ 'yy': [number + ' aasta', number + ' aastat']
+ };
+ if (withoutSuffix) {
+ return format[key][2] ? format[key][2] : format[key][1];
+ }
+ return isFuture ? format[key][0] : format[key][1];
+}
+
+hooks.defineLocale('et', {
+ months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'),
+ monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),
+ weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'),
+ weekdaysShort : 'P_E_T_K_N_R_L'.split('_'),
+ weekdaysMin : 'P_E_T_K_N_R_L'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[Täna,] LT',
+ nextDay : '[Homme,] LT',
+ nextWeek : '[Järgmine] dddd LT',
+ lastDay : '[Eile,] LT',
+ lastWeek : '[Eelmine] dddd LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s pärast',
+ past : '%s tagasi',
+ s : processRelativeTime$2,
+ m : processRelativeTime$2,
+ mm : processRelativeTime$2,
+ h : processRelativeTime$2,
+ hh : processRelativeTime$2,
+ d : processRelativeTime$2,
+ dd : '%d päeva',
+ M : processRelativeTime$2,
+ MM : processRelativeTime$2,
+ y : processRelativeTime$2,
+ yy : processRelativeTime$2
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Basque [eu]
+//! author : Eneko Illarramendi : https://github.com/eillarra
+
+hooks.defineLocale('eu', {
+ months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'),
+ monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'),
+ weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'),
+ weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'YYYY-MM-DD',
+ LL : 'YYYY[ko] MMMM[ren] D[a]',
+ LLL : 'YYYY[ko] MMMM[ren] D[a] HH:mm',
+ LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm',
+ l : 'YYYY-M-D',
+ ll : 'YYYY[ko] MMM D[a]',
+ lll : 'YYYY[ko] MMM D[a] HH:mm',
+ llll : 'ddd, YYYY[ko] MMM D[a] HH:mm'
+ },
+ calendar : {
+ sameDay : '[gaur] LT[etan]',
+ nextDay : '[bihar] LT[etan]',
+ nextWeek : 'dddd LT[etan]',
+ lastDay : '[atzo] LT[etan]',
+ lastWeek : '[aurreko] dddd LT[etan]',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s barru',
+ past : 'duela %s',
+ s : 'segundo batzuk',
+ m : 'minutu bat',
+ mm : '%d minutu',
+ h : 'ordu bat',
+ hh : '%d ordu',
+ d : 'egun bat',
+ dd : '%d egun',
+ M : 'hilabete bat',
+ MM : '%d hilabete',
+ y : 'urte bat',
+ yy : '%d urte'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Persian [fa]
+//! author : Ebrahim Byagowi : https://github.com/ebraminio
+
+var symbolMap$5 = {
+ '1': '۱',
+ '2': '۲',
+ '3': '۳',
+ '4': '۴',
+ '5': '۵',
+ '6': '۶',
+ '7': '۷',
+ '8': '۸',
+ '9': '۹',
+ '0': '۰'
+};
+var numberMap$4 = {
+ '۱': '1',
+ '۲': '2',
+ '۳': '3',
+ '۴': '4',
+ '۵': '5',
+ '۶': '6',
+ '۷': '7',
+ '۸': '8',
+ '۹': '9',
+ '۰': '0'
+};
+
+hooks.defineLocale('fa', {
+ months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+ monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+ weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
+ weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
+ weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /قبل از ظهر|بعد از ظهر/,
+ isPM: function (input) {
+ return /بعد از ظهر/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'قبل از ظهر';
+ } else {
+ return 'بعد از ظهر';
+ }
+ },
+ calendar : {
+ sameDay : '[امروز ساعت] LT',
+ nextDay : '[فردا ساعت] LT',
+ nextWeek : 'dddd [ساعت] LT',
+ lastDay : '[دیروز ساعت] LT',
+ lastWeek : 'dddd [پیش] [ساعت] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'در %s',
+ past : '%s پیش',
+ s : 'چندین ثانیه',
+ m : 'یک دقیقه',
+ mm : '%d دقیقه',
+ h : 'یک ساعت',
+ hh : '%d ساعت',
+ d : 'یک روز',
+ dd : '%d روز',
+ M : 'یک ماه',
+ MM : '%d ماه',
+ y : 'یک سال',
+ yy : '%d سال'
+ },
+ preparse: function (string) {
+ return string.replace(/[۰-۹]/g, function (match) {
+ return numberMap$4[match];
+ }).replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$5[match];
+ }).replace(/,/g, '،');
+ },
+ ordinalParse: /\d{1,2}م/,
+ ordinal : '%dم',
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Finnish [fi]
+//! author : Tarmo Aidantausta : https://github.com/bleadof
+
+var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' ');
+var numbersFuture = [
+ 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden',
+ numbersPast[7], numbersPast[8], numbersPast[9]
+ ];
+function translate$2(number, withoutSuffix, key, isFuture) {
+ var result = '';
+ switch (key) {
+ case 's':
+ return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
+ case 'm':
+ return isFuture ? 'minuutin' : 'minuutti';
+ case 'mm':
+ result = isFuture ? 'minuutin' : 'minuuttia';
+ break;
+ case 'h':
+ return isFuture ? 'tunnin' : 'tunti';
+ case 'hh':
+ result = isFuture ? 'tunnin' : 'tuntia';
+ break;
+ case 'd':
+ return isFuture ? 'päivän' : 'päivä';
+ case 'dd':
+ result = isFuture ? 'päivän' : 'päivää';
+ break;
+ case 'M':
+ return isFuture ? 'kuukauden' : 'kuukausi';
+ case 'MM':
+ result = isFuture ? 'kuukauden' : 'kuukautta';
+ break;
+ case 'y':
+ return isFuture ? 'vuoden' : 'vuosi';
+ case 'yy':
+ result = isFuture ? 'vuoden' : 'vuotta';
+ break;
+ }
+ result = verbalNumber(number, isFuture) + ' ' + result;
+ return result;
+}
+function verbalNumber(number, isFuture) {
+ return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number;
+}
+
+hooks.defineLocale('fi', {
+ months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'),
+ monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'),
+ weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'),
+ weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'),
+ weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD.MM.YYYY',
+ LL : 'Do MMMM[ta] YYYY',
+ LLL : 'Do MMMM[ta] YYYY, [klo] HH.mm',
+ LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm',
+ l : 'D.M.YYYY',
+ ll : 'Do MMM YYYY',
+ lll : 'Do MMM YYYY, [klo] HH.mm',
+ llll : 'ddd, Do MMM YYYY, [klo] HH.mm'
+ },
+ calendar : {
+ sameDay : '[tänään] [klo] LT',
+ nextDay : '[huomenna] [klo] LT',
+ nextWeek : 'dddd [klo] LT',
+ lastDay : '[eilen] [klo] LT',
+ lastWeek : '[viime] dddd[na] [klo] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s päästä',
+ past : '%s sitten',
+ s : translate$2,
+ m : translate$2,
+ mm : translate$2,
+ h : translate$2,
+ hh : translate$2,
+ d : translate$2,
+ dd : translate$2,
+ M : translate$2,
+ MM : translate$2,
+ y : translate$2,
+ yy : translate$2
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Faroese [fo]
+//! author : Ragnar Johannesen : https://github.com/ragnar123
+
+hooks.defineLocale('fo', {
+ months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
+ weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'),
+ weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'),
+ weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D. MMMM, YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Í dag kl.] LT',
+ nextDay : '[Í morgin kl.] LT',
+ nextWeek : 'dddd [kl.] LT',
+ lastDay : '[Í gjár kl.] LT',
+ lastWeek : '[síðstu] dddd [kl] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'um %s',
+ past : '%s síðani',
+ s : 'fá sekund',
+ m : 'ein minutt',
+ mm : '%d minuttir',
+ h : 'ein tími',
+ hh : '%d tímar',
+ d : 'ein dagur',
+ dd : '%d dagar',
+ M : 'ein mánaði',
+ MM : '%d mánaðir',
+ y : 'eitt ár',
+ yy : '%d ár'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : French (Canada) [fr-ca]
+//! author : Jonathan Abourbih : https://github.com/jonbca
+
+hooks.defineLocale('fr-ca', {
+ months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
+ monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
+ weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
+ weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'YYYY-MM-DD',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Aujourd\'hui à] LT',
+ nextDay: '[Demain à] LT',
+ nextWeek: 'dddd [à] LT',
+ lastDay: '[Hier à] LT',
+ lastWeek: 'dddd [dernier à] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'dans %s',
+ past : 'il y a %s',
+ s : 'quelques secondes',
+ m : 'une minute',
+ mm : '%d minutes',
+ h : 'une heure',
+ hh : '%d heures',
+ d : 'un jour',
+ dd : '%d jours',
+ M : 'un mois',
+ MM : '%d mois',
+ y : 'un an',
+ yy : '%d ans'
+ },
+ ordinalParse: /\d{1,2}(er|e)/,
+ ordinal : function (number) {
+ return number + (number === 1 ? 'er' : 'e');
+ }
+});
+
+//! moment.js locale configuration
+//! locale : French (Switzerland) [fr-ch]
+//! author : Gaspard Bucher : https://github.com/gaspard
+
+hooks.defineLocale('fr-ch', {
+ months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
+ monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
+ weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
+ weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Aujourd\'hui à] LT',
+ nextDay: '[Demain à] LT',
+ nextWeek: 'dddd [à] LT',
+ lastDay: '[Hier à] LT',
+ lastWeek: 'dddd [dernier à] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'dans %s',
+ past : 'il y a %s',
+ s : 'quelques secondes',
+ m : 'une minute',
+ mm : '%d minutes',
+ h : 'une heure',
+ hh : '%d heures',
+ d : 'un jour',
+ dd : '%d jours',
+ M : 'un mois',
+ MM : '%d mois',
+ y : 'un an',
+ yy : '%d ans'
+ },
+ ordinalParse: /\d{1,2}(er|e)/,
+ ordinal : function (number) {
+ return number + (number === 1 ? 'er' : 'e');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : French [fr]
+//! author : John Fischer : https://github.com/jfroffice
+
+hooks.defineLocale('fr', {
+ months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
+ monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
+ weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
+ weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Aujourd\'hui à] LT',
+ nextDay: '[Demain à] LT',
+ nextWeek: 'dddd [à] LT',
+ lastDay: '[Hier à] LT',
+ lastWeek: 'dddd [dernier à] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'dans %s',
+ past : 'il y a %s',
+ s : 'quelques secondes',
+ m : 'une minute',
+ mm : '%d minutes',
+ h : 'une heure',
+ hh : '%d heures',
+ d : 'un jour',
+ dd : '%d jours',
+ M : 'un mois',
+ MM : '%d mois',
+ y : 'un an',
+ yy : '%d ans'
+ },
+ ordinalParse: /\d{1,2}(er|)/,
+ ordinal : function (number) {
+ return number + (number === 1 ? 'er' : '');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Frisian [fy]
+//! author : Robin van der Vliet : https://github.com/robin0van0der0v
+
+var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_');
+var monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_');
+
+hooks.defineLocale('fy', {
+ months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShortWithoutDots[m.month()];
+ } else {
+ return monthsShortWithDots[m.month()];
+ }
+ },
+ monthsParseExact : true,
+ weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'),
+ weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'),
+ weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD-MM-YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[hjoed om] LT',
+ nextDay: '[moarn om] LT',
+ nextWeek: 'dddd [om] LT',
+ lastDay: '[juster om] LT',
+ lastWeek: '[ôfrûne] dddd [om] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'oer %s',
+ past : '%s lyn',
+ s : 'in pear sekonden',
+ m : 'ien minút',
+ mm : '%d minuten',
+ h : 'ien oere',
+ hh : '%d oeren',
+ d : 'ien dei',
+ dd : '%d dagen',
+ M : 'ien moanne',
+ MM : '%d moannen',
+ y : 'ien jier',
+ yy : '%d jierren'
+ },
+ ordinalParse: /\d{1,2}(ste|de)/,
+ ordinal : function (number) {
+ return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Scottish Gaelic [gd]
+//! author : Jon Ashdown : https://github.com/jonashdown
+
+var months$5 = [
+ 'Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd'
+];
+
+var monthsShort$3 = ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh'];
+
+var weekdays$1 = ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne'];
+
+var weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis'];
+
+var weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa'];
+
+hooks.defineLocale('gd', {
+ months : months$5,
+ monthsShort : monthsShort$3,
+ monthsParseExact : true,
+ weekdays : weekdays$1,
+ weekdaysShort : weekdaysShort,
+ weekdaysMin : weekdaysMin,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[An-diugh aig] LT',
+ nextDay : '[A-màireach aig] LT',
+ nextWeek : 'dddd [aig] LT',
+ lastDay : '[An-dè aig] LT',
+ lastWeek : 'dddd [seo chaidh] [aig] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'ann an %s',
+ past : 'bho chionn %s',
+ s : 'beagan diogan',
+ m : 'mionaid',
+ mm : '%d mionaidean',
+ h : 'uair',
+ hh : '%d uairean',
+ d : 'latha',
+ dd : '%d latha',
+ M : 'mìos',
+ MM : '%d mìosan',
+ y : 'bliadhna',
+ yy : '%d bliadhna'
+ },
+ ordinalParse : /\d{1,2}(d|na|mh)/,
+ ordinal : function (number) {
+ var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Galician [gl]
+//! author : Juan G. Hurtado : https://github.com/juanghurtado
+
+hooks.defineLocale('gl', {
+ months : 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split('_'),
+ monthsShort : 'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'),
+ weekdaysShort : 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'),
+ weekdaysMin : 'do_lu_ma_mé_xo_ve_sá'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D [de] MMMM [de] YYYY',
+ LLL : 'D [de] MMMM [de] YYYY H:mm',
+ LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm'
+ },
+ calendar : {
+ sameDay : function () {
+ return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
+ },
+ nextDay : function () {
+ return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
+ },
+ lastDay : function () {
+ return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT';
+ },
+ lastWeek : function () {
+ return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : function (str) {
+ if (str.indexOf('un') === 0) {
+ return 'n' + str;
+ }
+ return 'en ' + str;
+ },
+ past : 'hai %s',
+ s : 'uns segundos',
+ m : 'un minuto',
+ mm : '%d minutos',
+ h : 'unha hora',
+ hh : '%d horas',
+ d : 'un día',
+ dd : '%d días',
+ M : 'un mes',
+ MM : '%d meses',
+ y : 'un ano',
+ yy : '%d anos'
+ },
+ ordinalParse : /\d{1,2}º/,
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Hebrew [he]
+//! author : Tomer Cohen : https://github.com/tomer
+//! author : Moshe Simantov : https://github.com/DevelopmentIL
+//! author : Tal Ater : https://github.com/TalAter
+
+hooks.defineLocale('he', {
+ months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'),
+ monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),
+ weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),
+ weekdaysShort : 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'),
+ weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D [ב]MMMM YYYY',
+ LLL : 'D [ב]MMMM YYYY HH:mm',
+ LLLL : 'dddd, D [ב]MMMM YYYY HH:mm',
+ l : 'D/M/YYYY',
+ ll : 'D MMM YYYY',
+ lll : 'D MMM YYYY HH:mm',
+ llll : 'ddd, D MMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[היום ב־]LT',
+ nextDay : '[מחר ב־]LT',
+ nextWeek : 'dddd [בשעה] LT',
+ lastDay : '[אתמול ב־]LT',
+ lastWeek : '[ביום] dddd [האחרון בשעה] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'בעוד %s',
+ past : 'לפני %s',
+ s : 'מספר שניות',
+ m : 'דקה',
+ mm : '%d דקות',
+ h : 'שעה',
+ hh : function (number) {
+ if (number === 2) {
+ return 'שעתיים';
+ }
+ return number + ' שעות';
+ },
+ d : 'יום',
+ dd : function (number) {
+ if (number === 2) {
+ return 'יומיים';
+ }
+ return number + ' ימים';
+ },
+ M : 'חודש',
+ MM : function (number) {
+ if (number === 2) {
+ return 'חודשיים';
+ }
+ return number + ' חודשים';
+ },
+ y : 'שנה',
+ yy : function (number) {
+ if (number === 2) {
+ return 'שנתיים';
+ } else if (number % 10 === 0 && number !== 10) {
+ return number + ' שנה';
+ }
+ return number + ' שנים';
+ }
+ },
+ meridiemParse: /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,
+ isPM : function (input) {
+ return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 5) {
+ return 'לפנות בוקר';
+ } else if (hour < 10) {
+ return 'בבוקר';
+ } else if (hour < 12) {
+ return isLower ? 'לפנה"צ' : 'לפני הצהריים';
+ } else if (hour < 18) {
+ return isLower ? 'אחה"צ' : 'אחרי הצהריים';
+ } else {
+ return 'בערב';
+ }
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Hindi [hi]
+//! author : Mayank Singhal : https://github.com/mayanksinghal
+
+var symbolMap$6 = {
+ '1': '१',
+ '2': '२',
+ '3': '३',
+ '4': '४',
+ '5': '५',
+ '6': '६',
+ '7': '७',
+ '8': '८',
+ '9': '९',
+ '0': '०'
+};
+var numberMap$5 = {
+ '१': '1',
+ '२': '2',
+ '३': '3',
+ '४': '4',
+ '५': '5',
+ '६': '6',
+ '७': '7',
+ '८': '8',
+ '९': '9',
+ '०': '0'
+};
+
+hooks.defineLocale('hi', {
+ months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'),
+ monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
+ weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'),
+ weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm बजे',
+ LTS : 'A h:mm:ss बजे',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm बजे',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm बजे'
+ },
+ calendar : {
+ sameDay : '[आज] LT',
+ nextDay : '[कल] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[कल] LT',
+ lastWeek : '[पिछले] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s में',
+ past : '%s पहले',
+ s : 'कुछ ही क्षण',
+ m : 'एक मिनट',
+ mm : '%d मिनट',
+ h : 'एक घंटा',
+ hh : '%d घंटे',
+ d : 'एक दिन',
+ dd : '%d दिन',
+ M : 'एक महीने',
+ MM : '%d महीने',
+ y : 'एक वर्ष',
+ yy : '%d वर्ष'
+ },
+ preparse: function (string) {
+ return string.replace(/[१२३४५६७८९०]/g, function (match) {
+ return numberMap$5[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$6[match];
+ });
+ },
+ // Hindi notation for meridiems are quite fuzzy in practice. While there exists
+ // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
+ meridiemParse: /रात|सुबह|दोपहर|शाम/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'रात') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'सुबह') {
+ return hour;
+ } else if (meridiem === 'दोपहर') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'शाम') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'रात';
+ } else if (hour < 10) {
+ return 'सुबह';
+ } else if (hour < 17) {
+ return 'दोपहर';
+ } else if (hour < 20) {
+ return 'शाम';
+ } else {
+ return 'रात';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Croatian [hr]
+//! author : Bojan Marković : https://github.com/bmarkovic
+
+function translate$3(number, withoutSuffix, key) {
+ var result = number + ' ';
+ switch (key) {
+ case 'm':
+ return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+ case 'mm':
+ if (number === 1) {
+ result += 'minuta';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'minute';
+ } else {
+ result += 'minuta';
+ }
+ return result;
+ case 'h':
+ return withoutSuffix ? 'jedan sat' : 'jednog sata';
+ case 'hh':
+ if (number === 1) {
+ result += 'sat';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'sata';
+ } else {
+ result += 'sati';
+ }
+ return result;
+ case 'dd':
+ if (number === 1) {
+ result += 'dan';
+ } else {
+ result += 'dana';
+ }
+ return result;
+ case 'MM':
+ if (number === 1) {
+ result += 'mjesec';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'mjeseca';
+ } else {
+ result += 'mjeseci';
+ }
+ return result;
+ case 'yy':
+ if (number === 1) {
+ result += 'godina';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'godine';
+ } else {
+ result += 'godina';
+ }
+ return result;
+ }
+}
+
+hooks.defineLocale('hr', {
+ months : {
+ format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_'),
+ standalone: 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_')
+ },
+ monthsShort : 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
+ weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
+ weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[danas u] LT',
+ nextDay : '[sutra u] LT',
+ nextWeek : function () {
+ switch (this.day()) {
+ case 0:
+ return '[u] [nedjelju] [u] LT';
+ case 3:
+ return '[u] [srijedu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ },
+ lastDay : '[jučer u] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ return '[prošlu] dddd [u] LT';
+ case 6:
+ return '[prošle] [subote] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[prošli] dddd [u] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'prije %s',
+ s : 'par sekundi',
+ m : translate$3,
+ mm : translate$3,
+ h : translate$3,
+ hh : translate$3,
+ d : 'dan',
+ dd : translate$3,
+ M : 'mjesec',
+ MM : translate$3,
+ y : 'godinu',
+ yy : translate$3
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Hungarian [hu]
+//! author : Adam Brunner : https://github.com/adambrunner
+
+var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
+function translate$4(number, withoutSuffix, key, isFuture) {
+ var num = number,
+ suffix;
+ switch (key) {
+ case 's':
+ return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce';
+ case 'm':
+ return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
+ case 'mm':
+ return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
+ case 'h':
+ return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
+ case 'hh':
+ return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
+ case 'd':
+ return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
+ case 'dd':
+ return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
+ case 'M':
+ return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+ case 'MM':
+ return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+ case 'y':
+ return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
+ case 'yy':
+ return num + (isFuture || withoutSuffix ? ' év' : ' éve');
+ }
+ return '';
+}
+function week(isFuture) {
+ return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]';
+}
+
+hooks.defineLocale('hu', {
+ months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'),
+ monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'),
+ weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'),
+ weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'),
+ weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'YYYY.MM.DD.',
+ LL : 'YYYY. MMMM D.',
+ LLL : 'YYYY. MMMM D. H:mm',
+ LLLL : 'YYYY. MMMM D., dddd H:mm'
+ },
+ meridiemParse: /de|du/i,
+ isPM: function (input) {
+ return input.charAt(1).toLowerCase() === 'u';
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 12) {
+ return isLower === true ? 'de' : 'DE';
+ } else {
+ return isLower === true ? 'du' : 'DU';
+ }
+ },
+ calendar : {
+ sameDay : '[ma] LT[-kor]',
+ nextDay : '[holnap] LT[-kor]',
+ nextWeek : function () {
+ return week.call(this, true);
+ },
+ lastDay : '[tegnap] LT[-kor]',
+ lastWeek : function () {
+ return week.call(this, false);
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s múlva',
+ past : '%s',
+ s : translate$4,
+ m : translate$4,
+ mm : translate$4,
+ h : translate$4,
+ hh : translate$4,
+ d : translate$4,
+ dd : translate$4,
+ M : translate$4,
+ MM : translate$4,
+ y : translate$4,
+ yy : translate$4
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Armenian [hy-am]
+//! author : Armendarabyan : https://github.com/armendarabyan
+
+hooks.defineLocale('hy-am', {
+ months : {
+ format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'),
+ standalone: 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_')
+ },
+ monthsShort : 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'),
+ weekdays : 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'),
+ weekdaysShort : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
+ weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY թ.',
+ LLL : 'D MMMM YYYY թ., HH:mm',
+ LLLL : 'dddd, D MMMM YYYY թ., HH:mm'
+ },
+ calendar : {
+ sameDay: '[այսօր] LT',
+ nextDay: '[վաղը] LT',
+ lastDay: '[երեկ] LT',
+ nextWeek: function () {
+ return 'dddd [օրը ժամը] LT';
+ },
+ lastWeek: function () {
+ return '[անցած] dddd [օրը ժամը] LT';
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : '%s հետո',
+ past : '%s առաջ',
+ s : 'մի քանի վայրկյան',
+ m : 'րոպե',
+ mm : '%d րոպե',
+ h : 'ժամ',
+ hh : '%d ժամ',
+ d : 'օր',
+ dd : '%d օր',
+ M : 'ամիս',
+ MM : '%d ամիս',
+ y : 'տարի',
+ yy : '%d տարի'
+ },
+ meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,
+ isPM: function (input) {
+ return /^(ցերեկվա|երեկոյան)$/.test(input);
+ },
+ meridiem : function (hour) {
+ if (hour < 4) {
+ return 'գիշերվա';
+ } else if (hour < 12) {
+ return 'առավոտվա';
+ } else if (hour < 17) {
+ return 'ցերեկվա';
+ } else {
+ return 'երեկոյան';
+ }
+ },
+ ordinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/,
+ ordinal: function (number, period) {
+ switch (period) {
+ case 'DDD':
+ case 'w':
+ case 'W':
+ case 'DDDo':
+ if (number === 1) {
+ return number + '-ին';
+ }
+ return number + '-րդ';
+ default:
+ return number;
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Indonesian [id]
+//! author : Mohammad Satrio Utomo : https://github.com/tyok
+//! reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
+
+hooks.defineLocale('id', {
+ months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'),
+ weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),
+ weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'),
+ weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [pukul] HH.mm',
+ LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+ },
+ meridiemParse: /pagi|siang|sore|malam/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'pagi') {
+ return hour;
+ } else if (meridiem === 'siang') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'sore' || meridiem === 'malam') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'pagi';
+ } else if (hours < 15) {
+ return 'siang';
+ } else if (hours < 19) {
+ return 'sore';
+ } else {
+ return 'malam';
+ }
+ },
+ calendar : {
+ sameDay : '[Hari ini pukul] LT',
+ nextDay : '[Besok pukul] LT',
+ nextWeek : 'dddd [pukul] LT',
+ lastDay : '[Kemarin pukul] LT',
+ lastWeek : 'dddd [lalu pukul] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'dalam %s',
+ past : '%s yang lalu',
+ s : 'beberapa detik',
+ m : 'semenit',
+ mm : '%d menit',
+ h : 'sejam',
+ hh : '%d jam',
+ d : 'sehari',
+ dd : '%d hari',
+ M : 'sebulan',
+ MM : '%d bulan',
+ y : 'setahun',
+ yy : '%d tahun'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Icelandic [is]
+//! author : Hinrik Örn Sigurðsson : https://github.com/hinrik
+
+function plural$2(n) {
+ if (n % 100 === 11) {
+ return true;
+ } else if (n % 10 === 1) {
+ return false;
+ }
+ return true;
+}
+function translate$5(number, withoutSuffix, key, isFuture) {
+ var result = number + ' ';
+ switch (key) {
+ case 's':
+ return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum';
+ case 'm':
+ return withoutSuffix ? 'mínúta' : 'mínútu';
+ case 'mm':
+ if (plural$2(number)) {
+ return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');
+ } else if (withoutSuffix) {
+ return result + 'mínúta';
+ }
+ return result + 'mínútu';
+ case 'hh':
+ if (plural$2(number)) {
+ return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');
+ }
+ return result + 'klukkustund';
+ case 'd':
+ if (withoutSuffix) {
+ return 'dagur';
+ }
+ return isFuture ? 'dag' : 'degi';
+ case 'dd':
+ if (plural$2(number)) {
+ if (withoutSuffix) {
+ return result + 'dagar';
+ }
+ return result + (isFuture ? 'daga' : 'dögum');
+ } else if (withoutSuffix) {
+ return result + 'dagur';
+ }
+ return result + (isFuture ? 'dag' : 'degi');
+ case 'M':
+ if (withoutSuffix) {
+ return 'mánuður';
+ }
+ return isFuture ? 'mánuð' : 'mánuði';
+ case 'MM':
+ if (plural$2(number)) {
+ if (withoutSuffix) {
+ return result + 'mánuðir';
+ }
+ return result + (isFuture ? 'mánuði' : 'mánuðum');
+ } else if (withoutSuffix) {
+ return result + 'mánuður';
+ }
+ return result + (isFuture ? 'mánuð' : 'mánuði');
+ case 'y':
+ return withoutSuffix || isFuture ? 'ár' : 'ári';
+ case 'yy':
+ if (plural$2(number)) {
+ return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
+ }
+ return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
+ }
+}
+
+hooks.defineLocale('is', {
+ months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'),
+ weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'),
+ weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'),
+ weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY [kl.] H:mm',
+ LLLL : 'dddd, D. MMMM YYYY [kl.] H:mm'
+ },
+ calendar : {
+ sameDay : '[í dag kl.] LT',
+ nextDay : '[á morgun kl.] LT',
+ nextWeek : 'dddd [kl.] LT',
+ lastDay : '[í gær kl.] LT',
+ lastWeek : '[síðasta] dddd [kl.] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'eftir %s',
+ past : 'fyrir %s síðan',
+ s : translate$5,
+ m : translate$5,
+ mm : translate$5,
+ h : 'klukkustund',
+ hh : translate$5,
+ d : translate$5,
+ dd : translate$5,
+ M : translate$5,
+ MM : translate$5,
+ y : translate$5,
+ yy : translate$5
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Italian [it]
+//! author : Lorenzo : https://github.com/aliem
+//! author: Mattia Larentis: https://github.com/nostalgiaz
+
+hooks.defineLocale('it', {
+ months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'),
+ monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
+ weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'),
+ weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'),
+ weekdaysMin : 'Do_Lu_Ma_Me_Gi_Ve_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Oggi alle] LT',
+ nextDay: '[Domani alle] LT',
+ nextWeek: 'dddd [alle] LT',
+ lastDay: '[Ieri alle] LT',
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[la scorsa] dddd [alle] LT';
+ default:
+ return '[lo scorso] dddd [alle] LT';
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : function (s) {
+ return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s;
+ },
+ past : '%s fa',
+ s : 'alcuni secondi',
+ m : 'un minuto',
+ mm : '%d minuti',
+ h : 'un\'ora',
+ hh : '%d ore',
+ d : 'un giorno',
+ dd : '%d giorni',
+ M : 'un mese',
+ MM : '%d mesi',
+ y : 'un anno',
+ yy : '%d anni'
+ },
+ ordinalParse : /\d{1,2}º/,
+ ordinal: '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Japanese [ja]
+//! author : LI Long : https://github.com/baryon
+
+hooks.defineLocale('ja', {
+ months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+ monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+ weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),
+ weekdaysShort : '日_月_火_水_木_金_土'.split('_'),
+ weekdaysMin : '日_月_火_水_木_金_土'.split('_'),
+ longDateFormat : {
+ LT : 'Ah時m分',
+ LTS : 'Ah時m分s秒',
+ L : 'YYYY/MM/DD',
+ LL : 'YYYY年M月D日',
+ LLL : 'YYYY年M月D日Ah時m分',
+ LLLL : 'YYYY年M月D日Ah時m分 dddd'
+ },
+ meridiemParse: /午前|午後/i,
+ isPM : function (input) {
+ return input === '午後';
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return '午前';
+ } else {
+ return '午後';
+ }
+ },
+ calendar : {
+ sameDay : '[今日] LT',
+ nextDay : '[明日] LT',
+ nextWeek : '[来週]dddd LT',
+ lastDay : '[昨日] LT',
+ lastWeek : '[前週]dddd LT',
+ sameElse : 'L'
+ },
+ ordinalParse : /\d{1,2}日/,
+ ordinal : function (number, period) {
+ switch (period) {
+ case 'd':
+ case 'D':
+ case 'DDD':
+ return number + '日';
+ default:
+ return number;
+ }
+ },
+ relativeTime : {
+ future : '%s後',
+ past : '%s前',
+ s : '数秒',
+ m : '1分',
+ mm : '%d分',
+ h : '1時間',
+ hh : '%d時間',
+ d : '1日',
+ dd : '%d日',
+ M : '1ヶ月',
+ MM : '%dヶ月',
+ y : '1年',
+ yy : '%d年'
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Javanese [jv]
+//! author : Rony Lantip : https://github.com/lantip
+//! reference: http://jv.wikipedia.org/wiki/Basa_Jawa
+
+hooks.defineLocale('jv', {
+ months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'),
+ weekdays : 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'),
+ weekdaysShort : 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'),
+ weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [pukul] HH.mm',
+ LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+ },
+ meridiemParse: /enjing|siyang|sonten|ndalu/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'enjing') {
+ return hour;
+ } else if (meridiem === 'siyang') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'sonten' || meridiem === 'ndalu') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'enjing';
+ } else if (hours < 15) {
+ return 'siyang';
+ } else if (hours < 19) {
+ return 'sonten';
+ } else {
+ return 'ndalu';
+ }
+ },
+ calendar : {
+ sameDay : '[Dinten puniko pukul] LT',
+ nextDay : '[Mbenjang pukul] LT',
+ nextWeek : 'dddd [pukul] LT',
+ lastDay : '[Kala wingi pukul] LT',
+ lastWeek : 'dddd [kepengker pukul] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'wonten ing %s',
+ past : '%s ingkang kepengker',
+ s : 'sawetawis detik',
+ m : 'setunggal menit',
+ mm : '%d menit',
+ h : 'setunggal jam',
+ hh : '%d jam',
+ d : 'sedinten',
+ dd : '%d dinten',
+ M : 'sewulan',
+ MM : '%d wulan',
+ y : 'setaun',
+ yy : '%d taun'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Georgian [ka]
+//! author : Irakli Janiashvili : https://github.com/irakli-janiashvili
+
+hooks.defineLocale('ka', {
+ months : {
+ standalone: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),
+ format: 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_')
+ },
+ monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),
+ weekdays : {
+ standalone: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),
+ format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_'),
+ isFormat: /(წინა|შემდეგ)/
+ },
+ weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),
+ weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[დღეს] LT[-ზე]',
+ nextDay : '[ხვალ] LT[-ზე]',
+ lastDay : '[გუშინ] LT[-ზე]',
+ nextWeek : '[შემდეგ] dddd LT[-ზე]',
+ lastWeek : '[წინა] dddd LT-ზე',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : function (s) {
+ return (/(წამი|წუთი|საათი|წელი)/).test(s) ?
+ s.replace(/ი$/, 'ში') :
+ s + 'ში';
+ },
+ past : function (s) {
+ if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) {
+ return s.replace(/(ი|ე)$/, 'ის წინ');
+ }
+ if ((/წელი/).test(s)) {
+ return s.replace(/წელი$/, 'წლის წინ');
+ }
+ },
+ s : 'რამდენიმე წამი',
+ m : 'წუთი',
+ mm : '%d წუთი',
+ h : 'საათი',
+ hh : '%d საათი',
+ d : 'დღე',
+ dd : '%d დღე',
+ M : 'თვე',
+ MM : '%d თვე',
+ y : 'წელი',
+ yy : '%d წელი'
+ },
+ ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,
+ ordinal : function (number) {
+ if (number === 0) {
+ return number;
+ }
+ if (number === 1) {
+ return number + '-ლი';
+ }
+ if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) {
+ return 'მე-' + number;
+ }
+ return number + '-ე';
+ },
+ week : {
+ dow : 1,
+ doy : 7
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Kazakh [kk]
+//! authors : Nurlan Rakhimzhanov : https://github.com/nurlan
+
+var suffixes$1 = {
+ 0: '-ші',
+ 1: '-ші',
+ 2: '-ші',
+ 3: '-ші',
+ 4: '-ші',
+ 5: '-ші',
+ 6: '-шы',
+ 7: '-ші',
+ 8: '-ші',
+ 9: '-шы',
+ 10: '-шы',
+ 20: '-шы',
+ 30: '-шы',
+ 40: '-шы',
+ 50: '-ші',
+ 60: '-шы',
+ 70: '-ші',
+ 80: '-ші',
+ 90: '-шы',
+ 100: '-ші'
+};
+
+hooks.defineLocale('kk', {
+ months : 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split('_'),
+ monthsShort : 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'),
+ weekdays : 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split('_'),
+ weekdaysShort : 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'),
+ weekdaysMin : 'жк_дй_сй_ср_бй_жм_сн'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Бүгін сағат] LT',
+ nextDay : '[Ертең сағат] LT',
+ nextWeek : 'dddd [сағат] LT',
+ lastDay : '[Кеше сағат] LT',
+ lastWeek : '[Өткен аптаның] dddd [сағат] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s ішінде',
+ past : '%s бұрын',
+ s : 'бірнеше секунд',
+ m : 'бір минут',
+ mm : '%d минут',
+ h : 'бір сағат',
+ hh : '%d сағат',
+ d : 'бір күн',
+ dd : '%d күн',
+ M : 'бір ай',
+ MM : '%d ай',
+ y : 'бір жыл',
+ yy : '%d жыл'
+ },
+ ordinalParse: /\d{1,2}-(ші|шы)/,
+ ordinal : function (number) {
+ var a = number % 10,
+ b = number >= 100 ? 100 : null;
+ return number + (suffixes$1[number] || suffixes$1[a] || suffixes$1[b]);
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Cambodian [km]
+//! author : Kruy Vanna : https://github.com/kruyvanna
+
+hooks.defineLocale('km', {
+ months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
+ monthsShort: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
+ weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
+ weekdaysShort: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
+ weekdaysMin: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY HH:mm',
+ LLLL: 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar: {
+ sameDay: '[ថ្ងៃនេះ ម៉ោង] LT',
+ nextDay: '[ស្អែក ម៉ោង] LT',
+ nextWeek: 'dddd [ម៉ោង] LT',
+ lastDay: '[ម្សិលមិញ ម៉ោង] LT',
+ lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: '%sទៀត',
+ past: '%sមុន',
+ s: 'ប៉ុន្មានវិនាទី',
+ m: 'មួយនាទី',
+ mm: '%d នាទី',
+ h: 'មួយម៉ោង',
+ hh: '%d ម៉ោង',
+ d: 'មួយថ្ងៃ',
+ dd: '%d ថ្ងៃ',
+ M: 'មួយខែ',
+ MM: '%d ខែ',
+ y: 'មួយឆ្នាំ',
+ yy: '%d ឆ្នាំ'
+ },
+ week: {
+ dow: 1, // Monday is the first day of the week.
+ doy: 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Korean [ko]
+//! author : Kyungwook, Park : https://github.com/kyungw00k
+//! author : Jeeeyul Lee <jeeeyul@gmail.com>
+
+hooks.defineLocale('ko', {
+ months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
+ monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
+ weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),
+ weekdaysShort : '일_월_화_수_목_금_토'.split('_'),
+ weekdaysMin : '일_월_화_수_목_금_토'.split('_'),
+ longDateFormat : {
+ LT : 'A h시 m분',
+ LTS : 'A h시 m분 s초',
+ L : 'YYYY.MM.DD',
+ LL : 'YYYY년 MMMM D일',
+ LLL : 'YYYY년 MMMM D일 A h시 m분',
+ LLLL : 'YYYY년 MMMM D일 dddd A h시 m분'
+ },
+ calendar : {
+ sameDay : '오늘 LT',
+ nextDay : '내일 LT',
+ nextWeek : 'dddd LT',
+ lastDay : '어제 LT',
+ lastWeek : '지난주 dddd LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s 후',
+ past : '%s 전',
+ s : '몇 초',
+ ss : '%d초',
+ m : '일분',
+ mm : '%d분',
+ h : '한 시간',
+ hh : '%d시간',
+ d : '하루',
+ dd : '%d일',
+ M : '한 달',
+ MM : '%d달',
+ y : '일 년',
+ yy : '%d년'
+ },
+ ordinalParse : /\d{1,2}일/,
+ ordinal : '%d일',
+ meridiemParse : /오전|오후/,
+ isPM : function (token) {
+ return token === '오후';
+ },
+ meridiem : function (hour, minute, isUpper) {
+ return hour < 12 ? '오전' : '오후';
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Kyrgyz [ky]
+//! author : Chyngyz Arystan uulu : https://github.com/chyngyz
+
+
+var suffixes$2 = {
+ 0: '-чү',
+ 1: '-чи',
+ 2: '-чи',
+ 3: '-чү',
+ 4: '-чү',
+ 5: '-чи',
+ 6: '-чы',
+ 7: '-чи',
+ 8: '-чи',
+ 9: '-чу',
+ 10: '-чу',
+ 20: '-чы',
+ 30: '-чу',
+ 40: '-чы',
+ 50: '-чү',
+ 60: '-чы',
+ 70: '-чи',
+ 80: '-чи',
+ 90: '-чу',
+ 100: '-чү'
+};
+
+hooks.defineLocale('ky', {
+ months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
+ monthsShort : 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),
+ weekdays : 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split('_'),
+ weekdaysShort : 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'),
+ weekdaysMin : 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Бүгүн саат] LT',
+ nextDay : '[Эртең саат] LT',
+ nextWeek : 'dddd [саат] LT',
+ lastDay : '[Кече саат] LT',
+ lastWeek : '[Өткен аптанын] dddd [күнү] [саат] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s ичинде',
+ past : '%s мурун',
+ s : 'бирнече секунд',
+ m : 'бир мүнөт',
+ mm : '%d мүнөт',
+ h : 'бир саат',
+ hh : '%d саат',
+ d : 'бир күн',
+ dd : '%d күн',
+ M : 'бир ай',
+ MM : '%d ай',
+ y : 'бир жыл',
+ yy : '%d жыл'
+ },
+ ordinalParse: /\d{1,2}-(чи|чы|чү|чу)/,
+ ordinal : function (number) {
+ var a = number % 10,
+ b = number >= 100 ? 100 : null;
+ return number + (suffixes$2[number] || suffixes$2[a] || suffixes$2[b]);
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Luxembourgish [lb]
+//! author : mweimerskirch : https://github.com/mweimerskirch
+//! author : David Raison : https://github.com/kwisatz
+
+function processRelativeTime$3(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 'm': ['eng Minutt', 'enger Minutt'],
+ 'h': ['eng Stonn', 'enger Stonn'],
+ 'd': ['een Dag', 'engem Dag'],
+ 'M': ['ee Mount', 'engem Mount'],
+ 'y': ['ee Joer', 'engem Joer']
+ };
+ return withoutSuffix ? format[key][0] : format[key][1];
+}
+function processFutureTime(string) {
+ var number = string.substr(0, string.indexOf(' '));
+ if (eifelerRegelAppliesToNumber(number)) {
+ return 'a ' + string;
+ }
+ return 'an ' + string;
+}
+function processPastTime(string) {
+ var number = string.substr(0, string.indexOf(' '));
+ if (eifelerRegelAppliesToNumber(number)) {
+ return 'viru ' + string;
+ }
+ return 'virun ' + string;
+}
+/**
+ * Returns true if the word before the given number loses the '-n' ending.
+ * e.g. 'an 10 Deeg' but 'a 5 Deeg'
+ *
+ * @param number {integer}
+ * @returns {boolean}
+ */
+function eifelerRegelAppliesToNumber(number) {
+ number = parseInt(number, 10);
+ if (isNaN(number)) {
+ return false;
+ }
+ if (number < 0) {
+ // Negative Number --> always true
+ return true;
+ } else if (number < 10) {
+ // Only 1 digit
+ if (4 <= number && number <= 7) {
+ return true;
+ }
+ return false;
+ } else if (number < 100) {
+ // 2 digits
+ var lastDigit = number % 10, firstDigit = number / 10;
+ if (lastDigit === 0) {
+ return eifelerRegelAppliesToNumber(firstDigit);
+ }
+ return eifelerRegelAppliesToNumber(lastDigit);
+ } else if (number < 10000) {
+ // 3 or 4 digits --> recursively check first digit
+ while (number >= 10) {
+ number = number / 10;
+ }
+ return eifelerRegelAppliesToNumber(number);
+ } else {
+ // Anything larger than 4 digits: recursively check first n-3 digits
+ number = number / 1000;
+ return eifelerRegelAppliesToNumber(number);
+ }
+}
+
+hooks.defineLocale('lb', {
+ months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
+ monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+ monthsParseExact : true,
+ weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'),
+ weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'),
+ weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat: {
+ LT: 'H:mm [Auer]',
+ LTS: 'H:mm:ss [Auer]',
+ L: 'DD.MM.YYYY',
+ LL: 'D. MMMM YYYY',
+ LLL: 'D. MMMM YYYY H:mm [Auer]',
+ LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]'
+ },
+ calendar: {
+ sameDay: '[Haut um] LT',
+ sameElse: 'L',
+ nextDay: '[Muer um] LT',
+ nextWeek: 'dddd [um] LT',
+ lastDay: '[Gëschter um] LT',
+ lastWeek: function () {
+ // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule
+ switch (this.day()) {
+ case 2:
+ case 4:
+ return '[Leschten] dddd [um] LT';
+ default:
+ return '[Leschte] dddd [um] LT';
+ }
+ }
+ },
+ relativeTime : {
+ future : processFutureTime,
+ past : processPastTime,
+ s : 'e puer Sekonnen',
+ m : processRelativeTime$3,
+ mm : '%d Minutten',
+ h : processRelativeTime$3,
+ hh : '%d Stonnen',
+ d : processRelativeTime$3,
+ dd : '%d Deeg',
+ M : processRelativeTime$3,
+ MM : '%d Méint',
+ y : processRelativeTime$3,
+ yy : '%d Joer'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal: '%d.',
+ week: {
+ dow: 1, // Monday is the first day of the week.
+ doy: 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Lao [lo]
+//! author : Ryan Hart : https://github.com/ryanhart2
+
+hooks.defineLocale('lo', {
+ months : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'),
+ monthsShort : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'),
+ weekdays : 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
+ weekdaysShort : 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
+ weekdaysMin : 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'ວັນdddd D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/,
+ isPM: function (input) {
+ return input === 'ຕອນແລງ';
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'ຕອນເຊົ້າ';
+ } else {
+ return 'ຕອນແລງ';
+ }
+ },
+ calendar : {
+ sameDay : '[ມື້ນີ້ເວລາ] LT',
+ nextDay : '[ມື້ອື່ນເວລາ] LT',
+ nextWeek : '[ວັນ]dddd[ໜ້າເວລາ] LT',
+ lastDay : '[ມື້ວານນີ້ເວລາ] LT',
+ lastWeek : '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'ອີກ %s',
+ past : '%sຜ່ານມາ',
+ s : 'ບໍ່ເທົ່າໃດວິນາທີ',
+ m : '1 ນາທີ',
+ mm : '%d ນາທີ',
+ h : '1 ຊົ່ວໂມງ',
+ hh : '%d ຊົ່ວໂມງ',
+ d : '1 ມື້',
+ dd : '%d ມື້',
+ M : '1 ເດືອນ',
+ MM : '%d ເດືອນ',
+ y : '1 ປີ',
+ yy : '%d ປີ'
+ },
+ ordinalParse: /(ທີ່)\d{1,2}/,
+ ordinal : function (number) {
+ return 'ທີ່' + number;
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Lithuanian [lt]
+//! author : Mindaugas Mozūras : https://github.com/mmozuras
+
+var units = {
+ 'm' : 'minutė_minutės_minutę',
+ 'mm': 'minutės_minučių_minutes',
+ 'h' : 'valanda_valandos_valandą',
+ 'hh': 'valandos_valandų_valandas',
+ 'd' : 'diena_dienos_dieną',
+ 'dd': 'dienos_dienų_dienas',
+ 'M' : 'mėnuo_mėnesio_mėnesį',
+ 'MM': 'mėnesiai_mėnesių_mėnesius',
+ 'y' : 'metai_metų_metus',
+ 'yy': 'metai_metų_metus'
+};
+function translateSeconds(number, withoutSuffix, key, isFuture) {
+ if (withoutSuffix) {
+ return 'kelios sekundės';
+ } else {
+ return isFuture ? 'kelių sekundžių' : 'kelias sekundes';
+ }
+}
+function translateSingular(number, withoutSuffix, key, isFuture) {
+ return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]);
+}
+function special(number) {
+ return number % 10 === 0 || (number > 10 && number < 20);
+}
+function forms(key) {
+ return units[key].split('_');
+}
+function translate$6(number, withoutSuffix, key, isFuture) {
+ var result = number + ' ';
+ if (number === 1) {
+ return result + translateSingular(number, withoutSuffix, key[0], isFuture);
+ } else if (withoutSuffix) {
+ return result + (special(number) ? forms(key)[1] : forms(key)[0]);
+ } else {
+ if (isFuture) {
+ return result + forms(key)[1];
+ } else {
+ return result + (special(number) ? forms(key)[1] : forms(key)[2]);
+ }
+ }
+}
+hooks.defineLocale('lt', {
+ months : {
+ format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'),
+ standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'),
+ isFormat: /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/
+ },
+ monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),
+ weekdays : {
+ format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split('_'),
+ standalone: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'),
+ isFormat: /dddd HH:mm/
+ },
+ weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'),
+ weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'YYYY-MM-DD',
+ LL : 'YYYY [m.] MMMM D [d.]',
+ LLL : 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
+ LLLL : 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]',
+ l : 'YYYY-MM-DD',
+ ll : 'YYYY [m.] MMMM D [d.]',
+ lll : 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
+ llll : 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]'
+ },
+ calendar : {
+ sameDay : '[Šiandien] LT',
+ nextDay : '[Rytoj] LT',
+ nextWeek : 'dddd LT',
+ lastDay : '[Vakar] LT',
+ lastWeek : '[Praėjusį] dddd LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'po %s',
+ past : 'prieš %s',
+ s : translateSeconds,
+ m : translateSingular,
+ mm : translate$6,
+ h : translateSingular,
+ hh : translate$6,
+ d : translateSingular,
+ dd : translate$6,
+ M : translateSingular,
+ MM : translate$6,
+ y : translateSingular,
+ yy : translate$6
+ },
+ ordinalParse: /\d{1,2}-oji/,
+ ordinal : function (number) {
+ return number + '-oji';
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Latvian [lv]
+//! author : Kristaps Karlsons : https://github.com/skakri
+//! author : Jānis Elmeris : https://github.com/JanisE
+
+var units$1 = {
+ 'm': 'minūtes_minūtēm_minūte_minūtes'.split('_'),
+ 'mm': 'minūtes_minūtēm_minūte_minūtes'.split('_'),
+ 'h': 'stundas_stundām_stunda_stundas'.split('_'),
+ 'hh': 'stundas_stundām_stunda_stundas'.split('_'),
+ 'd': 'dienas_dienām_diena_dienas'.split('_'),
+ 'dd': 'dienas_dienām_diena_dienas'.split('_'),
+ 'M': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
+ 'MM': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
+ 'y': 'gada_gadiem_gads_gadi'.split('_'),
+ 'yy': 'gada_gadiem_gads_gadi'.split('_')
+};
+/**
+ * @param withoutSuffix boolean true = a length of time; false = before/after a period of time.
+ */
+function format$1(forms, number, withoutSuffix) {
+ if (withoutSuffix) {
+ // E.g. "21 minūte", "3 minūtes".
+ return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3];
+ } else {
+ // E.g. "21 minūtes" as in "pēc 21 minūtes".
+ // E.g. "3 minūtēm" as in "pēc 3 minūtēm".
+ return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1];
+ }
+}
+function relativeTimeWithPlural$1(number, withoutSuffix, key) {
+ return number + ' ' + format$1(units$1[key], number, withoutSuffix);
+}
+function relativeTimeWithSingular(number, withoutSuffix, key) {
+ return format$1(units$1[key], number, withoutSuffix);
+}
+function relativeSeconds(number, withoutSuffix) {
+ return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm';
+}
+
+hooks.defineLocale('lv', {
+ months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),
+ weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'),
+ weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'),
+ weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY.',
+ LL : 'YYYY. [gada] D. MMMM',
+ LLL : 'YYYY. [gada] D. MMMM, HH:mm',
+ LLLL : 'YYYY. [gada] D. MMMM, dddd, HH:mm'
+ },
+ calendar : {
+ sameDay : '[Šodien pulksten] LT',
+ nextDay : '[Rīt pulksten] LT',
+ nextWeek : 'dddd [pulksten] LT',
+ lastDay : '[Vakar pulksten] LT',
+ lastWeek : '[Pagājušā] dddd [pulksten] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'pēc %s',
+ past : 'pirms %s',
+ s : relativeSeconds,
+ m : relativeTimeWithSingular,
+ mm : relativeTimeWithPlural$1,
+ h : relativeTimeWithSingular,
+ hh : relativeTimeWithPlural$1,
+ d : relativeTimeWithSingular,
+ dd : relativeTimeWithPlural$1,
+ M : relativeTimeWithSingular,
+ MM : relativeTimeWithPlural$1,
+ y : relativeTimeWithSingular,
+ yy : relativeTimeWithPlural$1
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Montenegrin [me]
+//! author : Miodrag Nikač <miodrag@restartit.me> : https://github.com/miodragnikac
+
+var translator = {
+ words: { //Different grammatical cases
+ m: ['jedan minut', 'jednog minuta'],
+ mm: ['minut', 'minuta', 'minuta'],
+ h: ['jedan sat', 'jednog sata'],
+ hh: ['sat', 'sata', 'sati'],
+ dd: ['dan', 'dana', 'dana'],
+ MM: ['mjesec', 'mjeseca', 'mjeseci'],
+ yy: ['godina', 'godine', 'godina']
+ },
+ correctGrammaticalCase: function (number, wordKey) {
+ return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
+ },
+ translate: function (number, withoutSuffix, key) {
+ var wordKey = translator.words[key];
+ if (key.length === 1) {
+ return withoutSuffix ? wordKey[0] : wordKey[1];
+ } else {
+ return number + ' ' + translator.correctGrammaticalCase(number, wordKey);
+ }
+ }
+};
+
+hooks.defineLocale('me', {
+ months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'),
+ monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
+ monthsParseExact : true,
+ weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
+ weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
+ weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat: {
+ LT: 'H:mm',
+ LTS : 'H:mm:ss',
+ L: 'DD.MM.YYYY',
+ LL: 'D. MMMM YYYY',
+ LLL: 'D. MMMM YYYY H:mm',
+ LLLL: 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar: {
+ sameDay: '[danas u] LT',
+ nextDay: '[sjutra u] LT',
+
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[u] [nedjelju] [u] LT';
+ case 3:
+ return '[u] [srijedu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ },
+ lastDay : '[juče u] LT',
+ lastWeek : function () {
+ var lastWeekDays = [
+ '[prošle] [nedjelje] [u] LT',
+ '[prošlog] [ponedjeljka] [u] LT',
+ '[prošlog] [utorka] [u] LT',
+ '[prošle] [srijede] [u] LT',
+ '[prošlog] [četvrtka] [u] LT',
+ '[prošlog] [petka] [u] LT',
+ '[prošle] [subote] [u] LT'
+ ];
+ return lastWeekDays[this.day()];
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'prije %s',
+ s : 'nekoliko sekundi',
+ m : translator.translate,
+ mm : translator.translate,
+ h : translator.translate,
+ hh : translator.translate,
+ d : 'dan',
+ dd : translator.translate,
+ M : 'mjesec',
+ MM : translator.translate,
+ y : 'godinu',
+ yy : translator.translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Maori [mi]
+//! author : John Corrigan <robbiecloset@gmail.com> : https://github.com/johnideal
+
+hooks.defineLocale('mi', {
+ months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split('_'),
+ monthsShort: 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split('_'),
+ monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
+ monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
+ monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
+ monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,
+ weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'),
+ weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
+ weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY [i] HH:mm',
+ LLLL: 'dddd, D MMMM YYYY [i] HH:mm'
+ },
+ calendar: {
+ sameDay: '[i teie mahana, i] LT',
+ nextDay: '[apopo i] LT',
+ nextWeek: 'dddd [i] LT',
+ lastDay: '[inanahi i] LT',
+ lastWeek: 'dddd [whakamutunga i] LT',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: 'i roto i %s',
+ past: '%s i mua',
+ s: 'te hēkona ruarua',
+ m: 'he meneti',
+ mm: '%d meneti',
+ h: 'te haora',
+ hh: '%d haora',
+ d: 'he ra',
+ dd: '%d ra',
+ M: 'he marama',
+ MM: '%d marama',
+ y: 'he tau',
+ yy: '%d tau'
+ },
+ ordinalParse: /\d{1,2}º/,
+ ordinal: '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Macedonian [mk]
+//! author : Borislav Mickov : https://github.com/B0k0
+
+hooks.defineLocale('mk', {
+ months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'),
+ monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),
+ weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'),
+ weekdaysShort : 'нед_пон_вто_сре_чет_пет_саб'.split('_'),
+ weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'D.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY H:mm',
+ LLLL : 'dddd, D MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[Денес во] LT',
+ nextDay : '[Утре во] LT',
+ nextWeek : '[Во] dddd [во] LT',
+ lastDay : '[Вчера во] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ case 6:
+ return '[Изминатата] dddd [во] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[Изминатиот] dddd [во] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'после %s',
+ past : 'пред %s',
+ s : 'неколку секунди',
+ m : 'минута',
+ mm : '%d минути',
+ h : 'час',
+ hh : '%d часа',
+ d : 'ден',
+ dd : '%d дена',
+ M : 'месец',
+ MM : '%d месеци',
+ y : 'година',
+ yy : '%d години'
+ },
+ ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
+ ordinal : function (number) {
+ var lastDigit = number % 10,
+ last2Digits = number % 100;
+ if (number === 0) {
+ return number + '-ев';
+ } else if (last2Digits === 0) {
+ return number + '-ен';
+ } else if (last2Digits > 10 && last2Digits < 20) {
+ return number + '-ти';
+ } else if (lastDigit === 1) {
+ return number + '-ви';
+ } else if (lastDigit === 2) {
+ return number + '-ри';
+ } else if (lastDigit === 7 || lastDigit === 8) {
+ return number + '-ми';
+ } else {
+ return number + '-ти';
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Malayalam [ml]
+//! author : Floyd Pink : https://github.com/floydpink
+
+hooks.defineLocale('ml', {
+ months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'),
+ monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'),
+ weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'),
+ weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm -നു',
+ LTS : 'A h:mm:ss -നു',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm -നു',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm -നു'
+ },
+ calendar : {
+ sameDay : '[ഇന്ന്] LT',
+ nextDay : '[നാളെ] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[ഇന്നലെ] LT',
+ lastWeek : '[കഴിഞ്ഞ] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s കഴിഞ്ഞ്',
+ past : '%s മുൻപ്',
+ s : 'അൽപ നിമിഷങ്ങൾ',
+ m : 'ഒരു മിനിറ്റ്',
+ mm : '%d മിനിറ്റ്',
+ h : 'ഒരു മണിക്കൂർ',
+ hh : '%d മണിക്കൂർ',
+ d : 'ഒരു ദിവസം',
+ dd : '%d ദിവസം',
+ M : 'ഒരു മാസം',
+ MM : '%d മാസം',
+ y : 'ഒരു വർഷം',
+ yy : '%d വർഷം'
+ },
+ meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if ((meridiem === 'രാത്രി' && hour >= 4) ||
+ meridiem === 'ഉച്ച കഴിഞ്ഞ്' ||
+ meridiem === 'വൈകുന്നേരം') {
+ return hour + 12;
+ } else {
+ return hour;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'രാത്രി';
+ } else if (hour < 12) {
+ return 'രാവിലെ';
+ } else if (hour < 17) {
+ return 'ഉച്ച കഴിഞ്ഞ്';
+ } else if (hour < 20) {
+ return 'വൈകുന്നേരം';
+ } else {
+ return 'രാത്രി';
+ }
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Marathi [mr]
+//! author : Harshad Kale : https://github.com/kalehv
+//! author : Vivek Athalye : https://github.com/vnathalye
+
+var symbolMap$7 = {
+ '1': '१',
+ '2': '२',
+ '3': '३',
+ '4': '४',
+ '5': '५',
+ '6': '६',
+ '7': '७',
+ '8': '८',
+ '9': '९',
+ '0': '०'
+};
+var numberMap$6 = {
+ '१': '1',
+ '२': '2',
+ '३': '3',
+ '४': '4',
+ '५': '5',
+ '६': '6',
+ '७': '7',
+ '८': '8',
+ '९': '9',
+ '०': '0'
+};
+
+function relativeTimeMr(number, withoutSuffix, string, isFuture)
+{
+ var output = '';
+ if (withoutSuffix) {
+ switch (string) {
+ case 's': output = 'काही सेकंद'; break;
+ case 'm': output = 'एक मिनिट'; break;
+ case 'mm': output = '%d मिनिटे'; break;
+ case 'h': output = 'एक तास'; break;
+ case 'hh': output = '%d तास'; break;
+ case 'd': output = 'एक दिवस'; break;
+ case 'dd': output = '%d दिवस'; break;
+ case 'M': output = 'एक महिना'; break;
+ case 'MM': output = '%d महिने'; break;
+ case 'y': output = 'एक वर्ष'; break;
+ case 'yy': output = '%d वर्षे'; break;
+ }
+ }
+ else {
+ switch (string) {
+ case 's': output = 'काही सेकंदां'; break;
+ case 'm': output = 'एका मिनिटा'; break;
+ case 'mm': output = '%d मिनिटां'; break;
+ case 'h': output = 'एका तासा'; break;
+ case 'hh': output = '%d तासां'; break;
+ case 'd': output = 'एका दिवसा'; break;
+ case 'dd': output = '%d दिवसां'; break;
+ case 'M': output = 'एका महिन्या'; break;
+ case 'MM': output = '%d महिन्यां'; break;
+ case 'y': output = 'एका वर्षा'; break;
+ case 'yy': output = '%d वर्षां'; break;
+ }
+ }
+ return output.replace(/%d/i, number);
+}
+
+hooks.defineLocale('mr', {
+ months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'),
+ monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
+ weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'),
+ weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm वाजता',
+ LTS : 'A h:mm:ss वाजता',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm वाजता',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm वाजता'
+ },
+ calendar : {
+ sameDay : '[आज] LT',
+ nextDay : '[उद्या] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[काल] LT',
+ lastWeek: '[मागील] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future: '%sमध्ये',
+ past: '%sपूर्वी',
+ s: relativeTimeMr,
+ m: relativeTimeMr,
+ mm: relativeTimeMr,
+ h: relativeTimeMr,
+ hh: relativeTimeMr,
+ d: relativeTimeMr,
+ dd: relativeTimeMr,
+ M: relativeTimeMr,
+ MM: relativeTimeMr,
+ y: relativeTimeMr,
+ yy: relativeTimeMr
+ },
+ preparse: function (string) {
+ return string.replace(/[१२३४५६७८९०]/g, function (match) {
+ return numberMap$6[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$7[match];
+ });
+ },
+ meridiemParse: /रात्री|सकाळी|दुपारी|सायंकाळी/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'रात्री') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'सकाळी') {
+ return hour;
+ } else if (meridiem === 'दुपारी') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'सायंकाळी') {
+ return hour + 12;
+ }
+ },
+ meridiem: function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'रात्री';
+ } else if (hour < 10) {
+ return 'सकाळी';
+ } else if (hour < 17) {
+ return 'दुपारी';
+ } else if (hour < 20) {
+ return 'सायंकाळी';
+ } else {
+ return 'रात्री';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Malay [ms-my]
+//! note : DEPRECATED, the correct one is [ms]
+//! author : Weldan Jamili : https://github.com/weldan
+
+hooks.defineLocale('ms-my', {
+ months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),
+ monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
+ weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
+ weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
+ weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [pukul] HH.mm',
+ LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+ },
+ meridiemParse: /pagi|tengahari|petang|malam/,
+ meridiemHour: function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'pagi') {
+ return hour;
+ } else if (meridiem === 'tengahari') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'petang' || meridiem === 'malam') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'pagi';
+ } else if (hours < 15) {
+ return 'tengahari';
+ } else if (hours < 19) {
+ return 'petang';
+ } else {
+ return 'malam';
+ }
+ },
+ calendar : {
+ sameDay : '[Hari ini pukul] LT',
+ nextDay : '[Esok pukul] LT',
+ nextWeek : 'dddd [pukul] LT',
+ lastDay : '[Kelmarin pukul] LT',
+ lastWeek : 'dddd [lepas pukul] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'dalam %s',
+ past : '%s yang lepas',
+ s : 'beberapa saat',
+ m : 'seminit',
+ mm : '%d minit',
+ h : 'sejam',
+ hh : '%d jam',
+ d : 'sehari',
+ dd : '%d hari',
+ M : 'sebulan',
+ MM : '%d bulan',
+ y : 'setahun',
+ yy : '%d tahun'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Malay [ms]
+//! author : Weldan Jamili : https://github.com/weldan
+
+hooks.defineLocale('ms', {
+ months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),
+ monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
+ weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
+ weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
+ weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [pukul] HH.mm',
+ LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+ },
+ meridiemParse: /pagi|tengahari|petang|malam/,
+ meridiemHour: function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'pagi') {
+ return hour;
+ } else if (meridiem === 'tengahari') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'petang' || meridiem === 'malam') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'pagi';
+ } else if (hours < 15) {
+ return 'tengahari';
+ } else if (hours < 19) {
+ return 'petang';
+ } else {
+ return 'malam';
+ }
+ },
+ calendar : {
+ sameDay : '[Hari ini pukul] LT',
+ nextDay : '[Esok pukul] LT',
+ nextWeek : 'dddd [pukul] LT',
+ lastDay : '[Kelmarin pukul] LT',
+ lastWeek : 'dddd [lepas pukul] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'dalam %s',
+ past : '%s yang lepas',
+ s : 'beberapa saat',
+ m : 'seminit',
+ mm : '%d minit',
+ h : 'sejam',
+ hh : '%d jam',
+ d : 'sehari',
+ dd : '%d hari',
+ M : 'sebulan',
+ MM : '%d bulan',
+ y : 'setahun',
+ yy : '%d tahun'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Burmese [my]
+//! author : Squar team, mysquar.com
+//! author : David Rossellat : https://github.com/gholadr
+//! author : Tin Aung Lin : https://github.com/thanyawzinmin
+
+var symbolMap$8 = {
+ '1': '၁',
+ '2': '၂',
+ '3': '၃',
+ '4': '၄',
+ '5': '၅',
+ '6': '၆',
+ '7': '၇',
+ '8': '၈',
+ '9': '၉',
+ '0': '၀'
+};
+var numberMap$7 = {
+ '၁': '1',
+ '၂': '2',
+ '၃': '3',
+ '၄': '4',
+ '၅': '5',
+ '၆': '6',
+ '၇': '7',
+ '၈': '8',
+ '၉': '9',
+ '၀': '0'
+};
+
+hooks.defineLocale('my', {
+ months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'),
+ monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'),
+ weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'),
+ weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+ weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY HH:mm',
+ LLLL: 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar: {
+ sameDay: '[ယနေ.] LT [မှာ]',
+ nextDay: '[မနက်ဖြန်] LT [မှာ]',
+ nextWeek: 'dddd LT [မှာ]',
+ lastDay: '[မနေ.က] LT [မှာ]',
+ lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: 'လာမည့် %s မှာ',
+ past: 'လွန်ခဲ့သော %s က',
+ s: 'စက္ကန်.အနည်းငယ်',
+ m: 'တစ်မိနစ်',
+ mm: '%d မိနစ်',
+ h: 'တစ်နာရီ',
+ hh: '%d နာရီ',
+ d: 'တစ်ရက်',
+ dd: '%d ရက်',
+ M: 'တစ်လ',
+ MM: '%d လ',
+ y: 'တစ်နှစ်',
+ yy: '%d နှစ်'
+ },
+ preparse: function (string) {
+ return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) {
+ return numberMap$7[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$8[match];
+ });
+ },
+ week: {
+ dow: 1, // Monday is the first day of the week.
+ doy: 4 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Norwegian Bokmål [nb]
+//! authors : Espen Hovlandsdal : https://github.com/rexxars
+//! Sigurd Gartmann : https://github.com/sigurdga
+
+hooks.defineLocale('nb', {
+ months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
+ monthsShort : 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
+ weekdaysShort : 'sø._ma._ti._on._to._fr._lø.'.split('_'),
+ weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY [kl.] HH:mm',
+ LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm'
+ },
+ calendar : {
+ sameDay: '[i dag kl.] LT',
+ nextDay: '[i morgen kl.] LT',
+ nextWeek: 'dddd [kl.] LT',
+ lastDay: '[i går kl.] LT',
+ lastWeek: '[forrige] dddd [kl.] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'om %s',
+ past : '%s siden',
+ s : 'noen sekunder',
+ m : 'ett minutt',
+ mm : '%d minutter',
+ h : 'en time',
+ hh : '%d timer',
+ d : 'en dag',
+ dd : '%d dager',
+ M : 'en måned',
+ MM : '%d måneder',
+ y : 'ett år',
+ yy : '%d år'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Nepalese [ne]
+//! author : suvash : https://github.com/suvash
+
+var symbolMap$9 = {
+ '1': '१',
+ '2': '२',
+ '3': '३',
+ '4': '४',
+ '5': '५',
+ '6': '६',
+ '7': '७',
+ '8': '८',
+ '9': '९',
+ '0': '०'
+};
+var numberMap$8 = {
+ '१': '1',
+ '२': '2',
+ '३': '3',
+ '४': '4',
+ '५': '5',
+ '६': '6',
+ '७': '7',
+ '८': '8',
+ '९': '9',
+ '०': '0'
+};
+
+hooks.defineLocale('ne', {
+ months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'),
+ monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'),
+ weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'),
+ weekdaysMin : 'आ._सो._मं._बु._बि._शु._श.'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'Aको h:mm बजे',
+ LTS : 'Aको h:mm:ss बजे',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, Aको h:mm बजे',
+ LLLL : 'dddd, D MMMM YYYY, Aको h:mm बजे'
+ },
+ preparse: function (string) {
+ return string.replace(/[१२३४५६७८९०]/g, function (match) {
+ return numberMap$8[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$9[match];
+ });
+ },
+ meridiemParse: /राति|बिहान|दिउँसो|साँझ/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'राति') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'बिहान') {
+ return hour;
+ } else if (meridiem === 'दिउँसो') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'साँझ') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 3) {
+ return 'राति';
+ } else if (hour < 12) {
+ return 'बिहान';
+ } else if (hour < 16) {
+ return 'दिउँसो';
+ } else if (hour < 20) {
+ return 'साँझ';
+ } else {
+ return 'राति';
+ }
+ },
+ calendar : {
+ sameDay : '[आज] LT',
+ nextDay : '[भोलि] LT',
+ nextWeek : '[आउँदो] dddd[,] LT',
+ lastDay : '[हिजो] LT',
+ lastWeek : '[गएको] dddd[,] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%sमा',
+ past : '%s अगाडि',
+ s : 'केही क्षण',
+ m : 'एक मिनेट',
+ mm : '%d मिनेट',
+ h : 'एक घण्टा',
+ hh : '%d घण्टा',
+ d : 'एक दिन',
+ dd : '%d दिन',
+ M : 'एक महिना',
+ MM : '%d महिना',
+ y : 'एक बर्ष',
+ yy : '%d बर्ष'
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Dutch (Belgium) [nl-be]
+//! author : Joris Röling : https://github.com/jorisroling
+//! author : Jacob Middag : https://github.com/middagj
+
+var monthsShortWithDots$1 = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_');
+var monthsShortWithoutDots$1 = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_');
+
+var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i];
+var monthsRegex$1 = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;
+
+hooks.defineLocale('nl-be', {
+ months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShortWithoutDots$1[m.month()];
+ } else {
+ return monthsShortWithDots$1[m.month()];
+ }
+ },
+
+ monthsRegex: monthsRegex$1,
+ monthsShortRegex: monthsRegex$1,
+ monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,
+ monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,
+
+ monthsParse : monthsParse,
+ longMonthsParse : monthsParse,
+ shortMonthsParse : monthsParse,
+
+ weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
+ weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'),
+ weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[vandaag om] LT',
+ nextDay: '[morgen om] LT',
+ nextWeek: 'dddd [om] LT',
+ lastDay: '[gisteren om] LT',
+ lastWeek: '[afgelopen] dddd [om] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'over %s',
+ past : '%s geleden',
+ s : 'een paar seconden',
+ m : 'één minuut',
+ mm : '%d minuten',
+ h : 'één uur',
+ hh : '%d uur',
+ d : 'één dag',
+ dd : '%d dagen',
+ M : 'één maand',
+ MM : '%d maanden',
+ y : 'één jaar',
+ yy : '%d jaar'
+ },
+ ordinalParse: /\d{1,2}(ste|de)/,
+ ordinal : function (number) {
+ return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Dutch [nl]
+//! author : Joris Röling : https://github.com/jorisroling
+//! author : Jacob Middag : https://github.com/middagj
+
+var monthsShortWithDots$2 = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_');
+var monthsShortWithoutDots$2 = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_');
+
+var monthsParse$1 = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i];
+var monthsRegex$2 = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;
+
+hooks.defineLocale('nl', {
+ months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShortWithoutDots$2[m.month()];
+ } else {
+ return monthsShortWithDots$2[m.month()];
+ }
+ },
+
+ monthsRegex: monthsRegex$2,
+ monthsShortRegex: monthsRegex$2,
+ monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,
+ monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,
+
+ monthsParse : monthsParse$1,
+ longMonthsParse : monthsParse$1,
+ shortMonthsParse : monthsParse$1,
+
+ weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
+ weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'),
+ weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD-MM-YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[vandaag om] LT',
+ nextDay: '[morgen om] LT',
+ nextWeek: 'dddd [om] LT',
+ lastDay: '[gisteren om] LT',
+ lastWeek: '[afgelopen] dddd [om] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'over %s',
+ past : '%s geleden',
+ s : 'een paar seconden',
+ m : 'één minuut',
+ mm : '%d minuten',
+ h : 'één uur',
+ hh : '%d uur',
+ d : 'één dag',
+ dd : '%d dagen',
+ M : 'één maand',
+ MM : '%d maanden',
+ y : 'één jaar',
+ yy : '%d jaar'
+ },
+ ordinalParse: /\d{1,2}(ste|de)/,
+ ordinal : function (number) {
+ return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Nynorsk [nn]
+//! author : https://github.com/mechuwind
+
+hooks.defineLocale('nn', {
+ months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
+ weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),
+ weekdaysShort : 'sun_mån_tys_ons_tor_fre_lau'.split('_'),
+ weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY [kl.] H:mm',
+ LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm'
+ },
+ calendar : {
+ sameDay: '[I dag klokka] LT',
+ nextDay: '[I morgon klokka] LT',
+ nextWeek: 'dddd [klokka] LT',
+ lastDay: '[I går klokka] LT',
+ lastWeek: '[Føregåande] dddd [klokka] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'om %s',
+ past : '%s sidan',
+ s : 'nokre sekund',
+ m : 'eit minutt',
+ mm : '%d minutt',
+ h : 'ein time',
+ hh : '%d timar',
+ d : 'ein dag',
+ dd : '%d dagar',
+ M : 'ein månad',
+ MM : '%d månader',
+ y : 'eit år',
+ yy : '%d år'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Punjabi (India) [pa-in]
+//! author : Harpreet Singh : https://github.com/harpreetkhalsagtbit
+
+var symbolMap$10 = {
+ '1': '੧',
+ '2': '੨',
+ '3': '੩',
+ '4': '੪',
+ '5': '੫',
+ '6': '੬',
+ '7': '੭',
+ '8': '੮',
+ '9': '੯',
+ '0': '੦'
+};
+var numberMap$9 = {
+ '੧': '1',
+ '੨': '2',
+ '੩': '3',
+ '੪': '4',
+ '੫': '5',
+ '੬': '6',
+ '੭': '7',
+ '੮': '8',
+ '੯': '9',
+ '੦': '0'
+};
+
+hooks.defineLocale('pa-in', {
+ // There are months name as per Nanakshahi Calender but they are not used as rigidly in modern Punjabi.
+ months : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'),
+ monthsShort : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'),
+ weekdays : 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split('_'),
+ weekdaysShort : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
+ weekdaysMin : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm ਵਜੇ',
+ LTS : 'A h:mm:ss ਵਜੇ',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm ਵਜੇ',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm ਵਜੇ'
+ },
+ calendar : {
+ sameDay : '[ਅਜ] LT',
+ nextDay : '[ਕਲ] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[ਕਲ] LT',
+ lastWeek : '[ਪਿਛਲੇ] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s ਵਿੱਚ',
+ past : '%s ਪਿਛਲੇ',
+ s : 'ਕੁਝ ਸਕਿੰਟ',
+ m : 'ਇਕ ਮਿੰਟ',
+ mm : '%d ਮਿੰਟ',
+ h : 'ਇੱਕ ਘੰਟਾ',
+ hh : '%d ਘੰਟੇ',
+ d : 'ਇੱਕ ਦਿਨ',
+ dd : '%d ਦਿਨ',
+ M : 'ਇੱਕ ਮਹੀਨਾ',
+ MM : '%d ਮਹੀਨੇ',
+ y : 'ਇੱਕ ਸਾਲ',
+ yy : '%d ਸਾਲ'
+ },
+ preparse: function (string) {
+ return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) {
+ return numberMap$9[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$10[match];
+ });
+ },
+ // Punjabi notation for meridiems are quite fuzzy in practice. While there exists
+ // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi.
+ meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'ਰਾਤ') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'ਸਵੇਰ') {
+ return hour;
+ } else if (meridiem === 'ਦੁਪਹਿਰ') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'ਸ਼ਾਮ') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'ਰਾਤ';
+ } else if (hour < 10) {
+ return 'ਸਵੇਰ';
+ } else if (hour < 17) {
+ return 'ਦੁਪਹਿਰ';
+ } else if (hour < 20) {
+ return 'ਸ਼ਾਮ';
+ } else {
+ return 'ਰਾਤ';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Polish [pl]
+//! author : Rafal Hirsz : https://github.com/evoL
+
+var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_');
+var monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_');
+function plural$3(n) {
+ return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1);
+}
+function translate$7(number, withoutSuffix, key) {
+ var result = number + ' ';
+ switch (key) {
+ case 'm':
+ return withoutSuffix ? 'minuta' : 'minutę';
+ case 'mm':
+ return result + (plural$3(number) ? 'minuty' : 'minut');
+ case 'h':
+ return withoutSuffix ? 'godzina' : 'godzinę';
+ case 'hh':
+ return result + (plural$3(number) ? 'godziny' : 'godzin');
+ case 'MM':
+ return result + (plural$3(number) ? 'miesiące' : 'miesięcy');
+ case 'yy':
+ return result + (plural$3(number) ? 'lata' : 'lat');
+ }
+}
+
+hooks.defineLocale('pl', {
+ months : function (momentToFormat, format) {
+ if (format === '') {
+ // Hack: if format empty we know this is used to generate
+ // RegExp by moment. Give then back both valid forms of months
+ // in RegExp ready format.
+ return '(' + monthsSubjective[momentToFormat.month()] + '|' + monthsNominative[momentToFormat.month()] + ')';
+ } else if (/D MMMM/.test(format)) {
+ return monthsSubjective[momentToFormat.month()];
+ } else {
+ return monthsNominative[momentToFormat.month()];
+ }
+ },
+ monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'),
+ weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'),
+ weekdaysShort : 'ndz_pon_wt_śr_czw_pt_sob'.split('_'),
+ weekdaysMin : 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Dziś o] LT',
+ nextDay: '[Jutro o] LT',
+ nextWeek: '[W] dddd [o] LT',
+ lastDay: '[Wczoraj o] LT',
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[W zeszłą niedzielę o] LT';
+ case 3:
+ return '[W zeszłą środę o] LT';
+ case 6:
+ return '[W zeszłą sobotę o] LT';
+ default:
+ return '[W zeszły] dddd [o] LT';
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : '%s temu',
+ s : 'kilka sekund',
+ m : translate$7,
+ mm : translate$7,
+ h : translate$7,
+ hh : translate$7,
+ d : '1 dzień',
+ dd : '%d dni',
+ M : 'miesiąc',
+ MM : translate$7,
+ y : 'rok',
+ yy : translate$7
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Portuguese (Brazil) [pt-br]
+//! author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
+
+hooks.defineLocale('pt-br', {
+ months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'),
+ monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
+ weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'),
+ weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
+ weekdaysMin : 'Dom_2ª_3ª_4ª_5ª_6ª_Sáb'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D [de] MMMM [de] YYYY',
+ LLL : 'D [de] MMMM [de] YYYY [às] HH:mm',
+ LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm'
+ },
+ calendar : {
+ sameDay: '[Hoje às] LT',
+ nextDay: '[Amanhã às] LT',
+ nextWeek: 'dddd [às] LT',
+ lastDay: '[Ontem às] LT',
+ lastWeek: function () {
+ return (this.day() === 0 || this.day() === 6) ?
+ '[Último] dddd [às] LT' : // Saturday + Sunday
+ '[Última] dddd [às] LT'; // Monday - Friday
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'em %s',
+ past : '%s atrás',
+ s : 'poucos segundos',
+ m : 'um minuto',
+ mm : '%d minutos',
+ h : 'uma hora',
+ hh : '%d horas',
+ d : 'um dia',
+ dd : '%d dias',
+ M : 'um mês',
+ MM : '%d meses',
+ y : 'um ano',
+ yy : '%d anos'
+ },
+ ordinalParse: /\d{1,2}º/,
+ ordinal : '%dº'
+});
+
+//! moment.js locale configuration
+//! locale : Portuguese [pt]
+//! author : Jefferson : https://github.com/jalex79
+
+hooks.defineLocale('pt', {
+ months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'),
+ monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
+ weekdays : 'Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado'.split('_'),
+ weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
+ weekdaysMin : 'Dom_2ª_3ª_4ª_5ª_6ª_Sáb'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D [de] MMMM [de] YYYY',
+ LLL : 'D [de] MMMM [de] YYYY HH:mm',
+ LLLL : 'dddd, D [de] MMMM [de] YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Hoje às] LT',
+ nextDay: '[Amanhã às] LT',
+ nextWeek: 'dddd [às] LT',
+ lastDay: '[Ontem às] LT',
+ lastWeek: function () {
+ return (this.day() === 0 || this.day() === 6) ?
+ '[Último] dddd [às] LT' : // Saturday + Sunday
+ '[Última] dddd [às] LT'; // Monday - Friday
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'em %s',
+ past : 'há %s',
+ s : 'segundos',
+ m : 'um minuto',
+ mm : '%d minutos',
+ h : 'uma hora',
+ hh : '%d horas',
+ d : 'um dia',
+ dd : '%d dias',
+ M : 'um mês',
+ MM : '%d meses',
+ y : 'um ano',
+ yy : '%d anos'
+ },
+ ordinalParse: /\d{1,2}º/,
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Romanian [ro]
+//! author : Vlad Gurdiga : https://github.com/gurdiga
+//! author : Valentin Agachi : https://github.com/avaly
+
+function relativeTimeWithPlural$2(number, withoutSuffix, key) {
+ var format = {
+ 'mm': 'minute',
+ 'hh': 'ore',
+ 'dd': 'zile',
+ 'MM': 'luni',
+ 'yy': 'ani'
+ },
+ separator = ' ';
+ if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {
+ separator = ' de ';
+ }
+ return number + separator + format[key];
+}
+
+hooks.defineLocale('ro', {
+ months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'),
+ monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'),
+ weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'),
+ weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY H:mm',
+ LLLL : 'dddd, D MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay: '[azi la] LT',
+ nextDay: '[mâine la] LT',
+ nextWeek: 'dddd [la] LT',
+ lastDay: '[ieri la] LT',
+ lastWeek: '[fosta] dddd [la] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'peste %s',
+ past : '%s în urmă',
+ s : 'câteva secunde',
+ m : 'un minut',
+ mm : relativeTimeWithPlural$2,
+ h : 'o oră',
+ hh : relativeTimeWithPlural$2,
+ d : 'o zi',
+ dd : relativeTimeWithPlural$2,
+ M : 'o lună',
+ MM : relativeTimeWithPlural$2,
+ y : 'un an',
+ yy : relativeTimeWithPlural$2
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Russian [ru]
+//! author : Viktorminator : https://github.com/Viktorminator
+//! Author : Menelion Elensúle : https://github.com/Oire
+//! author : Коренберг Марк : https://github.com/socketpair
+
+function plural$4(word, num) {
+ var forms = word.split('_');
+ return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+}
+function relativeTimeWithPlural$3(number, withoutSuffix, key) {
+ var format = {
+ 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',
+ 'hh': 'час_часа_часов',
+ 'dd': 'день_дня_дней',
+ 'MM': 'месяц_месяца_месяцев',
+ 'yy': 'год_года_лет'
+ };
+ if (key === 'm') {
+ return withoutSuffix ? 'минута' : 'минуту';
+ }
+ else {
+ return number + ' ' + plural$4(format[key], +number);
+ }
+}
+var monthsParse$2 = [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[йя]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i];
+
+// http://new.gramota.ru/spravka/rules/139-prop : § 103
+// Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637
+// CLDR data: http://www.unicode.org/cldr/charts/28/summary/ru.html#1753
+hooks.defineLocale('ru', {
+ months : {
+ format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_'),
+ standalone: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_')
+ },
+ monthsShort : {
+ // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку ?
+ format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_'),
+ standalone: 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_')
+ },
+ weekdays : {
+ standalone: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),
+ format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_'),
+ isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/
+ },
+ weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
+ weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
+ monthsParse : monthsParse$2,
+ longMonthsParse : monthsParse$2,
+ shortMonthsParse : monthsParse$2,
+
+ // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки
+ monthsRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,
+
+ // копия предыдущего
+ monthsShortRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,
+
+ // полные названия с падежами
+ monthsStrictRegex: /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,
+
+ // Выражение, которое соотвествует только сокращённым формам
+ monthsShortStrictRegex: /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY г.',
+ LLL : 'D MMMM YYYY г., HH:mm',
+ LLLL : 'dddd, D MMMM YYYY г., HH:mm'
+ },
+ calendar : {
+ sameDay: '[Сегодня в] LT',
+ nextDay: '[Завтра в] LT',
+ lastDay: '[Вчера в] LT',
+ nextWeek: function (now) {
+ if (now.week() !== this.week()) {
+ switch (this.day()) {
+ case 0:
+ return '[В следующее] dddd [в] LT';
+ case 1:
+ case 2:
+ case 4:
+ return '[В следующий] dddd [в] LT';
+ case 3:
+ case 5:
+ case 6:
+ return '[В следующую] dddd [в] LT';
+ }
+ } else {
+ if (this.day() === 2) {
+ return '[Во] dddd [в] LT';
+ } else {
+ return '[В] dddd [в] LT';
+ }
+ }
+ },
+ lastWeek: function (now) {
+ if (now.week() !== this.week()) {
+ switch (this.day()) {
+ case 0:
+ return '[В прошлое] dddd [в] LT';
+ case 1:
+ case 2:
+ case 4:
+ return '[В прошлый] dddd [в] LT';
+ case 3:
+ case 5:
+ case 6:
+ return '[В прошлую] dddd [в] LT';
+ }
+ } else {
+ if (this.day() === 2) {
+ return '[Во] dddd [в] LT';
+ } else {
+ return '[В] dddd [в] LT';
+ }
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'через %s',
+ past : '%s назад',
+ s : 'несколько секунд',
+ m : relativeTimeWithPlural$3,
+ mm : relativeTimeWithPlural$3,
+ h : 'час',
+ hh : relativeTimeWithPlural$3,
+ d : 'день',
+ dd : relativeTimeWithPlural$3,
+ M : 'месяц',
+ MM : relativeTimeWithPlural$3,
+ y : 'год',
+ yy : relativeTimeWithPlural$3
+ },
+ meridiemParse: /ночи|утра|дня|вечера/i,
+ isPM : function (input) {
+ return /^(дня|вечера)$/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'ночи';
+ } else if (hour < 12) {
+ return 'утра';
+ } else if (hour < 17) {
+ return 'дня';
+ } else {
+ return 'вечера';
+ }
+ },
+ ordinalParse: /\d{1,2}-(й|го|я)/,
+ ordinal: function (number, period) {
+ switch (period) {
+ case 'M':
+ case 'd':
+ case 'DDD':
+ return number + '-й';
+ case 'D':
+ return number + '-го';
+ case 'w':
+ case 'W':
+ return number + '-я';
+ default:
+ return number;
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Northern Sami [se]
+//! authors : Bård Rolstad Henriksen : https://github.com/karamell
+
+
+hooks.defineLocale('se', {
+ months : 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'),
+ monthsShort : 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'),
+ weekdays : 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'),
+ weekdaysShort : 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'),
+ weekdaysMin : 's_v_m_g_d_b_L'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'MMMM D. [b.] YYYY',
+ LLL : 'MMMM D. [b.] YYYY [ti.] HH:mm',
+ LLLL : 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm'
+ },
+ calendar : {
+ sameDay: '[otne ti] LT',
+ nextDay: '[ihttin ti] LT',
+ nextWeek: 'dddd [ti] LT',
+ lastDay: '[ikte ti] LT',
+ lastWeek: '[ovddit] dddd [ti] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : '%s geažes',
+ past : 'maŋit %s',
+ s : 'moadde sekunddat',
+ m : 'okta minuhta',
+ mm : '%d minuhtat',
+ h : 'okta diimmu',
+ hh : '%d diimmut',
+ d : 'okta beaivi',
+ dd : '%d beaivvit',
+ M : 'okta mánnu',
+ MM : '%d mánut',
+ y : 'okta jahki',
+ yy : '%d jagit'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Sinhalese [si]
+//! author : Sampath Sitinamaluwa : https://github.com/sampathsris
+
+/*jshint -W100*/
+hooks.defineLocale('si', {
+ months : 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'),
+ monthsShort : 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'),
+ weekdays : 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'),
+ weekdaysShort : 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'),
+ weekdaysMin : 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'a h:mm',
+ LTS : 'a h:mm:ss',
+ L : 'YYYY/MM/DD',
+ LL : 'YYYY MMMM D',
+ LLL : 'YYYY MMMM D, a h:mm',
+ LLLL : 'YYYY MMMM D [වැනි] dddd, a h:mm:ss'
+ },
+ calendar : {
+ sameDay : '[අද] LT[ට]',
+ nextDay : '[හෙට] LT[ට]',
+ nextWeek : 'dddd LT[ට]',
+ lastDay : '[ඊයේ] LT[ට]',
+ lastWeek : '[පසුගිය] dddd LT[ට]',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%sකින්',
+ past : '%sකට පෙර',
+ s : 'තත්පර කිහිපය',
+ m : 'මිනිත්තුව',
+ mm : 'මිනිත්තු %d',
+ h : 'පැය',
+ hh : 'පැය %d',
+ d : 'දිනය',
+ dd : 'දින %d',
+ M : 'මාසය',
+ MM : 'මාස %d',
+ y : 'වසර',
+ yy : 'වසර %d'
+ },
+ ordinalParse: /\d{1,2} වැනි/,
+ ordinal : function (number) {
+ return number + ' වැනි';
+ },
+ meridiemParse : /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,
+ isPM : function (input) {
+ return input === 'ප.ව.' || input === 'පස් වරු';
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'ප.ව.' : 'පස් වරු';
+ } else {
+ return isLower ? 'පෙ.ව.' : 'පෙර වරු';
+ }
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Slovak [sk]
+//! author : Martin Minka : https://github.com/k2s
+//! based on work of petrbela : https://github.com/petrbela
+
+var months$6 = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_');
+var monthsShort$4 = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');
+function plural$5(n) {
+ return (n > 1) && (n < 5);
+}
+function translate$8(number, withoutSuffix, key, isFuture) {
+ var result = number + ' ';
+ switch (key) {
+ case 's': // a few seconds / in a few seconds / a few seconds ago
+ return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami';
+ case 'm': // a minute / in a minute / a minute ago
+ return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou');
+ case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural$5(number) ? 'minúty' : 'minút');
+ } else {
+ return result + 'minútami';
+ }
+ break;
+ case 'h': // an hour / in an hour / an hour ago
+ return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+ case 'hh': // 9 hours / in 9 hours / 9 hours ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural$5(number) ? 'hodiny' : 'hodín');
+ } else {
+ return result + 'hodinami';
+ }
+ break;
+ case 'd': // a day / in a day / a day ago
+ return (withoutSuffix || isFuture) ? 'deň' : 'dňom';
+ case 'dd': // 9 days / in 9 days / 9 days ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural$5(number) ? 'dni' : 'dní');
+ } else {
+ return result + 'dňami';
+ }
+ break;
+ case 'M': // a month / in a month / a month ago
+ return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom';
+ case 'MM': // 9 months / in 9 months / 9 months ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural$5(number) ? 'mesiace' : 'mesiacov');
+ } else {
+ return result + 'mesiacmi';
+ }
+ break;
+ case 'y': // a year / in a year / a year ago
+ return (withoutSuffix || isFuture) ? 'rok' : 'rokom';
+ case 'yy': // 9 years / in 9 years / 9 years ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural$5(number) ? 'roky' : 'rokov');
+ } else {
+ return result + 'rokmi';
+ }
+ break;
+ }
+}
+
+hooks.defineLocale('sk', {
+ months : months$6,
+ monthsShort : monthsShort$4,
+ weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),
+ weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'),
+ weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'),
+ longDateFormat : {
+ LT: 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd D. MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay: '[dnes o] LT',
+ nextDay: '[zajtra o] LT',
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[v nedeľu o] LT';
+ case 1:
+ case 2:
+ return '[v] dddd [o] LT';
+ case 3:
+ return '[v stredu o] LT';
+ case 4:
+ return '[vo štvrtok o] LT';
+ case 5:
+ return '[v piatok o] LT';
+ case 6:
+ return '[v sobotu o] LT';
+ }
+ },
+ lastDay: '[včera o] LT',
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[minulú nedeľu o] LT';
+ case 1:
+ case 2:
+ return '[minulý] dddd [o] LT';
+ case 3:
+ return '[minulú stredu o] LT';
+ case 4:
+ case 5:
+ return '[minulý] dddd [o] LT';
+ case 6:
+ return '[minulú sobotu o] LT';
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'pred %s',
+ s : translate$8,
+ m : translate$8,
+ mm : translate$8,
+ h : translate$8,
+ hh : translate$8,
+ d : translate$8,
+ dd : translate$8,
+ M : translate$8,
+ MM : translate$8,
+ y : translate$8,
+ yy : translate$8
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Slovenian [sl]
+//! author : Robert Sedovšek : https://github.com/sedovsek
+
+function processRelativeTime$4(number, withoutSuffix, key, isFuture) {
+ var result = number + ' ';
+ switch (key) {
+ case 's':
+ return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami';
+ case 'm':
+ return withoutSuffix ? 'ena minuta' : 'eno minuto';
+ case 'mm':
+ if (number === 1) {
+ result += withoutSuffix ? 'minuta' : 'minuto';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'minuti' : 'minutama';
+ } else if (number < 5) {
+ result += withoutSuffix || isFuture ? 'minute' : 'minutami';
+ } else {
+ result += withoutSuffix || isFuture ? 'minut' : 'minutami';
+ }
+ return result;
+ case 'h':
+ return withoutSuffix ? 'ena ura' : 'eno uro';
+ case 'hh':
+ if (number === 1) {
+ result += withoutSuffix ? 'ura' : 'uro';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'uri' : 'urama';
+ } else if (number < 5) {
+ result += withoutSuffix || isFuture ? 'ure' : 'urami';
+ } else {
+ result += withoutSuffix || isFuture ? 'ur' : 'urami';
+ }
+ return result;
+ case 'd':
+ return withoutSuffix || isFuture ? 'en dan' : 'enim dnem';
+ case 'dd':
+ if (number === 1) {
+ result += withoutSuffix || isFuture ? 'dan' : 'dnem';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'dni' : 'dnevoma';
+ } else {
+ result += withoutSuffix || isFuture ? 'dni' : 'dnevi';
+ }
+ return result;
+ case 'M':
+ return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem';
+ case 'MM':
+ if (number === 1) {
+ result += withoutSuffix || isFuture ? 'mesec' : 'mesecem';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'meseca' : 'mesecema';
+ } else if (number < 5) {
+ result += withoutSuffix || isFuture ? 'mesece' : 'meseci';
+ } else {
+ result += withoutSuffix || isFuture ? 'mesecev' : 'meseci';
+ }
+ return result;
+ case 'y':
+ return withoutSuffix || isFuture ? 'eno leto' : 'enim letom';
+ case 'yy':
+ if (number === 1) {
+ result += withoutSuffix || isFuture ? 'leto' : 'letom';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'leti' : 'letoma';
+ } else if (number < 5) {
+ result += withoutSuffix || isFuture ? 'leta' : 'leti';
+ } else {
+ result += withoutSuffix || isFuture ? 'let' : 'leti';
+ }
+ return result;
+ }
+}
+
+hooks.defineLocale('sl', {
+ months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'),
+ monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),
+ weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'),
+ weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[danes ob] LT',
+ nextDay : '[jutri ob] LT',
+
+ nextWeek : function () {
+ switch (this.day()) {
+ case 0:
+ return '[v] [nedeljo] [ob] LT';
+ case 3:
+ return '[v] [sredo] [ob] LT';
+ case 6:
+ return '[v] [soboto] [ob] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[v] dddd [ob] LT';
+ }
+ },
+ lastDay : '[včeraj ob] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ return '[prejšnjo] [nedeljo] [ob] LT';
+ case 3:
+ return '[prejšnjo] [sredo] [ob] LT';
+ case 6:
+ return '[prejšnjo] [soboto] [ob] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[prejšnji] dddd [ob] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'čez %s',
+ past : 'pred %s',
+ s : processRelativeTime$4,
+ m : processRelativeTime$4,
+ mm : processRelativeTime$4,
+ h : processRelativeTime$4,
+ hh : processRelativeTime$4,
+ d : processRelativeTime$4,
+ dd : processRelativeTime$4,
+ M : processRelativeTime$4,
+ MM : processRelativeTime$4,
+ y : processRelativeTime$4,
+ yy : processRelativeTime$4
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Albanian [sq]
+//! author : Flakërim Ismani : https://github.com/flakerimi
+//! author : Menelion Elensúle : https://github.com/Oire
+//! author : Oerd Cukalla : https://github.com/oerd
+
+hooks.defineLocale('sq', {
+ months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'),
+ monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'),
+ weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'),
+ weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'),
+ weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'),
+ weekdaysParseExact : true,
+ meridiemParse: /PD|MD/,
+ isPM: function (input) {
+ return input.charAt(0) === 'M';
+ },
+ meridiem : function (hours, minutes, isLower) {
+ return hours < 12 ? 'PD' : 'MD';
+ },
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Sot në] LT',
+ nextDay : '[Nesër në] LT',
+ nextWeek : 'dddd [në] LT',
+ lastDay : '[Dje në] LT',
+ lastWeek : 'dddd [e kaluar në] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'në %s',
+ past : '%s më parë',
+ s : 'disa sekonda',
+ m : 'një minutë',
+ mm : '%d minuta',
+ h : 'një orë',
+ hh : '%d orë',
+ d : 'një ditë',
+ dd : '%d ditë',
+ M : 'një muaj',
+ MM : '%d muaj',
+ y : 'një vit',
+ yy : '%d vite'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Serbian Cyrillic [sr-cyrl]
+//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+
+var translator$1 = {
+ words: { //Different grammatical cases
+ m: ['један минут', 'једне минуте'],
+ mm: ['минут', 'минуте', 'минута'],
+ h: ['један сат', 'једног сата'],
+ hh: ['сат', 'сата', 'сати'],
+ dd: ['дан', 'дана', 'дана'],
+ MM: ['месец', 'месеца', 'месеци'],
+ yy: ['година', 'године', 'година']
+ },
+ correctGrammaticalCase: function (number, wordKey) {
+ return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
+ },
+ translate: function (number, withoutSuffix, key) {
+ var wordKey = translator$1.words[key];
+ if (key.length === 1) {
+ return withoutSuffix ? wordKey[0] : wordKey[1];
+ } else {
+ return number + ' ' + translator$1.correctGrammaticalCase(number, wordKey);
+ }
+ }
+};
+
+hooks.defineLocale('sr-cyrl', {
+ months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split('_'),
+ monthsShort: 'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'),
+ monthsParseExact: true,
+ weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'),
+ weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'),
+ weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat: {
+ LT: 'H:mm',
+ LTS : 'H:mm:ss',
+ L: 'DD.MM.YYYY',
+ LL: 'D. MMMM YYYY',
+ LLL: 'D. MMMM YYYY H:mm',
+ LLLL: 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar: {
+ sameDay: '[данас у] LT',
+ nextDay: '[сутра у] LT',
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[у] [недељу] [у] LT';
+ case 3:
+ return '[у] [среду] [у] LT';
+ case 6:
+ return '[у] [суботу] [у] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[у] dddd [у] LT';
+ }
+ },
+ lastDay : '[јуче у] LT',
+ lastWeek : function () {
+ var lastWeekDays = [
+ '[прошле] [недеље] [у] LT',
+ '[прошлог] [понедељка] [у] LT',
+ '[прошлог] [уторка] [у] LT',
+ '[прошле] [среде] [у] LT',
+ '[прошлог] [четвртка] [у] LT',
+ '[прошлог] [петка] [у] LT',
+ '[прошле] [суботе] [у] LT'
+ ];
+ return lastWeekDays[this.day()];
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'за %s',
+ past : 'пре %s',
+ s : 'неколико секунди',
+ m : translator$1.translate,
+ mm : translator$1.translate,
+ h : translator$1.translate,
+ hh : translator$1.translate,
+ d : 'дан',
+ dd : translator$1.translate,
+ M : 'месец',
+ MM : translator$1.translate,
+ y : 'годину',
+ yy : translator$1.translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Serbian [sr]
+//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+
+var translator$2 = {
+ words: { //Different grammatical cases
+ m: ['jedan minut', 'jedne minute'],
+ mm: ['minut', 'minute', 'minuta'],
+ h: ['jedan sat', 'jednog sata'],
+ hh: ['sat', 'sata', 'sati'],
+ dd: ['dan', 'dana', 'dana'],
+ MM: ['mesec', 'meseca', 'meseci'],
+ yy: ['godina', 'godine', 'godina']
+ },
+ correctGrammaticalCase: function (number, wordKey) {
+ return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
+ },
+ translate: function (number, withoutSuffix, key) {
+ var wordKey = translator$2.words[key];
+ if (key.length === 1) {
+ return withoutSuffix ? wordKey[0] : wordKey[1];
+ } else {
+ return number + ' ' + translator$2.correctGrammaticalCase(number, wordKey);
+ }
+ }
+};
+
+hooks.defineLocale('sr', {
+ months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'),
+ monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
+ monthsParseExact: true,
+ weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split('_'),
+ weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'),
+ weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat: {
+ LT: 'H:mm',
+ LTS : 'H:mm:ss',
+ L: 'DD.MM.YYYY',
+ LL: 'D. MMMM YYYY',
+ LLL: 'D. MMMM YYYY H:mm',
+ LLLL: 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar: {
+ sameDay: '[danas u] LT',
+ nextDay: '[sutra u] LT',
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[u] [nedelju] [u] LT';
+ case 3:
+ return '[u] [sredu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ },
+ lastDay : '[juče u] LT',
+ lastWeek : function () {
+ var lastWeekDays = [
+ '[prošle] [nedelje] [u] LT',
+ '[prošlog] [ponedeljka] [u] LT',
+ '[prošlog] [utorka] [u] LT',
+ '[prošle] [srede] [u] LT',
+ '[prošlog] [četvrtka] [u] LT',
+ '[prošlog] [petka] [u] LT',
+ '[prošle] [subote] [u] LT'
+ ];
+ return lastWeekDays[this.day()];
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'pre %s',
+ s : 'nekoliko sekundi',
+ m : translator$2.translate,
+ mm : translator$2.translate,
+ h : translator$2.translate,
+ hh : translator$2.translate,
+ d : 'dan',
+ dd : translator$2.translate,
+ M : 'mesec',
+ MM : translator$2.translate,
+ y : 'godinu',
+ yy : translator$2.translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : siSwati [ss]
+//! author : Nicolai Davies<mail@nicolai.io> : https://github.com/nicolaidavies
+
+
+hooks.defineLocale('ss', {
+ months : "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split('_'),
+ monthsShort : 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'),
+ weekdays : 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split('_'),
+ weekdaysShort : 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'),
+ weekdaysMin : 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[Namuhla nga] LT',
+ nextDay : '[Kusasa nga] LT',
+ nextWeek : 'dddd [nga] LT',
+ lastDay : '[Itolo nga] LT',
+ lastWeek : 'dddd [leliphelile] [nga] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'nga %s',
+ past : 'wenteka nga %s',
+ s : 'emizuzwana lomcane',
+ m : 'umzuzu',
+ mm : '%d emizuzu',
+ h : 'lihora',
+ hh : '%d emahora',
+ d : 'lilanga',
+ dd : '%d emalanga',
+ M : 'inyanga',
+ MM : '%d tinyanga',
+ y : 'umnyaka',
+ yy : '%d iminyaka'
+ },
+ meridiemParse: /ekuseni|emini|entsambama|ebusuku/,
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'ekuseni';
+ } else if (hours < 15) {
+ return 'emini';
+ } else if (hours < 19) {
+ return 'entsambama';
+ } else {
+ return 'ebusuku';
+ }
+ },
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'ekuseni') {
+ return hour;
+ } else if (meridiem === 'emini') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') {
+ if (hour === 0) {
+ return 0;
+ }
+ return hour + 12;
+ }
+ },
+ ordinalParse: /\d{1,2}/,
+ ordinal : '%d',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Swedish [sv]
+//! author : Jens Alm : https://github.com/ulmus
+
+hooks.defineLocale('sv', {
+ months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
+ weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),
+ weekdaysShort : 'sön_mån_tis_ons_tor_fre_lör'.split('_'),
+ weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'YYYY-MM-DD',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [kl.] HH:mm',
+ LLLL : 'dddd D MMMM YYYY [kl.] HH:mm',
+ lll : 'D MMM YYYY HH:mm',
+ llll : 'ddd D MMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Idag] LT',
+ nextDay: '[Imorgon] LT',
+ lastDay: '[Igår] LT',
+ nextWeek: '[På] dddd LT',
+ lastWeek: '[I] dddd[s] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'om %s',
+ past : 'för %s sedan',
+ s : 'några sekunder',
+ m : 'en minut',
+ mm : '%d minuter',
+ h : 'en timme',
+ hh : '%d timmar',
+ d : 'en dag',
+ dd : '%d dagar',
+ M : 'en månad',
+ MM : '%d månader',
+ y : 'ett år',
+ yy : '%d år'
+ },
+ ordinalParse: /\d{1,2}(e|a)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'e' :
+ (b === 1) ? 'a' :
+ (b === 2) ? 'a' :
+ (b === 3) ? 'e' : 'e';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Swahili [sw]
+//! author : Fahad Kassim : https://github.com/fadsel
+
+hooks.defineLocale('sw', {
+ months : 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'),
+ monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'),
+ weekdays : 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'),
+ weekdaysShort : 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'),
+ weekdaysMin : 'J2_J3_J4_J5_Al_Ij_J1'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[leo saa] LT',
+ nextDay : '[kesho saa] LT',
+ nextWeek : '[wiki ijayo] dddd [saat] LT',
+ lastDay : '[jana] LT',
+ lastWeek : '[wiki iliyopita] dddd [saat] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s baadaye',
+ past : 'tokea %s',
+ s : 'hivi punde',
+ m : 'dakika moja',
+ mm : 'dakika %d',
+ h : 'saa limoja',
+ hh : 'masaa %d',
+ d : 'siku moja',
+ dd : 'masiku %d',
+ M : 'mwezi mmoja',
+ MM : 'miezi %d',
+ y : 'mwaka mmoja',
+ yy : 'miaka %d'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Tamil [ta]
+//! author : Arjunkumar Krishnamoorthy : https://github.com/tk120404
+
+var symbolMap$11 = {
+ '1': '௧',
+ '2': '௨',
+ '3': '௩',
+ '4': '௪',
+ '5': '௫',
+ '6': '௬',
+ '7': '௭',
+ '8': '௮',
+ '9': '௯',
+ '0': '௦'
+};
+var numberMap$10 = {
+ '௧': '1',
+ '௨': '2',
+ '௩': '3',
+ '௪': '4',
+ '௫': '5',
+ '௬': '6',
+ '௭': '7',
+ '௮': '8',
+ '௯': '9',
+ '௦': '0'
+};
+
+hooks.defineLocale('ta', {
+ months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),
+ monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),
+ weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'),
+ weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split('_'),
+ weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, HH:mm',
+ LLLL : 'dddd, D MMMM YYYY, HH:mm'
+ },
+ calendar : {
+ sameDay : '[இன்று] LT',
+ nextDay : '[நாளை] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[நேற்று] LT',
+ lastWeek : '[கடந்த வாரம்] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s இல்',
+ past : '%s முன்',
+ s : 'ஒரு சில விநாடிகள்',
+ m : 'ஒரு நிமிடம்',
+ mm : '%d நிமிடங்கள்',
+ h : 'ஒரு மணி நேரம்',
+ hh : '%d மணி நேரம்',
+ d : 'ஒரு நாள்',
+ dd : '%d நாட்கள்',
+ M : 'ஒரு மாதம்',
+ MM : '%d மாதங்கள்',
+ y : 'ஒரு வருடம்',
+ yy : '%d ஆண்டுகள்'
+ },
+ ordinalParse: /\d{1,2}வது/,
+ ordinal : function (number) {
+ return number + 'வது';
+ },
+ preparse: function (string) {
+ return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {
+ return numberMap$10[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap$11[match];
+ });
+ },
+ // refer http://ta.wikipedia.org/s/1er1
+ meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 2) {
+ return ' யாமம்';
+ } else if (hour < 6) {
+ return ' வைகறை'; // வைகறை
+ } else if (hour < 10) {
+ return ' காலை'; // காலை
+ } else if (hour < 14) {
+ return ' நண்பகல்'; // நண்பகல்
+ } else if (hour < 18) {
+ return ' எற்பாடு'; // எற்பாடு
+ } else if (hour < 22) {
+ return ' மாலை'; // மாலை
+ } else {
+ return ' யாமம்';
+ }
+ },
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'யாமம்') {
+ return hour < 2 ? hour : hour + 12;
+ } else if (meridiem === 'வைகறை' || meridiem === 'காலை') {
+ return hour;
+ } else if (meridiem === 'நண்பகல்') {
+ return hour >= 10 ? hour : hour + 12;
+ } else {
+ return hour + 12;
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Telugu [te]
+//! author : Krishna Chaitanya Thota : https://github.com/kcthota
+
+hooks.defineLocale('te', {
+ months : 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జూలై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'),
+ monthsShort : 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జూలై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split('_'),
+ weekdaysShort : 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'),
+ weekdaysMin : 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm',
+ LTS : 'A h:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm'
+ },
+ calendar : {
+ sameDay : '[నేడు] LT',
+ nextDay : '[రేపు] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[నిన్న] LT',
+ lastWeek : '[గత] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s లో',
+ past : '%s క్రితం',
+ s : 'కొన్ని క్షణాలు',
+ m : 'ఒక నిమిషం',
+ mm : '%d నిమిషాలు',
+ h : 'ఒక గంట',
+ hh : '%d గంటలు',
+ d : 'ఒక రోజు',
+ dd : '%d రోజులు',
+ M : 'ఒక నెల',
+ MM : '%d నెలలు',
+ y : 'ఒక సంవత్సరం',
+ yy : '%d సంవత్సరాలు'
+ },
+ ordinalParse : /\d{1,2}వ/,
+ ordinal : '%dవ',
+ meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'రాత్రి') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'ఉదయం') {
+ return hour;
+ } else if (meridiem === 'మధ్యాహ్నం') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'సాయంత్రం') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'రాత్రి';
+ } else if (hour < 10) {
+ return 'ఉదయం';
+ } else if (hour < 17) {
+ return 'మధ్యాహ్నం';
+ } else if (hour < 20) {
+ return 'సాయంత్రం';
+ } else {
+ return 'రాత్రి';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Tetun Dili (East Timor) [tet]
+//! author : Joshua Brooks : https://github.com/joshbrooks
+//! author : Onorio De J. Afonso : https://github.com/marobo
+
+hooks.defineLocale('tet', {
+ months : 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juniu_Juliu_Augustu_Setembru_Outubru_Novembru_Dezembru'.split('_'),
+ monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Aug_Set_Out_Nov_Dez'.split('_'),
+ weekdays : 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sexta_Sabadu'.split('_'),
+ weekdaysShort : 'Dom_Seg_Ters_Kua_Kint_Sext_Sab'.split('_'),
+ weekdaysMin : 'Do_Seg_Te_Ku_Ki_Sex_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Ohin iha] LT',
+ nextDay: '[Aban iha] LT',
+ nextWeek: 'dddd [iha] LT',
+ lastDay: '[Horiseik iha] LT',
+ lastWeek: 'dddd [semana kotuk] [iha] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'iha %s',
+ past : '%s liuba',
+ s : 'minutu balun',
+ m : 'minutu ida',
+ mm : 'minutus %d',
+ h : 'horas ida',
+ hh : 'horas %d',
+ d : 'loron ida',
+ dd : 'loron %d',
+ M : 'fulan ida',
+ MM : 'fulan %d',
+ y : 'tinan ida',
+ yy : 'tinan %d'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Thai [th]
+//! author : Kridsada Thanabulpong : https://github.com/sirn
+
+hooks.defineLocale('th', {
+ months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'),
+ monthsShort : 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),
+ weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference
+ weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'YYYY/MM/DD',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY เวลา H:mm',
+ LLLL : 'วันddddที่ D MMMM YYYY เวลา H:mm'
+ },
+ meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/,
+ isPM: function (input) {
+ return input === 'หลังเที่ยง';
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'ก่อนเที่ยง';
+ } else {
+ return 'หลังเที่ยง';
+ }
+ },
+ calendar : {
+ sameDay : '[วันนี้ เวลา] LT',
+ nextDay : '[พรุ่งนี้ เวลา] LT',
+ nextWeek : 'dddd[หน้า เวลา] LT',
+ lastDay : '[เมื่อวานนี้ เวลา] LT',
+ lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'อีก %s',
+ past : '%sที่แล้ว',
+ s : 'ไม่กี่วินาที',
+ m : '1 นาที',
+ mm : '%d นาที',
+ h : '1 ชั่วโมง',
+ hh : '%d ชั่วโมง',
+ d : '1 วัน',
+ dd : '%d วัน',
+ M : '1 เดือน',
+ MM : '%d เดือน',
+ y : '1 ปี',
+ yy : '%d ปี'
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Tagalog (Philippines) [tl-ph]
+//! author : Dan Hagman : https://github.com/hagmandan
+
+hooks.defineLocale('tl-ph', {
+ months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'),
+ monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),
+ weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'),
+ weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),
+ weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'MM/D/YYYY',
+ LL : 'MMMM D, YYYY',
+ LLL : 'MMMM D, YYYY HH:mm',
+ LLLL : 'dddd, MMMM DD, YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: 'LT [ngayong araw]',
+ nextDay: '[Bukas ng] LT',
+ nextWeek: 'LT [sa susunod na] dddd',
+ lastDay: 'LT [kahapon]',
+ lastWeek: 'LT [noong nakaraang] dddd',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'sa loob ng %s',
+ past : '%s ang nakalipas',
+ s : 'ilang segundo',
+ m : 'isang minuto',
+ mm : '%d minuto',
+ h : 'isang oras',
+ hh : '%d oras',
+ d : 'isang araw',
+ dd : '%d araw',
+ M : 'isang buwan',
+ MM : '%d buwan',
+ y : 'isang taon',
+ yy : '%d taon'
+ },
+ ordinalParse: /\d{1,2}/,
+ ordinal : function (number) {
+ return number;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Klingon [tlh]
+//! author : Dominika Kruk : https://github.com/amaranthrose
+
+var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_');
+
+function translateFuture(output) {
+ var time = output;
+ time = (output.indexOf('jaj') !== -1) ?
+ time.slice(0, -3) + 'leS' :
+ (output.indexOf('jar') !== -1) ?
+ time.slice(0, -3) + 'waQ' :
+ (output.indexOf('DIS') !== -1) ?
+ time.slice(0, -3) + 'nem' :
+ time + ' pIq';
+ return time;
+}
+
+function translatePast(output) {
+ var time = output;
+ time = (output.indexOf('jaj') !== -1) ?
+ time.slice(0, -3) + 'Hu’' :
+ (output.indexOf('jar') !== -1) ?
+ time.slice(0, -3) + 'wen' :
+ (output.indexOf('DIS') !== -1) ?
+ time.slice(0, -3) + 'ben' :
+ time + ' ret';
+ return time;
+}
+
+function translate$9(number, withoutSuffix, string, isFuture) {
+ var numberNoun = numberAsNoun(number);
+ switch (string) {
+ case 'mm':
+ return numberNoun + ' tup';
+ case 'hh':
+ return numberNoun + ' rep';
+ case 'dd':
+ return numberNoun + ' jaj';
+ case 'MM':
+ return numberNoun + ' jar';
+ case 'yy':
+ return numberNoun + ' DIS';
+ }
+}
+
+function numberAsNoun(number) {
+ var hundred = Math.floor((number % 1000) / 100),
+ ten = Math.floor((number % 100) / 10),
+ one = number % 10,
+ word = '';
+ if (hundred > 0) {
+ word += numbersNouns[hundred] + 'vatlh';
+ }
+ if (ten > 0) {
+ word += ((word !== '') ? ' ' : '') + numbersNouns[ten] + 'maH';
+ }
+ if (one > 0) {
+ word += ((word !== '') ? ' ' : '') + numbersNouns[one];
+ }
+ return (word === '') ? 'pagh' : word;
+}
+
+hooks.defineLocale('tlh', {
+ months : 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split('_'),
+ monthsShort : 'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
+ weekdaysShort : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
+ weekdaysMin : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[DaHjaj] LT',
+ nextDay: '[wa’leS] LT',
+ nextWeek: 'LLL',
+ lastDay: '[wa’Hu’] LT',
+ lastWeek: 'LLL',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : translateFuture,
+ past : translatePast,
+ s : 'puS lup',
+ m : 'wa’ tup',
+ mm : translate$9,
+ h : 'wa’ rep',
+ hh : translate$9,
+ d : 'wa’ jaj',
+ dd : translate$9,
+ M : 'wa’ jar',
+ MM : translate$9,
+ y : 'wa’ DIS',
+ yy : translate$9
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Turkish [tr]
+//! authors : Erhan Gundogan : https://github.com/erhangundogan,
+//! Burak Yiğit Kaya: https://github.com/BYK
+
+var suffixes$3 = {
+ 1: '\'inci',
+ 5: '\'inci',
+ 8: '\'inci',
+ 70: '\'inci',
+ 80: '\'inci',
+ 2: '\'nci',
+ 7: '\'nci',
+ 20: '\'nci',
+ 50: '\'nci',
+ 3: '\'üncü',
+ 4: '\'üncü',
+ 100: '\'üncü',
+ 6: '\'ncı',
+ 9: '\'uncu',
+ 10: '\'uncu',
+ 30: '\'uncu',
+ 60: '\'ıncı',
+ 90: '\'ıncı'
+};
+
+hooks.defineLocale('tr', {
+ months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'),
+ monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'),
+ weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'),
+ weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'),
+ weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[bugün saat] LT',
+ nextDay : '[yarın saat] LT',
+ nextWeek : '[haftaya] dddd [saat] LT',
+ lastDay : '[dün] LT',
+ lastWeek : '[geçen hafta] dddd [saat] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s sonra',
+ past : '%s önce',
+ s : 'birkaç saniye',
+ m : 'bir dakika',
+ mm : '%d dakika',
+ h : 'bir saat',
+ hh : '%d saat',
+ d : 'bir gün',
+ dd : '%d gün',
+ M : 'bir ay',
+ MM : '%d ay',
+ y : 'bir yıl',
+ yy : '%d yıl'
+ },
+ ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,
+ ordinal : function (number) {
+ if (number === 0) { // special case for zero
+ return number + '\'ıncı';
+ }
+ var a = number % 10,
+ b = number % 100 - a,
+ c = number >= 100 ? 100 : null;
+ return number + (suffixes$3[a] || suffixes$3[b] || suffixes$3[c]);
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Talossan [tzl]
+//! author : Robin van der Vliet : https://github.com/robin0van0der0v
+//! author : Iustì Canun
+
+// After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals.
+// This is currently too difficult (maybe even impossible) to add.
+hooks.defineLocale('tzl', {
+ months : 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split('_'),
+ monthsShort : 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'),
+ weekdays : 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'),
+ weekdaysShort : 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'),
+ weekdaysMin : 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM [dallas] YYYY',
+ LLL : 'D. MMMM [dallas] YYYY HH.mm',
+ LLLL : 'dddd, [li] D. MMMM [dallas] YYYY HH.mm'
+ },
+ meridiemParse: /d\'o|d\'a/i,
+ isPM : function (input) {
+ return 'd\'o' === input.toLowerCase();
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'd\'o' : 'D\'O';
+ } else {
+ return isLower ? 'd\'a' : 'D\'A';
+ }
+ },
+ calendar : {
+ sameDay : '[oxhi à] LT',
+ nextDay : '[demà à] LT',
+ nextWeek : 'dddd [à] LT',
+ lastDay : '[ieiri à] LT',
+ lastWeek : '[sür el] dddd [lasteu à] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'osprei %s',
+ past : 'ja%s',
+ s : processRelativeTime$5,
+ m : processRelativeTime$5,
+ mm : processRelativeTime$5,
+ h : processRelativeTime$5,
+ hh : processRelativeTime$5,
+ d : processRelativeTime$5,
+ dd : processRelativeTime$5,
+ M : processRelativeTime$5,
+ MM : processRelativeTime$5,
+ y : processRelativeTime$5,
+ yy : processRelativeTime$5
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+function processRelativeTime$5(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 's': ['viensas secunds', '\'iensas secunds'],
+ 'm': ['\'n míut', '\'iens míut'],
+ 'mm': [number + ' míuts', '' + number + ' míuts'],
+ 'h': ['\'n þora', '\'iensa þora'],
+ 'hh': [number + ' þoras', '' + number + ' þoras'],
+ 'd': ['\'n ziua', '\'iensa ziua'],
+ 'dd': [number + ' ziuas', '' + number + ' ziuas'],
+ 'M': ['\'n mes', '\'iens mes'],
+ 'MM': [number + ' mesen', '' + number + ' mesen'],
+ 'y': ['\'n ar', '\'iens ar'],
+ 'yy': [number + ' ars', '' + number + ' ars']
+ };
+ return isFuture ? format[key][0] : (withoutSuffix ? format[key][0] : format[key][1]);
+}
+
+//! moment.js locale configuration
+//! locale : Central Atlas Tamazight Latin [tzm-latn]
+//! author : Abdel Said : https://github.com/abdelsaid
+
+hooks.defineLocale('tzm-latn', {
+ months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),
+ monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),
+ weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
+ weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
+ weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[asdkh g] LT',
+ nextDay: '[aska g] LT',
+ nextWeek: 'dddd [g] LT',
+ lastDay: '[assant g] LT',
+ lastWeek: 'dddd [g] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'dadkh s yan %s',
+ past : 'yan %s',
+ s : 'imik',
+ m : 'minuḍ',
+ mm : '%d minuḍ',
+ h : 'saɛa',
+ hh : '%d tassaɛin',
+ d : 'ass',
+ dd : '%d ossan',
+ M : 'ayowr',
+ MM : '%d iyyirn',
+ y : 'asgas',
+ yy : '%d isgasn'
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Central Atlas Tamazight [tzm]
+//! author : Abdel Said : https://github.com/abdelsaid
+
+hooks.defineLocale('tzm', {
+ months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),
+ monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),
+ weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
+ weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
+ weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[ⴰⵙⴷⵅ ⴴ] LT',
+ nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',
+ nextWeek: 'dddd [ⴴ] LT',
+ lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',
+ lastWeek: 'dddd [ⴴ] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s',
+ past : 'ⵢⴰⵏ %s',
+ s : 'ⵉⵎⵉⴽ',
+ m : 'ⵎⵉⵏⵓⴺ',
+ mm : '%d ⵎⵉⵏⵓⴺ',
+ h : 'ⵙⴰⵄⴰ',
+ hh : '%d ⵜⴰⵙⵙⴰⵄⵉⵏ',
+ d : 'ⴰⵙⵙ',
+ dd : '%d oⵙⵙⴰⵏ',
+ M : 'ⴰⵢoⵓⵔ',
+ MM : '%d ⵉⵢⵢⵉⵔⵏ',
+ y : 'ⴰⵙⴳⴰⵙ',
+ yy : '%d ⵉⵙⴳⴰⵙⵏ'
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Ukrainian [uk]
+//! author : zemlanin : https://github.com/zemlanin
+//! Author : Menelion Elensúle : https://github.com/Oire
+
+function plural$6(word, num) {
+ var forms = word.split('_');
+ return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+}
+function relativeTimeWithPlural$4(number, withoutSuffix, key) {
+ var format = {
+ 'mm': withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин',
+ 'hh': withoutSuffix ? 'година_години_годин' : 'годину_години_годин',
+ 'dd': 'день_дні_днів',
+ 'MM': 'місяць_місяці_місяців',
+ 'yy': 'рік_роки_років'
+ };
+ if (key === 'm') {
+ return withoutSuffix ? 'хвилина' : 'хвилину';
+ }
+ else if (key === 'h') {
+ return withoutSuffix ? 'година' : 'годину';
+ }
+ else {
+ return number + ' ' + plural$6(format[key], +number);
+ }
+}
+function weekdaysCaseReplace(m, format) {
+ var weekdays = {
+ 'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'),
+ 'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'),
+ 'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_')
+ },
+ nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ?
+ 'accusative' :
+ ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ?
+ 'genitive' :
+ 'nominative');
+ return weekdays[nounCase][m.day()];
+}
+function processHoursFunction(str) {
+ return function () {
+ return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
+ };
+}
+
+hooks.defineLocale('uk', {
+ months : {
+ 'format': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_'),
+ 'standalone': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_')
+ },
+ monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'),
+ weekdays : weekdaysCaseReplace,
+ weekdaysShort : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
+ weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY р.',
+ LLL : 'D MMMM YYYY р., HH:mm',
+ LLLL : 'dddd, D MMMM YYYY р., HH:mm'
+ },
+ calendar : {
+ sameDay: processHoursFunction('[Сьогодні '),
+ nextDay: processHoursFunction('[Завтра '),
+ lastDay: processHoursFunction('[Вчора '),
+ nextWeek: processHoursFunction('[У] dddd ['),
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ case 5:
+ case 6:
+ return processHoursFunction('[Минулої] dddd [').call(this);
+ case 1:
+ case 2:
+ case 4:
+ return processHoursFunction('[Минулого] dddd [').call(this);
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'за %s',
+ past : '%s тому',
+ s : 'декілька секунд',
+ m : relativeTimeWithPlural$4,
+ mm : relativeTimeWithPlural$4,
+ h : 'годину',
+ hh : relativeTimeWithPlural$4,
+ d : 'день',
+ dd : relativeTimeWithPlural$4,
+ M : 'місяць',
+ MM : relativeTimeWithPlural$4,
+ y : 'рік',
+ yy : relativeTimeWithPlural$4
+ },
+ // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
+ meridiemParse: /ночі|ранку|дня|вечора/,
+ isPM: function (input) {
+ return /^(дня|вечора)$/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'ночі';
+ } else if (hour < 12) {
+ return 'ранку';
+ } else if (hour < 17) {
+ return 'дня';
+ } else {
+ return 'вечора';
+ }
+ },
+ ordinalParse: /\d{1,2}-(й|го)/,
+ ordinal: function (number, period) {
+ switch (period) {
+ case 'M':
+ case 'd':
+ case 'DDD':
+ case 'w':
+ case 'W':
+ return number + '-й';
+ case 'D':
+ return number + '-го';
+ default:
+ return number;
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Uzbek [uz]
+//! author : Sardor Muminov : https://github.com/muminoff
+
+hooks.defineLocale('uz', {
+ months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'),
+ monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
+ weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),
+ weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'),
+ weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'D MMMM YYYY, dddd HH:mm'
+ },
+ calendar : {
+ sameDay : '[Бугун соат] LT [да]',
+ nextDay : '[Эртага] LT [да]',
+ nextWeek : 'dddd [куни соат] LT [да]',
+ lastDay : '[Кеча соат] LT [да]',
+ lastWeek : '[Утган] dddd [куни соат] LT [да]',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'Якин %s ичида',
+ past : 'Бир неча %s олдин',
+ s : 'фурсат',
+ m : 'бир дакика',
+ mm : '%d дакика',
+ h : 'бир соат',
+ hh : '%d соат',
+ d : 'бир кун',
+ dd : '%d кун',
+ M : 'бир ой',
+ MM : '%d ой',
+ y : 'бир йил',
+ yy : '%d йил'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Vietnamese [vi]
+//! author : Bang Nguyen : https://github.com/bangnk
+
+hooks.defineLocale('vi', {
+ months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'),
+ monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'),
+ weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
+ weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
+ weekdaysParseExact : true,
+ meridiemParse: /sa|ch/i,
+ isPM : function (input) {
+ return /^ch$/i.test(input);
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 12) {
+ return isLower ? 'sa' : 'SA';
+ } else {
+ return isLower ? 'ch' : 'CH';
+ }
+ },
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM [năm] YYYY',
+ LLL : 'D MMMM [năm] YYYY HH:mm',
+ LLLL : 'dddd, D MMMM [năm] YYYY HH:mm',
+ l : 'DD/M/YYYY',
+ ll : 'D MMM YYYY',
+ lll : 'D MMM YYYY HH:mm',
+ llll : 'ddd, D MMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Hôm nay lúc] LT',
+ nextDay: '[Ngày mai lúc] LT',
+ nextWeek: 'dddd [tuần tới lúc] LT',
+ lastDay: '[Hôm qua lúc] LT',
+ lastWeek: 'dddd [tuần rồi lúc] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : '%s tới',
+ past : '%s trước',
+ s : 'vài giây',
+ m : 'một phút',
+ mm : '%d phút',
+ h : 'một giờ',
+ hh : '%d giờ',
+ d : 'một ngày',
+ dd : '%d ngày',
+ M : 'một tháng',
+ MM : '%d tháng',
+ y : 'một năm',
+ yy : '%d năm'
+ },
+ ordinalParse: /\d{1,2}/,
+ ordinal : function (number) {
+ return number;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Pseudo [x-pseudo]
+//! author : Andrew Hood : https://github.com/andrewhood125
+
+hooks.defineLocale('x-pseudo', {
+ months : 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split('_'),
+ monthsShort : 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split('_'),
+ weekdaysShort : 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'),
+ weekdaysMin : 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[T~ódá~ý át] LT',
+ nextDay : '[T~ómó~rró~w át] LT',
+ nextWeek : 'dddd [át] LT',
+ lastDay : '[Ý~ést~érdá~ý át] LT',
+ lastWeek : '[L~ást] dddd [át] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'í~ñ %s',
+ past : '%s á~gó',
+ s : 'á ~féw ~sécó~ñds',
+ m : 'á ~míñ~úté',
+ mm : '%d m~íñú~tés',
+ h : 'á~ñ hó~úr',
+ hh : '%d h~óúrs',
+ d : 'á ~dáý',
+ dd : '%d d~áýs',
+ M : 'á ~móñ~th',
+ MM : '%d m~óñt~hs',
+ y : 'á ~ýéár',
+ yy : '%d ý~éárs'
+ },
+ ordinalParse: /\d{1,2}(th|st|nd|rd)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Yoruba Nigeria [yo]
+//! author : Atolagbe Abisoye : https://github.com/andela-batolagbe
+
+hooks.defineLocale('yo', {
+ months : 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split('_'),
+ monthsShort : 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'),
+ weekdays : 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'),
+ weekdaysShort : 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'),
+ weekdaysMin : 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'),
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[Ònì ni] LT',
+ nextDay : '[Ọ̀la ni] LT',
+ nextWeek : 'dddd [Ọsẹ̀ tón\'bọ] [ni] LT',
+ lastDay : '[Àna ni] LT',
+ lastWeek : 'dddd [Ọsẹ̀ tólọ́] [ni] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'ní %s',
+ past : '%s kọjá',
+ s : 'ìsẹjú aayá die',
+ m : 'ìsẹjú kan',
+ mm : 'ìsẹjú %d',
+ h : 'wákati kan',
+ hh : 'wákati %d',
+ d : 'ọjọ́ kan',
+ dd : 'ọjọ́ %d',
+ M : 'osù kan',
+ MM : 'osù %d',
+ y : 'ọdún kan',
+ yy : 'ọdún %d'
+ },
+ ordinalParse : /ọjọ́\s\d{1,2}/,
+ ordinal : 'ọjọ́ %d',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Chinese (China) [zh-cn]
+//! author : suupic : https://github.com/suupic
+//! author : Zeno Zeng : https://github.com/zenozeng
+
+hooks.defineLocale('zh-cn', {
+ months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
+ monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+ weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
+ weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'),
+ weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
+ longDateFormat : {
+ LT : 'Ah点mm分',
+ LTS : 'Ah点m分s秒',
+ L : 'YYYY-MM-DD',
+ LL : 'YYYY年MMMD日',
+ LLL : 'YYYY年MMMD日Ah点mm分',
+ LLLL : 'YYYY年MMMD日ddddAh点mm分',
+ l : 'YYYY-MM-DD',
+ ll : 'YYYY年MMMD日',
+ lll : 'YYYY年MMMD日Ah点mm分',
+ llll : 'YYYY年MMMD日ddddAh点mm分'
+ },
+ meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
+ meridiemHour: function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === '凌晨' || meridiem === '早上' ||
+ meridiem === '上午') {
+ return hour;
+ } else if (meridiem === '下午' || meridiem === '晚上') {
+ return hour + 12;
+ } else {
+ // '中午'
+ return hour >= 11 ? hour : hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ var hm = hour * 100 + minute;
+ if (hm < 600) {
+ return '凌晨';
+ } else if (hm < 900) {
+ return '早上';
+ } else if (hm < 1130) {
+ return '上午';
+ } else if (hm < 1230) {
+ return '中午';
+ } else if (hm < 1800) {
+ return '下午';
+ } else {
+ return '晚上';
+ }
+ },
+ calendar : {
+ sameDay : function () {
+ return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT';
+ },
+ nextDay : function () {
+ return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT';
+ },
+ lastDay : function () {
+ return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT';
+ },
+ nextWeek : function () {
+ var startOfWeek, prefix;
+ startOfWeek = hooks().startOf('week');
+ prefix = this.diff(startOfWeek, 'days') >= 7 ? '[下]' : '[本]';
+ return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
+ },
+ lastWeek : function () {
+ var startOfWeek, prefix;
+ startOfWeek = hooks().startOf('week');
+ prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]';
+ return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
+ },
+ sameElse : 'LL'
+ },
+ ordinalParse: /\d{1,2}(日|月|周)/,
+ ordinal : function (number, period) {
+ switch (period) {
+ case 'd':
+ case 'D':
+ case 'DDD':
+ return number + '日';
+ case 'M':
+ return number + '月';
+ case 'w':
+ case 'W':
+ return number + '周';
+ default:
+ return number;
+ }
+ },
+ relativeTime : {
+ future : '%s内',
+ past : '%s前',
+ s : '几秒',
+ m : '1 分钟',
+ mm : '%d 分钟',
+ h : '1 小时',
+ hh : '%d 小时',
+ d : '1 天',
+ dd : '%d 天',
+ M : '1 个月',
+ MM : '%d 个月',
+ y : '1 年',
+ yy : '%d 年'
+ },
+ week : {
+ // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Chinese (Hong Kong) [zh-hk]
+//! author : Ben : https://github.com/ben-lin
+//! author : Chris Lam : https://github.com/hehachris
+//! author : Konstantin : https://github.com/skfd
+
+hooks.defineLocale('zh-hk', {
+ months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
+ monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+ weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
+ weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'),
+ weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
+ longDateFormat : {
+ LT : 'Ah點mm分',
+ LTS : 'Ah點m分s秒',
+ L : 'YYYY年MMMD日',
+ LL : 'YYYY年MMMD日',
+ LLL : 'YYYY年MMMD日Ah點mm分',
+ LLLL : 'YYYY年MMMD日ddddAh點mm分',
+ l : 'YYYY年MMMD日',
+ ll : 'YYYY年MMMD日',
+ lll : 'YYYY年MMMD日Ah點mm分',
+ llll : 'YYYY年MMMD日ddddAh點mm分'
+ },
+ meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
+ return hour;
+ } else if (meridiem === '中午') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === '下午' || meridiem === '晚上') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ var hm = hour * 100 + minute;
+ if (hm < 600) {
+ return '凌晨';
+ } else if (hm < 900) {
+ return '早上';
+ } else if (hm < 1130) {
+ return '上午';
+ } else if (hm < 1230) {
+ return '中午';
+ } else if (hm < 1800) {
+ return '下午';
+ } else {
+ return '晚上';
+ }
+ },
+ calendar : {
+ sameDay : '[今天]LT',
+ nextDay : '[明天]LT',
+ nextWeek : '[下]ddddLT',
+ lastDay : '[昨天]LT',
+ lastWeek : '[上]ddddLT',
+ sameElse : 'L'
+ },
+ ordinalParse: /\d{1,2}(日|月|週)/,
+ ordinal : function (number, period) {
+ switch (period) {
+ case 'd' :
+ case 'D' :
+ case 'DDD' :
+ return number + '日';
+ case 'M' :
+ return number + '月';
+ case 'w' :
+ case 'W' :
+ return number + '週';
+ default :
+ return number;
+ }
+ },
+ relativeTime : {
+ future : '%s內',
+ past : '%s前',
+ s : '幾秒',
+ m : '1 分鐘',
+ mm : '%d 分鐘',
+ h : '1 小時',
+ hh : '%d 小時',
+ d : '1 天',
+ dd : '%d 天',
+ M : '1 個月',
+ MM : '%d 個月',
+ y : '1 年',
+ yy : '%d 年'
+ }
+});
+
+//! moment.js locale configuration
+//! locale : Chinese (Taiwan) [zh-tw]
+//! author : Ben : https://github.com/ben-lin
+//! author : Chris Lam : https://github.com/hehachris
+
+hooks.defineLocale('zh-tw', {
+ months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
+ monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+ weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
+ weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'),
+ weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
+ longDateFormat : {
+ LT : 'Ah點mm分',
+ LTS : 'Ah點m分s秒',
+ L : 'YYYY年MMMD日',
+ LL : 'YYYY年MMMD日',
+ LLL : 'YYYY年MMMD日Ah點mm分',
+ LLLL : 'YYYY年MMMD日ddddAh點mm分',
+ l : 'YYYY年MMMD日',
+ ll : 'YYYY年MMMD日',
+ lll : 'YYYY年MMMD日Ah點mm分',
+ llll : 'YYYY年MMMD日ddddAh點mm分'
+ },
+ meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
+ return hour;
+ } else if (meridiem === '中午') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === '下午' || meridiem === '晚上') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ var hm = hour * 100 + minute;
+ if (hm < 600) {
+ return '凌晨';
+ } else if (hm < 900) {
+ return '早上';
+ } else if (hm < 1130) {
+ return '上午';
+ } else if (hm < 1230) {
+ return '中午';
+ } else if (hm < 1800) {
+ return '下午';
+ } else {
+ return '晚上';
+ }
+ },
+ calendar : {
+ sameDay : '[今天]LT',
+ nextDay : '[明天]LT',
+ nextWeek : '[下]ddddLT',
+ lastDay : '[昨天]LT',
+ lastWeek : '[上]ddddLT',
+ sameElse : 'L'
+ },
+ ordinalParse: /\d{1,2}(日|月|週)/,
+ ordinal : function (number, period) {
+ switch (period) {
+ case 'd' :
+ case 'D' :
+ case 'DDD' :
+ return number + '日';
+ case 'M' :
+ return number + '月';
+ case 'w' :
+ case 'W' :
+ return number + '週';
+ default :
+ return number;
+ }
+ },
+ relativeTime : {
+ future : '%s內',
+ past : '%s前',
+ s : '幾秒',
+ m : '1 分鐘',
+ mm : '%d 分鐘',
+ h : '1 小時',
+ hh : '%d 小時',
+ d : '1 天',
+ dd : '%d 天',
+ M : '1 個月',
+ MM : '%d 個月',
+ y : '1 年',
+ yy : '%d 年'
+ }
+});
+
+hooks.locale('en');
+
+return hooks;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/moment-with-locales.min.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/moment-with-locales.min.js
new file mode 100644
index 00000000000..fd7f85744e5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/moment-with-locales.min.js
@@ -0,0 +1,1216 @@
+!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.moment=b()}(this,function(){"use strict";function a(){return le.apply(null,arguments)}
+// This is done to register the method called with moment()
+// without creating circular dependencies.
+function b(a){le=a}function c(a){return a instanceof Array||"[object Array]"===Object.prototype.toString.call(a)}function d(a){
+// IE8 will treat undefined and null as object if it wasn't for
+// input != null
+return null!=a&&"[object Object]"===Object.prototype.toString.call(a)}function e(a){var b;for(b in a)
+// even if its not own property I'd still call it non-empty
+return!1;return!0}function f(a){return"number"==typeof a||"[object Number]"===Object.prototype.toString.call(a)}function g(a){return a instanceof Date||"[object Date]"===Object.prototype.toString.call(a)}function h(a,b){var c,d=[];for(c=0;c<a.length;++c)d.push(b(a[c],c));return d}function i(a,b){return Object.prototype.hasOwnProperty.call(a,b)}function j(a,b){for(var c in b)i(b,c)&&(a[c]=b[c]);return i(b,"toString")&&(a.toString=b.toString),i(b,"valueOf")&&(a.valueOf=b.valueOf),a}function k(a,b,c,d){return rb(a,b,c,d,!0).utc()}function l(){
+// We need to deep clone this object.
+return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null}}function m(a){return null==a._pf&&(a._pf=l()),a._pf}function n(a){if(null==a._isValid){var b=m(a),c=ne.call(b.parsedDateParts,function(a){return null!=a}),d=!isNaN(a._d.getTime())&&b.overflow<0&&!b.empty&&!b.invalidMonth&&!b.invalidWeekday&&!b.nullInput&&!b.invalidFormat&&!b.userInvalidated&&(!b.meridiem||b.meridiem&&c);if(a._strict&&(d=d&&0===b.charsLeftOver&&0===b.unusedTokens.length&&void 0===b.bigHour),null!=Object.isFrozen&&Object.isFrozen(a))return d;a._isValid=d}return a._isValid}function o(a){var b=k(NaN);return null!=a?j(m(b),a):m(b).userInvalidated=!0,b}function p(a){return void 0===a}function q(a,b){var c,d,e;if(p(b._isAMomentObject)||(a._isAMomentObject=b._isAMomentObject),p(b._i)||(a._i=b._i),p(b._f)||(a._f=b._f),p(b._l)||(a._l=b._l),p(b._strict)||(a._strict=b._strict),p(b._tzm)||(a._tzm=b._tzm),p(b._isUTC)||(a._isUTC=b._isUTC),p(b._offset)||(a._offset=b._offset),p(b._pf)||(a._pf=m(b)),p(b._locale)||(a._locale=b._locale),oe.length>0)for(c in oe)d=oe[c],e=b[d],p(e)||(a[d]=e);return a}
+// Moment prototype object
+function r(b){q(this,b),this._d=new Date(null!=b._d?b._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),
+// Prevent infinite loop in case updateOffset creates new moment
+// objects.
+pe===!1&&(pe=!0,a.updateOffset(this),pe=!1)}function s(a){return a instanceof r||null!=a&&null!=a._isAMomentObject}function t(a){return a<0?Math.ceil(a)||0:Math.floor(a)}function u(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=t(b)),c}
+// compare two arrays, return the number of differences
+function v(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;d<e;d++)(c&&a[d]!==b[d]||!c&&u(a[d])!==u(b[d]))&&g++;return g+f}function w(b){a.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+b)}function x(b,c){var d=!0;return j(function(){if(null!=a.deprecationHandler&&a.deprecationHandler(null,b),d){for(var e,f=[],g=0;g<arguments.length;g++){if(e="","object"==typeof arguments[g]){e+="\n["+g+"] ";for(var h in arguments[0])e+=h+": "+arguments[0][h]+", ";e=e.slice(0,-2)}else e=arguments[g];f.push(e)}w(b+"\nArguments: "+Array.prototype.slice.call(f).join("")+"\n"+(new Error).stack),d=!1}return c.apply(this,arguments)},c)}function y(b,c){null!=a.deprecationHandler&&a.deprecationHandler(b,c),qe[b]||(w(c),qe[b]=!0)}function z(a){return a instanceof Function||"[object Function]"===Object.prototype.toString.call(a)}function A(a){var b,c;for(c in a)b=a[c],z(b)?this[c]=b:this["_"+c]=b;this._config=a,
+// Lenient ordinal parsing accepts just a number in addition to
+// number + (possibly) stuff coming from _ordinalParseLenient.
+this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)}function B(a,b){var c,e=j({},a);for(c in b)i(b,c)&&(d(a[c])&&d(b[c])?(e[c]={},j(e[c],a[c]),j(e[c],b[c])):null!=b[c]?e[c]=b[c]:delete e[c]);for(c in a)i(a,c)&&!i(b,c)&&d(a[c])&&(
+// make sure changes to properties don't modify parent config
+e[c]=j({},e[c]));return e}function C(a){null!=a&&this.set(a)}function D(a,b,c){var d=this._calendar[a]||this._calendar.sameElse;return z(d)?d.call(b,c):d}function E(a){var b=this._longDateFormat[a],c=this._longDateFormat[a.toUpperCase()];return b||!c?b:(this._longDateFormat[a]=c.replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a])}function F(){return this._invalidDate}function G(a){return this._ordinal.replace("%d",a)}function H(a,b,c,d){var e=this._relativeTime[c];return z(e)?e(a,b,c,d):e.replace(/%d/i,a)}function I(a,b){var c=this._relativeTime[a>0?"future":"past"];return z(c)?c(b):c.replace(/%s/i,b)}function J(a,b){var c=a.toLowerCase();Ae[c]=Ae[c+"s"]=Ae[b]=a}function K(a){return"string"==typeof a?Ae[a]||Ae[a.toLowerCase()]:void 0}function L(a){var b,c,d={};for(c in a)i(a,c)&&(b=K(c),b&&(d[b]=a[c]));return d}function M(a,b){Be[a]=b}function N(a){var b=[];for(var c in a)b.push({unit:c,priority:Be[c]});return b.sort(function(a,b){return a.priority-b.priority}),b}function O(b,c){return function(d){return null!=d?(Q(this,b,d),a.updateOffset(this,c),this):P(this,b)}}function P(a,b){return a.isValid()?a._d["get"+(a._isUTC?"UTC":"")+b]():NaN}function Q(a,b,c){a.isValid()&&a._d["set"+(a._isUTC?"UTC":"")+b](c)}
+// MOMENTS
+function R(a){return a=K(a),z(this[a])?this[a]():this}function S(a,b){if("object"==typeof a){a=L(a);for(var c=N(a),d=0;d<c.length;d++)this[c[d].unit](a[c[d].unit])}else if(a=K(a),z(this[a]))return this[a](b);return this}function T(a,b,c){var d=""+Math.abs(a),e=b-d.length,f=a>=0;return(f?c?"+":"":"-")+Math.pow(10,Math.max(0,e)).toString().substr(1)+d}
+// token: 'M'
+// padded: ['MM', 2]
+// ordinal: 'Mo'
+// callback: function () { this.month() + 1 }
+function U(a,b,c,d){var e=d;"string"==typeof d&&(e=function(){return this[d]()}),a&&(Fe[a]=e),b&&(Fe[b[0]]=function(){return T(e.apply(this,arguments),b[1],b[2])}),c&&(Fe[c]=function(){return this.localeData().ordinal(e.apply(this,arguments),a)})}function V(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function W(a){var b,c,d=a.match(Ce);for(b=0,c=d.length;b<c;b++)Fe[d[b]]?d[b]=Fe[d[b]]:d[b]=V(d[b]);return function(b){var e,f="";for(e=0;e<c;e++)f+=d[e]instanceof Function?d[e].call(b,a):d[e];return f}}
+// format date using native date object
+function X(a,b){return a.isValid()?(b=Y(b,a.localeData()),Ee[b]=Ee[b]||W(b),Ee[b](a)):a.localeData().invalidDate()}function Y(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(De.lastIndex=0;d>=0&&De.test(a);)a=a.replace(De,c),De.lastIndex=0,d-=1;return a}function Z(a,b,c){Xe[a]=z(b)?b:function(a,d){return a&&c?c:b}}function $(a,b){return i(Xe,a)?Xe[a](b._strict,b._locale):new RegExp(_(a))}
+// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
+function _(a){return aa(a.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e}))}function aa(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function ba(a,b){var c,d=b;for("string"==typeof a&&(a=[a]),f(b)&&(d=function(a,c){c[b]=u(a)}),c=0;c<a.length;c++)Ye[a[c]]=d}function ca(a,b){ba(a,function(a,c,d,e){d._w=d._w||{},b(a,d._w,d,e)})}function da(a,b,c){null!=b&&i(Ye,a)&&Ye[a](b,c._a,c,a)}function ea(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function fa(a,b){return a?c(this._months)?this._months[a.month()]:this._months[(this._months.isFormat||hf).test(b)?"format":"standalone"][a.month()]:this._months}function ga(a,b){return a?c(this._monthsShort)?this._monthsShort[a.month()]:this._monthsShort[hf.test(b)?"format":"standalone"][a.month()]:this._monthsShort}function ha(a,b,c){var d,e,f,g=a.toLocaleLowerCase();if(!this._monthsParse)for(
+// this is not used
+this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],d=0;d<12;++d)f=k([2e3,d]),this._shortMonthsParse[d]=this.monthsShort(f,"").toLocaleLowerCase(),this._longMonthsParse[d]=this.months(f,"").toLocaleLowerCase();return c?"MMM"===b?(e=gf.call(this._shortMonthsParse,g),e!==-1?e:null):(e=gf.call(this._longMonthsParse,g),e!==-1?e:null):"MMM"===b?(e=gf.call(this._shortMonthsParse,g),e!==-1?e:(e=gf.call(this._longMonthsParse,g),e!==-1?e:null)):(e=gf.call(this._longMonthsParse,g),e!==-1?e:(e=gf.call(this._shortMonthsParse,g),e!==-1?e:null))}function ia(a,b,c){var d,e,f;if(this._monthsParseExact)return ha.call(this,a,b,c);
+// TODO: add sorting
+// Sorting makes sure if one month (or abbr) is a prefix of another
+// see sorting in computeMonthsParse
+for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;d<12;d++){
+// test the regex
+if(
+// make the regex if we don't have it already
+e=k([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}}
+// MOMENTS
+function ja(a,b){var c;if(!a.isValid())
+// No op
+return a;if("string"==typeof b)if(/^\d+$/.test(b))b=u(b);else
+// TODO: Another silent failure?
+if(b=a.localeData().monthsParse(b),!f(b))return a;return c=Math.min(a.date(),ea(a.year(),b)),a._d["set"+(a._isUTC?"UTC":"")+"Month"](b,c),a}function ka(b){return null!=b?(ja(this,b),a.updateOffset(this,!0),this):P(this,"Month")}function la(){return ea(this.year(),this.month())}function ma(a){return this._monthsParseExact?(i(this,"_monthsRegex")||oa.call(this),a?this._monthsShortStrictRegex:this._monthsShortRegex):(i(this,"_monthsShortRegex")||(this._monthsShortRegex=lf),this._monthsShortStrictRegex&&a?this._monthsShortStrictRegex:this._monthsShortRegex)}function na(a){return this._monthsParseExact?(i(this,"_monthsRegex")||oa.call(this),a?this._monthsStrictRegex:this._monthsRegex):(i(this,"_monthsRegex")||(this._monthsRegex=mf),this._monthsStrictRegex&&a?this._monthsStrictRegex:this._monthsRegex)}function oa(){function a(a,b){return b.length-a.length}var b,c,d=[],e=[],f=[];for(b=0;b<12;b++)
+// make the regex if we don't have it already
+c=k([2e3,b]),d.push(this.monthsShort(c,"")),e.push(this.months(c,"")),f.push(this.months(c,"")),f.push(this.monthsShort(c,""));for(
+// Sorting makes sure if one month (or abbr) is a prefix of another it
+// will match the longer piece.
+d.sort(a),e.sort(a),f.sort(a),b=0;b<12;b++)d[b]=aa(d[b]),e[b]=aa(e[b]);for(b=0;b<24;b++)f[b]=aa(f[b]);this._monthsRegex=new RegExp("^("+f.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+e.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+d.join("|")+")","i")}
+// HELPERS
+function pa(a){return qa(a)?366:365}function qa(a){return a%4===0&&a%100!==0||a%400===0}function ra(){return qa(this.year())}function sa(a,b,c,d,e,f,g){
+//can't just apply() to create a date:
+//http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
+var h=new Date(a,b,c,d,e,f,g);
+//the date constructor remaps years 0-99 to 1900-1999
+return a<100&&a>=0&&isFinite(h.getFullYear())&&h.setFullYear(a),h}function ta(a){var b=new Date(Date.UTC.apply(null,arguments));
+//the Date.UTC function remaps years 0-99 to 1900-1999
+return a<100&&a>=0&&isFinite(b.getUTCFullYear())&&b.setUTCFullYear(a),b}
+// start-of-first-week - start-of-year
+function ua(a,b,c){var// first-week day -- which january is always in the first week (4 for iso, 1 for other)
+d=7+b-c,
+// first-week day local weekday -- which local weekday is fwd
+e=(7+ta(a,0,d).getUTCDay()-b)%7;return-e+d-1}
+//http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
+function va(a,b,c,d,e){var f,g,h=(7+c-d)%7,i=ua(a,d,e),j=1+7*(b-1)+h+i;return j<=0?(f=a-1,g=pa(f)+j):j>pa(a)?(f=a+1,g=j-pa(a)):(f=a,g=j),{year:f,dayOfYear:g}}function wa(a,b,c){var d,e,f=ua(a.year(),b,c),g=Math.floor((a.dayOfYear()-f-1)/7)+1;return g<1?(e=a.year()-1,d=g+xa(e,b,c)):g>xa(a.year(),b,c)?(d=g-xa(a.year(),b,c),e=a.year()+1):(e=a.year(),d=g),{week:d,year:e}}function xa(a,b,c){var d=ua(a,b,c),e=ua(a+1,b,c);return(pa(a)-d+e)/7}
+// HELPERS
+// LOCALES
+function ya(a){return wa(a,this._week.dow,this._week.doy).week}function za(){return this._week.dow}function Aa(){return this._week.doy}
+// MOMENTS
+function Ba(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")}function Ca(a){var b=wa(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")}
+// HELPERS
+function Da(a,b){return"string"!=typeof a?a:isNaN(a)?(a=b.weekdaysParse(a),"number"==typeof a?a:null):parseInt(a,10)}function Ea(a,b){return"string"==typeof a?b.weekdaysParse(a)%7||7:isNaN(a)?null:a}function Fa(a,b){return a?c(this._weekdays)?this._weekdays[a.day()]:this._weekdays[this._weekdays.isFormat.test(b)?"format":"standalone"][a.day()]:this._weekdays}function Ga(a){return a?this._weekdaysShort[a.day()]:this._weekdaysShort}function Ha(a){return a?this._weekdaysMin[a.day()]:this._weekdaysMin}function Ia(a,b,c){var d,e,f,g=a.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],d=0;d<7;++d)f=k([2e3,1]).day(d),this._minWeekdaysParse[d]=this.weekdaysMin(f,"").toLocaleLowerCase(),this._shortWeekdaysParse[d]=this.weekdaysShort(f,"").toLocaleLowerCase(),this._weekdaysParse[d]=this.weekdays(f,"").toLocaleLowerCase();return c?"dddd"===b?(e=gf.call(this._weekdaysParse,g),e!==-1?e:null):"ddd"===b?(e=gf.call(this._shortWeekdaysParse,g),e!==-1?e:null):(e=gf.call(this._minWeekdaysParse,g),e!==-1?e:null):"dddd"===b?(e=gf.call(this._weekdaysParse,g),e!==-1?e:(e=gf.call(this._shortWeekdaysParse,g),e!==-1?e:(e=gf.call(this._minWeekdaysParse,g),e!==-1?e:null))):"ddd"===b?(e=gf.call(this._shortWeekdaysParse,g),e!==-1?e:(e=gf.call(this._weekdaysParse,g),e!==-1?e:(e=gf.call(this._minWeekdaysParse,g),e!==-1?e:null))):(e=gf.call(this._minWeekdaysParse,g),e!==-1?e:(e=gf.call(this._weekdaysParse,g),e!==-1?e:(e=gf.call(this._shortWeekdaysParse,g),e!==-1?e:null)))}function Ja(a,b,c){var d,e,f;if(this._weekdaysParseExact)return Ia.call(this,a,b,c);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),d=0;d<7;d++){
+// test the regex
+if(
+// make the regex if we don't have it already
+e=k([2e3,1]).day(d),c&&!this._fullWeekdaysParse[d]&&(this._fullWeekdaysParse[d]=new RegExp("^"+this.weekdays(e,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[d]=new RegExp("^"+this.weekdaysShort(e,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[d]=new RegExp("^"+this.weekdaysMin(e,"").replace(".",".?")+"$","i")),this._weekdaysParse[d]||(f="^"+this.weekdays(e,"")+"|^"+this.weekdaysShort(e,"")+"|^"+this.weekdaysMin(e,""),this._weekdaysParse[d]=new RegExp(f.replace(".",""),"i")),c&&"dddd"===b&&this._fullWeekdaysParse[d].test(a))return d;if(c&&"ddd"===b&&this._shortWeekdaysParse[d].test(a))return d;if(c&&"dd"===b&&this._minWeekdaysParse[d].test(a))return d;if(!c&&this._weekdaysParse[d].test(a))return d}}
+// MOMENTS
+function Ka(a){if(!this.isValid())return null!=a?this:NaN;var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=Da(a,this.localeData()),this.add(a-b,"d")):b}function La(a){if(!this.isValid())return null!=a?this:NaN;var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")}function Ma(a){if(!this.isValid())return null!=a?this:NaN;
+// behaves the same as moment#day except
+// as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
+// as a setter, sunday should belong to the previous week.
+if(null!=a){var b=Ea(a,this.localeData());return this.day(this.day()%7?b:b-7)}return this.day()||7}function Na(a){return this._weekdaysParseExact?(i(this,"_weekdaysRegex")||Qa.call(this),a?this._weekdaysStrictRegex:this._weekdaysRegex):(i(this,"_weekdaysRegex")||(this._weekdaysRegex=sf),this._weekdaysStrictRegex&&a?this._weekdaysStrictRegex:this._weekdaysRegex)}function Oa(a){return this._weekdaysParseExact?(i(this,"_weekdaysRegex")||Qa.call(this),a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(i(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=tf),this._weekdaysShortStrictRegex&&a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Pa(a){return this._weekdaysParseExact?(i(this,"_weekdaysRegex")||Qa.call(this),a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(i(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=uf),this._weekdaysMinStrictRegex&&a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Qa(){function a(a,b){return b.length-a.length}var b,c,d,e,f,g=[],h=[],i=[],j=[];for(b=0;b<7;b++)
+// make the regex if we don't have it already
+c=k([2e3,1]).day(b),d=this.weekdaysMin(c,""),e=this.weekdaysShort(c,""),f=this.weekdays(c,""),g.push(d),h.push(e),i.push(f),j.push(d),j.push(e),j.push(f);for(
+// Sorting makes sure if one weekday (or abbr) is a prefix of another it
+// will match the longer piece.
+g.sort(a),h.sort(a),i.sort(a),j.sort(a),b=0;b<7;b++)h[b]=aa(h[b]),i[b]=aa(i[b]),j[b]=aa(j[b]);this._weekdaysRegex=new RegExp("^("+j.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+h.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+g.join("|")+")","i")}
+// FORMATTING
+function Ra(){return this.hours()%12||12}function Sa(){return this.hours()||24}function Ta(a,b){U(a,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),b)})}
+// PARSING
+function Ua(a,b){return b._meridiemParse}
+// LOCALES
+function Va(a){
+// IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
+// Using charAt should be more compatible.
+return"p"===(a+"").toLowerCase().charAt(0)}function Wa(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"}function Xa(a){return a?a.toLowerCase().replace("_","-"):a}
+// pick the locale from the array
+// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
+// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
+function Ya(a){for(var b,c,d,e,f=0;f<a.length;){for(e=Xa(a[f]).split("-"),b=e.length,c=Xa(a[f+1]),c=c?c.split("-"):null;b>0;){if(d=Za(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&v(e,c,!0)>=b-1)
+//the next array item is better than a shallower substring of this one
+break;b--}f++}return null}function Za(a){var b=null;
+// TODO: Find a better way to register and load all the locales in Node
+if(!zf[a]&&"undefined"!=typeof module&&module&&module.exports)try{b=vf._abbr,require("./locale/"+a),
+// because defineLocale currently also sets the global locale, we
+// want to undo that for lazy loaded locales
+$a(b)}catch(a){}return zf[a]}
+// This function will load locale and then set the global locale. If
+// no arguments are passed in, it will simply return the current global
+// locale key.
+function $a(a,b){var c;
+// moment.duration._locale = moment._locale = data;
+return a&&(c=p(b)?bb(a):_a(a,b),c&&(vf=c)),vf._abbr}function _a(a,b){if(null!==b){var c=yf;if(b.abbr=a,null!=zf[a])y("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),c=zf[a]._config;else if(null!=b.parentLocale){if(null==zf[b.parentLocale])return Af[b.parentLocale]||(Af[b.parentLocale]=[]),Af[b.parentLocale].push({name:a,config:b}),null;c=zf[b.parentLocale]._config}
+// backwards compat for now: also set the locale
+// make sure we set the locale AFTER all child locales have been
+// created, so we won't end up with the child locale set.
+return zf[a]=new C(B(c,b)),Af[a]&&Af[a].forEach(function(a){_a(a.name,a.config)}),$a(a),zf[a]}
+// useful for testing
+return delete zf[a],null}function ab(a,b){if(null!=b){var c,d=yf;
+// MERGE
+null!=zf[a]&&(d=zf[a]._config),b=B(d,b),c=new C(b),c.parentLocale=zf[a],zf[a]=c,
+// backwards compat for now: also set the locale
+$a(a)}else
+// pass null for config to unupdate, useful for tests
+null!=zf[a]&&(null!=zf[a].parentLocale?zf[a]=zf[a].parentLocale:null!=zf[a]&&delete zf[a]);return zf[a]}
+// returns locale data
+function bb(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return vf;if(!c(a)){if(
+//short-circuit everything else
+b=Za(a))return b;a=[a]}return Ya(a)}function cb(){return te(zf)}function db(a){var b,c=a._a;return c&&m(a).overflow===-2&&(b=c[$e]<0||c[$e]>11?$e:c[_e]<1||c[_e]>ea(c[Ze],c[$e])?_e:c[af]<0||c[af]>24||24===c[af]&&(0!==c[bf]||0!==c[cf]||0!==c[df])?af:c[bf]<0||c[bf]>59?bf:c[cf]<0||c[cf]>59?cf:c[df]<0||c[df]>999?df:-1,m(a)._overflowDayOfYear&&(b<Ze||b>_e)&&(b=_e),m(a)._overflowWeeks&&b===-1&&(b=ef),m(a)._overflowWeekday&&b===-1&&(b=ff),m(a).overflow=b),a}
+// date from iso format
+function eb(a){var b,c,d,e,f,g,h=a._i,i=Bf.exec(h)||Cf.exec(h);if(i){for(m(a).iso=!0,b=0,c=Ef.length;b<c;b++)if(Ef[b][1].exec(i[1])){e=Ef[b][0],d=Ef[b][2]!==!1;break}if(null==e)return void(a._isValid=!1);if(i[3]){for(b=0,c=Ff.length;b<c;b++)if(Ff[b][1].exec(i[3])){
+// match[2] should be 'T' or space
+f=(i[2]||" ")+Ff[b][0];break}if(null==f)return void(a._isValid=!1)}if(!d&&null!=f)return void(a._isValid=!1);if(i[4]){if(!Df.exec(i[4]))return void(a._isValid=!1);g="Z"}a._f=e+(f||"")+(g||""),kb(a)}else a._isValid=!1}
+// date from iso format or fallback
+function fb(b){var c=Gf.exec(b._i);return null!==c?void(b._d=new Date(+c[1])):(eb(b),void(b._isValid===!1&&(delete b._isValid,a.createFromInputFallback(b))))}
+// Pick the first defined of two or three arguments.
+function gb(a,b,c){return null!=a?a:null!=b?b:c}function hb(b){
+// hooks is actually the exported moment object
+var c=new Date(a.now());return b._useUTC?[c.getUTCFullYear(),c.getUTCMonth(),c.getUTCDate()]:[c.getFullYear(),c.getMonth(),c.getDate()]}
+// convert an array to a date.
+// the array should mirror the parameters below
+// note: all values past the year are optional and will default to the lowest possible value.
+// [year, month, day , hour, minute, second, millisecond]
+function ib(a){var b,c,d,e,f=[];if(!a._d){
+// Default to current date.
+// * if no year, month, day of month are given, default to today
+// * if day of month is given, default month and year
+// * if month is given, default only year
+// * if year is given, don't default anything
+for(d=hb(a),
+//compute day of the year from weeks and weekdays
+a._w&&null==a._a[_e]&&null==a._a[$e]&&jb(a),
+//if the day of the year is set, figure out what it is
+a._dayOfYear&&(e=gb(a._a[Ze],d[Ze]),a._dayOfYear>pa(e)&&(m(a)._overflowDayOfYear=!0),c=ta(e,0,a._dayOfYear),a._a[$e]=c.getUTCMonth(),a._a[_e]=c.getUTCDate()),b=0;b<3&&null==a._a[b];++b)a._a[b]=f[b]=d[b];
+// Zero out whatever was not defaulted, including time
+for(;b<7;b++)a._a[b]=f[b]=null==a._a[b]?2===b?1:0:a._a[b];
+// Check for 24:00:00.000
+24===a._a[af]&&0===a._a[bf]&&0===a._a[cf]&&0===a._a[df]&&(a._nextDay=!0,a._a[af]=0),a._d=(a._useUTC?ta:sa).apply(null,f),
+// Apply timezone offset from input. The actual utcOffset can be changed
+// with parseZone.
+null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[af]=24)}}function jb(a){var b,c,d,e,f,g,h,i;if(b=a._w,null!=b.GG||null!=b.W||null!=b.E)f=1,g=4,
+// TODO: We need to take the current isoWeekYear, but that depends on
+// how we interpret now (local, utc, fixed offset). So create
+// a now version of current config (take local/utc/offset flags, and
+// create now).
+c=gb(b.GG,a._a[Ze],wa(sb(),1,4).year),d=gb(b.W,1),e=gb(b.E,1),(e<1||e>7)&&(i=!0);else{f=a._locale._week.dow,g=a._locale._week.doy;var j=wa(sb(),f,g);c=gb(b.gg,a._a[Ze],j.year),
+// Default to current week.
+d=gb(b.w,j.week),null!=b.d?(
+// weekday -- low day numbers are considered next week
+e=b.d,(e<0||e>6)&&(i=!0)):null!=b.e?(
+// local weekday -- counting starts from begining of week
+e=b.e+f,(b.e<0||b.e>6)&&(i=!0)):
+// default to begining of week
+e=f}d<1||d>xa(c,f,g)?m(a)._overflowWeeks=!0:null!=i?m(a)._overflowWeekday=!0:(h=va(c,d,e,f,g),a._a[Ze]=h.year,a._dayOfYear=h.dayOfYear)}
+// date from string and format string
+function kb(b){
+// TODO: Move this to another part of the creation flow to prevent circular deps
+if(b._f===a.ISO_8601)return void eb(b);b._a=[],m(b).empty=!0;
+// This array is used to make a Date, either with `new Date` or `Date.UTC`
+var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=Y(b._f,b._locale).match(Ce)||[],c=0;c<e.length;c++)f=e[c],d=(h.match($(f,b))||[])[0],
+// console.log('token', token, 'parsedInput', parsedInput,
+// 'regex', getParseRegexForToken(token, config));
+d&&(g=h.substr(0,h.indexOf(d)),g.length>0&&m(b).unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),
+// don't parse if it's not a known token
+Fe[f]?(d?m(b).empty=!1:m(b).unusedTokens.push(f),da(f,d,b)):b._strict&&!d&&m(b).unusedTokens.push(f);
+// add remaining unparsed input length to the string
+m(b).charsLeftOver=i-j,h.length>0&&m(b).unusedInput.push(h),
+// clear _12h flag if hour is <= 12
+b._a[af]<=12&&m(b).bigHour===!0&&b._a[af]>0&&(m(b).bigHour=void 0),m(b).parsedDateParts=b._a.slice(0),m(b).meridiem=b._meridiem,
+// handle meridiem
+b._a[af]=lb(b._locale,b._a[af],b._meridiem),ib(b),db(b)}function lb(a,b,c){var d;
+// Fallback
+return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&b<12&&(b+=12),d||12!==b||(b=0),b):b}
+// date from string and array of format strings
+function mb(a){var b,c,d,e,f;if(0===a._f.length)return m(a).invalidFormat=!0,void(a._d=new Date(NaN));for(e=0;e<a._f.length;e++)f=0,b=q({},a),null!=a._useUTC&&(b._useUTC=a._useUTC),b._f=a._f[e],kb(b),n(b)&&(
+// if there is any input that was not parsed add a penalty for that format
+f+=m(b).charsLeftOver,
+//or tokens
+f+=10*m(b).unusedTokens.length,m(b).score=f,(null==d||f<d)&&(d=f,c=b));j(a,c||b)}function nb(a){if(!a._d){var b=L(a._i);a._a=h([b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],function(a){return a&&parseInt(a,10)}),ib(a)}}function ob(a){var b=new r(db(pb(a)));
+// Adding is smart enough around DST
+return b._nextDay&&(b.add(1,"d"),b._nextDay=void 0),b}function pb(a){var b=a._i,d=a._f;return a._locale=a._locale||bb(a._l),null===b||void 0===d&&""===b?o({nullInput:!0}):("string"==typeof b&&(a._i=b=a._locale.preparse(b)),s(b)?new r(db(b)):(g(b)?a._d=b:c(d)?mb(a):d?kb(a):qb(a),n(a)||(a._d=null),a))}function qb(b){var d=b._i;void 0===d?b._d=new Date(a.now()):g(d)?b._d=new Date(d.valueOf()):"string"==typeof d?fb(b):c(d)?(b._a=h(d.slice(0),function(a){return parseInt(a,10)}),ib(b)):"object"==typeof d?nb(b):f(d)?
+// from milliseconds
+b._d=new Date(d):a.createFromInputFallback(b)}function rb(a,b,f,g,h){var i={};
+// object construction must be done this way.
+// https://github.com/moment/moment/issues/1423
+return f!==!0&&f!==!1||(g=f,f=void 0),(d(a)&&e(a)||c(a)&&0===a.length)&&(a=void 0),i._isAMomentObject=!0,i._useUTC=i._isUTC=h,i._l=f,i._i=a,i._f=b,i._strict=g,ob(i)}function sb(a,b,c,d){return rb(a,b,c,d,!1)}
+// Pick a moment m from moments so that m[fn](other) is true for all
+// other. This relies on the function fn to be transitive.
+//
+// moments should either be an array of moment objects or an array, whose
+// first element is an array of moment objects.
+function tb(a,b){var d,e;if(1===b.length&&c(b[0])&&(b=b[0]),!b.length)return sb();for(d=b[0],e=1;e<b.length;++e)b[e].isValid()&&!b[e][a](d)||(d=b[e]);return d}
+// TODO: Use [].sort instead?
+function ub(){var a=[].slice.call(arguments,0);return tb("isBefore",a)}function vb(){var a=[].slice.call(arguments,0);return tb("isAfter",a)}function wb(a){var b=L(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;
+// representation for dateAddRemove
+this._milliseconds=+k+1e3*j+// 1000
+6e4*i+// 1000 * 60
+1e3*h*60*60,//using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
+// Because of dateAddRemove treats 24 hours as different from a
+// day when working around DST, we need to store them separately
+this._days=+g+7*f,
+// It is impossible translate months into days without knowing
+// which months you are are talking about, so we have to store
+// it separately.
+this._months=+e+3*d+12*c,this._data={},this._locale=bb(),this._bubble()}function xb(a){return a instanceof wb}function yb(a){return a<0?Math.round(-1*a)*-1:Math.round(a)}
+// FORMATTING
+function zb(a,b){U(a,0,0,function(){var a=this.utcOffset(),c="+";return a<0&&(a=-a,c="-"),c+T(~~(a/60),2)+b+T(~~a%60,2)})}function Ab(a,b){var c=(b||"").match(a);if(null===c)return null;var d=c[c.length-1]||[],e=(d+"").match(Kf)||["-",0,0],f=+(60*e[1])+u(e[2]);return 0===f?0:"+"===e[0]?f:-f}
+// Return a moment from input, that is local/utc/zone equivalent to model.
+function Bb(b,c){var d,e;
+// Use low-level api, because this fn is low-level api.
+return c._isUTC?(d=c.clone(),e=(s(b)||g(b)?b.valueOf():sb(b).valueOf())-d.valueOf(),d._d.setTime(d._d.valueOf()+e),a.updateOffset(d,!1),d):sb(b).local()}function Cb(a){
+// On Firefox.24 Date#getTimezoneOffset returns a floating point.
+// https://github.com/moment/moment/pull/1871
+return 15*-Math.round(a._d.getTimezoneOffset()/15)}
+// MOMENTS
+// keepLocalTime = true means only change the timezone, without
+// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
+// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
+// +0200, so we adjust the time as needed, to be valid.
+//
+// Keeping the time actually adds/subtracts (one hour)
+// from the actual represented time. That is why we call updateOffset
+// a second time. In case it wants us to change the offset again
+// _changeInProgress == true case, then we have to adjust, because
+// there is no such time in the given timezone.
+function Db(b,c){var d,e=this._offset||0;if(!this.isValid())return null!=b?this:NaN;if(null!=b){if("string"==typeof b){if(b=Ab(Ue,b),null===b)return this}else Math.abs(b)<16&&(b=60*b);return!this._isUTC&&c&&(d=Cb(this)),this._offset=b,this._isUTC=!0,null!=d&&this.add(d,"m"),e!==b&&(!c||this._changeInProgress?Tb(this,Ob(b-e,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?e:Cb(this)}function Eb(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}function Fb(a){return this.utcOffset(0,a)}function Gb(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(Cb(this),"m")),this}function Hb(){if(null!=this._tzm)this.utcOffset(this._tzm);else if("string"==typeof this._i){var a=Ab(Te,this._i);null!=a?this.utcOffset(a):this.utcOffset(0,!0)}return this}function Ib(a){return!!this.isValid()&&(a=a?sb(a).utcOffset():0,(this.utcOffset()-a)%60===0)}function Jb(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Kb(){if(!p(this._isDSTShifted))return this._isDSTShifted;var a={};if(q(a,this),a=pb(a),a._a){var b=a._isUTC?k(a._a):sb(a._a);this._isDSTShifted=this.isValid()&&v(a._a,b.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function Lb(){return!!this.isValid()&&!this._isUTC}function Mb(){return!!this.isValid()&&this._isUTC}function Nb(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Ob(a,b){var c,d,e,g=a,
+// matching against regexp is expensive, do it on demand
+h=null;// checks for null or undefined
+return xb(a)?g={ms:a._milliseconds,d:a._days,M:a._months}:f(a)?(g={},b?g[b]=a:g.milliseconds=a):(h=Lf.exec(a))?(c="-"===h[1]?-1:1,g={y:0,d:u(h[_e])*c,h:u(h[af])*c,m:u(h[bf])*c,s:u(h[cf])*c,ms:u(yb(1e3*h[df]))*c}):(h=Mf.exec(a))?(c="-"===h[1]?-1:1,g={y:Pb(h[2],c),M:Pb(h[3],c),w:Pb(h[4],c),d:Pb(h[5],c),h:Pb(h[6],c),m:Pb(h[7],c),s:Pb(h[8],c)}):null==g?g={}:"object"==typeof g&&("from"in g||"to"in g)&&(e=Rb(sb(g.from),sb(g.to)),g={},g.ms=e.milliseconds,g.M=e.months),d=new wb(g),xb(a)&&i(a,"_locale")&&(d._locale=a._locale),d}function Pb(a,b){
+// We'd normally use ~~inp for this, but unfortunately it also
+// converts floats to ints.
+// inp may be undefined, so careful calling replace on it.
+var c=a&&parseFloat(a.replace(",","."));
+// apply sign while we're at it
+return(isNaN(c)?0:c)*b}function Qb(a,b){var c={milliseconds:0,months:0};return c.months=b.month()-a.month()+12*(b.year()-a.year()),a.clone().add(c.months,"M").isAfter(b)&&--c.months,c.milliseconds=+b-+a.clone().add(c.months,"M"),c}function Rb(a,b){var c;return a.isValid()&&b.isValid()?(b=Bb(b,a),a.isBefore(b)?c=Qb(a,b):(c=Qb(b,a),c.milliseconds=-c.milliseconds,c.months=-c.months),c):{milliseconds:0,months:0}}
+// TODO: remove 'name' arg after deprecation is removed
+function Sb(a,b){return function(c,d){var e,f;
+//invert the arguments, but complain about it
+return null===d||isNaN(+d)||(y(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),f=c,c=d,d=f),c="string"==typeof c?+c:c,e=Ob(c,d),Tb(this,e,a),this}}function Tb(b,c,d,e){var f=c._milliseconds,g=yb(c._days),h=yb(c._months);b.isValid()&&(e=null==e||e,f&&b._d.setTime(b._d.valueOf()+f*d),g&&Q(b,"Date",P(b,"Date")+g*d),h&&ja(b,P(b,"Month")+h*d),e&&a.updateOffset(b,g||h))}function Ub(a,b){var c=a.diff(b,"days",!0);return c<-6?"sameElse":c<-1?"lastWeek":c<0?"lastDay":c<1?"sameDay":c<2?"nextDay":c<7?"nextWeek":"sameElse"}function Vb(b,c){
+// We want to compare the start of today, vs this.
+// Getting start-of-today depends on whether we're local/utc/offset or not.
+var d=b||sb(),e=Bb(d,this).startOf("day"),f=a.calendarFormat(this,e)||"sameElse",g=c&&(z(c[f])?c[f].call(this,d):c[f]);return this.format(g||this.localeData().calendar(f,this,sb(d)))}function Wb(){return new r(this)}function Xb(a,b){var c=s(a)?a:sb(a);return!(!this.isValid()||!c.isValid())&&(b=K(p(b)?"millisecond":b),"millisecond"===b?this.valueOf()>c.valueOf():c.valueOf()<this.clone().startOf(b).valueOf())}function Yb(a,b){var c=s(a)?a:sb(a);return!(!this.isValid()||!c.isValid())&&(b=K(p(b)?"millisecond":b),"millisecond"===b?this.valueOf()<c.valueOf():this.clone().endOf(b).valueOf()<c.valueOf())}function Zb(a,b,c,d){return d=d||"()",("("===d[0]?this.isAfter(a,c):!this.isBefore(a,c))&&(")"===d[1]?this.isBefore(b,c):!this.isAfter(b,c))}function $b(a,b){var c,d=s(a)?a:sb(a);return!(!this.isValid()||!d.isValid())&&(b=K(b||"millisecond"),"millisecond"===b?this.valueOf()===d.valueOf():(c=d.valueOf(),this.clone().startOf(b).valueOf()<=c&&c<=this.clone().endOf(b).valueOf()))}function _b(a,b){return this.isSame(a,b)||this.isAfter(a,b)}function ac(a,b){return this.isSame(a,b)||this.isBefore(a,b)}function bc(a,b,c){var d,e,f,g;// 1000
+// 1000 * 60
+// 1000 * 60 * 60
+// 1000 * 60 * 60 * 24, negate dst
+// 1000 * 60 * 60 * 24 * 7, negate dst
+return this.isValid()?(d=Bb(a,this),d.isValid()?(e=6e4*(d.utcOffset()-this.utcOffset()),b=K(b),"year"===b||"month"===b||"quarter"===b?(g=cc(this,d),"quarter"===b?g/=3:"year"===b&&(g/=12)):(f=this-d,g="second"===b?f/1e3:"minute"===b?f/6e4:"hour"===b?f/36e5:"day"===b?(f-e)/864e5:"week"===b?(f-e)/6048e5:f),c?g:t(g)):NaN):NaN}function cc(a,b){
+// difference in months
+var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),
+// b is in (anchor - 1 month, anchor + 1 month)
+f=a.clone().add(e,"months");
+//check for negative zero, return zero if negative zero
+// linear across the month
+// linear across the month
+return b-f<0?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)||0}function dc(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function ec(){var a=this.clone().utc();return 0<a.year()&&a.year()<=9999?z(Date.prototype.toISOString)?this.toDate().toISOString():X(a,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):X(a,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}/**
+ * Return a human readable representation of a moment that can
+ * also be evaluated to get a new moment which is the same
+ *
+ * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
+ */
+function fc(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var a="moment",b="";this.isLocal()||(a=0===this.utcOffset()?"moment.utc":"moment.parseZone",b="Z");var c="["+a+'("]',d=0<this.year()&&this.year()<=9999?"YYYY":"YYYYYY",e="-MM-DD[T]HH:mm:ss.SSS",f=b+'[")]';return this.format(c+d+e+f)}function gc(b){b||(b=this.isUtc()?a.defaultFormatUtc:a.defaultFormat);var c=X(this,b);return this.localeData().postformat(c)}function hc(a,b){return this.isValid()&&(s(a)&&a.isValid()||sb(a).isValid())?Ob({to:this,from:a}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function ic(a){return this.from(sb(),a)}function jc(a,b){return this.isValid()&&(s(a)&&a.isValid()||sb(a).isValid())?Ob({from:this,to:a}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function kc(a){return this.to(sb(),a)}
+// If passed a locale key, it will set the locale for this
+// instance. Otherwise, it will return the locale configuration
+// variables for this instance.
+function lc(a){var b;return void 0===a?this._locale._abbr:(b=bb(a),null!=b&&(this._locale=b),this)}function mc(){return this._locale}function nc(a){
+// the following switch intentionally omits break keywords
+// to utilize falling through the cases.
+switch(a=K(a)){case"year":this.month(0);/* falls through */
+case"quarter":case"month":this.date(1);/* falls through */
+case"week":case"isoWeek":case"day":case"date":this.hours(0);/* falls through */
+case"hour":this.minutes(0);/* falls through */
+case"minute":this.seconds(0);/* falls through */
+case"second":this.milliseconds(0)}
+// weeks are a special case
+// quarters are also special
+return"week"===a&&this.weekday(0),"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this}function oc(a){
+// 'date' is an alias for 'day', so it should be considered as such.
+return a=K(a),void 0===a||"millisecond"===a?this:("date"===a&&(a="day"),this.startOf(a).add(1,"isoWeek"===a?"week":a).subtract(1,"ms"))}function pc(){return this._d.valueOf()-6e4*(this._offset||0)}function qc(){return Math.floor(this.valueOf()/1e3)}function rc(){return new Date(this.valueOf())}function sc(){var a=this;return[a.year(),a.month(),a.date(),a.hour(),a.minute(),a.second(),a.millisecond()]}function tc(){var a=this;return{years:a.year(),months:a.month(),date:a.date(),hours:a.hours(),minutes:a.minutes(),seconds:a.seconds(),milliseconds:a.milliseconds()}}function uc(){
+// new Date(NaN).toJSON() === null
+return this.isValid()?this.toISOString():null}function vc(){return n(this)}function wc(){return j({},m(this))}function xc(){return m(this).overflow}function yc(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function zc(a,b){U(0,[a,a.length],0,b)}
+// MOMENTS
+function Ac(a){return Ec.call(this,a,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Bc(a){return Ec.call(this,a,this.isoWeek(),this.isoWeekday(),1,4)}function Cc(){return xa(this.year(),1,4)}function Dc(){var a=this.localeData()._week;return xa(this.year(),a.dow,a.doy)}function Ec(a,b,c,d,e){var f;return null==a?wa(this,d,e).year:(f=xa(a,d,e),b>f&&(b=f),Fc.call(this,a,b,c,d,e))}function Fc(a,b,c,d,e){var f=va(a,b,c,d,e),g=ta(f.year,0,f.dayOfYear);return this.year(g.getUTCFullYear()),this.month(g.getUTCMonth()),this.date(g.getUTCDate()),this}
+// MOMENTS
+function Gc(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)}
+// HELPERS
+// MOMENTS
+function Hc(a){var b=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")}function Ic(a,b){b[df]=u(1e3*("0."+a))}
+// MOMENTS
+function Jc(){return this._isUTC?"UTC":""}function Kc(){return this._isUTC?"Coordinated Universal Time":""}function Lc(a){return sb(1e3*a)}function Mc(){return sb.apply(null,arguments).parseZone()}function Nc(a){return a}function Oc(a,b,c,d){var e=bb(),f=k().set(d,b);return e[c](f,a)}function Pc(a,b,c){if(f(a)&&(b=a,a=void 0),a=a||"",null!=b)return Oc(a,b,c,"month");var d,e=[];for(d=0;d<12;d++)e[d]=Oc(a,d,c,"month");return e}
+// ()
+// (5)
+// (fmt, 5)
+// (fmt)
+// (true)
+// (true, 5)
+// (true, fmt, 5)
+// (true, fmt)
+function Qc(a,b,c,d){"boolean"==typeof a?(f(b)&&(c=b,b=void 0),b=b||""):(b=a,c=b,a=!1,f(b)&&(c=b,b=void 0),b=b||"");var e=bb(),g=a?e._week.dow:0;if(null!=c)return Oc(b,(c+g)%7,d,"day");var h,i=[];for(h=0;h<7;h++)i[h]=Oc(b,(h+g)%7,d,"day");return i}function Rc(a,b){return Pc(a,b,"months")}function Sc(a,b){return Pc(a,b,"monthsShort")}function Tc(a,b,c){return Qc(a,b,c,"weekdays")}function Uc(a,b,c){return Qc(a,b,c,"weekdaysShort")}function Vc(a,b,c){return Qc(a,b,c,"weekdaysMin")}function Wc(){var a=this._data;return this._milliseconds=Xf(this._milliseconds),this._days=Xf(this._days),this._months=Xf(this._months),a.milliseconds=Xf(a.milliseconds),a.seconds=Xf(a.seconds),a.minutes=Xf(a.minutes),a.hours=Xf(a.hours),a.months=Xf(a.months),a.years=Xf(a.years),this}function Xc(a,b,c,d){var e=Ob(b,c);return a._milliseconds+=d*e._milliseconds,a._days+=d*e._days,a._months+=d*e._months,a._bubble()}
+// supports only 2.0-style add(1, 's') or add(duration)
+function Yc(a,b){return Xc(this,a,b,1)}
+// supports only 2.0-style subtract(1, 's') or subtract(duration)
+function Zc(a,b){return Xc(this,a,b,-1)}function $c(a){return a<0?Math.floor(a):Math.ceil(a)}function _c(){var a,b,c,d,e,f=this._milliseconds,g=this._days,h=this._months,i=this._data;
+// if we have a mix of positive and negative values, bubble down first
+// check: https://github.com/moment/moment/issues/2166
+// The following code bubbles up values, see the tests for
+// examples of what that means.
+// convert days to months
+// 12 months -> 1 year
+return f>=0&&g>=0&&h>=0||f<=0&&g<=0&&h<=0||(f+=864e5*$c(bd(h)+g),g=0,h=0),i.milliseconds=f%1e3,a=t(f/1e3),i.seconds=a%60,b=t(a/60),i.minutes=b%60,c=t(b/60),i.hours=c%24,g+=t(c/24),e=t(ad(g)),h+=e,g-=$c(bd(e)),d=t(h/12),h%=12,i.days=g,i.months=h,i.years=d,this}function ad(a){
+// 400 years have 146097 days (taking into account leap year rules)
+// 400 years have 12 months === 4800
+return 4800*a/146097}function bd(a){
+// the reverse of daysToMonths
+return 146097*a/4800}function cd(a){var b,c,d=this._milliseconds;if(a=K(a),"month"===a||"year"===a)return b=this._days+d/864e5,c=this._months+ad(b),"month"===a?c:c/12;switch(
+// handle milliseconds separately because of floating point math errors (issue #1867)
+b=this._days+Math.round(bd(this._months)),a){case"week":return b/7+d/6048e5;case"day":return b+d/864e5;case"hour":return 24*b+d/36e5;case"minute":return 1440*b+d/6e4;case"second":return 86400*b+d/1e3;
+// Math.floor prevents floating point math errors here
+case"millisecond":return Math.floor(864e5*b)+d;default:throw new Error("Unknown unit "+a)}}
+// TODO: Use this.as('ms')?
+function dd(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*u(this._months/12)}function ed(a){return function(){return this.as(a)}}function fd(a){return a=K(a),this[a+"s"]()}function gd(a){return function(){return this._data[a]}}function hd(){return t(this.days()/7)}
+// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
+function id(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function jd(a,b,c){var d=Ob(a).abs(),e=lg(d.as("s")),f=lg(d.as("m")),g=lg(d.as("h")),h=lg(d.as("d")),i=lg(d.as("M")),j=lg(d.as("y")),k=e<mg.s&&["s",e]||f<=1&&["m"]||f<mg.m&&["mm",f]||g<=1&&["h"]||g<mg.h&&["hh",g]||h<=1&&["d"]||h<mg.d&&["dd",h]||i<=1&&["M"]||i<mg.M&&["MM",i]||j<=1&&["y"]||["yy",j];return k[2]=b,k[3]=+a>0,k[4]=c,id.apply(null,k)}
+// This function allows you to set the rounding function for relative time strings
+function kd(a){return void 0===a?lg:"function"==typeof a&&(lg=a,!0)}
+// This function allows you to set a threshold for relative time strings
+function ld(a,b){return void 0!==mg[a]&&(void 0===b?mg[a]:(mg[a]=b,!0))}function md(a){var b=this.localeData(),c=jd(this,!a,b);return a&&(c=b.pastFuture(+this,c)),b.postformat(c)}function nd(){
+// for ISO strings we do not use the normal bubbling rules:
+// * milliseconds bubble up until they become hours
+// * days do not bubble at all
+// * months bubble up until they become years
+// This is because there is no context-free conversion between hours and days
+// (think of clock changes)
+// and also not between days and months (28-31 days per month)
+var a,b,c,d=ng(this._milliseconds)/1e3,e=ng(this._days),f=ng(this._months);
+// 3600 seconds -> 60 minutes -> 1 hour
+a=t(d/60),b=t(a/60),d%=60,a%=60,
+// 12 months -> 1 year
+c=t(f/12),f%=12;
+// inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
+var g=c,h=f,i=e,j=b,k=a,l=d,m=this.asSeconds();return m?(m<0?"-":"")+"P"+(g?g+"Y":"")+(h?h+"M":"")+(i?i+"D":"")+(j||k||l?"T":"")+(j?j+"H":"")+(k?k+"M":"")+(l?l+"S":""):"P0D"}
+//! moment.js locale configuration
+//! locale : Belarusian [be]
+//! author : Dmitry Demidov : https://github.com/demidov91
+//! author: Praleska: http://praleska.pro/
+//! Author : Menelion Elensúle : https://github.com/Oire
+function od(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&b%10<=4&&(b%100<10||b%100>=20)?c[1]:c[2]}function pd(a,b,c){var d={mm:b?"хвіліна_хвіліны_хвілін":"хвіліну_хвіліны_хвілін",hh:b?"гадзіна_гадзіны_гадзін":"гадзіну_гадзіны_гадзін",dd:"дзень_дні_дзён",MM:"месяц_месяцы_месяцаў",yy:"год_гады_гадоў"};return"m"===c?b?"хвіліна":"хвіліну":"h"===c?b?"гадзіна":"гадзіну":a+" "+od(d[c],+a)}
+//! moment.js locale configuration
+//! locale : Breton [br]
+//! author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
+function qd(a,b,c){var d={mm:"munutenn",MM:"miz",dd:"devezh"};return a+" "+td(d[c],a)}function rd(a){switch(sd(a)){case 1:case 3:case 4:case 5:case 9:return a+" bloaz";default:return a+" vloaz"}}function sd(a){return a>9?sd(a%10):a}function td(a,b){return 2===b?ud(a):a}function ud(a){var b={m:"v",b:"v",d:"z"};return void 0===b[a.charAt(0)]?a:b[a.charAt(0)]+a.substring(1)}
+//! moment.js locale configuration
+//! locale : Bosnian [bs]
+//! author : Nedim Cholich : https://github.com/frontyard
+//! based on (hr) translation by Bojan Marković
+function vd(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}function wd(a){return a>1&&a<5&&1!==~~(a/10)}function xd(a,b,c,d){var e=a+" ";switch(c){case"s":// a few seconds / in a few seconds / a few seconds ago
+return b||d?"pár sekund":"pár sekundami";case"m":// a minute / in a minute / a minute ago
+return b?"minuta":d?"minutu":"minutou";case"mm":// 9 minutes / in 9 minutes / 9 minutes ago
+// 9 minutes / in 9 minutes / 9 minutes ago
+return b||d?e+(wd(a)?"minuty":"minut"):e+"minutami";break;case"h":// an hour / in an hour / an hour ago
+return b?"hodina":d?"hodinu":"hodinou";case"hh":// 9 hours / in 9 hours / 9 hours ago
+// 9 hours / in 9 hours / 9 hours ago
+return b||d?e+(wd(a)?"hodiny":"hodin"):e+"hodinami";break;case"d":// a day / in a day / a day ago
+return b||d?"den":"dnem";case"dd":// 9 days / in 9 days / 9 days ago
+// 9 days / in 9 days / 9 days ago
+return b||d?e+(wd(a)?"dny":"dní"):e+"dny";break;case"M":// a month / in a month / a month ago
+return b||d?"měsíc":"měsícem";case"MM":// 9 months / in 9 months / 9 months ago
+// 9 months / in 9 months / 9 months ago
+return b||d?e+(wd(a)?"měsíce":"měsíců"):e+"měsíci";break;case"y":// a year / in a year / a year ago
+return b||d?"rok":"rokem";case"yy":// 9 years / in 9 years / 9 years ago
+// 9 years / in 9 years / 9 years ago
+return b||d?e+(wd(a)?"roky":"let"):e+"lety"}}
+//! moment.js locale configuration
+//! locale : German (Austria) [de-at]
+//! author : lluchs : https://github.com/lluchs
+//! author: Menelion Elensúle: https://github.com/Oire
+//! author : Martin Groller : https://github.com/MadMG
+//! author : Mikolaj Dadela : https://github.com/mik01aj
+function yd(a,b,c,d){var e={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?e[c][0]:e[c][1]}
+//! moment.js locale configuration
+//! locale : German [de]
+//! author : lluchs : https://github.com/lluchs
+//! author: Menelion Elensúle: https://github.com/Oire
+//! author : Mikolaj Dadela : https://github.com/mik01aj
+function zd(a,b,c,d){var e={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?e[c][0]:e[c][1]}
+//! moment.js locale configuration
+//! locale : Estonian [et]
+//! author : Henry Kehlmann : https://github.com/madhenry
+//! improvements : Illimar Tambek : https://github.com/ragulka
+function Ad(a,b,c,d){var e={s:["mõne sekundi","mõni sekund","paar sekundit"],m:["ühe minuti","üks minut"],mm:[a+" minuti",a+" minutit"],h:["ühe tunni","tund aega","üks tund"],hh:[a+" tunni",a+" tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:[a+" kuu",a+" kuud"],y:["ühe aasta","aasta","üks aasta"],yy:[a+" aasta",a+" aastat"]};return b?e[c][2]?e[c][2]:e[c][1]:d?e[c][0]:e[c][1]}function Bd(a,b,c,d){var e="";switch(c){case"s":return d?"muutaman sekunnin":"muutama sekunti";case"m":return d?"minuutin":"minuutti";case"mm":e=d?"minuutin":"minuuttia";break;case"h":return d?"tunnin":"tunti";case"hh":e=d?"tunnin":"tuntia";break;case"d":return d?"päivän":"päivä";case"dd":e=d?"päivän":"päivää";break;case"M":return d?"kuukauden":"kuukausi";case"MM":e=d?"kuukauden":"kuukautta";break;case"y":return d?"vuoden":"vuosi";case"yy":e=d?"vuoden":"vuotta"}return e=Cd(a,d)+" "+e}function Cd(a,b){return a<10?b?Sg[a]:Rg[a]:a}
+//! moment.js locale configuration
+//! locale : Croatian [hr]
+//! author : Bojan Marković : https://github.com/bmarkovic
+function Dd(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}function Ed(a,b,c,d){var e=a;switch(c){case"s":return d||b?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(d||b?" perc":" perce");case"mm":return e+(d||b?" perc":" perce");case"h":return"egy"+(d||b?" óra":" órája");case"hh":return e+(d||b?" óra":" órája");case"d":return"egy"+(d||b?" nap":" napja");case"dd":return e+(d||b?" nap":" napja");case"M":return"egy"+(d||b?" hónap":" hónapja");case"MM":return e+(d||b?" hónap":" hónapja");case"y":return"egy"+(d||b?" év":" éve");case"yy":return e+(d||b?" év":" éve")}return""}function Fd(a){return(a?"":"[múlt] ")+"["+ah[this.day()]+"] LT[-kor]"}
+//! moment.js locale configuration
+//! locale : Icelandic [is]
+//! author : Hinrik Örn Sigurðsson : https://github.com/hinrik
+function Gd(a){return a%100===11||a%10!==1}function Hd(a,b,c,d){var e=a+" ";switch(c){case"s":return b||d?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return b?"mínúta":"mínútu";case"mm":return Gd(a)?e+(b||d?"mínútur":"mínútum"):b?e+"mínúta":e+"mínútu";case"hh":return Gd(a)?e+(b||d?"klukkustundir":"klukkustundum"):e+"klukkustund";case"d":return b?"dagur":d?"dag":"degi";case"dd":return Gd(a)?b?e+"dagar":e+(d?"daga":"dögum"):b?e+"dagur":e+(d?"dag":"degi");case"M":return b?"mánuður":d?"mánuð":"mánuði";case"MM":return Gd(a)?b?e+"mánuðir":e+(d?"mánuði":"mánuðum"):b?e+"mánuður":e+(d?"mánuð":"mánuði");case"y":return b||d?"ár":"ári";case"yy":return Gd(a)?e+(b||d?"ár":"árum"):e+(b||d?"ár":"ári")}}
+//! moment.js locale configuration
+//! locale : Luxembourgish [lb]
+//! author : mweimerskirch : https://github.com/mweimerskirch
+//! author : David Raison : https://github.com/kwisatz
+function Id(a,b,c,d){var e={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return b?e[c][0]:e[c][1]}function Jd(a){var b=a.substr(0,a.indexOf(" "));return Ld(b)?"a "+a:"an "+a}function Kd(a){var b=a.substr(0,a.indexOf(" "));return Ld(b)?"viru "+a:"virun "+a}/**
+ * Returns true if the word before the given number loses the '-n' ending.
+ * e.g. 'an 10 Deeg' but 'a 5 Deeg'
+ *
+ * @param number {integer}
+ * @returns {boolean}
+ */
+function Ld(a){if(a=parseInt(a,10),isNaN(a))return!1;if(a<0)
+// Negative Number --> always true
+return!0;if(a<10)
+// Only 1 digit
+return 4<=a&&a<=7;if(a<100){
+// 2 digits
+var b=a%10,c=a/10;return Ld(0===b?c:b)}if(a<1e4){
+// 3 or 4 digits --> recursively check first digit
+for(;a>=10;)a/=10;return Ld(a)}
+// Anything larger than 4 digits: recursively check first n-3 digits
+return a/=1e3,Ld(a)}function Md(a,b,c,d){return b?"kelios sekundės":d?"kelių sekundžių":"kelias sekundes"}function Nd(a,b,c,d){return b?Pd(c)[0]:d?Pd(c)[1]:Pd(c)[2]}function Od(a){return a%10===0||a>10&&a<20}function Pd(a){return dh[a].split("_")}function Qd(a,b,c,d){var e=a+" ";return 1===a?e+Nd(a,b,c[0],d):b?e+(Od(a)?Pd(c)[1]:Pd(c)[0]):d?e+Pd(c)[1]:e+(Od(a)?Pd(c)[1]:Pd(c)[2])}/**
+ * @param withoutSuffix boolean true = a length of time; false = before/after a period of time.
+ */
+function Rd(a,b,c){return c?b%10===1&&b%100!==11?a[2]:a[3]:b%10===1&&b%100!==11?a[0]:a[1]}function Sd(a,b,c){return a+" "+Rd(eh[c],a,b)}function Td(a,b,c){return Rd(eh[c],a,b)}function Ud(a,b){return b?"dažas sekundes":"dažām sekundēm"}function Vd(a,b,c,d){var e="";if(b)switch(c){case"s":e="काही सेकंद";break;case"m":e="एक मिनिट";break;case"mm":e="%d मिनिटे";break;case"h":e="एक तास";break;case"hh":e="%d तास";break;case"d":e="एक दिवस";break;case"dd":e="%d दिवस";break;case"M":e="एक महिना";break;case"MM":e="%d महिने";break;case"y":e="एक वर्ष";break;case"yy":e="%d वर्षे"}else switch(c){case"s":e="काही सेकंदां";break;case"m":e="एका मिनिटा";break;case"mm":e="%d मिनिटां";break;case"h":e="एका तासा";break;case"hh":e="%d तासां";break;case"d":e="एका दिवसा";break;case"dd":e="%d दिवसां";break;case"M":e="एका महिन्या";break;case"MM":e="%d महिन्यां";break;case"y":e="एका वर्षा";break;case"yy":e="%d वर्षां"}return e.replace(/%d/i,a)}function Wd(a){return a%10<5&&a%10>1&&~~(a/10)%10!==1}function Xd(a,b,c){var d=a+" ";switch(c){case"m":return b?"minuta":"minutę";case"mm":return d+(Wd(a)?"minuty":"minut");case"h":return b?"godzina":"godzinę";case"hh":return d+(Wd(a)?"godziny":"godzin");case"MM":return d+(Wd(a)?"miesiące":"miesięcy");case"yy":return d+(Wd(a)?"lata":"lat")}}
+//! moment.js locale configuration
+//! locale : Romanian [ro]
+//! author : Vlad Gurdiga : https://github.com/gurdiga
+//! author : Valentin Agachi : https://github.com/avaly
+function Yd(a,b,c){var d={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},e=" ";return(a%100>=20||a>=100&&a%100===0)&&(e=" de "),a+e+d[c]}
+//! moment.js locale configuration
+//! locale : Russian [ru]
+//! author : Viktorminator : https://github.com/Viktorminator
+//! Author : Menelion Elensúle : https://github.com/Oire
+//! author : Коренберг Марк : https://github.com/socketpair
+function Zd(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&b%10<=4&&(b%100<10||b%100>=20)?c[1]:c[2]}function $d(a,b,c){var d={mm:b?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",MM:"месяц_месяца_месяцев",yy:"год_года_лет"};return"m"===c?b?"минута":"минуту":a+" "+Zd(d[c],+a)}function _d(a){return a>1&&a<5}function ae(a,b,c,d){var e=a+" ";switch(c){case"s":// a few seconds / in a few seconds / a few seconds ago
+return b||d?"pár sekúnd":"pár sekundami";case"m":// a minute / in a minute / a minute ago
+return b?"minúta":d?"minútu":"minútou";case"mm":// 9 minutes / in 9 minutes / 9 minutes ago
+// 9 minutes / in 9 minutes / 9 minutes ago
+return b||d?e+(_d(a)?"minúty":"minút"):e+"minútami";break;case"h":// an hour / in an hour / an hour ago
+return b?"hodina":d?"hodinu":"hodinou";case"hh":// 9 hours / in 9 hours / 9 hours ago
+// 9 hours / in 9 hours / 9 hours ago
+return b||d?e+(_d(a)?"hodiny":"hodín"):e+"hodinami";break;case"d":// a day / in a day / a day ago
+return b||d?"deň":"dňom";case"dd":// 9 days / in 9 days / 9 days ago
+// 9 days / in 9 days / 9 days ago
+return b||d?e+(_d(a)?"dni":"dní"):e+"dňami";break;case"M":// a month / in a month / a month ago
+return b||d?"mesiac":"mesiacom";case"MM":// 9 months / in 9 months / 9 months ago
+// 9 months / in 9 months / 9 months ago
+return b||d?e+(_d(a)?"mesiace":"mesiacov"):e+"mesiacmi";break;case"y":// a year / in a year / a year ago
+return b||d?"rok":"rokom";case"yy":// 9 years / in 9 years / 9 years ago
+// 9 years / in 9 years / 9 years ago
+return b||d?e+(_d(a)?"roky":"rokov"):e+"rokmi"}}
+//! moment.js locale configuration
+//! locale : Slovenian [sl]
+//! author : Robert Sedovšek : https://github.com/sedovsek
+function be(a,b,c,d){var e=a+" ";switch(c){case"s":return b||d?"nekaj sekund":"nekaj sekundami";case"m":return b?"ena minuta":"eno minuto";case"mm":return e+=1===a?b?"minuta":"minuto":2===a?b||d?"minuti":"minutama":a<5?b||d?"minute":"minutami":b||d?"minut":"minutami";case"h":return b?"ena ura":"eno uro";case"hh":return e+=1===a?b?"ura":"uro":2===a?b||d?"uri":"urama":a<5?b||d?"ure":"urami":b||d?"ur":"urami";case"d":return b||d?"en dan":"enim dnem";case"dd":return e+=1===a?b||d?"dan":"dnem":2===a?b||d?"dni":"dnevoma":b||d?"dni":"dnevi";case"M":return b||d?"en mesec":"enim mesecem";case"MM":return e+=1===a?b||d?"mesec":"mesecem":2===a?b||d?"meseca":"mesecema":a<5?b||d?"mesece":"meseci":b||d?"mesecev":"meseci";case"y":return b||d?"eno leto":"enim letom";case"yy":return e+=1===a?b||d?"leto":"letom":2===a?b||d?"leti":"letoma":a<5?b||d?"leta":"leti":b||d?"let":"leti"}}function ce(a){var b=a;return b=a.indexOf("jaj")!==-1?b.slice(0,-3)+"leS":a.indexOf("jar")!==-1?b.slice(0,-3)+"waQ":a.indexOf("DIS")!==-1?b.slice(0,-3)+"nem":b+" pIq"}function de(a){var b=a;return b=a.indexOf("jaj")!==-1?b.slice(0,-3)+"Hu’":a.indexOf("jar")!==-1?b.slice(0,-3)+"wen":a.indexOf("DIS")!==-1?b.slice(0,-3)+"ben":b+" ret"}function ee(a,b,c,d){var e=fe(a);switch(c){case"mm":return e+" tup";case"hh":return e+" rep";case"dd":return e+" jaj";case"MM":return e+" jar";case"yy":return e+" DIS"}}function fe(a){var b=Math.floor(a%1e3/100),c=Math.floor(a%100/10),d=a%10,e="";return b>0&&(e+=Fh[b]+"vatlh"),c>0&&(e+=(""!==e?" ":"")+Fh[c]+"maH"),d>0&&(e+=(""!==e?" ":"")+Fh[d]),""===e?"pagh":e}function ge(a,b,c,d){var e={s:["viensas secunds","'iensas secunds"],m:["'n míut","'iens míut"],mm:[a+" míuts",""+a+" míuts"],h:["'n þora","'iensa þora"],hh:[a+" þoras",""+a+" þoras"],d:["'n ziua","'iensa ziua"],dd:[a+" ziuas",""+a+" ziuas"],M:["'n mes","'iens mes"],MM:[a+" mesen",""+a+" mesen"],y:["'n ar","'iens ar"],yy:[a+" ars",""+a+" ars"]};return d?e[c][0]:b?e[c][0]:e[c][1]}
+//! moment.js locale configuration
+//! locale : Ukrainian [uk]
+//! author : zemlanin : https://github.com/zemlanin
+//! Author : Menelion Elensúle : https://github.com/Oire
+function he(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&b%10<=4&&(b%100<10||b%100>=20)?c[1]:c[2]}function ie(a,b,c){var d={mm:b?"хвилина_хвилини_хвилин":"хвилину_хвилини_хвилин",hh:b?"година_години_годин":"годину_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"};return"m"===c?b?"хвилина":"хвилину":"h"===c?b?"година":"годину":a+" "+he(d[c],+a)}function je(a,b){var c={nominative:"неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота".split("_"),accusative:"неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу".split("_"),genitive:"неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи".split("_")},d=/(\[[ВвУу]\]) ?dddd/.test(b)?"accusative":/\[?(?:минулої|наступної)? ?\] ?dddd/.test(b)?"genitive":"nominative";return c[d][a.day()]}function ke(a){return function(){return a+"о"+(11===this.hours()?"б":"")+"] LT"}}var le,me;me=Array.prototype.some?Array.prototype.some:function(a){for(var b=Object(this),c=b.length>>>0,d=0;d<c;d++)if(d in b&&a.call(this,b[d],d,b))return!0;return!1};var ne=me,oe=a.momentProperties=[],pe=!1,qe={};a.suppressDeprecationWarnings=!1,a.deprecationHandler=null;var re;re=Object.keys?Object.keys:function(a){var b,c=[];for(b in a)i(a,b)&&c.push(b);return c};var se,te=re,ue={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},ve={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},we="Invalid date",xe="%d",ye=/\d{1,2}/,ze={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},Ae={},Be={},Ce=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,De=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Ee={},Fe={},Ge=/\d/,He=/\d\d/,Ie=/\d{3}/,Je=/\d{4}/,Ke=/[+-]?\d{6}/,Le=/\d\d?/,Me=/\d\d\d\d?/,Ne=/\d\d\d\d\d\d?/,Oe=/\d{1,3}/,Pe=/\d{1,4}/,Qe=/[+-]?\d{1,6}/,Re=/\d+/,Se=/[+-]?\d+/,Te=/Z|[+-]\d\d:?\d\d/gi,Ue=/Z|[+-]\d\d(?::?\d\d)?/gi,Ve=/[+-]?\d+(\.\d{1,3})?/,We=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Xe={},Ye={},Ze=0,$e=1,_e=2,af=3,bf=4,cf=5,df=6,ef=7,ff=8;se=Array.prototype.indexOf?Array.prototype.indexOf:function(a){
+// I know
+var b;for(b=0;b<this.length;++b)if(this[b]===a)return b;return-1};var gf=se;
+// FORMATTING
+U("M",["MM",2],"Mo",function(){return this.month()+1}),U("MMM",0,0,function(a){return this.localeData().monthsShort(this,a)}),U("MMMM",0,0,function(a){return this.localeData().months(this,a)}),
+// ALIASES
+J("month","M"),
+// PRIORITY
+M("month",8),
+// PARSING
+Z("M",Le),Z("MM",Le,He),Z("MMM",function(a,b){return b.monthsShortRegex(a)}),Z("MMMM",function(a,b){return b.monthsRegex(a)}),ba(["M","MM"],function(a,b){b[$e]=u(a)-1}),ba(["MMM","MMMM"],function(a,b,c,d){var e=c._locale.monthsParse(a,d,c._strict);
+// if we didn't find a month name, mark the date as invalid.
+null!=e?b[$e]=e:m(c).invalidMonth=a});
+// LOCALES
+var hf=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,jf="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),kf="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),lf=We,mf=We;
+// FORMATTING
+U("Y",0,0,function(){var a=this.year();return a<=9999?""+a:"+"+a}),U(0,["YY",2],0,function(){return this.year()%100}),U(0,["YYYY",4],0,"year"),U(0,["YYYYY",5],0,"year"),U(0,["YYYYYY",6,!0],0,"year"),
+// ALIASES
+J("year","y"),
+// PRIORITIES
+M("year",1),
+// PARSING
+Z("Y",Se),Z("YY",Le,He),Z("YYYY",Pe,Je),Z("YYYYY",Qe,Ke),Z("YYYYYY",Qe,Ke),ba(["YYYYY","YYYYYY"],Ze),ba("YYYY",function(b,c){c[Ze]=2===b.length?a.parseTwoDigitYear(b):u(b)}),ba("YY",function(b,c){c[Ze]=a.parseTwoDigitYear(b)}),ba("Y",function(a,b){b[Ze]=parseInt(a,10)}),
+// HOOKS
+a.parseTwoDigitYear=function(a){return u(a)+(u(a)>68?1900:2e3)};
+// MOMENTS
+var nf=O("FullYear",!0);
+// FORMATTING
+U("w",["ww",2],"wo","week"),U("W",["WW",2],"Wo","isoWeek"),
+// ALIASES
+J("week","w"),J("isoWeek","W"),
+// PRIORITIES
+M("week",5),M("isoWeek",5),
+// PARSING
+Z("w",Le),Z("ww",Le,He),Z("W",Le),Z("WW",Le,He),ca(["w","ww","W","WW"],function(a,b,c,d){b[d.substr(0,1)]=u(a)});var of={dow:0,// Sunday is the first day of the week.
+doy:6};
+// FORMATTING
+U("d",0,"do","day"),U("dd",0,0,function(a){return this.localeData().weekdaysMin(this,a)}),U("ddd",0,0,function(a){return this.localeData().weekdaysShort(this,a)}),U("dddd",0,0,function(a){return this.localeData().weekdays(this,a)}),U("e",0,0,"weekday"),U("E",0,0,"isoWeekday"),
+// ALIASES
+J("day","d"),J("weekday","e"),J("isoWeekday","E"),
+// PRIORITY
+M("day",11),M("weekday",11),M("isoWeekday",11),
+// PARSING
+Z("d",Le),Z("e",Le),Z("E",Le),Z("dd",function(a,b){return b.weekdaysMinRegex(a)}),Z("ddd",function(a,b){return b.weekdaysShortRegex(a)}),Z("dddd",function(a,b){return b.weekdaysRegex(a)}),ca(["dd","ddd","dddd"],function(a,b,c,d){var e=c._locale.weekdaysParse(a,d,c._strict);
+// if we didn't get a weekday name, mark the date as invalid
+null!=e?b.d=e:m(c).invalidWeekday=a}),ca(["d","e","E"],function(a,b,c,d){b[d]=u(a)});
+// LOCALES
+var pf="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),qf="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),rf="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),sf=We,tf=We,uf=We;U("H",["HH",2],0,"hour"),U("h",["hh",2],0,Ra),U("k",["kk",2],0,Sa),U("hmm",0,0,function(){return""+Ra.apply(this)+T(this.minutes(),2)}),U("hmmss",0,0,function(){return""+Ra.apply(this)+T(this.minutes(),2)+T(this.seconds(),2)}),U("Hmm",0,0,function(){return""+this.hours()+T(this.minutes(),2)}),U("Hmmss",0,0,function(){return""+this.hours()+T(this.minutes(),2)+T(this.seconds(),2)}),Ta("a",!0),Ta("A",!1),
+// ALIASES
+J("hour","h"),
+// PRIORITY
+M("hour",13),Z("a",Ua),Z("A",Ua),Z("H",Le),Z("h",Le),Z("HH",Le,He),Z("hh",Le,He),Z("hmm",Me),Z("hmmss",Ne),Z("Hmm",Me),Z("Hmmss",Ne),ba(["H","HH"],af),ba(["a","A"],function(a,b,c){c._isPm=c._locale.isPM(a),c._meridiem=a}),ba(["h","hh"],function(a,b,c){b[af]=u(a),m(c).bigHour=!0}),ba("hmm",function(a,b,c){var d=a.length-2;b[af]=u(a.substr(0,d)),b[bf]=u(a.substr(d)),m(c).bigHour=!0}),ba("hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[af]=u(a.substr(0,d)),b[bf]=u(a.substr(d,2)),b[cf]=u(a.substr(e)),m(c).bigHour=!0}),ba("Hmm",function(a,b,c){var d=a.length-2;b[af]=u(a.substr(0,d)),b[bf]=u(a.substr(d))}),ba("Hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[af]=u(a.substr(0,d)),b[bf]=u(a.substr(d,2)),b[cf]=u(a.substr(e))});var vf,wf=/[ap]\.?m?\.?/i,xf=O("Hours",!0),yf={calendar:ue,longDateFormat:ve,invalidDate:we,ordinal:xe,ordinalParse:ye,relativeTime:ze,months:jf,monthsShort:kf,week:of,weekdays:pf,weekdaysMin:rf,weekdaysShort:qf,meridiemParse:wf},zf={},Af={},Bf=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Cf=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Df=/Z|[+-]\d\d(?::?\d\d)?/,Ef=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],
+// YYYYMM is NOT allowed by the standard
+["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Ff=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Gf=/^\/?Date\((\-?\d+)/i;a.createFromInputFallback=x("value provided is not in a recognized ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),
+// constant that refers to the ISO standard
+a.ISO_8601=function(){};var Hf=x("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var a=sb.apply(null,arguments);return this.isValid()&&a.isValid()?a<this?this:a:o()}),If=x("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var a=sb.apply(null,arguments);return this.isValid()&&a.isValid()?a>this?this:a:o()}),Jf=function(){return Date.now?Date.now():+new Date};zb("Z",":"),zb("ZZ",""),
+// PARSING
+Z("Z",Ue),Z("ZZ",Ue),ba(["Z","ZZ"],function(a,b,c){c._useUTC=!0,c._tzm=Ab(Ue,a)});
+// HELPERS
+// timezone chunker
+// '+10:00' > ['10', '00']
+// '-1530' > ['-15', '30']
+var Kf=/([\+\-]|\d\d)/gi;
+// HOOKS
+// This function will be called whenever a moment is mutated.
+// It is intended to keep the offset in sync with the timezone.
+a.updateOffset=function(){};
+// ASP.NET json date format regex
+var Lf=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,Mf=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;Ob.fn=wb.prototype;var Nf=Sb(1,"add"),Of=Sb(-1,"subtract");a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",a.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Pf=x("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(a){return void 0===a?this.localeData():this.locale(a)});
+// FORMATTING
+U(0,["gg",2],0,function(){return this.weekYear()%100}),U(0,["GG",2],0,function(){return this.isoWeekYear()%100}),zc("gggg","weekYear"),zc("ggggg","weekYear"),zc("GGGG","isoWeekYear"),zc("GGGGG","isoWeekYear"),
+// ALIASES
+J("weekYear","gg"),J("isoWeekYear","GG"),
+// PRIORITY
+M("weekYear",1),M("isoWeekYear",1),
+// PARSING
+Z("G",Se),Z("g",Se),Z("GG",Le,He),Z("gg",Le,He),Z("GGGG",Pe,Je),Z("gggg",Pe,Je),Z("GGGGG",Qe,Ke),Z("ggggg",Qe,Ke),ca(["gggg","ggggg","GGGG","GGGGG"],function(a,b,c,d){b[d.substr(0,2)]=u(a)}),ca(["gg","GG"],function(b,c,d,e){c[e]=a.parseTwoDigitYear(b)}),
+// FORMATTING
+U("Q",0,"Qo","quarter"),
+// ALIASES
+J("quarter","Q"),
+// PRIORITY
+M("quarter",7),
+// PARSING
+Z("Q",Ge),ba("Q",function(a,b){b[$e]=3*(u(a)-1)}),
+// FORMATTING
+U("D",["DD",2],"Do","date"),
+// ALIASES
+J("date","D"),
+// PRIOROITY
+M("date",9),
+// PARSING
+Z("D",Le),Z("DD",Le,He),Z("Do",function(a,b){return a?b._ordinalParse:b._ordinalParseLenient}),ba(["D","DD"],_e),ba("Do",function(a,b){b[_e]=u(a.match(Le)[0],10)});
+// MOMENTS
+var Qf=O("Date",!0);
+// FORMATTING
+U("DDD",["DDDD",3],"DDDo","dayOfYear"),
+// ALIASES
+J("dayOfYear","DDD"),
+// PRIORITY
+M("dayOfYear",4),
+// PARSING
+Z("DDD",Oe),Z("DDDD",Ie),ba(["DDD","DDDD"],function(a,b,c){c._dayOfYear=u(a)}),
+// FORMATTING
+U("m",["mm",2],0,"minute"),
+// ALIASES
+J("minute","m"),
+// PRIORITY
+M("minute",14),
+// PARSING
+Z("m",Le),Z("mm",Le,He),ba(["m","mm"],bf);
+// MOMENTS
+var Rf=O("Minutes",!1);
+// FORMATTING
+U("s",["ss",2],0,"second"),
+// ALIASES
+J("second","s"),
+// PRIORITY
+M("second",15),
+// PARSING
+Z("s",Le),Z("ss",Le,He),ba(["s","ss"],cf);
+// MOMENTS
+var Sf=O("Seconds",!1);
+// FORMATTING
+U("S",0,0,function(){return~~(this.millisecond()/100)}),U(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),U(0,["SSS",3],0,"millisecond"),U(0,["SSSS",4],0,function(){return 10*this.millisecond()}),U(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),U(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),U(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),U(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),U(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),
+// ALIASES
+J("millisecond","ms"),
+// PRIORITY
+M("millisecond",16),
+// PARSING
+Z("S",Oe,Ge),Z("SS",Oe,He),Z("SSS",Oe,Ie);var Tf;for(Tf="SSSS";Tf.length<=9;Tf+="S")Z(Tf,Re);for(Tf="S";Tf.length<=9;Tf+="S")ba(Tf,Ic);
+// MOMENTS
+var Uf=O("Milliseconds",!1);
+// FORMATTING
+U("z",0,0,"zoneAbbr"),U("zz",0,0,"zoneName");var Vf=r.prototype;Vf.add=Nf,Vf.calendar=Vb,Vf.clone=Wb,Vf.diff=bc,Vf.endOf=oc,Vf.format=gc,Vf.from=hc,Vf.fromNow=ic,Vf.to=jc,Vf.toNow=kc,Vf.get=R,Vf.invalidAt=xc,Vf.isAfter=Xb,Vf.isBefore=Yb,Vf.isBetween=Zb,Vf.isSame=$b,Vf.isSameOrAfter=_b,Vf.isSameOrBefore=ac,Vf.isValid=vc,Vf.lang=Pf,Vf.locale=lc,Vf.localeData=mc,Vf.max=If,Vf.min=Hf,Vf.parsingFlags=wc,Vf.set=S,Vf.startOf=nc,Vf.subtract=Of,Vf.toArray=sc,Vf.toObject=tc,Vf.toDate=rc,Vf.toISOString=ec,Vf.inspect=fc,Vf.toJSON=uc,Vf.toString=dc,Vf.unix=qc,Vf.valueOf=pc,Vf.creationData=yc,
+// Year
+Vf.year=nf,Vf.isLeapYear=ra,
+// Week Year
+Vf.weekYear=Ac,Vf.isoWeekYear=Bc,
+// Quarter
+Vf.quarter=Vf.quarters=Gc,
+// Month
+Vf.month=ka,Vf.daysInMonth=la,
+// Week
+Vf.week=Vf.weeks=Ba,Vf.isoWeek=Vf.isoWeeks=Ca,Vf.weeksInYear=Dc,Vf.isoWeeksInYear=Cc,
+// Day
+Vf.date=Qf,Vf.day=Vf.days=Ka,Vf.weekday=La,Vf.isoWeekday=Ma,Vf.dayOfYear=Hc,
+// Hour
+Vf.hour=Vf.hours=xf,
+// Minute
+Vf.minute=Vf.minutes=Rf,
+// Second
+Vf.second=Vf.seconds=Sf,
+// Millisecond
+Vf.millisecond=Vf.milliseconds=Uf,
+// Offset
+Vf.utcOffset=Db,Vf.utc=Fb,Vf.local=Gb,Vf.parseZone=Hb,Vf.hasAlignedHourOffset=Ib,Vf.isDST=Jb,Vf.isLocal=Lb,Vf.isUtcOffset=Mb,Vf.isUtc=Nb,Vf.isUTC=Nb,
+// Timezone
+Vf.zoneAbbr=Jc,Vf.zoneName=Kc,
+// Deprecations
+Vf.dates=x("dates accessor is deprecated. Use date instead.",Qf),Vf.months=x("months accessor is deprecated. Use month instead",ka),Vf.years=x("years accessor is deprecated. Use year instead",nf),Vf.zone=x("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",Eb),Vf.isDSTShifted=x("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Kb);var Wf=C.prototype;Wf.calendar=D,Wf.longDateFormat=E,Wf.invalidDate=F,Wf.ordinal=G,Wf.preparse=Nc,Wf.postformat=Nc,Wf.relativeTime=H,Wf.pastFuture=I,Wf.set=A,
+// Month
+Wf.months=fa,Wf.monthsShort=ga,Wf.monthsParse=ia,Wf.monthsRegex=na,Wf.monthsShortRegex=ma,
+// Week
+Wf.week=ya,Wf.firstDayOfYear=Aa,Wf.firstDayOfWeek=za,
+// Day of Week
+Wf.weekdays=Fa,Wf.weekdaysMin=Ha,Wf.weekdaysShort=Ga,Wf.weekdaysParse=Ja,Wf.weekdaysRegex=Na,Wf.weekdaysShortRegex=Oa,Wf.weekdaysMinRegex=Pa,
+// Hours
+Wf.isPM=Va,Wf.meridiem=Wa,$a("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===u(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),
+// Side effect imports
+a.lang=x("moment.lang is deprecated. Use moment.locale instead.",$a),a.langData=x("moment.langData is deprecated. Use moment.localeData instead.",bb);var Xf=Math.abs,Yf=ed("ms"),Zf=ed("s"),$f=ed("m"),_f=ed("h"),ag=ed("d"),bg=ed("w"),cg=ed("M"),dg=ed("y"),eg=gd("milliseconds"),fg=gd("seconds"),gg=gd("minutes"),hg=gd("hours"),ig=gd("days"),jg=gd("months"),kg=gd("years"),lg=Math.round,mg={s:45,// seconds to minute
+m:45,// minutes to hour
+h:22,// hours to day
+d:26,// days to month
+M:11},ng=Math.abs,og=wb.prototype;og.abs=Wc,og.add=Yc,og.subtract=Zc,og.as=cd,og.asMilliseconds=Yf,og.asSeconds=Zf,og.asMinutes=$f,og.asHours=_f,og.asDays=ag,og.asWeeks=bg,og.asMonths=cg,og.asYears=dg,og.valueOf=dd,og._bubble=_c,og.get=fd,og.milliseconds=eg,og.seconds=fg,og.minutes=gg,og.hours=hg,og.days=ig,og.weeks=hd,og.months=jg,og.years=kg,og.humanize=md,og.toISOString=nd,og.toString=nd,og.toJSON=nd,og.locale=lc,og.localeData=mc,
+// Deprecations
+og.toIsoString=x("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",nd),og.lang=Pf,
+// Side effect imports
+// FORMATTING
+U("X",0,0,"unix"),U("x",0,0,"valueOf"),
+// PARSING
+Z("x",Se),Z("X",Ve),ba("X",function(a,b,c){c._d=new Date(1e3*parseFloat(a,10))}),ba("x",function(a,b,c){c._d=new Date(u(a))}),
+// Side effect imports
+//! moment.js
+//! version : 2.17.1
+//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
+//! license : MIT
+//! momentjs.com
+a.version="2.17.1",b(sb),a.fn=Vf,a.min=ub,a.max=vb,a.now=Jf,a.utc=k,a.unix=Lc,a.months=Rc,a.isDate=g,a.locale=$a,a.invalid=o,a.duration=Ob,a.isMoment=s,a.weekdays=Tc,a.parseZone=Mc,a.localeData=bb,a.isDuration=xb,a.monthsShort=Sc,a.weekdaysMin=Vc,a.defineLocale=_a,a.updateLocale=ab,a.locales=cb,a.weekdaysShort=Uc,a.normalizeUnits=K,a.relativeTimeRounding=kd,a.relativeTimeThreshold=ld,a.calendarFormat=Ub,a.prototype=Vf,
+//! moment.js locale configuration
+//! locale : Afrikaans [af]
+//! author : Werner Mollentze : https://github.com/wernerm
+a.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(a){return/^nm$/i.test(a)},meridiem:function(a,b,c){return a<12?c?"vm":"VM":c?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,// Maandag is die eerste dag van die week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Arabic (Algeria) [ar-dz]
+//! author : Noureddine LOUAHEDJ : https://github.com/noureddineme
+a.defineLocale("ar-dz",{months:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"أح_إث_ثلا_أر_خم_جم_سب".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:0,// Sunday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Arabic (Lybia) [ar-ly]
+//! author : Ali Hmer: https://github.com/kikoanis
+var pg={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},qg=function(a){return 0===a?0:1===a?1:2===a?2:a%100>=3&&a%100<=10?3:a%100>=11?4:5},rg={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},sg=function(a){return function(b,c,d,e){var f=qg(b),g=rg[a][qg(b)];return 2===f&&(g=g[c?0:1]),g.replace(/%d/i,b)}},tg=["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"];a.defineLocale("ar-ly",{months:tg,monthsShort:tg,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(a){return"م"===a},meridiem:function(a,b,c){return a<12?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:sg("s"),m:sg("m"),mm:sg("m"),h:sg("h"),hh:sg("h"),d:sg("d"),dd:sg("d"),M:sg("M"),MM:sg("M"),y:sg("y"),yy:sg("y")},preparse:function(a){return a.replace(/\u200f/g,"").replace(/،/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return pg[a]}).replace(/,/g,"،")},week:{dow:6,// Saturday is the first day of the week.
+doy:12}}),
+//! moment.js locale configuration
+//! locale : Arabic (Morocco) [ar-ma]
+//! author : ElFadili Yassine : https://github.com/ElFadiliY
+//! author : Abdel Said : https://github.com/abdelsaid
+a.defineLocale("ar-ma",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,// Saturday is the first day of the week.
+doy:12}});
+//! moment.js locale configuration
+//! locale : Arabic (Saudi Arabia) [ar-sa]
+//! author : Suhail Alkowaileet : https://github.com/xsoh
+var ug={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},vg={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"};a.defineLocale("ar-sa",{months:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(a){return"م"===a},meridiem:function(a,b,c){return a<12?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(a){return a.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return vg[a]}).replace(/،/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return ug[a]}).replace(/,/g,"،")},week:{dow:0,// Sunday is the first day of the week.
+doy:6}}),
+//! moment.js locale configuration
+//! locale : Arabic (Tunisia) [ar-tn]
+//! author : Nader Toukabri : https://github.com/naderio
+a.defineLocale("ar-tn",{months:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Arabic [ar]
+//! author : Abdel Said: https://github.com/abdelsaid
+//! author : Ahmed Elkhatib
+//! author : forabi https://github.com/forabi
+var wg={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},xg={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},yg=function(a){return 0===a?0:1===a?1:2===a?2:a%100>=3&&a%100<=10?3:a%100>=11?4:5},zg={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},Ag=function(a){return function(b,c,d,e){var f=yg(b),g=zg[a][yg(b)];return 2===f&&(g=g[c?0:1]),g.replace(/%d/i,b)}},Bg=["كانون الثاني يناير","شباط فبراير","آذار مارس","نيسان أبريل","أيار مايو","حزيران يونيو","تموز يوليو","آب أغسطس","أيلول سبتمبر","تشرين الأول أكتوبر","تشرين الثاني نوفمبر","كانون الأول ديسمبر"];a.defineLocale("ar",{months:Bg,monthsShort:Bg,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(a){return"م"===a},meridiem:function(a,b,c){return a<12?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:Ag("s"),m:Ag("m"),mm:Ag("m"),h:Ag("h"),hh:Ag("h"),d:Ag("d"),dd:Ag("d"),M:Ag("M"),MM:Ag("M"),y:Ag("y"),yy:Ag("y")},preparse:function(a){return a.replace(/\u200f/g,"").replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return xg[a]}).replace(/،/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return wg[a]}).replace(/,/g,"،")},week:{dow:6,// Saturday is the first day of the week.
+doy:12}});
+//! moment.js locale configuration
+//! locale : Azerbaijani [az]
+//! author : topchiyev : https://github.com/topchiyev
+var Cg={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-üncü",4:"-üncü",100:"-üncü",6:"-ncı",9:"-uncu",10:"-uncu",30:"-uncu",60:"-ıncı",90:"-ıncı"};a.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə".split("_"),weekdaysShort:"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),weekdaysMin:"Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[gələn həftə] dddd [saat] LT",lastDay:"[dünən] LT",lastWeek:"[keçən həftə] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s əvvəl",s:"birneçə saniyyə",m:"bir dəqiqə",mm:"%d dəqiqə",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gecə|səhər|gündüz|axşam/,isPM:function(a){return/^(gündüz|axşam)$/.test(a)},meridiem:function(a,b,c){return a<4?"gecə":a<12?"səhər":a<17?"gündüz":"axşam"},ordinalParse:/\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,ordinal:function(a){if(0===a)// special case for zero
+return a+"-ıncı";var b=a%10,c=a%100-b,d=a>=100?100:null;return a+(Cg[b]||Cg[c]||Cg[d])},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),a.defineLocale("be",{months:{format:"студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня".split("_"),standalone:"студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань".split("_")},monthsShort:"студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж".split("_"),weekdays:{format:"нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу".split("_"),standalone:"нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота".split("_"),isFormat:/\[ ?[Вв] ?(?:мінулую|наступную)? ?\] ?dddd/},weekdaysShort:"нд_пн_ат_ср_чц_пт_сб".split("_"),weekdaysMin:"нд_пн_ат_ср_чц_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., HH:mm",LLLL:"dddd, D MMMM YYYY г., HH:mm"},calendar:{sameDay:"[Сёння ў] LT",nextDay:"[Заўтра ў] LT",lastDay:"[Учора ў] LT",nextWeek:function(){return"[У] dddd [ў] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[У мінулую] dddd [ў] LT";case 1:case 2:case 4:return"[У мінулы] dddd [ў] LT"}},sameElse:"L"},relativeTime:{future:"праз %s",past:"%s таму",s:"некалькі секунд",m:pd,mm:pd,h:pd,hh:pd,d:"дзень",dd:pd,M:"месяц",MM:pd,y:"год",yy:pd},meridiemParse:/ночы|раніцы|дня|вечара/,isPM:function(a){return/^(дня|вечара)$/.test(a)},meridiem:function(a,b,c){return a<4?"ночы":a<12?"раніцы":a<17?"дня":"вечара"},ordinalParse:/\d{1,2}-(і|ы|га)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a%10!==2&&a%10!==3||a%100===12||a%100===13?a+"-ы":a+"-і";case"D":return a+"-га";default:return a}},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Bulgarian [bg]
+//! author : Krasen Borisov : https://github.com/kraz
+a.defineLocale("bg",{months:"януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),monthsShort:"янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),weekdays:"неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),weekdaysShort:"нед_пон_вто_сря_чет_пет_съб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Днес в] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[В изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[В изминалия] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"след %s",past:"преди %s",s:"няколко секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дни",M:"месец",MM:"%d месеца",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&c<20?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,// Monday is the first day of the week.
+doy:7}});
+//! moment.js locale configuration
+//! locale : Bengali [bn]
+//! author : Kaushik Gandhi : https://github.com/kaushikgandhi
+var Dg={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},Eg={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};a.defineLocale("bn",{months:"জানুয়ারী_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর".split("_"),monthsShort:"জানু_ফেব_মার্চ_এপ্র_মে_জুন_জুল_আগ_সেপ্ট_অক্টো_নভে_ডিসে".split("_"),weekdays:"রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি".split("_"),weekdaysMin:"রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",LTS:"A h:mm:ss সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm সময়",LLLL:"dddd, D MMMM YYYY, A h:mm সময়"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কয়েক সেকেন্ড",m:"এক মিনিট",mm:"%d মিনিট",h:"এক ঘন্টা",hh:"%d ঘন্টা",d:"এক দিন",dd:"%d দিন",M:"এক মাস",MM:"%d মাস",y:"এক বছর",yy:"%d বছর"},preparse:function(a){return a.replace(/[১২৩৪৫৬৭৮৯০]/g,function(a){return Eg[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return Dg[a]})},meridiemParse:/রাত|সকাল|দুপুর|বিকাল|রাত/,meridiemHour:function(a,b){return 12===a&&(a=0),"রাত"===b&&a>=4||"দুপুর"===b&&a<5||"বিকাল"===b?a+12:a},meridiem:function(a,b,c){return a<4?"রাত":a<10?"সকাল":a<17?"দুপুর":a<20?"বিকাল":"রাত"},week:{dow:0,// Sunday is the first day of the week.
+doy:6}});
+//! moment.js locale configuration
+//! locale : Tibetan [bo]
+//! author : Thupten N. Chakrishar : https://github.com/vajradog
+var Fg={1:"༡",2:"༢",3:"༣",4:"༤",5:"༥",6:"༦",7:"༧",8:"༨",9:"༩",0:"༠"},Gg={"༡":"1","༢":"2","༣":"3","༤":"4","༥":"5","༦":"6","༧":"7","༨":"8","༩":"9","༠":"0"};a.defineLocale("bo",{months:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),monthsShort:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),weekdays:"གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་".split("_"),weekdaysShort:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),weekdaysMin:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[དི་རིང] LT",nextDay:"[སང་ཉིན] LT",nextWeek:"[བདུན་ཕྲག་རྗེས་མ], LT",lastDay:"[ཁ་སང] LT",lastWeek:"[བདུན་ཕྲག་མཐའ་མ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ལ་",past:"%s སྔན་ལ",s:"ལམ་སང",m:"སྐར་མ་གཅིག",mm:"%d སྐར་མ",h:"ཆུ་ཚོད་གཅིག",hh:"%d ཆུ་ཚོད",d:"ཉིན་གཅིག",dd:"%d ཉིན་",M:"ཟླ་བ་གཅིག",MM:"%d ཟླ་བ",y:"ལོ་གཅིག",yy:"%d ལོ"},preparse:function(a){return a.replace(/[༡༢༣༤༥༦༧༨༩༠]/g,function(a){return Gg[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return Fg[a]})},meridiemParse:/མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,meridiemHour:function(a,b){return 12===a&&(a=0),"མཚན་མོ"===b&&a>=4||"ཉིན་གུང"===b&&a<5||"དགོང་དག"===b?a+12:a},meridiem:function(a,b,c){return a<4?"མཚན་མོ":a<10?"ཞོགས་ཀས":a<17?"ཉིན་གུང":a<20?"དགོང་དག":"མཚན་མོ"},week:{dow:0,// Sunday is the first day of the week.
+doy:6}}),a.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY h[e]mm A",LLLL:"dddd, D [a viz] MMMM YYYY h[e]mm A"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondennoù",m:"ur vunutenn",mm:qd,h:"un eur",hh:"%d eur",d:"un devezh",dd:qd,M:"ur miz",MM:qd,y:"ur bloaz",yy:rd},ordinalParse:/\d{1,2}(añ|vet)/,ordinal:function(a){var b=1===a?"añ":"vet";return a+b},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:vd,mm:vd,h:vd,hh:vd,d:"dan",dd:vd,M:"mjesec",MM:vd,y:"godinu",yy:vd},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Catalan [ca]
+//! author : Juan G. Hurtado : https://github.com/juanghurtado
+a.defineLocale("ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd D MMMM YYYY H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aquí %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(a,b){var c=1===a?"r":2===a?"n":3===a?"r":4===a?"t":"è";return"w"!==b&&"W"!==b||(c="a"),a+c},week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Czech [cs]
+//! author : petrbela : https://github.com/petrbela
+var Hg="leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),Ig="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_");a.defineLocale("cs",{months:Hg,monthsShort:Ig,monthsParse:function(a,b){var c,d=[];for(c=0;c<12;c++)
+// use custom parser to solve problem with July (červenec)
+d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(Hg,Ig),shortMonthsParse:function(a){var b,c=[];for(b=0;b<12;b++)c[b]=new RegExp("^"+a[b]+"$","i");return c}(Ig),longMonthsParse:function(a){var b,c=[];for(b=0;b<12;b++)c[b]=new RegExp("^"+a[b]+"$","i");return c}(Hg),weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v neděli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve středu v] LT";case 4:return"[ve čtvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[včera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou neděli v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou středu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"před %s",s:xd,m:xd,mm:xd,h:xd,hh:xd,d:xd,dd:xd,M:xd,MM:xd,y:xd,yy:xd},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Chuvash [cv]
+//! author : Anatoly Mironov : https://github.com/mirontoli
+a.defineLocale("cv",{months:"кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав".split("_"),monthsShort:"кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш".split("_"),weekdays:"вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кӗҫ_эрн_шӑм".split("_"),weekdaysMin:"вр_тн_ыт_юн_кҫ_эр_шм".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]",LLL:"YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm",LLLL:"dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm"},calendar:{sameDay:"[Паян] LT [сехетре]",nextDay:"[Ыран] LT [сехетре]",lastDay:"[Ӗнер] LT [сехетре]",nextWeek:"[Ҫитес] dddd LT [сехетре]",lastWeek:"[Иртнӗ] dddd LT [сехетре]",sameElse:"L"},relativeTime:{future:function(a){var b=/сехет$/i.exec(a)?"рен":/ҫул$/i.exec(a)?"тан":"ран";return a+b},past:"%s каялла",s:"пӗр-ик ҫеккунт",m:"пӗр минут",mm:"%d минут",h:"пӗр сехет",hh:"%d сехет",d:"пӗр кун",dd:"%d кун",M:"пӗр уйӑх",MM:"%d уйӑх",y:"пӗр ҫул",yy:"%d ҫул"},ordinalParse:/\d{1,2}-мӗш/,ordinal:"%d-мӗш",week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Welsh [cy]
+//! author : Robert Allen : https://github.com/robgallen
+//! author : https://github.com/ryangreaves
+a.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),weekdaysParseExact:!0,
+// time formats are the same as en-gb
+longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn ôl",s:"ychydig eiliadau",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},ordinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,
+// traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
+ordinal:function(a){var b=a,c="",d=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed",// 1af to 10fed
+"eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"];return b>20?c=40===b||50===b||60===b||80===b||100===b?"fed":"ain":b>0&&(c=d[b]),a+c},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Danish [da]
+//! author : Ulrik Nielsen : https://github.com/mrbase
+a.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY HH:mm"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I går kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"få sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en måned",MM:"%d måneder",y:"et år",yy:"%d år"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:yd,mm:"%d Minuten",h:yd,hh:"%d Stunden",d:yd,dd:yd,M:yd,MM:yd,y:yd,yy:yd},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:zd,mm:"%d Minuten",h:zd,hh:"%d Stunden",d:zd,dd:zd,M:zd,MM:zd,y:zd,yy:zd},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Maldivian [dv]
+//! author : Jawish Hameed : https://github.com/jawish
+var Jg=["ޖެނުއަރީ","ފެބްރުއަރީ","މާރިޗު","އޭޕްރީލު","މޭ","ޖޫން","ޖުލައި","އޯގަސްޓު","ސެޕްޓެމްބަރު","އޮކްޓޯބަރު","ނޮވެމްބަރު","ޑިސެމްބަރު"],Kg=["އާދިއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"];a.defineLocale("dv",{months:Jg,monthsShort:Jg,weekdays:Kg,weekdaysShort:Kg,weekdaysMin:"އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/މކ|މފ/,isPM:function(a){return"މފ"===a},meridiem:function(a,b,c){return a<12?"މކ":"މފ"},calendar:{sameDay:"[މިއަދު] LT",nextDay:"[މާދަމާ] LT",nextWeek:"dddd LT",lastDay:"[އިއްޔެ] LT",lastWeek:"[ފާއިތުވި] dddd LT",sameElse:"L"},relativeTime:{future:"ތެރޭގައި %s",past:"ކުރިން %s",s:"ސިކުންތުކޮޅެއް",m:"މިނިޓެއް",mm:"މިނިޓު %d",h:"ގަޑިއިރެއް",hh:"ގަޑިއިރު %d",d:"ދުވަހެއް",dd:"ދުވަސް %d",M:"މަހެއް",MM:"މަސް %d",y:"އަހަރެއް",yy:"އަހަރު %d"},preparse:function(a){return a.replace(/،/g,",")},postformat:function(a){return a.replace(/,/g,"،")},week:{dow:7,// Sunday is the first day of the week.
+doy:12}}),
+//! moment.js locale configuration
+//! locale : Greek [el]
+//! author : Aggelos Karalias : https://github.com/mehiel
+a.defineLocale("el",{monthsNominativeEl:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsGenitiveEl:"Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),months:function(a,b){return/D/.test(b.substring(0,b.indexOf("MMMM")))?this._monthsGenitiveEl[a.month()]:this._monthsNominativeEl[a.month()]},monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(a,b,c){return a>11?c?"μμ":"ΜΜ":c?"πμ":"ΠΜ"},isPM:function(a){return"μ"===(a+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Μ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[Σήμερα {}] LT",nextDay:"[Αύριο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το προηγούμενο] dddd [{}] LT";default:return"[την προηγούμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(a,b){var c=this._calendarEl[a],d=b&&b.hours();return z(c)&&(c=c.apply(b)),c.replace("{}",d%12===1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s πριν",s:"λίγα δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χρόνος",yy:"%d χρόνια"},ordinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : English (Australia) [en-au]
+//! author : Jared Morse : https://github.com/jarcoal
+a.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : English (Canada) [en-ca]
+//! author : Jonathan Abourbih : https://github.com/jonbca
+a.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),
+//! moment.js locale configuration
+//! locale : English (United Kingdom) [en-gb]
+//! author : Chris Gedrim : https://github.com/chrisgedrim
+a.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : English (Ireland) [en-ie]
+//! author : Chris Cartlidge : https://github.com/chriscartlidge
+a.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : English (New Zealand) [en-nz]
+//! author : Luke McGregor : https://github.com/lukemcgregor
+a.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Esperanto [eo]
+//! author : Colin Dean : https://github.com/colindean
+//! komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
+//! Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
+a.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec".split("_"),weekdays:"Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato".split("_"),weekdaysShort:"Dim_Lun_Mard_Merk_Ĵaŭ_Ven_Sab".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Ĵa_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D[-an de] MMMM, YYYY",LLL:"D[-an de] MMMM, YYYY HH:mm",LLLL:"dddd, [la] D[-an de] MMMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(a){return"p"===a.charAt(0).toLowerCase()},meridiem:function(a,b,c){return a>11?c?"p.t.m.":"P.T.M.":c?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodiaŭ je] LT",nextDay:"[Morgaŭ je] LT",nextWeek:"dddd [je] LT",lastDay:"[Hieraŭ je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"je %s",past:"antaŭ %s",s:"sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",//ne 'diurno', ĉar estas uzita por proksimumo
+dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},ordinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,// Monday is the first day of the week.
+doy:7}});
+//! moment.js locale configuration
+//! locale : Spanish (Dominican Republic) [es-do]
+var Lg="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),Mg="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");a.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(a,b){return/-MMM-/.test(b)?Mg[a.month()]:Lg[a.month()]},monthsParseExact:!0,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Spanish [es]
+//! author : Julio Napurí : https://github.com/julionc
+var Ng="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),Og="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");a.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(a,b){return/-MMM-/.test(b)?Og[a.month()]:Ng[a.month()]},monthsParseExact:!0,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:Ad,m:Ad,mm:Ad,h:Ad,hh:Ad,d:Ad,dd:"%d päeva",M:Ad,MM:Ad,y:Ad,yy:Ad},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Basque [eu]
+//! author : Eneko Illarramendi : https://github.com/eillarra
+a.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:7}});
+//! moment.js locale configuration
+//! locale : Persian [fa]
+//! author : Ebrahim Byagowi : https://github.com/ebraminio
+var Pg={1:"۱",2:"۲",3:"۳",4:"۴",5:"۵",6:"۶",7:"۷",8:"۸",9:"۹",0:"۰"},Qg={"۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","۰":"0"};a.defineLocale("fa",{months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ی_د_س_چ_پ_ج_ش".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(a){return/بعد از ظهر/.test(a)},meridiem:function(a,b,c){return a<12?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[فردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(a){return a.replace(/[۰-۹]/g,function(a){return Qg[a]}).replace(/،/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return Pg[a]}).replace(/,/g,"،")},ordinalParse:/\d{1,2}م/,ordinal:"%dم",week:{dow:6,// Saturday is the first day of the week.
+doy:12}});
+//! moment.js locale configuration
+//! locale : Finnish [fi]
+//! author : Tarmo Aidantausta : https://github.com/bleadof
+var Rg="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),Sg=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",Rg[7],Rg[8],Rg[9]];a.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:Bd,m:Bd,mm:Bd,h:Bd,hh:Bd,d:Bd,dd:Bd,M:Bd,MM:Bd,y:Bd,yy:Bd},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Faroese [fo]
+//! author : Ragnar Johannesen : https://github.com/ragnar123
+a.defineLocale("fo",{months:"januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),weekdaysShort:"sun_mán_týs_mik_hós_frí_ley".split("_"),weekdaysMin:"su_má_tý_mi_hó_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[Í dag kl.] LT",nextDay:"[Í morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[Í gjár kl.] LT",lastWeek:"[síðstu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s síðani",s:"fá sekund",m:"ein minutt",mm:"%d minuttir",h:"ein tími",hh:"%d tímar",d:"ein dagur",dd:"%d dagar",M:"ein mánaði",MM:"%d mánaðir",y:"eitt ár",yy:"%d ár"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : French (Canada) [fr-ca]
+//! author : Jonathan Abourbih : https://github.com/jonbca
+a.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|e)/,ordinal:function(a){return a+(1===a?"er":"e")}}),
+//! moment.js locale configuration
+//! locale : French (Switzerland) [fr-ch]
+//! author : Gaspard Bucher : https://github.com/gaspard
+a.defineLocale("fr-ch",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|e)/,ordinal:function(a){return a+(1===a?"er":"e")},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : French [fr]
+//! author : John Fischer : https://github.com/jfroffice
+a.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")},week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Frisian [fy]
+//! author : Robin van der Vliet : https://github.com/robin0van0der0v
+var Tg="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),Ug="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");a.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(a,b){return/-MMM-/.test(b)?Ug[a.month()]:Tg[a.month()]},monthsParseExact:!0,weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[ôfrûne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",m:"ien minút",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Scottish Gaelic [gd]
+//! author : Jon Ashdown : https://github.com/jonashdown
+var Vg=["Am Faoilleach","An Gearran","Am Màrt","An Giblean","An Cèitean","An t-Ògmhios","An t-Iuchar","An Lùnastal","An t-Sultain","An Dàmhair","An t-Samhain","An Dùbhlachd"],Wg=["Faoi","Gear","Màrt","Gibl","Cèit","Ògmh","Iuch","Lùn","Sult","Dàmh","Samh","Dùbh"],Xg=["Didòmhnaich","Diluain","Dimàirt","Diciadain","Diardaoin","Dihaoine","Disathairne"],Yg=["Did","Dil","Dim","Dic","Dia","Dih","Dis"],Zg=["Dò","Lu","Mà","Ci","Ar","Ha","Sa"];a.defineLocale("gd",{months:Vg,monthsShort:Wg,monthsParseExact:!0,weekdays:Xg,weekdaysShort:Yg,weekdaysMin:Zg,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-màireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-dè aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"mìos",MM:"%d mìosan",y:"bliadhna",yy:"%d bliadhna"},ordinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(a){var b=1===a?"d":a%10===2?"na":"mh";return a+b},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Galician [gl]
+//! author : Juan G. Hurtado : https://github.com/juanghurtado
+a.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_mércores_xoves_venres_sábado".split("_"),weekdaysShort:"dom._lun._mar._mér._xov._ven._sáb.".split("_"),weekdaysMin:"do_lu_ma_mé_xo_ve_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(a){return 0===a.indexOf("un")?"n"+a:"en "+a},past:"hai %s",s:"uns segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Hebrew [he]
+//! author : Tomer Cohen : https://github.com/tomer
+//! author : Moshe Simantov : https://github.com/DevelopmentIL
+//! author : Tal Ater : https://github.com/TalAter
+a.defineLocale("he",{months:"ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳".split("_"),weekdays:"ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"א_ב_ג_ד_ה_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY HH:mm",LLLL:"dddd, D [ב]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[היום ב־]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[אתמול ב־]LT",lastWeek:"[ביום] dddd [האחרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(a){return 2===a?"שעתיים":a+" שעות"},d:"יום",dd:function(a){return 2===a?"יומיים":a+" ימים"},M:"חודש",MM:function(a){return 2===a?"חודשיים":a+" חודשים"},y:"שנה",yy:function(a){return 2===a?"שנתיים":a%10===0&&10!==a?a+" שנה":a+" שנים"}},meridiemParse:/אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,isPM:function(a){return/^(אחה"צ|אחרי הצהריים|בערב)$/.test(a)},meridiem:function(a,b,c){return a<5?"לפנות בוקר":a<10?"בבוקר":a<12?c?'לפנה"צ':"לפני הצהריים":a<18?c?'אחה"צ':"אחרי הצהריים":"בערב"}});
+//! moment.js locale configuration
+//! locale : Hindi [hi]
+//! author : Mayank Singhal : https://github.com/mayanksinghal
+var $g={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},_g={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};a.defineLocale("hi",{months:"जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर".split("_"),monthsShort:"जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.".split("_"),monthsParseExact:!0,weekdays:"रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm बजे",LLLL:"dddd, D MMMM YYYY, A h:mm बजे"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कुछ ही क्षण",m:"एक मिनट",mm:"%d मिनट",h:"एक घंटा",hh:"%d घंटे",d:"एक दिन",dd:"%d दिन",M:"एक महीने",MM:"%d महीने",y:"एक वर्ष",yy:"%d वर्ष"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return _g[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return $g[a]})},
+// Hindi notation for meridiems are quite fuzzy in practice. While there exists
+// a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
+meridiemParse:/रात|सुबह|दोपहर|शाम/,meridiemHour:function(a,b){return 12===a&&(a=0),"रात"===b?a<4?a:a+12:"सुबह"===b?a:"दोपहर"===b?a>=10?a:a+12:"शाम"===b?a+12:void 0},meridiem:function(a,b,c){return a<4?"रात":a<10?"सुबह":a<17?"दोपहर":a<20?"शाम":"रात"},week:{dow:0,// Sunday is the first day of the week.
+doy:6}}),a.defineLocale("hr",{months:{format:"siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:Dd,mm:Dd,h:Dd,hh:Dd,d:"dan",dd:Dd,M:"mjesec",MM:Dd,y:"godinu",yy:Dd},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:7}});
+//! moment.js locale configuration
+//! locale : Hungarian [hu]
+//! author : Adam Brunner : https://github.com/adambrunner
+var ah="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" ");a.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(a){return"u"===a.charAt(1).toLowerCase()},meridiem:function(a,b,c){return a<12?c===!0?"de":"DE":c===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return Fd.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return Fd.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:Ed,m:Ed,mm:Ed,h:Ed,hh:Ed,d:Ed,dd:Ed,M:Ed,MM:Ed,y:Ed,yy:Ed},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Armenian [hy-am]
+//! author : Armendarabyan : https://github.com/armendarabyan
+a.defineLocale("hy-am",{months:{format:"հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի".split("_"),standalone:"հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր".split("_")},monthsShort:"հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ".split("_"),weekdays:"կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ".split("_"),weekdaysShort:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),weekdaysMin:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY թ.",LLL:"D MMMM YYYY թ., HH:mm",LLLL:"dddd, D MMMM YYYY թ., HH:mm"},calendar:{sameDay:"[այսօր] LT",nextDay:"[վաղը] LT",lastDay:"[երեկ] LT",nextWeek:function(){return"dddd [օրը ժամը] LT"},lastWeek:function(){return"[անցած] dddd [օրը ժամը] LT"},sameElse:"L"},relativeTime:{future:"%s հետո",past:"%s առաջ",s:"մի քանի վայրկյան",m:"րոպե",mm:"%d րոպե",h:"ժամ",hh:"%d ժամ",d:"օր",dd:"%d օր",M:"ամիս",MM:"%d ամիս",y:"տարի",yy:"%d տարի"},meridiemParse:/գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,isPM:function(a){return/^(ցերեկվա|երեկոյան)$/.test(a)},meridiem:function(a){return a<4?"գիշերվա":a<12?"առավոտվա":a<17?"ցերեկվա":"երեկոյան"},ordinalParse:/\d{1,2}|\d{1,2}-(ին|րդ)/,ordinal:function(a,b){switch(b){case"DDD":case"w":case"W":case"DDDo":return 1===a?a+"-ին":a+"-րդ";default:return a}},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Indonesian [id]
+//! author : Mohammad Satrio Utomo : https://github.com/tyok
+//! reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
+a.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"siang"===b?a>=11?a:a+12:"sore"===b||"malam"===b?a+12:void 0},meridiem:function(a,b,c){return a<11?"pagi":a<15?"siang":a<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),a.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:Hd,m:Hd,mm:Hd,h:"klukkustund",hh:Hd,d:Hd,dd:Hd,M:Hd,MM:Hd,y:Hd,yy:Hd},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Italian [it]
+//! author : Lorenzo : https://github.com/aliem
+//! author: Mattia Larentis: https://github.com/nostalgiaz
+a.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"Do_Lu_Ma_Me_Gi_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(a){return(/^[0-9].+$/.test(a)?"tra":"in")+" "+a},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Japanese [ja]
+//! author : LI Long : https://github.com/baryon
+a.defineLocale("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",LTS:"Ah時m分s秒",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah時m分",LLLL:"YYYY年M月D日Ah時m分 dddd"},meridiemParse:/午前|午後/i,isPM:function(a){return"午後"===a},meridiem:function(a,b,c){return a<12?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[来週]dddd LT",lastDay:"[昨日] LT",lastWeek:"[前週]dddd LT",sameElse:"L"},ordinalParse:/\d{1,2}日/,ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"日";default:return a}},relativeTime:{future:"%s後",past:"%s前",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}}),
+//! moment.js locale configuration
+//! locale : Javanese [jv]
+//! author : Rony Lantip : https://github.com/lantip
+//! reference: http://jv.wikipedia.org/wiki/Basa_Jawa
+a.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(a,b){return 12===a&&(a=0),"enjing"===b?a:"siyang"===b?a>=11?a:a+12:"sonten"===b||"ndalu"===b?a+12:void 0},meridiem:function(a,b,c){return a<11?"enjing":a<15?"siyang":a<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Georgian [ka]
+//! author : Irakli Janiashvili : https://github.com/irakli-janiashvili
+a.defineLocale("ka",{months:{standalone:"იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი".split("_"),format:"იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს".split("_")},monthsShort:"იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ".split("_"),weekdays:{standalone:"კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი".split("_"),format:"კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს".split("_"),isFormat:/(წინა|შემდეგ)/},weekdaysShort:"კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ".split("_"),weekdaysMin:"კვ_ორ_სა_ოთ_ხუ_პა_შა".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვალ] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინა] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(a){return/(წამი|წუთი|საათი|წელი)/.test(a)?a.replace(/ი$/,"ში"):a+"ში"},past:function(a){return/(წამი|წუთი|საათი|დღე|თვე)/.test(a)?a.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(a)?a.replace(/წელი$/,"წლის წინ"):void 0},s:"რამდენიმე წამი",m:"წუთი",mm:"%d წუთი",h:"საათი",hh:"%d საათი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},ordinalParse:/0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,ordinal:function(a){return 0===a?a:1===a?a+"-ლი":a<20||a<=100&&a%20===0||a%100===0?"მე-"+a:a+"-ე"},week:{dow:1,doy:7}});
+//! moment.js locale configuration
+//! locale : Kazakh [kk]
+//! authors : Nurlan Rakhimzhanov : https://github.com/nurlan
+var bh={0:"-ші",1:"-ші",2:"-ші",3:"-ші",4:"-ші",5:"-ші",6:"-шы",7:"-ші",8:"-ші",9:"-шы",10:"-шы",20:"-шы",30:"-шы",40:"-шы",50:"-ші",60:"-шы",70:"-ші",80:"-ші",90:"-шы",100:"-ші"};a.defineLocale("kk",{months:"қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан".split("_"),monthsShort:"қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел".split("_"),weekdays:"жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі".split("_"),weekdaysShort:"жек_дүй_сей_сәр_бей_жұм_сен".split("_"),weekdaysMin:"жк_дй_сй_ср_бй_жм_сн".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Бүгін сағат] LT",nextDay:"[Ертең сағат] LT",nextWeek:"dddd [сағат] LT",lastDay:"[Кеше сағат] LT",lastWeek:"[Өткен аптаның] dddd [сағат] LT",sameElse:"L"},relativeTime:{future:"%s ішінде",past:"%s бұрын",s:"бірнеше секунд",m:"бір минут",mm:"%d минут",h:"бір сағат",hh:"%d сағат",d:"бір күн",dd:"%d күн",M:"бір ай",MM:"%d ай",y:"бір жыл",yy:"%d жыл"},ordinalParse:/\d{1,2}-(ші|шы)/,ordinal:function(a){var b=a%10,c=a>=100?100:null;return a+(bh[a]||bh[b]||bh[c])},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Cambodian [km]
+//! author : Kruy Vanna : https://github.com/kruyvanna
+a.defineLocale("km",{months:"មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),monthsShort:"មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),weekdays:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),weekdaysShort:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),weekdaysMin:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[ថ្ងៃនេះ ម៉ោង] LT",nextDay:"[ស្អែក ម៉ោង] LT",nextWeek:"dddd [ម៉ោង] LT",lastDay:"[ម្សិលមិញ ម៉ោង] LT",lastWeek:"dddd [សប្តាហ៍មុន] [ម៉ោង] LT",sameElse:"L"},relativeTime:{future:"%sទៀត",past:"%sមុន",s:"ប៉ុន្មានវិនាទី",m:"មួយនាទី",mm:"%d នាទី",h:"មួយម៉ោង",hh:"%d ម៉ោង",d:"មួយថ្ងៃ",dd:"%d ថ្ងៃ",M:"មួយខែ",MM:"%d ខែ",y:"មួយឆ្នាំ",yy:"%d ឆ្នាំ"},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Korean [ko]
+//! author : Kyungwook, Park : https://github.com/kyungw00k
+//! author : Jeeeyul Lee <jeeeyul@gmail.com>
+a.defineLocale("ko",{months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),longDateFormat:{LT:"A h시 m분",LTS:"A h시 m분 s초",L:"YYYY.MM.DD",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 A h시 m분",LLLL:"YYYY년 MMMM D일 dddd A h시 m분"},calendar:{sameDay:"오늘 LT",nextDay:"내일 LT",nextWeek:"dddd LT",lastDay:"어제 LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇 초",ss:"%d초",m:"일분",mm:"%d분",h:"한 시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한 달",MM:"%d달",y:"일 년",yy:"%d년"},ordinalParse:/\d{1,2}일/,ordinal:"%d일",meridiemParse:/오전|오후/,isPM:function(a){return"오후"===a},meridiem:function(a,b,c){return a<12?"오전":"오후"}});
+//! moment.js locale configuration
+//! locale : Kyrgyz [ky]
+//! author : Chyngyz Arystan uulu : https://github.com/chyngyz
+var ch={0:"-чү",1:"-чи",2:"-чи",3:"-чү",4:"-чү",5:"-чи",6:"-чы",7:"-чи",8:"-чи",9:"-чу",10:"-чу",20:"-чы",30:"-чу",40:"-чы",50:"-чү",60:"-чы",70:"-чи",80:"-чи",90:"-чу",100:"-чү"};a.defineLocale("ky",{months:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),monthsShort:"янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек".split("_"),weekdays:"Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби".split("_"),weekdaysShort:"Жек_Дүй_Шей_Шар_Бей_Жум_Ише".split("_"),weekdaysMin:"Жк_Дй_Шй_Шр_Бй_Жм_Иш".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Бүгүн саат] LT",nextDay:"[Эртең саат] LT",nextWeek:"dddd [саат] LT",lastDay:"[Кече саат] LT",lastWeek:"[Өткен аптанын] dddd [күнү] [саат] LT",sameElse:"L"},relativeTime:{future:"%s ичинде",past:"%s мурун",s:"бирнече секунд",m:"бир мүнөт",mm:"%d мүнөт",h:"бир саат",hh:"%d саат",d:"бир күн",dd:"%d күн",M:"бир ай",MM:"%d ай",y:"бир жыл",yy:"%d жыл"},ordinalParse:/\d{1,2}-(чи|чы|чү|чу)/,ordinal:function(a){var b=a%10,c=a>=100?100:null;return a+(ch[a]||ch[b]||ch[c])},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),a.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){
+// Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule
+switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:Jd,past:Kd,s:"e puer Sekonnen",m:Id,mm:"%d Minutten",h:Id,hh:"%d Stonnen",d:Id,dd:"%d Deeg",M:Id,MM:"%d Méint",y:Id,yy:"%d Joer"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Lao [lo]
+//! author : Ryan Hart : https://github.com/ryanhart2
+a.defineLocale("lo",{months:"ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ".split("_"),monthsShort:"ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ".split("_"),weekdays:"ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ".split("_"),weekdaysShort:"ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ".split("_"),weekdaysMin:"ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"ວັນdddd D MMMM YYYY HH:mm"},meridiemParse:/ຕອນເຊົ້າ|ຕອນແລງ/,isPM:function(a){return"ຕອນແລງ"===a},meridiem:function(a,b,c){return a<12?"ຕອນເຊົ້າ":"ຕອນແລງ"},calendar:{sameDay:"[ມື້ນີ້ເວລາ] LT",nextDay:"[ມື້ອື່ນເວລາ] LT",nextWeek:"[ວັນ]dddd[ໜ້າເວລາ] LT",lastDay:"[ມື້ວານນີ້ເວລາ] LT",lastWeek:"[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT",sameElse:"L"},relativeTime:{future:"ອີກ %s",past:"%sຜ່ານມາ",s:"ບໍ່ເທົ່າໃດວິນາທີ",m:"1 ນາທີ",mm:"%d ນາທີ",h:"1 ຊົ່ວໂມງ",hh:"%d ຊົ່ວໂມງ",d:"1 ມື້",dd:"%d ມື້",M:"1 ເດືອນ",MM:"%d ເດືອນ",y:"1 ປີ",yy:"%d ປີ"},ordinalParse:/(ທີ່)\d{1,2}/,ordinal:function(a){return"ທີ່"+a}});
+//! moment.js locale configuration
+//! locale : Lithuanian [lt]
+//! author : Mindaugas Mozūras : https://github.com/mmozuras
+var dh={m:"minutė_minutės_minutę",mm:"minutės_minučių_minutes",h:"valanda_valandos_valandą",hh:"valandos_valandų_valandas",d:"diena_dienos_dieną",dd:"dienos_dienų_dienas",M:"mėnuo_mėnesio_mėnesį",MM:"mėnesiai_mėnesių_mėnesius",y:"metai_metų_metus",yy:"metai_metų_metus"};a.defineLocale("lt",{months:{format:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Š".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[Šiandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Praėjusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieš %s",s:Md,m:Nd,mm:Qd,h:Nd,hh:Qd,d:Nd,dd:Qd,M:Nd,MM:Qd,y:Nd,yy:Qd},ordinalParse:/\d{1,2}-oji/,ordinal:function(a){return a+"-oji"},week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Latvian [lv]
+//! author : Kristaps Karlsons : https://github.com/skakri
+//! author : Jānis Elmeris : https://github.com/JanisE
+var eh={m:"minūtes_minūtēm_minūte_minūtes".split("_"),mm:"minūtes_minūtēm_minūte_minūtes".split("_"),h:"stundas_stundām_stunda_stundas".split("_"),hh:"stundas_stundām_stunda_stundas".split("_"),d:"dienas_dienām_diena_dienas".split("_"),dd:"dienas_dienām_diena_dienas".split("_"),M:"mēneša_mēnešiem_mēnesis_mēneši".split("_"),MM:"mēneša_mēnešiem_mēnesis_mēneši".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};a.defineLocale("lv",{months:"janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),weekdays:"svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[Šodien pulksten] LT",nextDay:"[Rīt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pagājušā] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"pēc %s",past:"pirms %s",s:Ud,m:Td,mm:Sd,h:Td,hh:Sd,d:Td,dd:Sd,M:Td,MM:Sd,y:Td,yy:Sd},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Montenegrin [me]
+//! author : Miodrag Nikač <miodrag@restartit.me> : https://github.com/miodragnikac
+var fh={words:{//Different grammatical cases
+m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&a<=4?b[1]:b[2]},translate:function(a,b,c){var d=fh.words[c];return 1===c.length?b?d[0]:d[1]:a+" "+fh.correctGrammaticalCase(a,d)}};a.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){var a=["[prošle] [nedjelje] [u] LT","[prošlog] [ponedjeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srijede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",m:fh.translate,mm:fh.translate,h:fh.translate,hh:fh.translate,d:"dan",dd:fh.translate,M:"mjesec",MM:fh.translate,y:"godinu",yy:fh.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Maori [mi]
+//! author : John Corrigan <robbiecloset@gmail.com> : https://github.com/johnideal
+a.defineLocale("mi",{months:"Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei".split("_"),weekdaysShort:"Ta_Ma_Tū_We_Tāi_Pa_Hā".split("_"),weekdaysMin:"Ta_Ma_Tū_We_Tāi_Pa_Hā".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te hēkona ruarua",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Macedonian [mk]
+//! author : Borislav Mickov : https://github.com/B0k0
+a.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_среда_четврток_петок_сабота".split("_"),weekdaysShort:"нед_пон_вто_сре_чет_пет_саб".split("_"),weekdaysMin:"нe_пo_вт_ср_че_пе_сa".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Денес во] LT",nextDay:"[Утре во] LT",nextWeek:"[Во] dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"после %s",past:"пред %s",s:"неколку секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дена",M:"месец",MM:"%d месеци",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&c<20?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Malayalam [ml]
+//! author : Floyd Pink : https://github.com/floydpink
+a.defineLocale("ml",{months:"ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.".split("_"),monthsParseExact:!0,weekdays:"ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച".split("_"),weekdaysShort:"ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി".split("_"),weekdaysMin:"ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ".split("_"),longDateFormat:{LT:"A h:mm -നു",LTS:"A h:mm:ss -നു",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -നു",LLLL:"dddd, D MMMM YYYY, A h:mm -നു"},calendar:{sameDay:"[ഇന്ന്] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇന്നലെ] LT",lastWeek:"[കഴിഞ്ഞ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s കഴിഞ്ഞ്",past:"%s മുൻപ്",s:"അൽപ നിമിഷങ്ങൾ",m:"ഒരു മിനിറ്റ്",mm:"%d മിനിറ്റ്",h:"ഒരു മണിക്കൂർ",hh:"%d മണിക്കൂർ",d:"ഒരു ദിവസം",dd:"%d ദിവസം",M:"ഒരു മാസം",MM:"%d മാസം",y:"ഒരു വർഷം",yy:"%d വർഷം"},meridiemParse:/രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,meridiemHour:function(a,b){return 12===a&&(a=0),"രാത്രി"===b&&a>=4||"ഉച്ച കഴിഞ്ഞ്"===b||"വൈകുന്നേരം"===b?a+12:a},meridiem:function(a,b,c){return a<4?"രാത്രി":a<12?"രാവിലെ":a<17?"ഉച്ച കഴിഞ്ഞ്":a<20?"വൈകുന്നേരം":"രാത്രി"}});
+//! moment.js locale configuration
+//! locale : Marathi [mr]
+//! author : Harshad Kale : https://github.com/kalehv
+//! author : Vivek Athalye : https://github.com/vnathalye
+var gh={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},hh={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};a.defineLocale("mr",{months:"जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर".split("_"),monthsShort:"जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.".split("_"),monthsParseExact:!0,weekdays:"रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",LTS:"A h:mm:ss वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm वाजता",LLLL:"dddd, D MMMM YYYY, A h:mm वाजता"},calendar:{sameDay:"[आज] LT",nextDay:"[उद्या] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%sमध्ये",past:"%sपूर्वी",s:Vd,m:Vd,mm:Vd,h:Vd,hh:Vd,d:Vd,dd:Vd,M:Vd,MM:Vd,y:Vd,yy:Vd},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return hh[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return gh[a]})},meridiemParse:/रात्री|सकाळी|दुपारी|सायंकाळी/,meridiemHour:function(a,b){return 12===a&&(a=0),"रात्री"===b?a<4?a:a+12:"सकाळी"===b?a:"दुपारी"===b?a>=10?a:a+12:"सायंकाळी"===b?a+12:void 0},meridiem:function(a,b,c){return a<4?"रात्री":a<10?"सकाळी":a<17?"दुपारी":a<20?"सायंकाळी":"रात्री"},week:{dow:0,// Sunday is the first day of the week.
+doy:6}}),
+//! moment.js locale configuration
+//! locale : Malay [ms-my]
+//! note : DEPRECATED, the correct one is [ms]
+//! author : Weldan Jamili : https://github.com/weldan
+a.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"tengahari"===b?a>=11?a:a+12:"petang"===b||"malam"===b?a+12:void 0},meridiem:function(a,b,c){return a<11?"pagi":a<15?"tengahari":a<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Malay [ms]
+//! author : Weldan Jamili : https://github.com/weldan
+a.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"tengahari"===b?a>=11?a:a+12:"petang"===b||"malam"===b?a+12:void 0},meridiem:function(a,b,c){return a<11?"pagi":a<15?"tengahari":a<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,// Monday is the first day of the week.
+doy:7}});
+//! moment.js locale configuration
+//! locale : Burmese [my]
+//! author : Squar team, mysquar.com
+//! author : David Rossellat : https://github.com/gholadr
+//! author : Tin Aung Lin : https://github.com/thanyawzinmin
+var ih={1:"၁",2:"၂",3:"၃",4:"၄",5:"၅",6:"၆",7:"၇",8:"၈",9:"၉",0:"၀"},jh={"၁":"1","၂":"2","၃":"3","၄":"4","၅":"5","၆":"6","၇":"7","၈":"8","၉":"9","၀":"0"};a.defineLocale("my",{months:"ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ".split("_"),monthsShort:"ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ".split("_"),weekdays:"တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ".split("_"),weekdaysShort:"နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),weekdaysMin:"နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[ယနေ.] LT [မှာ]",nextDay:"[မနက်ဖြန်] LT [မှာ]",nextWeek:"dddd LT [မှာ]",lastDay:"[မနေ.က] LT [မှာ]",lastWeek:"[ပြီးခဲ့သော] dddd LT [မှာ]",sameElse:"L"},relativeTime:{future:"လာမည့် %s မှာ",past:"လွန်ခဲ့သော %s က",s:"စက္ကန်.အနည်းငယ်",m:"တစ်မိနစ်",mm:"%d မိနစ်",h:"တစ်နာရီ",hh:"%d နာရီ",d:"တစ်ရက်",dd:"%d ရက်",M:"တစ်လ",MM:"%d လ",y:"တစ်နှစ်",yy:"%d နှစ်"},preparse:function(a){return a.replace(/[၁၂၃၄၅၆၇၈၉၀]/g,function(a){return jh[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return ih[a]})},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Norwegian Bokmål [nb]
+//! authors : Espen Hovlandsdal : https://github.com/rexxars
+//! Sigurd Gartmann : https://github.com/sigurdga
+a.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"sø._ma._ti._on._to._fr._lø.".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en måned",MM:"%d måneder",y:"ett år",yy:"%d år"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Nepalese [ne]
+//! author : suvash : https://github.com/suvash
+var kh={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},lh={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};a.defineLocale("ne",{months:"जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर".split("_"),monthsShort:"जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.".split("_"),monthsParseExact:!0,weekdays:"आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.".split("_"),weekdaysMin:"आ._सो._मं._बु._बि._शु._श.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"Aको h:mm बजे",LTS:"Aको h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, Aको h:mm बजे",LLLL:"dddd, D MMMM YYYY, Aको h:mm बजे"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return lh[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return kh[a]})},meridiemParse:/राति|बिहान|दिउँसो|साँझ/,meridiemHour:function(a,b){return 12===a&&(a=0),"राति"===b?a<4?a:a+12:"बिहान"===b?a:"दिउँसो"===b?a>=10?a:a+12:"साँझ"===b?a+12:void 0},meridiem:function(a,b,c){return a<3?"राति":a<12?"बिहान":a<16?"दिउँसो":a<20?"साँझ":"राति"},calendar:{sameDay:"[आज] LT",nextDay:"[भोलि] LT",nextWeek:"[आउँदो] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गएको] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडि",s:"केही क्षण",m:"एक मिनेट",mm:"%d मिनेट",h:"एक घण्टा",hh:"%d घण्टा",d:"एक दिन",dd:"%d दिन",M:"एक महिना",MM:"%d महिना",y:"एक बर्ष",yy:"%d बर्ष"},week:{dow:0,// Sunday is the first day of the week.
+doy:6}});
+//! moment.js locale configuration
+//! locale : Dutch (Belgium) [nl-be]
+//! author : Joris Röling : https://github.com/jorisroling
+//! author : Jacob Middag : https://github.com/middagj
+var mh="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),nh="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),oh=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],ph=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;a.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,b){return/-MMM-/.test(b)?nh[a.month()]:mh[a.month()]},monthsRegex:ph,monthsShortRegex:ph,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:oh,longMonthsParse:oh,shortMonthsParse:oh,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Dutch [nl]
+//! author : Joris Röling : https://github.com/jorisroling
+//! author : Jacob Middag : https://github.com/middagj
+var qh="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),rh="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),sh=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],th=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;a.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,b){return/-MMM-/.test(b)?rh[a.month()]:qh[a.month()]},monthsRegex:th,monthsShortRegex:th,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:sh,longMonthsParse:sh,shortMonthsParse:sh,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Nynorsk [nn]
+//! author : https://github.com/mechuwind
+a.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mån_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_må_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I går klokka] LT",lastWeek:"[Føregåande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein månad",MM:"%d månader",y:"eit år",yy:"%d år"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Punjabi (India) [pa-in]
+//! author : Harpreet Singh : https://github.com/harpreetkhalsagtbit
+var uh={1:"੧",2:"੨",3:"੩",4:"੪",5:"੫",6:"੬",7:"੭",8:"੮",9:"੯",0:"੦"},vh={"੧":"1","੨":"2","੩":"3","੪":"4","੫":"5","੬":"6","੭":"7","੮":"8","੯":"9","੦":"0"};a.defineLocale("pa-in",{
+// There are months name as per Nanakshahi Calender but they are not used as rigidly in modern Punjabi.
+months:"ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ".split("_"),monthsShort:"ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ".split("_"),weekdays:"ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ".split("_"),weekdaysShort:"ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ".split("_"),weekdaysMin:"ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ".split("_"),longDateFormat:{LT:"A h:mm ਵਜੇ",LTS:"A h:mm:ss ਵਜੇ",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm ਵਜੇ",LLLL:"dddd, D MMMM YYYY, A h:mm ਵਜੇ"},calendar:{sameDay:"[ਅਜ] LT",nextDay:"[ਕਲ] LT",nextWeek:"dddd, LT",lastDay:"[ਕਲ] LT",lastWeek:"[ਪਿਛਲੇ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ਵਿੱਚ",past:"%s ਪਿਛਲੇ",s:"ਕੁਝ ਸਕਿੰਟ",m:"ਇਕ ਮਿੰਟ",mm:"%d ਮਿੰਟ",h:"ਇੱਕ ਘੰਟਾ",hh:"%d ਘੰਟੇ",d:"ਇੱਕ ਦਿਨ",dd:"%d ਦਿਨ",M:"ਇੱਕ ਮਹੀਨਾ",MM:"%d ਮਹੀਨੇ",y:"ਇੱਕ ਸਾਲ",yy:"%d ਸਾਲ"},preparse:function(a){return a.replace(/[੧੨੩੪੫੬੭੮੯੦]/g,function(a){return vh[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return uh[a]})},
+// Punjabi notation for meridiems are quite fuzzy in practice. While there exists
+// a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi.
+meridiemParse:/ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,meridiemHour:function(a,b){return 12===a&&(a=0),"ਰਾਤ"===b?a<4?a:a+12:"ਸਵੇਰ"===b?a:"ਦੁਪਹਿਰ"===b?a>=10?a:a+12:"ਸ਼ਾਮ"===b?a+12:void 0},meridiem:function(a,b,c){return a<4?"ਰਾਤ":a<10?"ਸਵੇਰ":a<17?"ਦੁਪਹਿਰ":a<20?"ਸ਼ਾਮ":"ਰਾਤ"},week:{dow:0,// Sunday is the first day of the week.
+doy:6}});
+//! moment.js locale configuration
+//! locale : Polish [pl]
+//! author : Rafal Hirsz : https://github.com/evoL
+var wh="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),xh="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");a.defineLocale("pl",{months:function(a,b){return""===b?"("+xh[a.month()]+"|"+wh[a.month()]+")":/D MMMM/.test(b)?xh[a.month()]:wh[a.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_śr_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:Xd,mm:Xd,h:Xd,hh:Xd,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:Xd,y:"rok",yy:Xd},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Portuguese (Brazil) [pt-br]
+//! author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
+a.defineLocale("pt-br",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [às] HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){// Saturday + Sunday
+return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"poucos segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº"}),
+//! moment.js locale configuration
+//! locale : Portuguese [pt]
+//! author : Jefferson : https://github.com/jalex79
+a.defineLocale("pt",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){// Saturday + Sunday
+return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:Yd,h:"o oră",hh:Yd,d:"o zi",dd:Yd,M:"o lună",MM:Yd,y:"un an",yy:Yd},week:{dow:1,// Monday is the first day of the week.
+doy:7}});var yh=[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[йя]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i];
+// http://new.gramota.ru/spravka/rules/139-prop : § 103
+// Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637
+// CLDR data: http://www.unicode.org/cldr/charts/28/summary/ru.html#1753
+a.defineLocale("ru",{months:{format:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_"),standalone:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_")},monthsShort:{
+// по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку ?
+format:"янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.".split("_"),standalone:"янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.".split("_")},weekdays:{standalone:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),format:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_"),isFormat:/\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/},weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:yh,longMonthsParse:yh,shortMonthsParse:yh,
+// полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки
+monthsRegex:/^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,
+// копия предыдущего
+monthsShortRegex:/^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,
+// полные названия с падежами
+monthsStrictRegex:/^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,
+// Выражение, которое соотвествует только сокращённым формам
+monthsShortStrictRegex:/^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., HH:mm",LLLL:"dddd, D MMMM YYYY г., HH:mm"},calendar:{sameDay:"[Сегодня в] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(a){if(a.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[В] dddd [в] LT";switch(this.day()){case 0:return"[В следующее] dddd [в] LT";case 1:case 2:case 4:return"[В следующий] dddd [в] LT";case 3:case 5:case 6:return"[В следующую] dddd [в] LT"}},lastWeek:function(a){if(a.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[В] dddd [в] LT";switch(this.day()){case 0:return"[В прошлое] dddd [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",m:$d,mm:$d,h:"час",hh:$d,d:"день",dd:$d,M:"месяц",MM:$d,y:"год",yy:$d},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(a){return/^(дня|вечера)$/.test(a)},meridiem:function(a,b,c){return a<4?"ночи":a<12?"утра":a<17?"дня":"вечера"},ordinalParse:/\d{1,2}-(й|го|я)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":return a+"-й";case"D":return a+"-го";case"w":case"W":return a+"-я";default:return a}},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Northern Sami [se]
+//! authors : Bård Rolstad Henriksen : https://github.com/karamell
+a.defineLocale("se",{months:"ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu".split("_"),monthsShort:"ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov".split("_"),weekdays:"sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat".split("_"),weekdaysShort:"sotn_vuos_maŋ_gask_duor_bear_láv".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s geažes",past:"maŋit %s",s:"moadde sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta mánnu",MM:"%d mánut",y:"okta jahki",yy:"%d jagit"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Sinhalese [si]
+//! author : Sampath Sitinamaluwa : https://github.com/sampathsris
+/*jshint -W100*/
+a.defineLocale("si",{months:"ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්".split("_"),monthsShort:"ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ".split("_"),weekdays:"ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා".split("_"),weekdaysShort:"ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන".split("_"),weekdaysMin:"ඉ_ස_අ_බ_බ්‍ර_සි_සෙ".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [වැනි] dddd, a h:mm:ss"},calendar:{sameDay:"[අද] LT[ට]",nextDay:"[හෙට] LT[ට]",nextWeek:"dddd LT[ට]",lastDay:"[ඊයේ] LT[ට]",lastWeek:"[පසුගිය] dddd LT[ට]",sameElse:"L"},relativeTime:{future:"%sකින්",past:"%sකට පෙර",s:"තත්පර කිහිපය",m:"මිනිත්තුව",mm:"මිනිත්තු %d",h:"පැය",hh:"පැය %d",d:"දිනය",dd:"දින %d",M:"මාසය",MM:"මාස %d",y:"වසර",yy:"වසර %d"},ordinalParse:/\d{1,2} වැනි/,ordinal:function(a){return a+" වැනි"},meridiemParse:/පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,isPM:function(a){return"ප.ව."===a||"පස් වරු"===a},meridiem:function(a,b,c){return a>11?c?"ප.ව.":"පස් වරු":c?"පෙ.ව.":"පෙර වරු"}});
+//! moment.js locale configuration
+//! locale : Slovak [sk]
+//! author : Martin Minka : https://github.com/k2s
+//! based on work of petrbela : https://github.com/petrbela
+var zh="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),Ah="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");a.defineLocale("sk",{months:zh,monthsShort:Ah,weekdays:"nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_št_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_št_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo štvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[včera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:ae,m:ae,mm:ae,h:ae,hh:ae,d:ae,dd:ae,M:ae,MM:ae,y:ae,yy:ae},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._čet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_če_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[včeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prejšnjo] [nedeljo] [ob] LT";case 3:return"[prejšnjo] [sredo] [ob] LT";case 6:return"[prejšnjo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prejšnji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"čez %s",past:"pred %s",s:be,m:be,mm:be,h:be,hh:be,d:be,dd:be,M:be,MM:be,y:be,yy:be},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : Albanian [sq]
+//! author : Flakërim Ismani : https://github.com/flakerimi
+//! author : Menelion Elensúle : https://github.com/Oire
+//! author : Oerd Cukalla : https://github.com/oerd
+a.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),weekdaysParseExact:!0,meridiemParse:/PD|MD/,isPM:function(a){return"M"===a.charAt(0)},meridiem:function(a,b,c){return a<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Nesër në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s më parë",s:"disa sekonda",m:"një minutë",mm:"%d minuta",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Serbian Cyrillic [sr-cyrl]
+//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+var Bh={words:{//Different grammatical cases
+m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један сат","једног сата"],hh:["сат","сата","сати"],dd:["дан","дана","дана"],MM:["месец","месеца","месеци"],yy:["година","године","година"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&a<=4?b[1]:b[2]},translate:function(a,b,c){var d=Bh.words[c];return 1===c.length?b?d[0]:d[1]:a+" "+Bh.correctGrammaticalCase(a,d)}};a.defineLocale("sr-cyrl",{months:"јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар".split("_"),monthsShort:"јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.".split("_"),monthsParseExact:!0,weekdays:"недеља_понедељак_уторак_среда_четвртак_петак_субота".split("_"),weekdaysShort:"нед._пон._уто._сре._чет._пет._суб.".split("_"),weekdaysMin:"не_по_ут_ср_че_пе_су".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[данас у] LT",nextDay:"[сутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [среду] [у] LT";case 6:return"[у] [суботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var a=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [среде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [суботе] [у] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико секунди",m:Bh.translate,mm:Bh.translate,h:Bh.translate,hh:Bh.translate,d:"дан",dd:Bh.translate,M:"месец",MM:Bh.translate,y:"годину",yy:Bh.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:7}});
+//! moment.js locale configuration
+//! locale : Serbian [sr]
+//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+var Ch={words:{//Different grammatical cases
+m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&a<=4?b[1]:b[2]},translate:function(a,b,c){var d=Ch.words[c];return 1===c.length?b?d[0]:d[1]:a+" "+Ch.correctGrammaticalCase(a,d)}};a.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){var a=["[prošle] [nedelje] [u] LT","[prošlog] [ponedeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:Ch.translate,mm:Ch.translate,h:Ch.translate,hh:Ch.translate,d:"dan",dd:Ch.translate,M:"mesec",MM:Ch.translate,y:"godinu",yy:Ch.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:7}}),
+//! moment.js locale configuration
+//! locale : siSwati [ss]
+//! author : Nicolai Davies<mail@nicolai.io> : https://github.com/nicolaidavies
+a.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(a,b,c){return a<11?"ekuseni":a<15?"emini":a<19?"entsambama":"ebusuku"},meridiemHour:function(a,b){return 12===a&&(a=0),"ekuseni"===b?a:"emini"===b?a>=11?a:a+12:"entsambama"===b||"ebusuku"===b?0===a?0:a+12:void 0},ordinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Swedish [sv]
+//! author : Jens Alm : https://github.com/ulmus
+a.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mån_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_må_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Igår] LT",nextWeek:"[På] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"några sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en månad",MM:"%d månader",y:"ett år",yy:"%d år"},ordinalParse:/\d{1,2}(e|a)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"e":1===b?"a":2===b?"a":"e";return a+c},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Swahili [sw]
+//! author : Fahad Kassim : https://github.com/fadsel
+a.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"masiku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,// Monday is the first day of the week.
+doy:7}});
+//! moment.js locale configuration
+//! locale : Tamil [ta]
+//! author : Arjunkumar Krishnamoorthy : https://github.com/tk120404
+var Dh={1:"௧",2:"௨",3:"௩",4:"௪",5:"௫",6:"௬",7:"௭",8:"௮",9:"௯",0:"௦"},Eh={"௧":"1","௨":"2","௩":"3","௪":"4","௫":"5","௬":"6","௭":"7","௮":"8","௯":"9","௦":"0"};a.defineLocale("ta",{months:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),monthsShort:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),weekdays:"ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை".split("_"),weekdaysShort:"ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி".split("_"),weekdaysMin:"ஞா_தி_செ_பு_வி_வெ_ச".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[இன்று] LT",nextDay:"[நாளை] LT",nextWeek:"dddd, LT",lastDay:"[நேற்று] LT",lastWeek:"[கடந்த வாரம்] dddd, LT",sameElse:"L"},relativeTime:{future:"%s இல்",past:"%s முன்",s:"ஒரு சில விநாடிகள்",m:"ஒரு நிமிடம்",mm:"%d நிமிடங்கள்",h:"ஒரு மணி நேரம்",hh:"%d மணி நேரம்",d:"ஒரு நாள்",dd:"%d நாட்கள்",M:"ஒரு மாதம்",MM:"%d மாதங்கள்",y:"ஒரு வருடம்",yy:"%d ஆண்டுகள்"},ordinalParse:/\d{1,2}வது/,ordinal:function(a){return a+"வது"},preparse:function(a){return a.replace(/[௧௨௩௪௫௬௭௮௯௦]/g,function(a){return Eh[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return Dh[a]})},
+// refer http://ta.wikipedia.org/s/1er1
+meridiemParse:/யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,meridiem:function(a,b,c){return a<2?" யாமம்":a<6?" வைகறை":a<10?" காலை":a<14?" நண்பகல்":a<18?" எற்பாடு":a<22?" மாலை":" யாமம்"},meridiemHour:function(a,b){return 12===a&&(a=0),"யாமம்"===b?a<2?a:a+12:"வைகறை"===b||"காலை"===b?a:"நண்பகல்"===b&&a>=10?a:a+12},week:{dow:0,// Sunday is the first day of the week.
+doy:6}}),
+//! moment.js locale configuration
+//! locale : Telugu [te]
+//! author : Krishna Chaitanya Thota : https://github.com/kcthota
+a.defineLocale("te",{months:"జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జూలై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్".split("_"),monthsShort:"జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జూలై_ఆగ._సెప్._అక్టో._నవ._డిసె.".split("_"),monthsParseExact:!0,weekdays:"ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం".split("_"),weekdaysShort:"ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని".split("_"),weekdaysMin:"ఆ_సో_మం_బు_గు_శు_శ".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[నేడు] LT",nextDay:"[రేపు] LT",nextWeek:"dddd, LT",lastDay:"[నిన్న] LT",lastWeek:"[గత] dddd, LT",sameElse:"L"},relativeTime:{future:"%s లో",past:"%s క్రితం",s:"కొన్ని క్షణాలు",m:"ఒక నిమిషం",mm:"%d నిమిషాలు",h:"ఒక గంట",hh:"%d గంటలు",d:"ఒక రోజు",dd:"%d రోజులు",M:"ఒక నెల",MM:"%d నెలలు",y:"ఒక సంవత్సరం",yy:"%d సంవత్సరాలు"},ordinalParse:/\d{1,2}వ/,ordinal:"%dవ",meridiemParse:/రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,meridiemHour:function(a,b){return 12===a&&(a=0),"రాత్రి"===b?a<4?a:a+12:"ఉదయం"===b?a:"మధ్యాహ్నం"===b?a>=10?a:a+12:"సాయంత్రం"===b?a+12:void 0},meridiem:function(a,b,c){return a<4?"రాత్రి":a<10?"ఉదయం":a<17?"మధ్యాహ్నం":a<20?"సాయంత్రం":"రాత్రి"},week:{dow:0,// Sunday is the first day of the week.
+doy:6}}),
+//! moment.js locale configuration
+//! locale : Tetun Dili (East Timor) [tet]
+//! author : Joshua Brooks : https://github.com/joshbrooks
+//! author : Onorio De J. Afonso : https://github.com/marobo
+a.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Juniu_Juliu_Augustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Aug_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sexta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sext_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Sex_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"minutu balun",m:"minutu ida",mm:"minutus %d",h:"horas ida",hh:"horas %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),
+//! moment.js locale configuration
+//! locale : Thai [th]
+//! author : Kridsada Thanabulpong : https://github.com/sirn
+a.defineLocale("th",{months:"มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),monthsShort:"ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.".split("_"),monthsParseExact:!0,weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"),// yes, three characters difference
+weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา H:mm",LLLL:"วันddddที่ D MMMM YYYY เวลา H:mm"},meridiemParse:/ก่อนเที่ยง|หลังเที่ยง/,isPM:function(a){return"หลังเที่ยง"===a},meridiem:function(a,b,c){return a<12?"ก่อนเที่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่แล้ว เวลา] LT",sameElse:"L"},relativeTime:{future:"อีก %s",past:"%sที่แล้ว",s:"ไม่กี่วินาที",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}}),
+//! moment.js locale configuration
+//! locale : Tagalog (Philippines) [tl-ph]
+//! author : Dan Hagman : https://github.com/hagmandan
+a.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Klingon [tlh]
+//! author : Dominika Kruk : https://github.com/amaranthrose
+var Fh="pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");a.defineLocale("tlh",{months:"tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’".split("_"),monthsShort:"jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa’leS] LT",nextWeek:"LLL",lastDay:"[wa’Hu’] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:ce,past:de,s:"puS lup",m:"wa’ tup",mm:ee,h:"wa’ rep",hh:ee,d:"wa’ jaj",dd:ee,M:"wa’ jar",MM:ee,y:"wa’ DIS",yy:ee},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}});
+//! moment.js locale configuration
+//! locale : Turkish [tr]
+//! authors : Erhan Gundogan : https://github.com/erhangundogan,
+//! Burak Yiğit Kaya: https://github.com/BYK
+var Gh={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};
+//! moment.js locale configuration
+//! locale : Talossan [tzl]
+//! author : Robin van der Vliet : https://github.com/robin0van0der0v
+//! author : Iustì Canun
+// After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals.
+// This is currently too difficult (maybe even impossible) to add.
+//! moment.js locale configuration
+//! locale : Central Atlas Tamazight Latin [tzm-latn]
+//! author : Abdel Said : https://github.com/abdelsaid
+//! moment.js locale configuration
+//! locale : Central Atlas Tamazight [tzm]
+//! author : Abdel Said : https://github.com/abdelsaid
+//! moment.js locale configuration
+//! locale : Uzbek [uz]
+//! author : Sardor Muminov : https://github.com/muminoff
+//! moment.js locale configuration
+//! locale : Vietnamese [vi]
+//! author : Bang Nguyen : https://github.com/bangnk
+//! moment.js locale configuration
+//! locale : Pseudo [x-pseudo]
+//! author : Andrew Hood : https://github.com/andrewhood125
+//! moment.js locale configuration
+//! locale : Yoruba Nigeria [yo]
+//! author : Atolagbe Abisoye : https://github.com/andela-batolagbe
+//! moment.js locale configuration
+//! locale : Chinese (China) [zh-cn]
+//! author : suupic : https://github.com/suupic
+//! author : Zeno Zeng : https://github.com/zenozeng
+//! moment.js locale configuration
+//! locale : Chinese (Hong Kong) [zh-hk]
+//! author : Ben : https://github.com/ben-lin
+//! author : Chris Lam : https://github.com/hehachris
+//! author : Konstantin : https://github.com/skfd
+//! moment.js locale configuration
+//! locale : Chinese (Taiwan) [zh-tw]
+//! author : Ben : https://github.com/ben-lin
+//! author : Chris Lam : https://github.com/hehachris
+return a.defineLocale("tr",{months:"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinalParse:/\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,ordinal:function(a){if(0===a)// special case for zero
+return a+"'ıncı";var b=a%10,c=a%100-b,d=a>=100?100:null;return a+(Gh[b]||Gh[c]||Gh[d])},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),a.defineLocale("tzl",{months:"Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi".split("_"),weekdaysShort:"Súl_Lún_Mai_Már_Xhú_Vié_Sát".split("_"),weekdaysMin:"Sú_Lú_Ma_Má_Xh_Vi_Sá".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(a){return"d'o"===a.toLowerCase()},meridiem:function(a,b,c){return a>11?c?"d'o":"D'O":c?"d'a":"D'A"},calendar:{sameDay:"[oxhi à] LT",nextDay:"[demà à] LT",nextWeek:"dddd [à] LT",lastDay:"[ieiri à] LT",lastWeek:"[sür el] dddd [lasteu à] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:ge,m:ge,mm:ge,h:ge,hh:ge,d:ge,dd:ge,M:ge,MM:ge,y:ge,yy:ge},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("tzm-latn",{months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",m:"minuḍ",mm:"%d minuḍ",h:"saɛa",hh:"%d tassaɛin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,// Saturday is the first day of the week.
+doy:12}}),a.defineLocale("tzm",{months:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),monthsShort:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),weekdays:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[ⴰⵙⴷⵅ ⴴ] LT",nextDay:"[ⴰⵙⴽⴰ ⴴ] LT",nextWeek:"dddd [ⴴ] LT",lastDay:"[ⴰⵚⴰⵏⵜ ⴴ] LT",lastWeek:"dddd [ⴴ] LT",sameElse:"L"},relativeTime:{future:"ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s",past:"ⵢⴰⵏ %s",s:"ⵉⵎⵉⴽ",m:"ⵎⵉⵏⵓⴺ",mm:"%d ⵎⵉⵏⵓⴺ",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉⵏ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰⵏ",M:"ⴰⵢoⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔⵏ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙⵏ"},week:{dow:6,// Saturday is the first day of the week.
+doy:12}}),a.defineLocale("uk",{months:{format:"січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня".split("_"),standalone:"січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень".split("_")},monthsShort:"січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),weekdays:je,weekdaysShort:"нд_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY р.",LLL:"D MMMM YYYY р., HH:mm",LLLL:"dddd, D MMMM YYYY р., HH:mm"},calendar:{sameDay:ke("[Сьогодні "),nextDay:ke("[Завтра "),lastDay:ke("[Вчора "),nextWeek:ke("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return ke("[Минулої] dddd [").call(this);case 1:case 2:case 4:return ke("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька секунд",m:ie,mm:ie,h:"годину",hh:ie,d:"день",dd:ie,M:"місяць",MM:ie,y:"рік",yy:ie},
+// M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
+meridiemParse:/ночі|ранку|дня|вечора/,isPM:function(a){return/^(дня|вечора)$/.test(a)},meridiem:function(a,b,c){return a<4?"ночі":a<12?"ранку":a<17?"дня":"вечора"},ordinalParse:/\d{1,2}-(й|го)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a+"-й";case"D":return a+"-го";default:return a}},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),a.defineLocale("uz",{months:"январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр".split("_"),monthsShort:"янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Бугун соат] LT [да]",nextDay:"[Эртага] LT [да]",nextWeek:"dddd [куни соат] LT [да]",lastDay:"[Кеча соат] LT [да]",lastWeek:"[Утган] dddd [куни соат] LT [да]",sameElse:"L"},relativeTime:{future:"Якин %s ичида",past:"Бир неча %s олдин",s:"фурсат",m:"бир дакика",mm:"%d дакика",h:"бир соат",hh:"%d соат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"},week:{dow:1,// Monday is the first day of the week.
+doy:7}}),a.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),monthsParseExact:!0,weekdays:"chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(a){return/^ch$/i.test(a)},meridiem:function(a,b,c){return a<12?c?"sa":"SA":c?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY HH:mm",LLLL:"dddd, D MMMM [năm] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tới lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tới",past:"%s trước",s:"vài giây",m:"một phút",mm:"%d phút",h:"một giờ",hh:"%d giờ",d:"một ngày",dd:"%d ngày",M:"một tháng",MM:"%d tháng",y:"một năm",yy:"%d năm"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("x-pseudo",{months:"J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér".split("_"),monthsShort:"J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc".split("_"),monthsParseExact:!0,weekdays:"S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý".split("_"),weekdaysShort:"S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát".split("_"),weekdaysMin:"S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[T~ódá~ý át] LT",nextDay:"[T~ómó~rró~w át] LT",nextWeek:"dddd [át] LT",lastDay:"[Ý~ést~érdá~ý át] LT",lastWeek:"[L~ást] dddd [át] LT",sameElse:"L"},relativeTime:{future:"í~ñ %s",past:"%s á~gó",s:"á ~féw ~sécó~ñds",m:"á ~míñ~úté",mm:"%d m~íñú~tés",h:"á~ñ hó~úr",hh:"%d h~óúrs",d:"á ~dáý",dd:"%d d~áýs",M:"á ~móñ~th",MM:"%d m~óñt~hs",y:"á ~ýéár",yy:"%d ý~éárs"},ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("yo",{months:"Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀".split("_"),monthsShort:"Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀".split("_"),weekdays:"Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta".split("_"),weekdaysShort:"Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá".split("_"),weekdaysMin:"Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Ònì ni] LT",nextDay:"[Ọ̀la ni] LT",nextWeek:"dddd [Ọsẹ̀ tón'bọ] [ni] LT",lastDay:"[Àna ni] LT",lastWeek:"dddd [Ọsẹ̀ tólọ́] [ni] LT",sameElse:"L"},relativeTime:{future:"ní %s",past:"%s kọjá",s:"ìsẹjú aayá die",m:"ìsẹjú kan",mm:"ìsẹjú %d",h:"wákati kan",hh:"wákati %d",d:"ọjọ́ kan",dd:"ọjọ́ %d",M:"osù kan",MM:"osù %d",y:"ọdún kan",yy:"ọdún %d"},ordinalParse:/ọjọ́\s\d{1,2}/,ordinal:"ọjọ́ %d",week:{dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"Ah点mm分",LTS:"Ah点m分s秒",L:"YYYY-MM-DD",LL:"YYYY年MMMD日",LLL:"YYYY年MMMD日Ah点mm分",LLLL:"YYYY年MMMD日ddddAh点mm分",l:"YYYY-MM-DD",ll:"YYYY年MMMD日",lll:"YYYY年MMMD日Ah点mm分",llll:"YYYY年MMMD日ddddAh点mm分"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(a,b){return 12===a&&(a=0),"凌晨"===b||"早上"===b||"上午"===b?a:"下午"===b||"晚上"===b?a+12:a>=11?a:a+12},meridiem:function(a,b,c){var d=100*a+b;return d<600?"凌晨":d<900?"早上":d<1130?"上午":d<1230?"中午":d<1800?"下午":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var b,c;return b=a().startOf("week"),c=this.diff(b,"days")>=7?"[下]":"[本]",0===this.minutes()?c+"dddAh点整":c+"dddAh点mm"},lastWeek:function(){var b,c;return b=a().startOf("week"),c=this.unix()<b.unix()?"[上]":"[本]",0===this.minutes()?c+"dddAh点整":c+"dddAh点mm"},sameElse:"LL"},ordinalParse:/\d{1,2}(日|月|周)/,ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"日";case"M":return a+"月";case"w":case"W":return a+"周";default:return a}},relativeTime:{future:"%s内",past:"%s前",s:"几秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},week:{
+// GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
+dow:1,// Monday is the first day of the week.
+doy:4}}),a.defineLocale("zh-hk",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"Ah點mm分",LTS:"Ah點m分s秒",L:"YYYY年MMMD日",LL:"YYYY年MMMD日",LLL:"YYYY年MMMD日Ah點mm分",LLLL:"YYYY年MMMD日ddddAh點mm分",l:"YYYY年MMMD日",ll:"YYYY年MMMD日",lll:"YYYY年MMMD日Ah點mm分",llll:"YYYY年MMMD日ddddAh點mm分"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(a,b){return 12===a&&(a=0),"凌晨"===b||"早上"===b||"上午"===b?a:"中午"===b?a>=11?a:a+12:"下午"===b||"晚上"===b?a+12:void 0},meridiem:function(a,b,c){var d=100*a+b;return d<600?"凌晨":d<900?"早上":d<1130?"上午":d<1230?"中午":d<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinalParse:/\d{1,2}(日|月|週)/,ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"日";case"M":return a+"月";case"w":case"W":return a+"週";default:return a}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}}),a.defineLocale("zh-tw",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"Ah點mm分",LTS:"Ah點m分s秒",L:"YYYY年MMMD日",LL:"YYYY年MMMD日",LLL:"YYYY年MMMD日Ah點mm分",LLLL:"YYYY年MMMD日ddddAh點mm分",l:"YYYY年MMMD日",ll:"YYYY年MMMD日",lll:"YYYY年MMMD日Ah點mm分",llll:"YYYY年MMMD日ddddAh點mm分"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(a,b){return 12===a&&(a=0),"凌晨"===b||"早上"===b||"上午"===b?a:"中午"===b?a>=11?a:a+12:"下午"===b||"晚上"===b?a+12:void 0},meridiem:function(a,b,c){var d=100*a+b;return d<600?"凌晨":d<900?"早上":d<1130?"上午":d<1230?"中午":d<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinalParse:/\d{1,2}(日|月|週)/,ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"日";case"M":return a+"月";case"w":case"W":return a+"週";default:return a}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}}),a.locale("en"),a}); \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/moment.min.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/moment.min.js
new file mode 100644
index 00000000000..8c706712d37
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/moment.min.js
@@ -0,0 +1,551 @@
+//! moment.js
+//! version : 2.17.1
+//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
+//! license : MIT
+//! momentjs.com
+!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.moment=b()}(this,function(){"use strict";function a(){return od.apply(null,arguments)}
+// This is done to register the method called with moment()
+// without creating circular dependencies.
+function b(a){od=a}function c(a){return a instanceof Array||"[object Array]"===Object.prototype.toString.call(a)}function d(a){
+// IE8 will treat undefined and null as object if it wasn't for
+// input != null
+return null!=a&&"[object Object]"===Object.prototype.toString.call(a)}function e(a){var b;for(b in a)
+// even if its not own property I'd still call it non-empty
+return!1;return!0}function f(a){return"number"==typeof a||"[object Number]"===Object.prototype.toString.call(a)}function g(a){return a instanceof Date||"[object Date]"===Object.prototype.toString.call(a)}function h(a,b){var c,d=[];for(c=0;c<a.length;++c)d.push(b(a[c],c));return d}function i(a,b){return Object.prototype.hasOwnProperty.call(a,b)}function j(a,b){for(var c in b)i(b,c)&&(a[c]=b[c]);return i(b,"toString")&&(a.toString=b.toString),i(b,"valueOf")&&(a.valueOf=b.valueOf),a}function k(a,b,c,d){return rb(a,b,c,d,!0).utc()}function l(){
+// We need to deep clone this object.
+return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null}}function m(a){return null==a._pf&&(a._pf=l()),a._pf}function n(a){if(null==a._isValid){var b=m(a),c=qd.call(b.parsedDateParts,function(a){return null!=a}),d=!isNaN(a._d.getTime())&&b.overflow<0&&!b.empty&&!b.invalidMonth&&!b.invalidWeekday&&!b.nullInput&&!b.invalidFormat&&!b.userInvalidated&&(!b.meridiem||b.meridiem&&c);if(a._strict&&(d=d&&0===b.charsLeftOver&&0===b.unusedTokens.length&&void 0===b.bigHour),null!=Object.isFrozen&&Object.isFrozen(a))return d;a._isValid=d}return a._isValid}function o(a){var b=k(NaN);return null!=a?j(m(b),a):m(b).userInvalidated=!0,b}function p(a){return void 0===a}function q(a,b){var c,d,e;if(p(b._isAMomentObject)||(a._isAMomentObject=b._isAMomentObject),p(b._i)||(a._i=b._i),p(b._f)||(a._f=b._f),p(b._l)||(a._l=b._l),p(b._strict)||(a._strict=b._strict),p(b._tzm)||(a._tzm=b._tzm),p(b._isUTC)||(a._isUTC=b._isUTC),p(b._offset)||(a._offset=b._offset),p(b._pf)||(a._pf=m(b)),p(b._locale)||(a._locale=b._locale),rd.length>0)for(c in rd)d=rd[c],e=b[d],p(e)||(a[d]=e);return a}
+// Moment prototype object
+function r(b){q(this,b),this._d=new Date(null!=b._d?b._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),
+// Prevent infinite loop in case updateOffset creates new moment
+// objects.
+sd===!1&&(sd=!0,a.updateOffset(this),sd=!1)}function s(a){return a instanceof r||null!=a&&null!=a._isAMomentObject}function t(a){return a<0?Math.ceil(a)||0:Math.floor(a)}function u(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=t(b)),c}
+// compare two arrays, return the number of differences
+function v(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;d<e;d++)(c&&a[d]!==b[d]||!c&&u(a[d])!==u(b[d]))&&g++;return g+f}function w(b){a.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+b)}function x(b,c){var d=!0;return j(function(){if(null!=a.deprecationHandler&&a.deprecationHandler(null,b),d){for(var e,f=[],g=0;g<arguments.length;g++){if(e="","object"==typeof arguments[g]){e+="\n["+g+"] ";for(var h in arguments[0])e+=h+": "+arguments[0][h]+", ";e=e.slice(0,-2)}else e=arguments[g];f.push(e)}w(b+"\nArguments: "+Array.prototype.slice.call(f).join("")+"\n"+(new Error).stack),d=!1}return c.apply(this,arguments)},c)}function y(b,c){null!=a.deprecationHandler&&a.deprecationHandler(b,c),td[b]||(w(c),td[b]=!0)}function z(a){return a instanceof Function||"[object Function]"===Object.prototype.toString.call(a)}function A(a){var b,c;for(c in a)b=a[c],z(b)?this[c]=b:this["_"+c]=b;this._config=a,
+// Lenient ordinal parsing accepts just a number in addition to
+// number + (possibly) stuff coming from _ordinalParseLenient.
+this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)}function B(a,b){var c,e=j({},a);for(c in b)i(b,c)&&(d(a[c])&&d(b[c])?(e[c]={},j(e[c],a[c]),j(e[c],b[c])):null!=b[c]?e[c]=b[c]:delete e[c]);for(c in a)i(a,c)&&!i(b,c)&&d(a[c])&&(
+// make sure changes to properties don't modify parent config
+e[c]=j({},e[c]));return e}function C(a){null!=a&&this.set(a)}function D(a,b,c){var d=this._calendar[a]||this._calendar.sameElse;return z(d)?d.call(b,c):d}function E(a){var b=this._longDateFormat[a],c=this._longDateFormat[a.toUpperCase()];return b||!c?b:(this._longDateFormat[a]=c.replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a])}function F(){return this._invalidDate}function G(a){return this._ordinal.replace("%d",a)}function H(a,b,c,d){var e=this._relativeTime[c];return z(e)?e(a,b,c,d):e.replace(/%d/i,a)}function I(a,b){var c=this._relativeTime[a>0?"future":"past"];return z(c)?c(b):c.replace(/%s/i,b)}function J(a,b){var c=a.toLowerCase();Dd[c]=Dd[c+"s"]=Dd[b]=a}function K(a){return"string"==typeof a?Dd[a]||Dd[a.toLowerCase()]:void 0}function L(a){var b,c,d={};for(c in a)i(a,c)&&(b=K(c),b&&(d[b]=a[c]));return d}function M(a,b){Ed[a]=b}function N(a){var b=[];for(var c in a)b.push({unit:c,priority:Ed[c]});return b.sort(function(a,b){return a.priority-b.priority}),b}function O(b,c){return function(d){return null!=d?(Q(this,b,d),a.updateOffset(this,c),this):P(this,b)}}function P(a,b){return a.isValid()?a._d["get"+(a._isUTC?"UTC":"")+b]():NaN}function Q(a,b,c){a.isValid()&&a._d["set"+(a._isUTC?"UTC":"")+b](c)}
+// MOMENTS
+function R(a){return a=K(a),z(this[a])?this[a]():this}function S(a,b){if("object"==typeof a){a=L(a);for(var c=N(a),d=0;d<c.length;d++)this[c[d].unit](a[c[d].unit])}else if(a=K(a),z(this[a]))return this[a](b);return this}function T(a,b,c){var d=""+Math.abs(a),e=b-d.length,f=a>=0;return(f?c?"+":"":"-")+Math.pow(10,Math.max(0,e)).toString().substr(1)+d}
+// token: 'M'
+// padded: ['MM', 2]
+// ordinal: 'Mo'
+// callback: function () { this.month() + 1 }
+function U(a,b,c,d){var e=d;"string"==typeof d&&(e=function(){return this[d]()}),a&&(Id[a]=e),b&&(Id[b[0]]=function(){return T(e.apply(this,arguments),b[1],b[2])}),c&&(Id[c]=function(){return this.localeData().ordinal(e.apply(this,arguments),a)})}function V(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function W(a){var b,c,d=a.match(Fd);for(b=0,c=d.length;b<c;b++)Id[d[b]]?d[b]=Id[d[b]]:d[b]=V(d[b]);return function(b){var e,f="";for(e=0;e<c;e++)f+=d[e]instanceof Function?d[e].call(b,a):d[e];return f}}
+// format date using native date object
+function X(a,b){return a.isValid()?(b=Y(b,a.localeData()),Hd[b]=Hd[b]||W(b),Hd[b](a)):a.localeData().invalidDate()}function Y(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Gd.lastIndex=0;d>=0&&Gd.test(a);)a=a.replace(Gd,c),Gd.lastIndex=0,d-=1;return a}function Z(a,b,c){$d[a]=z(b)?b:function(a,d){return a&&c?c:b}}function $(a,b){return i($d,a)?$d[a](b._strict,b._locale):new RegExp(_(a))}
+// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
+function _(a){return aa(a.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e}))}function aa(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function ba(a,b){var c,d=b;for("string"==typeof a&&(a=[a]),f(b)&&(d=function(a,c){c[b]=u(a)}),c=0;c<a.length;c++)_d[a[c]]=d}function ca(a,b){ba(a,function(a,c,d,e){d._w=d._w||{},b(a,d._w,d,e)})}function da(a,b,c){null!=b&&i(_d,a)&&_d[a](b,c._a,c,a)}function ea(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function fa(a,b){return a?c(this._months)?this._months[a.month()]:this._months[(this._months.isFormat||ke).test(b)?"format":"standalone"][a.month()]:this._months}function ga(a,b){return a?c(this._monthsShort)?this._monthsShort[a.month()]:this._monthsShort[ke.test(b)?"format":"standalone"][a.month()]:this._monthsShort}function ha(a,b,c){var d,e,f,g=a.toLocaleLowerCase();if(!this._monthsParse)for(
+// this is not used
+this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],d=0;d<12;++d)f=k([2e3,d]),this._shortMonthsParse[d]=this.monthsShort(f,"").toLocaleLowerCase(),this._longMonthsParse[d]=this.months(f,"").toLocaleLowerCase();return c?"MMM"===b?(e=je.call(this._shortMonthsParse,g),e!==-1?e:null):(e=je.call(this._longMonthsParse,g),e!==-1?e:null):"MMM"===b?(e=je.call(this._shortMonthsParse,g),e!==-1?e:(e=je.call(this._longMonthsParse,g),e!==-1?e:null)):(e=je.call(this._longMonthsParse,g),e!==-1?e:(e=je.call(this._shortMonthsParse,g),e!==-1?e:null))}function ia(a,b,c){var d,e,f;if(this._monthsParseExact)return ha.call(this,a,b,c);
+// TODO: add sorting
+// Sorting makes sure if one month (or abbr) is a prefix of another
+// see sorting in computeMonthsParse
+for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;d<12;d++){
+// test the regex
+if(
+// make the regex if we don't have it already
+e=k([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}}
+// MOMENTS
+function ja(a,b){var c;if(!a.isValid())
+// No op
+return a;if("string"==typeof b)if(/^\d+$/.test(b))b=u(b);else
+// TODO: Another silent failure?
+if(b=a.localeData().monthsParse(b),!f(b))return a;return c=Math.min(a.date(),ea(a.year(),b)),a._d["set"+(a._isUTC?"UTC":"")+"Month"](b,c),a}function ka(b){return null!=b?(ja(this,b),a.updateOffset(this,!0),this):P(this,"Month")}function la(){return ea(this.year(),this.month())}function ma(a){return this._monthsParseExact?(i(this,"_monthsRegex")||oa.call(this),a?this._monthsShortStrictRegex:this._monthsShortRegex):(i(this,"_monthsShortRegex")||(this._monthsShortRegex=ne),this._monthsShortStrictRegex&&a?this._monthsShortStrictRegex:this._monthsShortRegex)}function na(a){return this._monthsParseExact?(i(this,"_monthsRegex")||oa.call(this),a?this._monthsStrictRegex:this._monthsRegex):(i(this,"_monthsRegex")||(this._monthsRegex=oe),this._monthsStrictRegex&&a?this._monthsStrictRegex:this._monthsRegex)}function oa(){function a(a,b){return b.length-a.length}var b,c,d=[],e=[],f=[];for(b=0;b<12;b++)
+// make the regex if we don't have it already
+c=k([2e3,b]),d.push(this.monthsShort(c,"")),e.push(this.months(c,"")),f.push(this.months(c,"")),f.push(this.monthsShort(c,""));for(
+// Sorting makes sure if one month (or abbr) is a prefix of another it
+// will match the longer piece.
+d.sort(a),e.sort(a),f.sort(a),b=0;b<12;b++)d[b]=aa(d[b]),e[b]=aa(e[b]);for(b=0;b<24;b++)f[b]=aa(f[b]);this._monthsRegex=new RegExp("^("+f.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+e.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+d.join("|")+")","i")}
+// HELPERS
+function pa(a){return qa(a)?366:365}function qa(a){return a%4===0&&a%100!==0||a%400===0}function ra(){return qa(this.year())}function sa(a,b,c,d,e,f,g){
+//can't just apply() to create a date:
+//http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
+var h=new Date(a,b,c,d,e,f,g);
+//the date constructor remaps years 0-99 to 1900-1999
+return a<100&&a>=0&&isFinite(h.getFullYear())&&h.setFullYear(a),h}function ta(a){var b=new Date(Date.UTC.apply(null,arguments));
+//the Date.UTC function remaps years 0-99 to 1900-1999
+return a<100&&a>=0&&isFinite(b.getUTCFullYear())&&b.setUTCFullYear(a),b}
+// start-of-first-week - start-of-year
+function ua(a,b,c){var// first-week day -- which january is always in the first week (4 for iso, 1 for other)
+d=7+b-c,
+// first-week day local weekday -- which local weekday is fwd
+e=(7+ta(a,0,d).getUTCDay()-b)%7;return-e+d-1}
+//http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
+function va(a,b,c,d,e){var f,g,h=(7+c-d)%7,i=ua(a,d,e),j=1+7*(b-1)+h+i;return j<=0?(f=a-1,g=pa(f)+j):j>pa(a)?(f=a+1,g=j-pa(a)):(f=a,g=j),{year:f,dayOfYear:g}}function wa(a,b,c){var d,e,f=ua(a.year(),b,c),g=Math.floor((a.dayOfYear()-f-1)/7)+1;return g<1?(e=a.year()-1,d=g+xa(e,b,c)):g>xa(a.year(),b,c)?(d=g-xa(a.year(),b,c),e=a.year()+1):(e=a.year(),d=g),{week:d,year:e}}function xa(a,b,c){var d=ua(a,b,c),e=ua(a+1,b,c);return(pa(a)-d+e)/7}
+// HELPERS
+// LOCALES
+function ya(a){return wa(a,this._week.dow,this._week.doy).week}function za(){return this._week.dow}function Aa(){return this._week.doy}
+// MOMENTS
+function Ba(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")}function Ca(a){var b=wa(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")}
+// HELPERS
+function Da(a,b){return"string"!=typeof a?a:isNaN(a)?(a=b.weekdaysParse(a),"number"==typeof a?a:null):parseInt(a,10)}function Ea(a,b){return"string"==typeof a?b.weekdaysParse(a)%7||7:isNaN(a)?null:a}function Fa(a,b){return a?c(this._weekdays)?this._weekdays[a.day()]:this._weekdays[this._weekdays.isFormat.test(b)?"format":"standalone"][a.day()]:this._weekdays}function Ga(a){return a?this._weekdaysShort[a.day()]:this._weekdaysShort}function Ha(a){return a?this._weekdaysMin[a.day()]:this._weekdaysMin}function Ia(a,b,c){var d,e,f,g=a.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],d=0;d<7;++d)f=k([2e3,1]).day(d),this._minWeekdaysParse[d]=this.weekdaysMin(f,"").toLocaleLowerCase(),this._shortWeekdaysParse[d]=this.weekdaysShort(f,"").toLocaleLowerCase(),this._weekdaysParse[d]=this.weekdays(f,"").toLocaleLowerCase();return c?"dddd"===b?(e=je.call(this._weekdaysParse,g),e!==-1?e:null):"ddd"===b?(e=je.call(this._shortWeekdaysParse,g),e!==-1?e:null):(e=je.call(this._minWeekdaysParse,g),e!==-1?e:null):"dddd"===b?(e=je.call(this._weekdaysParse,g),e!==-1?e:(e=je.call(this._shortWeekdaysParse,g),e!==-1?e:(e=je.call(this._minWeekdaysParse,g),e!==-1?e:null))):"ddd"===b?(e=je.call(this._shortWeekdaysParse,g),e!==-1?e:(e=je.call(this._weekdaysParse,g),e!==-1?e:(e=je.call(this._minWeekdaysParse,g),e!==-1?e:null))):(e=je.call(this._minWeekdaysParse,g),e!==-1?e:(e=je.call(this._weekdaysParse,g),e!==-1?e:(e=je.call(this._shortWeekdaysParse,g),e!==-1?e:null)))}function Ja(a,b,c){var d,e,f;if(this._weekdaysParseExact)return Ia.call(this,a,b,c);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),d=0;d<7;d++){
+// test the regex
+if(
+// make the regex if we don't have it already
+e=k([2e3,1]).day(d),c&&!this._fullWeekdaysParse[d]&&(this._fullWeekdaysParse[d]=new RegExp("^"+this.weekdays(e,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[d]=new RegExp("^"+this.weekdaysShort(e,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[d]=new RegExp("^"+this.weekdaysMin(e,"").replace(".",".?")+"$","i")),this._weekdaysParse[d]||(f="^"+this.weekdays(e,"")+"|^"+this.weekdaysShort(e,"")+"|^"+this.weekdaysMin(e,""),this._weekdaysParse[d]=new RegExp(f.replace(".",""),"i")),c&&"dddd"===b&&this._fullWeekdaysParse[d].test(a))return d;if(c&&"ddd"===b&&this._shortWeekdaysParse[d].test(a))return d;if(c&&"dd"===b&&this._minWeekdaysParse[d].test(a))return d;if(!c&&this._weekdaysParse[d].test(a))return d}}
+// MOMENTS
+function Ka(a){if(!this.isValid())return null!=a?this:NaN;var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=Da(a,this.localeData()),this.add(a-b,"d")):b}function La(a){if(!this.isValid())return null!=a?this:NaN;var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")}function Ma(a){if(!this.isValid())return null!=a?this:NaN;
+// behaves the same as moment#day except
+// as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
+// as a setter, sunday should belong to the previous week.
+if(null!=a){var b=Ea(a,this.localeData());return this.day(this.day()%7?b:b-7)}return this.day()||7}function Na(a){return this._weekdaysParseExact?(i(this,"_weekdaysRegex")||Qa.call(this),a?this._weekdaysStrictRegex:this._weekdaysRegex):(i(this,"_weekdaysRegex")||(this._weekdaysRegex=ue),this._weekdaysStrictRegex&&a?this._weekdaysStrictRegex:this._weekdaysRegex)}function Oa(a){return this._weekdaysParseExact?(i(this,"_weekdaysRegex")||Qa.call(this),a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(i(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=ve),this._weekdaysShortStrictRegex&&a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Pa(a){return this._weekdaysParseExact?(i(this,"_weekdaysRegex")||Qa.call(this),a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(i(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=we),this._weekdaysMinStrictRegex&&a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Qa(){function a(a,b){return b.length-a.length}var b,c,d,e,f,g=[],h=[],i=[],j=[];for(b=0;b<7;b++)
+// make the regex if we don't have it already
+c=k([2e3,1]).day(b),d=this.weekdaysMin(c,""),e=this.weekdaysShort(c,""),f=this.weekdays(c,""),g.push(d),h.push(e),i.push(f),j.push(d),j.push(e),j.push(f);for(
+// Sorting makes sure if one weekday (or abbr) is a prefix of another it
+// will match the longer piece.
+g.sort(a),h.sort(a),i.sort(a),j.sort(a),b=0;b<7;b++)h[b]=aa(h[b]),i[b]=aa(i[b]),j[b]=aa(j[b]);this._weekdaysRegex=new RegExp("^("+j.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+h.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+g.join("|")+")","i")}
+// FORMATTING
+function Ra(){return this.hours()%12||12}function Sa(){return this.hours()||24}function Ta(a,b){U(a,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),b)})}
+// PARSING
+function Ua(a,b){return b._meridiemParse}
+// LOCALES
+function Va(a){
+// IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
+// Using charAt should be more compatible.
+return"p"===(a+"").toLowerCase().charAt(0)}function Wa(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"}function Xa(a){return a?a.toLowerCase().replace("_","-"):a}
+// pick the locale from the array
+// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
+// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
+function Ya(a){for(var b,c,d,e,f=0;f<a.length;){for(e=Xa(a[f]).split("-"),b=e.length,c=Xa(a[f+1]),c=c?c.split("-"):null;b>0;){if(d=Za(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&v(e,c,!0)>=b-1)
+//the next array item is better than a shallower substring of this one
+break;b--}f++}return null}function Za(a){var b=null;
+// TODO: Find a better way to register and load all the locales in Node
+if(!Be[a]&&"undefined"!=typeof module&&module&&module.exports)try{b=xe._abbr,require("./locale/"+a),
+// because defineLocale currently also sets the global locale, we
+// want to undo that for lazy loaded locales
+$a(b)}catch(a){}return Be[a]}
+// This function will load locale and then set the global locale. If
+// no arguments are passed in, it will simply return the current global
+// locale key.
+function $a(a,b){var c;
+// moment.duration._locale = moment._locale = data;
+return a&&(c=p(b)?bb(a):_a(a,b),c&&(xe=c)),xe._abbr}function _a(a,b){if(null!==b){var c=Ae;if(b.abbr=a,null!=Be[a])y("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),c=Be[a]._config;else if(null!=b.parentLocale){if(null==Be[b.parentLocale])return Ce[b.parentLocale]||(Ce[b.parentLocale]=[]),Ce[b.parentLocale].push({name:a,config:b}),null;c=Be[b.parentLocale]._config}
+// backwards compat for now: also set the locale
+// make sure we set the locale AFTER all child locales have been
+// created, so we won't end up with the child locale set.
+return Be[a]=new C(B(c,b)),Ce[a]&&Ce[a].forEach(function(a){_a(a.name,a.config)}),$a(a),Be[a]}
+// useful for testing
+return delete Be[a],null}function ab(a,b){if(null!=b){var c,d=Ae;
+// MERGE
+null!=Be[a]&&(d=Be[a]._config),b=B(d,b),c=new C(b),c.parentLocale=Be[a],Be[a]=c,
+// backwards compat for now: also set the locale
+$a(a)}else
+// pass null for config to unupdate, useful for tests
+null!=Be[a]&&(null!=Be[a].parentLocale?Be[a]=Be[a].parentLocale:null!=Be[a]&&delete Be[a]);return Be[a]}
+// returns locale data
+function bb(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return xe;if(!c(a)){if(
+//short-circuit everything else
+b=Za(a))return b;a=[a]}return Ya(a)}function cb(){return wd(Be)}function db(a){var b,c=a._a;return c&&m(a).overflow===-2&&(b=c[be]<0||c[be]>11?be:c[ce]<1||c[ce]>ea(c[ae],c[be])?ce:c[de]<0||c[de]>24||24===c[de]&&(0!==c[ee]||0!==c[fe]||0!==c[ge])?de:c[ee]<0||c[ee]>59?ee:c[fe]<0||c[fe]>59?fe:c[ge]<0||c[ge]>999?ge:-1,m(a)._overflowDayOfYear&&(b<ae||b>ce)&&(b=ce),m(a)._overflowWeeks&&b===-1&&(b=he),m(a)._overflowWeekday&&b===-1&&(b=ie),m(a).overflow=b),a}
+// date from iso format
+function eb(a){var b,c,d,e,f,g,h=a._i,i=De.exec(h)||Ee.exec(h);if(i){for(m(a).iso=!0,b=0,c=Ge.length;b<c;b++)if(Ge[b][1].exec(i[1])){e=Ge[b][0],d=Ge[b][2]!==!1;break}if(null==e)return void(a._isValid=!1);if(i[3]){for(b=0,c=He.length;b<c;b++)if(He[b][1].exec(i[3])){
+// match[2] should be 'T' or space
+f=(i[2]||" ")+He[b][0];break}if(null==f)return void(a._isValid=!1)}if(!d&&null!=f)return void(a._isValid=!1);if(i[4]){if(!Fe.exec(i[4]))return void(a._isValid=!1);g="Z"}a._f=e+(f||"")+(g||""),kb(a)}else a._isValid=!1}
+// date from iso format or fallback
+function fb(b){var c=Ie.exec(b._i);return null!==c?void(b._d=new Date(+c[1])):(eb(b),void(b._isValid===!1&&(delete b._isValid,a.createFromInputFallback(b))))}
+// Pick the first defined of two or three arguments.
+function gb(a,b,c){return null!=a?a:null!=b?b:c}function hb(b){
+// hooks is actually the exported moment object
+var c=new Date(a.now());return b._useUTC?[c.getUTCFullYear(),c.getUTCMonth(),c.getUTCDate()]:[c.getFullYear(),c.getMonth(),c.getDate()]}
+// convert an array to a date.
+// the array should mirror the parameters below
+// note: all values past the year are optional and will default to the lowest possible value.
+// [year, month, day , hour, minute, second, millisecond]
+function ib(a){var b,c,d,e,f=[];if(!a._d){
+// Default to current date.
+// * if no year, month, day of month are given, default to today
+// * if day of month is given, default month and year
+// * if month is given, default only year
+// * if year is given, don't default anything
+for(d=hb(a),
+//compute day of the year from weeks and weekdays
+a._w&&null==a._a[ce]&&null==a._a[be]&&jb(a),
+//if the day of the year is set, figure out what it is
+a._dayOfYear&&(e=gb(a._a[ae],d[ae]),a._dayOfYear>pa(e)&&(m(a)._overflowDayOfYear=!0),c=ta(e,0,a._dayOfYear),a._a[be]=c.getUTCMonth(),a._a[ce]=c.getUTCDate()),b=0;b<3&&null==a._a[b];++b)a._a[b]=f[b]=d[b];
+// Zero out whatever was not defaulted, including time
+for(;b<7;b++)a._a[b]=f[b]=null==a._a[b]?2===b?1:0:a._a[b];
+// Check for 24:00:00.000
+24===a._a[de]&&0===a._a[ee]&&0===a._a[fe]&&0===a._a[ge]&&(a._nextDay=!0,a._a[de]=0),a._d=(a._useUTC?ta:sa).apply(null,f),
+// Apply timezone offset from input. The actual utcOffset can be changed
+// with parseZone.
+null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[de]=24)}}function jb(a){var b,c,d,e,f,g,h,i;if(b=a._w,null!=b.GG||null!=b.W||null!=b.E)f=1,g=4,
+// TODO: We need to take the current isoWeekYear, but that depends on
+// how we interpret now (local, utc, fixed offset). So create
+// a now version of current config (take local/utc/offset flags, and
+// create now).
+c=gb(b.GG,a._a[ae],wa(sb(),1,4).year),d=gb(b.W,1),e=gb(b.E,1),(e<1||e>7)&&(i=!0);else{f=a._locale._week.dow,g=a._locale._week.doy;var j=wa(sb(),f,g);c=gb(b.gg,a._a[ae],j.year),
+// Default to current week.
+d=gb(b.w,j.week),null!=b.d?(
+// weekday -- low day numbers are considered next week
+e=b.d,(e<0||e>6)&&(i=!0)):null!=b.e?(
+// local weekday -- counting starts from begining of week
+e=b.e+f,(b.e<0||b.e>6)&&(i=!0)):
+// default to begining of week
+e=f}d<1||d>xa(c,f,g)?m(a)._overflowWeeks=!0:null!=i?m(a)._overflowWeekday=!0:(h=va(c,d,e,f,g),a._a[ae]=h.year,a._dayOfYear=h.dayOfYear)}
+// date from string and format string
+function kb(b){
+// TODO: Move this to another part of the creation flow to prevent circular deps
+if(b._f===a.ISO_8601)return void eb(b);b._a=[],m(b).empty=!0;
+// This array is used to make a Date, either with `new Date` or `Date.UTC`
+var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=Y(b._f,b._locale).match(Fd)||[],c=0;c<e.length;c++)f=e[c],d=(h.match($(f,b))||[])[0],
+// console.log('token', token, 'parsedInput', parsedInput,
+// 'regex', getParseRegexForToken(token, config));
+d&&(g=h.substr(0,h.indexOf(d)),g.length>0&&m(b).unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),
+// don't parse if it's not a known token
+Id[f]?(d?m(b).empty=!1:m(b).unusedTokens.push(f),da(f,d,b)):b._strict&&!d&&m(b).unusedTokens.push(f);
+// add remaining unparsed input length to the string
+m(b).charsLeftOver=i-j,h.length>0&&m(b).unusedInput.push(h),
+// clear _12h flag if hour is <= 12
+b._a[de]<=12&&m(b).bigHour===!0&&b._a[de]>0&&(m(b).bigHour=void 0),m(b).parsedDateParts=b._a.slice(0),m(b).meridiem=b._meridiem,
+// handle meridiem
+b._a[de]=lb(b._locale,b._a[de],b._meridiem),ib(b),db(b)}function lb(a,b,c){var d;
+// Fallback
+return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&b<12&&(b+=12),d||12!==b||(b=0),b):b}
+// date from string and array of format strings
+function mb(a){var b,c,d,e,f;if(0===a._f.length)return m(a).invalidFormat=!0,void(a._d=new Date(NaN));for(e=0;e<a._f.length;e++)f=0,b=q({},a),null!=a._useUTC&&(b._useUTC=a._useUTC),b._f=a._f[e],kb(b),n(b)&&(
+// if there is any input that was not parsed add a penalty for that format
+f+=m(b).charsLeftOver,
+//or tokens
+f+=10*m(b).unusedTokens.length,m(b).score=f,(null==d||f<d)&&(d=f,c=b));j(a,c||b)}function nb(a){if(!a._d){var b=L(a._i);a._a=h([b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],function(a){return a&&parseInt(a,10)}),ib(a)}}function ob(a){var b=new r(db(pb(a)));
+// Adding is smart enough around DST
+return b._nextDay&&(b.add(1,"d"),b._nextDay=void 0),b}function pb(a){var b=a._i,d=a._f;return a._locale=a._locale||bb(a._l),null===b||void 0===d&&""===b?o({nullInput:!0}):("string"==typeof b&&(a._i=b=a._locale.preparse(b)),s(b)?new r(db(b)):(g(b)?a._d=b:c(d)?mb(a):d?kb(a):qb(a),n(a)||(a._d=null),a))}function qb(b){var d=b._i;void 0===d?b._d=new Date(a.now()):g(d)?b._d=new Date(d.valueOf()):"string"==typeof d?fb(b):c(d)?(b._a=h(d.slice(0),function(a){return parseInt(a,10)}),ib(b)):"object"==typeof d?nb(b):f(d)?
+// from milliseconds
+b._d=new Date(d):a.createFromInputFallback(b)}function rb(a,b,f,g,h){var i={};
+// object construction must be done this way.
+// https://github.com/moment/moment/issues/1423
+return f!==!0&&f!==!1||(g=f,f=void 0),(d(a)&&e(a)||c(a)&&0===a.length)&&(a=void 0),i._isAMomentObject=!0,i._useUTC=i._isUTC=h,i._l=f,i._i=a,i._f=b,i._strict=g,ob(i)}function sb(a,b,c,d){return rb(a,b,c,d,!1)}
+// Pick a moment m from moments so that m[fn](other) is true for all
+// other. This relies on the function fn to be transitive.
+//
+// moments should either be an array of moment objects or an array, whose
+// first element is an array of moment objects.
+function tb(a,b){var d,e;if(1===b.length&&c(b[0])&&(b=b[0]),!b.length)return sb();for(d=b[0],e=1;e<b.length;++e)b[e].isValid()&&!b[e][a](d)||(d=b[e]);return d}
+// TODO: Use [].sort instead?
+function ub(){var a=[].slice.call(arguments,0);return tb("isBefore",a)}function vb(){var a=[].slice.call(arguments,0);return tb("isAfter",a)}function wb(a){var b=L(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;
+// representation for dateAddRemove
+this._milliseconds=+k+1e3*j+// 1000
+6e4*i+// 1000 * 60
+1e3*h*60*60,//using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
+// Because of dateAddRemove treats 24 hours as different from a
+// day when working around DST, we need to store them separately
+this._days=+g+7*f,
+// It is impossible translate months into days without knowing
+// which months you are are talking about, so we have to store
+// it separately.
+this._months=+e+3*d+12*c,this._data={},this._locale=bb(),this._bubble()}function xb(a){return a instanceof wb}function yb(a){return a<0?Math.round(-1*a)*-1:Math.round(a)}
+// FORMATTING
+function zb(a,b){U(a,0,0,function(){var a=this.utcOffset(),c="+";return a<0&&(a=-a,c="-"),c+T(~~(a/60),2)+b+T(~~a%60,2)})}function Ab(a,b){var c=(b||"").match(a);if(null===c)return null;var d=c[c.length-1]||[],e=(d+"").match(Me)||["-",0,0],f=+(60*e[1])+u(e[2]);return 0===f?0:"+"===e[0]?f:-f}
+// Return a moment from input, that is local/utc/zone equivalent to model.
+function Bb(b,c){var d,e;
+// Use low-level api, because this fn is low-level api.
+return c._isUTC?(d=c.clone(),e=(s(b)||g(b)?b.valueOf():sb(b).valueOf())-d.valueOf(),d._d.setTime(d._d.valueOf()+e),a.updateOffset(d,!1),d):sb(b).local()}function Cb(a){
+// On Firefox.24 Date#getTimezoneOffset returns a floating point.
+// https://github.com/moment/moment/pull/1871
+return 15*-Math.round(a._d.getTimezoneOffset()/15)}
+// MOMENTS
+// keepLocalTime = true means only change the timezone, without
+// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
+// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
+// +0200, so we adjust the time as needed, to be valid.
+//
+// Keeping the time actually adds/subtracts (one hour)
+// from the actual represented time. That is why we call updateOffset
+// a second time. In case it wants us to change the offset again
+// _changeInProgress == true case, then we have to adjust, because
+// there is no such time in the given timezone.
+function Db(b,c){var d,e=this._offset||0;if(!this.isValid())return null!=b?this:NaN;if(null!=b){if("string"==typeof b){if(b=Ab(Xd,b),null===b)return this}else Math.abs(b)<16&&(b=60*b);return!this._isUTC&&c&&(d=Cb(this)),this._offset=b,this._isUTC=!0,null!=d&&this.add(d,"m"),e!==b&&(!c||this._changeInProgress?Tb(this,Ob(b-e,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?e:Cb(this)}function Eb(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}function Fb(a){return this.utcOffset(0,a)}function Gb(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(Cb(this),"m")),this}function Hb(){if(null!=this._tzm)this.utcOffset(this._tzm);else if("string"==typeof this._i){var a=Ab(Wd,this._i);null!=a?this.utcOffset(a):this.utcOffset(0,!0)}return this}function Ib(a){return!!this.isValid()&&(a=a?sb(a).utcOffset():0,(this.utcOffset()-a)%60===0)}function Jb(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Kb(){if(!p(this._isDSTShifted))return this._isDSTShifted;var a={};if(q(a,this),a=pb(a),a._a){var b=a._isUTC?k(a._a):sb(a._a);this._isDSTShifted=this.isValid()&&v(a._a,b.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function Lb(){return!!this.isValid()&&!this._isUTC}function Mb(){return!!this.isValid()&&this._isUTC}function Nb(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Ob(a,b){var c,d,e,g=a,
+// matching against regexp is expensive, do it on demand
+h=null;// checks for null or undefined
+return xb(a)?g={ms:a._milliseconds,d:a._days,M:a._months}:f(a)?(g={},b?g[b]=a:g.milliseconds=a):(h=Ne.exec(a))?(c="-"===h[1]?-1:1,g={y:0,d:u(h[ce])*c,h:u(h[de])*c,m:u(h[ee])*c,s:u(h[fe])*c,ms:u(yb(1e3*h[ge]))*c}):(h=Oe.exec(a))?(c="-"===h[1]?-1:1,g={y:Pb(h[2],c),M:Pb(h[3],c),w:Pb(h[4],c),d:Pb(h[5],c),h:Pb(h[6],c),m:Pb(h[7],c),s:Pb(h[8],c)}):null==g?g={}:"object"==typeof g&&("from"in g||"to"in g)&&(e=Rb(sb(g.from),sb(g.to)),g={},g.ms=e.milliseconds,g.M=e.months),d=new wb(g),xb(a)&&i(a,"_locale")&&(d._locale=a._locale),d}function Pb(a,b){
+// We'd normally use ~~inp for this, but unfortunately it also
+// converts floats to ints.
+// inp may be undefined, so careful calling replace on it.
+var c=a&&parseFloat(a.replace(",","."));
+// apply sign while we're at it
+return(isNaN(c)?0:c)*b}function Qb(a,b){var c={milliseconds:0,months:0};return c.months=b.month()-a.month()+12*(b.year()-a.year()),a.clone().add(c.months,"M").isAfter(b)&&--c.months,c.milliseconds=+b-+a.clone().add(c.months,"M"),c}function Rb(a,b){var c;return a.isValid()&&b.isValid()?(b=Bb(b,a),a.isBefore(b)?c=Qb(a,b):(c=Qb(b,a),c.milliseconds=-c.milliseconds,c.months=-c.months),c):{milliseconds:0,months:0}}
+// TODO: remove 'name' arg after deprecation is removed
+function Sb(a,b){return function(c,d){var e,f;
+//invert the arguments, but complain about it
+return null===d||isNaN(+d)||(y(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),f=c,c=d,d=f),c="string"==typeof c?+c:c,e=Ob(c,d),Tb(this,e,a),this}}function Tb(b,c,d,e){var f=c._milliseconds,g=yb(c._days),h=yb(c._months);b.isValid()&&(e=null==e||e,f&&b._d.setTime(b._d.valueOf()+f*d),g&&Q(b,"Date",P(b,"Date")+g*d),h&&ja(b,P(b,"Month")+h*d),e&&a.updateOffset(b,g||h))}function Ub(a,b){var c=a.diff(b,"days",!0);return c<-6?"sameElse":c<-1?"lastWeek":c<0?"lastDay":c<1?"sameDay":c<2?"nextDay":c<7?"nextWeek":"sameElse"}function Vb(b,c){
+// We want to compare the start of today, vs this.
+// Getting start-of-today depends on whether we're local/utc/offset or not.
+var d=b||sb(),e=Bb(d,this).startOf("day"),f=a.calendarFormat(this,e)||"sameElse",g=c&&(z(c[f])?c[f].call(this,d):c[f]);return this.format(g||this.localeData().calendar(f,this,sb(d)))}function Wb(){return new r(this)}function Xb(a,b){var c=s(a)?a:sb(a);return!(!this.isValid()||!c.isValid())&&(b=K(p(b)?"millisecond":b),"millisecond"===b?this.valueOf()>c.valueOf():c.valueOf()<this.clone().startOf(b).valueOf())}function Yb(a,b){var c=s(a)?a:sb(a);return!(!this.isValid()||!c.isValid())&&(b=K(p(b)?"millisecond":b),"millisecond"===b?this.valueOf()<c.valueOf():this.clone().endOf(b).valueOf()<c.valueOf())}function Zb(a,b,c,d){return d=d||"()",("("===d[0]?this.isAfter(a,c):!this.isBefore(a,c))&&(")"===d[1]?this.isBefore(b,c):!this.isAfter(b,c))}function $b(a,b){var c,d=s(a)?a:sb(a);return!(!this.isValid()||!d.isValid())&&(b=K(b||"millisecond"),"millisecond"===b?this.valueOf()===d.valueOf():(c=d.valueOf(),this.clone().startOf(b).valueOf()<=c&&c<=this.clone().endOf(b).valueOf()))}function _b(a,b){return this.isSame(a,b)||this.isAfter(a,b)}function ac(a,b){return this.isSame(a,b)||this.isBefore(a,b)}function bc(a,b,c){var d,e,f,g;// 1000
+// 1000 * 60
+// 1000 * 60 * 60
+// 1000 * 60 * 60 * 24, negate dst
+// 1000 * 60 * 60 * 24 * 7, negate dst
+return this.isValid()?(d=Bb(a,this),d.isValid()?(e=6e4*(d.utcOffset()-this.utcOffset()),b=K(b),"year"===b||"month"===b||"quarter"===b?(g=cc(this,d),"quarter"===b?g/=3:"year"===b&&(g/=12)):(f=this-d,g="second"===b?f/1e3:"minute"===b?f/6e4:"hour"===b?f/36e5:"day"===b?(f-e)/864e5:"week"===b?(f-e)/6048e5:f),c?g:t(g)):NaN):NaN}function cc(a,b){
+// difference in months
+var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),
+// b is in (anchor - 1 month, anchor + 1 month)
+f=a.clone().add(e,"months");
+//check for negative zero, return zero if negative zero
+// linear across the month
+// linear across the month
+return b-f<0?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)||0}function dc(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function ec(){var a=this.clone().utc();return 0<a.year()&&a.year()<=9999?z(Date.prototype.toISOString)?this.toDate().toISOString():X(a,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):X(a,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}/**
+ * Return a human readable representation of a moment that can
+ * also be evaluated to get a new moment which is the same
+ *
+ * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
+ */
+function fc(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var a="moment",b="";this.isLocal()||(a=0===this.utcOffset()?"moment.utc":"moment.parseZone",b="Z");var c="["+a+'("]',d=0<this.year()&&this.year()<=9999?"YYYY":"YYYYYY",e="-MM-DD[T]HH:mm:ss.SSS",f=b+'[")]';return this.format(c+d+e+f)}function gc(b){b||(b=this.isUtc()?a.defaultFormatUtc:a.defaultFormat);var c=X(this,b);return this.localeData().postformat(c)}function hc(a,b){return this.isValid()&&(s(a)&&a.isValid()||sb(a).isValid())?Ob({to:this,from:a}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function ic(a){return this.from(sb(),a)}function jc(a,b){return this.isValid()&&(s(a)&&a.isValid()||sb(a).isValid())?Ob({from:this,to:a}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function kc(a){return this.to(sb(),a)}
+// If passed a locale key, it will set the locale for this
+// instance. Otherwise, it will return the locale configuration
+// variables for this instance.
+function lc(a){var b;return void 0===a?this._locale._abbr:(b=bb(a),null!=b&&(this._locale=b),this)}function mc(){return this._locale}function nc(a){
+// the following switch intentionally omits break keywords
+// to utilize falling through the cases.
+switch(a=K(a)){case"year":this.month(0);/* falls through */
+case"quarter":case"month":this.date(1);/* falls through */
+case"week":case"isoWeek":case"day":case"date":this.hours(0);/* falls through */
+case"hour":this.minutes(0);/* falls through */
+case"minute":this.seconds(0);/* falls through */
+case"second":this.milliseconds(0)}
+// weeks are a special case
+// quarters are also special
+return"week"===a&&this.weekday(0),"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this}function oc(a){
+// 'date' is an alias for 'day', so it should be considered as such.
+return a=K(a),void 0===a||"millisecond"===a?this:("date"===a&&(a="day"),this.startOf(a).add(1,"isoWeek"===a?"week":a).subtract(1,"ms"))}function pc(){return this._d.valueOf()-6e4*(this._offset||0)}function qc(){return Math.floor(this.valueOf()/1e3)}function rc(){return new Date(this.valueOf())}function sc(){var a=this;return[a.year(),a.month(),a.date(),a.hour(),a.minute(),a.second(),a.millisecond()]}function tc(){var a=this;return{years:a.year(),months:a.month(),date:a.date(),hours:a.hours(),minutes:a.minutes(),seconds:a.seconds(),milliseconds:a.milliseconds()}}function uc(){
+// new Date(NaN).toJSON() === null
+return this.isValid()?this.toISOString():null}function vc(){return n(this)}function wc(){return j({},m(this))}function xc(){return m(this).overflow}function yc(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function zc(a,b){U(0,[a,a.length],0,b)}
+// MOMENTS
+function Ac(a){return Ec.call(this,a,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Bc(a){return Ec.call(this,a,this.isoWeek(),this.isoWeekday(),1,4)}function Cc(){return xa(this.year(),1,4)}function Dc(){var a=this.localeData()._week;return xa(this.year(),a.dow,a.doy)}function Ec(a,b,c,d,e){var f;return null==a?wa(this,d,e).year:(f=xa(a,d,e),b>f&&(b=f),Fc.call(this,a,b,c,d,e))}function Fc(a,b,c,d,e){var f=va(a,b,c,d,e),g=ta(f.year,0,f.dayOfYear);return this.year(g.getUTCFullYear()),this.month(g.getUTCMonth()),this.date(g.getUTCDate()),this}
+// MOMENTS
+function Gc(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)}
+// HELPERS
+// MOMENTS
+function Hc(a){var b=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")}function Ic(a,b){b[ge]=u(1e3*("0."+a))}
+// MOMENTS
+function Jc(){return this._isUTC?"UTC":""}function Kc(){return this._isUTC?"Coordinated Universal Time":""}function Lc(a){return sb(1e3*a)}function Mc(){return sb.apply(null,arguments).parseZone()}function Nc(a){return a}function Oc(a,b,c,d){var e=bb(),f=k().set(d,b);return e[c](f,a)}function Pc(a,b,c){if(f(a)&&(b=a,a=void 0),a=a||"",null!=b)return Oc(a,b,c,"month");var d,e=[];for(d=0;d<12;d++)e[d]=Oc(a,d,c,"month");return e}
+// ()
+// (5)
+// (fmt, 5)
+// (fmt)
+// (true)
+// (true, 5)
+// (true, fmt, 5)
+// (true, fmt)
+function Qc(a,b,c,d){"boolean"==typeof a?(f(b)&&(c=b,b=void 0),b=b||""):(b=a,c=b,a=!1,f(b)&&(c=b,b=void 0),b=b||"");var e=bb(),g=a?e._week.dow:0;if(null!=c)return Oc(b,(c+g)%7,d,"day");var h,i=[];for(h=0;h<7;h++)i[h]=Oc(b,(h+g)%7,d,"day");return i}function Rc(a,b){return Pc(a,b,"months")}function Sc(a,b){return Pc(a,b,"monthsShort")}function Tc(a,b,c){return Qc(a,b,c,"weekdays")}function Uc(a,b,c){return Qc(a,b,c,"weekdaysShort")}function Vc(a,b,c){return Qc(a,b,c,"weekdaysMin")}function Wc(){var a=this._data;return this._milliseconds=Ze(this._milliseconds),this._days=Ze(this._days),this._months=Ze(this._months),a.milliseconds=Ze(a.milliseconds),a.seconds=Ze(a.seconds),a.minutes=Ze(a.minutes),a.hours=Ze(a.hours),a.months=Ze(a.months),a.years=Ze(a.years),this}function Xc(a,b,c,d){var e=Ob(b,c);return a._milliseconds+=d*e._milliseconds,a._days+=d*e._days,a._months+=d*e._months,a._bubble()}
+// supports only 2.0-style add(1, 's') or add(duration)
+function Yc(a,b){return Xc(this,a,b,1)}
+// supports only 2.0-style subtract(1, 's') or subtract(duration)
+function Zc(a,b){return Xc(this,a,b,-1)}function $c(a){return a<0?Math.floor(a):Math.ceil(a)}function _c(){var a,b,c,d,e,f=this._milliseconds,g=this._days,h=this._months,i=this._data;
+// if we have a mix of positive and negative values, bubble down first
+// check: https://github.com/moment/moment/issues/2166
+// The following code bubbles up values, see the tests for
+// examples of what that means.
+// convert days to months
+// 12 months -> 1 year
+return f>=0&&g>=0&&h>=0||f<=0&&g<=0&&h<=0||(f+=864e5*$c(bd(h)+g),g=0,h=0),i.milliseconds=f%1e3,a=t(f/1e3),i.seconds=a%60,b=t(a/60),i.minutes=b%60,c=t(b/60),i.hours=c%24,g+=t(c/24),e=t(ad(g)),h+=e,g-=$c(bd(e)),d=t(h/12),h%=12,i.days=g,i.months=h,i.years=d,this}function ad(a){
+// 400 years have 146097 days (taking into account leap year rules)
+// 400 years have 12 months === 4800
+return 4800*a/146097}function bd(a){
+// the reverse of daysToMonths
+return 146097*a/4800}function cd(a){var b,c,d=this._milliseconds;if(a=K(a),"month"===a||"year"===a)return b=this._days+d/864e5,c=this._months+ad(b),"month"===a?c:c/12;switch(
+// handle milliseconds separately because of floating point math errors (issue #1867)
+b=this._days+Math.round(bd(this._months)),a){case"week":return b/7+d/6048e5;case"day":return b+d/864e5;case"hour":return 24*b+d/36e5;case"minute":return 1440*b+d/6e4;case"second":return 86400*b+d/1e3;
+// Math.floor prevents floating point math errors here
+case"millisecond":return Math.floor(864e5*b)+d;default:throw new Error("Unknown unit "+a)}}
+// TODO: Use this.as('ms')?
+function dd(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*u(this._months/12)}function ed(a){return function(){return this.as(a)}}function fd(a){return a=K(a),this[a+"s"]()}function gd(a){return function(){return this._data[a]}}function hd(){return t(this.days()/7)}
+// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
+function id(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function jd(a,b,c){var d=Ob(a).abs(),e=of(d.as("s")),f=of(d.as("m")),g=of(d.as("h")),h=of(d.as("d")),i=of(d.as("M")),j=of(d.as("y")),k=e<pf.s&&["s",e]||f<=1&&["m"]||f<pf.m&&["mm",f]||g<=1&&["h"]||g<pf.h&&["hh",g]||h<=1&&["d"]||h<pf.d&&["dd",h]||i<=1&&["M"]||i<pf.M&&["MM",i]||j<=1&&["y"]||["yy",j];return k[2]=b,k[3]=+a>0,k[4]=c,id.apply(null,k)}
+// This function allows you to set the rounding function for relative time strings
+function kd(a){return void 0===a?of:"function"==typeof a&&(of=a,!0)}
+// This function allows you to set a threshold for relative time strings
+function ld(a,b){return void 0!==pf[a]&&(void 0===b?pf[a]:(pf[a]=b,!0))}function md(a){var b=this.localeData(),c=jd(this,!a,b);return a&&(c=b.pastFuture(+this,c)),b.postformat(c)}function nd(){
+// for ISO strings we do not use the normal bubbling rules:
+// * milliseconds bubble up until they become hours
+// * days do not bubble at all
+// * months bubble up until they become years
+// This is because there is no context-free conversion between hours and days
+// (think of clock changes)
+// and also not between days and months (28-31 days per month)
+var a,b,c,d=qf(this._milliseconds)/1e3,e=qf(this._days),f=qf(this._months);
+// 3600 seconds -> 60 minutes -> 1 hour
+a=t(d/60),b=t(a/60),d%=60,a%=60,
+// 12 months -> 1 year
+c=t(f/12),f%=12;
+// inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
+var g=c,h=f,i=e,j=b,k=a,l=d,m=this.asSeconds();return m?(m<0?"-":"")+"P"+(g?g+"Y":"")+(h?h+"M":"")+(i?i+"D":"")+(j||k||l?"T":"")+(j?j+"H":"")+(k?k+"M":"")+(l?l+"S":""):"P0D"}var od,pd;pd=Array.prototype.some?Array.prototype.some:function(a){for(var b=Object(this),c=b.length>>>0,d=0;d<c;d++)if(d in b&&a.call(this,b[d],d,b))return!0;return!1};var qd=pd,rd=a.momentProperties=[],sd=!1,td={};a.suppressDeprecationWarnings=!1,a.deprecationHandler=null;var ud;ud=Object.keys?Object.keys:function(a){var b,c=[];for(b in a)i(a,b)&&c.push(b);return c};var vd,wd=ud,xd={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},yd={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},zd="Invalid date",Ad="%d",Bd=/\d{1,2}/,Cd={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},Dd={},Ed={},Fd=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,Gd=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Hd={},Id={},Jd=/\d/,Kd=/\d\d/,Ld=/\d{3}/,Md=/\d{4}/,Nd=/[+-]?\d{6}/,Od=/\d\d?/,Pd=/\d\d\d\d?/,Qd=/\d\d\d\d\d\d?/,Rd=/\d{1,3}/,Sd=/\d{1,4}/,Td=/[+-]?\d{1,6}/,Ud=/\d+/,Vd=/[+-]?\d+/,Wd=/Z|[+-]\d\d:?\d\d/gi,Xd=/Z|[+-]\d\d(?::?\d\d)?/gi,Yd=/[+-]?\d+(\.\d{1,3})?/,Zd=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,$d={},_d={},ae=0,be=1,ce=2,de=3,ee=4,fe=5,ge=6,he=7,ie=8;vd=Array.prototype.indexOf?Array.prototype.indexOf:function(a){
+// I know
+var b;for(b=0;b<this.length;++b)if(this[b]===a)return b;return-1};var je=vd;
+// FORMATTING
+U("M",["MM",2],"Mo",function(){return this.month()+1}),U("MMM",0,0,function(a){return this.localeData().monthsShort(this,a)}),U("MMMM",0,0,function(a){return this.localeData().months(this,a)}),
+// ALIASES
+J("month","M"),
+// PRIORITY
+M("month",8),
+// PARSING
+Z("M",Od),Z("MM",Od,Kd),Z("MMM",function(a,b){return b.monthsShortRegex(a)}),Z("MMMM",function(a,b){return b.monthsRegex(a)}),ba(["M","MM"],function(a,b){b[be]=u(a)-1}),ba(["MMM","MMMM"],function(a,b,c,d){var e=c._locale.monthsParse(a,d,c._strict);
+// if we didn't find a month name, mark the date as invalid.
+null!=e?b[be]=e:m(c).invalidMonth=a});
+// LOCALES
+var ke=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,le="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),me="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),ne=Zd,oe=Zd;
+// FORMATTING
+U("Y",0,0,function(){var a=this.year();return a<=9999?""+a:"+"+a}),U(0,["YY",2],0,function(){return this.year()%100}),U(0,["YYYY",4],0,"year"),U(0,["YYYYY",5],0,"year"),U(0,["YYYYYY",6,!0],0,"year"),
+// ALIASES
+J("year","y"),
+// PRIORITIES
+M("year",1),
+// PARSING
+Z("Y",Vd),Z("YY",Od,Kd),Z("YYYY",Sd,Md),Z("YYYYY",Td,Nd),Z("YYYYYY",Td,Nd),ba(["YYYYY","YYYYYY"],ae),ba("YYYY",function(b,c){c[ae]=2===b.length?a.parseTwoDigitYear(b):u(b)}),ba("YY",function(b,c){c[ae]=a.parseTwoDigitYear(b)}),ba("Y",function(a,b){b[ae]=parseInt(a,10)}),
+// HOOKS
+a.parseTwoDigitYear=function(a){return u(a)+(u(a)>68?1900:2e3)};
+// MOMENTS
+var pe=O("FullYear",!0);
+// FORMATTING
+U("w",["ww",2],"wo","week"),U("W",["WW",2],"Wo","isoWeek"),
+// ALIASES
+J("week","w"),J("isoWeek","W"),
+// PRIORITIES
+M("week",5),M("isoWeek",5),
+// PARSING
+Z("w",Od),Z("ww",Od,Kd),Z("W",Od),Z("WW",Od,Kd),ca(["w","ww","W","WW"],function(a,b,c,d){b[d.substr(0,1)]=u(a)});var qe={dow:0,// Sunday is the first day of the week.
+doy:6};
+// FORMATTING
+U("d",0,"do","day"),U("dd",0,0,function(a){return this.localeData().weekdaysMin(this,a)}),U("ddd",0,0,function(a){return this.localeData().weekdaysShort(this,a)}),U("dddd",0,0,function(a){return this.localeData().weekdays(this,a)}),U("e",0,0,"weekday"),U("E",0,0,"isoWeekday"),
+// ALIASES
+J("day","d"),J("weekday","e"),J("isoWeekday","E"),
+// PRIORITY
+M("day",11),M("weekday",11),M("isoWeekday",11),
+// PARSING
+Z("d",Od),Z("e",Od),Z("E",Od),Z("dd",function(a,b){return b.weekdaysMinRegex(a)}),Z("ddd",function(a,b){return b.weekdaysShortRegex(a)}),Z("dddd",function(a,b){return b.weekdaysRegex(a)}),ca(["dd","ddd","dddd"],function(a,b,c,d){var e=c._locale.weekdaysParse(a,d,c._strict);
+// if we didn't get a weekday name, mark the date as invalid
+null!=e?b.d=e:m(c).invalidWeekday=a}),ca(["d","e","E"],function(a,b,c,d){b[d]=u(a)});
+// LOCALES
+var re="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),se="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),te="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),ue=Zd,ve=Zd,we=Zd;U("H",["HH",2],0,"hour"),U("h",["hh",2],0,Ra),U("k",["kk",2],0,Sa),U("hmm",0,0,function(){return""+Ra.apply(this)+T(this.minutes(),2)}),U("hmmss",0,0,function(){return""+Ra.apply(this)+T(this.minutes(),2)+T(this.seconds(),2)}),U("Hmm",0,0,function(){return""+this.hours()+T(this.minutes(),2)}),U("Hmmss",0,0,function(){return""+this.hours()+T(this.minutes(),2)+T(this.seconds(),2)}),Ta("a",!0),Ta("A",!1),
+// ALIASES
+J("hour","h"),
+// PRIORITY
+M("hour",13),Z("a",Ua),Z("A",Ua),Z("H",Od),Z("h",Od),Z("HH",Od,Kd),Z("hh",Od,Kd),Z("hmm",Pd),Z("hmmss",Qd),Z("Hmm",Pd),Z("Hmmss",Qd),ba(["H","HH"],de),ba(["a","A"],function(a,b,c){c._isPm=c._locale.isPM(a),c._meridiem=a}),ba(["h","hh"],function(a,b,c){b[de]=u(a),m(c).bigHour=!0}),ba("hmm",function(a,b,c){var d=a.length-2;b[de]=u(a.substr(0,d)),b[ee]=u(a.substr(d)),m(c).bigHour=!0}),ba("hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[de]=u(a.substr(0,d)),b[ee]=u(a.substr(d,2)),b[fe]=u(a.substr(e)),m(c).bigHour=!0}),ba("Hmm",function(a,b,c){var d=a.length-2;b[de]=u(a.substr(0,d)),b[ee]=u(a.substr(d))}),ba("Hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[de]=u(a.substr(0,d)),b[ee]=u(a.substr(d,2)),b[fe]=u(a.substr(e))});var xe,ye=/[ap]\.?m?\.?/i,ze=O("Hours",!0),Ae={calendar:xd,longDateFormat:yd,invalidDate:zd,ordinal:Ad,ordinalParse:Bd,relativeTime:Cd,months:le,monthsShort:me,week:qe,weekdays:re,weekdaysMin:te,weekdaysShort:se,meridiemParse:ye},Be={},Ce={},De=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Ee=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Fe=/Z|[+-]\d\d(?::?\d\d)?/,Ge=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],
+// YYYYMM is NOT allowed by the standard
+["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],He=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Ie=/^\/?Date\((\-?\d+)/i;a.createFromInputFallback=x("value provided is not in a recognized ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),
+// constant that refers to the ISO standard
+a.ISO_8601=function(){};var Je=x("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var a=sb.apply(null,arguments);return this.isValid()&&a.isValid()?a<this?this:a:o()}),Ke=x("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var a=sb.apply(null,arguments);return this.isValid()&&a.isValid()?a>this?this:a:o()}),Le=function(){return Date.now?Date.now():+new Date};zb("Z",":"),zb("ZZ",""),
+// PARSING
+Z("Z",Xd),Z("ZZ",Xd),ba(["Z","ZZ"],function(a,b,c){c._useUTC=!0,c._tzm=Ab(Xd,a)});
+// HELPERS
+// timezone chunker
+// '+10:00' > ['10', '00']
+// '-1530' > ['-15', '30']
+var Me=/([\+\-]|\d\d)/gi;
+// HOOKS
+// This function will be called whenever a moment is mutated.
+// It is intended to keep the offset in sync with the timezone.
+a.updateOffset=function(){};
+// ASP.NET json date format regex
+var Ne=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,Oe=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;Ob.fn=wb.prototype;var Pe=Sb(1,"add"),Qe=Sb(-1,"subtract");a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",a.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Re=x("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(a){return void 0===a?this.localeData():this.locale(a)});
+// FORMATTING
+U(0,["gg",2],0,function(){return this.weekYear()%100}),U(0,["GG",2],0,function(){return this.isoWeekYear()%100}),zc("gggg","weekYear"),zc("ggggg","weekYear"),zc("GGGG","isoWeekYear"),zc("GGGGG","isoWeekYear"),
+// ALIASES
+J("weekYear","gg"),J("isoWeekYear","GG"),
+// PRIORITY
+M("weekYear",1),M("isoWeekYear",1),
+// PARSING
+Z("G",Vd),Z("g",Vd),Z("GG",Od,Kd),Z("gg",Od,Kd),Z("GGGG",Sd,Md),Z("gggg",Sd,Md),Z("GGGGG",Td,Nd),Z("ggggg",Td,Nd),ca(["gggg","ggggg","GGGG","GGGGG"],function(a,b,c,d){b[d.substr(0,2)]=u(a)}),ca(["gg","GG"],function(b,c,d,e){c[e]=a.parseTwoDigitYear(b)}),
+// FORMATTING
+U("Q",0,"Qo","quarter"),
+// ALIASES
+J("quarter","Q"),
+// PRIORITY
+M("quarter",7),
+// PARSING
+Z("Q",Jd),ba("Q",function(a,b){b[be]=3*(u(a)-1)}),
+// FORMATTING
+U("D",["DD",2],"Do","date"),
+// ALIASES
+J("date","D"),
+// PRIOROITY
+M("date",9),
+// PARSING
+Z("D",Od),Z("DD",Od,Kd),Z("Do",function(a,b){return a?b._ordinalParse:b._ordinalParseLenient}),ba(["D","DD"],ce),ba("Do",function(a,b){b[ce]=u(a.match(Od)[0],10)});
+// MOMENTS
+var Se=O("Date",!0);
+// FORMATTING
+U("DDD",["DDDD",3],"DDDo","dayOfYear"),
+// ALIASES
+J("dayOfYear","DDD"),
+// PRIORITY
+M("dayOfYear",4),
+// PARSING
+Z("DDD",Rd),Z("DDDD",Ld),ba(["DDD","DDDD"],function(a,b,c){c._dayOfYear=u(a)}),
+// FORMATTING
+U("m",["mm",2],0,"minute"),
+// ALIASES
+J("minute","m"),
+// PRIORITY
+M("minute",14),
+// PARSING
+Z("m",Od),Z("mm",Od,Kd),ba(["m","mm"],ee);
+// MOMENTS
+var Te=O("Minutes",!1);
+// FORMATTING
+U("s",["ss",2],0,"second"),
+// ALIASES
+J("second","s"),
+// PRIORITY
+M("second",15),
+// PARSING
+Z("s",Od),Z("ss",Od,Kd),ba(["s","ss"],fe);
+// MOMENTS
+var Ue=O("Seconds",!1);
+// FORMATTING
+U("S",0,0,function(){return~~(this.millisecond()/100)}),U(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),U(0,["SSS",3],0,"millisecond"),U(0,["SSSS",4],0,function(){return 10*this.millisecond()}),U(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),U(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),U(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),U(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),U(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),
+// ALIASES
+J("millisecond","ms"),
+// PRIORITY
+M("millisecond",16),
+// PARSING
+Z("S",Rd,Jd),Z("SS",Rd,Kd),Z("SSS",Rd,Ld);var Ve;for(Ve="SSSS";Ve.length<=9;Ve+="S")Z(Ve,Ud);for(Ve="S";Ve.length<=9;Ve+="S")ba(Ve,Ic);
+// MOMENTS
+var We=O("Milliseconds",!1);
+// FORMATTING
+U("z",0,0,"zoneAbbr"),U("zz",0,0,"zoneName");var Xe=r.prototype;Xe.add=Pe,Xe.calendar=Vb,Xe.clone=Wb,Xe.diff=bc,Xe.endOf=oc,Xe.format=gc,Xe.from=hc,Xe.fromNow=ic,Xe.to=jc,Xe.toNow=kc,Xe.get=R,Xe.invalidAt=xc,Xe.isAfter=Xb,Xe.isBefore=Yb,Xe.isBetween=Zb,Xe.isSame=$b,Xe.isSameOrAfter=_b,Xe.isSameOrBefore=ac,Xe.isValid=vc,Xe.lang=Re,Xe.locale=lc,Xe.localeData=mc,Xe.max=Ke,Xe.min=Je,Xe.parsingFlags=wc,Xe.set=S,Xe.startOf=nc,Xe.subtract=Qe,Xe.toArray=sc,Xe.toObject=tc,Xe.toDate=rc,Xe.toISOString=ec,Xe.inspect=fc,Xe.toJSON=uc,Xe.toString=dc,Xe.unix=qc,Xe.valueOf=pc,Xe.creationData=yc,
+// Year
+Xe.year=pe,Xe.isLeapYear=ra,
+// Week Year
+Xe.weekYear=Ac,Xe.isoWeekYear=Bc,
+// Quarter
+Xe.quarter=Xe.quarters=Gc,
+// Month
+Xe.month=ka,Xe.daysInMonth=la,
+// Week
+Xe.week=Xe.weeks=Ba,Xe.isoWeek=Xe.isoWeeks=Ca,Xe.weeksInYear=Dc,Xe.isoWeeksInYear=Cc,
+// Day
+Xe.date=Se,Xe.day=Xe.days=Ka,Xe.weekday=La,Xe.isoWeekday=Ma,Xe.dayOfYear=Hc,
+// Hour
+Xe.hour=Xe.hours=ze,
+// Minute
+Xe.minute=Xe.minutes=Te,
+// Second
+Xe.second=Xe.seconds=Ue,
+// Millisecond
+Xe.millisecond=Xe.milliseconds=We,
+// Offset
+Xe.utcOffset=Db,Xe.utc=Fb,Xe.local=Gb,Xe.parseZone=Hb,Xe.hasAlignedHourOffset=Ib,Xe.isDST=Jb,Xe.isLocal=Lb,Xe.isUtcOffset=Mb,Xe.isUtc=Nb,Xe.isUTC=Nb,
+// Timezone
+Xe.zoneAbbr=Jc,Xe.zoneName=Kc,
+// Deprecations
+Xe.dates=x("dates accessor is deprecated. Use date instead.",Se),Xe.months=x("months accessor is deprecated. Use month instead",ka),Xe.years=x("years accessor is deprecated. Use year instead",pe),Xe.zone=x("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",Eb),Xe.isDSTShifted=x("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Kb);var Ye=C.prototype;Ye.calendar=D,Ye.longDateFormat=E,Ye.invalidDate=F,Ye.ordinal=G,Ye.preparse=Nc,Ye.postformat=Nc,Ye.relativeTime=H,Ye.pastFuture=I,Ye.set=A,
+// Month
+Ye.months=fa,Ye.monthsShort=ga,Ye.monthsParse=ia,Ye.monthsRegex=na,Ye.monthsShortRegex=ma,
+// Week
+Ye.week=ya,Ye.firstDayOfYear=Aa,Ye.firstDayOfWeek=za,
+// Day of Week
+Ye.weekdays=Fa,Ye.weekdaysMin=Ha,Ye.weekdaysShort=Ga,Ye.weekdaysParse=Ja,Ye.weekdaysRegex=Na,Ye.weekdaysShortRegex=Oa,Ye.weekdaysMinRegex=Pa,
+// Hours
+Ye.isPM=Va,Ye.meridiem=Wa,$a("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===u(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),
+// Side effect imports
+a.lang=x("moment.lang is deprecated. Use moment.locale instead.",$a),a.langData=x("moment.langData is deprecated. Use moment.localeData instead.",bb);var Ze=Math.abs,$e=ed("ms"),_e=ed("s"),af=ed("m"),bf=ed("h"),cf=ed("d"),df=ed("w"),ef=ed("M"),ff=ed("y"),gf=gd("milliseconds"),hf=gd("seconds"),jf=gd("minutes"),kf=gd("hours"),lf=gd("days"),mf=gd("months"),nf=gd("years"),of=Math.round,pf={s:45,// seconds to minute
+m:45,// minutes to hour
+h:22,// hours to day
+d:26,// days to month
+M:11},qf=Math.abs,rf=wb.prototype;
+// Deprecations
+// Side effect imports
+// FORMATTING
+// PARSING
+// Side effect imports
+return rf.abs=Wc,rf.add=Yc,rf.subtract=Zc,rf.as=cd,rf.asMilliseconds=$e,rf.asSeconds=_e,rf.asMinutes=af,rf.asHours=bf,rf.asDays=cf,rf.asWeeks=df,rf.asMonths=ef,rf.asYears=ff,rf.valueOf=dd,rf._bubble=_c,rf.get=fd,rf.milliseconds=gf,rf.seconds=hf,rf.minutes=jf,rf.hours=kf,rf.days=lf,rf.weeks=hd,rf.months=mf,rf.years=nf,rf.humanize=md,rf.toISOString=nd,rf.toString=nd,rf.toJSON=nd,rf.locale=lc,rf.localeData=mc,rf.toIsoString=x("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",nd),rf.lang=Re,U("X",0,0,"unix"),U("x",0,0,"valueOf"),Z("x",Vd),Z("X",Yd),ba("X",function(a,b,c){c._d=new Date(1e3*parseFloat(a,10))}),ba("x",function(a,b,c){c._d=new Date(u(a))}),a.version="2.17.1",b(sb),a.fn=Xe,a.min=ub,a.max=vb,a.now=Le,a.utc=k,a.unix=Lc,a.months=Rc,a.isDate=g,a.locale=$a,a.invalid=o,a.duration=Ob,a.isMoment=s,a.weekdays=Tc,a.parseZone=Mc,a.localeData=bb,a.isDuration=xb,a.monthsShort=Sc,a.weekdaysMin=Vc,a.defineLocale=_a,a.updateLocale=ab,a.locales=cb,a.weekdaysShort=Uc,a.normalizeUnits=K,a.relativeTimeRounding=kd,a.relativeTimeThreshold=ld,a.calendarFormat=Ub,a.prototype=Xe,a}); \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/tests.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/tests.js
new file mode 100644
index 00000000000..0c98b2771a4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/min/tests.js
@@ -0,0 +1,72932 @@
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('af');
+
+test('parse', function (assert) {
+ var tests = 'Januarie Jan_Februarie Feb_Maart Mrt_April Apr_Mei Mei_Junie Jun_Julie Jul_Augustus Aug_September Sep_Oktober Okt_November Nov_Desember Des'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Sondag, Februarie 14de 2010, 3:25:50 nm'],
+ ['ddd, hA', 'Son, 3NM'],
+ ['M Mo MM MMMM MMM', '2 2de 02 Februarie Feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14de 14'],
+ ['d do dddd ddd dd', '0 0de Sondag Son So'],
+ ['DDD DDDo DDDD', '45 45ste 045'],
+ ['w wo ww', '6 6de 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'nm NM'],
+ ['[the] DDDo [day of the year]', 'the 45ste day of the year'],
+ ['LT', '15:25'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 Februarie 2010'],
+ ['LLL', '14 Februarie 2010 15:25'],
+ ['LLLL', 'Sondag, 14 Februarie 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 Feb 2010'],
+ ['lll', '14 Feb 2010 15:25'],
+ ['llll', 'Son, 14 Feb 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1ste', '1ste');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2de', '2de');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3de', '3de');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4de', '4de');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5de', '5de');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6de', '6de');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7de', '7de');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8ste', '8ste');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9de', '9de');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10de', '10de');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11de', '11de');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12de', '12de');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13de', '13de');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14de', '14de');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15de', '15de');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16de', '16de');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17de', '17de');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18de', '18de');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19de', '19de');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20ste', '20ste');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21ste', '21ste');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22ste', '22ste');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23ste', '23ste');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24ste', '24ste');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25ste', '25ste');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26ste', '26ste');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27ste', '27ste');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28ste', '28ste');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29ste', '29ste');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30ste', '30ste');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31ste', '31ste');
+});
+
+test('format month', function (assert) {
+ var expected = 'Januarie Jan_Februarie Feb_Maart Mrt_April Apr_Mei Mei_Junie Jun_Julie Jul_Augustus Aug_September Sep_Oktober Okt_November Nov_Desember Des'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Sondag Son So_Maandag Maa Ma_Dinsdag Din Di_Woensdag Woe Wo_Donderdag Don Do_Vrydag Vry Vr_Saterdag Sat Sa'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), '\'n paar sekondes', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), '\'n minuut', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), '\'n minuut', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minute', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minute', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), '\'n uur', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), '\'n uur', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 ure', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 ure', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 ure', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), '\'n dag', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), '\'n dag', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dae', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), '\'n dag', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dae', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dae', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), '\'n maand', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), '\'n maand', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), '\'n maand', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 maande', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 maande', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 maande', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), '\'n maand', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 maande', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), '\'n jaar', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 jaar', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), '\'n jaar', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 jaar', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'oor \'n paar sekondes', 'prefix');
+ assert.equal(moment(0).from(30000), '\'n paar sekondes gelede', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), '\'n paar sekondes gelede', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'oor \'n paar sekondes', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'oor 5 dae', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Vandag om 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Vandag om 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Vandag om 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Môre om 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Vandag om 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Gister om 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [om] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [om] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [om] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[Laas] dddd [om] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[Laas] dddd [om] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[Laas] dddd [om] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52ste', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1ste', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1ste', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2de', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2de', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('ar-dz');
+
+test('parse', function (assert) {
+ var tests = 'جانفي:جانفي_فيفري:فيفري_مارس:مارس_أفريل:أفريل_ماي:ماي_جوان:جوان_جويلية:جويلية_أوت:أوت_سبتمبر:سبتمبر_أكتوبر:أكتوبر_نوفمبر:نوفمبر_ديسمبر:ديسمبر'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(':');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'الأحد, فيفري 14 2010, 3:25:50 pm'],
+ ['ddd, hA', 'احد, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2 02 فيفري فيفري'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 الأحد احد أح'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '7 7 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45 day of the year'],
+ ['LT', '15:25'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 فيفري 2010'],
+ ['LLL', '14 فيفري 2010 15:25'],
+ ['LLLL', 'الأحد 14 فيفري 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 فيفري 2010'],
+ ['lll', '14 فيفري 2010 15:25'],
+ ['llll', 'احد 14 فيفري 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1', '1');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2', '2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3', '3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4', '4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5', '5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6', '6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7', '7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8', '8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9', '9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10', '10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11', '11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12', '12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13', '13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14', '14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15', '15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16', '16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17', '17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18', '18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19', '19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20', '20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21', '21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22', '22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23', '23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24', '24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25', '25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26', '26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27', '27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28', '28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29', '29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30', '30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31', '31');
+});
+
+test('format month', function (assert) {
+ var expected = 'جانفي جانفي_فيفري فيفري_مارس مارس_أفريل أفريل_ماي ماي_جوان جوان_جويلية جويلية_أوت أوت_سبتمبر سبتمبر_أكتوبر أكتوبر_نوفمبر نوفمبر_ديسمبر ديسمبر'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'الأحد احد أح_الإثنين اثنين إث_الثلاثاء ثلاثاء ثلا_الأربعاء اربعاء أر_الخميس خميس خم_الجمعة جمعة جم_السبت سبت سب'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'ثوان', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'دقيقة', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'دقيقة', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 دقائق', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 دقائق', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'ساعة', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'ساعة', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 ساعات', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 ساعات', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 ساعات', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'يوم', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'يوم', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 أيام', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'يوم', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 أيام', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 أيام', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'شهر', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'شهر', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'شهر', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 أشهر', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 أشهر', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 أشهر', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'شهر', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 أشهر', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'سنة', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 سنوات', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'سنة', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 سنوات', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'في ثوان', 'prefix');
+ assert.equal(moment(0).from(30000), 'منذ ثوان', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'منذ ثوان', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'في ثوان', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'في 5 أيام', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'اليوم على الساعة 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'اليوم على الساعة 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'اليوم على الساعة 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'غدا على الساعة 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'اليوم على الساعة 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'أمس على الساعة 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2016, 1, 4]).format('w ww wo'), '5 05 5', 'Feb 4 2016 should be week 5');
+ assert.equal(moment([2016, 0, 6]).format('w ww wo'), '1 01 1', 'Jan 6 2016 should be week 1');
+ assert.equal(moment([2016, 0, 7]).format('w ww wo'), '1 01 1', 'Jan 7 2016 should be week 1');
+ assert.equal(moment([2016, 0, 13]).format('w ww wo'), '2 02 2', 'Jan 13 2016 should be week 2');
+ assert.equal(moment([2016, 0, 14]).format('w ww wo'), '2 02 2', 'Jan 14 2016 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('ar-ly');
+
+var months = [
+ 'يناير',
+ 'فبراير',
+ 'مارس',
+ 'أبريل',
+ 'مايو',
+ 'يونيو',
+ 'يوليو',
+ 'أغسطس',
+ 'سبتمبر',
+ 'أكتوبر',
+ 'نوفمبر',
+ 'ديسمبر'
+];
+
+test('parse', function (assert) {
+ var tests = months, i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1) + ' instead is month ' + moment(input, mmm).month());
+ }
+ for (i = 0; i < 12; i++) {
+ equalTest(tests[i], 'MMM', i);
+ equalTest(tests[i], 'MMM', i);
+ equalTest(tests[i], 'MMMM', i);
+ equalTest(tests[i], 'MMMM', i);
+ equalTest(tests[i].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'الأحد، فبراير 14 2010، 3:25:50 م'],
+ ['ddd, hA', 'أحد، 3م'],
+ ['M Mo MM MMMM MMM', '2 2 02 فبراير فبراير'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 الأحد أحد ح'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '8 8 08'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'م م'],
+ ['[the] DDDo [day of the year]', 'the 45 day of the year'],
+ ['LT', '15:25'],
+ ['LTS', '15:25:50'],
+ ['L', '14/\u200f2/\u200f2010'],
+ ['LL', '14 فبراير 2010'],
+ ['LLL', '14 فبراير 2010 15:25'],
+ ['LLLL', 'الأحد 14 فبراير 2010 15:25'],
+ ['l', '14/\u200f2/\u200f2010'],
+ ['ll', '14 فبراير 2010'],
+ ['lll', '14 فبراير 2010 15:25'],
+ ['llll', 'أحد 14 فبراير 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1', '1');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2', '2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3', '3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4', '4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5', '5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6', '6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7', '7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8', '8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9', '9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10', '10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11', '11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12', '12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13', '13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14', '14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15', '15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16', '16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17', '17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18', '18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19', '19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20', '20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21', '21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22', '22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23', '23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24', '24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25', '25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26', '26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27', '27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28', '28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29', '29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30', '30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31', '31');
+});
+
+test('format month', function (assert) {
+ var expected = months, i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM'), expected[i], expected[i]);
+ assert.equal(moment([2011, i, 1]).format('MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'الأحد أحد ح_الإثنين إثنين ن_الثلاثاء ثلاثاء ث_الأربعاء أربعاء ر_الخميس خميس خ_الجمعة جمعة ج_السبت سبت س'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), '44 ثانية', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'دقيقة واحدة', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'دقيقة واحدة', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), 'دقيقتان', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 دقيقة', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'ساعة واحدة', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'ساعة واحدة', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), 'ساعتان', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 ساعات', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 ساعة', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'يوم واحد', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'يوم واحد', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), 'يومان', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'يوم واحد', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 أيام', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 يومًا', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'شهر واحد', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'شهر واحد', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'شهر واحد', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), 'شهران', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), 'شهران', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 أشهر', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'شهر واحد', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 أشهر', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'عام واحد', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), 'عامان', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'عام واحد', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 أعوام', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'بعد 30 ثانية', 'prefix');
+ assert.equal(moment(0).from(30000), 'منذ 30 ثانية', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'منذ ثانية واحدة', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'بعد 30 ثانية', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'بعد 5 أيام', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'اليوم عند الساعة 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'اليوم عند الساعة 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'اليوم عند الساعة 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'غدًا عند الساعة 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'اليوم عند الساعة 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'أمس عند الساعة 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [عند الساعة] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [عند الساعة] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [عند الساعة] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [عند الساعة] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [عند الساعة] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [عند الساعة] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting wednesday custom', function (assert) {
+ assert.equal(moment('2003 1 6', 'gggg w d').format('YYYY-MM-DD'), '2002-12-28', 'Week 1 of 2003 should be Dec 28 2002');
+ assert.equal(moment('2003 1 0', 'gggg w e').format('YYYY-MM-DD'), '2002-12-28', 'Week 1 of 2003 should be Dec 28 2002');
+ assert.equal(moment('2003 1 6', 'gggg w d').format('gggg w d'), '2003 1 6', 'Saturday of week 1 of 2003 parsed should be formatted as 2003 1 6');
+ assert.equal(moment('2003 1 0', 'gggg w e').format('gggg w e'), '2003 1 0', '1st day of week 1 of 2003 parsed should be formatted as 2003 1 0');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 31]).format('w ww wo'), '1 01 1', 'Dec 31 2011 should be week 1');
+ assert.equal(moment([2012, 0, 6]).format('w ww wo'), '1 01 1', 'Jan 6 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '2 02 2', 'Jan 7 2012 should be week 2');
+ assert.equal(moment([2012, 0, 13]).format('w ww wo'), '2 02 2', 'Jan 13 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '3 03 3', 'Jan 14 2012 should be week 3');
+});
+
+test('no leading zeros in long date formats', function (assert) {
+ var i, j, longDateStr, shortDateStr;
+ for (i = 1; i <= 9; ++i) {
+ for (j = 1; j <= 9; ++j) {
+ longDateStr = moment([2014, i, j]).format('L');
+ shortDateStr = moment([2014, i, j]).format('l');
+ assert.equal(longDateStr, shortDateStr, 'should not have leading zeros in month or day');
+ }
+ }
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('ar-ma');
+
+test('parse', function (assert) {
+ var tests = 'يناير:يناير_فبراير:فبراير_مارس:مارس_أبريل:أبريل_ماي:ماي_يونيو:يونيو_يوليوز:يوليوز_غشت:غشت_شتنبر:شتنبر_أكتوبر:أكتوبر_نونبر:نونبر_دجنبر:دجنبر'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(':');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'الأحد, فبراير 14 2010, 3:25:50 pm'],
+ ['ddd, hA', 'احد, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2 02 فبراير فبراير'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 الأحد احد ح'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '8 8 08'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45 day of the year'],
+ ['LT', '15:25'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 فبراير 2010'],
+ ['LLL', '14 فبراير 2010 15:25'],
+ ['LLLL', 'الأحد 14 فبراير 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 فبراير 2010'],
+ ['lll', '14 فبراير 2010 15:25'],
+ ['llll', 'احد 14 فبراير 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1', '1');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2', '2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3', '3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4', '4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5', '5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6', '6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7', '7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8', '8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9', '9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10', '10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11', '11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12', '12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13', '13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14', '14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15', '15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16', '16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17', '17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18', '18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19', '19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20', '20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21', '21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22', '22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23', '23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24', '24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25', '25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26', '26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27', '27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28', '28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29', '29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30', '30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31', '31');
+});
+
+test('format month', function (assert) {
+ var expected = 'يناير يناير_فبراير فبراير_مارس مارس_أبريل أبريل_ماي ماي_يونيو يونيو_يوليوز يوليوز_غشت غشت_شتنبر شتنبر_أكتوبر أكتوبر_نونبر نونبر_دجنبر دجنبر'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'الأحد احد ح_الإتنين اتنين ن_الثلاثاء ثلاثاء ث_الأربعاء اربعاء ر_الخميس خميس خ_الجمعة جمعة ج_السبت سبت س'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'ثوان', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'دقيقة', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'دقيقة', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 دقائق', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 دقائق', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'ساعة', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'ساعة', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 ساعات', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 ساعات', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 ساعات', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'يوم', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'يوم', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 أيام', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'يوم', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 أيام', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 أيام', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'شهر', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'شهر', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'شهر', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 أشهر', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 أشهر', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 أشهر', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'شهر', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 أشهر', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'سنة', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 سنوات', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'سنة', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 سنوات', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'في ثوان', 'prefix');
+ assert.equal(moment(0).from(30000), 'منذ ثوان', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'منذ ثوان', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'في ثوان', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'في 5 أيام', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'اليوم على الساعة 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'اليوم على الساعة 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'اليوم على الساعة 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'غدا على الساعة 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'اليوم على الساعة 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'أمس على الساعة 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 31]).format('w ww wo'), '1 01 1', 'Dec 31 2011 should be week 1');
+ assert.equal(moment([2012, 0, 6]).format('w ww wo'), '1 01 1', 'Jan 6 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '2 02 2', 'Jan 7 2012 should be week 2');
+ assert.equal(moment([2012, 0, 13]).format('w ww wo'), '2 02 2', 'Jan 13 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '3 03 3', 'Jan 14 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('ar-sa');
+
+test('parse', function (assert) {
+ var tests = 'يناير:يناير_فبراير:فبراير_مارس:مارس_أبريل:أبريل_مايو:مايو_يونيو:يونيو_يوليو:يوليو_أغسطس:أغسطس_سبتمبر:سبتمبر_أكتوبر:أكتوبر_نوفمبر:نوفمبر_ديسمبر:ديسمبر'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1) + ' instead is month ' + moment(input, mmm).month());
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(':');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'الأحد، فبراير ١٤ ٢٠١٠، ٣:٢٥:٥٠ م'],
+ ['ddd, hA', 'أحد، ٣م'],
+ ['M Mo MM MMMM MMM', '٢ ٢ ٠٢ فبراير فبراير'],
+ ['YYYY YY', '٢٠١٠ ١٠'],
+ ['D Do DD', '١٤ ١٤ ١٤'],
+ ['d do dddd ddd dd', '٠ ٠ الأحد أحد ح'],
+ ['DDD DDDo DDDD', '٤٥ ٤٥ ٠٤٥'],
+ ['w wo ww', '٨ ٨ ٠٨'],
+ ['h hh', '٣ ٠٣'],
+ ['H HH', '١٥ ١٥'],
+ ['m mm', '٢٥ ٢٥'],
+ ['s ss', '٥٠ ٥٠'],
+ ['a A', 'م م'],
+ ['[the] DDDo [day of the year]', 'the ٤٥ day of the year'],
+ ['LT', '١٥:٢٥'],
+ ['LTS', '١٥:٢٥:٥٠'],
+ ['L', '١٤/٠٢/٢٠١٠'],
+ ['LL', '١٤ فبراير ٢٠١٠'],
+ ['LLL', '١٤ فبراير ٢٠١٠ ١٥:٢٥'],
+ ['LLLL', 'الأحد ١٤ فبراير ٢٠١٠ ١٥:٢٥'],
+ ['l', '١٤/٢/٢٠١٠'],
+ ['ll', '١٤ فبراير ٢٠١٠'],
+ ['lll', '١٤ فبراير ٢٠١٠ ١٥:٢٥'],
+ ['llll', 'أحد ١٤ فبراير ٢٠١٠ ١٥:٢٥']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '١', '1');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '٢', '2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '٣', '3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '٤', '4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '٥', '5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '٦', '6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '٧', '7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '٨', '8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '٩', '9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '١٠', '10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '١١', '11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '١٢', '12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '١٣', '13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '١٤', '14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '١٥', '15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '١٦', '16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '١٧', '17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '١٨', '18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '١٩', '19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '٢٠', '20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '٢١', '21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '٢٢', '22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '٢٣', '23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '٢٤', '24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '٢٥', '25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '٢٦', '26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '٢٧', '27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '٢٨', '28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '٢٩', '29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '٣٠', '30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '٣١', '31');
+});
+
+test('format month', function (assert) {
+ var expected = 'يناير يناير_فبراير فبراير_مارس مارس_أبريل أبريل_مايو مايو_يونيو يونيو_يوليو يوليو_أغسطس أغسطس_سبتمبر سبتمبر_أكتوبر أكتوبر_نوفمبر نوفمبر_ديسمبر ديسمبر'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'الأحد أحد ح_الإثنين إثنين ن_الثلاثاء ثلاثاء ث_الأربعاء أربعاء ر_الخميس خميس خ_الجمعة جمعة ج_السبت سبت س'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'ثوان', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'دقيقة', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'دقيقة', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '٢ دقائق', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '٤٤ دقائق', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'ساعة', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'ساعة', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '٢ ساعات', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '٥ ساعات', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '٢١ ساعات', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'يوم', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'يوم', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '٢ أيام', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'يوم', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '٥ أيام', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '٢٥ أيام', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'شهر', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'شهر', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'شهر', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '٢ أشهر', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '٢ أشهر', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '٣ أشهر', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'شهر', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '٥ أشهر', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'سنة', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '٢ سنوات', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'سنة', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '٥ سنوات', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'في ثوان', 'prefix');
+ assert.equal(moment(0).from(30000), 'منذ ثوان', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'منذ ثوان', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'في ثوان', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'في ٥ أيام', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'اليوم على الساعة ١٢:٠٠', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'اليوم على الساعة ١٢:٢٥', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'اليوم على الساعة ١٣:٠٠', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'غدا على الساعة ١٢:٠٠', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'اليوم على الساعة ١١:٠٠', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'أمس على الساعة ١٢:٠٠', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting wednesday custom', function (assert) {
+ assert.equal(moment('2003 1 6', 'gggg w d').format('YYYY-MM-DD'), '٢٠٠٣-٠١-٠٤', '2003 1 6 : gggg w d');
+ assert.equal(moment('2003 1 0', 'gggg w e').format('YYYY-MM-DD'), '٢٠٠٢-١٢-٢٩', '2003 1 0 : gggg w e');
+ assert.equal(moment('2003 1 6', 'gggg w d').format('gggg w d'), '٢٠٠٣ ١ ٦', '2003 1 6 : gggg w d');
+ assert.equal(moment('2003 1 0', 'gggg w e').format('gggg w e'), '٢٠٠٣ ١ ٠', '2003 1 0 : gggg w e');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 31]).format('w ww wo'), '٥٣ ٥٣ ٥٣', '2011 11 31');
+ assert.equal(moment([2012, 0, 6]).format('w ww wo'), '١ ٠١ ١', '2012 0 6');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '١ ٠١ ١', '2012 0 7');
+ assert.equal(moment([2012, 0, 13]).format('w ww wo'), '٢ ٠٢ ٢', '2012 0 13');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '٢ ٠٢ ٢', '2012 0 14');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('ar-tn');
+
+test('parse', function (assert) {
+ var tests = 'جانفي:جانفي_فيفري:فيفري_مارس:مارس_أفريل:أفريل_ماي:ماي_جوان:جوان_جويلية:جويلية_أوت:أوت_سبتمبر:سبتمبر_أكتوبر:أكتوبر_نوفمبر:نوفمبر_ديسمبر:ديسمبر'.split('_'),
+ i;
+
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(':');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'الأحد, فيفري 14 2010, 3:25:50 pm'],
+ ['ddd, hA', 'أحد, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2 02 فيفري فيفري'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 الأحد أحد ح'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '6 6 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45 day of the year'],
+ ['LT', '15:25'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 فيفري 2010'],
+ ['LLL', '14 فيفري 2010 15:25'],
+ ['LLLL', 'الأحد 14 فيفري 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 فيفري 2010'],
+ ['lll', '14 فيفري 2010 15:25'],
+ ['llll', 'أحد 14 فيفري 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1', '1');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2', '2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3', '3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4', '4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5', '5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6', '6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7', '7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8', '8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9', '9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10', '10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11', '11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12', '12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13', '13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14', '14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15', '15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16', '16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17', '17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18', '18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19', '19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20', '20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21', '21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22', '22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23', '23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24', '24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25', '25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26', '26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27', '27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28', '28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29', '29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30', '30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31', '31');
+});
+
+test('format month', function (assert) {
+ var expected = 'جانفي جانفي_فيفري فيفري_مارس مارس_أفريل أفريل_ماي ماي_جوان جوان_جويلية جويلية_أوت أوت_سبتمبر سبتمبر_أكتوبر أكتوبر_نوفمبر نوفمبر_ديسمبر ديسمبر'.split('_'),
+ i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'الأحد أحد ح_الإثنين إثنين ن_الثلاثاء ثلاثاء ث_الأربعاء أربعاء ر_الخميس خميس خ_الجمعة جمعة ج_السبت سبت س'.split('_'),
+ i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ s: 44
+ }), true), 'ثوان', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ s: 45
+ }), true), 'دقيقة', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ s: 89
+ }), true), 'دقيقة', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ s: 90
+ }), true), '2 دقائق', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ m: 44
+ }), true), '44 دقائق', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ m: 45
+ }), true), 'ساعة', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ m: 89
+ }), true), 'ساعة', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ m: 90
+ }), true), '2 ساعات', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ h: 5
+ }), true), '5 ساعات', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ h: 21
+ }), true), '21 ساعات', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ h: 22
+ }), true), 'يوم', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ h: 35
+ }), true), 'يوم', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ h: 36
+ }), true), '2 أيام', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 1
+ }), true), 'يوم', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 5
+ }), true), '5 أيام', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 25
+ }), true), '25 أيام', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 26
+ }), true), 'شهر', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 30
+ }), true), 'شهر', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 43
+ }), true), 'شهر', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 46
+ }), true), '2 أشهر', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 74
+ }), true), '2 أشهر', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 76
+ }), true), '3 أشهر', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ M: 1
+ }), true), 'شهر', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ M: 5
+ }), true), '5 أشهر', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 345
+ }), true), 'سنة', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 548
+ }), true), '2 سنوات', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ y: 1
+ }), true), 'سنة', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ y: 5
+ }), true), '5 سنوات', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'في ثوان', 'prefix');
+ assert.equal(moment(0).from(30000), 'منذ ثوان', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'منذ ثوان', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({
+ s: 30
+ }).fromNow(), 'في ثوان', 'in a few seconds');
+ assert.equal(moment().add({
+ d: 5
+ }).fromNow(), 'في 5 أيام', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'اليوم على الساعة 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'اليوم على الساعة 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'اليوم على الساعة 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'غدا على الساعة 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'اليوم على الساعة 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'أمس على الساعة 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({
+ d: i
+ });
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({
+ d: i
+ });
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [على الساعة] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({
+ w: 1
+ }),
+ weeksFromNow = moment().add({
+ w: 1
+ });
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({
+ w: 2
+ });
+ weeksFromNow = moment().add({
+ w: 2
+ });
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('ar');
+
+var months = [
+ 'كانون الثاني يناير',
+ 'شباط فبراير',
+ 'آذار مارس',
+ 'نيسان أبريل',
+ 'أيار مايو',
+ 'حزيران يونيو',
+ 'تموز يوليو',
+ 'آب أغسطس',
+ 'أيلول سبتمبر',
+ 'تشرين الأول أكتوبر',
+ 'تشرين الثاني نوفمبر',
+ 'كانون الأول ديسمبر'
+];
+
+test('parse', function (assert) {
+ var tests = months, i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1) + ' instead is month ' + moment(input, mmm).month());
+ }
+ for (i = 0; i < 12; i++) {
+ equalTest(tests[i], 'MMM', i);
+ equalTest(tests[i], 'MMM', i);
+ equalTest(tests[i], 'MMMM', i);
+ equalTest(tests[i], 'MMMM', i);
+ equalTest(tests[i].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'الأحد، شباط فبراير ١٤ ٢٠١٠، ٣:٢٥:٥٠ م'],
+ ['ddd, hA', 'أحد، ٣م'],
+ ['M Mo MM MMMM MMM', '٢ ٢ ٠٢ شباط فبراير شباط فبراير'],
+ ['YYYY YY', '٢٠١٠ ١٠'],
+ ['D Do DD', '١٤ ١٤ ١٤'],
+ ['d do dddd ddd dd', '٠ ٠ الأحد أحد ح'],
+ ['DDD DDDo DDDD', '٤٥ ٤٥ ٠٤٥'],
+ ['w wo ww', '٨ ٨ ٠٨'],
+ ['h hh', '٣ ٠٣'],
+ ['H HH', '١٥ ١٥'],
+ ['m mm', '٢٥ ٢٥'],
+ ['s ss', '٥٠ ٥٠'],
+ ['a A', 'م م'],
+ ['[the] DDDo [day of the year]', 'the ٤٥ day of the year'],
+ ['LT', '١٥:٢٥'],
+ ['LTS', '١٥:٢٥:٥٠'],
+ ['L', '١٤/\u200f٢/\u200f٢٠١٠'],
+ ['LL', '١٤ شباط فبراير ٢٠١٠'],
+ ['LLL', '١٤ شباط فبراير ٢٠١٠ ١٥:٢٥'],
+ ['LLLL', 'الأحد ١٤ شباط فبراير ٢٠١٠ ١٥:٢٥'],
+ ['l', '١٤/\u200f٢/\u200f٢٠١٠'],
+ ['ll', '١٤ شباط فبراير ٢٠١٠'],
+ ['lll', '١٤ شباط فبراير ٢٠١٠ ١٥:٢٥'],
+ ['llll', 'أحد ١٤ شباط فبراير ٢٠١٠ ١٥:٢٥']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '١', '1');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '٢', '2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '٣', '3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '٤', '4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '٥', '5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '٦', '6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '٧', '7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '٨', '8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '٩', '9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '١٠', '10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '١١', '11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '١٢', '12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '١٣', '13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '١٤', '14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '١٥', '15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '١٦', '16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '١٧', '17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '١٨', '18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '١٩', '19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '٢٠', '20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '٢١', '21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '٢٢', '22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '٢٣', '23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '٢٤', '24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '٢٥', '25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '٢٦', '26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '٢٧', '27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '٢٨', '28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '٢٩', '29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '٣٠', '30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '٣١', '31');
+});
+
+test('format month', function (assert) {
+ var expected = months, i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM'), expected[i], expected[i]);
+ assert.equal(moment([2011, i, 1]).format('MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'الأحد أحد ح_الإثنين إثنين ن_الثلاثاء ثلاثاء ث_الأربعاء أربعاء ر_الخميس خميس خ_الجمعة جمعة ج_السبت سبت س'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), '٤٤ ثانية', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'دقيقة واحدة', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'دقيقة واحدة', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), 'دقيقتان', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '٤٤ دقيقة', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'ساعة واحدة', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'ساعة واحدة', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), 'ساعتان', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '٥ ساعات', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '٢١ ساعة', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'يوم واحد', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'يوم واحد', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), 'يومان', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'يوم واحد', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '٥ أيام', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '٢٥ يومًا', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'شهر واحد', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'شهر واحد', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'شهر واحد', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), 'شهران', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), 'شهران', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '٣ أشهر', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'شهر واحد', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '٥ أشهر', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'عام واحد', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), 'عامان', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'عام واحد', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '٥ أعوام', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'بعد ٣٠ ثانية', 'prefix');
+ assert.equal(moment(0).from(30000), 'منذ ٣٠ ثانية', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'منذ ثانية واحدة', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'بعد ٣٠ ثانية', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'بعد ٥ أيام', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'اليوم عند الساعة ١٢:٠٠', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'اليوم عند الساعة ١٢:٢٥', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'اليوم عند الساعة ١٣:٠٠', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'غدًا عند الساعة ١٢:٠٠', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'اليوم عند الساعة ١١:٠٠', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'أمس عند الساعة ١٢:٠٠', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [عند الساعة] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [عند الساعة] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [عند الساعة] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [عند الساعة] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [عند الساعة] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [عند الساعة] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting wednesday custom', function (assert) {
+ assert.equal(moment('2003 1 6', 'gggg w d').format('YYYY-MM-DD'), '٢٠٠٢-١٢-٢٨', 'Week 1 of 2003 should be Dec 28 2002');
+ assert.equal(moment('2003 1 0', 'gggg w e').format('YYYY-MM-DD'), '٢٠٠٢-١٢-٢٨', 'Week 1 of 2003 should be Dec 28 2002');
+ assert.equal(moment('2003 1 6', 'gggg w d').format('gggg w d'), '٢٠٠٣ ١ ٦', 'Saturday of week 1 of 2003 parsed should be formatted as 2003 1 6');
+ assert.equal(moment('2003 1 0', 'gggg w e').format('gggg w e'), '٢٠٠٣ ١ ٠', '1st day of week 1 of 2003 parsed should be formatted as 2003 1 0');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 31]).format('w ww wo'), '١ ٠١ ١', 'Dec 31 2011 should be week 1');
+ assert.equal(moment([2012, 0, 6]).format('w ww wo'), '١ ٠١ ١', 'Jan 6 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '٢ ٠٢ ٢', 'Jan 7 2012 should be week 2');
+ assert.equal(moment([2012, 0, 13]).format('w ww wo'), '٢ ٠٢ ٢', 'Jan 13 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '٣ ٠٣ ٣', 'Jan 14 2012 should be week 3');
+});
+
+test('no leading zeros in long date formats', function (assert) {
+ var i, j, longDateStr, shortDateStr;
+ for (i = 1; i <= 9; ++i) {
+ for (j = 1; j <= 9; ++j) {
+ longDateStr = moment([2014, i, j]).format('L');
+ shortDateStr = moment([2014, i, j]).format('l');
+ assert.equal(longDateStr, shortDateStr, 'should not have leading zeros in month or day');
+ }
+ }
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('az');
+
+test('parse', function (assert) {
+ var tests = 'yanvar yan_fevral fev_mart mar_Aprel apr_may may_iyun iyn_iyul iyl_Avqust avq_sentyabr sen_oktyabr okt_noyabr noy_dekabr dek'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, D MMMM YYYY, HH:mm:ss', 'Bazar, 14 fevral 2010, 15:25:50'],
+ ['ddd, A h', 'Baz, gündüz 3'],
+ ['M Mo MM MMMM MMM', '2 2-nci 02 fevral fev'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14-üncü 14'],
+ ['d do dddd ddd dd', '0 0-ıncı Bazar Baz Bz'],
+ ['DDD DDDo DDDD', '45 45-inci 045'],
+ ['w wo ww', '7 7-nci 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'gündüz gündüz'],
+ ['[ilin] DDDo [günü]', 'ilin 45-inci günü'],
+ ['LT', '15:25'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14 fevral 2010'],
+ ['LLL', '14 fevral 2010 15:25'],
+ ['LLLL', 'Bazar, 14 fevral 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14 fev 2010'],
+ ['lll', '14 fev 2010 15:25'],
+ ['llll', 'Baz, 14 fev 2010 15:25']
+ ],
+ DDDo = [
+ [359, '360-ıncı'],
+ [199, '200-üncü'],
+ [149, '150-nci']
+ ],
+ dt = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ DDDoDt,
+ i;
+
+ for (i = 0; i < a.length; i++) {
+ assert.equal(dt.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+ for (i = 0; i < DDDo.length; i++) {
+ DDDoDt = moment([2010]);
+ assert.equal(DDDoDt.add(DDDo[i][0], 'days').format('DDDo'), DDDo[i][1], DDDo[i][0] + ' ---> ' + DDDo[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1-inci', '1st');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2-nci', '2nd');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3-üncü', '3rd');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4-üncü', '4th');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5-inci', '5th');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6-ncı', '6th');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7-nci', '7th');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8-inci', '8th');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9-uncu', '9th');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10-uncu', '10th');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11-inci', '11th');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12-nci', '12th');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13-üncü', '13th');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14-üncü', '14th');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15-inci', '15th');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16-ncı', '16th');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17-nci', '17th');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18-inci', '18th');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19-uncu', '19th');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20-nci', '20th');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21-inci', '21th');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22-nci', '22th');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23-üncü', '23th');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24-üncü', '24th');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25-inci', '25th');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26-ncı', '26th');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27-nci', '27th');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28-inci', '28th');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29-uncu', '29th');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30-uncu', '30th');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31-inci', '31st');
+});
+
+test('format month', function (assert) {
+ var expected = 'yanvar yan_fevral fev_mart mar_aprel apr_may may_iyun iyn_iyul iyl_avqust avq_sentyabr sen_oktyabr okt_noyabr noy_dekabr dek'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Bazar Baz Bz_Bazar ertəsi BzE BE_Çərşənbə axşamı ÇAx ÇA_Çərşənbə Çər Çə_Cümə axşamı CAx CA_Cümə Cüm Cü_Şənbə Şən Şə'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'birneçə saniyyə', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'bir dəqiqə', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'bir dəqiqə', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 dəqiqə', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 dəqiqə', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'bir saat', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'bir saat', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 saat', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 saat', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 saat', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'bir gün', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'bir gün', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 gün', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'bir gün', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 gün', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 gün', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'bir ay', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'bir ay', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 ay', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 ay', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 ay', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'bir ay', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 ay', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'bir il', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 il', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'bir il', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 il', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'birneçə saniyyə sonra', 'prefix');
+ assert.equal(moment(0).from(30000), 'birneçə saniyyə əvvəl', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'birneçə saniyyə əvvəl', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'birneçə saniyyə sonra', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), '5 gün sonra', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'bugün saat 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'bugün saat 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'bugün saat 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'sabah saat 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'bugün saat 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'dünən 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('[gələn həftə] dddd [saat] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[gələn həftə] dddd [saat] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[gələn həftə] dddd [saat] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[keçən həftə] dddd [saat] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[keçən həftə] dddd [saat] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[keçən həftə] dddd [saat] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1-inci', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1-inci', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2-nci', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2-nci', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3-üncü', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('be');
+
+test('parse', function (assert) {
+ var tests = 'студзень студ_люты лют_сакавік сак_красавік крас_травень трав_чэрвень чэрв_ліпень ліп_жнівень жнів_верасень вер_кастрычнік каст_лістапад ліст_снежань снеж'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, HH:mm:ss', 'нядзеля, 14-га лютага 2010, 15:25:50'],
+ ['ddd, h A', 'нд, 3 дня'],
+ ['M Mo MM MMMM MMM', '2 2-і 02 люты лют'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14-га 14'],
+ ['d do dddd ddd dd', '0 0-ы нядзеля нд нд'],
+ ['DDD DDDo DDDD', '45 45-ы 045'],
+ ['w wo ww', '7 7-ы 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'дня дня'],
+ ['DDDo [дзень года]', '45-ы дзень года'],
+ ['LT', '15:25'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14 лютага 2010 г.'],
+ ['LLL', '14 лютага 2010 г., 15:25'],
+ ['LLLL', 'нядзеля, 14 лютага 2010 г., 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14 лют 2010 г.'],
+ ['lll', '14 лют 2010 г., 15:25'],
+ ['llll', 'нд, 14 лют 2010 г., 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format meridiem', function (assert) {
+ assert.equal(moment([2012, 11, 28, 0, 0]).format('A'), 'ночы', 'night');
+ assert.equal(moment([2012, 11, 28, 3, 59]).format('A'), 'ночы', 'night');
+ assert.equal(moment([2012, 11, 28, 4, 0]).format('A'), 'раніцы', 'morning');
+ assert.equal(moment([2012, 11, 28, 11, 59]).format('A'), 'раніцы', 'morning');
+ assert.equal(moment([2012, 11, 28, 12, 0]).format('A'), 'дня', 'afternoon');
+ assert.equal(moment([2012, 11, 28, 16, 59]).format('A'), 'дня', 'afternoon');
+ assert.equal(moment([2012, 11, 28, 17, 0]).format('A'), 'вечара', 'evening');
+ assert.equal(moment([2012, 11, 28, 23, 59]).format('A'), 'вечара', 'evening');
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1-ы', '1-ы');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2-і', '2-і');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3-і', '3-і');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4-ы', '4-ы');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5-ы', '5-ы');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6-ы', '6-ы');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7-ы', '7-ы');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8-ы', '8-ы');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9-ы', '9-ы');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10-ы', '10-ы');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11-ы', '11-ы');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12-ы', '12-ы');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13-ы', '13-ы');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14-ы', '14-ы');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15-ы', '15-ы');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16-ы', '16-ы');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17-ы', '17-ы');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18-ы', '18-ы');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19-ы', '19-ы');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20-ы', '20-ы');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21-ы', '21-ы');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22-і', '22-і');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23-і', '23-і');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24-ы', '24-ы');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25-ы', '25-ы');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26-ы', '26-ы');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27-ы', '27-ы');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28-ы', '28-ы');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29-ы', '29-ы');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30-ы', '30-ы');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31-ы', '31-ы');
+});
+
+test('format month', function (assert) {
+ var expected = 'студзень студ_люты лют_сакавік сак_красавік крас_травень трав_чэрвень чэрв_ліпень ліп_жнівень жнів_верасень вер_кастрычнік каст_лістапад ліст_снежань снеж'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format month case', function (assert) {
+ var months = {
+ 'nominative': 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_'),
+ 'accusative': 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_')
+ }, i;
+ for (i = 0; i < 12; i++) {
+ assert.equal(moment([2011, i, 1]).format('D MMMM'), '1 ' + months.accusative[i], '1 ' + months.accusative[i]);
+ assert.equal(moment([2011, i, 1]).format('MMMM'), months.nominative[i], '1 ' + months.nominative[i]);
+ }
+});
+
+test('format month case with escaped symbols', function (assert) {
+ var months = {
+ 'nominative': 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_'),
+ 'accusative': 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_')
+ }, i;
+ for (i = 0; i < 12; i++) {
+ assert.equal(moment([2013, i, 1]).format('D[] MMMM'), '1 ' + months.accusative[i], '1 ' + months.accusative[i]);
+ assert.equal(moment([2013, i, 1]).format('[<i>]D[</i>] [<b>]MMMM[</b>]'), '<i>1</i> <b>' + months.accusative[i] + '</b>', '1 <b>' + months.accusative[i] + '</b>');
+ assert.equal(moment([2013, i, 1]).format('D[-ы дзень] MMMM'), '1-ы дзень ' + months.accusative[i], '1-ы дзень ' + months.accusative[i]);
+ assert.equal(moment([2013, i, 1]).format('D, MMMM'), '1, ' + months.nominative[i], '1, ' + months.nominative[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'нядзеля нд нд_панядзелак пн пн_аўторак ат ат_серада ср ср_чацвер чц чц_пятніца пт пт_субота сб сб'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'некалькі секунд', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'хвіліна', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'хвіліна', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 хвіліны', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 31}), true), '31 хвіліна', '31 minutes = 31 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 хвіліны', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'гадзіна', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'гадзіна', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 гадзіны', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 гадзін', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 гадзіна', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'дзень', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'дзень', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 дні', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'дзень', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 дзён', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 11}), true), '11 дзён', '11 days = 11 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 21}), true), '21 дзень', '21 days = 21 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 дзён', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'месяц', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'месяц', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'месяц', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 месяцы', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 месяцы', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 месяцы', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'месяц', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 месяцаў', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'год', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 гады', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'год', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 гадоў', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'праз некалькі секунд', 'prefix');
+ assert.equal(moment(0).from(30000), 'некалькі секунд таму', 'suffix');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'праз некалькі секунд', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'праз 5 дзён', 'in 5 days');
+ assert.equal(moment().add({m: 31}).fromNow(), 'праз 31 хвіліну', 'in 31 minutes = in 31 minutes');
+ assert.equal(moment().subtract({m: 31}).fromNow(), '31 хвіліну таму', '31 minutes ago = 31 minutes ago');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Сёння ў 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Сёння ў 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Сёння ў 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Заўтра ў 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Сёння ў 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Учора ў 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ function makeFormat(d) {
+ return '[У] dddd [ў] LT';
+ }
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ function makeFormat(d) {
+ switch (d.day()) {
+ case 0:
+ case 3:
+ case 5:
+ case 6:
+ return '[У мінулую] dddd [ў] LT';
+ case 1:
+ case 2:
+ case 4:
+ return '[У мінулы] dddd [ў] LT';
+ }
+ }
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1-ы', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1-ы', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2-і', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2-і', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3-і', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('bg');
+
+test('parse', function (assert) {
+ var tests = 'януари янр_февруари фев_март мар_април апр_май май_юни юни_юли юли_август авг_септември сеп_октомври окт_ноември ное_декември дек'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, H:mm:ss', 'неделя, февруари 14-ти 2010, 15:25:50'],
+ ['ddd, hA', 'нед, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2-ри 02 февруари фев'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14-ти 14'],
+ ['d do dddd ddd dd', '0 0-ев неделя нед нд'],
+ ['DDD DDDo DDDD', '45 45-ти 045'],
+ ['w wo ww', '7 7-ми 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45-ти day of the year'],
+ ['LT', '15:25'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14 февруари 2010'],
+ ['LLL', '14 февруари 2010 15:25'],
+ ['LLLL', 'неделя, 14 февруари 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14 фев 2010'],
+ ['lll', '14 фев 2010 15:25'],
+ ['llll', 'нед, 14 фев 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1-ви', '1-ви');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2-ри', '2-ри');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3-ти', '3-ти');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4-ти', '4-ти');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5-ти', '5-ти');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6-ти', '6-ти');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7-ми', '7-ми');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8-ми', '8-ми');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9-ти', '9-ти');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10-ти', '10-ти');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11-ти', '11-ти');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12-ти', '12-ти');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13-ти', '13-ти');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14-ти', '14-ти');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15-ти', '15-ти');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16-ти', '16-ти');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17-ти', '17-ти');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18-ти', '18-ти');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19-ти', '19-ти');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20-ти', '20-ти');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21-ви', '21-ви');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22-ри', '22-ри');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23-ти', '23-ти');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24-ти', '24-ти');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25-ти', '25-ти');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26-ти', '26-ти');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27-ми', '27-ми');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28-ми', '28-ми');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29-ти', '29-ти');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30-ти', '30-ти');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31-ви', '31-ви');
+});
+
+test('format month', function (assert) {
+ var expected = 'януари янр_февруари фев_март мар_април апр_май май_юни юни_юли юли_август авг_септември сеп_октомври окт_ноември ное_декември дек'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'неделя нед нд_понеделник пон пн_вторник вто вт_сряда сря ср_четвъртък чет чт_петък пет пт_събота съб сб'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'няколко секунди', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'минута', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'минута', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 минути', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 минути', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'час', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'час', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 часа', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 часа', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 часа', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'ден', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'ден', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 дни', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'ден', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 дни', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 дни', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'месец', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'месец', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'месец', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 месеца', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 месеца', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 месеца', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'месец', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 месеца', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'година', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 години', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'година', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 години', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'след няколко секунди', 'prefix');
+ assert.equal(moment(0).from(30000), 'преди няколко секунди', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'преди няколко секунди', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'след няколко секунди', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'след 5 дни', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Днес в 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Днес в 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Днес в 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Утре в 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Днес в 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Вчера в 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [в] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [в] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [в] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ function makeFormat(d) {
+ switch (d.day()) {
+ case 0:
+ case 3:
+ case 6:
+ return '[В изминалата] dddd [в] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[В изминалия] dddd [в] LT';
+ }
+ }
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1-ви', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1-ви', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2-ри', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2-ри', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3-ти', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('bn');
+
+test('parse', function (assert) {
+ var tests = 'জানুয়ারী জানু_ফেব্রুয়ারি ফেব_মার্চ মার্চ_এপ্রিল এপ্র_মে মে_জুন জুন_জুলাই জুল_আগস্ট আগ_সেপ্টেম্বর সেপ্ট_অক্টোবর অক্টো_নভেম্বর নভে_ডিসেম্বর ডিসে'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, a h:mm:ss সময়', 'রবিবার, ১৪ ফেব্রুয়ারি ২০১০, দুপুর ৩:২৫:৫০ সময়'],
+ ['ddd, a h সময়', 'রবি, দুপুর ৩ সময়'],
+ ['M Mo MM MMMM MMM', '২ ২ ০২ ফেব্রুয়ারি ফেব'],
+ ['YYYY YY', '২০১০ ১০'],
+ ['D Do DD', '১৪ ১৪ ১৪'],
+ ['d do dddd ddd dd', '০ ০ রবিবার রবি রবি'],
+ ['DDD DDDo DDDD', '৪৫ ৪৫ ০৪৫'],
+ ['w wo ww', '৮ ৮ ০৮'],
+ ['h hh', '৩ ০৩'],
+ ['H HH', '১৫ ১৫'],
+ ['m mm', '২৫ ২৫'],
+ ['s ss', '৫০ ৫০'],
+ ['a A', 'দুপুর দুপুর'],
+ ['LT', 'দুপুর ৩:২৫ সময়'],
+ ['LTS', 'দুপুর ৩:২৫:৫০ সময়'],
+ ['L', '১৪/০২/২০১০'],
+ ['LL', '১৪ ফেব্রুয়ারি ২০১০'],
+ ['LLL', '১৪ ফেব্রুয়ারি ২০১০, দুপুর ৩:২৫ সময়'],
+ ['LLLL', 'রবিবার, ১৪ ফেব্রুয়ারি ২০১০, দুপুর ৩:২৫ সময়'],
+ ['l', '১৪/২/২০১০'],
+ ['ll', '১৪ ফেব ২০১০'],
+ ['lll', '১৪ ফেব ২০১০, দুপুর ৩:২৫ সময়'],
+ ['llll', 'রবি, ১৪ ফেব ২০১০, দুপুর ৩:২৫ সময়']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '১', '১');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '২', '২');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '৩', '৩');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '৪', '৪');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '৫', '৫');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '৬', '৬');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '৭', '৭');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '৮', '৮');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '৯', '৯');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '১০', '১০');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '১১', '১১');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '১২', '১২');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '১৩', '১৩');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '১৪', '১৪');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '১৫', '১৫');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '১৬', '১৬');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '১৭', '১৭');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '১৮', '১৮');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '১৯', '১৯');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '২০', '২০');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '২১', '২১');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '২২', '২২');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '২৩', '২৩');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '২৪', '২৪');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '২৫', '২৫');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '২৬', '২৬');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '২৭', '২৭');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '২৮', '२৮');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '২৯', '২৯');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '৩০', '৩০');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '৩১', '৩১');
+});
+
+test('format month', function (assert) {
+ var expected = 'জানুয়ারী জানু_ফেব্রুয়ারি ফেব_মার্চ মার্চ_এপ্রিল এপ্র_মে মে_জুন জুন_জুলাই জুল_আগস্ট আগ_সেপ্টেম্বর সেপ্ট_অক্টোবর অক্টো_নভেম্বর নভে_ডিসেম্বর ডিসে'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'রবিবার রবি রবি_সোমবার সোম সোম_মঙ্গলবার মঙ্গল মঙ্গ_বুধবার বুধ বুধ_বৃহস্পতিবার বৃহস্পতি বৃহঃ_শুক্রবার শুক্র শুক্র_শনিবার শনি শনি'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'কয়েক সেকেন্ড', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'এক মিনিট', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'এক মিনিট', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '২ মিনিট', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '৪৪ মিনিট', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'এক ঘন্টা', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'এক ঘন্টা', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '২ ঘন্টা', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '৫ ঘন্টা', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '২১ ঘন্টা', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'এক দিন', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'এক দিন', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '২ দিন', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'এক দিন', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '৫ দিন', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '২৫ দিন', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'এক মাস', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'এক মাস', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '২ মাস', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '২ মাস', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '৩ মাস', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'এক মাস', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '৫ মাস', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'এক বছর', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '২ বছর', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'এক বছর', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '৫ বছর', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'কয়েক সেকেন্ড পরে', 'prefix');
+ assert.equal(moment(0).from(30000), 'কয়েক সেকেন্ড আগে', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'কয়েক সেকেন্ড আগে', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'কয়েক সেকেন্ড পরে', 'কয়েক সেকেন্ড পরে');
+ assert.equal(moment().add({d: 5}).fromNow(), '৫ দিন পরে', '৫ দিন পরে');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'আজ দুপুর ১২:০০ সময়', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'আজ দুপুর ১২:২৫ সময়', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 3}).calendar(), 'আজ দুপুর ৩:০০ সময়', 'Now plus 3 hours');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'আগামীকাল দুপুর ১২:০০ সময়', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'আজ দুপুর ১১:০০ সময়', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'গতকাল দুপুর ১২:০০ সময়', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd[,] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd[,] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd[,] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[গত] dddd[,] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[গত] dddd[,] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[গত] dddd[,] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('meridiem', function (assert) {
+ assert.equal(moment([2011, 2, 23, 2, 30]).format('a'), 'রাত', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 9, 30]).format('a'), 'সকাল', 'morning');
+ assert.equal(moment([2011, 2, 23, 14, 30]).format('a'), 'দুপুর', 'during day');
+ assert.equal(moment([2011, 2, 23, 17, 30]).format('a'), 'বিকাল', 'evening');
+ assert.equal(moment([2011, 2, 23, 19, 30]).format('a'), 'বিকাল', 'late evening');
+ assert.equal(moment([2011, 2, 23, 21, 20]).format('a'), 'রাত', 'night');
+
+ assert.equal(moment([2011, 2, 23, 2, 30]).format('A'), 'রাত', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 9, 30]).format('A'), 'সকাল', 'morning');
+ assert.equal(moment([2011, 2, 23, 14, 30]).format('A'), 'দুপুর', ' during day');
+ assert.equal(moment([2011, 2, 23, 17, 30]).format('A'), 'বিকাল', 'evening');
+ assert.equal(moment([2011, 2, 23, 19, 30]).format('A'), 'বিকাল', 'late evening');
+ assert.equal(moment([2011, 2, 23, 21, 20]).format('A'), 'রাত', 'night');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '১ ০১ ১', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '১ ০১ ১', 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '২ ০২ ২', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '২ ০২ ২', 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '৩ ০৩ ৩', 'Jan 15 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('bo');
+
+test('parse', function (assert) {
+ var tests = 'ཟླ་བ་དང་པོ ཟླ་བ་དང་པོ._ཟླ་བ་གཉིས་པ ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, a h:mm:ss ལ་', 'གཟའ་ཉི་མ་, ༡༤ ཟླ་བ་གཉིས་པ ༢༠༡༠, ཉིན་གུང ༣:༢༥:༥༠ ལ་'],
+ ['ddd, a h ལ་', 'ཉི་མ་, ཉིན་གུང ༣ ལ་'],
+ ['M Mo MM MMMM MMM', '༢ ༢ ༠༢ ཟླ་བ་གཉིས་པ ཟླ་བ་གཉིས་པ'],
+ ['YYYY YY', '༢༠༡༠ ༡༠'],
+ ['D Do DD', '༡༤ ༡༤ ༡༤'],
+ ['d do dddd ddd dd', '༠ ༠ གཟའ་ཉི་མ་ ཉི་མ་ ཉི་མ་'],
+ ['DDD DDDo DDDD', '༤༥ ༤༥ ༠༤༥'],
+ ['w wo ww', '༨ ༨ ༠༨'],
+ ['h hh', '༣ ༠༣'],
+ ['H HH', '༡༥ ༡༥'],
+ ['m mm', '༢༥ ༢༥'],
+ ['s ss', '༥༠ ༥༠'],
+ ['a A', 'ཉིན་གུང ཉིན་གུང'],
+ ['LT', 'ཉིན་གུང ༣:༢༥'],
+ ['LTS', 'ཉིན་གུང ༣:༢༥:༥༠'],
+ ['L', '༡༤/༠༢/༢༠༡༠'],
+ ['LL', '༡༤ ཟླ་བ་གཉིས་པ ༢༠༡༠'],
+ ['LLL', '༡༤ ཟླ་བ་གཉིས་པ ༢༠༡༠, ཉིན་གུང ༣:༢༥'],
+ ['LLLL', 'གཟའ་ཉི་མ་, ༡༤ ཟླ་བ་གཉིས་པ ༢༠༡༠, ཉིན་གུང ༣:༢༥'],
+ ['l', '༡༤/༢/༢༠༡༠'],
+ ['ll', '༡༤ ཟླ་བ་གཉིས་པ ༢༠༡༠'],
+ ['lll', '༡༤ ཟླ་བ་གཉིས་པ ༢༠༡༠, ཉིན་གུང ༣:༢༥'],
+ ['llll', 'ཉི་མ་, ༡༤ ཟླ་བ་གཉིས་པ ༢༠༡༠, ཉིན་གུང ༣:༢༥']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '༡', '༡');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '༢', '༢');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '༣', '༣');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '༤', '༤');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '༥', '༥');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '༦', '༦');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '༧', '༧');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '༨', '༨');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '༩', '༩');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '༡༠', '༡༠');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '༡༡', '༡༡');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '༡༢', '༡༢');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '༡༣', '༡༣');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '༡༤', '༡༤');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '༡༥', '༡༥');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '༡༦', '༡༦');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '༡༧', '༡༧');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '༡༨', '༡༨');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '༡༩', '༡༩');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '༢༠', '༢༠');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '༢༡', '༢༡');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '༢༢', '༢༢');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '༢༣', '༢༣');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '༢༤', '༢༤');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '༢༥', '༢༥');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '༢༦', '༢༦');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '༢༧', '༢༧');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '༢༨', '༢༨');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '༢༩', '༢༩');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '༣༠', '༣༠');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '༣༡', '༣༡');
+});
+
+test('format month', function (assert) {
+ var expected = 'ཟླ་བ་དང་པོ ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'གཟའ་ཉི་མ་ ཉི་མ་ ཉི་མ་_གཟའ་ཟླ་བ་ ཟླ་བ་ ཟླ་བ་_གཟའ་མིག་དམར་ མིག་དམར་ མིག་དམར་_གཟའ་ལྷག་པ་ ལྷག་པ་ ལྷག་པ་_གཟའ་ཕུར་བུ ཕུར་བུ ཕུར་བུ_གཟའ་པ་སངས་ པ་སངས་ པ་སངས་_གཟའ་སྤེན་པ་ སྤེན་པ་ སྤེན་པ་'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'ལམ་སང', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'སྐར་མ་གཅིག', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'སྐར་མ་གཅིག', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '༢ སྐར་མ', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '༤༤ སྐར་མ', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'ཆུ་ཚོད་གཅིག', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'ཆུ་ཚོད་གཅིག', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '༢ ཆུ་ཚོད', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '༥ ཆུ་ཚོད', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '༢༡ ཆུ་ཚོད', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'ཉིན་གཅིག', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'ཉིན་གཅིག', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '༢ ཉིན་', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'ཉིན་གཅིག', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '༥ ཉིན་', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '༢༥ ཉིན་', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'ཟླ་བ་གཅིག', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'ཟླ་བ་གཅིག', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'ཟླ་བ་གཅིག', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '༢ ཟླ་བ', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '༢ ཟླ་བ', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '༣ ཟླ་བ', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'ཟླ་བ་གཅིག', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '༥ ཟླ་བ', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'ལོ་གཅིག', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '༢ ལོ', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'ལོ་གཅིག', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '༥ ལོ', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'ལམ་སང ལ་', 'prefix');
+ assert.equal(moment(0).from(30000), 'ལམ་སང སྔན་ལ', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'ལམ་སང སྔན་ལ', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'ལམ་སང ལ་', 'ལམ་སང ལ་');
+ assert.equal(moment().add({d: 5}).fromNow(), '༥ ཉིན་ ལ་', '༥ ཉིན་ ལ་');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'དི་རིང ཉིན་གུང ༡༢:༠༠', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'དི་རིང ཉིན་གུང ༡༢:༢༥', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 3}).calendar(), 'དི་རིང ཉིན་གུང ༣:༠༠', 'Now plus 3 hours');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'སང་ཉིན ཉིན་གུང ༡༢:༠༠', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'དི་རིང ཉིན་གུང ༡༡:༠༠', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'ཁ་སང ཉིན་གུང ༡༢:༠༠', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('[བདུན་ཕྲག་རྗེས་མ][,] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[བདུན་ཕྲག་རྗེས་མ][,] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[བདུན་ཕྲག་རྗེས་མ][,] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[བདུན་ཕྲག་མཐའ་མ] dddd[,] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[བདུན་ཕྲག་མཐའ་མ] dddd[,] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[བདུན་ཕྲག་མཐའ་མ] dddd[,] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('meridiem', function (assert) {
+ assert.equal(moment([2011, 2, 23, 2, 30]).format('a'), 'མཚན་མོ', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 9, 30]).format('a'), 'ཞོགས་ཀས', 'morning');
+ assert.equal(moment([2011, 2, 23, 14, 30]).format('a'), 'ཉིན་གུང', 'during day');
+ assert.equal(moment([2011, 2, 23, 17, 30]).format('a'), 'དགོང་དག', 'evening');
+ assert.equal(moment([2011, 2, 23, 19, 30]).format('a'), 'དགོང་དག', 'late evening');
+ assert.equal(moment([2011, 2, 23, 21, 20]).format('a'), 'མཚན་མོ', 'night');
+
+ assert.equal(moment([2011, 2, 23, 2, 30]).format('A'), 'མཚན་མོ', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 9, 30]).format('A'), 'ཞོགས་ཀས', 'morning');
+ assert.equal(moment([2011, 2, 23, 14, 30]).format('A'), 'ཉིན་གུང', ' during day');
+ assert.equal(moment([2011, 2, 23, 17, 30]).format('A'), 'དགོང་དག', 'evening');
+ assert.equal(moment([2011, 2, 23, 19, 30]).format('A'), 'དགོང་དག', 'late evening');
+ assert.equal(moment([2011, 2, 23, 21, 20]).format('A'), 'མཚན་མོ', 'night');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '༡ ༠༡ ༡', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '༡ ༠༡ ༡', 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '༢ ༠༢ ༢', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '༢ ༠༢ ༢', 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '༣ ༠༣ ༣', 'Jan 15 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('br');
+
+test('parse', function (assert) {
+ var tests = 'Genver Gen_C\'hwevrer C\'hwe_Meurzh Meu_Ebrel Ebr_Mae Mae_Mezheven Eve_Gouere Gou_Eost Eos_Gwengolo Gwe_Here Her_Du Du_Kerzu Ker'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ moment.locale('br');
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Sul, C\'hwevrer 14vet 2010, 3:25:50 pm'],
+ ['ddd, h A', 'Sul, 3 PM'],
+ ['M Mo MM MMMM MMM', '2 2vet 02 C\'hwevrer C\'hwe'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14vet 14'],
+ ['d do dddd ddd dd', '0 0vet Sul Sul Su'],
+ ['DDD DDDo DDDD', '45 45vet 045'],
+ ['w wo ww', '6 6vet 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['DDDo [devezh] [ar] [vloaz]', '45vet devezh ar vloaz'],
+ ['L', '14/02/2010'],
+ ['LL', '14 a viz C\'hwevrer 2010'],
+ ['LLL', '14 a viz C\'hwevrer 2010 3e25 PM'],
+ ['LLLL', 'Sul, 14 a viz C\'hwevrer 2010 3e25 PM']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ moment.locale('br');
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1añ', '1añ');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2vet', '2vet');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3vet', '3vet');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4vet', '4vet');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5vet', '5vet');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6vet', '6vet');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7vet', '7vet');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8vet', '8vet');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9vet', '9vet');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10vet', '10vet');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11vet', '11vet');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12vet', '12vet');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13vet', '13vet');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14vet', '14vet');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15vet', '15vet');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16vet', '16vet');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17vet', '17vet');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18vet', '18vet');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19vet', '19vet');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20vet', '20vet');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21vet', '21vet');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22vet', '22vet');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23vet', '23vet');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24vet', '24vet');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25vet', '25vet');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26vet', '26vet');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27vet', '27vet');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28vet', '28vet');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29vet', '29vet');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30vet', '30vet');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31vet', '31vet');
+});
+
+test('format month', function (assert) {
+ moment.locale('br');
+ var expected = 'Genver Gen_C\'hwevrer C\'hwe_Meurzh Meu_Ebrel Ebr_Mae Mae_Mezheven Eve_Gouere Gou_Eost Eos_Gwengolo Gwe_Here Her_Du Du_Kerzu Ker'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ moment.locale('br');
+ var expected = 'Sul Sul Su_Lun Lun Lu_Meurzh Meu Me_Merc\'her Mer Mer_Yaou Yao Ya_Gwener Gwe Gw_Sadorn Sad Sa'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ moment.locale('br');
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'un nebeud segondennoù', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'ur vunutenn', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'ur vunutenn', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 vunutenn', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 munutenn', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'un eur', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'un eur', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 eur', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 eur', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 eur', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'un devezh', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'un devezh', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 zevezh', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'un devezh', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 devezh', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 devezh', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'ur miz', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'ur miz', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'ur miz', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 viz', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 viz', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 miz', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'ur miz', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 miz', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'ur bloaz', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 vloaz', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'ur bloaz', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 bloaz', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ moment.locale('br');
+ assert.equal(moment(30000).from(0), 'a-benn un nebeud segondennoù', 'prefix');
+ assert.equal(moment(0).from(30000), 'un nebeud segondennoù \'zo', 'suffix');
+});
+
+test('now from now', function (assert) {
+ moment.locale('br');
+ assert.equal(moment().fromNow(), 'un nebeud segondennoù \'zo', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ moment.locale('br');
+ assert.equal(moment().add({s: 30}).fromNow(), 'a-benn un nebeud segondennoù', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'a-benn 5 devezh', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ moment.locale('br');
+
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Hiziv da 12e00 PM', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Hiziv da 12e25 PM', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Hiziv da 1e00 PM', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Warc\'hoazh da 12e00 PM', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Hiziv da 11e00 AM', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Dec\'h da 12e00 PM', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ moment.locale('br');
+
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [da] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [da] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [da] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ moment.locale('br');
+
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [paset da] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [paset da] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [paset da] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ moment.locale('br');
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('special mutations for years', function (assert) {
+ moment.locale('br');
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'ur bloaz', 'mutation 1 year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 2}), true), '2 vloaz', 'mutation 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 3}), true), '3 bloaz', 'mutation 3 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 4}), true), '4 bloaz', 'mutation 4 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 bloaz', 'mutation 5 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 9}), true), '9 bloaz', 'mutation 9 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 10}), true), '10 vloaz', 'mutation 10 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 21}), true), '21 bloaz', 'mutation 21 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 22}), true), '22 vloaz', 'mutation 22 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 133}), true), '133 bloaz', 'mutation 133 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 148}), true), '148 vloaz', 'mutation 148 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 261}), true), '261 bloaz', 'mutation 261 years');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('bs');
+
+test('parse', function (assert) {
+ var tests = 'januar jan._februar feb._mart mar._april apr._maj maj._juni jun._juli jul._august aug._septembar sep._oktobar okt._novembar nov._decembar dec.'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1) + ' inp ' + mmm);
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, h:mm:ss a', 'nedjelja, 14. februar 2010, 3:25:50 pm'],
+ ['ddd, hA', 'ned., 3PM'],
+ ['M Mo MM MMMM MMM', '2 2. 02 februar feb.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. nedjelja ned. ne'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '7 7. 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45. day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14. februar 2010'],
+ ['LLL', '14. februar 2010 15:25'],
+ ['LLLL', 'nedjelja, 14. februar 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14. feb. 2010'],
+ ['lll', '14. feb. 2010 15:25'],
+ ['llll', 'ned., 14. feb. 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'januar jan._februar feb._mart mar._april apr._maj maj._juni jun._juli jul._august aug._septembar sep._oktobar okt._novembar nov._decembar dec.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'nedjelja ned. ne_ponedjeljak pon. po_utorak uto. ut_srijeda sri. sr_četvrtak čet. če_petak pet. pe_subota sub. su'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'par sekundi', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'jedna minuta', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'jedna minuta', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minute', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minuta', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'jedan sat', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'jedan sat', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 sata', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 sati', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 sati', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'dan', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'dan', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dana', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'dan', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dana', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dana', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'mjesec', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'mjesec', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'mjesec', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 mjeseca', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 mjeseca', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 mjeseca', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'mjesec', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 mjeseci', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'godinu', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 godine', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'godinu', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 godina', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'za par sekundi', 'prefix');
+ assert.equal(moment(0).from(30000), 'prije par sekundi', 'prefix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'prije par sekundi', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'za par sekundi', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'za 5 dana', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'danas u 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'danas u 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'danas u 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'sutra u 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'danas u 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'jučer u 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ function makeFormat(d) {
+ switch (d.day()) {
+ case 0:
+ return '[u] [nedjelju] [u] LT';
+ case 3:
+ return '[u] [srijedu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ }
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ function makeFormat(d) {
+ switch (d.day()) {
+ case 0:
+ case 3:
+ return '[prošlu] dddd [u] LT';
+ case 6:
+ return '[prošle] [subote] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[prošli] dddd [u] LT';
+ }
+ }
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1.', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1.', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2.', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2.', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3.', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('ca');
+
+test('parse', function (assert) {
+ var tests = 'gener gen._febrer febr._març mar._abril abr._maig mai._juny jun._juliol jul._agost ag._setembre set._octubre oct._novembre nov._desembre des.'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, h:mm:ss a', 'diumenge, 14è febrer 2010, 3:25:50 pm'],
+ ['ddd, hA', 'dg., 3PM'],
+ ['M Mo MM MMMM MMM', '2 2n 02 febrer febr.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14è 14'],
+ ['d do dddd ddd dd', '0 0è diumenge dg. Dg'],
+ ['DDD DDDo DDDD', '45 45è 045'],
+ ['w wo ww', '6 6a 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45è day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 febrer 2010'],
+ ['LLL', '14 febrer 2010 15:25'],
+ ['LLLL', 'diumenge 14 febrer 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 febr. 2010'],
+ ['lll', '14 febr. 2010 15:25'],
+ ['llll', 'dg. 14 febr. 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1r', '1r');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2n', '2n');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3r', '3r');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4t', '4t');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5è', '5è');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6è', '6è');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7è', '7è');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8è', '8è');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9è', '9è');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10è', '10è');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11è', '11è');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12è', '12è');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13è', '13è');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14è', '14è');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15è', '15è');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16è', '16è');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17è', '17è');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18è', '18è');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19è', '19è');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20è', '20è');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21è', '21è');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22è', '22è');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23è', '23è');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24è', '24è');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25è', '25è');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26è', '26è');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27è', '27è');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28è', '28è');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29è', '29è');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30è', '30è');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31è', '31è');
+});
+
+test('format month', function (assert) {
+ var expected = 'gener gen._febrer febr._març mar._abril abr._maig mai._juny jun._juliol jul._agost ag._setembre set._octubre oct._novembre nov._desembre des.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'diumenge dg. Dg_dilluns dl. Dl_dimarts dt. Dt_dimecres dc. Dc_dijous dj. Dj_divendres dv. Dv_dissabte ds. Ds'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'uns segons', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'un minut', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'un minut', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minuts', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minuts', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'una hora', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'una hora', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 hores', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 hores', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 hores', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'un dia', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'un dia', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dies', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'un dia', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dies', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dies', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'un mes', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'un mes', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'un mes', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 mesos', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 mesos', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 mesos', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'un mes', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 mesos', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'un any', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 anys', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'un any', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 anys', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'd\'aquí uns segons', 'prefix');
+ assert.equal(moment(0).from(30000), 'fa uns segons', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'fa uns segons', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'd\'aquí uns segons', 'd\'aquí uns segons');
+ assert.equal(moment().add({d: 5}).fromNow(), 'd\'aquí 5 dies', 'd\'aquí 5 dies');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'avui a les 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'avui a les 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'avui a les 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'demà a les 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).add({d: 1, h : -1}).calendar(), 'demà a les 11:00', 'tomorrow minus 1 hour');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'avui a les 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'ahir a les 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [a ' + ((m.hours() !== 1) ? 'les' : 'la') + '] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [a ' + ((m.hours() !== 1) ? 'les' : 'la') + '] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [a ' + ((m.hours() !== 1) ? 'les' : 'la') + '] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[el] dddd [passat a ' + ((m.hours() !== 1) ? 'les' : 'la') + '] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[el] dddd [passat a ' + ((m.hours() !== 1) ? 'les' : 'la') + '] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[el] dddd [passat a ' + ((m.hours() !== 1) ? 'les' : 'la') + '] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52a', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1a', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1a', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2a', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2a', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('cs');
+
+test('parse', function (assert) {
+ var tests = 'leden led_únor úno_březen bře_duben dub_květen kvě_červen čvn_červenec čvc_srpen srp_září zář_říjen říj_listopad lis_prosinec pro'.split('_'), i;
+ function equalTest(input, mmm, monthIndex) {
+ assert.equal(moment(input, mmm).month(), monthIndex, input + ' ' + mmm + ' should be month ' + (monthIndex + 1));
+ }
+ function equalTestStrict(input, mmm, monthIndex) {
+ assert.equal(moment(input, mmm, true).month(), monthIndex, input + ' ' + mmm + ' should be strict month ' + (monthIndex + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+
+ equalTestStrict(tests[i][1], 'MMM', i);
+ equalTestStrict(tests[i][0], 'MMMM', i);
+ equalTestStrict(tests[i][1].toLocaleLowerCase(), 'MMM', i);
+ equalTestStrict(tests[i][1].toLocaleUpperCase(), 'MMM', i);
+ equalTestStrict(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTestStrict(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss', 'neděle, únor 14. 2010, 3:25:50'],
+ ['ddd, h', 'ne, 3'],
+ ['M Mo MM MMMM MMM', '2 2. 02 únor úno'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. neděle ne ne'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '6 6. 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['DDDo [den v roce]', '45. den v roce'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14. únor 2010'],
+ ['LLL', '14. únor 2010 15:25'],
+ ['LLLL', 'neděle 14. únor 2010 15:25'],
+ ['l', '14. 2. 2010'],
+ ['ll', '14. úno 2010'],
+ ['lll', '14. úno 2010 15:25'],
+ ['llll', 'ne 14. úno 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'leden led_únor úno_březen bře_duben dub_květen kvě_červen čvn_červenec čvc_srpen srp_září zář_říjen říj_listopad lis_prosinec pro'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'neděle ne ne_pondělí po po_úterý út út_středa st st_čtvrtek čt čt_pátek pá pá_sobota so so'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'pár sekund', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'minuta', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'minuta', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minuty', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minut', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'hodina', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'hodina', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 hodiny', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 hodin', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 hodin', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'den', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'den', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dny', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'den', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dní', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dní', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'měsíc', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'měsíc', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'měsíc', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 měsíce', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 měsíce', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 měsíce', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'měsíc', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 měsíců', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'rok', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 roky', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'rok', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 let', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'za pár sekund', 'prefix');
+ assert.equal(moment(0).from(30000), 'před pár sekundami', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'před pár sekundami', 'now from now should display as in the past');
+});
+
+test('fromNow (future)', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'za pár sekund', 'in a few seconds');
+ assert.equal(moment().add({m: 1}).fromNow(), 'za minutu', 'in a minute');
+ assert.equal(moment().add({m: 3}).fromNow(), 'za 3 minuty', 'in 3 minutes');
+ assert.equal(moment().add({m: 10}).fromNow(), 'za 10 minut', 'in 10 minutes');
+ assert.equal(moment().add({h: 1}).fromNow(), 'za hodinu', 'in an hour');
+ assert.equal(moment().add({h: 3}).fromNow(), 'za 3 hodiny', 'in 3 hours');
+ assert.equal(moment().add({h: 10}).fromNow(), 'za 10 hodin', 'in 10 hours');
+ assert.equal(moment().add({d: 1}).fromNow(), 'za den', 'in a day');
+ assert.equal(moment().add({d: 3}).fromNow(), 'za 3 dny', 'in 3 days');
+ assert.equal(moment().add({d: 10}).fromNow(), 'za 10 dní', 'in 10 days');
+ assert.equal(moment().add({M: 1}).fromNow(), 'za měsíc', 'in a month');
+ assert.equal(moment().add({M: 3}).fromNow(), 'za 3 měsíce', 'in 3 months');
+ assert.equal(moment().add({M: 10}).fromNow(), 'za 10 měsíců', 'in 10 months');
+ assert.equal(moment().add({y: 1}).fromNow(), 'za rok', 'in a year');
+ assert.equal(moment().add({y: 3}).fromNow(), 'za 3 roky', 'in 3 years');
+ assert.equal(moment().add({y: 10}).fromNow(), 'za 10 let', 'in 10 years');
+});
+
+test('fromNow (past)', function (assert) {
+ assert.equal(moment().subtract({s: 30}).fromNow(), 'před pár sekundami', 'a few seconds ago');
+ assert.equal(moment().subtract({m: 1}).fromNow(), 'před minutou', 'a minute ago');
+ assert.equal(moment().subtract({m: 3}).fromNow(), 'před 3 minutami', '3 minutes ago');
+ assert.equal(moment().subtract({m: 10}).fromNow(), 'před 10 minutami', '10 minutes ago');
+ assert.equal(moment().subtract({h: 1}).fromNow(), 'před hodinou', 'an hour ago');
+ assert.equal(moment().subtract({h: 3}).fromNow(), 'před 3 hodinami', '3 hours ago');
+ assert.equal(moment().subtract({h: 10}).fromNow(), 'před 10 hodinami', '10 hours ago');
+ assert.equal(moment().subtract({d: 1}).fromNow(), 'před dnem', 'a day ago');
+ assert.equal(moment().subtract({d: 3}).fromNow(), 'před 3 dny', '3 days ago');
+ assert.equal(moment().subtract({d: 10}).fromNow(), 'před 10 dny', '10 days ago');
+ assert.equal(moment().subtract({M: 1}).fromNow(), 'před měsícem', 'a month ago');
+ assert.equal(moment().subtract({M: 3}).fromNow(), 'před 3 měsíci', '3 months ago');
+ assert.equal(moment().subtract({M: 10}).fromNow(), 'před 10 měsíci', '10 months ago');
+ assert.equal(moment().subtract({y: 1}).fromNow(), 'před rokem', 'a year ago');
+ assert.equal(moment().subtract({y: 3}).fromNow(), 'před 3 lety', '3 years ago');
+ assert.equal(moment().subtract({y: 10}).fromNow(), 'před 10 lety', '10 years ago');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'dnes v 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'dnes v 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'dnes v 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'zítra v 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'dnes v 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'včera v 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m, nextDay;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ nextDay = '';
+ switch (m.day()) {
+ case 0:
+ nextDay = 'v neděli';
+ break;
+ case 1:
+ nextDay = 'v pondělí';
+ break;
+ case 2:
+ nextDay = 'v úterý';
+ break;
+ case 3:
+ nextDay = 've středu';
+ break;
+ case 4:
+ nextDay = 've čtvrtek';
+ break;
+ case 5:
+ nextDay = 'v pátek';
+ break;
+ case 6:
+ nextDay = 'v sobotu';
+ break;
+ }
+ assert.equal(m.calendar(), m.format('[' + nextDay + '] [v] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[' + nextDay + '] [v] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[' + nextDay + '] [v] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m, lastDay;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ lastDay = '';
+ switch (m.day()) {
+ case 0:
+ lastDay = 'minulou neděli';
+ break;
+ case 1:
+ lastDay = 'minulé pondělí';
+ break;
+ case 2:
+ lastDay = 'minulé úterý';
+ break;
+ case 3:
+ lastDay = 'minulou středu';
+ break;
+ case 4:
+ lastDay = 'minulý čtvrtek';
+ break;
+ case 5:
+ lastDay = 'minulý pátek';
+ break;
+ case 6:
+ lastDay = 'minulou sobotu';
+ break;
+ }
+ assert.equal(m.calendar(), m.format('[' + lastDay + '] [v] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[' + lastDay + '] [v] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[' + lastDay + '] [v] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('humanize duration', function (assert) {
+ assert.equal(moment.duration(1, 'minutes').humanize(), 'minuta', 'a minute (future)');
+ assert.equal(moment.duration(1, 'minutes').humanize(true), 'za minutu', 'in a minute');
+ assert.equal(moment.duration(-1, 'minutes').humanize(), 'minuta', 'a minute (past)');
+ assert.equal(moment.duration(-1, 'minutes').humanize(true), 'před minutou', 'a minute ago');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52.', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1.', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1.', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2.', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2.', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('cv');
+
+test('parse', function (assert) {
+ var tests = 'кӑрлач кӑр_нарӑс нар_пуш пуш_ака ака_май май_ҫӗртме ҫӗр_утӑ утӑ_ҫурла ҫур_авӑн авн_юпа юпа_чӳк чӳк_раштав раш'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'вырсарникун, нарӑс 14-мӗш 2010, 3:25:50 pm'],
+ ['ddd, hA', 'выр, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2-мӗш 02 нарӑс нар'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14-мӗш 14'],
+ ['d do dddd ddd dd', '0 0-мӗш вырсарникун выр вр'],
+ ['DDD DDDo DDDD', '45 45-мӗш 045'],
+ ['w wo ww', '7 7-мӗш 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['Ҫулӑн DDDo кунӗ', 'Ҫулӑн 45-мӗш кунӗ'],
+ ['LTS', '15:25:50'],
+ ['L', '14-02-2010'],
+ ['LL', '2010 ҫулхи нарӑс уйӑхӗн 14-мӗшӗ'],
+ ['LLL', '2010 ҫулхи нарӑс уйӑхӗн 14-мӗшӗ, 15:25'],
+ ['LLLL', 'вырсарникун, 2010 ҫулхи нарӑс уйӑхӗн 14-мӗшӗ, 15:25'],
+ ['l', '14-2-2010'],
+ ['ll', '2010 ҫулхи нар уйӑхӗн 14-мӗшӗ'],
+ ['lll', '2010 ҫулхи нар уйӑхӗн 14-мӗшӗ, 15:25'],
+ ['llll', 'выр, 2010 ҫулхи нар уйӑхӗн 14-мӗшӗ, 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1-мӗш', '1-мӗш');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2-мӗш', '2-мӗш');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3-мӗш', '3-мӗш');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4-мӗш', '4-мӗш');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5-мӗш', '5-мӗш');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6-мӗш', '6-мӗш');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7-мӗш', '7-мӗш');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8-мӗш', '8-мӗш');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9-мӗш', '9-мӗш');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10-мӗш', '10-мӗш');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11-мӗш', '11-мӗш');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12-мӗш', '12-мӗш');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13-мӗш', '13-мӗш');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14-мӗш', '14-мӗш');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15-мӗш', '15-мӗш');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16-мӗш', '16-мӗш');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17-мӗш', '17-мӗш');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18-мӗш', '18-мӗш');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19-мӗш', '19-мӗш');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20-мӗш', '20-мӗш');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21-мӗш', '21-мӗш');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22-мӗш', '22-мӗш');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23-мӗш', '23-мӗш');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24-мӗш', '24-мӗш');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25-мӗш', '25-мӗш');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26-мӗш', '26-мӗш');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27-мӗш', '27-мӗш');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28-мӗш', '28-мӗш');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29-мӗш', '29-мӗш');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30-мӗш', '30-мӗш');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31-мӗш', '31-мӗш');
+});
+
+test('format month', function (assert) {
+ var expected = 'кӑрлач кӑр_нарӑс нар_пуш пуш_ака ака_май май_ҫӗртме ҫӗр_утӑ утӑ_ҫурла ҫур_авӑн авн_юпа юпа_чӳк чӳк_раштав раш'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'вырсарникун выр вр_тунтикун тун тн_ытларикун ытл ыт_юнкун юн юн_кӗҫнерникун кӗҫ кҫ_эрнекун эрн эр_шӑматкун шӑм шм'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'пӗр-ик ҫеккунт', '44 sekunder = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'пӗр минут', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'пӗр минут', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 минут', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 минут', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'пӗр сехет', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'пӗр сехет', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 сехет', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 сехет', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 сехет', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'пӗр кун', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'пӗр кун', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 кун', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'пӗр кун', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 кун', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 кун', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'пӗр уйӑх', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'пӗр уйӑх', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'пӗр уйӑх', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 уйӑх', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 уйӑх', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 уйӑх', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'пӗр уйӑх', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 уйӑх', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'пӗр ҫул', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 ҫул', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'пӗр ҫул', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 ҫул', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'пӗр-ик ҫеккунтран', 'prefix');
+ assert.equal(moment(0).from(30000), 'пӗр-ик ҫеккунт каялла', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'пӗр-ик ҫеккунт каялла', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'пӗр-ик ҫеккунтран', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), '5 кунран', 'in 5 days');
+ assert.equal(moment().add({h: 2}).fromNow(), '2 сехетрен', 'in 2 hours, the right suffix!');
+ assert.equal(moment().add({y: 3}).fromNow(), '3 ҫултан', 'in 3 years, the right suffix!');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+ assert.equal(moment(a).calendar(), 'Паян 12:00 сехетре', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Паян 12:25 сехетре', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Паян 13:00 сехетре', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Ыран 12:00 сехетре', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Паян 11:00 сехетре', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Ӗнер 12:00 сехетре', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('[Ҫитес] dddd LT [сехетре]'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[Ҫитес] dddd LT [сехетре]'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[Ҫитес] dddd LT [сехетре]'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[Иртнӗ] dddd LT [сехетре]'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[Иртнӗ] dddd LT [сехетре]'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[Иртнӗ] dddd LT [сехетре]'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+// Monday is the first day of the week.
+// The week that contains Jan 1st is the first week of the year.
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1-мӗш', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1-мӗш', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2-мӗш', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2-мӗш', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3-мӗш', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('cy');
+
+test('parse', function (assert) {
+ var tests = 'Ionawr Ion_Chwefror Chwe_Mawrth Maw_Ebrill Ebr_Mai Mai_Mehefin Meh_Gorffennaf Gor_Awst Aws_Medi Med_Hydref Hyd_Tachwedd Tach_Rhagfyr Rhag'.split('_'),
+ i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Dydd Sul, Chwefror 14eg 2010, 3:25:50 pm'],
+ ['ddd, hA', 'Sul, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2il 02 Chwefror Chwe'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14eg 14'],
+ ['d do dddd ddd dd', '0 0 Dydd Sul Sul Su'],
+ ['DDD DDDo DDDD', '45 45ain 045'],
+ ['w wo ww', '6 6ed 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45ain day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 Chwefror 2010'],
+ ['LLL', '14 Chwefror 2010 15:25'],
+ ['LLLL', 'Dydd Sul, 14 Chwefror 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 Chwe 2010'],
+ ['lll', '14 Chwe 2010 15:25'],
+ ['llll', 'Sul, 14 Chwe 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1af', '1af');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2il', '2il');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3ydd', '3ydd');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4ydd', '4ydd');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5ed', '5ed');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6ed', '6ed');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7ed', '7ed');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8fed', '8fed');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9fed', '9fed');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10fed', '10fed');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11eg', '11eg');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12fed', '12fed');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13eg', '13eg');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14eg', '14eg');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15fed', '15fed');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16eg', '16eg');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17eg', '17eg');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18fed', '18fed');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19eg', '19eg');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20fed', '20fed');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21ain', '21ain');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22ain', '22ain');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23ain', '23ain');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24ain', '24ain');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25ain', '25ain');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26ain', '26ain');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27ain', '27ain');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28ain', '28ain');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29ain', '29ain');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30ain', '30ain');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31ain', '31ain');
+});
+
+test('format month', function (assert) {
+ var expected = 'Ionawr Ion_Chwefror Chwe_Mawrth Maw_Ebrill Ebr_Mai Mai_Mehefin Meh_Gorffennaf Gor_Awst Aws_Medi Med_Hydref Hyd_Tachwedd Tach_Rhagfyr Rhag'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Dydd Sul Sul Su_Dydd Llun Llun Ll_Dydd Mawrth Maw Ma_Dydd Mercher Mer Me_Dydd Iau Iau Ia_Dydd Gwener Gwe Gw_Dydd Sadwrn Sad Sa'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'ychydig eiliadau', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'munud', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'munud', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 munud', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 munud', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'awr', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'awr', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 awr', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 awr', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 awr', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'diwrnod', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'diwrnod', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 diwrnod', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'diwrnod', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 diwrnod', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 diwrnod', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'mis', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'mis', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'mis', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 mis', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 mis', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 mis', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'mis', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 mis', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'blwyddyn', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 flynedd', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'blwyddyn', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 flynedd', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'mewn ychydig eiliadau', 'prefix');
+ assert.equal(moment(0).from(30000), 'ychydig eiliadau yn ôl', 'suffix');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'mewn ychydig eiliadau', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'mewn 5 diwrnod', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Heddiw am 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Heddiw am 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Heddiw am 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Yfory am 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Heddiw am 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Ddoe am 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [am] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [am] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [am] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [diwethaf am] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [diwethaf am] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [diwethaf am] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52ain', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1af', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1af', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2il', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2il', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('da');
+
+test('parse', function (assert) {
+ var tests = 'januar jan_februar feb_marts mar_april apr_maj maj_juni jun_juli jul_august aug_september sep_oktober okt_november nov_december dec'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd [den] Do MMMM YYYY, h:mm:ss a', 'søndag den 14. februar 2010, 3:25:50 pm'],
+ ['ddd hA', 'søn 3PM'],
+ ['M Mo MM MMMM MMM', '2 2. 02 februar feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. søndag søn sø'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '6 6. 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[den] DDDo [dag på året]', 'den 45. dag på året'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14. februar 2010'],
+ ['LLL', '14. februar 2010 15:25'],
+ ['LLLL', 'søndag d. 14. februar 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14. feb 2010'],
+ ['lll', '14. feb 2010 15:25'],
+ ['llll', 'søn d. 14. feb 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'januar jan_februar feb_marts mar_april apr_maj maj_juni jun_juli jul_august aug_september sep_oktober okt_november nov_december dec'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'søndag søn sø_mandag man ma_tirsdag tir ti_onsdag ons on_torsdag tor to_fredag fre fr_lørdag lør lø'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'få sekunder', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'et minut', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'et minut', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutter', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutter', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'en time', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'en time', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 timer', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 timer', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 timer', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'en dag', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'en dag', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dage', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'en dag', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dage', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dage', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'en måned', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'en måned', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'en måned', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 måneder', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 måneder', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 måneder', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'en måned', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 måneder', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'et år', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 år', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'et år', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 år', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'om få sekunder', 'prefix');
+ assert.equal(moment(0).from(30000), 'få sekunder siden', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'få sekunder siden', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'om få sekunder', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'om 5 dage', 'in 5 days');
+});
+
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'I dag kl. 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'I dag kl. 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'I dag kl. 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'I morgen kl. 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'I dag kl. 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'I går kl. 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [kl.] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [kl.] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [kl.] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[sidste] dddd [kl] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[sidste] dddd [kl] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[sidste] dddd [kl] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52.', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1.', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1.', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2.', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2.', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('de-at');
+
+test('parse', function (assert) {
+ var tests = 'Jänner Jän._Februar Febr._März Mrz._April Apr._Mai Mai_Juni Jun._Juli Jul._August Aug._September Sept._Oktober Okt._November Nov._Dezember Dez.'.split('_'), i;
+
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, h:mm:ss a', 'Sonntag, 14. Februar 2010, 3:25:50 pm'],
+ ['ddd, hA', 'So., 3PM'],
+ ['M Mo MM MMMM MMM', '2 2. 02 Februar Febr.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. Sonntag So. So'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '6 6. 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45. day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14. Februar 2010'],
+ ['LLL', '14. Februar 2010 15:25'],
+ ['LLLL', 'Sonntag, 14. Februar 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14. Febr. 2010'],
+ ['lll', '14. Febr. 2010 15:25'],
+ ['llll', 'So., 14. Febr. 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'Jänner Jän._Februar Febr._März Mrz._April Apr._Mai Mai_Juni Jun._Juli Jul._August Aug._September Sept._Oktober Okt._November Nov._Dezember Dez.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Sonntag So. So_Montag Mo. Mo_Dienstag Di. Di_Mittwoch Mi. Mi_Donnerstag Do. Do_Freitag Fr. Fr_Samstag Sa. Sa'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'ein paar Sekunden', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'eine Minute', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'eine Minute', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 Minuten', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 Minuten', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'eine Stunde', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'eine Stunde', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 Stunden', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 Stunden', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 Stunden', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'ein Tag', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'ein Tag', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 Tage', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'ein Tag', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 Tage', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 Tage', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'ein Monat', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'ein Monat', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 Monate', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 Monate', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 Monate', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'ein Monat', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 Monate', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'ein Jahr', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 Jahre', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'ein Jahr', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 Jahre', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'in ein paar Sekunden', 'prefix');
+ assert.equal(moment(0).from(30000), 'vor ein paar Sekunden', 'suffix');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'in ein paar Sekunden', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'in 5 Tagen', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'heute um 12:00 Uhr', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'heute um 12:25 Uhr', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'heute um 13:00 Uhr', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'morgen um 12:00 Uhr', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'heute um 11:00 Uhr', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'gestern um 12:00 Uhr', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [um] LT [Uhr]'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [um] LT [Uhr]'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [um] LT [Uhr]'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[letzten] dddd [um] LT [Uhr]'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[letzten] dddd [um] LT [Uhr]'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[letzten] dddd [um] LT [Uhr]'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52.', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1.', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1.', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2.', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2.', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('de');
+
+test('parse', function (assert) {
+ var tests = 'Januar Jan._Februar Febr._März Mrz._April Apr._Mai Mai_Juni Jun._Juli Jul._August Aug._September Sept._Oktober Okt._November Nov._Dezember Dez.'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, h:mm:ss a', 'Sonntag, 14. Februar 2010, 3:25:50 pm'],
+ ['ddd, hA', 'So., 3PM'],
+ ['M Mo MM MMMM MMM', '2 2. 02 Februar Febr.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. Sonntag So. So'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '6 6. 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45. day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14. Februar 2010'],
+ ['LLL', '14. Februar 2010 15:25'],
+ ['LLLL', 'Sonntag, 14. Februar 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14. Febr. 2010'],
+ ['lll', '14. Febr. 2010 15:25'],
+ ['llll', 'So., 14. Febr. 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'Januar Jan._Februar Febr._März Mrz._April Apr._Mai Mai_Juni Jun._Juli Jul._August Aug._September Sept._Oktober Okt._November Nov._Dezember Dez.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Sonntag So. So_Montag Mo. Mo_Dienstag Di. Di_Mittwoch Mi. Mi_Donnerstag Do. Do_Freitag Fr. Fr_Samstag Sa. Sa'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'ein paar Sekunden', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'eine Minute', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'eine Minute', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 Minuten', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 Minuten', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'eine Stunde', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'eine Stunde', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 Stunden', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 Stunden', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 Stunden', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'ein Tag', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'ein Tag', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 Tage', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'ein Tag', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 Tage', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 Tage', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'ein Monat', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'ein Monat', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'ein Monat', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 Monate', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 Monate', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 Monate', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'ein Monat', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 Monate', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'ein Jahr', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 Jahre', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'ein Jahr', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 Jahre', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'in ein paar Sekunden', 'prefix');
+ assert.equal(moment(0).from(30000), 'vor ein paar Sekunden', 'suffix');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'in ein paar Sekunden', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'in 5 Tagen', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'heute um 12:00 Uhr', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'heute um 12:25 Uhr', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'heute um 13:00 Uhr', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'morgen um 12:00 Uhr', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'heute um 11:00 Uhr', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'gestern um 12:00 Uhr', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [um] LT [Uhr]'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [um] LT [Uhr]'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [um] LT [Uhr]'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[letzten] dddd [um] LT [Uhr]'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[letzten] dddd [um] LT [Uhr]'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[letzten] dddd [um] LT [Uhr]'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52.', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1.', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1.', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2.', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2.', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('dv');
+
+test('parse', function (assert) {
+ var i,
+ tests = [
+ 'ޖެނުއަރީ',
+ 'ފެބްރުއަރީ',
+ 'މާރިޗު',
+ 'އޭޕްރީލު',
+ 'މޭ',
+ 'ޖޫން',
+ 'ޖުލައި',
+ 'އޯގަސްޓު',
+ 'ސެޕްޓެމްބަރު',
+ 'އޮކްޓޯބަރު',
+ 'ނޮވެމްބަރު',
+ 'ޑިސެމްބަރު'
+ ];
+
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+
+ for (i = 0; i < 12; i++) {
+ equalTest(tests[i], 'MMM', i);
+ equalTest(tests[i], 'MMMM', i);
+ equalTest(tests[i].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'އާދިއްތަ، ފެބްރުއަރީ 14 2010، 3:25:50 މފ'],
+ ['ddd, hA', 'އާދިއްތަ، 3މފ'],
+ ['M Mo MM MMMM MMM', '2 2 02 ފެބްރުއަރީ ފެބްރުއަރީ'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 އާދިއްތަ އާދިއްތަ އާދި'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '8 8 08'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'މފ މފ'],
+ ['LTS', '15:25:50'],
+ ['L', '14/2/2010'],
+ ['LL', '14 ފެބްރުއަރީ 2010'],
+ ['LLL', '14 ފެބްރުއަރީ 2010 15:25'],
+ ['LLLL', 'އާދިއްތަ 14 ފެބްރުއަރީ 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 ފެބްރުއަރީ 2010'],
+ ['lll', '14 ފެބްރުއަރީ 2010 15:25'],
+ ['llll', 'އާދިއްތަ 14 ފެބްރުއަރީ 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format month', function (assert) {
+ var i,
+ expected = [
+ 'ޖެނުއަރީ',
+ 'ފެބްރުއަރީ',
+ 'މާރިޗު',
+ 'އޭޕްރީލު',
+ 'މޭ',
+ 'ޖޫން',
+ 'ޖުލައި',
+ 'އޯގަސްޓު',
+ 'ސެޕްޓެމްބަރު',
+ 'އޮކްޓޯބަރު',
+ 'ނޮވެމްބަރު',
+ 'ޑިސެމްބަރު'
+ ];
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM'), expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var i,
+ expected = [
+ 'އާދިއްތަ',
+ 'ހޯމަ',
+ 'އަންގާރަ',
+ 'ބުދަ',
+ 'ބުރާސްފަތި',
+ 'ހުކުރު',
+ 'ހޮނިހިރު'
+ ];
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd'), expected[i]);
+ }
+});
+
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'ސިކުންތުކޮޅެއް', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'މިނިޓެއް', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'މިނިޓެއް', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), 'މިނިޓު 2', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), 'މިނިޓު 44', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'ގަޑިއިރެއް', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'ގަޑިއިރެއް', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), 'ގަޑިއިރު 2', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), 'ގަޑިއިރު 5', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), 'ގަޑިއިރު 21', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'ދުވަހެއް', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'ދުވަހެއް', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), 'ދުވަސް 2', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'ދުވަހެއް', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), 'ދުވަސް 5', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), 'ދުވަސް 25', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'މަހެއް', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'މަހެއް', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'މަހެއް', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), 'މަސް 2', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), 'މަސް 2', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), 'މަސް 3', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'މަހެއް', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), 'މަސް 5', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'އަހަރެއް', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), 'އަހަރު 2', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'އަހަރެއް', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), 'އަހަރު 5', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'ތެރޭގައި ސިކުންތުކޮޅެއް', 'prefix');
+ assert.equal(moment(0).from(30000), 'ކުރިން ސިކުންތުކޮޅެއް', 'suffix');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'ތެރޭގައި ސިކުންތުކޮޅެއް', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'ތެރޭގައި ދުވަސް 5', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'މިއަދު 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'މިއަދު 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'މިއަދު 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'މާދަމާ 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'މިއަދު 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'އިއްޔެ 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[ފާއިތުވި] dddd LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[ފާއިތުވި] dddd LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[ފާއިތުވި] dddd LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '3 03 3', 'Jan 15 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('el');
+
+test('parse', function (assert) {
+ var i,
+ tests = 'Ιανουάριος Ιαν_Φεβρουάριος Φεβ_Μάρτιος Μαρ_Απρίλιος Απρ_Μάιος Μαϊ_Ιούνιος Ιουν_Ιούλιος Ιουλ_Αύγουστος Αυγ_Σεπτέμβριος Σεπ_Οκτώβριος Οκτ_Νοέμβριος Νοε_Δεκέμβριος Δεκ'.split('_');
+
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('parse meridiem', function (assert) {
+ var i,
+ b = moment(),
+ meridiemTests = [
+ // h a patterns, expected hours, isValid
+ ['10 πμ', 10, true],
+ ['10 μμ', 22, true],
+ ['10 π.μ.', 10, true],
+ ['10 μ.μ.', 22, true],
+ ['10 π', 10, true],
+ ['10 μ', 22, true],
+ ['10 ΠΜ', 10, true],
+ ['10 ΜΜ', 22, true],
+ ['10 Π.Μ.', 10, true],
+ ['10 Μ.Μ.', 22, true],
+ ['10 Π', 10, true],
+ ['10 Μ', 22, true],
+ ['10 am', 10, false],
+ ['10 pm', 10, false]
+ ],
+ parsed;
+
+ // test that a formatted moment including meridiem string can be parsed back to the same moment
+ assert.ok(b.isSame(moment(b.format('h:mm:ss a'), 'h:mm:ss a', 'el', true), 'seconds'), b.format('h:mm:ss a') + ' should be equal to ' + moment(b.format('h:mm:ss a'), 'h:mm:ss a', 'el', true).format('h:mm:ss a'));
+
+ // test that a formatted moment having a meridiem string can be parsed with strict flag
+ assert.ok(moment(b.format('h:mm:ss a'), 'h:mm:ss a', 'el', true).isValid(), b.format('h:mm:ss a') + ' should be parsed as valid');
+
+ for (i = 0; i < meridiemTests.length; i++) {
+ parsed = moment(meridiemTests[i][0], 'h a', 'el', true);
+ assert.equal(parsed.isValid(), meridiemTests[i][2], 'validity for ' + meridiemTests[i][0]);
+ if (parsed.isValid()) {
+ assert.equal(parsed.hours(), meridiemTests[i][1], 'hours for ' + meridiemTests[i][0]);
+ }
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Κυριακή, Φεβρουάριος 14η 2010, 3:25:50 μμ'],
+ ['dddd, D MMMM YYYY, h:mm:ss a', 'Κυριακή, 14 Φεβρουαρίου 2010, 3:25:50 μμ'],
+ ['ddd, hA', 'Κυρ, 3ΜΜ'],
+ ['dddd, MMMM YYYY', 'Κυριακή, Φεβρουάριος 2010'],
+ ['M Mo MM MMMM MMM', '2 2η 02 Φεβρουάριος Φεβ'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14η 14'],
+ ['d do dddd ddd dd', '0 0η Κυριακή Κυρ Κυ'],
+ ['DDD DDDo DDDD', '45 45η 045'],
+ ['w wo ww', '6 6η 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'μμ ΜΜ'],
+ ['[the] DDDo [day of the year]', 'the 45η day of the year'],
+ ['LTS', '3:25:50 ΜΜ'],
+ ['L', '14/02/2010'],
+ ['LL', '14 Φεβρουαρίου 2010'],
+ ['LLL', '14 Φεβρουαρίου 2010 3:25 ΜΜ'],
+ ['LLLL', 'Κυριακή, 14 Φεβρουαρίου 2010 3:25 ΜΜ'],
+ ['l', '14/2/2010'],
+ ['ll', '14 Φεβ 2010'],
+ ['lll', '14 Φεβ 2010 3:25 ΜΜ'],
+ ['llll', 'Κυρ, 14 Φεβ 2010 3:25 ΜΜ']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1η', '1η');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2η', '2η');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3η', '3η');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4η', '4η');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5η', '5η');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6η', '6η');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7η', '7η');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8η', '8η');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9η', '9η');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10η', '10η');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11η', '11η');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12η', '12η');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13η', '13η');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14η', '14η');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15η', '15η');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16η', '16η');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17η', '17η');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18η', '18η');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19η', '19η');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20η', '20η');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21η', '21η');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22η', '22η');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23η', '23η');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24η', '24η');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25η', '25η');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26η', '26η');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27η', '27η');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28η', '28η');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29η', '29η');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30η', '30η');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31η', '31η');
+});
+
+test('format month', function (assert) {
+ var i,
+ expected = 'Ιανουάριος Ιαν_Φεβρουάριος Φεβ_Μάρτιος Μαρ_Απρίλιος Απρ_Μάιος Μαϊ_Ιούνιος Ιουν_Ιούλιος Ιουλ_Αύγουστος Αυγ_Σεπτέμβριος Σεπ_Οκτώβριος Οκτ_Νοέμβριος Νοε_Δεκέμβριος Δεκ'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var i,
+ expected = 'Κυριακή Κυρ Κυ_Δευτέρα Δευ Δε_Τρίτη Τρι Τρ_Τετάρτη Τετ Τε_Πέμπτη Πεμ Πε_Παρασκευή Παρ Πα_Σάββατο Σαβ Σα'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'λίγα δευτερόλεπτα', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'ένα λεπτό', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'ένα λεπτό', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 λεπτά', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 λεπτά', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'μία ώρα', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'μία ώρα', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 ώρες', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 ώρες', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 ώρες', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'μία μέρα', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'μία μέρα', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 μέρες', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'μία μέρα', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 μέρες', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 μέρες', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'ένας μήνας', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'ένας μήνας', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'ένας μήνας', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 μήνες', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 μήνες', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 μήνες', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'ένας μήνας', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 μήνες', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'ένας χρόνος', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 χρόνια', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'ένας χρόνος', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 χρόνια', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'σε λίγα δευτερόλεπτα', 'prefix');
+ assert.equal(moment(0).from(30000), 'λίγα δευτερόλεπτα πριν', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'λίγα δευτερόλεπτα πριν', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'σε λίγα δευτερόλεπτα', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'σε 5 μέρες', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Σήμερα στις 12:00 ΜΜ', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Σήμερα στις 12:25 ΜΜ', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Σήμερα στη 1:00 ΜΜ', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Αύριο στις 12:00 ΜΜ', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Σήμερα στις 11:00 ΠΜ', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Χθες στις 12:00 ΜΜ', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [' + (m.hours() % 12 === 1 ? 'στη' : 'στις') + '] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [στις] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [στις] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m, dayString;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ dayString = m.day() === 6 ? '[το προηγούμενο Σάββατο]' : '[την προηγούμενη] dddd';
+ assert.equal(m.calendar(), m.format(dayString + ' [' + (m.hours() % 12 === 1 ? 'στη' : 'στις') + '] LT'), 'Today - ' + i + ' days current time');
+ m.hours(1).minutes(30).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(dayString + ' [στη] LT'), 'Today - ' + i + ' days one o clock');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(dayString + ' [στις] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(dayString + ' [στις] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday format', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52η', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '1 01 1η', 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1η', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '2 02 2η', 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2η', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('en-au');
+
+test('parse', function (assert) {
+ var tests = 'January Jan_February Feb_March Mar_April Apr_May May_June Jun_July Jul_August Aug_September Sep_October Oct_November Nov_December Dec'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Sunday, February 14th 2010, 3:25:50 pm'],
+ ['ddd, hA', 'Sun, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2nd 02 February Feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14th 14'],
+ ['d do dddd ddd dd', '0 0th Sunday Sun Su'],
+ ['DDD DDDo DDDD', '45 45th 045'],
+ ['w wo ww', '6 6th 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45th day of the year'],
+ ['LTS', '3:25:50 PM'],
+ ['L', '14/02/2010'],
+ ['LL', '14 February 2010'],
+ ['LLL', '14 February 2010 3:25 PM'],
+ ['LLLL', 'Sunday, 14 February 2010 3:25 PM'],
+ ['l', '14/2/2010'],
+ ['ll', '14 Feb 2010'],
+ ['lll', '14 Feb 2010 3:25 PM'],
+ ['llll', 'Sun, 14 Feb 2010 3:25 PM']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1st', '1st');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2nd', '2nd');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3rd', '3rd');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4th', '4th');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5th', '5th');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6th', '6th');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7th', '7th');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8th', '8th');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9th', '9th');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10th', '10th');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11th', '11th');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12th', '12th');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13th', '13th');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14th', '14th');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15th', '15th');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16th', '16th');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17th', '17th');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18th', '18th');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19th', '19th');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20th', '20th');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21st', '21st');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22nd', '22nd');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23rd', '23rd');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24th', '24th');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25th', '25th');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26th', '26th');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27th', '27th');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28th', '28th');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29th', '29th');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30th', '30th');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31st', '31st');
+});
+
+test('format month', function (assert) {
+ var expected = 'January Jan_February Feb_March Mar_April Apr_May May_June Jun_July Jul_August Aug_September Sep_October Oct_November Nov_December Dec'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Sunday Sun Su_Monday Mon Mo_Tuesday Tue Tu_Wednesday Wed We_Thursday Thu Th_Friday Fri Fr_Saturday Sat Sa'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'a few seconds', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'a minute', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'a minute', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutes', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutes', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'an hour', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'an hour', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 hours', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 hours', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 hours', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'a day', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'a day', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 days', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'a day', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 days', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 days', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'a month', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'a month', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'a month', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 months', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 months', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 months', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'a month', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 months', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'a year', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 years', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'a year', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 years', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'in a few seconds', 'prefix');
+ assert.equal(moment(0).from(30000), 'a few seconds ago', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'a few seconds ago', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'in a few seconds', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'in 5 days', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Today at 12:00 PM', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Today at 12:25 PM', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Today at 1:00 PM', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Tomorrow at 12:00 PM', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Today at 11:00 AM', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Yesterday at 12:00 PM', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [at] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [at] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [at] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[Last] dddd [at] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[Last] dddd [at] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[Last] dddd [at] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52nd', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1st', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1st', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2nd', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2nd', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('en-ca');
+
+test('parse', function (assert) {
+ var i,
+ tests = 'January Jan_February Feb_March Mar_April Apr_May May_June Jun_July Jul_August Aug_September Sep_October Oct_November Nov_December Dec'.split('_');
+
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Sunday, February 14th 2010, 3:25:50 pm'],
+ ['ddd, hA', 'Sun, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2nd 02 February Feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14th 14'],
+ ['d do dddd ddd dd', '0 0th Sunday Sun Su'],
+ ['DDD DDDo DDDD', '45 45th 045'],
+ ['w wo ww', '8 8th 08'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45th day of the year'],
+ ['L', '2010-02-14'],
+ ['LTS', '3:25:50 PM'],
+ ['LL', 'February 14, 2010'],
+ ['LLL', 'February 14, 2010 3:25 PM'],
+ ['LLLL', 'Sunday, February 14, 2010 3:25 PM'],
+ ['l', '2010-2-14'],
+ ['ll', 'Feb 14, 2010'],
+ ['lll', 'Feb 14, 2010 3:25 PM'],
+ ['llll', 'Sun, Feb 14, 2010 3:25 PM']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1st', '1st');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2nd', '2nd');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3rd', '3rd');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4th', '4th');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5th', '5th');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6th', '6th');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7th', '7th');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8th', '8th');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9th', '9th');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10th', '10th');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11th', '11th');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12th', '12th');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13th', '13th');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14th', '14th');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15th', '15th');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16th', '16th');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17th', '17th');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18th', '18th');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19th', '19th');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20th', '20th');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21st', '21st');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22nd', '22nd');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23rd', '23rd');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24th', '24th');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25th', '25th');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26th', '26th');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27th', '27th');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28th', '28th');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29th', '29th');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30th', '30th');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31st', '31st');
+});
+
+test('format month', function (assert) {
+ var i,
+ expected = 'January Jan_February Feb_March Mar_April Apr_May May_June Jun_July Jul_August Aug_September Sep_October Oct_November Nov_December Dec'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var i,
+ expected = 'Sunday Sun Su_Monday Mon Mo_Tuesday Tue Tu_Wednesday Wed We_Thursday Thu Th_Friday Fri Fr_Saturday Sat Sa'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'a few seconds', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'a minute', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'a minute', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutes', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutes', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'an hour', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'an hour', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 hours', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 hours', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 hours', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'a day', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'a day', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 days', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'a day', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 days', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 days', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'a month', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'a month', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'a month', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 months', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 months', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 months', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'a month', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 months', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'a year', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 years', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'a year', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 years', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'in a few seconds', 'prefix');
+ assert.equal(moment(0).from(30000), 'a few seconds ago', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'a few seconds ago', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'in a few seconds', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'in 5 days', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Today at 12:00 PM', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Today at 12:25 PM', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Today at 1:00 PM', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Tomorrow at 12:00 PM', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Today at 11:00 AM', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Yesterday at 12:00 PM', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [at] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [at] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [at] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[Last] dddd [at] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[Last] dddd [at] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[Last] dddd [at] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday format', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1st', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '1 01 1st', 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2nd', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '2 02 2nd', 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '3 03 3rd', 'Jan 15 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('en-gb');
+
+test('parse', function (assert) {
+ var tests = 'January Jan_February Feb_March Mar_April Apr_May May_June Jun_July Jul_August Aug_September Sep_October Oct_November Nov_December Dec'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Sunday, February 14th 2010, 3:25:50 pm'],
+ ['ddd, hA', 'Sun, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2nd 02 February Feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14th 14'],
+ ['d do dddd ddd dd', '0 0th Sunday Sun Su'],
+ ['DDD DDDo DDDD', '45 45th 045'],
+ ['w wo ww', '6 6th 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45th day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 February 2010'],
+ ['LLL', '14 February 2010 15:25'],
+ ['LLLL', 'Sunday, 14 February 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 Feb 2010'],
+ ['lll', '14 Feb 2010 15:25'],
+ ['llll', 'Sun, 14 Feb 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1st', '1st');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2nd', '2nd');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3rd', '3rd');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4th', '4th');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5th', '5th');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6th', '6th');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7th', '7th');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8th', '8th');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9th', '9th');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10th', '10th');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11th', '11th');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12th', '12th');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13th', '13th');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14th', '14th');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15th', '15th');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16th', '16th');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17th', '17th');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18th', '18th');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19th', '19th');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20th', '20th');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21st', '21st');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22nd', '22nd');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23rd', '23rd');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24th', '24th');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25th', '25th');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26th', '26th');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27th', '27th');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28th', '28th');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29th', '29th');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30th', '30th');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31st', '31st');
+});
+
+test('format month', function (assert) {
+ var expected = 'January Jan_February Feb_March Mar_April Apr_May May_June Jun_July Jul_August Aug_September Sep_October Oct_November Nov_December Dec'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Sunday Sun Su_Monday Mon Mo_Tuesday Tue Tu_Wednesday Wed We_Thursday Thu Th_Friday Fri Fr_Saturday Sat Sa'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'a few seconds', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'a minute', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'a minute', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutes', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutes', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'an hour', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'an hour', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 hours', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 hours', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 hours', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'a day', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'a day', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 days', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'a day', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 days', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 days', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'a month', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'a month', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'a month', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 months', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 months', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 months', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'a month', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 months', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'a year', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 years', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'a year', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 years', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'in a few seconds', 'prefix');
+ assert.equal(moment(0).from(30000), 'a few seconds ago', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'a few seconds ago', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'in a few seconds', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'in 5 days', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Today at 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Today at 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Today at 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Tomorrow at 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Today at 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Yesterday at 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [at] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [at] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [at] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[Last] dddd [at] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[Last] dddd [at] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[Last] dddd [at] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52nd', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1st', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1st', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2nd', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2nd', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('en-ie');
+
+test('parse', function (assert) {
+ var tests = 'January Jan_February Feb_March Mar_April Apr_May May_June Jun_July Jul_August Aug_September Sep_October Oct_November Nov_December Dec'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Sunday, February 14th 2010, 3:25:50 pm'],
+ ['ddd, hA', 'Sun, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2nd 02 February Feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14th 14'],
+ ['d do dddd ddd dd', '0 0th Sunday Sun Su'],
+ ['DDD DDDo DDDD', '45 45th 045'],
+ ['w wo ww', '6 6th 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45th day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14-02-2010'],
+ ['LL', '14 February 2010'],
+ ['LLL', '14 February 2010 15:25'],
+ ['LLLL', 'Sunday 14 February 2010 15:25'],
+ ['l', '14-2-2010'],
+ ['ll', '14 Feb 2010'],
+ ['lll', '14 Feb 2010 15:25'],
+ ['llll', 'Sun 14 Feb 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1st', '1st');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2nd', '2nd');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3rd', '3rd');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4th', '4th');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5th', '5th');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6th', '6th');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7th', '7th');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8th', '8th');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9th', '9th');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10th', '10th');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11th', '11th');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12th', '12th');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13th', '13th');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14th', '14th');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15th', '15th');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16th', '16th');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17th', '17th');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18th', '18th');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19th', '19th');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20th', '20th');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21st', '21st');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22nd', '22nd');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23rd', '23rd');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24th', '24th');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25th', '25th');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26th', '26th');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27th', '27th');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28th', '28th');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29th', '29th');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30th', '30th');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31st', '31st');
+});
+
+test('format month', function (assert) {
+ var expected = 'January Jan_February Feb_March Mar_April Apr_May May_June Jun_July Jul_August Aug_September Sep_October Oct_November Nov_December Dec'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Sunday Sun Su_Monday Mon Mo_Tuesday Tue Tu_Wednesday Wed We_Thursday Thu Th_Friday Fri Fr_Saturday Sat Sa'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'a few seconds', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'a minute', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'a minute', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutes', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutes', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'an hour', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'an hour', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 hours', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 hours', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 hours', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'a day', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'a day', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 days', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'a day', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 days', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 days', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'a month', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'a month', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'a month', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 months', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 months', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 months', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'a month', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 months', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'a year', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 years', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'a year', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 years', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'in a few seconds', 'prefix');
+ assert.equal(moment(0).from(30000), 'a few seconds ago', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'a few seconds ago', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'in a few seconds', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'in 5 days', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Today at 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Today at 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Today at 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Tomorrow at 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Today at 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Yesterday at 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [at] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [at] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [at] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[Last] dddd [at] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[Last] dddd [at] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[Last] dddd [at] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52nd', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1st', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1st', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2nd', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2nd', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('en-nz');
+
+test('parse', function (assert) {
+ var tests = 'January Jan_February Feb_March Mar_April Apr_May May_June Jun_July Jul_August Aug_September Sep_October Oct_November Nov_December Dec'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Sunday, February 14th 2010, 3:25:50 pm'],
+ ['ddd, hA', 'Sun, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2nd 02 February Feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14th 14'],
+ ['d do dddd ddd dd', '0 0th Sunday Sun Su'],
+ ['DDD DDDo DDDD', '45 45th 045'],
+ ['w wo ww', '6 6th 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45th day of the year'],
+ ['LTS', '3:25:50 PM'],
+ ['L', '14/02/2010'],
+ ['LL', '14 February 2010'],
+ ['LLL', '14 February 2010 3:25 PM'],
+ ['LLLL', 'Sunday, 14 February 2010 3:25 PM'],
+ ['l', '14/2/2010'],
+ ['ll', '14 Feb 2010'],
+ ['lll', '14 Feb 2010 3:25 PM'],
+ ['llll', 'Sun, 14 Feb 2010 3:25 PM']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1st', '1st');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2nd', '2nd');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3rd', '3rd');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4th', '4th');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5th', '5th');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6th', '6th');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7th', '7th');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8th', '8th');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9th', '9th');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10th', '10th');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11th', '11th');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12th', '12th');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13th', '13th');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14th', '14th');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15th', '15th');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16th', '16th');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17th', '17th');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18th', '18th');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19th', '19th');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20th', '20th');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21st', '21st');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22nd', '22nd');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23rd', '23rd');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24th', '24th');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25th', '25th');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26th', '26th');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27th', '27th');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28th', '28th');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29th', '29th');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30th', '30th');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31st', '31st');
+});
+
+test('format month', function (assert) {
+ var expected = 'January Jan_February Feb_March Mar_April Apr_May May_June Jun_July Jul_August Aug_September Sep_October Oct_November Nov_December Dec'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Sunday Sun Su_Monday Mon Mo_Tuesday Tue Tu_Wednesday Wed We_Thursday Thu Th_Friday Fri Fr_Saturday Sat Sa'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'a few seconds', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'a minute', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'a minute', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutes', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutes', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'an hour', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'an hour', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 hours', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 hours', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 hours', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'a day', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'a day', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 days', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'a day', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 days', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 days', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'a month', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'a month', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'a month', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 months', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 months', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 months', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'a month', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 months', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'a year', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 years', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'a year', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 years', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'in a few seconds', 'prefix');
+ assert.equal(moment(0).from(30000), 'a few seconds ago', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'a few seconds ago', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'in a few seconds', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'in 5 days', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Today at 12:00 PM', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Today at 12:25 PM', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Today at 1:00 PM', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Tomorrow at 12:00 PM', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Today at 11:00 AM', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Yesterday at 12:00 PM', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [at] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [at] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [at] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[Last] dddd [at] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[Last] dddd [at] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[Last] dddd [at] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52nd', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1st', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1st', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2nd', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2nd', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('en');
+
+test('parse', function (assert) {
+ var i,
+ tests = 'January Jan_February Feb_March Mar_April Apr_May May_June Jun_July Jul_August Aug_September Sep_October Oct_November Nov_December Dec'.split('_');
+
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Sunday, February 14th 2010, 3:25:50 pm'],
+ ['ddd, hA', 'Sun, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2nd 02 February Feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14th 14'],
+ ['d do dddd ddd dd', '0 0th Sunday Sun Su'],
+ ['DDD DDDo DDDD', '45 45th 045'],
+ ['w wo ww', '8 8th 08'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45th day of the year'],
+ ['LTS', '3:25:50 PM'],
+ ['L', '02/14/2010'],
+ ['LL', 'February 14, 2010'],
+ ['LLL', 'February 14, 2010 3:25 PM'],
+ ['LLLL', 'Sunday, February 14, 2010 3:25 PM'],
+ ['l', '2/14/2010'],
+ ['ll', 'Feb 14, 2010'],
+ ['lll', 'Feb 14, 2010 3:25 PM'],
+ ['llll', 'Sun, Feb 14, 2010 3:25 PM']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1st', '1st');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2nd', '2nd');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3rd', '3rd');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4th', '4th');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5th', '5th');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6th', '6th');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7th', '7th');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8th', '8th');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9th', '9th');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10th', '10th');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11th', '11th');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12th', '12th');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13th', '13th');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14th', '14th');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15th', '15th');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16th', '16th');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17th', '17th');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18th', '18th');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19th', '19th');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20th', '20th');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21st', '21st');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22nd', '22nd');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23rd', '23rd');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24th', '24th');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25th', '25th');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26th', '26th');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27th', '27th');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28th', '28th');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29th', '29th');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30th', '30th');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31st', '31st');
+});
+
+test('format month', function (assert) {
+ var i,
+ expected = 'January Jan_February Feb_March Mar_April Apr_May May_June Jun_July Jul_August Aug_September Sep_October Oct_November Nov_December Dec'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var i,
+ expected = 'Sunday Sun Su_Monday Mon Mo_Tuesday Tue Tu_Wednesday Wed We_Thursday Thu Th_Friday Fri Fr_Saturday Sat Sa'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'a few seconds', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'a minute', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'a minute', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutes', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutes', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'an hour', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'an hour', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 hours', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 hours', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 hours', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'a day', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'a day', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 days', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'a day', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 days', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 days', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'a month', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'a month', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'a month', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 months', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 months', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 months', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'a month', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 months', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'a year', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 years', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'a year', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 years', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'in a few seconds', 'prefix');
+ assert.equal(moment(0).from(30000), 'a few seconds ago', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'a few seconds ago', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'in a few seconds', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'in 5 days', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Today at 12:00 PM', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Today at 12:25 PM', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Today at 1:00 PM', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Tomorrow at 12:00 PM', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Today at 11:00 AM', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Yesterday at 12:00 PM', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [at] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [at] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [at] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[Last] dddd [at] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[Last] dddd [at] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[Last] dddd [at] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday format', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1st', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '1 01 1st', 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2nd', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '2 02 2nd', 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '3 03 3rd', 'Jan 15 2012 should be week 3');
+});
+
+test('weekdays strict parsing', function (assert) {
+ var m = moment('2015-01-01T12', moment.ISO_8601, true),
+ enLocale = moment.localeData('en');
+
+ for (var i = 0; i < 7; ++i) {
+ assert.equal(moment(enLocale.weekdays(m.day(i), ''), 'dddd', true).isValid(), true, 'parse weekday ' + i);
+ assert.equal(moment(enLocale.weekdaysShort(m.day(i), ''), 'ddd', true).isValid(), true, 'parse short weekday ' + i);
+ assert.equal(moment(enLocale.weekdaysMin(m.day(i), ''), 'dd', true).isValid(), true, 'parse min weekday ' + i);
+
+ // negative tests
+ assert.equal(moment(enLocale.weekdaysMin(m.day(i), ''), 'ddd', true).isValid(), false, 'parse short weekday ' + i);
+ assert.equal(moment(enLocale.weekdaysShort(m.day(i), ''), 'dd', true).isValid(), false, 'parse min weekday ' + i);
+ }
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('eo');
+
+test('parse', function (assert) {
+ var tests = 'januaro jan_februaro feb_marto mar_aprilo apr_majo maj_junio jun_julio jul_aŭgusto aŭg_septembro sep_oktobro okt_novembro nov_decembro dec'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Dimanĉo, februaro 14a 2010, 3:25:50 p.t.m.'],
+ ['ddd, hA', 'Dim, 3P.T.M.'],
+ ['M Mo MM MMMM MMM', '2 2a 02 februaro feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14a 14'],
+ ['d do dddd ddd dd', '0 0a Dimanĉo Dim Di'],
+ ['DDD DDDo DDDD', '45 45a 045'],
+ ['w wo ww', '7 7a 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'p.t.m. P.T.M.'],
+ ['[la] DDDo [tago] [de] [la] [jaro]', 'la 45a tago de la jaro'],
+ ['LTS', '15:25:50'],
+ ['L', '2010-02-14'],
+ ['LL', '14-an de februaro, 2010'],
+ ['LLL', '14-an de februaro, 2010 15:25'],
+ ['LLLL', 'Dimanĉo, la 14-an de februaro, 2010 15:25'],
+ ['l', '2010-2-14'],
+ ['ll', '14-an de feb, 2010'],
+ ['lll', '14-an de feb, 2010 15:25'],
+ ['llll', 'Dim, la 14-an de feb, 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1a', '1a');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2a', '2a');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3a', '3a');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4a', '4a');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5a', '5a');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6a', '6a');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7a', '7a');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8a', '8a');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9a', '9a');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10a', '10a');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11a', '11a');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12a', '12a');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13a', '13a');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14a', '14a');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15a', '15a');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16a', '16a');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17a', '17a');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18a', '18a');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19a', '19a');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20a', '20a');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21a', '21a');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22a', '22a');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23a', '23a');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24a', '24a');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25a', '25a');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26a', '26a');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27a', '27a');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28a', '28a');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29a', '29a');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30a', '30a');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31a', '31a');
+});
+
+test('format month', function (assert) {
+ var expected = 'januaro jan_februaro feb_marto mar_aprilo apr_majo maj_junio jun_julio jul_aŭgusto aŭg_septembro sep_oktobro okt_novembro nov_decembro dec'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Dimanĉo Dim Di_Lundo Lun Lu_Mardo Mard Ma_Merkredo Merk Me_Ĵaŭdo Ĵaŭ Ĵa_Vendredo Ven Ve_Sabato Sab Sa'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'sekundoj', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'minuto', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'minuto', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutoj', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutoj', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'horo', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'horo', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 horoj', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 horoj', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 horoj', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'tago', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'tago', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 tagoj', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'tago', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 tagoj', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 tagoj', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'monato', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'monato', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'monato', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 monatoj', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 monatoj', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 monatoj', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'monato', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 monatoj', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'jaro', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 jaroj', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'jaro', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 jaroj', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'je sekundoj', 'je prefix');
+ assert.equal(moment(0).from(30000), 'antaŭ sekundoj', 'antaŭ prefix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'antaŭ sekundoj', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'je sekundoj', 'je sekundoj');
+ assert.equal(moment().add({d: 5}).fromNow(), 'je 5 tagoj', 'je 5 tagoj');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Hodiaŭ je 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Hodiaŭ je 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Hodiaŭ je 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Morgaŭ je 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Hodiaŭ je 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Hieraŭ je 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [je] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [je] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [je] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[pasinta] dddd [je] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[pasinta] dddd [je] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[pasinta] dddd [je] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1a', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1a', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2a', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2a', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3a', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('es-do');
+
+test('parse', function (assert) {
+ var tests = 'enero ene._febrero feb._marzo mar._abril abr._mayo may._junio jun._julio jul._agosto ago._septiembre sep._octubre oct._noviembre nov._diciembre dic.'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'domingo, febrero 14º 2010, 3:25:50 pm'],
+ ['ddd, hA', 'dom., 3PM'],
+ ['M Mo MM MMMM MMM', '2 2º 02 febrero feb.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14º 14'],
+ ['d do dddd ddd dd', '0 0º domingo dom. do'],
+ ['DDD DDDo DDDD', '45 45º 045'],
+ ['w wo ww', '6 6º 06'],
+ ['YYYY-MMM-DD', '2010-feb-14'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45º day of the year'],
+ ['LTS', '3:25:50 PM'],
+ ['L', '14/02/2010'],
+ ['LL', '14 de febrero de 2010'],
+ ['LLL', '14 de febrero de 2010 3:25 PM'],
+ ['LLLL', 'domingo, 14 de febrero de 2010 3:25 PM'],
+ ['l', '14/2/2010'],
+ ['ll', '14 de feb. de 2010'],
+ ['lll', '14 de feb. de 2010 3:25 PM'],
+ ['llll', 'dom., 14 de feb. de 2010 3:25 PM']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1º', '1º');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2º', '2º');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3º', '3º');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4º', '4º');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5º', '5º');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6º', '6º');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7º', '7º');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8º', '8º');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9º', '9º');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10º', '10º');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11º', '11º');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12º', '12º');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13º', '13º');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14º', '14º');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15º', '15º');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16º', '16º');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17º', '17º');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18º', '18º');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19º', '19º');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20º', '20º');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21º', '21º');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22º', '22º');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23º', '23º');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24º', '24º');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25º', '25º');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26º', '26º');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27º', '27º');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28º', '28º');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29º', '29º');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30º', '30º');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31º', '31º');
+});
+
+test('format month', function (assert) {
+ var expected = 'enero ene._febrero feb._marzo mar._abril abr._mayo may._junio jun._julio jul._agosto ago._septiembre sep._octubre oct._noviembre nov._diciembre dic.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'domingo dom. do_lunes lun. lu_martes mar. ma_miércoles mié. mi_jueves jue. ju_viernes vie. vi_sábado sáb. sá'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'unos segundos', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'un minuto', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'un minuto', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutos', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutos', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'una hora', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'una hora', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 horas', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 horas', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 horas', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'un día', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'un día', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 días', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'un día', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 días', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 días', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'un mes', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'un mes', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'un mes', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 meses', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 meses', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 meses', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'un mes', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 meses', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'un año', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 años', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'un año', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 años', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'en unos segundos', 'prefix');
+ assert.equal(moment(0).from(30000), 'hace unos segundos', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'hace unos segundos', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'en unos segundos', 'en unos segundos');
+ assert.equal(moment().add({d: 5}).fromNow(), 'en 5 días', 'en 5 días');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'hoy a las 12:00 PM', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'hoy a las 12:25 PM', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'hoy a las 1:00 PM', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'mañana a las 12:00 PM', 'tomorrow at the same time');
+ assert.equal(moment(a).add({d: 1, h : -1}).calendar(), 'mañana a las 11:00 AM', 'tomorrow minus 1 hour');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'hoy a las 11:00 AM', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'ayer a las 12:00 PM', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [a la' + ((m.hours() !== 1) ? 's' : '') + '] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [a la' + ((m.hours() !== 1) ? 's' : '') + '] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [a la' + ((m.hours() !== 1) ? 's' : '') + '] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[el] dddd [pasado a la' + ((m.hours() !== 1) ? 's' : '') + '] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[el] dddd [pasado a la' + ((m.hours() !== 1) ? 's' : '') + '] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[el] dddd [pasado a la' + ((m.hours() !== 1) ? 's' : '') + '] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52º', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1º', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1º', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2º', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2º', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('es');
+
+test('parse', function (assert) {
+ var tests = 'enero ene._febrero feb._marzo mar._abril abr._mayo may._junio jun._julio jul._agosto ago._septiembre sep._octubre oct._noviembre nov._diciembre dic.'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'domingo, febrero 14º 2010, 3:25:50 pm'],
+ ['ddd, hA', 'dom., 3PM'],
+ ['M Mo MM MMMM MMM', '2 2º 02 febrero feb.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14º 14'],
+ ['d do dddd ddd dd', '0 0º domingo dom. do'],
+ ['DDD DDDo DDDD', '45 45º 045'],
+ ['w wo ww', '6 6º 06'],
+ ['YYYY-MMM-DD', '2010-feb-14'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45º day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 de febrero de 2010'],
+ ['LLL', '14 de febrero de 2010 15:25'],
+ ['LLLL', 'domingo, 14 de febrero de 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 de feb. de 2010'],
+ ['lll', '14 de feb. de 2010 15:25'],
+ ['llll', 'dom., 14 de feb. de 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1º', '1º');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2º', '2º');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3º', '3º');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4º', '4º');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5º', '5º');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6º', '6º');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7º', '7º');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8º', '8º');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9º', '9º');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10º', '10º');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11º', '11º');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12º', '12º');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13º', '13º');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14º', '14º');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15º', '15º');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16º', '16º');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17º', '17º');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18º', '18º');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19º', '19º');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20º', '20º');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21º', '21º');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22º', '22º');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23º', '23º');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24º', '24º');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25º', '25º');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26º', '26º');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27º', '27º');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28º', '28º');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29º', '29º');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30º', '30º');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31º', '31º');
+});
+
+test('format month', function (assert) {
+ var expected = 'enero ene._febrero feb._marzo mar._abril abr._mayo may._junio jun._julio jul._agosto ago._septiembre sep._octubre oct._noviembre nov._diciembre dic.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'domingo dom. do_lunes lun. lu_martes mar. ma_miércoles mié. mi_jueves jue. ju_viernes vie. vi_sábado sáb. sá'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'unos segundos', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'un minuto', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'un minuto', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutos', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutos', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'una hora', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'una hora', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 horas', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 horas', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 horas', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'un día', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'un día', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 días', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'un día', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 días', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 días', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'un mes', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'un mes', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'un mes', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 meses', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 meses', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 meses', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'un mes', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 meses', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'un año', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 años', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'un año', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 años', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'en unos segundos', 'prefix');
+ assert.equal(moment(0).from(30000), 'hace unos segundos', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'hace unos segundos', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'en unos segundos', 'en unos segundos');
+ assert.equal(moment().add({d: 5}).fromNow(), 'en 5 días', 'en 5 días');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'hoy a las 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'hoy a las 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'hoy a las 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'mañana a las 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).add({d: 1, h : -1}).calendar(), 'mañana a las 11:00', 'tomorrow minus 1 hour');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'hoy a las 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'ayer a las 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [a la' + ((m.hours() !== 1) ? 's' : '') + '] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [a la' + ((m.hours() !== 1) ? 's' : '') + '] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [a la' + ((m.hours() !== 1) ? 's' : '') + '] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[el] dddd [pasado a la' + ((m.hours() !== 1) ? 's' : '') + '] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[el] dddd [pasado a la' + ((m.hours() !== 1) ? 's' : '') + '] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[el] dddd [pasado a la' + ((m.hours() !== 1) ? 's' : '') + '] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52º', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1º', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1º', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2º', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2º', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('et');
+
+test('parse', function (assert) {
+ var tests = 'jaanuar jaan_veebruar veebr_märts märts_aprill apr_mai mai_juuni juuni_juuli juuli_august aug_september sept_oktoober okt_november nov_detsember dets'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' peaks olema kuu ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, H:mm:ss', 'pühapäev, 14. veebruar 2010, 15:25:50'],
+ ['ddd, h', 'P, 3'],
+ ['M Mo MM MMMM MMM', '2 2. 02 veebruar veebr'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. pühapäev P P'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '6 6. 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[aasta] DDDo [päev]', 'aasta 45. päev'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14. veebruar 2010'],
+ ['LLL', '14. veebruar 2010 15:25'],
+ ['LLLL', 'pühapäev, 14. veebruar 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14. veebr 2010'],
+ ['lll', '14. veebr 2010 15:25'],
+ ['llll', 'P, 14. veebr 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'jaanuar jaan_veebruar veebr_märts märts_aprill apr_mai mai_juuni juuni_juuli juuli_august aug_september sept_oktoober okt_november nov_detsember dets'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'pühapäev P P_esmaspäev E E_teisipäev T T_kolmapäev K K_neljapäev N N_reede R R_laupäev L L'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'paar sekundit', '44 seconds = paar sekundit');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'üks minut', '45 seconds = üks minut');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'üks minut', '89 seconds = üks minut');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutit', '90 seconds = 2 minutit');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutit', '44 minutes = 44 minutit');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'üks tund', '45 minutes = tund aega');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'üks tund', '89 minutes = üks tund');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 tundi', '90 minutes = 2 tundi');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 tundi', '5 hours = 5 tundi');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 tundi', '21 hours = 21 tundi');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'üks päev', '22 hours = üks päev');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'üks päev', '35 hours = üks päev');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 päeva', '36 hours = 2 päeva');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'üks päev', '1 day = üks päev');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 päeva', '5 days = 5 päeva');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 päeva', '25 days = 25 päeva');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'üks kuu', '26 days = üks kuu');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'üks kuu', '30 days = üks kuu');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'üks kuu', '43 days = üks kuu');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 kuud', '46 days = 2 kuud');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 kuud', '75 days = 2 kuud');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 kuud', '76 days = 3 kuud');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'üks kuu', '1 month = üks kuu');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 kuud', '5 months = 5 kuud');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'üks aasta', '345 days = üks aasta');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 aastat', '548 days = 2 aastat');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'üks aasta', '1 year = üks aasta');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 aastat', '5 years = 5 aastat');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'mõne sekundi pärast', 'prefix');
+ assert.equal(moment(0).from(30000), 'mõni sekund tagasi', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'mõni sekund tagasi', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'mõne sekundi pärast', 'in a few seconds');
+ assert.equal(moment().subtract({s: 30}).fromNow(), 'mõni sekund tagasi', 'a few seconds ago');
+
+ assert.equal(moment().add({m: 1}).fromNow(), 'ühe minuti pärast', 'in a minute');
+ assert.equal(moment().subtract({m: 1}).fromNow(), 'üks minut tagasi', 'a minute ago');
+
+ assert.equal(moment().add({m: 5}).fromNow(), '5 minuti pärast', 'in 5 minutes');
+ assert.equal(moment().subtract({m: 5}).fromNow(), '5 minutit tagasi', '5 minutes ago');
+
+ assert.equal(moment().add({d: 1}).fromNow(), 'ühe päeva pärast', 'in one day');
+ assert.equal(moment().subtract({d: 1}).fromNow(), 'üks päev tagasi', 'one day ago');
+
+ assert.equal(moment().add({d: 5}).fromNow(), '5 päeva pärast', 'in 5 days');
+ assert.equal(moment().subtract({d: 5}).fromNow(), '5 päeva tagasi', '5 days ago');
+
+ assert.equal(moment().add({M: 1}).fromNow(), 'kuu aja pärast', 'in a month');
+ assert.equal(moment().subtract({M: 1}).fromNow(), 'kuu aega tagasi', 'a month ago');
+
+ assert.equal(moment().add({M: 5}).fromNow(), '5 kuu pärast', 'in 5 months');
+ assert.equal(moment().subtract({M: 5}).fromNow(), '5 kuud tagasi', '5 months ago');
+
+ assert.equal(moment().add({y: 1}).fromNow(), 'ühe aasta pärast', 'in a year');
+ assert.equal(moment().subtract({y: 1}).fromNow(), 'aasta tagasi', 'a year ago');
+
+ assert.equal(moment().add({y: 5}).fromNow(), '5 aasta pärast', 'in 5 years');
+ assert.equal(moment().subtract({y: 5}).fromNow(), '5 aastat tagasi', '5 years ago');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Täna, 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Täna, 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Täna, 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Homme, 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Täna, 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Eile, 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('[Järgmine] dddd LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[Järgmine] dddd LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[Järgmine] dddd LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[Eelmine] dddd LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[Eelmine] dddd LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[Eelmine] dddd LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 nädal tagasi');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), '1 nädala pärast');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 nädalat tagasi');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), '2 nädala pärast');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52.', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1.', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1.', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2.', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2.', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('eu');
+
+test('parse', function (assert) {
+ var tests = 'urtarrila urt._otsaila ots._martxoa mar._apirila api._maiatza mai._ekaina eka._uztaila uzt._abuztua abu._iraila ira._urria urr._azaroa aza._abendua abe.'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'igandea, otsaila 14. 2010, 3:25:50 pm'],
+ ['ddd, hA', 'ig., 3PM'],
+ ['M Mo MM MMMM MMM', '2 2. 02 otsaila ots.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. igandea ig. ig'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '7 7. 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45. day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '2010-02-14'],
+ ['LL', '2010ko otsailaren 14a'],
+ ['LLL', '2010ko otsailaren 14a 15:25'],
+ ['LLLL', 'igandea, 2010ko otsailaren 14a 15:25'],
+ ['l', '2010-2-14'],
+ ['ll', '2010ko ots. 14a'],
+ ['lll', '2010ko ots. 14a 15:25'],
+ ['llll', 'ig., 2010ko ots. 14a 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'urtarrila urt._otsaila ots._martxoa mar._apirila api._maiatza mai._ekaina eka._uztaila uzt._abuztua abu._iraila ira._urria urr._azaroa aza._abendua abe.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'igandea ig. ig_astelehena al. al_asteartea ar. ar_asteazkena az. az_osteguna og. og_ostirala ol. ol_larunbata lr. lr'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'segundo batzuk', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'minutu bat', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'minutu bat', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutu', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutu', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'ordu bat', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'ordu bat', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 ordu', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 ordu', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 ordu', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'egun bat', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'egun bat', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 egun', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'egun bat', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 egun', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 egun', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'hilabete bat', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'hilabete bat', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'hilabete bat', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 hilabete', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 hilabete', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 hilabete', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'hilabete bat', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 hilabete', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'urte bat', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 urte', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'urte bat', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 urte', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'segundo batzuk barru', 'prefix');
+ assert.equal(moment(0).from(30000), 'duela segundo batzuk', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'duela segundo batzuk', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'segundo batzuk barru', 'in seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), '5 egun barru', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'gaur 12:00etan', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'gaur 12:25etan', 'now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'gaur 13:00etan', 'now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'bihar 12:00etan', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'gaur 11:00etan', 'now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'atzo 12:00etan', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd LT[etan]'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd LT[etan]'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd LT[etan]'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[aurreko] dddd LT[etan]'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[aurreko] dddd LT[etan]'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[aurreko] dddd LT[etan]'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1.', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1.', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2.', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2.', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3.', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('fa');
+
+test('parse', function (assert) {
+ var tests = 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1) + ' instead is month ' + moment(input, mmm).month());
+ }
+ for (i = 0; i < 12; i++) {
+ equalTest(tests[i], 'MMM', i);
+ equalTest(tests[i], 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'یک\u200cشنبه، فوریه ۱۴م ۲۰۱۰، ۳:۲۵:۵۰ بعد از ظهر'],
+ ['ddd, hA', 'یک\u200cشنبه، ۳بعد از ظهر'],
+ ['M Mo MM MMMM MMM', '۲ ۲م ۰۲ فوریه فوریه'],
+ ['YYYY YY', '۲۰۱۰ ۱۰'],
+ ['D Do DD', '۱۴ ۱۴م ۱۴'],
+ ['d do dddd ddd dd', '۰ ۰م یک\u200cشنبه یک\u200cشنبه ی'],
+ ['DDD DDDo DDDD', '۴۵ ۴۵م ۰۴۵'],
+ ['w wo ww', '۸ ۸م ۰۸'],
+ ['h hh', '۳ ۰۳'],
+ ['H HH', '۱۵ ۱۵'],
+ ['m mm', '۲۵ ۲۵'],
+ ['s ss', '۵۰ ۵۰'],
+ ['a A', 'بعد از ظهر بعد از ظهر'],
+ ['DDDo [روز سال]', '۴۵م روز سال'],
+ ['LTS', '۱۵:۲۵:۵۰'],
+ ['L', '۱۴/۰۲/۲۰۱۰'],
+ ['LL', '۱۴ فوریه ۲۰۱۰'],
+ ['LLL', '۱۴ فوریه ۲۰۱۰ ۱۵:۲۵'],
+ ['LLLL', 'یک\u200cشنبه، ۱۴ فوریه ۲۰۱۰ ۱۵:۲۵'],
+ ['l', '۱۴/۲/۲۰۱۰'],
+ ['ll', '۱۴ فوریه ۲۰۱۰'],
+ ['lll', '۱۴ فوریه ۲۰۱۰ ۱۵:۲۵'],
+ ['llll', 'یک\u200cشنبه، ۱۴ فوریه ۲۰۱۰ ۱۵:۲۵']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '۱م', '1');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '۲م', '2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '۳م', '3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '۴م', '4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '۵م', '5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '۶م', '6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '۷م', '7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '۸م', '8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '۹م', '9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '۱۰م', '10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '۱۱م', '11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '۱۲م', '12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '۱۳م', '13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '۱۴م', '14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '۱۵م', '15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '۱۶م', '16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '۱۷م', '17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '۱۸م', '18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '۱۹م', '19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '۲۰م', '20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '۲۱م', '21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '۲۲م', '22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '۲۳م', '23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '۲۴م', '24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '۲۵م', '25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '۲۶م', '26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '۲۷م', '27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '۲۸م', '28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '۲۹م', '29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '۳۰م', '30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '۳۱م', '31');
+});
+
+test('format month', function (assert) {
+ var expected = 'ژانویه ژانویه_فوریه فوریه_مارس مارس_آوریل آوریل_مه مه_ژوئن ژوئن_ژوئیه ژوئیه_اوت اوت_سپتامبر سپتامبر_اکتبر اکتبر_نوامبر نوامبر_دسامبر دسامبر'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'یک\u200cشنبه یک\u200cشنبه ی_دوشنبه دوشنبه د_سه\u200cشنبه سه\u200cشنبه س_چهارشنبه چهارشنبه چ_پنج\u200cشنبه پنج\u200cشنبه پ_جمعه جمعه ج_شنبه شنبه ش'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'چندین ثانیه', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'یک دقیقه', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'یک دقیقه', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '۲ دقیقه', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '۴۴ دقیقه', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'یک ساعت', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'یک ساعت', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '۲ ساعت', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '۵ ساعت', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '۲۱ ساعت', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'یک روز', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'یک روز', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '۲ روز', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'یک روز', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '۵ روز', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '۲۵ روز', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'یک ماه', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'یک ماه', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'یک ماه', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '۲ ماه', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '۲ ماه', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '۳ ماه', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'یک ماه', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '۵ ماه', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'یک سال', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '۲ سال', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'یک سال', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '۵ سال', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'در چندین ثانیه', 'prefix');
+ assert.equal(moment(0).from(30000), 'چندین ثانیه پیش', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'چندین ثانیه پیش', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'در چندین ثانیه', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'در ۵ روز', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'امروز ساعت ۱۲:۰۰', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'امروز ساعت ۱۲:۲۵', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'امروز ساعت ۱۳:۰۰', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'فردا ساعت ۱۲:۰۰', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'امروز ساعت ۱۱:۰۰', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'دیروز ساعت ۱۲:۰۰', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [ساعت] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [ساعت] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [ساعت] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [پیش ساعت] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [پیش ساعت] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [پیش ساعت] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 31]).format('w ww wo'), '۱ ۰۱ ۱م', 'Dec 31 2011 should be week 1');
+ assert.equal(moment([2012, 0, 6]).format('w ww wo'), '۱ ۰۱ ۱م', 'Jan 6 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '۲ ۰۲ ۲م', 'Jan 7 2012 should be week 2');
+ assert.equal(moment([2012, 0, 13]).format('w ww wo'), '۲ ۰۲ ۲م', 'Jan 13 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '۳ ۰۳ ۳م', 'Jan 14 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('fi');
+
+test('parse', function (assert) {
+ var tests = 'tammikuu tammi_helmikuu helmi_maaliskuu maalis_huhtikuu huhti_toukokuu touko_kesäkuu kesä_heinäkuu heinä_elokuu elo_syyskuu syys_lokakuu loka_marraskuu marras_joulukuu joulu'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'sunnuntai, helmikuu 14. 2010, 3:25:50 pm'],
+ ['ddd, hA', 'su, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2. 02 helmikuu helmi'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. sunnuntai su su'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '6 6. 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[vuoden] DDDo [päivä]', 'vuoden 45. päivä'],
+ ['LTS', '15.25.50'],
+ ['L', '14.02.2010'],
+ ['LL', '14. helmikuuta 2010'],
+ ['LLL', '14. helmikuuta 2010, klo 15.25'],
+ ['LLLL', 'sunnuntai, 14. helmikuuta 2010, klo 15.25'],
+ ['l', '14.2.2010'],
+ ['ll', '14. helmi 2010'],
+ ['lll', '14. helmi 2010, klo 15.25'],
+ ['llll', 'su, 14. helmi 2010, klo 15.25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1st');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2nd');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3rd');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4th');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5th');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6th');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7th');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8th');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9th');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10th');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11th');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12th');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13th');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14th');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15th');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16th');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17th');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18th');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19th');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20th');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21st');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22nd');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23rd');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24th');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25th');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26th');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27th');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28th');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29th');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30th');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31st');
+});
+
+test('format month', function (assert) {
+ var expected = 'tammikuu tammi_helmikuu helmi_maaliskuu maalis_huhtikuu huhti_toukokuu touko_kesäkuu kesä_heinäkuu heinä_elokuu elo_syyskuu syys_lokakuu loka_marraskuu marras_joulukuu joulu'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'sunnuntai su su_maanantai ma ma_tiistai ti ti_keskiviikko ke ke_torstai to to_perjantai pe pe_lauantai la la'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'muutama sekunti', '44 seconds = few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'minuutti', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'minuutti', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), 'kaksi minuuttia', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minuuttia', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'tunti', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'tunti', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), 'kaksi tuntia', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), 'viisi tuntia', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 tuntia', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'päivä', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'päivä', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), 'kaksi päivää', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'päivä', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), 'viisi päivää', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 päivää', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'kuukausi', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'kuukausi', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'kuukausi', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), 'kaksi kuukautta', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), 'kaksi kuukautta', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), 'kolme kuukautta', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'kuukausi', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), 'viisi kuukautta', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'vuosi', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), 'kaksi vuotta', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'vuosi', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), 'viisi vuotta', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'muutaman sekunnin päästä', 'prefix');
+ assert.equal(moment(0).from(30000), 'muutama sekunti sitten', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'muutama sekunti sitten', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'muutaman sekunnin päästä', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'viiden päivän päästä', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'tänään klo 12.00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'tänään klo 12.25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'tänään klo 13.00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'huomenna klo 12.00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'tänään klo 11.00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'eilen klo 12.00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [klo] LT'), 'today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [klo] LT'), 'today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [klo] LT'), 'today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[viime] dddd[na] [klo] LT'), 'today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[viime] dddd[na] [klo] LT'), 'today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[viime] dddd[na] [klo] LT'), 'today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), 'yksi viikko sitten');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'yhden viikon päästä');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), 'kaksi viikkoa sitten');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'kaden viikon päästä');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52.', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1.', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1.', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2.', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2.', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('fo');
+
+test('parse', function (assert) {
+ var tests = 'januar jan_februar feb_mars mar_apríl apr_mai mai_juni jun_juli jul_august aug_september sep_oktober okt_november nov_desember des'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd [tann] Do MMMM YYYY, h:mm:ss a', 'sunnudagur tann 14. februar 2010, 3:25:50 pm'],
+ ['ddd hA', 'sun 3PM'],
+ ['M Mo MM MMMM MMM', '2 2. 02 februar feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. sunnudagur sun su'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '6 6. 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[tann] DDDo [dagin á árinum]', 'tann 45. dagin á árinum'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 februar 2010'],
+ ['LLL', '14 februar 2010 15:25'],
+ ['LLLL', 'sunnudagur 14. februar, 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 feb 2010'],
+ ['lll', '14 feb 2010 15:25'],
+ ['llll', 'sun 14. feb, 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'januar jan_februar feb_mars mar_apríl apr_mai mai_juni jun_juli jul_august aug_september sep_oktober okt_november nov_desember des'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'sunnudagur sun su_mánadagur mán má_týsdagur týs tý_mikudagur mik mi_hósdagur hós hó_fríggjadagur frí fr_leygardagur ley le'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'fá sekund', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'ein minutt', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'ein minutt', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minuttir', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minuttir', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'ein tími', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'ein tími', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 tímar', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 tímar', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 tímar', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'ein dagur', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'ein dagur', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dagar', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'ein dagur', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dagar', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dagar', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'ein mánaði', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'ein mánaði', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'ein mánaði', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 mánaðir', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 mánaðir', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 mánaðir', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'ein mánaði', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 mánaðir', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'eitt ár', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 ár', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'eitt ár', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 ár', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'um fá sekund', 'prefix');
+ assert.equal(moment(0).from(30000), 'fá sekund síðani', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'fá sekund síðani', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'um fá sekund', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'um 5 dagar', 'in 5 days');
+});
+
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Í dag kl. 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Í dag kl. 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Í dag kl. 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Í morgin kl. 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Í dag kl. 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Í gjár kl. 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [kl.] LT'), 'today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [kl.] LT'), 'today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [kl.] LT'), 'today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[síðstu] dddd [kl] LT'), 'today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[síðstu] dddd [kl] LT'), 'today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[síðstu] dddd [kl] LT'), 'today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), 'yksi viikko sitten');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'yhden viikon päästä');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), 'kaksi viikkoa sitten');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'kaden viikon päästä');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52.', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1.', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1.', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2.', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2.', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('fr-ca');
+
+test('parse', function (assert) {
+ var i,
+ tests = 'janvier janv._février févr._mars mars_avril avr._mai mai_juin juin_juillet juil._août août_septembre sept._octobre oct._novembre nov._décembre déc.'.split('_');
+
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'dimanche, février 14e 2010, 3:25:50 pm'],
+ ['ddd, hA', 'dim., 3PM'],
+ ['M Mo MM MMMM MMM', '2 2e 02 février févr.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14e 14'],
+ ['d do dddd ddd dd', '0 0e dimanche dim. Di'],
+ ['DDD DDDo DDDD', '45 45e 045'],
+ ['w wo ww', '8 8e 08'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45e day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '2010-02-14'],
+ ['LL', '14 février 2010'],
+ ['LLL', '14 février 2010 15:25'],
+ ['LLLL', 'dimanche 14 février 2010 15:25'],
+ ['l', '2010-2-14'],
+ ['ll', '14 févr. 2010'],
+ ['lll', '14 févr. 2010 15:25'],
+ ['llll', 'dim. 14 févr. 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1er', '1er');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2e', '2e');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3e', '3e');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4e', '4e');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5e', '5e');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6e', '6e');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7e', '7e');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8e', '8e');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9e', '9e');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10e', '10e');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11e', '11e');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12e', '12e');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13e', '13e');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14e', '14e');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15e', '15e');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16e', '16e');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17e', '17e');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18e', '18e');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19e', '19e');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20e', '20e');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21e', '21e');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22e', '22e');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23e', '23e');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24e', '24e');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25e', '25e');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26e', '26e');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27e', '27e');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28e', '28e');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29e', '29e');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30e', '30e');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31e', '31e');
+});
+
+test('format month', function (assert) {
+ var i,
+ expected = 'janvier janv._février févr._mars mars_avril avr._mai mai_juin juin_juillet juil._août août_septembre sept._octobre oct._novembre nov._décembre déc.'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var i,
+ expected = 'dimanche dim. Di_lundi lun. Lu_mardi mar. Ma_mercredi mer. Me_jeudi jeu. Je_vendredi ven. Ve_samedi sam. Sa'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'quelques secondes', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'une minute', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'une minute', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutes', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutes', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'une heure', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'une heure', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 heures', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 heures', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 heures', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'un jour', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'un jour', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 jours', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'un jour', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 jours', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 jours', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'un mois', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'un mois', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'un mois', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 mois', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 mois', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 mois', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'un mois', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 mois', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'un an', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 ans', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'un an', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 ans', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'dans quelques secondes', 'prefix');
+ assert.equal(moment(0).from(30000), 'il y a quelques secondes', 'suffix');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'dans quelques secondes', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'dans 5 jours', 'in 5 days');
+});
+
+test('same day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Aujourd\'hui à 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Aujourd\'hui à 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Aujourd\'hui à 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Demain à 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Aujourd\'hui à 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Hier à 12:00', 'yesterday at the same time');
+});
+
+test('same next week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [à] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [à] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [à] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('same last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [dernier à] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [dernier à] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [dernier à] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('same all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday format', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1er', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '1 01 1er', 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2e', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '2 02 2e', 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '3 03 3e', 'Jan 15 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('fr-ch');
+
+test('parse', function (assert) {
+ var i,
+ tests = 'janvier janv._février févr._mars mars_avril avr._mai mai_juin juin_juillet juil._août août_septembre sept._octobre oct._novembre nov._décembre déc.'.split('_');
+
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'dimanche, février 14e 2010, 3:25:50 pm'],
+ ['ddd, hA', 'dim., 3PM'],
+ ['M Mo MM MMMM MMM', '2 2e 02 février févr.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14e 14'],
+ ['d do dddd ddd dd', '0 0e dimanche dim. Di'],
+ ['DDD DDDo DDDD', '45 45e 045'],
+ ['w wo ww', '6 6e 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45e day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14 février 2010'],
+ ['LLL', '14 février 2010 15:25'],
+ ['LLLL', 'dimanche 14 février 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14 févr. 2010'],
+ ['lll', '14 févr. 2010 15:25'],
+ ['llll', 'dim. 14 févr. 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1er', '1er');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2e', '2e');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3e', '3e');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4e', '4e');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5e', '5e');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6e', '6e');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7e', '7e');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8e', '8e');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9e', '9e');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10e', '10e');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11e', '11e');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12e', '12e');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13e', '13e');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14e', '14e');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15e', '15e');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16e', '16e');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17e', '17e');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18e', '18e');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19e', '19e');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20e', '20e');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21e', '21e');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22e', '22e');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23e', '23e');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24e', '24e');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25e', '25e');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26e', '26e');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27e', '27e');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28e', '28e');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29e', '29e');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30e', '30e');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31e', '31e');
+});
+
+test('format month', function (assert) {
+ var i,
+ expected = 'janvier janv._février févr._mars mars_avril avr._mai mai_juin juin_juillet juil._août août_septembre sept._octobre oct._novembre nov._décembre déc.'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var i,
+ expected = 'dimanche dim. Di_lundi lun. Lu_mardi mar. Ma_mercredi mer. Me_jeudi jeu. Je_vendredi ven. Ve_samedi sam. Sa'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'quelques secondes', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'une minute', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'une minute', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutes', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutes', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'une heure', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'une heure', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 heures', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 heures', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 heures', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'un jour', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'un jour', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 jours', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'un jour', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 jours', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 jours', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'un mois', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'un mois', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'un mois', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 mois', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 mois', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 mois', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'un mois', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 mois', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'un an', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 ans', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'un an', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 ans', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'dans quelques secondes', 'prefix');
+ assert.equal(moment(0).from(30000), 'il y a quelques secondes', 'suffix');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'dans quelques secondes', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'dans 5 jours', 'in 5 days');
+});
+
+test('same day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Aujourd\'hui à 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Aujourd\'hui à 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Aujourd\'hui à 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Demain à 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Aujourd\'hui à 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Hier à 12:00', 'yesterday at the same time');
+});
+
+test('same next week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [à] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [à] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [à] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('same last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [dernier à] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [dernier à] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [dernier à] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('same all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52e', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1er', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1er', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2e', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2e', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('fr');
+
+test('parse', function (assert) {
+ var tests = 'janvier janv._février févr._mars mars_avril avr._mai mai_juin juin_juillet juil._août août_septembre sept._octobre oct._novembre nov._décembre déc.'.split('_'),
+ i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'dimanche, février 14 2010, 3:25:50 pm'],
+ ['ddd, hA', 'dim., 3PM'],
+ ['M Mo MM MMMM MMM', '2 2 02 février févr.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 dimanche dim. Di'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '6 6 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45 day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 février 2010'],
+ ['LLL', '14 février 2010 15:25'],
+ ['LLLL', 'dimanche 14 février 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 févr. 2010'],
+ ['lll', '14 févr. 2010 15:25'],
+ ['llll', 'dim. 14 févr. 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1er', '1er');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2', '2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3', '3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4', '4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5', '5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6', '6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7', '7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8', '8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9', '9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10', '10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11', '11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12', '12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13', '13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14', '14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15', '15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16', '16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17', '17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18', '18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19', '19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20', '20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21', '21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22', '22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23', '23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24', '24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25', '25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26', '26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27', '27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28', '28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29', '29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30', '30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31', '31');
+});
+
+test('format month', function (assert) {
+ var expected = 'janvier janv._février févr._mars mars_avril avr._mai mai_juin juin_juillet juil._août août_septembre sept._octobre oct._novembre nov._décembre déc.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'dimanche dim. Di_lundi lun. Lu_mardi mar. Ma_mercredi mer. Me_jeudi jeu. Je_vendredi ven. Ve_samedi sam. Sa'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'quelques secondes', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'une minute', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'une minute', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutes', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutes', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'une heure', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'une heure', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 heures', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 heures', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 heures', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'un jour', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'un jour', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 jours', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'un jour', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 jours', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 jours', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'un mois', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'un mois', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'un mois', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 mois', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 mois', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 mois', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'un mois', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 mois', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'un an', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 ans', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'un an', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 ans', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'dans quelques secondes', 'prefix');
+ assert.equal(moment(0).from(30000), 'il y a quelques secondes', 'suffix');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'dans quelques secondes', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'dans 5 jours', 'in 5 days');
+});
+
+test('same day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Aujourd\'hui à 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Aujourd\'hui à 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Aujourd\'hui à 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Demain à 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Aujourd\'hui à 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Hier à 12:00', 'yesterday at the same time');
+});
+
+test('same next week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [à] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [à] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [à] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('same last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [dernier à] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [dernier à] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [dernier à] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('same all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1er', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1er', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('fy');
+
+test('parse', function (assert) {
+ var tests = 'jannewaris jan._febrewaris feb._maart mrt._april apr._maaie mai._juny jun._july jul._augustus aug._septimber sep._oktober okt._novimber nov._desimber des.'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, HH:mm:ss', 'snein, febrewaris 14de 2010, 15:25:50'],
+ ['ddd, HH', 'si., 15'],
+ ['M Mo MM MMMM MMM', '2 2de 02 febrewaris feb.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14de 14'],
+ ['d do dddd ddd dd', '0 0de snein si. Si'],
+ ['DDD DDDo DDDD', '45 45ste 045'],
+ ['w wo ww', '6 6de 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45ste day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14-02-2010'],
+ ['LL', '14 febrewaris 2010'],
+ ['LLL', '14 febrewaris 2010 15:25'],
+ ['LLLL', 'snein 14 febrewaris 2010 15:25'],
+ ['l', '14-2-2010'],
+ ['ll', '14 feb. 2010'],
+ ['lll', '14 feb. 2010 15:25'],
+ ['llll', 'si. 14 feb. 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1ste', '1ste');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2de', '2de');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3de', '3de');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4de', '4de');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5de', '5de');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6de', '6de');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7de', '7de');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8ste', '8ste');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9de', '9de');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10de', '10de');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11de', '11de');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12de', '12de');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13de', '13de');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14de', '14de');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15de', '15de');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16de', '16de');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17de', '17de');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18de', '18de');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19de', '19de');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20ste', '20ste');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21ste', '21ste');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22ste', '22ste');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23ste', '23ste');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24ste', '24ste');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25ste', '25ste');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26ste', '26ste');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27ste', '27ste');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28ste', '28ste');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29ste', '29ste');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30ste', '30ste');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31ste', '31ste');
+});
+
+test('format month', function (assert) {
+ var expected = 'jannewaris jan._febrewaris feb._maart mrt._april apr._maaie mai_juny jun._july jul._augustus aug._septimber sep._oktober okt._novimber nov._desimber des.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'snein si. Si_moandei mo. Mo_tiisdei ti. Ti_woansdei wo. Wo_tongersdei to. To_freed fr. Fr_sneon so. So'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'in pear sekonden', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'ien minút', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'ien minút', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minuten', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minuten', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'ien oere', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'ien oere', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 oeren', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 oeren', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 oeren', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'ien dei', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'ien dei', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dagen', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'ien dei', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dagen', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dagen', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'ien moanne', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'ien moanne', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'ien moanne', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 moannen', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 moannen', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 moannen', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'ien moanne', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 moannen', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'ien jier', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 jierren', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'ien jier', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 jierren', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'oer in pear sekonden', 'prefix');
+ assert.equal(moment(0).from(30000), 'in pear sekonden lyn', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'in pear sekonden lyn', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'oer in pear sekonden', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'oer 5 dagen', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'hjoed om 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'hjoed om 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'hjoed om 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'moarn om 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'hjoed om 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'juster om 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [om] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [om] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [om] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[ôfrûne] dddd [om] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[ôfrûne] dddd [om] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[ôfrûne] dddd [om] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('month abbreviation', function (assert) {
+ assert.equal(moment([2012, 5, 23]).format('D-MMM-YYYY'), '23-jun-2012', 'format month abbreviation surrounded by dashes should not include a dot');
+ assert.equal(moment([2012, 5, 23]).format('D MMM YYYY'), '23 jun. 2012', 'format month abbreviation not surrounded by dashes should include a dot');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52ste', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1ste', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1ste', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2de', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2de', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('gd');
+
+var months = [
+ 'Am Faoilleach,Faoi',
+ 'An Gearran,Gear',
+ 'Am Màrt,Màrt',
+ 'An Giblean,Gibl',
+ 'An Cèitean,Cèit',
+ 'An t-Ògmhios,Ògmh',
+ 'An t-Iuchar,Iuch',
+ 'An Lùnastal,Lùn',
+ 'An t-Sultain,Sult',
+ 'An Dàmhair,Dàmh',
+ 'An t-Samhain,Samh',
+ 'An Dùbhlachd,Dùbh'
+];
+
+test('parse', function (assert) {
+ function equalTest(monthName, monthFormat, monthNum) {
+ assert.equal(moment(monthName, monthFormat).month(), monthNum, monthName + ' should be month ' + (monthNum + 1));
+ }
+
+ for (var i = 0; i < 12; i++) {
+ var testMonth = months[i].split(',');
+ equalTest(testMonth[0], 'MMM', i);
+ equalTest(testMonth[1], 'MMM', i);
+ equalTest(testMonth[0], 'MMMM', i);
+ equalTest(testMonth[1], 'MMMM', i);
+ equalTest(testMonth[0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(testMonth[1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(testMonth[0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(testMonth[1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Didòmhnaich, An Gearran 14mh 2010, 3:25:50 pm'],
+ ['ddd, hA', 'Did, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2na 02 An Gearran Gear'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14mh 14'],
+ ['d do dddd ddd dd', '0 0mh Didòmhnaich Did Dò'],
+ ['DDD DDDo DDDD', '45 45mh 045'],
+ ['w wo ww', '6 6mh 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[an] DDDo [latha den bhliadhna]', 'an 45mh latha den bhliadhna'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 An Gearran 2010'],
+ ['LLL', '14 An Gearran 2010 15:25'],
+ ['LLLL', 'Didòmhnaich, 14 An Gearran 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 Gear 2010'],
+ ['lll', '14 Gear 2010 15:25'],
+ ['llll', 'Did, 14 Gear 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1d', '1d');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2na', '2na');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3mh', '3mh');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4mh', '4mh');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5mh', '5mh');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6mh', '6mh');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7mh', '7mh');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8mh', '8mh');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9mh', '9mh');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10mh', '10mh');
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11mh', '11mh');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12na', '12na');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13mh', '13mh');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14mh', '14mh');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15mh', '15mh');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16mh', '16mh');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17mh', '17mh');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18mh', '18mh');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19mh', '19mh');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20mh', '20mh');
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21mh', '21mh');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22na', '22na');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23mh', '23mh');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24mh', '24mh');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25mh', '25mh');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26mh', '26mh');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27mh', '27mh');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28mh', '28mh');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29mh', '29mh');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30mh', '30mh');
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31mh', '31mh');
+});
+
+test('format month', function (assert) {
+ var expected = months;
+ for (var i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM,MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = ['Didòmhnaich Did Dò', 'Diluain Dil Lu', 'Dimàirt Dim Mà', 'Diciadain Dic Ci', 'Diardaoin Dia Ar', 'Dihaoine Dih Ha', 'Disathairne Dis Sa'];
+ for (var i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'beagan diogan', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'mionaid', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'mionaid', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 mionaidean', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 mionaidean', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'uair', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'uair', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 uairean', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 uairean', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 uairean', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'latha', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'latha', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 latha', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'latha', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 latha', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 latha', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'mìos', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'mìos', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'mìos', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 mìosan', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 mìosan', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 mìosan', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'mìos', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 mìosan', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'bliadhna', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 bliadhna', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'bliadhna', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 bliadhna', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'ann an beagan diogan', 'prefix');
+ assert.equal(moment(0).from(30000), 'bho chionn beagan diogan', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'bho chionn beagan diogan', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'ann an beagan diogan', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'ann an 5 latha', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'An-diugh aig 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'An-diugh aig 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'An-diugh aig 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'A-màireach aig 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'An-diugh aig 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'An-dè aig 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [aig] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [aig] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [aig] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [seo chaidh] [aig] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [seo chaidh] [aig] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [seo chaidh] [aig] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52na', 'Faoi 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1d', 'Faoi 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1d', 'Faoi 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2na', 'Faoi 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2na', 'Faoi 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('gl');
+
+test('parse', function (assert) {
+ var tests = 'xaneiro xan._febreiro feb._marzo mar._abril abr._maio mai._xuño xuñ._xullo xul._agosto ago._setembro set._outubro out._novembro nov._decembro dec.'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'domingo, febreiro 14º 2010, 3:25:50 pm'],
+ ['ddd, hA', 'dom., 3PM'],
+ ['M Mo MM MMMM MMM', '2 2º 02 febreiro feb.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14º 14'],
+ ['d do dddd ddd dd', '0 0º domingo dom. do'],
+ ['DDD DDDo DDDD', '45 45º 045'],
+ ['w wo ww', '6 6º 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45º day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 de febreiro de 2010'],
+ ['LLL', '14 de febreiro de 2010 15:25'],
+ ['LLLL', 'domingo, 14 de febreiro de 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 de feb. de 2010'],
+ ['lll', '14 de feb. de 2010 15:25'],
+ ['llll', 'dom., 14 de feb. de 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1º', '1º');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2º', '2º');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3º', '3º');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4º', '4º');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5º', '5º');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6º', '6º');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7º', '7º');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8º', '8º');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9º', '9º');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10º', '10º');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11º', '11º');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12º', '12º');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13º', '13º');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14º', '14º');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15º', '15º');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16º', '16º');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17º', '17º');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18º', '18º');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19º', '19º');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20º', '20º');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21º', '21º');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22º', '22º');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23º', '23º');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24º', '24º');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25º', '25º');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26º', '26º');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27º', '27º');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28º', '28º');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29º', '29º');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30º', '30º');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31º', '31º');
+});
+
+test('format month', function (assert) {
+ var expected = 'xaneiro xan._febreiro feb._marzo mar._abril abr._maio mai._xuño xuñ._xullo xul._agosto ago._setembro set._outubro out._novembro nov._decembro dec.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'domingo dom. do_luns lun. lu_martes mar. ma_mércores mér. mé_xoves xov. xo_venres ven. ve_sábado sáb. sá'.split('_'),
+ i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'uns segundos', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'un minuto', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'un minuto', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutos', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutos', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'unha hora', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'unha hora', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 horas', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 horas', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 horas', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'un día', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'un día', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 días', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'un día', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 días', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 días', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'un mes', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'un mes', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'un mes', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 meses', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 meses', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 meses', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'un mes', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 meses', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'un ano', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 anos', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'un ano', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 anos', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'nuns segundos', 'prefix');
+ assert.equal(moment(0).from(30000), 'hai uns segundos', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'hai uns segundos', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'nuns segundos', 'nuns segundos');
+ assert.equal(moment().add({d: 5}).fromNow(), 'en 5 días', 'en 5 días');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'hoxe ás 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'hoxe ás 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'hoxe ás 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'mañá ás 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).add({d: 1, h : -1}).calendar(), 'mañá ás 11:00', 'tomorrow minus 1 hour');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'hoxe ás 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'onte á 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [' + ((m.hours() !== 1) ? 'ás' : 'a') + '] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [' + ((m.hours() !== 1) ? 'ás' : 'a') + '] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [' + ((m.hours() !== 1) ? 'ás' : 'a') + '] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[o] dddd [pasado ' + ((m.hours() !== 1) ? 'ás' : 'a') + '] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[o] dddd [pasado ' + ((m.hours() !== 1) ? 'ás' : 'a') + '] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[o] dddd [pasado ' + ((m.hours() !== 1) ? 'ás' : 'a') + '] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('regression tests', function (assert) {
+ var lastWeek = moment().subtract({d: 4}).hours(1);
+ assert.equal(lastWeek.calendar(), lastWeek.format('[o] dddd [pasado a] LT'), '1 o\'clock bug');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52º', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1º', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1º', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2º', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2º', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('he');
+
+test('parse', function (assert) {
+ var tests = 'ינואר ינו׳_פברואר פבר׳_מרץ מרץ_אפריל אפר׳_מאי מאי_יוני יוני_יולי יולי_אוגוסט אוג׳_ספטמבר ספט׳_אוקטובר אוק׳_נובמבר נוב׳_דצמבר דצמ׳'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'ראשון, פברואר 14 2010, 3:25:50 אחה"צ'],
+ ['ddd, h A', 'א׳, 3 אחרי הצהריים'],
+ ['M Mo MM MMMM MMM', '2 2 02 פברואר פבר׳'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 ראשון א׳ א'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '8 8 08'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'אחה"צ אחרי הצהריים'],
+ ['[the] DDDo [day of the year]', 'the 45 day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 בפברואר 2010'],
+ ['LLL', '14 בפברואר 2010 15:25'],
+ ['LLLL', 'ראשון, 14 בפברואר 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 פבר׳ 2010'],
+ ['lll', '14 פבר׳ 2010 15:25'],
+ ['llll', 'א׳, 14 פבר׳ 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format month', function (assert) {
+ var expected = 'ינואר ינו׳_פברואר פבר׳_מרץ מרץ_אפריל אפר׳_מאי מאי_יוני יוני_יולי יולי_אוגוסט אוג׳_ספטמבר ספט׳_אוקטובר אוק׳_נובמבר נוב׳_דצמבר דצמ׳'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'ראשון א׳ א|שני ב׳ ב|שלישי ג׳ ג|רביעי ד׳ ד|חמישי ה׳ ה|שישי ו׳ ו|שבת ש׳ ש'.split('|'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'מספר שניות', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'דקה', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'דקה', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 דקות', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 דקות', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'שעה', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'שעה', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), 'שעתיים', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 שעות', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 שעות', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'יום', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'יום', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), 'יומיים', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'יום', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 ימים', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 ימים', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'חודש', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'חודש', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'חודש', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), 'חודשיים', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), 'חודשיים', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 חודשים', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'חודש', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 חודשים', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'שנה', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), 'שנתיים', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 3699}), true), '10 שנים', '345 days = 10 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 7340}), true), '20 שנה', '548 days = 20 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'שנה', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 שנים', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'בעוד מספר שניות', 'prefix');
+ assert.equal(moment(0).from(30000), 'לפני מספר שניות', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'לפני מספר שניות', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'בעוד מספר שניות', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'בעוד 5 ימים', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'היום ב־12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'היום ב־12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'היום ב־13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'מחר ב־12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'היום ב־11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'אתמול ב־12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [בשעה] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [בשעה] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [בשעה] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[ביום] dddd [האחרון בשעה] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[ביום] dddd [האחרון בשעה] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[ביום] dddd [האחרון בשעה] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday format', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '1 01 1', 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '2 02 2', 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '3 03 3', 'Jan 15 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('hi');
+
+test('parse', function (assert) {
+ var tests = 'जनवरी जन._फ़रवरी फ़र._मार्च मार्च_अप्रैल अप्रै._मई मई_जून जून_जुलाई जुल._अगस्त अग._सितम्बर सित._अक्टूबर अक्टू._नवम्बर नव._दिसम्बर दिस.'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, a h:mm:ss बजे', 'रविवार, १४ फ़रवरी २०१०, दोपहर ३:२५:५० बजे'],
+ ['ddd, a h बजे', 'रवि, दोपहर ३ बजे'],
+ ['M Mo MM MMMM MMM', '२ २ ०२ फ़रवरी फ़र.'],
+ ['YYYY YY', '२०१० १०'],
+ ['D Do DD', '१४ १४ १४'],
+ ['d do dddd ddd dd', '० ० रविवार रवि र'],
+ ['DDD DDDo DDDD', '४५ ४५ ०४५'],
+ ['w wo ww', '८ ८ ०८'],
+ ['h hh', '३ ०३'],
+ ['H HH', '१५ १५'],
+ ['m mm', '२५ २५'],
+ ['s ss', '५० ५०'],
+ ['a A', 'दोपहर दोपहर'],
+ ['LTS', 'दोपहर ३:२५:५० बजे'],
+ ['L', '१४/०२/२०१०'],
+ ['LL', '१४ फ़रवरी २०१०'],
+ ['LLL', '१४ फ़रवरी २०१०, दोपहर ३:२५ बजे'],
+ ['LLLL', 'रविवार, १४ फ़रवरी २०१०, दोपहर ३:२५ बजे'],
+ ['l', '१४/२/२०१०'],
+ ['ll', '१४ फ़र. २०१०'],
+ ['lll', '१४ फ़र. २०१०, दोपहर ३:२५ बजे'],
+ ['llll', 'रवि, १४ फ़र. २०१०, दोपहर ३:२५ बजे']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '१', '१');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '२', '२');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '३', '३');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '४', '४');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '५', '५');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '६', '६');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '७', '७');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '८', '८');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '९', '९');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '१०', '१०');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '११', '११');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '१२', '१२');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '१३', '१३');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '१४', '१४');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '१५', '१५');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '१६', '१६');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '१७', '१७');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '१८', '१८');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '१९', '१९');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '२०', '२०');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '२१', '२१');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '२२', '२२');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '२३', '२३');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '२४', '२४');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '२५', '२५');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '२६', '२६');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '२७', '२७');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '२८', '२८');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '२९', '२९');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '३०', '३०');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '३१', '३१');
+});
+
+test('format month', function (assert) {
+ var expected = 'जनवरी जन._फ़रवरी फ़र._मार्च मार्च_अप्रैल अप्रै._मई मई_जून जून_जुलाई जुल._अगस्त अग._सितम्बर सित._अक्टूबर अक्टू._नवम्बर नव._दिसम्बर दिस.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'रविवार रवि र_सोमवार सोम सो_मंगलवार मंगल मं_बुधवार बुध बु_गुरूवार गुरू गु_शुक्रवार शुक्र शु_शनिवार शनि श'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'कुछ ही क्षण', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'एक मिनट', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'एक मिनट', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '२ मिनट', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '४४ मिनट', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'एक घंटा', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'एक घंटा', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '२ घंटे', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '५ घंटे', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '२१ घंटे', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'एक दिन', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'एक दिन', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '२ दिन', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'एक दिन', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '५ दिन', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '२५ दिन', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'एक महीने', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'एक महीने', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'एक महीने', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '२ महीने', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '२ महीने', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '३ महीने', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'एक महीने', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '५ महीने', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'एक वर्ष', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '२ वर्ष', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'एक वर्ष', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '५ वर्ष', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'कुछ ही क्षण में', 'prefix');
+ assert.equal(moment(0).from(30000), 'कुछ ही क्षण पहले', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'कुछ ही क्षण पहले', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'कुछ ही क्षण में', 'कुछ ही क्षण में');
+ assert.equal(moment().add({d: 5}).fromNow(), '५ दिन में', '५ दिन में');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'आज दोपहर १२:०० बजे', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'आज दोपहर १२:२५ बजे', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 3}).calendar(), 'आज दोपहर ३:०० बजे', 'Now plus 3 hours');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'कल दोपहर १२:०० बजे', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'आज दोपहर ११:०० बजे', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'कल दोपहर १२:०० बजे', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd[,] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd[,] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd[,] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[पिछले] dddd[,] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[पिछले] dddd[,] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[पिछले] dddd[,] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('meridiem', function (assert) {
+ assert.equal(moment([2011, 2, 23, 2, 30]).format('a'), 'रात', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 9, 30]).format('a'), 'सुबह', 'morning');
+ assert.equal(moment([2011, 2, 23, 14, 30]).format('a'), 'दोपहर', 'during day');
+ assert.equal(moment([2011, 2, 23, 17, 30]).format('a'), 'शाम', 'evening');
+ assert.equal(moment([2011, 2, 23, 19, 30]).format('a'), 'शाम', 'late evening');
+ assert.equal(moment([2011, 2, 23, 21, 20]).format('a'), 'रात', 'night');
+
+ assert.equal(moment([2011, 2, 23, 2, 30]).format('A'), 'रात', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 9, 30]).format('A'), 'सुबह', 'morning');
+ assert.equal(moment([2011, 2, 23, 14, 30]).format('A'), 'दोपहर', ' during day');
+ assert.equal(moment([2011, 2, 23, 17, 30]).format('A'), 'शाम', 'evening');
+ assert.equal(moment([2011, 2, 23, 19, 30]).format('A'), 'शाम', 'late evening');
+ assert.equal(moment([2011, 2, 23, 21, 20]).format('A'), 'रात', 'night');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '१ ०१ १', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '१ ०१ १', 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '२ ०२ २', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '२ ०२ २', 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '३ ०३ ३', 'Jan 15 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('hr');
+
+test('parse', function (assert) {
+ var tests = 'siječanj sij._veljača velj._ožujak ožu._travanj tra._svibanj svi._lipanj lip._srpanj srp._kolovoz kol._rujan ruj._listopad lis._studeni stu._prosinac pro.'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, h:mm:ss a', 'nedjelja, 14. veljače 2010, 3:25:50 pm'],
+ ['ddd, hA', 'ned., 3PM'],
+ ['M Mo MM MMMM MMM', '2 2. 02 veljača velj.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. nedjelja ned. ne'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '7 7. 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45. day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14. veljača 2010'],
+ ['LLL', '14. veljača 2010 15:25'],
+ ['LLLL', 'nedjelja, 14. veljača 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14. velj. 2010'],
+ ['lll', '14. velj. 2010 15:25'],
+ ['llll', 'ned., 14. velj. 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'siječanj sij._veljača velj._ožujak ožu._travanj tra._svibanj svi._lipanj lip._srpanj srp._kolovoz kol._rujan ruj._listopad lis._studeni stu._prosinac pro.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'nedjelja ned. ne_ponedjeljak pon. po_utorak uto. ut_srijeda sri. sr_četvrtak čet. če_petak pet. pe_subota sub. su'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'par sekundi', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'jedna minuta', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'jedna minuta', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minute', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minuta', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'jedan sat', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'jedan sat', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 sata', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 sati', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 sati', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'dan', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'dan', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dana', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'dan', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dana', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dana', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'mjesec', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'mjesec', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'mjesec', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 mjeseca', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 mjeseca', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 mjeseca', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'mjesec', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 mjeseci', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'godinu', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 godine', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'godinu', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 godina', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'za par sekundi', 'prefix');
+ assert.equal(moment(0).from(30000), 'prije par sekundi', 'prefix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'prije par sekundi', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'za par sekundi', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'za 5 dana', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'danas u 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'danas u 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'danas u 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'sutra u 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'danas u 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'jučer u 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ function makeFormat(d) {
+ switch (d.day()) {
+ case 0:
+ return '[u] [nedjelju] [u] LT';
+ case 3:
+ return '[u] [srijedu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ }
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ function makeFormat(d) {
+ switch (d.day()) {
+ case 0:
+ case 3:
+ return '[prošlu] dddd [u] LT';
+ case 6:
+ return '[prošle] [subote] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[prošli] dddd [u] LT';
+ }
+ }
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1.', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1.', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2.', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2.', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3.', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('hu');
+
+test('parse', function (assert) {
+ var tests = 'január jan_február feb_március márc_április ápr_május máj_június jún_július júl_augusztus aug_szeptember szept_október okt_november nov_december dec'.split('_'),
+ i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, HH:mm:ss', 'vasárnap, február 14. 2010, 15:25:50'],
+ ['ddd, HH', 'vas, 15'],
+ ['M Mo MM MMMM MMM', '2 2. 02 február feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. vasárnap vas v'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '6 6. 06'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['[az év] DDDo [napja]', 'az év 45. napja'],
+ ['LTS', '15:25:50'],
+ ['L', '2010.02.14.'],
+ ['LL', '2010. február 14.'],
+ ['LLL', '2010. február 14. 15:25'],
+ ['LLLL', '2010. február 14., vasárnap 15:25'],
+ ['l', '2010.2.14.'],
+ ['ll', '2010. feb 14.'],
+ ['lll', '2010. feb 14. 15:25'],
+ ['llll', '2010. feb 14., vas 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('meridiem', function (assert) {
+ assert.equal(moment([2011, 2, 23, 0, 0]).format('a'), 'de', 'am');
+ assert.equal(moment([2011, 2, 23, 11, 59]).format('a'), 'de', 'am');
+ assert.equal(moment([2011, 2, 23, 12, 0]).format('a'), 'du', 'pm');
+ assert.equal(moment([2011, 2, 23, 23, 59]).format('a'), 'du', 'pm');
+
+ assert.equal(moment([2011, 2, 23, 0, 0]).format('A'), 'DE', 'AM');
+ assert.equal(moment([2011, 2, 23, 11, 59]).format('A'), 'DE', 'AM');
+ assert.equal(moment([2011, 2, 23, 12, 0]).format('A'), 'DU', 'PM');
+ assert.equal(moment([2011, 2, 23, 23, 59]).format('A'), 'DU', 'PM');
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'január jan_február feb_március márc_április ápr_május máj_június jún_július júl_augusztus aug_szeptember szept_október okt_november nov_december dec'.split('_'),
+ i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'vasárnap vas_hétfő hét_kedd kedd_szerda sze_csütörtök csüt_péntek pén_szombat szo'.split('_'),
+ i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'néhány másodperc', '44 másodperc = néhány másodperc');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'egy perc', '45 másodperc = egy perc');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'egy perc', '89 másodperc = egy perc');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 perc', '90 másodperc = 2 perc');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 perc', '44 perc = 44 perc');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'egy óra', '45 perc = egy óra');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'egy óra', '89 perc = egy óra');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 óra', '90 perc = 2 óra');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 óra', '5 óra = 5 óra');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 óra', '21 óra = 21 óra');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'egy nap', '22 óra = egy nap');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'egy nap', '35 óra = egy nap');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 nap', '36 óra = 2 nap');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'egy nap', '1 nap = egy nap');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 nap', '5 nap = 5 nap');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 nap', '25 nap = 25 nap');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'egy hónap', '26 nap = egy hónap');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'egy hónap', '30 nap = egy hónap');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'egy hónap', '45 nap = egy hónap');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 hónap', '46 nap = 2 hónap');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 hónap', '75 nap = 2 hónap');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 hónap', '76 nap = 3 hónap');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'egy hónap', '1 hónap = egy hónap');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 hónap', '5 hónap = 5 hónap');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'egy év', '345 nap = egy év');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 év', '548 nap = 2 év');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'egy év', '1 év = egy év');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 év', '5 év = 5 év');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'néhány másodperc múlva', 'prefix');
+ assert.equal(moment(0).from(30000), 'néhány másodperce', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'néhány másodperce', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'néhány másodperc múlva', 'néhány másodperc múlva');
+ assert.equal(moment().add({d: 5}).fromNow(), '5 nap múlva', '5 nap múlva');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'ma 12:00-kor', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'ma 12:25-kor', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'ma 13:00-kor', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'holnap 12:00-kor', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'ma 11:00-kor', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'tegnap 12:00-kor', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m, days = 'vasárnap_hétfőn_kedden_szerdán_csütörtökön_pénteken_szombaton'.split('_');
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('[' + days[m.day()] + '] LT[-kor]'), 'today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[' + days[m.day()] + '] LT[-kor]'), 'today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[' + days[m.day()] + '] LT[-kor]'), 'today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m, days = 'vasárnap_hétfőn_kedden_szerdán_csütörtökön_pénteken_szombaton'.split('_');
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[múlt ' + days[m.day()] + '] LT[-kor]'), 'today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[múlt ' + days[m.day()] + '] LT[-kor]'), 'today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[múlt ' + days[m.day()] + '] LT[-kor]'), 'today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), 'egy héte');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'egy hét múlva');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 hete');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), '2 hét múlva');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '52 52 52.', 'Dec 26 2011 should be week 52');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52.', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1.', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1.', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2.', 'Jan 9 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('hy-am');
+
+test('parse', function (assert) {
+ var tests = 'հունվար հնվ_փետրվար փտր_մարտ մրտ_ապրիլ ապր_մայիս մյս_հունիս հնս_հուլիս հլս_օգոստոս օգս_սեպտեմբեր սպտ_հոկտեմբեր հկտ_նոյեմբեր նմբ_դեկտեմբեր դկտ'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('parse exceptional case', function (assert) {
+ assert.equal(moment('11 մայիսի 1989', ['DD MMMM YYYY']).format('DD-MM-YYYY'), '11-05-1989');
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, HH:mm:ss', 'կիրակի, 14 փետրվարի 2010, 15:25:50'],
+ ['ddd, h A', 'կրկ, 3 ցերեկվա'],
+ ['M Mo MM MMMM MMM', '2 2 02 փետրվար փտր'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 կիրակի կրկ կրկ'],
+ ['DDD DDDo DDDD', '45 45-րդ 045'],
+ ['w wo ww', '7 7-րդ 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'ցերեկվա ցերեկվա'],
+ ['[տարվա] DDDo [օրը]', 'տարվա 45-րդ օրը'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14 փետրվարի 2010 թ.'],
+ ['LLL', '14 փետրվարի 2010 թ., 15:25'],
+ ['LLLL', 'կիրակի, 14 փետրվարի 2010 թ., 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14 փտր 2010 թ.'],
+ ['lll', '14 փտր 2010 թ., 15:25'],
+ ['llll', 'կրկ, 14 փտր 2010 թ., 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format meridiem', function (assert) {
+ assert.equal(moment([2012, 11, 28, 0, 0]).format('A'), 'գիշերվա', 'night');
+ assert.equal(moment([2012, 11, 28, 3, 59]).format('A'), 'գիշերվա', 'night');
+ assert.equal(moment([2012, 11, 28, 4, 0]).format('A'), 'առավոտվա', 'morning');
+ assert.equal(moment([2012, 11, 28, 11, 59]).format('A'), 'առավոտվա', 'morning');
+ assert.equal(moment([2012, 11, 28, 12, 0]).format('A'), 'ցերեկվա', 'afternoon');
+ assert.equal(moment([2012, 11, 28, 16, 59]).format('A'), 'ցերեկվա', 'afternoon');
+ assert.equal(moment([2012, 11, 28, 17, 0]).format('A'), 'երեկոյան', 'evening');
+ assert.equal(moment([2012, 11, 28, 23, 59]).format('A'), 'երեկոյան', 'evening');
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1-ին', '1-ին');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2-րդ', '2-րդ');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3-րդ', '3-րդ');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4-րդ', '4-րդ');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5-րդ', '5-րդ');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6-րդ', '6-րդ');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7-րդ', '7-րդ');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8-րդ', '8-րդ');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9-րդ', '9-րդ');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10-րդ', '10-րդ');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11-րդ', '11-րդ');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12-րդ', '12-րդ');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13-րդ', '13-րդ');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14-րդ', '14-րդ');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15-րդ', '15-րդ');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16-րդ', '16-րդ');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17-րդ', '17-րդ');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18-րդ', '18-րդ');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19-րդ', '19-րդ');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20-րդ', '20-րդ');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21-րդ', '21-րդ');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22-րդ', '22-րդ');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23-րդ', '23-րդ');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24-րդ', '24-րդ');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25-րդ', '25-րդ');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26-րդ', '26-րդ');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27-րդ', '27-րդ');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28-րդ', '28-րդ');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29-րդ', '29-րդ');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30-րդ', '30-րդ');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31-րդ', '31-րդ');
+});
+
+test('format month', function (assert) {
+ var expected = 'հունվար հնվ_փետրվար փտր_մարտ մրտ_ապրիլ ապր_մայիս մյս_հունիս հնս_հուլիս հլս_օգոստոս օգս_սեպտեմբեր սպտ_հոկտեմբեր հկտ_նոյեմբեր նմբ_դեկտեմբեր դկտ'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format month case', function (assert) {
+ var months = {
+ 'nominative': 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_'),
+ 'accusative': 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_')
+ }, i;
+ for (i = 0; i < 12; i++) {
+ assert.equal(moment([2011, i, 1]).format('D MMMM'), '1 ' + months.accusative[i], '1 ' + months.accusative[i]);
+ assert.equal(moment([2011, i, 1]).format('MMMM'), months.nominative[i], '1 ' + months.nominative[i]);
+ }
+});
+
+test('format month short case', function (assert) {
+ var monthsShort = {
+ 'nominative': 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'),
+ 'accusative': 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_')
+ }, i;
+ for (i = 0; i < 12; i++) {
+ assert.equal(moment([2011, i, 1]).format('D MMM'), '1 ' + monthsShort.accusative[i], '1 ' + monthsShort.accusative[i]);
+ assert.equal(moment([2011, i, 1]).format('MMM'), monthsShort.nominative[i], '1 ' + monthsShort.nominative[i]);
+ }
+});
+
+test('format month case with escaped symbols', function (assert) {
+ var months = {
+ 'nominative': 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_'),
+ 'accusative': 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_')
+ }, i;
+ for (i = 0; i < 12; i++) {
+ assert.equal(moment([2013, i, 1]).format('D[] MMMM'), '1 ' + months.accusative[i], '1 ' + months.accusative[i]);
+ assert.equal(moment([2013, i, 1]).format('[<i>]D[</i>] [<b>]MMMM[</b>]'), '<i>1</i> <b>' + months.accusative[i] + '</b>', '1 <b>' + months.accusative[i] + '</b>');
+ assert.equal(moment([2013, i, 1]).format('D[-ին օրը] MMMM'), '1-ին օրը ' + months.accusative[i], '1-ին օրը ' + months.accusative[i]);
+ assert.equal(moment([2013, i, 1]).format('D, MMMM'), '1, ' + months.nominative[i], '1, ' + months.nominative[i]);
+ }
+});
+
+test('format month short case with escaped symbols', function (assert) {
+ var monthsShort = {
+ 'nominative': 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'),
+ 'accusative': 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_')
+ }, i;
+ for (i = 0; i < 12; i++) {
+ assert.equal(moment([2013, i, 1]).format('D[] MMM'), '1 ' + monthsShort.accusative[i], '1 ' + monthsShort.accusative[i]);
+ assert.equal(moment([2013, i, 1]).format('[<i>]D[</i>] [<b>]MMM[</b>]'), '<i>1</i> <b>' + monthsShort.accusative[i] + '</b>', '1 <b>' + monthsShort.accusative[i] + '</b>');
+ assert.equal(moment([2013, i, 1]).format('D[-ին օրը] MMM'), '1-ին օրը ' + monthsShort.accusative[i], '1-ին օրը ' + monthsShort.accusative[i]);
+ assert.equal(moment([2013, i, 1]).format('D, MMM'), '1, ' + monthsShort.nominative[i], '1, ' + monthsShort.nominative[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'կիրակի կրկ կրկ_երկուշաբթի երկ երկ_երեքշաբթի երք երք_չորեքշաբթի չրք չրք_հինգշաբթի հնգ հնգ_ուրբաթ ուրբ ուրբ_շաբաթ շբթ շբթ'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'մի քանի վայրկյան', '44 seconds = seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'րոպե', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'րոպե', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 րոպե', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 րոպե', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'ժամ', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'ժամ', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 ժամ', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 ժամ', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 ժամ', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'օր', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'օր', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 օր', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'օր', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 օր', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 11}), true), '11 օր', '11 days = 11 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 21}), true), '21 օր', '21 days = 21 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 օր', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'ամիս', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'ամիս', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'ամիս', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 ամիս', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 ամիս', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 ամիս', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'ամիս', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 ամիս', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'տարի', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 տարի', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'տարի', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 տարի', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'մի քանի վայրկյան հետո', 'prefix');
+ assert.equal(moment(0).from(30000), 'մի քանի վայրկյան առաջ', 'suffix');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'մի քանի վայրկյան հետո', 'in seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), '5 օր հետո', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'այսօր 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'այսօր 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'այսօր 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'վաղը 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'այսօր 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'երեկ 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ function makeFormat(d) {
+ return 'dddd [օրը ժամը] LT';
+ }
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ function makeFormat(d) {
+ return '[անցած] dddd [օրը ժամը] LT';
+ }
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1-ին', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1-ին', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2-րդ', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2-րդ', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3-րդ', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('id');
+
+test('parse', function (assert) {
+ var tests = 'Januari Jan_Februari Feb_Maret Mar_April Apr_Mei Mei_Juni Jun_Juli Jul_Agustus Ags_September Sep_Oktober Okt_November Nov_Desember Des'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Minggu, Februari 14 2010, 3:25:50 sore'],
+ ['ddd, hA', 'Min, 3sore'],
+ ['M Mo MM MMMM MMM', '2 2 02 Februari Feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 Minggu Min Mg'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '7 7 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'sore sore'],
+ ['[the] DDDo [day of the year]', 'the 45 day of the year'],
+ ['LTS', '15.25.50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 Februari 2010'],
+ ['LLL', '14 Februari 2010 pukul 15.25'],
+ ['LLLL', 'Minggu, 14 Februari 2010 pukul 15.25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 Feb 2010'],
+ ['lll', '14 Feb 2010 pukul 15.25'],
+ ['llll', 'Min, 14 Feb 2010 pukul 15.25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format month', function (assert) {
+ var expected = 'Januari Jan_Februari Feb_Maret Mar_April Apr_Mei Mei_Juni Jun_Juli Jul_Agustus Ags_September Sep_Oktober Okt_November Nov_Desember Des'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Minggu Min Mg_Senin Sen Sn_Selasa Sel Sl_Rabu Rab Rb_Kamis Kam Km_Jumat Jum Jm_Sabtu Sab Sb'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'beberapa detik', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'semenit', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'semenit', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 menit', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 menit', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'sejam', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'sejam', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 jam', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 jam', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 jam', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'sehari', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'sehari', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 hari', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'sehari', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 hari', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 hari', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'sebulan', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'sebulan', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'sebulan', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 bulan', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 bulan', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 bulan', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'sebulan', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 bulan', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'setahun', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 tahun', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'setahun', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 tahun', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'dalam beberapa detik', 'prefix');
+ assert.equal(moment(0).from(30000), 'beberapa detik yang lalu', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'beberapa detik yang lalu', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'dalam beberapa detik', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'dalam 5 hari', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Hari ini pukul 12.00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Hari ini pukul 12.25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Hari ini pukul 13.00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Besok pukul 12.00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Hari ini pukul 11.00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Kemarin pukul 12.00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [pukul] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [pukul] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [pukul] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [lalu pukul] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [lalu pukul] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [lalu pukul] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('is');
+
+test('parse', function (assert) {
+ var tests = 'janúar jan_febrúar feb_mars mar_apríl apr_maí maí_júní jún_júlí júl_ágúst ágú_september sep_október okt_nóvember nóv_desember des'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, h:mm:ss a', 'sunnudagur, 14. febrúar 2010, 3:25:50 pm'],
+ ['ddd, hA', 'sun, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2. 02 febrúar feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. sunnudagur sun Su'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '6 6. 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45. day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14. febrúar 2010'],
+ ['LLL', '14. febrúar 2010 kl. 15:25'],
+ ['LLLL', 'sunnudagur, 14. febrúar 2010 kl. 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14. feb 2010'],
+ ['lll', '14. feb 2010 kl. 15:25'],
+ ['llll', 'sun, 14. feb 2010 kl. 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'janúar jan_febrúar feb_mars mar_apríl apr_maí maí_júní jún_júlí júl_ágúst ágú_september sep_október okt_nóvember nóv_desember des'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'sunnudagur sun Su_mánudagur mán Má_þriðjudagur þri Þr_miðvikudagur mið Mi_fimmtudagur fim Fi_föstudagur fös Fö_laugardagur lau La'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'nokkrar sekúndur', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'mínúta', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'mínúta', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 mínútur', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 mínútur', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 21}), true), '21 mínúta', '21 minutes = 21 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'klukkustund', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'klukkustund', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 klukkustundir', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 klukkustundir', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 klukkustund', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'dagur', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'dagur', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dagar', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'dagur', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dagar', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dagar', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 11}), true), '11 dagar', '11 days = 11 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 21}), true), '21 dagur', '21 days = 21 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'mánuður', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'mánuður', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'mánuður', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 mánuðir', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 mánuðir', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 mánuðir', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'mánuður', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 mánuðir', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'ár', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 ár', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'ár', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 ár', '5 years = 5 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 21}), true), '21 ár', '21 years = 21 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'eftir nokkrar sekúndur', 'prefix');
+ assert.equal(moment(0).from(30000), 'fyrir nokkrum sekúndum síðan', 'suffix');
+ assert.equal(moment().subtract({m: 1}).fromNow(), 'fyrir mínútu síðan', 'a minute ago');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'fyrir nokkrum sekúndum síðan', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'eftir nokkrar sekúndur', 'in a few seconds');
+ assert.equal(moment().add({m: 1}).fromNow(), 'eftir mínútu', 'in a minute');
+ assert.equal(moment().add({d: 5}).fromNow(), 'eftir 5 daga', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'í dag kl. 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'í dag kl. 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'í dag kl. 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'á morgun kl. 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'í dag kl. 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'í gær kl. 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [kl.] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [kl.] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [kl.] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[síðasta] dddd [kl.] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[síðasta] dddd [kl.] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[síðasta] dddd [kl.] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52.', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1.', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1.', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2.', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2.', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('it');
+
+test('parse', function (assert) {
+ var tests = 'gennaio gen_febbraio feb_marzo mar_aprile apr_maggio mag_giugno giu_luglio lug_agosto ago_settembre set_ottobre ott_novembre nov_dicembre dic'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Domenica, febbraio 14º 2010, 3:25:50 pm'],
+ ['ddd, hA', 'Dom, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2º 02 febbraio feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14º 14'],
+ ['d do dddd ddd dd', '0 0º Domenica Dom Do'],
+ ['DDD DDDo DDDD', '45 45º 045'],
+ ['w wo ww', '6 6º 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45º day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 febbraio 2010'],
+ ['LLL', '14 febbraio 2010 15:25'],
+ ['LLLL', 'Domenica, 14 febbraio 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 feb 2010'],
+ ['lll', '14 feb 2010 15:25'],
+ ['llll', 'Dom, 14 feb 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1º', '1º');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2º', '2º');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3º', '3º');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4º', '4º');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5º', '5º');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6º', '6º');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7º', '7º');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8º', '8º');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9º', '9º');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10º', '10º');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11º', '11º');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12º', '12º');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13º', '13º');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14º', '14º');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15º', '15º');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16º', '16º');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17º', '17º');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18º', '18º');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19º', '19º');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20º', '20º');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21º', '21º');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22º', '22º');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23º', '23º');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24º', '24º');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25º', '25º');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26º', '26º');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27º', '27º');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28º', '28º');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29º', '29º');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30º', '30º');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31º', '31º');
+});
+
+test('format month', function (assert) {
+ var expected = 'gennaio gen_febbraio feb_marzo mar_aprile apr_maggio mag_giugno giu_luglio lug_agosto ago_settembre set_ottobre ott_novembre nov_dicembre dic'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Domenica Dom Do_Lunedì Lun Lu_Martedì Mar Ma_Mercoledì Mer Me_Giovedì Gio Gi_Venerdì Ven Ve_Sabato Sab Sa'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'alcuni secondi', '44 seconds = seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'un minuto', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'un minuto', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minuti', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minuti', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'un\'ora', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'un\'ora', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 ore', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 ore', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 ore', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'un giorno', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'un giorno', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 giorni', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'un giorno', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 giorni', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 giorni', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'un mese', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'un mese', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'un mese', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 mesi', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 mesi', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 mesi', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'un mese', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 mesi', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'un anno', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 anni', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'un anno', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 anni', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'in alcuni secondi', 'prefix');
+ assert.equal(moment(0).from(30000), 'alcuni secondi fa', 'suffix');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'in alcuni secondi', 'in seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'tra 5 giorni', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Oggi alle 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Oggi alle 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Oggi alle 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Domani alle 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Oggi alle 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Ieri alle 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [alle] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [alle] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [alle] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m, weekday, datestring;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ // Different date string
+ weekday = parseInt(m.format('d'), 10);
+ datestring = (weekday === 0) ? '[la scorsa] dddd [alle] LT' : '[lo scorso] dddd [alle] LT';
+ assert.equal(m.calendar(), m.format(datestring), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(datestring), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(datestring), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52º', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1º', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1º', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2º', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2º', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('ja');
+
+test('parse', function (assert) {
+ var tests = '1月 1月_2月 2月_3月 3月_4月 4月_5月 5月_6月 6月_7月 7月_8月 8月_9月 9月_10月 10月_11月 11月_12月 12月'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, a h:mm:ss', '日曜日, 2月 14日 2010, 午後 3:25:50'],
+ ['ddd, Ah', '日, 午後3'],
+ ['M Mo MM MMMM MMM', '2 2 02 2月 2月'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14日 14'],
+ ['d do dddd ddd dd', '0 0日 日曜日 日 日'],
+ ['DDD DDDo DDDD', '45 45日 045'],
+ ['w wo ww', '8 8 08'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', '午後 午後'],
+ ['[the] DDDo [day of the year]', 'the 45日 day of the year'],
+ ['LTS', '午後3時25分50秒'],
+ ['L', '2010/02/14'],
+ ['LL', '2010年2月14日'],
+ ['LLL', '2010年2月14日午後3時25分'],
+ ['LLLL', '2010年2月14日午後3時25分 日曜日'],
+ ['l', '2010/2/14'],
+ ['ll', '2010年2月14日'],
+ ['lll', '2010年2月14日午後3時25分'],
+ ['llll', '2010年2月14日午後3時25分 日']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format month', function (assert) {
+ var expected = '1月 1月_2月 2月_3月 3月_4月 4月_5月 5月_6月 6月_7月 7月_8月 8月_9月 9月_10月 10月_11月 11月_12月 12月'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = '日曜日 日 日_月曜日 月 月_火曜日 火 火_水曜日 水 水_木曜日 木 木_金曜日 金 金_土曜日 土 土'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), '数秒', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), '1分', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), '1分', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2分', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44分', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), '1時間', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), '1時間', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2時間', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5時間', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21時間', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), '1日', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), '1日', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2日', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), '1日', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5日', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25日', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), '1ヶ月', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), '1ヶ月', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), '1ヶ月', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2ヶ月', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2ヶ月', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3ヶ月', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), '1ヶ月', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5ヶ月', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), '1年', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2年', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), '1年', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5年', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), '数秒後', 'prefix');
+ assert.equal(moment(0).from(30000), '数秒前', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), '数秒前', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), '数秒後', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), '5日後', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), '今日 午後12時0分', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), '今日 午後12時25分', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), '今日 午後1時0分', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), '明日 午後12時0分', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), '今日 午前11時0分', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), '昨日 午後12時0分', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('[来週]dddd LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[来週]dddd LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[来週]dddd LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[前週]dddd LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[前週]dddd LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[前週]dddd LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday format', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '1 01 1', 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '2 02 2', 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '3 03 3', 'Jan 15 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('jv');
+
+test('parse', function (assert) {
+ var tests = 'Januari Jan_Februari Feb_Maret Mar_April Apr_Mei Mei_Juni Jun_Juli Jul_Agustus Ags_September Sep_Oktober Okt_Nopember Nop_Desember Des'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Minggu, Februari 14 2010, 3:25:50 sonten'],
+ ['ddd, hA', 'Min, 3sonten'],
+ ['M Mo MM MMMM MMM', '2 2 02 Februari Feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 Minggu Min Mg'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '7 7 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'sonten sonten'],
+ ['[the] DDDo [day of the year]', 'the 45 day of the year'],
+ ['LTS', '15.25.50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 Februari 2010'],
+ ['LLL', '14 Februari 2010 pukul 15.25'],
+ ['LLLL', 'Minggu, 14 Februari 2010 pukul 15.25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 Feb 2010'],
+ ['lll', '14 Feb 2010 pukul 15.25'],
+ ['llll', 'Min, 14 Feb 2010 pukul 15.25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format month', function (assert) {
+ var expected = 'Januari Jan_Februari Feb_Maret Mar_April Apr_Mei Mei_Juni Jun_Juli Jul_Agustus Ags_September Sep_Oktober Okt_Nopember Nop_Desember Des'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Minggu Min Mg_Senen Sen Sn_Seloso Sel Sl_Rebu Reb Rb_Kemis Kem Km_Jemuwah Jem Jm_Septu Sep Sp'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'sawetawis detik', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'setunggal menit', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'setunggal menit', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 menit', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 menit', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'setunggal jam', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'setunggal jam', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 jam', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 jam', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 jam', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'sedinten', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'sedinten', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dinten', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'sedinten', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dinten', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dinten', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'sewulan', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'sewulan', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'sewulan', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 wulan', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 wulan', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 wulan', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'sewulan', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 wulan', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'setaun', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 taun', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'setaun', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 taun', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'wonten ing sawetawis detik', 'prefix');
+ assert.equal(moment(0).from(30000), 'sawetawis detik ingkang kepengker', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'sawetawis detik ingkang kepengker', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'wonten ing sawetawis detik', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'wonten ing 5 dinten', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Dinten puniko pukul 12.00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Dinten puniko pukul 12.25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Dinten puniko pukul 13.00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Mbenjang pukul 12.00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Dinten puniko pukul 11.00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Kala wingi pukul 12.00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [pukul] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [pukul] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [pukul] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [kepengker pukul] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [kepengker pukul] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [kepengker pukul] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+// Monday is the first day of the week.
+// The week that contains Jan 1st is the first week of the year.
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('ka');
+
+test('parse', function (assert) {
+ var i,
+ tests = 'იანვარი იან_თებერვალი თებ_მარტი მარ_აპრილი აპრ_მაისი მაი_ივნისი ივნ_ივლისი ივლ_აგვისტო აგვ_სექტემბერი სექ_ოქტომბერი ოქტ_ნოემბერი ნოე_დეკემბერი დეკ'.split('_');
+
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' უნდა იყოს თვე ' + (i + 1));
+ }
+
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'კვირა, თებერვალი მე-14 2010, 3:25:50 pm'],
+ ['ddd, hA', 'კვი, 3PM'],
+ ['M Mo MM MMMM MMM', '2 მე-2 02 თებერვალი თებ'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 მე-14 14'],
+ ['d do dddd ddd dd', '0 0 კვირა კვი კვ'],
+ ['DDD DDDo DDDD', '45 45-ე 045'],
+ ['w wo ww', '7 მე-7 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['წლის DDDo დღე', 'წლის 45-ე დღე'],
+ ['LTS', '3:25:50 PM'],
+ ['L', '14/02/2010'],
+ ['LL', '14 თებერვალს 2010'],
+ ['LLL', '14 თებერვალს 2010 3:25 PM'],
+ ['LLLL', 'კვირა, 14 თებერვალს 2010 3:25 PM'],
+ ['l', '14/2/2010'],
+ ['ll', '14 თებ 2010'],
+ ['lll', '14 თებ 2010 3:25 PM'],
+ ['llll', 'კვი, 14 თებ 2010 3:25 PM']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1-ლი', '1-ლი');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), 'მე-2', 'მე-2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), 'მე-3', 'მე-3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), 'მე-4', 'მე-4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), 'მე-5', 'მე-5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), 'მე-6', 'მე-6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), 'მე-7', 'მე-7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), 'მე-8', 'მე-8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), 'მე-9', 'მე-9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), 'მე-10', 'მე-10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), 'მე-11', 'მე-11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), 'მე-12', 'მე-12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), 'მე-13', 'მე-13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), 'მე-14', 'მე-14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), 'მე-15', 'მე-15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), 'მე-16', 'მე-16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), 'მე-17', 'მე-17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), 'მე-18', 'მე-18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), 'მე-19', 'მე-19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), 'მე-20', 'მე-20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21-ე', '21-ე');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22-ე', '22-ე');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23-ე', '23-ე');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24-ე', '24-ე');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25-ე', '25-ე');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26-ე', '26-ე');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27-ე', '27-ე');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28-ე', '28-ე');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29-ე', '29-ე');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30-ე', '30-ე');
+
+ assert.equal(moment('2011 40', 'YYYY DDD').format('DDDo'), 'მე-40', 'მე-40');
+ assert.equal(moment('2011 50', 'YYYY DDD').format('DDDo'), '50-ე', '50-ე');
+ assert.equal(moment('2011 60', 'YYYY DDD').format('DDDo'), 'მე-60', 'მე-60');
+ assert.equal(moment('2011 100', 'YYYY DDD').format('DDDo'), 'მე-100', 'მე-100');
+ assert.equal(moment('2011 101', 'YYYY DDD').format('DDDo'), '101-ე', '101-ე');
+});
+
+test('format month', function (assert) {
+ var i,
+ expected = 'იანვარი იან_თებერვალი თებ_მარტი მარ_აპრილი აპრ_მაისი მაი_ივნისი ივნ_ივლისი ივლ_აგვისტო აგვ_სექტემბერი სექ_ოქტომბერი ოქტ_ნოემბერი ნოე_დეკემბერი დეკ'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var i,
+ expected = 'კვირა კვი კვ_ორშაბათი ორშ ორ_სამშაბათი სამ სა_ოთხშაბათი ოთხ ოთ_ხუთშაბათი ხუთ ხუ_პარასკევი პარ პა_შაბათი შაბ შა'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'რამდენიმე წამი', '44 წამი = რამდენიმე წამი');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'წუთი', '45 წამი = წუთი');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'წუთი', '89 წამი = წუთი');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 წუთი', '90 წამი = 2 წუთი');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 წუთი', '44 წამი = 44 წუთი');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'საათი', '45 წამი = საათი');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'საათი', '89 წამი = საათი');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 საათი', '90 წამი = 2 საათი');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 საათი', '5 საათი = 5 საათი');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 საათი', '21 საათი = 21 საათი');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'დღე', '22 საათი = დღე');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'დღე', '35 საათი = დღე');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 დღე', '36 საათი = 2 დღე');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'დღე', '1 დღე = დღე');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 დღე', '5 დღე = 5 დღე');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 დღე', '25 დღე = 25 დღე');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'თვე', '26 დღე = თვე');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'თვე', '30 დღე = თვე');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'თვე', '45 დღე = თვე');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 თვე', '46 დღე = 2 თვე');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 თვე', '75 დღე = 2 თვე');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 თვე', '76 დღე = 3 თვე');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'თვე', '1 თვე = თვე');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 თვე', '5 თვე = 5 თვე');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'წელი', '345 დღე = წელი');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 წელი', '548 დღე = 2 წელი');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'წელი', '1 წელი = წელი');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 წელი', '5 წელი = 5 წელი');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'რამდენიმე წამში', 'ში სუფიქსი');
+ assert.equal(moment(0).from(30000), 'რამდენიმე წამის წინ', 'წინ სუფიქსი');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'რამდენიმე წამის წინ', 'უნდა აჩვენოს როგორც წარსული');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'რამდენიმე წამში', 'რამდენიმე წამში');
+ assert.equal(moment().add({d: 5}).fromNow(), '5 დღეში', '5 დღეში');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'დღეს 12:00 PM-ზე', 'დღეს ამავე დროს');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'დღეს 12:25 PM-ზე', 'ახლანდელ დროს დამატებული 25 წუთი');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'დღეს 1:00 PM-ზე', 'ახლანდელ დროს დამატებული 1 საათი');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'ხვალ 12:00 PM-ზე', 'ხვალ ამავე დროს');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'დღეს 11:00 AM-ზე', 'ახლანდელ დროს გამოკლებული 1 საათი');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'გუშინ 12:00 PM-ზე', 'გუშინ ამავე დროს');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('[შემდეგ] dddd LT[-ზე]'), 'დღეს + ' + i + ' დღე ახლანდელ დროს');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[შემდეგ] dddd LT[-ზე]'), 'დღეს + ' + i + ' დღე დღის დასაწყისში');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[შემდეგ] dddd LT[-ზე]'), 'დღეს + ' + i + ' დღე დღის დასასრულს');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[წინა] dddd LT[-ზე]'), 'დღეს - ' + i + ' დღე ახლანდელ დროს');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[წინა] dddd LT[-ზე]'), 'დღეს - ' + i + ' დღე დღის დასაწყისში');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[წინა] dddd LT[-ზე]'), 'დღეს - ' + i + ' დღე დღის დასასრულს');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 კვირის წინ');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), '1 კვირაში');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 კვირის წინ');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), '2 კვირაში');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1-ლი', 'დეკ 26 2011 უნდა იყოს კვირა 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1-ლი', 'იან 1 2012 უნდა იყოს კვირა 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 მე-2', 'იან 2 2012 უნდა იყოს კვირა 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 მე-2', 'იან 8 2012 უნდა იყოს კვირა 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 მე-3', 'იან 9 2012 უნდა იყოს კვირა 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('kk');
+
+test('parse', function (assert) {
+ var tests = 'қаңтар қаң_ақпан ақп_наурыз нау_сәуір сәу_мамыр мам_маусым мау_шілде шіл_тамыз там_қыркүйек қыр_қазан қаз_қараша қар_желтоқсан жел'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, HH:mm:ss', 'жексенбі, 14-ші ақпан 2010, 15:25:50'],
+ ['ddd, hA', 'жек, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2-ші 02 ақпан ақп'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14-ші 14'],
+ ['d do dddd ddd dd', '0 0-ші жексенбі жек жк'],
+ ['DDD DDDo DDDD', '45 45-ші 045'],
+ ['w wo ww', '7 7-ші 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[жылдың] DDDo [күні]', 'жылдың 45-ші күні'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14 ақпан 2010'],
+ ['LLL', '14 ақпан 2010 15:25'],
+ ['LLLL', 'жексенбі, 14 ақпан 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14 ақп 2010'],
+ ['lll', '14 ақп 2010 15:25'],
+ ['llll', 'жек, 14 ақп 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1-ші', '1st');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2-ші', '2nd');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3-ші', '3rd');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4-ші', '4th');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5-ші', '5th');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6-шы', '6th');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7-ші', '7th');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8-ші', '8th');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9-шы', '9th');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10-шы', '10th');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11-ші', '11th');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12-ші', '12th');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13-ші', '13th');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14-ші', '14th');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15-ші', '15th');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16-шы', '16th');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17-ші', '17th');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18-ші', '18th');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19-шы', '19th');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20-шы', '20th');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21-ші', '21st');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22-ші', '22nd');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23-ші', '23rd');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24-ші', '24th');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25-ші', '25th');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26-шы', '26th');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27-ші', '27th');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28-ші', '28th');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29-шы', '29th');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30-шы', '30th');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31-ші', '31st');
+});
+
+test('format month', function (assert) {
+ var expected = 'қаңтар қаң_ақпан ақп_наурыз нау_сәуір сәу_мамыр мам_маусым мау_шілде шіл_тамыз там_қыркүйек қыр_қазан қаз_қараша қар_желтоқсан жел'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'жексенбі жек жк_дүйсенбі дүй дй_сейсенбі сей сй_сәрсенбі сәр ср_бейсенбі бей бй_жұма жұм жм_сенбі сен сн'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'бірнеше секунд', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'бір минут', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'бір минут', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 минут', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 минут', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'бір сағат', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'бір сағат', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 сағат', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 сағат', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 сағат', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'бір күн', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'бір күн', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 күн', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'бір күн', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 күн', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 күн', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'бір ай', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'бір ай', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'бір ай', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 ай', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 ай', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 ай', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'бір ай', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 ай', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'бір жыл', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 жыл', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'бір жыл', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 жыл', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'бірнеше секунд ішінде', 'prefix');
+ assert.equal(moment(0).from(30000), 'бірнеше секунд бұрын', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'бірнеше секунд бұрын', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'бірнеше секунд ішінде', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), '5 күн ішінде', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Бүгін сағат 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Бүгін сағат 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Бүгін сағат 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Ертең сағат 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Бүгін сағат 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Кеше сағат 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [сағат] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [сағат] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [сағат] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[Өткен аптаның] dddd [сағат] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[Өткен аптаның] dddd [сағат] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[Өткен аптаның] dddd [сағат] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1-ші', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2-ші', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2-ші', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3-ші', 'Jan 9 2012 should be week 3');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '3 03 3-ші', 'Jan 15 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('km');
+
+test('parse', function (assert) {
+ var tests = 'មករា មករា_កុម្ភៈ កុម្ភៈ_មីនា មីនា_មេសា មេសា_ឧសភា ឧសភា_មិថុនា មិថុនា_កក្កដា កក្កដា_សីហា សីហា_កញ្ញា កញ្ញា_តុលា តុលា_វិច្ឆិកា វិច្ឆិកា_ធ្នូ ធ្នូ'.split('_'),
+ i;
+
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'អាទិត្យ, កុម្ភៈ 14 2010, 3:25:50 pm'],
+ ['ddd, hA', 'អាទិត្យ, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2 02 កុម្ភៈ កុម្ភៈ'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 អាទិត្យ អាទិត្យ អាទិត្យ'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '6 6 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45 day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 កុម្ភៈ 2010'],
+ ['LLL', '14 កុម្ភៈ 2010 15:25'],
+ ['LLLL', 'អាទិត្យ, 14 កុម្ភៈ 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 កុម្ភៈ 2010'],
+ ['lll', '14 កុម្ភៈ 2010 15:25'],
+ ['llll', 'អាទិត្យ, 14 កុម្ភៈ 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1', '1st');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2', '2nd');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3', '3rd');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4', '4th');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5', '5th');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6', '6th');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7', '7th');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8', '8th');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9', '9th');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10', '10th');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11', '11th');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12', '12th');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13', '13th');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14', '14th');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15', '15th');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16', '16th');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17', '17th');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18', '18th');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19', '19th');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20', '20th');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21', '21st');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22', '22nd');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23', '23rd');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24', '24th');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25', '25th');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26', '26th');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27', '27th');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28', '28th');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29', '29th');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30', '30th');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31', '31st');
+});
+
+test('format month', function (assert) {
+ var expected = 'មករា មករា_កុម្ភៈ កុម្ភៈ_មីនា មីនា_មេសា មេសា_ឧសភា ឧសភា_មិថុនា មិថុនា_កក្កដា កក្កដា_សីហា សីហា_កញ្ញា កញ្ញា_តុលា តុលា_វិច្ឆិកា វិច្ឆិកា_ធ្នូ ធ្នូ'.split('_'),
+ i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'អាទិត្យ អាទិត្យ អាទិត្យ_ច័ន្ទ ច័ន្ទ ច័ន្ទ_អង្គារ អង្គារ អង្គារ_ពុធ ពុធ ពុធ_ព្រហស្បតិ៍ ព្រហស្បតិ៍ ព្រហស្បតិ៍_សុក្រ សុក្រ សុក្រ_សៅរ៍ សៅរ៍ សៅរ៍'.split('_'),
+ i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'ប៉ុន្មានវិនាទី', '44 seconds = ប៉ុន្មានវិនាទី');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'មួយនាទី', '45 seconds = មួយនាទី');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'មួយនាទី', '89 seconds = មួយនាទី');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 នាទី', '90 seconds = 2 នាទី');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 នាទី', '44 minutes = 44 នាទី');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'មួយម៉ោង', '45 minutes = មួយម៉ោង');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'មួយម៉ោង', '89 minutes = មួយម៉ោង');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 ម៉ោង', '90 minutes = 2 ម៉ោង');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 ម៉ោង', '5 hours = 5 ម៉ោង');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 ម៉ោង', '21 hours = 21 ម៉ោង');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'មួយថ្ងៃ', '22 hours = មួយថ្ងៃ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'មួយថ្ងៃ', '35 hours = មួយថ្ងៃ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 ថ្ងៃ', '36 hours = 2 ថ្ងៃ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'មួយថ្ងៃ', '1 day = មួយថ្ងៃ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 ថ្ងៃ', '5 days = 5 ថ្ងៃ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 ថ្ងៃ', '25 days = 25 ថ្ងៃ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'មួយខែ', '26 days = មួយខែ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'មួយខែ', '30 days = មួយខែ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'មួយខែ', '43 days = មួយខែ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 ខែ', '46 days = 2 ខែ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 ខែ', '75 days = 2 ខែ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 ខែ', '76 days = 3 ខែ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'មួយខែ', '1 month = មួយខែ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 ខែ', '5 months = 5 ខែ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'មួយឆ្នាំ', '345 days = មួយឆ្នាំ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 ឆ្នាំ', '548 days = 2 ឆ្នាំ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'មួយឆ្នាំ', '1 year = មួយឆ្នាំ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 ឆ្នាំ', '5 years = 5 ឆ្នាំ');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'ប៉ុន្មានវិនាទីទៀត', 'prefix');
+ assert.equal(moment(0).from(30000), 'ប៉ុន្មានវិនាទីមុន', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'ប៉ុន្មានវិនាទីមុន', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({
+ s: 30
+ }).fromNow(), 'ប៉ុន្មានវិនាទីទៀត', 'in a few seconds');
+ assert.equal(moment().add({
+ d: 5
+ }).fromNow(), '5 ថ្ងៃទៀត', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'ថ្ងៃនេះ ម៉ោង 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'ថ្ងៃនេះ ម៉ោង 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'ថ្ងៃនេះ ម៉ោង 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'ស្អែក ម៉ោង 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'ថ្ងៃនេះ ម៉ោង 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'ម្សិលមិញ ម៉ោង 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({
+ d: i
+ });
+ assert.equal(m.calendar(), m.format('dddd [ម៉ោង] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [ម៉ោង] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [ម៉ោង] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({
+ d: i
+ });
+ assert.equal(m.calendar(), m.format('dddd [សប្តាហ៍មុន] [ម៉ោង] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [សប្តាហ៍មុន] [ម៉ោង] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [សប្តាហ៍មុន] [ម៉ោង] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({
+ w: 1
+ }),
+ weeksFromNow = moment().add({
+ w: 1
+ });
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({
+ w: 2
+ });
+ weeksFromNow = moment().add({
+ w: 2
+ });
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('ko');
+
+test('parse', function (assert) {
+ var tests = '1월 1월_2월 2월_3월 3월_4월 4월_5월 5월_6월 6월_7월 7월_8월 8월_9월 9월_10월 10월_11월 11월_12월 12월'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('parse meridiem', function (assert) {
+ var elements = [{
+ expression : '1981년 9월 8일 오후 2시 30분',
+ inputFormat : 'YYYY[년] M[월] D[일] A h[시] m[분]',
+ outputFormat : 'A',
+ expected : '오후'
+ }, {
+ expression : '1981년 9월 8일 오전 2시 30분',
+ inputFormat : 'YYYY[년] M[월] D[일] A h[시] m[분]',
+ outputFormat : 'A h시',
+ expected : '오전 2시'
+ }, {
+ expression : '14시 30분',
+ inputFormat : 'H[시] m[분]',
+ outputFormat : 'A',
+ expected : '오후'
+ }, {
+ expression : '오후 4시',
+ inputFormat : 'A h[시]',
+ outputFormat : 'H',
+ expected : '16'
+ }], i, l, it, actual;
+
+ for (i = 0, l = elements.length; i < l; ++i) {
+ it = elements[i];
+ actual = moment(it.expression, it.inputFormat).format(it.outputFormat);
+
+ assert.equal(
+ actual,
+ it.expected,
+ '\'' + it.outputFormat + '\' of \'' + it.expression + '\' must be \'' + it.expected + '\' but was \'' + actual + '\'.'
+ );
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['YYYY년 MMMM Do dddd a h:mm:ss', '2010년 2월 14일 일요일 오후 3:25:50'],
+ ['ddd A h', '일 오후 3'],
+ ['M Mo MM MMMM MMM', '2 2일 02 2월 2월'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14일 14'],
+ ['d do dddd ddd dd', '0 0일 일요일 일 일'],
+ ['DDD DDDo DDDD', '45 45일 045'],
+ ['w wo ww', '8 8일 08'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', '오후 오후'],
+ ['일년 중 DDDo째 되는 날', '일년 중 45일째 되는 날'],
+ ['LTS', '오후 3시 25분 50초'],
+ ['L', '2010.02.14'],
+ ['LL', '2010년 2월 14일'],
+ ['LLL', '2010년 2월 14일 오후 3시 25분'],
+ ['LLLL', '2010년 2월 14일 일요일 오후 3시 25분'],
+ ['l', '2010.2.14'],
+ ['ll', '2010년 2월 14일'],
+ ['lll', '2010년 2월 14일 오후 3시 25분'],
+ ['llll', '2010년 2월 14일 일 오후 3시 25분']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1일', '1일');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2일', '2일');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3일', '3일');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4일', '4일');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5일', '5일');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6일', '6일');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7일', '7일');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8일', '8일');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9일', '9일');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10일', '10일');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11일', '11일');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12일', '12일');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13일', '13일');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14일', '14일');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15일', '15일');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16일', '16일');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17일', '17일');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18일', '18일');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19일', '19일');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20일', '20일');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21일', '21일');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22일', '22일');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23일', '23일');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24일', '24일');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25일', '25일');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26일', '26일');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27일', '27일');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28일', '28일');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29일', '29일');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30일', '30일');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31일', '31일');
+});
+
+test('format month', function (assert) {
+ var expected = '1월 1월_2월 2월_3월 3월_4월 4월_5월 5월_6월 6월_7월 7월_8월 8월_9월 9월_10월 10월_11월 11월_12월 12월'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = '일요일 일 일_월요일 월 월_화요일 화 화_수요일 수 수_목요일 목 목_금요일 금 금_토요일 토 토'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), '몇 초', '44초 = 몇 초');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), '일분', '45초 = 일분');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), '일분', '89초 = 일분');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2분', '90초 = 2분');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44분', '44분 = 44분');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), '한 시간', '45분 = 한 시간');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), '한 시간', '89분 = 한 시간');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2시간', '90분 = 2시간');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5시간', '5시간 = 5시간');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21시간', '21시간 = 21시간');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), '하루', '22시간 = 하루');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), '하루', '35시간 = 하루');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2일', '36시간 = 2일');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), '하루', '하루 = 하루');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5일', '5일 = 5일');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25일', '25일 = 25일');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), '한 달', '26일 = 한 달');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), '한 달', '30일 = 한 달');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), '한 달', '45일 = 한 달');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2달', '46일 = 2달');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2달', '75일 = 2달');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3달', '76일 = 3달');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), '한 달', '1달 = 한 달');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5달', '5달 = 5달');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), '일 년', '345일 = 일 년');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2년', '548일 = 2년');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), '일 년', '일 년 = 일 년');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5년', '5년 = 5년');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), '몇 초 후', 'prefix');
+ assert.equal(moment(0).from(30000), '몇 초 전', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), '몇 초 전', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), '몇 초 후', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), '5일 후', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), '오늘 오후 12시 0분', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), '오늘 오후 12시 25분', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), '오늘 오후 1시 0분', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), '내일 오후 12시 0분', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), '오늘 오전 11시 0분', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), '어제 오후 12시 0분', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('지난주 dddd LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('지난주 dddd LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('지난주 dddd LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday format', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1일', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '1 01 1일', 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2일', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '2 02 2일', 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '3 03 3일', 'Jan 15 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('ky');
+
+test('parse', function (assert) {
+ var tests = 'январь янв_февраль фев_март март_апрель апр_май май_июнь июнь_июль июль_август авг_сентябрь сен_октябрь окт_ноябрь ноя_декабрь дек'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, HH:mm:ss', 'Жекшемби, 14-чү февраль 2010, 15:25:50'],
+ ['ddd, hA', 'Жек, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2-чи 02 февраль фев'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14-чү 14'],
+ ['d do dddd ddd dd', '0 0-чү Жекшемби Жек Жк'],
+ ['DDD DDDo DDDD', '45 45-чи 045'],
+ ['w wo ww', '7 7-чи 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[жылдын] DDDo [күнү]', 'жылдын 45-чи күнү'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14 февраль 2010'],
+ ['LLL', '14 февраль 2010 15:25'],
+ ['LLLL', 'Жекшемби, 14 февраль 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14 фев 2010'],
+ ['lll', '14 фев 2010 15:25'],
+ ['llll', 'Жек, 14 фев 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1-чи', '1st');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2-чи', '2nd');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3-чү', '3rd');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4-чү', '4th');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5-чи', '5th');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6-чы', '6th');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7-чи', '7th');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8-чи', '8th');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9-чу', '9th');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10-чу', '10th');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11-чи', '11th');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12-чи', '12th');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13-чү', '13th');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14-чү', '14th');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15-чи', '15th');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16-чы', '16th');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17-чи', '17th');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18-чи', '18th');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19-чу', '19th');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20-чы', '20th');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21-чи', '21st');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22-чи', '22nd');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23-чү', '23rd');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24-чү', '24th');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25-чи', '25th');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26-чы', '26th');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27-чи', '27th');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28-чи', '28th');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29-чу', '29th');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30-чу', '30th');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31-чи', '31st');
+});
+
+test('format month', function (assert) {
+ var expected = 'январь янв_февраль фев_март март_апрель апр_май май_июнь июнь_июль июль_август авг_сентябрь сен_октябрь окт_ноябрь ноя_декабрь дек'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Жекшемби Жек Жк_Дүйшөмбү Дүй Дй_Шейшемби Шей Шй_Шаршемби Шар Шр_Бейшемби Бей Бй_Жума Жум Жм_Ишемби Ише Иш'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'бирнече секунд', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'бир мүнөт', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'бир мүнөт', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 мүнөт', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 мүнөт', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'бир саат', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'бир саат', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 саат', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 саат', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 саат', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'бир күн', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'бир күн', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 күн', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'бир күн', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 күн', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 күн', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'бир ай', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'бир ай', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'бир ай', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 ай', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 ай', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 ай', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'бир ай', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 ай', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'бир жыл', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 жыл', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'бир жыл', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 жыл', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'бирнече секунд ичинде', 'prefix');
+ assert.equal(moment(0).from(30000), 'бирнече секунд мурун', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'бирнече секунд мурун', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'бирнече секунд ичинде', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), '5 күн ичинде', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Бүгүн саат 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Бүгүн саат 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Бүгүн саат 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Эртең саат 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Бүгүн саат 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Кече саат 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [саат] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [саат] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [саат] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[Өткен аптанын] dddd [күнү] [саат] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[Өткен аптанын] dddd [күнү] [саат] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[Өткен аптанын] dddd [күнү] [саат] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1-чи', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2-чи', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2-чи', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3-чү', 'Jan 9 2012 should be week 3');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '3 03 3-чү', 'Jan 15 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('lb');
+
+test('parse', function (assert) {
+ var tests = 'Januar Jan._Februar Febr._Mäerz Mrz._Abrëll Abr._Mee Mee_Juni Jun._Juli Jul._August Aug._September Sept._Oktober Okt._November Nov._Dezember Dez.'.split('_'), i;
+
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, HH:mm:ss', 'Sonndeg, 14. Februar 2010, 15:25:50'],
+ ['ddd, HH:mm', 'So., 15:25'],
+ ['M Mo MM MMMM MMM', '2 2. 02 Februar Febr.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. Sonndeg So. So'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '6 6. 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45. day of the year'],
+ ['LTS', '15:25:50 Auer'],
+ ['L', '14.02.2010'],
+ ['LL', '14. Februar 2010'],
+ ['LLL', '14. Februar 2010 15:25 Auer'],
+ ['LLLL', 'Sonndeg, 14. Februar 2010 15:25 Auer'],
+ ['l', '14.2.2010'],
+ ['ll', '14. Febr. 2010'],
+ ['lll', '14. Febr. 2010 15:25 Auer'],
+ ['llll', 'So., 14. Febr. 2010 15:25 Auer']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format month', function (assert) {
+ var expected = 'Januar Jan._Februar Febr._Mäerz Mrz._Abrëll Abr._Mee Mee_Juni Jun._Juli Jul._August Aug._September Sept._Oktober Okt._November Nov._Dezember Dez.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Sonndeg So. So_Méindeg Mé. Mé_Dënschdeg Dë. Dë_Mëttwoch Më. Më_Donneschdeg Do. Do_Freideg Fr. Fr_Samschdeg Sa. Sa'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'e puer Sekonnen', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'eng Minutt', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'eng Minutt', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 Minutten', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 Minutten', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'eng Stonn', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'eng Stonn', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 Stonnen', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 Stonnen', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 Stonnen', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'een Dag', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'een Dag', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 Deeg', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'een Dag', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 Deeg', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 Deeg', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'ee Mount', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'ee Mount', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'ee Mount', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 Méint', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 Méint', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 Méint', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'ee Mount', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 Méint', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'ee Joer', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 Joer', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'ee Joer', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 Joer', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'an e puer Sekonnen', 'prefix');
+ assert.equal(moment(0).from(30000), 'virun e puer Sekonnen', 'suffix');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'an e puer Sekonnen', 'in a few seconds');
+ assert.equal(moment().add({d: 1}).fromNow(), 'an engem Dag', 'in one day');
+ assert.equal(moment().add({d: 2}).fromNow(), 'an 2 Deeg', 'in 2 days');
+ assert.equal(moment().add({d: 3}).fromNow(), 'an 3 Deeg', 'in 3 days');
+ assert.equal(moment().add({d: 4}).fromNow(), 'a 4 Deeg', 'in 4 days');
+ assert.equal(moment().add({d: 5}).fromNow(), 'a 5 Deeg', 'in 5 days');
+ assert.equal(moment().add({d: 6}).fromNow(), 'a 6 Deeg', 'in 6 days');
+ assert.equal(moment().add({d: 7}).fromNow(), 'a 7 Deeg', 'in 7 days');
+ assert.equal(moment().add({d: 8}).fromNow(), 'an 8 Deeg', 'in 8 days');
+ assert.equal(moment().add({d: 9}).fromNow(), 'an 9 Deeg', 'in 9 days');
+ assert.equal(moment().add({d: 10}).fromNow(), 'an 10 Deeg', 'in 10 days');
+ assert.equal(moment().add({y: 100}).fromNow(), 'an 100 Joer', 'in 100 years');
+ assert.equal(moment().add({y: 400}).fromNow(), 'a 400 Joer', 'in 400 years');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Haut um 12:00 Auer', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Haut um 12:25 Auer', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Haut um 13:00 Auer', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Muer um 12:00 Auer', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Haut um 11:00 Auer', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Gëschter um 12:00 Auer', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [um] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [um] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [um] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m, weekday, datestring;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+
+ // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday)
+ weekday = parseInt(m.format('d'), 10);
+ datestring = (weekday === 2 || weekday === 4 ? '[Leschten] dddd [um] LT' : '[Leschte] dddd [um] LT');
+
+ assert.equal(m.calendar(), m.format(datestring), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(datestring), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(datestring), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday format', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52.', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '1 01 1.', 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1.', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '2 02 2.', 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2.', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('lo');
+
+test('parse', function (assert) {
+ var tests = 'ມັງກອນ ມັງກອນ_ກຸມພາ ກຸມພາ_ມີນາ ມີນາ_ເມສາ ເມສາ_ພຶດສະພາ ພຶດສະພາ_ມິຖຸນາ ມິຖຸນາ_ກໍລະກົດ ກໍລະກົດ_ສິງຫາ ສິງຫາ_ກັນຍາ ກັນຍາ_ຕຸລາ ຕຸລາ_ພະຈິກ ພະຈິກ_ທັນວາ ທັນວາ'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'ອາທິດ, ກຸມພາ ທີ່14 2010, 3:25:50 ຕອນແລງ'],
+ ['ddd, hA', 'ທິດ, 3ຕອນແລງ'],
+ ['M Mo MM MMMM MMM', '2 ທີ່2 02 ກຸມພາ ກຸມພາ'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 ທີ່14 14'],
+ ['d do dddd ddd dd', '0 ທີ່0 ອາທິດ ທິດ ທ'],
+ ['DDD DDDo DDDD', '45 ທີ່45 045'],
+ ['w wo ww', '8 ທີ່8 08'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'ຕອນແລງ ຕອນແລງ'],
+ ['[ວັນ]DDDo [ຂອງປີ]', 'ວັນທີ່45 ຂອງປີ'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 ກຸມພາ 2010'],
+ ['LLL', '14 ກຸມພາ 2010 15:25'],
+ ['LLLL', 'ວັນອາທິດ 14 ກຸມພາ 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 ກຸມພາ 2010'],
+ ['lll', '14 ກຸມພາ 2010 15:25'],
+ ['llll', 'ວັນທິດ 14 ກຸມພາ 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), 'ທີ່1', 'ທີ່1');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), 'ທີ່2', 'ທີ່2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), 'ທີ່3', 'ທີ່3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), 'ທີ່4', 'ທີ່4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), 'ທີ່5', 'ທີ່5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), 'ທີ່6', 'ທີ່6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), 'ທີ່7', 'ທີ່7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), 'ທີ່8', 'ທີ່8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), 'ທີ່9', 'ທີ່9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), 'ທີ່10', 'ທີ່10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), 'ທີ່11', 'ທີ່11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), 'ທີ່12', 'ທີ່12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), 'ທີ່13', 'ທີ່13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), 'ທີ່14', 'ທີ່14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), 'ທີ່15', 'ທີ່15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), 'ທີ່16', 'ທີ່16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), 'ທີ່17', 'ທີ່17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), 'ທີ່18', 'ທີ່18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), 'ທີ່19', 'ທີ່19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), 'ທີ່20', 'ທີ່20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), 'ທີ່21', 'ທີ່21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), 'ທີ່22', 'ທີ່22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), 'ທີ່23', 'ທີ່23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), 'ທີ່24', 'ທີ່24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), 'ທີ່25', 'ທີ່25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), 'ທີ່26', 'ທີ່26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), 'ທີ່27', 'ທີ່27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), 'ທີ່28', 'ທີ່28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), 'ທີ່29', 'ທີ່29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), 'ທີ່30', 'ທີ່30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), 'ທີ່31', 'ທີ່31');
+});
+
+test('format month', function (assert) {
+ var expected = 'ມັງກອນ ມັງກອນ_ກຸມພາ ກຸມພາ_ມີນາ ມີນາ_ເມສາ ເມສາ_ພຶດສະພາ ພຶດສະພາ_ມິຖຸນາ ມິຖຸນາ_ກໍລະກົດ ກໍລະກົດ_ສິງຫາ ສິງຫາ_ກັນຍາ ກັນຍາ_ຕຸລາ ຕຸລາ_ພະຈິກ ພະຈິກ_ທັນວາ ທັນວາ'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'ອາທິດ ທິດ ທ_ຈັນ ຈັນ ຈ_ອັງຄານ ອັງຄານ ອຄ_ພຸດ ພຸດ ພ_ພະຫັດ ພະຫັດ ພຫ_ສຸກ ສຸກ ສກ_ເສົາ ເສົາ ສ'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'ບໍ່ເທົ່າໃດວິນາທີ', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), '1 ນາທີ', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), '1 ນາທີ', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 ນາທີ', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 ນາທີ', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), '1 ຊົ່ວໂມງ', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), '1 ຊົ່ວໂມງ', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 ຊົ່ວໂມງ', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 ຊົ່ວໂມງ', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 ຊົ່ວໂມງ', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), '1 ມື້', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), '1 ມື້', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 ມື້', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), '1 ມື້', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 ມື້', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 ມື້', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), '1 ເດືອນ', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), '1 ເດືອນ', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), '1 ເດືອນ', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 ເດືອນ', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 ເດືອນ', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 ເດືອນ', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), '1 ເດືອນ', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 ເດືອນ', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), '1 ປີ', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 ປີ', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), '1 ປີ', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 ປີ', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'ອີກ ບໍ່ເທົ່າໃດວິນາທີ', 'prefix');
+ assert.equal(moment(0).from(30000), 'ບໍ່ເທົ່າໃດວິນາທີຜ່ານມາ', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'ບໍ່ເທົ່າໃດວິນາທີຜ່ານມາ', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'ອີກ ບໍ່ເທົ່າໃດວິນາທີ', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'ອີກ 5 ມື້', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'ມື້ນີ້ເວລາ 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'ມື້ນີ້ເວລາ 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'ມື້ນີ້ເວລາ 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'ມື້ອື່ນເວລາ 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'ມື້ນີ້ເວລາ 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'ມື້ວານນີ້ເວລາ 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('[ວັນ]dddd[ໜ້າເວລາ] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[ວັນ]dddd[ໜ້າເວລາ] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[ວັນ]dddd[ໜ້າເວລາ] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday format', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 ທີ່1', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '1 01 ທີ່1', 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 ທີ່2', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '2 02 ທີ່2', 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '3 03 ທີ່3', 'Jan 15 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('lt');
+
+test('parse', function (assert) {
+ var tests = 'sausis sau_vasaris vas_kovas kov_balandis bal_gegužė geg_birželis bir_liepa lie_rugpjūtis rgp_rugsėjis rgs_spalis spa_lapkritis lap_gruodis grd'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, h:mm:ss a', 'sekmadienis, 14-oji vasario 2010, 3:25:50 pm'],
+ ['ddd, hA', 'Sek, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2-oji 02 vasaris vas'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14-oji 14'],
+ ['d do dddd ddd dd', '0 0-oji sekmadienis Sek S'],
+ ['DDD DDDo DDDD', '45 45-oji 045'],
+ ['w wo ww', '6 6-oji 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['DDDo [metų diena]', '45-oji metų diena'],
+ ['LTS', '15:25:50'],
+ ['L', '2010-02-14'],
+ ['LL', '2010 m. vasario 14 d.'],
+ ['LLL', '2010 m. vasario 14 d., 15:25 val.'],
+ ['LLLL', '2010 m. vasario 14 d., sekmadienis, 15:25 val.'],
+ ['l', '2010-02-14'],
+ ['ll', '2010 m. vasario 14 d.'],
+ ['lll', '2010 m. vasario 14 d., 15:25 val.'],
+ ['llll', '2010 m. vasario 14 d., Sek, 15:25 val.']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1-oji', '1-oji');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2-oji', '2-oji');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3-oji', '3-oji');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4-oji', '4-oji');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5-oji', '5-oji');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6-oji', '6-oji');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7-oji', '7-oji');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8-oji', '8-oji');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9-oji', '9-oji');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10-oji', '10-oji');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11-oji', '11-oji');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12-oji', '12-oji');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13-oji', '13-oji');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14-oji', '14-oji');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15-oji', '15-oji');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16-oji', '16-oji');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17-oji', '17-oji');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18-oji', '18-oji');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19-oji', '19-oji');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20-oji', '20-oji');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21-oji', '21-oji');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22-oji', '22-oji');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23-oji', '23-oji');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24-oji', '24-oji');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25-oji', '25-oji');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26-oji', '26-oji');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27-oji', '27-oji');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28-oji', '28-oji');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29-oji', '29-oji');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30-oji', '30-oji');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31-oji', '31-oji');
+});
+
+test('format month', function (assert) {
+ var expected = 'sausis sau_vasaris vas_kovas kov_balandis bal_gegužė geg_birželis bir_liepa lie_rugpjūtis rgp_rugsėjis rgs_spalis spa_lapkritis lap_gruodis grd'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'sekmadienis Sek S_pirmadienis Pir P_antradienis Ant A_trečiadienis Tre T_ketvirtadienis Ket K_penktadienis Pen Pn_šeštadienis Šeš Š'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('format week on US calendar', function (assert) {
+ // Tests, whether the weekday names are correct, even if the week does not start on Monday
+ moment.updateLocale('lt', {week: {dow: 0, doy: 6}});
+ var expected = 'sekmadienis Sek S_pirmadienis Pir P_antradienis Ant A_trečiadienis Tre T_ketvirtadienis Ket K_penktadienis Pen Pn_šeštadienis Šeš Š'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+ moment.updateLocale('lt', null);
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'kelios sekundės', '44 seconds = seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'minutė', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'minutė', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutės', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 10}), true), '10 minučių', '10 minutes = 10 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 11}), true), '11 minučių', '11 minutes = 11 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 19}), true), '19 minučių', '19 minutes = 19 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 20}), true), '20 minučių', '20 minutes = 20 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutės', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'valanda', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'valanda', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 valandos', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 valandos', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 10}), true), '10 valandų', '10 hours = 10 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 valandos', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'diena', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'diena', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dienos', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'diena', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dienos', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 10}), true), '10 dienų', '10 days = 10 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dienos', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'mėnuo', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'mėnuo', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'mėnuo', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 mėnesiai', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 mėnesiai', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 mėnesiai', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'mėnuo', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 mėnesiai', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 10}), true), '10 mėnesių', '10 months = 10 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'metai', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 metai', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'metai', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 metai', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'po kelių sekundžių', 'prefix');
+ assert.equal(moment(0).from(30000), 'prieš kelias sekundes', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'prieš kelias sekundes', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'po kelių sekundžių', 'in seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'po 5 dienų', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Šiandien 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Šiandien 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Šiandien 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Rytoj 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Šiandien 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Vakar 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[Praėjusį] dddd LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[Praėjusį] dddd LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[Praėjusį] dddd LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52-oji', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1-oji', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1-oji', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2-oji', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2-oji', 'Jan 15 2012 should be week 2');
+});
+
+test('month cases', function (assert) {
+ assert.equal(moment([2015, 4, 1]).format('LL'), '2015 m. gegužės 1 d.', 'uses format instead of standalone form');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('lv');
+
+test('parse', function (assert) {
+ var tests = 'janvāris jan_februāris feb_marts mar_aprīlis apr_maijs mai_jūnijs jūn_jūlijs jūl_augusts aug_septembris sep_oktobris okt_novembris nov_decembris dec'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, h:mm:ss a', 'svētdiena, 14. februāris 2010, 3:25:50 pm'],
+ ['ddd, hA', 'Sv, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2. 02 februāris feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. svētdiena Sv Sv'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '6 6. 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45. day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010.'],
+ ['LL', '2010. gada 14. februāris'],
+ ['LLL', '2010. gada 14. februāris, 15:25'],
+ ['LLLL', '2010. gada 14. februāris, svētdiena, 15:25'],
+ ['l', '14.2.2010.'],
+ ['ll', '2010. gada 14. feb'],
+ ['lll', '2010. gada 14. feb, 15:25'],
+ ['llll', '2010. gada 14. feb, Sv, 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'janvāris jan_februāris feb_marts mar_aprīlis apr_maijs mai_jūnijs jūn_jūlijs jūl_augusts aug_septembris sep_oktobris okt_novembris nov_decembris dec'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'svētdiena Sv Sv_pirmdiena P P_otrdiena O O_trešdiena T T_ceturtdiena C C_piektdiena Pk Pk_sestdiena S S'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+// Includes testing the cases of withoutSuffix = true and false.
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'dažas sekundes', '44 seconds = seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), false), 'pirms dažām sekundēm', '44 seconds with suffix = seconds ago');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'minūte', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), false), 'pirms minūtes', '45 seconds with suffix = a minute ago');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'minūte', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: -89}), false), 'pēc minūtes', '89 seconds with suffix/prefix = in a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minūtes', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), false), 'pirms 2 minūtēm', '90 seconds with suffix = 2 minutes ago');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minūtes', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), false), 'pirms 44 minūtēm', '44 minutes with suffix = 44 minutes ago');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'stunda', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), false), 'pirms stundas', '45 minutes with suffix = an hour ago');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'stunda', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 stundas', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: -90}), false), 'pēc 2 stundām', '90 minutes with suffix = in 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 stundas', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), false), 'pirms 5 stundām', '5 hours with suffix = 5 hours ago');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 stunda', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), false), 'pirms 21 stundas', '21 hours with suffix = 21 hours ago');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'diena', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), false), 'pirms dienas', '22 hours with suffix = a day ago');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'diena', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dienas', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), false), 'pirms 2 dienām', '36 hours with suffix = 2 days ago');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'diena', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dienas', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), false), 'pirms 5 dienām', '5 days with suffix = 5 days ago');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dienas', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), false), 'pirms 25 dienām', '25 days with suffix = 25 days ago');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'mēnesis', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), false), 'pirms mēneša', '26 days with suffix = a month ago');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'mēnesis', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'mēnesis', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 mēneši', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), false), 'pirms 2 mēnešiem', '46 days with suffix = 2 months ago');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 mēneši', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 mēneši', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), false), 'pirms 3 mēnešiem', '76 days with suffix = 3 months ago');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'mēnesis', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 mēneši', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), false), 'pirms 5 mēnešiem', '5 months with suffix = 5 months ago');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'gads', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), false), 'pirms gada', '345 days with suffix = a year ago');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 gadi', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), false), 'pirms 2 gadiem', '548 days with suffix = 2 years ago');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'gads', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 gadi', '5 years = 5 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), false), 'pirms 5 gadiem', '5 years with suffix = 5 years ago');
+
+ // test that numbers ending with 1 are singular except for when they end with 11 in which case they are plural
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 11}), true), '11 gadi', '11 years = 11 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 21}), true), '21 gads', '21 year = 21 year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 211}), true), '211 gadi', '211 years = 211 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 221}), false), 'pirms 221 gada', '221 year with suffix = 221 years ago');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'pēc dažām sekundēm', 'prefix');
+ assert.equal(moment(0).from(30000), 'pirms dažām sekundēm', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'pirms dažām sekundēm', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'pēc dažām sekundēm', 'in seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'pēc 5 dienām', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Šodien pulksten 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Šodien pulksten 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Šodien pulksten 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Rīt pulksten 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Šodien pulksten 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Vakar pulksten 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [pulksten] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [pulksten] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [pulksten] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[Pagājušā] dddd [pulksten] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[Pagājušā] dddd [pulksten] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[Pagājušā] dddd [pulksten] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52.', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1.', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1.', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2.', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2.', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('me');
+
+test('parse', function (assert) {
+ var tests = 'januar jan._februar feb._mart mar._april apr._maj maj_jun jun_jul jul_avgust avg._septembar sep._oktobar okt._novembar nov._decembar dec.'.split('_'),
+ i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, h:mm:ss a', 'nedjelja, 14. februar 2010, 3:25:50 pm'],
+ ['ddd, hA', 'ned., 3PM'],
+ ['M Mo MM MMMM MMM', '2 2. 02 februar feb.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. nedjelja ned. ne'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '7 7. 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45. day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14. februar 2010'],
+ ['LLL', '14. februar 2010 15:25'],
+ ['LLLL', 'nedjelja, 14. februar 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14. feb. 2010'],
+ ['lll', '14. feb. 2010 15:25'],
+ ['llll', 'ned., 14. feb. 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'januar jan._februar feb._mart mar._april apr._maj maj_jun jun_jul jul_avgust avg._septembar sep._oktobar okt._novembar nov._decembar dec.'.split('_'),
+ i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'nedjelja ned. ne_ponedjeljak pon. po_utorak uto. ut_srijeda sri. sr_četvrtak čet. če_petak pet. pe_subota sub. su'.split('_'),
+ i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'nekoliko sekundi', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'jedan minut', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'jedan minut', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minuta', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minuta', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'jedan sat', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'jedan sat', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 sata', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 sati', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 sati', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'dan', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'dan', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dana', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'dan', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dana', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dana', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'mjesec', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'mjesec', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'mjesec', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 mjeseca', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 mjeseca', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 mjeseca', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'mjesec', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 mjeseci', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'godinu', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 godine', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'godinu', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 godina', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'za nekoliko sekundi', 'prefix');
+ assert.equal(moment(0).from(30000), 'prije nekoliko sekundi', 'prefix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'prije nekoliko sekundi', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'za nekoliko sekundi', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'za 5 dana', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'danas u 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'danas u 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'danas u 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'sjutra u 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'danas u 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'juče u 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ function makeFormat(d) {
+ switch (d.day()) {
+ case 0:
+ return '[u] [nedjelju] [u] LT';
+ case 3:
+ return '[u] [srijedu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ }
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ function makeFormat(d) {
+ var lastWeekDay = [
+ '[prošle] [nedjelje] [u] LT',
+ '[prošlog] [ponedjeljka] [u] LT',
+ '[prošlog] [utorka] [u] LT',
+ '[prošle] [srijede] [u] LT',
+ '[prošlog] [četvrtka] [u] LT',
+ '[prošlog] [petka] [u] LT',
+ '[prošle] [subote] [u] LT'
+ ];
+
+ return lastWeekDay[d.day()];
+ }
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+// Monday is the first day of the week.
+// The week that contains Jan 1st is the first week of the year.
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1.', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1.', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2.', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2.', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3.', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('mi');
+
+test('parse', function (assert) {
+ var tests = 'Kohi-tāte Kohi_Hui-tanguru Hui_Poutū-te-rangi Pou_Paenga-whāwhā Pae_Haratua Hara_Pipiri Pipi_Hōngoingoi Hōngoi_Here-turi-kōkā Here_Mahuru Mahu_Whiringa-ā-nuku Whi-nu_Whiringa-ā-rangi Whi-ra_Hakihea Haki'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Rātapu, Hui-tanguru 14º 2010, 3:25:50 pm'],
+ ['ddd, hA', 'Ta, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2º 02 Hui-tanguru Hui'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14º 14'],
+ ['d do dddd ddd dd', '0 0º Rātapu Ta Ta'],
+ ['DDD DDDo DDDD', '45 45º 045'],
+ ['w wo ww', '6 6º 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45º day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 Hui-tanguru 2010'],
+ ['LLL', '14 Hui-tanguru 2010 i 15:25'],
+ ['LLLL', 'Rātapu, 14 Hui-tanguru 2010 i 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 Hui 2010'],
+ ['lll', '14 Hui 2010 i 15:25'],
+ ['llll', 'Ta, 14 Hui 2010 i 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1º', '1º');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2º', '2º');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3º', '3º');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4º', '4º');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5º', '5º');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6º', '6º');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7º', '7º');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8º', '8º');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9º', '9º');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10º', '10º');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11º', '11º');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12º', '12º');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13º', '13º');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14º', '14º');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15º', '15º');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16º', '16º');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17º', '17º');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18º', '18º');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19º', '19º');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20º', '20º');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21º', '21º');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22º', '22º');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23º', '23º');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24º', '24º');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25º', '25º');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26º', '26º');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27º', '27º');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28º', '28º');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29º', '29º');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30º', '30º');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31º', '31º');
+});
+
+test('format month', function (assert) {
+ var expected = 'Kohi-tāte Kohi_Hui-tanguru Hui_Poutū-te-rangi Pou_Paenga-whāwhā Pae_Haratua Hara_Pipiri Pipi_Hōngoingoi Hōngoi_Here-turi-kōkā Here_Mahuru Mahu_Whiringa-ā-nuku Whi-nu_Whiringa-ā-rangi Whi-ra_Hakihea Haki'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Rātapu Ta Ta_Mane Ma Ma_Tūrei Tū Tū_Wenerei We We_Tāite Tāi Tāi_Paraire Pa Pa_Hātarei Hā Hā'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'te hēkona ruarua', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'he meneti', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'he meneti', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 meneti', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 meneti', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'te haora', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'te haora', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 haora', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 haora', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 haora', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'he ra', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'he ra', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 ra', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'he ra', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 ra', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 ra', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'he marama', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'he marama', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'he marama', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 marama', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 marama', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 marama', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'he marama', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 marama', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'he tau', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 tau', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'he tau', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 tau', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'i roto i te hēkona ruarua', 'prefix');
+ assert.equal(moment(0).from(30000), 'te hēkona ruarua i mua', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'te hēkona ruarua i mua', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'i roto i te hēkona ruarua', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'i roto i 5 ra', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'i teie mahana, i 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'i teie mahana, i 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'i teie mahana, i 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'apopo i 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'i teie mahana, i 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'inanahi i 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [i] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [i] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [i] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [whakamutunga i] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [whakamutunga i] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [whakamutunga i] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52º', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1º', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1º', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2º', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2º', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('mk');
+
+test('parse', function (assert) {
+ var tests = 'јануари јан_февруари фев_март мар_април апр_мај мај_јуни јун_јули јул_август авг_септември сеп_октомври окт_ноември ное_декември дек'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, H:mm:ss', 'недела, февруари 14-ти 2010, 15:25:50'],
+ ['ddd, hA', 'нед, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2-ри 02 февруари фев'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14-ти 14'],
+ ['d do dddd ddd dd', '0 0-ев недела нед нe'],
+ ['DDD DDDo DDDD', '45 45-ти 045'],
+ ['w wo ww', '7 7-ми 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45-ти day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14 февруари 2010'],
+ ['LLL', '14 февруари 2010 15:25'],
+ ['LLLL', 'недела, 14 февруари 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14 фев 2010'],
+ ['lll', '14 фев 2010 15:25'],
+ ['llll', 'нед, 14 фев 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1-ви', '1-ви');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2-ри', '2-ри');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3-ти', '3-ти');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4-ти', '4-ти');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5-ти', '5-ти');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6-ти', '6-ти');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7-ми', '7-ми');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8-ми', '8-ми');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9-ти', '9-ти');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10-ти', '10-ти');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11-ти', '11-ти');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12-ти', '12-ти');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13-ти', '13-ти');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14-ти', '14-ти');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15-ти', '15-ти');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16-ти', '16-ти');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17-ти', '17-ти');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18-ти', '18-ти');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19-ти', '19-ти');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20-ти', '20-ти');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21-ви', '21-ви');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22-ри', '22-ри');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23-ти', '23-ти');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24-ти', '24-ти');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25-ти', '25-ти');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26-ти', '26-ти');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27-ми', '27-ми');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28-ми', '28-ми');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29-ти', '29-ти');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30-ти', '30-ти');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31-ви', '31-ви');
+});
+
+test('format month', function (assert) {
+ var expected = 'јануари јан_февруари фев_март мар_април апр_мај мај_јуни јун_јули јул_август авг_септември сеп_октомври окт_ноември ное_декември дек'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'недела нед нe_понеделник пон пo_вторник вто вт_среда сре ср_четврток чет че_петок пет пе_сабота саб сa'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'неколку секунди', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'минута', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'минута', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 минути', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 минути', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'час', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'час', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 часа', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 часа', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 часа', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'ден', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'ден', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 дена', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'ден', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 дена', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 дена', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'месец', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'месец', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'месец', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 месеци', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 месеци', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 месеци', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'месец', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 месеци', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'година', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 години', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'година', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 години', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'после неколку секунди', 'prefix');
+ assert.equal(moment(0).from(30000), 'пред неколку секунди', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'пред неколку секунди', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'после неколку секунди', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'после 5 дена', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Денес во 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Денес во 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Денес во 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Утре во 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Денес во 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Вчера во 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('[Во] dddd [во] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[Во] dddd [во] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[Во] dddd [во] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ function makeFormat(d) {
+ switch (d.day()) {
+ case 0:
+ case 3:
+ case 6:
+ return '[Изминатата] dddd [во] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[Изминатиот] dddd [во] LT';
+ }
+ }
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1-ви', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1-ви', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2-ри', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2-ри', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3-ти', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('ml');
+
+test('parse', function (assert) {
+ var tests = 'ജനുവരി ജനു._ഫെബ്രുവരി ഫെബ്രു._മാർച്ച് മാർ._ഏപ്രിൽ ഏപ്രി._മേയ് മേയ്_ജൂൺ ജൂൺ_ജൂലൈ ജൂലൈ._ഓഗസ്റ്റ് ഓഗ._സെപ്റ്റംബർ സെപ്റ്റ._ഒക്ടോബർ ഒക്ടോ._നവംബർ നവം._ഡിസംബർ ഡിസം.'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, a h:mm:ss -നു', 'ഞായറാഴ്ച, 14 ഫെബ്രുവരി 2010, ഉച്ച കഴിഞ്ഞ് 3:25:50 -നു'],
+ ['ddd, a h -നു', 'ഞായർ, ഉച്ച കഴിഞ്ഞ് 3 -നു'],
+ ['M Mo MM MMMM MMM', '2 2 02 ഫെബ്രുവരി ഫെബ്രു.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 ഞായറാഴ്ച ഞായർ ഞാ'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '8 8 08'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'ഉച്ച കഴിഞ്ഞ് ഉച്ച കഴിഞ്ഞ്'],
+ ['LTS', 'ഉച്ച കഴിഞ്ഞ് 3:25:50 -നു'],
+ ['L', '14/02/2010'],
+ ['LL', '14 ഫെബ്രുവരി 2010'],
+ ['LLL', '14 ഫെബ്രുവരി 2010, ഉച്ച കഴിഞ്ഞ് 3:25 -നു'],
+ ['LLLL', 'ഞായറാഴ്ച, 14 ഫെബ്രുവരി 2010, ഉച്ച കഴിഞ്ഞ് 3:25 -നു'],
+ ['l', '14/2/2010'],
+ ['ll', '14 ഫെബ്രു. 2010'],
+ ['lll', '14 ഫെബ്രു. 2010, ഉച്ച കഴിഞ്ഞ് 3:25 -നു'],
+ ['llll', 'ഞായർ, 14 ഫെബ്രു. 2010, ഉച്ച കഴിഞ്ഞ് 3:25 -നു']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1', '1');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2', '2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3', '3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4', '4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5', '5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6', '6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7', '7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8', '8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9', '9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10', '10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11', '11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12', '12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13', '13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14', '14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15', '15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16', '16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17', '17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18', '18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19', '19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20', '20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21', '21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22', '22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23', '23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24', '24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25', '25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26', '26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27', '27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28', '28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29', '29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30', '30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31', '31');
+});
+
+test('format month', function (assert) {
+ var expected = 'ജനുവരി ജനു._ഫെബ്രുവരി ഫെബ്രു._മാർച്ച് മാർ._ഏപ്രിൽ ഏപ്രി._മേയ് മേയ്_ജൂൺ ജൂൺ_ജൂലൈ ജൂലൈ._ഓഗസ്റ്റ് ഓഗ._സെപ്റ്റംബർ സെപ്റ്റ._ഒക്ടോബർ ഒക്ടോ._നവംബർ നവം._ഡിസംബർ ഡിസം.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'ഞായറാഴ്ച ഞായർ ഞാ_തിങ്കളാഴ്ച തിങ്കൾ തി_ചൊവ്വാഴ്ച ചൊവ്വ ചൊ_ബുധനാഴ്ച ബുധൻ ബു_വ്യാഴാഴ്ച വ്യാഴം വ്യാ_വെള്ളിയാഴ്ച വെള്ളി വെ_ശനിയാഴ്ച ശനി ശ'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'അൽപ നിമിഷങ്ങൾ', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'ഒരു മിനിറ്റ്', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'ഒരു മിനിറ്റ്', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 മിനിറ്റ്', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 മിനിറ്റ്', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'ഒരു മണിക്കൂർ', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'ഒരു മണിക്കൂർ', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 മണിക്കൂർ', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 മണിക്കൂർ', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 മണിക്കൂർ', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'ഒരു ദിവസം', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'ഒരു ദിവസം', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 ദിവസം', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'ഒരു ദിവസം', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 ദിവസം', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 ദിവസം', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'ഒരു മാസം', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'ഒരു മാസം', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'ഒരു മാസം', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 മാസം', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 മാസം', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 മാസം', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'ഒരു മാസം', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 മാസം', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'ഒരു വർഷം', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 വർഷം', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'ഒരു വർഷം', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 വർഷം', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'അൽപ നിമിഷങ്ങൾ കഴിഞ്ഞ്', 'prefix');
+ assert.equal(moment(0).from(30000), 'അൽപ നിമിഷങ്ങൾ മുൻപ്', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'അൽപ നിമിഷങ്ങൾ മുൻപ്', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'അൽപ നിമിഷങ്ങൾ കഴിഞ്ഞ്', 'അൽപ നിമിഷങ്ങൾ കഴിഞ്ഞ്');
+ assert.equal(moment().add({d: 5}).fromNow(), '5 ദിവസം കഴിഞ്ഞ്', '5 ദിവസം കഴിഞ്ഞ്');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'ഇന്ന് ഉച്ച കഴിഞ്ഞ് 12:00 -നു', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'ഇന്ന് ഉച്ച കഴിഞ്ഞ് 12:25 -നു', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 3}).calendar(), 'ഇന്ന് ഉച്ച കഴിഞ്ഞ് 3:00 -നു', 'Now plus 3 hours');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'നാളെ ഉച്ച കഴിഞ്ഞ് 12:00 -നു', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'ഇന്ന് രാവിലെ 11:00 -നു', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'ഇന്നലെ ഉച്ച കഴിഞ്ഞ് 12:00 -നു', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd[,] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd[,] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd[,] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[കഴിഞ്ഞ] dddd[,] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[കഴിഞ്ഞ] dddd[,] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[കഴിഞ്ഞ] dddd[,] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('meridiem', function (assert) {
+ assert.equal(moment([2011, 2, 23, 2, 30]).format('a'), 'രാത്രി', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 9, 30]).format('a'), 'രാവിലെ', 'morning');
+ assert.equal(moment([2011, 2, 23, 14, 30]).format('a'), 'ഉച്ച കഴിഞ്ഞ്', 'during day');
+ assert.equal(moment([2011, 2, 23, 17, 30]).format('a'), 'വൈകുന്നേരം', 'evening');
+ assert.equal(moment([2011, 2, 23, 19, 30]).format('a'), 'വൈകുന്നേരം', 'late evening');
+ assert.equal(moment([2011, 2, 23, 21, 20]).format('a'), 'രാത്രി', 'night');
+
+ assert.equal(moment([2011, 2, 23, 2, 30]).format('A'), 'രാത്രി', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 9, 30]).format('A'), 'രാവിലെ', 'morning');
+ assert.equal(moment([2011, 2, 23, 14, 30]).format('A'), 'ഉച്ച കഴിഞ്ഞ്', ' during day');
+ assert.equal(moment([2011, 2, 23, 17, 30]).format('A'), 'വൈകുന്നേരം', 'evening');
+ assert.equal(moment([2011, 2, 23, 19, 30]).format('A'), 'വൈകുന്നേരം', 'late evening');
+ assert.equal(moment([2011, 2, 23, 21, 20]).format('A'), 'രാത്രി', 'night');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '1 01 1', 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '2 02 2', 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '3 03 3', 'Jan 15 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('mr');
+
+test('parse', function (assert) {
+ var tests = 'जानेवारी जाने._फेब्रुवारी फेब्रु._मार्च मार्च._एप्रिल एप्रि._मे मे._जून जून._जुलै जुलै._ऑगस्ट ऑग._सप्टेंबर सप्टें._ऑक्टोबर ऑक्टो._नोव्हेंबर नोव्हें._डिसेंबर डिसें.'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, a h:mm:ss वाजता', 'रविवार, १४ फेब्रुवारी २०१०, दुपारी ३:२५:५० वाजता'],
+ ['ddd, a h वाजता', 'रवि, दुपारी ३ वाजता'],
+ ['M Mo MM MMMM MMM', '२ २ ०२ फेब्रुवारी फेब्रु.'],
+ ['YYYY YY', '२०१० १०'],
+ ['D Do DD', '१४ १४ १४'],
+ ['d do dddd ddd dd', '० ० रविवार रवि र'],
+ ['DDD DDDo DDDD', '४५ ४५ ०४५'],
+ ['w wo ww', '८ ८ ०८'],
+ ['h hh', '३ ०३'],
+ ['H HH', '१५ १५'],
+ ['m mm', '२५ २५'],
+ ['s ss', '५० ५०'],
+ ['a A', 'दुपारी दुपारी'],
+ ['LTS', 'दुपारी ३:२५:५० वाजता'],
+ ['L', '१४/०२/२०१०'],
+ ['LL', '१४ फेब्रुवारी २०१०'],
+ ['LLL', '१४ फेब्रुवारी २०१०, दुपारी ३:२५ वाजता'],
+ ['LLLL', 'रविवार, १४ फेब्रुवारी २०१०, दुपारी ३:२५ वाजता'],
+ ['l', '१४/२/२०१०'],
+ ['ll', '१४ फेब्रु. २०१०'],
+ ['lll', '१४ फेब्रु. २०१०, दुपारी ३:२५ वाजता'],
+ ['llll', 'रवि, १४ फेब्रु. २०१०, दुपारी ३:२५ वाजता']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '१', '१');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '२', '२');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '३', '३');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '४', '४');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '५', '५');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '६', '६');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '७', '७');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '८', '८');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '९', '९');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '१०', '१०');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '११', '११');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '१२', '१२');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '१३', '१३');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '१४', '१४');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '१५', '१५');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '१६', '१६');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '१७', '१७');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '१८', '१८');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '१९', '१९');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '२०', '२०');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '२१', '२१');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '२२', '२२');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '२३', '२३');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '२४', '२४');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '२५', '२५');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '२६', '२६');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '२७', '२७');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '२८', '२८');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '२९', '२९');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '३०', '३०');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '३१', '३१');
+});
+
+test('format month', function (assert) {
+ var expected = 'जानेवारी जाने._फेब्रुवारी फेब्रु._मार्च मार्च._एप्रिल एप्रि._मे मे._जून जून._जुलै जुलै._ऑगस्ट ऑग._सप्टेंबर सप्टें._ऑक्टोबर ऑक्टो._नोव्हेंबर नोव्हें._डिसेंबर डिसें.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'रविवार रवि र_सोमवार सोम सो_मंगळवार मंगळ मं_बुधवार बुध बु_गुरूवार गुरू गु_शुक्रवार शुक्र शु_शनिवार शनि श'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'काही सेकंद', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'एक मिनिट', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'एक मिनिट', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '२ मिनिटे', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '४४ मिनिटे', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'एक तास', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'एक तास', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '२ तास', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '५ तास', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '२१ तास', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'एक दिवस', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'एक दिवस', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '२ दिवस', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'एक दिवस', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '५ दिवस', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '२५ दिवस', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'एक महिना', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'एक महिना', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'एक महिना', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '२ महिने', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '२ महिने', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '३ महिने', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'एक महिना', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '५ महिने', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'एक वर्ष', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '२ वर्षे', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'एक वर्ष', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '५ वर्षे', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'काही सेकंदांमध्ये', 'prefix');
+ assert.equal(moment(0).from(30000), 'काही सेकंदांपूर्वी', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'काही सेकंदांपूर्वी', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'काही सेकंदांमध्ये', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), '५ दिवसांमध्ये', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'आज दुपारी १२:०० वाजता', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'आज दुपारी १२:२५ वाजता', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 3}).calendar(), 'आज दुपारी ३:०० वाजता', 'Now plus 3 hours');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'उद्या दुपारी १२:०० वाजता', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'आज दुपारी ११:०० वाजता', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'काल दुपारी १२:०० वाजता', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd[,] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd[,] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd[,] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[मागील] dddd[,] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[मागील] dddd[,] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[मागील] dddd[,] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('meridiem', function (assert) {
+ assert.equal(moment([2011, 2, 23, 2, 30]).format('a'), 'रात्री', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 9, 30]).format('a'), 'सकाळी', 'morning');
+ assert.equal(moment([2011, 2, 23, 14, 30]).format('a'), 'दुपारी', 'during day');
+ assert.equal(moment([2011, 2, 23, 17, 30]).format('a'), 'सायंकाळी', 'evening');
+ assert.equal(moment([2011, 2, 23, 19, 30]).format('a'), 'सायंकाळी', 'late evening');
+ assert.equal(moment([2011, 2, 23, 21, 20]).format('a'), 'रात्री', 'night');
+
+ assert.equal(moment([2011, 2, 23, 2, 30]).format('A'), 'रात्री', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 9, 30]).format('A'), 'सकाळी', 'morning');
+ assert.equal(moment([2011, 2, 23, 14, 30]).format('A'), 'दुपारी', ' during day');
+ assert.equal(moment([2011, 2, 23, 17, 30]).format('A'), 'सायंकाळी', 'evening');
+ assert.equal(moment([2011, 2, 23, 19, 30]).format('A'), 'सायंकाळी', 'late evening');
+ assert.equal(moment([2011, 2, 23, 21, 20]).format('A'), 'रात्री', 'night');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '१ ०१ १', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '१ ०१ १', 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '२ ०२ २', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '२ ०२ २', 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '३ ०३ ३', 'Jan 15 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('ms-my');
+
+test('parse', function (assert) {
+ var i,
+ tests = 'Januari Jan_Februari Feb_Mac Mac_April Apr_Mei Mei_Jun Jun_Julai Jul_Ogos Ogs_September Sep_Oktober Okt_November Nov_Disember Dis'.split('_');
+
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' sepatutnya bulan ' + (i + 1));
+ }
+
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Ahad, Februari 14 2010, 3:25:50 petang'],
+ ['ddd, hA', 'Ahd, 3petang'],
+ ['M Mo MM MMMM MMM', '2 2 02 Februari Feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 Ahad Ahd Ah'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '7 7 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'petang petang'],
+ ['[hari] [ke] DDDo [tahun] ini', 'hari ke 45 tahun ini'],
+ ['LTS', '15.25.50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 Februari 2010'],
+ ['LLL', '14 Februari 2010 pukul 15.25'],
+ ['LLLL', 'Ahad, 14 Februari 2010 pukul 15.25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 Feb 2010'],
+ ['lll', '14 Feb 2010 pukul 15.25'],
+ ['llll', 'Ahd, 14 Feb 2010 pukul 15.25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1', '1');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2', '2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3', '3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4', '4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5', '5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6', '6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7', '7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8', '8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9', '9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10', '10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11', '11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12', '12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13', '13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14', '14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15', '15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16', '16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17', '17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18', '18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19', '19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20', '20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21', '21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22', '22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23', '23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24', '24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25', '25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26', '26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27', '27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28', '28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29', '29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30', '30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31', '31');
+});
+
+test('format month', function (assert) {
+ var i,
+ expected = 'Januari Jan_Februari Feb_Mac Mac_April Apr_Mei Mei_Jun Jun_Julai Jul_Ogos Ogs_September Sep_Oktober Okt_November Nov_Disember Dis'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var i,
+ expected = 'Ahad Ahd Ah_Isnin Isn Is_Selasa Sel Sl_Rabu Rab Rb_Khamis Kha Km_Jumaat Jum Jm_Sabtu Sab Sb'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'beberapa saat', '44 saat = beberapa saat');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'seminit', '45 saat = seminit');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'seminit', '89 saat = seminit');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minit', '90 saat = 2 minit');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minit', '44 minit = 44 minit');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'sejam', '45 minit = sejam');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'sejam', '89 minit = sejam');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 jam', '90 minit = 2 jam');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 jam', '5 jam = 5 jam');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 jam', '21 jam = 21 jam');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'sehari', '22 jam = sehari');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'sehari', '35 jam = sehari');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 hari', '36 jam = 2 hari');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'sehari', '1 hari = sehari');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 hari', '5 hari = 5 hari');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 hari', '25 hari = 25 hari');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'sebulan', '26 hari = sebulan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'sebulan', '30 hari = sebulan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'sebulan', '45 hari = sebulan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 bulan', '46 hari = 2 bulan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 bulan', '75 hari = 2 bulan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 bulan', '76 hari = 3 bulan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'sebulan', '1 bulan = sebulan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 bulan', '5 bulan = 5 bulan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'setahun', '345 hari = setahun');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 tahun', '548 hari = 2 tahun');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'setahun', '1 tahun = setahun');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 tahun', '5 tahun = 5 tahun');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'dalam beberapa saat', 'prefix');
+ assert.equal(moment(0).from(30000), 'beberapa saat yang lepas', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'beberapa saat yang lepas', 'waktu sekarang dari sekarang sepatutnya menunjukkan sebagai telah lepas');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'dalam beberapa saat', 'dalam beberapa saat');
+ assert.equal(moment().add({d: 5}).fromNow(), 'dalam 5 hari', 'dalam 5 hari');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Hari ini pukul 12.00', 'hari ini pada waktu yang sama');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Hari ini pukul 12.25', 'Sekarang tambah 25 minit');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Hari ini pukul 13.00', 'Sekarang tambah 1 jam');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Esok pukul 12.00', 'esok pada waktu yang sama');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Hari ini pukul 11.00', 'Sekarang tolak 1 jam');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Kelmarin pukul 12.00', 'kelmarin pada waktu yang sama');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [pukul] LT'), 'Hari ini + ' + i + ' hari waktu sekarang');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [pukul] LT'), 'Hari ini + ' + i + ' hari permulaan hari');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [pukul] LT'), 'Hari ini + ' + i + ' hari tamat hari');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [lepas] [pukul] LT'), 'Hari ini - ' + i + ' hari waktu sekarang');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [lepas] [pukul] LT'), 'Hari ini - ' + i + ' hari permulaan hari');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [lepas] [pukul] LT'), 'Hari ini - ' + i + ' hari tamat hari');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 minggu lepas');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'dalam 1 minggu');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 minggu lepas');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'dalam 2 minggu');
+});
+
+test('weeks year starting sunday format', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1', 'Jan 1 2012 sepatutnya minggu 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '2 02 2', 'Jan 7 2012 sepatutnya minggu 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2', 'Jan 8 2012 sepatutnya minggu 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '3 03 3', 'Jan 14 2012 sepatutnya minggu 3');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '3 03 3', 'Jan 15 2012 sepatutnya minggu 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('ms');
+
+test('parse', function (assert) {
+ var i,
+ tests = 'Januari Jan_Februari Feb_Mac Mac_April Apr_Mei Mei_Jun Jun_Julai Jul_Ogos Ogs_September Sep_Oktober Okt_November Nov_Disember Dis'.split('_');
+
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' sepatutnya bulan ' + (i + 1));
+ }
+
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Ahad, Februari 14 2010, 3:25:50 petang'],
+ ['ddd, hA', 'Ahd, 3petang'],
+ ['M Mo MM MMMM MMM', '2 2 02 Februari Feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 Ahad Ahd Ah'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '7 7 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'petang petang'],
+ ['[hari] [ke] DDDo [tahun] ini', 'hari ke 45 tahun ini'],
+ ['LTS', '15.25.50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 Februari 2010'],
+ ['LLL', '14 Februari 2010 pukul 15.25'],
+ ['LLLL', 'Ahad, 14 Februari 2010 pukul 15.25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 Feb 2010'],
+ ['lll', '14 Feb 2010 pukul 15.25'],
+ ['llll', 'Ahd, 14 Feb 2010 pukul 15.25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1', '1');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2', '2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3', '3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4', '4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5', '5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6', '6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7', '7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8', '8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9', '9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10', '10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11', '11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12', '12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13', '13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14', '14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15', '15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16', '16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17', '17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18', '18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19', '19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20', '20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21', '21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22', '22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23', '23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24', '24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25', '25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26', '26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27', '27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28', '28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29', '29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30', '30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31', '31');
+});
+
+test('format month', function (assert) {
+ var i,
+ expected = 'Januari Jan_Februari Feb_Mac Mac_April Apr_Mei Mei_Jun Jun_Julai Jul_Ogos Ogs_September Sep_Oktober Okt_November Nov_Disember Dis'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var i,
+ expected = 'Ahad Ahd Ah_Isnin Isn Is_Selasa Sel Sl_Rabu Rab Rb_Khamis Kha Km_Jumaat Jum Jm_Sabtu Sab Sb'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'beberapa saat', '44 saat = beberapa saat');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'seminit', '45 saat = seminit');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'seminit', '89 saat = seminit');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minit', '90 saat = 2 minit');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minit', '44 minit = 44 minit');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'sejam', '45 minit = sejam');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'sejam', '89 minit = sejam');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 jam', '90 minit = 2 jam');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 jam', '5 jam = 5 jam');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 jam', '21 jam = 21 jam');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'sehari', '22 jam = sehari');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'sehari', '35 jam = sehari');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 hari', '36 jam = 2 hari');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'sehari', '1 hari = sehari');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 hari', '5 hari = 5 hari');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 hari', '25 hari = 25 hari');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'sebulan', '26 hari = sebulan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'sebulan', '30 hari = sebulan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'sebulan', '45 hari = sebulan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 bulan', '46 hari = 2 bulan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 bulan', '75 hari = 2 bulan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 bulan', '76 hari = 3 bulan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'sebulan', '1 bulan = sebulan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 bulan', '5 bulan = 5 bulan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'setahun', '345 hari = setahun');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 tahun', '548 hari = 2 tahun');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'setahun', '1 tahun = setahun');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 tahun', '5 tahun = 5 tahun');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'dalam beberapa saat', 'prefix');
+ assert.equal(moment(0).from(30000), 'beberapa saat yang lepas', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'beberapa saat yang lepas', 'waktu sekarang dari sekarang sepatutnya menunjukkan sebagai telah lepas');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'dalam beberapa saat', 'dalam beberapa saat');
+ assert.equal(moment().add({d: 5}).fromNow(), 'dalam 5 hari', 'dalam 5 hari');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Hari ini pukul 12.00', 'hari ini pada waktu yang sama');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Hari ini pukul 12.25', 'Sekarang tambah 25 minit');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Hari ini pukul 13.00', 'Sekarang tambah 1 jam');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Esok pukul 12.00', 'esok pada waktu yang sama');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Hari ini pukul 11.00', 'Sekarang tolak 1 jam');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Kelmarin pukul 12.00', 'kelmarin pada waktu yang sama');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [pukul] LT'), 'Hari ini + ' + i + ' hari waktu sekarang');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [pukul] LT'), 'Hari ini + ' + i + ' hari permulaan hari');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [pukul] LT'), 'Hari ini + ' + i + ' hari tamat hari');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [lepas] [pukul] LT'), 'Hari ini - ' + i + ' hari waktu sekarang');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [lepas] [pukul] LT'), 'Hari ini - ' + i + ' hari permulaan hari');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [lepas] [pukul] LT'), 'Hari ini - ' + i + ' hari tamat hari');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 minggu lepas');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'dalam 1 minggu');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 minggu lepas');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'dalam 2 minggu');
+});
+
+test('weeks year starting sunday format', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1', 'Jan 1 2012 sepatutnya minggu 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '2 02 2', 'Jan 7 2012 sepatutnya minggu 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2', 'Jan 8 2012 sepatutnya minggu 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '3 03 3', 'Jan 14 2012 sepatutnya minggu 3');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '3 03 3', 'Jan 15 2012 sepatutnya minggu 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('my');
+
+test('parse', function (assert) {
+ var tests = 'ဇန်နဝါရီ ဇန်_ဖေဖော်ဝါရီ ဖေ_မတ် မတ်_ဧပြီ ပြီ_မေ မေ_ဇွန် ဇွန်_ဇူလိုင် လိုင်_သြဂုတ် သြ_စက်တင်ဘာ စက်_အောက်တိုဘာ အောက်_နိုဝင်ဘာ နို_ဒီဇင်ဘာ ဒီ'.split('_'),
+ i;
+
+ function equalTest (input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'တနင်္ဂနွေ, ဖေဖော်ဝါရီ ၁၄ ၂၀၁၀, ၃:၂၅:၅၀ pm'],
+ ['ddd, hA', 'နွေ, ၃PM'],
+ ['M Mo MM MMMM MMM', '၂ ၂ ၀၂ ဖေဖော်ဝါရီ ဖေ'],
+ ['YYYY YY', '၂၀၁၀ ၁၀'],
+ ['D Do DD', '၁၄ ၁၄ ၁၄'],
+ ['d do dddd ddd dd', '၀ ၀ တနင်္ဂနွေ နွေ နွေ'],
+ ['DDD DDDo DDDD', '၄၅ ၄၅ ၀၄၅'],
+ ['w wo ww', '၆ ၆ ၀၆'],
+ ['h hh', '၃ ၀၃'],
+ ['H HH', '၁၅ ၁၅'],
+ ['m mm', '၂၅ ၂၅'],
+ ['s ss', '၅၀ ၅၀'],
+ ['a A', 'pm PM'],
+ ['[နှစ်၏] DDDo [ရက်မြောက်]', 'နှစ်၏ ၄၅ ရက်မြောက်'],
+ ['LTS', '၁၅:၂၅:၅၀'],
+ ['L', '၁၄/၀၂/၂၀၁၀'],
+ ['LL', '၁၄ ဖေဖော်ဝါရီ ၂၀၁၀'],
+ ['LLL', '၁၄ ဖေဖော်ဝါရီ ၂၀၁၀ ၁၅:၂၅'],
+ ['LLLL', 'တနင်္ဂနွေ ၁၄ ဖေဖော်ဝါရီ ၂၀၁၀ ၁၅:၂၅'],
+ ['l', '၁၄/၂/၂၀၁၀'],
+ ['ll', '၁၄ ဖေ ၂၀၁၀'],
+ ['lll', '၁၄ ဖေ ၂၀၁၀ ၁၅:၂၅'],
+ ['llll', 'နွေ ၁၄ ဖေ ၂၀၁၀ ၁၅:၂၅']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '၁', '၁');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '၂', '၂');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '၃', '၃');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '၄', '၄');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '၅', '၅');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '၆', '၆');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '၇', '၇');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '၈', '၈');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '၉', '၉');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '၁၀', '၁၀');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '၁၁', '၁၁');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '၁၂', '၁၂');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '၁၃', '၁၃');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '၁၄', '၁၄');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '၁၅', '၁၅');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '၁၆', '၁၆');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '၁၇', '၁၇');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '၁၈', '၁၈');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '၁၉', '၁၉');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '၂၀', '၂၀');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '၂၁', '၂၁');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '၂၂', '၂၂');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '၂၃', '၂၃');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '၂၄', '၂၄');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '၂၅', '၂၅');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '၂၆', '၂၆');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '၂၇', '၂၇');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '၂၈', '၂၈');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '၂၉', '၂၉');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '၃၀', '၃၀');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '၃၁', '၃၁');
+});
+
+test('format month', function (assert) {
+ var expected = 'ဇန်နဝါရီ ဇန်_ဖေဖော်ဝါရီ ဖေ_မတ် မတ်_ဧပြီ ပြီ_မေ မေ_ဇွန် ဇွန်_ဇူလိုင် လိုင်_သြဂုတ် သြ_စက်တင်ဘာ စက်_အောက်တိုဘာ အောက်_နိုဝင်ဘာ နို_ဒီဇင်ဘာ ဒီ'.split('_'),
+ i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'တနင်္ဂနွေ နွေ နွေ_တနင်္လာ လာ လာ_အင်္ဂါ ဂါ ဂါ_ဗုဒ္ဓဟူး ဟူး ဟူး_ကြာသပတေး ကြာ ကြာ_သောကြာ သော သော_စနေ နေ နေ'.split('_'),
+ i;
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ s: 44
+ }), true), 'စက္ကန်.အနည်းငယ်', '၄၄ စက္ကန်. = စက္ကန်.အနည်းငယ်');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ s: 45
+ }), true), 'တစ်မိနစ်', '၄၅ စက္ကန်. = တစ်မိနစ်');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ s: 89
+ }), true), 'တစ်မိနစ်', '၈၉ စက္ကန်. = တစ်မိနစ်');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ s: 90
+ }), true), '၂ မိနစ်', '၉၀ စက္ကန်. = ၂ မိနစ်');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ m: 44
+ }), true), '၄၄ မိနစ်', '၄၄ မိနစ် = ၄၄ မိနစ်');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ m: 45
+ }), true), 'တစ်နာရီ', '၄၅ မိနစ် = ၁ နာရီ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ m: 89
+ }), true), 'တစ်နာရီ', '၈၉ မိနစ် = တစ်နာရီ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ m: 90
+ }), true), '၂ နာရီ', 'မိနစ် ၉၀= ၂ နာရီ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ h: 5
+ }), true), '၅ နာရီ', '၅ နာရီ= ၅ နာရီ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ h: 21
+ }), true), '၂၁ နာရီ', '၂၁ နာရီ =၂၁ နာရီ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ h: 22
+ }), true), 'တစ်ရက်', '၂၂ နာရီ =တစ်ရက်');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ h: 35
+ }), true), 'တစ်ရက်', '၃၅ နာရီ =တစ်ရက်');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ h: 36
+ }), true), '၂ ရက်', '၃၆ နာရီ = ၂ ရက်');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 1
+ }), true), 'တစ်ရက်', '၁ ရက်= တစ်ရက်');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 5
+ }), true), '၅ ရက်', '၅ ရက် = ၅ ရက်');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 25
+ }), true), '၂၅ ရက်', '၂၅ ရက်= ၂၅ ရက်');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 26
+ }), true), 'တစ်လ', '၂၆ ရက် = တစ်လ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 30
+ }), true), 'တစ်လ', 'ရက် ၃၀ = တစ်လ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 43
+ }), true), 'တစ်လ', '၄၃ ရက် = တစ်လ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 46
+ }), true), '၂ လ', '၄၆ ရက် = ၂ လ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 74
+ }), true), '၂ လ', '၇၅ ရက်= ၂ လ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 76
+ }), true), '၃ လ', '၇၆ ရက် = ၃ လ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ M: 1
+ }), true), 'တစ်လ', '၁ လ = တစ်လ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ M: 5
+ }), true), '၅ လ', '၅ လ = ၅ လ');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 345
+ }), true), 'တစ်နှစ်', '၃၄၅ ရက် = တစ်နှစ်');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ d: 548
+ }), true), '၂ နှစ်', '၅၄၈ ရက် = ၂ နှစ်');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ y: 1
+ }), true), 'တစ်နှစ်', '၁ နှစ် = တစ်နှစ်');
+ assert.equal(start.from(moment([2007, 1, 28]).add({
+ y: 5
+ }), true), '၅ နှစ်', '၅ နှစ် = ၅ နှစ်');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'လာမည့် စက္ကန်.အနည်းငယ် မှာ', 'prefix');
+ assert.equal(moment(0).from(30000), 'လွန်ခဲ့သော စက္ကန်.အနည်းငယ် က', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'လွန်ခဲ့သော စက္ကန်.အနည်းငယ် က', 'ယခုမှစပြီး အတိတ်တွင်ဖော်ပြသလိုဖော်ပြမည်');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({
+ s: 30
+ }).fromNow(), 'လာမည့် စက္ကန်.အနည်းငယ် မှာ', 'လာမည့် စက္ကန်.အနည်းငယ် မှာ');
+ assert.equal(moment().add({
+ d: 5
+ }).fromNow(), 'လာမည့် ၅ ရက် မှာ', 'လာမည့် ၅ ရက် မှာ');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'ယနေ. ၁၂:၀၀ မှာ', 'ယနေ. ဒီအချိန်');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'ယနေ. ၁၂:၂၅ မှာ', 'ယခုမှ ၂၅ မိနစ်ပေါင်းထည့်');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'ယနေ. ၁၃:၀၀ မှာ', 'ယခုမှ ၁ နာရီပေါင်းထည့်');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'မနက်ဖြန် ၁၂:၀၀ မှာ', 'မနက်ဖြန် ဒီအချိန်');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'ယနေ. ၁၁:၀၀ မှာ', 'ယခုမှ ၁ နာရီနှုတ်');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'မနေ.က ၁၂:၀၀ မှာ', 'မနေ.က ဒီအချိန်');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({
+ d: i
+ });
+ assert.equal(m.calendar(), m.format('dddd LT [မှာ]'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd LT [မှာ]'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd LT [မှာ]'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({
+ d: i
+ });
+ assert.equal(m.calendar(), m.format('[ပြီးခဲ့သော] dddd LT [မှာ]'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[ပြီးခဲ့သော] dddd LT [မှာ]'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[ပြီးခဲ့သော] dddd LT [မှာ]'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({
+ w: 1
+ }),
+ weeksFromNow = moment().add({
+ w: 1
+ });
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), 'လွန်ခဲ့သော ၁ ပတ်က');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), '၁ ပတ်အတွင်း');
+
+ weeksAgo = moment().subtract({
+ w: 2
+ });
+ weeksFromNow = moment().add({
+ w: 2
+ });
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '၂ ပတ် အရင်က');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), '၂ ပတ် အတွင်း');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '၅၂ ၅၂ ၅၂', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '၁ ၀၁ ၁', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '၁ ၀၁ ၁', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '၂ ၀၂ ၂', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '၂ ၀၂ ၂', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('nb');
+
+test('parse', function (assert) {
+ var tests = 'januar jan._februar feb._mars mars_april april_mai mai_juni juni_juli juli_august aug._september sep._oktober okt._november nov._desember des.'.split('_'),
+ i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'søndag, februar 14. 2010, 3:25:50 pm'],
+ ['ddd, hA', 'sø., 3PM'],
+ ['M Mo MM MMMM MMM', '2 2. 02 februar feb.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. søndag sø. sø'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '6 6. 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[den] DDDo [dagen i året]', 'den 45. dagen i året'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14. februar 2010'],
+ ['LLL', '14. februar 2010 kl. 15:25'],
+ ['LLLL', 'søndag 14. februar 2010 kl. 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14. feb. 2010'],
+ ['lll', '14. feb. 2010 kl. 15:25'],
+ ['llll', 'sø. 14. feb. 2010 kl. 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'januar jan._februar feb._mars mars_april april_mai mai_juni juni_juli juli_august aug._september sep._oktober okt._november nov._desember des.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'søndag sø. sø_mandag ma. ma_tirsdag ti. ti_onsdag on. on_torsdag to. to_fredag fr. fr_lørdag lø. lø'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'noen sekunder', '44 sekunder = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'ett minutt', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'ett minutt', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutter', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutter', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'en time', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'en time', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 timer', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 timer', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 timer', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'en dag', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'en dag', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dager', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'en dag', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dager', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dager', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'en måned', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'en måned', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'en måned', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 måneder', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 måneder', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 måneder', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'en måned', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 måneder', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'ett år', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 år', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'ett år', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 år', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'om noen sekunder', 'prefix');
+ assert.equal(moment(0).from(30000), 'noen sekunder siden', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'noen sekunder siden', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'om noen sekunder', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'om 5 dager', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'i dag kl. 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'i dag kl. 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'i dag kl. 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'i morgen kl. 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'i dag kl. 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'i går kl. 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [kl.] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [kl.] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [kl.] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[forrige] dddd [kl.] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[forrige] dddd [kl.] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[forrige] dddd [kl.] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52.', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1.', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1.', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2.', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2.', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('ne');
+
+test('parse', function (assert) {
+ var tests = 'जनवरी जन._फेब्रुवरी फेब्रु._मार्च मार्च_अप्रिल अप्रि._मई मई_जुन जुन_जुलाई जुलाई._अगष्ट अग._सेप्टेम्बर सेप्ट._अक्टोबर अक्टो._नोभेम्बर नोभे._डिसेम्बर डिसे.'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, aको h:mm:ss बजे', 'आइतबार, १४ फेब्रुवरी २०१०, दिउँसोको ३:२५:५० बजे'],
+ ['ddd, aको h बजे', 'आइत., दिउँसोको ३ बजे'],
+ ['M Mo MM MMMM MMM', '२ २ ०२ फेब्रुवरी फेब्रु.'],
+ ['YYYY YY', '२०१० १०'],
+ ['D Do DD', '१४ १४ १४'],
+ ['d do dddd ddd dd', '० ० आइतबार आइत. आ.'],
+ ['DDD DDDo DDDD', '४५ ४५ ०४५'],
+ ['w wo ww', '८ ८ ०८'],
+ ['h hh', '३ ०३'],
+ ['H HH', '१५ १५'],
+ ['m mm', '२५ २५'],
+ ['s ss', '५० ५०'],
+ ['a A', 'दिउँसो दिउँसो'],
+ ['LTS', 'दिउँसोको ३:२५:५० बजे'],
+ ['L', '१४/०२/२०१०'],
+ ['LL', '१४ फेब्रुवरी २०१०'],
+ ['LLL', '१४ फेब्रुवरी २०१०, दिउँसोको ३:२५ बजे'],
+ ['LLLL', 'आइतबार, १४ फेब्रुवरी २०१०, दिउँसोको ३:२५ बजे'],
+ ['l', '१४/२/२०१०'],
+ ['ll', '१४ फेब्रु. २०१०'],
+ ['lll', '१४ फेब्रु. २०१०, दिउँसोको ३:२५ बजे'],
+ ['llll', 'आइत., १४ फेब्रु. २०१०, दिउँसोको ३:२५ बजे']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '१', '१');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '२', '२');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '३', '३');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '४', '४');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '५', '५');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '६', '६');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '७', '७');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '८', '८');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '९', '९');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '१०', '१०');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '११', '११');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '१२', '१२');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '१३', '१३');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '१४', '१४');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '१५', '१५');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '१६', '१६');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '१७', '१७');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '१८', '१८');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '१९', '१९');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '२०', '२०');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '२१', '२१');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '२२', '२२');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '२३', '२३');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '२४', '२४');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '२५', '२५');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '२६', '२६');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '२७', '२७');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '२८', '२८');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '२९', '२९');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '३०', '३०');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '३१', '३१');
+});
+
+test('format month', function (assert) {
+ var expected = 'जनवरी जन._फेब्रुवरी फेब्रु._मार्च मार्च_अप्रिल अप्रि._मई मई_जुन जुन_जुलाई जुलाई._अगष्ट अग._सेप्टेम्बर सेप्ट._अक्टोबर अक्टो._नोभेम्बर नोभे._डिसेम्बर डिसे.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'आइतबार आइत. आ._सोमबार सोम. सो._मङ्गलबार मङ्गल. मं._बुधबार बुध. बु._बिहिबार बिहि. बि._शुक्रबार शुक्र. शु._शनिबार शनि. श.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'केही क्षण', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'एक मिनेट', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'एक मिनेट', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '२ मिनेट', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '४४ मिनेट', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'एक घण्टा', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'एक घण्टा', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '२ घण्टा', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '५ घण्टा', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '२१ घण्टा', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'एक दिन', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'एक दिन', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '२ दिन', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'एक दिन', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '५ दिन', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '२५ दिन', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'एक महिना', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'एक महिना', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'एक महिना', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '२ महिना', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '२ महिना', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '३ महिना', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'एक महिना', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '५ महिना', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'एक बर्ष', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '२ बर्ष', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'एक बर्ष', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '५ बर्ष', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'केही क्षणमा', 'prefix');
+ assert.equal(moment(0).from(30000), 'केही क्षण अगाडि', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'केही क्षण अगाडि', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'केही क्षणमा', 'केही क्षणमा');
+ assert.equal(moment().add({d: 5}).fromNow(), '५ दिनमा', '५ दिनमा');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'आज दिउँसोको १२:०० बजे', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'आज दिउँसोको १२:२५ बजे', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'आज दिउँसोको १:०० बजे', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'भोलि दिउँसोको १२:०० बजे', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'आज बिहानको ११:०० बजे', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'हिजो दिउँसोको १२:०० बजे', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('[आउँदो] dddd[,] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[आउँदो] dddd[,] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[आउँदो] dddd[,] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[गएको] dddd[,] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[गएको] dddd[,] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[गएको] dddd[,] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('meridiem', function (assert) {
+ assert.equal(moment([2011, 2, 23, 2, 30]).format('a'), 'राति', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 9, 30]).format('a'), 'बिहान', 'morning');
+ assert.equal(moment([2011, 2, 23, 14, 30]).format('a'), 'दिउँसो', 'during day');
+ assert.equal(moment([2011, 2, 23, 17, 30]).format('a'), 'साँझ', 'evening');
+ assert.equal(moment([2011, 2, 23, 19, 30]).format('a'), 'साँझ', 'late evening');
+ assert.equal(moment([2011, 2, 23, 21, 20]).format('a'), 'राति', 'night');
+
+ assert.equal(moment([2011, 2, 23, 2, 30]).format('A'), 'राति', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 9, 30]).format('A'), 'बिहान', 'morning');
+ assert.equal(moment([2011, 2, 23, 14, 30]).format('A'), 'दिउँसो', 'during day');
+ assert.equal(moment([2011, 2, 23, 17, 30]).format('A'), 'साँझ', 'evening');
+ assert.equal(moment([2011, 2, 23, 19, 30]).format('A'), 'साँझ', 'late evening');
+ assert.equal(moment([2011, 2, 23, 21, 20]).format('A'), 'राति', 'night');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '५३ ५३ ५३', 'Dec 26 2011 should be week 53');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '१ ०१ १', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '१ ०१ १', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '२ ०२ २', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '२ ०२ २', 'Jan 9 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('nl-be');
+
+test('parse', function (assert) {
+ var tests = 'januari jan._februari feb._maart mrt._april apr._mei mei._juni jun._juli jul._augustus aug._september sep._oktober okt._november nov._december dec.'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, HH:mm:ss', 'zondag, februari 14de 2010, 15:25:50'],
+ ['ddd, HH', 'zo., 15'],
+ ['M Mo MM MMMM MMM', '2 2de 02 februari feb.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14de 14'],
+ ['d do dddd ddd dd', '0 0de zondag zo. Zo'],
+ ['DDD DDDo DDDD', '45 45ste 045'],
+ ['w wo ww', '6 6de 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45ste day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 februari 2010'],
+ ['LLL', '14 februari 2010 15:25'],
+ ['LLLL', 'zondag 14 februari 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 feb. 2010'],
+ ['lll', '14 feb. 2010 15:25'],
+ ['llll', 'zo. 14 feb. 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1ste', '1ste');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2de', '2de');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3de', '3de');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4de', '4de');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5de', '5de');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6de', '6de');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7de', '7de');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8ste', '8ste');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9de', '9de');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10de', '10de');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11de', '11de');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12de', '12de');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13de', '13de');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14de', '14de');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15de', '15de');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16de', '16de');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17de', '17de');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18de', '18de');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19de', '19de');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20ste', '20ste');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21ste', '21ste');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22ste', '22ste');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23ste', '23ste');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24ste', '24ste');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25ste', '25ste');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26ste', '26ste');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27ste', '27ste');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28ste', '28ste');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29ste', '29ste');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30ste', '30ste');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31ste', '31ste');
+});
+
+test('format month', function (assert) {
+ var expected = 'januari jan._februari feb._maart mrt._april apr._mei mei_juni jun._juli jul._augustus aug._september sep._oktober okt._november nov._december dec.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'zondag zo. Zo_maandag ma. Ma_dinsdag di. Di_woensdag wo. Wo_donderdag do. Do_vrijdag vr. Vr_zaterdag za. Za'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'een paar seconden', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'één minuut', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'één minuut', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minuten', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minuten', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'één uur', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'één uur', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 uur', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 uur', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 uur', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'één dag', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'één dag', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dagen', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'één dag', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dagen', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dagen', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'één maand', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'één maand', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'één maand', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 maanden', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 maanden', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 maanden', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'één maand', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 maanden', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'één jaar', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 jaar', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'één jaar', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 jaar', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'over een paar seconden', 'prefix');
+ assert.equal(moment(0).from(30000), 'een paar seconden geleden', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'een paar seconden geleden', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'over een paar seconden', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'over 5 dagen', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'vandaag om 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'vandaag om 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'vandaag om 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'morgen om 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'vandaag om 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'gisteren om 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [om] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [om] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [om] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[afgelopen] dddd [om] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[afgelopen] dddd [om] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[afgelopen] dddd [om] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('month abbreviation', function (assert) {
+ assert.equal(moment([2012, 5, 23]).format('D-MMM-YYYY'), '23-jun-2012', 'format month abbreviation surrounded by dashes should not include a dot');
+ assert.equal(moment([2012, 5, 23]).unix(), moment('23-jun-2012', 'D-MMM-YYYY').unix(), 'parse month abbreviation surrounded by dashes without dot');
+ assert.equal(moment([2012, 5, 23]).format('D MMM YYYY'), '23 jun. 2012', 'format month abbreviation not surrounded by dashes should include a dot');
+ assert.equal(moment([2012, 5, 23]).unix(), moment('23 jun. 2012', 'D MMM YYYY').unix(), 'parse month abbreviation not surrounded by dashes with dot');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52ste', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1ste', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1ste', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2de', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2de', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('nl');
+
+test('parse', function (assert) {
+ var tests = 'januari jan._februari feb._maart mrt._april apr._mei mei._juni jun._juli jul._augustus aug._september sep._oktober okt._november nov._december dec.'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, HH:mm:ss', 'zondag, februari 14de 2010, 15:25:50'],
+ ['ddd, HH', 'zo., 15'],
+ ['M Mo MM MMMM MMM', '2 2de 02 februari feb.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14de 14'],
+ ['d do dddd ddd dd', '0 0de zondag zo. Zo'],
+ ['DDD DDDo DDDD', '45 45ste 045'],
+ ['w wo ww', '6 6de 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45ste day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14-02-2010'],
+ ['LL', '14 februari 2010'],
+ ['LLL', '14 februari 2010 15:25'],
+ ['LLLL', 'zondag 14 februari 2010 15:25'],
+ ['l', '14-2-2010'],
+ ['ll', '14 feb. 2010'],
+ ['lll', '14 feb. 2010 15:25'],
+ ['llll', 'zo. 14 feb. 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1ste', '1ste');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2de', '2de');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3de', '3de');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4de', '4de');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5de', '5de');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6de', '6de');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7de', '7de');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8ste', '8ste');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9de', '9de');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10de', '10de');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11de', '11de');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12de', '12de');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13de', '13de');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14de', '14de');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15de', '15de');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16de', '16de');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17de', '17de');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18de', '18de');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19de', '19de');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20ste', '20ste');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21ste', '21ste');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22ste', '22ste');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23ste', '23ste');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24ste', '24ste');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25ste', '25ste');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26ste', '26ste');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27ste', '27ste');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28ste', '28ste');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29ste', '29ste');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30ste', '30ste');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31ste', '31ste');
+});
+
+test('format month', function (assert) {
+ var expected = 'januari jan._februari feb._maart mrt._april apr._mei mei_juni jun._juli jul._augustus aug._september sep._oktober okt._november nov._december dec.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'zondag zo. Zo_maandag ma. Ma_dinsdag di. Di_woensdag wo. Wo_donderdag do. Do_vrijdag vr. Vr_zaterdag za. Za'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'een paar seconden', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'één minuut', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'één minuut', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minuten', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minuten', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'één uur', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'één uur', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 uur', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 uur', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 uur', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'één dag', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'één dag', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dagen', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'één dag', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dagen', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dagen', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'één maand', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'één maand', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'één maand', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 maanden', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 maanden', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 maanden', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'één maand', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 maanden', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'één jaar', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 jaar', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'één jaar', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 jaar', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'over een paar seconden', 'prefix');
+ assert.equal(moment(0).from(30000), 'een paar seconden geleden', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'een paar seconden geleden', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'over een paar seconden', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'over 5 dagen', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'vandaag om 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'vandaag om 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'vandaag om 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'morgen om 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'vandaag om 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'gisteren om 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [om] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [om] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [om] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[afgelopen] dddd [om] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[afgelopen] dddd [om] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[afgelopen] dddd [om] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('month abbreviation', function (assert) {
+ assert.equal(moment([2012, 5, 23]).format('D-MMM-YYYY'), '23-jun-2012', 'format month abbreviation surrounded by dashes should not include a dot');
+ assert.equal(moment([2012, 5, 23]).unix(), moment('23-jun-2012', 'D-MMM-YYYY').unix(), 'parse month abbreviation surrounded by dashes without dot');
+ assert.equal(moment([2012, 5, 23]).format('D MMM YYYY'), '23 jun. 2012', 'format month abbreviation not surrounded by dashes should include a dot');
+ assert.equal(moment([2012, 5, 23]).unix(), moment('23 jun. 2012', 'D MMM YYYY').unix(), 'parse month abbreviation not surrounded by dashes with dot');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52ste', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1ste', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1ste', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2de', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2de', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('nn');
+
+test('parse', function (assert) {
+ var tests = 'januar jan_februar feb_mars mar_april apr_mai mai_juni jun_juli jul_august aug_september sep_oktober okt_november nov_desember des'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'sundag, februar 14. 2010, 3:25:50 pm'],
+ ['ddd, hA', 'sun, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2. 02 februar feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. sundag sun su'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '6 6. 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45. day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14. februar 2010'],
+ ['LLL', '14. februar 2010 kl. 15:25'],
+ ['LLLL', 'sundag 14. februar 2010 kl. 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14. feb 2010'],
+ ['lll', '14. feb 2010 kl. 15:25'],
+ ['llll', 'sun 14. feb 2010 kl. 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'januar jan_februar feb_mars mar_april apr_mai mai_juni jun_juli jul_august aug_september sep_oktober okt_november nov_desember des'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'sundag sun su_måndag mån må_tysdag tys ty_onsdag ons on_torsdag tor to_fredag fre fr_laurdag lau lø'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'nokre sekund', '44 sekunder = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'eit minutt', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'eit minutt', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutt', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutt', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'ein time', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'ein time', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 timar', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 timar', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 timar', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'ein dag', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'ein dag', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dagar', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'ein dag', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dagar', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dagar', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'ein månad', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'ein månad', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'ein månad', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 månader', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 månader', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 månader', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'ein månad', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 månader', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'eit år', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 år', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'eit år', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 år', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'om nokre sekund', 'prefix');
+ assert.equal(moment(0).from(30000), 'nokre sekund sidan', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'nokre sekund sidan', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'om nokre sekund', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'om 5 dagar', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'I dag klokka 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'I dag klokka 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'I dag klokka 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'I morgon klokka 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'I dag klokka 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'I går klokka 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [klokka] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [klokka] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [klokka] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[Føregåande] dddd [klokka] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[Føregåande] dddd [klokka] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[Føregåande] dddd [klokka] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52.', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1.', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1.', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2.', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2.', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('pa-in');
+
+test('parse', function (assert) {
+ var tests = 'ਜਨਵਰੀ ਜਨਵਰੀ_ਫ਼ਰਵਰੀ ਫ਼ਰਵਰੀ_ਮਾਰਚ ਮਾਰਚ_ਅਪ੍ਰੈਲ ਅਪ੍ਰੈਲ_ਮਈ ਮਈ_ਜੂਨ ਜੂਨ_ਜੁਲਾਈ ਜੁਲਾਈ_ਅਗਸਤ ਅਗਸਤ_ਸਤੰਬਰ ਸਤੰਬਰ_ਅਕਤੂਬਰ ਅਕਤੂਬਰ_ਨਵੰਬਰ ਨਵੰਬਰ_ਦਸੰਬਰ ਦਸੰਬਰ'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, a h:mm:ss ਵਜੇ', 'ਐਤਵਾਰ, ੧੪ ਫ਼ਰਵਰੀ ੨੦੧੦, ਦੁਪਹਿਰ ੩:੨੫:੫੦ ਵਜੇ'],
+ ['ddd, a h ਵਜੇ', 'ਐਤ, ਦੁਪਹਿਰ ੩ ਵਜੇ'],
+ ['M Mo MM MMMM MMM', '੨ ੨ ੦੨ ਫ਼ਰਵਰੀ ਫ਼ਰਵਰੀ'],
+ ['YYYY YY', '੨੦੧੦ ੧੦'],
+ ['D Do DD', '੧੪ ੧੪ ੧੪'],
+ ['d do dddd ddd dd', '੦ ੦ ਐਤਵਾਰ ਐਤ ਐਤ'],
+ ['DDD DDDo DDDD', '੪੫ ੪੫ ੦੪੫'],
+ ['w wo ww', '੮ ੮ ੦੮'],
+ ['h hh', '੩ ੦੩'],
+ ['H HH', '੧੫ ੧੫'],
+ ['m mm', '੨੫ ੨੫'],
+ ['s ss', '੫੦ ੫੦'],
+ ['a A', 'ਦੁਪਹਿਰ ਦੁਪਹਿਰ'],
+ ['LTS', 'ਦੁਪਹਿਰ ੩:੨੫:੫੦ ਵਜੇ'],
+ ['L', '੧੪/੦੨/੨੦੧੦'],
+ ['LL', '੧੪ ਫ਼ਰਵਰੀ ੨੦੧੦'],
+ ['LLL', '੧੪ ਫ਼ਰਵਰੀ ੨੦੧੦, ਦੁਪਹਿਰ ੩:੨੫ ਵਜੇ'],
+ ['LLLL', 'ਐਤਵਾਰ, ੧੪ ਫ਼ਰਵਰੀ ੨੦੧੦, ਦੁਪਹਿਰ ੩:੨੫ ਵਜੇ'],
+ ['l', '੧੪/੨/੨੦੧੦'],
+ ['ll', '੧੪ ਫ਼ਰਵਰੀ ੨੦੧੦'],
+ ['lll', '੧੪ ਫ਼ਰਵਰੀ ੨੦੧੦, ਦੁਪਹਿਰ ੩:੨੫ ਵਜੇ'],
+ ['llll', 'ਐਤ, ੧੪ ਫ਼ਰਵਰੀ ੨੦੧੦, ਦੁਪਹਿਰ ੩:੨੫ ਵਜੇ']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '੧', '੧');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '੨', '੨');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '੩', '੩');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '੪', '੪');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '੫', '੫');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '੬', '੬');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '੭', '੭');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '੮', '੮');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '੯', '੯');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '੧੦', '੧੦');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '੧੧', '੧੧');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '੧੨', '੧੨');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '੧੩', '੧੩');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '੧੪', '੧੪');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '੧੫', '੧੫');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '੧੬', '੧੬');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '੧੭', '੧੭');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '੧੮', '੧੮');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '੧੯', '੧੯');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '੨੦', '੨੦');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '੨੧', '੨੧');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '੨੨', '੨੨');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '੨੩', '੨੩');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '੨੪', '੨੪');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '੨੫', '੨੫');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '੨੬', '੨੬');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '੨੭', '੨੭');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '੨੮', '੨੮');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '੨੯', '੨੯');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '੩੦', '੩੦');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '੩੧', '੩੧');
+});
+
+test('format month', function (assert) {
+ var expected = 'ਜਨਵਰੀ ਜਨਵਰੀ_ਫ਼ਰਵਰੀ ਫ਼ਰਵਰੀ_ਮਾਰਚ ਮਾਰਚ_ਅਪ੍ਰੈਲ ਅਪ੍ਰੈਲ_ਮਈ ਮਈ_ਜੂਨ ਜੂਨ_ਜੁਲਾਈ ਜੁਲਾਈ_ਅਗਸਤ ਅਗਸਤ_ਸਤੰਬਰ ਸਤੰਬਰ_ਅਕਤੂਬਰ ਅਕਤੂਬਰ_ਨਵੰਬਰ ਨਵੰਬਰ_ਦਸੰਬਰ ਦਸੰਬਰ'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'ਐਤਵਾਰ ਐਤ ਐਤ_ਸੋਮਵਾਰ ਸੋਮ ਸੋਮ_ਮੰਗਲਵਾਰ ਮੰਗਲ ਮੰਗਲ_ਬੁਧਵਾਰ ਬੁਧ ਬੁਧ_ਵੀਰਵਾਰ ਵੀਰ ਵੀਰ_ਸ਼ੁੱਕਰਵਾਰ ਸ਼ੁਕਰ ਸ਼ੁਕਰ_ਸ਼ਨੀਚਰਵਾਰ ਸ਼ਨੀ ਸ਼ਨੀ'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'ਕੁਝ ਸਕਿੰਟ', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'ਇਕ ਮਿੰਟ', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'ਇਕ ਮਿੰਟ', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '੨ ਮਿੰਟ', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '੪੪ ਮਿੰਟ', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'ਇੱਕ ਘੰਟਾ', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'ਇੱਕ ਘੰਟਾ', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '੨ ਘੰਟੇ', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '੫ ਘੰਟੇ', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '੨੧ ਘੰਟੇ', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'ਇੱਕ ਦਿਨ', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'ਇੱਕ ਦਿਨ', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '੨ ਦਿਨ', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'ਇੱਕ ਦਿਨ', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '੫ ਦਿਨ', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '੨੫ ਦਿਨ', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'ਇੱਕ ਮਹੀਨਾ', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'ਇੱਕ ਮਹੀਨਾ', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'ਇੱਕ ਮਹੀਨਾ', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '੨ ਮਹੀਨੇ', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '੨ ਮਹੀਨੇ', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '੩ ਮਹੀਨੇ', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'ਇੱਕ ਮਹੀਨਾ', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '੫ ਮਹੀਨੇ', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'ਇੱਕ ਸਾਲ', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '੨ ਸਾਲ', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'ਇੱਕ ਸਾਲ', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '੫ ਸਾਲ', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'ਕੁਝ ਸਕਿੰਟ ਵਿੱਚ', 'prefix');
+ assert.equal(moment(0).from(30000), 'ਕੁਝ ਸਕਿੰਟ ਪਿਛਲੇ', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'ਕੁਝ ਸਕਿੰਟ ਪਿਛਲੇ', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'ਕੁਝ ਸਕਿੰਟ ਵਿੱਚ', 'ਕੁਝ ਸਕਿੰਟ ਵਿੱਚ');
+ assert.equal(moment().add({d: 5}).fromNow(), '੫ ਦਿਨ ਵਿੱਚ', '੫ ਦਿਨ ਵਿੱਚ');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'ਅਜ ਦੁਪਹਿਰ ੧੨:੦੦ ਵਜੇ', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'ਅਜ ਦੁਪਹਿਰ ੧੨:੨੫ ਵਜੇ', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 3}).calendar(), 'ਅਜ ਦੁਪਹਿਰ ੩:੦੦ ਵਜੇ', 'Now plus 3 hours');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'ਕਲ ਦੁਪਹਿਰ ੧੨:੦੦ ਵਜੇ', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'ਅਜ ਦੁਪਹਿਰ ੧੧:੦੦ ਵਜੇ', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'ਕਲ ਦੁਪਹਿਰ ੧੨:੦੦ ਵਜੇ', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd[,] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd[,] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd[,] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[ਪਿਛਲੇ] dddd[,] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[ਪਿਛਲੇ] dddd[,] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[ਪਿਛਲੇ] dddd[,] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('meridiem invariant', function (assert) {
+ assert.equal(moment([2011, 2, 23, 2, 30]).format('a'), 'ਰਾਤ', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 9, 30]).format('a'), 'ਸਵੇਰ', 'morning');
+ assert.equal(moment([2011, 2, 23, 14, 30]).format('a'), 'ਦੁਪਹਿਰ', 'during day');
+ assert.equal(moment([2011, 2, 23, 17, 30]).format('a'), 'ਸ਼ਾਮ', 'evening');
+ assert.equal(moment([2011, 2, 23, 19, 30]).format('a'), 'ਸ਼ਾਮ', 'late evening');
+ assert.equal(moment([2011, 2, 23, 21, 20]).format('a'), 'ਰਾਤ', 'night');
+
+ assert.equal(moment([2011, 2, 23, 2, 30]).format('A'), 'ਰਾਤ', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 9, 30]).format('A'), 'ਸਵੇਰ', 'morning');
+ assert.equal(moment([2011, 2, 23, 14, 30]).format('A'), 'ਦੁਪਹਿਰ', ' during day');
+ assert.equal(moment([2011, 2, 23, 17, 30]).format('A'), 'ਸ਼ਾਮ', 'evening');
+ assert.equal(moment([2011, 2, 23, 19, 30]).format('A'), 'ਸ਼ਾਮ', 'late evening');
+ assert.equal(moment([2011, 2, 23, 21, 20]).format('A'), 'ਰਾਤ', 'night');
+});
+
+test('weeks year starting sunday', function (assert) {
+ assert.equal(moment([2012, 0, 1]).week(), 1, 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).week(), 1, 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).week(), 2, 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).week(), 2, 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).week(), 3, 'Jan 15 2012 should be week 3');
+});
+
+test('weeks year starting monday', function (assert) {
+ assert.equal(moment([2006, 11, 31]).week(), 1, 'Dec 31 2006 should be week 1');
+ assert.equal(moment([2007, 0, 1]).week(), 1, 'Jan 1 2007 should be week 1');
+ assert.equal(moment([2007, 0, 6]).week(), 1, 'Jan 6 2007 should be week 1');
+ assert.equal(moment([2007, 0, 7]).week(), 2, 'Jan 7 2007 should be week 2');
+ assert.equal(moment([2007, 0, 13]).week(), 2, 'Jan 13 2007 should be week 2');
+ assert.equal(moment([2007, 0, 14]).week(), 3, 'Jan 14 2007 should be week 3');
+});
+
+test('weeks year starting tuesday', function (assert) {
+ assert.equal(moment([2007, 11, 29]).week(), 52, 'Dec 29 2007 should be week 52');
+ assert.equal(moment([2008, 0, 1]).week(), 1, 'Jan 1 2008 should be week 1');
+ assert.equal(moment([2008, 0, 5]).week(), 1, 'Jan 5 2008 should be week 1');
+ assert.equal(moment([2008, 0, 6]).week(), 2, 'Jan 6 2008 should be week 2');
+ assert.equal(moment([2008, 0, 12]).week(), 2, 'Jan 12 2008 should be week 2');
+ assert.equal(moment([2008, 0, 13]).week(), 3, 'Jan 13 2008 should be week 3');
+});
+
+test('weeks year starting wednesday', function (assert) {
+ assert.equal(moment([2002, 11, 29]).week(), 1, 'Dec 29 2002 should be week 1');
+ assert.equal(moment([2003, 0, 1]).week(), 1, 'Jan 1 2003 should be week 1');
+ assert.equal(moment([2003, 0, 4]).week(), 1, 'Jan 4 2003 should be week 1');
+ assert.equal(moment([2003, 0, 5]).week(), 2, 'Jan 5 2003 should be week 2');
+ assert.equal(moment([2003, 0, 11]).week(), 2, 'Jan 11 2003 should be week 2');
+ assert.equal(moment([2003, 0, 12]).week(), 3, 'Jan 12 2003 should be week 3');
+});
+
+test('weeks year starting thursday', function (assert) {
+ assert.equal(moment([2008, 11, 28]).week(), 1, 'Dec 28 2008 should be week 1');
+ assert.equal(moment([2009, 0, 1]).week(), 1, 'Jan 1 2009 should be week 1');
+ assert.equal(moment([2009, 0, 3]).week(), 1, 'Jan 3 2009 should be week 1');
+ assert.equal(moment([2009, 0, 4]).week(), 2, 'Jan 4 2009 should be week 2');
+ assert.equal(moment([2009, 0, 10]).week(), 2, 'Jan 10 2009 should be week 2');
+ assert.equal(moment([2009, 0, 11]).week(), 3, 'Jan 11 2009 should be week 3');
+});
+
+test('weeks year starting friday', function (assert) {
+ assert.equal(moment([2009, 11, 27]).week(), 1, 'Dec 27 2009 should be week 1');
+ assert.equal(moment([2010, 0, 1]).week(), 1, 'Jan 1 2010 should be week 1');
+ assert.equal(moment([2010, 0, 2]).week(), 1, 'Jan 2 2010 should be week 1');
+ assert.equal(moment([2010, 0, 3]).week(), 2, 'Jan 3 2010 should be week 2');
+ assert.equal(moment([2010, 0, 9]).week(), 2, 'Jan 9 2010 should be week 2');
+ assert.equal(moment([2010, 0, 10]).week(), 3, 'Jan 10 2010 should be week 3');
+});
+
+test('weeks year starting saturday', function (assert) {
+ assert.equal(moment([2010, 11, 26]).week(), 1, 'Dec 26 2010 should be week 1');
+ assert.equal(moment([2011, 0, 1]).week(), 1, 'Jan 1 2011 should be week 1');
+ assert.equal(moment([2011, 0, 2]).week(), 2, 'Jan 2 2011 should be week 2');
+ assert.equal(moment([2011, 0, 8]).week(), 2, 'Jan 8 2011 should be week 2');
+ assert.equal(moment([2011, 0, 9]).week(), 3, 'Jan 9 2011 should be week 3');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '੧ ੦੧ ੧', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '੧ ੦੧ ੧', 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '੨ ੦੨ ੨', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '੨ ੦੨ ੨', 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '੩ ੦੩ ੩', 'Jan 15 2012 should be week 3');
+});
+
+test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+});
+
+test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+});
+
+test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('pl');
+
+test('parse', function (assert) {
+ var tests = 'styczeń stycznia sty_luty lutego lut_marzec marca mar_kwiecień kwietnia kwi_maj maja maj_czerwiec czerwca cze_lipiec lipca lip_sierpień sierpnia sie_wrzesień września wrz_październik października paź_listopad listopada lis_grudzień grudnia gru'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][2], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][2], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][2].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][2].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('parse strict', function (assert) {
+ var tests = 'styczeń stycznia sty_luty lutego lut_marzec marca mar_kwiecień kwietnia kwi_maj maja maj_czerwiec czerwca cze_lipiec lipca lip_sierpień sierpnia sie_wrzesień września wrz_październik października paź_listopad listopada lis_grudzień grudnia gru'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm, true).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][2], 'MMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][2].toLocaleLowerCase(), 'MMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][2].toLocaleUpperCase(), 'MMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'niedziela, luty 14. 2010, 3:25:50 pm'],
+ ['ddd, hA', 'ndz, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2. 02 luty lut'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. niedziela ndz Nd'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '6 6. 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45. day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14 lutego 2010'],
+ ['LLL', '14 lutego 2010 15:25'],
+ ['LLLL', 'niedziela, 14 lutego 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14 lut 2010'],
+ ['lll', '14 lut 2010 15:25'],
+ ['llll', 'ndz, 14 lut 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'styczeń sty_luty lut_marzec mar_kwiecień kwi_maj maj_czerwiec cze_lipiec lip_sierpień sie_wrzesień wrz_październik paź_listopad lis_grudzień gru'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'niedziela ndz Nd_poniedziałek pon Pn_wtorek wt Wt_środa śr Śr_czwartek czw Cz_piątek pt Pt_sobota sob So'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'kilka sekund', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'minuta', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'minuta', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minuty', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minuty', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'godzina', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'godzina', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 godziny', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 godzin', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 godzin', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), '1 dzień', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), '1 dzień', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dni', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), '1 dzień', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dni', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dni', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'miesiąc', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'miesiąc', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'miesiąc', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 miesiące', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 miesiące', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 miesiące', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'miesiąc', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 miesięcy', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'rok', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 lata', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'rok', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 lat', '5 years = 5 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 112}), true), '112 lat', '112 years = 112 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 122}), true), '122 lata', '122 years = 122 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 213}), true), '213 lat', '213 years = 213 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 223}), true), '223 lata', '223 years = 223 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'za kilka sekund', 'prefix');
+ assert.equal(moment(0).from(30000), 'kilka sekund temu', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'kilka sekund temu', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'za kilka sekund', 'in a few seconds');
+ assert.equal(moment().add({h: 1}).fromNow(), 'za godzinę', 'in an hour');
+ assert.equal(moment().add({d: 5}).fromNow(), 'za 5 dni', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Dziś o 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Dziś o 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Dziś o 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Jutro o 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Dziś o 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Wczoraj o 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('[W] dddd [o] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[W] dddd [o] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[W] dddd [o] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ function makeFormat(d) {
+ switch (d.day()) {
+ case 0:
+ return '[W zeszłą niedzielę o] LT';
+ case 3:
+ return '[W zeszłą środę o] LT';
+ case 6:
+ return '[W zeszłą sobotę o] LT';
+ default:
+ return '[W zeszły] dddd [o] LT';
+ }
+ }
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days current time');
+
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days beginning of day');
+
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52.', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1.', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1.', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2.', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2.', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('pt-br');
+
+test('parse', function (assert) {
+ var tests = 'janeiro jan_fevereiro fev_março mar_abril abr_maio mai_junho jun_julho jul_agosto ago_setembro set_outubro out_novembro nov_dezembro dez'.split('_'), i;
+
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Domingo, Fevereiro 14º 2010, 3:25:50 pm'],
+ ['ddd, hA', 'Dom, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2º 02 Fevereiro Fev'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14º 14'],
+ ['d do dddd ddd', '0 0º Domingo Dom'],
+ ['DDD DDDo DDDD', '45 45º 045'],
+ ['w wo ww', '8 8º 08'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45º day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 de Fevereiro de 2010'],
+ ['LLL', '14 de Fevereiro de 2010 às 15:25'],
+ ['LLLL', 'Domingo, 14 de Fevereiro de 2010 às 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 de Fev de 2010'],
+ ['lll', '14 de Fev de 2010 às 15:25'],
+ ['llll', 'Dom, 14 de Fev de 2010 às 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1º', '1º');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2º', '2º');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3º', '3º');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4º', '4º');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5º', '5º');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6º', '6º');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7º', '7º');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8º', '8º');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9º', '9º');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10º', '10º');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11º', '11º');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12º', '12º');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13º', '13º');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14º', '14º');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15º', '15º');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16º', '16º');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17º', '17º');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18º', '18º');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19º', '19º');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20º', '20º');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21º', '21º');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22º', '22º');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23º', '23º');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24º', '24º');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25º', '25º');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26º', '26º');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27º', '27º');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28º', '28º');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29º', '29º');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30º', '30º');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31º', '31º');
+});
+
+test('format month', function (assert) {
+ var expected = 'Janeiro Jan_Fevereiro Fev_Março Mar_Abril Abr_Maio Mai_Junho Jun_Julho Jul_Agosto Ago_Setembro Set_Outubro Out_Novembro Nov_Dezembro Dez'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Domingo Dom_Segunda-feira Seg_Terça-feira Ter_Quarta-feira Qua_Quinta-feira Qui_Sexta-feira Sex_Sábado Sáb'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'poucos segundos', '44 seconds = seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'um minuto', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'um minuto', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutos', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutos', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'uma hora', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'uma hora', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 horas', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 horas', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 horas', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'um dia', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'um dia', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dias', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'um dia', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dias', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dias', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'um mês', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'um mês', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'um mês', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 meses', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 meses', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 meses', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'um mês', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 meses', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'um ano', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 anos', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'um ano', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 anos', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'em poucos segundos', 'prefix');
+ assert.equal(moment(0).from(30000), 'poucos segundos atrás', 'suffix');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'em poucos segundos', 'in seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'em 5 dias', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Hoje às 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Hoje às 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Hoje às 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Amanhã às 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Hoje às 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Ontem às 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [às] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [às] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [às] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format((m.day() === 0 || m.day() === 6) ? '[Último] dddd [às] LT' : '[Última] dddd [às] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format((m.day() === 0 || m.day() === 6) ? '[Último] dddd [às] LT' : '[Última] dddd [às] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format((m.day() === 0 || m.day() === 6) ? '[Último] dddd [às] LT' : '[Última] dddd [às] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday format', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1º', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '1 01 1º', 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2º', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '2 02 2º', 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '3 03 3º', 'Jan 15 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('pt');
+
+test('parse', function (assert) {
+ var tests = 'Janeiro Jan_Fevereiro Fev_Março Mar_Abril Abr_Maio Mai_Junho Jun_Julho Jul_Agosto Ago_Setembro Set_Outubro Out_Novembro Nov_Dezembro Dez'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Domingo, Fevereiro 14º 2010, 3:25:50 pm'],
+ ['ddd, hA', 'Dom, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2º 02 Fevereiro Fev'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14º 14'],
+ ['d do dddd ddd', '0 0º Domingo Dom'],
+ ['DDD DDDo DDDD', '45 45º 045'],
+ ['w wo ww', '6 6º 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45º day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 de Fevereiro de 2010'],
+ ['LLL', '14 de Fevereiro de 2010 15:25'],
+ ['LLLL', 'Domingo, 14 de Fevereiro de 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 de Fev de 2010'],
+ ['lll', '14 de Fev de 2010 15:25'],
+ ['llll', 'Dom, 14 de Fev de 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1º', '1º');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2º', '2º');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3º', '3º');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4º', '4º');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5º', '5º');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6º', '6º');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7º', '7º');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8º', '8º');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9º', '9º');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10º', '10º');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11º', '11º');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12º', '12º');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13º', '13º');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14º', '14º');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15º', '15º');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16º', '16º');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17º', '17º');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18º', '18º');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19º', '19º');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20º', '20º');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21º', '21º');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22º', '22º');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23º', '23º');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24º', '24º');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25º', '25º');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26º', '26º');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27º', '27º');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28º', '28º');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29º', '29º');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30º', '30º');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31º', '31º');
+});
+
+test('format month', function (assert) {
+ var expected = 'Janeiro Jan_Fevereiro Fev_Março Mar_Abril Abr_Maio Mai_Junho Jun_Julho Jul_Agosto Ago_Setembro Set_Outubro Out_Novembro Nov_Dezembro Dez'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Domingo Dom Dom_Segunda-Feira Seg 2ª_Terça-Feira Ter 3ª_Quarta-Feira Qua 4ª_Quinta-Feira Qui 5ª_Sexta-Feira Sex 6ª_Sábado Sáb Sáb'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'segundos', '44 seconds = seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'um minuto', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'um minuto', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minutos', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minutos', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'uma hora', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'uma hora', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 horas', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 horas', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 horas', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'um dia', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'um dia', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dias', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'um dia', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dias', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dias', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'um mês', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'um mês', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'um mês', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 meses', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 meses', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 meses', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'um mês', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 meses', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'um ano', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 anos', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'um ano', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 anos', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'em segundos', 'prefix');
+ assert.equal(moment(0).from(30000), 'há segundos', 'suffix');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'em segundos', 'in seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'em 5 dias', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Hoje às 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Hoje às 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Hoje às 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Amanhã às 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Hoje às 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Ontem às 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [às] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [às] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [às] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format((m.day() === 0 || m.day() === 6) ? '[Último] dddd [às] LT' : '[Última] dddd [às] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format((m.day() === 0 || m.day() === 6) ? '[Último] dddd [às] LT' : '[Última] dddd [às] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format((m.day() === 0 || m.day() === 6) ? '[Último] dddd [às] LT' : '[Última] dddd [às] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52º', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1º', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1º', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2º', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2º', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('ro');
+
+test('parse', function (assert) {
+ var tests = 'ianuarie ian._februarie febr._martie mart._aprilie apr._mai mai_iunie iun._iulie iul._august aug._septembrie sept._octombrie oct._noiembrie nov._decembrie dec.'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss A', 'duminică, februarie 14 2010, 3:25:50 PM'],
+ ['ddd, hA', 'Dum, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2 02 februarie febr.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 duminică Dum Du'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '7 7 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[a] DDDo[a zi a anului]', 'a 45a zi a anului'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14 februarie 2010'],
+ ['LLL', '14 februarie 2010 15:25'],
+ ['LLLL', 'duminică, 14 februarie 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14 febr. 2010'],
+ ['lll', '14 febr. 2010 15:25'],
+ ['llll', 'Dum, 14 febr. 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1', '1');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2', '2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3', '3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4', '4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5', '5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6', '6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7', '7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8', '8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9', '9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10', '10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11', '11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12', '12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13', '13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14', '14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15', '15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16', '16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17', '17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18', '18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19', '19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20', '20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21', '21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22', '22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23', '23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24', '24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25', '25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26', '26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27', '27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28', '28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29', '29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30', '30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31', '31');
+});
+
+test('format month', function (assert) {
+ var expected = 'ianuarie ian._februarie febr._martie mart._aprilie apr._mai mai_iunie iun._iulie iul._august aug._septembrie sept._octombrie oct._noiembrie nov._decembrie dec.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'duminică Dum Du_luni Lun Lu_marți Mar Ma_miercuri Mie Mi_joi Joi Jo_vineri Vin Vi_sâmbătă Sâm Sâ'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'câteva secunde', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'un minut', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'un minut', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minute', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 de minute', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'o oră', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'o oră', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 ore', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 ore', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 de ore', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'o zi', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'o zi', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 zile', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'o zi', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 zile', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 de zile', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'o lună', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'o lună', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'o lună', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 luni', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 luni', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 luni', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'o lună', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 luni', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'un an', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 ani', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'un an', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 ani', '5 years = 5 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 19}), true), '19 ani', '19 years = 19 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 20}), true), '20 de ani', '20 years = 20 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 100}), true), '100 de ani', '100 years = 100 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 101}), true), '101 ani', '101 years = 101 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 119}), true), '119 ani', '119 years = 119 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 120}), true), '120 de ani', '120 years = 120 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 219}), true), '219 ani', '219 years = 219 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 220}), true), '220 de ani', '220 years = 220 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'peste câteva secunde', 'prefix');
+ assert.equal(moment(0).from(30000), 'câteva secunde în urmă', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'câteva secunde în urmă', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'peste câteva secunde', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'peste 5 zile', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'azi la 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'azi la 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'azi la 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'mâine la 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'azi la 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'ieri la 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [la] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [la] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [la] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[fosta] dddd [la] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[fosta] dddd [la] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[fosta] dddd [la] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('ru');
+
+test('parse', function (assert) {
+ var tests = 'январь янв._февраль февр._март март_апрель апр._май май_июнь июнь_июль июль_август авг._сентябрь сент._октябрь окт._ноябрь нояб._декабрь дек.'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ function equalTestStrict(input, mmm, monthIndex) {
+ assert.equal(moment(input, mmm, true).month(), monthIndex, input + ' ' + mmm + ' should be strict month ' + (monthIndex + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+
+ equalTestStrict(tests[i][1], 'MMM', i);
+ equalTestStrict(tests[i][0], 'MMMM', i);
+ equalTestStrict(tests[i][1].toLocaleLowerCase(), 'MMM', i);
+ equalTestStrict(tests[i][1].toLocaleUpperCase(), 'MMM', i);
+ equalTestStrict(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTestStrict(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('parse exceptional case', function (assert) {
+ assert.equal(moment('11 Мая 1989', ['DD MMMM YYYY']).format('DD-MM-YYYY'), '11-05-1989');
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, HH:mm:ss', 'воскресенье, 14-го февраля 2010, 15:25:50'],
+ ['ddd, h A', 'вс, 3 дня'],
+ ['M Mo MM MMMM MMM', '2 2-й 02 февраль февр.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14-го 14'],
+ ['d do dddd ddd dd', '0 0-й воскресенье вс вс'],
+ ['DDD DDDo DDDD', '45 45-й 045'],
+ ['w wo ww', '7 7-я 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'дня дня'],
+ ['DDDo [день года]', '45-й день года'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14 февраля 2010 г.'],
+ ['LLL', '14 февраля 2010 г., 15:25'],
+ ['LLLL', 'воскресенье, 14 февраля 2010 г., 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14 февр. 2010 г.'],
+ ['lll', '14 февр. 2010 г., 15:25'],
+ ['llll', 'вс, 14 февр. 2010 г., 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format meridiem', function (assert) {
+ assert.equal(moment([2012, 11, 28, 0, 0]).format('A'), 'ночи', 'night');
+ assert.equal(moment([2012, 11, 28, 3, 59]).format('A'), 'ночи', 'night');
+ assert.equal(moment([2012, 11, 28, 4, 0]).format('A'), 'утра', 'morning');
+ assert.equal(moment([2012, 11, 28, 11, 59]).format('A'), 'утра', 'morning');
+ assert.equal(moment([2012, 11, 28, 12, 0]).format('A'), 'дня', 'afternoon');
+ assert.equal(moment([2012, 11, 28, 16, 59]).format('A'), 'дня', 'afternoon');
+ assert.equal(moment([2012, 11, 28, 17, 0]).format('A'), 'вечера', 'evening');
+ assert.equal(moment([2012, 11, 28, 23, 59]).format('A'), 'вечера', 'evening');
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1-й', '1-й');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2-й', '2-й');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3-й', '3-й');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4-й', '4-й');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5-й', '5-й');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6-й', '6-й');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7-й', '7-й');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8-й', '8-й');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9-й', '9-й');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10-й', '10-й');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11-й', '11-й');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12-й', '12-й');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13-й', '13-й');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14-й', '14-й');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15-й', '15-й');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16-й', '16-й');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17-й', '17-й');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18-й', '18-й');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19-й', '19-й');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20-й', '20-й');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21-й', '21-й');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22-й', '22-й');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23-й', '23-й');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24-й', '24-й');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25-й', '25-й');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26-й', '26-й');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27-й', '27-й');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28-й', '28-й');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29-й', '29-й');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30-й', '30-й');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31-й', '31-й');
+});
+
+test('format month', function (assert) {
+ var expected = 'январь янв._февраль февр._март март_апрель апр._май май_июнь июнь_июль июль_август авг._сентябрь сент._октябрь окт._ноябрь нояб._декабрь дек.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format month case', function (assert) {
+ var months = {
+ 'nominative': 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
+ 'accusative': 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_')
+ }, i;
+ for (i = 0; i < 12; i++) {
+ assert.equal(moment([2011, i, 1]).format('D MMMM'), '1 ' + months.accusative[i], '1 ' + months.accusative[i]);
+ assert.equal(moment([2011, i, 1]).format('MMMM'), months.nominative[i], '1 ' + months.nominative[i]);
+ }
+});
+
+test('format month short case', function (assert) {
+ var monthsShort = {
+ 'nominative': 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_'),
+ 'accusative': 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_')
+ }, i;
+ for (i = 0; i < 12; i++) {
+ assert.equal(moment([2011, i, 1]).format('D MMM'), '1 ' + monthsShort.accusative[i], '1 ' + monthsShort.accusative[i]);
+ assert.equal(moment([2011, i, 1]).format('MMM'), monthsShort.nominative[i], '1 ' + monthsShort.nominative[i]);
+ }
+});
+
+test('format month case with escaped symbols', function (assert) {
+ var months = {
+ 'nominative': 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
+ 'accusative': 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_')
+ }, i;
+ for (i = 0; i < 12; i++) {
+ assert.equal(moment([2013, i, 1]).format('D[] MMMM'), '1 ' + months.accusative[i], '1 ' + months.accusative[i]);
+ assert.equal(moment([2013, i, 1]).format('[<i>]D[</i>] [<b>]MMMM[</b>]'), '<i>1</i> <b>' + months.accusative[i] + '</b>', '1 <b>' + months.accusative[i] + '</b>');
+ assert.equal(moment([2013, i, 1]).format('D[-й день] MMMM'), '1-й день ' + months.accusative[i], '1-й день ' + months.accusative[i]);
+ assert.equal(moment([2013, i, 1]).format('D, MMMM'), '1, ' + months.nominative[i], '1, ' + months.nominative[i]);
+ }
+});
+
+test('format month short case with escaped symbols', function (assert) {
+ var monthsShort = {
+ 'nominative': 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_'),
+ 'accusative': 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_')
+ }, i;
+ for (i = 0; i < 12; i++) {
+ assert.equal(moment([2013, i, 1]).format('D[] MMM'), '1 ' + monthsShort.accusative[i], '1 ' + monthsShort.accusative[i]);
+ assert.equal(moment([2013, i, 1]).format('[<i>]D[</i>] [<b>]MMM[</b>]'), '<i>1</i> <b>' + monthsShort.accusative[i] + '</b>', '1 <b>' + monthsShort.accusative[i] + '</b>');
+ assert.equal(moment([2013, i, 1]).format('D[-й день] MMM'), '1-й день ' + monthsShort.accusative[i], '1-й день ' + monthsShort.accusative[i]);
+ assert.equal(moment([2013, i, 1]).format('D, MMM'), '1, ' + monthsShort.nominative[i], '1, ' + monthsShort.nominative[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'воскресенье вс вс_понедельник пн пн_вторник вт вт_среда ср ср_четверг чт чт_пятница пт пт_суббота сб сб'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'несколько секунд', '44 seconds = seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'минута', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'минута', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 минуты', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 31}), true), '31 минута', '31 minutes = 31 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 минуты', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'час', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'час', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 часа', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 часов', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 час', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'день', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'день', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 дня', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'день', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 дней', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 11}), true), '11 дней', '11 days = 11 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 21}), true), '21 день', '21 days = 21 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 дней', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'месяц', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'месяц', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'месяц', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 месяца', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 месяца', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 месяца', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'месяц', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 месяцев', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'год', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 года', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'год', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 лет', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'через несколько секунд', 'prefix');
+ assert.equal(moment(0).from(30000), 'несколько секунд назад', 'suffix');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'через несколько секунд', 'in seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'через 5 дней', 'in 5 days');
+ assert.equal(moment().add({m: 31}).fromNow(), 'через 31 минуту', 'in 31 minutes = in 31 minutes');
+ assert.equal(moment().subtract({m: 31}).fromNow(), '31 минуту назад', '31 minutes ago = 31 minutes ago');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Сегодня в 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Сегодня в 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Сегодня в 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Завтра в 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Сегодня в 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Вчера в 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m, now;
+
+ function makeFormatNext(d) {
+ switch (d.day()) {
+ case 0:
+ return '[В следующее] dddd [в] LT';
+ case 1:
+ case 2:
+ case 4:
+ return '[В следующий] dddd [в] LT';
+ case 3:
+ case 5:
+ case 6:
+ return '[В следующую] dddd [в] LT';
+ }
+ }
+
+ function makeFormatThis(d) {
+ if (d.day() === 2) {
+ return '[Во] dddd [в] LT';
+ }
+ else {
+ return '[В] dddd [в] LT';
+ }
+ }
+
+ now = moment().startOf('week');
+ for (i = 2; i < 7; i++) {
+ m = moment(now).add({d: i});
+ assert.equal(m.calendar(now), m.format(makeFormatThis(m)), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(now), m.format(makeFormatThis(m)), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(now), m.format(makeFormatThis(m)), 'Today + ' + i + ' days end of day');
+ }
+
+ now = moment().endOf('week');
+ for (i = 2; i < 7; i++) {
+ m = moment(now).add({d: i});
+ assert.equal(m.calendar(now), m.format(makeFormatNext(m)), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(now), m.format(makeFormatNext(m)), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(now), m.format(makeFormatNext(m)), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m, now;
+
+ function makeFormatLast(d) {
+ switch (d.day()) {
+ case 0:
+ return '[В прошлое] dddd [в] LT';
+ case 1:
+ case 2:
+ case 4:
+ return '[В прошлый] dddd [в] LT';
+ case 3:
+ case 5:
+ case 6:
+ return '[В прошлую] dddd [в] LT';
+ }
+ }
+
+ function makeFormatThis(d) {
+ if (d.day() === 2) {
+ return '[Во] dddd [в] LT';
+ }
+ else {
+ return '[В] dddd [в] LT';
+ }
+ }
+
+ now = moment().startOf('week');
+ for (i = 2; i < 7; i++) {
+ m = moment(now).subtract({d: i});
+ assert.equal(m.calendar(now), m.format(makeFormatLast(m)), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(now), m.format(makeFormatLast(m)), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(now), m.format(makeFormatLast(m)), 'Today - ' + i + ' days end of day');
+ }
+
+ now = moment().endOf('week');
+ for (i = 2; i < 7; i++) {
+ m = moment(now).subtract({d: i});
+ assert.equal(m.calendar(now), m.format(makeFormatThis(m)), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(now), m.format(makeFormatThis(m)), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(now), m.format(makeFormatThis(m)), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1-я', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1-я', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2-я', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2-я', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3-я', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('se');
+
+test('parse', function (assert) {
+ var i,
+ tests = 'ođđajagemánnu ođđj_guovvamánnu guov_njukčamánnu njuk_cuoŋománnu cuo_miessemánnu mies_geassemánnu geas_suoidnemánnu suoi_borgemánnu borg_čakčamánnu čakč_golggotmánnu golg_skábmamánnu skáb_juovlamánnu juov'.split('_');
+
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'sotnabeaivi, guovvamánnu 14. 2010, 3:25:50 pm'],
+ ['ddd, hA', 'sotn, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2. 02 guovvamánnu guov'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. sotnabeaivi sotn s'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '6 6. 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[jagi] DDDo [beaivi]', 'jagi 45. beaivi'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', 'guovvamánnu 14. b. 2010'],
+ ['LLL', 'guovvamánnu 14. b. 2010 ti. 15:25'],
+ ['LLLL', 'sotnabeaivi, guovvamánnu 14. b. 2010 ti. 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', 'guov 14. b. 2010'],
+ ['lll', 'guov 14. b. 2010 ti. 15:25'],
+ ['llll', 'sotn, guov 14. b. 2010 ti. 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var i,
+ expected = 'ođđajagemánnu ođđj_guovvamánnu guov_njukčamánnu njuk_cuoŋománnu cuo_miessemánnu mies_geassemánnu geas_suoidnemánnu suoi_borgemánnu borg_čakčamánnu čakč_golggotmánnu golg_skábmamánnu skáb_juovlamánnu juov'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var i,
+ expected = 'sotnabeaivi sotn s_vuossárga vuos v_maŋŋebárga maŋ m_gaskavahkku gask g_duorastat duor d_bearjadat bear b_lávvardat láv L'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'moadde sekunddat', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'okta minuhta', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'okta minuhta', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minuhtat', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minuhtat', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'okta diimmu', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'okta diimmu', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 diimmut', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 diimmut', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 diimmut', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'okta beaivi', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'okta beaivi', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 beaivvit', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'okta beaivi', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 beaivvit', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 beaivvit', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'okta mánnu', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'okta mánnu', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'okta mánnu', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 mánut', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 mánut', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 mánut', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'okta mánnu', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 mánut', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'okta jahki', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 jagit', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'okta jahki', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 jagit', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'moadde sekunddat geažes', 'prefix');
+ assert.equal(moment(0).from(30000), 'maŋit moadde sekunddat', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'maŋit moadde sekunddat', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'moadde sekunddat geažes', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), '5 beaivvit geažes', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'otne ti 12:00', 'Today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'otne ti 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'otne ti 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'ihttin ti 12:00', 'Tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'otne ti 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'ikte ti 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [ti] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [ti] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [ti] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[ovddit] dddd [ti] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[ovddit] dddd [ti] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[ovddit] dddd [ti] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52.', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1.', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1.', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2.', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2.', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('si');
+
+/*jshint -W100*/
+test('parse', function (assert) {
+ var tests = 'ජනවාරි ජන_පෙබරවාරි පෙබ_මාර්තු මාර්_අප්‍රේල් අප්_මැයි මැයි_ජූනි ජූනි_ජූලි ජූලි_අගෝස්තු අගෝ_සැප්තැම්බර් සැප්_ඔක්තෝබර් ඔක්_නොවැම්බර් නොවැ_දෙසැම්බර් දෙසැ'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['YYYY MMMM Do dddd, a h:mm:ss', '2010 පෙබරවාරි 14 වැනි ඉරිදා, ප.ව. 3:25:50'],
+ ['YYYY MMMM Do dddd, a h:mm:ss', '2010 පෙබරවාරි 14 වැනි ඉරිදා, ප.ව. 3:25:50'],
+ ['ddd, A h', 'ඉරි, පස් වරු 3'],
+ ['M Mo MM MMMM MMM', '2 2 වැනි 02 පෙබරවාරි පෙබ'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 වැනි 14'],
+ ['d do dddd ddd dd', '0 0 වැනි ඉරිදා ඉරි ඉ'],
+ ['DDD DDDo DDDD', '45 45 වැනි 045'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'ප.ව. පස් වරු'],
+ ['[වසරේ] DDDo [දිනය]', 'වසරේ 45 වැනි දිනය'],
+ ['LTS', 'ප.ව. 3:25:50'],
+ ['LT', 'ප.ව. 3:25'],
+ ['L', '2010/02/14'],
+ ['LL', '2010 පෙබරවාරි 14'],
+ ['LLL', '2010 පෙබරවාරි 14, ප.ව. 3:25'],
+ ['LLLL', '2010 පෙබරවාරි 14 වැනි ඉරිදා, ප.ව. 3:25:50'],
+ ['l', '2010/2/14'],
+ ['ll', '2010 පෙබ 14'],
+ ['lll', '2010 පෙබ 14, ප.ව. 3:25'],
+ ['llll', '2010 පෙබ 14 වැනි ඉරි, ප.ව. 3:25:50']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1 වැනි', '1 වැනි');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2 වැනි', '2 වැනි');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3 වැනි', '3 වැනි');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4 වැනි', '4 වැනි');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5 වැනි', '5 වැනි');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6 වැනි', '6 වැනි');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7 වැනි', '7 වැනි');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8 වැනි', '8 වැනි');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9 වැනි', '9 වැනි');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10 වැනි', '10 වැනි');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11 වැනි', '11 වැනි');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12 වැනි', '12 වැනි');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13 වැනි', '13 වැනි');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14 වැනි', '14 වැනි');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15 වැනි', '15 වැනි');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16 වැනි', '16 වැනි');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17 වැනි', '17 වැනි');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18 වැනි', '18 වැනි');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19 වැනි', '19 වැනි');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20 වැනි', '20 වැනි');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21 වැනි', '21 වැනි');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22 වැනි', '22 වැනි');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23 වැනි', '23 වැනි');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24 වැනි', '24 වැනි');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25 වැනි', '25 වැනි');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26 වැනි', '26 වැනි');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27 වැනි', '27 වැනි');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28 වැනි', '28 වැනි');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29 වැනි', '29 වැනි');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30 වැනි', '30 වැනි');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31 වැනි', '31 වැනි');
+});
+
+test('format month', function (assert) {
+ var expected = 'ජනවාරි ජන_පෙබරවාරි පෙබ_මාර්තු මාර්_අප්‍රේල් අප්_මැයි මැයි_ජූනි ජූනි_ජූලි ජූලි_අගෝස්තු අගෝ_සැප්තැම්බර් සැප්_ඔක්තෝබර් ඔක්_නොවැම්බර් නොවැ_දෙසැම්බර් දෙසැ'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'ඉරිදා ඉරි ඉ_සඳුදා සඳු ස_අඟහරුවාදා අඟ අ_බදාදා බදා බ_බ්‍රහස්පතින්දා බ්‍රහ බ්‍ර_සිකුරාදා සිකු සි_සෙනසුරාදා සෙන සෙ'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'තත්පර කිහිපය', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'මිනිත්තුව', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'මිනිත්තුව', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), 'මිනිත්තු 2', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), 'මිනිත්තු 44', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'පැය', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'පැය', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), 'පැය 2', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), 'පැය 5', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), 'පැය 21', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'දිනය', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'දිනය', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), 'දින 2', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'දිනය', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), 'දින 5', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), 'දින 25', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'මාසය', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'මාසය', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'මාසය', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), 'මාස 2', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), 'මාස 2', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), 'මාස 3', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'මාසය', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), 'මාස 5', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'වසර', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), 'වසර 2', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'වසර', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), 'වසර 5', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'තත්පර කිහිපයකින්', 'prefix');
+ assert.equal(moment(0).from(30000), 'තත්පර කිහිපයකට පෙර', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'තත්පර කිහිපයකට පෙර', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'තත්පර කිහිපයකින්', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'දින 5කින්', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'අද ප.ව. 12:00ට', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'අද ප.ව. 12:25ට', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'අද ප.ව. 1:00ට', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'හෙට ප.ව. 12:00ට', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'අද පෙ.ව. 11:00ට', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'ඊයේ ප.ව. 12:00ට', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd LT[ට]'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd LT[ට]'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd LT[ට]'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[පසුගිය] dddd LT[ට]'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[පසුගිය] dddd LT[ට]'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[පසුගිය] dddd LT[ට]'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('sk');
+
+test('parse', function (assert) {
+ var tests = 'január jan._február feb._marec mar._apríl apr._máj máj_jún jún._júl júl._august aug._september sep._október okt._november nov._december dec.'.split('_'), i;
+ function equalTest(input, mmm, monthIndex) {
+ assert.equal(moment(input, mmm).month(), monthIndex, input + ' should be month ' + (monthIndex + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss', 'nedeľa, február 14. 2010, 3:25:50'],
+ ['ddd, h', 'ne, 3'],
+ ['M Mo MM MMMM MMM', '2 2. 02 február feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. nedeľa ne ne'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '6 6. 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['DDDo [deň v roku]', '45. deň v roku'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14. február 2010'],
+ ['LLL', '14. február 2010 15:25'],
+ ['LLLL', 'nedeľa 14. február 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14. feb 2010'],
+ ['lll', '14. feb 2010 15:25'],
+ ['llll', 'ne 14. feb 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'január jan_február feb_marec mar_apríl apr_máj máj_jún jún_júl júl_august aug_september sep_október okt_november nov_december dec'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'nedeľa ne ne_pondelok po po_utorok ut ut_streda st st_štvrtok št št_piatok pi pi_sobota so so'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'pár sekúnd', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'minúta', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'minúta', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minúty', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minút', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'hodina', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'hodina', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 hodiny', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 hodín', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 hodín', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'deň', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'deň', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dni', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'deň', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dní', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dní', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'mesiac', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'mesiac', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'mesiac', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 mesiace', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 mesiace', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 mesiace', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'mesiac', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 mesiacov', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'rok', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 roky', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'rok', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 rokov', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'za pár sekúnd', 'prefix');
+ assert.equal(moment(0).from(30000), 'pred pár sekundami', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'pred pár sekundami', 'now from now should display as in the past');
+});
+
+test('fromNow (future)', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'za pár sekúnd', 'in a few seconds');
+ assert.equal(moment().add({m: 1}).fromNow(), 'za minútu', 'in a minute');
+ assert.equal(moment().add({m: 3}).fromNow(), 'za 3 minúty', 'in 3 minutes');
+ assert.equal(moment().add({m: 10}).fromNow(), 'za 10 minút', 'in 10 minutes');
+ assert.equal(moment().add({h: 1}).fromNow(), 'za hodinu', 'in an hour');
+ assert.equal(moment().add({h: 3}).fromNow(), 'za 3 hodiny', 'in 3 hours');
+ assert.equal(moment().add({h: 10}).fromNow(), 'za 10 hodín', 'in 10 hours');
+ assert.equal(moment().add({d: 1}).fromNow(), 'za deň', 'in a day');
+ assert.equal(moment().add({d: 3}).fromNow(), 'za 3 dni', 'in 3 days');
+ assert.equal(moment().add({d: 10}).fromNow(), 'za 10 dní', 'in 10 days');
+ assert.equal(moment().add({M: 1}).fromNow(), 'za mesiac', 'in a month');
+ assert.equal(moment().add({M: 3}).fromNow(), 'za 3 mesiace', 'in 3 months');
+ assert.equal(moment().add({M: 10}).fromNow(), 'za 10 mesiacov', 'in 10 months');
+ assert.equal(moment().add({y: 1}).fromNow(), 'za rok', 'in a year');
+ assert.equal(moment().add({y: 3}).fromNow(), 'za 3 roky', 'in 3 years');
+ assert.equal(moment().add({y: 10}).fromNow(), 'za 10 rokov', 'in 10 years');
+});
+
+test('fromNow (past)', function (assert) {
+ assert.equal(moment().subtract({s: 30}).fromNow(), 'pred pár sekundami', 'a few seconds ago');
+ assert.equal(moment().subtract({m: 1}).fromNow(), 'pred minútou', 'a minute ago');
+ assert.equal(moment().subtract({m: 3}).fromNow(), 'pred 3 minútami', '3 minutes ago');
+ assert.equal(moment().subtract({m: 10}).fromNow(), 'pred 10 minútami', '10 minutes ago');
+ assert.equal(moment().subtract({h: 1}).fromNow(), 'pred hodinou', 'an hour ago');
+ assert.equal(moment().subtract({h: 3}).fromNow(), 'pred 3 hodinami', '3 hours ago');
+ assert.equal(moment().subtract({h: 10}).fromNow(), 'pred 10 hodinami', '10 hours ago');
+ assert.equal(moment().subtract({d: 1}).fromNow(), 'pred dňom', 'a day ago');
+ assert.equal(moment().subtract({d: 3}).fromNow(), 'pred 3 dňami', '3 days ago');
+ assert.equal(moment().subtract({d: 10}).fromNow(), 'pred 10 dňami', '10 days ago');
+ assert.equal(moment().subtract({M: 1}).fromNow(), 'pred mesiacom', 'a month ago');
+ assert.equal(moment().subtract({M: 3}).fromNow(), 'pred 3 mesiacmi', '3 months ago');
+ assert.equal(moment().subtract({M: 10}).fromNow(), 'pred 10 mesiacmi', '10 months ago');
+ assert.equal(moment().subtract({y: 1}).fromNow(), 'pred rokom', 'a year ago');
+ assert.equal(moment().subtract({y: 3}).fromNow(), 'pred 3 rokmi', '3 years ago');
+ assert.equal(moment().subtract({y: 10}).fromNow(), 'pred 10 rokmi', '10 years ago');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'dnes o 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'dnes o 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'dnes o 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'zajtra o 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'dnes o 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'včera o 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m, nextDay;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ nextDay = '';
+ switch (m.day()) {
+ case 0:
+ nextDay = 'v nedeľu';
+ break;
+ case 1:
+ nextDay = 'v pondelok';
+ break;
+ case 2:
+ nextDay = 'v utorok';
+ break;
+ case 3:
+ nextDay = 'v stredu';
+ break;
+ case 4:
+ nextDay = 'vo štvrtok';
+ break;
+ case 5:
+ nextDay = 'v piatok';
+ break;
+ case 6:
+ nextDay = 'v sobotu';
+ break;
+ }
+ assert.equal(m.calendar(), m.format('[' + nextDay + '] [o] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[' + nextDay + '] [o] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[' + nextDay + '] [o] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m, lastDay;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ lastDay = '';
+ switch (m.day()) {
+ case 0:
+ lastDay = 'minulú nedeľu';
+ break;
+ case 1:
+ lastDay = 'minulý pondelok';
+ break;
+ case 2:
+ lastDay = 'minulý utorok';
+ break;
+ case 3:
+ lastDay = 'minulú stredu';
+ break;
+ case 4:
+ lastDay = 'minulý štvrtok';
+ break;
+ case 5:
+ lastDay = 'minulý piatok';
+ break;
+ case 6:
+ lastDay = 'minulú sobotu';
+ break;
+ }
+ assert.equal(m.calendar(), m.format('[' + lastDay + '] [o] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[' + lastDay + '] [o] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[' + lastDay + '] [o] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('humanize duration', function (assert) {
+ assert.equal(moment.duration(1, 'minutes').humanize(), 'minúta', 'a minute (future)');
+ assert.equal(moment.duration(1, 'minutes').humanize(true), 'za minútu', 'in a minute');
+ assert.equal(moment.duration(-1, 'minutes').humanize(), 'minúta', 'a minute (past)');
+ assert.equal(moment.duration(-1, 'minutes').humanize(true), 'pred minútou', 'a minute ago');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52.', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1.', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1.', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2.', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2.', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('sl');
+
+test('parse', function (assert) {
+ var tests = 'januar jan._februar feb._marec mar._april apr._maj maj_junij jun._julij jul._avgust avg._september sep._oktober okt._november nov._december dec.'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, h:mm:ss a', 'nedelja, 14. februar 2010, 3:25:50 pm'],
+ ['ddd, hA', 'ned., 3PM'],
+ ['M Mo MM MMMM MMM', '2 2. 02 februar feb.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. nedelja ned. ne'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '7 7. 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45. day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14. februar 2010'],
+ ['LLL', '14. februar 2010 15:25'],
+ ['LLLL', 'nedelja, 14. februar 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14. feb. 2010'],
+ ['lll', '14. feb. 2010 15:25'],
+ ['llll', 'ned., 14. feb. 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'januar jan._februar feb._marec mar._april apr._maj maj._junij jun._julij jul._avgust avg._september sep._oktober okt._november nov._december dec.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'nedelja ned. ne_ponedeljek pon. po_torek tor. to_sreda sre. sr_četrtek čet. če_petek pet. pe_sobota sob. so'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'nekaj sekund', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'ena minuta', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'ena minuta', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minuti', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minut', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'ena ura', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'ena ura', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 uri', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 ur', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 ur', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'en dan', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'en dan', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dni', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'en dan', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dni', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dni', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'en mesec', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'en mesec', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'en mesec', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 meseca', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 meseca', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 mesece', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'en mesec', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 mesecev', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'eno leto', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 leti', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'eno leto', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 let', '5 years = 5 years');
+
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 1}), true), 'ena minuta', 'a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 2}), true), '2 minuti', '2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 3}), true), '3 minute', '3 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 4}), true), '4 minute', '4 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 5}), true), '5 minut', '5 minutes');
+
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 1}), true), 'ena ura', 'an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 2}), true), '2 uri', '2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 3}), true), '3 ure', '3 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 4}), true), '4 ure', '4 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 ur', '5 hours');
+
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'en dan', 'a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 2}), true), '2 dni', '2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 3}), true), '3 dni', '3 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 4}), true), '4 dni', '4 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dni', '5 days');
+
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'en mesec', 'a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 2}), true), '2 meseca', '2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 3}), true), '3 mesece', '3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 4}), true), '4 mesece', '4 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 mesecev', '5 months');
+
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'eno leto', 'a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 2}), true), '2 leti', '2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 3}), true), '3 leta', '3 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 4}), true), '4 leta', '4 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 let', '5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'čez nekaj sekund', 'prefix');
+ assert.equal(moment(0).from(30000), 'pred nekaj sekundami', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'pred nekaj sekundami', 'now from now should display as in the past');
+});
+
+test('fromNow (future)', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'čez nekaj sekund', 'in a few seconds');
+ assert.equal(moment().add({m: 1}).fromNow(), 'čez eno minuto', 'in a minute');
+ assert.equal(moment().add({m: 2}).fromNow(), 'čez 2 minuti', 'in 2 minutes');
+ assert.equal(moment().add({m: 3}).fromNow(), 'čez 3 minute', 'in 3 minutes');
+ assert.equal(moment().add({m: 4}).fromNow(), 'čez 4 minute', 'in 4 minutes');
+ assert.equal(moment().add({m: 5}).fromNow(), 'čez 5 minut', 'in 5 minutes');
+
+ assert.equal(moment().add({h: 1}).fromNow(), 'čez eno uro', 'in an hour');
+ assert.equal(moment().add({h: 2}).fromNow(), 'čez 2 uri', 'in 2 hours');
+ assert.equal(moment().add({h: 3}).fromNow(), 'čez 3 ure', 'in 3 hours');
+ assert.equal(moment().add({h: 4}).fromNow(), 'čez 4 ure', 'in 4 hours');
+ assert.equal(moment().add({h: 5}).fromNow(), 'čez 5 ur', 'in 5 hours');
+
+ assert.equal(moment().add({d: 1}).fromNow(), 'čez en dan', 'in a day');
+ assert.equal(moment().add({d: 2}).fromNow(), 'čez 2 dni', 'in 2 days');
+ assert.equal(moment().add({d: 3}).fromNow(), 'čez 3 dni', 'in 3 days');
+ assert.equal(moment().add({d: 4}).fromNow(), 'čez 4 dni', 'in 4 days');
+ assert.equal(moment().add({d: 5}).fromNow(), 'čez 5 dni', 'in 5 days');
+
+ assert.equal(moment().add({M: 1}).fromNow(), 'čez en mesec', 'in a month');
+ assert.equal(moment().add({M: 2}).fromNow(), 'čez 2 meseca', 'in 2 months');
+ assert.equal(moment().add({M: 3}).fromNow(), 'čez 3 mesece', 'in 3 months');
+ assert.equal(moment().add({M: 4}).fromNow(), 'čez 4 mesece', 'in 4 months');
+ assert.equal(moment().add({M: 5}).fromNow(), 'čez 5 mesecev', 'in 5 months');
+
+ assert.equal(moment().add({y: 1}).fromNow(), 'čez eno leto', 'in a year');
+ assert.equal(moment().add({y: 2}).fromNow(), 'čez 2 leti', 'in 2 years');
+ assert.equal(moment().add({y: 3}).fromNow(), 'čez 3 leta', 'in 3 years');
+ assert.equal(moment().add({y: 4}).fromNow(), 'čez 4 leta', 'in 4 years');
+ assert.equal(moment().add({y: 5}).fromNow(), 'čez 5 let', 'in 5 years');
+
+ assert.equal(moment().subtract({s: 30}).fromNow(), 'pred nekaj sekundami', 'a few seconds ago');
+
+ assert.equal(moment().subtract({m: 1}).fromNow(), 'pred eno minuto', 'a minute ago');
+ assert.equal(moment().subtract({m: 2}).fromNow(), 'pred 2 minutama', '2 minutes ago');
+ assert.equal(moment().subtract({m: 3}).fromNow(), 'pred 3 minutami', '3 minutes ago');
+ assert.equal(moment().subtract({m: 4}).fromNow(), 'pred 4 minutami', '4 minutes ago');
+ assert.equal(moment().subtract({m: 5}).fromNow(), 'pred 5 minutami', '5 minutes ago');
+
+ assert.equal(moment().subtract({h: 1}).fromNow(), 'pred eno uro', 'an hour ago');
+ assert.equal(moment().subtract({h: 2}).fromNow(), 'pred 2 urama', '2 hours ago');
+ assert.equal(moment().subtract({h: 3}).fromNow(), 'pred 3 urami', '3 hours ago');
+ assert.equal(moment().subtract({h: 4}).fromNow(), 'pred 4 urami', '4 hours ago');
+ assert.equal(moment().subtract({h: 5}).fromNow(), 'pred 5 urami', '5 hours ago');
+
+ assert.equal(moment().subtract({d: 1}).fromNow(), 'pred enim dnem', 'a day ago');
+ assert.equal(moment().subtract({d: 2}).fromNow(), 'pred 2 dnevoma', '2 days ago');
+ assert.equal(moment().subtract({d: 3}).fromNow(), 'pred 3 dnevi', '3 days ago');
+ assert.equal(moment().subtract({d: 4}).fromNow(), 'pred 4 dnevi', '4 days ago');
+ assert.equal(moment().subtract({d: 5}).fromNow(), 'pred 5 dnevi', '5 days ago');
+
+ assert.equal(moment().subtract({M: 1}).fromNow(), 'pred enim mesecem', 'a month ago');
+ assert.equal(moment().subtract({M: 2}).fromNow(), 'pred 2 mesecema', '2 months ago');
+ assert.equal(moment().subtract({M: 3}).fromNow(), 'pred 3 meseci', '3 months ago');
+ assert.equal(moment().subtract({M: 4}).fromNow(), 'pred 4 meseci', '4 months ago');
+ assert.equal(moment().subtract({M: 5}).fromNow(), 'pred 5 meseci', '5 months ago');
+
+ assert.equal(moment().subtract({y: 1}).fromNow(), 'pred enim letom', 'a year ago');
+ assert.equal(moment().subtract({y: 2}).fromNow(), 'pred 2 letoma', '2 years ago');
+ assert.equal(moment().subtract({y: 3}).fromNow(), 'pred 3 leti', '3 years ago');
+ assert.equal(moment().subtract({y: 4}).fromNow(), 'pred 4 leti', '4 years ago');
+ assert.equal(moment().subtract({y: 5}).fromNow(), 'pred 5 leti', '5 years ago');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'danes ob 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'danes ob 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'danes ob 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'jutri ob 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'danes ob 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'včeraj ob 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ function makeFormat(d) {
+ switch (d.day()) {
+ case 0:
+ return '[v] [nedeljo] [ob] LT';
+ case 3:
+ return '[v] [sredo] [ob] LT';
+ case 6:
+ return '[v] [soboto] [ob] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[v] dddd [ob] LT';
+ }
+ }
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ function makeFormat(d) {
+ switch (d.day()) {
+ case 0:
+ return '[prejšnjo] [nedeljo] [ob] LT';
+ case 3:
+ return '[prejšnjo] [sredo] [ob] LT';
+ case 6:
+ return '[prejšnjo] [soboto] [ob] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[prejšnji] dddd [ob] LT';
+ }
+ }
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1.', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1.', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2.', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2.', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3.', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('sq');
+
+test('parse', function (assert) {
+ var i,
+ tests = 'Janar Jan_Shkurt Shk_Mars Mar_Prill Pri_Maj Maj_Qershor Qer_Korrik Kor_Gusht Gus_Shtator Sht_Tetor Tet_Nëntor Nën_Dhjetor Dhj'.split('_');
+
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, HH:mm:ss', 'E Diel, Shkurt 14. 2010, 15:25:50'],
+ ['ddd, HH', 'Die, 15'],
+ ['M Mo MM MMMM MMM', '2 2. 02 Shkurt Shk'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. E Diel Die D'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '6 6. 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'MD MD'],
+ ['[the] DDDo [day of the year]', 'the 45. day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 Shkurt 2010'],
+ ['LLL', '14 Shkurt 2010 15:25'],
+ ['LLLL', 'E Diel, 14 Shkurt 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 Shk 2010'],
+ ['lll', '14 Shk 2010 15:25'],
+ ['llll', 'Die, 14 Shk 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('meridiem', function (assert) {
+ assert.equal(moment([2011, 2, 23, 0, 0]).format('A'), 'PD', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 12, 0]).format('A'), 'MD', 'noon');
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var i,
+ expected = 'Janar Jan_Shkurt Shk_Mars Mar_Prill Pri_Maj Maj_Qershor Qer_Korrik Kor_Gusht Gus_Shtator Sht_Tetor Tet_Nëntor Nën_Dhjetor Dhj'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var i,
+ expected = 'E Diel Die D_E Hënë Hën H_E Martë Mar Ma_E Mërkurë Mër Më_E Enjte Enj E_E Premte Pre P_E Shtunë Sht Sh'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'disa sekonda', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'një minutë', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'një minutë', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minuta', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minuta', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'një orë', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'një orë', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 orë', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 orë', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 orë', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'një ditë', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'një ditë', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 ditë', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'një ditë', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 ditë', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 ditë', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'një muaj', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'një muaj', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'një muaj', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 muaj', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 muaj', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 muaj', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'një muaj', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 muaj', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'një vit', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 vite', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'një vit', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 vite', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'në disa sekonda', 'prefix');
+ assert.equal(moment(0).from(30000), 'disa sekonda më parë', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'disa sekonda më parë', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'në disa sekonda', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'në 5 ditë', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Sot në 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Sot në 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Sot në 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Nesër në 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Sot në 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Dje në 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [në] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [në] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [në] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [e kaluar në] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [e kaluar në] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [e kaluar në] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52.', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1.', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1.', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2.', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2.', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('sr-cyrl');
+
+test('parse', function (assert) {
+ var tests = 'јануар јан._фебруар феб._март мар._април апр._мај мај_јун јун_јул јул_август авг._септембар сеп._октобар окт._новембар нов._децембар дец.'.split('_'),
+ i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, h:mm:ss a', 'недеља, 14. фебруар 2010, 3:25:50 pm'],
+ ['ddd, hA', 'нед., 3PM'],
+ ['M Mo MM MMMM MMM', '2 2. 02 фебруар феб.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. недеља нед. не'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '7 7. 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45. day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14. фебруар 2010'],
+ ['LLL', '14. фебруар 2010 15:25'],
+ ['LLLL', 'недеља, 14. фебруар 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14. феб. 2010'],
+ ['lll', '14. феб. 2010 15:25'],
+ ['llll', 'нед., 14. феб. 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'јануар јан._фебруар феб._март мар._април апр._мај мај_јун јун_јул јул_август авг._септембар сеп._октобар окт._новембар нов._децембар дец.'.split('_'),
+ i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'недеља нед. не_понедељак пон. по_уторак уто. ут_среда сре. ср_четвртак чет. че_петак пет. пе_субота суб. су'.split('_'),
+ i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'неколико секунди', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'један минут', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'један минут', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 минуте', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 минута', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'један сат', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'један сат', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 сата', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 сати', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 сати', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'дан', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'дан', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 дана', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'дан', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 дана', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 дана', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'месец', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'месец', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'месец', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 месеца', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 месеца', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 месеца', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'месец', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 месеци', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'годину', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 године', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'годину', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 година', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'за неколико секунди', 'prefix');
+ assert.equal(moment(0).from(30000), 'пре неколико секунди', 'prefix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'пре неколико секунди', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'за неколико секунди', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'за 5 дана', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'данас у 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'данас у 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'данас у 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'сутра у 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'данас у 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'јуче у 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ function makeFormat(d) {
+ switch (d.day()) {
+ case 0:
+ return '[у] [недељу] [у] LT';
+ case 3:
+ return '[у] [среду] [у] LT';
+ case 6:
+ return '[у] [суботу] [у] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[у] dddd [у] LT';
+ }
+ }
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ function makeFormat(d) {
+ var lastWeekDay = [
+ '[прошле] [недеље] [у] LT',
+ '[прошлог] [понедељка] [у] LT',
+ '[прошлог] [уторка] [у] LT',
+ '[прошле] [среде] [у] LT',
+ '[прошлог] [четвртка] [у] LT',
+ '[прошлог] [петка] [у] LT',
+ '[прошле] [суботе] [у] LT'
+ ];
+
+ return lastWeekDay[d.day()];
+ }
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1.', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1.', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2.', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2.', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3.', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('sr');
+
+test('parse', function (assert) {
+ var tests = 'januar jan._februar feb._mart mar._april apr._maj maj_jun jun_jul jul_avgust avg._septembar sep._oktobar okt._novembar nov._decembar dec.'.split('_'),
+ i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, h:mm:ss a', 'nedelja, 14. februar 2010, 3:25:50 pm'],
+ ['ddd, hA', 'ned., 3PM'],
+ ['M Mo MM MMMM MMM', '2 2. 02 februar feb.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. nedelja ned. ne'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '7 7. 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45. day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14. februar 2010'],
+ ['LLL', '14. februar 2010 15:25'],
+ ['LLLL', 'nedelja, 14. februar 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14. feb. 2010'],
+ ['lll', '14. feb. 2010 15:25'],
+ ['llll', 'ned., 14. feb. 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'januar jan._februar feb._mart mar._april apr._maj maj_jun jun_jul jul_avgust avg._septembar sep._oktobar okt._novembar nov._decembar dec.'.split('_'),
+ i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'nedelja ned. ne_ponedeljak pon. po_utorak uto. ut_sreda sre. sr_četvrtak čet. če_petak pet. pe_subota sub. su'.split('_'),
+ i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'nekoliko sekundi', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'jedan minut', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'jedan minut', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minute', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minuta', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'jedan sat', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'jedan sat', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 sata', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 sati', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 sati', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'dan', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'dan', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dana', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'dan', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dana', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dana', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'mesec', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'mesec', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'mesec', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 meseca', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 meseca', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 meseca', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'mesec', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 meseci', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'godinu', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 godine', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'godinu', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 godina', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'za nekoliko sekundi', 'prefix');
+ assert.equal(moment(0).from(30000), 'pre nekoliko sekundi', 'prefix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'pre nekoliko sekundi', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'za nekoliko sekundi', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'za 5 dana', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'danas u 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'danas u 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'danas u 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'sutra u 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'danas u 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'juče u 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ function makeFormat(d) {
+ switch (d.day()) {
+ case 0:
+ return '[u] [nedelju] [u] LT';
+ case 3:
+ return '[u] [sredu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ }
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ function makeFormat(d) {
+ var lastWeekDay = [
+ '[prošle] [nedelje] [u] LT',
+ '[prošlog] [ponedeljka] [u] LT',
+ '[prošlog] [utorka] [u] LT',
+ '[prošle] [srede] [u] LT',
+ '[prošlog] [četvrtka] [u] LT',
+ '[prošlog] [petka] [u] LT',
+ '[prošle] [subote] [u] LT'
+ ];
+
+ return lastWeekDay[d.day()];
+ }
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1.', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1.', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2.', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2.', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3.', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('ss');
+
+test('parse', function (assert) {
+ var tests = "Bhimbidvwane Bhi_Indlovana Ina_Indlov'lenkhulu Inu_Mabasa Mab_Inkhwekhweti Ink_Inhlaba Inh_Kholwane Kho_Ingci Igc_Inyoni Iny_Imphala Imp_Lweti lwe_Ingongoni Igo".split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('parse meridiem', function (assert) {
+ var i,
+ b = moment(),
+ meridiemTests = [
+ // h a patterns, expected hours, isValid
+ ['10 ekuseni', 10, true],
+ ['11 emini', 11, true],
+ ['3 entsambama', 15, true],
+ ['4 entsambama', 16, true],
+ ['6 entsambama', 18, true],
+ ['7 ebusuku', 19, true],
+ ['12 ebusuku', 0, true],
+ ['10 am', 10, false],
+ ['10 pm', 10, false]
+ ],
+ parsed;
+
+ // test that a formatted moment including meridiem string can be parsed back to the same moment
+ assert.ok(b.isSame(moment(b.format('h:mm:ss a'), 'h:mm:ss a', 'ss', true), 'seconds'), b.format('h:mm:ss a') + ' should be equal to ' + moment(b.format('h:mm:ss a'), 'h:mm:ss a', 'ss', true).format('h:mm:ss a'));
+
+ // test that a formatted moment having a meridiem string can be parsed with strict flag
+ assert.ok(moment(b.format('h:mm:ss a'), 'h:mm:ss a', 'ss', true).isValid(), b.format('h:mm:ss a') + ' should be parsed as valid');
+
+ for (i = 0; i < meridiemTests.length; i++) {
+ parsed = moment(meridiemTests[i][0], 'h a', 'ss', true);
+ assert.equal(parsed.isValid(), meridiemTests[i][2], 'validity for ' + meridiemTests[i][0]);
+ if (parsed.isValid()) {
+ assert.equal(parsed.hours(), meridiemTests[i][1], 'hours for ' + meridiemTests[i][0]);
+ }
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Lisontfo, Indlovana 14 2010, 3:25:50 entsambama'],
+ ['ddd, h A', 'Lis, 3 entsambama'],
+ ['M Mo MM MMMM MMM', '2 2 02 Indlovana Ina'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 Lisontfo Lis Li'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '6 6 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'entsambama entsambama'],
+ ['[Lilanga] DDDo [lilanga lelinyaka]', 'Lilanga 45 lilanga lelinyaka'],
+ ['LTS', '3:25:50 entsambama'],
+ ['L', '14/02/2010'],
+ ['LL', '14 Indlovana 2010'],
+ ['LLL', '14 Indlovana 2010 3:25 entsambama'],
+ ['LLLL', 'Lisontfo, 14 Indlovana 2010 3:25 entsambama'],
+ ['l', '14/2/2010'],
+ ['ll', '14 Ina 2010'],
+ ['lll', '14 Ina 2010 3:25 entsambama'],
+ ['llll', 'Lis, 14 Ina 2010 3:25 entsambama']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1', '1');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2', '2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3', '3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4', '4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5', '5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6', '6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7', '7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8', '8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9', '9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10', '10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11', '11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12', '12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13', '13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14', '14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15', '15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16', '16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17', '17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18', '18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19', '19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20', '20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21', '21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22', '22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23', '23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24', '24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25', '25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26', '26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27', '27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28', '28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29', '29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30', '30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31', '31');
+});
+
+test('format month', function (assert) {
+ var expected = "Bhimbidvwane Bhi_Indlovana Ina_Indlov'lenkhulu Inu_Mabasa Mab_Inkhwekhweti Ink_Inhlaba Inh_Kholwane Kho_Ingci Igc_Inyoni Iny_Imphala Imp_Lweti Lwe_Ingongoni Igo".split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Lisontfo Lis Li_Umsombuluko Umb Us_Lesibili Lsb Lb_Lesitsatfu Les Lt_Lesine Lsi Ls_Lesihlanu Lsh Lh_Umgcibelo Umg Ug'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'emizuzwana lomcane', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'umzuzu', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'umzuzu', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 emizuzu', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 emizuzu', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'lihora', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'lihora', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 emahora', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 emahora', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 emahora', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'lilanga', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'lilanga', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 emalanga', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'lilanga', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 emalanga', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 emalanga', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'inyanga', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'inyanga', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'inyanga', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 tinyanga', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 tinyanga', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 tinyanga', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'inyanga', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 tinyanga', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'umnyaka', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 iminyaka', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'umnyaka', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 iminyaka', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'nga emizuzwana lomcane', 'prefix');
+ assert.equal(moment(0).from(30000), 'wenteka nga emizuzwana lomcane', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'wenteka nga emizuzwana lomcane', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'nga emizuzwana lomcane', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'nga 5 emalanga', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Namuhla nga 12:00 emini', 'Today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Namuhla nga 12:25 emini', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Namuhla nga 1:00 emini', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Kusasa nga 12:00 emini', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Namuhla nga 11:00 emini', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Itolo nga 12:00 emini', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [nga] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [nga] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [nga] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [leliphelile] [nga] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [leliphelile] [nga] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [leliphelile] [nga] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1', 'Jan 4 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('sv');
+
+test('parse', function (assert) {
+ var tests = 'januari jan_februari feb_mars mar_april apr_maj maj_juni jun_juli jul_augusti aug_september sep_oktober okt_november nov_december dec'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'söndag, februari 14e 2010, 3:25:50 pm'],
+ ['ddd, hA', 'sön, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2a 02 februari feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14e 14'],
+ ['d do dddd ddd dd', '0 0e söndag sön sö'],
+ ['DDD DDDo DDDD', '45 45e 045'],
+ ['w wo ww', '6 6e 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45e day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '2010-02-14'],
+ ['LL', '14 februari 2010'],
+ ['LLL', '14 februari 2010 kl. 15:25'],
+ ['LLLL', 'söndag 14 februari 2010 kl. 15:25'],
+ ['l', '2010-2-14'],
+ ['ll', '14 feb 2010'],
+ ['lll', '14 feb 2010 15:25'],
+ ['llll', 'sön 14 feb 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1a', '1a');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2a', '2a');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3e', '3e');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4e', '4e');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5e', '5e');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6e', '6e');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7e', '7e');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8e', '8e');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9e', '9e');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10e', '10e');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11e', '11e');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12e', '12e');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13e', '13e');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14e', '14e');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15e', '15e');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16e', '16e');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17e', '17e');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18e', '18e');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19e', '19e');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20e', '20e');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21a', '21a');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22a', '22a');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23e', '23e');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24e', '24e');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25e', '25e');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26e', '26e');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27e', '27e');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28e', '28e');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29e', '29e');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30e', '30e');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31a', '31a');
+});
+
+test('format month', function (assert) {
+ var expected = 'januari jan_februari feb_mars mar_april apr_maj maj_juni jun_juli jul_augusti aug_september sep_oktober okt_november nov_december dec'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'söndag sön sö_måndag mån må_tisdag tis ti_onsdag ons on_torsdag tor to_fredag fre fr_lördag lör lö'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'några sekunder', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'en minut', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'en minut', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minuter', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minuter', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'en timme', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'en timme', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 timmar', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 timmar', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 timmar', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'en dag', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'en dag', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 dagar', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'en dag', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 dagar', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 dagar', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'en månad', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'en månad', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'en månad', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 månader', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 månader', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 månader', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'en månad', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 månader', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'ett år', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 år', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'ett år', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 år', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'om några sekunder', 'prefix');
+ assert.equal(moment(0).from(30000), 'för några sekunder sedan', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'för några sekunder sedan', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'om några sekunder', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'om 5 dagar', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Idag 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Idag 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Idag 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Imorgon 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Idag 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Igår 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('[På] dddd LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[På] dddd LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[På] dddd LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[I] dddd[s] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[I] dddd[s] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[I] dddd[s] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52a', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1a', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1a', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2a', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2a', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('sw');
+
+test('parse', function (assert) {
+ var tests = 'Januari Jan_Februari Feb_Machi Mac_Aprili Apr_Mei Mei_Juni Jun_Julai Jul_Agosti Ago_Septemba Sep_Oktoba Okt_Novemba Nov_Desemba Des'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Jumapili, Februari 14 2010, 3:25:50 pm'],
+ ['ddd, hA', 'Jpl, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2 02 Februari Feb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 Jumapili Jpl J2'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '7 7 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[siku] DDDo [ya mwaka]', 'siku 45 ya mwaka'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14 Februari 2010'],
+ ['LLL', '14 Februari 2010 15:25'],
+ ['LLLL', 'Jumapili, 14 Februari 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14 Feb 2010'],
+ ['lll', '14 Feb 2010 15:25'],
+ ['llll', 'Jpl, 14 Feb 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1', '1');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2', '2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3', '3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4', '4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5', '5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6', '6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7', '7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8', '8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9', '9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10', '10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11', '11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12', '12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13', '13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14', '14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15', '15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16', '16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17', '17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18', '18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19', '19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20', '20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21', '21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22', '22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23', '23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24', '24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25', '25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26', '26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27', '27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28', '28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29', '29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30', '30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31', '31');
+});
+
+test('format month', function (assert) {
+ var expected = 'Januari Jan_Februari Feb_Machi Mac_Aprili Apr_Mei Mei_Juni Jun_Julai Jul_Agosti Ago_Septemba Sep_Oktoba Okt_Novemba Nov_Desemba Des'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Jumapili Jpl J2_Jumatatu Jtat J3_Jumanne Jnne J4_Jumatano Jtan J5_Alhamisi Alh Al_Ijumaa Ijm Ij_Jumamosi Jmos J1'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'hivi punde', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'dakika moja', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'dakika moja', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), 'dakika 2', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), 'dakika 44', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'saa limoja', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'saa limoja', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), 'masaa 2', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), 'masaa 5', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), 'masaa 21', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'siku moja', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'siku moja', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), 'masiku 2', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'siku moja', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), 'masiku 5', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), 'masiku 25', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'mwezi mmoja', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'mwezi mmoja', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'mwezi mmoja', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), 'miezi 2', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), 'miezi 2', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), 'miezi 3', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'mwezi mmoja', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), 'miezi 5', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'mwaka mmoja', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), 'miaka 2', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'mwaka mmoja', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), 'miaka 5', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'hivi punde baadaye', 'prefix');
+ assert.equal(moment(0).from(30000), 'tokea hivi punde', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'tokea hivi punde', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'hivi punde baadaye', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'masiku 5 baadaye', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+ assert.equal(moment(a).calendar(), 'leo saa 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'leo saa 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'leo saa 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'kesho saa 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'leo saa 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'jana 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('[wiki ijayo] dddd [saat] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[wiki ijayo] dddd [saat] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[wiki ijayo] dddd [saat] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[wiki iliyopita] dddd [saat] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[wiki iliyopita] dddd [saat] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[wiki iliyopita] dddd [saat] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday format', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('ta');
+
+test('parse', function (assert) {
+ var tests = 'ஜனவரி ஜனவரி_பிப்ரவரி பிப்ரவரி_மார்ச் மார்ச்_ஏப்ரல் ஏப்ரல்_மே மே_ஜூன் ஜூன்_ஜூலை ஜூலை_ஆகஸ்ட் ஆகஸ்ட்_செப்டெம்பர் செப்டெம்பர்_அக்டோபர் அக்டோபர்_நவம்பர் நவம்பர்_டிசம்பர் டிசம்பர்'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'ஞாயிற்றுக்கிழமை, பிப்ரவரி ௧௪வது ௨௦௧௦, ௩:௨௫:௫௦ எற்பாடு'],
+ ['ddd, hA', 'ஞாயிறு, ௩ எற்பாடு'],
+ ['M Mo MM MMMM MMM', '௨ ௨வது ௦௨ பிப்ரவரி பிப்ரவரி'],
+ ['YYYY YY', '௨௦௧௦ ௧௦'],
+ ['D Do DD', '௧௪ ௧௪வது ௧௪'],
+ ['d do dddd ddd dd', '௦ ௦வது ஞாயிற்றுக்கிழமை ஞாயிறு ஞா'],
+ ['DDD DDDo DDDD', '௪௫ ௪௫வது ௦௪௫'],
+ ['w wo ww', '௮ ௮வது ௦௮'],
+ ['h hh', '௩ ௦௩'],
+ ['H HH', '௧௫ ௧௫'],
+ ['m mm', '௨௫ ௨௫'],
+ ['s ss', '௫௦ ௫௦'],
+ ['a A', ' எற்பாடு எற்பாடு'],
+ ['[ஆண்டின்] DDDo [நாள்]', 'ஆண்டின் ௪௫வது நாள்'],
+ ['LTS', '௧௫:௨௫:௫௦'],
+ ['L', '௧௪/௦௨/௨௦௧௦'],
+ ['LL', '௧௪ பிப்ரவரி ௨௦௧௦'],
+ ['LLL', '௧௪ பிப்ரவரி ௨௦௧௦, ௧௫:௨௫'],
+ ['LLLL', 'ஞாயிற்றுக்கிழமை, ௧௪ பிப்ரவரி ௨௦௧௦, ௧௫:௨௫'],
+ ['l', '௧௪/௨/௨௦௧௦'],
+ ['ll', '௧௪ பிப்ரவரி ௨௦௧௦'],
+ ['lll', '௧௪ பிப்ரவரி ௨௦௧௦, ௧௫:௨௫'],
+ ['llll', 'ஞாயிறு, ௧௪ பிப்ரவரி ௨௦௧௦, ௧௫:௨௫']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '௧வது', '௧வது');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '௨வது', '௨வது');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '௩வது', '௩வது');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '௪வது', '௪வது');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '௫வது', '௫வது');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '௬வது', '௬வது');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '௭வது', '௭வது');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '௮வது', '௮வது');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '௯வது', '௯வது');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '௧௦வது', '௧௦வது');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '௧௧வது', '௧௧வது');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '௧௨வது', '௧௨வது');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '௧௩வது', '௧௩வது');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '௧௪வது', '௧௪வது');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '௧௫வது', '௧௫வது');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '௧௬வது', '௧௬வது');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '௧௭வது', '௧௭வது');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '௧௮வது', '௧௮வது');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '௧௯வது', '௧௯வது');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '௨௦வது', '௨௦வது');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '௨௧வது', '௨௧வது');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '௨௨வது', '௨௨வது');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '௨௩வது', '௨௩வது');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '௨௪வது', '௨௪வது');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '௨௫வது', '௨௫வது');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '௨௬வது', '௨௬வது');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '௨௭வது', '௨௭வது');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '௨௮வது', '௨௮வது');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '௨௯வது', '௨௯வது');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '௩௦வது', '௩௦வது');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '௩௧வது', '௩௧வது');
+});
+
+test('format month', function (assert) {
+ var expected = 'ஜனவரி ஜனவரி_பிப்ரவரி பிப்ரவரி_மார்ச் மார்ச்_ஏப்ரல் ஏப்ரல்_மே மே_ஜூன் ஜூன்_ஜூலை ஜூலை_ஆகஸ்ட் ஆகஸ்ட்_செப்டெம்பர் செப்டெம்பர்_அக்டோபர் அக்டோபர்_நவம்பர் நவம்பர்_டிசம்பர் டிசம்பர்'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'ஞாயிற்றுக்கிழமை ஞாயிறு ஞா_திங்கட்கிழமை திங்கள் தி_செவ்வாய்கிழமை செவ்வாய் செ_புதன்கிழமை புதன் பு_வியாழக்கிழமை வியாழன் வி_வெள்ளிக்கிழமை வெள்ளி வெ_சனிக்கிழமை சனி ச'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'ஒரு சில விநாடிகள்', '44 விநாடிகள் = ஒரு சில விநாடிகள்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'ஒரு நிமிடம்', '45 விநாடிகள் = ஒரு நிமிடம்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'ஒரு நிமிடம்', '89 விநாடிகள் = ஒரு நிமிடம்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '௨ நிமிடங்கள்', '90 விநாடிகள் = ௨ நிமிடங்கள்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '௪௪ நிமிடங்கள்', '44 நிமிடங்கள் = 44 நிமிடங்கள்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'ஒரு மணி நேரம்', '45 நிமிடங்கள் = ஒரு மணி நேரம்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'ஒரு மணி நேரம்', '89 நிமிடங்கள் = ஒரு மணி நேரம்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '௨ மணி நேரம்', '90 நிமிடங்கள் = ௨ மணி நேரம்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '௫ மணி நேரம்', '5 மணி நேரம் = 5 மணி நேரம்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '௨௧ மணி நேரம்', '௨௧ மணி நேரம் = ௨௧ மணி நேரம்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'ஒரு நாள்', '௨௨ மணி நேரம் = ஒரு நாள்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'ஒரு நாள்', '௩5 மணி நேரம் = ஒரு நாள்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '௨ நாட்கள்', '௩6 மணி நேரம் = ௨ days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'ஒரு நாள்', '௧ நாள் = ஒரு நாள்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '௫ நாட்கள்', '5 நாட்கள் = 5 நாட்கள்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '௨௫ நாட்கள்', '௨5 நாட்கள் = ௨5 நாட்கள்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'ஒரு மாதம்', '௨6 நாட்கள் = ஒரு மாதம்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'ஒரு மாதம்', '௩0 நாட்கள் = ஒரு மாதம்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'ஒரு மாதம்', '45 நாட்கள் = ஒரு மாதம்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '௨ மாதங்கள்', '46 நாட்கள் = ௨ மாதங்கள்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '௨ மாதங்கள்', '75 நாட்கள் = ௨ மாதங்கள்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '௩ மாதங்கள்', '76 நாட்கள் = ௩ மாதங்கள்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'ஒரு மாதம்', '௧ மாதம் = ஒரு மாதம்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '௫ மாதங்கள்', '5 மாதங்கள் = 5 மாதங்கள்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'ஒரு வருடம்', '௩45 நாட்கள் = ஒரு வருடம்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '௨ ஆண்டுகள்', '548 நாட்கள் = ௨ ஆண்டுகள்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'ஒரு வருடம்', '௧ வருடம் = ஒரு வருடம்');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '௫ ஆண்டுகள்', '5 ஆண்டுகள் = 5 ஆண்டுகள்');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'ஒரு சில விநாடிகள் இல்', 'prefix');
+ assert.equal(moment(0).from(30000), 'ஒரு சில விநாடிகள் முன்', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'ஒரு சில விநாடிகள் முன்', 'இப்போது இருந்து கடந்த காலத்தில் காட்ட வேண்டும்');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'ஒரு சில விநாடிகள் இல்', 'ஒரு சில விநாடிகள் இல்');
+ assert.equal(moment().add({d: 5}).fromNow(), '௫ நாட்கள் இல்', '5 நாட்கள் இல்');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'இன்று ௧௨:௦௦', 'இன்று 12:00');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'இன்று ௧௨:௨௫', 'இன்று 12:25');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'இன்று ௧௩:௦௦', 'இன்று 13:00');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'நாளை ௧௨:௦௦', 'நாளை 12:00');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'இன்று ௧௧:௦௦', 'இன்று 11:00');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'நேற்று ௧௨:௦௦', 'நேற்று 12:00');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd, LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd, LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd, LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[கடந்த வாரம்] dddd, LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[கடந்த வாரம்] dddd, LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[கடந்த வாரம்] dddd, LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('meridiem', function (assert) {
+ assert.equal(moment([2011, 2, 23, 0, 30]).format('a'), ' யாமம்', '(after) midnight');
+ assert.equal(moment([2011, 2, 23, 2, 30]).format('a'), ' வைகறை', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 9, 30]).format('a'), ' காலை', 'morning');
+ assert.equal(moment([2011, 2, 23, 14, 30]).format('a'), ' எற்பாடு', 'during day');
+ assert.equal(moment([2011, 2, 23, 17, 30]).format('a'), ' எற்பாடு', 'evening');
+ assert.equal(moment([2011, 2, 23, 19, 30]).format('a'), ' மாலை', 'late evening');
+ assert.equal(moment([2011, 2, 23, 23, 30]).format('a'), ' யாமம்', '(before) midnight');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('te');
+
+test('parse', function (assert) {
+ var tests = 'జనవరి జన._ఫిబ్రవరి ఫిబ్ర._మార్చి మార్చి_ఏప్రిల్ ఏప్రి._మే మే_జూన్ జూన్_జూలై జూలై_ఆగస్టు ఆగ._సెప్టెంబర్ సెప్._అక్టోబర్ అక్టో._నవంబర్ నవ._డిసెంబర్ డిసె.'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do తేదీ MMMM YYYY, a h:mm:ss', 'ఆదివారం, 14వ తేదీ ఫిబ్రవరి 2010, మధ్యాహ్నం 3:25:50'],
+ ['ddd, a h గంటలు', 'ఆది, మధ్యాహ్నం 3 గంటలు'],
+ ['M Mo నెల MM MMMM MMM', '2 2వ నెల 02 ఫిబ్రవరి ఫిబ్ర.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14వ 14'],
+ ['d do dddd ddd dd', '0 0వ ఆదివారం ఆది ఆ'],
+ ['DDD DDDo DDDD', '45 45వ 045'],
+ ['w wo ww', '8 8వ 08'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'మధ్యాహ్నం మధ్యాహ్నం'],
+ ['LTS', 'మధ్యాహ్నం 3:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 ఫిబ్రవరి 2010'],
+ ['LLL', '14 ఫిబ్రవరి 2010, మధ్యాహ్నం 3:25'],
+ ['LLLL', 'ఆదివారం, 14 ఫిబ్రవరి 2010, మధ్యాహ్నం 3:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 ఫిబ్ర. 2010'],
+ ['lll', '14 ఫిబ్ర. 2010, మధ్యాహ్నం 3:25'],
+ ['llll', 'ఆది, 14 ఫిబ్ర. 2010, మధ్యాహ్నం 3:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1వ', '1వ');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2వ', '2వ');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3వ', '3వ');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4వ', '4వ');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5వ', '5వ');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6వ', '6వ');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7వ', '7వ');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8వ', '8వ');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9వ', '9వ');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10వ', '10వ');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11వ', '11వ');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12వ', '12వ');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13వ', '13వ');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14వ', '14వ');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15వ', '15వ');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16వ', '16వ');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17వ', '17వ');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18వ', '18వ');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19వ', '19వ');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20వ', '20వ');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21వ', '21వ');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22వ', '22వ');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23వ', '23వ');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24వ', '24వ');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25వ', '25వ');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26వ', '26వ');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27వ', '27వ');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28వ', '28వ');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29వ', '29వ');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30వ', '30వ');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31వ', '31వ');
+});
+
+test('format month', function (assert) {
+ var expected = 'జనవరి జన._ఫిబ్రవరి ఫిబ్ర._మార్చి మార్చి_ఏప్రిల్ ఏప్రి._మే మే_జూన్ జూన్_జూలై జూలై_ఆగస్టు ఆగ._సెప్టెంబర్ సెప్._అక్టోబర్ అక్టో._నవంబర్ నవ._డిసెంబర్ డిసె.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'ఆదివారం ఆది ఆ_సోమవారం సోమ సో_మంగళవారం మంగళ మం_బుధవారం బుధ బు_గురువారం గురు గు_శుక్రవారం శుక్ర శు_శనివారం శని శ'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'కొన్ని క్షణాలు', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'ఒక నిమిషం', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'ఒక నిమిషం', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 నిమిషాలు', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 నిమిషాలు', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'ఒక గంట', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'ఒక గంట', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 గంటలు', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 గంటలు', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 గంటలు', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'ఒక రోజు', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'ఒక రోజు', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 రోజులు', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'ఒక రోజు', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 రోజులు', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 రోజులు', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'ఒక నెల', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'ఒక నెల', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'ఒక నెల', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 నెలలు', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 నెలలు', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 నెలలు', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'ఒక నెల', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 నెలలు', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'ఒక సంవత్సరం', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 సంవత్సరాలు', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'ఒక సంవత్సరం', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 సంవత్సరాలు', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'కొన్ని క్షణాలు లో', 'prefix');
+ assert.equal(moment(0).from(30000), 'కొన్ని క్షణాలు క్రితం', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'కొన్ని క్షణాలు క్రితం', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'కొన్ని క్షణాలు లో', 'కొన్ని క్షణాలు లో');
+ assert.equal(moment().add({d: 5}).fromNow(), '5 రోజులు లో', '5 రోజులు లో');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'నేడు మధ్యాహ్నం 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'నేడు మధ్యాహ్నం 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 3}).calendar(), 'నేడు మధ్యాహ్నం 3:00', 'Now plus 3 hours');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'రేపు మధ్యాహ్నం 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'నేడు మధ్యాహ్నం 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'నిన్న మధ్యాహ్నం 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd[,] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd[,] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd[,] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[గత] dddd[,] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[గత] dddd[,] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[గత] dddd[,] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('meridiem', function (assert) {
+ assert.equal(moment([2011, 2, 23, 2, 30]).format('a'), 'రాత్రి', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 9, 30]).format('a'), 'ఉదయం', 'morning');
+ assert.equal(moment([2011, 2, 23, 14, 30]).format('a'), 'మధ్యాహ్నం', 'during day');
+ assert.equal(moment([2011, 2, 23, 17, 30]).format('a'), 'సాయంత్రం', 'evening');
+ assert.equal(moment([2011, 2, 23, 19, 30]).format('a'), 'సాయంత్రం', 'late evening');
+ assert.equal(moment([2011, 2, 23, 21, 20]).format('a'), 'రాత్రి', 'night');
+
+ assert.equal(moment([2011, 2, 23, 2, 30]).format('A'), 'రాత్రి', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 9, 30]).format('A'), 'ఉదయం', 'morning');
+ assert.equal(moment([2011, 2, 23, 14, 30]).format('A'), 'మధ్యాహ్నం', ' during day');
+ assert.equal(moment([2011, 2, 23, 17, 30]).format('A'), 'సాయంత్రం', 'evening');
+ assert.equal(moment([2011, 2, 23, 19, 30]).format('A'), 'సాయంత్రం', 'late evening');
+ assert.equal(moment([2011, 2, 23, 21, 20]).format('A'), 'రాత్రి', 'night');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1వ', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '1 01 1వ', 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2వ', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '2 02 2వ', 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '3 03 3వ', 'Jan 15 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('tet');
+
+test('parse', function (assert) {
+ var tests = 'Janeiru Jan_Fevereiru Fev_Marsu Mar_Abril Abr_Maiu Mai_Juniu Jun_Juliu Jul_Augustu Aug_Setembru Set_Outubru Out_Novembru Nov_Dezembru Dez'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Domingu, Fevereiru 14th 2010, 3:25:50 pm'],
+ ['ddd, hA', 'Dom, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2nd 02 Fevereiru Fev'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14th 14'],
+ ['d do dddd ddd dd', '0 0th Domingu Dom Do'],
+ ['DDD DDDo DDDD', '45 45th 045'],
+ ['w wo ww', '6 6th 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45th day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 Fevereiru 2010'],
+ ['LLL', '14 Fevereiru 2010 15:25'],
+ ['LLLL', 'Domingu, 14 Fevereiru 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 Fev 2010'],
+ ['lll', '14 Fev 2010 15:25'],
+ ['llll', 'Dom, 14 Fev 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1st', '1st');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2nd', '2nd');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3rd', '3rd');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4th', '4th');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5th', '5th');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6th', '6th');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7th', '7th');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8th', '8th');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9th', '9th');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10th', '10th');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11th', '11th');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12th', '12th');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13th', '13th');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14th', '14th');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15th', '15th');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16th', '16th');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17th', '17th');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18th', '18th');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19th', '19th');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20th', '20th');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21st', '21st');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22nd', '22nd');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23rd', '23rd');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24th', '24th');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25th', '25th');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26th', '26th');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27th', '27th');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28th', '28th');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29th', '29th');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30th', '30th');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31st', '31st');
+});
+
+test('format month', function (assert) {
+ var expected = 'Janeiru Jan_Fevereiru Fev_Marsu Mar_Abril Abr_Maiu Mai_Juniu Jun_Juliu Jul_Augustu Aug_Setembru Set_Outubru Out_Novembru Nov_Dezembru Dez'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Domingu Dom Do_Segunda Seg Seg_Tersa Ters Te_Kuarta Kua Ku_Kinta Kint Ki_Sexta Sext Sex_Sabadu Sab Sa'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'minutu balun', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'minutu ida', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'minutu ida', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), 'minutus 2', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), 'minutus 44', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'horas ida', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'horas ida', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), 'horas 2', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), 'horas 5', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), 'horas 21', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'loron ida', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'loron ida', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), 'loron 2', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'loron ida', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), 'loron 5', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), 'loron 25', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'fulan ida', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'fulan ida', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'fulan ida', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), 'fulan 2', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), 'fulan 2', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), 'fulan 3', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'fulan ida', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), 'fulan 5', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'tinan ida', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), 'tinan 2', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'tinan ida', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), 'tinan 5', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'iha minutu balun', 'prefix');
+ assert.equal(moment(0).from(30000), 'minutu balun liuba', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'minutu balun liuba', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'iha minutu balun', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'iha loron 5', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Ohin iha 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Ohin iha 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Ohin iha 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Aban iha 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Ohin iha 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Horiseik iha 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [iha] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [iha] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [iha] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [semana kotuk] [iha] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [semana kotuk] [iha] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [semana kotuk] [iha] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52nd', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1st', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1st', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2nd', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2nd', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('th');
+
+test('parse', function (assert) {
+ var tests = 'มกราคม ม.ค._กุมภาพันธ์ ก.พ._มีนาคม มี.ค._เมษายน เม.ย._พฤษภาคม พ.ค._มิถุนายน มิ.ย._กรกฎาคม ก.ค._สิงหาคม ส.ค._กันยายน ก.ย._ตุลาคม ต.ค._พฤศจิกายน พ.ย._ธันวาคม ธ.ค.'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, h:mm:ss a', 'อาทิตย์, 14 กุมภาพันธ์ 2010, 3:25:50 หลังเที่ยง'],
+ ['ddd, h A', 'อาทิตย์, 3 หลังเที่ยง'],
+ ['M Mo MM MMMM MMM', '2 2 02 กุมภาพันธ์ ก.พ.'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 อาทิตย์ อาทิตย์ อา.'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '8 8 08'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'หลังเที่ยง หลังเที่ยง'],
+ ['[the] DDDo [day of the year]', 'the 45 day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '2010/02/14'],
+ ['LL', '14 กุมภาพันธ์ 2010'],
+ ['LLL', '14 กุมภาพันธ์ 2010 เวลา 15:25'],
+ ['LLLL', 'วันอาทิตย์ที่ 14 กุมภาพันธ์ 2010 เวลา 15:25'],
+ ['l', '2010/2/14'],
+ ['ll', '14 ก.พ. 2010'],
+ ['lll', '14 ก.พ. 2010 เวลา 15:25'],
+ ['llll', 'วันอาทิตย์ที่ 14 ก.พ. 2010 เวลา 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format month', function (assert) {
+ var expected = 'มกราคม ม.ค._กุมภาพันธ์ ก.พ._มีนาคม มี.ค._เมษายน เม.ย._พฤษภาคม พ.ค._มิถุนายน มิ.ย._กรกฎาคม ก.ค._สิงหาคม ส.ค._กันยายน ก.ย._ตุลาคม ต.ค._พฤศจิกายน พ.ย._ธันวาคม ธ.ค.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'อาทิตย์ อาทิตย์ อา._จันทร์ จันทร์ จ._อังคาร อังคาร อ._พุธ พุธ พ._พฤหัสบดี พฤหัส พฤ._ศุกร์ ศุกร์ ศ._เสาร์ เสาร์ ส.'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'ไม่กี่วินาที', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), '1 นาที', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), '1 นาที', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 นาที', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 นาที', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), '1 ชั่วโมง', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), '1 ชั่วโมง', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 ชั่วโมง', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 ชั่วโมง', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 ชั่วโมง', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), '1 วัน', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), '1 วัน', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 วัน', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), '1 วัน', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 วัน', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 วัน', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), '1 เดือน', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), '1 เดือน', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), '1 เดือน', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 เดือน', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 เดือน', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 เดือน', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), '1 เดือน', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 เดือน', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), '1 ปี', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 ปี', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), '1 ปี', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 ปี', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'อีก ไม่กี่วินาที', 'prefix');
+ assert.equal(moment(0).from(30000), 'ไม่กี่วินาทีที่แล้ว', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'ไม่กี่วินาทีที่แล้ว', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'อีก ไม่กี่วินาที', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'อีก 5 วัน', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'วันนี้ เวลา 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'วันนี้ เวลา 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'วันนี้ เวลา 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'พรุ่งนี้ เวลา 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'วันนี้ เวลา 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'เมื่อวานนี้ เวลา 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd[หน้า เวลา] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd[หน้า เวลา] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd[หน้า เวลา] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[วัน]dddd[ที่แล้ว เวลา] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[วัน]dddd[ที่แล้ว เวลา] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[วัน]dddd[ที่แล้ว เวลา] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday format', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '1 01 1', 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '2 02 2', 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '3 03 3', 'Jan 15 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('tl-ph');
+
+test('parse', function (assert) {
+ var tests = 'Enero Ene_Pebrero Peb_Marso Mar_Abril Abr_Mayo May_Hunyo Hun_Hulyo Hul_Agosto Ago_Setyembre Set_Oktubre Okt_Nobyembre Nob_Disyembre Dis'.split('_'),
+ i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Linggo, Pebrero 14 2010, 3:25:50 pm'],
+ ['ddd, hA', 'Lin, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2 02 Pebrero Peb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 Linggo Lin Li'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '6 6 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45 day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '02/14/2010'],
+ ['LL', 'Pebrero 14, 2010'],
+ ['LLL', 'Pebrero 14, 2010 15:25'],
+ ['LLLL', 'Linggo, Pebrero 14, 2010 15:25'],
+ ['l', '2/14/2010'],
+ ['ll', 'Peb 14, 2010'],
+ ['lll', 'Peb 14, 2010 15:25'],
+ ['llll', 'Lin, Peb 14, 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1', '1');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2', '2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3', '3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4', '4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5', '5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6', '6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7', '7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8', '8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9', '9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10', '10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11', '11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12', '12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13', '13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14', '14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15', '15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16', '16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17', '17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18', '18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19', '19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20', '20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21', '21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22', '22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23', '23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24', '24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25', '25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26', '26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27', '27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28', '28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29', '29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30', '30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31', '31');
+});
+
+test('format month', function (assert) {
+ var expected = 'Enero Ene_Pebrero Peb_Marso Mar_Abril Abr_Mayo May_Hunyo Hun_Hulyo Hul_Agosto Ago_Setyembre Set_Oktubre Okt_Nobyembre Nob_Disyembre Dis'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Linggo Lin Li_Lunes Lun Lu_Martes Mar Ma_Miyerkules Miy Mi_Huwebes Huw Hu_Biyernes Biy Bi_Sabado Sab Sab'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'ilang segundo', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'isang minuto', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'isang minuto', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minuto', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minuto', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'isang oras', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'isang oras', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 oras', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 oras', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 oras', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'isang araw', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'isang araw', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 araw', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'isang araw', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 araw', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 araw', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'isang buwan', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'isang buwan', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'isang buwan', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 buwan', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 buwan', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 buwan', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'isang buwan', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 buwan', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'isang taon', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 taon', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'isang taon', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 taon', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'sa loob ng ilang segundo', 'prefix');
+ assert.equal(moment(0).from(30000), 'ilang segundo ang nakalipas', 'suffix');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'sa loob ng ilang segundo', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'sa loob ng 5 araw', 'in 5 days');
+});
+
+test('same day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), '12:00 ngayong araw', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), '12:25 ngayong araw', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), '13:00 ngayong araw', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Bukas ng 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), '11:00 ngayong araw', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), '12:00 kahapon', 'yesterday at the same time');
+});
+
+test('same next week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('LT [sa susunod na] dddd'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('LT [sa susunod na] dddd'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('LT [sa susunod na] dddd'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('same last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('LT [noong nakaraang] dddd'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('LT [noong nakaraang] dddd'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('LT [noong nakaraang] dddd'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('same all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('tlh');
+
+//Current parsing method doesn't allow parsing correctly months 10, 11 and 12.
+/*
+ * test('parse', function (assert) {
+ var tests = 'tera’ jar wa’.jar wa’_tera’ jar cha’.jar cha’_tera’ jar wej.jar wej_tera’ jar loS.jar loS_tera’ jar vagh.jar vagh_tera’ jar jav.jar jav_tera’ jar Soch.jar Soch_tera’ jar chorgh.jar chorgh_tera’ jar Hut.jar Hut_tera’ jar wa’maH.jar wa’maH_tera’ jar wa’maH wa’.jar wa’maH wa’_tera’ jar wa’maH cha’.jar wa’maH cha’'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split('.');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+*/
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'lojmItjaj, tera’ jar cha’ 14. 2010, 3:25:50 pm'],
+ ['ddd, hA', 'lojmItjaj, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2. 02 tera’ jar cha’ jar cha’'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. lojmItjaj lojmItjaj lojmItjaj'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '6 6. 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[DIS jaj] DDDo', 'DIS jaj 45.'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14 tera’ jar cha’ 2010'],
+ ['LLL', '14 tera’ jar cha’ 2010 15:25'],
+ ['LLLL', 'lojmItjaj, 14 tera’ jar cha’ 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14 jar cha’ 2010'],
+ ['lll', '14 jar cha’ 2010 15:25'],
+ ['llll', 'lojmItjaj, 14 jar cha’ 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'tera’ jar wa’ jar wa’_tera’ jar cha’ jar cha’_tera’ jar wej jar wej_tera’ jar loS jar loS_tera’ jar vagh jar vagh_tera’ jar jav jar jav_tera’ jar Soch jar Soch_tera’ jar chorgh jar chorgh_tera’ jar Hut jar Hut_tera’ jar wa’maH jar wa’maH_tera’ jar wa’maH wa’ jar wa’maH wa’_tera’ jar wa’maH cha’ jar wa’maH cha’'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'lojmItjaj lojmItjaj lojmItjaj_DaSjaj DaSjaj DaSjaj_povjaj povjaj povjaj_ghItlhjaj ghItlhjaj ghItlhjaj_loghjaj loghjaj loghjaj_buqjaj buqjaj buqjaj_ghInjaj ghInjaj ghInjaj'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'puS lup', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'wa’ tup', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'wa’ tup', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), 'cha’ tup', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), 'loSmaH loS tup', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'wa’ rep', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'wa’ rep', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), 'cha’ rep', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), 'vagh rep', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), 'cha’maH wa’ rep', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'wa’ jaj', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'wa’ jaj', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), 'cha’ jaj', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'wa’ jaj', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), 'vagh jaj', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), 'cha’maH vagh jaj', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'wa’ jar', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'wa’ jar', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'wa’ jar', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), 'cha’ jar', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), 'cha’ jar', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), 'wej jar', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'wa’ jar', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), 'vagh jar', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'wa’ DIS', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), 'cha’ DIS', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'wa’ DIS', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), 'vagh DIS', '5 years = 5 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 112}), true), 'wa’vatlh wa’maH cha’ DIS', '112 years = 112 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 122}), true), 'wa’vatlh cha’maH cha’ DIS', '122 years = 122 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 213}), true), 'cha’vatlh wa’maH wej DIS', '213 years = 213 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 223}), true), 'cha’vatlh cha’maH wej DIS', '223 years = 223 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'puS lup pIq', 'suffix');
+ assert.equal(moment(0).from(30000), 'puS lup ret', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'puS lup ret', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'puS lup pIq', 'in a few seconds');
+ assert.equal(moment().add({h: 1}).fromNow(), 'wa’ rep pIq', 'in an hour');
+ assert.equal(moment().add({d: 5}).fromNow(), 'vagh leS', 'in 5 days');
+ assert.equal(moment().add({M: 2}).fromNow(), 'cha’ waQ', 'in 2 months');
+ assert.equal(moment().add({y: 1}).fromNow(), 'wa’ nem', 'in a year');
+ assert.equal(moment().add({s: -30}).fromNow(), 'puS lup ret', 'a few seconds ago');
+ assert.equal(moment().add({h: -1}).fromNow(), 'wa’ rep ret', 'an hour ago');
+ assert.equal(moment().add({d: -5}).fromNow(), 'vagh Hu’', '5 days ago');
+ assert.equal(moment().add({M: -2}).fromNow(), 'cha’ wen', '2 months ago');
+ assert.equal(moment().add({y: -1}).fromNow(), 'wa’ ben', 'a year ago');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'DaHjaj 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'DaHjaj 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'DaHjaj 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'wa’leS 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'DaHjaj 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'wa’Hu’ 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('LLL'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('LLL'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('LLL'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('LLL'), 'Today - ' + i + ' days current time');
+
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('LLL'), 'Today - ' + i + ' days beginning of day');
+
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('LLL'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52.', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1.', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1.', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2.', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2.', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('tr');
+
+test('parse', function (assert) {
+ var tests = 'Ocak Oca_Şubat Şub_Mart Mar_Nisan Nis_Mayıs May_Haziran Haz_Temmuz Tem_Ağustos Ağu_Eylül Eyl_Ekim Eki_Kasım Kas_Aralık Ara'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Pazar, Şubat 14\'üncü 2010, 3:25:50 pm'],
+ ['ddd, hA', 'Paz, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2\'nci 02 Şubat Şub'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14\'üncü 14'],
+ ['d do dddd ddd dd', '0 0\'ıncı Pazar Paz Pz'],
+ ['DDD DDDo DDDD', '45 45\'inci 045'],
+ ['w wo ww', '7 7\'nci 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[yılın] DDDo [günü]', 'yılın 45\'inci günü'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14 Şubat 2010'],
+ ['LLL', '14 Şubat 2010 15:25'],
+ ['LLLL', 'Pazar, 14 Şubat 2010 15:25'],
+ ['l', '14.2.2010'],
+ ['ll', '14 Şub 2010'],
+ ['lll', '14 Şub 2010 15:25'],
+ ['llll', 'Paz, 14 Şub 2010 15:25']
+ ],
+ DDDo = [
+ [359, '360\'ıncı'],
+ [199, '200\'üncü'],
+ [149, '150\'nci']
+ ],
+ dt = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ DDDoDt,
+ i;
+
+ for (i = 0; i < a.length; i++) {
+ assert.equal(dt.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+ for (i = 0; i < DDDo.length; i++) {
+ DDDoDt = moment([2010]);
+ assert.equal(DDDoDt.add(DDDo[i][0], 'days').format('DDDo'), DDDo[i][1], DDDo[i][0] + ' ---> ' + DDDo[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1\'inci', '1st');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2\'nci', '2nd');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3\'üncü', '3rd');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4\'üncü', '4th');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5\'inci', '5th');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6\'ncı', '6th');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7\'nci', '7th');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8\'inci', '8th');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9\'uncu', '9th');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10\'uncu', '10th');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11\'inci', '11th');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12\'nci', '12th');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13\'üncü', '13th');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14\'üncü', '14th');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15\'inci', '15th');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16\'ncı', '16th');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17\'nci', '17th');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18\'inci', '18th');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19\'uncu', '19th');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20\'nci', '20th');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21\'inci', '21th');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22\'nci', '22th');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23\'üncü', '23th');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24\'üncü', '24th');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25\'inci', '25th');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26\'ncı', '26th');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27\'nci', '27th');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28\'inci', '28th');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29\'uncu', '29th');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30\'uncu', '30th');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31\'inci', '31st');
+});
+
+test('format month', function (assert) {
+ var expected = 'Ocak Oca_Şubat Şub_Mart Mar_Nisan Nis_Mayıs May_Haziran Haz_Temmuz Tem_Ağustos Ağu_Eylül Eyl_Ekim Eki_Kasım Kas_Aralık Ara'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Pazar Paz Pz_Pazartesi Pts Pt_Salı Sal Sa_Çarşamba Çar Ça_Perşembe Per Pe_Cuma Cum Cu_Cumartesi Cts Ct'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'birkaç saniye', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'bir dakika', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'bir dakika', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 dakika', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 dakika', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'bir saat', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'bir saat', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 saat', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 saat', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 saat', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'bir gün', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'bir gün', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 gün', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'bir gün', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 gün', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 gün', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'bir ay', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'bir ay', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'bir ay', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 ay', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 ay', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 ay', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'bir ay', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 ay', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'bir yıl', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 yıl', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'bir yıl', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 yıl', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'birkaç saniye sonra', 'prefix');
+ assert.equal(moment(0).from(30000), 'birkaç saniye önce', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'birkaç saniye önce', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'birkaç saniye sonra', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), '5 gün sonra', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'bugün saat 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'bugün saat 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'bugün saat 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'yarın saat 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'bugün saat 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'dün 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('[haftaya] dddd [saat] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[haftaya] dddd [saat] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[haftaya] dddd [saat] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[geçen hafta] dddd [saat] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[geçen hafta] dddd [saat] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[geçen hafta] dddd [saat] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1\'inci', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1\'inci', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2\'nci', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2\'nci', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3\'üncü', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('tzl');
+
+test('parse', function (assert) {
+ var tests = 'Januar Jan_Fevraglh Fev_Març Mar_Avrïu Avr_Mai Mai_Gün Gün_Julia Jul_Guscht Gus_Setemvar Set_Listopäts Lis_Noemvar Noe_Zecemvar Zec'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h.mm.ss a', 'Súladi, Fevraglh 14. 2010, 3.25.50 d\'o'],
+ ['ddd, hA', 'Súl, 3D\'O'],
+ ['M Mo MM MMMM MMM', '2 2. 02 Fevraglh Fev'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14. 14'],
+ ['d do dddd ddd dd', '0 0. Súladi Súl Sú'],
+ ['DDD DDDo DDDD', '45 45. 045'],
+ ['w wo ww', '6 6. 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'd\'o D\'O'],
+ ['[the] DDDo [day of the year]', 'the 45. day of the year'],
+ ['LTS', '15.25.50'],
+ ['L', '14.02.2010'],
+ ['LL', '14. Fevraglh dallas 2010'],
+ ['LLL', '14. Fevraglh dallas 2010 15.25'],
+ ['LLLL', 'Súladi, li 14. Fevraglh dallas 2010 15.25'],
+ ['l', '14.2.2010'],
+ ['ll', '14. Fev dallas 2010'],
+ ['lll', '14. Fev dallas 2010 15.25'],
+ ['llll', 'Súl, li 14. Fev dallas 2010 15.25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1.', '1.');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2.', '2.');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3.', '3.');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4.', '4.');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5.', '5.');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6.', '6.');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7.', '7.');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8.', '8.');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9.', '9.');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10.', '10.');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11.', '11.');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12.', '12.');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13.', '13.');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14.', '14.');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15.', '15.');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16.', '16.');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17.', '17.');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18.', '18.');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19.', '19.');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20.', '20.');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21.', '21.');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22.', '22.');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23.', '23.');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24.', '24.');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25.', '25.');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26.', '26.');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27.', '27.');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28.', '28.');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29.', '29.');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30.', '30.');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31.', '31.');
+});
+
+test('format month', function (assert) {
+ var expected = 'Januar Jan_Fevraglh Fev_Març Mar_Avrïu Avr_Mai Mai_Gün Gün_Julia Jul_Guscht Gus_Setemvar Set_Listopäts Lis_Noemvar Noe_Zecemvar Zec'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Súladi Súl Sú_Lúneçi Lún Lú_Maitzi Mai Ma_Márcuri Már Má_Xhúadi Xhú Xh_Viénerçi Vié Vi_Sáturi Sát Sá'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'viensas secunds', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), '\'n míut', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), '\'n míut', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 míuts', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 míuts', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), '\'n þora', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), '\'n þora', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 þoras', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 þoras', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 þoras', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), '\'n ziua', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), '\'n ziua', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 ziuas', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), '\'n ziua', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 ziuas', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 ziuas', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), '\'n mes', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), '\'n mes', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), '\'n mes', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 mesen', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 mesen', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 mesen', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), '\'n mes', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 mesen', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), '\'n ar', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 ars', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), '\'n ar', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 ars', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'osprei viensas secunds', 'prefix');
+ assert.equal(moment(0).from(30000), 'ja\'iensas secunds', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'ja\'iensas secunds', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'osprei viensas secunds', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'osprei 5 ziuas', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'oxhi à 12.00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'oxhi à 12.25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'oxhi à 13.00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'demà à 12.00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'oxhi à 11.00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'ieiri à 12.00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [à] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [à] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [à] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[sür el] dddd [lasteu à] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[sür el] dddd [lasteu à] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[sür el] dddd [lasteu à] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+// Monday is the first day of the week.
+// The week that contains Jan 4th is the first week of the year.
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52.', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1.', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1.', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2.', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2.', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('tzm-latn');
+
+test('parse', function (assert) {
+ var tests = 'innayr innayr_brˤayrˤ brˤayrˤ_marˤsˤ marˤsˤ_ibrir ibrir_mayyw mayyw_ywnyw ywnyw_ywlywz ywlywz_ɣwšt ɣwšt_šwtanbir šwtanbir_ktˤwbrˤ ktˤwbrˤ_nwwanbir nwwanbir_dwjnbir dwjnbir'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'asamas, brˤayrˤ 14 2010, 3:25:50 pm'],
+ ['ddd, hA', 'asamas, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2 02 brˤayrˤ brˤayrˤ'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 asamas asamas asamas'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '8 8 08'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45 day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 brˤayrˤ 2010'],
+ ['LLL', '14 brˤayrˤ 2010 15:25'],
+ ['LLLL', 'asamas 14 brˤayrˤ 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 brˤayrˤ 2010'],
+ ['lll', '14 brˤayrˤ 2010 15:25'],
+ ['llll', 'asamas 14 brˤayrˤ 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1', '1');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2', '2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3', '3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4', '4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5', '5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6', '6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7', '7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8', '8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9', '9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10', '10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11', '11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12', '12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13', '13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14', '14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15', '15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16', '16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17', '17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18', '18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19', '19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20', '20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21', '21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22', '22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23', '23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24', '24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25', '25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26', '26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27', '27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28', '28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29', '29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30', '30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31', '31');
+});
+
+test('format month', function (assert) {
+ var expected = 'innayr innayr_brˤayrˤ brˤayrˤ_marˤsˤ marˤsˤ_ibrir ibrir_mayyw mayyw_ywnyw ywnyw_ywlywz ywlywz_ɣwšt ɣwšt_šwtanbir šwtanbir_ktˤwbrˤ ktˤwbrˤ_nwwanbir nwwanbir_dwjnbir dwjnbir'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'asamas asamas asamas_aynas aynas aynas_asinas asinas asinas_akras akras akras_akwas akwas akwas_asimwas asimwas asimwas_asiḍyas asiḍyas asiḍyas'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'imik', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'minuḍ', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'minuḍ', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 minuḍ', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 minuḍ', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'saɛa', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'saɛa', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 tassaɛin', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 tassaɛin', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 tassaɛin', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'ass', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'ass', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 ossan', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'ass', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 ossan', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 ossan', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'ayowr', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'ayowr', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'ayowr', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 iyyirn', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 iyyirn', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 iyyirn', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'ayowr', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 iyyirn', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'asgas', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 isgasn', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'asgas', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 isgasn', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'dadkh s yan imik', 'prefix');
+ assert.equal(moment(0).from(30000), 'yan imik', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'yan imik', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'dadkh s yan imik', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'dadkh s yan 5 ossan', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'asdkh g 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'asdkh g 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'asdkh g 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'aska g 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'asdkh g 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'assant g 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [g] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [g] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [g] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [g] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [g] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [g] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 31]).format('w ww wo'), '1 01 1', 'Dec 31 2011 should be week 1');
+ assert.equal(moment([2012, 0, 6]).format('w ww wo'), '1 01 1', 'Jan 6 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '2 02 2', 'Jan 7 2012 should be week 2');
+ assert.equal(moment([2012, 0, 13]).format('w ww wo'), '2 02 2', 'Jan 13 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '3 03 3', 'Jan 14 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('tzm');
+
+test('parse', function (assert) {
+ var tests = 'ⵉⵏⵏⴰⵢⵔ ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'ⴰⵙⴰⵎⴰⵙ, ⴱⵕⴰⵢⵕ 14 2010, 3:25:50 pm'],
+ ['ddd, hA', 'ⴰⵙⴰⵎⴰⵙ, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2 02 ⴱⵕⴰⵢⵕ ⴱⵕⴰⵢⵕ'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 ⴰⵙⴰⵎⴰⵙ ⴰⵙⴰⵎⴰⵙ ⴰⵙⴰⵎⴰⵙ'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '8 8 08'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45 day of the year'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 ⴱⵕⴰⵢⵕ 2010'],
+ ['LLL', '14 ⴱⵕⴰⵢⵕ 2010 15:25'],
+ ['LLLL', 'ⴰⵙⴰⵎⴰⵙ 14 ⴱⵕⴰⵢⵕ 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 ⴱⵕⴰⵢⵕ 2010'],
+ ['lll', '14 ⴱⵕⴰⵢⵕ 2010 15:25'],
+ ['llll', 'ⴰⵙⴰⵎⴰⵙ 14 ⴱⵕⴰⵢⵕ 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1', '1');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2', '2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3', '3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4', '4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5', '5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6', '6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7', '7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8', '8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9', '9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10', '10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11', '11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12', '12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13', '13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14', '14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15', '15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16', '16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17', '17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18', '18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19', '19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20', '20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21', '21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22', '22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23', '23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24', '24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25', '25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26', '26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27', '27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28', '28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29', '29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30', '30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31', '31');
+});
+
+test('format month', function (assert) {
+ var expected = 'ⵉⵏⵏⴰⵢⵔ ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'ⴰⵙⴰⵎⴰⵙ ⴰⵙⴰⵎⴰⵙ ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ ⴰⵢⵏⴰⵙ ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ ⴰⵙⵉⵏⴰⵙ ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ ⴰⴽⵔⴰⵙ ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ ⴰⴽⵡⴰⵙ ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ ⴰⵙⵉⵎⵡⴰⵙ ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ ⴰⵙⵉⴹⵢⴰⵙ ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'ⵉⵎⵉⴽ', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'ⵎⵉⵏⵓⴺ', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'ⵎⵉⵏⵓⴺ', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 ⵎⵉⵏⵓⴺ', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 ⵎⵉⵏⵓⴺ', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'ⵙⴰⵄⴰ', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'ⵙⴰⵄⴰ', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 ⵜⴰⵙⵙⴰⵄⵉⵏ', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 ⵜⴰⵙⵙⴰⵄⵉⵏ', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 ⵜⴰⵙⵙⴰⵄⵉⵏ', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'ⴰⵙⵙ', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'ⴰⵙⵙ', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 oⵙⵙⴰⵏ', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'ⴰⵙⵙ', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 oⵙⵙⴰⵏ', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 oⵙⵙⴰⵏ', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'ⴰⵢoⵓⵔ', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'ⴰⵢoⵓⵔ', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'ⴰⵢoⵓⵔ', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 ⵉⵢⵢⵉⵔⵏ', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 ⵉⵢⵢⵉⵔⵏ', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 ⵉⵢⵢⵉⵔⵏ', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'ⴰⵢoⵓⵔ', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 ⵉⵢⵢⵉⵔⵏ', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'ⴰⵙⴳⴰⵙ', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 ⵉⵙⴳⴰⵙⵏ', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'ⴰⵙⴳⴰⵙ', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 ⵉⵙⴳⴰⵙⵏ', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ ⵉⵎⵉⴽ', 'prefix');
+ assert.equal(moment(0).from(30000), 'ⵢⴰⵏ ⵉⵎⵉⴽ', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'ⵢⴰⵏ ⵉⵎⵉⴽ', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ ⵉⵎⵉⴽ', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ 5 oⵙⵙⴰⵏ', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'ⴰⵙⴷⵅ ⴴ 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'ⴰⵙⴷⵅ ⴴ 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'ⴰⵙⴷⵅ ⴴ 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'ⴰⵙⴽⴰ ⴴ 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'ⴰⵙⴷⵅ ⴴ 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'ⴰⵚⴰⵏⵜ ⴴ 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [ⴴ] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [ⴴ] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [ⴴ] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [ⴴ] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [ⴴ] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [ⴴ] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 31]).format('w ww wo'), '1 01 1', 'Dec 31 2011 should be week 1');
+ assert.equal(moment([2012, 0, 6]).format('w ww wo'), '1 01 1', 'Jan 6 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '2 02 2', 'Jan 7 2012 should be week 2');
+ assert.equal(moment([2012, 0, 13]).format('w ww wo'), '2 02 2', 'Jan 13 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '3 03 3', 'Jan 14 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('uk');
+
+test('parse', function (assert) {
+ var tests = 'січень січ_лютий лют_березень бер_квітень квіт_травень трав_червень черв_липень лип_серпень серп_вересень вер_жовтень жовт_листопад лист_грудень груд'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do MMMM YYYY, HH:mm:ss', 'неділя, 14-го лютого 2010, 15:25:50'],
+ ['ddd, h A', 'нд, 3 дня'],
+ ['M Mo MM MMMM MMM', '2 2-й 02 лютий лют'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14-го 14'],
+ ['d do dddd ddd dd', '0 0-й неділя нд нд'],
+ ['DDD DDDo DDDD', '45 45-й 045'],
+ ['w wo ww', '7 7-й 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'дня дня'],
+ ['DDDo [день року]', '45-й день року'],
+ ['LTS', '15:25:50'],
+ ['L', '14.02.2010'],
+ ['LL', '14 лютого 2010 р.'],
+ ['LLL', '14 лютого 2010 р., 15:25'],
+ ['LLLL', 'неділя, 14 лютого 2010 р., 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format meridiem', function (assert) {
+ assert.equal(moment([2012, 11, 28, 0, 0]).format('A'), 'ночі', 'night');
+ assert.equal(moment([2012, 11, 28, 3, 59]).format('A'), 'ночі', 'night');
+ assert.equal(moment([2012, 11, 28, 4, 0]).format('A'), 'ранку', 'morning');
+ assert.equal(moment([2012, 11, 28, 11, 59]).format('A'), 'ранку', 'morning');
+ assert.equal(moment([2012, 11, 28, 12, 0]).format('A'), 'дня', 'afternoon');
+ assert.equal(moment([2012, 11, 28, 16, 59]).format('A'), 'дня', 'afternoon');
+ assert.equal(moment([2012, 11, 28, 17, 0]).format('A'), 'вечора', 'evening');
+ assert.equal(moment([2012, 11, 28, 23, 59]).format('A'), 'вечора', 'evening');
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1-й', '1-й');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2-й', '2-й');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3-й', '3-й');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4-й', '4-й');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5-й', '5-й');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6-й', '6-й');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7-й', '7-й');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8-й', '8-й');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9-й', '9-й');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10-й', '10-й');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11-й', '11-й');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12-й', '12-й');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13-й', '13-й');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14-й', '14-й');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15-й', '15-й');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16-й', '16-й');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17-й', '17-й');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18-й', '18-й');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19-й', '19-й');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20-й', '20-й');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21-й', '21-й');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22-й', '22-й');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23-й', '23-й');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24-й', '24-й');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25-й', '25-й');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26-й', '26-й');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27-й', '27-й');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28-й', '28-й');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29-й', '29-й');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30-й', '30-й');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31-й', '31-й');
+});
+
+test('format month', function (assert) {
+ var expected = 'січень січ_лютий лют_березень бер_квітень квіт_травень трав_червень черв_липень лип_серпень серп_вересень вер_жовтень жовт_листопад лист_грудень груд'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format month case', function (assert) {
+ var months = {
+ 'nominative': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_'),
+ 'accusative': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_')
+ }, i;
+ for (i = 0; i < 12; i++) {
+ assert.equal(moment([2011, i, 1]).format('D MMMM'), '1 ' + months.accusative[i], '1 ' + months.accusative[i]);
+ assert.equal(moment([2011, i, 1]).format('MMMM'), months.nominative[i], '1 ' + months.nominative[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'неділя нд нд_понеділок пн пн_вівторок вт вт_середа ср ср_четвер чт чт_п’ятниця пт пт_субота сб сб'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'декілька секунд', '44 seconds = seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'хвилина', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'хвилина', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 хвилини', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 хвилини', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'годину', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'годину', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 години', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 годин', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 година', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'день', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'день', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 дні', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'день', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 днів', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 11}), true), '11 днів', '11 days = 11 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 21}), true), '21 день', '21 days = 21 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 днів', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'місяць', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'місяць', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'місяць', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 місяці', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 місяці', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 місяці', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'місяць', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 місяців', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'рік', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 роки', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'рік', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 років', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'за декілька секунд', 'prefix');
+ assert.equal(moment(0).from(30000), 'декілька секунд тому', 'suffix');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'за декілька секунд', 'in seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'за 5 днів', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Сьогодні о 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Сьогодні о 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Сьогодні о 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Завтра о 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 2}).calendar(), 'Сьогодні о 10:00', 'Now minus 2 hours');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Вчора о 12:00', 'yesterday at the same time');
+ // A special case for Ukrainian since 11 hours have different preposition
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Сьогодні об 11:00', 'same day at 11 o\'clock');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('[У] dddd [о' + (m.hours() === 11 ? 'б' : '') + '] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[У] dddd [о] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[У] dddd [о] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ function makeFormat(d) {
+ switch (d.day()) {
+ case 0:
+ case 3:
+ case 5:
+ case 6:
+ return '[Минулої] dddd [о' + (d.hours() === 11 ? 'б' : '') + '] LT';
+ case 1:
+ case 2:
+ case 4:
+ return '[Минулого] dddd [о' + (d.hours() === 11 ? 'б' : '') + '] LT';
+ }
+ }
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format(makeFormat(m)), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2011, 11, 26]).format('w ww wo'), '1 01 1-й', 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1-й', 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2-й', 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2-й', 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3-й', 'Jan 9 2012 should be week 3');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('uz');
+
+test('parse', function (assert) {
+ var tests = 'январ янв_феврал фев_март мар_апрел апр_май май_июн июн_июл июл_август авг_сентябр сен_октябр окт_ноябр ноя_декабр дек'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, Do-MMMM YYYY, h:mm:ss', 'Якшанба, 14-феврал 2010, 3:25:50'],
+ ['ddd, h:mm', 'Якш, 3:25'],
+ ['M Mo MM MMMM MMM', '2 2 02 феврал фев'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 Якшанба Якш Як'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '7 7 07'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[йилнинг] DDDo-[куни]', 'йилнинг 45-куни'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 феврал 2010'],
+ ['LLL', '14 феврал 2010 15:25'],
+ ['LLLL', '14 феврал 2010, Якшанба 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 фев 2010'],
+ ['lll', '14 фев 2010 15:25'],
+ ['llll', '14 фев 2010, Якш 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1', '1');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2', '2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3', '3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4', '4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5', '5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6', '6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7', '7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8', '8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9', '9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10', '10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11', '11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12', '12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13', '13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14', '14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15', '15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16', '16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17', '17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18', '18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19', '19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20', '20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21', '21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22', '22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23', '23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24', '24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25', '25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26', '26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27', '27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28', '28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29', '29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30', '30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31', '31');
+});
+
+test('format month', function (assert) {
+ var expected = 'январ янв_феврал фев_март мар_апрел апр_май май_июн июн_июл июл_август авг_сентябр сен_октябр окт_ноябр ноя_декабр дек'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Якшанба Якш Як_Душанба Душ Ду_Сешанба Сеш Се_Чоршанба Чор Чо_Пайшанба Пай Па_Жума Жум Жу_Шанба Шан Ша'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'фурсат', '44 секунд = фурсат');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'бир дакика', '45 секунд = бир дакика');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'бир дакика', '89 секунд = бир дакика');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 дакика', '90 секунд = 2 дакика');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 дакика', '44 дакика = 44 дакика');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'бир соат', '45 минут = бир соат');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'бир соат', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 соат', '90 минут = 2 соат');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 соат', '5 соат = 5 соат');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 соат', '21 соат = 21 соат');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'бир кун', '22 соат = бир кун');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'бир кун', '35 соат = бир кун');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 кун', '36 соат = 2 кун');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'бир кун', '1 кун = 1 кун');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 кун', '5 кун = 5 кун');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 кун', '25 кун = 25 кун');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'бир ой', '26 кун = бир ой');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'бир ой', '30 кун = бир ой');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'бир ой', '45 кун = бир ой');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 ой', '46 кун = 2 ой');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 ой', '75 кун = 2 ой');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 ой', '76 кун = 3 ой');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'бир ой', 'бир ой = бир ой');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 ой', '5 ой = 5 ой');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'бир йил', '345 кун = бир йил');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 йил', '548 кун = 2 йил');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'бир йил', '1 йил = бир йил');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 йил', '5 йил = 5 йил');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'Якин фурсат ичида', 'prefix');
+ assert.equal(moment(0).from(30000), 'Бир неча фурсат олдин', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'Бир неча фурсат олдин', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'Якин фурсат ичида', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'Якин 5 кун ичида', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Бугун соат 12:00 да', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Бугун соат 12:25 да', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Бугун соат 13:00 да', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Эртага 12:00 да', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Бугун соат 11:00 да', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Кеча соат 12:00 да', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [куни соат] LT [да]'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [куни соат] LT [да]'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [куни соат] LT [да]'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[Утган] dddd [куни соат] LT [да]'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[Утган] dddd [куни соат] LT [да]'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[Утган] dddd [куни соат] LT [да]'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '2 02 2', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '3 03 3', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '3 03 3', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('vi');
+
+test('parse', function (assert) {
+ var i,
+ tests = 'tháng 1,Th01_tháng 2,Th02_tháng 3,Th03_tháng 4,Th04_tháng 5,Th05_tháng 6,Th06_tháng 7,Th07_tháng 8,Th08_tháng 9,Th09_tháng 10,Th10_tháng 11,Th11_tháng 12,Th12'.split('_');
+
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + i);
+ }
+
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(',');
+ equalTest(tests[i][0], '[tháng] M', i);
+ equalTest(tests[i][1], '[Th]M', i);
+ equalTest(tests[i][0], '[tháng] MM', i);
+ equalTest(tests[i][1], '[Th]MM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), '[THÁNG] M', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), '[TH]M', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), '[THÁNG] MM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), '[TH]MM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'chủ nhật, tháng 2 14 2010, 3:25:50 ch'],
+ ['ddd, hA', 'CN, 3CH'],
+ ['M Mo MM MMMM MMM', '2 2 02 tháng 2 Th02'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14 14'],
+ ['d do dddd ddd dd', '0 0 chủ nhật CN CN'],
+ ['DDD DDDo DDDD', '45 45 045'],
+ ['w wo ww', '6 6 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'ch CH'],
+ ['[ngày thứ] DDDo [của năm]', 'ngày thứ 45 của năm'],
+ ['LTS', '15:25:50'],
+ ['L', '14/02/2010'],
+ ['LL', '14 tháng 2 năm 2010'],
+ ['LLL', '14 tháng 2 năm 2010 15:25'],
+ ['LLLL', 'chủ nhật, 14 tháng 2 năm 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 Th02 2010'],
+ ['lll', '14 Th02 2010 15:25'],
+ ['llll', 'CN, 14 Th02 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1', '1');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2', '2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3', '3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4', '4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5', '5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6', '6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7', '7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8', '8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9', '9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10', '10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11', '11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12', '12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13', '13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14', '14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15', '15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16', '16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17', '17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18', '18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19', '19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20', '20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21', '21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22', '22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23', '23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24', '24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25', '25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26', '26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27', '27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28', '28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29', '29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30', '30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31', '31');
+});
+
+test('format month', function (assert) {
+ var i,
+ expected = 'tháng 1,Th01_tháng 2,Th02_tháng 3,Th03_tháng 4,Th04_tháng 5,Th05_tháng 6,Th06_tháng 7,Th07_tháng 8,Th08_tháng 9,Th09_tháng 10,Th10_tháng 11,Th11_tháng 12,Th12'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM,MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var i,
+ expected = 'chủ nhật CN CN_thứ hai T2 T2_thứ ba T3 T3_thứ tư T4 T4_thứ năm T5 T5_thứ sáu T6 T6_thứ bảy T7 T7'.split('_');
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'vài giây', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'một phút', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'một phút', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 phút', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 phút', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'một giờ', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'một giờ', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 giờ', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 giờ', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 giờ', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'một ngày', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'một ngày', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 ngày', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'một ngày', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 ngày', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 ngày', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'một tháng', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'một tháng', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'một tháng', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 tháng', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 tháng', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 tháng', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'một tháng', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 tháng', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'một năm', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 năm', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'một năm', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 năm', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'vài giây tới', 'prefix');
+ assert.equal(moment(0).from(30000), 'vài giây trước', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'vài giây trước', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'vài giây tới', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), '5 ngày tới', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Hôm nay lúc 12:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Hôm nay lúc 12:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Hôm nay lúc 13:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Ngày mai lúc 12:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Hôm nay lúc 11:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Hôm qua lúc 12:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [tuần tới lúc] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [tuần tới lúc] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [tuần tới lúc] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [tuần rồi lúc] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [tuần rồi lúc] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [tuần rồi lúc] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('x-pseudo');
+
+test('parse', function (assert) {
+ var tests = 'J~áñúá~rý J~áñ_F~ébrú~árý ~Féb_~Márc~h ~Már_Áp~ríl ~Ápr_~Máý ~Máý_~Júñé~ ~Júñ_Júl~ý ~Júl_Áú~gúst~ ~Áúg_Sép~témb~ér ~Sép_Ó~ctób~ér ~Óct_Ñ~óvém~bér ~Ñóv_~Décé~mbér ~Déc'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'S~úñdá~ý, F~ébrú~árý 14th 2010, 3:25:50 pm'],
+ ['ddd, hA', 'S~úñ, 3PM'],
+ ['M Mo MM MMMM MMM', '2 2nd 02 F~ébrú~árý ~Féb'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14th 14'],
+ ['d do dddd ddd dd', '0 0th S~úñdá~ý S~úñ S~ú'],
+ ['DDD DDDo DDDD', '45 45th 045'],
+ ['w wo ww', '6 6th 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the 45th day of the year'],
+ ['LT', '15:25'],
+ ['L', '14/02/2010'],
+ ['LL', '14 F~ébrú~árý 2010'],
+ ['LLL', '14 F~ébrú~árý 2010 15:25'],
+ ['LLLL', 'S~úñdá~ý, 14 F~ébrú~árý 2010 15:25'],
+ ['l', '14/2/2010'],
+ ['ll', '14 ~Féb 2010'],
+ ['lll', '14 ~Féb 2010 15:25'],
+ ['llll', 'S~úñ, 14 ~Féb 2010 15:25']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), '1st', '1st');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), '2nd', '2nd');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), '3rd', '3rd');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), '4th', '4th');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), '5th', '5th');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), '6th', '6th');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), '7th', '7th');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), '8th', '8th');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), '9th', '9th');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), '10th', '10th');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), '11th', '11th');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), '12th', '12th');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), '13th', '13th');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), '14th', '14th');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), '15th', '15th');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), '16th', '16th');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), '17th', '17th');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), '18th', '18th');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), '19th', '19th');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), '20th', '20th');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), '21st', '21st');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), '22nd', '22nd');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), '23rd', '23rd');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), '24th', '24th');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), '25th', '25th');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), '26th', '26th');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), '27th', '27th');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), '28th', '28th');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), '29th', '29th');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), '30th', '30th');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), '31st', '31st');
+});
+
+test('format month', function (assert) {
+ var expected = 'J~áñúá~rý J~áñ_F~ébrú~árý ~Féb_~Márc~h ~Már_Áp~ríl ~Ápr_~Máý ~Máý_~Júñé~ ~Júñ_Júl~ý ~Júl_Áú~gúst~ ~Áúg_Sép~témb~ér ~Sép_Ó~ctób~ér ~Óct_Ñ~óvém~bér ~Ñóv_~Décé~mbér ~Déc'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'S~úñdá~ý S~úñ S~ú_Mó~ñdáý~ ~Móñ Mó~_Túé~sdáý~ ~Túé Tú_Wéd~ñésd~áý ~Wéd ~Wé_T~húrs~dáý ~Thú T~h_~Fríd~áý ~Frí Fr~_S~átúr~dáý ~Sát Sá'.split('_'), i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'á ~féw ~sécó~ñds', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'á ~míñ~úté', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'á ~míñ~úté', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 m~íñú~tés', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 m~íñú~tés', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'á~ñ hó~úr', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'á~ñ hó~úr', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 h~óúrs', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 h~óúrs', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 h~óúrs', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'á ~dáý', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'á ~dáý', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 d~áýs', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'á ~dáý', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 d~áýs', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 d~áýs', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'á ~móñ~th', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'á ~móñ~th', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'á ~móñ~th', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 m~óñt~hs', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 m~óñt~hs', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 m~óñt~hs', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'á ~móñ~th', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 m~óñt~hs', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'á ~ýéár', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 ý~éárs', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'á ~ýéár', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 ý~éárs', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'í~ñ á ~féw ~sécó~ñds', 'prefix');
+ assert.equal(moment(0).from(30000), 'á ~féw ~sécó~ñds á~gó', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'á ~féw ~sécó~ñds á~gó', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'í~ñ á ~féw ~sécó~ñds', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), 'í~ñ 5 d~áýs', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(2).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'T~ódá~ý át 02:00', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'T~ódá~ý át 02:25', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'T~ódá~ý át 03:00', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'T~ómó~rró~w át 02:00', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'T~ódá~ý át 01:00', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Ý~ést~érdá~ý át 02:00', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [át] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [át] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [át] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[L~ást] dddd [át] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[L~ást] dddd [át] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[L~ást] dddd [át] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52nd', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 1st', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1st', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2nd', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 2nd', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('yo');
+
+test('parse', function (assert) {
+ var tests = 'Sẹ́rẹ́ Sẹ́r_Èrèlè Èrl_Ẹrẹ̀nà Ẹrn_Ìgbé Ìgb_Èbibi Èbi_Òkùdu Òkù_Agẹmo Agẹ_Ògún Ògú_Owewe Owe_Ọ̀wàrà Ọ̀wà_Bélú Bél_Ọ̀pẹ̀̀ Ọ̀pẹ̀̀'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, h:mm:ss a', 'Àìkú, Èrèlè ọjọ́ 14 2010, 3:25:50 pm'],
+ ['ddd, hA', 'Àìk, 3PM'],
+ ['M Mo MM MMMM MMM', '2 ọjọ́ 2 02 Èrèlè Èrl'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 ọjọ́ 14 14'],
+ ['d do dddd ddd dd', '0 ọjọ́ 0 Àìkú Àìk Àì'],
+ ['DDD DDDo DDDD', '45 ọjọ́ 45 045'],
+ ['w wo ww', '6 ọjọ́ 6 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', 'pm PM'],
+ ['[the] DDDo [day of the year]', 'the ọjọ́ 45 day of the year'],
+ ['LTS', '3:25:50 PM'],
+ ['L', '14/02/2010'],
+ ['LL', '14 Èrèlè 2010'],
+ ['LLL', '14 Èrèlè 2010 3:25 PM'],
+ ['LLLL', 'Àìkú, 14 Èrèlè 2010 3:25 PM'],
+ ['l', '14/2/2010'],
+ ['ll', '14 Èrl 2010'],
+ ['lll', '14 Èrl 2010 3:25 PM'],
+ ['llll', 'Àìk, 14 Èrl 2010 3:25 PM']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format ordinal', function (assert) {
+ assert.equal(moment([2011, 0, 1]).format('DDDo'), 'ọjọ́ 1', 'ọjọ́ 1');
+ assert.equal(moment([2011, 0, 2]).format('DDDo'), 'ọjọ́ 2', 'ọjọ́ 2');
+ assert.equal(moment([2011, 0, 3]).format('DDDo'), 'ọjọ́ 3', 'ọjọ́ 3');
+ assert.equal(moment([2011, 0, 4]).format('DDDo'), 'ọjọ́ 4', 'ọjọ́ 4');
+ assert.equal(moment([2011, 0, 5]).format('DDDo'), 'ọjọ́ 5', 'ọjọ́ 5');
+ assert.equal(moment([2011, 0, 6]).format('DDDo'), 'ọjọ́ 6', 'ọjọ́ 6');
+ assert.equal(moment([2011, 0, 7]).format('DDDo'), 'ọjọ́ 7', 'ọjọ́ 7');
+ assert.equal(moment([2011, 0, 8]).format('DDDo'), 'ọjọ́ 8', 'ọjọ́ 8');
+ assert.equal(moment([2011, 0, 9]).format('DDDo'), 'ọjọ́ 9', 'ọjọ́ 9');
+ assert.equal(moment([2011, 0, 10]).format('DDDo'), 'ọjọ́ 10', 'ọjọ́ 10');
+
+ assert.equal(moment([2011, 0, 11]).format('DDDo'), 'ọjọ́ 11', 'ọjọ́ 11');
+ assert.equal(moment([2011, 0, 12]).format('DDDo'), 'ọjọ́ 12', 'ọjọ́ 12');
+ assert.equal(moment([2011, 0, 13]).format('DDDo'), 'ọjọ́ 13', 'ọjọ́ 13');
+ assert.equal(moment([2011, 0, 14]).format('DDDo'), 'ọjọ́ 14', 'ọjọ́ 14');
+ assert.equal(moment([2011, 0, 15]).format('DDDo'), 'ọjọ́ 15', 'ọjọ́ 15');
+ assert.equal(moment([2011, 0, 16]).format('DDDo'), 'ọjọ́ 16', 'ọjọ́ 16');
+ assert.equal(moment([2011, 0, 17]).format('DDDo'), 'ọjọ́ 17', 'ọjọ́ 17');
+ assert.equal(moment([2011, 0, 18]).format('DDDo'), 'ọjọ́ 18', 'ọjọ́ 18');
+ assert.equal(moment([2011, 0, 19]).format('DDDo'), 'ọjọ́ 19', 'ọjọ́ 19');
+ assert.equal(moment([2011, 0, 20]).format('DDDo'), 'ọjọ́ 20', 'ọjọ́ 20');
+
+ assert.equal(moment([2011, 0, 21]).format('DDDo'), 'ọjọ́ 21', 'ọjọ́ 21');
+ assert.equal(moment([2011, 0, 22]).format('DDDo'), 'ọjọ́ 22', 'ọjọ́ 22');
+ assert.equal(moment([2011, 0, 23]).format('DDDo'), 'ọjọ́ 23', 'ọjọ́ 23');
+ assert.equal(moment([2011, 0, 24]).format('DDDo'), 'ọjọ́ 24', 'ọjọ́ 24');
+ assert.equal(moment([2011, 0, 25]).format('DDDo'), 'ọjọ́ 25', 'ọjọ́ 25');
+ assert.equal(moment([2011, 0, 26]).format('DDDo'), 'ọjọ́ 26', 'ọjọ́ 26');
+ assert.equal(moment([2011, 0, 27]).format('DDDo'), 'ọjọ́ 27', 'ọjọ́ 27');
+ assert.equal(moment([2011, 0, 28]).format('DDDo'), 'ọjọ́ 28', 'ọjọ́ 28');
+ assert.equal(moment([2011, 0, 29]).format('DDDo'), 'ọjọ́ 29', 'ọjọ́ 29');
+ assert.equal(moment([2011, 0, 30]).format('DDDo'), 'ọjọ́ 30', 'ọjọ́ 30');
+
+ assert.equal(moment([2011, 0, 31]).format('DDDo'), 'ọjọ́ 31', 'ọjọ́ 31');
+});
+
+test('format month', function (assert) {
+ var expected = 'Sẹ́rẹ́ Sẹ́r_Èrèlè Èrl_Ẹrẹ̀nà Ẹrn_Ìgbé Ìgb_Èbibi Èbi_Òkùdu Òkù_Agẹmo Agẹ_Ògún Ògú_Owewe Owe_Ọ̀wàrà Ọ̀wà_Bélú Bél_Ọ̀pẹ̀̀ Ọ̀pẹ̀̀'.split('_'),
+ i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = 'Àìkú Àìk Àì_Ajé Ajé Aj_Ìsẹ́gun Ìsẹ́ Ìs_Ọjọ́rú Ọjr Ọr_Ọjọ́bọ Ọjb Ọb_Ẹtì Ẹtì Ẹt_Àbámẹ́ta Àbá Àb'.split('_'),
+ i;
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), 'ìsẹjú aayá die', '44 seconds = ìsẹjú aayá die');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), 'ìsẹjú kan', '45 seconds = ìsẹjú kan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), 'ìsẹjú kan', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), 'ìsẹjú 2', '90 seconds = ìsẹjú 2');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), 'ìsẹjú 44', 'ìsẹjú 44 = ìsẹjú 44');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), 'wákati kan', 'ìsẹjú 45 = wákati kan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), 'wákati kan', 'ìsẹjú 89 = wákati kan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), 'wákati 2', 'ìsẹjú 90 = wákati 2');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), 'wákati 5', 'wákati 5 = wákati 5');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), 'wákati 21', 'wákati 21 = wákati 21');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), 'ọjọ́ kan', '22 wákati = ọjọ́ kan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), 'ọjọ́ kan', '35 wákati = ọjọ́ kan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), 'ọjọ́ 2', 'wákati 36 = ọjọ́ 2');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), 'ọjọ́ kan', '1 = ọjọ́ kan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), 'ọjọ́ 5', 'ọjọ́ 5 = ọjọ́ 5');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), 'ọjọ́ 25', 'ọjọ́ 25 = ọjọ́ 25');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), 'osù kan', 'ọjọ́ 26 = osù kan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), 'osù kan', 'ọjọ́ 30 = osù kan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), 'osù kan', 'ọjọ́ 43 = osù kan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), 'osù 2', 'ọjọ́ 46 = osù 2');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), 'osù 2', 'ọjọ́ 75 = osù 2');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), 'osù 3', 'ọjọ́ 76 = osù 3');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), 'osù kan', 'osù 1 = osù kan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), 'osù 5', 'osù 5 = osù 5');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), 'ọdún kan', 'ọjọ 345 = ọdún kan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), 'ọdún 2', 'ọjọ 548 = ọdún 2');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), 'ọdún kan', 'ọdún 1 = ọdún kan');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), 'ọdún 5', 'ọdún 5 = ọdún 5');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), 'ní ìsẹjú aayá die', 'prefix');
+ assert.equal(moment(0).from(30000), 'ìsẹjú aayá die kọjá', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), 'ìsẹjú aayá die kọjá', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), 'ní ìsẹjú aayá die', 'ní ìsẹjú aayá die');
+ assert.equal(moment().add({d: 5}).fromNow(), 'ní ọjọ́ 5', 'ní ọjọ́ 5');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Ònì ni 12:00 PM', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Ònì ni 12:25 PM', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Ònì ni 1:00 PM', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Ọ̀la ni 12:00 PM', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Ònì ni 11:00 AM', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Àna ni 12:00 PM', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('dddd [Ọsẹ̀ tón\'bọ] [ni] LT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [Ọsẹ̀ tón\'bọ] [ni] LT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [Ọsẹ̀ tón\'bọ] [ni] LT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('dddd [Ọsẹ̀ tólọ́] [ni] LT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('dddd [Ọsẹ̀ tólọ́] [ni] LT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('dddd [Ọsẹ̀ tólọ́] [ni] LT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('weeks year starting sunday format', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 ọjọ́ 52', 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).format('w ww wo'), '1 01 ọjọ́ 1', 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 ọjọ́ 1', 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 ọjọ́ 2', 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '2 02 ọjọ́ 2', 'Jan 15 2012 should be week 2');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('zh-cn');
+
+test('parse', function (assert) {
+ var tests = '一月 1月_二月 2月_三月 3月_四月 4月_五月 5月_六月 6月_七月 7月_八月 8月_九月 9月_十月 10月_十一月 11月_十二月 12月'.split('_'), i;
+
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, a h:mm:ss', '星期日, 二月 14日 2010, 下午 3:25:50'],
+ ['ddd, Ah', '周日, 下午3'],
+ ['M Mo MM MMMM MMM', '2 2月 02 二月 2月'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14日 14'],
+ ['d do dddd ddd dd', '0 0日 星期日 周日 日'],
+ ['DDD DDDo DDDD', '45 45日 045'],
+ ['w wo ww', '6 6周 06'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', '下午 下午'],
+ ['[这年的第] DDDo', '这年的第 45日'],
+ ['LTS', '下午3点25分50秒'],
+ ['L', '2010-02-14'],
+ ['LL', '2010年2月14日'],
+ ['LLL', '2010年2月14日下午3点25分'],
+ ['LLLL', '2010年2月14日星期日下午3点25分'],
+ ['l', '2010-02-14'],
+ ['ll', '2010年2月14日'],
+ ['lll', '2010年2月14日下午3点25分'],
+ ['llll', '2010年2月14日星期日下午3点25分']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format month', function (assert) {
+ var expected = '一月 1月_二月 2月_三月 3月_四月 4月_五月 5月_六月 6月_七月 7月_八月 8月_九月 9月_十月 10月_十一月 11月_十二月 12月'.split('_'), i;
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = '星期日 周日 日_星期一 周一 一_星期二 周二 二_星期三 周三 三_星期四 周四 四_星期五 周五 五_星期六 周六 六'.split('_'), i;
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), '几秒', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), '1 分钟', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), '1 分钟', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 分钟', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 分钟', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), '1 小时', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), '1 小时', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 小时', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 小时', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 小时', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), '1 天', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), '1 天', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 天', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), '1 天', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 天', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 天', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), '1 个月', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), '1 个月', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), '1 个月', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 个月', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 个月', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 个月', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), '1 个月', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 个月', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), '1 年', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 年', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), '1 年', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 年', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), '几秒内', 'prefix');
+ assert.equal(moment(0).from(30000), '几秒前', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), '几秒前', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), '几秒内', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), '5 天内', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), '今天中午12点整', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), '今天中午12点25分', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), '今天下午1点整', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), '明天中午12点整', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), '今天上午11点整', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), '昨天中午12点整', 'yesterday at the same time');
+});
+
+test('calendar current week', function (assert) {
+ var i, m,
+ today = moment().startOf('day');
+
+ for (i = 0; i < 7; i++) {
+ m = moment().startOf('week').add({d: i});
+ if (Math.abs(m.diff(today, 'days')) <= 1) {
+ continue; // skip today, yesterday, tomorrow
+ }
+ assert.equal(m.calendar(), m.format('[本]ddd凌晨12点整'), 'Monday + ' + i + ' days current time');
+ }
+});
+
+test('calendar next week', function (assert) {
+ var i, m,
+ today = moment().startOf('day');
+
+ for (i = 7; i < 14; i++) {
+ m = moment().startOf('week').add({d: i});
+ if (Math.abs(m.diff(today, 'days')) >= 7) {
+ continue;
+ }
+ if (Math.abs(m.diff(today, 'days')) <= 1) {
+ continue; // skip today, yesterday, tomorrow
+ }
+ assert.equal(m.calendar(), m.format('[下]ddd凌晨12点整'), 'Today + ' + i + ' days beginning of day');
+ }
+ assert.equal(42, 42, 'at least one assert');
+});
+
+test('calendar last week', function (assert) {
+ var i, m,
+ today = moment().startOf('day');
+
+ for (i = 1; i < 8; i++) {
+ m = moment().startOf('week').subtract({d: i});
+ if ((Math.abs(m.diff(today, 'days')) >= 7) || (Math.abs(m.diff(today, 'days')) <= 1)) {
+ continue;
+ }
+ assert.equal(m.calendar(), m.format('[上]ddd凌晨12点整'), 'Monday - ' + i + ' days next week');
+ }
+ assert.equal(42, 42, 'at least one assert');
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('LL'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('LL'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('LL'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('LL'), 'in 2 weeks');
+});
+
+test('meridiem', function (assert) {
+ assert.equal(moment([2011, 2, 23, 0, 0]).format('A'), '凌晨', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 6, 0]).format('A'), '早上', 'morning');
+ assert.equal(moment([2011, 2, 23, 9, 0]).format('A'), '上午', 'before noon');
+ assert.equal(moment([2011, 2, 23, 12, 0]).format('A'), '中午', 'noon');
+ assert.equal(moment([2011, 2, 23, 13, 0]).format('A'), '下午', 'afternoon');
+ assert.equal(moment([2011, 2, 23, 18, 0]).format('A'), '晚上', 'night');
+});
+
+test('weeks year starting sunday format', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '52 52 52周', 'Jan 1 2012 应该是第52周');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '1 01 1周', 'Jan 7 2012 应该是第 1周');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '2 02 2周', 'Jan 14 2012 应该是第 2周');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('zh-hk');
+
+test('parse', function (assert) {
+ var tests = '一月 1月_二月 2月_三月 3月_四月 4月_五月 5月_六月 6月_七月 7月_八月 8月_九月 9月_十月 10月_十一月 11月_十二月 12月'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, a h:mm:ss', '星期日, 二月 14日 2010, 下午 3:25:50'],
+ ['ddd, Ah', '週日, 下午3'],
+ ['M Mo MM MMMM MMM', '2 2月 02 二月 2月'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14日 14'],
+ ['d do dddd ddd dd', '0 0日 星期日 週日 日'],
+ ['DDD DDDo DDDD', '45 45日 045'],
+ ['w wo ww', '8 8週 08'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', '下午 下午'],
+ ['[這年的第] DDDo', '這年的第 45日'],
+ ['LTS', '下午3點25分50秒'],
+ ['L', '2010年2月14日'],
+ ['LL', '2010年2月14日'],
+ ['LLL', '2010年2月14日下午3點25分'],
+ ['LLLL', '2010年2月14日星期日下午3點25分'],
+ ['l', '2010年2月14日'],
+ ['ll', '2010年2月14日'],
+ ['lll', '2010年2月14日下午3點25分'],
+ ['llll', '2010年2月14日星期日下午3點25分']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format month', function (assert) {
+ var expected = '一月 1月_二月 2月_三月 3月_四月 4月_五月 5月_六月 6月_七月 7月_八月 8月_九月 9月_十月 10月_十一月 11月_十二月 12月'.split('_'), i;
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = '星期日 週日 日_星期一 週一 一_星期二 週二 二_星期三 週三 三_星期四 週四 四_星期五 週五 五_星期六 週六 六'.split('_'), i;
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), '幾秒', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), '1 分鐘', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), '1 分鐘', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 分鐘', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 分鐘', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), '1 小時', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), '1 小時', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 小時', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 小時', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 小時', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), '1 天', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), '1 天', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 天', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), '1 天', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 天', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 天', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), '1 個月', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), '1 個月', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), '1 個月', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 個月', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 個月', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 個月', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), '1 個月', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 個月', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), '1 年', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 年', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), '1 年', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 年', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), '幾秒內', 'prefix');
+ assert.equal(moment(0).from(30000), '幾秒前', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), '幾秒前', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), '幾秒內', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), '5 天內', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), '今天中午12點00分', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), '今天中午12點25分', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), '今天下午1點00分', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), '明天中午12點00分', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), '今天上午11點00分', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), '昨天中午12點00分', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('[下]ddddLT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[下]ddddLT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[下]ddddLT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[上]ddddLT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[上]ddddLT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[上]ddddLT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('meridiem', function (assert) {
+ assert.equal(moment([2011, 2, 23, 0, 0]).format('a'), '凌晨', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 6, 0]).format('a'), '早上', 'morning');
+ assert.equal(moment([2011, 2, 23, 9, 0]).format('a'), '上午', 'before noon');
+ assert.equal(moment([2011, 2, 23, 12, 0]).format('a'), '中午', 'noon');
+ assert.equal(moment([2011, 2, 23, 13, 0]).format('a'), '下午', 'after noon');
+ assert.equal(moment([2011, 2, 23, 18, 0]).format('a'), '晚上', 'night');
+
+ assert.equal(moment([2011, 2, 23, 0, 0]).format('A'), '凌晨', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 6, 0]).format('A'), '早上', 'morning');
+ assert.equal(moment([2011, 2, 23, 9, 0]).format('A'), '上午', 'before noon');
+ assert.equal(moment([2011, 2, 23, 12, 0]).format('A'), '中午', 'noon');
+ assert.equal(moment([2011, 2, 23, 13, 0]).format('A'), '下午', 'afternoon');
+ assert.equal(moment([2011, 2, 23, 18, 0]).format('A'), '晚上', 'night');
+});
+
+test('weeks year starting sunday format', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1週', 'Jan 1 2012 應該是第 1週');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '1 01 1週', 'Jan 7 2012 應該是第 1週');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2週', 'Jan 8 2012 應該是第 2週');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '2 02 2週', 'Jan 14 2012 應該是第 2週');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '3 03 3週', 'Jan 15 2012 應該是第 3週');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+
+
+function localeModule (name, lifecycle) {
+ QUnit.module('locale:' + name, {
+ setup : function () {
+ moment.locale(name);
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ moment.locale('en');
+ teardownDeprecationHandler(test, moment, 'locale');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+ defineCommonLocaleTests(name, -1, -1);
+}
+
+localeModule('zh-tw');
+
+test('parse', function (assert) {
+ var tests = '一月 1月_二月 2月_三月 3月_四月 4月_五月 5月_六月 6月_七月 7月_八月 8月_九月 9月_十月 10月_十一月 11月_十二月 12月'.split('_'), i;
+ function equalTest(input, mmm, i) {
+ assert.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1));
+ }
+ for (i = 0; i < 12; i++) {
+ tests[i] = tests[i].split(' ');
+ equalTest(tests[i][0], 'MMM', i);
+ equalTest(tests[i][1], 'MMM', i);
+ equalTest(tests[i][0], 'MMMM', i);
+ equalTest(tests[i][1], 'MMMM', i);
+ equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i);
+ equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i);
+ equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i);
+ }
+});
+
+test('format', function (assert) {
+ var a = [
+ ['dddd, MMMM Do YYYY, a h:mm:ss', '星期日, 二月 14日 2010, 下午 3:25:50'],
+ ['ddd, Ah', '週日, 下午3'],
+ ['M Mo MM MMMM MMM', '2 2月 02 二月 2月'],
+ ['YYYY YY', '2010 10'],
+ ['D Do DD', '14 14日 14'],
+ ['d do dddd ddd dd', '0 0日 星期日 週日 日'],
+ ['DDD DDDo DDDD', '45 45日 045'],
+ ['w wo ww', '8 8週 08'],
+ ['h hh', '3 03'],
+ ['H HH', '15 15'],
+ ['m mm', '25 25'],
+ ['s ss', '50 50'],
+ ['a A', '下午 下午'],
+ ['[這年的第] DDDo', '這年的第 45日'],
+ ['LTS', '下午3點25分50秒'],
+ ['L', '2010年2月14日'],
+ ['LL', '2010年2月14日'],
+ ['LLL', '2010年2月14日下午3點25分'],
+ ['LLLL', '2010年2月14日星期日下午3點25分'],
+ ['l', '2010年2月14日'],
+ ['ll', '2010年2月14日'],
+ ['lll', '2010年2月14日下午3點25分'],
+ ['llll', '2010年2月14日星期日下午3點25分']
+ ],
+ b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)),
+ i;
+
+ for (i = 0; i < a.length; i++) {
+ assert.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('format month', function (assert) {
+ var expected = '一月 1月_二月 2月_三月 3月_四月 4月_五月 5月_六月 6月_七月 7月_八月 8月_九月 9月_十月 10月_十一月 11月_十二月 12月'.split('_'), i;
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]);
+ }
+});
+
+test('format week', function (assert) {
+ var expected = '星期日 週日 日_星期一 週一 一_星期二 週二 二_星期三 週三 三_星期四 週四 四_星期五 週五 五_星期六 週六 六'.split('_'), i;
+
+ for (i = 0; i < expected.length; i++) {
+ assert.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]);
+ }
+});
+
+test('from', function (assert) {
+ var start = moment([2007, 1, 28]);
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), '幾秒', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), '1 分鐘', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), '1 分鐘', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '2 分鐘', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), '44 分鐘', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), '1 小時', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), '1 小時', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), '2 小時', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), '5 小時', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), '21 小時', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), '1 天', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), '1 天', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), '2 天', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), '1 天', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), '5 天', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), '25 天', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), '1 個月', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), '1 個月', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43}), true), '1 個月', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), '2 個月', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), '2 個月', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), '3 個月', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), '1 個月', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), '5 個月', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), '1 年', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), '2 年', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), '1 年', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), '5 年', '5 years = 5 years');
+});
+
+test('suffix', function (assert) {
+ assert.equal(moment(30000).from(0), '幾秒內', 'prefix');
+ assert.equal(moment(0).from(30000), '幾秒前', 'suffix');
+});
+
+test('now from now', function (assert) {
+ assert.equal(moment().fromNow(), '幾秒前', 'now from now should display as in the past');
+});
+
+test('fromNow', function (assert) {
+ assert.equal(moment().add({s: 30}).fromNow(), '幾秒內', 'in a few seconds');
+ assert.equal(moment().add({d: 5}).fromNow(), '5 天內', 'in 5 days');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), '今天中午12點00分', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), '今天中午12點25分', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), '今天下午1點00分', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), '明天中午12點00分', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), '今天上午11點00分', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), '昨天中午12點00分', 'yesterday at the same time');
+});
+
+test('calendar next week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().add({d: i});
+ assert.equal(m.calendar(), m.format('[下]ddddLT'), 'Today + ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[下]ddddLT'), 'Today + ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[下]ddddLT'), 'Today + ' + i + ' days end of day');
+ }
+});
+
+test('calendar last week', function (assert) {
+ var i, m;
+ for (i = 2; i < 7; i++) {
+ m = moment().subtract({d: i});
+ assert.equal(m.calendar(), m.format('[上]ddddLT'), 'Today - ' + i + ' days current time');
+ m.hours(0).minutes(0).seconds(0).milliseconds(0);
+ assert.equal(m.calendar(), m.format('[上]ddddLT'), 'Today - ' + i + ' days beginning of day');
+ m.hours(23).minutes(59).seconds(59).milliseconds(999);
+ assert.equal(m.calendar(), m.format('[上]ddddLT'), 'Today - ' + i + ' days end of day');
+ }
+});
+
+test('calendar all else', function (assert) {
+ var weeksAgo = moment().subtract({w: 1}),
+ weeksFromNow = moment().add({w: 1});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '1 week ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 1 week');
+
+ weeksAgo = moment().subtract({w: 2});
+ weeksFromNow = moment().add({w: 2});
+
+ assert.equal(weeksAgo.calendar(), weeksAgo.format('L'), '2 weeks ago');
+ assert.equal(weeksFromNow.calendar(), weeksFromNow.format('L'), 'in 2 weeks');
+});
+
+test('meridiem', function (assert) {
+ assert.equal(moment([2011, 2, 23, 0, 0]).format('a'), '凌晨', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 6, 0]).format('a'), '早上', 'morning');
+ assert.equal(moment([2011, 2, 23, 9, 0]).format('a'), '上午', 'before noon');
+ assert.equal(moment([2011, 2, 23, 12, 0]).format('a'), '中午', 'noon');
+ assert.equal(moment([2011, 2, 23, 13, 0]).format('a'), '下午', 'after noon');
+ assert.equal(moment([2011, 2, 23, 18, 0]).format('a'), '晚上', 'night');
+
+ assert.equal(moment([2011, 2, 23, 0, 0]).format('A'), '凌晨', 'before dawn');
+ assert.equal(moment([2011, 2, 23, 6, 0]).format('A'), '早上', 'morning');
+ assert.equal(moment([2011, 2, 23, 9, 0]).format('A'), '上午', 'before noon');
+ assert.equal(moment([2011, 2, 23, 12, 0]).format('A'), '中午', 'noon');
+ assert.equal(moment([2011, 2, 23, 13, 0]).format('A'), '下午', 'afternoon');
+ assert.equal(moment([2011, 2, 23, 18, 0]).format('A'), '晚上', 'night');
+});
+
+test('weeks year starting sunday format', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('w ww wo'), '1 01 1週', 'Jan 1 2012 應該是第 1週');
+ assert.equal(moment([2012, 0, 7]).format('w ww wo'), '1 01 1週', 'Jan 7 2012 應該是第 1週');
+ assert.equal(moment([2012, 0, 8]).format('w ww wo'), '2 02 2週', 'Jan 8 2012 應該是第 2週');
+ assert.equal(moment([2012, 0, 14]).format('w ww wo'), '2 02 2週', 'Jan 14 2012 應該是第 2週');
+ assert.equal(moment([2012, 0, 15]).format('w ww wo'), '3 03 3週', 'Jan 15 2012 應該是第 3週');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('add and subtract');
+
+test('add short reverse args', function (assert) {
+ var a = moment(), b, c, d;
+ a.year(2011);
+ a.month(9);
+ a.date(12);
+ a.hours(6);
+ a.minutes(7);
+ a.seconds(8);
+ a.milliseconds(500);
+
+ assert.equal(a.add({ms: 50}).milliseconds(), 550, 'Add milliseconds');
+ assert.equal(a.add({s: 1}).seconds(), 9, 'Add seconds');
+ assert.equal(a.add({m: 1}).minutes(), 8, 'Add minutes');
+ assert.equal(a.add({h: 1}).hours(), 7, 'Add hours');
+ assert.equal(a.add({d: 1}).date(), 13, 'Add date');
+ assert.equal(a.add({w: 1}).date(), 20, 'Add week');
+ assert.equal(a.add({M: 1}).month(), 10, 'Add month');
+ assert.equal(a.add({y: 1}).year(), 2012, 'Add year');
+ assert.equal(a.add({Q: 1}).month(), 1, 'Add quarter');
+
+ b = moment([2010, 0, 31]).add({M: 1});
+ c = moment([2010, 1, 28]).subtract({M: 1});
+ d = moment([2010, 1, 28]).subtract({Q: 1});
+
+ assert.equal(b.month(), 1, 'add month, jan 31st to feb 28th');
+ assert.equal(b.date(), 28, 'add month, jan 31st to feb 28th');
+ assert.equal(c.month(), 0, 'subtract month, feb 28th to jan 28th');
+ assert.equal(c.date(), 28, 'subtract month, feb 28th to jan 28th');
+ assert.equal(d.month(), 10, 'subtract quarter, feb 28th 2010 to nov 28th 2009');
+ assert.equal(d.date(), 28, 'subtract quarter, feb 28th 2010 to nov 28th 2009');
+ assert.equal(d.year(), 2009, 'subtract quarter, feb 28th 2010 to nov 28th 2009');
+});
+
+test('add long reverse args', function (assert) {
+ var a = moment();
+ a.year(2011);
+ a.month(9);
+ a.date(12);
+ a.hours(6);
+ a.minutes(7);
+ a.seconds(8);
+ a.milliseconds(500);
+
+ assert.equal(a.add({milliseconds: 50}).milliseconds(), 550, 'Add milliseconds');
+ assert.equal(a.add({seconds: 1}).seconds(), 9, 'Add seconds');
+ assert.equal(a.add({minutes: 1}).minutes(), 8, 'Add minutes');
+ assert.equal(a.add({hours: 1}).hours(), 7, 'Add hours');
+ assert.equal(a.add({days: 1}).date(), 13, 'Add date');
+ assert.equal(a.add({weeks: 1}).date(), 20, 'Add week');
+ assert.equal(a.add({months: 1}).month(), 10, 'Add month');
+ assert.equal(a.add({years: 1}).year(), 2012, 'Add year');
+ assert.equal(a.add({quarters: 1}).month(), 1, 'Add quarter');
+});
+
+test('add long singular reverse args', function (assert) {
+ var a = moment();
+ a.year(2011);
+ a.month(9);
+ a.date(12);
+ a.hours(6);
+ a.minutes(7);
+ a.seconds(8);
+ a.milliseconds(500);
+
+ assert.equal(a.add({millisecond: 50}).milliseconds(), 550, 'Add milliseconds');
+ assert.equal(a.add({second: 1}).seconds(), 9, 'Add seconds');
+ assert.equal(a.add({minute: 1}).minutes(), 8, 'Add minutes');
+ assert.equal(a.add({hour: 1}).hours(), 7, 'Add hours');
+ assert.equal(a.add({day: 1}).date(), 13, 'Add date');
+ assert.equal(a.add({week: 1}).date(), 20, 'Add week');
+ assert.equal(a.add({month: 1}).month(), 10, 'Add month');
+ assert.equal(a.add({year: 1}).year(), 2012, 'Add year');
+ assert.equal(a.add({quarter: 1}).month(), 1, 'Add quarter');
+});
+
+test('add string long reverse args', function (assert) {
+ var a = moment(), b;
+
+ test.expectedDeprecations('moment().add(period, number)');
+
+ a.year(2011);
+ a.month(9);
+ a.date(12);
+ a.hours(6);
+ a.minutes(7);
+ a.seconds(8);
+ a.milliseconds(500);
+
+ b = a.clone();
+
+ assert.equal(a.add('millisecond', 50).milliseconds(), 550, 'Add milliseconds');
+ assert.equal(a.add('second', 1).seconds(), 9, 'Add seconds');
+ assert.equal(a.add('minute', 1).minutes(), 8, 'Add minutes');
+ assert.equal(a.add('hour', 1).hours(), 7, 'Add hours');
+ assert.equal(a.add('day', 1).date(), 13, 'Add date');
+ assert.equal(a.add('week', 1).date(), 20, 'Add week');
+ assert.equal(a.add('month', 1).month(), 10, 'Add month');
+ assert.equal(a.add('year', 1).year(), 2012, 'Add year');
+ assert.equal(b.add('day', '01').date(), 13, 'Add date');
+ assert.equal(a.add('quarter', 1).month(), 1, 'Add quarter');
+});
+
+test('add string long singular reverse args', function (assert) {
+ var a = moment(), b;
+
+ test.expectedDeprecations('moment().add(period, number)');
+
+ a.year(2011);
+ a.month(9);
+ a.date(12);
+ a.hours(6);
+ a.minutes(7);
+ a.seconds(8);
+ a.milliseconds(500);
+
+ b = a.clone();
+
+ assert.equal(a.add('milliseconds', 50).milliseconds(), 550, 'Add milliseconds');
+ assert.equal(a.add('seconds', 1).seconds(), 9, 'Add seconds');
+ assert.equal(a.add('minutes', 1).minutes(), 8, 'Add minutes');
+ assert.equal(a.add('hours', 1).hours(), 7, 'Add hours');
+ assert.equal(a.add('days', 1).date(), 13, 'Add date');
+ assert.equal(a.add('weeks', 1).date(), 20, 'Add week');
+ assert.equal(a.add('months', 1).month(), 10, 'Add month');
+ assert.equal(a.add('years', 1).year(), 2012, 'Add year');
+ assert.equal(b.add('days', '01').date(), 13, 'Add date');
+ assert.equal(a.add('quarters', 1).month(), 1, 'Add quarter');
+});
+
+test('add string short reverse args', function (assert) {
+ var a = moment();
+ test.expectedDeprecations('moment().add(period, number)');
+
+ a.year(2011);
+ a.month(9);
+ a.date(12);
+ a.hours(6);
+ a.minutes(7);
+ a.seconds(8);
+ a.milliseconds(500);
+
+ assert.equal(a.add('ms', 50).milliseconds(), 550, 'Add milliseconds');
+ assert.equal(a.add('s', 1).seconds(), 9, 'Add seconds');
+ assert.equal(a.add('m', 1).minutes(), 8, 'Add minutes');
+ assert.equal(a.add('h', 1).hours(), 7, 'Add hours');
+ assert.equal(a.add('d', 1).date(), 13, 'Add date');
+ assert.equal(a.add('w', 1).date(), 20, 'Add week');
+ assert.equal(a.add('M', 1).month(), 10, 'Add month');
+ assert.equal(a.add('y', 1).year(), 2012, 'Add year');
+ assert.equal(a.add('Q', 1).month(), 1, 'Add quarter');
+});
+
+test('add string long', function (assert) {
+ var a = moment();
+ a.year(2011);
+ a.month(9);
+ a.date(12);
+ a.hours(6);
+ a.minutes(7);
+ a.seconds(8);
+ a.milliseconds(500);
+
+ assert.equal(a.add(50, 'millisecond').milliseconds(), 550, 'Add milliseconds');
+ assert.equal(a.add(1, 'second').seconds(), 9, 'Add seconds');
+ assert.equal(a.add(1, 'minute').minutes(), 8, 'Add minutes');
+ assert.equal(a.add(1, 'hour').hours(), 7, 'Add hours');
+ assert.equal(a.add(1, 'day').date(), 13, 'Add date');
+ assert.equal(a.add(1, 'week').date(), 20, 'Add week');
+ assert.equal(a.add(1, 'month').month(), 10, 'Add month');
+ assert.equal(a.add(1, 'year').year(), 2012, 'Add year');
+ assert.equal(a.add(1, 'quarter').month(), 1, 'Add quarter');
+});
+
+test('add string long singular', function (assert) {
+ var a = moment();
+ a.year(2011);
+ a.month(9);
+ a.date(12);
+ a.hours(6);
+ a.minutes(7);
+ a.seconds(8);
+ a.milliseconds(500);
+
+ assert.equal(a.add(50, 'milliseconds').milliseconds(), 550, 'Add milliseconds');
+ assert.equal(a.add(1, 'seconds').seconds(), 9, 'Add seconds');
+ assert.equal(a.add(1, 'minutes').minutes(), 8, 'Add minutes');
+ assert.equal(a.add(1, 'hours').hours(), 7, 'Add hours');
+ assert.equal(a.add(1, 'days').date(), 13, 'Add date');
+ assert.equal(a.add(1, 'weeks').date(), 20, 'Add week');
+ assert.equal(a.add(1, 'months').month(), 10, 'Add month');
+ assert.equal(a.add(1, 'years').year(), 2012, 'Add year');
+ assert.equal(a.add(1, 'quarters').month(), 1, 'Add quarter');
+});
+
+test('add string short', function (assert) {
+ var a = moment();
+ a.year(2011);
+ a.month(9);
+ a.date(12);
+ a.hours(6);
+ a.minutes(7);
+ a.seconds(8);
+ a.milliseconds(500);
+
+ assert.equal(a.add(50, 'ms').milliseconds(), 550, 'Add milliseconds');
+ assert.equal(a.add(1, 's').seconds(), 9, 'Add seconds');
+ assert.equal(a.add(1, 'm').minutes(), 8, 'Add minutes');
+ assert.equal(a.add(1, 'h').hours(), 7, 'Add hours');
+ assert.equal(a.add(1, 'd').date(), 13, 'Add date');
+ assert.equal(a.add(1, 'w').date(), 20, 'Add week');
+ assert.equal(a.add(1, 'M').month(), 10, 'Add month');
+ assert.equal(a.add(1, 'y').year(), 2012, 'Add year');
+ assert.equal(a.add(1, 'Q').month(), 1, 'Add quarter');
+});
+
+test('add strings string short reversed', function (assert) {
+ var a = moment();
+ test.expectedDeprecations('moment().add(period, number)');
+
+ a.year(2011);
+ a.month(9);
+ a.date(12);
+ a.hours(6);
+ a.minutes(7);
+ a.seconds(8);
+ a.milliseconds(500);
+
+ assert.equal(a.add('ms', '50').milliseconds(), 550, 'Add milliseconds');
+ assert.equal(a.add('s', '1').seconds(), 9, 'Add seconds');
+ assert.equal(a.add('m', '1').minutes(), 8, 'Add minutes');
+ assert.equal(a.add('h', '1').hours(), 7, 'Add hours');
+ assert.equal(a.add('d', '1').date(), 13, 'Add date');
+ assert.equal(a.add('w', '1').date(), 20, 'Add week');
+ assert.equal(a.add('M', '1').month(), 10, 'Add month');
+ assert.equal(a.add('y', '1').year(), 2012, 'Add year');
+ assert.equal(a.add('Q', '1').month(), 1, 'Add quarter');
+});
+
+test('subtract strings string short reversed', function (assert) {
+ var a = moment();
+ test.expectedDeprecations('moment().subtract(period, number)');
+
+ a.year(2011);
+ a.month(9);
+ a.date(12);
+ a.hours(6);
+ a.minutes(7);
+ a.seconds(8);
+ a.milliseconds(500);
+
+ assert.equal(a.subtract('ms', '50').milliseconds(), 450, 'Subtract milliseconds');
+ assert.equal(a.subtract('s', '1').seconds(), 7, 'Subtract seconds');
+ assert.equal(a.subtract('m', '1').minutes(), 6, 'Subtract minutes');
+ assert.equal(a.subtract('h', '1').hours(), 5, 'Subtract hours');
+ assert.equal(a.subtract('d', '1').date(), 11, 'Subtract date');
+ assert.equal(a.subtract('w', '1').date(), 4, 'Subtract week');
+ assert.equal(a.subtract('M', '1').month(), 8, 'Subtract month');
+ assert.equal(a.subtract('y', '1').year(), 2010, 'Subtract year');
+ assert.equal(a.subtract('Q', '1').month(), 5, 'Subtract quarter');
+});
+
+test('add strings string short', function (assert) {
+ var a = moment();
+ a.year(2011);
+ a.month(9);
+ a.date(12);
+ a.hours(6);
+ a.minutes(7);
+ a.seconds(8);
+ a.milliseconds(500);
+
+ assert.equal(a.add('50', 'ms').milliseconds(), 550, 'Add milliseconds');
+ assert.equal(a.add('1', 's').seconds(), 9, 'Add seconds');
+ assert.equal(a.add('1', 'm').minutes(), 8, 'Add minutes');
+ assert.equal(a.add('1', 'h').hours(), 7, 'Add hours');
+ assert.equal(a.add('1', 'd').date(), 13, 'Add date');
+ assert.equal(a.add('1', 'w').date(), 20, 'Add week');
+ assert.equal(a.add('1', 'M').month(), 10, 'Add month');
+ assert.equal(a.add('1', 'y').year(), 2012, 'Add year');
+ assert.equal(a.add('1', 'Q').month(), 1, 'Add quarter');
+});
+
+test('add no string with milliseconds default', function (assert) {
+ var a = moment();
+ a.year(2011);
+ a.month(9);
+ a.date(12);
+ a.hours(6);
+ a.minutes(7);
+ a.seconds(8);
+ a.milliseconds(500);
+
+ assert.equal(a.add(50).milliseconds(), 550, 'Add milliseconds');
+});
+
+test('subtract strings string short', function (assert) {
+ var a = moment();
+ a.year(2011);
+ a.month(9);
+ a.date(12);
+ a.hours(6);
+ a.minutes(7);
+ a.seconds(8);
+ a.milliseconds(500);
+
+ assert.equal(a.subtract('50', 'ms').milliseconds(), 450, 'Subtract milliseconds');
+ assert.equal(a.subtract('1', 's').seconds(), 7, 'Subtract seconds');
+ assert.equal(a.subtract('1', 'm').minutes(), 6, 'Subtract minutes');
+ assert.equal(a.subtract('1', 'h').hours(), 5, 'Subtract hours');
+ assert.equal(a.subtract('1', 'd').date(), 11, 'Subtract date');
+ assert.equal(a.subtract('1', 'w').date(), 4, 'Subtract week');
+ assert.equal(a.subtract('1', 'M').month(), 8, 'Subtract month');
+ assert.equal(a.subtract('1', 'y').year(), 2010, 'Subtract year');
+ assert.equal(a.subtract('1', 'Q').month(), 5, 'Subtract quarter');
+});
+
+test('add across DST', function (assert) {
+ // Detect Safari bug and bail. Hours on 13th March 2011 are shifted
+ // with 1 ahead.
+ if (new Date(2011, 2, 13, 5, 0, 0).getHours() !== 5) {
+ expect(0);
+ return;
+ }
+
+ var a = moment(new Date(2011, 2, 12, 5, 0, 0)),
+ b = moment(new Date(2011, 2, 12, 5, 0, 0)),
+ c = moment(new Date(2011, 2, 12, 5, 0, 0)),
+ d = moment(new Date(2011, 2, 12, 5, 0, 0)),
+ e = moment(new Date(2011, 2, 12, 5, 0, 0));
+ a.add(1, 'days');
+ b.add(24, 'hours');
+ c.add(1, 'months');
+ e.add(1, 'quarter');
+
+ assert.equal(a.hours(), 5, 'adding days over DST difference should result in the same hour');
+ if (b.isDST() && !d.isDST()) {
+ assert.equal(b.hours(), 6, 'adding hours over DST difference should result in a different hour');
+ } else if (!b.isDST() && d.isDST()) {
+ assert.equal(b.hours(), 4, 'adding hours over DST difference should result in a different hour');
+ } else {
+ assert.equal(b.hours(), 5, 'adding hours over DST difference should result in a same hour if the timezone does not have daylight savings time');
+ }
+ assert.equal(c.hours(), 5, 'adding months over DST difference should result in the same hour');
+ assert.equal(e.hours(), 5, 'adding quarters over DST difference should result in the same hour');
+});
+
+test('add decimal values of days and months', function (assert) {
+ assert.equal(moment([2016,3,3]).add(1.5, 'days').date(), 5, 'adding 1.5 days is rounded to adding 2 day');
+ assert.equal(moment([2016,3,3]).add(-1.5, 'days').date(), 1, 'adding -1.5 days is rounded to adding -2 day');
+ assert.equal(moment([2016,3,1]).add(-1.5, 'days').date(), 30, 'adding -1.5 days on first of month wraps around');
+ assert.equal(moment([2016,3,3]).add(1.5, 'months').month(), 5, 'adding 1.5 months adds 2 months');
+ assert.equal(moment([2016,3,3]).add(-1.5, 'months').month(), 1, 'adding -1.5 months adds -2 months');
+ assert.equal(moment([2016,0,3]).add(-1.5, 'months').month(), 10, 'adding -1.5 months at start of year wraps back');
+ assert.equal(moment([2016,3,3]).subtract(1.5, 'days').date(),1, 'subtract 1.5 days is rounded to subtract 2 day');
+ assert.equal(moment([2016,3,2]).subtract(1.5, 'days').date(), 31, 'subtract 1.5 days subtracts 2 days');
+ assert.equal(moment([2016,1,1]).subtract(1.1, 'days').date(), 31, 'subtract 1.1 days wraps to previous month');
+ assert.equal(moment([2016,3,3]).subtract(-1.5, 'days').date(), 5, 'subtract -1.5 days is rounded to subtract -2 day');
+ assert.equal(moment([2016,3,30]).subtract(-1.5, 'days').date(), 2, 'subtract -1.5 days on last of month wraps around');
+ assert.equal(moment([2016,3,3]).subtract(1.5, 'months').month(), 1, 'subtract 1.5 months subtract 2 months');
+ assert.equal(moment([2016,3,3]).subtract(-1.5, 'months').month(), 5, 'subtract -1.5 months subtract -2 month');
+ assert.equal(moment([2016,11,31]).subtract(-1.5, 'months').month(),1, 'subtract -1.5 months at end of year wraps back');
+ assert.equal(moment([2016, 0,1]).add(1.5, 'years').format('YYYY-MM-DD'), '2017-07-01', 'add 1.5 years adds 1 year six months');
+ assert.equal(moment([2016, 0,1]).add(1.6, 'years').format('YYYY-MM-DD'), '2017-08-01', 'add 1.6 years becomes 1.6*12 = 19.2, round, 19 months');
+ assert.equal(moment([2016,0,1]).add(1.1, 'quarters').format('YYYY-MM-DD'), '2016-04-01', 'add 1.1 quarters 1.1*3=3.3, round, 3 months');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+// These tests are for locale independent features
+// locale dependent tests would be in locale test folder
+module$1('calendar');
+
+test('passing a function', function (assert) {
+ var a = moment().hours(13).minutes(0).seconds(0);
+ assert.equal(moment(a).calendar(null, {
+ 'sameDay': function () {
+ return 'h:mmA';
+ }
+ }), '1:00PM', 'should equate');
+});
+
+test('extending calendar options', function (assert) {
+ var calendarFormat = moment.calendarFormat;
+
+ moment.calendarFormat = function (myMoment, now) {
+ var diff = myMoment.diff(now, 'days', true);
+ var nextMonth = now.clone().add(1, 'month');
+
+ var retVal = diff < -6 ? 'sameElse' :
+ diff < -1 ? 'lastWeek' :
+ diff < 0 ? 'lastDay' :
+ diff < 1 ? 'sameDay' :
+ diff < 2 ? 'nextDay' :
+ diff < 7 ? 'nextWeek' :
+ (myMoment.month() === now.month() && myMoment.year() === now.year()) ? 'thisMonth' :
+ (nextMonth.month() === myMoment.month() && nextMonth.year() === myMoment.year()) ? 'nextMonth' : 'sameElse';
+ return retVal;
+ };
+
+ moment.updateLocale('en', {
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ thisMonth : '[This month on the] Do',
+ nextMonth : '[Next month on the] Do',
+ sameElse : 'L'
+ }
+ });
+ var a = moment('2016-01-01').add(28, 'days');
+ var b = moment('2016-01-01').add(1, 'month');
+ try {
+ assert.equal(a.calendar('2016-01-01'), 'This month on the 29th', 'Ad hoc calendar format for this month');
+ assert.equal(b.calendar('2016-01-01'), 'Next month on the 1st', 'Ad hoc calendar format for next month');
+ assert.equal(a.locale('fr').calendar('2016-01-01'), a.locale('fr').format('L'), 'French falls back to default because thisMonth is not defined in that locale');
+ } finally {
+ moment.calendarFormat = calendarFormat;
+ moment.updateLocale('en', null);
+ }
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('create');
+
+test('array', function (assert) {
+ assert.ok(moment([2010]).toDate() instanceof Date, '[2010]');
+ assert.ok(moment([2010, 1]).toDate() instanceof Date, '[2010, 1]');
+ assert.ok(moment([2010, 1, 12]).toDate() instanceof Date, '[2010, 1, 12]');
+ assert.ok(moment([2010, 1, 12, 1]).toDate() instanceof Date, '[2010, 1, 12, 1]');
+ assert.ok(moment([2010, 1, 12, 1, 1]).toDate() instanceof Date, '[2010, 1, 12, 1, 1]');
+ assert.ok(moment([2010, 1, 12, 1, 1, 1]).toDate() instanceof Date, '[2010, 1, 12, 1, 1, 1]');
+ assert.ok(moment([2010, 1, 12, 1, 1, 1, 1]).toDate() instanceof Date, '[2010, 1, 12, 1, 1, 1, 1]');
+ assert.equal(+moment(new Date(2010, 1, 14, 15, 25, 50, 125)), +moment([2010, 1, 14, 15, 25, 50, 125]), 'constructing with array === constructing with new Date()');
+});
+
+test('array with invalid arguments', function (assert) {
+ assert.ok(!moment([2010, null, null]).isValid(), '[2010, null, null]');
+ assert.ok(!moment([1945, null, null]).isValid(), '[1945, null, null] (pre-1970)');
+});
+
+test('array copying', function (assert) {
+ var importantArray = [2009, 11];
+ moment(importantArray);
+ assert.deepEqual(importantArray, [2009, 11], 'initializer should not mutate the original array');
+});
+
+test('object', function (assert) {
+ var fmt = 'YYYY-MM-DD HH:mm:ss.SSS',
+ tests = [
+ [{year: 2010}, '2010-01-01 00:00:00.000'],
+ [{year: 2010, month: 1}, '2010-02-01 00:00:00.000'],
+ [{year: 2010, month: 1, day: 12}, '2010-02-12 00:00:00.000'],
+ [{year: 2010, month: 1, date: 12}, '2010-02-12 00:00:00.000'],
+ [{year: 2010, month: 1, day: 12, hours: 1}, '2010-02-12 01:00:00.000'],
+ [{year: 2010, month: 1, date: 12, hours: 1}, '2010-02-12 01:00:00.000'],
+ [{year: 2010, month: 1, day: 12, hours: 1, minutes: 1}, '2010-02-12 01:01:00.000'],
+ [{year: 2010, month: 1, date: 12, hours: 1, minutes: 1}, '2010-02-12 01:01:00.000'],
+ [{year: 2010, month: 1, day: 12, hours: 1, minutes: 1, seconds: 1}, '2010-02-12 01:01:01.000'],
+ [{year: 2010, month: 1, day: 12, hours: 1, minutes: 1, seconds: 1, milliseconds: 1}, '2010-02-12 01:01:01.001'],
+ [{years: 2010, months: 1, days: 14, hours: 15, minutes: 25, seconds: 50, milliseconds: 125}, '2010-02-14 15:25:50.125'],
+ [{year: 2010, month: 1, day: 14, hour: 15, minute: 25, second: 50, millisecond: 125}, '2010-02-14 15:25:50.125'],
+ [{y: 2010, M: 1, d: 14, h: 15, m: 25, s: 50, ms: 125}, '2010-02-14 15:25:50.125']
+ ], i;
+ for (i = 0; i < tests.length; ++i) {
+ assert.equal(moment(tests[i][0]).format(fmt), tests[i][1]);
+ }
+});
+
+test('multi format array copying', function (assert) {
+ var importantArray = ['MM/DD/YYYY', 'YYYY-MM-DD', 'MM-DD-YYYY'];
+ moment('1999-02-13', importantArray);
+ assert.deepEqual(importantArray, ['MM/DD/YYYY', 'YYYY-MM-DD', 'MM-DD-YYYY'], 'initializer should not mutate the original array');
+});
+
+test('number', function (assert) {
+ assert.ok(moment(1000).toDate() instanceof Date, '1000');
+ assert.equal(moment(1000).valueOf(), 1000, 'asserting valueOf');
+ assert.equal(moment.utc(1000).valueOf(), 1000, 'asserting valueOf');
+});
+
+test('unix', function (assert) {
+ assert.equal(moment.unix(1).valueOf(), 1000, '1 unix timestamp == 1000 Date.valueOf');
+ assert.equal(moment(1000).unix(), 1, '1000 Date.valueOf == 1 unix timestamp');
+ assert.equal(moment.unix(1000).valueOf(), 1000000, '1000 unix timestamp == 1000000 Date.valueOf');
+ assert.equal(moment(1500).unix(), 1, '1500 Date.valueOf == 1 unix timestamp');
+ assert.equal(moment(1900).unix(), 1, '1900 Date.valueOf == 1 unix timestamp');
+ assert.equal(moment(2100).unix(), 2, '2100 Date.valueOf == 2 unix timestamp');
+ assert.equal(moment(1333129333524).unix(), 1333129333, '1333129333524 Date.valueOf == 1333129333 unix timestamp');
+ assert.equal(moment(1333129333524000).unix(), 1333129333524, '1333129333524000 Date.valueOf == 1333129333524 unix timestamp');
+});
+
+test('date', function (assert) {
+ assert.ok(moment(new Date()).toDate() instanceof Date, 'new Date()');
+ assert.equal(moment(new Date(2016,0,1), 'YYYY-MM-DD').format('YYYY-MM-DD'), '2016-01-01', 'If date is provided, format string is ignored');
+});
+
+test('date with a format as an array', function (assert) {
+ var tests = [
+ new Date(2016, 9, 27),
+ new Date(2016, 9, 28),
+ new Date(2016, 9, 29),
+ new Date(2016, 9, 30),
+ new Date(2016, 9, 31)
+ ], i;
+
+ for (i = 0; i < tests.length; i++) {
+ assert.equal(moment(tests[i]).format(), moment(tests[i], ['MM/DD/YYYY'], false).format(), 'Passing date with a format array should still return the correct date');
+ }
+});
+
+test('date mutation', function (assert) {
+ var a = new Date();
+ assert.ok(moment(a).toDate() !== a, 'the date moment uses should not be the date passed in');
+});
+
+test('moment', function (assert) {
+ assert.ok(moment(moment()).toDate() instanceof Date, 'moment(moment())');
+ assert.ok(moment(moment(moment())).toDate() instanceof Date, 'moment(moment(moment()))');
+});
+
+test('cloning moment should only copy own properties', function (assert) {
+ assert.ok(!moment().clone().hasOwnProperty('month'), 'Should not clone prototype methods');
+});
+
+test('cloning moment works with weird clones', function (assert) {
+ var extend = function (a, b) {
+ var i;
+ for (i in b) {
+ a[i] = b[i];
+ }
+ return a;
+ },
+ now = moment(),
+ nowu = moment.utc();
+
+ assert.equal(+extend({}, now).clone(), +now, 'cloning extend-ed now is now');
+ assert.equal(+extend({}, nowu).clone(), +nowu, 'cloning extend-ed utc now is utc now');
+});
+
+test('cloning respects moment.momentProperties', function (assert) {
+ var m = moment();
+
+ assert.equal(m.clone()._special, undefined, 'cloning ignores extra properties');
+ m._special = 'bacon';
+ moment.momentProperties.push('_special');
+ assert.equal(m.clone()._special, 'bacon', 'cloning respects momentProperties');
+ moment.momentProperties.pop();
+});
+
+test('undefined', function (assert) {
+ assert.ok(moment().toDate() instanceof Date, 'undefined');
+});
+
+test('iso with bad input', function (assert) {
+ assert.ok(!moment('a', moment.ISO_8601).isValid(), 'iso parsing with invalid string');
+ assert.ok(!moment('a', moment.ISO_8601, true).isValid(), 'iso parsing with invalid string, strict');
+});
+
+test('iso format 24hrs', function (assert) {
+ assert.equal(moment('2014-01-01T24:00:00.000').format('YYYY-MM-DD[T]HH:mm:ss.SSS'),
+ '2014-01-02T00:00:00.000', 'iso format with 24:00 localtime');
+ assert.equal(moment.utc('2014-01-01T24:00:00.000').format('YYYY-MM-DD[T]HH:mm:ss.SSS'),
+ '2014-01-02T00:00:00.000', 'iso format with 24:00 utc');
+});
+
+test('string without format - json', function (assert) {
+ assert.equal(moment('Date(1325132654000)').valueOf(), 1325132654000, 'Date(1325132654000)');
+ assert.equal(moment('Date(-1325132654000)').valueOf(), -1325132654000, 'Date(-1325132654000)');
+ assert.equal(moment('/Date(1325132654000)/').valueOf(), 1325132654000, '/Date(1325132654000)/');
+ assert.equal(moment('/Date(1325132654000+0700)/').valueOf(), 1325132654000, '/Date(1325132654000+0700)/');
+ assert.equal(moment('/Date(1325132654000-0700)/').valueOf(), 1325132654000, '/Date(1325132654000-0700)/');
+});
+
+test('string with format dropped am/pm bug', function (assert) {
+ moment.locale('en');
+
+ assert.equal(moment('05/1/2012 12:25:00', 'MM/DD/YYYY h:m:s a').format('MM/DD/YYYY'), '05/01/2012', 'should not break if am/pm is left off from the parsing tokens');
+ assert.equal(moment('05/1/2012 12:25:00 am', 'MM/DD/YYYY h:m:s a').format('MM/DD/YYYY'), '05/01/2012', 'should not break if am/pm is left off from the parsing tokens');
+ assert.equal(moment('05/1/2012 12:25:00 pm', 'MM/DD/YYYY h:m:s a').format('MM/DD/YYYY'), '05/01/2012', 'should not break if am/pm is left off from the parsing tokens');
+
+ assert.ok(moment('05/1/2012 12:25:00', 'MM/DD/YYYY h:m:s a').isValid());
+ assert.ok(moment('05/1/2012 12:25:00 am', 'MM/DD/YYYY h:m:s a').isValid());
+ assert.ok(moment('05/1/2012 12:25:00 pm', 'MM/DD/YYYY h:m:s a').isValid());
+});
+
+test('empty string with formats', function (assert) {
+ assert.equal(moment('', 'MM').format('YYYY-MM-DD HH:mm:ss'), 'Invalid date');
+ assert.equal(moment(' ', 'MM').format('YYYY-MM-DD HH:mm:ss'), 'Invalid date');
+ assert.equal(moment(' ', 'DD').format('YYYY-MM-DD HH:mm:ss'), 'Invalid date');
+ assert.equal(moment(' ', ['MM', 'DD']).format('YYYY-MM-DD HH:mm:ss'), 'Invalid date');
+
+ assert.ok(!moment('', 'MM').isValid());
+ assert.ok(!moment(' ', 'MM').isValid());
+ assert.ok(!moment(' ', 'DD').isValid());
+ assert.ok(!moment(' ', ['MM', 'DD']).isValid());
+});
+
+test('undefined argument with formats', function (assert) {
+ assert.equal(moment(undefined, 'MM').format('YYYY-MM-DD HH:mm:ss'), 'Invalid date');
+ assert.equal(moment(undefined, 'DD').format('YYYY-MM-DD HH:mm:ss'), 'Invalid date');
+ assert.equal(moment(undefined, ['MM', 'DD']).format('YYYY-MM-DD HH:mm:ss'), 'Invalid date');
+
+ assert.ok(!moment(undefined, 'MM').isValid());
+ assert.ok(!moment(undefined, 'MM').isValid());
+ assert.ok(!moment(undefined, 'DD').isValid());
+ assert.ok(!moment(undefined, ['MM', 'DD']).isValid());
+});
+
+test('defaulting to current date', function (assert) {
+ var now = moment();
+ assert.equal(moment('12:13:14', 'hh:mm:ss').format('YYYY-MM-DD hh:mm:ss'),
+ now.clone().hour(12).minute(13).second(14).format('YYYY-MM-DD hh:mm:ss'),
+ 'given only time default to current date');
+ assert.equal(moment('05', 'DD').format('YYYY-MM-DD'),
+ now.clone().date(5).format('YYYY-MM-DD'),
+ 'given day of month default to current month, year');
+ assert.equal(moment('05', 'MM').format('YYYY-MM-DD'),
+ now.clone().month(4).date(1).format('YYYY-MM-DD'),
+ 'given month default to current year');
+ assert.equal(moment('1996', 'YYYY').format('YYYY-MM-DD'),
+ now.clone().year(1996).month(0).date(1).format('YYYY-MM-DD'),
+ 'given year do not default');
+});
+
+test('matching am/pm', function (assert) {
+ assert.equal(moment('2012-09-03T03:00PM', 'YYYY-MM-DDThh:mmA').format('YYYY-MM-DDThh:mmA'), '2012-09-03T03:00PM', 'am/pm should parse correctly for PM');
+ assert.equal(moment('2012-09-03T03:00P.M.', 'YYYY-MM-DDThh:mmA').format('YYYY-MM-DDThh:mmA'), '2012-09-03T03:00PM', 'am/pm should parse correctly for P.M.');
+ assert.equal(moment('2012-09-03T03:00P', 'YYYY-MM-DDThh:mmA').format('YYYY-MM-DDThh:mmA'), '2012-09-03T03:00PM', 'am/pm should parse correctly for P');
+ assert.equal(moment('2012-09-03T03:00pm', 'YYYY-MM-DDThh:mmA').format('YYYY-MM-DDThh:mmA'), '2012-09-03T03:00PM', 'am/pm should parse correctly for pm');
+ assert.equal(moment('2012-09-03T03:00p.m.', 'YYYY-MM-DDThh:mmA').format('YYYY-MM-DDThh:mmA'), '2012-09-03T03:00PM', 'am/pm should parse correctly for p.m.');
+ assert.equal(moment('2012-09-03T03:00p', 'YYYY-MM-DDThh:mmA').format('YYYY-MM-DDThh:mmA'), '2012-09-03T03:00PM', 'am/pm should parse correctly for p');
+
+ assert.equal(moment('2012-09-03T03:00AM', 'YYYY-MM-DDThh:mmA').format('YYYY-MM-DDThh:mmA'), '2012-09-03T03:00AM', 'am/pm should parse correctly for AM');
+ assert.equal(moment('2012-09-03T03:00A.M.', 'YYYY-MM-DDThh:mmA').format('YYYY-MM-DDThh:mmA'), '2012-09-03T03:00AM', 'am/pm should parse correctly for A.M.');
+ assert.equal(moment('2012-09-03T03:00A', 'YYYY-MM-DDThh:mmA').format('YYYY-MM-DDThh:mmA'), '2012-09-03T03:00AM', 'am/pm should parse correctly for A');
+ assert.equal(moment('2012-09-03T03:00am', 'YYYY-MM-DDThh:mmA').format('YYYY-MM-DDThh:mmA'), '2012-09-03T03:00AM', 'am/pm should parse correctly for am');
+ assert.equal(moment('2012-09-03T03:00a.m.', 'YYYY-MM-DDThh:mmA').format('YYYY-MM-DDThh:mmA'), '2012-09-03T03:00AM', 'am/pm should parse correctly for a.m.');
+ assert.equal(moment('2012-09-03T03:00a', 'YYYY-MM-DDThh:mmA').format('YYYY-MM-DDThh:mmA'), '2012-09-03T03:00AM', 'am/pm should parse correctly for a');
+
+ assert.equal(moment('5:00p.m.March 4 2012', 'h:mmAMMMM D YYYY').format('YYYY-MM-DDThh:mmA'), '2012-03-04T05:00PM', 'am/pm should parse correctly before month names');
+});
+
+test('string with format', function (assert) {
+ moment.locale('en');
+ var a = [
+ ['YYYY-Q', '2014-4'],
+ ['MM-DD-YYYY', '12-02-1999'],
+ ['DD-MM-YYYY', '12-02-1999'],
+ ['DD/MM/YYYY', '12/02/1999'],
+ ['DD_MM_YYYY', '12_02_1999'],
+ ['DD:MM:YYYY', '12:02:1999'],
+ ['D-M-YY', '2-2-99'],
+ ['YY', '99'],
+ ['DDD-YYYY', '300-1999'],
+ ['DD-MM-YYYY h:m:s', '12-02-1999 2:45:10'],
+ ['DD-MM-YYYY h:m:s a', '12-02-1999 2:45:10 am'],
+ ['DD-MM-YYYY h:m:s a', '12-02-1999 2:45:10 pm'],
+ ['h:mm a', '12:00 pm'],
+ ['h:mm a', '12:30 pm'],
+ ['h:mm a', '12:00 am'],
+ ['h:mm a', '12:30 am'],
+ ['HH:mm', '12:00'],
+ ['YYYY-MM-DDTHH:mm:ss', '2011-11-11T11:11:11'],
+ ['MM-DD-YYYY [M]', '12-02-1999 M'],
+ ['ddd MMM DD HH:mm:ss YYYY', 'Tue Apr 07 22:52:51 2009'],
+ ['HH:mm:ss', '12:00:00'],
+ ['HH:mm:ss', '12:30:00'],
+ ['HH:mm:ss', '00:00:00'],
+ ['HH:mm:ss S', '00:30:00 1'],
+ ['HH:mm:ss SS', '00:30:00 12'],
+ ['HH:mm:ss SSS', '00:30:00 123'],
+ ['HH:mm:ss S', '00:30:00 7'],
+ ['HH:mm:ss SS', '00:30:00 78'],
+ ['HH:mm:ss SSS', '00:30:00 789'],
+ ['X', '1234567890'],
+ ['x', '1234567890123'],
+ ['LT', '12:30 AM'],
+ ['LTS', '12:30:29 AM'],
+ ['L', '09/02/1999'],
+ ['l', '9/2/1999'],
+ ['LL', 'September 2, 1999'],
+ ['ll', 'Sep 2, 1999'],
+ ['LLL', 'September 2, 1999 12:30 AM'],
+ ['lll', 'Sep 2, 1999 12:30 AM'],
+ ['LLLL', 'Thursday, September 2, 1999 12:30 AM'],
+ ['llll', 'Thu, Sep 2, 1999 12:30 AM']
+ ],
+ m,
+ i;
+
+ for (i = 0; i < a.length; i++) {
+ m = moment(a[i][1], a[i][0]);
+ assert.ok(m.isValid());
+ assert.equal(m.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('2 digit year with YYYY format', function (assert) {
+ assert.equal(moment('9/2/99', 'D/M/YYYY').format('DD/MM/YYYY'), '09/02/1999', 'D/M/YYYY ---> 9/2/99');
+ assert.equal(moment('9/2/1999', 'D/M/YYYY').format('DD/MM/YYYY'), '09/02/1999', 'D/M/YYYY ---> 9/2/1999');
+ assert.equal(moment('9/2/68', 'D/M/YYYY').format('DD/MM/YYYY'), '09/02/2068', 'D/M/YYYY ---> 9/2/68');
+ assert.equal(moment('9/2/69', 'D/M/YYYY').format('DD/MM/YYYY'), '09/02/1969', 'D/M/YYYY ---> 9/2/69');
+});
+
+test('unix timestamp format', function (assert) {
+ var formats = ['X', 'X.S', 'X.SS', 'X.SSS'], i, format;
+
+ for (i = 0; i < formats.length; i++) {
+ format = formats[i];
+ assert.equal(moment('1234567890', format).valueOf(), 1234567890 * 1000, format + ' matches timestamp without milliseconds');
+ assert.equal(moment('1234567890.1', format).valueOf(), 1234567890 * 1000 + 100, format + ' matches timestamp with deciseconds');
+ assert.equal(moment('1234567890.12', format).valueOf(), 1234567890 * 1000 + 120, format + ' matches timestamp with centiseconds');
+ assert.equal(moment('1234567890.123', format).valueOf(), 1234567890 * 1000 + 123, format + ' matches timestamp with milliseconds');
+ }
+});
+
+test('unix offset milliseconds', function (assert) {
+ assert.equal(moment('1234567890123', 'x').valueOf(), 1234567890123, 'x matches unix offset in milliseconds');
+});
+
+test('milliseconds format', function (assert) {
+ assert.equal(moment('1', 'S').get('ms'), 100, 'deciseconds');
+ // assert.equal(moment('10', 'S', true).isValid(), false, 'deciseconds with two digits');
+ // assert.equal(moment('1', 'SS', true).isValid(), false, 'centiseconds with one digits');
+ assert.equal(moment('12', 'SS').get('ms'), 120, 'centiseconds');
+ // assert.equal(moment('123', 'SS', true).isValid(), false, 'centiseconds with three digits');
+ assert.equal(moment('123', 'SSS').get('ms'), 123, 'milliseconds');
+ assert.equal(moment('1234', 'SSSS').get('ms'), 123, 'milliseconds with SSSS');
+ assert.equal(moment('123456789101112', 'SSSS').get('ms'), 123, 'milliseconds with SSSS');
+});
+
+test('string with format no separators', function (assert) {
+ moment.locale('en');
+ var a = [
+ ['MMDDYYYY', '12021999'],
+ ['DDMMYYYY', '12021999'],
+ ['YYYYMMDD', '19991202'],
+ ['DDMMMYYYY', '10Sep2001']
+ ], i;
+
+ for (i = 0; i < a.length; i++) {
+ assert.equal(moment(a[i][1], a[i][0]).format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]);
+ }
+});
+
+test('string with format (timezone)', function (assert) {
+ assert.equal(moment('5 -0700', 'H ZZ').toDate().getUTCHours(), 12, 'parse hours \'5 -0700\' ---> \'H ZZ\'');
+ assert.equal(moment('5 -07:00', 'H Z').toDate().getUTCHours(), 12, 'parse hours \'5 -07:00\' ---> \'H Z\'');
+ assert.equal(moment('5 -0730', 'H ZZ').toDate().getUTCMinutes(), 30, 'parse hours \'5 -0730\' ---> \'H ZZ\'');
+ assert.equal(moment('5 -07:30', 'H Z').toDate().getUTCMinutes(), 30, 'parse hours \'5 -07:0\' ---> \'H Z\'');
+ assert.equal(moment('5 +0100', 'H ZZ').toDate().getUTCHours(), 4, 'parse hours \'5 +0100\' ---> \'H ZZ\'');
+ assert.equal(moment('5 +01:00', 'H Z').toDate().getUTCHours(), 4, 'parse hours \'5 +01:00\' ---> \'H Z\'');
+ assert.equal(moment('5 +0130', 'H ZZ').toDate().getUTCMinutes(), 30, 'parse hours \'5 +0130\' ---> \'H ZZ\'');
+ assert.equal(moment('5 +01:30', 'H Z').toDate().getUTCMinutes(), 30, 'parse hours \'5 +01:30\' ---> \'H Z\'');
+});
+
+test('string with format (timezone offset)', function (assert) {
+ var a, b, c, d, e, f;
+ a = new Date(Date.UTC(2011, 0, 1, 1));
+ b = moment('2011 1 1 0 -01:00', 'YYYY MM DD HH Z');
+ assert.equal(a.getHours(), b.hours(), 'date created with utc == parsed string with timezone offset');
+ assert.equal(+a, +b, 'date created with utc == parsed string with timezone offset');
+ c = moment('2011 2 1 10 -05:00', 'YYYY MM DD HH Z');
+ d = moment('2011 2 1 8 -07:00', 'YYYY MM DD HH Z');
+ assert.equal(c.hours(), d.hours(), '10 am central time == 8 am pacific time');
+ e = moment.utc('Fri, 20 Jul 2012 17:15:00', 'ddd, DD MMM YYYY HH:mm:ss');
+ f = moment.utc('Fri, 20 Jul 2012 10:15:00 -0700', 'ddd, DD MMM YYYY HH:mm:ss ZZ');
+ assert.equal(e.hours(), f.hours(), 'parse timezone offset in utc');
+});
+
+test('string with timezone around start of year', function (assert) {
+ assert.equal(moment('2000-01-01T00:00:00.000+01:00').toISOString(), '1999-12-31T23:00:00.000Z', '+1:00 around 2000');
+ assert.equal(moment('2000-01-01T00:00:00.000-01:00').toISOString(), '2000-01-01T01:00:00.000Z', '-1:00 around 2000');
+ assert.equal(moment('1970-01-01T00:00:00.000+01:00').toISOString(), '1969-12-31T23:00:00.000Z', '+1:00 around 1970');
+ assert.equal(moment('1970-01-01T00:00:00.000-01:00').toISOString(), '1970-01-01T01:00:00.000Z', '-1:00 around 1970');
+ assert.equal(moment('1200-01-01T00:00:00.000+01:00').toISOString(), '1199-12-31T23:00:00.000Z', '+1:00 around 1200');
+ assert.equal(moment('1200-01-01T00:00:00.000-01:00').toISOString(), '1200-01-01T01:00:00.000Z', '-1:00 around 1200');
+});
+
+test('string with array of formats', function (assert) {
+ var thursdayForCurrentWeek = moment()
+ .day(4)
+ .format('YYYY MM DD');
+
+ assert.equal(moment('11-02-1999', ['MM-DD-YYYY', 'DD-MM-YYYY']).format('MM DD YYYY'), '11 02 1999', 'switching month and day');
+ assert.equal(moment('02-11-1999', ['MM/DD/YYYY', 'YYYY MM DD', 'MM-DD-YYYY']).format('MM DD YYYY'), '02 11 1999', 'year last');
+ assert.equal(moment('1999-02-11', ['MM/DD/YYYY', 'YYYY MM DD', 'MM-DD-YYYY']).format('MM DD YYYY'), '02 11 1999', 'year first');
+
+ assert.equal(moment('02-11-1999', ['MM/DD/YYYY', 'YYYY MM DD']).format('MM DD YYYY'), '02 11 1999', 'year last');
+ assert.equal(moment('1999-02-11', ['MM/DD/YYYY', 'YYYY MM DD']).format('MM DD YYYY'), '02 11 1999', 'year first');
+ assert.equal(moment('02-11-1999', ['YYYY MM DD', 'MM/DD/YYYY']).format('MM DD YYYY'), '02 11 1999', 'year last');
+ assert.equal(moment('1999-02-11', ['YYYY MM DD', 'MM/DD/YYYY']).format('MM DD YYYY'), '02 11 1999', 'year first');
+
+ assert.equal(moment('13-11-1999', ['MM/DD/YYYY', 'DD/MM/YYYY']).format('MM DD YYYY'), '11 13 1999', 'second must be month');
+ assert.equal(moment('11-13-1999', ['MM/DD/YYYY', 'DD/MM/YYYY']).format('MM DD YYYY'), '11 13 1999', 'first must be month');
+ assert.equal(moment('01-02-2000', ['MM/DD/YYYY', 'DD/MM/YYYY']).format('MM DD YYYY'), '01 02 2000', 'either can be a month, month first format');
+ assert.equal(moment('02-01-2000', ['DD/MM/YYYY', 'MM/DD/YYYY']).format('MM DD YYYY'), '01 02 2000', 'either can be a month, day first format');
+
+ assert.equal(moment('11-02-10', ['MM/DD/YY', 'YY MM DD', 'DD-MM-YY']).format('MM DD YYYY'), '02 11 2010', 'all unparsed substrings have influence on format penalty');
+ assert.equal(moment('11-02-10', ['MM-DD-YY HH:mm', 'YY MM DD']).format('MM DD YYYY'), '02 10 2011', 'prefer formats without extra tokens');
+ assert.equal(moment('11-02-10 junk', ['MM-DD-YY', 'YY.MM.DD junk']).format('MM DD YYYY'), '02 10 2011', 'prefer formats that dont result in extra characters');
+ assert.equal(moment('11-22-10', ['YY-MM-DD', 'YY-DD-MM']).format('MM DD YYYY'), '10 22 2011', 'prefer valid results');
+
+ assert.equal(moment('gibberish', ['YY-MM-DD', 'YY-DD-MM']).format('MM DD YYYY'), 'Invalid date', 'doest throw for invalid strings');
+ assert.equal(moment('gibberish', []).format('MM DD YYYY'), 'Invalid date', 'doest throw for an empty array');
+
+ //https://github.com/moment/moment/issues/1143
+ assert.equal(moment(
+ 'System Administrator and Database Assistant (7/1/2011), System Administrator and Database Assistant (7/1/2011), Database Coordinator (7/1/2011), Vice President (7/1/2011), System Administrator and Database Assistant (5/31/2012), Database Coordinator (7/1/2012), System Administrator and Database Assistant (7/1/2013)',
+ ['MM/DD/YYYY', 'MM-DD-YYYY', 'YYYY-MM-DD', 'YYYY-MM-DDTHH:mm:ssZ'])
+ .format('YYYY-MM-DD'), '2011-07-01', 'Works for long strings');
+
+ assert.equal(moment('11-02-10', ['MM.DD.YY', 'DD-MM-YY']).format('MM DD YYYY'), '02 11 2010', 'escape RegExp special characters on comparing');
+
+ assert.equal(moment('13-10-98', ['DD MM YY', 'DD MM YYYY'])._f, 'DD MM YY', 'use two digit year');
+ assert.equal(moment('13-10-1998', ['DD MM YY', 'DD MM YYYY'])._f, 'DD MM YYYY', 'use four digit year');
+
+ assert.equal(moment('01', ['MM', 'DD'])._f, 'MM', 'Should use first valid format');
+
+ assert.equal(moment('Thursday 8:30pm', ['dddd h:mma']).format('YYYY MM DD dddd h:mma'), thursdayForCurrentWeek + ' Thursday 8:30pm', 'Default to current week');
+});
+
+test('string with array of formats + ISO', function (assert) {
+ assert.equal(moment('1994', [moment.ISO_8601, 'MM', 'HH:mm', 'YYYY']).year(), 1994, 'iso: assert parse YYYY');
+ assert.equal(moment('17:15', [moment.ISO_8601, 'MM', 'HH:mm', 'YYYY']).hour(), 17, 'iso: assert parse HH:mm (1)');
+ assert.equal(moment('17:15', [moment.ISO_8601, 'MM', 'HH:mm', 'YYYY']).minutes(), 15, 'iso: assert parse HH:mm (2)');
+ assert.equal(moment('06', [moment.ISO_8601, 'MM', 'HH:mm', 'YYYY']).month(), 6 - 1, 'iso: assert parse MM');
+ assert.equal(moment('2012-06-01', [moment.ISO_8601, 'MM', 'HH:mm', 'YYYY']).parsingFlags().iso, true, 'iso: assert parse iso');
+ assert.equal(moment('2014-05-05', [moment.ISO_8601, 'YYYY-MM-DD']).parsingFlags().iso, true, 'iso: edge case array precedence iso');
+ assert.equal(moment('2014-05-05', ['YYYY-MM-DD', moment.ISO_8601]).parsingFlags().iso, false, 'iso: edge case array precedence not iso');
+});
+
+test('string with format - years', function (assert) {
+ assert.equal(moment('67', 'YY').format('YYYY'), '2067', '67 > 2067');
+ assert.equal(moment('68', 'YY').format('YYYY'), '2068', '68 > 2068');
+ assert.equal(moment('69', 'YY').format('YYYY'), '1969', '69 > 1969');
+ assert.equal(moment('70', 'YY').format('YYYY'), '1970', '70 > 1970');
+});
+
+test('implicit cloning', function (assert) {
+ var momentA = moment([2011, 10, 10]),
+ momentB = moment(momentA);
+ momentA.month(5);
+ assert.equal(momentB.month(), 10, 'Calling moment() on a moment will create a clone');
+ assert.equal(momentA.month(), 5, 'Calling moment() on a moment will create a clone');
+});
+
+test('explicit cloning', function (assert) {
+ var momentA = moment([2011, 10, 10]),
+ momentB = momentA.clone();
+ momentA.month(5);
+ assert.equal(momentB.month(), 10, 'Calling moment() on a moment will create a clone');
+ assert.equal(momentA.month(), 5, 'Calling moment() on a moment will create a clone');
+});
+
+test('cloning carrying over utc mode', function (assert) {
+ assert.equal(moment().local().clone()._isUTC, false, 'An explicit cloned local moment should have _isUTC == false');
+ assert.equal(moment().utc().clone()._isUTC, true, 'An cloned utc moment should have _isUTC == true');
+ assert.equal(moment().clone()._isUTC, false, 'An explicit cloned local moment should have _isUTC == false');
+ assert.equal(moment.utc().clone()._isUTC, true, 'An explicit cloned utc moment should have _isUTC == true');
+ assert.equal(moment(moment().local())._isUTC, false, 'An implicit cloned local moment should have _isUTC == false');
+ assert.equal(moment(moment().utc())._isUTC, true, 'An implicit cloned utc moment should have _isUTC == true');
+ assert.equal(moment(moment())._isUTC, false, 'An implicit cloned local moment should have _isUTC == false');
+ assert.equal(moment(moment.utc())._isUTC, true, 'An implicit cloned utc moment should have _isUTC == true');
+});
+
+test('parsing iso', function (assert) {
+ var offset = moment([2011, 9, 8]).utcOffset(),
+ pad = function (input) {
+ if (input < 10) {
+ return '0' + input;
+ }
+ return '' + input;
+ },
+ hourOffset = (offset > 0 ? Math.floor(offset / 60) : Math.ceil(offset / 60)),
+ minOffset = offset - (hourOffset * 60),
+ tz = (offset >= 0) ?
+ '+' + pad(hourOffset) + ':' + pad(minOffset) :
+ '-' + pad(-hourOffset) + ':' + pad(-minOffset),
+ tz2 = tz.replace(':', ''),
+ tz3 = tz2.slice(0, 3),
+ //Tz3 removes minutes digit so will break the tests when parsed if they all use the same minutes digit
+ minutesForTz3 = pad((4 + minOffset) % 60),
+ minute = pad(4 + minOffset),
+
+ formats = [
+ ['2011-10-08', '2011-10-08T00:00:00.000' + tz],
+ ['2011-10-08T18', '2011-10-08T18:00:00.000' + tz],
+ ['2011-10-08T18:04', '2011-10-08T18:04:00.000' + tz],
+ ['2011-10-08T18:04:20', '2011-10-08T18:04:20.000' + tz],
+ ['2011-10-08T18:04' + tz, '2011-10-08T18:04:00.000' + tz],
+ ['2011-10-08T18:04:20' + tz, '2011-10-08T18:04:20.000' + tz],
+ ['2011-10-08T18:04' + tz2, '2011-10-08T18:04:00.000' + tz],
+ ['2011-10-08T18:04:20' + tz2, '2011-10-08T18:04:20.000' + tz],
+ ['2011-10-08T18:04' + tz3, '2011-10-08T18:' + minutesForTz3 + ':00.000' + tz],
+ ['2011-10-08T18:04:20' + tz3, '2011-10-08T18:' + minutesForTz3 + ':20.000' + tz],
+ ['2011-10-08T18:04:20.1' + tz2, '2011-10-08T18:04:20.100' + tz],
+ ['2011-10-08T18:04:20.11' + tz2, '2011-10-08T18:04:20.110' + tz],
+ ['2011-10-08T18:04:20.111' + tz2, '2011-10-08T18:04:20.111' + tz],
+ ['2011-10-08 18', '2011-10-08T18:00:00.000' + tz],
+ ['2011-10-08 18:04', '2011-10-08T18:04:00.000' + tz],
+ ['2011-10-08 18:04:20', '2011-10-08T18:04:20.000' + tz],
+ ['2011-10-08 18:04' + tz, '2011-10-08T18:04:00.000' + tz],
+ ['2011-10-08 18:04:20' + tz, '2011-10-08T18:04:20.000' + tz],
+ ['2011-10-08 18:04' + tz2, '2011-10-08T18:04:00.000' + tz],
+ ['2011-10-08 18:04:20' + tz2, '2011-10-08T18:04:20.000' + tz],
+ ['2011-10-08 18:04' + tz3, '2011-10-08T18:' + minutesForTz3 + ':00.000' + tz],
+ ['2011-10-08 18:04:20' + tz3, '2011-10-08T18:' + minutesForTz3 + ':20.000' + tz],
+ ['2011-10-08 18:04:20.1' + tz2, '2011-10-08T18:04:20.100' + tz],
+ ['2011-10-08 18:04:20.11' + tz2, '2011-10-08T18:04:20.110' + tz],
+ ['2011-10-08 18:04:20.111' + tz2, '2011-10-08T18:04:20.111' + tz],
+ ['2011-W40', '2011-10-03T00:00:00.000' + tz],
+ ['2011-W40-6', '2011-10-08T00:00:00.000' + tz],
+ ['2011-W40-6T18', '2011-10-08T18:00:00.000' + tz],
+ ['2011-W40-6T18:04', '2011-10-08T18:04:00.000' + tz],
+ ['2011-W40-6T18:04:20', '2011-10-08T18:04:20.000' + tz],
+ ['2011-W40-6T18:04' + tz, '2011-10-08T18:04:00.000' + tz],
+ ['2011-W40-6T18:04:20' + tz, '2011-10-08T18:04:20.000' + tz],
+ ['2011-W40-6T18:04' + tz2, '2011-10-08T18:04:00.000' + tz],
+ ['2011-W40-6T18:04:20' + tz2, '2011-10-08T18:04:20.000' + tz],
+ ['2011-W40-6T18:04' + tz3, '2011-10-08T18:' + minutesForTz3 + ':00.000' + tz],
+ ['2011-W40-6T18:04:20' + tz3, '2011-10-08T18:' + minutesForTz3 + ':20.000' + tz],
+ ['2011-W40-6T18:04:20.1' + tz2, '2011-10-08T18:04:20.100' + tz],
+ ['2011-W40-6T18:04:20.11' + tz2, '2011-10-08T18:04:20.110' + tz],
+ ['2011-W40-6T18:04:20.111' + tz2, '2011-10-08T18:04:20.111' + tz],
+ ['2011-W40-6 18', '2011-10-08T18:00:00.000' + tz],
+ ['2011-W40-6 18:04', '2011-10-08T18:04:00.000' + tz],
+ ['2011-W40-6 18:04:20', '2011-10-08T18:04:20.000' + tz],
+ ['2011-W40-6 18:04' + tz, '2011-10-08T18:04:00.000' + tz],
+ ['2011-W40-6 18:04:20' + tz, '2011-10-08T18:04:20.000' + tz],
+ ['2011-W40-6 18:04' + tz2, '2011-10-08T18:04:00.000' + tz],
+ ['2011-W40-6 18:04:20' + tz2, '2011-10-08T18:04:20.000' + tz],
+ ['2011-W40-6 18:04' + tz3, '2011-10-08T18:' + minutesForTz3 + ':00.000' + tz],
+ ['2011-W40-6 18:04:20' + tz3, '2011-10-08T18:' + minutesForTz3 + ':20.000' + tz],
+ ['2011-W40-6 18:04:20.1' + tz2, '2011-10-08T18:04:20.100' + tz],
+ ['2011-W40-6 18:04:20.11' + tz2, '2011-10-08T18:04:20.110' + tz],
+ ['2011-W40-6 18:04:20.111' + tz2, '2011-10-08T18:04:20.111' + tz],
+ ['2011-281', '2011-10-08T00:00:00.000' + tz],
+ ['2011-281T18', '2011-10-08T18:00:00.000' + tz],
+ ['2011-281T18:04', '2011-10-08T18:04:00.000' + tz],
+ ['2011-281T18:04:20', '2011-10-08T18:04:20.000' + tz],
+ ['2011-281T18:04' + tz, '2011-10-08T18:04:00.000' + tz],
+ ['2011-281T18:04:20' + tz, '2011-10-08T18:04:20.000' + tz],
+ ['2011-281T18:04' + tz2, '2011-10-08T18:04:00.000' + tz],
+ ['2011-281T18:04:20' + tz2, '2011-10-08T18:04:20.000' + tz],
+ ['2011-281T18:04' + tz3, '2011-10-08T18:' + minutesForTz3 + ':00.000' + tz],
+ ['2011-281T18:04:20' + tz3, '2011-10-08T18:' + minutesForTz3 + ':20.000' + tz],
+ ['2011-281T18:04:20.1' + tz2, '2011-10-08T18:04:20.100' + tz],
+ ['2011-281T18:04:20.11' + tz2, '2011-10-08T18:04:20.110' + tz],
+ ['2011-281T18:04:20.111' + tz2, '2011-10-08T18:04:20.111' + tz],
+ ['2011-281 18', '2011-10-08T18:00:00.000' + tz],
+ ['2011-281 18:04', '2011-10-08T18:04:00.000' + tz],
+ ['2011-281 18:04:20', '2011-10-08T18:04:20.000' + tz],
+ ['2011-281 18:04' + tz, '2011-10-08T18:04:00.000' + tz],
+ ['2011-281 18:04:20' + tz, '2011-10-08T18:04:20.000' + tz],
+ ['2011-281 18:04' + tz2, '2011-10-08T18:04:00.000' + tz],
+ ['2011-281 18:04:20' + tz2, '2011-10-08T18:04:20.000' + tz],
+ ['2011-281 18:04' + tz3, '2011-10-08T18:' + minutesForTz3 + ':00.000' + tz],
+ ['2011-281 18:04:20' + tz3, '2011-10-08T18:' + minutesForTz3 + ':20.000' + tz],
+ ['2011-281 18:04:20.1' + tz2, '2011-10-08T18:04:20.100' + tz],
+ ['2011-281 18:04:20.11' + tz2, '2011-10-08T18:04:20.110' + tz],
+ ['2011-281 18:04:20.111' + tz2, '2011-10-08T18:04:20.111' + tz],
+ ['20111008T18', '2011-10-08T18:00:00.000' + tz],
+ ['20111008T1804', '2011-10-08T18:04:00.000' + tz],
+ ['20111008T180420', '2011-10-08T18:04:20.000' + tz],
+ ['20111008T1804' + tz, '2011-10-08T18:04:00.000' + tz],
+ ['20111008T180420' + tz, '2011-10-08T18:04:20.000' + tz],
+ ['20111008T1804' + tz2, '2011-10-08T18:04:00.000' + tz],
+ ['20111008T180420' + tz2, '2011-10-08T18:04:20.000' + tz],
+ ['20111008T1804' + tz3, '2011-10-08T18:' + minutesForTz3 + ':00.000' + tz],
+ ['20111008T180420' + tz3, '2011-10-08T18:' + minutesForTz3 + ':20.000' + tz],
+ ['20111008T180420,1' + tz2, '2011-10-08T18:04:20.100' + tz],
+ ['20111008T180420,11' + tz2, '2011-10-08T18:04:20.110' + tz],
+ ['20111008T180420,111' + tz2, '2011-10-08T18:04:20.111' + tz],
+ ['20111008 18', '2011-10-08T18:00:00.000' + tz],
+ ['20111008 1804', '2011-10-08T18:04:00.000' + tz],
+ ['20111008 180420', '2011-10-08T18:04:20.000' + tz],
+ ['20111008 1804' + tz, '2011-10-08T18:04:00.000' + tz],
+ ['20111008 180420' + tz, '2011-10-08T18:04:20.000' + tz],
+ ['20111008 1804' + tz2, '2011-10-08T18:04:00.000' + tz],
+ ['20111008 180420' + tz2, '2011-10-08T18:04:20.000' + tz],
+ ['20111008 1804' + tz3, '2011-10-08T18:' + minutesForTz3 + ':00.000' + tz],
+ ['20111008 180420' + tz3, '2011-10-08T18:' + minutesForTz3 + ':20.000' + tz],
+ ['20111008 180420,1' + tz2, '2011-10-08T18:04:20.100' + tz],
+ ['20111008 180420,11' + tz2, '2011-10-08T18:04:20.110' + tz],
+ ['20111008 180420,111' + tz2, '2011-10-08T18:04:20.111' + tz],
+ ['2011W40', '2011-10-03T00:00:00.000' + tz],
+ ['2011W406', '2011-10-08T00:00:00.000' + tz],
+ ['2011W406T18', '2011-10-08T18:00:00.000' + tz],
+ ['2011W406T1804', '2011-10-08T18:04:00.000' + tz],
+ ['2011W406T180420', '2011-10-08T18:04:20.000' + tz],
+ ['2011W406 1804' + tz2, '2011-10-08T18:04:00.000' + tz],
+ ['2011W406T1804' + tz, '2011-10-08T18:04:00.000' + tz],
+ ['2011W406T180420' + tz, '2011-10-08T18:04:20.000' + tz],
+ ['2011W406T1804' + tz2, '2011-10-08T18:04:00.000' + tz],
+ ['2011W406T180420' + tz2, '2011-10-08T18:04:20.000' + tz],
+ ['2011W406T1804' + tz3, '2011-10-08T18:' + minutesForTz3 + ':00.000' + tz],
+ ['2011W406T180420' + tz3, '2011-10-08T18:' + minutesForTz3 + ':20.000' + tz],
+ ['2011W406T180420,1' + tz2, '2011-10-08T18:04:20.100' + tz],
+ ['2011W406T180420,11' + tz2, '2011-10-08T18:04:20.110' + tz],
+ ['2011W406T180420,111' + tz2, '2011-10-08T18:04:20.111' + tz],
+ ['2011W406 18', '2011-10-08T18:00:00.000' + tz],
+ ['2011W406 1804', '2011-10-08T18:04:00.000' + tz],
+ ['2011W406 180420', '2011-10-08T18:04:20.000' + tz],
+ ['2011W406 1804' + tz, '2011-10-08T18:04:00.000' + tz],
+ ['2011W406 180420' + tz, '2011-10-08T18:04:20.000' + tz],
+ ['2011W406 180420' + tz2, '2011-10-08T18:04:20.000' + tz],
+ ['2011W406 1804' + tz3, '2011-10-08T18:' + minutesForTz3 + ':00.000' + tz],
+ ['2011W406 180420' + tz3, '2011-10-08T18:' + minutesForTz3 + ':20.000' + tz],
+ ['2011W406 180420,1' + tz2, '2011-10-08T18:04:20.100' + tz],
+ ['2011W406 180420,11' + tz2, '2011-10-08T18:04:20.110' + tz],
+ ['2011W406 180420,111' + tz2, '2011-10-08T18:04:20.111' + tz],
+ ['2011281', '2011-10-08T00:00:00.000' + tz],
+ ['2011281T18', '2011-10-08T18:00:00.000' + tz],
+ ['2011281T1804', '2011-10-08T18:04:00.000' + tz],
+ ['2011281T180420', '2011-10-08T18:04:20.000' + tz],
+ ['2011281T1804' + tz, '2011-10-08T18:04:00.000' + tz],
+ ['2011281T180420' + tz, '2011-10-08T18:04:20.000' + tz],
+ ['2011281T1804' + tz2, '2011-10-08T18:04:00.000' + tz],
+ ['2011281T180420' + tz2, '2011-10-08T18:04:20.000' + tz],
+ ['2011281T1804' + tz3, '2011-10-08T18:' + minutesForTz3 + ':00.000' + tz],
+ ['2011281T180420' + tz3, '2011-10-08T18:' + minutesForTz3 + ':20.000' + tz],
+ ['2011281T180420,1' + tz2, '2011-10-08T18:04:20.100' + tz],
+ ['2011281T180420,11' + tz2, '2011-10-08T18:04:20.110' + tz],
+ ['2011281T180420,111' + tz2, '2011-10-08T18:04:20.111' + tz],
+ ['2011281 18', '2011-10-08T18:00:00.000' + tz],
+ ['2011281 1804', '2011-10-08T18:04:00.000' + tz],
+ ['2011281 180420', '2011-10-08T18:04:20.000' + tz],
+ ['2011281 1804' + tz, '2011-10-08T18:04:00.000' + tz],
+ ['2011281 180420' + tz, '2011-10-08T18:04:20.000' + tz],
+ ['2011281 1804' + tz2, '2011-10-08T18:04:00.000' + tz],
+ ['2011281 180420' + tz2, '2011-10-08T18:04:20.000' + tz],
+ ['2011281 1804' + tz3, '2011-10-08T18:' + minutesForTz3 + ':00.000' + tz],
+ ['2011281 180420' + tz3, '2011-10-08T18:' + minutesForTz3 + ':20.000' + tz],
+ ['2011281 180420,1' + tz2, '2011-10-08T18:04:20.100' + tz],
+ ['2011281 180420,11' + tz2, '2011-10-08T18:04:20.110' + tz],
+ ['2011281 180420,111' + tz2, '2011-10-08T18:04:20.111' + tz]
+ ], i;
+ for (i = 0; i < formats.length; i++) {
+ assert.equal(moment(formats[i][0]).format('YYYY-MM-DDTHH:mm:ss.SSSZ'),
+ formats[i][1], 'moment should be able to parse ISO ' + formats[i][0]);
+ assert.equal(moment(formats[i][0], moment.ISO_8601).format('YYYY-MM-DDTHH:mm:ss.SSSZ'),
+ formats[i][1], 'moment should be able to parse specified ISO ' + formats[i][0]);
+ assert.equal(moment(formats[i][0], moment.ISO_8601, true).format('YYYY-MM-DDTHH:mm:ss.SSSZ'),
+ formats[i][1], 'moment should be able to parse specified strict ISO ' + formats[i][0]);
+ }
+});
+
+test('non iso 8601 strings', function (assert) {
+ assert.ok(!moment('2015-10T10:15', moment.ISO_8601, true).isValid(), 'incomplete date with time');
+ assert.ok(!moment('2015-W10T10:15', moment.ISO_8601, true).isValid(), 'incomplete week date with time');
+ assert.ok(!moment('201510', moment.ISO_8601, true).isValid(), 'basic YYYYMM is not allowed');
+ assert.ok(!moment('2015W10T1015', moment.ISO_8601, true).isValid(), 'incomplete week date with time (basic)');
+ assert.ok(!moment('2015-10-08T1015', moment.ISO_8601, true).isValid(), 'mixing extended and basic format');
+ assert.ok(!moment('20151008T10:15', moment.ISO_8601, true).isValid(), 'mixing basic and extended format');
+ assert.ok(!moment('2015-10-1', moment.ISO_8601, true).isValid(), 'missing zero padding for day');
+});
+
+test('parsing iso week year/week/weekday', function (assert) {
+ assert.equal(moment.utc('2007-W01').format(), '2007-01-01T00:00:00Z', '2008 week 1 (1st Jan Mon)');
+ assert.equal(moment.utc('2008-W01').format(), '2007-12-31T00:00:00Z', '2008 week 1 (1st Jan Tue)');
+ assert.equal(moment.utc('2003-W01').format(), '2002-12-30T00:00:00Z', '2008 week 1 (1st Jan Wed)');
+ assert.equal(moment.utc('2009-W01').format(), '2008-12-29T00:00:00Z', '2009 week 1 (1st Jan Thu)');
+ assert.equal(moment.utc('2010-W01').format(), '2010-01-04T00:00:00Z', '2010 week 1 (1st Jan Fri)');
+ assert.equal(moment.utc('2011-W01').format(), '2011-01-03T00:00:00Z', '2011 week 1 (1st Jan Sat)');
+ assert.equal(moment.utc('2012-W01').format(), '2012-01-02T00:00:00Z', '2012 week 1 (1st Jan Sun)');
+});
+
+test('parsing week year/week/weekday (dow 1, doy 4)', function (assert) {
+ moment.locale('dow:1,doy:4', {week: {dow: 1, doy: 4}});
+
+ assert.equal(moment.utc('2007-01', 'gggg-ww').format(), '2007-01-01T00:00:00Z', '2007 week 1 (1st Jan Mon)');
+ assert.equal(moment.utc('2008-01', 'gggg-ww').format(), '2007-12-31T00:00:00Z', '2008 week 1 (1st Jan Tue)');
+ assert.equal(moment.utc('2003-01', 'gggg-ww').format(), '2002-12-30T00:00:00Z', '2003 week 1 (1st Jan Wed)');
+ assert.equal(moment.utc('2009-01', 'gggg-ww').format(), '2008-12-29T00:00:00Z', '2009 week 1 (1st Jan Thu)');
+ assert.equal(moment.utc('2010-01', 'gggg-ww').format(), '2010-01-04T00:00:00Z', '2010 week 1 (1st Jan Fri)');
+ assert.equal(moment.utc('2011-01', 'gggg-ww').format(), '2011-01-03T00:00:00Z', '2011 week 1 (1st Jan Sat)');
+ assert.equal(moment.utc('2012-01', 'gggg-ww').format(), '2012-01-02T00:00:00Z', '2012 week 1 (1st Jan Sun)');
+
+ moment.defineLocale('dow:1,doy:4', null);
+});
+
+test('parsing week year/week/weekday (dow 1, doy 7)', function (assert) {
+ moment.locale('dow:1,doy:7', {week: {dow: 1, doy: 7}});
+
+ assert.equal(moment.utc('2007-01', 'gggg-ww').format(), '2007-01-01T00:00:00Z', '2007 week 1 (1st Jan Mon)');
+ assert.equal(moment.utc('2008-01', 'gggg-ww').format(), '2007-12-31T00:00:00Z', '2008 week 1 (1st Jan Tue)');
+ assert.equal(moment.utc('2003-01', 'gggg-ww').format(), '2002-12-30T00:00:00Z', '2003 week 1 (1st Jan Wed)');
+ assert.equal(moment.utc('2009-01', 'gggg-ww').format(), '2008-12-29T00:00:00Z', '2009 week 1 (1st Jan Thu)');
+ assert.equal(moment.utc('2010-01', 'gggg-ww').format(), '2009-12-28T00:00:00Z', '2010 week 1 (1st Jan Fri)');
+ assert.equal(moment.utc('2011-01', 'gggg-ww').format(), '2010-12-27T00:00:00Z', '2011 week 1 (1st Jan Sat)');
+ assert.equal(moment.utc('2012-01', 'gggg-ww').format(), '2011-12-26T00:00:00Z', '2012 week 1 (1st Jan Sun)');
+ moment.defineLocale('dow:1,doy:7', null);
+});
+
+test('parsing week year/week/weekday (dow 0, doy 6)', function (assert) {
+ moment.locale('dow:0,doy:6', {week: {dow: 0, doy: 6}});
+
+ assert.equal(moment.utc('2007-01', 'gggg-ww').format(), '2006-12-31T00:00:00Z', '2007 week 1 (1st Jan Mon)');
+ assert.equal(moment.utc('2008-01', 'gggg-ww').format(), '2007-12-30T00:00:00Z', '2008 week 1 (1st Jan Tue)');
+ assert.equal(moment.utc('2003-01', 'gggg-ww').format(), '2002-12-29T00:00:00Z', '2003 week 1 (1st Jan Wed)');
+ assert.equal(moment.utc('2009-01', 'gggg-ww').format(), '2008-12-28T00:00:00Z', '2009 week 1 (1st Jan Thu)');
+ assert.equal(moment.utc('2010-01', 'gggg-ww').format(), '2009-12-27T00:00:00Z', '2010 week 1 (1st Jan Fri)');
+ assert.equal(moment.utc('2011-01', 'gggg-ww').format(), '2010-12-26T00:00:00Z', '2011 week 1 (1st Jan Sat)');
+ assert.equal(moment.utc('2012-01', 'gggg-ww').format(), '2012-01-01T00:00:00Z', '2012 week 1 (1st Jan Sun)');
+ moment.defineLocale('dow:0,doy:6', null);
+});
+
+test('parsing week year/week/weekday (dow 6, doy 12)', function (assert) {
+ moment.locale('dow:6,doy:12', {week: {dow: 6, doy: 12}});
+
+ assert.equal(moment.utc('2007-01', 'gggg-ww').format(), '2006-12-30T00:00:00Z', '2007 week 1 (1st Jan Mon)');
+ assert.equal(moment.utc('2008-01', 'gggg-ww').format(), '2007-12-29T00:00:00Z', '2008 week 1 (1st Jan Tue)');
+ assert.equal(moment.utc('2003-01', 'gggg-ww').format(), '2002-12-28T00:00:00Z', '2003 week 1 (1st Jan Wed)');
+ assert.equal(moment.utc('2009-01', 'gggg-ww').format(), '2008-12-27T00:00:00Z', '2009 week 1 (1st Jan Thu)');
+ assert.equal(moment.utc('2010-01', 'gggg-ww').format(), '2009-12-26T00:00:00Z', '2010 week 1 (1st Jan Fri)');
+ assert.equal(moment.utc('2011-01', 'gggg-ww').format(), '2011-01-01T00:00:00Z', '2011 week 1 (1st Jan Sat)');
+ assert.equal(moment.utc('2012-01', 'gggg-ww').format(), '2011-12-31T00:00:00Z', '2012 week 1 (1st Jan Sun)');
+ moment.defineLocale('dow:6,doy:12', null);
+});
+
+test('parsing ISO with Z', function (assert) {
+ var i, mom, formats = [
+ ['2011-10-08T18:04', '2011-10-08T18:04:00.000'],
+ ['2011-10-08T18:04:20', '2011-10-08T18:04:20.000'],
+ ['2011-10-08T18:04:20.1', '2011-10-08T18:04:20.100'],
+ ['2011-10-08T18:04:20.11', '2011-10-08T18:04:20.110'],
+ ['2011-10-08T18:04:20.111', '2011-10-08T18:04:20.111'],
+ ['2011-W40-6T18', '2011-10-08T18:00:00.000'],
+ ['2011-W40-6T18:04', '2011-10-08T18:04:00.000'],
+ ['2011-W40-6T18:04:20', '2011-10-08T18:04:20.000'],
+ ['2011-W40-6T18:04:20.1', '2011-10-08T18:04:20.100'],
+ ['2011-W40-6T18:04:20.11', '2011-10-08T18:04:20.110'],
+ ['2011-W40-6T18:04:20.111', '2011-10-08T18:04:20.111'],
+ ['2011-281T18', '2011-10-08T18:00:00.000'],
+ ['2011-281T18:04', '2011-10-08T18:04:00.000'],
+ ['2011-281T18:04:20', '2011-10-08T18:04:20.000'],
+ ['2011-281T18:04:20', '2011-10-08T18:04:20.000'],
+ ['2011-281T18:04:20.1', '2011-10-08T18:04:20.100'],
+ ['2011-281T18:04:20.11', '2011-10-08T18:04:20.110'],
+ ['2011-281T18:04:20.111', '2011-10-08T18:04:20.111']
+ ];
+
+ for (i = 0; i < formats.length; i++) {
+ mom = moment(formats[i][0] + 'Z').utc();
+ assert.equal(mom.format('YYYY-MM-DDTHH:mm:ss.SSS'), formats[i][1], 'moment should be able to parse ISO in UTC ' + formats[i][0] + 'Z');
+
+ mom = moment(formats[i][0] + ' Z').utc();
+ assert.equal(mom.format('YYYY-MM-DDTHH:mm:ss.SSS'), formats[i][1], 'moment should be able to parse ISO in UTC ' + formats[i][0] + ' Z');
+ }
+});
+
+test('parsing iso with T', function (assert) {
+ assert.equal(moment('2011-10-08T18')._f, 'YYYY-MM-DDTHH', 'should include \'T\' in the format');
+ assert.equal(moment('2011-10-08T18:20')._f, 'YYYY-MM-DDTHH:mm', 'should include \'T\' in the format');
+ assert.equal(moment('2011-10-08T18:20:13')._f, 'YYYY-MM-DDTHH:mm:ss', 'should include \'T\' in the format');
+ assert.equal(moment('2011-10-08T18:20:13.321')._f, 'YYYY-MM-DDTHH:mm:ss.SSSS', 'should include \'T\' in the format');
+
+ assert.equal(moment('2011-10-08 18')._f, 'YYYY-MM-DD HH', 'should not include \'T\' in the format');
+ assert.equal(moment('2011-10-08 18:20')._f, 'YYYY-MM-DD HH:mm', 'should not include \'T\' in the format');
+ assert.equal(moment('2011-10-08 18:20:13')._f, 'YYYY-MM-DD HH:mm:ss', 'should not include \'T\' in the format');
+ assert.equal(moment('2011-10-08 18:20:13.321')._f, 'YYYY-MM-DD HH:mm:ss.SSSS', 'should not include \'T\' in the format');
+});
+
+test('parsing iso Z timezone', function (assert) {
+ var i,
+ formats = [
+ ['2011-10-08T18:04Z', '2011-10-08T18:04:00.000+00:00'],
+ ['2011-10-08T18:04:20Z', '2011-10-08T18:04:20.000+00:00'],
+ ['2011-10-08T18:04:20.111Z', '2011-10-08T18:04:20.111+00:00']
+ ];
+ for (i = 0; i < formats.length; i++) {
+ assert.equal(moment.utc(formats[i][0]).format('YYYY-MM-DDTHH:mm:ss.SSSZ'), formats[i][1], 'moment should be able to parse ISO ' + formats[i][0]);
+ }
+});
+
+test('parsing iso Z timezone into local', function (assert) {
+ var m = moment('2011-10-08T18:04:20.111Z');
+
+ assert.equal(m.utc().format('YYYY-MM-DDTHH:mm:ss.SSS'), '2011-10-08T18:04:20.111', 'moment should be able to parse ISO 2011-10-08T18:04:20.111Z');
+});
+
+test('parsing iso with more subsecond precision digits', function (assert) {
+ assert.equal(moment.utc('2013-07-31T22:00:00.0000000Z').format(), '2013-07-31T22:00:00Z', 'more than 3 subsecond digits');
+});
+
+test('null or empty', function (assert) {
+ assert.equal(moment('').isValid(), false, 'moment(\'\') is not valid');
+ assert.equal(moment(null).isValid(), false, 'moment(null) is not valid');
+ assert.equal(moment(null, 'YYYY-MM-DD').isValid(), false, 'moment(\'\', \'format\') is not valid');
+ assert.equal(moment('', 'YYYY-MM-DD').isValid(), false, 'moment(\'\', \'format\') is not valid');
+ assert.equal(moment.utc('').isValid(), false, 'moment.utc(\'\') is not valid');
+ assert.equal(moment.utc(null).isValid(), false, 'moment.utc(null) is not valid');
+ assert.equal(moment.utc(null, 'YYYY-MM-DD').isValid(), false, 'moment.utc(null) is not valid');
+ assert.equal(moment.utc('', 'YYYY-MM-DD').isValid(), false, 'moment.utc(\'\', \'YYYY-MM-DD\') is not valid');
+});
+
+test('first century', function (assert) {
+ assert.equal(moment([0, 0, 1]).format('YYYY-MM-DD'), '0000-01-01', 'Year AD 0');
+ assert.equal(moment([99, 0, 1]).format('YYYY-MM-DD'), '0099-01-01', 'Year AD 99');
+ assert.equal(moment([999, 0, 1]).format('YYYY-MM-DD'), '0999-01-01', 'Year AD 999');
+ assert.equal(moment('0 1 1', 'YYYY MM DD').format('YYYY-MM-DD'), '0000-01-01', 'Year AD 0');
+ assert.equal(moment('999 1 1', 'YYYY MM DD').format('YYYY-MM-DD'), '0999-01-01', 'Year AD 999');
+ assert.equal(moment('0 1 1', 'YYYYY MM DD').format('YYYYY-MM-DD'), '00000-01-01', 'Year AD 0');
+ assert.equal(moment('99 1 1', 'YYYYY MM DD').format('YYYYY-MM-DD'), '00099-01-01', 'Year AD 99');
+ assert.equal(moment('999 1 1', 'YYYYY MM DD').format('YYYYY-MM-DD'), '00999-01-01', 'Year AD 999');
+});
+
+test('six digit years', function (assert) {
+ assert.equal(moment([-270000, 0, 1]).format('YYYYY-MM-DD'), '-270000-01-01', 'format BC 270,001');
+ assert.equal(moment([270000, 0, 1]).format('YYYYY-MM-DD'), '270000-01-01', 'format AD 270,000');
+ assert.equal(moment('-270000-01-01', 'YYYYY-MM-DD').toDate().getFullYear(), -270000, 'parse BC 270,001');
+ assert.equal(moment('270000-01-01', 'YYYYY-MM-DD').toDate().getFullYear(), 270000, 'parse AD 270,000');
+ assert.equal(moment('+270000-01-01', 'YYYYY-MM-DD').toDate().getFullYear(), 270000, 'parse AD +270,000');
+ assert.equal(moment.utc('-270000-01-01', 'YYYYY-MM-DD').toDate().getUTCFullYear(), -270000, 'parse utc BC 270,001');
+ assert.equal(moment.utc('270000-01-01', 'YYYYY-MM-DD').toDate().getUTCFullYear(), 270000, 'parse utc AD 270,000');
+ assert.equal(moment.utc('+270000-01-01', 'YYYYY-MM-DD').toDate().getUTCFullYear(), 270000, 'parse utc AD +270,000');
+});
+
+test('negative four digit years', function (assert) {
+ assert.equal(moment('-1000-01-01', 'YYYYY-MM-DD').toDate().getFullYear(), -1000, 'parse BC 1,001');
+ assert.equal(moment.utc('-1000-01-01', 'YYYYY-MM-DD').toDate().getUTCFullYear(), -1000, 'parse utc BC 1,001');
+});
+
+test('strict parsing', function (assert) {
+ assert.equal(moment('2014-', 'YYYY-Q', true).isValid(), false, 'fail missing quarter');
+
+ assert.equal(moment('2012-05', 'YYYY-MM', true).format('YYYY-MM'), '2012-05', 'parse correct string');
+ assert.equal(moment(' 2012-05', 'YYYY-MM', true).isValid(), false, 'fail on extra whitespace');
+ assert.equal(moment('foo 2012-05', '[foo] YYYY-MM', true).format('YYYY-MM'), '2012-05', 'handle fixed text');
+ assert.equal(moment('2012 05', 'YYYY-MM', true).isValid(), false, 'fail on different separator');
+ assert.equal(moment('2012 05', 'YYYY MM DD', true).isValid(), false, 'fail on too many tokens');
+
+ assert.equal(moment('05 30 2010', ['DD MM YYYY', 'MM DD YYYY'], true).format('MM DD YYYY'), '05 30 2010', 'array with bad date');
+ assert.equal(moment('05 30 2010', ['', 'MM DD YYYY'], true).format('MM DD YYYY'), '05 30 2010', 'array with invalid format');
+ assert.equal(moment('05 30 2010', [' DD MM YYYY', 'MM DD YYYY'], true).format('MM DD YYYY'), '05 30 2010', 'array with non-matching format');
+
+ assert.equal(moment('2010.*...', 'YYYY.*', true).isValid(), false, 'invalid format with regex chars');
+ assert.equal(moment('2010.*', 'YYYY.*', true).year(), 2010, 'valid format with regex chars');
+ assert.equal(moment('.*2010.*', '.*YYYY.*', true).year(), 2010, 'valid format with regex chars on both sides');
+
+ //strict tokens
+ assert.equal(moment('-5-05-25', 'YYYY-MM-DD', true).isValid(), false, 'invalid negative year');
+ assert.equal(moment('2-05-25', 'YYYY-MM-DD', true).isValid(), false, 'invalid one-digit year');
+ assert.equal(moment('20-05-25', 'YYYY-MM-DD', true).isValid(), false, 'invalid two-digit year');
+ assert.equal(moment('201-05-25', 'YYYY-MM-DD', true).isValid(), false, 'invalid three-digit year');
+ assert.equal(moment('2010-05-25', 'YYYY-MM-DD', true).isValid(), true, 'valid four-digit year');
+ assert.equal(moment('22010-05-25', 'YYYY-MM-DD', true).isValid(), false, 'invalid five-digit year');
+
+ assert.equal(moment('12-05-25', 'YY-MM-DD', true).isValid(), true, 'valid two-digit year');
+ assert.equal(moment('2012-05-25', 'YY-MM-DD', true).isValid(), false, 'invalid four-digit year');
+
+ assert.equal(moment('-5-05-25', 'Y-MM-DD', true).isValid(), true, 'valid negative year');
+ assert.equal(moment('2-05-25', 'Y-MM-DD', true).isValid(), true, 'valid one-digit year');
+ assert.equal(moment('20-05-25', 'Y-MM-DD', true).isValid(), true, 'valid two-digit year');
+ assert.equal(moment('201-05-25', 'Y-MM-DD', true).isValid(), true, 'valid three-digit year');
+
+ assert.equal(moment('2012-5-25', 'YYYY-M-DD', true).isValid(), true, 'valid one-digit month');
+ assert.equal(moment('2012-5-25', 'YYYY-MM-DD', true).isValid(), false, 'invalid one-digit month');
+ assert.equal(moment('2012-05-25', 'YYYY-M-DD', true).isValid(), true, 'valid one-digit month');
+ assert.equal(moment('2012-05-25', 'YYYY-MM-DD', true).isValid(), true, 'valid one-digit month');
+
+ assert.equal(moment('2012-05-2', 'YYYY-MM-D', true).isValid(), true, 'valid one-digit day');
+ assert.equal(moment('2012-05-2', 'YYYY-MM-DD', true).isValid(), false, 'invalid one-digit day');
+ assert.equal(moment('2012-05-02', 'YYYY-MM-D', true).isValid(), true, 'valid two-digit day');
+ assert.equal(moment('2012-05-02', 'YYYY-MM-DD', true).isValid(), true, 'valid two-digit day');
+
+ assert.equal(moment('+002012-05-25', 'YYYYY-MM-DD', true).isValid(), true, 'valid six-digit year');
+ assert.equal(moment('+2012-05-25', 'YYYYY-MM-DD', true).isValid(), false, 'invalid four-digit year');
+
+ //thse are kinda pointless, but they should work as expected
+ assert.equal(moment('1', 'S', true).isValid(), true, 'valid one-digit milisecond');
+ assert.equal(moment('12', 'S', true).isValid(), false, 'invalid two-digit milisecond');
+ assert.equal(moment('123', 'S', true).isValid(), false, 'invalid three-digit milisecond');
+
+ assert.equal(moment('1', 'SS', true).isValid(), false, 'invalid one-digit milisecond');
+ assert.equal(moment('12', 'SS', true).isValid(), true, 'valid two-digit milisecond');
+ assert.equal(moment('123', 'SS', true).isValid(), false, 'invalid three-digit milisecond');
+
+ assert.equal(moment('1', 'SSS', true).isValid(), false, 'invalid one-digit milisecond');
+ assert.equal(moment('12', 'SSS', true).isValid(), false, 'invalid two-digit milisecond');
+ assert.equal(moment('123', 'SSS', true).isValid(), true, 'valid three-digit milisecond');
+
+ // strict parsing respects month length
+ assert.ok(moment('1 January 2000', 'D MMMM YYYY', true).isValid(), 'capital long-month + MMMM');
+ assert.ok(!moment('1 January 2000', 'D MMM YYYY', true).isValid(), 'capital long-month + MMM');
+ assert.ok(!moment('1 Jan 2000', 'D MMMM YYYY', true).isValid(), 'capital short-month + MMMM');
+ assert.ok(moment('1 Jan 2000', 'D MMM YYYY', true).isValid(), 'capital short-month + MMM');
+ assert.ok(moment('1 january 2000', 'D MMMM YYYY', true).isValid(), 'lower long-month + MMMM');
+ assert.ok(!moment('1 january 2000', 'D MMM YYYY', true).isValid(), 'lower long-month + MMM');
+ assert.ok(!moment('1 jan 2000', 'D MMMM YYYY', true).isValid(), 'lower short-month + MMMM');
+ assert.ok(moment('1 jan 2000', 'D MMM YYYY', true).isValid(), 'lower short-month + MMM');
+});
+
+test('parsing into a locale', function (assert) {
+ moment.defineLocale('parselocale', {
+ months : 'one_two_three_four_five_six_seven_eight_nine_ten_eleven_twelve'.split('_'),
+ monthsShort : 'one_two_three_four_five_six_seven_eight_nine_ten_eleven_twelve'.split('_')
+ });
+
+ moment.locale('en');
+
+ assert.equal(moment('2012 seven', 'YYYY MMM', 'parselocale').month(), 6, 'should be able to parse in a specific locale');
+
+ moment.locale('parselocale');
+
+ assert.equal(moment('2012 july', 'YYYY MMM', 'en').month(), 6, 'should be able to parse in a specific locale');
+
+ moment.defineLocale('parselocale', null);
+});
+
+function getVerifier(test$$1) {
+ return function (input, format, expected, description, asymetrical) {
+ var m = moment(input, format);
+ test$$1.equal(m.format('YYYY MM DD'), expected, 'compare: ' + description);
+
+ //test round trip
+ if (!asymetrical) {
+ test$$1.equal(m.format(format), input, 'round trip: ' + description);
+ }
+ };
+}
+
+test('parsing week and weekday information', function (assert) {
+ var ver = getVerifier(assert);
+ var currentWeekOfYear = moment().weeks();
+ var expectedDate2012 = moment([2012, 0, 1])
+ .day(0)
+ .add((currentWeekOfYear - 1), 'weeks')
+ .format('YYYY MM DD');
+ var expectedDate1999 = moment([1999, 0, 1])
+ .day(0)
+ .add((currentWeekOfYear - 1), 'weeks')
+ .format('YYYY MM DD');
+
+ // year
+ ver('12', 'gg', expectedDate2012, 'week-year two digits');
+ ver('2012', 'gggg', expectedDate2012, 'week-year four digits');
+ ver('99', 'gg', expectedDate1999, 'week-year two digits previous year');
+ ver('1999', 'gggg', expectedDate1999, 'week-year four digits previous year');
+
+ ver('99', 'GG', '1999 01 04', 'iso week-year two digits');
+ ver('1999', 'GGGG', '1999 01 04', 'iso week-year four digits');
+
+ ver('13', 'GG', '2012 12 31', 'iso week-year two digits previous year');
+ ver('2013', 'GGGG', '2012 12 31', 'iso week-year four digits previous year');
+
+ // year + week
+ ver('1999 37', 'gggg w', '1999 09 05', 'week');
+ ver('1999 37', 'gggg ww', '1999 09 05', 'week double');
+ ver('1999 37', 'GGGG W', '1999 09 13', 'iso week');
+ ver('1999 37', 'GGGG WW', '1999 09 13', 'iso week double');
+
+ ver('1999 37 4', 'GGGG WW E', '1999 09 16', 'iso day');
+ ver('1999 37 04', 'GGGG WW E', '1999 09 16', 'iso day wide', true);
+
+ ver('1999 37 4', 'gggg ww e', '1999 09 09', 'day');
+ ver('1999 37 04', 'gggg ww e', '1999 09 09', 'day wide', true);
+
+ // year + week + day
+ ver('1999 37 4', 'gggg ww d', '1999 09 09', 'd');
+ ver('1999 37 Th', 'gggg ww dd', '1999 09 09', 'dd');
+ ver('1999 37 Thu', 'gggg ww ddd', '1999 09 09', 'ddd');
+ ver('1999 37 Thursday', 'gggg ww dddd', '1999 09 09', 'dddd');
+
+ // lower-order only
+ assert.equal(moment('22', 'ww').week(), 22, 'week sets the week by itself');
+ assert.equal(moment('22', 'ww').weekYear(), moment().weekYear(), 'week keeps this year');
+ assert.equal(moment('2012 22', 'YYYY ww').weekYear(), 2012, 'week keeps parsed year');
+
+ assert.equal(moment('22', 'WW').isoWeek(), 22, 'iso week sets the week by itself');
+ assert.equal(moment('2012 22', 'YYYY WW').weekYear(), 2012, 'iso week keeps parsed year');
+ assert.equal(moment('22', 'WW').isoWeekYear(), moment().isoWeekYear(), 'iso week keeps this year');
+
+ // order
+ ver('6 2013 2', 'e gggg w', '2013 01 12', 'order doesn\'t matter');
+ ver('6 2013 2', 'E GGGG W', '2013 01 12', 'iso order doesn\'t matter');
+
+ //can parse other stuff too
+ assert.equal(moment('1999-W37-4 3:30', 'GGGG-[W]WW-E HH:mm').format('YYYY MM DD HH:mm'), '1999 09 16 03:30', 'parsing weeks and hours');
+
+ // In safari, all years before 1300 are shifted back with one day.
+ // http://stackoverflow.com/questions/20768975/safari-subtracts-1-day-from-dates-before-1300
+ if (new Date('1300-01-01').getUTCFullYear() === 1300) {
+ // Years less than 100
+ ver('0098-06', 'GGGG-WW', '0098 02 03', 'small years work', true);
+ }
+});
+
+test('parsing localized weekdays', function (assert) {
+ var ver = getVerifier(assert);
+ try {
+ moment.locale('dow:1,doy:4', {
+ weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
+ weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
+ weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
+ week: {dow: 1, doy: 4}
+ });
+ ver('1999 37 4', 'GGGG WW E', '1999 09 16', 'iso ignores locale');
+ ver('1999 37 7', 'GGGG WW E', '1999 09 19', 'iso ignores locale');
+
+ ver('1999 37 0', 'gggg ww e', '1999 09 13', 'localized e uses local doy and dow: 0 = monday');
+ ver('1999 37 4', 'gggg ww e', '1999 09 17', 'localized e uses local doy and dow: 4 = friday');
+
+ ver('1999 37 1', 'gggg ww d', '1999 09 13', 'localized d uses 0-indexed days: 1 = monday');
+ ver('1999 37 Lu', 'gggg ww dd', '1999 09 13', 'localized d uses 0-indexed days: Mo');
+ ver('1999 37 lun.', 'gggg ww ddd', '1999 09 13', 'localized d uses 0-indexed days: Mon');
+ ver('1999 37 lundi', 'gggg ww dddd', '1999 09 13', 'localized d uses 0-indexed days: Monday');
+ ver('1999 37 4', 'gggg ww d', '1999 09 16', 'localized d uses 0-indexed days: 4');
+
+ //sunday goes at the end of the week
+ ver('1999 37 0', 'gggg ww d', '1999 09 19', 'localized d uses 0-indexed days: 0 = sund');
+ ver('1999 37 Di', 'gggg ww dd', '1999 09 19', 'localized d uses 0-indexed days: 0 = sund');
+ }
+ finally {
+ moment.defineLocale('dow:1,doy:4', null);
+ moment.locale('en');
+ }
+});
+
+test('parsing with customized two-digit year', function (assert) {
+ var original = moment.parseTwoDigitYear;
+ try {
+ assert.equal(moment('68', 'YY').year(), 2068);
+ assert.equal(moment('69', 'YY').year(), 1969);
+ moment.parseTwoDigitYear = function (input) {
+ return +input + (+input > 30 ? 1900 : 2000);
+ };
+ assert.equal(moment('68', 'YY').year(), 1968);
+ assert.equal(moment('67', 'YY').year(), 1967);
+ assert.equal(moment('31', 'YY').year(), 1931);
+ assert.equal(moment('30', 'YY').year(), 2030);
+ }
+ finally {
+ moment.parseTwoDigitYear = original;
+ }
+});
+
+test('array with strings', function (assert) {
+ assert.equal(moment(['2014', '7', '31']).isValid(), true, 'string array + isValid');
+});
+
+test('object with strings', function (assert) {
+ assert.equal(moment({year: '2014', month: '7', day: '31'}).isValid(), true, 'string object + isValid');
+});
+
+test('utc with array of formats', function (assert) {
+ assert.equal(moment.utc('2014-01-01', ['YYYY-MM-DD', 'YYYY-MM']).format(), '2014-01-01T00:00:00Z', 'moment.utc works with array of formats');
+});
+
+test('parsing invalid string weekdays', function (assert) {
+ assert.equal(false, moment('a', 'dd').isValid(),
+ 'dd with invalid weekday, non-strict');
+ assert.equal(false, moment('a', 'dd', true).isValid(),
+ 'dd with invalid weekday, strict');
+ assert.equal(false, moment('a', 'ddd').isValid(),
+ 'ddd with invalid weekday, non-strict');
+ assert.equal(false, moment('a', 'ddd', true).isValid(),
+ 'ddd with invalid weekday, strict');
+ assert.equal(false, moment('a', 'dddd').isValid(),
+ 'dddd with invalid weekday, non-strict');
+ assert.equal(false, moment('a', 'dddd', true).isValid(),
+ 'dddd with invalid weekday, strict');
+});
+
+test('milliseconds', function (assert) {
+ assert.equal(moment('1', 'S').millisecond(), 100);
+ assert.equal(moment('12', 'SS').millisecond(), 120);
+ assert.equal(moment('123', 'SSS').millisecond(), 123);
+ assert.equal(moment('1234', 'SSSS').millisecond(), 123);
+ assert.equal(moment('12345', 'SSSSS').millisecond(), 123);
+ assert.equal(moment('123456', 'SSSSSS').millisecond(), 123);
+ assert.equal(moment('1234567', 'SSSSSSS').millisecond(), 123);
+ assert.equal(moment('12345678', 'SSSSSSSS').millisecond(), 123);
+ assert.equal(moment('123456789', 'SSSSSSSSS').millisecond(), 123);
+});
+
+test('hmm', function (assert) {
+ assert.equal(moment('123', 'hmm', true).format('HH:mm:ss'), '01:23:00', '123 with hmm');
+ assert.equal(moment('123a', 'hmmA', true).format('HH:mm:ss'), '01:23:00', '123a with hmmA');
+ assert.equal(moment('123p', 'hmmA', true).format('HH:mm:ss'), '13:23:00', '123p with hmmA');
+
+ assert.equal(moment('1234', 'hmm', true).format('HH:mm:ss'), '12:34:00', '1234 with hmm');
+ assert.equal(moment('1234a', 'hmmA', true).format('HH:mm:ss'), '00:34:00', '1234a with hmmA');
+ assert.equal(moment('1234p', 'hmmA', true).format('HH:mm:ss'), '12:34:00', '1234p with hmmA');
+
+ assert.equal(moment('12345', 'hmmss', true).format('HH:mm:ss'), '01:23:45', '12345 with hmmss');
+ assert.equal(moment('12345a', 'hmmssA', true).format('HH:mm:ss'), '01:23:45', '12345a with hmmssA');
+ assert.equal(moment('12345p', 'hmmssA', true).format('HH:mm:ss'), '13:23:45', '12345p with hmmssA');
+ assert.equal(moment('112345', 'hmmss', true).format('HH:mm:ss'), '11:23:45', '112345 with hmmss');
+ assert.equal(moment('112345a', 'hmmssA', true).format('HH:mm:ss'), '11:23:45', '112345a with hmmssA');
+ assert.equal(moment('112345p', 'hmmssA', true).format('HH:mm:ss'), '23:23:45', '112345p with hmmssA');
+
+ assert.equal(moment('023', 'Hmm', true).format('HH:mm:ss'), '00:23:00', '023 with Hmm');
+ assert.equal(moment('123', 'Hmm', true).format('HH:mm:ss'), '01:23:00', '123 with Hmm');
+ assert.equal(moment('1234', 'Hmm', true).format('HH:mm:ss'), '12:34:00', '1234 with Hmm');
+ assert.equal(moment('1534', 'Hmm', true).format('HH:mm:ss'), '15:34:00', '1234 with Hmm');
+ assert.equal(moment('12345', 'Hmmss', true).format('HH:mm:ss'), '01:23:45', '12345 with Hmmss');
+ assert.equal(moment('112345', 'Hmmss', true).format('HH:mm:ss'), '11:23:45', '112345 with Hmmss');
+ assert.equal(moment('172345', 'Hmmss', true).format('HH:mm:ss'), '17:23:45', '112345 with Hmmss');
+});
+
+test('Y token', function (assert) {
+ assert.equal(moment('1-1-2010', 'M-D-Y', true).year(), 2010, 'parsing Y');
+});
+
+test('parsing flags retain parsed date parts', function (assert) {
+ var a = moment('10 p', 'hh:mm a');
+ assert.equal(a.parsingFlags().parsedDateParts[3], 10, 'parsed 10 as the hour');
+ assert.equal(a.parsingFlags().parsedDateParts[0], undefined, 'year was not parsed');
+ assert.equal(a.parsingFlags().meridiem, 'p', 'meridiem flag was added');
+ var b = moment('10:30', ['MMDDYY', 'HH:mm']);
+ assert.equal(b.parsingFlags().parsedDateParts[3], 10, 'multiple format parshing matched hour');
+ assert.equal(b.parsingFlags().parsedDateParts[0], undefined, 'array is properly copied, no residual data from first token parse');
+});
+
+test('parsing only meridiem results in invalid date', function (assert) {
+ assert.ok(!moment('alkj', 'hh:mm a').isValid(), 'because an a token is used, a meridiem will be parsed but nothing else was so invalid');
+ assert.ok(moment('02:30 p more extra stuff', 'hh:mm a').isValid(), 'because other tokens were parsed, date is valid');
+ assert.ok(moment('1/1/2016 extra data', ['a', 'M/D/YYYY']).isValid(), 'took second format, does not pick up on meridiem parsed from first format (good copy)');
+});
+
+test('invalid dates return invalid for methods that access the _d prop', function (assert) {
+ var momentAsDate = moment(['2015', '12', '1']).toDate();
+ assert.ok(momentAsDate instanceof Date, 'toDate returns a Date object');
+ assert.ok(isNaN(momentAsDate.getTime()), 'toDate returns an invalid Date invalid');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('creation data');
+
+test('valid date', function (assert) {
+ var dat = moment('1992-10-22');
+ var orig = dat.creationData();
+
+ assert.equal(dat.isValid(), true, '1992-10-22 is valid');
+ assert.equal(orig.input, '1992-10-22', 'original input is not correct.');
+ assert.equal(orig.format, 'YYYY-MM-DD', 'original format is defined.');
+ assert.equal(orig.locale._abbr, 'en', 'default locale is en');
+ assert.equal(orig.isUTC, false, 'not a UTC date');
+});
+
+test('valid date at fr locale', function (assert) {
+ var dat = moment('1992-10-22', 'YYYY-MM-DD', 'fr');
+ var orig = dat.creationData();
+
+ assert.equal(orig.locale._abbr, 'fr', 'locale is fr');
+});
+
+test('valid date with formats', function (assert) {
+ var dat = moment('29-06-1995', ['MM-DD-YYYY', 'DD-MM', 'DD-MM-YYYY']);
+ var orig = dat.creationData();
+
+ assert.equal(orig.format, 'DD-MM-YYYY', 'DD-MM-YYYY format is defined.');
+});
+
+test('strict', function (assert) {
+ assert.ok(moment('2015-01-02', 'YYYY-MM-DD', true).creationData().strict, 'strict is true');
+ assert.ok(!moment('2015-01-02', 'YYYY-MM-DD').creationData().strict, 'strict is true');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('days in month');
+
+test('days in month', function (assert) {
+ each([31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], function (days, i) {
+ var firstDay = moment([2012, i]),
+ lastDay = moment([2012, i, days]);
+ assert.equal(firstDay.daysInMonth(), days, firstDay.format('L') + ' should have ' + days + ' days.');
+ assert.equal(lastDay.daysInMonth(), days, lastDay.format('L') + ' should have ' + days + ' days.');
+ });
+});
+
+test('days in month leap years', function (assert) {
+ assert.equal(moment([2010, 1]).daysInMonth(), 28, 'Feb 2010 should have 28 days');
+ assert.equal(moment([2100, 1]).daysInMonth(), 28, 'Feb 2100 should have 28 days');
+ assert.equal(moment([2008, 1]).daysInMonth(), 29, 'Feb 2008 should have 29 days');
+ assert.equal(moment([2000, 1]).daysInMonth(), 29, 'Feb 2000 should have 29 days');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+function hasOwnProp(a, b) {
+ return Object.prototype.hasOwnProperty.call(a, b);
+}
+
+function extend(a, b) {
+ for (var i in b) {
+ if (hasOwnProp(b, i)) {
+ a[i] = b[i];
+ }
+ }
+
+ if (hasOwnProp(b, 'toString')) {
+ a.toString = b.toString;
+ }
+
+ if (hasOwnProp(b, 'valueOf')) {
+ a.valueOf = b.valueOf;
+ }
+
+ return a;
+}
+
+var hookCallback;
+
+function hooks () {
+ return hookCallback.apply(null, arguments);
+}
+
+function warn(msg) {
+ if (hooks.suppressDeprecationWarnings === false &&
+ (typeof console !== 'undefined') && console.warn) {
+ console.warn('Deprecation warning: ' + msg);
+ }
+}
+
+function deprecate(msg, fn) {
+ var firstTime = true;
+
+ return extend(function () {
+ if (hooks.deprecationHandler != null) {
+ hooks.deprecationHandler(null, msg);
+ }
+ if (firstTime) {
+ var args = [];
+ var arg;
+ for (var i = 0; i < arguments.length; i++) {
+ arg = '';
+ if (typeof arguments[i] === 'object') {
+ arg += '\n[' + i + '] ';
+ for (var key in arguments[0]) {
+ arg += key + ': ' + arguments[0][key] + ', ';
+ }
+ arg = arg.slice(0, -2); // Remove trailing comma and space
+ } else {
+ arg = arguments[i];
+ }
+ args.push(arg);
+ }
+ warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack);
+ firstTime = false;
+ }
+ return fn.apply(this, arguments);
+ }, fn);
+}
+
+var deprecations = {};
+
+
+
+hooks.suppressDeprecationWarnings = false;
+hooks.deprecationHandler = null;
+
+module$1('deprecate');
+
+test('deprecate', function (assert) {
+ // NOTE: hooks inside deprecate.js and moment are different, so this is can
+ // not be test.expectedDeprecations(...)
+ var fn = function () {};
+ var deprecatedFn = deprecate('testing deprecation', fn);
+ deprecatedFn();
+
+ expect(0);
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+function equal(assert, a, b, message) {
+ assert.ok(Math.abs(a - b) < 0.00000001, '(' + a + ' === ' + b + ') ' + message);
+}
+
+function dstForYear(year) {
+ var start = moment([year]),
+ end = moment([year + 1]),
+ current = start.clone(),
+ last;
+
+ while (current < end) {
+ last = current.clone();
+ current.add(24, 'hour');
+ if (last.utcOffset() !== current.utcOffset()) {
+ end = current.clone();
+ current = last.clone();
+ break;
+ }
+ }
+
+ while (current < end) {
+ last = current.clone();
+ current.add(1, 'hour');
+ if (last.utcOffset() !== current.utcOffset()) {
+ return {
+ moment : last,
+ diff : -(current.utcOffset() - last.utcOffset()) / 60
+ };
+ }
+ }
+}
+
+module$1('diff');
+
+test('diff', function (assert) {
+ assert.equal(moment(1000).diff(0), 1000, '1 second - 0 = 1000');
+ assert.equal(moment(1000).diff(500), 500, '1 second - 0.5 seconds = 500');
+ assert.equal(moment(0).diff(1000), -1000, '0 - 1 second = -1000');
+ assert.equal(moment(new Date(1000)).diff(1000), 0, '1 second - 1 second = 0');
+ var oneHourDate = new Date(2015, 5, 21),
+ nowDate = new Date(+oneHourDate);
+ oneHourDate.setHours(oneHourDate.getHours() + 1);
+ assert.equal(moment(oneHourDate).diff(nowDate), 60 * 60 * 1000, '1 hour from now = 3600000');
+});
+
+test('diff key after', function (assert) {
+ assert.equal(moment([2010]).diff([2011], 'years'), -1, 'year diff');
+ assert.equal(moment([2010]).diff([2010, 2], 'months'), -2, 'month diff');
+ assert.equal(moment([2010]).diff([2010, 0, 7], 'weeks'), 0, 'week diff');
+ assert.equal(moment([2010]).diff([2010, 0, 8], 'weeks'), -1, 'week diff');
+ assert.equal(moment([2010]).diff([2010, 0, 21], 'weeks'), -2, 'week diff');
+ assert.equal(moment([2010]).diff([2010, 0, 22], 'weeks'), -3, 'week diff');
+ assert.equal(moment([2010]).diff([2010, 0, 4], 'days'), -3, 'day diff');
+ assert.equal(moment([2010]).diff([2010, 0, 1, 4], 'hours'), -4, 'hour diff');
+ assert.equal(moment([2010]).diff([2010, 0, 1, 0, 5], 'minutes'), -5, 'minute diff');
+ assert.equal(moment([2010]).diff([2010, 0, 1, 0, 0, 6], 'seconds'), -6, 'second diff');
+});
+
+test('diff key before', function (assert) {
+ assert.equal(moment([2011]).diff([2010], 'years'), 1, 'year diff');
+ assert.equal(moment([2010, 2]).diff([2010], 'months'), 2, 'month diff');
+ assert.equal(moment([2010, 0, 4]).diff([2010], 'days'), 3, 'day diff');
+ assert.equal(moment([2010, 0, 7]).diff([2010], 'weeks'), 0, 'week diff');
+ assert.equal(moment([2010, 0, 8]).diff([2010], 'weeks'), 1, 'week diff');
+ assert.equal(moment([2010, 0, 21]).diff([2010], 'weeks'), 2, 'week diff');
+ assert.equal(moment([2010, 0, 22]).diff([2010], 'weeks'), 3, 'week diff');
+ assert.equal(moment([2010, 0, 1, 4]).diff([2010], 'hours'), 4, 'hour diff');
+ assert.equal(moment([2010, 0, 1, 0, 5]).diff([2010], 'minutes'), 5, 'minute diff');
+ assert.equal(moment([2010, 0, 1, 0, 0, 6]).diff([2010], 'seconds'), 6, 'second diff');
+});
+
+test('diff key before singular', function (assert) {
+ assert.equal(moment([2011]).diff([2010], 'year'), 1, 'year diff singular');
+ assert.equal(moment([2010, 2]).diff([2010], 'month'), 2, 'month diff singular');
+ assert.equal(moment([2010, 0, 4]).diff([2010], 'day'), 3, 'day diff singular');
+ assert.equal(moment([2010, 0, 7]).diff([2010], 'week'), 0, 'week diff singular');
+ assert.equal(moment([2010, 0, 8]).diff([2010], 'week'), 1, 'week diff singular');
+ assert.equal(moment([2010, 0, 21]).diff([2010], 'week'), 2, 'week diff singular');
+ assert.equal(moment([2010, 0, 22]).diff([2010], 'week'), 3, 'week diff singular');
+ assert.equal(moment([2010, 0, 1, 4]).diff([2010], 'hour'), 4, 'hour diff singular');
+ assert.equal(moment([2010, 0, 1, 0, 5]).diff([2010], 'minute'), 5, 'minute diff singular');
+ assert.equal(moment([2010, 0, 1, 0, 0, 6]).diff([2010], 'second'), 6, 'second diff singular');
+});
+
+test('diff key before abbreviated', function (assert) {
+ assert.equal(moment([2011]).diff([2010], 'y'), 1, 'year diff abbreviated');
+ assert.equal(moment([2010, 2]).diff([2010], 'M'), 2, 'month diff abbreviated');
+ assert.equal(moment([2010, 0, 4]).diff([2010], 'd'), 3, 'day diff abbreviated');
+ assert.equal(moment([2010, 0, 7]).diff([2010], 'w'), 0, 'week diff abbreviated');
+ assert.equal(moment([2010, 0, 8]).diff([2010], 'w'), 1, 'week diff abbreviated');
+ assert.equal(moment([2010, 0, 21]).diff([2010], 'w'), 2, 'week diff abbreviated');
+ assert.equal(moment([2010, 0, 22]).diff([2010], 'w'), 3, 'week diff abbreviated');
+ assert.equal(moment([2010, 0, 1, 4]).diff([2010], 'h'), 4, 'hour diff abbreviated');
+ assert.equal(moment([2010, 0, 1, 0, 5]).diff([2010], 'm'), 5, 'minute diff abbreviated');
+ assert.equal(moment([2010, 0, 1, 0, 0, 6]).diff([2010], 's'), 6, 'second diff abbreviated');
+});
+
+test('diff month', function (assert) {
+ assert.equal(moment([2011, 0, 31]).diff([2011, 2, 1], 'months'), -1, 'month diff');
+});
+
+test('diff across DST', function (assert) {
+ var dst = dstForYear(2012), a, b, daysInMonth;
+ if (!dst) {
+ assert.equal(42, 42, 'at least one assertion');
+ return;
+ }
+
+ a = dst.moment;
+ b = a.clone().utc().add(12, 'hours').local();
+ daysInMonth = (a.daysInMonth() + b.daysInMonth()) / 2;
+ assert.equal(b.diff(a, 'milliseconds', true), 12 * 60 * 60 * 1000,
+ 'ms diff across DST');
+ assert.equal(b.diff(a, 'seconds', true), 12 * 60 * 60,
+ 'second diff across DST');
+ assert.equal(b.diff(a, 'minutes', true), 12 * 60,
+ 'minute diff across DST');
+ assert.equal(b.diff(a, 'hours', true), 12,
+ 'hour diff across DST');
+ assert.equal(b.diff(a, 'days', true), (12 - dst.diff) / 24,
+ 'day diff across DST');
+ equal(assert, b.diff(a, 'weeks', true), (12 - dst.diff) / 24 / 7,
+ 'week diff across DST');
+ assert.ok(0.95 / (2 * 31) < b.diff(a, 'months', true),
+ 'month diff across DST, lower bound');
+ assert.ok(b.diff(a, 'month', true) < 1.05 / (2 * 28),
+ 'month diff across DST, upper bound');
+ assert.ok(0.95 / (2 * 31 * 12) < b.diff(a, 'years', true),
+ 'year diff across DST, lower bound');
+ assert.ok(b.diff(a, 'year', true) < 1.05 / (2 * 28 * 12),
+ 'year diff across DST, upper bound');
+
+ a = dst.moment;
+ b = a.clone().utc().add(12 + dst.diff, 'hours').local();
+ daysInMonth = (a.daysInMonth() + b.daysInMonth()) / 2;
+
+ assert.equal(b.diff(a, 'milliseconds', true),
+ (12 + dst.diff) * 60 * 60 * 1000,
+ 'ms diff across DST');
+ assert.equal(b.diff(a, 'seconds', true), (12 + dst.diff) * 60 * 60,
+ 'second diff across DST');
+ assert.equal(b.diff(a, 'minutes', true), (12 + dst.diff) * 60,
+ 'minute diff across DST');
+ assert.equal(b.diff(a, 'hours', true), (12 + dst.diff),
+ 'hour diff across DST');
+ assert.equal(b.diff(a, 'days', true), 12 / 24, 'day diff across DST');
+ equal(assert, b.diff(a, 'weeks', true), 12 / 24 / 7,
+ 'week diff across DST');
+ assert.ok(0.95 / (2 * 31) < b.diff(a, 'months', true),
+ 'month diff across DST, lower bound');
+ assert.ok(b.diff(a, 'month', true) < 1.05 / (2 * 28),
+ 'month diff across DST, upper bound');
+ assert.ok(0.95 / (2 * 31 * 12) < b.diff(a, 'years', true),
+ 'year diff across DST, lower bound');
+ assert.ok(b.diff(a, 'year', true) < 1.05 / (2 * 28 * 12),
+ 'year diff across DST, upper bound');
+});
+
+test('diff overflow', function (assert) {
+ assert.equal(moment([2011]).diff([2010], 'months'), 12, 'month diff');
+ assert.equal(moment([2010, 0, 2]).diff([2010], 'hours'), 24, 'hour diff');
+ assert.equal(moment([2010, 0, 1, 2]).diff([2010], 'minutes'), 120, 'minute diff');
+ assert.equal(moment([2010, 0, 1, 0, 4]).diff([2010], 'seconds'), 240, 'second diff');
+});
+
+test('diff between utc and local', function (assert) {
+ if (moment([2012]).utcOffset() === moment([2011]).utcOffset()) {
+ // Russia's utc offset on 1st of Jan 2012 vs 2011 is different
+ assert.equal(moment([2012]).utc().diff([2011], 'years'), 1, 'year diff');
+ }
+ assert.equal(moment([2010, 2, 2]).utc().diff([2010, 0, 2], 'months'), 2, 'month diff');
+ assert.equal(moment([2010, 0, 4]).utc().diff([2010], 'days'), 3, 'day diff');
+ assert.equal(moment([2010, 0, 22]).utc().diff([2010], 'weeks'), 3, 'week diff');
+ assert.equal(moment([2010, 0, 1, 4]).utc().diff([2010], 'hours'), 4, 'hour diff');
+ assert.equal(moment([2010, 0, 1, 0, 5]).utc().diff([2010], 'minutes'), 5, 'minute diff');
+ assert.equal(moment([2010, 0, 1, 0, 0, 6]).utc().diff([2010], 'seconds'), 6, 'second diff');
+});
+
+test('diff floored', function (assert) {
+ assert.equal(moment([2010, 0, 1, 23]).diff([2010], 'day'), 0, '23 hours = 0 days');
+ assert.equal(moment([2010, 0, 1, 23, 59]).diff([2010], 'day'), 0, '23:59 hours = 0 days');
+ assert.equal(moment([2010, 0, 1, 24]).diff([2010], 'day'), 1, '24 hours = 1 day');
+ assert.equal(moment([2010, 0, 2]).diff([2011, 0, 1], 'year'), 0, 'year rounded down');
+ assert.equal(moment([2011, 0, 1]).diff([2010, 0, 2], 'year'), 0, 'year rounded down');
+ assert.equal(moment([2010, 0, 2]).diff([2011, 0, 2], 'year'), -1, 'year rounded down');
+ assert.equal(moment([2011, 0, 2]).diff([2010, 0, 2], 'year'), 1, 'year rounded down');
+});
+
+test('year diffs include dates', function (assert) {
+ assert.ok(moment([2012, 1, 19]).diff(moment([2002, 1, 20]), 'years', true) < 10, 'year diff should include date of month');
+});
+
+test('month diffs', function (assert) {
+ // due to floating point math errors, these tests just need to be accurate within 0.00000001
+ assert.equal(moment([2012, 0, 1]).diff([2012, 1, 1], 'months', true), -1, 'Jan 1 to Feb 1 should be 1 month');
+ equal(assert, moment([2012, 0, 1]).diff([2012, 0, 1, 12], 'months', true), -0.5 / 31, 'Jan 1 to Jan 1 noon should be 0.5 / 31 months');
+ assert.equal(moment([2012, 0, 15]).diff([2012, 1, 15], 'months', true), -1, 'Jan 15 to Feb 15 should be 1 month');
+ assert.equal(moment([2012, 0, 28]).diff([2012, 1, 28], 'months', true), -1, 'Jan 28 to Feb 28 should be 1 month');
+ assert.ok(moment([2012, 0, 31]).diff([2012, 1, 29], 'months', true), -1, 'Jan 31 to Feb 29 should be 1 month');
+ assert.ok(-1 > moment([2012, 0, 31]).diff([2012, 2, 1], 'months', true), 'Jan 31 to Mar 1 should be more than 1 month');
+ assert.ok(-30 / 28 < moment([2012, 0, 31]).diff([2012, 2, 1], 'months', true), 'Jan 31 to Mar 1 should be less than 1 month and 1 day');
+ equal(assert, moment([2012, 0, 1]).diff([2012, 0, 31], 'months', true), -(30 / 31), 'Jan 1 to Jan 31 should be 30 / 31 months');
+ assert.ok(0 < moment('2014-02-01').diff(moment('2014-01-31'), 'months', true), 'jan-31 to feb-1 diff is positive');
+});
+
+test('exact month diffs', function (assert) {
+ // generate all pairs of months and compute month diff, with fixed day
+ // of month = 15.
+
+ var m1, m2;
+ for (m1 = 0; m1 < 12; ++m1) {
+ for (m2 = m1; m2 < 12; ++m2) {
+ assert.equal(moment([2013, m2, 15]).diff(moment([2013, m1, 15]), 'months', true), m2 - m1,
+ 'month diff from 2013-' + m1 + '-15 to 2013-' + m2 + '-15');
+ }
+ }
+});
+
+test('year diffs', function (assert) {
+ // due to floating point math errors, these tests just need to be accurate within 0.00000001
+ equal(assert, moment([2012, 0, 1]).diff([2013, 0, 1], 'years', true), -1, 'Jan 1 2012 to Jan 1 2013 should be 1 year');
+ equal(assert, moment([2012, 1, 28]).diff([2013, 1, 28], 'years', true), -1, 'Feb 28 2012 to Feb 28 2013 should be 1 year');
+ equal(assert, moment([2012, 2, 1]).diff([2013, 2, 1], 'years', true), -1, 'Mar 1 2012 to Mar 1 2013 should be 1 year');
+ equal(assert, moment([2012, 11, 1]).diff([2013, 11, 1], 'years', true), -1, 'Dec 1 2012 to Dec 1 2013 should be 1 year');
+ equal(assert, moment([2012, 11, 31]).diff([2013, 11, 31], 'years', true), -1, 'Dec 31 2012 to Dec 31 2013 should be 1 year');
+ equal(assert, moment([2012, 0, 1]).diff([2013, 6, 1], 'years', true), -1.5, 'Jan 1 2012 to Jul 1 2013 should be 1.5 years');
+ equal(assert, moment([2012, 0, 31]).diff([2013, 6, 31], 'years', true), -1.5, 'Jan 31 2012 to Jul 31 2013 should be 1.5 years');
+ equal(assert, moment([2012, 0, 1]).diff([2013, 0, 1, 12], 'years', true), -1 - (0.5 / 31) / 12, 'Jan 1 2012 to Jan 1 2013 noon should be 1+(0.5 / 31) / 12 years');
+ equal(assert, moment([2012, 0, 1]).diff([2013, 6, 1, 12], 'years', true), -1.5 - (0.5 / 31) / 12, 'Jan 1 2012 to Jul 1 2013 noon should be 1.5+(0.5 / 31) / 12 years');
+ equal(assert, moment([2012, 1, 29]).diff([2013, 1, 28], 'years', true), -1, 'Feb 29 2012 to Feb 28 2013 should be 1-(1 / 28.5) / 12 years');
+});
+
+test('negative zero', function (assert) {
+ function isNegative (n) {
+ return (1 / n) < 0;
+ }
+ assert.ok(!isNegative(moment([2012, 0, 1]).diff(moment([2012, 0, 1]), 'months')), 'month diff on same date is zero, not -0');
+ assert.ok(!isNegative(moment([2012, 0, 1]).diff(moment([2012, 0, 1]), 'years')), 'year diff on same date is zero, not -0');
+ assert.ok(!isNegative(moment([2012, 0, 1]).diff(moment([2012, 0, 1]), 'quarters')), 'quarter diff on same date is zero, not -0');
+ assert.ok(!isNegative(moment([2012, 0, 1]).diff(moment([2012, 0, 1, 1]), 'days')), 'days diff on same date is zero, not -0');
+ assert.ok(!isNegative(moment([2012, 0, 1]).diff(moment([2012, 0, 1, 0, 1]), 'hours')), 'hour diff on same hour is zero, not -0');
+ assert.ok(!isNegative(moment([2012, 0, 1]).diff(moment([2012, 0, 1, 0, 0, 1]), 'minutes')), 'minute diff on same minute is zero, not -0');
+ assert.ok(!isNegative(moment([2012, 0, 1]).diff(moment([2012, 0, 1, 0, 0, 0, 1]), 'seconds')), 'second diff on same second is zero, not -0');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('duration');
+
+test('object instantiation', function (assert) {
+ var d = moment.duration({
+ years: 2,
+ months: 3,
+ weeks: 2,
+ days: 1,
+ hours: 8,
+ minutes: 9,
+ seconds: 20,
+ milliseconds: 12
+ });
+
+ assert.equal(d.years(), 2, 'years');
+ assert.equal(d.months(), 3, 'months');
+ assert.equal(d.weeks(), 2, 'weeks');
+ assert.equal(d.days(), 15, 'days'); // two weeks + 1 day
+ assert.equal(d.hours(), 8, 'hours');
+ assert.equal(d.minutes(), 9, 'minutes');
+ assert.equal(d.seconds(), 20, 'seconds');
+ assert.equal(d.milliseconds(), 12, 'milliseconds');
+});
+
+test('object instantiation with strings', function (assert) {
+ var d = moment.duration({
+ years: '2',
+ months: '3',
+ weeks: '2',
+ days: '1',
+ hours: '8',
+ minutes: '9',
+ seconds: '20',
+ milliseconds: '12'
+ });
+
+ assert.equal(d.years(), 2, 'years');
+ assert.equal(d.months(), 3, 'months');
+ assert.equal(d.weeks(), 2, 'weeks');
+ assert.equal(d.days(), 15, 'days'); // two weeks + 1 day
+ assert.equal(d.hours(), 8, 'hours');
+ assert.equal(d.minutes(), 9, 'minutes');
+ assert.equal(d.seconds(), 20, 'seconds');
+ assert.equal(d.milliseconds(), 12, 'milliseconds');
+});
+
+test('milliseconds instantiation', function (assert) {
+ assert.equal(moment.duration(72).milliseconds(), 72, 'milliseconds');
+});
+
+test('undefined instantiation', function (assert) {
+ assert.equal(moment.duration(undefined).milliseconds(), 0, 'milliseconds');
+});
+
+test('null instantiation', function (assert) {
+ assert.equal(moment.duration(null).milliseconds(), 0, 'milliseconds');
+});
+
+test('instantiation by type', function (assert) {
+ assert.equal(moment.duration(1, 'years').years(), 1, 'years');
+ assert.equal(moment.duration(1, 'y').years(), 1, 'y');
+ assert.equal(moment.duration(2, 'months').months(), 2, 'months');
+ assert.equal(moment.duration(2, 'M').months(), 2, 'M');
+ assert.equal(moment.duration(3, 'weeks').weeks(), 3, 'weeks');
+ assert.equal(moment.duration(3, 'w').weeks(), 3, 'weeks');
+ assert.equal(moment.duration(4, 'days').days(), 4, 'days');
+ assert.equal(moment.duration(4, 'd').days(), 4, 'd');
+ assert.equal(moment.duration(5, 'hours').hours(), 5, 'hours');
+ assert.equal(moment.duration(5, 'h').hours(), 5, 'h');
+ assert.equal(moment.duration(6, 'minutes').minutes(), 6, 'minutes');
+ assert.equal(moment.duration(6, 'm').minutes(), 6, 'm');
+ assert.equal(moment.duration(7, 'seconds').seconds(), 7, 'seconds');
+ assert.equal(moment.duration(7, 's').seconds(), 7, 's');
+ assert.equal(moment.duration(8, 'milliseconds').milliseconds(), 8, 'milliseconds');
+ assert.equal(moment.duration(8, 'ms').milliseconds(), 8, 'ms');
+});
+
+test('shortcuts', function (assert) {
+ assert.equal(moment.duration({y: 1}).years(), 1, 'years = y');
+ assert.equal(moment.duration({M: 2}).months(), 2, 'months = M');
+ assert.equal(moment.duration({w: 3}).weeks(), 3, 'weeks = w');
+ assert.equal(moment.duration({d: 4}).days(), 4, 'days = d');
+ assert.equal(moment.duration({h: 5}).hours(), 5, 'hours = h');
+ assert.equal(moment.duration({m: 6}).minutes(), 6, 'minutes = m');
+ assert.equal(moment.duration({s: 7}).seconds(), 7, 'seconds = s');
+ assert.equal(moment.duration({ms: 8}).milliseconds(), 8, 'milliseconds = ms');
+});
+
+test('generic getter', function (assert) {
+ assert.equal(moment.duration(1, 'years').get('years'), 1, 'years');
+ assert.equal(moment.duration(1, 'years').get('year'), 1, 'years = year');
+ assert.equal(moment.duration(1, 'years').get('y'), 1, 'years = y');
+ assert.equal(moment.duration(2, 'months').get('months'), 2, 'months');
+ assert.equal(moment.duration(2, 'months').get('month'), 2, 'months = month');
+ assert.equal(moment.duration(2, 'months').get('M'), 2, 'months = M');
+ assert.equal(moment.duration(3, 'weeks').get('weeks'), 3, 'weeks');
+ assert.equal(moment.duration(3, 'weeks').get('week'), 3, 'weeks = week');
+ assert.equal(moment.duration(3, 'weeks').get('w'), 3, 'weeks = w');
+ assert.equal(moment.duration(4, 'days').get('days'), 4, 'days');
+ assert.equal(moment.duration(4, 'days').get('day'), 4, 'days = day');
+ assert.equal(moment.duration(4, 'days').get('d'), 4, 'days = d');
+ assert.equal(moment.duration(5, 'hours').get('hours'), 5, 'hours');
+ assert.equal(moment.duration(5, 'hours').get('hour'), 5, 'hours = hour');
+ assert.equal(moment.duration(5, 'hours').get('h'), 5, 'hours = h');
+ assert.equal(moment.duration(6, 'minutes').get('minutes'), 6, 'minutes');
+ assert.equal(moment.duration(6, 'minutes').get('minute'), 6, 'minutes = minute');
+ assert.equal(moment.duration(6, 'minutes').get('m'), 6, 'minutes = m');
+ assert.equal(moment.duration(7, 'seconds').get('seconds'), 7, 'seconds');
+ assert.equal(moment.duration(7, 'seconds').get('second'), 7, 'seconds = second');
+ assert.equal(moment.duration(7, 'seconds').get('s'), 7, 'seconds = s');
+ assert.equal(moment.duration(8, 'milliseconds').get('milliseconds'), 8, 'milliseconds');
+ assert.equal(moment.duration(8, 'milliseconds').get('millisecond'), 8, 'milliseconds = millisecond');
+ assert.equal(moment.duration(8, 'milliseconds').get('ms'), 8, 'milliseconds = ms');
+});
+
+test('instantiation from another duration', function (assert) {
+ var simple = moment.duration(1234),
+ lengthy = moment.duration(60 * 60 * 24 * 360 * 1e3),
+ complicated = moment.duration({
+ years: 2,
+ months: 3,
+ weeks: 4,
+ days: 1,
+ hours: 8,
+ minutes: 9,
+ seconds: 20,
+ milliseconds: 12
+ }),
+ modified = moment.duration(1, 'day').add(moment.duration(1, 'day'));
+
+ assert.deepEqual(moment.duration(simple), simple, 'simple clones are equal');
+ assert.deepEqual(moment.duration(lengthy), lengthy, 'lengthy clones are equal');
+ assert.deepEqual(moment.duration(complicated), complicated, 'complicated clones are equal');
+ assert.deepEqual(moment.duration(modified), modified, 'cloning modified duration works');
+});
+
+test('instantiation from 24-hour time zero', function (assert) {
+ assert.equal(moment.duration('00:00').years(), 0, '0 years');
+ assert.equal(moment.duration('00:00').days(), 0, '0 days');
+ assert.equal(moment.duration('00:00').hours(), 0, '0 hours');
+ assert.equal(moment.duration('00:00').minutes(), 0, '0 minutes');
+ assert.equal(moment.duration('00:00').seconds(), 0, '0 seconds');
+ assert.equal(moment.duration('00:00').milliseconds(), 0, '0 milliseconds');
+});
+
+test('instantiation from 24-hour time <24 hours', function (assert) {
+ assert.equal(moment.duration('06:45').years(), 0, '0 years');
+ assert.equal(moment.duration('06:45').days(), 0, '0 days');
+ assert.equal(moment.duration('06:45').hours(), 6, '6 hours');
+ assert.equal(moment.duration('06:45').minutes(), 45, '45 minutes');
+ assert.equal(moment.duration('06:45').seconds(), 0, '0 seconds');
+ assert.equal(moment.duration('06:45').milliseconds(), 0, '0 milliseconds');
+});
+
+test('instantiation from 24-hour time >24 hours', function (assert) {
+ assert.equal(moment.duration('26:45').years(), 0, '0 years');
+ assert.equal(moment.duration('26:45').days(), 1, '0 days');
+ assert.equal(moment.duration('26:45').hours(), 2, '2 hours');
+ assert.equal(moment.duration('26:45').minutes(), 45, '45 minutes');
+ assert.equal(moment.duration('26:45').seconds(), 0, '0 seconds');
+ assert.equal(moment.duration('26:45').milliseconds(), 0, '0 milliseconds');
+});
+
+test('instatiation from serialized C# TimeSpan zero', function (assert) {
+ assert.equal(moment.duration('00:00:00').years(), 0, '0 years');
+ assert.equal(moment.duration('00:00:00').days(), 0, '0 days');
+ assert.equal(moment.duration('00:00:00').hours(), 0, '0 hours');
+ assert.equal(moment.duration('00:00:00').minutes(), 0, '0 minutes');
+ assert.equal(moment.duration('00:00:00').seconds(), 0, '0 seconds');
+ assert.equal(moment.duration('00:00:00').milliseconds(), 0, '0 milliseconds');
+});
+
+test('instatiation from serialized C# TimeSpan with days', function (assert) {
+ assert.equal(moment.duration('1.02:03:04.9999999').years(), 0, '0 years');
+ assert.equal(moment.duration('1.02:03:04.9999999').days(), 1, '1 day');
+ assert.equal(moment.duration('1.02:03:04.9999999').hours(), 2, '2 hours');
+ assert.equal(moment.duration('1.02:03:04.9999999').minutes(), 3, '3 minutes');
+ assert.equal(moment.duration('1.02:03:04.9999999').seconds(), 5, '5 seconds');
+ assert.equal(moment.duration('1.02:03:04.9999999').milliseconds(), 0, '0 milliseconds');
+
+ assert.equal(moment.duration('1 02:03:04.9999999').years(), 0, '0 years');
+ assert.equal(moment.duration('1 02:03:04.9999999').days(), 1, '1 day');
+ assert.equal(moment.duration('1 02:03:04.9999999').hours(), 2, '2 hours');
+ assert.equal(moment.duration('1 02:03:04.9999999').minutes(), 3, '3 minutes');
+ assert.equal(moment.duration('1 02:03:04.9999999').seconds(), 5, '5 seconds');
+ assert.equal(moment.duration('1 02:03:04.9999999').milliseconds(), 0, '0 milliseconds');
+});
+
+test('instatiation from serialized C# TimeSpan without days', function (assert) {
+ assert.equal(moment.duration('01:02:03.9999999').years(), 0, '0 years');
+ assert.equal(moment.duration('01:02:03.9999999').days(), 0, '0 days');
+ assert.equal(moment.duration('01:02:03.9999999').hours(), 1, '1 hour');
+ assert.equal(moment.duration('01:02:03.9999999').minutes(), 2, '2 minutes');
+ assert.equal(moment.duration('01:02:03.9999999').seconds(), 4, '4 seconds');
+ assert.equal(moment.duration('01:02:03.9999999').milliseconds(), 0, '0 milliseconds');
+
+ assert.equal(moment.duration('23:59:59.9999999').days(), 1, '1 days');
+ assert.equal(moment.duration('23:59:59.9999999').hours(), 0, '0 hours');
+ assert.equal(moment.duration('23:59:59.9999999').minutes(), 0, '0 minutes');
+ assert.equal(moment.duration('23:59:59.9999999').seconds(), 0, '0 seconds');
+ assert.equal(moment.duration('23:59:59.9999999').milliseconds(), 0, '0 milliseconds');
+
+ assert.equal(moment.duration('500:59:59.8888888').days(), 20, '500 hours overflows to 20 days');
+ assert.equal(moment.duration('500:59:59.8888888').hours(), 20, '500 hours overflows to 20 hours');
+});
+
+test('instatiation from serialized C# TimeSpan without days or milliseconds', function (assert) {
+ assert.equal(moment.duration('01:02:03').years(), 0, '0 years');
+ assert.equal(moment.duration('01:02:03').days(), 0, '0 days');
+ assert.equal(moment.duration('01:02:03').hours(), 1, '1 hour');
+ assert.equal(moment.duration('01:02:03').minutes(), 2, '2 minutes');
+ assert.equal(moment.duration('01:02:03').seconds(), 3, '3 seconds');
+ assert.equal(moment.duration('01:02:03').milliseconds(), 0, '0 milliseconds');
+});
+
+test('instatiation from serialized C# TimeSpan without milliseconds', function (assert) {
+ assert.equal(moment.duration('1.02:03:04').years(), 0, '0 years');
+ assert.equal(moment.duration('1.02:03:04').days(), 1, '1 day');
+ assert.equal(moment.duration('1.02:03:04').hours(), 2, '2 hours');
+ assert.equal(moment.duration('1.02:03:04').minutes(), 3, '3 minutes');
+ assert.equal(moment.duration('1.02:03:04').seconds(), 4, '4 seconds');
+ assert.equal(moment.duration('1.02:03:04').milliseconds(), 0, '0 milliseconds');
+});
+
+test('instantiation from serialized C# TimeSpan with low millisecond precision', function (assert) {
+ assert.equal(moment.duration('00:00:15.72').years(), 0, '0 years');
+ assert.equal(moment.duration('00:00:15.72').days(), 0, '0 days');
+ assert.equal(moment.duration('00:00:15.72').hours(), 0, '0 hours');
+ assert.equal(moment.duration('00:00:15.72').minutes(), 0, '0 minutes');
+ assert.equal(moment.duration('00:00:15.72').seconds(), 15, '15 seconds');
+ assert.equal(moment.duration('00:00:15.72').milliseconds(), 720, '720 milliseconds');
+
+ assert.equal(moment.duration('00:00:15.7').milliseconds(), 700, '700 milliseconds');
+
+ assert.equal(moment.duration('00:00:15.').milliseconds(), 0, '0 milliseconds');
+});
+
+test('instantiation from serialized C# TimeSpan with high millisecond precision', function (assert) {
+ assert.equal(moment.duration('00:00:15.7200000').seconds(), 15, '15 seconds');
+ assert.equal(moment.duration('00:00:15.7200000').milliseconds(), 720, '720 milliseconds');
+
+ assert.equal(moment.duration('00:00:15.7209999').seconds(), 15, '15 seconds');
+ assert.equal(moment.duration('00:00:15.7209999').milliseconds(), 721, '721 milliseconds');
+
+ assert.equal(moment.duration('00:00:15.7205000').seconds(), 15, '15 seconds');
+ assert.equal(moment.duration('00:00:15.7205000').milliseconds(), 721, '721 milliseconds');
+
+ assert.equal(moment.duration('-00:00:15.7205000').seconds(), -15, '15 seconds');
+ assert.equal(moment.duration('-00:00:15.7205000').milliseconds(), -721, '721 milliseconds');
+});
+
+test('instatiation from serialized C# TimeSpan maxValue', function (assert) {
+ var d = moment.duration('10675199.02:48:05.4775807');
+
+ assert.equal(d.years(), 29227, '29227 years');
+ assert.equal(d.months(), 8, '8 months');
+ assert.equal(d.days(), 12, '12 day'); // if you have to change this value -- just do it
+
+ assert.equal(d.hours(), 2, '2 hours');
+ assert.equal(d.minutes(), 48, '48 minutes');
+ assert.equal(d.seconds(), 5, '5 seconds');
+ assert.equal(d.milliseconds(), 478, '478 milliseconds');
+});
+
+test('instatiation from serialized C# TimeSpan minValue', function (assert) {
+ var d = moment.duration('-10675199.02:48:05.4775808');
+
+ assert.equal(d.years(), -29227, '29653 years');
+ assert.equal(d.months(), -8, '8 day');
+ assert.equal(d.days(), -12, '12 day'); // if you have to change this value -- just do it
+
+ assert.equal(d.hours(), -2, '2 hours');
+ assert.equal(d.minutes(), -48, '48 minutes');
+ assert.equal(d.seconds(), -5, '5 seconds');
+ assert.equal(d.milliseconds(), -478, '478 milliseconds');
+});
+
+test('instantiation from ISO 8601 duration', function (assert) {
+ assert.equal(moment.duration('P1Y2M3DT4H5M6S').asSeconds(), moment.duration({y: 1, M: 2, d: 3, h: 4, m: 5, s: 6}).asSeconds(), 'all fields');
+ assert.equal(moment.duration('P3W3D').asSeconds(), moment.duration({w: 3, d: 3}).asSeconds(), 'week and day fields');
+ assert.equal(moment.duration('P1M').asSeconds(), moment.duration({M: 1}).asSeconds(), 'single month field');
+ assert.equal(moment.duration('PT1M').asSeconds(), moment.duration({m: 1}).asSeconds(), 'single minute field');
+ assert.equal(moment.duration('P1MT2H').asSeconds(), moment.duration({M: 1, h: 2}).asSeconds(), 'random fields missing');
+ assert.equal(moment.duration('-P60D').asSeconds(), moment.duration({d: -60}).asSeconds(), 'negative days');
+ assert.equal(moment.duration('PT0.5S').asSeconds(), moment.duration({s: 0.5}).asSeconds(), 'fractional seconds');
+ assert.equal(moment.duration('PT0,5S').asSeconds(), moment.duration({s: 0.5}).asSeconds(), 'fractional seconds (comma)');
+});
+
+test('serialization to ISO 8601 duration strings', function (assert) {
+ assert.equal(moment.duration({y: 1, M: 2, d: 3, h: 4, m: 5, s: 6}).toISOString(), 'P1Y2M3DT4H5M6S', 'all fields');
+ assert.equal(moment.duration({M: -1}).toISOString(), '-P1M', 'one month ago');
+ assert.equal(moment.duration({m: -1}).toISOString(), '-PT1M', 'one minute ago');
+ assert.equal(moment.duration({s: -0.5}).toISOString(), '-PT0.5S', 'one half second ago');
+ assert.equal(moment.duration({y: -0.5, M: 1}).toISOString(), '-P5M', 'a month after half a year ago');
+ assert.equal(moment.duration({}).toISOString(), 'P0D', 'zero duration');
+ assert.equal(moment.duration({M: 16, d:40, s: 86465}).toISOString(), 'P1Y4M40DT24H1M5S', 'all fields');
+});
+
+test('toString acts as toISOString', function (assert) {
+ assert.equal(moment.duration({y: 1, M: 2, d: 3, h: 4, m: 5, s: 6}).toString(), 'P1Y2M3DT4H5M6S', 'all fields');
+ assert.equal(moment.duration({M: -1}).toString(), '-P1M', 'one month ago');
+ assert.equal(moment.duration({m: -1}).toString(), '-PT1M', 'one minute ago');
+ assert.equal(moment.duration({s: -0.5}).toString(), '-PT0.5S', 'one half second ago');
+ assert.equal(moment.duration({y: -0.5, M: 1}).toString(), '-P5M', 'a month after half a year ago');
+ assert.equal(moment.duration({}).toString(), 'P0D', 'zero duration');
+ assert.equal(moment.duration({M: 16, d:40, s: 86465}).toString(), 'P1Y4M40DT24H1M5S', 'all fields');
+});
+
+test('toIsoString deprecation', function (assert) {
+ test.expectedDeprecations('toIsoString()');
+
+ assert.equal(moment.duration({}).toIsoString(), moment.duration({}).toISOString(), 'toIsoString delegates to toISOString');
+});
+
+test('`isodate` (python) test cases', function (assert) {
+ assert.equal(moment.duration('P18Y9M4DT11H9M8S').asSeconds(), moment.duration({y: 18, M: 9, d: 4, h: 11, m: 9, s: 8}).asSeconds(), 'python isodate 1');
+ assert.equal(moment.duration('P2W').asSeconds(), moment.duration({w: 2}).asSeconds(), 'python isodate 2');
+ assert.equal(moment.duration('P3Y6M4DT12H30M5S').asSeconds(), moment.duration({y: 3, M: 6, d: 4, h: 12, m: 30, s: 5}).asSeconds(), 'python isodate 3');
+ assert.equal(moment.duration('P23DT23H').asSeconds(), moment.duration({d: 23, h: 23}).asSeconds(), 'python isodate 4');
+ assert.equal(moment.duration('P4Y').asSeconds(), moment.duration({y: 4}).asSeconds(), 'python isodate 5');
+ assert.equal(moment.duration('P1M').asSeconds(), moment.duration({M: 1}).asSeconds(), 'python isodate 6');
+ assert.equal(moment.duration('PT1M').asSeconds(), moment.duration({m: 1}).asSeconds(), 'python isodate 7');
+ assert.equal(moment.duration('P0.5Y').asSeconds(), moment.duration({y: 0.5}).asSeconds(), 'python isodate 8');
+ assert.equal(moment.duration('PT36H').asSeconds(), moment.duration({h: 36}).asSeconds(), 'python isodate 9');
+ assert.equal(moment.duration('P1DT12H').asSeconds(), moment.duration({d: 1, h: 12}).asSeconds(), 'python isodate 10');
+ assert.equal(moment.duration('-P2W').asSeconds(), moment.duration({w: -2}).asSeconds(), 'python isodate 11');
+ assert.equal(moment.duration('-P2.2W').asSeconds(), moment.duration({w: -2.2}).asSeconds(), 'python isodate 12');
+ assert.equal(moment.duration('P1DT2H3M4S').asSeconds(), moment.duration({d: 1, h: 2, m: 3, s: 4}).asSeconds(), 'python isodate 13');
+ assert.equal(moment.duration('P1DT2H3M').asSeconds(), moment.duration({d: 1, h: 2, m: 3}).asSeconds(), 'python isodate 14');
+ assert.equal(moment.duration('P1DT2H').asSeconds(), moment.duration({d: 1, h: 2}).asSeconds(), 'python isodate 15');
+ assert.equal(moment.duration('PT2H').asSeconds(), moment.duration({h: 2}).asSeconds(), 'python isodate 16');
+ assert.equal(moment.duration('PT2.3H').asSeconds(), moment.duration({h: 2.3}).asSeconds(), 'python isodate 17');
+ assert.equal(moment.duration('PT2H3M4S').asSeconds(), moment.duration({h: 2, m: 3, s: 4}).asSeconds(), 'python isodate 18');
+ assert.equal(moment.duration('PT3M4S').asSeconds(), moment.duration({m: 3, s: 4}).asSeconds(), 'python isodate 19');
+ assert.equal(moment.duration('PT22S').asSeconds(), moment.duration({s: 22}).asSeconds(), 'python isodate 20');
+ assert.equal(moment.duration('PT22.22S').asSeconds(), moment.duration({s: 22.22}).asSeconds(), 'python isodate 21');
+ assert.equal(moment.duration('-P2Y').asSeconds(), moment.duration({y: -2}).asSeconds(), 'python isodate 22');
+ assert.equal(moment.duration('-P3Y6M4DT12H30M5S').asSeconds(), moment.duration({y: -3, M: -6, d: -4, h: -12, m: -30, s: -5}).asSeconds(), 'python isodate 23');
+ assert.equal(moment.duration('-P1DT2H3M4S').asSeconds(), moment.duration({d: -1, h: -2, m: -3, s: -4}).asSeconds(), 'python isodate 24');
+ assert.equal(moment.duration('PT-6H3M').asSeconds(), moment.duration({h: -6, m: 3}).asSeconds(), 'python isodate 25');
+ assert.equal(moment.duration('-PT-6H3M').asSeconds(), moment.duration({h: 6, m: -3}).asSeconds(), 'python isodate 26');
+ assert.equal(moment.duration('-P-3Y-6M-4DT-12H-30M-5S').asSeconds(), moment.duration({y: 3, M: 6, d: 4, h: 12, m: 30, s: 5}).asSeconds(), 'python isodate 27');
+ assert.equal(moment.duration('P-3Y-6M-4DT-12H-30M-5S').asSeconds(), moment.duration({y: -3, M: -6, d: -4, h: -12, m: -30, s: -5}).asSeconds(), 'python isodate 28');
+ assert.equal(moment.duration('-P-2W').asSeconds(), moment.duration({w: 2}).asSeconds(), 'python isodate 29');
+ assert.equal(moment.duration('P-2W').asSeconds(), moment.duration({w: -2}).asSeconds(), 'python isodate 30');
+});
+
+test('ISO 8601 misuse cases', function (assert) {
+ assert.equal(moment.duration('P').asSeconds(), 0, 'lonely P');
+ assert.equal(moment.duration('PT').asSeconds(), 0, 'just P and T');
+ assert.equal(moment.duration('P1H').asSeconds(), 0, 'missing T');
+ assert.equal(moment.duration('P1D1Y').asSeconds(), 0, 'out of order');
+ assert.equal(moment.duration('PT.5S').asSeconds(), 0.5, 'accept no leading zero for decimal');
+ assert.equal(moment.duration('PT1,S').asSeconds(), 1, 'accept trailing decimal separator');
+ assert.equal(moment.duration('PT1M0,,5S').asSeconds(), 60, 'extra decimal separators are ignored as 0');
+});
+
+test('humanize', function (assert) {
+ moment.locale('en');
+ assert.equal(moment.duration({seconds: 44}).humanize(), 'a few seconds', '44 seconds = a few seconds');
+ assert.equal(moment.duration({seconds: 45}).humanize(), 'a minute', '45 seconds = a minute');
+ assert.equal(moment.duration({seconds: 89}).humanize(), 'a minute', '89 seconds = a minute');
+ assert.equal(moment.duration({seconds: 90}).humanize(), '2 minutes', '90 seconds = 2 minutes');
+ assert.equal(moment.duration({minutes: 44}).humanize(), '44 minutes', '44 minutes = 44 minutes');
+ assert.equal(moment.duration({minutes: 45}).humanize(), 'an hour', '45 minutes = an hour');
+ assert.equal(moment.duration({minutes: 89}).humanize(), 'an hour', '89 minutes = an hour');
+ assert.equal(moment.duration({minutes: 90}).humanize(), '2 hours', '90 minutes = 2 hours');
+ assert.equal(moment.duration({hours: 5}).humanize(), '5 hours', '5 hours = 5 hours');
+ assert.equal(moment.duration({hours: 21}).humanize(), '21 hours', '21 hours = 21 hours');
+ assert.equal(moment.duration({hours: 22}).humanize(), 'a day', '22 hours = a day');
+ assert.equal(moment.duration({hours: 35}).humanize(), 'a day', '35 hours = a day');
+ assert.equal(moment.duration({hours: 36}).humanize(), '2 days', '36 hours = 2 days');
+ assert.equal(moment.duration({days: 1}).humanize(), 'a day', '1 day = a day');
+ assert.equal(moment.duration({days: 5}).humanize(), '5 days', '5 days = 5 days');
+ assert.equal(moment.duration({weeks: 1}).humanize(), '7 days', '1 week = 7 days');
+ assert.equal(moment.duration({days: 25}).humanize(), '25 days', '25 days = 25 days');
+ assert.equal(moment.duration({days: 26}).humanize(), 'a month', '26 days = a month');
+ assert.equal(moment.duration({days: 30}).humanize(), 'a month', '30 days = a month');
+ assert.equal(moment.duration({days: 45}).humanize(), 'a month', '45 days = a month');
+ assert.equal(moment.duration({days: 46}).humanize(), '2 months', '46 days = 2 months');
+ assert.equal(moment.duration({days: 74}).humanize(), '2 months', '74 days = 2 months');
+ assert.equal(moment.duration({days: 77}).humanize(), '3 months', '77 days = 3 months');
+ assert.equal(moment.duration({months: 1}).humanize(), 'a month', '1 month = a month');
+ assert.equal(moment.duration({months: 5}).humanize(), '5 months', '5 months = 5 months');
+ assert.equal(moment.duration({days: 344}).humanize(), 'a year', '344 days = a year');
+ assert.equal(moment.duration({days: 345}).humanize(), 'a year', '345 days = a year');
+ assert.equal(moment.duration({days: 547}).humanize(), 'a year', '547 days = a year');
+ assert.equal(moment.duration({days: 548}).humanize(), '2 years', '548 days = 2 years');
+ assert.equal(moment.duration({years: 1}).humanize(), 'a year', '1 year = a year');
+ assert.equal(moment.duration({years: 5}).humanize(), '5 years', '5 years = 5 years');
+ assert.equal(moment.duration(7200000).humanize(), '2 hours', '7200000 = 2 minutes');
+});
+
+test('humanize duration with suffix', function (assert) {
+ moment.locale('en');
+ assert.equal(moment.duration({seconds: 44}).humanize(true), 'in a few seconds', '44 seconds = a few seconds');
+ assert.equal(moment.duration({seconds: -44}).humanize(true), 'a few seconds ago', '44 seconds = a few seconds');
+});
+
+test('bubble value up', function (assert) {
+ assert.equal(moment.duration({milliseconds: 61001}).milliseconds(), 1, '61001 milliseconds has 1 millisecond left over');
+ assert.equal(moment.duration({milliseconds: 61001}).seconds(), 1, '61001 milliseconds has 1 second left over');
+ assert.equal(moment.duration({milliseconds: 61001}).minutes(), 1, '61001 milliseconds has 1 minute left over');
+
+ assert.equal(moment.duration({minutes: 350}).minutes(), 50, '350 minutes has 50 minutes left over');
+ assert.equal(moment.duration({minutes: 350}).hours(), 5, '350 minutes has 5 hours left over');
+});
+
+test('clipping', function (assert) {
+ assert.equal(moment.duration({months: 11}).months(), 11, '11 months is 11 months');
+ assert.equal(moment.duration({months: 11}).years(), 0, '11 months makes no year');
+ assert.equal(moment.duration({months: 12}).months(), 0, '12 months is 0 months left over');
+ assert.equal(moment.duration({months: 12}).years(), 1, '12 months makes 1 year');
+ assert.equal(moment.duration({months: 13}).months(), 1, '13 months is 1 month left over');
+ assert.equal(moment.duration({months: 13}).years(), 1, '13 months makes 1 year');
+
+ assert.equal(moment.duration({days: 30}).days(), 30, '30 days is 30 days');
+ assert.equal(moment.duration({days: 30}).months(), 0, '30 days makes no month');
+ assert.equal(moment.duration({days: 31}).days(), 0, '31 days is 0 days left over');
+ assert.equal(moment.duration({days: 31}).months(), 1, '31 days is a month');
+ assert.equal(moment.duration({days: 32}).days(), 1, '32 days is 1 day left over');
+ assert.equal(moment.duration({days: 32}).months(), 1, '32 days is a month');
+
+ assert.equal(moment.duration({hours: 23}).hours(), 23, '23 hours is 23 hours');
+ assert.equal(moment.duration({hours: 23}).days(), 0, '23 hours makes no day');
+ assert.equal(moment.duration({hours: 24}).hours(), 0, '24 hours is 0 hours left over');
+ assert.equal(moment.duration({hours: 24}).days(), 1, '24 hours makes 1 day');
+ assert.equal(moment.duration({hours: 25}).hours(), 1, '25 hours is 1 hour left over');
+ assert.equal(moment.duration({hours: 25}).days(), 1, '25 hours makes 1 day');
+});
+
+test('bubbling consistency', function (assert) {
+ var days = 0, months = 0, newDays, newMonths, totalDays, d;
+ for (totalDays = 1; totalDays <= 500; ++totalDays) {
+ d = moment.duration(totalDays, 'days');
+ newDays = d.days();
+ newMonths = d.months() + d.years() * 12;
+ assert.ok(
+ (months === newMonths && days + 1 === newDays) ||
+ (months + 1 === newMonths && newDays === 0),
+ 'consistent total days ' + totalDays +
+ ' was ' + months + ' ' + days +
+ ' now ' + newMonths + ' ' + newDays);
+ days = newDays;
+ months = newMonths;
+ }
+});
+
+test('effective equivalency', function (assert) {
+ assert.deepEqual(moment.duration({seconds: 1})._data, moment.duration({milliseconds: 1000})._data, '1 second is the same as 1000 milliseconds');
+ assert.deepEqual(moment.duration({seconds: 60})._data, moment.duration({minutes: 1})._data, '1 minute is the same as 60 seconds');
+ assert.deepEqual(moment.duration({minutes: 60})._data, moment.duration({hours: 1})._data, '1 hour is the same as 60 minutes');
+ assert.deepEqual(moment.duration({hours: 24})._data, moment.duration({days: 1})._data, '1 day is the same as 24 hours');
+ assert.deepEqual(moment.duration({days: 7})._data, moment.duration({weeks: 1})._data, '1 week is the same as 7 days');
+ assert.deepEqual(moment.duration({days: 31})._data, moment.duration({months: 1})._data, '1 month is the same as 30 days');
+ assert.deepEqual(moment.duration({months: 12})._data, moment.duration({years: 1})._data, '1 years is the same as 12 months');
+});
+
+test('asGetters', function (assert) {
+ // 400 years have exactly 146097 days
+
+ // years
+ assert.equal(moment.duration(1, 'year').asYears(), 1, '1 year as years');
+ assert.equal(moment.duration(1, 'year').asMonths(), 12, '1 year as months');
+ assert.equal(moment.duration(400, 'year').asMonths(), 4800, '400 years as months');
+ assert.equal(moment.duration(1, 'year').asWeeks().toFixed(3), 52.143, '1 year as weeks');
+ assert.equal(moment.duration(1, 'year').asDays(), 365, '1 year as days');
+ assert.equal(moment.duration(2, 'year').asDays(), 730, '2 years as days');
+ assert.equal(moment.duration(3, 'year').asDays(), 1096, '3 years as days');
+ assert.equal(moment.duration(4, 'year').asDays(), 1461, '4 years as days');
+ assert.equal(moment.duration(400, 'year').asDays(), 146097, '400 years as days');
+ assert.equal(moment.duration(1, 'year').asHours(), 8760, '1 year as hours');
+ assert.equal(moment.duration(1, 'year').asMinutes(), 525600, '1 year as minutes');
+ assert.equal(moment.duration(1, 'year').asSeconds(), 31536000, '1 year as seconds');
+ assert.equal(moment.duration(1, 'year').asMilliseconds(), 31536000000, '1 year as milliseconds');
+
+ // months
+ assert.equal(moment.duration(1, 'month').asYears().toFixed(4), 0.0833, '1 month as years');
+ assert.equal(moment.duration(1, 'month').asMonths(), 1, '1 month as months');
+ assert.equal(moment.duration(1, 'month').asWeeks().toFixed(3), 4.286, '1 month as weeks');
+ assert.equal(moment.duration(1, 'month').asDays(), 30, '1 month as days');
+ assert.equal(moment.duration(2, 'month').asDays(), 61, '2 months as days');
+ assert.equal(moment.duration(3, 'month').asDays(), 91, '3 months as days');
+ assert.equal(moment.duration(4, 'month').asDays(), 122, '4 months as days');
+ assert.equal(moment.duration(5, 'month').asDays(), 152, '5 months as days');
+ assert.equal(moment.duration(6, 'month').asDays(), 183, '6 months as days');
+ assert.equal(moment.duration(7, 'month').asDays(), 213, '7 months as days');
+ assert.equal(moment.duration(8, 'month').asDays(), 243, '8 months as days');
+ assert.equal(moment.duration(9, 'month').asDays(), 274, '9 months as days');
+ assert.equal(moment.duration(10, 'month').asDays(), 304, '10 months as days');
+ assert.equal(moment.duration(11, 'month').asDays(), 335, '11 months as days');
+ assert.equal(moment.duration(12, 'month').asDays(), 365, '12 months as days');
+ assert.equal(moment.duration(24, 'month').asDays(), 730, '24 months as days');
+ assert.equal(moment.duration(36, 'month').asDays(), 1096, '36 months as days');
+ assert.equal(moment.duration(48, 'month').asDays(), 1461, '48 months as days');
+ assert.equal(moment.duration(4800, 'month').asDays(), 146097, '4800 months as days');
+ assert.equal(moment.duration(1, 'month').asHours(), 720, '1 month as hours');
+ assert.equal(moment.duration(1, 'month').asMinutes(), 43200, '1 month as minutes');
+ assert.equal(moment.duration(1, 'month').asSeconds(), 2592000, '1 month as seconds');
+ assert.equal(moment.duration(1, 'month').asMilliseconds(), 2592000000, '1 month as milliseconds');
+
+ // weeks
+ assert.equal(moment.duration(1, 'week').asYears().toFixed(4), 0.0192, '1 week as years');
+ assert.equal(moment.duration(1, 'week').asMonths().toFixed(3), 0.230, '1 week as months');
+ assert.equal(moment.duration(1, 'week').asWeeks(), 1, '1 week as weeks');
+ assert.equal(moment.duration(1, 'week').asDays(), 7, '1 week as days');
+ assert.equal(moment.duration(1, 'week').asHours(), 168, '1 week as hours');
+ assert.equal(moment.duration(1, 'week').asMinutes(), 10080, '1 week as minutes');
+ assert.equal(moment.duration(1, 'week').asSeconds(), 604800, '1 week as seconds');
+ assert.equal(moment.duration(1, 'week').asMilliseconds(), 604800000, '1 week as milliseconds');
+
+ // days
+ assert.equal(moment.duration(1, 'day').asYears().toFixed(4), 0.0027, '1 day as years');
+ assert.equal(moment.duration(1, 'day').asMonths().toFixed(3), 0.033, '1 day as months');
+ assert.equal(moment.duration(1, 'day').asWeeks().toFixed(3), 0.143, '1 day as weeks');
+ assert.equal(moment.duration(1, 'day').asDays(), 1, '1 day as days');
+ assert.equal(moment.duration(1, 'day').asHours(), 24, '1 day as hours');
+ assert.equal(moment.duration(1, 'day').asMinutes(), 1440, '1 day as minutes');
+ assert.equal(moment.duration(1, 'day').asSeconds(), 86400, '1 day as seconds');
+ assert.equal(moment.duration(1, 'day').asMilliseconds(), 86400000, '1 day as milliseconds');
+
+ // hours
+ assert.equal(moment.duration(1, 'hour').asYears().toFixed(6), 0.000114, '1 hour as years');
+ assert.equal(moment.duration(1, 'hour').asMonths().toFixed(5), 0.00137, '1 hour as months');
+ assert.equal(moment.duration(1, 'hour').asWeeks().toFixed(5), 0.00595, '1 hour as weeks');
+ assert.equal(moment.duration(1, 'hour').asDays().toFixed(4), 0.0417, '1 hour as days');
+ assert.equal(moment.duration(1, 'hour').asHours(), 1, '1 hour as hours');
+ assert.equal(moment.duration(1, 'hour').asMinutes(), 60, '1 hour as minutes');
+ assert.equal(moment.duration(1, 'hour').asSeconds(), 3600, '1 hour as seconds');
+ assert.equal(moment.duration(1, 'hour').asMilliseconds(), 3600000, '1 hour as milliseconds');
+
+ // minutes
+ assert.equal(moment.duration(1, 'minute').asYears().toFixed(8), 0.00000190, '1 minute as years');
+ assert.equal(moment.duration(1, 'minute').asMonths().toFixed(7), 0.0000228, '1 minute as months');
+ assert.equal(moment.duration(1, 'minute').asWeeks().toFixed(7), 0.0000992, '1 minute as weeks');
+ assert.equal(moment.duration(1, 'minute').asDays().toFixed(6), 0.000694, '1 minute as days');
+ assert.equal(moment.duration(1, 'minute').asHours().toFixed(4), 0.0167, '1 minute as hours');
+ assert.equal(moment.duration(1, 'minute').asMinutes(), 1, '1 minute as minutes');
+ assert.equal(moment.duration(1, 'minute').asSeconds(), 60, '1 minute as seconds');
+ assert.equal(moment.duration(1, 'minute').asMilliseconds(), 60000, '1 minute as milliseconds');
+
+ // seconds
+ assert.equal(moment.duration(1, 'second').asYears().toFixed(10), 0.0000000317, '1 second as years');
+ assert.equal(moment.duration(1, 'second').asMonths().toFixed(9), 0.000000380, '1 second as months');
+ assert.equal(moment.duration(1, 'second').asWeeks().toFixed(8), 0.00000165, '1 second as weeks');
+ assert.equal(moment.duration(1, 'second').asDays().toFixed(7), 0.0000116, '1 second as days');
+ assert.equal(moment.duration(1, 'second').asHours().toFixed(6), 0.000278, '1 second as hours');
+ assert.equal(moment.duration(1, 'second').asMinutes().toFixed(4), 0.0167, '1 second as minutes');
+ assert.equal(moment.duration(1, 'second').asSeconds(), 1, '1 second as seconds');
+ assert.equal(moment.duration(1, 'second').asMilliseconds(), 1000, '1 second as milliseconds');
+
+ // milliseconds
+ assert.equal(moment.duration(1, 'millisecond').asYears().toFixed(13), 0.0000000000317, '1 millisecond as years');
+ assert.equal(moment.duration(1, 'millisecond').asMonths().toFixed(12), 0.000000000380, '1 millisecond as months');
+ assert.equal(moment.duration(1, 'millisecond').asWeeks().toFixed(11), 0.00000000165, '1 millisecond as weeks');
+ assert.equal(moment.duration(1, 'millisecond').asDays().toFixed(10), 0.0000000116, '1 millisecond as days');
+ assert.equal(moment.duration(1, 'millisecond').asHours().toFixed(9), 0.000000278, '1 millisecond as hours');
+ assert.equal(moment.duration(1, 'millisecond').asMinutes().toFixed(7), 0.0000167, '1 millisecond as minutes');
+ assert.equal(moment.duration(1, 'millisecond').asSeconds(), 0.001, '1 millisecond as seconds');
+ assert.equal(moment.duration(1, 'millisecond').asMilliseconds(), 1, '1 millisecond as milliseconds');
+});
+
+test('as getters for small units', function (assert) {
+ var dS = moment.duration(1, 'milliseconds'),
+ ds = moment.duration(3, 'seconds'),
+ dm = moment.duration(13, 'minutes');
+
+ // Tests for issue #1867.
+ // Floating point errors for small duration units were introduced in version 2.8.0.
+ assert.equal(dS.as('milliseconds'), 1, 'as("milliseconds")');
+ assert.equal(dS.asMilliseconds(), 1, 'asMilliseconds()');
+ assert.equal(ds.as('seconds'), 3, 'as("seconds")');
+ assert.equal(ds.asSeconds(), 3, 'asSeconds()');
+ assert.equal(dm.as('minutes'), 13, 'as("minutes")');
+ assert.equal(dm.asMinutes(), 13, 'asMinutes()');
+});
+
+test('minutes getter for floating point hours', function (assert) {
+ // Tests for issue #2978.
+ // For certain floating point hours, .minutes() getter produced incorrect values due to the rounding errors
+ assert.equal(moment.duration(2.3, 'h').minutes(), 18, 'minutes()');
+ assert.equal(moment.duration(4.1, 'h').minutes(), 6, 'minutes()');
+});
+
+test('isDuration', function (assert) {
+ assert.ok(moment.isDuration(moment.duration(12345678)), 'correctly says true');
+ assert.ok(!moment.isDuration(moment()), 'moment object is not a duration');
+ assert.ok(!moment.isDuration({milliseconds: 1}), 'plain object is not a duration');
+});
+
+test('add', function (assert) {
+ var d = moment.duration({months: 4, weeks: 3, days: 2});
+ // for some reason, d._data._months does not get updated; use d._months instead.
+ assert.equal(d.add(1, 'month')._months, 5, 'Add months');
+ assert.equal(d.add(5, 'days')._days, 28, 'Add days');
+ assert.equal(d.add(10000)._milliseconds, 10000, 'Add milliseconds');
+ assert.equal(d.add({h: 23, m: 59})._milliseconds, 23 * 60 * 60 * 1000 + 59 * 60 * 1000 + 10000, 'Add hour:minute');
+});
+
+test('add and bubble', function (assert) {
+ var d;
+
+ assert.equal(moment.duration(1, 'second').add(1000, 'milliseconds').seconds(), 2, 'Adding milliseconds should bubble up to seconds');
+ assert.equal(moment.duration(1, 'minute').add(60, 'second').minutes(), 2, 'Adding seconds should bubble up to minutes');
+ assert.equal(moment.duration(1, 'hour').add(60, 'minutes').hours(), 2, 'Adding minutes should bubble up to hours');
+ assert.equal(moment.duration(1, 'day').add(24, 'hours').days(), 2, 'Adding hours should bubble up to days');
+
+ d = moment.duration(-1, 'day').add(1, 'hour');
+ assert.equal(d.hours(), -23, '-1 day + 1 hour == -23 hour (component)');
+ assert.equal(d.asHours(), -23, '-1 day + 1 hour == -23 hours');
+
+ d = moment.duration(-1, 'year').add(1, 'day');
+ assert.equal(d.days(), -30, '- 1 year + 1 day == -30 days (component)');
+ assert.equal(d.months(), -11, '- 1 year + 1 day == -11 months (component)');
+ assert.equal(d.years(), 0, '- 1 year + 1 day == 0 years (component)');
+ assert.equal(d.asDays(), -364, '- 1 year + 1 day == -364 days');
+
+ d = moment.duration(-1, 'year').add(1, 'hour');
+ assert.equal(d.hours(), -23, '- 1 year + 1 hour == -23 hours (component)');
+ assert.equal(d.days(), -30, '- 1 year + 1 hour == -30 days (component)');
+ assert.equal(d.months(), -11, '- 1 year + 1 hour == -11 months (component)');
+ assert.equal(d.years(), 0, '- 1 year + 1 hour == 0 years (component)');
+});
+
+test('subtract and bubble', function (assert) {
+ var d;
+
+ assert.equal(moment.duration(2, 'second').subtract(1000, 'milliseconds').seconds(), 1, 'Subtracting milliseconds should bubble up to seconds');
+ assert.equal(moment.duration(2, 'minute').subtract(60, 'second').minutes(), 1, 'Subtracting seconds should bubble up to minutes');
+ assert.equal(moment.duration(2, 'hour').subtract(60, 'minutes').hours(), 1, 'Subtracting minutes should bubble up to hours');
+ assert.equal(moment.duration(2, 'day').subtract(24, 'hours').days(), 1, 'Subtracting hours should bubble up to days');
+
+ d = moment.duration(1, 'day').subtract(1, 'hour');
+ assert.equal(d.hours(), 23, '1 day - 1 hour == 23 hour (component)');
+ assert.equal(d.asHours(), 23, '1 day - 1 hour == 23 hours');
+
+ d = moment.duration(1, 'year').subtract(1, 'day');
+ assert.equal(d.days(), 30, '1 year - 1 day == 30 days (component)');
+ assert.equal(d.months(), 11, '1 year - 1 day == 11 months (component)');
+ assert.equal(d.years(), 0, '1 year - 1 day == 0 years (component)');
+ assert.equal(d.asDays(), 364, '1 year - 1 day == 364 days');
+
+ d = moment.duration(1, 'year').subtract(1, 'hour');
+ assert.equal(d.hours(), 23, '1 year - 1 hour == 23 hours (component)');
+ assert.equal(d.days(), 30, '1 year - 1 hour == 30 days (component)');
+ assert.equal(d.months(), 11, '1 year - 1 hour == 11 months (component)');
+ assert.equal(d.years(), 0, '1 year - 1 hour == 0 years (component)');
+});
+
+test('subtract', function (assert) {
+ var d = moment.duration({months: 2, weeks: 2, days: 0, hours: 5});
+ // for some reason, d._data._months does not get updated; use d._months instead.
+ assert.equal(d.subtract(1, 'months')._months, 1, 'Subtract months');
+ assert.equal(d.subtract(14, 'days')._days, 0, 'Subtract days');
+ assert.equal(d.subtract(10000)._milliseconds, 5 * 60 * 60 * 1000 - 10000, 'Subtract milliseconds');
+ assert.equal(d.subtract({h: 1, m: 59})._milliseconds, 3 * 60 * 60 * 1000 + 1 * 60 * 1000 - 10000, 'Subtract hour:minute');
+});
+
+test('JSON.stringify duration', function (assert) {
+ var d = moment.duration(1024, 'h');
+
+ assert.equal(JSON.stringify(d), '"' + d.toISOString() + '"', 'JSON.stringify on duration should return ISO string');
+});
+
+test('duration plugins', function (assert) {
+ var durationObject = moment.duration();
+ moment.duration.fn.foo = function (arg) {
+ assert.equal(this, durationObject);
+ assert.equal(arg, 5);
+ };
+ durationObject.foo(5);
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('duration from moments');
+
+test('pure year diff', function (assert) {
+ var m1 = moment('2012-01-01T00:00:00.000Z'),
+ m2 = moment('2013-01-01T00:00:00.000Z');
+
+ assert.equal(moment.duration({from: m1, to: m2}).as('years'), 1, 'year moment difference');
+ assert.equal(moment.duration({from: m2, to: m1}).as('years'), -1, 'negative year moment difference');
+});
+
+test('month and day diff', function (assert) {
+ var m1 = moment('2012-01-15T00:00:00.000Z'),
+ m2 = moment('2012-02-17T00:00:00.000Z'),
+ d = moment.duration({from: m1, to: m2});
+
+ assert.equal(d.get('days'), 2);
+ assert.equal(d.get('months'), 1);
+});
+
+test('day diff, separate months', function (assert) {
+ var m1 = moment('2012-01-15T00:00:00.000Z'),
+ m2 = moment('2012-02-13T00:00:00.000Z'),
+ d = moment.duration({from: m1, to: m2});
+
+ assert.equal(d.as('days'), 29);
+});
+
+test('hour diff', function (assert) {
+ var m1 = moment('2012-01-15T17:00:00.000Z'),
+ m2 = moment('2012-01-16T03:00:00.000Z'),
+ d = moment.duration({from: m1, to: m2});
+
+ assert.equal(d.as('hours'), 10);
+});
+
+test('minute diff', function (assert) {
+ var m1 = moment('2012-01-15T17:45:00.000Z'),
+ m2 = moment('2012-01-16T03:15:00.000Z'),
+ d = moment.duration({from: m1, to: m2});
+
+ assert.equal(d.as('hours'), 9.5);
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('format');
+
+test('format YY', function (assert) {
+ var b = moment(new Date(2009, 1, 14, 15, 25, 50, 125));
+ assert.equal(b.format('YY'), '09', 'YY ---> 09');
+});
+
+test('format escape brackets', function (assert) {
+ moment.locale('en');
+
+ var b = moment(new Date(2009, 1, 14, 15, 25, 50, 125));
+ assert.equal(b.format('[day]'), 'day', 'Single bracket');
+ assert.equal(b.format('[day] YY [YY]'), 'day 09 YY', 'Double bracket');
+ assert.equal(b.format('[YY'), '[09', 'Un-ended bracket');
+ assert.equal(b.format('[[YY]]'), '[YY]', 'Double nested brackets');
+ assert.equal(b.format('[[]'), '[', 'Escape open bracket');
+ assert.equal(b.format('[Last]'), 'Last', 'localized tokens');
+ assert.equal(b.format('[L] L'), 'L 02/14/2009', 'localized tokens with escaped localized tokens');
+ assert.equal(b.format('[L LL LLL LLLL aLa]'), 'L LL LLL LLLL aLa', 'localized tokens with escaped localized tokens');
+ assert.equal(b.format('[LLL] LLL'), 'LLL February 14, 2009 3:25 PM', 'localized tokens with escaped localized tokens (recursion)');
+ assert.equal(b.format('YYYY[\n]DD[\n]'), '2009\n14\n', 'Newlines');
+});
+
+test('handle negative years', function (assert) {
+ moment.locale('en');
+ assert.equal(moment.utc().year(-1).format('YY'), '-01', 'YY with negative year');
+ assert.equal(moment.utc().year(-1).format('YYYY'), '-0001', 'YYYY with negative year');
+ assert.equal(moment.utc().year(-12).format('YY'), '-12', 'YY with negative year');
+ assert.equal(moment.utc().year(-12).format('YYYY'), '-0012', 'YYYY with negative year');
+ assert.equal(moment.utc().year(-123).format('YY'), '-23', 'YY with negative year');
+ assert.equal(moment.utc().year(-123).format('YYYY'), '-0123', 'YYYY with negative year');
+ assert.equal(moment.utc().year(-1234).format('YY'), '-34', 'YY with negative year');
+ assert.equal(moment.utc().year(-1234).format('YYYY'), '-1234', 'YYYY with negative year');
+ assert.equal(moment.utc().year(-12345).format('YY'), '-45', 'YY with negative year');
+ assert.equal(moment.utc().year(-12345).format('YYYY'), '-12345', 'YYYY with negative year');
+});
+
+test('format milliseconds', function (assert) {
+ var b = moment(new Date(2009, 1, 14, 15, 25, 50, 123));
+ assert.equal(b.format('S'), '1', 'Deciseconds');
+ assert.equal(b.format('SS'), '12', 'Centiseconds');
+ assert.equal(b.format('SSS'), '123', 'Milliseconds');
+ b.milliseconds(789);
+ assert.equal(b.format('S'), '7', 'Deciseconds');
+ assert.equal(b.format('SS'), '78', 'Centiseconds');
+ assert.equal(b.format('SSS'), '789', 'Milliseconds');
+});
+
+test('format timezone', function (assert) {
+ var b = moment(new Date(2010, 1, 14, 15, 25, 50, 125));
+ assert.ok(b.format('Z').match(/^[\+\-]\d\d:\d\d$/), b.format('Z') + ' should be something like \'+07:30\'');
+ assert.ok(b.format('ZZ').match(/^[\+\-]\d{4}$/), b.format('ZZ') + ' should be something like \'+0700\'');
+});
+
+test('format multiple with utc offset', function (assert) {
+ var b = moment('2012-10-08 -1200', ['YYYY-MM-DD HH:mm ZZ', 'YYYY-MM-DD ZZ', 'YYYY-MM-DD']);
+ assert.equal(b.format('YYYY-MM'), '2012-10', 'Parsing multiple formats should not crash with different sized formats');
+});
+
+test('isDST', function (assert) {
+ var janOffset = new Date(2011, 0, 1).getTimezoneOffset(),
+ julOffset = new Date(2011, 6, 1).getTimezoneOffset(),
+ janIsDst = janOffset < julOffset,
+ julIsDst = julOffset < janOffset,
+ jan1 = moment([2011]),
+ jul1 = moment([2011, 6]);
+
+ if (janIsDst && julIsDst) {
+ assert.ok(0, 'January and July cannot both be in DST');
+ assert.ok(0, 'January and July cannot both be in DST');
+ } else if (janIsDst) {
+ assert.ok(jan1.isDST(), 'January 1 is DST');
+ assert.ok(!jul1.isDST(), 'July 1 is not DST');
+ } else if (julIsDst) {
+ assert.ok(!jan1.isDST(), 'January 1 is not DST');
+ assert.ok(jul1.isDST(), 'July 1 is DST');
+ } else {
+ assert.ok(!jan1.isDST(), 'January 1 is not DST');
+ assert.ok(!jul1.isDST(), 'July 1 is not DST');
+ }
+});
+
+test('unix timestamp', function (assert) {
+ var m = moment('1234567890.123', 'X');
+ assert.equal(m.format('X'), '1234567890', 'unix timestamp without milliseconds');
+ assert.equal(m.format('X.S'), '1234567890.1', 'unix timestamp with deciseconds');
+ assert.equal(m.format('X.SS'), '1234567890.12', 'unix timestamp with centiseconds');
+ assert.equal(m.format('X.SSS'), '1234567890.123', 'unix timestamp with milliseconds');
+
+ m = moment(1234567890.123, 'X');
+ assert.equal(m.format('X'), '1234567890', 'unix timestamp as integer');
+});
+
+test('unix offset milliseconds', function (assert) {
+ var m = moment('1234567890123', 'x');
+ assert.equal(m.format('x'), '1234567890123', 'unix offset in milliseconds');
+
+ m = moment(1234567890123, 'x');
+ assert.equal(m.format('x'), '1234567890123', 'unix offset in milliseconds as integer');
+});
+
+test('utcOffset sanity checks', function (assert) {
+ assert.equal(moment().utcOffset() % 15, 0,
+ 'utc offset should be a multiple of 15 (was ' + moment().utcOffset() + ')');
+
+ assert.equal(moment().utcOffset(), -(new Date()).getTimezoneOffset(),
+ 'utcOffset should return the opposite of getTimezoneOffset');
+});
+
+test('default format', function (assert) {
+ var isoRegex = /\d{4}.\d\d.\d\dT\d\d.\d\d.\d\d[\+\-]\d\d:\d\d/;
+ assert.ok(isoRegex.exec(moment().format()), 'default format (' + moment().format() + ') should match ISO');
+});
+
+test('default UTC format', function (assert) {
+ var isoRegex = /\d{4}.\d\d.\d\dT\d\d.\d\d.\d\dZ/;
+ assert.ok(isoRegex.exec(moment.utc().format()), 'default UTC format (' + moment.utc().format() + ') should match ISO');
+});
+
+test('toJSON', function (assert) {
+ var supportsJson = typeof JSON !== 'undefined' && JSON.stringify && JSON.stringify.call,
+ date = moment('2012-10-09T21:30:40.678+0100');
+
+ assert.equal(date.toJSON(), '2012-10-09T20:30:40.678Z', 'should output ISO8601 on moment.fn.toJSON');
+
+ if (supportsJson) {
+ assert.equal(JSON.stringify({
+ date : date
+ }), '{"date":"2012-10-09T20:30:40.678Z"}', 'should output ISO8601 on JSON.stringify');
+ }
+});
+
+test('toISOString', function (assert) {
+ var date = moment.utc('2012-10-09T20:30:40.678');
+
+ assert.equal(date.toISOString(), '2012-10-09T20:30:40.678Z', 'should output ISO8601 on moment.fn.toISOString');
+
+ // big years
+ date = moment.utc('+020123-10-09T20:30:40.678');
+ assert.equal(date.toISOString(), '+020123-10-09T20:30:40.678Z', 'ISO8601 format on big positive year');
+ // negative years
+ date = moment.utc('-000001-10-09T20:30:40.678');
+ assert.equal(date.toISOString(), '-000001-10-09T20:30:40.678Z', 'ISO8601 format on negative year');
+ // big negative years
+ date = moment.utc('-020123-10-09T20:30:40.678');
+ assert.equal(date.toISOString(), '-020123-10-09T20:30:40.678Z', 'ISO8601 format on big negative year');
+});
+
+// See https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
+test('inspect', function (assert) {
+ function roundtrip(m) {
+ /*jshint evil:true */
+ return (new Function('moment', 'return ' + m.inspect()))(moment);
+ }
+ function testInspect(date, string) {
+ var inspected = date.inspect();
+ assert.equal(inspected, string);
+ assert.ok(date.isSame(roundtrip(date)), 'Tried to parse ' + inspected);
+ }
+
+ testInspect(
+ moment('2012-10-09T20:30:40.678'),
+ 'moment("2012-10-09T20:30:40.678")'
+ );
+ testInspect(
+ moment('+020123-10-09T20:30:40.678'),
+ 'moment("+020123-10-09T20:30:40.678")'
+ );
+ testInspect(
+ moment.utc('2012-10-09T20:30:40.678'),
+ 'moment.utc("2012-10-09T20:30:40.678+00:00")'
+ );
+ testInspect(
+ moment.utc('+020123-10-09T20:30:40.678'),
+ 'moment.utc("+020123-10-09T20:30:40.678+00:00")'
+ );
+ testInspect(
+ moment.utc('+020123-10-09T20:30:40.678+01:00'),
+ 'moment.utc("+020123-10-09T19:30:40.678+00:00")'
+ );
+ testInspect(
+ moment.parseZone('2016-06-11T17:30:40.678+0430'),
+ 'moment.parseZone("2016-06-11T17:30:40.678+04:30")'
+ );
+ testInspect(
+ moment.parseZone('+112016-06-11T17:30:40.678+0430'),
+ 'moment.parseZone("+112016-06-11T17:30:40.678+04:30")'
+ );
+
+ assert.equal(
+ moment(new Date('nope')).inspect(),
+ 'moment.invalid(/* Invalid Date */)'
+ );
+ assert.equal(
+ moment('blah', 'YYYY').inspect(),
+ 'moment.invalid(/* blah */)'
+ );
+});
+
+test('long years', function (assert) {
+ assert.equal(moment.utc().year(2).format('YYYYYY'), '+000002', 'small year with YYYYYY');
+ assert.equal(moment.utc().year(2012).format('YYYYYY'), '+002012', 'regular year with YYYYYY');
+ assert.equal(moment.utc().year(20123).format('YYYYYY'), '+020123', 'big year with YYYYYY');
+
+ assert.equal(moment.utc().year(-1).format('YYYYYY'), '-000001', 'small negative year with YYYYYY');
+ assert.equal(moment.utc().year(-2012).format('YYYYYY'), '-002012', 'negative year with YYYYYY');
+ assert.equal(moment.utc().year(-20123).format('YYYYYY'), '-020123', 'big negative year with YYYYYY');
+});
+
+test('iso week formats', function (assert) {
+ // http://en.wikipedia.org/wiki/ISO_week_date
+ var cases = {
+ '2005-01-02': '2004-53',
+ '2005-12-31': '2005-52',
+ '2007-01-01': '2007-01',
+ '2007-12-30': '2007-52',
+ '2007-12-31': '2008-01',
+ '2008-01-01': '2008-01',
+ '2008-12-28': '2008-52',
+ '2008-12-29': '2009-01',
+ '2008-12-30': '2009-01',
+ '2008-12-31': '2009-01',
+ '2009-01-01': '2009-01',
+ '2009-12-31': '2009-53',
+ '2010-01-01': '2009-53',
+ '2010-01-02': '2009-53',
+ '2010-01-03': '2009-53',
+ '404-12-31': '0404-53',
+ '405-12-31': '0405-52'
+ }, i, isoWeek, formatted2, formatted1;
+
+ for (i in cases) {
+ isoWeek = cases[i].split('-').pop();
+ formatted2 = moment(i, 'YYYY-MM-DD').format('WW');
+ assert.equal(isoWeek, formatted2, i + ': WW should be ' + isoWeek + ', but ' + formatted2);
+ isoWeek = isoWeek.replace(/^0+/, '');
+ formatted1 = moment(i, 'YYYY-MM-DD').format('W');
+ assert.equal(isoWeek, formatted1, i + ': W should be ' + isoWeek + ', but ' + formatted1);
+ }
+});
+
+test('iso week year formats', function (assert) {
+ // http://en.wikipedia.org/wiki/ISO_week_date
+ var cases = {
+ '2005-01-02': '2004-53',
+ '2005-12-31': '2005-52',
+ '2007-01-01': '2007-01',
+ '2007-12-30': '2007-52',
+ '2007-12-31': '2008-01',
+ '2008-01-01': '2008-01',
+ '2008-12-28': '2008-52',
+ '2008-12-29': '2009-01',
+ '2008-12-30': '2009-01',
+ '2008-12-31': '2009-01',
+ '2009-01-01': '2009-01',
+ '2009-12-31': '2009-53',
+ '2010-01-01': '2009-53',
+ '2010-01-02': '2009-53',
+ '2010-01-03': '2009-53',
+ '404-12-31': '0404-53',
+ '405-12-31': '0405-52'
+ }, i, isoWeekYear, formatted5, formatted4, formatted2;
+
+ for (i in cases) {
+ isoWeekYear = cases[i].split('-')[0];
+ formatted5 = moment(i, 'YYYY-MM-DD').format('GGGGG');
+ assert.equal('0' + isoWeekYear, formatted5, i + ': GGGGG should be ' + isoWeekYear + ', but ' + formatted5);
+ formatted4 = moment(i, 'YYYY-MM-DD').format('GGGG');
+ assert.equal(isoWeekYear, formatted4, i + ': GGGG should be ' + isoWeekYear + ', but ' + formatted4);
+ formatted2 = moment(i, 'YYYY-MM-DD').format('GG');
+ assert.equal(isoWeekYear.slice(2, 4), formatted2, i + ': GG should be ' + isoWeekYear + ', but ' + formatted2);
+ }
+});
+
+test('week year formats', function (assert) {
+ // http://en.wikipedia.org/wiki/ISO_week_date
+ var cases = {
+ '2005-01-02': '2004-53',
+ '2005-12-31': '2005-52',
+ '2007-01-01': '2007-01',
+ '2007-12-30': '2007-52',
+ '2007-12-31': '2008-01',
+ '2008-01-01': '2008-01',
+ '2008-12-28': '2008-52',
+ '2008-12-29': '2009-01',
+ '2008-12-30': '2009-01',
+ '2008-12-31': '2009-01',
+ '2009-01-01': '2009-01',
+ '2009-12-31': '2009-53',
+ '2010-01-01': '2009-53',
+ '2010-01-02': '2009-53',
+ '2010-01-03': '2009-53',
+ '404-12-31': '0404-53',
+ '405-12-31': '0405-52'
+ }, i, isoWeekYear, formatted5, formatted4, formatted2;
+
+ moment.defineLocale('dow:1,doy:4', {week: {dow: 1, doy: 4}});
+
+ for (i in cases) {
+ isoWeekYear = cases[i].split('-')[0];
+ formatted5 = moment(i, 'YYYY-MM-DD').format('ggggg');
+ assert.equal('0' + isoWeekYear, formatted5, i + ': ggggg should be ' + isoWeekYear + ', but ' + formatted5);
+ formatted4 = moment(i, 'YYYY-MM-DD').format('gggg');
+ assert.equal(isoWeekYear, formatted4, i + ': gggg should be ' + isoWeekYear + ', but ' + formatted4);
+ formatted2 = moment(i, 'YYYY-MM-DD').format('gg');
+ assert.equal(isoWeekYear.slice(2, 4), formatted2, i + ': gg should be ' + isoWeekYear + ', but ' + formatted2);
+ }
+ moment.defineLocale('dow:1,doy:4', null);
+});
+
+test('iso weekday formats', function (assert) {
+ assert.equal(moment([1985, 1, 4]).format('E'), '1', 'Feb 4 1985 is Monday -- 1st day');
+ assert.equal(moment([2029, 8, 18]).format('E'), '2', 'Sep 18 2029 is Tuesday -- 2nd day');
+ assert.equal(moment([2013, 3, 24]).format('E'), '3', 'Apr 24 2013 is Wednesday -- 3rd day');
+ assert.equal(moment([2015, 2, 5]).format('E'), '4', 'Mar 5 2015 is Thursday -- 4th day');
+ assert.equal(moment([1970, 0, 2]).format('E'), '5', 'Jan 2 1970 is Friday -- 5th day');
+ assert.equal(moment([2001, 4, 12]).format('E'), '6', 'May 12 2001 is Saturday -- 6th day');
+ assert.equal(moment([2000, 0, 2]).format('E'), '7', 'Jan 2 2000 is Sunday -- 7th day');
+});
+
+test('weekday formats', function (assert) {
+ moment.defineLocale('dow: 3,doy: 5', {week: {dow: 3, doy: 5}});
+ assert.equal(moment([1985, 1, 6]).format('e'), '0', 'Feb 6 1985 is Wednesday -- 0th day');
+ assert.equal(moment([2029, 8, 20]).format('e'), '1', 'Sep 20 2029 is Thursday -- 1st day');
+ assert.equal(moment([2013, 3, 26]).format('e'), '2', 'Apr 26 2013 is Friday -- 2nd day');
+ assert.equal(moment([2015, 2, 7]).format('e'), '3', 'Mar 7 2015 is Saturday -- 3nd day');
+ assert.equal(moment([1970, 0, 4]).format('e'), '4', 'Jan 4 1970 is Sunday -- 4th day');
+ assert.equal(moment([2001, 4, 14]).format('e'), '5', 'May 14 2001 is Monday -- 5th day');
+ assert.equal(moment([2000, 0, 4]).format('e'), '6', 'Jan 4 2000 is Tuesday -- 6th day');
+ moment.defineLocale('dow: 3,doy: 5', null);
+});
+
+test('toString is just human readable format', function (assert) {
+ var b = moment(new Date(2009, 1, 5, 15, 25, 50, 125));
+ assert.equal(b.toString(), b.format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'));
+});
+
+test('toJSON skips postformat', function (assert) {
+ moment.defineLocale('postformat', {
+ postformat: function (s) {
+ s.replace(/./g, 'X');
+ }
+ });
+ assert.equal(moment.utc([2000, 0, 1]).toJSON(), '2000-01-01T00:00:00.000Z', 'toJSON doesn\'t postformat');
+ moment.defineLocale('postformat', null);
+});
+
+test('calendar day timezone', function (assert) {
+ moment.locale('en');
+ var zones = [60, -60, 90, -90, 360, -360, 720, -720],
+ b = moment().utc().startOf('day').subtract({m : 1}),
+ c = moment().local().startOf('day').subtract({m : 1}),
+ d = moment().local().startOf('day').subtract({d : 2}),
+ i, z, a;
+
+ for (i = 0; i < zones.length; ++i) {
+ z = zones[i];
+ a = moment().utcOffset(z).startOf('day').subtract({m: 1});
+ assert.equal(moment(a).utcOffset(z).calendar(), 'Yesterday at 11:59 PM',
+ 'Yesterday at 11:59 PM, not Today, or the wrong time, tz = ' + z);
+ }
+
+ assert.equal(moment(b).utc().calendar(), 'Yesterday at 11:59 PM', 'Yesterday at 11:59 PM, not Today, or the wrong time');
+ assert.equal(moment(c).local().calendar(), 'Yesterday at 11:59 PM', 'Yesterday at 11:59 PM, not Today, or the wrong time');
+ assert.equal(moment(c).local().calendar(d), 'Tomorrow at 11:59 PM', 'Tomorrow at 11:59 PM, not Yesterday, or the wrong time');
+});
+
+test('calendar with custom formats', function (assert) {
+ assert.equal(moment().calendar(null, {sameDay: '[Today]'}), 'Today', 'Today');
+ assert.equal(moment().add(1, 'days').calendar(null, {nextDay: '[Tomorrow]'}), 'Tomorrow', 'Tomorrow');
+ assert.equal(moment([1985, 1, 4]).calendar(null, {sameElse: 'YYYY-MM-DD'}), '1985-02-04', 'Else');
+});
+
+test('invalid', function (assert) {
+ assert.equal(moment.invalid().format(), 'Invalid date');
+ assert.equal(moment.invalid().format('YYYY-MM-DD'), 'Invalid date');
+});
+
+test('quarter formats', function (assert) {
+ assert.equal(moment([1985, 1, 4]).format('Q'), '1', 'Feb 4 1985 is Q1');
+ assert.equal(moment([2029, 8, 18]).format('Q'), '3', 'Sep 18 2029 is Q3');
+ assert.equal(moment([2013, 3, 24]).format('Q'), '2', 'Apr 24 2013 is Q2');
+ assert.equal(moment([2015, 2, 5]).format('Q'), '1', 'Mar 5 2015 is Q1');
+ assert.equal(moment([1970, 0, 2]).format('Q'), '1', 'Jan 2 1970 is Q1');
+ assert.equal(moment([2001, 11, 12]).format('Q'), '4', 'Dec 12 2001 is Q4');
+ assert.equal(moment([2000, 0, 2]).format('[Q]Q-YYYY'), 'Q1-2000', 'Jan 2 2000 is Q1');
+});
+
+test('quarter ordinal formats', function (assert) {
+ assert.equal(moment([1985, 1, 4]).format('Qo'), '1st', 'Feb 4 1985 is 1st quarter');
+ assert.equal(moment([2029, 8, 18]).format('Qo'), '3rd', 'Sep 18 2029 is 3rd quarter');
+ assert.equal(moment([2013, 3, 24]).format('Qo'), '2nd', 'Apr 24 2013 is 2nd quarter');
+ assert.equal(moment([2015, 2, 5]).format('Qo'), '1st', 'Mar 5 2015 is 1st quarter');
+ assert.equal(moment([1970, 0, 2]).format('Qo'), '1st', 'Jan 2 1970 is 1st quarter');
+ assert.equal(moment([2001, 11, 12]).format('Qo'), '4th', 'Dec 12 2001 is 4th quarter');
+ assert.equal(moment([2000, 0, 2]).format('Qo [quarter] YYYY'), '1st quarter 2000', 'Jan 2 2000 is 1st quarter');
+});
+
+// test('full expanded format is returned from abbreviated formats', function (assert) {
+// function objectKeys(obj) {
+// if (Object.keys) {
+// return Object.keys(obj);
+// } else {
+// // IE8
+// var res = [], i;
+// for (i in obj) {
+// if (obj.hasOwnProperty(i)) {
+// res.push(i);
+// }
+// }
+// return res;
+// }
+// }
+
+// var locales =
+// 'ar-sa ar-tn ar az be bg bn bo br bs ca cs cv cy da de-at de dv el ' +
+// 'en-au en-ca en-gb en-ie en-nz eo es et eu fa fi fo fr-ca fr-ch fr fy ' +
+// 'gd gl he hi hr hu hy-am id is it ja jv ka kk km ko lb lo lt lv me mk ml ' +
+// 'mr ms-my ms my nb ne nl nn pl pt-br pt ro ru se si sk sl sq sr-cyrl ' +
+// 'sr sv sw ta te th tl-ph tlh tr tzl tzm-latn tzm uk uz vi zh-cn zh-tw';
+
+// each(locales.split(' '), function (locale) {
+// var data, tokens;
+// data = moment().locale(locale).localeData()._longDateFormat;
+// tokens = objectKeys(data);
+// each(tokens, function (token) {
+// // Check each format string to make sure it does not contain any
+// // tokens that need to be expanded.
+// each(tokens, function (i) {
+// // strip escaped sequences
+// var format = data[i].replace(/(\[[^\]]*\])/g, '');
+// assert.equal(false, !!~format.indexOf(token), 'locale ' + locale + ' contains ' + token + ' in ' + i);
+// });
+// });
+// });
+// });
+
+test('milliseconds', function (assert) {
+ var m = moment('123', 'SSS');
+
+ assert.equal(m.format('S'), '1');
+ assert.equal(m.format('SS'), '12');
+ assert.equal(m.format('SSS'), '123');
+ assert.equal(m.format('SSSS'), '1230');
+ assert.equal(m.format('SSSSS'), '12300');
+ assert.equal(m.format('SSSSSS'), '123000');
+ assert.equal(m.format('SSSSSSS'), '1230000');
+ assert.equal(m.format('SSSSSSSS'), '12300000');
+ assert.equal(m.format('SSSSSSSSS'), '123000000');
+});
+
+test('hmm and hmmss', function (assert) {
+ assert.equal(moment('12:34:56', 'HH:mm:ss').format('hmm'), '1234');
+ assert.equal(moment('01:34:56', 'HH:mm:ss').format('hmm'), '134');
+ assert.equal(moment('13:34:56', 'HH:mm:ss').format('hmm'), '134');
+
+ assert.equal(moment('12:34:56', 'HH:mm:ss').format('hmmss'), '123456');
+ assert.equal(moment('01:34:56', 'HH:mm:ss').format('hmmss'), '13456');
+ assert.equal(moment('13:34:56', 'HH:mm:ss').format('hmmss'), '13456');
+});
+
+test('Hmm and Hmmss', function (assert) {
+ assert.equal(moment('12:34:56', 'HH:mm:ss').format('Hmm'), '1234');
+ assert.equal(moment('01:34:56', 'HH:mm:ss').format('Hmm'), '134');
+ assert.equal(moment('13:34:56', 'HH:mm:ss').format('Hmm'), '1334');
+
+ assert.equal(moment('12:34:56', 'HH:mm:ss').format('Hmmss'), '123456');
+ assert.equal(moment('01:34:56', 'HH:mm:ss').format('Hmmss'), '13456');
+ assert.equal(moment('08:34:56', 'HH:mm:ss').format('Hmmss'), '83456');
+ assert.equal(moment('18:34:56', 'HH:mm:ss').format('Hmmss'), '183456');
+});
+
+test('k and kk', function (assert) {
+ assert.equal(moment('01:23:45', 'HH:mm:ss').format('k'), '1');
+ assert.equal(moment('12:34:56', 'HH:mm:ss').format('k'), '12');
+ assert.equal(moment('01:23:45', 'HH:mm:ss').format('kk'), '01');
+ assert.equal(moment('12:34:56', 'HH:mm:ss').format('kk'), '12');
+ assert.equal(moment('00:34:56', 'HH:mm:ss').format('kk'), '24');
+ assert.equal(moment('00:00:00', 'HH:mm:ss').format('kk'), '24');
+});
+
+test('Y token', function (assert) {
+ assert.equal(moment('2010-01-01', 'YYYY-MM-DD', true).format('Y'), '2010', 'format 2010 with Y');
+ assert.equal(moment('-123-01-01', 'Y-MM-DD', true).format('Y'), '-123', 'format -123 with Y');
+ assert.equal(moment('12345-01-01', 'Y-MM-DD', true).format('Y'), '+12345', 'format 12345 with Y');
+ assert.equal(moment('0-01-01', 'Y-MM-DD', true).format('Y'), '0', 'format 0 with Y');
+ assert.equal(moment('1-01-01', 'Y-MM-DD', true).format('Y'), '1', 'format 1 with Y');
+ assert.equal(moment('9999-01-01', 'Y-MM-DD', true).format('Y'), '9999', 'format 9999 with Y');
+ assert.equal(moment('10000-01-01', 'Y-MM-DD', true).format('Y'), '+10000', 'format 10000 with Y');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('from_to');
+
+test('from', function (assert) {
+ var start = moment();
+ moment.locale('en');
+ assert.equal(start.from(start.clone().add(5, 'seconds')), 'a few seconds ago', '5 seconds = a few seconds ago');
+ assert.equal(start.from(start.clone().add(1, 'minute')), 'a minute ago', '1 minute = a minute ago');
+ assert.equal(start.from(start.clone().add(5, 'minutes')), '5 minutes ago', '5 minutes = 5 minutes ago');
+
+ assert.equal(start.from(start.clone().subtract(5, 'seconds')), 'in a few seconds', '5 seconds = in a few seconds');
+ assert.equal(start.from(start.clone().subtract(1, 'minute')), 'in a minute', '1 minute = in a minute');
+ assert.equal(start.from(start.clone().subtract(5, 'minutes')), 'in 5 minutes', '5 minutes = in 5 minutes');
+});
+
+test('from with absolute duration', function (assert) {
+ var start = moment();
+ moment.locale('en');
+ assert.equal(start.from(start.clone().add(5, 'seconds'), true), 'a few seconds', '5 seconds = a few seconds');
+ assert.equal(start.from(start.clone().add(1, 'minute'), true), 'a minute', '1 minute = a minute');
+ assert.equal(start.from(start.clone().add(5, 'minutes'), true), '5 minutes', '5 minutes = 5 minutes');
+
+ assert.equal(start.from(start.clone().subtract(5, 'seconds'), true), 'a few seconds', '5 seconds = a few seconds');
+ assert.equal(start.from(start.clone().subtract(1, 'minute'), true), 'a minute', '1 minute = a minute');
+ assert.equal(start.from(start.clone().subtract(5, 'minutes'), true), '5 minutes', '5 minutes = 5 minutes');
+});
+
+test('to', function (assert) {
+ var start = moment();
+ moment.locale('en');
+ assert.equal(start.to(start.clone().subtract(5, 'seconds')), 'a few seconds ago', '5 seconds = a few seconds ago');
+ assert.equal(start.to(start.clone().subtract(1, 'minute')), 'a minute ago', '1 minute = a minute ago');
+ assert.equal(start.to(start.clone().subtract(5, 'minutes')), '5 minutes ago', '5 minutes = 5 minutes ago');
+
+ assert.equal(start.to(start.clone().add(5, 'seconds')), 'in a few seconds', '5 seconds = in a few seconds');
+ assert.equal(start.to(start.clone().add(1, 'minute')), 'in a minute', '1 minute = in a minute');
+ assert.equal(start.to(start.clone().add(5, 'minutes')), 'in 5 minutes', '5 minutes = in 5 minutes');
+});
+
+test('to with absolute duration', function (assert) {
+ var start = moment();
+ moment.locale('en');
+ assert.equal(start.to(start.clone().add(5, 'seconds'), true), 'a few seconds', '5 seconds = a few seconds');
+ assert.equal(start.to(start.clone().add(1, 'minute'), true), 'a minute', '1 minute = a minute');
+ assert.equal(start.to(start.clone().add(5, 'minutes'), true), '5 minutes', '5 minutes = 5 minutes');
+
+ assert.equal(start.to(start.clone().subtract(5, 'seconds'), true), 'a few seconds', '5 seconds = a few seconds');
+ assert.equal(start.to(start.clone().subtract(1, 'minute'), true), 'a minute', '1 minute = a minute');
+ assert.equal(start.to(start.clone().subtract(5, 'minutes'), true), '5 minutes', '5 minutes = 5 minutes');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('getters and setters');
+
+test('getters', function (assert) {
+ var a = moment([2011, 9, 12, 6, 7, 8, 9]);
+ assert.equal(a.year(), 2011, 'year');
+ assert.equal(a.month(), 9, 'month');
+ assert.equal(a.date(), 12, 'date');
+ assert.equal(a.day(), 3, 'day');
+ assert.equal(a.hours(), 6, 'hour');
+ assert.equal(a.minutes(), 7, 'minute');
+ assert.equal(a.seconds(), 8, 'second');
+ assert.equal(a.milliseconds(), 9, 'milliseconds');
+});
+
+test('getters programmatic', function (assert) {
+ var a = moment([2011, 9, 12, 6, 7, 8, 9]);
+ assert.equal(a.get('year'), 2011, 'year');
+ assert.equal(a.get('month'), 9, 'month');
+ assert.equal(a.get('date'), 12, 'date');
+ assert.equal(a.get('day'), 3, 'day');
+ assert.equal(a.get('hour'), 6, 'hour');
+ assert.equal(a.get('minute'), 7, 'minute');
+ assert.equal(a.get('second'), 8, 'second');
+ assert.equal(a.get('milliseconds'), 9, 'milliseconds');
+
+ //actual getters tested elsewhere
+ assert.equal(a.get('weekday'), a.weekday(), 'weekday');
+ assert.equal(a.get('isoWeekday'), a.isoWeekday(), 'isoWeekday');
+ assert.equal(a.get('week'), a.week(), 'week');
+ assert.equal(a.get('isoWeek'), a.isoWeek(), 'isoWeek');
+ assert.equal(a.get('dayOfYear'), a.dayOfYear(), 'dayOfYear');
+
+ //getter no longer sets values when passed an object
+ assert.equal(moment([2016,0,1]).get({year:2015}).year(), 2016, 'getter no longer sets values when passed an object');
+});
+
+test('setters plural', function (assert) {
+ var a = moment();
+ test.expectedDeprecations('years accessor', 'months accessor', 'dates accessor');
+
+ a.years(2011);
+ a.months(9);
+ a.dates(12);
+ a.hours(6);
+ a.minutes(7);
+ a.seconds(8);
+ a.milliseconds(9);
+ assert.equal(a.years(), 2011, 'years');
+ assert.equal(a.months(), 9, 'months');
+ assert.equal(a.dates(), 12, 'dates');
+ assert.equal(a.days(), 3, 'days');
+ assert.equal(a.hours(), 6, 'hours');
+ assert.equal(a.minutes(), 7, 'minutes');
+ assert.equal(a.seconds(), 8, 'seconds');
+ assert.equal(a.milliseconds(), 9, 'milliseconds');
+});
+
+test('setters singular', function (assert) {
+ var a = moment();
+ a.year(2011);
+ a.month(9);
+ a.date(12);
+ a.hour(6);
+ a.minute(7);
+ a.second(8);
+ a.millisecond(9);
+ assert.equal(a.year(), 2011, 'year');
+ assert.equal(a.month(), 9, 'month');
+ assert.equal(a.date(), 12, 'date');
+ assert.equal(a.day(), 3, 'day');
+ assert.equal(a.hour(), 6, 'hour');
+ assert.equal(a.minute(), 7, 'minute');
+ assert.equal(a.second(), 8, 'second');
+ assert.equal(a.millisecond(), 9, 'milliseconds');
+});
+
+test('setters', function (assert) {
+ var a = moment();
+ a.year(2011);
+ a.month(9);
+ a.date(12);
+ a.hours(6);
+ a.minutes(7);
+ a.seconds(8);
+ a.milliseconds(9);
+ assert.equal(a.year(), 2011, 'year');
+ assert.equal(a.month(), 9, 'month');
+ assert.equal(a.date(), 12, 'date');
+ assert.equal(a.day(), 3, 'day');
+ assert.equal(a.hours(), 6, 'hour');
+ assert.equal(a.minutes(), 7, 'minute');
+ assert.equal(a.seconds(), 8, 'second');
+ assert.equal(a.milliseconds(), 9, 'milliseconds');
+
+ // Test month() behavior. See https://github.com/timrwood/moment/pull/822
+ a = moment('20130531', 'YYYYMMDD');
+ a.month(3);
+ assert.equal(a.month(), 3, 'month edge case');
+});
+
+test('setter programmatic', function (assert) {
+ var a = moment();
+ a.set('year', 2011);
+ a.set('month', 9);
+ a.set('date', 12);
+ a.set('hours', 6);
+ a.set('minutes', 7);
+ a.set('seconds', 8);
+ a.set('milliseconds', 9);
+ assert.equal(a.year(), 2011, 'year');
+ assert.equal(a.month(), 9, 'month');
+ assert.equal(a.date(), 12, 'date');
+ assert.equal(a.day(), 3, 'day');
+ assert.equal(a.hours(), 6, 'hour');
+ assert.equal(a.minutes(), 7, 'minute');
+ assert.equal(a.seconds(), 8, 'second');
+ assert.equal(a.milliseconds(), 9, 'milliseconds');
+
+ // Test month() behavior. See https://github.com/timrwood/moment/pull/822
+ a = moment('20130531', 'YYYYMMDD');
+ a.month(3);
+ assert.equal(a.month(), 3, 'month edge case');
+});
+
+test('setters programatic with weeks', function (assert) {
+ var a = moment();
+ a.set('weekYear', 2001);
+ a.set('week', 49);
+ a.set('day', 4);
+
+ assert.equal(a.weekYear(), 2001, 'weekYear');
+ assert.equal(a.week(), 49, 'week');
+ assert.equal(a.day(), 4, 'day');
+
+ a.set('weekday', 1);
+ assert.equal(a.weekday(), 1, 'weekday');
+});
+
+test('setters programatic with weeks ISO', function (assert) {
+ var a = moment();
+ a.set('isoWeekYear', 2001);
+ a.set('isoWeek', 49);
+ a.set('isoWeekday', 4);
+
+ assert.equal(a.isoWeekYear(), 2001, 'isoWeekYear');
+ assert.equal(a.isoWeek(), 49, 'isoWeek');
+ assert.equal(a.isoWeekday(), 4, 'isoWeekday');
+});
+
+test('setters strings', function (assert) {
+ var a = moment([2012]).locale('en');
+ assert.equal(a.clone().day(0).day('Wednesday').day(), 3, 'day full name');
+ assert.equal(a.clone().day(0).day('Wed').day(), 3, 'day short name');
+ assert.equal(a.clone().day(0).day('We').day(), 3, 'day minimal name');
+ assert.equal(a.clone().day(0).day('invalid').day(), 0, 'invalid day name');
+ assert.equal(a.clone().month(0).month('April').month(), 3, 'month full name');
+ assert.equal(a.clone().month(0).month('Apr').month(), 3, 'month short name');
+ assert.equal(a.clone().month(0).month('invalid').month(), 0, 'invalid month name');
+});
+
+test('setters - falsey values', function (assert) {
+ var a = moment();
+ // ensure minutes wasn't coincidentally 0 already
+ a.minutes(1);
+ a.minutes(0);
+ assert.equal(a.minutes(), 0, 'falsey value');
+});
+
+test('chaining setters', function (assert) {
+ var a = moment();
+ a.year(2011)
+ .month(9)
+ .date(12)
+ .hours(6)
+ .minutes(7)
+ .seconds(8);
+ assert.equal(a.year(), 2011, 'year');
+ assert.equal(a.month(), 9, 'month');
+ assert.equal(a.date(), 12, 'date');
+ assert.equal(a.day(), 3, 'day');
+ assert.equal(a.hours(), 6, 'hour');
+ assert.equal(a.minutes(), 7, 'minute');
+ assert.equal(a.seconds(), 8, 'second');
+});
+
+test('setter with multiple unit values', function (assert) {
+ var a = moment();
+ a.set({
+ year: 2011,
+ month: 9,
+ date: 12,
+ hours: 6,
+ minutes: 7,
+ seconds: 8,
+ milliseconds: 9
+ });
+ assert.equal(a.year(), 2011, 'year');
+ assert.equal(a.month(), 9, 'month');
+ assert.equal(a.date(), 12, 'date');
+ assert.equal(a.day(), 3, 'day');
+ assert.equal(a.hours(), 6, 'hour');
+ assert.equal(a.minutes(), 7, 'minute');
+ assert.equal(a.seconds(), 8, 'second');
+ assert.equal(a.milliseconds(), 9, 'milliseconds');
+
+ var c = moment([2016,0,1]);
+ assert.equal(c.set({weekYear: 2016}).weekYear(), 2016, 'week year correctly sets with object syntax');
+ assert.equal(c.set({quarter: 3}).quarter(), 3, 'quarter sets correctly with object syntax');
+});
+
+test('day setter', function (assert) {
+ var a = moment([2011, 0, 15]);
+ assert.equal(moment(a).day(0).date(), 9, 'set from saturday to sunday');
+ assert.equal(moment(a).day(6).date(), 15, 'set from saturday to saturday');
+ assert.equal(moment(a).day(3).date(), 12, 'set from saturday to wednesday');
+
+ a = moment([2011, 0, 9]);
+ assert.equal(moment(a).day(0).date(), 9, 'set from sunday to sunday');
+ assert.equal(moment(a).day(6).date(), 15, 'set from sunday to saturday');
+ assert.equal(moment(a).day(3).date(), 12, 'set from sunday to wednesday');
+
+ a = moment([2011, 0, 12]);
+ assert.equal(moment(a).day(0).date(), 9, 'set from wednesday to sunday');
+ assert.equal(moment(a).day(6).date(), 15, 'set from wednesday to saturday');
+ assert.equal(moment(a).day(3).date(), 12, 'set from wednesday to wednesday');
+
+ assert.equal(moment(a).day(-7).date(), 2, 'set from wednesday to last sunday');
+ assert.equal(moment(a).day(-1).date(), 8, 'set from wednesday to last saturday');
+ assert.equal(moment(a).day(-4).date(), 5, 'set from wednesday to last wednesday');
+
+ assert.equal(moment(a).day(7).date(), 16, 'set from wednesday to next sunday');
+ assert.equal(moment(a).day(13).date(), 22, 'set from wednesday to next saturday');
+ assert.equal(moment(a).day(10).date(), 19, 'set from wednesday to next wednesday');
+
+ assert.equal(moment(a).day(14).date(), 23, 'set from wednesday to second next sunday');
+ assert.equal(moment(a).day(20).date(), 29, 'set from wednesday to second next saturday');
+ assert.equal(moment(a).day(17).date(), 26, 'set from wednesday to second next wednesday');
+});
+
+test('object set ordering', function (assert) {
+ var a = moment([2016,3,30]);
+ assert.equal(a.set({date:31, month:4}).date(), 31, 'setter order automatically arranged by size');
+ var b = moment([2015,1,28]);
+ assert.equal(b.set({date:29, year: 2016}).format('YYYY-MM-DD'), '2016-02-29', 'year is prioritized over date');
+ //check a nonexistent time in US isn't set
+ var c = moment([2016,2,13]);
+ c.set({
+ hour:2,
+ minutes:30,
+ date: 14
+ });
+ assert.equal(c.format('YYYY-MM-DDTHH:mm'), '2016-03-14T02:30', 'setting hours, minutes date puts date first allowing time set to work');
+});
+
+test('string setters', function (assert) {
+ var a = moment();
+ a.year('2011');
+ a.month('9');
+ a.date('12');
+ a.hours('6');
+ a.minutes('7');
+ a.seconds('8');
+ a.milliseconds('9');
+ assert.equal(a.year(), 2011, 'year');
+ assert.equal(a.month(), 9, 'month');
+ assert.equal(a.date(), 12, 'date');
+ assert.equal(a.day(), 3, 'day');
+ assert.equal(a.hours(), 6, 'hour');
+ assert.equal(a.minutes(), 7, 'minute');
+ assert.equal(a.seconds(), 8, 'second');
+ assert.equal(a.milliseconds(), 9, 'milliseconds');
+});
+
+test('setters across DST +1', function (assert) {
+ var oldUpdateOffset = moment.updateOffset,
+ // Based on a real story somewhere in America/Los_Angeles
+ dstAt = moment('2014-03-09T02:00:00-08:00').parseZone(),
+ m;
+
+ moment.updateOffset = function (mom, keepTime) {
+ if (mom.isBefore(dstAt)) {
+ mom.utcOffset(-8, keepTime);
+ } else {
+ mom.utcOffset(-7, keepTime);
+ }
+ };
+
+ m = moment('2014-03-15T00:00:00-07:00').parseZone();
+ m.year(2013);
+ assert.equal(m.format(), '2013-03-15T00:00:00-08:00', 'year across +1');
+
+ m = moment('2014-03-15T00:00:00-07:00').parseZone();
+ m.month(0);
+ assert.equal(m.format(), '2014-01-15T00:00:00-08:00', 'month across +1');
+
+ m = moment('2014-03-15T00:00:00-07:00').parseZone();
+ m.date(1);
+ assert.equal(m.format(), '2014-03-01T00:00:00-08:00', 'date across +1');
+
+ m = moment('2014-03-09T03:05:00-07:00').parseZone();
+ m.hour(0);
+ assert.equal(m.format(), '2014-03-09T00:05:00-08:00', 'hour across +1');
+
+ moment.updateOffset = oldUpdateOffset;
+});
+
+test('setters across DST -1', function (assert) {
+ var oldUpdateOffset = moment.updateOffset,
+ // Based on a real story somewhere in America/Los_Angeles
+ dstAt = moment('2014-11-02T02:00:00-07:00').parseZone(),
+ m;
+
+ moment.updateOffset = function (mom, keepTime) {
+ if (mom.isBefore(dstAt)) {
+ mom.utcOffset(-7, keepTime);
+ } else {
+ mom.utcOffset(-8, keepTime);
+ }
+ };
+
+ m = moment('2014-11-15T00:00:00-08:00').parseZone();
+ m.year(2013);
+ assert.equal(m.format(), '2013-11-15T00:00:00-07:00', 'year across -1');
+
+ m = moment('2014-11-15T00:00:00-08:00').parseZone();
+ m.month(0);
+ assert.equal(m.format(), '2014-01-15T00:00:00-07:00', 'month across -1');
+
+ m = moment('2014-11-15T00:00:00-08:00').parseZone();
+ m.date(1);
+ assert.equal(m.format(), '2014-11-01T00:00:00-07:00', 'date across -1');
+
+ m = moment('2014-11-02T03:30:00-08:00').parseZone();
+ m.hour(0);
+ assert.equal(m.format(), '2014-11-02T00:30:00-07:00', 'hour across -1');
+
+ moment.updateOffset = oldUpdateOffset;
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('instanceof');
+
+test('instanceof', function (assert) {
+ var mm = moment([2010, 0, 1]);
+
+ var extend = function (a, b) {
+ var i;
+ for (i in b) {
+ a[i] = b[i];
+ }
+ return a;
+ };
+
+ assert.equal(moment() instanceof moment, true, 'simple moment object');
+ assert.equal(extend({}, moment()) instanceof moment, false, 'extended moment object');
+ assert.equal(moment(null) instanceof moment, true, 'invalid moment object');
+
+ assert.equal(new Date() instanceof moment, false, 'date object is not moment object');
+ assert.equal(Object instanceof moment, false, 'Object is not moment object');
+ assert.equal('foo' instanceof moment, false, 'string is not moment object');
+ assert.equal(1 instanceof moment, false, 'number is not moment object');
+ assert.equal(NaN instanceof moment, false, 'NaN is not moment object');
+ assert.equal(null instanceof moment, false, 'null is not moment object');
+ assert.equal(undefined instanceof moment, false, 'undefined is not moment object');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('invalid');
+
+test('invalid', function (assert) {
+ var m = moment.invalid();
+ assert.equal(m.isValid(), false);
+ assert.equal(m.parsingFlags().userInvalidated, true);
+ assert.ok(isNaN(m.valueOf()));
+});
+
+test('invalid with existing flag', function (assert) {
+ var m = moment.invalid({invalidMonth : 'whatchamacallit'});
+ assert.equal(m.isValid(), false);
+ assert.equal(m.parsingFlags().userInvalidated, false);
+ assert.equal(m.parsingFlags().invalidMonth, 'whatchamacallit');
+ assert.ok(isNaN(m.valueOf()));
+});
+
+test('invalid with custom flag', function (assert) {
+ var m = moment.invalid({tooBusyWith : 'reiculating splines'});
+ assert.equal(m.isValid(), false);
+ assert.equal(m.parsingFlags().userInvalidated, false);
+ assert.equal(m.parsingFlags().tooBusyWith, 'reiculating splines');
+ assert.ok(isNaN(m.valueOf()));
+});
+
+test('invalid operations', function (assert) {
+ var invalids = [
+ moment.invalid(),
+ moment('xyz', 'l'),
+ moment('2015-01-35', 'YYYY-MM-DD'),
+ moment('2015-01-25 a', 'YYYY-MM-DD', true)
+ ],
+ i,
+ invalid,
+ valid = moment();
+
+ test.expectedDeprecations('moment().min', 'moment().max', 'isDSTShifted');
+
+ for (i = 0; i < invalids.length; ++i) {
+ invalid = invalids[i];
+
+ assert.ok(!invalid.clone().add(5, 'hours').isValid(), 'invalid.add is invalid');
+ assert.equal(invalid.calendar(), 'Invalid date', 'invalid.calendar is \'Invalid date\'');
+ assert.ok(!invalid.clone().isValid(), 'invalid.clone is invalid');
+ assert.ok(isNaN(invalid.diff(valid)), 'invalid.diff(valid) is NaN');
+ assert.ok(isNaN(valid.diff(invalid)), 'valid.diff(invalid) is NaN');
+ assert.ok(isNaN(invalid.diff(invalid)), 'invalid.diff(invalid) is NaN');
+ assert.ok(!invalid.clone().endOf('month').isValid(), 'invalid.endOf is invalid');
+ assert.equal(invalid.format(), 'Invalid date', 'invalid.format is \'Invalid date\'');
+ assert.equal(invalid.from(), 'Invalid date');
+ assert.equal(invalid.from(valid), 'Invalid date');
+ assert.equal(valid.from(invalid), 'Invalid date');
+ assert.equal(invalid.fromNow(), 'Invalid date');
+ assert.equal(invalid.to(), 'Invalid date');
+ assert.equal(invalid.to(valid), 'Invalid date');
+ assert.equal(valid.to(invalid), 'Invalid date');
+ assert.equal(invalid.toNow(), 'Invalid date');
+ assert.ok(isNaN(invalid.get('year')), 'invalid.get is NaN');
+ // TODO invalidAt
+ assert.ok(!invalid.isAfter(valid));
+ assert.ok(!valid.isAfter(invalid));
+ assert.ok(!invalid.isAfter(invalid));
+ assert.ok(!invalid.isBefore(valid));
+ assert.ok(!valid.isBefore(invalid));
+ assert.ok(!invalid.isBefore(invalid));
+ assert.ok(!invalid.isBetween(valid, valid));
+ assert.ok(!valid.isBetween(invalid, valid));
+ assert.ok(!valid.isBetween(valid, invalid));
+ assert.ok(!invalid.isSame(invalid));
+ assert.ok(!invalid.isSame(valid));
+ assert.ok(!valid.isSame(invalid));
+ assert.ok(!invalid.isValid());
+ assert.equal(invalid.locale(), 'en');
+ assert.equal(invalid.localeData()._abbr, 'en');
+ assert.ok(!invalid.clone().max(valid).isValid());
+ assert.ok(!valid.clone().max(invalid).isValid());
+ assert.ok(!invalid.clone().max(invalid).isValid());
+ assert.ok(!invalid.clone().min(valid).isValid());
+ assert.ok(!valid.clone().min(invalid).isValid());
+ assert.ok(!invalid.clone().min(invalid).isValid());
+ assert.ok(!moment.min(invalid, valid).isValid());
+ assert.ok(!moment.min(valid, invalid).isValid());
+ assert.ok(!moment.max(invalid, valid).isValid());
+ assert.ok(!moment.max(valid, invalid).isValid());
+ assert.ok(!invalid.clone().set('year', 2005).isValid());
+ assert.ok(!invalid.clone().startOf('month').isValid());
+
+ assert.ok(!invalid.clone().subtract(5, 'days').isValid());
+ assert.deepEqual(invalid.toArray(), [NaN, NaN, NaN, NaN, NaN, NaN, NaN]);
+ assert.deepEqual(invalid.toObject(), {
+ years: NaN,
+ months: NaN,
+ date: NaN,
+ hours: NaN,
+ minutes: NaN,
+ seconds: NaN,
+ milliseconds: NaN
+ });
+ assert.ok(moment.isDate(invalid.toDate()));
+ assert.ok(isNaN(invalid.toDate().valueOf()));
+ assert.equal(invalid.toJSON(), null);
+ assert.equal(invalid.toString(), 'Invalid date');
+ assert.ok(isNaN(invalid.unix()));
+ assert.ok(isNaN(invalid.valueOf()));
+
+ assert.ok(isNaN(invalid.year()));
+ assert.ok(isNaN(invalid.weekYear()));
+ assert.ok(isNaN(invalid.isoWeekYear()));
+ assert.ok(isNaN(invalid.quarter()));
+ assert.ok(isNaN(invalid.quarters()));
+ assert.ok(isNaN(invalid.month()));
+ assert.ok(isNaN(invalid.daysInMonth()));
+ assert.ok(isNaN(invalid.week()));
+ assert.ok(isNaN(invalid.weeks()));
+ assert.ok(isNaN(invalid.isoWeek()));
+ assert.ok(isNaN(invalid.isoWeeks()));
+ assert.ok(isNaN(invalid.weeksInYear()));
+ assert.ok(isNaN(invalid.isoWeeksInYear()));
+ assert.ok(isNaN(invalid.date()));
+ assert.ok(isNaN(invalid.day()));
+ assert.ok(isNaN(invalid.days()));
+ assert.ok(isNaN(invalid.weekday()));
+ assert.ok(isNaN(invalid.isoWeekday()));
+ assert.ok(isNaN(invalid.dayOfYear()));
+ assert.ok(isNaN(invalid.hour()));
+ assert.ok(isNaN(invalid.hours()));
+ assert.ok(isNaN(invalid.minute()));
+ assert.ok(isNaN(invalid.minutes()));
+ assert.ok(isNaN(invalid.second()));
+ assert.ok(isNaN(invalid.seconds()));
+ assert.ok(isNaN(invalid.millisecond()));
+ assert.ok(isNaN(invalid.milliseconds()));
+ assert.ok(isNaN(invalid.utcOffset()));
+
+ assert.ok(!invalid.clone().year(2001).isValid());
+ assert.ok(!invalid.clone().weekYear(2001).isValid());
+ assert.ok(!invalid.clone().isoWeekYear(2001).isValid());
+ assert.ok(!invalid.clone().quarter(1).isValid());
+ assert.ok(!invalid.clone().quarters(1).isValid());
+ assert.ok(!invalid.clone().month(1).isValid());
+ assert.ok(!invalid.clone().week(1).isValid());
+ assert.ok(!invalid.clone().weeks(1).isValid());
+ assert.ok(!invalid.clone().isoWeek(1).isValid());
+ assert.ok(!invalid.clone().isoWeeks(1).isValid());
+ assert.ok(!invalid.clone().date(1).isValid());
+ assert.ok(!invalid.clone().day(1).isValid());
+ assert.ok(!invalid.clone().days(1).isValid());
+ assert.ok(!invalid.clone().weekday(1).isValid());
+ assert.ok(!invalid.clone().isoWeekday(1).isValid());
+ assert.ok(!invalid.clone().dayOfYear(1).isValid());
+ assert.ok(!invalid.clone().hour(1).isValid());
+ assert.ok(!invalid.clone().hours(1).isValid());
+ assert.ok(!invalid.clone().minute(1).isValid());
+ assert.ok(!invalid.clone().minutes(1).isValid());
+ assert.ok(!invalid.clone().second(1).isValid());
+ assert.ok(!invalid.clone().seconds(1).isValid());
+ assert.ok(!invalid.clone().millisecond(1).isValid());
+ assert.ok(!invalid.clone().milliseconds(1).isValid());
+ assert.ok(!invalid.clone().utcOffset(1).isValid());
+
+ assert.ok(!invalid.clone().utc().isValid());
+ assert.ok(!invalid.clone().local().isValid());
+ assert.ok(!invalid.clone().parseZone('05:30').isValid());
+ assert.ok(!invalid.hasAlignedHourOffset());
+ assert.ok(!invalid.isDST());
+ assert.ok(!invalid.isDSTShifted());
+ assert.ok(!invalid.isLocal());
+ assert.ok(!invalid.isUtcOffset());
+ assert.ok(!invalid.isUtc());
+ assert.ok(!invalid.isUTC());
+
+ assert.ok(!invalid.isLeapYear());
+
+ assert.equal(moment.duration({from: invalid, to: valid}).asMilliseconds(), 0);
+ assert.equal(moment.duration({from: valid, to: invalid}).asMilliseconds(), 0);
+ assert.equal(moment.duration({from: invalid, to: invalid}).asMilliseconds(), 0);
+ }
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('is after');
+
+test('is after without units', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 10)), mCopy = moment(m);
+ assert.equal(m.isAfter(moment(new Date(2012, 3, 2, 3, 5, 5, 10))), false, 'year is later');
+ assert.equal(m.isAfter(moment(new Date(2010, 3, 2, 3, 3, 5, 10))), true, 'year is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 4, 2, 3, 4, 5, 10))), false, 'month is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 2, 2, 3, 4, 5, 10))), true, 'month is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 3, 3, 4, 5, 10))), false, 'day is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 1, 3, 4, 5, 10))), true, 'day is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 4, 4, 5, 10))), false, 'hour is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 2, 4, 5, 10))), true, 'hour is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 5, 5, 10))), false, 'minute is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 3, 5, 10))), true, 'minute is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 4, 6, 10))), false, 'second is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 4, 4, 11))), true, 'second is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 4, 5, 10))), false, 'millisecond match');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 4, 5, 11))), false, 'millisecond is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 4, 5, 9))), true, 'millisecond is earlier');
+ assert.equal(m.isAfter(m), false, 'moments are not after themselves');
+ assert.equal(+m, +mCopy, 'isAfter second should not change moment');
+});
+
+test('is after year', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isAfter(moment(new Date(2011, 5, 6, 7, 8, 9, 10)), 'year'), false, 'year match');
+ assert.equal(m.isAfter(moment(new Date(2010, 5, 6, 7, 8, 9, 10)), 'years'), true, 'plural should work');
+ assert.equal(m.isAfter(moment(new Date(2013, 5, 6, 7, 8, 9, 10)), 'year'), false, 'year is later');
+ assert.equal(m.isAfter(moment(new Date(2010, 5, 6, 7, 8, 9, 10)), 'year'), true, 'year is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 0, 1, 0, 0, 0, 0)), 'year'), false, 'exact start of year');
+ assert.equal(m.isAfter(moment(new Date(2011, 11, 31, 23, 59, 59, 999)), 'year'), false, 'exact end of year');
+ assert.equal(m.isAfter(moment(new Date(2012, 0, 1, 0, 0, 0, 0)), 'year'), false, 'start of next year');
+ assert.equal(m.isAfter(moment(new Date(2010, 11, 31, 23, 59, 59, 999)), 'year'), true, 'end of previous year');
+ assert.equal(m.isAfter(moment(new Date(1980, 11, 31, 23, 59, 59, 999)), 'year'), true, 'end of year far before');
+ assert.equal(m.isAfter(m, 'year'), false, 'same moments are not after the same year');
+ assert.equal(+m, +mCopy, 'isAfter year should not change moment');
+});
+
+test('is after month', function (assert) {
+ var m = moment(new Date(2011, 2, 3, 4, 5, 6, 7)), mCopy = moment(m);
+ assert.equal(m.isAfter(moment(new Date(2011, 2, 6, 7, 8, 9, 10)), 'month'), false, 'month match');
+ assert.equal(m.isAfter(moment(new Date(2010, 2, 6, 7, 8, 9, 10)), 'months'), true, 'plural should work');
+ assert.equal(m.isAfter(moment(new Date(2012, 2, 6, 7, 8, 9, 10)), 'month'), false, 'year is later');
+ assert.equal(m.isAfter(moment(new Date(2010, 2, 6, 7, 8, 9, 10)), 'month'), true, 'year is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 5, 6, 7, 8, 9, 10)), 'month'), false, 'month is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 1, 6, 7, 8, 9, 10)), 'month'), true, 'month is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 2, 1, 0, 0, 0, 0)), 'month'), false, 'exact start of month');
+ assert.equal(m.isAfter(moment(new Date(2011, 2, 31, 23, 59, 59, 999)), 'month'), false, 'exact end of month');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 1, 0, 0, 0, 0)), 'month'), false, 'start of next month');
+ assert.equal(m.isAfter(moment(new Date(2011, 1, 27, 23, 59, 59, 999)), 'month'), true, 'end of previous month');
+ assert.equal(m.isAfter(moment(new Date(2010, 12, 31, 23, 59, 59, 999)), 'month'), true, 'later month but earlier year');
+ assert.equal(m.isAfter(m, 'month'), false, 'same moments are not after the same month');
+ assert.equal(+m, +mCopy, 'isAfter month should not change moment');
+});
+
+test('is after day', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 7, 8, 9, 10)), 'day'), false, 'day match');
+ assert.equal(m.isAfter(moment(new Date(2010, 3, 2, 7, 8, 9, 10)), 'days'), true, 'plural should work');
+ assert.equal(m.isAfter(moment(new Date(2012, 3, 2, 7, 8, 9, 10)), 'day'), false, 'year is later');
+ assert.equal(m.isAfter(moment(new Date(2010, 3, 2, 7, 8, 9, 10)), 'day'), true, 'year is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 4, 2, 7, 8, 9, 10)), 'day'), false, 'month is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 2, 2, 7, 8, 9, 10)), 'day'), true, 'month is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 3, 7, 8, 9, 10)), 'day'), false, 'day is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 1, 7, 8, 9, 10)), 'day'), true, 'day is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 0, 0, 0, 0)), 'day'), false, 'exact start of day');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 23, 59, 59, 999)), 'day'), false, 'exact end of day');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 3, 0, 0, 0, 0)), 'day'), false, 'start of next day');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 1, 23, 59, 59, 999)), 'day'), true, 'end of previous day');
+ assert.equal(m.isAfter(moment(new Date(2010, 3, 10, 0, 0, 0, 0)), 'day'), true, 'later day but earlier year');
+ assert.equal(m.isAfter(m, 'day'), false, 'same moments are not after the same day');
+ assert.equal(+m, +mCopy, 'isAfter day should not change moment');
+});
+
+test('is after hour', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 8, 9, 10)), 'hour'), false, 'hour match');
+ assert.equal(m.isAfter(moment(new Date(2010, 3, 2, 3, 8, 9, 10)), 'hours'), true, 'plural should work');
+ assert.equal(m.isAfter(moment(new Date(2012, 3, 2, 3, 8, 9, 10)), 'hour'), false, 'year is later');
+ assert.equal(m.isAfter(moment(new Date(2010, 3, 2, 3, 8, 9, 10)), 'hour'), true, 'year is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 4, 2, 3, 8, 9, 10)), 'hour'), false, 'month is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 1, 2, 3, 8, 9, 10)), 'hour'), true, 'month is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 3, 3, 8, 9, 10)), 'hour'), false, 'day is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 1, 3, 8, 9, 10)), 'hour'), true, 'day is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 4, 8, 9, 10)), 'hour'), false, 'hour is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 8, 9, 10)), 'hour'), false, 'hour is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 0, 0, 0)), 'hour'), false, 'exact start of hour');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 59, 59, 999)), 'hour'), false, 'exact end of hour');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 4, 0, 0, 0)), 'hour'), false, 'start of next hour');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 2, 59, 59, 999)), 'hour'), true, 'end of previous hour');
+ assert.equal(m.isAfter(m, 'hour'), false, 'same moments are not after the same hour');
+ assert.equal(+m, +mCopy, 'isAfter hour should not change moment');
+});
+
+test('is after minute', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 4, 9, 10)), 'minute'), false, 'minute match');
+ assert.equal(m.isAfter(moment(new Date(2010, 3, 2, 3, 4, 9, 10)), 'minutes'), true, 'plural should work');
+ assert.equal(m.isAfter(moment(new Date(2012, 3, 2, 3, 4, 9, 10)), 'minute'), false, 'year is later');
+ assert.equal(m.isAfter(moment(new Date(2010, 3, 2, 3, 4, 9, 10)), 'minute'), true, 'year is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 4, 2, 3, 4, 9, 10)), 'minute'), false, 'month is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 2, 2, 3, 4, 9, 10)), 'minute'), true, 'month is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 3, 3, 4, 9, 10)), 'minute'), false, 'day is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 1, 3, 4, 9, 10)), 'minute'), true, 'day is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 4, 4, 9, 10)), 'minute'), false, 'hour is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 2, 4, 9, 10)), 'minute'), true, 'hour is earler');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 5, 9, 10)), 'minute'), false, 'minute is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 3, 9, 10)), 'minute'), true, 'minute is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 4, 0, 0)), 'minute'), false, 'exact start of minute');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 4, 59, 999)), 'minute'), false, 'exact end of minute');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 5, 0, 0)), 'minute'), false, 'start of next minute');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 3, 59, 999)), 'minute'), true, 'end of previous minute');
+ assert.equal(m.isAfter(m, 'minute'), false, 'same moments are not after the same minute');
+ assert.equal(+m, +mCopy, 'isAfter minute should not change moment');
+});
+
+test('is after second', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 10)), mCopy = moment(m);
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 4, 5, 10)), 'second'), false, 'second match');
+ assert.equal(m.isAfter(moment(new Date(2010, 3, 2, 3, 4, 5, 10)), 'seconds'), true, 'plural should work');
+ assert.equal(m.isAfter(moment(new Date(2012, 3, 2, 3, 4, 5, 10)), 'second'), false, 'year is later');
+ assert.equal(m.isAfter(moment(new Date(2010, 3, 2, 3, 4, 5, 10)), 'second'), true, 'year is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 4, 2, 3, 4, 5, 10)), 'second'), false, 'month is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 2, 2, 3, 4, 5, 10)), 'second'), true, 'month is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 3, 3, 4, 5, 10)), 'second'), false, 'day is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 1, 1, 4, 5, 10)), 'second'), true, 'day is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 4, 4, 5, 10)), 'second'), false, 'hour is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 1, 4, 1, 5, 10)), 'second'), true, 'hour is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 5, 5, 10)), 'second'), false, 'minute is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 3, 5, 10)), 'second'), true, 'minute is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 4, 6, 10)), 'second'), false, 'second is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 4, 4, 5)), 'second'), true, 'second is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 4, 5, 0)), 'second'), false, 'exact start of second');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 4, 5, 999)), 'second'), false, 'exact end of second');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 4, 6, 0)), 'second'), false, 'start of next second');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 4, 4, 999)), 'second'), true, 'end of previous second');
+ assert.equal(m.isAfter(m, 'second'), false, 'same moments are not after the same second');
+ assert.equal(+m, +mCopy, 'isAfter second should not change moment');
+});
+
+test('is after millisecond', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 10)), mCopy = moment(m);
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 4, 5, 10)), 'millisecond'), false, 'millisecond match');
+ assert.equal(m.isAfter(moment(new Date(2010, 3, 2, 3, 4, 5, 10)), 'milliseconds'), true, 'plural should work');
+ assert.equal(m.isAfter(moment(new Date(2012, 3, 2, 3, 4, 5, 10)), 'millisecond'), false, 'year is later');
+ assert.equal(m.isAfter(moment(new Date(2010, 3, 2, 3, 4, 5, 10)), 'millisecond'), true, 'year is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 4, 2, 3, 4, 5, 10)), 'millisecond'), false, 'month is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 2, 2, 3, 4, 5, 10)), 'millisecond'), true, 'month is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 3, 3, 4, 5, 10)), 'millisecond'), false, 'day is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 1, 1, 4, 5, 10)), 'millisecond'), true, 'day is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 4, 4, 5, 10)), 'millisecond'), false, 'hour is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 1, 4, 1, 5, 10)), 'millisecond'), true, 'hour is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 5, 5, 10)), 'millisecond'), false, 'minute is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 3, 5, 10)), 'millisecond'), true, 'minute is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 4, 6, 10)), 'millisecond'), false, 'second is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 4, 4, 5)), 'millisecond'), true, 'second is earlier');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 4, 6, 11)), 'millisecond'), false, 'millisecond is later');
+ assert.equal(m.isAfter(moment(new Date(2011, 3, 2, 3, 4, 4, 9)), 'millisecond'), true, 'millisecond is earlier');
+ assert.equal(m.isAfter(m, 'millisecond'), false, 'same moments are not after the same millisecond');
+ assert.equal(+m, +mCopy, 'isAfter millisecond should not change moment');
+});
+
+test('is after invalid', function (assert) {
+ var m = moment(), invalid = moment.invalid();
+ assert.equal(m.isAfter(invalid), false, 'valid moment is not after invalid moment');
+ assert.equal(invalid.isAfter(m), false, 'invalid moment is not after valid moment');
+ assert.equal(m.isAfter(invalid, 'year'), false, 'invalid moment year');
+ assert.equal(m.isAfter(invalid, 'month'), false, 'invalid moment month');
+ assert.equal(m.isAfter(invalid, 'day'), false, 'invalid moment day');
+ assert.equal(m.isAfter(invalid, 'hour'), false, 'invalid moment hour');
+ assert.equal(m.isAfter(invalid, 'minute'), false, 'invalid moment minute');
+ assert.equal(m.isAfter(invalid, 'second'), false, 'invalid moment second');
+ assert.equal(m.isAfter(invalid, 'milliseconds'), false, 'invalid moment milliseconds');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function isArray(input) {
+ return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';
+}
+
+test('isArray recognizes Array objects', function (assert) {
+ assert.ok(isArray([1,2,3]), 'array args');
+ assert.ok(isArray([]), 'empty array');
+ assert.ok(isArray(new Array(1,2,3)), 'array constructor');
+});
+
+test('isArray rejects non-Array objects', function (assert) {
+ assert.ok(!isArray(), 'nothing');
+ assert.ok(!isArray(undefined), 'undefined');
+ assert.ok(!isArray(null), 'null');
+ assert.ok(!isArray(123), 'number');
+ assert.ok(!isArray('[1,2,3]'), 'string');
+ assert.ok(!isArray(new Date()), 'date');
+ assert.ok(!isArray({a:1,b:2}), 'object');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('is before');
+
+test('is after without units', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 10)), mCopy = moment(m);
+ assert.equal(m.isBefore(moment(new Date(2012, 3, 2, 3, 5, 5, 10))), true, 'year is later');
+ assert.equal(m.isBefore(moment(new Date(2010, 3, 2, 3, 3, 5, 10))), false, 'year is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 4, 2, 3, 4, 5, 10))), true, 'month is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 2, 2, 3, 4, 5, 10))), false, 'month is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 3, 3, 4, 5, 10))), true, 'day is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 1, 3, 4, 5, 10))), false, 'day is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 4, 4, 5, 10))), true, 'hour is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 2, 4, 5, 10))), false, 'hour is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 5, 5, 10))), true, 'minute is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 3, 5, 10))), false, 'minute is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 4, 6, 10))), true, 'second is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 4, 4, 11))), false, 'second is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 4, 5, 10))), false, 'millisecond match');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 4, 5, 11))), true, 'millisecond is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 4, 5, 9))), false, 'millisecond is earlier');
+ assert.equal(m.isBefore(m), false, 'moments are not before themselves');
+ assert.equal(+m, +mCopy, 'isBefore second should not change moment');
+});
+
+test('is before year', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isBefore(moment(new Date(2011, 5, 6, 7, 8, 9, 10)), 'year'), false, 'year match');
+ assert.equal(m.isBefore(moment(new Date(2012, 5, 6, 7, 8, 9, 10)), 'years'), true, 'plural should work');
+ assert.equal(m.isBefore(moment(new Date(2013, 5, 6, 7, 8, 9, 10)), 'year'), true, 'year is later');
+ assert.equal(m.isBefore(moment(new Date(2010, 5, 6, 7, 8, 9, 10)), 'year'), false, 'year is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 0, 1, 0, 0, 0, 0)), 'year'), false, 'exact start of year');
+ assert.equal(m.isBefore(moment(new Date(2011, 11, 31, 23, 59, 59, 999)), 'year'), false, 'exact end of year');
+ assert.equal(m.isBefore(moment(new Date(2012, 0, 1, 0, 0, 0, 0)), 'year'), true, 'start of next year');
+ assert.equal(m.isBefore(moment(new Date(2010, 11, 31, 23, 59, 59, 999)), 'year'), false, 'end of previous year');
+ assert.equal(m.isBefore(moment(new Date(1980, 11, 31, 23, 59, 59, 999)), 'year'), false, 'end of year far before');
+ assert.equal(m.isBefore(m, 'year'), false, 'same moments are not before the same year');
+ assert.equal(+m, +mCopy, 'isBefore year should not change moment');
+});
+
+test('is before month', function (assert) {
+ var m = moment(new Date(2011, 2, 3, 4, 5, 6, 7)), mCopy = moment(m);
+ assert.equal(m.isBefore(moment(new Date(2011, 2, 6, 7, 8, 9, 10)), 'month'), false, 'month match');
+ assert.equal(m.isBefore(moment(new Date(2012, 2, 6, 7, 8, 9, 10)), 'months'), true, 'plural should work');
+ assert.equal(m.isBefore(moment(new Date(2012, 2, 6, 7, 8, 9, 10)), 'month'), true, 'year is later');
+ assert.equal(m.isBefore(moment(new Date(2010, 2, 6, 7, 8, 9, 10)), 'month'), false, 'year is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 5, 6, 7, 8, 9, 10)), 'month'), true, 'month is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 1, 6, 7, 8, 9, 10)), 'month'), false, 'month is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 2, 1, 0, 0, 0, 0)), 'month'), false, 'exact start of month');
+ assert.equal(m.isBefore(moment(new Date(2011, 2, 31, 23, 59, 59, 999)), 'month'), false, 'exact end of month');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 1, 0, 0, 0, 0)), 'month'), true, 'start of next month');
+ assert.equal(m.isBefore(moment(new Date(2011, 1, 27, 23, 59, 59, 999)), 'month'), false, 'end of previous month');
+ assert.equal(m.isBefore(moment(new Date(2010, 12, 31, 23, 59, 59, 999)), 'month'), false, 'later month but earlier year');
+ assert.equal(m.isBefore(m, 'month'), false, 'same moments are not before the same month');
+ assert.equal(+m, +mCopy, 'isBefore month should not change moment');
+});
+
+test('is before day', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 7, 8, 9, 10)), 'day'), false, 'day match');
+ assert.equal(m.isBefore(moment(new Date(2012, 3, 2, 7, 8, 9, 10)), 'days'), true, 'plural should work');
+ assert.equal(m.isBefore(moment(new Date(2012, 3, 2, 7, 8, 9, 10)), 'day'), true, 'year is later');
+ assert.equal(m.isBefore(moment(new Date(2010, 3, 2, 7, 8, 9, 10)), 'day'), false, 'year is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 4, 2, 7, 8, 9, 10)), 'day'), true, 'month is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 2, 2, 7, 8, 9, 10)), 'day'), false, 'month is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 3, 7, 8, 9, 10)), 'day'), true, 'day is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 1, 7, 8, 9, 10)), 'day'), false, 'day is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 0, 0, 0, 0)), 'day'), false, 'exact start of day');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 23, 59, 59, 999)), 'day'), false, 'exact end of day');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 3, 0, 0, 0, 0)), 'day'), true, 'start of next day');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 1, 23, 59, 59, 999)), 'day'), false, 'end of previous day');
+ assert.equal(m.isBefore(moment(new Date(2010, 3, 10, 0, 0, 0, 0)), 'day'), false, 'later day but earlier year');
+ assert.equal(m.isBefore(m, 'day'), false, 'same moments are not before the same day');
+ assert.equal(+m, +mCopy, 'isBefore day should not change moment');
+});
+
+test('is before hour', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 8, 9, 10)), 'hour'), false, 'hour match');
+ assert.equal(m.isBefore(moment(new Date(2012, 3, 2, 3, 8, 9, 10)), 'hours'), true, 'plural should work');
+ assert.equal(m.isBefore(moment(new Date(2012, 3, 2, 3, 8, 9, 10)), 'hour'), true, 'year is later');
+ assert.equal(m.isBefore(moment(new Date(2010, 3, 2, 3, 8, 9, 10)), 'hour'), false, 'year is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 4, 2, 3, 8, 9, 10)), 'hour'), true, 'month is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 1, 2, 3, 8, 9, 10)), 'hour'), false, 'month is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 3, 3, 8, 9, 10)), 'hour'), true, 'day is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 1, 3, 8, 9, 10)), 'hour'), false, 'day is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 4, 8, 9, 10)), 'hour'), true, 'hour is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 8, 9, 10)), 'hour'), false, 'hour is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 0, 0, 0)), 'hour'), false, 'exact start of hour');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 59, 59, 999)), 'hour'), false, 'exact end of hour');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 4, 0, 0, 0)), 'hour'), true, 'start of next hour');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 2, 59, 59, 999)), 'hour'), false, 'end of previous hour');
+ assert.equal(m.isBefore(m, 'hour'), false, 'same moments are not before the same hour');
+ assert.equal(+m, +mCopy, 'isBefore hour should not change moment');
+});
+
+test('is before minute', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 4, 9, 10)), 'minute'), false, 'minute match');
+ assert.equal(m.isBefore(moment(new Date(2012, 3, 2, 3, 4, 9, 10)), 'minutes'), true, 'plural should work');
+ assert.equal(m.isBefore(moment(new Date(2012, 3, 2, 3, 4, 9, 10)), 'minute'), true, 'year is later');
+ assert.equal(m.isBefore(moment(new Date(2010, 3, 2, 3, 4, 9, 10)), 'minute'), false, 'year is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 4, 2, 3, 4, 9, 10)), 'minute'), true, 'month is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 2, 2, 3, 4, 9, 10)), 'minute'), false, 'month is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 3, 3, 4, 9, 10)), 'minute'), true, 'day is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 1, 3, 4, 9, 10)), 'minute'), false, 'day is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 4, 4, 9, 10)), 'minute'), true, 'hour is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 2, 4, 9, 10)), 'minute'), false, 'hour is earler');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 5, 9, 10)), 'minute'), true, 'minute is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 3, 9, 10)), 'minute'), false, 'minute is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 4, 0, 0)), 'minute'), false, 'exact start of minute');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 4, 59, 999)), 'minute'), false, 'exact end of minute');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 5, 0, 0)), 'minute'), true, 'start of next minute');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 3, 59, 999)), 'minute'), false, 'end of previous minute');
+ assert.equal(m.isBefore(m, 'minute'), false, 'same moments are not before the same minute');
+ assert.equal(+m, +mCopy, 'isBefore minute should not change moment');
+});
+
+test('is before second', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 10)), mCopy = moment(m);
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 4, 5, 10)), 'second'), false, 'second match');
+ assert.equal(m.isBefore(moment(new Date(2012, 3, 2, 3, 4, 5, 10)), 'seconds'), true, 'plural should work');
+ assert.equal(m.isBefore(moment(new Date(2012, 3, 2, 3, 4, 5, 10)), 'second'), true, 'year is later');
+ assert.equal(m.isBefore(moment(new Date(2010, 3, 2, 3, 4, 5, 10)), 'second'), false, 'year is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 4, 2, 3, 4, 5, 10)), 'second'), true, 'month is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 2, 2, 3, 4, 5, 10)), 'second'), false, 'month is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 3, 3, 4, 5, 10)), 'second'), true, 'day is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 1, 1, 4, 5, 10)), 'second'), false, 'day is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 4, 4, 5, 10)), 'second'), true, 'hour is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 1, 4, 1, 5, 10)), 'second'), false, 'hour is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 5, 5, 10)), 'second'), true, 'minute is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 3, 5, 10)), 'second'), false, 'minute is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 4, 6, 10)), 'second'), true, 'second is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 4, 4, 5)), 'second'), false, 'second is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 4, 5, 0)), 'second'), false, 'exact start of second');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 4, 5, 999)), 'second'), false, 'exact end of second');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 4, 6, 0)), 'second'), true, 'start of next second');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 4, 4, 999)), 'second'), false, 'end of previous second');
+ assert.equal(m.isBefore(m, 'second'), false, 'same moments are not before the same second');
+ assert.equal(+m, +mCopy, 'isBefore second should not change moment');
+});
+
+test('is before millisecond', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 10)), mCopy = moment(m);
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 4, 5, 10)), 'millisecond'), false, 'millisecond match');
+ assert.equal(m.isBefore(moment(new Date(2010, 3, 2, 3, 4, 5, 10)), 'milliseconds'), false, 'plural should work');
+ assert.equal(m.isBefore(moment(new Date(2012, 3, 2, 3, 4, 5, 10)), 'millisecond'), true, 'year is later');
+ assert.equal(m.isBefore(moment(new Date(2010, 3, 2, 3, 4, 5, 10)), 'millisecond'), false, 'year is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 4, 2, 3, 4, 5, 10)), 'millisecond'), true, 'month is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 2, 2, 3, 4, 5, 10)), 'millisecond'), false, 'month is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 3, 3, 4, 5, 10)), 'millisecond'), true, 'day is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 1, 1, 4, 5, 10)), 'millisecond'), false, 'day is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 4, 4, 5, 10)), 'millisecond'), true, 'hour is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 1, 4, 1, 5, 10)), 'millisecond'), false, 'hour is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 5, 5, 10)), 'millisecond'), true, 'minute is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 3, 5, 10)), 'millisecond'), false, 'minute is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 4, 6, 10)), 'millisecond'), true, 'second is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 4, 4, 5)), 'millisecond'), false, 'second is earlier');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 4, 6, 11)), 'millisecond'), true, 'millisecond is later');
+ assert.equal(m.isBefore(moment(new Date(2011, 3, 2, 3, 4, 4, 9)), 'millisecond'), false, 'millisecond is earlier');
+ assert.equal(m.isBefore(m, 'millisecond'), false, 'same moments are not before the same millisecond');
+ assert.equal(+m, +mCopy, 'isBefore millisecond should not change moment');
+});
+
+test('is before invalid', function (assert) {
+ var m = moment(), invalid = moment.invalid();
+ assert.equal(m.isBefore(invalid), false, 'valid moment is not before invalid moment');
+ assert.equal(invalid.isBefore(m), false, 'invalid moment is not before valid moment');
+ assert.equal(m.isBefore(invalid, 'year'), false, 'invalid moment year');
+ assert.equal(m.isBefore(invalid, 'month'), false, 'invalid moment month');
+ assert.equal(m.isBefore(invalid, 'day'), false, 'invalid moment day');
+ assert.equal(m.isBefore(invalid, 'hour'), false, 'invalid moment hour');
+ assert.equal(m.isBefore(invalid, 'minute'), false, 'invalid moment minute');
+ assert.equal(m.isBefore(invalid, 'second'), false, 'invalid moment second');
+ assert.equal(m.isBefore(invalid, 'milliseconds'), false, 'invalid moment milliseconds');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('is between');
+
+test('is between without units', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 10)), mCopy = moment(m);
+ assert.equal(m.isBetween(
+ moment(new Date(2009, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10))), false, 'year is later');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2013, 3, 2, 3, 4, 5, 10))), false, 'year is earlier');
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2012, 3, 2, 3, 4, 5, 10))), true, 'year is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10))), false, 'month is later');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 5, 2, 3, 4, 5, 10))), false, 'month is earlier');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 2, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 4, 2, 3, 4, 5, 10))), true, 'month is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 1, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10))), false, 'day is later');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 4, 3, 4, 5, 10))), false, 'day is earlier');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 1, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 3, 3, 4, 5, 10))), true, 'day is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 1, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10))), false, 'hour is later');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 5, 4, 5, 10))), false, 'hour is earlier');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 2, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 4, 4, 5, 10))), true, 'hour is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 6, 5, 10))), false, 'minute is later');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 2, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10))), false, 'minute is earlier');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 3, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 5, 5, 10))), true, 'minute is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 7, 10))), false, 'second is later');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 3, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10))), false, 'second is earlier');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 4, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 6, 10))), true, 'second is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 12))), false, 'millisecond is later');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 8)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10))), false, 'millisecond is earlier');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 9)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 11))), true, 'millisecond is between');
+ assert.equal(m.isBetween(m, m), false, 'moments are not between themselves');
+ assert.equal(+m, +mCopy, 'isBetween second should not change moment');
+});
+
+test('is between without units inclusivity', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 10)), mCopy = moment(m);
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2012, 3, 2, 3, 4, 5, 10)), null, '()'), false, 'start and end are excluded, start is equal to moment');
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)), null, '()'), false, 'start and end are excluded, end is equal to moment');
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2012, 3, 2, 3, 4, 5, 10)), null, '()'), true, 'start and end are excluded, is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2009, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)), null, '()'), false, 'start and end are excluded, is not between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)), null, '()'), false, 'start and end are excluded, should fail on same start/end date.');
+
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2012, 3, 2, 3, 4, 5, 10)), null, '(]'), false, 'start is excluded and end is included should fail on same start date');
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)), null, '(]'), true, 'start is excluded and end is included should succeed on end date');
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2012, 3, 2, 3, 4, 5, 10)), null, '(]'), true, 'start is excluded and end is included, is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2009, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)), null, '(]'), false, 'start is excluded and end is included, is not between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)), null, '(]'), false, 'start is excluded and end is included, should fail on same start/end date.');
+
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2012, 3, 2, 3, 4, 5, 10)), null, '[)'), true, 'start is included and end is excluded should succeed on same start date');
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)), null, '[)'), false, 'start is included and end is excluded should fail on same end date');
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2012, 3, 2, 3, 4, 5, 10)), null, '[)'), true, 'start is included and end is excluded, is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2009, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)), null, '[)'), false, 'start is included and end is excluded, is not between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)), null, '[)'), false, 'start is included and end is excluded, should fail on same end and start date');
+
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2012, 3, 2, 3, 4, 5, 10)), null, '[]'), true, 'start and end inclusive should succeed on same start date');
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)), null, '[]'), true, 'start and end inclusive should succeed on same end date');
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2012, 3, 2, 3, 4, 5, 10)), null, '[]'), true, 'start and end inclusive, is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2009, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)), null, '[]'), false, 'start and end inclusive, is not between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)), null, '[]'), true, 'start and end inclusive, should handle same end and start date');
+});
+
+test('is between milliseconds inclusivity', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 10)), mCopy = moment(m);
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2012, 3, 2, 3, 4, 5, 10)), 'milliseconds'), true, 'options, no inclusive');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2012, 3, 2, 3, 4, 5, 10)), 'milliseconds', '()'), false, 'start and end are excluded, start is equal to moment');
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)), 'milliseconds', '()'), false, 'start and end are excluded, end is equal to moment');
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2012, 3, 2, 3, 4, 5, 10)), 'milliseconds', '()'), true, 'start and end are excluded, is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2009, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)), 'milliseconds', '()'), false, 'start and end are excluded, is not between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)), 'milliseconds', '()'), false, 'start and end are excluded, should fail on same start/end date.');
+
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2012, 3, 2, 3, 4, 5, 10)), 'milliseconds', '(]'), false, 'start is excluded and end is included should fail on same start date');
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)), 'milliseconds', '(]'), true, 'start is excluded and end is included should succeed on end date');
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2012, 3, 2, 3, 4, 5, 10)), 'milliseconds', '(]'), true, 'start is excluded and end is included, is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2009, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)), 'milliseconds', '(]'), false, 'start is excluded and end is included, is not between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)), 'milliseconds', '(]'), false, 'start is excluded and end is included, should fail on same start/end date.');
+
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2012, 3, 2, 3, 4, 5, 10)), 'milliseconds', '[)'), true, 'start is included and end is excluded should succeed on same start date');
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)), 'milliseconds', '[)'), false, 'start is included and end is excluded should fail on same end date');
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2012, 3, 2, 3, 4, 5, 10)), 'milliseconds', '[)'), true, 'start is included and end is excluded, is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2009, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)), 'milliseconds', '[)'), false, 'start is included and end is excluded, is not between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)), 'milliseconds', '[)'), false, 'start is included and end is excluded, should fail on same end and start date');
+
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2012, 3, 2, 3, 4, 5, 10)), 'milliseconds', '[]'), true, 'start and end inclusive should succeed on same start date');
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)), 'milliseconds', '[]'), true, 'start and end inclusive should succeed on same end date');
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2012, 3, 2, 3, 4, 5, 10)), 'milliseconds', '[]'), true, 'start and end inclusive, is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2009, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2010, 3, 2, 3, 4, 5, 10)), 'milliseconds', '[]'), false, 'start and end inclusive, is not between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 3, 2, 3, 4, 5, 10)), 'milliseconds', '[]'), true, 'start and end inclusive, should handle same end and start date');
+});
+
+test('is between year', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 5, 6, 7, 8, 9, 10)),
+ moment(new Date(2011, 5, 6, 7, 8, 9, 10)), 'year'), false, 'year match');
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 5, 6, 7, 8, 9, 10)),
+ moment(new Date(2012, 5, 6, 7, 8, 9, 10)), 'years'), true, 'plural should work');
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 5, 6, 7, 8, 9, 10)),
+ moment(new Date(2012, 5, 6, 7, 8, 9, 10)), 'year'), true, 'year is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 5, 6, 7, 8, 9, 10)),
+ moment(new Date(2013, 5, 6, 7, 8, 9, 10)), 'year'), false, 'year is earlier');
+ assert.equal(m.isBetween(
+ moment(new Date(2010, 5, 6, 7, 8, 9, 10)),
+ moment(new Date(2011, 5, 6, 7, 8, 9, 10)), 'year'), false, 'year is later');
+ assert.equal(m.isBetween(m, 'year'), false, 'same moments are not between the same year');
+ assert.equal(+m, +mCopy, 'isBetween year should not change moment');
+});
+
+test('is between month', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 6, 7, 8, 9, 10)),
+ moment(new Date(2011, 1, 6, 7, 8, 9, 10)), 'month'), false, 'month match');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 0, 6, 7, 8, 9, 10)),
+ moment(new Date(2011, 2, 6, 7, 8, 9, 10)), 'months'), true, 'plural should work');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 0, 31, 23, 59, 59, 999)),
+ moment(new Date(2011, 2, 1, 0, 0, 0, 0)), 'month'), true, 'month is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 6, 7, 8, 9, 10)),
+ moment(new Date(2011, 2, 6, 7, 8, 9, 10)), 'month'), false, 'month is earlier');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 11, 6, 7, 8, 9, 10)),
+ moment(new Date(2011, 1, 6, 7, 8, 9, 10)), 'month'), false, 'month is later');
+ assert.equal(m.isBetween(m, 'month'), false, 'same moments are not between the same month');
+ assert.equal(+m, +mCopy, 'isBetween month should not change moment');
+});
+
+test('is between day', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 7, 8, 9, 10)),
+ moment(new Date(2011, 1, 2, 7, 8, 9, 10)), 'day'), false, 'day match');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 1, 7, 8, 9, 10)),
+ moment(new Date(2011, 1, 3, 7, 8, 9, 10)), 'days'), true, 'plural should work');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 1, 7, 8, 9, 10)),
+ moment(new Date(2011, 1, 3, 7, 8, 9, 10)), 'day'), true, 'day is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 7, 8, 9, 10)),
+ moment(new Date(2011, 1, 4, 7, 8, 9, 10)), 'day'), false, 'day is earlier');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 1, 7, 8, 9, 10)),
+ moment(new Date(2011, 1, 2, 7, 8, 9, 10)), 'day'), false, 'day is later');
+ assert.equal(m.isBetween(m, 'day'), false, 'same moments are not between the same day');
+ assert.equal(+m, +mCopy, 'isBetween day should not change moment');
+});
+
+test('is between hour', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 3, 5, 9, 10)),
+ moment(new Date(2011, 1, 2, 3, 9, 9, 10)), 'hour'), false, 'hour match');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 1, 59, 59, 999)),
+ moment(new Date(2011, 1, 2, 4, 0, 0, 0)), 'hours'), true, 'plural should work');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 2, 59, 59, 999)),
+ moment(new Date(2011, 1, 2, 4, 0, 0, 0)), 'hour'), true, 'hour is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 7, 8, 9, 10)),
+ moment(new Date(2011, 1, 2, 7, 8, 9, 10)), 'hour'), false, 'hour is earlier');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 7, 8, 9, 10)),
+ moment(new Date(2011, 1, 2, 7, 8, 9, 10)), 'hour'), false, 'hour is later');
+ assert.equal(m.isBetween(m, 'hour'), false, 'same moments are not between the same hour');
+ assert.equal(+m, +mCopy, 'isBetween hour should not change moment');
+});
+
+test('is between minute', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 3, 4, 9, 10)),
+ moment(new Date(2011, 1, 2, 3, 4, 9, 10)), 'minute'), false, 'minute match');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 3, 3, 9, 10)),
+ moment(new Date(2011, 1, 2, 3, 5, 9, 10)), 'minutes'), true, 'plural should work');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 3, 3, 59, 999)),
+ moment(new Date(2011, 1, 2, 3, 5, 0, 0)), 'minute'), true, 'minute is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 3, 5, 0, 0)),
+ moment(new Date(2011, 1, 2, 3, 8, 9, 10)), 'minute'), false, 'minute is earlier');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 3, 2, 9, 10)),
+ moment(new Date(2011, 1, 2, 3, 3, 59, 999)), 'minute'), false, 'minute is later');
+ assert.equal(m.isBetween(m, 'minute'), false, 'same moments are not between the same minute');
+ assert.equal(+m, +mCopy, 'isBetween minute should not change moment');
+});
+
+test('is between second', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 3, 4, 5, 10)),
+ moment(new Date(2011, 1, 2, 3, 4, 5, 10)), 'second'), false, 'second match');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 3, 4, 4, 10)),
+ moment(new Date(2011, 1, 2, 3, 4, 6, 10)), 'seconds'), true, 'plural should work');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 3, 4, 4, 999)),
+ moment(new Date(2011, 1, 2, 3, 4, 6, 0)), 'second'), true, 'second is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 3, 4, 6, 0)),
+ moment(new Date(2011, 1, 2, 3, 4, 7, 10)), 'second'), false, 'second is earlier');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 3, 4, 3, 10)),
+ moment(new Date(2011, 1, 2, 3, 4, 4, 999)), 'second'), false, 'second is later');
+ assert.equal(m.isBetween(m, 'second'), false, 'same moments are not between the same second');
+ assert.equal(+m, +mCopy, 'isBetween second should not change moment');
+});
+
+test('is between millisecond', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 3, 4, 5, 6)),
+ moment(new Date(2011, 1, 2, 3, 4, 5, 6)), 'millisecond'), false, 'millisecond match');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 3, 4, 5, 5)),
+ moment(new Date(2011, 1, 2, 3, 4, 5, 7)), 'milliseconds'), true, 'plural should work');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 3, 4, 5, 5)),
+ moment(new Date(2011, 1, 2, 3, 4, 5, 7)), 'millisecond'), true, 'millisecond is between');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 3, 4, 5, 7)),
+ moment(new Date(2011, 1, 2, 3, 4, 5, 10)), 'millisecond'), false, 'millisecond is earlier');
+ assert.equal(m.isBetween(
+ moment(new Date(2011, 1, 2, 3, 4, 5, 4)),
+ moment(new Date(2011, 1, 2, 3, 4, 5, 6)), 'millisecond'), false, 'millisecond is later');
+ assert.equal(m.isBetween(m, 'millisecond'), false, 'same moments are not between the same millisecond');
+ assert.equal(+m, +mCopy, 'isBetween millisecond should not change moment');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('is date');
+
+test('isDate recognizes Date objects', function (assert) {
+ assert.ok(moment.isDate(new Date()), 'no args (now)');
+ assert.ok(moment.isDate(new Date([2014, 2, 15])), 'array args');
+ assert.ok(moment.isDate(new Date('2014-03-15')), 'string args');
+ assert.ok(moment.isDate(new Date('does NOT look like a date')), 'invalid date');
+});
+
+test('isDate rejects non-Date objects', function (assert) {
+ assert.ok(!moment.isDate(), 'nothing');
+ assert.ok(!moment.isDate(undefined), 'undefined');
+ assert.ok(!moment.isDate(null), 'string args');
+ assert.ok(!moment.isDate(42), 'number');
+ assert.ok(!moment.isDate('2014-03-15'), 'string');
+ assert.ok(!moment.isDate([2014, 2, 15]), 'array');
+ assert.ok(!moment.isDate({year: 2014, month: 2, day: 15}), 'object');
+ assert.ok(!moment.isDate({
+ toString: function () {
+ return '[object Date]';
+ }
+ }), 'lying object');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('is moment');
+
+test('is moment object', function (assert) {
+ var MyObj = function () {},
+ extend = function (a, b) {
+ var i;
+ for (i in b) {
+ a[i] = b[i];
+ }
+ return a;
+ };
+ MyObj.prototype.toDate = function () {
+ return new Date();
+ };
+
+ assert.ok(moment.isMoment(moment()), 'simple moment object');
+ assert.ok(moment.isMoment(moment(null)), 'invalid moment object');
+ assert.ok(moment.isMoment(extend({}, moment())), 'externally cloned moments are moments');
+ assert.ok(moment.isMoment(extend({}, moment.utc())), 'externally cloned utc moments are moments');
+
+ assert.ok(!moment.isMoment(new MyObj()), 'myObj is not moment object');
+ assert.ok(!moment.isMoment(moment), 'moment function is not moment object');
+ assert.ok(!moment.isMoment(new Date()), 'date object is not moment object');
+ assert.ok(!moment.isMoment(Object), 'Object is not moment object');
+ assert.ok(!moment.isMoment('foo'), 'string is not moment object');
+ assert.ok(!moment.isMoment(1), 'number is not moment object');
+ assert.ok(!moment.isMoment(NaN), 'NaN is not moment object');
+ assert.ok(!moment.isMoment(null), 'null is not moment object');
+ assert.ok(!moment.isMoment(undefined), 'undefined is not moment object');
+});
+
+test('is moment with hacked hasOwnProperty', function (assert) {
+ var obj = {};
+ // HACK to suppress jshint warning about bad property name
+ obj['hasOwnMoney'.replace('Money', 'Property')] = function () {
+ return true;
+ };
+
+ assert.ok(!moment.isMoment(obj), 'isMoment works even if passed object has a wrong hasOwnProperty implementation (ie8)');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function isNumber(input) {
+ return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';
+}
+
+test('isNumber recognizes numbers', function (assert) {
+ assert.ok(isNumber(1), 'simple integer');
+ assert.ok(isNumber(0), 'simple number');
+ assert.ok(isNumber(-0), 'silly number');
+ assert.ok(isNumber(1010010293029), 'large number');
+ assert.ok(isNumber(Infinity), 'largest number');
+ assert.ok(isNumber(-Infinity), 'smallest number');
+ assert.ok(isNumber(NaN), 'not number');
+ assert.ok(isNumber(1.100393830000), 'decimal numbers');
+ assert.ok(isNumber(Math.LN2), 'natural log of two');
+ assert.ok(isNumber(Math.PI), 'delicious number');
+ assert.ok(isNumber(5e10), 'scientifically notated number');
+ assert.ok(isNumber(new Number(1)), 'number primitive wrapped in an object'); // jshint ignore:line
+});
+
+test('isNumber rejects non-numbers', function (assert) {
+ assert.ok(!isNumber(), 'nothing');
+ assert.ok(!isNumber(undefined), 'undefined');
+ assert.ok(!isNumber(null), 'null');
+ assert.ok(!isNumber([1]), 'array');
+ assert.ok(!isNumber('[1,2,3]'), 'string');
+ assert.ok(!isNumber(new Date()), 'date');
+ assert.ok(!isNumber({a:1,b:2}), 'object');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('is same');
+
+test('is same without units', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 10)), mCopy = moment(m);
+ assert.equal(m.isSame(moment(new Date(2012, 3, 2, 3, 5, 5, 10))), false, 'year is later');
+ assert.equal(m.isSame(moment(new Date(2010, 3, 2, 3, 3, 5, 10))), false, 'year is earlier');
+ assert.equal(m.isSame(moment(new Date(2011, 4, 2, 3, 4, 5, 10))), false, 'month is later');
+ assert.equal(m.isSame(moment(new Date(2011, 2, 2, 3, 4, 5, 10))), false, 'month is earlier');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 3, 3, 4, 5, 10))), false, 'day is later');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 1, 3, 4, 5, 10))), false, 'day is earlier');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 2, 4, 4, 5, 10))), false, 'hour is later');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 2, 2, 4, 5, 10))), false, 'hour is earlier');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 2, 3, 5, 5, 10))), false, 'minute is later');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 2, 3, 3, 5, 10))), false, 'minute is earlier');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 2, 3, 4, 6, 10))), false, 'second is later');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 2, 3, 4, 4, 11))), false, 'second is earlier');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 2, 3, 4, 5, 10))), true, 'millisecond match');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 2, 3, 4, 5, 11))), false, 'millisecond is later');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 2, 3, 4, 5, 9))), false, 'millisecond is earlier');
+ assert.equal(m.isSame(m), true, 'moments are the same as themselves');
+ assert.equal(+m, +mCopy, 'isSame second should not change moment');
+});
+
+test('is same year', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isSame(moment(new Date(2011, 5, 6, 7, 8, 9, 10)), 'year'), true, 'year match');
+ assert.equal(m.isSame(moment(new Date(2011, 5, 6, 7, 8, 9, 10)), 'years'), true, 'plural should work');
+ assert.equal(m.isSame(moment(new Date(2012, 5, 6, 7, 8, 9, 10)), 'year'), false, 'year mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 0, 1, 0, 0, 0, 0)), 'year'), true, 'exact start of year');
+ assert.equal(m.isSame(moment(new Date(2011, 11, 31, 23, 59, 59, 999)), 'year'), true, 'exact end of year');
+ assert.equal(m.isSame(moment(new Date(2012, 0, 1, 0, 0, 0, 0)), 'year'), false, 'start of next year');
+ assert.equal(m.isSame(moment(new Date(2010, 11, 31, 23, 59, 59, 999)), 'year'), false, 'end of previous year');
+ assert.equal(m.isSame(m, 'year'), true, 'same moments are in the same year');
+ assert.equal(+m, +mCopy, 'isSame year should not change moment');
+});
+
+test('is same month', function (assert) {
+ var m = moment(new Date(2011, 2, 3, 4, 5, 6, 7)), mCopy = moment(m);
+ assert.equal(m.isSame(moment(new Date(2011, 2, 6, 7, 8, 9, 10)), 'month'), true, 'month match');
+ assert.equal(m.isSame(moment(new Date(2011, 2, 6, 7, 8, 9, 10)), 'months'), true, 'plural should work');
+ assert.equal(m.isSame(moment(new Date(2012, 2, 6, 7, 8, 9, 10)), 'month'), false, 'year mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 5, 6, 7, 8, 9, 10)), 'month'), false, 'month mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 2, 1, 0, 0, 0, 0)), 'month'), true, 'exact start of month');
+ assert.equal(m.isSame(moment(new Date(2011, 2, 31, 23, 59, 59, 999)), 'month'), true, 'exact end of month');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 1, 0, 0, 0, 0)), 'month'), false, 'start of next month');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 27, 23, 59, 59, 999)), 'month'), false, 'end of previous month');
+ assert.equal(m.isSame(m, 'month'), true, 'same moments are in the same month');
+ assert.equal(+m, +mCopy, 'isSame month should not change moment');
+});
+
+test('is same day', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 7, 8, 9, 10)), 'day'), true, 'day match');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 7, 8, 9, 10)), 'days'), true, 'plural should work');
+ assert.equal(m.isSame(moment(new Date(2012, 1, 2, 7, 8, 9, 10)), 'day'), false, 'year mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 2, 2, 7, 8, 9, 10)), 'day'), false, 'month mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 3, 7, 8, 9, 10)), 'day'), false, 'day mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 0, 0, 0, 0)), 'day'), true, 'exact start of day');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 23, 59, 59, 999)), 'day'), true, 'exact end of day');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 3, 0, 0, 0, 0)), 'day'), false, 'start of next day');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 1, 23, 59, 59, 999)), 'day'), false, 'end of previous day');
+ assert.equal(m.isSame(m, 'day'), true, 'same moments are in the same day');
+ assert.equal(+m, +mCopy, 'isSame day should not change moment');
+});
+
+test('is same hour', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 3, 8, 9, 10)), 'hour'), true, 'hour match');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 3, 8, 9, 10)), 'hours'), true, 'plural should work');
+ assert.equal(m.isSame(moment(new Date(2012, 1, 2, 3, 8, 9, 10)), 'hour'), false, 'year mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 2, 2, 3, 8, 9, 10)), 'hour'), false, 'month mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 3, 3, 8, 9, 10)), 'hour'), false, 'day mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 4, 8, 9, 10)), 'hour'), false, 'hour mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 3, 0, 0, 0)), 'hour'), true, 'exact start of hour');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 3, 59, 59, 999)), 'hour'), true, 'exact end of hour');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 4, 0, 0, 0)), 'hour'), false, 'start of next hour');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 2, 59, 59, 999)), 'hour'), false, 'end of previous hour');
+ assert.equal(m.isSame(m, 'hour'), true, 'same moments are in the same hour');
+ assert.equal(+m, +mCopy, 'isSame hour should not change moment');
+});
+
+test('is same minute', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 3, 4, 9, 10)), 'minute'), true, 'minute match');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 3, 4, 9, 10)), 'minutes'), true, 'plural should work');
+ assert.equal(m.isSame(moment(new Date(2012, 1, 2, 3, 4, 9, 10)), 'minute'), false, 'year mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 2, 2, 3, 4, 9, 10)), 'minute'), false, 'month mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 3, 3, 4, 9, 10)), 'minute'), false, 'day mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 4, 4, 9, 10)), 'minute'), false, 'hour mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 3, 5, 9, 10)), 'minute'), false, 'minute mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 3, 4, 0, 0)), 'minute'), true, 'exact start of minute');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 3, 4, 59, 999)), 'minute'), true, 'exact end of minute');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 3, 5, 0, 0)), 'minute'), false, 'start of next minute');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 3, 3, 59, 999)), 'minute'), false, 'end of previous minute');
+ assert.equal(m.isSame(m, 'minute'), true, 'same moments are in the same minute');
+ assert.equal(+m, +mCopy, 'isSame minute should not change moment');
+});
+
+test('is same second', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 3, 4, 5, 10)), 'second'), true, 'second match');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 3, 4, 5, 10)), 'seconds'), true, 'plural should work');
+ assert.equal(m.isSame(moment(new Date(2012, 1, 2, 3, 4, 5, 10)), 'second'), false, 'year mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 2, 2, 3, 4, 5, 10)), 'second'), false, 'month mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 3, 3, 4, 5, 10)), 'second'), false, 'day mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 4, 4, 5, 10)), 'second'), false, 'hour mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 3, 5, 5, 10)), 'second'), false, 'minute mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 3, 4, 6, 10)), 'second'), false, 'second mismatch');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 3, 4, 5, 0)), 'second'), true, 'exact start of second');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 3, 4, 5, 999)), 'second'), true, 'exact end of second');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 3, 4, 6, 0)), 'second'), false, 'start of next second');
+ assert.equal(m.isSame(moment(new Date(2011, 1, 2, 3, 4, 4, 999)), 'second'), false, 'end of previous second');
+ assert.equal(m.isSame(m, 'second'), true, 'same moments are in the same second');
+ assert.equal(+m, +mCopy, 'isSame second should not change moment');
+});
+
+test('is same millisecond', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 10)), mCopy = moment(m);
+ assert.equal(m.isSame(moment(new Date(2011, 3, 2, 3, 4, 5, 10)), 'millisecond'), true, 'millisecond match');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 2, 3, 4, 5, 10)), 'milliseconds'), true, 'plural should work');
+ assert.equal(m.isSame(moment(new Date(2012, 3, 2, 3, 4, 5, 10)), 'millisecond'), false, 'year is later');
+ assert.equal(m.isSame(moment(new Date(2010, 3, 2, 3, 4, 5, 10)), 'millisecond'), false, 'year is earlier');
+ assert.equal(m.isSame(moment(new Date(2011, 4, 2, 3, 4, 5, 10)), 'millisecond'), false, 'month is later');
+ assert.equal(m.isSame(moment(new Date(2011, 2, 2, 3, 4, 5, 10)), 'millisecond'), false, 'month is earlier');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 3, 3, 4, 5, 10)), 'millisecond'), false, 'day is later');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 1, 1, 4, 5, 10)), 'millisecond'), false, 'day is earlier');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 2, 4, 4, 5, 10)), 'millisecond'), false, 'hour is later');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 1, 4, 1, 5, 10)), 'millisecond'), false, 'hour is earlier');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 2, 3, 5, 5, 10)), 'millisecond'), false, 'minute is later');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 2, 3, 3, 5, 10)), 'millisecond'), false, 'minute is earlier');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 2, 3, 4, 6, 10)), 'millisecond'), false, 'second is later');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 2, 3, 4, 4, 5)), 'millisecond'), false, 'second is earlier');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 2, 3, 4, 6, 11)), 'millisecond'), false, 'millisecond is later');
+ assert.equal(m.isSame(moment(new Date(2011, 3, 2, 3, 4, 4, 9)), 'millisecond'), false, 'millisecond is earlier');
+ assert.equal(m.isSame(m, 'millisecond'), true, 'same moments are in the same millisecond');
+ assert.equal(+m, +mCopy, 'isSame millisecond should not change moment');
+});
+
+test('is same with utc offset moments', function (assert) {
+ assert.ok(moment.parseZone('2013-02-01T00:00:00-05:00').isSame(moment('2013-02-01'), 'year'), 'zoned vs local moment');
+ assert.ok(moment('2013-02-01').isSame(moment('2013-02-01').utcOffset('-05:00'), 'year'), 'local vs zoned moment');
+ assert.ok(moment.parseZone('2013-02-01T00:00:00-05:00').isSame(moment.parseZone('2013-02-01T00:00:00-06:30'), 'year'),
+ 'zoned vs (differently) zoned moment');
+});
+
+test('is same with invalid moments', function (assert) {
+ assert.equal(moment.invalid().isSame(moment.invalid()), false, 'invalid moments are not considered equal');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('is same or after');
+
+test('is same or after without units', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 10)), mCopy = moment(m);
+ assert.equal(m.isSameOrAfter(moment(new Date(2012, 3, 2, 3, 5, 5, 10))), false, 'year is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2010, 3, 2, 3, 3, 5, 10))), true, 'year is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 4, 2, 3, 4, 5, 10))), false, 'month is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 2, 2, 3, 4, 5, 10))), true, 'month is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 3, 3, 4, 5, 10))), false, 'day is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 1, 3, 4, 5, 10))), true, 'day is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 2, 4, 4, 5, 10))), false, 'hour is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 2, 2, 4, 5, 10))), true, 'hour is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 2, 3, 5, 5, 10))), false, 'minute is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 2, 3, 3, 5, 10))), true, 'minute is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 2, 3, 4, 6, 10))), false, 'second is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 2, 3, 4, 4, 11))), true, 'second is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 2, 3, 4, 5, 10))), true, 'millisecond match');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 2, 3, 4, 5, 11))), false, 'millisecond is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 2, 3, 4, 5, 9))), true, 'millisecond is earlier');
+ assert.equal(m.isSameOrAfter(m), true, 'moments are the same as themselves');
+ assert.equal(+m, +mCopy, 'isSameOrAfter second should not change moment');
+});
+
+test('is same or after year', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 5, 6, 7, 8, 9, 10)), 'year'), true, 'year match');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 5, 6, 7, 8, 9, 10)), 'years'), true, 'plural should work');
+ assert.equal(m.isSameOrAfter(moment(new Date(2012, 5, 6, 7, 8, 9, 10)), 'year'), false, 'year is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2010, 5, 6, 7, 8, 9, 10)), 'year'), true, 'year is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 0, 1, 0, 0, 0, 0)), 'year'), true, 'exact start of year');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 11, 31, 23, 59, 59, 999)), 'year'), true, 'exact end of year');
+ assert.equal(m.isSameOrAfter(moment(new Date(2012, 0, 1, 0, 0, 0, 0)), 'year'), false, 'start of next year');
+ assert.equal(m.isSameOrAfter(moment(new Date(2010, 11, 31, 23, 59, 59, 999)), 'year'), true, 'end of previous year');
+ assert.equal(m.isSameOrAfter(m, 'year'), true, 'same moments are in the same year');
+ assert.equal(+m, +mCopy, 'isSameOrAfter year should not change moment');
+});
+
+test('is same or after month', function (assert) {
+ var m = moment(new Date(2011, 2, 3, 4, 5, 6, 7)), mCopy = moment(m);
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 2, 6, 7, 8, 9, 10)), 'month'), true, 'month match');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 2, 6, 7, 8, 9, 10)), 'months'), true, 'plural should work');
+ assert.equal(m.isSameOrAfter(moment(new Date(2012, 2, 6, 7, 8, 9, 10)), 'month'), false, 'year is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2010, 2, 6, 7, 8, 9, 10)), 'month'), true, 'year is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 5, 6, 7, 8, 9, 10)), 'month'), false, 'month is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 6, 7, 8, 9, 10)), 'month'), true, 'month is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 2, 1, 0, 0, 0, 0)), 'month'), true, 'exact start of month');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 2, 31, 23, 59, 59, 999)), 'month'), true, 'exact end of month');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 1, 0, 0, 0, 0)), 'month'), false, 'start of next month');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 27, 23, 59, 59, 999)), 'month'), true, 'end of previous month');
+ assert.equal(m.isSameOrAfter(m, 'month'), true, 'same moments are in the same month');
+ assert.equal(+m, +mCopy, 'isSameOrAfter month should not change moment');
+});
+
+test('is same or after day', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 7, 8, 9, 10)), 'day'), true, 'day match');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 7, 8, 9, 10)), 'days'), true, 'plural should work');
+ assert.equal(m.isSameOrAfter(moment(new Date(2012, 1, 2, 7, 8, 9, 10)), 'day'), false, 'year is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2010, 1, 2, 7, 8, 9, 10)), 'day'), true, 'year is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 2, 2, 7, 8, 9, 10)), 'day'), false, 'month is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2010, 12, 2, 7, 8, 9, 10)), 'day'), true, 'month is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 3, 7, 8, 9, 10)), 'day'), false, 'day is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 1, 7, 8, 9, 10)), 'day'), true, 'day is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 0, 0, 0, 0)), 'day'), true, 'exact start of day');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 23, 59, 59, 999)), 'day'), true, 'exact end of day');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 3, 0, 0, 0, 0)), 'day'), false, 'start of next day');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 1, 23, 59, 59, 999)), 'day'), true, 'end of previous day');
+ assert.equal(m.isSameOrAfter(m, 'day'), true, 'same moments are in the same day');
+ assert.equal(+m, +mCopy, 'isSameOrAfter day should not change moment');
+});
+
+test('is same or after hour', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 8, 9, 10)), 'hour'), true, 'hour match');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 8, 9, 10)), 'hours'), true, 'plural should work');
+ assert.equal(m.isSameOrAfter(moment(new Date(2012, 1, 2, 3, 8, 9, 10)), 'hour'), false, 'year is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2010, 1, 2, 3, 8, 9, 10)), 'hour'), true, 'year is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 2, 2, 3, 8, 9, 10)), 'hour'), false, 'month is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2010, 12, 2, 3, 8, 9, 10)), 'hour'), true, 'month is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 3, 3, 8, 9, 10)), 'hour'), false, 'day is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 1, 3, 8, 9, 10)), 'hour'), true, 'day is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 4, 8, 9, 10)), 'hour'), false, 'hour is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 2, 8, 9, 10)), 'hour'), true, 'hour is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 0, 0, 0)), 'hour'), true, 'exact start of hour');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 59, 59, 999)), 'hour'), true, 'exact end of hour');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 4, 0, 0, 0)), 'hour'), false, 'start of next hour');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 2, 59, 59, 999)), 'hour'), true, 'end of previous hour');
+ assert.equal(m.isSameOrAfter(m, 'hour'), true, 'same moments are in the same hour');
+ assert.equal(+m, +mCopy, 'isSameOrAfter hour should not change moment');
+});
+
+test('is same or after minute', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 4, 9, 10)), 'minute'), true, 'minute match');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 4, 9, 10)), 'minutes'), true, 'plural should work');
+ assert.equal(m.isSameOrAfter(moment(new Date(2012, 1, 2, 3, 4, 9, 10)), 'minute'), false, 'year is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2010, 1, 2, 3, 4, 9, 10)), 'minute'), true, 'year is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 2, 2, 3, 4, 9, 10)), 'minute'), false, 'month is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2010, 12, 2, 3, 4, 9, 10)), 'minute'), true, 'month is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 3, 3, 4, 9, 10)), 'minute'), false, 'day is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 1, 3, 4, 9, 10)), 'minute'), true, 'day is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 4, 4, 9, 10)), 'minute'), false, 'hour is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 2, 4, 9, 10)), 'minute'), true, 'hour is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 5, 9, 10)), 'minute'), false, 'minute is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 3, 9, 10)), 'minute'), true, 'minute is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 4, 0, 0)), 'minute'), true, 'exact start of minute');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 4, 59, 999)), 'minute'), true, 'exact end of minute');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 5, 0, 0)), 'minute'), false, 'start of next minute');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 3, 59, 999)), 'minute'), true, 'end of previous minute');
+ assert.equal(m.isSameOrAfter(m, 'minute'), true, 'same moments are in the same minute');
+ assert.equal(+m, +mCopy, 'isSameOrAfter minute should not change moment');
+});
+
+test('is same or after second', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 4, 5, 10)), 'second'), true, 'second match');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 4, 5, 10)), 'seconds'), true, 'plural should work');
+ assert.equal(m.isSameOrAfter(moment(new Date(2012, 1, 2, 3, 4, 5, 10)), 'second'), false, 'year is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2010, 1, 2, 3, 4, 5, 10)), 'second'), true, 'year is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 2, 2, 3, 4, 5, 10)), 'second'), false, 'month is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2010, 12, 2, 3, 4, 5, 10)), 'second'), true, 'month is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 3, 3, 4, 5, 10)), 'second'), false, 'day is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 1, 3, 4, 5, 10)), 'second'), true, 'day is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 4, 4, 5, 10)), 'second'), false, 'hour is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 2, 4, 5, 10)), 'second'), true, 'hour is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 5, 5, 10)), 'second'), false, 'minute is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 3, 5, 10)), 'second'), true, 'minute is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 4, 6, 10)), 'second'), false, 'second is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 4, 4, 10)), 'second'), true, 'second is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 4, 5, 0)), 'second'), true, 'exact start of second');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 4, 5, 999)), 'second'), true, 'exact end of second');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 4, 6, 0)), 'second'), false, 'start of next second');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 1, 2, 3, 4, 4, 999)), 'second'), true, 'end of previous second');
+ assert.equal(m.isSameOrAfter(m, 'second'), true, 'same moments are in the same second');
+ assert.equal(+m, +mCopy, 'isSameOrAfter second should not change moment');
+});
+
+test('is same or after millisecond', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 10)), mCopy = moment(m);
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 2, 3, 4, 5, 10)), 'millisecond'), true, 'millisecond match');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 2, 3, 4, 5, 10)), 'milliseconds'), true, 'plural should work');
+ assert.equal(m.isSameOrAfter(moment(new Date(2012, 3, 2, 3, 4, 5, 10)), 'millisecond'), false, 'year is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2010, 3, 2, 3, 4, 5, 10)), 'millisecond'), true, 'year is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 4, 2, 3, 4, 5, 10)), 'millisecond'), false, 'month is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 2, 2, 3, 4, 5, 10)), 'millisecond'), true, 'month is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 3, 3, 4, 5, 10)), 'millisecond'), false, 'day is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 1, 1, 4, 5, 10)), 'millisecond'), true, 'day is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 2, 4, 4, 5, 10)), 'millisecond'), false, 'hour is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 1, 4, 1, 5, 10)), 'millisecond'), true, 'hour is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 2, 3, 5, 5, 10)), 'millisecond'), false, 'minute is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 2, 3, 3, 5, 10)), 'millisecond'), true, 'minute is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 2, 3, 4, 6, 10)), 'millisecond'), false, 'second is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 2, 3, 4, 4, 5)), 'millisecond'), true, 'second is earlier');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 2, 3, 4, 6, 11)), 'millisecond'), false, 'millisecond is later');
+ assert.equal(m.isSameOrAfter(moment(new Date(2011, 3, 2, 3, 4, 4, 9)), 'millisecond'), true, 'millisecond is earlier');
+ assert.equal(m.isSameOrAfter(m, 'millisecond'), true, 'same moments are in the same millisecond');
+ assert.equal(+m, +mCopy, 'isSameOrAfter millisecond should not change moment');
+});
+
+test('is same or after with utc offset moments', function (assert) {
+ assert.ok(moment.parseZone('2013-02-01T00:00:00-05:00').isSameOrAfter(moment('2013-02-01'), 'year'), 'zoned vs local moment');
+ assert.ok(moment('2013-02-01').isSameOrAfter(moment('2013-02-01').utcOffset('-05:00'), 'year'), 'local vs zoned moment');
+ assert.ok(moment.parseZone('2013-02-01T00:00:00-05:00').isSameOrAfter(moment.parseZone('2013-02-01T00:00:00-06:30'), 'year'),
+ 'zoned vs (differently) zoned moment');
+});
+
+test('is same or after with invalid moments', function (assert) {
+ var m = moment(), invalid = moment.invalid();
+ assert.equal(invalid.isSameOrAfter(invalid), false, 'invalid moments are not considered equal');
+ assert.equal(m.isSameOrAfter(invalid), false, 'valid moment is not after invalid moment');
+ assert.equal(invalid.isSameOrAfter(m), false, 'invalid moment is not after valid moment');
+ assert.equal(m.isSameOrAfter(invalid, 'year'), false, 'invalid moment year');
+ assert.equal(m.isSameOrAfter(invalid, 'month'), false, 'invalid moment month');
+ assert.equal(m.isSameOrAfter(invalid, 'day'), false, 'invalid moment day');
+ assert.equal(m.isSameOrAfter(invalid, 'hour'), false, 'invalid moment hour');
+ assert.equal(m.isSameOrAfter(invalid, 'minute'), false, 'invalid moment minute');
+ assert.equal(m.isSameOrAfter(invalid, 'second'), false, 'invalid moment second');
+ assert.equal(m.isSameOrAfter(invalid, 'milliseconds'), false, 'invalid moment milliseconds');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('is same or before');
+
+test('is same or before without units', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 10)), mCopy = moment(m);
+ assert.equal(m.isSameOrBefore(moment(new Date(2012, 3, 2, 3, 5, 5, 10))), true, 'year is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2010, 3, 2, 3, 3, 5, 10))), false, 'year is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 4, 2, 3, 4, 5, 10))), true, 'month is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 2, 2, 3, 4, 5, 10))), false, 'month is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 3, 3, 4, 5, 10))), true, 'day is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 1, 3, 4, 5, 10))), false, 'day is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 2, 4, 4, 5, 10))), true, 'hour is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 2, 2, 4, 5, 10))), false, 'hour is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 2, 3, 5, 5, 10))), true, 'minute is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 2, 3, 3, 5, 10))), false, 'minute is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 2, 3, 4, 6, 10))), true, 'second is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 2, 3, 4, 4, 11))), false, 'second is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 2, 3, 4, 5, 10))), true, 'millisecond match');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 2, 3, 4, 5, 11))), true, 'millisecond is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 2, 3, 4, 5, 9))), false, 'millisecond is earlier');
+ assert.equal(m.isSameOrBefore(m), true, 'moments are the same as themselves');
+ assert.equal(+m, +mCopy, 'isSameOrBefore second should not change moment');
+});
+
+test('is same or before year', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 5, 6, 7, 8, 9, 10)), 'year'), true, 'year match');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 5, 6, 7, 8, 9, 10)), 'years'), true, 'plural should work');
+ assert.equal(m.isSameOrBefore(moment(new Date(2012, 5, 6, 7, 8, 9, 10)), 'year'), true, 'year is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2010, 5, 6, 7, 8, 9, 10)), 'year'), false, 'year is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 0, 1, 0, 0, 0, 0)), 'year'), true, 'exact start of year');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 11, 31, 23, 59, 59, 999)), 'year'), true, 'exact end of year');
+ assert.equal(m.isSameOrBefore(moment(new Date(2012, 0, 1, 0, 0, 0, 0)), 'year'), true, 'start of next year');
+ assert.equal(m.isSameOrBefore(moment(new Date(2010, 11, 31, 23, 59, 59, 999)), 'year'), false, 'end of previous year');
+ assert.equal(m.isSameOrBefore(m, 'year'), true, 'same moments are in the same year');
+ assert.equal(+m, +mCopy, 'isSameOrBefore year should not change moment');
+});
+
+test('is same or before month', function (assert) {
+ var m = moment(new Date(2011, 2, 3, 4, 5, 6, 7)), mCopy = moment(m);
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 2, 6, 7, 8, 9, 10)), 'month'), true, 'month match');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 2, 6, 7, 8, 9, 10)), 'months'), true, 'plural should work');
+ assert.equal(m.isSameOrBefore(moment(new Date(2012, 2, 6, 7, 8, 9, 10)), 'month'), true, 'year is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2010, 2, 6, 7, 8, 9, 10)), 'month'), false, 'year is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 5, 6, 7, 8, 9, 10)), 'month'), true, 'month is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 6, 7, 8, 9, 10)), 'month'), false, 'month is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 2, 1, 0, 0, 0, 0)), 'month'), true, 'exact start of month');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 2, 31, 23, 59, 59, 999)), 'month'), true, 'exact end of month');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 1, 0, 0, 0, 0)), 'month'), true, 'start of next month');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 27, 23, 59, 59, 999)), 'month'), false, 'end of previous month');
+ assert.equal(m.isSameOrBefore(m, 'month'), true, 'same moments are in the same month');
+ assert.equal(+m, +mCopy, 'isSameOrBefore month should not change moment');
+});
+
+test('is same or before day', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 7, 8, 9, 10)), 'day'), true, 'day match');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 7, 8, 9, 10)), 'days'), true, 'plural should work');
+ assert.equal(m.isSameOrBefore(moment(new Date(2012, 1, 2, 7, 8, 9, 10)), 'day'), true, 'year is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2010, 1, 2, 7, 8, 9, 10)), 'day'), false, 'year is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 2, 2, 7, 8, 9, 10)), 'day'), true, 'month is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2010, 12, 2, 7, 8, 9, 10)), 'day'), false, 'month is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 3, 7, 8, 9, 10)), 'day'), true, 'day is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 1, 7, 8, 9, 10)), 'day'), false, 'day is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 0, 0, 0, 0)), 'day'), true, 'exact start of day');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 23, 59, 59, 999)), 'day'), true, 'exact end of day');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 3, 0, 0, 0, 0)), 'day'), true, 'start of next day');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 1, 23, 59, 59, 999)), 'day'), false, 'end of previous day');
+ assert.equal(m.isSameOrBefore(m, 'day'), true, 'same moments are in the same day');
+ assert.equal(+m, +mCopy, 'isSameOrBefore day should not change moment');
+});
+
+test('is same or before hour', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 8, 9, 10)), 'hour'), true, 'hour match');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 8, 9, 10)), 'hours'), true, 'plural should work');
+ assert.equal(m.isSameOrBefore(moment(new Date(2012, 1, 2, 3, 8, 9, 10)), 'hour'), true, 'year is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2010, 1, 2, 3, 8, 9, 10)), 'hour'), false, 'year is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 2, 2, 3, 8, 9, 10)), 'hour'), true, 'month is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2010, 12, 2, 3, 8, 9, 10)), 'hour'), false, 'month is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 3, 3, 8, 9, 10)), 'hour'), true, 'day is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 1, 3, 8, 9, 10)), 'hour'), false, 'day is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 4, 8, 9, 10)), 'hour'), true, 'hour is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 2, 8, 9, 10)), 'hour'), false, 'hour is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 0, 0, 0)), 'hour'), true, 'exact start of hour');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 59, 59, 999)), 'hour'), true, 'exact end of hour');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 4, 0, 0, 0)), 'hour'), true, 'start of next hour');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 2, 59, 59, 999)), 'hour'), false, 'end of previous hour');
+ assert.equal(m.isSameOrBefore(m, 'hour'), true, 'same moments are in the same hour');
+ assert.equal(+m, +mCopy, 'isSameOrBefore hour should not change moment');
+});
+
+test('is same or before minute', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 4, 9, 10)), 'minute'), true, 'minute match');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 4, 9, 10)), 'minutes'), true, 'plural should work');
+ assert.equal(m.isSameOrBefore(moment(new Date(2012, 1, 2, 3, 4, 9, 10)), 'minute'), true, 'year is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2010, 1, 2, 3, 4, 9, 10)), 'minute'), false, 'year is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 2, 2, 3, 4, 9, 10)), 'minute'), true, 'month is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2010, 12, 2, 3, 4, 9, 10)), 'minute'), false, 'month is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 3, 3, 4, 9, 10)), 'minute'), true, 'day is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 1, 3, 4, 9, 10)), 'minute'), false, 'day is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 4, 4, 9, 10)), 'minute'), true, 'hour is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 2, 4, 9, 10)), 'minute'), false, 'hour is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 5, 9, 10)), 'minute'), true, 'minute is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 3, 9, 10)), 'minute'), false, 'minute is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 4, 0, 0)), 'minute'), true, 'exact start of minute');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 4, 59, 999)), 'minute'), true, 'exact end of minute');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 5, 0, 0)), 'minute'), true, 'start of next minute');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 3, 59, 999)), 'minute'), false, 'end of previous minute');
+ assert.equal(m.isSameOrBefore(m, 'minute'), true, 'same moments are in the same minute');
+ assert.equal(+m, +mCopy, 'isSameOrBefore minute should not change moment');
+});
+
+test('is same or before second', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)), mCopy = moment(m);
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 4, 5, 10)), 'second'), true, 'second match');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 4, 5, 10)), 'seconds'), true, 'plural should work');
+ assert.equal(m.isSameOrBefore(moment(new Date(2012, 1, 2, 3, 4, 5, 10)), 'second'), true, 'year is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2010, 1, 2, 3, 4, 5, 10)), 'second'), false, 'year is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 2, 2, 3, 4, 5, 10)), 'second'), true, 'month is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2010, 12, 2, 3, 4, 5, 10)), 'second'), false, 'month is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 3, 3, 4, 5, 10)), 'second'), true, 'day is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 1, 3, 4, 5, 10)), 'second'), false, 'day is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 4, 4, 5, 10)), 'second'), true, 'hour is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 2, 4, 5, 10)), 'second'), false, 'hour is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 5, 5, 10)), 'second'), true, 'minute is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 3, 5, 10)), 'second'), false, 'minute is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 4, 6, 10)), 'second'), true, 'second is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 4, 4, 10)), 'second'), false, 'second is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 4, 5, 0)), 'second'), true, 'exact start of second');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 4, 5, 999)), 'second'), true, 'exact end of second');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 4, 6, 0)), 'second'), true, 'start of next second');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 1, 2, 3, 4, 4, 999)), 'second'), false, 'end of previous second');
+ assert.equal(m.isSameOrBefore(m, 'second'), true, 'same moments are in the same second');
+ assert.equal(+m, +mCopy, 'isSameOrBefore second should not change moment');
+});
+
+test('is same or before millisecond', function (assert) {
+ var m = moment(new Date(2011, 3, 2, 3, 4, 5, 10)), mCopy = moment(m);
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 2, 3, 4, 5, 10)), 'millisecond'), true, 'millisecond match');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 2, 3, 4, 5, 10)), 'milliseconds'), true, 'plural should work');
+ assert.equal(m.isSameOrBefore(moment(new Date(2012, 3, 2, 3, 4, 5, 10)), 'millisecond'), true, 'year is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2010, 3, 2, 3, 4, 5, 10)), 'millisecond'), false, 'year is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 4, 2, 3, 4, 5, 10)), 'millisecond'), true, 'month is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 2, 2, 3, 4, 5, 10)), 'millisecond'), false, 'month is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 3, 3, 4, 5, 10)), 'millisecond'), true, 'day is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 1, 1, 4, 5, 10)), 'millisecond'), false, 'day is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 2, 4, 4, 5, 10)), 'millisecond'), true, 'hour is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 1, 4, 1, 5, 10)), 'millisecond'), false, 'hour is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 2, 3, 5, 5, 10)), 'millisecond'), true, 'minute is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 2, 3, 3, 5, 10)), 'millisecond'), false, 'minute is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 2, 3, 4, 6, 10)), 'millisecond'), true, 'second is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 2, 3, 4, 4, 5)), 'millisecond'), false, 'second is earlier');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 2, 3, 4, 6, 11)), 'millisecond'), true, 'millisecond is later');
+ assert.equal(m.isSameOrBefore(moment(new Date(2011, 3, 2, 3, 4, 4, 9)), 'millisecond'), false, 'millisecond is earlier');
+ assert.equal(m.isSameOrBefore(m, 'millisecond'), true, 'same moments are in the same millisecond');
+ assert.equal(+m, +mCopy, 'isSameOrBefore millisecond should not change moment');
+});
+
+test('is same with utc offset moments', function (assert) {
+ assert.ok(moment.parseZone('2013-02-01T00:00:00-05:00').isSameOrBefore(moment('2013-02-01'), 'year'), 'zoned vs local moment');
+ assert.ok(moment('2013-02-01').isSameOrBefore(moment('2013-02-01').utcOffset('-05:00'), 'year'), 'local vs zoned moment');
+ assert.ok(
+ moment.parseZone('2013-02-01T00:00:00-05:00').isSameOrBefore(moment.parseZone('2013-02-01T00:00:00-06:30'), 'year'),
+ 'zoned vs (differently) zoned moment'
+ );
+});
+
+test('is same with invalid moments', function (assert) {
+ var m = moment(), invalid = moment.invalid();
+ assert.equal(invalid.isSameOrBefore(invalid), false, 'invalid moments are not considered equal');
+ assert.equal(m.isSameOrBefore(invalid), false, 'valid moment is not before invalid moment');
+ assert.equal(invalid.isSameOrBefore(m), false, 'invalid moment is not before valid moment');
+ assert.equal(m.isSameOrBefore(invalid, 'year'), false, 'invalid moment year');
+ assert.equal(m.isSameOrBefore(invalid, 'month'), false, 'invalid moment month');
+ assert.equal(m.isSameOrBefore(invalid, 'day'), false, 'invalid moment day');
+ assert.equal(m.isSameOrBefore(invalid, 'hour'), false, 'invalid moment hour');
+ assert.equal(m.isSameOrBefore(invalid, 'minute'), false, 'invalid moment minute');
+ assert.equal(m.isSameOrBefore(invalid, 'second'), false, 'invalid moment second');
+ assert.equal(m.isSameOrBefore(invalid, 'milliseconds'), false, 'invalid moment milliseconds');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('is valid');
+
+test('array bad month', function (assert) {
+ assert.equal(moment([2010, -1]).isValid(), false, 'month -1 invalid');
+ assert.equal(moment([2100, 12]).isValid(), false, 'month 12 invalid');
+});
+
+test('array good month', function (assert) {
+ for (var i = 0; i < 12; i++) {
+ assert.equal(moment([2010, i]).isValid(), true, 'month ' + i);
+ assert.equal(moment.utc([2010, i]).isValid(), true, 'month ' + i);
+ }
+});
+
+test('array bad date', function (assert) {
+ var tests = [
+ moment([2010, 0, 0]),
+ moment([2100, 0, 32]),
+ moment.utc([2010, 0, 0]),
+ moment.utc([2100, 0, 32])
+ ],
+ i, m;
+
+ for (i in tests) {
+ m = tests[i];
+ assert.equal(m.isValid(), false);
+ }
+});
+
+test('h/hh with hour > 12', function (assert) {
+ assert.ok(moment('06/20/2014 11:51 PM', 'MM/DD/YYYY hh:mm A', true).isValid(), '11 for hh');
+ assert.ok(moment('06/20/2014 11:51 AM', 'MM/DD/YYYY hh:mm A', true).isValid(), '11 for hh');
+ assert.ok(moment('06/20/2014 23:51 PM', 'MM/DD/YYYY hh:mm A').isValid(), 'non-strict validity 23 for hh');
+ assert.ok(moment('06/20/2014 23:51 PM', 'MM/DD/YYYY hh:mm A').parsingFlags().bigHour, 'non-strict bigHour 23 for hh');
+ assert.ok(!moment('06/20/2014 23:51 PM', 'MM/DD/YYYY hh:mm A', true).isValid(), 'validity 23 for hh');
+ assert.ok(moment('06/20/2014 23:51 PM', 'MM/DD/YYYY hh:mm A', true).parsingFlags().bigHour, 'bigHour 23 for hh');
+});
+
+test('array bad date leap year', function (assert) {
+ assert.equal(moment([2010, 1, 29]).isValid(), false, '2010 feb 29');
+ assert.equal(moment([2100, 1, 29]).isValid(), false, '2100 feb 29');
+ assert.equal(moment([2008, 1, 30]).isValid(), false, '2008 feb 30');
+ assert.equal(moment([2000, 1, 30]).isValid(), false, '2000 feb 30');
+
+ assert.equal(moment.utc([2010, 1, 29]).isValid(), false, 'utc 2010 feb 29');
+ assert.equal(moment.utc([2100, 1, 29]).isValid(), false, 'utc 2100 feb 29');
+ assert.equal(moment.utc([2008, 1, 30]).isValid(), false, 'utc 2008 feb 30');
+ assert.equal(moment.utc([2000, 1, 30]).isValid(), false, 'utc 2000 feb 30');
+});
+
+test('string + formats bad date', function (assert) {
+ assert.equal(moment('2020-00-00', []).isValid(), false, 'invalid on empty array');
+ assert.equal(moment('2020-00-00', ['YYYY-MM-DD', 'DD-MM-YYYY']).isValid(), false, 'invalid on all in array');
+ assert.equal(moment('2020-00-00', ['DD-MM-YYYY', 'YYYY-MM-DD']).isValid(), false, 'invalid on all in array');
+ assert.equal(moment('2020-01-01', ['YYYY-MM-DD', 'DD-MM-YYYY']).isValid(), true, 'valid on first');
+ assert.equal(moment('2020-01-01', ['DD-MM-YYYY', 'YYYY-MM-DD']).isValid(), true, 'valid on last');
+ assert.equal(moment('2020-01-01', ['YYYY-MM-DD', 'YYYY-DD-MM']).isValid(), true, 'valid on both');
+ assert.equal(moment('2020-13-01', ['YYYY-MM-DD', 'YYYY-DD-MM']).isValid(), true, 'valid on last');
+
+ assert.equal(moment('12-13-2012', ['DD-MM-YYYY', 'YYYY-MM-DD']).isValid(), false, 'month rollover');
+ assert.equal(moment('12-13-2012', ['DD-MM-YYYY', 'DD-MM-YYYY']).isValid(), false, 'month rollover');
+ assert.equal(moment('38-12-2012', ['DD-MM-YYYY']).isValid(), false, 'day rollover');
+});
+
+test('string nonsensical with format', function (assert) {
+ assert.equal(moment('fail', 'MM-DD-YYYY').isValid(), false, 'string \'fail\' with format \'MM-DD-YYYY\'');
+ assert.equal(moment('xx-xx-2001', 'DD-MM-YYY').isValid(), true, 'string \'xx-xx-2001\' with format \'MM-DD-YYYY\'');
+});
+
+test('string with bad month name', function (assert) {
+ assert.equal(moment('01-Nam-2012', 'DD-MMM-YYYY').isValid(), false, '\'Nam\' is an invalid month');
+ assert.equal(moment('01-Aug-2012', 'DD-MMM-YYYY').isValid(), true, '\'Aug\' is a valid month');
+});
+
+test('string with spaceless format', function (assert) {
+ assert.equal(moment('10Sep2001', 'DDMMMYYYY').isValid(), true, 'Parsing 10Sep2001 should result in a valid date');
+});
+
+test('invalid string iso 8601', function (assert) {
+ var tests = [
+ '2010-00-00',
+ '2010-01-00',
+ '2010-01-40',
+ '2010-01-01T24:01', // 24:00:00 is actually valid
+ '2010-01-01T23:60',
+ '2010-01-01T23:59:60'
+ ], i;
+
+ for (i = 0; i < tests.length; i++) {
+ assert.equal(moment(tests[i], moment.ISO_8601).isValid(), false, tests[i] + ' should be invalid');
+ assert.equal(moment.utc(tests[i], moment.ISO_8601).isValid(), false, tests[i] + ' should be invalid');
+ }
+});
+
+test('invalid string iso 8601 + timezone', function (assert) {
+ var tests = [
+ '2010-00-00T+00:00',
+ '2010-01-00T+00:00',
+ '2010-01-40T+00:00',
+ '2010-01-40T24:01+00:00',
+ '2010-01-40T23:60+00:00',
+ '2010-01-40T23:59:60+00:00',
+ '2010-01-40T23:59:59.9999+00:00',
+ '2010-01-40T23:59:59,9999+00:00'
+ ], i;
+
+ for (i = 0; i < tests.length; i++) {
+ assert.equal(moment(tests[i], moment.ISO_8601).isValid(), false, tests[i] + ' should be invalid');
+ assert.equal(moment.utc(tests[i], moment.ISO_8601).isValid(), false, tests[i] + ' should be invalid');
+ }
+});
+
+test('valid string iso 8601 - not strict', function (assert) {
+ var tests = [
+ '2010-01-30 00:00:00,000Z',
+ '20100101',
+ '20100130',
+ '20100130T23+00:00',
+ '20100130T2359+0000',
+ '20100130T235959+0000',
+ '20100130T235959,999+0000',
+ '20100130T235959,999-0700',
+ '20100130T000000,000+0700',
+ '20100130 000000,000Z'
+ ];
+
+ for (var i = 0; i < tests.length; i++) {
+ assert.equal(moment(tests[i]).isValid(), true, tests[i] + ' should be valid in normal');
+ assert.equal(moment.utc(tests[i]).isValid(), true, tests[i] + ' should be valid in normal');
+ }
+});
+
+test('valid string iso 8601 + timezone', function (assert) {
+ var tests = [
+ '2010-01-01',
+ '2010-01-30',
+ '2010-01-30T23+00:00',
+ '2010-01-30T23:59+00:00',
+ '2010-01-30T23:59:59+00:00',
+ '2010-01-30T23:59:59.999+00:00',
+ '2010-01-30T23:59:59.999-07:00',
+ '2010-01-30T00:00:00.000+07:00',
+ '2010-01-30T23:59:59.999-07',
+ '2010-01-30T00:00:00.000+07',
+ '2010-01-30 00:00:00.000Z'
+ ], i;
+
+ for (i = 0; i < tests.length; i++) {
+ assert.equal(moment(tests[i]).isValid(), true, tests[i] + ' should be valid in normal');
+ assert.equal(moment.utc(tests[i]).isValid(), true, tests[i] + ' should be valid in normal');
+ assert.equal(moment(tests[i], moment.ISO_8601, true).isValid(), true, tests[i] + ' should be valid in strict');
+ assert.equal(moment.utc(tests[i], moment.ISO_8601, true).isValid(), true, tests[i] + ' should be valid in strict');
+ }
+});
+
+test('invalidAt', function (assert) {
+ assert.equal(moment([2000, 12]).invalidAt(), 1, 'month 12 is invalid: 0-11');
+ assert.equal(moment([2000, 1, 30]).invalidAt(), 2, '30 is not a valid february day');
+ assert.equal(moment([2000, 1, 29, 25]).invalidAt(), 3, '25 is invalid hour');
+ assert.equal(moment([2000, 1, 29, 24, 1]).invalidAt(), 3, '24:01 is invalid hour');
+ assert.equal(moment([2000, 1, 29, 23, 60]).invalidAt(), 4, '60 is invalid minute');
+ assert.equal(moment([2000, 1, 29, 23, 59, 60]).invalidAt(), 5, '60 is invalid second');
+ assert.equal(moment([2000, 1, 29, 23, 59, 59, 1000]).invalidAt(), 6, '1000 is invalid millisecond');
+ assert.equal(moment([2000, 1, 29, 23, 59, 59, 999]).invalidAt(), -1, '-1 if everything is fine');
+});
+
+test('valid Unix timestamp', function (assert) {
+ assert.equal(moment(1371065286, 'X').isValid(), true, 'number integer');
+ assert.equal(moment(1379066897.0, 'X').isValid(), true, 'number whole 1dp');
+ assert.equal(moment(1379066897.7, 'X').isValid(), true, 'number 1dp');
+ assert.equal(moment(1379066897.00, 'X').isValid(), true, 'number whole 2dp');
+ assert.equal(moment(1379066897.07, 'X').isValid(), true, 'number 2dp');
+ assert.equal(moment(1379066897.17, 'X').isValid(), true, 'number 2dp');
+ assert.equal(moment(1379066897.000, 'X').isValid(), true, 'number whole 3dp');
+ assert.equal(moment(1379066897.007, 'X').isValid(), true, 'number 3dp');
+ assert.equal(moment(1379066897.017, 'X').isValid(), true, 'number 3dp');
+ assert.equal(moment(1379066897.157, 'X').isValid(), true, 'number 3dp');
+ assert.equal(moment('1371065286', 'X').isValid(), true, 'string integer');
+ assert.equal(moment('1379066897.', 'X').isValid(), true, 'string trailing .');
+ assert.equal(moment('1379066897.0', 'X').isValid(), true, 'string whole 1dp');
+ assert.equal(moment('1379066897.7', 'X').isValid(), true, 'string 1dp');
+ assert.equal(moment('1379066897.00', 'X').isValid(), true, 'string whole 2dp');
+ assert.equal(moment('1379066897.07', 'X').isValid(), true, 'string 2dp');
+ assert.equal(moment('1379066897.17', 'X').isValid(), true, 'string 2dp');
+ assert.equal(moment('1379066897.000', 'X').isValid(), true, 'string whole 3dp');
+ assert.equal(moment('1379066897.007', 'X').isValid(), true, 'string 3dp');
+ assert.equal(moment('1379066897.017', 'X').isValid(), true, 'string 3dp');
+ assert.equal(moment('1379066897.157', 'X').isValid(), true, 'string 3dp');
+});
+
+test('invalid Unix timestamp', function (assert) {
+ assert.equal(moment(undefined, 'X').isValid(), false, 'undefined');
+ assert.equal(moment('undefined', 'X').isValid(), false, 'string undefined');
+ try {
+ assert.equal(moment(null, 'X').isValid(), false, 'null');
+ } catch (e) {
+ assert.ok(true, 'null');
+ }
+
+ assert.equal(moment('null', 'X').isValid(), false, 'string null');
+ assert.equal(moment([], 'X').isValid(), false, 'array');
+ assert.equal(moment('{}', 'X').isValid(), false, 'object');
+ try {
+ assert.equal(moment('', 'X').isValid(), false, 'string empty');
+ } catch (e) {
+ assert.ok(true, 'string empty');
+ }
+
+ assert.equal(moment(' ', 'X').isValid(), false, 'string space');
+});
+
+test('valid Unix offset milliseconds', function (assert) {
+ assert.equal(moment(1234567890123, 'x').isValid(), true, 'number integer');
+ assert.equal(moment('1234567890123', 'x').isValid(), true, 'string integer');
+});
+
+test('invalid Unix offset milliseconds', function (assert) {
+ assert.equal(moment(undefined, 'x').isValid(), false, 'undefined');
+ assert.equal(moment('undefined', 'x').isValid(), false, 'string undefined');
+ try {
+ assert.equal(moment(null, 'x').isValid(), false, 'null');
+ } catch (e) {
+ assert.ok(true, 'null');
+ }
+
+ assert.equal(moment('null', 'x').isValid(), false, 'string null');
+ assert.equal(moment([], 'x').isValid(), false, 'array');
+ assert.equal(moment('{}', 'x').isValid(), false, 'object');
+ try {
+ assert.equal(moment('', 'x').isValid(), false, 'string empty');
+ } catch (e) {
+ assert.ok(true, 'string empty');
+ }
+
+ assert.equal(moment(' ', 'x').isValid(), false, 'string space');
+});
+
+test('empty', function (assert) {
+ assert.equal(moment(null).isValid(), false, 'null');
+ assert.equal(moment('').isValid(), false, 'empty string');
+ assert.equal(moment(null, 'YYYY').isValid(), false, 'format + null');
+ assert.equal(moment('', 'YYYY').isValid(), false, 'format + empty string');
+ assert.equal(moment(' ', 'YYYY').isValid(), false, 'format + empty when trimmed');
+});
+
+test('days of the year', function (assert) {
+ assert.equal(moment('2010 300', 'YYYY DDDD').isValid(), true, 'day 300 of year valid');
+ assert.equal(moment('2010 365', 'YYYY DDDD').isValid(), true, 'day 365 of year valid');
+ assert.equal(moment('2010 366', 'YYYY DDDD').isValid(), false, 'day 366 of year invalid');
+ assert.equal(moment('2012 365', 'YYYY DDDD').isValid(), true, 'day 365 of leap year valid');
+ assert.equal(moment('2012 366', 'YYYY DDDD').isValid(), true, 'day 366 of leap year valid');
+ assert.equal(moment('2012 367', 'YYYY DDDD').isValid(), false, 'day 367 of leap year invalid');
+});
+
+test('24:00:00.000 is valid', function (assert) {
+ assert.equal(moment('2014-01-01 24', 'YYYY-MM-DD HH').isValid(), true, '24 is valid');
+ assert.equal(moment('2014-01-01 24:00', 'YYYY-MM-DD HH:mm').isValid(), true, '24:00 is valid');
+ assert.equal(moment('2014-01-01 24:01', 'YYYY-MM-DD HH:mm').isValid(), false, '24:01 is not valid');
+});
+
+test('oddball permissiveness', function (assert) {
+ //https://github.com/moment/moment/issues/1128
+ assert.ok(moment('2010-10-3199', ['MM/DD/YYYY', 'MM-DD-YYYY', 'YYYY-MM-DD']).isValid());
+
+ //https://github.com/moment/moment/issues/1122
+ assert.ok(moment('3:25', ['h:mma', 'hh:mma', 'H:mm', 'HH:mm']).isValid());
+});
+
+test('0 hour is invalid in strict', function (assert) {
+ assert.equal(moment('00:01', 'hh:mm', true).isValid(), false, '00 hour is invalid in strict');
+ assert.equal(moment('00:01', 'hh:mm').isValid(), true, '00 hour is valid in normal');
+ assert.equal(moment('0:01', 'h:mm', true).isValid(), false, '0 hour is invalid in strict');
+ assert.equal(moment('0:01', 'h:mm').isValid(), true, '0 hour is valid in normal');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('leap year');
+
+test('leap year', function (assert) {
+ assert.equal(moment([2010, 0, 1]).isLeapYear(), false, '2010');
+ assert.equal(moment([2100, 0, 1]).isLeapYear(), false, '2100');
+ assert.equal(moment([2008, 0, 1]).isLeapYear(), true, '2008');
+ assert.equal(moment([2000, 0, 1]).isLeapYear(), true, '2000');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('listers');
+
+test('default', function (assert) {
+ assert.deepEqual(moment.months(), ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']);
+ assert.deepEqual(moment.monthsShort(), ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']);
+ assert.deepEqual(moment.weekdays(), ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']);
+ assert.deepEqual(moment.weekdaysShort(), ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']);
+ assert.deepEqual(moment.weekdaysMin(), ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']);
+});
+
+test('index', function (assert) {
+ assert.equal(moment.months(0), 'January');
+ assert.equal(moment.months(2), 'March');
+ assert.equal(moment.monthsShort(0), 'Jan');
+ assert.equal(moment.monthsShort(2), 'Mar');
+ assert.equal(moment.weekdays(0), 'Sunday');
+ assert.equal(moment.weekdays(2), 'Tuesday');
+ assert.equal(moment.weekdaysShort(0), 'Sun');
+ assert.equal(moment.weekdaysShort(2), 'Tue');
+ assert.equal(moment.weekdaysMin(0), 'Su');
+ assert.equal(moment.weekdaysMin(2), 'Tu');
+});
+
+test('localized', function (assert) {
+ var months = 'one_two_three_four_five_six_seven_eight_nine_ten_eleven_twelve'.split('_'),
+ monthsShort = 'on_tw_th_fo_fi_si_se_ei_ni_te_el_tw'.split('_'),
+ weekdays = 'one_two_three_four_five_six_seven'.split('_'),
+ weekdaysShort = 'on_tw_th_fo_fi_si_se'.split('_'),
+ weekdaysMin = '1_2_3_4_5_6_7'.split('_'),
+ weekdaysLocale = 'four_five_six_seven_one_two_three'.split('_'),
+ weekdaysShortLocale = 'fo_fi_si_se_on_tw_th'.split('_'),
+ weekdaysMinLocale = '4_5_6_7_1_2_3'.split('_'),
+ week = {
+ dow : 3,
+ doy : 6
+ };
+
+ moment.locale('numerologists', {
+ months : months,
+ monthsShort : monthsShort,
+ weekdays : weekdays,
+ weekdaysShort: weekdaysShort,
+ weekdaysMin: weekdaysMin,
+ week : week
+ });
+
+ assert.deepEqual(moment.months(), months);
+ assert.deepEqual(moment.monthsShort(), monthsShort);
+ assert.deepEqual(moment.weekdays(), weekdays);
+ assert.deepEqual(moment.weekdaysShort(), weekdaysShort);
+ assert.deepEqual(moment.weekdaysMin(), weekdaysMin);
+
+ assert.equal(moment.months(0), 'one');
+ assert.equal(moment.monthsShort(0), 'on');
+ assert.equal(moment.weekdays(0), 'one');
+ assert.equal(moment.weekdaysShort(0), 'on');
+ assert.equal(moment.weekdaysMin(0), '1');
+
+ assert.equal(moment.months(2), 'three');
+ assert.equal(moment.monthsShort(2), 'th');
+ assert.equal(moment.weekdays(2), 'three');
+ assert.equal(moment.weekdaysShort(2), 'th');
+ assert.equal(moment.weekdaysMin(2), '3');
+
+ assert.deepEqual(moment.weekdays(true), weekdaysLocale);
+ assert.deepEqual(moment.weekdaysShort(true), weekdaysShortLocale);
+ assert.deepEqual(moment.weekdaysMin(true), weekdaysMinLocale);
+
+ assert.equal(moment.weekdays(true, 0), 'four');
+ assert.equal(moment.weekdaysShort(true, 0), 'fo');
+ assert.equal(moment.weekdaysMin(true, 0), '4');
+
+ assert.equal(moment.weekdays(false, 2), 'three');
+ assert.equal(moment.weekdaysShort(false, 2), 'th');
+ assert.equal(moment.weekdaysMin(false, 2), '3');
+});
+
+test('with functions', function (assert) {
+ var monthsShort = 'one_two_three_four_five_six_seven_eight_nine_ten_eleven_twelve'.split('_'),
+ monthsShortWeird = 'onesy_twosy_threesy_foursy_fivesy_sixsy_sevensy_eightsy_ninesy_tensy_elevensy_twelvesy'.split('_');
+
+ moment.locale('difficult', {
+
+ monthsShort: function (m, format) {
+ var arr = format.match(/-MMM-/) ? monthsShortWeird : monthsShort;
+ return arr[m.month()];
+ }
+ });
+
+ assert.deepEqual(moment.monthsShort(), monthsShort);
+ assert.deepEqual(moment.monthsShort('MMM'), monthsShort);
+ assert.deepEqual(moment.monthsShort('-MMM-'), monthsShortWeird);
+
+ assert.deepEqual(moment.monthsShort('MMM', 2), 'three');
+ assert.deepEqual(moment.monthsShort('-MMM-', 2), 'threesy');
+ assert.deepEqual(moment.monthsShort(2), 'three');
+});
+
+test('with locale data', function (assert) {
+ var months = 'one_two_three_four_five_six_seven_eight_nine_ten_eleven_twelve'.split('_'),
+ monthsShort = 'on_tw_th_fo_fi_si_se_ei_ni_te_el_tw'.split('_'),
+ weekdays = 'one_two_three_four_five_six_seven'.split('_'),
+ weekdaysShort = 'on_tw_th_fo_fi_si_se'.split('_'),
+ weekdaysMin = '1_2_3_4_5_6_7'.split('_'),
+ weekdaysLocale = 'four_five_six_seven_one_two_three'.split('_'),
+ weekdaysShortLocale = 'fo_fi_si_se_on_tw_th'.split('_'),
+ weekdaysMinLocale = '4_5_6_7_1_2_3'.split('_'),
+ week = {
+ dow : 3,
+ doy : 6
+ };
+
+ var customLocale = moment.localeData('numerologists');
+
+ assert.deepEqual(customLocale.months(), months);
+ assert.deepEqual(customLocale.monthsShort(), monthsShort);
+ assert.deepEqual(customLocale.weekdays(), weekdays);
+ assert.deepEqual(customLocale.weekdaysShort(), weekdaysShort);
+ assert.deepEqual(customLocale.weekdaysMin(), weekdaysMin);
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+var indexOf;
+
+if (Array.prototype.indexOf) {
+ indexOf = Array.prototype.indexOf;
+} else {
+ indexOf = function (o) {
+ // I know
+ var i;
+ for (i = 0; i < this.length; ++i) {
+ if (this[i] === o) {
+ return i;
+ }
+ }
+ return -1;
+ };
+}
+
+var indexOf$1 = indexOf;
+
+module$1('locale', {
+ setup : function () {
+ // TODO: Remove once locales are switched to ES6
+ each([{
+ name: 'en-gb',
+ data: {}
+ }, {
+ name: 'en-ca',
+ data: {}
+ }, {
+ name: 'es',
+ data: {
+ relativeTime: {past: 'hace %s', s: 'unos segundos', d: 'un día'},
+ months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_')
+ }
+ }, {
+ name: 'fr',
+ data: {}
+ }, {
+ name: 'fr-ca',
+ data: {}
+ }, {
+ name: 'it',
+ data: {}
+ }, {
+ name: 'zh-cn',
+ data: {
+ months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_')
+ }
+ }], function (locale) {
+ if (moment.locale(locale.name) !== locale.name) {
+ moment.defineLocale(locale.name, locale.data);
+ }
+ });
+ moment.locale('en');
+ }
+});
+
+test('library getters and setters', function (assert) {
+ var r = moment.locale('en');
+
+ assert.equal(r, 'en', 'locale should return en by default');
+ assert.equal(moment.locale(), 'en', 'locale should return en by default');
+
+ moment.locale('fr');
+ assert.equal(moment.locale(), 'fr', 'locale should return the changed locale');
+
+ moment.locale('en-gb');
+ assert.equal(moment.locale(), 'en-gb', 'locale should return the changed locale');
+
+ moment.locale('en');
+ assert.equal(moment.locale(), 'en', 'locale should reset');
+
+ moment.locale('does-not-exist');
+ assert.equal(moment.locale(), 'en', 'locale should reset');
+
+ moment.locale('EN');
+ assert.equal(moment.locale(), 'en', 'Normalize locale key case');
+
+ moment.locale('EN_gb');
+ assert.equal(moment.locale(), 'en-gb', 'Normalize locale key underscore');
+});
+
+test('library setter array of locales', function (assert) {
+ assert.equal(moment.locale(['non-existent', 'fr', 'also-non-existent']), 'fr', 'passing an array uses the first valid locale');
+ assert.equal(moment.locale(['es', 'fr', 'also-non-existent']), 'es', 'passing an array uses the first valid locale');
+});
+
+test('library setter locale substrings', function (assert) {
+ assert.equal(moment.locale('fr-crap'), 'fr', 'use substrings');
+ assert.equal(moment.locale('fr-does-not-exist'), 'fr', 'uses deep substrings');
+ assert.equal(moment.locale('fr-CA-does-not-exist'), 'fr-ca', 'uses deepest substring');
+});
+
+test('library getter locale array and substrings', function (assert) {
+ assert.equal(moment.locale(['en-CH', 'fr']), 'en', 'prefer root locale to shallower ones');
+ assert.equal(moment.locale(['en-gb-leeds', 'en-CA']), 'en-gb', 'prefer root locale to shallower ones');
+ assert.equal(moment.locale(['en-fake', 'en-CA']), 'en-ca', 'prefer alternatives with shared roots');
+ assert.equal(moment.locale(['en-fake', 'en-fake2', 'en-ca']), 'en-ca', 'prefer alternatives with shared roots');
+ assert.equal(moment.locale(['fake-CA', 'fake-MX', 'fr']), 'fr', 'always find something if possible');
+ assert.equal(moment.locale(['fake-CA', 'fake-MX', 'fr']), 'fr', 'always find something if possible');
+ assert.equal(moment.locale(['fake-CA', 'fake-MX', 'fr-fake-fake-fake']), 'fr', 'always find something if possible');
+ assert.equal(moment.locale(['en', 'en-CA']), 'en', 'prefer earlier if it works');
+});
+
+test('library ensure inheritance', function (assert) {
+ moment.locale('made-up', {
+ // I put them out of order
+ months : 'February_March_April_May_June_July_August_September_October_November_December_January'.split('_')
+ // the rest of the properties should be inherited.
+ });
+
+ assert.equal(moment([2012, 5, 6]).format('MMMM'), 'July', 'Override some of the configs');
+ assert.equal(moment([2012, 5, 6]).format('MMM'), 'Jun', 'But not all of them');
+});
+
+test('library ensure inheritance LT L LL LLL LLLL', function (assert) {
+ var locale = 'test-inherit-lt';
+
+ moment.defineLocale(locale, {
+ longDateFormat : {
+ LT : '-[LT]-',
+ L : '-[L]-',
+ LL : '-[LL]-',
+ LLL : '-[LLL]-',
+ LLLL : '-[LLLL]-'
+ },
+ calendar : {
+ sameDay : '[sameDay] LT',
+ nextDay : '[nextDay] L',
+ nextWeek : '[nextWeek] LL',
+ lastDay : '[lastDay] LLL',
+ lastWeek : '[lastWeek] LLLL',
+ sameElse : 'L'
+ }
+ });
+
+ moment.locale('es');
+
+ assert.equal(moment().locale(locale).calendar(), 'sameDay -LT-', 'Should use instance locale in LT formatting');
+ assert.equal(moment().add(1, 'days').locale(locale).calendar(), 'nextDay -L-', 'Should use instance locale in L formatting');
+ assert.equal(moment().add(-1, 'days').locale(locale).calendar(), 'lastDay -LLL-', 'Should use instance locale in LL formatting');
+ assert.equal(moment().add(4, 'days').locale(locale).calendar(), 'nextWeek -LL-', 'Should use instance locale in LLL formatting');
+ assert.equal(moment().add(-4, 'days').locale(locale).calendar(), 'lastWeek -LLLL-', 'Should use instance locale in LLLL formatting');
+});
+
+test('library localeData', function (assert) {
+ moment.locale('en');
+
+ var jan = moment([2000, 0]);
+
+ assert.equal(moment.localeData().months(jan), 'January', 'no arguments returns global');
+ assert.equal(moment.localeData('zh-cn').months(jan), '一月', 'a string returns the locale based on key');
+ assert.equal(moment.localeData(moment().locale('es')).months(jan), 'enero', 'if you pass in a moment it uses the moment\'s locale');
+});
+
+test('library deprecations', function (assert) {
+ test.expectedDeprecations('moment.lang');
+ moment.lang('dude', {months: ['Movember']});
+ assert.equal(moment.locale(), 'dude', 'setting the lang sets the locale');
+ assert.equal(moment.lang(), moment.locale());
+ assert.equal(moment.langData(), moment.localeData(), 'langData is localeData');
+ moment.defineLocale('dude', null);
+});
+
+test('defineLocale', function (assert) {
+ moment.locale('en');
+ moment.defineLocale('dude', {months: ['Movember']});
+ assert.equal(moment().locale(), 'dude', 'defineLocale also sets it');
+ assert.equal(moment().locale('dude').locale(), 'dude', 'defineLocale defines a locale');
+ moment.defineLocale('dude', null);
+});
+
+test('locales', function (assert) {
+ moment.defineLocale('dude', {months: ['Movember']});
+ assert.equal(true, !!~indexOf$1.call(moment.locales(), 'dude'), 'locales returns an array of defined locales');
+ assert.equal(true, !!~indexOf$1.call(moment.locales(), 'en'), 'locales should always include english');
+ moment.defineLocale('dude', null);
+});
+
+test('library convenience', function (assert) {
+ moment.locale('something', {week: {dow: 3}});
+ moment.locale('something');
+ assert.equal(moment.locale(), 'something', 'locale can be used to create the locale too');
+ moment.defineLocale('something', null);
+});
+
+test('firstDayOfWeek firstDayOfYear locale getters', function (assert) {
+ moment.locale('something', {week: {dow: 3, doy: 4}});
+ moment.locale('something');
+ assert.equal(moment.localeData().firstDayOfWeek(), 3, 'firstDayOfWeek');
+ assert.equal(moment.localeData().firstDayOfYear(), 4, 'firstDayOfYear');
+ moment.defineLocale('something', null);
+});
+
+test('instance locale method', function (assert) {
+ moment.locale('en');
+
+ assert.equal(moment([2012, 5, 6]).format('MMMM'), 'June', 'Normally default to global');
+ assert.equal(moment([2012, 5, 6]).locale('es').format('MMMM'), 'junio', 'Use the instance specific locale');
+ assert.equal(moment([2012, 5, 6]).format('MMMM'), 'June', 'Using an instance specific locale does not affect other moments');
+});
+
+test('instance locale method with array', function (assert) {
+ var m = moment().locale(['non-existent', 'fr', 'also-non-existent']);
+ assert.equal(m.locale(), 'fr', 'passing an array uses the first valid locale');
+ m = moment().locale(['es', 'fr', 'also-non-existent']);
+ assert.equal(m.locale(), 'es', 'passing an array uses the first valid locale');
+});
+
+test('instance getter locale substrings', function (assert) {
+ var m = moment();
+
+ m.locale('fr-crap');
+ assert.equal(m.locale(), 'fr', 'use substrings');
+
+ m.locale('fr-does-not-exist');
+ assert.equal(m.locale(), 'fr', 'uses deep substrings');
+});
+
+test('instance locale persists with manipulation', function (assert) {
+ moment.locale('en');
+
+ assert.equal(moment([2012, 5, 6]).locale('es').add({days: 1}).format('MMMM'), 'junio', 'With addition');
+ assert.equal(moment([2012, 5, 6]).locale('es').day(0).format('MMMM'), 'junio', 'With day getter');
+ assert.equal(moment([2012, 5, 6]).locale('es').endOf('day').format('MMMM'), 'junio', 'With endOf');
+});
+
+test('instance locale persists with cloning', function (assert) {
+ moment.locale('en');
+
+ var a = moment([2012, 5, 6]).locale('es'),
+ b = a.clone(),
+ c = moment(a);
+
+ assert.equal(b.format('MMMM'), 'junio', 'using moment.fn.clone()');
+ assert.equal(b.format('MMMM'), 'junio', 'using moment()');
+});
+
+test('duration locale method', function (assert) {
+ moment.locale('en');
+
+ assert.equal(moment.duration({seconds: 44}).humanize(), 'a few seconds', 'Normally default to global');
+ assert.equal(moment.duration({seconds: 44}).locale('es').humanize(), 'unos segundos', 'Use the instance specific locale');
+ assert.equal(moment.duration({seconds: 44}).humanize(), 'a few seconds', 'Using an instance specific locale does not affect other durations');
+});
+
+test('duration locale persists with cloning', function (assert) {
+ moment.locale('en');
+
+ var a = moment.duration({seconds: 44}).locale('es'),
+ b = moment.duration(a);
+
+ assert.equal(b.humanize(), 'unos segundos', 'using moment.duration()');
+});
+
+test('changing the global locale doesn\'t affect existing duration instances', function (assert) {
+ var mom = moment.duration();
+ moment.locale('fr');
+ assert.equal('en', mom.locale());
+});
+
+test('duration deprecations', function (assert) {
+ test.expectedDeprecations('moment().lang()');
+ assert.equal(moment.duration().lang(), moment.duration().localeData(), 'duration.lang is the same as duration.localeData');
+});
+
+test('from and fromNow with invalid date', function (assert) {
+ assert.equal(moment(NaN).from(), 'Invalid date', 'moment.from with invalid moment');
+ assert.equal(moment(NaN).fromNow(), 'Invalid date', 'moment.fromNow with invalid moment');
+});
+
+test('from relative time future', function (assert) {
+ var start = moment([2007, 1, 28]);
+
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({s: 44})), 'in a few seconds', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({s: 45})), 'in a minute', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({s: 89})), 'in a minute', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({s: 90})), 'in 2 minutes', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({m: 44})), 'in 44 minutes', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({m: 45})), 'in an hour', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({m: 89})), 'in an hour', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({m: 90})), 'in 2 hours', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({h: 5})), 'in 5 hours', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({h: 21})), 'in 21 hours', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({h: 22})), 'in a day', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({h: 35})), 'in a day', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({h: 36})), 'in 2 days', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({d: 1})), 'in a day', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({d: 5})), 'in 5 days', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({d: 25})), 'in 25 days', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({d: 26})), 'in a month', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({d: 30})), 'in a month', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({d: 45})), 'in a month', '45 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({d: 47})), 'in 2 months', '47 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({d: 74})), 'in 2 months', '74 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({d: 78})), 'in 3 months', '78 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({M: 1})), 'in a month', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({M: 5})), 'in 5 months', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({d: 315})), 'in 10 months', '315 days = 10 months');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({d: 344})), 'in a year', '344 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({d: 345})), 'in a year', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({d: 548})), 'in 2 years', '548 days = in 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({y: 1})), 'in a year', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).subtract({y: 5})), 'in 5 years', '5 years = 5 years');
+});
+
+test('from relative time past', function (assert) {
+ var start = moment([2007, 1, 28]);
+
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 44})), 'a few seconds ago', '44 seconds = a few seconds');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 45})), 'a minute ago', '45 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 89})), 'a minute ago', '89 seconds = a minute');
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90})), '2 minutes ago', '90 seconds = 2 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 44})), '44 minutes ago', '44 minutes = 44 minutes');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 45})), 'an hour ago', '45 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 89})), 'an hour ago', '89 minutes = an hour');
+ assert.equal(start.from(moment([2007, 1, 28]).add({m: 90})), '2 hours ago', '90 minutes = 2 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 5})), '5 hours ago', '5 hours = 5 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 21})), '21 hours ago', '21 hours = 21 hours');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 22})), 'a day ago', '22 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 35})), 'a day ago', '35 hours = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({h: 36})), '2 days ago', '36 hours = 2 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 1})), 'a day ago', '1 day = a day');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 5})), '5 days ago', '5 days = 5 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 25})), '25 days ago', '25 days = 25 days');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 26})), 'a month ago', '26 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 30})), 'a month ago', '30 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 43})), 'a month ago', '43 days = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 46})), '2 months ago', '46 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 74})), '2 months ago', '75 days = 2 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 76})), '3 months ago', '76 days = 3 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 1})), 'a month ago', '1 month = a month');
+ assert.equal(start.from(moment([2007, 1, 28]).add({M: 5})), '5 months ago', '5 months = 5 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 315})), '10 months ago', '315 days = 10 months');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 344})), 'a year ago', '344 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 345})), 'a year ago', '345 days = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({d: 548})), '2 years ago', '548 days = 2 years');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 1})), 'a year ago', '1 year = a year');
+ assert.equal(start.from(moment([2007, 1, 28]).add({y: 5})), '5 years ago', '5 years = 5 years');
+});
+
+test('instance locale used with from', function (assert) {
+ moment.locale('en');
+
+ var a = moment([2012, 5, 6]).locale('es'),
+ b = moment([2012, 5, 7]);
+
+ assert.equal(a.from(b), 'hace un día', 'preserve locale of first moment');
+ assert.equal(b.from(a), 'in a day', 'do not preserve locale of second moment');
+});
+
+test('instance localeData', function (assert) {
+ moment.defineLocale('dude', {week: {dow: 3}});
+ assert.equal(moment().locale('dude').localeData()._week.dow, 3);
+ moment.defineLocale('dude', null);
+});
+
+test('month name callback function', function (assert) {
+ function fakeReplace(m, format) {
+ if (/test/.test(format)) {
+ return 'test';
+ }
+ if (m.date() === 1) {
+ return 'date';
+ }
+ return 'default';
+ }
+
+ moment.locale('made-up-2', {
+ months : fakeReplace,
+ monthsShort : fakeReplace,
+ weekdays : fakeReplace,
+ weekdaysShort : fakeReplace,
+ weekdaysMin : fakeReplace
+ });
+
+ assert.equal(moment().format('[test] dd ddd dddd MMM MMMM'), 'test test test test test test', 'format month name function should be able to access the format string');
+ assert.equal(moment([2011, 0, 1]).format('dd ddd dddd MMM MMMM'), 'date date date date date', 'format month name function should be able to access the moment object');
+ assert.equal(moment([2011, 0, 2]).format('dd ddd dddd MMM MMMM'), 'default default default default default', 'format month name function should be able to access the moment object');
+});
+
+test('changing parts of a locale config', function (assert) {
+ test.expectedDeprecations('defineLocaleOverride');
+
+ moment.locale('partial-lang', {
+ months : 'a b c d e f g h i j k l'.split(' ')
+ });
+
+ assert.equal(moment([2011, 0, 1]).format('MMMM'), 'a', 'should be able to set locale values when creating the localeuage');
+
+ moment.locale('partial-lang', {
+ monthsShort : 'A B C D E F G H I J K L'.split(' ')
+ });
+
+ assert.equal(moment([2011, 0, 1]).format('MMMM MMM'), 'a A', 'should be able to set locale values after creating the localeuage');
+
+ moment.defineLocale('partial-lang', null);
+});
+
+test('start/endOf week feature for first-day-is-monday locales', function (assert) {
+ moment.locale('monday-lang', {
+ week : {
+ dow : 1 // Monday is the first day of the week
+ }
+ });
+
+ moment.locale('monday-lang');
+ assert.equal(moment([2013, 0, 1]).startOf('week').day(), 1, 'for locale monday-lang first day of the week should be monday');
+ assert.equal(moment([2013, 0, 1]).endOf('week').day(), 0, 'for locale monday-lang last day of the week should be sunday');
+ moment.defineLocale('monday-lang', null);
+});
+
+test('meridiem parsing', function (assert) {
+ moment.locale('meridiem-parsing', {
+ meridiemParse : /[bd]/i,
+ isPM : function (input) {
+ return input === 'b';
+ }
+ });
+
+ moment.locale('meridiem-parsing');
+ assert.equal(moment('2012-01-01 3b', 'YYYY-MM-DD ha').hour(), 15, 'Custom parsing of meridiem should work');
+ assert.equal(moment('2012-01-01 3d', 'YYYY-MM-DD ha').hour(), 3, 'Custom parsing of meridiem should work');
+ moment.defineLocale('meridiem-parsing', null);
+});
+
+test('invalid date formatting', function (assert) {
+ moment.locale('has-invalid', {
+ invalidDate: 'KHAAAAAAAAAAAN!'
+ });
+
+ assert.equal(moment.invalid().format(), 'KHAAAAAAAAAAAN!');
+ assert.equal(moment.invalid().format('YYYY-MM-DD'), 'KHAAAAAAAAAAAN!');
+ moment.defineLocale('has-invalid', null);
+});
+
+test('return locale name', function (assert) {
+ var registered = moment.locale('return-this', {});
+
+ assert.equal(registered, 'return-this', 'returns the locale configured');
+ moment.locale('return-this', null);
+});
+
+test('changing the global locale doesn\'t affect existing instances', function (assert) {
+ var mom = moment();
+ moment.locale('fr');
+ assert.equal('en', mom.locale());
+});
+
+test('setting a language on instance returns the original moment for chaining', function (assert) {
+ test.expectedDeprecations('moment().lang()');
+ var mom = moment();
+
+ assert.equal(mom.lang('fr'), mom, 'setting the language (lang) returns the original moment for chaining');
+ assert.equal(mom.locale('it'), mom, 'setting the language (locale) returns the original moment for chaining');
+});
+
+test('lang(key) changes the language of the instance', function (assert) {
+ test.expectedDeprecations('moment().lang()');
+ var m = moment().month(0);
+ m.lang('fr');
+ assert.equal(m.locale(), 'fr', 'm.lang(key) changes instance locale');
+});
+
+test('moment#locale(false) resets to global locale', function (assert) {
+ var m = moment();
+
+ moment.locale('fr');
+ m.locale('it');
+
+ assert.equal(moment.locale(), 'fr', 'global locale is it');
+ assert.equal(m.locale(), 'it', 'instance locale is it');
+ m.locale(false);
+ assert.equal(m.locale(), 'fr', 'instance locale reset to global locale');
+});
+
+test('moment().locale with missing key doesn\'t change locale', function (assert) {
+ assert.equal(moment().locale('boo').localeData(), moment.localeData(),
+ 'preserve global locale in case of bad locale id');
+});
+
+test('moment().lang with missing key doesn\'t change locale', function (assert) {
+ test.expectedDeprecations('moment().lang()');
+ assert.equal(moment().lang('boo').localeData(), moment.localeData(),
+ 'preserve global locale in case of bad locale id');
+});
+
+
+// TODO: Enable this after fixing pl months parse hack hack
+// test('monthsParseExact', function (assert) {
+// var locale = 'test-months-parse-exact';
+
+// moment.defineLocale(locale, {
+// monthsParseExact: true,
+// months: 'A_AA_AAA_B_B B_BB B_C_C-C_C,C2C_D_D+D_D`D*D'.split('_'),
+// monthsShort: 'E_EE_EEE_F_FF_FFF_G_GG_GGG_H_HH_HHH'.split('_')
+// });
+
+// assert.equal(moment('A', 'MMMM', true).month(), 0, 'parse long month 0 with MMMM');
+// assert.equal(moment('AA', 'MMMM', true).month(), 1, 'parse long month 1 with MMMM');
+// assert.equal(moment('AAA', 'MMMM', true).month(), 2, 'parse long month 2 with MMMM');
+// assert.equal(moment('B B', 'MMMM', true).month(), 4, 'parse long month 4 with MMMM');
+// assert.equal(moment('BB B', 'MMMM', true).month(), 5, 'parse long month 5 with MMMM');
+// assert.equal(moment('C-C', 'MMMM', true).month(), 7, 'parse long month 7 with MMMM');
+// assert.equal(moment('C,C2C', 'MMMM', true).month(), 8, 'parse long month 8 with MMMM');
+// assert.equal(moment('D+D', 'MMMM', true).month(), 10, 'parse long month 10 with MMMM');
+// assert.equal(moment('D`D*D', 'MMMM', true).month(), 11, 'parse long month 11 with MMMM');
+
+// assert.equal(moment('E', 'MMM', true).month(), 0, 'parse long month 0 with MMM');
+// assert.equal(moment('EE', 'MMM', true).month(), 1, 'parse long month 1 with MMM');
+// assert.equal(moment('EEE', 'MMM', true).month(), 2, 'parse long month 2 with MMM');
+
+// assert.equal(moment('A', 'MMM').month(), 0, 'non-strict parse long month 0 with MMM');
+// assert.equal(moment('AA', 'MMM').month(), 1, 'non-strict parse long month 1 with MMM');
+// assert.equal(moment('AAA', 'MMM').month(), 2, 'non-strict parse long month 2 with MMM');
+// assert.equal(moment('E', 'MMMM').month(), 0, 'non-strict parse short month 0 with MMMM');
+// assert.equal(moment('EE', 'MMMM').month(), 1, 'non-strict parse short month 1 with MMMM');
+// assert.equal(moment('EEE', 'MMMM').month(), 2, 'non-strict parse short month 2 with MMMM');
+// });
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('locale inheritance');
+
+test('calendar', function (assert) {
+ moment.defineLocale('base-cal', {
+ calendar : {
+ sameDay: '[Today at] HH:mm',
+ nextDay: '[Tomorrow at] HH:mm',
+ nextWeek: '[Next week at] HH:mm',
+ lastDay: '[Yesterday at] HH:mm',
+ lastWeek: '[Last week at] HH:mm',
+ sameElse: '[whatever]'
+ }
+ });
+ moment.defineLocale('child-cal', {
+ parentLocale: 'base-cal',
+ calendar: {
+ sameDay: '[Today] HH:mm',
+ nextDay: '[Tomorrow] HH:mm',
+ nextWeek: '[Next week] HH:mm'
+ }
+ });
+
+ moment.locale('child-cal');
+ var anchor = moment.utc('2015-05-05T12:00:00', moment.ISO_8601);
+ assert.equal(anchor.clone().add(3, 'hours').calendar(anchor), 'Today 15:00', 'today uses child version');
+ assert.equal(anchor.clone().add(1, 'day').calendar(anchor), 'Tomorrow 12:00', 'tomorrow uses child version');
+ assert.equal(anchor.clone().add(3, 'days').calendar(anchor), 'Next week 12:00', 'next week uses child version');
+
+ assert.equal(anchor.clone().subtract(1, 'day').calendar(anchor), 'Yesterday at 12:00', 'yesterday uses parent version');
+ assert.equal(anchor.clone().subtract(3, 'days').calendar(anchor), 'Last week at 12:00', 'last week uses parent version');
+ assert.equal(anchor.clone().subtract(7, 'days').calendar(anchor), 'whatever', 'sameElse uses parent version -');
+ assert.equal(anchor.clone().add(7, 'days').calendar(anchor), 'whatever', 'sameElse uses parent version +');
+});
+
+test('missing', function (assert) {
+ moment.defineLocale('base-cal-2', {
+ calendar: {
+ sameDay: '[Today at] HH:mm',
+ nextDay: '[Tomorrow at] HH:mm',
+ nextWeek: '[Next week at] HH:mm',
+ lastDay: '[Yesterday at] HH:mm',
+ lastWeek: '[Last week at] HH:mm',
+ sameElse: '[whatever]'
+ }
+ });
+ moment.defineLocale('child-cal-2', {
+ parentLocale: 'base-cal-2'
+ });
+ moment.locale('child-cal-2');
+ var anchor = moment.utc('2015-05-05T12:00:00', moment.ISO_8601);
+ assert.equal(anchor.clone().add(3, 'hours').calendar(anchor), 'Today at 15:00', 'today uses parent version');
+ assert.equal(anchor.clone().add(1, 'day').calendar(anchor), 'Tomorrow at 12:00', 'tomorrow uses parent version');
+ assert.equal(anchor.clone().add(3, 'days').calendar(anchor), 'Next week at 12:00', 'next week uses parent version');
+ assert.equal(anchor.clone().subtract(1, 'day').calendar(anchor), 'Yesterday at 12:00', 'yesterday uses parent version');
+ assert.equal(anchor.clone().subtract(3, 'days').calendar(anchor), 'Last week at 12:00', 'last week uses parent version');
+ assert.equal(anchor.clone().subtract(7, 'days').calendar(anchor), 'whatever', 'sameElse uses parent version -');
+ assert.equal(anchor.clone().add(7, 'days').calendar(anchor), 'whatever', 'sameElse uses parent version +');
+});
+
+// Test function vs obj both directions
+
+test('long date format', function (assert) {
+ moment.defineLocale('base-ldf', {
+ longDateFormat : {
+ LTS : 'h:mm:ss A',
+ LT : 'h:mm A',
+ L : 'MM/DD/YYYY',
+ LL : 'MMMM D, YYYY',
+ LLL : 'MMMM D, YYYY h:mm A',
+ LLLL : 'dddd, MMMM D, YYYY h:mm A'
+ }
+ });
+ moment.defineLocale('child-ldf', {
+ parentLocale: 'base-ldf',
+ longDateFormat: {
+ LLL : '[child] MMMM D, YYYY h:mm A',
+ LLLL : '[child] dddd, MMMM D, YYYY h:mm A'
+ }
+ });
+
+ moment.locale('child-ldf');
+ var anchor = moment.utc('2015-09-06T12:34:56', moment.ISO_8601);
+ assert.equal(anchor.format('LTS'), '12:34:56 PM', 'LTS uses base');
+ assert.equal(anchor.format('LT'), '12:34 PM', 'LT uses base');
+ assert.equal(anchor.format('L'), '09/06/2015', 'L uses base');
+ assert.equal(anchor.format('l'), '9/6/2015', 'l uses base');
+ assert.equal(anchor.format('LL'), 'September 6, 2015', 'LL uses base');
+ assert.equal(anchor.format('ll'), 'Sep 6, 2015', 'll uses base');
+ assert.equal(anchor.format('LLL'), 'child September 6, 2015 12:34 PM', 'LLL uses child');
+ assert.equal(anchor.format('lll'), 'child Sep 6, 2015 12:34 PM', 'lll uses child');
+ assert.equal(anchor.format('LLLL'), 'child Sunday, September 6, 2015 12:34 PM', 'LLLL uses child');
+ assert.equal(anchor.format('llll'), 'child Sun, Sep 6, 2015 12:34 PM', 'llll uses child');
+});
+
+test('ordinal', function (assert) {
+ moment.defineLocale('base-ordinal-1', {
+ ordinal : '%dx'
+ });
+ moment.defineLocale('child-ordinal-1', {
+ parentLocale: 'base-ordinal-1',
+ ordinal : '%dy'
+ });
+
+ assert.equal(moment.utc('2015-02-03', moment.ISO_8601).format('Do'), '3y', 'ordinal uses child string');
+
+ moment.defineLocale('base-ordinal-2', {
+ ordinal : '%dx'
+ });
+ moment.defineLocale('child-ordinal-2', {
+ parentLocale: 'base-ordinal-2',
+ ordinal : function (num) {
+ return num + 'y';
+ }
+ });
+
+ assert.equal(moment.utc('2015-02-03', moment.ISO_8601).format('Do'), '3y', 'ordinal uses child function');
+
+ moment.defineLocale('base-ordinal-3', {
+ ordinal : function (num) {
+ return num + 'x';
+ }
+ });
+ moment.defineLocale('child-ordinal-3', {
+ parentLocale: 'base-ordinal-3',
+ ordinal : '%dy'
+ });
+
+ assert.equal(moment.utc('2015-02-03', moment.ISO_8601).format('Do'), '3y', 'ordinal uses child string (overwrite parent function)');
+});
+
+test('ordinal parse', function (assert) {
+ moment.defineLocale('base-ordinal-parse-1', {
+ ordinalParse : /\d{1,2}x/
+ });
+ moment.defineLocale('child-ordinal-parse-1', {
+ parentLocale: 'base-ordinal-parse-1',
+ ordinalParse : /\d{1,2}y/
+ });
+
+ assert.ok(moment.utc('2015-01-1y', 'YYYY-MM-Do', true).isValid(), 'ordinal parse uses child');
+
+ moment.defineLocale('base-ordinal-parse-2', {
+ ordinalParse : /\d{1,2}x/
+ });
+ moment.defineLocale('child-ordinal-parse-2', {
+ parentLocale: 'base-ordinal-parse-2',
+ ordinalParse : /\d{1,2}/
+ });
+
+ assert.ok(moment.utc('2015-01-1', 'YYYY-MM-Do', true).isValid(), 'ordinal parse uses child (default)');
+});
+
+test('months', function (assert) {
+ moment.defineLocale('base-months', {
+ months : 'One_Two_Three_Four_Five_Six_Seven_Eight_Nine_Ten_Eleven_Twelve'.split('_')
+ });
+ moment.defineLocale('child-months', {
+ parentLocale: 'base-months',
+ months : 'First_Second_Third_Fourth_Fifth_Sixth_Seventh_Eighth_Ninth_Tenth_Eleventh_Twelveth '.split('_')
+ });
+ assert.ok(moment.utc('2015-01-01', 'YYYY-MM-DD').format('MMMM'), 'First', 'months uses child');
+});
+
+test('define child locale before parent', function (assert) {
+ moment.defineLocale('months-x', null);
+ moment.defineLocale('base-months-x', null);
+
+ moment.defineLocale('months-x', {
+ parentLocale: 'base-months-x',
+ months : 'First_Second_Third_Fourth_Fifth_Sixth_Seventh_Eighth_Ninth_Tenth_Eleventh_Twelveth '.split('_')
+ });
+ assert.equal(moment.locale(), 'en', 'failed to set a locale requiring missing parent');
+ moment.defineLocale('base-months-x', {
+ months : 'One_Two_Three_Four_Five_Six_Seven_Eight_Nine_Ten_Eleven_Twelve'.split('_')
+ });
+ assert.equal(moment.locale(), 'base-months-x', 'defineLocale should also set the locale (regardless of child locales)');
+
+ assert.equal(moment().locale('months-x').month(0).format('MMMM'), 'First', 'loading child before parent locale works');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('locale update');
+
+test('calendar', function (assert) {
+ moment.defineLocale('cal', null);
+ moment.defineLocale('cal', {
+ calendar : {
+ sameDay: '[Today at] HH:mm',
+ nextDay: '[Tomorrow at] HH:mm',
+ nextWeek: '[Next week at] HH:mm',
+ lastDay: '[Yesterday at] HH:mm',
+ lastWeek: '[Last week at] HH:mm',
+ sameElse: '[whatever]'
+ }
+ });
+ moment.updateLocale('cal', {
+ calendar: {
+ sameDay: '[Today] HH:mm',
+ nextDay: '[Tomorrow] HH:mm',
+ nextWeek: '[Next week] HH:mm'
+ }
+ });
+
+ moment.locale('cal');
+ var anchor = moment.utc('2015-05-05T12:00:00', moment.ISO_8601);
+ assert.equal(anchor.clone().add(3, 'hours').calendar(anchor), 'Today 15:00', 'today uses child version');
+ assert.equal(anchor.clone().add(1, 'day').calendar(anchor), 'Tomorrow 12:00', 'tomorrow uses child version');
+ assert.equal(anchor.clone().add(3, 'days').calendar(anchor), 'Next week 12:00', 'next week uses child version');
+
+ assert.equal(anchor.clone().subtract(1, 'day').calendar(anchor), 'Yesterday at 12:00', 'yesterday uses parent version');
+ assert.equal(anchor.clone().subtract(3, 'days').calendar(anchor), 'Last week at 12:00', 'last week uses parent version');
+ assert.equal(anchor.clone().subtract(7, 'days').calendar(anchor), 'whatever', 'sameElse uses parent version -');
+ assert.equal(anchor.clone().add(7, 'days').calendar(anchor), 'whatever', 'sameElse uses parent version +');
+});
+
+test('missing', function (assert) {
+ moment.defineLocale('cal-2', null);
+ moment.defineLocale('cal-2', {
+ calendar: {
+ sameDay: '[Today at] HH:mm',
+ nextDay: '[Tomorrow at] HH:mm',
+ nextWeek: '[Next week at] HH:mm',
+ lastDay: '[Yesterday at] HH:mm',
+ lastWeek: '[Last week at] HH:mm',
+ sameElse: '[whatever]'
+ }
+ });
+ moment.updateLocale('cal-2', {
+ });
+ moment.locale('cal-2');
+ var anchor = moment.utc('2015-05-05T12:00:00', moment.ISO_8601);
+ assert.equal(anchor.clone().add(3, 'hours').calendar(anchor), 'Today at 15:00', 'today uses parent version');
+ assert.equal(anchor.clone().add(1, 'day').calendar(anchor), 'Tomorrow at 12:00', 'tomorrow uses parent version');
+ assert.equal(anchor.clone().add(3, 'days').calendar(anchor), 'Next week at 12:00', 'next week uses parent version');
+ assert.equal(anchor.clone().subtract(1, 'day').calendar(anchor), 'Yesterday at 12:00', 'yesterday uses parent version');
+ assert.equal(anchor.clone().subtract(3, 'days').calendar(anchor), 'Last week at 12:00', 'last week uses parent version');
+ assert.equal(anchor.clone().subtract(7, 'days').calendar(anchor), 'whatever', 'sameElse uses parent version -');
+ assert.equal(anchor.clone().add(7, 'days').calendar(anchor), 'whatever', 'sameElse uses parent version +');
+});
+
+// Test function vs obj both directions
+
+test('long date format', function (assert) {
+ moment.defineLocale('ldf', null);
+ moment.defineLocale('ldf', {
+ longDateFormat : {
+ LTS : 'h:mm:ss A',
+ LT : 'h:mm A',
+ L : 'MM/DD/YYYY',
+ LL : 'MMMM D, YYYY',
+ LLL : 'MMMM D, YYYY h:mm A',
+ LLLL : 'dddd, MMMM D, YYYY h:mm A'
+ }
+ });
+ moment.updateLocale('ldf', {
+ longDateFormat: {
+ LLL : '[child] MMMM D, YYYY h:mm A',
+ LLLL : '[child] dddd, MMMM D, YYYY h:mm A'
+ }
+ });
+
+ moment.locale('ldf');
+ var anchor = moment.utc('2015-09-06T12:34:56', moment.ISO_8601);
+ assert.equal(anchor.format('LTS'), '12:34:56 PM', 'LTS uses base');
+ assert.equal(anchor.format('LT'), '12:34 PM', 'LT uses base');
+ assert.equal(anchor.format('L'), '09/06/2015', 'L uses base');
+ assert.equal(anchor.format('l'), '9/6/2015', 'l uses base');
+ assert.equal(anchor.format('LL'), 'September 6, 2015', 'LL uses base');
+ assert.equal(anchor.format('ll'), 'Sep 6, 2015', 'll uses base');
+ assert.equal(anchor.format('LLL'), 'child September 6, 2015 12:34 PM', 'LLL uses child');
+ assert.equal(anchor.format('lll'), 'child Sep 6, 2015 12:34 PM', 'lll uses child');
+ assert.equal(anchor.format('LLLL'), 'child Sunday, September 6, 2015 12:34 PM', 'LLLL uses child');
+ assert.equal(anchor.format('llll'), 'child Sun, Sep 6, 2015 12:34 PM', 'llll uses child');
+});
+
+test('ordinal', function (assert) {
+ moment.defineLocale('ordinal-1', null);
+ moment.defineLocale('ordinal-1', {
+ ordinal : '%dx'
+ });
+ moment.updateLocale('ordinal-1', {
+ ordinal : '%dy'
+ });
+
+ assert.equal(moment.utc('2015-02-03', moment.ISO_8601).format('Do'), '3y', 'ordinal uses child string');
+
+ moment.defineLocale('ordinal-2', null);
+ moment.defineLocale('ordinal-2', {
+ ordinal : '%dx'
+ });
+ moment.updateLocale('ordinal-2', {
+ ordinal : function (num) {
+ return num + 'y';
+ }
+ });
+
+ assert.equal(moment.utc('2015-02-03', moment.ISO_8601).format('Do'), '3y', 'ordinal uses child function');
+
+ moment.defineLocale('ordinal-3', null);
+ moment.defineLocale('ordinal-3', {
+ ordinal : function (num) {
+ return num + 'x';
+ }
+ });
+ moment.updateLocale('ordinal-3', {
+ ordinal : '%dy'
+ });
+
+ assert.equal(moment.utc('2015-02-03', moment.ISO_8601).format('Do'), '3y', 'ordinal uses child string (overwrite parent function)');
+});
+
+test('ordinal parse', function (assert) {
+ moment.defineLocale('ordinal-parse-1', null);
+ moment.defineLocale('ordinal-parse-1', {
+ ordinalParse : /\d{1,2}x/
+ });
+ moment.updateLocale('ordinal-parse-1', {
+ ordinalParse : /\d{1,2}y/
+ });
+
+ assert.ok(moment.utc('2015-01-1y', 'YYYY-MM-Do', true).isValid(), 'ordinal parse uses child');
+
+ moment.defineLocale('ordinal-parse-2', null);
+ moment.defineLocale('ordinal-parse-2', {
+ ordinalParse : /\d{1,2}x/
+ });
+ moment.updateLocale('ordinal-parse-2', {
+ ordinalParse : /\d{1,2}/
+ });
+
+ assert.ok(moment.utc('2015-01-1', 'YYYY-MM-Do', true).isValid(), 'ordinal parse uses child (default)');
+});
+
+test('months', function (assert) {
+ moment.defineLocale('months', null);
+ moment.defineLocale('months', {
+ months : 'One_Two_Three_Four_Five_Six_Seven_Eight_Nine_Ten_Eleven_Twelve'.split('_')
+ });
+ moment.updateLocale('months', {
+ parentLocale: 'base-months',
+ months : 'First_Second_Third_Fourth_Fifth_Sixth_Seventh_Eighth_Ninth_Tenth_Eleventh_Twelveth '.split('_')
+ });
+ assert.ok(moment.utc('2015-01-01', 'YYYY-MM-DD').format('MMMM'), 'First', 'months uses child');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('min max');
+
+test('min', function (assert) {
+ var now = moment(),
+ future = now.clone().add(1, 'month'),
+ past = now.clone().subtract(1, 'month'),
+ invalid = moment.invalid();
+
+ assert.equal(moment.min(now, future, past), past, 'min(now, future, past)');
+ assert.equal(moment.min(future, now, past), past, 'min(future, now, past)');
+ assert.equal(moment.min(future, past, now), past, 'min(future, past, now)');
+ assert.equal(moment.min(past, future, now), past, 'min(past, future, now)');
+ assert.equal(moment.min(now, past), past, 'min(now, past)');
+ assert.equal(moment.min(past, now), past, 'min(past, now)');
+ assert.equal(moment.min(now), now, 'min(now, past)');
+
+ assert.equal(moment.min([now, future, past]), past, 'min([now, future, past])');
+ assert.equal(moment.min([now, past]), past, 'min(now, past)');
+ assert.equal(moment.min([now]), now, 'min(now)');
+
+ assert.equal(moment.min([now, invalid]), invalid, 'min(now, invalid)');
+ assert.equal(moment.min([invalid, now]), invalid, 'min(invalid, now)');
+});
+
+test('max', function (assert) {
+ var now = moment(),
+ future = now.clone().add(1, 'month'),
+ past = now.clone().subtract(1, 'month'),
+ invalid = moment.invalid();
+
+ assert.equal(moment.max(now, future, past), future, 'max(now, future, past)');
+ assert.equal(moment.max(future, now, past), future, 'max(future, now, past)');
+ assert.equal(moment.max(future, past, now), future, 'max(future, past, now)');
+ assert.equal(moment.max(past, future, now), future, 'max(past, future, now)');
+ assert.equal(moment.max(now, past), now, 'max(now, past)');
+ assert.equal(moment.max(past, now), now, 'max(past, now)');
+ assert.equal(moment.max(now), now, 'max(now, past)');
+
+ assert.equal(moment.max([now, future, past]), future, 'max([now, future, past])');
+ assert.equal(moment.max([now, past]), now, 'max(now, past)');
+ assert.equal(moment.max([now]), now, 'max(now)');
+
+ assert.equal(moment.max([now, invalid]), invalid, 'max(now, invalid)');
+ assert.equal(moment.max([invalid, now]), invalid, 'max(invalid, now)');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('mutable');
+
+test('manipulation methods', function (assert) {
+ var m = moment();
+
+ assert.equal(m, m.year(2011), 'year() should be mutable');
+ assert.equal(m, m.month(1), 'month() should be mutable');
+ assert.equal(m, m.hours(7), 'hours() should be mutable');
+ assert.equal(m, m.minutes(33), 'minutes() should be mutable');
+ assert.equal(m, m.seconds(44), 'seconds() should be mutable');
+ assert.equal(m, m.milliseconds(55), 'milliseconds() should be mutable');
+ assert.equal(m, m.day(2), 'day() should be mutable');
+ assert.equal(m, m.startOf('week'), 'startOf() should be mutable');
+ assert.equal(m, m.add(1, 'days'), 'add() should be mutable');
+ assert.equal(m, m.subtract(2, 'years'), 'subtract() should be mutable');
+ assert.equal(m, m.local(), 'local() should be mutable');
+ assert.equal(m, m.utc(), 'utc() should be mutable');
+});
+
+test('non mutable methods', function (assert) {
+ var m = moment();
+ assert.notEqual(m, m.clone(), 'clone() should not be mutable');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('normalize units');
+
+test('normalize units', function (assert) {
+ var fullKeys = ['year', 'quarter', 'month', 'isoWeek', 'week', 'day', 'hour', 'minute', 'second', 'millisecond', 'date', 'dayOfYear', 'weekday', 'isoWeekday', 'weekYear', 'isoWeekYear'],
+ aliases = ['y', 'Q', 'M', 'W', 'w', 'd', 'h', 'm', 's', 'ms', 'D', 'DDD', 'e', 'E', 'gg', 'GG'],
+ length = fullKeys.length,
+ fullKey,
+ fullKeyCaps,
+ fullKeyPlural,
+ fullKeyCapsPlural,
+ fullKeyLower,
+ alias,
+ index;
+
+ for (index = 0; index < length; index += 1) {
+ fullKey = fullKeys[index];
+ fullKeyCaps = fullKey.toUpperCase();
+ fullKeyLower = fullKey.toLowerCase();
+ fullKeyPlural = fullKey + 's';
+ fullKeyCapsPlural = fullKeyCaps + 's';
+ alias = aliases[index];
+ assert.equal(moment.normalizeUnits(fullKey), fullKey, 'Testing full key ' + fullKey);
+ assert.equal(moment.normalizeUnits(fullKeyCaps), fullKey, 'Testing full key capitalised ' + fullKey);
+ assert.equal(moment.normalizeUnits(fullKeyPlural), fullKey, 'Testing full key plural ' + fullKey);
+ assert.equal(moment.normalizeUnits(fullKeyCapsPlural), fullKey, 'Testing full key capitalised and plural ' + fullKey);
+ assert.equal(moment.normalizeUnits(alias), fullKey, 'Testing alias ' + fullKey);
+ }
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('now');
+
+test('now', function (assert) {
+ var startOfTest = new Date().valueOf(),
+ momentNowTime = moment.now(),
+ afterMomentCreationTime = new Date().valueOf();
+
+ assert.ok(startOfTest <= momentNowTime, 'moment now() time should be now, not in the past');
+ assert.ok(momentNowTime <= afterMomentCreationTime, 'moment now() time should be now, not in the future');
+});
+
+test('now - Date mocked', function (assert) {
+ // We need to test mocking the global Date object, so disable 'Read Only' jshint check
+ /* jshint -W020 */
+ var RealDate = Date,
+ customTimeMs = moment('2015-01-01T01:30:00.000Z').valueOf();
+
+ function MockDate() {
+ return new RealDate(customTimeMs);
+ }
+
+ MockDate.now = function () {
+ return new MockDate().valueOf();
+ };
+
+ MockDate.prototype = RealDate.prototype;
+
+ Date = MockDate;
+
+ try {
+ assert.equal(moment().valueOf(), customTimeMs, 'moment now() time should use the global Date object');
+ } finally {
+ Date = RealDate;
+ }
+});
+
+test('now - custom value', function (assert) {
+ var customTimeStr = '2015-01-01T01:30:00.000Z',
+ customTime = moment(customTimeStr, moment.ISO_8601).valueOf(),
+ oldFn = moment.now;
+
+ moment.now = function () {
+ return customTime;
+ };
+
+ try {
+ assert.equal(moment().toISOString(), customTimeStr, 'moment() constructor should use the function defined by moment.now, but it did not');
+ assert.equal(moment.utc().toISOString(), customTimeStr, 'moment() constructor should use the function defined by moment.now, but it did not');
+ } finally {
+ moment.now = oldFn;
+ }
+});
+
+test('empty object, empty array', function (assert) {
+ function assertIsNow(gen, msg) {
+ var before = +(new Date()),
+ mid = gen(),
+ after = +(new Date());
+ assert.ok(before <= +mid && +mid <= after, 'should be now : ' + msg);
+ }
+ assertIsNow(function () {
+ return moment();
+ }, 'moment()');
+ assertIsNow(function () {
+ return moment([]);
+ }, 'moment([])');
+ assertIsNow(function () {
+ return moment({});
+ }, 'moment({})');
+ assertIsNow(function () {
+ return moment.utc();
+ }, 'moment.utc()');
+ assertIsNow(function () {
+ return moment.utc([]);
+ }, 'moment.utc([])');
+ assertIsNow(function () {
+ return moment.utc({});
+ }, 'moment.utc({})');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('parsing flags');
+
+function flags () {
+ return moment.apply(null, arguments).parsingFlags();
+}
+
+test('overflow with array', function (assert) {
+ //months
+ assert.equal(flags([2010, 0]).overflow, -1, 'month 0 valid');
+ assert.equal(flags([2010, 1]).overflow, -1, 'month 1 valid');
+ assert.equal(flags([2010, -1]).overflow, 1, 'month -1 invalid');
+ assert.equal(flags([2100, 12]).overflow, 1, 'month 12 invalid');
+
+ //days
+ assert.equal(flags([2010, 1, 16]).overflow, -1, 'date valid');
+ assert.equal(flags([2010, 1, -1]).overflow, 2, 'date -1 invalid');
+ assert.equal(flags([2010, 1, 0]).overflow, 2, 'date 0 invalid');
+ assert.equal(flags([2010, 1, 32]).overflow, 2, 'date 32 invalid');
+ assert.equal(flags([2012, 1, 29]).overflow, -1, 'date leap year valid');
+ assert.equal(flags([2010, 1, 29]).overflow, 2, 'date leap year invalid');
+
+ //hours
+ assert.equal(flags([2010, 1, 1, 8]).overflow, -1, 'hour valid');
+ assert.equal(flags([2010, 1, 1, 0]).overflow, -1, 'hour 0 valid');
+ assert.equal(flags([2010, 1, 1, -1]).overflow, 3, 'hour -1 invalid');
+ assert.equal(flags([2010, 1, 1, 25]).overflow, 3, 'hour 25 invalid');
+ assert.equal(flags([2010, 1, 1, 24, 1]).overflow, 3, 'hour 24:01 invalid');
+
+ //minutes
+ assert.equal(flags([2010, 1, 1, 8, 15]).overflow, -1, 'minute valid');
+ assert.equal(flags([2010, 1, 1, 8, 0]).overflow, -1, 'minute 0 valid');
+ assert.equal(flags([2010, 1, 1, 8, -1]).overflow, 4, 'minute -1 invalid');
+ assert.equal(flags([2010, 1, 1, 8, 60]).overflow, 4, 'minute 60 invalid');
+
+ //seconds
+ assert.equal(flags([2010, 1, 1, 8, 15, 12]).overflow, -1, 'second valid');
+ assert.equal(flags([2010, 1, 1, 8, 15, 0]).overflow, -1, 'second 0 valid');
+ assert.equal(flags([2010, 1, 1, 8, 15, -1]).overflow, 5, 'second -1 invalid');
+ assert.equal(flags([2010, 1, 1, 8, 15, 60]).overflow, 5, 'second 60 invalid');
+
+ //milliseconds
+ assert.equal(flags([2010, 1, 1, 8, 15, 12, 345]).overflow, -1, 'millisecond valid');
+ assert.equal(flags([2010, 1, 1, 8, 15, 12, 0]).overflow, -1, 'millisecond 0 valid');
+ assert.equal(flags([2010, 1, 1, 8, 15, 12, -1]).overflow, 6, 'millisecond -1 invalid');
+ assert.equal(flags([2010, 1, 1, 8, 15, 12, 1000]).overflow, 6, 'millisecond 1000 invalid');
+
+ // 24 hrs
+ assert.equal(flags([2010, 1, 1, 24, 0, 0, 0]).overflow, -1, '24:00:00.000 is fine');
+ assert.equal(flags([2010, 1, 1, 24, 1, 0, 0]).overflow, 3, '24:01:00.000 is wrong hour');
+ assert.equal(flags([2010, 1, 1, 24, 0, 1, 0]).overflow, 3, '24:00:01.000 is wrong hour');
+ assert.equal(flags([2010, 1, 1, 24, 0, 0, 1]).overflow, 3, '24:00:00.001 is wrong hour');
+});
+
+test('overflow without format', function (assert) {
+ //months
+ assert.equal(flags('2001-01', 'YYYY-MM').overflow, -1, 'month 1 valid');
+ assert.equal(flags('2001-12', 'YYYY-MM').overflow, -1, 'month 12 valid');
+ assert.equal(flags('2001-13', 'YYYY-MM').overflow, 1, 'month 13 invalid');
+
+ //days
+ assert.equal(flags('2010-01-16', 'YYYY-MM-DD').overflow, -1, 'date 16 valid');
+ assert.equal(flags('2010-01-0', 'YYYY-MM-DD').overflow, 2, 'date 0 invalid');
+ assert.equal(flags('2010-01-32', 'YYYY-MM-DD').overflow, 2, 'date 32 invalid');
+ assert.equal(flags('2012-02-29', 'YYYY-MM-DD').overflow, -1, 'date leap year valid');
+ assert.equal(flags('2010-02-29', 'YYYY-MM-DD').overflow, 2, 'date leap year invalid');
+
+ //days of the year
+ assert.equal(flags('2010 300', 'YYYY DDDD').overflow, -1, 'day 300 of year valid');
+ assert.equal(flags('2010 365', 'YYYY DDDD').overflow, -1, 'day 365 of year valid');
+ assert.equal(flags('2010 366', 'YYYY DDDD').overflow, 2, 'day 366 of year invalid');
+ assert.equal(flags('2012 366', 'YYYY DDDD').overflow, -1, 'day 366 of leap year valid');
+ assert.equal(flags('2012 367', 'YYYY DDDD').overflow, 2, 'day 367 of leap year invalid');
+
+ //hours
+ assert.equal(flags('08', 'HH').overflow, -1, 'hour valid');
+ assert.equal(flags('00', 'HH').overflow, -1, 'hour 0 valid');
+ assert.equal(flags('25', 'HH').overflow, 3, 'hour 25 invalid');
+ assert.equal(flags('24:01', 'HH:mm').overflow, 3, 'hour 24:01 invalid');
+
+ //minutes
+ assert.equal(flags('08:15', 'HH:mm').overflow, -1, 'minute valid');
+ assert.equal(flags('08:00', 'HH:mm').overflow, -1, 'minute 0 valid');
+ assert.equal(flags('08:60', 'HH:mm').overflow, 4, 'minute 60 invalid');
+
+ //seconds
+ assert.equal(flags('08:15:12', 'HH:mm:ss').overflow, -1, 'second valid');
+ assert.equal(flags('08:15:00', 'HH:mm:ss').overflow, -1, 'second 0 valid');
+ assert.equal(flags('08:15:60', 'HH:mm:ss').overflow, 5, 'second 60 invalid');
+
+ //milliseconds
+ assert.equal(flags('08:15:12:345', 'HH:mm:ss:SSSS').overflow, -1, 'millisecond valid');
+ assert.equal(flags('08:15:12:000', 'HH:mm:ss:SSSS').overflow, -1, 'millisecond 0 valid');
+
+ //this is OK because we don't match the last digit, so it's 100 ms
+ assert.equal(flags('08:15:12:1000', 'HH:mm:ss:SSSS').overflow, -1, 'millisecond 1000 actually valid');
+});
+
+test('extra tokens', function (assert) {
+ assert.deepEqual(flags('1982-05-25', 'YYYY-MM-DD').unusedTokens, [], 'nothing extra');
+ assert.deepEqual(flags('1982-05', 'YYYY-MM-DD').unusedTokens, ['DD'], 'extra formatting token');
+ assert.deepEqual(flags('1982', 'YYYY-MM-DD').unusedTokens, ['MM', 'DD'], 'multiple extra formatting tokens');
+ assert.deepEqual(flags('1982-05', 'YYYY-MM-').unusedTokens, [], 'extra non-formatting token');
+ assert.deepEqual(flags('1982-05-', 'YYYY-MM-DD').unusedTokens, ['DD'], 'non-extra non-formatting token');
+ assert.deepEqual(flags('1982 05 1982', 'YYYY-MM-DD').unusedTokens, [], 'different non-formatting token');
+});
+
+test('extra tokens strict', function (assert) {
+ assert.deepEqual(flags('1982-05-25', 'YYYY-MM-DD', true).unusedTokens, [], 'nothing extra');
+ assert.deepEqual(flags('1982-05', 'YYYY-MM-DD', true).unusedTokens, ['-', 'DD'], 'extra formatting token');
+ assert.deepEqual(flags('1982', 'YYYY-MM-DD', true).unusedTokens, ['-', 'MM', '-', 'DD'], 'multiple extra formatting tokens');
+ assert.deepEqual(flags('1982-05', 'YYYY-MM-', true).unusedTokens, ['-'], 'extra non-formatting token');
+ assert.deepEqual(flags('1982-05-', 'YYYY-MM-DD', true).unusedTokens, ['DD'], 'non-extra non-formatting token');
+ assert.deepEqual(flags('1982 05 1982', 'YYYY-MM-DD', true).unusedTokens, ['-', '-'], 'different non-formatting token');
+});
+
+test('unused input', function (assert) {
+ assert.deepEqual(flags('1982-05-25', 'YYYY-MM-DD').unusedInput, [], 'normal input');
+ assert.deepEqual(flags('1982-05-25 this is more stuff', 'YYYY-MM-DD').unusedInput, [' this is more stuff'], 'trailing nonsense');
+ assert.deepEqual(flags('1982-05-25 09:30', 'YYYY-MM-DD').unusedInput, [' 09:30'], ['trailing legit-looking input']);
+ assert.deepEqual(flags('1982-05-25 some junk', 'YYYY-MM-DD [some junk]').unusedInput, [], 'junk that actually gets matched');
+ assert.deepEqual(flags('stuff at beginning 1982-05-25', 'YYYY-MM-DD').unusedInput, ['stuff at beginning '], 'leading junk');
+ assert.deepEqual(flags('junk 1982 more junk 05 yet more junk25', 'YYYY-MM-DD').unusedInput, ['junk ', ' more junk ', ' yet more junk'], 'interstitial junk');
+});
+
+test('unused input strict', function (assert) {
+ assert.deepEqual(flags('1982-05-25', 'YYYY-MM-DD', true).unusedInput, [], 'normal input');
+ assert.deepEqual(flags('1982-05-25 this is more stuff', 'YYYY-MM-DD', true).unusedInput, [' this is more stuff'], 'trailing nonsense');
+ assert.deepEqual(flags('1982-05-25 09:30', 'YYYY-MM-DD', true).unusedInput, [' 09:30'], ['trailing legit-looking input']);
+ assert.deepEqual(flags('1982-05-25 some junk', 'YYYY-MM-DD [some junk]', true).unusedInput, [], 'junk that actually gets matched');
+ assert.deepEqual(flags('stuff at beginning 1982-05-25', 'YYYY-MM-DD', true).unusedInput, ['stuff at beginning '], 'leading junk');
+ assert.deepEqual(flags('junk 1982 more junk 05 yet more junk25', 'YYYY-MM-DD', true).unusedInput, ['junk ', ' more junk ', ' yet more junk'], 'interstitial junk');
+});
+
+test('chars left over', function (assert) {
+ assert.equal(flags('1982-05-25', 'YYYY-MM-DD').charsLeftOver, 0, 'normal input');
+ assert.equal(flags('1982-05-25 this is more stuff', 'YYYY-MM-DD').charsLeftOver, ' this is more stuff'.length, 'trailing nonsense');
+ assert.equal(flags('1982-05-25 09:30', 'YYYY-MM-DD').charsLeftOver, ' 09:30'.length, 'trailing legit-looking input');
+ assert.equal(flags('stuff at beginning 1982-05-25', 'YYYY-MM-DD').charsLeftOver, 'stuff at beginning '.length, 'leading junk');
+ assert.equal(flags('1982 junk 05 more junk25', 'YYYY-MM-DD').charsLeftOver, [' junk ', ' more junk'].join('').length, 'interstitial junk');
+ assert.equal(flags('stuff at beginning 1982 junk 05 more junk25', 'YYYY-MM-DD').charsLeftOver, ['stuff at beginning ', ' junk ', ' more junk'].join('').length, 'leading and interstitial junk');
+});
+
+test('empty', function (assert) {
+ assert.equal(flags('1982-05-25', 'YYYY-MM-DD').empty, false, 'normal input');
+ assert.equal(flags('nothing here', 'YYYY-MM-DD').empty, true, 'pure garbage');
+ assert.equal(flags('junk but has the number 2000 in it', 'YYYY-MM-DD').empty, false, 'only mostly garbage');
+ assert.equal(flags('', 'YYYY-MM-DD').empty, true, 'empty string');
+ assert.equal(flags('', 'YYYY-MM-DD').empty, true, 'blank string');
+});
+
+test('null', function (assert) {
+ assert.equal(flags('1982-05-25', 'YYYY-MM-DD').nullInput, false, 'normal input');
+ assert.equal(flags(null).nullInput, true, 'just null');
+ assert.equal(flags(null, 'YYYY-MM-DD').nullInput, true, 'null with format');
+});
+
+test('invalid month', function (assert) {
+ assert.equal(flags('1982 May', 'YYYY MMMM').invalidMonth, null, 'normal input');
+ assert.equal(flags('1982 Laser', 'YYYY MMMM').invalidMonth, 'Laser', 'bad month name');
+});
+
+test('empty format array', function (assert) {
+ assert.equal(flags('1982 May', ['YYYY MMM']).invalidFormat, false, 'empty format array');
+ assert.equal(flags('1982 May', []).invalidFormat, true, 'empty format array');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+var symbolMap = {
+ '1': '!',
+ '2': '@',
+ '3': '#',
+ '4': '$',
+ '5': '%',
+ '6': '^',
+ '7': '&',
+ '8': '*',
+ '9': '(',
+ '0': ')'
+ };
+var numberMap = {
+ '!': '1',
+ '@': '2',
+ '#': '3',
+ '$': '4',
+ '%': '5',
+ '^': '6',
+ '&': '7',
+ '*': '8',
+ '(': '9',
+ ')': '0'
+ };
+
+module$1('preparse and postformat', {
+ setup: function () {
+ moment.locale('symbol', {
+ preparse: function (string) {
+ return string.replace(/[!@#$%\^&*()]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ }
+ });
+ },
+ teardown: function () {
+ moment.defineLocale('symbol', null);
+ }
+});
+
+test('transform', function (assert) {
+ assert.equal(moment.utc('@)!@-)*-@&', 'YYYY-MM-DD').unix(), 1346025600, 'preparse string + format');
+ assert.equal(moment.utc('@)!@-)*-@&').unix(), 1346025600, 'preparse ISO8601 string');
+ assert.equal(moment.unix(1346025600).utc().format('YYYY-MM-DD'), '@)!@-)*-@&', 'postformat');
+});
+
+test('transform from', function (assert) {
+ var start = moment([2007, 1, 28]);
+
+ assert.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), '@ minutes', 'postformat should work on moment.fn.from');
+ assert.equal(moment().add(6, 'd').fromNow(true), '^ days', 'postformat should work on moment.fn.fromNow');
+ assert.equal(moment.duration(10, 'h').humanize(), '!) hours', 'postformat should work on moment.duration.fn.humanize');
+});
+
+test('calendar day', function (assert) {
+ var a = moment().hours(12).minutes(0).seconds(0);
+
+ assert.equal(moment(a).calendar(), 'Today at !@:)) PM', 'today at the same time');
+ assert.equal(moment(a).add({m: 25}).calendar(), 'Today at !@:@% PM', 'Now plus 25 min');
+ assert.equal(moment(a).add({h: 1}).calendar(), 'Today at !:)) PM', 'Now plus 1 hour');
+ assert.equal(moment(a).add({d: 1}).calendar(), 'Tomorrow at !@:)) PM', 'tomorrow at the same time');
+ assert.equal(moment(a).subtract({h: 1}).calendar(), 'Today at !!:)) AM', 'Now minus 1 hour');
+ assert.equal(moment(a).subtract({d: 1}).calendar(), 'Yesterday at !@:)) PM', 'yesterday at the same time');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('quarter');
+
+test('library quarter getter', function (assert) {
+ assert.equal(moment([1985, 1, 4]).quarter(), 1, 'Feb 4 1985 is Q1');
+ assert.equal(moment([2029, 8, 18]).quarter(), 3, 'Sep 18 2029 is Q3');
+ assert.equal(moment([2013, 3, 24]).quarter(), 2, 'Apr 24 2013 is Q2');
+ assert.equal(moment([2015, 2, 5]).quarter(), 1, 'Mar 5 2015 is Q1');
+ assert.equal(moment([1970, 0, 2]).quarter(), 1, 'Jan 2 1970 is Q1');
+ assert.equal(moment([2001, 11, 12]).quarter(), 4, 'Dec 12 2001 is Q4');
+ assert.equal(moment([2000, 0, 2]).quarter(), 1, 'Jan 2 2000 is Q1');
+});
+
+test('quarter setter singular', function (assert) {
+ var m = moment([2014, 4, 11]);
+ assert.equal(m.quarter(2).month(), 4, 'set same quarter');
+ assert.equal(m.quarter(3).month(), 7, 'set 3rd quarter');
+ assert.equal(m.quarter(1).month(), 1, 'set 1st quarter');
+ assert.equal(m.quarter(4).month(), 10, 'set 4th quarter');
+});
+
+test('quarter setter plural', function (assert) {
+ var m = moment([2014, 4, 11]);
+ assert.equal(m.quarters(2).month(), 4, 'set same quarter');
+ assert.equal(m.quarters(3).month(), 7, 'set 3rd quarter');
+ assert.equal(m.quarters(1).month(), 1, 'set 1st quarter');
+ assert.equal(m.quarters(4).month(), 10, 'set 4th quarter');
+});
+
+test('quarter setter programmatic', function (assert) {
+ var m = moment([2014, 4, 11]);
+ assert.equal(m.set('quarter', 2).month(), 4, 'set same quarter');
+ assert.equal(m.set('quarter', 3).month(), 7, 'set 3rd quarter');
+ assert.equal(m.set('quarter', 1).month(), 1, 'set 1st quarter');
+ assert.equal(m.set('quarter', 4).month(), 10, 'set 4th quarter');
+});
+
+test('quarter setter programmatic plural', function (assert) {
+ var m = moment([2014, 4, 11]);
+ assert.equal(m.set('quarters', 2).month(), 4, 'set same quarter');
+ assert.equal(m.set('quarters', 3).month(), 7, 'set 3rd quarter');
+ assert.equal(m.set('quarters', 1).month(), 1, 'set 1st quarter');
+ assert.equal(m.set('quarters', 4).month(), 10, 'set 4th quarter');
+});
+
+test('quarter setter programmatic abbr', function (assert) {
+ var m = moment([2014, 4, 11]);
+ assert.equal(m.set('Q', 2).month(), 4, 'set same quarter');
+ assert.equal(m.set('Q', 3).month(), 7, 'set 3rd quarter');
+ assert.equal(m.set('Q', 1).month(), 1, 'set 1st quarter');
+ assert.equal(m.set('Q', 4).month(), 10, 'set 4th quarter');
+});
+
+test('quarter setter only month changes', function (assert) {
+ var m = moment([2014, 4, 11, 1, 2, 3, 4]).quarter(4);
+ assert.equal(m.year(), 2014, 'keep year');
+ assert.equal(m.month(), 10, 'set month');
+ assert.equal(m.date(), 11, 'keep date');
+ assert.equal(m.hour(), 1, 'keep hour');
+ assert.equal(m.minute(), 2, 'keep minutes');
+ assert.equal(m.second(), 3, 'keep seconds');
+ assert.equal(m.millisecond(), 4, 'keep milliseconds');
+});
+
+test('quarter setter bubble to next year', function (assert) {
+ var m = moment([2014, 4, 11, 1, 2, 3, 4]).quarter(7);
+ assert.equal(m.year(), 2015, 'year bubbled');
+ assert.equal(m.month(), 7, 'set month');
+ assert.equal(m.date(), 11, 'keep date');
+ assert.equal(m.hour(), 1, 'keep hour');
+ assert.equal(m.minute(), 2, 'keep minutes');
+ assert.equal(m.second(), 3, 'keep seconds');
+ assert.equal(m.millisecond(), 4, 'keep milliseconds');
+});
+
+test('quarter diff', function (assert) {
+ assert.equal(moment('2014-01-01').diff(moment('2014-04-01'), 'quarter'),
+ -1, 'diff -1 quarter');
+ assert.equal(moment('2014-04-01').diff(moment('2014-01-01'), 'quarter'),
+ 1, 'diff 1 quarter');
+ assert.equal(moment('2014-05-01').diff(moment('2014-01-01'), 'quarter'),
+ 1, 'diff 1 quarter');
+ assert.ok(Math.abs((4 / 3) - moment('2014-05-01').diff(
+ moment('2014-01-01'), 'quarter', true)) < 0.00001,
+ 'diff 1 1/3 quarter');
+ assert.equal(moment('2015-01-01').diff(moment('2014-01-01'), 'quarter'),
+ 4, 'diff 4 quarters');
+});
+
+test('quarter setter bubble to previous year', function (assert) {
+ var m = moment([2014, 4, 11, 1, 2, 3, 4]).quarter(-3);
+ assert.equal(m.year(), 2013, 'year bubbled');
+ assert.equal(m.month(), 1, 'set month');
+ assert.equal(m.date(), 11, 'keep date');
+ assert.equal(m.hour(), 1, 'keep hour');
+ assert.equal(m.minute(), 2, 'keep minutes');
+ assert.equal(m.second(), 3, 'keep seconds');
+ assert.equal(m.millisecond(), 4, 'keep milliseconds');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('relative time');
+
+test('default thresholds fromNow', function (assert) {
+ var a = moment();
+
+ // Seconds to minutes threshold
+ a.subtract(44, 'seconds');
+ assert.equal(a.fromNow(), 'a few seconds ago', 'Below default seconds to minutes threshold');
+ a.subtract(1, 'seconds');
+ assert.equal(a.fromNow(), 'a minute ago', 'Above default seconds to minutes threshold');
+
+ // Minutes to hours threshold
+ a = moment();
+ a.subtract(44, 'minutes');
+ assert.equal(a.fromNow(), '44 minutes ago', 'Below default minute to hour threshold');
+ a.subtract(1, 'minutes');
+ assert.equal(a.fromNow(), 'an hour ago', 'Above default minute to hour threshold');
+
+ // Hours to days threshold
+ a = moment();
+ a.subtract(21, 'hours');
+ assert.equal(a.fromNow(), '21 hours ago', 'Below default hours to day threshold');
+ a.subtract(1, 'hours');
+ assert.equal(a.fromNow(), 'a day ago', 'Above default hours to day threshold');
+
+ // Days to month threshold
+ a = moment();
+ a.subtract(25, 'days');
+ assert.equal(a.fromNow(), '25 days ago', 'Below default days to month (singular) threshold');
+ a.subtract(1, 'days');
+ assert.equal(a.fromNow(), 'a month ago', 'Above default days to month (singular) threshold');
+
+ // months to year threshold
+ a = moment();
+ a.subtract(10, 'months');
+ assert.equal(a.fromNow(), '10 months ago', 'Below default days to years threshold');
+ a.subtract(1, 'month');
+ assert.equal(a.fromNow(), 'a year ago', 'Above default days to years threshold');
+});
+
+test('default thresholds toNow', function (assert) {
+ var a = moment();
+
+ // Seconds to minutes threshold
+ a.subtract(44, 'seconds');
+ assert.equal(a.toNow(), 'in a few seconds', 'Below default seconds to minutes threshold');
+ a.subtract(1, 'seconds');
+ assert.equal(a.toNow(), 'in a minute', 'Above default seconds to minutes threshold');
+
+ // Minutes to hours threshold
+ a = moment();
+ a.subtract(44, 'minutes');
+ assert.equal(a.toNow(), 'in 44 minutes', 'Below default minute to hour threshold');
+ a.subtract(1, 'minutes');
+ assert.equal(a.toNow(), 'in an hour', 'Above default minute to hour threshold');
+
+ // Hours to days threshold
+ a = moment();
+ a.subtract(21, 'hours');
+ assert.equal(a.toNow(), 'in 21 hours', 'Below default hours to day threshold');
+ a.subtract(1, 'hours');
+ assert.equal(a.toNow(), 'in a day', 'Above default hours to day threshold');
+
+ // Days to month threshold
+ a = moment();
+ a.subtract(25, 'days');
+ assert.equal(a.toNow(), 'in 25 days', 'Below default days to month (singular) threshold');
+ a.subtract(1, 'days');
+ assert.equal(a.toNow(), 'in a month', 'Above default days to month (singular) threshold');
+
+ // months to year threshold
+ a = moment();
+ a.subtract(10, 'months');
+ assert.equal(a.toNow(), 'in 10 months', 'Below default days to years threshold');
+ a.subtract(1, 'month');
+ assert.equal(a.toNow(), 'in a year', 'Above default days to years threshold');
+});
+
+test('custom thresholds', function (assert) {
+ var a;
+
+ // Seconds to minute threshold, under 30
+ moment.relativeTimeThreshold('s', 25);
+
+ a = moment();
+ a.subtract(24, 'seconds');
+ assert.equal(a.fromNow(), 'a few seconds ago', 'Below custom seconds to minute threshold, s < 30');
+ a.subtract(1, 'seconds');
+ assert.equal(a.fromNow(), 'a minute ago', 'Above custom seconds to minute threshold, s < 30');
+
+ // Seconds to minutes threshold
+ moment.relativeTimeThreshold('s', 55);
+
+ a = moment();
+ a.subtract(54, 'seconds');
+ assert.equal(a.fromNow(), 'a few seconds ago', 'Below custom seconds to minutes threshold');
+ a.subtract(1, 'seconds');
+ assert.equal(a.fromNow(), 'a minute ago', 'Above custom seconds to minutes threshold');
+
+ moment.relativeTimeThreshold('s', 45);
+
+ // Minutes to hours threshold
+ moment.relativeTimeThreshold('m', 55);
+ a = moment();
+ a.subtract(54, 'minutes');
+ assert.equal(a.fromNow(), '54 minutes ago', 'Below custom minutes to hours threshold');
+ a.subtract(1, 'minutes');
+ assert.equal(a.fromNow(), 'an hour ago', 'Above custom minutes to hours threshold');
+ moment.relativeTimeThreshold('m', 45);
+
+ // Hours to days threshold
+ moment.relativeTimeThreshold('h', 24);
+ a = moment();
+ a.subtract(23, 'hours');
+ assert.equal(a.fromNow(), '23 hours ago', 'Below custom hours to days threshold');
+ a.subtract(1, 'hours');
+ assert.equal(a.fromNow(), 'a day ago', 'Above custom hours to days threshold');
+ moment.relativeTimeThreshold('h', 22);
+
+ // Days to month threshold
+ moment.relativeTimeThreshold('d', 28);
+ a = moment();
+ a.subtract(27, 'days');
+ assert.equal(a.fromNow(), '27 days ago', 'Below custom days to month (singular) threshold');
+ a.subtract(1, 'days');
+ assert.equal(a.fromNow(), 'a month ago', 'Above custom days to month (singular) threshold');
+ moment.relativeTimeThreshold('d', 26);
+
+ // months to years threshold
+ moment.relativeTimeThreshold('M', 9);
+ a = moment();
+ a.subtract(8, 'months');
+ assert.equal(a.fromNow(), '8 months ago', 'Below custom days to years threshold');
+ a.subtract(1, 'months');
+ assert.equal(a.fromNow(), 'a year ago', 'Above custom days to years threshold');
+ moment.relativeTimeThreshold('M', 11);
+});
+
+test('custom rounding', function (assert) {
+ var roundingDefault = moment.relativeTimeRounding();
+
+ // Round relative time evaluation down
+ moment.relativeTimeRounding(Math.floor);
+
+ moment.relativeTimeThreshold('s', 60);
+ moment.relativeTimeThreshold('m', 60);
+ moment.relativeTimeThreshold('h', 24);
+ moment.relativeTimeThreshold('d', 31);
+ moment.relativeTimeThreshold('M', 12);
+
+ var a = moment.utc();
+ a.subtract({minutes: 59, seconds: 59});
+ assert.equal(a.toNow(), 'in 59 minutes', 'Round down towards the nearest minute');
+
+ a = moment.utc();
+ a.subtract({hours: 23, minutes: 59, seconds: 59});
+ assert.equal(a.toNow(), 'in 23 hours', 'Round down towards the nearest hour');
+
+ a = moment.utc();
+ a.subtract({days: 30, hours: 23, minutes: 59});
+ assert.equal(a.toNow(), 'in 30 days', 'Round down towards the nearest day');
+
+ a = moment.utc();
+ a.subtract({days: 364});
+ assert.equal(a.toNow(), 'in 11 months', 'Round down towards the nearest month');
+
+ a = moment.utc();
+ a.subtract({years: 1, days: 364});
+ assert.equal(a.toNow(), 'in a year', 'Round down towards the nearest year');
+
+ // Do not round relative time evaluation
+ var retainValue = function (value) {
+ return value.toFixed(3);
+ };
+ moment.relativeTimeRounding(retainValue);
+
+ a = moment.utc();
+ a.subtract({hours: 39});
+ assert.equal(a.toNow(), 'in 1.625 days', 'Round down towards the nearest year');
+
+ // Restore defaults
+ moment.relativeTimeThreshold('s', 45);
+ moment.relativeTimeThreshold('m', 45);
+ moment.relativeTimeThreshold('h', 22);
+ moment.relativeTimeThreshold('d', 26);
+ moment.relativeTimeThreshold('M', 11);
+ moment.relativeTimeRounding(roundingDefault);
+});
+
+test('retrive rounding settings', function (assert) {
+ moment.relativeTimeRounding(Math.round);
+ var roundingFunction = moment.relativeTimeRounding();
+
+ assert.equal(roundingFunction, Math.round, 'Can retrieve rounding setting');
+});
+
+test('retrive threshold settings', function (assert) {
+ moment.relativeTimeThreshold('m', 45);
+ var minuteThreshold = moment.relativeTimeThreshold('m');
+
+ assert.equal(minuteThreshold, 45, 'Can retrieve minute setting');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('start and end of units');
+
+test('start of year', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('year'),
+ ms = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('years'),
+ ma = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('y');
+ assert.equal(+m, +ms, 'Plural or singular should work');
+ assert.equal(+m, +ma, 'Full or abbreviated should work');
+ assert.equal(m.year(), 2011, 'keep the year');
+ assert.equal(m.month(), 0, 'strip out the month');
+ assert.equal(m.date(), 1, 'strip out the day');
+ assert.equal(m.hours(), 0, 'strip out the hours');
+ assert.equal(m.minutes(), 0, 'strip out the minutes');
+ assert.equal(m.seconds(), 0, 'strip out the seconds');
+ assert.equal(m.milliseconds(), 0, 'strip out the milliseconds');
+});
+
+test('end of year', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('year'),
+ ms = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('years'),
+ ma = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('y');
+ assert.equal(+m, +ms, 'Plural or singular should work');
+ assert.equal(+m, +ma, 'Full or abbreviated should work');
+ assert.equal(m.year(), 2011, 'keep the year');
+ assert.equal(m.month(), 11, 'set the month');
+ assert.equal(m.date(), 31, 'set the day');
+ assert.equal(m.hours(), 23, 'set the hours');
+ assert.equal(m.minutes(), 59, 'set the minutes');
+ assert.equal(m.seconds(), 59, 'set the seconds');
+ assert.equal(m.milliseconds(), 999, 'set the seconds');
+});
+
+test('start of quarter', function (assert) {
+ var m = moment(new Date(2011, 4, 2, 3, 4, 5, 6)).startOf('quarter'),
+ ms = moment(new Date(2011, 4, 2, 3, 4, 5, 6)).startOf('quarters'),
+ ma = moment(new Date(2011, 4, 2, 3, 4, 5, 6)).startOf('Q');
+ assert.equal(+m, +ms, 'Plural or singular should work');
+ assert.equal(+m, +ma, 'Full or abbreviated should work');
+ assert.equal(m.year(), 2011, 'keep the year');
+ assert.equal(m.quarter(), 2, 'keep the quarter');
+ assert.equal(m.month(), 3, 'strip out the month');
+ assert.equal(m.date(), 1, 'strip out the day');
+ assert.equal(m.hours(), 0, 'strip out the hours');
+ assert.equal(m.minutes(), 0, 'strip out the minutes');
+ assert.equal(m.seconds(), 0, 'strip out the seconds');
+ assert.equal(m.milliseconds(), 0, 'strip out the milliseconds');
+});
+
+test('end of quarter', function (assert) {
+ var m = moment(new Date(2011, 4, 2, 3, 4, 5, 6)).endOf('quarter'),
+ ms = moment(new Date(2011, 4, 2, 3, 4, 5, 6)).endOf('quarters'),
+ ma = moment(new Date(2011, 4, 2, 3, 4, 5, 6)).endOf('Q');
+ assert.equal(+m, +ms, 'Plural or singular should work');
+ assert.equal(+m, +ma, 'Full or abbreviated should work');
+ assert.equal(m.year(), 2011, 'keep the year');
+ assert.equal(m.quarter(), 2, 'keep the quarter');
+ assert.equal(m.month(), 5, 'set the month');
+ assert.equal(m.date(), 30, 'set the day');
+ assert.equal(m.hours(), 23, 'set the hours');
+ assert.equal(m.minutes(), 59, 'set the minutes');
+ assert.equal(m.seconds(), 59, 'set the seconds');
+ assert.equal(m.milliseconds(), 999, 'set the seconds');
+});
+
+test('start of month', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('month'),
+ ms = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('months'),
+ ma = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('M');
+ assert.equal(+m, +ms, 'Plural or singular should work');
+ assert.equal(+m, +ma, 'Full or abbreviated should work');
+ assert.equal(m.year(), 2011, 'keep the year');
+ assert.equal(m.month(), 1, 'keep the month');
+ assert.equal(m.date(), 1, 'strip out the day');
+ assert.equal(m.hours(), 0, 'strip out the hours');
+ assert.equal(m.minutes(), 0, 'strip out the minutes');
+ assert.equal(m.seconds(), 0, 'strip out the seconds');
+ assert.equal(m.milliseconds(), 0, 'strip out the milliseconds');
+});
+
+test('end of month', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('month'),
+ ms = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('months'),
+ ma = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('M');
+ assert.equal(+m, +ms, 'Plural or singular should work');
+ assert.equal(+m, +ma, 'Full or abbreviated should work');
+ assert.equal(m.year(), 2011, 'keep the year');
+ assert.equal(m.month(), 1, 'keep the month');
+ assert.equal(m.date(), 28, 'set the day');
+ assert.equal(m.hours(), 23, 'set the hours');
+ assert.equal(m.minutes(), 59, 'set the minutes');
+ assert.equal(m.seconds(), 59, 'set the seconds');
+ assert.equal(m.milliseconds(), 999, 'set the seconds');
+});
+
+test('start of week', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('week'),
+ ms = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('weeks'),
+ ma = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('w');
+ assert.equal(+m, +ms, 'Plural or singular should work');
+ assert.equal(+m, +ma, 'Full or abbreviated should work');
+ assert.equal(m.year(), 2011, 'keep the year');
+ assert.equal(m.month(), 0, 'rolls back to January');
+ assert.equal(m.day(), 0, 'set day of week');
+ assert.equal(m.date(), 30, 'set correct date');
+ assert.equal(m.hours(), 0, 'strip out the hours');
+ assert.equal(m.minutes(), 0, 'strip out the minutes');
+ assert.equal(m.seconds(), 0, 'strip out the seconds');
+ assert.equal(m.milliseconds(), 0, 'strip out the milliseconds');
+});
+
+test('end of week', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('week'),
+ ms = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('weeks'),
+ ma = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('weeks');
+ assert.equal(+m, +ms, 'Plural or singular should work');
+ assert.equal(+m, +ma, 'Full or abbreviated should work');
+ assert.equal(m.year(), 2011, 'keep the year');
+ assert.equal(m.month(), 1, 'keep the month');
+ assert.equal(m.day(), 6, 'set the day of the week');
+ assert.equal(m.date(), 5, 'set the day');
+ assert.equal(m.hours(), 23, 'set the hours');
+ assert.equal(m.minutes(), 59, 'set the minutes');
+ assert.equal(m.seconds(), 59, 'set the seconds');
+ assert.equal(m.milliseconds(), 999, 'set the seconds');
+});
+
+test('start of iso-week', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('isoWeek'),
+ ms = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('isoWeeks'),
+ ma = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('W');
+ assert.equal(+m, +ms, 'Plural or singular should work');
+ assert.equal(+m, +ma, 'Full or abbreviated should work');
+ assert.equal(m.year(), 2011, 'keep the year');
+ assert.equal(m.month(), 0, 'rollback to January');
+ assert.equal(m.isoWeekday(), 1, 'set day of iso-week');
+ assert.equal(m.date(), 31, 'set correct date');
+ assert.equal(m.hours(), 0, 'strip out the hours');
+ assert.equal(m.minutes(), 0, 'strip out the minutes');
+ assert.equal(m.seconds(), 0, 'strip out the seconds');
+ assert.equal(m.milliseconds(), 0, 'strip out the milliseconds');
+});
+
+test('end of iso-week', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('isoWeek'),
+ ms = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('isoWeeks'),
+ ma = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('W');
+ assert.equal(+m, +ms, 'Plural or singular should work');
+ assert.equal(+m, +ma, 'Full or abbreviated should work');
+ assert.equal(m.year(), 2011, 'keep the year');
+ assert.equal(m.month(), 1, 'keep the month');
+ assert.equal(m.isoWeekday(), 7, 'set the day of the week');
+ assert.equal(m.date(), 6, 'set the day');
+ assert.equal(m.hours(), 23, 'set the hours');
+ assert.equal(m.minutes(), 59, 'set the minutes');
+ assert.equal(m.seconds(), 59, 'set the seconds');
+ assert.equal(m.milliseconds(), 999, 'set the seconds');
+});
+
+test('start of day', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('day'),
+ ms = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('days'),
+ ma = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('d');
+ assert.equal(+m, +ms, 'Plural or singular should work');
+ assert.equal(+m, +ma, 'Full or abbreviated should work');
+ assert.equal(m.year(), 2011, 'keep the year');
+ assert.equal(m.month(), 1, 'keep the month');
+ assert.equal(m.date(), 2, 'keep the day');
+ assert.equal(m.hours(), 0, 'strip out the hours');
+ assert.equal(m.minutes(), 0, 'strip out the minutes');
+ assert.equal(m.seconds(), 0, 'strip out the seconds');
+ assert.equal(m.milliseconds(), 0, 'strip out the milliseconds');
+});
+
+test('end of day', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('day'),
+ ms = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('days'),
+ ma = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('d');
+ assert.equal(+m, +ms, 'Plural or singular should work');
+ assert.equal(+m, +ma, 'Full or abbreviated should work');
+ assert.equal(m.year(), 2011, 'keep the year');
+ assert.equal(m.month(), 1, 'keep the month');
+ assert.equal(m.date(), 2, 'keep the day');
+ assert.equal(m.hours(), 23, 'set the hours');
+ assert.equal(m.minutes(), 59, 'set the minutes');
+ assert.equal(m.seconds(), 59, 'set the seconds');
+ assert.equal(m.milliseconds(), 999, 'set the seconds');
+});
+
+test('start of date', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('date'),
+ ms = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('dates');
+
+ assert.equal(+m, +ms, 'Plural or singular should work');
+ assert.equal(m.year(), 2011, 'keep the year');
+ assert.equal(m.month(), 1, 'keep the month');
+ assert.equal(m.date(), 2, 'keep the day');
+ assert.equal(m.hours(), 0, 'strip out the hours');
+ assert.equal(m.minutes(), 0, 'strip out the minutes');
+ assert.equal(m.seconds(), 0, 'strip out the seconds');
+ assert.equal(m.milliseconds(), 0, 'strip out the milliseconds');
+});
+
+test('end of date', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('date'),
+ ms = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('dates');
+
+ assert.equal(+m, +ms, 'Plural or singular should work');
+ assert.equal(m.year(), 2011, 'keep the year');
+ assert.equal(m.month(), 1, 'keep the month');
+ assert.equal(m.date(), 2, 'keep the day');
+ assert.equal(m.hours(), 23, 'set the hours');
+ assert.equal(m.minutes(), 59, 'set the minutes');
+ assert.equal(m.seconds(), 59, 'set the seconds');
+ assert.equal(m.milliseconds(), 999, 'set the seconds');
+});
+
+
+test('start of hour', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('hour'),
+ ms = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('hours'),
+ ma = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('h');
+ assert.equal(+m, +ms, 'Plural or singular should work');
+ assert.equal(+m, +ma, 'Full or abbreviated should work');
+ assert.equal(m.year(), 2011, 'keep the year');
+ assert.equal(m.month(), 1, 'keep the month');
+ assert.equal(m.date(), 2, 'keep the day');
+ assert.equal(m.hours(), 3, 'keep the hours');
+ assert.equal(m.minutes(), 0, 'strip out the minutes');
+ assert.equal(m.seconds(), 0, 'strip out the seconds');
+ assert.equal(m.milliseconds(), 0, 'strip out the milliseconds');
+});
+
+test('end of hour', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('hour'),
+ ms = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('hours'),
+ ma = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('h');
+ assert.equal(+m, +ms, 'Plural or singular should work');
+ assert.equal(+m, +ma, 'Full or abbreviated should work');
+ assert.equal(m.year(), 2011, 'keep the year');
+ assert.equal(m.month(), 1, 'keep the month');
+ assert.equal(m.date(), 2, 'keep the day');
+ assert.equal(m.hours(), 3, 'keep the hours');
+ assert.equal(m.minutes(), 59, 'set the minutes');
+ assert.equal(m.seconds(), 59, 'set the seconds');
+ assert.equal(m.milliseconds(), 999, 'set the seconds');
+});
+
+test('start of minute', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('minute'),
+ ms = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('minutes'),
+ ma = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('m');
+ assert.equal(+m, +ms, 'Plural or singular should work');
+ assert.equal(+m, +ma, 'Full or abbreviated should work');
+ assert.equal(m.year(), 2011, 'keep the year');
+ assert.equal(m.month(), 1, 'keep the month');
+ assert.equal(m.date(), 2, 'keep the day');
+ assert.equal(m.hours(), 3, 'keep the hours');
+ assert.equal(m.minutes(), 4, 'keep the minutes');
+ assert.equal(m.seconds(), 0, 'strip out the seconds');
+ assert.equal(m.milliseconds(), 0, 'strip out the milliseconds');
+});
+
+test('end of minute', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('minute'),
+ ms = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('minutes'),
+ ma = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('m');
+ assert.equal(+m, +ms, 'Plural or singular should work');
+ assert.equal(+m, +ma, 'Full or abbreviated should work');
+ assert.equal(m.year(), 2011, 'keep the year');
+ assert.equal(m.month(), 1, 'keep the month');
+ assert.equal(m.date(), 2, 'keep the day');
+ assert.equal(m.hours(), 3, 'keep the hours');
+ assert.equal(m.minutes(), 4, 'keep the minutes');
+ assert.equal(m.seconds(), 59, 'set the seconds');
+ assert.equal(m.milliseconds(), 999, 'set the seconds');
+});
+
+test('start of second', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('second'),
+ ms = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('seconds'),
+ ma = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).startOf('s');
+ assert.equal(+m, +ms, 'Plural or singular should work');
+ assert.equal(+m, +ma, 'Full or abbreviated should work');
+ assert.equal(m.year(), 2011, 'keep the year');
+ assert.equal(m.month(), 1, 'keep the month');
+ assert.equal(m.date(), 2, 'keep the day');
+ assert.equal(m.hours(), 3, 'keep the hours');
+ assert.equal(m.minutes(), 4, 'keep the minutes');
+ assert.equal(m.seconds(), 5, 'keep the the seconds');
+ assert.equal(m.milliseconds(), 0, 'strip out the milliseconds');
+});
+
+test('end of second', function (assert) {
+ var m = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('second'),
+ ms = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('seconds'),
+ ma = moment(new Date(2011, 1, 2, 3, 4, 5, 6)).endOf('s');
+ assert.equal(+m, +ms, 'Plural or singular should work');
+ assert.equal(+m, +ma, 'Full or abbreviated should work');
+ assert.equal(m.year(), 2011, 'keep the year');
+ assert.equal(m.month(), 1, 'keep the month');
+ assert.equal(m.date(), 2, 'keep the day');
+ assert.equal(m.hours(), 3, 'keep the hours');
+ assert.equal(m.minutes(), 4, 'keep the minutes');
+ assert.equal(m.seconds(), 5, 'keep the seconds');
+ assert.equal(m.milliseconds(), 999, 'set the seconds');
+});
+
+test('startOf across DST +1', function (assert) {
+ var oldUpdateOffset = moment.updateOffset,
+ // Based on a real story somewhere in America/Los_Angeles
+ dstAt = moment('2014-03-09T02:00:00-08:00').parseZone(),
+ m;
+
+ moment.updateOffset = function (mom, keepTime) {
+ if (mom.isBefore(dstAt)) {
+ mom.utcOffset(-8, keepTime);
+ } else {
+ mom.utcOffset(-7, keepTime);
+ }
+ };
+
+ m = moment('2014-03-15T00:00:00-07:00').parseZone();
+ m.startOf('y');
+ assert.equal(m.format(), '2014-01-01T00:00:00-08:00', 'startOf(\'year\') across +1');
+
+ m = moment('2014-03-15T00:00:00-07:00').parseZone();
+ m.startOf('M');
+ assert.equal(m.format(), '2014-03-01T00:00:00-08:00', 'startOf(\'month\') across +1');
+
+ m = moment('2014-03-09T09:00:00-07:00').parseZone();
+ m.startOf('d');
+ assert.equal(m.format(), '2014-03-09T00:00:00-08:00', 'startOf(\'day\') across +1');
+
+ m = moment('2014-03-09T03:05:00-07:00').parseZone();
+ m.startOf('h');
+ assert.equal(m.format(), '2014-03-09T03:00:00-07:00', 'startOf(\'hour\') after +1');
+
+ m = moment('2014-03-09T01:35:00-08:00').parseZone();
+ m.startOf('h');
+ assert.equal(m.format(), '2014-03-09T01:00:00-08:00', 'startOf(\'hour\') before +1');
+
+ // There is no such time as 2:30-7 to try startOf('hour') across that
+
+ moment.updateOffset = oldUpdateOffset;
+});
+
+test('startOf across DST -1', function (assert) {
+ var oldUpdateOffset = moment.updateOffset,
+ // Based on a real story somewhere in America/Los_Angeles
+ dstAt = moment('2014-11-02T02:00:00-07:00').parseZone(),
+ m;
+
+ moment.updateOffset = function (mom, keepTime) {
+ if (mom.isBefore(dstAt)) {
+ mom.utcOffset(-7, keepTime);
+ } else {
+ mom.utcOffset(-8, keepTime);
+ }
+ };
+
+ m = moment('2014-11-15T00:00:00-08:00').parseZone();
+ m.startOf('y');
+ assert.equal(m.format(), '2014-01-01T00:00:00-07:00', 'startOf(\'year\') across -1');
+
+ m = moment('2014-11-15T00:00:00-08:00').parseZone();
+ m.startOf('M');
+ assert.equal(m.format(), '2014-11-01T00:00:00-07:00', 'startOf(\'month\') across -1');
+
+ m = moment('2014-11-02T09:00:00-08:00').parseZone();
+ m.startOf('d');
+ assert.equal(m.format(), '2014-11-02T00:00:00-07:00', 'startOf(\'day\') across -1');
+
+ // note that utc offset is -8
+ m = moment('2014-11-02T01:30:00-08:00').parseZone();
+ m.startOf('h');
+ assert.equal(m.format(), '2014-11-02T01:00:00-08:00', 'startOf(\'hour\') after +1');
+
+ // note that utc offset is -7
+ m = moment('2014-11-02T01:30:00-07:00').parseZone();
+ m.startOf('h');
+ assert.equal(m.format(), '2014-11-02T01:00:00-07:00', 'startOf(\'hour\') before +1');
+
+ moment.updateOffset = oldUpdateOffset;
+});
+
+test('endOf millisecond and no-arg', function (assert) {
+ var m = moment();
+ assert.equal(+m, +m.clone().endOf(), 'endOf without argument should change time');
+ assert.equal(+m, +m.clone().endOf('ms'), 'endOf with ms argument should change time');
+ assert.equal(+m, +m.clone().endOf('millisecond'), 'endOf with millisecond argument should change time');
+ assert.equal(+m, +m.clone().endOf('milliseconds'), 'endOf with milliseconds argument should change time');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('string prototype');
+
+test('string prototype overrides call', function (assert) {
+ var prior = String.prototype.call, b;
+ String.prototype.call = function () {
+ return null;
+ };
+
+ b = moment(new Date(2011, 7, 28, 15, 25, 50, 125));
+ assert.equal(b.format('MMMM Do YYYY, h:mm a'), 'August 28th 2011, 3:25 pm');
+
+ String.prototype.call = prior;
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('to type');
+
+test('toObject', function (assert) {
+ var expected = {
+ years:2010,
+ months:3,
+ date:5,
+ hours:15,
+ minutes:10,
+ seconds:3,
+ milliseconds:123
+ };
+ assert.deepEqual(moment(expected).toObject(), expected, 'toObject invalid');
+});
+
+test('toArray', function (assert) {
+ var expected = [2014, 11, 26, 11, 46, 58, 17];
+ assert.deepEqual(moment(expected).toArray(), expected, 'toArray invalid');
+});
+
+test('toDate returns a copy of the internal date', function (assert) {
+ var m = moment();
+ var d = m.toDate();
+ m.year(0);
+ assert.notEqual(d, m.toDate());
+});
+
+test('toJSON', function (assert) {
+ if (Date.prototype.toISOString) {
+ var expected = new Date().toISOString();
+ assert.deepEqual(moment(expected).toJSON(), expected, 'toJSON invalid');
+ } else {
+ // IE8
+ expect(0);
+ }
+});
+
+test('toJSON works when moment is frozen', function (assert) {
+ if (Date.prototype.toISOString) {
+ var expected = new Date().toISOString();
+ var m = moment(expected);
+ if (Object.freeze != null) {
+ Object.freeze(m);
+ }
+ assert.deepEqual(m.toJSON(), expected, 'toJSON when frozen invalid');
+ } else {
+ // IE8
+ expect(0);
+ }
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('utc');
+
+test('utc and local', function (assert) {
+ var m = moment(Date.UTC(2011, 1, 2, 3, 4, 5, 6)), offset, expected;
+ m.utc();
+ // utc
+ assert.equal(m.date(), 2, 'the day should be correct for utc');
+ assert.equal(m.day(), 3, 'the date should be correct for utc');
+ assert.equal(m.hours(), 3, 'the hours should be correct for utc');
+
+ // local
+ m.local();
+ if (m.utcOffset() < -180) {
+ assert.equal(m.date(), 1, 'the date should be correct for local');
+ assert.equal(m.day(), 2, 'the day should be correct for local');
+ } else {
+ assert.equal(m.date(), 2, 'the date should be correct for local');
+ assert.equal(m.day(), 3, 'the day should be correct for local');
+ }
+ offset = Math.floor(m.utcOffset() / 60);
+ expected = (24 + 3 + offset) % 24;
+ assert.equal(m.hours(), expected, 'the hours (' + m.hours() + ') should be correct for local');
+ assert.equal(moment().utc().utcOffset(), 0, 'timezone in utc should always be zero');
+});
+
+test('creating with utc and no arguments', function (assert) {
+ var startOfTest = new Date().valueOf(),
+ momentDefaultUtcTime = moment.utc().valueOf(),
+ afterMomentCreationTime = new Date().valueOf();
+
+ assert.ok(startOfTest <= momentDefaultUtcTime, 'moment UTC default time should be now, not in the past');
+ assert.ok(momentDefaultUtcTime <= afterMomentCreationTime, 'moment UTC default time should be now, not in the future');
+});
+
+test('creating with utc and a date parameter array', function (assert) {
+ var m = moment.utc([2011, 1, 2, 3, 4, 5, 6]);
+ assert.equal(m.date(), 2, 'the day should be correct for utc array');
+ assert.equal(m.hours(), 3, 'the hours should be correct for utc array');
+
+ m = moment.utc('2011-02-02 3:04:05', 'YYYY-MM-DD HH:mm:ss');
+ assert.equal(m.date(), 2, 'the day should be correct for utc parsing format');
+ assert.equal(m.hours(), 3, 'the hours should be correct for utc parsing format');
+
+ m = moment.utc('2011-02-02T03:04:05+00:00');
+ assert.equal(m.date(), 2, 'the day should be correct for utc parsing iso');
+ assert.equal(m.hours(), 3, 'the hours should be correct for utc parsing iso');
+});
+
+test('creating with utc without timezone', function (assert) {
+ var m = moment.utc('2012-01-02T08:20:00');
+ assert.equal(m.date(), 2, 'the day should be correct for utc parse without timezone');
+ assert.equal(m.hours(), 8, 'the hours should be correct for utc parse without timezone');
+
+ m = moment.utc('2012-01-02T08:20:00+09:00');
+ assert.equal(m.date(), 1, 'the day should be correct for utc parse with timezone');
+ assert.equal(m.hours(), 23, 'the hours should be correct for utc parse with timezone');
+});
+
+test('cloning with utc offset', function (assert) {
+ var m = moment.utc('2012-01-02T08:20:00');
+ assert.equal(moment.utc(m)._isUTC, true, 'the local offset should be converted to UTC');
+ assert.equal(moment.utc(m.clone().utc())._isUTC, true, 'the local offset should stay in UTC');
+
+ m.utcOffset(120);
+ assert.equal(moment.utc(m)._isUTC, true, 'the explicit utc offset should stay in UTC');
+ assert.equal(moment.utc(m).utcOffset(), 0, 'the explicit utc offset should have an offset of 0');
+});
+
+test('weekday with utc', function (assert) {
+ assert.equal(
+ moment('2013-09-15T00:00:00Z').utc().weekday(), // first minute of the day
+ moment('2013-09-15T23:59:00Z').utc().weekday(), // last minute of the day
+ 'a UTC-moment\'s .weekday() should not be affected by the local timezone'
+ );
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('utc offset');
+
+test('setter / getter blackbox', function (assert) {
+ var m = moment([2010]);
+
+ assert.equal(m.clone().utcOffset(0).utcOffset(), 0, 'utcOffset 0');
+
+ assert.equal(m.clone().utcOffset(1).utcOffset(), 60, 'utcOffset 1 is 60');
+ assert.equal(m.clone().utcOffset(60).utcOffset(), 60, 'utcOffset 60');
+ assert.equal(m.clone().utcOffset('+01:00').utcOffset(), 60, 'utcOffset +01:00 is 60');
+ assert.equal(m.clone().utcOffset('+0100').utcOffset(), 60, 'utcOffset +0100 is 60');
+
+ assert.equal(m.clone().utcOffset(-1).utcOffset(), -60, 'utcOffset -1 is -60');
+ assert.equal(m.clone().utcOffset(-60).utcOffset(), -60, 'utcOffset -60');
+ assert.equal(m.clone().utcOffset('-01:00').utcOffset(), -60, 'utcOffset -01:00 is -60');
+ assert.equal(m.clone().utcOffset('-0100').utcOffset(), -60, 'utcOffset -0100 is -60');
+
+ assert.equal(m.clone().utcOffset(1.5).utcOffset(), 90, 'utcOffset 1.5 is 90');
+ assert.equal(m.clone().utcOffset(90).utcOffset(), 90, 'utcOffset 1.5 is 90');
+ assert.equal(m.clone().utcOffset('+01:30').utcOffset(), 90, 'utcOffset +01:30 is 90');
+ assert.equal(m.clone().utcOffset('+0130').utcOffset(), 90, 'utcOffset +0130 is 90');
+
+ assert.equal(m.clone().utcOffset(-1.5).utcOffset(), -90, 'utcOffset -1.5');
+ assert.equal(m.clone().utcOffset(-90).utcOffset(), -90, 'utcOffset -90');
+ assert.equal(m.clone().utcOffset('-01:30').utcOffset(), -90, 'utcOffset +01:30 is 90');
+ assert.equal(m.clone().utcOffset('-0130').utcOffset(), -90, 'utcOffset +0130 is 90');
+ assert.equal(m.clone().utcOffset('+00:10').utcOffset(), 10, 'utcOffset +00:10 is 10');
+ assert.equal(m.clone().utcOffset('-00:10').utcOffset(), -10, 'utcOffset +00:10 is 10');
+ assert.equal(m.clone().utcOffset('+0010').utcOffset(), 10, 'utcOffset +0010 is 10');
+ assert.equal(m.clone().utcOffset('-0010').utcOffset(), -10, 'utcOffset +0010 is 10');
+});
+
+test('utcOffset shorthand hours -> minutes', function (assert) {
+ var i;
+ for (i = -15; i <= 15; ++i) {
+ assert.equal(moment().utcOffset(i).utcOffset(), i * 60,
+ '' + i + ' -> ' + i * 60);
+ }
+ assert.equal(moment().utcOffset(-16).utcOffset(), -16, '-16 -> -16');
+ assert.equal(moment().utcOffset(16).utcOffset(), 16, '16 -> 16');
+});
+
+test('isLocal, isUtc, isUtcOffset', function (assert) {
+ assert.ok(moment().isLocal(), 'moment() creates objects in local time');
+ assert.ok(!moment.utc().isLocal(), 'moment.utc creates objects NOT in local time');
+ assert.ok(moment.utc().local().isLocal(), 'moment.fn.local() converts to local time');
+ assert.ok(!moment().utcOffset(5).isLocal(), 'moment.fn.utcOffset(N) puts objects NOT in local time');
+ assert.ok(moment().utcOffset(5).local().isLocal(), 'moment.fn.local() converts to local time');
+
+ assert.ok(moment.utc().isUtc(), 'moment.utc() creates objects in utc time');
+ assert.ok(moment().utcOffset(0).isUtc(), 'utcOffset(0) is equivalent to utc mode');
+ assert.ok(!moment().utcOffset(1).isUtc(), 'utcOffset(1) is NOT equivalent to utc mode');
+
+ assert.ok(!moment().isUtcOffset(), 'moment() creates objects NOT in utc-offset mode');
+ assert.ok(moment.utc().isUtcOffset(), 'moment.utc() creates objects in utc-offset mode');
+ assert.ok(moment().utcOffset(3).isUtcOffset(), 'utcOffset(N != 0) creates objects in utc-offset mode');
+ assert.ok(moment().utcOffset(0).isUtcOffset(), 'utcOffset(0) creates objects in utc-offset mode');
+});
+
+test('isUTC', function (assert) {
+ assert.ok(moment.utc().isUTC(), 'moment.utc() creates objects in utc time');
+ assert.ok(moment().utcOffset(0).isUTC(), 'utcOffset(0) is equivalent to utc mode');
+ assert.ok(!moment().utcOffset(1).isUTC(), 'utcOffset(1) is NOT equivalent to utc mode');
+});
+
+test('change hours when changing the utc offset', function (assert) {
+ var m = moment.utc([2000, 0, 1, 6]);
+ assert.equal(m.hour(), 6, 'UTC 6AM should be 6AM at +0000');
+
+ // sanity check
+ m.utcOffset(0);
+ assert.equal(m.hour(), 6, 'UTC 6AM should be 6AM at +0000');
+
+ m.utcOffset(-60);
+ assert.equal(m.hour(), 5, 'UTC 6AM should be 5AM at -0100');
+
+ m.utcOffset(60);
+ assert.equal(m.hour(), 7, 'UTC 6AM should be 7AM at +0100');
+});
+
+test('change minutes when changing the utc offset', function (assert) {
+ var m = moment.utc([2000, 0, 1, 6, 31]);
+
+ m.utcOffset(0);
+ assert.equal(m.format('HH:mm'), '06:31', 'UTC 6:31AM should be 6:31AM at +0000');
+
+ m.utcOffset(-30);
+ assert.equal(m.format('HH:mm'), '06:01', 'UTC 6:31AM should be 6:01AM at -0030');
+
+ m.utcOffset(30);
+ assert.equal(m.format('HH:mm'), '07:01', 'UTC 6:31AM should be 7:01AM at +0030');
+
+ m.utcOffset(-1380);
+ assert.equal(m.format('HH:mm'), '07:31', 'UTC 6:31AM should be 7:31AM at +1380');
+});
+
+test('distance from the unix epoch', function (assert) {
+ var zoneA = moment(),
+ zoneB = moment(zoneA),
+ zoneC = moment(zoneA),
+ zoneD = moment(zoneA),
+ zoneE = moment(zoneA);
+
+ zoneB.utc();
+ assert.equal(+zoneA, +zoneB, 'moment should equal moment.utc');
+
+ zoneC.utcOffset(60);
+ assert.equal(+zoneA, +zoneC, 'moment should equal moment.utcOffset(60)');
+
+ zoneD.utcOffset(-480);
+ assert.equal(+zoneA, +zoneD,
+ 'moment should equal moment.utcOffset(-480)');
+
+ zoneE.utcOffset(-1000);
+ assert.equal(+zoneA, +zoneE,
+ 'moment should equal moment.utcOffset(-1000)');
+});
+
+test('update offset after changing any values', function (assert) {
+ var oldOffset = moment.updateOffset,
+ m = moment.utc([2000, 6, 1]);
+
+ moment.updateOffset = function (mom, keepTime) {
+ if (mom.__doChange) {
+ if (+mom > 962409600000) {
+ mom.utcOffset(-120, keepTime);
+ } else {
+ mom.utcOffset(-60, keepTime);
+ }
+ }
+ };
+
+ assert.equal(m.format('ZZ'), '+0000', 'should be at +0000');
+ assert.equal(m.format('HH:mm'), '00:00', 'should start 12AM at +0000 timezone');
+
+ m.__doChange = true;
+ m.add(1, 'h');
+
+ assert.equal(m.format('ZZ'), '-0200', 'should be at -0200');
+ assert.equal(m.format('HH:mm'), '23:00', '1AM at +0000 should be 11PM at -0200 timezone');
+
+ m.subtract(1, 'h');
+
+ assert.equal(m.format('ZZ'), '-0100', 'should be at -0100');
+ assert.equal(m.format('HH:mm'), '23:00', '12AM at +0000 should be 11PM at -0100 timezone');
+
+ moment.updateOffset = oldOffset;
+});
+
+//////////////////
+test('getters and setters', function (assert) {
+ var a = moment([2011, 5, 20]);
+
+ assert.equal(a.clone().utcOffset(-120).year(2012).year(), 2012, 'should get and set year correctly');
+ assert.equal(a.clone().utcOffset(-120).month(1).month(), 1, 'should get and set month correctly');
+ assert.equal(a.clone().utcOffset(-120).date(2).date(), 2, 'should get and set date correctly');
+ assert.equal(a.clone().utcOffset(-120).day(1).day(), 1, 'should get and set day correctly');
+ assert.equal(a.clone().utcOffset(-120).hour(1).hour(), 1, 'should get and set hour correctly');
+ assert.equal(a.clone().utcOffset(-120).minute(1).minute(), 1, 'should get and set minute correctly');
+});
+
+test('getters', function (assert) {
+ var a = moment.utc([2012, 0, 1, 0, 0, 0]);
+
+ assert.equal(a.clone().utcOffset(-120).year(), 2011, 'should get year correctly');
+ assert.equal(a.clone().utcOffset(-120).month(), 11, 'should get month correctly');
+ assert.equal(a.clone().utcOffset(-120).date(), 31, 'should get date correctly');
+ assert.equal(a.clone().utcOffset(-120).hour(), 22, 'should get hour correctly');
+ assert.equal(a.clone().utcOffset(-120).minute(), 0, 'should get minute correctly');
+
+ assert.equal(a.clone().utcOffset(120).year(), 2012, 'should get year correctly');
+ assert.equal(a.clone().utcOffset(120).month(), 0, 'should get month correctly');
+ assert.equal(a.clone().utcOffset(120).date(), 1, 'should get date correctly');
+ assert.equal(a.clone().utcOffset(120).hour(), 2, 'should get hour correctly');
+ assert.equal(a.clone().utcOffset(120).minute(), 0, 'should get minute correctly');
+
+ assert.equal(a.clone().utcOffset(90).year(), 2012, 'should get year correctly');
+ assert.equal(a.clone().utcOffset(90).month(), 0, 'should get month correctly');
+ assert.equal(a.clone().utcOffset(90).date(), 1, 'should get date correctly');
+ assert.equal(a.clone().utcOffset(90).hour(), 1, 'should get hour correctly');
+ assert.equal(a.clone().utcOffset(90).minute(), 30, 'should get minute correctly');
+});
+
+test('from', function (assert) {
+ var zoneA = moment(),
+ zoneB = moment(zoneA).utcOffset(-720),
+ zoneC = moment(zoneA).utcOffset(-360),
+ zoneD = moment(zoneA).utcOffset(690),
+ other = moment(zoneA).add(35, 'm');
+
+ assert.equal(zoneA.from(other), zoneB.from(other), 'moment#from should be the same in all zones');
+ assert.equal(zoneA.from(other), zoneC.from(other), 'moment#from should be the same in all zones');
+ assert.equal(zoneA.from(other), zoneD.from(other), 'moment#from should be the same in all zones');
+});
+
+test('diff', function (assert) {
+ var zoneA = moment(),
+ zoneB = moment(zoneA).utcOffset(-720),
+ zoneC = moment(zoneA).utcOffset(-360),
+ zoneD = moment(zoneA).utcOffset(690),
+ other = moment(zoneA).add(35, 'm');
+
+ assert.equal(zoneA.diff(other), zoneB.diff(other), 'moment#diff should be the same in all zones');
+ assert.equal(zoneA.diff(other), zoneC.diff(other), 'moment#diff should be the same in all zones');
+ assert.equal(zoneA.diff(other), zoneD.diff(other), 'moment#diff should be the same in all zones');
+
+ assert.equal(zoneA.diff(other, 'minute', true), zoneB.diff(other, 'minute', true), 'moment#diff should be the same in all zones');
+ assert.equal(zoneA.diff(other, 'minute', true), zoneC.diff(other, 'minute', true), 'moment#diff should be the same in all zones');
+ assert.equal(zoneA.diff(other, 'minute', true), zoneD.diff(other, 'minute', true), 'moment#diff should be the same in all zones');
+
+ assert.equal(zoneA.diff(other, 'hour', true), zoneB.diff(other, 'hour', true), 'moment#diff should be the same in all zones');
+ assert.equal(zoneA.diff(other, 'hour', true), zoneC.diff(other, 'hour', true), 'moment#diff should be the same in all zones');
+ assert.equal(zoneA.diff(other, 'hour', true), zoneD.diff(other, 'hour', true), 'moment#diff should be the same in all zones');
+});
+
+test('unix offset and timestamp', function (assert) {
+ var zoneA = moment(),
+ zoneB = moment(zoneA).utcOffset(-720),
+ zoneC = moment(zoneA).utcOffset(-360),
+ zoneD = moment(zoneA).utcOffset(690);
+
+ assert.equal(zoneA.unix(), zoneB.unix(), 'moment#unix should be the same in all zones');
+ assert.equal(zoneA.unix(), zoneC.unix(), 'moment#unix should be the same in all zones');
+ assert.equal(zoneA.unix(), zoneD.unix(), 'moment#unix should be the same in all zones');
+
+ assert.equal(+zoneA, +zoneB, 'moment#valueOf should be the same in all zones');
+ assert.equal(+zoneA, +zoneC, 'moment#valueOf should be the same in all zones');
+ assert.equal(+zoneA, +zoneD, 'moment#valueOf should be the same in all zones');
+});
+
+test('cloning', function (assert) {
+ assert.equal(moment().utcOffset(-120).clone().utcOffset(), -120,
+ 'explicit cloning should retain the offset');
+ assert.equal(moment().utcOffset(120).clone().utcOffset(), 120,
+ 'explicit cloning should retain the offset');
+ assert.equal(moment(moment().utcOffset(-120)).utcOffset(), -120,
+ 'implicit cloning should retain the offset');
+ assert.equal(moment(moment().utcOffset(120)).utcOffset(), 120,
+ 'implicit cloning should retain the offset');
+});
+
+test('start of / end of', function (assert) {
+ var a = moment.utc([2010, 1, 2, 0, 0, 0]).utcOffset(-450);
+
+ assert.equal(a.clone().startOf('day').hour(), 0,
+ 'start of day should work on moments with utc offset');
+ assert.equal(a.clone().startOf('day').minute(), 0,
+ 'start of day should work on moments with utc offset');
+ assert.equal(a.clone().startOf('hour').minute(), 0,
+ 'start of hour should work on moments with utc offset');
+
+ assert.equal(a.clone().endOf('day').hour(), 23,
+ 'end of day should work on moments with utc offset');
+ assert.equal(a.clone().endOf('day').minute(), 59,
+ 'end of day should work on moments with utc offset');
+ assert.equal(a.clone().endOf('hour').minute(), 59,
+ 'end of hour should work on moments with utc offset');
+});
+
+test('reset offset with moment#utc', function (assert) {
+ var a = moment.utc([2012]).utcOffset(-480);
+
+ assert.equal(a.clone().hour(), 16, 'different utc offset should have different hour');
+ assert.equal(a.clone().utc().hour(), 0, 'calling moment#utc should reset the offset');
+});
+
+test('reset offset with moment#local', function (assert) {
+ var a = moment([2012]).utcOffset(-480);
+
+ assert.equal(a.clone().local().hour(), 0, 'calling moment#local should reset the offset');
+});
+
+test('toDate', function (assert) {
+ var zoneA = new Date(),
+ zoneB = moment(zoneA).utcOffset(-720).toDate(),
+ zoneC = moment(zoneA).utcOffset(-360).toDate(),
+ zoneD = moment(zoneA).utcOffset(690).toDate();
+
+ assert.equal(+zoneA, +zoneB, 'moment#toDate should output a date with the right unix timestamp');
+ assert.equal(+zoneA, +zoneC, 'moment#toDate should output a date with the right unix timestamp');
+ assert.equal(+zoneA, +zoneD, 'moment#toDate should output a date with the right unix timestamp');
+});
+
+test('same / before / after', function (assert) {
+ var zoneA = moment().utc(),
+ zoneB = moment(zoneA).utcOffset(-120),
+ zoneC = moment(zoneA).utcOffset(120);
+
+ assert.ok(zoneA.isSame(zoneB), 'two moments with different offsets should be the same');
+ assert.ok(zoneA.isSame(zoneC), 'two moments with different offsets should be the same');
+
+ assert.ok(zoneA.isSame(zoneB, 'hour'), 'two moments with different offsets should be the same hour');
+ assert.ok(zoneA.isSame(zoneC, 'hour'), 'two moments with different offsets should be the same hour');
+
+ zoneA.add(1, 'hour');
+
+ assert.ok(zoneA.isAfter(zoneB), 'isAfter should work with two moments with different offsets');
+ assert.ok(zoneA.isAfter(zoneC), 'isAfter should work with two moments with different offsets');
+
+ assert.ok(zoneA.isAfter(zoneB, 'hour'), 'isAfter:hour should work with two moments with different offsets');
+ assert.ok(zoneA.isAfter(zoneC, 'hour'), 'isAfter:hour should work with two moments with different offsets');
+
+ zoneA.subtract(2, 'hour');
+
+ assert.ok(zoneA.isBefore(zoneB), 'isBefore should work with two moments with different offsets');
+ assert.ok(zoneA.isBefore(zoneC), 'isBefore should work with two moments with different offsets');
+
+ assert.ok(zoneA.isBefore(zoneB, 'hour'), 'isBefore:hour should work with two moments with different offsets');
+ assert.ok(zoneA.isBefore(zoneC, 'hour'), 'isBefore:hour should work with two moments with different offsets');
+});
+
+test('add / subtract over dst', function (assert) {
+ var oldOffset = moment.updateOffset,
+ m = moment.utc([2000, 2, 31, 3]);
+
+ moment.updateOffset = function (mom, keepTime) {
+ if (mom.clone().utc().month() > 2) {
+ mom.utcOffset(60, keepTime);
+ } else {
+ mom.utcOffset(0, keepTime);
+ }
+ };
+
+ assert.equal(m.hour(), 3, 'should start at 00:00');
+
+ m.add(24, 'hour');
+
+ assert.equal(m.hour(), 4, 'adding 24 hours should disregard dst');
+
+ m.subtract(24, 'hour');
+
+ assert.equal(m.hour(), 3, 'subtracting 24 hours should disregard dst');
+
+ m.add(1, 'day');
+
+ assert.equal(m.hour(), 3, 'adding 1 day should have the same hour');
+
+ m.subtract(1, 'day');
+
+ assert.equal(m.hour(), 3, 'subtracting 1 day should have the same hour');
+
+ m.add(1, 'month');
+
+ assert.equal(m.hour(), 3, 'adding 1 month should have the same hour');
+
+ m.subtract(1, 'month');
+
+ assert.equal(m.hour(), 3, 'subtracting 1 month should have the same hour');
+
+ moment.updateOffset = oldOffset;
+});
+
+test('isDST', function (assert) {
+ var oldOffset = moment.updateOffset;
+
+ moment.updateOffset = function (mom, keepTime) {
+ if (mom.month() > 2 && mom.month() < 9) {
+ mom.utcOffset(60, keepTime);
+ } else {
+ mom.utcOffset(0, keepTime);
+ }
+ };
+
+ assert.ok(!moment().month(0).isDST(), 'Jan should not be summer dst');
+ assert.ok(moment().month(6).isDST(), 'Jul should be summer dst');
+ assert.ok(!moment().month(11).isDST(), 'Dec should not be summer dst');
+
+ moment.updateOffset = function (mom) {
+ if (mom.month() > 2 && mom.month() < 9) {
+ mom.utcOffset(0);
+ } else {
+ mom.utcOffset(60);
+ }
+ };
+
+ assert.ok(moment().month(0).isDST(), 'Jan should be winter dst');
+ assert.ok(!moment().month(6).isDST(), 'Jul should not be winter dst');
+ assert.ok(moment().month(11).isDST(), 'Dec should be winter dst');
+
+ moment.updateOffset = oldOffset;
+});
+
+test('zone names', function (assert) {
+ assert.equal(moment().zoneAbbr(), '', 'Local zone abbr should be empty');
+ assert.equal(moment().format('z'), '', 'Local zone formatted abbr should be empty');
+ assert.equal(moment().zoneName(), '', 'Local zone name should be empty');
+ assert.equal(moment().format('zz'), '', 'Local zone formatted name should be empty');
+
+ assert.equal(moment.utc().zoneAbbr(), 'UTC', 'UTC zone abbr should be UTC');
+ assert.equal(moment.utc().format('z'), 'UTC', 'UTC zone formatted abbr should be UTC');
+ assert.equal(moment.utc().zoneName(), 'Coordinated Universal Time', 'UTC zone abbr should be Coordinated Universal Time');
+ assert.equal(moment.utc().format('zz'), 'Coordinated Universal Time', 'UTC zone formatted abbr should be Coordinated Universal Time');
+});
+
+test('hours alignment with UTC', function (assert) {
+ assert.equal(moment().utcOffset(-120).hasAlignedHourOffset(), true);
+ assert.equal(moment().utcOffset(180).hasAlignedHourOffset(), true);
+ assert.equal(moment().utcOffset(-90).hasAlignedHourOffset(), false);
+ assert.equal(moment().utcOffset(90).hasAlignedHourOffset(), false);
+});
+
+test('hours alignment with other zone', function (assert) {
+ var m = moment().utcOffset(-120);
+
+ assert.equal(m.hasAlignedHourOffset(moment().utcOffset(-180)), true);
+ assert.equal(m.hasAlignedHourOffset(moment().utcOffset(180)), true);
+ assert.equal(m.hasAlignedHourOffset(moment().utcOffset(-90)), false);
+ assert.equal(m.hasAlignedHourOffset(moment().utcOffset(90)), false);
+
+ m = moment().utcOffset(-90);
+
+ assert.equal(m.hasAlignedHourOffset(moment().utcOffset(-180)), false);
+ assert.equal(m.hasAlignedHourOffset(moment().utcOffset(180)), false);
+ assert.equal(m.hasAlignedHourOffset(moment().utcOffset(-30)), true);
+ assert.equal(m.hasAlignedHourOffset(moment().utcOffset(30)), true);
+
+ m = moment().utcOffset(60);
+
+ assert.equal(m.hasAlignedHourOffset(moment().utcOffset(-180)), true);
+ assert.equal(m.hasAlignedHourOffset(moment().utcOffset(180)), true);
+ assert.equal(m.hasAlignedHourOffset(moment().utcOffset(-90)), false);
+ assert.equal(m.hasAlignedHourOffset(moment().utcOffset(90)), false);
+
+ m = moment().utcOffset(-25);
+
+ assert.equal(m.hasAlignedHourOffset(moment().utcOffset(35)), true);
+ assert.equal(m.hasAlignedHourOffset(moment().utcOffset(-85)), true);
+
+ assert.equal(m.hasAlignedHourOffset(moment().utcOffset(-35)), false);
+ assert.equal(m.hasAlignedHourOffset(moment().utcOffset(85)), false);
+});
+
+test('parse zone', function (assert) {
+ var m = moment('2013-01-01T00:00:00-13:00').parseZone();
+ assert.equal(m.utcOffset(), -13 * 60);
+ assert.equal(m.hours(), 0);
+});
+
+test('parse UTC zone', function (assert) {
+ var m = moment('2013-01-01T05:00:00+00:00').parseZone();
+ assert.equal(m.utcOffset(), 0);
+ assert.equal(m.hours(), 5);
+});
+
+test('parse zone static', function (assert) {
+ var m = moment.parseZone('2013-01-01T00:00:00-13:00');
+ assert.equal(m.utcOffset(), -13 * 60);
+ assert.equal(m.hours(), 0);
+});
+
+test('parse zone with more arguments', function (assert) {
+ var m;
+ m = moment.parseZone('2013 01 01 05 -13:00', 'YYYY MM DD HH ZZ');
+ assert.equal(m.format(), '2013-01-01T05:00:00-13:00', 'accept input and format');
+ m = moment.parseZone('2013-01-01-13:00', 'YYYY MM DD ZZ', true);
+ assert.equal(m.isValid(), false, 'accept input, format and strict flag');
+ m = moment.parseZone('2013-01-01-13:00', ['DD MM YYYY ZZ', 'YYYY MM DD ZZ']);
+ assert.equal(m.format(), '2013-01-01T00:00:00-13:00', 'accept input and array of formats');
+});
+
+test('parse zone with a timezone from the format string', function (assert) {
+ var m = moment('11-12-2013 -0400 +1100', 'DD-MM-YYYY ZZ #####').parseZone();
+
+ assert.equal(m.utcOffset(), -4 * 60);
+});
+
+test('parse zone without a timezone included in the format string', function (assert) {
+ var m = moment('11-12-2013 -0400 +1100', 'DD-MM-YYYY').parseZone();
+
+ assert.equal(m.utcOffset(), 11 * 60);
+});
+
+test('timezone format', function (assert) {
+ assert.equal(moment().utcOffset(60).format('ZZ'), '+0100', '-60 -> +0100');
+ assert.equal(moment().utcOffset(90).format('ZZ'), '+0130', '-90 -> +0130');
+ assert.equal(moment().utcOffset(120).format('ZZ'), '+0200', '-120 -> +0200');
+
+ assert.equal(moment().utcOffset(-60).format('ZZ'), '-0100', '+60 -> -0100');
+ assert.equal(moment().utcOffset(-90).format('ZZ'), '-0130', '+90 -> -0130');
+ assert.equal(moment().utcOffset(-120).format('ZZ'), '-0200', '+120 -> -0200');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('week year');
+
+test('iso week year', function (assert) {
+ // Some examples taken from http://en.wikipedia.org/wiki/ISO_week
+ assert.equal(moment([2005, 0, 1]).isoWeekYear(), 2004);
+ assert.equal(moment([2005, 0, 2]).isoWeekYear(), 2004);
+ assert.equal(moment([2005, 0, 3]).isoWeekYear(), 2005);
+ assert.equal(moment([2005, 11, 31]).isoWeekYear(), 2005);
+ assert.equal(moment([2006, 0, 1]).isoWeekYear(), 2005);
+ assert.equal(moment([2006, 0, 2]).isoWeekYear(), 2006);
+ assert.equal(moment([2007, 0, 1]).isoWeekYear(), 2007);
+ assert.equal(moment([2007, 11, 30]).isoWeekYear(), 2007);
+ assert.equal(moment([2007, 11, 31]).isoWeekYear(), 2008);
+ assert.equal(moment([2008, 0, 1]).isoWeekYear(), 2008);
+ assert.equal(moment([2008, 11, 28]).isoWeekYear(), 2008);
+ assert.equal(moment([2008, 11, 29]).isoWeekYear(), 2009);
+ assert.equal(moment([2008, 11, 30]).isoWeekYear(), 2009);
+ assert.equal(moment([2008, 11, 31]).isoWeekYear(), 2009);
+ assert.equal(moment([2009, 0, 1]).isoWeekYear(), 2009);
+ assert.equal(moment([2010, 0, 1]).isoWeekYear(), 2009);
+ assert.equal(moment([2010, 0, 2]).isoWeekYear(), 2009);
+ assert.equal(moment([2010, 0, 3]).isoWeekYear(), 2009);
+ assert.equal(moment([2010, 0, 4]).isoWeekYear(), 2010);
+});
+
+test('week year', function (assert) {
+ // Some examples taken from http://en.wikipedia.org/wiki/ISO_week
+ moment.locale('dow: 1,doy: 4', {week: {dow: 1, doy: 4}}); // like iso
+ assert.equal(moment([2005, 0, 1]).weekYear(), 2004);
+ assert.equal(moment([2005, 0, 2]).weekYear(), 2004);
+ assert.equal(moment([2005, 0, 3]).weekYear(), 2005);
+ assert.equal(moment([2005, 11, 31]).weekYear(), 2005);
+ assert.equal(moment([2006, 0, 1]).weekYear(), 2005);
+ assert.equal(moment([2006, 0, 2]).weekYear(), 2006);
+ assert.equal(moment([2007, 0, 1]).weekYear(), 2007);
+ assert.equal(moment([2007, 11, 30]).weekYear(), 2007);
+ assert.equal(moment([2007, 11, 31]).weekYear(), 2008);
+ assert.equal(moment([2008, 0, 1]).weekYear(), 2008);
+ assert.equal(moment([2008, 11, 28]).weekYear(), 2008);
+ assert.equal(moment([2008, 11, 29]).weekYear(), 2009);
+ assert.equal(moment([2008, 11, 30]).weekYear(), 2009);
+ assert.equal(moment([2008, 11, 31]).weekYear(), 2009);
+ assert.equal(moment([2009, 0, 1]).weekYear(), 2009);
+ assert.equal(moment([2010, 0, 1]).weekYear(), 2009);
+ assert.equal(moment([2010, 0, 2]).weekYear(), 2009);
+ assert.equal(moment([2010, 0, 3]).weekYear(), 2009);
+ assert.equal(moment([2010, 0, 4]).weekYear(), 2010);
+
+ moment.locale('dow: 1,doy: 7', {week: {dow: 1, doy: 7}});
+ assert.equal(moment([2004, 11, 26]).weekYear(), 2004);
+ assert.equal(moment([2004, 11, 27]).weekYear(), 2005);
+ assert.equal(moment([2005, 11, 25]).weekYear(), 2005);
+ assert.equal(moment([2005, 11, 26]).weekYear(), 2006);
+ assert.equal(moment([2006, 11, 31]).weekYear(), 2006);
+ assert.equal(moment([2007, 0, 1]).weekYear(), 2007);
+ assert.equal(moment([2007, 11, 30]).weekYear(), 2007);
+ assert.equal(moment([2007, 11, 31]).weekYear(), 2008);
+ assert.equal(moment([2008, 11, 28]).weekYear(), 2008);
+ assert.equal(moment([2008, 11, 29]).weekYear(), 2009);
+ assert.equal(moment([2009, 11, 27]).weekYear(), 2009);
+ assert.equal(moment([2009, 11, 28]).weekYear(), 2010);
+});
+
+// Verifies that the week number, week day computation is correct for all dow, doy combinations
+test('week year roundtrip', function (assert) {
+ var dow, doy, wd, m, localeName;
+ for (dow = 0; dow < 7; ++dow) {
+ for (doy = dow; doy < dow + 7; ++doy) {
+ for (wd = 0; wd < 7; ++wd) {
+ localeName = 'dow: ' + dow + ', doy: ' + doy;
+ moment.locale(localeName, {week: {dow: dow, doy: doy}});
+ // We use the 10th week as the 1st one can spill to the previous year
+ m = moment('2015 10 ' + wd, 'gggg w d', true);
+ assert.equal(m.format('gggg w d'), '2015 10 ' + wd, 'dow: ' + dow + ' doy: ' + doy + ' wd: ' + wd);
+ m = moment('2015 10 ' + wd, 'gggg w e', true);
+ assert.equal(m.format('gggg w e'), '2015 10 ' + wd, 'dow: ' + dow + ' doy: ' + doy + ' wd: ' + wd);
+ moment.defineLocale(localeName, null);
+ }
+ }
+ }
+});
+
+test('week numbers 2012/2013', function (assert) {
+ moment.locale('dow: 6, doy: 12', {week: {dow: 6, doy: 12}});
+ assert.equal(52, moment('2012-12-28', 'YYYY-MM-DD').week(), '2012-12-28 is week 52'); // 51 -- should be 52?
+ assert.equal(1, moment('2012-12-29', 'YYYY-MM-DD').week(), '2012-12-29 is week 1'); // 52 -- should be 1
+ assert.equal(1, moment('2013-01-01', 'YYYY-MM-DD').week(), '2013-01-01 is week 1'); // 52 -- should be 1
+ assert.equal(2, moment('2013-01-08', 'YYYY-MM-DD').week(), '2013-01-08 is week 2'); // 53 -- should be 2
+ assert.equal(2, moment('2013-01-11', 'YYYY-MM-DD').week(), '2013-01-11 is week 2'); // 53 -- should be 2
+ assert.equal(3, moment('2013-01-12', 'YYYY-MM-DD').week(), '2013-01-12 is week 3'); // 1 -- should be 3
+ assert.equal(52, moment('2012-01-01', 'YYYY-MM-DD').weeksInYear(), 'weeks in 2012 are 52'); // 52
+ moment.defineLocale('dow: 6, doy: 12', null);
+});
+
+test('weeks numbers dow:1 doy:4', function (assert) {
+ moment.locale('dow: 1, doy: 4', {week: {dow: 1, doy: 4}});
+ assert.equal(moment([2012, 0, 1]).week(), 52, 'Jan 1 2012 should be week 52');
+ assert.equal(moment([2012, 0, 2]).week(), 1, 'Jan 2 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).week(), 1, 'Jan 8 2012 should be week 1');
+ assert.equal(moment([2012, 0, 9]).week(), 2, 'Jan 9 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).week(), 2, 'Jan 15 2012 should be week 2');
+ assert.equal(moment([2007, 0, 1]).week(), 1, 'Jan 1 2007 should be week 1');
+ assert.equal(moment([2007, 0, 7]).week(), 1, 'Jan 7 2007 should be week 1');
+ assert.equal(moment([2007, 0, 8]).week(), 2, 'Jan 8 2007 should be week 2');
+ assert.equal(moment([2007, 0, 14]).week(), 2, 'Jan 14 2007 should be week 2');
+ assert.equal(moment([2007, 0, 15]).week(), 3, 'Jan 15 2007 should be week 3');
+ assert.equal(moment([2007, 11, 31]).week(), 1, 'Dec 31 2007 should be week 1');
+ assert.equal(moment([2008, 0, 1]).week(), 1, 'Jan 1 2008 should be week 1');
+ assert.equal(moment([2008, 0, 6]).week(), 1, 'Jan 6 2008 should be week 1');
+ assert.equal(moment([2008, 0, 7]).week(), 2, 'Jan 7 2008 should be week 2');
+ assert.equal(moment([2008, 0, 13]).week(), 2, 'Jan 13 2008 should be week 2');
+ assert.equal(moment([2008, 0, 14]).week(), 3, 'Jan 14 2008 should be week 3');
+ assert.equal(moment([2002, 11, 30]).week(), 1, 'Dec 30 2002 should be week 1');
+ assert.equal(moment([2003, 0, 1]).week(), 1, 'Jan 1 2003 should be week 1');
+ assert.equal(moment([2003, 0, 5]).week(), 1, 'Jan 5 2003 should be week 1');
+ assert.equal(moment([2003, 0, 6]).week(), 2, 'Jan 6 2003 should be week 2');
+ assert.equal(moment([2003, 0, 12]).week(), 2, 'Jan 12 2003 should be week 2');
+ assert.equal(moment([2003, 0, 13]).week(), 3, 'Jan 13 2003 should be week 3');
+ assert.equal(moment([2008, 11, 29]).week(), 1, 'Dec 29 2008 should be week 1');
+ assert.equal(moment([2009, 0, 1]).week(), 1, 'Jan 1 2009 should be week 1');
+ assert.equal(moment([2009, 0, 4]).week(), 1, 'Jan 4 2009 should be week 1');
+ assert.equal(moment([2009, 0, 5]).week(), 2, 'Jan 5 2009 should be week 2');
+ assert.equal(moment([2009, 0, 11]).week(), 2, 'Jan 11 2009 should be week 2');
+ assert.equal(moment([2009, 0, 13]).week(), 3, 'Jan 12 2009 should be week 3');
+ assert.equal(moment([2009, 11, 28]).week(), 53, 'Dec 28 2009 should be week 53');
+ assert.equal(moment([2010, 0, 1]).week(), 53, 'Jan 1 2010 should be week 53');
+ assert.equal(moment([2010, 0, 3]).week(), 53, 'Jan 3 2010 should be week 53');
+ assert.equal(moment([2010, 0, 4]).week(), 1, 'Jan 4 2010 should be week 1');
+ assert.equal(moment([2010, 0, 10]).week(), 1, 'Jan 10 2010 should be week 1');
+ assert.equal(moment([2010, 0, 11]).week(), 2, 'Jan 11 2010 should be week 2');
+ assert.equal(moment([2010, 11, 27]).week(), 52, 'Dec 27 2010 should be week 52');
+ assert.equal(moment([2011, 0, 1]).week(), 52, 'Jan 1 2011 should be week 52');
+ assert.equal(moment([2011, 0, 2]).week(), 52, 'Jan 2 2011 should be week 52');
+ assert.equal(moment([2011, 0, 3]).week(), 1, 'Jan 3 2011 should be week 1');
+ assert.equal(moment([2011, 0, 9]).week(), 1, 'Jan 9 2011 should be week 1');
+ assert.equal(moment([2011, 0, 10]).week(), 2, 'Jan 10 2011 should be week 2');
+ moment.defineLocale('dow: 1, doy: 4', null);
+});
+
+test('weeks numbers dow:6 doy:12', function (assert) {
+ moment.locale('dow: 6, doy: 12', {week: {dow: 6, doy: 12}});
+ assert.equal(moment([2011, 11, 31]).week(), 1, 'Dec 31 2011 should be week 1');
+ assert.equal(moment([2012, 0, 6]).week(), 1, 'Jan 6 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).week(), 2, 'Jan 7 2012 should be week 2');
+ assert.equal(moment([2012, 0, 13]).week(), 2, 'Jan 13 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).week(), 3, 'Jan 14 2012 should be week 3');
+ assert.equal(moment([2006, 11, 30]).week(), 1, 'Dec 30 2006 should be week 1');
+ assert.equal(moment([2007, 0, 5]).week(), 1, 'Jan 5 2007 should be week 1');
+ assert.equal(moment([2007, 0, 6]).week(), 2, 'Jan 6 2007 should be week 2');
+ assert.equal(moment([2007, 0, 12]).week(), 2, 'Jan 12 2007 should be week 2');
+ assert.equal(moment([2007, 0, 13]).week(), 3, 'Jan 13 2007 should be week 3');
+ assert.equal(moment([2007, 11, 29]).week(), 1, 'Dec 29 2007 should be week 1');
+ assert.equal(moment([2008, 0, 1]).week(), 1, 'Jan 1 2008 should be week 1');
+ assert.equal(moment([2008, 0, 4]).week(), 1, 'Jan 4 2008 should be week 1');
+ assert.equal(moment([2008, 0, 5]).week(), 2, 'Jan 5 2008 should be week 2');
+ assert.equal(moment([2008, 0, 11]).week(), 2, 'Jan 11 2008 should be week 2');
+ assert.equal(moment([2008, 0, 12]).week(), 3, 'Jan 12 2008 should be week 3');
+ assert.equal(moment([2002, 11, 28]).week(), 1, 'Dec 28 2002 should be week 1');
+ assert.equal(moment([2003, 0, 1]).week(), 1, 'Jan 1 2003 should be week 1');
+ assert.equal(moment([2003, 0, 3]).week(), 1, 'Jan 3 2003 should be week 1');
+ assert.equal(moment([2003, 0, 4]).week(), 2, 'Jan 4 2003 should be week 2');
+ assert.equal(moment([2003, 0, 10]).week(), 2, 'Jan 10 2003 should be week 2');
+ assert.equal(moment([2003, 0, 11]).week(), 3, 'Jan 11 2003 should be week 3');
+ assert.equal(moment([2008, 11, 27]).week(), 1, 'Dec 27 2008 should be week 1');
+ assert.equal(moment([2009, 0, 1]).week(), 1, 'Jan 1 2009 should be week 1');
+ assert.equal(moment([2009, 0, 2]).week(), 1, 'Jan 2 2009 should be week 1');
+ assert.equal(moment([2009, 0, 3]).week(), 2, 'Jan 3 2009 should be week 2');
+ assert.equal(moment([2009, 0, 9]).week(), 2, 'Jan 9 2009 should be week 2');
+ assert.equal(moment([2009, 0, 10]).week(), 3, 'Jan 10 2009 should be week 3');
+ assert.equal(moment([2009, 11, 26]).week(), 1, 'Dec 26 2009 should be week 1');
+ assert.equal(moment([2010, 0, 1]).week(), 1, 'Jan 1 2010 should be week 1');
+ assert.equal(moment([2010, 0, 2]).week(), 2, 'Jan 2 2010 should be week 2');
+ assert.equal(moment([2010, 0, 8]).week(), 2, 'Jan 8 2010 should be week 2');
+ assert.equal(moment([2010, 0, 9]).week(), 3, 'Jan 9 2010 should be week 3');
+ assert.equal(moment([2011, 0, 1]).week(), 1, 'Jan 1 2011 should be week 1');
+ assert.equal(moment([2011, 0, 7]).week(), 1, 'Jan 7 2011 should be week 1');
+ assert.equal(moment([2011, 0, 8]).week(), 2, 'Jan 8 2011 should be week 2');
+ assert.equal(moment([2011, 0, 14]).week(), 2, 'Jan 14 2011 should be week 2');
+ assert.equal(moment([2011, 0, 15]).week(), 3, 'Jan 15 2011 should be week 3');
+ moment.defineLocale('dow: 6, doy: 12', null);
+});
+
+test('weeks numbers dow:1 doy:7', function (assert) {
+ moment.locale('dow: 1, doy: 7', {week: {dow: 1, doy: 7}});
+ assert.equal(moment([2011, 11, 26]).week(), 1, 'Dec 26 2011 should be week 1');
+ assert.equal(moment([2012, 0, 1]).week(), 1, 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 2]).week(), 2, 'Jan 2 2012 should be week 2');
+ assert.equal(moment([2012, 0, 8]).week(), 2, 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 9]).week(), 3, 'Jan 9 2012 should be week 3');
+ assert.equal(moment([2007, 0, 1]).week(), 1, 'Jan 1 2007 should be week 1');
+ assert.equal(moment([2007, 0, 7]).week(), 1, 'Jan 7 2007 should be week 1');
+ assert.equal(moment([2007, 0, 8]).week(), 2, 'Jan 8 2007 should be week 2');
+ assert.equal(moment([2007, 0, 14]).week(), 2, 'Jan 14 2007 should be week 2');
+ assert.equal(moment([2007, 0, 15]).week(), 3, 'Jan 15 2007 should be week 3');
+ assert.equal(moment([2007, 11, 31]).week(), 1, 'Dec 31 2007 should be week 1');
+ assert.equal(moment([2008, 0, 1]).week(), 1, 'Jan 1 2008 should be week 1');
+ assert.equal(moment([2008, 0, 6]).week(), 1, 'Jan 6 2008 should be week 1');
+ assert.equal(moment([2008, 0, 7]).week(), 2, 'Jan 7 2008 should be week 2');
+ assert.equal(moment([2008, 0, 13]).week(), 2, 'Jan 13 2008 should be week 2');
+ assert.equal(moment([2008, 0, 14]).week(), 3, 'Jan 14 2008 should be week 3');
+ assert.equal(moment([2002, 11, 30]).week(), 1, 'Dec 30 2002 should be week 1');
+ assert.equal(moment([2003, 0, 1]).week(), 1, 'Jan 1 2003 should be week 1');
+ assert.equal(moment([2003, 0, 5]).week(), 1, 'Jan 5 2003 should be week 1');
+ assert.equal(moment([2003, 0, 6]).week(), 2, 'Jan 6 2003 should be week 2');
+ assert.equal(moment([2003, 0, 12]).week(), 2, 'Jan 12 2003 should be week 2');
+ assert.equal(moment([2003, 0, 13]).week(), 3, 'Jan 13 2003 should be week 3');
+ assert.equal(moment([2008, 11, 29]).week(), 1, 'Dec 29 2008 should be week 1');
+ assert.equal(moment([2009, 0, 1]).week(), 1, 'Jan 1 2009 should be week 1');
+ assert.equal(moment([2009, 0, 4]).week(), 1, 'Jan 4 2009 should be week 1');
+ assert.equal(moment([2009, 0, 5]).week(), 2, 'Jan 5 2009 should be week 2');
+ assert.equal(moment([2009, 0, 11]).week(), 2, 'Jan 11 2009 should be week 2');
+ assert.equal(moment([2009, 0, 12]).week(), 3, 'Jan 12 2009 should be week 3');
+ assert.equal(moment([2009, 11, 28]).week(), 1, 'Dec 28 2009 should be week 1');
+ assert.equal(moment([2010, 0, 1]).week(), 1, 'Jan 1 2010 should be week 1');
+ assert.equal(moment([2010, 0, 3]).week(), 1, 'Jan 3 2010 should be week 1');
+ assert.equal(moment([2010, 0, 4]).week(), 2, 'Jan 4 2010 should be week 2');
+ assert.equal(moment([2010, 0, 10]).week(), 2, 'Jan 10 2010 should be week 2');
+ assert.equal(moment([2010, 0, 11]).week(), 3, 'Jan 11 2010 should be week 3');
+ assert.equal(moment([2010, 11, 27]).week(), 1, 'Dec 27 2010 should be week 1');
+ assert.equal(moment([2011, 0, 1]).week(), 1, 'Jan 1 2011 should be week 1');
+ assert.equal(moment([2011, 0, 2]).week(), 1, 'Jan 2 2011 should be week 1');
+ assert.equal(moment([2011, 0, 3]).week(), 2, 'Jan 3 2011 should be week 2');
+ assert.equal(moment([2011, 0, 9]).week(), 2, 'Jan 9 2011 should be week 2');
+ assert.equal(moment([2011, 0, 10]).week(), 3, 'Jan 10 2011 should be week 3');
+ moment.defineLocale('dow: 1, doy: 7', null);
+});
+
+test('weeks numbers dow:0 doy:6', function (assert) {
+ moment.locale('dow: 0, doy: 6', {week: {dow: 0, doy: 6}});
+ assert.equal(moment([2012, 0, 1]).week(), 1, 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).week(), 1, 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).week(), 2, 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).week(), 2, 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).week(), 3, 'Jan 15 2012 should be week 3');
+ assert.equal(moment([2006, 11, 31]).week(), 1, 'Dec 31 2006 should be week 1');
+ assert.equal(moment([2007, 0, 1]).week(), 1, 'Jan 1 2007 should be week 1');
+ assert.equal(moment([2007, 0, 6]).week(), 1, 'Jan 6 2007 should be week 1');
+ assert.equal(moment([2007, 0, 7]).week(), 2, 'Jan 7 2007 should be week 2');
+ assert.equal(moment([2007, 0, 13]).week(), 2, 'Jan 13 2007 should be week 2');
+ assert.equal(moment([2007, 0, 14]).week(), 3, 'Jan 14 2007 should be week 3');
+ assert.equal(moment([2007, 11, 29]).week(), 52, 'Dec 29 2007 should be week 52');
+ assert.equal(moment([2008, 0, 1]).week(), 1, 'Jan 1 2008 should be week 1');
+ assert.equal(moment([2008, 0, 5]).week(), 1, 'Jan 5 2008 should be week 1');
+ assert.equal(moment([2008, 0, 6]).week(), 2, 'Jan 6 2008 should be week 2');
+ assert.equal(moment([2008, 0, 12]).week(), 2, 'Jan 12 2008 should be week 2');
+ assert.equal(moment([2008, 0, 13]).week(), 3, 'Jan 13 2008 should be week 3');
+ assert.equal(moment([2002, 11, 29]).week(), 1, 'Dec 29 2002 should be week 1');
+ assert.equal(moment([2003, 0, 1]).week(), 1, 'Jan 1 2003 should be week 1');
+ assert.equal(moment([2003, 0, 4]).week(), 1, 'Jan 4 2003 should be week 1');
+ assert.equal(moment([2003, 0, 5]).week(), 2, 'Jan 5 2003 should be week 2');
+ assert.equal(moment([2003, 0, 11]).week(), 2, 'Jan 11 2003 should be week 2');
+ assert.equal(moment([2003, 0, 12]).week(), 3, 'Jan 12 2003 should be week 3');
+ assert.equal(moment([2008, 11, 28]).week(), 1, 'Dec 28 2008 should be week 1');
+ assert.equal(moment([2009, 0, 1]).week(), 1, 'Jan 1 2009 should be week 1');
+ assert.equal(moment([2009, 0, 3]).week(), 1, 'Jan 3 2009 should be week 1');
+ assert.equal(moment([2009, 0, 4]).week(), 2, 'Jan 4 2009 should be week 2');
+ assert.equal(moment([2009, 0, 10]).week(), 2, 'Jan 10 2009 should be week 2');
+ assert.equal(moment([2009, 0, 11]).week(), 3, 'Jan 11 2009 should be week 3');
+ assert.equal(moment([2009, 11, 27]).week(), 1, 'Dec 27 2009 should be week 1');
+ assert.equal(moment([2010, 0, 1]).week(), 1, 'Jan 1 2010 should be week 1');
+ assert.equal(moment([2010, 0, 2]).week(), 1, 'Jan 2 2010 should be week 1');
+ assert.equal(moment([2010, 0, 3]).week(), 2, 'Jan 3 2010 should be week 2');
+ assert.equal(moment([2010, 0, 9]).week(), 2, 'Jan 9 2010 should be week 2');
+ assert.equal(moment([2010, 0, 10]).week(), 3, 'Jan 10 2010 should be week 3');
+ assert.equal(moment([2010, 11, 26]).week(), 1, 'Dec 26 2010 should be week 1');
+ assert.equal(moment([2011, 0, 1]).week(), 1, 'Jan 1 2011 should be week 1');
+ assert.equal(moment([2011, 0, 2]).week(), 2, 'Jan 2 2011 should be week 2');
+ assert.equal(moment([2011, 0, 8]).week(), 2, 'Jan 8 2011 should be week 2');
+ assert.equal(moment([2011, 0, 9]).week(), 3, 'Jan 9 2011 should be week 3');
+ moment.defineLocale('dow: 0, doy: 6', null);
+});
+
+test('week year overflows', function (assert) {
+ assert.equal('2005-01-01', moment.utc('2004-W53-6', moment.ISO_8601, true).format('YYYY-MM-DD'), '2004-W53-6 is 1st Jan 2005');
+ assert.equal('2007-12-31', moment.utc('2008-W01-1', moment.ISO_8601, true).format('YYYY-MM-DD'), '2008-W01-1 is 31st Dec 2007');
+});
+
+test('weeks overflow', function (assert) {
+ assert.equal(7, moment.utc('2004-W54-1', moment.ISO_8601, true).parsingFlags().overflow, '2004 has only 53 weeks');
+ assert.equal(7, moment.utc('2004-W00-1', moment.ISO_8601, true).parsingFlags().overflow, 'there is no 0th week');
+});
+
+test('weekday overflow', function (assert) {
+ assert.equal(8, moment.utc('2004-W30-0', moment.ISO_8601, true).parsingFlags().overflow, 'there is no 0 iso weekday');
+ assert.equal(8, moment.utc('2004-W30-8', moment.ISO_8601, true).parsingFlags().overflow, 'there is no 8 iso weekday');
+ assert.equal(8, moment.utc('2004-w30-7', 'gggg-[w]ww-e', true).parsingFlags().overflow, 'there is no 7 \'e\' weekday');
+ assert.equal(8, moment.utc('2004-w30-7', 'gggg-[w]ww-d', true).parsingFlags().overflow, 'there is no 7 \'d\' weekday');
+});
+
+test('week year setter works', function (assert) {
+ for (var year = 2000; year <= 2020; year += 1) {
+ assert.equal(moment.utc('2012-12-31T00:00:00.000Z').isoWeekYear(year).isoWeekYear(), year, 'setting iso-week-year to ' + year);
+ assert.equal(moment.utc('2012-12-31T00:00:00.000Z').weekYear(year).weekYear(), year, 'setting week-year to ' + year);
+ }
+
+ assert.equal(moment.utc('2004-W53-1', moment.ISO_8601, true).isoWeekYear(2013).format('GGGG-[W]WW-E'), '2013-W52-1', '2004-W53-1 to 2013');
+ assert.equal(moment.utc('2004-W53-1', moment.ISO_8601, true).isoWeekYear(2020).format('GGGG-[W]WW-E'), '2020-W53-1', '2004-W53-1 to 2020');
+ assert.equal(moment.utc('2005-W52-1', moment.ISO_8601, true).isoWeekYear(2004).format('GGGG-[W]WW-E'), '2004-W52-1', '2005-W52-1 to 2004');
+ assert.equal(moment.utc('2013-W30-4', moment.ISO_8601, true).isoWeekYear(2015).format('GGGG-[W]WW-E'), '2015-W30-4', '2013-W30-4 to 2015');
+
+ assert.equal(moment.utc('2005-w53-0', 'gggg-[w]ww-e', true).weekYear(2013).format('gggg-[w]ww-e'), '2013-w52-0', '2005-w53-0 to 2013');
+ assert.equal(moment.utc('2005-w53-0', 'gggg-[w]ww-e', true).weekYear(2016).format('gggg-[w]ww-e'), '2016-w53-0', '2005-w53-0 to 2016');
+ assert.equal(moment.utc('2004-w52-0', 'gggg-[w]ww-e', true).weekYear(2005).format('gggg-[w]ww-e'), '2005-w52-0', '2004-w52-0 to 2005');
+ assert.equal(moment.utc('2013-w30-4', 'gggg-[w]ww-e', true).weekYear(2015).format('gggg-[w]ww-e'), '2015-w30-4', '2013-w30-4 to 2015');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('week day');
+
+test('iso weekday', function (assert) {
+ var i;
+
+ for (i = 0; i < 7; ++i) {
+ moment.locale('dow:' + i + ',doy: 6', {week: {dow: i, doy: 6}});
+ assert.equal(moment([1985, 1, 4]).isoWeekday(), 1, 'Feb 4 1985 is Monday -- 1st day');
+ assert.equal(moment([2029, 8, 18]).isoWeekday(), 2, 'Sep 18 2029 is Tuesday -- 2nd day');
+ assert.equal(moment([2013, 3, 24]).isoWeekday(), 3, 'Apr 24 2013 is Wednesday -- 3rd day');
+ assert.equal(moment([2015, 2, 5]).isoWeekday(), 4, 'Mar 5 2015 is Thursday -- 4th day');
+ assert.equal(moment([1970, 0, 2]).isoWeekday(), 5, 'Jan 2 1970 is Friday -- 5th day');
+ assert.equal(moment([2001, 4, 12]).isoWeekday(), 6, 'May 12 2001 is Saturday -- 6th day');
+ assert.equal(moment([2000, 0, 2]).isoWeekday(), 7, 'Jan 2 2000 is Sunday -- 7th day');
+ }
+});
+
+test('iso weekday setter', function (assert) {
+ var a = moment([2011, 0, 10]);
+ assert.equal(moment(a).isoWeekday(1).date(), 10, 'set from mon to mon');
+ assert.equal(moment(a).isoWeekday(4).date(), 13, 'set from mon to thu');
+ assert.equal(moment(a).isoWeekday(7).date(), 16, 'set from mon to sun');
+ assert.equal(moment(a).isoWeekday(-6).date(), 3, 'set from mon to last mon');
+ assert.equal(moment(a).isoWeekday(-3).date(), 6, 'set from mon to last thu');
+ assert.equal(moment(a).isoWeekday(0).date(), 9, 'set from mon to last sun');
+ assert.equal(moment(a).isoWeekday(8).date(), 17, 'set from mon to next mon');
+ assert.equal(moment(a).isoWeekday(11).date(), 20, 'set from mon to next thu');
+ assert.equal(moment(a).isoWeekday(14).date(), 23, 'set from mon to next sun');
+
+ a = moment([2011, 0, 13]);
+ assert.equal(moment(a).isoWeekday(1).date(), 10, 'set from thu to mon');
+ assert.equal(moment(a).isoWeekday(4).date(), 13, 'set from thu to thu');
+ assert.equal(moment(a).isoWeekday(7).date(), 16, 'set from thu to sun');
+ assert.equal(moment(a).isoWeekday(-6).date(), 3, 'set from thu to last mon');
+ assert.equal(moment(a).isoWeekday(-3).date(), 6, 'set from thu to last thu');
+ assert.equal(moment(a).isoWeekday(0).date(), 9, 'set from thu to last sun');
+ assert.equal(moment(a).isoWeekday(8).date(), 17, 'set from thu to next mon');
+ assert.equal(moment(a).isoWeekday(11).date(), 20, 'set from thu to next thu');
+ assert.equal(moment(a).isoWeekday(14).date(), 23, 'set from thu to next sun');
+
+ a = moment([2011, 0, 16]);
+ assert.equal(moment(a).isoWeekday(1).date(), 10, 'set from sun to mon');
+ assert.equal(moment(a).isoWeekday(4).date(), 13, 'set from sun to thu');
+ assert.equal(moment(a).isoWeekday(7).date(), 16, 'set from sun to sun');
+ assert.equal(moment(a).isoWeekday(-6).date(), 3, 'set from sun to last mon');
+ assert.equal(moment(a).isoWeekday(-3).date(), 6, 'set from sun to last thu');
+ assert.equal(moment(a).isoWeekday(0).date(), 9, 'set from sun to last sun');
+ assert.equal(moment(a).isoWeekday(8).date(), 17, 'set from sun to next mon');
+ assert.equal(moment(a).isoWeekday(11).date(), 20, 'set from sun to next thu');
+ assert.equal(moment(a).isoWeekday(14).date(), 23, 'set from sun to next sun');
+});
+
+test('iso weekday setter with day name', function (assert) {
+ moment.locale('en');
+
+ var a = moment([2011, 0, 10]);
+ assert.equal(moment(a).isoWeekday('Monday').date(), 10, 'set from mon to mon');
+ assert.equal(moment(a).isoWeekday('Thursday').date(), 13, 'set from mon to thu');
+ assert.equal(moment(a).isoWeekday('Sunday').date(), 16, 'set from mon to sun');
+
+ a = moment([2011, 0, 13]);
+ assert.equal(moment(a).isoWeekday('Monday').date(), 10, 'set from thu to mon');
+ assert.equal(moment(a).isoWeekday('Thursday').date(), 13, 'set from thu to thu');
+ assert.equal(moment(a).isoWeekday('Sunday').date(), 16, 'set from thu to sun');
+
+ a = moment([2011, 0, 16]);
+ assert.equal(moment(a).isoWeekday('Monday').date(), 10, 'set from sun to mon');
+ assert.equal(moment(a).isoWeekday('Thursday').date(), 13, 'set from sun to thu');
+ assert.equal(moment(a).isoWeekday('Sunday').date(), 16, 'set from sun to sun');
+});
+
+test('weekday first day of week Sunday (dow 0)', function (assert) {
+ moment.locale('dow: 0,doy: 6', {week: {dow: 0, doy: 6}});
+ assert.equal(moment([1985, 1, 3]).weekday(), 0, 'Feb 3 1985 is Sunday -- 0th day');
+ assert.equal(moment([2029, 8, 17]).weekday(), 1, 'Sep 17 2029 is Monday -- 1st day');
+ assert.equal(moment([2013, 3, 23]).weekday(), 2, 'Apr 23 2013 is Tuesday -- 2nd day');
+ assert.equal(moment([2015, 2, 4]).weekday(), 3, 'Mar 4 2015 is Wednesday -- 3nd day');
+ assert.equal(moment([1970, 0, 1]).weekday(), 4, 'Jan 1 1970 is Thursday -- 4th day');
+ assert.equal(moment([2001, 4, 11]).weekday(), 5, 'May 11 2001 is Friday -- 5th day');
+ assert.equal(moment([2000, 0, 1]).weekday(), 6, 'Jan 1 2000 is Saturday -- 6th day');
+});
+
+test('weekday first day of week Monday (dow 1)', function (assert) {
+ moment.locale('dow: 1,doy: 6', {week: {dow: 1, doy: 6}});
+ assert.equal(moment([1985, 1, 4]).weekday(), 0, 'Feb 4 1985 is Monday -- 0th day');
+ assert.equal(moment([2029, 8, 18]).weekday(), 1, 'Sep 18 2029 is Tuesday -- 1st day');
+ assert.equal(moment([2013, 3, 24]).weekday(), 2, 'Apr 24 2013 is Wednesday -- 2nd day');
+ assert.equal(moment([2015, 2, 5]).weekday(), 3, 'Mar 5 2015 is Thursday -- 3nd day');
+ assert.equal(moment([1970, 0, 2]).weekday(), 4, 'Jan 2 1970 is Friday -- 4th day');
+ assert.equal(moment([2001, 4, 12]).weekday(), 5, 'May 12 2001 is Saturday -- 5th day');
+ assert.equal(moment([2000, 0, 2]).weekday(), 6, 'Jan 2 2000 is Sunday -- 6th day');
+});
+
+test('weekday first day of week Tuesday (dow 2)', function (assert) {
+ moment.locale('dow: 2,doy: 6', {week: {dow: 2, doy: 6}});
+ assert.equal(moment([1985, 1, 5]).weekday(), 0, 'Feb 5 1985 is Tuesday -- 0th day');
+ assert.equal(moment([2029, 8, 19]).weekday(), 1, 'Sep 19 2029 is Wednesday -- 1st day');
+ assert.equal(moment([2013, 3, 25]).weekday(), 2, 'Apr 25 2013 is Thursday -- 2nd day');
+ assert.equal(moment([2015, 2, 6]).weekday(), 3, 'Mar 6 2015 is Friday -- 3nd day');
+ assert.equal(moment([1970, 0, 3]).weekday(), 4, 'Jan 3 1970 is Staturday -- 4th day');
+ assert.equal(moment([2001, 4, 13]).weekday(), 5, 'May 13 2001 is Sunday -- 5th day');
+ assert.equal(moment([2000, 0, 3]).weekday(), 6, 'Jan 3 2000 is Monday -- 6th day');
+});
+
+test('weekday first day of week Wednesday (dow 3)', function (assert) {
+ moment.locale('dow: 3,doy: 6', {week: {dow: 3, doy: 6}});
+ assert.equal(moment([1985, 1, 6]).weekday(), 0, 'Feb 6 1985 is Wednesday -- 0th day');
+ assert.equal(moment([2029, 8, 20]).weekday(), 1, 'Sep 20 2029 is Thursday -- 1st day');
+ assert.equal(moment([2013, 3, 26]).weekday(), 2, 'Apr 26 2013 is Friday -- 2nd day');
+ assert.equal(moment([2015, 2, 7]).weekday(), 3, 'Mar 7 2015 is Saturday -- 3nd day');
+ assert.equal(moment([1970, 0, 4]).weekday(), 4, 'Jan 4 1970 is Sunday -- 4th day');
+ assert.equal(moment([2001, 4, 14]).weekday(), 5, 'May 14 2001 is Monday -- 5th day');
+ assert.equal(moment([2000, 0, 4]).weekday(), 6, 'Jan 4 2000 is Tuesday -- 6th day');
+ moment.locale('dow:3,doy:6', null);
+});
+
+test('weekday first day of week Thursday (dow 4)', function (assert) {
+ moment.locale('dow: 4,doy: 6', {week: {dow: 4, doy: 6}});
+ assert.equal(moment([1985, 1, 7]).weekday(), 0, 'Feb 7 1985 is Thursday -- 0th day');
+ assert.equal(moment([2029, 8, 21]).weekday(), 1, 'Sep 21 2029 is Friday -- 1st day');
+ assert.equal(moment([2013, 3, 27]).weekday(), 2, 'Apr 27 2013 is Saturday -- 2nd day');
+ assert.equal(moment([2015, 2, 8]).weekday(), 3, 'Mar 8 2015 is Sunday -- 3nd day');
+ assert.equal(moment([1970, 0, 5]).weekday(), 4, 'Jan 5 1970 is Monday -- 4th day');
+ assert.equal(moment([2001, 4, 15]).weekday(), 5, 'May 15 2001 is Tuesday -- 5th day');
+ assert.equal(moment([2000, 0, 5]).weekday(), 6, 'Jan 5 2000 is Wednesday -- 6th day');
+});
+
+test('weekday first day of week Friday (dow 5)', function (assert) {
+ moment.locale('dow: 5,doy: 6', {week: {dow: 5, doy: 6}});
+ assert.equal(moment([1985, 1, 8]).weekday(), 0, 'Feb 8 1985 is Friday -- 0th day');
+ assert.equal(moment([2029, 8, 22]).weekday(), 1, 'Sep 22 2029 is Staturday -- 1st day');
+ assert.equal(moment([2013, 3, 28]).weekday(), 2, 'Apr 28 2013 is Sunday -- 2nd day');
+ assert.equal(moment([2015, 2, 9]).weekday(), 3, 'Mar 9 2015 is Monday -- 3nd day');
+ assert.equal(moment([1970, 0, 6]).weekday(), 4, 'Jan 6 1970 is Tuesday -- 4th day');
+ assert.equal(moment([2001, 4, 16]).weekday(), 5, 'May 16 2001 is Wednesday -- 5th day');
+ assert.equal(moment([2000, 0, 6]).weekday(), 6, 'Jan 6 2000 is Thursday -- 6th day');
+});
+
+test('weekday first day of week Saturday (dow 6)', function (assert) {
+ moment.locale('dow: 6,doy: 6', {week: {dow: 6, doy: 6}});
+ assert.equal(moment([1985, 1, 9]).weekday(), 0, 'Feb 9 1985 is Staturday -- 0th day');
+ assert.equal(moment([2029, 8, 23]).weekday(), 1, 'Sep 23 2029 is Sunday -- 1st day');
+ assert.equal(moment([2013, 3, 29]).weekday(), 2, 'Apr 29 2013 is Monday -- 2nd day');
+ assert.equal(moment([2015, 2, 10]).weekday(), 3, 'Mar 10 2015 is Tuesday -- 3nd day');
+ assert.equal(moment([1970, 0, 7]).weekday(), 4, 'Jan 7 1970 is Wednesday -- 4th day');
+ assert.equal(moment([2001, 4, 17]).weekday(), 5, 'May 17 2001 is Thursday -- 5th day');
+ assert.equal(moment([2000, 0, 7]).weekday(), 6, 'Jan 7 2000 is Friday -- 6th day');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('weeks');
+
+test('day of year', function (assert) {
+ assert.equal(moment([2000, 0, 1]).dayOfYear(), 1, 'Jan 1 2000 should be day 1 of the year');
+ assert.equal(moment([2000, 1, 28]).dayOfYear(), 59, 'Feb 28 2000 should be day 59 of the year');
+ assert.equal(moment([2000, 1, 29]).dayOfYear(), 60, 'Feb 28 2000 should be day 60 of the year');
+ assert.equal(moment([2000, 11, 31]).dayOfYear(), 366, 'Dec 31 2000 should be day 366 of the year');
+ assert.equal(moment([2001, 0, 1]).dayOfYear(), 1, 'Jan 1 2001 should be day 1 of the year');
+ assert.equal(moment([2001, 1, 28]).dayOfYear(), 59, 'Feb 28 2001 should be day 59 of the year');
+ assert.equal(moment([2001, 2, 1]).dayOfYear(), 60, 'Mar 1 2001 should be day 60 of the year');
+ assert.equal(moment([2001, 11, 31]).dayOfYear(), 365, 'Dec 31 2001 should be day 365 of the year');
+});
+
+test('day of year setters', function (assert) {
+ assert.equal(moment([2000, 0, 1]).dayOfYear(200).dayOfYear(), 200, 'Setting Jan 1 2000 day of the year to 200 should work');
+ assert.equal(moment([2000, 1, 28]).dayOfYear(200).dayOfYear(), 200, 'Setting Feb 28 2000 day of the year to 200 should work');
+ assert.equal(moment([2000, 1, 29]).dayOfYear(200).dayOfYear(), 200, 'Setting Feb 28 2000 day of the year to 200 should work');
+ assert.equal(moment([2000, 11, 31]).dayOfYear(200).dayOfYear(), 200, 'Setting Dec 31 2000 day of the year to 200 should work');
+ assert.equal(moment().dayOfYear(1).dayOfYear(), 1, 'Setting day of the year to 1 should work');
+ assert.equal(moment().dayOfYear(59).dayOfYear(), 59, 'Setting day of the year to 59 should work');
+ assert.equal(moment().dayOfYear(60).dayOfYear(), 60, 'Setting day of the year to 60 should work');
+ assert.equal(moment().dayOfYear(365).dayOfYear(), 365, 'Setting day of the year to 365 should work');
+});
+
+test('iso weeks year starting sunday', function (assert) {
+ assert.equal(moment([2012, 0, 1]).isoWeek(), 52, 'Jan 1 2012 should be iso week 52');
+ assert.equal(moment([2012, 0, 2]).isoWeek(), 1, 'Jan 2 2012 should be iso week 1');
+ assert.equal(moment([2012, 0, 8]).isoWeek(), 1, 'Jan 8 2012 should be iso week 1');
+ assert.equal(moment([2012, 0, 9]).isoWeek(), 2, 'Jan 9 2012 should be iso week 2');
+ assert.equal(moment([2012, 0, 15]).isoWeek(), 2, 'Jan 15 2012 should be iso week 2');
+});
+
+test('iso weeks year starting monday', function (assert) {
+ assert.equal(moment([2007, 0, 1]).isoWeek(), 1, 'Jan 1 2007 should be iso week 1');
+ assert.equal(moment([2007, 0, 7]).isoWeek(), 1, 'Jan 7 2007 should be iso week 1');
+ assert.equal(moment([2007, 0, 8]).isoWeek(), 2, 'Jan 8 2007 should be iso week 2');
+ assert.equal(moment([2007, 0, 14]).isoWeek(), 2, 'Jan 14 2007 should be iso week 2');
+ assert.equal(moment([2007, 0, 15]).isoWeek(), 3, 'Jan 15 2007 should be iso week 3');
+});
+
+test('iso weeks year starting tuesday', function (assert) {
+ assert.equal(moment([2007, 11, 31]).isoWeek(), 1, 'Dec 31 2007 should be iso week 1');
+ assert.equal(moment([2008, 0, 1]).isoWeek(), 1, 'Jan 1 2008 should be iso week 1');
+ assert.equal(moment([2008, 0, 6]).isoWeek(), 1, 'Jan 6 2008 should be iso week 1');
+ assert.equal(moment([2008, 0, 7]).isoWeek(), 2, 'Jan 7 2008 should be iso week 2');
+ assert.equal(moment([2008, 0, 13]).isoWeek(), 2, 'Jan 13 2008 should be iso week 2');
+ assert.equal(moment([2008, 0, 14]).isoWeek(), 3, 'Jan 14 2008 should be iso week 3');
+});
+
+test('iso weeks year starting wednesday', function (assert) {
+ assert.equal(moment([2002, 11, 30]).isoWeek(), 1, 'Dec 30 2002 should be iso week 1');
+ assert.equal(moment([2003, 0, 1]).isoWeek(), 1, 'Jan 1 2003 should be iso week 1');
+ assert.equal(moment([2003, 0, 5]).isoWeek(), 1, 'Jan 5 2003 should be iso week 1');
+ assert.equal(moment([2003, 0, 6]).isoWeek(), 2, 'Jan 6 2003 should be iso week 2');
+ assert.equal(moment([2003, 0, 12]).isoWeek(), 2, 'Jan 12 2003 should be iso week 2');
+ assert.equal(moment([2003, 0, 13]).isoWeek(), 3, 'Jan 13 2003 should be iso week 3');
+});
+
+test('iso weeks year starting thursday', function (assert) {
+ assert.equal(moment([2008, 11, 29]).isoWeek(), 1, 'Dec 29 2008 should be iso week 1');
+ assert.equal(moment([2009, 0, 1]).isoWeek(), 1, 'Jan 1 2009 should be iso week 1');
+ assert.equal(moment([2009, 0, 4]).isoWeek(), 1, 'Jan 4 2009 should be iso week 1');
+ assert.equal(moment([2009, 0, 5]).isoWeek(), 2, 'Jan 5 2009 should be iso week 2');
+ assert.equal(moment([2009, 0, 11]).isoWeek(), 2, 'Jan 11 2009 should be iso week 2');
+ assert.equal(moment([2009, 0, 13]).isoWeek(), 3, 'Jan 12 2009 should be iso week 3');
+});
+
+test('iso weeks year starting friday', function (assert) {
+ assert.equal(moment([2009, 11, 28]).isoWeek(), 53, 'Dec 28 2009 should be iso week 53');
+ assert.equal(moment([2010, 0, 1]).isoWeek(), 53, 'Jan 1 2010 should be iso week 53');
+ assert.equal(moment([2010, 0, 3]).isoWeek(), 53, 'Jan 3 2010 should be iso week 53');
+ assert.equal(moment([2010, 0, 4]).isoWeek(), 1, 'Jan 4 2010 should be iso week 1');
+ assert.equal(moment([2010, 0, 10]).isoWeek(), 1, 'Jan 10 2010 should be iso week 1');
+ assert.equal(moment([2010, 0, 11]).isoWeek(), 2, 'Jan 11 2010 should be iso week 2');
+});
+
+test('iso weeks year starting saturday', function (assert) {
+ assert.equal(moment([2010, 11, 27]).isoWeek(), 52, 'Dec 27 2010 should be iso week 52');
+ assert.equal(moment([2011, 0, 1]).isoWeek(), 52, 'Jan 1 2011 should be iso week 52');
+ assert.equal(moment([2011, 0, 2]).isoWeek(), 52, 'Jan 2 2011 should be iso week 52');
+ assert.equal(moment([2011, 0, 3]).isoWeek(), 1, 'Jan 3 2011 should be iso week 1');
+ assert.equal(moment([2011, 0, 9]).isoWeek(), 1, 'Jan 9 2011 should be iso week 1');
+ assert.equal(moment([2011, 0, 10]).isoWeek(), 2, 'Jan 10 2011 should be iso week 2');
+});
+
+test('iso weeks year starting sunday formatted', function (assert) {
+ assert.equal(moment([2012, 0, 1]).format('W WW Wo'), '52 52 52nd', 'Jan 1 2012 should be iso week 52');
+ assert.equal(moment([2012, 0, 2]).format('W WW Wo'), '1 01 1st', 'Jan 2 2012 should be iso week 1');
+ assert.equal(moment([2012, 0, 8]).format('W WW Wo'), '1 01 1st', 'Jan 8 2012 should be iso week 1');
+ assert.equal(moment([2012, 0, 9]).format('W WW Wo'), '2 02 2nd', 'Jan 9 2012 should be iso week 2');
+ assert.equal(moment([2012, 0, 15]).format('W WW Wo'), '2 02 2nd', 'Jan 15 2012 should be iso week 2');
+});
+
+test('weeks plural year starting sunday', function (assert) {
+ assert.equal(moment([2012, 0, 1]).weeks(), 1, 'Jan 1 2012 should be week 1');
+ assert.equal(moment([2012, 0, 7]).weeks(), 1, 'Jan 7 2012 should be week 1');
+ assert.equal(moment([2012, 0, 8]).weeks(), 2, 'Jan 8 2012 should be week 2');
+ assert.equal(moment([2012, 0, 14]).weeks(), 2, 'Jan 14 2012 should be week 2');
+ assert.equal(moment([2012, 0, 15]).weeks(), 3, 'Jan 15 2012 should be week 3');
+});
+
+test('iso weeks plural year starting sunday', function (assert) {
+ assert.equal(moment([2012, 0, 1]).isoWeeks(), 52, 'Jan 1 2012 should be iso week 52');
+ assert.equal(moment([2012, 0, 2]).isoWeeks(), 1, 'Jan 2 2012 should be iso week 1');
+ assert.equal(moment([2012, 0, 8]).isoWeeks(), 1, 'Jan 8 2012 should be iso week 1');
+ assert.equal(moment([2012, 0, 9]).isoWeeks(), 2, 'Jan 9 2012 should be iso week 2');
+ assert.equal(moment([2012, 0, 15]).isoWeeks(), 2, 'Jan 15 2012 should be iso week 2');
+});
+
+test('weeks setter', function (assert) {
+ assert.equal(moment([2012, 0, 1]).week(30).week(), 30, 'Setting Jan 1 2012 to week 30 should work');
+ assert.equal(moment([2012, 0, 7]).week(30).week(), 30, 'Setting Jan 7 2012 to week 30 should work');
+ assert.equal(moment([2012, 0, 8]).week(30).week(), 30, 'Setting Jan 8 2012 to week 30 should work');
+ assert.equal(moment([2012, 0, 14]).week(30).week(), 30, 'Setting Jan 14 2012 to week 30 should work');
+ assert.equal(moment([2012, 0, 15]).week(30).week(), 30, 'Setting Jan 15 2012 to week 30 should work');
+});
+
+test('iso weeks setter', function (assert) {
+ assert.equal(moment([2012, 0, 1]).isoWeeks(25).isoWeeks(), 25, 'Setting Jan 1 2012 to week 25 should work');
+ assert.equal(moment([2012, 0, 2]).isoWeeks(24).isoWeeks(), 24, 'Setting Jan 2 2012 to week 24 should work');
+ assert.equal(moment([2012, 0, 8]).isoWeeks(23).isoWeeks(), 23, 'Setting Jan 8 2012 to week 23 should work');
+ assert.equal(moment([2012, 0, 9]).isoWeeks(22).isoWeeks(), 22, 'Setting Jan 9 2012 to week 22 should work');
+ assert.equal(moment([2012, 0, 15]).isoWeeks(21).isoWeeks(), 21, 'Setting Jan 15 2012 to week 21 should work');
+});
+
+test('iso weeks setter day of year', function (assert) {
+ assert.equal(moment([2012, 0, 1]).isoWeek(1).dayOfYear(), 9, 'Setting Jan 1 2012 to week 1 should be day of year 8');
+ assert.equal(moment([2012, 0, 1]).isoWeek(1).year(), 2011, 'Setting Jan 1 2012 to week 1 should be year 2011');
+ assert.equal(moment([2012, 0, 2]).isoWeek(1).dayOfYear(), 2, 'Setting Jan 2 2012 to week 1 should be day of year 2');
+ assert.equal(moment([2012, 0, 8]).isoWeek(1).dayOfYear(), 8, 'Setting Jan 8 2012 to week 1 should be day of year 8');
+ assert.equal(moment([2012, 0, 9]).isoWeek(1).dayOfYear(), 2, 'Setting Jan 9 2012 to week 1 should be day of year 2');
+ assert.equal(moment([2012, 0, 15]).isoWeek(1).dayOfYear(), 8, 'Setting Jan 15 2012 to week 1 should be day of year 8');
+});
+
+test('years with iso week 53', function (assert) {
+ // Based on a table taken from http://en.wikipedia.org/wiki/ISO_week_date
+ // (as downloaded on 2014-01-06) listing the 71 years in a 400-year cycle
+ // that have 53 weeks; in this case reflecting the 2000 based cycle
+ assert.equal(moment([2004, 11, 31]).isoWeek(), 53, 'Dec 31 2004 should be iso week 53');
+ assert.equal(moment([2009, 11, 31]).isoWeek(), 53, 'Dec 31 2009 should be iso week 53');
+ assert.equal(moment([2015, 11, 31]).isoWeek(), 53, 'Dec 31 2015 should be iso week 53');
+ assert.equal(moment([2020, 11, 31]).isoWeek(), 53, 'Dec 31 2020 should be iso week 53');
+ assert.equal(moment([2026, 11, 31]).isoWeek(), 53, 'Dec 31 2026 should be iso week 53');
+ assert.equal(moment([2032, 11, 31]).isoWeek(), 53, 'Dec 31 2032 should be iso week 53');
+ assert.equal(moment([2037, 11, 31]).isoWeek(), 53, 'Dec 31 2037 should be iso week 53');
+ assert.equal(moment([2043, 11, 31]).isoWeek(), 53, 'Dec 31 2043 should be iso week 53');
+ assert.equal(moment([2048, 11, 31]).isoWeek(), 53, 'Dec 31 2048 should be iso week 53');
+ assert.equal(moment([2054, 11, 31]).isoWeek(), 53, 'Dec 31 2054 should be iso week 53');
+ assert.equal(moment([2060, 11, 31]).isoWeek(), 53, 'Dec 31 2060 should be iso week 53');
+ assert.equal(moment([2065, 11, 31]).isoWeek(), 53, 'Dec 31 2065 should be iso week 53');
+ assert.equal(moment([2071, 11, 31]).isoWeek(), 53, 'Dec 31 2071 should be iso week 53');
+ assert.equal(moment([2076, 11, 31]).isoWeek(), 53, 'Dec 31 2076 should be iso week 53');
+ assert.equal(moment([2082, 11, 31]).isoWeek(), 53, 'Dec 31 2082 should be iso week 53');
+ assert.equal(moment([2088, 11, 31]).isoWeek(), 53, 'Dec 31 2088 should be iso week 53');
+ assert.equal(moment([2093, 11, 31]).isoWeek(), 53, 'Dec 31 2093 should be iso week 53');
+ assert.equal(moment([2099, 11, 31]).isoWeek(), 53, 'Dec 31 2099 should be iso week 53');
+ assert.equal(moment([2105, 11, 31]).isoWeek(), 53, 'Dec 31 2105 should be iso week 53');
+ assert.equal(moment([2111, 11, 31]).isoWeek(), 53, 'Dec 31 2111 should be iso week 53');
+ assert.equal(moment([2116, 11, 31]).isoWeek(), 53, 'Dec 31 2116 should be iso week 53');
+ assert.equal(moment([2122, 11, 31]).isoWeek(), 53, 'Dec 31 2122 should be iso week 53');
+ assert.equal(moment([2128, 11, 31]).isoWeek(), 53, 'Dec 31 2128 should be iso week 53');
+ assert.equal(moment([2133, 11, 31]).isoWeek(), 53, 'Dec 31 2133 should be iso week 53');
+ assert.equal(moment([2139, 11, 31]).isoWeek(), 53, 'Dec 31 2139 should be iso week 53');
+ assert.equal(moment([2144, 11, 31]).isoWeek(), 53, 'Dec 31 2144 should be iso week 53');
+ assert.equal(moment([2150, 11, 31]).isoWeek(), 53, 'Dec 31 2150 should be iso week 53');
+ assert.equal(moment([2156, 11, 31]).isoWeek(), 53, 'Dec 31 2156 should be iso week 53');
+ assert.equal(moment([2161, 11, 31]).isoWeek(), 53, 'Dec 31 2161 should be iso week 53');
+ assert.equal(moment([2167, 11, 31]).isoWeek(), 53, 'Dec 31 2167 should be iso week 53');
+ assert.equal(moment([2172, 11, 31]).isoWeek(), 53, 'Dec 31 2172 should be iso week 53');
+ assert.equal(moment([2178, 11, 31]).isoWeek(), 53, 'Dec 31 2178 should be iso week 53');
+ assert.equal(moment([2184, 11, 31]).isoWeek(), 53, 'Dec 31 2184 should be iso week 53');
+ assert.equal(moment([2189, 11, 31]).isoWeek(), 53, 'Dec 31 2189 should be iso week 53');
+ assert.equal(moment([2195, 11, 31]).isoWeek(), 53, 'Dec 31 2195 should be iso week 53');
+ assert.equal(moment([2201, 11, 31]).isoWeek(), 53, 'Dec 31 2201 should be iso week 53');
+ assert.equal(moment([2207, 11, 31]).isoWeek(), 53, 'Dec 31 2207 should be iso week 53');
+ assert.equal(moment([2212, 11, 31]).isoWeek(), 53, 'Dec 31 2212 should be iso week 53');
+ assert.equal(moment([2218, 11, 31]).isoWeek(), 53, 'Dec 31 2218 should be iso week 53');
+ assert.equal(moment([2224, 11, 31]).isoWeek(), 53, 'Dec 31 2224 should be iso week 53');
+ assert.equal(moment([2229, 11, 31]).isoWeek(), 53, 'Dec 31 2229 should be iso week 53');
+ assert.equal(moment([2235, 11, 31]).isoWeek(), 53, 'Dec 31 2235 should be iso week 53');
+ assert.equal(moment([2240, 11, 31]).isoWeek(), 53, 'Dec 31 2240 should be iso week 53');
+ assert.equal(moment([2246, 11, 31]).isoWeek(), 53, 'Dec 31 2246 should be iso week 53');
+ assert.equal(moment([2252, 11, 31]).isoWeek(), 53, 'Dec 31 2252 should be iso week 53');
+ assert.equal(moment([2257, 11, 31]).isoWeek(), 53, 'Dec 31 2257 should be iso week 53');
+ assert.equal(moment([2263, 11, 31]).isoWeek(), 53, 'Dec 31 2263 should be iso week 53');
+ assert.equal(moment([2268, 11, 31]).isoWeek(), 53, 'Dec 31 2268 should be iso week 53');
+ assert.equal(moment([2274, 11, 31]).isoWeek(), 53, 'Dec 31 2274 should be iso week 53');
+ assert.equal(moment([2280, 11, 31]).isoWeek(), 53, 'Dec 31 2280 should be iso week 53');
+ assert.equal(moment([2285, 11, 31]).isoWeek(), 53, 'Dec 31 2285 should be iso week 53');
+ assert.equal(moment([2291, 11, 31]).isoWeek(), 53, 'Dec 31 2291 should be iso week 53');
+ assert.equal(moment([2296, 11, 31]).isoWeek(), 53, 'Dec 31 2296 should be iso week 53');
+ assert.equal(moment([2303, 11, 31]).isoWeek(), 53, 'Dec 31 2303 should be iso week 53');
+ assert.equal(moment([2308, 11, 31]).isoWeek(), 53, 'Dec 31 2308 should be iso week 53');
+ assert.equal(moment([2314, 11, 31]).isoWeek(), 53, 'Dec 31 2314 should be iso week 53');
+ assert.equal(moment([2320, 11, 31]).isoWeek(), 53, 'Dec 31 2320 should be iso week 53');
+ assert.equal(moment([2325, 11, 31]).isoWeek(), 53, 'Dec 31 2325 should be iso week 53');
+ assert.equal(moment([2331, 11, 31]).isoWeek(), 53, 'Dec 31 2331 should be iso week 53');
+ assert.equal(moment([2336, 11, 31]).isoWeek(), 53, 'Dec 31 2336 should be iso week 53');
+ assert.equal(moment([2342, 11, 31]).isoWeek(), 53, 'Dec 31 2342 should be iso week 53');
+ assert.equal(moment([2348, 11, 31]).isoWeek(), 53, 'Dec 31 2348 should be iso week 53');
+ assert.equal(moment([2353, 11, 31]).isoWeek(), 53, 'Dec 31 2353 should be iso week 53');
+ assert.equal(moment([2359, 11, 31]).isoWeek(), 53, 'Dec 31 2359 should be iso week 53');
+ assert.equal(moment([2364, 11, 31]).isoWeek(), 53, 'Dec 31 2364 should be iso week 53');
+ assert.equal(moment([2370, 11, 31]).isoWeek(), 53, 'Dec 31 2370 should be iso week 53');
+ assert.equal(moment([2376, 11, 31]).isoWeek(), 53, 'Dec 31 2376 should be iso week 53');
+ assert.equal(moment([2381, 11, 31]).isoWeek(), 53, 'Dec 31 2381 should be iso week 53');
+ assert.equal(moment([2387, 11, 31]).isoWeek(), 53, 'Dec 31 2387 should be iso week 53');
+ assert.equal(moment([2392, 11, 31]).isoWeek(), 53, 'Dec 31 2392 should be iso week 53');
+ assert.equal(moment([2398, 11, 31]).isoWeek(), 53, 'Dec 31 2398 should be iso week 53');
+});
+
+test('count years with iso week 53', function (assert) {
+ // Based on http://en.wikipedia.org/wiki/ISO_week_date (as seen on 2014-01-06)
+ // stating that there are 71 years in a 400-year cycle that have 53 weeks;
+ // in this case reflecting the 2000 based cycle
+ var count = 0, i;
+ for (i = 0; i < 400; i++) {
+ count += (moment([2000 + i, 11, 31]).isoWeek() === 53) ? 1 : 0;
+ }
+ assert.equal(count, 71, 'Should have 71 years in 400-year cycle with iso week 53');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('weeks in year');
+
+test('isoWeeksInYear', function (assert) {
+ assert.equal(moment([2004]).isoWeeksInYear(), 53, '2004 has 53 iso weeks');
+ assert.equal(moment([2005]).isoWeeksInYear(), 52, '2005 has 53 iso weeks');
+ assert.equal(moment([2006]).isoWeeksInYear(), 52, '2006 has 53 iso weeks');
+ assert.equal(moment([2007]).isoWeeksInYear(), 52, '2007 has 52 iso weeks');
+ assert.equal(moment([2008]).isoWeeksInYear(), 52, '2008 has 53 iso weeks');
+ assert.equal(moment([2009]).isoWeeksInYear(), 53, '2009 has 53 iso weeks');
+ assert.equal(moment([2010]).isoWeeksInYear(), 52, '2010 has 52 iso weeks');
+ assert.equal(moment([2011]).isoWeeksInYear(), 52, '2011 has 52 iso weeks');
+ assert.equal(moment([2012]).isoWeeksInYear(), 52, '2012 has 52 iso weeks');
+ assert.equal(moment([2013]).isoWeeksInYear(), 52, '2013 has 52 iso weeks');
+ assert.equal(moment([2014]).isoWeeksInYear(), 52, '2014 has 52 iso weeks');
+ assert.equal(moment([2015]).isoWeeksInYear(), 53, '2015 has 53 iso weeks');
+});
+
+test('weeksInYear doy/dow = 1/4', function (assert) {
+ moment.locale('1/4', {week: {dow: 1, doy: 4}});
+
+ assert.equal(moment([2004]).weeksInYear(), 53, '2004 has 53 weeks');
+ assert.equal(moment([2005]).weeksInYear(), 52, '2005 has 53 weeks');
+ assert.equal(moment([2006]).weeksInYear(), 52, '2006 has 53 weeks');
+ assert.equal(moment([2007]).weeksInYear(), 52, '2007 has 52 weeks');
+ assert.equal(moment([2008]).weeksInYear(), 52, '2008 has 53 weeks');
+ assert.equal(moment([2009]).weeksInYear(), 53, '2009 has 53 weeks');
+ assert.equal(moment([2010]).weeksInYear(), 52, '2010 has 52 weeks');
+ assert.equal(moment([2011]).weeksInYear(), 52, '2011 has 52 weeks');
+ assert.equal(moment([2012]).weeksInYear(), 52, '2012 has 52 weeks');
+ assert.equal(moment([2013]).weeksInYear(), 52, '2013 has 52 weeks');
+ assert.equal(moment([2014]).weeksInYear(), 52, '2014 has 52 weeks');
+ assert.equal(moment([2015]).weeksInYear(), 53, '2015 has 53 weeks');
+});
+
+test('weeksInYear doy/dow = 6/12', function (assert) {
+ moment.locale('6/12', {week: {dow: 6, doy: 12}});
+
+ assert.equal(moment([2004]).weeksInYear(), 53, '2004 has 53 weeks');
+ assert.equal(moment([2005]).weeksInYear(), 52, '2005 has 53 weeks');
+ assert.equal(moment([2006]).weeksInYear(), 52, '2006 has 53 weeks');
+ assert.equal(moment([2007]).weeksInYear(), 52, '2007 has 52 weeks');
+ assert.equal(moment([2008]).weeksInYear(), 52, '2008 has 53 weeks');
+ assert.equal(moment([2009]).weeksInYear(), 52, '2009 has 53 weeks');
+ assert.equal(moment([2010]).weeksInYear(), 53, '2010 has 52 weeks');
+ assert.equal(moment([2011]).weeksInYear(), 52, '2011 has 52 weeks');
+ assert.equal(moment([2012]).weeksInYear(), 52, '2012 has 52 weeks');
+ assert.equal(moment([2013]).weeksInYear(), 52, '2013 has 52 weeks');
+ assert.equal(moment([2014]).weeksInYear(), 52, '2014 has 52 weeks');
+ assert.equal(moment([2015]).weeksInYear(), 52, '2015 has 53 weeks');
+});
+
+test('weeksInYear doy/dow = 1/7', function (assert) {
+ moment.locale('1/7', {week: {dow: 1, doy: 7}});
+
+ assert.equal(moment([2004]).weeksInYear(), 52, '2004 has 53 weeks');
+ assert.equal(moment([2005]).weeksInYear(), 52, '2005 has 53 weeks');
+ assert.equal(moment([2006]).weeksInYear(), 53, '2006 has 53 weeks');
+ assert.equal(moment([2007]).weeksInYear(), 52, '2007 has 52 weeks');
+ assert.equal(moment([2008]).weeksInYear(), 52, '2008 has 53 weeks');
+ assert.equal(moment([2009]).weeksInYear(), 52, '2009 has 53 weeks');
+ assert.equal(moment([2010]).weeksInYear(), 52, '2010 has 52 weeks');
+ assert.equal(moment([2011]).weeksInYear(), 52, '2011 has 52 weeks');
+ assert.equal(moment([2012]).weeksInYear(), 53, '2012 has 52 weeks');
+ assert.equal(moment([2013]).weeksInYear(), 52, '2013 has 52 weeks');
+ assert.equal(moment([2014]).weeksInYear(), 52, '2014 has 52 weeks');
+ assert.equal(moment([2015]).weeksInYear(), 52, '2015 has 53 weeks');
+});
+
+test('weeksInYear doy/dow = 0/6', function (assert) {
+ moment.locale('0/6', {week: {dow: 0, doy: 6}});
+
+ assert.equal(moment([2004]).weeksInYear(), 52, '2004 has 53 weeks');
+ assert.equal(moment([2005]).weeksInYear(), 53, '2005 has 53 weeks');
+ assert.equal(moment([2006]).weeksInYear(), 52, '2006 has 53 weeks');
+ assert.equal(moment([2007]).weeksInYear(), 52, '2007 has 52 weeks');
+ assert.equal(moment([2008]).weeksInYear(), 52, '2008 has 53 weeks');
+ assert.equal(moment([2009]).weeksInYear(), 52, '2009 has 53 weeks');
+ assert.equal(moment([2010]).weeksInYear(), 52, '2010 has 52 weeks');
+ assert.equal(moment([2011]).weeksInYear(), 53, '2011 has 52 weeks');
+ assert.equal(moment([2012]).weeksInYear(), 52, '2012 has 52 weeks');
+ assert.equal(moment([2013]).weeksInYear(), 52, '2013 has 52 weeks');
+ assert.equal(moment([2014]).weeksInYear(), 52, '2014 has 52 weeks');
+ assert.equal(moment([2015]).weeksInYear(), 52, '2015 has 53 weeks');
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+function isNearSpringDST() {
+ return moment().subtract(1, 'day').utcOffset() !== moment().add(1, 'day').utcOffset();
+}
+
+module$1('zone switching');
+
+test('local to utc, keepLocalTime = true', function (assert) {
+ var m = moment(),
+ fmt = 'YYYY-DD-MM HH:mm:ss';
+ assert.equal(m.clone().utc(true).format(fmt), m.format(fmt), 'local to utc failed to keep local time');
+});
+
+test('local to utc, keepLocalTime = false', function (assert) {
+ var m = moment();
+ assert.equal(m.clone().utc().valueOf(), m.valueOf(), 'local to utc failed to keep utc time (implicit)');
+ assert.equal(m.clone().utc(false).valueOf(), m.valueOf(), 'local to utc failed to keep utc time (explicit)');
+});
+
+test('local to zone, keepLocalTime = true', function (assert) {
+ test.expectedDeprecations('moment().zone');
+ var m = moment(),
+ fmt = 'YYYY-DD-MM HH:mm:ss',
+ z;
+
+ // Apparently there is -12:00 and +14:00
+ // http://en.wikipedia.org/wiki/UTC+14:00
+ // http://en.wikipedia.org/wiki/UTC-12:00
+ for (z = -12; z <= 14; ++z) {
+ assert.equal(m.clone().zone(z * 60, true).format(fmt), m.format(fmt),
+ 'local to zone(' + z + ':00) failed to keep local time');
+ }
+});
+
+test('local to zone, keepLocalTime = false', function (assert) {
+ test.expectedDeprecations('moment().zone');
+ var m = moment(),
+ z;
+
+ // Apparently there is -12:00 and +14:00
+ // http://en.wikipedia.org/wiki/UTC+14:00
+ // http://en.wikipedia.org/wiki/UTC-12:00
+ for (z = -12; z <= 14; ++z) {
+ assert.equal(m.clone().zone(z * 60).valueOf(), m.valueOf(),
+ 'local to zone(' + z + ':00) failed to keep utc time (implicit)');
+ assert.equal(m.clone().zone(z * 60, false).valueOf(), m.valueOf(),
+ 'local to zone(' + z + ':00) failed to keep utc time (explicit)');
+ }
+});
+
+test('utc to local, keepLocalTime = true', function (assert) {
+ // Don't test near the spring DST transition
+ if (isNearSpringDST()) {
+ expect(0);
+ return;
+ }
+
+ var um = moment.utc(),
+ fmt = 'YYYY-DD-MM HH:mm:ss';
+
+ assert.equal(um.clone().local(true).format(fmt), um.format(fmt), 'utc to local failed to keep local time');
+});
+
+test('utc to local, keepLocalTime = false', function (assert) {
+ var um = moment.utc();
+ assert.equal(um.clone().local().valueOf(), um.valueOf(), 'utc to local failed to keep utc time (implicit)');
+ assert.equal(um.clone().local(false).valueOf(), um.valueOf(), 'utc to local failed to keep utc time (explicit)');
+});
+
+test('zone to local, keepLocalTime = true', function (assert) {
+ // Don't test near the spring DST transition
+ if (isNearSpringDST()) {
+ expect(0);
+ return;
+ }
+
+ test.expectedDeprecations('moment().zone');
+
+ var m = moment(),
+ fmt = 'YYYY-DD-MM HH:mm:ss',
+ z;
+
+ // Apparently there is -12:00 and +14:00
+ // http://en.wikipedia.org/wiki/UTC+14:00
+ // http://en.wikipedia.org/wiki/UTC-12:00
+ for (z = -12; z <= 14; ++z) {
+ m.zone(z * 60);
+
+ assert.equal(m.clone().local(true).format(fmt), m.format(fmt),
+ 'zone(' + z + ':00) to local failed to keep local time');
+ }
+});
+
+test('zone to local, keepLocalTime = false', function (assert) {
+ test.expectedDeprecations('moment().zone');
+ var m = moment(),
+ z;
+
+ // Apparently there is -12:00 and +14:00
+ // http://en.wikipedia.org/wiki/UTC+14:00
+ // http://en.wikipedia.org/wiki/UTC-12:00
+ for (z = -12; z <= 14; ++z) {
+ m.zone(z * 60);
+
+ assert.equal(m.clone().local(false).valueOf(), m.valueOf(),
+ 'zone(' + z + ':00) to local failed to keep utc time (explicit)');
+ assert.equal(m.clone().local().valueOf(), m.valueOf(),
+ 'zone(' + z + ':00) to local failed to keep utc time (implicit)');
+ }
+});
+
+})));
+
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
+
+function each(array, callback) {
+ var i;
+ for (i = 0; i < array.length; i++) {
+ callback(array[i], i, array);
+ }
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ } else {
+ // IE8
+ var res = [], i;
+ for (i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ }
+}
+
+// Pick the first defined of two or three arguments.
+
+function defineCommonLocaleTests(locale, options) {
+ test('lenient ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing ' + i + ' date check');
+ }
+ });
+
+ test('lenient ordinal parsing of number', function (assert) {
+ var i, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ testMoment = moment('2014 01 ' + i, 'YYYY MM Do');
+ assert.equal(testMoment.year(), 2014,
+ 'lenient ordinal parsing of number ' + i + ' year check');
+ assert.equal(testMoment.month(), 0,
+ 'lenient ordinal parsing of number ' + i + ' month check');
+ assert.equal(testMoment.date(), i,
+ 'lenient ordinal parsing of number ' + i + ' date check');
+ }
+ });
+
+ test('strict ordinal parsing', function (assert) {
+ var i, ordinalStr, testMoment;
+ for (i = 1; i <= 31; ++i) {
+ ordinalStr = moment([2014, 0, i]).format('YYYY MM Do');
+ testMoment = moment(ordinalStr, 'YYYY MM Do', true);
+ assert.ok(testMoment.isValid(), 'strict ordinal parsing ' + i);
+ }
+ });
+
+ test('meridiem invariant', function (assert) {
+ var h, m, t1, t2;
+ for (h = 0; h < 24; ++h) {
+ for (m = 0; m < 60; m += 15) {
+ t1 = moment.utc([2000, 0, 1, h, m]);
+ t2 = moment.utc(t1.format('A h:mm'), 'A h:mm');
+ assert.equal(t2.format('HH:mm'), t1.format('HH:mm'),
+ 'meridiem at ' + t1.format('HH:mm'));
+ }
+ }
+ });
+
+ test('date format correctness', function (assert) {
+ var data, tokens;
+ data = moment.localeData()._longDateFormat;
+ tokens = objectKeys(data);
+ each(tokens, function (srchToken) {
+ // Check each format string to make sure it does not contain any
+ // tokens that need to be expanded.
+ each(tokens, function (baseToken) {
+ // strip escaped sequences
+ var format = data[baseToken].replace(/(\[[^\]]*\])/g, '');
+ assert.equal(false, !!~format.indexOf(srchToken),
+ 'contains ' + srchToken + ' in ' + baseToken);
+ });
+ });
+ });
+
+ test('month parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr') {
+ // I can't fix it :(
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r;
+ r = moment(m.format(format), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.month(), m.month(), 'month ' + i + ' fmt ' + format + ' lower strict');
+ }
+
+ for (i = 0; i < 12; ++i) {
+ m = moment([2015, i, 15, 18]);
+ tester('MMM');
+ tester('MMM.');
+ tester('MMMM');
+ tester('MMMM.');
+ }
+ });
+
+ test('weekday parsing correctness', function (assert) {
+ var i, m;
+
+ if (locale === 'tr' || locale === 'az' || locale === 'ro') {
+ // tr, az: There is a lower-case letter (ı), that converted to
+ // upper then lower changes to i
+ // ro: there is the letter ț which behaves weird under IE8
+ expect(0);
+ return;
+ }
+ function tester(format) {
+ var r, baseMsg = 'weekday ' + m.weekday() + ' fmt ' + format + ' ' + m.toISOString();
+ r = moment(m.format(format), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg);
+ r = moment(m.format(format).toLocaleUpperCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper');
+ r = moment(m.format(format).toLocaleLowerCase(), format);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower');
+
+ r = moment(m.format(format), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' strict');
+ r = moment(m.format(format).toLocaleUpperCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' upper strict');
+ r = moment(m.format(format).toLocaleLowerCase(), format, true);
+ assert.equal(r.weekday(), m.weekday(), baseMsg + ' lower strict');
+ }
+
+ for (i = 0; i < 7; ++i) {
+ m = moment.utc([2015, 0, i + 1, 18]);
+ tester('dd');
+ tester('ddd');
+ tester('dddd');
+ }
+ });
+}
+
+function setupDeprecationHandler(test, moment$$1, scope) {
+ test._expectedDeprecations = null;
+ test._observedDeprecations = null;
+ test._oldSupress = moment$$1.suppressDeprecationWarnings;
+ moment$$1.suppressDeprecationWarnings = true;
+ test.expectedDeprecations = function () {
+ test._expectedDeprecations = arguments;
+ test._observedDeprecations = [];
+ };
+ moment$$1.deprecationHandler = function (name, msg) {
+ var deprecationId = matchedDeprecation(name, msg, test._expectedDeprecations);
+ if (deprecationId === -1) {
+ throw new Error('Unexpected deprecation thrown name=' +
+ name + ' msg=' + msg);
+ }
+ test._observedDeprecations[deprecationId] = 1;
+ };
+}
+
+function teardownDeprecationHandler(test, moment$$1, scope) {
+ moment$$1.suppressDeprecationWarnings = test._oldSupress;
+
+ if (test._expectedDeprecations != null) {
+ var missedDeprecations = [];
+ each(test._expectedDeprecations, function (deprecationPattern, id) {
+ if (test._observedDeprecations[id] !== 1) {
+ missedDeprecations.push(deprecationPattern);
+ }
+ });
+ if (missedDeprecations.length !== 0) {
+ throw new Error('Expected deprecation warnings did not happen: ' +
+ missedDeprecations.join(' '));
+ }
+ }
+}
+
+function matchedDeprecation(name, msg, deprecations) {
+ if (deprecations == null) {
+ return -1;
+ }
+ for (var i = 0; i < deprecations.length; ++i) {
+ if (name != null && name === deprecations[i]) {
+ return i;
+ }
+ if (msg != null && msg.substring(0, deprecations[i].length) === deprecations[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*global QUnit:false*/
+
+var test = QUnit.test;
+
+var expect = QUnit.expect;
+
+function module$1 (name, lifecycle) {
+ QUnit.module(name, {
+ setup : function () {
+ moment.locale('en');
+ moment.createFromInputFallback = function (config) {
+ throw new Error('input not handled by moment: ' + config._i);
+ };
+ setupDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.setup) {
+ lifecycle.setup();
+ }
+ },
+ teardown : function () {
+ teardownDeprecationHandler(test, moment, 'core');
+ if (lifecycle && lifecycle.teardown) {
+ lifecycle.teardown();
+ }
+ }
+ });
+}
+
+module$1('zones', {
+ 'setup': function () {
+ test.expectedDeprecations('moment().zone');
+ }
+});
+
+test('set zone', function (assert) {
+ var zone = moment();
+
+ zone.zone(0);
+ assert.equal(zone.zone(), 0, 'should be able to set the zone to 0');
+
+ zone.zone(60);
+ assert.equal(zone.zone(), 60, 'should be able to set the zone to 60');
+
+ zone.zone(-60);
+ assert.equal(zone.zone(), -60, 'should be able to set the zone to -60');
+});
+
+test('set zone shorthand', function (assert) {
+ var zone = moment();
+
+ zone.zone(1);
+ assert.equal(zone.zone(), 60, 'setting the zone to 1 should imply hours and convert to 60');
+
+ zone.zone(-1);
+ assert.equal(zone.zone(), -60, 'setting the zone to -1 should imply hours and convert to -60');
+
+ zone.zone(15);
+ assert.equal(zone.zone(), 900, 'setting the zone to 15 should imply hours and convert to 900');
+
+ zone.zone(-15);
+ assert.equal(zone.zone(), -900, 'setting the zone to -15 should imply hours and convert to -900');
+
+ zone.zone(16);
+ assert.equal(zone.zone(), 16, 'setting the zone to 16 should imply minutes');
+
+ zone.zone(-16);
+ assert.equal(zone.zone(), -16, 'setting the zone to -16 should imply minutes');
+});
+
+test('set zone with string', function (assert) {
+ var zone = moment();
+
+ zone.zone('+00:00');
+ assert.equal(zone.zone(), 0, 'set the zone with a timezone string');
+
+ zone.zone('2013-03-07T07:00:00-08:00');
+ assert.equal(zone.zone(), 480, 'set the zone with a string that does not begin with the timezone');
+
+ zone.zone('2013-03-07T07:00:00+0100');
+ assert.equal(zone.zone(), -60, 'set the zone with a string that uses the +0000 syntax');
+
+ zone.zone('2013-03-07T07:00:00+02');
+ assert.equal(zone.zone(), -120, 'set the zone with a string that uses the +00 syntax');
+
+ zone.zone('03-07-2013T07:00:00-08:00');
+ assert.equal(zone.zone(), 480, 'set the zone with a string with a non-ISO 8601 date');
+});
+
+test('change hours when changing the zone', function (assert) {
+ var zone = moment.utc([2000, 0, 1, 6]);
+
+ zone.zone(0);
+ assert.equal(zone.hour(), 6, 'UTC 6AM should be 6AM at +0000');
+
+ zone.zone(60);
+ assert.equal(zone.hour(), 5, 'UTC 6AM should be 5AM at -0100');
+
+ zone.zone(-60);
+ assert.equal(zone.hour(), 7, 'UTC 6AM should be 7AM at +0100');
+});
+
+test('change minutes when changing the zone', function (assert) {
+ var zone = moment.utc([2000, 0, 1, 6, 31]);
+
+ zone.zone(0);
+ assert.equal(zone.format('HH:mm'), '06:31', 'UTC 6:31AM should be 6:31AM at +0000');
+
+ zone.zone(30);
+ assert.equal(zone.format('HH:mm'), '06:01', 'UTC 6:31AM should be 6:01AM at -0030');
+
+ zone.zone(-30);
+ assert.equal(zone.format('HH:mm'), '07:01', 'UTC 6:31AM should be 7:01AM at +0030');
+
+ zone.zone(1380);
+ assert.equal(zone.format('HH:mm'), '07:31', 'UTC 6:31AM should be 7:31AM at +1380');
+});
+
+test('distance from the unix epoch', function (assert) {
+ var zoneA = moment(),
+ zoneB = moment(zoneA),
+ zoneC = moment(zoneA),
+ zoneD = moment(zoneA),
+ zoneE = moment(zoneA);
+
+ zoneB.utc();
+ assert.equal(+zoneA, +zoneB, 'moment should equal moment.utc');
+
+ zoneC.zone(-60);
+ assert.equal(+zoneA, +zoneC, 'moment should equal moment.zone(-60)');
+
+ zoneD.zone(480);
+ assert.equal(+zoneA, +zoneD, 'moment should equal moment.zone(480)');
+
+ zoneE.zone(1000);
+ assert.equal(+zoneA, +zoneE, 'moment should equal moment.zone(1000)');
+});
+
+test('update offset after changing any values', function (assert) {
+ var oldOffset = moment.updateOffset,
+ m = moment.utc([2000, 6, 1]);
+
+ moment.updateOffset = function (mom, keepTime) {
+ if (mom.__doChange) {
+ if (+mom > 962409600000) {
+ mom.zone(120, keepTime);
+ } else {
+ mom.zone(60, keepTime);
+ }
+ }
+ };
+
+ assert.equal(m.format('ZZ'), '+0000', 'should be at +0000');
+ assert.equal(m.format('HH:mm'), '00:00', 'should start 12AM at +0000 timezone');
+
+ m.__doChange = true;
+ m.add(1, 'h');
+
+ assert.equal(m.format('ZZ'), '-0200', 'should be at -0200');
+ assert.equal(m.format('HH:mm'), '23:00', '1AM at +0000 should be 11PM at -0200 timezone');
+
+ m.subtract(1, 'h');
+
+ assert.equal(m.format('ZZ'), '-0100', 'should be at -0100');
+ assert.equal(m.format('HH:mm'), '23:00', '12AM at +0000 should be 11PM at -0100 timezone');
+
+ moment.updateOffset = oldOffset;
+});
+
+test('getters and setters', function (assert) {
+ var a = moment([2011, 5, 20]);
+
+ assert.equal(a.clone().zone(120).year(2012).year(), 2012, 'should get and set year correctly');
+ assert.equal(a.clone().zone(120).month(1).month(), 1, 'should get and set month correctly');
+ assert.equal(a.clone().zone(120).date(2).date(), 2, 'should get and set date correctly');
+ assert.equal(a.clone().zone(120).day(1).day(), 1, 'should get and set day correctly');
+ assert.equal(a.clone().zone(120).hour(1).hour(), 1, 'should get and set hour correctly');
+ assert.equal(a.clone().zone(120).minute(1).minute(), 1, 'should get and set minute correctly');
+});
+
+test('getters', function (assert) {
+ var a = moment.utc([2012, 0, 1, 0, 0, 0]);
+
+ assert.equal(a.clone().zone(120).year(), 2011, 'should get year correctly');
+ assert.equal(a.clone().zone(120).month(), 11, 'should get month correctly');
+ assert.equal(a.clone().zone(120).date(), 31, 'should get date correctly');
+ assert.equal(a.clone().zone(120).hour(), 22, 'should get hour correctly');
+ assert.equal(a.clone().zone(120).minute(), 0, 'should get minute correctly');
+
+ assert.equal(a.clone().zone(-120).year(), 2012, 'should get year correctly');
+ assert.equal(a.clone().zone(-120).month(), 0, 'should get month correctly');
+ assert.equal(a.clone().zone(-120).date(), 1, 'should get date correctly');
+ assert.equal(a.clone().zone(-120).hour(), 2, 'should get hour correctly');
+ assert.equal(a.clone().zone(-120).minute(), 0, 'should get minute correctly');
+
+ assert.equal(a.clone().zone(-90).year(), 2012, 'should get year correctly');
+ assert.equal(a.clone().zone(-90).month(), 0, 'should get month correctly');
+ assert.equal(a.clone().zone(-90).date(), 1, 'should get date correctly');
+ assert.equal(a.clone().zone(-90).hour(), 1, 'should get hour correctly');
+ assert.equal(a.clone().zone(-90).minute(), 30, 'should get minute correctly');
+});
+
+test('from', function (assert) {
+ var zoneA = moment(),
+ zoneB = moment(zoneA).zone(720),
+ zoneC = moment(zoneA).zone(360),
+ zoneD = moment(zoneA).zone(-690),
+ other = moment(zoneA).add(35, 'm');
+
+ assert.equal(zoneA.from(other), zoneB.from(other), 'moment#from should be the same in all zones');
+ assert.equal(zoneA.from(other), zoneC.from(other), 'moment#from should be the same in all zones');
+ assert.equal(zoneA.from(other), zoneD.from(other), 'moment#from should be the same in all zones');
+});
+
+test('diff', function (assert) {
+ var zoneA = moment(),
+ zoneB = moment(zoneA).zone(720),
+ zoneC = moment(zoneA).zone(360),
+ zoneD = moment(zoneA).zone(-690),
+ other = moment(zoneA).add(35, 'm');
+
+ assert.equal(zoneA.diff(other), zoneB.diff(other), 'moment#diff should be the same in all zones');
+ assert.equal(zoneA.diff(other), zoneC.diff(other), 'moment#diff should be the same in all zones');
+ assert.equal(zoneA.diff(other), zoneD.diff(other), 'moment#diff should be the same in all zones');
+
+ assert.equal(zoneA.diff(other, 'minute', true), zoneB.diff(other, 'minute', true), 'moment#diff should be the same in all zones');
+ assert.equal(zoneA.diff(other, 'minute', true), zoneC.diff(other, 'minute', true), 'moment#diff should be the same in all zones');
+ assert.equal(zoneA.diff(other, 'minute', true), zoneD.diff(other, 'minute', true), 'moment#diff should be the same in all zones');
+
+ assert.equal(zoneA.diff(other, 'hour', true), zoneB.diff(other, 'hour', true), 'moment#diff should be the same in all zones');
+ assert.equal(zoneA.diff(other, 'hour', true), zoneC.diff(other, 'hour', true), 'moment#diff should be the same in all zones');
+ assert.equal(zoneA.diff(other, 'hour', true), zoneD.diff(other, 'hour', true), 'moment#diff should be the same in all zones');
+});
+
+test('unix offset and timestamp', function (assert) {
+ var zoneA = moment(),
+ zoneB = moment(zoneA).zone(720),
+ zoneC = moment(zoneA).zone(360),
+ zoneD = moment(zoneA).zone(-690);
+
+ assert.equal(zoneA.unix(), zoneB.unix(), 'moment#unix should be the same in all zones');
+ assert.equal(zoneA.unix(), zoneC.unix(), 'moment#unix should be the same in all zones');
+ assert.equal(zoneA.unix(), zoneD.unix(), 'moment#unix should be the same in all zones');
+
+ assert.equal(+zoneA, +zoneB, 'moment#valueOf should be the same in all zones');
+ assert.equal(+zoneA, +zoneC, 'moment#valueOf should be the same in all zones');
+ assert.equal(+zoneA, +zoneD, 'moment#valueOf should be the same in all zones');
+});
+
+test('cloning', function (assert) {
+ assert.equal(moment().zone(120).clone().zone(), 120, 'explicit cloning should retain the zone');
+ assert.equal(moment().zone(-120).clone().zone(), -120, 'explicit cloning should retain the zone');
+ assert.equal(moment(moment().zone(120)).zone(), 120, 'implicit cloning should retain the zone');
+ assert.equal(moment(moment().zone(-120)).zone(), -120, 'implicit cloning should retain the zone');
+});
+
+test('start of / end of', function (assert) {
+ var a = moment.utc([2010, 1, 2, 0, 0, 0]).zone(450);
+
+ assert.equal(a.clone().startOf('day').hour(), 0, 'start of day should work on moments with a zone');
+ assert.equal(a.clone().startOf('day').minute(), 0, 'start of day should work on moments with a zone');
+ assert.equal(a.clone().startOf('hour').minute(), 0, 'start of hour should work on moments with a zone');
+
+ assert.equal(a.clone().endOf('day').hour(), 23, 'end of day should work on moments with a zone');
+ assert.equal(a.clone().endOf('day').minute(), 59, 'end of day should work on moments with a zone');
+ assert.equal(a.clone().endOf('hour').minute(), 59, 'end of hour should work on moments with a zone');
+});
+
+test('reset zone with moment#utc', function (assert) {
+ var a = moment.utc([2012]).zone(480);
+
+ assert.equal(a.clone().hour(), 16, 'different zone should have different hour');
+ assert.equal(a.clone().utc().hour(), 0, 'calling moment#utc should reset the offset');
+});
+
+test('reset zone with moment#local', function (assert) {
+ var a = moment([2012]).zone(480);
+
+ assert.equal(a.clone().local().hour(), 0, 'calling moment#local should reset the offset');
+});
+
+test('toDate', function (assert) {
+ var zoneA = new Date(),
+ zoneB = moment(zoneA).zone(720).toDate(),
+ zoneC = moment(zoneA).zone(360).toDate(),
+ zoneD = moment(zoneA).zone(-690).toDate();
+
+ assert.equal(+zoneA, +zoneB, 'moment#toDate should output a date with the right unix timestamp');
+ assert.equal(+zoneA, +zoneC, 'moment#toDate should output a date with the right unix timestamp');
+ assert.equal(+zoneA, +zoneD, 'moment#toDate should output a date with the right unix timestamp');
+});
+
+test('same / before / after', function (assert) {
+ var zoneA = moment().utc(),
+ zoneB = moment(zoneA).zone(120),
+ zoneC = moment(zoneA).zone(-120);
+
+ assert.ok(zoneA.isSame(zoneB), 'two moments with different offsets should be the same');
+ assert.ok(zoneA.isSame(zoneC), 'two moments with different offsets should be the same');
+
+ assert.ok(zoneA.isSame(zoneB, 'hour'), 'two moments with different offsets should be the same hour');
+ assert.ok(zoneA.isSame(zoneC, 'hour'), 'two moments with different offsets should be the same hour');
+
+ zoneA.add(1, 'hour');
+
+ assert.ok(zoneA.isAfter(zoneB), 'isAfter should work with two moments with different offsets');
+ assert.ok(zoneA.isAfter(zoneC), 'isAfter should work with two moments with different offsets');
+
+ assert.ok(zoneA.isAfter(zoneB, 'hour'), 'isAfter:hour should work with two moments with different offsets');
+ assert.ok(zoneA.isAfter(zoneC, 'hour'), 'isAfter:hour should work with two moments with different offsets');
+
+ zoneA.subtract(2, 'hour');
+
+ assert.ok(zoneA.isBefore(zoneB), 'isBefore should work with two moments with different offsets');
+ assert.ok(zoneA.isBefore(zoneC), 'isBefore should work with two moments with different offsets');
+
+ assert.ok(zoneA.isBefore(zoneB, 'hour'), 'isBefore:hour should work with two moments with different offsets');
+ assert.ok(zoneA.isBefore(zoneC, 'hour'), 'isBefore:hour should work with two moments with different offsets');
+});
+
+test('add / subtract over dst', function (assert) {
+ var oldOffset = moment.updateOffset,
+ m = moment.utc([2000, 2, 31, 3]);
+
+ moment.updateOffset = function (mom, keepTime) {
+ if (mom.clone().utc().month() > 2) {
+ mom.zone(-60, keepTime);
+ } else {
+ mom.zone(0, keepTime);
+ }
+ };
+
+ assert.equal(m.hour(), 3, 'should start at 00:00');
+
+ m.add(24, 'hour');
+
+ assert.equal(m.hour(), 4, 'adding 24 hours should disregard dst');
+
+ m.subtract(24, 'hour');
+
+ assert.equal(m.hour(), 3, 'subtracting 24 hours should disregard dst');
+
+ m.add(1, 'day');
+
+ assert.equal(m.hour(), 3, 'adding 1 day should have the same hour');
+
+ m.subtract(1, 'day');
+
+ assert.equal(m.hour(), 3, 'subtracting 1 day should have the same hour');
+
+ m.add(1, 'month');
+
+ assert.equal(m.hour(), 3, 'adding 1 month should have the same hour');
+
+ m.subtract(1, 'month');
+
+ assert.equal(m.hour(), 3, 'subtracting 1 month should have the same hour');
+
+ moment.updateOffset = oldOffset;
+});
+
+test('isDST', function (assert) {
+ var oldOffset = moment.updateOffset;
+
+ moment.updateOffset = function (mom, keepTime) {
+ if (mom.month() > 2 && mom.month() < 9) {
+ mom.zone(-60, keepTime);
+ } else {
+ mom.zone(0, keepTime);
+ }
+ };
+
+ assert.ok(!moment().month(0).isDST(), 'Jan should not be summer dst');
+ assert.ok(moment().month(6).isDST(), 'Jul should be summer dst');
+ assert.ok(!moment().month(11).isDST(), 'Dec should not be summer dst');
+
+ moment.updateOffset = function (mom) {
+ if (mom.month() > 2 && mom.month() < 9) {
+ mom.zone(0);
+ } else {
+ mom.zone(-60);
+ }
+ };
+
+ assert.ok(moment().month(0).isDST(), 'Jan should be winter dst');
+ assert.ok(!moment().month(6).isDST(), 'Jul should not be winter dst');
+ assert.ok(moment().month(11).isDST(), 'Dec should be winter dst');
+
+ moment.updateOffset = oldOffset;
+});
+
+test('zone names', function (assert) {
+ test.expectedDeprecations();
+ assert.equal(moment().zoneAbbr(), '', 'Local zone abbr should be empty');
+ assert.equal(moment().format('z'), '', 'Local zone formatted abbr should be empty');
+ assert.equal(moment().zoneName(), '', 'Local zone name should be empty');
+ assert.equal(moment().format('zz'), '', 'Local zone formatted name should be empty');
+
+ assert.equal(moment.utc().zoneAbbr(), 'UTC', 'UTC zone abbr should be UTC');
+ assert.equal(moment.utc().format('z'), 'UTC', 'UTC zone formatted abbr should be UTC');
+ assert.equal(moment.utc().zoneName(), 'Coordinated Universal Time', 'UTC zone abbr should be Coordinated Universal Time');
+ assert.equal(moment.utc().format('zz'), 'Coordinated Universal Time', 'UTC zone formatted abbr should be Coordinated Universal Time');
+});
+
+test('hours alignment with UTC', function (assert) {
+ assert.equal(moment().zone(120).hasAlignedHourOffset(), true);
+ assert.equal(moment().zone(-180).hasAlignedHourOffset(), true);
+ assert.equal(moment().zone(90).hasAlignedHourOffset(), false);
+ assert.equal(moment().zone(-90).hasAlignedHourOffset(), false);
+});
+
+test('hours alignment with other zone', function (assert) {
+ var m = moment().zone(120);
+
+ assert.equal(m.hasAlignedHourOffset(moment().zone(180)), true);
+ assert.equal(m.hasAlignedHourOffset(moment().zone(-180)), true);
+ assert.equal(m.hasAlignedHourOffset(moment().zone(90)), false);
+ assert.equal(m.hasAlignedHourOffset(moment().zone(-90)), false);
+
+ m = moment().zone(90);
+
+ assert.equal(m.hasAlignedHourOffset(moment().zone(180)), false);
+ assert.equal(m.hasAlignedHourOffset(moment().zone(-180)), false);
+ assert.equal(m.hasAlignedHourOffset(moment().zone(30)), true);
+ assert.equal(m.hasAlignedHourOffset(moment().zone(-30)), true);
+
+ m = moment().zone(-60);
+
+ assert.equal(m.hasAlignedHourOffset(moment().zone(180)), true);
+ assert.equal(m.hasAlignedHourOffset(moment().zone(-180)), true);
+ assert.equal(m.hasAlignedHourOffset(moment().zone(90)), false);
+ assert.equal(m.hasAlignedHourOffset(moment().zone(-90)), false);
+
+ m = moment().zone(25);
+
+ assert.equal(m.hasAlignedHourOffset(moment().zone(-35)), true);
+ assert.equal(m.hasAlignedHourOffset(moment().zone(85)), true);
+
+ assert.equal(m.hasAlignedHourOffset(moment().zone(35)), false);
+ assert.equal(m.hasAlignedHourOffset(moment().zone(-85)), false);
+});
+
+test('parse zone', function (assert) {
+ var m = moment('2013-01-01T00:00:00-13:00').parseZone();
+ assert.equal(m.zone(), 13 * 60);
+ assert.equal(m.hours(), 0);
+});
+
+test('parse zone static', function (assert) {
+ var m = moment.parseZone('2013-01-01T00:00:00-13:00');
+ assert.equal(m.zone(), 13 * 60);
+ assert.equal(m.hours(), 0);
+});
+
+test('parse zone with more arguments', function (assert) {
+ test.expectedDeprecations();
+ var m;
+ m = moment.parseZone('2013 01 01 05 -13:00', 'YYYY MM DD HH ZZ');
+ assert.equal(m.format(), '2013-01-01T05:00:00-13:00', 'accept input and format');
+ m = moment.parseZone('2013-01-01-13:00', 'YYYY MM DD ZZ', true);
+ assert.equal(m.isValid(), false, 'accept input, format and strict flag');
+ m = moment.parseZone('2013-01-01-13:00', ['DD MM YYYY ZZ', 'YYYY MM DD ZZ']);
+ assert.equal(m.format(), '2013-01-01T00:00:00-13:00', 'accept input and array of formats');
+});
+
+test('parse zone with a timezone from the format string', function (assert) {
+ var m = moment('11-12-2013 -0400 +1100', 'DD-MM-YYYY ZZ #####').parseZone();
+
+ assert.equal(m.zone(), 4 * 60);
+});
+
+test('parse zone without a timezone included in the format string', function (assert) {
+ var m = moment('11-12-2013 -0400 +1100', 'DD-MM-YYYY').parseZone();
+
+ assert.equal(m.zone(), -11 * 60);
+});
+
+test('timezone format', function (assert) {
+ assert.equal(moment().zone(-60).format('ZZ'), '+0100', '-60 -> +0100');
+ assert.equal(moment().zone(-90).format('ZZ'), '+0130', '-90 -> +0130');
+ assert.equal(moment().zone(-120).format('ZZ'), '+0200', '-120 -> +0200');
+
+ assert.equal(moment().zone(+60).format('ZZ'), '-0100', '+60 -> -0100');
+ assert.equal(moment().zone(+90).format('ZZ'), '-0130', '+90 -> -0130');
+ assert.equal(moment().zone(+120).format('ZZ'), '-0200', '+120 -> -0200');
+});
+
+test('parse zone without a timezone', function (assert) {
+ test.expectedDeprecations();
+ var m1 = moment.parseZone('2016-02-01T00:00:00');
+ var m2 = moment.parseZone('2016-02-01T00:00:00Z');
+ var m3 = moment.parseZone('2016-02-01T00:00:00+00:00'); //Someone might argue this is not necessary, you could even argue that is wrong being here.
+ var m4 = moment.parseZone('2016-02-01T00:00:00+0000'); //Someone might argue this is not necessary, you could even argue that is wrong being here.
+ assert.equal(
+ m1.format('M D YYYY HH:mm:ss ZZ'),
+ '2 1 2016 00:00:00 +0000',
+ 'Not providing a timezone should keep the time and change the zone to 0'
+ );
+ assert.equal(
+ m2.format('M D YYYY HH:mm:ss ZZ'),
+ '2 1 2016 00:00:00 +0000',
+ 'Not providing a timezone should keep the time and change the zone to 0'
+ );
+ assert.equal(
+ m3.format('M D YYYY HH:mm:ss ZZ'),
+ '2 1 2016 00:00:00 +0000',
+ 'Not providing a timezone should keep the time and change the zone to 0'
+ );
+ assert.equal(
+ m4.format('M D YYYY HH:mm:ss ZZ'),
+ '2 1 2016 00:00:00 +0000',
+ 'Not providing a timezone should keep the time and change the zone to 0'
+ );
+});
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/moment.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/moment.d.ts
new file mode 100644
index 00000000000..2234ea7318f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/moment.d.ts
@@ -0,0 +1,708 @@
+declare function moment(inp?: moment.MomentInput, format?: moment.MomentFormatSpecification, strict?: boolean): moment.Moment;
+declare function moment(inp?: moment.MomentInput, format?: moment.MomentFormatSpecification, language?: string, strict?: boolean): moment.Moment;
+
+declare namespace moment {
+ type RelativeTimeKey = 's' | 'm' | 'mm' | 'h' | 'hh' | 'd' | 'dd' | 'M' | 'MM' | 'y' | 'yy';
+ type CalendarKey = 'sameDay' | 'nextDay' | 'lastDay' | 'nextWeek' | 'lastWeek' | 'sameElse' | string;
+ type LongDateFormatKey = 'LTS' | 'LT' | 'L' | 'LL' | 'LLL' | 'LLLL' | 'lts' | 'lt' | 'l' | 'll' | 'lll' | 'llll';
+
+ interface Locale {
+ calendar(key?: CalendarKey, m?: Moment, now?: Moment): string;
+
+ longDateFormat(key: LongDateFormatKey): string;
+ invalidDate(): string;
+ ordinal(n: number): string;
+
+ preparse(inp: string): string;
+ postformat(inp: string): string;
+ relativeTime(n: number, withoutSuffix: boolean,
+ key: RelativeTimeKey, isFuture: boolean): string;
+ pastFuture(diff: number, absRelTime: string): string;
+ set(config: Object): void;
+
+ months(): string[];
+ months(m: Moment, format?: string): string;
+ monthsShort(): string[];
+ monthsShort(m: Moment, format?: string): string;
+ monthsParse(monthName: string, format: string, strict: boolean): number;
+ monthsRegex(strict: boolean): RegExp;
+ monthsShortRegex(strict: boolean): RegExp;
+
+ week(m: Moment): number;
+ firstDayOfYear(): number;
+ firstDayOfWeek(): number;
+
+ weekdays(): string[];
+ weekdays(m: Moment, format?: string): string;
+ weekdaysMin(): string[];
+ weekdaysMin(m: Moment): string;
+ weekdaysShort(): string[];
+ weekdaysShort(m: Moment): string;
+ weekdaysParse(weekdayName: string, format: string, strict: boolean): number;
+ weekdaysRegex(strict: boolean): RegExp;
+ weekdaysShortRegex(strict: boolean): RegExp;
+ weekdaysMinRegex(strict: boolean): RegExp;
+
+ isPM(input: string): boolean;
+ meridiem(hour: number, minute: number, isLower: boolean): string;
+ }
+
+ interface StandaloneFormatSpec {
+ format: string[];
+ standalone: string[];
+ isFormat?: RegExp;
+ }
+
+ interface WeekSpec {
+ dow: number;
+ doy: number;
+ }
+
+ type CalendarSpecVal = string | ((m?: Moment, now?: Moment) => string);
+ interface CalendarSpec {
+ sameDay?: CalendarSpecVal;
+ nextDay?: CalendarSpecVal;
+ lastDay?: CalendarSpecVal;
+ nextWeek?: CalendarSpecVal;
+ lastWeek?: CalendarSpecVal;
+ sameElse?: CalendarSpecVal;
+
+ // any additional properties might be used with moment.calendarFormat
+ [x: string]: CalendarSpecVal | void; // undefined
+ }
+
+ type RelativeTimeSpecVal = (
+ string |
+ ((n: number, withoutSuffix: boolean,
+ key: RelativeTimeKey, isFuture: boolean) => string)
+ );
+ type RelativeTimeFuturePastVal = string | ((relTime: string) => string);
+
+ interface RelativeTimeSpec {
+ future: RelativeTimeFuturePastVal;
+ past: RelativeTimeFuturePastVal;
+ s: RelativeTimeSpecVal;
+ m: RelativeTimeSpecVal;
+ mm: RelativeTimeSpecVal;
+ h: RelativeTimeSpecVal;
+ hh: RelativeTimeSpecVal;
+ d: RelativeTimeSpecVal;
+ dd: RelativeTimeSpecVal;
+ M: RelativeTimeSpecVal;
+ MM: RelativeTimeSpecVal;
+ y: RelativeTimeSpecVal;
+ yy: RelativeTimeSpecVal;
+ }
+
+ interface LongDateFormatSpec {
+ LTS: string;
+ LT: string;
+ L: string;
+ LL: string;
+ LLL: string;
+ LLLL: string;
+
+ // lets forget for a sec that any upper/lower permutation will also work
+ lts?: string;
+ lt?: string;
+ l?: string;
+ ll?: string;
+ lll?: string;
+ llll?: string;
+ }
+
+ type MonthWeekdayFn = (momentToFormat: Moment, format?: string) => string;
+ type WeekdaySimpleFn = (momentToFormat: Moment) => string;
+
+ interface LocaleSpecification {
+ months?: string[] | StandaloneFormatSpec | MonthWeekdayFn;
+ monthsShort?: string[] | StandaloneFormatSpec | MonthWeekdayFn;
+
+ weekdays?: string[] | StandaloneFormatSpec | MonthWeekdayFn;
+ weekdaysShort?: string[] | StandaloneFormatSpec | WeekdaySimpleFn;
+ weekdaysMin?: string[] | StandaloneFormatSpec | WeekdaySimpleFn;
+
+ meridiemParse?: RegExp;
+ meridiem?: (hour: number, minute:number, isLower: boolean) => string;
+
+ isPM?: (input: string) => boolean;
+
+ longDateFormat?: LongDateFormatSpec;
+ calendar?: CalendarSpec;
+ relativeTime?: RelativeTimeSpec;
+ invalidDate?: string;
+ ordinal?: (n: number) => string;
+ ordinalParse?: RegExp;
+
+ week?: WeekSpec;
+
+ // Allow anything: in general any property that is passed as locale spec is
+ // put in the locale object so it can be used by locale functions
+ [x: string]: any;
+ }
+
+ interface MomentObjectOutput {
+ years: number;
+ /* One digit */
+ months: number;
+ /* Day of the month */
+ date: number;
+ hours: number;
+ minutes: number;
+ seconds: number;
+ milliseconds: number;
+ }
+
+ interface Duration {
+ humanize(withSuffix?: boolean): string;
+
+ abs(): Duration;
+
+ as(units: unitOfTime.Base): number;
+ get(units: unitOfTime.Base): number;
+
+ milliseconds(): number;
+ asMilliseconds(): number;
+
+ seconds(): number;
+ asSeconds(): number;
+
+ minutes(): number;
+ asMinutes(): number;
+
+ hours(): number;
+ asHours(): number;
+
+ days(): number;
+ asDays(): number;
+
+ weeks(): number;
+ asWeeks(): number;
+
+ months(): number;
+ asMonths(): number;
+
+ years(): number;
+ asYears(): number;
+
+ add(inp?: DurationInputArg1, unit?: DurationInputArg2): Duration;
+ subtract(inp?: DurationInputArg1, unit?: DurationInputArg2): Duration;
+
+ locale(): string;
+ locale(locale: LocaleSpecifier): Duration;
+ localeData(): Locale;
+
+ toISOString(): string;
+ toJSON(): string;
+
+ /**
+ * @deprecated since version 2.8.0
+ */
+ lang(locale: LocaleSpecifier): Moment;
+ /**
+ * @deprecated since version 2.8.0
+ */
+ lang(): Locale;
+ /**
+ * @deprecated
+ */
+ toIsoString(): string;
+ }
+
+ interface MomentRelativeTime {
+ future: any;
+ past: any;
+ s: any;
+ m: any;
+ mm: any;
+ h: any;
+ hh: any;
+ d: any;
+ dd: any;
+ M: any;
+ MM: any;
+ y: any;
+ yy: any;
+ }
+
+ interface MomentLongDateFormat {
+ L: string;
+ LL: string;
+ LLL: string;
+ LLLL: string;
+ LT: string;
+ LTS: string;
+
+ l?: string;
+ ll?: string;
+ lll?: string;
+ llll?: string;
+ lt?: string;
+ lts?: string;
+ }
+
+ interface MomentParsingFlags {
+ empty: boolean;
+ unusedTokens: string[];
+ unusedInput: string[];
+ overflow: number;
+ charsLeftOver: number;
+ nullInput: boolean;
+ invalidMonth: string | void; // null
+ invalidFormat: boolean;
+ userInvalidated: boolean;
+ iso: boolean;
+ parsedDateParts: any[];
+ meridiem: string | void; // null
+ }
+
+ interface MomentParsingFlagsOpt {
+ empty?: boolean;
+ unusedTokens?: string[];
+ unusedInput?: string[];
+ overflow?: number;
+ charsLeftOver?: number;
+ nullInput?: boolean;
+ invalidMonth?: string;
+ invalidFormat?: boolean;
+ userInvalidated?: boolean;
+ iso?: boolean;
+ parsedDateParts?: any[];
+ meridiem?: string;
+ }
+
+ interface MomentBuiltinFormat {
+ __momentBuiltinFormatBrand: any;
+ }
+
+ type MomentFormatSpecification = string | MomentBuiltinFormat | (string | MomentBuiltinFormat)[];
+
+ namespace unitOfTime {
+ type Base = (
+ "year" | "years" | "y" |
+ "month" | "months" | "M" |
+ "week" | "weeks" | "w" |
+ "day" | "days" | "d" |
+ "hour" | "hours" | "h" |
+ "minute" | "minutes" | "m" |
+ "second" | "seconds" | "s" |
+ "millisecond" | "milliseconds" | "ms"
+ );
+
+ type _quarter = "quarter" | "quarters" | "Q";
+ type _isoWeek = "isoWeek" | "isoWeeks" | "W";
+ type _date = "date" | "dates" | "D";
+ type DurationConstructor = Base | _quarter;
+
+ type DurationAs = Base;
+
+ type StartOf = Base | _quarter | _isoWeek | _date;
+
+ type Diff = Base | _quarter;
+
+ type MomentConstructor = Base | _date;
+
+ type All = Base | _quarter | _isoWeek | _date |
+ "weekYear" | "weekYears" | "gg" |
+ "isoWeekYear" | "isoWeekYears" | "GG" |
+ "dayOfYear" | "dayOfYears" | "DDD" |
+ "weekday" | "weekdays" | "e" |
+ "isoWeekday" | "isoWeekdays" | "E";
+ }
+
+ interface MomentInputObject {
+ years?: number;
+ year?: number;
+ y?: number;
+
+ months?: number;
+ month?: number;
+ M?: number;
+
+ days?: number;
+ day?: number;
+ d?: number;
+
+ dates?: number;
+ date?: number;
+ D?: number;
+
+ hours?: number;
+ hour?: number;
+ h?: number;
+
+ minutes?: number;
+ minute?: number;
+ m?: number;
+
+ seconds?: number;
+ second?: number;
+ s?: number;
+
+ milliseconds?: number;
+ millisecond?: number;
+ ms?: number;
+ }
+
+ interface DurationInputObject extends MomentInputObject {
+ quarters?: number;
+ quarter?: number;
+ Q?: number;
+ }
+
+ interface MomentSetObject extends MomentInputObject {
+ weekYears?: number;
+ weekYear?: number;
+ gg?: number;
+
+ isoWeekYears?: number;
+ isoWeekYear?: number;
+ GG?: number;
+
+ quarters?: number;
+ quarter?: number;
+ Q?: number;
+
+ weeks?: number;
+ week?: number;
+ w?: number;
+
+ isoWeeks?: number;
+ isoWeek?: number;
+ W?: number;
+
+ dayOfYears?: number;
+ dayOfYear?: number;
+ DDD?: number;
+
+ weekdays?: number;
+ weekday?: number;
+ e?: number;
+
+ isoWeekdays?: number;
+ isoWeekday?: number;
+ E?: number;
+ }
+
+ interface FromTo {
+ from: MomentInput;
+ to: MomentInput;
+ }
+
+ type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined
+ type DurationInputArg1 = Duration | number | string | FromTo | DurationInputObject | void; // null | undefined
+ type DurationInputArg2 = unitOfTime.DurationConstructor;
+ type LocaleSpecifier = string | Moment | Duration | string[];
+
+ interface MomentCreationData {
+ input: string;
+ format: string;
+ locale: Locale;
+ isUTC: boolean;
+ strict: boolean;
+ }
+
+ interface Moment {
+ format(format?: string): string;
+
+ startOf(unitOfTime: unitOfTime.StartOf): Moment;
+ endOf(unitOfTime: unitOfTime.StartOf): Moment;
+
+ add(amount?: DurationInputArg1, unit?: DurationInputArg2): Moment;
+ /**
+ * @deprecated reverse syntax
+ */
+ add(unit: unitOfTime.DurationConstructor, amount: number|string): Moment;
+
+ subtract(amount?: DurationInputArg1, unit?: DurationInputArg2): Moment;
+ /**
+ * @deprecated reverse syntax
+ */
+ subtract(unit: unitOfTime.DurationConstructor, amount: number|string): Moment;
+
+ calendar(time?: MomentInput, formats?: CalendarSpec): string;
+
+ clone(): Moment;
+
+ /**
+ * @return Unix timestamp in milliseconds
+ */
+ valueOf(): number;
+
+ // current date/time in local mode
+ local(keepLocalTime?: boolean): Moment;
+ isLocal(): boolean;
+
+ // current date/time in UTC mode
+ utc(keepLocalTime?: boolean): Moment;
+ isUTC(): boolean;
+ /**
+ * @deprecated use isUTC
+ */
+ isUtc(): boolean;
+
+ parseZone(): Moment;
+ isValid(): boolean;
+ invalidAt(): number;
+
+ hasAlignedHourOffset(other?: MomentInput): boolean;
+
+ creationData(): MomentCreationData;
+ parsingFlags(): MomentParsingFlags;
+
+ year(y: number): Moment;
+ year(): number;
+ /**
+ * @deprecated use year(y)
+ */
+ years(y: number): Moment;
+ /**
+ * @deprecated use year()
+ */
+ years(): number;
+ quarter(): number;
+ quarter(q: number): Moment;
+ quarters(): number;
+ quarters(q: number): Moment;
+ month(M: number|string): Moment;
+ month(): number;
+ /**
+ * @deprecated use month(M)
+ */
+ months(M: number|string): Moment;
+ /**
+ * @deprecated use month()
+ */
+ months(): number;
+ day(d: number|string): Moment;
+ day(): number;
+ days(d: number|string): Moment;
+ days(): number;
+ date(d: number): Moment;
+ date(): number;
+ /**
+ * @deprecated use date(d)
+ */
+ dates(d: number): Moment;
+ /**
+ * @deprecated use date()
+ */
+ dates(): number;
+ hour(h: number): Moment;
+ hour(): number;
+ hours(h: number): Moment;
+ hours(): number;
+ minute(m: number): Moment;
+ minute(): number;
+ minutes(m: number): Moment;
+ minutes(): number;
+ second(s: number): Moment;
+ second(): number;
+ seconds(s: number): Moment;
+ seconds(): number;
+ millisecond(ms: number): Moment;
+ millisecond(): number;
+ milliseconds(ms: number): Moment;
+ milliseconds(): number;
+ weekday(): number;
+ weekday(d: number): Moment;
+ isoWeekday(): number;
+ isoWeekday(d: number|string): Moment;
+ weekYear(): number;
+ weekYear(d: number): Moment;
+ isoWeekYear(): number;
+ isoWeekYear(d: number): Moment;
+ week(): number;
+ week(d: number): Moment;
+ weeks(): number;
+ weeks(d: number): Moment;
+ isoWeek(): number;
+ isoWeek(d: number): Moment;
+ isoWeeks(): number;
+ isoWeeks(d: number): Moment;
+ weeksInYear(): number;
+ isoWeeksInYear(): number;
+ dayOfYear(): number;
+ dayOfYear(d: number): Moment;
+
+ from(inp: MomentInput, suffix?: boolean): string;
+ to(inp: MomentInput, suffix?: boolean): string;
+ fromNow(withoutSuffix?: boolean): string;
+ toNow(withoutPrefix?: boolean): string;
+
+ diff(b: MomentInput, unitOfTime?: unitOfTime.Diff, precise?: boolean): number;
+
+ toArray(): number[];
+ toDate(): Date;
+ toISOString(): string;
+ inspect(): string;
+ toJSON(): string;
+ unix(): number;
+
+ isLeapYear(): boolean;
+ /**
+ * @deprecated in favor of utcOffset
+ */
+ zone(): number;
+ zone(b: number|string): Moment;
+ utcOffset(): number;
+ utcOffset(b: number|string, keepLocalTime?: boolean): Moment;
+ isUTCOffset(): boolean;
+ daysInMonth(): number;
+ isDST(): boolean;
+
+ zoneAbbr(): string;
+ zoneName(): string;
+
+ isBefore(inp?: MomentInput, granularity?: unitOfTime.StartOf): boolean;
+ isAfter(inp?: MomentInput, granularity?: unitOfTime.StartOf): boolean;
+ isSame(inp?: MomentInput, granularity?: unitOfTime.StartOf): boolean;
+ isSameOrAfter(inp?: MomentInput, granularity?: unitOfTime.StartOf): boolean;
+ isSameOrBefore(inp?: MomentInput, granularity?: unitOfTime.StartOf): boolean;
+ isBetween(a: MomentInput, b: MomentInput, granularity?: unitOfTime.StartOf, inclusivity?: "()" | "[)" | "(]" | "[]"): boolean;
+
+ /**
+ * @deprecated as of 2.8.0, use locale
+ */
+ lang(language: LocaleSpecifier): Moment;
+ /**
+ * @deprecated as of 2.8.0, use locale
+ */
+ lang(): Locale;
+
+ locale(): string;
+ locale(locale: LocaleSpecifier): Moment;
+
+ localeData(): Locale;
+
+ /**
+ * @deprecated no reliable implementation
+ */
+ isDSTShifted(): boolean;
+
+ // NOTE(constructor): Same as moment constructor
+ /**
+ * @deprecated as of 2.7.0, use moment.min/max
+ */
+ max(inp?: MomentInput, format?: MomentFormatSpecification, strict?: boolean): Moment;
+ /**
+ * @deprecated as of 2.7.0, use moment.min/max
+ */
+ max(inp?: MomentInput, format?: MomentFormatSpecification, language?: string, strict?: boolean): Moment;
+
+ // NOTE(constructor): Same as moment constructor
+ /**
+ * @deprecated as of 2.7.0, use moment.min/max
+ */
+ min(inp?: MomentInput, format?: MomentFormatSpecification, strict?: boolean): Moment;
+ /**
+ * @deprecated as of 2.7.0, use moment.min/max
+ */
+ min(inp?: MomentInput, format?: MomentFormatSpecification, language?: string, strict?: boolean): Moment;
+
+ get(unit: unitOfTime.All): number;
+ set(unit: unitOfTime.All, value: number): Moment;
+ set(objectLiteral: MomentSetObject): Moment;
+
+ toObject(): MomentObjectOutput;
+ }
+
+ export var version: string;
+ export var fn: Moment;
+
+ // NOTE(constructor): Same as moment constructor
+ export function utc(inp?: MomentInput, format?: MomentFormatSpecification, strict?: boolean): Moment;
+ export function utc(inp?: MomentInput, format?: MomentFormatSpecification, language?: string, strict?: boolean): Moment;
+
+ export function unix(timestamp: number): Moment;
+
+ export function invalid(flags?: MomentParsingFlagsOpt): Moment;
+ export function isMoment(m: any): m is Moment;
+ export function isDate(m: any): m is Date;
+ export function isDuration(d: any): d is Duration;
+
+ /**
+ * @deprecated in 2.8.0
+ */
+ export function lang(language?: string): string;
+ /**
+ * @deprecated in 2.8.0
+ */
+ export function lang(language?: string, definition?: Locale): string;
+
+ export function locale(language?: string): string;
+ export function locale(language?: string[]): string;
+ export function locale(language?: string, definition?: LocaleSpecification | void): string; // null | undefined
+
+ export function localeData(key?: string | string[]): Locale;
+
+ export function duration(inp?: DurationInputArg1, unit?: DurationInputArg2): Duration;
+
+ // NOTE(constructor): Same as moment constructor
+ export function parseZone(inp?: MomentInput, format?: MomentFormatSpecification, strict?: boolean): Moment;
+ export function parseZone(inp?: MomentInput, format?: MomentFormatSpecification, language?: string, strict?: boolean): Moment;
+
+ export function months(): string[];
+ export function months(index: number): string;
+ export function months(format: string): string[];
+ export function months(format: string, index: number): string;
+ export function monthsShort(): string[];
+ export function monthsShort(index: number): string;
+ export function monthsShort(format: string): string[];
+ export function monthsShort(format: string, index: number): string;
+
+ export function weekdays(): string[];
+ export function weekdays(index: number): string;
+ export function weekdays(format: string): string[];
+ export function weekdays(format: string, index: number): string;
+ export function weekdays(localeSorted: boolean): string[];
+ export function weekdays(localeSorted: boolean, index: number): string;
+ export function weekdays(localeSorted: boolean, format: string): string[];
+ export function weekdays(localeSorted: boolean, format: string, index: number): string;
+ export function weekdaysShort(): string[];
+ export function weekdaysShort(index: number): string;
+ export function weekdaysShort(format: string): string[];
+ export function weekdaysShort(format: string, index: number): string;
+ export function weekdaysShort(localeSorted: boolean): string[];
+ export function weekdaysShort(localeSorted: boolean, index: number): string;
+ export function weekdaysShort(localeSorted: boolean, format: string): string[];
+ export function weekdaysShort(localeSorted: boolean, format: string, index: number): string;
+ export function weekdaysMin(): string[];
+ export function weekdaysMin(index: number): string;
+ export function weekdaysMin(format: string): string[];
+ export function weekdaysMin(format: string, index: number): string;
+ export function weekdaysMin(localeSorted: boolean): string[];
+ export function weekdaysMin(localeSorted: boolean, index: number): string;
+ export function weekdaysMin(localeSorted: boolean, format: string): string[];
+ export function weekdaysMin(localeSorted: boolean, format: string, index: number): string;
+
+ export function min(...moments: MomentInput[]): Moment;
+ export function max(...moments: MomentInput[]): Moment;
+
+ /**
+ * Returns unix time in milliseconds. Overwrite for profit.
+ */
+ export function now(): number;
+
+ export function defineLocale(language: string, localeSpec: LocaleSpecification | void): Locale; // null
+ export function updateLocale(language: string, localeSpec: LocaleSpecification | void): Locale; // null
+
+ export function locales(): string[];
+
+ export function normalizeUnits(unit: unitOfTime.All): string;
+ export function relativeTimeThreshold(threshold: string): number | boolean;
+ export function relativeTimeThreshold(threshold: string, limit: number): boolean;
+ export function relativeTimeRounding(fn: (num: number) => number): boolean;
+ export function relativeTimeRounding(): (num: number) => number;
+ export function calendarFormat(m: Moment, now: Moment): string;
+
+ /**
+ * Constant used to enable explicit ISO_8601 format parsing.
+ */
+ export var ISO_8601: MomentBuiltinFormat;
+
+ export var defaultFormat: string;
+ export var defaultFormatUtc: string;
+}
+
+export = moment;
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/moment.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/moment.js
new file mode 100644
index 00000000000..f2269a1c444
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/moment.js
@@ -0,0 +1,4301 @@
+//! moment.js
+//! version : 2.17.1
+//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
+//! license : MIT
+//! momentjs.com
+
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ global.moment = factory()
+}(this, (function () { 'use strict';
+
+var hookCallback;
+
+function hooks () {
+ return hookCallback.apply(null, arguments);
+}
+
+// This is done to register the method called with moment()
+// without creating circular dependencies.
+function setHookCallback (callback) {
+ hookCallback = callback;
+}
+
+function isArray(input) {
+ return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';
+}
+
+function isObject(input) {
+ // IE8 will treat undefined and null as object if it wasn't for
+ // input != null
+ return input != null && Object.prototype.toString.call(input) === '[object Object]';
+}
+
+function isObjectEmpty(obj) {
+ var k;
+ for (k in obj) {
+ // even if its not own property I'd still call it non-empty
+ return false;
+ }
+ return true;
+}
+
+function isNumber(input) {
+ return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';
+}
+
+function isDate(input) {
+ return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';
+}
+
+function map(arr, fn) {
+ var res = [], i;
+ for (i = 0; i < arr.length; ++i) {
+ res.push(fn(arr[i], i));
+ }
+ return res;
+}
+
+function hasOwnProp(a, b) {
+ return Object.prototype.hasOwnProperty.call(a, b);
+}
+
+function extend(a, b) {
+ for (var i in b) {
+ if (hasOwnProp(b, i)) {
+ a[i] = b[i];
+ }
+ }
+
+ if (hasOwnProp(b, 'toString')) {
+ a.toString = b.toString;
+ }
+
+ if (hasOwnProp(b, 'valueOf')) {
+ a.valueOf = b.valueOf;
+ }
+
+ return a;
+}
+
+function createUTC (input, format, locale, strict) {
+ return createLocalOrUTC(input, format, locale, strict, true).utc();
+}
+
+function defaultParsingFlags() {
+ // We need to deep clone this object.
+ return {
+ empty : false,
+ unusedTokens : [],
+ unusedInput : [],
+ overflow : -2,
+ charsLeftOver : 0,
+ nullInput : false,
+ invalidMonth : null,
+ invalidFormat : false,
+ userInvalidated : false,
+ iso : false,
+ parsedDateParts : [],
+ meridiem : null
+ };
+}
+
+function getParsingFlags(m) {
+ if (m._pf == null) {
+ m._pf = defaultParsingFlags();
+ }
+ return m._pf;
+}
+
+var some;
+if (Array.prototype.some) {
+ some = Array.prototype.some;
+} else {
+ some = function (fun) {
+ var t = Object(this);
+ var len = t.length >>> 0;
+
+ for (var i = 0; i < len; i++) {
+ if (i in t && fun.call(this, t[i], i, t)) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+}
+
+var some$1 = some;
+
+function isValid(m) {
+ if (m._isValid == null) {
+ var flags = getParsingFlags(m);
+ var parsedParts = some$1.call(flags.parsedDateParts, function (i) {
+ return i != null;
+ });
+ var isNowValid = !isNaN(m._d.getTime()) &&
+ flags.overflow < 0 &&
+ !flags.empty &&
+ !flags.invalidMonth &&
+ !flags.invalidWeekday &&
+ !flags.nullInput &&
+ !flags.invalidFormat &&
+ !flags.userInvalidated &&
+ (!flags.meridiem || (flags.meridiem && parsedParts));
+
+ if (m._strict) {
+ isNowValid = isNowValid &&
+ flags.charsLeftOver === 0 &&
+ flags.unusedTokens.length === 0 &&
+ flags.bigHour === undefined;
+ }
+
+ if (Object.isFrozen == null || !Object.isFrozen(m)) {
+ m._isValid = isNowValid;
+ }
+ else {
+ return isNowValid;
+ }
+ }
+ return m._isValid;
+}
+
+function createInvalid (flags) {
+ var m = createUTC(NaN);
+ if (flags != null) {
+ extend(getParsingFlags(m), flags);
+ }
+ else {
+ getParsingFlags(m).userInvalidated = true;
+ }
+
+ return m;
+}
+
+function isUndefined(input) {
+ return input === void 0;
+}
+
+// Plugins that add properties should also add the key here (null value),
+// so we can properly clone ourselves.
+var momentProperties = hooks.momentProperties = [];
+
+function copyConfig(to, from) {
+ var i, prop, val;
+
+ if (!isUndefined(from._isAMomentObject)) {
+ to._isAMomentObject = from._isAMomentObject;
+ }
+ if (!isUndefined(from._i)) {
+ to._i = from._i;
+ }
+ if (!isUndefined(from._f)) {
+ to._f = from._f;
+ }
+ if (!isUndefined(from._l)) {
+ to._l = from._l;
+ }
+ if (!isUndefined(from._strict)) {
+ to._strict = from._strict;
+ }
+ if (!isUndefined(from._tzm)) {
+ to._tzm = from._tzm;
+ }
+ if (!isUndefined(from._isUTC)) {
+ to._isUTC = from._isUTC;
+ }
+ if (!isUndefined(from._offset)) {
+ to._offset = from._offset;
+ }
+ if (!isUndefined(from._pf)) {
+ to._pf = getParsingFlags(from);
+ }
+ if (!isUndefined(from._locale)) {
+ to._locale = from._locale;
+ }
+
+ if (momentProperties.length > 0) {
+ for (i in momentProperties) {
+ prop = momentProperties[i];
+ val = from[prop];
+ if (!isUndefined(val)) {
+ to[prop] = val;
+ }
+ }
+ }
+
+ return to;
+}
+
+var updateInProgress = false;
+
+// Moment prototype object
+function Moment(config) {
+ copyConfig(this, config);
+ this._d = new Date(config._d != null ? config._d.getTime() : NaN);
+ if (!this.isValid()) {
+ this._d = new Date(NaN);
+ }
+ // Prevent infinite loop in case updateOffset creates new moment
+ // objects.
+ if (updateInProgress === false) {
+ updateInProgress = true;
+ hooks.updateOffset(this);
+ updateInProgress = false;
+ }
+}
+
+function isMoment (obj) {
+ return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);
+}
+
+function absFloor (number) {
+ if (number < 0) {
+ // -0 -> 0
+ return Math.ceil(number) || 0;
+ } else {
+ return Math.floor(number);
+ }
+}
+
+function toInt(argumentForCoercion) {
+ var coercedNumber = +argumentForCoercion,
+ value = 0;
+
+ if (coercedNumber !== 0 && isFinite(coercedNumber)) {
+ value = absFloor(coercedNumber);
+ }
+
+ return value;
+}
+
+// compare two arrays, return the number of differences
+function compareArrays(array1, array2, dontConvert) {
+ var len = Math.min(array1.length, array2.length),
+ lengthDiff = Math.abs(array1.length - array2.length),
+ diffs = 0,
+ i;
+ for (i = 0; i < len; i++) {
+ if ((dontConvert && array1[i] !== array2[i]) ||
+ (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
+ diffs++;
+ }
+ }
+ return diffs + lengthDiff;
+}
+
+function warn(msg) {
+ if (hooks.suppressDeprecationWarnings === false &&
+ (typeof console !== 'undefined') && console.warn) {
+ console.warn('Deprecation warning: ' + msg);
+ }
+}
+
+function deprecate(msg, fn) {
+ var firstTime = true;
+
+ return extend(function () {
+ if (hooks.deprecationHandler != null) {
+ hooks.deprecationHandler(null, msg);
+ }
+ if (firstTime) {
+ var args = [];
+ var arg;
+ for (var i = 0; i < arguments.length; i++) {
+ arg = '';
+ if (typeof arguments[i] === 'object') {
+ arg += '\n[' + i + '] ';
+ for (var key in arguments[0]) {
+ arg += key + ': ' + arguments[0][key] + ', ';
+ }
+ arg = arg.slice(0, -2); // Remove trailing comma and space
+ } else {
+ arg = arguments[i];
+ }
+ args.push(arg);
+ }
+ warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack);
+ firstTime = false;
+ }
+ return fn.apply(this, arguments);
+ }, fn);
+}
+
+var deprecations = {};
+
+function deprecateSimple(name, msg) {
+ if (hooks.deprecationHandler != null) {
+ hooks.deprecationHandler(name, msg);
+ }
+ if (!deprecations[name]) {
+ warn(msg);
+ deprecations[name] = true;
+ }
+}
+
+hooks.suppressDeprecationWarnings = false;
+hooks.deprecationHandler = null;
+
+function isFunction(input) {
+ return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';
+}
+
+function set (config) {
+ var prop, i;
+ for (i in config) {
+ prop = config[i];
+ if (isFunction(prop)) {
+ this[i] = prop;
+ } else {
+ this['_' + i] = prop;
+ }
+ }
+ this._config = config;
+ // Lenient ordinal parsing accepts just a number in addition to
+ // number + (possibly) stuff coming from _ordinalParseLenient.
+ this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\d{1,2}/).source);
+}
+
+function mergeConfigs(parentConfig, childConfig) {
+ var res = extend({}, parentConfig), prop;
+ for (prop in childConfig) {
+ if (hasOwnProp(childConfig, prop)) {
+ if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
+ res[prop] = {};
+ extend(res[prop], parentConfig[prop]);
+ extend(res[prop], childConfig[prop]);
+ } else if (childConfig[prop] != null) {
+ res[prop] = childConfig[prop];
+ } else {
+ delete res[prop];
+ }
+ }
+ }
+ for (prop in parentConfig) {
+ if (hasOwnProp(parentConfig, prop) &&
+ !hasOwnProp(childConfig, prop) &&
+ isObject(parentConfig[prop])) {
+ // make sure changes to properties don't modify parent config
+ res[prop] = extend({}, res[prop]);
+ }
+ }
+ return res;
+}
+
+function Locale(config) {
+ if (config != null) {
+ this.set(config);
+ }
+}
+
+var keys;
+
+if (Object.keys) {
+ keys = Object.keys;
+} else {
+ keys = function (obj) {
+ var i, res = [];
+ for (i in obj) {
+ if (hasOwnProp(obj, i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ };
+}
+
+var keys$1 = keys;
+
+var defaultCalendar = {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+};
+
+function calendar (key, mom, now) {
+ var output = this._calendar[key] || this._calendar['sameElse'];
+ return isFunction(output) ? output.call(mom, now) : output;
+}
+
+var defaultLongDateFormat = {
+ LTS : 'h:mm:ss A',
+ LT : 'h:mm A',
+ L : 'MM/DD/YYYY',
+ LL : 'MMMM D, YYYY',
+ LLL : 'MMMM D, YYYY h:mm A',
+ LLLL : 'dddd, MMMM D, YYYY h:mm A'
+};
+
+function longDateFormat (key) {
+ var format = this._longDateFormat[key],
+ formatUpper = this._longDateFormat[key.toUpperCase()];
+
+ if (format || !formatUpper) {
+ return format;
+ }
+
+ this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {
+ return val.slice(1);
+ });
+
+ return this._longDateFormat[key];
+}
+
+var defaultInvalidDate = 'Invalid date';
+
+function invalidDate () {
+ return this._invalidDate;
+}
+
+var defaultOrdinal = '%d';
+var defaultOrdinalParse = /\d{1,2}/;
+
+function ordinal (number) {
+ return this._ordinal.replace('%d', number);
+}
+
+var defaultRelativeTime = {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+};
+
+function relativeTime (number, withoutSuffix, string, isFuture) {
+ var output = this._relativeTime[string];
+ return (isFunction(output)) ?
+ output(number, withoutSuffix, string, isFuture) :
+ output.replace(/%d/i, number);
+}
+
+function pastFuture (diff, output) {
+ var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
+ return isFunction(format) ? format(output) : format.replace(/%s/i, output);
+}
+
+var aliases = {};
+
+function addUnitAlias (unit, shorthand) {
+ var lowerCase = unit.toLowerCase();
+ aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
+}
+
+function normalizeUnits(units) {
+ return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;
+}
+
+function normalizeObjectUnits(inputObject) {
+ var normalizedInput = {},
+ normalizedProp,
+ prop;
+
+ for (prop in inputObject) {
+ if (hasOwnProp(inputObject, prop)) {
+ normalizedProp = normalizeUnits(prop);
+ if (normalizedProp) {
+ normalizedInput[normalizedProp] = inputObject[prop];
+ }
+ }
+ }
+
+ return normalizedInput;
+}
+
+var priorities = {};
+
+function addUnitPriority(unit, priority) {
+ priorities[unit] = priority;
+}
+
+function getPrioritizedUnits(unitsObj) {
+ var units = [];
+ for (var u in unitsObj) {
+ units.push({unit: u, priority: priorities[u]});
+ }
+ units.sort(function (a, b) {
+ return a.priority - b.priority;
+ });
+ return units;
+}
+
+function makeGetSet (unit, keepTime) {
+ return function (value) {
+ if (value != null) {
+ set$1(this, unit, value);
+ hooks.updateOffset(this, keepTime);
+ return this;
+ } else {
+ return get(this, unit);
+ }
+ };
+}
+
+function get (mom, unit) {
+ return mom.isValid() ?
+ mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;
+}
+
+function set$1 (mom, unit, value) {
+ if (mom.isValid()) {
+ mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
+ }
+}
+
+// MOMENTS
+
+function stringGet (units) {
+ units = normalizeUnits(units);
+ if (isFunction(this[units])) {
+ return this[units]();
+ }
+ return this;
+}
+
+
+function stringSet (units, value) {
+ if (typeof units === 'object') {
+ units = normalizeObjectUnits(units);
+ var prioritized = getPrioritizedUnits(units);
+ for (var i = 0; i < prioritized.length; i++) {
+ this[prioritized[i].unit](units[prioritized[i].unit]);
+ }
+ } else {
+ units = normalizeUnits(units);
+ if (isFunction(this[units])) {
+ return this[units](value);
+ }
+ }
+ return this;
+}
+
+function zeroFill(number, targetLength, forceSign) {
+ var absNumber = '' + Math.abs(number),
+ zerosToFill = targetLength - absNumber.length,
+ sign = number >= 0;
+ return (sign ? (forceSign ? '+' : '') : '-') +
+ Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;
+}
+
+var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;
+
+var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;
+
+var formatFunctions = {};
+
+var formatTokenFunctions = {};
+
+// token: 'M'
+// padded: ['MM', 2]
+// ordinal: 'Mo'
+// callback: function () { this.month() + 1 }
+function addFormatToken (token, padded, ordinal, callback) {
+ var func = callback;
+ if (typeof callback === 'string') {
+ func = function () {
+ return this[callback]();
+ };
+ }
+ if (token) {
+ formatTokenFunctions[token] = func;
+ }
+ if (padded) {
+ formatTokenFunctions[padded[0]] = function () {
+ return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
+ };
+ }
+ if (ordinal) {
+ formatTokenFunctions[ordinal] = function () {
+ return this.localeData().ordinal(func.apply(this, arguments), token);
+ };
+ }
+}
+
+function removeFormattingTokens(input) {
+ if (input.match(/\[[\s\S]/)) {
+ return input.replace(/^\[|\]$/g, '');
+ }
+ return input.replace(/\\/g, '');
+}
+
+function makeFormatFunction(format) {
+ var array = format.match(formattingTokens), i, length;
+
+ for (i = 0, length = array.length; i < length; i++) {
+ if (formatTokenFunctions[array[i]]) {
+ array[i] = formatTokenFunctions[array[i]];
+ } else {
+ array[i] = removeFormattingTokens(array[i]);
+ }
+ }
+
+ return function (mom) {
+ var output = '', i;
+ for (i = 0; i < length; i++) {
+ output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];
+ }
+ return output;
+ };
+}
+
+// format date using native date object
+function formatMoment(m, format) {
+ if (!m.isValid()) {
+ return m.localeData().invalidDate();
+ }
+
+ format = expandFormat(format, m.localeData());
+ formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);
+
+ return formatFunctions[format](m);
+}
+
+function expandFormat(format, locale) {
+ var i = 5;
+
+ function replaceLongDateFormatTokens(input) {
+ return locale.longDateFormat(input) || input;
+ }
+
+ localFormattingTokens.lastIndex = 0;
+ while (i >= 0 && localFormattingTokens.test(format)) {
+ format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
+ localFormattingTokens.lastIndex = 0;
+ i -= 1;
+ }
+
+ return format;
+}
+
+var match1 = /\d/; // 0 - 9
+var match2 = /\d\d/; // 00 - 99
+var match3 = /\d{3}/; // 000 - 999
+var match4 = /\d{4}/; // 0000 - 9999
+var match6 = /[+-]?\d{6}/; // -999999 - 999999
+var match1to2 = /\d\d?/; // 0 - 99
+var match3to4 = /\d\d\d\d?/; // 999 - 9999
+var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999
+var match1to3 = /\d{1,3}/; // 0 - 999
+var match1to4 = /\d{1,4}/; // 0 - 9999
+var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999
+
+var matchUnsigned = /\d+/; // 0 - inf
+var matchSigned = /[+-]?\d+/; // -inf - inf
+
+var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z
+var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z
+
+var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123
+
+// any word (or two) characters or numbers including two/three word month in arabic.
+// includes scottish gaelic two word and hyphenated months
+var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i;
+
+
+var regexes = {};
+
+function addRegexToken (token, regex, strictRegex) {
+ regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {
+ return (isStrict && strictRegex) ? strictRegex : regex;
+ };
+}
+
+function getParseRegexForToken (token, config) {
+ if (!hasOwnProp(regexes, token)) {
+ return new RegExp(unescapeFormat(token));
+ }
+
+ return regexes[token](config._strict, config._locale);
+}
+
+// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
+function unescapeFormat(s) {
+ return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
+ return p1 || p2 || p3 || p4;
+ }));
+}
+
+function regexEscape(s) {
+ return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
+}
+
+var tokens = {};
+
+function addParseToken (token, callback) {
+ var i, func = callback;
+ if (typeof token === 'string') {
+ token = [token];
+ }
+ if (isNumber(callback)) {
+ func = function (input, array) {
+ array[callback] = toInt(input);
+ };
+ }
+ for (i = 0; i < token.length; i++) {
+ tokens[token[i]] = func;
+ }
+}
+
+function addWeekParseToken (token, callback) {
+ addParseToken(token, function (input, array, config, token) {
+ config._w = config._w || {};
+ callback(input, config._w, config, token);
+ });
+}
+
+function addTimeToArrayFromToken(token, input, config) {
+ if (input != null && hasOwnProp(tokens, token)) {
+ tokens[token](input, config._a, config, token);
+ }
+}
+
+var YEAR = 0;
+var MONTH = 1;
+var DATE = 2;
+var HOUR = 3;
+var MINUTE = 4;
+var SECOND = 5;
+var MILLISECOND = 6;
+var WEEK = 7;
+var WEEKDAY = 8;
+
+var indexOf;
+
+if (Array.prototype.indexOf) {
+ indexOf = Array.prototype.indexOf;
+} else {
+ indexOf = function (o) {
+ // I know
+ var i;
+ for (i = 0; i < this.length; ++i) {
+ if (this[i] === o) {
+ return i;
+ }
+ }
+ return -1;
+ };
+}
+
+var indexOf$1 = indexOf;
+
+function daysInMonth(year, month) {
+ return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
+}
+
+// FORMATTING
+
+addFormatToken('M', ['MM', 2], 'Mo', function () {
+ return this.month() + 1;
+});
+
+addFormatToken('MMM', 0, 0, function (format) {
+ return this.localeData().monthsShort(this, format);
+});
+
+addFormatToken('MMMM', 0, 0, function (format) {
+ return this.localeData().months(this, format);
+});
+
+// ALIASES
+
+addUnitAlias('month', 'M');
+
+// PRIORITY
+
+addUnitPriority('month', 8);
+
+// PARSING
+
+addRegexToken('M', match1to2);
+addRegexToken('MM', match1to2, match2);
+addRegexToken('MMM', function (isStrict, locale) {
+ return locale.monthsShortRegex(isStrict);
+});
+addRegexToken('MMMM', function (isStrict, locale) {
+ return locale.monthsRegex(isStrict);
+});
+
+addParseToken(['M', 'MM'], function (input, array) {
+ array[MONTH] = toInt(input) - 1;
+});
+
+addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
+ var month = config._locale.monthsParse(input, token, config._strict);
+ // if we didn't find a month name, mark the date as invalid.
+ if (month != null) {
+ array[MONTH] = month;
+ } else {
+ getParsingFlags(config).invalidMonth = input;
+ }
+});
+
+// LOCALES
+
+var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/;
+var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');
+function localeMonths (m, format) {
+ if (!m) {
+ return this._months;
+ }
+ return isArray(this._months) ? this._months[m.month()] :
+ this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];
+}
+
+var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
+function localeMonthsShort (m, format) {
+ if (!m) {
+ return this._monthsShort;
+ }
+ return isArray(this._monthsShort) ? this._monthsShort[m.month()] :
+ this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];
+}
+
+function handleStrictParse(monthName, format, strict) {
+ var i, ii, mom, llc = monthName.toLocaleLowerCase();
+ if (!this._monthsParse) {
+ // this is not used
+ this._monthsParse = [];
+ this._longMonthsParse = [];
+ this._shortMonthsParse = [];
+ for (i = 0; i < 12; ++i) {
+ mom = createUTC([2000, i]);
+ this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();
+ this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
+ }
+ }
+
+ if (strict) {
+ if (format === 'MMM') {
+ ii = indexOf$1.call(this._shortMonthsParse, llc);
+ return ii !== -1 ? ii : null;
+ } else {
+ ii = indexOf$1.call(this._longMonthsParse, llc);
+ return ii !== -1 ? ii : null;
+ }
+ } else {
+ if (format === 'MMM') {
+ ii = indexOf$1.call(this._shortMonthsParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf$1.call(this._longMonthsParse, llc);
+ return ii !== -1 ? ii : null;
+ } else {
+ ii = indexOf$1.call(this._longMonthsParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf$1.call(this._shortMonthsParse, llc);
+ return ii !== -1 ? ii : null;
+ }
+ }
+}
+
+function localeMonthsParse (monthName, format, strict) {
+ var i, mom, regex;
+
+ if (this._monthsParseExact) {
+ return handleStrictParse.call(this, monthName, format, strict);
+ }
+
+ if (!this._monthsParse) {
+ this._monthsParse = [];
+ this._longMonthsParse = [];
+ this._shortMonthsParse = [];
+ }
+
+ // TODO: add sorting
+ // Sorting makes sure if one month (or abbr) is a prefix of another
+ // see sorting in computeMonthsParse
+ for (i = 0; i < 12; i++) {
+ // make the regex if we don't have it already
+ mom = createUTC([2000, i]);
+ if (strict && !this._longMonthsParse[i]) {
+ this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');
+ this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');
+ }
+ if (!strict && !this._monthsParse[i]) {
+ regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
+ this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
+ }
+ // test the regex
+ if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {
+ return i;
+ } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {
+ return i;
+ } else if (!strict && this._monthsParse[i].test(monthName)) {
+ return i;
+ }
+ }
+}
+
+// MOMENTS
+
+function setMonth (mom, value) {
+ var dayOfMonth;
+
+ if (!mom.isValid()) {
+ // No op
+ return mom;
+ }
+
+ if (typeof value === 'string') {
+ if (/^\d+$/.test(value)) {
+ value = toInt(value);
+ } else {
+ value = mom.localeData().monthsParse(value);
+ // TODO: Another silent failure?
+ if (!isNumber(value)) {
+ return mom;
+ }
+ }
+ }
+
+ dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
+ mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
+ return mom;
+}
+
+function getSetMonth (value) {
+ if (value != null) {
+ setMonth(this, value);
+ hooks.updateOffset(this, true);
+ return this;
+ } else {
+ return get(this, 'Month');
+ }
+}
+
+function getDaysInMonth () {
+ return daysInMonth(this.year(), this.month());
+}
+
+var defaultMonthsShortRegex = matchWord;
+function monthsShortRegex (isStrict) {
+ if (this._monthsParseExact) {
+ if (!hasOwnProp(this, '_monthsRegex')) {
+ computeMonthsParse.call(this);
+ }
+ if (isStrict) {
+ return this._monthsShortStrictRegex;
+ } else {
+ return this._monthsShortRegex;
+ }
+ } else {
+ if (!hasOwnProp(this, '_monthsShortRegex')) {
+ this._monthsShortRegex = defaultMonthsShortRegex;
+ }
+ return this._monthsShortStrictRegex && isStrict ?
+ this._monthsShortStrictRegex : this._monthsShortRegex;
+ }
+}
+
+var defaultMonthsRegex = matchWord;
+function monthsRegex (isStrict) {
+ if (this._monthsParseExact) {
+ if (!hasOwnProp(this, '_monthsRegex')) {
+ computeMonthsParse.call(this);
+ }
+ if (isStrict) {
+ return this._monthsStrictRegex;
+ } else {
+ return this._monthsRegex;
+ }
+ } else {
+ if (!hasOwnProp(this, '_monthsRegex')) {
+ this._monthsRegex = defaultMonthsRegex;
+ }
+ return this._monthsStrictRegex && isStrict ?
+ this._monthsStrictRegex : this._monthsRegex;
+ }
+}
+
+function computeMonthsParse () {
+ function cmpLenRev(a, b) {
+ return b.length - a.length;
+ }
+
+ var shortPieces = [], longPieces = [], mixedPieces = [],
+ i, mom;
+ for (i = 0; i < 12; i++) {
+ // make the regex if we don't have it already
+ mom = createUTC([2000, i]);
+ shortPieces.push(this.monthsShort(mom, ''));
+ longPieces.push(this.months(mom, ''));
+ mixedPieces.push(this.months(mom, ''));
+ mixedPieces.push(this.monthsShort(mom, ''));
+ }
+ // Sorting makes sure if one month (or abbr) is a prefix of another it
+ // will match the longer piece.
+ shortPieces.sort(cmpLenRev);
+ longPieces.sort(cmpLenRev);
+ mixedPieces.sort(cmpLenRev);
+ for (i = 0; i < 12; i++) {
+ shortPieces[i] = regexEscape(shortPieces[i]);
+ longPieces[i] = regexEscape(longPieces[i]);
+ }
+ for (i = 0; i < 24; i++) {
+ mixedPieces[i] = regexEscape(mixedPieces[i]);
+ }
+
+ this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
+ this._monthsShortRegex = this._monthsRegex;
+ this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
+ this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
+}
+
+// FORMATTING
+
+addFormatToken('Y', 0, 0, function () {
+ var y = this.year();
+ return y <= 9999 ? '' + y : '+' + y;
+});
+
+addFormatToken(0, ['YY', 2], 0, function () {
+ return this.year() % 100;
+});
+
+addFormatToken(0, ['YYYY', 4], 0, 'year');
+addFormatToken(0, ['YYYYY', 5], 0, 'year');
+addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
+
+// ALIASES
+
+addUnitAlias('year', 'y');
+
+// PRIORITIES
+
+addUnitPriority('year', 1);
+
+// PARSING
+
+addRegexToken('Y', matchSigned);
+addRegexToken('YY', match1to2, match2);
+addRegexToken('YYYY', match1to4, match4);
+addRegexToken('YYYYY', match1to6, match6);
+addRegexToken('YYYYYY', match1to6, match6);
+
+addParseToken(['YYYYY', 'YYYYYY'], YEAR);
+addParseToken('YYYY', function (input, array) {
+ array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
+});
+addParseToken('YY', function (input, array) {
+ array[YEAR] = hooks.parseTwoDigitYear(input);
+});
+addParseToken('Y', function (input, array) {
+ array[YEAR] = parseInt(input, 10);
+});
+
+// HELPERS
+
+function daysInYear(year) {
+ return isLeapYear(year) ? 366 : 365;
+}
+
+function isLeapYear(year) {
+ return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
+}
+
+// HOOKS
+
+hooks.parseTwoDigitYear = function (input) {
+ return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
+};
+
+// MOMENTS
+
+var getSetYear = makeGetSet('FullYear', true);
+
+function getIsLeapYear () {
+ return isLeapYear(this.year());
+}
+
+function createDate (y, m, d, h, M, s, ms) {
+ //can't just apply() to create a date:
+ //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
+ var date = new Date(y, m, d, h, M, s, ms);
+
+ //the date constructor remaps years 0-99 to 1900-1999
+ if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {
+ date.setFullYear(y);
+ }
+ return date;
+}
+
+function createUTCDate (y) {
+ var date = new Date(Date.UTC.apply(null, arguments));
+
+ //the Date.UTC function remaps years 0-99 to 1900-1999
+ if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {
+ date.setUTCFullYear(y);
+ }
+ return date;
+}
+
+// start-of-first-week - start-of-year
+function firstWeekOffset(year, dow, doy) {
+ var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
+ fwd = 7 + dow - doy,
+ // first-week day local weekday -- which local weekday is fwd
+ fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
+
+ return -fwdlw + fwd - 1;
+}
+
+//http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
+function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
+ var localWeekday = (7 + weekday - dow) % 7,
+ weekOffset = firstWeekOffset(year, dow, doy),
+ dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
+ resYear, resDayOfYear;
+
+ if (dayOfYear <= 0) {
+ resYear = year - 1;
+ resDayOfYear = daysInYear(resYear) + dayOfYear;
+ } else if (dayOfYear > daysInYear(year)) {
+ resYear = year + 1;
+ resDayOfYear = dayOfYear - daysInYear(year);
+ } else {
+ resYear = year;
+ resDayOfYear = dayOfYear;
+ }
+
+ return {
+ year: resYear,
+ dayOfYear: resDayOfYear
+ };
+}
+
+function weekOfYear(mom, dow, doy) {
+ var weekOffset = firstWeekOffset(mom.year(), dow, doy),
+ week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
+ resWeek, resYear;
+
+ if (week < 1) {
+ resYear = mom.year() - 1;
+ resWeek = week + weeksInYear(resYear, dow, doy);
+ } else if (week > weeksInYear(mom.year(), dow, doy)) {
+ resWeek = week - weeksInYear(mom.year(), dow, doy);
+ resYear = mom.year() + 1;
+ } else {
+ resYear = mom.year();
+ resWeek = week;
+ }
+
+ return {
+ week: resWeek,
+ year: resYear
+ };
+}
+
+function weeksInYear(year, dow, doy) {
+ var weekOffset = firstWeekOffset(year, dow, doy),
+ weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
+ return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
+}
+
+// FORMATTING
+
+addFormatToken('w', ['ww', 2], 'wo', 'week');
+addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
+
+// ALIASES
+
+addUnitAlias('week', 'w');
+addUnitAlias('isoWeek', 'W');
+
+// PRIORITIES
+
+addUnitPriority('week', 5);
+addUnitPriority('isoWeek', 5);
+
+// PARSING
+
+addRegexToken('w', match1to2);
+addRegexToken('ww', match1to2, match2);
+addRegexToken('W', match1to2);
+addRegexToken('WW', match1to2, match2);
+
+addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {
+ week[token.substr(0, 1)] = toInt(input);
+});
+
+// HELPERS
+
+// LOCALES
+
+function localeWeek (mom) {
+ return weekOfYear(mom, this._week.dow, this._week.doy).week;
+}
+
+var defaultLocaleWeek = {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+};
+
+function localeFirstDayOfWeek () {
+ return this._week.dow;
+}
+
+function localeFirstDayOfYear () {
+ return this._week.doy;
+}
+
+// MOMENTS
+
+function getSetWeek (input) {
+ var week = this.localeData().week(this);
+ return input == null ? week : this.add((input - week) * 7, 'd');
+}
+
+function getSetISOWeek (input) {
+ var week = weekOfYear(this, 1, 4).week;
+ return input == null ? week : this.add((input - week) * 7, 'd');
+}
+
+// FORMATTING
+
+addFormatToken('d', 0, 'do', 'day');
+
+addFormatToken('dd', 0, 0, function (format) {
+ return this.localeData().weekdaysMin(this, format);
+});
+
+addFormatToken('ddd', 0, 0, function (format) {
+ return this.localeData().weekdaysShort(this, format);
+});
+
+addFormatToken('dddd', 0, 0, function (format) {
+ return this.localeData().weekdays(this, format);
+});
+
+addFormatToken('e', 0, 0, 'weekday');
+addFormatToken('E', 0, 0, 'isoWeekday');
+
+// ALIASES
+
+addUnitAlias('day', 'd');
+addUnitAlias('weekday', 'e');
+addUnitAlias('isoWeekday', 'E');
+
+// PRIORITY
+addUnitPriority('day', 11);
+addUnitPriority('weekday', 11);
+addUnitPriority('isoWeekday', 11);
+
+// PARSING
+
+addRegexToken('d', match1to2);
+addRegexToken('e', match1to2);
+addRegexToken('E', match1to2);
+addRegexToken('dd', function (isStrict, locale) {
+ return locale.weekdaysMinRegex(isStrict);
+});
+addRegexToken('ddd', function (isStrict, locale) {
+ return locale.weekdaysShortRegex(isStrict);
+});
+addRegexToken('dddd', function (isStrict, locale) {
+ return locale.weekdaysRegex(isStrict);
+});
+
+addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
+ var weekday = config._locale.weekdaysParse(input, token, config._strict);
+ // if we didn't get a weekday name, mark the date as invalid
+ if (weekday != null) {
+ week.d = weekday;
+ } else {
+ getParsingFlags(config).invalidWeekday = input;
+ }
+});
+
+addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
+ week[token] = toInt(input);
+});
+
+// HELPERS
+
+function parseWeekday(input, locale) {
+ if (typeof input !== 'string') {
+ return input;
+ }
+
+ if (!isNaN(input)) {
+ return parseInt(input, 10);
+ }
+
+ input = locale.weekdaysParse(input);
+ if (typeof input === 'number') {
+ return input;
+ }
+
+ return null;
+}
+
+function parseIsoWeekday(input, locale) {
+ if (typeof input === 'string') {
+ return locale.weekdaysParse(input) % 7 || 7;
+ }
+ return isNaN(input) ? null : input;
+}
+
+// LOCALES
+
+var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');
+function localeWeekdays (m, format) {
+ if (!m) {
+ return this._weekdays;
+ }
+ return isArray(this._weekdays) ? this._weekdays[m.day()] :
+ this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];
+}
+
+var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');
+function localeWeekdaysShort (m) {
+ return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;
+}
+
+var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');
+function localeWeekdaysMin (m) {
+ return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;
+}
+
+function handleStrictParse$1(weekdayName, format, strict) {
+ var i, ii, mom, llc = weekdayName.toLocaleLowerCase();
+ if (!this._weekdaysParse) {
+ this._weekdaysParse = [];
+ this._shortWeekdaysParse = [];
+ this._minWeekdaysParse = [];
+
+ for (i = 0; i < 7; ++i) {
+ mom = createUTC([2000, 1]).day(i);
+ this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();
+ this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();
+ this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
+ }
+ }
+
+ if (strict) {
+ if (format === 'dddd') {
+ ii = indexOf$1.call(this._weekdaysParse, llc);
+ return ii !== -1 ? ii : null;
+ } else if (format === 'ddd') {
+ ii = indexOf$1.call(this._shortWeekdaysParse, llc);
+ return ii !== -1 ? ii : null;
+ } else {
+ ii = indexOf$1.call(this._minWeekdaysParse, llc);
+ return ii !== -1 ? ii : null;
+ }
+ } else {
+ if (format === 'dddd') {
+ ii = indexOf$1.call(this._weekdaysParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf$1.call(this._shortWeekdaysParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf$1.call(this._minWeekdaysParse, llc);
+ return ii !== -1 ? ii : null;
+ } else if (format === 'ddd') {
+ ii = indexOf$1.call(this._shortWeekdaysParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf$1.call(this._weekdaysParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf$1.call(this._minWeekdaysParse, llc);
+ return ii !== -1 ? ii : null;
+ } else {
+ ii = indexOf$1.call(this._minWeekdaysParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf$1.call(this._weekdaysParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf$1.call(this._shortWeekdaysParse, llc);
+ return ii !== -1 ? ii : null;
+ }
+ }
+}
+
+function localeWeekdaysParse (weekdayName, format, strict) {
+ var i, mom, regex;
+
+ if (this._weekdaysParseExact) {
+ return handleStrictParse$1.call(this, weekdayName, format, strict);
+ }
+
+ if (!this._weekdaysParse) {
+ this._weekdaysParse = [];
+ this._minWeekdaysParse = [];
+ this._shortWeekdaysParse = [];
+ this._fullWeekdaysParse = [];
+ }
+
+ for (i = 0; i < 7; i++) {
+ // make the regex if we don't have it already
+
+ mom = createUTC([2000, 1]).day(i);
+ if (strict && !this._fullWeekdaysParse[i]) {
+ this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i');
+ this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i');
+ this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i');
+ }
+ if (!this._weekdaysParse[i]) {
+ regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
+ this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
+ }
+ // test the regex
+ if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {
+ return i;
+ } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {
+ return i;
+ } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {
+ return i;
+ } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
+ return i;
+ }
+ }
+}
+
+// MOMENTS
+
+function getSetDayOfWeek (input) {
+ if (!this.isValid()) {
+ return input != null ? this : NaN;
+ }
+ var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
+ if (input != null) {
+ input = parseWeekday(input, this.localeData());
+ return this.add(input - day, 'd');
+ } else {
+ return day;
+ }
+}
+
+function getSetLocaleDayOfWeek (input) {
+ if (!this.isValid()) {
+ return input != null ? this : NaN;
+ }
+ var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
+ return input == null ? weekday : this.add(input - weekday, 'd');
+}
+
+function getSetISODayOfWeek (input) {
+ if (!this.isValid()) {
+ return input != null ? this : NaN;
+ }
+
+ // behaves the same as moment#day except
+ // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
+ // as a setter, sunday should belong to the previous week.
+
+ if (input != null) {
+ var weekday = parseIsoWeekday(input, this.localeData());
+ return this.day(this.day() % 7 ? weekday : weekday - 7);
+ } else {
+ return this.day() || 7;
+ }
+}
+
+var defaultWeekdaysRegex = matchWord;
+function weekdaysRegex (isStrict) {
+ if (this._weekdaysParseExact) {
+ if (!hasOwnProp(this, '_weekdaysRegex')) {
+ computeWeekdaysParse.call(this);
+ }
+ if (isStrict) {
+ return this._weekdaysStrictRegex;
+ } else {
+ return this._weekdaysRegex;
+ }
+ } else {
+ if (!hasOwnProp(this, '_weekdaysRegex')) {
+ this._weekdaysRegex = defaultWeekdaysRegex;
+ }
+ return this._weekdaysStrictRegex && isStrict ?
+ this._weekdaysStrictRegex : this._weekdaysRegex;
+ }
+}
+
+var defaultWeekdaysShortRegex = matchWord;
+function weekdaysShortRegex (isStrict) {
+ if (this._weekdaysParseExact) {
+ if (!hasOwnProp(this, '_weekdaysRegex')) {
+ computeWeekdaysParse.call(this);
+ }
+ if (isStrict) {
+ return this._weekdaysShortStrictRegex;
+ } else {
+ return this._weekdaysShortRegex;
+ }
+ } else {
+ if (!hasOwnProp(this, '_weekdaysShortRegex')) {
+ this._weekdaysShortRegex = defaultWeekdaysShortRegex;
+ }
+ return this._weekdaysShortStrictRegex && isStrict ?
+ this._weekdaysShortStrictRegex : this._weekdaysShortRegex;
+ }
+}
+
+var defaultWeekdaysMinRegex = matchWord;
+function weekdaysMinRegex (isStrict) {
+ if (this._weekdaysParseExact) {
+ if (!hasOwnProp(this, '_weekdaysRegex')) {
+ computeWeekdaysParse.call(this);
+ }
+ if (isStrict) {
+ return this._weekdaysMinStrictRegex;
+ } else {
+ return this._weekdaysMinRegex;
+ }
+ } else {
+ if (!hasOwnProp(this, '_weekdaysMinRegex')) {
+ this._weekdaysMinRegex = defaultWeekdaysMinRegex;
+ }
+ return this._weekdaysMinStrictRegex && isStrict ?
+ this._weekdaysMinStrictRegex : this._weekdaysMinRegex;
+ }
+}
+
+
+function computeWeekdaysParse () {
+ function cmpLenRev(a, b) {
+ return b.length - a.length;
+ }
+
+ var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],
+ i, mom, minp, shortp, longp;
+ for (i = 0; i < 7; i++) {
+ // make the regex if we don't have it already
+ mom = createUTC([2000, 1]).day(i);
+ minp = this.weekdaysMin(mom, '');
+ shortp = this.weekdaysShort(mom, '');
+ longp = this.weekdays(mom, '');
+ minPieces.push(minp);
+ shortPieces.push(shortp);
+ longPieces.push(longp);
+ mixedPieces.push(minp);
+ mixedPieces.push(shortp);
+ mixedPieces.push(longp);
+ }
+ // Sorting makes sure if one weekday (or abbr) is a prefix of another it
+ // will match the longer piece.
+ minPieces.sort(cmpLenRev);
+ shortPieces.sort(cmpLenRev);
+ longPieces.sort(cmpLenRev);
+ mixedPieces.sort(cmpLenRev);
+ for (i = 0; i < 7; i++) {
+ shortPieces[i] = regexEscape(shortPieces[i]);
+ longPieces[i] = regexEscape(longPieces[i]);
+ mixedPieces[i] = regexEscape(mixedPieces[i]);
+ }
+
+ this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
+ this._weekdaysShortRegex = this._weekdaysRegex;
+ this._weekdaysMinRegex = this._weekdaysRegex;
+
+ this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
+ this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
+ this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');
+}
+
+// FORMATTING
+
+function hFormat() {
+ return this.hours() % 12 || 12;
+}
+
+function kFormat() {
+ return this.hours() || 24;
+}
+
+addFormatToken('H', ['HH', 2], 0, 'hour');
+addFormatToken('h', ['hh', 2], 0, hFormat);
+addFormatToken('k', ['kk', 2], 0, kFormat);
+
+addFormatToken('hmm', 0, 0, function () {
+ return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
+});
+
+addFormatToken('hmmss', 0, 0, function () {
+ return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +
+ zeroFill(this.seconds(), 2);
+});
+
+addFormatToken('Hmm', 0, 0, function () {
+ return '' + this.hours() + zeroFill(this.minutes(), 2);
+});
+
+addFormatToken('Hmmss', 0, 0, function () {
+ return '' + this.hours() + zeroFill(this.minutes(), 2) +
+ zeroFill(this.seconds(), 2);
+});
+
+function meridiem (token, lowercase) {
+ addFormatToken(token, 0, 0, function () {
+ return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);
+ });
+}
+
+meridiem('a', true);
+meridiem('A', false);
+
+// ALIASES
+
+addUnitAlias('hour', 'h');
+
+// PRIORITY
+addUnitPriority('hour', 13);
+
+// PARSING
+
+function matchMeridiem (isStrict, locale) {
+ return locale._meridiemParse;
+}
+
+addRegexToken('a', matchMeridiem);
+addRegexToken('A', matchMeridiem);
+addRegexToken('H', match1to2);
+addRegexToken('h', match1to2);
+addRegexToken('HH', match1to2, match2);
+addRegexToken('hh', match1to2, match2);
+
+addRegexToken('hmm', match3to4);
+addRegexToken('hmmss', match5to6);
+addRegexToken('Hmm', match3to4);
+addRegexToken('Hmmss', match5to6);
+
+addParseToken(['H', 'HH'], HOUR);
+addParseToken(['a', 'A'], function (input, array, config) {
+ config._isPm = config._locale.isPM(input);
+ config._meridiem = input;
+});
+addParseToken(['h', 'hh'], function (input, array, config) {
+ array[HOUR] = toInt(input);
+ getParsingFlags(config).bigHour = true;
+});
+addParseToken('hmm', function (input, array, config) {
+ var pos = input.length - 2;
+ array[HOUR] = toInt(input.substr(0, pos));
+ array[MINUTE] = toInt(input.substr(pos));
+ getParsingFlags(config).bigHour = true;
+});
+addParseToken('hmmss', function (input, array, config) {
+ var pos1 = input.length - 4;
+ var pos2 = input.length - 2;
+ array[HOUR] = toInt(input.substr(0, pos1));
+ array[MINUTE] = toInt(input.substr(pos1, 2));
+ array[SECOND] = toInt(input.substr(pos2));
+ getParsingFlags(config).bigHour = true;
+});
+addParseToken('Hmm', function (input, array, config) {
+ var pos = input.length - 2;
+ array[HOUR] = toInt(input.substr(0, pos));
+ array[MINUTE] = toInt(input.substr(pos));
+});
+addParseToken('Hmmss', function (input, array, config) {
+ var pos1 = input.length - 4;
+ var pos2 = input.length - 2;
+ array[HOUR] = toInt(input.substr(0, pos1));
+ array[MINUTE] = toInt(input.substr(pos1, 2));
+ array[SECOND] = toInt(input.substr(pos2));
+});
+
+// LOCALES
+
+function localeIsPM (input) {
+ // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
+ // Using charAt should be more compatible.
+ return ((input + '').toLowerCase().charAt(0) === 'p');
+}
+
+var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i;
+function localeMeridiem (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'pm' : 'PM';
+ } else {
+ return isLower ? 'am' : 'AM';
+ }
+}
+
+
+// MOMENTS
+
+// Setting the hour should keep the time, because the user explicitly
+// specified which hour he wants. So trying to maintain the same hour (in
+// a new timezone) makes sense. Adding/subtracting hours does not follow
+// this rule.
+var getSetHour = makeGetSet('Hours', true);
+
+// months
+// week
+// weekdays
+// meridiem
+var baseConfig = {
+ calendar: defaultCalendar,
+ longDateFormat: defaultLongDateFormat,
+ invalidDate: defaultInvalidDate,
+ ordinal: defaultOrdinal,
+ ordinalParse: defaultOrdinalParse,
+ relativeTime: defaultRelativeTime,
+
+ months: defaultLocaleMonths,
+ monthsShort: defaultLocaleMonthsShort,
+
+ week: defaultLocaleWeek,
+
+ weekdays: defaultLocaleWeekdays,
+ weekdaysMin: defaultLocaleWeekdaysMin,
+ weekdaysShort: defaultLocaleWeekdaysShort,
+
+ meridiemParse: defaultLocaleMeridiemParse
+};
+
+// internal storage for locale config files
+var locales = {};
+var localeFamilies = {};
+var globalLocale;
+
+function normalizeLocale(key) {
+ return key ? key.toLowerCase().replace('_', '-') : key;
+}
+
+// pick the locale from the array
+// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
+// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
+function chooseLocale(names) {
+ var i = 0, j, next, locale, split;
+
+ while (i < names.length) {
+ split = normalizeLocale(names[i]).split('-');
+ j = split.length;
+ next = normalizeLocale(names[i + 1]);
+ next = next ? next.split('-') : null;
+ while (j > 0) {
+ locale = loadLocale(split.slice(0, j).join('-'));
+ if (locale) {
+ return locale;
+ }
+ if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
+ //the next array item is better than a shallower substring of this one
+ break;
+ }
+ j--;
+ }
+ i++;
+ }
+ return null;
+}
+
+function loadLocale(name) {
+ var oldLocale = null;
+ // TODO: Find a better way to register and load all the locales in Node
+ if (!locales[name] && (typeof module !== 'undefined') &&
+ module && module.exports) {
+ try {
+ oldLocale = globalLocale._abbr;
+ require('./locale/' + name);
+ // because defineLocale currently also sets the global locale, we
+ // want to undo that for lazy loaded locales
+ getSetGlobalLocale(oldLocale);
+ } catch (e) { }
+ }
+ return locales[name];
+}
+
+// This function will load locale and then set the global locale. If
+// no arguments are passed in, it will simply return the current global
+// locale key.
+function getSetGlobalLocale (key, values) {
+ var data;
+ if (key) {
+ if (isUndefined(values)) {
+ data = getLocale(key);
+ }
+ else {
+ data = defineLocale(key, values);
+ }
+
+ if (data) {
+ // moment.duration._locale = moment._locale = data;
+ globalLocale = data;
+ }
+ }
+
+ return globalLocale._abbr;
+}
+
+function defineLocale (name, config) {
+ if (config !== null) {
+ var parentConfig = baseConfig;
+ config.abbr = name;
+ if (locales[name] != null) {
+ deprecateSimple('defineLocaleOverride',
+ 'use moment.updateLocale(localeName, config) to change ' +
+ 'an existing locale. moment.defineLocale(localeName, ' +
+ 'config) should only be used for creating a new locale ' +
+ 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');
+ parentConfig = locales[name]._config;
+ } else if (config.parentLocale != null) {
+ if (locales[config.parentLocale] != null) {
+ parentConfig = locales[config.parentLocale]._config;
+ } else {
+ if (!localeFamilies[config.parentLocale]) {
+ localeFamilies[config.parentLocale] = [];
+ }
+ localeFamilies[config.parentLocale].push({
+ name: name,
+ config: config
+ });
+ return null;
+ }
+ }
+ locales[name] = new Locale(mergeConfigs(parentConfig, config));
+
+ if (localeFamilies[name]) {
+ localeFamilies[name].forEach(function (x) {
+ defineLocale(x.name, x.config);
+ });
+ }
+
+ // backwards compat for now: also set the locale
+ // make sure we set the locale AFTER all child locales have been
+ // created, so we won't end up with the child locale set.
+ getSetGlobalLocale(name);
+
+
+ return locales[name];
+ } else {
+ // useful for testing
+ delete locales[name];
+ return null;
+ }
+}
+
+function updateLocale(name, config) {
+ if (config != null) {
+ var locale, parentConfig = baseConfig;
+ // MERGE
+ if (locales[name] != null) {
+ parentConfig = locales[name]._config;
+ }
+ config = mergeConfigs(parentConfig, config);
+ locale = new Locale(config);
+ locale.parentLocale = locales[name];
+ locales[name] = locale;
+
+ // backwards compat for now: also set the locale
+ getSetGlobalLocale(name);
+ } else {
+ // pass null for config to unupdate, useful for tests
+ if (locales[name] != null) {
+ if (locales[name].parentLocale != null) {
+ locales[name] = locales[name].parentLocale;
+ } else if (locales[name] != null) {
+ delete locales[name];
+ }
+ }
+ }
+ return locales[name];
+}
+
+// returns locale data
+function getLocale (key) {
+ var locale;
+
+ if (key && key._locale && key._locale._abbr) {
+ key = key._locale._abbr;
+ }
+
+ if (!key) {
+ return globalLocale;
+ }
+
+ if (!isArray(key)) {
+ //short-circuit everything else
+ locale = loadLocale(key);
+ if (locale) {
+ return locale;
+ }
+ key = [key];
+ }
+
+ return chooseLocale(key);
+}
+
+function listLocales() {
+ return keys$1(locales);
+}
+
+function checkOverflow (m) {
+ var overflow;
+ var a = m._a;
+
+ if (a && getParsingFlags(m).overflow === -2) {
+ overflow =
+ a[MONTH] < 0 || a[MONTH] > 11 ? MONTH :
+ a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE :
+ a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :
+ a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :
+ a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :
+ a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :
+ -1;
+
+ if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
+ overflow = DATE;
+ }
+ if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
+ overflow = WEEK;
+ }
+ if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
+ overflow = WEEKDAY;
+ }
+
+ getParsingFlags(m).overflow = overflow;
+ }
+
+ return m;
+}
+
+// iso 8601 regex
+// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
+var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
+var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
+
+var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/;
+
+var isoDates = [
+ ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
+ ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
+ ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
+ ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
+ ['YYYY-DDD', /\d{4}-\d{3}/],
+ ['YYYY-MM', /\d{4}-\d\d/, false],
+ ['YYYYYYMMDD', /[+-]\d{10}/],
+ ['YYYYMMDD', /\d{8}/],
+ // YYYYMM is NOT allowed by the standard
+ ['GGGG[W]WWE', /\d{4}W\d{3}/],
+ ['GGGG[W]WW', /\d{4}W\d{2}/, false],
+ ['YYYYDDD', /\d{7}/]
+];
+
+// iso time formats and regexes
+var isoTimes = [
+ ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
+ ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
+ ['HH:mm:ss', /\d\d:\d\d:\d\d/],
+ ['HH:mm', /\d\d:\d\d/],
+ ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
+ ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
+ ['HHmmss', /\d\d\d\d\d\d/],
+ ['HHmm', /\d\d\d\d/],
+ ['HH', /\d\d/]
+];
+
+var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i;
+
+// date from iso format
+function configFromISO(config) {
+ var i, l,
+ string = config._i,
+ match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
+ allowTime, dateFormat, timeFormat, tzFormat;
+
+ if (match) {
+ getParsingFlags(config).iso = true;
+
+ for (i = 0, l = isoDates.length; i < l; i++) {
+ if (isoDates[i][1].exec(match[1])) {
+ dateFormat = isoDates[i][0];
+ allowTime = isoDates[i][2] !== false;
+ break;
+ }
+ }
+ if (dateFormat == null) {
+ config._isValid = false;
+ return;
+ }
+ if (match[3]) {
+ for (i = 0, l = isoTimes.length; i < l; i++) {
+ if (isoTimes[i][1].exec(match[3])) {
+ // match[2] should be 'T' or space
+ timeFormat = (match[2] || ' ') + isoTimes[i][0];
+ break;
+ }
+ }
+ if (timeFormat == null) {
+ config._isValid = false;
+ return;
+ }
+ }
+ if (!allowTime && timeFormat != null) {
+ config._isValid = false;
+ return;
+ }
+ if (match[4]) {
+ if (tzRegex.exec(match[4])) {
+ tzFormat = 'Z';
+ } else {
+ config._isValid = false;
+ return;
+ }
+ }
+ config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
+ configFromStringAndFormat(config);
+ } else {
+ config._isValid = false;
+ }
+}
+
+// date from iso format or fallback
+function configFromString(config) {
+ var matched = aspNetJsonRegex.exec(config._i);
+
+ if (matched !== null) {
+ config._d = new Date(+matched[1]);
+ return;
+ }
+
+ configFromISO(config);
+ if (config._isValid === false) {
+ delete config._isValid;
+ hooks.createFromInputFallback(config);
+ }
+}
+
+hooks.createFromInputFallback = deprecate(
+ 'value provided is not in a recognized ISO format. moment construction falls back to js Date(), ' +
+ 'which is not reliable across all browsers and versions. Non ISO date formats are ' +
+ 'discouraged and will be removed in an upcoming major release. Please refer to ' +
+ 'http://momentjs.com/guides/#/warnings/js-date/ for more info.',
+ function (config) {
+ config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
+ }
+);
+
+// Pick the first defined of two or three arguments.
+function defaults(a, b, c) {
+ if (a != null) {
+ return a;
+ }
+ if (b != null) {
+ return b;
+ }
+ return c;
+}
+
+function currentDateArray(config) {
+ // hooks is actually the exported moment object
+ var nowValue = new Date(hooks.now());
+ if (config._useUTC) {
+ return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];
+ }
+ return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
+}
+
+// convert an array to a date.
+// the array should mirror the parameters below
+// note: all values past the year are optional and will default to the lowest possible value.
+// [year, month, day , hour, minute, second, millisecond]
+function configFromArray (config) {
+ var i, date, input = [], currentDate, yearToUse;
+
+ if (config._d) {
+ return;
+ }
+
+ currentDate = currentDateArray(config);
+
+ //compute day of the year from weeks and weekdays
+ if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
+ dayOfYearFromWeekInfo(config);
+ }
+
+ //if the day of the year is set, figure out what it is
+ if (config._dayOfYear) {
+ yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);
+
+ if (config._dayOfYear > daysInYear(yearToUse)) {
+ getParsingFlags(config)._overflowDayOfYear = true;
+ }
+
+ date = createUTCDate(yearToUse, 0, config._dayOfYear);
+ config._a[MONTH] = date.getUTCMonth();
+ config._a[DATE] = date.getUTCDate();
+ }
+
+ // Default to current date.
+ // * if no year, month, day of month are given, default to today
+ // * if day of month is given, default month and year
+ // * if month is given, default only year
+ // * if year is given, don't default anything
+ for (i = 0; i < 3 && config._a[i] == null; ++i) {
+ config._a[i] = input[i] = currentDate[i];
+ }
+
+ // Zero out whatever was not defaulted, including time
+ for (; i < 7; i++) {
+ config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
+ }
+
+ // Check for 24:00:00.000
+ if (config._a[HOUR] === 24 &&
+ config._a[MINUTE] === 0 &&
+ config._a[SECOND] === 0 &&
+ config._a[MILLISECOND] === 0) {
+ config._nextDay = true;
+ config._a[HOUR] = 0;
+ }
+
+ config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
+ // Apply timezone offset from input. The actual utcOffset can be changed
+ // with parseZone.
+ if (config._tzm != null) {
+ config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
+ }
+
+ if (config._nextDay) {
+ config._a[HOUR] = 24;
+ }
+}
+
+function dayOfYearFromWeekInfo(config) {
+ var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;
+
+ w = config._w;
+ if (w.GG != null || w.W != null || w.E != null) {
+ dow = 1;
+ doy = 4;
+
+ // TODO: We need to take the current isoWeekYear, but that depends on
+ // how we interpret now (local, utc, fixed offset). So create
+ // a now version of current config (take local/utc/offset flags, and
+ // create now).
+ weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);
+ week = defaults(w.W, 1);
+ weekday = defaults(w.E, 1);
+ if (weekday < 1 || weekday > 7) {
+ weekdayOverflow = true;
+ }
+ } else {
+ dow = config._locale._week.dow;
+ doy = config._locale._week.doy;
+
+ var curWeek = weekOfYear(createLocal(), dow, doy);
+
+ weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);
+
+ // Default to current week.
+ week = defaults(w.w, curWeek.week);
+
+ if (w.d != null) {
+ // weekday -- low day numbers are considered next week
+ weekday = w.d;
+ if (weekday < 0 || weekday > 6) {
+ weekdayOverflow = true;
+ }
+ } else if (w.e != null) {
+ // local weekday -- counting starts from begining of week
+ weekday = w.e + dow;
+ if (w.e < 0 || w.e > 6) {
+ weekdayOverflow = true;
+ }
+ } else {
+ // default to begining of week
+ weekday = dow;
+ }
+ }
+ if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
+ getParsingFlags(config)._overflowWeeks = true;
+ } else if (weekdayOverflow != null) {
+ getParsingFlags(config)._overflowWeekday = true;
+ } else {
+ temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
+ config._a[YEAR] = temp.year;
+ config._dayOfYear = temp.dayOfYear;
+ }
+}
+
+// constant that refers to the ISO standard
+hooks.ISO_8601 = function () {};
+
+// date from string and format string
+function configFromStringAndFormat(config) {
+ // TODO: Move this to another part of the creation flow to prevent circular deps
+ if (config._f === hooks.ISO_8601) {
+ configFromISO(config);
+ return;
+ }
+
+ config._a = [];
+ getParsingFlags(config).empty = true;
+
+ // This array is used to make a Date, either with `new Date` or `Date.UTC`
+ var string = '' + config._i,
+ i, parsedInput, tokens, token, skipped,
+ stringLength = string.length,
+ totalParsedInputLength = 0;
+
+ tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];
+
+ for (i = 0; i < tokens.length; i++) {
+ token = tokens[i];
+ parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
+ // console.log('token', token, 'parsedInput', parsedInput,
+ // 'regex', getParseRegexForToken(token, config));
+ if (parsedInput) {
+ skipped = string.substr(0, string.indexOf(parsedInput));
+ if (skipped.length > 0) {
+ getParsingFlags(config).unusedInput.push(skipped);
+ }
+ string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
+ totalParsedInputLength += parsedInput.length;
+ }
+ // don't parse if it's not a known token
+ if (formatTokenFunctions[token]) {
+ if (parsedInput) {
+ getParsingFlags(config).empty = false;
+ }
+ else {
+ getParsingFlags(config).unusedTokens.push(token);
+ }
+ addTimeToArrayFromToken(token, parsedInput, config);
+ }
+ else if (config._strict && !parsedInput) {
+ getParsingFlags(config).unusedTokens.push(token);
+ }
+ }
+
+ // add remaining unparsed input length to the string
+ getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;
+ if (string.length > 0) {
+ getParsingFlags(config).unusedInput.push(string);
+ }
+
+ // clear _12h flag if hour is <= 12
+ if (config._a[HOUR] <= 12 &&
+ getParsingFlags(config).bigHour === true &&
+ config._a[HOUR] > 0) {
+ getParsingFlags(config).bigHour = undefined;
+ }
+
+ getParsingFlags(config).parsedDateParts = config._a.slice(0);
+ getParsingFlags(config).meridiem = config._meridiem;
+ // handle meridiem
+ config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);
+
+ configFromArray(config);
+ checkOverflow(config);
+}
+
+
+function meridiemFixWrap (locale, hour, meridiem) {
+ var isPm;
+
+ if (meridiem == null) {
+ // nothing to do
+ return hour;
+ }
+ if (locale.meridiemHour != null) {
+ return locale.meridiemHour(hour, meridiem);
+ } else if (locale.isPM != null) {
+ // Fallback
+ isPm = locale.isPM(meridiem);
+ if (isPm && hour < 12) {
+ hour += 12;
+ }
+ if (!isPm && hour === 12) {
+ hour = 0;
+ }
+ return hour;
+ } else {
+ // this is not supposed to happen
+ return hour;
+ }
+}
+
+// date from string and array of format strings
+function configFromStringAndArray(config) {
+ var tempConfig,
+ bestMoment,
+
+ scoreToBeat,
+ i,
+ currentScore;
+
+ if (config._f.length === 0) {
+ getParsingFlags(config).invalidFormat = true;
+ config._d = new Date(NaN);
+ return;
+ }
+
+ for (i = 0; i < config._f.length; i++) {
+ currentScore = 0;
+ tempConfig = copyConfig({}, config);
+ if (config._useUTC != null) {
+ tempConfig._useUTC = config._useUTC;
+ }
+ tempConfig._f = config._f[i];
+ configFromStringAndFormat(tempConfig);
+
+ if (!isValid(tempConfig)) {
+ continue;
+ }
+
+ // if there is any input that was not parsed add a penalty for that format
+ currentScore += getParsingFlags(tempConfig).charsLeftOver;
+
+ //or tokens
+ currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
+
+ getParsingFlags(tempConfig).score = currentScore;
+
+ if (scoreToBeat == null || currentScore < scoreToBeat) {
+ scoreToBeat = currentScore;
+ bestMoment = tempConfig;
+ }
+ }
+
+ extend(config, bestMoment || tempConfig);
+}
+
+function configFromObject(config) {
+ if (config._d) {
+ return;
+ }
+
+ var i = normalizeObjectUnits(config._i);
+ config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {
+ return obj && parseInt(obj, 10);
+ });
+
+ configFromArray(config);
+}
+
+function createFromConfig (config) {
+ var res = new Moment(checkOverflow(prepareConfig(config)));
+ if (res._nextDay) {
+ // Adding is smart enough around DST
+ res.add(1, 'd');
+ res._nextDay = undefined;
+ }
+
+ return res;
+}
+
+function prepareConfig (config) {
+ var input = config._i,
+ format = config._f;
+
+ config._locale = config._locale || getLocale(config._l);
+
+ if (input === null || (format === undefined && input === '')) {
+ return createInvalid({nullInput: true});
+ }
+
+ if (typeof input === 'string') {
+ config._i = input = config._locale.preparse(input);
+ }
+
+ if (isMoment(input)) {
+ return new Moment(checkOverflow(input));
+ } else if (isDate(input)) {
+ config._d = input;
+ } else if (isArray(format)) {
+ configFromStringAndArray(config);
+ } else if (format) {
+ configFromStringAndFormat(config);
+ } else {
+ configFromInput(config);
+ }
+
+ if (!isValid(config)) {
+ config._d = null;
+ }
+
+ return config;
+}
+
+function configFromInput(config) {
+ var input = config._i;
+ if (input === undefined) {
+ config._d = new Date(hooks.now());
+ } else if (isDate(input)) {
+ config._d = new Date(input.valueOf());
+ } else if (typeof input === 'string') {
+ configFromString(config);
+ } else if (isArray(input)) {
+ config._a = map(input.slice(0), function (obj) {
+ return parseInt(obj, 10);
+ });
+ configFromArray(config);
+ } else if (typeof(input) === 'object') {
+ configFromObject(config);
+ } else if (isNumber(input)) {
+ // from milliseconds
+ config._d = new Date(input);
+ } else {
+ hooks.createFromInputFallback(config);
+ }
+}
+
+function createLocalOrUTC (input, format, locale, strict, isUTC) {
+ var c = {};
+
+ if (locale === true || locale === false) {
+ strict = locale;
+ locale = undefined;
+ }
+
+ if ((isObject(input) && isObjectEmpty(input)) ||
+ (isArray(input) && input.length === 0)) {
+ input = undefined;
+ }
+ // object construction must be done this way.
+ // https://github.com/moment/moment/issues/1423
+ c._isAMomentObject = true;
+ c._useUTC = c._isUTC = isUTC;
+ c._l = locale;
+ c._i = input;
+ c._f = format;
+ c._strict = strict;
+
+ return createFromConfig(c);
+}
+
+function createLocal (input, format, locale, strict) {
+ return createLocalOrUTC(input, format, locale, strict, false);
+}
+
+var prototypeMin = deprecate(
+ 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
+ function () {
+ var other = createLocal.apply(null, arguments);
+ if (this.isValid() && other.isValid()) {
+ return other < this ? this : other;
+ } else {
+ return createInvalid();
+ }
+ }
+);
+
+var prototypeMax = deprecate(
+ 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
+ function () {
+ var other = createLocal.apply(null, arguments);
+ if (this.isValid() && other.isValid()) {
+ return other > this ? this : other;
+ } else {
+ return createInvalid();
+ }
+ }
+);
+
+// Pick a moment m from moments so that m[fn](other) is true for all
+// other. This relies on the function fn to be transitive.
+//
+// moments should either be an array of moment objects or an array, whose
+// first element is an array of moment objects.
+function pickBy(fn, moments) {
+ var res, i;
+ if (moments.length === 1 && isArray(moments[0])) {
+ moments = moments[0];
+ }
+ if (!moments.length) {
+ return createLocal();
+ }
+ res = moments[0];
+ for (i = 1; i < moments.length; ++i) {
+ if (!moments[i].isValid() || moments[i][fn](res)) {
+ res = moments[i];
+ }
+ }
+ return res;
+}
+
+// TODO: Use [].sort instead?
+function min () {
+ var args = [].slice.call(arguments, 0);
+
+ return pickBy('isBefore', args);
+}
+
+function max () {
+ var args = [].slice.call(arguments, 0);
+
+ return pickBy('isAfter', args);
+}
+
+var now = function () {
+ return Date.now ? Date.now() : +(new Date());
+};
+
+function Duration (duration) {
+ var normalizedInput = normalizeObjectUnits(duration),
+ years = normalizedInput.year || 0,
+ quarters = normalizedInput.quarter || 0,
+ months = normalizedInput.month || 0,
+ weeks = normalizedInput.week || 0,
+ days = normalizedInput.day || 0,
+ hours = normalizedInput.hour || 0,
+ minutes = normalizedInput.minute || 0,
+ seconds = normalizedInput.second || 0,
+ milliseconds = normalizedInput.millisecond || 0;
+
+ // representation for dateAddRemove
+ this._milliseconds = +milliseconds +
+ seconds * 1e3 + // 1000
+ minutes * 6e4 + // 1000 * 60
+ hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
+ // Because of dateAddRemove treats 24 hours as different from a
+ // day when working around DST, we need to store them separately
+ this._days = +days +
+ weeks * 7;
+ // It is impossible translate months into days without knowing
+ // which months you are are talking about, so we have to store
+ // it separately.
+ this._months = +months +
+ quarters * 3 +
+ years * 12;
+
+ this._data = {};
+
+ this._locale = getLocale();
+
+ this._bubble();
+}
+
+function isDuration (obj) {
+ return obj instanceof Duration;
+}
+
+function absRound (number) {
+ if (number < 0) {
+ return Math.round(-1 * number) * -1;
+ } else {
+ return Math.round(number);
+ }
+}
+
+// FORMATTING
+
+function offset (token, separator) {
+ addFormatToken(token, 0, 0, function () {
+ var offset = this.utcOffset();
+ var sign = '+';
+ if (offset < 0) {
+ offset = -offset;
+ sign = '-';
+ }
+ return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);
+ });
+}
+
+offset('Z', ':');
+offset('ZZ', '');
+
+// PARSING
+
+addRegexToken('Z', matchShortOffset);
+addRegexToken('ZZ', matchShortOffset);
+addParseToken(['Z', 'ZZ'], function (input, array, config) {
+ config._useUTC = true;
+ config._tzm = offsetFromString(matchShortOffset, input);
+});
+
+// HELPERS
+
+// timezone chunker
+// '+10:00' > ['10', '00']
+// '-1530' > ['-15', '30']
+var chunkOffset = /([\+\-]|\d\d)/gi;
+
+function offsetFromString(matcher, string) {
+ var matches = (string || '').match(matcher);
+
+ if (matches === null) {
+ return null;
+ }
+
+ var chunk = matches[matches.length - 1] || [];
+ var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];
+ var minutes = +(parts[1] * 60) + toInt(parts[2]);
+
+ return minutes === 0 ?
+ 0 :
+ parts[0] === '+' ? minutes : -minutes;
+}
+
+// Return a moment from input, that is local/utc/zone equivalent to model.
+function cloneWithOffset(input, model) {
+ var res, diff;
+ if (model._isUTC) {
+ res = model.clone();
+ diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();
+ // Use low-level api, because this fn is low-level api.
+ res._d.setTime(res._d.valueOf() + diff);
+ hooks.updateOffset(res, false);
+ return res;
+ } else {
+ return createLocal(input).local();
+ }
+}
+
+function getDateOffset (m) {
+ // On Firefox.24 Date#getTimezoneOffset returns a floating point.
+ // https://github.com/moment/moment/pull/1871
+ return -Math.round(m._d.getTimezoneOffset() / 15) * 15;
+}
+
+// HOOKS
+
+// This function will be called whenever a moment is mutated.
+// It is intended to keep the offset in sync with the timezone.
+hooks.updateOffset = function () {};
+
+// MOMENTS
+
+// keepLocalTime = true means only change the timezone, without
+// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
+// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
+// +0200, so we adjust the time as needed, to be valid.
+//
+// Keeping the time actually adds/subtracts (one hour)
+// from the actual represented time. That is why we call updateOffset
+// a second time. In case it wants us to change the offset again
+// _changeInProgress == true case, then we have to adjust, because
+// there is no such time in the given timezone.
+function getSetOffset (input, keepLocalTime) {
+ var offset = this._offset || 0,
+ localAdjust;
+ if (!this.isValid()) {
+ return input != null ? this : NaN;
+ }
+ if (input != null) {
+ if (typeof input === 'string') {
+ input = offsetFromString(matchShortOffset, input);
+ if (input === null) {
+ return this;
+ }
+ } else if (Math.abs(input) < 16) {
+ input = input * 60;
+ }
+ if (!this._isUTC && keepLocalTime) {
+ localAdjust = getDateOffset(this);
+ }
+ this._offset = input;
+ this._isUTC = true;
+ if (localAdjust != null) {
+ this.add(localAdjust, 'm');
+ }
+ if (offset !== input) {
+ if (!keepLocalTime || this._changeInProgress) {
+ addSubtract(this, createDuration(input - offset, 'm'), 1, false);
+ } else if (!this._changeInProgress) {
+ this._changeInProgress = true;
+ hooks.updateOffset(this, true);
+ this._changeInProgress = null;
+ }
+ }
+ return this;
+ } else {
+ return this._isUTC ? offset : getDateOffset(this);
+ }
+}
+
+function getSetZone (input, keepLocalTime) {
+ if (input != null) {
+ if (typeof input !== 'string') {
+ input = -input;
+ }
+
+ this.utcOffset(input, keepLocalTime);
+
+ return this;
+ } else {
+ return -this.utcOffset();
+ }
+}
+
+function setOffsetToUTC (keepLocalTime) {
+ return this.utcOffset(0, keepLocalTime);
+}
+
+function setOffsetToLocal (keepLocalTime) {
+ if (this._isUTC) {
+ this.utcOffset(0, keepLocalTime);
+ this._isUTC = false;
+
+ if (keepLocalTime) {
+ this.subtract(getDateOffset(this), 'm');
+ }
+ }
+ return this;
+}
+
+function setOffsetToParsedOffset () {
+ if (this._tzm != null) {
+ this.utcOffset(this._tzm);
+ } else if (typeof this._i === 'string') {
+ var tZone = offsetFromString(matchOffset, this._i);
+ if (tZone != null) {
+ this.utcOffset(tZone);
+ }
+ else {
+ this.utcOffset(0, true);
+ }
+ }
+ return this;
+}
+
+function hasAlignedHourOffset (input) {
+ if (!this.isValid()) {
+ return false;
+ }
+ input = input ? createLocal(input).utcOffset() : 0;
+
+ return (this.utcOffset() - input) % 60 === 0;
+}
+
+function isDaylightSavingTime () {
+ return (
+ this.utcOffset() > this.clone().month(0).utcOffset() ||
+ this.utcOffset() > this.clone().month(5).utcOffset()
+ );
+}
+
+function isDaylightSavingTimeShifted () {
+ if (!isUndefined(this._isDSTShifted)) {
+ return this._isDSTShifted;
+ }
+
+ var c = {};
+
+ copyConfig(c, this);
+ c = prepareConfig(c);
+
+ if (c._a) {
+ var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
+ this._isDSTShifted = this.isValid() &&
+ compareArrays(c._a, other.toArray()) > 0;
+ } else {
+ this._isDSTShifted = false;
+ }
+
+ return this._isDSTShifted;
+}
+
+function isLocal () {
+ return this.isValid() ? !this._isUTC : false;
+}
+
+function isUtcOffset () {
+ return this.isValid() ? this._isUTC : false;
+}
+
+function isUtc () {
+ return this.isValid() ? this._isUTC && this._offset === 0 : false;
+}
+
+// ASP.NET json date format regex
+var aspNetRegex = /^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/;
+
+// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
+// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
+// and further modified to allow for strings containing both week and day
+var isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;
+
+function createDuration (input, key) {
+ var duration = input,
+ // matching against regexp is expensive, do it on demand
+ match = null,
+ sign,
+ ret,
+ diffRes;
+
+ if (isDuration(input)) {
+ duration = {
+ ms : input._milliseconds,
+ d : input._days,
+ M : input._months
+ };
+ } else if (isNumber(input)) {
+ duration = {};
+ if (key) {
+ duration[key] = input;
+ } else {
+ duration.milliseconds = input;
+ }
+ } else if (!!(match = aspNetRegex.exec(input))) {
+ sign = (match[1] === '-') ? -1 : 1;
+ duration = {
+ y : 0,
+ d : toInt(match[DATE]) * sign,
+ h : toInt(match[HOUR]) * sign,
+ m : toInt(match[MINUTE]) * sign,
+ s : toInt(match[SECOND]) * sign,
+ ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match
+ };
+ } else if (!!(match = isoRegex.exec(input))) {
+ sign = (match[1] === '-') ? -1 : 1;
+ duration = {
+ y : parseIso(match[2], sign),
+ M : parseIso(match[3], sign),
+ w : parseIso(match[4], sign),
+ d : parseIso(match[5], sign),
+ h : parseIso(match[6], sign),
+ m : parseIso(match[7], sign),
+ s : parseIso(match[8], sign)
+ };
+ } else if (duration == null) {// checks for null or undefined
+ duration = {};
+ } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {
+ diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));
+
+ duration = {};
+ duration.ms = diffRes.milliseconds;
+ duration.M = diffRes.months;
+ }
+
+ ret = new Duration(duration);
+
+ if (isDuration(input) && hasOwnProp(input, '_locale')) {
+ ret._locale = input._locale;
+ }
+
+ return ret;
+}
+
+createDuration.fn = Duration.prototype;
+
+function parseIso (inp, sign) {
+ // We'd normally use ~~inp for this, but unfortunately it also
+ // converts floats to ints.
+ // inp may be undefined, so careful calling replace on it.
+ var res = inp && parseFloat(inp.replace(',', '.'));
+ // apply sign while we're at it
+ return (isNaN(res) ? 0 : res) * sign;
+}
+
+function positiveMomentsDifference(base, other) {
+ var res = {milliseconds: 0, months: 0};
+
+ res.months = other.month() - base.month() +
+ (other.year() - base.year()) * 12;
+ if (base.clone().add(res.months, 'M').isAfter(other)) {
+ --res.months;
+ }
+
+ res.milliseconds = +other - +(base.clone().add(res.months, 'M'));
+
+ return res;
+}
+
+function momentsDifference(base, other) {
+ var res;
+ if (!(base.isValid() && other.isValid())) {
+ return {milliseconds: 0, months: 0};
+ }
+
+ other = cloneWithOffset(other, base);
+ if (base.isBefore(other)) {
+ res = positiveMomentsDifference(base, other);
+ } else {
+ res = positiveMomentsDifference(other, base);
+ res.milliseconds = -res.milliseconds;
+ res.months = -res.months;
+ }
+
+ return res;
+}
+
+// TODO: remove 'name' arg after deprecation is removed
+function createAdder(direction, name) {
+ return function (val, period) {
+ var dur, tmp;
+ //invert the arguments, but complain about it
+ if (period !== null && !isNaN(+period)) {
+ deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +
+ 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');
+ tmp = val; val = period; period = tmp;
+ }
+
+ val = typeof val === 'string' ? +val : val;
+ dur = createDuration(val, period);
+ addSubtract(this, dur, direction);
+ return this;
+ };
+}
+
+function addSubtract (mom, duration, isAdding, updateOffset) {
+ var milliseconds = duration._milliseconds,
+ days = absRound(duration._days),
+ months = absRound(duration._months);
+
+ if (!mom.isValid()) {
+ // No op
+ return;
+ }
+
+ updateOffset = updateOffset == null ? true : updateOffset;
+
+ if (milliseconds) {
+ mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
+ }
+ if (days) {
+ set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);
+ }
+ if (months) {
+ setMonth(mom, get(mom, 'Month') + months * isAdding);
+ }
+ if (updateOffset) {
+ hooks.updateOffset(mom, days || months);
+ }
+}
+
+var add = createAdder(1, 'add');
+var subtract = createAdder(-1, 'subtract');
+
+function getCalendarFormat(myMoment, now) {
+ var diff = myMoment.diff(now, 'days', true);
+ return diff < -6 ? 'sameElse' :
+ diff < -1 ? 'lastWeek' :
+ diff < 0 ? 'lastDay' :
+ diff < 1 ? 'sameDay' :
+ diff < 2 ? 'nextDay' :
+ diff < 7 ? 'nextWeek' : 'sameElse';
+}
+
+function calendar$1 (time, formats) {
+ // We want to compare the start of today, vs this.
+ // Getting start-of-today depends on whether we're local/utc/offset or not.
+ var now = time || createLocal(),
+ sod = cloneWithOffset(now, this).startOf('day'),
+ format = hooks.calendarFormat(this, sod) || 'sameElse';
+
+ var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);
+
+ return this.format(output || this.localeData().calendar(format, this, createLocal(now)));
+}
+
+function clone () {
+ return new Moment(this);
+}
+
+function isAfter (input, units) {
+ var localInput = isMoment(input) ? input : createLocal(input);
+ if (!(this.isValid() && localInput.isValid())) {
+ return false;
+ }
+ units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
+ if (units === 'millisecond') {
+ return this.valueOf() > localInput.valueOf();
+ } else {
+ return localInput.valueOf() < this.clone().startOf(units).valueOf();
+ }
+}
+
+function isBefore (input, units) {
+ var localInput = isMoment(input) ? input : createLocal(input);
+ if (!(this.isValid() && localInput.isValid())) {
+ return false;
+ }
+ units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
+ if (units === 'millisecond') {
+ return this.valueOf() < localInput.valueOf();
+ } else {
+ return this.clone().endOf(units).valueOf() < localInput.valueOf();
+ }
+}
+
+function isBetween (from, to, units, inclusivity) {
+ inclusivity = inclusivity || '()';
+ return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&
+ (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));
+}
+
+function isSame (input, units) {
+ var localInput = isMoment(input) ? input : createLocal(input),
+ inputMs;
+ if (!(this.isValid() && localInput.isValid())) {
+ return false;
+ }
+ units = normalizeUnits(units || 'millisecond');
+ if (units === 'millisecond') {
+ return this.valueOf() === localInput.valueOf();
+ } else {
+ inputMs = localInput.valueOf();
+ return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();
+ }
+}
+
+function isSameOrAfter (input, units) {
+ return this.isSame(input, units) || this.isAfter(input,units);
+}
+
+function isSameOrBefore (input, units) {
+ return this.isSame(input, units) || this.isBefore(input,units);
+}
+
+function diff (input, units, asFloat) {
+ var that,
+ zoneDelta,
+ delta, output;
+
+ if (!this.isValid()) {
+ return NaN;
+ }
+
+ that = cloneWithOffset(input, this);
+
+ if (!that.isValid()) {
+ return NaN;
+ }
+
+ zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;
+
+ units = normalizeUnits(units);
+
+ if (units === 'year' || units === 'month' || units === 'quarter') {
+ output = monthDiff(this, that);
+ if (units === 'quarter') {
+ output = output / 3;
+ } else if (units === 'year') {
+ output = output / 12;
+ }
+ } else {
+ delta = this - that;
+ output = units === 'second' ? delta / 1e3 : // 1000
+ units === 'minute' ? delta / 6e4 : // 1000 * 60
+ units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60
+ units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
+ units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
+ delta;
+ }
+ return asFloat ? output : absFloor(output);
+}
+
+function monthDiff (a, b) {
+ // difference in months
+ var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),
+ // b is in (anchor - 1 month, anchor + 1 month)
+ anchor = a.clone().add(wholeMonthDiff, 'months'),
+ anchor2, adjust;
+
+ if (b - anchor < 0) {
+ anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
+ // linear across the month
+ adjust = (b - anchor) / (anchor - anchor2);
+ } else {
+ anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
+ // linear across the month
+ adjust = (b - anchor) / (anchor2 - anchor);
+ }
+
+ //check for negative zero, return zero if negative zero
+ return -(wholeMonthDiff + adjust) || 0;
+}
+
+hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
+hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';
+
+function toString () {
+ return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
+}
+
+function toISOString () {
+ var m = this.clone().utc();
+ if (0 < m.year() && m.year() <= 9999) {
+ if (isFunction(Date.prototype.toISOString)) {
+ // native implementation is ~50x faster, use it when we can
+ return this.toDate().toISOString();
+ } else {
+ return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
+ }
+ } else {
+ return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
+ }
+}
+
+/**
+ * Return a human readable representation of a moment that can
+ * also be evaluated to get a new moment which is the same
+ *
+ * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
+ */
+function inspect () {
+ if (!this.isValid()) {
+ return 'moment.invalid(/* ' + this._i + ' */)';
+ }
+ var func = 'moment';
+ var zone = '';
+ if (!this.isLocal()) {
+ func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
+ zone = 'Z';
+ }
+ var prefix = '[' + func + '("]';
+ var year = (0 < this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';
+ var datetime = '-MM-DD[T]HH:mm:ss.SSS';
+ var suffix = zone + '[")]';
+
+ return this.format(prefix + year + datetime + suffix);
+}
+
+function format (inputString) {
+ if (!inputString) {
+ inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;
+ }
+ var output = formatMoment(this, inputString);
+ return this.localeData().postformat(output);
+}
+
+function from (time, withoutSuffix) {
+ if (this.isValid() &&
+ ((isMoment(time) && time.isValid()) ||
+ createLocal(time).isValid())) {
+ return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
+ } else {
+ return this.localeData().invalidDate();
+ }
+}
+
+function fromNow (withoutSuffix) {
+ return this.from(createLocal(), withoutSuffix);
+}
+
+function to (time, withoutSuffix) {
+ if (this.isValid() &&
+ ((isMoment(time) && time.isValid()) ||
+ createLocal(time).isValid())) {
+ return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);
+ } else {
+ return this.localeData().invalidDate();
+ }
+}
+
+function toNow (withoutSuffix) {
+ return this.to(createLocal(), withoutSuffix);
+}
+
+// If passed a locale key, it will set the locale for this
+// instance. Otherwise, it will return the locale configuration
+// variables for this instance.
+function locale (key) {
+ var newLocaleData;
+
+ if (key === undefined) {
+ return this._locale._abbr;
+ } else {
+ newLocaleData = getLocale(key);
+ if (newLocaleData != null) {
+ this._locale = newLocaleData;
+ }
+ return this;
+ }
+}
+
+var lang = deprecate(
+ 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
+ function (key) {
+ if (key === undefined) {
+ return this.localeData();
+ } else {
+ return this.locale(key);
+ }
+ }
+);
+
+function localeData () {
+ return this._locale;
+}
+
+function startOf (units) {
+ units = normalizeUnits(units);
+ // the following switch intentionally omits break keywords
+ // to utilize falling through the cases.
+ switch (units) {
+ case 'year':
+ this.month(0);
+ /* falls through */
+ case 'quarter':
+ case 'month':
+ this.date(1);
+ /* falls through */
+ case 'week':
+ case 'isoWeek':
+ case 'day':
+ case 'date':
+ this.hours(0);
+ /* falls through */
+ case 'hour':
+ this.minutes(0);
+ /* falls through */
+ case 'minute':
+ this.seconds(0);
+ /* falls through */
+ case 'second':
+ this.milliseconds(0);
+ }
+
+ // weeks are a special case
+ if (units === 'week') {
+ this.weekday(0);
+ }
+ if (units === 'isoWeek') {
+ this.isoWeekday(1);
+ }
+
+ // quarters are also special
+ if (units === 'quarter') {
+ this.month(Math.floor(this.month() / 3) * 3);
+ }
+
+ return this;
+}
+
+function endOf (units) {
+ units = normalizeUnits(units);
+ if (units === undefined || units === 'millisecond') {
+ return this;
+ }
+
+ // 'date' is an alias for 'day', so it should be considered as such.
+ if (units === 'date') {
+ units = 'day';
+ }
+
+ return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');
+}
+
+function valueOf () {
+ return this._d.valueOf() - ((this._offset || 0) * 60000);
+}
+
+function unix () {
+ return Math.floor(this.valueOf() / 1000);
+}
+
+function toDate () {
+ return new Date(this.valueOf());
+}
+
+function toArray () {
+ var m = this;
+ return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];
+}
+
+function toObject () {
+ var m = this;
+ return {
+ years: m.year(),
+ months: m.month(),
+ date: m.date(),
+ hours: m.hours(),
+ minutes: m.minutes(),
+ seconds: m.seconds(),
+ milliseconds: m.milliseconds()
+ };
+}
+
+function toJSON () {
+ // new Date(NaN).toJSON() === null
+ return this.isValid() ? this.toISOString() : null;
+}
+
+function isValid$1 () {
+ return isValid(this);
+}
+
+function parsingFlags () {
+ return extend({}, getParsingFlags(this));
+}
+
+function invalidAt () {
+ return getParsingFlags(this).overflow;
+}
+
+function creationData() {
+ return {
+ input: this._i,
+ format: this._f,
+ locale: this._locale,
+ isUTC: this._isUTC,
+ strict: this._strict
+ };
+}
+
+// FORMATTING
+
+addFormatToken(0, ['gg', 2], 0, function () {
+ return this.weekYear() % 100;
+});
+
+addFormatToken(0, ['GG', 2], 0, function () {
+ return this.isoWeekYear() % 100;
+});
+
+function addWeekYearFormatToken (token, getter) {
+ addFormatToken(0, [token, token.length], 0, getter);
+}
+
+addWeekYearFormatToken('gggg', 'weekYear');
+addWeekYearFormatToken('ggggg', 'weekYear');
+addWeekYearFormatToken('GGGG', 'isoWeekYear');
+addWeekYearFormatToken('GGGGG', 'isoWeekYear');
+
+// ALIASES
+
+addUnitAlias('weekYear', 'gg');
+addUnitAlias('isoWeekYear', 'GG');
+
+// PRIORITY
+
+addUnitPriority('weekYear', 1);
+addUnitPriority('isoWeekYear', 1);
+
+
+// PARSING
+
+addRegexToken('G', matchSigned);
+addRegexToken('g', matchSigned);
+addRegexToken('GG', match1to2, match2);
+addRegexToken('gg', match1to2, match2);
+addRegexToken('GGGG', match1to4, match4);
+addRegexToken('gggg', match1to4, match4);
+addRegexToken('GGGGG', match1to6, match6);
+addRegexToken('ggggg', match1to6, match6);
+
+addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {
+ week[token.substr(0, 2)] = toInt(input);
+});
+
+addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
+ week[token] = hooks.parseTwoDigitYear(input);
+});
+
+// MOMENTS
+
+function getSetWeekYear (input) {
+ return getSetWeekYearHelper.call(this,
+ input,
+ this.week(),
+ this.weekday(),
+ this.localeData()._week.dow,
+ this.localeData()._week.doy);
+}
+
+function getSetISOWeekYear (input) {
+ return getSetWeekYearHelper.call(this,
+ input, this.isoWeek(), this.isoWeekday(), 1, 4);
+}
+
+function getISOWeeksInYear () {
+ return weeksInYear(this.year(), 1, 4);
+}
+
+function getWeeksInYear () {
+ var weekInfo = this.localeData()._week;
+ return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
+}
+
+function getSetWeekYearHelper(input, week, weekday, dow, doy) {
+ var weeksTarget;
+ if (input == null) {
+ return weekOfYear(this, dow, doy).year;
+ } else {
+ weeksTarget = weeksInYear(input, dow, doy);
+ if (week > weeksTarget) {
+ week = weeksTarget;
+ }
+ return setWeekAll.call(this, input, week, weekday, dow, doy);
+ }
+}
+
+function setWeekAll(weekYear, week, weekday, dow, doy) {
+ var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
+ date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);
+
+ this.year(date.getUTCFullYear());
+ this.month(date.getUTCMonth());
+ this.date(date.getUTCDate());
+ return this;
+}
+
+// FORMATTING
+
+addFormatToken('Q', 0, 'Qo', 'quarter');
+
+// ALIASES
+
+addUnitAlias('quarter', 'Q');
+
+// PRIORITY
+
+addUnitPriority('quarter', 7);
+
+// PARSING
+
+addRegexToken('Q', match1);
+addParseToken('Q', function (input, array) {
+ array[MONTH] = (toInt(input) - 1) * 3;
+});
+
+// MOMENTS
+
+function getSetQuarter (input) {
+ return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
+}
+
+// FORMATTING
+
+addFormatToken('D', ['DD', 2], 'Do', 'date');
+
+// ALIASES
+
+addUnitAlias('date', 'D');
+
+// PRIOROITY
+addUnitPriority('date', 9);
+
+// PARSING
+
+addRegexToken('D', match1to2);
+addRegexToken('DD', match1to2, match2);
+addRegexToken('Do', function (isStrict, locale) {
+ return isStrict ? locale._ordinalParse : locale._ordinalParseLenient;
+});
+
+addParseToken(['D', 'DD'], DATE);
+addParseToken('Do', function (input, array) {
+ array[DATE] = toInt(input.match(match1to2)[0], 10);
+});
+
+// MOMENTS
+
+var getSetDayOfMonth = makeGetSet('Date', true);
+
+// FORMATTING
+
+addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
+
+// ALIASES
+
+addUnitAlias('dayOfYear', 'DDD');
+
+// PRIORITY
+addUnitPriority('dayOfYear', 4);
+
+// PARSING
+
+addRegexToken('DDD', match1to3);
+addRegexToken('DDDD', match3);
+addParseToken(['DDD', 'DDDD'], function (input, array, config) {
+ config._dayOfYear = toInt(input);
+});
+
+// HELPERS
+
+// MOMENTS
+
+function getSetDayOfYear (input) {
+ var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;
+ return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
+}
+
+// FORMATTING
+
+addFormatToken('m', ['mm', 2], 0, 'minute');
+
+// ALIASES
+
+addUnitAlias('minute', 'm');
+
+// PRIORITY
+
+addUnitPriority('minute', 14);
+
+// PARSING
+
+addRegexToken('m', match1to2);
+addRegexToken('mm', match1to2, match2);
+addParseToken(['m', 'mm'], MINUTE);
+
+// MOMENTS
+
+var getSetMinute = makeGetSet('Minutes', false);
+
+// FORMATTING
+
+addFormatToken('s', ['ss', 2], 0, 'second');
+
+// ALIASES
+
+addUnitAlias('second', 's');
+
+// PRIORITY
+
+addUnitPriority('second', 15);
+
+// PARSING
+
+addRegexToken('s', match1to2);
+addRegexToken('ss', match1to2, match2);
+addParseToken(['s', 'ss'], SECOND);
+
+// MOMENTS
+
+var getSetSecond = makeGetSet('Seconds', false);
+
+// FORMATTING
+
+addFormatToken('S', 0, 0, function () {
+ return ~~(this.millisecond() / 100);
+});
+
+addFormatToken(0, ['SS', 2], 0, function () {
+ return ~~(this.millisecond() / 10);
+});
+
+addFormatToken(0, ['SSS', 3], 0, 'millisecond');
+addFormatToken(0, ['SSSS', 4], 0, function () {
+ return this.millisecond() * 10;
+});
+addFormatToken(0, ['SSSSS', 5], 0, function () {
+ return this.millisecond() * 100;
+});
+addFormatToken(0, ['SSSSSS', 6], 0, function () {
+ return this.millisecond() * 1000;
+});
+addFormatToken(0, ['SSSSSSS', 7], 0, function () {
+ return this.millisecond() * 10000;
+});
+addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
+ return this.millisecond() * 100000;
+});
+addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
+ return this.millisecond() * 1000000;
+});
+
+
+// ALIASES
+
+addUnitAlias('millisecond', 'ms');
+
+// PRIORITY
+
+addUnitPriority('millisecond', 16);
+
+// PARSING
+
+addRegexToken('S', match1to3, match1);
+addRegexToken('SS', match1to3, match2);
+addRegexToken('SSS', match1to3, match3);
+
+var token;
+for (token = 'SSSS'; token.length <= 9; token += 'S') {
+ addRegexToken(token, matchUnsigned);
+}
+
+function parseMs(input, array) {
+ array[MILLISECOND] = toInt(('0.' + input) * 1000);
+}
+
+for (token = 'S'; token.length <= 9; token += 'S') {
+ addParseToken(token, parseMs);
+}
+// MOMENTS
+
+var getSetMillisecond = makeGetSet('Milliseconds', false);
+
+// FORMATTING
+
+addFormatToken('z', 0, 0, 'zoneAbbr');
+addFormatToken('zz', 0, 0, 'zoneName');
+
+// MOMENTS
+
+function getZoneAbbr () {
+ return this._isUTC ? 'UTC' : '';
+}
+
+function getZoneName () {
+ return this._isUTC ? 'Coordinated Universal Time' : '';
+}
+
+var proto = Moment.prototype;
+
+proto.add = add;
+proto.calendar = calendar$1;
+proto.clone = clone;
+proto.diff = diff;
+proto.endOf = endOf;
+proto.format = format;
+proto.from = from;
+proto.fromNow = fromNow;
+proto.to = to;
+proto.toNow = toNow;
+proto.get = stringGet;
+proto.invalidAt = invalidAt;
+proto.isAfter = isAfter;
+proto.isBefore = isBefore;
+proto.isBetween = isBetween;
+proto.isSame = isSame;
+proto.isSameOrAfter = isSameOrAfter;
+proto.isSameOrBefore = isSameOrBefore;
+proto.isValid = isValid$1;
+proto.lang = lang;
+proto.locale = locale;
+proto.localeData = localeData;
+proto.max = prototypeMax;
+proto.min = prototypeMin;
+proto.parsingFlags = parsingFlags;
+proto.set = stringSet;
+proto.startOf = startOf;
+proto.subtract = subtract;
+proto.toArray = toArray;
+proto.toObject = toObject;
+proto.toDate = toDate;
+proto.toISOString = toISOString;
+proto.inspect = inspect;
+proto.toJSON = toJSON;
+proto.toString = toString;
+proto.unix = unix;
+proto.valueOf = valueOf;
+proto.creationData = creationData;
+
+// Year
+proto.year = getSetYear;
+proto.isLeapYear = getIsLeapYear;
+
+// Week Year
+proto.weekYear = getSetWeekYear;
+proto.isoWeekYear = getSetISOWeekYear;
+
+// Quarter
+proto.quarter = proto.quarters = getSetQuarter;
+
+// Month
+proto.month = getSetMonth;
+proto.daysInMonth = getDaysInMonth;
+
+// Week
+proto.week = proto.weeks = getSetWeek;
+proto.isoWeek = proto.isoWeeks = getSetISOWeek;
+proto.weeksInYear = getWeeksInYear;
+proto.isoWeeksInYear = getISOWeeksInYear;
+
+// Day
+proto.date = getSetDayOfMonth;
+proto.day = proto.days = getSetDayOfWeek;
+proto.weekday = getSetLocaleDayOfWeek;
+proto.isoWeekday = getSetISODayOfWeek;
+proto.dayOfYear = getSetDayOfYear;
+
+// Hour
+proto.hour = proto.hours = getSetHour;
+
+// Minute
+proto.minute = proto.minutes = getSetMinute;
+
+// Second
+proto.second = proto.seconds = getSetSecond;
+
+// Millisecond
+proto.millisecond = proto.milliseconds = getSetMillisecond;
+
+// Offset
+proto.utcOffset = getSetOffset;
+proto.utc = setOffsetToUTC;
+proto.local = setOffsetToLocal;
+proto.parseZone = setOffsetToParsedOffset;
+proto.hasAlignedHourOffset = hasAlignedHourOffset;
+proto.isDST = isDaylightSavingTime;
+proto.isLocal = isLocal;
+proto.isUtcOffset = isUtcOffset;
+proto.isUtc = isUtc;
+proto.isUTC = isUtc;
+
+// Timezone
+proto.zoneAbbr = getZoneAbbr;
+proto.zoneName = getZoneName;
+
+// Deprecations
+proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);
+proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);
+proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);
+proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);
+proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);
+
+function createUnix (input) {
+ return createLocal(input * 1000);
+}
+
+function createInZone () {
+ return createLocal.apply(null, arguments).parseZone();
+}
+
+function preParsePostFormat (string) {
+ return string;
+}
+
+var proto$1 = Locale.prototype;
+
+proto$1.calendar = calendar;
+proto$1.longDateFormat = longDateFormat;
+proto$1.invalidDate = invalidDate;
+proto$1.ordinal = ordinal;
+proto$1.preparse = preParsePostFormat;
+proto$1.postformat = preParsePostFormat;
+proto$1.relativeTime = relativeTime;
+proto$1.pastFuture = pastFuture;
+proto$1.set = set;
+
+// Month
+proto$1.months = localeMonths;
+proto$1.monthsShort = localeMonthsShort;
+proto$1.monthsParse = localeMonthsParse;
+proto$1.monthsRegex = monthsRegex;
+proto$1.monthsShortRegex = monthsShortRegex;
+
+// Week
+proto$1.week = localeWeek;
+proto$1.firstDayOfYear = localeFirstDayOfYear;
+proto$1.firstDayOfWeek = localeFirstDayOfWeek;
+
+// Day of Week
+proto$1.weekdays = localeWeekdays;
+proto$1.weekdaysMin = localeWeekdaysMin;
+proto$1.weekdaysShort = localeWeekdaysShort;
+proto$1.weekdaysParse = localeWeekdaysParse;
+
+proto$1.weekdaysRegex = weekdaysRegex;
+proto$1.weekdaysShortRegex = weekdaysShortRegex;
+proto$1.weekdaysMinRegex = weekdaysMinRegex;
+
+// Hours
+proto$1.isPM = localeIsPM;
+proto$1.meridiem = localeMeridiem;
+
+function get$1 (format, index, field, setter) {
+ var locale = getLocale();
+ var utc = createUTC().set(setter, index);
+ return locale[field](utc, format);
+}
+
+function listMonthsImpl (format, index, field) {
+ if (isNumber(format)) {
+ index = format;
+ format = undefined;
+ }
+
+ format = format || '';
+
+ if (index != null) {
+ return get$1(format, index, field, 'month');
+ }
+
+ var i;
+ var out = [];
+ for (i = 0; i < 12; i++) {
+ out[i] = get$1(format, i, field, 'month');
+ }
+ return out;
+}
+
+// ()
+// (5)
+// (fmt, 5)
+// (fmt)
+// (true)
+// (true, 5)
+// (true, fmt, 5)
+// (true, fmt)
+function listWeekdaysImpl (localeSorted, format, index, field) {
+ if (typeof localeSorted === 'boolean') {
+ if (isNumber(format)) {
+ index = format;
+ format = undefined;
+ }
+
+ format = format || '';
+ } else {
+ format = localeSorted;
+ index = format;
+ localeSorted = false;
+
+ if (isNumber(format)) {
+ index = format;
+ format = undefined;
+ }
+
+ format = format || '';
+ }
+
+ var locale = getLocale(),
+ shift = localeSorted ? locale._week.dow : 0;
+
+ if (index != null) {
+ return get$1(format, (index + shift) % 7, field, 'day');
+ }
+
+ var i;
+ var out = [];
+ for (i = 0; i < 7; i++) {
+ out[i] = get$1(format, (i + shift) % 7, field, 'day');
+ }
+ return out;
+}
+
+function listMonths (format, index) {
+ return listMonthsImpl(format, index, 'months');
+}
+
+function listMonthsShort (format, index) {
+ return listMonthsImpl(format, index, 'monthsShort');
+}
+
+function listWeekdays (localeSorted, format, index) {
+ return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
+}
+
+function listWeekdaysShort (localeSorted, format, index) {
+ return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
+}
+
+function listWeekdaysMin (localeSorted, format, index) {
+ return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
+}
+
+getSetGlobalLocale('en', {
+ ordinalParse: /\d{1,2}(th|st|nd|rd)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (toInt(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ }
+});
+
+// Side effect imports
+hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);
+hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);
+
+var mathAbs = Math.abs;
+
+function abs () {
+ var data = this._data;
+
+ this._milliseconds = mathAbs(this._milliseconds);
+ this._days = mathAbs(this._days);
+ this._months = mathAbs(this._months);
+
+ data.milliseconds = mathAbs(data.milliseconds);
+ data.seconds = mathAbs(data.seconds);
+ data.minutes = mathAbs(data.minutes);
+ data.hours = mathAbs(data.hours);
+ data.months = mathAbs(data.months);
+ data.years = mathAbs(data.years);
+
+ return this;
+}
+
+function addSubtract$1 (duration, input, value, direction) {
+ var other = createDuration(input, value);
+
+ duration._milliseconds += direction * other._milliseconds;
+ duration._days += direction * other._days;
+ duration._months += direction * other._months;
+
+ return duration._bubble();
+}
+
+// supports only 2.0-style add(1, 's') or add(duration)
+function add$1 (input, value) {
+ return addSubtract$1(this, input, value, 1);
+}
+
+// supports only 2.0-style subtract(1, 's') or subtract(duration)
+function subtract$1 (input, value) {
+ return addSubtract$1(this, input, value, -1);
+}
+
+function absCeil (number) {
+ if (number < 0) {
+ return Math.floor(number);
+ } else {
+ return Math.ceil(number);
+ }
+}
+
+function bubble () {
+ var milliseconds = this._milliseconds;
+ var days = this._days;
+ var months = this._months;
+ var data = this._data;
+ var seconds, minutes, hours, years, monthsFromDays;
+
+ // if we have a mix of positive and negative values, bubble down first
+ // check: https://github.com/moment/moment/issues/2166
+ if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||
+ (milliseconds <= 0 && days <= 0 && months <= 0))) {
+ milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
+ days = 0;
+ months = 0;
+ }
+
+ // The following code bubbles up values, see the tests for
+ // examples of what that means.
+ data.milliseconds = milliseconds % 1000;
+
+ seconds = absFloor(milliseconds / 1000);
+ data.seconds = seconds % 60;
+
+ minutes = absFloor(seconds / 60);
+ data.minutes = minutes % 60;
+
+ hours = absFloor(minutes / 60);
+ data.hours = hours % 24;
+
+ days += absFloor(hours / 24);
+
+ // convert days to months
+ monthsFromDays = absFloor(daysToMonths(days));
+ months += monthsFromDays;
+ days -= absCeil(monthsToDays(monthsFromDays));
+
+ // 12 months -> 1 year
+ years = absFloor(months / 12);
+ months %= 12;
+
+ data.days = days;
+ data.months = months;
+ data.years = years;
+
+ return this;
+}
+
+function daysToMonths (days) {
+ // 400 years have 146097 days (taking into account leap year rules)
+ // 400 years have 12 months === 4800
+ return days * 4800 / 146097;
+}
+
+function monthsToDays (months) {
+ // the reverse of daysToMonths
+ return months * 146097 / 4800;
+}
+
+function as (units) {
+ var days;
+ var months;
+ var milliseconds = this._milliseconds;
+
+ units = normalizeUnits(units);
+
+ if (units === 'month' || units === 'year') {
+ days = this._days + milliseconds / 864e5;
+ months = this._months + daysToMonths(days);
+ return units === 'month' ? months : months / 12;
+ } else {
+ // handle milliseconds separately because of floating point math errors (issue #1867)
+ days = this._days + Math.round(monthsToDays(this._months));
+ switch (units) {
+ case 'week' : return days / 7 + milliseconds / 6048e5;
+ case 'day' : return days + milliseconds / 864e5;
+ case 'hour' : return days * 24 + milliseconds / 36e5;
+ case 'minute' : return days * 1440 + milliseconds / 6e4;
+ case 'second' : return days * 86400 + milliseconds / 1000;
+ // Math.floor prevents floating point math errors here
+ case 'millisecond': return Math.floor(days * 864e5) + milliseconds;
+ default: throw new Error('Unknown unit ' + units);
+ }
+ }
+}
+
+// TODO: Use this.as('ms')?
+function valueOf$1 () {
+ return (
+ this._milliseconds +
+ this._days * 864e5 +
+ (this._months % 12) * 2592e6 +
+ toInt(this._months / 12) * 31536e6
+ );
+}
+
+function makeAs (alias) {
+ return function () {
+ return this.as(alias);
+ };
+}
+
+var asMilliseconds = makeAs('ms');
+var asSeconds = makeAs('s');
+var asMinutes = makeAs('m');
+var asHours = makeAs('h');
+var asDays = makeAs('d');
+var asWeeks = makeAs('w');
+var asMonths = makeAs('M');
+var asYears = makeAs('y');
+
+function get$2 (units) {
+ units = normalizeUnits(units);
+ return this[units + 's']();
+}
+
+function makeGetter(name) {
+ return function () {
+ return this._data[name];
+ };
+}
+
+var milliseconds = makeGetter('milliseconds');
+var seconds = makeGetter('seconds');
+var minutes = makeGetter('minutes');
+var hours = makeGetter('hours');
+var days = makeGetter('days');
+var months = makeGetter('months');
+var years = makeGetter('years');
+
+function weeks () {
+ return absFloor(this.days() / 7);
+}
+
+var round = Math.round;
+var thresholds = {
+ s: 45, // seconds to minute
+ m: 45, // minutes to hour
+ h: 22, // hours to day
+ d: 26, // days to month
+ M: 11 // months to year
+};
+
+// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
+function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
+ return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
+}
+
+function relativeTime$1 (posNegDuration, withoutSuffix, locale) {
+ var duration = createDuration(posNegDuration).abs();
+ var seconds = round(duration.as('s'));
+ var minutes = round(duration.as('m'));
+ var hours = round(duration.as('h'));
+ var days = round(duration.as('d'));
+ var months = round(duration.as('M'));
+ var years = round(duration.as('y'));
+
+ var a = seconds < thresholds.s && ['s', seconds] ||
+ minutes <= 1 && ['m'] ||
+ minutes < thresholds.m && ['mm', minutes] ||
+ hours <= 1 && ['h'] ||
+ hours < thresholds.h && ['hh', hours] ||
+ days <= 1 && ['d'] ||
+ days < thresholds.d && ['dd', days] ||
+ months <= 1 && ['M'] ||
+ months < thresholds.M && ['MM', months] ||
+ years <= 1 && ['y'] || ['yy', years];
+
+ a[2] = withoutSuffix;
+ a[3] = +posNegDuration > 0;
+ a[4] = locale;
+ return substituteTimeAgo.apply(null, a);
+}
+
+// This function allows you to set the rounding function for relative time strings
+function getSetRelativeTimeRounding (roundingFunction) {
+ if (roundingFunction === undefined) {
+ return round;
+ }
+ if (typeof(roundingFunction) === 'function') {
+ round = roundingFunction;
+ return true;
+ }
+ return false;
+}
+
+// This function allows you to set a threshold for relative time strings
+function getSetRelativeTimeThreshold (threshold, limit) {
+ if (thresholds[threshold] === undefined) {
+ return false;
+ }
+ if (limit === undefined) {
+ return thresholds[threshold];
+ }
+ thresholds[threshold] = limit;
+ return true;
+}
+
+function humanize (withSuffix) {
+ var locale = this.localeData();
+ var output = relativeTime$1(this, !withSuffix, locale);
+
+ if (withSuffix) {
+ output = locale.pastFuture(+this, output);
+ }
+
+ return locale.postformat(output);
+}
+
+var abs$1 = Math.abs;
+
+function toISOString$1() {
+ // for ISO strings we do not use the normal bubbling rules:
+ // * milliseconds bubble up until they become hours
+ // * days do not bubble at all
+ // * months bubble up until they become years
+ // This is because there is no context-free conversion between hours and days
+ // (think of clock changes)
+ // and also not between days and months (28-31 days per month)
+ var seconds = abs$1(this._milliseconds) / 1000;
+ var days = abs$1(this._days);
+ var months = abs$1(this._months);
+ var minutes, hours, years;
+
+ // 3600 seconds -> 60 minutes -> 1 hour
+ minutes = absFloor(seconds / 60);
+ hours = absFloor(minutes / 60);
+ seconds %= 60;
+ minutes %= 60;
+
+ // 12 months -> 1 year
+ years = absFloor(months / 12);
+ months %= 12;
+
+
+ // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
+ var Y = years;
+ var M = months;
+ var D = days;
+ var h = hours;
+ var m = minutes;
+ var s = seconds;
+ var total = this.asSeconds();
+
+ if (!total) {
+ // this is the same as C#'s (Noda) and python (isodate)...
+ // but not other JS (goog.date)
+ return 'P0D';
+ }
+
+ return (total < 0 ? '-' : '') +
+ 'P' +
+ (Y ? Y + 'Y' : '') +
+ (M ? M + 'M' : '') +
+ (D ? D + 'D' : '') +
+ ((h || m || s) ? 'T' : '') +
+ (h ? h + 'H' : '') +
+ (m ? m + 'M' : '') +
+ (s ? s + 'S' : '');
+}
+
+var proto$2 = Duration.prototype;
+
+proto$2.abs = abs;
+proto$2.add = add$1;
+proto$2.subtract = subtract$1;
+proto$2.as = as;
+proto$2.asMilliseconds = asMilliseconds;
+proto$2.asSeconds = asSeconds;
+proto$2.asMinutes = asMinutes;
+proto$2.asHours = asHours;
+proto$2.asDays = asDays;
+proto$2.asWeeks = asWeeks;
+proto$2.asMonths = asMonths;
+proto$2.asYears = asYears;
+proto$2.valueOf = valueOf$1;
+proto$2._bubble = bubble;
+proto$2.get = get$2;
+proto$2.milliseconds = milliseconds;
+proto$2.seconds = seconds;
+proto$2.minutes = minutes;
+proto$2.hours = hours;
+proto$2.days = days;
+proto$2.weeks = weeks;
+proto$2.months = months;
+proto$2.years = years;
+proto$2.humanize = humanize;
+proto$2.toISOString = toISOString$1;
+proto$2.toString = toISOString$1;
+proto$2.toJSON = toISOString$1;
+proto$2.locale = locale;
+proto$2.localeData = localeData;
+
+// Deprecations
+proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);
+proto$2.lang = lang;
+
+// Side effect imports
+
+// FORMATTING
+
+addFormatToken('X', 0, 0, 'unix');
+addFormatToken('x', 0, 0, 'valueOf');
+
+// PARSING
+
+addRegexToken('x', matchSigned);
+addRegexToken('X', matchTimestamp);
+addParseToken('X', function (input, array, config) {
+ config._d = new Date(parseFloat(input, 10) * 1000);
+});
+addParseToken('x', function (input, array, config) {
+ config._d = new Date(toInt(input));
+});
+
+// Side effect imports
+
+
+hooks.version = '2.17.1';
+
+setHookCallback(createLocal);
+
+hooks.fn = proto;
+hooks.min = min;
+hooks.max = max;
+hooks.now = now;
+hooks.utc = createUTC;
+hooks.unix = createUnix;
+hooks.months = listMonths;
+hooks.isDate = isDate;
+hooks.locale = getSetGlobalLocale;
+hooks.invalid = createInvalid;
+hooks.duration = createDuration;
+hooks.isMoment = isMoment;
+hooks.weekdays = listWeekdays;
+hooks.parseZone = createInZone;
+hooks.localeData = getLocale;
+hooks.isDuration = isDuration;
+hooks.monthsShort = listMonthsShort;
+hooks.weekdaysMin = listWeekdaysMin;
+hooks.defineLocale = defineLocale;
+hooks.updateLocale = updateLocale;
+hooks.locales = listLocales;
+hooks.weekdaysShort = listWeekdaysShort;
+hooks.normalizeUnits = normalizeUnits;
+hooks.relativeTimeRounding = getSetRelativeTimeRounding;
+hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
+hooks.calendarFormat = getCalendarFormat;
+hooks.prototype = proto;
+
+return hooks;
+
+})));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/check-overflow.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/check-overflow.js
new file mode 100644
index 00000000000..41b539fb733
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/check-overflow.js
@@ -0,0 +1,34 @@
+import { daysInMonth } from '../units/month';
+import { YEAR, MONTH, DATE, HOUR, MINUTE, SECOND, MILLISECOND, WEEK, WEEKDAY } from '../units/constants';
+import getParsingFlags from '../create/parsing-flags';
+
+export default function checkOverflow (m) {
+ var overflow;
+ var a = m._a;
+
+ if (a && getParsingFlags(m).overflow === -2) {
+ overflow =
+ a[MONTH] < 0 || a[MONTH] > 11 ? MONTH :
+ a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE :
+ a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :
+ a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :
+ a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :
+ a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :
+ -1;
+
+ if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
+ overflow = DATE;
+ }
+ if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
+ overflow = WEEK;
+ }
+ if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
+ overflow = WEEKDAY;
+ }
+
+ getParsingFlags(m).overflow = overflow;
+ }
+
+ return m;
+}
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/date-from-array.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/date-from-array.js
new file mode 100644
index 00000000000..180f55c717f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/date-from-array.js
@@ -0,0 +1,21 @@
+export function createDate (y, m, d, h, M, s, ms) {
+ //can't just apply() to create a date:
+ //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
+ var date = new Date(y, m, d, h, M, s, ms);
+
+ //the date constructor remaps years 0-99 to 1900-1999
+ if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {
+ date.setFullYear(y);
+ }
+ return date;
+}
+
+export function createUTCDate (y) {
+ var date = new Date(Date.UTC.apply(null, arguments));
+
+ //the Date.UTC function remaps years 0-99 to 1900-1999
+ if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {
+ date.setUTCFullYear(y);
+ }
+ return date;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-anything.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-anything.js
new file mode 100644
index 00000000000..ae76f8544cf
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-anything.js
@@ -0,0 +1,109 @@
+import isArray from '../utils/is-array';
+import isObject from '../utils/is-object';
+import isObjectEmpty from '../utils/is-object-empty';
+import isNumber from '../utils/is-number';
+import isDate from '../utils/is-date';
+import map from '../utils/map';
+import { createInvalid } from './valid';
+import { Moment, isMoment } from '../moment/constructor';
+import { getLocale } from '../locale/locales';
+import { hooks } from '../utils/hooks';
+import checkOverflow from './check-overflow';
+import { isValid } from './valid';
+
+import { configFromStringAndArray } from './from-string-and-array';
+import { configFromStringAndFormat } from './from-string-and-format';
+import { configFromString } from './from-string';
+import { configFromArray } from './from-array';
+import { configFromObject } from './from-object';
+
+function createFromConfig (config) {
+ var res = new Moment(checkOverflow(prepareConfig(config)));
+ if (res._nextDay) {
+ // Adding is smart enough around DST
+ res.add(1, 'd');
+ res._nextDay = undefined;
+ }
+
+ return res;
+}
+
+export function prepareConfig (config) {
+ var input = config._i,
+ format = config._f;
+
+ config._locale = config._locale || getLocale(config._l);
+
+ if (input === null || (format === undefined && input === '')) {
+ return createInvalid({nullInput: true});
+ }
+
+ if (typeof input === 'string') {
+ config._i = input = config._locale.preparse(input);
+ }
+
+ if (isMoment(input)) {
+ return new Moment(checkOverflow(input));
+ } else if (isDate(input)) {
+ config._d = input;
+ } else if (isArray(format)) {
+ configFromStringAndArray(config);
+ } else if (format) {
+ configFromStringAndFormat(config);
+ } else {
+ configFromInput(config);
+ }
+
+ if (!isValid(config)) {
+ config._d = null;
+ }
+
+ return config;
+}
+
+function configFromInput(config) {
+ var input = config._i;
+ if (input === undefined) {
+ config._d = new Date(hooks.now());
+ } else if (isDate(input)) {
+ config._d = new Date(input.valueOf());
+ } else if (typeof input === 'string') {
+ configFromString(config);
+ } else if (isArray(input)) {
+ config._a = map(input.slice(0), function (obj) {
+ return parseInt(obj, 10);
+ });
+ configFromArray(config);
+ } else if (typeof(input) === 'object') {
+ configFromObject(config);
+ } else if (isNumber(input)) {
+ // from milliseconds
+ config._d = new Date(input);
+ } else {
+ hooks.createFromInputFallback(config);
+ }
+}
+
+export function createLocalOrUTC (input, format, locale, strict, isUTC) {
+ var c = {};
+
+ if (locale === true || locale === false) {
+ strict = locale;
+ locale = undefined;
+ }
+
+ if ((isObject(input) && isObjectEmpty(input)) ||
+ (isArray(input) && input.length === 0)) {
+ input = undefined;
+ }
+ // object construction must be done this way.
+ // https://github.com/moment/moment/issues/1423
+ c._isAMomentObject = true;
+ c._useUTC = c._isUTC = isUTC;
+ c._l = locale;
+ c._i = input;
+ c._f = format;
+ c._strict = strict;
+
+ return createFromConfig(c);
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-array.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-array.js
new file mode 100644
index 00000000000..3ae35a0bdd2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-array.js
@@ -0,0 +1,140 @@
+import { hooks } from '../utils/hooks';
+import { createDate, createUTCDate } from './date-from-array';
+import { daysInYear } from '../units/year';
+import { weekOfYear, weeksInYear, dayOfYearFromWeeks } from '../units/week-calendar-utils';
+import { YEAR, MONTH, DATE, HOUR, MINUTE, SECOND, MILLISECOND } from '../units/constants';
+import { createLocal } from './local';
+import defaults from '../utils/defaults';
+import getParsingFlags from './parsing-flags';
+
+function currentDateArray(config) {
+ // hooks is actually the exported moment object
+ var nowValue = new Date(hooks.now());
+ if (config._useUTC) {
+ return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];
+ }
+ return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
+}
+
+// convert an array to a date.
+// the array should mirror the parameters below
+// note: all values past the year are optional and will default to the lowest possible value.
+// [year, month, day , hour, minute, second, millisecond]
+export function configFromArray (config) {
+ var i, date, input = [], currentDate, yearToUse;
+
+ if (config._d) {
+ return;
+ }
+
+ currentDate = currentDateArray(config);
+
+ //compute day of the year from weeks and weekdays
+ if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
+ dayOfYearFromWeekInfo(config);
+ }
+
+ //if the day of the year is set, figure out what it is
+ if (config._dayOfYear) {
+ yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);
+
+ if (config._dayOfYear > daysInYear(yearToUse)) {
+ getParsingFlags(config)._overflowDayOfYear = true;
+ }
+
+ date = createUTCDate(yearToUse, 0, config._dayOfYear);
+ config._a[MONTH] = date.getUTCMonth();
+ config._a[DATE] = date.getUTCDate();
+ }
+
+ // Default to current date.
+ // * if no year, month, day of month are given, default to today
+ // * if day of month is given, default month and year
+ // * if month is given, default only year
+ // * if year is given, don't default anything
+ for (i = 0; i < 3 && config._a[i] == null; ++i) {
+ config._a[i] = input[i] = currentDate[i];
+ }
+
+ // Zero out whatever was not defaulted, including time
+ for (; i < 7; i++) {
+ config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
+ }
+
+ // Check for 24:00:00.000
+ if (config._a[HOUR] === 24 &&
+ config._a[MINUTE] === 0 &&
+ config._a[SECOND] === 0 &&
+ config._a[MILLISECOND] === 0) {
+ config._nextDay = true;
+ config._a[HOUR] = 0;
+ }
+
+ config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
+ // Apply timezone offset from input. The actual utcOffset can be changed
+ // with parseZone.
+ if (config._tzm != null) {
+ config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
+ }
+
+ if (config._nextDay) {
+ config._a[HOUR] = 24;
+ }
+}
+
+function dayOfYearFromWeekInfo(config) {
+ var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;
+
+ w = config._w;
+ if (w.GG != null || w.W != null || w.E != null) {
+ dow = 1;
+ doy = 4;
+
+ // TODO: We need to take the current isoWeekYear, but that depends on
+ // how we interpret now (local, utc, fixed offset). So create
+ // a now version of current config (take local/utc/offset flags, and
+ // create now).
+ weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);
+ week = defaults(w.W, 1);
+ weekday = defaults(w.E, 1);
+ if (weekday < 1 || weekday > 7) {
+ weekdayOverflow = true;
+ }
+ } else {
+ dow = config._locale._week.dow;
+ doy = config._locale._week.doy;
+
+ var curWeek = weekOfYear(createLocal(), dow, doy);
+
+ weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);
+
+ // Default to current week.
+ week = defaults(w.w, curWeek.week);
+
+ if (w.d != null) {
+ // weekday -- low day numbers are considered next week
+ weekday = w.d;
+ if (weekday < 0 || weekday > 6) {
+ weekdayOverflow = true;
+ }
+ } else if (w.e != null) {
+ // local weekday -- counting starts from begining of week
+ weekday = w.e + dow;
+ if (w.e < 0 || w.e > 6) {
+ weekdayOverflow = true;
+ }
+ } else {
+ // default to begining of week
+ weekday = dow;
+ }
+ }
+ if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
+ getParsingFlags(config)._overflowWeeks = true;
+ } else if (weekdayOverflow != null) {
+ getParsingFlags(config)._overflowWeekday = true;
+ } else {
+ temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
+ config._a[YEAR] = temp.year;
+ config._dayOfYear = temp.dayOfYear;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-object.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-object.js
new file mode 100644
index 00000000000..c0bfe9f8d5d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-object.js
@@ -0,0 +1,16 @@
+import { normalizeObjectUnits } from '../units/aliases';
+import { configFromArray } from './from-array';
+import map from '../utils/map';
+
+export function configFromObject(config) {
+ if (config._d) {
+ return;
+ }
+
+ var i = normalizeObjectUnits(config._i);
+ config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {
+ return obj && parseInt(obj, 10);
+ });
+
+ configFromArray(config);
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-string-and-array.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-string-and-array.js
new file mode 100644
index 00000000000..1d8a7a806cd
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-string-and-array.js
@@ -0,0 +1,50 @@
+import { copyConfig } from '../moment/constructor';
+import { configFromStringAndFormat } from './from-string-and-format';
+import getParsingFlags from './parsing-flags';
+import { isValid } from './valid';
+import extend from '../utils/extend';
+
+// date from string and array of format strings
+export function configFromStringAndArray(config) {
+ var tempConfig,
+ bestMoment,
+
+ scoreToBeat,
+ i,
+ currentScore;
+
+ if (config._f.length === 0) {
+ getParsingFlags(config).invalidFormat = true;
+ config._d = new Date(NaN);
+ return;
+ }
+
+ for (i = 0; i < config._f.length; i++) {
+ currentScore = 0;
+ tempConfig = copyConfig({}, config);
+ if (config._useUTC != null) {
+ tempConfig._useUTC = config._useUTC;
+ }
+ tempConfig._f = config._f[i];
+ configFromStringAndFormat(tempConfig);
+
+ if (!isValid(tempConfig)) {
+ continue;
+ }
+
+ // if there is any input that was not parsed add a penalty for that format
+ currentScore += getParsingFlags(tempConfig).charsLeftOver;
+
+ //or tokens
+ currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
+
+ getParsingFlags(tempConfig).score = currentScore;
+
+ if (scoreToBeat == null || currentScore < scoreToBeat) {
+ scoreToBeat = currentScore;
+ bestMoment = tempConfig;
+ }
+ }
+
+ extend(config, bestMoment || tempConfig);
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-string-and-format.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-string-and-format.js
new file mode 100644
index 00000000000..2ef23515c55
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-string-and-format.js
@@ -0,0 +1,107 @@
+import { configFromISO } from './from-string';
+import { configFromArray } from './from-array';
+import { getParseRegexForToken } from '../parse/regex';
+import { addTimeToArrayFromToken } from '../parse/token';
+import { expandFormat, formatTokenFunctions, formattingTokens } from '../format/format';
+import checkOverflow from './check-overflow';
+import { HOUR } from '../units/constants';
+import { hooks } from '../utils/hooks';
+import getParsingFlags from './parsing-flags';
+
+// constant that refers to the ISO standard
+hooks.ISO_8601 = function () {};
+
+// date from string and format string
+export function configFromStringAndFormat(config) {
+ // TODO: Move this to another part of the creation flow to prevent circular deps
+ if (config._f === hooks.ISO_8601) {
+ configFromISO(config);
+ return;
+ }
+
+ config._a = [];
+ getParsingFlags(config).empty = true;
+
+ // This array is used to make a Date, either with `new Date` or `Date.UTC`
+ var string = '' + config._i,
+ i, parsedInput, tokens, token, skipped,
+ stringLength = string.length,
+ totalParsedInputLength = 0;
+
+ tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];
+
+ for (i = 0; i < tokens.length; i++) {
+ token = tokens[i];
+ parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
+ // console.log('token', token, 'parsedInput', parsedInput,
+ // 'regex', getParseRegexForToken(token, config));
+ if (parsedInput) {
+ skipped = string.substr(0, string.indexOf(parsedInput));
+ if (skipped.length > 0) {
+ getParsingFlags(config).unusedInput.push(skipped);
+ }
+ string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
+ totalParsedInputLength += parsedInput.length;
+ }
+ // don't parse if it's not a known token
+ if (formatTokenFunctions[token]) {
+ if (parsedInput) {
+ getParsingFlags(config).empty = false;
+ }
+ else {
+ getParsingFlags(config).unusedTokens.push(token);
+ }
+ addTimeToArrayFromToken(token, parsedInput, config);
+ }
+ else if (config._strict && !parsedInput) {
+ getParsingFlags(config).unusedTokens.push(token);
+ }
+ }
+
+ // add remaining unparsed input length to the string
+ getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;
+ if (string.length > 0) {
+ getParsingFlags(config).unusedInput.push(string);
+ }
+
+ // clear _12h flag if hour is <= 12
+ if (config._a[HOUR] <= 12 &&
+ getParsingFlags(config).bigHour === true &&
+ config._a[HOUR] > 0) {
+ getParsingFlags(config).bigHour = undefined;
+ }
+
+ getParsingFlags(config).parsedDateParts = config._a.slice(0);
+ getParsingFlags(config).meridiem = config._meridiem;
+ // handle meridiem
+ config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);
+
+ configFromArray(config);
+ checkOverflow(config);
+}
+
+
+function meridiemFixWrap (locale, hour, meridiem) {
+ var isPm;
+
+ if (meridiem == null) {
+ // nothing to do
+ return hour;
+ }
+ if (locale.meridiemHour != null) {
+ return locale.meridiemHour(hour, meridiem);
+ } else if (locale.isPM != null) {
+ // Fallback
+ isPm = locale.isPM(meridiem);
+ if (isPm && hour < 12) {
+ hour += 12;
+ }
+ if (!isPm && hour === 12) {
+ hour = 0;
+ }
+ return hour;
+ } else {
+ // this is not supposed to happen
+ return hour;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-string.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-string.js
new file mode 100644
index 00000000000..63df05ea8da
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/from-string.js
@@ -0,0 +1,120 @@
+import { configFromStringAndFormat } from './from-string-and-format';
+import { hooks } from '../utils/hooks';
+import { deprecate } from '../utils/deprecate';
+import getParsingFlags from './parsing-flags';
+
+// iso 8601 regex
+// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
+var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
+var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
+
+var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/;
+
+var isoDates = [
+ ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
+ ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
+ ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
+ ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
+ ['YYYY-DDD', /\d{4}-\d{3}/],
+ ['YYYY-MM', /\d{4}-\d\d/, false],
+ ['YYYYYYMMDD', /[+-]\d{10}/],
+ ['YYYYMMDD', /\d{8}/],
+ // YYYYMM is NOT allowed by the standard
+ ['GGGG[W]WWE', /\d{4}W\d{3}/],
+ ['GGGG[W]WW', /\d{4}W\d{2}/, false],
+ ['YYYYDDD', /\d{7}/]
+];
+
+// iso time formats and regexes
+var isoTimes = [
+ ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
+ ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
+ ['HH:mm:ss', /\d\d:\d\d:\d\d/],
+ ['HH:mm', /\d\d:\d\d/],
+ ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
+ ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
+ ['HHmmss', /\d\d\d\d\d\d/],
+ ['HHmm', /\d\d\d\d/],
+ ['HH', /\d\d/]
+];
+
+var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i;
+
+// date from iso format
+export function configFromISO(config) {
+ var i, l,
+ string = config._i,
+ match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
+ allowTime, dateFormat, timeFormat, tzFormat;
+
+ if (match) {
+ getParsingFlags(config).iso = true;
+
+ for (i = 0, l = isoDates.length; i < l; i++) {
+ if (isoDates[i][1].exec(match[1])) {
+ dateFormat = isoDates[i][0];
+ allowTime = isoDates[i][2] !== false;
+ break;
+ }
+ }
+ if (dateFormat == null) {
+ config._isValid = false;
+ return;
+ }
+ if (match[3]) {
+ for (i = 0, l = isoTimes.length; i < l; i++) {
+ if (isoTimes[i][1].exec(match[3])) {
+ // match[2] should be 'T' or space
+ timeFormat = (match[2] || ' ') + isoTimes[i][0];
+ break;
+ }
+ }
+ if (timeFormat == null) {
+ config._isValid = false;
+ return;
+ }
+ }
+ if (!allowTime && timeFormat != null) {
+ config._isValid = false;
+ return;
+ }
+ if (match[4]) {
+ if (tzRegex.exec(match[4])) {
+ tzFormat = 'Z';
+ } else {
+ config._isValid = false;
+ return;
+ }
+ }
+ config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
+ configFromStringAndFormat(config);
+ } else {
+ config._isValid = false;
+ }
+}
+
+// date from iso format or fallback
+export function configFromString(config) {
+ var matched = aspNetJsonRegex.exec(config._i);
+
+ if (matched !== null) {
+ config._d = new Date(+matched[1]);
+ return;
+ }
+
+ configFromISO(config);
+ if (config._isValid === false) {
+ delete config._isValid;
+ hooks.createFromInputFallback(config);
+ }
+}
+
+hooks.createFromInputFallback = deprecate(
+ 'value provided is not in a recognized ISO format. moment construction falls back to js Date(), ' +
+ 'which is not reliable across all browsers and versions. Non ISO date formats are ' +
+ 'discouraged and will be removed in an upcoming major release. Please refer to ' +
+ 'http://momentjs.com/guides/#/warnings/js-date/ for more info.',
+ function (config) {
+ config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
+ }
+);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/local.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/local.js
new file mode 100644
index 00000000000..88c1e269289
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/local.js
@@ -0,0 +1,5 @@
+import { createLocalOrUTC } from './from-anything';
+
+export function createLocal (input, format, locale, strict) {
+ return createLocalOrUTC(input, format, locale, strict, false);
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/parsing-flags.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/parsing-flags.js
new file mode 100644
index 00000000000..5a4220013a3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/parsing-flags.js
@@ -0,0 +1,24 @@
+function defaultParsingFlags() {
+ // We need to deep clone this object.
+ return {
+ empty : false,
+ unusedTokens : [],
+ unusedInput : [],
+ overflow : -2,
+ charsLeftOver : 0,
+ nullInput : false,
+ invalidMonth : null,
+ invalidFormat : false,
+ userInvalidated : false,
+ iso : false,
+ parsedDateParts : [],
+ meridiem : null
+ };
+}
+
+export default function getParsingFlags(m) {
+ if (m._pf == null) {
+ m._pf = defaultParsingFlags();
+ }
+ return m._pf;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/utc.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/utc.js
new file mode 100644
index 00000000000..96139530e26
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/utc.js
@@ -0,0 +1,5 @@
+import { createLocalOrUTC } from './from-anything';
+
+export function createUTC (input, format, locale, strict) {
+ return createLocalOrUTC(input, format, locale, strict, true).utc();
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/valid.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/valid.js
new file mode 100644
index 00000000000..96b1cf615dc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/create/valid.js
@@ -0,0 +1,49 @@
+import extend from '../utils/extend';
+import { createUTC } from './utc';
+import getParsingFlags from '../create/parsing-flags';
+import some from '../utils/some';
+
+export function isValid(m) {
+ if (m._isValid == null) {
+ var flags = getParsingFlags(m);
+ var parsedParts = some.call(flags.parsedDateParts, function (i) {
+ return i != null;
+ });
+ var isNowValid = !isNaN(m._d.getTime()) &&
+ flags.overflow < 0 &&
+ !flags.empty &&
+ !flags.invalidMonth &&
+ !flags.invalidWeekday &&
+ !flags.nullInput &&
+ !flags.invalidFormat &&
+ !flags.userInvalidated &&
+ (!flags.meridiem || (flags.meridiem && parsedParts));
+
+ if (m._strict) {
+ isNowValid = isNowValid &&
+ flags.charsLeftOver === 0 &&
+ flags.unusedTokens.length === 0 &&
+ flags.bigHour === undefined;
+ }
+
+ if (Object.isFrozen == null || !Object.isFrozen(m)) {
+ m._isValid = isNowValid;
+ }
+ else {
+ return isNowValid;
+ }
+ }
+ return m._isValid;
+}
+
+export function createInvalid (flags) {
+ var m = createUTC(NaN);
+ if (flags != null) {
+ extend(getParsingFlags(m), flags);
+ }
+ else {
+ getParsingFlags(m).userInvalidated = true;
+ }
+
+ return m;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/abs.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/abs.js
new file mode 100644
index 00000000000..103a4cf9b30
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/abs.js
@@ -0,0 +1,18 @@
+var mathAbs = Math.abs;
+
+export function abs () {
+ var data = this._data;
+
+ this._milliseconds = mathAbs(this._milliseconds);
+ this._days = mathAbs(this._days);
+ this._months = mathAbs(this._months);
+
+ data.milliseconds = mathAbs(data.milliseconds);
+ data.seconds = mathAbs(data.seconds);
+ data.minutes = mathAbs(data.minutes);
+ data.hours = mathAbs(data.hours);
+ data.months = mathAbs(data.months);
+ data.years = mathAbs(data.years);
+
+ return this;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/add-subtract.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/add-subtract.js
new file mode 100644
index 00000000000..3b44e186fcc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/add-subtract.js
@@ -0,0 +1,21 @@
+import { createDuration } from './create';
+
+function addSubtract (duration, input, value, direction) {
+ var other = createDuration(input, value);
+
+ duration._milliseconds += direction * other._milliseconds;
+ duration._days += direction * other._days;
+ duration._months += direction * other._months;
+
+ return duration._bubble();
+}
+
+// supports only 2.0-style add(1, 's') or add(duration)
+export function add (input, value) {
+ return addSubtract(this, input, value, 1);
+}
+
+// supports only 2.0-style subtract(1, 's') or subtract(duration)
+export function subtract (input, value) {
+ return addSubtract(this, input, value, -1);
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/as.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/as.js
new file mode 100644
index 00000000000..03ecd6dab25
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/as.js
@@ -0,0 +1,55 @@
+import { daysToMonths, monthsToDays } from './bubble';
+import { normalizeUnits } from '../units/aliases';
+import toInt from '../utils/to-int';
+
+export function as (units) {
+ var days;
+ var months;
+ var milliseconds = this._milliseconds;
+
+ units = normalizeUnits(units);
+
+ if (units === 'month' || units === 'year') {
+ days = this._days + milliseconds / 864e5;
+ months = this._months + daysToMonths(days);
+ return units === 'month' ? months : months / 12;
+ } else {
+ // handle milliseconds separately because of floating point math errors (issue #1867)
+ days = this._days + Math.round(monthsToDays(this._months));
+ switch (units) {
+ case 'week' : return days / 7 + milliseconds / 6048e5;
+ case 'day' : return days + milliseconds / 864e5;
+ case 'hour' : return days * 24 + milliseconds / 36e5;
+ case 'minute' : return days * 1440 + milliseconds / 6e4;
+ case 'second' : return days * 86400 + milliseconds / 1000;
+ // Math.floor prevents floating point math errors here
+ case 'millisecond': return Math.floor(days * 864e5) + milliseconds;
+ default: throw new Error('Unknown unit ' + units);
+ }
+ }
+}
+
+// TODO: Use this.as('ms')?
+export function valueOf () {
+ return (
+ this._milliseconds +
+ this._days * 864e5 +
+ (this._months % 12) * 2592e6 +
+ toInt(this._months / 12) * 31536e6
+ );
+}
+
+function makeAs (alias) {
+ return function () {
+ return this.as(alias);
+ };
+}
+
+export var asMilliseconds = makeAs('ms');
+export var asSeconds = makeAs('s');
+export var asMinutes = makeAs('m');
+export var asHours = makeAs('h');
+export var asDays = makeAs('d');
+export var asWeeks = makeAs('w');
+export var asMonths = makeAs('M');
+export var asYears = makeAs('y');
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/bubble.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/bubble.js
new file mode 100644
index 00000000000..0c4a336ec47
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/bubble.js
@@ -0,0 +1,61 @@
+import absFloor from '../utils/abs-floor';
+import absCeil from '../utils/abs-ceil';
+import { createUTCDate } from '../create/date-from-array';
+
+export function bubble () {
+ var milliseconds = this._milliseconds;
+ var days = this._days;
+ var months = this._months;
+ var data = this._data;
+ var seconds, minutes, hours, years, monthsFromDays;
+
+ // if we have a mix of positive and negative values, bubble down first
+ // check: https://github.com/moment/moment/issues/2166
+ if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||
+ (milliseconds <= 0 && days <= 0 && months <= 0))) {
+ milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
+ days = 0;
+ months = 0;
+ }
+
+ // The following code bubbles up values, see the tests for
+ // examples of what that means.
+ data.milliseconds = milliseconds % 1000;
+
+ seconds = absFloor(milliseconds / 1000);
+ data.seconds = seconds % 60;
+
+ minutes = absFloor(seconds / 60);
+ data.minutes = minutes % 60;
+
+ hours = absFloor(minutes / 60);
+ data.hours = hours % 24;
+
+ days += absFloor(hours / 24);
+
+ // convert days to months
+ monthsFromDays = absFloor(daysToMonths(days));
+ months += monthsFromDays;
+ days -= absCeil(monthsToDays(monthsFromDays));
+
+ // 12 months -> 1 year
+ years = absFloor(months / 12);
+ months %= 12;
+
+ data.days = days;
+ data.months = months;
+ data.years = years;
+
+ return this;
+}
+
+export function daysToMonths (days) {
+ // 400 years have 146097 days (taking into account leap year rules)
+ // 400 years have 12 months === 4800
+ return days * 4800 / 146097;
+}
+
+export function monthsToDays (months) {
+ // the reverse of daysToMonths
+ return months * 146097 / 4800;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/constructor.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/constructor.js
new file mode 100644
index 00000000000..fb01c704137
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/constructor.js
@@ -0,0 +1,41 @@
+import { normalizeObjectUnits } from '../units/aliases';
+import { getLocale } from '../locale/locales';
+
+export function Duration (duration) {
+ var normalizedInput = normalizeObjectUnits(duration),
+ years = normalizedInput.year || 0,
+ quarters = normalizedInput.quarter || 0,
+ months = normalizedInput.month || 0,
+ weeks = normalizedInput.week || 0,
+ days = normalizedInput.day || 0,
+ hours = normalizedInput.hour || 0,
+ minutes = normalizedInput.minute || 0,
+ seconds = normalizedInput.second || 0,
+ milliseconds = normalizedInput.millisecond || 0;
+
+ // representation for dateAddRemove
+ this._milliseconds = +milliseconds +
+ seconds * 1e3 + // 1000
+ minutes * 6e4 + // 1000 * 60
+ hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
+ // Because of dateAddRemove treats 24 hours as different from a
+ // day when working around DST, we need to store them separately
+ this._days = +days +
+ weeks * 7;
+ // It is impossible translate months into days without knowing
+ // which months you are are talking about, so we have to store
+ // it separately.
+ this._months = +months +
+ quarters * 3 +
+ years * 12;
+
+ this._data = {};
+
+ this._locale = getLocale();
+
+ this._bubble();
+}
+
+export function isDuration (obj) {
+ return obj instanceof Duration;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/create.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/create.js
new file mode 100644
index 00000000000..09af9e24f7b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/create.js
@@ -0,0 +1,120 @@
+import { Duration, isDuration } from './constructor';
+import isNumber from '../utils/is-number';
+import toInt from '../utils/to-int';
+import absRound from '../utils/abs-round';
+import hasOwnProp from '../utils/has-own-prop';
+import { DATE, HOUR, MINUTE, SECOND, MILLISECOND } from '../units/constants';
+import { cloneWithOffset } from '../units/offset';
+import { createLocal } from '../create/local';
+
+// ASP.NET json date format regex
+var aspNetRegex = /^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/;
+
+// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
+// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
+// and further modified to allow for strings containing both week and day
+var isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;
+
+export function createDuration (input, key) {
+ var duration = input,
+ // matching against regexp is expensive, do it on demand
+ match = null,
+ sign,
+ ret,
+ diffRes;
+
+ if (isDuration(input)) {
+ duration = {
+ ms : input._milliseconds,
+ d : input._days,
+ M : input._months
+ };
+ } else if (isNumber(input)) {
+ duration = {};
+ if (key) {
+ duration[key] = input;
+ } else {
+ duration.milliseconds = input;
+ }
+ } else if (!!(match = aspNetRegex.exec(input))) {
+ sign = (match[1] === '-') ? -1 : 1;
+ duration = {
+ y : 0,
+ d : toInt(match[DATE]) * sign,
+ h : toInt(match[HOUR]) * sign,
+ m : toInt(match[MINUTE]) * sign,
+ s : toInt(match[SECOND]) * sign,
+ ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match
+ };
+ } else if (!!(match = isoRegex.exec(input))) {
+ sign = (match[1] === '-') ? -1 : 1;
+ duration = {
+ y : parseIso(match[2], sign),
+ M : parseIso(match[3], sign),
+ w : parseIso(match[4], sign),
+ d : parseIso(match[5], sign),
+ h : parseIso(match[6], sign),
+ m : parseIso(match[7], sign),
+ s : parseIso(match[8], sign)
+ };
+ } else if (duration == null) {// checks for null or undefined
+ duration = {};
+ } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {
+ diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));
+
+ duration = {};
+ duration.ms = diffRes.milliseconds;
+ duration.M = diffRes.months;
+ }
+
+ ret = new Duration(duration);
+
+ if (isDuration(input) && hasOwnProp(input, '_locale')) {
+ ret._locale = input._locale;
+ }
+
+ return ret;
+}
+
+createDuration.fn = Duration.prototype;
+
+function parseIso (inp, sign) {
+ // We'd normally use ~~inp for this, but unfortunately it also
+ // converts floats to ints.
+ // inp may be undefined, so careful calling replace on it.
+ var res = inp && parseFloat(inp.replace(',', '.'));
+ // apply sign while we're at it
+ return (isNaN(res) ? 0 : res) * sign;
+}
+
+function positiveMomentsDifference(base, other) {
+ var res = {milliseconds: 0, months: 0};
+
+ res.months = other.month() - base.month() +
+ (other.year() - base.year()) * 12;
+ if (base.clone().add(res.months, 'M').isAfter(other)) {
+ --res.months;
+ }
+
+ res.milliseconds = +other - +(base.clone().add(res.months, 'M'));
+
+ return res;
+}
+
+function momentsDifference(base, other) {
+ var res;
+ if (!(base.isValid() && other.isValid())) {
+ return {milliseconds: 0, months: 0};
+ }
+
+ other = cloneWithOffset(other, base);
+ if (base.isBefore(other)) {
+ res = positiveMomentsDifference(base, other);
+ } else {
+ res = positiveMomentsDifference(other, base);
+ res.milliseconds = -res.milliseconds;
+ res.months = -res.months;
+ }
+
+ return res;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/duration.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/duration.js
new file mode 100644
index 00000000000..528b568121f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/duration.js
@@ -0,0 +1,16 @@
+// Side effect imports
+import './prototype';
+
+import { createDuration } from './create';
+import { isDuration } from './constructor';
+import {
+ getSetRelativeTimeRounding,
+ getSetRelativeTimeThreshold
+} from './humanize';
+
+export {
+ createDuration,
+ isDuration,
+ getSetRelativeTimeRounding,
+ getSetRelativeTimeThreshold
+};
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/get.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/get.js
new file mode 100644
index 00000000000..6dafacdd860
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/get.js
@@ -0,0 +1,25 @@
+import { normalizeUnits } from '../units/aliases';
+import absFloor from '../utils/abs-floor';
+
+export function get (units) {
+ units = normalizeUnits(units);
+ return this[units + 's']();
+}
+
+function makeGetter(name) {
+ return function () {
+ return this._data[name];
+ };
+}
+
+export var milliseconds = makeGetter('milliseconds');
+export var seconds = makeGetter('seconds');
+export var minutes = makeGetter('minutes');
+export var hours = makeGetter('hours');
+export var days = makeGetter('days');
+export var months = makeGetter('months');
+export var years = makeGetter('years');
+
+export function weeks () {
+ return absFloor(this.days() / 7);
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/humanize.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/humanize.js
new file mode 100644
index 00000000000..6120d404bca
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/humanize.js
@@ -0,0 +1,76 @@
+import { createDuration } from './create';
+
+var round = Math.round;
+var thresholds = {
+ s: 45, // seconds to minute
+ m: 45, // minutes to hour
+ h: 22, // hours to day
+ d: 26, // days to month
+ M: 11 // months to year
+};
+
+// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
+function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
+ return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
+}
+
+function relativeTime (posNegDuration, withoutSuffix, locale) {
+ var duration = createDuration(posNegDuration).abs();
+ var seconds = round(duration.as('s'));
+ var minutes = round(duration.as('m'));
+ var hours = round(duration.as('h'));
+ var days = round(duration.as('d'));
+ var months = round(duration.as('M'));
+ var years = round(duration.as('y'));
+
+ var a = seconds < thresholds.s && ['s', seconds] ||
+ minutes <= 1 && ['m'] ||
+ minutes < thresholds.m && ['mm', minutes] ||
+ hours <= 1 && ['h'] ||
+ hours < thresholds.h && ['hh', hours] ||
+ days <= 1 && ['d'] ||
+ days < thresholds.d && ['dd', days] ||
+ months <= 1 && ['M'] ||
+ months < thresholds.M && ['MM', months] ||
+ years <= 1 && ['y'] || ['yy', years];
+
+ a[2] = withoutSuffix;
+ a[3] = +posNegDuration > 0;
+ a[4] = locale;
+ return substituteTimeAgo.apply(null, a);
+}
+
+// This function allows you to set the rounding function for relative time strings
+export function getSetRelativeTimeRounding (roundingFunction) {
+ if (roundingFunction === undefined) {
+ return round;
+ }
+ if (typeof(roundingFunction) === 'function') {
+ round = roundingFunction;
+ return true;
+ }
+ return false;
+}
+
+// This function allows you to set a threshold for relative time strings
+export function getSetRelativeTimeThreshold (threshold, limit) {
+ if (thresholds[threshold] === undefined) {
+ return false;
+ }
+ if (limit === undefined) {
+ return thresholds[threshold];
+ }
+ thresholds[threshold] = limit;
+ return true;
+}
+
+export function humanize (withSuffix) {
+ var locale = this.localeData();
+ var output = relativeTime(this, !withSuffix, locale);
+
+ if (withSuffix) {
+ output = locale.pastFuture(+this, output);
+ }
+
+ return locale.postformat(output);
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/iso-string.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/iso-string.js
new file mode 100644
index 00000000000..f33a968da8e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/iso-string.js
@@ -0,0 +1,52 @@
+import absFloor from '../utils/abs-floor';
+var abs = Math.abs;
+
+export function toISOString() {
+ // for ISO strings we do not use the normal bubbling rules:
+ // * milliseconds bubble up until they become hours
+ // * days do not bubble at all
+ // * months bubble up until they become years
+ // This is because there is no context-free conversion between hours and days
+ // (think of clock changes)
+ // and also not between days and months (28-31 days per month)
+ var seconds = abs(this._milliseconds) / 1000;
+ var days = abs(this._days);
+ var months = abs(this._months);
+ var minutes, hours, years;
+
+ // 3600 seconds -> 60 minutes -> 1 hour
+ minutes = absFloor(seconds / 60);
+ hours = absFloor(minutes / 60);
+ seconds %= 60;
+ minutes %= 60;
+
+ // 12 months -> 1 year
+ years = absFloor(months / 12);
+ months %= 12;
+
+
+ // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
+ var Y = years;
+ var M = months;
+ var D = days;
+ var h = hours;
+ var m = minutes;
+ var s = seconds;
+ var total = this.asSeconds();
+
+ if (!total) {
+ // this is the same as C#'s (Noda) and python (isodate)...
+ // but not other JS (goog.date)
+ return 'P0D';
+ }
+
+ return (total < 0 ? '-' : '') +
+ 'P' +
+ (Y ? Y + 'Y' : '') +
+ (M ? M + 'M' : '') +
+ (D ? D + 'D' : '') +
+ ((h || m || s) ? 'T' : '') +
+ (h ? h + 'H' : '') +
+ (m ? m + 'M' : '') +
+ (s ? s + 'S' : '');
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/prototype.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/prototype.js
new file mode 100644
index 00000000000..0257ff9b501
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/duration/prototype.js
@@ -0,0 +1,48 @@
+import { Duration } from './constructor';
+
+var proto = Duration.prototype;
+
+import { abs } from './abs';
+import { add, subtract } from './add-subtract';
+import { as, asMilliseconds, asSeconds, asMinutes, asHours, asDays, asWeeks, asMonths, asYears, valueOf } from './as';
+import { bubble } from './bubble';
+import { get, milliseconds, seconds, minutes, hours, days, months, years, weeks } from './get';
+import { humanize } from './humanize';
+import { toISOString } from './iso-string';
+import { lang, locale, localeData } from '../moment/locale';
+
+proto.abs = abs;
+proto.add = add;
+proto.subtract = subtract;
+proto.as = as;
+proto.asMilliseconds = asMilliseconds;
+proto.asSeconds = asSeconds;
+proto.asMinutes = asMinutes;
+proto.asHours = asHours;
+proto.asDays = asDays;
+proto.asWeeks = asWeeks;
+proto.asMonths = asMonths;
+proto.asYears = asYears;
+proto.valueOf = valueOf;
+proto._bubble = bubble;
+proto.get = get;
+proto.milliseconds = milliseconds;
+proto.seconds = seconds;
+proto.minutes = minutes;
+proto.hours = hours;
+proto.days = days;
+proto.weeks = weeks;
+proto.months = months;
+proto.years = years;
+proto.humanize = humanize;
+proto.toISOString = toISOString;
+proto.toString = toISOString;
+proto.toJSON = toISOString;
+proto.locale = locale;
+proto.localeData = localeData;
+
+// Deprecations
+import { deprecate } from '../utils/deprecate';
+
+proto.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString);
+proto.lang = lang;
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/format/format.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/format/format.js
new file mode 100644
index 00000000000..33486f1d566
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/format/format.js
@@ -0,0 +1,91 @@
+import zeroFill from '../utils/zero-fill';
+
+export var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;
+
+var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;
+
+var formatFunctions = {};
+
+export var formatTokenFunctions = {};
+
+// token: 'M'
+// padded: ['MM', 2]
+// ordinal: 'Mo'
+// callback: function () { this.month() + 1 }
+export function addFormatToken (token, padded, ordinal, callback) {
+ var func = callback;
+ if (typeof callback === 'string') {
+ func = function () {
+ return this[callback]();
+ };
+ }
+ if (token) {
+ formatTokenFunctions[token] = func;
+ }
+ if (padded) {
+ formatTokenFunctions[padded[0]] = function () {
+ return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
+ };
+ }
+ if (ordinal) {
+ formatTokenFunctions[ordinal] = function () {
+ return this.localeData().ordinal(func.apply(this, arguments), token);
+ };
+ }
+}
+
+function removeFormattingTokens(input) {
+ if (input.match(/\[[\s\S]/)) {
+ return input.replace(/^\[|\]$/g, '');
+ }
+ return input.replace(/\\/g, '');
+}
+
+function makeFormatFunction(format) {
+ var array = format.match(formattingTokens), i, length;
+
+ for (i = 0, length = array.length; i < length; i++) {
+ if (formatTokenFunctions[array[i]]) {
+ array[i] = formatTokenFunctions[array[i]];
+ } else {
+ array[i] = removeFormattingTokens(array[i]);
+ }
+ }
+
+ return function (mom) {
+ var output = '', i;
+ for (i = 0; i < length; i++) {
+ output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];
+ }
+ return output;
+ };
+}
+
+// format date using native date object
+export function formatMoment(m, format) {
+ if (!m.isValid()) {
+ return m.localeData().invalidDate();
+ }
+
+ format = expandFormat(format, m.localeData());
+ formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);
+
+ return formatFunctions[format](m);
+}
+
+export function expandFormat(format, locale) {
+ var i = 5;
+
+ function replaceLongDateFormatTokens(input) {
+ return locale.longDateFormat(input) || input;
+ }
+
+ localFormattingTokens.lastIndex = 0;
+ while (i >= 0 && localFormattingTokens.test(format)) {
+ format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
+ localFormattingTokens.lastIndex = 0;
+ i -= 1;
+ }
+
+ return format;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/base-config.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/base-config.js
new file mode 100644
index 00000000000..cbb0b36b49f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/base-config.js
@@ -0,0 +1,44 @@
+import { defaultCalendar } from './calendar';
+import { defaultLongDateFormat } from './formats';
+import { defaultInvalidDate } from './invalid';
+import { defaultOrdinal, defaultOrdinalParse } from './ordinal';
+import { defaultRelativeTime } from './relative';
+
+// months
+import {
+ defaultLocaleMonths,
+ defaultLocaleMonthsShort,
+} from '../units/month';
+
+// week
+import { defaultLocaleWeek } from '../units/week';
+
+// weekdays
+import {
+ defaultLocaleWeekdays,
+ defaultLocaleWeekdaysMin,
+ defaultLocaleWeekdaysShort,
+} from '../units/day-of-week';
+
+// meridiem
+import { defaultLocaleMeridiemParse } from '../units/hour';
+
+export var baseConfig = {
+ calendar: defaultCalendar,
+ longDateFormat: defaultLongDateFormat,
+ invalidDate: defaultInvalidDate,
+ ordinal: defaultOrdinal,
+ ordinalParse: defaultOrdinalParse,
+ relativeTime: defaultRelativeTime,
+
+ months: defaultLocaleMonths,
+ monthsShort: defaultLocaleMonthsShort,
+
+ week: defaultLocaleWeek,
+
+ weekdays: defaultLocaleWeekdays,
+ weekdaysMin: defaultLocaleWeekdaysMin,
+ weekdaysShort: defaultLocaleWeekdaysShort,
+
+ meridiemParse: defaultLocaleMeridiemParse
+};
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/calendar.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/calendar.js
new file mode 100644
index 00000000000..f12214b86da
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/calendar.js
@@ -0,0 +1,15 @@
+export var defaultCalendar = {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+};
+
+import isFunction from '../utils/is-function';
+
+export function calendar (key, mom, now) {
+ var output = this._calendar[key] || this._calendar['sameElse'];
+ return isFunction(output) ? output.call(mom, now) : output;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/constructor.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/constructor.js
new file mode 100644
index 00000000000..c32b73ee11c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/constructor.js
@@ -0,0 +1,5 @@
+export function Locale(config) {
+ if (config != null) {
+ this.set(config);
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/en.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/en.js
new file mode 100644
index 00000000000..20964cd9c1c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/en.js
@@ -0,0 +1,15 @@
+import './prototype';
+import { getSetGlobalLocale } from './locales';
+import toInt from '../utils/to-int';
+
+getSetGlobalLocale('en', {
+ ordinalParse: /\d{1,2}(th|st|nd|rd)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (toInt(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/formats.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/formats.js
new file mode 100644
index 00000000000..6d83b039484
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/formats.js
@@ -0,0 +1,23 @@
+export var defaultLongDateFormat = {
+ LTS : 'h:mm:ss A',
+ LT : 'h:mm A',
+ L : 'MM/DD/YYYY',
+ LL : 'MMMM D, YYYY',
+ LLL : 'MMMM D, YYYY h:mm A',
+ LLLL : 'dddd, MMMM D, YYYY h:mm A'
+};
+
+export function longDateFormat (key) {
+ var format = this._longDateFormat[key],
+ formatUpper = this._longDateFormat[key.toUpperCase()];
+
+ if (format || !formatUpper) {
+ return format;
+ }
+
+ this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {
+ return val.slice(1);
+ });
+
+ return this._longDateFormat[key];
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/invalid.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/invalid.js
new file mode 100644
index 00000000000..e9096339baa
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/invalid.js
@@ -0,0 +1,5 @@
+export var defaultInvalidDate = 'Invalid date';
+
+export function invalidDate () {
+ return this._invalidDate;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/lists.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/lists.js
new file mode 100644
index 00000000000..42f7572e2a9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/lists.js
@@ -0,0 +1,93 @@
+import isNumber from '../utils/is-number';
+import { getLocale } from './locales';
+import { createUTC } from '../create/utc';
+
+function get (format, index, field, setter) {
+ var locale = getLocale();
+ var utc = createUTC().set(setter, index);
+ return locale[field](utc, format);
+}
+
+function listMonthsImpl (format, index, field) {
+ if (isNumber(format)) {
+ index = format;
+ format = undefined;
+ }
+
+ format = format || '';
+
+ if (index != null) {
+ return get(format, index, field, 'month');
+ }
+
+ var i;
+ var out = [];
+ for (i = 0; i < 12; i++) {
+ out[i] = get(format, i, field, 'month');
+ }
+ return out;
+}
+
+// ()
+// (5)
+// (fmt, 5)
+// (fmt)
+// (true)
+// (true, 5)
+// (true, fmt, 5)
+// (true, fmt)
+function listWeekdaysImpl (localeSorted, format, index, field) {
+ if (typeof localeSorted === 'boolean') {
+ if (isNumber(format)) {
+ index = format;
+ format = undefined;
+ }
+
+ format = format || '';
+ } else {
+ format = localeSorted;
+ index = format;
+ localeSorted = false;
+
+ if (isNumber(format)) {
+ index = format;
+ format = undefined;
+ }
+
+ format = format || '';
+ }
+
+ var locale = getLocale(),
+ shift = localeSorted ? locale._week.dow : 0;
+
+ if (index != null) {
+ return get(format, (index + shift) % 7, field, 'day');
+ }
+
+ var i;
+ var out = [];
+ for (i = 0; i < 7; i++) {
+ out[i] = get(format, (i + shift) % 7, field, 'day');
+ }
+ return out;
+}
+
+export function listMonths (format, index) {
+ return listMonthsImpl(format, index, 'months');
+}
+
+export function listMonthsShort (format, index) {
+ return listMonthsImpl(format, index, 'monthsShort');
+}
+
+export function listWeekdays (localeSorted, format, index) {
+ return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
+}
+
+export function listWeekdaysShort (localeSorted, format, index) {
+ return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
+}
+
+export function listWeekdaysMin (localeSorted, format, index) {
+ return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/locale.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/locale.js
new file mode 100644
index 00000000000..ac9cebfb824
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/locale.js
@@ -0,0 +1,39 @@
+// Side effect imports
+import './prototype';
+
+import {
+ getSetGlobalLocale,
+ defineLocale,
+ updateLocale,
+ getLocale,
+ listLocales
+} from './locales';
+
+import {
+ listMonths,
+ listMonthsShort,
+ listWeekdays,
+ listWeekdaysShort,
+ listWeekdaysMin
+} from './lists';
+
+export {
+ getSetGlobalLocale,
+ defineLocale,
+ updateLocale,
+ getLocale,
+ listLocales,
+ listMonths,
+ listMonthsShort,
+ listWeekdays,
+ listWeekdaysShort,
+ listWeekdaysMin
+};
+
+import { deprecate } from '../utils/deprecate';
+import { hooks } from '../utils/hooks';
+
+hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);
+hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);
+
+import './en';
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/locales.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/locales.js
new file mode 100644
index 00000000000..99ee1157184
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/locales.js
@@ -0,0 +1,186 @@
+import isArray from '../utils/is-array';
+import hasOwnProp from '../utils/has-own-prop';
+import isUndefined from '../utils/is-undefined';
+import compareArrays from '../utils/compare-arrays';
+import { deprecateSimple } from '../utils/deprecate';
+import { mergeConfigs } from './set';
+import { Locale } from './constructor';
+import keys from '../utils/keys';
+
+import { baseConfig } from './base-config';
+
+// internal storage for locale config files
+var locales = {};
+var localeFamilies = {};
+var globalLocale;
+
+function normalizeLocale(key) {
+ return key ? key.toLowerCase().replace('_', '-') : key;
+}
+
+// pick the locale from the array
+// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
+// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
+function chooseLocale(names) {
+ var i = 0, j, next, locale, split;
+
+ while (i < names.length) {
+ split = normalizeLocale(names[i]).split('-');
+ j = split.length;
+ next = normalizeLocale(names[i + 1]);
+ next = next ? next.split('-') : null;
+ while (j > 0) {
+ locale = loadLocale(split.slice(0, j).join('-'));
+ if (locale) {
+ return locale;
+ }
+ if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
+ //the next array item is better than a shallower substring of this one
+ break;
+ }
+ j--;
+ }
+ i++;
+ }
+ return null;
+}
+
+function loadLocale(name) {
+ var oldLocale = null;
+ // TODO: Find a better way to register and load all the locales in Node
+ if (!locales[name] && (typeof module !== 'undefined') &&
+ module && module.exports) {
+ try {
+ oldLocale = globalLocale._abbr;
+ require('./locale/' + name);
+ // because defineLocale currently also sets the global locale, we
+ // want to undo that for lazy loaded locales
+ getSetGlobalLocale(oldLocale);
+ } catch (e) { }
+ }
+ return locales[name];
+}
+
+// This function will load locale and then set the global locale. If
+// no arguments are passed in, it will simply return the current global
+// locale key.
+export function getSetGlobalLocale (key, values) {
+ var data;
+ if (key) {
+ if (isUndefined(values)) {
+ data = getLocale(key);
+ }
+ else {
+ data = defineLocale(key, values);
+ }
+
+ if (data) {
+ // moment.duration._locale = moment._locale = data;
+ globalLocale = data;
+ }
+ }
+
+ return globalLocale._abbr;
+}
+
+export function defineLocale (name, config) {
+ if (config !== null) {
+ var parentConfig = baseConfig;
+ config.abbr = name;
+ if (locales[name] != null) {
+ deprecateSimple('defineLocaleOverride',
+ 'use moment.updateLocale(localeName, config) to change ' +
+ 'an existing locale. moment.defineLocale(localeName, ' +
+ 'config) should only be used for creating a new locale ' +
+ 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');
+ parentConfig = locales[name]._config;
+ } else if (config.parentLocale != null) {
+ if (locales[config.parentLocale] != null) {
+ parentConfig = locales[config.parentLocale]._config;
+ } else {
+ if (!localeFamilies[config.parentLocale]) {
+ localeFamilies[config.parentLocale] = [];
+ }
+ localeFamilies[config.parentLocale].push({
+ name: name,
+ config: config
+ });
+ return null;
+ }
+ }
+ locales[name] = new Locale(mergeConfigs(parentConfig, config));
+
+ if (localeFamilies[name]) {
+ localeFamilies[name].forEach(function (x) {
+ defineLocale(x.name, x.config);
+ });
+ }
+
+ // backwards compat for now: also set the locale
+ // make sure we set the locale AFTER all child locales have been
+ // created, so we won't end up with the child locale set.
+ getSetGlobalLocale(name);
+
+
+ return locales[name];
+ } else {
+ // useful for testing
+ delete locales[name];
+ return null;
+ }
+}
+
+export function updateLocale(name, config) {
+ if (config != null) {
+ var locale, parentConfig = baseConfig;
+ // MERGE
+ if (locales[name] != null) {
+ parentConfig = locales[name]._config;
+ }
+ config = mergeConfigs(parentConfig, config);
+ locale = new Locale(config);
+ locale.parentLocale = locales[name];
+ locales[name] = locale;
+
+ // backwards compat for now: also set the locale
+ getSetGlobalLocale(name);
+ } else {
+ // pass null for config to unupdate, useful for tests
+ if (locales[name] != null) {
+ if (locales[name].parentLocale != null) {
+ locales[name] = locales[name].parentLocale;
+ } else if (locales[name] != null) {
+ delete locales[name];
+ }
+ }
+ }
+ return locales[name];
+}
+
+// returns locale data
+export function getLocale (key) {
+ var locale;
+
+ if (key && key._locale && key._locale._abbr) {
+ key = key._locale._abbr;
+ }
+
+ if (!key) {
+ return globalLocale;
+ }
+
+ if (!isArray(key)) {
+ //short-circuit everything else
+ locale = loadLocale(key);
+ if (locale) {
+ return locale;
+ }
+ key = [key];
+ }
+
+ return chooseLocale(key);
+}
+
+export function listLocales() {
+ return keys(locales);
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/ordinal.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/ordinal.js
new file mode 100644
index 00000000000..0028aca024e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/ordinal.js
@@ -0,0 +1,7 @@
+export var defaultOrdinal = '%d';
+export var defaultOrdinalParse = /\d{1,2}/;
+
+export function ordinal (number) {
+ return this._ordinal.replace('%d', number);
+}
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/pre-post-format.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/pre-post-format.js
new file mode 100644
index 00000000000..10ed2058429
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/pre-post-format.js
@@ -0,0 +1,3 @@
+export function preParsePostFormat (string) {
+ return string;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/prototype.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/prototype.js
new file mode 100644
index 00000000000..24eef89f14b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/prototype.js
@@ -0,0 +1,69 @@
+import { Locale } from './constructor';
+
+var proto = Locale.prototype;
+
+import { calendar } from './calendar';
+import { longDateFormat } from './formats';
+import { invalidDate } from './invalid';
+import { ordinal } from './ordinal';
+import { preParsePostFormat } from './pre-post-format';
+import { relativeTime, pastFuture } from './relative';
+import { set } from './set';
+
+proto.calendar = calendar;
+proto.longDateFormat = longDateFormat;
+proto.invalidDate = invalidDate;
+proto.ordinal = ordinal;
+proto.preparse = preParsePostFormat;
+proto.postformat = preParsePostFormat;
+proto.relativeTime = relativeTime;
+proto.pastFuture = pastFuture;
+proto.set = set;
+
+// Month
+import {
+ localeMonthsParse,
+ localeMonths,
+ localeMonthsShort,
+ monthsRegex,
+ monthsShortRegex
+} from '../units/month';
+
+proto.months = localeMonths;
+proto.monthsShort = localeMonthsShort;
+proto.monthsParse = localeMonthsParse;
+proto.monthsRegex = monthsRegex;
+proto.monthsShortRegex = monthsShortRegex;
+
+// Week
+import { localeWeek, localeFirstDayOfYear, localeFirstDayOfWeek } from '../units/week';
+proto.week = localeWeek;
+proto.firstDayOfYear = localeFirstDayOfYear;
+proto.firstDayOfWeek = localeFirstDayOfWeek;
+
+// Day of Week
+import {
+ localeWeekdaysParse,
+ localeWeekdays,
+ localeWeekdaysMin,
+ localeWeekdaysShort,
+
+ weekdaysRegex,
+ weekdaysShortRegex,
+ weekdaysMinRegex
+} from '../units/day-of-week';
+
+proto.weekdays = localeWeekdays;
+proto.weekdaysMin = localeWeekdaysMin;
+proto.weekdaysShort = localeWeekdaysShort;
+proto.weekdaysParse = localeWeekdaysParse;
+
+proto.weekdaysRegex = weekdaysRegex;
+proto.weekdaysShortRegex = weekdaysShortRegex;
+proto.weekdaysMinRegex = weekdaysMinRegex;
+
+// Hours
+import { localeIsPM, localeMeridiem } from '../units/hour';
+
+proto.isPM = localeIsPM;
+proto.meridiem = localeMeridiem;
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/relative.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/relative.js
new file mode 100644
index 00000000000..4c485ea2224
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/relative.js
@@ -0,0 +1,29 @@
+export var defaultRelativeTime = {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+};
+
+import isFunction from '../utils/is-function';
+
+export function relativeTime (number, withoutSuffix, string, isFuture) {
+ var output = this._relativeTime[string];
+ return (isFunction(output)) ?
+ output(number, withoutSuffix, string, isFuture) :
+ output.replace(/%d/i, number);
+}
+
+export function pastFuture (diff, output) {
+ var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
+ return isFunction(format) ? format(output) : format.replace(/%s/i, output);
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/set.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/set.js
new file mode 100644
index 00000000000..45a2f46e12f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/locale/set.js
@@ -0,0 +1,46 @@
+import isFunction from '../utils/is-function';
+import extend from '../utils/extend';
+import isObject from '../utils/is-object';
+import hasOwnProp from '../utils/has-own-prop';
+
+export function set (config) {
+ var prop, i;
+ for (i in config) {
+ prop = config[i];
+ if (isFunction(prop)) {
+ this[i] = prop;
+ } else {
+ this['_' + i] = prop;
+ }
+ }
+ this._config = config;
+ // Lenient ordinal parsing accepts just a number in addition to
+ // number + (possibly) stuff coming from _ordinalParseLenient.
+ this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\d{1,2}/).source);
+}
+
+export function mergeConfigs(parentConfig, childConfig) {
+ var res = extend({}, parentConfig), prop;
+ for (prop in childConfig) {
+ if (hasOwnProp(childConfig, prop)) {
+ if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
+ res[prop] = {};
+ extend(res[prop], parentConfig[prop]);
+ extend(res[prop], childConfig[prop]);
+ } else if (childConfig[prop] != null) {
+ res[prop] = childConfig[prop];
+ } else {
+ delete res[prop];
+ }
+ }
+ }
+ for (prop in parentConfig) {
+ if (hasOwnProp(parentConfig, prop) &&
+ !hasOwnProp(childConfig, prop) &&
+ isObject(parentConfig[prop])) {
+ // make sure changes to properties don't modify parent config
+ res[prop] = extend({}, res[prop]);
+ }
+ }
+ return res;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/add-subtract.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/add-subtract.js
new file mode 100644
index 00000000000..b9e86a69d2a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/add-subtract.js
@@ -0,0 +1,55 @@
+import { get, set } from './get-set';
+import { setMonth } from '../units/month';
+import { createDuration } from '../duration/create';
+import { deprecateSimple } from '../utils/deprecate';
+import { hooks } from '../utils/hooks';
+import absRound from '../utils/abs-round';
+
+
+// TODO: remove 'name' arg after deprecation is removed
+function createAdder(direction, name) {
+ return function (val, period) {
+ var dur, tmp;
+ //invert the arguments, but complain about it
+ if (period !== null && !isNaN(+period)) {
+ deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +
+ 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');
+ tmp = val; val = period; period = tmp;
+ }
+
+ val = typeof val === 'string' ? +val : val;
+ dur = createDuration(val, period);
+ addSubtract(this, dur, direction);
+ return this;
+ };
+}
+
+export function addSubtract (mom, duration, isAdding, updateOffset) {
+ var milliseconds = duration._milliseconds,
+ days = absRound(duration._days),
+ months = absRound(duration._months);
+
+ if (!mom.isValid()) {
+ // No op
+ return;
+ }
+
+ updateOffset = updateOffset == null ? true : updateOffset;
+
+ if (milliseconds) {
+ mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
+ }
+ if (days) {
+ set(mom, 'Date', get(mom, 'Date') + days * isAdding);
+ }
+ if (months) {
+ setMonth(mom, get(mom, 'Month') + months * isAdding);
+ }
+ if (updateOffset) {
+ hooks.updateOffset(mom, days || months);
+ }
+}
+
+export var add = createAdder(1, 'add');
+export var subtract = createAdder(-1, 'subtract');
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/calendar.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/calendar.js
new file mode 100644
index 00000000000..4b5725c58b0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/calendar.js
@@ -0,0 +1,26 @@
+import { createLocal } from '../create/local';
+import { cloneWithOffset } from '../units/offset';
+import isFunction from '../utils/is-function';
+import { hooks } from '../utils/hooks';
+
+export function getCalendarFormat(myMoment, now) {
+ var diff = myMoment.diff(now, 'days', true);
+ return diff < -6 ? 'sameElse' :
+ diff < -1 ? 'lastWeek' :
+ diff < 0 ? 'lastDay' :
+ diff < 1 ? 'sameDay' :
+ diff < 2 ? 'nextDay' :
+ diff < 7 ? 'nextWeek' : 'sameElse';
+}
+
+export function calendar (time, formats) {
+ // We want to compare the start of today, vs this.
+ // Getting start-of-today depends on whether we're local/utc/offset or not.
+ var now = time || createLocal(),
+ sod = cloneWithOffset(now, this).startOf('day'),
+ format = hooks.calendarFormat(this, sod) || 'sameElse';
+
+ var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);
+
+ return this.format(output || this.localeData().calendar(format, this, createLocal(now)));
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/clone.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/clone.js
new file mode 100644
index 00000000000..d96b328b244
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/clone.js
@@ -0,0 +1,5 @@
+import { Moment } from './constructor';
+
+export function clone () {
+ return new Moment(this);
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/compare.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/compare.js
new file mode 100644
index 00000000000..b26bac633c4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/compare.js
@@ -0,0 +1,59 @@
+import { isMoment } from './constructor';
+import { normalizeUnits } from '../units/aliases';
+import { createLocal } from '../create/local';
+import isUndefined from '../utils/is-undefined';
+
+export function isAfter (input, units) {
+ var localInput = isMoment(input) ? input : createLocal(input);
+ if (!(this.isValid() && localInput.isValid())) {
+ return false;
+ }
+ units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
+ if (units === 'millisecond') {
+ return this.valueOf() > localInput.valueOf();
+ } else {
+ return localInput.valueOf() < this.clone().startOf(units).valueOf();
+ }
+}
+
+export function isBefore (input, units) {
+ var localInput = isMoment(input) ? input : createLocal(input);
+ if (!(this.isValid() && localInput.isValid())) {
+ return false;
+ }
+ units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
+ if (units === 'millisecond') {
+ return this.valueOf() < localInput.valueOf();
+ } else {
+ return this.clone().endOf(units).valueOf() < localInput.valueOf();
+ }
+}
+
+export function isBetween (from, to, units, inclusivity) {
+ inclusivity = inclusivity || '()';
+ return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&
+ (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));
+}
+
+export function isSame (input, units) {
+ var localInput = isMoment(input) ? input : createLocal(input),
+ inputMs;
+ if (!(this.isValid() && localInput.isValid())) {
+ return false;
+ }
+ units = normalizeUnits(units || 'millisecond');
+ if (units === 'millisecond') {
+ return this.valueOf() === localInput.valueOf();
+ } else {
+ inputMs = localInput.valueOf();
+ return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();
+ }
+}
+
+export function isSameOrAfter (input, units) {
+ return this.isSame(input, units) || this.isAfter(input,units);
+}
+
+export function isSameOrBefore (input, units) {
+ return this.isSame(input, units) || this.isBefore(input,units);
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/constructor.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/constructor.js
new file mode 100644
index 00000000000..83f83effe5c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/constructor.js
@@ -0,0 +1,77 @@
+import { hooks } from '../utils/hooks';
+import hasOwnProp from '../utils/has-own-prop';
+import isUndefined from '../utils/is-undefined';
+import getParsingFlags from '../create/parsing-flags';
+
+// Plugins that add properties should also add the key here (null value),
+// so we can properly clone ourselves.
+var momentProperties = hooks.momentProperties = [];
+
+export function copyConfig(to, from) {
+ var i, prop, val;
+
+ if (!isUndefined(from._isAMomentObject)) {
+ to._isAMomentObject = from._isAMomentObject;
+ }
+ if (!isUndefined(from._i)) {
+ to._i = from._i;
+ }
+ if (!isUndefined(from._f)) {
+ to._f = from._f;
+ }
+ if (!isUndefined(from._l)) {
+ to._l = from._l;
+ }
+ if (!isUndefined(from._strict)) {
+ to._strict = from._strict;
+ }
+ if (!isUndefined(from._tzm)) {
+ to._tzm = from._tzm;
+ }
+ if (!isUndefined(from._isUTC)) {
+ to._isUTC = from._isUTC;
+ }
+ if (!isUndefined(from._offset)) {
+ to._offset = from._offset;
+ }
+ if (!isUndefined(from._pf)) {
+ to._pf = getParsingFlags(from);
+ }
+ if (!isUndefined(from._locale)) {
+ to._locale = from._locale;
+ }
+
+ if (momentProperties.length > 0) {
+ for (i in momentProperties) {
+ prop = momentProperties[i];
+ val = from[prop];
+ if (!isUndefined(val)) {
+ to[prop] = val;
+ }
+ }
+ }
+
+ return to;
+}
+
+var updateInProgress = false;
+
+// Moment prototype object
+export function Moment(config) {
+ copyConfig(this, config);
+ this._d = new Date(config._d != null ? config._d.getTime() : NaN);
+ if (!this.isValid()) {
+ this._d = new Date(NaN);
+ }
+ // Prevent infinite loop in case updateOffset creates new moment
+ // objects.
+ if (updateInProgress === false) {
+ updateInProgress = true;
+ hooks.updateOffset(this);
+ updateInProgress = false;
+ }
+}
+
+export function isMoment (obj) {
+ return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/creation-data.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/creation-data.js
new file mode 100644
index 00000000000..7e2d69aa1e3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/creation-data.js
@@ -0,0 +1,9 @@
+export function creationData() {
+ return {
+ input: this._i,
+ format: this._f,
+ locale: this._locale,
+ isUTC: this._isUTC,
+ strict: this._strict
+ };
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/diff.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/diff.js
new file mode 100644
index 00000000000..9f439081898
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/diff.js
@@ -0,0 +1,62 @@
+import absFloor from '../utils/abs-floor';
+import { cloneWithOffset } from '../units/offset';
+import { normalizeUnits } from '../units/aliases';
+
+export function diff (input, units, asFloat) {
+ var that,
+ zoneDelta,
+ delta, output;
+
+ if (!this.isValid()) {
+ return NaN;
+ }
+
+ that = cloneWithOffset(input, this);
+
+ if (!that.isValid()) {
+ return NaN;
+ }
+
+ zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;
+
+ units = normalizeUnits(units);
+
+ if (units === 'year' || units === 'month' || units === 'quarter') {
+ output = monthDiff(this, that);
+ if (units === 'quarter') {
+ output = output / 3;
+ } else if (units === 'year') {
+ output = output / 12;
+ }
+ } else {
+ delta = this - that;
+ output = units === 'second' ? delta / 1e3 : // 1000
+ units === 'minute' ? delta / 6e4 : // 1000 * 60
+ units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60
+ units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
+ units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
+ delta;
+ }
+ return asFloat ? output : absFloor(output);
+}
+
+function monthDiff (a, b) {
+ // difference in months
+ var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),
+ // b is in (anchor - 1 month, anchor + 1 month)
+ anchor = a.clone().add(wholeMonthDiff, 'months'),
+ anchor2, adjust;
+
+ if (b - anchor < 0) {
+ anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
+ // linear across the month
+ adjust = (b - anchor) / (anchor - anchor2);
+ } else {
+ anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
+ // linear across the month
+ adjust = (b - anchor) / (anchor2 - anchor);
+ }
+
+ //check for negative zero, return zero if negative zero
+ return -(wholeMonthDiff + adjust) || 0;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/format.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/format.js
new file mode 100644
index 00000000000..539f6c8e1a0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/format.js
@@ -0,0 +1,56 @@
+import { formatMoment } from '../format/format';
+import { hooks } from '../utils/hooks';
+import isFunction from '../utils/is-function';
+
+hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
+hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';
+
+export function toString () {
+ return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
+}
+
+export function toISOString () {
+ var m = this.clone().utc();
+ if (0 < m.year() && m.year() <= 9999) {
+ if (isFunction(Date.prototype.toISOString)) {
+ // native implementation is ~50x faster, use it when we can
+ return this.toDate().toISOString();
+ } else {
+ return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
+ }
+ } else {
+ return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
+ }
+}
+
+/**
+ * Return a human readable representation of a moment that can
+ * also be evaluated to get a new moment which is the same
+ *
+ * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
+ */
+export function inspect () {
+ if (!this.isValid()) {
+ return 'moment.invalid(/* ' + this._i + ' */)';
+ }
+ var func = 'moment';
+ var zone = '';
+ if (!this.isLocal()) {
+ func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
+ zone = 'Z';
+ }
+ var prefix = '[' + func + '("]';
+ var year = (0 < this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';
+ var datetime = '-MM-DD[T]HH:mm:ss.SSS';
+ var suffix = zone + '[")]';
+
+ return this.format(prefix + year + datetime + suffix);
+}
+
+export function format (inputString) {
+ if (!inputString) {
+ inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;
+ }
+ var output = formatMoment(this, inputString);
+ return this.localeData().postformat(output);
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/from.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/from.js
new file mode 100644
index 00000000000..4fbd03e438b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/from.js
@@ -0,0 +1,17 @@
+import { createDuration } from '../duration/create';
+import { createLocal } from '../create/local';
+import { isMoment } from '../moment/constructor';
+
+export function from (time, withoutSuffix) {
+ if (this.isValid() &&
+ ((isMoment(time) && time.isValid()) ||
+ createLocal(time).isValid())) {
+ return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
+ } else {
+ return this.localeData().invalidDate();
+ }
+}
+
+export function fromNow (withoutSuffix) {
+ return this.from(createLocal(), withoutSuffix);
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/get-set.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/get-set.js
new file mode 100644
index 00000000000..0d9fe5dfef0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/get-set.js
@@ -0,0 +1,55 @@
+import { normalizeUnits, normalizeObjectUnits } from '../units/aliases';
+import { getPrioritizedUnits } from '../units/priorities';
+import { hooks } from '../utils/hooks';
+import isFunction from '../utils/is-function';
+
+
+export function makeGetSet (unit, keepTime) {
+ return function (value) {
+ if (value != null) {
+ set(this, unit, value);
+ hooks.updateOffset(this, keepTime);
+ return this;
+ } else {
+ return get(this, unit);
+ }
+ };
+}
+
+export function get (mom, unit) {
+ return mom.isValid() ?
+ mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;
+}
+
+export function set (mom, unit, value) {
+ if (mom.isValid()) {
+ mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
+ }
+}
+
+// MOMENTS
+
+export function stringGet (units) {
+ units = normalizeUnits(units);
+ if (isFunction(this[units])) {
+ return this[units]();
+ }
+ return this;
+}
+
+
+export function stringSet (units, value) {
+ if (typeof units === 'object') {
+ units = normalizeObjectUnits(units);
+ var prioritized = getPrioritizedUnits(units);
+ for (var i = 0; i < prioritized.length; i++) {
+ this[prioritized[i].unit](units[prioritized[i].unit]);
+ }
+ } else {
+ units = normalizeUnits(units);
+ if (isFunction(this[units])) {
+ return this[units](value);
+ }
+ }
+ return this;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/locale.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/locale.js
new file mode 100644
index 00000000000..fb46e6569e8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/locale.js
@@ -0,0 +1,34 @@
+import { getLocale } from '../locale/locales';
+import { deprecate } from '../utils/deprecate';
+
+// If passed a locale key, it will set the locale for this
+// instance. Otherwise, it will return the locale configuration
+// variables for this instance.
+export function locale (key) {
+ var newLocaleData;
+
+ if (key === undefined) {
+ return this._locale._abbr;
+ } else {
+ newLocaleData = getLocale(key);
+ if (newLocaleData != null) {
+ this._locale = newLocaleData;
+ }
+ return this;
+ }
+}
+
+export var lang = deprecate(
+ 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
+ function (key) {
+ if (key === undefined) {
+ return this.localeData();
+ } else {
+ return this.locale(key);
+ }
+ }
+);
+
+export function localeData () {
+ return this._locale;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/min-max.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/min-max.js
new file mode 100644
index 00000000000..d76920a7124
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/min-max.js
@@ -0,0 +1,63 @@
+import { deprecate } from '../utils/deprecate';
+import isArray from '../utils/is-array';
+import { createLocal } from '../create/local';
+import { createInvalid } from '../create/valid';
+
+export var prototypeMin = deprecate(
+ 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
+ function () {
+ var other = createLocal.apply(null, arguments);
+ if (this.isValid() && other.isValid()) {
+ return other < this ? this : other;
+ } else {
+ return createInvalid();
+ }
+ }
+);
+
+export var prototypeMax = deprecate(
+ 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
+ function () {
+ var other = createLocal.apply(null, arguments);
+ if (this.isValid() && other.isValid()) {
+ return other > this ? this : other;
+ } else {
+ return createInvalid();
+ }
+ }
+);
+
+// Pick a moment m from moments so that m[fn](other) is true for all
+// other. This relies on the function fn to be transitive.
+//
+// moments should either be an array of moment objects or an array, whose
+// first element is an array of moment objects.
+function pickBy(fn, moments) {
+ var res, i;
+ if (moments.length === 1 && isArray(moments[0])) {
+ moments = moments[0];
+ }
+ if (!moments.length) {
+ return createLocal();
+ }
+ res = moments[0];
+ for (i = 1; i < moments.length; ++i) {
+ if (!moments[i].isValid() || moments[i][fn](res)) {
+ res = moments[i];
+ }
+ }
+ return res;
+}
+
+// TODO: Use [].sort instead?
+export function min () {
+ var args = [].slice.call(arguments, 0);
+
+ return pickBy('isBefore', args);
+}
+
+export function max () {
+ var args = [].slice.call(arguments, 0);
+
+ return pickBy('isAfter', args);
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/moment.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/moment.js
new file mode 100644
index 00000000000..12eb5f15ab8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/moment.js
@@ -0,0 +1,28 @@
+import { createLocal } from '../create/local';
+import { createUTC } from '../create/utc';
+import { createInvalid } from '../create/valid';
+import { isMoment } from './constructor';
+import { min, max } from './min-max';
+import { now } from './now';
+import momentPrototype from './prototype';
+
+function createUnix (input) {
+ return createLocal(input * 1000);
+}
+
+function createInZone () {
+ return createLocal.apply(null, arguments).parseZone();
+}
+
+export {
+ now,
+ min,
+ max,
+ isMoment,
+ createUTC,
+ createUnix,
+ createLocal,
+ createInZone,
+ createInvalid,
+ momentPrototype
+};
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/now.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/now.js
new file mode 100644
index 00000000000..0f4d0aef0c6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/now.js
@@ -0,0 +1,3 @@
+export var now = function () {
+ return Date.now ? Date.now() : +(new Date());
+};
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/prototype.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/prototype.js
new file mode 100644
index 00000000000..bd8fff79c20
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/prototype.js
@@ -0,0 +1,150 @@
+import { Moment } from './constructor';
+
+var proto = Moment.prototype;
+
+import { add, subtract } from './add-subtract';
+import { calendar, getCalendarFormat } from './calendar';
+import { clone } from './clone';
+import { isBefore, isBetween, isSame, isAfter, isSameOrAfter, isSameOrBefore } from './compare';
+import { diff } from './diff';
+import { format, toString, toISOString, inspect } from './format';
+import { from, fromNow } from './from';
+import { to, toNow } from './to';
+import { stringGet, stringSet } from './get-set';
+import { locale, localeData, lang } from './locale';
+import { prototypeMin, prototypeMax } from './min-max';
+import { startOf, endOf } from './start-end-of';
+import { valueOf, toDate, toArray, toObject, toJSON, unix } from './to-type';
+import { isValid, parsingFlags, invalidAt } from './valid';
+import { creationData } from './creation-data';
+
+proto.add = add;
+proto.calendar = calendar;
+proto.clone = clone;
+proto.diff = diff;
+proto.endOf = endOf;
+proto.format = format;
+proto.from = from;
+proto.fromNow = fromNow;
+proto.to = to;
+proto.toNow = toNow;
+proto.get = stringGet;
+proto.invalidAt = invalidAt;
+proto.isAfter = isAfter;
+proto.isBefore = isBefore;
+proto.isBetween = isBetween;
+proto.isSame = isSame;
+proto.isSameOrAfter = isSameOrAfter;
+proto.isSameOrBefore = isSameOrBefore;
+proto.isValid = isValid;
+proto.lang = lang;
+proto.locale = locale;
+proto.localeData = localeData;
+proto.max = prototypeMax;
+proto.min = prototypeMin;
+proto.parsingFlags = parsingFlags;
+proto.set = stringSet;
+proto.startOf = startOf;
+proto.subtract = subtract;
+proto.toArray = toArray;
+proto.toObject = toObject;
+proto.toDate = toDate;
+proto.toISOString = toISOString;
+proto.inspect = inspect;
+proto.toJSON = toJSON;
+proto.toString = toString;
+proto.unix = unix;
+proto.valueOf = valueOf;
+proto.creationData = creationData;
+
+// Year
+import { getSetYear, getIsLeapYear } from '../units/year';
+proto.year = getSetYear;
+proto.isLeapYear = getIsLeapYear;
+
+// Week Year
+import { getSetWeekYear, getSetISOWeekYear, getWeeksInYear, getISOWeeksInYear } from '../units/week-year';
+proto.weekYear = getSetWeekYear;
+proto.isoWeekYear = getSetISOWeekYear;
+
+// Quarter
+import { getSetQuarter } from '../units/quarter';
+proto.quarter = proto.quarters = getSetQuarter;
+
+// Month
+import { getSetMonth, getDaysInMonth } from '../units/month';
+proto.month = getSetMonth;
+proto.daysInMonth = getDaysInMonth;
+
+// Week
+import { getSetWeek, getSetISOWeek } from '../units/week';
+proto.week = proto.weeks = getSetWeek;
+proto.isoWeek = proto.isoWeeks = getSetISOWeek;
+proto.weeksInYear = getWeeksInYear;
+proto.isoWeeksInYear = getISOWeeksInYear;
+
+// Day
+import { getSetDayOfMonth } from '../units/day-of-month';
+import { getSetDayOfWeek, getSetISODayOfWeek, getSetLocaleDayOfWeek } from '../units/day-of-week';
+import { getSetDayOfYear } from '../units/day-of-year';
+proto.date = getSetDayOfMonth;
+proto.day = proto.days = getSetDayOfWeek;
+proto.weekday = getSetLocaleDayOfWeek;
+proto.isoWeekday = getSetISODayOfWeek;
+proto.dayOfYear = getSetDayOfYear;
+
+// Hour
+import { getSetHour } from '../units/hour';
+proto.hour = proto.hours = getSetHour;
+
+// Minute
+import { getSetMinute } from '../units/minute';
+proto.minute = proto.minutes = getSetMinute;
+
+// Second
+import { getSetSecond } from '../units/second';
+proto.second = proto.seconds = getSetSecond;
+
+// Millisecond
+import { getSetMillisecond } from '../units/millisecond';
+proto.millisecond = proto.milliseconds = getSetMillisecond;
+
+// Offset
+import {
+ getSetOffset,
+ setOffsetToUTC,
+ setOffsetToLocal,
+ setOffsetToParsedOffset,
+ hasAlignedHourOffset,
+ isDaylightSavingTime,
+ isDaylightSavingTimeShifted,
+ getSetZone,
+ isLocal,
+ isUtcOffset,
+ isUtc
+} from '../units/offset';
+proto.utcOffset = getSetOffset;
+proto.utc = setOffsetToUTC;
+proto.local = setOffsetToLocal;
+proto.parseZone = setOffsetToParsedOffset;
+proto.hasAlignedHourOffset = hasAlignedHourOffset;
+proto.isDST = isDaylightSavingTime;
+proto.isLocal = isLocal;
+proto.isUtcOffset = isUtcOffset;
+proto.isUtc = isUtc;
+proto.isUTC = isUtc;
+
+// Timezone
+import { getZoneAbbr, getZoneName } from '../units/timezone';
+proto.zoneAbbr = getZoneAbbr;
+proto.zoneName = getZoneName;
+
+// Deprecations
+import { deprecate } from '../utils/deprecate';
+proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);
+proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);
+proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);
+proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);
+proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);
+
+export default proto;
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/start-end-of.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/start-end-of.js
new file mode 100644
index 00000000000..02f982479ad
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/start-end-of.js
@@ -0,0 +1,59 @@
+import { normalizeUnits } from '../units/aliases';
+
+export function startOf (units) {
+ units = normalizeUnits(units);
+ // the following switch intentionally omits break keywords
+ // to utilize falling through the cases.
+ switch (units) {
+ case 'year':
+ this.month(0);
+ /* falls through */
+ case 'quarter':
+ case 'month':
+ this.date(1);
+ /* falls through */
+ case 'week':
+ case 'isoWeek':
+ case 'day':
+ case 'date':
+ this.hours(0);
+ /* falls through */
+ case 'hour':
+ this.minutes(0);
+ /* falls through */
+ case 'minute':
+ this.seconds(0);
+ /* falls through */
+ case 'second':
+ this.milliseconds(0);
+ }
+
+ // weeks are a special case
+ if (units === 'week') {
+ this.weekday(0);
+ }
+ if (units === 'isoWeek') {
+ this.isoWeekday(1);
+ }
+
+ // quarters are also special
+ if (units === 'quarter') {
+ this.month(Math.floor(this.month() / 3) * 3);
+ }
+
+ return this;
+}
+
+export function endOf (units) {
+ units = normalizeUnits(units);
+ if (units === undefined || units === 'millisecond') {
+ return this;
+ }
+
+ // 'date' is an alias for 'day', so it should be considered as such.
+ if (units === 'date') {
+ units = 'day';
+ }
+
+ return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/to-type.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/to-type.js
new file mode 100644
index 00000000000..a990dd200b3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/to-type.js
@@ -0,0 +1,34 @@
+export function valueOf () {
+ return this._d.valueOf() - ((this._offset || 0) * 60000);
+}
+
+export function unix () {
+ return Math.floor(this.valueOf() / 1000);
+}
+
+export function toDate () {
+ return new Date(this.valueOf());
+}
+
+export function toArray () {
+ var m = this;
+ return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];
+}
+
+export function toObject () {
+ var m = this;
+ return {
+ years: m.year(),
+ months: m.month(),
+ date: m.date(),
+ hours: m.hours(),
+ minutes: m.minutes(),
+ seconds: m.seconds(),
+ milliseconds: m.milliseconds()
+ };
+}
+
+export function toJSON () {
+ // new Date(NaN).toJSON() === null
+ return this.isValid() ? this.toISOString() : null;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/to.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/to.js
new file mode 100644
index 00000000000..7ad667e87f9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/to.js
@@ -0,0 +1,17 @@
+import { createDuration } from '../duration/create';
+import { createLocal } from '../create/local';
+import { isMoment } from '../moment/constructor';
+
+export function to (time, withoutSuffix) {
+ if (this.isValid() &&
+ ((isMoment(time) && time.isValid()) ||
+ createLocal(time).isValid())) {
+ return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);
+ } else {
+ return this.localeData().invalidDate();
+ }
+}
+
+export function toNow (withoutSuffix) {
+ return this.to(createLocal(), withoutSuffix);
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/valid.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/valid.js
new file mode 100644
index 00000000000..6c007429388
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/moment/valid.js
@@ -0,0 +1,15 @@
+import { isValid as _isValid } from '../create/valid';
+import extend from '../utils/extend';
+import getParsingFlags from '../create/parsing-flags';
+
+export function isValid () {
+ return _isValid(this);
+}
+
+export function parsingFlags () {
+ return extend({}, getParsingFlags(this));
+}
+
+export function invalidAt () {
+ return getParsingFlags(this).overflow;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/parse/regex.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/parse/regex.js
new file mode 100644
index 00000000000..b1dc7529e5c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/parse/regex.js
@@ -0,0 +1,54 @@
+export var match1 = /\d/; // 0 - 9
+export var match2 = /\d\d/; // 00 - 99
+export var match3 = /\d{3}/; // 000 - 999
+export var match4 = /\d{4}/; // 0000 - 9999
+export var match6 = /[+-]?\d{6}/; // -999999 - 999999
+export var match1to2 = /\d\d?/; // 0 - 99
+export var match3to4 = /\d\d\d\d?/; // 999 - 9999
+export var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999
+export var match1to3 = /\d{1,3}/; // 0 - 999
+export var match1to4 = /\d{1,4}/; // 0 - 9999
+export var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999
+
+export var matchUnsigned = /\d+/; // 0 - inf
+export var matchSigned = /[+-]?\d+/; // -inf - inf
+
+export var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z
+export var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z
+
+export var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123
+
+// any word (or two) characters or numbers including two/three word month in arabic.
+// includes scottish gaelic two word and hyphenated months
+export var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i;
+
+
+import hasOwnProp from '../utils/has-own-prop';
+import isFunction from '../utils/is-function';
+
+var regexes = {};
+
+export function addRegexToken (token, regex, strictRegex) {
+ regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {
+ return (isStrict && strictRegex) ? strictRegex : regex;
+ };
+}
+
+export function getParseRegexForToken (token, config) {
+ if (!hasOwnProp(regexes, token)) {
+ return new RegExp(unescapeFormat(token));
+ }
+
+ return regexes[token](config._strict, config._locale);
+}
+
+// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
+function unescapeFormat(s) {
+ return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
+ return p1 || p2 || p3 || p4;
+ }));
+}
+
+export function regexEscape(s) {
+ return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/parse/token.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/parse/token.js
new file mode 100644
index 00000000000..24b4474f87e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/parse/token.js
@@ -0,0 +1,33 @@
+import hasOwnProp from '../utils/has-own-prop';
+import isNumber from '../utils/is-number';
+import toInt from '../utils/to-int';
+
+var tokens = {};
+
+export function addParseToken (token, callback) {
+ var i, func = callback;
+ if (typeof token === 'string') {
+ token = [token];
+ }
+ if (isNumber(callback)) {
+ func = function (input, array) {
+ array[callback] = toInt(input);
+ };
+ }
+ for (i = 0; i < token.length; i++) {
+ tokens[token[i]] = func;
+ }
+}
+
+export function addWeekParseToken (token, callback) {
+ addParseToken(token, function (input, array, config, token) {
+ config._w = config._w || {};
+ callback(input, config._w, config, token);
+ });
+}
+
+export function addTimeToArrayFromToken(token, input, config) {
+ if (input != null && hasOwnProp(tokens, token)) {
+ tokens[token](input, config._a, config, token);
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/aliases.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/aliases.js
new file mode 100644
index 00000000000..0d8b88a138b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/aliases.js
@@ -0,0 +1,30 @@
+import hasOwnProp from '../utils/has-own-prop';
+
+var aliases = {};
+
+export function addUnitAlias (unit, shorthand) {
+ var lowerCase = unit.toLowerCase();
+ aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
+}
+
+export function normalizeUnits(units) {
+ return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;
+}
+
+export function normalizeObjectUnits(inputObject) {
+ var normalizedInput = {},
+ normalizedProp,
+ prop;
+
+ for (prop in inputObject) {
+ if (hasOwnProp(inputObject, prop)) {
+ normalizedProp = normalizeUnits(prop);
+ if (normalizedProp) {
+ normalizedInput[normalizedProp] = inputObject[prop];
+ }
+ }
+ }
+
+ return normalizedInput;
+}
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/constants.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/constants.js
new file mode 100644
index 00000000000..70bf1b26ede
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/constants.js
@@ -0,0 +1,9 @@
+export var YEAR = 0;
+export var MONTH = 1;
+export var DATE = 2;
+export var HOUR = 3;
+export var MINUTE = 4;
+export var SECOND = 5;
+export var MILLISECOND = 6;
+export var WEEK = 7;
+export var WEEKDAY = 8;
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/day-of-month.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/day-of-month.js
new file mode 100644
index 00000000000..e28ec9f4dd4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/day-of-month.js
@@ -0,0 +1,36 @@
+import { makeGetSet } from '../moment/get-set';
+import { addFormatToken } from '../format/format';
+import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
+import { addRegexToken, match1to2, match2 } from '../parse/regex';
+import { addParseToken } from '../parse/token';
+import { DATE } from './constants';
+import toInt from '../utils/to-int';
+
+// FORMATTING
+
+addFormatToken('D', ['DD', 2], 'Do', 'date');
+
+// ALIASES
+
+addUnitAlias('date', 'D');
+
+// PRIOROITY
+addUnitPriority('date', 9);
+
+// PARSING
+
+addRegexToken('D', match1to2);
+addRegexToken('DD', match1to2, match2);
+addRegexToken('Do', function (isStrict, locale) {
+ return isStrict ? locale._ordinalParse : locale._ordinalParseLenient;
+});
+
+addParseToken(['D', 'DD'], DATE);
+addParseToken('Do', function (input, array) {
+ array[DATE] = toInt(input.match(match1to2)[0], 10);
+});
+
+// MOMENTS
+
+export var getSetDayOfMonth = makeGetSet('Date', true);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/day-of-week.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/day-of-week.js
new file mode 100644
index 00000000000..603192e2898
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/day-of-week.js
@@ -0,0 +1,363 @@
+import { addFormatToken } from '../format/format';
+import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
+import { addRegexToken, match1to2, matchWord, regexEscape } from '../parse/regex';
+import { addWeekParseToken } from '../parse/token';
+import toInt from '../utils/to-int';
+import isArray from '../utils/is-array';
+import indexOf from '../utils/index-of';
+import hasOwnProp from '../utils/has-own-prop';
+import { createUTC } from '../create/utc';
+import getParsingFlags from '../create/parsing-flags';
+
+// FORMATTING
+
+addFormatToken('d', 0, 'do', 'day');
+
+addFormatToken('dd', 0, 0, function (format) {
+ return this.localeData().weekdaysMin(this, format);
+});
+
+addFormatToken('ddd', 0, 0, function (format) {
+ return this.localeData().weekdaysShort(this, format);
+});
+
+addFormatToken('dddd', 0, 0, function (format) {
+ return this.localeData().weekdays(this, format);
+});
+
+addFormatToken('e', 0, 0, 'weekday');
+addFormatToken('E', 0, 0, 'isoWeekday');
+
+// ALIASES
+
+addUnitAlias('day', 'd');
+addUnitAlias('weekday', 'e');
+addUnitAlias('isoWeekday', 'E');
+
+// PRIORITY
+addUnitPriority('day', 11);
+addUnitPriority('weekday', 11);
+addUnitPriority('isoWeekday', 11);
+
+// PARSING
+
+addRegexToken('d', match1to2);
+addRegexToken('e', match1to2);
+addRegexToken('E', match1to2);
+addRegexToken('dd', function (isStrict, locale) {
+ return locale.weekdaysMinRegex(isStrict);
+});
+addRegexToken('ddd', function (isStrict, locale) {
+ return locale.weekdaysShortRegex(isStrict);
+});
+addRegexToken('dddd', function (isStrict, locale) {
+ return locale.weekdaysRegex(isStrict);
+});
+
+addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
+ var weekday = config._locale.weekdaysParse(input, token, config._strict);
+ // if we didn't get a weekday name, mark the date as invalid
+ if (weekday != null) {
+ week.d = weekday;
+ } else {
+ getParsingFlags(config).invalidWeekday = input;
+ }
+});
+
+addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
+ week[token] = toInt(input);
+});
+
+// HELPERS
+
+function parseWeekday(input, locale) {
+ if (typeof input !== 'string') {
+ return input;
+ }
+
+ if (!isNaN(input)) {
+ return parseInt(input, 10);
+ }
+
+ input = locale.weekdaysParse(input);
+ if (typeof input === 'number') {
+ return input;
+ }
+
+ return null;
+}
+
+function parseIsoWeekday(input, locale) {
+ if (typeof input === 'string') {
+ return locale.weekdaysParse(input) % 7 || 7;
+ }
+ return isNaN(input) ? null : input;
+}
+
+// LOCALES
+
+export var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');
+export function localeWeekdays (m, format) {
+ if (!m) {
+ return this._weekdays;
+ }
+ return isArray(this._weekdays) ? this._weekdays[m.day()] :
+ this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];
+}
+
+export var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');
+export function localeWeekdaysShort (m) {
+ return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;
+}
+
+export var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');
+export function localeWeekdaysMin (m) {
+ return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;
+}
+
+function handleStrictParse(weekdayName, format, strict) {
+ var i, ii, mom, llc = weekdayName.toLocaleLowerCase();
+ if (!this._weekdaysParse) {
+ this._weekdaysParse = [];
+ this._shortWeekdaysParse = [];
+ this._minWeekdaysParse = [];
+
+ for (i = 0; i < 7; ++i) {
+ mom = createUTC([2000, 1]).day(i);
+ this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();
+ this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();
+ this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
+ }
+ }
+
+ if (strict) {
+ if (format === 'dddd') {
+ ii = indexOf.call(this._weekdaysParse, llc);
+ return ii !== -1 ? ii : null;
+ } else if (format === 'ddd') {
+ ii = indexOf.call(this._shortWeekdaysParse, llc);
+ return ii !== -1 ? ii : null;
+ } else {
+ ii = indexOf.call(this._minWeekdaysParse, llc);
+ return ii !== -1 ? ii : null;
+ }
+ } else {
+ if (format === 'dddd') {
+ ii = indexOf.call(this._weekdaysParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf.call(this._shortWeekdaysParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf.call(this._minWeekdaysParse, llc);
+ return ii !== -1 ? ii : null;
+ } else if (format === 'ddd') {
+ ii = indexOf.call(this._shortWeekdaysParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf.call(this._weekdaysParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf.call(this._minWeekdaysParse, llc);
+ return ii !== -1 ? ii : null;
+ } else {
+ ii = indexOf.call(this._minWeekdaysParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf.call(this._weekdaysParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf.call(this._shortWeekdaysParse, llc);
+ return ii !== -1 ? ii : null;
+ }
+ }
+}
+
+export function localeWeekdaysParse (weekdayName, format, strict) {
+ var i, mom, regex;
+
+ if (this._weekdaysParseExact) {
+ return handleStrictParse.call(this, weekdayName, format, strict);
+ }
+
+ if (!this._weekdaysParse) {
+ this._weekdaysParse = [];
+ this._minWeekdaysParse = [];
+ this._shortWeekdaysParse = [];
+ this._fullWeekdaysParse = [];
+ }
+
+ for (i = 0; i < 7; i++) {
+ // make the regex if we don't have it already
+
+ mom = createUTC([2000, 1]).day(i);
+ if (strict && !this._fullWeekdaysParse[i]) {
+ this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i');
+ this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i');
+ this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i');
+ }
+ if (!this._weekdaysParse[i]) {
+ regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
+ this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
+ }
+ // test the regex
+ if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {
+ return i;
+ } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {
+ return i;
+ } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {
+ return i;
+ } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
+ return i;
+ }
+ }
+}
+
+// MOMENTS
+
+export function getSetDayOfWeek (input) {
+ if (!this.isValid()) {
+ return input != null ? this : NaN;
+ }
+ var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
+ if (input != null) {
+ input = parseWeekday(input, this.localeData());
+ return this.add(input - day, 'd');
+ } else {
+ return day;
+ }
+}
+
+export function getSetLocaleDayOfWeek (input) {
+ if (!this.isValid()) {
+ return input != null ? this : NaN;
+ }
+ var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
+ return input == null ? weekday : this.add(input - weekday, 'd');
+}
+
+export function getSetISODayOfWeek (input) {
+ if (!this.isValid()) {
+ return input != null ? this : NaN;
+ }
+
+ // behaves the same as moment#day except
+ // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
+ // as a setter, sunday should belong to the previous week.
+
+ if (input != null) {
+ var weekday = parseIsoWeekday(input, this.localeData());
+ return this.day(this.day() % 7 ? weekday : weekday - 7);
+ } else {
+ return this.day() || 7;
+ }
+}
+
+var defaultWeekdaysRegex = matchWord;
+export function weekdaysRegex (isStrict) {
+ if (this._weekdaysParseExact) {
+ if (!hasOwnProp(this, '_weekdaysRegex')) {
+ computeWeekdaysParse.call(this);
+ }
+ if (isStrict) {
+ return this._weekdaysStrictRegex;
+ } else {
+ return this._weekdaysRegex;
+ }
+ } else {
+ if (!hasOwnProp(this, '_weekdaysRegex')) {
+ this._weekdaysRegex = defaultWeekdaysRegex;
+ }
+ return this._weekdaysStrictRegex && isStrict ?
+ this._weekdaysStrictRegex : this._weekdaysRegex;
+ }
+}
+
+var defaultWeekdaysShortRegex = matchWord;
+export function weekdaysShortRegex (isStrict) {
+ if (this._weekdaysParseExact) {
+ if (!hasOwnProp(this, '_weekdaysRegex')) {
+ computeWeekdaysParse.call(this);
+ }
+ if (isStrict) {
+ return this._weekdaysShortStrictRegex;
+ } else {
+ return this._weekdaysShortRegex;
+ }
+ } else {
+ if (!hasOwnProp(this, '_weekdaysShortRegex')) {
+ this._weekdaysShortRegex = defaultWeekdaysShortRegex;
+ }
+ return this._weekdaysShortStrictRegex && isStrict ?
+ this._weekdaysShortStrictRegex : this._weekdaysShortRegex;
+ }
+}
+
+var defaultWeekdaysMinRegex = matchWord;
+export function weekdaysMinRegex (isStrict) {
+ if (this._weekdaysParseExact) {
+ if (!hasOwnProp(this, '_weekdaysRegex')) {
+ computeWeekdaysParse.call(this);
+ }
+ if (isStrict) {
+ return this._weekdaysMinStrictRegex;
+ } else {
+ return this._weekdaysMinRegex;
+ }
+ } else {
+ if (!hasOwnProp(this, '_weekdaysMinRegex')) {
+ this._weekdaysMinRegex = defaultWeekdaysMinRegex;
+ }
+ return this._weekdaysMinStrictRegex && isStrict ?
+ this._weekdaysMinStrictRegex : this._weekdaysMinRegex;
+ }
+}
+
+
+function computeWeekdaysParse () {
+ function cmpLenRev(a, b) {
+ return b.length - a.length;
+ }
+
+ var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],
+ i, mom, minp, shortp, longp;
+ for (i = 0; i < 7; i++) {
+ // make the regex if we don't have it already
+ mom = createUTC([2000, 1]).day(i);
+ minp = this.weekdaysMin(mom, '');
+ shortp = this.weekdaysShort(mom, '');
+ longp = this.weekdays(mom, '');
+ minPieces.push(minp);
+ shortPieces.push(shortp);
+ longPieces.push(longp);
+ mixedPieces.push(minp);
+ mixedPieces.push(shortp);
+ mixedPieces.push(longp);
+ }
+ // Sorting makes sure if one weekday (or abbr) is a prefix of another it
+ // will match the longer piece.
+ minPieces.sort(cmpLenRev);
+ shortPieces.sort(cmpLenRev);
+ longPieces.sort(cmpLenRev);
+ mixedPieces.sort(cmpLenRev);
+ for (i = 0; i < 7; i++) {
+ shortPieces[i] = regexEscape(shortPieces[i]);
+ longPieces[i] = regexEscape(longPieces[i]);
+ mixedPieces[i] = regexEscape(mixedPieces[i]);
+ }
+
+ this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
+ this._weekdaysShortRegex = this._weekdaysRegex;
+ this._weekdaysMinRegex = this._weekdaysRegex;
+
+ this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
+ this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
+ this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/day-of-year.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/day-of-year.js
new file mode 100644
index 00000000000..6fe931c1e46
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/day-of-year.js
@@ -0,0 +1,36 @@
+import { addFormatToken } from '../format/format';
+import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
+import { addRegexToken, match3, match1to3 } from '../parse/regex';
+import { daysInYear } from './year';
+import { createUTCDate } from '../create/date-from-array';
+import { addParseToken } from '../parse/token';
+import toInt from '../utils/to-int';
+
+// FORMATTING
+
+addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
+
+// ALIASES
+
+addUnitAlias('dayOfYear', 'DDD');
+
+// PRIORITY
+addUnitPriority('dayOfYear', 4);
+
+// PARSING
+
+addRegexToken('DDD', match1to3);
+addRegexToken('DDDD', match3);
+addParseToken(['DDD', 'DDDD'], function (input, array, config) {
+ config._dayOfYear = toInt(input);
+});
+
+// HELPERS
+
+// MOMENTS
+
+export function getSetDayOfYear (input) {
+ var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;
+ return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/hour.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/hour.js
new file mode 100644
index 00000000000..d5733fbbcfa
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/hour.js
@@ -0,0 +1,138 @@
+import { makeGetSet } from '../moment/get-set';
+import { addFormatToken } from '../format/format';
+import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
+import { addRegexToken, match1to2, match2, match3to4, match5to6 } from '../parse/regex';
+import { addParseToken } from '../parse/token';
+import { HOUR, MINUTE, SECOND } from './constants';
+import toInt from '../utils/to-int';
+import zeroFill from '../utils/zero-fill';
+import getParsingFlags from '../create/parsing-flags';
+
+// FORMATTING
+
+function hFormat() {
+ return this.hours() % 12 || 12;
+}
+
+function kFormat() {
+ return this.hours() || 24;
+}
+
+addFormatToken('H', ['HH', 2], 0, 'hour');
+addFormatToken('h', ['hh', 2], 0, hFormat);
+addFormatToken('k', ['kk', 2], 0, kFormat);
+
+addFormatToken('hmm', 0, 0, function () {
+ return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
+});
+
+addFormatToken('hmmss', 0, 0, function () {
+ return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +
+ zeroFill(this.seconds(), 2);
+});
+
+addFormatToken('Hmm', 0, 0, function () {
+ return '' + this.hours() + zeroFill(this.minutes(), 2);
+});
+
+addFormatToken('Hmmss', 0, 0, function () {
+ return '' + this.hours() + zeroFill(this.minutes(), 2) +
+ zeroFill(this.seconds(), 2);
+});
+
+function meridiem (token, lowercase) {
+ addFormatToken(token, 0, 0, function () {
+ return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);
+ });
+}
+
+meridiem('a', true);
+meridiem('A', false);
+
+// ALIASES
+
+addUnitAlias('hour', 'h');
+
+// PRIORITY
+addUnitPriority('hour', 13);
+
+// PARSING
+
+function matchMeridiem (isStrict, locale) {
+ return locale._meridiemParse;
+}
+
+addRegexToken('a', matchMeridiem);
+addRegexToken('A', matchMeridiem);
+addRegexToken('H', match1to2);
+addRegexToken('h', match1to2);
+addRegexToken('HH', match1to2, match2);
+addRegexToken('hh', match1to2, match2);
+
+addRegexToken('hmm', match3to4);
+addRegexToken('hmmss', match5to6);
+addRegexToken('Hmm', match3to4);
+addRegexToken('Hmmss', match5to6);
+
+addParseToken(['H', 'HH'], HOUR);
+addParseToken(['a', 'A'], function (input, array, config) {
+ config._isPm = config._locale.isPM(input);
+ config._meridiem = input;
+});
+addParseToken(['h', 'hh'], function (input, array, config) {
+ array[HOUR] = toInt(input);
+ getParsingFlags(config).bigHour = true;
+});
+addParseToken('hmm', function (input, array, config) {
+ var pos = input.length - 2;
+ array[HOUR] = toInt(input.substr(0, pos));
+ array[MINUTE] = toInt(input.substr(pos));
+ getParsingFlags(config).bigHour = true;
+});
+addParseToken('hmmss', function (input, array, config) {
+ var pos1 = input.length - 4;
+ var pos2 = input.length - 2;
+ array[HOUR] = toInt(input.substr(0, pos1));
+ array[MINUTE] = toInt(input.substr(pos1, 2));
+ array[SECOND] = toInt(input.substr(pos2));
+ getParsingFlags(config).bigHour = true;
+});
+addParseToken('Hmm', function (input, array, config) {
+ var pos = input.length - 2;
+ array[HOUR] = toInt(input.substr(0, pos));
+ array[MINUTE] = toInt(input.substr(pos));
+});
+addParseToken('Hmmss', function (input, array, config) {
+ var pos1 = input.length - 4;
+ var pos2 = input.length - 2;
+ array[HOUR] = toInt(input.substr(0, pos1));
+ array[MINUTE] = toInt(input.substr(pos1, 2));
+ array[SECOND] = toInt(input.substr(pos2));
+});
+
+// LOCALES
+
+export function localeIsPM (input) {
+ // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
+ // Using charAt should be more compatible.
+ return ((input + '').toLowerCase().charAt(0) === 'p');
+}
+
+export var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i;
+export function localeMeridiem (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'pm' : 'PM';
+ } else {
+ return isLower ? 'am' : 'AM';
+ }
+}
+
+
+// MOMENTS
+
+// Setting the hour should keep the time, because the user explicitly
+// specified which hour he wants. So trying to maintain the same hour (in
+// a new timezone) makes sense. Adding/subtracting hours does not follow
+// this rule.
+export var getSetHour = makeGetSet('Hours', true);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/millisecond.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/millisecond.js
new file mode 100644
index 00000000000..27c95126936
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/millisecond.js
@@ -0,0 +1,69 @@
+import { makeGetSet } from '../moment/get-set';
+import { addFormatToken } from '../format/format';
+import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
+import { addRegexToken, match1, match2, match3, match1to3, matchUnsigned } from '../parse/regex';
+import { addParseToken } from '../parse/token';
+import { MILLISECOND } from './constants';
+import toInt from '../utils/to-int';
+
+// FORMATTING
+
+addFormatToken('S', 0, 0, function () {
+ return ~~(this.millisecond() / 100);
+});
+
+addFormatToken(0, ['SS', 2], 0, function () {
+ return ~~(this.millisecond() / 10);
+});
+
+addFormatToken(0, ['SSS', 3], 0, 'millisecond');
+addFormatToken(0, ['SSSS', 4], 0, function () {
+ return this.millisecond() * 10;
+});
+addFormatToken(0, ['SSSSS', 5], 0, function () {
+ return this.millisecond() * 100;
+});
+addFormatToken(0, ['SSSSSS', 6], 0, function () {
+ return this.millisecond() * 1000;
+});
+addFormatToken(0, ['SSSSSSS', 7], 0, function () {
+ return this.millisecond() * 10000;
+});
+addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
+ return this.millisecond() * 100000;
+});
+addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
+ return this.millisecond() * 1000000;
+});
+
+
+// ALIASES
+
+addUnitAlias('millisecond', 'ms');
+
+// PRIORITY
+
+addUnitPriority('millisecond', 16);
+
+// PARSING
+
+addRegexToken('S', match1to3, match1);
+addRegexToken('SS', match1to3, match2);
+addRegexToken('SSS', match1to3, match3);
+
+var token;
+for (token = 'SSSS'; token.length <= 9; token += 'S') {
+ addRegexToken(token, matchUnsigned);
+}
+
+function parseMs(input, array) {
+ array[MILLISECOND] = toInt(('0.' + input) * 1000);
+}
+
+for (token = 'S'; token.length <= 9; token += 'S') {
+ addParseToken(token, parseMs);
+}
+// MOMENTS
+
+export var getSetMillisecond = makeGetSet('Milliseconds', false);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/minute.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/minute.js
new file mode 100644
index 00000000000..9f760322e13
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/minute.js
@@ -0,0 +1,29 @@
+import { makeGetSet } from '../moment/get-set';
+import { addFormatToken } from '../format/format';
+import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
+import { addRegexToken, match1to2, match2 } from '../parse/regex';
+import { addParseToken } from '../parse/token';
+import { MINUTE } from './constants';
+
+// FORMATTING
+
+addFormatToken('m', ['mm', 2], 0, 'minute');
+
+// ALIASES
+
+addUnitAlias('minute', 'm');
+
+// PRIORITY
+
+addUnitPriority('minute', 14);
+
+// PARSING
+
+addRegexToken('m', match1to2);
+addRegexToken('mm', match1to2, match2);
+addParseToken(['m', 'mm'], MINUTE);
+
+// MOMENTS
+
+export var getSetMinute = makeGetSet('Minutes', false);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/month.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/month.js
new file mode 100644
index 00000000000..e454d678a13
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/month.js
@@ -0,0 +1,281 @@
+import { get } from '../moment/get-set';
+import hasOwnProp from '../utils/has-own-prop';
+import { addFormatToken } from '../format/format';
+import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
+import { addRegexToken, match1to2, match2, matchWord, regexEscape } from '../parse/regex';
+import { addParseToken } from '../parse/token';
+import { hooks } from '../utils/hooks';
+import { MONTH } from './constants';
+import toInt from '../utils/to-int';
+import isArray from '../utils/is-array';
+import isNumber from '../utils/is-number';
+import indexOf from '../utils/index-of';
+import { createUTC } from '../create/utc';
+import getParsingFlags from '../create/parsing-flags';
+
+export function daysInMonth(year, month) {
+ return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
+}
+
+// FORMATTING
+
+addFormatToken('M', ['MM', 2], 'Mo', function () {
+ return this.month() + 1;
+});
+
+addFormatToken('MMM', 0, 0, function (format) {
+ return this.localeData().monthsShort(this, format);
+});
+
+addFormatToken('MMMM', 0, 0, function (format) {
+ return this.localeData().months(this, format);
+});
+
+// ALIASES
+
+addUnitAlias('month', 'M');
+
+// PRIORITY
+
+addUnitPriority('month', 8);
+
+// PARSING
+
+addRegexToken('M', match1to2);
+addRegexToken('MM', match1to2, match2);
+addRegexToken('MMM', function (isStrict, locale) {
+ return locale.monthsShortRegex(isStrict);
+});
+addRegexToken('MMMM', function (isStrict, locale) {
+ return locale.monthsRegex(isStrict);
+});
+
+addParseToken(['M', 'MM'], function (input, array) {
+ array[MONTH] = toInt(input) - 1;
+});
+
+addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
+ var month = config._locale.monthsParse(input, token, config._strict);
+ // if we didn't find a month name, mark the date as invalid.
+ if (month != null) {
+ array[MONTH] = month;
+ } else {
+ getParsingFlags(config).invalidMonth = input;
+ }
+});
+
+// LOCALES
+
+var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/;
+export var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');
+export function localeMonths (m, format) {
+ if (!m) {
+ return this._months;
+ }
+ return isArray(this._months) ? this._months[m.month()] :
+ this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];
+}
+
+export var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
+export function localeMonthsShort (m, format) {
+ if (!m) {
+ return this._monthsShort;
+ }
+ return isArray(this._monthsShort) ? this._monthsShort[m.month()] :
+ this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];
+}
+
+function handleStrictParse(monthName, format, strict) {
+ var i, ii, mom, llc = monthName.toLocaleLowerCase();
+ if (!this._monthsParse) {
+ // this is not used
+ this._monthsParse = [];
+ this._longMonthsParse = [];
+ this._shortMonthsParse = [];
+ for (i = 0; i < 12; ++i) {
+ mom = createUTC([2000, i]);
+ this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();
+ this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
+ }
+ }
+
+ if (strict) {
+ if (format === 'MMM') {
+ ii = indexOf.call(this._shortMonthsParse, llc);
+ return ii !== -1 ? ii : null;
+ } else {
+ ii = indexOf.call(this._longMonthsParse, llc);
+ return ii !== -1 ? ii : null;
+ }
+ } else {
+ if (format === 'MMM') {
+ ii = indexOf.call(this._shortMonthsParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf.call(this._longMonthsParse, llc);
+ return ii !== -1 ? ii : null;
+ } else {
+ ii = indexOf.call(this._longMonthsParse, llc);
+ if (ii !== -1) {
+ return ii;
+ }
+ ii = indexOf.call(this._shortMonthsParse, llc);
+ return ii !== -1 ? ii : null;
+ }
+ }
+}
+
+export function localeMonthsParse (monthName, format, strict) {
+ var i, mom, regex;
+
+ if (this._monthsParseExact) {
+ return handleStrictParse.call(this, monthName, format, strict);
+ }
+
+ if (!this._monthsParse) {
+ this._monthsParse = [];
+ this._longMonthsParse = [];
+ this._shortMonthsParse = [];
+ }
+
+ // TODO: add sorting
+ // Sorting makes sure if one month (or abbr) is a prefix of another
+ // see sorting in computeMonthsParse
+ for (i = 0; i < 12; i++) {
+ // make the regex if we don't have it already
+ mom = createUTC([2000, i]);
+ if (strict && !this._longMonthsParse[i]) {
+ this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');
+ this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');
+ }
+ if (!strict && !this._monthsParse[i]) {
+ regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
+ this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
+ }
+ // test the regex
+ if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {
+ return i;
+ } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {
+ return i;
+ } else if (!strict && this._monthsParse[i].test(monthName)) {
+ return i;
+ }
+ }
+}
+
+// MOMENTS
+
+export function setMonth (mom, value) {
+ var dayOfMonth;
+
+ if (!mom.isValid()) {
+ // No op
+ return mom;
+ }
+
+ if (typeof value === 'string') {
+ if (/^\d+$/.test(value)) {
+ value = toInt(value);
+ } else {
+ value = mom.localeData().monthsParse(value);
+ // TODO: Another silent failure?
+ if (!isNumber(value)) {
+ return mom;
+ }
+ }
+ }
+
+ dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
+ mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
+ return mom;
+}
+
+export function getSetMonth (value) {
+ if (value != null) {
+ setMonth(this, value);
+ hooks.updateOffset(this, true);
+ return this;
+ } else {
+ return get(this, 'Month');
+ }
+}
+
+export function getDaysInMonth () {
+ return daysInMonth(this.year(), this.month());
+}
+
+var defaultMonthsShortRegex = matchWord;
+export function monthsShortRegex (isStrict) {
+ if (this._monthsParseExact) {
+ if (!hasOwnProp(this, '_monthsRegex')) {
+ computeMonthsParse.call(this);
+ }
+ if (isStrict) {
+ return this._monthsShortStrictRegex;
+ } else {
+ return this._monthsShortRegex;
+ }
+ } else {
+ if (!hasOwnProp(this, '_monthsShortRegex')) {
+ this._monthsShortRegex = defaultMonthsShortRegex;
+ }
+ return this._monthsShortStrictRegex && isStrict ?
+ this._monthsShortStrictRegex : this._monthsShortRegex;
+ }
+}
+
+var defaultMonthsRegex = matchWord;
+export function monthsRegex (isStrict) {
+ if (this._monthsParseExact) {
+ if (!hasOwnProp(this, '_monthsRegex')) {
+ computeMonthsParse.call(this);
+ }
+ if (isStrict) {
+ return this._monthsStrictRegex;
+ } else {
+ return this._monthsRegex;
+ }
+ } else {
+ if (!hasOwnProp(this, '_monthsRegex')) {
+ this._monthsRegex = defaultMonthsRegex;
+ }
+ return this._monthsStrictRegex && isStrict ?
+ this._monthsStrictRegex : this._monthsRegex;
+ }
+}
+
+function computeMonthsParse () {
+ function cmpLenRev(a, b) {
+ return b.length - a.length;
+ }
+
+ var shortPieces = [], longPieces = [], mixedPieces = [],
+ i, mom;
+ for (i = 0; i < 12; i++) {
+ // make the regex if we don't have it already
+ mom = createUTC([2000, i]);
+ shortPieces.push(this.monthsShort(mom, ''));
+ longPieces.push(this.months(mom, ''));
+ mixedPieces.push(this.months(mom, ''));
+ mixedPieces.push(this.monthsShort(mom, ''));
+ }
+ // Sorting makes sure if one month (or abbr) is a prefix of another it
+ // will match the longer piece.
+ shortPieces.sort(cmpLenRev);
+ longPieces.sort(cmpLenRev);
+ mixedPieces.sort(cmpLenRev);
+ for (i = 0; i < 12; i++) {
+ shortPieces[i] = regexEscape(shortPieces[i]);
+ longPieces[i] = regexEscape(longPieces[i]);
+ }
+ for (i = 0; i < 24; i++) {
+ mixedPieces[i] = regexEscape(mixedPieces[i]);
+ }
+
+ this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
+ this._monthsShortRegex = this._monthsRegex;
+ this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
+ this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/offset.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/offset.js
new file mode 100644
index 00000000000..168aeadd808
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/offset.js
@@ -0,0 +1,235 @@
+import zeroFill from '../utils/zero-fill';
+import { createDuration } from '../duration/create';
+import { addSubtract } from '../moment/add-subtract';
+import { isMoment, copyConfig } from '../moment/constructor';
+import { addFormatToken } from '../format/format';
+import { addRegexToken, matchOffset, matchShortOffset } from '../parse/regex';
+import { addParseToken } from '../parse/token';
+import { createLocal } from '../create/local';
+import { prepareConfig } from '../create/from-anything';
+import { createUTC } from '../create/utc';
+import isDate from '../utils/is-date';
+import toInt from '../utils/to-int';
+import isUndefined from '../utils/is-undefined';
+import compareArrays from '../utils/compare-arrays';
+import { hooks } from '../utils/hooks';
+
+// FORMATTING
+
+function offset (token, separator) {
+ addFormatToken(token, 0, 0, function () {
+ var offset = this.utcOffset();
+ var sign = '+';
+ if (offset < 0) {
+ offset = -offset;
+ sign = '-';
+ }
+ return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);
+ });
+}
+
+offset('Z', ':');
+offset('ZZ', '');
+
+// PARSING
+
+addRegexToken('Z', matchShortOffset);
+addRegexToken('ZZ', matchShortOffset);
+addParseToken(['Z', 'ZZ'], function (input, array, config) {
+ config._useUTC = true;
+ config._tzm = offsetFromString(matchShortOffset, input);
+});
+
+// HELPERS
+
+// timezone chunker
+// '+10:00' > ['10', '00']
+// '-1530' > ['-15', '30']
+var chunkOffset = /([\+\-]|\d\d)/gi;
+
+function offsetFromString(matcher, string) {
+ var matches = (string || '').match(matcher);
+
+ if (matches === null) {
+ return null;
+ }
+
+ var chunk = matches[matches.length - 1] || [];
+ var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];
+ var minutes = +(parts[1] * 60) + toInt(parts[2]);
+
+ return minutes === 0 ?
+ 0 :
+ parts[0] === '+' ? minutes : -minutes;
+}
+
+// Return a moment from input, that is local/utc/zone equivalent to model.
+export function cloneWithOffset(input, model) {
+ var res, diff;
+ if (model._isUTC) {
+ res = model.clone();
+ diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();
+ // Use low-level api, because this fn is low-level api.
+ res._d.setTime(res._d.valueOf() + diff);
+ hooks.updateOffset(res, false);
+ return res;
+ } else {
+ return createLocal(input).local();
+ }
+}
+
+function getDateOffset (m) {
+ // On Firefox.24 Date#getTimezoneOffset returns a floating point.
+ // https://github.com/moment/moment/pull/1871
+ return -Math.round(m._d.getTimezoneOffset() / 15) * 15;
+}
+
+// HOOKS
+
+// This function will be called whenever a moment is mutated.
+// It is intended to keep the offset in sync with the timezone.
+hooks.updateOffset = function () {};
+
+// MOMENTS
+
+// keepLocalTime = true means only change the timezone, without
+// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
+// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
+// +0200, so we adjust the time as needed, to be valid.
+//
+// Keeping the time actually adds/subtracts (one hour)
+// from the actual represented time. That is why we call updateOffset
+// a second time. In case it wants us to change the offset again
+// _changeInProgress == true case, then we have to adjust, because
+// there is no such time in the given timezone.
+export function getSetOffset (input, keepLocalTime) {
+ var offset = this._offset || 0,
+ localAdjust;
+ if (!this.isValid()) {
+ return input != null ? this : NaN;
+ }
+ if (input != null) {
+ if (typeof input === 'string') {
+ input = offsetFromString(matchShortOffset, input);
+ if (input === null) {
+ return this;
+ }
+ } else if (Math.abs(input) < 16) {
+ input = input * 60;
+ }
+ if (!this._isUTC && keepLocalTime) {
+ localAdjust = getDateOffset(this);
+ }
+ this._offset = input;
+ this._isUTC = true;
+ if (localAdjust != null) {
+ this.add(localAdjust, 'm');
+ }
+ if (offset !== input) {
+ if (!keepLocalTime || this._changeInProgress) {
+ addSubtract(this, createDuration(input - offset, 'm'), 1, false);
+ } else if (!this._changeInProgress) {
+ this._changeInProgress = true;
+ hooks.updateOffset(this, true);
+ this._changeInProgress = null;
+ }
+ }
+ return this;
+ } else {
+ return this._isUTC ? offset : getDateOffset(this);
+ }
+}
+
+export function getSetZone (input, keepLocalTime) {
+ if (input != null) {
+ if (typeof input !== 'string') {
+ input = -input;
+ }
+
+ this.utcOffset(input, keepLocalTime);
+
+ return this;
+ } else {
+ return -this.utcOffset();
+ }
+}
+
+export function setOffsetToUTC (keepLocalTime) {
+ return this.utcOffset(0, keepLocalTime);
+}
+
+export function setOffsetToLocal (keepLocalTime) {
+ if (this._isUTC) {
+ this.utcOffset(0, keepLocalTime);
+ this._isUTC = false;
+
+ if (keepLocalTime) {
+ this.subtract(getDateOffset(this), 'm');
+ }
+ }
+ return this;
+}
+
+export function setOffsetToParsedOffset () {
+ if (this._tzm != null) {
+ this.utcOffset(this._tzm);
+ } else if (typeof this._i === 'string') {
+ var tZone = offsetFromString(matchOffset, this._i);
+ if (tZone != null) {
+ this.utcOffset(tZone);
+ }
+ else {
+ this.utcOffset(0, true);
+ }
+ }
+ return this;
+}
+
+export function hasAlignedHourOffset (input) {
+ if (!this.isValid()) {
+ return false;
+ }
+ input = input ? createLocal(input).utcOffset() : 0;
+
+ return (this.utcOffset() - input) % 60 === 0;
+}
+
+export function isDaylightSavingTime () {
+ return (
+ this.utcOffset() > this.clone().month(0).utcOffset() ||
+ this.utcOffset() > this.clone().month(5).utcOffset()
+ );
+}
+
+export function isDaylightSavingTimeShifted () {
+ if (!isUndefined(this._isDSTShifted)) {
+ return this._isDSTShifted;
+ }
+
+ var c = {};
+
+ copyConfig(c, this);
+ c = prepareConfig(c);
+
+ if (c._a) {
+ var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
+ this._isDSTShifted = this.isValid() &&
+ compareArrays(c._a, other.toArray()) > 0;
+ } else {
+ this._isDSTShifted = false;
+ }
+
+ return this._isDSTShifted;
+}
+
+export function isLocal () {
+ return this.isValid() ? !this._isUTC : false;
+}
+
+export function isUtcOffset () {
+ return this.isValid() ? this._isUTC : false;
+}
+
+export function isUtc () {
+ return this.isValid() ? this._isUTC && this._offset === 0 : false;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/priorities.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/priorities.js
new file mode 100644
index 00000000000..699017cb80f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/priorities.js
@@ -0,0 +1,16 @@
+var priorities = {};
+
+export function addUnitPriority(unit, priority) {
+ priorities[unit] = priority;
+}
+
+export function getPrioritizedUnits(unitsObj) {
+ var units = [];
+ for (var u in unitsObj) {
+ units.push({unit: u, priority: priorities[u]});
+ }
+ units.sort(function (a, b) {
+ return a.priority - b.priority;
+ });
+ return units;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/quarter.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/quarter.js
new file mode 100644
index 00000000000..a6d409a862c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/quarter.js
@@ -0,0 +1,32 @@
+import { addFormatToken } from '../format/format';
+import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
+import { addRegexToken, match1 } from '../parse/regex';
+import { addParseToken } from '../parse/token';
+import { MONTH } from './constants';
+import toInt from '../utils/to-int';
+
+// FORMATTING
+
+addFormatToken('Q', 0, 'Qo', 'quarter');
+
+// ALIASES
+
+addUnitAlias('quarter', 'Q');
+
+// PRIORITY
+
+addUnitPriority('quarter', 7);
+
+// PARSING
+
+addRegexToken('Q', match1);
+addParseToken('Q', function (input, array) {
+ array[MONTH] = (toInt(input) - 1) * 3;
+});
+
+// MOMENTS
+
+export function getSetQuarter (input) {
+ return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/second.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/second.js
new file mode 100644
index 00000000000..179371186e9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/second.js
@@ -0,0 +1,29 @@
+import { makeGetSet } from '../moment/get-set';
+import { addFormatToken } from '../format/format';
+import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
+import { addRegexToken, match1to2, match2 } from '../parse/regex';
+import { addParseToken } from '../parse/token';
+import { SECOND } from './constants';
+
+// FORMATTING
+
+addFormatToken('s', ['ss', 2], 0, 'second');
+
+// ALIASES
+
+addUnitAlias('second', 's');
+
+// PRIORITY
+
+addUnitPriority('second', 15);
+
+// PARSING
+
+addRegexToken('s', match1to2);
+addRegexToken('ss', match1to2, match2);
+addParseToken(['s', 'ss'], SECOND);
+
+// MOMENTS
+
+export var getSetSecond = makeGetSet('Seconds', false);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/timestamp.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/timestamp.js
new file mode 100644
index 00000000000..a49e1e4b852
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/timestamp.js
@@ -0,0 +1,20 @@
+import { addFormatToken } from '../format/format';
+import { addRegexToken, matchTimestamp, matchSigned } from '../parse/regex';
+import { addParseToken } from '../parse/token';
+import toInt from '../utils/to-int';
+
+// FORMATTING
+
+addFormatToken('X', 0, 0, 'unix');
+addFormatToken('x', 0, 0, 'valueOf');
+
+// PARSING
+
+addRegexToken('x', matchSigned);
+addRegexToken('X', matchTimestamp);
+addParseToken('X', function (input, array, config) {
+ config._d = new Date(parseFloat(input, 10) * 1000);
+});
+addParseToken('x', function (input, array, config) {
+ config._d = new Date(toInt(input));
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/timezone.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/timezone.js
new file mode 100644
index 00000000000..20c81cd2c62
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/timezone.js
@@ -0,0 +1,16 @@
+import { addFormatToken } from '../format/format';
+
+// FORMATTING
+
+addFormatToken('z', 0, 0, 'zoneAbbr');
+addFormatToken('zz', 0, 0, 'zoneName');
+
+// MOMENTS
+
+export function getZoneAbbr () {
+ return this._isUTC ? 'UTC' : '';
+}
+
+export function getZoneName () {
+ return this._isUTC ? 'Coordinated Universal Time' : '';
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/units.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/units.js
new file mode 100644
index 00000000000..6f45f1c040b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/units.js
@@ -0,0 +1,20 @@
+// Side effect imports
+import './day-of-month';
+import './day-of-week';
+import './day-of-year';
+import './hour';
+import './millisecond';
+import './minute';
+import './month';
+import './offset';
+import './quarter';
+import './second';
+import './timestamp';
+import './timezone';
+import './week-year';
+import './week';
+import './year';
+
+import { normalizeUnits } from './aliases';
+
+export { normalizeUnits };
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/week-calendar-utils.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/week-calendar-utils.js
new file mode 100644
index 00000000000..b89810c75ac
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/week-calendar-utils.js
@@ -0,0 +1,65 @@
+import { daysInYear } from './year';
+import { createLocal } from '../create/local';
+import { createUTCDate } from '../create/date-from-array';
+
+// start-of-first-week - start-of-year
+function firstWeekOffset(year, dow, doy) {
+ var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
+ fwd = 7 + dow - doy,
+ // first-week day local weekday -- which local weekday is fwd
+ fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
+
+ return -fwdlw + fwd - 1;
+}
+
+//http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
+export function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
+ var localWeekday = (7 + weekday - dow) % 7,
+ weekOffset = firstWeekOffset(year, dow, doy),
+ dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
+ resYear, resDayOfYear;
+
+ if (dayOfYear <= 0) {
+ resYear = year - 1;
+ resDayOfYear = daysInYear(resYear) + dayOfYear;
+ } else if (dayOfYear > daysInYear(year)) {
+ resYear = year + 1;
+ resDayOfYear = dayOfYear - daysInYear(year);
+ } else {
+ resYear = year;
+ resDayOfYear = dayOfYear;
+ }
+
+ return {
+ year: resYear,
+ dayOfYear: resDayOfYear
+ };
+}
+
+export function weekOfYear(mom, dow, doy) {
+ var weekOffset = firstWeekOffset(mom.year(), dow, doy),
+ week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
+ resWeek, resYear;
+
+ if (week < 1) {
+ resYear = mom.year() - 1;
+ resWeek = week + weeksInYear(resYear, dow, doy);
+ } else if (week > weeksInYear(mom.year(), dow, doy)) {
+ resWeek = week - weeksInYear(mom.year(), dow, doy);
+ resYear = mom.year() + 1;
+ } else {
+ resYear = mom.year();
+ resWeek = week;
+ }
+
+ return {
+ week: resWeek,
+ year: resYear
+ };
+}
+
+export function weeksInYear(year, dow, doy) {
+ var weekOffset = firstWeekOffset(year, dow, doy),
+ weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
+ return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/week-year.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/week-year.js
new file mode 100644
index 00000000000..7fa5425bccb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/week-year.js
@@ -0,0 +1,107 @@
+import { addFormatToken } from '../format/format';
+import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
+import { addRegexToken, match1to2, match1to4, match1to6, match2, match4, match6, matchSigned } from '../parse/regex';
+import { addWeekParseToken } from '../parse/token';
+import { weekOfYear, weeksInYear, dayOfYearFromWeeks } from './week-calendar-utils';
+import toInt from '../utils/to-int';
+import { hooks } from '../utils/hooks';
+import { createLocal } from '../create/local';
+import { createUTCDate } from '../create/date-from-array';
+
+// FORMATTING
+
+addFormatToken(0, ['gg', 2], 0, function () {
+ return this.weekYear() % 100;
+});
+
+addFormatToken(0, ['GG', 2], 0, function () {
+ return this.isoWeekYear() % 100;
+});
+
+function addWeekYearFormatToken (token, getter) {
+ addFormatToken(0, [token, token.length], 0, getter);
+}
+
+addWeekYearFormatToken('gggg', 'weekYear');
+addWeekYearFormatToken('ggggg', 'weekYear');
+addWeekYearFormatToken('GGGG', 'isoWeekYear');
+addWeekYearFormatToken('GGGGG', 'isoWeekYear');
+
+// ALIASES
+
+addUnitAlias('weekYear', 'gg');
+addUnitAlias('isoWeekYear', 'GG');
+
+// PRIORITY
+
+addUnitPriority('weekYear', 1);
+addUnitPriority('isoWeekYear', 1);
+
+
+// PARSING
+
+addRegexToken('G', matchSigned);
+addRegexToken('g', matchSigned);
+addRegexToken('GG', match1to2, match2);
+addRegexToken('gg', match1to2, match2);
+addRegexToken('GGGG', match1to4, match4);
+addRegexToken('gggg', match1to4, match4);
+addRegexToken('GGGGG', match1to6, match6);
+addRegexToken('ggggg', match1to6, match6);
+
+addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {
+ week[token.substr(0, 2)] = toInt(input);
+});
+
+addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
+ week[token] = hooks.parseTwoDigitYear(input);
+});
+
+// MOMENTS
+
+export function getSetWeekYear (input) {
+ return getSetWeekYearHelper.call(this,
+ input,
+ this.week(),
+ this.weekday(),
+ this.localeData()._week.dow,
+ this.localeData()._week.doy);
+}
+
+export function getSetISOWeekYear (input) {
+ return getSetWeekYearHelper.call(this,
+ input, this.isoWeek(), this.isoWeekday(), 1, 4);
+}
+
+export function getISOWeeksInYear () {
+ return weeksInYear(this.year(), 1, 4);
+}
+
+export function getWeeksInYear () {
+ var weekInfo = this.localeData()._week;
+ return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
+}
+
+function getSetWeekYearHelper(input, week, weekday, dow, doy) {
+ var weeksTarget;
+ if (input == null) {
+ return weekOfYear(this, dow, doy).year;
+ } else {
+ weeksTarget = weeksInYear(input, dow, doy);
+ if (week > weeksTarget) {
+ week = weeksTarget;
+ }
+ return setWeekAll.call(this, input, week, weekday, dow, doy);
+ }
+}
+
+function setWeekAll(weekYear, week, weekday, dow, doy) {
+ var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
+ date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);
+
+ this.year(date.getUTCFullYear());
+ this.month(date.getUTCMonth());
+ this.date(date.getUTCDate());
+ return this;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/week.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/week.js
new file mode 100644
index 00000000000..da64ffef328
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/week.js
@@ -0,0 +1,67 @@
+import { addFormatToken } from '../format/format';
+import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
+import { addRegexToken, match1to2, match2 } from '../parse/regex';
+import { addWeekParseToken } from '../parse/token';
+import toInt from '../utils/to-int';
+import { createLocal } from '../create/local';
+import { weekOfYear } from './week-calendar-utils';
+
+// FORMATTING
+
+addFormatToken('w', ['ww', 2], 'wo', 'week');
+addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
+
+// ALIASES
+
+addUnitAlias('week', 'w');
+addUnitAlias('isoWeek', 'W');
+
+// PRIORITIES
+
+addUnitPriority('week', 5);
+addUnitPriority('isoWeek', 5);
+
+// PARSING
+
+addRegexToken('w', match1to2);
+addRegexToken('ww', match1to2, match2);
+addRegexToken('W', match1to2);
+addRegexToken('WW', match1to2, match2);
+
+addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {
+ week[token.substr(0, 1)] = toInt(input);
+});
+
+// HELPERS
+
+// LOCALES
+
+export function localeWeek (mom) {
+ return weekOfYear(mom, this._week.dow, this._week.doy).week;
+}
+
+export var defaultLocaleWeek = {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+};
+
+export function localeFirstDayOfWeek () {
+ return this._week.dow;
+}
+
+export function localeFirstDayOfYear () {
+ return this._week.doy;
+}
+
+// MOMENTS
+
+export function getSetWeek (input) {
+ var week = this.localeData().week(this);
+ return input == null ? week : this.add((input - week) * 7, 'd');
+}
+
+export function getSetISOWeek (input) {
+ var week = weekOfYear(this, 1, 4).week;
+ return input == null ? week : this.add((input - week) * 7, 'd');
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/year.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/year.js
new file mode 100644
index 00000000000..a10e5b4beb3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/units/year.js
@@ -0,0 +1,75 @@
+import { makeGetSet } from '../moment/get-set';
+import { addFormatToken } from '../format/format';
+import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
+import { addRegexToken, match1to2, match1to4, match1to6, match2, match4, match6, matchSigned } from '../parse/regex';
+import { addParseToken } from '../parse/token';
+import { hooks } from '../utils/hooks';
+import { YEAR } from './constants';
+import toInt from '../utils/to-int';
+
+// FORMATTING
+
+addFormatToken('Y', 0, 0, function () {
+ var y = this.year();
+ return y <= 9999 ? '' + y : '+' + y;
+});
+
+addFormatToken(0, ['YY', 2], 0, function () {
+ return this.year() % 100;
+});
+
+addFormatToken(0, ['YYYY', 4], 0, 'year');
+addFormatToken(0, ['YYYYY', 5], 0, 'year');
+addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
+
+// ALIASES
+
+addUnitAlias('year', 'y');
+
+// PRIORITIES
+
+addUnitPriority('year', 1);
+
+// PARSING
+
+addRegexToken('Y', matchSigned);
+addRegexToken('YY', match1to2, match2);
+addRegexToken('YYYY', match1to4, match4);
+addRegexToken('YYYYY', match1to6, match6);
+addRegexToken('YYYYYY', match1to6, match6);
+
+addParseToken(['YYYYY', 'YYYYYY'], YEAR);
+addParseToken('YYYY', function (input, array) {
+ array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
+});
+addParseToken('YY', function (input, array) {
+ array[YEAR] = hooks.parseTwoDigitYear(input);
+});
+addParseToken('Y', function (input, array) {
+ array[YEAR] = parseInt(input, 10);
+});
+
+// HELPERS
+
+export function daysInYear(year) {
+ return isLeapYear(year) ? 366 : 365;
+}
+
+function isLeapYear(year) {
+ return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
+}
+
+// HOOKS
+
+hooks.parseTwoDigitYear = function (input) {
+ return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
+};
+
+// MOMENTS
+
+export var getSetYear = makeGetSet('FullYear', true);
+
+export function getIsLeapYear () {
+ return isLeapYear(this.year());
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/abs-ceil.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/abs-ceil.js
new file mode 100644
index 00000000000..7cf93290c51
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/abs-ceil.js
@@ -0,0 +1,7 @@
+export default function absCeil (number) {
+ if (number < 0) {
+ return Math.floor(number);
+ } else {
+ return Math.ceil(number);
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/abs-floor.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/abs-floor.js
new file mode 100644
index 00000000000..401c7f041f8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/abs-floor.js
@@ -0,0 +1,8 @@
+export default function absFloor (number) {
+ if (number < 0) {
+ // -0 -> 0
+ return Math.ceil(number) || 0;
+ } else {
+ return Math.floor(number);
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/abs-round.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/abs-round.js
new file mode 100644
index 00000000000..98f54bc68fd
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/abs-round.js
@@ -0,0 +1,7 @@
+export default function absRound (number) {
+ if (number < 0) {
+ return Math.round(-1 * number) * -1;
+ } else {
+ return Math.round(number);
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/compare-arrays.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/compare-arrays.js
new file mode 100644
index 00000000000..2eb274befee
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/compare-arrays.js
@@ -0,0 +1,16 @@
+import toInt from './to-int';
+
+// compare two arrays, return the number of differences
+export default function compareArrays(array1, array2, dontConvert) {
+ var len = Math.min(array1.length, array2.length),
+ lengthDiff = Math.abs(array1.length - array2.length),
+ diffs = 0,
+ i;
+ for (i = 0; i < len; i++) {
+ if ((dontConvert && array1[i] !== array2[i]) ||
+ (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
+ diffs++;
+ }
+ }
+ return diffs + lengthDiff;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/defaults.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/defaults.js
new file mode 100644
index 00000000000..45c5e879424
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/defaults.js
@@ -0,0 +1,10 @@
+// Pick the first defined of two or three arguments.
+export default function defaults(a, b, c) {
+ if (a != null) {
+ return a;
+ }
+ if (b != null) {
+ return b;
+ }
+ return c;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/deprecate.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/deprecate.js
new file mode 100644
index 00000000000..8b4c87a2805
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/deprecate.js
@@ -0,0 +1,55 @@
+import extend from './extend';
+import { hooks } from './hooks';
+import isUndefined from './is-undefined';
+
+function warn(msg) {
+ if (hooks.suppressDeprecationWarnings === false &&
+ (typeof console !== 'undefined') && console.warn) {
+ console.warn('Deprecation warning: ' + msg);
+ }
+}
+
+export function deprecate(msg, fn) {
+ var firstTime = true;
+
+ return extend(function () {
+ if (hooks.deprecationHandler != null) {
+ hooks.deprecationHandler(null, msg);
+ }
+ if (firstTime) {
+ var args = [];
+ var arg;
+ for (var i = 0; i < arguments.length; i++) {
+ arg = '';
+ if (typeof arguments[i] === 'object') {
+ arg += '\n[' + i + '] ';
+ for (var key in arguments[0]) {
+ arg += key + ': ' + arguments[0][key] + ', ';
+ }
+ arg = arg.slice(0, -2); // Remove trailing comma and space
+ } else {
+ arg = arguments[i];
+ }
+ args.push(arg);
+ }
+ warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack);
+ firstTime = false;
+ }
+ return fn.apply(this, arguments);
+ }, fn);
+}
+
+var deprecations = {};
+
+export function deprecateSimple(name, msg) {
+ if (hooks.deprecationHandler != null) {
+ hooks.deprecationHandler(name, msg);
+ }
+ if (!deprecations[name]) {
+ warn(msg);
+ deprecations[name] = true;
+ }
+}
+
+hooks.suppressDeprecationWarnings = false;
+hooks.deprecationHandler = null;
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/extend.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/extend.js
new file mode 100644
index 00000000000..ba74a0bf19c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/extend.js
@@ -0,0 +1,19 @@
+import hasOwnProp from './has-own-prop';
+
+export default function extend(a, b) {
+ for (var i in b) {
+ if (hasOwnProp(b, i)) {
+ a[i] = b[i];
+ }
+ }
+
+ if (hasOwnProp(b, 'toString')) {
+ a.toString = b.toString;
+ }
+
+ if (hasOwnProp(b, 'valueOf')) {
+ a.valueOf = b.valueOf;
+ }
+
+ return a;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/has-own-prop.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/has-own-prop.js
new file mode 100644
index 00000000000..4d2403ccb40
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/has-own-prop.js
@@ -0,0 +1,3 @@
+export default function hasOwnProp(a, b) {
+ return Object.prototype.hasOwnProperty.call(a, b);
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/hooks.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/hooks.js
new file mode 100644
index 00000000000..02a5bd3dac2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/hooks.js
@@ -0,0 +1,13 @@
+export { hooks, setHookCallback };
+
+var hookCallback;
+
+function hooks () {
+ return hookCallback.apply(null, arguments);
+}
+
+// This is done to register the method called with moment()
+// without creating circular dependencies.
+function setHookCallback (callback) {
+ hookCallback = callback;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/index-of.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/index-of.js
new file mode 100644
index 00000000000..92298cff31a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/index-of.js
@@ -0,0 +1,18 @@
+var indexOf;
+
+if (Array.prototype.indexOf) {
+ indexOf = Array.prototype.indexOf;
+} else {
+ indexOf = function (o) {
+ // I know
+ var i;
+ for (i = 0; i < this.length; ++i) {
+ if (this[i] === o) {
+ return i;
+ }
+ }
+ return -1;
+ };
+}
+
+export { indexOf as default };
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-array.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-array.js
new file mode 100644
index 00000000000..2d0e0f3da3d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-array.js
@@ -0,0 +1,3 @@
+export default function isArray(input) {
+ return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-date.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-date.js
new file mode 100644
index 00000000000..69c4d0e9c6a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-date.js
@@ -0,0 +1,3 @@
+export default function isDate(input) {
+ return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-function.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-function.js
new file mode 100644
index 00000000000..12304b1bd63
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-function.js
@@ -0,0 +1,3 @@
+export default function isFunction(input) {
+ return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-number.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-number.js
new file mode 100644
index 00000000000..74d6137b7a8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-number.js
@@ -0,0 +1,3 @@
+export default function isNumber(input) {
+ return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-object-empty.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-object-empty.js
new file mode 100644
index 00000000000..1f2d939a579
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-object-empty.js
@@ -0,0 +1,8 @@
+export default function isObjectEmpty(obj) {
+ var k;
+ for (k in obj) {
+ // even if its not own property I'd still call it non-empty
+ return false;
+ }
+ return true;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-object.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-object.js
new file mode 100644
index 00000000000..111353899ac
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-object.js
@@ -0,0 +1,5 @@
+export default function isObject(input) {
+ // IE8 will treat undefined and null as object if it wasn't for
+ // input != null
+ return input != null && Object.prototype.toString.call(input) === '[object Object]';
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-undefined.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-undefined.js
new file mode 100644
index 00000000000..de57a8b2849
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/is-undefined.js
@@ -0,0 +1,3 @@
+export default function isUndefined(input) {
+ return input === void 0;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/keys.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/keys.js
new file mode 100644
index 00000000000..2da4e322882
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/keys.js
@@ -0,0 +1,19 @@
+import hasOwnProp from './has-own-prop';
+
+var keys;
+
+if (Object.keys) {
+ keys = Object.keys;
+} else {
+ keys = function (obj) {
+ var i, res = [];
+ for (i in obj) {
+ if (hasOwnProp(obj, i)) {
+ res.push(i);
+ }
+ }
+ return res;
+ };
+}
+
+export { keys as default };
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/map.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/map.js
new file mode 100644
index 00000000000..1cbc5639f0a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/map.js
@@ -0,0 +1,7 @@
+export default function map(arr, fn) {
+ var res = [], i;
+ for (i = 0; i < arr.length; ++i) {
+ res.push(fn(arr[i], i));
+ }
+ return res;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/some.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/some.js
new file mode 100644
index 00000000000..1bd318675f0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/some.js
@@ -0,0 +1,19 @@
+var some;
+if (Array.prototype.some) {
+ some = Array.prototype.some;
+} else {
+ some = function (fun) {
+ var t = Object(this);
+ var len = t.length >>> 0;
+
+ for (var i = 0; i < len; i++) {
+ if (i in t && fun.call(this, t[i], i, t)) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+}
+
+export { some as default };
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/to-int.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/to-int.js
new file mode 100644
index 00000000000..fb489416f16
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/to-int.js
@@ -0,0 +1,12 @@
+import absFloor from './abs-floor';
+
+export default function toInt(argumentForCoercion) {
+ var coercedNumber = +argumentForCoercion,
+ value = 0;
+
+ if (coercedNumber !== 0 && isFinite(coercedNumber)) {
+ value = absFloor(coercedNumber);
+ }
+
+ return value;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/zero-fill.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/zero-fill.js
new file mode 100644
index 00000000000..7009ec903d3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/lib/utils/zero-fill.js
@@ -0,0 +1,7 @@
+export default function zeroFill(number, targetLength, forceSign) {
+ var absNumber = '' + Math.abs(number),
+ zerosToFill = targetLength - absNumber.length,
+ sign = number >= 0;
+ return (sign ? (forceSign ? '+' : '') : '-') +
+ Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/af.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/af.js
new file mode 100644
index 00000000000..addd8273828
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/af.js
@@ -0,0 +1,63 @@
+//! moment.js locale configuration
+//! locale : Afrikaans [af]
+//! author : Werner Mollentze : https://github.com/wernerm
+
+import moment from '../moment';
+
+export default moment.defineLocale('af', {
+ months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'),
+ monthsShort : 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),
+ weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'),
+ weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),
+ weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),
+ meridiemParse: /vm|nm/i,
+ isPM : function (input) {
+ return /^nm$/i.test(input);
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 12) {
+ return isLower ? 'vm' : 'VM';
+ } else {
+ return isLower ? 'nm' : 'NM';
+ }
+ },
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Vandag om] LT',
+ nextDay : '[Môre om] LT',
+ nextWeek : 'dddd [om] LT',
+ lastDay : '[Gister om] LT',
+ lastWeek : '[Laas] dddd [om] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'oor %s',
+ past : '%s gelede',
+ s : '\'n paar sekondes',
+ m : '\'n minuut',
+ mm : '%d minute',
+ h : '\'n uur',
+ hh : '%d ure',
+ d : '\'n dag',
+ dd : '%d dae',
+ M : '\'n maand',
+ MM : '%d maande',
+ y : '\'n jaar',
+ yy : '%d jaar'
+ },
+ ordinalParse: /\d{1,2}(ste|de)/,
+ ordinal : function (number) {
+ return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter
+ },
+ week : {
+ dow : 1, // Maandag is die eerste dag van die week.
+ doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar-dz.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar-dz.js
new file mode 100644
index 00000000000..d14e0ff830b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar-dz.js
@@ -0,0 +1,50 @@
+//! moment.js locale configuration
+//! locale : Arabic (Algeria) [ar-dz]
+//! author : Noureddine LOUAHEDJ : https://github.com/noureddineme
+
+import moment from '../moment';
+
+export default moment.defineLocale('ar-dz', {
+ months : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ monthsShort : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort : 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin : 'أح_إث_ثلا_أر_خم_جم_سب'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[اليوم على الساعة] LT',
+ nextDay: '[غدا على الساعة] LT',
+ nextWeek: 'dddd [على الساعة] LT',
+ lastDay: '[أمس على الساعة] LT',
+ lastWeek: 'dddd [على الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'في %s',
+ past : 'منذ %s',
+ s : 'ثوان',
+ m : 'دقيقة',
+ mm : '%d دقائق',
+ h : 'ساعة',
+ hh : '%d ساعات',
+ d : 'يوم',
+ dd : '%d أيام',
+ M : 'شهر',
+ MM : '%d أشهر',
+ y : 'سنة',
+ yy : '%d سنوات'
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 4 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar-ly.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar-ly.js
new file mode 100644
index 00000000000..2dcba3f684a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar-ly.js
@@ -0,0 +1,112 @@
+//! moment.js locale configuration
+//! locale : Arabic (Lybia) [ar-ly]
+//! author : Ali Hmer: https://github.com/kikoanis
+
+import moment from '../moment';
+
+var symbolMap = {
+ '1': '1',
+ '2': '2',
+ '3': '3',
+ '4': '4',
+ '5': '5',
+ '6': '6',
+ '7': '7',
+ '8': '8',
+ '9': '9',
+ '0': '0'
+}, pluralForm = function (n) {
+ return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5;
+}, plurals = {
+ s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'],
+ m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'],
+ h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'],
+ d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'],
+ M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'],
+ y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام']
+}, pluralize = function (u) {
+ return function (number, withoutSuffix, string, isFuture) {
+ var f = pluralForm(number),
+ str = plurals[u][pluralForm(number)];
+ if (f === 2) {
+ str = str[withoutSuffix ? 0 : 1];
+ }
+ return str.replace(/%d/i, number);
+ };
+}, months = [
+ 'يناير',
+ 'فبراير',
+ 'مارس',
+ 'أبريل',
+ 'مايو',
+ 'يونيو',
+ 'يوليو',
+ 'أغسطس',
+ 'سبتمبر',
+ 'أكتوبر',
+ 'نوفمبر',
+ 'ديسمبر'
+];
+
+export default moment.defineLocale('ar-ly', {
+ months : months,
+ monthsShort : months,
+ weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'D/\u200FM/\u200FYYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /ص|م/,
+ isPM : function (input) {
+ return 'م' === input;
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'ص';
+ } else {
+ return 'م';
+ }
+ },
+ calendar : {
+ sameDay: '[اليوم عند الساعة] LT',
+ nextDay: '[غدًا عند الساعة] LT',
+ nextWeek: 'dddd [عند الساعة] LT',
+ lastDay: '[أمس عند الساعة] LT',
+ lastWeek: 'dddd [عند الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'بعد %s',
+ past : 'منذ %s',
+ s : pluralize('s'),
+ m : pluralize('m'),
+ mm : pluralize('m'),
+ h : pluralize('h'),
+ hh : pluralize('h'),
+ d : pluralize('d'),
+ dd : pluralize('d'),
+ M : pluralize('M'),
+ MM : pluralize('M'),
+ y : pluralize('y'),
+ yy : pluralize('y')
+ },
+ preparse: function (string) {
+ return string.replace(/\u200f/g, '').replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ }).replace(/,/g, '،');
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar-ma.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar-ma.js
new file mode 100644
index 00000000000..03973d22981
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar-ma.js
@@ -0,0 +1,51 @@
+//! moment.js locale configuration
+//! locale : Arabic (Morocco) [ar-ma]
+//! author : ElFadili Yassine : https://github.com/ElFadiliY
+//! author : Abdel Said : https://github.com/abdelsaid
+
+import moment from '../moment';
+
+export default moment.defineLocale('ar-ma', {
+ months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
+ monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
+ weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[اليوم على الساعة] LT',
+ nextDay: '[غدا على الساعة] LT',
+ nextWeek: 'dddd [على الساعة] LT',
+ lastDay: '[أمس على الساعة] LT',
+ lastWeek: 'dddd [على الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'في %s',
+ past : 'منذ %s',
+ s : 'ثوان',
+ m : 'دقيقة',
+ mm : '%d دقائق',
+ h : 'ساعة',
+ hh : '%d ساعات',
+ d : 'يوم',
+ dd : '%d أيام',
+ M : 'شهر',
+ MM : '%d أشهر',
+ y : 'سنة',
+ yy : '%d سنوات'
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar-sa.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar-sa.js
new file mode 100644
index 00000000000..30a9968d6e3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar-sa.js
@@ -0,0 +1,95 @@
+//! moment.js locale configuration
+//! locale : Arabic (Saudi Arabia) [ar-sa]
+//! author : Suhail Alkowaileet : https://github.com/xsoh
+
+import moment from '../moment';
+
+var symbolMap = {
+ '1': '١',
+ '2': '٢',
+ '3': '٣',
+ '4': '٤',
+ '5': '٥',
+ '6': '٦',
+ '7': '٧',
+ '8': '٨',
+ '9': '٩',
+ '0': '٠'
+}, numberMap = {
+ '١': '1',
+ '٢': '2',
+ '٣': '3',
+ '٤': '4',
+ '٥': '5',
+ '٦': '6',
+ '٧': '7',
+ '٨': '8',
+ '٩': '9',
+ '٠': '0'
+};
+
+export default moment.defineLocale('ar-sa', {
+ months : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ monthsShort : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /ص|م/,
+ isPM : function (input) {
+ return 'م' === input;
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'ص';
+ } else {
+ return 'م';
+ }
+ },
+ calendar : {
+ sameDay: '[اليوم على الساعة] LT',
+ nextDay: '[غدا على الساعة] LT',
+ nextWeek: 'dddd [على الساعة] LT',
+ lastDay: '[أمس على الساعة] LT',
+ lastWeek: 'dddd [على الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'في %s',
+ past : 'منذ %s',
+ s : 'ثوان',
+ m : 'دقيقة',
+ mm : '%d دقائق',
+ h : 'ساعة',
+ hh : '%d ساعات',
+ d : 'يوم',
+ dd : '%d أيام',
+ M : 'شهر',
+ MM : '%d أشهر',
+ y : 'سنة',
+ yy : '%d سنوات'
+ },
+ preparse: function (string) {
+ return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
+ return numberMap[match];
+ }).replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ }).replace(/,/g, '،');
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar-tn.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar-tn.js
new file mode 100644
index 00000000000..8ab8945bddf
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar-tn.js
@@ -0,0 +1,50 @@
+//! moment.js locale configuration
+//! locale : Arabic (Tunisia) [ar-tn]
+//! author : Nader Toukabri : https://github.com/naderio
+
+import moment from '../moment';
+
+export default moment.defineLocale('ar-tn', {
+ months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY HH:mm',
+ LLLL: 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar: {
+ sameDay: '[اليوم على الساعة] LT',
+ nextDay: '[غدا على الساعة] LT',
+ nextWeek: 'dddd [على الساعة] LT',
+ lastDay: '[أمس على الساعة] LT',
+ lastWeek: 'dddd [على الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: 'في %s',
+ past: 'منذ %s',
+ s: 'ثوان',
+ m: 'دقيقة',
+ mm: '%d دقائق',
+ h: 'ساعة',
+ hh: '%d ساعات',
+ d: 'يوم',
+ dd: '%d أيام',
+ M: 'شهر',
+ MM: '%d أشهر',
+ y: 'سنة',
+ yy: '%d سنوات'
+ },
+ week: {
+ dow: 1, // Monday is the first day of the week.
+ doy: 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar.js
new file mode 100644
index 00000000000..619843ae560
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ar.js
@@ -0,0 +1,128 @@
+//! moment.js locale configuration
+//! locale : Arabic [ar]
+//! author : Abdel Said: https://github.com/abdelsaid
+//! author : Ahmed Elkhatib
+//! author : forabi https://github.com/forabi
+
+import moment from '../moment';
+
+var symbolMap = {
+ '1': '١',
+ '2': '٢',
+ '3': '٣',
+ '4': '٤',
+ '5': '٥',
+ '6': '٦',
+ '7': '٧',
+ '8': '٨',
+ '9': '٩',
+ '0': '٠'
+}, numberMap = {
+ '١': '1',
+ '٢': '2',
+ '٣': '3',
+ '٤': '4',
+ '٥': '5',
+ '٦': '6',
+ '٧': '7',
+ '٨': '8',
+ '٩': '9',
+ '٠': '0'
+}, pluralForm = function (n) {
+ return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5;
+}, plurals = {
+ s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'],
+ m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'],
+ h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'],
+ d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'],
+ M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'],
+ y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام']
+}, pluralize = function (u) {
+ return function (number, withoutSuffix, string, isFuture) {
+ var f = pluralForm(number),
+ str = plurals[u][pluralForm(number)];
+ if (f === 2) {
+ str = str[withoutSuffix ? 0 : 1];
+ }
+ return str.replace(/%d/i, number);
+ };
+}, months = [
+ 'كانون الثاني يناير',
+ 'شباط فبراير',
+ 'آذار مارس',
+ 'نيسان أبريل',
+ 'أيار مايو',
+ 'حزيران يونيو',
+ 'تموز يوليو',
+ 'آب أغسطس',
+ 'أيلول سبتمبر',
+ 'تشرين الأول أكتوبر',
+ 'تشرين الثاني نوفمبر',
+ 'كانون الأول ديسمبر'
+];
+
+export default moment.defineLocale('ar', {
+ months : months,
+ monthsShort : months,
+ weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'D/\u200FM/\u200FYYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /ص|م/,
+ isPM : function (input) {
+ return 'م' === input;
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'ص';
+ } else {
+ return 'م';
+ }
+ },
+ calendar : {
+ sameDay: '[اليوم عند الساعة] LT',
+ nextDay: '[غدًا عند الساعة] LT',
+ nextWeek: 'dddd [عند الساعة] LT',
+ lastDay: '[أمس عند الساعة] LT',
+ lastWeek: 'dddd [عند الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'بعد %s',
+ past : 'منذ %s',
+ s : pluralize('s'),
+ m : pluralize('m'),
+ mm : pluralize('m'),
+ h : pluralize('h'),
+ hh : pluralize('h'),
+ d : pluralize('d'),
+ dd : pluralize('d'),
+ M : pluralize('M'),
+ MM : pluralize('M'),
+ y : pluralize('y'),
+ yy : pluralize('y')
+ },
+ preparse: function (string) {
+ return string.replace(/\u200f/g, '').replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
+ return numberMap[match];
+ }).replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ }).replace(/,/g, '،');
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/az.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/az.js
new file mode 100644
index 00000000000..f9b368b816b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/az.js
@@ -0,0 +1,96 @@
+//! moment.js locale configuration
+//! locale : Azerbaijani [az]
+//! author : topchiyev : https://github.com/topchiyev
+
+import moment from '../moment';
+
+var suffixes = {
+ 1: '-inci',
+ 5: '-inci',
+ 8: '-inci',
+ 70: '-inci',
+ 80: '-inci',
+ 2: '-nci',
+ 7: '-nci',
+ 20: '-nci',
+ 50: '-nci',
+ 3: '-üncü',
+ 4: '-üncü',
+ 100: '-üncü',
+ 6: '-ncı',
+ 9: '-uncu',
+ 10: '-uncu',
+ 30: '-uncu',
+ 60: '-ıncı',
+ 90: '-ıncı'
+};
+
+export default moment.defineLocale('az', {
+ months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'),
+ monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),
+ weekdays : 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'),
+ weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'),
+ weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[bugün saat] LT',
+ nextDay : '[sabah saat] LT',
+ nextWeek : '[gələn həftə] dddd [saat] LT',
+ lastDay : '[dünən] LT',
+ lastWeek : '[keçən həftə] dddd [saat] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s sonra',
+ past : '%s əvvəl',
+ s : 'birneçə saniyyə',
+ m : 'bir dəqiqə',
+ mm : '%d dəqiqə',
+ h : 'bir saat',
+ hh : '%d saat',
+ d : 'bir gün',
+ dd : '%d gün',
+ M : 'bir ay',
+ MM : '%d ay',
+ y : 'bir il',
+ yy : '%d il'
+ },
+ meridiemParse: /gecə|səhər|gündüz|axşam/,
+ isPM : function (input) {
+ return /^(gündüz|axşam)$/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'gecə';
+ } else if (hour < 12) {
+ return 'səhər';
+ } else if (hour < 17) {
+ return 'gündüz';
+ } else {
+ return 'axşam';
+ }
+ },
+ ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,
+ ordinal : function (number) {
+ if (number === 0) { // special case for zero
+ return number + '-ıncı';
+ }
+ var a = number % 10,
+ b = number % 100 - a,
+ c = number >= 100 ? 100 : null;
+ return number + (suffixes[a] || suffixes[b] || suffixes[c]);
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/be.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/be.js
new file mode 100644
index 00000000000..c22c6e1e69c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/be.js
@@ -0,0 +1,125 @@
+//! moment.js locale configuration
+//! locale : Belarusian [be]
+//! author : Dmitry Demidov : https://github.com/demidov91
+//! author: Praleska: http://praleska.pro/
+//! Author : Menelion Elensúle : https://github.com/Oire
+
+import moment from '../moment';
+
+function plural(word, num) {
+ var forms = word.split('_');
+ return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+}
+function relativeTimeWithPlural(number, withoutSuffix, key) {
+ var format = {
+ 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',
+ 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін',
+ 'dd': 'дзень_дні_дзён',
+ 'MM': 'месяц_месяцы_месяцаў',
+ 'yy': 'год_гады_гадоў'
+ };
+ if (key === 'm') {
+ return withoutSuffix ? 'хвіліна' : 'хвіліну';
+ }
+ else if (key === 'h') {
+ return withoutSuffix ? 'гадзіна' : 'гадзіну';
+ }
+ else {
+ return number + ' ' + plural(format[key], +number);
+ }
+}
+
+export default moment.defineLocale('be', {
+ months : {
+ format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_'),
+ standalone: 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_')
+ },
+ monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),
+ weekdays : {
+ format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_'),
+ standalone: 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'),
+ isFormat: /\[ ?[Вв] ?(?:мінулую|наступную)? ?\] ?dddd/
+ },
+ weekdaysShort : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
+ weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY г.',
+ LLL : 'D MMMM YYYY г., HH:mm',
+ LLLL : 'dddd, D MMMM YYYY г., HH:mm'
+ },
+ calendar : {
+ sameDay: '[Сёння ў] LT',
+ nextDay: '[Заўтра ў] LT',
+ lastDay: '[Учора ў] LT',
+ nextWeek: function () {
+ return '[У] dddd [ў] LT';
+ },
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ case 5:
+ case 6:
+ return '[У мінулую] dddd [ў] LT';
+ case 1:
+ case 2:
+ case 4:
+ return '[У мінулы] dddd [ў] LT';
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'праз %s',
+ past : '%s таму',
+ s : 'некалькі секунд',
+ m : relativeTimeWithPlural,
+ mm : relativeTimeWithPlural,
+ h : relativeTimeWithPlural,
+ hh : relativeTimeWithPlural,
+ d : 'дзень',
+ dd : relativeTimeWithPlural,
+ M : 'месяц',
+ MM : relativeTimeWithPlural,
+ y : 'год',
+ yy : relativeTimeWithPlural
+ },
+ meridiemParse: /ночы|раніцы|дня|вечара/,
+ isPM : function (input) {
+ return /^(дня|вечара)$/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'ночы';
+ } else if (hour < 12) {
+ return 'раніцы';
+ } else if (hour < 17) {
+ return 'дня';
+ } else {
+ return 'вечара';
+ }
+ },
+ ordinalParse: /\d{1,2}-(і|ы|га)/,
+ ordinal: function (number, period) {
+ switch (period) {
+ case 'M':
+ case 'd':
+ case 'DDD':
+ case 'w':
+ case 'W':
+ return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы';
+ case 'D':
+ return number + '-га';
+ default:
+ return number;
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/bg.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/bg.js
new file mode 100644
index 00000000000..0c4597ed5a9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/bg.js
@@ -0,0 +1,81 @@
+//! moment.js locale configuration
+//! locale : Bulgarian [bg]
+//! author : Krasen Borisov : https://github.com/kraz
+
+import moment from '../moment';
+
+export default moment.defineLocale('bg', {
+ months : 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'),
+ monthsShort : 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),
+ weekdays : 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'),
+ weekdaysShort : 'нед_пон_вто_сря_чет_пет_съб'.split('_'),
+ weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'D.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY H:mm',
+ LLLL : 'dddd, D MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[Днес в] LT',
+ nextDay : '[Утре в] LT',
+ nextWeek : 'dddd [в] LT',
+ lastDay : '[Вчера в] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ case 6:
+ return '[В изминалата] dddd [в] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[В изминалия] dddd [в] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'след %s',
+ past : 'преди %s',
+ s : 'няколко секунди',
+ m : 'минута',
+ mm : '%d минути',
+ h : 'час',
+ hh : '%d часа',
+ d : 'ден',
+ dd : '%d дни',
+ M : 'месец',
+ MM : '%d месеца',
+ y : 'година',
+ yy : '%d години'
+ },
+ ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
+ ordinal : function (number) {
+ var lastDigit = number % 10,
+ last2Digits = number % 100;
+ if (number === 0) {
+ return number + '-ев';
+ } else if (last2Digits === 0) {
+ return number + '-ен';
+ } else if (last2Digits > 10 && last2Digits < 20) {
+ return number + '-ти';
+ } else if (lastDigit === 1) {
+ return number + '-ви';
+ } else if (lastDigit === 2) {
+ return number + '-ри';
+ } else if (lastDigit === 7 || lastDigit === 8) {
+ return number + '-ми';
+ } else {
+ return number + '-ти';
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/bn.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/bn.js
new file mode 100644
index 00000000000..359a376dc7a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/bn.js
@@ -0,0 +1,109 @@
+//! moment.js locale configuration
+//! locale : Bengali [bn]
+//! author : Kaushik Gandhi : https://github.com/kaushikgandhi
+
+import moment from '../moment';
+
+var symbolMap = {
+ '1': '১',
+ '2': '২',
+ '3': '৩',
+ '4': '৪',
+ '5': '৫',
+ '6': '৬',
+ '7': '৭',
+ '8': '৮',
+ '9': '৯',
+ '0': '০'
+},
+numberMap = {
+ '১': '1',
+ '২': '2',
+ '৩': '3',
+ '৪': '4',
+ '৫': '5',
+ '৬': '6',
+ '৭': '7',
+ '৮': '8',
+ '৯': '9',
+ '০': '0'
+};
+
+export default moment.defineLocale('bn', {
+ months : 'জানুয়ারী_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'),
+ monthsShort : 'জানু_ফেব_মার্চ_এপ্র_মে_জুন_জুল_আগ_সেপ্ট_অক্টো_নভে_ডিসে'.split('_'),
+ weekdays : 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split('_'),
+ weekdaysShort : 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),
+ weekdaysMin : 'রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm সময়',
+ LTS : 'A h:mm:ss সময়',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm সময়',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm সময়'
+ },
+ calendar : {
+ sameDay : '[আজ] LT',
+ nextDay : '[আগামীকাল] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[গতকাল] LT',
+ lastWeek : '[গত] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s পরে',
+ past : '%s আগে',
+ s : 'কয়েক সেকেন্ড',
+ m : 'এক মিনিট',
+ mm : '%d মিনিট',
+ h : 'এক ঘন্টা',
+ hh : '%d ঘন্টা',
+ d : 'এক দিন',
+ dd : '%d দিন',
+ M : 'এক মাস',
+ MM : '%d মাস',
+ y : 'এক বছর',
+ yy : '%d বছর'
+ },
+ preparse: function (string) {
+ return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if ((meridiem === 'রাত' && hour >= 4) ||
+ (meridiem === 'দুপুর' && hour < 5) ||
+ meridiem === 'বিকাল') {
+ return hour + 12;
+ } else {
+ return hour;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'রাত';
+ } else if (hour < 10) {
+ return 'সকাল';
+ } else if (hour < 17) {
+ return 'দুপুর';
+ } else if (hour < 20) {
+ return 'বিকাল';
+ } else {
+ return 'রাত';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/bo.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/bo.js
new file mode 100644
index 00000000000..5d15d84480d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/bo.js
@@ -0,0 +1,110 @@
+//! moment.js locale configuration
+//! locale : Tibetan [bo]
+//! author : Thupten N. Chakrishar : https://github.com/vajradog
+
+import moment from '../moment';
+
+var symbolMap = {
+ '1': '༡',
+ '2': '༢',
+ '3': '༣',
+ '4': '༤',
+ '5': '༥',
+ '6': '༦',
+ '7': '༧',
+ '8': '༨',
+ '9': '༩',
+ '0': '༠'
+},
+numberMap = {
+ '༡': '1',
+ '༢': '2',
+ '༣': '3',
+ '༤': '4',
+ '༥': '5',
+ '༦': '6',
+ '༧': '7',
+ '༨': '8',
+ '༩': '9',
+ '༠': '0'
+};
+
+export default moment.defineLocale('bo', {
+ months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
+ monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
+ weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'),
+ weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
+ weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm',
+ LTS : 'A h:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm'
+ },
+ calendar : {
+ sameDay : '[དི་རིང] LT',
+ nextDay : '[སང་ཉིན] LT',
+ nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT',
+ lastDay : '[ཁ་སང] LT',
+ lastWeek : '[བདུན་ཕྲག་མཐའ་མ] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s ལ་',
+ past : '%s སྔན་ལ',
+ s : 'ལམ་སང',
+ m : 'སྐར་མ་གཅིག',
+ mm : '%d སྐར་མ',
+ h : 'ཆུ་ཚོད་གཅིག',
+ hh : '%d ཆུ་ཚོད',
+ d : 'ཉིན་གཅིག',
+ dd : '%d ཉིན་',
+ M : 'ཟླ་བ་གཅིག',
+ MM : '%d ཟླ་བ',
+ y : 'ལོ་གཅིག',
+ yy : '%d ལོ'
+ },
+ preparse: function (string) {
+ return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if ((meridiem === 'མཚན་མོ' && hour >= 4) ||
+ (meridiem === 'ཉིན་གུང' && hour < 5) ||
+ meridiem === 'དགོང་དག') {
+ return hour + 12;
+ } else {
+ return hour;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'མཚན་མོ';
+ } else if (hour < 10) {
+ return 'ཞོགས་ཀས';
+ } else if (hour < 17) {
+ return 'ཉིན་གུང';
+ } else if (hour < 20) {
+ return 'དགོང་དག';
+ } else {
+ return 'མཚན་མོ';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/br.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/br.js
new file mode 100644
index 00000000000..86c580d4748
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/br.js
@@ -0,0 +1,99 @@
+//! moment.js locale configuration
+//! locale : Breton [br]
+//! author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
+
+import moment from '../moment';
+
+function relativeTimeWithMutation(number, withoutSuffix, key) {
+ var format = {
+ 'mm': 'munutenn',
+ 'MM': 'miz',
+ 'dd': 'devezh'
+ };
+ return number + ' ' + mutation(format[key], number);
+}
+function specialMutationForYears(number) {
+ switch (lastNumber(number)) {
+ case 1:
+ case 3:
+ case 4:
+ case 5:
+ case 9:
+ return number + ' bloaz';
+ default:
+ return number + ' vloaz';
+ }
+}
+function lastNumber(number) {
+ if (number > 9) {
+ return lastNumber(number % 10);
+ }
+ return number;
+}
+function mutation(text, number) {
+ if (number === 2) {
+ return softMutation(text);
+ }
+ return text;
+}
+function softMutation(text) {
+ var mutationTable = {
+ 'm': 'v',
+ 'b': 'v',
+ 'd': 'z'
+ };
+ if (mutationTable[text.charAt(0)] === undefined) {
+ return text;
+ }
+ return mutationTable[text.charAt(0)] + text.substring(1);
+}
+
+export default moment.defineLocale('br', {
+ months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'),
+ monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),
+ weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'),
+ weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),
+ weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'h[e]mm A',
+ LTS : 'h[e]mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D [a viz] MMMM YYYY',
+ LLL : 'D [a viz] MMMM YYYY h[e]mm A',
+ LLLL : 'dddd, D [a viz] MMMM YYYY h[e]mm A'
+ },
+ calendar : {
+ sameDay : '[Hiziv da] LT',
+ nextDay : '[Warc\'hoazh da] LT',
+ nextWeek : 'dddd [da] LT',
+ lastDay : '[Dec\'h da] LT',
+ lastWeek : 'dddd [paset da] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'a-benn %s',
+ past : '%s \'zo',
+ s : 'un nebeud segondennoù',
+ m : 'ur vunutenn',
+ mm : relativeTimeWithMutation,
+ h : 'un eur',
+ hh : '%d eur',
+ d : 'un devezh',
+ dd : relativeTimeWithMutation,
+ M : 'ur miz',
+ MM : relativeTimeWithMutation,
+ y : 'ur bloaz',
+ yy : specialMutationForYears
+ },
+ ordinalParse: /\d{1,2}(añ|vet)/,
+ ordinal : function (number) {
+ var output = (number === 1) ? 'añ' : 'vet';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/bs.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/bs.js
new file mode 100644
index 00000000000..90cb0b96c60
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/bs.js
@@ -0,0 +1,133 @@
+//! moment.js locale configuration
+//! locale : Bosnian [bs]
+//! author : Nedim Cholich : https://github.com/frontyard
+//! based on (hr) translation by Bojan Marković
+
+import moment from '../moment';
+
+function translate(number, withoutSuffix, key) {
+ var result = number + ' ';
+ switch (key) {
+ case 'm':
+ return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+ case 'mm':
+ if (number === 1) {
+ result += 'minuta';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'minute';
+ } else {
+ result += 'minuta';
+ }
+ return result;
+ case 'h':
+ return withoutSuffix ? 'jedan sat' : 'jednog sata';
+ case 'hh':
+ if (number === 1) {
+ result += 'sat';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'sata';
+ } else {
+ result += 'sati';
+ }
+ return result;
+ case 'dd':
+ if (number === 1) {
+ result += 'dan';
+ } else {
+ result += 'dana';
+ }
+ return result;
+ case 'MM':
+ if (number === 1) {
+ result += 'mjesec';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'mjeseca';
+ } else {
+ result += 'mjeseci';
+ }
+ return result;
+ case 'yy':
+ if (number === 1) {
+ result += 'godina';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'godine';
+ } else {
+ result += 'godina';
+ }
+ return result;
+ }
+}
+
+export default moment.defineLocale('bs', {
+ months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'),
+ monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
+ weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
+ weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[danas u] LT',
+ nextDay : '[sutra u] LT',
+ nextWeek : function () {
+ switch (this.day()) {
+ case 0:
+ return '[u] [nedjelju] [u] LT';
+ case 3:
+ return '[u] [srijedu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ },
+ lastDay : '[jučer u] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ return '[prošlu] dddd [u] LT';
+ case 6:
+ return '[prošle] [subote] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[prošli] dddd [u] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'prije %s',
+ s : 'par sekundi',
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : 'dan',
+ dd : translate,
+ M : 'mjesec',
+ MM : translate,
+ y : 'godinu',
+ yy : translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ca.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ca.js
new file mode 100644
index 00000000000..17f50b5d848
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ca.js
@@ -0,0 +1,72 @@
+//! moment.js locale configuration
+//! locale : Catalan [ca]
+//! author : Juan G. Hurtado : https://github.com/juanghurtado
+
+import moment from '../moment';
+
+export default moment.defineLocale('ca', {
+ months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'),
+ monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'),
+ weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),
+ weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY H:mm',
+ LLLL : 'dddd D MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : function () {
+ return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ nextDay : function () {
+ return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ lastDay : function () {
+ return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ lastWeek : function () {
+ return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'd\'aquí %s',
+ past : 'fa %s',
+ s : 'uns segons',
+ m : 'un minut',
+ mm : '%d minuts',
+ h : 'una hora',
+ hh : '%d hores',
+ d : 'un dia',
+ dd : '%d dies',
+ M : 'un mes',
+ MM : '%d mesos',
+ y : 'un any',
+ yy : '%d anys'
+ },
+ ordinalParse: /\d{1,2}(r|n|t|è|a)/,
+ ordinal : function (number, period) {
+ var output = (number === 1) ? 'r' :
+ (number === 2) ? 'n' :
+ (number === 3) ? 'r' :
+ (number === 4) ? 't' : 'è';
+ if (period === 'w' || period === 'W') {
+ output = 'a';
+ }
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/cs.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/cs.js
new file mode 100644
index 00000000000..621b8031c3d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/cs.js
@@ -0,0 +1,163 @@
+//! moment.js locale configuration
+//! locale : Czech [cs]
+//! author : petrbela : https://github.com/petrbela
+
+import moment from '../moment';
+
+var months = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'),
+ monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_');
+function plural(n) {
+ return (n > 1) && (n < 5) && (~~(n / 10) !== 1);
+}
+function translate(number, withoutSuffix, key, isFuture) {
+ var result = number + ' ';
+ switch (key) {
+ case 's': // a few seconds / in a few seconds / a few seconds ago
+ return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami';
+ case 'm': // a minute / in a minute / a minute ago
+ return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');
+ case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'minuty' : 'minut');
+ } else {
+ return result + 'minutami';
+ }
+ break;
+ case 'h': // an hour / in an hour / an hour ago
+ return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+ case 'hh': // 9 hours / in 9 hours / 9 hours ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'hodiny' : 'hodin');
+ } else {
+ return result + 'hodinami';
+ }
+ break;
+ case 'd': // a day / in a day / a day ago
+ return (withoutSuffix || isFuture) ? 'den' : 'dnem';
+ case 'dd': // 9 days / in 9 days / 9 days ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'dny' : 'dní');
+ } else {
+ return result + 'dny';
+ }
+ break;
+ case 'M': // a month / in a month / a month ago
+ return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';
+ case 'MM': // 9 months / in 9 months / 9 months ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'měsíce' : 'měsíců');
+ } else {
+ return result + 'měsíci';
+ }
+ break;
+ case 'y': // a year / in a year / a year ago
+ return (withoutSuffix || isFuture) ? 'rok' : 'rokem';
+ case 'yy': // 9 years / in 9 years / 9 years ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'roky' : 'let');
+ } else {
+ return result + 'lety';
+ }
+ break;
+ }
+}
+
+export default moment.defineLocale('cs', {
+ months : months,
+ monthsShort : monthsShort,
+ monthsParse : (function (months, monthsShort) {
+ var i, _monthsParse = [];
+ for (i = 0; i < 12; i++) {
+ // use custom parser to solve problem with July (červenec)
+ _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
+ }
+ return _monthsParse;
+ }(months, monthsShort)),
+ shortMonthsParse : (function (monthsShort) {
+ var i, _shortMonthsParse = [];
+ for (i = 0; i < 12; i++) {
+ _shortMonthsParse[i] = new RegExp('^' + monthsShort[i] + '$', 'i');
+ }
+ return _shortMonthsParse;
+ }(monthsShort)),
+ longMonthsParse : (function (months) {
+ var i, _longMonthsParse = [];
+ for (i = 0; i < 12; i++) {
+ _longMonthsParse[i] = new RegExp('^' + months[i] + '$', 'i');
+ }
+ return _longMonthsParse;
+ }(months)),
+ weekdays : 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),
+ weekdaysShort : 'ne_po_út_st_čt_pá_so'.split('_'),
+ weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'),
+ longDateFormat : {
+ LT: 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd D. MMMM YYYY H:mm',
+ l : 'D. M. YYYY'
+ },
+ calendar : {
+ sameDay: '[dnes v] LT',
+ nextDay: '[zítra v] LT',
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[v neděli v] LT';
+ case 1:
+ case 2:
+ return '[v] dddd [v] LT';
+ case 3:
+ return '[ve středu v] LT';
+ case 4:
+ return '[ve čtvrtek v] LT';
+ case 5:
+ return '[v pátek v] LT';
+ case 6:
+ return '[v sobotu v] LT';
+ }
+ },
+ lastDay: '[včera v] LT',
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[minulou neděli v] LT';
+ case 1:
+ case 2:
+ return '[minulé] dddd [v] LT';
+ case 3:
+ return '[minulou středu v] LT';
+ case 4:
+ case 5:
+ return '[minulý] dddd [v] LT';
+ case 6:
+ return '[minulou sobotu v] LT';
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'před %s',
+ s : translate,
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : translate,
+ dd : translate,
+ M : translate,
+ MM : translate,
+ y : translate,
+ yy : translate
+ },
+ ordinalParse : /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/cv.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/cv.js
new file mode 100644
index 00000000000..1884d2dbf2a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/cv.js
@@ -0,0 +1,53 @@
+//! moment.js locale configuration
+//! locale : Chuvash [cv]
+//! author : Anatoly Mironov : https://github.com/mirontoli
+
+import moment from '../moment';
+
+export default moment.defineLocale('cv', {
+ months : 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'),
+ monthsShort : 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'),
+ weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'),
+ weekdaysShort : 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'),
+ weekdaysMin : 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD-MM-YYYY',
+ LL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]',
+ LLL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',
+ LLLL : 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm'
+ },
+ calendar : {
+ sameDay: '[Паян] LT [сехетре]',
+ nextDay: '[Ыран] LT [сехетре]',
+ lastDay: '[Ӗнер] LT [сехетре]',
+ nextWeek: '[Ҫитес] dddd LT [сехетре]',
+ lastWeek: '[Иртнӗ] dddd LT [сехетре]',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : function (output) {
+ var affix = /сехет$/i.exec(output) ? 'рен' : /ҫул$/i.exec(output) ? 'тан' : 'ран';
+ return output + affix;
+ },
+ past : '%s каялла',
+ s : 'пӗр-ик ҫеккунт',
+ m : 'пӗр минут',
+ mm : '%d минут',
+ h : 'пӗр сехет',
+ hh : '%d сехет',
+ d : 'пӗр кун',
+ dd : '%d кун',
+ M : 'пӗр уйӑх',
+ MM : '%d уйӑх',
+ y : 'пӗр ҫул',
+ yy : '%d ҫул'
+ },
+ ordinalParse: /\d{1,2}-мӗш/,
+ ordinal : '%d-мӗш',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/cy.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/cy.js
new file mode 100644
index 00000000000..972b7009925
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/cy.js
@@ -0,0 +1,72 @@
+//! moment.js locale configuration
+//! locale : Welsh [cy]
+//! author : Robert Allen : https://github.com/robgallen
+//! author : https://github.com/ryangreaves
+
+import moment from '../moment';
+
+export default moment.defineLocale('cy', {
+ months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'),
+ monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'),
+ weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'),
+ weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),
+ weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),
+ weekdaysParseExact : true,
+ // time formats are the same as en-gb
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY HH:mm',
+ LLLL: 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar: {
+ sameDay: '[Heddiw am] LT',
+ nextDay: '[Yfory am] LT',
+ nextWeek: 'dddd [am] LT',
+ lastDay: '[Ddoe am] LT',
+ lastWeek: 'dddd [diwethaf am] LT',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: 'mewn %s',
+ past: '%s yn ôl',
+ s: 'ychydig eiliadau',
+ m: 'munud',
+ mm: '%d munud',
+ h: 'awr',
+ hh: '%d awr',
+ d: 'diwrnod',
+ dd: '%d diwrnod',
+ M: 'mis',
+ MM: '%d mis',
+ y: 'blwyddyn',
+ yy: '%d flynedd'
+ },
+ ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,
+ // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
+ ordinal: function (number) {
+ var b = number,
+ output = '',
+ lookup = [
+ '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed
+ 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed
+ ];
+ if (b > 20) {
+ if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
+ output = 'fed'; // not 30ain, 70ain or 90ain
+ } else {
+ output = 'ain';
+ }
+ } else if (b > 0) {
+ output = lookup[b];
+ }
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/da.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/da.js
new file mode 100644
index 00000000000..da2316cadca
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/da.js
@@ -0,0 +1,51 @@
+//! moment.js locale configuration
+//! locale : Danish [da]
+//! author : Ulrik Nielsen : https://github.com/mrbase
+
+import moment from '../moment';
+
+export default moment.defineLocale('da', {
+ months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
+ weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
+ weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'),
+ weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY HH:mm',
+ LLLL : 'dddd [d.] D. MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[I dag kl.] LT',
+ nextDay : '[I morgen kl.] LT',
+ nextWeek : 'dddd [kl.] LT',
+ lastDay : '[I går kl.] LT',
+ lastWeek : '[sidste] dddd [kl] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'om %s',
+ past : '%s siden',
+ s : 'få sekunder',
+ m : 'et minut',
+ mm : '%d minutter',
+ h : 'en time',
+ hh : '%d timer',
+ d : 'en dag',
+ dd : '%d dage',
+ M : 'en måned',
+ MM : '%d måneder',
+ y : 'et år',
+ yy : '%d år'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/de-at.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/de-at.js
new file mode 100644
index 00000000000..4e59f687258
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/de-at.js
@@ -0,0 +1,69 @@
+//! moment.js locale configuration
+//! locale : German (Austria) [de-at]
+//! author : lluchs : https://github.com/lluchs
+//! author: Menelion Elensúle: https://github.com/Oire
+//! author : Martin Groller : https://github.com/MadMG
+//! author : Mikolaj Dadela : https://github.com/mik01aj
+
+import moment from '../moment';
+
+function processRelativeTime(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 'm': ['eine Minute', 'einer Minute'],
+ 'h': ['eine Stunde', 'einer Stunde'],
+ 'd': ['ein Tag', 'einem Tag'],
+ 'dd': [number + ' Tage', number + ' Tagen'],
+ 'M': ['ein Monat', 'einem Monat'],
+ 'MM': [number + ' Monate', number + ' Monaten'],
+ 'y': ['ein Jahr', 'einem Jahr'],
+ 'yy': [number + ' Jahre', number + ' Jahren']
+ };
+ return withoutSuffix ? format[key][0] : format[key][1];
+}
+
+export default moment.defineLocale('de-at', {
+ months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
+ monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
+ weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
+ weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY HH:mm',
+ LLLL : 'dddd, D. MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[heute um] LT [Uhr]',
+ sameElse: 'L',
+ nextDay: '[morgen um] LT [Uhr]',
+ nextWeek: 'dddd [um] LT [Uhr]',
+ lastDay: '[gestern um] LT [Uhr]',
+ lastWeek: '[letzten] dddd [um] LT [Uhr]'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : 'vor %s',
+ s : 'ein paar Sekunden',
+ m : processRelativeTime,
+ mm : '%d Minuten',
+ h : processRelativeTime,
+ hh : '%d Stunden',
+ d : processRelativeTime,
+ dd : processRelativeTime,
+ M : processRelativeTime,
+ MM : processRelativeTime,
+ y : processRelativeTime,
+ yy : processRelativeTime
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/de.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/de.js
new file mode 100644
index 00000000000..1839b5955c3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/de.js
@@ -0,0 +1,68 @@
+//! moment.js locale configuration
+//! locale : German [de]
+//! author : lluchs : https://github.com/lluchs
+//! author: Menelion Elensúle: https://github.com/Oire
+//! author : Mikolaj Dadela : https://github.com/mik01aj
+
+import moment from '../moment';
+
+function processRelativeTime(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 'm': ['eine Minute', 'einer Minute'],
+ 'h': ['eine Stunde', 'einer Stunde'],
+ 'd': ['ein Tag', 'einem Tag'],
+ 'dd': [number + ' Tage', number + ' Tagen'],
+ 'M': ['ein Monat', 'einem Monat'],
+ 'MM': [number + ' Monate', number + ' Monaten'],
+ 'y': ['ein Jahr', 'einem Jahr'],
+ 'yy': [number + ' Jahre', number + ' Jahren']
+ };
+ return withoutSuffix ? format[key][0] : format[key][1];
+}
+
+export default moment.defineLocale('de', {
+ months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
+ monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
+ weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
+ weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY HH:mm',
+ LLLL : 'dddd, D. MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[heute um] LT [Uhr]',
+ sameElse: 'L',
+ nextDay: '[morgen um] LT [Uhr]',
+ nextWeek: 'dddd [um] LT [Uhr]',
+ lastDay: '[gestern um] LT [Uhr]',
+ lastWeek: '[letzten] dddd [um] LT [Uhr]'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : 'vor %s',
+ s : 'ein paar Sekunden',
+ m : processRelativeTime,
+ mm : '%d Minuten',
+ h : processRelativeTime,
+ hh : '%d Stunden',
+ d : processRelativeTime,
+ dd : processRelativeTime,
+ M : processRelativeTime,
+ MM : processRelativeTime,
+ y : processRelativeTime,
+ yy : processRelativeTime
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/dv.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/dv.js
new file mode 100644
index 00000000000..9490e3feae7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/dv.js
@@ -0,0 +1,89 @@
+//! moment.js locale configuration
+//! locale : Maldivian [dv]
+//! author : Jawish Hameed : https://github.com/jawish
+
+import moment from '../moment';
+
+var months = [
+ 'ޖެނުއަރީ',
+ 'ފެބްރުއަރީ',
+ 'މާރިޗު',
+ 'އޭޕްރީލު',
+ 'މޭ',
+ 'ޖޫން',
+ 'ޖުލައި',
+ 'އޯގަސްޓު',
+ 'ސެޕްޓެމްބަރު',
+ 'އޮކްޓޯބަރު',
+ 'ނޮވެމްބަރު',
+ 'ޑިސެމްބަރު'
+], weekdays = [
+ 'އާދިއްތަ',
+ 'ހޯމަ',
+ 'އަންގާރަ',
+ 'ބުދަ',
+ 'ބުރާސްފަތި',
+ 'ހުކުރު',
+ 'ހޮނިހިރު'
+];
+
+export default moment.defineLocale('dv', {
+ months : months,
+ monthsShort : months,
+ weekdays : weekdays,
+ weekdaysShort : weekdays,
+ weekdaysMin : 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'),
+ longDateFormat : {
+
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'D/M/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /މކ|މފ/,
+ isPM : function (input) {
+ return 'މފ' === input;
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'މކ';
+ } else {
+ return 'މފ';
+ }
+ },
+ calendar : {
+ sameDay : '[މިއަދު] LT',
+ nextDay : '[މާދަމާ] LT',
+ nextWeek : 'dddd LT',
+ lastDay : '[އިއްޔެ] LT',
+ lastWeek : '[ފާއިތުވި] dddd LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'ތެރޭގައި %s',
+ past : 'ކުރިން %s',
+ s : 'ސިކުންތުކޮޅެއް',
+ m : 'މިނިޓެއް',
+ mm : 'މިނިޓު %d',
+ h : 'ގަޑިއިރެއް',
+ hh : 'ގަޑިއިރު %d',
+ d : 'ދުވަހެއް',
+ dd : 'ދުވަސް %d',
+ M : 'މަހެއް',
+ MM : 'މަސް %d',
+ y : 'އަހަރެއް',
+ yy : 'އަހަރު %d'
+ },
+ preparse: function (string) {
+ return string.replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/,/g, '،');
+ },
+ week : {
+ dow : 7, // Sunday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/el.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/el.js
new file mode 100644
index 00000000000..e157a6352db
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/el.js
@@ -0,0 +1,86 @@
+//! moment.js locale configuration
+//! locale : Greek [el]
+//! author : Aggelos Karalias : https://github.com/mehiel
+
+import moment from '../moment';
+import isFunction from '../lib/utils/is-function';
+
+export default moment.defineLocale('el', {
+ monthsNominativeEl : 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'),
+ monthsGenitiveEl : 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'),
+ months : function (momentToFormat, format) {
+ if (/D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM'
+ return this._monthsGenitiveEl[momentToFormat.month()];
+ } else {
+ return this._monthsNominativeEl[momentToFormat.month()];
+ }
+ },
+ monthsShort : 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'),
+ weekdays : 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split('_'),
+ weekdaysShort : 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'),
+ weekdaysMin : 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'),
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'μμ' : 'ΜΜ';
+ } else {
+ return isLower ? 'πμ' : 'ΠΜ';
+ }
+ },
+ isPM : function (input) {
+ return ((input + '').toLowerCase()[0] === 'μ');
+ },
+ meridiemParse : /[ΠΜ]\.?Μ?\.?/i,
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendarEl : {
+ sameDay : '[Σήμερα {}] LT',
+ nextDay : '[Αύριο {}] LT',
+ nextWeek : 'dddd [{}] LT',
+ lastDay : '[Χθες {}] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 6:
+ return '[το προηγούμενο] dddd [{}] LT';
+ default:
+ return '[την προηγούμενη] dddd [{}] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ calendar : function (key, mom) {
+ var output = this._calendarEl[key],
+ hours = mom && mom.hours();
+ if (isFunction(output)) {
+ output = output.apply(mom);
+ }
+ return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις'));
+ },
+ relativeTime : {
+ future : 'σε %s',
+ past : '%s πριν',
+ s : 'λίγα δευτερόλεπτα',
+ m : 'ένα λεπτό',
+ mm : '%d λεπτά',
+ h : 'μία ώρα',
+ hh : '%d ώρες',
+ d : 'μία μέρα',
+ dd : '%d μέρες',
+ M : 'ένας μήνας',
+ MM : '%d μήνες',
+ y : 'ένας χρόνος',
+ yy : '%d χρόνια'
+ },
+ ordinalParse: /\d{1,2}η/,
+ ordinal: '%dη',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/en-au.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/en-au.js
new file mode 100644
index 00000000000..5f714095280
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/en-au.js
@@ -0,0 +1,58 @@
+//! moment.js locale configuration
+//! locale : English (Australia) [en-au]
+//! author : Jared Morse : https://github.com/jarcoal
+
+import moment from '../moment';
+
+export default moment.defineLocale('en-au', {
+ months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+ weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+ weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+ weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/en-ca.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/en-ca.js
new file mode 100644
index 00000000000..a678eab57d8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/en-ca.js
@@ -0,0 +1,53 @@
+//! moment.js locale configuration
+//! locale : English (Canada) [en-ca]
+//! author : Jonathan Abourbih : https://github.com/jonbca
+
+import moment from '../moment';
+
+export default moment.defineLocale('en-ca', {
+ months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+ weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+ weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+ weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'YYYY-MM-DD',
+ LL : 'MMMM D, YYYY',
+ LLL : 'MMMM D, YYYY h:mm A',
+ LLLL : 'dddd, MMMM D, YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/en-gb.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/en-gb.js
new file mode 100644
index 00000000000..f551112d7fb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/en-gb.js
@@ -0,0 +1,58 @@
+//! moment.js locale configuration
+//! locale : English (United Kingdom) [en-gb]
+//! author : Chris Gedrim : https://github.com/chrisgedrim
+
+import moment from '../moment';
+
+export default moment.defineLocale('en-gb', {
+ months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+ weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+ weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+ weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/en-ie.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/en-ie.js
new file mode 100644
index 00000000000..3447973e3ad
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/en-ie.js
@@ -0,0 +1,58 @@
+//! moment.js locale configuration
+//! locale : English (Ireland) [en-ie]
+//! author : Chris Cartlidge : https://github.com/chriscartlidge
+
+import moment from '../moment';
+
+export default moment.defineLocale('en-ie', {
+ months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+ weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+ weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+ weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD-MM-YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/en-nz.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/en-nz.js
new file mode 100644
index 00000000000..8413be1c25c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/en-nz.js
@@ -0,0 +1,57 @@
+//! moment.js locale configuration
+//! locale : English (New Zealand) [en-nz]
+//! author : Luke McGregor : https://github.com/lukemcgregor
+
+import moment from '../moment';
+
+export default moment.defineLocale('en-nz', {
+ months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+ weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+ weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+ weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/eo.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/eo.js
new file mode 100644
index 00000000000..e8df29f863a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/eo.js
@@ -0,0 +1,64 @@
+//! moment.js locale configuration
+//! locale : Esperanto [eo]
+//! author : Colin Dean : https://github.com/colindean
+//! komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
+//! Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
+
+import moment from '../moment';
+
+export default moment.defineLocale('eo', {
+ months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'),
+ weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato'.split('_'),
+ weekdaysShort : 'Dim_Lun_Mard_Merk_Ĵaŭ_Ven_Sab'.split('_'),
+ weekdaysMin : 'Di_Lu_Ma_Me_Ĵa_Ve_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'YYYY-MM-DD',
+ LL : 'D[-an de] MMMM, YYYY',
+ LLL : 'D[-an de] MMMM, YYYY HH:mm',
+ LLLL : 'dddd, [la] D[-an de] MMMM, YYYY HH:mm'
+ },
+ meridiemParse: /[ap]\.t\.m/i,
+ isPM: function (input) {
+ return input.charAt(0).toLowerCase() === 'p';
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'p.t.m.' : 'P.T.M.';
+ } else {
+ return isLower ? 'a.t.m.' : 'A.T.M.';
+ }
+ },
+ calendar : {
+ sameDay : '[Hodiaŭ je] LT',
+ nextDay : '[Morgaŭ je] LT',
+ nextWeek : 'dddd [je] LT',
+ lastDay : '[Hieraŭ je] LT',
+ lastWeek : '[pasinta] dddd [je] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'je %s',
+ past : 'antaŭ %s',
+ s : 'sekundoj',
+ m : 'minuto',
+ mm : '%d minutoj',
+ h : 'horo',
+ hh : '%d horoj',
+ d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo
+ dd : '%d tagoj',
+ M : 'monato',
+ MM : '%d monatoj',
+ y : 'jaro',
+ yy : '%d jaroj'
+ },
+ ordinalParse: /\d{1,2}a/,
+ ordinal : '%da',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/es-do.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/es-do.js
new file mode 100644
index 00000000000..21a44ab89a1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/es-do.js
@@ -0,0 +1,71 @@
+//! moment.js locale configuration
+//! locale : Spanish (Dominican Republic) [es-do]
+
+import moment from '../moment';
+
+var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'),
+ monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');
+
+export default moment.defineLocale('es-do', {
+ months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShort[m.month()];
+ } else {
+ return monthsShortDot[m.month()];
+ }
+ },
+ monthsParseExact : true,
+ weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
+ weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
+ weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D [de] MMMM [de] YYYY',
+ LLL : 'D [de] MMMM [de] YYYY h:mm A',
+ LLLL : 'dddd, D [de] MMMM [de] YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : function () {
+ return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ nextDay : function () {
+ return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ lastDay : function () {
+ return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ lastWeek : function () {
+ return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'en %s',
+ past : 'hace %s',
+ s : 'unos segundos',
+ m : 'un minuto',
+ mm : '%d minutos',
+ h : 'una hora',
+ hh : '%d horas',
+ d : 'un día',
+ dd : '%d días',
+ M : 'un mes',
+ MM : '%d meses',
+ y : 'un año',
+ yy : '%d años'
+ },
+ ordinalParse : /\d{1,2}º/,
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/es.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/es.js
new file mode 100644
index 00000000000..cc971615a96
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/es.js
@@ -0,0 +1,72 @@
+//! moment.js locale configuration
+//! locale : Spanish [es]
+//! author : Julio Napurí : https://github.com/julionc
+
+import moment from '../moment';
+
+var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'),
+ monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');
+
+export default moment.defineLocale('es', {
+ months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShort[m.month()];
+ } else {
+ return monthsShortDot[m.month()];
+ }
+ },
+ monthsParseExact : true,
+ weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
+ weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
+ weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D [de] MMMM [de] YYYY',
+ LLL : 'D [de] MMMM [de] YYYY H:mm',
+ LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm'
+ },
+ calendar : {
+ sameDay : function () {
+ return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ nextDay : function () {
+ return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ lastDay : function () {
+ return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ lastWeek : function () {
+ return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'en %s',
+ past : 'hace %s',
+ s : 'unos segundos',
+ m : 'un minuto',
+ mm : '%d minutos',
+ h : 'una hora',
+ hh : '%d horas',
+ d : 'un día',
+ dd : '%d días',
+ M : 'un mes',
+ MM : '%d meses',
+ y : 'un año',
+ yy : '%d años'
+ },
+ ordinalParse : /\d{1,2}º/,
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/et.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/et.js
new file mode 100644
index 00000000000..f8a718ba661
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/et.js
@@ -0,0 +1,71 @@
+//! moment.js locale configuration
+//! locale : Estonian [et]
+//! author : Henry Kehlmann : https://github.com/madhenry
+//! improvements : Illimar Tambek : https://github.com/ragulka
+
+import moment from '../moment';
+
+function processRelativeTime(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'],
+ 'm' : ['ühe minuti', 'üks minut'],
+ 'mm': [number + ' minuti', number + ' minutit'],
+ 'h' : ['ühe tunni', 'tund aega', 'üks tund'],
+ 'hh': [number + ' tunni', number + ' tundi'],
+ 'd' : ['ühe päeva', 'üks päev'],
+ 'M' : ['kuu aja', 'kuu aega', 'üks kuu'],
+ 'MM': [number + ' kuu', number + ' kuud'],
+ 'y' : ['ühe aasta', 'aasta', 'üks aasta'],
+ 'yy': [number + ' aasta', number + ' aastat']
+ };
+ if (withoutSuffix) {
+ return format[key][2] ? format[key][2] : format[key][1];
+ }
+ return isFuture ? format[key][0] : format[key][1];
+}
+
+export default moment.defineLocale('et', {
+ months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'),
+ monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),
+ weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'),
+ weekdaysShort : 'P_E_T_K_N_R_L'.split('_'),
+ weekdaysMin : 'P_E_T_K_N_R_L'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[Täna,] LT',
+ nextDay : '[Homme,] LT',
+ nextWeek : '[Järgmine] dddd LT',
+ lastDay : '[Eile,] LT',
+ lastWeek : '[Eelmine] dddd LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s pärast',
+ past : '%s tagasi',
+ s : processRelativeTime,
+ m : processRelativeTime,
+ mm : processRelativeTime,
+ h : processRelativeTime,
+ hh : processRelativeTime,
+ d : processRelativeTime,
+ dd : '%d päeva',
+ M : processRelativeTime,
+ MM : processRelativeTime,
+ y : processRelativeTime,
+ yy : processRelativeTime
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/eu.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/eu.js
new file mode 100644
index 00000000000..390819b65b9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/eu.js
@@ -0,0 +1,57 @@
+//! moment.js locale configuration
+//! locale : Basque [eu]
+//! author : Eneko Illarramendi : https://github.com/eillarra
+
+import moment from '../moment';
+
+export default moment.defineLocale('eu', {
+ months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'),
+ monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'),
+ weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'),
+ weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'YYYY-MM-DD',
+ LL : 'YYYY[ko] MMMM[ren] D[a]',
+ LLL : 'YYYY[ko] MMMM[ren] D[a] HH:mm',
+ LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm',
+ l : 'YYYY-M-D',
+ ll : 'YYYY[ko] MMM D[a]',
+ lll : 'YYYY[ko] MMM D[a] HH:mm',
+ llll : 'ddd, YYYY[ko] MMM D[a] HH:mm'
+ },
+ calendar : {
+ sameDay : '[gaur] LT[etan]',
+ nextDay : '[bihar] LT[etan]',
+ nextWeek : 'dddd LT[etan]',
+ lastDay : '[atzo] LT[etan]',
+ lastWeek : '[aurreko] dddd LT[etan]',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s barru',
+ past : 'duela %s',
+ s : 'segundo batzuk',
+ m : 'minutu bat',
+ mm : '%d minutu',
+ h : 'ordu bat',
+ hh : '%d ordu',
+ d : 'egun bat',
+ dd : '%d egun',
+ M : 'hilabete bat',
+ MM : '%d hilabete',
+ y : 'urte bat',
+ yy : '%d urte'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fa.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fa.js
new file mode 100644
index 00000000000..634c2c19dbb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fa.js
@@ -0,0 +1,97 @@
+//! moment.js locale configuration
+//! locale : Persian [fa]
+//! author : Ebrahim Byagowi : https://github.com/ebraminio
+
+import moment from '../moment';
+
+var symbolMap = {
+ '1': '۱',
+ '2': '۲',
+ '3': '۳',
+ '4': '۴',
+ '5': '۵',
+ '6': '۶',
+ '7': '۷',
+ '8': '۸',
+ '9': '۹',
+ '0': '۰'
+}, numberMap = {
+ '۱': '1',
+ '۲': '2',
+ '۳': '3',
+ '۴': '4',
+ '۵': '5',
+ '۶': '6',
+ '۷': '7',
+ '۸': '8',
+ '۹': '9',
+ '۰': '0'
+};
+
+export default moment.defineLocale('fa', {
+ months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+ monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+ weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
+ weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
+ weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /قبل از ظهر|بعد از ظهر/,
+ isPM: function (input) {
+ return /بعد از ظهر/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'قبل از ظهر';
+ } else {
+ return 'بعد از ظهر';
+ }
+ },
+ calendar : {
+ sameDay : '[امروز ساعت] LT',
+ nextDay : '[فردا ساعت] LT',
+ nextWeek : 'dddd [ساعت] LT',
+ lastDay : '[دیروز ساعت] LT',
+ lastWeek : 'dddd [پیش] [ساعت] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'در %s',
+ past : '%s پیش',
+ s : 'چندین ثانیه',
+ m : 'یک دقیقه',
+ mm : '%d دقیقه',
+ h : 'یک ساعت',
+ hh : '%d ساعت',
+ d : 'یک روز',
+ dd : '%d روز',
+ M : 'یک ماه',
+ MM : '%d ماه',
+ y : 'یک سال',
+ yy : '%d سال'
+ },
+ preparse: function (string) {
+ return string.replace(/[۰-۹]/g, function (match) {
+ return numberMap[match];
+ }).replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ }).replace(/,/g, '،');
+ },
+ ordinalParse: /\d{1,2}م/,
+ ordinal : '%dم',
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fi.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fi.js
new file mode 100644
index 00000000000..f91e1280b95
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fi.js
@@ -0,0 +1,98 @@
+//! moment.js locale configuration
+//! locale : Finnish [fi]
+//! author : Tarmo Aidantausta : https://github.com/bleadof
+
+import moment from '../moment';
+
+var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '),
+ numbersFuture = [
+ 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden',
+ numbersPast[7], numbersPast[8], numbersPast[9]
+ ];
+function translate(number, withoutSuffix, key, isFuture) {
+ var result = '';
+ switch (key) {
+ case 's':
+ return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
+ case 'm':
+ return isFuture ? 'minuutin' : 'minuutti';
+ case 'mm':
+ result = isFuture ? 'minuutin' : 'minuuttia';
+ break;
+ case 'h':
+ return isFuture ? 'tunnin' : 'tunti';
+ case 'hh':
+ result = isFuture ? 'tunnin' : 'tuntia';
+ break;
+ case 'd':
+ return isFuture ? 'päivän' : 'päivä';
+ case 'dd':
+ result = isFuture ? 'päivän' : 'päivää';
+ break;
+ case 'M':
+ return isFuture ? 'kuukauden' : 'kuukausi';
+ case 'MM':
+ result = isFuture ? 'kuukauden' : 'kuukautta';
+ break;
+ case 'y':
+ return isFuture ? 'vuoden' : 'vuosi';
+ case 'yy':
+ result = isFuture ? 'vuoden' : 'vuotta';
+ break;
+ }
+ result = verbalNumber(number, isFuture) + ' ' + result;
+ return result;
+}
+function verbalNumber(number, isFuture) {
+ return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number;
+}
+
+export default moment.defineLocale('fi', {
+ months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'),
+ monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'),
+ weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'),
+ weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'),
+ weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD.MM.YYYY',
+ LL : 'Do MMMM[ta] YYYY',
+ LLL : 'Do MMMM[ta] YYYY, [klo] HH.mm',
+ LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm',
+ l : 'D.M.YYYY',
+ ll : 'Do MMM YYYY',
+ lll : 'Do MMM YYYY, [klo] HH.mm',
+ llll : 'ddd, Do MMM YYYY, [klo] HH.mm'
+ },
+ calendar : {
+ sameDay : '[tänään] [klo] LT',
+ nextDay : '[huomenna] [klo] LT',
+ nextWeek : 'dddd [klo] LT',
+ lastDay : '[eilen] [klo] LT',
+ lastWeek : '[viime] dddd[na] [klo] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s päästä',
+ past : '%s sitten',
+ s : translate,
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : translate,
+ dd : translate,
+ M : translate,
+ MM : translate,
+ y : translate,
+ yy : translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fo.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fo.js
new file mode 100644
index 00000000000..e3b169d74c4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fo.js
@@ -0,0 +1,51 @@
+//! moment.js locale configuration
+//! locale : Faroese [fo]
+//! author : Ragnar Johannesen : https://github.com/ragnar123
+
+import moment from '../moment';
+
+export default moment.defineLocale('fo', {
+ months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
+ weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'),
+ weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'),
+ weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D. MMMM, YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Í dag kl.] LT',
+ nextDay : '[Í morgin kl.] LT',
+ nextWeek : 'dddd [kl.] LT',
+ lastDay : '[Í gjár kl.] LT',
+ lastWeek : '[síðstu] dddd [kl] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'um %s',
+ past : '%s síðani',
+ s : 'fá sekund',
+ m : 'ein minutt',
+ mm : '%d minuttir',
+ h : 'ein tími',
+ hh : '%d tímar',
+ d : 'ein dagur',
+ dd : '%d dagar',
+ M : 'ein mánaði',
+ MM : '%d mánaðir',
+ y : 'eitt ár',
+ yy : '%d ár'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fr-ca.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fr-ca.js
new file mode 100644
index 00000000000..07b3de18d48
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fr-ca.js
@@ -0,0 +1,51 @@
+//! moment.js locale configuration
+//! locale : French (Canada) [fr-ca]
+//! author : Jonathan Abourbih : https://github.com/jonbca
+
+import moment from '../moment';
+
+export default moment.defineLocale('fr-ca', {
+ months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
+ monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
+ weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
+ weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'YYYY-MM-DD',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Aujourd\'hui à] LT',
+ nextDay: '[Demain à] LT',
+ nextWeek: 'dddd [à] LT',
+ lastDay: '[Hier à] LT',
+ lastWeek: 'dddd [dernier à] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'dans %s',
+ past : 'il y a %s',
+ s : 'quelques secondes',
+ m : 'une minute',
+ mm : '%d minutes',
+ h : 'une heure',
+ hh : '%d heures',
+ d : 'un jour',
+ dd : '%d jours',
+ M : 'un mois',
+ MM : '%d mois',
+ y : 'un an',
+ yy : '%d ans'
+ },
+ ordinalParse: /\d{1,2}(er|e)/,
+ ordinal : function (number) {
+ return number + (number === 1 ? 'er' : 'e');
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fr-ch.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fr-ch.js
new file mode 100644
index 00000000000..ea0d291a4e5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fr-ch.js
@@ -0,0 +1,55 @@
+//! moment.js locale configuration
+//! locale : French (Switzerland) [fr-ch]
+//! author : Gaspard Bucher : https://github.com/gaspard
+
+import moment from '../moment';
+
+export default moment.defineLocale('fr-ch', {
+ months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
+ monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
+ weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
+ weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Aujourd\'hui à] LT',
+ nextDay: '[Demain à] LT',
+ nextWeek: 'dddd [à] LT',
+ lastDay: '[Hier à] LT',
+ lastWeek: 'dddd [dernier à] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'dans %s',
+ past : 'il y a %s',
+ s : 'quelques secondes',
+ m : 'une minute',
+ mm : '%d minutes',
+ h : 'une heure',
+ hh : '%d heures',
+ d : 'un jour',
+ dd : '%d jours',
+ M : 'un mois',
+ MM : '%d mois',
+ y : 'un an',
+ yy : '%d ans'
+ },
+ ordinalParse: /\d{1,2}(er|e)/,
+ ordinal : function (number) {
+ return number + (number === 1 ? 'er' : 'e');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fr.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fr.js
new file mode 100644
index 00000000000..6e704d1d0f4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fr.js
@@ -0,0 +1,55 @@
+//! moment.js locale configuration
+//! locale : French [fr]
+//! author : John Fischer : https://github.com/jfroffice
+
+import moment from '../moment';
+
+export default moment.defineLocale('fr', {
+ months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
+ monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
+ weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
+ weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Aujourd\'hui à] LT',
+ nextDay: '[Demain à] LT',
+ nextWeek: 'dddd [à] LT',
+ lastDay: '[Hier à] LT',
+ lastWeek: 'dddd [dernier à] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'dans %s',
+ past : 'il y a %s',
+ s : 'quelques secondes',
+ m : 'une minute',
+ mm : '%d minutes',
+ h : 'une heure',
+ hh : '%d heures',
+ d : 'un jour',
+ dd : '%d jours',
+ M : 'un mois',
+ MM : '%d mois',
+ y : 'un an',
+ yy : '%d ans'
+ },
+ ordinalParse: /\d{1,2}(er|)/,
+ ordinal : function (number) {
+ return number + (number === 1 ? 'er' : '');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fy.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fy.js
new file mode 100644
index 00000000000..5861a772657
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/fy.js
@@ -0,0 +1,64 @@
+//! moment.js locale configuration
+//! locale : Frisian [fy]
+//! author : Robin van der Vliet : https://github.com/robin0van0der0v
+
+import moment from '../moment';
+
+var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'),
+ monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_');
+
+export default moment.defineLocale('fy', {
+ months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShortWithoutDots[m.month()];
+ } else {
+ return monthsShortWithDots[m.month()];
+ }
+ },
+ monthsParseExact : true,
+ weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'),
+ weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'),
+ weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD-MM-YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[hjoed om] LT',
+ nextDay: '[moarn om] LT',
+ nextWeek: 'dddd [om] LT',
+ lastDay: '[juster om] LT',
+ lastWeek: '[ôfrûne] dddd [om] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'oer %s',
+ past : '%s lyn',
+ s : 'in pear sekonden',
+ m : 'ien minút',
+ mm : '%d minuten',
+ h : 'ien oere',
+ hh : '%d oeren',
+ d : 'ien dei',
+ dd : '%d dagen',
+ M : 'ien moanne',
+ MM : '%d moannen',
+ y : 'ien jier',
+ yy : '%d jierren'
+ },
+ ordinalParse: /\d{1,2}(ste|de)/,
+ ordinal : function (number) {
+ return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/gd.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/gd.js
new file mode 100644
index 00000000000..3ec664e476c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/gd.js
@@ -0,0 +1,67 @@
+//! moment.js locale configuration
+//! locale : Scottish Gaelic [gd]
+//! author : Jon Ashdown : https://github.com/jonashdown
+
+import moment from '../moment';
+
+var months = [
+ 'Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd'
+];
+
+var monthsShort = ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh'];
+
+var weekdays = ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne'];
+
+var weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis'];
+
+var weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa'];
+
+export default moment.defineLocale('gd', {
+ months : months,
+ monthsShort : monthsShort,
+ monthsParseExact : true,
+ weekdays : weekdays,
+ weekdaysShort : weekdaysShort,
+ weekdaysMin : weekdaysMin,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[An-diugh aig] LT',
+ nextDay : '[A-màireach aig] LT',
+ nextWeek : 'dddd [aig] LT',
+ lastDay : '[An-dè aig] LT',
+ lastWeek : 'dddd [seo chaidh] [aig] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'ann an %s',
+ past : 'bho chionn %s',
+ s : 'beagan diogan',
+ m : 'mionaid',
+ mm : '%d mionaidean',
+ h : 'uair',
+ hh : '%d uairean',
+ d : 'latha',
+ dd : '%d latha',
+ M : 'mìos',
+ MM : '%d mìosan',
+ y : 'bliadhna',
+ yy : '%d bliadhna'
+ },
+ ordinalParse : /\d{1,2}(d|na|mh)/,
+ ordinal : function (number) {
+ var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/gl.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/gl.js
new file mode 100644
index 00000000000..d0ea61d49b8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/gl.js
@@ -0,0 +1,68 @@
+//! moment.js locale configuration
+//! locale : Galician [gl]
+//! author : Juan G. Hurtado : https://github.com/juanghurtado
+
+import moment from '../moment';
+
+export default moment.defineLocale('gl', {
+ months : 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split('_'),
+ monthsShort : 'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'),
+ weekdaysShort : 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'),
+ weekdaysMin : 'do_lu_ma_mé_xo_ve_sá'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D [de] MMMM [de] YYYY',
+ LLL : 'D [de] MMMM [de] YYYY H:mm',
+ LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm'
+ },
+ calendar : {
+ sameDay : function () {
+ return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
+ },
+ nextDay : function () {
+ return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
+ },
+ lastDay : function () {
+ return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT';
+ },
+ lastWeek : function () {
+ return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : function (str) {
+ if (str.indexOf('un') === 0) {
+ return 'n' + str;
+ }
+ return 'en ' + str;
+ },
+ past : 'hai %s',
+ s : 'uns segundos',
+ m : 'un minuto',
+ mm : '%d minutos',
+ h : 'unha hora',
+ hh : '%d horas',
+ d : 'un día',
+ dd : '%d días',
+ M : 'un mes',
+ MM : '%d meses',
+ y : 'un ano',
+ yy : '%d anos'
+ },
+ ordinalParse : /\d{1,2}º/,
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/he.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/he.js
new file mode 100644
index 00000000000..b6a1944b57f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/he.js
@@ -0,0 +1,90 @@
+//! moment.js locale configuration
+//! locale : Hebrew [he]
+//! author : Tomer Cohen : https://github.com/tomer
+//! author : Moshe Simantov : https://github.com/DevelopmentIL
+//! author : Tal Ater : https://github.com/TalAter
+
+import moment from '../moment';
+
+export default moment.defineLocale('he', {
+ months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'),
+ monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),
+ weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),
+ weekdaysShort : 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'),
+ weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D [ב]MMMM YYYY',
+ LLL : 'D [ב]MMMM YYYY HH:mm',
+ LLLL : 'dddd, D [ב]MMMM YYYY HH:mm',
+ l : 'D/M/YYYY',
+ ll : 'D MMM YYYY',
+ lll : 'D MMM YYYY HH:mm',
+ llll : 'ddd, D MMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[היום ב־]LT',
+ nextDay : '[מחר ב־]LT',
+ nextWeek : 'dddd [בשעה] LT',
+ lastDay : '[אתמול ב־]LT',
+ lastWeek : '[ביום] dddd [האחרון בשעה] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'בעוד %s',
+ past : 'לפני %s',
+ s : 'מספר שניות',
+ m : 'דקה',
+ mm : '%d דקות',
+ h : 'שעה',
+ hh : function (number) {
+ if (number === 2) {
+ return 'שעתיים';
+ }
+ return number + ' שעות';
+ },
+ d : 'יום',
+ dd : function (number) {
+ if (number === 2) {
+ return 'יומיים';
+ }
+ return number + ' ימים';
+ },
+ M : 'חודש',
+ MM : function (number) {
+ if (number === 2) {
+ return 'חודשיים';
+ }
+ return number + ' חודשים';
+ },
+ y : 'שנה',
+ yy : function (number) {
+ if (number === 2) {
+ return 'שנתיים';
+ } else if (number % 10 === 0 && number !== 10) {
+ return number + ' שנה';
+ }
+ return number + ' שנים';
+ }
+ },
+ meridiemParse: /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,
+ isPM : function (input) {
+ return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 5) {
+ return 'לפנות בוקר';
+ } else if (hour < 10) {
+ return 'בבוקר';
+ } else if (hour < 12) {
+ return isLower ? 'לפנה"צ' : 'לפני הצהריים';
+ } else if (hour < 18) {
+ return isLower ? 'אחה"צ' : 'אחרי הצהריים';
+ } else {
+ return 'בערב';
+ }
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/hi.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/hi.js
new file mode 100644
index 00000000000..30a50e4ebe1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/hi.js
@@ -0,0 +1,115 @@
+//! moment.js locale configuration
+//! locale : Hindi [hi]
+//! author : Mayank Singhal : https://github.com/mayanksinghal
+
+import moment from '../moment';
+
+var symbolMap = {
+ '1': '१',
+ '2': '२',
+ '3': '३',
+ '4': '४',
+ '5': '५',
+ '6': '६',
+ '7': '७',
+ '8': '८',
+ '9': '९',
+ '0': '०'
+},
+numberMap = {
+ '१': '1',
+ '२': '2',
+ '३': '3',
+ '४': '4',
+ '५': '5',
+ '६': '6',
+ '७': '7',
+ '८': '8',
+ '९': '9',
+ '०': '0'
+};
+
+export default moment.defineLocale('hi', {
+ months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'),
+ monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
+ weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'),
+ weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm बजे',
+ LTS : 'A h:mm:ss बजे',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm बजे',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm बजे'
+ },
+ calendar : {
+ sameDay : '[आज] LT',
+ nextDay : '[कल] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[कल] LT',
+ lastWeek : '[पिछले] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s में',
+ past : '%s पहले',
+ s : 'कुछ ही क्षण',
+ m : 'एक मिनट',
+ mm : '%d मिनट',
+ h : 'एक घंटा',
+ hh : '%d घंटे',
+ d : 'एक दिन',
+ dd : '%d दिन',
+ M : 'एक महीने',
+ MM : '%d महीने',
+ y : 'एक वर्ष',
+ yy : '%d वर्ष'
+ },
+ preparse: function (string) {
+ return string.replace(/[१२३४५६७८९०]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ // Hindi notation for meridiems are quite fuzzy in practice. While there exists
+ // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
+ meridiemParse: /रात|सुबह|दोपहर|शाम/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'रात') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'सुबह') {
+ return hour;
+ } else if (meridiem === 'दोपहर') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'शाम') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'रात';
+ } else if (hour < 10) {
+ return 'सुबह';
+ } else if (hour < 17) {
+ return 'दोपहर';
+ } else if (hour < 20) {
+ return 'शाम';
+ } else {
+ return 'रात';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/hr.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/hr.js
new file mode 100644
index 00000000000..84878ad094a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/hr.js
@@ -0,0 +1,135 @@
+//! moment.js locale configuration
+//! locale : Croatian [hr]
+//! author : Bojan Marković : https://github.com/bmarkovic
+
+import moment from '../moment';
+
+function translate(number, withoutSuffix, key) {
+ var result = number + ' ';
+ switch (key) {
+ case 'm':
+ return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+ case 'mm':
+ if (number === 1) {
+ result += 'minuta';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'minute';
+ } else {
+ result += 'minuta';
+ }
+ return result;
+ case 'h':
+ return withoutSuffix ? 'jedan sat' : 'jednog sata';
+ case 'hh':
+ if (number === 1) {
+ result += 'sat';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'sata';
+ } else {
+ result += 'sati';
+ }
+ return result;
+ case 'dd':
+ if (number === 1) {
+ result += 'dan';
+ } else {
+ result += 'dana';
+ }
+ return result;
+ case 'MM':
+ if (number === 1) {
+ result += 'mjesec';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'mjeseca';
+ } else {
+ result += 'mjeseci';
+ }
+ return result;
+ case 'yy':
+ if (number === 1) {
+ result += 'godina';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'godine';
+ } else {
+ result += 'godina';
+ }
+ return result;
+ }
+}
+
+export default moment.defineLocale('hr', {
+ months : {
+ format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_'),
+ standalone: 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_')
+ },
+ monthsShort : 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
+ weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
+ weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[danas u] LT',
+ nextDay : '[sutra u] LT',
+ nextWeek : function () {
+ switch (this.day()) {
+ case 0:
+ return '[u] [nedjelju] [u] LT';
+ case 3:
+ return '[u] [srijedu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ },
+ lastDay : '[jučer u] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ return '[prošlu] dddd [u] LT';
+ case 6:
+ return '[prošle] [subote] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[prošli] dddd [u] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'prije %s',
+ s : 'par sekundi',
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : 'dan',
+ dd : translate,
+ M : 'mjesec',
+ MM : translate,
+ y : 'godinu',
+ yy : translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/hu.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/hu.js
new file mode 100644
index 00000000000..0cffecf836d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/hu.js
@@ -0,0 +1,100 @@
+//! moment.js locale configuration
+//! locale : Hungarian [hu]
+//! author : Adam Brunner : https://github.com/adambrunner
+
+import moment from '../moment';
+
+var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
+function translate(number, withoutSuffix, key, isFuture) {
+ var num = number,
+ suffix;
+ switch (key) {
+ case 's':
+ return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce';
+ case 'm':
+ return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
+ case 'mm':
+ return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
+ case 'h':
+ return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
+ case 'hh':
+ return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
+ case 'd':
+ return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
+ case 'dd':
+ return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
+ case 'M':
+ return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+ case 'MM':
+ return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+ case 'y':
+ return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
+ case 'yy':
+ return num + (isFuture || withoutSuffix ? ' év' : ' éve');
+ }
+ return '';
+}
+function week(isFuture) {
+ return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]';
+}
+
+export default moment.defineLocale('hu', {
+ months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'),
+ monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'),
+ weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'),
+ weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'),
+ weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'YYYY.MM.DD.',
+ LL : 'YYYY. MMMM D.',
+ LLL : 'YYYY. MMMM D. H:mm',
+ LLLL : 'YYYY. MMMM D., dddd H:mm'
+ },
+ meridiemParse: /de|du/i,
+ isPM: function (input) {
+ return input.charAt(1).toLowerCase() === 'u';
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 12) {
+ return isLower === true ? 'de' : 'DE';
+ } else {
+ return isLower === true ? 'du' : 'DU';
+ }
+ },
+ calendar : {
+ sameDay : '[ma] LT[-kor]',
+ nextDay : '[holnap] LT[-kor]',
+ nextWeek : function () {
+ return week.call(this, true);
+ },
+ lastDay : '[tegnap] LT[-kor]',
+ lastWeek : function () {
+ return week.call(this, false);
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s múlva',
+ past : '%s',
+ s : translate,
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : translate,
+ dd : translate,
+ M : translate,
+ MM : translate,
+ y : translate,
+ yy : translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/hy-am.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/hy-am.js
new file mode 100644
index 00000000000..bc50205e03a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/hy-am.js
@@ -0,0 +1,86 @@
+//! moment.js locale configuration
+//! locale : Armenian [hy-am]
+//! author : Armendarabyan : https://github.com/armendarabyan
+
+import moment from '../moment';
+
+export default moment.defineLocale('hy-am', {
+ months : {
+ format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'),
+ standalone: 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_')
+ },
+ monthsShort : 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'),
+ weekdays : 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'),
+ weekdaysShort : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
+ weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY թ.',
+ LLL : 'D MMMM YYYY թ., HH:mm',
+ LLLL : 'dddd, D MMMM YYYY թ., HH:mm'
+ },
+ calendar : {
+ sameDay: '[այսօր] LT',
+ nextDay: '[վաղը] LT',
+ lastDay: '[երեկ] LT',
+ nextWeek: function () {
+ return 'dddd [օրը ժամը] LT';
+ },
+ lastWeek: function () {
+ return '[անցած] dddd [օրը ժամը] LT';
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : '%s հետո',
+ past : '%s առաջ',
+ s : 'մի քանի վայրկյան',
+ m : 'րոպե',
+ mm : '%d րոպե',
+ h : 'ժամ',
+ hh : '%d ժամ',
+ d : 'օր',
+ dd : '%d օր',
+ M : 'ամիս',
+ MM : '%d ամիս',
+ y : 'տարի',
+ yy : '%d տարի'
+ },
+ meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,
+ isPM: function (input) {
+ return /^(ցերեկվա|երեկոյան)$/.test(input);
+ },
+ meridiem : function (hour) {
+ if (hour < 4) {
+ return 'գիշերվա';
+ } else if (hour < 12) {
+ return 'առավոտվա';
+ } else if (hour < 17) {
+ return 'ցերեկվա';
+ } else {
+ return 'երեկոյան';
+ }
+ },
+ ordinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/,
+ ordinal: function (number, period) {
+ switch (period) {
+ case 'DDD':
+ case 'w':
+ case 'W':
+ case 'DDDo':
+ if (number === 1) {
+ return number + '-ին';
+ }
+ return number + '-րդ';
+ default:
+ return number;
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/id.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/id.js
new file mode 100644
index 00000000000..ab4204e5873
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/id.js
@@ -0,0 +1,74 @@
+//! moment.js locale configuration
+//! locale : Indonesian [id]
+//! author : Mohammad Satrio Utomo : https://github.com/tyok
+//! reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
+
+import moment from '../moment';
+
+export default moment.defineLocale('id', {
+ months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'),
+ weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),
+ weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'),
+ weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [pukul] HH.mm',
+ LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+ },
+ meridiemParse: /pagi|siang|sore|malam/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'pagi') {
+ return hour;
+ } else if (meridiem === 'siang') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'sore' || meridiem === 'malam') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'pagi';
+ } else if (hours < 15) {
+ return 'siang';
+ } else if (hours < 19) {
+ return 'sore';
+ } else {
+ return 'malam';
+ }
+ },
+ calendar : {
+ sameDay : '[Hari ini pukul] LT',
+ nextDay : '[Besok pukul] LT',
+ nextWeek : 'dddd [pukul] LT',
+ lastDay : '[Kemarin pukul] LT',
+ lastWeek : 'dddd [lalu pukul] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'dalam %s',
+ past : '%s yang lalu',
+ s : 'beberapa detik',
+ m : 'semenit',
+ mm : '%d menit',
+ h : 'sejam',
+ hh : '%d jam',
+ d : 'sehari',
+ dd : '%d hari',
+ M : 'sebulan',
+ MM : '%d bulan',
+ y : 'setahun',
+ yy : '%d tahun'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/is.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/is.js
new file mode 100644
index 00000000000..22f873d0b20
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/is.js
@@ -0,0 +1,118 @@
+//! moment.js locale configuration
+//! locale : Icelandic [is]
+//! author : Hinrik Örn Sigurðsson : https://github.com/hinrik
+
+import moment from '../moment';
+
+function plural(n) {
+ if (n % 100 === 11) {
+ return true;
+ } else if (n % 10 === 1) {
+ return false;
+ }
+ return true;
+}
+function translate(number, withoutSuffix, key, isFuture) {
+ var result = number + ' ';
+ switch (key) {
+ case 's':
+ return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum';
+ case 'm':
+ return withoutSuffix ? 'mínúta' : 'mínútu';
+ case 'mm':
+ if (plural(number)) {
+ return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');
+ } else if (withoutSuffix) {
+ return result + 'mínúta';
+ }
+ return result + 'mínútu';
+ case 'hh':
+ if (plural(number)) {
+ return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');
+ }
+ return result + 'klukkustund';
+ case 'd':
+ if (withoutSuffix) {
+ return 'dagur';
+ }
+ return isFuture ? 'dag' : 'degi';
+ case 'dd':
+ if (plural(number)) {
+ if (withoutSuffix) {
+ return result + 'dagar';
+ }
+ return result + (isFuture ? 'daga' : 'dögum');
+ } else if (withoutSuffix) {
+ return result + 'dagur';
+ }
+ return result + (isFuture ? 'dag' : 'degi');
+ case 'M':
+ if (withoutSuffix) {
+ return 'mánuður';
+ }
+ return isFuture ? 'mánuð' : 'mánuði';
+ case 'MM':
+ if (plural(number)) {
+ if (withoutSuffix) {
+ return result + 'mánuðir';
+ }
+ return result + (isFuture ? 'mánuði' : 'mánuðum');
+ } else if (withoutSuffix) {
+ return result + 'mánuður';
+ }
+ return result + (isFuture ? 'mánuð' : 'mánuði');
+ case 'y':
+ return withoutSuffix || isFuture ? 'ár' : 'ári';
+ case 'yy':
+ if (plural(number)) {
+ return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
+ }
+ return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
+ }
+}
+
+export default moment.defineLocale('is', {
+ months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'),
+ weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'),
+ weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'),
+ weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY [kl.] H:mm',
+ LLLL : 'dddd, D. MMMM YYYY [kl.] H:mm'
+ },
+ calendar : {
+ sameDay : '[í dag kl.] LT',
+ nextDay : '[á morgun kl.] LT',
+ nextWeek : 'dddd [kl.] LT',
+ lastDay : '[í gær kl.] LT',
+ lastWeek : '[síðasta] dddd [kl.] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'eftir %s',
+ past : 'fyrir %s síðan',
+ s : translate,
+ m : translate,
+ mm : translate,
+ h : 'klukkustund',
+ hh : translate,
+ d : translate,
+ dd : translate,
+ M : translate,
+ MM : translate,
+ y : translate,
+ yy : translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/it.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/it.js
new file mode 100644
index 00000000000..0b47212e226
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/it.js
@@ -0,0 +1,61 @@
+//! moment.js locale configuration
+//! locale : Italian [it]
+//! author : Lorenzo : https://github.com/aliem
+//! author: Mattia Larentis: https://github.com/nostalgiaz
+
+import moment from '../moment';
+
+export default moment.defineLocale('it', {
+ months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'),
+ monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
+ weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'),
+ weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'),
+ weekdaysMin : 'Do_Lu_Ma_Me_Gi_Ve_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Oggi alle] LT',
+ nextDay: '[Domani alle] LT',
+ nextWeek: 'dddd [alle] LT',
+ lastDay: '[Ieri alle] LT',
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[la scorsa] dddd [alle] LT';
+ default:
+ return '[lo scorso] dddd [alle] LT';
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : function (s) {
+ return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s;
+ },
+ past : '%s fa',
+ s : 'alcuni secondi',
+ m : 'un minuto',
+ mm : '%d minuti',
+ h : 'un\'ora',
+ hh : '%d ore',
+ d : 'un giorno',
+ dd : '%d giorni',
+ M : 'un mese',
+ MM : '%d mesi',
+ y : 'un anno',
+ yy : '%d anni'
+ },
+ ordinalParse : /\d{1,2}º/,
+ ordinal: '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ja.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ja.js
new file mode 100644
index 00000000000..38a262ed3dc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ja.js
@@ -0,0 +1,67 @@
+//! moment.js locale configuration
+//! locale : Japanese [ja]
+//! author : LI Long : https://github.com/baryon
+
+import moment from '../moment';
+
+export default moment.defineLocale('ja', {
+ months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+ monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+ weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),
+ weekdaysShort : '日_月_火_水_木_金_土'.split('_'),
+ weekdaysMin : '日_月_火_水_木_金_土'.split('_'),
+ longDateFormat : {
+ LT : 'Ah時m分',
+ LTS : 'Ah時m分s秒',
+ L : 'YYYY/MM/DD',
+ LL : 'YYYY年M月D日',
+ LLL : 'YYYY年M月D日Ah時m分',
+ LLLL : 'YYYY年M月D日Ah時m分 dddd'
+ },
+ meridiemParse: /午前|午後/i,
+ isPM : function (input) {
+ return input === '午後';
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return '午前';
+ } else {
+ return '午後';
+ }
+ },
+ calendar : {
+ sameDay : '[今日] LT',
+ nextDay : '[明日] LT',
+ nextWeek : '[来週]dddd LT',
+ lastDay : '[昨日] LT',
+ lastWeek : '[前週]dddd LT',
+ sameElse : 'L'
+ },
+ ordinalParse : /\d{1,2}日/,
+ ordinal : function (number, period) {
+ switch (period) {
+ case 'd':
+ case 'D':
+ case 'DDD':
+ return number + '日';
+ default:
+ return number;
+ }
+ },
+ relativeTime : {
+ future : '%s後',
+ past : '%s前',
+ s : '数秒',
+ m : '1分',
+ mm : '%d分',
+ h : '1時間',
+ hh : '%d時間',
+ d : '1日',
+ dd : '%d日',
+ M : '1ヶ月',
+ MM : '%dヶ月',
+ y : '1年',
+ yy : '%d年'
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/jv.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/jv.js
new file mode 100644
index 00000000000..e5e25f9db16
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/jv.js
@@ -0,0 +1,73 @@
+//! moment.js locale configuration
+//! locale : Javanese [jv]
+//! author : Rony Lantip : https://github.com/lantip
+//! reference: http://jv.wikipedia.org/wiki/Basa_Jawa
+
+import moment from '../moment';
+
+export default moment.defineLocale('jv', {
+ months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'),
+ weekdays : 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'),
+ weekdaysShort : 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'),
+ weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [pukul] HH.mm',
+ LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+ },
+ meridiemParse: /enjing|siyang|sonten|ndalu/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'enjing') {
+ return hour;
+ } else if (meridiem === 'siyang') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'sonten' || meridiem === 'ndalu') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'enjing';
+ } else if (hours < 15) {
+ return 'siyang';
+ } else if (hours < 19) {
+ return 'sonten';
+ } else {
+ return 'ndalu';
+ }
+ },
+ calendar : {
+ sameDay : '[Dinten puniko pukul] LT',
+ nextDay : '[Mbenjang pukul] LT',
+ nextWeek : 'dddd [pukul] LT',
+ lastDay : '[Kala wingi pukul] LT',
+ lastWeek : 'dddd [kepengker pukul] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'wonten ing %s',
+ past : '%s ingkang kepengker',
+ s : 'sawetawis detik',
+ m : 'setunggal menit',
+ mm : '%d menit',
+ h : 'setunggal jam',
+ hh : '%d jam',
+ d : 'sedinten',
+ dd : '%d dinten',
+ M : 'sewulan',
+ MM : '%d wulan',
+ y : 'setaun',
+ yy : '%d taun'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ka.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ka.js
new file mode 100644
index 00000000000..b03175d629d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ka.js
@@ -0,0 +1,80 @@
+//! moment.js locale configuration
+//! locale : Georgian [ka]
+//! author : Irakli Janiashvili : https://github.com/irakli-janiashvili
+
+import moment from '../moment';
+
+export default moment.defineLocale('ka', {
+ months : {
+ standalone: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),
+ format: 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_')
+ },
+ monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),
+ weekdays : {
+ standalone: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),
+ format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_'),
+ isFormat: /(წინა|შემდეგ)/
+ },
+ weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),
+ weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[დღეს] LT[-ზე]',
+ nextDay : '[ხვალ] LT[-ზე]',
+ lastDay : '[გუშინ] LT[-ზე]',
+ nextWeek : '[შემდეგ] dddd LT[-ზე]',
+ lastWeek : '[წინა] dddd LT-ზე',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : function (s) {
+ return (/(წამი|წუთი|საათი|წელი)/).test(s) ?
+ s.replace(/ი$/, 'ში') :
+ s + 'ში';
+ },
+ past : function (s) {
+ if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) {
+ return s.replace(/(ი|ე)$/, 'ის წინ');
+ }
+ if ((/წელი/).test(s)) {
+ return s.replace(/წელი$/, 'წლის წინ');
+ }
+ },
+ s : 'რამდენიმე წამი',
+ m : 'წუთი',
+ mm : '%d წუთი',
+ h : 'საათი',
+ hh : '%d საათი',
+ d : 'დღე',
+ dd : '%d დღე',
+ M : 'თვე',
+ MM : '%d თვე',
+ y : 'წელი',
+ yy : '%d წელი'
+ },
+ ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,
+ ordinal : function (number) {
+ if (number === 0) {
+ return number;
+ }
+ if (number === 1) {
+ return number + '-ლი';
+ }
+ if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) {
+ return 'მე-' + number;
+ }
+ return number + '-ე';
+ },
+ week : {
+ dow : 1,
+ doy : 7
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/kk.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/kk.js
new file mode 100644
index 00000000000..073405439cc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/kk.js
@@ -0,0 +1,77 @@
+//! moment.js locale configuration
+//! locale : Kazakh [kk]
+//! authors : Nurlan Rakhimzhanov : https://github.com/nurlan
+
+import moment from '../moment';
+
+var suffixes = {
+ 0: '-ші',
+ 1: '-ші',
+ 2: '-ші',
+ 3: '-ші',
+ 4: '-ші',
+ 5: '-ші',
+ 6: '-шы',
+ 7: '-ші',
+ 8: '-ші',
+ 9: '-шы',
+ 10: '-шы',
+ 20: '-шы',
+ 30: '-шы',
+ 40: '-шы',
+ 50: '-ші',
+ 60: '-шы',
+ 70: '-ші',
+ 80: '-ші',
+ 90: '-шы',
+ 100: '-ші'
+};
+
+export default moment.defineLocale('kk', {
+ months : 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split('_'),
+ monthsShort : 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'),
+ weekdays : 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split('_'),
+ weekdaysShort : 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'),
+ weekdaysMin : 'жк_дй_сй_ср_бй_жм_сн'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Бүгін сағат] LT',
+ nextDay : '[Ертең сағат] LT',
+ nextWeek : 'dddd [сағат] LT',
+ lastDay : '[Кеше сағат] LT',
+ lastWeek : '[Өткен аптаның] dddd [сағат] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s ішінде',
+ past : '%s бұрын',
+ s : 'бірнеше секунд',
+ m : 'бір минут',
+ mm : '%d минут',
+ h : 'бір сағат',
+ hh : '%d сағат',
+ d : 'бір күн',
+ dd : '%d күн',
+ M : 'бір ай',
+ MM : '%d ай',
+ y : 'бір жыл',
+ yy : '%d жыл'
+ },
+ ordinalParse: /\d{1,2}-(ші|шы)/,
+ ordinal : function (number) {
+ var a = number % 10,
+ b = number >= 100 ? 100 : null;
+ return number + (suffixes[number] || suffixes[a] || suffixes[b]);
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/km.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/km.js
new file mode 100644
index 00000000000..8ae00be7654
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/km.js
@@ -0,0 +1,49 @@
+//! moment.js locale configuration
+//! locale : Cambodian [km]
+//! author : Kruy Vanna : https://github.com/kruyvanna
+
+import moment from '../moment';
+
+export default moment.defineLocale('km', {
+ months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
+ monthsShort: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
+ weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
+ weekdaysShort: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
+ weekdaysMin: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY HH:mm',
+ LLLL: 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar: {
+ sameDay: '[ថ្ងៃនេះ ម៉ោង] LT',
+ nextDay: '[ស្អែក ម៉ោង] LT',
+ nextWeek: 'dddd [ម៉ោង] LT',
+ lastDay: '[ម្សិលមិញ ម៉ោង] LT',
+ lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: '%sទៀត',
+ past: '%sមុន',
+ s: 'ប៉ុន្មានវិនាទី',
+ m: 'មួយនាទី',
+ mm: '%d នាទី',
+ h: 'មួយម៉ោង',
+ hh: '%d ម៉ោង',
+ d: 'មួយថ្ងៃ',
+ dd: '%d ថ្ងៃ',
+ M: 'មួយខែ',
+ MM: '%d ខែ',
+ y: 'មួយឆ្នាំ',
+ yy: '%d ឆ្នាំ'
+ },
+ week: {
+ dow: 1, // Monday is the first day of the week.
+ doy: 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ko.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ko.js
new file mode 100644
index 00000000000..6941fa5261c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ko.js
@@ -0,0 +1,56 @@
+//! moment.js locale configuration
+//! locale : Korean [ko]
+//! author : Kyungwook, Park : https://github.com/kyungw00k
+//! author : Jeeeyul Lee <jeeeyul@gmail.com>
+
+import moment from '../moment';
+
+export default moment.defineLocale('ko', {
+ months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
+ monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
+ weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),
+ weekdaysShort : '일_월_화_수_목_금_토'.split('_'),
+ weekdaysMin : '일_월_화_수_목_금_토'.split('_'),
+ longDateFormat : {
+ LT : 'A h시 m분',
+ LTS : 'A h시 m분 s초',
+ L : 'YYYY.MM.DD',
+ LL : 'YYYY년 MMMM D일',
+ LLL : 'YYYY년 MMMM D일 A h시 m분',
+ LLLL : 'YYYY년 MMMM D일 dddd A h시 m분'
+ },
+ calendar : {
+ sameDay : '오늘 LT',
+ nextDay : '내일 LT',
+ nextWeek : 'dddd LT',
+ lastDay : '어제 LT',
+ lastWeek : '지난주 dddd LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s 후',
+ past : '%s 전',
+ s : '몇 초',
+ ss : '%d초',
+ m : '일분',
+ mm : '%d분',
+ h : '한 시간',
+ hh : '%d시간',
+ d : '하루',
+ dd : '%d일',
+ M : '한 달',
+ MM : '%d달',
+ y : '일 년',
+ yy : '%d년'
+ },
+ ordinalParse : /\d{1,2}일/,
+ ordinal : '%d일',
+ meridiemParse : /오전|오후/,
+ isPM : function (token) {
+ return token === '오후';
+ },
+ meridiem : function (hour, minute, isUpper) {
+ return hour < 12 ? '오전' : '오후';
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ky.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ky.js
new file mode 100644
index 00000000000..566677c8109
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ky.js
@@ -0,0 +1,78 @@
+//! moment.js locale configuration
+//! locale : Kyrgyz [ky]
+//! author : Chyngyz Arystan uulu : https://github.com/chyngyz
+
+
+import moment from '../moment';
+
+var suffixes = {
+ 0: '-чү',
+ 1: '-чи',
+ 2: '-чи',
+ 3: '-чү',
+ 4: '-чү',
+ 5: '-чи',
+ 6: '-чы',
+ 7: '-чи',
+ 8: '-чи',
+ 9: '-чу',
+ 10: '-чу',
+ 20: '-чы',
+ 30: '-чу',
+ 40: '-чы',
+ 50: '-чү',
+ 60: '-чы',
+ 70: '-чи',
+ 80: '-чи',
+ 90: '-чу',
+ 100: '-чү'
+};
+
+export default moment.defineLocale('ky', {
+ months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
+ monthsShort : 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),
+ weekdays : 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split('_'),
+ weekdaysShort : 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'),
+ weekdaysMin : 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Бүгүн саат] LT',
+ nextDay : '[Эртең саат] LT',
+ nextWeek : 'dddd [саат] LT',
+ lastDay : '[Кече саат] LT',
+ lastWeek : '[Өткен аптанын] dddd [күнү] [саат] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s ичинде',
+ past : '%s мурун',
+ s : 'бирнече секунд',
+ m : 'бир мүнөт',
+ mm : '%d мүнөт',
+ h : 'бир саат',
+ hh : '%d саат',
+ d : 'бир күн',
+ dd : '%d күн',
+ M : 'бир ай',
+ MM : '%d ай',
+ y : 'бир жыл',
+ yy : '%d жыл'
+ },
+ ordinalParse: /\d{1,2}-(чи|чы|чү|чу)/,
+ ordinal : function (number) {
+ var a = number % 10,
+ b = number >= 100 ? 100 : null;
+ return number + (suffixes[number] || suffixes[a] || suffixes[b]);
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/lb.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/lb.js
new file mode 100644
index 00000000000..843b7adf253
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/lb.js
@@ -0,0 +1,128 @@
+//! moment.js locale configuration
+//! locale : Luxembourgish [lb]
+//! author : mweimerskirch : https://github.com/mweimerskirch
+//! author : David Raison : https://github.com/kwisatz
+
+import moment from '../moment';
+
+function processRelativeTime(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 'm': ['eng Minutt', 'enger Minutt'],
+ 'h': ['eng Stonn', 'enger Stonn'],
+ 'd': ['een Dag', 'engem Dag'],
+ 'M': ['ee Mount', 'engem Mount'],
+ 'y': ['ee Joer', 'engem Joer']
+ };
+ return withoutSuffix ? format[key][0] : format[key][1];
+}
+function processFutureTime(string) {
+ var number = string.substr(0, string.indexOf(' '));
+ if (eifelerRegelAppliesToNumber(number)) {
+ return 'a ' + string;
+ }
+ return 'an ' + string;
+}
+function processPastTime(string) {
+ var number = string.substr(0, string.indexOf(' '));
+ if (eifelerRegelAppliesToNumber(number)) {
+ return 'viru ' + string;
+ }
+ return 'virun ' + string;
+}
+/**
+ * Returns true if the word before the given number loses the '-n' ending.
+ * e.g. 'an 10 Deeg' but 'a 5 Deeg'
+ *
+ * @param number {integer}
+ * @returns {boolean}
+ */
+function eifelerRegelAppliesToNumber(number) {
+ number = parseInt(number, 10);
+ if (isNaN(number)) {
+ return false;
+ }
+ if (number < 0) {
+ // Negative Number --> always true
+ return true;
+ } else if (number < 10) {
+ // Only 1 digit
+ if (4 <= number && number <= 7) {
+ return true;
+ }
+ return false;
+ } else if (number < 100) {
+ // 2 digits
+ var lastDigit = number % 10, firstDigit = number / 10;
+ if (lastDigit === 0) {
+ return eifelerRegelAppliesToNumber(firstDigit);
+ }
+ return eifelerRegelAppliesToNumber(lastDigit);
+ } else if (number < 10000) {
+ // 3 or 4 digits --> recursively check first digit
+ while (number >= 10) {
+ number = number / 10;
+ }
+ return eifelerRegelAppliesToNumber(number);
+ } else {
+ // Anything larger than 4 digits: recursively check first n-3 digits
+ number = number / 1000;
+ return eifelerRegelAppliesToNumber(number);
+ }
+}
+
+export default moment.defineLocale('lb', {
+ months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
+ monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+ monthsParseExact : true,
+ weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'),
+ weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'),
+ weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat: {
+ LT: 'H:mm [Auer]',
+ LTS: 'H:mm:ss [Auer]',
+ L: 'DD.MM.YYYY',
+ LL: 'D. MMMM YYYY',
+ LLL: 'D. MMMM YYYY H:mm [Auer]',
+ LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]'
+ },
+ calendar: {
+ sameDay: '[Haut um] LT',
+ sameElse: 'L',
+ nextDay: '[Muer um] LT',
+ nextWeek: 'dddd [um] LT',
+ lastDay: '[Gëschter um] LT',
+ lastWeek: function () {
+ // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule
+ switch (this.day()) {
+ case 2:
+ case 4:
+ return '[Leschten] dddd [um] LT';
+ default:
+ return '[Leschte] dddd [um] LT';
+ }
+ }
+ },
+ relativeTime : {
+ future : processFutureTime,
+ past : processPastTime,
+ s : 'e puer Sekonnen',
+ m : processRelativeTime,
+ mm : '%d Minutten',
+ h : processRelativeTime,
+ hh : '%d Stonnen',
+ d : processRelativeTime,
+ dd : '%d Deeg',
+ M : processRelativeTime,
+ MM : '%d Méint',
+ y : processRelativeTime,
+ yy : '%d Joer'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal: '%d.',
+ week: {
+ dow: 1, // Monday is the first day of the week.
+ doy: 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/lo.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/lo.js
new file mode 100644
index 00000000000..5f6ad7d5ca5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/lo.js
@@ -0,0 +1,61 @@
+//! moment.js locale configuration
+//! locale : Lao [lo]
+//! author : Ryan Hart : https://github.com/ryanhart2
+
+import moment from '../moment';
+
+export default moment.defineLocale('lo', {
+ months : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'),
+ monthsShort : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'),
+ weekdays : 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
+ weekdaysShort : 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
+ weekdaysMin : 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'ວັນdddd D MMMM YYYY HH:mm'
+ },
+ meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/,
+ isPM: function (input) {
+ return input === 'ຕອນແລງ';
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'ຕອນເຊົ້າ';
+ } else {
+ return 'ຕອນແລງ';
+ }
+ },
+ calendar : {
+ sameDay : '[ມື້ນີ້ເວລາ] LT',
+ nextDay : '[ມື້ອື່ນເວລາ] LT',
+ nextWeek : '[ວັນ]dddd[ໜ້າເວລາ] LT',
+ lastDay : '[ມື້ວານນີ້ເວລາ] LT',
+ lastWeek : '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'ອີກ %s',
+ past : '%sຜ່ານມາ',
+ s : 'ບໍ່ເທົ່າໃດວິນາທີ',
+ m : '1 ນາທີ',
+ mm : '%d ນາທີ',
+ h : '1 ຊົ່ວໂມງ',
+ hh : '%d ຊົ່ວໂມງ',
+ d : '1 ມື້',
+ dd : '%d ມື້',
+ M : '1 ເດືອນ',
+ MM : '%d ເດືອນ',
+ y : '1 ປີ',
+ yy : '%d ປີ'
+ },
+ ordinalParse: /(ທີ່)\d{1,2}/,
+ ordinal : function (number) {
+ return 'ທີ່' + number;
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/lt.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/lt.js
new file mode 100644
index 00000000000..363f193609d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/lt.js
@@ -0,0 +1,108 @@
+//! moment.js locale configuration
+//! locale : Lithuanian [lt]
+//! author : Mindaugas Mozūras : https://github.com/mmozuras
+
+import moment from '../moment';
+
+var units = {
+ 'm' : 'minutė_minutės_minutę',
+ 'mm': 'minutės_minučių_minutes',
+ 'h' : 'valanda_valandos_valandą',
+ 'hh': 'valandos_valandų_valandas',
+ 'd' : 'diena_dienos_dieną',
+ 'dd': 'dienos_dienų_dienas',
+ 'M' : 'mėnuo_mėnesio_mėnesį',
+ 'MM': 'mėnesiai_mėnesių_mėnesius',
+ 'y' : 'metai_metų_metus',
+ 'yy': 'metai_metų_metus'
+};
+function translateSeconds(number, withoutSuffix, key, isFuture) {
+ if (withoutSuffix) {
+ return 'kelios sekundės';
+ } else {
+ return isFuture ? 'kelių sekundžių' : 'kelias sekundes';
+ }
+}
+function translateSingular(number, withoutSuffix, key, isFuture) {
+ return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]);
+}
+function special(number) {
+ return number % 10 === 0 || (number > 10 && number < 20);
+}
+function forms(key) {
+ return units[key].split('_');
+}
+function translate(number, withoutSuffix, key, isFuture) {
+ var result = number + ' ';
+ if (number === 1) {
+ return result + translateSingular(number, withoutSuffix, key[0], isFuture);
+ } else if (withoutSuffix) {
+ return result + (special(number) ? forms(key)[1] : forms(key)[0]);
+ } else {
+ if (isFuture) {
+ return result + forms(key)[1];
+ } else {
+ return result + (special(number) ? forms(key)[1] : forms(key)[2]);
+ }
+ }
+}
+export default moment.defineLocale('lt', {
+ months : {
+ format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'),
+ standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'),
+ isFormat: /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/
+ },
+ monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),
+ weekdays : {
+ format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split('_'),
+ standalone: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'),
+ isFormat: /dddd HH:mm/
+ },
+ weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'),
+ weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'YYYY-MM-DD',
+ LL : 'YYYY [m.] MMMM D [d.]',
+ LLL : 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
+ LLLL : 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]',
+ l : 'YYYY-MM-DD',
+ ll : 'YYYY [m.] MMMM D [d.]',
+ lll : 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
+ llll : 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]'
+ },
+ calendar : {
+ sameDay : '[Šiandien] LT',
+ nextDay : '[Rytoj] LT',
+ nextWeek : 'dddd LT',
+ lastDay : '[Vakar] LT',
+ lastWeek : '[Praėjusį] dddd LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'po %s',
+ past : 'prieš %s',
+ s : translateSeconds,
+ m : translateSingular,
+ mm : translate,
+ h : translateSingular,
+ hh : translate,
+ d : translateSingular,
+ dd : translate,
+ M : translateSingular,
+ MM : translate,
+ y : translateSingular,
+ yy : translate
+ },
+ ordinalParse: /\d{1,2}-oji/,
+ ordinal : function (number) {
+ return number + '-oji';
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/lv.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/lv.js
new file mode 100644
index 00000000000..5afe0b7af52
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/lv.js
@@ -0,0 +1,88 @@
+//! moment.js locale configuration
+//! locale : Latvian [lv]
+//! author : Kristaps Karlsons : https://github.com/skakri
+//! author : Jānis Elmeris : https://github.com/JanisE
+
+import moment from '../moment';
+
+var units = {
+ 'm': 'minūtes_minūtēm_minūte_minūtes'.split('_'),
+ 'mm': 'minūtes_minūtēm_minūte_minūtes'.split('_'),
+ 'h': 'stundas_stundām_stunda_stundas'.split('_'),
+ 'hh': 'stundas_stundām_stunda_stundas'.split('_'),
+ 'd': 'dienas_dienām_diena_dienas'.split('_'),
+ 'dd': 'dienas_dienām_diena_dienas'.split('_'),
+ 'M': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
+ 'MM': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
+ 'y': 'gada_gadiem_gads_gadi'.split('_'),
+ 'yy': 'gada_gadiem_gads_gadi'.split('_')
+};
+/**
+ * @param withoutSuffix boolean true = a length of time; false = before/after a period of time.
+ */
+function format(forms, number, withoutSuffix) {
+ if (withoutSuffix) {
+ // E.g. "21 minūte", "3 minūtes".
+ return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3];
+ } else {
+ // E.g. "21 minūtes" as in "pēc 21 minūtes".
+ // E.g. "3 minūtēm" as in "pēc 3 minūtēm".
+ return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1];
+ }
+}
+function relativeTimeWithPlural(number, withoutSuffix, key) {
+ return number + ' ' + format(units[key], number, withoutSuffix);
+}
+function relativeTimeWithSingular(number, withoutSuffix, key) {
+ return format(units[key], number, withoutSuffix);
+}
+function relativeSeconds(number, withoutSuffix) {
+ return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm';
+}
+
+export default moment.defineLocale('lv', {
+ months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),
+ weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'),
+ weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'),
+ weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY.',
+ LL : 'YYYY. [gada] D. MMMM',
+ LLL : 'YYYY. [gada] D. MMMM, HH:mm',
+ LLLL : 'YYYY. [gada] D. MMMM, dddd, HH:mm'
+ },
+ calendar : {
+ sameDay : '[Šodien pulksten] LT',
+ nextDay : '[Rīt pulksten] LT',
+ nextWeek : 'dddd [pulksten] LT',
+ lastDay : '[Vakar pulksten] LT',
+ lastWeek : '[Pagājušā] dddd [pulksten] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'pēc %s',
+ past : 'pirms %s',
+ s : relativeSeconds,
+ m : relativeTimeWithSingular,
+ mm : relativeTimeWithPlural,
+ h : relativeTimeWithSingular,
+ hh : relativeTimeWithPlural,
+ d : relativeTimeWithSingular,
+ dd : relativeTimeWithPlural,
+ M : relativeTimeWithSingular,
+ MM : relativeTimeWithPlural,
+ y : relativeTimeWithSingular,
+ yy : relativeTimeWithPlural
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/me.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/me.js
new file mode 100644
index 00000000000..1635cb500f9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/me.js
@@ -0,0 +1,101 @@
+//! moment.js locale configuration
+//! locale : Montenegrin [me]
+//! author : Miodrag Nikač <miodrag@restartit.me> : https://github.com/miodragnikac
+
+import moment from '../moment';
+
+var translator = {
+ words: { //Different grammatical cases
+ m: ['jedan minut', 'jednog minuta'],
+ mm: ['minut', 'minuta', 'minuta'],
+ h: ['jedan sat', 'jednog sata'],
+ hh: ['sat', 'sata', 'sati'],
+ dd: ['dan', 'dana', 'dana'],
+ MM: ['mjesec', 'mjeseca', 'mjeseci'],
+ yy: ['godina', 'godine', 'godina']
+ },
+ correctGrammaticalCase: function (number, wordKey) {
+ return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
+ },
+ translate: function (number, withoutSuffix, key) {
+ var wordKey = translator.words[key];
+ if (key.length === 1) {
+ return withoutSuffix ? wordKey[0] : wordKey[1];
+ } else {
+ return number + ' ' + translator.correctGrammaticalCase(number, wordKey);
+ }
+ }
+};
+
+export default moment.defineLocale('me', {
+ months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'),
+ monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
+ monthsParseExact : true,
+ weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
+ weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
+ weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat: {
+ LT: 'H:mm',
+ LTS : 'H:mm:ss',
+ L: 'DD.MM.YYYY',
+ LL: 'D. MMMM YYYY',
+ LLL: 'D. MMMM YYYY H:mm',
+ LLLL: 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar: {
+ sameDay: '[danas u] LT',
+ nextDay: '[sjutra u] LT',
+
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[u] [nedjelju] [u] LT';
+ case 3:
+ return '[u] [srijedu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ },
+ lastDay : '[juče u] LT',
+ lastWeek : function () {
+ var lastWeekDays = [
+ '[prošle] [nedjelje] [u] LT',
+ '[prošlog] [ponedjeljka] [u] LT',
+ '[prošlog] [utorka] [u] LT',
+ '[prošle] [srijede] [u] LT',
+ '[prošlog] [četvrtka] [u] LT',
+ '[prošlog] [petka] [u] LT',
+ '[prošle] [subote] [u] LT'
+ ];
+ return lastWeekDays[this.day()];
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'prije %s',
+ s : 'nekoliko sekundi',
+ m : translator.translate,
+ mm : translator.translate,
+ h : translator.translate,
+ hh : translator.translate,
+ d : 'dan',
+ dd : translator.translate,
+ M : 'mjesec',
+ MM : translator.translate,
+ y : 'godinu',
+ yy : translator.translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/mi.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/mi.js
new file mode 100644
index 00000000000..6c894bbe001
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/mi.js
@@ -0,0 +1,54 @@
+//! moment.js locale configuration
+//! locale : Maori [mi]
+//! author : John Corrigan <robbiecloset@gmail.com> : https://github.com/johnideal
+
+import moment from '../moment';
+
+export default moment.defineLocale('mi', {
+ months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split('_'),
+ monthsShort: 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split('_'),
+ monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
+ monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
+ monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
+ monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,
+ weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'),
+ weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
+ weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY [i] HH:mm',
+ LLLL: 'dddd, D MMMM YYYY [i] HH:mm'
+ },
+ calendar: {
+ sameDay: '[i teie mahana, i] LT',
+ nextDay: '[apopo i] LT',
+ nextWeek: 'dddd [i] LT',
+ lastDay: '[inanahi i] LT',
+ lastWeek: 'dddd [whakamutunga i] LT',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: 'i roto i %s',
+ past: '%s i mua',
+ s: 'te hēkona ruarua',
+ m: 'he meneti',
+ mm: '%d meneti',
+ h: 'te haora',
+ hh: '%d haora',
+ d: 'he ra',
+ dd: '%d ra',
+ M: 'he marama',
+ MM: '%d marama',
+ y: 'he tau',
+ yy: '%d tau'
+ },
+ ordinalParse: /\d{1,2}º/,
+ ordinal: '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/mk.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/mk.js
new file mode 100644
index 00000000000..ccd7a161878
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/mk.js
@@ -0,0 +1,81 @@
+//! moment.js locale configuration
+//! locale : Macedonian [mk]
+//! author : Borislav Mickov : https://github.com/B0k0
+
+import moment from '../moment';
+
+export default moment.defineLocale('mk', {
+ months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'),
+ monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),
+ weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'),
+ weekdaysShort : 'нед_пон_вто_сре_чет_пет_саб'.split('_'),
+ weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'D.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY H:mm',
+ LLLL : 'dddd, D MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[Денес во] LT',
+ nextDay : '[Утре во] LT',
+ nextWeek : '[Во] dddd [во] LT',
+ lastDay : '[Вчера во] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ case 6:
+ return '[Изминатата] dddd [во] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[Изминатиот] dddd [во] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'после %s',
+ past : 'пред %s',
+ s : 'неколку секунди',
+ m : 'минута',
+ mm : '%d минути',
+ h : 'час',
+ hh : '%d часа',
+ d : 'ден',
+ dd : '%d дена',
+ M : 'месец',
+ MM : '%d месеци',
+ y : 'година',
+ yy : '%d години'
+ },
+ ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
+ ordinal : function (number) {
+ var lastDigit = number % 10,
+ last2Digits = number % 100;
+ if (number === 0) {
+ return number + '-ев';
+ } else if (last2Digits === 0) {
+ return number + '-ен';
+ } else if (last2Digits > 10 && last2Digits < 20) {
+ return number + '-ти';
+ } else if (lastDigit === 1) {
+ return number + '-ви';
+ } else if (lastDigit === 2) {
+ return number + '-ри';
+ } else if (lastDigit === 7 || lastDigit === 8) {
+ return number + '-ми';
+ } else {
+ return number + '-ти';
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ml.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ml.js
new file mode 100644
index 00000000000..c3df98818e4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ml.js
@@ -0,0 +1,72 @@
+//! moment.js locale configuration
+//! locale : Malayalam [ml]
+//! author : Floyd Pink : https://github.com/floydpink
+
+import moment from '../moment';
+
+export default moment.defineLocale('ml', {
+ months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'),
+ monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'),
+ weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'),
+ weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm -നു',
+ LTS : 'A h:mm:ss -നു',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm -നു',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm -നു'
+ },
+ calendar : {
+ sameDay : '[ഇന്ന്] LT',
+ nextDay : '[നാളെ] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[ഇന്നലെ] LT',
+ lastWeek : '[കഴിഞ്ഞ] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s കഴിഞ്ഞ്',
+ past : '%s മുൻപ്',
+ s : 'അൽപ നിമിഷങ്ങൾ',
+ m : 'ഒരു മിനിറ്റ്',
+ mm : '%d മിനിറ്റ്',
+ h : 'ഒരു മണിക്കൂർ',
+ hh : '%d മണിക്കൂർ',
+ d : 'ഒരു ദിവസം',
+ dd : '%d ദിവസം',
+ M : 'ഒരു മാസം',
+ MM : '%d മാസം',
+ y : 'ഒരു വർഷം',
+ yy : '%d വർഷം'
+ },
+ meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if ((meridiem === 'രാത്രി' && hour >= 4) ||
+ meridiem === 'ഉച്ച കഴിഞ്ഞ്' ||
+ meridiem === 'വൈകുന്നേരം') {
+ return hour + 12;
+ } else {
+ return hour;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'രാത്രി';
+ } else if (hour < 12) {
+ return 'രാവിലെ';
+ } else if (hour < 17) {
+ return 'ഉച്ച കഴിഞ്ഞ്';
+ } else if (hour < 20) {
+ return 'വൈകുന്നേരം';
+ } else {
+ return 'രാത്രി';
+ }
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/mr.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/mr.js
new file mode 100644
index 00000000000..08cc3e02bee
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/mr.js
@@ -0,0 +1,150 @@
+//! moment.js locale configuration
+//! locale : Marathi [mr]
+//! author : Harshad Kale : https://github.com/kalehv
+//! author : Vivek Athalye : https://github.com/vnathalye
+
+import moment from '../moment';
+
+var symbolMap = {
+ '1': '१',
+ '2': '२',
+ '3': '३',
+ '4': '४',
+ '5': '५',
+ '6': '६',
+ '7': '७',
+ '8': '८',
+ '9': '९',
+ '0': '०'
+},
+numberMap = {
+ '१': '1',
+ '२': '2',
+ '३': '3',
+ '४': '4',
+ '५': '5',
+ '६': '6',
+ '७': '7',
+ '८': '8',
+ '९': '9',
+ '०': '0'
+};
+
+function relativeTimeMr(number, withoutSuffix, string, isFuture)
+{
+ var output = '';
+ if (withoutSuffix) {
+ switch (string) {
+ case 's': output = 'काही सेकंद'; break;
+ case 'm': output = 'एक मिनिट'; break;
+ case 'mm': output = '%d मिनिटे'; break;
+ case 'h': output = 'एक तास'; break;
+ case 'hh': output = '%d तास'; break;
+ case 'd': output = 'एक दिवस'; break;
+ case 'dd': output = '%d दिवस'; break;
+ case 'M': output = 'एक महिना'; break;
+ case 'MM': output = '%d महिने'; break;
+ case 'y': output = 'एक वर्ष'; break;
+ case 'yy': output = '%d वर्षे'; break;
+ }
+ }
+ else {
+ switch (string) {
+ case 's': output = 'काही सेकंदां'; break;
+ case 'm': output = 'एका मिनिटा'; break;
+ case 'mm': output = '%d मिनिटां'; break;
+ case 'h': output = 'एका तासा'; break;
+ case 'hh': output = '%d तासां'; break;
+ case 'd': output = 'एका दिवसा'; break;
+ case 'dd': output = '%d दिवसां'; break;
+ case 'M': output = 'एका महिन्या'; break;
+ case 'MM': output = '%d महिन्यां'; break;
+ case 'y': output = 'एका वर्षा'; break;
+ case 'yy': output = '%d वर्षां'; break;
+ }
+ }
+ return output.replace(/%d/i, number);
+}
+
+export default moment.defineLocale('mr', {
+ months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'),
+ monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
+ weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'),
+ weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm वाजता',
+ LTS : 'A h:mm:ss वाजता',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm वाजता',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm वाजता'
+ },
+ calendar : {
+ sameDay : '[आज] LT',
+ nextDay : '[उद्या] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[काल] LT',
+ lastWeek: '[मागील] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future: '%sमध्ये',
+ past: '%sपूर्वी',
+ s: relativeTimeMr,
+ m: relativeTimeMr,
+ mm: relativeTimeMr,
+ h: relativeTimeMr,
+ hh: relativeTimeMr,
+ d: relativeTimeMr,
+ dd: relativeTimeMr,
+ M: relativeTimeMr,
+ MM: relativeTimeMr,
+ y: relativeTimeMr,
+ yy: relativeTimeMr
+ },
+ preparse: function (string) {
+ return string.replace(/[१२३४५६७८९०]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ meridiemParse: /रात्री|सकाळी|दुपारी|सायंकाळी/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'रात्री') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'सकाळी') {
+ return hour;
+ } else if (meridiem === 'दुपारी') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'सायंकाळी') {
+ return hour + 12;
+ }
+ },
+ meridiem: function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'रात्री';
+ } else if (hour < 10) {
+ return 'सकाळी';
+ } else if (hour < 17) {
+ return 'दुपारी';
+ } else if (hour < 20) {
+ return 'सायंकाळी';
+ } else {
+ return 'रात्री';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ms-my.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ms-my.js
new file mode 100644
index 00000000000..f5ea96f467c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ms-my.js
@@ -0,0 +1,74 @@
+//! moment.js locale configuration
+//! locale : Malay [ms-my]
+//! note : DEPRECATED, the correct one is [ms]
+//! author : Weldan Jamili : https://github.com/weldan
+
+import moment from '../moment';
+
+export default moment.defineLocale('ms-my', {
+ months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),
+ monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
+ weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
+ weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
+ weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [pukul] HH.mm',
+ LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+ },
+ meridiemParse: /pagi|tengahari|petang|malam/,
+ meridiemHour: function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'pagi') {
+ return hour;
+ } else if (meridiem === 'tengahari') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'petang' || meridiem === 'malam') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'pagi';
+ } else if (hours < 15) {
+ return 'tengahari';
+ } else if (hours < 19) {
+ return 'petang';
+ } else {
+ return 'malam';
+ }
+ },
+ calendar : {
+ sameDay : '[Hari ini pukul] LT',
+ nextDay : '[Esok pukul] LT',
+ nextWeek : 'dddd [pukul] LT',
+ lastDay : '[Kelmarin pukul] LT',
+ lastWeek : 'dddd [lepas pukul] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'dalam %s',
+ past : '%s yang lepas',
+ s : 'beberapa saat',
+ m : 'seminit',
+ mm : '%d minit',
+ h : 'sejam',
+ hh : '%d jam',
+ d : 'sehari',
+ dd : '%d hari',
+ M : 'sebulan',
+ MM : '%d bulan',
+ y : 'setahun',
+ yy : '%d tahun'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ms.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ms.js
new file mode 100644
index 00000000000..44c3e373010
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ms.js
@@ -0,0 +1,73 @@
+//! moment.js locale configuration
+//! locale : Malay [ms]
+//! author : Weldan Jamili : https://github.com/weldan
+
+import moment from '../moment';
+
+export default moment.defineLocale('ms', {
+ months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),
+ monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
+ weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
+ weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
+ weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [pukul] HH.mm',
+ LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+ },
+ meridiemParse: /pagi|tengahari|petang|malam/,
+ meridiemHour: function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'pagi') {
+ return hour;
+ } else if (meridiem === 'tengahari') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'petang' || meridiem === 'malam') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'pagi';
+ } else if (hours < 15) {
+ return 'tengahari';
+ } else if (hours < 19) {
+ return 'petang';
+ } else {
+ return 'malam';
+ }
+ },
+ calendar : {
+ sameDay : '[Hari ini pukul] LT',
+ nextDay : '[Esok pukul] LT',
+ nextWeek : 'dddd [pukul] LT',
+ lastDay : '[Kelmarin pukul] LT',
+ lastWeek : 'dddd [lepas pukul] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'dalam %s',
+ past : '%s yang lepas',
+ s : 'beberapa saat',
+ m : 'seminit',
+ mm : '%d minit',
+ h : 'sejam',
+ hh : '%d jam',
+ d : 'sehari',
+ dd : '%d hari',
+ M : 'sebulan',
+ MM : '%d bulan',
+ y : 'setahun',
+ yy : '%d tahun'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/my.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/my.js
new file mode 100644
index 00000000000..401d06e911e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/my.js
@@ -0,0 +1,86 @@
+//! moment.js locale configuration
+//! locale : Burmese [my]
+//! author : Squar team, mysquar.com
+//! author : David Rossellat : https://github.com/gholadr
+//! author : Tin Aung Lin : https://github.com/thanyawzinmin
+
+import moment from '../moment';
+
+var symbolMap = {
+ '1': '၁',
+ '2': '၂',
+ '3': '၃',
+ '4': '၄',
+ '5': '၅',
+ '6': '၆',
+ '7': '၇',
+ '8': '၈',
+ '9': '၉',
+ '0': '၀'
+}, numberMap = {
+ '၁': '1',
+ '၂': '2',
+ '၃': '3',
+ '၄': '4',
+ '၅': '5',
+ '၆': '6',
+ '၇': '7',
+ '၈': '8',
+ '၉': '9',
+ '၀': '0'
+};
+
+export default moment.defineLocale('my', {
+ months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'),
+ monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'),
+ weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'),
+ weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+ weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY HH:mm',
+ LLLL: 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar: {
+ sameDay: '[ယနေ.] LT [မှာ]',
+ nextDay: '[မနက်ဖြန်] LT [မှာ]',
+ nextWeek: 'dddd LT [မှာ]',
+ lastDay: '[မနေ.က] LT [မှာ]',
+ lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: 'လာမည့် %s မှာ',
+ past: 'လွန်ခဲ့သော %s က',
+ s: 'စက္ကန်.အနည်းငယ်',
+ m: 'တစ်မိနစ်',
+ mm: '%d မိနစ်',
+ h: 'တစ်နာရီ',
+ hh: '%d နာရီ',
+ d: 'တစ်ရက်',
+ dd: '%d ရက်',
+ M: 'တစ်လ',
+ MM: '%d လ',
+ y: 'တစ်နှစ်',
+ yy: '%d နှစ်'
+ },
+ preparse: function (string) {
+ return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ week: {
+ dow: 1, // Monday is the first day of the week.
+ doy: 4 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/nb.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/nb.js
new file mode 100644
index 00000000000..00744383c5b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/nb.js
@@ -0,0 +1,54 @@
+//! moment.js locale configuration
+//! locale : Norwegian Bokmål [nb]
+//! authors : Espen Hovlandsdal : https://github.com/rexxars
+//! Sigurd Gartmann : https://github.com/sigurdga
+
+import moment from '../moment';
+
+export default moment.defineLocale('nb', {
+ months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
+ monthsShort : 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
+ weekdaysShort : 'sø._ma._ti._on._to._fr._lø.'.split('_'),
+ weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY [kl.] HH:mm',
+ LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm'
+ },
+ calendar : {
+ sameDay: '[i dag kl.] LT',
+ nextDay: '[i morgen kl.] LT',
+ nextWeek: 'dddd [kl.] LT',
+ lastDay: '[i går kl.] LT',
+ lastWeek: '[forrige] dddd [kl.] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'om %s',
+ past : '%s siden',
+ s : 'noen sekunder',
+ m : 'ett minutt',
+ mm : '%d minutter',
+ h : 'en time',
+ hh : '%d timer',
+ d : 'en dag',
+ dd : '%d dager',
+ M : 'en måned',
+ MM : '%d måneder',
+ y : 'ett år',
+ yy : '%d år'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ne.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ne.js
new file mode 100644
index 00000000000..a82cb95b39e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ne.js
@@ -0,0 +1,114 @@
+//! moment.js locale configuration
+//! locale : Nepalese [ne]
+//! author : suvash : https://github.com/suvash
+
+import moment from '../moment';
+
+var symbolMap = {
+ '1': '१',
+ '2': '२',
+ '3': '३',
+ '4': '४',
+ '5': '५',
+ '6': '६',
+ '7': '७',
+ '8': '८',
+ '9': '९',
+ '0': '०'
+},
+numberMap = {
+ '१': '1',
+ '२': '2',
+ '३': '3',
+ '४': '4',
+ '५': '5',
+ '६': '6',
+ '७': '7',
+ '८': '8',
+ '९': '9',
+ '०': '0'
+};
+
+export default moment.defineLocale('ne', {
+ months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'),
+ monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'),
+ weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'),
+ weekdaysMin : 'आ._सो._मं._बु._बि._शु._श.'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'Aको h:mm बजे',
+ LTS : 'Aको h:mm:ss बजे',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, Aको h:mm बजे',
+ LLLL : 'dddd, D MMMM YYYY, Aको h:mm बजे'
+ },
+ preparse: function (string) {
+ return string.replace(/[१२३४५६७८९०]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ meridiemParse: /राति|बिहान|दिउँसो|साँझ/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'राति') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'बिहान') {
+ return hour;
+ } else if (meridiem === 'दिउँसो') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'साँझ') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 3) {
+ return 'राति';
+ } else if (hour < 12) {
+ return 'बिहान';
+ } else if (hour < 16) {
+ return 'दिउँसो';
+ } else if (hour < 20) {
+ return 'साँझ';
+ } else {
+ return 'राति';
+ }
+ },
+ calendar : {
+ sameDay : '[आज] LT',
+ nextDay : '[भोलि] LT',
+ nextWeek : '[आउँदो] dddd[,] LT',
+ lastDay : '[हिजो] LT',
+ lastWeek : '[गएको] dddd[,] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%sमा',
+ past : '%s अगाडि',
+ s : 'केही क्षण',
+ m : 'एक मिनेट',
+ mm : '%d मिनेट',
+ h : 'एक घण्टा',
+ hh : '%d घण्टा',
+ d : 'एक दिन',
+ dd : '%d दिन',
+ M : 'एक महिना',
+ MM : '%d महिना',
+ y : 'एक बर्ष',
+ yy : '%d बर्ष'
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/nl-be.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/nl-be.js
new file mode 100644
index 00000000000..159eee3871f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/nl-be.js
@@ -0,0 +1,77 @@
+//! moment.js locale configuration
+//! locale : Dutch (Belgium) [nl-be]
+//! author : Joris Röling : https://github.com/jorisroling
+//! author : Jacob Middag : https://github.com/middagj
+
+import moment from '../moment';
+
+var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),
+ monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_');
+
+var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i];
+var monthsRegex = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;
+
+export default moment.defineLocale('nl-be', {
+ months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShortWithoutDots[m.month()];
+ } else {
+ return monthsShortWithDots[m.month()];
+ }
+ },
+
+ monthsRegex: monthsRegex,
+ monthsShortRegex: monthsRegex,
+ monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,
+ monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,
+
+ monthsParse : monthsParse,
+ longMonthsParse : monthsParse,
+ shortMonthsParse : monthsParse,
+
+ weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
+ weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'),
+ weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[vandaag om] LT',
+ nextDay: '[morgen om] LT',
+ nextWeek: 'dddd [om] LT',
+ lastDay: '[gisteren om] LT',
+ lastWeek: '[afgelopen] dddd [om] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'over %s',
+ past : '%s geleden',
+ s : 'een paar seconden',
+ m : 'één minuut',
+ mm : '%d minuten',
+ h : 'één uur',
+ hh : '%d uur',
+ d : 'één dag',
+ dd : '%d dagen',
+ M : 'één maand',
+ MM : '%d maanden',
+ y : 'één jaar',
+ yy : '%d jaar'
+ },
+ ordinalParse: /\d{1,2}(ste|de)/,
+ ordinal : function (number) {
+ return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/nl.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/nl.js
new file mode 100644
index 00000000000..0988cfe6a9e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/nl.js
@@ -0,0 +1,77 @@
+//! moment.js locale configuration
+//! locale : Dutch [nl]
+//! author : Joris Röling : https://github.com/jorisroling
+//! author : Jacob Middag : https://github.com/middagj
+
+import moment from '../moment';
+
+var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),
+ monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_');
+
+var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i];
+var monthsRegex = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;
+
+export default moment.defineLocale('nl', {
+ months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShortWithoutDots[m.month()];
+ } else {
+ return monthsShortWithDots[m.month()];
+ }
+ },
+
+ monthsRegex: monthsRegex,
+ monthsShortRegex: monthsRegex,
+ monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,
+ monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,
+
+ monthsParse : monthsParse,
+ longMonthsParse : monthsParse,
+ shortMonthsParse : monthsParse,
+
+ weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
+ weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'),
+ weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD-MM-YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[vandaag om] LT',
+ nextDay: '[morgen om] LT',
+ nextWeek: 'dddd [om] LT',
+ lastDay: '[gisteren om] LT',
+ lastWeek: '[afgelopen] dddd [om] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'over %s',
+ past : '%s geleden',
+ s : 'een paar seconden',
+ m : 'één minuut',
+ mm : '%d minuten',
+ h : 'één uur',
+ hh : '%d uur',
+ d : 'één dag',
+ dd : '%d dagen',
+ M : 'één maand',
+ MM : '%d maanden',
+ y : 'één jaar',
+ yy : '%d jaar'
+ },
+ ordinalParse: /\d{1,2}(ste|de)/,
+ ordinal : function (number) {
+ return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/nn.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/nn.js
new file mode 100644
index 00000000000..13ecbca43aa
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/nn.js
@@ -0,0 +1,51 @@
+//! moment.js locale configuration
+//! locale : Nynorsk [nn]
+//! author : https://github.com/mechuwind
+
+import moment from '../moment';
+
+export default moment.defineLocale('nn', {
+ months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
+ weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),
+ weekdaysShort : 'sun_mån_tys_ons_tor_fre_lau'.split('_'),
+ weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY [kl.] H:mm',
+ LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm'
+ },
+ calendar : {
+ sameDay: '[I dag klokka] LT',
+ nextDay: '[I morgon klokka] LT',
+ nextWeek: 'dddd [klokka] LT',
+ lastDay: '[I går klokka] LT',
+ lastWeek: '[Føregåande] dddd [klokka] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'om %s',
+ past : '%s sidan',
+ s : 'nokre sekund',
+ m : 'eit minutt',
+ mm : '%d minutt',
+ h : 'ein time',
+ hh : '%d timar',
+ d : 'ein dag',
+ dd : '%d dagar',
+ M : 'ein månad',
+ MM : '%d månader',
+ y : 'eit år',
+ yy : '%d år'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/pa-in.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/pa-in.js
new file mode 100644
index 00000000000..78da521659b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/pa-in.js
@@ -0,0 +1,115 @@
+//! moment.js locale configuration
+//! locale : Punjabi (India) [pa-in]
+//! author : Harpreet Singh : https://github.com/harpreetkhalsagtbit
+
+import moment from '../moment';
+
+var symbolMap = {
+ '1': '੧',
+ '2': '੨',
+ '3': '੩',
+ '4': '੪',
+ '5': '੫',
+ '6': '੬',
+ '7': '੭',
+ '8': '੮',
+ '9': '੯',
+ '0': '੦'
+},
+numberMap = {
+ '੧': '1',
+ '੨': '2',
+ '੩': '3',
+ '੪': '4',
+ '੫': '5',
+ '੬': '6',
+ '੭': '7',
+ '੮': '8',
+ '੯': '9',
+ '੦': '0'
+};
+
+export default moment.defineLocale('pa-in', {
+ // There are months name as per Nanakshahi Calender but they are not used as rigidly in modern Punjabi.
+ months : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'),
+ monthsShort : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'),
+ weekdays : 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split('_'),
+ weekdaysShort : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
+ weekdaysMin : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm ਵਜੇ',
+ LTS : 'A h:mm:ss ਵਜੇ',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm ਵਜੇ',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm ਵਜੇ'
+ },
+ calendar : {
+ sameDay : '[ਅਜ] LT',
+ nextDay : '[ਕਲ] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[ਕਲ] LT',
+ lastWeek : '[ਪਿਛਲੇ] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s ਵਿੱਚ',
+ past : '%s ਪਿਛਲੇ',
+ s : 'ਕੁਝ ਸਕਿੰਟ',
+ m : 'ਇਕ ਮਿੰਟ',
+ mm : '%d ਮਿੰਟ',
+ h : 'ਇੱਕ ਘੰਟਾ',
+ hh : '%d ਘੰਟੇ',
+ d : 'ਇੱਕ ਦਿਨ',
+ dd : '%d ਦਿਨ',
+ M : 'ਇੱਕ ਮਹੀਨਾ',
+ MM : '%d ਮਹੀਨੇ',
+ y : 'ਇੱਕ ਸਾਲ',
+ yy : '%d ਸਾਲ'
+ },
+ preparse: function (string) {
+ return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ // Punjabi notation for meridiems are quite fuzzy in practice. While there exists
+ // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi.
+ meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'ਰਾਤ') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'ਸਵੇਰ') {
+ return hour;
+ } else if (meridiem === 'ਦੁਪਹਿਰ') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'ਸ਼ਾਮ') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'ਰਾਤ';
+ } else if (hour < 10) {
+ return 'ਸਵੇਰ';
+ } else if (hour < 17) {
+ return 'ਦੁਪਹਿਰ';
+ } else if (hour < 20) {
+ return 'ਸ਼ਾਮ';
+ } else {
+ return 'ਰਾਤ';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/pl.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/pl.js
new file mode 100644
index 00000000000..9934a5e6873
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/pl.js
@@ -0,0 +1,95 @@
+//! moment.js locale configuration
+//! locale : Polish [pl]
+//! author : Rafal Hirsz : https://github.com/evoL
+
+import moment from '../moment';
+
+var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'),
+ monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_');
+function plural(n) {
+ return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1);
+}
+function translate(number, withoutSuffix, key) {
+ var result = number + ' ';
+ switch (key) {
+ case 'm':
+ return withoutSuffix ? 'minuta' : 'minutę';
+ case 'mm':
+ return result + (plural(number) ? 'minuty' : 'minut');
+ case 'h':
+ return withoutSuffix ? 'godzina' : 'godzinę';
+ case 'hh':
+ return result + (plural(number) ? 'godziny' : 'godzin');
+ case 'MM':
+ return result + (plural(number) ? 'miesiące' : 'miesięcy');
+ case 'yy':
+ return result + (plural(number) ? 'lata' : 'lat');
+ }
+}
+
+export default moment.defineLocale('pl', {
+ months : function (momentToFormat, format) {
+ if (format === '') {
+ // Hack: if format empty we know this is used to generate
+ // RegExp by moment. Give then back both valid forms of months
+ // in RegExp ready format.
+ return '(' + monthsSubjective[momentToFormat.month()] + '|' + monthsNominative[momentToFormat.month()] + ')';
+ } else if (/D MMMM/.test(format)) {
+ return monthsSubjective[momentToFormat.month()];
+ } else {
+ return monthsNominative[momentToFormat.month()];
+ }
+ },
+ monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'),
+ weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'),
+ weekdaysShort : 'ndz_pon_wt_śr_czw_pt_sob'.split('_'),
+ weekdaysMin : 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Dziś o] LT',
+ nextDay: '[Jutro o] LT',
+ nextWeek: '[W] dddd [o] LT',
+ lastDay: '[Wczoraj o] LT',
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[W zeszłą niedzielę o] LT';
+ case 3:
+ return '[W zeszłą środę o] LT';
+ case 6:
+ return '[W zeszłą sobotę o] LT';
+ default:
+ return '[W zeszły] dddd [o] LT';
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : '%s temu',
+ s : 'kilka sekund',
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : '1 dzień',
+ dd : '%d dni',
+ M : 'miesiąc',
+ MM : translate,
+ y : 'rok',
+ yy : translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/pt-br.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/pt-br.js
new file mode 100644
index 00000000000..6e42d1ef123
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/pt-br.js
@@ -0,0 +1,52 @@
+//! moment.js locale configuration
+//! locale : Portuguese (Brazil) [pt-br]
+//! author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
+
+import moment from '../moment';
+
+export default moment.defineLocale('pt-br', {
+ months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'),
+ monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
+ weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'),
+ weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
+ weekdaysMin : 'Dom_2ª_3ª_4ª_5ª_6ª_Sáb'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D [de] MMMM [de] YYYY',
+ LLL : 'D [de] MMMM [de] YYYY [às] HH:mm',
+ LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm'
+ },
+ calendar : {
+ sameDay: '[Hoje às] LT',
+ nextDay: '[Amanhã às] LT',
+ nextWeek: 'dddd [às] LT',
+ lastDay: '[Ontem às] LT',
+ lastWeek: function () {
+ return (this.day() === 0 || this.day() === 6) ?
+ '[Último] dddd [às] LT' : // Saturday + Sunday
+ '[Última] dddd [às] LT'; // Monday - Friday
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'em %s',
+ past : '%s atrás',
+ s : 'poucos segundos',
+ m : 'um minuto',
+ mm : '%d minutos',
+ h : 'uma hora',
+ hh : '%d horas',
+ d : 'um dia',
+ dd : '%d dias',
+ M : 'um mês',
+ MM : '%d meses',
+ y : 'um ano',
+ yy : '%d anos'
+ },
+ ordinalParse: /\d{1,2}º/,
+ ordinal : '%dº'
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/pt.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/pt.js
new file mode 100644
index 00000000000..b6ab969c86f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/pt.js
@@ -0,0 +1,56 @@
+//! moment.js locale configuration
+//! locale : Portuguese [pt]
+//! author : Jefferson : https://github.com/jalex79
+
+import moment from '../moment';
+
+export default moment.defineLocale('pt', {
+ months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'),
+ monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
+ weekdays : 'Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado'.split('_'),
+ weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
+ weekdaysMin : 'Dom_2ª_3ª_4ª_5ª_6ª_Sáb'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D [de] MMMM [de] YYYY',
+ LLL : 'D [de] MMMM [de] YYYY HH:mm',
+ LLLL : 'dddd, D [de] MMMM [de] YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Hoje às] LT',
+ nextDay: '[Amanhã às] LT',
+ nextWeek: 'dddd [às] LT',
+ lastDay: '[Ontem às] LT',
+ lastWeek: function () {
+ return (this.day() === 0 || this.day() === 6) ?
+ '[Último] dddd [às] LT' : // Saturday + Sunday
+ '[Última] dddd [às] LT'; // Monday - Friday
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'em %s',
+ past : 'há %s',
+ s : 'segundos',
+ m : 'um minuto',
+ mm : '%d minutos',
+ h : 'uma hora',
+ hh : '%d horas',
+ d : 'um dia',
+ dd : '%d dias',
+ M : 'um mês',
+ MM : '%d meses',
+ y : 'um ano',
+ yy : '%d anos'
+ },
+ ordinalParse: /\d{1,2}º/,
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ro.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ro.js
new file mode 100644
index 00000000000..444eebad7b0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ro.js
@@ -0,0 +1,66 @@
+//! moment.js locale configuration
+//! locale : Romanian [ro]
+//! author : Vlad Gurdiga : https://github.com/gurdiga
+//! author : Valentin Agachi : https://github.com/avaly
+
+import moment from '../moment';
+
+function relativeTimeWithPlural(number, withoutSuffix, key) {
+ var format = {
+ 'mm': 'minute',
+ 'hh': 'ore',
+ 'dd': 'zile',
+ 'MM': 'luni',
+ 'yy': 'ani'
+ },
+ separator = ' ';
+ if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {
+ separator = ' de ';
+ }
+ return number + separator + format[key];
+}
+
+export default moment.defineLocale('ro', {
+ months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'),
+ monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'),
+ weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'),
+ weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY H:mm',
+ LLLL : 'dddd, D MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay: '[azi la] LT',
+ nextDay: '[mâine la] LT',
+ nextWeek: 'dddd [la] LT',
+ lastDay: '[ieri la] LT',
+ lastWeek: '[fosta] dddd [la] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'peste %s',
+ past : '%s în urmă',
+ s : 'câteva secunde',
+ m : 'un minut',
+ mm : relativeTimeWithPlural,
+ h : 'o oră',
+ hh : relativeTimeWithPlural,
+ d : 'o zi',
+ dd : relativeTimeWithPlural,
+ M : 'o lună',
+ MM : relativeTimeWithPlural,
+ y : 'un an',
+ yy : relativeTimeWithPlural
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ru.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ru.js
new file mode 100644
index 00000000000..2f10d6749c1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ru.js
@@ -0,0 +1,173 @@
+//! moment.js locale configuration
+//! locale : Russian [ru]
+//! author : Viktorminator : https://github.com/Viktorminator
+//! Author : Menelion Elensúle : https://github.com/Oire
+//! author : Коренберг Марк : https://github.com/socketpair
+
+import moment from '../moment';
+
+function plural(word, num) {
+ var forms = word.split('_');
+ return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+}
+function relativeTimeWithPlural(number, withoutSuffix, key) {
+ var format = {
+ 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',
+ 'hh': 'час_часа_часов',
+ 'dd': 'день_дня_дней',
+ 'MM': 'месяц_месяца_месяцев',
+ 'yy': 'год_года_лет'
+ };
+ if (key === 'm') {
+ return withoutSuffix ? 'минута' : 'минуту';
+ }
+ else {
+ return number + ' ' + plural(format[key], +number);
+ }
+}
+var monthsParse = [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[йя]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i];
+
+// http://new.gramota.ru/spravka/rules/139-prop : § 103
+// Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637
+// CLDR data: http://www.unicode.org/cldr/charts/28/summary/ru.html#1753
+export default moment.defineLocale('ru', {
+ months : {
+ format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_'),
+ standalone: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_')
+ },
+ monthsShort : {
+ // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку ?
+ format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_'),
+ standalone: 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_')
+ },
+ weekdays : {
+ standalone: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),
+ format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_'),
+ isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/
+ },
+ weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
+ weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
+ monthsParse : monthsParse,
+ longMonthsParse : monthsParse,
+ shortMonthsParse : monthsParse,
+
+ // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки
+ monthsRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,
+
+ // копия предыдущего
+ monthsShortRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,
+
+ // полные названия с падежами
+ monthsStrictRegex: /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,
+
+ // Выражение, которое соотвествует только сокращённым формам
+ monthsShortStrictRegex: /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY г.',
+ LLL : 'D MMMM YYYY г., HH:mm',
+ LLLL : 'dddd, D MMMM YYYY г., HH:mm'
+ },
+ calendar : {
+ sameDay: '[Сегодня в] LT',
+ nextDay: '[Завтра в] LT',
+ lastDay: '[Вчера в] LT',
+ nextWeek: function (now) {
+ if (now.week() !== this.week()) {
+ switch (this.day()) {
+ case 0:
+ return '[В следующее] dddd [в] LT';
+ case 1:
+ case 2:
+ case 4:
+ return '[В следующий] dddd [в] LT';
+ case 3:
+ case 5:
+ case 6:
+ return '[В следующую] dddd [в] LT';
+ }
+ } else {
+ if (this.day() === 2) {
+ return '[Во] dddd [в] LT';
+ } else {
+ return '[В] dddd [в] LT';
+ }
+ }
+ },
+ lastWeek: function (now) {
+ if (now.week() !== this.week()) {
+ switch (this.day()) {
+ case 0:
+ return '[В прошлое] dddd [в] LT';
+ case 1:
+ case 2:
+ case 4:
+ return '[В прошлый] dddd [в] LT';
+ case 3:
+ case 5:
+ case 6:
+ return '[В прошлую] dddd [в] LT';
+ }
+ } else {
+ if (this.day() === 2) {
+ return '[Во] dddd [в] LT';
+ } else {
+ return '[В] dddd [в] LT';
+ }
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'через %s',
+ past : '%s назад',
+ s : 'несколько секунд',
+ m : relativeTimeWithPlural,
+ mm : relativeTimeWithPlural,
+ h : 'час',
+ hh : relativeTimeWithPlural,
+ d : 'день',
+ dd : relativeTimeWithPlural,
+ M : 'месяц',
+ MM : relativeTimeWithPlural,
+ y : 'год',
+ yy : relativeTimeWithPlural
+ },
+ meridiemParse: /ночи|утра|дня|вечера/i,
+ isPM : function (input) {
+ return /^(дня|вечера)$/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'ночи';
+ } else if (hour < 12) {
+ return 'утра';
+ } else if (hour < 17) {
+ return 'дня';
+ } else {
+ return 'вечера';
+ }
+ },
+ ordinalParse: /\d{1,2}-(й|го|я)/,
+ ordinal: function (number, period) {
+ switch (period) {
+ case 'M':
+ case 'd':
+ case 'DDD':
+ return number + '-й';
+ case 'D':
+ return number + '-го';
+ case 'w':
+ case 'W':
+ return number + '-я';
+ default:
+ return number;
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/se.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/se.js
new file mode 100644
index 00000000000..af6a01c31d6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/se.js
@@ -0,0 +1,51 @@
+//! moment.js locale configuration
+//! locale : Northern Sami [se]
+//! authors : Bård Rolstad Henriksen : https://github.com/karamell
+
+
+import moment from '../moment';
+
+export default moment.defineLocale('se', {
+ months : 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'),
+ monthsShort : 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'),
+ weekdays : 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'),
+ weekdaysShort : 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'),
+ weekdaysMin : 's_v_m_g_d_b_L'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'MMMM D. [b.] YYYY',
+ LLL : 'MMMM D. [b.] YYYY [ti.] HH:mm',
+ LLLL : 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm'
+ },
+ calendar : {
+ sameDay: '[otne ti] LT',
+ nextDay: '[ihttin ti] LT',
+ nextWeek: 'dddd [ti] LT',
+ lastDay: '[ikte ti] LT',
+ lastWeek: '[ovddit] dddd [ti] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : '%s geažes',
+ past : 'maŋit %s',
+ s : 'moadde sekunddat',
+ m : 'okta minuhta',
+ mm : '%d minuhtat',
+ h : 'okta diimmu',
+ hh : '%d diimmut',
+ d : 'okta beaivi',
+ dd : '%d beaivvit',
+ M : 'okta mánnu',
+ MM : '%d mánut',
+ y : 'okta jahki',
+ yy : '%d jagit'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/si.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/si.js
new file mode 100644
index 00000000000..0cc2b78e5e2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/si.js
@@ -0,0 +1,61 @@
+//! moment.js locale configuration
+//! locale : Sinhalese [si]
+//! author : Sampath Sitinamaluwa : https://github.com/sampathsris
+
+import moment from '../moment';
+
+/*jshint -W100*/
+export default moment.defineLocale('si', {
+ months : 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'),
+ monthsShort : 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'),
+ weekdays : 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'),
+ weekdaysShort : 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'),
+ weekdaysMin : 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'a h:mm',
+ LTS : 'a h:mm:ss',
+ L : 'YYYY/MM/DD',
+ LL : 'YYYY MMMM D',
+ LLL : 'YYYY MMMM D, a h:mm',
+ LLLL : 'YYYY MMMM D [වැනි] dddd, a h:mm:ss'
+ },
+ calendar : {
+ sameDay : '[අද] LT[ට]',
+ nextDay : '[හෙට] LT[ට]',
+ nextWeek : 'dddd LT[ට]',
+ lastDay : '[ඊයේ] LT[ට]',
+ lastWeek : '[පසුගිය] dddd LT[ට]',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%sකින්',
+ past : '%sකට පෙර',
+ s : 'තත්පර කිහිපය',
+ m : 'මිනිත්තුව',
+ mm : 'මිනිත්තු %d',
+ h : 'පැය',
+ hh : 'පැය %d',
+ d : 'දිනය',
+ dd : 'දින %d',
+ M : 'මාසය',
+ MM : 'මාස %d',
+ y : 'වසර',
+ yy : 'වසර %d'
+ },
+ ordinalParse: /\d{1,2} වැනි/,
+ ordinal : function (number) {
+ return number + ' වැනි';
+ },
+ meridiemParse : /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,
+ isPM : function (input) {
+ return input === 'ප.ව.' || input === 'පස් වරු';
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'ප.ව.' : 'පස් වරු';
+ } else {
+ return isLower ? 'පෙ.ව.' : 'පෙර වරු';
+ }
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sk.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sk.js
new file mode 100644
index 00000000000..0d5f0e04a5f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sk.js
@@ -0,0 +1,141 @@
+//! moment.js locale configuration
+//! locale : Slovak [sk]
+//! author : Martin Minka : https://github.com/k2s
+//! based on work of petrbela : https://github.com/petrbela
+
+import moment from '../moment';
+
+var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'),
+ monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');
+function plural(n) {
+ return (n > 1) && (n < 5);
+}
+function translate(number, withoutSuffix, key, isFuture) {
+ var result = number + ' ';
+ switch (key) {
+ case 's': // a few seconds / in a few seconds / a few seconds ago
+ return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami';
+ case 'm': // a minute / in a minute / a minute ago
+ return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou');
+ case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'minúty' : 'minút');
+ } else {
+ return result + 'minútami';
+ }
+ break;
+ case 'h': // an hour / in an hour / an hour ago
+ return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+ case 'hh': // 9 hours / in 9 hours / 9 hours ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'hodiny' : 'hodín');
+ } else {
+ return result + 'hodinami';
+ }
+ break;
+ case 'd': // a day / in a day / a day ago
+ return (withoutSuffix || isFuture) ? 'deň' : 'dňom';
+ case 'dd': // 9 days / in 9 days / 9 days ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'dni' : 'dní');
+ } else {
+ return result + 'dňami';
+ }
+ break;
+ case 'M': // a month / in a month / a month ago
+ return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom';
+ case 'MM': // 9 months / in 9 months / 9 months ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'mesiace' : 'mesiacov');
+ } else {
+ return result + 'mesiacmi';
+ }
+ break;
+ case 'y': // a year / in a year / a year ago
+ return (withoutSuffix || isFuture) ? 'rok' : 'rokom';
+ case 'yy': // 9 years / in 9 years / 9 years ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'roky' : 'rokov');
+ } else {
+ return result + 'rokmi';
+ }
+ break;
+ }
+}
+
+export default moment.defineLocale('sk', {
+ months : months,
+ monthsShort : monthsShort,
+ weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),
+ weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'),
+ weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'),
+ longDateFormat : {
+ LT: 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd D. MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay: '[dnes o] LT',
+ nextDay: '[zajtra o] LT',
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[v nedeľu o] LT';
+ case 1:
+ case 2:
+ return '[v] dddd [o] LT';
+ case 3:
+ return '[v stredu o] LT';
+ case 4:
+ return '[vo štvrtok o] LT';
+ case 5:
+ return '[v piatok o] LT';
+ case 6:
+ return '[v sobotu o] LT';
+ }
+ },
+ lastDay: '[včera o] LT',
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[minulú nedeľu o] LT';
+ case 1:
+ case 2:
+ return '[minulý] dddd [o] LT';
+ case 3:
+ return '[minulú stredu o] LT';
+ case 4:
+ case 5:
+ return '[minulý] dddd [o] LT';
+ case 6:
+ return '[minulú sobotu o] LT';
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'pred %s',
+ s : translate,
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : translate,
+ dd : translate,
+ M : translate,
+ MM : translate,
+ y : translate,
+ yy : translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sl.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sl.js
new file mode 100644
index 00000000000..2f36d5bf375
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sl.js
@@ -0,0 +1,152 @@
+//! moment.js locale configuration
+//! locale : Slovenian [sl]
+//! author : Robert Sedovšek : https://github.com/sedovsek
+
+import moment from '../moment';
+
+function processRelativeTime(number, withoutSuffix, key, isFuture) {
+ var result = number + ' ';
+ switch (key) {
+ case 's':
+ return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami';
+ case 'm':
+ return withoutSuffix ? 'ena minuta' : 'eno minuto';
+ case 'mm':
+ if (number === 1) {
+ result += withoutSuffix ? 'minuta' : 'minuto';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'minuti' : 'minutama';
+ } else if (number < 5) {
+ result += withoutSuffix || isFuture ? 'minute' : 'minutami';
+ } else {
+ result += withoutSuffix || isFuture ? 'minut' : 'minutami';
+ }
+ return result;
+ case 'h':
+ return withoutSuffix ? 'ena ura' : 'eno uro';
+ case 'hh':
+ if (number === 1) {
+ result += withoutSuffix ? 'ura' : 'uro';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'uri' : 'urama';
+ } else if (number < 5) {
+ result += withoutSuffix || isFuture ? 'ure' : 'urami';
+ } else {
+ result += withoutSuffix || isFuture ? 'ur' : 'urami';
+ }
+ return result;
+ case 'd':
+ return withoutSuffix || isFuture ? 'en dan' : 'enim dnem';
+ case 'dd':
+ if (number === 1) {
+ result += withoutSuffix || isFuture ? 'dan' : 'dnem';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'dni' : 'dnevoma';
+ } else {
+ result += withoutSuffix || isFuture ? 'dni' : 'dnevi';
+ }
+ return result;
+ case 'M':
+ return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem';
+ case 'MM':
+ if (number === 1) {
+ result += withoutSuffix || isFuture ? 'mesec' : 'mesecem';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'meseca' : 'mesecema';
+ } else if (number < 5) {
+ result += withoutSuffix || isFuture ? 'mesece' : 'meseci';
+ } else {
+ result += withoutSuffix || isFuture ? 'mesecev' : 'meseci';
+ }
+ return result;
+ case 'y':
+ return withoutSuffix || isFuture ? 'eno leto' : 'enim letom';
+ case 'yy':
+ if (number === 1) {
+ result += withoutSuffix || isFuture ? 'leto' : 'letom';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'leti' : 'letoma';
+ } else if (number < 5) {
+ result += withoutSuffix || isFuture ? 'leta' : 'leti';
+ } else {
+ result += withoutSuffix || isFuture ? 'let' : 'leti';
+ }
+ return result;
+ }
+}
+
+export default moment.defineLocale('sl', {
+ months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'),
+ monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),
+ weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'),
+ weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM YYYY',
+ LLL : 'D. MMMM YYYY H:mm',
+ LLLL : 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar : {
+ sameDay : '[danes ob] LT',
+ nextDay : '[jutri ob] LT',
+
+ nextWeek : function () {
+ switch (this.day()) {
+ case 0:
+ return '[v] [nedeljo] [ob] LT';
+ case 3:
+ return '[v] [sredo] [ob] LT';
+ case 6:
+ return '[v] [soboto] [ob] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[v] dddd [ob] LT';
+ }
+ },
+ lastDay : '[včeraj ob] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ return '[prejšnjo] [nedeljo] [ob] LT';
+ case 3:
+ return '[prejšnjo] [sredo] [ob] LT';
+ case 6:
+ return '[prejšnjo] [soboto] [ob] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[prejšnji] dddd [ob] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'čez %s',
+ past : 'pred %s',
+ s : processRelativeTime,
+ m : processRelativeTime,
+ mm : processRelativeTime,
+ h : processRelativeTime,
+ hh : processRelativeTime,
+ d : processRelativeTime,
+ dd : processRelativeTime,
+ M : processRelativeTime,
+ MM : processRelativeTime,
+ y : processRelativeTime,
+ yy : processRelativeTime
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sq.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sq.js
new file mode 100644
index 00000000000..b0011c7f0bc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sq.js
@@ -0,0 +1,61 @@
+//! moment.js locale configuration
+//! locale : Albanian [sq]
+//! author : Flakërim Ismani : https://github.com/flakerimi
+//! author : Menelion Elensúle : https://github.com/Oire
+//! author : Oerd Cukalla : https://github.com/oerd
+
+import moment from '../moment';
+
+export default moment.defineLocale('sq', {
+ months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'),
+ monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'),
+ weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'),
+ weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'),
+ weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'),
+ weekdaysParseExact : true,
+ meridiemParse: /PD|MD/,
+ isPM: function (input) {
+ return input.charAt(0) === 'M';
+ },
+ meridiem : function (hours, minutes, isLower) {
+ return hours < 12 ? 'PD' : 'MD';
+ },
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[Sot në] LT',
+ nextDay : '[Nesër në] LT',
+ nextWeek : 'dddd [në] LT',
+ lastDay : '[Dje në] LT',
+ lastWeek : 'dddd [e kaluar në] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'në %s',
+ past : '%s më parë',
+ s : 'disa sekonda',
+ m : 'një minutë',
+ mm : '%d minuta',
+ h : 'një orë',
+ hh : '%d orë',
+ d : 'një ditë',
+ dd : '%d ditë',
+ M : 'një muaj',
+ MM : '%d muaj',
+ y : 'një vit',
+ yy : '%d vite'
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sr-cyrl.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sr-cyrl.js
new file mode 100644
index 00000000000..90449c1aeb2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sr-cyrl.js
@@ -0,0 +1,100 @@
+//! moment.js locale configuration
+//! locale : Serbian Cyrillic [sr-cyrl]
+//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+
+import moment from '../moment';
+
+var translator = {
+ words: { //Different grammatical cases
+ m: ['један минут', 'једне минуте'],
+ mm: ['минут', 'минуте', 'минута'],
+ h: ['један сат', 'једног сата'],
+ hh: ['сат', 'сата', 'сати'],
+ dd: ['дан', 'дана', 'дана'],
+ MM: ['месец', 'месеца', 'месеци'],
+ yy: ['година', 'године', 'година']
+ },
+ correctGrammaticalCase: function (number, wordKey) {
+ return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
+ },
+ translate: function (number, withoutSuffix, key) {
+ var wordKey = translator.words[key];
+ if (key.length === 1) {
+ return withoutSuffix ? wordKey[0] : wordKey[1];
+ } else {
+ return number + ' ' + translator.correctGrammaticalCase(number, wordKey);
+ }
+ }
+};
+
+export default moment.defineLocale('sr-cyrl', {
+ months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split('_'),
+ monthsShort: 'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'),
+ monthsParseExact: true,
+ weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'),
+ weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'),
+ weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat: {
+ LT: 'H:mm',
+ LTS : 'H:mm:ss',
+ L: 'DD.MM.YYYY',
+ LL: 'D. MMMM YYYY',
+ LLL: 'D. MMMM YYYY H:mm',
+ LLLL: 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar: {
+ sameDay: '[данас у] LT',
+ nextDay: '[сутра у] LT',
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[у] [недељу] [у] LT';
+ case 3:
+ return '[у] [среду] [у] LT';
+ case 6:
+ return '[у] [суботу] [у] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[у] dddd [у] LT';
+ }
+ },
+ lastDay : '[јуче у] LT',
+ lastWeek : function () {
+ var lastWeekDays = [
+ '[прошле] [недеље] [у] LT',
+ '[прошлог] [понедељка] [у] LT',
+ '[прошлог] [уторка] [у] LT',
+ '[прошле] [среде] [у] LT',
+ '[прошлог] [четвртка] [у] LT',
+ '[прошлог] [петка] [у] LT',
+ '[прошле] [суботе] [у] LT'
+ ];
+ return lastWeekDays[this.day()];
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'за %s',
+ past : 'пре %s',
+ s : 'неколико секунди',
+ m : translator.translate,
+ mm : translator.translate,
+ h : translator.translate,
+ hh : translator.translate,
+ d : 'дан',
+ dd : translator.translate,
+ M : 'месец',
+ MM : translator.translate,
+ y : 'годину',
+ yy : translator.translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sr.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sr.js
new file mode 100644
index 00000000000..6716b42726a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sr.js
@@ -0,0 +1,100 @@
+//! moment.js locale configuration
+//! locale : Serbian [sr]
+//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+
+import moment from '../moment';
+
+var translator = {
+ words: { //Different grammatical cases
+ m: ['jedan minut', 'jedne minute'],
+ mm: ['minut', 'minute', 'minuta'],
+ h: ['jedan sat', 'jednog sata'],
+ hh: ['sat', 'sata', 'sati'],
+ dd: ['dan', 'dana', 'dana'],
+ MM: ['mesec', 'meseca', 'meseci'],
+ yy: ['godina', 'godine', 'godina']
+ },
+ correctGrammaticalCase: function (number, wordKey) {
+ return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
+ },
+ translate: function (number, withoutSuffix, key) {
+ var wordKey = translator.words[key];
+ if (key.length === 1) {
+ return withoutSuffix ? wordKey[0] : wordKey[1];
+ } else {
+ return number + ' ' + translator.correctGrammaticalCase(number, wordKey);
+ }
+ }
+};
+
+export default moment.defineLocale('sr', {
+ months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'),
+ monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
+ monthsParseExact: true,
+ weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split('_'),
+ weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'),
+ weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat: {
+ LT: 'H:mm',
+ LTS : 'H:mm:ss',
+ L: 'DD.MM.YYYY',
+ LL: 'D. MMMM YYYY',
+ LLL: 'D. MMMM YYYY H:mm',
+ LLLL: 'dddd, D. MMMM YYYY H:mm'
+ },
+ calendar: {
+ sameDay: '[danas u] LT',
+ nextDay: '[sutra u] LT',
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[u] [nedelju] [u] LT';
+ case 3:
+ return '[u] [sredu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ },
+ lastDay : '[juče u] LT',
+ lastWeek : function () {
+ var lastWeekDays = [
+ '[prošle] [nedelje] [u] LT',
+ '[prošlog] [ponedeljka] [u] LT',
+ '[prošlog] [utorka] [u] LT',
+ '[prošle] [srede] [u] LT',
+ '[prošlog] [četvrtka] [u] LT',
+ '[prošlog] [petka] [u] LT',
+ '[prošle] [subote] [u] LT'
+ ];
+ return lastWeekDays[this.day()];
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'pre %s',
+ s : 'nekoliko sekundi',
+ m : translator.translate,
+ mm : translator.translate,
+ h : translator.translate,
+ hh : translator.translate,
+ d : 'dan',
+ dd : translator.translate,
+ M : 'mesec',
+ MM : translator.translate,
+ y : 'godinu',
+ yy : translator.translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ss.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ss.js
new file mode 100644
index 00000000000..f6a7d0a8c5a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ss.js
@@ -0,0 +1,80 @@
+//! moment.js locale configuration
+//! locale : siSwati [ss]
+//! author : Nicolai Davies<mail@nicolai.io> : https://github.com/nicolaidavies
+
+
+import moment from '../moment';
+
+export default moment.defineLocale('ss', {
+ months : "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split('_'),
+ monthsShort : 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'),
+ weekdays : 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split('_'),
+ weekdaysShort : 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'),
+ weekdaysMin : 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[Namuhla nga] LT',
+ nextDay : '[Kusasa nga] LT',
+ nextWeek : 'dddd [nga] LT',
+ lastDay : '[Itolo nga] LT',
+ lastWeek : 'dddd [leliphelile] [nga] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'nga %s',
+ past : 'wenteka nga %s',
+ s : 'emizuzwana lomcane',
+ m : 'umzuzu',
+ mm : '%d emizuzu',
+ h : 'lihora',
+ hh : '%d emahora',
+ d : 'lilanga',
+ dd : '%d emalanga',
+ M : 'inyanga',
+ MM : '%d tinyanga',
+ y : 'umnyaka',
+ yy : '%d iminyaka'
+ },
+ meridiemParse: /ekuseni|emini|entsambama|ebusuku/,
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'ekuseni';
+ } else if (hours < 15) {
+ return 'emini';
+ } else if (hours < 19) {
+ return 'entsambama';
+ } else {
+ return 'ebusuku';
+ }
+ },
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'ekuseni') {
+ return hour;
+ } else if (meridiem === 'emini') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') {
+ if (hour === 0) {
+ return 0;
+ }
+ return hour + 12;
+ }
+ },
+ ordinalParse: /\d{1,2}/,
+ ordinal : '%d',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sv.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sv.js
new file mode 100644
index 00000000000..15d1c9d99c1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sv.js
@@ -0,0 +1,60 @@
+//! moment.js locale configuration
+//! locale : Swedish [sv]
+//! author : Jens Alm : https://github.com/ulmus
+
+import moment from '../moment';
+
+export default moment.defineLocale('sv', {
+ months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'),
+ monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
+ weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),
+ weekdaysShort : 'sön_mån_tis_ons_tor_fre_lör'.split('_'),
+ weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'YYYY-MM-DD',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [kl.] HH:mm',
+ LLLL : 'dddd D MMMM YYYY [kl.] HH:mm',
+ lll : 'D MMM YYYY HH:mm',
+ llll : 'ddd D MMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Idag] LT',
+ nextDay: '[Imorgon] LT',
+ lastDay: '[Igår] LT',
+ nextWeek: '[På] dddd LT',
+ lastWeek: '[I] dddd[s] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'om %s',
+ past : 'för %s sedan',
+ s : 'några sekunder',
+ m : 'en minut',
+ mm : '%d minuter',
+ h : 'en timme',
+ hh : '%d timmar',
+ d : 'en dag',
+ dd : '%d dagar',
+ M : 'en månad',
+ MM : '%d månader',
+ y : 'ett år',
+ yy : '%d år'
+ },
+ ordinalParse: /\d{1,2}(e|a)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'e' :
+ (b === 1) ? 'a' :
+ (b === 2) ? 'a' :
+ (b === 3) ? 'e' : 'e';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sw.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sw.js
new file mode 100644
index 00000000000..a36d9dd2a96
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/sw.js
@@ -0,0 +1,50 @@
+//! moment.js locale configuration
+//! locale : Swahili [sw]
+//! author : Fahad Kassim : https://github.com/fadsel
+
+import moment from '../moment';
+
+export default moment.defineLocale('sw', {
+ months : 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'),
+ monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'),
+ weekdays : 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'),
+ weekdaysShort : 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'),
+ weekdaysMin : 'J2_J3_J4_J5_Al_Ij_J1'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[leo saa] LT',
+ nextDay : '[kesho saa] LT',
+ nextWeek : '[wiki ijayo] dddd [saat] LT',
+ lastDay : '[jana] LT',
+ lastWeek : '[wiki iliyopita] dddd [saat] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s baadaye',
+ past : 'tokea %s',
+ s : 'hivi punde',
+ m : 'dakika moja',
+ mm : 'dakika %d',
+ h : 'saa limoja',
+ hh : 'masaa %d',
+ d : 'siku moja',
+ dd : 'masiku %d',
+ M : 'mwezi mmoja',
+ MM : 'miezi %d',
+ y : 'mwaka mmoja',
+ yy : 'miaka %d'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ta.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ta.js
new file mode 100644
index 00000000000..6be3e2e0bc6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/ta.js
@@ -0,0 +1,120 @@
+//! moment.js locale configuration
+//! locale : Tamil [ta]
+//! author : Arjunkumar Krishnamoorthy : https://github.com/tk120404
+
+import moment from '../moment';
+
+var symbolMap = {
+ '1': '௧',
+ '2': '௨',
+ '3': '௩',
+ '4': '௪',
+ '5': '௫',
+ '6': '௬',
+ '7': '௭',
+ '8': '௮',
+ '9': '௯',
+ '0': '௦'
+}, numberMap = {
+ '௧': '1',
+ '௨': '2',
+ '௩': '3',
+ '௪': '4',
+ '௫': '5',
+ '௬': '6',
+ '௭': '7',
+ '௮': '8',
+ '௯': '9',
+ '௦': '0'
+};
+
+export default moment.defineLocale('ta', {
+ months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),
+ monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),
+ weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'),
+ weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split('_'),
+ weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, HH:mm',
+ LLLL : 'dddd, D MMMM YYYY, HH:mm'
+ },
+ calendar : {
+ sameDay : '[இன்று] LT',
+ nextDay : '[நாளை] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[நேற்று] LT',
+ lastWeek : '[கடந்த வாரம்] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s இல்',
+ past : '%s முன்',
+ s : 'ஒரு சில விநாடிகள்',
+ m : 'ஒரு நிமிடம்',
+ mm : '%d நிமிடங்கள்',
+ h : 'ஒரு மணி நேரம்',
+ hh : '%d மணி நேரம்',
+ d : 'ஒரு நாள்',
+ dd : '%d நாட்கள்',
+ M : 'ஒரு மாதம்',
+ MM : '%d மாதங்கள்',
+ y : 'ஒரு வருடம்',
+ yy : '%d ஆண்டுகள்'
+ },
+ ordinalParse: /\d{1,2}வது/,
+ ordinal : function (number) {
+ return number + 'வது';
+ },
+ preparse: function (string) {
+ return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ // refer http://ta.wikipedia.org/s/1er1
+ meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 2) {
+ return ' யாமம்';
+ } else if (hour < 6) {
+ return ' வைகறை'; // வைகறை
+ } else if (hour < 10) {
+ return ' காலை'; // காலை
+ } else if (hour < 14) {
+ return ' நண்பகல்'; // நண்பகல்
+ } else if (hour < 18) {
+ return ' எற்பாடு'; // எற்பாடு
+ } else if (hour < 22) {
+ return ' மாலை'; // மாலை
+ } else {
+ return ' யாமம்';
+ }
+ },
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'யாமம்') {
+ return hour < 2 ? hour : hour + 12;
+ } else if (meridiem === 'வைகறை' || meridiem === 'காலை') {
+ return hour;
+ } else if (meridiem === 'நண்பகல்') {
+ return hour >= 10 ? hour : hour + 12;
+ } else {
+ return hour + 12;
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/te.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/te.js
new file mode 100644
index 00000000000..d9edc388d43
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/te.js
@@ -0,0 +1,79 @@
+//! moment.js locale configuration
+//! locale : Telugu [te]
+//! author : Krishna Chaitanya Thota : https://github.com/kcthota
+
+import moment from '../moment';
+
+export default moment.defineLocale('te', {
+ months : 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జూలై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'),
+ monthsShort : 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జూలై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split('_'),
+ weekdaysShort : 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'),
+ weekdaysMin : 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'),
+ longDateFormat : {
+ LT : 'A h:mm',
+ LTS : 'A h:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY, A h:mm',
+ LLLL : 'dddd, D MMMM YYYY, A h:mm'
+ },
+ calendar : {
+ sameDay : '[నేడు] LT',
+ nextDay : '[రేపు] LT',
+ nextWeek : 'dddd, LT',
+ lastDay : '[నిన్న] LT',
+ lastWeek : '[గత] dddd, LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s లో',
+ past : '%s క్రితం',
+ s : 'కొన్ని క్షణాలు',
+ m : 'ఒక నిమిషం',
+ mm : '%d నిమిషాలు',
+ h : 'ఒక గంట',
+ hh : '%d గంటలు',
+ d : 'ఒక రోజు',
+ dd : '%d రోజులు',
+ M : 'ఒక నెల',
+ MM : '%d నెలలు',
+ y : 'ఒక సంవత్సరం',
+ yy : '%d సంవత్సరాలు'
+ },
+ ordinalParse : /\d{1,2}వ/,
+ ordinal : '%dవ',
+ meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'రాత్రి') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'ఉదయం') {
+ return hour;
+ } else if (meridiem === 'మధ్యాహ్నం') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'సాయంత్రం') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'రాత్రి';
+ } else if (hour < 10) {
+ return 'ఉదయం';
+ } else if (hour < 17) {
+ return 'మధ్యాహ్నం';
+ } else if (hour < 20) {
+ return 'సాయంత్రం';
+ } else {
+ return 'రాత్రి';
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tet.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tet.js
new file mode 100644
index 00000000000..e048e243b83
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tet.js
@@ -0,0 +1,58 @@
+//! moment.js locale configuration
+//! locale : Tetun Dili (East Timor) [tet]
+//! author : Joshua Brooks : https://github.com/joshbrooks
+//! author : Onorio De J. Afonso : https://github.com/marobo
+
+import moment from '../moment';
+
+export default moment.defineLocale('tet', {
+ months : 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juniu_Juliu_Augustu_Setembru_Outubru_Novembru_Dezembru'.split('_'),
+ monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Aug_Set_Out_Nov_Dez'.split('_'),
+ weekdays : 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sexta_Sabadu'.split('_'),
+ weekdaysShort : 'Dom_Seg_Ters_Kua_Kint_Sext_Sab'.split('_'),
+ weekdaysMin : 'Do_Seg_Te_Ku_Ki_Sex_Sa'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Ohin iha] LT',
+ nextDay: '[Aban iha] LT',
+ nextWeek: 'dddd [iha] LT',
+ lastDay: '[Horiseik iha] LT',
+ lastWeek: 'dddd [semana kotuk] [iha] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'iha %s',
+ past : '%s liuba',
+ s : 'minutu balun',
+ m : 'minutu ida',
+ mm : 'minutus %d',
+ h : 'horas ida',
+ hh : 'horas %d',
+ d : 'loron ida',
+ dd : 'loron %d',
+ M : 'fulan ida',
+ MM : 'fulan %d',
+ y : 'tinan ida',
+ yy : 'tinan %d'
+ },
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/th.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/th.js
new file mode 100644
index 00000000000..423f827b341
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/th.js
@@ -0,0 +1,57 @@
+//! moment.js locale configuration
+//! locale : Thai [th]
+//! author : Kridsada Thanabulpong : https://github.com/sirn
+
+import moment from '../moment';
+
+export default moment.defineLocale('th', {
+ months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'),
+ monthsShort : 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split('_'),
+ monthsParseExact: true,
+ weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),
+ weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference
+ weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'H:mm',
+ LTS : 'H:mm:ss',
+ L : 'YYYY/MM/DD',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY เวลา H:mm',
+ LLLL : 'วันddddที่ D MMMM YYYY เวลา H:mm'
+ },
+ meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/,
+ isPM: function (input) {
+ return input === 'หลังเที่ยง';
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return 'ก่อนเที่ยง';
+ } else {
+ return 'หลังเที่ยง';
+ }
+ },
+ calendar : {
+ sameDay : '[วันนี้ เวลา] LT',
+ nextDay : '[พรุ่งนี้ เวลา] LT',
+ nextWeek : 'dddd[หน้า เวลา] LT',
+ lastDay : '[เมื่อวานนี้ เวลา] LT',
+ lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'อีก %s',
+ past : '%sที่แล้ว',
+ s : 'ไม่กี่วินาที',
+ m : '1 นาที',
+ mm : '%d นาที',
+ h : '1 ชั่วโมง',
+ hh : '%d ชั่วโมง',
+ d : '1 วัน',
+ dd : '%d วัน',
+ M : '1 เดือน',
+ MM : '%d เดือน',
+ y : '1 ปี',
+ yy : '%d ปี'
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tl-ph.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tl-ph.js
new file mode 100644
index 00000000000..d93f6389b72
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tl-ph.js
@@ -0,0 +1,53 @@
+//! moment.js locale configuration
+//! locale : Tagalog (Philippines) [tl-ph]
+//! author : Dan Hagman : https://github.com/hagmandan
+
+import moment from '../moment';
+
+export default moment.defineLocale('tl-ph', {
+ months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'),
+ monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),
+ weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'),
+ weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),
+ weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'MM/D/YYYY',
+ LL : 'MMMM D, YYYY',
+ LLL : 'MMMM D, YYYY HH:mm',
+ LLLL : 'dddd, MMMM DD, YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: 'LT [ngayong araw]',
+ nextDay: '[Bukas ng] LT',
+ nextWeek: 'LT [sa susunod na] dddd',
+ lastDay: 'LT [kahapon]',
+ lastWeek: 'LT [noong nakaraang] dddd',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'sa loob ng %s',
+ past : '%s ang nakalipas',
+ s : 'ilang segundo',
+ m : 'isang minuto',
+ mm : '%d minuto',
+ h : 'isang oras',
+ hh : '%d oras',
+ d : 'isang araw',
+ dd : '%d araw',
+ M : 'isang buwan',
+ MM : '%d buwan',
+ y : 'isang taon',
+ yy : '%d taon'
+ },
+ ordinalParse: /\d{1,2}/,
+ ordinal : function (number) {
+ return number;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tlh.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tlh.js
new file mode 100644
index 00000000000..af1b08d4ba7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tlh.js
@@ -0,0 +1,110 @@
+//! moment.js locale configuration
+//! locale : Klingon [tlh]
+//! author : Dominika Kruk : https://github.com/amaranthrose
+
+import moment from '../moment';
+
+var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_');
+
+function translateFuture(output) {
+ var time = output;
+ time = (output.indexOf('jaj') !== -1) ?
+ time.slice(0, -3) + 'leS' :
+ (output.indexOf('jar') !== -1) ?
+ time.slice(0, -3) + 'waQ' :
+ (output.indexOf('DIS') !== -1) ?
+ time.slice(0, -3) + 'nem' :
+ time + ' pIq';
+ return time;
+}
+
+function translatePast(output) {
+ var time = output;
+ time = (output.indexOf('jaj') !== -1) ?
+ time.slice(0, -3) + 'Hu’' :
+ (output.indexOf('jar') !== -1) ?
+ time.slice(0, -3) + 'wen' :
+ (output.indexOf('DIS') !== -1) ?
+ time.slice(0, -3) + 'ben' :
+ time + ' ret';
+ return time;
+}
+
+function translate(number, withoutSuffix, string, isFuture) {
+ var numberNoun = numberAsNoun(number);
+ switch (string) {
+ case 'mm':
+ return numberNoun + ' tup';
+ case 'hh':
+ return numberNoun + ' rep';
+ case 'dd':
+ return numberNoun + ' jaj';
+ case 'MM':
+ return numberNoun + ' jar';
+ case 'yy':
+ return numberNoun + ' DIS';
+ }
+}
+
+function numberAsNoun(number) {
+ var hundred = Math.floor((number % 1000) / 100),
+ ten = Math.floor((number % 100) / 10),
+ one = number % 10,
+ word = '';
+ if (hundred > 0) {
+ word += numbersNouns[hundred] + 'vatlh';
+ }
+ if (ten > 0) {
+ word += ((word !== '') ? ' ' : '') + numbersNouns[ten] + 'maH';
+ }
+ if (one > 0) {
+ word += ((word !== '') ? ' ' : '') + numbersNouns[one];
+ }
+ return (word === '') ? 'pagh' : word;
+}
+
+export default moment.defineLocale('tlh', {
+ months : 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split('_'),
+ monthsShort : 'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
+ weekdaysShort : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
+ weekdaysMin : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[DaHjaj] LT',
+ nextDay: '[wa’leS] LT',
+ nextWeek: 'LLL',
+ lastDay: '[wa’Hu’] LT',
+ lastWeek: 'LLL',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : translateFuture,
+ past : translatePast,
+ s : 'puS lup',
+ m : 'wa’ tup',
+ mm : translate,
+ h : 'wa’ rep',
+ hh : translate,
+ d : 'wa’ jaj',
+ dd : translate,
+ M : 'wa’ jar',
+ MM : translate,
+ y : 'wa’ DIS',
+ yy : translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tr.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tr.js
new file mode 100644
index 00000000000..0ae427acbe3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tr.js
@@ -0,0 +1,81 @@
+//! moment.js locale configuration
+//! locale : Turkish [tr]
+//! authors : Erhan Gundogan : https://github.com/erhangundogan,
+//! Burak Yiğit Kaya: https://github.com/BYK
+
+import moment from '../moment';
+
+var suffixes = {
+ 1: '\'inci',
+ 5: '\'inci',
+ 8: '\'inci',
+ 70: '\'inci',
+ 80: '\'inci',
+ 2: '\'nci',
+ 7: '\'nci',
+ 20: '\'nci',
+ 50: '\'nci',
+ 3: '\'üncü',
+ 4: '\'üncü',
+ 100: '\'üncü',
+ 6: '\'ncı',
+ 9: '\'uncu',
+ 10: '\'uncu',
+ 30: '\'uncu',
+ 60: '\'ıncı',
+ 90: '\'ıncı'
+};
+
+export default moment.defineLocale('tr', {
+ months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'),
+ monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'),
+ weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'),
+ weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'),
+ weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[bugün saat] LT',
+ nextDay : '[yarın saat] LT',
+ nextWeek : '[haftaya] dddd [saat] LT',
+ lastDay : '[dün] LT',
+ lastWeek : '[geçen hafta] dddd [saat] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%s sonra',
+ past : '%s önce',
+ s : 'birkaç saniye',
+ m : 'bir dakika',
+ mm : '%d dakika',
+ h : 'bir saat',
+ hh : '%d saat',
+ d : 'bir gün',
+ dd : '%d gün',
+ M : 'bir ay',
+ MM : '%d ay',
+ y : 'bir yıl',
+ yy : '%d yıl'
+ },
+ ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,
+ ordinal : function (number) {
+ if (number === 0) { // special case for zero
+ return number + '\'ıncı';
+ }
+ var a = number % 10,
+ b = number % 100 - a,
+ c = number >= 100 ? 100 : null;
+ return number + (suffixes[a] || suffixes[b] || suffixes[c]);
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tzl.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tzl.js
new file mode 100644
index 00000000000..d4fcdbfde2d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tzl.js
@@ -0,0 +1,82 @@
+//! moment.js locale configuration
+//! locale : Talossan [tzl]
+//! author : Robin van der Vliet : https://github.com/robin0van0der0v
+//! author : Iustì Canun
+
+import moment from '../moment';
+
+// After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals.
+// This is currently too difficult (maybe even impossible) to add.
+export default moment.defineLocale('tzl', {
+ months : 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split('_'),
+ monthsShort : 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'),
+ weekdays : 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'),
+ weekdaysShort : 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'),
+ weekdaysMin : 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D. MMMM [dallas] YYYY',
+ LLL : 'D. MMMM [dallas] YYYY HH.mm',
+ LLLL : 'dddd, [li] D. MMMM [dallas] YYYY HH.mm'
+ },
+ meridiemParse: /d\'o|d\'a/i,
+ isPM : function (input) {
+ return 'd\'o' === input.toLowerCase();
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'd\'o' : 'D\'O';
+ } else {
+ return isLower ? 'd\'a' : 'D\'A';
+ }
+ },
+ calendar : {
+ sameDay : '[oxhi à] LT',
+ nextDay : '[demà à] LT',
+ nextWeek : 'dddd [à] LT',
+ lastDay : '[ieiri à] LT',
+ lastWeek : '[sür el] dddd [lasteu à] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'osprei %s',
+ past : 'ja%s',
+ s : processRelativeTime,
+ m : processRelativeTime,
+ mm : processRelativeTime,
+ h : processRelativeTime,
+ hh : processRelativeTime,
+ d : processRelativeTime,
+ dd : processRelativeTime,
+ M : processRelativeTime,
+ MM : processRelativeTime,
+ y : processRelativeTime,
+ yy : processRelativeTime
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
+function processRelativeTime(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 's': ['viensas secunds', '\'iensas secunds'],
+ 'm': ['\'n míut', '\'iens míut'],
+ 'mm': [number + ' míuts', '' + number + ' míuts'],
+ 'h': ['\'n þora', '\'iensa þora'],
+ 'hh': [number + ' þoras', '' + number + ' þoras'],
+ 'd': ['\'n ziua', '\'iensa ziua'],
+ 'dd': [number + ' ziuas', '' + number + ' ziuas'],
+ 'M': ['\'n mes', '\'iens mes'],
+ 'MM': [number + ' mesen', '' + number + ' mesen'],
+ 'y': ['\'n ar', '\'iens ar'],
+ 'yy': [number + ' ars', '' + number + ' ars']
+ };
+ return isFuture ? format[key][0] : (withoutSuffix ? format[key][0] : format[key][1]);
+}
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tzm-latn.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tzm-latn.js
new file mode 100644
index 00000000000..aaf62d70c05
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tzm-latn.js
@@ -0,0 +1,49 @@
+//! moment.js locale configuration
+//! locale : Central Atlas Tamazight Latin [tzm-latn]
+//! author : Abdel Said : https://github.com/abdelsaid
+
+import moment from '../moment';
+
+export default moment.defineLocale('tzm-latn', {
+ months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),
+ monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),
+ weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
+ weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
+ weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[asdkh g] LT',
+ nextDay: '[aska g] LT',
+ nextWeek: 'dddd [g] LT',
+ lastDay: '[assant g] LT',
+ lastWeek: 'dddd [g] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'dadkh s yan %s',
+ past : 'yan %s',
+ s : 'imik',
+ m : 'minuḍ',
+ mm : '%d minuḍ',
+ h : 'saɛa',
+ hh : '%d tassaɛin',
+ d : 'ass',
+ dd : '%d ossan',
+ M : 'ayowr',
+ MM : '%d iyyirn',
+ y : 'asgas',
+ yy : '%d isgasn'
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tzm.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tzm.js
new file mode 100644
index 00000000000..663f85f4cb9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/tzm.js
@@ -0,0 +1,49 @@
+//! moment.js locale configuration
+//! locale : Central Atlas Tamazight [tzm]
+//! author : Abdel Said : https://github.com/abdelsaid
+
+import moment from '../moment';
+
+export default moment.defineLocale('tzm', {
+ months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),
+ monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),
+ weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
+ weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
+ weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[ⴰⵙⴷⵅ ⴴ] LT',
+ nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',
+ nextWeek: 'dddd [ⴴ] LT',
+ lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',
+ lastWeek: 'dddd [ⴴ] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s',
+ past : 'ⵢⴰⵏ %s',
+ s : 'ⵉⵎⵉⴽ',
+ m : 'ⵎⵉⵏⵓⴺ',
+ mm : '%d ⵎⵉⵏⵓⴺ',
+ h : 'ⵙⴰⵄⴰ',
+ hh : '%d ⵜⴰⵙⵙⴰⵄⵉⵏ',
+ d : 'ⴰⵙⵙ',
+ dd : '%d oⵙⵙⴰⵏ',
+ M : 'ⴰⵢoⵓⵔ',
+ MM : '%d ⵉⵢⵢⵉⵔⵏ',
+ y : 'ⴰⵙⴳⴰⵙ',
+ yy : '%d ⵉⵙⴳⴰⵙⵏ'
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/uk.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/uk.js
new file mode 100644
index 00000000000..f5f793cfb4f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/uk.js
@@ -0,0 +1,137 @@
+//! moment.js locale configuration
+//! locale : Ukrainian [uk]
+//! author : zemlanin : https://github.com/zemlanin
+//! Author : Menelion Elensúle : https://github.com/Oire
+
+import moment from '../moment';
+
+function plural(word, num) {
+ var forms = word.split('_');
+ return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+}
+function relativeTimeWithPlural(number, withoutSuffix, key) {
+ var format = {
+ 'mm': withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин',
+ 'hh': withoutSuffix ? 'година_години_годин' : 'годину_години_годин',
+ 'dd': 'день_дні_днів',
+ 'MM': 'місяць_місяці_місяців',
+ 'yy': 'рік_роки_років'
+ };
+ if (key === 'm') {
+ return withoutSuffix ? 'хвилина' : 'хвилину';
+ }
+ else if (key === 'h') {
+ return withoutSuffix ? 'година' : 'годину';
+ }
+ else {
+ return number + ' ' + plural(format[key], +number);
+ }
+}
+function weekdaysCaseReplace(m, format) {
+ var weekdays = {
+ 'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'),
+ 'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'),
+ 'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_')
+ },
+ nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ?
+ 'accusative' :
+ ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ?
+ 'genitive' :
+ 'nominative');
+ return weekdays[nounCase][m.day()];
+}
+function processHoursFunction(str) {
+ return function () {
+ return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
+ };
+}
+
+export default moment.defineLocale('uk', {
+ months : {
+ 'format': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_'),
+ 'standalone': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_')
+ },
+ monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'),
+ weekdays : weekdaysCaseReplace,
+ weekdaysShort : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
+ weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD.MM.YYYY',
+ LL : 'D MMMM YYYY р.',
+ LLL : 'D MMMM YYYY р., HH:mm',
+ LLLL : 'dddd, D MMMM YYYY р., HH:mm'
+ },
+ calendar : {
+ sameDay: processHoursFunction('[Сьогодні '),
+ nextDay: processHoursFunction('[Завтра '),
+ lastDay: processHoursFunction('[Вчора '),
+ nextWeek: processHoursFunction('[У] dddd ['),
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ case 5:
+ case 6:
+ return processHoursFunction('[Минулої] dddd [').call(this);
+ case 1:
+ case 2:
+ case 4:
+ return processHoursFunction('[Минулого] dddd [').call(this);
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'за %s',
+ past : '%s тому',
+ s : 'декілька секунд',
+ m : relativeTimeWithPlural,
+ mm : relativeTimeWithPlural,
+ h : 'годину',
+ hh : relativeTimeWithPlural,
+ d : 'день',
+ dd : relativeTimeWithPlural,
+ M : 'місяць',
+ MM : relativeTimeWithPlural,
+ y : 'рік',
+ yy : relativeTimeWithPlural
+ },
+ // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
+ meridiemParse: /ночі|ранку|дня|вечора/,
+ isPM: function (input) {
+ return /^(дня|вечора)$/.test(input);
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return 'ночі';
+ } else if (hour < 12) {
+ return 'ранку';
+ } else if (hour < 17) {
+ return 'дня';
+ } else {
+ return 'вечора';
+ }
+ },
+ ordinalParse: /\d{1,2}-(й|го)/,
+ ordinal: function (number, period) {
+ switch (period) {
+ case 'M':
+ case 'd':
+ case 'DDD':
+ case 'w':
+ case 'W':
+ return number + '-й';
+ case 'D':
+ return number + '-го';
+ default:
+ return number;
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/uz.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/uz.js
new file mode 100644
index 00000000000..24a80e19031
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/uz.js
@@ -0,0 +1,49 @@
+//! moment.js locale configuration
+//! locale : Uzbek [uz]
+//! author : Sardor Muminov : https://github.com/muminoff
+
+import moment from '../moment';
+
+export default moment.defineLocale('uz', {
+ months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'),
+ monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
+ weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),
+ weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'),
+ weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'D MMMM YYYY, dddd HH:mm'
+ },
+ calendar : {
+ sameDay : '[Бугун соат] LT [да]',
+ nextDay : '[Эртага] LT [да]',
+ nextWeek : 'dddd [куни соат] LT [да]',
+ lastDay : '[Кеча соат] LT [да]',
+ lastWeek : '[Утган] dddd [куни соат] LT [да]',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'Якин %s ичида',
+ past : 'Бир неча %s олдин',
+ s : 'фурсат',
+ m : 'бир дакика',
+ mm : '%d дакика',
+ h : 'бир соат',
+ hh : '%d соат',
+ d : 'бир кун',
+ dd : '%d кун',
+ M : 'бир ой',
+ MM : '%d ой',
+ y : 'бир йил',
+ yy : '%d йил'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/vi.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/vi.js
new file mode 100644
index 00000000000..bbd81cada9e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/vi.js
@@ -0,0 +1,70 @@
+//! moment.js locale configuration
+//! locale : Vietnamese [vi]
+//! author : Bang Nguyen : https://github.com/bangnk
+
+import moment from '../moment';
+
+export default moment.defineLocale('vi', {
+ months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'),
+ monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'),
+ weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
+ weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
+ weekdaysParseExact : true,
+ meridiemParse: /sa|ch/i,
+ isPM : function (input) {
+ return /^ch$/i.test(input);
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 12) {
+ return isLower ? 'sa' : 'SA';
+ } else {
+ return isLower ? 'ch' : 'CH';
+ }
+ },
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM [năm] YYYY',
+ LLL : 'D MMMM [năm] YYYY HH:mm',
+ LLLL : 'dddd, D MMMM [năm] YYYY HH:mm',
+ l : 'DD/M/YYYY',
+ ll : 'D MMM YYYY',
+ lll : 'D MMM YYYY HH:mm',
+ llll : 'ddd, D MMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay: '[Hôm nay lúc] LT',
+ nextDay: '[Ngày mai lúc] LT',
+ nextWeek: 'dddd [tuần tới lúc] LT',
+ lastDay: '[Hôm qua lúc] LT',
+ lastWeek: 'dddd [tuần rồi lúc] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : '%s tới',
+ past : '%s trước',
+ s : 'vài giây',
+ m : 'một phút',
+ mm : '%d phút',
+ h : 'một giờ',
+ hh : '%d giờ',
+ d : 'một ngày',
+ dd : '%d ngày',
+ M : 'một tháng',
+ MM : '%d tháng',
+ y : 'một năm',
+ yy : '%d năm'
+ },
+ ordinalParse: /\d{1,2}/,
+ ordinal : function (number) {
+ return number;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/x-pseudo.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/x-pseudo.js
new file mode 100644
index 00000000000..008359eb51c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/x-pseudo.js
@@ -0,0 +1,58 @@
+//! moment.js locale configuration
+//! locale : Pseudo [x-pseudo]
+//! author : Andrew Hood : https://github.com/andrewhood125
+
+import moment from '../moment';
+
+export default moment.defineLocale('x-pseudo', {
+ months : 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split('_'),
+ monthsShort : 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split('_'),
+ monthsParseExact : true,
+ weekdays : 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split('_'),
+ weekdaysShort : 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'),
+ weekdaysMin : 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'),
+ weekdaysParseExact : true,
+ longDateFormat : {
+ LT : 'HH:mm',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY HH:mm',
+ LLLL : 'dddd, D MMMM YYYY HH:mm'
+ },
+ calendar : {
+ sameDay : '[T~ódá~ý át] LT',
+ nextDay : '[T~ómó~rró~w át] LT',
+ nextWeek : 'dddd [át] LT',
+ lastDay : '[Ý~ést~érdá~ý át] LT',
+ lastWeek : '[L~ást] dddd [át] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'í~ñ %s',
+ past : '%s á~gó',
+ s : 'á ~féw ~sécó~ñds',
+ m : 'á ~míñ~úté',
+ mm : '%d m~íñú~tés',
+ h : 'á~ñ hó~úr',
+ hh : '%d h~óúrs',
+ d : 'á ~dáý',
+ dd : '%d d~áýs',
+ M : 'á ~móñ~th',
+ MM : '%d m~óñt~hs',
+ y : 'á ~ýéár',
+ yy : '%d ý~éárs'
+ },
+ ordinalParse: /\d{1,2}(th|st|nd|rd)/,
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/yo.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/yo.js
new file mode 100644
index 00000000000..e7ee7a28642
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/yo.js
@@ -0,0 +1,50 @@
+//! moment.js locale configuration
+//! locale : Yoruba Nigeria [yo]
+//! author : Atolagbe Abisoye : https://github.com/andela-batolagbe
+
+import moment from '../moment';
+
+export default moment.defineLocale('yo', {
+ months : 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split('_'),
+ monthsShort : 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'),
+ weekdays : 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'),
+ weekdaysShort : 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'),
+ weekdaysMin : 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'),
+ longDateFormat : {
+ LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY h:mm A',
+ LLLL : 'dddd, D MMMM YYYY h:mm A'
+ },
+ calendar : {
+ sameDay : '[Ònì ni] LT',
+ nextDay : '[Ọ̀la ni] LT',
+ nextWeek : 'dddd [Ọsẹ̀ tón\'bọ] [ni] LT',
+ lastDay : '[Àna ni] LT',
+ lastWeek : 'dddd [Ọsẹ̀ tólọ́] [ni] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'ní %s',
+ past : '%s kọjá',
+ s : 'ìsẹjú aayá die',
+ m : 'ìsẹjú kan',
+ mm : 'ìsẹjú %d',
+ h : 'wákati kan',
+ hh : 'wákati %d',
+ d : 'ọjọ́ kan',
+ dd : 'ọjọ́ %d',
+ M : 'osù kan',
+ MM : 'osù %d',
+ y : 'ọdún kan',
+ yy : 'ọdún %d'
+ },
+ ordinalParse : /ọjọ́\s\d{1,2}/,
+ ordinal : 'ọjọ́ %d',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/zh-cn.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/zh-cn.js
new file mode 100644
index 00000000000..031c50e6646
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/zh-cn.js
@@ -0,0 +1,118 @@
+//! moment.js locale configuration
+//! locale : Chinese (China) [zh-cn]
+//! author : suupic : https://github.com/suupic
+//! author : Zeno Zeng : https://github.com/zenozeng
+
+import moment from '../moment';
+
+export default moment.defineLocale('zh-cn', {
+ months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
+ monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+ weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
+ weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'),
+ weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
+ longDateFormat : {
+ LT : 'Ah点mm分',
+ LTS : 'Ah点m分s秒',
+ L : 'YYYY-MM-DD',
+ LL : 'YYYY年MMMD日',
+ LLL : 'YYYY年MMMD日Ah点mm分',
+ LLLL : 'YYYY年MMMD日ddddAh点mm分',
+ l : 'YYYY-MM-DD',
+ ll : 'YYYY年MMMD日',
+ lll : 'YYYY年MMMD日Ah点mm分',
+ llll : 'YYYY年MMMD日ddddAh点mm分'
+ },
+ meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
+ meridiemHour: function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === '凌晨' || meridiem === '早上' ||
+ meridiem === '上午') {
+ return hour;
+ } else if (meridiem === '下午' || meridiem === '晚上') {
+ return hour + 12;
+ } else {
+ // '中午'
+ return hour >= 11 ? hour : hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ var hm = hour * 100 + minute;
+ if (hm < 600) {
+ return '凌晨';
+ } else if (hm < 900) {
+ return '早上';
+ } else if (hm < 1130) {
+ return '上午';
+ } else if (hm < 1230) {
+ return '中午';
+ } else if (hm < 1800) {
+ return '下午';
+ } else {
+ return '晚上';
+ }
+ },
+ calendar : {
+ sameDay : function () {
+ return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT';
+ },
+ nextDay : function () {
+ return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT';
+ },
+ lastDay : function () {
+ return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT';
+ },
+ nextWeek : function () {
+ var startOfWeek, prefix;
+ startOfWeek = moment().startOf('week');
+ prefix = this.diff(startOfWeek, 'days') >= 7 ? '[下]' : '[本]';
+ return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
+ },
+ lastWeek : function () {
+ var startOfWeek, prefix;
+ startOfWeek = moment().startOf('week');
+ prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]';
+ return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
+ },
+ sameElse : 'LL'
+ },
+ ordinalParse: /\d{1,2}(日|月|周)/,
+ ordinal : function (number, period) {
+ switch (period) {
+ case 'd':
+ case 'D':
+ case 'DDD':
+ return number + '日';
+ case 'M':
+ return number + '月';
+ case 'w':
+ case 'W':
+ return number + '周';
+ default:
+ return number;
+ }
+ },
+ relativeTime : {
+ future : '%s内',
+ past : '%s前',
+ s : '几秒',
+ m : '1 分钟',
+ mm : '%d 分钟',
+ h : '1 小时',
+ hh : '%d 小时',
+ d : '1 天',
+ dd : '%d 天',
+ M : '1 个月',
+ MM : '%d 个月',
+ y : '1 年',
+ yy : '%d 年'
+ },
+ week : {
+ // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+});
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/zh-hk.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/zh-hk.js
new file mode 100644
index 00000000000..51d385d89af
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/zh-hk.js
@@ -0,0 +1,95 @@
+//! moment.js locale configuration
+//! locale : Chinese (Hong Kong) [zh-hk]
+//! author : Ben : https://github.com/ben-lin
+//! author : Chris Lam : https://github.com/hehachris
+//! author : Konstantin : https://github.com/skfd
+
+import moment from '../moment';
+
+export default moment.defineLocale('zh-hk', {
+ months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
+ monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+ weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
+ weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'),
+ weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
+ longDateFormat : {
+ LT : 'Ah點mm分',
+ LTS : 'Ah點m分s秒',
+ L : 'YYYY年MMMD日',
+ LL : 'YYYY年MMMD日',
+ LLL : 'YYYY年MMMD日Ah點mm分',
+ LLLL : 'YYYY年MMMD日ddddAh點mm分',
+ l : 'YYYY年MMMD日',
+ ll : 'YYYY年MMMD日',
+ lll : 'YYYY年MMMD日Ah點mm分',
+ llll : 'YYYY年MMMD日ddddAh點mm分'
+ },
+ meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
+ return hour;
+ } else if (meridiem === '中午') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === '下午' || meridiem === '晚上') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ var hm = hour * 100 + minute;
+ if (hm < 600) {
+ return '凌晨';
+ } else if (hm < 900) {
+ return '早上';
+ } else if (hm < 1130) {
+ return '上午';
+ } else if (hm < 1230) {
+ return '中午';
+ } else if (hm < 1800) {
+ return '下午';
+ } else {
+ return '晚上';
+ }
+ },
+ calendar : {
+ sameDay : '[今天]LT',
+ nextDay : '[明天]LT',
+ nextWeek : '[下]ddddLT',
+ lastDay : '[昨天]LT',
+ lastWeek : '[上]ddddLT',
+ sameElse : 'L'
+ },
+ ordinalParse: /\d{1,2}(日|月|週)/,
+ ordinal : function (number, period) {
+ switch (period) {
+ case 'd' :
+ case 'D' :
+ case 'DDD' :
+ return number + '日';
+ case 'M' :
+ return number + '月';
+ case 'w' :
+ case 'W' :
+ return number + '週';
+ default :
+ return number;
+ }
+ },
+ relativeTime : {
+ future : '%s內',
+ past : '%s前',
+ s : '幾秒',
+ m : '1 分鐘',
+ mm : '%d 分鐘',
+ h : '1 小時',
+ hh : '%d 小時',
+ d : '1 天',
+ dd : '%d 天',
+ M : '1 個月',
+ MM : '%d 個月',
+ y : '1 年',
+ yy : '%d 年'
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/zh-tw.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/zh-tw.js
new file mode 100644
index 00000000000..577d61eb59f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/locale/zh-tw.js
@@ -0,0 +1,94 @@
+//! moment.js locale configuration
+//! locale : Chinese (Taiwan) [zh-tw]
+//! author : Ben : https://github.com/ben-lin
+//! author : Chris Lam : https://github.com/hehachris
+
+import moment from '../moment';
+
+export default moment.defineLocale('zh-tw', {
+ months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
+ monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+ weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
+ weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'),
+ weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
+ longDateFormat : {
+ LT : 'Ah點mm分',
+ LTS : 'Ah點m分s秒',
+ L : 'YYYY年MMMD日',
+ LL : 'YYYY年MMMD日',
+ LLL : 'YYYY年MMMD日Ah點mm分',
+ LLLL : 'YYYY年MMMD日ddddAh點mm分',
+ l : 'YYYY年MMMD日',
+ ll : 'YYYY年MMMD日',
+ lll : 'YYYY年MMMD日Ah點mm分',
+ llll : 'YYYY年MMMD日ddddAh點mm分'
+ },
+ meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
+ return hour;
+ } else if (meridiem === '中午') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === '下午' || meridiem === '晚上') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hour, minute, isLower) {
+ var hm = hour * 100 + minute;
+ if (hm < 600) {
+ return '凌晨';
+ } else if (hm < 900) {
+ return '早上';
+ } else if (hm < 1130) {
+ return '上午';
+ } else if (hm < 1230) {
+ return '中午';
+ } else if (hm < 1800) {
+ return '下午';
+ } else {
+ return '晚上';
+ }
+ },
+ calendar : {
+ sameDay : '[今天]LT',
+ nextDay : '[明天]LT',
+ nextWeek : '[下]ddddLT',
+ lastDay : '[昨天]LT',
+ lastWeek : '[上]ddddLT',
+ sameElse : 'L'
+ },
+ ordinalParse: /\d{1,2}(日|月|週)/,
+ ordinal : function (number, period) {
+ switch (period) {
+ case 'd' :
+ case 'D' :
+ case 'DDD' :
+ return number + '日';
+ case 'M' :
+ return number + '月';
+ case 'w' :
+ case 'W' :
+ return number + '週';
+ default :
+ return number;
+ }
+ },
+ relativeTime : {
+ future : '%s內',
+ past : '%s前',
+ s : '幾秒',
+ m : '1 分鐘',
+ mm : '%d 分鐘',
+ h : '1 小時',
+ hh : '%d 小時',
+ d : '1 天',
+ dd : '%d 天',
+ M : '1 個月',
+ MM : '%d 個月',
+ y : '1 年',
+ yy : '%d 年'
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/moment.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/moment.js
new file mode 100644
index 00000000000..859c2f9bc82
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/src/moment.js
@@ -0,0 +1,82 @@
+//! moment.js
+//! version : 2.17.1
+//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
+//! license : MIT
+//! momentjs.com
+
+import { hooks as moment, setHookCallback } from './lib/utils/hooks';
+
+moment.version = '2.17.1';
+
+import {
+ min,
+ max,
+ now,
+ isMoment,
+ momentPrototype as fn,
+ createUTC as utc,
+ createUnix as unix,
+ createLocal as local,
+ createInvalid as invalid,
+ createInZone as parseZone
+} from './lib/moment/moment';
+
+import {
+ getCalendarFormat
+} from './lib/moment/calendar';
+
+import {
+ defineLocale,
+ updateLocale,
+ getSetGlobalLocale as locale,
+ getLocale as localeData,
+ listLocales as locales,
+ listMonths as months,
+ listMonthsShort as monthsShort,
+ listWeekdays as weekdays,
+ listWeekdaysMin as weekdaysMin,
+ listWeekdaysShort as weekdaysShort
+} from './lib/locale/locale';
+
+import {
+ isDuration,
+ createDuration as duration,
+ getSetRelativeTimeRounding as relativeTimeRounding,
+ getSetRelativeTimeThreshold as relativeTimeThreshold
+} from './lib/duration/duration';
+
+import { normalizeUnits } from './lib/units/units';
+
+import isDate from './lib/utils/is-date';
+
+setHookCallback(local);
+
+moment.fn = fn;
+moment.min = min;
+moment.max = max;
+moment.now = now;
+moment.utc = utc;
+moment.unix = unix;
+moment.months = months;
+moment.isDate = isDate;
+moment.locale = locale;
+moment.invalid = invalid;
+moment.duration = duration;
+moment.isMoment = isMoment;
+moment.weekdays = weekdays;
+moment.parseZone = parseZone;
+moment.localeData = localeData;
+moment.isDuration = isDuration;
+moment.monthsShort = monthsShort;
+moment.weekdaysMin = weekdaysMin;
+moment.defineLocale = defineLocale;
+moment.updateLocale = updateLocale;
+moment.locales = locales;
+moment.weekdaysShort = weekdaysShort;
+moment.normalizeUnits = normalizeUnits;
+moment.relativeTimeRounding = relativeTimeRounding;
+moment.relativeTimeThreshold = relativeTimeThreshold;
+moment.calendarFormat = getCalendarFormat;
+moment.prototype = fn;
+
+export default moment;
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/templates/default.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/templates/default.js
new file mode 100644
index 00000000000..095a78f54ba
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/templates/default.js
@@ -0,0 +1,5 @@
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ global.moment = factory()
+}(this, (function () { 'use strict';
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/templates/locale-header.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/templates/locale-header.js
new file mode 100644
index 00000000000..eadcc1d81f8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/templates/locale-header.js
@@ -0,0 +1,6 @@
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../moment')) :
+ typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/templates/test-header.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/templates/test-header.js
new file mode 100644
index 00000000000..1b208a359bb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/moment/templates/test-header.js
@@ -0,0 +1,6 @@
+;(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined'
+ && typeof require === 'function' ? factory(require('../../moment')) :
+ typeof define === 'function' && define.amd ? define(['../../moment'], factory) :
+ factory(global.moment)
+}(this, (function (moment) { 'use strict';
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/.bower.json
new file mode 100644
index 00000000000..b353dd13762
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/.bower.json
@@ -0,0 +1,90 @@
+{
+ "name": "neon-animation",
+ "description": "A system for animating Polymer-based web components",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "web-component",
+ "polymer",
+ "web-animations"
+ ],
+ "main": [
+ "neon-animated-pages.html",
+ "neon-animatable-behavior.html",
+ "neon-animation-behavior.html",
+ "neon-animation-runner-behavior.html",
+ "neon-shared-element-animatable-behavior.html",
+ "neon-shared-element-animation-behavior.html",
+ "neon-animatable.html",
+ "neon-animations.html"
+ ],
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/neon-animation"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/neon-animation",
+ "ignore": [],
+ "demos": {
+ "Demo": "demo/index.html"
+ },
+ "dependencies": {
+ "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#1 - 2",
+ "iron-selector": "PolymerElements/iron-selector#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "app-layout": "PolymerElements/app-layout#1 - 2",
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-icon": "PolymerElements/iron-icon#1 - 2",
+ "iron-icons": "PolymerElements/iron-icons#1 - 2",
+ "paper-icon-button": "PolymerElements/paper-icon-button#1 - 2",
+ "paper-item": "PolymerElements/paper-item#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "web-animations-js": "web-animations/web-animations-js#^2.2.0",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0",
+ "iron-selector": "PolymerElements/iron-selector#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9",
+ "web-animations-js": "web-animations/web-animations-js#^2.2.0"
+ },
+ "devDependencies": {
+ "app-layout": "PolymerElements/app-layout#^0.10.0",
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "iron-icon": "PolymerElements/iron-icon#^1.0.0",
+ "iron-icons": "PolymerElements/iron-icons#^1.0.0",
+ "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0",
+ "paper-item": "PolymerElements/paper-item#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "version": "2.2.1",
+ "_release": "2.2.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.2.1",
+ "commit": "e7508084d0a99cc9fedad1964efb4e69c8527629"
+ },
+ "_source": "https://github.com/PolymerElements/neon-animation.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/neon-animation"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/.github/CODEOWNERS
new file mode 100644
index 00000000000..9ef9eb64211
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @e111077
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..08943a1e152
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/neon-animation/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/.travis.yml
new file mode 100644
index 00000000000..dfdc7d99adc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/.travis.yml
@@ -0,0 +1,30 @@
+language: node_js
+sudo: required
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+ sauce_connect: true
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+env:
+ global:
+ - secure: >-
+ coZBjQTrTsejOS2utVzo0hhyYRF40H2KoN30G44tRxVKV/0orSm1HJbvG2YDb/tmAFtEObJmNlYonu1I3G9RVncn9y69nRf8BjLHrpOIhNvesug7kPUuprj5KRoLo9O0UyIYmUh6i4YGt1aAeR/Wq/XVifSNIXnAVguzntbSmqvWJdqj8+FHmNzyo5269+tnOzTruXByrUcSZnvNgHjCYFZOY00a29cyK6fTdd0Qbzi9cvhEDfx1j6uXzYah7bdA8caunW1HvxwI+jiV8yEVySB7eku+SHA+8JJUIIZEL1iCASAqqVbTUoOxtfgbTXQRJdVAuDNj1J+AqFVtuJpJl4xvX97dF9FVQvgyLW9fpeb7rojdU0TSazBpVi7LLvocQjofp8bbAtbJ8Z0BN+/3DgM33uDTF8DeBGj2WmR+49F2oPnYh7FwjhbiOVqkOKyolqrRpK0PYczVdHusR6+cONkGcLzO9G5nakWzE9diJSW+nw9qD3bVL99ZzHK+6U7+R75KJdxj0V7VA1lkvWRlchxXrpsEoM0AQEUf97LsvkTpXPQ4Wf9XkCxFRAicSTeDijLCPy3ti0L6D6x9sBZwV5d3ODnkdxCAy2aY7g2YEWuuBDZC+W1ggQ3Xe705GwbBNk22HikA6XOVX9lb3xm7SnenfDGkFhNDzRijoGg96jU=
+ - secure: >-
+ hJ6VMaJqDh5HPdeERIqoOcdWZJTAOTeS/Lr6FLCWEOOvYPxwRi/L1pKbVuYf2ugeS2Z0TEvAS7RdfjRuC+NGFhsmpnpBlxAyJhVKcXrhHKVtoFK04xaCD2wDMkPaZiDZQRGF/H6/PyuoB4Tqss3aN/DC9eSMwY9HFfoeYRIwiJeb8Kq09pBtvoxU151VQt+jlmyCVw7rhNDTAazaCGKicgvbAtxSJ6xNswNfqOrtCYB+WW5CpUE+qqTjjbistSQJu3hjk2UwFMLJZXtJWdkcD88vNdHy3mtNZQNtE8x+ckNVqgJ98DyAN7HLUU0GvzTOiOGFfwr+bpl6Td8klR2YoQOW4ypluAetcDN9X7tKOxDQaaI8AyPLXPWi9JcESEGAeLzpfkWZ6clrQmqfLdVDsqYKPldF9m7Ozjdhq40r3qFdQAdEI29dBOKOalaZXgWnvU2wu5FBtWnBMSk89zOYC5wGR0E+wOMMMRu90LuMQY40Myhqso5iUFL5qhrn41I8ZfFi0EyOgEeKzYH3zrdo7/msEkCXxI0SKfG1CGSQSOT2luO6Xu6xIuf7qoWYKJiJQ40ObsRKn0cA4GQpNZe/dgKMRH2zzfKW6d2BSAsZGTDJG14XcDi9d/zz7djgboMjc/A6sH8L3c8BkbUa4wuyJRNu7VBZQHq5yrnHpxC6SbA=
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/README.md
new file mode 100644
index 00000000000..a8d1a4166fa
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/README.md
@@ -0,0 +1,299 @@
+## Changes in 2.0
+* ⚠️ This Element is now deprecated ⚠️
+ * Please use the web animations api or CSS animations
+* Web animations polyfill is now a dev dependency
+
+# neon-animation
+
+`neon-animation` is a suite of elements and behaviors to implement pluggable animated transitions for Polymer Elements using [Web Animations](https://w3c.github.io/web-animations/).
+
+*Warning: The API may change.*
+
+* [A basic animatable element](#basic)
+* [Animation configuration](#configuration)
+ * [Animation types](#configuration-types)
+ * [Configuration properties](#configuration-properties)
+ * [Using multiple animations](#configuration-multiple)
+ * [Running animations encapsulated in children nodes](#configuration-encapsulation)
+* [Page transitions](#page-transitions)
+ * [Shared element animations](#shared-element)
+ * [Declarative page transitions](#declarative-page)
+* [Included animations](#animations)
+
+<a name="basic"></a>
+## A basic animatable element
+
+Elements that can be animated should implement the `Polymer.NeonAnimatableBehavior` behavior, or `Polymer.NeonAnimationRunnerBehavior` if they're also responsible for running an animation.
+
+```js
+Polymer({
+ is: 'my-animatable',
+ behaviors: [
+ Polymer.NeonAnimationRunnerBehavior
+ ],
+ properties: {
+ animationConfig: {
+ value: function() {
+ return {
+ // provided by neon-animation/animations/scale-down-animation.html
+ name: 'scale-down-animation',
+ node: this
+ }
+ }
+ }
+ },
+ listeners: {
+ // this event is fired when the animation finishes
+ 'neon-animation-finish': '_onNeonAnimationFinish'
+ },
+ animate: function() {
+ // run scale-down-animation
+ this.playAnimation();
+ },
+ _onNeonAnimationFinish: function() {
+ console.log('animation done!');
+ }
+});
+```
+
+
+<a name="configuration"></a>
+## Animation configuration
+
+<a name="configuration-types"></a>
+### Animation types
+
+An element might run different animations, for example it might do something different when it enters the view and when it exits from view. You can set the `animationConfig` property to a map from an animation type to configuration.
+
+```js
+Polymer({
+ is: 'my-dialog',
+ behaviors: [
+ Polymer.NeonAnimationRunnerBehavior
+ ],
+ properties: {
+ opened: {
+ type: Boolean
+ },
+ animationConfig: {
+ value: function() {
+ return {
+ 'entry': {
+ // provided by neon-animation/animations/scale-up-animation.html
+ name: 'scale-up-animation',
+ node: this
+ },
+ 'exit': {
+ // provided by neon-animation/animations/fade-out-animation.html
+ name: 'fade-out-animation',
+ node: this
+ }
+ }
+ }
+ }
+ },
+ listeners: {
+ 'neon-animation-finish': '_onNeonAnimationFinish'
+ },
+ show: function() {
+ this.opened = true;
+ this.style.display = 'inline-block';
+ // run scale-up-animation
+ this.playAnimation('entry');
+ },
+ hide: function() {
+ this.opened = false;
+ // run fade-out-animation
+ this.playAnimation('exit');
+ },
+ _onNeonAnimationFinish: function() {
+ if (!this.opened) {
+ this.style.display = 'none';
+ }
+ }
+});
+```
+
+
+You can also use the convenience properties `entryAnimation` and `exitAnimation` to set `entry` and `exit` animations:
+
+```js
+properties: {
+ entryAnimation: {
+ value: 'scale-up-animation'
+ },
+ exitAnimation: {
+ value: 'fade-out-animation'
+ }
+}
+```
+
+<a name="configuration-properties"></a>
+### Configuration properties
+
+You can pass additional parameters to configure an animation in the animation configuration object.
+All animations should accept the following properties:
+
+ * `name`: The name of an animation, ie. an element implementing `Polymer.NeonAnimationBehavior`.
+ * `node`: The target node to apply the animation to. Defaults to `this`.
+ * `timing`: Timing properties to use in this animation. They match the [Web Animations Animation Effect Timing interface](https://w3c.github.io/web-animations/#the-animationeffecttiming-interface). The
+ properties include the following:
+ * `duration`: The duration of the animation in milliseconds.
+ * `delay`: The delay before the start of the animation in milliseconds.
+ * `easing`: A timing function for the animation. Matches the CSS timing function values.
+
+Animations may define additional configuration properties and they are listed in their documentation.
+
+<a name="configuration-multiple"></a>
+### Using multiple animations
+
+Set the animation configuration to an array to combine animations, like this:
+
+```js
+animationConfig: {
+ value: function() {
+ return {
+ // fade-in-animation is run with a 50ms delay from slide-down-animation
+ 'entry': [{
+ name: 'slide-down-animation',
+ node: this
+ }, {
+ name: 'fade-in-animation',
+ node: this,
+ timing: {delay: 50}
+ }]
+ }
+ }
+}
+```
+
+<a name="configuration-encapsulation"></a>
+### Running animations encapsulated in children nodes
+
+You can include animations in the configuration that are encapsulated in a child element that implement `Polymer.NeonAnimatableBehavior` with the `animatable` property.
+
+```js
+animationConfig: {
+ value: function() {
+ return {
+ // run fade-in-animation on this, and the entry animation on this.$.myAnimatable
+ 'entry': [
+ {name: 'fade-in-animation', node: this},
+ {animatable: this.$.myAnimatable, type: 'entry'}
+ ]
+ }
+ }
+}
+```
+
+<a name="page-transitions"></a>
+## Page transitions
+
+*The artist formerly known as `<core-animated-pages>`*
+
+The `neon-animated-pages` element manages a set of pages to switch between, and runs animations between the page transitions. It implements the `Polymer.IronSelectableBehavior` behavior. Each child node should implement `Polymer.NeonAnimatableBehavior` and define the `entry` and `exit` animations. During a page transition, the `entry` animation is run on the new page and the `exit` animation is run on the old page.
+
+<a name="shared-element"></a>
+### Shared element animations
+
+Shared element animations work on multiple nodes. For example, a "hero" animation is used during a page transition to make two elements from separate pages appear to animate as a single element. Shared element animation configurations have an `id` property that identify they belong in the same animation. Elements containing shared elements also have a `sharedElements` property defines a map from `id` to element, the element involved with the animation.
+
+In the incoming page:
+
+```js
+properties: {
+ animationConfig: {
+ value: function() {
+ return {
+ // the incoming page defines the 'entry' animation
+ 'entry': {
+ name: 'hero-animation',
+ id: 'hero',
+ toPage: this
+ }
+ }
+ }
+ },
+ sharedElements: {
+ value: function() {
+ return {
+ 'hero': this.$.hero
+ }
+ }
+ }
+}
+```
+
+In the outgoing page:
+
+```js
+properties: {
+ animationConfig: {
+ value: function() {
+ return {
+ // the outgoing page defines the 'exit' animation
+ 'exit': {
+ name: 'hero-animation',
+ id: 'hero',
+ fromPage: this
+ }
+ }
+ }
+ },
+ sharedElements: {
+ value: function() {
+ return {
+ 'hero': this.$.otherHero
+ }
+ }
+ }
+}
+```
+
+<a name="declarative-page"></a>
+### Declarative page transitions
+
+For convenience, if you define the `entry-animation` and `exit-animation` attributes on `<neon-animated-pages>`, those animations will apply for all page transitions.
+
+For example:
+
+```js
+<neon-animated-pages id="pages" class="flex" selected="[[selected]]" entry-animation="slide-from-right-animation" exit-animation="slide-left-animation">
+ <neon-animatable>1</neon-animatable>
+ <neon-animatable>2</neon-animatable>
+ <neon-animatable>3</neon-animatable>
+ <neon-animatable>4</neon-animatable>
+ <neon-animatable>5</neon-animatable>
+</neon-animated-pages>
+```
+
+The new page will slide in from the right, and the old page slide away to the left.
+
+<a name="animations"></a>
+## Included animations
+
+Single element animations:
+
+ * `fade-in-animation` Animates opacity from `0` to `1`;
+ * `fade-out-animation` Animates opacity from `1` to `0`;
+ * `scale-down-animation` Animates transform from `scale(1)` to `scale(0)`;
+ * `scale-up-animation` Animates transform from `scale(0)` to `scale(1)`;
+ * `slide-down-animation` Animates transform from `none` to `translateY(100%)`;
+ * `slide-up-animation` Animates transform from `none` to `translateY(-100%)`;
+ * `slide-from-top-animation` Animates transform from `translateY(-100%)` to `none`;
+ * `slide-from-bottom-animation` Animates transform from `translateY(100%)` to `none`;
+ * `slide-left-animation` Animates transform from `none` to `translateX(-100%)`;
+ * `slide-right-animation` Animates transform from `none` to `translateX(100%)`;
+ * `slide-from-left-animation` Animates transform from `translateX(-100%)` to `none`;
+ * `slide-from-right-animation` Animates transform from `translateX(100%)` to `none`;
+ * `transform-animation` Animates a custom transform.
+
+Note that there is a restriction that only one transform animation can be applied on the same element at a time. Use the custom `transform-animation` to combine transform properties.
+
+Shared element animations
+
+ * `hero-animation` Animates an element such that it looks like it scales and transforms from another element.
+ * `ripple-animation` Animates an element to full screen such that it looks like it ripples from another element.
+
+Group animations
+ * `cascaded-animation` Applys an animation to an array of elements with a delay between each.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/cascaded-animation.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/cascaded-animation.d.ts
new file mode 100644
index 00000000000..5bcd3a01f93
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/cascaded-animation.d.ts
@@ -0,0 +1,36 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * animations/cascaded-animation.html
+ */
+
+/// <reference path="../../polymer/types/polymer.d.ts" />
+/// <reference path="../neon-animation-behavior.d.ts" />
+
+/**
+ * `<cascaded-animation>` applies an animation on an array of elements with a delay between each.
+ * the delay defaults to 50ms.
+ *
+ * Configuration:
+ * ```
+ * {
+ * name: 'cascaded-animation',
+ * animation: <animation-name>,
+ * nodes: <array-of-nodes>,
+ * nodeDelay: <node-delay-in-ms>,
+ * timing: <animation-timing>
+ * }
+ * ```
+ */
+interface CascadedAnimationElement extends Polymer.Element, Polymer.NeonAnimationBehavior {
+ complete(): void;
+ configure(config: {animation: string, nodes: Element[], nodeDelay?: number, timing?: object|null}): any;
+}
+
+interface HTMLElementTagNameMap {
+ "cascaded-animation": CascadedAnimationElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/cascaded-animation.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/cascaded-animation.html
new file mode 100644
index 00000000000..39c8713a6a1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/cascaded-animation.html
@@ -0,0 +1,94 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../neon-animation-behavior.html">
+
+<!--
+`<cascaded-animation>` applies an animation on an array of elements with a delay between each.
+the delay defaults to 50ms.
+
+Configuration:
+```
+{
+ name: 'cascaded-animation',
+ animation: <animation-name>,
+ nodes: <array-of-nodes>,
+ nodeDelay: <node-delay-in-ms>,
+ timing: <animation-timing>
+}
+```
+-->
+
+<script>
+
+ Polymer({
+
+ is: 'cascaded-animation',
+
+ behaviors: [
+ Polymer.NeonAnimationBehavior
+ ],
+
+ /**
+ * @param {{
+ * animation: string,
+ * nodes: !Array<!Element>,
+ * nodeDelay: (number|undefined),
+ * timing: (Object|undefined)
+ * }} config
+ */
+ configure: function(config) {
+ this._animations = [];
+ var nodes = config.nodes;
+ var effects = [];
+ var nodeDelay = config.nodeDelay || 50;
+
+ config.timing = config.timing || {};
+ config.timing.delay = config.timing.delay || 0;
+
+ var oldDelay = config.timing.delay;
+ var abortedConfigure;
+ for (var node, index = 0; node = nodes[index]; index++) {
+ config.timing.delay += nodeDelay;
+ config.node = node;
+
+ var animation = document.createElement(config.animation);
+ if (animation.isNeonAnimation) {
+ var effect = animation.configure(config);
+
+ this._animations.push(animation);
+ effects.push(effect);
+ } else {
+ console.warn(this.is + ':', config.animation, 'not found!');
+ abortedConfigure = true;
+ break;
+ }
+ }
+ config.timing.delay = oldDelay;
+ config.node = null;
+ // if a bad animation was configured, abort config.
+ if (abortedConfigure) {
+ return;
+ }
+
+ this._effect = new GroupEffect(effects);
+ return this._effect;
+ },
+
+ complete: function() {
+ for (var animation, index = 0; animation = this._animations[index]; index++) {
+ animation.complete(animation.config);
+ }
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/fade-in-animation.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/fade-in-animation.d.ts
new file mode 100644
index 00000000000..b261d804df0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/fade-in-animation.d.ts
@@ -0,0 +1,32 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * animations/fade-in-animation.html
+ */
+
+/// <reference path="../../polymer/types/polymer.d.ts" />
+/// <reference path="../neon-animation-behavior.d.ts" />
+
+/**
+ * `<fade-in-animation>` animates the opacity of an element from 0 to 1.
+ *
+ * Configuration:
+ * ```
+ * {
+ * name: 'fade-in-animation',
+ * node: <node>
+ * timing: <animation-timing>
+ * }
+ * ```
+ */
+interface FadeInAnimationElement extends Polymer.Element, Polymer.NeonAnimationBehavior {
+ configure(config: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "fade-in-animation": FadeInAnimationElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/fade-in-animation.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/fade-in-animation.html
new file mode 100644
index 00000000000..c18849ec909
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/fade-in-animation.html
@@ -0,0 +1,48 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../neon-animation-behavior.html">
+
+<!--
+`<fade-in-animation>` animates the opacity of an element from 0 to 1.
+
+Configuration:
+```
+{
+ name: 'fade-in-animation',
+ node: <node>
+ timing: <animation-timing>
+}
+```
+-->
+
+<script>
+
+ Polymer({
+
+ is: 'fade-in-animation',
+
+ behaviors: [
+ Polymer.NeonAnimationBehavior
+ ],
+
+ configure: function(config) {
+ var node = config.node;
+ this._effect = new KeyframeEffect(node, [
+ {'opacity': '0'},
+ {'opacity': '1'}
+ ], this.timingFromConfig(config));
+ return this._effect;
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/fade-out-animation.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/fade-out-animation.d.ts
new file mode 100644
index 00000000000..1e2f371e968
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/fade-out-animation.d.ts
@@ -0,0 +1,32 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * animations/fade-out-animation.html
+ */
+
+/// <reference path="../../polymer/types/polymer.d.ts" />
+/// <reference path="../neon-animation-behavior.d.ts" />
+
+/**
+ * `<fade-out-animation>` animates the opacity of an element from 1 to 0.
+ *
+ * Configuration:
+ * ```
+ * {
+ * name: 'fade-out-animation',
+ * node: <node>
+ * timing: <animation-timing>
+ * }
+ * ```
+ */
+interface FadeOutAnimationElement extends Polymer.Element, Polymer.NeonAnimationBehavior {
+ configure(config: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "fade-out-animation": FadeOutAnimationElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/fade-out-animation.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/fade-out-animation.html
new file mode 100644
index 00000000000..abd20b181b9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/fade-out-animation.html
@@ -0,0 +1,48 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../neon-animation-behavior.html">
+
+<!--
+`<fade-out-animation>` animates the opacity of an element from 1 to 0.
+
+Configuration:
+```
+{
+ name: 'fade-out-animation',
+ node: <node>
+ timing: <animation-timing>
+}
+```
+-->
+
+<script>
+
+ Polymer({
+
+ is: 'fade-out-animation',
+
+ behaviors: [
+ Polymer.NeonAnimationBehavior
+ ],
+
+ configure: function(config) {
+ var node = config.node;
+ this._effect = new KeyframeEffect(node, [
+ {'opacity': '1'},
+ {'opacity': '0'}
+ ], this.timingFromConfig(config));
+ return this._effect;
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/hero-animation.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/hero-animation.d.ts
new file mode 100644
index 00000000000..fa29c92805b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/hero-animation.d.ts
@@ -0,0 +1,41 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * animations/hero-animation.html
+ */
+
+/// <reference path="../../polymer/types/polymer.d.ts" />
+/// <reference path="../neon-shared-element-animation-behavior.d.ts" />
+
+/**
+ * `<hero-animation>` is a shared element animation that scales and transform an element such that it
+ * appears to be shared between two pages. Use this in `<neon-animated-pages>`. The source page
+ * should use this animation in an 'exit' animation and set the `fromPage` configuration property to
+ * itself, and the destination page should use this animation in an `entry` animation and set the
+ * `toPage` configuration property to itself. They should also define the hero elements in the
+ * `sharedElements` property (not a configuration property, see
+ * `Polymer.NeonSharedElementAnimatableBehavior`).
+ *
+ * Configuration:
+ * ```
+ * {
+ * name: 'hero-animation',
+ * id: <shared-element-id>,
+ * timing: <animation-timing>,
+ * toPage: <node>, /* define for the destination page *\/
+ * fromPage: <node>, /* define for the source page *\/
+ * }
+ * ```
+ */
+interface HeroAnimationElement extends Polymer.Element, Polymer.NeonSharedElementAnimationBehavior {
+ complete(config: any): any;
+ configure(config: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "hero-animation": HeroAnimationElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/hero-animation.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/hero-animation.html
new file mode 100644
index 00000000000..71488832dd8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/hero-animation.html
@@ -0,0 +1,82 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../neon-shared-element-animation-behavior.html">
+
+<!--
+`<hero-animation>` is a shared element animation that scales and transform an element such that it
+appears to be shared between two pages. Use this in `<neon-animated-pages>`. The source page
+should use this animation in an 'exit' animation and set the `fromPage` configuration property to
+itself, and the destination page should use this animation in an `entry` animation and set the
+`toPage` configuration property to itself. They should also define the hero elements in the
+`sharedElements` property (not a configuration property, see
+`Polymer.NeonSharedElementAnimatableBehavior`).
+
+Configuration:
+```
+{
+ name: 'hero-animation',
+ id: <shared-element-id>,
+ timing: <animation-timing>,
+ toPage: <node>, /* define for the destination page */
+ fromPage: <node>, /* define for the source page */
+}
+```
+-->
+
+<script>
+
+ Polymer({
+
+ is: 'hero-animation',
+
+ behaviors: [
+ Polymer.NeonSharedElementAnimationBehavior
+ ],
+
+ configure: function(config) {
+ var shared = this.findSharedElements(config);
+ if (!shared) {
+ return;
+ }
+
+ var fromRect = shared.from.getBoundingClientRect();
+ var toRect = shared.to.getBoundingClientRect();
+
+ var deltaLeft = fromRect.left - toRect.left;
+ var deltaTop = fromRect.top - toRect.top;
+ var deltaWidth = fromRect.width / toRect.width;
+ var deltaHeight = fromRect.height / toRect.height;
+
+ this._effect = new KeyframeEffect(shared.to, [
+ {'transform': 'translate(' + deltaLeft + 'px,' + deltaTop + 'px) scale(' + deltaWidth + ',' + deltaHeight + ')'},
+ {'transform': 'none'}
+ ], this.timingFromConfig(config));
+
+ this.setPrefixedProperty(shared.to, 'transformOrigin', '0 0');
+ shared.to.style.zIndex = 10000;
+ shared.from.style.visibility = 'hidden';
+
+ return this._effect;
+ },
+
+ complete: function(config) {
+ var shared = this.findSharedElements(config);
+ if (!shared) {
+ return null;
+ }
+ shared.to.style.zIndex = '';
+ shared.from.style.visibility = '';
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/opaque-animation.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/opaque-animation.d.ts
new file mode 100644
index 00000000000..96c48ecee3c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/opaque-animation.d.ts
@@ -0,0 +1,25 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * animations/opaque-animation.html
+ */
+
+/// <reference path="../../polymer/types/polymer.d.ts" />
+/// <reference path="../neon-animation-behavior.d.ts" />
+
+/**
+ * `<opaque-animation>` makes an element `opacity:1` for the duration of the animation. Used to prevent
+ * webkit/safari from drawing a frame before an animation for elements that animate from display:none.
+ */
+interface OpaqueAnimationElement extends Polymer.Element, Polymer.NeonAnimationBehavior {
+ complete(config: any): void;
+ configure(config: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "opaque-animation": OpaqueAnimationElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/opaque-animation.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/opaque-animation.html
new file mode 100644
index 00000000000..bfe7d6461b8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/opaque-animation.html
@@ -0,0 +1,45 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../neon-animation-behavior.html">
+
+<!--
+`<opaque-animation>` makes an element `opacity:1` for the duration of the animation. Used to prevent
+webkit/safari from drawing a frame before an animation for elements that animate from display:none.
+-->
+
+<script>
+
+ Polymer({
+
+ is: 'opaque-animation',
+
+ behaviors: [
+ Polymer.NeonAnimationBehavior
+ ],
+
+ configure: function(config) {
+ var node = config.node;
+ this._effect = new KeyframeEffect(node, [
+ {'opacity': '1'},
+ {'opacity': '1'}
+ ], this.timingFromConfig(config));
+ node.style.opacity = '0';
+ return this._effect;
+ },
+
+ complete: function(config) {
+ config.node.style.opacity = '';
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/reverse-ripple-animation.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/reverse-ripple-animation.d.ts
new file mode 100644
index 00000000000..2e2c2e9910c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/reverse-ripple-animation.d.ts
@@ -0,0 +1,42 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * animations/reverse-ripple-animation.html
+ */
+
+/// <reference path="../../polymer/types/polymer.d.ts" />
+/// <reference path="../neon-shared-element-animation-behavior.d.ts" />
+
+/**
+ * `<reverse-ripple-animation>` scales and transform an element such that it appears to ripple down from this element, to either
+ * a shared element, or a screen position.
+ *
+ * If using as a shared element animation in `<neon-animated-pages>`, use this animation in an `exit`
+ * animation in the source page and in an `entry` animation in the destination page. Also, define the
+ * reverse-ripple elements in the `sharedElements` property (not a configuration property, see
+ * `Polymer.NeonSharedElementAnimatableBehavior`).
+ * If using a screen position, define the `gesture` property.
+ * Configuration:
+ * ```
+ * {
+ * name: 'reverse-ripple-animation`.
+ * id: <shared-element-id>, /* set this or gesture *\/
+ * gesture: {x: <page-x>, y: <page-y>}, /* set this or id *\/
+ * timing: <animation-timing>,
+ * toPage: <node>, /* define for the destination page *\/
+ * fromPage: <node>, /* define for the source page *\/
+ * }
+ * ```
+ */
+interface ReverseRippleAnimationElement extends Polymer.Element, Polymer.NeonSharedElementAnimationBehavior {
+ complete(): void;
+ configure(config: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "reverse-ripple-animation": ReverseRippleAnimationElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/reverse-ripple-animation.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/reverse-ripple-animation.html
new file mode 100644
index 00000000000..c20044a7616
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/reverse-ripple-animation.html
@@ -0,0 +1,86 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../neon-shared-element-animation-behavior.html">
+
+<!--
+`<reverse-ripple-animation>` scales and transform an element such that it appears to ripple down from this element, to either
+a shared element, or a screen position.
+
+If using as a shared element animation in `<neon-animated-pages>`, use this animation in an `exit`
+animation in the source page and in an `entry` animation in the destination page. Also, define the
+reverse-ripple elements in the `sharedElements` property (not a configuration property, see
+`Polymer.NeonSharedElementAnimatableBehavior`).
+If using a screen position, define the `gesture` property.
+Configuration:
+```
+{
+ name: 'reverse-ripple-animation`.
+ id: <shared-element-id>, /* set this or gesture */
+ gesture: {x: <page-x>, y: <page-y>}, /* set this or id */
+ timing: <animation-timing>,
+ toPage: <node>, /* define for the destination page */
+ fromPage: <node>, /* define for the source page */
+}
+```
+-->
+
+<script>
+ Polymer({
+ is: 'reverse-ripple-animation',
+
+ behaviors: [
+ Polymer.NeonSharedElementAnimationBehavior
+ ],
+
+ configure: function(config) {
+ var shared = this.findSharedElements(config);
+ if (!shared) {
+ return null;
+ }
+
+ var translateX, translateY;
+ var fromRect = shared.from.getBoundingClientRect();
+ if (config.gesture) {
+ translateX = config.gesture.x - (fromRect.left + (fromRect.width / 2));
+ translateY = config.gesture.y - (fromRect.top + (fromRect.height / 2));
+ } else {
+ var toRect = shared.to.getBoundingClientRect();
+ translateX = (toRect.left + (toRect.width / 2)) - (fromRect.left + (fromRect.width / 2));
+ translateY = (toRect.top + (toRect.height / 2)) - (fromRect.top + (fromRect.height / 2));
+ }
+ var translate = 'translate(' + translateX + 'px,' + translateY + 'px)';
+
+ var size = Math.max(fromRect.width + Math.abs(translateX) * 2, fromRect.height + Math.abs(translateY) * 2);
+ var diameter = Math.sqrt(2 * size * size);
+ var scaleX = diameter / fromRect.width;
+ var scaleY = diameter / fromRect.height;
+ var scale = 'scale(' + scaleX + ',' + scaleY + ')';
+
+ this._effect = new KeyframeEffect(shared.from, [
+ {'transform': translate + ' ' + scale},
+ {'transform': translate + ' scale(0)'}
+ ], this.timingFromConfig(config));
+
+ this.setPrefixedProperty(shared.from, 'transformOrigin', '50% 50%');
+ shared.from.style.borderRadius = '50%';
+
+ return this._effect;
+ },
+
+ complete: function() {
+ if (this.sharedElements) {
+ this.setPrefixedProperty(this.sharedElements.from, 'transformOrigin', '');
+ this.sharedElements.from.style.borderRadius = '';
+ }
+ }
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/ripple-animation.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/ripple-animation.d.ts
new file mode 100644
index 00000000000..6b8cf5986b1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/ripple-animation.d.ts
@@ -0,0 +1,44 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * animations/ripple-animation.html
+ */
+
+/// <reference path="../../polymer/types/polymer.d.ts" />
+/// <reference path="../neon-shared-element-animation-behavior.d.ts" />
+
+/**
+ * `<ripple-animation>` scales and transform an element such that it appears to ripple from either
+ * a shared element, or from a screen position, to full screen.
+ *
+ * If using as a shared element animation in `<neon-animated-pages>`, use this animation in an `exit`
+ * animation in the source page and in an `entry` animation in the destination page. Also, define the
+ * hero elements in the `sharedElements` property (not a configuration property, see
+ * `Polymer.NeonSharedElementAnimatableBehavior`).
+ *
+ * If using a screen position, define the `gesture` property.
+ *
+ * Configuration:
+ * ```
+ * {
+ * name: 'ripple-animation`.
+ * id: <shared-element-id>, /* set this or gesture *\/
+ * gesture: {x: <page-x>, y: <page-y>}, /* set this or id *\/
+ * timing: <animation-timing>,
+ * toPage: <node>, /* define for the destination page *\/
+ * fromPage: <node>, /* define for the source page *\/
+ * }
+ * ```
+ */
+interface RippleAnimationElement extends Polymer.Element, Polymer.NeonSharedElementAnimationBehavior {
+ complete(): void;
+ configure(config: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "ripple-animation": RippleAnimationElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/ripple-animation.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/ripple-animation.html
new file mode 100644
index 00000000000..dd8d2a8e45a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/ripple-animation.html
@@ -0,0 +1,92 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../neon-shared-element-animation-behavior.html">
+
+<!--
+`<ripple-animation>` scales and transform an element such that it appears to ripple from either
+a shared element, or from a screen position, to full screen.
+
+If using as a shared element animation in `<neon-animated-pages>`, use this animation in an `exit`
+animation in the source page and in an `entry` animation in the destination page. Also, define the
+hero elements in the `sharedElements` property (not a configuration property, see
+`Polymer.NeonSharedElementAnimatableBehavior`).
+
+If using a screen position, define the `gesture` property.
+
+Configuration:
+```
+{
+ name: 'ripple-animation`.
+ id: <shared-element-id>, /* set this or gesture */
+ gesture: {x: <page-x>, y: <page-y>}, /* set this or id */
+ timing: <animation-timing>,
+ toPage: <node>, /* define for the destination page */
+ fromPage: <node>, /* define for the source page */
+}
+```
+-->
+
+<script>
+
+ Polymer({
+
+ is: 'ripple-animation',
+
+ behaviors: [
+ Polymer.NeonSharedElementAnimationBehavior
+ ],
+
+ configure: function(config) {
+ var shared = this.findSharedElements(config);
+ if (!shared) {
+ return null;
+ }
+
+ var translateX, translateY;
+ var toRect = shared.to.getBoundingClientRect();
+ if (config.gesture) {
+ translateX = config.gesture.x - (toRect.left + (toRect.width / 2));
+ translateY = config.gesture.y - (toRect.top + (toRect.height / 2));
+ } else {
+ var fromRect = shared.from.getBoundingClientRect();
+ translateX = (fromRect.left + (fromRect.width / 2)) - (toRect.left + (toRect.width / 2));
+ translateY = (fromRect.top + (fromRect.height / 2)) - (toRect.top + (toRect.height / 2));
+ }
+ var translate = 'translate(' + translateX + 'px,' + translateY + 'px)';
+
+ var size = Math.max(toRect.width + Math.abs(translateX) * 2, toRect.height + Math.abs(translateY) * 2);
+ var diameter = Math.sqrt(2 * size * size);
+ var scaleX = diameter / toRect.width;
+ var scaleY = diameter / toRect.height;
+ var scale = 'scale(' + scaleX + ',' + scaleY + ')';
+
+ this._effect = new KeyframeEffect(shared.to, [
+ {'transform': translate + ' scale(0)'},
+ {'transform': translate + ' ' + scale}
+ ], this.timingFromConfig(config));
+
+ this.setPrefixedProperty(shared.to, 'transformOrigin', '50% 50%');
+ shared.to.style.borderRadius = '50%';
+
+ return this._effect;
+ },
+
+ complete: function() {
+ if (this.sharedElements) {
+ this.setPrefixedProperty(this.sharedElements.to, 'transformOrigin', '');
+ this.sharedElements.to.style.borderRadius = '';
+ }
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/scale-down-animation.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/scale-down-animation.d.ts
new file mode 100644
index 00000000000..fd68fff3734
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/scale-down-animation.d.ts
@@ -0,0 +1,35 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * animations/scale-down-animation.html
+ */
+
+/// <reference path="../../polymer/types/polymer.d.ts" />
+/// <reference path="../neon-animation-behavior.d.ts" />
+
+/**
+ * `<scale-down-animation>` animates the scale transform of an element from 1 to 0. By default it
+ * scales in both the x and y axes.
+ *
+ * Configuration:
+ * ```
+ * {
+ * name: 'scale-down-animation',
+ * node: <node>,
+ * axis: 'x' | 'y' | '',
+ * transformOrigin: <transform-origin>,
+ * timing: <animation-timing>
+ * }
+ * ```
+ */
+interface ScaleDownAnimationElement extends Polymer.Element, Polymer.NeonAnimationBehavior {
+ configure(config: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "scale-down-animation": ScaleDownAnimationElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/scale-down-animation.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/scale-down-animation.html
new file mode 100644
index 00000000000..91e40840939
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/scale-down-animation.html
@@ -0,0 +1,64 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../neon-animation-behavior.html">
+
+<!--
+`<scale-down-animation>` animates the scale transform of an element from 1 to 0. By default it
+scales in both the x and y axes.
+
+Configuration:
+```
+{
+ name: 'scale-down-animation',
+ node: <node>,
+ axis: 'x' | 'y' | '',
+ transformOrigin: <transform-origin>,
+ timing: <animation-timing>
+}
+```
+-->
+
+<script>
+
+ Polymer({
+
+ is: 'scale-down-animation',
+
+ behaviors: [
+ Polymer.NeonAnimationBehavior
+ ],
+
+ configure: function(config) {
+ var node = config.node;
+
+ var scaleProperty = 'scale(0, 0)';
+ if (config.axis === 'x') {
+ scaleProperty = 'scale(0, 1)';
+ } else if (config.axis === 'y') {
+ scaleProperty = 'scale(1, 0)';
+ }
+
+ this._effect = new KeyframeEffect(node, [
+ {'transform': 'scale(1,1)'},
+ {'transform': scaleProperty}
+ ], this.timingFromConfig(config));
+
+ if (config.transformOrigin) {
+ this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
+ }
+
+ return this._effect;
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/scale-up-animation.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/scale-up-animation.d.ts
new file mode 100644
index 00000000000..23cec443eb9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/scale-up-animation.d.ts
@@ -0,0 +1,35 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * animations/scale-up-animation.html
+ */
+
+/// <reference path="../../polymer/types/polymer.d.ts" />
+/// <reference path="../neon-animation-behavior.d.ts" />
+
+/**
+ * `<scale-up-animation>` animates the scale transform of an element from 0 to 1. By default it
+ * scales in both the x and y axes.
+ *
+ * Configuration:
+ * ```
+ * {
+ * name: 'scale-up-animation',
+ * node: <node>,
+ * axis: 'x' | 'y' | '',
+ * transformOrigin: <transform-origin>,
+ * timing: <animation-timing>
+ * }
+ * ```
+ */
+interface ScaleUpAnimationElement extends Polymer.Element, Polymer.NeonAnimationBehavior {
+ configure(config: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "scale-up-animation": ScaleUpAnimationElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/scale-up-animation.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/scale-up-animation.html
new file mode 100644
index 00000000000..a6c92202bb7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/scale-up-animation.html
@@ -0,0 +1,64 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../neon-animation-behavior.html">
+
+<!--
+`<scale-up-animation>` animates the scale transform of an element from 0 to 1. By default it
+scales in both the x and y axes.
+
+Configuration:
+```
+{
+ name: 'scale-up-animation',
+ node: <node>,
+ axis: 'x' | 'y' | '',
+ transformOrigin: <transform-origin>,
+ timing: <animation-timing>
+}
+```
+-->
+
+<script>
+
+ Polymer({
+
+ is: 'scale-up-animation',
+
+ behaviors: [
+ Polymer.NeonAnimationBehavior
+ ],
+
+ configure: function(config) {
+ var node = config.node;
+
+ var scaleProperty = 'scale(0)';
+ if (config.axis === 'x') {
+ scaleProperty = 'scale(0, 1)';
+ } else if (config.axis === 'y') {
+ scaleProperty = 'scale(1, 0)';
+ }
+
+ this._effect = new KeyframeEffect(node, [
+ {'transform': scaleProperty},
+ {'transform': 'scale(1, 1)'}
+ ], this.timingFromConfig(config));
+
+ if (config.transformOrigin) {
+ this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
+ }
+
+ return this._effect;
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-down-animation.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-down-animation.d.ts
new file mode 100644
index 00000000000..e03b9877558
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-down-animation.d.ts
@@ -0,0 +1,34 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * animations/slide-down-animation.html
+ */
+
+/// <reference path="../../polymer/types/polymer.d.ts" />
+/// <reference path="../neon-animation-behavior.d.ts" />
+
+/**
+ * `<slide-down-animation>` animates the transform of an element from `none` `translateY(100%)`.
+ * The `transformOrigin` defaults to `50% 0`.
+ *
+ * Configuration:
+ * ```
+ * {
+ * name: 'slide-down-animation',
+ * node: <node>,
+ * transformOrigin: <transform-origin>,
+ * timing: <animation-timing>
+ * }
+ * ```
+ */
+interface SlideDownAnimationElement extends Polymer.Element, Polymer.NeonAnimationBehavior {
+ configure(config: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "slide-down-animation": SlideDownAnimationElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-down-animation.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-down-animation.html
new file mode 100644
index 00000000000..cf56ae5937d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-down-animation.html
@@ -0,0 +1,58 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../neon-animation-behavior.html">
+
+<!--
+`<slide-down-animation>` animates the transform of an element from `none` `translateY(100%)`.
+The `transformOrigin` defaults to `50% 0`.
+
+Configuration:
+```
+{
+ name: 'slide-down-animation',
+ node: <node>,
+ transformOrigin: <transform-origin>,
+ timing: <animation-timing>
+}
+```
+-->
+
+<script>
+
+ Polymer({
+
+ is: 'slide-down-animation',
+
+ behaviors: [
+ Polymer.NeonAnimationBehavior
+ ],
+
+ configure: function(config) {
+ var node = config.node;
+
+ this._effect = new KeyframeEffect(node, [
+ {'transform': 'translateY(0%)'},
+ {'transform': 'translateY(100%)'}
+ ], this.timingFromConfig(config));
+
+ if (config.transformOrigin) {
+ this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
+ } else {
+ this.setPrefixedProperty(node, 'transformOrigin', '50% 0');
+ }
+
+ return this._effect;
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-bottom-animation.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-bottom-animation.d.ts
new file mode 100644
index 00000000000..c1fe22039a5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-bottom-animation.d.ts
@@ -0,0 +1,34 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * animations/slide-from-bottom-animation.html
+ */
+
+/// <reference path="../../polymer/types/polymer.d.ts" />
+/// <reference path="../neon-animation-behavior.d.ts" />
+
+/**
+ * `<slide-from-bottom-animation>` animates the transform of an element from `none` to `translateY(100%)`.
+ * The `transformOrigin` defaults to `50% 0`.
+ *
+ * Configuration:
+ * ```
+ * {
+ * name: 'slide-from-bottom-animation',
+ * node: <node>,
+ * transformOrigin: <transform-origin>,
+ * timing: <animation-timing>
+ * }
+ * ```
+ */
+interface SlideFromBottomAnimationElement extends Polymer.Element, Polymer.NeonAnimationBehavior {
+ configure(config: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "slide-from-bottom-animation": SlideFromBottomAnimationElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-bottom-animation.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-bottom-animation.html
new file mode 100644
index 00000000000..8e7ba7635b5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-bottom-animation.html
@@ -0,0 +1,58 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../neon-animation-behavior.html">
+
+<!--
+`<slide-from-bottom-animation>` animates the transform of an element from `none` to `translateY(100%)`.
+The `transformOrigin` defaults to `50% 0`.
+
+Configuration:
+```
+{
+ name: 'slide-from-bottom-animation',
+ node: <node>,
+ transformOrigin: <transform-origin>,
+ timing: <animation-timing>
+}
+```
+-->
+
+<script>
+
+ Polymer({
+
+ is: 'slide-from-bottom-animation',
+
+ behaviors: [
+ Polymer.NeonAnimationBehavior
+ ],
+
+ configure: function(config) {
+ var node = config.node;
+
+ this._effect = new KeyframeEffect(node, [
+ {'transform': 'translateY(100%)'},
+ {'transform': 'translateY(0)'}
+ ], this.timingFromConfig(config));
+
+ if (config.transformOrigin) {
+ this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
+ } else {
+ this.setPrefixedProperty(node, 'transformOrigin', '50% 0');
+ }
+
+ return this._effect;
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-left-animation.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-left-animation.d.ts
new file mode 100644
index 00000000000..b3f0b2e2b70
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-left-animation.d.ts
@@ -0,0 +1,35 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * animations/slide-from-left-animation.html
+ */
+
+/// <reference path="../../polymer/types/polymer.d.ts" />
+/// <reference path="../neon-animation-behavior.d.ts" />
+
+/**
+ * `<slide-from-left-animation>` animates the transform of an element from
+ * `translateX(-100%)` to `none`.
+ * The `transformOrigin` defaults to `0 50%`.
+ *
+ * Configuration:
+ * ```
+ * {
+ * name: 'slide-from-left-animation',
+ * node: <node>,
+ * transformOrigin: <transform-origin>,
+ * timing: <animation-timing>
+ * }
+ * ```
+ */
+interface SlideFromLeftAnimationElement extends Polymer.Element, Polymer.NeonAnimationBehavior {
+ configure(config: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "slide-from-left-animation": SlideFromLeftAnimationElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-left-animation.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-left-animation.html
new file mode 100644
index 00000000000..14d63bddede
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-left-animation.html
@@ -0,0 +1,59 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../neon-animation-behavior.html">
+
+<!--
+`<slide-from-left-animation>` animates the transform of an element from
+`translateX(-100%)` to `none`.
+The `transformOrigin` defaults to `0 50%`.
+
+Configuration:
+```
+{
+ name: 'slide-from-left-animation',
+ node: <node>,
+ transformOrigin: <transform-origin>,
+ timing: <animation-timing>
+}
+```
+-->
+
+<script>
+
+ Polymer({
+
+ is: 'slide-from-left-animation',
+
+ behaviors: [
+ Polymer.NeonAnimationBehavior
+ ],
+
+ configure: function(config) {
+ var node = config.node;
+
+ this._effect = new KeyframeEffect(node, [
+ {'transform': 'translateX(-100%)'},
+ {'transform': 'none'}
+ ], this.timingFromConfig(config));
+
+ if (config.transformOrigin) {
+ this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
+ } else {
+ this.setPrefixedProperty(node, 'transformOrigin', '0 50%');
+ }
+
+ return this._effect;
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-right-animation.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-right-animation.d.ts
new file mode 100644
index 00000000000..2dea2e6a3f8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-right-animation.d.ts
@@ -0,0 +1,35 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * animations/slide-from-right-animation.html
+ */
+
+/// <reference path="../../polymer/types/polymer.d.ts" />
+/// <reference path="../neon-animation-behavior.d.ts" />
+
+/**
+ * `<slide-from-right-animation>` animates the transform of an element from
+ * `translateX(100%)` to `none`.
+ * The `transformOrigin` defaults to `0 50%`.
+ *
+ * Configuration:
+ * ```
+ * {
+ * name: 'slide-from-right-animation',
+ * node: <node>,
+ * transformOrigin: <transform-origin>,
+ * timing: <animation-timing>
+ * }
+ * ```
+ */
+interface SlideFromRightAnimationElement extends Polymer.Element, Polymer.NeonAnimationBehavior {
+ configure(config: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "slide-from-right-animation": SlideFromRightAnimationElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-right-animation.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-right-animation.html
new file mode 100644
index 00000000000..f6190bac9a4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-right-animation.html
@@ -0,0 +1,59 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../neon-animation-behavior.html">
+
+<!--
+`<slide-from-right-animation>` animates the transform of an element from
+`translateX(100%)` to `none`.
+The `transformOrigin` defaults to `0 50%`.
+
+Configuration:
+```
+{
+ name: 'slide-from-right-animation',
+ node: <node>,
+ transformOrigin: <transform-origin>,
+ timing: <animation-timing>
+}
+```
+-->
+
+<script>
+
+ Polymer({
+
+ is: 'slide-from-right-animation',
+
+ behaviors: [
+ Polymer.NeonAnimationBehavior
+ ],
+
+ configure: function(config) {
+ var node = config.node;
+
+ this._effect = new KeyframeEffect(node, [
+ {'transform': 'translateX(100%)'},
+ {'transform': 'none'}
+ ], this.timingFromConfig(config));
+
+ if (config.transformOrigin) {
+ this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
+ } else {
+ this.setPrefixedProperty(node, 'transformOrigin', '0 50%');
+ }
+
+ return this._effect;
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-top-animation.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-top-animation.d.ts
new file mode 100644
index 00000000000..7e5d47142e5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-top-animation.d.ts
@@ -0,0 +1,34 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * animations/slide-from-top-animation.html
+ */
+
+/// <reference path="../../polymer/types/polymer.d.ts" />
+/// <reference path="../neon-animation-behavior.d.ts" />
+
+/**
+ * `<slide-from-top-animation>` animates the transform of an element from `translateY(-100%)` to
+ * `none`. The `transformOrigin` defaults to `50% 0`.
+ *
+ * Configuration:
+ * ```
+ * {
+ * name: 'slide-from-top-animation',
+ * node: <node>,
+ * transformOrigin: <transform-origin>,
+ * timing: <animation-timing>
+ * }
+ * ```
+ */
+interface SlideFromTopAnimationElement extends Polymer.Element, Polymer.NeonAnimationBehavior {
+ configure(config: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "slide-from-top-animation": SlideFromTopAnimationElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-top-animation.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-top-animation.html
new file mode 100644
index 00000000000..cf69eaaebe5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-from-top-animation.html
@@ -0,0 +1,58 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../neon-animation-behavior.html">
+
+<!--
+`<slide-from-top-animation>` animates the transform of an element from `translateY(-100%)` to
+`none`. The `transformOrigin` defaults to `50% 0`.
+
+Configuration:
+```
+{
+ name: 'slide-from-top-animation',
+ node: <node>,
+ transformOrigin: <transform-origin>,
+ timing: <animation-timing>
+}
+```
+-->
+
+<script>
+
+ Polymer({
+
+ is: 'slide-from-top-animation',
+
+ behaviors: [
+ Polymer.NeonAnimationBehavior
+ ],
+
+ configure: function(config) {
+ var node = config.node;
+
+ this._effect = new KeyframeEffect(node, [
+ {'transform': 'translateY(-100%)'},
+ {'transform': 'translateY(0%)'}
+ ], this.timingFromConfig(config));
+
+ if (config.transformOrigin) {
+ this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
+ } else {
+ this.setPrefixedProperty(node, 'transformOrigin', '50% 0');
+ }
+
+ return this._effect;
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-left-animation.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-left-animation.d.ts
new file mode 100644
index 00000000000..d34e84798b4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-left-animation.d.ts
@@ -0,0 +1,34 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * animations/slide-left-animation.html
+ */
+
+/// <reference path="../../polymer/types/polymer.d.ts" />
+/// <reference path="../neon-animation-behavior.d.ts" />
+
+/**
+ * `<slide-left-animation>` animates the transform of an element from `none` to `translateX(-100%)`.
+ * The `transformOrigin` defaults to `0 50%`.
+ *
+ * Configuration:
+ * ```
+ * {
+ * name: 'slide-left-animation',
+ * node: <node>,
+ * transformOrigin: <transform-origin>,
+ * timing: <animation-timing>
+ * }
+ * ```
+ */
+interface SlideLeftAnimationElement extends Polymer.Element, Polymer.NeonAnimationBehavior {
+ configure(config: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "slide-left-animation": SlideLeftAnimationElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-left-animation.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-left-animation.html
new file mode 100644
index 00000000000..040cfee0744
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-left-animation.html
@@ -0,0 +1,58 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../neon-animation-behavior.html">
+
+<!--
+`<slide-left-animation>` animates the transform of an element from `none` to `translateX(-100%)`.
+The `transformOrigin` defaults to `0 50%`.
+
+Configuration:
+```
+{
+ name: 'slide-left-animation',
+ node: <node>,
+ transformOrigin: <transform-origin>,
+ timing: <animation-timing>
+}
+```
+-->
+
+<script>
+
+ Polymer({
+
+ is: 'slide-left-animation',
+
+ behaviors: [
+ Polymer.NeonAnimationBehavior
+ ],
+
+ configure: function(config) {
+ var node = config.node;
+
+ this._effect = new KeyframeEffect(node, [
+ {'transform': 'none'},
+ {'transform': 'translateX(-100%)'}
+ ], this.timingFromConfig(config));
+
+ if (config.transformOrigin) {
+ this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
+ } else {
+ this.setPrefixedProperty(node, 'transformOrigin', '0 50%');
+ }
+
+ return this._effect;
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-right-animation.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-right-animation.d.ts
new file mode 100644
index 00000000000..769d4c170fa
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-right-animation.d.ts
@@ -0,0 +1,34 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * animations/slide-right-animation.html
+ */
+
+/// <reference path="../../polymer/types/polymer.d.ts" />
+/// <reference path="../neon-animation-behavior.d.ts" />
+
+/**
+ * `<slide-right-animation>` animates the transform of an element from `none` to `translateX(100%)`.
+ * The `transformOrigin` defaults to `0 50%`.
+ *
+ * Configuration:
+ * ```
+ * {
+ * name: 'slide-right-animation',
+ * node: <node>,
+ * transformOrigin: <transform-origin>,
+ * timing: <animation-timing>
+ * }
+ * ```
+ */
+interface SlideRightAnimationElement extends Polymer.Element, Polymer.NeonAnimationBehavior {
+ configure(config: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "slide-right-animation": SlideRightAnimationElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-right-animation.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-right-animation.html
new file mode 100644
index 00000000000..7a9342b11b4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-right-animation.html
@@ -0,0 +1,58 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../neon-animation-behavior.html">
+
+<!--
+`<slide-right-animation>` animates the transform of an element from `none` to `translateX(100%)`.
+The `transformOrigin` defaults to `0 50%`.
+
+Configuration:
+```
+{
+ name: 'slide-right-animation',
+ node: <node>,
+ transformOrigin: <transform-origin>,
+ timing: <animation-timing>
+}
+```
+-->
+
+<script>
+
+ Polymer({
+
+ is: 'slide-right-animation',
+
+ behaviors: [
+ Polymer.NeonAnimationBehavior
+ ],
+
+ configure: function(config) {
+ var node = config.node;
+
+ this._effect = new KeyframeEffect(node, [
+ {'transform': 'none'},
+ {'transform': 'translateX(100%)'}
+ ], this.timingFromConfig(config));
+
+ if (config.transformOrigin) {
+ this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
+ } else {
+ this.setPrefixedProperty(node, 'transformOrigin', '0 50%');
+ }
+
+ return this._effect;
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-up-animation.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-up-animation.d.ts
new file mode 100644
index 00000000000..4231f8a950f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-up-animation.d.ts
@@ -0,0 +1,34 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * animations/slide-up-animation.html
+ */
+
+/// <reference path="../../polymer/types/polymer.d.ts" />
+/// <reference path="../neon-animation-behavior.d.ts" />
+
+/**
+ * `<slide-up-animation>` animates the transform of an element from `translateY(0)` to
+ * `translateY(-100%)`. The `transformOrigin` defaults to `50% 0`.
+ *
+ * Configuration:
+ * ```
+ * {
+ * name: 'slide-up-animation',
+ * node: <node>,
+ * transformOrigin: <transform-origin>,
+ * timing: <animation-timing>
+ * }
+ * ```
+ */
+interface SlideUpAnimationElement extends Polymer.Element, Polymer.NeonAnimationBehavior {
+ configure(config: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "slide-up-animation": SlideUpAnimationElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-up-animation.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-up-animation.html
new file mode 100644
index 00000000000..eac7a377c4f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/slide-up-animation.html
@@ -0,0 +1,58 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../neon-animation-behavior.html">
+
+<!--
+`<slide-up-animation>` animates the transform of an element from `translateY(0)` to
+`translateY(-100%)`. The `transformOrigin` defaults to `50% 0`.
+
+Configuration:
+```
+{
+ name: 'slide-up-animation',
+ node: <node>,
+ transformOrigin: <transform-origin>,
+ timing: <animation-timing>
+}
+```
+-->
+
+<script>
+
+ Polymer({
+
+ is: 'slide-up-animation',
+
+ behaviors: [
+ Polymer.NeonAnimationBehavior
+ ],
+
+ configure: function(config) {
+ var node = config.node;
+
+ this._effect = new KeyframeEffect(node, [
+ {'transform': 'translate(0)'},
+ {'transform': 'translateY(-100%)'}
+ ], this.timingFromConfig(config));
+
+ if (config.transformOrigin) {
+ this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
+ } else {
+ this.setPrefixedProperty(node, 'transformOrigin', '50% 0');
+ }
+
+ return this._effect;
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/transform-animation.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/transform-animation.d.ts
new file mode 100644
index 00000000000..03ec4bd501e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/transform-animation.d.ts
@@ -0,0 +1,36 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * animations/transform-animation.html
+ */
+
+/// <reference path="../../polymer/types/polymer.d.ts" />
+/// <reference path="../neon-animation-behavior.d.ts" />
+
+/**
+ * `<transform-animation>` animates a custom transform on an element. Use this to animate multiple
+ * transform properties, or to apply a custom transform value.
+ *
+ * Configuration:
+ * ```
+ * {
+ * name: 'transform-animation',
+ * node: <node>,
+ * transformOrigin: <transform-origin>,
+ * transformFrom: <transform-from-string>,
+ * transformTo: <transform-to-string>,
+ * timing: <animation-timing>
+ * }
+ * ```
+ */
+interface TransformAnimationElement extends Polymer.Element, Polymer.NeonAnimationBehavior {
+ configure(config: {node: Element, transformOrigin?: string, transformFrom?: string, transformTo?: string, timing?: object|null}): any;
+}
+
+interface HTMLElementTagNameMap {
+ "transform-animation": TransformAnimationElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/transform-animation.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/transform-animation.html
new file mode 100644
index 00000000000..84927271ad7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/animations/transform-animation.html
@@ -0,0 +1,69 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../neon-animation-behavior.html">
+
+<!--
+`<transform-animation>` animates a custom transform on an element. Use this to animate multiple
+transform properties, or to apply a custom transform value.
+
+Configuration:
+```
+{
+ name: 'transform-animation',
+ node: <node>,
+ transformOrigin: <transform-origin>,
+ transformFrom: <transform-from-string>,
+ transformTo: <transform-to-string>,
+ timing: <animation-timing>
+}
+```
+-->
+
+<script>
+
+ Polymer({
+
+ is: 'transform-animation',
+
+ behaviors: [
+ Polymer.NeonAnimationBehavior
+ ],
+
+ /**
+ * @param {{
+ * node: !Element,
+ * transformOrigin: (string|undefined),
+ * transformFrom: (string|undefined),
+ * transformTo: (string|undefined),
+ * timing: (Object|undefined)
+ * }} config
+ */
+ configure: function(config) {
+ var node = config.node;
+ var transformFrom = config.transformFrom || 'none';
+ var transformTo = config.transformTo || 'none';
+
+ this._effect = new KeyframeEffect(node, [
+ {'transform': transformFrom},
+ {'transform': transformTo}
+ ], this.timingFromConfig(config));
+
+ if (config.transformOrigin) {
+ this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
+ }
+
+ return this._effect;
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/bower.json
new file mode 100644
index 00000000000..2dd5c0f5e39
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/bower.json
@@ -0,0 +1,80 @@
+{
+ "name": "neon-animation",
+ "description": "A system for animating Polymer-based web components",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "web-component",
+ "polymer",
+ "web-animations"
+ ],
+ "main": [
+ "neon-animated-pages.html",
+ "neon-animatable-behavior.html",
+ "neon-animation-behavior.html",
+ "neon-animation-runner-behavior.html",
+ "neon-shared-element-animatable-behavior.html",
+ "neon-shared-element-animation-behavior.html",
+ "neon-animatable.html",
+ "neon-animations.html"
+ ],
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/neon-animation"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/neon-animation",
+ "ignore": [],
+ "demos": {
+ "Demo": "demo/index.html"
+ },
+ "dependencies": {
+ "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#1 - 2",
+ "iron-selector": "PolymerElements/iron-selector#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "app-layout": "PolymerElements/app-layout#1 - 2",
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-icon": "PolymerElements/iron-icon#1 - 2",
+ "iron-icons": "PolymerElements/iron-icons#1 - 2",
+ "paper-icon-button": "PolymerElements/paper-icon-button#1 - 2",
+ "paper-item": "PolymerElements/paper-item#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "web-animations-js": "web-animations/web-animations-js#^2.2.0",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0",
+ "iron-selector": "PolymerElements/iron-selector#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9",
+ "web-animations-js": "web-animations/web-animations-js#^2.2.0"
+ },
+ "devDependencies": {
+ "app-layout": "PolymerElements/app-layout#^0.10.0",
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "iron-icon": "PolymerElements/iron-icon#^1.0.0",
+ "iron-icons": "PolymerElements/iron-icons#^1.0.0",
+ "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0",
+ "paper-item": "PolymerElements/paper-item#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/card/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/card/index.html
new file mode 100644
index 00000000000..ec246dbc77a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/card/index.html
@@ -0,0 +1,174 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+ <head>
+ <title>neon-animated-pages demo: card</title>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../web-animations.html">
+ <link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
+ <link rel="import" href="../../neon-animated-pages.html">
+ <link rel="import" href="../../neon-animations.html">
+ <link rel="import" href="../../../paper-styles/typography.html">
+ <link rel="import" href="x-card.html">
+ <link rel="import" href="x-cards-list.html">
+
+ <custom-style>
+ <style is="custom-style">
+
+ body {
+ padding: 15px;
+ @apply --layout-fullbleed;
+ @apply --paper-font-common-base;
+ }
+
+ neon-animated-pages {
+ height: 100%;
+ }
+
+ .large {
+ width: 100%
+ }
+
+ .button {
+ text-align: center;
+ width: 120px;
+ height: 32px;
+ line-height: 32px;
+ border-radius: 2px;
+ font-size: 0.9em;
+ background-color: #fff;
+ color: #646464;
+ }
+
+ .button.blue {
+ background-color: #4285f4;
+ color: #fff;
+ }
+
+ .button.raised {
+ box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);
+ }
+
+ .button.back {
+ position: fixed;
+ top: 30px;
+ left: 30px;
+ }
+
+ .card-contents {
+ @apply --layout-vertical;
+ @apply --layout-center-center;
+ @apply --layout-fit;
+ }
+
+ .button-container {
+ @apply --layout-flex;
+ @apply --layout-horizontal;
+ @apply --layout-around-justified;
+ }
+ </style>
+ </custom-style>
+
+ </head>
+ <body>
+ <dom-bind>
+ <template is="dom-bind">
+ <neon-animated-pages id="pages" selected="0">
+ <x-cards-list id="list">
+ <div slot="div" class="card-contents">
+ <h2>Choose a subject</h2>
+ <div class="button-container large">
+ <div class="blue raised button" on-click="_onPolymerClick">
+ POLYMER
+ </div>
+ <div class="blue raised button" on-click="_onAngularClick">
+ ANGULAR
+ </div>
+ </div>
+ </div>
+ </x-cards-list>
+
+ <x-card>
+ <div slot="div" class="card-contents">
+ <div class="raised back button" on-click="_onBackClick">
+ BACK
+ </div>
+ <h2>Polymer</h2>
+ <p>
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
+ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
+ proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </p>
+ </div>
+ </x-card>
+
+ <x-card>
+ <div slot="div" class="card-contents">
+ <div class="raised back button" on-click="_onBackClick">
+ BACK
+ </div>
+ <h2>Angular</h2>
+ <p>
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
+ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
+ proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </p>
+ </div>
+ </x-card>
+
+ </neon-animated-pages>
+ </template>
+ </dom-bind>
+
+ <script>
+ var polymer2DomBind = document.querySelector('dom-bind');
+ var polymer1DomBindScope = document.querySelector('template[is="dom-bind"]');
+
+ polymer2DomBind._onPolymerClick = function(event) {
+ this.$.list.sharedElements = {
+ 'ripple': event.target,
+ 'reverse-ripple': event.target
+ };
+ this.$.pages.selected = 1;
+ };
+
+ polymer2DomBind._onAngularClick = function(event) {
+ this.$.list.sharedElements = {
+ 'ripple': event.target,
+ 'reverse-ripple': event.target
+ };
+ this.$.pages.selected = 2;
+ };
+
+ polymer2DomBind._onBackClick = function(event) {
+ this.$.pages.selected = 0;
+ };
+
+ polymer1DomBindScope._onPolymerClick = polymer2DomBind._onPolymerClick;
+ polymer1DomBindScope._onAngularClick = polymer2DomBind._onAngularClick;
+ polymer1DomBindScope._onBackClick = polymer2DomBind._onBackClick;
+
+ </script>
+
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/card/x-card.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/card/x-card.html
new file mode 100644
index 00000000000..12979bb1a70
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/card/x-card.html
@@ -0,0 +1,100 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="../../neon-shared-element-animatable-behavior.html">
+
+<dom-module id="x-card">
+ <template>
+ <style>
+ :host {
+ display: block;
+ overflow: hidden;
+ }
+ #placeholder {
+ opacity: 0;
+ background-color: grey;
+ @apply --layout-fit;
+ }
+ </style>
+
+ <div id="placeholder"></div>
+ <div id="container">
+ <slot name="div"></slot>
+ </div>
+
+ </template>
+</dom-module>
+
+<script>
+(function() {
+ Polymer({
+ is: 'x-card',
+
+ behaviors: [
+ Polymer.NeonSharedElementAnimatableBehavior
+ ],
+
+ properties: {
+ animationConfig: {
+ type: Object
+ },
+
+ sharedElements: {
+ type: Object
+ }
+ },
+
+ attached: function() {
+ if (this.animationConfig) {
+ return;
+ }
+
+ this.animationConfig = {
+ 'entry': [{
+ name: 'ripple-animation',
+ id: 'ripple',
+ toPage: this
+ }, {
+ name: 'fade-out-animation',
+ node: this.$.placeholder,
+ timing: {
+ delay: 250
+ }
+ }, {
+ name: 'fade-in-animation',
+ node: this.$.container,
+ timing: {
+ delay: 50
+ }
+ }],
+
+ 'exit': [{
+ name: 'fade-out-animation',
+ node: this.$.container,
+ timing: {
+ duration: 0
+ }
+ }, {
+ name: 'reverse-ripple-animation',
+ id: 'reverse-ripple',
+ fromPage: this
+ }]
+ };
+
+ this.sharedElements = {
+ 'ripple': this.$.placeholder,
+ 'reverse-ripple': this.$.placeholder
+ };
+ }
+ });
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/card/x-cards-list.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/card/x-cards-list.html
new file mode 100644
index 00000000000..a3ba2ca695e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/card/x-cards-list.html
@@ -0,0 +1,81 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="../../neon-shared-element-animatable-behavior.html">
+
+<dom-module id="x-cards-list">
+ <template>
+ <style>
+ :host {
+ display: block;
+ overflow: hidden;
+ }
+
+ #placeholder {
+ opacity: 0;
+ background-color: grey;
+ @apply --layout-fit;
+ }
+ </style>
+
+ <div id="placeholder"></div>
+ <div id="container">
+ <slot name="div"></slot>
+ </div>
+
+ </template>
+</dom-module>
+
+<script>
+(function() {
+ Polymer({
+ is: 'x-cards-list',
+
+ behaviors: [
+ Polymer.NeonSharedElementAnimatableBehavior
+ ],
+
+ properties: {
+ animationConfig: {
+ type: Object
+ }
+ },
+
+ attached: function() {
+ if (this.animationConfig) {
+ return;
+ }
+
+ this.animationConfig = {
+ 'entry': [{
+ name: 'reverse-ripple-animation',
+ id: 'reverse-ripple',
+ toPage: this
+ }],
+
+ 'exit': [{
+ name: 'fade-out-animation',
+ node: this.$.container,
+ timing: {
+ delay: 150,
+ duration: 0
+ }
+ }, {
+ name: 'ripple-animation',
+ id: 'ripple',
+ fromPage: this
+ }]
+ };
+ }
+ });
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/declarative/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/declarative/index.html
new file mode 100644
index 00000000000..3bac789d1b2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/declarative/index.html
@@ -0,0 +1,150 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+ <head>
+ <title>neon-animated-pages demo: declarative</title>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../web-animations.html">
+ <link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
+ <link rel="import" href="../../../paper-styles/typography.html">
+ <link rel="import" href="../../../paper-styles/color.html">
+ <link rel="import" href="../../neon-animated-pages.html">
+ <link rel="import" href="../../neon-animatable.html">
+ <link rel="import" href="../../neon-animations.html">
+
+ <custom-style>
+ <style is="custom-style">
+ body {
+ overflow: hidden;
+ height: 100vh;
+ margin: 0px;
+ }
+
+ dom-bind {
+ height: 100%;
+ }
+
+ .toolbar {
+ position: relative;
+
+ padding: 8px;
+
+ background-color: white;
+
+ z-index: 12;
+ }
+
+ neon-animated-pages {
+ height: 100%;
+ @apply --layout-flex;
+ }
+
+ neon-animatable {
+ color: white;
+ @apply --layout-horizontal;
+ @apply --layout-center-center;
+ @apply --paper-font-display4;
+ }
+
+ /* in shady polymer1 slot element is first child */
+ neon-animatable:nth-child(1),
+ neon-animatable:nth-child(6) {
+ background: var(--paper-red-500);
+ }
+
+ neon-animatable:nth-child(2) {
+ background: var(--paper-blue-500);
+ }
+
+ neon-animatable:nth-child(3) {
+ background: var(--paper-orange-500);
+ }
+
+ neon-animatable:nth-child(4) {
+ background: var(--paper-green-500);
+ }
+
+ neon-animatable:nth-child(5) {
+ background: var(--paper-purple-500);
+ }
+
+ </style>
+ </custom-style>
+
+ </head>
+ <body>
+ <dom-bind>
+ <template is="dom-bind">
+ <div class="toolbar">
+ <button on-click="_onPrevClick">&#8678;</button>
+ <button on-click="_onNextClick">&#8680;</button>
+ <button on-click="_onUpClick">&#8679;</button>
+ <button on-click="_onDownClick">&#8681;</button>
+ </div>
+
+ <neon-animated-pages id="pages" selected="[[selected]]" entry-animation="[[entryAnimation]]" exit-animation="[[exitAnimation]]">
+ <neon-animatable>1</neon-animatable>
+ <neon-animatable>2</neon-animatable>
+ <neon-animatable>3</neon-animatable>
+ <neon-animatable>4</neon-animatable>
+ <neon-animatable>5</neon-animatable>
+ </neon-animated-pages>
+
+ </template>
+ </dom-bind>
+
+ <script>
+
+ var scope1 = document.querySelector('template[is="dom-bind"]');
+ var scope2 = document.querySelector('dom-bind');
+
+ scope1.selected = 0;
+ scope2.selected = 0;
+
+ scope1._onPrevClick = function() {
+ this.entryAnimation = 'slide-from-left-animation';
+ this.exitAnimation = 'slide-right-animation';
+ this.selected = this.selected === 0 ? 4 : (this.selected - 1);
+ }
+
+ scope1._onNextClick = function() {
+ this.entryAnimation = 'slide-from-right-animation';
+ this.exitAnimation = 'slide-left-animation';
+ this.selected = this.selected === 4 ? 0 : (this.selected + 1);
+ }
+
+ scope1._onUpClick = function() {
+ this.entryAnimation = 'slide-from-top-animation';
+ this.exitAnimation = 'slide-down-animation';
+ this.selected = this.selected === 4 ? 0 : (this.selected + 1);
+ }
+
+ scope1._onDownClick = function() {
+ this.entryAnimation = 'slide-from-bottom-animation';
+ this.exitAnimation = 'slide-up-animation';
+ this.selected = this.selected === 0 ? 4 : (this.selected - 1);
+ }
+
+ scope2._onPrevClick = scope1._onPrevClick;
+ scope2._onNextClick = scope1._onNextClick;
+ scope2._onUpClick = scope1._onUpClick;
+ scope2._onDownClick = scope1._onDownClick;
+
+ </script>
+
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/doc/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/doc/index.html
new file mode 100644
index 00000000000..a15bfa585ae
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/doc/index.html
@@ -0,0 +1,76 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+ <head>
+ <title>neon-animation demo: basic</title>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../web-animations.html">
+ <link rel="import" href="my-animatable.html">
+ <link rel="import" href="my-dialog.html">
+
+ </head>
+ <style>
+ my-animatable {
+ margin-top: 50px;
+ }
+ </style>
+ <body>
+ <dom-bind>
+ <template is="dom-bind">
+
+ <button on-click="_onCircleButtonClick">toggle circle</button>
+ <button on-click="_onDialogButtonClick">toggle dialog</button>
+
+ <div style="text-align: center">
+ <my-dialog>Hello World!</my-dialog>
+ </div>
+
+ <my-animatable></my-animatable>
+
+ </template>
+ </dom-bind>
+
+ <script>
+
+ var scope1 = document.querySelector('template[is="dom-bind"]');
+ var scope2 = document.querySelector('dom-bind');
+
+ scope1._onCircleButtonClick = function(event) {
+ var node = document.querySelector('my-animatable');
+ if (node) {
+ node.animate();
+ }
+ };
+
+ scope1._onDialogButtonClick = function(event) {
+ var node = document.querySelector('my-dialog');
+ if (node) {
+ if (node.opened) {
+ node.hide();
+ } else {
+ node.show();
+ }
+ }
+ };
+
+ scope2._onCircleButtonClick = scope1._onCircleButtonClick;
+ scope2._onDialogButtonClick = scope1._onDialogButtonClick;
+
+ </script>
+
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/doc/my-animatable.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/doc/my-animatable.html
new file mode 100644
index 00000000000..86dcb19ea5c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/doc/my-animatable.html
@@ -0,0 +1,68 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../neon-animation-runner-behavior.html">
+<link rel="import" href="../../animations/scale-down-animation.html">
+
+<dom-module id="my-animatable">
+ <template>
+ <style>
+ :host {
+ display: inline-block;
+ border-radius: 50%;
+ width: 300px;
+ height: 300px;
+ background: orange;
+ }
+ </style>
+ <slot></slot>
+
+ </template>
+</dom-module>
+
+<script>
+
+ Polymer({
+
+ is: 'my-animatable',
+
+ behaviors: [
+ Polymer.NeonAnimationRunnerBehavior
+ ],
+
+ properties: {
+
+ animationConfig: {
+ type: Object,
+ value: function() {
+ return {
+ name: 'scale-down-animation',
+ node: this
+ }
+ }
+ }
+
+ },
+
+ listeners: {
+ 'neon-animation-finish': '_onNeonAnimationFinish'
+ },
+
+ animate: function() {
+ this.playAnimation();
+ },
+
+ _onNeonAnimationFinish: function() {
+ console.log('animation finish!');
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/doc/my-dialog.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/doc/my-dialog.html
new file mode 100644
index 00000000000..5ccdff82c76
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/doc/my-dialog.html
@@ -0,0 +1,94 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../../paper-styles/shadow.html">
+<link rel="import" href="../../neon-animation-runner-behavior.html">
+<link rel="import" href="../../animations/scale-up-animation.html">
+<link rel="import" href="../../animations/fade-out-animation.html">
+
+
+<dom-module id="my-dialog">
+ <template>
+ <style>
+ :host {
+ display: none;
+ padding: 16px;
+ background: white;
+ color: black;
+ margin: 0 auto;
+ z-index: 100;
+ position: absolute;
+ @apply --shadow-elevation-2dp;
+ }
+ </style>
+ <slot></slot>
+
+ </template>
+
+</dom-module>
+
+<script>
+
+ Polymer({
+
+ is: 'my-dialog',
+
+ behaviors: [
+ Polymer.NeonAnimationRunnerBehavior
+ ],
+
+ properties: {
+
+ opened: {
+ type: Boolean
+ },
+
+ animationConfig: {
+ type: Object,
+ value: function() {
+ return {
+ 'entry': [{
+ name: 'scale-up-animation',
+ node: this
+ }],
+ 'exit': [{
+ name: 'fade-out-animation',
+ node: this
+ }]
+ }
+ }
+ }
+
+ },
+
+ listeners: {
+ 'neon-animation-finish': '_onAnimationFinish'
+ },
+
+ _onAnimationFinish: function() {
+ if (!this.opened) {
+ this.style.display = '';
+ }
+ },
+
+ show: function() {
+ this.opened = true;
+ this.style.display = 'inline-block';
+ this.playAnimation('entry');
+ },
+
+ hide: function() {
+ this.opened = false;
+ this.playAnimation('exit');
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/dropdown/animated-dropdown.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/dropdown/animated-dropdown.html
new file mode 100644
index 00000000000..8c09f37a46e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/dropdown/animated-dropdown.html
@@ -0,0 +1,90 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../../paper-styles/shadow.html">
+<link rel="import" href="../../neon-animation-runner-behavior.html">
+
+<dom-module id="animated-dropdown">
+ <template>
+ <style>
+ :host {
+ display: none;
+ padding: 16px;
+ background: white;
+ color: black;
+
+ @apply --shadow-elevation-2dp;
+ }
+ </style>
+ <slot></slot>
+ </template>
+</dom-module>
+
+<script>
+
+ Polymer({
+
+ is: 'animated-dropdown',
+
+ behaviors: [
+ Polymer.NeonAnimationRunnerBehavior
+ ],
+
+ properties: {
+
+ animationConfig: {
+ type: Object,
+ value: function() {
+ return {
+ 'entry': [{
+ name: 'scale-up-animation',
+ node: this,
+ transformOrigin: '0 0'
+ }],
+ 'exit': [{
+ name: 'fade-out-animation',
+ node: this
+ }]
+ }
+ }
+ },
+
+ _showing: {
+ type: Boolean,
+ value: false
+ }
+
+ },
+
+ listeners: {
+ 'neon-animation-finish': '_onAnimationFinish'
+ },
+
+ _onAnimationFinish: function() {
+ if (this._showing) {
+ } else {
+ this.style.display = '';
+ }
+ },
+
+ show: function() {
+ this.style.display = 'inline-block';
+ this._showing = true;
+ this.playAnimation('entry');
+ },
+
+ hide: function() {
+ this._showing = false;
+ this.playAnimation('exit');
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/dropdown/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/dropdown/index.html
new file mode 100644
index 00000000000..de81a322a33
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/dropdown/index.html
@@ -0,0 +1,61 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+ <head>
+ <title>neon-animated-pages demo: dropdown</title>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../web-animations.html">
+ <link rel="import" href="../../neon-animated-pages.html">
+ <link rel="import" href="../../neon-animations.html">
+ <link rel="import" href="animated-dropdown.html">
+
+ </head>
+ <body>
+
+ <dom-bind>
+ <template is="dom-bind">
+
+ <button dropdown-id="dropdown" on-click="_onButtonClick">dropdown</button>
+ <br>
+ <animated-dropdown id="dropdown" on-click="_onDropdownClick">Hello world!</animated-dropdown>
+
+ </template>
+ </dom-bind>
+
+ <script>
+
+ var scope1 = document.querySelector('template[is="dom-bind"]');
+ var scope2 = document.querySelector('dom-bind');
+
+ scope1._onButtonClick = function(event) {
+ var dropdown = document.querySelector('#' + event.target.getAttribute('dropdown-id'));
+ if (dropdown) {
+ dropdown.show();
+ }
+ };
+
+ scope1._onDropdownClick = function(event) {
+ event.target.hide();
+ };
+
+ scope2._onButtonClick = scope1._onButtonClick;
+ scope2._onDropdownClick = scope1._onDropdownClick;
+
+ </script>
+
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/grid/animated-grid.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/grid/animated-grid.html
new file mode 100644
index 00000000000..3688ace6b21
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/grid/animated-grid.html
@@ -0,0 +1,160 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../../paper-styles/typography.html">
+<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="../../neon-shared-element-animatable-behavior.html">
+<link rel="import" href="../shared-styles.html">
+
+<dom-module id="animated-grid">
+ <template>
+ <style include="shared-styles">
+
+ :host {
+ display: block;
+ background: #000;
+ }
+
+ .tile {
+ display: inline-block;
+ float: left;
+ vertical-align: top;
+ width: calc(100% / 6);
+ height: calc(100% / 3);
+
+ @apply --paper-font-title;
+ @apply --layout-vertical;
+ @apply --layout-center-center;
+ }
+
+ .tile:nth-of-type(1) {
+ width: calc(100% / 3);
+ height: calc(100% / 3 * 2);
+ }
+
+ .tile:nth-of-type(4) {
+ width: calc(100% / 3);
+ }
+
+ .tile:nth-of-type(5) {
+ width: calc(100% / 3);
+ height: calc(100% / 3 * 2);
+ }
+
+ .tile:nth-of-type(8) {
+ width: calc(100% / 3);
+ height: calc(100% / 3);
+ }
+
+ .tile:nth-of-type(9) {
+ position: absolute;
+ top: calc(100% / 3 * 2);
+ left: 0;
+ width: calc(100% / 6);
+ height: calc(100% / 3);
+ }
+
+ .tile:nth-of-type(10) {
+ position: absolute;
+ top: calc(100% / 3 * 2);
+ left: calc(100% / 6);;
+ width: calc(100% / 6);
+ height: calc(100% / 3);
+ }
+ </style>
+
+ <template is="dom-repeat" items="[[config]]">
+ <div item="[[item]]" class$="[[_computeTileClass(item.color)]]" on-click="_onClick">
+ <span>[[item.value]]</span>
+ </div>
+ </template>
+
+ </template>
+</dom-module>
+
+<script>
+
+ Polymer({
+
+ is: 'animated-grid',
+
+ behaviors: [
+ Polymer.NeonSharedElementAnimatableBehavior
+ ],
+
+ properties: {
+
+ config: {
+ type: Array,
+ value: function() {
+ return [
+ {value: 1, color: 'blue'},
+ {value: 2, color: 'red'},
+ {value: 3, color: 'blue'},
+ {value: 4, color: 'green'},
+ {value: 5, color: 'yellow'},
+ {value: 6, color: 'blue'},
+ {value: 7, color: 'red'},
+ {value: 8, color: 'green'},
+ {value: 9, color: 'yellow'},
+ {value: 10, color: 'red'}
+ ]
+ }
+ },
+
+ animationConfig: {
+ type: Object,
+ value: function() {
+ return {
+ 'exit': [{
+ name: 'ripple-animation',
+ id: 'ripple',
+ fromPage: this
+ }, {
+ name: 'hero-animation',
+ id: 'hero',
+ fromPage: this
+ }]
+ }
+ }
+ }
+
+ },
+
+ _computeTileClass: function(color) {
+ return 'tile ' + color + '-300';
+ },
+
+ _onClick: function(event) {
+ var target = Polymer.dom(event).rootTarget;
+
+ if (!target.item) {
+ target = Polymer.dom(target).parentNode;
+ }
+
+ // configure the page animation
+ this.sharedElements = {
+ 'hero': target,
+ 'ripple': target
+ };
+ this.animationConfig['exit'][0].gesture = {
+ x: event.x || event.pageX,
+ y: event.y || event.pageY
+ };
+
+ this.fire('tile-click', {
+ tile: target,
+ data: target.item
+ });
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/grid/fullsize-page-with-card.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/grid/fullsize-page-with-card.html
new file mode 100644
index 00000000000..8f334ec44ac
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/grid/fullsize-page-with-card.html
@@ -0,0 +1,125 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../neon-shared-element-animatable-behavior.html">
+<link rel="import" href="../../../paper-styles/color.html">
+<link rel="import" href="../shared-styles.html">
+
+<dom-module id="fullsize-page-with-card">
+ <template>
+ <style include="shared-styles"></style>
+ <style>
+
+ :host {
+ display: block;
+ }
+
+ .fixed {
+ position: fixed;
+ top: 0;
+ left: 0;
+ height: 100vh;
+ width: 100vw;
+ }
+
+ .card {
+ position: relative;
+ margin: 200px 100px 0;
+ height: 700px;
+ }
+
+ </style>
+
+ <div id="fixed" class$="[[_computeFixedBackgroundClass(color)]]"></div>
+ <div id="card" class$="[[_computeCardClass(color)]]"></div>
+
+ </template>
+
+</dom-module>
+
+<script>
+
+ Polymer({
+
+ is: 'fullsize-page-with-card',
+
+ behaviors: [
+ Polymer.NeonSharedElementAnimatableBehavior
+ ],
+
+ properties: {
+
+ color: {
+ type: String
+ },
+
+ sharedElements: {
+ type: Object
+ },
+
+ animationConfig: {
+ type: Object
+ }
+ },
+
+ attached: function() {
+ if (this.animationConfig) {
+ return;
+ }
+
+ this.sharedElements = {
+ 'hero': this.$.card,
+ 'ripple': this.$.fixed
+ };
+
+ this.animationConfig = {
+ 'entry': [{
+ name: 'ripple-animation',
+ id: 'ripple',
+ toPage: this,
+ }, {
+ name: 'hero-animation',
+ id: 'hero',
+ toPage: this,
+ timing: {
+ delay: 150
+ }
+ }],
+ 'exit': [{
+ name: 'fade-out-animation',
+ node: this.$.fixed
+ }, {
+ name: 'transform-animation',
+ transformFrom: 'none',
+ transformTo: 'translate(0px,-200vh) scale(0.9,1)',
+ node: this.$.card
+ }]
+ };
+ },
+
+ _computeCardClass: function(color) {
+ var cls = 'card';
+ if (color) {
+ cls += ' ' + color + '-300';
+ }
+ return cls;
+ },
+
+ _computeFixedBackgroundClass: function(color) {
+ var cls = 'fixed';
+ if (color) {
+ cls += ' ' + color + '-100';
+ }
+ return cls;
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/grid/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/grid/index.html
new file mode 100644
index 00000000000..d88ec2d7979
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/grid/index.html
@@ -0,0 +1,74 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+ <head>
+ <title>neon-animated-pages demo: grid</title>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../web-animations.html">
+ <link rel="import" href="../../neon-animated-pages.html">
+ <link rel="import" href="../../neon-animations.html">
+ <link rel="import" href="animated-grid.html">
+ <link rel="import" href="fullsize-page-with-card.html">
+
+ <custom-style>
+ <style is="custom-style">
+ body {
+ overflow: hidden;
+ @apply --layout-fullbleed;
+ }
+
+ neon-animated-pages {
+ height: 100%;
+ }
+ </style>
+ </custom-style>
+
+ </head>
+ <body>
+ <dom-bind>
+ <template is="dom-bind">
+ <neon-animated-pages id="pages" selected="0">
+ <animated-grid on-tile-click="_onTileClick"></animated-grid>
+ <fullsize-page-with-card id="fullsize-card" on-click="_onFullsizeClick">
+ </fullsize-page-with-card>
+ </neon-animated-pages>
+ </template>
+ </dom-bind>
+
+ <script>
+
+ var scope1 = document.querySelector('template[is="dom-bind"]');
+ var scope2 = document.querySelector('dom-bind');
+
+ var _onTileClick = function(event) {
+ this.$['fullsize-card'].color = event.detail.data.color;
+ this.$.pages.selected = 1;
+ };
+
+ var _onFullsizeClick = function(event) {
+ this.$.pages.selected = 0;
+ };
+
+ scope1._onTileClick = _onTileClick;
+ scope1._onFullsizeClick = _onFullsizeClick;
+ scope2._onTileClick = _onTileClick;
+ scope2._onFullsizeClick = _onFullsizeClick;
+
+ </script>
+
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/index.html
new file mode 100644
index 00000000000..1ca9f2d50ce
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/index.html
@@ -0,0 +1,46 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html lang="en">
+<head>
+ <title>neon-animated pages demo</title>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../paper-styles/demo-pages.html">
+ <link rel="import" href="../web-animations.html">
+</head>
+<style>
+ a {
+ display: block;
+ margin-bottom: 10px;
+ }
+</style>
+<body unresolved>
+ <div class="horizontal-section-container">
+ <div>
+ <h4>Sample demos</h4>
+ <div class="horizontal-section">
+ <a href="doc/index.html">basic</a>
+ <a href="declarative/index.html">declarative</a>
+ <a href="dropdown/index.html">dropdown</a>
+ <a href="grid/index.html">grid</a>
+ <a href="list/index.html">list</a>
+ <a href="load/index.html">load</a>
+ <a href="tiles/index.html">tiles</a>
+ <a href="card/index.html">card</a>
+ </div>
+ </div>
+ </div>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/list/full-view.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/list/full-view.html
new file mode 100644
index 00000000000..da52eb318ba
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/list/full-view.html
@@ -0,0 +1,123 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="../../../paper-styles/shadow.html">
+<link rel="import" href="../../../app-layout/app-toolbar/app-toolbar.html">
+<link rel="import" href="../../neon-animatable-behavior.html">
+
+<dom-module id="full-view">
+ <template>
+ <style>
+ :host {
+ @apply --layout-vertical;
+ }
+
+ .main {
+ background: white;
+ @apply --layout-flex;
+ @apply --layout-scroll;
+ @apply --shadow-elevation-8dp;
+ }
+
+ .image-container {
+ position: relative;
+ width: 100%;
+ padding-bottom: 100%;
+ }
+
+ .image {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ 45deg,
+ #f5f5f5,
+ #f5f5f5 8px,
+ #e0e0e0 8px,
+ #e0e0e0 16px
+ );
+ }
+
+ app-toolbar {
+ color: white;
+ background-color: var(--google-blue-500);
+ }
+ </style>
+ <app-toolbar>
+ <paper-icon-button id="button" icon="clear" on-click="_onClearButtonClick"></paper-icon-button>
+ </app-toolbar>
+
+ <div id="main" class="main">
+ <div class="image-container">
+ <div class="image">
+ </div>
+ </div>
+ </div>
+
+ </template>
+</dom-module>
+
+<script>
+
+ Polymer({
+
+ is: 'full-view',
+
+ behaviors: [
+ Polymer.NeonAnimatableBehavior
+ ],
+
+ properties: {
+
+ sharedElements: {
+ type: Object
+ },
+
+ animationConfig: {
+ type: Object
+ }
+ },
+
+ attached: function() {
+ if (this.animationConfig) {
+ return;
+ }
+
+ this.sharedElements = { 'hero': this.$.main };
+ this.animationConfig = {
+ 'entry': [{
+ name: 'fade-in-animation',
+ node: this.$.button
+ }, {
+ name: 'hero-animation',
+ id: 'hero',
+ toPage: this
+ }],
+
+ 'exit': [{
+ name: 'fade-out-animation',
+ node: this.$.button
+ }, {
+ name: 'scale-down-animation',
+ node: this.$.main,
+ transformOrigin: '50% 50%',
+ axis: 'y'
+ }]
+ }
+ },
+
+ _onClearButtonClick: function() {
+ this.fire('close');
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/list/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/list/index.html
new file mode 100644
index 00000000000..6e100bd21f3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/list/index.html
@@ -0,0 +1,38 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+ <head>
+ <title>neon-animated-pages demo: list</title>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+ <script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../../web-animations.html">
+ <link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
+ <link rel="import" href="list-demo.html">
+
+ </head>
+ <custom-style>
+ <style is="custom-style">
+ body {
+ @apply --layout-fullbleed;
+ }
+
+ list-demo {
+ @apply --layout-fit;
+ }
+ </style>
+ </custom-style>
+ <body>
+ <list-demo></list-demo>
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/list/list-demo.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/list/list-demo.html
new file mode 100644
index 00000000000..21897e4c357
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/list/list-demo.html
@@ -0,0 +1,101 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../neon-animated-pages.html">
+<link rel="import" href="../../neon-animations.html">
+<link rel="import" href="list-view.html">
+<link rel="import" href="full-view.html">
+
+<dom-module id="list-demo">
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+ neon-animated-pages {
+ height: 100%;
+ }
+ </style>
+ <neon-animated-pages id="pages" selected="0">
+ <list-view data="[[fileData]]" on-item-click="_onItemClick"></list-view>
+ <full-view on-close="_onClose"></full-view>
+ </neon-animated-pages>
+ </template>
+
+</dom-module>
+
+<script>
+
+ Polymer({
+
+ is: 'list-demo',
+
+ properties: {
+
+ fileData: {
+ type: Array,
+ value: function() {
+ return [
+ {fileName: 'IMG_4130.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4131.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4132.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4133.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4134.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4135.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4136.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4137.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4138.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4139.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4140.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4141.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4142.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4143.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4144.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4145.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4146.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4147.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4148.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4149.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4150.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4151.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4152.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4153.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4154.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4155.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4156.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4157.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4158.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4159.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4160.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4161.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4162.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4163.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4164.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4165.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4166.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4167.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4168.jpg', modifiedDate: 'May 12 2015'},
+ {fileName: 'IMG_4169.jpg', modifiedDate: 'May 12 2015'}
+ ]
+ }
+ }
+ },
+
+ _onItemClick: function() {
+ this.$.pages.selected = 1;
+ },
+
+ _onClose: function() {
+ this.$.pages.selected = 0;
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/list/list-view.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/list/list-view.html
new file mode 100644
index 00000000000..2620a35599b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/list/list-view.html
@@ -0,0 +1,131 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../../iron-icons/iron-icons.html">
+<link rel="import" href="../../../iron-icon/iron-icon.html">
+<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="../../../paper-icon-button/paper-icon-button.html">
+<link rel="import" href="../../../paper-item/paper-item.html">
+<link rel="import" href="../../../paper-item/paper-item-body.html">
+<link rel="import" href="../../../app-layout/app-toolbar/app-toolbar.html">
+<link rel="import" href="../../../paper-styles/color.html">
+<link rel="import" href="../../neon-animatable-behavior.html">
+
+<dom-module id="list-view">
+ <template>
+ <style>
+ :host {
+ @apply --layout-vertical;
+ }
+
+ .main {
+ @apply --layout-flex;
+ @apply --layout-scroll;
+ }
+
+ iron-icon {
+ color: var(--google-grey-500);
+ }
+
+ app-toolbar {
+ color: white;
+ background-color: var(--google-blue-500);
+ }
+ </style>
+ <app-toolbar>
+ <paper-icon-button id="button" icon="arrow-back"></paper-icon-button>
+ </app-toolbar>
+
+ <div class="main">
+
+ <template is="dom-repeat" items="[[data]]">
+
+ <paper-item>
+ <paper-item-body two-line>
+ <div>[[item.fileName]]</div>
+ <div secondary>[[item.modifiedDate]]</div>
+ </paper-item-body>
+ <iron-icon icon="info"></iron-icon>
+ </paper-item>
+
+ </template>
+
+ </div>
+
+ </template>
+
+</dom-module>
+
+<script>
+
+ Polymer({
+
+ is: 'list-view',
+
+ behaviors: [
+ Polymer.NeonAnimatableBehavior
+ ],
+
+ listeners: {
+ 'click': '_onClick'
+ },
+
+ properties: {
+
+ data: {
+ type: Array,
+ value: function() {
+ return [];
+ }
+ },
+
+ animationConfig: {
+ type: Object
+ }
+ },
+
+ attached: function() {
+ if (this.animationConfig) {
+ return;
+ }
+
+ this.animationConfig = {
+ 'entry': [{
+ name: 'fade-in-animation',
+ node: this.$.button
+ }],
+
+ 'exit': [{
+ name: 'fade-out-animation',
+ node: this.$.button
+ }, {
+ name: 'hero-animation',
+ id: 'hero',
+ fromPage: this
+ }]
+ };
+ },
+
+ _onClick: function(event) {
+ var target = Polymer.dom(event).rootTarget;
+
+ // configure the page animation
+ this.sharedElements = {
+ 'hero': target,
+ };
+
+ this.fire('item-click', {
+ item: target,
+ });
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/load/animated-grid.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/load/animated-grid.html
new file mode 100644
index 00000000000..260a4395e72
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/load/animated-grid.html
@@ -0,0 +1,145 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="../../neon-shared-element-animatable-behavior.html">
+<link rel="import" href="../../../paper-styles/typography.html">
+<link rel="import" href="../../../paper-styles/color.html">
+<link rel="import" href="../shared-styles.html">
+
+<dom-module id="animated-grid">
+ <template>
+ <style include="shared-styles">
+ :host {
+ display: block;
+ background: #000;
+ }
+
+ .tile {
+ display: inline-block;
+ float: left;
+ vertical-align: top;
+ width: calc(100% / 6);
+ height: calc(100% / 3);
+
+ @apply --paper-font-title;
+ @apply --layout-vertical;
+ @apply --layout-center-center;
+ }
+
+ .tile:nth-of-type(1) {
+ width: calc(100% / 3);
+ height: calc(100% / 3 * 2);
+ }
+
+ .tile:nth-of-type(4) {
+ width: calc(100% / 3);
+ }
+
+ .tile:nth-of-type(5) {
+ width: calc(100% / 3);
+ height: calc(100% / 3 * 2);
+ }
+
+ .tile:nth-of-type(8) {
+ width: calc(100% / 3);
+ height: calc(100% / 3);
+ }
+
+ .tile:nth-of-type(9) {
+ position: absolute;
+ top: calc(100% / 3 * 2);
+ left: 0;
+ width: calc(100% / 6);
+ height: calc(100% / 3);
+ }
+
+ .tile:nth-of-type(10) {
+ position: absolute;
+ top: calc(100% / 3 * 2);
+ left: calc(100% / 6);;
+ width: calc(100% / 6);
+ height: calc(100% / 3);
+ }
+ </style>
+
+ <template is="dom-repeat" items="[[config]]">
+ <div class$="[[_computeTileClass(item.color)]]">
+ <span>[[item.value]]</span>
+ </div>
+ </template>
+
+ </template>
+
+</dom-module>
+
+<script>
+
+ Polymer({
+
+ is: 'animated-grid',
+
+ behaviors: [
+ Polymer.NeonSharedElementAnimatableBehavior
+ ],
+
+ properties: {
+
+ config: {
+ type: Array,
+ value: function() {
+ return [
+ {value: 1, color: 'blue'},
+ {value: 2, color: 'red'},
+ {value: 3, color: 'blue'},
+ {value: 4, color: 'green'},
+ {value: 5, color: 'yellow'},
+ {value: 6, color: 'blue'},
+ {value: 7, color: 'red'},
+ {value: 8, color: 'green'},
+ {value: 9, color: 'yellow'},
+ {value: 10, color: 'red'}
+ ]
+ }
+ },
+
+ animationConfig: {
+ type: Object,
+ value: function() {
+ return {
+ 'entry': [{
+ name: 'cascaded-animation',
+ animation: 'transform-animation',
+ transformFrom: 'translateY(100%)',
+ transformTo: 'none',
+ timing: {
+ delay: 50
+ }
+ }]
+ }
+ }
+ }
+
+ },
+
+ ready: function() {
+ this.async(function() {
+ var nodeList = Polymer.dom(this.root).querySelectorAll('.tile');
+ this.animationConfig['entry'][0].nodes = Array.prototype.slice.call(nodeList);
+ });
+ },
+
+ _computeTileClass: function(color) {
+ return 'tile ' + color + '-300';
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/load/full-page.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/load/full-page.html
new file mode 100644
index 00000000000..d7a789a6067
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/load/full-page.html
@@ -0,0 +1,82 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="../../neon-animatable-behavior.html">
+<link rel="import" href="../../neon-animation-runner-behavior.html">
+<link rel="import" href="../../../paper-styles/shadow.html">
+<link rel="import" href="animated-grid.html">
+
+<dom-module id="full-page">
+ <template>
+ <style>
+ :host {
+ background: black;
+ visibility: hidden;
+ @apply --layout-vertical;
+ }
+
+ .toolbar {
+ background: #9c27b0;
+ height: 72px;
+ z-index: 1;
+ @apply --shadow-elevation-2dp;
+ }
+
+ animated-grid {
+ height: calc(100% - 72px);
+ @apply --layout-flex;
+ }
+ </style>
+
+ <div id="toolbar" class="toolbar"></div>
+ <animated-grid id="grid"></animated-grid>
+
+ </template>
+</dom-module>
+
+<script>
+
+Polymer({
+
+ is: 'full-page',
+
+ behaviors: [
+ Polymer.NeonAnimatableBehavior,
+ Polymer.NeonAnimationRunnerBehavior
+ ],
+
+ properties: {
+
+ animationConfig: {
+ type: Object
+ }
+ },
+
+ attached: function() {
+ this.animationConfig = this.animationConfig || {
+ 'entry': [{
+ name: 'slide-from-top-animation',
+ node: this.$.toolbar
+ }, {
+ animatable: this.$.grid,
+ type: 'entry'
+ }]
+ };
+ },
+
+ show: function() {
+ this.style.visibility = 'visible';
+ this.playAnimation('entry');
+ }
+
+});
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/load/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/load/index.html
new file mode 100644
index 00000000000..1e1f1317b52
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/load/index.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+ <head>
+ <title>neon-animated-pages demo: load</title>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../../web-animations.html">
+ <link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
+ <link rel="import" href="../../neon-animated-pages.html">
+ <link rel="import" href="../../neon-animations.html">
+ <link rel="import" href="full-page.html">
+
+ <custom-style>
+ <style is="custom-style">
+ body {
+ overflow: hidden;
+ @apply --layout-fullbleed;
+ }
+ full-page {
+ @apply --layout-fit;
+ }
+ </style>
+ </custom-style>
+ </head>
+ <body>
+
+ <full-page></full-page>
+
+ <script>
+
+ window.addEventListener('WebComponentsReady', function() {
+ document.querySelector('full-page').show();
+ });
+
+ </script>
+
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/shared-styles.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/shared-styles.html
new file mode 100644
index 00000000000..4e48c8c4065
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/shared-styles.html
@@ -0,0 +1,47 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<dom-module id="shared-styles">
+ <template>
+ <style>
+ .red-100 {
+ background: var(--google-red-100);
+ }
+
+ .yellow-100 {
+ background: var(--google-yellow-100);
+ }
+
+ .blue-100 {
+ background: var(--google-blue-100);
+ }
+
+ .green-100 {
+ background: var(--google-green-100);
+ }
+
+ .red-300 {
+ background: var(--google-red-300);
+ }
+
+ .yellow-300 {
+ background: var(--google-yellow-300);
+ }
+
+ .blue-300 {
+ background: var(--google-blue-300);
+ }
+
+ .green-300 {
+ background: var(--google-green-300);
+ }
+ </style>
+ </template>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/tiles/circles-page.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/tiles/circles-page.html
new file mode 100644
index 00000000000..3d7fdddca2f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/tiles/circles-page.html
@@ -0,0 +1,115 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="../../neon-shared-element-animatable-behavior.html">
+
+<dom-module id="circles-page">
+ <template>
+ <style>
+ :host {
+ @apply --layout-horizontal;
+ @apply --layout-center-center;
+ }
+
+ .circle {
+ display: inline-block;
+ box-sizing: border-box;
+ width: 100px;
+ height: 100px;
+ margin: 16px;
+ border-radius: 50%;
+ background: var(--color-one);
+ }
+ </style>
+
+ <div>
+ <div class="circle"></div>
+ <div class="circle"></div>
+ <div class="circle"></div>
+ <div class="circle"></div>
+ </div>
+
+ </template>
+
+</dom-module>
+
+<script>
+
+ Polymer({
+
+ is: 'circles-page',
+
+ behaviors: [
+ Polymer.NeonSharedElementAnimatableBehavior
+ ],
+
+ properties: {
+
+ animationConfig: {
+ type: Object
+ }
+ },
+
+ listeners: {
+ 'click': '_onClick'
+ },
+
+ attached: function() {
+ if (this.animationConfig) {
+ return;
+ }
+
+ var circles = Polymer.dom(this.root).querySelectorAll('.circle');
+ var circlesArray = Array.prototype.slice.call(circles);
+ this.animationConfig = {
+ 'entry': [{
+ name: 'cascaded-animation',
+ animation: 'scale-up-animation',
+ nodes: circlesArray
+ }],
+
+ 'exit': [{
+ name: 'hero-animation',
+ id: 'hero',
+ fromPage: this
+ }, {
+ name: 'cascaded-animation',
+ animation: 'scale-down-animation'
+ }]
+ };
+ },
+
+ _onClick: function(event) {
+ var target = Polymer.dom(event).rootTarget;
+
+ if (target.classList.contains('circle')) {
+ // configure the page animation
+ this.sharedElements = {
+ 'hero': target
+ };
+
+ var nodesToScale = [];
+ var circles = Polymer.dom(this.root).querySelectorAll('.circle');
+
+ for (var node, index = 0; node = circles[index]; index++) {
+ if (node !== event.target) {
+ nodesToScale.push(node);
+ }
+ }
+
+ this.animationConfig['exit'][1].nodes = nodesToScale;
+ this.fire('circle-click');
+ }
+ }
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/tiles/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/tiles/index.html
new file mode 100644
index 00000000000..3a46ab08cf4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/tiles/index.html
@@ -0,0 +1,80 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+ <head>
+ <title>neon-animated-pages demo: tiles</title>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../web-animations.html">
+ <link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
+ <link rel="import" href="../../neon-animated-pages.html">
+ <link rel="import" href="../../neon-animations.html">
+ <link rel="import" href="../../../paper-styles/color.html">
+ <link rel="import" href="circles-page.html">
+ <link rel="import" href="squares-page.html">
+
+ <custom-style>
+ <style is="custom-style">
+ body {
+ overflow: hidden;
+ @apply --layout-fullbleed;
+ }
+ neon-animated-pages {
+ height: 100%;
+ }
+
+ :root {
+ --color-one: var(--paper-cyan-300);
+ --color-two: var(--paper-orange-500);
+ }
+ </style>
+ </custom-style>
+
+ </head>
+ <body>
+ <dom-bind>
+ <template is="dom-bind">
+
+ <neon-animated-pages id="pages" selected="0">
+ <circles-page on-circle-click="_onCircleClick"></circles-page>
+ <squares-page on-click="_onSquaresClick"></squares-page>
+ </neon-animated-pages>
+
+ </template>
+ </dom-bind>
+
+ <script>
+
+ var scope1 = document.querySelector('template[is="dom-bind"]');
+ var scope2 = document.querySelector('dom-bind');
+
+ var _onCircleClick = function(event) {
+ this.$.pages.selected = 1;
+ };
+
+ var _onSquaresClick = function(event) {
+ this.$.pages.selected = 0;
+ };
+
+ scope1._onCircleClick = _onCircleClick;
+ scope1._onSquaresClick = _onSquaresClick;
+ scope2._onCircleClick = _onCircleClick;
+ scope2._onSquaresClick = _onSquaresClick;
+
+ </script>
+
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/tiles/squares-page.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/tiles/squares-page.html
new file mode 100644
index 00000000000..5382fb1eed3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/demo/tiles/squares-page.html
@@ -0,0 +1,102 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../../polymer/polymer.html">
+<link rel="import" href="../../neon-shared-element-animatable-behavior.html">
+
+<dom-module id="squares-page">
+ <template>
+ <style>
+ .header {
+ height: 40%;
+ background: var(--color-one);
+ }
+
+ .body {
+ text-align: center;
+ padding: 8px;
+ }
+
+ .square {
+ display: inline-block;
+ width: 150px;
+ height: 150px;
+ margin: 8px;
+ background: var(--color-two);
+ }
+ </style>
+
+ <div id="header" class="header"></div>
+
+ <div class="body">
+ <div class="square"></div>
+ <div class="square"></div>
+ <div class="square"></div>
+ <div class="square"></div>
+ </div>
+
+ </template>
+
+</dom-module>
+
+<script>
+
+ Polymer({
+
+ is: 'squares-page',
+
+ behaviors: [
+ Polymer.NeonSharedElementAnimatableBehavior
+ ],
+
+ properties: {
+
+ sharedElements: {
+ type: Object
+ },
+
+ animationConfig: {
+ type: Object
+ }
+ },
+
+ attached: function() {
+ if (this.animationConfig) {
+ return;
+ }
+
+ this.sharedElements = { 'hero': this.$.header };
+ var squares = Polymer.dom(this.root).querySelectorAll('.square');
+ var squaresArray = Array.prototype.slice.call(squares);
+ this.animationConfig = {
+ 'entry': [{
+ name: 'hero-animation',
+ id: 'hero',
+ toPage: this
+ }, {
+ name: 'cascaded-animation',
+ animation: 'transform-animation',
+ transformFrom: 'translateY(100%)',
+ nodes: squaresArray
+ }],
+
+ 'exit': [{
+ name: 'slide-up-animation',
+ node: this.$.header
+ }, {
+ name: 'cascaded-animation',
+ animation: 'transform-animation',
+ transformTo: 'translateY(60vh)',
+ nodes: squaresArray
+ }]
+ };
+ }
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/gen-tsd.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/gen-tsd.json
new file mode 100644
index 00000000000..c2e13678514
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/gen-tsd.json
@@ -0,0 +1,5 @@
+{
+ "removeReferences": [
+ "../web-animations-js/web-animations-next-lite.min.d.ts"
+ ]
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/guides/neon-animation.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/guides/neon-animation.md
new file mode 100644
index 00000000000..69727b864ff
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/guides/neon-animation.md
@@ -0,0 +1,314 @@
+---
+title: neon-animation
+summary: "A short guide to neon-animation and neon-animated-pages"
+tags: ['animation','core-animated-pages']
+elements: ['neon-animation','neon-animated-pages']
+updated: 2015-05-26
+---
+
+# neon-animation
+
+`neon-animation` is a suite of elements and behaviors to implement pluggable animated transitions for Polymer Elements using [Web Animations](https://w3c.github.io/web-animations/).
+
+*Warning: The API may change.*
+
+* [A basic animatable element](#basic)
+* [Animation configuration](#configuration)
+ * [Animation types](#configuration-types)
+ * [Configuration properties](#configuration-properties)
+ * [Using multiple animations](#configuration-multiple)
+ * [Running animations encapsulated in children nodes](#configuration-encapsulation)
+* [Page transitions](#page-transitions)
+ * [Shared element animations](#shared-element)
+ * [Declarative page transitions](#declarative-page)
+* [Included animations](#animations)
+* [Demos](#demos)
+
+<a name="basic"></a>
+## A basic animatable element
+
+Elements that can be animated should implement the `Polymer.NeonAnimatableBehavior` behavior, or `Polymer.NeonAnimationRunnerBehavior` if they're also responsible for running an animation.
+
+```js
+Polymer({
+ is: 'my-animatable',
+ behaviors: [
+ Polymer.NeonAnimationRunnerBehavior
+ ],
+ properties: {
+ animationConfig: {
+ value: function() {
+ return {
+ // provided by neon-animation/animations/scale-down-animation.html
+ name: 'scale-down-animation',
+ node: this
+ }
+ }
+ }
+ },
+ listeners: {
+ // this event is fired when the animation finishes
+ 'neon-animation-finish': '_onNeonAnimationFinish'
+ },
+ animate: function() {
+ // run scale-down-animation
+ this.playAnimation();
+ },
+ _onNeonAnimationFinish: function() {
+ console.log('animation done!');
+ }
+});
+```
+
+[Live demo](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/doc/basic.html)
+
+<a name="configuration"></a>
+## Animation configuration
+
+<a name="configuration-types"></a>
+### Animation types
+
+An element might run different animations, for example it might do something different when it enters the view and when it exits from view. You can set the `animationConfig` property to a map from an animation type to configuration.
+
+```js
+Polymer({
+ is: 'my-dialog',
+ behaviors: [
+ Polymer.NeonAnimationRunnerBehavior
+ ],
+ properties: {
+ opened: {
+ type: Boolean
+ },
+ animationConfig: {
+ value: function() {
+ return {
+ 'entry': {
+ // provided by neon-animation/animations/scale-up-animation.html
+ name: 'scale-up-animation',
+ node: this
+ },
+ 'exit': {
+ // provided by neon-animation-animations/fade-out-animation.html
+ name: 'fade-out-animation',
+ node: this
+ }
+ }
+ }
+ }
+ },
+ listeners: {
+ 'neon-animation-finish': '_onNeonAnimationFinish'
+ },
+ show: function() {
+ this.opened = true;
+ this.style.display = 'inline-block';
+ // run scale-up-animation
+ this.playAnimation('entry');
+ },
+ hide: function() {
+ this.opened = false;
+ // run fade-out-animation
+ this.playAnimation('exit');
+ },
+ _onNeonAnimationFinish: function() {
+ if (!this.opened) {
+ this.style.display = 'none';
+ }
+ }
+});
+```
+
+[Live demo](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/doc/types.html)
+
+You can also use the convenience properties `entryAnimation` and `exitAnimation` to set `entry` and `exit` animations:
+
+```js
+properties: {
+ entryAnimation: {
+ value: 'scale-up-animation'
+ },
+ exitAnimation: {
+ value: 'fade-out-animation'
+ }
+}
+```
+
+<a name="configuration-properties"></a>
+### Configuration properties
+
+You can pass additional parameters to configure an animation in the animation configuration object.
+All animations should accept the following properties:
+
+ * `name`: The name of an animation, ie. an element implementing `Polymer.NeonAnimationBehavior`.
+ * `node`: The target node to apply the animation to. Defaults to `this`.
+ * `timing`: Timing properties to use in this animation. They match the [Web Animations Animation Effect Timing interface](https://w3c.github.io/web-animations/#the-animationeffecttiming-interface). The
+ properties include the following:
+ * `duration`: The duration of the animation in milliseconds.
+ * `delay`: The delay before the start of the animation in milliseconds.
+ * `easing`: A timing function for the animation. Matches the CSS timing function values.
+
+Animations may define additional configuration properties and they are listed in their documentation.
+
+<a name="configuration-multiple"></a>
+### Using multiple animations
+
+Set the animation configuration to an array to combine animations, like this:
+
+```js
+animationConfig: {
+ value: function() {
+ return {
+ // fade-in-animation is run with a 50ms delay from slide-down-animation
+ 'entry': [{
+ name: 'slide-down-animation',
+ node: this
+ }, {
+ name: 'fade-in-animation',
+ node: this,
+ timing: {delay: 50}
+ }]
+ }
+ }
+}
+```
+
+<a name="configuration-encapsulation"></a>
+### Running animations encapsulated in children nodes
+
+You can include animations in the configuration that are encapsulated in a child element that implement `Polymer.NeonAnimatableBehavior` with the `animatable` property.
+
+```js
+animationConfig: {
+ value: function() {
+ return {
+ // run fade-in-animation on this, and the entry animation on this.$.myAnimatable
+ 'entry': [
+ {name: 'fade-in-animation', node: this},
+ {animatable: this.$.myAnimatable, type: 'entry'}
+ ]
+ }
+ }
+}
+```
+
+<a name="page-transitions"></a>
+## Page transitions
+
+*The artist formerly known as `<core-animated-pages>`*
+
+The `neon-animated-pages` element manages a set of pages to switch between, and runs animations between the page transitions. It implements the `Polymer.IronSelectableBehavior` behavior. Each child node should implement `Polymer.NeonAnimatableBehavior` and define the `entry` and `exit` animations. During a page transition, the `entry` animation is run on the new page and the `exit` animation is run on the old page.
+
+<a name="shared-element"></a>
+### Shared element animations
+
+Shared element animations work on multiple nodes. For example, a "hero" animation is used during a page transition to make two elements from separate pages appear to animate as a single element. Shared element animation configurations have an `id` property that identify they belong in the same animation. Elements containing shared elements also have a `sharedElements` property defines a map from `id` to element, the element involved with the animation.
+
+In the incoming page:
+
+```js
+properties: {
+ animationConfig: {
+ value: function() {
+ return {
+ // the incoming page defines the 'entry' animation
+ 'entry': {
+ name: 'hero-animation',
+ id: 'hero',
+ toPage: this
+ }
+ }
+ }
+ },
+ sharedElements: {
+ value: function() {
+ return {
+ 'hero': this.$.hero
+ }
+ }
+ }
+}
+```
+
+In the outgoing page:
+
+```js
+properties: {
+ animationConfig: {
+ value: function() {
+ return {
+ // the outgoing page defines the 'exit' animation
+ 'exit': {
+ name: 'hero-animation',
+ id: 'hero',
+ fromPage: this
+ }
+ }
+ }
+ },
+ sharedElements: {
+ value: function() {
+ return {
+ 'hero': this.$.otherHero
+ }
+ }
+ }
+}
+```
+
+<a name="declarative-page"></a>
+### Declarative page transitions
+
+For convenience, if you define the `entry-animation` and `exit-animation` attributes on `<neon-animated-pages>`, those animations will apply for all page transitions.
+
+For example:
+
+```js
+<neon-animated-pages id="pages" class="flex" selected="[[selected]]" entry-animation="slide-from-right-animation" exit-animation="slide-left-animation">
+ <neon-animatable>1</neon-animatable>
+ <neon-animatable>2</neon-animatable>
+ <neon-animatable>3</neon-animatable>
+ <neon-animatable>4</neon-animatable>
+ <neon-animatable>5</neon-animatable>
+</neon-animated-pages>
+```
+
+The new page will slide in from the right, and the old page slide away to the left.
+
+<a name="animations"></a>
+## Included animations
+
+Single element animations:
+
+ * `fade-in-animation` Animates opacity from `0` to `1`;
+ * `fade-out-animation` Animates opacity from `1` to `0`;
+ * `scale-down-animation` Animates transform from `scale(1)` to `scale(0)`;
+ * `scale-up-animation` Animates transform from `scale(0)` to `scale(1)`;
+ * `slide-down-animation` Animates transform from `none` to `translateY(100%)`;
+ * `slide-up-animation` Animates transform from `none` to `translateY(-100%)`;
+ * `slide-from-top-animation` Animates transform from `translateY(-100%)` to `none`;
+ * `slide-from-bottom-animation` Animates transform from `translateY(100%)` to `none`;
+ * `slide-left-animation` Animates transform from `none` to `translateX(-100%)`;
+ * `slide-right-animation` Animates transform from `none` to `translateX(100%)`;
+ * `slide-from-left-animation` Animates transform from `translateX(-100%)` to `none`;
+ * `slide-from-right-animation` Animates transform from `translateX(100%)` to `none`;
+ * `transform-animation` Animates a custom transform.
+
+Note that there is a restriction that only one transform animation can be applied on the same element at a time. Use the custom `transform-animation` to combine transform properties.
+
+Shared element animations
+
+ * `hero-animation` Animates an element such that it looks like it scales and transforms from another element.
+ * `ripple-animation` Animates an element to full screen such that it looks like it ripples from another element.
+
+Group animations
+ * `cascaded-animation` Applys an animation to an array of elements with a delay between each.
+
+<a name="demos"></a>
+## Demos
+
+ * [Grid to full screen](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/grid/index.html)
+ * [Animation on load](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/load/index.html)
+ * [List item to detail](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/list/index.html) (For narrow width)
+ * [Dots to squares](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/tiles/index.html)
+ * [Declarative](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/declarative/index.html)
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/index.html
new file mode 100644
index 00000000000..6f5feedf455
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/index.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+
+ <title>neon-animation</title>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../polymer/polymer.html">
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animatable-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animatable-behavior.d.ts
new file mode 100644
index 00000000000..c59411a0588
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animatable-behavior.d.ts
@@ -0,0 +1,53 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * neon-animatable-behavior.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * `Polymer.NeonAnimatableBehavior` is implemented by elements containing animations for use with
+ * elements implementing `Polymer.NeonAnimationRunnerBehavior`.
+ */
+ interface NeonAnimatableBehavior {
+
+ /**
+ * Animation configuration. See README for more info.
+ */
+ animationConfig: object|null|undefined;
+
+ /**
+ * Convenience property for setting an 'entry' animation. Do not set `animationConfig.entry`
+ * manually if using this. The animated node is set to `this` if using this property.
+ */
+ entryAnimation: string|null|undefined;
+
+ /**
+ * Convenience property for setting an 'exit' animation. Do not set `animationConfig.exit`
+ * manually if using this. The animated node is set to `this` if using this property.
+ */
+ exitAnimation: string|null|undefined;
+ _entryAnimationChanged(): void;
+ _exitAnimationChanged(): void;
+ _copyProperties(config1: any, config2: any): void;
+ _cloneConfig(config: any): any;
+ _getAnimationConfigRecursive(type: any, map: any, allConfigs: any): void;
+
+ /**
+ * An element implementing `Polymer.NeonAnimationRunnerBehavior` calls this method to configure
+ * an animation with an optional type. Elements implementing `Polymer.NeonAnimatableBehavior`
+ * should define the property `animationConfig`, which is either a configuration object
+ * or a map of animation type to array of configuration objects.
+ */
+ getAnimationConfig(type: any): any;
+ }
+
+ const NeonAnimatableBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animatable-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animatable-behavior.html
new file mode 100644
index 00000000000..f07d9c3e1f3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animatable-behavior.html
@@ -0,0 +1,150 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<script>
+
+ /**
+ * `Polymer.NeonAnimatableBehavior` is implemented by elements containing animations for use with
+ * elements implementing `Polymer.NeonAnimationRunnerBehavior`.
+ * @polymerBehavior
+ */
+ Polymer.NeonAnimatableBehavior = {
+
+ properties: {
+
+ /**
+ * Animation configuration. See README for more info.
+ */
+ animationConfig: {
+ type: Object
+ },
+
+ /**
+ * Convenience property for setting an 'entry' animation. Do not set `animationConfig.entry`
+ * manually if using this. The animated node is set to `this` if using this property.
+ */
+ entryAnimation: {
+ observer: '_entryAnimationChanged',
+ type: String
+ },
+
+ /**
+ * Convenience property for setting an 'exit' animation. Do not set `animationConfig.exit`
+ * manually if using this. The animated node is set to `this` if using this property.
+ */
+ exitAnimation: {
+ observer: '_exitAnimationChanged',
+ type: String
+ }
+
+ },
+
+ _entryAnimationChanged: function() {
+ this.animationConfig = this.animationConfig || {};
+ this.animationConfig['entry'] = [{
+ name: this.entryAnimation,
+ node: this
+ }];
+ },
+
+ _exitAnimationChanged: function() {
+ this.animationConfig = this.animationConfig || {};
+ this.animationConfig['exit'] = [{
+ name: this.exitAnimation,
+ node: this
+ }];
+ },
+
+ _copyProperties: function(config1, config2) {
+ // shallowly copy properties from config2 to config1
+ for (var property in config2) {
+ config1[property] = config2[property];
+ }
+ },
+
+ _cloneConfig: function(config) {
+ var clone = {
+ isClone: true
+ };
+ this._copyProperties(clone, config);
+ return clone;
+ },
+
+ _getAnimationConfigRecursive: function(type, map, allConfigs) {
+ if (!this.animationConfig) {
+ return;
+ }
+
+ if(this.animationConfig.value && typeof this.animationConfig.value === 'function') {
+ this._warn(this._logf('playAnimation', "Please put 'animationConfig' inside of your components 'properties' object instead of outside of it."));
+ return;
+ }
+
+ // type is optional
+ var thisConfig;
+ if (type) {
+ thisConfig = this.animationConfig[type];
+ } else {
+ thisConfig = this.animationConfig;
+ }
+
+ if (!Array.isArray(thisConfig)) {
+ thisConfig = [thisConfig];
+ }
+
+ // iterate animations and recurse to process configurations from child nodes
+ if (thisConfig) {
+ for (var config, index = 0; config = thisConfig[index]; index++) {
+ if (config.animatable) {
+ config.animatable._getAnimationConfigRecursive(config.type || type, map, allConfigs);
+ } else {
+ if (config.id) {
+ var cachedConfig = map[config.id];
+ if (cachedConfig) {
+ // merge configurations with the same id, making a clone lazily
+ if (!cachedConfig.isClone) {
+ map[config.id] = this._cloneConfig(cachedConfig);
+ cachedConfig = map[config.id];
+ }
+ this._copyProperties(cachedConfig, config);
+ } else {
+ // put any configs with an id into a map
+ map[config.id] = config;
+ }
+ } else {
+ allConfigs.push(config);
+ }
+ }
+ }
+ }
+ },
+
+ /**
+ * An element implementing `Polymer.NeonAnimationRunnerBehavior` calls this method to configure
+ * an animation with an optional type. Elements implementing `Polymer.NeonAnimatableBehavior`
+ * should define the property `animationConfig`, which is either a configuration object
+ * or a map of animation type to array of configuration objects.
+ */
+ getAnimationConfig: function(type) {
+ var map = {};
+ var allConfigs = [];
+ this._getAnimationConfigRecursive(type, map, allConfigs);
+ // append the configurations saved in the map to the array
+ for (var key in map) {
+ allConfigs.push(map[key]);
+ }
+ return allConfigs;
+ }
+
+ };
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animatable.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animatable.d.ts
new file mode 100644
index 00000000000..2cc07034719
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animatable.d.ts
@@ -0,0 +1,32 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * neon-animatable.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-resizable-behavior/iron-resizable-behavior.d.ts" />
+/// <reference path="neon-animatable-behavior.d.ts" />
+
+/**
+ * `<neon-animatable>` is a simple container element implementing `Polymer.NeonAnimatableBehavior`. This is a convenience element for use with `<neon-animated-pages>`.
+ *
+ * ```
+ * <neon-animated-pages selected="0"
+ * entry-animation="slide-from-right-animation"
+ * exit-animation="slide-left-animation">
+ * <neon-animatable>1</neon-animatable>
+ * <neon-animatable>2</neon-animatable>
+ * </neon-animated-pages>
+ * ```
+ */
+interface NeonAnimatableElement extends Polymer.Element, Polymer.NeonAnimatableBehavior, Polymer.IronResizableBehavior {
+}
+
+interface HTMLElementTagNameMap {
+ "neon-animatable": NeonAnimatableElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animatable.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animatable.html
new file mode 100644
index 00000000000..26566fc9325
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animatable.html
@@ -0,0 +1,54 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html">
+<link rel="import" href="neon-animatable-behavior.html">
+
+<!--
+`<neon-animatable>` is a simple container element implementing `Polymer.NeonAnimatableBehavior`. This is a convenience element for use with `<neon-animated-pages>`.
+
+```
+<neon-animated-pages selected="0"
+ entry-animation="slide-from-right-animation"
+ exit-animation="slide-left-animation">
+ <neon-animatable>1</neon-animatable>
+ <neon-animatable>2</neon-animatable>
+</neon-animated-pages>
+```
+-->
+
+<dom-module id="neon-animatable">
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+ </style>
+
+ <slot></slot>
+ </template>
+
+</dom-module>
+
+<script>
+
+ Polymer({
+
+ is: 'neon-animatable',
+
+ behaviors: [
+ Polymer.NeonAnimatableBehavior,
+ Polymer.IronResizableBehavior
+ ]
+
+ });
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animated-pages.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animated-pages.d.ts
new file mode 100644
index 00000000000..e164ee90306
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animated-pages.d.ts
@@ -0,0 +1,38 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * neon-animated-pages.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-resizable-behavior/iron-resizable-behavior.d.ts" />
+/// <reference path="../iron-selector/iron-selectable.d.ts" />
+/// <reference path="neon-animation-runner-behavior.d.ts" />
+
+/**
+ * Material design: [Meaningful transitions](https://www.google.com/design/spec/animation/meaningful-transitions.html)
+ *
+ * `neon-animated-pages` manages a set of pages and runs an animation when switching between them. Its
+ * children pages should implement `Polymer.NeonAnimatableBehavior` and define `entry` and `exit`
+ * animations to be run when switching to or switching out of the page.
+ */
+interface NeonAnimatedPagesElement extends Polymer.Element, Polymer.IronResizableBehavior, Polymer.IronSelectableBehavior, Polymer.NeonAnimationRunnerBehavior {
+ activateEvent: string|null|undefined;
+
+ /**
+ * if true, the initial page selection will also be animated according to its animation config.
+ */
+ animateInitialSelection: boolean|null|undefined;
+ _onIronSelect(event: any): void;
+ _completeSelectedChanged(oldPage?: object|null, selectedPage?: object|null): void;
+ _onNeonAnimationFinish(event: any): void;
+ _notifyPageResize(): void;
+}
+
+interface HTMLElementTagNameMap {
+ "neon-animated-pages": NeonAnimatedPagesElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animated-pages.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animated-pages.html
new file mode 100644
index 00000000000..ddb4d707456
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animated-pages.html
@@ -0,0 +1,219 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html">
+<link rel="import" href="../iron-selector/iron-selectable.html">
+<link rel="import" href="neon-animation-runner-behavior.html">
+
+<!--
+Material design: [Meaningful transitions](https://www.google.com/design/spec/animation/meaningful-transitions.html)
+
+`neon-animated-pages` manages a set of pages and runs an animation when switching between them. Its
+children pages should implement `Polymer.NeonAnimatableBehavior` and define `entry` and `exit`
+animations to be run when switching to or switching out of the page.
+
+@group Neon Elements
+@element neon-animated-pages
+-->
+
+<dom-module id="neon-animated-pages">
+ <template>
+ <style>
+ :host {
+ display: block;
+ position: relative;
+ }
+
+ :host > ::slotted(*) {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ }
+
+ :host > ::slotted(:not(.iron-selected):not(.neon-animating))
+ {
+ display: none !important;
+ }
+
+ :host > ::slotted(.neon-animating) {
+ pointer-events: none;
+ }
+ </style>
+
+ <slot id="content"></slot>
+ </template>
+
+</dom-module>
+
+<script>
+(function() {
+
+ Polymer({
+
+ is: 'neon-animated-pages',
+
+ behaviors: [
+ Polymer.IronResizableBehavior,
+ Polymer.IronSelectableBehavior,
+ Polymer.NeonAnimationRunnerBehavior
+ ],
+
+ properties: {
+
+ activateEvent: {
+ type: String,
+ value: ''
+ },
+
+ // if true, the initial page selection will also be animated according to its animation config.
+ animateInitialSelection: {
+ type: Boolean,
+ value: false
+ }
+
+ },
+
+ listeners: {
+ 'iron-select': '_onIronSelect',
+ 'neon-animation-finish': '_onNeonAnimationFinish'
+ },
+
+ _onIronSelect: function(event) {
+ var selectedPage = event.detail.item;
+
+ // Only consider child elements.
+ if (this.items.indexOf(selectedPage) < 0) {
+ return;
+ }
+
+ var oldPage = this._valueToItem(this._prevSelected) || false;
+ this._prevSelected = this.selected;
+
+ // on initial load and if animateInitialSelection is negated, simply display selectedPage.
+ if (!oldPage && !this.animateInitialSelection) {
+ this._completeSelectedChanged();
+ return;
+ }
+
+ this.animationConfig = [];
+
+ // configure selectedPage animations.
+ if (this.entryAnimation) {
+ this.animationConfig.push({
+ name: this.entryAnimation,
+ node: selectedPage
+ });
+ } else {
+ if (selectedPage.getAnimationConfig) {
+ this.animationConfig.push({
+ animatable: selectedPage,
+ type: 'entry'
+ });
+ }
+ }
+
+ // configure oldPage animations iff exists.
+ if (oldPage) {
+
+ // cancel the currently running animation if one is ongoing.
+ if (oldPage.classList.contains('neon-animating')) {
+ this._squelchNextFinishEvent = true;
+ this.cancelAnimation();
+ this._completeSelectedChanged();
+ this._squelchNextFinishEvent = false;
+ }
+
+ // configure the animation.
+ if (this.exitAnimation) {
+ this.animationConfig.push({
+ name: this.exitAnimation,
+ node: oldPage
+ });
+ } else {
+ if (oldPage.getAnimationConfig) {
+ this.animationConfig.push({
+ animatable: oldPage,
+ type: 'exit'
+ });
+ }
+ }
+
+ // display the oldPage during the transition.
+ oldPage.classList.add('neon-animating');
+ }
+
+ // display the selectedPage during the transition.
+ selectedPage.classList.add('neon-animating');
+
+ // actually run the animations.
+ if (this.animationConfig.length >= 1) {
+
+ // on first load, ensure we run animations only after element is attached.
+ if (!this.isAttached) {
+ this.async(function () {
+ this.playAnimation(undefined, {
+ fromPage: null,
+ toPage: selectedPage
+ });
+ });
+
+ } else {
+ this.playAnimation(undefined, {
+ fromPage: oldPage,
+ toPage: selectedPage
+ });
+ }
+
+ } else {
+ this._completeSelectedChanged(oldPage, selectedPage);
+ }
+ },
+
+ /**
+ * @param {Object=} oldPage
+ * @param {Object=} selectedPage
+ */
+ _completeSelectedChanged: function(oldPage, selectedPage) {
+ if (selectedPage) {
+ selectedPage.classList.remove('neon-animating');
+ }
+ if (oldPage) {
+ oldPage.classList.remove('neon-animating');
+ }
+ if (!selectedPage || !oldPage) {
+ var nodes = Polymer.dom(this.$.content).getDistributedNodes();
+ for (var node, index = 0; node = nodes[index]; index++) {
+ node.classList && node.classList.remove('neon-animating');
+ }
+ }
+ this.async(this._notifyPageResize);
+ },
+
+ _onNeonAnimationFinish: function(event) {
+ if (this._squelchNextFinishEvent) {
+ this._squelchNextFinishEvent = false;
+ return;
+ }
+ this._completeSelectedChanged(event.detail.fromPage, event.detail.toPage);
+ },
+
+ _notifyPageResize: function() {
+ var selectedPage = this.selectedItem || this._valueToItem(this.selected);
+ this.resizerShouldNotify = function(element) {
+ return element == selectedPage;
+ };
+ this.notifyResize();
+ }
+ })
+
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation-behavior.d.ts
new file mode 100644
index 00000000000..153f3145842
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation-behavior.d.ts
@@ -0,0 +1,50 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * neon-animation-behavior.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Use `Polymer.NeonAnimationBehavior` to implement an animation.
+ */
+ interface NeonAnimationBehavior {
+
+ /**
+ * Defines the animation timing.
+ */
+ animationTiming: object|null|undefined;
+
+ /**
+ * Can be used to determine that elements implement this behavior.
+ *
+ */
+ isNeonAnimation: boolean;
+ created(): void;
+
+ /**
+ * Returns the animation timing by mixing in properties from `config` to the defaults defined
+ * by the animation.
+ */
+ timingFromConfig(config: any): any;
+
+ /**
+ * Sets `transform` and `transformOrigin` properties along with the prefixed versions.
+ */
+ setPrefixedProperty(node: any, property: any, value: any): void;
+
+ /**
+ * Called when the animation finishes.
+ */
+ complete(config: any): void;
+ }
+
+ const NeonAnimationBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation-behavior.html
new file mode 100644
index 00000000000..e51727e5d5b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation-behavior.html
@@ -0,0 +1,92 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<script>
+
+ /**
+ * Use `Polymer.NeonAnimationBehavior` to implement an animation.
+ * @polymerBehavior
+ */
+ Polymer.NeonAnimationBehavior = {
+
+ properties: {
+
+ /**
+ * Defines the animation timing.
+ */
+ animationTiming: {
+ type: Object,
+ value: function() {
+ return {
+ duration: 500,
+ easing: 'cubic-bezier(0.4, 0, 0.2, 1)',
+ fill: 'both'
+ }
+ }
+ }
+
+ },
+
+ /**
+ * Can be used to determine that elements implement this behavior.
+ */
+ isNeonAnimation: true,
+
+ /**
+ * Do any animation configuration here.
+ */
+ // configure: function(config) {
+ // },
+
+ created: function() {
+ if (!document.body.animate) {
+ console.warn('No web animations detected. This element will not' +
+ ' function without a web animations polyfill.');
+ }
+ },
+
+ /**
+ * Returns the animation timing by mixing in properties from `config` to the defaults defined
+ * by the animation.
+ */
+ timingFromConfig: function(config) {
+ if (config.timing) {
+ for (var property in config.timing) {
+ this.animationTiming[property] = config.timing[property];
+ }
+ }
+ return this.animationTiming;
+ },
+
+ /**
+ * Sets `transform` and `transformOrigin` properties along with the prefixed versions.
+ */
+ setPrefixedProperty: function(node, property, value) {
+ var map = {
+ 'transform': ['webkitTransform'],
+ 'transformOrigin': ['mozTransformOrigin', 'webkitTransformOrigin']
+ };
+ var prefixes = map[property];
+ for (var prefix, index = 0; prefix = prefixes[index]; index++) {
+ node.style[prefix] = value;
+ }
+ node.style[property] = value;
+ },
+
+ /**
+ * Called when the animation finishes.
+ */
+ complete: function(config) {}
+
+ };
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation-runner-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation-runner-behavior.d.ts
new file mode 100644
index 00000000000..162b649c780
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation-runner-behavior.d.ts
@@ -0,0 +1,36 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * neon-animation-runner-behavior.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="neon-animatable-behavior.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * `Polymer.NeonAnimationRunnerBehavior` adds a method to run animations.
+ */
+ interface NeonAnimationRunnerBehavior extends Polymer.NeonAnimatableBehavior {
+ _configureAnimations(configs: any): any;
+ _shouldComplete(activeEntries: any): any;
+ _complete(activeEntries: any): void;
+
+ /**
+ * Plays an animation with an optional `type`.
+ */
+ playAnimation(type?: string, cookie?: object): void;
+
+ /**
+ * Cancels the currently running animations.
+ */
+ cancelAnimation(): void;
+ }
+
+ const NeonAnimationRunnerBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation-runner-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation-runner-behavior.html
new file mode 100644
index 00000000000..425f8b13ad4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation-runner-behavior.html
@@ -0,0 +1,155 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="neon-animatable-behavior.html">
+
+<script>
+
+ /**
+ * `Polymer.NeonAnimationRunnerBehavior` adds a method to run animations.
+ *
+ * @polymerBehavior Polymer.NeonAnimationRunnerBehavior
+ */
+ Polymer.NeonAnimationRunnerBehaviorImpl = {
+
+ _configureAnimations: function(configs) {
+ var results = [];
+ var resultsToPlay = [];
+
+ if (configs.length > 0) {
+ for (var config, index = 0; config = configs[index]; index++) {
+ var neonAnimation = document.createElement(config.name);
+ // is this element actually a neon animation?
+ if (neonAnimation.isNeonAnimation) {
+ var result = null;
+ // Closure compiler does not work well with a try / catch here. .configure needs to be
+ // explicitly defined
+ if (!neonAnimation.configure) {
+ /**
+ * @param {Object} config
+ * @return {AnimationEffectReadOnly}
+ */
+ neonAnimation.configure = function(config) {
+ return null;
+ }
+ }
+
+ result = neonAnimation.configure(config);
+ resultsToPlay.push({ result: result, config: config });
+ } else {
+ console.warn(this.is + ':', config.name, 'not found!');
+ }
+ }
+ }
+
+ for (var i = 0; i < resultsToPlay.length; i++) {
+ var result = resultsToPlay[i].result;
+ var config = resultsToPlay[i].config;
+ // configuration or play could fail if polyfills aren't loaded
+ try {
+ // Check if we have an Effect rather than an Animation
+ if (typeof result.cancel != 'function') {
+ result = document.timeline.play(result);
+ }
+ } catch (e) {
+ result = null;
+ console.warn('Couldnt play', '(', config.name, ').', e);
+ }
+
+ if (result) {
+ results.push({
+ neonAnimation: neonAnimation,
+ config: config,
+ animation: result,
+ });
+ }
+ }
+
+ return results;
+ },
+
+ _shouldComplete: function(activeEntries) {
+ var finished = true;
+ for (var i = 0; i < activeEntries.length; i++) {
+ if (activeEntries[i].animation.playState != 'finished') {
+ finished = false;
+ break;
+ }
+ }
+ return finished;
+ },
+
+ _complete: function(activeEntries) {
+ for (var i = 0; i < activeEntries.length; i++) {
+ activeEntries[i].neonAnimation.complete(activeEntries[i].config);
+ }
+ for (var i = 0; i < activeEntries.length; i++) {
+ activeEntries[i].animation.cancel();
+ }
+ },
+
+ /**
+ * Plays an animation with an optional `type`.
+ * @param {string=} type
+ * @param {!Object=} cookie
+ */
+ playAnimation: function(type, cookie) {
+ var configs = this.getAnimationConfig(type);
+ if (!configs) {
+ return;
+ }
+ this._active = this._active || {};
+ if (this._active[type]) {
+ this._complete(this._active[type]);
+ delete this._active[type];
+ }
+
+ var activeEntries = this._configureAnimations(configs);
+
+ if (activeEntries.length == 0) {
+ this.fire('neon-animation-finish', cookie, {bubbles: false});
+ return;
+ }
+
+ this._active[type] = activeEntries;
+
+ for (var i = 0; i < activeEntries.length; i++) {
+ activeEntries[i].animation.onfinish = function() {
+ if (this._shouldComplete(activeEntries)) {
+ this._complete(activeEntries);
+ delete this._active[type];
+ this.fire('neon-animation-finish', cookie, {bubbles: false});
+ }
+ }.bind(this);
+ }
+ },
+
+ /**
+ * Cancels the currently running animations.
+ */
+ cancelAnimation: function() {
+ for (var k in this._active) {
+ var entries = this._active[k]
+
+ for (var j in entries) {
+ entries[j].animation.cancel();
+ }
+ }
+
+ this._active = {};
+ }
+ };
+
+ /** @polymerBehavior Polymer.NeonAnimationRunnerBehavior */
+ Polymer.NeonAnimationRunnerBehavior = [
+ Polymer.NeonAnimatableBehavior,
+ Polymer.NeonAnimationRunnerBehaviorImpl
+ ];
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation.d.ts
new file mode 100644
index 00000000000..7b02b1dac01
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation.d.ts
@@ -0,0 +1,19 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * neon-animation.html
+ */
+
+/// <reference path="neon-animatable-behavior.d.ts" />
+/// <reference path="neon-animated-pages.d.ts" />
+/// <reference path="neon-animatable.d.ts" />
+/// <reference path="neon-animation-behavior.d.ts" />
+/// <reference path="neon-animation-runner-behavior.d.ts" />
+/// <reference path="neon-animations.d.ts" />
+/// <reference path="neon-shared-element-animatable-behavior.d.ts" />
+/// <reference path="neon-shared-element-animation-behavior.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation.html
new file mode 100644
index 00000000000..da645048597
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animation.html
@@ -0,0 +1,18 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="neon-animatable-behavior.html">
+<link rel="import" href="neon-animated-pages.html">
+<link rel="import" href="neon-animatable.html">
+<link rel="import" href="neon-animation-behavior.html">
+<link rel="import" href="neon-animation-runner-behavior.html">
+<link rel="import" href="neon-animations.html">
+<link rel="import" href="neon-shared-element-animatable-behavior.html">
+<link rel="import" href="neon-shared-element-animation-behavior.html">
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animations.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animations.d.ts
new file mode 100644
index 00000000000..0bc3ec3c56f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animations.d.ts
@@ -0,0 +1,30 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * neon-animations.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="animations/cascaded-animation.d.ts" />
+/// <reference path="animations/fade-in-animation.d.ts" />
+/// <reference path="animations/fade-out-animation.d.ts" />
+/// <reference path="animations/hero-animation.d.ts" />
+/// <reference path="animations/opaque-animation.d.ts" />
+/// <reference path="animations/ripple-animation.d.ts" />
+/// <reference path="animations/reverse-ripple-animation.d.ts" />
+/// <reference path="animations/scale-down-animation.d.ts" />
+/// <reference path="animations/scale-up-animation.d.ts" />
+/// <reference path="animations/slide-from-left-animation.d.ts" />
+/// <reference path="animations/slide-from-right-animation.d.ts" />
+/// <reference path="animations/slide-from-top-animation.d.ts" />
+/// <reference path="animations/slide-from-bottom-animation.d.ts" />
+/// <reference path="animations/slide-left-animation.d.ts" />
+/// <reference path="animations/slide-right-animation.d.ts" />
+/// <reference path="animations/slide-up-animation.d.ts" />
+/// <reference path="animations/slide-down-animation.d.ts" />
+/// <reference path="animations/transform-animation.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animations.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animations.html
new file mode 100644
index 00000000000..67c4df4c76a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-animations.html
@@ -0,0 +1,29 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="animations/cascaded-animation.html">
+<link rel="import" href="animations/fade-in-animation.html">
+<link rel="import" href="animations/fade-out-animation.html">
+<link rel="import" href="animations/hero-animation.html">
+<link rel="import" href="animations/opaque-animation.html">
+<link rel="import" href="animations/ripple-animation.html">
+<link rel="import" href="animations/reverse-ripple-animation.html">
+<link rel="import" href="animations/scale-down-animation.html">
+<link rel="import" href="animations/scale-up-animation.html">
+<link rel="import" href="animations/slide-from-left-animation.html">
+<link rel="import" href="animations/slide-from-right-animation.html">
+<link rel="import" href="animations/slide-from-top-animation.html">
+<link rel="import" href="animations/slide-from-bottom-animation.html">
+<link rel="import" href="animations/slide-left-animation.html">
+<link rel="import" href="animations/slide-right-animation.html">
+<link rel="import" href="animations/slide-up-animation.html">
+<link rel="import" href="animations/slide-down-animation.html">
+<link rel="import" href="animations/transform-animation.html">
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-shared-element-animatable-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-shared-element-animatable-behavior.d.ts
new file mode 100644
index 00000000000..5f9ca6ed391
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-shared-element-animatable-behavior.d.ts
@@ -0,0 +1,29 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * neon-shared-element-animatable-behavior.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="neon-animatable-behavior.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Use `Polymer.NeonSharedElementAnimatableBehavior` to implement elements containing shared element
+ * animations.
+ */
+ interface NeonSharedElementAnimatableBehavior extends Polymer.NeonAnimatableBehavior {
+
+ /**
+ * A map of shared element id to node.
+ */
+ sharedElements: object|null|undefined;
+ }
+
+ const NeonSharedElementAnimatableBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-shared-element-animatable-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-shared-element-animatable-behavior.html
new file mode 100644
index 00000000000..e63173d368d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-shared-element-animatable-behavior.html
@@ -0,0 +1,43 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="neon-animatable-behavior.html">
+
+<script>
+
+ /**
+ * Use `Polymer.NeonSharedElementAnimatableBehavior` to implement elements containing shared element
+ * animations.
+ * @polymerBehavior Polymer.NeonSharedElementAnimatableBehavior
+ */
+ Polymer.NeonSharedElementAnimatableBehaviorImpl = {
+
+ properties: {
+
+ /**
+ * A map of shared element id to node.
+ */
+ sharedElements: {
+ type: Object,
+ value: {}
+ }
+
+ }
+
+ };
+
+ /** @polymerBehavior Polymer.NeonSharedElementAnimatableBehavior */
+ Polymer.NeonSharedElementAnimatableBehavior = [
+ Polymer.NeonAnimatableBehavior,
+ Polymer.NeonSharedElementAnimatableBehaviorImpl
+ ];
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-shared-element-animation-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-shared-element-animation-behavior.d.ts
new file mode 100644
index 00000000000..607ab8e280b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-shared-element-animation-behavior.d.ts
@@ -0,0 +1,33 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * neon-shared-element-animation-behavior.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="neon-animation-behavior.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Use `Polymer.NeonSharedElementAnimationBehavior` to implement shared element animations.
+ */
+ interface NeonSharedElementAnimationBehavior extends Polymer.NeonAnimationBehavior {
+
+ /**
+ * Cached copy of shared elements.
+ */
+ sharedElements: object|null|undefined;
+
+ /**
+ * Finds shared elements based on `config`.
+ */
+ findSharedElements(config: any): any;
+ }
+
+ const NeonSharedElementAnimationBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-shared-element-animation-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-shared-element-animation-behavior.html
new file mode 100644
index 00000000000..d8f2bdd7193
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/neon-shared-element-animation-behavior.html
@@ -0,0 +1,72 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="neon-animation-behavior.html">
+
+<script>
+
+ /**
+ * Use `Polymer.NeonSharedElementAnimationBehavior` to implement shared element animations.
+ * @polymerBehavior Polymer.NeonSharedElementAnimationBehavior
+ */
+ Polymer.NeonSharedElementAnimationBehaviorImpl = {
+
+ properties: {
+
+ /**
+ * Cached copy of shared elements.
+ */
+ sharedElements: {
+ type: Object
+ }
+
+ },
+
+ /**
+ * Finds shared elements based on `config`.
+ */
+ findSharedElements: function(config) {
+ var fromPage = config.fromPage;
+ var toPage = config.toPage;
+ if (!fromPage || !toPage) {
+ console.warn(this.is + ':', !fromPage ? 'fromPage' : 'toPage', 'is undefined!');
+ return null;
+ };
+
+ if (!fromPage.sharedElements || !toPage.sharedElements) {
+ console.warn(this.is + ':', 'sharedElements are undefined for', !fromPage.sharedElements ? fromPage : toPage);
+ return null;
+ };
+
+ var from = fromPage.sharedElements[config.id];
+ var to = toPage.sharedElements[config.id];
+
+ if (!from || !to) {
+ console.warn(this.is + ':', 'sharedElement with id', config.id, 'not found in', !from ? fromPage : toPage);
+ return null;
+ }
+
+ this.sharedElements = {
+ from: from,
+ to: to
+ };
+ return this.sharedElements;
+ }
+
+ };
+
+ /** @polymerBehavior Polymer.NeonSharedElementAnimationBehavior */
+ Polymer.NeonSharedElementAnimationBehavior = [
+ Polymer.NeonAnimationBehavior,
+ Polymer.NeonSharedElementAnimationBehaviorImpl
+ ];
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/package-lock.json
new file mode 100644
index 00000000000..77dd6c5ef50
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/package-lock.json
@@ -0,0 +1,974 @@
+{
+ "name": "@polymer/neon-animation",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.0.tgz",
+ "integrity": "sha512-a5DFXI3TdZSVOMH4608LVaBLmcr+mwM2+B8OSBiB9WFNCtdqzUXwtB5We6vBzrThXlO4uRo7d2pEqjNXMAlEkA==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.0",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "4.1.0",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.0",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.12"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz",
+ "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.6.tgz",
+ "integrity": "sha512-CTUtLb6WqCCgp6P59QintjHWqzf4VL1uPA27bipLAPxFqrtK1gEYllePzTICGqQ8rYsCbpnsNypXjjDzGAAjEQ==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.8.tgz",
+ "integrity": "sha512-QqR0j08RCS1AQYPMRPHikEpcmK+2aEEbcSzWLwOqyJ4FhLmHUx/WjRrnn7tTQg/y4IKnMhzskh/o7qvGIZZ7iA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.0.0.tgz",
+ "integrity": "sha512-v+0wW9Wezwsyb0uF4aBVCjmSqit3Ru7PZFziGF0o2KwTvN2zWfTi3BRLq9EkJFdg3eBbyERXGTntVpBxH1J68Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.2",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
+ "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "4.0.0",
+ "array-back": "2.0.0",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz",
+ "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.5.7"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.8",
+ "winston": "2.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-QQL70IC85hI6q9uQeresEMcT1Qf8YR/zDe1qG8WWeeFAZk8z0lmzUpsfcAWz+bM4wpDdXrtd4HitIs4p0CHl/w==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.101",
+ "@types/parse5": "2.2.34",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "polymer-project-config": "3.8.1",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.1"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.8.1.tgz",
+ "integrity": "sha512-MLvnM9gexFWg7nynY24eHZG6NLXocmk718sVds/sx2CAJ6iihhC0JMhhOIa6jnad9KQrHyGl/cs3mMRaaub5Fg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.101",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.1.tgz",
+ "integrity": "sha1-Eahr7+rDxKo+wIYjZRo8gabQu8g=",
+ "dev": true
+ },
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/package.json
new file mode 100644
index 00000000000..2dd963b3e8d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@polymer/neon-animation",
+ "private": true,
+ "description": "A system for animating Polymer-based web components",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/neon-animation"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir ."
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/web-animations.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/web-animations.d.ts
new file mode 100644
index 00000000000..c2f6397e0fc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/web-animations.d.ts
@@ -0,0 +1,10 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * web-animations.html
+ */
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/web-animations.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/web-animations.html
new file mode 100644
index 00000000000..c871854017a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/neon-animation/web-animations.html
@@ -0,0 +1,11 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<script src="../web-animations-js/web-animations-next-lite.min.js"></script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/.bower.json
new file mode 100644
index 00000000000..a2f8ef18264
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/.bower.json
@@ -0,0 +1,75 @@
+{
+ "name": "paper-behaviors",
+ "version": "2.1.1",
+ "description": "Common behaviors across the paper elements",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "main": [
+ "paper-button-behavior.html",
+ "paper-checked-element-behavior.html",
+ "paper-inky-focus-behavior.html"
+ ],
+ "keywords": [
+ "web-components",
+ "web-component",
+ "polymer",
+ "paper",
+ "behavior"
+ ],
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-behaviors"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-behaviors",
+ "dependencies": {
+ "iron-behaviors": "PolymerElements/iron-behaviors#1 - 2",
+ "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#1 - 2",
+ "paper-ripple": "PolymerElements/paper-ripple#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "polymerelements/iron-component-page#1 - 2",
+ "iron-test-helpers": "polymerelements/iron-test-helpers#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "ignore": [],
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
+ "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#^1.0.0",
+ "paper-ripple": "PolymerElements/paper-ripple#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
+ "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.1.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.1",
+ "commit": "b955fec09e39c888b9afb932e6ee4bc4a1260f40"
+ },
+ "_source": "https://github.com/PolymerElements/paper-behaviors.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/paper-behaviors"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/.github/CODEOWNERS
new file mode 100644
index 00000000000..c5097c0c903
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @valdrinkoshi
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..0a145b76bb4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/paper-behaviors/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/.travis.yml
new file mode 100644
index 00000000000..9b65e9c7000
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/.travis.yml
@@ -0,0 +1,35 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g bower polymer-cli@next
+ - polymer install --variants
+ - sudo mv /usr/bin/google-chrome /usr/bin/google-chrome-old
+ - sudo mv /usr/bin/google-chrome-beta /usr/bin/google-chrome
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e '\n\033[31mERROR:\033[0m
+ Project is not formatted. Please run "npm run format".' && false)
+env:
+ global:
+ - secure: >-
+ TYkyKHfqK31bPGX+x388nfvBWtoGhD7lwYYLdunZi2pwvR2N3ngzblklwK/ADgYVDC0y+lZaJsrODvQW2cUxVdQP8p+DifXoOig5b8S2H7HFFFf83gaXv0SJ50rIaKLQmXfBdI0ICFzeQOeJ9TlKvtF3/yn/LDpYftuzgbXIyp4=
+ - secure: >-
+ eUlJabqBW3P+MRieHvRcr446jhpV2YYRfZasOh3zh2vkAVsi5R5mPJXVBwk6xP4tdNPbRo0M3boKnMHjoK8AgFolxQwXpVaoOt/oiFUsBFIUNcwKnSdfnadQa6ON5VoDmPd9UhDwES/gq7i906XkV/1jwRKKhPkx1DCyCBfuTvM=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-beta
+ sauce_connect: true
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/README.md
new file mode 100644
index 00000000000..43475db78c6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/README.md
@@ -0,0 +1,44 @@
+
+<!---
+
+This README is automatically generated from the comments in these files:
+paper-button-behavior.html paper-checked-element-behavior.html paper-inky-focus-behavior.html paper-ripple-behavior.html
+
+Edit those files, and our readme bot will duplicate them over here!
+Edit this file, and the bot will squash your changes :)
+
+The bot does some handling of markdown. Please file a bug if it does the wrong
+thing! https://github.com/PolymerLabs/tedium/issues
+
+-->
+
+[![Build status](https://travis-ci.org/PolymerElements/paper-behaviors.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-behaviors)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/paper-behaviors)_
+
+
+<!-- No docs for Polymer.PaperButtonBehavior found. -->
+
+##Polymer.PaperCheckedElementBehavior
+
+Use `Polymer.PaperCheckedElementBehavior` to implement a custom element
+that has a `checked` property similar to `Polymer.IronCheckedElementBehavior`
+and is compatible with having a ripple effect.
+
+
+
+##Polymer.PaperInkyFocusBehavior
+
+`Polymer.PaperInkyFocusBehavior` implements a ripple when the element has keyboard focus.
+
+
+
+##Polymer.PaperRippleBehavior
+
+`Polymer.PaperRippleBehavior` dynamically implements a ripple
+when the element has focus via pointer or keyboard.
+
+NOTE: This behavior is intended to be used in conjunction with and after
+`Polymer.IronButtonState` and `Polymer.IronControlState`.
+
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/bower.json
new file mode 100644
index 00000000000..e6437e2b9cf
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/bower.json
@@ -0,0 +1,66 @@
+{
+ "name": "paper-behaviors",
+ "version": "2.1.1",
+ "description": "Common behaviors across the paper elements",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "main": [
+ "paper-button-behavior.html",
+ "paper-checked-element-behavior.html",
+ "paper-inky-focus-behavior.html"
+ ],
+ "keywords": [
+ "web-components",
+ "web-component",
+ "polymer",
+ "paper",
+ "behavior"
+ ],
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-behaviors"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-behaviors",
+ "dependencies": {
+ "iron-behaviors": "PolymerElements/iron-behaviors#1 - 2",
+ "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#1 - 2",
+ "paper-ripple": "PolymerElements/paper-ripple#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "polymerelements/iron-component-page#1 - 2",
+ "iron-test-helpers": "polymerelements/iron-test-helpers#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "ignore": [],
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
+ "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#^1.0.0",
+ "paper-ripple": "PolymerElements/paper-ripple#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
+ "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/demo/index.html
new file mode 100644
index 00000000000..0303fefcc2e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/demo/index.html
@@ -0,0 +1,45 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <title>paper-behaviors demo</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link href="paper-button.html" rel="import">
+ <link href="paper-radio-button.html" rel="import">
+
+ <style>
+ body {
+ font-family: sans-serif;
+ padding: 24px;
+ margin: 0;
+ }
+ </style>
+ </head>
+ <body unresolved>
+ <h3>Normal</h3>
+ <paper-button tabindex="0">Hello World</paper-button>
+
+ <h3>Toggles</h3>
+ <paper-button toggles tabindex="0">Hello World</paper-button>
+
+ <h3>Disabled</h3>
+ <paper-button disabled tabindex="0">Hello World</paper-button>
+
+ <h3>Radio button with focus state</h3>
+ <paper-radio-button tabindex="0" title="Radio button with focus state"></paper-radio-button>
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/demo/paper-button.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/demo/paper-button.html
new file mode 100644
index 00000000000..f4d7fe02957
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/demo/paper-button.html
@@ -0,0 +1,63 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../paper-styles/element-styles/paper-material-styles.html">
+<link rel="import" href="../paper-button-behavior.html">
+
+<dom-module id="paper-button">
+ <template>
+ <style include="paper-material-styles">
+ :host {
+ display: inline-block;
+ position: relative;
+ background-color: #4285F4;
+ color: #fff;
+ border-radius: 3px;
+ text-transform: uppercase;
+ outline: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ -webkit-user-select: none;
+ user-select: none;
+ cursor: pointer;
+ }
+
+ .content {
+ border-radius: inherit;
+ padding: 16px;
+ }
+
+ :host([disabled]) {
+ background-color: #888;
+ pointer-events: none;
+ }
+
+ :host([active]),
+ :host([pressed]) {
+ background-color: #3367D6;
+ box-shadow: inset 0 3px 5px rgba(0,0,0,.2);
+ }
+ </style>
+
+ <!-- when using paper-material from paper-styles you must add a paper-material class -->
+ <div class="content paper-material" elevation$="[[elevation]]" animated>
+ <slot></slot>
+ </div>
+ </template>
+
+ <script>
+ Polymer({
+ is: 'paper-button',
+
+ behaviors: [Polymer.PaperButtonBehavior]
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/demo/paper-radio-button.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/demo/paper-radio-button.html
new file mode 100644
index 00000000000..68c27dcf6c4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/demo/paper-radio-button.html
@@ -0,0 +1,110 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../paper-checked-element-behavior.html">
+
+<dom-module id="paper-radio-button">
+ <template>
+ <style>
+ :host {
+ display: inline-block;
+ white-space: nowrap;
+ }
+
+ :host(:focus) {
+ outline: none
+ }
+
+ #radioContainer {
+ display: inline-block;
+ position: relative;
+ width: 16px;
+ height: 16px;
+ cursor: pointer;
+ vertical-align: middle;
+ }
+
+ #offRadio {
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ width: 12px;
+ height: 12px;
+ border-radius: 50%;
+ border: solid 2px;
+ border-color: black;
+ transition: border-color 0.28s;
+ }
+
+ #onRadio {
+ position: absolute;
+ top: 4px;
+ left: 4px;
+ width: 8px;
+ height: 8px;
+ border-radius: 50%;
+ background-color: red;
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ transition: -webkit-transform ease 0.28s;
+ transition: transform ease 0.28s;
+ }
+
+ :host([disabled]) {
+ opacity: 0.3;
+ pointer-events: none;
+ }
+
+ :host([pressed]) #offRadio,
+ :host([active]) #offRadio {
+ border-color: red;
+ }
+
+ :host([pressed]) #onRadio,
+ :host([active]) #onRadio {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+
+ #ink {
+ position: absolute;
+ top: -16px;
+ left: -16px;
+ width: 48px;
+ height: 48px;
+ }
+ </style>
+
+ <div id="radioContainer">
+ <div id="offRadio"></div>
+ <div id="onRadio"></div>
+ </div>
+ </template>
+
+ <script>
+ Polymer({
+ is: 'paper-radio-button',
+
+ behaviors: [Polymer.PaperCheckedElementBehavior],
+
+ hostAttributes: {role: 'radio'},
+
+ ready: function() {
+ this.toggles = true;
+ },
+
+ _createRipple: function() {
+ this._rippleContainer = this.$.radioContainer;
+ return Polymer.PaperInkyFocusBehaviorImpl._createRipple.call(this);
+ }
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/index.html
new file mode 100644
index 00000000000..37184eaa0db
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/index.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page src="paper-button-behavior.html"></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/package-lock.json
new file mode 100644
index 00000000000..bbedc26a0b8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/package-lock.json
@@ -0,0 +1,2388 @@
+{
+ "name": "@polymer/paper-behaviors",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.6.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.4.tgz",
+ "integrity": "sha512-Awg4BcUYiZtNKoveGOu654JVPt11V/KIC77iBz8NweyoOAZpz5rUJfPDwwD+ajfTs2HndbTCEB8IuLfX9m/mmw==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.44",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+ "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz",
+ "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.2",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.105",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.44",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.2",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/package.json
new file mode 100644
index 00000000000..f4082af8efc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@polymer/paper-behaviors",
+ "private": true,
+ "description": "Common behaviors across the paper elements",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-behaviors"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-button-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-button-behavior.d.ts
new file mode 100644
index 00000000000..d0ed25660c0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-button-behavior.d.ts
@@ -0,0 +1,47 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-button-behavior.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-behaviors/iron-button-state.d.ts" />
+/// <reference path="paper-ripple-behavior.d.ts" />
+
+declare namespace Polymer {
+
+ interface PaperButtonBehavior extends Polymer.IronButtonState, Polymer.IronControlState, Polymer.PaperRippleBehavior {
+
+ /**
+ * The z-depth of this element, from 0-5. Setting to 0 will remove the
+ * shadow, and each increasing number greater than 0 will be "deeper"
+ * than the last.
+ */
+ readonly elevation: number|null|undefined;
+ hostAttributes: object|null;
+
+ /**
+ * In addition to `IronButtonState` behavior, when space key goes down,
+ * create a ripple down effect.
+ *
+ * @param event .
+ */
+ _spaceKeyDownHandler(event: KeyboardEvent): void;
+
+ /**
+ * In addition to `IronButtonState` behavior, when space key goes up,
+ * create a ripple up effect.
+ *
+ * @param event .
+ */
+ _spaceKeyUpHandler(event: KeyboardEvent): void;
+ _calculateElevation(): void;
+ _computeKeyboardClass(receivedFocusFromKeyboard: any): void;
+ }
+
+ const PaperButtonBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-button-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-button-behavior.html
new file mode 100644
index 00000000000..63e07aece6f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-button-behavior.html
@@ -0,0 +1,89 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-behaviors/iron-button-state.html">
+<link rel="import" href="paper-ripple-behavior.html">
+
+<script>
+ /** @polymerBehavior Polymer.PaperButtonBehavior */
+ Polymer.PaperButtonBehaviorImpl = {
+ properties: {
+ /**
+ * The z-depth of this element, from 0-5. Setting to 0 will remove the
+ * shadow, and each increasing number greater than 0 will be "deeper"
+ * than the last.
+ *
+ * @attribute elevation
+ * @type number
+ * @default 1
+ */
+ elevation: {type: Number, reflectToAttribute: true, readOnly: true}
+ },
+
+ observers: [
+ '_calculateElevation(focused, disabled, active, pressed, receivedFocusFromKeyboard)',
+ '_computeKeyboardClass(receivedFocusFromKeyboard)'
+ ],
+
+ hostAttributes: {role: 'button', tabindex: '0', animated: true},
+
+ _calculateElevation: function() {
+ var e = 1;
+ if (this.disabled) {
+ e = 0;
+ } else if (this.active || this.pressed) {
+ e = 4;
+ } else if (this.receivedFocusFromKeyboard) {
+ e = 3;
+ }
+ this._setElevation(e);
+ },
+
+ _computeKeyboardClass: function(receivedFocusFromKeyboard) {
+ this.toggleClass('keyboard-focus', receivedFocusFromKeyboard);
+ },
+
+ /**
+ * In addition to `IronButtonState` behavior, when space key goes down,
+ * create a ripple down effect.
+ *
+ * @param {!KeyboardEvent} event .
+ */
+ _spaceKeyDownHandler: function(event) {
+ Polymer.IronButtonStateImpl._spaceKeyDownHandler.call(this, event);
+ // Ensure that there is at most one ripple when the space key is held down.
+ if (this.hasRipple() && this.getRipple().ripples.length < 1) {
+ this._ripple.uiDownAction();
+ }
+ },
+
+ /**
+ * In addition to `IronButtonState` behavior, when space key goes up,
+ * create a ripple up effect.
+ *
+ * @param {!KeyboardEvent} event .
+ */
+ _spaceKeyUpHandler: function(event) {
+ Polymer.IronButtonStateImpl._spaceKeyUpHandler.call(this, event);
+ if (this.hasRipple()) {
+ this._ripple.uiUpAction();
+ }
+ }
+ };
+
+ /** @polymerBehavior */
+ Polymer.PaperButtonBehavior = [
+ Polymer.IronButtonState,
+ Polymer.IronControlState,
+ Polymer.PaperRippleBehavior,
+ Polymer.PaperButtonBehaviorImpl
+ ];
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-checked-element-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-checked-element-behavior.d.ts
new file mode 100644
index 00000000000..1c28837b378
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-checked-element-behavior.d.ts
@@ -0,0 +1,36 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-checked-element-behavior.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-checked-element-behavior/iron-checked-element-behavior.d.ts" />
+/// <reference path="paper-inky-focus-behavior.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Use `Polymer.PaperCheckedElementBehavior` to implement a custom element
+ * that has a `checked` property similar to `Polymer.IronCheckedElementBehavior`
+ * and is compatible with having a ripple effect.
+ */
+ interface PaperCheckedElementBehavior extends Polymer.PaperInkyFocusBehavior, Polymer.IronCheckedElementBehavior {
+
+ /**
+ * Synchronizes the element's `active` and `checked` state.
+ */
+ _buttonStateChanged(): void;
+
+ /**
+ * Synchronizes the element's checked state with its ripple effect.
+ */
+ _checkedChanged(): void;
+ }
+
+ const PaperCheckedElementBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-checked-element-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-checked-element-behavior.html
new file mode 100644
index 00000000000..79812a66f48
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-checked-element-behavior.html
@@ -0,0 +1,57 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-checked-element-behavior/iron-checked-element-behavior.html">
+<link rel="import" href="paper-inky-focus-behavior.html">
+
+<script>
+ /**
+ * Use `Polymer.PaperCheckedElementBehavior` to implement a custom element
+ * that has a `checked` property similar to `Polymer.IronCheckedElementBehavior`
+ * and is compatible with having a ripple effect.
+ * @polymerBehavior Polymer.PaperCheckedElementBehavior
+ */
+ Polymer.PaperCheckedElementBehaviorImpl = {
+ /**
+ * Synchronizes the element's checked state with its ripple effect.
+ */
+ _checkedChanged: function() {
+ Polymer.IronCheckedElementBehaviorImpl._checkedChanged.call(this);
+ if (this.hasRipple()) {
+ if (this.checked) {
+ this._ripple.setAttribute('checked', '');
+ } else {
+ this._ripple.removeAttribute('checked');
+ }
+ }
+ },
+
+ /**
+ * Synchronizes the element's `active` and `checked` state.
+ */
+ _buttonStateChanged: function() {
+ Polymer.PaperRippleBehavior._buttonStateChanged.call(this);
+ if (this.disabled) {
+ return;
+ }
+ if (this.isAttached) {
+ this.checked = this.active;
+ }
+ }
+ };
+
+ /** @polymerBehavior Polymer.PaperCheckedElementBehavior */
+ Polymer.PaperCheckedElementBehavior = [
+ Polymer.PaperInkyFocusBehavior,
+ Polymer.IronCheckedElementBehavior,
+ Polymer.PaperCheckedElementBehaviorImpl
+ ];
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-inky-focus-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-inky-focus-behavior.d.ts
new file mode 100644
index 00000000000..b674ce86855
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-inky-focus-behavior.d.ts
@@ -0,0 +1,27 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-inky-focus-behavior.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-behaviors/iron-button-state.d.ts" />
+/// <reference path="paper-ripple-behavior.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * `Polymer.PaperInkyFocusBehavior` implements a ripple when the element has
+ * keyboard focus.
+ */
+ interface PaperInkyFocusBehavior extends Polymer.IronButtonState, Polymer.IronControlState, Polymer.PaperRippleBehavior {
+ _createRipple(): any;
+ _focusedChanged(receivedFocusFromKeyboard: any): void;
+ }
+
+ const PaperInkyFocusBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-inky-focus-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-inky-focus-behavior.html
new file mode 100644
index 00000000000..bddefd4eb64
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-inky-focus-behavior.html
@@ -0,0 +1,50 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-behaviors/iron-button-state.html">
+<link rel="import" href="paper-ripple-behavior.html">
+
+<script>
+ /**
+ * `Polymer.PaperInkyFocusBehavior` implements a ripple when the element has
+ * keyboard focus.
+ *
+ * @polymerBehavior Polymer.PaperInkyFocusBehavior
+ */
+ Polymer.PaperInkyFocusBehaviorImpl = {
+ observers: ['_focusedChanged(receivedFocusFromKeyboard)'],
+
+ _focusedChanged: function(receivedFocusFromKeyboard) {
+ if (receivedFocusFromKeyboard) {
+ this.ensureRipple();
+ }
+ if (this.hasRipple()) {
+ this._ripple.holdDown = receivedFocusFromKeyboard;
+ }
+ },
+
+ _createRipple: function() {
+ var ripple = Polymer.PaperRippleBehavior._createRipple();
+ ripple.id = 'ink';
+ ripple.setAttribute('center', '');
+ ripple.classList.add('circle');
+ return ripple;
+ }
+ };
+
+ /** @polymerBehavior Polymer.PaperInkyFocusBehavior */
+ Polymer.PaperInkyFocusBehavior = [
+ Polymer.IronButtonState,
+ Polymer.IronControlState,
+ Polymer.PaperRippleBehavior,
+ Polymer.PaperInkyFocusBehaviorImpl
+ ];
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-ripple-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-ripple-behavior.d.ts
new file mode 100644
index 00000000000..ede7a9f28e8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-ripple-behavior.d.ts
@@ -0,0 +1,78 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-ripple-behavior.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-behaviors/iron-button-state.d.ts" />
+/// <reference path="../paper-ripple/paper-ripple.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * `Polymer.PaperRippleBehavior` dynamically implements a ripple
+ * when the element has focus via pointer or keyboard.
+ *
+ * NOTE: This behavior is intended to be used in conjunction with and after
+ * `Polymer.IronButtonState` and `Polymer.IronControlState`.
+ */
+ interface PaperRippleBehavior {
+
+ /**
+ * If true, the element will not produce a ripple effect when interacted
+ * with via the pointer.
+ */
+ noink: boolean|null|undefined;
+ _rippleContainer: Element|null|undefined;
+
+ /**
+ * Ensures a `<paper-ripple>` element is available when the element is
+ * focused.
+ */
+ _buttonStateChanged(): void;
+
+ /**
+ * In addition to the functionality provided in `IronButtonState`, ensures
+ * a ripple effect is created when the element is in a `pressed` state.
+ */
+ _downHandler(event: any): void;
+
+ /**
+ * Ensures this element contains a ripple effect. For startup efficiency
+ * the ripple effect is dynamically on demand when needed.
+ *
+ * @param optTriggeringEvent (optional) event that triggered the
+ * ripple.
+ */
+ ensureRipple(optTriggeringEvent?: Event): void;
+
+ /**
+ * Returns the `<paper-ripple>` element used by this element to create
+ * ripple effects. The element's ripple is created on demand, when
+ * necessary, and calling this method will force the
+ * ripple to be created.
+ */
+ getRipple(): any;
+
+ /**
+ * Returns true if this element currently contains a ripple effect.
+ */
+ hasRipple(): boolean;
+
+ /**
+ * Create the element's ripple effect via creating a `<paper-ripple>`.
+ * Override this method to customize the ripple element.
+ *
+ * @returns Returns a `<paper-ripple>` element.
+ */
+ _createRipple(): PaperRippleElement;
+ _noinkChanged(noink: any): void;
+ }
+
+ const PaperRippleBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-ripple-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-ripple-behavior.html
new file mode 100644
index 00000000000..30ff8a7598b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-behaviors/paper-ripple-behavior.html
@@ -0,0 +1,125 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-behaviors/iron-button-state.html">
+<link rel="import" href="../paper-ripple/paper-ripple.html">
+
+<script>
+ /**
+ * `Polymer.PaperRippleBehavior` dynamically implements a ripple
+ * when the element has focus via pointer or keyboard.
+ *
+ * NOTE: This behavior is intended to be used in conjunction with and after
+ * `Polymer.IronButtonState` and `Polymer.IronControlState`.
+ *
+ * @polymerBehavior Polymer.PaperRippleBehavior
+ */
+ Polymer.PaperRippleBehavior = {
+ properties: {
+ /**
+ * If true, the element will not produce a ripple effect when interacted
+ * with via the pointer.
+ */
+ noink: {type: Boolean, observer: '_noinkChanged'},
+
+ /**
+ * @type {Element|undefined}
+ */
+ _rippleContainer: {
+ type: Object,
+ }
+ },
+
+ /**
+ * Ensures a `<paper-ripple>` element is available when the element is
+ * focused.
+ */
+ _buttonStateChanged: function() {
+ if (this.focused) {
+ this.ensureRipple();
+ }
+ },
+
+ /**
+ * In addition to the functionality provided in `IronButtonState`, ensures
+ * a ripple effect is created when the element is in a `pressed` state.
+ */
+ _downHandler: function(event) {
+ Polymer.IronButtonStateImpl._downHandler.call(this, event);
+ if (this.pressed) {
+ this.ensureRipple(event);
+ }
+ },
+
+ /**
+ * Ensures this element contains a ripple effect. For startup efficiency
+ * the ripple effect is dynamically on demand when needed.
+ * @param {!Event=} optTriggeringEvent (optional) event that triggered the
+ * ripple.
+ */
+ ensureRipple: function(optTriggeringEvent) {
+ if (!this.hasRipple()) {
+ this._ripple = this._createRipple();
+ this._ripple.noink = this.noink;
+ var rippleContainer = this._rippleContainer || this.root;
+ if (rippleContainer) {
+ Polymer.dom(rippleContainer).appendChild(this._ripple);
+ }
+ if (optTriggeringEvent) {
+ // Check if the event happened inside of the ripple container
+ // Fall back to host instead of the root because distributed text
+ // nodes are not valid event targets
+ var domContainer = Polymer.dom(this._rippleContainer || this);
+ var target = Polymer.dom(optTriggeringEvent).rootTarget;
+ if (domContainer.deepContains(/** @type {Node} */ (target))) {
+ this._ripple.uiDownAction(optTriggeringEvent);
+ }
+ }
+ }
+ },
+
+ /**
+ * Returns the `<paper-ripple>` element used by this element to create
+ * ripple effects. The element's ripple is created on demand, when
+ * necessary, and calling this method will force the
+ * ripple to be created.
+ */
+ getRipple: function() {
+ this.ensureRipple();
+ return this._ripple;
+ },
+
+ /**
+ * Returns true if this element currently contains a ripple effect.
+ * @return {boolean}
+ */
+ hasRipple: function() {
+ return Boolean(this._ripple);
+ },
+
+ /**
+ * Create the element's ripple effect via creating a `<paper-ripple>`.
+ * Override this method to customize the ripple element.
+ * @return {!PaperRippleElement} Returns a `<paper-ripple>` element.
+ */
+ _createRipple: function() {
+ var element = /** @type {!PaperRippleElement} */ (
+ document.createElement('paper-ripple'));
+ return element;
+ },
+
+ _noinkChanged: function(noink) {
+ if (this.hasRipple()) {
+ this._ripple.noink = noink;
+ }
+ }
+ };
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/.bower.json
new file mode 100644
index 00000000000..c7750a6eeaf
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/.bower.json
@@ -0,0 +1,75 @@
+{
+ "name": "paper-button",
+ "version": "2.1.1",
+ "description": "Material design button",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "web-component",
+ "polymer",
+ "paper",
+ "button"
+ ],
+ "main": "paper-button.html",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-button.git"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-button",
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "paper-behaviors": "PolymerElements/paper-behaviors#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-icon": "PolymerElements/iron-icon#1 - 2",
+ "iron-icons": "PolymerElements/iron-icons#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-icon": "PolymerElements/iron-icon#^1.0.0",
+ "iron-icons": "PolymerElements/iron-icons#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "Polymer/web-component-tester#^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.1.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.1",
+ "commit": "82673f1f33a999eb0cd6d19bfceedb048312ebe6"
+ },
+ "_source": "https://github.com/PolymerElements/paper-button.git",
+ "_target": "^2.0.0",
+ "_originalSource": "paper-button"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/.github/CODEOWNERS
new file mode 100644
index 00000000000..c5097c0c903
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @valdrinkoshi
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..48a50e98391
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/paper-button/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/.travis.yml
new file mode 100644
index 00000000000..807e8377cde
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/.travis.yml
@@ -0,0 +1,33 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e '\n\033[31mERROR:\033[0m
+ Project is not formatted. Please run "npm run format".' && false)
+env:
+ global:
+ - secure: >-
+ YhRb8f1f4y3Rjs5wnp4sCzIcEcL07HOBoJcEp6U/KVgIIk/sBxkxMVmZsoUeABrNbKcdE6Gn6OS2K1lFq4VThKppJ0yjvESa1p0FjmQ0Nf1xCYxc46n936xj87khZy3rrTGHxwcOY5vAa5mvNzXI4BYxjmSjmqRsQwsJBsJHWVw=
+ - secure: >-
+ eQjSTRxQKF5vyRa6yK2o+j5xWK480hHCKDh7RJQISEVhyzAaCzPZNmWf2pmaDj+ZoZZrahBcoRwOZAiVdHDaKQ+VLHbEECzV3OVV32/9DHi608BPCBdxVR2MDTtZVt3fGVhPQwCnFhwRTWtVVGx8y8HnTDMv/r4xW1OMSThPsbM=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+ sauce_connect: true
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/README.md
new file mode 100644
index 00000000000..fe6ffe26ee1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/README.md
@@ -0,0 +1,73 @@
+
+[![Build status](https://travis-ci.org/PolymerElements/paper-button.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-button)
+[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://beta.webcomponents.org/element/PolymerElements/paper-button)
+
+## &lt;paper-button&gt;
+
+Material design: [Buttons](https://www.google.com/design/spec/components/buttons.html)
+
+`paper-button` is a button. When the user touches the button, a ripple effect emanates
+from the point of contact. It may be flat or raised. A raised button is styled with a
+shadow.
+
+Example:
+
+<!---
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="paper-button.html">
+ <link rel="import" href="../paper-styles/color.html">
+ <style is="custom-style">
+ #container {
+ display: flex;
+ }
+ paper-button {
+ font-family: 'Roboto', 'Noto', sans-serif;
+ font-weight: normal;
+ font-size: 14px;
+ -webkit-font-smoothing: antialiased;
+ }
+ paper-button.pink {
+ color: var(--paper-pink-a200);
+ --paper-button-ink-color: var(--paper-pink-a200);
+ }
+ paper-button.pink:hover {
+ background-color: var(--paper-pink-100);
+ }
+ paper-button.indigo {
+ background-color: var(--paper-indigo-500);
+ color: white;
+ --paper-button-raised-keyboard-focus: {
+ background-color: var(--paper-pink-a200) !important;
+ color: white !important;
+ };
+ }
+ paper-button.indigo:hover {
+ background-color: var(--paper-indigo-400);
+ }
+ paper-button.green {
+ background-color: var(--paper-green-500);
+ color: white;
+ }
+ paper-button.green[active] {
+ background-color: var(--paper-red-500);
+ }
+ paper-button.disabled {
+ color: white;
+ }
+ </style>
+ <div id="container">
+ <next-code-block></next-code-block>
+ </div>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<paper-button class="pink">link</paper-button>
+<paper-button raised class="indigo">raised</paper-button>
+<paper-button toggles raised class="green">toggles</paper-button>
+<paper-button disabled class="disabled">disabled</paper-button>
+```
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/bower.json
new file mode 100644
index 00000000000..5355ae8fed8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/bower.json
@@ -0,0 +1,66 @@
+{
+ "name": "paper-button",
+ "version": "2.1.1",
+ "description": "Material design button",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "web-component",
+ "polymer",
+ "paper",
+ "button"
+ ],
+ "main": "paper-button.html",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-button.git"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-button",
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "paper-behaviors": "PolymerElements/paper-behaviors#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-icon": "PolymerElements/iron-icon#1 - 2",
+ "iron-icons": "PolymerElements/iron-icons#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-icon": "PolymerElements/iron-icon#^1.0.0",
+ "iron-icons": "PolymerElements/iron-icons#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "Polymer/web-component-tester#^4.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/demo/index.html
new file mode 100644
index 00000000000..bcd1a5c6765
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/demo/index.html
@@ -0,0 +1,140 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <title>paper-button demo</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../../iron-icons/iron-icons.html">
+ <link rel="import" href="../../paper-styles/color.html">
+ <link rel="import" href="../paper-button.html">
+
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles">
+ .vertical-section-container {
+ max-width: 500px;
+ }
+ paper-button {
+ margin-left: 10px;
+ margin-right: 10px;
+ }
+ </style>
+ </custom-style>
+</head>
+<body unresolved>
+ <div class="vertical-section-container centered">
+ <h3>Buttons can be flat, raised, toggleable, or disabled</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <paper-button>link</paper-button>
+ <paper-button raised>raised</paper-button>
+ <paper-button toggles raised>toggles</paper-button>
+ <paper-button disabled>disabled</paper-button>
+ </template>
+ </demo-snippet>
+
+ <h3>Buttons can have icons</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <paper-button><iron-icon icon="check"></iron-icon>link</paper-button>
+ <paper-button raised><iron-icon icon="file-download"></iron-icon>raised</paper-button>
+ <paper-button toggles raised><iron-icon icon="favorite"></iron-icon>toggles</paper-button>
+ <paper-button disabled><iron-icon icon="block"></iron-icon>disabled</paper-button>
+ </template>
+ </demo-snippet>
+
+ <h3>Buttons can hide the ripple effect using the <i>noink</i> attribute</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <paper-button noink>link</paper-button>
+ <paper-button raised noink>raised</paper-button>
+ <paper-button toggles raised noink>toggles</paper-button>
+ <paper-button disabled noink>disabled</paper-button>
+ </template>
+ </demo-snippet>
+
+ <h3>Buttons can be styled using custom properties</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <paper-button class="custom pink">link</paper-button>
+ <paper-button raised class="custom indigo">raised</paper-button>
+ <paper-button toggles raised class="custom green">toggles</paper-button>
+ <paper-button disabled class="custom disabled">disabled</paper-button>
+
+ <style is="custom-style">
+ paper-button.custom {
+ --paper-button-ink-color: var(--paper-pink-a200);
+ /* These could also be individually defined for each of the
+ specific css classes, but we'll just do it once as an example */
+ --paper-button-flat-keyboard-focus: {
+ background-color: var(--paper-pink-a200);
+ color: white !important;
+ };
+ --paper-button-raised-keyboard-focus: {
+ background-color: var(--paper-pink-a200) !important;
+ color: white !important;
+ };
+ }
+ paper-button.custom:hover {
+ background-color: var(--paper-indigo-100);
+ }
+ paper-button.pink {
+ color: var(--paper-pink-a200);
+
+ }
+ paper-button.indigo {
+ background-color: var(--paper-indigo-500);
+ color: white;
+ --paper-button-raised-keyboard-focus: {
+ background-color: var(--paper-pink-a200) !important;
+ color: white !important;
+ };
+ }
+ paper-button.green {
+ background-color: var(--paper-green-500);
+ color: white;
+ }
+ paper-button.green[active] {
+ background-color: var(--paper-red-500);
+ }
+ paper-button.disabled {
+ color: white;
+ }
+ </style>
+ </template>
+ </demo-snippet>
+
+ <h3>Buttons can be used as a link</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <a href="https://www.polymer-project.org/" tabindex="-1">
+ <paper-button raised>Polymer Project</paper-button>
+ </a>
+ <style>
+ a paper-button,
+ a:active paper-button,
+ a:visited paper-button {
+ color: #000;
+ }
+ </style>
+ </template>
+ </demo-snippet>
+ </div>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/index.html
new file mode 100644
index 00000000000..487bb5c38a5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/index.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/package-lock.json
new file mode 100644
index 00000000000..5f09191e8d0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/package-lock.json
@@ -0,0 +1,2388 @@
+{
+ "name": "@polymer/paper-button",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.6.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.4.tgz",
+ "integrity": "sha512-Awg4BcUYiZtNKoveGOu654JVPt11V/KIC77iBz8NweyoOAZpz5rUJfPDwwD+ajfTs2HndbTCEB8IuLfX9m/mmw==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.44",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+ "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz",
+ "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.2",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.105",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.44",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.2",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/package.json
new file mode 100644
index 00000000000..3318965b485
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@polymer/paper-button",
+ "private": true,
+ "description": "Material design button",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-button.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/paper-button.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/paper-button.d.ts
new file mode 100644
index 00000000000..a19b01bc26f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/paper-button.d.ts
@@ -0,0 +1,92 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-button.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-flex-layout/iron-flex-layout.d.ts" />
+/// <reference path="../paper-behaviors/paper-button-behavior.d.ts" />
+/// <reference path="../paper-styles/element-styles/paper-material-styles.d.ts" />
+
+/**
+ * Material design: [Buttons](https://www.google.com/design/spec/components/buttons.html)
+ *
+ * `paper-button` is a button. When the user touches the button, a ripple effect emanates
+ * from the point of contact. It may be flat or raised. A raised button is styled with a
+ * shadow.
+ *
+ * Example:
+ *
+ * <paper-button>Flat button</paper-button>
+ * <paper-button raised>Raised button</paper-button>
+ * <paper-button noink>No ripple effect</paper-button>
+ * <paper-button toggles>Toggle-able button</paper-button>
+ *
+ * A button that has `toggles` true will remain `active` after being clicked (and
+ * will have an `active` attribute set). For more information, see the `Polymer.IronButtonState`
+ * behavior.
+ *
+ * You may use custom DOM in the button body to create a variety of buttons. For example, to
+ * create a button with an icon and some text:
+ *
+ * <paper-button>
+ * <iron-icon icon="favorite"></iron-icon>
+ * custom button content
+ * </paper-button>
+ *
+ * To use `paper-button` as a link, wrap it in an anchor tag. Since `paper-button` will already
+ * receive focus, you may want to prevent the anchor tag from receiving focus as well by setting
+ * its tabindex to -1.
+ *
+ * <a href="https://www.polymer-project.org/" tabindex="-1">
+ * <paper-button raised>Polymer Project</paper-button>
+ * </a>
+ *
+ * ### Styling
+ *
+ * Style the button with CSS as you would a normal DOM element.
+ *
+ * paper-button.fancy {
+ * background: green;
+ * color: yellow;
+ * }
+ *
+ * paper-button.fancy:hover {
+ * background: lime;
+ * }
+ *
+ * paper-button[disabled],
+ * paper-button[toggles][active] {
+ * background: red;
+ * }
+ *
+ * By default, the ripple is the same color as the foreground at 25% opacity. You may
+ * customize the color using the `--paper-button-ink-color` custom property.
+ *
+ * The following custom properties and mixins are also available for styling:
+ *
+ * Custom property | Description | Default
+ * ----------------|-------------|----------
+ * `--paper-button-ink-color` | Background color of the ripple | `Based on the button's color`
+ * `--paper-button` | Mixin applied to the button | `{}`
+ * `--paper-button-disabled` | Mixin applied to the disabled button. Note that you can also use the `paper-button[disabled]` selector | `{}`
+ * `--paper-button-flat-keyboard-focus` | Mixin applied to a flat button after it's been focused using the keyboard | `{}`
+ * `--paper-button-raised-keyboard-focus` | Mixin applied to a raised button after it's been focused using the keyboard | `{}`
+ */
+interface PaperButtonElement extends Polymer.Element, Polymer.PaperButtonBehavior {
+
+ /**
+ * If true, the button should be styled with a shadow.
+ */
+ raised: boolean|null|undefined;
+ _calculateElevation(): void;
+}
+
+interface HTMLElementTagNameMap {
+ "paper-button": PaperButtonElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/paper-button.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/paper-button.html
new file mode 100644
index 00000000000..bce53c7dbd9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-button/paper-button.html
@@ -0,0 +1,205 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="../paper-behaviors/paper-button-behavior.html">
+<link rel="import" href="../paper-styles/element-styles/paper-material-styles.html">
+
+<!--
+Material design: [Buttons](https://www.google.com/design/spec/components/buttons.html)
+
+`paper-button` is a button. When the user touches the button, a ripple effect emanates
+from the point of contact. It may be flat or raised. A raised button is styled with a
+shadow.
+
+Example:
+
+ <paper-button>Flat button</paper-button>
+ <paper-button raised>Raised button</paper-button>
+ <paper-button noink>No ripple effect</paper-button>
+ <paper-button toggles>Toggle-able button</paper-button>
+
+A button that has `toggles` true will remain `active` after being clicked (and
+will have an `active` attribute set). For more information, see the `Polymer.IronButtonState`
+behavior.
+
+You may use custom DOM in the button body to create a variety of buttons. For example, to
+create a button with an icon and some text:
+
+ <paper-button>
+ <iron-icon icon="favorite"></iron-icon>
+ custom button content
+ </paper-button>
+
+To use `paper-button` as a link, wrap it in an anchor tag. Since `paper-button` will already
+receive focus, you may want to prevent the anchor tag from receiving focus as well by setting
+its tabindex to -1.
+
+ <a href="https://www.polymer-project.org/" tabindex="-1">
+ <paper-button raised>Polymer Project</paper-button>
+ </a>
+
+### Styling
+
+Style the button with CSS as you would a normal DOM element.
+
+ paper-button.fancy {
+ background: green;
+ color: yellow;
+ }
+
+ paper-button.fancy:hover {
+ background: lime;
+ }
+
+ paper-button[disabled],
+ paper-button[toggles][active] {
+ background: red;
+ }
+
+By default, the ripple is the same color as the foreground at 25% opacity. You may
+customize the color using the `--paper-button-ink-color` custom property.
+
+The following custom properties and mixins are also available for styling:
+
+Custom property | Description | Default
+----------------|-------------|----------
+`--paper-button-ink-color` | Background color of the ripple | `Based on the button's color`
+`--paper-button` | Mixin applied to the button | `{}`
+`--paper-button-disabled` | Mixin applied to the disabled button. Note that you can also use the `paper-button[disabled]` selector | `{}`
+`--paper-button-flat-keyboard-focus` | Mixin applied to a flat button after it's been focused using the keyboard | `{}`
+`--paper-button-raised-keyboard-focus` | Mixin applied to a raised button after it's been focused using the keyboard | `{}`
+
+@demo demo/index.html
+-->
+
+<dom-module id="paper-button">
+ <template strip-whitespace>
+ <style include="paper-material-styles">
+ /* Need to specify the same specificity as the styles imported from paper-material. */
+ :host {
+ @apply --layout-inline;
+ @apply --layout-center-center;
+ position: relative;
+ box-sizing: border-box;
+ min-width: 5.14em;
+ margin: 0 0.29em;
+ background: transparent;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+ -webkit-tap-highlight-color: transparent;
+ font: inherit;
+ text-transform: uppercase;
+ outline-width: 0;
+ border-radius: 3px;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ -webkit-user-select: none;
+ user-select: none;
+ cursor: pointer;
+ z-index: 0;
+ padding: 0.7em 0.57em;
+
+ @apply --paper-font-common-base;
+ @apply --paper-button;
+ }
+
+ :host([elevation="1"]) {
+ @apply --paper-material-elevation-1;
+ }
+
+ :host([elevation="2"]) {
+ @apply --paper-material-elevation-2;
+ }
+
+ :host([elevation="3"]) {
+ @apply --paper-material-elevation-3;
+ }
+
+ :host([elevation="4"]) {
+ @apply --paper-material-elevation-4;
+ }
+
+ :host([elevation="5"]) {
+ @apply --paper-material-elevation-5;
+ }
+
+ :host([hidden]) {
+ display: none !important;
+ }
+
+ :host([raised].keyboard-focus) {
+ font-weight: bold;
+ @apply --paper-button-raised-keyboard-focus;
+ }
+
+ :host(:not([raised]).keyboard-focus) {
+ font-weight: bold;
+ @apply --paper-button-flat-keyboard-focus;
+ }
+
+ :host([disabled]) {
+ background: #eaeaea;
+ color: #a8a8a8;
+ cursor: auto;
+ pointer-events: none;
+
+ @apply --paper-button-disabled;
+ }
+
+ :host([animated]) {
+ @apply --shadow-transition;
+ }
+
+ paper-ripple {
+ color: var(--paper-button-ink-color);
+ }
+ </style>
+
+ <slot></slot>
+ </template>
+
+ <script>
+ Polymer({
+ is: 'paper-button',
+
+ behaviors: [Polymer.PaperButtonBehavior],
+
+ properties: {
+ /**
+ * If true, the button should be styled with a shadow.
+ */
+ raised: {
+ type: Boolean,
+ reflectToAttribute: true,
+ value: false,
+ observer: '_calculateElevation'
+ }
+ },
+
+ _calculateElevation: function() {
+ if (!this.raised) {
+ this._setElevation(0);
+ } else {
+ Polymer.PaperButtonBehaviorImpl._calculateElevation.apply(this);
+ }
+ }
+
+ /**
+ Fired when the animation finishes.
+ This is useful if you want to wait until
+ the ripple animation finishes to perform some action.
+
+ @event transitionend
+ Event param: {{node: Object}} detail Contains the animated node.
+ */
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/.bower.json
new file mode 100644
index 00000000000..a24c0b50ca6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/.bower.json
@@ -0,0 +1,75 @@
+{
+ "name": "paper-checkbox",
+ "version": "2.0.4",
+ "description": "A material design checkbox",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "paper",
+ "checkbox",
+ "control"
+ ],
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-checkbox"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-checkbox",
+ "main": "paper-checkbox.html",
+ "ignore": [],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#1 - 2",
+ "paper-behaviors": "PolymerElements/paper-behaviors#1 - 2",
+ "paper-ripple": "PolymerElements/paper-ripple#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#1 - 2"
+ },
+ "devDependencies": {
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
+ "web-component-tester": "^6.0.0",
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#^1.0.0",
+ "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
+ "paper-ripple": "PolymerElements/paper-ripple#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.1.0",
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0"
+ },
+ "devDependencies": {
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "^4.0.0",
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.0.4",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.0.4",
+ "commit": "22cc667efc908916146bff8f4466544f82cb4cd3"
+ },
+ "_source": "https://github.com/PolymerElements/paper-checkbox.git",
+ "_target": "^2.0.0",
+ "_originalSource": "paper-checkbox"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/.eslintrc.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/.eslintrc.json
new file mode 100644
index 00000000000..cc13518ec5d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/.eslintrc.json
@@ -0,0 +1,18 @@
+{
+ "extends": "eslint:recommended",
+ "rules": {
+ "no-console": 0
+ },
+ "env": {
+ "browser": true
+ },
+ "plugins": [
+ "html"
+ ],
+ "globals": {
+ "CustomElements": false,
+ "HTMLImports": false,
+ "Polymer": false,
+ "WeakMap": false
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/.github/CODEOWNERS
new file mode 100644
index 00000000000..0d8c0ad6b48
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @bicknellr
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..3b5f5fd1edc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/paper-checkbox/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/.travis.yml
new file mode 100644
index 00000000000..bd1c674801f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/.travis.yml
@@ -0,0 +1,32 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e '\n\033[31mERROR:\033[0m
+ Project is not formatted. Please run "npm run format".' && false)
+env:
+ global:
+ - secure: >-
+ yp6I0VbSey7lRWOKQQkBU7CBvQd0hN0TZiZnbo8fzWWfOjANeDICCa/xyY2+ZM0TU5mxvehTg38mjkpRPkMm4UrsE5og49GBFqaDLk9U+Bp7fP37tDtWfT3l4VgpzSwKAdIEh8EcmUPblZxQxJlH6+HHImnPCWSKy9YvVEGirzY=
+ - secure: >-
+ XjG814z1IZBtPOsZBknOcJaqSJHjF7jWzAw1Cl9sKcmHPKSJW2a0gILdpXx2Au0KGzLzn7Z6/p6u2+rv4tbYWBq21EWgbHmn3iAF4pAZt6DgGqJpfCsNdyuKUYN8ZfLFbK3GC/js6IJDGV+zq5HxtZmwZh+eQ85bbx2xNyRKZis=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/README.md
new file mode 100644
index 00000000000..55606745259
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/README.md
@@ -0,0 +1,63 @@
+[![Build status](https://travis-ci.org/PolymerElements/paper-checkbox.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-checkbox)
+
+## &lt;paper-checkbox&gt;
+
+`paper-checkbox` is a [material design checkbox](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-checkbox).
+User can tap the checkbox to check or uncheck it. Usually you use checkboxes
+to allow user to select multiple options from a set. If you have a single
+ON/OFF option, avoid using a single checkbox and use `paper-toggle-button`
+instead.
+
+Example:
+<!---
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="paper-checkbox.html">
+ <style is="custom-style">
+ paper-checkbox {
+ font-family: 'Roboto', sans-serif;
+ margin: 24px;
+ }
+
+ paper-checkbox:first-child {
+ --primary-color: #ff5722;
+ }
+
+ paper-checkbox.styled {
+ align-self: center;
+ border: 1px solid var(--paper-green-200);
+ padding: 8px 16px;
+ --paper-checkbox-checked-color: var(--paper-green-500);
+ --paper-checkbox-checked-ink-color: var(--paper-green-500);
+ --paper-checkbox-unchecked-color: var(--paper-green-900);
+ --paper-checkbox-unchecked-ink-color: var(--paper-green-900);
+ --paper-checkbox-label-color: var(--paper-green-500);
+ --paper-checkbox-label-spacing: 0;
+ --paper-checkbox-margin: 8px 16px 8px 0;
+ --paper-checkbox-vertical-align: top;
+ }
+
+ paper-checkbox .subtitle {
+ display: block;
+ font-size: 0.8em;
+ margin-top: 2px;
+ max-width: 150px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<paper-checkbox checked>Checked</paper-checkbox>
+<paper-checkbox class="styled">
+ Checkbox
+ <span class="subtitle">
+ With a longer label
+ </span>
+</paper-checkbox>
+<paper-checkbox disabled>Disabled</paper-checkbox>
+```
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/bower.json
new file mode 100644
index 00000000000..4d46010bbe5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/bower.json
@@ -0,0 +1,66 @@
+{
+ "name": "paper-checkbox",
+ "version": "2.0.4",
+ "description": "A material design checkbox",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "paper",
+ "checkbox",
+ "control"
+ ],
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-checkbox"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-checkbox",
+ "main": "paper-checkbox.html",
+ "ignore": [],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#1 - 2",
+ "paper-behaviors": "PolymerElements/paper-behaviors#1 - 2",
+ "paper-ripple": "PolymerElements/paper-ripple#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#1 - 2"
+ },
+ "devDependencies": {
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
+ "web-component-tester": "^6.0.0",
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#^1.0.0",
+ "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
+ "paper-ripple": "PolymerElements/paper-ripple#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.1.0",
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0"
+ },
+ "devDependencies": {
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "web-component-tester": "^4.0.0",
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/demo/index.html
new file mode 100644
index 00000000000..db041787537
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/demo/index.html
@@ -0,0 +1,127 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+ <head>
+ <title>paper-checkbox demo</title>
+
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+ <meta name="mobile-web-app-capable" content="yes">
+ <meta name="apple-mobile-web-app-capable" content="yes">
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../paper-checkbox.html">
+ </head>
+ <body unresolved>
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles">
+ paper-checkbox {
+ display: block;
+ margin-right: 24px;
+ }
+
+ demo-snippet {
+ margin-bottom: 40px;
+ }
+ .vertical-section-container {
+ max-width: 550px;
+ }
+ </style>
+ </custom-style>
+
+ <div class="vertical-section-container centered">
+ <h3>Checkboxes can be checked or unchecked, or disabled entirely</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <paper-checkbox>Checkbox</paper-checkbox>
+ <paper-checkbox checked>Checkbox</paper-checkbox>
+ <paper-checkbox disabled>Disabled</paper-checkbox>
+ </template>
+ </demo-snippet>
+
+ <h3>Checkboxes can hide the ripple effect using the <i>noink</i> attribute</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <paper-checkbox noink>Checkbox</paper-checkbox>
+ </template>
+ </demo-snippet>
+
+ <h3>Checkboxes can be styled using custom properties</h3>
+ <demo-snippet class="centered-demo small-text">
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ paper-checkbox.red {
+ --paper-checkbox-size: 2em;
+ --paper-checkbox-checked-color: var(--paper-red-500);
+ --paper-checkbox-checked-ink-color: var(--paper-red-500);
+ --paper-checkbox-unchecked-color: var(--paper-red-900);
+ --paper-checkbox-unchecked-ink-color: var(--paper-red-900);
+ --paper-checkbox-label-color: var(--paper-red-700);
+ --paper-checkbox-vertical-align: top;
+ }
+
+ paper-checkbox.green {
+ align-self: center;
+ border: 1px solid var(--paper-green-200);
+ padding: 8px 16px;
+
+ --paper-checkbox-checked-color: var(--paper-green-500);
+ --paper-checkbox-checked-ink-color: var(--paper-green-500);
+ --paper-checkbox-unchecked-color: var(--paper-green-900);
+ --paper-checkbox-unchecked-ink-color: var(--paper-green-900);
+ --paper-checkbox-label-color: var(--paper-green-700);
+ --paper-checkbox-label-spacing: 0;
+ --paper-checkbox-margin: 8px 16px 8px 0;
+ --paper-checkbox-vertical-align: top;
+ }
+
+ paper-checkbox.blue {
+ --paper-checkbox-checked-color: var(--paper-blue-500);
+ --paper-checkbox-checked-ink-color: var(--paper-blue-500);
+ --paper-checkbox-unchecked-color: var(--paper-blue-900);
+ --paper-checkbox-unchecked-ink-color: var(--paper-blue-900);
+ --paper-checkbox-label-color: var(--paper-blue-700);
+ --paper-checkbox-label-checked-color: var(--paper-blue-900);
+ }
+
+ paper-checkbox .title {
+ display: block;
+ font-size: 1.2em;
+ }
+
+ paper-checkbox .subtitle {
+ display: block;
+ font-size: 0.9em;
+ max-width: 150px;
+ }
+ </style>
+ </custom-style>
+
+ <paper-checkbox class="red">
+ <span class="title">Checkbox</span>
+ <span class="subtitle">With a subtitle</span>
+ </paper-checkbox>
+ <paper-checkbox checked class="green">
+ <span class="title">Checkbox</span>
+ <span class="subtitle">
+ With a longer subtitle that wraps to another line
+ </span>
+ </paper-checkbox>
+ <paper-checkbox class="blue">
+ <span class="title">Checkbox</span>
+ </paper-checkbox>
+ </template>
+ </demo-snippet>
+ </div>
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/index.html
new file mode 100644
index 00000000000..b368797b127
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/index.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+
+ <title>paper-checkbox</title>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../polymer/polymer.html">
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+ </head>
+ <body>
+
+ <iron-component-page></iron-component-page>
+
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/package-lock.json
new file mode 100644
index 00000000000..149d6008158
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/package-lock.json
@@ -0,0 +1,2388 @@
+{
+ "name": "@polymer/paper-checkbox",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.6.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.4.tgz",
+ "integrity": "sha512-Awg4BcUYiZtNKoveGOu654JVPt11V/KIC77iBz8NweyoOAZpz5rUJfPDwwD+ajfTs2HndbTCEB8IuLfX9m/mmw==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.44",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+ "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz",
+ "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.2",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.105",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.44",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.2",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/package.json
new file mode 100644
index 00000000000..440955554be
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@polymer/paper-checkbox",
+ "private": true,
+ "description": "A material design checkbox",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-checkbox"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/paper-checkbox.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/paper-checkbox.d.ts
new file mode 100644
index 00000000000..e98aa49c442
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/paper-checkbox.d.ts
@@ -0,0 +1,74 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-checkbox.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../paper-styles/default-theme.d.ts" />
+/// <reference path="../paper-behaviors/paper-checked-element-behavior.d.ts" />
+
+/**
+ * Material design: [Checkbox](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-checkbox)
+ *
+ * `paper-checkbox` is a button that can be either checked or unchecked. User
+ * can tap the checkbox to check or uncheck it. Usually you use checkboxes
+ * to allow user to select multiple options from a set. If you have a single
+ * ON/OFF option, avoid using a single checkbox and use `paper-toggle-button`
+ * instead.
+ *
+ * Example:
+ *
+ * <paper-checkbox>label</paper-checkbox>
+ *
+ * <paper-checkbox checked> label</paper-checkbox>
+ *
+ * ### Styling
+ *
+ * The following custom properties and mixins are available for styling:
+ *
+ * Custom property | Description | Default
+ * ----------------|-------------|----------
+ * `--paper-checkbox-unchecked-background-color` | Checkbox background color when the input is not checked | `transparent`
+ * `--paper-checkbox-unchecked-color` | Checkbox border color when the input is not checked | `--primary-text-color`
+ * `--paper-checkbox-unchecked-ink-color` | Selected/focus ripple color when the input is not checked | `--primary-text-color`
+ * `--paper-checkbox-checked-color` | Checkbox color when the input is checked | `--primary-color`
+ * `--paper-checkbox-checked-ink-color` | Selected/focus ripple color when the input is checked | `--primary-color`
+ * `--paper-checkbox-checkmark-color` | Checkmark color | `white`
+ * `--paper-checkbox-label-color` | Label color | `--primary-text-color`
+ * `--paper-checkbox-label-checked-color` | Label color when the input is checked | `--paper-checkbox-label-color`
+ * `--paper-checkbox-label-spacing` | Spacing between the label and the checkbox | `8px`
+ * `--paper-checkbox-label` | Mixin applied to the label | `{}`
+ * `--paper-checkbox-label-checked` | Mixin applied to the label when the input is checked | `{}`
+ * `--paper-checkbox-error-color` | Checkbox color when invalid | `--error-color`
+ * `--paper-checkbox-size` | Size of the checkbox | `18px`
+ * `--paper-checkbox-ink-size` | Size of the ripple | `48px`
+ * `--paper-checkbox-margin` | Margin around the checkbox container | `initial`
+ * `--paper-checkbox-vertical-align` | Vertical alignment of the checkbox container | `middle`
+ *
+ * This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`.
+ * In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`.
+ */
+interface PaperCheckboxElement extends Polymer.Element, Polymer.PaperCheckedElementBehavior {
+
+ /**
+ * Fired when the checked state changes.
+ */
+ ariaActiveAttribute: string|null|undefined;
+ attached(): void;
+
+ /**
+ * create ripple inside the checkboxContainer
+ */
+ _createRipple(): any;
+ _computeCheckboxClass(checked: any, invalid: any): any;
+ _computeCheckmarkClass(checked: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "paper-checkbox": PaperCheckboxElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/paper-checkbox.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/paper-checkbox.html
new file mode 100644
index 00000000000..e665ec21bb3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-checkbox/paper-checkbox.html
@@ -0,0 +1,324 @@
+<!--
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../paper-styles/default-theme.html">
+<link rel="import" href="../paper-behaviors/paper-checked-element-behavior.html">
+
+<!--
+Material design: [Checkbox](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-checkbox)
+
+`paper-checkbox` is a button that can be either checked or unchecked. User
+can tap the checkbox to check or uncheck it. Usually you use checkboxes
+to allow user to select multiple options from a set. If you have a single
+ON/OFF option, avoid using a single checkbox and use `paper-toggle-button`
+instead.
+
+Example:
+
+ <paper-checkbox>label</paper-checkbox>
+
+ <paper-checkbox checked> label</paper-checkbox>
+
+### Styling
+
+The following custom properties and mixins are available for styling:
+
+Custom property | Description | Default
+----------------|-------------|----------
+`--paper-checkbox-unchecked-background-color` | Checkbox background color when the input is not checked | `transparent`
+`--paper-checkbox-unchecked-color` | Checkbox border color when the input is not checked | `--primary-text-color`
+`--paper-checkbox-unchecked-ink-color` | Selected/focus ripple color when the input is not checked | `--primary-text-color`
+`--paper-checkbox-checked-color` | Checkbox color when the input is checked | `--primary-color`
+`--paper-checkbox-checked-ink-color` | Selected/focus ripple color when the input is checked | `--primary-color`
+`--paper-checkbox-checkmark-color` | Checkmark color | `white`
+`--paper-checkbox-label-color` | Label color | `--primary-text-color`
+`--paper-checkbox-label-checked-color` | Label color when the input is checked | `--paper-checkbox-label-color`
+`--paper-checkbox-label-spacing` | Spacing between the label and the checkbox | `8px`
+`--paper-checkbox-label` | Mixin applied to the label | `{}`
+`--paper-checkbox-label-checked` | Mixin applied to the label when the input is checked | `{}`
+`--paper-checkbox-error-color` | Checkbox color when invalid | `--error-color`
+`--paper-checkbox-size` | Size of the checkbox | `18px`
+`--paper-checkbox-ink-size` | Size of the ripple | `48px`
+`--paper-checkbox-margin` | Margin around the checkbox container | `initial`
+`--paper-checkbox-vertical-align` | Vertical alignment of the checkbox container | `middle`
+
+This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`.
+In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`.
+
+@demo demo/index.html
+-->
+
+<dom-module id="paper-checkbox">
+ <template strip-whitespace>
+ <style>
+ :host {
+ display: inline-block;
+ white-space: nowrap;
+ cursor: pointer;
+ --calculated-paper-checkbox-size: var(--paper-checkbox-size, 18px);
+ /* -1px is a sentinel for the default and is replaced in `attached`. */
+ --calculated-paper-checkbox-ink-size: var(--paper-checkbox-ink-size, -1px);
+ @apply --paper-font-common-base;
+ line-height: 0;
+ -webkit-tap-highlight-color: transparent;
+ }
+
+ :host([hidden]) {
+ display: none !important;
+ }
+
+ :host(:focus) {
+ outline: none;
+ }
+
+ .hidden {
+ display: none;
+ }
+
+ #checkboxContainer {
+ display: inline-block;
+ position: relative;
+ width: var(--calculated-paper-checkbox-size);
+ height: var(--calculated-paper-checkbox-size);
+ min-width: var(--calculated-paper-checkbox-size);
+ margin: var(--paper-checkbox-margin, initial);
+ vertical-align: var(--paper-checkbox-vertical-align, middle);
+ background-color: var(--paper-checkbox-unchecked-background-color, transparent);
+ }
+
+ #ink {
+ position: absolute;
+
+ /* Center the ripple in the checkbox by negative offsetting it by
+ * (inkWidth - rippleWidth) / 2 */
+ top: calc(0px - (var(--calculated-paper-checkbox-ink-size) - var(--calculated-paper-checkbox-size)) / 2);
+ left: calc(0px - (var(--calculated-paper-checkbox-ink-size) - var(--calculated-paper-checkbox-size)) / 2);
+ width: var(--calculated-paper-checkbox-ink-size);
+ height: var(--calculated-paper-checkbox-ink-size);
+ color: var(--paper-checkbox-unchecked-ink-color, var(--primary-text-color));
+ opacity: 0.6;
+ pointer-events: none;
+ }
+
+ #ink:dir(rtl) {
+ right: calc(0px - (var(--calculated-paper-checkbox-ink-size) - var(--calculated-paper-checkbox-size)) / 2);
+ left: auto;
+ }
+
+ #ink[checked] {
+ color: var(--paper-checkbox-checked-ink-color, var(--primary-color));
+ }
+
+ #checkbox {
+ position: relative;
+ box-sizing: border-box;
+ height: 100%;
+ border: solid 2px;
+ border-color: var(--paper-checkbox-unchecked-color, var(--primary-text-color));
+ border-radius: 2px;
+ pointer-events: none;
+ -webkit-transition: background-color 140ms, border-color 140ms;
+ transition: background-color 140ms, border-color 140ms;
+ }
+
+ /* checkbox checked animations */
+ #checkbox.checked #checkmark {
+ -webkit-animation: checkmark-expand 140ms ease-out forwards;
+ animation: checkmark-expand 140ms ease-out forwards;
+ }
+
+ @-webkit-keyframes checkmark-expand {
+ 0% {
+ -webkit-transform: scale(0, 0) rotate(45deg);
+ }
+ 100% {
+ -webkit-transform: scale(1, 1) rotate(45deg);
+ }
+ }
+
+ @keyframes checkmark-expand {
+ 0% {
+ transform: scale(0, 0) rotate(45deg);
+ }
+ 100% {
+ transform: scale(1, 1) rotate(45deg);
+ }
+ }
+
+ #checkbox.checked {
+ background-color: var(--paper-checkbox-checked-color, var(--primary-color));
+ border-color: var(--paper-checkbox-checked-color, var(--primary-color));
+ }
+
+ #checkmark {
+ position: absolute;
+ width: 36%;
+ height: 70%;
+ border-style: solid;
+ border-top: none;
+ border-left: none;
+ border-right-width: calc(2/15 * var(--calculated-paper-checkbox-size));
+ border-bottom-width: calc(2/15 * var(--calculated-paper-checkbox-size));
+ border-color: var(--paper-checkbox-checkmark-color, white);
+ -webkit-transform-origin: 97% 86%;
+ transform-origin: 97% 86%;
+ box-sizing: content-box; /* protect against page-level box-sizing */
+ }
+
+ #checkmark:dir(rtl) {
+ -webkit-transform-origin: 50% 14%;
+ transform-origin: 50% 14%;
+ }
+
+ /* label */
+ #checkboxLabel {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+ padding-left: var(--paper-checkbox-label-spacing, 8px);
+ white-space: normal;
+ line-height: normal;
+ color: var(--paper-checkbox-label-color, var(--primary-text-color));
+ @apply --paper-checkbox-label;
+ }
+
+ :host([checked]) #checkboxLabel {
+ color: var(--paper-checkbox-label-checked-color, var(--paper-checkbox-label-color, var(--primary-text-color)));
+ @apply --paper-checkbox-label-checked;
+ }
+
+ #checkboxLabel:dir(rtl) {
+ padding-right: var(--paper-checkbox-label-spacing, 8px);
+ padding-left: 0;
+ }
+
+ #checkboxLabel[hidden] {
+ display: none;
+ }
+
+ /* disabled state */
+
+ :host([disabled]) #checkbox {
+ opacity: 0.5;
+ border-color: var(--paper-checkbox-unchecked-color, var(--primary-text-color));
+ }
+
+ :host([disabled][checked]) #checkbox {
+ background-color: var(--paper-checkbox-unchecked-color, var(--primary-text-color));
+ opacity: 0.5;
+ }
+
+ :host([disabled]) #checkboxLabel {
+ opacity: 0.65;
+ }
+
+ /* invalid state */
+ #checkbox.invalid:not(.checked) {
+ border-color: var(--paper-checkbox-error-color, var(--error-color));
+ }
+ </style>
+
+ <div id="checkboxContainer">
+ <div id="checkbox" class$="[[_computeCheckboxClass(checked, invalid)]]">
+ <div id="checkmark" class$="[[_computeCheckmarkClass(checked)]]"></div>
+ </div>
+ </div>
+
+ <div id="checkboxLabel"><slot></slot></div>
+ </template>
+
+ <script>
+ Polymer({
+ is: 'paper-checkbox',
+
+ behaviors: [Polymer.PaperCheckedElementBehavior],
+
+ /** @private */
+ hostAttributes: {role: 'checkbox', 'aria-checked': false, tabindex: 0},
+
+ properties: {
+ /**
+ * Fired when the checked state changes due to user interaction.
+ *
+ * @event change
+ */
+
+ /**
+ * Fired when the checked state changes.
+ *
+ * @event iron-change
+ */
+ ariaActiveAttribute: {type: String, value: 'aria-checked'}
+ },
+
+ attached: function() {
+ // Wait until styles have resolved to check for the default sentinel.
+ // See polymer#4009 for more details.
+ Polymer.RenderStatus.afterNextRender(this, function() {
+ var inkSize =
+ this.getComputedStyleValue('--calculated-paper-checkbox-ink-size')
+ .trim();
+ // If unset, compute and set the default `--paper-checkbox-ink-size`.
+ if (inkSize === '-1px') {
+ var checkboxSizeText =
+ this.getComputedStyleValue('--calculated-paper-checkbox-size')
+ .trim();
+
+ var units = 'px';
+ var unitsMatches = checkboxSizeText.match(/[A-Za-z]+$/);
+ if (unitsMatches !== null) {
+ units = unitsMatches[0];
+ }
+
+ var checkboxSize = parseFloat(checkboxSizeText);
+ var defaultInkSize = (8 / 3) * checkboxSize;
+
+ if (units === 'px') {
+ defaultInkSize = Math.floor(defaultInkSize);
+
+ // The checkbox and ripple need to have the same parity so that their
+ // centers align.
+ if (defaultInkSize % 2 !== checkboxSize % 2) {
+ defaultInkSize++;
+ }
+ }
+
+ this.updateStyles({
+ '--paper-checkbox-ink-size': defaultInkSize + units,
+ });
+ }
+ });
+ },
+
+ _computeCheckboxClass: function(checked, invalid) {
+ var className = '';
+ if (checked) {
+ className += 'checked ';
+ }
+ if (invalid) {
+ className += 'invalid';
+ }
+ return className;
+ },
+
+ _computeCheckmarkClass: function(checked) {
+ return checked ? '' : 'hidden';
+ },
+
+ // create ripple inside the checkboxContainer
+ _createRipple: function() {
+ this._rippleContainer = this.$.checkboxContainer;
+ return Polymer.PaperInkyFocusBehaviorImpl._createRipple.call(this);
+ }
+
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/.bower.json
new file mode 100644
index 00000000000..5a12b01e078
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/.bower.json
@@ -0,0 +1,77 @@
+{
+ "name": "paper-dialog-behavior",
+ "version": "2.2.2",
+ "description": "Implements a behavior used for material design dialogs",
+ "authors": "The Polymer Authors",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "dialog",
+ "overlay",
+ "behavior"
+ ],
+ "main": "paper-dialog-behavior.html",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-dialog-behavior"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-dialog-behavior",
+ "ignore": [],
+ "dependencies": {
+ "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "paper-button": "PolymerElements/paper-button#1 - 2",
+ "paper-dialog-scrollable": "PolymerElements/paper-dialog-scrollable#1 - 2",
+ "paper-dropdown-menu": "PolymerElements/paper-dropdown-menu#1 - 2",
+ "paper-icon-button": "PolymerElements/paper-icon-button#1 - 2",
+ "paper-item": "PolymerElements/paper-item#1 - 2",
+ "paper-listbox": "PolymerElements/paper-listbox#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.1.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "paper-button": "PolymerElements/paper-button#^1.0.0",
+ "paper-dialog-scrollable": "PolymerElements/paper-dialog-scrollable#^1.0.0",
+ "paper-dropdown-menu": "PolymerElements/paper-dropdown-menu#^1.0.0",
+ "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0",
+ "paper-item": "PolymerElements/paper-item#^1.0.0",
+ "paper-listbox": "PolymerElements/paper-listbox#^1.1.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.2.2",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.2.2",
+ "commit": "d6d5b68bdcad2896356bf8fa9022d3e985f363e4"
+ },
+ "_source": "https://github.com/PolymerElements/paper-dialog-behavior.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/paper-dialog-behavior"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/.github/CODEOWNERS
new file mode 100644
index 00000000000..c5097c0c903
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @valdrinkoshi
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..f544977ff31
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/paper-dialog-behavior/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/.travis.yml
new file mode 100644
index 00000000000..f590d57c018
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/.travis.yml
@@ -0,0 +1,32 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e '\n\033[31mERROR:\033[0m
+ Project is not formatted. Please run "npm run format".' && false)
+env:
+ global:
+ - secure: >-
+ TJSGIyeS77tnbqO9zSa5jAThGUOwhfDTdMBXIVkjDwPqtB2u8y6QB6rerGvNpDLdWTZh6dNUByc4vHJLGKmTArbWc/XH90H7msZs3OxMlXjgILX4//QSxM4uwBwfTh44PVb/wDJxgX950qXyF646Lo9A8UwKk2JL9LBeuiO+tQs=
+ - secure: >-
+ QXJDFGdZ+94ktzeT8u1TjkgCSbku5UT+YIyOOyw4yrphg/0HSnlZ8bu5i3z9iPJu3mzxNdIXCAW7dLKfYgKK6S21o/3QWlMDuAt11wnSZLW/GWrLDTQNotFN+cLFghGuZkM3bsMp+CLjvvjZZwyK3B340g1gP66DbUQuoUYaRao=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/README.md
new file mode 100644
index 00000000000..c12ec9b3cb3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/README.md
@@ -0,0 +1,44 @@
+[![Build status](https://travis-ci.org/PolymerElements/paper-dialog-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-dialog-behavior)
+[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://www.webcomponents.org/element/PolymerElements/paper-dialog-behavior)
+
+## Polymer.PaperDialogBehavior
+
+Use `Polymer.PaperDialogBehavior` and `paper-dialog-shared-styles.html` to implement a Material Design
+dialog.
+
+For example, if `<paper-dialog-impl>` implements this behavior:
+
+```html
+<paper-dialog-impl>
+ <h2>Header</h2>
+ <div>Dialog body</div>
+ <div class="paper-dialog-buttons">
+ <paper-button dialog-dismiss>Cancel</paper-button>
+ <paper-button dialog-confirm>Accept</paper-button>
+ </div>
+</paper-dialog-impl>
+```
+
+`paper-dialog-shared-styles.html` provide styles for a header, content area, and an action area for buttons.
+Use the `<h2>` tag for the header and the `paper-dialog-buttons` or `buttons` class for the action area. You can use the
+`paper-dialog-scrollable` element (in its own repository) if you need a scrolling content area.
+
+Use the `dialog-dismiss` and `dialog-confirm` attributes on interactive controls to close the
+dialog. If the user dismisses the dialog with `dialog-confirm`, the `closingReason` will update
+to include `confirmed: true`.
+
+### Changes in 2.0
+- `paper-dialog-shared-styles` styles direct `h2` and `.buttons` children of the dialog because of how [`::slotted` works](https://developers.google.com/web/fundamentals/primers/shadowdom/?hl=en#stylinglightdom)
+(compound selector will select only top level nodes)
+- Removed `paper-dialog-common.css` as it's a duplicate of `paper-dialog-shared-styles.html`.
+Import the shared styles via `<style include="paper-dialog-shared-styles">` ([see example](demo/simple-dialog.html))
+
+### Accessibility
+
+This element has `role="dialog"` by default. Depending on the context, it may be more appropriate
+to override this attribute with `role="alertdialog"`.
+
+If `modal` is set, the element will prevent the focus from exiting the element.
+It will also ensure that focus remains in the dialog.
+
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/bower.json
new file mode 100644
index 00000000000..2ee9ec372f0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/bower.json
@@ -0,0 +1,68 @@
+{
+ "name": "paper-dialog-behavior",
+ "version": "2.2.2",
+ "description": "Implements a behavior used for material design dialogs",
+ "authors": "The Polymer Authors",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "dialog",
+ "overlay",
+ "behavior"
+ ],
+ "main": "paper-dialog-behavior.html",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-dialog-behavior"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-dialog-behavior",
+ "ignore": [],
+ "dependencies": {
+ "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "paper-button": "PolymerElements/paper-button#1 - 2",
+ "paper-dialog-scrollable": "PolymerElements/paper-dialog-scrollable#1 - 2",
+ "paper-dropdown-menu": "PolymerElements/paper-dropdown-menu#1 - 2",
+ "paper-icon-button": "PolymerElements/paper-icon-button#1 - 2",
+ "paper-item": "PolymerElements/paper-item#1 - 2",
+ "paper-listbox": "PolymerElements/paper-listbox#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.1.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "paper-button": "PolymerElements/paper-button#^1.0.0",
+ "paper-dialog-scrollable": "PolymerElements/paper-dialog-scrollable#^1.0.0",
+ "paper-dropdown-menu": "PolymerElements/paper-dropdown-menu#^1.0.0",
+ "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0",
+ "paper-item": "PolymerElements/paper-item#^1.0.0",
+ "paper-listbox": "PolymerElements/paper-listbox#^1.1.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/demo/index.html
new file mode 100644
index 00000000000..ae72f751892
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/demo/index.html
@@ -0,0 +1,107 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <title>paper-dialog-behavior demo</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="simple-dialog.html">
+
+ <link rel="import" href="../../paper-button/paper-button.html">
+ <link rel="import" href="../../paper-dropdown-menu/paper-dropdown-menu-light.html">
+ <link rel="import" href="../../paper-item/paper-item.html">
+ <link rel="import" href="../../paper-listbox/paper-listbox.html">
+ <link rel="import" href="../../paper-dialog-scrollable/paper-dialog-scrollable.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+
+ <custom-style><style is="custom-style" include="demo-pages-shared-styles"></style></custom-style>
+</head>
+<body unresolved class="centered">
+
+ <h3>An element with <code>PaperDialogBehavior</code> can be opened, closed, toggled. Use <code>h2</code> for the title</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <paper-button raised onclick="dialog.toggle()">dialog</paper-button>
+ <simple-dialog id="dialog">
+ <h2>Dialog Title</h2>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ </simple-dialog>
+ </template>
+ </demo-snippet>
+
+ <h3>An element with <code>PaperDialogBehavior</code> can be modal. Use the attributes <code>dialog-dismiss</code> and <code>dialog-confirm</code> on the children to close it.</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <paper-button raised onclick="modalAlert.toggle()">modal alert</paper-button>
+ <simple-dialog id="modalAlert" modal role="alertdialog">
+ <h2>Alert</h2>
+ <paper-dropdown-menu-light label="Draft to discard">
+ <!--
+ support hybrid mode:
+ paper-dropdown-menu-light 1.x distributes via <content select=".dropdown-content">
+ paper-dropdown-menu-light 2.x distributes via <slot name="dropdown-content">
+ -->
+ <paper-listbox class="dropdown-content" slot="dropdown-content">
+ <paper-item>Draft 1</paper-item>
+ <paper-item>Draft 2</paper-item>
+ <paper-item>Draft 3</paper-item>
+ <paper-item>Draft 4</paper-item>
+ </paper-listbox>
+ </paper-dropdown-menu-light>
+ <div class="buttons">
+ <paper-button onclick="modalDetails.toggle()">More details</paper-button>
+ <paper-button dialog-dismiss>Cancel</paper-button>
+ <paper-button dialog-confirm autofocus>Discard</paper-button>
+ </div>
+ </simple-dialog>
+ <simple-dialog id="modalDetails" modal>
+ <h2>Details</h2>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <div class="buttons">
+ <paper-button dialog-confirm autofocus>OK</paper-button>
+ </div>
+ </simple-dialog>
+ </template>
+ </demo-snippet>
+
+ <h3>Use <code>paper-dialog-scrollable</code> for scrolling content</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <paper-button raised onclick="scrolling.toggle()">scrolling</paper-button>
+ <simple-dialog id="scrolling">
+ <h2>Scrolling</h2>
+ <paper-dialog-scrollable>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ </paper-dialog-scrollable>
+ <div class="buttons">
+ <paper-button dialog-dismiss>Cancel</paper-button>
+ <paper-button dialog-confirm>OK</paper-button>
+ </div>
+ </simple-dialog>
+ </template>
+ </demo-snippet>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/demo/simple-dialog.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/demo/simple-dialog.html
new file mode 100644
index 00000000000..c9cf072805c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/demo/simple-dialog.html
@@ -0,0 +1,28 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../paper-dialog-behavior.html">
+<link rel="import" href="../paper-dialog-shared-styles.html">
+
+<dom-module id="simple-dialog">
+ <template>
+ <style include="paper-dialog-shared-styles"></style>
+ <slot></slot>
+ </template>
+
+ <script>
+ (function() {
+ 'use strict';
+
+ Polymer({is: 'simple-dialog', behaviors: [Polymer.PaperDialogBehavior]});
+ })();
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/hero.svg b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/hero.svg
new file mode 100755
index 00000000000..d47381685f8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/hero.svg
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">
+<g id="background" display="none">
+ <rect display="inline" fill="#B0BEC5" width="225" height="126"/>
+</g>
+<g id="label">
+</g>
+<g id="art">
+ <g>
+ <polygon points="76.7,98 79.2,98 74,91.1 74,94.4 "/>
+ <polygon points="74,81.4 74,84.7 84.1,98 86.6,98 "/>
+ <polygon points="74,71.7 74,75 91.5,98 94,98 "/>
+ <polygon points="74,62 74,65.3 98.9,98 101.4,98 "/>
+ <polygon points="94.3,79 92,79 92,76 74,52.3 74,55.6 106.2,98 108.7,98 "/>
+ <polygon points="92,69.6 92,66.3 74,42.6 74,45.9 "/>
+ <polygon points="101.7,79 99.2,79 113.6,98 116.1,98 "/>
+ <polygon points="92,59.9 92,56.6 74,32.9 74,36.2 "/>
+ <polygon points="109.1,79 106.5,79 121,98 123.5,98 "/>
+ <polygon points="92,50.2 92,47 92.1,47 77.7,28 75.2,28 "/>
+ <polygon points="116.4,79 113.9,79 128.4,98 130.9,98 "/>
+ <polygon points="97,47 99.5,47 85,28 82.5,28 "/>
+ <polygon points="123.8,79 121.3,79 135.7,98 138.2,98 "/>
+ <polygon points="104.4,47 106.9,47 92.4,28 89.9,28 "/>
+ <polygon points="131.2,79 128.7,79 143.1,98 145.6,98 "/>
+ <polygon points="132,70.4 132,73.7 150,97.4 150,94.1 "/>
+ <polygon points="111.7,47 114.2,47 99.8,28 97.3,28 "/>
+ <polygon points="132,60.7 132,64 150,87.7 150,84.3 "/>
+ <polygon points="119.1,47 121.6,47 107.2,28 104.7,28 "/>
+ <polygon points="132,51 132,54.3 150,77.9 150,74.6 "/>
+ <polygon points="114.6,28 112,28 126.5,47 129,47 "/>
+ <polygon points="121.9,28 119.4,28 150,68.2 150,64.9 "/>
+ <polygon points="129.3,28 126.8,28 150,58.5 150,55.2 "/>
+ <polygon points="136.7,28 134.2,28 150,48.8 150,45.5 "/>
+ <polygon points="144.1,28 141.5,28 150,39.1 150,35.8 "/>
+ <polygon points="150,29.4 150,28 148.9,28 "/>
+ </g>
+ <path d="M133,80H91V46h42V80z M93,78h38V48H93V78z"/>
+ <path d="M151,99H73V27h78V99z M75,97h74V29H75V97z"/>
+ <circle cx="74" cy="28" r="4"/>
+ <circle cx="150" cy="28" r="4"/>
+ <circle cx="150" cy="98" r="4"/>
+ <circle cx="74" cy="98" r="4"/>
+ <g id="ic_x5F_add_x0D_">
+ </g>
+</g>
+<g id="Guides">
+</g>
+</svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/index.html
new file mode 100644
index 00000000000..af98b85acdc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/index.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+
+ <title>paper-dialog-behavior</title>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../polymer/polymer.html">
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/package-lock.json
new file mode 100644
index 00000000000..a63ac52c7e2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/package-lock.json
@@ -0,0 +1,2388 @@
+{
+ "name": "@polymer/paper-dialog-behavior",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.6.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.4.tgz",
+ "integrity": "sha512-Awg4BcUYiZtNKoveGOu654JVPt11V/KIC77iBz8NweyoOAZpz5rUJfPDwwD+ajfTs2HndbTCEB8IuLfX9m/mmw==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.44",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+ "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz",
+ "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.2",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.105",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.44",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.2",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/package.json
new file mode 100644
index 00000000000..cd1c8e0289a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@polymer/paper-dialog-behavior",
+ "private": true,
+ "description": "Implements a behavior used for material design dialogs",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-dialog-behavior"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/paper-dialog-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/paper-dialog-behavior.d.ts
new file mode 100644
index 00000000000..4377e52f3be
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/paper-dialog-behavior.d.ts
@@ -0,0 +1,70 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-dialog-behavior.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-overlay-behavior/iron-overlay-behavior.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Use `Polymer.PaperDialogBehavior` and `paper-dialog-shared-styles.html` to
+ * implement a Material Design dialog.
+ *
+ * For example, if `<paper-dialog-impl>` implements this behavior:
+ *
+ * <paper-dialog-impl>
+ * <h2>Header</h2>
+ * <div>Dialog body</div>
+ * <div class="buttons">
+ * <paper-button dialog-dismiss>Cancel</paper-button>
+ * <paper-button dialog-confirm>Accept</paper-button>
+ * </div>
+ * </paper-dialog-impl>
+ *
+ * `paper-dialog-shared-styles.html` provide styles for a header, content area, and
+ * an action area for buttons. Use the `<h2>` tag for the header and the `buttons`
+ * class for the action area. You can use the `paper-dialog-scrollable` element (in
+ * its own repository) if you need a scrolling content area.
+ *
+ * Use the `dialog-dismiss` and `dialog-confirm` attributes on interactive controls
+ * to close the dialog. If the user dismisses the dialog with `dialog-confirm`, the
+ * `closingReason` will update to include `confirmed: true`.
+ *
+ * ### Accessibility
+ *
+ * This element has `role="dialog"` by default. Depending on the context, it may be
+ * more appropriate to override this attribute with `role="alertdialog"`.
+ *
+ * If `modal` is set, the element will prevent the focus from exiting the element.
+ * It will also ensure that focus remains in the dialog.
+ *
+ *
+ */
+ interface PaperDialogBehavior extends Polymer.IronOverlayBehavior {
+
+ /**
+ * If `modal` is true, this implies `no-cancel-on-outside-click`,
+ * `no-cancel-on-esc-key` and `with-backdrop`.
+ */
+ modal: boolean|null|undefined;
+ hostAttributes: object|null;
+ ready(): void;
+ _modalChanged(modal: any, readied: any): void;
+ _updateClosingReasonConfirmed(confirmed: any): void;
+
+ /**
+ * Will dismiss the dialog if user clicked on an element with dialog-dismiss
+ * or dialog-confirm attribute.
+ */
+ _onDialogClick(event: any): void;
+ }
+
+ const PaperDialogBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/paper-dialog-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/paper-dialog-behavior.html
new file mode 100644
index 00000000000..5a65d91d634
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/paper-dialog-behavior.html
@@ -0,0 +1,143 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-overlay-behavior/iron-overlay-behavior.html">
+
+<script>
+ (function() {
+ 'use strict';
+
+ /**
+ Use `Polymer.PaperDialogBehavior` and `paper-dialog-shared-styles.html` to
+ implement a Material Design dialog.
+
+ For example, if `<paper-dialog-impl>` implements this behavior:
+
+ <paper-dialog-impl>
+ <h2>Header</h2>
+ <div>Dialog body</div>
+ <div class="buttons">
+ <paper-button dialog-dismiss>Cancel</paper-button>
+ <paper-button dialog-confirm>Accept</paper-button>
+ </div>
+ </paper-dialog-impl>
+
+ `paper-dialog-shared-styles.html` provide styles for a header, content area, and
+ an action area for buttons. Use the `<h2>` tag for the header and the `buttons`
+ class for the action area. You can use the `paper-dialog-scrollable` element (in
+ its own repository) if you need a scrolling content area.
+
+ Use the `dialog-dismiss` and `dialog-confirm` attributes on interactive controls
+ to close the dialog. If the user dismisses the dialog with `dialog-confirm`, the
+ `closingReason` will update to include `confirmed: true`.
+
+ ### Accessibility
+
+ This element has `role="dialog"` by default. Depending on the context, it may be
+ more appropriate to override this attribute with `role="alertdialog"`.
+
+ If `modal` is set, the element will prevent the focus from exiting the element.
+ It will also ensure that focus remains in the dialog.
+
+ @hero hero.svg
+ @demo demo/index.html
+ @polymerBehavior Polymer.PaperDialogBehavior
+ */
+ Polymer.PaperDialogBehaviorImpl = {
+
+ hostAttributes: {'role': 'dialog', 'tabindex': '-1'},
+
+ properties: {
+
+ /**
+ * If `modal` is true, this implies `no-cancel-on-outside-click`,
+ * `no-cancel-on-esc-key` and `with-backdrop`.
+ */
+ modal: {type: Boolean, value: false},
+
+ __readied: {type: Boolean, value: false}
+
+ },
+
+ observers: ['_modalChanged(modal, __readied)'],
+
+ listeners: {'tap': '_onDialogClick'},
+
+ /**
+ * @return {void}
+ */
+ ready: function() {
+ // Only now these properties can be read.
+ this.__prevNoCancelOnOutsideClick = this.noCancelOnOutsideClick;
+ this.__prevNoCancelOnEscKey = this.noCancelOnEscKey;
+ this.__prevWithBackdrop = this.withBackdrop;
+ this.__readied = true;
+ },
+
+ _modalChanged: function(modal, readied) {
+ // modal implies noCancelOnOutsideClick, noCancelOnEscKey and withBackdrop.
+ // We need to wait for the element to be ready before we can read the
+ // properties values.
+ if (!readied) {
+ return;
+ }
+
+ if (modal) {
+ this.__prevNoCancelOnOutsideClick = this.noCancelOnOutsideClick;
+ this.__prevNoCancelOnEscKey = this.noCancelOnEscKey;
+ this.__prevWithBackdrop = this.withBackdrop;
+ this.noCancelOnOutsideClick = true;
+ this.noCancelOnEscKey = true;
+ this.withBackdrop = true;
+ } else {
+ // If the value was changed to false, let it false.
+ this.noCancelOnOutsideClick =
+ this.noCancelOnOutsideClick && this.__prevNoCancelOnOutsideClick;
+ this.noCancelOnEscKey =
+ this.noCancelOnEscKey && this.__prevNoCancelOnEscKey;
+ this.withBackdrop = this.withBackdrop && this.__prevWithBackdrop;
+ }
+ },
+
+ _updateClosingReasonConfirmed: function(confirmed) {
+ this.closingReason = this.closingReason || {};
+ this.closingReason.confirmed = confirmed;
+ },
+
+ /**
+ * Will dismiss the dialog if user clicked on an element with dialog-dismiss
+ * or dialog-confirm attribute.
+ */
+ _onDialogClick: function(event) {
+ // Search for the element with dialog-confirm or dialog-dismiss,
+ // from the root target until this (excluded).
+ var path = Polymer.dom(event).path;
+ for (var i = 0, l = path.indexOf(this); i < l; i++) {
+ var target = path[i];
+ if (target.hasAttribute &&
+ (target.hasAttribute('dialog-dismiss') ||
+ target.hasAttribute('dialog-confirm'))) {
+ this._updateClosingReasonConfirmed(
+ target.hasAttribute('dialog-confirm'));
+ this.close();
+ event.stopPropagation();
+ break;
+ }
+ }
+ }
+
+ };
+
+ /** @polymerBehavior */
+ Polymer.PaperDialogBehavior =
+ [Polymer.IronOverlayBehavior, Polymer.PaperDialogBehaviorImpl];
+ })();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/paper-dialog-shared-styles.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/paper-dialog-shared-styles.d.ts
new file mode 100644
index 00000000000..916661e6b31
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/paper-dialog-shared-styles.d.ts
@@ -0,0 +1,16 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-dialog-shared-styles.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-flex-layout/iron-flex-layout.d.ts" />
+/// <reference path="../paper-styles/default-theme.d.ts" />
+/// <reference path="../paper-styles/typography.d.ts" />
+/// <reference path="../paper-styles/shadow.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/paper-dialog-shared-styles.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/paper-dialog-shared-styles.html
new file mode 100644
index 00000000000..da5f19d0584
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog-behavior/paper-dialog-shared-styles.html
@@ -0,0 +1,100 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="../paper-styles/default-theme.html">
+<link rel="import" href="../paper-styles/typography.html">
+<link rel="import" href="../paper-styles/shadow.html">
+
+<!--
+### Styling
+
+The following custom properties and mixins are available for styling.
+
+Custom property | Description | Default
+----------------|-------------|----------
+`--paper-dialog-background-color` | Dialog background color | `--primary-background-color`
+`--paper-dialog-color` | Dialog foreground color | `--primary-text-color`
+`--paper-dialog` | Mixin applied to the dialog | `{}`
+`--paper-dialog-title` | Mixin applied to the title (`<h2>`) element | `{}`
+`--paper-dialog-button-color` | Button area foreground color | `--default-primary-color`
+-->
+
+<dom-module id="paper-dialog-shared-styles">
+ <template>
+ <style>
+ :host {
+ display: block;
+ margin: 24px 40px;
+
+ background: var(--paper-dialog-background-color, var(--primary-background-color));
+ color: var(--paper-dialog-color, var(--primary-text-color));
+
+ @apply --paper-font-body1;
+ @apply --shadow-elevation-16dp;
+ @apply --paper-dialog;
+ }
+
+ :host > ::slotted(*) {
+ margin-top: 20px;
+ padding: 0 24px;
+ }
+
+ :host > ::slotted(.no-padding) {
+ padding: 0;
+ }
+
+
+ :host > ::slotted(*:first-child) {
+ margin-top: 24px;
+ }
+
+ :host > ::slotted(*:last-child) {
+ margin-bottom: 24px;
+ }
+
+ /* In 1.x, this selector was `:host > ::content h2`. In 2.x <slot> allows
+ to select direct children only, which increases the weight of this
+ selector, so we have to re-define first-child/last-child margins below. */
+ :host > ::slotted(h2) {
+ position: relative;
+ margin: 0;
+
+ @apply --paper-font-title;
+ @apply --paper-dialog-title;
+ }
+
+ /* Apply mixin again, in case it sets margin-top. */
+ :host > ::slotted(h2:first-child) {
+ margin-top: 24px;
+ @apply --paper-dialog-title;
+ }
+
+ /* Apply mixin again, in case it sets margin-bottom. */
+ :host > ::slotted(h2:last-child) {
+ margin-bottom: 24px;
+ @apply --paper-dialog-title;
+ }
+
+ :host > ::slotted(.paper-dialog-buttons),
+ :host > ::slotted(.buttons) {
+ position: relative;
+ padding: 8px 8px 8px 24px;
+ margin: 0;
+
+ color: var(--paper-dialog-button-color, var(--primary-color));
+
+ @apply --layout-horizontal;
+ @apply --layout-end-justified;
+ }
+ </style>
+ </template>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/.bower.json
new file mode 100644
index 00000000000..57975bdc113
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/.bower.json
@@ -0,0 +1,78 @@
+{
+ "name": "paper-dialog",
+ "description": "A Material Design dialog",
+ "version": "2.1.1",
+ "authors": "The Polymer Authors",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "dialog",
+ "overlay"
+ ],
+ "main": "paper-dialog.html",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-dialog"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-dialog",
+ "ignore": [],
+ "dependencies": {
+ "neon-animation": "PolymerElements/neon-animation#1 - 2",
+ "paper-dialog-behavior": "PolymerElements/paper-dialog-behavior#1 - 2",
+ "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "paper-button": "PolymerElements/paper-button#1 - 2",
+ "paper-dialog-scrollable": "PolymerElements/paper-dialog-scrollable#1 - 2",
+ "paper-dropdown-menu": "PolymerElements/paper-dropdown-menu#1 - 2",
+ "paper-item": "PolymerElements/paper-item#1 - 2",
+ "paper-listbox": "PolymerElements/paper-listbox#1 - 2",
+ "web-animations-js": "web-animations/web-animations-js#^2.2.0",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "neon-animation": "PolymerElements/neon-animation#^1.0.0",
+ "paper-dialog-behavior": "PolymerElements/paper-dialog-behavior#^1.0.0",
+ "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#^1.7.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "paper-button": "PolymerElements/paper-button#^1.0.0",
+ "paper-dialog-scrollable": "PolymerElements/paper-dialog-scrollable#^1.0.0",
+ "paper-dropdown-menu": "PolymerElements/paper-dropdown-menu#^1.0.0",
+ "paper-item": "PolymerElements/paper-item#^1.0.0",
+ "paper-listbox": "PolymerElements/paper-listbox#^1.0.0",
+ "web-animations-js": "web-animations/web-animations-js#^2.2.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.1.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.1",
+ "commit": "c6089263a75db91d2e33b5478030487d35f2ec04"
+ },
+ "_source": "https://github.com/PolymerElements/paper-dialog.git",
+ "_target": "^2.0.0",
+ "_originalSource": "paper-dialog"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/.github/CODEOWNERS
new file mode 100644
index 00000000000..c5097c0c903
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @valdrinkoshi
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..823a0209b55
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/paper-dialog/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/.travis.yml
new file mode 100644
index 00000000000..5d978c755dc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/.travis.yml
@@ -0,0 +1,29 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+env:
+ global:
+ - secure: >-
+ QgTx1GfP8J91Uzv03iETT60WI0ZhgvbT5tFkDp53oeQrNvXwZMCDN9BE+LsvE+3WJdhwV//gD3B72y+nSTa89UGSHwXaLiXPxL1OW7B/36X0ri1yPVVW9TJNramsVmjkFbjqbD6txUPE/j2STYIxGueng3R/bzt/Vx/ZjHnTJSVkyfQ0HCmMvgVvKBzP6wHHoggXcXeRhViQUbHW2v32Ptj2lw/qukQxv0rggugz/m+4miLFMEtAFlSJ+9Q4rA8pXMgrDJbd7T7BPNs9yeP0rVNab+dRE0wMkv0iRk0cL1ZPH/FB5F6everMc/7zc3mCEVXJM0fbj1XQVM640C413ncpDz/zK24e3lew4Erf7Ld9dl/xWRr60zBvGfFHz5JSBzL4/OsvnRFHfpxd6nwyVJhjv9uqyGNNqaDZ1AaPZ/ZCVDq+7KyJhM/Pug18cEzcDhUc0u5SIdjLnaiqgqAx0axAUdGPAN9Ssb58kDaqgt38VfoCc7ki/Qsk84ylxVu10vAeK4piklUb/PtR0gTKQ4GcYWnwZBgTlSthRFheOEp5BSDsKXi8Y2UCb/FJr1+oMbjbHLKnKvq7UDaLXXXKfvF1RjF1npgtYw4HBbHQ8Rsr7ZT2gU/85UDfpTgFNlpRWwajpEGQ7eK/CKQZnE8eGy+DR0KNuXxBkZpW5xOyq4g=
+ - secure: >-
+ GzJ6KvrESPTW2J2fqjTq4tXzaSLdjVuWHp4LV7isIBQk5qeh0l+AN/ZRzYj63AdhKBeQG68lLMayV/GFtJsKkLQWn1xZzxVjwdpWQjwnKWtoGYkwdHzuY6FNfLL9FTIGu5G6RCmfFfTDsUHkhSXW+cBaN7nJWtojXAOrr+9ivfU6acfoON8RN8m5N2o5uVJgwwlveYnCYayRHC50neHOVC1IzQlagW9TdpKMqHeg0XpSFhdjQua3ETiAiQDjpQz1BeNZh+/DjnlV08zAx64bjZTh441100HRP0qg4/Y6IcX/qCiRdQHYBvIAoka+ZySPu1zYfvn+7eJYwQ4shSuElKX9y6g+uk3g5djJJ7yoKIQnsYlO1yPB0E8fvIhP2K/ZCwXK86snR+pIfrpVudQy4RZObuvyJIqxmaUjlTg1zU/S0ZNqOnXtqO6pG6YNH1JpAt0Bdzy7hT/q44ROlBPYuZK8shzzLa4KBr3Rb7kknyi5YXempGjhLnUFFd+gGQUkfqoDmyLreDyO95Ch8+YOcTjAzWh/yrEw1of0l/an9TxtWjnFaioJDcVS/dQphufMHgxyushDaocm/My06ZNWfwe69IbH7lqdDn9aW8hdn9cgIKw/sNqVtksN0/tnoURD/8wuHmepzsCR7xs9NrAozaynK+NdPfDdUtLRjtcEy0A=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/README.md
new file mode 100644
index 00000000000..d1e6b2bebc8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/README.md
@@ -0,0 +1,65 @@
+[![Build status](https://travis-ci.org/PolymerElements/paper-dialog.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-dialog)
+[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://www.webcomponents.org/element/PolymerElements/paper-dialog)
+
+## &lt;paper-dialog&gt;
+
+Material design: [Dialogs](https://www.google.com/design/spec/components/dialogs.html)
+
+`<paper-dialog>` is a dialog with Material Design styling and optional animations when it is
+opened or closed. It provides styles for a header, content area, and an action area for buttons.
+You can use the `<paper-dialog-scrollable>` element (in its own repository) if you need a scrolling
+content area. To autofocus a specific child element after opening the dialog, give it the `autofocus`
+attribute. See `Polymer.PaperDialogBehavior` and `Polymer.IronOverlayBehavior` for specifics.
+
+For example, the following code implements a dialog with a header, scrolling content area and
+buttons. Focus will be given to the `dialog-confirm` button when the dialog is opened.
+
+```html
+<paper-dialog>
+ <h2>Header</h2>
+ <paper-dialog-scrollable>
+ Lorem ipsum...
+ </paper-dialog-scrollable>
+ <div class="buttons">
+ <paper-button dialog-dismiss>Cancel</paper-button>
+ <paper-button dialog-confirm autofocus>Accept</paper-button>
+ </div>
+</paper-dialog>
+```
+
+### Changes in 2.0
+- `paper-dialog-behavior 2.0` styles only direct `h2` and `.buttons` children of the dialog because of how [`::slotted` works](https://developers.google.com/web/fundamentals/primers/shadowdom/?hl=en#stylinglightdom)
+(compound selector will select only top level nodes)
+- `neon-animation 2.0` doesn't import the Web Animations polyfill, so you'll have to import it ([see Animations section](#Animations))
+
+### Styling
+
+See the docs for `Polymer.PaperDialogBehavior` for the custom properties available for styling
+this element.
+
+### Animations
+
+Set the `entry-animation` and/or `exit-animation` attributes to add an animation when the dialog
+is opened or closed. See the documentation in
+[PolymerElements/neon-animation](https://github.com/PolymerElements/neon-animation) for more info.
+
+For example:
+
+```html
+<link rel="import" href="../neon-animation/web-animations.html">
+<link rel="import" href="../neon-animation/animations/scale-up-animation.html">
+<link rel="import" href="../neon-animation/animations/fade-out-animation.html">
+
+<paper-dialog entry-animation="scale-up-animation"
+ exit-animation="fade-out-animation">
+ <h2>Header</h2>
+ <div>Dialog body</div>
+</paper-dialog>
+```
+
+### Accessibility
+
+See the docs for `Polymer.PaperDialogBehavior` for accessibility features implemented by this
+element.
+
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/bower.json
new file mode 100644
index 00000000000..bca919ab9ba
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/bower.json
@@ -0,0 +1,69 @@
+{
+ "name": "paper-dialog",
+ "description": "A Material Design dialog",
+ "version": "2.1.1",
+ "authors": "The Polymer Authors",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "dialog",
+ "overlay"
+ ],
+ "main": "paper-dialog.html",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-dialog"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-dialog",
+ "ignore": [],
+ "dependencies": {
+ "neon-animation": "PolymerElements/neon-animation#1 - 2",
+ "paper-dialog-behavior": "PolymerElements/paper-dialog-behavior#1 - 2",
+ "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "paper-button": "PolymerElements/paper-button#1 - 2",
+ "paper-dialog-scrollable": "PolymerElements/paper-dialog-scrollable#1 - 2",
+ "paper-dropdown-menu": "PolymerElements/paper-dropdown-menu#1 - 2",
+ "paper-item": "PolymerElements/paper-item#1 - 2",
+ "paper-listbox": "PolymerElements/paper-listbox#1 - 2",
+ "web-animations-js": "web-animations/web-animations-js#^2.2.0",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "neon-animation": "PolymerElements/neon-animation#^1.0.0",
+ "paper-dialog-behavior": "PolymerElements/paper-dialog-behavior#^1.0.0",
+ "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#^1.7.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "paper-button": "PolymerElements/paper-button#^1.0.0",
+ "paper-dialog-scrollable": "PolymerElements/paper-dialog-scrollable#^1.0.0",
+ "paper-dropdown-menu": "PolymerElements/paper-dropdown-menu#^1.0.0",
+ "paper-item": "PolymerElements/paper-item#^1.0.0",
+ "paper-listbox": "PolymerElements/paper-listbox#^1.0.0",
+ "web-animations-js": "web-animations/web-animations-js#^2.2.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/demo/index.html
new file mode 100644
index 00000000000..d332d912b5c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/demo/index.html
@@ -0,0 +1,230 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+
+<head>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <title>paper-dialog demo</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../paper-dialog.html">
+ <link rel="import" href="../../paper-button/paper-button.html">
+ <link rel="import" href="../../paper-dialog-scrollable/paper-dialog-scrollable.html">
+ <link rel="import" href="../../neon-animation/web-animations.html">
+ <link rel="import" href="../../neon-animation/neon-animations.html">
+ <link rel="import" href="../../paper-dropdown-menu/paper-dropdown-menu-light.html">
+ <link rel="import" href="../../paper-listbox/paper-listbox.html">
+ <link rel="import" href="../../paper-item/paper-item.html">
+
+
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+
+ <custom-style><style is="custom-style" include="demo-pages-shared-styles">
+ .centered {
+ min-width: 500px;
+ }
+
+ demo-snippet {
+ --demo-snippet-code: {
+ max-height: 250px;
+ }
+ }
+ </style></custom-style>
+
+</head>
+
+<body unresolved class="centered">
+ <h3>Dialog layouts</h3>
+ <demo-snippet>
+ <template>
+ <paper-button raised onclick="dialog.open()">plain dialog</paper-button>
+ <paper-button raised onclick="modal.open()">modal dialog</paper-button>
+ <paper-button raised onclick="scrolling.open()">scrolling dialog</paper-button>
+ <paper-button raised onclick="actions.open()">dialog with actions</paper-button>
+ <paper-button raised onclick="dropdownDialog.open()">dialog with dropdown</paper-button>
+ <paper-button raised onclick="nested.open()">dialog with nested dialog</paper-button>
+
+ <paper-dialog id="dialog">
+ <h2>Dialog Title</h2>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
+ irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ </paper-dialog>
+
+ <paper-dialog id="scrolling">
+ <h2>Scrolling</h2>
+ <paper-dialog-scrollable>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
+ irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
+ irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
+ irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
+ irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
+ irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
+ irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
+ irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
+ irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ </paper-dialog-scrollable>
+ <div class="buttons">
+ <paper-button dialog-dismiss>Cancel</paper-button>
+ <paper-button dialog-confirm autofocus>OK</paper-button>
+ </div>
+ </paper-dialog>
+
+ <paper-dialog id="actions">
+ <h2>Dialog Title</h2>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
+ irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <div class="buttons">
+ <paper-button>More Info...</paper-button>
+ <paper-button dialog-dismiss>Decline</paper-button>
+ <paper-button dialog-confirm autofocus>Accept</paper-button>
+ </div>
+ </paper-dialog>
+
+ <paper-dialog id="modal" modal>
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
+ <div class="buttons">
+ <paper-button dialog-confirm autofocus>Tap me to close</paper-button>
+ </div>
+ </paper-dialog>
+
+ <paper-dialog id="dropdownDialog">
+ <h2>Dialog Title</h2>
+ <paper-dropdown-menu-light label="Value">
+ <!--
+ support hybrid mode:
+ paper-dropdown-menu-light 1.x distributes via <content select=".dropdown-content">
+ paper-dropdown-menu-light 2.x distributes via <slot name="dropdown-content">
+ -->
+ <paper-listbox class="dropdown-content" slot="dropdown-content">
+ <paper-item>1</paper-item>
+ <paper-item>2</paper-item>
+ <paper-item>3</paper-item>
+ <paper-item>4</paper-item>
+ <paper-item>5</paper-item>
+ <paper-item>6</paper-item>
+ <paper-item>7</paper-item>
+ <paper-item>8</paper-item>
+ <paper-item>9</paper-item>
+ <paper-item>10</paper-item>
+ </paper-listbox>
+ </paper-dropdown-menu-light>
+ </paper-dialog>
+
+ <paper-dialog id="nested">
+ <h2>Dialog Title</h2>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
+ irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <div class="buttons">
+ <paper-button onclick="innerDialog.open()">Open nested dialog</paper-button>
+ </div>
+ </paper-dialog>
+
+ <paper-dialog id="innerDialog">
+ <h2>Dialog Title</h2>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+ </paper-dialog>
+ </template>
+ </demo-snippet>
+
+ <h3>Styling and positioning</h3>
+ <demo-snippet>
+ <template>
+ <style>
+ paper-dialog.colored {
+ border: 2px solid;
+ border-color: #4caf50;
+ background-color: #f1f8e9;
+ color: #4caf50;
+ }
+
+ paper-dialog.size-position {
+ position: fixed;
+ top: 16px;
+ right: 16px;
+ width: 300px;
+ height: 300px;
+ overflow: auto;
+ }
+ </style>
+ <paper-button raised onclick="colors.open()">colors</paper-button>
+ <paper-button raised onclick="position.open()">size &amp; position</paper-button>
+
+ <paper-dialog id="colors" class="colored">
+ <h2>Custom Colors</h2>
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
+ dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ </paper-dialog>
+
+ <paper-dialog id="position" class="size-position">
+ <h2>Custom Size &amp; Position</h2>
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
+ dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ </paper-dialog>
+ </template>
+ </demo-snippet>
+
+ <h3>Position with <code>positionTarget</code></h3>
+ <demo-snippet>
+ <template>
+ <style is="custom-style">
+ #alignedDialog {
+ margin: 0;
+ }
+ </style>
+ <paper-button raised onclick="openBy(this)">Open</paper-button>
+ <paper-button raised onclick="openBy(this)">Open</paper-button>
+ <paper-button raised onclick="openBy(this)">Open</paper-button>
+
+ <paper-dialog id="alignedDialog" no-overlap horizontal-align="left" vertical-align="top">
+ <h2>Aligned dialog</h2>
+ <paper-dialog-scrollable>
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
+ dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </paper-dialog-scrollable>
+ </paper-dialog>
+
+ <script>
+ function openBy(element) {
+ alignedDialog.positionTarget = element;
+ alignedDialog.open();
+ }
+ </script>
+ </template>
+ </demo-snippet>
+
+ <h3>Transitions with neon-animation</h3>
+ <demo-snippet>
+ <template>
+ <paper-button raised onclick="animated.open()">open</paper-button>
+ <paper-dialog id="animated" entry-animation="scale-up-animation" exit-animation="fade-out-animation" with-backdrop>
+ <h2>Dialog Title</h2>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
+ irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ </paper-dialog>
+ </template>
+ </demo-snippet>
+
+</body>
+
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/hero.svg b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/hero.svg
new file mode 100755
index 00000000000..713329b8470
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/hero.svg
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">
+<g id="background" display="none">
+ <rect display="inline" fill="#B0BEC5" width="225" height="126"/>
+</g>
+<g id="label">
+</g>
+<g id="art">
+ <g>
+ <polygon points="0,124 0,126 2,126 "/>
+ <polygon points="0,111.6 0,114.4 11.6,126 14.4,126 "/>
+ <polygon points="0,99.1 0,101.9 24.1,126 26.9,126 "/>
+ <polygon points="0,86.6 0,89.5 36.5,126 39.4,126 "/>
+ <polygon points="0,74.2 0,77 49,126 51.8,126 "/>
+ <polygon points="0,61.7 0,64.5 61.5,126 64.3,126 "/>
+ <polygon points="0,49.2 0,52.1 73.9,126 76.8,126 "/>
+ <polygon points="0,36.8 0,39.6 86.4,126 89.2,126 "/>
+ <polygon points="0,24.3 0,27.1 98.9,126 101.7,126 "/>
+ <polygon points="75.2,87 74,87 74,85.8 0,11.8 0,14.7 111.3,126 114.2,126 "/>
+ <polygon points="87.6,87 84.8,87 123.8,126 126.6,126 "/>
+ <polygon points="74,76.2 74,73.4 0.6,0 0,0 0,2.2 "/>
+ <polygon points="74,63.7 74,60.9 13.1,0 10.3,0 "/>
+ <polygon points="100.1,87 97.3,87 136.3,126 139.1,126 "/>
+ <polygon points="112.6,87 109.7,87 148.7,126 151.6,126 "/>
+ <polygon points="74,51.3 74,48.4 25.6,0 22.7,0 "/>
+ <polygon points="125,87 122.2,87 161.2,126 164,126 "/>
+ <polygon points="74.2,39 77,39 38,0 35.2,0 "/>
+ <polygon points="86.7,39 89.5,39 50.5,0 47.7,0 "/>
+ <polygon points="137.5,87 134.7,87 173.7,126 176.5,126 "/>
+ <polygon points="150,87 147.1,87 186.1,126 189,126 "/>
+ <polygon points="99.1,39 102,39 63,0 60.1,0 "/>
+ <polygon points="150,74.6 150,77.4 198.6,126 201.4,126 "/>
+ <polygon points="111.6,39 114.4,39 75.4,0 72.6,0 "/>
+ <polygon points="150,62.1 150,64.9 211.1,126 213.9,126 "/>
+ <polygon points="124.1,39 126.9,39 87.9,0 85.1,0 "/>
+ <polygon points="100.3,0 97.5,0 136.5,39 139.3,39 "/>
+ <polygon points="150,49.7 150,52.5 223.5,126 225,126 225,124.7 "/>
+ <polygon points="112.8,0 110,0 149,39 150,39 150,40 225,115 225,112.2 "/>
+ <polygon points="125.3,0 122.5,0 225,102.5 225,99.7 "/>
+ <polygon points="137.7,0 134.9,0 225,90.1 225,87.3 "/>
+ <polygon points="150.2,0 147.4,0 225,77.6 225,74.8 "/>
+ <polygon points="162.7,0 159.8,0 225,65.2 225,62.3 "/>
+ <polygon points="175.1,0 172.3,0 225,52.7 225,49.9 "/>
+ <polygon points="187.6,0 184.8,0 225,40.2 225,37.4 "/>
+ <polygon points="200.1,0 197.2,0 225,27.8 225,24.9 "/>
+ <polygon points="212.5,0 209.7,0 225,15.3 225,12.5 "/>
+ <polygon points="225,0 222.2,0 225,2.8 225,0 "/>
+ </g>
+ <g id="ic_x5F_add_x0D_">
+ </g>
+ <path d="M151,88H73V38h78V88z M75,86h74V40H75V86z"/>
+</g>
+<g id="Guides">
+</g>
+</svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/index.html
new file mode 100644
index 00000000000..6304b8dc641
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/index.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+
+ <title>paper-dialog</title>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../polymer/polymer.html">
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/package-lock.json
new file mode 100644
index 00000000000..8d41a624459
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/package-lock.json
@@ -0,0 +1,1196 @@
+{
+ "name": "@polymer/paper-dialog",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.1.tgz",
+ "integrity": "sha512-N0rNp+F8Cp0iQ40i3Lx3onWnRXMnfMosR9WFE+IHMF4k5Fv2toRYz77EZMEPPZCz1tzFmCUelHxvxpdssT9oCw==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.2",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.7"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.7"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.7",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.7.tgz",
+ "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.7"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.7"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.8.tgz",
+ "integrity": "sha512-QqR0j08RCS1AQYPMRPHikEpcmK+2aEEbcSzWLwOqyJ4FhLmHUx/WjRrnn7tTQg/y4IKnMhzskh/o7qvGIZZ7iA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.7"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.3",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.40",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.40.tgz",
+ "integrity": "sha512-AVxF2EcxvGD5hhOuLTOLAXBb0VhwWpEX0HyHdAI2zU+AAP4qEwtQj8voz1JR3uclGai0rfcE+dCTHnNMOnimFg==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.2.tgz",
+ "integrity": "sha512-hICrJJ5zUI7hnEBBluE2169CG3Xnn4D5HPeLkMjbiOyneSLTUX5Wz1d4FSi3xALUtzulIBStSt0S2tLXs8eVrg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.3.tgz",
+ "integrity": "sha512-7Z5PPegwDTyjbaeCnV0efcyS6vdKAU51kpEmS7QFib3P4822l8ICYyMn7qvJnc+WzLoDsuI9gPMKbJ8pCu8XtA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.8",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.102",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.40",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.9.0",
+ "resolve": "1.5.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.102",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.102.tgz",
+ "integrity": "sha512-EhNufyBoC1Kqaj+XMHGzi6mPUC8wVABOMTPE5XaSJc49LIVvXsyrV1HYMAPTUViT7E4wLUB38OdDmb+HshjGmA==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.9.0.tgz",
+ "integrity": "sha512-WPOqlV2W/M4Ni40QIqYSv8PE7H4rjiPm1KEf02QPtjZOGlAC4Rv7e6UJ1Ke1O70WT5bydcsEn3LViFIqYpVOJw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.102",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.102",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.102.tgz",
+ "integrity": "sha512-EhNufyBoC1Kqaj+XMHGzi6mPUC8wVABOMTPE5XaSJc49LIVvXsyrV1HYMAPTUViT7E4wLUB38OdDmb+HshjGmA==",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
+ "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/package.json
new file mode 100644
index 00000000000..74415a17d2c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@polymer/paper-dialog",
+ "private": true,
+ "description": "A Material Design dialog",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-dialog"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.1",
+ "bower": "^1.8.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir ."
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/paper-dialog.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/paper-dialog.d.ts
new file mode 100644
index 00000000000..0be18119e23
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/paper-dialog.d.ts
@@ -0,0 +1,74 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-dialog.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../neon-animation/neon-animation-runner-behavior.d.ts" />
+/// <reference path="../paper-dialog-behavior/paper-dialog-behavior.d.ts" />
+/// <reference path="../paper-dialog-behavior/paper-dialog-shared-styles.d.ts" />
+
+/**
+ * Material design: [Dialogs](https://www.google.com/design/spec/components/dialogs.html)
+ *
+ * `<paper-dialog>` is a dialog with Material Design styling and optional animations when it is
+ * opened or closed. It provides styles for a header, content area, and an action area for buttons.
+ * You can use the `<paper-dialog-scrollable>` element (in its own repository) if you need a scrolling
+ * content area. To autofocus a specific child element after opening the dialog, give it the `autofocus`
+ * attribute. See `Polymer.PaperDialogBehavior` and `Polymer.IronOverlayBehavior` for specifics.
+ *
+ * For example, the following code implements a dialog with a header, scrolling content area and
+ * buttons. Focus will be given to the `dialog-confirm` button when the dialog is opened.
+ *
+ * <paper-dialog>
+ * <h2>Header</h2>
+ * <paper-dialog-scrollable>
+ * Lorem ipsum...
+ * </paper-dialog-scrollable>
+ * <div class="buttons">
+ * <paper-button dialog-dismiss>Cancel</paper-button>
+ * <paper-button dialog-confirm autofocus>Accept</paper-button>
+ * </div>
+ * </paper-dialog>
+ *
+ * ### Styling
+ *
+ * See the docs for `Polymer.PaperDialogBehavior` for the custom properties available for styling
+ * this element.
+ *
+ * ### Animations
+ *
+ * Set the `entry-animation` and/or `exit-animation` attributes to add an animation when the dialog
+ * is opened or closed. See the documentation in
+ * [PolymerElements/neon-animation](https://github.com/PolymerElements/neon-animation) for more info.
+ *
+ * For example:
+ *
+ * <link rel="import" href="components/neon-animation/animations/scale-up-animation.html">
+ * <link rel="import" href="components/neon-animation/animations/fade-out-animation.html">
+ *
+ * <paper-dialog entry-animation="scale-up-animation"
+ * exit-animation="fade-out-animation">
+ * <h2>Header</h2>
+ * <div>Dialog body</div>
+ * </paper-dialog>
+ *
+ * ### Accessibility
+ *
+ * See the docs for `Polymer.PaperDialogBehavior` for accessibility features implemented by this
+ * element.
+ */
+interface PaperDialogElement extends Polymer.Element, Polymer.PaperDialogBehavior, Polymer.NeonAnimationRunnerBehavior {
+ _renderOpened(): void;
+ _renderClosed(): void;
+ _onNeonAnimationFinish(): void;
+}
+
+interface HTMLElementTagNameMap {
+ "paper-dialog": PaperDialogElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/paper-dialog.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/paper-dialog.html
new file mode 100644
index 00000000000..82874670131
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-dialog/paper-dialog.html
@@ -0,0 +1,109 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../neon-animation/neon-animation-runner-behavior.html">
+<link rel="import" href="../paper-dialog-behavior/paper-dialog-behavior.html">
+<link rel="import" href="../paper-dialog-behavior/paper-dialog-shared-styles.html">
+<!--
+Material design: [Dialogs](https://www.google.com/design/spec/components/dialogs.html)
+
+`<paper-dialog>` is a dialog with Material Design styling and optional animations when it is
+opened or closed. It provides styles for a header, content area, and an action area for buttons.
+You can use the `<paper-dialog-scrollable>` element (in its own repository) if you need a scrolling
+content area. To autofocus a specific child element after opening the dialog, give it the `autofocus`
+attribute. See `Polymer.PaperDialogBehavior` and `Polymer.IronOverlayBehavior` for specifics.
+
+For example, the following code implements a dialog with a header, scrolling content area and
+buttons. Focus will be given to the `dialog-confirm` button when the dialog is opened.
+
+ <paper-dialog>
+ <h2>Header</h2>
+ <paper-dialog-scrollable>
+ Lorem ipsum...
+ </paper-dialog-scrollable>
+ <div class="buttons">
+ <paper-button dialog-dismiss>Cancel</paper-button>
+ <paper-button dialog-confirm autofocus>Accept</paper-button>
+ </div>
+ </paper-dialog>
+
+### Styling
+
+See the docs for `Polymer.PaperDialogBehavior` for the custom properties available for styling
+this element.
+
+### Animations
+
+Set the `entry-animation` and/or `exit-animation` attributes to add an animation when the dialog
+is opened or closed. See the documentation in
+[PolymerElements/neon-animation](https://github.com/PolymerElements/neon-animation) for more info.
+
+For example:
+
+ <link rel="import" href="components/neon-animation/animations/scale-up-animation.html">
+ <link rel="import" href="components/neon-animation/animations/fade-out-animation.html">
+
+ <paper-dialog entry-animation="scale-up-animation"
+ exit-animation="fade-out-animation">
+ <h2>Header</h2>
+ <div>Dialog body</div>
+ </paper-dialog>
+
+### Accessibility
+
+See the docs for `Polymer.PaperDialogBehavior` for accessibility features implemented by this
+element.
+
+@group Paper Elements
+@element paper-dialog
+@hero hero.svg
+@demo demo/index.html
+-->
+
+<dom-module id="paper-dialog">
+ <template>
+ <style include="paper-dialog-shared-styles"></style>
+ <slot></slot>
+ </template>
+</dom-module>
+
+<script>
+Polymer({
+ is: 'paper-dialog',
+
+ behaviors: [
+ Polymer.PaperDialogBehavior,
+ Polymer.NeonAnimationRunnerBehavior
+ ],
+
+ listeners: {
+ 'neon-animation-finish': '_onNeonAnimationFinish'
+ },
+
+ _renderOpened: function() {
+ this.cancelAnimation();
+ this.playAnimation('entry');
+ },
+
+ _renderClosed: function() {
+ this.cancelAnimation();
+ this.playAnimation('exit');
+ },
+
+ _onNeonAnimationFinish: function() {
+ if (this.opened) {
+ this._finishRenderOpened();
+ } else {
+ this._finishRenderClosed();
+ }
+ }
+});
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/.bower.json
new file mode 100644
index 00000000000..db0230cb866
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/.bower.json
@@ -0,0 +1,71 @@
+{
+ "name": "paper-icon-button",
+ "private": true,
+ "version": "2.2.0",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "A material design icon button",
+ "main": [
+ "paper-icon-button.html"
+ ],
+ "author": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "button",
+ "icon",
+ "control"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-icon-button.git"
+ },
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-icon": "PolymerElements/iron-icon#1 - 2",
+ "paper-behaviors": "PolymerElements/paper-behaviors#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-icons": "PolymerElements/iron-icons#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "ignore": [],
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-icon": "PolymerElements/iron-icon#^1.0.0",
+ "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-icons": "PolymerElements/iron-icons#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "homepage": "https://github.com/PolymerElements/paper-icon-button",
+ "_release": "2.2.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.2.0",
+ "commit": "bb7d6980b48866c63cd9466d155a8beabc8058d9"
+ },
+ "_source": "https://github.com/PolymerElements/paper-icon-button.git",
+ "_target": "^2.0.0",
+ "_originalSource": "paper-icon-button"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/.github/CODEOWNERS
new file mode 100644
index 00000000000..cc86f1ec217
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @notwaldorf
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..c80193d9f2a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/paper-icon-button/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/.travis.yml
new file mode 100644
index 00000000000..3f775b36e72
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/.travis.yml
@@ -0,0 +1,30 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+env:
+ global:
+ - secure: >-
+ HdHTMNdAamEtP+Nl5/mL2X7IKba4p2+ljpDSnvkA6gyoLzrWRZAyUjJxGjVRutQejTa8ZLOGXnBYKugSIMrGv8cblvngbhEmIHd2HBnPjd140KNwtsCtzPRDMdJMrvekVOXgpCkecmGq9G/j0WOoOnYY9oJrHB5dFy0y7LfPy6w=
+ - secure: >-
+ XjZRR/HW23UneacknoaYle/dg2Diupr9p9UOWLR7w6ejvwIP99nUF0Bh4trZkUiXBBt29HOBoETwBTMizDHNg8vKe544EgR26Fq4Lwk5EuEHy3xeyroiHlwc56ZC9Obye1kdM3QjU6rzJ7F9NuRL2E0ttgZjt/OnM+vKx3kqGOY=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+ sauce_connect: true
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/README.md
new file mode 100644
index 00000000000..0fe349c4e0c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/README.md
@@ -0,0 +1,92 @@
+
+<!---
+
+This README is automatically generated from the comments in these files:
+paper-icon-button-light.html paper-icon-button.html
+
+Edit those files, and our readme bot will duplicate them over here!
+Edit this file, and the bot will squash your changes :)
+
+The bot does some handling of markdown. Please file a bug if it does the wrong
+thing! https://github.com/PolymerLabs/tedium/issues
+
+-->
+
+[![Build status](https://travis-ci.org/PolymerElements/paper-icon-button.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-icon-button)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/paper-icon-button)_
+
+
+## &lt;paper-icon-button&gt;
+
+Material design: [Icon toggles](https://www.google.com/design/spec/components/buttons.html#buttons-toggle-buttons)
+
+`paper-icon-button` is a button with an image placed at the center. When the user touches
+the button, a ripple effect emanates from the center of the button.
+
+`paper-icon-button` does not include a default icon set. To use icons from the default
+set, include `PolymerElements/iron-icons/iron-icons.html`, and use the `icon` attribute to specify which icon
+from the icon set to use.
+
+<!---
+```html
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="paper-icon-button.html">
+ <link rel="import" href="../iron-icons/iron-icons.html">
+ <next-code-block></next-code-block>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<paper-icon-button icon="favorite"></paper-icon-button>
+<paper-icon-button icon="menu"></paper-icon-button>
+<paper-icon-button icon="star"></paper-icon-button>
+```
+
+See [`iron-iconset`](https://github.com/PolymerElements/iron-iconset) for more information about
+how to use a custom icon set.
+
+Example:
+
+```html
+<link href="path/to/iron-icons/iron-icons.html" rel="import">
+
+<paper-icon-button icon="favorite"></paper-icon-button>
+<paper-icon-button src="star.png"></paper-icon-button>
+```
+
+To use `paper-icon-button` as a link, wrap it in an anchor tag. Since `paper-icon-button`
+will already receive focus, you may want to prevent the anchor tag from receiving focus
+as well by setting its tabindex to -1.
+
+```html
+<a href="https://www.polymer-project.org" tabindex="-1">
+ <paper-icon-button icon="polymer"></paper-icon-button>
+</a>
+```
+
+### Styling
+
+Style the button with CSS as you would a normal DOM element. If you are using the icons
+provided by `iron-icons`, they will inherit the foreground color of the button.
+
+```html
+/* make a red "favorite" button */
+<paper-icon-button icon="favorite" style="color: red;"></paper-icon-button>
+```
+
+By default, the ripple is the same color as the foreground at 25% opacity. You may
+customize the color using the `--paper-icon-button-ink-color` custom property.
+
+The following custom properties and mixins are available for styling:
+
+| Custom property | Description | Default |
+| --- | --- | --- |
+| `--paper-icon-button-disabled-text` | The color of the disabled button | `--disabled-text-color` |
+| `--paper-icon-button-ink-color` | Selected/focus ripple color | `--primary-text-color` |
+| `--paper-icon-button` | Mixin for a button | `{}` |
+| `--paper-icon-button-disabled` | Mixin for a disabled button | `{}` |
+| `--paper-icon-button-hover` | Mixin for button on hover | `{}` |
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/bower.json
new file mode 100644
index 00000000000..9f3da88a85b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/bower.json
@@ -0,0 +1,61 @@
+{
+ "name": "paper-icon-button",
+ "private": true,
+ "version": "2.2.0",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "A material design icon button",
+ "main": [
+ "paper-icon-button.html"
+ ],
+ "author": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "button",
+ "icon",
+ "control"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-icon-button.git"
+ },
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-icon": "PolymerElements/iron-icon#1 - 2",
+ "paper-behaviors": "PolymerElements/paper-behaviors#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-icons": "PolymerElements/iron-icons#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "ignore": [],
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-icon": "PolymerElements/iron-icon#^1.0.0",
+ "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-icons": "PolymerElements/iron-icons#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/demo/index.html
new file mode 100644
index 00000000000..9347d9346f6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/demo/index.html
@@ -0,0 +1,111 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+ <head>
+ <title>paper-icon-button demo</title>
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../iron-icons/iron-icons.html">
+ <link rel="import" href="../../paper-styles/color.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../paper-icon-button.html">
+
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles">
+ paper-icon-button {
+ margin-left: 10px;
+ margin-right: 10px;
+ }
+ </style>
+ </custom-style>
+ </head>
+ <body unresolved>
+ <div class="vertical-section-container centered">
+ <h3>Buttons can use iron-icons or external images, and can be disabled</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <paper-icon-button icon="favorite" title="heart"></paper-icon-button>
+ <paper-icon-button src="https://assets-cdn.github.com/images/modules/logos_page/Octocat.png" alt="octocat" title="octocat"></paper-icon-button>
+ <paper-icon-button disabled icon="reply" title="reply"></paper-icon-button>
+ </template>
+ </demo-snippet>
+
+ <h3>Buttons can hide the ripple effect using the <i>noink</i> attribute</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <paper-icon-button noink icon="find-in-page" title="find"></paper-icon-button>
+ </template>
+ </demo-snippet>
+
+ <h3>Buttons can be styled using regular CSS and custom properties</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ paper-icon-button.pink {
+ color: var(--paper-pink-500);
+ --paper-icon-button-ink-color: var(--paper-indigo-500);
+ }
+ paper-icon-button.pink:hover {
+ background-color: var(--paper-pink-500);
+ color: white;
+ }
+ paper-icon-button.blue {
+ --paper-icon-button-ink-color: var(--paper-orange-500);
+ background-color: var(--paper-light-blue-500);
+ color: white;
+ border-radius: 3px;
+ padding: 2px;
+ }
+ </style>
+ </custom-style>
+ <paper-icon-button icon="favorite" title="heart" class="pink"></paper-icon-button>
+ <paper-icon-button icon="flight-takeoff" title="take off" class="blue"></paper-icon-button>
+ </template>
+ </demo-snippet>
+
+ <h3>Buttons can be resized</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ paper-icon-button.giant {
+ width: 100px;
+ height: 100px;
+ }
+ </style>
+ </custom-style>
+ <paper-icon-button icon="alarm-on" title="wake up" class="giant"></paper-icon-button>
+ </template>
+ </demo-snippet>
+
+ <h3>Buttons can be used as a link</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <a href="https://www.polymer-project.org" tabindex="-1">
+ <paper-icon-button icon="polymer"></paper-icon-button>
+ </a>
+ <custom-style>
+ <style is="custom-style">
+ a paper-icon-button,
+ a:active paper-icon-button,
+ a:visited paper-icon-button {
+ color: #000000;
+ }
+ </style>
+ </custom-style>
+ </template>
+ </demo-snippet>
+ </div>
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/demo/paper-icon-button-light.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/demo/paper-icon-button-light.html
new file mode 100644
index 00000000000..7437b251556
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/demo/paper-icon-button-light.html
@@ -0,0 +1,68 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+ <head>
+ <title>paper-icon-button-light demo</title>
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../iron-icon/iron-icon.html">
+ <link rel="import" href="../../iron-icons/iron-icons.html">
+ <link rel="import" href="../../paper-styles/color.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../paper-icon-button-light.html">
+
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles"></style>
+ </custom-style>
+ </head>
+ <body unresolved>
+ <div class="vertical-section-container centered">
+ <h3>paper-icon-button-light can contain iron-icons or external images and can be disabled</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ paper-icon-button-light {
+ width: 40px;
+ height: 40px;
+ margin: 10px;
+ }
+ paper-icon-button-light img {
+ width: 24px;
+ height: 24px;
+ }
+ </style>
+ </custom-style>
+
+ <paper-icon-button-light>
+ <button title="heart">
+ <iron-icon icon="favorite"></iron-icon>
+ </button>
+ </paper-icon-button-light>
+
+ <paper-icon-button-light>
+ <button title="octocat">
+ <img src="https://assets-cdn.github.com/images/modules/logos_page/Octocat.png" alt="octocat">
+ </button>
+ </paper-icon-button-light>
+
+ <paper-icon-button-light>
+ <button title="reply" disabled>
+ <iron-icon icon="reply"></iron-icon>
+ </button>
+ </paper-icon-button-light>
+ </template>
+ </demo-snippet>
+ </div>
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/index.html
new file mode 100644
index 00000000000..78f963c7e89
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/index.html
@@ -0,0 +1,23 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <script src="../webcomponentsjs/webcomponents.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/package-lock.json
new file mode 100644
index 00000000000..bd317fe2c58
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/package-lock.json
@@ -0,0 +1,983 @@
+{
+ "name": "@polymer/paper-icon-button",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.0.tgz",
+ "integrity": "sha512-a5DFXI3TdZSVOMH4608LVaBLmcr+mwM2+B8OSBiB9WFNCtdqzUXwtB5We6vBzrThXlO4uRo7d2pEqjNXMAlEkA==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "4.1.0",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.12"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.6.tgz",
+ "integrity": "sha512-CTUtLb6WqCCgp6P59QintjHWqzf4VL1uPA27bipLAPxFqrtK1gEYllePzTICGqQ8rYsCbpnsNypXjjDzGAAjEQ==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.8.tgz",
+ "integrity": "sha512-QqR0j08RCS1AQYPMRPHikEpcmK+2aEEbcSzWLwOqyJ4FhLmHUx/WjRrnn7tTQg/y4IKnMhzskh/o7qvGIZZ7iA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.0.0.tgz",
+ "integrity": "sha512-v+0wW9Wezwsyb0uF4aBVCjmSqit3Ru7PZFziGF0o2KwTvN2zWfTi3BRLq9EkJFdg3eBbyERXGTntVpBxH1J68Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.3",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
+ "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "4.0.0",
+ "array-back": "2.0.0",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.3.tgz",
+ "integrity": "sha512-7Z5PPegwDTyjbaeCnV0efcyS6vdKAU51kpEmS7QFib3P4822l8ICYyMn7qvJnc+WzLoDsuI9gPMKbJ8pCu8XtA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.8",
+ "winston": "2.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-QQL70IC85hI6q9uQeresEMcT1Qf8YR/zDe1qG8WWeeFAZk8z0lmzUpsfcAWz+bM4wpDdXrtd4HitIs4p0CHl/w==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.101",
+ "@types/parse5": "2.2.34",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "polymer-project-config": "3.9.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.9.0.tgz",
+ "integrity": "sha512-WPOqlV2W/M4Ni40QIqYSv8PE7H4rjiPm1KEf02QPtjZOGlAC4Rv7e6UJ1Ke1O70WT5bydcsEn3LViFIqYpVOJw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.101",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/package.json
new file mode 100644
index 00000000000..3923985b2d4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@polymer/paper-icon-button",
+ "private": true,
+ "description": "A material design icon button",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-icon-button.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir ."
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/paper-icon-button-light.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/paper-icon-button-light.d.ts
new file mode 100644
index 00000000000..49271d7dc49
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/paper-icon-button-light.d.ts
@@ -0,0 +1,50 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-icon-button-light.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../paper-behaviors/paper-ripple-behavior.d.ts" />
+
+/**
+ * This is a lighter version of `paper-icon-button`. Its goal is performance, not
+ * developer ergonomics, so as a result it has fewer features than `paper-icon-button`
+ * itself. To use it, you must distribute a `button` containing the `iron-icon` you
+ * want to use:
+ *
+ * <link rel="import" href="../iron-icon/iron-icon.html">
+ * <link rel="import" href="../paper-icon-button/paper-icon-button-light.html">
+ * <link rel="import" href="../iron-icons/iron-icons.html">
+ *
+ * <paper-icon-button-light>
+ * <button title="heart">
+ * <iron-icon icon="favorite"></iron-icon>
+ * </button>
+ * </paper-icon-button-light>
+ *
+ * Note that this button is assumed to be distributed at the startup of
+ * `paper-icon-button-light`. Dynamically adding a `button` to this element is
+ * not supported.
+ *
+ * The `title`/`disabled` etc. attributes go on the distributed button, not on the wrapper.
+ *
+ * The following custom properties and mixins are also available for styling:
+ * Custom property | Description | Default
+ * ----------------|-------------|----------
+ * `--paper-icon-button-light-ripple` | Mixin applied to the paper ripple | `{}`
+ */
+interface PaperIconButtonLightElement extends Polymer.Element, Polymer.PaperRippleBehavior {
+ ensureRipple(...var_args: any[]): void;
+ ready(): void;
+ _rippleDown(): void;
+ _rippleUp(): void;
+}
+
+interface HTMLElementTagNameMap {
+ "paper-icon-button-light": PaperIconButtonLightElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/paper-icon-button-light.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/paper-icon-button-light.html
new file mode 100644
index 00000000000..25c9e92daed
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/paper-icon-button-light.html
@@ -0,0 +1,130 @@
+<!--
+@license
+Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../paper-behaviors/paper-ripple-behavior.html">
+
+<!--
+This is a lighter version of `paper-icon-button`. Its goal is performance, not
+developer ergonomics, so as a result it has fewer features than `paper-icon-button`
+itself. To use it, you must distribute a `button` containing the `iron-icon` you
+want to use:
+
+<link rel="import" href="../iron-icon/iron-icon.html">
+<link rel="import" href="../paper-icon-button/paper-icon-button-light.html">
+<link rel="import" href="../iron-icons/iron-icons.html">
+
+<paper-icon-button-light>
+ <button title="heart">
+ <iron-icon icon="favorite"></iron-icon>
+ </button>
+</paper-icon-button-light>
+
+Note that this button is assumed to be distributed at the startup of
+`paper-icon-button-light`. Dynamically adding a `button` to this element is
+not supported.
+
+The `title`/`disabled` etc. attributes go on the distributed button, not on the wrapper.
+
+The following custom properties and mixins are also available for styling:
+Custom property | Description | Default
+----------------|-------------|----------
+`--paper-icon-button-light-ripple` | Mixin applied to the paper ripple | `{}`
+
+@group Paper Elements
+@element paper-icon-button-light
+@demo demo/paper-icon-button-light.html
+-->
+
+<dom-module id="paper-icon-button-light">
+ <template strip-whitespace>
+ <style>
+ :host {
+ display: inline-block;
+ position: relative;
+ width: 24px;
+ height: 24px;
+ }
+
+ paper-ripple {
+ opacity: 0.6;
+ color: currentColor;
+ @apply(--paper-icon-button-light-ripple);
+ }
+
+ :host > ::slotted(button) {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ background: none;
+ border: none;
+ outline: none;
+ vertical-align: middle;
+ color: inherit;
+ cursor: pointer;
+ /* NOTE: Both values are needed, since some phones require the value to be `transparent`. */
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+ -webkit-tap-highlight-color: transparent;
+ }
+ :host > ::slotted(button[disabled]) {
+ color: #9b9b9b;
+ pointer-events: none;
+ cursor: auto;
+ }
+ </style>
+ <slot></slot>
+ </template>
+
+ <script>
+ Polymer({
+ is: 'paper-icon-button-light',
+
+ behaviors: [
+ Polymer.PaperRippleBehavior
+ ],
+
+ ready: function() {
+ Polymer.RenderStatus.afterNextRender(this, () => {
+ // Add lazy host listeners
+ this.addEventListener('down', this._rippleDown.bind(this));
+ this.addEventListener('up', this._rippleUp.bind(this));
+
+ // Assume the button has already been distributed.
+ var button = this.getEffectiveChildren()[0];
+ this._rippleContainer = button;
+
+ // We need to set the focus/blur listeners on the distributed button,
+ // not the host, since the host isn't focusable.
+ button.addEventListener('focus', this._rippleDown.bind(this));
+ button.addEventListener('blur', this._rippleUp.bind(this));
+ });
+ },
+ _rippleDown: function() {
+ this.getRipple().uiDownAction();
+ },
+ _rippleUp: function() {
+ this.getRipple().uiUpAction();
+ },
+ /**
+ * @param {...*} var_args
+ */
+ ensureRipple: function(var_args) {
+ var lastRipple = this._ripple;
+ Polymer.PaperRippleBehavior.ensureRipple.apply(this, arguments);
+ if (this._ripple && this._ripple !== lastRipple) {
+ this._ripple.center = true;
+ this._ripple.classList.add('circle');
+ }
+ }
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/paper-icon-button.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/paper-icon-button.d.ts
new file mode 100644
index 00000000000..6c0ad02c0a4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/paper-icon-button.d.ts
@@ -0,0 +1,92 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-icon-button.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-icon/iron-icon.d.ts" />
+/// <reference path="../paper-behaviors/paper-inky-focus-behavior.d.ts" />
+/// <reference path="../paper-styles/default-theme.d.ts" />
+
+/**
+ * Material design: [Icon toggles](https://www.google.com/design/spec/components/buttons.html#buttons-toggle-buttons)
+ *
+ * `paper-icon-button` is a button with an image placed at the center. When the user touches
+ * the button, a ripple effect emanates from the center of the button.
+ *
+ * `paper-icon-button` does not include a default icon set. To use icons from the default
+ * set, include `PolymerElements/iron-icons/iron-icons.html`, and use the `icon` attribute to specify which icon
+ * from the icon set to use.
+ *
+ * <paper-icon-button icon="menu"></paper-icon-button>
+ *
+ * See [`iron-iconset`](iron-iconset) for more information about
+ * how to use a custom icon set.
+ *
+ * Example:
+ *
+ * <link href="path/to/iron-icons/iron-icons.html" rel="import">
+ *
+ * <paper-icon-button icon="favorite"></paper-icon-button>
+ * <paper-icon-button src="star.png"></paper-icon-button>
+ *
+ * To use `paper-icon-button` as a link, wrap it in an anchor tag. Since `paper-icon-button`
+ * will already receive focus, you may want to prevent the anchor tag from receiving focus
+ * as well by setting its tabindex to -1.
+ *
+ * <a href="https://www.polymer-project.org" tabindex="-1">
+ * <paper-icon-button icon="polymer"></paper-icon-button>
+ * </a>
+ *
+ * ### Styling
+ *
+ * Style the button with CSS as you would a normal DOM element. If you are using the icons
+ * provided by `iron-icons`, they will inherit the foreground color of the button.
+ *
+ * /* make a red "favorite" button *\/
+ * <paper-icon-button icon="favorite" style="color: red;"></paper-icon-button>
+ *
+ * By default, the ripple is the same color as the foreground at 25% opacity. You may
+ * customize the color using the `--paper-icon-button-ink-color` custom property.
+ *
+ * The following custom properties and mixins are available for styling:
+ *
+ * Custom property | Description | Default
+ * ----------------|-------------|----------
+ * `--paper-icon-button-disabled-text` | The color of the disabled button | `--disabled-text-color`
+ * `--paper-icon-button-ink-color` | Selected/focus ripple color | `--primary-text-color`
+ * `--paper-icon-button` | Mixin for a button | `{}`
+ * `--paper-icon-button-disabled` | Mixin for a disabled button | `{}`
+ * `--paper-icon-button-hover` | Mixin for button on hover | `{}`
+ */
+interface PaperIconButtonElement extends Polymer.Element, Polymer.PaperInkyFocusBehavior {
+
+ /**
+ * The URL of an image for the icon. If the src property is specified,
+ * the icon property should not be.
+ */
+ src: string|null|undefined;
+
+ /**
+ * Specifies the icon name or index in the set of icons available in
+ * the icon's icon set. If the icon property is specified,
+ * the src property should not be.
+ */
+ icon: string|null|undefined;
+
+ /**
+ * Specifies the alternate text for the button, for accessibility.
+ */
+ alt: string|null|undefined;
+ hostAttributes: object|null;
+ _altChanged(newValue: any, oldValue: any): void;
+}
+
+interface HTMLElementTagNameMap {
+ "paper-icon-button": PaperIconButtonElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/paper-icon-button.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/paper-icon-button.html
new file mode 100644
index 00000000000..3d857202aa5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-icon-button/paper-icon-button.html
@@ -0,0 +1,181 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-icon/iron-icon.html">
+<link rel="import" href="../paper-behaviors/paper-inky-focus-behavior.html">
+<link rel="import" href="../paper-styles/default-theme.html">
+
+<!--
+Material design: [Icon toggles](https://www.google.com/design/spec/components/buttons.html#buttons-toggle-buttons)
+
+`paper-icon-button` is a button with an image placed at the center. When the user touches
+the button, a ripple effect emanates from the center of the button.
+
+`paper-icon-button` does not include a default icon set. To use icons from the default
+set, include `PolymerElements/iron-icons/iron-icons.html`, and use the `icon` attribute to specify which icon
+from the icon set to use.
+
+ <paper-icon-button icon="menu"></paper-icon-button>
+
+See [`iron-iconset`](iron-iconset) for more information about
+how to use a custom icon set.
+
+Example:
+
+ <link href="path/to/iron-icons/iron-icons.html" rel="import">
+
+ <paper-icon-button icon="favorite"></paper-icon-button>
+ <paper-icon-button src="star.png"></paper-icon-button>
+
+To use `paper-icon-button` as a link, wrap it in an anchor tag. Since `paper-icon-button`
+will already receive focus, you may want to prevent the anchor tag from receiving focus
+as well by setting its tabindex to -1.
+
+ <a href="https://www.polymer-project.org" tabindex="-1">
+ <paper-icon-button icon="polymer"></paper-icon-button>
+ </a>
+
+### Styling
+
+Style the button with CSS as you would a normal DOM element. If you are using the icons
+provided by `iron-icons`, they will inherit the foreground color of the button.
+
+ /* make a red "favorite" button */
+ <paper-icon-button icon="favorite" style="color: red;"></paper-icon-button>
+
+By default, the ripple is the same color as the foreground at 25% opacity. You may
+customize the color using the `--paper-icon-button-ink-color` custom property.
+
+The following custom properties and mixins are available for styling:
+
+Custom property | Description | Default
+----------------|-------------|----------
+`--paper-icon-button-disabled-text` | The color of the disabled button | `--disabled-text-color`
+`--paper-icon-button-ink-color` | Selected/focus ripple color | `--primary-text-color`
+`--paper-icon-button` | Mixin for a button | `{}`
+`--paper-icon-button-disabled` | Mixin for a disabled button | `{}`
+`--paper-icon-button-hover` | Mixin for button on hover | `{}`
+
+@group Paper Elements
+@element paper-icon-button
+@demo demo/index.html
+-->
+
+<dom-module id="paper-icon-button">
+ <template strip-whitespace>
+ <style>
+ :host {
+ display: inline-block;
+ position: relative;
+ padding: 8px;
+ outline: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ cursor: pointer;
+ z-index: 0;
+ line-height: 1;
+
+ width: 40px;
+ height: 40px;
+
+ /* NOTE: Both values are needed, since some phones require the value to be `transparent`. */
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+ -webkit-tap-highlight-color: transparent;
+
+ /* Because of polymer/2558, this style has lower specificity than * */
+ box-sizing: border-box !important;
+
+ @apply --paper-icon-button;
+ }
+
+ :host #ink {
+ color: var(--paper-icon-button-ink-color, var(--primary-text-color));
+ opacity: 0.6;
+ }
+
+ :host([disabled]) {
+ color: var(--paper-icon-button-disabled-text, var(--disabled-text-color));
+ pointer-events: none;
+ cursor: auto;
+
+ @apply --paper-icon-button-disabled;
+ }
+
+ :host([hidden]) {
+ display: none !important;
+ }
+
+ :host(:hover) {
+ @apply --paper-icon-button-hover;
+ }
+
+ iron-icon {
+ --iron-icon-width: 100%;
+ --iron-icon-height: 100%;
+ }
+ </style>
+
+ <iron-icon id="icon" src="[[src]]" icon="[[icon]]" alt$="[[alt]]"></iron-icon>
+ </template>
+
+ <script>
+ Polymer({
+ is: 'paper-icon-button',
+
+ hostAttributes: {
+ role: 'button',
+ tabindex: '0'
+ },
+
+ behaviors: [
+ Polymer.PaperInkyFocusBehavior
+ ],
+
+ properties: {
+ /**
+ * The URL of an image for the icon. If the src property is specified,
+ * the icon property should not be.
+ */
+ src: {
+ type: String
+ },
+
+ /**
+ * Specifies the icon name or index in the set of icons available in
+ * the icon's icon set. If the icon property is specified,
+ * the src property should not be.
+ */
+ icon: {
+ type: String
+ },
+
+ /**
+ * Specifies the alternate text for the button, for accessibility.
+ */
+ alt: {
+ type: String,
+ observer: "_altChanged"
+ }
+ },
+
+ _altChanged: function(newValue, oldValue) {
+ var label = this.getAttribute('aria-label');
+
+ // Don't stomp over a user-set aria-label.
+ if (!label || oldValue == label) {
+ this.setAttribute('aria-label', newValue);
+ }
+ }
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/.bower.json
new file mode 100644
index 00000000000..00b2757adfb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/.bower.json
@@ -0,0 +1,93 @@
+{
+ "name": "paper-input",
+ "version": "2.0.5",
+ "description": "Material design text fields",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "input"
+ ],
+ "main": [
+ "paper-input.html",
+ "paper-textarea.html",
+ "paper-input-behavior.html",
+ "paper-input-container.html",
+ "paper-input-error.html",
+ "paper-input-addon-behavior.html",
+ "paper-input-char-counter.html"
+ ],
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-input.git"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-input",
+ "ignore": [],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-autogrow-textarea": "PolymerElements/iron-autogrow-textarea#1 - 2",
+ "iron-behaviors": "PolymerElements/iron-behaviors#1 - 2",
+ "iron-input": "PolymerElements/iron-input#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#1 - 2",
+ "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-icon": "PolymerElements/iron-icon#1 - 2",
+ "iron-icons": "PolymerElements/iron-icons#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "iron-validator-behavior": "PolymerElements/iron-validator-behavior#1 - 2",
+ "paper-icon-button": "PolymerElements/paper-icon-button#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-autogrow-textarea": "PolymerElements/iron-autogrow-textarea#^1.0.0",
+ "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
+ "iron-input": "PolymerElements/iron-input#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.1.4",
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0",
+ "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "iron-icon": "PolymerElements/iron-icon#^1.0.0",
+ "iron-icons": "PolymerElements/iron-icons#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "iron-validator-behavior": "PolymerElements/iron-validator-behavior#^1.0.0",
+ "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.0.5",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.0.5",
+ "commit": "f64825d59dda77bc9808c244ca15dd11649d1512"
+ },
+ "_source": "https://github.com/PolymerElements/paper-input.git",
+ "_target": "~2.0",
+ "_originalSource": "PolymerElements/paper-input"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..99b9301c95f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/paper-input/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/.travis.yml
new file mode 100644
index 00000000000..8c8c18209f2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/.travis.yml
@@ -0,0 +1,27 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+env:
+ global:
+ - secure: >-
+ Hg2KIEhKqOw0J8ZW2C3Pdgp5N4HD/f9jhdluH0tiYRCU4I/jf5grQuA3ohqsbqnJKV5l06gWVIDCdxBDwDEH0h8v9uUG5z/i2diiuLQc94SLQu8kWKkUPDOx+pUyXmfRKj6KnaRTotTLFrwlyuKDi9OfGjQbLZWTvmJUWoFwh4g=
+ - secure: >-
+ U6/Hp/V0ezT/yxeP2bv4S99LSLScKEaOfYwQUbe0+v5dPbN5XZaCUS6iSbNP2K8Mtb1UQUEyL8uN6Zn+khFlJ8/KJshppJ6HJi235CykahBhh9/Cv7EapgDUoss14ntE8EKpm6Ijo4LvVyPVmhgqKk9wP5ykDFtvhoKD4C3guVU=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+ sauce_connect: true
+script:
+ - xvfb-run polymer test -l chrome
+ - xvfb-run polymer test -l firefox
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/README.md
new file mode 100644
index 00000000000..4b24d6fd308
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/README.md
@@ -0,0 +1,44 @@
+[![Build status](https://travis-ci.org/PolymerElements/paper-input.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-input)
+[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://beta.webcomponents.org/element/PolymerElements/paper-input)
+
+## &lt;paper-input&gt;
+
+Material design: [Text fields](https://www.google.com/design/spec/components/text-fields.html)
+
+`<paper-input>` is a single-line text field with Material Design styling.
+
+<!---
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="paper-input.html">
+ <link rel="import" href="../iron-icons/iron-icons.html">
+ <style>
+ paper-input {
+ max-width: 400px;
+ margin: auto;
+ }
+ iron-icon, div[suffix] {
+ color: hsl(0, 0%, 50%);
+ margin-right: 12px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<paper-input always-float-label label="Floating label"></paper-input>
+<paper-input label="username">
+ <iron-icon icon="mail" slot="prefix"></iron-icon>
+ <div slot="suffix">@email.com</div>
+</paper-input>
+```
+
+### Changes in 2.0
+- Distribution is now done with slots, so things have changed because of that (before: <label>foo</label>, now <label slot="label">foo</label>; same for input, prefix and suffix)
+- Since type extensions are not available, any use of `<input is="iron-input">` has been replaced by `<iron-input><input></iron-input>`. See [iron-input](https://github.com/PolymerElements/iron-input) for more details about that change
+- `prevent-invalid-input` and `allowed-pattern` had to be always used together; deleted `prevent-invalid-input`, so that only `allowed-pattern` is needed
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/all-imports.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/all-imports.html
new file mode 100644
index 00000000000..0f457718644
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/all-imports.html
@@ -0,0 +1,12 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="paper-input.html">
+<link rel="import" href="paper-textarea.html">
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/bower.json
new file mode 100644
index 00000000000..d2703e8af8f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/bower.json
@@ -0,0 +1,84 @@
+{
+ "name": "paper-input",
+ "version": "2.0.5",
+ "description": "Material design text fields",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "input"
+ ],
+ "main": [
+ "paper-input.html",
+ "paper-textarea.html",
+ "paper-input-behavior.html",
+ "paper-input-container.html",
+ "paper-input-error.html",
+ "paper-input-addon-behavior.html",
+ "paper-input-char-counter.html"
+ ],
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-input.git"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-input",
+ "ignore": [],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-autogrow-textarea": "PolymerElements/iron-autogrow-textarea#1 - 2",
+ "iron-behaviors": "PolymerElements/iron-behaviors#1 - 2",
+ "iron-input": "PolymerElements/iron-input#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#1 - 2",
+ "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-icon": "PolymerElements/iron-icon#1 - 2",
+ "iron-icons": "PolymerElements/iron-icons#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "iron-validator-behavior": "PolymerElements/iron-validator-behavior#1 - 2",
+ "paper-icon-button": "PolymerElements/paper-icon-button#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-autogrow-textarea": "PolymerElements/iron-autogrow-textarea#^1.0.0",
+ "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
+ "iron-input": "PolymerElements/iron-input#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.1.4",
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0",
+ "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "iron-icon": "PolymerElements/iron-icon#^1.0.0",
+ "iron-icons": "PolymerElements/iron-icons#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "iron-validator-behavior": "PolymerElements/iron-validator-behavior#^1.0.0",
+ "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/demo/index.html
new file mode 100644
index 00000000000..73f417453aa
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/demo/index.html
@@ -0,0 +1,156 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <title>paper-input demo</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-icon/iron-icon.html">
+ <link rel="import" href="../../iron-icons/iron-icons.html">
+ <link rel="import" href="../../paper-icon-button/paper-icon-button.html">
+ <link rel="import" href="../../paper-styles/color.html">
+ <link rel="import" href="../paper-input-container.html">
+ <link rel="import" href="../paper-input-error.html">
+ <link rel="import" href="../paper-input.html">
+ <link rel="import" href="../paper-textarea.html">
+ <link rel="import" href="ssn-input.html">
+
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles">
+ paper-input {
+ display: block;
+ }
+
+ button {
+ width: 70px;
+ }
+
+ paper-icon-button {
+ color: var(--paper-red-300);
+ --paper-icon-button-ink-color: var(--paper-red-a100);
+ width: 23px; /* 15px + 2*4px for padding */
+ height: 23px;
+ padding: 0px 4px;
+ }
+
+ iron-icon {
+ padding-right: 5px;
+ }
+
+ #inputForValidation {
+ display: inline-block;
+ width: calc(100% - 75px);
+ }
+
+ demo-snippet.horizontal {
+ --demo-snippet-demo: {
+ @apply --layout-horizontal;
+ @apply --layout-justified;
+ @apply --layout-wrap;
+ }
+ }
+ demo-snippet.horizontal paper-input {
+ display: inline-block;
+ }
+ </style>
+ </custom-style>
+</head>
+<body unresolved>
+ <div class="vertical-section-container centered">
+ <h3>Inputs can have different types, and be disabled</h3>
+ <demo-snippet>
+ <template>
+ <paper-input label="text input"></paper-input>
+ <paper-input label="text input" value="pre-filled"></paper-input>
+ <paper-textarea label="autoresizing textarea input"></paper-textarea>
+ <paper-input label="password input" type="password"></paper-input>
+ <paper-input label="disabled input" disabled value="batman"></paper-input>
+ </template>
+ </demo-snippet>
+
+ <h3>Inputs can have character counters</h3>
+ <demo-snippet>
+ <template>
+ <paper-input label="simple character counter" char-counter></paper-input>
+ <paper-input label="input with at most 10 characters" char-counter maxlength="10"></paper-input>
+ </template>
+ </demo-snippet>
+
+ <h3>The label can have different floating states</h3>
+ <demo-snippet>
+ <template>
+ <paper-input label="this label floats after typing"></paper-input>
+ <paper-input label="this label is always floating" always-float-label></paper-input>
+ <paper-input label="this label never floats" no-label-float></paper-input>
+ <paper-input label="this label is always floating" always-float-label placeholder="placeholder text"></paper-input>
+ </template>
+ </demo-snippet>
+
+ <h3>Inputs can validate automatically or on demand, and can have custom error messages</h3>
+ <demo-snippet>
+ <template>
+ <paper-input label="this input requires some text" required auto-validate error-message="needs some text!"></paper-input>
+ <paper-input label="this input requires letters only" auto-validate pattern="[a-zA-Z]*" error-message="letters only!"></paper-input>
+ <paper-input label="this input requires letters only" auto-validate pattern="[a-zA-Z]*" error-message="letters only!" value="pre-filled 123"></paper-input>
+ <paper-input label="this input will only let you type letters" auto-validate allowed-pattern="[a-zA-Z]"></paper-input>
+ <paper-input id="inputForValidation" required label="this input is manually validated" pattern="[a-zA-Z]*" error-message="letters only!"></paper-input>
+
+ <button onclick="validate()">Validate!</button>
+ </template>
+ </demo-snippet>
+
+ <h3>Inputs can have prefixes and suffixes</h3>
+ <demo-snippet class="horizontal">
+ <template>
+ <paper-input label="total" type="number">
+ <div slot="prefix">$</div>
+ </paper-input>
+
+ <paper-input label="username" id="inputWithButton">
+ <iron-icon icon="mail" slot="prefix"></iron-icon>
+ <div slot="suffix">@email.com</div>
+ <paper-icon-button slot="suffix" onclick="clearInput()"
+ icon="clear" alt="clear" title="clear">
+ </paper-icon-button>
+ </paper-input>
+ </template>
+ </demo-snippet>
+
+ <h3>Inputs can have custom logic</h3>
+ <demo-snippet>
+ <template>
+ <paper-input-container always-float-label auto-validate attr-for-value="value">
+ <label slot="label">Social Security Number</label>
+ <ssn-input class="paper-input-input" slot="input"></ssn-input>
+ <paper-input-error slot="add-on">SSN invalid!</paper-input-error>
+ </paper-input-container>
+ </template>
+ </demo-snippet>
+ </div>
+
+ <script>
+ function validate() {
+ document.getElementById('inputForValidation').validate();
+ }
+
+ function clearInput() {
+ document.getElementById('inputWithButton').value = '';
+ }
+ </script>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/demo/ssn-input.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/demo/ssn-input.html
new file mode 100644
index 00000000000..6d9270d1f8c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/demo/ssn-input.html
@@ -0,0 +1,128 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-input/iron-input.html">
+<link rel="import" href="../../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="ssn-validator.html">
+
+<dom-module id="ssn-input">
+ <template>
+ <style>
+ :host {
+ display: inline-block;
+ }
+
+ :host([hidden]) {
+ display: none !important;
+ }
+
+ input {
+ font: inherit;
+ outline: none;
+ box-shadow: none;
+ border: none;
+ width: auto;
+ text-align: center;
+ }
+
+ .container {
+ @apply --layout-horizontal;
+ }
+ </style>
+
+ <ssn-validator></ssn-validator>
+ <div class="container">
+ <!-- To make the demo work with the hybrid element, we need to conditionally
+ load different templates: in 2.0 we lost is=, so the example same template
+ can't be used with iron-input 1.0 and 2.0.
+
+ You as a user of paper-input or paper-input-container don't
+ need to do this, unless you are trying to vend an element that uses
+ paper-input or paper-input-container _and_ works in both Polymer 1.0 or 2.0
+ -->
+ <span id="template-placeholder"></span>
+ </div>
+ </template>
+
+ <template id="v0">
+ <input is="iron-input" bind-value="{{_ssn1}}" maxlength="3" size="3" aria-label="First 3 digits of social security number">
+ -
+ <input is="iron-input" bind-value="{{_ssn2}}" maxlength="2" size="2" aria-label="Middle 2 digits of social security number">
+ -
+ <input is="iron-input" bind-value="{{_ssn3}}" maxlength="4" size="4" aria-label="Last 4 digits of social security number">
+ </template>
+
+ <template id="v1">
+ <iron-input bind-value="{{_ssn1}}" aria-label="First 3 digits of social security number">
+ <input maxlength="3" size="3">
+ </iron-input>
+ -
+ <iron-input bind-value="{{_ssn2}}" aria-label="Middle 2 digits of social security number">
+ <input maxlength="2" size="2">
+ </iron-input>
+ -
+ <iron-input bind-value="{{_ssn3}}" aria-label="Last 4 digits of social security number">
+ <input maxlength="4" size="4">
+ </iron-input>
+ </template>
+
+ <script>
+ Polymer({
+ is: 'ssn-input',
+
+ behaviors: [
+ Polymer.IronValidatableBehavior
+ ],
+
+ properties: {
+ value: {
+ notify: true,
+ type: String
+ },
+
+ _ssn1: {
+ type: String,
+ value: ''
+ },
+
+ _ssn2: {
+ type: String,
+ value: ''
+ },
+
+ _ssn3: {
+ type: String,
+ value: ''
+ },
+
+ validator: {
+ type: String,
+ value: 'ssn-validator'
+ }
+ },
+
+ observers: [
+ '_computeValue(_ssn1,_ssn2,_ssn3)'
+ ],
+
+ _computeValue: function(ssn1, ssn2, ssn3) {
+ this.value = ssn1.trim() + '-' + ssn2.trim() + '-' + ssn3.trim();
+ },
+
+ beforeRegister: function() {
+ var template = Polymer.DomModule.import('ssn-input', 'template');
+ var version = Polymer.Element ? 'v1' : 'v0';
+ var inputTemplate = Polymer.DomModule.import('ssn-input', 'template#' + version);
+ var inputPlaceholder = template.content.querySelector('#template-placeholder');
+ inputPlaceholder.parentNode.replaceChild(inputTemplate.content, inputPlaceholder);
+ },
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/demo/ssn-validator.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/demo/ssn-validator.html
new file mode 100644
index 00000000000..e45365b51b2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/demo/ssn-validator.html
@@ -0,0 +1,27 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-validator-behavior/iron-validator-behavior.html">
+
+<script>
+ Polymer({
+ is: 'ssn-validator',
+
+ behaviors: [
+ Polymer.IronValidatorBehavior
+ ],
+
+ validate: function(value) {
+ // this regex validates incomplete ssn's (by design)
+ return !value || value.match(/^[0-9]{0,3}-[0-9]{0,2}-[0-9]{0,4}$/);
+ }
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/hero.svg b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/hero.svg
new file mode 100755
index 00000000000..146ffeac67c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/hero.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">
+<g id="background" display="none">
+ <rect display="inline" fill="#B0BEC5" width="225" height="126"/>
+</g>
+<g id="label">
+</g>
+<g id="art">
+ <rect x="49" y="53" width="2" height="18"/>
+ <path d="M188,78H37V44h151V78z M39,76h147V46H39V76z"/>
+ <g id="ic_x5F_add_x0D_">
+ </g>
+</g>
+<g id="Guides">
+</g>
+</svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/index.html
new file mode 100644
index 00000000000..e6c9fadcee5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <title>paper-input</title>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page src="all-imports.html"></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input-addon-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input-addon-behavior.html
new file mode 100644
index 00000000000..7cc2a2a8797
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input-addon-behavior.html
@@ -0,0 +1,44 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<script>
+
+ /**
+ * Use `Polymer.PaperInputAddonBehavior` to implement an add-on for `<paper-input-container>`. A
+ * add-on appears below the input, and may display information based on the input value and
+ * validity such as a character counter or an error message.
+ * @polymerBehavior
+ */
+ Polymer.PaperInputAddonBehavior = {
+ attached: function() {
+ // Workaround for https://github.com/webcomponents/shadydom/issues/96
+ Polymer.dom.flush();
+ this.fire('addon-attached');
+ },
+
+ /**
+ * The function called by `<paper-input-container>` when the input value or validity changes.
+ * @param {{
+ * inputElement: (Element|undefined),
+ * value: (string|undefined),
+ * invalid: boolean
+ * }} state -
+ * inputElement: The input element.
+ * value: The input value.
+ * invalid: True if the input value is invalid.
+ */
+ update: function(state) {
+ }
+
+ };
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input-behavior.html
new file mode 100644
index 00000000000..566dc58e2e8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input-behavior.html
@@ -0,0 +1,566 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
+<link rel="import" href="../iron-behaviors/iron-control-state.html">
+
+<script>
+
+ // Generate unique, monotonically increasing IDs for labels (needed by
+ // aria-labelledby) and add-ons.
+ Polymer.PaperInputHelper = {};
+ Polymer.PaperInputHelper.NextLabelID = 1;
+ Polymer.PaperInputHelper.NextAddonID = 1;
+
+ /**
+ * Use `Polymer.PaperInputBehavior` to implement inputs with `<paper-input-container>`. This
+ * behavior is implemented by `<paper-input>`. It exposes a number of properties from
+ * `<paper-input-container>` and `<input is="iron-input">` and they should be bound in your
+ * template.
+ *
+ * The input element can be accessed by the `inputElement` property if you need to access
+ * properties or methods that are not exposed.
+ * @polymerBehavior Polymer.PaperInputBehavior
+ */
+ Polymer.PaperInputBehaviorImpl = {
+
+ properties: {
+ /**
+ * Fired when the input changes due to user interaction.
+ *
+ * @event change
+ */
+
+ /**
+ * The label for this input. If you're using PaperInputBehavior to
+ * implement your own paper-input-like element, bind this to
+ * `<label>`'s content and `hidden` property, e.g.
+ * `<label hidden$="[[!label]]">[[label]]</label>` in your `template`
+ */
+ label: {
+ type: String
+ },
+
+ /**
+ * The value for this input. If you're using PaperInputBehavior to
+ * implement your own paper-input-like element, bind this to
+ * the `<iron-input>`'s `bindValue`
+ * property, or the value property of your input that is `notify:true`.
+ */
+ value: {
+ notify: true,
+ type: String
+ },
+
+ /**
+ * Set to true to disable this input. If you're using PaperInputBehavior to
+ * implement your own paper-input-like element, bind this to
+ * both the `<paper-input-container>`'s and the input's `disabled` property.
+ */
+ disabled: {
+ type: Boolean,
+ value: false
+ },
+
+ /**
+ * Returns true if the value is invalid. If you're using PaperInputBehavior to
+ * implement your own paper-input-like element, bind this to both the
+ * `<paper-input-container>`'s and the input's `invalid` property.
+ *
+ * If `autoValidate` is true, the `invalid` attribute is managed automatically,
+ * which can clobber attempts to manage it manually.
+ */
+ invalid: {
+ type: Boolean,
+ value: false,
+ notify: true
+ },
+
+ /**
+ * Set this to specify the pattern allowed by `preventInvalidInput`. If
+ * you're using PaperInputBehavior to implement your own paper-input-like
+ * element, bind this to the `<input is="iron-input">`'s `allowedPattern`
+ * property.
+ */
+ allowedPattern: {
+ type: String
+ },
+
+ /**
+ * The type of the input. The supported types are the
+ * [native input's types](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_<input>_types).
+ * If you're using PaperInputBehavior to implement your own paper-input-like element,
+ * bind this to the (Polymer 1) `<input is="iron-input">`'s or (Polymer 2)
+ * `<iron-input>`'s `type` property.
+ */
+ type: {
+ type: String
+ },
+
+ /**
+ * The datalist of the input (if any). This should match the id of an existing `<datalist>`.
+ * If you're using PaperInputBehavior to implement your own paper-input-like
+ * element, bind this to the `<input is="iron-input">`'s `list` property.
+ */
+ list: {
+ type: String
+ },
+
+ /**
+ * A pattern to validate the `input` with. If you're using PaperInputBehavior to
+ * implement your own paper-input-like element, bind this to
+ * the `<input is="iron-input">`'s `pattern` property.
+ */
+ pattern: {
+ type: String
+ },
+
+ /**
+ * Set to true to mark the input as required. If you're using PaperInputBehavior to
+ * implement your own paper-input-like element, bind this to
+ * the `<input is="iron-input">`'s `required` property.
+ */
+ required: {
+ type: Boolean,
+ value: false
+ },
+
+ /**
+ * The error message to display when the input is invalid. If you're using
+ * PaperInputBehavior to implement your own paper-input-like element,
+ * bind this to the `<paper-input-error>`'s content, if using.
+ */
+ errorMessage: {
+ type: String
+ },
+
+ /**
+ * Set to true to show a character counter.
+ */
+ charCounter: {
+ type: Boolean,
+ value: false
+ },
+
+ /**
+ * Set to true to disable the floating label. If you're using PaperInputBehavior to
+ * implement your own paper-input-like element, bind this to
+ * the `<paper-input-container>`'s `noLabelFloat` property.
+ */
+ noLabelFloat: {
+ type: Boolean,
+ value: false
+ },
+
+ /**
+ * Set to true to always float the label. If you're using PaperInputBehavior to
+ * implement your own paper-input-like element, bind this to
+ * the `<paper-input-container>`'s `alwaysFloatLabel` property.
+ */
+ alwaysFloatLabel: {
+ type: Boolean,
+ value: false
+ },
+
+ /**
+ * Set to true to auto-validate the input value. If you're using PaperInputBehavior to
+ * implement your own paper-input-like element, bind this to
+ * the `<paper-input-container>`'s `autoValidate` property.
+ */
+ autoValidate: {
+ type: Boolean,
+ value: false
+ },
+
+ /**
+ * Name of the validator to use. If you're using PaperInputBehavior to
+ * implement your own paper-input-like element, bind this to
+ * the `<input is="iron-input">`'s `validator` property.
+ */
+ validator: {
+ type: String
+ },
+
+ // HTMLInputElement attributes for binding if needed
+
+ /**
+ * If you're using PaperInputBehavior to implement your own paper-input-like
+ * element, bind this to the `<input is="iron-input">`'s `autocomplete` property.
+ */
+ autocomplete: {
+ type: String,
+ value: 'off'
+ },
+
+ /**
+ * If you're using PaperInputBehavior to implement your own paper-input-like
+ * element, bind this to the `<input is="iron-input">`'s `autofocus` property.
+ */
+ autofocus: {
+ type: Boolean,
+ observer: '_autofocusChanged'
+ },
+
+ /**
+ * If you're using PaperInputBehavior to implement your own paper-input-like
+ * element, bind this to the `<input is="iron-input">`'s `inputmode` property.
+ */
+ inputmode: {
+ type: String
+ },
+
+ /**
+ * The minimum length of the input value.
+ * If you're using PaperInputBehavior to implement your own paper-input-like
+ * element, bind this to the `<input is="iron-input">`'s `minlength` property.
+ */
+ minlength: {
+ type: Number
+ },
+
+ /**
+ * The maximum length of the input value.
+ * If you're using PaperInputBehavior to implement your own paper-input-like
+ * element, bind this to the `<input is="iron-input">`'s `maxlength` property.
+ */
+ maxlength: {
+ type: Number
+ },
+
+ /**
+ * The minimum (numeric or date-time) input value.
+ * If you're using PaperInputBehavior to implement your own paper-input-like
+ * element, bind this to the `<input is="iron-input">`'s `min` property.
+ */
+ min: {
+ type: String
+ },
+
+ /**
+ * The maximum (numeric or date-time) input value.
+ * Can be a String (e.g. `"2000-01-01"`) or a Number (e.g. `2`).
+ * If you're using PaperInputBehavior to implement your own paper-input-like
+ * element, bind this to the `<input is="iron-input">`'s `max` property.
+ */
+ max: {
+ type: String
+ },
+
+ /**
+ * Limits the numeric or date-time increments.
+ * If you're using PaperInputBehavior to implement your own paper-input-like
+ * element, bind this to the `<input is="iron-input">`'s `step` property.
+ */
+ step: {
+ type: String
+ },
+
+ /**
+ * If you're using PaperInputBehavior to implement your own paper-input-like
+ * element, bind this to the `<input is="iron-input">`'s `name` property.
+ */
+ name: {
+ type: String
+ },
+
+ /**
+ * A placeholder string in addition to the label. If this is set, the label will always float.
+ */
+ placeholder: {
+ type: String,
+ // need to set a default so _computeAlwaysFloatLabel is run
+ value: ''
+ },
+
+ /**
+ * If you're using PaperInputBehavior to implement your own paper-input-like
+ * element, bind this to the `<input is="iron-input">`'s `readonly` property.
+ */
+ readonly: {
+ type: Boolean,
+ value: false
+ },
+
+ /**
+ * If you're using PaperInputBehavior to implement your own paper-input-like
+ * element, bind this to the `<input is="iron-input">`'s `size` property.
+ */
+ size: {
+ type: Number
+ },
+
+ // Nonstandard attributes for binding if needed
+
+ /**
+ * If you're using PaperInputBehavior to implement your own paper-input-like
+ * element, bind this to the `<input is="iron-input">`'s `autocapitalize` property.
+ */
+ autocapitalize: {
+ type: String,
+ value: 'none'
+ },
+
+ /**
+ * If you're using PaperInputBehavior to implement your own paper-input-like
+ * element, bind this to the `<input is="iron-input">`'s `autocorrect` property.
+ */
+ autocorrect: {
+ type: String,
+ value: 'off'
+ },
+
+ /**
+ * If you're using PaperInputBehavior to implement your own paper-input-like
+ * element, bind this to the `<input is="iron-input">`'s `autosave` property,
+ * used with type=search.
+ */
+ autosave: {
+ type: String
+ },
+
+ /**
+ * If you're using PaperInputBehavior to implement your own paper-input-like
+ * element, bind this to the `<input is="iron-input">`'s `results` property,
+ * used with type=search.
+ */
+ results: {
+ type: Number
+ },
+
+ /**
+ * If you're using PaperInputBehavior to implement your own paper-input-like
+ * element, bind this to the `<input is="iron-input">`'s `accept` property,
+ * used with type=file.
+ */
+ accept: {
+ type: String
+ },
+
+ /**
+ * If you're using PaperInputBehavior to implement your own paper-input-like
+ * element, bind this to the`<input is="iron-input">`'s `multiple` property,
+ * used with type=file.
+ */
+ multiple: {
+ type: Boolean
+ },
+
+ _ariaDescribedBy: {
+ type: String,
+ value: ''
+ },
+
+ _ariaLabelledBy: {
+ type: String,
+ value: ''
+ }
+
+ },
+
+ listeners: {
+ 'addon-attached': '_onAddonAttached',
+ },
+
+ keyBindings: {
+ 'shift+tab:keydown': '_onShiftTabDown'
+ },
+
+ hostAttributes: {
+ tabindex: 0
+ },
+
+ /**
+ * Returns a reference to the input element.
+ */
+ get inputElement() {
+ return this.$.input;
+ },
+
+ /**
+ * Returns a reference to the focusable element.
+ */
+ get _focusableElement() {
+ return this.inputElement;
+ },
+
+ created: function() {
+ // These types have some default placeholder text; overlapping
+ // the label on top of it looks terrible. Auto-float the label in this case.
+ this._typesThatHaveText = ["date", "datetime", "datetime-local", "month",
+ "time", "week", "file"];
+ },
+
+ attached: function() {
+ this._updateAriaLabelledBy();
+
+ // In the 2.0 version of the element, this is handled in `onIronInputReady`,
+ // i.e. after the native input has finished distributing. In the 1.0 version,
+ // the input is in the shadow tree, so it's already available.
+ if (!Polymer.Element && this.inputElement &&
+ this._typesThatHaveText.indexOf(this.inputElement.type) !== -1) {
+ this.alwaysFloatLabel = true;
+ }
+ },
+
+ _appendStringWithSpace: function(str, more) {
+ if (str) {
+ str = str + ' ' + more;
+ } else {
+ str = more;
+ }
+ return str;
+ },
+
+ _onAddonAttached: function(event) {
+ var target = Polymer.dom(event).rootTarget;
+ if (target.id) {
+ this._ariaDescribedBy = this._appendStringWithSpace(this._ariaDescribedBy, target.id);
+ } else {
+ var id = 'paper-input-add-on-' + Polymer.PaperInputHelper.NextAddonID++;
+ target.id = id;
+ this._ariaDescribedBy = this._appendStringWithSpace(this._ariaDescribedBy, id);
+ }
+ },
+
+ /**
+ * Validates the input element and sets an error style if needed.
+ *
+ * @return {boolean}
+ */
+ validate: function() {
+ return this.inputElement.validate();
+ },
+
+ /**
+ * Forward focus to inputElement. Overriden from IronControlState.
+ */
+ _focusBlurHandler: function(event) {
+ Polymer.IronControlState._focusBlurHandler.call(this, event);
+
+ // Forward the focus to the nested input.
+ if (this.focused && !this._shiftTabPressed && this._focusableElement) {
+ this._focusableElement.focus();
+ }
+ },
+
+ /**
+ * Handler that is called when a shift+tab keypress is detected by the menu.
+ *
+ * @param {CustomEvent} event A key combination event.
+ */
+ _onShiftTabDown: function(event) {
+ var oldTabIndex = this.getAttribute('tabindex');
+ this._shiftTabPressed = true;
+ this.setAttribute('tabindex', '-1');
+ this.async(function() {
+ this.setAttribute('tabindex', oldTabIndex);
+ this._shiftTabPressed = false;
+ }, 1);
+ },
+
+ /**
+ * If `autoValidate` is true, then validates the element.
+ */
+ _handleAutoValidate: function() {
+ if (this.autoValidate)
+ this.validate();
+ },
+
+ /**
+ * Restores the cursor to its original position after updating the value.
+ * @param {string} newValue The value that should be saved.
+ */
+ updateValueAndPreserveCaret: function(newValue) {
+ // Not all elements might have selection, and even if they have the
+ // right properties, accessing them might throw an exception (like for
+ // <input type=number>)
+ try {
+ var start = this.inputElement.selectionStart;
+ this.value = newValue;
+
+ // The cursor automatically jumps to the end after re-setting the value,
+ // so restore it to its original position.
+ this.inputElement.selectionStart = start;
+ this.inputElement.selectionEnd = start;
+ } catch (e) {
+ // Just set the value and give up on the caret.
+ this.value = newValue;
+ }
+ },
+
+ _computeAlwaysFloatLabel: function(alwaysFloatLabel, placeholder) {
+ return placeholder || alwaysFloatLabel;
+ },
+
+ _updateAriaLabelledBy: function() {
+ var label = Polymer.dom(this.root).querySelector('label');
+ if (!label) {
+ this._ariaLabelledBy = '';
+ return;
+ }
+ var labelledBy;
+ if (label.id) {
+ labelledBy = label.id;
+ } else {
+ labelledBy = 'paper-input-label-' + Polymer.PaperInputHelper.NextLabelID++;
+ label.id = labelledBy;
+ }
+ this._ariaLabelledBy = labelledBy;
+ },
+
+ _onChange:function(event) {
+ // In the Shadow DOM, the `change` event is not leaked into the
+ // ancestor tree, so we must do this manually.
+ // See https://w3c.github.io/webcomponents/spec/shadow/#events-that-are-not-leaked-into-ancestor-trees.
+ if (this.shadowRoot) {
+ this.fire(event.type, {sourceEvent: event}, {
+ node: this,
+ bubbles: event.bubbles,
+ cancelable: event.cancelable
+ });
+ }
+ },
+
+ _autofocusChanged: function() {
+ // Firefox doesn't respect the autofocus attribute if it's applied after
+ // the page is loaded (Chrome/WebKit do respect it), preventing an
+ // autofocus attribute specified in markup from taking effect when the
+ // element is upgraded. As a workaround, if the autofocus property is set,
+ // and the focus hasn't already been moved elsewhere, we take focus.
+ if (this.autofocus && this._focusableElement) {
+
+ // In IE 11, the default document.activeElement can be the page's
+ // outermost html element, but there are also cases (under the
+ // polyfill?) in which the activeElement is not a real HTMLElement, but
+ // just a plain object. We identify the latter case as having no valid
+ // activeElement.
+ var activeElement = document.activeElement;
+ var isActiveElementValid = activeElement instanceof HTMLElement;
+
+ // Has some other element has already taken the focus?
+ var isSomeElementActive = isActiveElementValid &&
+ activeElement !== document.body &&
+ activeElement !== document.documentElement; /* IE 11 */
+ if (!isSomeElementActive) {
+ // No specific element has taken the focus yet, so we can take it.
+ this._focusableElement.focus();
+ }
+ }
+ }
+ };
+
+ /** @polymerBehavior */
+ Polymer.PaperInputBehavior = [
+ Polymer.IronControlState,
+ Polymer.IronA11yKeysBehavior,
+ Polymer.PaperInputBehaviorImpl
+ ];
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input-char-counter.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input-char-counter.html
new file mode 100644
index 00000000000..f08c0be045c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input-char-counter.html
@@ -0,0 +1,99 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../paper-styles/typography.html">
+<link rel="import" href="paper-input-addon-behavior.html">
+
+<!--
+`<paper-input-char-counter>` is a character counter for use with `<paper-input-container>`. It
+shows the number of characters entered in the input and the max length if it is specified.
+
+ <paper-input-container>
+ <input maxlength="20">
+ <paper-input-char-counter></paper-input-char-counter>
+ </paper-input-container>
+
+### Styling
+
+The following mixin is available for styling:
+
+Custom property | Description | Default
+----------------|-------------|----------
+`--paper-input-char-counter` | Mixin applied to the element | `{}`
+-->
+
+<dom-module id="paper-input-char-counter">
+ <template>
+ <style>
+ :host {
+ display: inline-block;
+ float: right;
+
+ @apply --paper-font-caption;
+ @apply --paper-input-char-counter;
+ }
+
+ :host([hidden]) {
+ display: none !important;
+ }
+
+ :host(:dir(rtl)) {
+ float: left;
+ }
+ </style>
+
+ <span>[[_charCounterStr]]</span>
+ </template>
+</dom-module>
+
+<script>
+ Polymer({
+ is: 'paper-input-char-counter',
+
+ behaviors: [
+ Polymer.PaperInputAddonBehavior
+ ],
+
+ properties: {
+ _charCounterStr: {
+ type: String,
+ value: '0'
+ }
+ },
+
+ /**
+ * This overrides the update function in PaperInputAddonBehavior.
+ * @param {{
+ * inputElement: (Element|undefined),
+ * value: (string|undefined),
+ * invalid: boolean
+ * }} state -
+ * inputElement: The input element.
+ * value: The input value.
+ * invalid: True if the input value is invalid.
+ */
+ update: function(state) {
+ if (!state.inputElement) {
+ return;
+ }
+
+ state.value = state.value || '';
+
+ var counter = state.value.toString().length.toString();
+
+ if (state.inputElement.hasAttribute('maxlength')) {
+ counter += '/' + state.inputElement.getAttribute('maxlength');
+ }
+
+ this._charCounterStr = counter;
+ }
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input-container.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input-container.html
new file mode 100644
index 00000000000..adf1c966fd1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input-container.html
@@ -0,0 +1,682 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="../paper-styles/default-theme.html">
+<link rel="import" href="../paper-styles/typography.html">
+
+<!--
+`<paper-input-container>` is a container for a `<label>`, an `<iron-input>` or
+`<textarea>` and optional add-on elements such as an error message or character
+counter, used to implement Material Design text fields.
+
+For example:
+
+ <paper-input-container>
+ <label slot="label">Your name</label>
+ <iron-input slot="input">
+ <input>
+ </iron-input>
+ // In Polymer 1.0, you would use `<input is="iron-input" slot="input">` instead of the above.
+ </paper-input-container>
+
+You can style the nested `<input>` however you want; if you want it to look like a
+Material Design input, you can style it with the --paper-input-container-shared-input-style mixin.
+
+Do not wrap `<paper-input-container>` around elements that already include it, such as `<paper-input>`.
+Doing so may cause events to bounce infinitely between the container and its contained element.
+
+### Listening for input changes
+
+By default, it listens for changes on the `bind-value` attribute on its children nodes and perform
+tasks such as auto-validating and label styling when the `bind-value` changes. You can configure
+the attribute it listens to with the `attr-for-value` attribute.
+
+### Using a custom input element
+
+You can use a custom input element in a `<paper-input-container>`, for example to implement a
+compound input field like a social security number input. The custom input element should have the
+`paper-input-input` class, have a `notify:true` value property and optionally implements
+`Polymer.IronValidatableBehavior` if it is validatable.
+
+ <paper-input-container attr-for-value="ssn-value">
+ <label slot="label">Social security number</label>
+ <ssn-input slot="input" class="paper-input-input"></ssn-input>
+ </paper-input-container>
+
+
+If you're using a `<paper-input-container>` imperatively, it's important to make sure
+that you attach its children (the `iron-input` and the optional `label`) before you
+attach the `<paper-input-container>` itself, so that it can be set up correctly.
+
+### Validation
+
+If the `auto-validate` attribute is set, the input container will validate the input and update
+the container styling when the input value changes.
+
+### Add-ons
+
+Add-ons are child elements of a `<paper-input-container>` with the `add-on` attribute and
+implements the `Polymer.PaperInputAddonBehavior` behavior. They are notified when the input value
+or validity changes, and may implement functionality such as error messages or character counters.
+They appear at the bottom of the input.
+
+### Prefixes and suffixes
+These are child elements of a `<paper-input-container>` with the `prefix`
+or `suffix` attribute, and are displayed inline with the input, before or after.
+
+ <paper-input-container>
+ <div slot="prefix">$</div>
+ <label slot="label">Total</label>
+ <iron-input slot="input">
+ <input>
+ </iron-input>
+ // In Polymer 1.0, you would use `<input is="iron-input" slot="input">` instead of the above.
+ <paper-icon-button slot="suffix" icon="clear"></paper-icon-button>
+ </paper-input-container>
+
+### Styling
+
+The following custom properties and mixins are available for styling:
+
+Custom property | Description | Default
+----------------|-------------|----------
+`--paper-input-container-color` | Label and underline color when the input is not focused | `--secondary-text-color`
+`--paper-input-container-focus-color` | Label and underline color when the input is focused | `--primary-color`
+`--paper-input-container-invalid-color` | Label and underline color when the input is is invalid | `--error-color`
+`--paper-input-container-input-color` | Input foreground color | `--primary-text-color`
+`--paper-input-container` | Mixin applied to the container | `{}`
+`--paper-input-container-disabled` | Mixin applied to the container when it's disabled | `{}`
+`--paper-input-container-label` | Mixin applied to the label | `{}`
+`--paper-input-container-label-focus` | Mixin applied to the label when the input is focused | `{}`
+`--paper-input-container-label-floating` | Mixin applied to the label when floating | `{}`
+`--paper-input-container-input` | Mixin applied to the input | `{}`
+`--paper-input-container-input-disabled` | Mixin applied to the input when the component is disabled | `{}`
+`--paper-input-container-input-focus` | Mixin applied to the input when focused | `{}`
+`--paper-input-container-input-invalid` | Mixin applied to the input when invalid | `{}`
+`--paper-input-container-input-webkit-spinner` | Mixin applied to the webkit spinner | `{}`
+`--paper-input-container-input-webkit-clear` | Mixin applied to the webkit clear button | `{}`
+`--paper-input-container-ms-clear` | Mixin applied to the Internet Explorer clear button | `{}`
+`--paper-input-container-underline` | Mixin applied to the underline | `{}`
+`--paper-input-container-underline-focus` | Mixin applied to the underline when the input is focused | `{}`
+`--paper-input-container-underline-disabled` | Mixin applied to the underline when the input is disabled | `{}`
+`--paper-input-prefix` | Mixin applied to the input prefix | `{}`
+`--paper-input-suffix` | Mixin applied to the input suffix | `{}`
+
+This element is `display:block` by default, but you can set the `inline` attribute to make it
+`display:inline-block`.
+-->
+
+<dom-module id="paper-input-container">
+ <template>
+ <style>
+ :host {
+ display: block;
+ padding: 8px 0;
+
+ --paper-input-container-shared-input-style: {
+ position: relative; /* to make a stacking context */
+ outline: none;
+ box-shadow: none;
+ padding: 0;
+ width: 100%;
+ max-width: 100%;
+ background: transparent;
+ border: none;
+ color: var(--paper-input-container-input-color, var(--primary-text-color));
+ -webkit-appearance: none;
+ text-align: inherit;
+ vertical-align: bottom;
+
+ @apply --paper-font-subhead;
+ };
+
+ @apply --paper-input-container;
+ }
+
+ :host([inline]) {
+ display: inline-block;
+ }
+
+ :host([disabled]) {
+ pointer-events: none;
+ opacity: 0.33;
+
+ @apply --paper-input-container-disabled;
+ }
+
+ :host([hidden]) {
+ display: none !important;
+ }
+
+ [hidden] {
+ display: none !important;
+ }
+
+ .floated-label-placeholder {
+ @apply --paper-font-caption;
+ }
+
+ .underline {
+ height: 2px;
+ position: relative;
+ }
+
+ .focused-line {
+ @apply --layout-fit;
+ border-bottom: 2px solid var(--paper-input-container-focus-color, var(--primary-color));
+
+ -webkit-transform-origin: center center;
+ transform-origin: center center;
+ -webkit-transform: scale3d(0,1,1);
+ transform: scale3d(0,1,1);
+
+ @apply --paper-input-container-underline-focus;
+ }
+
+ .underline.is-highlighted .focused-line {
+ -webkit-transform: none;
+ transform: none;
+ -webkit-transition: -webkit-transform 0.25s;
+ transition: transform 0.25s;
+
+ @apply --paper-transition-easing;
+ }
+
+ .underline.is-invalid .focused-line {
+ border-color: var(--paper-input-container-invalid-color, var(--error-color));
+ -webkit-transform: none;
+ transform: none;
+ -webkit-transition: -webkit-transform 0.25s;
+ transition: transform 0.25s;
+
+ @apply --paper-transition-easing;
+ }
+
+ .unfocused-line {
+ @apply --layout-fit;
+ border-bottom: 1px solid var(--paper-input-container-color, var(--secondary-text-color));
+ @apply --paper-input-container-underline;
+ }
+
+ :host([disabled]) .unfocused-line {
+ border-bottom: 1px dashed;
+ border-color: var(--paper-input-container-color, var(--secondary-text-color));
+ @apply --paper-input-container-underline-disabled;
+ }
+
+ .input-wrapper {
+ @apply --layout-horizontal;
+ @apply --layout-center;
+ position: relative;
+ }
+
+ .input-content {
+ @apply --layout-flex-auto;
+ @apply --layout-relative;
+ max-width: 100%;
+ }
+
+ .input-content ::slotted(label),
+ .input-content ::slotted(.paper-input-label) {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ font: inherit;
+ color: var(--paper-input-container-color, var(--secondary-text-color));
+ -webkit-transition: -webkit-transform 0.25s, width 0.25s;
+ transition: transform 0.25s, width 0.25s;
+ -webkit-transform-origin: left top;
+ transform-origin: left top;
+ /* Fix for safari not focusing 0-height date/time inputs with -webkit-apperance: none; */
+ min-height: 1px;
+
+ @apply --paper-font-common-nowrap;
+ @apply --paper-font-subhead;
+ @apply --paper-input-container-label;
+ @apply --paper-transition-easing;
+ }
+
+ .input-content.label-is-floating ::slotted(label),
+ .input-content.label-is-floating ::slotted(.paper-input-label) {
+ -webkit-transform: translateY(-75%) scale(0.75);
+ transform: translateY(-75%) scale(0.75);
+
+ /* Since we scale to 75/100 of the size, we actually have 100/75 of the
+ original space now available */
+ width: 133%;
+
+ @apply --paper-input-container-label-floating;
+ }
+
+ :host(:dir(rtl)) .input-content.label-is-floating ::slotted(label),
+ :host(:dir(rtl)) .input-content.label-is-floating ::slotted(.paper-input-label) {
+ right: 0;
+ left: auto;
+ -webkit-transform-origin: right top;
+ transform-origin: right top;
+ }
+
+ .input-content.label-is-highlighted ::slotted(label),
+ .input-content.label-is-highlighted ::slotted(.paper-input-label) {
+ color: var(--paper-input-container-focus-color, var(--primary-color));
+
+ @apply --paper-input-container-label-focus;
+ }
+
+ .input-content.is-invalid ::slotted(label),
+ .input-content.is-invalid ::slotted(.paper-input-label) {
+ color: var(--paper-input-container-invalid-color, var(--error-color));
+ }
+
+ .input-content.label-is-hidden ::slotted(label),
+ .input-content.label-is-hidden ::slotted(.paper-input-label) {
+ visibility: hidden;
+ }
+
+ .input-content ::slotted(iron-input) {
+ @apply --paper-input-container-shared-input-style;
+ }
+
+ .input-content ::slotted(input),
+ .input-content ::slotted(textarea),
+ .input-content ::slotted(iron-autogrow-textarea),
+ .input-content ::slotted(.paper-input-input) {
+ @apply --paper-input-container-shared-input-style;
+ @apply --paper-input-container-input;
+ }
+
+ .input-content ::slotted(input)::-webkit-outer-spin-button,
+ .input-content ::slotted(input)::-webkit-inner-spin-button {
+ @apply --paper-input-container-input-webkit-spinner;
+ }
+
+ .input-content.focused ::slotted(input),
+ .input-content.focused ::slotted(textarea),
+ .input-content.focused ::slotted(iron-autogrow-textarea),
+ .input-content.focused ::slotted(.paper-input-input) {
+ @apply --paper-input-container-input-focus;
+ }
+
+ .input-content.is-invalid ::slotted(input),
+ .input-content.is-invalid ::slotted(textarea),
+ .input-content.is-invalid ::slotted(iron-autogrow-textarea),
+ .input-content.is-invalid ::slotted(.paper-input-input) {
+ @apply --paper-input-container-input-invalid;
+ }
+
+ .prefix ::slotted(*) {
+ display: inline-block;
+ @apply --paper-font-subhead;
+ @apply --layout-flex-none;
+ @apply --paper-input-prefix;
+ }
+
+ .suffix ::slotted(*) {
+ display: inline-block;
+ @apply --paper-font-subhead;
+ @apply --layout-flex-none;
+
+ @apply --paper-input-suffix;
+ }
+
+ /* Firefox sets a min-width on the input, which can cause layout issues */
+ .input-content ::slotted(input) {
+ min-width: 0;
+ }
+
+ .input-content ::slotted(textarea) {
+ resize: none;
+ }
+
+ .add-on-content {
+ position: relative;
+ }
+
+ .add-on-content.is-invalid ::slotted(*) {
+ color: var(--paper-input-container-invalid-color, var(--error-color));
+ }
+
+ .add-on-content.is-highlighted ::slotted(*) {
+ color: var(--paper-input-container-focus-color, var(--primary-color));
+ }
+ </style>
+
+ <div class="floated-label-placeholder" aria-hidden="true" hidden="[[noLabelFloat]]">&nbsp;</div>
+
+ <div class="input-wrapper">
+ <span class="prefix"><slot name="prefix"></slot></span>
+
+ <div class$="[[_computeInputContentClass(noLabelFloat,alwaysFloatLabel,focused,invalid,_inputHasContent)]]" id="labelAndInputContainer">
+ <slot name="label"></slot>
+ <slot name="input"></slot>
+ </div>
+
+ <span class="suffix"><slot name="suffix"></slot></span>
+ </div>
+
+ <div class$="[[_computeUnderlineClass(focused,invalid)]]">
+ <div class="unfocused-line"></div>
+ <div class="focused-line"></div>
+ </div>
+
+ <div class$="[[_computeAddOnContentClass(focused,invalid)]]">
+ <slot name="add-on"></slot>
+ </div>
+ </template>
+</dom-module>
+
+<script>
+ Polymer({
+ is: 'paper-input-container',
+
+ properties: {
+ /**
+ * Set to true to disable the floating label. The label disappears when the input value is
+ * not null.
+ */
+ noLabelFloat: {
+ type: Boolean,
+ value: false
+ },
+
+ /**
+ * Set to true to always float the floating label.
+ */
+ alwaysFloatLabel: {
+ type: Boolean,
+ value: false
+ },
+
+ /**
+ * The attribute to listen for value changes on.
+ */
+ attrForValue: {
+ type: String,
+ value: 'bind-value'
+ },
+
+ /**
+ * Set to true to auto-validate the input value when it changes.
+ */
+ autoValidate: {
+ type: Boolean,
+ value: false
+ },
+
+ /**
+ * True if the input is invalid. This property is set automatically when the input value
+ * changes if auto-validating, or when the `iron-input-validate` event is heard from a child.
+ */
+ invalid: {
+ observer: '_invalidChanged',
+ type: Boolean,
+ value: false
+ },
+
+ /**
+ * True if the input has focus.
+ */
+ focused: {
+ readOnly: true,
+ type: Boolean,
+ value: false,
+ notify: true
+ },
+
+ _addons: {
+ type: Array
+ // do not set a default value here intentionally - it will be initialized lazily when a
+ // distributed child is attached, which may occur before configuration for this element
+ // in polyfill.
+ },
+
+ _inputHasContent: {
+ type: Boolean,
+ value: false
+ },
+
+ _inputSelector: {
+ type: String,
+ value: 'input,iron-input,textarea,.paper-input-input'
+ },
+
+ _boundOnFocus: {
+ type: Function,
+ value: function() {
+ return this._onFocus.bind(this);
+ }
+ },
+
+ _boundOnBlur: {
+ type: Function,
+ value: function() {
+ return this._onBlur.bind(this);
+ }
+ },
+
+ _boundOnInput: {
+ type: Function,
+ value: function() {
+ return this._onInput.bind(this);
+ }
+ },
+
+ _boundValueChanged: {
+ type: Function,
+ value: function() {
+ return this._onValueChanged.bind(this);
+ }
+ }
+ },
+
+ listeners: {
+ 'addon-attached': '_onAddonAttached',
+ 'iron-input-validate': '_onIronInputValidate'
+ },
+
+ get _valueChangedEvent() {
+ return this.attrForValue + '-changed';
+ },
+
+ get _propertyForValue() {
+ return Polymer.CaseMap.dashToCamelCase(this.attrForValue);
+ },
+
+ get _inputElement() {
+ return Polymer.dom(this).querySelector(this._inputSelector);
+ },
+
+ get _inputElementValue() {
+ return this._inputElement[this._propertyForValue] || this._inputElement.value;
+ },
+
+ ready: function() {
+ if (!this._addons) {
+ this._addons = [];
+ }
+ this.addEventListener('focus', this._boundOnFocus, true);
+ this.addEventListener('blur', this._boundOnBlur, true);
+ },
+
+ attached: function() {
+ if (this.attrForValue) {
+ this._inputElement.addEventListener(this._valueChangedEvent, this._boundValueChanged);
+ } else {
+ this.addEventListener('input', this._onInput);
+ }
+
+ // Only validate when attached if the input already has a value.
+ if (this._inputElementValue && this._inputElementValue != '') {
+ this._handleValueAndAutoValidate(this._inputElement);
+ } else {
+ this._handleValue(this._inputElement);
+ }
+ },
+
+ _onAddonAttached: function(event) {
+ if (!this._addons) {
+ this._addons = [];
+ }
+ var target = event.target;
+ if (this._addons.indexOf(target) === -1) {
+ this._addons.push(target);
+ if (this.isAttached) {
+ this._handleValue(this._inputElement);
+ }
+ }
+ },
+
+ _onFocus: function() {
+ this._setFocused(true);
+ },
+
+ _onBlur: function() {
+ this._setFocused(false);
+ this._handleValueAndAutoValidate(this._inputElement);
+ },
+
+ _onInput: function(event) {
+ this._handleValueAndAutoValidate(event.target);
+ },
+
+ _onValueChanged: function(event) {
+ var input = event.target;
+
+ // Problem: if the input is required but has no text entered, we should
+ // only validate it on blur (so that an empty form doesn't come up red
+ // immediately; however, in this handler, we don't know whether this is
+ // the booting up value or a value in the future. I am assuming that the
+ // case we care about manifests itself when the value is undefined.
+ // If this causes future problems, we need to do something like track whether
+ // the iron-input-ready event has fired, and this handler came before that.
+
+ if (input.value === undefined) {
+ return;
+ }
+
+ this._handleValueAndAutoValidate(event.target);
+ },
+
+ _handleValue: function(inputElement) {
+ var value = this._inputElementValue;
+
+ // type="number" hack needed because this.value is empty until it's valid
+ if (value || value === 0 || (inputElement.type === 'number' && !inputElement.checkValidity())) {
+ this._inputHasContent = true;
+ } else {
+ this._inputHasContent = false;
+ }
+
+ this.updateAddons({
+ inputElement: inputElement,
+ value: value,
+ invalid: this.invalid
+ });
+ },
+
+ _handleValueAndAutoValidate: function(inputElement) {
+ if (this.autoValidate && inputElement) {
+ var valid;
+
+ if (inputElement.validate) {
+ valid = inputElement.validate(this._inputElementValue);
+ } else {
+ valid = inputElement.checkValidity();
+ }
+ this.invalid = !valid;
+ }
+
+ // Call this last to notify the add-ons.
+ this._handleValue(inputElement);
+ },
+
+ _onIronInputValidate: function(event) {
+ this.invalid = this._inputElement.invalid;
+ },
+
+ _invalidChanged: function() {
+ if (this._addons) {
+ this.updateAddons({invalid: this.invalid});
+ }
+ },
+
+ /**
+ * Call this to update the state of add-ons.
+ * @param {Object} state Add-on state.
+ */
+ updateAddons: function(state) {
+ for (var addon, index = 0; addon = this._addons[index]; index++) {
+ addon.update(state);
+ }
+ },
+
+ _computeInputContentClass: function(noLabelFloat, alwaysFloatLabel, focused, invalid, _inputHasContent) {
+ var cls = 'input-content';
+ if (!noLabelFloat) {
+ var label = this.querySelector('label');
+
+ if (alwaysFloatLabel || _inputHasContent) {
+ cls += ' label-is-floating';
+ // If the label is floating, ignore any offsets that may have been
+ // applied from a prefix element.
+ this.$.labelAndInputContainer.style.position = 'static';
+
+ if (invalid) {
+ cls += ' is-invalid';
+ } else if (focused) {
+ cls += " label-is-highlighted";
+ }
+ } else {
+ // When the label is not floating, it should overlap the input element.
+ if (label) {
+ this.$.labelAndInputContainer.style.position = 'relative';
+ }
+ if (invalid) {
+ cls += ' is-invalid';
+ }
+ }
+ } else {
+ if (_inputHasContent) {
+ cls += ' label-is-hidden';
+ }
+ if (invalid) {
+ cls += ' is-invalid';
+ }
+ }
+ if (focused) {
+ cls += ' focused';
+ }
+ return cls;
+ },
+
+ _computeUnderlineClass: function(focused, invalid) {
+ var cls = 'underline';
+ if (invalid) {
+ cls += ' is-invalid';
+ } else if (focused) {
+ cls += ' is-highlighted'
+ }
+ return cls;
+ },
+
+ _computeAddOnContentClass: function(focused, invalid) {
+ var cls = 'add-on-content';
+ if (invalid) {
+ cls += ' is-invalid';
+ } else if (focused) {
+ cls += ' is-highlighted'
+ }
+ return cls;
+ }
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input-error.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input-error.html
new file mode 100644
index 00000000000..63f2421e6c1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input-error.html
@@ -0,0 +1,94 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../paper-styles/default-theme.html">
+<link rel="import" href="../paper-styles/typography.html">
+<link rel="import" href="paper-input-addon-behavior.html">
+
+<!--
+`<paper-input-error>` is an error message for use with `<paper-input-container>`. The error is
+displayed when the `<paper-input-container>` is `invalid`.
+
+ <paper-input-container>
+ <input pattern="[0-9]*">
+ <paper-input-error slot="add-on">Only numbers are allowed!</paper-input-error>
+ </paper-input-container>
+
+### Styling
+
+The following custom properties and mixins are available for styling:
+
+Custom property | Description | Default
+----------------|-------------|----------
+`--paper-input-container-invalid-color` | The foreground color of the error | `--error-color`
+`--paper-input-error` | Mixin applied to the error | `{}`
+-->
+
+<dom-module id="paper-input-error">
+ <template>
+ <style>
+ :host {
+ display: inline-block;
+ visibility: hidden;
+
+ color: var(--paper-input-container-invalid-color, var(--error-color));
+
+ @apply --paper-font-caption;
+ @apply --paper-input-error;
+ position: absolute;
+ left:0;
+ right:0;
+ }
+
+ :host([invalid]) {
+ visibility: visible;
+ };
+ </style>
+
+ <slot></slot>
+ </template>
+</dom-module>
+
+<script>
+ Polymer({
+ is: 'paper-input-error',
+
+ behaviors: [
+ Polymer.PaperInputAddonBehavior
+ ],
+
+ properties: {
+ /**
+ * True if the error is showing.
+ */
+ invalid: {
+ readOnly: true,
+ reflectToAttribute: true,
+ type: Boolean
+ }
+ },
+
+ /**
+ * This overrides the update function in PaperInputAddonBehavior.
+ * @param {{
+ * inputElement: (Element|undefined),
+ * value: (string|undefined),
+ * invalid: boolean
+ * }} state -
+ * inputElement: The input element.
+ * value: The input value.
+ * invalid: True if the input value is invalid.
+ */
+ update: function(state) {
+ this._setInvalid(state.invalid);
+ }
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input.html
new file mode 100644
index 00000000000..f230466ba29
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-input.html
@@ -0,0 +1,316 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-form-element-behavior/iron-form-element-behavior.html">
+<link rel="import" href="../iron-input/iron-input.html">
+<link rel="import" href="paper-input-behavior.html">
+<link rel="import" href="paper-input-char-counter.html">
+<link rel="import" href="paper-input-container.html">
+<link rel="import" href="paper-input-error.html">
+
+<!--
+Material design: [Text fields](https://www.google.com/design/spec/components/text-fields.html)
+
+`<paper-input>` is a single-line text field with Material Design styling.
+
+ <paper-input label="Input label"></paper-input>
+
+It may include an optional error message or character counter.
+
+ <paper-input error-message="Invalid input!" label="Input label"></paper-input>
+ <paper-input char-counter label="Input label"></paper-input>
+
+It can also include custom prefix or suffix elements, which are displayed
+before or after the text input itself. In order for an element to be
+considered as a prefix, it must have the `prefix` attribute (and similarly
+for `suffix`).
+
+ <paper-input label="total">
+ <div prefix>$</div>
+ <paper-icon-button slot="suffix" icon="clear"></paper-icon-button>
+ </paper-input>
+
+A `paper-input` can use the native `type=search` or `type=file` features.
+However, since we can't control the native styling of the input (search icon,
+file button, date placeholder, etc.), in these cases the label will be
+automatically floated. The `placeholder` attribute can still be used for
+additional informational text.
+
+ <paper-input label="search!" type="search"
+ placeholder="search for cats" autosave="test" results="5">
+ </paper-input>
+
+See `Polymer.PaperInputBehavior` for more API docs.
+
+### Focus
+
+To focus a paper-input, you can call the native `focus()` method as long as the
+paper input has a tab index. Similarly, `blur()` will blur the element.
+
+### Styling
+
+See `Polymer.PaperInputContainer` for a list of custom properties used to
+style this element.
+
+The following custom properties and mixins are available for styling:
+
+Custom property | Description | Default
+----------------|-------------|----------
+`--paper-input-container-ms-clear` | Mixin applied to the Internet Explorer reveal button (the eyeball) | {}
+
+@group Paper Elements
+@element paper-input
+@hero hero.svg
+@demo demo/index.html
+
+-->
+
+<dom-module id="paper-input">
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+
+ :host([focused]) {
+ outline: none;
+ }
+
+ :host([hidden]) {
+ display: none !important;
+ }
+
+ input {
+ position: relative; /* to make a stacking context */
+ outline: none;
+ box-shadow: none;
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ max-width: 100%;
+ background: transparent;
+ border: none;
+ color: var(--paper-input-container-input-color, var(--primary-text-color));
+ -webkit-appearance: none;
+ text-align: inherit;
+ vertical-align: bottom;
+
+ /* Firefox sets a min-width on the input, which can cause layout issues */
+ min-width: 0;
+
+ @apply --paper-font-subhead;
+ @apply --paper-input-container-input;
+ }
+
+ input:disabled {
+ @apply --paper-input-container-input-disabled;
+ }
+
+ input::-webkit-outer-spin-button,
+ input::-webkit-inner-spin-button {
+ @apply --paper-input-container-input-webkit-spinner;
+ }
+
+ input::-webkit-clear-button {
+ @apply --paper-input-container-input-webkit-clear;
+ }
+
+ input::-webkit-input-placeholder {
+ color: var(--paper-input-container-color, var(--secondary-text-color));
+ }
+
+ input:-moz-placeholder {
+ color: var(--paper-input-container-color, var(--secondary-text-color));
+ }
+
+ input::-moz-placeholder {
+ color: var(--paper-input-container-color, var(--secondary-text-color));
+ }
+
+ input::-ms-clear {
+ @apply --paper-input-container-ms-clear;
+ }
+
+ input::-ms-reveal {
+ @apply --paper-input-container-ms-reveal;
+ }
+
+ input:-ms-input-placeholder {
+ color: var(--paper-input-container-color, var(--secondary-text-color));
+ }
+
+ label {
+ pointer-events: none;
+ }
+ </style>
+
+ <paper-input-container id="container"
+ no-label-float="[[noLabelFloat]]"
+ always-float-label="[[_computeAlwaysFloatLabel(alwaysFloatLabel,placeholder)]]"
+ auto-validate$="[[autoValidate]]"
+ disabled$="[[disabled]]"
+ invalid="[[invalid]]">
+
+ <slot name="prefix" slot="prefix"></slot>
+
+ <label hidden$="[[!label]]" aria-hidden="true" for="input" slot="label">[[label]]</label>
+
+ <span id="template-placeholder"></span>
+
+ <slot name="suffix" slot="suffix"></slot>
+
+ <template is="dom-if" if="[[errorMessage]]">
+ <paper-input-error aria-live="assertive" slot="add-on">[[errorMessage]]</paper-input-error>
+ </template>
+
+ <template is="dom-if" if="[[charCounter]]">
+ <paper-input-char-counter slot="add-on"></paper-input-char-counter>
+ </template>
+
+ </paper-input-container>
+ </template>
+
+ <!-- This is a fresh new hell to make this element hybrid. Basically, in 2.0
+ we lost is=, so the example same template can't be used with iron-input 1.0 and 2.0.
+ Expect some conditional code (especially in the tests).
+ -->
+ <template id="v0">
+ <input is="iron-input" id="input" slot="input"
+ aria-labelledby$="[[_ariaLabelledBy]]"
+ aria-describedby$="[[_ariaDescribedBy]]"
+ disabled$="[[disabled]]"
+ title$="[[title]]"
+ bind-value="{{value}}"
+ invalid="{{invalid}}"
+ prevent-invalid-input="[[preventInvalidInput]]"
+ allowed-pattern="[[allowedPattern]]"
+ validator="[[validator]]"
+ type$="[[type]]"
+ pattern$="[[pattern]]"
+ required$="[[required]]"
+ autocomplete$="[[autocomplete]]"
+ autofocus$="[[autofocus]]"
+ inputmode$="[[inputmode]]"
+ minlength$="[[minlength]]"
+ maxlength$="[[maxlength]]"
+ min$="[[min]]"
+ max$="[[max]]"
+ step$="[[step]]"
+ name$="[[name]]"
+ placeholder$="[[placeholder]]"
+ readonly$="[[readonly]]"
+ list$="[[list]]"
+ size$="[[size]]"
+ autocapitalize$="[[autocapitalize]]"
+ autocorrect$="[[autocorrect]]"
+ on-change="_onChange"
+ tabindex$="[[tabIndex]]"
+ autosave$="[[autosave]]"
+ results$="[[results]]"
+ accept$="[[accept]]"
+ multiple$="[[multiple]]">
+ </template>
+
+ <template id="v1">
+ <!-- Need to bind maxlength so that the paper-input-char-counter works correctly -->
+ <iron-input bind-value="{{value}}" id="input" slot="input"
+ maxlength$="[[maxlength]]"
+ allowed-pattern="[[allowedPattern]]"
+ invalid="{{invalid}}"
+ validator="[[validator]]">
+ <input id="nativeInput"
+ aria-labelledby$="[[_ariaLabelledBy]]"
+ aria-describedby$="[[_ariaDescribedBy]]"
+ disabled$="[[disabled]]"
+ title$="[[title]]"
+ type$="[[type]]"
+ pattern$="[[pattern]]"
+ required$="[[required]]"
+ autocomplete$="[[autocomplete]]"
+ autofocus$="[[autofocus]]"
+ inputmode$="[[inputmode]]"
+ minlength$="[[minlength]]"
+ maxlength$="[[maxlength]]"
+ min$="[[min]]"
+ max$="[[max]]"
+ step$="[[step]]"
+ name$="[[name]]"
+ placeholder$="[[placeholder]]"
+ readonly$="[[readonly]]"
+ list$="[[list]]"
+ size$="[[size]]"
+ autocapitalize$="[[autocapitalize]]"
+ autocorrect$="[[autocorrect]]"
+ on-change="_onChange"
+ tabindex$="[[tabIndex]]"
+ autosave$="[[autosave]]"
+ results$="[[results]]"
+ accept$="[[accept]]"
+ multiple$="[[multiple]]">
+ </iron-input>
+ </template>
+
+</dom-module>
+
+<script>
+ Polymer({
+ is: 'paper-input',
+
+ behaviors: [
+ Polymer.PaperInputBehavior,
+ Polymer.IronFormElementBehavior
+ ],
+
+ beforeRegister: function() {
+ // We need to tell which kind of of template to stamp based on
+ // what kind of `iron-input` we got, but because of polyfills and
+ // custom elements differences between v0 and v1, the safest bet is
+ // to check a particular method we know the iron-input#2.x can have.
+ // If it doesn't have it, then it's an iron-input#1.x.
+ var ironInput = document.createElement('iron-input');
+ var version = typeof ironInput._initSlottedInput == 'function' ? 'v1' : 'v0';
+ var template = Polymer.DomModule.import('paper-input', 'template');
+ var inputTemplate = Polymer.DomModule.import('paper-input', 'template#' + version);
+ var inputPlaceholder = template.content.querySelector('#template-placeholder');
+ if (inputPlaceholder) {
+ inputPlaceholder.parentNode.replaceChild(inputTemplate.content, inputPlaceholder);
+ }
+ // else it's already been processed, probably in superclass
+ },
+
+ /**
+ * Returns a reference to the focusable element. Overridden from PaperInputBehavior
+ * to correctly focus the native input.
+ */
+ get _focusableElement() {
+ return Polymer.Element ? this.inputElement._inputElement : this.inputElement;
+ },
+
+ // Note: This event is only available in the 1.0 version of this element.
+ // In 2.0, the functionality of `_onIronInputReady` is done in
+ // PaperInputBehavior::attached.
+ listeners: {
+ 'iron-input-ready': '_onIronInputReady'
+ },
+
+ _onIronInputReady: function() {
+ if (this.inputElement &&
+ this._typesThatHaveText.indexOf(this.$.nativeInput.type) !== -1) {
+ this.alwaysFloatLabel = true;
+ }
+
+ // Only validate when attached if the input already has a value.
+ if (!!this.inputElement.bindValue) {
+ this.$.container._handleValueAndAutoValidate(this.inputElement);
+ }
+ },
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-textarea.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-textarea.html
new file mode 100644
index 00000000000..9416c621e75
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-input/paper-textarea.html
@@ -0,0 +1,165 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-autogrow-textarea/iron-autogrow-textarea.html">
+<link rel="import" href="../iron-form-element-behavior/iron-form-element-behavior.html">
+<link rel="import" href="paper-input-behavior.html">
+<link rel="import" href="paper-input-char-counter.html">
+<link rel="import" href="paper-input-container.html">
+<link rel="import" href="paper-input-error.html">
+
+<!--
+`<paper-textarea>` is a multi-line text field with Material Design styling.
+
+ <paper-textarea label="Textarea label"></paper-textarea>
+
+See `Polymer.PaperInputBehavior` for more API docs.
+
+### Validation
+
+Currently only `required` and `maxlength` validation is supported.
+
+### Styling
+
+See `Polymer.PaperInputContainer` for a list of custom properties used to
+style this element.
+-->
+
+<dom-module id="paper-textarea">
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+
+ :host([hidden]) {
+ display: none !important;
+ }
+
+ label {
+ pointer-events: none;
+ }
+ </style>
+
+ <paper-input-container no-label-float$="[[noLabelFloat]]"
+ always-float-label="[[_computeAlwaysFloatLabel(alwaysFloatLabel,placeholder)]]"
+ auto-validate$="[[autoValidate]]"
+ disabled$="[[disabled]]"
+ invalid="[[invalid]]">
+
+ <label hidden$="[[!label]]" aria-hidden="true" for="input" slot="label">[[label]]</label>
+
+ <iron-autogrow-textarea id="input" class="paper-input-input" slot="input"
+ aria-labelledby$="[[_ariaLabelledBy]]"
+ aria-describedby$="[[_ariaDescribedBy]]"
+ bind-value="{{value}}"
+ invalid="{{invalid}}"
+ validator$="[[validator]]"
+ disabled$="[[disabled]]"
+ autocomplete$="[[autocomplete]]"
+ autofocus$="[[autofocus]]"
+ inputmode$="[[inputmode]]"
+ name$="[[name]]"
+ placeholder$="[[placeholder]]"
+ readonly$="[[readonly]]"
+ required$="[[required]]"
+ minlength$="[[minlength]]"
+ maxlength$="[[maxlength]]"
+ autocapitalize$="[[autocapitalize]]"
+ rows$="[[rows]]"
+ max-rows$="[[maxRows]]"
+ on-change="_onChange"></iron-autogrow-textarea>
+
+ <template is="dom-if" if="[[errorMessage]]">
+ <paper-input-error aria-live="assertive" slot="add-on">[[errorMessage]]</paper-input-error>
+ </template>
+
+ <template is="dom-if" if="[[charCounter]]">
+ <paper-input-char-counter slot="add-on"></paper-input-char-counter>
+ </template>
+
+ </paper-input-container>
+ </template>
+</dom-module>
+
+<script>
+ Polymer({
+ is: 'paper-textarea',
+
+ behaviors: [
+ Polymer.PaperInputBehavior,
+ Polymer.IronFormElementBehavior,
+ ],
+
+ properties: {
+ _ariaLabelledBy: {
+ observer: '_ariaLabelledByChanged',
+ type: String,
+ },
+
+ _ariaDescribedBy: {
+ observer: '_ariaDescribedByChanged',
+ type: String,
+ },
+
+ /**
+ * The initial number of rows.
+ *
+ * @attribute rows
+ * @type number
+ * @default 1
+ */
+ rows: {
+ type: Number,
+ value: 1,
+ },
+
+ /**
+ * The maximum number of rows this element can grow to until it
+ * scrolls. 0 means no maximum.
+ *
+ * @attribute maxRows
+ * @type number
+ * @default 0
+ */
+ maxRows: {
+ type: Number,
+ value: 0,
+ },
+ },
+
+ get selectionStart() {
+ return this.$.input.textarea.selectionStart;
+ },
+ set selectionStart(start) {
+ this.$.input.textarea.selectionStart = start;
+ },
+
+ get selectionEnd() {
+ return this.$.input.textarea.selectionEnd;
+ },
+ set selectionEnd(end) {
+ this.$.input.textarea.selectionEnd = end;
+ },
+
+ _ariaLabelledByChanged: function(ariaLabelledBy) {
+ this.$.input.textarea.setAttribute('aria-labelledby', ariaLabelledBy);
+ },
+
+ _ariaDescribedByChanged: function(ariaDescribedBy) {
+ this.$.input.textarea.setAttribute('aria-describedby', ariaDescribedBy);
+ },
+
+ get _focusableElement() {
+ return this.$.input.textarea;
+ },
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/.bower.json
new file mode 100644
index 00000000000..35f1877e7e0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/.bower.json
@@ -0,0 +1,81 @@
+{
+ "name": "paper-item",
+ "version": "2.0.0",
+ "description": "A material-design styled list item",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "item"
+ ],
+ "main": [
+ "paper-item.html",
+ "paper-icon-item.html",
+ "paper-item-body.html"
+ ],
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-item"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-item",
+ "ignore": [],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-behaviors": "PolymerElements/iron-behaviors#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-icon": "PolymerElements/iron-icon#1 - 2",
+ "iron-icons": "PolymerElements/iron-icons#1 - 2",
+ "paper-icon-button": "PolymerElements/paper-icon-button#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "paper-input": "PolymerElements/paper-input#1 - 2"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-icon": "PolymerElements/iron-icon#^1.0.0",
+ "iron-icons": "PolymerElements/iron-icons#^1.0.0",
+ "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "paper-input": "PolymerElements/paper-input#^1.1.22"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.0.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.0.0",
+ "commit": "07910f6f76e1042286e931da923bff8ceabc3dc6"
+ },
+ "_source": "https://github.com/PolymerElements/paper-item.git",
+ "_target": "~2.0",
+ "_originalSource": "PolymerElements/paper-item"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..c38fb3e543a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/paper-item/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/.travis.yml
new file mode 100644
index 00000000000..8b74dcffe62
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/.travis.yml
@@ -0,0 +1,26 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+env:
+ global:
+ - secure: >-
+ L1TRyuZxs3duna5l8uOs3l5OsS0s8hWzTh2J6T7yryOFkwI3giar8O3p9DmQk8+yB45r1J6iJVBqhwaYP9A2ZOh/2J6zfXACCkFvFfDZQA3A3QGQf5SynQyoG7RpvHdm9qMymIKAPbbPzM1f1uyN79R0vfNXW+q3OziWyARI9Zo=
+ - secure: >-
+ IqEh0JXayftVmAwAkyytSmONzK9BuhECFLURSri6wowjkGaYN+76m6hry1tWxoW9cdkgKX5l9WPekBtKtSJsB+jYIJTUtl258j+bktiSFK9laBH+97NOcCC8n0tNdgMO/CCF4cX//eWaelPnCjriJv6evdefVdrkImSZflWYmsc=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+ sauce_connect: true
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/README.md
new file mode 100644
index 00000000000..5148d84e47e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/README.md
@@ -0,0 +1,163 @@
+
+<!---
+
+This README is automatically generated from the comments in these files:
+paper-icon-item.html paper-item-behavior.html paper-item-body.html paper-item.html
+
+Edit those files, and our readme bot will duplicate them over here!
+Edit this file, and the bot will squash your changes :)
+
+The bot does some handling of markdown. Please file a bug if it does the wrong
+thing! https://github.com/PolymerLabs/tedium/issues
+
+-->
+
+[![Build status](https://travis-ci.org/PolymerElements/paper-item.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-item)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/paper-item)_
+
+
+## &lt;paper-item&gt;
+
+Material design: [Lists](https://www.google.com/design/spec/components/lists.html)
+
+`<paper-item>` is an interactive list item. By default, it is a horizontal flexbox.
+
+```html
+<paper-item>Item</paper-item>
+```
+
+Use this element with `<paper-item-body>` to make Material Design styled two-line and three-line
+items.
+
+```html
+<paper-item>
+ <paper-item-body two-line>
+ <div>Show your status</div>
+ <div secondary>Your status is visible to everyone</div>
+ </paper-item-body>
+ <iron-icon icon="warning"></iron-icon>
+</paper-item>
+```
+
+To use `paper-item` as a link, wrap it in an anchor tag. Since `paper-item` will
+already receive focus, you may want to prevent the anchor tag from receiving
+focus as well by setting its tabindex to -1.
+
+```html
+<a href="https://www.polymer-project.org/" tabindex="-1">
+ <paper-item raised>Polymer Project</paper-item>
+</a>
+```
+
+If you are concerned about performance and want to use `paper-item` in a `paper-listbox`
+with many items, you can just use a native `button` with the `paper-item` class
+applied (provided you have correctly included the shared styles):
+
+```html
+<style is="custom-style" include="paper-item-shared-styles"></style>
+
+<paper-listbox>
+ <button class="paper-item" role="option">Inbox</button>
+ <button class="paper-item" role="option">Starred</button>
+ <button class="paper-item" role="option">Sent mail</button>
+</paper-listbox>
+```
+
+### Styling
+
+The following custom properties and mixins are available for styling:
+
+| Custom property | Description | Default |
+| --- | --- | --- |
+| `--paper-item-min-height` | Minimum height of the item | `48px` |
+| `--paper-item` | Mixin applied to the item | `{}` |
+| `--paper-item-selected-weight` | The font weight of a selected item | `bold` |
+| `--paper-item-selected` | Mixin applied to selected paper-items | `{}` |
+| `--paper-item-disabled-color` | The color for disabled paper-items | `--disabled-text-color` |
+| `--paper-item-disabled` | Mixin applied to disabled paper-items | `{}` |
+| `--paper-item-focused` | Mixin applied to focused paper-items | `{}` |
+| `--paper-item-focused-before` | Mixin applied to :before focused paper-items | `{}` |
+
+### Accessibility
+
+This element has `role="listitem"` by default. Depending on usage, it may be more appropriate to set
+`role="menuitem"`, `role="menuitemcheckbox"` or `role="menuitemradio"`.
+
+```html
+<paper-item role="menuitemcheckbox">
+ <paper-item-body>
+ Show your status
+ </paper-item-body>
+ <paper-checkbox></paper-checkbox>
+</paper-item>
+```
+
+
+
+## &lt;paper-icon-item&gt;
+
+`<paper-icon-item>` is a convenience element to make an item with icon. It is an interactive list
+item with a fixed-width icon area, according to Material Design. This is useful if the icons are of
+varying widths, but you want the item bodies to line up. Use this like a `<paper-item>`. The child
+node with the attribute `item-icon` is placed in the icon area.
+
+```html
+<paper-icon-item>
+ <iron-icon icon="favorite" item-icon></iron-icon>
+ Favorite
+</paper-icon-item>
+<paper-icon-item>
+ <div class="avatar" item-icon></div>
+ Avatar
+</paper-icon-item>
+```
+
+### Styling
+
+The following custom properties and mixins are available for styling:
+
+| Custom property | Description | Default |
+| --- | --- | --- |
+| `--paper-item-icon-width` | Width of the icon area | `56px` |
+| `--paper-item-icon` | Mixin applied to the icon area | `{}` |
+| `--paper-icon-item` | Mixin applied to the item | `{}` |
+| `--paper-item-selected-weight` | The font weight of a selected item | `bold` |
+| `--paper-item-selected` | Mixin applied to selected paper-items | `{}` |
+| `--paper-item-disabled-color` | The color for disabled paper-items | `--disabled-text-color` |
+| `--paper-item-disabled` | Mixin applied to disabled paper-items | `{}` |
+| `--paper-item-focused` | Mixin applied to focused paper-items | `{}` |
+| `--paper-item-focused-before` | Mixin applied to :before focused paper-items | `{}` |
+
+
+
+## &lt;paper-item-body&gt;
+
+Use `<paper-item-body>` in a `<paper-item>` or `<paper-icon-item>` to make two- or
+three- line items. It is a flex item that is a vertical flexbox.
+
+```html
+<paper-item>
+ <paper-item-body two-line>
+ <div>Show your status</div>
+ <div secondary>Your status is visible to everyone</div>
+ </paper-item-body>
+</paper-item>
+```
+
+The child elements with the `secondary` attribute is given secondary text styling.
+
+### Styling
+
+The following custom properties and mixins are available for styling:
+
+| Custom property | Description | Default |
+| --- | --- | --- |
+| `--paper-item-body-two-line-min-height` | Minimum height of a two-line item | `72px` |
+| `--paper-item-body-three-line-min-height` | Minimum height of a three-line item | `88px` |
+| `--paper-item-body-secondary-color` | Foreground color for the `secondary` area | `--secondary-text-color` |
+| `--paper-item-body-secondary` | Mixin applied to the `secondary` area | `{}` |
+
+
+
+<!-- No docs for Polymer.PaperItemBehavior found. -->
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/all-imports.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/all-imports.html
new file mode 100644
index 00000000000..4b1583fe410
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/all-imports.html
@@ -0,0 +1,13 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="paper-item.html">
+<link rel="import" href="paper-item-body.html">
+<link rel="import" href="paper-icon-item.html">
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/bower.json
new file mode 100644
index 00000000000..2aa61f4a0ac
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/bower.json
@@ -0,0 +1,72 @@
+{
+ "name": "paper-item",
+ "version": "2.0.0",
+ "description": "A material-design styled list item",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "item"
+ ],
+ "main": [
+ "paper-item.html",
+ "paper-icon-item.html",
+ "paper-item-body.html"
+ ],
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-item"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-item",
+ "ignore": [],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-behaviors": "PolymerElements/iron-behaviors#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-icon": "PolymerElements/iron-icon#1 - 2",
+ "iron-icons": "PolymerElements/iron-icons#1 - 2",
+ "paper-icon-button": "PolymerElements/paper-icon-button#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "paper-input": "PolymerElements/paper-input#1 - 2"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-icon": "PolymerElements/iron-icon#^1.0.0",
+ "iron-icons": "PolymerElements/iron-icons#^1.0.0",
+ "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "paper-input": "PolymerElements/paper-input#^1.1.22"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/demo/index.html
new file mode 100644
index 00000000000..3da7ec291f9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/demo/index.html
@@ -0,0 +1,197 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <title>paper-item demo</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../iron-icon/iron-icon.html">
+ <link rel="import" href="../../iron-icons/iron-icons.html">
+ <link rel="import" href="../../iron-icons/communication-icons.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../../paper-icon-button/paper-icon-button.html">
+ <link rel="import" href="../paper-icon-item.html">
+ <link rel="import" href="../paper-item.html">
+ <link rel="import" href="../paper-item-body.html">
+ <link rel="import" href="../../paper-styles/color.html">
+
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles">
+ div[role="listbox"] {
+ border: 1px solid #e5e5e5;
+ }
+ .avatar {
+ display: inline-block;
+ box-sizing: border-box;
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ background: var(--paper-amber-500);
+ }
+
+ .blue {
+ background-color: var(--paper-light-blue-300);
+ }
+ </style>
+ </custom-style>
+</head>
+<body unresolved>
+ <div class="vertical-section-container centered">
+ <h3>Paper-items are simple list elements, ideally used in a paper-listbox or
+ an element with <i>role="listbox"</i></h3>
+ <demo-snippet>
+ <template>
+ <div role="listbox">
+ <paper-item>Inbox</paper-item>
+ <paper-item>Starred</paper-item>
+ <paper-item>Sent mail</paper-item>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h3>They can be styled using custom properties</h3>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ paper-item.fancy {
+ --paper-item-focused: {
+ background: var(--paper-amber-500);
+ font-weight: bold;
+ };
+ --paper-item-focused-before: {
+ opacity: 0;
+ };
+ }
+ </style>
+ </custom-style>
+ <div role="listbox">
+ <paper-item class="fancy">Inbox</paper-item>
+ <paper-item class="fancy">Starred</paper-item>
+ <paper-item class="fancy">Sent mail</paper-item>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h3>To add a leading element, use a paper-icon-item with a <code>slot="item-icon"</code>
+ attribute in webcomponents v1. This leading image can be an iron-icon, or any other regular element.</h3>
+ <demo-snippet>
+ <template>
+ <div role="listbox">
+ <paper-icon-item>
+ <iron-icon icon="inbox" slot="item-icon"></iron-icon>
+ Inbox
+ </paper-icon-item>
+ <paper-icon-item>
+ <iron-icon icon="star" slot="item-icon"></iron-icon>
+ Starred
+ </paper-icon-item>
+ <paper-icon-item>
+ <div class="avatar blue" slot="item-icon"></div>
+ Alphonso Engelking
+ </paper-icon-item>
+ <paper-icon-item>
+ <div class="avatar" slot="item-icon"></div>
+ Angela Decker
+ </paper-icon-item>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h3>For two-line items, use a paper-item-body inside a paper-item or paper-icon-item</h3>
+ <demo-snippet>
+ <template>
+ <div role="listbox">
+ <paper-item>
+ <paper-item-body two-line>
+ <div>Profile Photo</div>
+ <div secondary>Change your Google+ profile photo</div>
+ </paper-item-body>
+ </paper-item>
+ <paper-icon-item>
+ <iron-icon icon="communication:phone" slot="item-icon">
+ </iron-icon>
+ <paper-item-body two-line>
+ <div>(650) 555-1234</div>
+ <div secondary>Mobile</div>
+ </paper-item-body>
+ </paper-icon-item>
+ <paper-icon-item>
+ <div class="avatar blue" slot="item-icon"></div>
+ <paper-item-body two-line>
+ <div>Alphonso Engelking</div>
+ <div secondary>Change photo</div>
+ </paper-item-body>
+ </paper-icon-item>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h3>Complex layouts are usually a combination of all these elements</h3>
+ <demo-snippet>
+ <template>
+ <div role="listbox">
+ <paper-icon-item>
+ <div class="avatar blue" slot="item-icon"></div>
+ <paper-item-body two-line>
+ <div>Photos</div>
+ <div secondary>Jan 9, 2014</div>
+ </paper-item-body>
+ <paper-icon-button icon="star" alt="favourite this!">
+ </paper-icon-button>
+ </paper-icon-item>
+ <paper-icon-item>
+ <div class="avatar" slot="item-icon"></div>
+ <paper-item-body two-line>
+ <div>Recipes</div>
+ <div secondary>Jan 17, 2014</div>
+ </paper-item-body>
+ <paper-icon-button icon="star" alt="favourite this!">
+ </paper-icon-button>
+ </paper-icon-item>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h3>Paper-items can be used as links</h3>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ .paper-item-link {
+ color: inherit;
+ text-decoration: none;
+ }
+ </style>
+ </custom-style>
+ <div role="listbox">
+ <a class="paper-item-link" href="#inbox" tabindex="-1">
+ <paper-item>Inbox</paper-item>
+ </a>
+ <a class="paper-item-link" href="#starred" tabindex="-1">
+ <paper-item>Starred</paper-item>
+ </a>
+ <a class="paper-item-link" href="#sent" tabindex="-1">
+ <paper-item>Sent mail</paper-item>
+ </a>
+ </div>
+ </template>
+ </demo-snippet>
+ </div>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/index.html
new file mode 100644
index 00000000000..b409ed121cd
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/index.html
@@ -0,0 +1,30 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<!doctype html>
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+
+ <title>paper-item</title>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../polymer/polymer.html">
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page src="all-imports.html"></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/paper-icon-item.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/paper-icon-item.html
new file mode 100644
index 00000000000..44581ed5d45
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/paper-icon-item.html
@@ -0,0 +1,86 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="../paper-styles/typography.html">
+<link rel="import" href="paper-item-behavior.html">
+<link rel="import" href="paper-item-shared-styles.html">
+
+<!--
+`<paper-icon-item>` is a convenience element to make an item with icon. It is an interactive list
+item with a fixed-width icon area, according to Material Design. This is useful if the icons are of
+varying widths, but you want the item bodies to line up. Use this like a `<paper-item>`. The child
+node with the slot name `item-icon` is placed in the icon area.
+
+ <paper-icon-item>
+ <iron-icon icon="favorite" slot="item-icon"></iron-icon>
+ Favorite
+ </paper-icon-item>
+ <paper-icon-item>
+ <div class="avatar" slot="item-icon"></div>
+ Avatar
+ </paper-icon-item>
+
+### Styling
+
+The following custom properties and mixins are available for styling:
+
+Custom property | Description | Default
+------------------------------|------------------------------------------------|----------
+`--paper-item-icon-width` | Width of the icon area | `56px`
+`--paper-item-icon` | Mixin applied to the icon area | `{}`
+`--paper-icon-item` | Mixin applied to the item | `{}`
+`--paper-item-selected-weight`| The font weight of a selected item | `bold`
+`--paper-item-selected` | Mixin applied to selected paper-items | `{}`
+`--paper-item-disabled-color` | The color for disabled paper-items | `--disabled-text-color`
+`--paper-item-disabled` | Mixin applied to disabled paper-items | `{}`
+`--paper-item-focused` | Mixin applied to focused paper-items | `{}`
+`--paper-item-focused-before` | Mixin applied to :before focused paper-items | `{}`
+-->
+
+<dom-module id="paper-icon-item">
+ <template>
+ <style include="paper-item-shared-styles"></style>
+ <style>
+ :host {
+ @apply --layout-horizontal;
+ @apply --layout-center;
+ @apply --paper-font-subhead;
+
+ @apply --paper-item;
+ @apply --paper-icon-item;
+ }
+
+ .content-icon {
+ @apply --layout-horizontal;
+ @apply --layout-center;
+
+ width: var(--paper-item-icon-width, 56px);
+ @apply --paper-item-icon;
+ }
+ </style>
+
+ <div id="contentIcon" class="content-icon">
+ <slot name="item-icon"></slot>
+ </div>
+ <slot></slot>
+ </template>
+
+ <script>
+ Polymer({
+ is: 'paper-icon-item',
+
+ behaviors: [
+ Polymer.PaperItemBehavior
+ ]
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/paper-item-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/paper-item-behavior.html
new file mode 100644
index 00000000000..f97b262b737
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/paper-item-behavior.html
@@ -0,0 +1,36 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-behaviors/iron-button-state.html">
+<link rel="import" href="../iron-behaviors/iron-control-state.html">
+
+<!--
+`PaperItemBehavior` is a convenience behavior shared by <paper-item> and
+<paper-icon-item> that manages the shared control states and attributes of
+the items.
+-->
+
+<script>
+ /** @polymerBehavior Polymer.PaperItemBehavior */
+ Polymer.PaperItemBehaviorImpl = {
+ hostAttributes: {
+ role: 'option',
+ tabindex: '0'
+ }
+ };
+
+ /** @polymerBehavior */
+ Polymer.PaperItemBehavior = [
+ Polymer.IronButtonState,
+ Polymer.IronControlState,
+ Polymer.PaperItemBehaviorImpl
+ ];
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/paper-item-body.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/paper-item-body.html
new file mode 100644
index 00000000000..4f5079f77f8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/paper-item-body.html
@@ -0,0 +1,83 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="../paper-styles/default-theme.html">
+<link rel="import" href="../paper-styles/typography.html">
+
+<!--
+Use `<paper-item-body>` in a `<paper-item>` or `<paper-icon-item>` to make two- or
+three- line items. It is a flex item that is a vertical flexbox.
+
+ <paper-item>
+ <paper-item-body two-line>
+ <div>Show your status</div>
+ <div secondary>Your status is visible to everyone</div>
+ </paper-item-body>
+ </paper-item>
+
+The child elements with the `secondary` attribute is given secondary text styling.
+
+### Styling
+
+The following custom properties and mixins are available for styling:
+
+Custom property | Description | Default
+----------------|-------------|----------
+`--paper-item-body-two-line-min-height` | Minimum height of a two-line item | `72px`
+`--paper-item-body-three-line-min-height` | Minimum height of a three-line item | `88px`
+`--paper-item-body-secondary-color` | Foreground color for the `secondary` area | `--secondary-text-color`
+`--paper-item-body-secondary` | Mixin applied to the `secondary` area | `{}`
+
+-->
+
+<dom-module id="paper-item-body">
+ <template>
+ <style>
+ :host {
+ overflow: hidden; /* needed for text-overflow: ellipsis to work on ff */
+ @apply --layout-vertical;
+ @apply --layout-center-justified;
+ @apply --layout-flex;
+ }
+
+ :host([two-line]) {
+ min-height: var(--paper-item-body-two-line-min-height, 72px);
+ }
+
+ :host([three-line]) {
+ min-height: var(--paper-item-body-three-line-min-height, 88px);
+ }
+
+ :host > ::slotted(*) {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ :host > ::slotted([secondary]) {
+ @apply --paper-font-body1;
+
+ color: var(--paper-item-body-secondary-color, var(--secondary-text-color));
+
+ @apply --paper-item-body-secondary;
+ }
+ </style>
+
+ <slot></slot>
+ </template>
+
+ <script>
+ Polymer({
+ is: 'paper-item-body'
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/paper-item-shared-styles.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/paper-item-shared-styles.html
new file mode 100644
index 00000000000..bc7aba678d7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/paper-item-shared-styles.html
@@ -0,0 +1,70 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="../paper-styles/color.html">
+<link rel="import" href="../paper-styles/default-theme.html">
+<link rel="import" href="../paper-styles/typography.html">
+
+<dom-module id="paper-item-shared-styles">
+ <template>
+ <style>
+ :host, .paper-item {
+ display: block;
+ position: relative;
+ min-height: var(--paper-item-min-height, 48px);
+ padding: 0px 16px;
+ }
+
+ .paper-item {
+ @apply --paper-font-subhead;
+ border:none;
+ outline: none;
+ background: white;
+ width: 100%;
+ text-align: left;
+ }
+
+ :host([hidden]), .paper-item[hidden] {
+ display: none !important;
+ }
+
+ :host(.iron-selected), .paper-item.iron-selected {
+ font-weight: var(--paper-item-selected-weight, bold);
+
+ @apply --paper-item-selected;
+ }
+
+ :host([disabled]), .paper-item[disabled] {
+ color: var(--paper-item-disabled-color, var(--disabled-text-color));
+
+ @apply --paper-item-disabled;
+ }
+
+ :host(:focus), .paper-item:focus {
+ position: relative;
+ outline: 0;
+
+ @apply --paper-item-focused;
+ }
+
+ :host(:focus):before, .paper-item:focus:before {
+ @apply --layout-fit;
+
+ background: currentColor;
+ content: '';
+ opacity: var(--dark-divider-opacity);
+ pointer-events: none;
+
+ @apply --paper-item-focused-before;
+ }
+ </style>
+ </template>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/paper-item.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/paper-item.html
new file mode 100644
index 00000000000..6c8946f0e03
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-item/paper-item.html
@@ -0,0 +1,110 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="paper-item-behavior.html">
+<link rel="import" href="paper-item-shared-styles.html">
+
+<!--
+Material design: [Lists](https://www.google.com/design/spec/components/lists.html)
+
+`<paper-item>` is an interactive list item. By default, it is a horizontal flexbox.
+
+ <paper-item>Item</paper-item>
+
+Use this element with `<paper-item-body>` to make Material Design styled two-line and three-line
+items.
+
+ <paper-item>
+ <paper-item-body two-line>
+ <div>Show your status</div>
+ <div secondary>Your status is visible to everyone</div>
+ </paper-item-body>
+ <iron-icon icon="warning"></iron-icon>
+ </paper-item>
+
+To use `paper-item` as a link, wrap it in an anchor tag. Since `paper-item` will
+already receive focus, you may want to prevent the anchor tag from receiving
+focus as well by setting its tabindex to -1.
+
+ <a href="https://www.polymer-project.org/" tabindex="-1">
+ <paper-item raised>Polymer Project</paper-item>
+ </a>
+
+If you are concerned about performance and want to use `paper-item` in a `paper-listbox`
+with many items, you can just use a native `button` with the `paper-item` class
+applied (provided you have correctly included the shared styles):
+
+ <style is="custom-style" include="paper-item-shared-styles"></style>
+
+ <paper-listbox>
+ <button class="paper-item" role="option">Inbox</button>
+ <button class="paper-item" role="option">Starred</button>
+ <button class="paper-item" role="option">Sent mail</button>
+ </paper-listbox>
+
+### Styling
+
+The following custom properties and mixins are available for styling:
+
+Custom property | Description | Default
+------------------------------|----------------------------------------------|----------
+`--paper-item-min-height` | Minimum height of the item | `48px`
+`--paper-item` | Mixin applied to the item | `{}`
+`--paper-item-selected-weight`| The font weight of a selected item | `bold`
+`--paper-item-selected` | Mixin applied to selected paper-items | `{}`
+`--paper-item-disabled-color` | The color for disabled paper-items | `--disabled-text-color`
+`--paper-item-disabled` | Mixin applied to disabled paper-items | `{}`
+`--paper-item-focused` | Mixin applied to focused paper-items | `{}`
+`--paper-item-focused-before` | Mixin applied to :before focused paper-items | `{}`
+
+### Accessibility
+
+This element has `role="listitem"` by default. Depending on usage, it may be more appropriate to set
+`role="menuitem"`, `role="menuitemcheckbox"` or `role="menuitemradio"`.
+
+ <paper-item role="menuitemcheckbox">
+ <paper-item-body>
+ Show your status
+ </paper-item-body>
+ <paper-checkbox></paper-checkbox>
+ </paper-item>
+
+@group Paper Elements
+@element paper-item
+@demo demo/index.html
+-->
+
+<dom-module id="paper-item">
+ <template>
+ <style include="paper-item-shared-styles"></style>
+ <style>
+ :host {
+ @apply --layout-horizontal;
+ @apply --layout-center;
+ @apply --paper-font-subhead;
+
+ @apply --paper-item;
+ }
+ </style>
+ <slot></slot>
+ </template>
+
+ <script>
+ Polymer({
+ is: 'paper-item',
+
+ behaviors: [
+ Polymer.PaperItemBehavior
+ ]
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/.bower.json
new file mode 100644
index 00000000000..cb70fbf0ceb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/.bower.json
@@ -0,0 +1,63 @@
+{
+ "name": "paper-material",
+ "version": "2.1.0",
+ "description": "A material design container that looks like a lifted sheet of paper",
+ "private": true,
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "web-component",
+ "polymer",
+ "paper",
+ "container"
+ ],
+ "main": "paper-material.html",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-material"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-material",
+ "ignore": [],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0"
+ },
+ "devDependencies": {
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.1.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.0",
+ "commit": "7bce7d98daa7cdf25de6ba7596090266ca0f7bb5"
+ },
+ "_source": "https://github.com/PolymerElements/paper-material.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/paper-material"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/.github/CODEOWNERS
new file mode 100644
index 00000000000..cc86f1ec217
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @notwaldorf
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..43d220da155
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/paper-material/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/.travis.yml
new file mode 100644
index 00000000000..2ea87628a28
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/.travis.yml
@@ -0,0 +1,30 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+env:
+ global:
+ - secure: >-
+ R8lCIZgsXsGs5DyUoTfZn0SyVglnf0RKyMQhr11/EtOlhAYA2LmGr9W0EpxsJ/+jyobIcmPMQ/MEpqcE4ZfkJNb3mwKYPfEcbD6zlQ/uDK7JX64r5ErPxynMn7cEUbhPkbmX0Kp5i7NK39cR9STth9gHN66Bfoq1Eoju0GFZ0no=
+ - secure: >-
+ KgR0+L67emjn9JkzZoyHkuY24OzRdX5NmHaKiOI2mpKF3XqTSzVRCLdlw1yL9D7apRAhrxFRqv0+Y0kJb44KZWUYl2kckZI85psSMx42Oj6SXgLwa+SNZ8FA/BIetSEYPtmXZTvcPlZwEWqulkagfYN3nw8ugo5Vno75piPtcLs=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+ sauce_connect: true
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/README.md
new file mode 100644
index 00000000000..7ddb364d187
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/README.md
@@ -0,0 +1,34 @@
+
+<!---
+
+This README is automatically generated from the comments in these files:
+paper-material.html
+
+Edit those files, and our readme bot will duplicate them over here!
+Edit this file, and the bot will squash your changes :)
+
+The bot does some handling of markdown. Please file a bug if it does the wrong
+thing! https://github.com/PolymerLabs/tedium/issues
+
+-->
+
+[![Build status](https://travis-ci.org/PolymerElements/paper-material.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-material)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/paper-material)_
+
+⚠️ As of the 2.0 release, this element is **deprecated** in favour of the shared styles in [`PolymerElements/paper-styles`](https://github.com/PolymerElements/paper-styles/blob/master/element-styles/paper-material-styles.html). Please see the implementation of [`PolymerElements/paper-button`](https://github.com/PolymerElements/paper-button/blob/master/paper-button.html#L114) for an example.
+
+## &lt;paper-material&gt;
+
+Material design: [Cards](https://www.google.com/design/spec/components/cards.html)
+
+`paper-material` is a container that renders two shadows on top of each other to
+create the effect of a lifted piece of paper.
+
+Example:
+
+```html
+<paper-material elevation="1">
+ ... content ...
+</paper-material>
+```
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/bower.json
new file mode 100644
index 00000000000..edc5623307d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/bower.json
@@ -0,0 +1,54 @@
+{
+ "name": "paper-material",
+ "version": "2.0.0",
+ "description": "A material design container that looks like a lifted sheet of paper",
+ "private": true,
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "web-component",
+ "polymer",
+ "paper",
+ "container"
+ ],
+ "main": "paper-material.html",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-material"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-material",
+ "ignore": [],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0"
+ },
+ "devDependencies": {
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/demo/index.html
new file mode 100644
index 00000000000..f5dce5f7d32
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/demo/index.html
@@ -0,0 +1,85 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <title>paper-material demo</title>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../paper-material.html">
+
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles">
+ paper-material {
+ display: inline-block;
+ background: white;
+ box-sizing: border-box;
+ margin: 8px;
+ padding: 16px;
+ border-radius: 2px;
+ }
+ </style>
+ </custom-style>
+</head>
+<body unresolved>
+ <div class="vertical-section-container centered">
+ <h3>Paper-materials can have different elevations</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <paper-material elevation="0">0</paper-material>
+ <paper-material elevation="1">1</paper-material>
+ <paper-material elevation="2">2</paper-material>
+ <paper-material elevation="3">3</paper-material>
+ <paper-material elevation="4">4</paper-material>
+ <paper-material elevation="5">5</paper-material>
+ </template>
+ </demo-snippet>
+
+ <h3>Changes in elevation can be animated. Tap each of these boxes!</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <style>
+ #a1, #a2 { cursor: pointer; }
+ </style>
+ <div>
+ <paper-material elevation="0" animated id="a1">animated</paper-material>
+ <paper-material elevation="3" id="a2">not animated</paper-material>
+ </div>
+ <script>
+ window.addEventListener('WebComponentsReady', function() {
+ a1.addEventListener('click', _onTap);
+ a2.addEventListener('click', _onTap);
+ });
+ function _onTap(e) {
+ var target = e.target;
+ if (!target.down) {
+ target.elevation += 1;
+ if (target.elevation === 5) {
+ target.down = true;
+ }
+ } else {
+ target.elevation -= 1;
+ if (target.elevation === 0) {
+ target.down = false;
+ }
+ }
+ };
+ </script>
+ </template>
+ </demo-snippet>
+ </div>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/index.html
new file mode 100644
index 00000000000..7209e6d0952
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/index.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+
+ <title>paper-material</title>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../polymer/polymer.html">
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/package-lock.json
new file mode 100644
index 00000000000..58b1477ec47
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/package-lock.json
@@ -0,0 +1,986 @@
+{
+ "name": "@polymer/paper-material",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.1.1.tgz",
+ "integrity": "sha512-rUfH6USpiPYSHl2dC+/rGb3RYK8LPyqNhiuZCLv13F0fhYr01jdTogGuSphEoSLklm1gKRsDsrfZq7OvpzPYEg==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.0",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.1",
+ "command-line-usage": "4.1.0",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.0",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.10"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.97",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.97.tgz",
+ "integrity": "sha512-k3CDdCq8Uv8AZ7/bmGSSvlwbPDPhkkckSq8Y9ndXowv86m3k07PjG98SigpjVAY9EyHV9kiFldEV306xh4gkig==",
+ "dev": true
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.10",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.10.tgz",
+ "integrity": "sha1-9vCd15PdL0IomsAdoCb8q6ZfGYw=",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.97",
+ "@types/parse5": "2.2.34",
+ "babel-generator": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "2.3.0",
+ "indent": "0.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "2.2.3",
+ "polymer-project-config": "3.8.1",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.1"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ }
+ }
+ }
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz",
+ "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.0"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.0"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.0.tgz",
+ "integrity": "sha512-zkYho6/4wZyX6o9UQ8rd0ReEaiEYNNCqYFIAACe2Tf9DrYlgzWW27OigYHnnztnnZQwVRpwWmZKegFmDpinIsA==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.0"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.7.tgz",
+ "integrity": "sha512-jNhbkxPtt9xbzvihfA0OavjJbpCIyTDSmwE03BVXgCKcz9lwNsq4cg2wsNkY4Av5eH35ttBArhYtVJa6CIrg2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.0"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.0.0.tgz",
+ "integrity": "sha512-v+0wW9Wezwsyb0uF4aBVCjmSqit3Ru7PZFziGF0o2KwTvN2zWfTi3BRLq9EkJFdg3eBbyERXGTntVpBxH1J68Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz",
+ "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.4",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.2",
+ "lodash": "4.17.4"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.4",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
+ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.1.tgz",
+ "integrity": "sha512-gRJDcIjFSzMcmG/GrJlgL0wWoAxr11mVzCq32bjka0endupm9meLwvoJUKc4HDeFiEIB2X3GvNrhF5cKO4Bd4A==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
+ "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "4.0.0",
+ "array-back": "2.0.0",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz",
+ "integrity": "sha1-+CBJdb0NrLvltYqKk//B/tD/zSo=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "6.0.96",
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "2.2.3"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.96",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.96.tgz",
+ "integrity": "sha512-fsOOY6tMQ3jCB2wD51XFDmmpgm4wVKkJECdcVRqapbJEa7awJDcr+SaH8toz+4r4KW8YQ3M7ybXMoSDo1QGewA==",
+ "dev": true
+ }
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz",
+ "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.5.7"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.4",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
+ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.8"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz",
+ "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.7",
+ "winston": "2.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.8.1.tgz",
+ "integrity": "sha512-MLvnM9gexFWg7nynY24eHZG6NLXocmk718sVds/sx2CAJ6iihhC0JMhhOIa6jnad9KQrHyGl/cs3mMRaaub5Fg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.96",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.96",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.96.tgz",
+ "integrity": "sha512-fsOOY6tMQ3jCB2wD51XFDmmpgm4wVKkJECdcVRqapbJEa7awJDcr+SaH8toz+4r4KW8YQ3M7ybXMoSDo1QGewA==",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.1.tgz",
+ "integrity": "sha1-Eahr7+rDxKo+wIYjZRo8gabQu8g=",
+ "dev": true
+ },
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/package.json
new file mode 100644
index 00000000000..14d5f9496ec
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@polymer/paper-material",
+ "private": true,
+ "description": "A material design container that looks like a lifted sheet of paper",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-material"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.1.1",
+ "bower": "^1.8.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir ."
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/paper-material-shared-styles.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/paper-material-shared-styles.d.ts
new file mode 100644
index 00000000000..2d6838a9c93
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/paper-material-shared-styles.d.ts
@@ -0,0 +1,12 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-material-shared-styles.html
+ */
+
+/// <reference path="../paper-styles/shadow.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/paper-material-shared-styles.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/paper-material-shared-styles.html
new file mode 100644
index 00000000000..3d1313cf34c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/paper-material-shared-styles.html
@@ -0,0 +1,42 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../paper-styles/shadow.html">
+
+<dom-module id="paper-material-shared-styles">
+ <template>
+ <style>
+ :host {
+ display: block;
+ position: relative;
+ }
+
+ :host([elevation="1"]) {
+ @apply --shadow-elevation-2dp;
+ }
+
+ :host([elevation="2"]) {
+ @apply --shadow-elevation-4dp;
+ }
+
+ :host([elevation="3"]) {
+ @apply --shadow-elevation-6dp;
+ }
+
+ :host([elevation="4"]) {
+ @apply --shadow-elevation-8dp;
+ }
+
+ :host([elevation="5"]) {
+ @apply --shadow-elevation-16dp;
+ }
+ </style>
+ </template>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/paper-material.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/paper-material.d.ts
new file mode 100644
index 00000000000..702968cec28
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/paper-material.d.ts
@@ -0,0 +1,45 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-material.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../paper-styles/shadow.d.ts" />
+/// <reference path="paper-material-shared-styles.d.ts" />
+
+/**
+ * Material design: [Cards](https://www.google.com/design/spec/components/cards.html)
+ *
+ * `paper-material` is a container that renders two shadows on top of each other to
+ * create the effect of a lifted piece of paper.
+ *
+ * Example:
+ *
+ * <paper-material elevation="1">
+ * ... content ...
+ * </paper-material>
+ */
+interface PaperMaterialElement extends Polymer.Element {
+
+ /**
+ * The z-depth of this element, from 0-5. Setting to 0 will remove the
+ * shadow, and each increasing number greater than 0 will be "deeper"
+ * than the last.
+ */
+ elevation: number|null|undefined;
+
+ /**
+ * Set this to true to animate the shadow when setting a new
+ * `elevation` value.
+ */
+ animated: boolean|null|undefined;
+}
+
+interface HTMLElementTagNameMap {
+ "paper-material": PaperMaterialElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/paper-material.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/paper-material.html
new file mode 100644
index 00000000000..3618f3eed0e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-material/paper-material.html
@@ -0,0 +1,81 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../paper-styles/shadow.html">
+<link rel="import" href="paper-material-shared-styles.html">
+
+<!--
+Material design: [Cards](https://www.google.com/design/spec/components/cards.html)
+
+`paper-material` is a container that renders two shadows on top of each other to
+create the effect of a lifted piece of paper.
+
+Example:
+
+ <paper-material elevation="1">
+ ... content ...
+ </paper-material>
+
+@group Paper Elements
+@demo demo/index.html
+-->
+
+<dom-module id="paper-material">
+ <template>
+ <style include="paper-material-shared-styles"></style>
+ <style>
+ :host([animated]) {
+ @apply --shadow-transition;
+ }
+ :host {
+ @apply --paper-material;
+ }
+ </style>
+
+ <slot></slot>
+ </template>
+</dom-module>
+<script>
+ Polymer({
+ is: 'paper-material',
+
+ properties: {
+ /**
+ * The z-depth of this element, from 0-5. Setting to 0 will remove the
+ * shadow, and each increasing number greater than 0 will be "deeper"
+ * than the last.
+ *
+ * @attribute elevation
+ * @type number
+ * @default 1
+ */
+ elevation: {
+ type: Number,
+ reflectToAttribute: true,
+ value: 1
+ },
+
+ /**
+ * Set this to true to animate the shadow when setting a new
+ * `elevation` value.
+ *
+ * @attribute animated
+ * @type boolean
+ * @default false
+ */
+ animated: {
+ type: Boolean,
+ reflectToAttribute: true,
+ value: false
+ }
+ }
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/.bower.json
new file mode 100644
index 00000000000..8c9c8ff9126
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/.bower.json
@@ -0,0 +1,65 @@
+{
+ "name": "paper-progress",
+ "version": "2.1.1",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "A material design progress bar",
+ "authors": "The Polymer Authors",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "progress",
+ "loading"
+ ],
+ "main": "paper-progress.html",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-progress.git"
+ },
+ "dependencies": {
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-range-behavior": "PolymerElements/iron-range-behavior#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "paper-button": "PolymerElements/paper-button#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "iron-range-behavior": "PolymerElements/iron-range-behavior#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "paper-button": "PolymerElements/paper-button#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "homepage": "https://github.com/PolymerElements/paper-progress",
+ "_release": "2.1.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.1",
+ "commit": "ea1cd8dc30ece12f83d0eaaebc2df4e1fa05f0b6"
+ },
+ "_source": "https://github.com/PolymerElements/paper-progress.git",
+ "_target": "^2.0.0",
+ "_originalSource": "paper-progress"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/.github/CODEOWNERS
new file mode 100644
index 00000000000..0d8c0ad6b48
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @bicknellr
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..09b5a1e5dbc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/paper-progress/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/.travis.yml
new file mode 100644
index 00000000000..79bb8769627
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/.travis.yml
@@ -0,0 +1,32 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e '\n\033[31mERROR:\033[0m
+ Project is not formatted. Please run "npm run format".' && false)
+env:
+ global:
+ - secure: >-
+ H1BFM+lOHi3yosJV4VpeDHO/N33EeAeQqKbWMAiGfbjMmVUa2Y9gQzpIONMtO09KMTZMw0dlE3GYNLnc44JXlnSvmp34Fh8KpxOz4BxlbIj2aw/M99FWxRAJYpV+BWWKhwwuFq6DctATljcdfvYyHxpjCAFjTIMCCAHtdVrowlxMlivu/BSlBlZ4HR0OfHr7l8PAC1hSieWr5Rpk0PMcQ6B0nEhSTRgGdxEwADnkOL3Sx966vNv3qxwIML29UrZ3mFdfrgnfwdNZTivjDaRhY4tUu7bw5vP8c4PeVR7lalhVBse5J4xKo7Xw80To+bm/0Hyo4ZgZPzEbq0EAIszRnwRo/d4YiFGkyIgFHJ8a/v2h3BWxW+9W51nKsQcFijitu2pMhKC9ankRxL23TK0rtYff6hj/bCwtfy/965PzZgiAeBgcQUZ25+unOc11VAyIEGUZeLAqzulMOn2LAcvSrVEVGpb90whvVxfG3T8hkFbIrPtD3TWrtvt4ul/25pe+eLNET2DUTqrPFfizthyaGFfavykA6PPGI58AFD2EnFmaD9eJC/eCP34FAZec8G2yMbXOYxg6B40Z1ezHo8j7jzbekEJBsHVegpart9YSxQwx5b95SsqlPbyhdLLHIZIzT9dSfbS/l0YFUYbejeMM5koi1qdqXVCdCMpbwS61WA8=
+ - secure: >-
+ KZek5eiBlb80rC3C0pgb39C4mWskrGJdxV0Xp9WBAnJQkXN4fvKgB5QOIGVV8yP/aM824zv/nj1Z61MWcjKw5kYJBon0Hw4Qemk7KJh7kde5bhg+3dWcdfv8Hhz9wuVGxqmZ01N8LWat+dRzEqY5ZawFQ+P2M/FXxxwKKsH3GKpjgjN2G8u7nadD2p4hDIBmVVGK0dqDZDOg+YZ+jEdGyWTbjeVOnktvb6dDfcKm52VIpcgAvqa8CCFFwTE3lFrHK4UdiqxFW2YcIB1lgJADJ1B2wAjL0cuf97uu8jaCpCGMeQXz5/XH5SxLA8ah/6GV7C37+WlEPeyallUUbSn05m/xYVFEMvrw/04bFQUyiwt9/rdqA8OLNOUwIEk9hMWC3LkooE2LTLs4l1OKN2x9OuTGPTU2f4LrH4z32zSChxjI/4fqCFwDJs6MBfQFIlpV1e6F1YOvPLPOtBLLTVK1n1KeXeY9HSvk+f5lxRwS4VFZ1oG6+a/l+MoB2HMUmhEn0Wa+KS2qk5Yfea/UIlvi8IuA7zsXoeYkBuwIT7VJVdU0Oebfkam4jWR6qYs/QQF/MchzungKchhwyhsSzQvCuaHJhdA6D1L0oqkXRpPouJwkcvGu9z+wf+zPfh3h065Trg7tC4DYHnXRSTF0ocO3H+EfImRSP5jsgPz0gMl4iI0=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/README.md
new file mode 100644
index 00000000000..3eb090c31b9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/README.md
@@ -0,0 +1,49 @@
+[![Build status](https://travis-ci.org/PolymerElements/paper-progress.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-progress)
+[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://www.webcomponents.org/element/PolymerElements/paper-progress)
+
+## &lt;paper-progress&gt;
+
+Material design: [Progress & activity](https://www.google.com/design/spec/components/progress-activity.html)
+
+<!---
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../paper-styles/color.html">
+ <link rel="import" href="paper-progress.html">
+ <style is="custom-style">
+ paper-progress {
+ display: block;
+ width: 100%;
+ margin: 20px 0;
+ }
+ paper-progress.slow {
+ --paper-progress-indeterminate-cycle-duration: 5s;
+ }
+ paper-progress.blue {
+ --paper-progress-active-color: var(--paper-light-blue-500);
+ --paper-progress-secondary-color: var(--paper-light-blue-100);
+ }
+ paper-progress.red {
+ --paper-progress-active-color: var(--paper-red-500);
+ --paper-progress-secondary-color: var(--paper-red-100);
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<paper-progress indeterminate class="blue"></paper-progress>
+<paper-progress indeterminate class="slow red"></paper-progress>
+<paper-progress value="40" secondary-progress="80"></paper-progress>
+```
+
+The progress bars are for situations where the percentage completed can be
+determined. They give users a quick sense of how much longer an operation
+will take.
+
+There is also a secondary progress which is useful for displaying intermediate
+progress, such as the buffer level during a streaming playback progress bar.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/bower.json
new file mode 100644
index 00000000000..54567a62059
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/bower.json
@@ -0,0 +1,55 @@
+{
+ "name": "paper-progress",
+ "version": "2.1.1",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "A material design progress bar",
+ "authors": "The Polymer Authors",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "progress",
+ "loading"
+ ],
+ "main": "paper-progress.html",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-progress.git"
+ },
+ "dependencies": {
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-range-behavior": "PolymerElements/iron-range-behavior#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "paper-button": "PolymerElements/paper-button#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "iron-range-behavior": "PolymerElements/iron-range-behavior#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "paper-button": "PolymerElements/paper-button#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/demo/index.html
new file mode 100644
index 00000000000..51c71102821
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/demo/index.html
@@ -0,0 +1,132 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<!doctype html>
+<html>
+<head>
+ <title>paper-progress demo</title>
+
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+ <meta name="mobile-web-app-capable" content="yes">
+ <meta name="apple-mobile-web-app-capable" content="yes">
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../../paper-styles/color.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../paper-progress.html">
+ <link rel="import" href="../../paper-button/paper-button.html">
+
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles">
+ paper-progress {
+ display: block;
+ width: 100%;
+ margin: 20px 0;
+ }
+ paper-button {
+ display: inline-block;
+ padding: 5px;
+ }
+ </style>
+ </custom-style>
+
+</head>
+<body unresolved>
+ <div class="vertical-section-container centered">
+ <h3>paper-progress can be imperatively controlled</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <p>Once started, loops 5 times before stopping.
+ <!-- View the source code to see the contents of startProgress() -->
+ <paper-button raised onclick="startProgress();" id="start">Start</paper-button>
+ </p>
+ <paper-progress id="progress"></paper-progress>
+ </template>
+ </demo-snippet>
+
+ <h3>paper-progress can be indeterminate with a custom duration</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ paper-progress.slow {
+ --paper-progress-indeterminate-cycle-duration: 20s;
+ }
+ </style>
+ </custom-style>
+ <paper-progress indeterminate></paper-progress>
+ <paper-progress indeterminate class="slow"></paper-progress>
+ </template>
+ </demo-snippet>
+
+ <h3>It can be styled using custom properties</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ paper-progress.blue {
+ --paper-progress-active-color: var(--paper-light-blue-500);
+ --paper-progress-secondary-color: var(--paper-light-blue-100);
+ }
+
+ paper-progress.red {
+ --paper-progress-active-color: var(--paper-red-500);
+ --paper-progress-secondary-color: var(--paper-red-100);
+ }
+
+ paper-progress.green {
+ --paper-progress-active-color: var(--paper-light-green-500);
+ --paper-progress-secondary-color: var(--paper-light-green-100);
+ }
+ </style>
+ </custom-style>
+ <paper-progress value="800" min="100" max="1000" class="red"></paper-progress>
+ <paper-progress value="60" class="green"></paper-progress>
+ <paper-progress value="40" secondary-progress="80" class="blue"></paper-progress>
+ </template>
+ </demo-snippet>
+ </div>
+
+ <script>
+ var progress, button;
+ var repeat, maxRepeat = 5, animating = false;
+
+ function nextProgress() {
+ animating = true;
+ if (progress.value < progress.max) {
+ progress.value += (progress.step || 1);
+ } else {
+ if (++repeat >= maxRepeat) {
+ animating = false;
+ button.disabled = false;
+ return;
+ }
+ progress.value = progress.min;
+ }
+ requestAnimationFrame(nextProgress);
+ }
+
+ function startProgress() {
+ repeat = 0;
+ progress.value = progress.min;
+ button.disabled = true;
+ if (!animating) {
+ nextProgress();
+ }
+ }
+
+ window.addEventListener('WebComponentsReady', function() {
+ progress = document.querySelector('paper-progress');
+ button = document.querySelector('paper-button');
+ });
+ </script>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/hero.svg b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/hero.svg
new file mode 100755
index 00000000000..dc422a4912a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/hero.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">
+<g id="background" display="none">
+ <rect display="inline" fill="#B0BEC5" width="225" height="126"/>
+</g>
+<g id="label">
+</g>
+<g id="art">
+ <rect x="57" y="59" width="20" height="2"/>
+ <rect x="38" y="59" width="11" height="2"/>
+ <rect x="84" y="59" width="40" height="2"/>
+ <rect x="133" y="59" width="54" height="2"/>
+ <g id="ic_x5F_add_x0D_">
+ </g>
+</g>
+<g id="Guides">
+</g>
+</svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/index.html
new file mode 100644
index 00000000000..225e3dd93df
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <title>paper-progress</title>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/package-lock.json
new file mode 100644
index 00000000000..1c6a85c7fca
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/package-lock.json
@@ -0,0 +1,2388 @@
+{
+ "name": "@polymer/paper-progress",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.6.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.4.tgz",
+ "integrity": "sha512-Awg4BcUYiZtNKoveGOu654JVPt11V/KIC77iBz8NweyoOAZpz5rUJfPDwwD+ajfTs2HndbTCEB8IuLfX9m/mmw==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.44",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+ "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz",
+ "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.2",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.105",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.44",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.2",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/package.json
new file mode 100644
index 00000000000..efcfca5e8ed
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@polymer/paper-progress",
+ "private": true,
+ "description": "A material design progress bar",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-progress.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/paper-progress.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/paper-progress.d.ts
new file mode 100644
index 00000000000..71978799fd5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/paper-progress.d.ts
@@ -0,0 +1,117 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-progress.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-flex-layout/iron-flex-layout.d.ts" />
+/// <reference path="../iron-range-behavior/iron-range-behavior.d.ts" />
+/// <reference path="../paper-styles/color.d.ts" />
+
+/**
+ * Material design: [Progress & activity](https://www.google.com/design/spec/components/progress-activity.html)
+ *
+ * The progress bars are for situations where the percentage completed can be
+ * determined. They give users a quick sense of how much longer an operation
+ * will take.
+ *
+ * Example:
+ *
+ * <paper-progress value="10"></paper-progress>
+ *
+ * There is also a secondary progress which is useful for displaying intermediate
+ * progress, such as the buffer level during a streaming playback progress bar.
+ *
+ * Example:
+ *
+ * <paper-progress value="10" secondary-progress="30"></paper-progress>
+ *
+ * ### Styling progress bar:
+ *
+ * To change the active progress bar color:
+ *
+ * paper-progress {
+ * --paper-progress-active-color: #e91e63;
+ * }
+ *
+ * To change the secondary progress bar color:
+ *
+ * paper-progress {
+ * --paper-progress-secondary-color: #f8bbd0;
+ * }
+ *
+ * To change the progress bar background color:
+ *
+ * paper-progress {
+ * --paper-progress-container-color: #64ffda;
+ * }
+ *
+ * Add the class `transiting` to a paper-progress to animate the progress bar when
+ * the value changed. You can also customize the transition:
+ *
+ * paper-progress {
+ * --paper-progress-transition-duration: 0.08s;
+ * --paper-progress-transition-timing-function: ease;
+ * --paper-progress-transition-delay: 0s;
+ * }
+ *
+ * To change the duration of the indeterminate cycle:
+ *
+ * paper-progress {
+ * --paper-progress-indeterminate-cycle-duration: 2s;
+ * }
+ *
+ * The following mixins are available for styling:
+ *
+ * Custom property | Description | Default
+ * -------------------------------------------------|---------------------------------------------|--------------
+ * `--paper-progress-container` | Mixin applied to container | `{}`
+ * `--paper-progress-transition-duration` | Duration of the transition | `0.08s`
+ * `--paper-progress-transition-timing-function` | The timing function for the transition | `ease`
+ * `--paper-progress-transition-delay` | delay for the transition | `0s`
+ * `--paper-progress-container-color` | Color of the container | `--google-grey-300`
+ * `--paper-progress-active-color` | The color of the active bar | `--google-green-500`
+ * `--paper-progress-secondary-color` | The color of the secondary bar | `--google-green-100`
+ * `--paper-progress-disabled-active-color` | The color of the active bar if disabled | `--google-grey-500`
+ * `--paper-progress-disabled-secondary-color` | The color of the secondary bar if disabled | `--google-grey-300`
+ * `--paper-progress-height` | The height of the progress bar | `4px`
+ * `--paper-progress-indeterminate-cycle-duration` | Duration of an indeterminate cycle | `2s`
+ */
+interface PaperProgressElement extends Polymer.Element, Polymer.IronRangeBehavior {
+
+ /**
+ * The number that represents the current secondary progress.
+ */
+ secondaryProgress: number|null|undefined;
+
+ /**
+ * The secondary ratio
+ */
+ readonly secondaryRatio: number|null|undefined;
+
+ /**
+ * Use an indeterminate progress indicator.
+ */
+ indeterminate: boolean|null|undefined;
+
+ /**
+ * True if the progress is disabled.
+ */
+ disabled: boolean|null|undefined;
+ hostAttributes: object|null;
+ _toggleIndeterminate(indeterminate: any): void;
+ _transformProgress(progress: any, ratio: any): void;
+ _mainRatioChanged(ratio: any): void;
+ _progressChanged(secondaryProgress: any, value: any, min: any, max: any, indeterminate: any): void;
+ _disabledChanged(disabled: any): void;
+ _hideSecondaryProgress(secondaryRatio: any): any;
+}
+
+interface HTMLElementTagNameMap {
+ "paper-progress": PaperProgressElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/paper-progress.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/paper-progress.html
new file mode 100644
index 00000000000..c190e14ec70
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-progress/paper-progress.html
@@ -0,0 +1,345 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="../iron-range-behavior/iron-range-behavior.html">
+<link rel="import" href="../paper-styles/color.html">
+
+<!--
+Material design: [Progress & activity](https://www.google.com/design/spec/components/progress-activity.html)
+
+The progress bars are for situations where the percentage completed can be
+determined. They give users a quick sense of how much longer an operation
+will take.
+
+Example:
+
+ <paper-progress value="10"></paper-progress>
+
+There is also a secondary progress which is useful for displaying intermediate
+progress, such as the buffer level during a streaming playback progress bar.
+
+Example:
+
+ <paper-progress value="10" secondary-progress="30"></paper-progress>
+
+### Styling progress bar:
+
+To change the active progress bar color:
+
+ paper-progress {
+ --paper-progress-active-color: #e91e63;
+ }
+
+To change the secondary progress bar color:
+
+ paper-progress {
+ --paper-progress-secondary-color: #f8bbd0;
+ }
+
+To change the progress bar background color:
+
+ paper-progress {
+ --paper-progress-container-color: #64ffda;
+ }
+
+Add the class `transiting` to a paper-progress to animate the progress bar when
+the value changed. You can also customize the transition:
+
+ paper-progress {
+ --paper-progress-transition-duration: 0.08s;
+ --paper-progress-transition-timing-function: ease;
+ --paper-progress-transition-delay: 0s;
+ }
+
+To change the duration of the indeterminate cycle:
+
+ paper-progress {
+ --paper-progress-indeterminate-cycle-duration: 2s;
+ }
+
+The following mixins are available for styling:
+
+Custom property | Description | Default
+-------------------------------------------------|---------------------------------------------|--------------
+`--paper-progress-container` | Mixin applied to container | `{}`
+`--paper-progress-transition-duration` | Duration of the transition | `0.08s`
+`--paper-progress-transition-timing-function` | The timing function for the transition | `ease`
+`--paper-progress-transition-delay` | delay for the transition | `0s`
+`--paper-progress-container-color` | Color of the container | `--google-grey-300`
+`--paper-progress-active-color` | The color of the active bar | `--google-green-500`
+`--paper-progress-secondary-color` | The color of the secondary bar | `--google-green-100`
+`--paper-progress-disabled-active-color` | The color of the active bar if disabled | `--google-grey-500`
+`--paper-progress-disabled-secondary-color` | The color of the secondary bar if disabled | `--google-grey-300`
+`--paper-progress-height` | The height of the progress bar | `4px`
+`--paper-progress-indeterminate-cycle-duration` | Duration of an indeterminate cycle | `2s`
+
+@group Paper Elements
+@element paper-progress
+@hero hero.svg
+@demo demo/index.html
+-->
+
+<dom-module id="paper-progress">
+ <template>
+ <style>
+ :host {
+ display: block;
+ width: 200px;
+ position: relative;
+ overflow: hidden;
+ }
+
+ :host([hidden]), [hidden] {
+ display: none !important;
+ }
+
+ #progressContainer {
+ @apply --paper-progress-container;
+ position: relative;
+ }
+
+ #progressContainer,
+ /* the stripe for the indeterminate animation*/
+ .indeterminate::after {
+ height: var(--paper-progress-height, 4px);
+ }
+
+ #primaryProgress,
+ #secondaryProgress,
+ .indeterminate::after {
+ @apply --layout-fit;
+ }
+
+ #progressContainer,
+ .indeterminate::after {
+ background: var(--paper-progress-container-color, var(--google-grey-300));
+ }
+
+ :host(.transiting) #primaryProgress,
+ :host(.transiting) #secondaryProgress {
+ -webkit-transition-property: -webkit-transform;
+ transition-property: transform;
+
+ /* Duration */
+ -webkit-transition-duration: var(--paper-progress-transition-duration, 0.08s);
+ transition-duration: var(--paper-progress-transition-duration, 0.08s);
+
+ /* Timing function */
+ -webkit-transition-timing-function: var(--paper-progress-transition-timing-function, ease);
+ transition-timing-function: var(--paper-progress-transition-timing-function, ease);
+
+ /* Delay */
+ -webkit-transition-delay: var(--paper-progress-transition-delay, 0s);
+ transition-delay: var(--paper-progress-transition-delay, 0s);
+ }
+
+ #primaryProgress,
+ #secondaryProgress {
+ @apply --layout-fit;
+ -webkit-transform-origin: left center;
+ transform-origin: left center;
+ -webkit-transform: scaleX(0);
+ transform: scaleX(0);
+ will-change: transform;
+ }
+
+ #primaryProgress {
+ background: var(--paper-progress-active-color, var(--google-green-500));
+ }
+
+ #secondaryProgress {
+ background: var(--paper-progress-secondary-color, var(--google-green-100));
+ }
+
+ :host([disabled]) #primaryProgress {
+ background: var(--paper-progress-disabled-active-color, var(--google-grey-500));
+ }
+
+ :host([disabled]) #secondaryProgress {
+ background: var(--paper-progress-disabled-secondary-color, var(--google-grey-300));
+ }
+
+ :host(:not([disabled])) #primaryProgress.indeterminate {
+ -webkit-transform-origin: right center;
+ transform-origin: right center;
+ -webkit-animation: indeterminate-bar var(--paper-progress-indeterminate-cycle-duration, 2s) linear infinite;
+ animation: indeterminate-bar var(--paper-progress-indeterminate-cycle-duration, 2s) linear infinite;
+ }
+
+ :host(:not([disabled])) #primaryProgress.indeterminate::after {
+ content: "";
+ -webkit-transform-origin: center center;
+ transform-origin: center center;
+
+ -webkit-animation: indeterminate-splitter var(--paper-progress-indeterminate-cycle-duration, 2s) linear infinite;
+ animation: indeterminate-splitter var(--paper-progress-indeterminate-cycle-duration, 2s) linear infinite;
+ }
+
+ @-webkit-keyframes indeterminate-bar {
+ 0% {
+ -webkit-transform: scaleX(1) translateX(-100%);
+ }
+ 50% {
+ -webkit-transform: scaleX(1) translateX(0%);
+ }
+ 75% {
+ -webkit-transform: scaleX(1) translateX(0%);
+ -webkit-animation-timing-function: cubic-bezier(.28,.62,.37,.91);
+ }
+ 100% {
+ -webkit-transform: scaleX(0) translateX(0%);
+ }
+ }
+
+ @-webkit-keyframes indeterminate-splitter {
+ 0% {
+ -webkit-transform: scaleX(.75) translateX(-125%);
+ }
+ 30% {
+ -webkit-transform: scaleX(.75) translateX(-125%);
+ -webkit-animation-timing-function: cubic-bezier(.42,0,.6,.8);
+ }
+ 90% {
+ -webkit-transform: scaleX(.75) translateX(125%);
+ }
+ 100% {
+ -webkit-transform: scaleX(.75) translateX(125%);
+ }
+ }
+
+ @keyframes indeterminate-bar {
+ 0% {
+ transform: scaleX(1) translateX(-100%);
+ }
+ 50% {
+ transform: scaleX(1) translateX(0%);
+ }
+ 75% {
+ transform: scaleX(1) translateX(0%);
+ animation-timing-function: cubic-bezier(.28,.62,.37,.91);
+ }
+ 100% {
+ transform: scaleX(0) translateX(0%);
+ }
+ }
+
+ @keyframes indeterminate-splitter {
+ 0% {
+ transform: scaleX(.75) translateX(-125%);
+ }
+ 30% {
+ transform: scaleX(.75) translateX(-125%);
+ animation-timing-function: cubic-bezier(.42,0,.6,.8);
+ }
+ 90% {
+ transform: scaleX(.75) translateX(125%);
+ }
+ 100% {
+ transform: scaleX(.75) translateX(125%);
+ }
+ }
+ </style>
+
+ <div id="progressContainer">
+ <div id="secondaryProgress" hidden$="[[_hideSecondaryProgress(secondaryRatio)]]"></div>
+ <div id="primaryProgress"></div>
+ </div>
+ </template>
+</dom-module>
+
+<script>
+ Polymer({
+ is: 'paper-progress',
+
+ behaviors: [Polymer.IronRangeBehavior],
+
+ properties: {
+ /**
+ * The number that represents the current secondary progress.
+ */
+ secondaryProgress: {type: Number, value: 0},
+
+ /**
+ * The secondary ratio
+ */
+ secondaryRatio: {type: Number, value: 0, readOnly: true},
+
+ /**
+ * Use an indeterminate progress indicator.
+ */
+ indeterminate:
+ {type: Boolean, value: false, observer: '_toggleIndeterminate'},
+
+ /**
+ * True if the progress is disabled.
+ */
+ disabled: {
+ type: Boolean,
+ value: false,
+ reflectToAttribute: true,
+ observer: '_disabledChanged'
+ }
+ },
+
+ observers:
+ ['_progressChanged(secondaryProgress, value, min, max, indeterminate)'],
+
+ hostAttributes: {role: 'progressbar'},
+
+ _toggleIndeterminate: function(indeterminate) {
+ // If we use attribute/class binding, the animation sometimes doesn't
+ // translate properly on Safari 7.1. So instead, we toggle the class here in
+ // the update method.
+ this.toggleClass('indeterminate', indeterminate, this.$.primaryProgress);
+ },
+
+ _transformProgress: function(progress, ratio) {
+ var transform = 'scaleX(' + (ratio / 100) + ')';
+ progress.style.transform = progress.style.webkitTransform = transform;
+ },
+
+ _mainRatioChanged: function(ratio) {
+ this._transformProgress(this.$.primaryProgress, ratio);
+ },
+
+ _progressChanged: function(
+ secondaryProgress, value, min, max, indeterminate) {
+ secondaryProgress = this._clampValue(secondaryProgress);
+ value = this._clampValue(value);
+
+ var secondaryRatio = this._calcRatio(secondaryProgress) * 100;
+ var mainRatio = this._calcRatio(value) * 100;
+
+ this._setSecondaryRatio(secondaryRatio);
+ this._transformProgress(this.$.secondaryProgress, secondaryRatio);
+ this._transformProgress(this.$.primaryProgress, mainRatio);
+
+ this.secondaryProgress = secondaryProgress;
+
+ if (indeterminate) {
+ this.removeAttribute('aria-valuenow');
+ } else {
+ this.setAttribute('aria-valuenow', value);
+ }
+ this.setAttribute('aria-valuemin', min);
+ this.setAttribute('aria-valuemax', max);
+ },
+
+ _disabledChanged: function(disabled) {
+ this.setAttribute('aria-disabled', disabled ? 'true' : 'false');
+ },
+
+ _hideSecondaryProgress: function(secondaryRatio) {
+ return secondaryRatio === 0;
+ }
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/.bower.json
new file mode 100644
index 00000000000..25f9e0849be
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/.bower.json
@@ -0,0 +1,70 @@
+{
+ "name": "paper-radio-button",
+ "version": "2.1.0",
+ "description": "A material design radio button",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "radio",
+ "control"
+ ],
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-radio-button"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-radio-button",
+ "main": "paper-radio-button.html",
+ "ignore": [],
+ "dependencies": {
+ "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "paper-behaviors": "PolymerElements/paper-behaviors#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#~1.3.0",
+ "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.1.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.1.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.0",
+ "commit": "bc1f13bc1fe808de374041e3552b33d242edcf0f"
+ },
+ "_source": "https://github.com/PolymerElements/paper-radio-button.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/paper-radio-button"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/.github/CODEOWNERS
new file mode 100644
index 00000000000..0d8c0ad6b48
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @bicknellr
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..0a8739ed14f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/paper-radio-button/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/.travis.yml
new file mode 100644
index 00000000000..64719b89c83
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/.travis.yml
@@ -0,0 +1,29 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+env:
+ global:
+ - secure: >-
+ GigwuEaV52dS0ZJk4iaUTWOW7zZTtD/j3KqPny9XS71GxDFve3KKAXvhPCHHKuZwsOKWJ3JnBIXDgEVxHwkS6jUVAEVPDrmF6OZxs5rkRTDFeGKVfoYzCkssj6NE+/XnDMOF5gFdRuI4ZBS/kMB9OASeNsH84wgkMazh9GPu9Lk=
+ - secure: >-
+ EURQh/CaC+RBsHTw5xbyZAFPc6cgQQWFFvp35A8ZHTLvHrhAIybnBb/wisGpPyulSZUd72wdIMNxaUAmP9bniwLs94tzmqbDuBtgZ4a1IPHIm9qGzn7q4JMU2mUYriP/HDIc9Liu6nfccrf7YgYrYKVupu72WU5FktvyWedUj7w=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/README.md
new file mode 100644
index 00000000000..f2e69c55f74
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/README.md
@@ -0,0 +1,38 @@
+[![Build status](https://travis-ci.org/PolymerElements/paper-radio-button.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-radio-button)
+[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://www.webcomponents.org/element/PolymerElements/paper-radio-button)
+
+## &lt;paper-radio-button&gt;
+
+Material design: [Radio button](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-radio-button)
+
+`paper-radio-button` is a button that can be either checked or unchecked.
+User can tap the radio button to check or uncheck it.
+
+Use a `<paper-radio-group>` to group a set of radio buttons. When radio buttons
+are inside a radio group, exactly one radio button in the group can be checked
+at any time.
+
+Example:
+
+```html
+<paper-radio-button></paper-radio-button>
+<paper-radio-button>Item label</paper-radio-button>
+```
+
+### Styling
+
+The following custom properties and mixins are available for styling:
+
+| Custom property | Description | Default |
+| --- | --- | --- |
+| `--paper-radio-button-unchecked-background-color` | Radio button background color when the input is not checked | `transparent` |
+| `--paper-radio-button-unchecked-color` | Radio button color when the input is not checked | `--primary-text-color` |
+| `--paper-radio-button-unchecked-ink-color` | Selected/focus ripple color when the input is not checked | `--primary-text-color` |
+| `--paper-radio-button-checked-color` | Radio button color when the input is checked | `--primary-color` |
+| `--paper-radio-button-checked-ink-color` | Selected/focus ripple color when the input is checked | `--primary-color` |
+| `--paper-radio-button-size` | Size of the radio button | `16px` |
+| `--paper-radio-button-label-color` | Label color | `--primary-text-color` |
+| `--paper-radio-button-label-spacing` | Spacing between the label and the button | `10px` |
+
+This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`.
+In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/bower.json
new file mode 100644
index 00000000000..f47d9aca749
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/bower.json
@@ -0,0 +1,61 @@
+{
+ "name": "paper-radio-button",
+ "version": "2.1.0",
+ "description": "A material design radio button",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "radio",
+ "control"
+ ],
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-radio-button"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-radio-button",
+ "main": "paper-radio-button.html",
+ "ignore": [],
+ "dependencies": {
+ "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "paper-behaviors": "PolymerElements/paper-behaviors#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#~1.3.0",
+ "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.1.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/demo/index.html
new file mode 100644
index 00000000000..63a6db5506e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/demo/index.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <title>paper-radio-button demo</title>
+
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+ <meta name="mobile-web-app-capable" content="yes">
+ <meta name="apple-mobile-web-app-capable" content="yes">
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../paper-radio-button.html">
+
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles">
+ .vertical-section-container {
+ max-width: 630px;
+ }
+
+ paper-radio-button {
+ margin-right: 24px;
+ }
+ </style>
+ </custom-style>
+</head>
+<body unresolved>
+ <div class="vertical-section-container centered">
+ <h3>Radio buttons can be checked or unchecked, or disabled entirely</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <paper-radio-button>Radio</paper-radio-button>
+ <paper-radio-button checked>Radio</paper-radio-button>
+ <paper-radio-button disabled>Disabled</paper-radio-button>
+ </template>
+ </demo-snippet>
+
+ <h3>Radio buttons can hide the ripple effect using the <i>noink</i> attribute</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <paper-radio-button noink>Radio</paper-radio-button>
+ </template>
+ </demo-snippet>
+
+ <h3>Radio buttons can be styled using custom properties</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ paper-radio-button.red {
+ --paper-radio-button-checked-color: var(--paper-red-500);
+ --paper-radio-button-checked-ink-color: var(--paper-red-500);
+ --paper-radio-button-unchecked-color: var(--paper-red-900);
+ --paper-radio-button-unchecked-ink-color: var(--paper-red-900);
+ --paper-radio-button-label-color: var(--paper-red-500);
+ }
+ paper-radio-button.green {
+ --paper-radio-button-checked-color: var(--paper-green-500);
+ --paper-radio-button-checked-ink-color: var(--paper-green-500);
+ --paper-radio-button-unchecked-color: var(--paper-green-900);
+ --paper-radio-button-unchecked-ink-color: var(--paper-green-900);
+ --paper-radio-button-label-color: var(--paper-green-500);
+ }
+ </style>
+ </custom-style>
+
+ <paper-radio-button class="red">Radio</paper-radio-button>
+ <paper-radio-button checked class="green">Radio</paper-radio-button>
+ </template>
+ </demo-snippet>
+ </div>
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/hero.svg b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/hero.svg
new file mode 100755
index 00000000000..7fbac94dd72
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/hero.svg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">
+<g id="background" display="none">
+ <rect display="inline" fill="#B0BEC5" width="225" height="126"/>
+</g>
+<g id="label">
+</g>
+<g id="art">
+ <g>
+ <circle cx="112.5" cy="63" r="8"/>
+ <path d="M112.5,80c-9.4,0-17-7.6-17-17s7.6-17,17-17s17,7.6,17,17S121.9,80,112.5,80z M112.5,48c-8.3,0-15,6.7-15,15s6.7,15,15,15
+ s15-6.7,15-15S120.8,48,112.5,48z"/>
+ </g>
+ <g id="ic_x5F_add_x0D_">
+ </g>
+</g>
+<g id="Guides">
+</g>
+</svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/index.html
new file mode 100644
index 00000000000..04b0c661ba1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/index.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+
+ <title>paper-radio-button</title>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../polymer/polymer.html">
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/package-lock.json
new file mode 100644
index 00000000000..cbeca9b0927
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/package-lock.json
@@ -0,0 +1,983 @@
+{
+ "name": "@polymer/paper-radio-button",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.0.tgz",
+ "integrity": "sha512-a5DFXI3TdZSVOMH4608LVaBLmcr+mwM2+B8OSBiB9WFNCtdqzUXwtB5We6vBzrThXlO4uRo7d2pEqjNXMAlEkA==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "4.1.0",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.12"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.6.tgz",
+ "integrity": "sha512-CTUtLb6WqCCgp6P59QintjHWqzf4VL1uPA27bipLAPxFqrtK1gEYllePzTICGqQ8rYsCbpnsNypXjjDzGAAjEQ==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.8.tgz",
+ "integrity": "sha512-QqR0j08RCS1AQYPMRPHikEpcmK+2aEEbcSzWLwOqyJ4FhLmHUx/WjRrnn7tTQg/y4IKnMhzskh/o7qvGIZZ7iA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.0.0.tgz",
+ "integrity": "sha512-v+0wW9Wezwsyb0uF4aBVCjmSqit3Ru7PZFziGF0o2KwTvN2zWfTi3BRLq9EkJFdg3eBbyERXGTntVpBxH1J68Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.3",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
+ "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "4.0.0",
+ "array-back": "2.0.0",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.3.tgz",
+ "integrity": "sha512-7Z5PPegwDTyjbaeCnV0efcyS6vdKAU51kpEmS7QFib3P4822l8ICYyMn7qvJnc+WzLoDsuI9gPMKbJ8pCu8XtA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.8",
+ "winston": "2.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-QQL70IC85hI6q9uQeresEMcT1Qf8YR/zDe1qG8WWeeFAZk8z0lmzUpsfcAWz+bM4wpDdXrtd4HitIs4p0CHl/w==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.101",
+ "@types/parse5": "2.2.34",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "polymer-project-config": "3.9.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.9.0.tgz",
+ "integrity": "sha512-WPOqlV2W/M4Ni40QIqYSv8PE7H4rjiPm1KEf02QPtjZOGlAC4Rv7e6UJ1Ke1O70WT5bydcsEn3LViFIqYpVOJw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.101",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/package.json
new file mode 100644
index 00000000000..564544d4dea
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@polymer/paper-radio-button",
+ "private": true,
+ "description": "A material design radio button",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-radio-button"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir ."
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/paper-radio-button.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/paper-radio-button.d.ts
new file mode 100644
index 00000000000..bf0924627dc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/paper-radio-button.d.ts
@@ -0,0 +1,62 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-radio-button.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../paper-behaviors/paper-checked-element-behavior.d.ts" />
+/// <reference path="../paper-styles/default-theme.d.ts" />
+/// <reference path="../iron-flex-layout/iron-flex-layout.d.ts" />
+
+/**
+ * Material design: [Radio button](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-radio-button)
+ *
+ * `paper-radio-button` is a button that can be either checked or unchecked.
+ * User can tap the radio button to check or uncheck it.
+ *
+ * Use a `<paper-radio-group>` to group a set of radio buttons. When radio buttons
+ * are inside a radio group, exactly one radio button in the group can be checked
+ * at any time.
+ *
+ * Example:
+ *
+ * <paper-radio-button></paper-radio-button>
+ * <paper-radio-button>Item label</paper-radio-button>
+ *
+ * ### Styling
+ *
+ * The following custom properties and mixins are available for styling:
+ *
+ * Custom property | Description | Default
+ * ----------------|-------------|----------
+ * `--paper-radio-button-unchecked-background-color` | Radio button background color when the input is not checked | `transparent`
+ * `--paper-radio-button-unchecked-color` | Radio button color when the input is not checked | `--primary-text-color`
+ * `--paper-radio-button-unchecked-ink-color` | Selected/focus ripple color when the input is not checked | `--primary-text-color`
+ * `--paper-radio-button-checked-color` | Radio button color when the input is checked | `--primary-color`
+ * `--paper-radio-button-checked-ink-color` | Selected/focus ripple color when the input is checked | `--primary-color`
+ * `--paper-radio-button-size` | Size of the radio button | `16px`
+ * `--paper-radio-button-ink-size` | Size of the ripple | `48px`
+ * `--paper-radio-button-label-color` | Label color | `--primary-text-color`
+ * `--paper-radio-button-label-spacing` | Spacing between the label and the button | `10px`
+ * `--paper-radio-button-radio-container` | A mixin applied to the internal radio container | `{}`
+ * `--paper-radio-button-label` | A mixin applied to the internal label | `{}`
+ * `--paper-radio-button-label-checked` | A mixin applied to the internal label when the radio button is checked | `{}`
+ *
+ * This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`.
+ * In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`.
+ */
+interface PaperRadioButtonElement extends Polymer.Element, Polymer.PaperCheckedElementBehavior {
+ ariaActiveAttribute: string|null|undefined;
+ hostAttributes: object|null;
+ attached(): void;
+ ready(): void;
+}
+
+interface HTMLElementTagNameMap {
+ "paper-radio-button": PaperRadioButtonElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/paper-radio-button.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/paper-radio-button.html
new file mode 100644
index 00000000000..726c80fe374
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-button/paper-radio-button.html
@@ -0,0 +1,252 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../paper-behaviors/paper-checked-element-behavior.html">
+<link rel="import" href="../paper-styles/default-theme.html">
+<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
+
+<!--
+Material design: [Radio button](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-radio-button)
+
+`paper-radio-button` is a button that can be either checked or unchecked.
+User can tap the radio button to check or uncheck it.
+
+Use a `<paper-radio-group>` to group a set of radio buttons. When radio buttons
+are inside a radio group, exactly one radio button in the group can be checked
+at any time.
+
+Example:
+
+ <paper-radio-button></paper-radio-button>
+ <paper-radio-button>Item label</paper-radio-button>
+
+### Styling
+
+The following custom properties and mixins are available for styling:
+
+Custom property | Description | Default
+----------------|-------------|----------
+`--paper-radio-button-unchecked-background-color` | Radio button background color when the input is not checked | `transparent`
+`--paper-radio-button-unchecked-color` | Radio button color when the input is not checked | `--primary-text-color`
+`--paper-radio-button-unchecked-ink-color` | Selected/focus ripple color when the input is not checked | `--primary-text-color`
+`--paper-radio-button-checked-color` | Radio button color when the input is checked | `--primary-color`
+`--paper-radio-button-checked-ink-color` | Selected/focus ripple color when the input is checked | `--primary-color`
+`--paper-radio-button-size` | Size of the radio button | `16px`
+`--paper-radio-button-ink-size` | Size of the ripple | `48px`
+`--paper-radio-button-label-color` | Label color | `--primary-text-color`
+`--paper-radio-button-label-spacing` | Spacing between the label and the button | `10px`
+`--paper-radio-button-radio-container` | A mixin applied to the internal radio container | `{}`
+`--paper-radio-button-label` | A mixin applied to the internal label | `{}`
+`--paper-radio-button-label-checked` | A mixin applied to the internal label when the radio button is checked | `{}`
+
+This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`.
+In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`.
+
+@group Paper Elements
+@element paper-radio-button
+@hero hero.svg
+@demo demo/index.html
+-->
+
+<dom-module id="paper-radio-button">
+ <template strip-whitespace>
+ <style>
+ :host {
+ display: inline-block;
+ line-height: 0;
+ white-space: nowrap;
+ cursor: pointer;
+ @apply --paper-font-common-base;
+ --calculated-paper-radio-button-size: var(--paper-radio-button-size, 16px);
+ /* -1px is a sentinel for the default and is replace in `attached`. */
+ --calculated-paper-radio-button-ink-size: var(--paper-radio-button-ink-size, -1px);
+ }
+
+ :host(:focus) {
+ outline: none;
+ }
+
+ #radioContainer {
+ @apply --layout-inline;
+ @apply --layout-center-center;
+ position: relative;
+ width: var(--calculated-paper-radio-button-size);
+ height: var(--calculated-paper-radio-button-size);
+ vertical-align: middle;
+
+ @apply --paper-radio-button-radio-container;
+ }
+
+ #ink {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ right: auto;
+ width: var(--calculated-paper-radio-button-ink-size);
+ height: var(--calculated-paper-radio-button-ink-size);
+ color: var(--paper-radio-button-unchecked-ink-color, var(--primary-text-color));
+ opacity: 0.6;
+ pointer-events: none;
+ -webkit-transform: translate(-50%, -50%);
+ transform: translate(-50%, -50%);
+ }
+
+ #ink[checked] {
+ color: var(--paper-radio-button-checked-ink-color, var(--primary-color));
+ }
+
+ #offRadio, #onRadio {
+ position: absolute;
+ box-sizing: border-box;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ border-radius: 50%;
+ }
+
+ #offRadio {
+ border: 2px solid var(--paper-radio-button-unchecked-color, var(--primary-text-color));
+ background-color: var(--paper-radio-button-unchecked-background-color, transparent);
+ transition: border-color 0.28s;
+ }
+
+ #onRadio {
+ background-color: var(--paper-radio-button-checked-color, var(--primary-color));
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ transition: -webkit-transform ease 0.28s;
+ transition: transform ease 0.28s;
+ will-change: transform;
+ }
+
+ :host([checked]) #offRadio {
+ border-color: var(--paper-radio-button-checked-color, var(--primary-color));
+ }
+
+ :host([checked]) #onRadio {
+ -webkit-transform: scale(0.5);
+ transform: scale(0.5);
+ }
+
+ #radioLabel {
+ line-height: normal;
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+ margin-left: var(--paper-radio-button-label-spacing, 10px);
+ white-space: normal;
+ color: var(--paper-radio-button-label-color, var(--primary-text-color));
+
+ @apply --paper-radio-button-label;
+ }
+
+ :host([checked]) #radioLabel {
+ @apply --paper-radio-button-label-checked;
+ }
+
+ #radioLabel:dir(rtl) {
+ margin-left: 0;
+ margin-right: var(--paper-radio-button-label-spacing, 10px);
+ }
+
+ #radioLabel[hidden] {
+ display: none;
+ }
+
+ /* disabled state */
+
+ :host([disabled]) #offRadio {
+ border-color: var(--paper-radio-button-unchecked-color, var(--primary-text-color));
+ opacity: 0.5;
+ }
+
+ :host([disabled][checked]) #onRadio {
+ background-color: var(--paper-radio-button-unchecked-color, var(--primary-text-color));
+ opacity: 0.5;
+ }
+
+ :host([disabled]) #radioLabel {
+ /* slightly darker than the button, so that it's readable */
+ opacity: 0.65;
+ }
+ </style>
+
+ <div id="radioContainer">
+ <div id="offRadio"></div>
+ <div id="onRadio"></div>
+ </div>
+
+ <div id="radioLabel"><slot></slot></div>
+ </template>
+
+ <script>
+ Polymer({
+ is: 'paper-radio-button',
+
+ behaviors: [
+ Polymer.PaperCheckedElementBehavior
+ ],
+
+ hostAttributes: {
+ role: 'radio',
+ 'aria-checked': false,
+ tabindex: 0
+ },
+
+ properties: {
+ /**
+ * Fired when the checked state changes due to user interaction.
+ *
+ * @event change
+ */
+
+ /**
+ * Fired when the checked state changes.
+ *
+ * @event iron-change
+ */
+
+ ariaActiveAttribute: {
+ type: String,
+ value: 'aria-checked'
+ }
+ },
+
+ ready: function() {
+ this._rippleContainer = this.$.radioContainer;
+ },
+
+ attached: function() {
+ // Wait until styles have resolved to check for the default sentinel.
+ // See polymer#4009 for more details.
+ Polymer.RenderStatus.afterNextRender(this, function() {
+ var inkSize = this.getComputedStyleValue('--calculated-paper-radio-button-ink-size').trim();
+ // If unset, compute and set the default `--paper-radio-button-ink-size`.
+ if (inkSize === '-1px') {
+ var size = parseFloat(this.getComputedStyleValue('--calculated-paper-radio-button-size').trim());
+ var defaultInkSize = Math.floor(3 * size);
+
+ // The button and ripple need to have the same parity so that their
+ // centers align.
+ if (defaultInkSize % 2 !== size % 2) {
+ defaultInkSize++;
+ }
+
+ this.updateStyles({
+ '--paper-radio-button-ink-size': defaultInkSize + 'px',
+ });
+ }
+ });
+ },
+ })
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/.bower.json
new file mode 100644
index 00000000000..771c9af5cbd
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/.bower.json
@@ -0,0 +1,70 @@
+{
+ "name": "paper-radio-group",
+ "version": "2.2.0",
+ "description": "A group of material design radio buttons",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "radio",
+ "control"
+ ],
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-radio-group.git"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-radio-group",
+ "main": "paper-radio-group.html",
+ "ignore": [],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#1 - 2",
+ "iron-menu-behavior": "PolymerElements/iron-menu-behavior#1 - 2",
+ "paper-radio-button": "PolymerElements/paper-radio-button#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0",
+ "iron-menu-behavior": "PolymerElements/iron-menu-behavior#^1.1.7",
+ "paper-radio-button": "PolymerElements/paper-radio-button#^1.0.0"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.2.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.2.0",
+ "commit": "b541ea1ff757fefa131c23f7312e3e40390fe6b1"
+ },
+ "_source": "https://github.com/PolymerElements/paper-radio-group.git",
+ "_target": "^2.0.0",
+ "_originalSource": "paper-radio-group"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/.github/CODEOWNERS
new file mode 100644
index 00000000000..0d8c0ad6b48
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @bicknellr
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..c30f8cf1997
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/paper-radio-group/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/.travis.yml
new file mode 100644
index 00000000000..50cefe662e3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/.travis.yml
@@ -0,0 +1,29 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+env:
+ global:
+ - secure: >-
+ MERTTM+t9rMsIccJ4em6ocmNYm1w1r2Zy9qRxhdM1ya0xT2dAlV7UZY7t1jZ4MEdvqtTro1oEzfUr0zgD/mwBJUxLAB0RLRIbYAJEAfngaUUMgbbIgj3yLUZ/bZCvPtfhDPA1W/VsyldhUGCxojzgJthWgAoqWRj6jFX6X+QeWw=
+ - secure: >-
+ FvMxnNJsGlUg31KGuGjb0PpWHYFlMf9UPFzmLcFQAbc0kiWVoOl5adCfnv3yySf9EAKnolO02zR3K8KcCBQJ0SpWBlQ1pIgEdOxTXtWQRhlKHttKkj5L2X+qYAw4q5z0sy7lvb0VIjIOceabhvTTcnYmaF+OcrrVxd90ZpIckvk=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/README.md
new file mode 100644
index 00000000000..c13751ff1b3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/README.md
@@ -0,0 +1,49 @@
+[![Build status](https://travis-ci.org/PolymerElements/paper-radio-group.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-radio-group)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/paper-radio-group)_
+
+
+## &lt;paper-radio-group&gt;
+
+Material design: [Radio button](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-radio-button)
+
+`paper-radio-group` allows user to select at most one radio button from a set.
+Checking one radio button that belongs to a radio group unchecks any
+previously checked radio button within the same group. Use
+`selected` to get or set the selected radio button.
+
+The <paper-radio-buttons> inside the group must have the `name` attribute
+set.
+
+Example:
+
+```html
+<paper-radio-group selected="small">
+ <paper-radio-button name="small">Small</paper-radio-button>
+ <paper-radio-button name="medium">Medium</paper-radio-button>
+ <paper-radio-button name="large">Large</paper-radio-button>
+</paper-radio-group>
+```
+
+Radio-button-groups can be made optional, and allow zero buttons to be selected:
+
+```html
+<paper-radio-group selected="small" allow-empty-selection>
+ <paper-radio-button name="small">Small</paper-radio-button>
+ <paper-radio-button name="medium">Medium</paper-radio-button>
+ <paper-radio-button name="large">Large</paper-radio-button>
+</paper-radio-group>
+```
+
+See <a href="paper-radio-button">paper-radio-button</a> for more
+information about `paper-radio-button`.
+
+| Custom property | Description | Default |
+| --- | --- | --- |
+| `--paper-radio-group-item-padding` | The padding of the item | `12px` |
+
+### Notable breaking changes between 1.x and 2.x (hybrid):
+
+IronSelectableBehavior and IronMultiSelectableBehavior, which are used by
+paper-radio-group, introduce multiple breaking changes. Please see the README
+for those behaviors for more detail.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/bower.json
new file mode 100644
index 00000000000..283ed552b93
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/bower.json
@@ -0,0 +1,61 @@
+{
+ "name": "paper-radio-group",
+ "version": "2.2.0",
+ "description": "A group of material design radio buttons",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "radio",
+ "control"
+ ],
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-radio-group.git"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-radio-group",
+ "main": "paper-radio-group.html",
+ "ignore": [],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#1 - 2",
+ "iron-menu-behavior": "PolymerElements/iron-menu-behavior#1 - 2",
+ "paper-radio-button": "PolymerElements/paper-radio-button#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0",
+ "iron-menu-behavior": "PolymerElements/iron-menu-behavior#^1.1.7",
+ "paper-radio-button": "PolymerElements/paper-radio-button#^1.0.0"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/demo/index.html
new file mode 100644
index 00000000000..d42f2154b6b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/demo/index.html
@@ -0,0 +1,76 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+ <head>
+ <title>paper-radio-group demo</title>
+
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
+ <meta name="mobile-web-app-capable" content="yes">
+ <meta name="apple-mobile-web-app-capable" content="yes">
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../../paper-radio-button/paper-radio-button.html">
+ <link rel="import" href="../paper-radio-group.html">
+ </head>
+ <body unresolved>
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles">
+ .vertical-section-container {
+ max-width: 500px;
+ }
+
+ label {
+ align-self: center;
+ }
+ </style>
+ </custom-style>
+
+ <div class="vertical-section-container centered">
+ <h3>A paper-radio-group allows only one item to be selected</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <label id="label1">Dinosaurs:</label>
+ <paper-radio-group aria-labelledby="label1">
+ <paper-radio-button name="a">allosaurus</paper-radio-button>
+ <paper-radio-button name="b">brontosaurus</paper-radio-button>
+ <paper-radio-button name="d" disabled>diplodocus</paper-radio-button>
+ </paper-radio-group>
+ </template>
+ </demo-snippet>
+
+ <h3>It can have an initial selection</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <label id="label2">Dinosaurs:</label>
+ <paper-radio-group selected="b" aria-labelledby="label2">
+ <paper-radio-button name="a">allosaurus</paper-radio-button>
+ <paper-radio-button name="b">brontosaurus</paper-radio-button>
+ <paper-radio-button name="d" disabled>diplodocus</paper-radio-button>
+ </paper-radio-group>
+ </template>
+ </demo-snippet>
+
+ <h3>It can optionally allow items to be deselected</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <label id="label3">Dinosaurs:</label>
+ <paper-radio-group selected="b" allow-empty-selection aria-labelledby="label3">
+ <paper-radio-button name="a">allosaurus</paper-radio-button>
+ <paper-radio-button name="b">brontosaurus</paper-radio-button>
+ <paper-radio-button name="d" disabled>diplodocus</paper-radio-button>
+ </paper-radio-group>
+ </template>
+ </demo-snippet>
+ </div>
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/hero.svg b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/hero.svg
new file mode 100755
index 00000000000..fc78ba76b87
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/hero.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">
+<g id="background" display="none">
+ <rect display="inline" fill="#B0BEC5" width="225" height="126"/>
+</g>
+<g id="label">
+</g>
+<g id="art">
+ <g>
+ <circle cx="112.5" cy="41" r="8"/>
+ <path d="M112.5,58c-9.4,0-17-7.6-17-17s7.6-17,17-17s17,7.6,17,17S121.9,58,112.5,58z M112.5,26c-8.3,0-15,6.7-15,15s6.7,15,15,15
+ s15-6.7,15-15S120.8,26,112.5,26z"/>
+ <circle cx="112.5" cy="85" r="8"/>
+ <path d="M112.5,102c-9.4,0-17-7.6-17-17s7.6-17,17-17s17,7.6,17,17S121.9,102,112.5,102z M112.5,70c-8.3,0-15,6.7-15,15
+ s6.7,15,15,15s15-6.7,15-15S120.8,70,112.5,70z"/>
+ </g>
+ <g id="ic_x5F_add_x0D_">
+ </g>
+</g>
+<g id="Guides">
+</g>
+</svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/index.html
new file mode 100644
index 00000000000..966c717248e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/index.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+
+ <title>paper-radio-group</title>
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../polymer/polymer.html">
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+ </head>
+ <body>
+
+ <iron-component-page></iron-component-page>
+
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/package-lock.json
new file mode 100644
index 00000000000..8dc05bda10f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/package-lock.json
@@ -0,0 +1,983 @@
+{
+ "name": "@polymer/paper-radio-group",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.0.tgz",
+ "integrity": "sha512-a5DFXI3TdZSVOMH4608LVaBLmcr+mwM2+B8OSBiB9WFNCtdqzUXwtB5We6vBzrThXlO4uRo7d2pEqjNXMAlEkA==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "4.1.0",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.12"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.6.tgz",
+ "integrity": "sha512-CTUtLb6WqCCgp6P59QintjHWqzf4VL1uPA27bipLAPxFqrtK1gEYllePzTICGqQ8rYsCbpnsNypXjjDzGAAjEQ==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.8.tgz",
+ "integrity": "sha512-QqR0j08RCS1AQYPMRPHikEpcmK+2aEEbcSzWLwOqyJ4FhLmHUx/WjRrnn7tTQg/y4IKnMhzskh/o7qvGIZZ7iA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.6"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.0.0.tgz",
+ "integrity": "sha512-v+0wW9Wezwsyb0uF4aBVCjmSqit3Ru7PZFziGF0o2KwTvN2zWfTi3BRLq9EkJFdg3eBbyERXGTntVpBxH1J68Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.3",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
+ "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "4.0.0",
+ "array-back": "2.0.0",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.3.tgz",
+ "integrity": "sha512-7Z5PPegwDTyjbaeCnV0efcyS6vdKAU51kpEmS7QFib3P4822l8ICYyMn7qvJnc+WzLoDsuI9gPMKbJ8pCu8XtA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.8",
+ "winston": "2.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-QQL70IC85hI6q9uQeresEMcT1Qf8YR/zDe1qG8WWeeFAZk8z0lmzUpsfcAWz+bM4wpDdXrtd4HitIs4p0CHl/w==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.101",
+ "@types/parse5": "2.2.34",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "polymer-project-config": "3.9.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.9.0.tgz",
+ "integrity": "sha512-WPOqlV2W/M4Ni40QIqYSv8PE7H4rjiPm1KEf02QPtjZOGlAC4Rv7e6UJ1Ke1O70WT5bydcsEn3LViFIqYpVOJw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.101",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/package.json
new file mode 100644
index 00000000000..c3aa5e289af
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@polymer/paper-radio-group",
+ "private": true,
+ "description": "A group of material design radio buttons",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-radio-group.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir ."
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/paper-radio-group.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/paper-radio-group.d.ts
new file mode 100644
index 00000000000..28f0fd77bf8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/paper-radio-group.d.ts
@@ -0,0 +1,86 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-radio-group.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.d.ts" />
+/// <reference path="../iron-menu-behavior/iron-menubar-behavior.d.ts" />
+/// <reference path="../paper-radio-button/paper-radio-button.d.ts" />
+
+/**
+ * Material design: [Radio button](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-radio-button)
+ *
+ * `paper-radio-group` allows user to select at most one radio button from a set.
+ * Checking one radio button that belongs to a radio group unchecks any
+ * previously checked radio button within the same group. Use
+ * `selected` to get or set the selected radio button.
+ *
+ * The <paper-radio-buttons> inside the group must have the `name` attribute
+ * set.
+ *
+ * Example:
+ *
+ * <paper-radio-group selected="small">
+ * <paper-radio-button name="small">Small</paper-radio-button>
+ * <paper-radio-button name="medium">Medium</paper-radio-button>
+ * <paper-radio-button name="large">Large</paper-radio-button>
+ * </paper-radio-group>
+ *
+ * Radio-button-groups can be made optional, and allow zero buttons to be selected:
+ *
+ * <paper-radio-group selected="small" allow-empty-selection>
+ * <paper-radio-button name="small">Small</paper-radio-button>
+ * <paper-radio-button name="medium">Medium</paper-radio-button>
+ * <paper-radio-button name="large">Large</paper-radio-button>
+ * </paper-radio-group>
+ *
+ * See <a href="paper-radio-button">paper-radio-button</a> for more
+ * information about `paper-radio-button`.
+ *
+ *
+ * Custom property | Description | Default
+ * ----------------|-------------|----------
+ * `--paper-radio-group-item-padding` | The padding of the item | `12px`
+ */
+interface PaperRadioGroupElement extends Polymer.Element, Polymer.IronMenubarBehavior {
+
+ /**
+ * Overriden from Polymer.IronSelectableBehavior
+ */
+ attrForSelected: string|null|undefined;
+
+ /**
+ * Overriden from Polymer.IronSelectableBehavior
+ */
+ selectable: string|null|undefined;
+
+ /**
+ * Overriden from Polymer.IronSelectableBehavior
+ */
+ selectedAttribute: string|null|undefined;
+
+ /**
+ * If true, radio-buttons can be deselected
+ */
+ allowEmptySelection: boolean|null|undefined;
+
+ /**
+ * Selects the given value.
+ */
+ select(value: any): void;
+ _onUpKey(event: any): void;
+ _onDownKey(event: any): void;
+ _onLeftKey(event: any): void;
+ _onRightKey(event: any): void;
+ _activateFocusedItem(): void;
+}
+
+interface HTMLElementTagNameMap {
+ "paper-radio-group": PaperRadioGroupElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/paper-radio-group.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/paper-radio-group.html
new file mode 100644
index 00000000000..4d4c346370a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-radio-group/paper-radio-group.html
@@ -0,0 +1,185 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
+<link rel="import" href="../iron-menu-behavior/iron-menubar-behavior.html">
+<link rel="import" href="../paper-radio-button/paper-radio-button.html">
+
+<!--
+Material design: [Radio button](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-radio-button)
+
+`paper-radio-group` allows user to select at most one radio button from a set.
+Checking one radio button that belongs to a radio group unchecks any
+previously checked radio button within the same group. Use
+`selected` to get or set the selected radio button.
+
+The <paper-radio-buttons> inside the group must have the `name` attribute
+set.
+
+Example:
+
+ <paper-radio-group selected="small">
+ <paper-radio-button name="small">Small</paper-radio-button>
+ <paper-radio-button name="medium">Medium</paper-radio-button>
+ <paper-radio-button name="large">Large</paper-radio-button>
+ </paper-radio-group>
+
+Radio-button-groups can be made optional, and allow zero buttons to be selected:
+
+ <paper-radio-group selected="small" allow-empty-selection>
+ <paper-radio-button name="small">Small</paper-radio-button>
+ <paper-radio-button name="medium">Medium</paper-radio-button>
+ <paper-radio-button name="large">Large</paper-radio-button>
+ </paper-radio-group>
+
+See <a href="paper-radio-button">paper-radio-button</a> for more
+information about `paper-radio-button`.
+
+
+Custom property | Description | Default
+----------------|-------------|----------
+`--paper-radio-group-item-padding` | The padding of the item | `12px`
+
+@group Paper Elements
+@element paper-radio-group
+@hero hero.svg
+@demo demo/index.html
+-->
+
+<dom-module id="paper-radio-group">
+ <template>
+ <style>
+ :host {
+ display: inline-block;
+ }
+
+ :host ::slotted(*) {
+ padding: var(--paper-radio-group-item-padding, 12px);
+ }
+ </style>
+
+ <slot></slot>
+ </template>
+</dom-module>
+
+<script>
+ Polymer({
+ is: 'paper-radio-group',
+
+ behaviors: [
+ Polymer.IronMenubarBehavior
+ ],
+
+ /** @private */
+ hostAttributes: {
+ role: 'radiogroup',
+ },
+
+ properties: {
+ /**
+ * Fired when the radio group selection changes.
+ *
+ * @event paper-radio-group-changed
+ */
+
+ /**
+ * Overriden from Polymer.IronSelectableBehavior
+ */
+ attrForSelected: {
+ type: String,
+ value: 'name'
+ },
+
+ /**
+ * Overriden from Polymer.IronSelectableBehavior
+ */
+ selectedAttribute: {
+ type: String,
+ value: 'checked'
+ },
+
+ /**
+ * Overriden from Polymer.IronSelectableBehavior
+ */
+ selectable: {
+ type: String,
+ value: 'paper-radio-button'
+ },
+
+ /**
+ * If true, radio-buttons can be deselected
+ */
+ allowEmptySelection: {
+ type: Boolean,
+ value: false
+ }
+ },
+
+ /**
+ * Selects the given value.
+ */
+ select: function(value) {
+ var newItem = this._valueToItem(value);
+ if (newItem && newItem.hasAttribute('disabled')) {
+ return;
+ }
+
+ if (this.selected) {
+ var oldItem = this._valueToItem(this.selected);
+
+ if (this.selected == value) {
+ // If deselecting is allowed we'll have to apply an empty selection.
+ // Otherwise, we should force the selection to stay and make this
+ // action a no-op.
+ if (this.allowEmptySelection) {
+ value = '';
+ } else {
+ if (oldItem)
+ oldItem.checked = true;
+ return;
+ }
+ }
+
+ if (oldItem)
+ oldItem.checked = false;
+ }
+
+ Polymer.IronSelectableBehavior.select.apply(this, [value]);
+ this.fire('paper-radio-group-changed');
+ },
+
+ _activateFocusedItem: function() {
+ this._itemActivate(this._valueForItem(this.focusedItem), this.focusedItem);
+ },
+
+ _onUpKey: function(event) {
+ this._focusPrevious();
+ event.preventDefault();
+ this._activateFocusedItem();
+ },
+
+ _onDownKey: function(event) {
+ this._focusNext();
+ event.preventDefault();
+ this._activateFocusedItem();
+ },
+
+ _onLeftKey: function(event) {
+ Polymer.IronMenubarBehaviorImpl._onLeftKey.apply(this, arguments);
+ this._activateFocusedItem();
+ },
+
+ _onRightKey: function(event) {
+ Polymer.IronMenubarBehaviorImpl._onRightKey.apply(this, arguments);
+ this._activateFocusedItem();
+ }
+ });
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/.bower.json
new file mode 100644
index 00000000000..c3b272a384b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/.bower.json
@@ -0,0 +1,67 @@
+{
+ "name": "paper-ripple",
+ "version": "2.1.1",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "Adds a material design ripple to any container",
+ "private": true,
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "ripple"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-ripple.git"
+ },
+ "main": "paper-ripple.html",
+ "dependencies": {
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "polymerelements/iron-component-page#1 - 2",
+ "iron-icon": "polymerelements/iron-icon#1 - 2",
+ "iron-icons": "polymerelements/iron-icons#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
+ "iron-icon": "polymerelements/iron-icon#^1.0.0",
+ "iron-icons": "polymerelements/iron-icons#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "homepage": "https://github.com/PolymerElements/paper-ripple",
+ "_release": "2.1.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.1",
+ "commit": "6791ef2bb264e5ee314add5b0199c3d9562623c9"
+ },
+ "_source": "https://github.com/PolymerElements/paper-ripple.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/paper-ripple"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/.github/CODEOWNERS
new file mode 100644
index 00000000000..c5097c0c903
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @valdrinkoshi
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..689423dad14
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/paper-ripple/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/.travis.yml
new file mode 100644
index 00000000000..694626c6ac9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/.travis.yml
@@ -0,0 +1,32 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e '\n\033[31mERROR:\033[0m
+ Project is not formatted. Please run "npm run format".' && false)
+env:
+ global:
+ - secure: >-
+ eLNXQngbn6nHUirBVQAroarZUJHGZAj8sqSJaxRBqaL08//nzaOpnzuavYUeNSJ1fOnbL95jS5yZJy8+oCUW0a6BCXZUHJCrj/N6ywG4KpgPYQnUZVnpvsLdXZJuq4L4l5jYL1GsPydMePfAlrDpSu+QzEc1+C0q7sprxsbHbbQ=
+ - secure: >-
+ YLIZR4/tqr25Ty+daEdTInLVXoV/lSwagZCGMfT84SgHj94UYHr9u9Te3tNDeI8I83Kq1PSUn1kKE6ptT+EjuGhTDsyLx2IboVDtNlngDIo5GTSO1RBBzIlHRIb2eMS6om9cfLiOEWM3gFS/Mos/VYO3/A3ZSLE5BcNFagij724=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/README.md
new file mode 100644
index 00000000000..ac5f392643a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/README.md
@@ -0,0 +1,40 @@
+[![Build status](https://travis-ci.org/PolymerElements/paper-ripple.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-ripple)
+
+## &lt;paper-ripple&gt;
+
+Material design: [Surface reaction](https://www.google.com/design/spec/animation/responsive-interaction.html#responsive-interaction-surface-reaction)
+
+`paper-ripple` provides a visual effect that other paper elements can
+use to simulate a rippling effect emanating from the point of contact. The
+effect can be visualized as a concentric circle with motion.
+
+<!---
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="paper-ripple.html">
+ <style is="custom-style">
+ div {
+ height: 100px;
+ width: 100%;
+ box-shadow: 0 12px 15px 0 rgba(0, 0, 0, 0.24);
+ }
+
+ paper-ripple {
+ color: #4285f4;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<div style="position: relative">
+ <paper-ripple></paper-ripple>
+</div
+```
+
+
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/bower.json
new file mode 100644
index 00000000000..2ab2f1a8dd1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/bower.json
@@ -0,0 +1,57 @@
+{
+ "name": "paper-ripple",
+ "version": "2.1.1",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "Adds a material design ripple to any container",
+ "private": true,
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "ripple"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-ripple.git"
+ },
+ "main": "paper-ripple.html",
+ "dependencies": {
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "polymerelements/iron-component-page#1 - 2",
+ "iron-icon": "polymerelements/iron-icon#1 - 2",
+ "iron-icons": "polymerelements/iron-icons#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
+ "iron-icon": "polymerelements/iron-icon#^1.0.0",
+ "iron-icons": "polymerelements/iron-icons#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/demo/index.html
new file mode 100644
index 00000000000..58a7d0d1bf9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/demo/index.html
@@ -0,0 +1,405 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<!doctype html>
+<html>
+
+<head>
+ <title>paper-ripple demo</title>
+
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
+ <meta name="mobile-web-app-capable" content="yes">
+ <meta name="apple-mobile-web-app-capable" content="yes">
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../iron-icons/iron-icons.html">
+ <link rel="import" href="../../iron-icon/iron-icon.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../paper-ripple.html">
+
+ <custom-style><style is="custom-style" include="demo-pages-shared-styles">
+
+ demo-snippet {
+ --demo-snippet-code: {
+ max-height: 250px;
+ }
+ }
+
+ /* Button */
+ .button {
+ display: inline-block;
+ position: relative;
+ width: 80px;
+ height: 32px;
+ line-height: 32px;
+ border-radius: 2px;
+ font-size: 0.9em;
+ background-color: #fff;
+ color: #646464;
+ margin: 10px;
+ }
+
+ .button > paper-ripple {
+ border-radius: 2px;
+ overflow: hidden;
+ }
+
+ .button.narrow {
+ width: 60px;
+ }
+
+ .button.grey {
+ background-color: #eee;
+ }
+
+ .button.blue {
+ background-color: #4285f4;
+ color: #fff;
+ }
+
+ .button.green {
+ background-color: #0f9d58;
+ color: #fff;
+ }
+
+ .button.raised {
+ transition: box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1);
+ transition-delay: 0.2s;
+ box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);
+ }
+
+ .button.raised:active {
+ box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2);
+ transition-delay: 0s;
+ }
+
+ /* Icon Button */
+ .icon-button {
+ position: relative;
+ display: inline-block;
+ width: 56px;
+ height: 56px;
+ }
+
+ .icon-button > iron-icon {
+ margin: 16px;
+ transition: -webkit-transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
+ transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
+ }
+
+ .icon-button:hover > iron-icon {
+ -webkit-transform: scale(1.2);
+ transform: scale(1.2);
+ }
+
+ .icon-button > paper-ripple {
+ overflow: hidden;
+ color: #646464;
+ }
+
+ .icon-button.red > iron-icon {
+ --iron-icon-fill-color: #db4437;
+ }
+
+ .icon-button.red > paper-ripple {
+ color: #db4437;
+ }
+
+ .icon-button.blue > iron-icon {
+ --iron-icon-fill-color: #4285f4;
+ }
+
+ .icon-button.blue > paper-ripple {
+ color: #4285f4;
+ }
+
+ /* FAB */
+ .fab {
+ position: relative;
+ display: inline-block;
+ width: 56px;
+ height: 56px;
+ border-radius: 50%;
+ color: #fff;
+ overflow: hidden;
+ transition: box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1);
+ transition-delay: 0.2s;
+ box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);
+ margin: 10px;
+ }
+
+ .fab.red {
+ background-color: #d23f31;
+ }
+
+ .fab.blue {
+ background-color: #4285f4;
+ }
+
+ .fab.green {
+ background-color: #0f9d58;
+ }
+
+ .fab:active {
+ box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2);
+ transition-delay: 0s;
+ }
+
+ .fab > iron-icon {
+ margin: 16px;
+ }
+
+ .fab > iron-icon {
+ --iron-icon-fill-color: #fff;
+ }
+
+ /* Menu */
+ .menu {
+ display: inline-block;
+ width: 180px;
+ margin: 10px;
+ background-color: #fff;
+ box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2);
+ }
+
+ .item {
+ position: relative;
+ height: 48px;
+ line-height: 48px;
+ color: #646464;
+ font-size: 0.9em;
+ }
+
+ .menu.blue > .item {
+ color: #4285f4;
+ }
+
+ /* Card, Dialog */
+ .card, .dialog {
+ position: relative;
+ display: inline-block;
+ width: 240px;
+ height: 240px;
+ vertical-align: top;
+ background-color: #fff;
+ box-shadow: 0 12px 15px 0 rgba(0, 0, 0, 0.24);
+ margin: 10px;
+ }
+
+ .dialog {
+ box-sizing: border-box;
+ padding: 16px;
+ }
+
+ .dialog > .content {
+ height: 170px;
+ font-size: 0.9em;
+ }
+
+ .dialog > .content > .title {
+ font-size: 1.3em;
+ }
+
+ .dialog > .button {
+ float: right;
+ }
+
+ .card.image {
+ background: url(http://lorempixel.com/300/240/nature/);
+ color: #fff;
+ }
+
+ /* Misc */
+ .center {
+ text-align: center;
+ }
+
+ .label {
+ padding: 0 16px;
+ }
+
+ .label-blue {
+ color: #4285f4;
+ }
+
+ .label-red {
+ color: #d23f31;
+ }
+ </style></custom-style>
+</head>
+
+<body unresolved class="centered">
+
+ <demo-snippet class="centered-demo">
+ <template>
+ <div class="button raised">
+ <div class="center" tabindex="1">SUBMIT</div>
+ <paper-ripple></paper-ripple>
+ </div>
+
+ <div class="button raised">
+ <div class="center" tabindex="1">NO INK</div>
+ <paper-ripple noink></paper-ripple>
+ </div>
+
+ <div class="button raised grey">
+ <div class="center" tabindex="1">CANCEL</div>
+ <paper-ripple></paper-ripple>
+ </div>
+
+ <div class="button raised blue">
+ <div class="center" tabindex="1">COMPOSE</div>
+ <paper-ripple></paper-ripple>
+ </div>
+
+ <div class="button raised green">
+ <div class="center" tabindex="1">OK</div>
+ <paper-ripple></paper-ripple>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <demo-snippet class="centered-demo">
+ <template>
+ <div class="button raised grey narrow">
+ <div class="center" tabindex="1">+1</div>
+ <paper-ripple></paper-ripple>
+ </div>
+
+ <div class="button raised grey narrow label-blue">
+ <div class="center" tabindex="1">+1</div>
+ <paper-ripple></paper-ripple>
+ </div>
+
+ <div class="button raised grey narrow label-red">
+ <div class="center" tabindex="1">+1</div>
+ <paper-ripple></paper-ripple>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <demo-snippet class="centered-demo">
+ <template>
+ <div class="icon-button">
+ <iron-icon icon="menu" tabindex="1"></iron-icon>
+ <paper-ripple class="circle" recenters></paper-ripple>
+ </div>
+
+ <div class="icon-button">
+ <iron-icon icon="more-vert" tabindex="1"></iron-icon>
+ <paper-ripple class="circle" recenters></paper-ripple>
+ </div>
+
+ <div class="icon-button red">
+ <iron-icon icon="delete" tabindex="1"></iron-icon>
+ <paper-ripple class="circle" recenters></paper-ripple>
+ </div>
+
+ <div class="icon-button blue">
+ <iron-icon icon="account-box" tabindex="1"></iron-icon>
+ <paper-ripple class="circle" recenters></paper-ripple>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <demo-snippet class="centered-demo">
+ <template>
+ <div class="fab red">
+ <iron-icon icon="add" tabindex="1"></iron-icon>
+ <paper-ripple class="circle" recenters></paper-ripple>
+ </div>
+
+ <div class="fab blue">
+ <iron-icon icon="mail" tabindex="1"></iron-icon>
+ <paper-ripple class="circle" recenters></paper-ripple>
+ </div>
+
+ <div class="fab green">
+ <iron-icon icon="create" tabindex="1"></iron-icon>
+ <paper-ripple class="circle" recenters></paper-ripple>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <demo-snippet class="centered-demo">
+ <template>
+ <div class="menu">
+ <div class="item">
+ <div class="label" tabindex="1">Mark as unread</div>
+ <paper-ripple></paper-ripple>
+ </div>
+ <div class="item">
+ <div class="label" tabindex="1">Mark as important</div>
+ <paper-ripple></paper-ripple>
+ </div>
+ <div class="item">
+ <div class="label" tabindex="1">Add to Tasks</div>
+ <paper-ripple></paper-ripple>
+ </div>
+ <div class="item">
+ <div class="label" tabindex="1">Create event</div>
+ <paper-ripple></paper-ripple>
+ </div>
+ </div>
+
+ <div class="menu blue">
+ <div class="item">
+ <div class="label" tabindex="1">Import</div>
+ <paper-ripple></paper-ripple>
+ </div>
+ <div class="item">
+ <div class="label" tabindex="1">Export</div>
+ <paper-ripple></paper-ripple>
+ </div>
+ <div class="item">
+ <div class="label" tabindex="1">Print</div>
+ <paper-ripple></paper-ripple>
+ </div>
+ <div class="item">
+ <div class="label" tabindex="1">Restore contacts</div>
+ <paper-ripple></paper-ripple>
+ </div>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <demo-snippet class="centered-demo">
+ <template>
+ <div class="dialog">
+ <div class="content">
+ <div class="title">Permission</div>
+ <br>
+ <div>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam.</div>
+ </div>
+
+ <div class="button label-blue">
+ <div class="center" tabindex="1">ACCEPT</div>
+ <paper-ripple></paper-ripple>
+ </div>
+
+ <div class="button">
+ <div class="center" tabindex="1">DECLINE</div>
+ <paper-ripple></paper-ripple>
+ </div>
+ </div>
+
+ <div class="card" tabindex="1">
+ <paper-ripple recenters></paper-ripple>
+ </div>
+
+ <div class="card image" tabindex="1">
+ <paper-ripple recenters></paper-ripple>
+ </div>
+ </template>
+ </demo-snippet>
+</body>
+
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/hero.svg b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/hero.svg
new file mode 100755
index 00000000000..f8a872f1e63
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/hero.svg
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">
+<g id="background" display="none">
+ <rect display="inline" fill="#B0BEC5" width="225" height="126"/>
+</g>
+<g id="label">
+</g>
+<g id="art">
+ <path d="M175,81H49V45h126V81z M51,79h122V47H51V79z"/>
+ <g>
+ <defs>
+ <rect id="SVGID_5_" x="50" y="46" width="124" height="34"/>
+ </defs>
+ <clipPath id="SVGID_2_">
+ <use xlink:href="#SVGID_5_" overflow="visible"/>
+ </clipPath>
+ <circle opacity="0.5" clip-path="url(#SVGID_2_)" cx="84.4" cy="62.7" r="41.9"/>
+ <circle opacity="0.6" clip-path="url(#SVGID_2_)" cx="84.4" cy="62.7" r="26.3"/>
+ <circle opacity="0.6" clip-path="url(#SVGID_2_)" cx="66.4" cy="62.7" r="26.3"/>
+ </g>
+ <circle cx="50" cy="80" r="4"/>
+ <g id="ic_x5F_add_x0D_">
+ </g>
+</g>
+<g id="Guides">
+</g>
+</svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/index.html
new file mode 100644
index 00000000000..e552b0bb955
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/index.html
@@ -0,0 +1,27 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <title>paper-ripple</title>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/package-lock.json
new file mode 100644
index 00000000000..127fbe41a27
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/package-lock.json
@@ -0,0 +1,2388 @@
+{
+ "name": "@polymer/paper-ripple",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.6.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.4.tgz",
+ "integrity": "sha512-Awg4BcUYiZtNKoveGOu654JVPt11V/KIC77iBz8NweyoOAZpz5rUJfPDwwD+ajfTs2HndbTCEB8IuLfX9m/mmw==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.44",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+ "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz",
+ "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.2",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.105",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.44",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.2",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/package.json
new file mode 100644
index 00000000000..1f5cc75894e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@polymer/paper-ripple",
+ "private": true,
+ "description": "Adds a material design ripple to any container",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-ripple.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.1.1",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/paper-ripple.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/paper-ripple.d.ts
new file mode 100644
index 00000000000..88f5a613347
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/paper-ripple.d.ts
@@ -0,0 +1,171 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-ripple.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.d.ts" />
+
+/**
+ * Material design: [Surface reaction](https://www.google.com/design/spec/animation/responsive-interaction.html#responsive-interaction-surface-reaction)
+ *
+ * `paper-ripple` provides a visual effect that other paper elements can
+ * use to simulate a rippling effect emanating from the point of contact. The
+ * effect can be visualized as a concentric circle with motion.
+ *
+ * Example:
+ *
+ * <div style="position:relative">
+ * <paper-ripple></paper-ripple>
+ * </div>
+ *
+ * Note, it's important that the parent container of the ripple be relative position, otherwise
+ * the ripple will emanate outside of the desired container.
+ *
+ * `paper-ripple` listens to "mousedown" and "mouseup" events so it would display ripple
+ * effect when touches on it. You can also defeat the default behavior and
+ * manually route the down and up actions to the ripple element. Note that it is
+ * important if you call `downAction()` you will have to make sure to call
+ * `upAction()` so that `paper-ripple` would end the animation loop.
+ *
+ * Example:
+ *
+ * <paper-ripple id="ripple" style="pointer-events: none;"></paper-ripple>
+ * ...
+ * downAction: function(e) {
+ * this.$.ripple.downAction(e.detail);
+ * },
+ * upAction: function(e) {
+ * this.$.ripple.upAction();
+ * }
+ *
+ * Styling ripple effect:
+ *
+ * Use CSS color property to style the ripple:
+ *
+ * paper-ripple {
+ * color: #4285f4;
+ * }
+ *
+ * Note that CSS color property is inherited so it is not required to set it on
+ * the `paper-ripple` element directly.
+ *
+ * By default, the ripple is centered on the point of contact. Apply the `recenters`
+ * attribute to have the ripple grow toward the center of its container.
+ *
+ * <paper-ripple recenters></paper-ripple>
+ *
+ * You can also center the ripple inside its container from the start.
+ *
+ * <paper-ripple center></paper-ripple>
+ *
+ * Apply `circle` class to make the rippling effect within a circle.
+ *
+ * <paper-ripple class="circle"></paper-ripple>
+ */
+interface PaperRippleElement extends Polymer.Element, Polymer.IronA11yKeysBehavior {
+ keyBindings: object;
+
+ /**
+ * The initial opacity set on the wave.
+ */
+ initialOpacity: number|null|undefined;
+
+ /**
+ * How fast (opacity per second) the wave fades out.
+ */
+ opacityDecayVelocity: number|null|undefined;
+
+ /**
+ * If true, ripples will exhibit a gravitational pull towards
+ * the center of their container as they fade away.
+ */
+ recenters: boolean|null|undefined;
+
+ /**
+ * If true, ripples will center inside its container
+ */
+ center: boolean|null|undefined;
+
+ /**
+ * A list of the visual ripples.
+ */
+ ripples: any[]|null|undefined;
+
+ /**
+ * True when there are visible ripples animating within the
+ * element.
+ */
+ readonly animating: boolean|null|undefined;
+
+ /**
+ * If true, the ripple will remain in the "down" state until `holdDown`
+ * is set to false again.
+ */
+ holdDown: boolean|null|undefined;
+
+ /**
+ * If true, the ripple will not generate a ripple effect
+ * via pointer interaction.
+ * Calling ripple's imperative api like `simulatedRipple` will
+ * still generate the ripple effect.
+ */
+ noink: boolean|null|undefined;
+ _animating: boolean|null|undefined;
+ _boundAnimate: Function|null|undefined;
+ readonly target: any;
+ readonly shouldKeepAnimating: any;
+ attached(): void;
+ detached(): void;
+ simulatedRipple(): void;
+
+ /**
+ * Provokes a ripple down effect via a UI event,
+ * respecting the `noink` property.
+ */
+ uiDownAction(event?: Event|null): void;
+
+ /**
+ * Provokes a ripple down effect via a UI event,
+ * *not* respecting the `noink` property.
+ */
+ downAction(event?: Event|null): void;
+
+ /**
+ * Provokes a ripple up effect via a UI event,
+ * respecting the `noink` property.
+ */
+ uiUpAction(event?: Event|null): void;
+
+ /**
+ * Provokes a ripple up effect via a UI event,
+ * *not* respecting the `noink` property.
+ */
+ upAction(event?: Event|null): void;
+ onAnimationComplete(): void;
+ addRipple(): any;
+ removeRipple(ripple: any): void;
+
+ /**
+ * This conflicts with Element#antimate().
+ * https://developer.mozilla.org/en-US/docs/Web/API/Element/animate
+ */
+ animate(): void;
+ _onEnterKeydown(): void;
+ _onSpaceKeydown(): void;
+ _onSpaceKeyup(): void;
+
+ /**
+ * effect.
+ */
+ _holdDownChanged(newVal: any, oldVal: any): void;
+}
+
+interface HTMLElementTagNameMap {
+ "paper-ripple": PaperRippleElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/paper-ripple.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/paper-ripple.html
new file mode 100644
index 00000000000..e7ea501169b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-ripple/paper-ripple.html
@@ -0,0 +1,729 @@
+<!--
+@license
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
+
+<!--
+Material design: [Surface reaction](https://www.google.com/design/spec/animation/responsive-interaction.html#responsive-interaction-surface-reaction)
+
+`paper-ripple` provides a visual effect that other paper elements can
+use to simulate a rippling effect emanating from the point of contact. The
+effect can be visualized as a concentric circle with motion.
+
+Example:
+
+ <div style="position:relative">
+ <paper-ripple></paper-ripple>
+ </div>
+
+Note, it's important that the parent container of the ripple be relative position, otherwise
+the ripple will emanate outside of the desired container.
+
+`paper-ripple` listens to "mousedown" and "mouseup" events so it would display ripple
+effect when touches on it. You can also defeat the default behavior and
+manually route the down and up actions to the ripple element. Note that it is
+important if you call `downAction()` you will have to make sure to call
+`upAction()` so that `paper-ripple` would end the animation loop.
+
+Example:
+
+ <paper-ripple id="ripple" style="pointer-events: none;"></paper-ripple>
+ ...
+ downAction: function(e) {
+ this.$.ripple.downAction(e.detail);
+ },
+ upAction: function(e) {
+ this.$.ripple.upAction();
+ }
+
+Styling ripple effect:
+
+ Use CSS color property to style the ripple:
+
+ paper-ripple {
+ color: #4285f4;
+ }
+
+ Note that CSS color property is inherited so it is not required to set it on
+ the `paper-ripple` element directly.
+
+By default, the ripple is centered on the point of contact. Apply the `recenters`
+attribute to have the ripple grow toward the center of its container.
+
+ <paper-ripple recenters></paper-ripple>
+
+You can also center the ripple inside its container from the start.
+
+ <paper-ripple center></paper-ripple>
+
+Apply `circle` class to make the rippling effect within a circle.
+
+ <paper-ripple class="circle"></paper-ripple>
+
+@group Paper Elements
+@element paper-ripple
+@hero hero.svg
+@demo demo/index.html
+-->
+
+<dom-module id="paper-ripple">
+
+ <template>
+ <style>
+ :host {
+ display: block;
+ position: absolute;
+ border-radius: inherit;
+ overflow: hidden;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+
+ /* See PolymerElements/paper-behaviors/issues/34. On non-Chrome browsers,
+ * creating a node (with a position:absolute) in the middle of an event
+ * handler "interrupts" that event handler (which happens when the
+ * ripple is created on demand) */
+ pointer-events: none;
+ }
+
+ :host([animating]) {
+ /* This resolves a rendering issue in Chrome (as of 40) where the
+ ripple is not properly clipped by its parent (which may have
+ rounded corners). See: http://jsbin.com/temexa/4
+
+ Note: We only apply this style conditionally. Otherwise, the browser
+ will create a new compositing layer for every ripple element on the
+ page, and that would be bad. */
+ -webkit-transform: translate(0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ #background,
+ #waves,
+ .wave-container,
+ .wave {
+ pointer-events: none;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ }
+
+ #background,
+ .wave {
+ opacity: 0;
+ }
+
+ #waves,
+ .wave {
+ overflow: hidden;
+ }
+
+ .wave-container,
+ .wave {
+ border-radius: 50%;
+ }
+
+ :host(.circle) #background,
+ :host(.circle) #waves {
+ border-radius: 50%;
+ }
+
+ :host(.circle) .wave-container {
+ overflow: hidden;
+ }
+ </style>
+
+ <div id="background"></div>
+ <div id="waves"></div>
+ </template>
+</dom-module>
+<script>
+ (function() {
+ 'use strict';
+
+ var Utility = {
+ distance: function(x1, y1, x2, y2) {
+ var xDelta = (x1 - x2);
+ var yDelta = (y1 - y2);
+
+ return Math.sqrt(xDelta * xDelta + yDelta * yDelta);
+ },
+
+ now: window.performance && window.performance.now ?
+ window.performance.now.bind(window.performance) :
+ Date.now
+ };
+
+ /**
+ * @param {HTMLElement} element
+ * @constructor
+ */
+ function ElementMetrics(element) {
+ this.element = element;
+ this.width = this.boundingRect.width;
+ this.height = this.boundingRect.height;
+
+ this.size = Math.max(this.width, this.height);
+ }
+
+ ElementMetrics.prototype = {
+ get boundingRect() {
+ return this.element.getBoundingClientRect();
+ },
+
+ furthestCornerDistanceFrom: function(x, y) {
+ var topLeft = Utility.distance(x, y, 0, 0);
+ var topRight = Utility.distance(x, y, this.width, 0);
+ var bottomLeft = Utility.distance(x, y, 0, this.height);
+ var bottomRight = Utility.distance(x, y, this.width, this.height);
+
+ return Math.max(topLeft, topRight, bottomLeft, bottomRight);
+ }
+ };
+
+ /**
+ * @param {HTMLElement} element
+ * @constructor
+ */
+ function Ripple(element) {
+ this.element = element;
+ this.color = window.getComputedStyle(element).color;
+
+ this.wave = document.createElement('div');
+ this.waveContainer = document.createElement('div');
+ this.wave.style.backgroundColor = this.color;
+ this.wave.classList.add('wave');
+ this.waveContainer.classList.add('wave-container');
+ Polymer.dom(this.waveContainer).appendChild(this.wave);
+
+ this.resetInteractionState();
+ }
+
+ Ripple.MAX_RADIUS = 300;
+
+ Ripple.prototype = {
+ get recenters() {
+ return this.element.recenters;
+ },
+
+ get center() {
+ return this.element.center;
+ },
+
+ get mouseDownElapsed() {
+ var elapsed;
+
+ if (!this.mouseDownStart) {
+ return 0;
+ }
+
+ elapsed = Utility.now() - this.mouseDownStart;
+
+ if (this.mouseUpStart) {
+ elapsed -= this.mouseUpElapsed;
+ }
+
+ return elapsed;
+ },
+
+ get mouseUpElapsed() {
+ return this.mouseUpStart ? Utility.now() - this.mouseUpStart : 0;
+ },
+
+ get mouseDownElapsedSeconds() {
+ return this.mouseDownElapsed / 1000;
+ },
+
+ get mouseUpElapsedSeconds() {
+ return this.mouseUpElapsed / 1000;
+ },
+
+ get mouseInteractionSeconds() {
+ return this.mouseDownElapsedSeconds + this.mouseUpElapsedSeconds;
+ },
+
+ get initialOpacity() {
+ return this.element.initialOpacity;
+ },
+
+ get opacityDecayVelocity() {
+ return this.element.opacityDecayVelocity;
+ },
+
+ get radius() {
+ var width2 = this.containerMetrics.width * this.containerMetrics.width;
+ var height2 = this.containerMetrics.height * this.containerMetrics.height;
+ var waveRadius =
+ Math.min(Math.sqrt(width2 + height2), Ripple.MAX_RADIUS) * 1.1 + 5;
+
+ var duration = 1.1 - 0.2 * (waveRadius / Ripple.MAX_RADIUS);
+ var timeNow = this.mouseInteractionSeconds / duration;
+ var size = waveRadius * (1 - Math.pow(80, -timeNow));
+
+ return Math.abs(size);
+ },
+
+ get opacity() {
+ if (!this.mouseUpStart) {
+ return this.initialOpacity;
+ }
+
+ return Math.max(
+ 0,
+ this.initialOpacity -
+ this.mouseUpElapsedSeconds * this.opacityDecayVelocity);
+ },
+
+ get outerOpacity() {
+ // Linear increase in background opacity, capped at the opacity
+ // of the wavefront (waveOpacity).
+ var outerOpacity = this.mouseUpElapsedSeconds * 0.3;
+ var waveOpacity = this.opacity;
+
+ return Math.max(0, Math.min(outerOpacity, waveOpacity));
+ },
+
+ get isOpacityFullyDecayed() {
+ return this.opacity < 0.01 &&
+ this.radius >= Math.min(this.maxRadius, Ripple.MAX_RADIUS);
+ },
+
+ get isRestingAtMaxRadius() {
+ return this.opacity >= this.initialOpacity &&
+ this.radius >= Math.min(this.maxRadius, Ripple.MAX_RADIUS);
+ },
+
+ get isAnimationComplete() {
+ return this.mouseUpStart ? this.isOpacityFullyDecayed :
+ this.isRestingAtMaxRadius;
+ },
+
+ get translationFraction() {
+ return Math.min(
+ 1, this.radius / this.containerMetrics.size * 2 / Math.sqrt(2));
+ },
+
+ get xNow() {
+ if (this.xEnd) {
+ return this.xStart + this.translationFraction * (this.xEnd - this.xStart);
+ }
+
+ return this.xStart;
+ },
+
+ get yNow() {
+ if (this.yEnd) {
+ return this.yStart + this.translationFraction * (this.yEnd - this.yStart);
+ }
+
+ return this.yStart;
+ },
+
+ get isMouseDown() {
+ return this.mouseDownStart && !this.mouseUpStart;
+ },
+
+ resetInteractionState: function() {
+ this.maxRadius = 0;
+ this.mouseDownStart = 0;
+ this.mouseUpStart = 0;
+
+ this.xStart = 0;
+ this.yStart = 0;
+ this.xEnd = 0;
+ this.yEnd = 0;
+ this.slideDistance = 0;
+
+ this.containerMetrics = new ElementMetrics(this.element);
+ },
+
+ draw: function() {
+ var scale;
+ var dx;
+ var dy;
+
+ this.wave.style.opacity = this.opacity;
+
+ scale = this.radius / (this.containerMetrics.size / 2);
+ dx = this.xNow - (this.containerMetrics.width / 2);
+ dy = this.yNow - (this.containerMetrics.height / 2);
+
+
+ // 2d transform for safari because of border-radius and overflow:hidden
+ // clipping bug. https://bugs.webkit.org/show_bug.cgi?id=98538
+ this.waveContainer.style.webkitTransform =
+ 'translate(' + dx + 'px, ' + dy + 'px)';
+ this.waveContainer.style.transform =
+ 'translate3d(' + dx + 'px, ' + dy + 'px, 0)';
+ this.wave.style.webkitTransform = 'scale(' + scale + ',' + scale + ')';
+ this.wave.style.transform = 'scale3d(' + scale + ',' + scale + ',1)';
+ },
+
+ /** @param {Event=} event */
+ downAction: function(event) {
+ var xCenter = this.containerMetrics.width / 2;
+ var yCenter = this.containerMetrics.height / 2;
+
+ this.resetInteractionState();
+ this.mouseDownStart = Utility.now();
+
+ if (this.center) {
+ this.xStart = xCenter;
+ this.yStart = yCenter;
+ this.slideDistance =
+ Utility.distance(this.xStart, this.yStart, this.xEnd, this.yEnd);
+ } else {
+ this.xStart = event ?
+ event.detail.x - this.containerMetrics.boundingRect.left :
+ this.containerMetrics.width / 2;
+ this.yStart = event ?
+ event.detail.y - this.containerMetrics.boundingRect.top :
+ this.containerMetrics.height / 2;
+ }
+
+ if (this.recenters) {
+ this.xEnd = xCenter;
+ this.yEnd = yCenter;
+ this.slideDistance =
+ Utility.distance(this.xStart, this.yStart, this.xEnd, this.yEnd);
+ }
+
+ this.maxRadius = this.containerMetrics.furthestCornerDistanceFrom(
+ this.xStart, this.yStart);
+
+ this.waveContainer.style.top =
+ (this.containerMetrics.height - this.containerMetrics.size) / 2 + 'px';
+ this.waveContainer.style.left =
+ (this.containerMetrics.width - this.containerMetrics.size) / 2 + 'px';
+
+ this.waveContainer.style.width = this.containerMetrics.size + 'px';
+ this.waveContainer.style.height = this.containerMetrics.size + 'px';
+ },
+
+ /** @param {Event=} event */
+ upAction: function(event) {
+ if (!this.isMouseDown) {
+ return;
+ }
+
+ this.mouseUpStart = Utility.now();
+ },
+
+ remove: function() {
+ Polymer.dom(this.waveContainer.parentNode).removeChild(this.waveContainer);
+ }
+ };
+
+ Polymer({
+ is: 'paper-ripple',
+
+ behaviors: [Polymer.IronA11yKeysBehavior],
+
+ properties: {
+ /**
+ * The initial opacity set on the wave.
+ *
+ * @attribute initialOpacity
+ * @type number
+ * @default 0.25
+ */
+ initialOpacity: {type: Number, value: 0.25},
+
+ /**
+ * How fast (opacity per second) the wave fades out.
+ *
+ * @attribute opacityDecayVelocity
+ * @type number
+ * @default 0.8
+ */
+ opacityDecayVelocity: {type: Number, value: 0.8},
+
+ /**
+ * If true, ripples will exhibit a gravitational pull towards
+ * the center of their container as they fade away.
+ *
+ * @attribute recenters
+ * @type boolean
+ * @default false
+ */
+ recenters: {type: Boolean, value: false},
+
+ /**
+ * If true, ripples will center inside its container
+ *
+ * @attribute recenters
+ * @type boolean
+ * @default false
+ */
+ center: {type: Boolean, value: false},
+
+ /**
+ * A list of the visual ripples.
+ *
+ * @attribute ripples
+ * @type Array
+ * @default []
+ */
+ ripples: {
+ type: Array,
+ value: function() {
+ return [];
+ }
+ },
+
+ /**
+ * True when there are visible ripples animating within the
+ * element.
+ */
+ animating:
+ {type: Boolean, readOnly: true, reflectToAttribute: true, value: false},
+
+ /**
+ * If true, the ripple will remain in the "down" state until `holdDown`
+ * is set to false again.
+ */
+ holdDown: {type: Boolean, value: false, observer: '_holdDownChanged'},
+
+ /**
+ * If true, the ripple will not generate a ripple effect
+ * via pointer interaction.
+ * Calling ripple's imperative api like `simulatedRipple` will
+ * still generate the ripple effect.
+ */
+ noink: {type: Boolean, value: false},
+
+ _animating: {type: Boolean},
+
+ _boundAnimate: {
+ type: Function,
+ value: function() {
+ return this.animate.bind(this);
+ }
+ }
+ },
+
+ get target() {
+ return this.keyEventTarget;
+ },
+
+ /**
+ * @type {!Object}
+ */
+ keyBindings: {
+ 'enter:keydown': '_onEnterKeydown',
+ 'space:keydown': '_onSpaceKeydown',
+ 'space:keyup': '_onSpaceKeyup'
+ },
+
+ attached: function() {
+ // Set up a11yKeysBehavior to listen to key events on the target,
+ // so that space and enter activate the ripple even if the target doesn't
+ // handle key events. The key handlers deal with `noink` themselves.
+ if (this.parentNode.nodeType == 11) { // DOCUMENT_FRAGMENT_NODE
+ this.keyEventTarget = Polymer.dom(this).getOwnerRoot().host;
+ } else {
+ this.keyEventTarget = this.parentNode;
+ }
+ var keyEventTarget = /** @type {!EventTarget} */ (this.keyEventTarget);
+ this.listen(keyEventTarget, 'up', 'uiUpAction');
+ this.listen(keyEventTarget, 'down', 'uiDownAction');
+ },
+
+ detached: function() {
+ this.unlisten(this.keyEventTarget, 'up', 'uiUpAction');
+ this.unlisten(this.keyEventTarget, 'down', 'uiDownAction');
+ this.keyEventTarget = null;
+ },
+
+ get shouldKeepAnimating() {
+ for (var index = 0; index < this.ripples.length; ++index) {
+ if (!this.ripples[index].isAnimationComplete) {
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+ simulatedRipple: function() {
+ this.downAction(null);
+
+ // Please see polymer/polymer#1305
+ this.async(function() {
+ this.upAction();
+ }, 1);
+ },
+
+ /**
+ * Provokes a ripple down effect via a UI event,
+ * respecting the `noink` property.
+ * @param {Event=} event
+ */
+ uiDownAction: function(event) {
+ if (!this.noink) {
+ this.downAction(event);
+ }
+ },
+
+ /**
+ * Provokes a ripple down effect via a UI event,
+ * *not* respecting the `noink` property.
+ * @param {Event=} event
+ */
+ downAction: function(event) {
+ if (this.holdDown && this.ripples.length > 0) {
+ return;
+ }
+
+ var ripple = this.addRipple();
+
+ ripple.downAction(event);
+
+ if (!this._animating) {
+ this._animating = true;
+ this.animate();
+ }
+ },
+
+ /**
+ * Provokes a ripple up effect via a UI event,
+ * respecting the `noink` property.
+ * @param {Event=} event
+ */
+ uiUpAction: function(event) {
+ if (!this.noink) {
+ this.upAction(event);
+ }
+ },
+
+ /**
+ * Provokes a ripple up effect via a UI event,
+ * *not* respecting the `noink` property.
+ * @param {Event=} event
+ */
+ upAction: function(event) {
+ if (this.holdDown) {
+ return;
+ }
+
+ this.ripples.forEach(function(ripple) {
+ ripple.upAction(event);
+ });
+
+ this._animating = true;
+ this.animate();
+ },
+
+ onAnimationComplete: function() {
+ this._animating = false;
+ this.$.background.style.backgroundColor = null;
+ this.fire('transitionend');
+ },
+
+ addRipple: function() {
+ var ripple = new Ripple(this);
+
+ Polymer.dom(this.$.waves).appendChild(ripple.waveContainer);
+ this.$.background.style.backgroundColor = ripple.color;
+ this.ripples.push(ripple);
+
+ this._setAnimating(true);
+
+ return ripple;
+ },
+
+ removeRipple: function(ripple) {
+ var rippleIndex = this.ripples.indexOf(ripple);
+
+ if (rippleIndex < 0) {
+ return;
+ }
+
+ this.ripples.splice(rippleIndex, 1);
+
+ ripple.remove();
+
+ if (!this.ripples.length) {
+ this._setAnimating(false);
+ }
+ },
+
+ /**
+ * This conflicts with Element#antimate().
+ * https://developer.mozilla.org/en-US/docs/Web/API/Element/animate
+ * @suppress {checkTypes}
+ */
+ animate: function() {
+ if (!this._animating) {
+ return;
+ }
+ var index;
+ var ripple;
+
+ for (index = 0; index < this.ripples.length; ++index) {
+ ripple = this.ripples[index];
+
+ ripple.draw();
+
+ this.$.background.style.opacity = ripple.outerOpacity;
+
+ if (ripple.isOpacityFullyDecayed && !ripple.isRestingAtMaxRadius) {
+ this.removeRipple(ripple);
+ }
+ }
+
+ if (!this.shouldKeepAnimating && this.ripples.length === 0) {
+ this.onAnimationComplete();
+ } else {
+ window.requestAnimationFrame(this._boundAnimate);
+ }
+ },
+
+ _onEnterKeydown: function() {
+ this.uiDownAction();
+ this.async(this.uiUpAction, 1);
+ },
+
+ _onSpaceKeydown: function() {
+ this.uiDownAction();
+ },
+
+ _onSpaceKeyup: function() {
+ this.uiUpAction();
+ },
+
+ // note: holdDown does not respect noink since it can be a focus based
+ // effect.
+ _holdDownChanged: function(newVal, oldVal) {
+ if (oldVal === undefined) {
+ return;
+ }
+ if (newVal) {
+ this.downAction();
+ } else {
+ this.upAction();
+ }
+ }
+
+ /**
+ Fired when the animation finishes.
+ This is useful if you want to wait until
+ the ripple animation finishes to perform some action.
+
+ @event transitionend
+ @param {{node: Object}} detail Contains the animated node.
+ */
+ });
+ })();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/.bower.json
new file mode 100644
index 00000000000..5ddd498d825
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/.bower.json
@@ -0,0 +1,64 @@
+{
+ "name": "paper-styles",
+ "version": "2.1.0",
+ "description": "Common (global) styles for Material Design elements.",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-component",
+ "polymer",
+ "style"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-styles.git"
+ },
+ "main": "paper-styles.html",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/polymerelements/paper-styles/",
+ "ignore": [
+ "/.*"
+ ],
+ "dependencies": {
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "font-roboto": "PolymerElements/font-roboto#^1.0.1",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
+ "web-component-tester": "^6.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "font-roboto": "PolymerElements/font-roboto#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.1.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.0",
+ "commit": "fc4b85ab853f107fc8bb18ea6cda1c2e9ac5a75f"
+ },
+ "_source": "https://github.com/PolymerElements/paper-styles.git",
+ "_target": "1 - 2",
+ "_originalSource": "PolymerElements/paper-styles"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/README.md
new file mode 100644
index 00000000000..e8b9c6c645a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/README.md
@@ -0,0 +1,50 @@
+
+<!---
+
+This README is automatically generated from the comments in these files:
+paper-styles.html
+
+Edit those files, and our readme bot will duplicate them over here!
+Edit this file, and the bot will squash your changes :)
+
+The bot does some handling of markdown. Please file a bug if it does the wrong
+thing! https://github.com/PolymerLabs/tedium/issues
+
+-->
+
+[![Build status](https://travis-ci.org/PolymerElements/paper-styles.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-styles)
+
+_[Demo and API docs](https://elements.polymer-project.org/elements/paper-styles)_
+
+
+## &lt;paper-styles&gt;
+
+The `<paper-styles>` component provides simple ways to use Material Design CSS styles
+in your application. The following imports are available:
+
+1. [color.html](https://github.com/PolymerElements/paper-styles/blob/master/color.html):
+a complete list of the colors defined in the Material Design [palette](https://www.google.com/design/spec/style/color.html)
+
+
+1. [default-theme.html](https://github.com/PolymerElements/paper-styles/blob/master/default-theme.html): text,
+background and accent colors that match the default Material Design theme
+
+
+1. [shadow.html](https://github.com/PolymerElements/paper-styles/blob/master/shadow.html): Material Design
+[elevation](https://www.google.com/design/spec/what-is-material/elevation-shadows.html) and shadow styles
+
+
+1. [typography.html](https://github.com/PolymerElements/paper-styles/blob/master/typography.html):
+Material Design [font](http://www.google.com/design/spec/style/typography.html#typography-styles) styles and sizes
+
+
+1. [demo-pages.html](https://github.com/PolymerElements/paper-styles/blob/master/demo-pages.html): generic styles
+used in the PolymerElements demo pages
+
+
+We recommend importing each of these individual files, and using the style mixins
+available in each ones, rather than the aggregated `paper-styles.html` as a whole.
+
+## Changes in 2.0
+- removed deprecated `/deep/` styles. Files removed: `classes/shadow-layout.html`, `demo.css`.
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/bower.json
new file mode 100644
index 00000000000..2d1e3de0ddc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/bower.json
@@ -0,0 +1,55 @@
+{
+ "name": "paper-styles",
+ "version": "2.0.0",
+ "description": "Common (global) styles for Material Design elements.",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-component",
+ "polymer",
+ "style"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-styles.git"
+ },
+ "main": "paper-styles.html",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/polymerelements/paper-styles/",
+ "ignore": [
+ "/.*"
+ ],
+ "dependencies": {
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "font-roboto": "PolymerElements/font-roboto#^1.0.1",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
+ "web-component-tester": "^6.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "font-roboto": "PolymerElements/font-roboto#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/global.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/global.d.ts
new file mode 100644
index 00000000000..5639596cda3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/global.d.ts
@@ -0,0 +1,12 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * classes/global.html
+ */
+
+/// <reference path="../paper-styles-classes.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/global.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/global.html
new file mode 100644
index 00000000000..229875f3f6f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/global.html
@@ -0,0 +1,94 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../paper-styles-classes.html">
+
+<!--
+Note that this file probably doesn't do what you expect it to do. It's not
+a `<style is=custom-style include="..."` type of style include, which mean
+these styles will only apply to the main document, regardless of where
+you import this file.
+-->
+
+<style>
+/* Mixins */
+
+/* [paper-font] */
+body {
+ font-family: 'Roboto', 'Noto', sans-serif;
+ -webkit-font-smoothing: antialiased; /* OS X subpixel AA bleed bug */
+}
+
+/* [paper-font=display2] */
+h1 {
+ font-size: 45px;
+ font-weight: 400;
+ letter-spacing: -.018em;
+ line-height: 48px;
+}
+
+/* [paper-font=display1] */
+h2 {
+ font-size: 34px;
+ font-weight: 400;
+ letter-spacing: -.01em;
+ line-height: 40px;
+}
+
+/* [paper-font=headline] */
+h3 {
+ font-size: 24px;
+ font-weight: 400;
+ letter-spacing: -.012em;
+ line-height: 32px;
+}
+
+/* [paper-font=subhead] */
+h4 {
+ font-size: 16px;
+ font-weight: 400;
+ line-height: 24px;
+}
+
+/* [paper-font=body2] */
+h5, h6 {
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 24px;
+}
+
+/* [paper-font=button] */
+a {
+ font-size: 14px;
+ font-weight: 500;
+ letter-spacing: 0.018em;
+ line-height: 24px;
+ text-transform: uppercase;
+}
+
+/* Overrides */
+
+body, a {
+ color: #212121;
+}
+
+h1, h2, h3, h4, h5, h6, p {
+ margin: 0 0 20px 0;
+}
+
+h1, h2, h3, h4, h5, h6, a {
+ text-rendering: optimizeLegibility;
+}
+
+a {
+ text-decoration: none;
+}
+
+</style>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/shadow.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/shadow.d.ts
new file mode 100644
index 00000000000..7a4a394112e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/shadow.d.ts
@@ -0,0 +1,10 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * classes/shadow.html
+ */
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/shadow.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/shadow.html
new file mode 100644
index 00000000000..5ab04b14fe5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/shadow.html
@@ -0,0 +1,60 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<!--
+Note that this file probably doesn't do what you expect it to do. It's not
+a `<style is=custom-style include="..."` type of style include, which mean
+these styles will only apply to the main document, regardless of where
+you import this file.
+
+For a set of styles that can be applied to an element, check paper-styles/shadow.html.
+-->
+<style>
+.shadow-transition {
+ transition: box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.shadow-elevation-2dp {
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),
+ 0 1px 5px 0 rgba(0, 0, 0, 0.12),
+ 0 3px 1px -2px rgba(0, 0, 0, 0.2);
+}
+
+.shadow-elevation-3dp {
+ box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.14),
+ 0 1px 8px 0 rgba(0, 0, 0, 0.12),
+ 0 3px 3px -2px rgba(0, 0, 0, 0.4);
+}
+
+.shadow-elevation-4dp {
+ box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14),
+ 0 1px 10px 0 rgba(0, 0, 0, 0.12),
+ 0 2px 4px -1px rgba(0, 0, 0, 0.4);
+}
+
+.shadow-elevation-6dp {
+ box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.14),
+ 0 1px 18px 0 rgba(0, 0, 0, 0.12),
+ 0 3px 5px -1px rgba(0, 0, 0, 0.4);
+}
+
+.shadow-elevation-8dp {
+ box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14),
+ 0 3px 14px 2px rgba(0, 0, 0, 0.12),
+ 0 5px 5px -3px rgba(0, 0, 0, 0.4);
+}
+
+.shadow-elevation-16dp {
+ box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14),
+ 0 6px 30px 5px rgba(0, 0, 0, 0.12),
+ 0 8px 10px -5px rgba(0, 0, 0, 0.4);
+}
+
+</style>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/typography.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/typography.d.ts
new file mode 100644
index 00000000000..9a1d8bef616
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/typography.d.ts
@@ -0,0 +1,12 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * classes/typography.html
+ */
+
+/// <reference path="../../font-roboto/roboto.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/typography.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/typography.html
new file mode 100644
index 00000000000..5586adc46c9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/classes/typography.html
@@ -0,0 +1,164 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../font-roboto/roboto.html">
+
+<!--
+Note that this file probably doesn't do what you expect it to do. It's not
+a `<style is=custom-style include="..."` type of style include, which mean
+these styles will only apply to the main document, regardless of where
+you import this file.
+
+For a set of styles that can be applied to an element, check paper-styles/typography.html.
+-->
+<style>
+
+.paper-font-display4,
+.paper-font-display3,
+.paper-font-display2,
+.paper-font-display1,
+.paper-font-headline,
+.paper-font-title,
+.paper-font-subhead,
+.paper-font-body2,
+.paper-font-body1,
+.paper-font-caption,
+.paper-font-menu,
+.paper-font-button {
+ font-family: 'Roboto', 'Noto', sans-serif;
+ -webkit-font-smoothing: antialiased; /* OS X subpixel AA bleed bug */
+}
+
+.paper-font-code2,
+.paper-font-code1 {
+ font-family: 'Roboto Mono', 'Consolas', 'Menlo', monospace;
+ -webkit-font-smoothing: antialiased; /* OS X subpixel AA bleed bug */
+}
+
+/* Opt for better kerning for headers & other short labels. */
+.paper-font-display4,
+.paper-font-display3,
+.paper-font-display2,
+.paper-font-display1,
+.paper-font-headline,
+.paper-font-title,
+.paper-font-subhead,
+.paper-font-menu,
+.paper-font-button {
+ text-rendering: optimizeLegibility;
+}
+
+/*
+"Line wrapping only applies to Body, Subhead, Headline, and the smaller Display
+styles. All other styles should exist as single lines."
+*/
+.paper-font-display4,
+.paper-font-display3,
+.paper-font-title,
+.paper-font-caption,
+.paper-font-menu,
+.paper-font-button {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.paper-font-display4 {
+ font-size: 112px;
+ font-weight: 300;
+ letter-spacing: -.044em;
+ line-height: 120px;
+}
+
+.paper-font-display3 {
+ font-size: 56px;
+ font-weight: 400;
+ letter-spacing: -.026em;
+ line-height: 60px;
+}
+
+.paper-font-display2 {
+ font-size: 45px;
+ font-weight: 400;
+ letter-spacing: -.018em;
+ line-height: 48px;
+}
+
+.paper-font-display1 {
+ font-size: 34px;
+ font-weight: 400;
+ letter-spacing: -.01em;
+ line-height: 40px;
+}
+
+.paper-font-headline {
+ font-size: 24px;
+ font-weight: 400;
+ letter-spacing: -.012em;
+ line-height: 32px;
+}
+
+.paper-font-title {
+ font-size: 20px;
+ font-weight: 500;
+ line-height: 28px;
+}
+
+.paper-font-subhead {
+ font-size: 16px;
+ font-weight: 400;
+ line-height: 24px;
+}
+
+.paper-font-body2 {
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 24px;
+}
+
+.paper-font-body1 {
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 20px;
+}
+
+.paper-font-caption {
+ font-size: 12px;
+ font-weight: 400;
+ letter-spacing: 0.011em;
+ line-height: 20px;
+}
+
+.paper-font-menu {
+ font-size: 13px;
+ font-weight: 500;
+ line-height: 24px;
+}
+
+.paper-font-button {
+ font-size: 14px;
+ font-weight: 500;
+ letter-spacing: 0.018em;
+ line-height: 24px;
+ text-transform: uppercase;
+}
+
+.paper-font-code2 {
+ font-size: 14px;
+ font-weight: 700;
+ line-height: 20px;
+}
+
+.paper-font-code1 {
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 20px;
+}
+
+</style>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/color.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/color.d.ts
new file mode 100644
index 00000000000..2e25e740b05
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/color.d.ts
@@ -0,0 +1,12 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * color.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/color.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/color.html
new file mode 100644
index 00000000000..67eae3e27e8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/color.html
@@ -0,0 +1,334 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<custom-style>
+ <style is="custom-style">
+ html {
+
+ /* Material Design color palette for Google products */
+
+ --google-red-100: #f4c7c3;
+ --google-red-300: #e67c73;
+ --google-red-500: #db4437;
+ --google-red-700: #c53929;
+
+ --google-blue-100: #c6dafc;
+ --google-blue-300: #7baaf7;
+ --google-blue-500: #4285f4;
+ --google-blue-700: #3367d6;
+
+ --google-green-100: #b7e1cd;
+ --google-green-300: #57bb8a;
+ --google-green-500: #0f9d58;
+ --google-green-700: #0b8043;
+
+ --google-yellow-100: #fce8b2;
+ --google-yellow-300: #f7cb4d;
+ --google-yellow-500: #f4b400;
+ --google-yellow-700: #f09300;
+
+ --google-grey-100: #f5f5f5;
+ --google-grey-300: #e0e0e0;
+ --google-grey-500: #9e9e9e;
+ --google-grey-700: #616161;
+
+ /* Material Design color palette from online spec document */
+
+ --paper-red-50: #ffebee;
+ --paper-red-100: #ffcdd2;
+ --paper-red-200: #ef9a9a;
+ --paper-red-300: #e57373;
+ --paper-red-400: #ef5350;
+ --paper-red-500: #f44336;
+ --paper-red-600: #e53935;
+ --paper-red-700: #d32f2f;
+ --paper-red-800: #c62828;
+ --paper-red-900: #b71c1c;
+ --paper-red-a100: #ff8a80;
+ --paper-red-a200: #ff5252;
+ --paper-red-a400: #ff1744;
+ --paper-red-a700: #d50000;
+
+ --paper-pink-50: #fce4ec;
+ --paper-pink-100: #f8bbd0;
+ --paper-pink-200: #f48fb1;
+ --paper-pink-300: #f06292;
+ --paper-pink-400: #ec407a;
+ --paper-pink-500: #e91e63;
+ --paper-pink-600: #d81b60;
+ --paper-pink-700: #c2185b;
+ --paper-pink-800: #ad1457;
+ --paper-pink-900: #880e4f;
+ --paper-pink-a100: #ff80ab;
+ --paper-pink-a200: #ff4081;
+ --paper-pink-a400: #f50057;
+ --paper-pink-a700: #c51162;
+
+ --paper-purple-50: #f3e5f5;
+ --paper-purple-100: #e1bee7;
+ --paper-purple-200: #ce93d8;
+ --paper-purple-300: #ba68c8;
+ --paper-purple-400: #ab47bc;
+ --paper-purple-500: #9c27b0;
+ --paper-purple-600: #8e24aa;
+ --paper-purple-700: #7b1fa2;
+ --paper-purple-800: #6a1b9a;
+ --paper-purple-900: #4a148c;
+ --paper-purple-a100: #ea80fc;
+ --paper-purple-a200: #e040fb;
+ --paper-purple-a400: #d500f9;
+ --paper-purple-a700: #aa00ff;
+
+ --paper-deep-purple-50: #ede7f6;
+ --paper-deep-purple-100: #d1c4e9;
+ --paper-deep-purple-200: #b39ddb;
+ --paper-deep-purple-300: #9575cd;
+ --paper-deep-purple-400: #7e57c2;
+ --paper-deep-purple-500: #673ab7;
+ --paper-deep-purple-600: #5e35b1;
+ --paper-deep-purple-700: #512da8;
+ --paper-deep-purple-800: #4527a0;
+ --paper-deep-purple-900: #311b92;
+ --paper-deep-purple-a100: #b388ff;
+ --paper-deep-purple-a200: #7c4dff;
+ --paper-deep-purple-a400: #651fff;
+ --paper-deep-purple-a700: #6200ea;
+
+ --paper-indigo-50: #e8eaf6;
+ --paper-indigo-100: #c5cae9;
+ --paper-indigo-200: #9fa8da;
+ --paper-indigo-300: #7986cb;
+ --paper-indigo-400: #5c6bc0;
+ --paper-indigo-500: #3f51b5;
+ --paper-indigo-600: #3949ab;
+ --paper-indigo-700: #303f9f;
+ --paper-indigo-800: #283593;
+ --paper-indigo-900: #1a237e;
+ --paper-indigo-a100: #8c9eff;
+ --paper-indigo-a200: #536dfe;
+ --paper-indigo-a400: #3d5afe;
+ --paper-indigo-a700: #304ffe;
+
+ --paper-blue-50: #e3f2fd;
+ --paper-blue-100: #bbdefb;
+ --paper-blue-200: #90caf9;
+ --paper-blue-300: #64b5f6;
+ --paper-blue-400: #42a5f5;
+ --paper-blue-500: #2196f3;
+ --paper-blue-600: #1e88e5;
+ --paper-blue-700: #1976d2;
+ --paper-blue-800: #1565c0;
+ --paper-blue-900: #0d47a1;
+ --paper-blue-a100: #82b1ff;
+ --paper-blue-a200: #448aff;
+ --paper-blue-a400: #2979ff;
+ --paper-blue-a700: #2962ff;
+
+ --paper-light-blue-50: #e1f5fe;
+ --paper-light-blue-100: #b3e5fc;
+ --paper-light-blue-200: #81d4fa;
+ --paper-light-blue-300: #4fc3f7;
+ --paper-light-blue-400: #29b6f6;
+ --paper-light-blue-500: #03a9f4;
+ --paper-light-blue-600: #039be5;
+ --paper-light-blue-700: #0288d1;
+ --paper-light-blue-800: #0277bd;
+ --paper-light-blue-900: #01579b;
+ --paper-light-blue-a100: #80d8ff;
+ --paper-light-blue-a200: #40c4ff;
+ --paper-light-blue-a400: #00b0ff;
+ --paper-light-blue-a700: #0091ea;
+
+ --paper-cyan-50: #e0f7fa;
+ --paper-cyan-100: #b2ebf2;
+ --paper-cyan-200: #80deea;
+ --paper-cyan-300: #4dd0e1;
+ --paper-cyan-400: #26c6da;
+ --paper-cyan-500: #00bcd4;
+ --paper-cyan-600: #00acc1;
+ --paper-cyan-700: #0097a7;
+ --paper-cyan-800: #00838f;
+ --paper-cyan-900: #006064;
+ --paper-cyan-a100: #84ffff;
+ --paper-cyan-a200: #18ffff;
+ --paper-cyan-a400: #00e5ff;
+ --paper-cyan-a700: #00b8d4;
+
+ --paper-teal-50: #e0f2f1;
+ --paper-teal-100: #b2dfdb;
+ --paper-teal-200: #80cbc4;
+ --paper-teal-300: #4db6ac;
+ --paper-teal-400: #26a69a;
+ --paper-teal-500: #009688;
+ --paper-teal-600: #00897b;
+ --paper-teal-700: #00796b;
+ --paper-teal-800: #00695c;
+ --paper-teal-900: #004d40;
+ --paper-teal-a100: #a7ffeb;
+ --paper-teal-a200: #64ffda;
+ --paper-teal-a400: #1de9b6;
+ --paper-teal-a700: #00bfa5;
+
+ --paper-green-50: #e8f5e9;
+ --paper-green-100: #c8e6c9;
+ --paper-green-200: #a5d6a7;
+ --paper-green-300: #81c784;
+ --paper-green-400: #66bb6a;
+ --paper-green-500: #4caf50;
+ --paper-green-600: #43a047;
+ --paper-green-700: #388e3c;
+ --paper-green-800: #2e7d32;
+ --paper-green-900: #1b5e20;
+ --paper-green-a100: #b9f6ca;
+ --paper-green-a200: #69f0ae;
+ --paper-green-a400: #00e676;
+ --paper-green-a700: #00c853;
+
+ --paper-light-green-50: #f1f8e9;
+ --paper-light-green-100: #dcedc8;
+ --paper-light-green-200: #c5e1a5;
+ --paper-light-green-300: #aed581;
+ --paper-light-green-400: #9ccc65;
+ --paper-light-green-500: #8bc34a;
+ --paper-light-green-600: #7cb342;
+ --paper-light-green-700: #689f38;
+ --paper-light-green-800: #558b2f;
+ --paper-light-green-900: #33691e;
+ --paper-light-green-a100: #ccff90;
+ --paper-light-green-a200: #b2ff59;
+ --paper-light-green-a400: #76ff03;
+ --paper-light-green-a700: #64dd17;
+
+ --paper-lime-50: #f9fbe7;
+ --paper-lime-100: #f0f4c3;
+ --paper-lime-200: #e6ee9c;
+ --paper-lime-300: #dce775;
+ --paper-lime-400: #d4e157;
+ --paper-lime-500: #cddc39;
+ --paper-lime-600: #c0ca33;
+ --paper-lime-700: #afb42b;
+ --paper-lime-800: #9e9d24;
+ --paper-lime-900: #827717;
+ --paper-lime-a100: #f4ff81;
+ --paper-lime-a200: #eeff41;
+ --paper-lime-a400: #c6ff00;
+ --paper-lime-a700: #aeea00;
+
+ --paper-yellow-50: #fffde7;
+ --paper-yellow-100: #fff9c4;
+ --paper-yellow-200: #fff59d;
+ --paper-yellow-300: #fff176;
+ --paper-yellow-400: #ffee58;
+ --paper-yellow-500: #ffeb3b;
+ --paper-yellow-600: #fdd835;
+ --paper-yellow-700: #fbc02d;
+ --paper-yellow-800: #f9a825;
+ --paper-yellow-900: #f57f17;
+ --paper-yellow-a100: #ffff8d;
+ --paper-yellow-a200: #ffff00;
+ --paper-yellow-a400: #ffea00;
+ --paper-yellow-a700: #ffd600;
+
+ --paper-amber-50: #fff8e1;
+ --paper-amber-100: #ffecb3;
+ --paper-amber-200: #ffe082;
+ --paper-amber-300: #ffd54f;
+ --paper-amber-400: #ffca28;
+ --paper-amber-500: #ffc107;
+ --paper-amber-600: #ffb300;
+ --paper-amber-700: #ffa000;
+ --paper-amber-800: #ff8f00;
+ --paper-amber-900: #ff6f00;
+ --paper-amber-a100: #ffe57f;
+ --paper-amber-a200: #ffd740;
+ --paper-amber-a400: #ffc400;
+ --paper-amber-a700: #ffab00;
+
+ --paper-orange-50: #fff3e0;
+ --paper-orange-100: #ffe0b2;
+ --paper-orange-200: #ffcc80;
+ --paper-orange-300: #ffb74d;
+ --paper-orange-400: #ffa726;
+ --paper-orange-500: #ff9800;
+ --paper-orange-600: #fb8c00;
+ --paper-orange-700: #f57c00;
+ --paper-orange-800: #ef6c00;
+ --paper-orange-900: #e65100;
+ --paper-orange-a100: #ffd180;
+ --paper-orange-a200: #ffab40;
+ --paper-orange-a400: #ff9100;
+ --paper-orange-a700: #ff6500;
+
+ --paper-deep-orange-50: #fbe9e7;
+ --paper-deep-orange-100: #ffccbc;
+ --paper-deep-orange-200: #ffab91;
+ --paper-deep-orange-300: #ff8a65;
+ --paper-deep-orange-400: #ff7043;
+ --paper-deep-orange-500: #ff5722;
+ --paper-deep-orange-600: #f4511e;
+ --paper-deep-orange-700: #e64a19;
+ --paper-deep-orange-800: #d84315;
+ --paper-deep-orange-900: #bf360c;
+ --paper-deep-orange-a100: #ff9e80;
+ --paper-deep-orange-a200: #ff6e40;
+ --paper-deep-orange-a400: #ff3d00;
+ --paper-deep-orange-a700: #dd2c00;
+
+ --paper-brown-50: #efebe9;
+ --paper-brown-100: #d7ccc8;
+ --paper-brown-200: #bcaaa4;
+ --paper-brown-300: #a1887f;
+ --paper-brown-400: #8d6e63;
+ --paper-brown-500: #795548;
+ --paper-brown-600: #6d4c41;
+ --paper-brown-700: #5d4037;
+ --paper-brown-800: #4e342e;
+ --paper-brown-900: #3e2723;
+
+ --paper-grey-50: #fafafa;
+ --paper-grey-100: #f5f5f5;
+ --paper-grey-200: #eeeeee;
+ --paper-grey-300: #e0e0e0;
+ --paper-grey-400: #bdbdbd;
+ --paper-grey-500: #9e9e9e;
+ --paper-grey-600: #757575;
+ --paper-grey-700: #616161;
+ --paper-grey-800: #424242;
+ --paper-grey-900: #212121;
+
+ --paper-blue-grey-50: #eceff1;
+ --paper-blue-grey-100: #cfd8dc;
+ --paper-blue-grey-200: #b0bec5;
+ --paper-blue-grey-300: #90a4ae;
+ --paper-blue-grey-400: #78909c;
+ --paper-blue-grey-500: #607d8b;
+ --paper-blue-grey-600: #546e7a;
+ --paper-blue-grey-700: #455a64;
+ --paper-blue-grey-800: #37474f;
+ --paper-blue-grey-900: #263238;
+
+ /* opacity for dark text on a light background */
+ --dark-divider-opacity: 0.12;
+ --dark-disabled-opacity: 0.38; /* or hint text or icon */
+ --dark-secondary-opacity: 0.54;
+ --dark-primary-opacity: 0.87;
+
+ /* opacity for light text on a dark background */
+ --light-divider-opacity: 0.12;
+ --light-disabled-opacity: 0.3; /* or hint text or icon */
+ --light-secondary-opacity: 0.7;
+ --light-primary-opacity: 1.0;
+
+ }
+
+ </style>
+</custom-style>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/default-theme.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/default-theme.d.ts
new file mode 100644
index 00000000000..2833b80c6b8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/default-theme.d.ts
@@ -0,0 +1,13 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * default-theme.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="color.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/default-theme.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/default-theme.html
new file mode 100644
index 00000000000..8242076e26a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/default-theme.html
@@ -0,0 +1,71 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="color.html">
+
+<!-- Taken from https://www.google.com/design/spec/style/color.html#color-ui-color-application -->
+
+<custom-style>
+ <style is="custom-style">
+ html {
+ /*
+ * You can use these generic variables in your elements for easy theming.
+ * For example, if all your elements use `--primary-text-color` as its main
+ * color, then switching from a light to a dark theme is just a matter of
+ * changing the value of `--primary-text-color` in your application.
+ */
+ --primary-text-color: var(--light-theme-text-color);
+ --primary-background-color: var(--light-theme-background-color);
+ --secondary-text-color: var(--light-theme-secondary-color);
+ --disabled-text-color: var(--light-theme-disabled-color);
+ --divider-color: var(--light-theme-divider-color);
+ --error-color: var(--paper-deep-orange-a700);
+
+ /*
+ * Primary and accent colors. Also see color.html for more colors.
+ */
+ --primary-color: var(--paper-indigo-500);
+ --light-primary-color: var(--paper-indigo-100);
+ --dark-primary-color: var(--paper-indigo-700);
+
+ --accent-color: var(--paper-pink-a200);
+ --light-accent-color: var(--paper-pink-a100);
+ --dark-accent-color: var(--paper-pink-a400);
+
+
+ /*
+ * Material Design Light background theme
+ */
+ --light-theme-background-color: #ffffff;
+ --light-theme-base-color: #000000;
+ --light-theme-text-color: var(--paper-grey-900);
+ --light-theme-secondary-color: #737373; /* for secondary text and icons */
+ --light-theme-disabled-color: #9b9b9b; /* disabled/hint text */
+ --light-theme-divider-color: #dbdbdb;
+
+ /*
+ * Material Design Dark background theme
+ */
+ --dark-theme-background-color: var(--paper-grey-900);
+ --dark-theme-base-color: #ffffff;
+ --dark-theme-text-color: #ffffff;
+ --dark-theme-secondary-color: #bcbcbc; /* for secondary text and icons */
+ --dark-theme-disabled-color: #646464; /* disabled/hint text */
+ --dark-theme-divider-color: #3c3c3c;
+
+ /*
+ * Deprecated values because of their confusing names.
+ */
+ --text-primary-color: var(--dark-theme-text-color);
+ --default-primary-color: var(--primary-color);
+ }
+ </style>
+</custom-style>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/demo-pages.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/demo-pages.d.ts
new file mode 100644
index 00000000000..6e3790db39b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/demo-pages.d.ts
@@ -0,0 +1,16 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * demo-pages.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-flex-layout/iron-flex-layout.d.ts" />
+/// <reference path="color.d.ts" />
+/// <reference path="typography.d.ts" />
+/// <reference path="shadow.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/demo-pages.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/demo-pages.html
new file mode 100644
index 00000000000..4e5e0c72a9b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/demo-pages.html
@@ -0,0 +1,80 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="color.html">
+<link rel="import" href="typography.html">
+<link rel="import" href="shadow.html">
+
+<!--
+Note that this file probably doesn't do what you expect it to do. It's not
+a `<style is=custom-style include="..."` type of style include, which mean
+these styles will only apply to the main document, regardless of where
+you import this file.
+
+For a set of styles that can be applied to an element,
+check iron-demo-helpers/demo-pages-shared-styles.html.
+-->
+<custom-style>
+ <style is="custom-style">
+ body {
+ @apply --paper-font-common-base;
+ font-size: 14px;
+ margin: 0;
+ padding: 24px;
+ background-color: var(--paper-grey-50);
+ }
+
+ .horizontal-section-container {
+ @apply --layout-horizontal;
+ @apply --layout-center-justified;
+ @apply --layout-wrap;
+ }
+
+ .vertical-section-container {
+ @apply --layout-vertical;
+ @apply --center-justified;
+ }
+
+ .horizontal-section {
+ background-color: white;
+ padding: 24px;
+ margin-right: 24px;
+ min-width: 200px;
+
+ @apply --shadow-elevation-2dp;
+ }
+
+ .vertical-section {
+ background-color: white;
+ padding: 24px;
+ margin: 0 24px 24px 24px;
+
+ @apply --shadow-elevation-2dp;
+ }
+
+ .centered {
+ max-width: 400px;
+ margin-left: auto;
+ margin-right: auto;
+ }
+
+ code {
+ color: var(--google-grey-700);
+ }
+
+ /* TODO: remove this hack and use horizontal-section-container instead */
+ body > div.layout.horizontal.center-justified {
+ @apply --layout-wrap;
+ }
+ </style>
+</custom-style>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/demo/index.html
new file mode 100644
index 00000000000..b97ff9309f5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/demo/index.html
@@ -0,0 +1,232 @@
+<!doctype html>
+
+<!--
+ @license
+ Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ Code distributed by Google as part of the polymer project is also
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<html>
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+
+ <title>paper-styles demo</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../color.html">
+ <link rel="import" href="../shadow.html">
+ <link rel="import" href="../typography.html">
+ <link rel="import" href="../default-theme.html">
+ <link rel="import" href="../element-styles/paper-item-styles.html">
+ <link rel="import" href="../element-styles/paper-material-styles.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ </head>
+
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles">
+ .redlines {
+ background: linear-gradient(0deg, transparent, transparent 3.5px, rgba(255,0,0,0.2) 3.5px, rgba(255,0,0,0.2) 4px);
+ background-size: 100% 4px;
+ }
+ </style>
+ </custom-style>
+
+ <body unresolved>
+ <div class="vertical-section-container centered">
+ <h4>typography.html</h4>
+ <demo-snippet>
+ <template>
+ <div class="redlines">
+ <div class="paper-font-display4">Display 4</div>
+ <div class="paper-font-display3">Display 3</div>
+ <div class="paper-font-display2">Display 2</div>
+ <div class="paper-font-display1">Display 1</div>
+ <div class="paper-font-headline">Headline</div>
+ <div class="paper-font-title">Title</div>
+ <div class="paper-font-subhead">Subhead</div>
+ <div class="paper-font-body2">Body 2</div>
+ <div class="paper-font-body1">Body 1</div>
+ <div class="paper-font-caption">Caption</div>
+ <div class="paper-font-menu">Menu</div>
+ <div class="paper-font-button">Button</div>
+ </div>
+
+ <p class="redlines paper-font-body1">
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi
+ tincidunt dui sit amet mi auctor, ac gravida magna aliquam. Fusce quis
+ purus elementum, tempus nisi vel, volutpat nulla. Vestibulum mollis
+ dictum tellus, vulputate porttitor arcu. Curabitur imperdiet risus id
+ egestas accumsan. Donec lectus felis, dignissim id iaculis sit amet,
+ faucibus in leo.
+ </p>
+
+ <p class="redlines paper-font-body2">
+ Mauris id urna ac ante ultrices commodo a imperdiet elit. Vivamus
+ interdum neque magna, eget dapibus est auctor et. Donec accumsan
+ libero nec augue scelerisque, ac egestas ante tincidunt. Proin
+ sollicitudin, mi eget sagittis mollis, arcu orci scelerisque turpis, a
+ sollicitudin tellus quam non sapien.
+ </p>
+
+ <custom-style>
+ <style is="custom-style">
+ .paper-font-display4 { @apply --paper-font-display4; }
+ .paper-font-display3 { @apply --paper-font-display3; }
+ .paper-font-display2 { @apply --paper-font-display2; }
+ .paper-font-display1 { @apply --paper-font-display1; }
+ .paper-font-headline { @apply --paper-font-headline; }
+ .paper-font-title { @apply --paper-font-title; }
+ .paper-font-subhead { @apply --paper-font-subhead; }
+ .paper-font-body2 { @apply --paper-font-body2; }
+ .paper-font-body1 { @apply --paper-font-body1; }
+ .paper-font-caption { @apply --paper-font-caption; }
+ .paper-font-menu { @apply --paper-font-menu; }
+ .paper-font-button { @apply --paper-font-button; }
+ </style>
+ </custom-style>
+ </template>
+ </demo-snippet>
+
+ <h4>shadow.html</h4>
+ <demo-snippet>
+ <template>
+ <div class="shadow shadow-2dp">2dp</div>
+ <div class="shadow shadow-3dp">3dp</div>
+ <div class="shadow shadow-4dp">4dp</div>
+ <div class="shadow shadow-6dp">6dp</div>
+ <div class="shadow shadow-8dp">8dp</div>
+ <div class="shadow shadow-12dp">12dp</div>
+ <div class="shadow shadow-16dp">16dp</div>
+
+ <custom-style>
+ <style is="custom-style">
+ .shadow-2dp { @apply --shadow-elevation-2dp; }
+ .shadow-3dp { @apply --shadow-elevation-3dp; }
+ .shadow-4dp { @apply --shadow-elevation-4dp; }
+ .shadow-6dp { @apply --shadow-elevation-6dp; }
+ .shadow-8dp { @apply --shadow-elevation-8dp; }
+ .shadow-12dp { @apply --shadow-elevation-12dp; }
+ .shadow-16dp { @apply --shadow-elevation-16dp; }
+ .shadow {
+ display: inline-block;
+ padding: 8px;
+ margin: 16px;
+ height: 50px;
+ width: 50px;
+ }
+ </style>
+ </custom-style>
+ </template>
+ </demo-snippet>
+
+ <h4>default-theme.html</h4>
+ <demo-snippet>
+ <template>
+ <div>
+ <div class="toolbar">Title</div>
+ <div class="item">
+ <div class="fab">+</div>
+ <div class="primary">Primary text</div>
+ <div class="secondary">Secondary text</div>
+ </div>
+ <div class="disabled-item">Disabled</div>
+ </div>
+
+ <custom-style>
+ <style is="custom-style">
+ .toolbar {
+ height: 144px;
+ padding: 16px;
+ background: var(--default-primary-color);
+ color: var(--text-primary-color);
+ @apply --paper-font-display1;
+ }
+
+ .item, .disabled-item {
+ position: relative;
+ padding: 8px;
+ border: 1px solid;
+ border-color: var(--divider-color);
+ border-top: 0;
+ }
+
+ .item .primary {
+ color: var(--primary-text-color);
+ @apply --paper-font-body2;
+ }
+
+ .item .secondary {
+ color: var(--secondary-text-color);
+ @apply --paper-font-body1;
+ }
+
+ .disabled-item {
+ color: var(--disabled-text-color);
+ @apply --paper-font-body2;
+ }
+
+ .fab {
+ position: absolute;
+ box-sizing: border-box;
+ padding: 8px;
+ width: 56px;
+ height: 56px;
+ right: 16px;
+ top: -28px;
+ border-radius: 50%;
+ text-align: center;
+
+ background: var(--accent-color);
+ color: var(--text-primary-color);
+ @apply --paper-font-display1;
+ }
+ </style>
+ </custom-style>
+ </template>
+ </demo-snippet>
+
+ <h4>Element shared styles: paper-material</h4>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style" include="paper-material-styles">
+ .paper-material {
+ padding: 16px;
+ margin: 0 16px;
+ display: inline-block;
+ }
+ </style>
+ </custom-style>
+
+ <div class="paper-material" elevation="1">1</div>
+ <div class="paper-material" elevation="2">2</div>
+ <div class="paper-material" elevation="3">3</div>
+ <div class="paper-material" elevation="4">4</div>
+ <div class="paper-material" elevation="5">5</div>
+ </template>
+ </demo-snippet>
+
+ <h4>Element shared styles: paper-item</h4>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style" include="paper-item-styles"></style>
+ </custom-style>
+
+ <button class="paper-item" role="option">Inbox</button>
+ <button class="paper-item" role="option">Starred</button>
+ <button class="paper-item" role="option">Sent mail</button>
+ </template>
+ </demo-snippet>
+
+ </div>
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/element-styles/paper-item-styles.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/element-styles/paper-item-styles.d.ts
new file mode 100644
index 00000000000..08f62109ea3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/element-styles/paper-item-styles.d.ts
@@ -0,0 +1,15 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * element-styles/paper-item-styles.html
+ */
+
+/// <reference path="../../polymer/types/polymer.d.ts" />
+/// <reference path="../color.d.ts" />
+/// <reference path="../default-theme.d.ts" />
+/// <reference path="../typography.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/element-styles/paper-item-styles.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/element-styles/paper-item-styles.html
new file mode 100644
index 00000000000..7c539d2e481
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/element-styles/paper-item-styles.html
@@ -0,0 +1,91 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../color.html">
+<link rel="import" href="../default-theme.html">
+<link rel="import" href="../typography.html">
+
+<!--
+Material design: [Lists](https://www.google.com/design/spec/components/lists.html)
+
+Shared styles for a native `button` to be used as an item in a `paper-listbox` element:
+
+ <custom-style>
+ <style is="custom-style" include="paper-item-styles"></style>
+ </custom-style>
+
+ <paper-listbox>
+ <button class="paper-item" role="option">Inbox</button>
+ <button class="paper-item" role="option">Starred</button>
+ <button class="paper-item" role="option">Sent mail</button>
+ </paper-listbox>
+
+@group Paper Elements
+@demo demo/index.html
+-->
+
+<dom-module id="paper-item-styles">
+ <template>
+ <style>
+ :host, html {
+ --paper-item: {
+ display: block;
+ position: relative;
+ min-height: var(--paper-item-min-height, 48px);
+ padding: 0px 16px;
+ @apply --paper-font-subhead;
+ border:none;
+ outline: none;
+ background: white;
+ width: 100%;
+ text-align: left;
+ };
+ }
+
+ .paper-item {
+ @apply --paper-item;
+ }
+
+ .paper-item[hidden] {
+ display: none !important;
+ }
+
+ .paper-item.iron-selected {
+ font-weight: var(--paper-item-selected-weight, bold);
+ @apply --paper-item-selected;
+ }
+
+ .paper-item[disabled] {
+ color: var(--paper-item-disabled-color, var(--disabled-text-color));
+ @apply --paper-item-disabled;
+ }
+
+ .paper-item:focus {
+ position: relative;
+ outline: 0;
+ @apply --paper-item-focused;
+ }
+
+ .paper-item:focus:before {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: currentColor;
+ content: '';
+ opacity: var(--dark-divider-opacity);
+ pointer-events: none;
+ @apply --paper-item-focused-before;
+ }
+ </style>
+ </template>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/element-styles/paper-material-styles.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/element-styles/paper-material-styles.d.ts
new file mode 100644
index 00000000000..1c190dd2bb1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/element-styles/paper-material-styles.d.ts
@@ -0,0 +1,13 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * element-styles/paper-material-styles.html
+ */
+
+/// <reference path="../../polymer/types/polymer.d.ts" />
+/// <reference path="../shadow.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/element-styles/paper-material-styles.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/element-styles/paper-material-styles.html
new file mode 100644
index 00000000000..8f5f63704f9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/element-styles/paper-material-styles.html
@@ -0,0 +1,78 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../shadow.html">
+
+<!--
+Material design: [Cards](https://www.google.com/design/spec/components/cards.html)
+
+Shared styles that you can apply to an element to renders two shadows on top
+of each other,that create the effect of a lifted piece of paper.
+
+Example:
+
+ <custom-style>
+ <style is="custom-style" include="paper-material-styles"></style>
+ </custom-style>
+
+ <div class="paper-material" elevation="1">
+ ... content ...
+ </div>
+
+@group Paper Elements
+@demo demo/index.html
+-->
+
+<dom-module id="paper-material-styles">
+ <template>
+ <style>
+ :host, html {
+ --paper-material: {
+ display: block;
+ position: relative;
+ };
+ --paper-material-elevation-1: {
+ @apply --shadow-elevation-2dp;
+ };
+ --paper-material-elevation-2: {
+ @apply --shadow-elevation-4dp;
+ };
+ --paper-material-elevation-3: {
+ @apply --shadow-elevation-6dp;
+ };
+ --paper-material-elevation-4: {
+ @apply --shadow-elevation-8dp;
+ };
+ --paper-material-elevation-5: {
+ @apply --shadow-elevation-16dp;
+ };
+ }
+ :host(.paper-material), .paper-material {
+ @apply --paper-material;
+ }
+ :host(.paper-material[elevation="1"]), .paper-material[elevation="1"] {
+ @apply --paper-material-elevation-1;
+ }
+ :host(.paper-material[elevation="2"]), .paper-material[elevation="2"] {
+ @apply --paper-material-elevation-2;
+ }
+ :host(.paper-material[elevation="3"]), .paper-material[elevation="3"] {
+ @apply --paper-material-elevation-3;
+ }
+ :host(.paper-material[elevation="4"]), .paper-material[elevation="4"] {
+ @apply --paper-material-elevation-4;
+ }
+ :host(.paper-material[elevation="5"]), .paper-material[elevation="5"] {
+ @apply --paper-material-elevation-5;
+ }
+ </style>
+ </template>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/gen-tsd.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/gen-tsd.json
new file mode 100644
index 00000000000..f6d8c975068
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/gen-tsd.json
@@ -0,0 +1,5 @@
+{
+ "excludeIdentifiers": [
+ "paper-styles"
+ ]
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/index.html
new file mode 100644
index 00000000000..8e96ebe00c0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/index.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <title>paper-styles</title>
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/package-lock.json
new file mode 100644
index 00000000000..be61cfe4a26
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/package-lock.json
@@ -0,0 +1,984 @@
+{
+ "name": "@polymer/paper-styles",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.1.1.tgz",
+ "integrity": "sha512-rUfH6USpiPYSHl2dC+/rGb3RYK8LPyqNhiuZCLv13F0fhYr01jdTogGuSphEoSLklm1gKRsDsrfZq7OvpzPYEg==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.0",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.1",
+ "command-line-usage": "4.1.0",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.0",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.10"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz",
+ "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.0"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.0"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.0.tgz",
+ "integrity": "sha512-zkYho6/4wZyX6o9UQ8rd0ReEaiEYNNCqYFIAACe2Tf9DrYlgzWW27OigYHnnztnnZQwVRpwWmZKegFmDpinIsA==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.0"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.7.tgz",
+ "integrity": "sha512-jNhbkxPtt9xbzvihfA0OavjJbpCIyTDSmwE03BVXgCKcz9lwNsq4cg2wsNkY4Av5eH35ttBArhYtVJa6CIrg2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.0"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.0.0.tgz",
+ "integrity": "sha512-v+0wW9Wezwsyb0uF4aBVCjmSqit3Ru7PZFziGF0o2KwTvN2zWfTi3BRLq9EkJFdg3eBbyERXGTntVpBxH1J68Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.2",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
+ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.1.tgz",
+ "integrity": "sha512-gRJDcIjFSzMcmG/GrJlgL0wWoAxr11mVzCq32bjka0endupm9meLwvoJUKc4HDeFiEIB2X3GvNrhF5cKO4Bd4A==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
+ "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "4.0.0",
+ "array-back": "2.0.0",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz",
+ "integrity": "sha1-+CBJdb0NrLvltYqKk//B/tD/zSo=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "6.0.96",
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "2.2.3"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.96",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.96.tgz",
+ "integrity": "sha512-fsOOY6tMQ3jCB2wD51XFDmmpgm4wVKkJECdcVRqapbJEa7awJDcr+SaH8toz+4r4KW8YQ3M7ybXMoSDo1QGewA==",
+ "dev": true
+ }
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz",
+ "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.5.7"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.8"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz",
+ "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.7",
+ "winston": "2.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.10",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.10.tgz",
+ "integrity": "sha1-9vCd15PdL0IomsAdoCb8q6ZfGYw=",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.96",
+ "@types/parse5": "2.2.34",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "2.3.0",
+ "indent": "0.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "2.2.3",
+ "polymer-project-config": "3.8.1",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.1"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.96",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.96.tgz",
+ "integrity": "sha512-fsOOY6tMQ3jCB2wD51XFDmmpgm4wVKkJECdcVRqapbJEa7awJDcr+SaH8toz+4r4KW8YQ3M7ybXMoSDo1QGewA==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.8.1.tgz",
+ "integrity": "sha512-MLvnM9gexFWg7nynY24eHZG6NLXocmk718sVds/sx2CAJ6iihhC0JMhhOIa6jnad9KQrHyGl/cs3mMRaaub5Fg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.96",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.96",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.96.tgz",
+ "integrity": "sha512-fsOOY6tMQ3jCB2wD51XFDmmpgm4wVKkJECdcVRqapbJEa7awJDcr+SaH8toz+4r4KW8YQ3M7ybXMoSDo1QGewA==",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.1.tgz",
+ "integrity": "sha1-Eahr7+rDxKo+wIYjZRo8gabQu8g=",
+ "dev": true
+ },
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/package.json
new file mode 100644
index 00000000000..569754043d9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@polymer/paper-styles",
+ "private": true,
+ "description": "Common (global) styles for Material Design elements.",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-styles.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.1.1",
+ "bower": "^1.8.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir ."
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/paper-styles-classes.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/paper-styles-classes.d.ts
new file mode 100644
index 00000000000..21ab1e8213f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/paper-styles-classes.d.ts
@@ -0,0 +1,13 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-styles-classes.html
+ */
+
+/// <reference path="classes/typography.d.ts" />
+/// <reference path="classes/shadow.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/paper-styles-classes.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/paper-styles-classes.html
new file mode 100644
index 00000000000..9fe0fd0d90e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/paper-styles-classes.html
@@ -0,0 +1,22 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<!--
+Note that these files probably don't do what you expect them to do. None have
+a `<style is=custom-style include="..."` type of style include, which mean
+these styles will only apply to the main document, regardless of where
+you import this file.
+
+For a set of styles that can be applied to an element,
+check paper-styles.html.
+-->
+
+<link rel="import" href="classes/typography.html">
+<link rel="import" href="classes/shadow.html">
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/paper-styles.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/paper-styles.d.ts
new file mode 100644
index 00000000000..bd5e60a1304
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/paper-styles.d.ts
@@ -0,0 +1,16 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-styles.html
+ */
+
+/// <reference path="../iron-flex-layout/iron-flex-layout.d.ts" />
+/// <reference path="color.d.ts" />
+/// <reference path="default-theme.d.ts" />
+/// <reference path="shadow.d.ts" />
+/// <reference path="typography.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/paper-styles.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/paper-styles.html
new file mode 100644
index 00000000000..1a4aca1370d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/paper-styles.html
@@ -0,0 +1,42 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<!--
+The `<paper-styles>` component provides simple ways to use Material Design CSS styles
+in your application. The following imports are available:
+
+1. [color.html](https://github.com/PolymerElements/paper-styles/blob/master/color.html):
+a complete list of the colors defined in the Material Design [palette](https://www.google.com/design/spec/style/color.html)
+
+2. [default-theme.html](https://github.com/PolymerElements/paper-styles/blob/master/default-theme.html): text,
+background and accent colors that match the default Material Design theme
+
+3. [shadow.html](https://github.com/PolymerElements/paper-styles/blob/master/shadow.html): Material Design
+[elevation](https://www.google.com/design/spec/what-is-material/elevation-shadows.html) and shadow styles
+
+4. [typography.html](https://github.com/PolymerElements/paper-styles/blob/master/typography.html):
+Material Design [font](http://www.google.com/design/spec/style/typography.html#typography-styles) styles and sizes
+
+5. [demo-pages.html](https://github.com/PolymerElements/paper-styles/blob/master/demo-pages.html): generic styles
+used in the PolymerElements demo pages
+
+We recommend importing each of these individual files, and using the style mixins
+available in each ones, rather than the aggregated `paper-styles.html` as a whole.
+
+@group Paper Elements
+@pseudoElement paper-styles
+@demo demo/index.html
+-->
+
+<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="color.html">
+<link rel="import" href="default-theme.html">
+<link rel="import" href="shadow.html">
+<link rel="import" href="typography.html">
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/shadow.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/shadow.d.ts
new file mode 100644
index 00000000000..0add44f9a84
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/shadow.d.ts
@@ -0,0 +1,12 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * shadow.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/shadow.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/shadow.html
new file mode 100644
index 00000000000..0e4e3cb4318
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/shadow.html
@@ -0,0 +1,76 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<custom-style>
+ <style is="custom-style">
+ html {
+
+ --shadow-transition: {
+ transition: box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1);
+ };
+
+ --shadow-none: {
+ box-shadow: none;
+ };
+
+ /* from http://codepen.io/shyndman/pen/c5394ddf2e8b2a5c9185904b57421cdb */
+
+ --shadow-elevation-2dp: {
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),
+ 0 1px 5px 0 rgba(0, 0, 0, 0.12),
+ 0 3px 1px -2px rgba(0, 0, 0, 0.2);
+ };
+
+ --shadow-elevation-3dp: {
+ box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.14),
+ 0 1px 8px 0 rgba(0, 0, 0, 0.12),
+ 0 3px 3px -2px rgba(0, 0, 0, 0.4);
+ };
+
+ --shadow-elevation-4dp: {
+ box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14),
+ 0 1px 10px 0 rgba(0, 0, 0, 0.12),
+ 0 2px 4px -1px rgba(0, 0, 0, 0.4);
+ };
+
+ --shadow-elevation-6dp: {
+ box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.14),
+ 0 1px 18px 0 rgba(0, 0, 0, 0.12),
+ 0 3px 5px -1px rgba(0, 0, 0, 0.4);
+ };
+
+ --shadow-elevation-8dp: {
+ box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14),
+ 0 3px 14px 2px rgba(0, 0, 0, 0.12),
+ 0 5px 5px -3px rgba(0, 0, 0, 0.4);
+ };
+
+ --shadow-elevation-12dp: {
+ box-shadow: 0 12px 16px 1px rgba(0, 0, 0, 0.14),
+ 0 4px 22px 3px rgba(0, 0, 0, 0.12),
+ 0 6px 7px -4px rgba(0, 0, 0, 0.4);
+ };
+
+ --shadow-elevation-16dp: {
+ box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14),
+ 0 6px 30px 5px rgba(0, 0, 0, 0.12),
+ 0 8px 10px -5px rgba(0, 0, 0, 0.4);
+ };
+
+ --shadow-elevation-24dp: {
+ box-shadow: 0 24px 38px 3px rgba(0, 0, 0, 0.14),
+ 0 9px 46px 8px rgba(0, 0, 0, 0.12),
+ 0 11px 15px -7px rgba(0, 0, 0, 0.4);
+ };
+ }
+ </style>
+</custom-style>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/typography.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/typography.d.ts
new file mode 100644
index 00000000000..17a7f44b1e0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/typography.d.ts
@@ -0,0 +1,13 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * typography.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../font-roboto/roboto.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/typography.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/typography.html
new file mode 100644
index 00000000000..689ae979895
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-styles/typography.html
@@ -0,0 +1,178 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../font-roboto/roboto.html">
+
+<!--
+Typographic styles are provided matching the Material Design standard styles:
+http://www.google.com/design/spec/style/typography.html#typography-standard-styles
+
+Note that these are English/Latin centric styles. You may need to further adjust
+line heights and weights for CJK typesetting. See the notes in the Material
+Design typography section.
+-->
+<custom-style>
+ <style is="custom-style">
+ html {
+
+ /* Shared Styles */
+ --paper-font-common-base: {
+ font-family: 'Roboto', 'Noto', sans-serif;
+ -webkit-font-smoothing: antialiased;
+ };
+
+ --paper-font-common-code: {
+ font-family: 'Roboto Mono', 'Consolas', 'Menlo', monospace;
+ -webkit-font-smoothing: antialiased;
+ };
+
+ --paper-font-common-expensive-kerning: {
+ text-rendering: optimizeLegibility;
+ };
+
+ --paper-font-common-nowrap: {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ };
+
+ /* Material Font Styles */
+
+ --paper-font-display4: {
+ @apply --paper-font-common-base;
+ @apply --paper-font-common-nowrap;
+
+ font-size: 112px;
+ font-weight: 300;
+ letter-spacing: -.044em;
+ line-height: 120px;
+ };
+
+ --paper-font-display3: {
+ @apply --paper-font-common-base;
+ @apply --paper-font-common-nowrap;
+
+ font-size: 56px;
+ font-weight: 400;
+ letter-spacing: -.026em;
+ line-height: 60px;
+ };
+
+ --paper-font-display2: {
+ @apply --paper-font-common-base;
+
+ font-size: 45px;
+ font-weight: 400;
+ letter-spacing: -.018em;
+ line-height: 48px;
+ };
+
+ --paper-font-display1: {
+ @apply --paper-font-common-base;
+
+ font-size: 34px;
+ font-weight: 400;
+ letter-spacing: -.01em;
+ line-height: 40px;
+ };
+
+ --paper-font-headline: {
+ @apply --paper-font-common-base;
+
+ font-size: 24px;
+ font-weight: 400;
+ letter-spacing: -.012em;
+ line-height: 32px;
+ };
+
+ --paper-font-title: {
+ @apply --paper-font-common-base;
+ @apply --paper-font-common-nowrap;
+
+ font-size: 20px;
+ font-weight: 500;
+ line-height: 28px;
+ };
+
+ --paper-font-subhead: {
+ @apply --paper-font-common-base;
+
+ font-size: 16px;
+ font-weight: 400;
+ line-height: 24px;
+ };
+
+ --paper-font-body2: {
+ @apply --paper-font-common-base;
+
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 24px;
+ };
+
+ --paper-font-body1: {
+ @apply --paper-font-common-base;
+
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 20px;
+ };
+
+ --paper-font-caption: {
+ @apply --paper-font-common-base;
+ @apply --paper-font-common-nowrap;
+
+ font-size: 12px;
+ font-weight: 400;
+ letter-spacing: 0.011em;
+ line-height: 20px;
+ };
+
+ --paper-font-menu: {
+ @apply --paper-font-common-base;
+ @apply --paper-font-common-nowrap;
+
+ font-size: 13px;
+ font-weight: 500;
+ line-height: 24px;
+ };
+
+ --paper-font-button: {
+ @apply --paper-font-common-base;
+ @apply --paper-font-common-nowrap;
+
+ font-size: 14px;
+ font-weight: 500;
+ letter-spacing: 0.018em;
+ line-height: 24px;
+ text-transform: uppercase;
+ };
+
+ --paper-font-code2: {
+ @apply --paper-font-common-code;
+
+ font-size: 14px;
+ font-weight: 700;
+ line-height: 20px;
+ };
+
+ --paper-font-code1: {
+ @apply --paper-font-common-code;
+
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 20px;
+ };
+
+ }
+
+ </style>
+</custom-style>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/.bower.json
new file mode 100644
index 00000000000..ba455a7f1f2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/.bower.json
@@ -0,0 +1,82 @@
+{
+ "name": "paper-tabs",
+ "version": "2.1.1",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "Material design tabs",
+ "private": true,
+ "main": "paper-tabs.html",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "tabs",
+ "control"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-tabs.git"
+ },
+ "dependencies": {
+ "iron-behaviors": "PolymerElements/iron-behaviors#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-icon": "PolymerElements/iron-icon#1 - 2",
+ "iron-iconset-svg": "PolymerElements/iron-iconset-svg#1 - 2",
+ "iron-menu-behavior": "PolymerElements/iron-menu-behavior#1 - 2",
+ "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#1 - 2",
+ "paper-behaviors": "PolymerElements/paper-behaviors#1 - 2",
+ "paper-icon-button": "PolymerElements/paper-icon-button#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-pages": "PolymerElements/iron-pages#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "iron-icon": "PolymerElements/iron-icon#^1.0.0",
+ "iron-iconset-svg": "PolymerElements/iron-iconset-svg#^1.0.0",
+ "iron-menu-behavior": "PolymerElements/iron-menu-behavior#^1.1.0",
+ "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0",
+ "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
+ "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-pages": "PolymerElements/iron-pages#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "homepage": "https://github.com/PolymerElements/paper-tabs",
+ "_release": "2.1.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.1",
+ "commit": "efae86af2401b8744f355acf7c7a78037ccfc787"
+ },
+ "_source": "https://github.com/PolymerElements/paper-tabs.git",
+ "_target": "^2.0.0",
+ "_originalSource": "paper-tabs"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/.github/CODEOWNERS
new file mode 100644
index 00000000000..0d8c0ad6b48
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @bicknellr
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..655302e8def
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/paper-tabs/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/.travis.yml
new file mode 100644
index 00000000000..fe7b9ace629
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/.travis.yml
@@ -0,0 +1,32 @@
+language: node_js
+dist: trusty
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e '\n\033[31mERROR:\033[0m
+ Project is not formatted. Please run "npm run format".' && false)
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+env:
+ global:
+ - secure: >-
+ KEzThhoQ3Aq9kSZIuCzyi6MtYbzxB67JSs2t9CebYoXgW49k3q7Uh/KMUHz8RM04hSa7k2gDGf1Spr4jkXpItHn037aW/Bd+95l49my8pSJvHLEQR8KO/b+FSH/Tu+wKXAm4xk4Mp+vESOxIWap1JXHxSJnoa0EqKyYCeKVVkMI=
+ - secure: >-
+ dhfUH2Sx4rC089kHVtjggaGRMdEa0UHa9ksC5buMk5XBI2GriRE+D3/1N7tBxg4f2HcVbi1+7jTIRHz+xYvypuXCr/9Bh7zh19KhBjrMdFYPZwy3fK3O9xfrypwpldFq1Q3mFcJ3p5sfqHjKvvWlGf/lffqQY5rVr8UI86Lklac=
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/README.md
new file mode 100644
index 00000000000..6117fbc4929
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/README.md
@@ -0,0 +1,52 @@
+[![Build status](https://travis-ci.org/PolymerElements/paper-tabs.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-tabs)
+[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://beta.webcomponents.org/element/PolymerElements/paper-tabs)
+
+## &lt;paper-tabs&gt;
+
+Material design: [Tabs](https://www.google.com/design/spec/components/tabs.html)
+
+`paper-tabs` makes it easy to explore and switch between different views or functional aspects of
+an app, or to browse categorized data sets.
+
+<!---
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="paper-tabs.html">
+ <style>
+ body {
+ margin: 0;
+ display: flex;
+ align-items: flex-end;
+ height: 80px;
+ background: #009688;
+ color: white;
+ }
+ paper-tabs {
+ font-family: 'Roboto', 'Noto', sans-serif;
+ -webkit-font-smoothing: antialiased;
+ width: 100%;
+ text-transform: uppercase;
+ margin-bottom: 1px;
+ }
+ </style>
+ <next-code-block></next-code-block>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<paper-tabs selected="0" scrollable>
+ <paper-tab>The first tab</paper-tab>
+ <paper-tab>Tab two</paper-tab>
+ <paper-tab>The third tab</paper-tab>
+ <paper-tab>Fourth tab</paper-tab>
+</paper-tabs>
+```
+
+### Notable breaking changes between 1.x and 2.x (hybrid):
+
+IronSelectableBehavior and IronMultiSelectableBehavior, which are used by
+paper-tabs, introduce multiple breaking changes. Please see the README for those
+behaviors for more detail.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/bower.json
new file mode 100644
index 00000000000..fb7bd006b41
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/bower.json
@@ -0,0 +1,72 @@
+{
+ "name": "paper-tabs",
+ "version": "2.1.1",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "Material design tabs",
+ "private": true,
+ "main": "paper-tabs.html",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "tabs",
+ "control"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-tabs.git"
+ },
+ "dependencies": {
+ "iron-behaviors": "PolymerElements/iron-behaviors#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-icon": "PolymerElements/iron-icon#1 - 2",
+ "iron-iconset-svg": "PolymerElements/iron-iconset-svg#1 - 2",
+ "iron-menu-behavior": "PolymerElements/iron-menu-behavior#1 - 2",
+ "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#1 - 2",
+ "paper-behaviors": "PolymerElements/paper-behaviors#1 - 2",
+ "paper-icon-button": "PolymerElements/paper-icon-button#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-pages": "PolymerElements/iron-pages#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "iron-icon": "PolymerElements/iron-icon#^1.0.0",
+ "iron-iconset-svg": "PolymerElements/iron-iconset-svg#^1.0.0",
+ "iron-menu-behavior": "PolymerElements/iron-menu-behavior#^1.1.0",
+ "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0",
+ "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
+ "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-pages": "PolymerElements/iron-pages#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/demo/index.html
new file mode 100644
index 00000000000..cff790b0481
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/demo/index.html
@@ -0,0 +1,318 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<html>
+ <head>
+
+ <title>paper-tabs demo</title>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-flex-layout/iron-flex-layout.html">
+ <link rel="import" href="../../iron-pages/iron-pages.html">
+ <link rel="import" href="../../paper-styles/typography.html">
+ <link rel="import" href="../paper-tab.html">
+ <link rel="import" href="../paper-tabs.html">
+
+ </head>
+ <body unresolved>
+
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles">
+ #container {
+ max-width: 600px;
+ }
+
+ paper-tabs {
+ background-color: var(--paper-blue-900);
+ color: #fff;
+ }
+ </style>
+ </custom-style>
+
+ <div id="container" class="vertical-section-container centered">
+
+ <h3>Plain <code>paper-tabs</code>.</h3>
+ <demo-snippet>
+ <template>
+ <paper-tabs selected="0">
+ <paper-tab>ITEM ONE</paper-tab>
+ <paper-tab>ITEM TWO</paper-tab>
+ <paper-tab>ITEM THREE</paper-tab>
+ </paper-tabs>
+ </template>
+ </demo-snippet>
+
+ <h3>The <code>no-bar</code> attribute disables the selection bar.</h3>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ paper-tabs[no-bar] paper-tab.iron-selected {
+ color: #ffff8d;
+ }
+ </style>
+ </custom-style>
+
+ <paper-tabs id="plain-tabs" selected="0" no-bar>
+ <paper-tab>ITEM ONE</paper-tab>
+ <paper-tab>ITEM TWO</paper-tab>
+ <paper-tab>ITEM THREE</paper-tab>
+ </paper-tabs>
+ </template>
+ </demo-snippet>
+
+ <h3>
+ The <code>no-slide</code> attribute prevents the selection bar from
+ animating when the selection changes.
+ </h3>
+ <demo-snippet>
+ <template>
+ <paper-tabs selected="0" no-slide>
+ <paper-tab>ITEM ONE</paper-tab>
+ <paper-tab>ITEM TWO</paper-tab>
+ <paper-tab>ITEM THREE</paper-tab>
+ </paper-tabs>
+ </template>
+ </demo-snippet>
+
+ <h3>
+ The <code>noink</code> attribute disables the ink ripple animation seen
+ when the user activates a tab (by clicking, tapping, etc.).
+ </h3>
+ <demo-snippet>
+ <template>
+ <paper-tabs selected="0" noink>
+ <paper-tab>ITEM ONE</paper-tab>
+ <paper-tab>ITEM TWO</paper-tab>
+ <paper-tab>ITEM THREE</paper-tab>
+ </paper-tabs>
+ </template>
+ </demo-snippet>
+
+ <h3>
+ The <code>scrollable</code> attribute causes the tabs to scroll, rather
+ than compress, when there is not enough space. Arrow buttons appear when
+ any of the tabs are not completely visible.
+ </h3>
+ <demo-snippet>
+ <template>
+ <paper-tabs selected="0" scrollable>
+ <paper-tab>NUMBER ONE ITEM</paper-tab>
+ <paper-tab>ITEM TWO</paper-tab>
+ <paper-tab>THE THIRD ITEM</paper-tab>
+ <paper-tab>THE ITEM FOUR</paper-tab>
+ <paper-tab>FIFTH</paper-tab>
+ <paper-tab>THE SIXTH TAB</paper-tab>
+ <paper-tab>NUMBER SEVEN</paper-tab>
+ <paper-tab>EIGHT</paper-tab>
+ <paper-tab>NUMBER NINE</paper-tab>
+ <paper-tab>THE TENTH</paper-tab>
+ <paper-tab>THE ITEM ELEVEN</paper-tab>
+ <paper-tab>TWELFTH ITEM</paper-tab>
+ </paper-tabs>
+ </template>
+ </demo-snippet>
+
+ <h3>
+ The <code>fit-container</code> attribute causes scrollable tabs to
+ stretch to fit their container if the tabs don't need to scroll.
+ </h3>
+ <demo-snippet>
+ <template>
+ <paper-tabs selected="0" scrollable fit-container>
+ <paper-tab>NUMBER ONE ITEM</paper-tab>
+ <paper-tab>ITEM TWO</paper-tab>
+ <paper-tab>THE THIRD ITEM</paper-tab>
+ </paper-tabs>
+ <br>
+ <paper-tabs selected="0" scrollable fit-container style="width: 50%;">
+ <paper-tab>NUMBER ONE ITEM</paper-tab>
+ <paper-tab>ITEM TWO</paper-tab>
+ <paper-tab>THE THIRD ITEM</paper-tab>
+ </paper-tabs>
+ </template>
+ </demo-snippet>
+
+ <h3>
+ Tab layout is affected by the writing direction of the surrounding area.
+ </h3>
+ <demo-snippet>
+ <template>
+ <div dir="rtl">
+ <paper-tabs selected="0">
+ <paper-tab>ITEM ONE</paper-tab>
+ <paper-tab>ITEM TWO</paper-tab>
+ <paper-tab>ITEM THREE</paper-tab>
+ </paper-tabs>
+ &nbsp;
+ <paper-tabs selected="0" scrollable>
+ <paper-tab>NUMBER ONE ITEM</paper-tab>
+ <paper-tab>ITEM TWO</paper-tab>
+ <paper-tab>THE THIRD ITEM</paper-tab>
+ <paper-tab>THE ITEM FOUR</paper-tab>
+ <paper-tab>FIFTH</paper-tab>
+ <paper-tab>THE SIXTH TAB</paper-tab>
+ <paper-tab>NUMBER SEVEN</paper-tab>
+ <paper-tab>EIGHT</paper-tab>
+ <paper-tab>NUMBER NINE</paper-tab>
+ <paper-tab>THE TENTH</paper-tab>
+ <paper-tab>THE ITEM ELEVEN</paper-tab>
+ <paper-tab>TWELFTH ITEM</paper-tab>
+ </paper-tabs>
+ </div>
+ </template>
+ </demo-snippet>
+
+ <h3>
+ Use the <code>align-bottom</code> attribute when your tabs are
+ positioned below the content they control. The selection bar will be
+ shown at the top of the tabs.
+ </h3>
+ <demo-snippet>
+ <template>
+ <paper-tabs selected="0" align-bottom>
+ <paper-tab>ITEM ONE</paper-tab>
+ <paper-tab>ITEM TWO</paper-tab>
+ <paper-tab>ITEM THREE</paper-tab>
+ </paper-tabs>
+ </template>
+ </demo-snippet>
+
+ <h3>
+ Use the <code>link</code> attribute when a <code>paper-tab</code>
+ contains a link. The link will fill the entire tab. <code>paper-tabs</code>
+ implements its own tabindexing and keyboard focus patterns so an anchor
+ placed inside should set <code>tabindex="-1"</code>.
+ </h3>
+ <demo-snippet>
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ paper-tab[link] a {
+ /* These mixins (from iron-flex-layout) center the link text. */
+ @apply --layout-horizontal;
+ @apply --layout-center-center;
+ color: #fff;
+ text-decoration: none;
+ }
+ </style>
+ </custom-style>
+
+ <paper-tabs selected="0">
+ <paper-tab link>
+ <a href="#item1" tabindex="-1">ITEM ONE</a>
+ </paper-tab>
+ <paper-tab link>
+ <a href="#item2" tabindex="-1">ITEM TWO</a>
+ </paper-tab>
+ <paper-tab link>
+ <a href="#item3" tabindex="-1">ITEM THREE</a>
+ </paper-tab>
+ </paper-tabs>
+ </template>
+ </demo-snippet>
+
+ <h3>
+ Use <code>autoselect</code> to enable automatic tab selection.
+ </h3>
+ <demo-snippet>
+ <template>
+ <paper-tabs selected="0" autoselect>
+ <paper-tab>ITEM ONE</paper-tab>
+ <paper-tab>ITEM TWO</paper-tab>
+ <paper-tab>ITEM THREE</paper-tab>
+ </paper-tabs>
+ </template>
+ </demo-snippet>
+
+ <h3>
+ Use <code>autoselect-delay</code> to adjust the delay between the last
+ keyup event and when the tab is automatically selected (when
+ <code>autoselect</code> is true).
+ </h3>
+ <demo-snippet>
+ <template>
+ <h4>
+ <code>autoselect-delay="0"</code>
+ </h4>
+ <paper-tabs selected="0" no-slide autoselect autoselect-delay="0">
+ <paper-tab>ITEM ONE</paper-tab>
+ <paper-tab>ITEM TWO</paper-tab>
+ <paper-tab>ITEM THREE</paper-tab>
+ </paper-tabs>
+
+ <h4>
+ <code>autoselect-delay="1000"</code>
+ </h4>
+ <paper-tabs selected="0" autoselect autoselect-delay="1000">
+ <paper-tab>ITEM ONE</paper-tab>
+ <paper-tab>ITEM TWO</paper-tab>
+ <paper-tab>ITEM THREE</paper-tab>
+ </paper-tabs>
+ </template>
+ </demo-snippet>
+
+ <!--
+ Nested templates are not supported in IE, meaning they can't be used in a
+ demo-snippet. See Polymer/polymer#2495 for more details.
+ -->
+ <!--
+ <h3>J. Bound Selection</h3>
+ <demo-snippet>
+ <template>
+ <template is="dom-bind">
+ <h2>Current Tab: <span>[[selected]]</span></h2>
+ <paper-tabs selected="{{selected}}">
+ <paper-tab>ITEM ONE</paper-tab>
+ <paper-tab>ITEM TWO</paper-tab>
+ <paper-tab>ITEM THREE</paper-tab>
+ </paper-tabs>
+ </template>
+ </template>
+ </demo-snippet>
+
+ <h3>K. Controlling content</h3>
+ <demo-snippet>
+ <template>
+ <style is="custom-style">
+ iron-pages {
+ border: 1px solid #ccc;
+ border-top: none;
+ padding: 8px;
+ }
+ </style>
+
+ <template is="dom-bind">
+ <paper-tabs selected="{{selected}}">
+ <paper-tab>ITEM ONE</paper-tab>
+ <paper-tab>ITEM TWO</paper-tab>
+ <paper-tab>ITEM THREE</paper-tab>
+ </paper-tabs>
+ <iron-pages selected="{{selected}}">
+ <div>CONTENT ONE</div>
+ <div>CONTENT TWO</div>
+ <div>CONTENT THREE</div>
+ </iron-pages>
+ </template>
+ </template>
+ </demo-snippet>
+ -->
+
+ </div>
+
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/hero.svg b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/hero.svg
new file mode 100755
index 00000000000..bfcbdac2590
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/hero.svg
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">
+<g id="background" display="none">
+ <rect display="inline" fill="#B0BEC5" width="225" height="126"/>
+</g>
+<g id="label">
+</g>
+<g id="art">
+ <path d="M188,78H37V44h151V78z M39,76h147V46H39V76z"/>
+ <polygon points="66,64.8 60.6,56.8 55.3,64.8 49.2,55.6 50.8,54.4 55.3,61.2 60.6,53.2 66,61.2 71.3,53.2 77.4,62.4 75.8,63.6
+ 71.3,56.8 "/>
+ <rect x="149" y="58" width="26" height="2"/>
+ <rect x="99" y="58" width="26" height="2"/>
+ <rect x="38" y="72" width="50" height="4"/>
+ <g id="ic_x5F_add_x0D_">
+ </g>
+</g>
+<g id="Guides">
+</g>
+</svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/index.html
new file mode 100644
index 00000000000..f618702fdde
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/index.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <title>paper-tabs</title>
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page sources='["paper-tabs.html", "paper-tab.html"]'></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/package-lock.json
new file mode 100644
index 00000000000..60282e0c3f8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/package-lock.json
@@ -0,0 +1,2388 @@
+{
+ "name": "@polymer/paper-tabs",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.6.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.4.tgz",
+ "integrity": "sha512-Awg4BcUYiZtNKoveGOu654JVPt11V/KIC77iBz8NweyoOAZpz5rUJfPDwwD+ajfTs2HndbTCEB8IuLfX9m/mmw==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.44",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+ "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz",
+ "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.2",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.105",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.44",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.2",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/package.json
new file mode 100644
index 00000000000..5744b398d94
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@polymer/paper-tabs",
+ "private": true,
+ "description": "Material design tabs",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-tabs.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.1.1",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tab.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tab.d.ts
new file mode 100644
index 00000000000..650dd5607d5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tab.d.ts
@@ -0,0 +1,58 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-tab.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-behaviors/iron-button-state.d.ts" />
+/// <reference path="../iron-behaviors/iron-control-state.d.ts" />
+/// <reference path="../iron-flex-layout/iron-flex-layout.d.ts" />
+/// <reference path="../paper-behaviors/paper-ripple-behavior.d.ts" />
+
+/**
+ * `paper-tab` is styled to look like a tab. It should be used in conjunction with
+ * `paper-tabs`.
+ *
+ * Example:
+ *
+ * <paper-tabs selected="0">
+ * <paper-tab>TAB 1</paper-tab>
+ * <paper-tab>TAB 2</paper-tab>
+ * <paper-tab>TAB 3</paper-tab>
+ * </paper-tabs>
+ *
+ * ### Styling
+ *
+ * The following custom properties and mixins are available for styling:
+ *
+ * Custom property | Description | Default
+ * ----------------|-------------|----------
+ * `--paper-tab-ink` | Ink color | `--paper-yellow-a100`
+ * `--paper-tab` | Mixin applied to the tab | `{}`
+ * `--paper-tab-content` | Mixin applied to the tab content | `{}`
+ * `--paper-tab-content-unselected` | Mixin applied to the tab content when the tab is not selected | `{}`
+ *
+ * This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`.
+ * In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`.
+ */
+interface PaperTabElement extends Polymer.Element, Polymer.IronControlState, Polymer.IronButtonState, Polymer.PaperRippleBehavior {
+
+ /**
+ * If true, the tab will forward keyboard clicks (enter/space) to
+ * the first anchor element found in its descendants
+ */
+ link: boolean|null|undefined;
+ readonly _parentNoink: any;
+ attached(): void;
+ _updateNoink(): void;
+ _onTap(event: any): void;
+}
+
+interface HTMLElementTagNameMap {
+ "paper-tab": PaperTabElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tab.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tab.html
new file mode 100644
index 00000000000..08d4617ebff
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tab.html
@@ -0,0 +1,168 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-behaviors/iron-button-state.html">
+<link rel="import" href="../iron-behaviors/iron-control-state.html">
+<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="../paper-behaviors/paper-ripple-behavior.html">
+
+<!--
+`paper-tab` is styled to look like a tab. It should be used in conjunction with
+`paper-tabs`.
+
+Example:
+
+ <paper-tabs selected="0">
+ <paper-tab>TAB 1</paper-tab>
+ <paper-tab>TAB 2</paper-tab>
+ <paper-tab>TAB 3</paper-tab>
+ </paper-tabs>
+
+### Styling
+
+The following custom properties and mixins are available for styling:
+
+Custom property | Description | Default
+----------------|-------------|----------
+`--paper-tab-ink` | Ink color | `--paper-yellow-a100`
+`--paper-tab` | Mixin applied to the tab | `{}`
+`--paper-tab-content` | Mixin applied to the tab content | `{}`
+`--paper-tab-content-unselected` | Mixin applied to the tab content when the tab is not selected | `{}`
+
+This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`.
+In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`.
+
+-->
+
+<dom-module id="paper-tab">
+ <template>
+ <style>
+ :host {
+ @apply --layout-inline;
+ @apply --layout-center;
+ @apply --layout-center-justified;
+ @apply --layout-flex-auto;
+
+ position: relative;
+ padding: 0 12px;
+ overflow: hidden;
+ cursor: pointer;
+ vertical-align: middle;
+
+ @apply --paper-font-common-base;
+ @apply --paper-tab;
+ }
+
+ :host(:focus) {
+ outline: none;
+ }
+
+ :host([link]) {
+ padding: 0;
+ }
+
+ .tab-content {
+ height: 100%;
+ transform: translateZ(0);
+ -webkit-transform: translateZ(0);
+ transition: opacity 0.1s cubic-bezier(0.4, 0.0, 1, 1);
+ @apply --layout-horizontal;
+ @apply --layout-center-center;
+ @apply --layout-flex-auto;
+ @apply --paper-tab-content;
+ }
+
+ :host(:not(.iron-selected)) > .tab-content {
+ opacity: 0.8;
+
+ @apply --paper-tab-content-unselected;
+ }
+
+ :host(:focus) .tab-content {
+ opacity: 1;
+ font-weight: 700;
+ }
+
+ paper-ripple {
+ color: var(--paper-tab-ink, var(--paper-yellow-a100));
+ }
+
+ .tab-content > ::slotted(a) {
+ @apply --layout-flex-auto;
+
+ height: 100%;
+ }
+ </style>
+
+ <div class="tab-content">
+ <slot></slot>
+ </div>
+ </template>
+
+ <script>
+ Polymer({
+ is: 'paper-tab',
+
+ behaviors: [
+ Polymer.IronControlState,
+ Polymer.IronButtonState,
+ Polymer.PaperRippleBehavior
+ ],
+
+ properties: {
+
+ /**
+ * If true, the tab will forward keyboard clicks (enter/space) to
+ * the first anchor element found in its descendants
+ */
+ link: {type: Boolean, value: false, reflectToAttribute: true}
+
+ },
+
+ /** @private */
+ hostAttributes: {role: 'tab'},
+
+ listeners: {down: '_updateNoink', tap: '_onTap'},
+
+ attached: function() {
+ this._updateNoink();
+ },
+
+ get _parentNoink() {
+ var parent = Polymer.dom(this).parentNode;
+ return !!parent && !!parent.noink;
+ },
+
+ _updateNoink: function() {
+ this.noink = !!this.noink || !!this._parentNoink;
+ },
+
+ _onTap: function(event) {
+ if (this.link) {
+ var anchor = this.queryEffectiveChildren('a');
+
+ if (!anchor) {
+ return;
+ }
+
+ // Don't get stuck in a loop delegating
+ // the listener from the child anchor
+ if (event.target === anchor) {
+ return;
+ }
+
+ anchor.click();
+ }
+ }
+
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tabs-icons.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tabs-icons.d.ts
new file mode 100644
index 00000000000..438ec1902d6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tabs-icons.d.ts
@@ -0,0 +1,12 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-tabs-icons.html
+ */
+
+/// <reference path="../iron-iconset-svg/iron-iconset-svg.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tabs-icons.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tabs-icons.html
new file mode 100644
index 00000000000..c299046a63b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tabs-icons.html
@@ -0,0 +1,18 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
+
+<iron-iconset-svg name="paper-tabs" size="24">
+<svg><defs>
+<g id="chevron-left"><path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/></g>
+<g id="chevron-right"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></g>
+</defs></svg>
+</iron-iconset-svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tabs.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tabs.d.ts
new file mode 100644
index 00000000000..d49a5d736b3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tabs.d.ts
@@ -0,0 +1,210 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-tabs.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-flex-layout/iron-flex-layout.d.ts" />
+/// <reference path="../iron-icon/iron-icon.d.ts" />
+/// <reference path="../iron-menu-behavior/iron-menubar-behavior.d.ts" />
+/// <reference path="../iron-resizable-behavior/iron-resizable-behavior.d.ts" />
+/// <reference path="../paper-icon-button/paper-icon-button.d.ts" />
+/// <reference path="../paper-styles/color.d.ts" />
+/// <reference path="paper-tabs-icons.d.ts" />
+/// <reference path="paper-tab.d.ts" />
+
+/**
+ * Material design: [Tabs](https://www.google.com/design/spec/components/tabs.html)
+ *
+ * `paper-tabs` makes it easy to explore and switch between different views or functional aspects of
+ * an app, or to browse categorized data sets.
+ *
+ * Use `selected` property to get or set the selected tab.
+ *
+ * Example:
+ *
+ * <paper-tabs selected="0">
+ * <paper-tab>TAB 1</paper-tab>
+ * <paper-tab>TAB 2</paper-tab>
+ * <paper-tab>TAB 3</paper-tab>
+ * </paper-tabs>
+ *
+ * See <a href="?active=paper-tab">paper-tab</a> for more information about
+ * `paper-tab`.
+ *
+ * A common usage for `paper-tabs` is to use it along with `iron-pages` to switch
+ * between different views.
+ *
+ * <paper-tabs selected="{{selected}}">
+ * <paper-tab>Tab 1</paper-tab>
+ * <paper-tab>Tab 2</paper-tab>
+ * <paper-tab>Tab 3</paper-tab>
+ * </paper-tabs>
+ *
+ * <iron-pages selected="{{selected}}">
+ * <div>Page 1</div>
+ * <div>Page 2</div>
+ * <div>Page 3</div>
+ * </iron-pages>
+ *
+ *
+ * To use links in tabs, add `link` attribute to `paper-tab` and put an `<a>`
+ * element in `paper-tab` with a `tabindex` of -1.
+ *
+ * Example:
+ *
+ * <pre><code>
+ * &lt;style is="custom-style">
+ * .link {
+ * &#64;apply --layout-horizontal;
+ * &#64;apply --layout-center-center;
+ * }
+ * &lt;/style>
+ *
+ * &lt;paper-tabs selected="0">
+ * &lt;paper-tab link>
+ * &lt;a href="#link1" class="link" tabindex="-1">TAB ONE&lt;/a>
+ * &lt;/paper-tab>
+ * &lt;paper-tab link>
+ * &lt;a href="#link2" class="link" tabindex="-1">TAB TWO&lt;/a>
+ * &lt;/paper-tab>
+ * &lt;paper-tab link>
+ * &lt;a href="#link3" class="link" tabindex="-1">TAB THREE&lt;/a>
+ * &lt;/paper-tab>
+ * &lt;/paper-tabs>
+ * </code></pre>
+ *
+ * ### Styling
+ *
+ * The following custom properties and mixins are available for styling:
+ *
+ * Custom property | Description | Default
+ * ----------------|-------------|----------
+ * `--paper-tabs-selection-bar-color` | Color for the selection bar | `--paper-yellow-a100`
+ * `--paper-tabs-selection-bar` | Mixin applied to the selection bar | `{}`
+ * `--paper-tabs` | Mixin applied to the tabs | `{}`
+ * `--paper-tabs-content` | Mixin applied to the content container of tabs | `{}`
+ * `--paper-tabs-container` | Mixin applied to the layout container of tabs | `{}`
+ */
+interface PaperTabsElement extends Polymer.Element, Polymer.IronResizableBehavior, Polymer.IronMenubarBehavior {
+ selectable: string|null|undefined;
+ keyBindings: object;
+
+ /**
+ * If true, ink ripple effect is disabled. When this property is changed,
+ * all descendant `<paper-tab>` elements have their `noink` property
+ * changed to the new value as well.
+ */
+ noink: boolean|null|undefined;
+
+ /**
+ * If true, the bottom bar to indicate the selected tab will not be shown.
+ */
+ noBar: boolean|null|undefined;
+
+ /**
+ * If true, the slide effect for the bottom bar is disabled.
+ */
+ noSlide: boolean|null|undefined;
+
+ /**
+ * If true, tabs are scrollable and the tab width is based on the label
+ * width.
+ */
+ scrollable: boolean|null|undefined;
+
+ /**
+ * If true, tabs expand to fit their container. This currently only applies
+ * when scrollable is true.
+ */
+ fitContainer: boolean|null|undefined;
+
+ /**
+ * If true, dragging on the tabs to scroll is disabled.
+ */
+ disableDrag: boolean|null|undefined;
+
+ /**
+ * If true, scroll buttons (left/right arrow) will be hidden for scrollable
+ * tabs.
+ */
+ hideScrollButtons: boolean|null|undefined;
+
+ /**
+ * If true, the tabs are aligned to bottom (the selection bar appears at the
+ * top).
+ */
+ alignBottom: boolean|null|undefined;
+
+ /**
+ * If true, tabs are automatically selected when focused using the
+ * keyboard.
+ */
+ autoselect: boolean|null|undefined;
+
+ /**
+ * The delay (in milliseconds) between when the user stops interacting
+ * with the tabs through the keyboard and when the focused item is
+ * automatically selected (if `autoselect` is true).
+ */
+ autoselectDelay: number|null|undefined;
+ _step: number|null|undefined;
+ _holdDelay: number|null|undefined;
+ _leftHidden: boolean|null|undefined;
+ _rightHidden: boolean|null|undefined;
+ _previousTab: object|null|undefined;
+ readonly _tabContainerScrollSize: any;
+ created(): void;
+ detached(): void;
+ _activateHandler(): void;
+ ready(): void;
+ _noinkChanged(noink: any): void;
+ _setNoinkAttribute(element: any): void;
+ _removeNoinkAttribute(element: any): void;
+ _computeScrollButtonClass(hideThisButton: any, scrollable: any, hideScrollButtons: any): any;
+ _computeTabsContentClass(scrollable: any, fitContainer: any): any;
+ _computeSelectionBarClass(noBar: any, alignBottom: any): any;
+ _onTabSizingChanged(): void;
+ _onIronSelect(event: any): void;
+ _onIronDeselect(event: any): void;
+
+ /**
+ * Activates an item after a delay (in milliseconds).
+ */
+ _scheduleActivation(item: any, delay: any): void;
+
+ /**
+ * Activates the last item given to `_scheduleActivation`.
+ */
+ _delayedActivationHandler(): void;
+
+ /**
+ * Cancels a previously scheduled item activation made with
+ * `_scheduleActivation`.
+ */
+ _cancelPendingActivation(): void;
+ _onArrowKeyup(event: any): void;
+ _onBlurCapture(event: any): void;
+ _scroll(e: any, detail: any): void;
+ _down(e: any): void;
+ _affectScroll(dx: any): void;
+ _onLeftScrollButtonDown(): void;
+ _onRightScrollButtonDown(): void;
+ _onScrollButtonUp(): void;
+ _scrollToLeft(): void;
+ _scrollToRight(): void;
+ _tabChanged(tab: any, old: any): void;
+ _scrollToSelectedIfNeeded(tabWidth: any, tabOffsetLeft: any): void;
+ _calcPercent(w: any, w0: any): any;
+ _positionBar(width: any, left: any): void;
+ _onBarTransitionEnd(e: any): void;
+}
+
+interface HTMLElementTagNameMap {
+ "paper-tabs": PaperTabsElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tabs.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tabs.html
new file mode 100644
index 00000000000..5cb5a559c9b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-tabs/paper-tabs.html
@@ -0,0 +1,614 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="../iron-icon/iron-icon.html">
+<link rel="import" href="../iron-menu-behavior/iron-menubar-behavior.html">
+<link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html">
+<link rel="import" href="../paper-icon-button/paper-icon-button.html">
+<link rel="import" href="../paper-styles/color.html">
+<link rel="import" href="paper-tabs-icons.html">
+<link rel="import" href="paper-tab.html">
+
+<!--
+Material design: [Tabs](https://www.google.com/design/spec/components/tabs.html)
+
+`paper-tabs` makes it easy to explore and switch between different views or functional aspects of
+an app, or to browse categorized data sets.
+
+Use `selected` property to get or set the selected tab.
+
+Example:
+
+ <paper-tabs selected="0">
+ <paper-tab>TAB 1</paper-tab>
+ <paper-tab>TAB 2</paper-tab>
+ <paper-tab>TAB 3</paper-tab>
+ </paper-tabs>
+
+See <a href="?active=paper-tab">paper-tab</a> for more information about
+`paper-tab`.
+
+A common usage for `paper-tabs` is to use it along with `iron-pages` to switch
+between different views.
+
+ <paper-tabs selected="{{selected}}">
+ <paper-tab>Tab 1</paper-tab>
+ <paper-tab>Tab 2</paper-tab>
+ <paper-tab>Tab 3</paper-tab>
+ </paper-tabs>
+
+ <iron-pages selected="{{selected}}">
+ <div>Page 1</div>
+ <div>Page 2</div>
+ <div>Page 3</div>
+ </iron-pages>
+
+
+To use links in tabs, add `link` attribute to `paper-tab` and put an `<a>`
+element in `paper-tab` with a `tabindex` of -1.
+
+Example:
+
+<pre><code>
+&lt;style is="custom-style">
+ .link {
+ &#64;apply --layout-horizontal;
+ &#64;apply --layout-center-center;
+ }
+&lt;/style>
+
+&lt;paper-tabs selected="0">
+ &lt;paper-tab link>
+ &lt;a href="#link1" class="link" tabindex="-1">TAB ONE&lt;/a>
+ &lt;/paper-tab>
+ &lt;paper-tab link>
+ &lt;a href="#link2" class="link" tabindex="-1">TAB TWO&lt;/a>
+ &lt;/paper-tab>
+ &lt;paper-tab link>
+ &lt;a href="#link3" class="link" tabindex="-1">TAB THREE&lt;/a>
+ &lt;/paper-tab>
+&lt;/paper-tabs>
+</code></pre>
+
+### Styling
+
+The following custom properties and mixins are available for styling:
+
+Custom property | Description | Default
+----------------|-------------|----------
+`--paper-tabs-selection-bar-color` | Color for the selection bar | `--paper-yellow-a100`
+`--paper-tabs-selection-bar` | Mixin applied to the selection bar | `{}`
+`--paper-tabs` | Mixin applied to the tabs | `{}`
+`--paper-tabs-content` | Mixin applied to the content container of tabs | `{}`
+`--paper-tabs-container` | Mixin applied to the layout container of tabs | `{}`
+
+@hero hero.svg
+@demo demo/index.html
+-->
+
+<dom-module id="paper-tabs">
+ <template>
+ <style>
+ :host {
+ @apply --layout;
+ @apply --layout-center;
+
+ height: 48px;
+ font-size: 14px;
+ font-weight: 500;
+ overflow: hidden;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ -webkit-user-select: none;
+ user-select: none;
+
+ /* NOTE: Both values are needed, since some phones require the value to be `transparent`. */
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+ -webkit-tap-highlight-color: transparent;
+
+ @apply --paper-tabs;
+ }
+
+ :host(:dir(rtl)) {
+ @apply --layout-horizontal-reverse;
+ }
+
+ #tabsContainer {
+ position: relative;
+ height: 100%;
+ white-space: nowrap;
+ overflow: hidden;
+ @apply --layout-flex-auto;
+ @apply --paper-tabs-container;
+ }
+
+ #tabsContent {
+ height: 100%;
+ -moz-flex-basis: auto;
+ -ms-flex-basis: auto;
+ flex-basis: auto;
+ @apply --paper-tabs-content;
+ }
+
+ #tabsContent.scrollable {
+ position: absolute;
+ white-space: nowrap;
+ }
+
+ #tabsContent:not(.scrollable),
+ #tabsContent.scrollable.fit-container {
+ @apply --layout-horizontal;
+ }
+
+ #tabsContent.scrollable.fit-container {
+ min-width: 100%;
+ }
+
+ #tabsContent.scrollable.fit-container > ::slotted(*) {
+ /* IE - prevent tabs from compressing when they should scroll. */
+ -ms-flex: 1 0 auto;
+ -webkit-flex: 1 0 auto;
+ flex: 1 0 auto;
+ }
+
+ .hidden {
+ display: none;
+ }
+
+ .not-visible {
+ opacity: 0;
+ cursor: default;
+ }
+
+ paper-icon-button {
+ width: 48px;
+ height: 48px;
+ padding: 12px;
+ margin: 0 4px;
+ }
+
+ #selectionBar {
+ position: absolute;
+ height: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ border-bottom: 2px solid var(--paper-tabs-selection-bar-color, var(--paper-yellow-a100));
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ -webkit-transform-origin: left center;
+ transform-origin: left center;
+ transition: -webkit-transform;
+ transition: transform;
+
+ @apply --paper-tabs-selection-bar;
+ }
+
+ #selectionBar.align-bottom {
+ top: 0;
+ bottom: auto;
+ }
+
+ #selectionBar.expand {
+ transition-duration: 0.15s;
+ transition-timing-function: cubic-bezier(0.4, 0.0, 1, 1);
+ }
+
+ #selectionBar.contract {
+ transition-duration: 0.18s;
+ transition-timing-function: cubic-bezier(0.0, 0.0, 0.2, 1);
+ }
+
+ #tabsContent > ::slotted(:not(#selectionBar)) {
+ height: 100%;
+ }
+ </style>
+
+ <paper-icon-button icon="paper-tabs:chevron-left" class$="[[_computeScrollButtonClass(_leftHidden, scrollable, hideScrollButtons)]]" on-up="_onScrollButtonUp" on-down="_onLeftScrollButtonDown" tabindex="-1"></paper-icon-button>
+
+ <div id="tabsContainer" on-track="_scroll" on-down="_down">
+ <div id="tabsContent" class$="[[_computeTabsContentClass(scrollable, fitContainer)]]">
+ <div id="selectionBar" class$="[[_computeSelectionBarClass(noBar, alignBottom)]]"
+ on-transitionend="_onBarTransitionEnd"></div>
+ <slot></slot>
+ </div>
+ </div>
+
+ <paper-icon-button icon="paper-tabs:chevron-right" class$="[[_computeScrollButtonClass(_rightHidden, scrollable, hideScrollButtons)]]" on-up="_onScrollButtonUp" on-down="_onRightScrollButtonDown" tabindex="-1"></paper-icon-button>
+
+ </template>
+
+ <script>
+ Polymer({
+ is: 'paper-tabs',
+
+ behaviors: [Polymer.IronResizableBehavior, Polymer.IronMenubarBehavior],
+
+ properties: {
+ /**
+ * If true, ink ripple effect is disabled. When this property is changed,
+ * all descendant `<paper-tab>` elements have their `noink` property
+ * changed to the new value as well.
+ */
+ noink: {type: Boolean, value: false, observer: '_noinkChanged'},
+
+ /**
+ * If true, the bottom bar to indicate the selected tab will not be shown.
+ */
+ noBar: {type: Boolean, value: false},
+
+ /**
+ * If true, the slide effect for the bottom bar is disabled.
+ */
+ noSlide: {type: Boolean, value: false},
+
+ /**
+ * If true, tabs are scrollable and the tab width is based on the label
+ * width.
+ */
+ scrollable: {type: Boolean, value: false},
+
+ /**
+ * If true, tabs expand to fit their container. This currently only applies
+ * when scrollable is true.
+ */
+ fitContainer: {type: Boolean, value: false},
+
+ /**
+ * If true, dragging on the tabs to scroll is disabled.
+ */
+ disableDrag: {type: Boolean, value: false},
+
+ /**
+ * If true, scroll buttons (left/right arrow) will be hidden for scrollable
+ * tabs.
+ */
+ hideScrollButtons: {type: Boolean, value: false},
+
+ /**
+ * If true, the tabs are aligned to bottom (the selection bar appears at the
+ * top).
+ */
+ alignBottom: {type: Boolean, value: false},
+
+ selectable: {type: String, value: 'paper-tab'},
+
+ /**
+ * If true, tabs are automatically selected when focused using the
+ * keyboard.
+ */
+ autoselect: {type: Boolean, value: false},
+
+ /**
+ * The delay (in milliseconds) between when the user stops interacting
+ * with the tabs through the keyboard and when the focused item is
+ * automatically selected (if `autoselect` is true).
+ */
+ autoselectDelay: {type: Number, value: 0},
+
+ _step: {type: Number, value: 10},
+
+ _holdDelay: {type: Number, value: 1},
+
+ _leftHidden: {type: Boolean, value: false},
+
+ _rightHidden: {type: Boolean, value: false},
+
+ _previousTab: {type: Object}
+ },
+
+ /** @private */
+ hostAttributes: {role: 'tablist'},
+
+ listeners: {
+ 'iron-resize': '_onTabSizingChanged',
+ 'iron-items-changed': '_onTabSizingChanged',
+ 'iron-select': '_onIronSelect',
+ 'iron-deselect': '_onIronDeselect'
+ },
+
+ /**
+ * @type {!Object}
+ */
+ keyBindings: {'left:keyup right:keyup': '_onArrowKeyup'},
+
+ created: function() {
+ this._holdJob = null;
+ this._pendingActivationItem = undefined;
+ this._pendingActivationTimeout = undefined;
+ this._bindDelayedActivationHandler =
+ this._delayedActivationHandler.bind(this);
+ this.addEventListener('blur', this._onBlurCapture.bind(this), true);
+ },
+
+ ready: function() {
+ this.setScrollDirection('y', this.$.tabsContainer);
+ },
+
+ detached: function() {
+ this._cancelPendingActivation();
+ },
+
+ _noinkChanged: function(noink) {
+ var childTabs = Polymer.dom(this).querySelectorAll('paper-tab');
+ childTabs.forEach(
+ noink ? this._setNoinkAttribute : this._removeNoinkAttribute);
+ },
+
+ _setNoinkAttribute: function(element) {
+ element.setAttribute('noink', '');
+ },
+
+ _removeNoinkAttribute: function(element) {
+ element.removeAttribute('noink');
+ },
+
+ _computeScrollButtonClass: function(
+ hideThisButton, scrollable, hideScrollButtons) {
+ if (!scrollable || hideScrollButtons) {
+ return 'hidden';
+ }
+
+ if (hideThisButton) {
+ return 'not-visible';
+ }
+
+ return '';
+ },
+
+ _computeTabsContentClass: function(scrollable, fitContainer) {
+ return scrollable ? 'scrollable' + (fitContainer ? ' fit-container' : '') :
+ ' fit-container';
+ },
+
+ _computeSelectionBarClass: function(noBar, alignBottom) {
+ if (noBar) {
+ return 'hidden';
+ } else if (alignBottom) {
+ return 'align-bottom';
+ }
+
+ return '';
+ },
+
+ // TODO(cdata): Add `track` response back in when gesture lands.
+
+ _onTabSizingChanged: function() {
+ this.debounce('_onTabSizingChanged', function() {
+ this._scroll();
+ this._tabChanged(this.selectedItem);
+ }, 10);
+ },
+
+ _onIronSelect: function(event) {
+ this._tabChanged(event.detail.item, this._previousTab);
+ this._previousTab = event.detail.item;
+ this.cancelDebouncer('tab-changed');
+ },
+
+ _onIronDeselect: function(event) {
+ this.debounce('tab-changed', function() {
+ this._tabChanged(null, this._previousTab);
+ this._previousTab = null;
+ // See polymer/polymer#1305
+ }, 1);
+ },
+
+ _activateHandler: function() {
+ // Cancel item activations scheduled by keyboard events when any other
+ // action causes an item to be activated (e.g. clicks).
+ this._cancelPendingActivation();
+
+ Polymer.IronMenuBehaviorImpl._activateHandler.apply(this, arguments);
+ },
+
+ /**
+ * Activates an item after a delay (in milliseconds).
+ */
+ _scheduleActivation: function(item, delay) {
+ this._pendingActivationItem = item;
+ this._pendingActivationTimeout =
+ this.async(this._bindDelayedActivationHandler, delay);
+ },
+
+ /**
+ * Activates the last item given to `_scheduleActivation`.
+ */
+ _delayedActivationHandler: function() {
+ var item = this._pendingActivationItem;
+ this._pendingActivationItem = undefined;
+ this._pendingActivationTimeout = undefined;
+ item.fire(this.activateEvent, null, {bubbles: true, cancelable: true});
+ },
+
+ /**
+ * Cancels a previously scheduled item activation made with
+ * `_scheduleActivation`.
+ */
+ _cancelPendingActivation: function() {
+ if (this._pendingActivationTimeout !== undefined) {
+ this.cancelAsync(this._pendingActivationTimeout);
+ this._pendingActivationItem = undefined;
+ this._pendingActivationTimeout = undefined;
+ }
+ },
+
+ _onArrowKeyup: function(event) {
+ if (this.autoselect) {
+ this._scheduleActivation(this.focusedItem, this.autoselectDelay);
+ }
+ },
+
+ _onBlurCapture: function(event) {
+ // Cancel a scheduled item activation (if any) when that item is
+ // blurred.
+ if (event.target === this._pendingActivationItem) {
+ this._cancelPendingActivation();
+ }
+ },
+
+ get _tabContainerScrollSize() {
+ return Math.max(
+ 0, this.$.tabsContainer.scrollWidth - this.$.tabsContainer.offsetWidth);
+ },
+
+ _scroll: function(e, detail) {
+ if (!this.scrollable) {
+ return;
+ }
+
+ var ddx = (detail && -detail.ddx) || 0;
+ this._affectScroll(ddx);
+ },
+
+ _down: function(e) {
+ // go one beat async to defeat IronMenuBehavior
+ // autorefocus-on-no-selection timeout
+ this.async(function() {
+ if (this._defaultFocusAsync) {
+ this.cancelAsync(this._defaultFocusAsync);
+ this._defaultFocusAsync = null;
+ }
+ }, 1);
+ },
+
+ _affectScroll: function(dx) {
+ this.$.tabsContainer.scrollLeft += dx;
+
+ var scrollLeft = this.$.tabsContainer.scrollLeft;
+
+ this._leftHidden = scrollLeft === 0;
+ this._rightHidden = scrollLeft === this._tabContainerScrollSize;
+ },
+
+ _onLeftScrollButtonDown: function() {
+ this._scrollToLeft();
+ this._holdJob = setInterval(this._scrollToLeft.bind(this), this._holdDelay);
+ },
+
+ _onRightScrollButtonDown: function() {
+ this._scrollToRight();
+ this._holdJob =
+ setInterval(this._scrollToRight.bind(this), this._holdDelay);
+ },
+
+ _onScrollButtonUp: function() {
+ clearInterval(this._holdJob);
+ this._holdJob = null;
+ },
+
+ _scrollToLeft: function() {
+ this._affectScroll(-this._step);
+ },
+
+ _scrollToRight: function() {
+ this._affectScroll(this._step);
+ },
+
+ _tabChanged: function(tab, old) {
+ if (!tab) {
+ // Remove the bar without animation.
+ this.$.selectionBar.classList.remove('expand');
+ this.$.selectionBar.classList.remove('contract');
+ this._positionBar(0, 0);
+ return;
+ }
+
+ var r = this.$.tabsContent.getBoundingClientRect();
+ var w = r.width;
+ var tabRect = tab.getBoundingClientRect();
+ var tabOffsetLeft = tabRect.left - r.left;
+
+ this._pos = {
+ width: this._calcPercent(tabRect.width, w),
+ left: this._calcPercent(tabOffsetLeft, w)
+ };
+
+ if (this.noSlide || old == null) {
+ // Position the bar without animation.
+ this.$.selectionBar.classList.remove('expand');
+ this.$.selectionBar.classList.remove('contract');
+ this._positionBar(this._pos.width, this._pos.left);
+ return;
+ }
+
+ var oldRect = old.getBoundingClientRect();
+ var oldIndex = this.items.indexOf(old);
+ var index = this.items.indexOf(tab);
+ var m = 5;
+
+ // bar animation: expand
+ this.$.selectionBar.classList.add('expand');
+
+ var moveRight = oldIndex < index;
+ var isRTL = this._isRTL;
+ if (isRTL) {
+ moveRight = !moveRight;
+ }
+
+ if (moveRight) {
+ this._positionBar(
+ this._calcPercent(tabRect.left + tabRect.width - oldRect.left, w) - m,
+ this._left);
+ } else {
+ this._positionBar(
+ this._calcPercent(oldRect.left + oldRect.width - tabRect.left, w) - m,
+ this._calcPercent(tabOffsetLeft, w) + m);
+ }
+
+ if (this.scrollable) {
+ this._scrollToSelectedIfNeeded(tabRect.width, tabOffsetLeft);
+ }
+ },
+
+ _scrollToSelectedIfNeeded: function(tabWidth, tabOffsetLeft) {
+ var l = tabOffsetLeft - this.$.tabsContainer.scrollLeft;
+ if (l < 0) {
+ this.$.tabsContainer.scrollLeft += l;
+ } else {
+ l += (tabWidth - this.$.tabsContainer.offsetWidth);
+ if (l > 0) {
+ this.$.tabsContainer.scrollLeft += l;
+ }
+ }
+ },
+
+ _calcPercent: function(w, w0) {
+ return 100 * w / w0;
+ },
+
+ _positionBar: function(width, left) {
+ width = width || 0;
+ left = left || 0;
+
+ this._width = width;
+ this._left = left;
+ this.transform(
+ 'translateX(' + left + '%) scaleX(' + (width / 100) + ')',
+ this.$.selectionBar);
+ },
+
+ _onBarTransitionEnd: function(e) {
+ var cl = this.$.selectionBar.classList;
+ // bar animation: expand -> contract
+ if (cl.contains('expand')) {
+ cl.remove('expand');
+ cl.add('contract');
+ this._positionBar(this._pos.width, this._pos.left);
+ // bar animation done
+ } else if (cl.contains('contract')) {
+ cl.remove('contract');
+ }
+ }
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/.bower.json
new file mode 100644
index 00000000000..f6e66325d07
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/.bower.json
@@ -0,0 +1,70 @@
+{
+ "name": "paper-toast",
+ "version": "2.1.1",
+ "description": "A material design notification toast",
+ "private": true,
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "toast",
+ "notification"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-toast.git"
+ },
+ "main": "paper-toast.html",
+ "dependencies": {
+ "iron-a11y-announcer": "PolymerElements/iron-a11y-announcer#1 - 2",
+ "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#1 - 2",
+ "iron-fit-behavior": "PolymerElements/iron-fit-behavior#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "paper-button": "PolymerElements/paper-button#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-a11y-announcer": "PolymerElements/iron-a11y-announcer#^1.0.0",
+ "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#^1.0.9",
+ "iron-fit-behavior": "PolymerElements/iron-fit-behavior#^1.1.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "paper-button": "PolymerElements/paper-button#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "homepage": "https://github.com/PolymerElements/paper-toast",
+ "_release": "2.1.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.1",
+ "commit": "23c7d30cf8511c8669ae872eeb648a1245c3cf01"
+ },
+ "_source": "https://github.com/PolymerElements/paper-toast.git",
+ "_target": "^2.0.0",
+ "_originalSource": "paper-toast"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/.github/CODEOWNERS
new file mode 100644
index 00000000000..c5097c0c903
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @valdrinkoshi
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..9251e7f2e0a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/paper-toast/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/.travis.yml
new file mode 100644
index 00000000000..a30e72481be
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/.travis.yml
@@ -0,0 +1,32 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e '\n\033[31mERROR:\033[0m
+ Project is not formatted. Please run "npm run format".' && false)
+env:
+ global:
+ - secure: >-
+ fg+1RZ1aJQfxiM42iXvK8hj8L9RN8zX6IEjhuxFgNcgBY786DCyy9CIn1Gz4esv+4ZXyJfLyCbzGi8NMrzc6j3nbmewRKf3/zkX5NI4at82EvlkkN8Bcp7z+AV871LyLeV5q94waiR6+9/2LHega+F96pyl/4SAKxk2Gmh3BuPk=
+ - secure: >-
+ VkX13Tu1Ojr/2ZRXRORize8w4tlNo2bBUYEbEDF/RtcoxQeTffjAigmZ1q4Z/eZaA41JI/Fh90HUzZRg9V0W+TGT3t6htK9zxZq9zygM6sHVpOayxGInEW1TcMSM3QlcRI+3y8xUeCgpCmBmLLLI8K+HENRi1trg4C2HJk4JCN8=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/README.md
new file mode 100644
index 00000000000..79727aa246b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/README.md
@@ -0,0 +1,67 @@
+[![Build status](https://travis-ci.org/PolymerElements/paper-toast.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-toast)
+[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://www.webcomponents.org/element/PolymerElements/paper-toast)
+
+## &lt;paper-toast&gt;
+
+Material design: [Snackbars & toasts](https://www.google.com/design/spec/components/snackbars-toasts.html)
+
+`paper-toast` provides a subtle notification toast. Only one `paper-toast` will
+be visible on screen.
+
+Use `opened` to show the toast:
+
+Example:
+
+```html
+<paper-toast text="Hello world!" opened></paper-toast>
+```
+
+Also `open()` or `show()` can be used to show the toast:
+
+Example:
+
+```html
+<paper-button on-click="openToast">Open Toast</paper-button>
+<paper-toast id="toast" text="Hello world!"></paper-toast>
+
+...
+
+openToast: function() {
+ this.$.toast.open();
+}
+```
+
+Set `duration` to 0, a negative number or Infinity to persist the toast on screen:
+
+Example:
+
+```html
+<paper-toast text="Terms and conditions" opened duration="0">
+ <a href="#">Show more</a>
+</paper-toast>
+```
+
+`<paper-toast>` is affected by the [stacking context](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context) of its container. Adding `<paper-toast>` inside elements that create a new stacking context - e.g. `<app-drawer>`, `<app-layout>` or `<iron-list>` - might result in toasts partially obstructed or clipped. Add `<paper-toast>` to the top level (`<body>`) element, outside the structure, e.g.:
+
+```html
+ <!-- ... -->
+ </app-drawer-layout>
+ <paper-toast id="toast"></paper-toast>
+</template>
+```
+
+You can then use custom events to communicate with it from within child components, using `addEventListener` and `dispatchEvent`.
+
+### Styling
+
+The following custom properties and mixins are available for styling:
+
+| Custom property | Description | Default |
+| --- | --- | --- |
+| `--paper-toast-background-color` | The paper-toast background-color | `#323232` |
+| `--paper-toast-color` | The paper-toast color | `#f1f1f1` |
+
+This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`.
+In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`.
+
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/bower.json
new file mode 100644
index 00000000000..960829653f7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/bower.json
@@ -0,0 +1,60 @@
+{
+ "name": "paper-toast",
+ "version": "2.1.1",
+ "description": "A material design notification toast",
+ "private": true,
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "toast",
+ "notification"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-toast.git"
+ },
+ "main": "paper-toast.html",
+ "dependencies": {
+ "iron-a11y-announcer": "PolymerElements/iron-a11y-announcer#1 - 2",
+ "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#1 - 2",
+ "iron-fit-behavior": "PolymerElements/iron-fit-behavior#1 - 2",
+ "polymer": "Polymer/polymer#1.9 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "paper-button": "PolymerElements/paper-button#1 - 2",
+ "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "iron-a11y-announcer": "PolymerElements/iron-a11y-announcer#^1.0.0",
+ "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#^1.0.9",
+ "iron-fit-behavior": "PolymerElements/iron-fit-behavior#^1.1.0",
+ "polymer": "Polymer/polymer#^1.9"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "paper-button": "PolymerElements/paper-button#^1.0.0",
+ "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "ignore": [],
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/demo/index.html
new file mode 100644
index 00000000000..06df145a59c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/demo/index.html
@@ -0,0 +1,96 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+
+<head>
+ <title>paper-toast</title>
+
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+ <meta name="mobile-web-app-capable" content="yes">
+ <meta name="apple-mobile-web-app-capable" content="yes">
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../paper-toast.html">
+ <link rel="import" href="../../paper-button/paper-button.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+
+ <custom-style><style is="custom-style" include="demo-pages-shared-styles"></style></custom-style>
+
+</head>
+
+<body unresolved class="centered">
+ <h3>Toast auto-closes after 3 seconds. Only one toast per time will be visible</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <paper-button raised onclick="toast0.open()">Default toast</paper-button>
+ <paper-toast id="toast0" text="This toast auto-closes after 3 seconds"></paper-toast>
+ </template>
+ </demo-snippet>
+
+ <h3>Toast does not auto-close when <code>duration</code> is negative, <code>0</code>, or <code>Infinity</code></h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <style>
+ .yellow-button {
+ text-transform: none;
+ color: #eeff41;
+ }
+ </style>
+
+ <paper-button raised onclick="toast1.open()">Persistent toast</paper-button>
+
+ <paper-toast id="toast1" duration="0" text="This toast will stay opened until you close it, or open another toast.">
+ <paper-button onclick="toast1.toggle()" class="yellow-button">Close now!</paper-button>
+ </paper-toast>
+ </template>
+ </demo-snippet>
+
+ <h3>Toast can be styled</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <custom-style><style is="custom-style">
+ #toast2 {
+ --paper-toast-background-color: red;
+ --paper-toast-color: white;
+ }
+ </style></custom-style>
+
+ <paper-button raised onclick="toast2.open()">Styled toast</paper-button>
+
+ <paper-toast id="toast2" class="fit-bottom" text="This toast is red and fits bottom!"></paper-toast>
+ </template>
+ </demo-snippet>
+
+ <h3>Toast can fit into any element</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <style>
+ #container {
+ padding: 100px;
+ border: 1px solid gray;
+ }
+ </style>
+ <div id="container">
+ <paper-button raised onclick="toast3.open()">Open toast</paper-button>
+ </div>
+ <paper-toast id="toast3" class="fit-bottom" text="This toast fits into the container."></paper-toast>
+
+ <script>
+ toast3.fitInto = container;
+ </script>
+
+ </template>
+ </demo-snippet>
+</body>
+
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/hero.svg b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/hero.svg
new file mode 100755
index 00000000000..bfdc1808bdd
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/hero.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">
+<g id="background" display="none">
+ <rect display="inline" fill="#B0BEC5" width="225" height="126"/>
+</g>
+<g id="label">
+</g>
+<g id="art">
+ <path d="M164,114H13V88h151V114z M15,112h147V90H15V112z"/>
+ <rect x="26" y="100" width="79" height="2"/>
+ <rect x="135" y="100" width="16" height="2"/>
+ <g id="ic_x5F_add_x0D_">
+ </g>
+</g>
+<g id="Guides">
+</g>
+</svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/index.html
new file mode 100644
index 00000000000..487bb5c38a5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/index.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/package-lock.json
new file mode 100644
index 00000000000..93e2a3e7e6e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/package-lock.json
@@ -0,0 +1,2388 @@
+{
+ "name": "@polymer/paper-toast",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.6.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.4.tgz",
+ "integrity": "sha512-Awg4BcUYiZtNKoveGOu654JVPt11V/KIC77iBz8NweyoOAZpz5rUJfPDwwD+ajfTs2HndbTCEB8IuLfX9m/mmw==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.44",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+ "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz",
+ "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.2",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.105",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.44",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.2",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/package.json
new file mode 100644
index 00000000000..8b9362b1455
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@polymer/paper-toast",
+ "private": true,
+ "description": "A material design notification toast",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-toast.git"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/paper-toast.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/paper-toast.d.ts
new file mode 100644
index 00000000000..ad3b8ee5850
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/paper-toast.d.ts
@@ -0,0 +1,151 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-toast.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-a11y-announcer/iron-a11y-announcer.d.ts" />
+/// <reference path="../iron-overlay-behavior/iron-overlay-behavior.d.ts" />
+
+/**
+ * Material design: [Snackbars & toasts](https://www.google.com/design/spec/components/snackbars-toasts.html)
+ *
+ * `paper-toast` provides a subtle notification toast. Only one `paper-toast` will
+ * be visible on screen.
+ *
+ * Use `opened` to show the toast:
+ *
+ * Example:
+ *
+ * <paper-toast text="Hello world!" opened></paper-toast>
+ *
+ * Also `open()` or `show()` can be used to show the toast:
+ *
+ * Example:
+ *
+ * <paper-button on-click="openToast">Open Toast</paper-button>
+ * <paper-toast id="toast" text="Hello world!"></paper-toast>
+ *
+ * ...
+ *
+ * openToast: function() {
+ * this.$.toast.open();
+ * }
+ *
+ * Set `duration` to 0, a negative number or Infinity to persist the toast on screen:
+ *
+ * Example:
+ *
+ * <paper-toast text="Terms and conditions" opened duration="0">
+ * <a href="#">Show more</a>
+ * </paper-toast>
+ *
+ *
+ * ### Styling
+ * The following custom properties and mixins are available for styling:
+ *
+ * Custom property | Description | Default
+ * ----------------|-------------|----------
+ * `--paper-toast-background-color` | The paper-toast background-color | `#323232`
+ * `--paper-toast-color` | The paper-toast color | `#f1f1f1`
+ *
+ * This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`.
+ * In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`.
+ */
+interface PaperToastElement extends Polymer.Element, Polymer.IronOverlayBehavior {
+
+ /**
+ * The element to fit `this` into.
+ * Overridden from `Polymer.IronFitBehavior`.
+ */
+ fitInto: object|null|undefined;
+
+ /**
+ * The orientation against which to align the dropdown content
+ * horizontally relative to `positionTarget`.
+ * Overridden from `Polymer.IronFitBehavior`.
+ */
+ horizontalAlign: string|null|undefined;
+
+ /**
+ * The orientation against which to align the dropdown content
+ * vertically relative to `positionTarget`.
+ * Overridden from `Polymer.IronFitBehavior`.
+ */
+ verticalAlign: string|null|undefined;
+
+ /**
+ * Overridden from `IronOverlayBehavior`.
+ * Set to true to disable auto-focusing the toast or child nodes with
+ * the `autofocus` attribute` when the overlay is opened.
+ */
+ noAutoFocus: boolean|null|undefined;
+
+ /**
+ * Overridden from `IronOverlayBehavior`.
+ * Set to false to enable closing of the toast by clicking outside it.
+ */
+ noCancelOnOutsideClick: boolean|null|undefined;
+
+ /**
+ * The duration in milliseconds to show the toast.
+ * Set to `0`, a negative number, or `Infinity`, to disable the
+ * toast auto-closing.
+ */
+ duration: number|null|undefined;
+
+ /**
+ * The text to display in the toast.
+ */
+ text: string|null|undefined;
+
+ /**
+ * Read-only. Deprecated. Use `opened` from `IronOverlayBehavior`.
+ */
+ readonly visible: any;
+
+ /**
+ * Read-only. Can auto-close if duration is a positive finite number.
+ */
+ readonly _canAutoClose: any;
+ created(): void;
+
+ /**
+ * Overridden from `IronOverlayBehavior`.
+ * Called when the value of `opened` changes.
+ */
+ _openedChanged(): void;
+
+ /**
+ * Overridden from `IronOverlayBehavior`.
+ */
+ _renderOpened(): void;
+
+ /**
+ * Overridden from `IronOverlayBehavior`.
+ */
+ _renderClosed(): void;
+
+ /**
+ * Show the toast. Without arguments, this is the same as `open()` from
+ * `IronOverlayBehavior`.
+ *
+ * @param properties Properties to be set before opening the toast.
+ * e.g. `toast.show('hello')` or `toast.show({text: 'hello', duration: 3000})`
+ */
+ show(properties?: object|string|null): void;
+
+ /**
+ * Hide the toast. Same as `close()` from `IronOverlayBehavior`.
+ */
+ hide(): void;
+}
+
+interface HTMLElementTagNameMap {
+ "paper-toast": PaperToastElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/paper-toast.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/paper-toast.html
new file mode 100644
index 00000000000..3a2db467f1b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toast/paper-toast.html
@@ -0,0 +1,299 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-a11y-announcer/iron-a11y-announcer.html">
+<link rel="import" href="../iron-overlay-behavior/iron-overlay-behavior.html">
+
+<!--
+Material design: [Snackbars & toasts](https://www.google.com/design/spec/components/snackbars-toasts.html)
+
+`paper-toast` provides a subtle notification toast. Only one `paper-toast` will
+be visible on screen.
+
+Use `opened` to show the toast:
+
+Example:
+
+ <paper-toast text="Hello world!" opened></paper-toast>
+
+Also `open()` or `show()` can be used to show the toast:
+
+Example:
+
+ <paper-button on-click="openToast">Open Toast</paper-button>
+ <paper-toast id="toast" text="Hello world!"></paper-toast>
+
+ ...
+
+ openToast: function() {
+ this.$.toast.open();
+ }
+
+Set `duration` to 0, a negative number or Infinity to persist the toast on screen:
+
+Example:
+
+ <paper-toast text="Terms and conditions" opened duration="0">
+ <a href="#">Show more</a>
+ </paper-toast>
+
+
+### Styling
+The following custom properties and mixins are available for styling:
+
+Custom property | Description | Default
+----------------|-------------|----------
+`--paper-toast-background-color` | The paper-toast background-color | `#323232`
+`--paper-toast-color` | The paper-toast color | `#f1f1f1`
+
+This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`.
+In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`.
+
+@group Paper Elements
+@element paper-toast
+@demo demo/index.html
+@hero hero.svg
+-->
+
+<dom-module id="paper-toast">
+ <template>
+ <style>
+ :host {
+ display: block;
+ position: fixed;
+ background-color: var(--paper-toast-background-color, #323232);
+ color: var(--paper-toast-color, #f1f1f1);
+ min-height: 48px;
+ min-width: 288px;
+ padding: 16px 24px;
+ box-sizing: border-box;
+ box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);
+ border-radius: 2px;
+ margin: 12px;
+ font-size: 14px;
+ cursor: default;
+ -webkit-transition: -webkit-transform 0.3s, opacity 0.3s;
+ transition: transform 0.3s, opacity 0.3s;
+ opacity: 0;
+ -webkit-transform: translateY(100px);
+ transform: translateY(100px);
+ @apply --paper-font-common-base;
+ }
+
+ :host(.capsule) {
+ border-radius: 24px;
+ }
+
+ :host(.fit-bottom) {
+ width: 100%;
+ min-width: 0;
+ border-radius: 0;
+ margin: 0;
+ }
+
+ :host(.paper-toast-open) {
+ opacity: 1;
+ -webkit-transform: translateY(0px);
+ transform: translateY(0px);
+ }
+ </style>
+
+ <span id="label">{{text}}</span>
+ <slot></slot>
+ </template>
+
+ <script>
+ (function() {
+ 'use strict';
+
+ // Keeps track of the toast currently opened.
+ var currentToast = null;
+
+ Polymer({
+ is: 'paper-toast',
+
+ behaviors: [Polymer.IronOverlayBehavior],
+
+ properties: {
+ /**
+ * The element to fit `this` into.
+ * Overridden from `Polymer.IronFitBehavior`.
+ */
+ fitInto: {type: Object, value: window, observer: '_onFitIntoChanged'},
+
+ /**
+ * The orientation against which to align the dropdown content
+ * horizontally relative to `positionTarget`.
+ * Overridden from `Polymer.IronFitBehavior`.
+ */
+ horizontalAlign: {type: String, value: 'left'},
+
+ /**
+ * The orientation against which to align the dropdown content
+ * vertically relative to `positionTarget`.
+ * Overridden from `Polymer.IronFitBehavior`.
+ */
+ verticalAlign: {type: String, value: 'bottom'},
+
+ /**
+ * The duration in milliseconds to show the toast.
+ * Set to `0`, a negative number, or `Infinity`, to disable the
+ * toast auto-closing.
+ */
+ duration: {type: Number, value: 3000},
+
+ /**
+ * The text to display in the toast.
+ */
+ text: {type: String, value: ''},
+
+ /**
+ * Overridden from `IronOverlayBehavior`.
+ * Set to false to enable closing of the toast by clicking outside it.
+ */
+ noCancelOnOutsideClick: {type: Boolean, value: true},
+
+ /**
+ * Overridden from `IronOverlayBehavior`.
+ * Set to true to disable auto-focusing the toast or child nodes with
+ * the `autofocus` attribute` when the overlay is opened.
+ */
+ noAutoFocus: {type: Boolean, value: true}
+ },
+
+ listeners: {'transitionend': '__onTransitionEnd'},
+
+ /**
+ * Read-only. Deprecated. Use `opened` from `IronOverlayBehavior`.
+ * @property visible
+ * @deprecated
+ */
+ get visible() {
+ Polymer.Base._warn('`visible` is deprecated, use `opened` instead');
+ return this.opened;
+ },
+
+ /**
+ * Read-only. Can auto-close if duration is a positive finite number.
+ * @property _canAutoClose
+ */
+ get _canAutoClose() {
+ return this.duration > 0 && this.duration !== Infinity;
+ },
+
+ created: function() {
+ this._autoClose = null;
+ Polymer.IronA11yAnnouncer.requestAvailability();
+ },
+
+ /**
+ * Show the toast. Without arguments, this is the same as `open()` from
+ * `IronOverlayBehavior`.
+ * @param {(Object|string)=} properties Properties to be set before opening the toast.
+ * e.g. `toast.show('hello')` or `toast.show({text: 'hello', duration: 3000})`
+ */
+ show: function(properties) {
+ if (typeof properties == 'string') {
+ properties = {text: properties};
+ }
+ for (var property in properties) {
+ if (property.indexOf('_') === 0) {
+ Polymer.Base._warn(
+ 'The property "' + property + '" is private and was not set.');
+ } else if (property in this) {
+ this[property] = properties[property];
+ } else {
+ Polymer.Base._warn('The property "' + property + '" is not valid.');
+ }
+ }
+ this.open();
+ },
+
+ /**
+ * Hide the toast. Same as `close()` from `IronOverlayBehavior`.
+ */
+ hide: function() {
+ this.close();
+ },
+
+ /**
+ * Called on transitions of the toast, indicating a finished animation
+ * @private
+ */
+ __onTransitionEnd: function(e) {
+ // there are different transitions that are happening when opening and
+ // closing the toast. The last one so far is for `opacity`.
+ // This marks the end of the transition, so we check for this to determine
+ // if this is the correct event.
+ if (e && e.target === this && e.propertyName === 'opacity') {
+ if (this.opened) {
+ this._finishRenderOpened();
+ } else {
+ this._finishRenderClosed();
+ }
+ }
+ },
+
+ /**
+ * Overridden from `IronOverlayBehavior`.
+ * Called when the value of `opened` changes.
+ */
+ _openedChanged: function() {
+ if (this._autoClose !== null) {
+ this.cancelAsync(this._autoClose);
+ this._autoClose = null;
+ }
+ if (this.opened) {
+ if (currentToast && currentToast !== this) {
+ currentToast.close();
+ }
+ currentToast = this;
+ this.fire('iron-announce', {text: this.text});
+ if (this._canAutoClose) {
+ this._autoClose = this.async(this.close, this.duration);
+ }
+ } else if (currentToast === this) {
+ currentToast = null;
+ }
+ Polymer.IronOverlayBehaviorImpl._openedChanged.apply(this, arguments);
+ },
+
+ /**
+ * Overridden from `IronOverlayBehavior`.
+ */
+ _renderOpened: function() {
+ this.classList.add('paper-toast-open');
+ },
+
+ /**
+ * Overridden from `IronOverlayBehavior`.
+ */
+ _renderClosed: function() {
+ this.classList.remove('paper-toast-open');
+ },
+
+ /**
+ * @private
+ */
+ _onFitIntoChanged: function(fitInto) {
+ this.positionTarget = fitInto;
+ }
+
+ /**
+ * Fired when `paper-toast` is opened.
+ *
+ * @event 'iron-announce'
+ * @param {{text: string}} detail Contains text that will be announced.
+ */
+ });
+ })();
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/.bower.json
new file mode 100644
index 00000000000..3a7e5aaef3e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/.bower.json
@@ -0,0 +1,70 @@
+{
+ "name": "paper-toggle-button",
+ "version": "2.1.1",
+ "description": "A material design toggle button control",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "toggle",
+ "control"
+ ],
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-toggle-button"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-toggle-button",
+ "main": "paper-toggle-button.html",
+ "ignore": [],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#1 - 2",
+ "paper-behaviors": "PolymerElements/paper-behaviors#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#^1.0.0",
+ "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.1.0"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ },
+ "_release": "2.1.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.1.1",
+ "commit": "f2825e1b736df465b4a172ac5d33ac655e9e0e80"
+ },
+ "_source": "https://github.com/PolymerElements/paper-toggle-button.git",
+ "_target": "^2.0.0",
+ "_originalSource": "paper-toggle-button"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/.github/CODEOWNERS
new file mode 100644
index 00000000000..0d8c0ad6b48
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @bicknellr
+/.travis.yml @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..f2323bdbb8c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/paper-toggle-button/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/.travis.yml
new file mode 100644
index 00000000000..6007c9468a7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/.travis.yml
@@ -0,0 +1,32 @@
+language: node_js
+sudo: required
+before_script:
+ - npm install -g polymer-cli
+ - polymer install --variants
+ - >-
+ npm run update-types && git diff --exit-code || (echo -e
+ '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+ update-types".' && false)
+ - >-
+ npm run format && git diff --exit-code || (echo -e '\n\033[31mERROR:\033[0m
+ Project is not formatted. Please run "npm run format".' && false)
+env:
+ global:
+ - secure: >-
+ Z9YLaTbrBSMCxoeqWI1cK5WFOfA1Cz4rCUhXo4l1WDnQBVcbVEQn6V7BsF9TByrTD4H4f4Gn2SZT8tKA7u5xVZn1I0djzpotogHzqOJ0zQi5krtNczTWIFe3F/fMnNxouAZxvAtkefdH+hXZJHwqlhoHYaoWw6kE7a9EYlV2x48=
+ - secure: >-
+ Gdkk92VJJPn8uZ3TRvzMd3tI2ilaqxcFePIVtgnMLc0SKUyYGgTmUghPJ1MDGXa152ejN4c9ydTrU68Wka9yAYRirR2K1W/i6ma4Lz7vX077IhufBjfuXMasP3X7OPGJhIdvHINkpEVrySO5kcDVjCXXq91utWv+2pRQSNdjNKQ=
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - >-
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+ fi
+dist: trusty
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/README.md
new file mode 100644
index 00000000000..9aae694a9a8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/README.md
@@ -0,0 +1,32 @@
+[![Build status](https://travis-ci.org/PolymerElements/paper-toggle-button.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-toggle-button)
+
+## &lt;paper-toggle-button&gt;
+
+Material design: [Switch](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-switch)
+
+`paper-toggle-button` provides a ON/OFF switch that user can toggle the state
+by tapping or by dragging the switch.
+
+<!---
+```
+<custom-element-demo>
+ <template>
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="paper-toggle-button.html">
+ <style is="custom-style">
+ #container {
+ padding: 16px;
+ display: flex;
+ }
+ </style>
+ <div id="container">
+ <next-code-block></next-code-block>
+ </div>
+ </template>
+</custom-element-demo>
+```
+-->
+```html
+<paper-toggle-button checked></paper-toggle-button>
+<paper-toggle-button disabled></paper-toggle-button>
+```
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/bower.json
new file mode 100644
index 00000000000..437832a5690
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/bower.json
@@ -0,0 +1,61 @@
+{
+ "name": "paper-toggle-button",
+ "version": "2.1.1",
+ "description": "A material design toggle button control",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "keywords": [
+ "web-components",
+ "polymer",
+ "toggle",
+ "control"
+ ],
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-toggle-button"
+ },
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "homepage": "https://github.com/PolymerElements/paper-toggle-button",
+ "main": "paper-toggle-button.html",
+ "ignore": [],
+ "dependencies": {
+ "polymer": "Polymer/polymer#1.9 - 2",
+ "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#1 - 2",
+ "paper-behaviors": "PolymerElements/paper-behaviors#1 - 2",
+ "paper-styles": "PolymerElements/paper-styles#1 - 2"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
+ "web-component-tester": "^6.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+ },
+ "variants": {
+ "1.x": {
+ "dependencies": {
+ "polymer": "Polymer/polymer#^1.9",
+ "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#^1.0.0",
+ "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
+ "paper-styles": "PolymerElements/paper-styles#^1.1.0"
+ },
+ "devDependencies": {
+ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+ "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ },
+ "resolutions": {
+ "webcomponentsjs": "^0.7"
+ }
+ }
+ },
+ "resolutions": {
+ "webcomponentsjs": "^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/demo/index.html
new file mode 100644
index 00000000000..b7c82c1d42f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/demo/index.html
@@ -0,0 +1,88 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+ <head>
+ <title>paper-toggle-button demo</title>
+
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+ <meta name="mobile-web-app-capable" content="yes">
+ <meta name="apple-mobile-web-app-capable" content="yes">
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../paper-styles/demo-pages.html">
+ <link rel="import" href="../paper-toggle-button.html">
+ </head>
+ <body unresolved>
+ <custom-style>
+ <style is="custom-style" include="demo-pages-shared-styles">
+ .vertical-section-container {
+ max-width: 500px;
+ }
+
+ paper-toggle-button {
+ margin-left: 10px;
+ margin-right: 10px;
+ }
+ </style>
+ </custom-style>
+
+ <div class="vertical-section-container centered">
+ <h3>Toggle buttons can be checked and disabled</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <paper-toggle-button>Toggle</paper-toggle-button>
+ <paper-toggle-button checked>Toggle</paper-toggle-button>
+ <paper-toggle-button disabled>Disabled</paper-toggle-button>
+ <paper-toggle-button invalid>Invalid</paper-toggle-button>
+ </template>
+ </demo-snippet>
+
+ <h3>Toggle buttons can hide the ripple effect using the <i>noink</i> attribute</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <paper-toggle-button noink>Toggle</paper-toggle-button>
+ </template>
+ </demo-snippet>
+
+ <h3>Toggle buttons can be styled using custom properties</h3>
+ <demo-snippet class="centered-demo">
+ <template>
+ <custom-style>
+ <style is="custom-style">
+ paper-toggle-button.green {
+ --paper-toggle-button-checked-bar-color: var(--paper-green-500);
+ --paper-toggle-button-checked-button-color: var(--paper-green-500);
+ --paper-toggle-button-checked-ink-color: var(--paper-green-500);
+ --paper-toggle-button-unchecked-bar-color: var(--paper-teal-500);
+ --paper-toggle-button-unchecked-button-color: var(--paper-teal-500);
+ --paper-toggle-button-unchecked-ink-color: var(--paper-teal-500);
+ }
+ paper-toggle-button.pink {
+ --paper-toggle-button-checked-bar-color: var(--paper-pink-500);
+ --paper-toggle-button-checked-button-color: var(--paper-pink-500);
+ --paper-toggle-button-checked-ink-color: var(--paper-pink-500);
+ --paper-toggle-button-unchecked-bar-color: var(--paper-indigo-900);
+ --paper-toggle-button-unchecked-button-color: var(--paper-indigo-900);
+ --paper-toggle-button-unchecked-ink-color: var(--paper-indigo-900);
+ }
+ </style>
+ </custom-style>
+
+ <paper-toggle-button class="green">Toggle</paper-toggle-button>
+ <paper-toggle-button checked class="pink">Toggle</paper-toggle-button>
+ </template>
+ </demo-snippet>
+ </div>
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/hero.svg b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/hero.svg
new file mode 100755
index 00000000000..21607b28280
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/hero.svg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">
+<g id="background" display="none">
+ <rect display="inline" fill="#B0BEC5" width="225" height="126"/>
+</g>
+<g id="label">
+</g>
+<g id="art">
+ <g>
+ <circle cx="123.8" cy="63" r="15.7"/>
+ <path d="M123,77H98.5c-7.7,0-14-6.3-14-14s6.3-14,14-14H123c7.7,0,14,6.3,14,14S130.7,77,123,77z M98.5,51c-6.6,0-12,5.4-12,12
+ s5.4,12,12,12H123c6.6,0,12-5.4,12-12s-5.4-12-12-12H98.5z"/>
+ </g>
+ <g id="ic_x5F_add_x0D_">
+ </g>
+</g>
+<g id="Guides">
+</g>
+</svg>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/index.html
new file mode 100644
index 00000000000..487bb5c38a5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/index.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/package-lock.json
new file mode 100644
index 00000000000..36b2f2f5b6b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/package-lock.json
@@ -0,0 +1,2388 @@
+{
+ "name": "@polymer/paper-toggle-button",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.1",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
+ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.6.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.4.tgz",
+ "integrity": "sha512-Awg4BcUYiZtNKoveGOu654JVPt11V/KIC77iBz8NweyoOAZpz5rUJfPDwwD+ajfTs2HndbTCEB8IuLfX9m/mmw==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.4"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+ "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.44",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+ "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "bower": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz",
+ "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ }
+ },
+ "clang-format": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz",
+ "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.3.2",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.2",
+ "parse5": "4.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz",
+ "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.1",
+ "micromatch": "3.1.10"
+ }
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "merge2": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz",
+ "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.105",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.44",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.2",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
+ "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.1.0",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "webmat": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/webmat/-/webmat-0.2.0.tgz",
+ "integrity": "sha512-xf2iHrssbbTofFwxvrdtgSxILQ8ledlpeDc76fNkTEL76gGnxCB/YA69UF498+UPfYIDvVnk9Qt2E7MJOApacA==",
+ "dev": true,
+ "requires": {
+ "clang-format": "1.2.3",
+ "dom5": "3.0.0",
+ "fast-glob": "2.2.0",
+ "parse5": "4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/package.json
new file mode 100644
index 00000000000..e38173eeb19
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@polymer/paper-toggle-button",
+ "private": true,
+ "description": "A material design toggle button control",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/PolymerElements/paper-toggle-button"
+ },
+ "license": "BSD-3-Clause",
+ "devDependencies": {
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "bower": "^1.8.0",
+ "webmat": "^0.2.0"
+ },
+ "scripts": {
+ "update-types": "bower install && gen-typescript-declarations --deleteExisting --outDir .",
+ "format": "webmat && npm run update-types"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/paper-toggle-button.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/paper-toggle-button.d.ts
new file mode 100644
index 00000000000..6584a2bb3d6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/paper-toggle-button.d.ts
@@ -0,0 +1,69 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * paper-toggle-button.html
+ */
+
+/// <reference path="../polymer/types/polymer.d.ts" />
+/// <reference path="../iron-flex-layout/iron-flex-layout.d.ts" />
+/// <reference path="../paper-styles/color.d.ts" />
+/// <reference path="../paper-styles/default-theme.d.ts" />
+/// <reference path="../paper-behaviors/paper-checked-element-behavior.d.ts" />
+
+/**
+ * Material design: [Switch](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-switch)
+ *
+ * `paper-toggle-button` provides a ON/OFF switch that user can toggle the state
+ * by tapping or by dragging the switch.
+ *
+ * Example:
+ *
+ * <paper-toggle-button></paper-toggle-button>
+ *
+ * ### Styling
+ *
+ * The following custom properties and mixins are available for styling:
+ *
+ * Custom property | Description | Default
+ * ----------------|-------------|----------
+ * `--paper-toggle-button-unchecked-bar-color` | Slider color when the input is not checked | `#000000`
+ * `--paper-toggle-button-unchecked-button-color` | Button color when the input is not checked | `--paper-grey-50`
+ * `--paper-toggle-button-unchecked-ink-color` | Selected/focus ripple color when the input is not checked | `--dark-primary-color`
+ * `--paper-toggle-button-checked-bar-color` | Slider button color when the input is checked | `--primary-color`
+ * `--paper-toggle-button-checked-button-color` | Button color when the input is checked | `--primary-color`
+ * `--paper-toggle-button-checked-ink-color` | Selected/focus ripple color when the input is checked | `--primary-color`
+ * `--paper-toggle-button-invalid-bar-color` | Slider button color when the input is invalid | `--error-color`
+ * `--paper-toggle-button-invalid-button-color` | Button color when the input is invalid | `--error-color`
+ * `--paper-toggle-button-invalid-ink-color` | Selected/focus ripple color when the input is invalid | `--error-color`
+ * `--paper-toggle-button-unchecked-bar` | Mixin applied to the slider when the input is not checked | `{}`
+ * `--paper-toggle-button-unchecked-button` | Mixin applied to the slider button when the input is not checked | `{}`
+ * `--paper-toggle-button-unchecked-ink` | Mixin applied to the ripple when the input is not checked | `{}`
+ * `--paper-toggle-button-checked-bar` | Mixin applied to the slider when the input is checked | `{}`
+ * `--paper-toggle-button-checked-button` | Mixin applied to the slider button when the input is checked | `{}`
+ * `--paper-toggle-button-checked-ink` | Mixin applied to the ripple when the input is checked | `{}`
+ * `--paper-toggle-button-label-color` | Label color | `--primary-text-color`
+ * `--paper-toggle-button-label-spacing` | Spacing between the label and the button | `8px`
+ *
+ * This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`.
+ * In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`.
+ */
+interface PaperToggleButtonElement extends Polymer.Element, Polymer.PaperCheckedElementBehavior {
+ attached(): void;
+
+ /**
+ * customize the element's ripple
+ */
+ _createRipple(): any;
+ _ontrack(event: any): void;
+ _trackStart(track: any): void;
+ _trackMove(track: any): void;
+ _trackEnd(track: any): void;
+}
+
+interface HTMLElementTagNameMap {
+ "paper-toggle-button": PaperToggleButtonElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/paper-toggle-button.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/paper-toggle-button.html
new file mode 100644
index 00000000000..b7f1f564e7f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/paper-toggle-button/paper-toggle-button.html
@@ -0,0 +1,280 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="../paper-styles/color.html">
+<link rel="import" href="../paper-styles/default-theme.html">
+<link rel="import" href="../paper-behaviors/paper-checked-element-behavior.html">
+
+<!--
+Material design: [Switch](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-switch)
+
+`paper-toggle-button` provides a ON/OFF switch that user can toggle the state
+by tapping or by dragging the switch.
+
+Example:
+
+ <paper-toggle-button></paper-toggle-button>
+
+### Styling
+
+The following custom properties and mixins are available for styling:
+
+Custom property | Description | Default
+----------------|-------------|----------
+`--paper-toggle-button-unchecked-bar-color` | Slider color when the input is not checked | `#000000`
+`--paper-toggle-button-unchecked-button-color` | Button color when the input is not checked | `--paper-grey-50`
+`--paper-toggle-button-unchecked-ink-color` | Selected/focus ripple color when the input is not checked | `--dark-primary-color`
+`--paper-toggle-button-checked-bar-color` | Slider button color when the input is checked | `--primary-color`
+`--paper-toggle-button-checked-button-color` | Button color when the input is checked | `--primary-color`
+`--paper-toggle-button-checked-ink-color` | Selected/focus ripple color when the input is checked | `--primary-color`
+`--paper-toggle-button-invalid-bar-color` | Slider button color when the input is invalid | `--error-color`
+`--paper-toggle-button-invalid-button-color` | Button color when the input is invalid | `--error-color`
+`--paper-toggle-button-invalid-ink-color` | Selected/focus ripple color when the input is invalid | `--error-color`
+`--paper-toggle-button-unchecked-bar` | Mixin applied to the slider when the input is not checked | `{}`
+`--paper-toggle-button-unchecked-button` | Mixin applied to the slider button when the input is not checked | `{}`
+`--paper-toggle-button-unchecked-ink` | Mixin applied to the ripple when the input is not checked | `{}`
+`--paper-toggle-button-checked-bar` | Mixin applied to the slider when the input is checked | `{}`
+`--paper-toggle-button-checked-button` | Mixin applied to the slider button when the input is checked | `{}`
+`--paper-toggle-button-checked-ink` | Mixin applied to the ripple when the input is checked | `{}`
+`--paper-toggle-button-label-color` | Label color | `--primary-text-color`
+`--paper-toggle-button-label-spacing` | Spacing between the label and the button | `8px`
+
+This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`.
+In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`.
+
+@group Paper Elements
+@element paper-toggle-button
+@hero hero.svg
+@demo demo/index.html
+-->
+
+<dom-module id="paper-toggle-button">
+ <template strip-whitespace>
+
+ <style>
+ :host {
+ display: inline-block;
+ @apply --layout-horizontal;
+ @apply --layout-center;
+ @apply --paper-font-common-base;
+ }
+
+ :host([disabled]) {
+ pointer-events: none;
+ }
+
+ :host(:focus) {
+ outline:none;
+ }
+
+ .toggle-bar {
+ position: absolute;
+ height: 100%;
+ width: 100%;
+ border-radius: 8px;
+ pointer-events: none;
+ opacity: 0.4;
+ transition: background-color linear .08s;
+ background-color: var(--paper-toggle-button-unchecked-bar-color, #000000);
+
+ @apply --paper-toggle-button-unchecked-bar;
+ }
+
+ .toggle-button {
+ position: absolute;
+ top: -3px;
+ left: 0;
+ height: 20px;
+ width: 20px;
+ border-radius: 50%;
+ box-shadow: 0 1px 5px 0 rgba(0, 0, 0, 0.6);
+ transition: -webkit-transform linear .08s, background-color linear .08s;
+ transition: transform linear .08s, background-color linear .08s;
+ will-change: transform;
+ background-color: var(--paper-toggle-button-unchecked-button-color, var(--paper-grey-50));
+
+ @apply --paper-toggle-button-unchecked-button;
+ }
+
+ .toggle-button.dragging {
+ -webkit-transition: none;
+ transition: none;
+ }
+
+ :host([checked]:not([disabled])) .toggle-bar {
+ opacity: 0.5;
+ background-color: var(--paper-toggle-button-checked-bar-color, var(--primary-color));
+
+ @apply --paper-toggle-button-checked-bar;
+ }
+
+ :host([disabled]) .toggle-bar {
+ background-color: #000;
+ opacity: 0.12;
+ }
+
+ :host([checked]) .toggle-button {
+ -webkit-transform: translate(16px, 0);
+ transform: translate(16px, 0);
+ }
+
+ :host([checked]:not([disabled])) .toggle-button {
+ background-color: var(--paper-toggle-button-checked-button-color, var(--primary-color));
+
+ @apply --paper-toggle-button-checked-button;
+ }
+
+ :host([disabled]) .toggle-button {
+ background-color: #bdbdbd;
+ opacity: 1;
+ }
+
+ .toggle-ink {
+ position: absolute;
+ top: -14px;
+ left: -14px;
+ right: auto;
+ bottom: auto;
+ width: 48px;
+ height: 48px;
+ opacity: 0.5;
+ pointer-events: none;
+ color: var(--paper-toggle-button-unchecked-ink-color, var(--primary-text-color));
+
+ @apply --paper-toggle-button-unchecked-ink;
+ }
+
+ :host([checked]) .toggle-ink {
+ color: var(--paper-toggle-button-checked-ink-color, var(--primary-color));
+
+ @apply --paper-toggle-button-checked-ink;
+ }
+
+ .toggle-container {
+ display: inline-block;
+ position: relative;
+ width: 36px;
+ height: 14px;
+ /* The toggle button has an absolute position of -3px; The extra 1px
+ /* accounts for the toggle button shadow box. */
+ margin: 4px 1px;
+ }
+
+ .toggle-label {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+ padding-left: var(--paper-toggle-button-label-spacing, 8px);
+ pointer-events: none;
+ color: var(--paper-toggle-button-label-color, var(--primary-text-color));
+ }
+
+ /* invalid state */
+ :host([invalid]) .toggle-bar {
+ background-color: var(--paper-toggle-button-invalid-bar-color, var(--error-color));
+ }
+
+ :host([invalid]) .toggle-button {
+ background-color: var(--paper-toggle-button-invalid-button-color, var(--error-color));
+ }
+
+ :host([invalid]) .toggle-ink {
+ color: var(--paper-toggle-button-invalid-ink-color, var(--error-color));
+ }
+ </style>
+
+ <div class="toggle-container">
+ <div id="toggleBar" class="toggle-bar"></div>
+ <div id="toggleButton" class="toggle-button"></div>
+ </div>
+
+ <div class="toggle-label"><slot></slot></div>
+
+ </template>
+
+ <script>
+ Polymer({
+ is: 'paper-toggle-button',
+
+ behaviors: [Polymer.PaperCheckedElementBehavior],
+
+ /** @private */
+ hostAttributes: {role: 'button', 'aria-pressed': 'false', tabindex: 0},
+
+ properties: {
+ /**
+ * Fired when the checked state changes due to user interaction.
+ *
+ * @event change
+ */
+ /**
+ * Fired when the checked state changes.
+ *
+ * @event iron-change
+ */
+ },
+
+ listeners: {track: '_ontrack'},
+
+ attached: function() {
+ Polymer.RenderStatus.afterNextRender(this, function() {
+ Polymer.Gestures.setTouchAction(this, 'pan-y');
+ });
+ },
+
+ _ontrack: function(event) {
+ var track = event.detail;
+ if (track.state === 'start') {
+ this._trackStart(track);
+ } else if (track.state === 'track') {
+ this._trackMove(track);
+ } else if (track.state === 'end') {
+ this._trackEnd(track);
+ }
+ },
+
+ _trackStart: function(track) {
+ this._width = this.$.toggleBar.offsetWidth / 2;
+ /*
+ * keep an track-only check state to keep the dragging behavior smooth
+ * while toggling activations
+ */
+ this._trackChecked = this.checked;
+ this.$.toggleButton.classList.add('dragging');
+ },
+
+ _trackMove: function(track) {
+ var dx = track.dx;
+ this._x = Math.min(
+ this._width, Math.max(0, this._trackChecked ? this._width + dx : dx));
+ this.translate3d(this._x + 'px', 0, 0, this.$.toggleButton);
+ this._userActivate(this._x > (this._width / 2));
+ },
+
+ _trackEnd: function(track) {
+ this.$.toggleButton.classList.remove('dragging');
+ this.transform('', this.$.toggleButton);
+ },
+
+ // customize the element's ripple
+ _createRipple: function() {
+ this._rippleContainer = this.$.toggleButton;
+ var ripple = Polymer.PaperRippleBehavior._createRipple();
+ ripple.id = 'ink';
+ ripple.setAttribute('recenters', '');
+ ripple.classList.add('circle', 'toggle-ink');
+ return ripple;
+ }
+
+ });
+ </script>
+</dom-module>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/.bower.json
new file mode 100644
index 00000000000..7fcc39951e4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/.bower.json
@@ -0,0 +1,47 @@
+{
+ "name": "polymer-redux",
+ "authors": [
+ "Christopher Turner <turner296@gmail.com>"
+ ],
+ "description": "Polymer bindings for Redux.",
+ "main": "polymer-redux.html",
+ "moduleType": [
+ "amd",
+ "globals",
+ "node"
+ ],
+ "keywords": [
+ "redux",
+ "polymer",
+ "reducer",
+ "state",
+ "web-components"
+ ],
+ "license": "MIT",
+ "homepage": "https://github.com/tur-nr/polymer-redux",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests"
+ ],
+ "dependencies": {
+ "polymer": "^2.0.0"
+ },
+ "devDependencies": {
+ "web-component-tester": "^6.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^2.0.0",
+ "vaadin-combo-box": "^2.0.0-alpha4"
+ },
+ "version": "1.0.5",
+ "_release": "1.0.5",
+ "_resolution": {
+ "type": "version",
+ "tag": "v1.0.5",
+ "commit": "c587d5e12776e28e7c32bb6a182b228a2f115842"
+ },
+ "_source": "https://github.com/tur-nr/polymer-redux.git",
+ "_target": "^1.0.0",
+ "_originalSource": "polymer-redux"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/LICENSE b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/LICENSE
new file mode 100644
index 00000000000..616a8a8dc34
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2017 Christopher Turner
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/bower.json
new file mode 100644
index 00000000000..edd90f4b59a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/bower.json
@@ -0,0 +1,37 @@
+{
+ "name": "polymer-redux",
+ "authors": [
+ "Christopher Turner <turner296@gmail.com>"
+ ],
+ "description": "Polymer bindings for Redux.",
+ "main": "polymer-redux.html",
+ "moduleType": [
+ "amd",
+ "globals",
+ "node"
+ ],
+ "keywords": [
+ "redux",
+ "polymer",
+ "reducer",
+ "state",
+ "web-components"
+ ],
+ "license": "MIT",
+ "homepage": "https://github.com/tur-nr/polymer-redux",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests"
+ ],
+ "dependencies": {
+ "polymer": "^2.0.0"
+ },
+ "devDependencies": {
+ "web-component-tester": "^6.0.0",
+ "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^2.0.0",
+ "vaadin-combo-box": "^2.0.0-alpha4"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/async.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/async.html
new file mode 100644
index 00000000000..303f4338f1d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/async.html
@@ -0,0 +1,123 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Polymer Redux, Async Demo</title>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <script src="../../../node_modules/redux/dist/redux.js"></script>
+ <script src="../../../node_modules/redux-thunk/dist/redux-thunk.js"></script>
+
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+
+ <link rel="import" href="../polymer-redux.html">
+
+ <style is="custom-style" include="demo-pages-shared-styles">
+ </style>
+ </head>
+ <body>
+
+ <div class="vertical-section-container">
+ <h3>Polymer Redux, Async Demo</h3>
+ <demo-snippet>
+ <template>
+ <!-- redux setup -->
+ <script>
+ var reducer = function(state, action) {
+ state = state || { counter: 0 };
+ var counter = state.counter;
+ if (action.type === 'INCREMENT') {
+ ++counter;
+ } else if (action.type === 'DOUBLE') {
+ counter += counter;
+ }
+ return {
+ counter: counter,
+ };
+ };
+ var store = Redux.createStore(
+ reducer,
+ Redux.applyMiddleware(ReduxThunk.default)
+ );
+ var ReduxBehavior = PolymerRedux(store);
+ var AsyncBehavior = {
+ actions: {
+ double: function() {
+ return function(dispatch) {
+ setTimeout(function() {
+ dispatch({ type: 'DOUBLE' });
+ }, 1000);
+ };
+ }
+ },
+ };
+ </script>
+
+ <!-- friends list module -->
+ <dom-module id="x-counter">
+ <template>
+ <p>
+ Counter value:
+ <span>[[counter]]</span>
+ </p>
+ <button on-click="incrementClick">Increment</button>
+ <button on-click="increment200Click">Increment (0.2s)</button>
+ <button on-click="increment500Click">Increment (0.5s)</button>
+ <button on-click="increment1000Click">Increment (1.0s)</button>
+ <button on-click="double1000Click">Double (1.0s)</button>
+ </template>
+ <script>
+ Polymer({
+ is: 'x-counter',
+ behaviors: [ ReduxBehavior, AsyncBehavior ],
+ actions: {
+ increment: function(ms) {
+ if (ms) {
+ return function(dispatch) {
+ setTimeout(function() {
+ return dispatch('increment');
+ }, ms);
+ };
+ }
+ return {
+ type: 'INCREMENT',
+ };
+ }
+ },
+ properties: {
+ counter: {
+ type: Number,
+ statePath: 'counter',
+ }
+ },
+ incrementClick: function() {
+ return this.dispatch('increment');
+ },
+ increment200Click: function() {
+ return this.dispatch('increment', 200);
+ },
+ increment500Click: function() {
+ return this.dispatch('increment', 500);
+ },
+ increment1000Click: function() {
+ return this.dispatch(function(dispatch) {
+ setTimeout(function() {
+ dispatch('increment');
+ }, 1000);
+ });
+ },
+ double1000Click: function() {
+ this.dispatch('double');
+ }
+ });
+ </script>
+ </dom-module>
+
+ <!-- demo -->
+ <x-counter></x-counter>
+ </template>
+ </demo-snippet>
+ </div>
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/behaviors.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/behaviors.html
new file mode 100644
index 00000000000..5d5d29d033a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/behaviors.html
@@ -0,0 +1,84 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Polymer Redux, Behaviors Demo</title>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <script src="../../../node_modules/redux/dist/redux.js"></script>
+
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+
+ <link rel="import" href="../polymer-redux.html">
+
+ <style is="custom-style" include="demo-pages-shared-styles">
+ </style>
+ </head>
+ <body>
+
+ <div class="vertical-section-container">
+ <h3>Polymer Redux, Behaviors Demo</h3>
+ <demo-snippet>
+ <template>
+ <!-- redux setup -->
+ <script>
+ const reducer = (state, action) => {
+ return {
+ foo: 'i am foo',
+ bar: 'i am bar',
+ baz: 'i am baz'
+ }
+ }
+ const store = Redux.createStore(reducer);
+ const ReduxBehavior = PolymerRedux(store);
+
+ const FooBarBehavior = {
+ properties: {
+ foo: {
+ type: String,
+ statePath: 'bar'
+ },
+ bar: {
+ type: String,
+ statePath: 'bar'
+ }
+ }
+ };
+
+ const CombinedBehavior = [ReduxBehavior, FooBarBehavior];
+ </script>
+
+ <!-- friends list module -->
+ <dom-module id="behavior-demo">
+ <template>
+ <p>Foo: <em>[[foo]]</em></p>
+ <p>Bar: <em>[[bar]]</em></p>
+ <p>Baz: <em>[[baz]]</em></p>
+ </template>
+ <script>
+ Polymer({
+ is: 'behavior-demo',
+ behaviors: [ CombinedBehavior ],
+ properties: {
+ foo: {
+ type: String,
+ statePath: 'foo'
+ },
+ baz: {
+ type: String,
+ notify: true,
+ statePath: 'baz'
+ }
+ }
+ });
+ </script>
+ </dom-module>
+
+ <!-- demo -->
+ <behavior-demo></behavior-demo>
+ </template>
+ </demo-snippet>
+ </div>
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/index.html
new file mode 100644
index 00000000000..2ca6916ccf5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/index.html
@@ -0,0 +1,32 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <title>polymer-redux Demo</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="./message-mixin.html">
+ </head>
+ <body>
+ <dom-module id="my-element">
+ <template>
+ <p>[[message]]</p>
+ <button on-click="handleUpdateMessage">Update message</button>
+ </template>
+ <script>
+ class MyElement extends MessageMixin(Polymer.Element) {
+ static get is() { return 'my-element'; }
+
+ handleUpdateMessage() {
+ this.dispatch('updateMessage', 'Nothing changes by staying the same, quite literally.');
+ }
+ }
+ window.customElements.define(MyElement.is, MyElement);
+ </script>
+ </dom-module>
+ <my-element></my-element>
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/message-mixin.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/message-mixin.html
new file mode 100644
index 00000000000..661906a0c12
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/message-mixin.html
@@ -0,0 +1,24 @@
+<link rel="import" href="./redux-mixin.html">
+<script>
+ MessageMixin = Parent => class MessageMixin extends ReduxMixin(Parent) {
+ static get properties() {
+ return {
+ message: {
+ type: String,
+ statePath: 'message'
+ }
+ };
+ }
+
+ static get actions() {
+ return {
+ updateMessage(message) {
+ return {
+ type: 'UPDATE_MESSAGE',
+ message
+ }
+ }
+ };
+ }
+ };
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/observing.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/observing.html
new file mode 100644
index 00000000000..c2f85c5f35b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/observing.html
@@ -0,0 +1,70 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+ <title>polymer-redux Demo</title>
+
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+ <link rel="import" href="./redux-mixin.html">
+ </head>
+ <body>
+ <dom-module id="parent-element">
+ <template>
+ <child-element bar="{{foo}}"></child-element>
+ </template>
+ <script>
+ class ParentElement extends ReduxMixin(Polymer.Element) {
+ static get is() { return 'parent-element'; }
+
+ static get properties() {
+ return {
+ foo: {
+ type: String,
+ observer: '_observeFoo'
+ },
+ baz: {
+ type: String,
+ statePath: 'foo'
+ }
+ };
+ }
+
+ _observeFoo(current, previous) {
+ console.assert(this.baz !== undefined);
+ }
+ }
+ window.customElements.define(ParentElement.is, ParentElement);
+ </script>
+ </dom-module>
+ <dom-module id="child-element">
+ <script>
+ class ChildElement extends ReduxMixin(Polymer.Element) {
+ static get is() { return 'child-element'; }
+
+ static get properties() {
+ return {
+ foo: {
+ type: String,
+ statePath: 'message',
+ observer: '_observeFoo'
+ },
+ bar: {
+ type: String,
+ notify: true,
+ }
+ };
+ }
+
+ _observeFoo(current, previous) {
+ this.bar = this.foo;
+ }
+ }
+ window.customElements.define(ChildElement.is, ChildElement);
+ </script>
+ </dom-module>
+ <parent-element></parent-element>
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/ready-state.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/ready-state.html
new file mode 100644
index 00000000000..0ccaa93367d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/ready-state.html
@@ -0,0 +1,94 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Polymer Redux, Ready State</title>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+ <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+ <script src="../../../node_modules/redux/dist/redux.js"></script>
+
+ <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
+ <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+ <link rel="import" href="../../vaadin-combo-box/vaadin-combo-box.html">
+
+ <link rel="import" href="../polymer-redux.html">
+
+ <style is="custom-style" include="demo-pages-shared-styles">
+ </style>
+ </head>
+ <body>
+
+ <div class="vertical-section-container">
+ <h3>Polymer Redux, Ready State</h3>
+ <demo-snippet>
+ <template>
+ <!-- friends list module -->
+ <dom-module id="friend-picker">
+ <template>
+ <h3>Choose a Friend:</h3>
+ <vaadin-combo-box id="friend-list"
+ items="[[list]]"
+ on-change="onFriendChange">
+ </vaadin-combo-box>
+ <template is="dom-if" if="[[friend]]">
+ <p>You choose: [[friend]].</p>
+ </template>
+ </template>
+ </dom-module>
+ <!-- demo -->
+ <friend-picker></friend-picker>
+ </template>
+ </demo-snippet>
+ <script>
+ // redux setup
+ const initialState = {
+ friends: ['Adam', 'Beth', 'Carl', 'Denise'],
+ chosenFriend: 'Beth',
+ };
+ const reducer = (state, action) => {
+ if (!state) return initialState;
+
+ switch (action.type) {
+ case 'CHOOSE_FRIEND':
+ return Object.assign({}, state, {
+ chosenFriend: action.friend
+ });
+ }
+
+ return state;
+ }
+ const store = Redux.createStore(
+ reducer,
+ window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
+ );
+ const ReduxBehavior = PolymerRedux(store);
+
+ Polymer({
+ is: 'friend-picker',
+ behaviors: [ ReduxBehavior ],
+ properties: {
+ list: {
+ type: Array,
+ statePath: 'friends'
+ },
+ friend: {
+ type: String,
+ statePath: 'chosenFriend'
+ }
+ },
+ actions: {
+ chooseFriend: function(friend) {
+ return {
+ type: 'CHOOSE_FRIEND',
+ friend: friend
+ };
+ }
+ },
+ onFriendChange: function() {
+ this.dispatch('chooseFriend', this.$['friend-list'].value);
+ }
+ });
+ </script>
+ </div>
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/redux-mixin.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/redux-mixin.html
new file mode 100644
index 00000000000..01902220aec
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/demo/redux-mixin.html
@@ -0,0 +1,22 @@
+<link rel="import" href="../polymer-redux.html">
+<script src="../node_modules/redux/dist/redux.js"></script>
+<script>
+ const initial = {
+ message: 'Hello from PolymerRedux',
+ foo: 'I am a Foo',
+ bar: 'I just got Bar\'d'
+ };
+ const reducer = (state = initial, action) => {
+ switch (action.type) {
+ case 'UPDATE_MESSAGE':
+ return Object.assign({}, state, {
+ message: action.message
+ });
+
+ default:
+ return state;
+ }
+ };
+ const store = Redux.createStore(reducer);
+ ReduxMixin = PolymerRedux(store);
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/dist/polymer-redux.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/dist/polymer-redux.html
new file mode 100644
index 00000000000..fd592d46a0d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/dist/polymer-redux.html
@@ -0,0 +1,256 @@
+<script type="text/javascript">var PolymerRedux = (function () {
+'use strict';
+
+var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+var win;
+
+if (typeof window !== "undefined") {
+ win = window;
+} else if (typeof commonjsGlobal !== "undefined") {
+ win = commonjsGlobal;
+} else if (typeof self !== "undefined") {
+ win = self;
+} else {
+ win = {};
+}
+
+var window_1 = win;
+
+var console_1 = console;
+
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+
+// Expose globals
+var CustomEvent = window_1.CustomEvent;
+var Polymer = window_1.Polymer;
+
+/**
+ * Polymer Redux
+ *
+ * Creates a Class mixin for decorating Elements with a given Redux store.
+ *
+ * @polymerMixin
+ *
+ * @param {Object} store Redux store.
+ * @return {Function} Class mixin.
+ */
+
+function PolymerRedux(store) {
+ if (!store) {
+ throw new TypeError('PolymerRedux: expecting a redux store.');
+ } else if (!['getState', 'dispatch', 'subscribe'].every(function (k) {
+ return typeof store[k] === 'function';
+ })) {
+ throw new TypeError('PolymerRedux: invalid store object.');
+ }
+
+ var subscribers = new Map();
+
+ /**
+ * Binds element's properties to state changes from the Redux store.
+ *
+ * @example
+ * const update = bind(el, props) // set bindings
+ * update(state) // manual update
+ *
+ * @private
+ * @param {HTMLElement} element
+ * @param {Object} properties
+ * @return {Function} Update function.
+ */
+ var bind = function bind(element, properties) {
+ var bindings = Object.keys(properties).filter(function (name) {
+ var property = properties[name];
+ if (Object.prototype.hasOwnProperty.call(property, 'statePath')) {
+ if (!property.readOnly && property.notify) {
+ console_1.warn('PolymerRedux: <' + element.constructor.is + '>.' + name + ' has "notify" enabled, two-way bindings goes against Redux\'s paradigm');
+ }
+ return true;
+ }
+ return false;
+ });
+
+ /**
+ * Updates an element's properties with the given state.
+ *
+ * @private
+ * @param {Object} state
+ */
+ var update = function update(state) {
+ var propertiesChanged = false;
+ bindings.forEach(function (name) {
+ // Perhaps .reduce() to a boolean?
+ var statePath = properties[name].statePath;
+
+ var value = typeof statePath === 'function' ? statePath.call(element, state) : Polymer.Path.get(state, statePath);
+
+ var changed = element._setPendingPropertyOrPath(name, value, true);
+ propertiesChanged = propertiesChanged || changed;
+ });
+ if (propertiesChanged) {
+ element._invalidateProperties();
+ }
+ };
+
+ // Redux listener
+ var unsubscribe = store.subscribe(function () {
+ var detail = store.getState();
+ update(detail);
+
+ element.dispatchEvent(new CustomEvent('state-changed', { detail: detail }));
+ });
+
+ subscribers.set(element, unsubscribe);
+ update(store.getState());
+
+ return update;
+ };
+
+ /**
+ * Unbinds an element from state changes in the Redux store.
+ *
+ * @private
+ * @param {HTMLElement} element
+ */
+ var unbind = function unbind(element) {
+ var off = subscribers.get(element);
+ if (typeof off === 'function') {
+ off();
+ }
+ };
+
+ /**
+ * Merges a property's object value using the defaults way.
+ *
+ * @private
+ * @param {Object} what Initial prototype
+ * @param {String} which Property to collect.
+ * @return {Object} the collected values
+ */
+ var collect = function collect(what, which) {
+ var res = {};
+ while (what) {
+ res = _extends({}, what[which], res); // Respect prototype priority
+ what = Object.getPrototypeOf(what);
+ }
+ return res;
+ };
+
+ /**
+ * ReduxMixin
+ *
+ * @example
+ * const ReduxMixin = PolymerRedux(store)
+ * class Foo extends ReduxMixin(Polymer.Element) { }
+ *
+ * @polymerMixinClass
+ *
+ * @param {Polymer.Element} parent The polymer parent element.
+ * @return {Function} PolymerRedux mixed class.
+ */
+ return function (parent) {
+ return class ReduxMixin extends parent {
+ constructor() {
+ super();
+
+ // Collect the action creators first as property changes trigger
+ // dispatches from observers, see #65, #66, #67
+ var actions = collect(this.constructor, 'actions');
+ Object.defineProperty(this, '_reduxActions', {
+ configurable: true,
+ value: actions
+ });
+ }
+
+ connectedCallback() {
+ var properties = collect(this.constructor, 'properties');
+ bind(this, properties);
+ super.connectedCallback();
+ }
+
+ disconnectedCallback() {
+ unbind(this);
+ super.disconnectedCallback();
+ }
+
+ /**
+ * Dispatches an action to the Redux store.
+ *
+ * @example
+ * element.dispatch({ type: 'ACTION' })
+ *
+ * @example
+ * element.dispatch('actionCreator', 'foo', 'bar')
+ *
+ * @example
+ * element.dispatch((dispatch) => {
+ * dispatch({ type: 'MIDDLEWARE'})
+ * })
+ *
+ * @param {...*} args
+ * @return {Object} The action.
+ */
+ dispatch() {
+ var _this = this;
+
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ var actions = this._reduxActions;
+
+ // Action creator
+ var action = args[0];
+
+ if (typeof action === 'string') {
+ if (typeof actions[action] !== 'function') {
+ throw new TypeError('PolymerRedux: <' + this.constructor.is + '> invalid action creator "' + action + '"');
+ }
+ action = actions[action].apply(actions, _toConsumableArray(args.slice(1)));
+ }
+
+ // Proxy async dispatch
+ if (typeof action === 'function') {
+ var originalAction = action;
+ action = function action() {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ // Replace redux dispatch
+ args.splice(0, 1, function () {
+ return _this.dispatch.apply(_this, arguments);
+ });
+ return originalAction.apply(undefined, args);
+ };
+
+ // Copy props from the original action to the proxy.
+ // see https://github.com/tur-nr/polymer-redux/issues/98
+ Object.keys(originalAction).forEach(function (prop) {
+ action[prop] = originalAction[prop];
+ });
+ }
+
+ return store.dispatch(action);
+ }
+
+ /**
+ * Gets the current state in the Redux store.
+ *
+ * @return {*}
+ */
+ getState() {
+ return store.getState();
+ }
+ };
+ };
+}
+
+return PolymerRedux;
+
+}());
+</script>
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/gulpfile.babel.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/gulpfile.babel.js
new file mode 100644
index 00000000000..b7d9f51e0e7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/gulpfile.babel.js
@@ -0,0 +1,80 @@
+import {writeFile, mkdirSync} from 'fs';
+import gulp from 'gulp';
+import del from 'del';
+import sequence from 'run-sequence';
+import {rollup} from 'rollup';
+import nodeResolve from 'rollup-plugin-node-resolve';
+import commonjs from 'rollup-plugin-commonjs';
+import babelRollup from 'rollup-plugin-babel';
+import {Bundler} from 'polymer-bundler';
+import {serialize} from 'parse5';
+import pify from 'pify';
+
+gulp.task('default', ['dist']);
+
+gulp.task('clean', () => del(['lib', 'dist']));
+
+gulp.task('build', done => sequence(['clean'], ['build:lib', 'build:copy'], done));
+
+gulp.task('build:lib', () => {
+ return rollup({
+ entry: 'src/index.js',
+ plugins: [
+ nodeResolve({
+ jsnext: true,
+ main: true
+ }),
+ commonjs({
+ include: 'node_modules/**'
+ }),
+ babelRollup({
+ babelrc: false,
+ presets: [['env', {
+ targets: {
+ browsers: [
+ 'last 2 versions',
+ 'not ie 10'
+ ]
+ },
+ modules: false,
+ exclude: [
+ 'transform-es2015-classes'
+ ]
+ }]],
+ plugins: [
+ 'transform-object-assign'
+ ]
+ })
+ ]
+ }).then(bundle => {
+ return bundle.write({
+ format: 'iife',
+ moduleName: 'PolymerRedux',
+ dest: 'lib/index.js'
+ });
+ });
+});
+
+gulp.task('build:copy', () => gulp.src(['src/**.html']).pipe(gulp.dest('lib')));
+
+gulp.task('dist', ['build'], () => {
+ const entry = 'lib/index.html';
+ const b = new Bundler({
+ inlineScripts: true
+ });
+
+ return b.generateManifest([entry])
+ .then(manifest => b.bundle(manifest))
+ .then(bundles => {
+ const {ast} = bundles.documents.get(entry);
+ const html = serialize(ast);
+
+ mkdirSync('dist');
+
+ return pify(writeFile)('dist/polymer-redux.html', `${html}\n`);
+ });
+});
+
+gulp.task('develop', ['dist'], () => {
+ gulp.watch(['src/**/*'], ['dist']);
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/index.html
new file mode 100644
index 00000000000..4a18039f5fc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/index.html
@@ -0,0 +1,14 @@
+<!doctype html>
+
+<html>
+ <head>
+ <title>polymer-redux</title>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+ </head>
+ <body>
+ <iron-component-page src="polymer-redux.html"></iron-component-page>
+ </body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/lib/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/lib/index.html
new file mode 100644
index 00000000000..62550945d54
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/lib/index.html
@@ -0,0 +1 @@
+<script type="text/javascript" src="index.js"></script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/lib/index.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/lib/index.js
new file mode 100644
index 00000000000..528f8746918
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/lib/index.js
@@ -0,0 +1,254 @@
+var PolymerRedux = (function () {
+'use strict';
+
+var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+var win;
+
+if (typeof window !== "undefined") {
+ win = window;
+} else if (typeof commonjsGlobal !== "undefined") {
+ win = commonjsGlobal;
+} else if (typeof self !== "undefined") {
+ win = self;
+} else {
+ win = {};
+}
+
+var window_1 = win;
+
+var console_1 = console;
+
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+
+// Expose globals
+var CustomEvent = window_1.CustomEvent;
+var Polymer = window_1.Polymer;
+
+/**
+ * Polymer Redux
+ *
+ * Creates a Class mixin for decorating Elements with a given Redux store.
+ *
+ * @polymerMixin
+ *
+ * @param {Object} store Redux store.
+ * @return {Function} Class mixin.
+ */
+
+function PolymerRedux(store) {
+ if (!store) {
+ throw new TypeError('PolymerRedux: expecting a redux store.');
+ } else if (!['getState', 'dispatch', 'subscribe'].every(function (k) {
+ return typeof store[k] === 'function';
+ })) {
+ throw new TypeError('PolymerRedux: invalid store object.');
+ }
+
+ var subscribers = new Map();
+
+ /**
+ * Binds element's properties to state changes from the Redux store.
+ *
+ * @example
+ * const update = bind(el, props) // set bindings
+ * update(state) // manual update
+ *
+ * @private
+ * @param {HTMLElement} element
+ * @param {Object} properties
+ * @return {Function} Update function.
+ */
+ var bind = function bind(element, properties) {
+ var bindings = Object.keys(properties).filter(function (name) {
+ var property = properties[name];
+ if (Object.prototype.hasOwnProperty.call(property, 'statePath')) {
+ if (!property.readOnly && property.notify) {
+ console_1.warn('PolymerRedux: <' + element.constructor.is + '>.' + name + ' has "notify" enabled, two-way bindings goes against Redux\'s paradigm');
+ }
+ return true;
+ }
+ return false;
+ });
+
+ /**
+ * Updates an element's properties with the given state.
+ *
+ * @private
+ * @param {Object} state
+ */
+ var update = function update(state) {
+ var propertiesChanged = false;
+ bindings.forEach(function (name) {
+ // Perhaps .reduce() to a boolean?
+ var statePath = properties[name].statePath;
+
+ var value = typeof statePath === 'function' ? statePath.call(element, state) : Polymer.Path.get(state, statePath);
+
+ var changed = element._setPendingPropertyOrPath(name, value, true);
+ propertiesChanged = propertiesChanged || changed;
+ });
+ if (propertiesChanged) {
+ element._invalidateProperties();
+ }
+ };
+
+ // Redux listener
+ var unsubscribe = store.subscribe(function () {
+ var detail = store.getState();
+ update(detail);
+
+ element.dispatchEvent(new CustomEvent('state-changed', { detail: detail }));
+ });
+
+ subscribers.set(element, unsubscribe);
+ update(store.getState());
+
+ return update;
+ };
+
+ /**
+ * Unbinds an element from state changes in the Redux store.
+ *
+ * @private
+ * @param {HTMLElement} element
+ */
+ var unbind = function unbind(element) {
+ var off = subscribers.get(element);
+ if (typeof off === 'function') {
+ off();
+ }
+ };
+
+ /**
+ * Merges a property's object value using the defaults way.
+ *
+ * @private
+ * @param {Object} what Initial prototype
+ * @param {String} which Property to collect.
+ * @return {Object} the collected values
+ */
+ var collect = function collect(what, which) {
+ var res = {};
+ while (what) {
+ res = _extends({}, what[which], res); // Respect prototype priority
+ what = Object.getPrototypeOf(what);
+ }
+ return res;
+ };
+
+ /**
+ * ReduxMixin
+ *
+ * @example
+ * const ReduxMixin = PolymerRedux(store)
+ * class Foo extends ReduxMixin(Polymer.Element) { }
+ *
+ * @polymerMixinClass
+ *
+ * @param {Polymer.Element} parent The polymer parent element.
+ * @return {Function} PolymerRedux mixed class.
+ */
+ return function (parent) {
+ return class ReduxMixin extends parent {
+ constructor() {
+ super();
+
+ // Collect the action creators first as property changes trigger
+ // dispatches from observers, see #65, #66, #67
+ var actions = collect(this.constructor, 'actions');
+ Object.defineProperty(this, '_reduxActions', {
+ configurable: true,
+ value: actions
+ });
+ }
+
+ connectedCallback() {
+ var properties = collect(this.constructor, 'properties');
+ bind(this, properties);
+ super.connectedCallback();
+ }
+
+ disconnectedCallback() {
+ unbind(this);
+ super.disconnectedCallback();
+ }
+
+ /**
+ * Dispatches an action to the Redux store.
+ *
+ * @example
+ * element.dispatch({ type: 'ACTION' })
+ *
+ * @example
+ * element.dispatch('actionCreator', 'foo', 'bar')
+ *
+ * @example
+ * element.dispatch((dispatch) => {
+ * dispatch({ type: 'MIDDLEWARE'})
+ * })
+ *
+ * @param {...*} args
+ * @return {Object} The action.
+ */
+ dispatch() {
+ var _this = this;
+
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ var actions = this._reduxActions;
+
+ // Action creator
+ var action = args[0];
+
+ if (typeof action === 'string') {
+ if (typeof actions[action] !== 'function') {
+ throw new TypeError('PolymerRedux: <' + this.constructor.is + '> invalid action creator "' + action + '"');
+ }
+ action = actions[action].apply(actions, _toConsumableArray(args.slice(1)));
+ }
+
+ // Proxy async dispatch
+ if (typeof action === 'function') {
+ var originalAction = action;
+ action = function action() {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ // Replace redux dispatch
+ args.splice(0, 1, function () {
+ return _this.dispatch.apply(_this, arguments);
+ });
+ return originalAction.apply(undefined, args);
+ };
+
+ // Copy props from the original action to the proxy.
+ // see https://github.com/tur-nr/polymer-redux/issues/98
+ Object.keys(originalAction).forEach(function (prop) {
+ action[prop] = originalAction[prop];
+ });
+ }
+
+ return store.dispatch(action);
+ }
+
+ /**
+ * Gets the current state in the Redux store.
+ *
+ * @return {*}
+ */
+ getState() {
+ return store.getState();
+ }
+ };
+ };
+}
+
+return PolymerRedux;
+
+}());
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/package.json
new file mode 100644
index 00000000000..e412993b6b6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/package.json
@@ -0,0 +1,108 @@
+{
+ "name": "polymer-redux",
+ "version": "1.0.5",
+ "description": "Polymer bindings for Redux.",
+ "main": "lib/polymer-redux.js",
+ "module": "src/index.js",
+ "jsnext:main": "src/index.js",
+ "scripts": {
+ "build": "gulp",
+ "pretest": "npm run build && npm run lint",
+ "test": "jest && polymer test",
+ "lint": "xo && polymer lint --root=$(pwd)/lib"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/tur-nr/polymer-redux.git"
+ },
+ "keywords": [
+ "redux",
+ "polymer",
+ "reducer",
+ "state",
+ "web-components"
+ ],
+ "author": "Christopher Turner <turner296@gmail.com>",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/tur-nr/polymer-redux/issues"
+ },
+ "homepage": "https://github.com/tur-nr/polymer-redux#readme",
+ "dependencies": {
+ "global": "^4.3.1"
+ },
+ "devDependencies": {
+ "babel-jest": "^19.0.0",
+ "babel-plugin-external-helpers": "^6.8.0",
+ "babel-plugin-transform-object-assign": "^6.22.0",
+ "babel-plugin-transform-object-rest-spread": "^6.23.0",
+ "babel-preset-env": "^1.2.2",
+ "babel-register": "^6.24.0",
+ "bower": "^1.5.2",
+ "coveralls": "^2.11.9",
+ "del": "^2.2.2",
+ "gulp": "^3.9.1",
+ "jest": "^19.0.2",
+ "parse5": "^3.0.2",
+ "pify": "^2.3.0",
+ "polymer-bundler": "^2.0.1",
+ "polymer-cli": "^1.1.0",
+ "redux": "^3.0.5",
+ "redux-thunk": "^2.2.0",
+ "rollup": "^0.36.0",
+ "rollup-plugin-babel": "^2.6.1",
+ "rollup-plugin-commonjs": "^8.0.2",
+ "rollup-plugin-node-resolve": "^2.0.0",
+ "run-sequence": "^1.2.2",
+ "xo": "^0.18.0"
+ },
+ "xo": {
+ "next": true,
+ "ignore": [
+ "dist/**",
+ "lib/**",
+ "test/**"
+ ],
+ "overrides": [
+ {
+ "files": "gulpfile.babel.js",
+ "rules": {
+ "indent": [
+ "error",
+ "tab",
+ {
+ "MemberExpression": 1
+ }
+ ]
+ }
+ },
+ {
+ "files": "src/*.js",
+ "envs": [
+ "browser"
+ ]
+ },
+ {
+ "files": "test/**.spec.js",
+ "envs": [
+ "jest"
+ ],
+ "rules": {
+ "new-cap": "off",
+ "max-nested-callbacks": "off"
+ }
+ }
+ ]
+ },
+ "jest": {
+ "collectCoverage": true,
+ "collectCoverageFrom": [
+ "src/**.js"
+ ],
+ "resetMocks": true,
+ "testMatch": [
+ "**/test/?(*.)spec.js"
+ ],
+ "verbose": true
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/polymer-redux.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/polymer-redux.html
new file mode 100644
index 00000000000..3065e63e427
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/polymer-redux.html
@@ -0,0 +1,2 @@
+<link rel="import" href="../polymer/polymer-element.html">
+<link rel="import" href="./dist/polymer-redux.html">
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/polymer.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/polymer.json
new file mode 100644
index 00000000000..ef1ca6787a9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/polymer.json
@@ -0,0 +1,5 @@
+{
+ "lint": {
+ "rules": ["polymer-2"]
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/readme.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/readme.md
new file mode 100644
index 00000000000..850f13cc2e0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/readme.md
@@ -0,0 +1,103 @@
+# Polymer Redux
+
+[![Build Status](https://travis-ci.org/tur-nr/polymer-redux.svg?branch=master)](https://travis-ci.org/tur-nr/polymer-redux)
+[![Coverage Status](https://coveralls.io/repos/github/tur-nr/polymer-redux/badge.svg?branch=master)](https://coveralls.io/github/tur-nr/polymer-redux?branch=master)
+
+Polymer bindings for Redux. Bind store state to properties and dispatch
+actions from within Polymer Elements.
+
+Polymer is a modern library for creating Web Components within an application.
+Redux is a state container for managing predictable data. Binding the two
+libraries together allows developers to create powerful and complex
+applications faster and simpler. This approach allows the components you build
+with Polymer to be more focused on functionality than the applications state.
+
+## Installation
+
+```bash
+bower install --save polymer-redux
+```
+
+## Example
+
+```javascript
+// Create a Redux store
+const store = Redux.createStore((state = {}, action) => state)
+
+// Create the PolymerRedux mixin
+const ReduxMixin = PolymerRedux(store)
+
+// Bind Elements using the mixin
+class MyElement extends ReduxMixin(Polymer.Element) {
+ static get is() {
+ return 'my-element'
+ }
+
+ connectedCallback() {
+ super.connectedCallback();
+ const state = this.getState();
+ }
+}
+
+// Define your Element
+customElements.define(MyElement.is, MyElement)
+```
+
+Now `MyElement` has a connection to the Redux store and can bind properties to
+it's state and dispatch actions.
+
+## Documentation
+
+See the documentation page: [https://tur-nr.github.io/polymer-redux/docs](https://tur-nr.github.io/polymer-redux/docs).
+
+## API
+
+#### PolymerRedux
+
+##### `new PolymerRedux(<store>)`
+
+* `store` Object, Redux store.
+
+Returns a `ReduxMixin` function.
+
+#### Redux Mixin
+
+These methods are available on the instance of the component, the element.
+
+##### `#getState()`
+
+Returns current store's state.
+
+##### `#dispatch(<name>, [args, ...])`
+
+* `name` String, action name in the actions list.
+* `arg...` *, Arguments to pass to action function.
+
+Returns the action object.
+
+
+##### `#dispatch(<fn>)`
+
+* `fn` Function, Redux middleware dispatch function.
+
+Returns the action object.
+
+
+##### `#dispatch(<action>)`
+
+* `action` Object, the action object.
+
+Returns the action object.
+
+
+#### Events
+
+##### `state-changed`
+
+Fires when the store's state has changed.
+
+## License
+
+[MIT](LICENSE)
+
+Copyright (c) 2017 [Christopher Turner](https://github.com/tur-nr)
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/src/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/src/index.html
new file mode 100644
index 00000000000..62550945d54
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/src/index.html
@@ -0,0 +1 @@
+<script type="text/javascript" src="index.js"></script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/src/index.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/src/index.js
new file mode 100644
index 00000000000..c3c759d3962
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/src/index.js
@@ -0,0 +1,212 @@
+import window from 'global/window';
+import console from 'global/console';
+
+// Expose globals
+const {CustomEvent, Polymer} = window;
+
+/**
+ * Polymer Redux
+ *
+ * Creates a Class mixin for decorating Elements with a given Redux store.
+ *
+ * @polymerMixin
+ *
+ * @param {Object} store Redux store.
+ * @return {Function} Class mixin.
+ */
+export default function PolymerRedux(store) {
+ if (!store) {
+ throw new TypeError('PolymerRedux: expecting a redux store.');
+ } else if (!['getState', 'dispatch', 'subscribe'].every(k => typeof store[k] === 'function')) {
+ throw new TypeError('PolymerRedux: invalid store object.');
+ }
+
+ const subscribers = new Map();
+
+ /**
+ * Binds element's properties to state changes from the Redux store.
+ *
+ * @example
+ * const update = bind(el, props) // set bindings
+ * update(state) // manual update
+ *
+ * @private
+ * @param {HTMLElement} element
+ * @param {Object} properties
+ * @return {Function} Update function.
+ */
+ const bind = (element, properties) => {
+ const bindings = Object.keys(properties)
+ .filter(name => {
+ const property = properties[name];
+ if (Object.prototype.hasOwnProperty.call(property, 'statePath')) {
+ if (!property.readOnly && property.notify) {
+ console.warn(`PolymerRedux: <${element.constructor.is}>.${name} has "notify" enabled, two-way bindings goes against Redux's paradigm`);
+ }
+ return true;
+ }
+ return false;
+ });
+
+ /**
+ * Updates an element's properties with the given state.
+ *
+ * @private
+ * @param {Object} state
+ */
+ const update = state => {
+ let propertiesChanged = false;
+ bindings.forEach(name => { // Perhaps .reduce() to a boolean?
+ const {statePath} = properties[name];
+ const value = (typeof statePath === 'function') ?
+ statePath.call(element, state) :
+ Polymer.Path.get(state, statePath);
+
+ const changed = element._setPendingPropertyOrPath(name, value, true);
+ propertiesChanged = propertiesChanged || changed;
+ });
+ if (propertiesChanged) {
+ element._invalidateProperties();
+ }
+ };
+
+ // Redux listener
+ const unsubscribe = store.subscribe(() => {
+ const detail = store.getState();
+ update(detail);
+
+ element.dispatchEvent(new CustomEvent('state-changed', {detail}));
+ });
+
+ subscribers.set(element, unsubscribe);
+ update(store.getState());
+
+ return update;
+ };
+
+ /**
+ * Unbinds an element from state changes in the Redux store.
+ *
+ * @private
+ * @param {HTMLElement} element
+ */
+ const unbind = element => {
+ const off = subscribers.get(element);
+ if (typeof off === 'function') {
+ off();
+ }
+ };
+
+ /**
+ * Merges a property's object value using the defaults way.
+ *
+ * @private
+ * @param {Object} what Initial prototype
+ * @param {String} which Property to collect.
+ * @return {Object} the collected values
+ */
+ const collect = (what, which) => {
+ let res = {};
+ while (what) {
+ res = Object.assign({}, what[which], res); // Respect prototype priority
+ what = Object.getPrototypeOf(what);
+ }
+ return res;
+ };
+
+ /**
+ * ReduxMixin
+ *
+ * @example
+ * const ReduxMixin = PolymerRedux(store)
+ * class Foo extends ReduxMixin(Polymer.Element) { }
+ *
+ * @polymerMixinClass
+ *
+ * @param {Polymer.Element} parent The polymer parent element.
+ * @return {Function} PolymerRedux mixed class.
+ */
+ return parent => class ReduxMixin extends parent {
+ constructor() {
+ super();
+
+ // Collect the action creators first as property changes trigger
+ // dispatches from observers, see #65, #66, #67
+ const actions = collect(this.constructor, 'actions');
+ Object.defineProperty(this, '_reduxActions', {
+ configurable: true,
+ value: actions
+ });
+ }
+
+ connectedCallback() {
+ const properties = collect(this.constructor, 'properties');
+ bind(this, properties);
+ super.connectedCallback();
+ }
+
+ disconnectedCallback() {
+ unbind(this);
+ super.disconnectedCallback();
+ }
+
+ /**
+ * Dispatches an action to the Redux store.
+ *
+ * @example
+ * element.dispatch({ type: 'ACTION' })
+ *
+ * @example
+ * element.dispatch('actionCreator', 'foo', 'bar')
+ *
+ * @example
+ * element.dispatch((dispatch) => {
+ * dispatch({ type: 'MIDDLEWARE'})
+ * })
+ *
+ * @param {...*} args
+ * @return {Object} The action.
+ */
+ dispatch(...args) {
+ const actions = this._reduxActions;
+
+ // Action creator
+ let [action] = args;
+ if (typeof action === 'string') {
+ if (typeof actions[action] !== 'function') {
+ throw new TypeError(`PolymerRedux: <${this.constructor.is}> invalid action creator "${action}"`);
+ }
+ action = actions[action](...args.slice(1));
+ }
+
+ // Proxy async dispatch
+ if (typeof action === 'function') {
+ const originalAction = action;
+ action = (...args) => {
+ // Replace redux dispatch
+ args.splice(0, 1, (...args) => {
+ return this.dispatch(...args);
+ });
+ return originalAction(...args);
+ };
+
+ // Copy props from the original action to the proxy.
+ // see https://github.com/tur-nr/polymer-redux/issues/98
+ Object.keys(originalAction).forEach(prop => {
+ action[prop] = originalAction[prop];
+ });
+ }
+
+ return store.dispatch(action);
+ }
+
+ /**
+ * Gets the current state in the Redux store.
+ *
+ * @return {*}
+ */
+ getState() {
+ return store.getState();
+ }
+ };
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/wct.conf.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/wct.conf.json
new file mode 100644
index 00000000000..bdf8891c943
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/wct.conf.json
@@ -0,0 +1,7 @@
+{
+ "plugins": {
+ "local": {
+ "browsers": ["chrome"]
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/yarn.lock b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/yarn.lock
new file mode 100644
index 00000000000..6ba3ad976f6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer-redux/yarn.lock
@@ -0,0 +1,7838 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@types/assert@0.0.29":
+ version "0.0.29"
+ resolved "https://registry.yarnpkg.com/@types/assert/-/assert-0.0.29.tgz#8e562785baa5abda7c04a49f6665eae7431928d3"
+
+"@types/babel-core@^6.7.14":
+ version "6.7.14"
+ resolved "https://registry.yarnpkg.com/@types/babel-core/-/babel-core-6.7.14.tgz#a08c900a98e8987c1a98d2ea4fa0a1805a7d131f"
+ dependencies:
+ "@types/babel-template" "*"
+ "@types/babel-traverse" "*"
+ "@types/babel-types" "*"
+
+"@types/babel-template@*":
+ version "6.7.14"
+ resolved "https://registry.yarnpkg.com/@types/babel-template/-/babel-template-6.7.14.tgz#8088a56f9d697d620d3d079c3ef66025b7a08d02"
+ dependencies:
+ "@types/babel-types" "*"
+ "@types/babylon" "*"
+
+"@types/babel-traverse@*":
+ version "6.7.16"
+ resolved "https://registry.yarnpkg.com/@types/babel-traverse/-/babel-traverse-6.7.16.tgz#52f475893b8633f653499d745302fa5572a7bd05"
+ dependencies:
+ "@types/babel-types" "*"
+
+"@types/babel-types@*":
+ version "6.7.16"
+ resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-6.7.16.tgz#e2602896636858a0067971f7ca4bb8678038293f"
+
+"@types/babylon@*":
+ version "6.16.1"
+ resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.1.tgz#e4d10ab9e43a73703a17c6f41438bede28769340"
+ dependencies:
+ "@types/babel-types" "*"
+
+"@types/bluebird@*":
+ version "3.5.4"
+ resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.4.tgz#f120162b04fd6d55e10346d7e2e96eed462b02cf"
+
+"@types/body-parser@0.0.33":
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-0.0.33.tgz#33ca1498fc37e51c5df0c81cae34569e7041e025"
+ dependencies:
+ "@types/express" "*"
+
+"@types/chai-subset@^1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@types/chai-subset/-/chai-subset-1.3.0.tgz#74ceccef3b2fc2da7391b713deb72fe9a7e5f782"
+ dependencies:
+ "@types/chai" "*"
+
+"@types/chai@*", "@types/chai@^3.4.34":
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-3.5.2.tgz#c11cd2817d3a401b7ba0f5a420f35c56139b1c1e"
+
+"@types/chalk@^0.4.28", "@types/chalk@^0.4.30", "@types/chalk@^0.4.31":
+ version "0.4.31"
+ resolved "https://registry.yarnpkg.com/@types/chalk/-/chalk-0.4.31.tgz#a31d74241a6b1edbb973cf36d97a2896834a51f9"
+
+"@types/clean-css@*":
+ version "3.4.30"
+ resolved "https://registry.yarnpkg.com/@types/clean-css/-/clean-css-3.4.30.tgz#0052c136f5248002428e3638b37de4a39818641d"
+
+"@types/clone@^0.1.29", "@types/clone@^0.1.30":
+ version "0.1.30"
+ resolved "https://registry.yarnpkg.com/@types/clone/-/clone-0.1.30.tgz#e7365648c1b42136a59c7d5040637b3b5c83b614"
+
+"@types/compression@^0.0.33":
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/@types/compression/-/compression-0.0.33.tgz#95dc733a2339aa846381d7f1377792d2553dc27d"
+ dependencies:
+ "@types/express" "*"
+
+"@types/content-type@^1.0.33":
+ version "1.0.33"
+ resolved "https://registry.yarnpkg.com/@types/content-type/-/content-type-1.0.33.tgz#171849e4652dcd589c3e4ab72b81f26e87915758"
+
+"@types/cssbeautify@^0.3.1":
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/@types/cssbeautify/-/cssbeautify-0.3.1.tgz#8e0bee8f7decb952250da0caebe05e30591c17ef"
+
+"@types/del@^2.2.31":
+ version "2.2.32"
+ resolved "https://registry.yarnpkg.com/@types/del/-/del-2.2.32.tgz#4d54df0ed3017435e6b1995df0292957787fc6b2"
+ dependencies:
+ "@types/glob" "*"
+
+"@types/doctrine@^0.0.1":
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/@types/doctrine/-/doctrine-0.0.1.tgz#b999f2d9f7b43cabe0a1a2f39bc203bc7dcada9d"
+
+"@types/escodegen@^0.0.2":
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/@types/escodegen/-/escodegen-0.0.2.tgz#7cea41ab242e910eb10f65ae18aeba459d66b35f"
+
+"@types/estree@0.0.34", "@types/estree@^0.0.34":
+ version "0.0.34"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.34.tgz#aa7af69a3a91922171ee411b3c9d8f6beb4af321"
+
+"@types/express-serve-static-core@*":
+ version "4.0.45"
+ resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.45.tgz#71bb1f87d7187482d0d8851f5b294458e1c78667"
+ dependencies:
+ "@types/node" "*"
+
+"@types/express@*", "@types/express@^4.0.30", "@types/express@^4.0.33":
+ version "4.0.35"
+ resolved "https://registry.yarnpkg.com/@types/express/-/express-4.0.35.tgz#6267c7b60a51fac473467b3c4a02cd1e441805fe"
+ dependencies:
+ "@types/express-serve-static-core" "*"
+ "@types/serve-static" "*"
+
+"@types/fast-levenshtein@0.0.1":
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/@types/fast-levenshtein/-/fast-levenshtein-0.0.1.tgz#3a3615cf173645c8fca58d051e4e32824e4bd286"
+
+"@types/findup-sync@^0.3.29":
+ version "0.3.29"
+ resolved "https://registry.yarnpkg.com/@types/findup-sync/-/findup-sync-0.3.29.tgz#ec0c80597e5ed157282207e762ca7254cad57632"
+ dependencies:
+ "@types/minimatch" "*"
+
+"@types/form-data@*":
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8"
+ dependencies:
+ "@types/node" "*"
+
+"@types/freeport@^1.0.19":
+ version "1.0.21"
+ resolved "https://registry.yarnpkg.com/@types/freeport/-/freeport-1.0.21.tgz#73f6543ed67d3ca3fff97b985591598b7092066f"
+
+"@types/glob-stream@*":
+ version "3.1.30"
+ resolved "https://registry.yarnpkg.com/@types/glob-stream/-/glob-stream-3.1.30.tgz#b853990b40a4cfe6a80ec0d2fadf68d8060f78b1"
+ dependencies:
+ "@types/glob" "*"
+ "@types/node" "*"
+
+"@types/glob@*", "@types/glob@^5.0.30":
+ version "5.0.30"
+ resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.30.tgz#1026409c5625a8689074602808d082b2867b8a51"
+ dependencies:
+ "@types/minimatch" "*"
+ "@types/node" "*"
+
+"@types/grunt@^0.4.20":
+ version "0.4.21"
+ resolved "https://registry.yarnpkg.com/@types/grunt/-/grunt-0.4.21.tgz#8e002fc3b5d6b4d0ba0adc24cf77e988c854750e"
+ dependencies:
+ "@types/node" "*"
+
+"@types/gulp-if@0.0.30":
+ version "0.0.30"
+ resolved "https://registry.yarnpkg.com/@types/gulp-if/-/gulp-if-0.0.30.tgz#21a564af1aabc80dff2d195fa66cd3f8864aec21"
+ dependencies:
+ "@types/node" "*"
+ "@types/vinyl" "*"
+
+"@types/gulp@^3.8.32":
+ version "3.8.32"
+ resolved "https://registry.yarnpkg.com/@types/gulp/-/gulp-3.8.32.tgz#83c59c681cc233d1ec7f82d269555566fa133156"
+ dependencies:
+ "@types/node" "*"
+ "@types/orchestrator" "*"
+ "@types/vinyl" "*"
+
+"@types/html-minifier@^1.1.30":
+ version "1.1.30"
+ resolved "https://registry.yarnpkg.com/@types/html-minifier/-/html-minifier-1.1.30.tgz#3b3817c27df23922f7b5aa87eff45b3ab934aec9"
+ dependencies:
+ "@types/clean-css" "*"
+ "@types/relateurl" "*"
+ "@types/uglify-js" "*"
+
+"@types/inquirer@*", "@types/inquirer@0.0.32":
+ version "0.0.32"
+ resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-0.0.32.tgz#a4a08e83741c500a7c3c8e7776014f7f8a65870d"
+ dependencies:
+ "@types/rx" "*"
+ "@types/through" "*"
+
+"@types/launchpad@^0.6.0":
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/@types/launchpad/-/launchpad-0.6.0.tgz#37296109b7f277f6e6c5fd7e0c0706bc918fbb51"
+
+"@types/lodash@^4.14.38":
+ version "4.14.64"
+ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.64.tgz#979cf3a3d4a368670840bf9b3e448dc33ffe84ee"
+
+"@types/merge-stream@^1.0.28":
+ version "1.0.28"
+ resolved "https://registry.yarnpkg.com/@types/merge-stream/-/merge-stream-1.0.28.tgz#7cabfaaab6c64d51e3410d95e17dd9061e413532"
+ dependencies:
+ "@types/node" "*"
+
+"@types/mime@*", "@types/mime@0.0.29":
+ version "0.0.29"
+ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-0.0.29.tgz#fbcfd330573b912ef59eeee14602bface630754b"
+
+"@types/minimatch@*", "@types/minimatch@^2.0.29":
+ version "2.0.29"
+ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-2.0.29.tgz#5002e14f75e2d71e564281df0431c8c1b4a2a36a"
+
+"@types/mocha@^2.2.32":
+ version "2.2.41"
+ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.41.tgz#e27cf0817153eb9f2713b2d3f6c68f1e1c3ca608"
+
+"@types/multer@0.0.32":
+ version "0.0.32"
+ resolved "https://registry.yarnpkg.com/@types/multer/-/multer-0.0.32.tgz#f89c751227dc20b7c933c309a3e7467c499fcdec"
+ dependencies:
+ "@types/express" "*"
+
+"@types/mz@0.0.29":
+ version "0.0.29"
+ resolved "https://registry.yarnpkg.com/@types/mz/-/mz-0.0.29.tgz#bc24728c649973f1c7851e9033f9ce525668c27b"
+ dependencies:
+ "@types/bluebird" "*"
+ "@types/node" "*"
+
+"@types/mz@0.0.31", "@types/mz@^0.0.31":
+ version "0.0.31"
+ resolved "https://registry.yarnpkg.com/@types/mz/-/mz-0.0.31.tgz#a4d80c082fefe71e40a7c0f07d1e6555bbbc7b52"
+ dependencies:
+ "@types/node" "*"
+
+"@types/node@*", "@types/node@6.0.*", "@types/node@^6", "@types/node@^6.0.0", "@types/node@^6.0.31", "@types/node@^6.0.41", "@types/node@^6.0.46", "@types/node@^6.0.73":
+ version "6.0.73"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.73.tgz#85dc4bb6f125377c75ddd2519a1eeb63f0a4ed70"
+
+"@types/node@4.0.30", "@types/node@^4.0.30":
+ version "4.0.30"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-4.0.30.tgz#553f490ed3030311620f88003e7abfc0edcb301e"
+
+"@types/node@^4.2.3":
+ version "4.2.8"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-4.2.8.tgz#26fd8fbc5b5ec7822614d950e237956ee92b88cd"
+
+"@types/nomnom@0.0.28":
+ version "0.0.28"
+ resolved "https://registry.yarnpkg.com/@types/nomnom/-/nomnom-0.0.28.tgz#2d8968528ad7a9738dd0a6a3dfe5cdfdb8ac7974"
+
+"@types/opn@^3.0.28":
+ version "3.0.28"
+ resolved "https://registry.yarnpkg.com/@types/opn/-/opn-3.0.28.tgz#097d0d1c9b5749573a5d96df132387bb6d02118a"
+ dependencies:
+ "@types/node" "*"
+
+"@types/orchestrator@*":
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/@types/orchestrator/-/orchestrator-0.3.0.tgz#bf84a1699c9330d4fe89cd81263e8fc09fb32978"
+ dependencies:
+ "@types/node" "*"
+ "@types/q" "^0"
+
+"@types/parse5@^0.0.31":
+ version "0.0.31"
+ resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-0.0.31.tgz#e827a493a443b156e1b582a2e4c3bdc0040f2ee7"
+ dependencies:
+ "@types/node" "6.0.*"
+
+"@types/parse5@^2.2.32", "@types/parse5@^2.2.34":
+ version "2.2.34"
+ resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-2.2.34.tgz#e3870a10e82735a720f62d71dcd183ba78ef3a9d"
+ dependencies:
+ "@types/node" "*"
+
+"@types/pem@^1.8.1":
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/@types/pem/-/pem-1.9.2.tgz#cd0b195d161dffbcb0aa88fa9fd94b24dd2af10b"
+
+"@types/q@^0":
+ version "0.0.34"
+ resolved "https://registry.yarnpkg.com/@types/q/-/q-0.0.34.tgz#e5d3a54e7a56309d904cdf1dc34f61ac595fae2e"
+
+"@types/relateurl@*":
+ version "0.2.28"
+ resolved "https://registry.yarnpkg.com/@types/relateurl/-/relateurl-0.2.28.tgz#6bda7db8653fa62643f5ee69e9f69c11a392e3a6"
+
+"@types/request@0.0.39":
+ version "0.0.39"
+ resolved "https://registry.yarnpkg.com/@types/request/-/request-0.0.39.tgz#168b96cf4253c5d54d403f746f82ee7aed47ce2c"
+ dependencies:
+ "@types/form-data" "*"
+ "@types/node" "*"
+
+"@types/resolve@0.0.4":
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.4.tgz#9b586d65a947dea88c4bc24da0b905fe9520a0d5"
+ dependencies:
+ "@types/node" "*"
+
+"@types/rx-core-binding@*":
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/@types/rx-core-binding/-/rx-core-binding-4.0.3.tgz#74261d1df5ab9eafa697ed9e8243999787cc87ae"
+ dependencies:
+ "@types/rx-core" "*"
+
+"@types/rx-core@*":
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/@types/rx-core/-/rx-core-4.0.3.tgz#0b3354b1238cedbe2b74f6326f139dbc7a591d60"
+
+"@types/rx-lite-aggregates@*":
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@types/rx-lite-aggregates/-/rx-lite-aggregates-4.0.2.tgz#5876da596bc9501f614a8a44998cf3f6cb74f433"
+ dependencies:
+ "@types/rx-lite" "*"
+
+"@types/rx-lite-async@*":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@types/rx-lite-async/-/rx-lite-async-4.0.1.tgz#fbc85d52ef380b95c9c609f55c5b96500eeb16aa"
+ dependencies:
+ "@types/rx-lite" "*"
+
+"@types/rx-lite-backpressure@*":
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@types/rx-lite-backpressure/-/rx-lite-backpressure-4.0.2.tgz#2a1e69a7e884527c5c207a36305a4a360964b8e2"
+ dependencies:
+ "@types/rx-lite" "*"
+
+"@types/rx-lite-coincidence@*":
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@types/rx-lite-coincidence/-/rx-lite-coincidence-4.0.2.tgz#05e535c39fa38d70c926c94a6196697024c8b16b"
+ dependencies:
+ "@types/rx-lite" "*"
+
+"@types/rx-lite-experimental@*":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@types/rx-lite-experimental/-/rx-lite-experimental-4.0.1.tgz#c532f5cbdf3f2c15da16ded8930d1b2984023cbd"
+ dependencies:
+ "@types/rx-lite" "*"
+
+"@types/rx-lite-joinpatterns@*":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@types/rx-lite-joinpatterns/-/rx-lite-joinpatterns-4.0.1.tgz#f70fe370518a8432f29158cc92ffb56b4e4afc3e"
+ dependencies:
+ "@types/rx-lite" "*"
+
+"@types/rx-lite-testing@*":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@types/rx-lite-testing/-/rx-lite-testing-4.0.1.tgz#21b19d11f4dfd6ffef5a9d1648e9c8879bfe21e9"
+ dependencies:
+ "@types/rx-lite-virtualtime" "*"
+
+"@types/rx-lite-time@*":
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@types/rx-lite-time/-/rx-lite-time-4.0.2.tgz#787eacd686c49ca941e72ebbe8b91890240882f9"
+ dependencies:
+ "@types/rx-lite" "*"
+
+"@types/rx-lite-virtualtime@*":
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@types/rx-lite-virtualtime/-/rx-lite-virtualtime-4.0.2.tgz#950add6228aa17c033ff98f7e67d082596cd7c33"
+ dependencies:
+ "@types/rx-lite" "*"
+
+"@types/rx-lite@*":
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/@types/rx-lite/-/rx-lite-4.0.4.tgz#710ebf89d0a2d596c21047d91b1242bcef51c30b"
+ dependencies:
+ "@types/rx-core" "*"
+ "@types/rx-core-binding" "*"
+
+"@types/rx@*":
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/@types/rx/-/rx-4.1.1.tgz#598fc94a56baed975f194574e0f572fd8e627a48"
+ dependencies:
+ "@types/rx-core" "*"
+ "@types/rx-core-binding" "*"
+ "@types/rx-lite" "*"
+ "@types/rx-lite-aggregates" "*"
+ "@types/rx-lite-async" "*"
+ "@types/rx-lite-backpressure" "*"
+ "@types/rx-lite-coincidence" "*"
+ "@types/rx-lite-experimental" "*"
+ "@types/rx-lite-joinpatterns" "*"
+ "@types/rx-lite-testing" "*"
+ "@types/rx-lite-time" "*"
+ "@types/rx-lite-virtualtime" "*"
+
+"@types/semver@^5.3.30":
+ version "5.3.31"
+ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-5.3.31.tgz#b999d7d935f43f5207b01b00d3de20852f4ca75f"
+
+"@types/serve-static@*", "@types/serve-static@^1.7.31":
+ version "1.7.31"
+ resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.7.31.tgz#15456de8d98d6b4cff31be6c6af7492ae63f521a"
+ dependencies:
+ "@types/express-serve-static-core" "*"
+ "@types/mime" "*"
+
+"@types/sinon-chai@^2.7.27":
+ version "2.7.27"
+ resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-2.7.27.tgz#eb7729058ddf253a6979e559bb2b491084969aa1"
+ dependencies:
+ "@types/chai" "*"
+ "@types/sinon" "*"
+
+"@types/sinon@*", "@types/sinon@^1.16.31":
+ version "1.16.36"
+ resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-1.16.36.tgz#74bb6ed7928597c1b3fb1b009005e94dc6eae357"
+
+"@types/socket.io@^1.4.27":
+ version "1.4.29"
+ resolved "https://registry.yarnpkg.com/@types/socket.io/-/socket.io-1.4.29.tgz#86a6b3a9ab78cf9a900ceef85b9b68b6bea86712"
+ dependencies:
+ "@types/node" "*"
+
+"@types/source-map@*":
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/@types/source-map/-/source-map-0.5.0.tgz#dd34bbd8e32fe4e74f2e3d8ac07f8aa5b45a47ac"
+
+"@types/spdy@^3.4.1":
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/@types/spdy/-/spdy-3.4.1.tgz#5e87b2c2be841746c283b2b4e1a32c786114e84c"
+
+"@types/temp@^0.8.28":
+ version "0.8.29"
+ resolved "https://registry.yarnpkg.com/@types/temp/-/temp-0.8.29.tgz#c3cdc113e3c138f90e5e970d51e41b0b7f62678d"
+ dependencies:
+ "@types/node" "*"
+
+"@types/through@*":
+ version "0.0.28"
+ resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.28.tgz#1effa9a6d00fb48572b4cc9f44df25b0100db7fc"
+ dependencies:
+ "@types/node" "*"
+
+"@types/ua-parser-js@^0.7.30":
+ version "0.7.30"
+ resolved "https://registry.yarnpkg.com/@types/ua-parser-js/-/ua-parser-js-0.7.30.tgz#9096e5552ff02f8d018a17efac69b4dc75083f8b"
+
+"@types/uglify-js@*":
+ version "2.6.28"
+ resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-2.6.28.tgz#1499b48ca3a44132250b318cdde25b8f45f0c616"
+ dependencies:
+ "@types/source-map" "*"
+
+"@types/update-notifier@^1.0.0":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@types/update-notifier/-/update-notifier-1.0.1.tgz#47e8f007c6b5bcafbe427332e3b6b433cdc18ddc"
+
+"@types/vinyl-fs@0.0.28":
+ version "0.0.28"
+ resolved "https://registry.yarnpkg.com/@types/vinyl-fs/-/vinyl-fs-0.0.28.tgz#4663017bc802c6570eae4f3409fd5cabf97cbfde"
+ dependencies:
+ "@types/glob-stream" "*"
+ "@types/node" "*"
+ "@types/vinyl" "*"
+
+"@types/vinyl@*", "@types/vinyl@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@types/vinyl/-/vinyl-2.0.0.tgz#fd213bf7f4136dde21fe1895500b12c186f8c268"
+ dependencies:
+ "@types/node" "*"
+
+"@types/which@^1.0.27":
+ version "1.0.28"
+ resolved "https://registry.yarnpkg.com/@types/which/-/which-1.0.28.tgz#016e387629b8817bed653fe32eab5d11279c8df6"
+
+"@types/winston@^2.2.0":
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/@types/winston/-/winston-2.3.2.tgz#c162547cb47c0b8a450e681bb9fa7041cd80edfa"
+ dependencies:
+ "@types/node" "*"
+
+"@types/yeoman-generator@^1.0.0":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@types/yeoman-generator/-/yeoman-generator-1.0.2.tgz#132de401554ca4a16e07e83750565cafe0982362"
+ dependencies:
+ "@types/inquirer" "*"
+
+abab@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d"
+
+abbrev@1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f"
+
+accepts@1.3.3, accepts@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca"
+ dependencies:
+ mime-types "~2.1.11"
+ negotiator "0.6.1"
+
+accessibility-developer-tools@^2.10.0:
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz#3da0cce9d6ec6373964b84f35db7cfc3df7ab514"
+
+acorn-globals@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf"
+ dependencies:
+ acorn "^4.0.4"
+
+acorn-jsx@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
+ dependencies:
+ acorn "^3.0.4"
+
+acorn@^3.0.4:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+
+acorn@^4.0.1, acorn@^4.0.4:
+ version "4.0.13"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+
+acorn@^5.0.1:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d"
+
+adm-zip@~0.4.3:
+ version "0.4.7"
+ resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1"
+
+after@0.8.2:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
+
+agent-base@2:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.1.1.tgz#d6de10d5af6132d5bd692427d46fc538539094c7"
+ dependencies:
+ extend "~3.0.0"
+ semver "~5.0.1"
+
+ajv-keywords@^1.0.0:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
+
+ajv@^4.7.0:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
+ dependencies:
+ co "^4.6.0"
+ json-stable-stringify "^1.0.1"
+
+align-text@^0.1.1, align-text@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+ dependencies:
+ kind-of "^3.0.2"
+ longest "^1.0.1"
+ repeat-string "^1.5.2"
+
+amdefine@>=0.0.4:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+
+ansi-align@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-1.1.0.tgz#2f0c1658829739add5ebb15e6b0c6e3423f016ba"
+ dependencies:
+ string-width "^1.0.1"
+
+ansi-align@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
+ dependencies:
+ string-width "^2.0.0"
+
+ansi-escape-sequences@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz#1c18394b6af9b76ff9a63509fa497669fd2ce53e"
+ dependencies:
+ array-back "^1.0.3"
+
+ansi-escapes@^1.1.0, ansi-escapes@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+ansi-styles@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.0.0.tgz#5404e93a544c4fec7f048262977bebfe3155e0c1"
+ dependencies:
+ color-convert "^1.0.0"
+
+ansi-styles@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178"
+
+any-promise@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
+
+anymatch@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507"
+ dependencies:
+ arrify "^1.0.0"
+ micromatch "^2.1.5"
+
+append-field@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/append-field/-/append-field-0.1.0.tgz#6ddc58fa083c7bc545d3c5995b2830cc2366d44a"
+
+append-transform@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991"
+ dependencies:
+ default-require-extensions "^1.0.0"
+
+archiver-utils@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174"
+ dependencies:
+ glob "^7.0.0"
+ graceful-fs "^4.1.0"
+ lazystream "^1.0.0"
+ lodash "^4.8.0"
+ normalize-path "^2.0.0"
+ readable-stream "^2.0.0"
+
+archiver@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/archiver/-/archiver-1.3.0.tgz#4f2194d6d8f99df3f531e6881f14f15d55faaf22"
+ dependencies:
+ archiver-utils "^1.3.0"
+ async "^2.0.0"
+ buffer-crc32 "^0.2.1"
+ glob "^7.0.0"
+ lodash "^4.8.0"
+ readable-stream "^2.0.0"
+ tar-stream "^1.5.0"
+ walkdir "^0.0.11"
+ zip-stream "^1.1.0"
+
+archy@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
+
+argparse@^1.0.7:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86"
+ dependencies:
+ sprintf-js "~1.0.2"
+
+arr-diff@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+ dependencies:
+ arr-flatten "^1.0.1"
+
+arr-flatten@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1"
+
+array-back@^1.0.3, array-back@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b"
+ dependencies:
+ typical "^2.6.0"
+
+array-differ@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031"
+
+array-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
+
+array-find-index@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+
+array-union@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+ dependencies:
+ array-uniq "^1.0.1"
+
+array-uniq@^1.0.1, array-uniq@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+
+array-unique@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+arraybuffer.slice@0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca"
+
+arrify@^1.0.0, arrify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+
+asap@~2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f"
+
+asn1@~0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+assert-plus@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
+
+assertion-error@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c"
+
+async@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.2.1.tgz#a4816a17cd5ff516dfa2c7698a453369b9790de0"
+
+async@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.0.1.tgz#b709cc0280a9c36f09f4536be823c838a9049e25"
+ dependencies:
+ lodash "^4.8.0"
+
+async@^1.4.0, async@^1.5.0:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+
+async@^2.0.0, async@^2.0.1, async@^2.1.2, async@^2.1.4:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.4.1.tgz#62a56b279c98a11d0987096a01cc3eeb8eb7bbd7"
+ dependencies:
+ lodash "^4.14.0"
+
+async@~0.2.9:
+ version "0.2.10"
+ resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
+
+async@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+aws-sign2@~0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
+
+aws4@^1.2.1:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
+
+babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
+ dependencies:
+ chalk "^1.1.0"
+ esutils "^2.0.2"
+ js-tokens "^3.0.0"
+
+babel-core@6, babel-core@^6.0.0, babel-core@^6.18.2, babel-core@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83"
+ dependencies:
+ babel-code-frame "^6.22.0"
+ babel-generator "^6.24.1"
+ babel-helpers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-register "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+ babylon "^6.11.0"
+ convert-source-map "^1.1.0"
+ debug "^2.1.1"
+ json5 "^0.5.0"
+ lodash "^4.2.0"
+ minimatch "^3.0.2"
+ path-is-absolute "^1.0.0"
+ private "^0.1.6"
+ slash "^1.0.0"
+ source-map "^0.5.0"
+
+babel-generator@^6.18.0, babel-generator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497"
+ dependencies:
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ detect-indent "^4.0.0"
+ jsesc "^1.3.0"
+ lodash "^4.2.0"
+ source-map "^0.5.0"
+ trim-right "^1.0.1"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
+ dependencies:
+ babel-helper-explode-assignable-expression "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-call-delegate@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-define-map@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ lodash "^4.2.0"
+
+babel-helper-evaluate-path@^0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.0.3.tgz#1d103ac9d4a59e5d431842212f151785f7ac547b"
+
+babel-helper-explode-assignable-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-flip-expressions@^0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.0.2.tgz#7bab2cf61162bc92703e9b298ef512bcf77d6787"
+
+babel-helper-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+ dependencies:
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-get-function-arity@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-is-nodes-equiv@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz#34e9b300b1479ddd98ec77ea0bbe9342dfe39684"
+
+babel-helper-is-void-0@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-is-void-0/-/babel-helper-is-void-0-0.0.1.tgz#ed74553b883e68226ae45f989a99b02c190f105a"
+
+babel-helper-mark-eval-scopes@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.1.1.tgz#4554345edf9f2549427bd2098e530253f8af2992"
+
+babel-helper-optimise-call-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ lodash "^4.2.0"
+
+babel-helper-remap-async-to-generator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-remove-or-void@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.1.1.tgz#9d7e1856dc6fafcb41b283a416730dc1844f66d7"
+
+babel-helper-replace-supers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+ dependencies:
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-to-multiple-sequence-expressions@^0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.0.3.tgz#c789a0faccd2669c51234be2cea7a3e5a0573c25"
+
+babel-helpers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-jest@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-19.0.0.tgz#59323ced99a3a84d359da219ca881074ffc6ce3f"
+ dependencies:
+ babel-core "^6.0.0"
+ babel-plugin-istanbul "^4.0.0"
+ babel-preset-jest "^19.0.0"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-external-helpers@^6.22.0, babel-plugin-external-helpers@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz#2285f48b02bd5dede85175caf8c62e86adccefa1"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-istanbul@^4.0.0:
+ version "4.1.4"
+ resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.4.tgz#18dde84bf3ce329fddf3f4103fae921456d8e587"
+ dependencies:
+ find-up "^2.1.0"
+ istanbul-lib-instrument "^1.7.2"
+ test-exclude "^4.1.1"
+
+babel-plugin-jest-hoist@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-19.0.0.tgz#4ae2a04ea612a6e73651f3fde52c178991304bea"
+
+babel-plugin-minify-constant-folding@^0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.0.3.tgz#a511e839562489811987a7a503c43c312c40138a"
+ dependencies:
+ babel-helper-evaluate-path "^0.0.3"
+
+babel-plugin-minify-dead-code-elimination@^0.1.2:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.1.6.tgz#c5471346fb0a1046863fd765c784cba97d7b22e3"
+ dependencies:
+ babel-helper-mark-eval-scopes "^0.1.1"
+ babel-helper-remove-or-void "^0.1.1"
+ lodash.some "^4.6.0"
+
+babel-plugin-minify-flip-comparisons@^0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.0.2.tgz#7d0953aa5876ede6118966bda9edecc63bf346ab"
+ dependencies:
+ babel-helper-is-void-0 "^0.0.1"
+
+babel-plugin-minify-guarded-expressions@^0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.0.4.tgz#957104a760e6a7ffd967005a7a11621bb42fd11c"
+ dependencies:
+ babel-helper-flip-expressions "^0.0.2"
+
+babel-plugin-minify-infinity@^0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.0.3.tgz#4cc99b61d12b434ce80ad675103335c589cba9a1"
+
+babel-plugin-minify-mangle-names@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.0.6.tgz#7311e82292d5add93ca80c4ecfbde9e8a9730a43"
+
+babel-plugin-minify-numeric-literals@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.0.1.tgz#9597e6c31154d7daf3744d0bd417c144b275bd53"
+
+babel-plugin-minify-replace@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.0.1.tgz#5d5aea7cb9899245248d1ee9ce7a2fe556a8facc"
+
+babel-plugin-minify-simplify@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.0.6.tgz#1d50899b29c3c4503eaefb98365cc5f7a84aedfe"
+ dependencies:
+ babel-helper-flip-expressions "^0.0.2"
+ babel-helper-is-nodes-equiv "^0.0.1"
+ babel-helper-to-multiple-sequence-expressions "^0.0.3"
+
+babel-plugin-minify-type-constructors@^0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.0.3.tgz#ab59c1ad835b6b6e8e932b875d4df4dc393d9d26"
+ dependencies:
+ babel-helper-is-void-0 "^0.0.1"
+
+babel-plugin-syntax-async-functions@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+
+babel-plugin-syntax-exponentiation-operator@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
+
+babel-plugin-syntax-object-rest-spread@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
+
+babel-plugin-syntax-trailing-function-commas@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
+
+babel-plugin-transform-async-to-generator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
+ dependencies:
+ babel-helper-remap-async-to-generator "^6.24.1"
+ babel-plugin-syntax-async-functions "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-arrow-functions@^6.22.0, babel-plugin-transform-es2015-arrow-functions@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0, babel-plugin-transform-es2015-block-scoped-functions@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.18.0, babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+ lodash "^4.2.0"
+
+babel-plugin-transform-es2015-classes@^6.18.0, babel-plugin-transform-es2015-classes@^6.23.0, babel-plugin-transform-es2015-classes@^6.24.1, babel-plugin-transform-es2015-classes@^6.9.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+ dependencies:
+ babel-helper-define-map "^6.24.1"
+ babel-helper-function-name "^6.24.1"
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-helper-replace-supers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-computed-properties@^6.22.0, babel-plugin-transform-es2015-computed-properties@^6.24.1, babel-plugin-transform-es2015-computed-properties@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.19.0, babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.22.0, babel-plugin-transform-es2015-duplicate-keys@^6.24.1, babel-plugin-transform-es2015-duplicate-keys@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.18.0, babel-plugin-transform-es2015-for-of@^6.22.0, babel-plugin-transform-es2015-for-of@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.22.0, babel-plugin-transform-es2015-function-name@^6.24.1, babel-plugin-transform-es2015-function-name@^6.9.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0, babel-plugin-transform-es2015-literals@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+ dependencies:
+ babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe"
+ dependencies:
+ babel-plugin-transform-strict-mode "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-modules-systemjs@^6.23.0, babel-plugin-transform-es2015-modules-systemjs@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.23.0, babel-plugin-transform-es2015-modules-umd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+ dependencies:
+ babel-plugin-transform-es2015-modules-amd "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-object-super@^6.22.0, babel-plugin-transform-es2015-object-super@^6.24.1, babel-plugin-transform-es2015-object-super@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+ dependencies:
+ babel-helper-replace-supers "^6.24.1"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.18.0, babel-plugin-transform-es2015-parameters@^6.23.0, babel-plugin-transform-es2015-parameters@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+ dependencies:
+ babel-helper-call-delegate "^6.24.1"
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-shorthand-properties@^6.18.0, babel-plugin-transform-es2015-shorthand-properties@^6.22.0, babel-plugin-transform-es2015-shorthand-properties@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0, babel-plugin-transform-es2015-spread@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.22.0, babel-plugin-transform-es2015-sticky-regex@^6.24.1, babel-plugin-transform-es2015-sticky-regex@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0, babel-plugin-transform-es2015-template-literals@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.18.0, babel-plugin-transform-es2015-typeof-symbol@^6.22.0, babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.11.0, babel-plugin-transform-es2015-unicode-regex@^6.22.0, babel-plugin-transform-es2015-unicode-regex@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ regexpu-core "^2.0.0"
+
+babel-plugin-transform-exponentiation-operator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
+ dependencies:
+ babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
+ babel-plugin-syntax-exponentiation-operator "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-inline-consecutive-adds@^0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.0.2.tgz#a58fcecfc09c08fbf9373a5a3e70746c03d01fc1"
+
+babel-plugin-transform-member-expression-literals@^6.8.1:
+ version "6.8.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.8.3.tgz#4eefa7fa1d3a86d05ac220bc3fdf96d5ed1835d6"
+
+babel-plugin-transform-merge-sibling-variables@^6.8.1:
+ version "6.8.4"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.8.4.tgz#813a433f2d8c6989ee3a9c5e0cb46d3752d367a9"
+
+babel-plugin-transform-minify-booleans@^6.8.0:
+ version "6.8.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.8.2.tgz#8451579f706e702c1e1ab2756de5c8ea369cf07c"
+
+babel-plugin-transform-object-assign@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-assign/-/babel-plugin-transform-object-assign-6.22.0.tgz#f99d2f66f1a0b0d498e346c5359684740caa20ba"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-object-rest-spread@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921"
+ dependencies:
+ babel-plugin-syntax-object-rest-spread "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-property-literals@^6.8.1:
+ version "6.8.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.8.3.tgz#0dcd2ecf0486c54c23f84817f911c4ab0e8d4b99"
+
+babel-plugin-transform-regenerator@^6.16.1, babel-plugin-transform-regenerator@^6.22.0, babel-plugin-transform-regenerator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418"
+ dependencies:
+ regenerator-transform "0.9.11"
+
+babel-plugin-transform-regexp-constructors@^0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.0.5.tgz#74d95e0c567e6fc1d9c699a084894d40de8e581d"
+
+babel-plugin-transform-remove-console@^6.8.0:
+ version "6.8.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.8.3.tgz#313441720324ad20af0fb009fa59e8102364626b"
+
+babel-plugin-transform-remove-debugger@^6.8.0:
+ version "6.8.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.8.3.tgz#5064f2d843b77ce660ebaa7760be30eb925bb93f"
+
+babel-plugin-transform-remove-undefined@^0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.0.4.tgz#cc75be04b9bbd7bb2005272cc160b4d08692d77c"
+
+babel-plugin-transform-simplify-comparison-operators@^6.8.1:
+ version "6.8.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.8.3.tgz#2e47e11e5f8dc33e97476e0263151d5fd57e1c4c"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-undefined-to-void@^6.8.0:
+ version "6.8.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.8.2.tgz#fe2b1d294eb05e87524eb93724dea6e2c3d66fa1"
+
+babel-preset-babili@0.0.10:
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/babel-preset-babili/-/babel-preset-babili-0.0.10.tgz#59118924b77b898eecd8f75a5b97d694719443ff"
+ dependencies:
+ babel-plugin-minify-constant-folding "^0.0.3"
+ babel-plugin-minify-dead-code-elimination "^0.1.2"
+ babel-plugin-minify-flip-comparisons "^0.0.2"
+ babel-plugin-minify-guarded-expressions "^0.0.4"
+ babel-plugin-minify-infinity "^0.0.3"
+ babel-plugin-minify-mangle-names "^0.0.6"
+ babel-plugin-minify-numeric-literals "^0.0.1"
+ babel-plugin-minify-replace "^0.0.1"
+ babel-plugin-minify-simplify "^0.0.6"
+ babel-plugin-minify-type-constructors "^0.0.3"
+ babel-plugin-transform-inline-consecutive-adds "^0.0.2"
+ babel-plugin-transform-member-expression-literals "^6.8.1"
+ babel-plugin-transform-merge-sibling-variables "^6.8.1"
+ babel-plugin-transform-minify-booleans "^6.8.0"
+ babel-plugin-transform-property-literals "^6.8.1"
+ babel-plugin-transform-regexp-constructors "^0.0.5"
+ babel-plugin-transform-remove-console "^6.8.0"
+ babel-plugin-transform-remove-debugger "^6.8.0"
+ babel-plugin-transform-remove-undefined "^0.0.4"
+ babel-plugin-transform-simplify-comparison-operators "^6.8.1"
+ babel-plugin-transform-undefined-to-void "^6.8.0"
+ lodash.isplainobject "^4.0.6"
+
+babel-preset-env@^1.2.2:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.5.1.tgz#d2eca6af179edf27cdc305a84820f601b456dd0b"
+ dependencies:
+ babel-plugin-check-es2015-constants "^6.22.0"
+ babel-plugin-syntax-trailing-function-commas "^6.22.0"
+ babel-plugin-transform-async-to-generator "^6.22.0"
+ babel-plugin-transform-es2015-arrow-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoping "^6.23.0"
+ babel-plugin-transform-es2015-classes "^6.23.0"
+ babel-plugin-transform-es2015-computed-properties "^6.22.0"
+ babel-plugin-transform-es2015-destructuring "^6.23.0"
+ babel-plugin-transform-es2015-duplicate-keys "^6.22.0"
+ babel-plugin-transform-es2015-for-of "^6.23.0"
+ babel-plugin-transform-es2015-function-name "^6.22.0"
+ babel-plugin-transform-es2015-literals "^6.22.0"
+ babel-plugin-transform-es2015-modules-amd "^6.22.0"
+ babel-plugin-transform-es2015-modules-commonjs "^6.23.0"
+ babel-plugin-transform-es2015-modules-systemjs "^6.23.0"
+ babel-plugin-transform-es2015-modules-umd "^6.23.0"
+ babel-plugin-transform-es2015-object-super "^6.22.0"
+ babel-plugin-transform-es2015-parameters "^6.23.0"
+ babel-plugin-transform-es2015-shorthand-properties "^6.22.0"
+ babel-plugin-transform-es2015-spread "^6.22.0"
+ babel-plugin-transform-es2015-sticky-regex "^6.22.0"
+ babel-plugin-transform-es2015-template-literals "^6.22.0"
+ babel-plugin-transform-es2015-typeof-symbol "^6.23.0"
+ babel-plugin-transform-es2015-unicode-regex "^6.22.0"
+ babel-plugin-transform-exponentiation-operator "^6.22.0"
+ babel-plugin-transform-regenerator "^6.22.0"
+ browserslist "^2.1.2"
+ invariant "^2.2.2"
+ semver "^5.3.0"
+
+babel-preset-es2015@^6.18.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939"
+ dependencies:
+ babel-plugin-check-es2015-constants "^6.22.0"
+ babel-plugin-transform-es2015-arrow-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoping "^6.24.1"
+ babel-plugin-transform-es2015-classes "^6.24.1"
+ babel-plugin-transform-es2015-computed-properties "^6.24.1"
+ babel-plugin-transform-es2015-destructuring "^6.22.0"
+ babel-plugin-transform-es2015-duplicate-keys "^6.24.1"
+ babel-plugin-transform-es2015-for-of "^6.22.0"
+ babel-plugin-transform-es2015-function-name "^6.24.1"
+ babel-plugin-transform-es2015-literals "^6.22.0"
+ babel-plugin-transform-es2015-modules-amd "^6.24.1"
+ babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+ babel-plugin-transform-es2015-modules-systemjs "^6.24.1"
+ babel-plugin-transform-es2015-modules-umd "^6.24.1"
+ babel-plugin-transform-es2015-object-super "^6.24.1"
+ babel-plugin-transform-es2015-parameters "^6.24.1"
+ babel-plugin-transform-es2015-shorthand-properties "^6.24.1"
+ babel-plugin-transform-es2015-spread "^6.22.0"
+ babel-plugin-transform-es2015-sticky-regex "^6.24.1"
+ babel-plugin-transform-es2015-template-literals "^6.22.0"
+ babel-plugin-transform-es2015-typeof-symbol "^6.22.0"
+ babel-plugin-transform-es2015-unicode-regex "^6.24.1"
+ babel-plugin-transform-regenerator "^6.24.1"
+
+babel-preset-jest@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-19.0.0.tgz#22d67201d02324a195811288eb38294bb3cac396"
+ dependencies:
+ babel-plugin-jest-hoist "^19.0.0"
+
+babel-register@^6.24.0, babel-register@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f"
+ dependencies:
+ babel-core "^6.24.1"
+ babel-runtime "^6.22.0"
+ core-js "^2.4.0"
+ home-or-tmp "^2.0.0"
+ lodash "^4.2.0"
+ mkdirp "^0.5.1"
+ source-map-support "^0.4.2"
+
+babel-runtime@^6.18.0, babel-runtime@^6.22.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b"
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.10.0"
+
+babel-template@^6.16.0, babel-template@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+ babylon "^6.11.0"
+ lodash "^4.2.0"
+
+babel-traverse@^6.18.0, babel-traverse@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695"
+ dependencies:
+ babel-code-frame "^6.22.0"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ babylon "^6.15.0"
+ debug "^2.2.0"
+ globals "^9.0.0"
+ invariant "^2.2.0"
+ lodash "^4.2.0"
+
+babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975"
+ dependencies:
+ babel-runtime "^6.22.0"
+ esutils "^2.0.2"
+ lodash "^4.2.0"
+ to-fast-properties "^1.0.1"
+
+babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0:
+ version "6.17.2"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.2.tgz#201d25ef5f892c41bae49488b08db0dd476e9f5c"
+
+backo2@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
+
+balanced-match@^0.4.1:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
+
+base64-arraybuffer@0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
+
+base64-js@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1"
+
+base64id@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6"
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+ dependencies:
+ tweetnacl "^0.14.3"
+
+beeper@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809"
+
+better-assert@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
+ dependencies:
+ callsite "1.0.0"
+
+"binaryextensions@1 || 2":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-1.0.1.tgz#1e637488b35b58bda5f4774bf96a5212a8c90755"
+
+bl@^1.0.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e"
+ dependencies:
+ readable-stream "^2.0.5"
+
+blob@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921"
+
+body-parser@^1.14.2:
+ version "1.17.2"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.2.tgz#f8892abc8f9e627d42aedafbca66bf5ab99104ee"
+ dependencies:
+ bytes "2.4.0"
+ content-type "~1.0.2"
+ debug "2.6.7"
+ depd "~1.1.0"
+ http-errors "~1.6.1"
+ iconv-lite "0.4.15"
+ on-finished "~2.3.0"
+ qs "6.4.0"
+ raw-body "~2.2.0"
+ type-is "~1.6.15"
+
+boom@2.x.x:
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
+ dependencies:
+ hoek "2.x.x"
+
+bower-json@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/bower-json/-/bower-json-0.8.1.tgz#96c14723241ae6466a9c52e16caa32623a883843"
+ dependencies:
+ deep-extend "^0.4.0"
+ ext-name "^3.0.0"
+ graceful-fs "^4.1.3"
+ intersect "^1.0.1"
+
+bower-logger@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/bower-logger/-/bower-logger-0.2.2.tgz#39be07e979b2fc8e03a94634205ed9422373d381"
+
+bower@1.8.0, bower@^1.5.2:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/bower/-/bower-1.8.0.tgz#55dbebef0ad9155382d9e9d3e497c1372345b44a"
+
+boxen@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/boxen/-/boxen-0.6.0.tgz#8364d4248ac34ff0ef1b2f2bf49a6c60ce0d81b6"
+ dependencies:
+ ansi-align "^1.1.0"
+ camelcase "^2.1.0"
+ chalk "^1.1.1"
+ cli-boxes "^1.0.0"
+ filled-array "^1.0.0"
+ object-assign "^4.0.1"
+ repeating "^2.0.0"
+ string-width "^1.0.1"
+ widest-line "^1.0.0"
+
+boxen@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.1.0.tgz#b1b69dd522305e807a99deee777dbd6e5167b102"
+ dependencies:
+ ansi-align "^2.0.0"
+ camelcase "^4.0.0"
+ chalk "^1.1.1"
+ cli-boxes "^1.0.0"
+ string-width "^2.0.0"
+ term-size "^0.1.0"
+ widest-line "^1.0.0"
+
+brace-expansion@^1.0.0, brace-expansion@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59"
+ dependencies:
+ balanced-match "^0.4.1"
+ concat-map "0.0.1"
+
+braces@^1.8.2:
+ version "1.8.5"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+ dependencies:
+ expand-range "^1.8.1"
+ preserve "^0.2.0"
+ repeat-element "^1.1.2"
+
+browser-resolve@^1.11.0, browser-resolve@^1.11.2:
+ version "1.11.2"
+ resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
+ dependencies:
+ resolve "1.1.7"
+
+browser-stdout@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f"
+
+browserify-zlib@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d"
+ dependencies:
+ pako "~0.2.0"
+
+browserslist@^2.1.2:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.1.4.tgz#cc526af4a1312b7d2e05653e56d0c8ab70c0e053"
+ dependencies:
+ caniuse-lite "^1.0.30000670"
+ electron-to-chromium "^1.3.11"
+
+browserstack@^1.2.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.5.0.tgz#b565425ad62ed72c1082a1eb979d5313c7d4754f"
+ dependencies:
+ https-proxy-agent "1.0.0"
+
+bser@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169"
+ dependencies:
+ node-int64 "^0.4.0"
+
+bser@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719"
+ dependencies:
+ node-int64 "^0.4.0"
+
+buf-compare@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/buf-compare/-/buf-compare-1.0.1.tgz#fef28da8b8113a0a0db4430b0b6467b69730b34a"
+
+buffer-crc32@^0.2.1, buffer-crc32@~0.2.3:
+ version "0.2.13"
+ resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+
+buffer-shims@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51"
+
+builtin-modules@^1.0.0, builtin-modules@^1.1.0, builtin-modules@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+busboy@^0.2.11:
+ version "0.2.14"
+ resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453"
+ dependencies:
+ dicer "0.2.5"
+ readable-stream "1.1.x"
+
+bytes@2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.3.0.tgz#d5b680a165b6201739acb611542aabc2d8ceb070"
+
+bytes@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339"
+
+caller-path@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
+ dependencies:
+ callsites "^0.2.0"
+
+callsite@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
+
+callsites@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
+
+callsites@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+
+camel-case@3.0.x:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
+ dependencies:
+ no-case "^2.2.0"
+ upper-case "^1.1.1"
+
+camelcase-keys@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+ dependencies:
+ camelcase "^2.0.0"
+ map-obj "^1.0.0"
+
+camelcase@^1.0.2:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+camelcase@^2.0.0, camelcase@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+
+camelcase@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
+
+camelcase@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
+caniuse-lite@^1.0.30000670:
+ version "1.0.30000676"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000676.tgz#1e962123f48073f0c51c4ea0651dd64d25786498"
+
+capture-stack-trace@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d"
+
+caseless@~0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
+
+center-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+ dependencies:
+ align-text "^0.1.3"
+ lazy-cache "^1.0.3"
+
+chai@^3.2.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247"
+ dependencies:
+ assertion-error "^1.0.1"
+ deep-eql "^0.1.3"
+ type-detect "^1.0.0"
+
+chalk@*, chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chalk@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f"
+ dependencies:
+ ansi-styles "~1.0.0"
+ has-color "~0.1.0"
+ strip-ansi "~0.1.0"
+
+chownr@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
+
+ci-info@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534"
+
+circular-json@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d"
+
+class-extend@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/class-extend/-/class-extend-0.1.2.tgz#8057a82b00f53f82a5d62c50ef8cffdec6fabc34"
+ dependencies:
+ object-assign "^2.0.0"
+
+clean-css@4.1.x:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.3.tgz#07cfe8980edb20d455ddc23aadcf1e04c6e509ce"
+ dependencies:
+ source-map "0.5.x"
+
+cleankill@^1.0.0, cleankill@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/cleankill/-/cleankill-1.0.3.tgz#e7419bd24abc07f2d182d3a09a935c1bcdede6bd"
+
+cli-boxes@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
+
+cli-cursor@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
+ dependencies:
+ restore-cursor "^1.0.1"
+
+cli-table@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23"
+ dependencies:
+ colors "1.0.3"
+
+cli-width@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a"
+
+cliui@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+ dependencies:
+ center-align "^0.1.1"
+ right-align "^0.1.1"
+ wordwrap "0.0.2"
+
+cliui@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wrap-ansi "^2.0.0"
+
+clone-buffer@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
+
+clone-stats@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
+
+clone-stats@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680"
+
+clone@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f"
+
+clone@^1.0.0, clone@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149"
+
+clone@^2.0.0, clone@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb"
+
+cloneable-readable@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.0.0.tgz#a6290d413f217a61232f95e458ff38418cfb0117"
+ dependencies:
+ inherits "^2.0.1"
+ process-nextick-args "^1.0.6"
+ through2 "^2.0.1"
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+color-convert@^1.0.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a"
+ dependencies:
+ color-name "^1.1.1"
+
+color-name@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.2.tgz#5c8ab72b64bd2215d617ae9559ebb148475cf98d"
+
+colors@1.0.3, colors@1.0.x:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
+
+combined-stream@^1.0.5, combined-stream@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
+ dependencies:
+ delayed-stream "~1.0.0"
+
+command-line-args@^3.0.0, command-line-args@^3.0.1:
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-3.0.5.tgz#5bd4ad45e7983e5c1344918e40280ee2693c5ac0"
+ dependencies:
+ array-back "^1.0.4"
+ feature-detect-es6 "^1.3.1"
+ find-replace "^1.0.2"
+ typical "^2.6.0"
+
+command-line-commands@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/command-line-commands/-/command-line-commands-1.0.4.tgz#034f9b167b5188afbdcf6b2efbb150fc8442c32b"
+ dependencies:
+ array-back "^1.0.3"
+ feature-detect-es6 "^1.3.1"
+
+command-line-usage@^3.0.1, command-line-usage@^3.0.3, command-line-usage@^3.0.5:
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-3.0.8.tgz#b6a20978c1b383477f5c11a529428b880bfe0f4d"
+ dependencies:
+ ansi-escape-sequences "^3.0.0"
+ array-back "^1.0.3"
+ feature-detect-es6 "^1.3.1"
+ table-layout "^0.3.0"
+ typical "^2.6.0"
+
+commander@2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.6.0.tgz#9df7e52fb2a0cb0fb89058ee80c3104225f37e1d"
+
+commander@2.9.0, commander@2.9.x, commander@^2.9.0, commander@~2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
+ dependencies:
+ graceful-readlink ">= 1.0.0"
+
+commondir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+
+component-bind@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
+
+component-emitter@1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3"
+
+component-emitter@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+component-inherit@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
+
+compress-commons@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.0.tgz#58587092ef20d37cb58baf000112c9278ff73b9f"
+ dependencies:
+ buffer-crc32 "^0.2.1"
+ crc32-stream "^2.0.0"
+ normalize-path "^2.0.0"
+ readable-stream "^2.0.0"
+
+compressible@~2.0.8:
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.10.tgz#feda1c7f7617912732b29bf8cf26252a20b9eecd"
+ dependencies:
+ mime-db ">= 1.27.0 < 2"
+
+compression@^1.6.2:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/compression/-/compression-1.6.2.tgz#cceb121ecc9d09c52d7ad0c3350ea93ddd402bc3"
+ dependencies:
+ accepts "~1.3.3"
+ bytes "2.3.0"
+ compressible "~2.0.8"
+ debug "~2.2.0"
+ on-headers "~1.0.1"
+ vary "~1.1.0"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.5.2:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+configstore@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/configstore/-/configstore-2.1.0.tgz#737a3a7036e9886102aa6099e47bb33ab1aba1a1"
+ dependencies:
+ dot-prop "^3.0.0"
+ graceful-fs "^4.1.2"
+ mkdirp "^0.5.0"
+ object-assign "^4.0.1"
+ os-tmpdir "^1.0.0"
+ osenv "^0.1.0"
+ uuid "^2.0.1"
+ write-file-atomic "^1.1.2"
+ xdg-basedir "^2.0.0"
+
+configstore@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.0.tgz#45df907073e26dfa1cf4b2d52f5b60545eaa11d1"
+ dependencies:
+ dot-prop "^4.1.0"
+ graceful-fs "^4.1.2"
+ make-dir "^1.0.0"
+ unique-string "^1.0.0"
+ write-file-atomic "^2.0.0"
+ xdg-basedir "^3.0.0"
+
+contains-path@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a"
+
+content-disposition@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
+
+content-type-parser@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94"
+
+content-type@^1.0.2, content-type@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed"
+
+convert-source-map@^1.1.0, convert-source-map@^1.1.1:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5"
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+
+cookie@0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+
+core-assert@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/core-assert/-/core-assert-0.2.1.tgz#f85e2cf9bfed28f773cc8b3fa5c5b69bdc02fe3f"
+ dependencies:
+ buf-compare "^1.0.0"
+ is-error "^2.2.0"
+
+core-js@^2.0.0, core-js@^2.4.0, core-js@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e"
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+coveralls@^2.11.9:
+ version "2.13.1"
+ resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-2.13.1.tgz#d70bb9acc1835ec4f063ff9dac5423c17b11f178"
+ dependencies:
+ js-yaml "3.6.1"
+ lcov-parse "0.0.10"
+ log-driver "1.2.5"
+ minimist "1.2.0"
+ request "2.79.0"
+
+crc32-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4"
+ dependencies:
+ crc "^3.4.4"
+ readable-stream "^2.0.0"
+
+crc@3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/crc/-/crc-3.2.1.tgz#5d9c8fb77a245cd5eca291e5d2d005334bab0082"
+
+crc@^3.4.4:
+ version "3.4.4"
+ resolved "https://registry.yarnpkg.com/crc/-/crc-3.4.4.tgz#9da1e980e3bd44fc5c93bf5ab3da3378d85e466b"
+
+create-error-class@^3.0.0, create-error-class@^3.0.1:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
+ dependencies:
+ capture-stack-trace "^1.0.0"
+
+cross-spawn-async@^2.1.1:
+ version "2.2.5"
+ resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc"
+ dependencies:
+ lru-cache "^4.0.0"
+ which "^1.2.8"
+
+cross-spawn@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41"
+ dependencies:
+ lru-cache "^4.0.1"
+ which "^1.2.9"
+
+cross-spawn@^5.0.1:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+ dependencies:
+ lru-cache "^4.0.1"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+cryptiles@2.x.x:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
+ dependencies:
+ boom "2.x.x"
+
+crypto-random-string@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
+
+css-slam@^1.1.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/css-slam/-/css-slam-1.2.1.tgz#2467e5aecb7e989bd04f656011dd1cf8eb3e7165"
+ dependencies:
+ command-line-args "^3.0.1"
+ command-line-usage "^3.0.5"
+ dom5 "^1.3.1"
+ shady-css-parser "0.0.8"
+
+cssbeautify@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/cssbeautify/-/cssbeautify-0.3.1.tgz#12dd1f734035c2e6faca67dcbdcef74e42811397"
+
+cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b"
+
+"cssstyle@>= 0.2.37 < 0.3.0":
+ version "0.2.37"
+ resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54"
+ dependencies:
+ cssom "0.3.x"
+
+currently-unhandled@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
+ dependencies:
+ array-find-index "^1.0.1"
+
+cycle@1.0.x:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2"
+
+d@1:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
+ dependencies:
+ es5-ext "^0.10.9"
+
+dargs@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/dargs/-/dargs-5.1.0.tgz#ec7ea50c78564cd36c9d5ec18f66329fade27829"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ dependencies:
+ assert-plus "^1.0.0"
+
+dateformat@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17"
+
+debug@2, debug@^2.0.0, debug@^2.1.0, debug@^2.1.1, debug@^2.2.0, debug@^2.6.3, debug@^2.6.8:
+ version "2.6.8"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc"
+ dependencies:
+ ms "2.0.0"
+
+debug@2.2.0, debug@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
+ dependencies:
+ ms "0.7.1"
+
+debug@2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c"
+ dependencies:
+ ms "0.7.2"
+
+debug@2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b"
+ dependencies:
+ ms "0.7.2"
+
+debug@2.6.7:
+ version "2.6.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e"
+ dependencies:
+ ms "2.0.0"
+
+debug@~2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.1.3.tgz#ce8ab1b5ee8fbee2bfa3b633cab93d366b63418e"
+ dependencies:
+ ms "0.7.0"
+
+decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+deep-assign@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-1.0.0.tgz#b092743be8427dc621ea0067cdec7e70dd19f37b"
+ dependencies:
+ is-obj "^1.0.0"
+
+deep-eql@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2"
+ dependencies:
+ type-detect "0.1.1"
+
+deep-extend@^0.4.0, deep-extend@~0.4.0, deep-extend@~0.4.1:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
+
+deep-is@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+
+deep-strict-equal@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/deep-strict-equal/-/deep-strict-equal-0.2.0.tgz#4a078147a8ab57f6a0d4f5547243cd22f44eb4e4"
+ dependencies:
+ core-assert "^0.2.0"
+
+default-require-extensions@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8"
+ dependencies:
+ strip-bom "^2.0.0"
+
+defaults@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
+ dependencies:
+ clone "^1.0.2"
+
+del@^2.0.2, del@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
+ dependencies:
+ globby "^5.0.0"
+ is-path-cwd "^1.0.0"
+ is-path-in-cwd "^1.0.0"
+ object-assign "^4.0.1"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ rimraf "^2.2.8"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+depd@1.1.0, depd@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3"
+
+depd@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.0.1.tgz#80aec64c9d6d97e65cc2a9caa93c0aa6abf73aaa"
+
+deprecated@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19"
+
+destroy@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.3.tgz#b433b4724e71fd8551d9885174851c5fc377e2c9"
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+
+detect-conflict@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/detect-conflict/-/detect-conflict-1.0.1.tgz#088657a66a961c05019db7c4230883b1c6b4176e"
+
+detect-file@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63"
+ dependencies:
+ fs-exists-sync "^0.1.0"
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ dependencies:
+ repeating "^2.0.0"
+
+detect-indent@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
+
+detect-node@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127"
+
+dicer@0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f"
+ dependencies:
+ readable-stream "1.1.x"
+ streamsearch "0.1.2"
+
+diff@3.2.0, diff@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9"
+
+diff@^2.1.2:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-2.2.3.tgz#60eafd0d28ee906e4e8ff0a52c1229521033bf99"
+
+doctrine@1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
+ dependencies:
+ esutils "^2.0.2"
+ isarray "^1.0.0"
+
+doctrine@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63"
+ dependencies:
+ esutils "^2.0.2"
+ isarray "^1.0.0"
+
+dom-urls@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/dom-urls/-/dom-urls-1.1.0.tgz#001ddf81628cd1e706125c7176f53ccec55d918e"
+ dependencies:
+ urijs "^1.16.1"
+
+dom-walk@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
+
+dom5@^1.3.1:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/dom5/-/dom5-1.3.6.tgz#a7088a9fc5f3b08dc9f6eda4c7abaeb241945e0d"
+ dependencies:
+ "@types/clone" "^0.1.29"
+ "@types/node" "^4.0.30"
+ "@types/parse5" "^0.0.31"
+ clone "^1.0.2"
+ parse5 "^1.4.1"
+
+dom5@^2.0.0, dom5@^2.0.1, dom5@^2.1.0, dom5@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/dom5/-/dom5-2.3.0.tgz#f8204975bd0dacbbe5b58a8a93ffc1fed0ffcd2a"
+ dependencies:
+ "@types/clone" "^0.1.29"
+ "@types/node" "^6.0.0"
+ "@types/parse5" "^2.2.32"
+ clone "^2.1.0"
+ parse5 "^2.2.2"
+
+dot-prop@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177"
+ dependencies:
+ is-obj "^1.0.0"
+
+dot-prop@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.1.1.tgz#a8493f0b7b5eeec82525b5c7587fa7de7ca859c1"
+ dependencies:
+ is-obj "^1.0.0"
+
+duplexer2@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db"
+ dependencies:
+ readable-stream "~1.1.9"
+
+duplexer2@^0.1.2, duplexer2@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
+ dependencies:
+ readable-stream "^2.0.2"
+
+duplexer3@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+
+duplexify@^3.1.2, duplexify@^3.2.0, duplexify@^3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604"
+ dependencies:
+ end-of-stream "1.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+ stream-shift "^1.0.0"
+
+ecc-jsbn@~0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
+ dependencies:
+ jsbn "~0.1.0"
+
+editions@^1.1.1:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.3.tgz#0907101bdda20fac3cbe334c27cbd0688dc99a5b"
+
+ee-first@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.0.tgz#6a0d7c6221e490feefd92ec3f441c9ce8cd097f4"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+
+ejs@^2.3.1:
+ version "2.5.6"
+ resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.6.tgz#479636bfa3fe3b1debd52087f0acb204b4f19c88"
+
+electron-to-chromium@^1.3.11:
+ version "1.3.13"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.13.tgz#1b3a5eace6e087bb5e257a100b0cbfe81b2891fc"
+
+encodeurl@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20"
+
+end-of-stream@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e"
+ dependencies:
+ once "~1.3.0"
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206"
+ dependencies:
+ once "^1.4.0"
+
+end-of-stream@~0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf"
+ dependencies:
+ once "~1.3.0"
+
+ends-with@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/ends-with/-/ends-with-0.2.0.tgz#2f9da98d57a50cfda4571ce4339000500f4e6b8a"
+
+engine.io-client@~1.8.4:
+ version "1.8.4"
+ resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.4.tgz#9fe85dee25853ca6babe25bd2ad68710863e91c2"
+ dependencies:
+ component-emitter "1.2.1"
+ component-inherit "0.0.3"
+ debug "2.3.3"
+ engine.io-parser "1.3.2"
+ has-cors "1.1.0"
+ indexof "0.0.1"
+ parsejson "0.0.3"
+ parseqs "0.0.5"
+ parseuri "0.0.5"
+ ws "1.1.2"
+ xmlhttprequest-ssl "1.5.3"
+ yeast "0.1.2"
+
+engine.io-parser@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46cb220b8cb435220a"
+ dependencies:
+ after "0.8.2"
+ arraybuffer.slice "0.0.6"
+ base64-arraybuffer "0.1.5"
+ blob "0.0.4"
+ has-binary "0.1.7"
+ wtf-8 "1.0.0"
+
+engine.io@~1.8.4:
+ version "1.8.4"
+ resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.4.tgz#77bce12b80e5d60429337fec3b0daf691ebc9003"
+ dependencies:
+ accepts "1.3.3"
+ base64id "1.0.0"
+ cookie "0.3.1"
+ debug "2.3.3"
+ engine.io-parser "1.3.2"
+ ws "1.1.4"
+
+enhance-visitors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/enhance-visitors/-/enhance-visitors-1.0.0.tgz#aa945d05da465672a1ebd38fee2ed3da8518e95a"
+ dependencies:
+ lodash "^4.13.1"
+
+"errno@>=0.1.1 <0.2.0-0":
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d"
+ dependencies:
+ prr "~0.0.0"
+
+error-ex@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
+ dependencies:
+ is-arrayish "^0.2.1"
+
+error@^7.0.2:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02"
+ dependencies:
+ string-template "~0.2.1"
+ xtend "~4.0.0"
+
+es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14:
+ version "0.10.22"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.22.tgz#1876c51f990769c112c781ea3ebe89f84fd39071"
+ dependencies:
+ es6-iterator "2"
+ es6-symbol "~3.1"
+
+es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512"
+ dependencies:
+ d "1"
+ es5-ext "^0.10.14"
+ es6-symbol "^3.1"
+
+es6-map@^0.1.3:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+ es6-iterator "~2.0.1"
+ es6-set "~0.1.5"
+ es6-symbol "~3.1.1"
+ event-emitter "~0.3.5"
+
+es6-promise@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-2.3.0.tgz#96edb9f2fdb01995822b263dd8aadab6748181bc"
+
+es6-promise@^4.0.5:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.0.tgz#dda03ca8f9f89bc597e689842929de7ba8cebdf0"
+
+es6-set@~0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+ es6-iterator "~2.0.1"
+ es6-symbol "3.1.1"
+ event-emitter "~0.3.5"
+
+es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+es6-weak-map@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
+ dependencies:
+ d "1"
+ es5-ext "^0.10.14"
+ es6-iterator "^2.0.1"
+ es6-symbol "^3.1.1"
+
+escape-html@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.1.tgz#181a286ead397a39a92857cfb1d43052e356bff0"
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+escodegen@^1.6.1, escodegen@^1.7.0:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018"
+ dependencies:
+ esprima "^2.7.1"
+ estraverse "^1.9.1"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.2.0"
+
+escope@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
+ dependencies:
+ es6-map "^0.1.3"
+ es6-weak-map "^2.0.1"
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+eslint-config-xo@^0.18.0:
+ version "0.18.2"
+ resolved "https://registry.yarnpkg.com/eslint-config-xo/-/eslint-config-xo-0.18.2.tgz#0a157120875619929e735ffd6b185c41e8a187af"
+
+eslint-formatter-pretty@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-formatter-pretty/-/eslint-formatter-pretty-1.1.0.tgz#ab4d06da02fed8c13ae9f0dc540a433ef7ed6f5e"
+ dependencies:
+ ansi-escapes "^1.4.0"
+ chalk "^1.1.3"
+ log-symbols "^1.0.2"
+ plur "^2.1.2"
+ string-width "^2.0.0"
+
+eslint-import-resolver-node@^0.2.0:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz#5add8106e8c928db2cba232bcd9efa846e3da16c"
+ dependencies:
+ debug "^2.2.0"
+ object-assign "^4.0.1"
+ resolve "^1.1.6"
+
+eslint-module-utils@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.0.0.tgz#a6f8c21d901358759cdc35dbac1982ae1ee58bce"
+ dependencies:
+ debug "2.2.0"
+ pkg-dir "^1.0.0"
+
+eslint-plugin-ava@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-ava/-/eslint-plugin-ava-4.2.0.tgz#12e4664659c1fae7895fa3f346c313ceb8907c77"
+ dependencies:
+ arrify "^1.0.1"
+ deep-strict-equal "^0.2.0"
+ enhance-visitors "^1.0.0"
+ espree "^3.1.3"
+ espurify "^1.5.0"
+ multimatch "^2.1.0"
+ pkg-up "^1.0.0"
+ req-all "^1.0.0"
+
+eslint-plugin-import@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.3.0.tgz#37c801e0ada0e296cbdf20c3f393acb5b52af36b"
+ dependencies:
+ builtin-modules "^1.1.1"
+ contains-path "^0.1.0"
+ debug "^2.2.0"
+ doctrine "1.5.0"
+ eslint-import-resolver-node "^0.2.0"
+ eslint-module-utils "^2.0.0"
+ has "^1.0.1"
+ lodash.cond "^4.3.0"
+ minimatch "^3.0.3"
+ read-pkg-up "^2.0.0"
+
+eslint-plugin-no-use-extend-native@^0.3.2:
+ version "0.3.12"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-no-use-extend-native/-/eslint-plugin-no-use-extend-native-0.3.12.tgz#3ad9a00c2df23b5d7f7f6be91550985a4ab701ea"
+ dependencies:
+ is-get-set-prop "^1.0.0"
+ is-js-type "^2.0.0"
+ is-obj-prop "^1.0.0"
+ is-proto-prop "^1.0.0"
+
+eslint-plugin-promise@^3.4.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.5.0.tgz#78fbb6ffe047201627569e85a6c5373af2a68fca"
+
+eslint-plugin-unicorn@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-2.1.1.tgz#3e9294366799b715e16a6df89159495b68930cb3"
+ dependencies:
+ lodash.camelcase "^4.1.1"
+ lodash.kebabcase "^4.0.1"
+ lodash.snakecase "^4.0.1"
+ lodash.upperfirst "^4.2.0"
+ req-all "^1.0.0"
+
+eslint@^3.18.0:
+ version "3.19.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc"
+ dependencies:
+ babel-code-frame "^6.16.0"
+ chalk "^1.1.3"
+ concat-stream "^1.5.2"
+ debug "^2.1.1"
+ doctrine "^2.0.0"
+ escope "^3.6.0"
+ espree "^3.4.0"
+ esquery "^1.0.0"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ file-entry-cache "^2.0.0"
+ glob "^7.0.3"
+ globals "^9.14.0"
+ ignore "^3.2.0"
+ imurmurhash "^0.1.4"
+ inquirer "^0.12.0"
+ is-my-json-valid "^2.10.0"
+ is-resolvable "^1.0.0"
+ js-yaml "^3.5.1"
+ json-stable-stringify "^1.0.0"
+ levn "^0.3.0"
+ lodash "^4.0.0"
+ mkdirp "^0.5.0"
+ natural-compare "^1.4.0"
+ optionator "^0.8.2"
+ path-is-inside "^1.0.1"
+ pluralize "^1.2.1"
+ progress "^1.1.8"
+ require-uncached "^1.0.2"
+ shelljs "^0.7.5"
+ strip-bom "^3.0.0"
+ strip-json-comments "~2.0.1"
+ table "^3.7.8"
+ text-table "~0.2.0"
+ user-home "^2.0.0"
+
+espree@^3.1.3, espree@^3.1.7, espree@^3.4.0:
+ version "3.4.3"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.3.tgz#2910b5ccd49ce893c2ffffaab4fd8b3a31b82374"
+ dependencies:
+ acorn "^5.0.1"
+ acorn-jsx "^3.0.0"
+
+esprima@^2.6.0, esprima@^2.7.1:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
+
+esprima@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+
+espurify@^1.5.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/espurify/-/espurify-1.7.0.tgz#1c5cf6cbccc32e6f639380bd4f991fab9ba9d226"
+ dependencies:
+ core-js "^2.0.0"
+
+esquery@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa"
+ dependencies:
+ estraverse "^4.0.0"
+
+esrecurse@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220"
+ dependencies:
+ estraverse "~4.1.0"
+ object-assign "^4.0.1"
+
+estraverse@^1.9.1:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
+
+estraverse@^4.0.0, estraverse@^4.1.1, estraverse@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+estraverse@~4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2"
+
+estree-walker@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e"
+
+estree-walker@^0.3.0:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa"
+
+esutils@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+etag@~1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.5.1.tgz#54c50de04ee42695562925ac566588291be7e9ea"
+ dependencies:
+ crc "3.2.1"
+
+etag@~1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8"
+
+etag@~1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051"
+
+event-emitter@~0.3.5:
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+eventemitter3@1.x.x:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
+
+exec-sh@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10"
+ dependencies:
+ merge "^1.1.3"
+
+execa@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3"
+ dependencies:
+ cross-spawn-async "^2.1.1"
+ is-stream "^1.1.0"
+ npm-run-path "^1.0.0"
+ object-assign "^4.0.1"
+ path-key "^1.0.0"
+ strip-eof "^1.0.0"
+
+execa@^0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.5.1.tgz#de3fb85cb8d6e91c85bcbceb164581785cb57b36"
+ dependencies:
+ cross-spawn "^4.0.0"
+ get-stream "^2.2.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+exit-hook@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
+
+expand-brackets@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+ dependencies:
+ is-posix-bracket "^0.1.0"
+
+expand-range@^1.8.1:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+ dependencies:
+ fill-range "^2.1.0"
+
+expand-tilde@^1.2.1, expand-tilde@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449"
+ dependencies:
+ os-homedir "^1.0.1"
+
+express@^4.8.5:
+ version "4.15.3"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.15.3.tgz#bab65d0f03aa80c358408972fc700f916944b662"
+ dependencies:
+ accepts "~1.3.3"
+ array-flatten "1.1.1"
+ content-disposition "0.5.2"
+ content-type "~1.0.2"
+ cookie "0.3.1"
+ cookie-signature "1.0.6"
+ debug "2.6.7"
+ depd "~1.1.0"
+ encodeurl "~1.0.1"
+ escape-html "~1.0.3"
+ etag "~1.8.0"
+ finalhandler "~1.0.3"
+ fresh "0.5.0"
+ merge-descriptors "1.0.1"
+ methods "~1.1.2"
+ on-finished "~2.3.0"
+ parseurl "~1.3.1"
+ path-to-regexp "0.1.7"
+ proxy-addr "~1.1.4"
+ qs "6.4.0"
+ range-parser "~1.2.0"
+ send "0.15.3"
+ serve-static "1.12.3"
+ setprototypeof "1.0.3"
+ statuses "~1.3.1"
+ type-is "~1.6.15"
+ utils-merge "1.0.0"
+ vary "~1.1.1"
+
+ext-list@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.1.tgz#ba045fac10c92300b4e0606269e4988ddc572b1e"
+ dependencies:
+ mime-db "^1.28.0"
+
+ext-name@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-3.0.0.tgz#07e4418737cb1f513c32c6ea48d8b8c8e0471abb"
+ dependencies:
+ ends-with "^0.2.0"
+ ext-list "^2.0.0"
+ meow "^3.1.0"
+ sort-keys-length "^1.0.0"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend@3, extend@^3.0.0, extend@~3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
+
+external-editor@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b"
+ dependencies:
+ extend "^3.0.0"
+ spawn-sync "^1.0.15"
+ tmp "^0.0.29"
+
+extglob@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+ dependencies:
+ is-extglob "^1.0.0"
+
+extsprintf@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
+
+eyes@0.1.x:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0"
+
+fancy-log@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948"
+ dependencies:
+ chalk "^1.1.1"
+ time-stamp "^1.0.0"
+
+fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+
+fb-watchman@^1.8.0:
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.2.tgz#a24cf47827f82d38fb59a69ad70b76e3b6ae7383"
+ dependencies:
+ bser "1.0.2"
+
+fb-watchman@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58"
+ dependencies:
+ bser "^2.0.0"
+
+fd-slicer@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65"
+ dependencies:
+ pend "~1.2.0"
+
+feature-detect-es6@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/feature-detect-es6/-/feature-detect-es6-1.3.1.tgz#f888736af9cb0c91f55663bfa4762eb96ee7047f"
+ dependencies:
+ array-back "^1.0.3"
+
+figures@^1.3.5:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
+ dependencies:
+ escape-string-regexp "^1.0.5"
+ object-assign "^4.1.0"
+
+file-entry-cache@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
+ dependencies:
+ flat-cache "^1.2.1"
+ object-assign "^4.0.1"
+
+filename-regex@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+
+fileset@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0"
+ dependencies:
+ glob "^7.0.3"
+ minimatch "^3.0.3"
+
+fill-range@^2.1.0:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
+ dependencies:
+ is-number "^2.1.0"
+ isobject "^2.0.0"
+ randomatic "^1.1.3"
+ repeat-element "^1.1.2"
+ repeat-string "^1.5.2"
+
+filled-array@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/filled-array/-/filled-array-1.1.0.tgz#c3c4f6c663b923459a9aa29912d2d031f1507f84"
+
+finalhandler@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89"
+ dependencies:
+ debug "2.6.7"
+ encodeurl "~1.0.1"
+ escape-html "~1.0.3"
+ on-finished "~2.3.0"
+ parseurl "~1.3.1"
+ statuses "~1.3.1"
+ unpipe "~1.0.0"
+
+find-index@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4"
+
+find-port@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/find-port/-/find-port-1.0.1.tgz#db084a6cbf99564d99869ae79fbdecf66e8a185c"
+ dependencies:
+ async "~0.2.9"
+
+find-replace@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0"
+ dependencies:
+ array-back "^1.0.4"
+ test-value "^2.1.0"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+find-up@^2.0.0, find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ dependencies:
+ locate-path "^2.0.0"
+
+findup-sync@^0.4.2, findup-sync@^0.4.3:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12"
+ dependencies:
+ detect-file "^0.1.0"
+ is-glob "^2.0.1"
+ micromatch "^2.3.7"
+ resolve-dir "^0.1.0"
+
+fined@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/fined/-/fined-1.0.2.tgz#5b28424b760d7598960b7ef8480dff8ad3660e97"
+ dependencies:
+ expand-tilde "^1.2.1"
+ lodash.assignwith "^4.0.7"
+ lodash.isempty "^4.2.1"
+ lodash.isplainobject "^4.0.4"
+ lodash.isstring "^4.0.1"
+ lodash.pick "^4.2.1"
+ parse-filepath "^1.0.1"
+
+first-chunk-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e"
+
+first-chunk-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz#1bdecdb8e083c0664b91945581577a43a9f31d70"
+ dependencies:
+ readable-stream "^2.0.2"
+
+flagged-respawn@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5"
+
+flat-cache@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96"
+ dependencies:
+ circular-json "^0.3.1"
+ del "^2.0.2"
+ graceful-fs "^4.1.2"
+ write "^0.2.1"
+
+follow-redirects@0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-0.0.7.tgz#34b90bab2a911aa347571da90f22bd36ecd8a919"
+ dependencies:
+ debug "^2.2.0"
+ stream-consume "^0.1.0"
+
+for-in@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+ dependencies:
+ for-in "^1.0.1"
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+fork-stream@^0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/fork-stream/-/fork-stream-0.0.4.tgz#db849fce77f6708a5f8f386ae533a0907b54ae70"
+
+form-data@~2.1.1:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.5"
+ mime-types "^2.1.12"
+
+formatio@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9"
+ dependencies:
+ samsam "~1.1"
+
+forwarded@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363"
+
+freeport@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/freeport/-/freeport-1.0.5.tgz#255e8ab84170c33ba85d990e821ae5f4a1a9bc5d"
+
+fresh@0.2.4:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.2.4.tgz#3582499206c9723714190edd74b4604feb4a614c"
+
+fresh@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f"
+
+fresh@0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e"
+
+fs-exists-sync@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+function-bind@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771"
+
+gaze@^0.5.1:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f"
+ dependencies:
+ globule "~0.1.0"
+
+generate-function@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
+
+generate-object-property@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
+ dependencies:
+ is-property "^1.0.0"
+
+get-caller-file@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
+
+get-set-props@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/get-set-props/-/get-set-props-0.1.0.tgz#998475c178445686d0b32246da5df8dbcfbe8ea3"
+
+get-stdin@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+
+get-stdin@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398"
+
+get-stream@^2.2.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
+ dependencies:
+ object-assign "^4.0.1"
+ pinkie-promise "^2.0.0"
+
+get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ dependencies:
+ assert-plus "^1.0.0"
+
+gh-got@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/gh-got/-/gh-got-5.0.0.tgz#ee95be37106fd8748a96f8d1db4baea89e1bfa8a"
+ dependencies:
+ got "^6.2.0"
+ is-plain-obj "^1.1.0"
+
+github-username@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/github-username/-/github-username-3.0.0.tgz#0a772219b3130743429f2456d0bdd3db55dce7b1"
+ dependencies:
+ gh-got "^5.0.0"
+
+github@^7.2.1:
+ version "7.3.2"
+ resolved "https://registry.yarnpkg.com/github/-/github-7.3.2.tgz#fe10cde6964352c5d91e11a7616d26d5ffb6f87b"
+ dependencies:
+ follow-redirects "0.0.7"
+ https-proxy-agent "^1.0.0"
+ mime "^1.2.11"
+ netrc "^0.1.4"
+
+glob-base@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+ dependencies:
+ glob-parent "^2.0.0"
+ is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+ dependencies:
+ is-glob "^2.0.0"
+
+glob-parent@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+ dependencies:
+ is-glob "^3.1.0"
+ path-dirname "^1.0.0"
+
+glob-stream@^3.1.5:
+ version "3.1.18"
+ resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b"
+ dependencies:
+ glob "^4.3.1"
+ glob2base "^0.0.12"
+ minimatch "^2.0.1"
+ ordered-read-streams "^0.1.0"
+ through2 "^0.6.1"
+ unique-stream "^1.0.0"
+
+glob-stream@^5.3.2:
+ version "5.3.5"
+ resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22"
+ dependencies:
+ extend "^3.0.0"
+ glob "^5.0.3"
+ glob-parent "^3.0.0"
+ micromatch "^2.3.7"
+ ordered-read-streams "^0.3.0"
+ through2 "^0.6.0"
+ to-absolute-glob "^0.1.1"
+ unique-stream "^2.0.2"
+
+glob-watcher@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b"
+ dependencies:
+ gaze "^0.5.1"
+
+glob2base@^0.0.12:
+ version "0.0.12"
+ resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56"
+ dependencies:
+ find-index "^0.1.1"
+
+glob@7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.2"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^4.3.1:
+ version "4.3.5"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-4.3.5.tgz#80fbb08ca540f238acce5d11d1e9bc41e75173d3"
+ dependencies:
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^2.0.1"
+ once "^1.3.0"
+
+glob@^5.0.3:
+ version "5.0.15"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
+ dependencies:
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "2 || 3"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^6.0.1:
+ version "6.0.4"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"
+ dependencies:
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "2 || 3"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@~3.1.21:
+ version "3.1.21"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd"
+ dependencies:
+ graceful-fs "~1.2.0"
+ inherits "1"
+ minimatch "~0.2.11"
+
+global-modules@^0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d"
+ dependencies:
+ global-prefix "^0.1.4"
+ is-windows "^0.2.0"
+
+global-prefix@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f"
+ dependencies:
+ homedir-polyfill "^1.0.0"
+ ini "^1.3.4"
+ is-windows "^0.2.0"
+ which "^1.2.12"
+
+global@^4.3.1:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
+ dependencies:
+ min-document "^2.19.0"
+ process "~0.5.1"
+
+globals@^9.0.0, globals@^9.14.0:
+ version "9.17.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286"
+
+globby@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-4.1.0.tgz#080f54549ec1b82a6c60e631fc82e1211dbe95f8"
+ dependencies:
+ array-union "^1.0.1"
+ arrify "^1.0.0"
+ glob "^6.0.1"
+ object-assign "^4.0.1"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+globby@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
+ dependencies:
+ array-union "^1.0.1"
+ arrify "^1.0.0"
+ glob "^7.0.3"
+ object-assign "^4.0.1"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+globby@^6.0.0, globby@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
+ dependencies:
+ array-union "^1.0.1"
+ glob "^7.0.3"
+ object-assign "^4.0.1"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+globule@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5"
+ dependencies:
+ glob "~3.1.21"
+ lodash "~1.0.1"
+ minimatch "~0.2.11"
+
+glogg@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5"
+ dependencies:
+ sparkles "^1.0.0"
+
+got@^5.0.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35"
+ dependencies:
+ create-error-class "^3.0.1"
+ duplexer2 "^0.1.4"
+ is-redirect "^1.0.0"
+ is-retry-allowed "^1.0.0"
+ is-stream "^1.0.0"
+ lowercase-keys "^1.0.0"
+ node-status-codes "^1.0.0"
+ object-assign "^4.0.1"
+ parse-json "^2.1.0"
+ pinkie-promise "^2.0.0"
+ read-all-stream "^3.0.0"
+ readable-stream "^2.0.5"
+ timed-out "^3.0.0"
+ unzip-response "^1.0.2"
+ url-parse-lax "^1.0.0"
+
+got@^6.2.0, got@^6.7.1:
+ version "6.7.1"
+ resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
+ dependencies:
+ create-error-class "^3.0.0"
+ duplexer3 "^0.1.4"
+ get-stream "^3.0.0"
+ is-redirect "^1.0.0"
+ is-retry-allowed "^1.0.0"
+ is-stream "^1.0.0"
+ lowercase-keys "^1.0.0"
+ safe-buffer "^5.0.1"
+ timed-out "^4.0.0"
+ unzip-response "^2.0.1"
+ url-parse-lax "^1.0.0"
+
+graceful-fs@^3.0.0:
+ version "3.0.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818"
+ dependencies:
+ natives "^1.1.0"
+
+graceful-fs@^4.0.0, graceful-fs@^4.1.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6:
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+graceful-fs@~1.2.0:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364"
+
+"graceful-readlink@>= 1.0.0":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
+
+grouped-queue@^0.3.0:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/grouped-queue/-/grouped-queue-0.3.3.tgz#c167d2a5319c5a0e0964ef6a25b7c2df8996c85c"
+ dependencies:
+ lodash "^4.17.2"
+
+growl@1.9.2:
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f"
+
+growly@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
+
+gulp-if@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/gulp-if/-/gulp-if-2.0.2.tgz#a497b7e7573005041caa2bc8b7dda3c80444d629"
+ dependencies:
+ gulp-match "^1.0.3"
+ ternary-stream "^2.0.1"
+ through2 "^2.0.1"
+
+gulp-match@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/gulp-match/-/gulp-match-1.0.3.tgz#91c7c0d7f29becd6606d57d80a7f8776a87aba8e"
+ dependencies:
+ minimatch "^3.0.3"
+
+gulp-sourcemaps@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c"
+ dependencies:
+ convert-source-map "^1.1.1"
+ graceful-fs "^4.1.2"
+ strip-bom "^2.0.0"
+ through2 "^2.0.0"
+ vinyl "^1.0.0"
+
+gulp-util@*, gulp-util@^3.0.0:
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f"
+ dependencies:
+ array-differ "^1.0.0"
+ array-uniq "^1.0.2"
+ beeper "^1.0.0"
+ chalk "^1.0.0"
+ dateformat "^2.0.0"
+ fancy-log "^1.1.0"
+ gulplog "^1.0.0"
+ has-gulplog "^0.1.0"
+ lodash._reescape "^3.0.0"
+ lodash._reevaluate "^3.0.0"
+ lodash._reinterpolate "^3.0.0"
+ lodash.template "^3.0.0"
+ minimist "^1.1.0"
+ multipipe "^0.1.2"
+ object-assign "^3.0.0"
+ replace-ext "0.0.1"
+ through2 "^2.0.0"
+ vinyl "^0.5.0"
+
+gulp@^3.9.1:
+ version "3.9.1"
+ resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4"
+ dependencies:
+ archy "^1.0.0"
+ chalk "^1.0.0"
+ deprecated "^0.0.1"
+ gulp-util "^3.0.0"
+ interpret "^1.0.0"
+ liftoff "^2.1.0"
+ minimist "^1.1.0"
+ orchestrator "^0.3.0"
+ pretty-hrtime "^1.0.0"
+ semver "^4.1.0"
+ tildify "^1.0.0"
+ v8flags "^2.0.2"
+ vinyl-fs "^0.3.0"
+
+gulplog@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5"
+ dependencies:
+ glogg "^1.0.0"
+
+gunzip-maybe@^1.3.1:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/gunzip-maybe/-/gunzip-maybe-1.4.0.tgz#7d8316c8d0571e1d08a5a79e46fff0afe8172b19"
+ dependencies:
+ browserify-zlib "^0.1.4"
+ is-deflate "^1.0.0"
+ is-gzip "^1.0.0"
+ peek-stream "^1.1.0"
+ pumpify "^1.3.3"
+ through2 "^2.0.3"
+
+handle-thing@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4"
+
+handlebars@^4.0.3:
+ version "4.0.10"
+ resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f"
+ dependencies:
+ async "^1.4.0"
+ optimist "^0.6.1"
+ source-map "^0.4.4"
+ optionalDependencies:
+ uglify-js "^2.6"
+
+har-validator@~2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
+ dependencies:
+ chalk "^1.1.1"
+ commander "^2.9.0"
+ is-my-json-valid "^2.12.4"
+ pinkie-promise "^2.0.0"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-binary@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c"
+ dependencies:
+ isarray "0.0.1"
+
+has-color@~0.1.0:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f"
+
+has-cors@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
+
+has-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+
+has-flag@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
+
+has-gulplog@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce"
+ dependencies:
+ sparkles "^1.0.0"
+
+has@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
+ dependencies:
+ function-bind "^1.0.2"
+
+hawk@~3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
+ dependencies:
+ boom "2.x.x"
+ cryptiles "2.x.x"
+ hoek "2.x.x"
+ sntp "1.x.x"
+
+he@1.1.x:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
+
+hoek@2.x.x:
+ version "2.16.3"
+ resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+homedir-polyfill@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc"
+ dependencies:
+ parse-passwd "^1.0.0"
+
+hosted-git-info@^2.1.4:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67"
+
+hpack.js@^2.1.6:
+ version "2.1.6"
+ resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
+ dependencies:
+ inherits "^2.0.1"
+ obuf "^1.0.0"
+ readable-stream "^2.0.1"
+ wbuf "^1.1.0"
+
+html-encoding-sniffer@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da"
+ dependencies:
+ whatwg-encoding "^1.0.1"
+
+html-minifier@^3.0.1:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.2.tgz#d73bc3ff448942408818ce609bf3fb0ea7ef4eb7"
+ dependencies:
+ camel-case "3.0.x"
+ clean-css "4.1.x"
+ commander "2.9.x"
+ he "1.1.x"
+ ncname "1.0.x"
+ param-case "2.1.x"
+ relateurl "0.2.x"
+ uglify-js "3.0.x"
+
+http-deceiver@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
+
+http-errors@~1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750"
+ dependencies:
+ inherits "2.0.3"
+ setprototypeof "1.0.2"
+ statuses ">= 1.3.1 < 2"
+
+http-errors@~1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257"
+ dependencies:
+ depd "1.1.0"
+ inherits "2.0.3"
+ setprototypeof "1.0.3"
+ statuses ">= 1.3.1 < 2"
+
+http-proxy-middleware@^0.17.2:
+ version "0.17.4"
+ resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833"
+ dependencies:
+ http-proxy "^1.16.2"
+ is-glob "^3.1.0"
+ lodash "^4.17.2"
+ micromatch "^2.3.11"
+
+http-proxy@^1.16.2:
+ version "1.16.2"
+ resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742"
+ dependencies:
+ eventemitter3 "1.x.x"
+ requires-port "1.x.x"
+
+http-signature@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
+ dependencies:
+ assert-plus "^0.2.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+https-proxy-agent@1.0.0, https-proxy-agent@^1.0.0, https-proxy-agent@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6"
+ dependencies:
+ agent-base "2"
+ debug "2"
+ extend "3"
+
+iconv-lite@0.4.13:
+ version "0.4.13"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2"
+
+iconv-lite@0.4.15:
+ version "0.4.15"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb"
+
+ignore@^3.2.0, ignore@^3.2.6:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+indent-string@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+ dependencies:
+ repeating "^2.0.0"
+
+indexof@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@^1.3.4, ini@~1.3.0:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
+
+inquirer@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e"
+ dependencies:
+ ansi-escapes "^1.1.0"
+ ansi-regex "^2.0.0"
+ chalk "^1.0.0"
+ cli-cursor "^1.0.1"
+ cli-width "^2.0.0"
+ figures "^1.3.5"
+ lodash "^4.3.0"
+ readline2 "^1.0.1"
+ run-async "^0.1.0"
+ rx-lite "^3.1.2"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.0"
+ through "^2.3.6"
+
+inquirer@^1.0.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-1.2.3.tgz#4dec6f32f37ef7bb0b2ed3f1d1a5c3f545074918"
+ dependencies:
+ ansi-escapes "^1.1.0"
+ chalk "^1.0.0"
+ cli-cursor "^1.0.1"
+ cli-width "^2.0.0"
+ external-editor "^1.1.0"
+ figures "^1.3.5"
+ lodash "^4.3.0"
+ mute-stream "0.0.6"
+ pinkie-promise "^2.0.0"
+ run-async "^2.2.0"
+ rx "^4.1.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.0"
+ through "^2.3.6"
+
+interpret@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90"
+
+intersect@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/intersect/-/intersect-1.0.1.tgz#332650e10854d8c0ac58c192bdc27a8bf7e7a30c"
+
+invariant@^2.2.0, invariant@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
+ dependencies:
+ loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+ipaddr.js@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec"
+
+irregular-plurals@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.2.0.tgz#38f299834ba8c00c30be9c554e137269752ff3ac"
+
+is-absolute@^0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f"
+ dependencies:
+ is-relative "^0.1.0"
+
+is-absolute@^0.2.3:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb"
+ dependencies:
+ is-relative "^0.2.1"
+ is-windows "^0.2.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-buffer@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc"
+
+is-builtin-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+ dependencies:
+ builtin-modules "^1.0.0"
+
+is-ci@^1.0.9:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e"
+ dependencies:
+ ci-info "^1.0.0"
+
+is-deflate@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-deflate/-/is-deflate-1.0.0.tgz#c862901c3c161fb09dac7cdc7e784f80e98f2f14"
+
+is-dotfile@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+
+is-equal-shallow@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+ dependencies:
+ is-primitive "^2.0.0"
+
+is-error@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.1.tgz#684a96d84076577c98f4cdb40c6d26a5123bf19c"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extglob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-extglob@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-finite@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-get-set-prop@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-get-set-prop/-/is-get-set-prop-1.0.0.tgz#2731877e4d78a6a69edcce6bb9d68b0779e76312"
+ dependencies:
+ get-set-props "^0.1.0"
+ lowercase-keys "^1.0.0"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+ dependencies:
+ is-extglob "^1.0.0"
+
+is-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-gzip@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83"
+
+is-js-type@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-js-type/-/is-js-type-2.0.0.tgz#73617006d659b4eb4729bba747d28782df0f7e22"
+ dependencies:
+ js-types "^1.0.0"
+
+is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4:
+ version "2.16.0"
+ resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693"
+ dependencies:
+ generate-function "^2.0.0"
+ generate-object-property "^1.1.0"
+ jsonpointer "^4.0.0"
+ xtend "^4.0.0"
+
+is-npm@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
+
+is-number@^2.0.2, is-number@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-obj-prop@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-obj-prop/-/is-obj-prop-1.0.0.tgz#b34de79c450b8d7c73ab2cdf67dc875adb85f80e"
+ dependencies:
+ lowercase-keys "^1.0.0"
+ obj-props "^1.0.0"
+
+is-obj@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+
+is-path-cwd@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
+
+is-path-in-cwd@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc"
+ dependencies:
+ is-path-inside "^1.0.0"
+
+is-path-inside@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f"
+ dependencies:
+ path-is-inside "^1.0.1"
+
+is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+
+is-posix-bracket@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-promise@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
+
+is-property@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
+
+is-proto-prop@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-proto-prop/-/is-proto-prop-1.0.0.tgz#b3951f95c089924fb5d4fcda6542ab3e83e2b220"
+ dependencies:
+ lowercase-keys "^1.0.0"
+ proto-props "^0.2.0"
+
+is-redirect@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
+
+is-relative@^0.1.0:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.1.3.tgz#905fee8ae86f45b3ec614bc3c15c869df0876e82"
+
+is-relative@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5"
+ dependencies:
+ is-unc-path "^0.1.1"
+
+is-resolvable@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62"
+ dependencies:
+ tryit "^1.0.1"
+
+is-retry-allowed@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
+
+is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+is-unc-path@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9"
+ dependencies:
+ unc-path-regex "^0.1.0"
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+
+is-valid-glob@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe"
+
+is-windows@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c"
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ dependencies:
+ isarray "1.0.0"
+
+isstream@0.1.x, isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+istanbul-api@^1.1.0-alpha.1:
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.9.tgz#2827920d380d4286d857d57a2968a841db8a7ec8"
+ dependencies:
+ async "^2.1.4"
+ fileset "^2.0.2"
+ istanbul-lib-coverage "^1.1.1"
+ istanbul-lib-hook "^1.0.7"
+ istanbul-lib-instrument "^1.7.2"
+ istanbul-lib-report "^1.1.1"
+ istanbul-lib-source-maps "^1.2.1"
+ istanbul-reports "^1.1.1"
+ js-yaml "^3.7.0"
+ mkdirp "^0.5.1"
+ once "^1.4.0"
+
+istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da"
+
+istanbul-lib-hook@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz#dd6607f03076578fe7d6f2a630cf143b49bacddc"
+ dependencies:
+ append-transform "^0.4.0"
+
+istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.7.2:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.2.tgz#6014b03d3470fb77638d5802508c255c06312e56"
+ dependencies:
+ babel-generator "^6.18.0"
+ babel-template "^6.16.0"
+ babel-traverse "^6.18.0"
+ babel-types "^6.18.0"
+ babylon "^6.13.0"
+ istanbul-lib-coverage "^1.1.1"
+ semver "^5.3.0"
+
+istanbul-lib-report@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#f0e55f56655ffa34222080b7a0cd4760e1405fc9"
+ dependencies:
+ istanbul-lib-coverage "^1.1.1"
+ mkdirp "^0.5.1"
+ path-parse "^1.0.5"
+ supports-color "^3.1.2"
+
+istanbul-lib-source-maps@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz#a6fe1acba8ce08eebc638e572e294d267008aa0c"
+ dependencies:
+ debug "^2.6.3"
+ istanbul-lib-coverage "^1.1.1"
+ mkdirp "^0.5.1"
+ rimraf "^2.6.1"
+ source-map "^0.5.3"
+
+istanbul-reports@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.1.tgz#042be5c89e175bc3f86523caab29c014e77fee4e"
+ dependencies:
+ handlebars "^4.0.3"
+
+istextorbinary@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.1.0.tgz#dbed2a6f51be2f7475b68f89465811141b758874"
+ dependencies:
+ binaryextensions "1 || 2"
+ editions "^1.1.1"
+ textextensions "1 || 2"
+
+jest-changed-files@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-19.0.2.tgz#16c54c84c3270be408e06d2e8af3f3e37a885824"
+
+jest-cli@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-19.0.2.tgz#cc3620b62acac5f2d93a548cb6ef697d4ec85443"
+ dependencies:
+ ansi-escapes "^1.4.0"
+ callsites "^2.0.0"
+ chalk "^1.1.1"
+ graceful-fs "^4.1.6"
+ is-ci "^1.0.9"
+ istanbul-api "^1.1.0-alpha.1"
+ istanbul-lib-coverage "^1.0.0"
+ istanbul-lib-instrument "^1.1.1"
+ jest-changed-files "^19.0.2"
+ jest-config "^19.0.2"
+ jest-environment-jsdom "^19.0.2"
+ jest-haste-map "^19.0.0"
+ jest-jasmine2 "^19.0.2"
+ jest-message-util "^19.0.0"
+ jest-regex-util "^19.0.0"
+ jest-resolve-dependencies "^19.0.0"
+ jest-runtime "^19.0.2"
+ jest-snapshot "^19.0.2"
+ jest-util "^19.0.2"
+ micromatch "^2.3.11"
+ node-notifier "^5.0.1"
+ slash "^1.0.0"
+ string-length "^1.0.1"
+ throat "^3.0.0"
+ which "^1.1.1"
+ worker-farm "^1.3.1"
+ yargs "^6.3.0"
+
+jest-config@^19.0.2:
+ version "19.0.4"
+ resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-19.0.4.tgz#42980211d46417e91ca7abffd086c270234f73fd"
+ dependencies:
+ chalk "^1.1.1"
+ jest-environment-jsdom "^19.0.2"
+ jest-environment-node "^19.0.2"
+ jest-jasmine2 "^19.0.2"
+ jest-regex-util "^19.0.0"
+ jest-resolve "^19.0.2"
+ jest-validate "^19.0.2"
+ pretty-format "^19.0.0"
+
+jest-diff@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-19.0.0.tgz#d1563cfc56c8b60232988fbc05d4d16ed90f063c"
+ dependencies:
+ chalk "^1.1.3"
+ diff "^3.0.0"
+ jest-matcher-utils "^19.0.0"
+ pretty-format "^19.0.0"
+
+jest-environment-jsdom@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-19.0.2.tgz#ceda859c4a4b94ab35e4de7dab54b926f293e4a3"
+ dependencies:
+ jest-mock "^19.0.0"
+ jest-util "^19.0.2"
+ jsdom "^9.11.0"
+
+jest-environment-node@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-19.0.2.tgz#6e84079db87ed21d0c05e1f9669f207b116fe99b"
+ dependencies:
+ jest-mock "^19.0.0"
+ jest-util "^19.0.2"
+
+jest-file-exists@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/jest-file-exists/-/jest-file-exists-19.0.0.tgz#cca2e587a11ec92e24cfeab3f8a94d657f3fceb8"
+
+jest-haste-map@^19.0.0:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-19.0.2.tgz#286484c3a16e86da7872b0877c35dce30c3d6f07"
+ dependencies:
+ fb-watchman "^2.0.0"
+ graceful-fs "^4.1.6"
+ micromatch "^2.3.11"
+ sane "~1.5.0"
+ worker-farm "^1.3.1"
+
+jest-jasmine2@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-19.0.2.tgz#167991ac825981fb1a800af126e83afcca832c73"
+ dependencies:
+ graceful-fs "^4.1.6"
+ jest-matcher-utils "^19.0.0"
+ jest-matchers "^19.0.0"
+ jest-message-util "^19.0.0"
+ jest-snapshot "^19.0.2"
+
+jest-matcher-utils@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-19.0.0.tgz#5ecd9b63565d2b001f61fbf7ec4c7f537964564d"
+ dependencies:
+ chalk "^1.1.3"
+ pretty-format "^19.0.0"
+
+jest-matchers@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-19.0.0.tgz#c74ecc6ebfec06f384767ba4d6fa4a42d6755754"
+ dependencies:
+ jest-diff "^19.0.0"
+ jest-matcher-utils "^19.0.0"
+ jest-message-util "^19.0.0"
+ jest-regex-util "^19.0.0"
+
+jest-message-util@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-19.0.0.tgz#721796b89c0e4d761606f9ba8cb828a3b6246416"
+ dependencies:
+ chalk "^1.1.1"
+ micromatch "^2.3.11"
+
+jest-mock@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-19.0.0.tgz#67038641e9607ab2ce08ec4a8cb83aabbc899d01"
+
+jest-regex-util@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-19.0.0.tgz#b7754587112aede1456510bb1f6afe74ef598691"
+
+jest-resolve-dependencies@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-19.0.0.tgz#a741ad1fa094140e64ecf2642a504f834ece22ee"
+ dependencies:
+ jest-file-exists "^19.0.0"
+
+jest-resolve@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-19.0.2.tgz#5793575de4f07aec32f7d7ff0c6c181963eefb3c"
+ dependencies:
+ browser-resolve "^1.11.2"
+ jest-haste-map "^19.0.0"
+ resolve "^1.2.0"
+
+jest-runtime@^19.0.2:
+ version "19.0.3"
+ resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-19.0.3.tgz#a163354ace46910ee33f0282b6bff6b0b87d4330"
+ dependencies:
+ babel-core "^6.0.0"
+ babel-jest "^19.0.0"
+ babel-plugin-istanbul "^4.0.0"
+ chalk "^1.1.3"
+ graceful-fs "^4.1.6"
+ jest-config "^19.0.2"
+ jest-file-exists "^19.0.0"
+ jest-haste-map "^19.0.0"
+ jest-regex-util "^19.0.0"
+ jest-resolve "^19.0.2"
+ jest-util "^19.0.2"
+ json-stable-stringify "^1.0.1"
+ micromatch "^2.3.11"
+ strip-bom "3.0.0"
+ yargs "^6.3.0"
+
+jest-snapshot@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-19.0.2.tgz#9c1b216214f7187c38bfd5c70b1efab16b0ff50b"
+ dependencies:
+ chalk "^1.1.3"
+ jest-diff "^19.0.0"
+ jest-file-exists "^19.0.0"
+ jest-matcher-utils "^19.0.0"
+ jest-util "^19.0.2"
+ natural-compare "^1.4.0"
+ pretty-format "^19.0.0"
+
+jest-util@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-19.0.2.tgz#e0a0232a2ab9e6b2b53668bdb3534c2b5977ed41"
+ dependencies:
+ chalk "^1.1.1"
+ graceful-fs "^4.1.6"
+ jest-file-exists "^19.0.0"
+ jest-message-util "^19.0.0"
+ jest-mock "^19.0.0"
+ jest-validate "^19.0.2"
+ leven "^2.0.0"
+ mkdirp "^0.5.1"
+
+jest-validate@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-19.0.2.tgz#dc534df5f1278d5b63df32b14241d4dbf7244c0c"
+ dependencies:
+ chalk "^1.1.1"
+ jest-matcher-utils "^19.0.0"
+ leven "^2.0.0"
+ pretty-format "^19.0.0"
+
+jest@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/jest/-/jest-19.0.2.tgz#b794faaf8ff461e7388f28beef559a54f20b2c10"
+ dependencies:
+ jest-cli "^19.0.2"
+
+jodid25519@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967"
+ dependencies:
+ jsbn "~0.1.0"
+
+js-tokens@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7"
+
+js-types@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/js-types/-/js-types-1.0.0.tgz#d242e6494ed572ad3c92809fc8bed7f7687cbf03"
+
+js-yaml@3.6.1, js-yaml@^3.5.1:
+ version "3.6.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30"
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^2.6.0"
+
+js-yaml@^3.7.0:
+ version "3.8.4"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6"
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^3.1.1"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+
+jsdom@^9.11.0:
+ version "9.12.0"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4"
+ dependencies:
+ abab "^1.0.3"
+ acorn "^4.0.4"
+ acorn-globals "^3.1.0"
+ array-equal "^1.0.0"
+ content-type-parser "^1.0.1"
+ cssom ">= 0.3.2 < 0.4.0"
+ cssstyle ">= 0.2.37 < 0.3.0"
+ escodegen "^1.6.1"
+ html-encoding-sniffer "^1.0.1"
+ nwmatcher ">= 1.3.9 < 2.0.0"
+ parse5 "^1.5.1"
+ request "^2.79.0"
+ sax "^1.2.1"
+ symbol-tree "^3.2.1"
+ tough-cookie "^2.3.2"
+ webidl-conversions "^4.0.0"
+ whatwg-encoding "^1.0.1"
+ whatwg-url "^4.3.0"
+ xml-name-validator "^2.0.1"
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+
+json-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+
+json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+ dependencies:
+ jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+
+json3@3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
+
+json5@^0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+jsonify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+
+jsonpointer@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
+
+jsonschema@^1.1.0, jsonschema@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.1.1.tgz#3cede8e3e411d377872eefbc9fdf26383cbc3ed9"
+
+jsprim@^1.2.2:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918"
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.0.2"
+ json-schema "0.2.3"
+ verror "1.3.6"
+
+kind-of@^3.0.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ dependencies:
+ is-buffer "^1.1.5"
+
+latest-version@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-2.0.0.tgz#56f8d6139620847b8017f8f1f4d78e211324168b"
+ dependencies:
+ package-json "^2.0.0"
+
+latest-version@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15"
+ dependencies:
+ package-json "^4.0.0"
+
+launchpad@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/launchpad/-/launchpad-0.6.0.tgz#6a122deaa3cbd7b9bedc13e7c8dd20a90951aaa3"
+ dependencies:
+ async "^2.0.1"
+ browserstack "^1.2.0"
+ debug "^2.2.0"
+ plist "^2.0.1"
+ q "^1.4.1"
+ underscore "^1.8.3"
+
+lazy-cache@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+
+lazy-req@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac"
+
+lazy-req@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-2.0.0.tgz#c9450a363ecdda2e6f0c70132ad4f37f8f06f2b4"
+
+lazystream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4"
+ dependencies:
+ readable-stream "^2.0.5"
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+ dependencies:
+ invert-kv "^1.0.0"
+
+lcov-parse@0.0.10:
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3"
+
+leven@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
+
+levn@^0.3.0, levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+liftoff@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385"
+ dependencies:
+ extend "^3.0.0"
+ findup-sync "^0.4.2"
+ fined "^1.0.1"
+ flagged-respawn "^0.3.2"
+ lodash.isplainobject "^4.0.4"
+ lodash.isstring "^4.0.1"
+ lodash.mapvalues "^4.4.0"
+ rechoir "^0.6.2"
+ resolve "^1.1.7"
+
+load-json-file@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
+load-json-file@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ strip-bom "^3.0.0"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+lodash-es@^4.2.1:
+ version "4.17.4"
+ resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.4.tgz#dcc1d7552e150a0640073ba9cb31d70f032950e7"
+
+lodash._baseassign@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e"
+ dependencies:
+ lodash._basecopy "^3.0.0"
+ lodash.keys "^3.0.0"
+
+lodash._basecopy@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
+
+lodash._basecreate@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821"
+
+lodash._basetostring@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5"
+
+lodash._basevalues@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7"
+
+lodash._getnative@^3.0.0:
+ version "3.9.1"
+ resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
+
+lodash._isiterateecall@^3.0.0:
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
+
+lodash._reescape@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a"
+
+lodash._reevaluate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed"
+
+lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
+
+lodash._root@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
+
+lodash.assignwith@^4.0.7:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz#127a97f02adc41751a954d24b0de17e100e038eb"
+
+lodash.camelcase@^4.1.1:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+
+lodash.cond@^4.3.0:
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5"
+
+lodash.create@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7"
+ dependencies:
+ lodash._baseassign "^3.0.0"
+ lodash._basecreate "^3.0.0"
+ lodash._isiterateecall "^3.0.0"
+
+lodash.defaults@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
+
+lodash.escape@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698"
+ dependencies:
+ lodash._root "^3.0.0"
+
+lodash.isarguments@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
+
+lodash.isarray@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
+
+lodash.isempty@^4.2.1:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e"
+
+lodash.isequal@^4.0.0, lodash.isequal@^4.4.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
+
+lodash.isplainobject@^4.0.4, lodash.isplainobject@^4.0.6:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
+
+lodash.isstring@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
+
+lodash.kebabcase@^4.0.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
+
+lodash.keys@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
+ dependencies:
+ lodash._getnative "^3.0.0"
+ lodash.isarguments "^3.0.0"
+ lodash.isarray "^3.0.0"
+
+lodash.mapvalues@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c"
+
+lodash.pick@^4.2.1:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
+
+lodash.restparam@^3.0.0:
+ version "3.6.1"
+ resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
+
+lodash.snakecase@^4.0.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d"
+
+lodash.some@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
+
+lodash.template@^3.0.0:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f"
+ dependencies:
+ lodash._basecopy "^3.0.0"
+ lodash._basetostring "^3.0.0"
+ lodash._basevalues "^3.0.0"
+ lodash._isiterateecall "^3.0.0"
+ lodash._reinterpolate "^3.0.0"
+ lodash.escape "^3.0.0"
+ lodash.keys "^3.0.0"
+ lodash.restparam "^3.0.0"
+ lodash.templatesettings "^3.0.0"
+
+lodash.template@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0"
+ dependencies:
+ lodash._reinterpolate "~3.0.0"
+ lodash.templatesettings "^4.0.0"
+
+lodash.templatesettings@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5"
+ dependencies:
+ lodash._reinterpolate "^3.0.0"
+ lodash.escape "^3.0.0"
+
+lodash.templatesettings@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316"
+ dependencies:
+ lodash._reinterpolate "~3.0.0"
+
+lodash.upperfirst@^4.2.0:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce"
+
+lodash@3.9.3:
+ version "3.9.3"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.9.3.tgz#0159e86832feffc6d61d852b12a953b99496bd32"
+
+lodash@4.16.2:
+ version "4.16.2"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.2.tgz#3e626db827048a699281a8a125226326cfc0e652"
+
+lodash@^3.0.0, lodash@^3.0.1:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
+
+lodash@^4.0.0, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.16.6, lodash@^4.17.2, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.8.0:
+ version "4.17.4"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
+
+lodash@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551"
+
+log-driver@1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056"
+
+log-symbols@^1.0.1, log-symbols@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18"
+ dependencies:
+ chalk "^1.0.0"
+
+lolex@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31"
+
+longest@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+
+loose-envify@^1.0.0, loose-envify@^1.1.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
+ dependencies:
+ js-tokens "^3.0.0"
+
+loud-rejection@^1.0.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
+ dependencies:
+ currently-unhandled "^0.4.1"
+ signal-exit "^3.0.0"
+
+lower-case@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
+
+lowercase-keys@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
+
+lru-cache@2:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
+
+lru-cache@^4.0.0, lru-cache@^4.0.1, lru-cache@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e"
+ dependencies:
+ pseudomap "^1.0.1"
+ yallist "^2.0.0"
+
+magic-string@^0.19.0:
+ version "0.19.1"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.19.1.tgz#14d768013caf2ec8fdea16a49af82fc377e75201"
+ dependencies:
+ vlq "^0.2.1"
+
+make-dir@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978"
+ dependencies:
+ pify "^2.3.0"
+
+makeerror@1.0.x:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
+ dependencies:
+ tmpl "1.0.x"
+
+map-cache@^0.2.0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+
+map-obj@^1.0.0, map-obj@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+
+mem-fs-editor@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/mem-fs-editor/-/mem-fs-editor-3.0.2.tgz#dd0a6eaf2bb8a6b37740067aa549eb530105af9f"
+ dependencies:
+ commondir "^1.0.1"
+ deep-extend "^0.4.0"
+ ejs "^2.3.1"
+ glob "^7.0.3"
+ globby "^6.1.0"
+ mkdirp "^0.5.0"
+ multimatch "^2.0.0"
+ rimraf "^2.2.8"
+ through2 "^2.0.0"
+ vinyl "^2.0.1"
+
+mem-fs@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/mem-fs/-/mem-fs-1.1.3.tgz#b8ae8d2e3fcb6f5d3f9165c12d4551a065d989cc"
+ dependencies:
+ through2 "^2.0.0"
+ vinyl "^1.1.0"
+ vinyl-file "^2.0.0"
+
+meow@^3.1.0, meow@^3.4.2, meow@^3.7.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
+ dependencies:
+ camelcase-keys "^2.0.0"
+ decamelize "^1.1.2"
+ loud-rejection "^1.0.0"
+ map-obj "^1.0.1"
+ minimist "^1.1.3"
+ normalize-package-data "^2.3.4"
+ object-assign "^4.0.1"
+ read-pkg-up "^1.0.1"
+ redent "^1.0.0"
+ trim-newlines "^1.0.0"
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+
+merge-stream@^1.0.0, merge-stream@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1"
+ dependencies:
+ readable-stream "^2.0.1"
+
+merge@^1.1.3:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da"
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+
+micromatch@^2.1.5, micromatch@^2.3.11, micromatch@^2.3.7:
+ version "2.3.11"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+ dependencies:
+ arr-diff "^2.0.0"
+ array-unique "^0.2.1"
+ braces "^1.8.2"
+ expand-brackets "^0.1.4"
+ extglob "^0.3.1"
+ filename-regex "^2.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.1"
+ kind-of "^3.0.2"
+ normalize-path "^2.0.1"
+ object.omit "^2.0.0"
+ parse-glob "^3.0.4"
+ regex-cache "^0.4.2"
+
+"mime-db@>= 1.27.0 < 2", mime-db@^1.28.0:
+ version "1.28.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.28.0.tgz#fedd349be06d2865b7fc57d837c6de4f17d7ac3c"
+
+mime-db@~1.27.0:
+ version "1.27.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1"
+
+mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7:
+ version "2.1.15"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed"
+ dependencies:
+ mime-db "~1.27.0"
+
+mime@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10"
+
+mime@1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53"
+
+mime@^1.2.11, mime@^1.3.4:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0"
+
+min-document@^2.19.0:
+ version "2.19.0"
+ resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
+ dependencies:
+ dom-walk "^0.1.0"
+
+minimalistic-assert@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
+
+minimatch-all@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/minimatch-all/-/minimatch-all-1.1.0.tgz#40c496a27a2e128d19bf758e76bb01a0c7145787"
+ dependencies:
+ minimatch "^3.0.2"
+
+"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@^2.0.1:
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7"
+ dependencies:
+ brace-expansion "^1.0.0"
+
+minimatch@~0.2.11:
+ version "0.2.14"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a"
+ dependencies:
+ lru-cache "2"
+ sigmund "~1.0.0"
+
+minimist@0.0.8, minimist@~0.0.1:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.0.tgz#cdf225e8898f840a258ded44fc91776770afdc93"
+
+minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+mkdirp@0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12"
+ dependencies:
+ minimist "0.0.8"
+
+mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ dependencies:
+ minimist "0.0.8"
+
+mocha@^3.1.2:
+ version "3.4.2"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.4.2.tgz#d0ef4d332126dbf18d0d640c9b382dd48be97594"
+ dependencies:
+ browser-stdout "1.3.0"
+ commander "2.9.0"
+ debug "2.6.0"
+ diff "3.2.0"
+ escape-string-regexp "1.0.5"
+ glob "7.1.1"
+ growl "1.9.2"
+ json3 "3.3.2"
+ lodash.create "3.1.1"
+ mkdirp "0.5.1"
+ supports-color "3.1.2"
+
+ms@0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.0.tgz#865be94c2e7397ad8a57da6a633a6e2f30798b83"
+
+ms@0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
+
+ms@0.7.2:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+multer@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/multer/-/multer-1.3.0.tgz#092b2670f6846fa4914965efc8cf94c20fec6cd2"
+ dependencies:
+ append-field "^0.1.0"
+ busboy "^0.2.11"
+ concat-stream "^1.5.0"
+ mkdirp "^0.5.1"
+ object-assign "^3.0.0"
+ on-finished "^2.3.0"
+ type-is "^1.6.4"
+ xtend "^4.0.0"
+
+multimatch@^2.0.0, multimatch@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b"
+ dependencies:
+ array-differ "^1.0.0"
+ array-union "^1.0.1"
+ arrify "^1.0.0"
+ minimatch "^3.0.0"
+
+multipipe@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b"
+ dependencies:
+ duplexer2 "0.0.2"
+
+multipipe@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-1.0.2.tgz#cc13efd833c9cda99f224f868461b8e1a3fd939d"
+ dependencies:
+ duplexer2 "^0.1.2"
+ object-assign "^4.1.0"
+
+mute-stream@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
+
+mute-stream@0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db"
+
+mz@^2.4.0, mz@^2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/mz/-/mz-2.6.0.tgz#c8b8521d958df0a4f2768025db69c719ee4ef1ce"
+ dependencies:
+ any-promise "^1.0.0"
+ object-assign "^4.0.1"
+ thenify-all "^1.0.0"
+
+natives@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31"
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+
+ncname@1.0.x:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/ncname/-/ncname-1.0.0.tgz#5b57ad18b1ca092864ef62b0b1ed8194f383b71c"
+ dependencies:
+ xml-char-classes "^1.0.0"
+
+negotiator@0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+
+netrc@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/netrc/-/netrc-0.1.4.tgz#6be94fcaca8d77ade0a9670dc460914c94472444"
+
+no-case@^2.2.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.1.tgz#7aeba1c73a52184265554b7dc03baf720df80081"
+ dependencies:
+ lower-case "^1.1.1"
+
+node-int64@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+
+node-notifier@^5.0.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.1.2.tgz#2fa9e12605fa10009d44549d6fcd8a63dde0e4ff"
+ dependencies:
+ growly "^1.3.0"
+ semver "^5.3.0"
+ shellwords "^0.1.0"
+ which "^1.2.12"
+
+node-status-codes@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f"
+
+nodegit-promise@~4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/nodegit-promise/-/nodegit-promise-4.0.0.tgz#5722b184f2df7327161064a791d2e842c9167b34"
+ dependencies:
+ asap "~2.0.3"
+
+nomnom@^1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7"
+ dependencies:
+ chalk "~0.4.0"
+ underscore "~1.6.0"
+
+nopt@^3.0.1:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+ dependencies:
+ abbrev "1"
+
+normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb"
+ dependencies:
+ hosted-git-info "^2.1.4"
+ is-builtin-module "^1.0.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.0.0, normalize-path@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+npm-run-path@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f"
+ dependencies:
+ path-key "^1.0.0"
+
+npm-run-path@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+ dependencies:
+ path-key "^2.0.0"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+"nwmatcher@>= 1.3.9 < 2.0.0":
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.0.tgz#b4389362170e7ef9798c3c7716d80ebc0106fccf"
+
+oauth-sign@~0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
+
+obj-props@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/obj-props/-/obj-props-1.1.0.tgz#626313faa442befd4a44e9a02c3cb6bde937b511"
+
+object-assign@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0"
+
+object-assign@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa"
+
+object-assign@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
+
+object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-component@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291"
+
+object.omit@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+ dependencies:
+ for-own "^0.1.4"
+ is-extendable "^0.1.1"
+
+obuf@^1.0.0, obuf@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e"
+
+on-finished@^2.3.0, on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ dependencies:
+ ee-first "1.1.1"
+
+on-finished@~2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.2.1.tgz#5c85c1cc36299f78029653f667f27b6b99ebc029"
+ dependencies:
+ ee-first "1.1.0"
+
+on-headers@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ dependencies:
+ wrappy "1"
+
+once@~1.3.0:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20"
+ dependencies:
+ wrappy "1"
+
+onetime@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
+
+opn@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/opn/-/opn-3.0.3.tgz#b6d99e7399f78d65c3baaffef1fb288e9b85243a"
+ dependencies:
+ object-assign "^4.0.1"
+
+optimist@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
+ dependencies:
+ minimist "~0.0.1"
+ wordwrap "~0.0.2"
+
+optionator@^0.8.1, optionator@^0.8.2:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.4"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ wordwrap "~1.0.0"
+
+options@>=0.0.5:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f"
+
+orchestrator@^0.3.0:
+ version "0.3.8"
+ resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e"
+ dependencies:
+ end-of-stream "~0.1.5"
+ sequencify "~0.0.7"
+ stream-consume "~0.1.0"
+
+ordered-read-streams@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126"
+
+ordered-read-streams@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b"
+ dependencies:
+ is-stream "^1.0.1"
+ readable-stream "^2.0.1"
+
+os-homedir@^1.0.0, os-homedir@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
+ dependencies:
+ lcid "^1.0.0"
+
+os-shim@^0.1.2:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.0:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+
+p-limit@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ dependencies:
+ p-limit "^1.1.0"
+
+package-json@^2.0.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/package-json/-/package-json-2.4.0.tgz#0d15bd67d1cbbddbb2ca222ff2edb86bcb31a8bb"
+ dependencies:
+ got "^5.0.0"
+ registry-auth-token "^3.0.1"
+ registry-url "^3.0.3"
+ semver "^5.1.0"
+
+package-json@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
+ dependencies:
+ got "^6.7.1"
+ registry-auth-token "^3.0.1"
+ registry-url "^3.0.3"
+ semver "^5.1.0"
+
+pako@~0.2.0:
+ version "0.2.9"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
+
+param-case@2.1.x:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247"
+ dependencies:
+ no-case "^2.2.0"
+
+parse-filepath@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73"
+ dependencies:
+ is-absolute "^0.2.3"
+ map-cache "^0.2.0"
+ path-root "^0.1.1"
+
+parse-glob@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+ dependencies:
+ glob-base "^0.3.0"
+ is-dotfile "^1.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.0"
+
+parse-json@^2.1.0, parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ dependencies:
+ error-ex "^1.2.0"
+
+parse-passwd@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
+
+parse5@^1.4.1, parse5@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94"
+
+parse5@^2.2.1, parse5@^2.2.2, parse5@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-2.2.3.tgz#0c4fc41c1000c5e6b93d48b03f8083837834e9f6"
+
+parse5@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.2.tgz#05eff57f0ef4577fb144a79f8b9a967a6cc44510"
+ dependencies:
+ "@types/node" "^6.0.46"
+
+parsejson@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab"
+ dependencies:
+ better-assert "~1.0.0"
+
+parseqs@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d"
+ dependencies:
+ better-assert "~1.0.0"
+
+parseuri@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a"
+ dependencies:
+ better-assert "~1.0.0"
+
+parseurl@~1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56"
+
+path-dirname@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+
+path-exists@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-is-inside@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+
+path-key@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af"
+
+path-key@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
+path-parse@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
+path-posix@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/path-posix/-/path-posix-1.0.0.tgz#06b26113f56beab042545a23bfa88003ccac260f"
+
+path-root-regex@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d"
+
+path-root@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7"
+ dependencies:
+ path-root-regex "^0.1.0"
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+
+path-to-regexp@^1.0.1:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d"
+ dependencies:
+ isarray "0.0.1"
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+path-type@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+ dependencies:
+ pify "^2.0.0"
+
+peek-stream@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/peek-stream/-/peek-stream-1.1.2.tgz#97eb76365bcfd8c89e287f55c8b69d4c3e9bcc52"
+ dependencies:
+ duplexify "^3.5.0"
+ through2 "^2.0.3"
+
+pem@^1.8.3:
+ version "1.9.7"
+ resolved "https://registry.yarnpkg.com/pem/-/pem-1.9.7.tgz#d387f996f292c7c9dea639a535805e74cb503161"
+ dependencies:
+ os-tmpdir "^1.0.1"
+ which "^1.2.4"
+
+pend@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+
+pify@^2.0.0, pify@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+
+pkg-conf@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.0.0.tgz#071c87650403bccfb9c627f58751bfe47c067279"
+ dependencies:
+ find-up "^2.0.0"
+ load-json-file "^2.0.0"
+
+pkg-dir@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4"
+ dependencies:
+ find-up "^1.0.0"
+
+pkg-up@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26"
+ dependencies:
+ find-up "^1.0.0"
+
+plist@^2.0.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/plist/-/plist-2.1.0.tgz#57ccdb7a0821df21831217a3cad54e3e146a1025"
+ dependencies:
+ base64-js "1.2.0"
+ xmlbuilder "8.2.2"
+ xmldom "0.1.x"
+
+plur@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a"
+ dependencies:
+ irregular-plurals "^1.0.0"
+
+pluralize@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
+
+plylog@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/plylog/-/plylog-0.4.0.tgz#d8e0cecc4cfe6c34d1109e0e9daaa26fee8d4b73"
+ dependencies:
+ winston "^2.2.0"
+
+plylog@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/plylog/-/plylog-0.5.0.tgz#c976eba1d80d2dd991005d7c110daf874154788f"
+ dependencies:
+ "@types/node" "^4.2.3"
+ "@types/winston" "^2.2.0"
+ winston "^2.2.0"
+
+polymer-analyzer@^2.0.0, polymer-analyzer@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/polymer-analyzer/-/polymer-analyzer-2.0.2.tgz#2c1d8711d3674b4db8a08e11b382217c6b042f44"
+ dependencies:
+ "@types/chai-subset" "^1.3.0"
+ "@types/chalk" "^0.4.30"
+ "@types/clone" "^0.1.30"
+ "@types/cssbeautify" "^0.3.1"
+ "@types/doctrine" "^0.0.1"
+ "@types/escodegen" "^0.0.2"
+ "@types/estree" "^0.0.34"
+ "@types/node" "^6.0.0"
+ "@types/parse5" "^2.2.34"
+ chalk "^1.1.3"
+ clone "^2.0.0"
+ cssbeautify "^0.3.1"
+ doctrine "^2.0.0"
+ dom5 "^2.1.0"
+ escodegen "^1.7.0"
+ espree "^3.1.7"
+ estraverse "^4.2.0"
+ jsonschema "^1.1.0"
+ parse5 "^2.2.1"
+ shady-css-parser "0.0.8"
+ strip-indent "^2.0.0"
+ typescript "^2.2.0"
+
+polymer-build@^1.1.0, polymer-build@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/polymer-build/-/polymer-build-1.5.0.tgz#55631d3da8ffd0cefd62a5f6565a71614910ea84"
+ dependencies:
+ "@types/mz" "0.0.31"
+ "@types/node" "^6.0.73"
+ "@types/parse5" "^2.2.32"
+ "@types/vinyl" "^2.0.0"
+ "@types/vinyl-fs" "0.0.28"
+ dom5 "^2.2.0"
+ multipipe "^1.0.2"
+ mz "^2.6.0"
+ parse5 "^2.2.2"
+ plylog "^0.5.0"
+ polymer-analyzer "^2.0.1"
+ polymer-bundler "^2.0.0"
+ polymer-project-config "^3.0.0"
+ sw-precache "^5.1.1"
+ vinyl "^1.1.1"
+ vinyl-fs "^2.4.3"
+
+polymer-bundler@^2.0.0, polymer-bundler@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/polymer-bundler/-/polymer-bundler-2.0.1.tgz#c5b8e78fffe0c789b9d123cd999ad7cdad6bb50d"
+ dependencies:
+ clone "^2.1.0"
+ command-line-args "^3.0.1"
+ command-line-usage "^3.0.3"
+ dom5 "^2.2.0"
+ es6-promise "^2.1.0"
+ espree "^3.4.0"
+ mkdirp "^0.5.1"
+ nopt "^3.0.1"
+ parse5 "^2.2.2"
+ path-posix "^1.0.0"
+ polymer-analyzer "^2.0.0"
+ source-map "^0.5.6"
+
+polymer-cli@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/polymer-cli/-/polymer-cli-1.1.0.tgz#bac1c8510b8fc58b85787f4bb184e5e8149c8172"
+ dependencies:
+ "@types/babel-core" "^6.7.14"
+ "@types/chalk" "^0.4.31"
+ "@types/del" "^2.2.31"
+ "@types/findup-sync" "^0.3.29"
+ "@types/gulp-if" "0.0.30"
+ "@types/html-minifier" "^1.1.30"
+ "@types/inquirer" "0.0.32"
+ "@types/merge-stream" "^1.0.28"
+ "@types/mz" "^0.0.31"
+ "@types/request" "0.0.39"
+ "@types/resolve" "0.0.4"
+ "@types/semver" "^5.3.30"
+ "@types/temp" "^0.8.28"
+ "@types/update-notifier" "^1.0.0"
+ "@types/vinyl" "^2.0.0"
+ "@types/vinyl-fs" "0.0.28"
+ "@types/yeoman-generator" "^1.0.0"
+ babel-core "^6.24.1"
+ babel-plugin-external-helpers "^6.22.0"
+ babel-preset-babili "0.0.10"
+ babel-preset-es2015 "^6.18.0"
+ bower "1.8.0"
+ bower-json "^0.8.1"
+ bower-logger "^0.2.2"
+ chalk "^1.1.3"
+ command-line-args "^3.0.0"
+ command-line-commands "^1.0.3"
+ command-line-usage "^3.0.1"
+ css-slam "^1.1.0"
+ del "^2.2.2"
+ findup-sync "^0.4.2"
+ github "^7.2.1"
+ gulp-if "^2.0.0"
+ gunzip-maybe "^1.3.1"
+ html-minifier "^3.0.1"
+ inquirer "^1.0.2"
+ merge-stream "^1.0.1"
+ mz "^2.6.0"
+ plylog "^0.4.0"
+ polymer-analyzer "^2.0.0"
+ polymer-build "^1.5.0"
+ polymer-linter "^2.0.2"
+ polymer-project-config "^3.2.1"
+ polyserve "^0.19.0"
+ request "^2.72.0"
+ semver "^5.3.0"
+ tar-fs "^1.12.0"
+ temp "^0.8.3"
+ update-notifier "^1.0.0"
+ vinyl "^1.1.1"
+ vinyl-fs "^2.4.3"
+ web-component-tester "^6.0.0"
+ yeoman-environment "^1.5.2"
+ yeoman-generator "^1.0.1"
+
+polymer-linter@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/polymer-linter/-/polymer-linter-2.0.2.tgz#8e8c3a52bdae7015b3f30c8e92065dfa2762360f"
+ dependencies:
+ "@types/estree" "0.0.34"
+ "@types/fast-levenshtein" "0.0.1"
+ "@types/node" "^6"
+ "@types/parse5" "^2.2.34"
+ dom5 "^2.0.0"
+ estraverse "^4.2.0"
+ fast-levenshtein "^2.0.6"
+ parse5 "^2.2.1"
+ polymer-analyzer "^2.0.0"
+ strip-indent "^2.0.0"
+
+polymer-project-config@^3.0.0, polymer-project-config@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/polymer-project-config/-/polymer-project-config-3.2.1.tgz#e880e1a4dba436de9ecd85ed421742f6f3e0d1a2"
+ dependencies:
+ "@types/node" "^6.0.41"
+ jsonschema "^1.1.1"
+ minimatch-all "^1.1.0"
+ plylog "^0.5.0"
+
+polyserve@^0.19.0:
+ version "0.19.1"
+ resolved "https://registry.yarnpkg.com/polyserve/-/polyserve-0.19.1.tgz#76b28dc076866d6cf8657796f65a2e1e956812a5"
+ dependencies:
+ "@types/assert" "0.0.29"
+ "@types/babel-core" "^6.7.14"
+ "@types/compression" "^0.0.33"
+ "@types/content-type" "^1.0.33"
+ "@types/express" "^4.0.33"
+ "@types/mime" "0.0.29"
+ "@types/mz" "0.0.29"
+ "@types/node" "^6.0.0"
+ "@types/opn" "^3.0.28"
+ "@types/parse5" "^2.2.34"
+ "@types/pem" "^1.8.1"
+ "@types/serve-static" "^1.7.31"
+ "@types/spdy" "^3.4.1"
+ "@types/ua-parser-js" "^0.7.30"
+ babel-core "^6.18.2"
+ babel-plugin-transform-es2015-arrow-functions "^6.8.0"
+ babel-plugin-transform-es2015-block-scoped-functions "^6.8.0"
+ babel-plugin-transform-es2015-block-scoping "^6.18.0"
+ babel-plugin-transform-es2015-classes "^6.18.0"
+ babel-plugin-transform-es2015-computed-properties "^6.8.0"
+ babel-plugin-transform-es2015-destructuring "^6.19.0"
+ babel-plugin-transform-es2015-duplicate-keys "^6.8.0"
+ babel-plugin-transform-es2015-for-of "^6.18.0"
+ babel-plugin-transform-es2015-function-name "^6.9.0"
+ babel-plugin-transform-es2015-literals "^6.8.0"
+ babel-plugin-transform-es2015-object-super "^6.8.0"
+ babel-plugin-transform-es2015-parameters "^6.18.0"
+ babel-plugin-transform-es2015-shorthand-properties "^6.18.0"
+ babel-plugin-transform-es2015-spread "^6.8.0"
+ babel-plugin-transform-es2015-sticky-regex "^6.8.0"
+ babel-plugin-transform-es2015-template-literals "^6.8.0"
+ babel-plugin-transform-es2015-typeof-symbol "^6.18.0"
+ babel-plugin-transform-es2015-unicode-regex "^6.11.0"
+ babel-plugin-transform-regenerator "^6.16.1"
+ command-line-args "^3.0.1"
+ command-line-usage "^3.0.3"
+ compression "^1.6.2"
+ content-type "^1.0.2"
+ dom5 "^2.0.1"
+ express "^4.8.5"
+ find-port "^1.0.1"
+ http-proxy-middleware "^0.17.2"
+ lru-cache "^4.0.2"
+ mime "^1.3.4"
+ mz "^2.4.0"
+ opn "^3.0.2"
+ parse5 "^2.2.3"
+ pem "^1.8.3"
+ polymer-build "^1.1.0"
+ resolve "^1.0.0"
+ send "^0.14.1"
+ spdy "^3.3.3"
+ ua-parser-js "^0.7.12"
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+
+prepend-http@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+
+preserve@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+pretty-bytes@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9"
+
+pretty-format@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-19.0.0.tgz#56530d32acb98a3fa4851c4e2b9d37b420684c84"
+ dependencies:
+ ansi-styles "^3.0.0"
+
+pretty-hrtime@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
+
+private@^0.1.6:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1"
+
+process-nextick-args@^1.0.6, process-nextick-args@~1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
+
+process@~0.5.1:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
+
+progress@1.1.8, progress@^1.1.8:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
+
+promisify-node@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/promisify-node/-/promisify-node-0.4.0.tgz#32803874ec411784e4786c339902a87a179a469c"
+ dependencies:
+ nodegit-promise "~4.0.0"
+ object-assign "^4.0.1"
+
+proto-props@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/proto-props/-/proto-props-0.2.1.tgz#5e01dc2675a0de9abfa76e799dfa334d6f483f4b"
+
+proxy-addr@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.4.tgz#27e545f6960a44a627d9b44467e35c1b6b4ce2f3"
+ dependencies:
+ forwarded "~0.1.0"
+ ipaddr.js "1.3.0"
+
+prr@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a"
+
+pseudomap@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+pump@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.2.tgz#3b3ee6512f94f0e575538c17995f9f16990a5d51"
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+pumpify@^1.3.3:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.3.5.tgz#1b671c619940abcaeac0ad0e3a3c164be760993b"
+ dependencies:
+ duplexify "^3.1.2"
+ inherits "^2.0.1"
+ pump "^1.0.0"
+
+punycode@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+q@1.4.1, q@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e"
+
+qs@6.4.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
+
+qs@~6.3.0:
+ version "6.3.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c"
+
+randomatic@^1.1.3:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb"
+ dependencies:
+ is-number "^2.0.2"
+ kind-of "^3.0.2"
+
+range-parser@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.0.3.tgz#6872823535c692e2c2a0103826afd82c2e0ff175"
+
+range-parser@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
+
+raw-body@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96"
+ dependencies:
+ bytes "2.4.0"
+ iconv-lite "0.4.15"
+ unpipe "1.0.0"
+
+rc@^1.0.1, rc@^1.1.6:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95"
+ dependencies:
+ deep-extend "~0.4.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+read-all-stream@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa"
+ dependencies:
+ pinkie-promise "^2.0.0"
+ readable-stream "^2.0.0"
+
+read-chunk@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-2.0.0.tgz#3246e877829116cec059674c4d5f300f7a9261f3"
+ dependencies:
+ pify "^2.3.0"
+
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg-up@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+ dependencies:
+ find-up "^2.0.0"
+ read-pkg "^2.0.0"
+
+read-pkg@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
+read-pkg@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+ dependencies:
+ load-json-file "^2.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^2.0.0"
+
+readable-stream@1.1.x, readable-stream@~1.1.9:
+ version "1.1.14"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+"readable-stream@>=1.0.33-1 <1.1.0-0":
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9:
+ version "2.2.9"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8"
+ dependencies:
+ buffer-shims "~1.0.0"
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "~1.0.0"
+ process-nextick-args "~1.0.6"
+ string_decoder "~1.0.0"
+ util-deprecate "~1.0.1"
+
+readline2@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35"
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ mute-stream "0.0.5"
+
+rechoir@^0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
+ dependencies:
+ resolve "^1.1.6"
+
+redent@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
+ dependencies:
+ indent-string "^2.1.0"
+ strip-indent "^1.0.1"
+
+reduce-flatten@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-1.0.1.tgz#258c78efd153ddf93cb561237f61184f3696e327"
+
+redux-thunk@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.2.0.tgz#e615a16e16b47a19a515766133d1e3e99b7852e5"
+
+redux@^3.0.5:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/redux/-/redux-3.6.0.tgz#887c2b3d0b9bd86eca2be70571c27654c19e188d"
+ dependencies:
+ lodash "^4.2.1"
+ lodash-es "^4.2.1"
+ loose-envify "^1.1.0"
+ symbol-observable "^1.0.2"
+
+regenerate@^1.2.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260"
+
+regenerator-runtime@^0.10.0:
+ version "0.10.5"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
+
+regenerator-transform@0.9.11:
+ version "0.9.11"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283"
+ dependencies:
+ babel-runtime "^6.18.0"
+ babel-types "^6.19.0"
+ private "^0.1.6"
+
+regex-cache@^0.4.2:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145"
+ dependencies:
+ is-equal-shallow "^0.1.3"
+ is-primitive "^2.0.0"
+
+regexpu-core@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+registry-auth-token@^3.0.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006"
+ dependencies:
+ rc "^1.1.6"
+ safe-buffer "^5.0.1"
+
+registry-url@^3.0.3:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942"
+ dependencies:
+ rc "^1.0.1"
+
+regjsgen@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+
+regjsparser@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+ dependencies:
+ jsesc "~0.5.0"
+
+relateurl@0.2.x:
+ version "0.2.7"
+ resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
+
+remove-trailing-separator@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4"
+
+repeat-element@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.5.2:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ dependencies:
+ is-finite "^1.0.0"
+
+replace-ext@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924"
+
+replace-ext@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
+
+req-all@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/req-all/-/req-all-1.0.0.tgz#d128569451c340b432409c656cf166260cd2628d"
+
+request@2.79.0, request@^2.53.0, request@^2.72.0, request@^2.79.0:
+ version "2.79.0"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de"
+ dependencies:
+ aws-sign2 "~0.6.0"
+ aws4 "^1.2.1"
+ caseless "~0.11.0"
+ combined-stream "~1.0.5"
+ extend "~3.0.0"
+ forever-agent "~0.6.1"
+ form-data "~2.1.1"
+ har-validator "~2.0.6"
+ hawk "~3.1.3"
+ http-signature "~1.1.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.7"
+ oauth-sign "~0.8.1"
+ qs "~6.3.0"
+ stringstream "~0.0.4"
+ tough-cookie "~2.3.0"
+ tunnel-agent "~0.4.1"
+ uuid "^3.0.0"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+require-uncached@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
+ dependencies:
+ caller-path "^0.1.0"
+ resolve-from "^1.0.0"
+
+requires-port@1.x.x:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+
+resolve-cwd@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-1.0.0.tgz#4eaeea41ed040d1702457df64a42b2b07d246f9f"
+ dependencies:
+ resolve-from "^2.0.0"
+
+resolve-dir@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e"
+ dependencies:
+ expand-tilde "^1.2.2"
+ global-modules "^0.2.3"
+
+resolve-from@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+
+resolve-from@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57"
+
+resolve@1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
+
+resolve@^1.0.0, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.2.0:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5"
+ dependencies:
+ path-parse "^1.0.5"
+
+restore-cursor@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
+ dependencies:
+ exit-hook "^1.0.0"
+ onetime "^1.0.0"
+
+right-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+ dependencies:
+ align-text "^0.1.1"
+
+rimraf@^2.2.0, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d"
+ dependencies:
+ glob "^7.0.5"
+
+rimraf@~2.2.6:
+ version "2.2.8"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582"
+
+rollup-plugin-babel@^2.6.1:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-2.7.1.tgz#16528197b0f938a1536f44683c7a93d573182f57"
+ dependencies:
+ babel-core "6"
+ babel-plugin-transform-es2015-classes "^6.9.0"
+ object-assign "^4.1.0"
+ rollup-pluginutils "^1.5.0"
+
+rollup-plugin-commonjs@^8.0.2:
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.0.2.tgz#98b1589bfe32a6c0f67790b60c0b499972afed89"
+ dependencies:
+ acorn "^4.0.1"
+ estree-walker "^0.3.0"
+ magic-string "^0.19.0"
+ resolve "^1.1.7"
+ rollup-pluginutils "^2.0.1"
+
+rollup-plugin-node-resolve@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-2.1.1.tgz#cbb783b0d15b02794d58915350b2f0d902b8ddc8"
+ dependencies:
+ browser-resolve "^1.11.0"
+ builtin-modules "^1.1.0"
+ resolve "^1.1.6"
+
+rollup-pluginutils@^1.5.0:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408"
+ dependencies:
+ estree-walker "^0.2.1"
+ minimatch "^3.0.2"
+
+rollup-pluginutils@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz#7ec95b3573f6543a46a6461bd9a7c544525d0fc0"
+ dependencies:
+ estree-walker "^0.3.0"
+ micromatch "^2.3.11"
+
+rollup@^0.36.0:
+ version "0.36.4"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.36.4.tgz#a224494c5386c1d73d38f7bb86f69f5eb011a3d2"
+ dependencies:
+ source-map-support "^0.4.0"
+
+run-async@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389"
+ dependencies:
+ once "^1.3.0"
+
+run-async@^2.0.0, run-async@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
+ dependencies:
+ is-promise "^2.1.0"
+
+run-sequence@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/run-sequence/-/run-sequence-1.2.2.tgz#5095a0bebe98733b0140bd08dd80ec030ddacdeb"
+ dependencies:
+ chalk "*"
+ gulp-util "*"
+
+rx-lite@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
+
+rx@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782"
+
+safe-buffer@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7"
+
+samsam@1.1.2, samsam@~1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567"
+
+sane@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/sane/-/sane-1.5.0.tgz#a4adeae764d048621ecb27d5f9ecf513101939f3"
+ dependencies:
+ anymatch "^1.3.0"
+ exec-sh "^0.2.0"
+ fb-watchman "^1.8.0"
+ minimatch "^3.0.2"
+ minimist "^1.1.1"
+ walker "~1.0.5"
+ watch "~0.10.0"
+
+sauce-connect-launcher@^1.0.0:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/sauce-connect-launcher/-/sauce-connect-launcher-1.2.2.tgz#7346cc8fbdc443191323439b0733451f5f3521f2"
+ dependencies:
+ adm-zip "~0.4.3"
+ async "^2.1.2"
+ https-proxy-agent "~1.0.0"
+ lodash "^4.16.6"
+ rimraf "^2.5.4"
+
+sax@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828"
+
+select-hose@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
+
+selenium-standalone@^5.8.0:
+ version "5.11.2"
+ resolved "https://registry.yarnpkg.com/selenium-standalone/-/selenium-standalone-5.11.2.tgz#724ccaa72fb26f3711e0e20989e478c4133df844"
+ dependencies:
+ async "1.2.1"
+ commander "2.6.0"
+ lodash "3.9.3"
+ minimist "1.1.0"
+ mkdirp "0.5.0"
+ progress "1.1.8"
+ request "2.79.0"
+ tar-stream "1.5.2"
+ urijs "1.16.1"
+ which "1.1.1"
+ yauzl "^2.5.0"
+
+semver-diff@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
+ dependencies:
+ semver "^5.0.3"
+
+"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
+
+semver@^4.1.0:
+ version "4.3.6"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"
+
+semver@~5.0.1:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a"
+
+send@0.15.3:
+ version "0.15.3"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.15.3.tgz#5013f9f99023df50d1bd9892c19e3defd1d53309"
+ dependencies:
+ debug "2.6.7"
+ depd "~1.1.0"
+ destroy "~1.0.4"
+ encodeurl "~1.0.1"
+ escape-html "~1.0.3"
+ etag "~1.8.0"
+ fresh "0.5.0"
+ http-errors "~1.6.1"
+ mime "1.3.4"
+ ms "2.0.0"
+ on-finished "~2.3.0"
+ range-parser "~1.2.0"
+ statuses "~1.3.1"
+
+send@^0.11.1:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.11.1.tgz#1beabfd42f9e2709f99028af3078ac12b47092d5"
+ dependencies:
+ debug "~2.1.1"
+ depd "~1.0.0"
+ destroy "1.0.3"
+ escape-html "1.0.1"
+ etag "~1.5.1"
+ fresh "0.2.4"
+ mime "1.2.11"
+ ms "0.7.0"
+ on-finished "~2.2.0"
+ range-parser "~1.0.2"
+
+send@^0.14.1:
+ version "0.14.2"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.14.2.tgz#39b0438b3f510be5dc6f667a11f71689368cdeef"
+ dependencies:
+ debug "~2.2.0"
+ depd "~1.1.0"
+ destroy "~1.0.4"
+ encodeurl "~1.0.1"
+ escape-html "~1.0.3"
+ etag "~1.7.0"
+ fresh "0.3.0"
+ http-errors "~1.5.1"
+ mime "1.3.4"
+ ms "0.7.2"
+ on-finished "~2.3.0"
+ range-parser "~1.2.0"
+ statuses "~1.3.1"
+
+sequencify@~0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c"
+
+serve-static@1.12.3:
+ version "1.12.3"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.3.tgz#9f4ba19e2f3030c547f8af99107838ec38d5b1e2"
+ dependencies:
+ encodeurl "~1.0.1"
+ escape-html "~1.0.3"
+ parseurl "~1.3.1"
+ send "0.15.3"
+
+server-destroy@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd"
+
+serviceworker-cache-polyfill@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz#de19ee73bef21ab3c0740a37b33db62464babdeb"
+
+set-blocking@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+setprototypeof@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08"
+
+setprototypeof@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
+
+shady-css-parser@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/shady-css-parser/-/shady-css-parser-0.0.8.tgz#01eec5a6b9ec8e47edbda91b44dfe591279ea0d1"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+shelljs@^0.7.0, shelljs@^0.7.5:
+ version "0.7.7"
+ resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1"
+ dependencies:
+ glob "^7.0.0"
+ interpret "^1.0.0"
+ rechoir "^0.6.2"
+
+shellwords@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14"
+
+sigmund@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
+
+signal-exit@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+sinon-chai@^2.6.0:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-2.10.0.tgz#6ab3008bb8cae9929e744d766574b4cf35f34b5b"
+
+sinon@^1.11.1:
+ version "1.17.7"
+ resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.7.tgz#4542a4f49ba0c45c05eb2e9dd9d203e2b8efe0bf"
+ dependencies:
+ formatio "1.1.1"
+ lolex "1.3.2"
+ samsam "1.1.2"
+ util ">=0.10.3 <1"
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
+slice-ansi@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
+
+slide@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
+
+sntp@1.x.x:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
+ dependencies:
+ hoek "2.x.x"
+
+socket.io-adapter@0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b"
+ dependencies:
+ debug "2.3.3"
+ socket.io-parser "2.3.1"
+
+socket.io-client@1.7.4:
+ version "1.7.4"
+ resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.4.tgz#ec9f820356ed99ef6d357f0756d648717bdd4281"
+ dependencies:
+ backo2 "1.0.2"
+ component-bind "1.0.0"
+ component-emitter "1.2.1"
+ debug "2.3.3"
+ engine.io-client "~1.8.4"
+ has-binary "0.1.7"
+ indexof "0.0.1"
+ object-component "0.0.3"
+ parseuri "0.0.5"
+ socket.io-parser "2.3.1"
+ to-array "0.1.4"
+
+socket.io-parser@2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0"
+ dependencies:
+ component-emitter "1.1.2"
+ debug "2.2.0"
+ isarray "0.0.1"
+ json3 "3.3.2"
+
+socket.io@^1.3.7:
+ version "1.7.4"
+ resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.4.tgz#2f7ecedc3391bf2d5c73e291fe233e6e34d4dd00"
+ dependencies:
+ debug "2.3.3"
+ engine.io "~1.8.4"
+ has-binary "0.1.7"
+ object-assign "4.1.0"
+ socket.io-adapter "0.5.0"
+ socket.io-client "1.7.4"
+ socket.io-parser "2.3.1"
+
+sort-keys-length@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188"
+ dependencies:
+ sort-keys "^1.0.0"
+
+sort-keys@^1.0.0, sort-keys@^1.1.1, sort-keys@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
+ dependencies:
+ is-plain-obj "^1.0.0"
+
+source-map-support@^0.4.0, source-map-support@^0.4.2:
+ version "0.4.15"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1"
+ dependencies:
+ source-map "^0.5.6"
+
+source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1:
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
+
+source-map@^0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
+ dependencies:
+ amdefine ">=0.0.4"
+
+source-map@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d"
+ dependencies:
+ amdefine ">=0.0.4"
+
+sparkles@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3"
+
+spawn-sync@^1.0.15:
+ version "1.0.15"
+ resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476"
+ dependencies:
+ concat-stream "^1.4.7"
+ os-shim "^0.1.2"
+
+spdx-correct@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40"
+ dependencies:
+ spdx-license-ids "^1.0.2"
+
+spdx-expression-parse@~1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c"
+
+spdx-license-ids@^1.0.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
+
+spdy-transport@^2.0.18:
+ version "2.0.20"
+ resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.0.20.tgz#735e72054c486b2354fe89e702256004a39ace4d"
+ dependencies:
+ debug "^2.6.8"
+ detect-node "^2.0.3"
+ hpack.js "^2.1.6"
+ obuf "^1.1.1"
+ readable-stream "^2.2.9"
+ safe-buffer "^5.0.1"
+ wbuf "^1.7.2"
+
+spdy@^3.3.3:
+ version "3.4.7"
+ resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc"
+ dependencies:
+ debug "^2.6.8"
+ handle-thing "^1.2.5"
+ http-deceiver "^1.2.7"
+ safe-buffer "^5.0.1"
+ select-hose "^2.0.0"
+ spdy-transport "^2.0.18"
+
+sprintf-js@^1.0.3, sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
+sshpk@^1.7.0:
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c"
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ dashdash "^1.12.0"
+ getpass "^0.1.1"
+ optionalDependencies:
+ bcrypt-pbkdf "^1.0.0"
+ ecc-jsbn "~0.1.1"
+ jodid25519 "^1.0.0"
+ jsbn "~0.1.0"
+ tweetnacl "~0.14.0"
+
+stack-trace@0.0.x:
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
+
+stacky@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/stacky/-/stacky-1.3.1.tgz#3f117e5187b9a73d23f876d69f05c85b11804a12"
+ dependencies:
+ chalk "^1.1.1"
+ lodash "^3.0.0"
+
+"statuses@>= 1.3.1 < 2", statuses@~1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
+
+stream-consume@^0.1.0, stream-consume@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f"
+
+stream-shift@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
+
+streamsearch@0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a"
+
+string-length@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac"
+ dependencies:
+ strip-ansi "^3.0.0"
+
+string-template@~0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add"
+
+string-width@^1.0.1, string-width@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+string-width@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e"
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^3.0.0"
+
+string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
+string_decoder@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.1.tgz#62e200f039955a6810d8df0a33ffc0f013662d98"
+ dependencies:
+ safe-buffer "^5.0.1"
+
+stringstream@~0.0.4:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991"
+
+strip-bom-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee"
+ dependencies:
+ first-chunk-stream "^1.0.0"
+ strip-bom "^2.0.0"
+
+strip-bom-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz#f87db5ef2613f6968aa545abfe1ec728b6a829ca"
+ dependencies:
+ first-chunk-stream "^2.0.0"
+ strip-bom "^2.0.0"
+
+strip-bom@3.0.0, strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-bom@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794"
+ dependencies:
+ first-chunk-stream "^1.0.0"
+ is-utf8 "^0.2.0"
+
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+ dependencies:
+ is-utf8 "^0.2.0"
+
+strip-eof@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
+strip-indent@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
+ dependencies:
+ get-stdin "^4.0.1"
+
+strip-indent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+supports-color@3.1.2, supports-color@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5"
+ dependencies:
+ has-flag "^1.0.0"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+sw-precache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/sw-precache/-/sw-precache-5.1.1.tgz#928720957463e55ed56777e177c4699f35ec59b6"
+ dependencies:
+ dom-urls "^1.1.0"
+ es6-promise "^4.0.5"
+ glob "^7.1.1"
+ lodash.defaults "^4.2.0"
+ lodash.template "^4.4.0"
+ meow "^3.7.0"
+ mkdirp "^0.5.1"
+ pretty-bytes "^4.0.2"
+ sw-toolbox "^3.4.0"
+ update-notifier "^1.0.3"
+
+sw-toolbox@^3.4.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/sw-toolbox/-/sw-toolbox-3.6.0.tgz#26df1d1c70348658e4dea2884319149b7b3183b5"
+ dependencies:
+ path-to-regexp "^1.0.1"
+ serviceworker-cache-polyfill "^4.0.0"
+
+symbol-observable@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d"
+
+symbol-tree@^3.2.1:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
+
+table-layout@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-0.3.0.tgz#6ee20dc483db371b3e5c87f704ed2f7c799d2c9a"
+ dependencies:
+ array-back "^1.0.3"
+ core-js "^2.4.1"
+ deep-extend "~0.4.1"
+ feature-detect-es6 "^1.3.1"
+ typical "^2.6.0"
+ wordwrapjs "^2.0.0-0"
+
+table@^3.7.8:
+ version "3.8.3"
+ resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f"
+ dependencies:
+ ajv "^4.7.0"
+ ajv-keywords "^1.0.0"
+ chalk "^1.1.1"
+ lodash "^4.0.0"
+ slice-ansi "0.0.4"
+ string-width "^2.0.0"
+
+tar-fs@^1.12.0:
+ version "1.15.2"
+ resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.15.2.tgz#761f5b32932c7b39461a60d537faea0d8084830c"
+ dependencies:
+ chownr "^1.0.1"
+ mkdirp "^0.5.1"
+ pump "^1.0.0"
+ tar-stream "^1.1.2"
+
+tar-stream@1.5.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.2.tgz#fbc6c6e83c1a19d4cb48c7d96171fc248effc7bf"
+ dependencies:
+ bl "^1.0.0"
+ end-of-stream "^1.0.0"
+ readable-stream "^2.0.0"
+ xtend "^4.0.0"
+
+tar-stream@^1.1.2, tar-stream@^1.5.0:
+ version "1.5.4"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.4.tgz#36549cf04ed1aee9b2a30c0143252238daf94016"
+ dependencies:
+ bl "^1.0.0"
+ end-of-stream "^1.0.0"
+ readable-stream "^2.0.0"
+ xtend "^4.0.0"
+
+temp@^0.8.1, temp@^0.8.3:
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59"
+ dependencies:
+ os-tmpdir "^1.0.0"
+ rimraf "~2.2.6"
+
+term-size@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/term-size/-/term-size-0.1.1.tgz#87360b96396cab5760963714cda0d0cbeecad9ca"
+ dependencies:
+ execa "^0.4.0"
+
+ternary-stream@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-2.0.1.tgz#064e489b4b5bf60ba6a6b7bc7f2f5c274ecf8269"
+ dependencies:
+ duplexify "^3.5.0"
+ fork-stream "^0.0.4"
+ merge-stream "^1.0.0"
+ through2 "^2.0.1"
+
+test-exclude@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26"
+ dependencies:
+ arrify "^1.0.1"
+ micromatch "^2.3.11"
+ object-assign "^4.1.0"
+ read-pkg-up "^1.0.1"
+ require-main-filename "^1.0.1"
+
+test-fixture@PolymerElements/test-fixture:
+ version "3.0.0-rc.1"
+ resolved "https://codeload.github.com/PolymerElements/test-fixture/tar.gz/26118ef0467501c33c02316e7016a2837baba10f"
+
+test-value@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291"
+ dependencies:
+ array-back "^1.0.3"
+ typical "^2.6.0"
+
+text-table@^0.2.0, text-table@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+
+"textextensions@1 || 2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-1.0.2.tgz#65486393ee1f2bb039a60cbba05b0b68bd9501d2"
+
+the-argv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/the-argv/-/the-argv-1.0.0.tgz#0084705005730dd84db755253c931ae398db9522"
+
+thenify-all@^1.0.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
+ dependencies:
+ thenify ">= 3.1.0 < 4"
+
+"thenify@>= 3.1.0 < 4":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839"
+ dependencies:
+ any-promise "^1.0.0"
+
+throat@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/throat/-/throat-3.0.0.tgz#e7c64c867cbb3845f10877642f7b60055b8ec0d6"
+
+through2-filter@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec"
+ dependencies:
+ through2 "~2.0.0"
+ xtend "~4.0.0"
+
+through2@^0.6.0, through2@^0.6.1:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48"
+ dependencies:
+ readable-stream ">=1.0.33-1 <1.1.0-0"
+ xtend ">=4.0.0 <4.1.0-0"
+
+through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
+ dependencies:
+ readable-stream "^2.1.5"
+ xtend "~4.0.1"
+
+through@^2.3.6:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+
+tildify@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a"
+ dependencies:
+ os-homedir "^1.0.0"
+
+time-stamp@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3"
+
+timed-out@^3.0.0:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217"
+
+timed-out@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+
+tmp@^0.0.29:
+ version "0.0.29"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0"
+ dependencies:
+ os-tmpdir "~1.0.1"
+
+tmpl@1.0.x:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
+
+to-absolute-glob@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f"
+ dependencies:
+ extend-shallow "^2.0.1"
+
+to-array@0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
+
+to-fast-properties@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+
+tough-cookie@^2.3.2, tough-cookie@~2.3.0:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a"
+ dependencies:
+ punycode "^1.4.1"
+
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+
+trim-newlines@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+tryit@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb"
+
+tunnel-agent@~0.4.1:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ dependencies:
+ prelude-ls "~1.1.2"
+
+type-detect@0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822"
+
+type-detect@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2"
+
+type-is@^1.6.4, type-is@~1.6.15:
+ version "1.6.15"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410"
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.15"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+typescript@^2.2.0:
+ version "2.3.4"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.3.4.tgz#3d38321828231e434f287514959c37a82b629f42"
+
+typical@^2.6.0:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d"
+
+ua-parser-js@^0.7.12:
+ version "0.7.12"
+ resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb"
+
+uglify-js@3.0.x:
+ version "3.0.14"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.14.tgz#2697af126fd215aac556facb1edfb17875204760"
+ dependencies:
+ commander "~2.9.0"
+ source-map "~0.5.1"
+
+uglify-js@^2.6:
+ version "2.8.27"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.27.tgz#47787f912b0f242e5b984343be8e35e95f694c9c"
+ dependencies:
+ source-map "~0.5.1"
+ yargs "~3.10.0"
+ optionalDependencies:
+ uglify-to-browserify "~1.0.0"
+
+uglify-to-browserify@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+
+ultron@1.0.x:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa"
+
+unc-path-regex@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
+
+underscore.string@3.3.4:
+ version "3.3.4"
+ resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db"
+ dependencies:
+ sprintf-js "^1.0.3"
+ util-deprecate "^1.0.2"
+
+underscore@^1.8.3:
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022"
+
+underscore@~1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8"
+
+unique-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b"
+
+unique-stream@^2.0.2:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369"
+ dependencies:
+ json-stable-stringify "^1.0.0"
+ through2-filter "^2.0.0"
+
+unique-string@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a"
+ dependencies:
+ crypto-random-string "^1.0.0"
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+
+untildify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/untildify/-/untildify-2.1.0.tgz#17eb2807987f76952e9c0485fc311d06a826a2e0"
+ dependencies:
+ os-homedir "^1.0.0"
+
+unzip-response@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe"
+
+unzip-response@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
+
+update-notifier@^1.0.0, update-notifier@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-1.0.3.tgz#8f92c515482bd6831b7c93013e70f87552c7cf5a"
+ dependencies:
+ boxen "^0.6.0"
+ chalk "^1.0.0"
+ configstore "^2.0.0"
+ is-npm "^1.0.0"
+ latest-version "^2.0.0"
+ lazy-req "^1.1.0"
+ semver-diff "^2.0.0"
+ xdg-basedir "^2.0.0"
+
+update-notifier@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.1.0.tgz#ec0c1e53536b76647a24b77cb83966d9315123d9"
+ dependencies:
+ boxen "^1.0.0"
+ chalk "^1.0.0"
+ configstore "^3.0.0"
+ is-npm "^1.0.0"
+ latest-version "^3.0.0"
+ lazy-req "^2.0.0"
+ semver-diff "^2.0.0"
+ xdg-basedir "^3.0.0"
+
+upper-case@^1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
+
+urijs@1.16.1, urijs@^1.16.1:
+ version "1.16.1"
+ resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.16.1.tgz#859ad31890f5f9528727be89f1932c94fb4731e2"
+
+url-parse-lax@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
+ dependencies:
+ prepend-http "^1.0.1"
+
+user-home@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
+
+user-home@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f"
+ dependencies:
+ os-homedir "^1.0.0"
+
+util-deprecate@^1.0.2, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+"util@>=0.10.3 <1":
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+ dependencies:
+ inherits "2.0.1"
+
+utils-merge@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8"
+
+uuid@^2.0.1:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a"
+
+uuid@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
+
+v8flags@^2.0.2:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4"
+ dependencies:
+ user-home "^1.1.1"
+
+vali-date@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6"
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
+ dependencies:
+ spdx-correct "~1.0.0"
+ spdx-expression-parse "~1.0.0"
+
+vargs@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/vargs/-/vargs-0.1.0.tgz#6b6184da6520cc3204ce1b407cac26d92609ebff"
+
+vary@~1.1.0, vary@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37"
+
+verror@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c"
+ dependencies:
+ extsprintf "1.0.2"
+
+vinyl-file@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/vinyl-file/-/vinyl-file-2.0.0.tgz#a7ebf5ffbefda1b7d18d140fcb07b223efb6751a"
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.3.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+ strip-bom-stream "^2.0.0"
+ vinyl "^1.1.0"
+
+vinyl-fs@^0.3.0:
+ version "0.3.14"
+ resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6"
+ dependencies:
+ defaults "^1.0.0"
+ glob-stream "^3.1.5"
+ glob-watcher "^0.0.6"
+ graceful-fs "^3.0.0"
+ mkdirp "^0.5.0"
+ strip-bom "^1.0.0"
+ through2 "^0.6.1"
+ vinyl "^0.4.0"
+
+vinyl-fs@^2.4.3:
+ version "2.4.4"
+ resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239"
+ dependencies:
+ duplexify "^3.2.0"
+ glob-stream "^5.3.2"
+ graceful-fs "^4.0.0"
+ gulp-sourcemaps "1.6.0"
+ is-valid-glob "^0.3.0"
+ lazystream "^1.0.0"
+ lodash.isequal "^4.0.0"
+ merge-stream "^1.0.0"
+ mkdirp "^0.5.0"
+ object-assign "^4.0.0"
+ readable-stream "^2.0.4"
+ strip-bom "^2.0.0"
+ strip-bom-stream "^1.0.0"
+ through2 "^2.0.0"
+ through2-filter "^2.0.0"
+ vali-date "^1.0.0"
+ vinyl "^1.0.0"
+
+vinyl@^0.4.0:
+ version "0.4.6"
+ resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847"
+ dependencies:
+ clone "^0.2.0"
+ clone-stats "^0.0.1"
+
+vinyl@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde"
+ dependencies:
+ clone "^1.0.0"
+ clone-stats "^0.0.1"
+ replace-ext "0.0.1"
+
+vinyl@^1.0.0, vinyl@^1.1.0, vinyl@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884"
+ dependencies:
+ clone "^1.0.0"
+ clone-stats "^0.0.1"
+ replace-ext "0.0.1"
+
+vinyl@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.0.2.tgz#0a3713d8d4e9221c58f10ca16c0116c9e25eda7c"
+ dependencies:
+ clone "^1.0.0"
+ clone-buffer "^1.0.0"
+ clone-stats "^1.0.0"
+ cloneable-readable "^1.0.0"
+ is-stream "^1.1.0"
+ remove-trailing-separator "^1.0.1"
+ replace-ext "^1.0.0"
+
+vlq@^0.2.1:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.2.tgz#e316d5257b40b86bb43cb8d5fea5d7f54d6b0ca1"
+
+walkdir@^0.0.11:
+ version "0.0.11"
+ resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532"
+
+walker@~1.0.5:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
+ dependencies:
+ makeerror "1.0.x"
+
+watch@~0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc"
+
+wbuf@^1.1.0, wbuf@^1.7.2:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe"
+ dependencies:
+ minimalistic-assert "^1.0.0"
+
+wct-local@^2.0.15:
+ version "2.0.15"
+ resolved "https://registry.yarnpkg.com/wct-local/-/wct-local-2.0.15.tgz#b5e3758e32e5d70c54d129fd6571d7cc14cf31e2"
+ dependencies:
+ "@types/chalk" "^0.4.28"
+ "@types/express" "^4.0.30"
+ "@types/freeport" "^1.0.19"
+ "@types/launchpad" "^0.6.0"
+ "@types/node" "^6.0.31"
+ "@types/which" "^1.0.27"
+ chalk "^1.1.1"
+ cleankill "^1.0.3"
+ freeport "^1.0.4"
+ launchpad "^0.6.0"
+ promisify-node "^0.4.0"
+ selenium-standalone "^5.8.0"
+ which "^1.0.8"
+
+wct-sauce@^2.0.0-pre.1:
+ version "2.0.0-pre.1"
+ resolved "https://registry.yarnpkg.com/wct-sauce/-/wct-sauce-2.0.0-pre.1.tgz#3b804607c550a0325de9137f3316be9562c06035"
+ dependencies:
+ chalk "^1.1.1"
+ cleankill "^1.0.0"
+ lodash "^3.0.1"
+ request "^2.53.0"
+ sauce-connect-launcher "^1.0.0"
+ temp "^0.8.1"
+ uuid "^2.0.1"
+
+wd@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/wd/-/wd-1.2.0.tgz#4112c4657eca5af593ebc060d54b80caeea04807"
+ dependencies:
+ archiver "1.3.0"
+ async "2.0.1"
+ lodash "4.16.2"
+ mkdirp "^0.5.1"
+ q "1.4.1"
+ request "2.79.0"
+ underscore.string "3.3.4"
+ vargs "0.1.0"
+
+web-component-tester@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/web-component-tester/-/web-component-tester-6.0.0.tgz#6abc08eafd7113a9ccf7873c225e9ccffd207523"
+ dependencies:
+ "@types/body-parser" "0.0.33"
+ "@types/chai" "^3.4.34"
+ "@types/chalk" "^0.4.31"
+ "@types/express" "^4.0.33"
+ "@types/glob" "^5.0.30"
+ "@types/grunt" "^0.4.20"
+ "@types/gulp" "^3.8.32"
+ "@types/lodash" "^4.14.38"
+ "@types/mime" "0.0.29"
+ "@types/minimatch" "^2.0.29"
+ "@types/mocha" "^2.2.32"
+ "@types/multer" "0.0.32"
+ "@types/node" "4.0.30"
+ "@types/nomnom" "0.0.28"
+ "@types/semver" "^5.3.30"
+ "@types/sinon" "^1.16.31"
+ "@types/sinon-chai" "^2.7.27"
+ "@types/socket.io" "^1.4.27"
+ accessibility-developer-tools "^2.10.0"
+ async "^1.5.0"
+ body-parser "^1.14.2"
+ chai "^3.2.0"
+ chalk "^1.1.1"
+ cleankill "^1.0.0"
+ express "^4.8.5"
+ findup-sync "^0.4.3"
+ glob "^7.1.1"
+ lodash "^3.0.1"
+ mocha "^3.1.2"
+ multer "^1.1.0"
+ nomnom "^1.8.1"
+ polyserve "^0.19.0"
+ promisify-node "^0.4.0"
+ resolve "^1.0.0"
+ semver "^5.3.0"
+ send "^0.11.1"
+ server-destroy "^1.0.1"
+ sinon "^1.11.1"
+ sinon-chai "^2.6.0"
+ socket.io "^1.3.7"
+ stacky "^1.3.1"
+ test-fixture PolymerElements/test-fixture
+ wd "^1.0.0"
+ optionalDependencies:
+ update-notifier "^1.0.0"
+ wct-local "^2.0.15"
+ wct-sauce "^2.0.0-pre.1"
+
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+
+webidl-conversions@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.1.tgz#8015a17ab83e7e1b311638486ace81da6ce206a0"
+
+whatwg-encoding@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4"
+ dependencies:
+ iconv-lite "0.4.13"
+
+whatwg-url@^4.3.0:
+ version "4.8.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0"
+ dependencies:
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
+
+which-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
+
+which@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.1.1.tgz#9ce512459946166e12c083f08ec073380fc8cbbb"
+ dependencies:
+ is-absolute "^0.1.7"
+
+which@^1.0.8, which@^1.1.1, which@^1.2.12, which@^1.2.4, which@^1.2.8, which@^1.2.9:
+ version "1.2.14"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5"
+ dependencies:
+ isexe "^2.0.0"
+
+widest-line@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c"
+ dependencies:
+ string-width "^1.0.1"
+
+window-size@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
+winston@^2.2.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/winston/-/winston-2.3.1.tgz#0b48420d978c01804cf0230b648861598225a119"
+ dependencies:
+ async "~1.0.0"
+ colors "1.0.x"
+ cycle "1.0.x"
+ eyes "0.1.x"
+ isstream "0.1.x"
+ stack-trace "0.0.x"
+
+wordwrap@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+
+wordwrap@~0.0.2:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
+
+wordwrap@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+
+wordwrapjs@^2.0.0-0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-2.0.0.tgz#ab55f695e6118da93858fdd70c053d1c5e01ac20"
+ dependencies:
+ array-back "^1.0.3"
+ feature-detect-es6 "^1.3.1"
+ reduce-flatten "^1.0.1"
+ typical "^2.6.0"
+
+worker-farm@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.3.1.tgz#4333112bb49b17aa050b87895ca6b2cacf40e5ff"
+ dependencies:
+ errno ">=0.1.1 <0.2.0-0"
+ xtend ">=4.0.0 <4.1.0-0"
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+write-file-atomic@^1.1.2:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f"
+ dependencies:
+ graceful-fs "^4.1.11"
+ imurmurhash "^0.1.4"
+ slide "^1.1.5"
+
+write-file-atomic@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.1.0.tgz#1769f4b551eedce419f0505deae2e26763542d37"
+ dependencies:
+ graceful-fs "^4.1.11"
+ imurmurhash "^0.1.4"
+ slide "^1.1.5"
+
+write-json-file@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.2.0.tgz#51862506bbb3b619eefab7859f1fd6c6d0530876"
+ dependencies:
+ detect-indent "^5.0.0"
+ graceful-fs "^4.1.2"
+ make-dir "^1.0.0"
+ pify "^2.0.0"
+ sort-keys "^1.1.1"
+ write-file-atomic "^2.0.0"
+
+write-pkg@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-2.1.0.tgz#353aa44c39c48c21440f5c08ce6abd46141c9c08"
+ dependencies:
+ sort-keys "^1.1.2"
+ write-json-file "^2.0.0"
+
+write@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+ dependencies:
+ mkdirp "^0.5.1"
+
+ws@1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.2.tgz#8a244fa052401e08c9886cf44a85189e1fd4067f"
+ dependencies:
+ options ">=0.0.5"
+ ultron "1.0.x"
+
+ws@1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.4.tgz#57f40d036832e5f5055662a397c4de76ed66bf61"
+ dependencies:
+ options ">=0.0.5"
+ ultron "1.0.x"
+
+wtf-8@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a"
+
+xdg-basedir@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2"
+ dependencies:
+ os-homedir "^1.0.0"
+
+xdg-basedir@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
+
+xml-char-classes@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d"
+
+xml-name-validator@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635"
+
+xmlbuilder@8.2.2:
+ version "8.2.2"
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773"
+
+xmldom@0.1.x:
+ version "0.1.27"
+ resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9"
+
+xmlhttprequest-ssl@1.5.3:
+ version "1.5.3"
+ resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d"
+
+xo-init@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/xo-init/-/xo-init-0.5.0.tgz#8e28dec79676cc5e042fde5fd8f710e2646b0e36"
+ dependencies:
+ arrify "^1.0.0"
+ execa "^0.5.0"
+ minimist "^1.1.3"
+ path-exists "^3.0.0"
+ read-pkg-up "^2.0.0"
+ the-argv "^1.0.0"
+ write-pkg "^2.0.0"
+
+xo@^0.18.0:
+ version "0.18.2"
+ resolved "https://registry.yarnpkg.com/xo/-/xo-0.18.2.tgz#92a42eb02a4fb149dfea5518021914f5aac84ff0"
+ dependencies:
+ arrify "^1.0.0"
+ debug "^2.2.0"
+ deep-assign "^1.0.0"
+ eslint "^3.18.0"
+ eslint-config-xo "^0.18.0"
+ eslint-formatter-pretty "^1.0.0"
+ eslint-plugin-ava "^4.2.0"
+ eslint-plugin-import "^2.0.0"
+ eslint-plugin-no-use-extend-native "^0.3.2"
+ eslint-plugin-promise "^3.4.0"
+ eslint-plugin-unicorn "^2.1.0"
+ get-stdin "^5.0.0"
+ globby "^6.0.0"
+ has-flag "^2.0.0"
+ ignore "^3.2.6"
+ lodash.isequal "^4.4.0"
+ meow "^3.4.2"
+ multimatch "^2.1.0"
+ path-exists "^3.0.0"
+ pkg-conf "^2.0.0"
+ resolve-cwd "^1.0.0"
+ resolve-from "^2.0.0"
+ slash "^1.0.0"
+ update-notifier "^2.1.0"
+ xo-init "^0.5.0"
+
+"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+yallist@^2.0.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yargs-parser@^4.2.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c"
+ dependencies:
+ camelcase "^3.0.0"
+
+yargs@^6.3.0:
+ version "6.6.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208"
+ dependencies:
+ camelcase "^3.0.0"
+ cliui "^3.2.0"
+ decamelize "^1.1.1"
+ get-caller-file "^1.0.1"
+ os-locale "^1.4.0"
+ read-pkg-up "^1.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^1.0.2"
+ which-module "^1.0.0"
+ y18n "^3.2.1"
+ yargs-parser "^4.2.0"
+
+yargs@~3.10.0:
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+ dependencies:
+ camelcase "^1.0.2"
+ cliui "^2.1.0"
+ decamelize "^1.0.0"
+ window-size "0.1.0"
+
+yauzl@^2.5.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.8.0.tgz#79450aff22b2a9c5a41ef54e02db907ccfbf9ee2"
+ dependencies:
+ buffer-crc32 "~0.2.3"
+ fd-slicer "~1.0.1"
+
+yeast@0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
+
+yeoman-environment@^1.1.0, yeoman-environment@^1.5.2:
+ version "1.6.6"
+ resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-1.6.6.tgz#cd85fa67d156060e440d7807d7ef7cf0d2d1d671"
+ dependencies:
+ chalk "^1.0.0"
+ debug "^2.0.0"
+ diff "^2.1.2"
+ escape-string-regexp "^1.0.2"
+ globby "^4.0.0"
+ grouped-queue "^0.3.0"
+ inquirer "^1.0.2"
+ lodash "^4.11.1"
+ log-symbols "^1.0.1"
+ mem-fs "^1.1.0"
+ text-table "^0.2.0"
+ untildify "^2.0.0"
+
+yeoman-generator@^1.0.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/yeoman-generator/-/yeoman-generator-1.1.1.tgz#40c2b4f6cdfbe05e1952fdd72933f0d8925dbdf5"
+ dependencies:
+ async "^2.0.0"
+ chalk "^1.0.0"
+ class-extend "^0.1.0"
+ cli-table "^0.3.1"
+ cross-spawn "^5.0.1"
+ dargs "^5.1.0"
+ dateformat "^2.0.0"
+ debug "^2.1.0"
+ detect-conflict "^1.0.0"
+ error "^7.0.2"
+ find-up "^2.1.0"
+ github-username "^3.0.0"
+ glob "^7.0.3"
+ istextorbinary "^2.1.0"
+ lodash "^4.11.1"
+ mem-fs-editor "^3.0.0"
+ minimist "^1.2.0"
+ mkdirp "^0.5.0"
+ path-exists "^3.0.0"
+ path-is-absolute "^1.0.0"
+ pretty-bytes "^4.0.2"
+ read-chunk "^2.0.0"
+ read-pkg-up "^2.0.0"
+ rimraf "^2.2.0"
+ run-async "^2.0.0"
+ shelljs "^0.7.0"
+ text-table "^0.2.0"
+ through2 "^2.0.0"
+ user-home "^2.0.0"
+ yeoman-environment "^1.1.0"
+
+zip-stream@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.1.1.tgz#5216b48bbb4d2651f64d5c6e6f09eb4a7399d557"
+ dependencies:
+ archiver-utils "^1.3.0"
+ compress-commons "^1.1.0"
+ lodash "^4.8.0"
+ readable-stream "^2.0.0"
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/.bower.json
new file mode 100644
index 00000000000..4bc7494e1d7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/.bower.json
@@ -0,0 +1,46 @@
+{
+ "name": "polymer",
+ "main": [
+ "polymer.html"
+ ],
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "ignore": [
+ "/.*",
+ "/test/",
+ "/util/",
+ "gulpfile.js",
+ "CONTRIBUTING.md",
+ "CHANGELOG.md"
+ ],
+ "authors": [
+ "The Polymer Authors (http://polymer.github.io/AUTHORS.txt)"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/Polymer/polymer.git"
+ },
+ "dependencies": {
+ "shadycss": "webcomponents/shadycss#^v1.1.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^v1.1.0"
+ },
+ "devDependencies": {
+ "web-component-tester": "^6.0.0",
+ "test-fixture": "PolymerElements/test-fixture#3.0.0-rc.1",
+ "iron-component-page": "PolymerElements/iron-component-page#^3.0.1"
+ },
+ "private": true,
+ "resolutions": {
+ "test-fixture": "3.0.0-rc.1"
+ },
+ "homepage": "https://github.com/Polymer/polymer",
+ "version": "2.6.0",
+ "_release": "2.6.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.6.0",
+ "commit": "00d510f17a19b5b2ffed2fab5c2220b562b69b4f"
+ },
+ "_source": "https://github.com/Polymer/polymer.git",
+ "_target": "^2.0.0",
+ "_originalSource": "Polymer/polymer"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/LICENSE.txt b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/LICENSE.txt
new file mode 100644
index 00000000000..87c683b8e83
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/LICENSE.txt
@@ -0,0 +1,27 @@
+// Copyright (c) 2017 The Polymer Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/README.md
new file mode 100644
index 00000000000..2cfffd68c4c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/README.md
@@ -0,0 +1,522 @@
+# Polymer
+
+[![Build Status](https://travis-ci.org/Polymer/polymer.svg?branch=master)](https://travis-ci.org/Polymer/polymer)
+
+Polymer lets you build encapsulated, reusable elements that work just like standard HTML elements, to use in building web applications.
+
+```html
+<!-- Polyfill Web Components for older browsers -->
+<script src="webcomponentsjs/webcomponents-lite.js"></script>
+
+<!-- Import element -->
+<link rel="import" href="google-map.html">
+
+<!-- Use element -->
+<google-map latitude="37.790" longitude="-122.390"></google-map>
+```
+
+Check out [polymer-project.org](https://www.polymer-project.org) for all of the library documentation, including getting started guides, tutorials, developer reference, and more.
+
+Or if you'd just like to download the library, check out our [releases page](https://github.com/polymer/polymer/releases).
+
+## Polymer 2.0 is out!
+
+Polymer 2.0 is released, and will be the future focus of Polymer development going forward. We intend to keep the 2.x public API stable barring critical issues. For background and migration information on the 2.x see the [2.0 documentation](https://www.polymer-project.org/2.0/docs/about_20) on the website or the [2.0 section below](#2-0), and we welcome your feedback via [issues](https://github.com/Polymer/polymer/issues/new) or [Slack](https://polymer-slack.herokuapp.com/).
+
+**To evaluate Polymer 2.0**, please point your bower at the latest `2.0.0` tag for polymer, and be sure load to the `webcomponentsjs/webcomponents-lite.js` or `webcomponentsjs/webcomponents-loader.js` polyfills from the latest `v1.0.0` tag of [`webcomponentsjs`](https://github.com/webcomponents/webcomponentsjs).
+
+👀 **Looking for Polymer v1.x?** Please see the [the v1 branch](https://github.com/Polymer/polymer/tree/1.x).
+
+⁉️ **Looking to use Polymer with npm?** Polymer 1.x and 2.x both use `bower` for version management, but v3 and on will use `npm`. Please see our [v3 announcement](https://www.polymer-project.org/blog/2017-08-22-npm-modules.html) and [v3 hand-on](https://www.polymer-project.org/blog/2017-08-23-hands-on-30-preview.html) to use a preview version of v3.
+Versions before 3.0 are also published to npm "as-is" and are generally unsupported. These packages are for advanced users who configure their own tooling to work around the differences between Bower and npm packages, like package folder layout.
+
+## Overview
+
+Polymer is a lightweight library built on top of the web standards-based [Web Components](http://webcomponents.org/) APIs, and makes it easier to build your very own custom HTML elements. Creating reusable custom elements - and using elements built by others - can make building complex web applications easier and more efficient. By being based on the Web Components API's built in the browser (or [polyfilled](https://github.com/webcomponents/webcomponentsjs) where needed), Polymer elements are interoperable at the browser level, and can be used with other frameworks or libraries that work with modern browsers.
+
+Among many ways to leverage custom elements, they can be particularly useful for building reusable UI components. Instead of continually re-building a specific navigation bar or button in different frameworks and for different projects, you can define this element once using Polymer, and then reuse it throughout your project or in any future project.
+
+Polymer provides a declarative syntax to easily create your own custom elements, using all standard web technologies - define the structure of the element with HTML, style it with CSS, and add interactions to the element with JavaScript.
+
+Polymer also provides optional two-way data-binding, meaning:
+
+1. When properties in the model for an element get updated, the element can update itself in response.
+2. When the element is updated internally, the changes can be propagated back to the model.
+
+Polymer is designed to be flexible, lightweight, and close to the web platform - the library doesn't invent complex new abstractions and magic, but uses the best features of the web platform in straightforward ways to simply sugar the creation of custom elements.
+
+In addition to the Polymer library for building your own custom elements, the Polymer project includes a collection of [pre-built elements](https://elements.polymer-project.org) that you can drop on a page and use immediately, or use as starting points for your own custom elements.
+
+## Polymer in 1 Minute
+
+Polymer adds convenient features to make it easy to build complex elements:
+
+**Basic custom element without Polymer:**
+
+```js
+// Standard custom element that Extends HTMLElement
+class MyElement extends HTMLElement {
+ constructor() {
+ super();
+ console.log('my-element was created!');
+ }
+}
+
+// Register custom element class with browser
+customElements.define('my-element', MyElement);
+```
+
+```html
+<!-- use the element -->
+<my-element></my-element>
+```
+
+**Custom element using Polymer**
+
+```html
+<!-- Define template that your element will use -->
+<dom-module id="my-simple-namecard">
+ <template>
+ <div>
+ Hi! My name is <span>Jane</span>
+ </div>
+ </template>
+</dom-module>
+```
+
+```js
+// Custom element that extends Polymer base class
+class MySimpleNamecard extends Polymer.Element {
+
+ // Stamp template from this dom-module into element's shadow DOM:
+ static get is() { return 'my-simple-namecard'; }
+
+}
+
+// Register custom element class with browser
+customElements.define(MySimpleNamecard.is, MySimpleNamecard);
+```
+
+**Configure properties on your element...**
+
+```js
+// Create an element that takes a property
+class MyPropertyNamecard extends Polymer.Element {
+
+ static get is() { return 'my-property-namecard'; }
+
+ // Define property/attribute API:
+ static get properties() {
+ return {
+ myName: {
+ type: String,
+ observer: 'myNameChanged'
+ }
+ };
+ }
+
+ myNameChanged(myName) {
+ this.textContent = 'Hi! My name is ' + myName;
+ }
+
+}
+
+customElements.define(MyPropertyNamecard.is, MyPropertyNamecard);
+```
+
+**...and have them set using declarative attributes**
+
+```html
+<!-- using the element -->
+<my-property-namecard my-name="Jim"></my-property-namecard>
+```
+
+> Hi! My name is Jim
+
+**Bind data into your element using the familiar mustache-syntax**
+
+```html
+<!-- Define template with bindings -->
+<dom-module id="my-bound-namecard">
+ <template>
+ <div>
+ Hi! My name is <span>[[myName]]</span>
+ </div>
+ </template>
+</dom-module>
+```
+```js
+class MyBoundNamecard extends Polymer.Element {
+
+ static get is() { return 'my-bound-namecard'; }
+
+ static get properties() {
+ return {
+ myName: String
+ };
+ }
+
+}
+
+customElements.define(MyBoundNamecard.is, MyBoundNamecard);
+```
+
+```html
+<!-- using the element -->
+<my-bound-namecard my-name="Josh"></my-bound-namecard>
+```
+
+> Hi! My name is Josh
+
+**Style the internals of your element, without the style leaking out**
+
+```html
+<!-- Add style to your element -->
+<dom-module id="my-styled-namecard">
+ <template>
+ <style>
+ /* This would be crazy without webcomponents, but with shadow DOM */
+ /* it only applies to this element's private "shadow DOM" */
+ span {
+ font-weight: bold;
+ }
+ </style>
+
+ <div>
+ Hi! My name is <span>{{myName}}</span>
+ </div>
+ </template>
+</dom-module>
+```
+```js
+class MyStyledNamecard extends Polymer.Element {
+
+ static get is() { return 'my-styled-namecard'; }
+
+ static get properties() {
+ return {
+ myName: String
+ };
+ }
+
+}
+
+customElements.define(MyStyledNamecard.is, MyStyledNamecard);
+```
+```html
+<!-- using the element -->
+<my-styled-namecard my-name="Jesse"></my-styled-namecard>
+```
+
+> Hi! My name is **Jesse**
+
+**and so much more!**
+
+Web components are an incredibly powerful new set of primitives baked into the web platform, and open up a whole new world of possibility when it comes to componentizing front-end code and easily creating powerful, immersive, app-like experiences on the web.
+
+By being based on Web Components, elements built with Polymer are:
+
+* Built from the platform up
+* Self-contained
+* Don't require an overarching framework - are interoperable across frameworks
+* Re-usable
+
+## Contributing
+
+The Polymer team loves contributions from the community! Take a look at our [contributing guide](CONTRIBUTING.md) for more information on how to contribute.
+
+## Communicating with the Polymer team
+
+Beyond GitHub, we try to have a variety of different lines of communication available:
+
+* [Blog](https://blog.polymer-project.org/)
+* [Twitter](https://twitter.com/polymer)
+* [Google+ community](https://plus.google.com/communities/115626364525706131031)
+* [Mailing list](https://groups.google.com/forum/#!forum/polymer-dev)
+* [Slack channel](https://bit.ly/polymerslack)
+
+# License
+
+The Polymer library uses a BSD-like license that is available [here](./LICENSE.txt)
+
+-----------
+
+<a name="release-candidate"></a>
+<a name="2-0"></a>
+# Polymer 2.0
+
+Polymer 2.0 is a major new release of Polymer that is compatible with the latest web components standards and web platform APIs, and makes significant improvements over the 1.x version of the library. The following section provides context and migration information for existing users of Polymer 1.x:
+
+## Goals of Polymer 2.0
+
+1. **Take advantage of native "v1" Web Components implementations across browsers.**
+
+ The primary goal of the Polymer 2.0 release is to take advantage of native, cross-browser support for Web Components.
+
+ Polymer 1.x is built on top of the so-called "v0" Web Components specs, which are supported natively only in Google Chrome; using Polymer in other browsers has always required the use of polyfills.
+
+ Beginning this fall, multiple browsers will be shipping native implementations of the new "v1" specs for Shadow DOM and Custom Elements, yielding better web components performance and reducing the need for polyfills.
+
+ Polymer 2.0 features full support for the v1 specs, taking advantage of native browser implementations where they are available and depending on updated v1 polyfills from [webcomponentsjs](https://github.com/webcomponents/webcomponentsjs) where necessary.
+
+ Polymer 2.0 also embraces the new ES-class-based mechanism for defining custom elements, bringing idiomatic Polymer style closer to "vanilla" custom element authoring.
+
+1. **Provide a smooth migration path from Polymer 1.x.**
+
+ Our second major goal is to provide as easy a transition as possible for developers who have built elements and apps with Polymer 1.x, making Polymer 2.0 a sturdy bridge to the future.
+
+ To upgrade, you will need to make some changes to your 1.x-based elements and apps. These changes are necessitated by both the v0-to-v1 spec transition and a handful of key improvements in Polymer itself (see our remaining goals, below).
+
+ However, we've taken care to limit the number of changes that are strictly required and to ease the process of upgrading:
+
+ * Polymer 2.0 introduces a new [ES6 class-based syntax](#20-es6-class-based-syntax), but we've provided a [lightweight compatibility layer](#10-compatibility-layer) allowing you to upgrade your 1.x code with minimal modifications. Depending on your needs, you can either take advantage of the compatibility layer or jump straight to idiomatic 2.0 style.
+
+ * Before releasing Polymer 2.0, we'll also provide an upgrade tool to automate as many of the changes (both required and recommended) as possible.
+
+ * Finally, we're working on guidelines for building and testing "hybrid" elements that will run in both Polymer 1.x and Polymer 2.0. We plan to ship hybrid versions of all of the elements that we provide, easing the transition for developers who use them. Third-party element providers may also choose to ship hybrid elements.
+
+ * If you have an especially large app or constraints that don't allow for an all-at-once upgrade, you can also use hybrid elements to migrate your app from 1.x to 2.0 in piecewise fashion: update your elements to hybrid form, individually or in batches, while running against Polymer 1.x; then cut over to Polymer 2.0 when all of your elements have been updated.
+
+1. **Eliminate leaky abstractions.**
+
+ Seamless interoperability is one of Web Components' major selling points. Generally speaking, web components "just work" anywhere you use HTML elements. To use them, you need only be aware of their public attributes, properties, methods and events; you don't need to know anything about their inner workings. This means you can easily mix standard HTML elements, third-party elements and elements you've defined yourself.
+
+ Unfortunately, there are a couple of cases in Polymer 1.x (the `Polymer.dom` API and the `set`/`notifyPath` API) where implementation details of Polymer-based elements leak out, requiring users of the elements to interact with them in non-standard ways. These "leaks" were by design – compromises we chose to make in the interest of performance – but in hindsight we aren't happy with the tradeoff.
+
+ In Polymer 2.0 we've found ways to eliminate these leaky abstractions without unduly compromising performance, which means that your Polymer 2.x-based elements will be indistinguishable from "vanilla" elements from a consumer's point of view (unless you leak implementation details of your own).
+
+1. **Make targeted improvements to the Polymer data system.**
+
+ Based on developer feedback and observations of Polymer apps in the wild, we've also made some key improvements to Polymer's data system. These changes are designed to make it easier to reason about and debug the propagation of data through and between elements:
+
+ * Changes are now batched, and the effects of those changes are run in well-defined order.
+ * We ensure that multi-property observers run exactly once per turn for any set of changes to dependencies (removing the [multi-property undefined rule](https://www.polymer-project.org/1.0/docs/devguide/observers#multi-property-observers)).
+ * To add compatibility with more approaches to state management, we now provide a mixin (and legacy behavior) to skip dirty-checking properties whose values are objects or arrays and always consider them dirty, causing their side effects to run.
+
+1. **Improve factoring of Polymer and the polyfills**
+
+ We've done major refactoring of Polymer and the webcomponentsjs polyfills to improve efficiency, utility and flexibility:
+
+ * The "Shady DOM" shim that was part of Polymer 1.x has been factored out of Polymer and added to the webcomponentsjs polyfills, along with the related shim for CSS Custom Properties. (As noted above, the Shady DOM shim no longer exposes an alternative API but instead patches the native DOM API for transparent usage).
+
+ * Polymer itself has been internally factored into several loosely coupled libraries.
+
+ * The new `Polymer.Element` class extends from the native `HTMLElement` and mixes in functionality from these libraries.
+
+ * The idiomatic way of using Polymer 2.0 (assuming you're not using the 1.x compatibility layer) is to define your own custom elements that subclass `Polymer.Element`, using standard ES class definition syntax.
+
+ * If you're interested in using pieces of Polymer's functionality in _a la carte_ fashion, you can try defining your own base element class, utilizing a subset of the libraries. For now, this use case should be considered experimental, as the factoring of libraries is subject to change and is not part of the official Polymer 2.0 API.
+
+## 1.0 Compatibility Layer
+Polymer 2.0 retains the existing `polymer/polymer.html` import that current Polymer 1.0 users can continue to import, which strives to provide a very minimally-breaking change for code written to the Polymer 1.0 API. For the most part, existing users upgrading to Polymer 2.0 will only need to adapt existing code to be compliant with the V1 Shadow DOM API related to content distribution and styling, as well as minor breaking changes introduced due to changes in the V1 Custom Elements spec and data-layer improvements listed [below](#breaking-changes).
+
+## 2.0 ES6 Class-based Syntax
+With the widespread adoption of ES6 in browsers, as well as the requirement that V1 Custom Elements be defined as ES6 class extensions of `HTMLElement`, Polymer 2.0 shifts its primary API for defining new elements to an ES6 class-centric syntax. Using this syntax, users will extend `Polymer.Element` (a subclass of `HTMLElement`), which provides meta-programming for most of the same features of Polymer 1.0 based on static configuration data supplied on the class definition.
+
+Basic syntax looks like this:
+
+```html
+<!-- Load the Polymer.Element base class -->
+<link rel="import" href="bower_components/polymer/polymer-element.html">
+```
+
+```js
+// Extend Polymer.Element base class
+class MyElement extends Polymer.Element {
+ static get is() { return 'my-element'; }
+ static get properties() { return { /* properties metadata */ } }
+ static get observers() { return [ /* observer descriptors */ ] }
+ constructor() {
+ super();
+ ...
+ }
+ connectedCallback() {
+ super.connectedCallback();
+ ...
+ }
+ ...
+}
+
+// Register custom element definition using standard platform API
+customElements.define(MyElement.is, MyElement);
+```
+
+Users can then leverage native subclassing support provided by ES6 to extend and customize existing elements defined using ES6 syntax:
+
+```js
+// Subclass existing element
+class MyElementSubclass extends MyElement {
+ static get is() { return 'my-element-subclass'; }
+ static get properties() { return { /* properties metadata */ } }
+ static get observers() { return [ /* observer descriptors */ ] }
+ constructor() {
+ super();
+ ...
+ }
+ ...
+}
+
+// Register custom element definition using standard platform API
+customElements.define(MyElementSubclass.is, MyElementSubclass);
+```
+
+Below are the general steps for defining a custom element using this new syntax:
+
+* Extend from `Polymer.Element`. This class provides the minimal surface area to integrate with 2.0's data binding system. It provides only standard custom element lifecycle with the addition of `ready`. (You can apply the `Polymer.LegacyElementMixin` to get all of the Polymer 1.0 element API, but since most of this API was rarely used, this should not often be needed.)
+* Implement "behaviors" as [mixins that return class expressions](http://justinfagnani.com/2015/12/21/real-mixins-with-javascript-classes/) and apply to the base class you are extending from.
+* Property metadata (`properties`) and multi-property/wildcard observers (`observers`) should be put on the class as static getters, but otherwise match the 1.x syntax.
+* In order to provide a template to stamp into the element's shadow DOM, either define a static `is` getter that returns the id of a `dom-module` containing the element's template, or else provide a static `template` getter that returns a template to stamp. The `template` getter may either return an HTMLTemplateElement or a string containing HTML which will be parsed into a template.
+* `listeners` and `hostAttributes` have been removed from element metadata; listeners and attributes should be installed using standard platform API (`this.addEventListener`, `this.setAttribute`) how and when needed (e.g. in `connectedCallback`). For convenience `_ensureAttribute` is available that sets an attribute if and only if the element does not yet have that attribute, to match `hostAttribute` semantics.
+
+Note that `Polymer.Element` provides a cleaner base class void of a lot of sugared utility API that present on elements defined with `Polymer()`, such as `fire`, `transform`, etc. With web platform surface area becoming far more stable across browsers, we intend to hew towards sugaring less and embracing the raw platform API more. So when using `Polymer.Element`, instead of using the legacy `this.fire('some-event')` API, simply use the equivalent platform API's such as `this.dispatchEvent(new CustomEvent('some-event', {bubbles: true})`. #usetheplatform
+
+See below for a visual guide on migrating Polymer 1.0's declarative syntax to the ES6 class syntax in Polymer 2.0:
+
+![Difference in Polymer 1.0 and Polymer 2.0 element definition](img/migration.png)
+
+## Polyfills
+
+Polymer 2.0 has been developed alongside and tested with a new suite of V1-spec compatible polyfills for Custom Elements and Shadow DOM. Polymer 2.0 is compatible the latest releases of [`webcomponentsjs/webcomponents-lite.js`](https://github.com/webcomponents/webcomponentsjs), which is included as a bower dependency to Polymer 2.x.
+
+## Breaking Changes
+Below is a list of intentional breaking changes made in Polymer 2.0, along with their rationale/justification and migration guidance. If you find changes that broke existing code not documented here, please [file an issue](https://github.com/Polymer/polymer/issues/new) and we'll investigate to determine whether they are expected/intentional or not.
+
+
+### Polymer.dom
+On browsers that lack native V1 Shadow DOM support, Polymer 2.0 is designed to be used with the new [V1 Shady DOM shim](https://github.com/webcomponents/shadydom), which patches native DOM API as necessary to be mostly equivalent to native Shadow DOM. This removes the requirement to use the `Polymer.dom` API when interacting with the DOM. `Polymer.dom` can be eliminated for elements targeting Polymer 2.0, in favor of the native DOM API's.
+
+Note that `Polymer.dom` is still provided in the `polymer.html` backward-compatibility layer which simply facades the native API, but usage of it in 2.0 can be removed. Note that `Polymer.dom` will no longer return `Array`s for API's where the platform returns e.g. `NodeList`'s, so code may need to be updated to avoid direct use of array methods.
+
+### V1 Shadow DOM
+Polymer 2.0 elements will stamp their templates into shadow roots created using V1's `attachShadow({mode: 'open'})` by default. As such, user code related to scoped styling, distribution, and events must be adapted to native V1 API. For a great writeup on all Shadow DOM V1 spec changes, [see this writeup](http://hayato.io/2016/shadowdomv1/). Required changes for V1 are summarized below:
+
+#### Distribution
+* <a name="breaking-slot"></a>`<content>` insertion points must be changed to `<slot>`
+* <a name="breaking-slot-name"></a>Insertion points that selected content via `<content select="...">` must be changed to named slots: `<slot name="...">`
+* <a name="breaking-slot-slot"></a>Selection of distributed content into named slots must use `slot="..."` rather than tag/class/attributes selected by `<content>`
+* <a name="breaking-redistribution"></a>Re-distributing content by placing a `<slot>` into an element that itself has named slots requires placing a `name` attribute on the `<slot>` to indicate what content _it_ selects from its host children, and placing a `slot` attribute to indicate where its selected content should be slotted into its parent
+* <a name="breaking-async-distribution"></a>In the V1 "Shady DOM" shim, initial distribution of children into `<slot>` is asynchronous (microtask) to creating the `shadowRoot`, meaning distribution occurs after observers/`ready` (in Polymer 1.0's shim, initial distribution occurred before `ready`). In order to force distribution synchronously, call `ShadyDOM.flush()`.
+* <a name="breaking-observe-nodes-flush"></a>Calling `Polymer.dom.flush` no longer results in callbacks registered with `Polymer.dom.observeNodes` being called. Instead, the object returned from `Polymer.dom.observeNodes` now contains a `flush` method which can be used to immediately call the registered callback if any changes are pending.
+
+#### Scoped styling
+
+* <a name="breaking-styling-content"></a>`::content` CSS pseudo-selectors must be changed to `::slotted`, and may only target immediate children and use no descendant selectors
+* <a name="breaking-styling-host-context"></a>`:host-context()` pseudo-selectors have been removed. These were primarily useful for writing bi-directional rules (e.g. `:host-context([dir=rtl])`); these should be replaced with the [new `:dir(rtl)` selector](https://developer.mozilla.org/en-US/docs/Web/CSS/:dir), which we plan to polyfill in the [styling shim](https://github.com/webcomponents/shadycss) soon
+* <a name="breaking-deep"></a>The previously deprecated `/deep/` and `::shadow` selectors have been completely removed from V1 native support and must not be used (use [CSS custom properties](https://www.polymer-project.org/1.0/docs/devguide/styling#custom-css-properties) to customize styling instead)
+
+#### Scoped events
+
+* <a name="breaking-event-localTarget"></a>Code using `Polymer.dom(event).localTarget` should change to the V1 standard API `event.target`
+* <a name="breaking-event-path"></a>Code using `Polymer.dom(event).path` (aka V0 `event.path`) should change to the V1 standard API `event.composedPath()`
+* <a name="breaking-event-rootTarget"></a>Code using `Polymer.dom(event).rootTarget` (aka V0 `event.path[0]`) should change to the V1 standard API `event.composedPath()[0]`
+
+### V1 Custom Elements
+Polymer 2.0 elements will target the V1 Custom Elements API, which primarily changes the "created" step to actually invoke the `class` constructor, imposes new restrictions on what can be done in the `constructor` (previously `createdCallback`), and introduces different callback names.
+
+* <a name="breaking-callbacks"></a>Changes to callback names:
+ * When using `Polymer({...})` from the compatibility layer, all callbacks should use legacy Polymer API names (`created`, `attached`, `detached`, `attributeChanged`)
+ * When extending from `Polymer.Element`, users should override the V1 standard callback names and call `super()`:
+ * `created` changes to `constructor`
+ * `attached` changes to `connectedCallback`
+ * `detached` changes to `disconnectedCallback`
+ * `attributeChanged` changes to `attributeChangedCallback`
+* <a name="breaking-attributes"></a>The V1 Custom Elements spec forbids reading attributes, children, or parent information from the DOM API in the `constructor` (or `created` when using the legacy API). Likewise, attributes and children may not be added in the `constructor`. Any such work must be deferred (e.g. until `connectedCallback` or microtask/`setTimeout`/`requestAnimationFrame`).
+* <a name="breaking-is"></a>Polymer will no longer produce type-extension elements (aka `is="..."`). Although they are still included in the V1 Custom Elements [spec](https://html.spec.whatwg.org/#custom-elements-customized-builtin-example) and scheduled for implementation in Chrome, because Apple [has stated](https://github.com/w3c/webcomponents/issues/509#issuecomment-233419167) it will not implement `is`, we will not be encouraging its use to avoid indefinite reliance on the Custom Elements polyfill. Instead, a wrapper custom element can surround a native element, e.g. `<a is="my-anchor">...</a>` could become `<my-anchor><a>...</a></my-anchor>`. Users will need to change existing `is` elements where necessary.
+* <a name="breaking-templates"></a>All template type extensions provided by Polymer have now been changed to standard custom elements that take a `<template>` in their light dom, e.g.
+
+ ```html
+ <template is="dom-repeat" items="{{items}}">...</template>
+ ```
+
+ should change to
+
+ ```html
+ <dom-repeat items="{{items}}">
+ <template>...</template>
+ </dom-repeat>
+ ```
+
+ For the time being, Polymer (both legacy and class API) will automatically wrap template extensions used in Polymer element templates during template processing for backward-compatibility, although we may decide to remove this auto-wrapping in the future. Templates used in the main document must be manually wrapped.
+* <a name="breaking-custom-style"></a>The `custom-style` element has also been changed to a standard custom element that must wrap a style element e.g.
+
+ ```html
+ <style is="custom-style">...</style>
+ ```
+
+ should change to
+
+ ```html
+ <custom-style>
+ <style>...</style>
+ </custom-style>
+ ```
+
+### CSS Custom Property Shim
+Polymer 2.0 will continue to use a [shim](https://github.com/webcomponents/shadycss) to provide limited [CSS Custom Properties](#https://www.polymer-project.org/1.0/docs/devguide/styling#custom-css-properties) support on browsers that do not yet natively support custom properties, to allow an element to expose a custom styling API. The following changes have been made in the shim that Polymer 2.0 will use:
+
+* <a name="breaking-css-native"></a>The shim will now always use native CSS Custom Properties by default on browsers that implement them (this was opt-in in 1.0). The shim will perform a one-time transformation of stylesheets containing [CSS Custom Property mixins](https://www.polymer-project.org/1.0/docs/devguide/styling#custom-css-mixins) to leverage individual native CSS properties where possible for better performance. This introduces [some limitations](https://github.com/webcomponents/shadycss#custom-properties-and-apply) to be aware of.
+* <a name="breaking-css-syntax"></a>The following invalid styling syntax was previously accepted by the 1.0 custom property shim. In order to support native CSS Custom Properties, rules should be correct to use only natively valid syntax:
+ * `:root {}`
+ * Should be `:host > * {}` (in a shadow root)
+ * Should be `html {}` (in main document)
+ * Thus, cannot share old `:root` styles for use in both main document and shadow root
+ * `var(--a, --b)`
+ * Should be `var(--a, var(--b))`
+ * `@apply(--foo)`
+ * Should be `@apply --foo;`
+* <a name="breaking-customStyle"></a>`element.customStyle` as an object that can be assigned to has been removed; use `element.updateStyles({...})` instead.
+* <a name="breaking-style-location"></a>`<style>` inside of a `<dom-module>`, but outside of `<template>` is no longer supported.
+
+### Data system
+* <a name="breaking-data-init"></a>An element's template is not stamped & data system not initialized (observers, bindings, etc.) until the element has been connected to the main document. This is a direct result of the V1 changes that prevent reading attributes in the constructor.
+* <a name="breaking-data-batching"></a>Propagation of data through the binding system is now batched, such that multi-property computing functions and observers run once with a set of coherent changes. Single property accessors still propagate data synchronously, although there is a new `setProperties({...})` API on Polymer elements that can be used to propagate multiple values as a coherent set.
+* <a name="breaking-notify-order"></a>Property change notification event dispatch (`notify: true`) occurs after all other side effects of a property change occurs. In 1.x notification happened after binding side effects, but before observers, which was counter-intuitive. This rationalizes the concept of upward notification to ensure it happens after _all_ local and downward side-effects based on the change occur. Concretely, the order of effect processing in 2.x is as follows:
+ 1. computed properties (`computed`)
+ 1. template bindings (both property bindngs `[[...]]` and computed bindings `[[compute(...)]]`, including any side-effects on child elements for the bound property/attribute changes)
+ 1. attribute reflection (`reflectToAttribute: true`)
+ 1. observers (both single-property `observer` and multi-property `observers`)
+ 1. property-changed event notification (`notify: true`, including any side-effects on host elements for the bound property changes)
+* <a name="breaking-method-args"></a>Multi-property observers, computed methods, and computed bindings are now called once at initialization if any arguments are defined (and will see `undefined` for any undefined arguments). As such, the [1.x rule requiring all properties of a multi-property observer to be defined](https://www.polymer-project.org/1.0/docs/devguide/observers#multi-property-observers) no longer applies, as this was a major source of confusion and unintended consequences. Subsequently setting multi-property method arguments will cause the method to be called once for each property changed via accessors, or once per batch of changes via `setProperties({...})`.
+* <a name="breaking-dynamic-functions"> Declaring a method name used as an observer or computing function in the `properties` block causes the method property itself to become a dependency for any effects it is used in, meaning the effect for that method will run whenever the method is set, similar to 1.x. However, due to removing the `undefined` rule noted above, in 2.x if such a method exists when the element is created, it will run with initial values of arguments, even in the case some or all arguments are `undefined`.
+* <a name="breaking-binding-notifications">‘notify’ events are no longer fired when value changes _as result of binding from host_, as a major performance optimization over 1.x behavior. Use cases such as `<my-el foo="{{bar}}" on-foo-changed="fooChanged">` are no longer supported. In this case you should simply user a `bar` observer in the host. Use cases such as dynamically adding a `property-changed` event listener on for properties bound by an element's host by an actor other than the host are no longer supported.
+* <a name="breaking-properties-deserialization"></a>In order for a property to be deserialized from its attribute, it must be declared in the `properties` metadata object.
+* <a name="breaking-collection"></a>The `Polymer.Collection` and associated key-based path and splice notification for arrays has been eliminated. See [explanation here](https://github.com/Polymer/polymer/pull/3970#issue-178203286) for more details.
+* <a name="feature-mutable-data"></a>While not a breaking change, Polymer now ships with a `Polymer.MutableData` mixin (and legacy `Polymer.MutableDataBehavior` behavior) to provide more options for managing data. By default, `Polymer.PropertyEffects` performs strict dirty checking on objects, which means that any deep modifications to an object or array will not be propagated unless "immutable" data patterns are used (i.e. all object references from the root to the mutation were changed). Polymer also provides a proprietary data mutation and path notification API (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient mutation and notification of deep changes in an object graph to all elements bound to the same object graph. In cases where neither immutable patterns or the data mutation API can be used, applying this mixin will cause Polymer to skip dirty checking for objects and arrays and always consider them to be "dirty". This allows a user to make a deep modification to a bound object graph, and then either simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath` (e.g. `this.notifyPath('items')`) to update the tree. Note that all elements that wish to be updated based on deep mutations must apply this mixin or otherwise skip strict dirty checking for objects/arrays.
+
+### Removed API
+* <a name="breaking-instanceof"></a>`Polymer.instanceof` and `Polymer.isInstance`: no longer needed, use
+`instanceof` and `instanceof Polymer.Element` instead.
+* <a name="breaking-dom-module"></a>`dom-module`: Removed ability to use `is` and `name` attribute to
+configure the module name. The only supported declarative way set the module
+id is to use `id`.
+* <a name="breaking-getPropertyInfo"></a>`element.getPropertyInfo`: This api returned unexpected information some of the time and was rarely used.
+* <a name="breaking-getNativePrototype"></a>`element.getNativePrototype`: Removed because it is no longer needed for internal code and was unused by users.
+* <a name="breaking-beforeRegister"></a>`element.beforeRegister`: This was originally added for metadata compatibility with ES6 classes. We now prefer users create ES6 classes by extending `Polymer.Element`, specifying metadata in the static `properties`, `observers`, and `is` properties. For legacy use via `Polymer({...})`, dynamic effects may still be added by using `beforeRegister` but it is now equivalent to the `registered` lifecycle method. An element's `is` property cannot be set in `beforeRegister` as it could in Polymer 1.x.
+* <a name="breaking-attributeFollows"></a>`element.attributeFollows`: Removed due to disuse.
+* <a name="breaking-classFollows"></a>`element.classFollows`: Removed due to disuse.
+* <a name="breaking-copyOwnProperty"></a>`element.copyOwnProperty`: Removed due to disuse.
+* <a name="breaking-listeners"></a>`listeners`: Removed ability to use `id.event` to add listeners to elements in local dom. Use declarative template event handlers instead.
+* <a name="breaking-protected"></a>Methods starting with `_` are not guaranteed to exist (most have been removed)
+
+### Other
+* <a name="breaking-transpiling"></a>Polymer 2.0 uses ES2015 syntax, and can be run without transpilation in current Chrome, Safari 10, Safari Technology Preview, Firefox, and Edge. Transpilation is required to run in IE11 and Safari 9 (as well as Edge for high reliability, due to certain [bugs](https://github.com/Microsoft/ChakraCore/issues/1496) in their ES6 implementation). The [`polymer-cli`](https://github.com/Polymer/polymer-cli) tools such as `polymer serve` and `polymer build` have built-in support for transpiling when needed.
+* <a name="breaking-deferred-attach"></a>The `attached` legacy callback is no longer deferred until first render time; it now runs at the time of the native `connectedCallback`, which may be before styles have resolved and measurement is possible. Instead when measurement is needed use `Polymer.RenderStatus.beforeNextRender`.
+* <a name="breaking-created-timing"></a>The legacy `created` callback is no longer called before default values in `properties` have been set. As such, you should not rely on properties set in `created` from within `value` functions that define property defaults. However, you can now set _any_ property defaults within the `created` callback (in 1.0 this was forbidden for observed properties) in lieu of using the `value` function in `properties`.
+* <a name="breaking-boolean-attribute-binidng"></a>Binding a default value of `false` via an _attribute binding_ to a boolean property will not override a default `true` property of the target, due to the semantics of boolean attributes. In general, property binding should always be used when possible, and will avoid such situations.
+* <a name="breaking-lazyRegister"></a>`lazyRegister` option removed and all meta-programming (parsing template, creating accessors on prototype, etc.) is deferred until the first instance of the element is created
+* <a name="breaking-hostAttributes-class"></a>In Polymer 1.x, the `class` attribute was explicitly blacklisted from `hostAttributes` and never serialized. This is no longer the case using the 2.0 legacy API.
+* <a name="breaking-url-changes"></a>In Polymer 1.x, URLs in attributes and styles inside element templates were re-written to be relative to the element HTMLImport. Based on user feedback, we are changing this behavior.
+
+ Two new properties are being added to `Polymer.Element`: `importPath` and `rootPath`. The `importPath` property is a static getter on the element class that defaults to the element HTMLImport document URL and is overridable. It may be useful to override `importPath` when an element `template` is not retrieved from a `dom-module` or the element is not defined using an HTMLImport. The `rootPath` property is set to the value of `Polymer.rootPath` which is globally settable and defaults to the main document URL. It may be useful to set `Polymer.rootPath` to provide a stable application mount path when using client side routing. URL's in styles are re-written to be relative to the `importPath` property. Inside element templates, URLs in element attributes are *no longer* re-written. Instead, they should be bound using `importPath` and `rootPath` where appropriate. For example:
+
+ A Polymer 1.x template that included:
+
+ ```html
+ <img src="foo.jpg">
+ ```
+
+ in Polymer 2.x should be:
+
+ ```html
+ <img src$="[[importPath]]foo.jpg">
+ ```
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/bower.json
new file mode 100644
index 00000000000..ae2bcf5033c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/bower.json
@@ -0,0 +1,35 @@
+{
+ "name": "polymer",
+ "main": [
+ "polymer.html"
+ ],
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "ignore": [
+ "/.*",
+ "/test/",
+ "/util/",
+ "gulpfile.js",
+ "CONTRIBUTING.md",
+ "CHANGELOG.md"
+ ],
+ "authors": [
+ "The Polymer Authors (http://polymer.github.io/AUTHORS.txt)"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/Polymer/polymer.git"
+ },
+ "dependencies": {
+ "shadycss": "webcomponents/shadycss#^v1.1.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^v1.1.0"
+ },
+ "devDependencies": {
+ "web-component-tester": "^6.0.0",
+ "test-fixture": "PolymerElements/test-fixture#3.0.0-rc.1",
+ "iron-component-page": "PolymerElements/iron-component-page#^3.0.1"
+ },
+ "private": true,
+ "resolutions": {
+ "test-fixture": "3.0.0-rc.1"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/externs/closure-types.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/externs/closure-types.js
new file mode 100644
index 00000000000..c8b38c77e3b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/externs/closure-types.js
@@ -0,0 +1,1402 @@
+/**
+ * @fileoverview Generated typings for Polymer mixins
+ * @externs
+ *
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+/* eslint-disable */
+/**
+* @interface
+*/
+function Polymer_PropertiesChanged(){}
+/**
+* @param {string} property Name of the property
+* @param {boolean=} readOnly When true, no setter is created; the
+ protected `_setProperty` function must be used to set the property
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._createPropertyAccessor = function(property, readOnly){};
+/**
+* @param {string} property Name of the property
+*/
+Polymer_PropertiesChanged.prototype._addPropertyToAttributeMap = function(property){};
+/**
+* @param {string} property Name of the property
+* @param {boolean=} readOnly When true, no setter is created
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._definePropertyAccessor = function(property, readOnly){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype.ready = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._initializeProperties = function(){};
+/**
+* @param {Object} props Bag of property values that were overwritten
+ when creating property accessors.
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._initializeInstanceProperties = function(props){};
+/**
+* @param {string} property Name of the property
+* @param {*} value Value to set
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._setProperty = function(property, value){};
+/**
+* @param {string} property Name of property
+* @return {*}
+*/
+Polymer_PropertiesChanged.prototype._getProperty = function(property){};
+/**
+* @param {string} property Name of the property
+* @param {*} value Value to set
+* @param {boolean=} ext Not used here; affordance for closure
+* @return {boolean}
+*/
+Polymer_PropertiesChanged.prototype._setPendingProperty = function(property, value, ext){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._invalidateProperties = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._enableProperties = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._flushProperties = function(){};
+/**
+* @param {!Object} currentProps Bag of all current accessor values
+* @param {!Object} changedProps Bag of properties changed since the last
+ call to `_propertiesChanged`
+* @param {!Object} oldProps Bag of previous values for each property
+ in `changedProps`
+* @return {boolean}
+*/
+Polymer_PropertiesChanged.prototype._shouldPropertiesChange = function(currentProps, changedProps, oldProps){};
+/**
+* @param {!Object} currentProps Bag of all current accessor values
+* @param {!Object} changedProps Bag of properties changed since the last
+ call to `_propertiesChanged`
+* @param {!Object} oldProps Bag of previous values for each property
+ in `changedProps`
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._propertiesChanged = function(currentProps, changedProps, oldProps){};
+/**
+* @param {string} property Property name
+* @param {*} value New property value
+* @param {*} old Previous property value
+* @return {boolean}
+*/
+Polymer_PropertiesChanged.prototype._shouldPropertyChange = function(property, value, old){};
+/**
+* @param {string} name Name of attribute that changed
+* @param {?string} old Old attribute value
+* @param {?string} value New attribute value
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype.attributeChangedCallback = function(name, old, value){};
+/**
+* @param {string} attribute Name of attribute to deserialize.
+* @param {?string} value of the attribute.
+* @param {*=} type type to deserialize to, defaults to the value
+returned from `typeForProperty`
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._attributeToProperty = function(attribute, value, type){};
+/**
+* @param {string} property Property name to reflect.
+* @param {string=} attribute Attribute name to reflect to.
+* @param {*=} value Property value to refect.
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._propertyToAttribute = function(property, attribute, value){};
+/**
+* @param {Element} node Element to set attribute to.
+* @param {*} value Value to serialize.
+* @param {string} attribute Attribute name to serialize to.
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._valueToNodeAttribute = function(node, value, attribute){};
+/**
+* @param {*} value Property value to serialize.
+* @return {(string | undefined)}
+*/
+Polymer_PropertiesChanged.prototype._serializeValue = function(value){};
+/**
+* @param {?string} value Value to deserialize.
+* @param {*=} type Type to deserialize the string to.
+* @return {*}
+*/
+Polymer_PropertiesChanged.prototype._deserializeValue = function(value, type){};
+/**
+* @param {!Object} props Object whose keys are names of accessors.
+* @return {void}
+*/
+Polymer_PropertiesChanged.createProperties = function(props){};
+/**
+* @param {string} property Property to convert
+* @return {string}
+*/
+Polymer_PropertiesChanged.attributeNameForProperty = function(property){};
+/**
+* @param {string} name Name of property
+*/
+Polymer_PropertiesChanged.typeForProperty = function(name){};
+/**
+* @interface
+* @extends {Polymer_PropertiesChanged}
+*/
+function Polymer_PropertyAccessors(){}
+/**
+* @param {string} property Name of the property
+* @param {boolean=} readOnly When true, no setter is created
+
+When calling on a prototype, any overwritten values are saved in
+`__dataProto`, and it is up to the subclasser to decide how/when
+to set those properties back into the accessor. When calling on an
+instance, the overwritten value is set via `_setPendingProperty`,
+and the user should call `_invalidateProperties` or `_flushProperties`
+for the values to take effect.
+* @return {void}
+*/
+Polymer_PropertyAccessors.prototype._definePropertyAccessor = function(property, readOnly){};
+/**
+* @return {void}
+*/
+Polymer_PropertyAccessors.prototype._initializeProperties = function(){};
+/**
+* @param {*} value Property value to serialize.
+* @return {(string | undefined)}
+*/
+Polymer_PropertyAccessors.prototype._serializeValue = function(value){};
+/**
+* @param {?string} value Attribute value to deserialize.
+* @param {*=} type Type to deserialize the string to.
+* @return {*}
+*/
+Polymer_PropertyAccessors.prototype._deserializeValue = function(value, type){};
+/**
+* @param {Object} props Bag of property values that were overwritten
+ when creating property accessors.
+* @return {void}
+*/
+Polymer_PropertyAccessors.prototype._initializeProtoProperties = function(props){};
+/**
+* @param {string} attribute Name of attribute to ensure is set.
+* @param {string} value of the attribute.
+* @return {void}
+*/
+Polymer_PropertyAccessors.prototype._ensureAttribute = function(attribute, value){};
+/**
+* @param {string} property Property name
+* @return {boolean}
+*/
+Polymer_PropertyAccessors.prototype._hasAccessor = function(property){};
+/**
+* @param {string} prop Property name
+* @return {boolean}
+*/
+Polymer_PropertyAccessors.prototype._isPropertyPending = function(prop){};
+/**
+* @param {string} property Property to convert
+* @return {string}
+*/
+Polymer_PropertyAccessors.attributeNameForProperty = function(property){};
+/**
+* @return {void}
+*/
+Polymer_PropertyAccessors.createPropertiesForAttributes = function(){};
+/**
+* @interface
+*/
+function Polymer_TemplateStamp(){}
+/**
+* @param {!HTMLTemplateElement} template Template to stamp
+* @return {!StampedTemplate}
+*/
+Polymer_TemplateStamp.prototype._stampTemplate = function(template){};
+/**
+* @param {!Node} node Node to add listener on
+* @param {string} eventName Name of event
+* @param {string} methodName Name of method
+* @param {*=} context Context the method will be called on (defaults
+ to `node`)
+* @return {Function}
+*/
+Polymer_TemplateStamp.prototype._addMethodEventListenerToNode = function(node, eventName, methodName, context){};
+/**
+* @param {!Node} node Node to add event listener to
+* @param {string} eventName Name of event
+* @param {function (!Event): void} handler Listener function to add
+* @return {void}
+*/
+Polymer_TemplateStamp.prototype._addEventListenerToNode = function(node, eventName, handler){};
+/**
+* @param {Node} node Node to remove event listener from
+* @param {string} eventName Name of event
+* @param {function (!Event): void} handler Listener function to remove
+* @return {void}
+*/
+Polymer_TemplateStamp.prototype._removeEventListenerFromNode = function(node, eventName, handler){};
+/**
+* @param {!HTMLTemplateElement} template Template to parse
+* @param {TemplateInfo=} outerTemplateInfo Template metadata from the outer
+ template, for parsing nested templates
+* @return {!TemplateInfo}
+*/
+Polymer_TemplateStamp._parseTemplate = function(template, outerTemplateInfo){};
+/**
+* @param {*} template
+* @param {*} templateInfo
+* @param {*} nodeInfo
+*/
+Polymer_TemplateStamp._parseTemplateContent = function(template, templateInfo, nodeInfo){};
+/**
+* @param {Node} node Node to parse
+* @param {!TemplateInfo} templateInfo Template metadata for current template
+* @param {!NodeInfo} nodeInfo Node metadata for current template.
+* @return {boolean}
+*/
+Polymer_TemplateStamp._parseTemplateNode = function(node, templateInfo, nodeInfo){};
+/**
+* @param {Node} root Root node whose `childNodes` will be parsed
+* @param {!TemplateInfo} templateInfo Template metadata for current template
+* @param {!NodeInfo} nodeInfo Node metadata for current template.
+* @return {void}
+*/
+Polymer_TemplateStamp._parseTemplateChildNodes = function(root, templateInfo, nodeInfo){};
+/**
+* @param {HTMLTemplateElement} node Node to parse (a <template>)
+* @param {TemplateInfo} outerTemplateInfo Template metadata for current template
+ that includes the template `node`
+* @param {!NodeInfo} nodeInfo Node metadata for current template.
+* @return {boolean}
+*/
+Polymer_TemplateStamp._parseTemplateNestedTemplate = function(node, outerTemplateInfo, nodeInfo){};
+/**
+* @param {Element} node Node to parse
+* @param {TemplateInfo} templateInfo Template metadata for current template
+* @param {NodeInfo} nodeInfo Node metadata for current template.
+* @return {boolean}
+*/
+Polymer_TemplateStamp._parseTemplateNodeAttributes = function(node, templateInfo, nodeInfo){};
+/**
+* @param {Element} node Node to parse
+* @param {!TemplateInfo} templateInfo Template metadata for current template
+* @param {!NodeInfo} nodeInfo Node metadata for current template.
+* @param {string} name Attribute name
+* @param {string} value Attribute value
+* @return {boolean}
+*/
+Polymer_TemplateStamp._parseTemplateNodeAttribute = function(node, templateInfo, nodeInfo, name, value){};
+/**
+* @param {HTMLTemplateElement} template Template to retrieve `content` for
+* @return {DocumentFragment}
+*/
+Polymer_TemplateStamp._contentForTemplate = function(template){};
+/**
+* @interface
+* @extends {Polymer_TemplateStamp}
+* @extends {Polymer_PropertyAccessors}
+*/
+function Polymer_PropertyEffects(){}
+/** @type {boolean} */
+Polymer_PropertyEffects.prototype.__dataClientsReady;
+
+/** @type {Array} */
+Polymer_PropertyEffects.prototype.__dataPendingClients;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__dataToNotify;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__dataLinkedPaths;
+
+/** @type {boolean} */
+Polymer_PropertyEffects.prototype.__dataHasPaths;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__dataCompoundStorage;
+
+/** @type {Polymer_PropertyEffects} */
+Polymer_PropertyEffects.prototype.__dataHost;
+
+/** @type {!Object} */
+Polymer_PropertyEffects.prototype.__dataTemp;
+
+/** @type {boolean} */
+Polymer_PropertyEffects.prototype.__dataClientsInitialized;
+
+/** @type {!Object} */
+Polymer_PropertyEffects.prototype.__data;
+
+/** @type {!Object} */
+Polymer_PropertyEffects.prototype.__dataPending;
+
+/** @type {!Object} */
+Polymer_PropertyEffects.prototype.__dataOld;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__computeEffects;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__reflectEffects;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__notifyEffects;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__propagateEffects;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__observeEffects;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__readOnly;
+
+/** @type {!TemplateInfo} */
+Polymer_PropertyEffects.prototype.__templateInfo;
+
+/**
+* @override
+* @param {!HTMLTemplateElement} template Template to stamp
+* @return {!StampedTemplate}
+*/
+Polymer_PropertyEffects.prototype._stampTemplate = function(template){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.ready = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._initializeProperties = function(){};
+/**
+* @override
+* @param {Object} props Properties to initialize on the instance
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._initializeInstanceProperties = function(props){};
+/**
+* @override
+* @param {string} property Name of the property
+* @param {*} value Value to set
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._setProperty = function(property, value){};
+/**
+* @override
+* @param {string} property Name of the property
+* @param {*} value Value to set
+* @param {boolean=} shouldNotify True if property should fire notification
+ event (applies only for `notify: true` properties)
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._setPendingProperty = function(property, value, shouldNotify){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._invalidateProperties = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._flushProperties = function(){};
+/**
+* @param {!Object} currentProps Bag of all current accessor values
+* @param {!Object} changedProps Bag of properties changed since the last
+ call to `_propertiesChanged`
+* @param {!Object} oldProps Bag of previous values for each property
+ in `changedProps`
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._propertiesChanged = function(currentProps, changedProps, oldProps){};
+/**
+* @override
+* @param {Object} props Properties to initialize on the prototype
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._initializeProtoProperties = function(props){};
+/**
+* @param {string} property Property that should trigger the effect
+* @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES
+* @param {Object=} effect Effect metadata object
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._addPropertyEffect = function(property, type, effect){};
+/**
+* @param {string} property Property the effect was associated with
+* @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES
+* @param {Object=} effect Effect metadata object to remove
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._removePropertyEffect = function(property, type, effect){};
+/**
+* @param {string} property Property name
+* @param {string=} type Effect type, from this.PROPERTY_EFFECT_TYPES
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._hasPropertyEffect = function(property, type){};
+/**
+* @param {string} property Property name
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._hasReadOnlyEffect = function(property){};
+/**
+* @param {string} property Property name
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._hasNotifyEffect = function(property){};
+/**
+* @param {string} property Property name
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._hasReflectEffect = function(property){};
+/**
+* @param {string} property Property name
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._hasComputedEffect = function(property){};
+/**
+* @param {(string | !Array.<(number | string)>)} path Path to set
+* @param {*} value Value to set
+* @param {boolean=} shouldNotify Set to true if this change should
+ cause a property notification event dispatch
+* @param {boolean=} isPathNotification If the path being set is a path
+ notification of an already changed value, as opposed to a request
+ to set and notify the change. In the latter `false` case, a dirty
+ check is performed and then the value is set to the path before
+ enqueuing the pending property change.
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._setPendingPropertyOrPath = function(path, value, shouldNotify, isPathNotification){};
+/**
+* @param {!Node} node The node to set a property on
+* @param {string} prop The property to set
+* @param {*} value The value to set
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._setUnmanagedPropertyToNode = function(node, prop, value){};
+/**
+* @param {Object} client PropertyEffects client to enqueue
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._enqueueClient = function(client){};
+/**
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._flushClients = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._readyClients = function(){};
+/**
+* @param {Object} props Bag of one or more key-value pairs whose key is
+ a property and value is the new value to set for that property.
+* @param {boolean=} setReadOnly When true, any private values set in
+ `props` will be set. By default, `setProperties` will not set
+ `readOnly: true` root properties.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.setProperties = function(props, setReadOnly){};
+/**
+* @param {Object} changedProps Bag of changed properties
+* @param {Object} oldProps Bag of previous values for changed properties
+* @param {boolean} hasPaths True with `props` contains one or more paths
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._propagatePropertyChanges = function(changedProps, oldProps, hasPaths){};
+/**
+* @param {(string | !Array.<(string | number)>)} to Target path to link.
+* @param {(string | !Array.<(string | number)>)} from Source path to link.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.linkPaths = function(to, from){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Target path to unlink.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.unlinkPaths = function(path){};
+/**
+* @param {string} path Path that should be notified.
+* @param {Array} splices Array of splice records indicating ordered
+ changes that occurred to the array. Each record should have the
+ following fields:
+ * index: index at which the change occurred
+ * removed: array of items that were removed from this index
+ * addedCount: number of new items added at this index
+ * object: a reference to the array in question
+ * type: the string literal 'splice'
+
+ Note that splice records _must_ be normalized such that they are
+ reported in index order (raw results from `Object.observe` are not
+ ordered and must be normalized/merged before notifying).
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.notifySplices = function(path, splices){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to the value
+ to read. The path may be specified as a string (e.g. `foo.bar.baz`)
+ or an array of path parts (e.g. `['foo.bar', 'baz']`). Note that
+ bracketed expressions are not supported; string-based path parts
+ *must* be separated by dots. Note that when dereferencing array
+ indices, the index may be used as a dotted part directly
+ (e.g. `users.12.name` or `['users', 12, 'name']`).
+* @param {Object=} root Root object from which the path is evaluated.
+* @return {*}
+*/
+Polymer_PropertyEffects.prototype.get = function(path, root){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to the value
+ to write. The path may be specified as a string (e.g. `'foo.bar.baz'`)
+ or an array of path parts (e.g. `['foo.bar', 'baz']`). Note that
+ bracketed expressions are not supported; string-based path parts
+ *must* be separated by dots. Note that when dereferencing array
+ indices, the index may be used as a dotted part directly
+ (e.g. `'users.12.name'` or `['users', 12, 'name']`).
+* @param {*} value Value to set at the specified path.
+* @param {Object=} root Root object from which the path is evaluated.
+ When specified, no notification will occur.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.set = function(path, value, root){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to array.
+* @param {...*} items Items to push onto array
+* @return {number}
+*/
+Polymer_PropertyEffects.prototype.push = function(path, items){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to array.
+* @return {*}
+*/
+Polymer_PropertyEffects.prototype.pop = function(path){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to array.
+* @param {number} start Index from which to start removing/inserting.
+* @param {number} deleteCount Number of items to remove.
+* @param {...*} items Items to insert into array.
+* @return {Array}
+*/
+Polymer_PropertyEffects.prototype.splice = function(path, start, deleteCount, items){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to array.
+* @return {*}
+*/
+Polymer_PropertyEffects.prototype.shift = function(path){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to array.
+* @param {...*} items Items to insert info array
+* @return {number}
+*/
+Polymer_PropertyEffects.prototype.unshift = function(path, items){};
+/**
+* @param {string} path Path that should be notified.
+* @param {*=} value Value at the path (optional).
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.notifyPath = function(path, value){};
+/**
+* @param {string} property Property name
+* @param {boolean=} protectedSetter Creates a custom protected setter
+ when `true`.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._createReadOnlyProperty = function(property, protectedSetter){};
+/**
+* @param {string} property Property name
+* @param {(string | function (*, *))} method Function or name of observer method to call
+* @param {boolean=} dynamicFn Whether the method name should be included as
+ a dependency to the effect.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._createPropertyObserver = function(property, method, dynamicFn){};
+/**
+* @param {string} expression Method expression
+* @param {(boolean | Object)=} dynamicFn Boolean or object map indicating
+ whether method names should be included as a dependency to the effect.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._createMethodObserver = function(expression, dynamicFn){};
+/**
+* @param {string} property Property name
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._createNotifyingProperty = function(property){};
+/**
+* @param {string} property Property name
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._createReflectedProperty = function(property){};
+/**
+* @param {string} property Name of computed property to set
+* @param {string} expression Method expression
+* @param {(boolean | Object)=} dynamicFn Boolean or object map indicating
+ whether method names should be included as a dependency to the effect.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._createComputedProperty = function(property, expression, dynamicFn){};
+/**
+* @param {!HTMLTemplateElement} template Template containing binding
+ bindings
+* @param {boolean=} instanceBinding When false (default), performs
+ "prototypical" binding of the template and overwrites any previously
+ bound template for the class. When true (as passed from
+ `_stampTemplate`), the template info is instanced and linked into
+ the list of bound templates.
+* @return {!TemplateInfo}
+*/
+Polymer_PropertyEffects.prototype._bindTemplate = function(template, instanceBinding){};
+/**
+* @param {!StampedTemplate} dom DocumentFragment previously returned
+ from `_stampTemplate` associated with the nodes to be removed
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._removeBoundDom = function(dom){};
+/**
+* @override
+* @param {Node} node Node to parse
+* @param {TemplateInfo} templateInfo Template metadata for current template
+* @param {NodeInfo} nodeInfo Node metadata for current template node
+* @return {boolean}
+*/
+Polymer_PropertyEffects._parseTemplateNode = function(node, templateInfo, nodeInfo){};
+/**
+* @override
+* @param {Node} node Node to parse
+* @param {TemplateInfo} templateInfo Template metadata for current template
+* @param {NodeInfo} nodeInfo Node metadata for current template node
+* @return {boolean}
+*/
+Polymer_PropertyEffects._parseTemplateNestedTemplate = function(node, templateInfo, nodeInfo){};
+/**
+* @override
+* @param {Element} node Node to parse
+* @param {TemplateInfo} templateInfo Template metadata for current template
+* @param {NodeInfo} nodeInfo Node metadata for current template node
+* @param {string} name Attribute name
+* @param {string} value Attribute value
+* @return {boolean}
+*/
+Polymer_PropertyEffects._parseTemplateNodeAttribute = function(node, templateInfo, nodeInfo, name, value){};
+/**
+* @param {string} property Property that should trigger the effect
+* @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES
+* @param {Object=} effect Effect metadata object
+* @return {void}
+*/
+Polymer_PropertyEffects.addPropertyEffect = function(property, type, effect){};
+/**
+* @param {string} property Property name
+* @param {(string | function (*, *))} method Function or name of observer method to call
+* @param {boolean=} dynamicFn Whether the method name should be included as
+ a dependency to the effect.
+* @return {void}
+*/
+Polymer_PropertyEffects.createPropertyObserver = function(property, method, dynamicFn){};
+/**
+* @param {string} expression Method expression
+* @param {(boolean | Object)=} dynamicFn Boolean or object map indicating
+* @return {void}
+*/
+Polymer_PropertyEffects.createMethodObserver = function(expression, dynamicFn){};
+/**
+* @param {string} property Property name
+* @return {void}
+*/
+Polymer_PropertyEffects.createNotifyingProperty = function(property){};
+/**
+* @param {string} property Property name
+* @param {boolean=} protectedSetter Creates a custom protected setter
+ when `true`.
+* @return {void}
+*/
+Polymer_PropertyEffects.createReadOnlyProperty = function(property, protectedSetter){};
+/**
+* @param {string} property Property name
+* @return {void}
+*/
+Polymer_PropertyEffects.createReflectedProperty = function(property){};
+/**
+* @param {string} property Name of computed property to set
+* @param {string} expression Method expression
+* @param {(boolean | Object)=} dynamicFn Boolean or object map indicating whether
+ method names should be included as a dependency to the effect.
+* @return {void}
+*/
+Polymer_PropertyEffects.createComputedProperty = function(property, expression, dynamicFn){};
+/**
+* @param {!HTMLTemplateElement} template Template containing binding
+ bindings
+* @return {!TemplateInfo}
+*/
+Polymer_PropertyEffects.bindTemplate = function(template){};
+/**
+* @param {Object} templateInfo Template metadata to add effect to
+* @param {string} prop Property that should trigger the effect
+* @param {Object=} effect Effect metadata object
+* @return {void}
+*/
+Polymer_PropertyEffects._addTemplatePropertyEffect = function(templateInfo, prop, effect){};
+/**
+* @param {string} text Text to parse from attribute or textContent
+* @param {Object} templateInfo Current template metadata
+* @return {Array.<!BindingPart>}
+*/
+Polymer_PropertyEffects._parseBindings = function(text, templateInfo){};
+/**
+* @param {this} inst Element that should be used as scope for
+ binding dependencies
+* @param {BindingPart} part Binding part metadata
+* @param {string} path Property/path that triggered this effect
+* @param {Object} props Bag of current property changes
+* @param {Object} oldProps Bag of previous values for changed properties
+* @param {boolean} hasPaths True with `props` contains one or more paths
+* @return {*}
+*/
+Polymer_PropertyEffects._evaluateBinding = function(inst, part, path, props, oldProps, hasPaths){};
+/**
+* @interface
+* @extends {Polymer_PropertiesChanged}
+*/
+function Polymer_PropertiesMixin(){}
+/**
+* @override
+* @return {void}
+*/
+Polymer_PropertiesMixin.prototype._initializeProperties = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesMixin.prototype.connectedCallback = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesMixin.prototype.disconnectedCallback = function(){};
+/**
+* @param {string} name Name of property
+* @return {*}
+*/
+Polymer_PropertiesMixin.typeForProperty = function(name){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesMixin.finalize = function(){};
+/**
+* @return {undefined}
+*/
+Polymer_PropertiesMixin._finalizeClass = function(){};
+/**
+* @interface
+* @extends {Polymer_PropertyEffects}
+* @extends {Polymer_PropertiesMixin}
+*/
+function Polymer_ElementMixin(){}
+/** @type {HTMLTemplateElement} */
+Polymer_ElementMixin.prototype._template;
+
+/** @type {string} */
+Polymer_ElementMixin.prototype._importPath;
+
+/** @type {string} */
+Polymer_ElementMixin.prototype.rootPath;
+
+/** @type {string} */
+Polymer_ElementMixin.prototype.importPath;
+
+/** @type {(StampedTemplate | HTMLElement | ShadowRoot)} */
+Polymer_ElementMixin.prototype.root;
+
+/** @type {!Object.<string, !Element>} */
+Polymer_ElementMixin.prototype.$;
+
+/**
+* @override
+* @return {void}
+*/
+Polymer_ElementMixin.prototype.ready = function(){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_ElementMixin.prototype._initializeProperties = function(){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_ElementMixin.prototype._readyClients = function(){};
+/**
+* @return {void}
+*/
+Polymer_ElementMixin.prototype.connectedCallback = function(){};
+/**
+* @param {StampedTemplate} dom to attach to the element.
+* @return {ShadowRoot}
+*/
+Polymer_ElementMixin.prototype._attachDom = function(dom){};
+/**
+* @param {Object=} properties Bag of custom property key/values to
+ apply to this element.
+* @return {void}
+*/
+Polymer_ElementMixin.prototype.updateStyles = function(properties){};
+/**
+* @param {string} url URL to resolve.
+* @param {string=} base Optional base URL to resolve against, defaults
+to the element's `importPath`
+* @return {string}
+*/
+Polymer_ElementMixin.prototype.resolveUrl = function(url, base){};
+/**
+* @override
+*/
+Polymer_ElementMixin._parseTemplateContent = function(template, templateInfo, nodeInfo){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_ElementMixin.createProperties = function(props){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_ElementMixin._finalizeClass = function(){};
+/**
+* @param {Object} observers Array of observer descriptors for
+ this class
+* @param {Object} dynamicFns Object containing keys for any properties
+ that are functions and should trigger the effect when the function
+ reference is changed
+* @return {void}
+*/
+Polymer_ElementMixin.createObservers = function(observers, dynamicFns){};
+/**
+* @param {string} cssText Text containing styling to process
+* @param {string} baseURI Base URI to rebase CSS paths against
+* @return {string}
+*/
+Polymer_ElementMixin._processStyleText = function(cssText, baseURI){};
+/**
+* @param {string} is Tag name (or type extension name) for this element
+* @return {void}
+*/
+Polymer_ElementMixin._finalizeTemplate = function(is){};
+/**
+* @interface
+*/
+function Polymer_GestureEventListeners(){}
+/**
+* @param {!Node} node Node to add event listener to
+* @param {string} eventName Name of event
+* @param {function (!Event): void} handler Listener function to add
+* @return {void}
+*/
+Polymer_GestureEventListeners.prototype._addEventListenerToNode = function(node, eventName, handler){};
+/**
+* @param {!Node} node Node to remove event listener from
+* @param {string} eventName Name of event
+* @param {function (!Event): void} handler Listener function to remove
+* @return {void}
+*/
+Polymer_GestureEventListeners.prototype._removeEventListenerFromNode = function(node, eventName, handler){};
+/**
+* @interface
+* @extends {Polymer_PropertyAccessors}
+*/
+function Polymer_DirMixin(){}
+/** @type {boolean} */
+Polymer_DirMixin.prototype.__autoDirOptOut;
+
+/**
+* @return {void}
+*/
+Polymer_DirMixin.prototype.ready = function(){};
+/**
+* @return {void}
+*/
+Polymer_DirMixin.prototype.connectedCallback = function(){};
+/**
+* @return {void}
+*/
+Polymer_DirMixin.prototype.disconnectedCallback = function(){};
+/**
+* @override
+*/
+Polymer_DirMixin._processStyleText = function(cssText, baseURI){};
+/**
+* @param {string} text CSS text to replace DIR
+* @return {string}
+*/
+Polymer_DirMixin._replaceDirInCssText = function(text){};
+/**
+* @interface
+* @extends {Polymer_ElementMixin}
+* @extends {Polymer_GestureEventListeners}
+*/
+function Polymer_LegacyElementMixin(){}
+/** @type {boolean} */
+Polymer_LegacyElementMixin.prototype.isAttached;
+
+/** @type {WeakMap.<!Element, !Object.<string, !Function>>} */
+Polymer_LegacyElementMixin.prototype.__boundListeners;
+
+/** @type {Object.<string, Function>} */
+Polymer_LegacyElementMixin.prototype._debouncers;
+
+/**
+* @override
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.ready = function(){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._initializeProperties = function(){};
+/**
+* @override
+* @param {string} name Name of attribute.
+* @param {?string} old Old value of attribute.
+* @param {?string} value Current value of attribute.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.attributeChangedCallback = function(name, old, value){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.connectedCallback = function(){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.disconnectedCallback = function(){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.created = function(){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.attached = function(){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.detached = function(){};
+/**
+* @param {string} name Name of attribute.
+* @param {?string} old Old value of attribute.
+* @param {?string} value Current value of attribute.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.attributeChanged = function(name, old, value){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._registered = function(){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._ensureAttributes = function(){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._applyListeners = function(){};
+/**
+* @param {*} value Value to deserialize
+* @return {(string | undefined)}
+*/
+Polymer_LegacyElementMixin.prototype.serialize = function(value){};
+/**
+* @param {string} value String to deserialize
+* @param {*} type Type to deserialize the string to
+* @return {*}
+*/
+Polymer_LegacyElementMixin.prototype.deserialize = function(value, type){};
+/**
+* @param {string} property Property name to reflect.
+* @param {string=} attribute Attribute name to reflect.
+* @param {*=} value Property value to reflect.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.reflectPropertyToAttribute = function(property, attribute, value){};
+/**
+* @param {*} value Value to serialize.
+* @param {string} attribute Attribute name to serialize to.
+* @param {Element} node Element to set attribute to.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.serializeValueToAttribute = function(value, attribute, node){};
+/**
+* @param {Object} prototype Target object to copy properties to.
+* @param {Object} api Source object to copy properties from.
+* @return {Object}
+*/
+Polymer_LegacyElementMixin.prototype.extend = function(prototype, api){};
+/**
+* @param {!Object} target Target object to copy properties to.
+* @param {!Object} source Source object to copy properties from.
+* @return {!Object}
+*/
+Polymer_LegacyElementMixin.prototype.mixin = function(target, source){};
+/**
+* @param {Object} object The object on which to set the prototype.
+* @param {Object} prototype The prototype that will be set on the given
+`object`.
+* @return {Object}
+*/
+Polymer_LegacyElementMixin.prototype.chainObject = function(object, prototype){};
+/**
+* @param {HTMLTemplateElement} template HTML template element to instance.
+* @return {!DocumentFragment}
+*/
+Polymer_LegacyElementMixin.prototype.instanceTemplate = function(template){};
+/**
+* @param {string} type Name of event type.
+* @param {*=} detail Detail value containing event-specific
+ payload.
+* @param {{bubbles: (boolean | undefined), cancelable: (boolean | undefined), composed: (boolean | undefined)}=} options Object specifying options. These may include:
+ `bubbles` (boolean, defaults to `true`),
+ `cancelable` (boolean, defaults to false), and
+ `node` on which to fire the event (HTMLElement, defaults to `this`).
+* @return {!Event}
+*/
+Polymer_LegacyElementMixin.prototype.fire = function(type, detail, options){};
+/**
+* @param {Element} node Element to add event listener to.
+* @param {string} eventName Name of event to listen for.
+* @param {string} methodName Name of handler method on `this` to call.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.listen = function(node, eventName, methodName){};
+/**
+* @param {Element} node Element to remove event listener from.
+* @param {string} eventName Name of event to stop listening to.
+* @param {string} methodName Name of handler method on `this` to not call
+ anymore.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.unlisten = function(node, eventName, methodName){};
+/**
+* @param {string=} direction Direction to allow scrolling
+Defaults to `all`.
+* @param {Element=} node Element to apply scroll direction setting.
+Defaults to `this`.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.setScrollDirection = function(direction, node){};
+/**
+* @param {string} slctr Selector to run on this local DOM scope
+* @return {Element}
+*/
+Polymer_LegacyElementMixin.prototype.$$ = function(slctr){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.distributeContent = function(){};
+/**
+* @return {!Array.<!Node>}
+*/
+Polymer_LegacyElementMixin.prototype.getEffectiveChildNodes = function(){};
+/**
+* @param {string} selector Selector to run.
+* @return {!Array.<!Node>}
+*/
+Polymer_LegacyElementMixin.prototype.queryDistributedElements = function(selector){};
+/**
+* @return {!Array.<!Node>}
+*/
+Polymer_LegacyElementMixin.prototype.getEffectiveChildren = function(){};
+/**
+* @return {string}
+*/
+Polymer_LegacyElementMixin.prototype.getEffectiveTextContent = function(){};
+/**
+* @param {string} selector Selector to run.
+* @return {Node}
+*/
+Polymer_LegacyElementMixin.prototype.queryEffectiveChildren = function(selector){};
+/**
+* @param {string} selector Selector to run.
+* @return {!Array.<!Node>}
+*/
+Polymer_LegacyElementMixin.prototype.queryAllEffectiveChildren = function(selector){};
+/**
+* @param {string=} slctr CSS selector to choose the desired
+ `<slot>`. Defaults to `content`.
+* @return {!Array.<!Node>}
+*/
+Polymer_LegacyElementMixin.prototype.getContentChildNodes = function(slctr){};
+/**
+* @param {string=} slctr CSS selector to choose the desired
+ `<content>`. Defaults to `content`.
+* @return {!Array.<!HTMLElement>}
+*/
+Polymer_LegacyElementMixin.prototype.getContentChildren = function(slctr){};
+/**
+* @param {?Node} node The element to be checked.
+* @return {boolean}
+*/
+Polymer_LegacyElementMixin.prototype.isLightDescendant = function(node){};
+/**
+* @param {!Element} node The element to be checked.
+* @return {boolean}
+*/
+Polymer_LegacyElementMixin.prototype.isLocalDescendant = function(node){};
+/**
+* @param {*} container Unused
+* @param {*} shouldObserve Unused
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.scopeSubtree = function(container, shouldObserve){};
+/**
+* @param {string} property The css property name.
+* @return {string}
+*/
+Polymer_LegacyElementMixin.prototype.getComputedStyleValue = function(property){};
+/**
+* @param {string} jobName String to identify the debounce job.
+* @param {function (): void} callback Function that is called (with `this`
+ context) when the wait time elapses.
+* @param {number} wait Optional wait time in milliseconds (ms) after the
+ last signal that must elapse before invoking `callback`
+* @return {!Object}
+*/
+Polymer_LegacyElementMixin.prototype.debounce = function(jobName, callback, wait){};
+/**
+* @param {string} jobName The name of the debouncer started with `debounce`
+* @return {boolean}
+*/
+Polymer_LegacyElementMixin.prototype.isDebouncerActive = function(jobName){};
+/**
+* @param {string} jobName The name of the debouncer started with `debounce`
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.flushDebouncer = function(jobName){};
+/**
+* @param {string} jobName The name of the debouncer started with `debounce`
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.cancelDebouncer = function(jobName){};
+/**
+* @param {!Function} callback The callback function to run, bound to `this`.
+* @param {number=} waitTime Time to wait before calling the
+ `callback`. If unspecified or 0, the callback will be run at microtask
+ timing (before paint).
+* @return {number}
+*/
+Polymer_LegacyElementMixin.prototype.async = function(callback, waitTime){};
+/**
+* @param {number} handle Handle returned from original `async` call to
+ cancel.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.cancelAsync = function(handle){};
+/**
+* @param {string} tag HTML element tag to create.
+* @param {Object=} props Object of properties to configure on the
+ instance.
+* @return {!Element}
+*/
+Polymer_LegacyElementMixin.prototype.create = function(tag, props){};
+/**
+* @param {string} href URL to document to load.
+* @param {?function (!Event): void=} onload Callback to notify when an import successfully
+ loaded.
+* @param {?function (!ErrorEvent): void=} onerror Callback to notify when an import
+ unsuccessfully loaded.
+* @param {boolean=} optAsync True if the import should be loaded `async`.
+ Defaults to `false`.
+* @return {!HTMLLinkElement}
+*/
+Polymer_LegacyElementMixin.prototype.importHref = function(href, onload, onerror, optAsync){};
+/**
+* @param {string} selector Selector to test.
+* @param {!Element=} node Element to test the selector against.
+* @return {boolean}
+*/
+Polymer_LegacyElementMixin.prototype.elementMatches = function(selector, node){};
+/**
+* @param {string} name HTML attribute name
+* @param {boolean=} bool Boolean to force the attribute on or off.
+ When unspecified, the state of the attribute will be reversed.
+* @param {Element=} node Node to target. Defaults to `this`.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.toggleAttribute = function(name, bool, node){};
+/**
+* @param {string} name CSS class name
+* @param {boolean=} bool Boolean to force the class on or off.
+ When unspecified, the state of the class will be reversed.
+* @param {Element=} node Node to target. Defaults to `this`.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.toggleClass = function(name, bool, node){};
+/**
+* @param {string} transformText Transform setting.
+* @param {Element=} node Element to apply the transform to.
+Defaults to `this`
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.transform = function(transformText, node){};
+/**
+* @param {number} x X offset.
+* @param {number} y Y offset.
+* @param {number} z Z offset.
+* @param {Element=} node Element to apply the transform to.
+Defaults to `this`.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.translate3d = function(x, y, z, node){};
+/**
+* @param {(string | !Array.<(number | string)>)} arrayOrPath Path to array from which to remove the item
+ (or the array itself).
+* @param {*} item Item to remove.
+* @return {Array}
+*/
+Polymer_LegacyElementMixin.prototype.arrayDelete = function(arrayOrPath, item){};
+/**
+* @param {string} level One of 'log', 'warn', 'error'
+* @param {Array} args Array of strings or objects to log
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._logger = function(level, args){};
+/**
+* @param {...*} args Array of strings or objects to log
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._log = function(args){};
+/**
+* @param {...*} args Array of strings or objects to log
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._warn = function(args){};
+/**
+* @param {...*} args Array of strings or objects to log
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._error = function(args){};
+/**
+* @param {string} methodName Method name to associate with message
+* @param {...*} args Array of strings or objects to log
+* @return {Array}
+*/
+Polymer_LegacyElementMixin.prototype._logf = function(methodName, args){};
+/**
+* @interface
+*/
+function Polymer_MutableData(){}
+/**
+* @param {string} property Property name
+* @param {*} value New property value
+* @param {*} old Previous property value
+* @return {boolean}
+*/
+Polymer_MutableData.prototype._shouldPropertyChange = function(property, value, old){};
+/**
+* @interface
+*/
+function Polymer_OptionalMutableData(){}
+/** @type {boolean} */
+Polymer_OptionalMutableData.prototype.mutableData;
+
+/**
+* @param {string} property Property name
+* @param {*} value New property value
+* @param {*} old Previous property value
+* @return {boolean}
+*/
+Polymer_OptionalMutableData.prototype._shouldPropertyChange = function(property, value, old){};
+/**
+* @interface
+* @extends {Polymer_ElementMixin}
+*/
+function Polymer_ArraySelectorMixin(){}
+/** @type {Array} */
+Polymer_ArraySelectorMixin.prototype.items;
+
+/** @type {boolean} */
+Polymer_ArraySelectorMixin.prototype.multi;
+
+/** @type {?(Object | Array.<!Object>)} */
+Polymer_ArraySelectorMixin.prototype.selected;
+
+/** @type {?Object} */
+Polymer_ArraySelectorMixin.prototype.selectedItem;
+
+/** @type {boolean} */
+Polymer_ArraySelectorMixin.prototype.toggle;
+
+/**
+* @return {void}
+*/
+Polymer_ArraySelectorMixin.prototype.clearSelection = function(){};
+/**
+* @param {*} item Item from `items` array to test
+* @return {boolean}
+*/
+Polymer_ArraySelectorMixin.prototype.isSelected = function(item){};
+/**
+* @param {number} idx Index from `items` array to test
+* @return {boolean}
+*/
+Polymer_ArraySelectorMixin.prototype.isIndexSelected = function(idx){};
+/**
+* @param {*} item Item from `items` array to deselect
+* @return {void}
+*/
+Polymer_ArraySelectorMixin.prototype.deselect = function(item){};
+/**
+* @param {number} idx Index from `items` array to deselect
+* @return {void}
+*/
+Polymer_ArraySelectorMixin.prototype.deselectIndex = function(idx){};
+/**
+* @param {*} item Item from `items` array to select
+* @return {void}
+*/
+Polymer_ArraySelectorMixin.prototype.select = function(item){};
+/**
+* @param {number} idx Index from `items` array to select
+* @return {void}
+*/
+Polymer_ArraySelectorMixin.prototype.selectIndex = function(idx){};
+/**
+* @interface
+* @extends {Polymer_ElementMixin}
+*/
+function Polymer_DisableUpgradeMixin(){}
+/**
+* @override
+*/
+Polymer_DisableUpgradeMixin.prototype._initializeProperties = function(){};
+/**
+* @override
+*/
+Polymer_DisableUpgradeMixin.prototype._enableProperties = function(){};
+/**
+* @override
+*/
+Polymer_DisableUpgradeMixin.prototype.attributeChangedCallback = function(name, old, value){};
+/**
+* @override
+*/
+Polymer_DisableUpgradeMixin.prototype.connectedCallback = function(){};
+/**
+* @override
+*/
+Polymer_DisableUpgradeMixin.prototype.disconnectedCallback = function(){}; \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/externs/polymer-externs.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/externs/polymer-externs.js
new file mode 100644
index 00000000000..0a86620b691
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/externs/polymer-externs.js
@@ -0,0 +1,112 @@
+/**
+ * @fileoverview Externs for Polymer Pass and external Polymer API
+ * @externs
+ *
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+/* eslint-disable */
+
+/**
+ * @typedef {{
+ * type: !Function,
+ * value: *,
+ * readOnly: (boolean | undefined),
+ * computed: (string | undefined),
+ * reflectToAttribute: (boolean | undefined),
+ * notify: (boolean | undefined),
+ * observer: (string | function(*,*) | undefined)
+ * }}
+ */
+let PolymerElementPropertiesMeta;
+
+/**
+ * @typedef {Object<string, !PolymerElementPropertiesMeta>}
+ */
+let PolymerElementProperties;
+
+let PolymerInit = function(){};
+/** @type {string} */
+PolymerInit.prototype.is;
+/** @type {(string | undefined)} */
+PolymerInit.prototype.extends;
+/** @type {(!PolymerElementProperties | undefined)} */
+PolymerInit.prototype.properties;
+/** @type {(!Array<string> | undefined)} */
+PolymerInit.prototype.observers;
+/** @type {(!HTMLTemplateElement | string | undefined)} */
+PolymerInit.prototype.template;
+/** @type {(!Object<string, *> | undefined)} */
+PolymerInit.prototype.hostAttributes;
+/** @type {(!Object<string, string> | undefined)} */
+PolymerInit.prototype.listeners;
+
+let PolymerElementConstructor = function (){};
+/** @type {(string | undefined)} */
+PolymerElementConstructor.is;
+/** @type {(string | undefined)} */
+PolymerElementConstructor.extends;
+/** @type {(!PolymerElementProperties | undefined)} */
+PolymerElementConstructor.properties;
+/** @type {(!Array<string> | undefined)} */
+PolymerElementConstructor.observers;
+/** @type {(!HTMLTemplateElement | string | undefined)} */
+PolymerElementConstructor.template;
+
+let PropertiesMixinConstructor = function (){};
+/** @type {(!PolymerElementProperties | undefined)} */
+PropertiesMixinConstructor.properties;
+
+/**
+ * @param {!PolymerInit} init
+ * @return {!function(new:HTMLElement)}
+ */
+function Polymer(init){}
+
+/** @type {PolymerElementProperties} */
+Polymer.ElementProperties;
+
+/**
+ * @type {(function(*,string,string,Node):*)|undefined}
+ */
+Polymer.sanitizeDOMValue;
+
+/**
+ * @param {string} string
+ * @param {Object} obj
+ * @return {string}
+ */
+function JSCompiler_renameProperty(string, obj) {}
+
+/** @record */
+function PolymerTelemetry(){}
+/** @type {number} */
+PolymerTelemetry.instanceCount;
+/** @type {Array<HTMLElement>} */
+PolymerTelemetry.registrations;
+/** @type {function(HTMLElement)} */
+PolymerTelemetry._regLog;
+/** @type {function(HTMLElement)} */
+PolymerTelemetry.register;
+/** @type {function(HTMLElement)} */
+PolymerTelemetry.dumpRegistrations;;
+
+/** @type {PolymerTelemetry} */
+Polymer.telemetry;
+
+/** @type {string} */
+Polymer.version;
+
+// nb. This is explicitly 'var', as Closure Compiler checks that this is the case.
+/**
+ * @constructor
+ * @extends {HTMLElement}
+ * @implements {Polymer_LegacyElementMixin}
+ */
+var PolymerElement = Polymer.LegacyElementMixin();
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/externs/polymer-internal-shared-types.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/externs/polymer-internal-shared-types.js
new file mode 100644
index 00000000000..274f60351d1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/externs/polymer-internal-shared-types.js
@@ -0,0 +1,165 @@
+/**
+ * @fileoverview Internal shared types for Polymer
+ *
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+/* eslint-disable no-unused-vars, strict, valid-jsdoc */
+
+/**
+ * @constructor
+ * @extends {DocumentFragment}
+ */
+function StampedTemplate() { }
+/** @type {boolean} */
+StampedTemplate.prototype.__noInsertionPoint;
+/** @type {!Array<!Node>} */
+StampedTemplate.prototype.nodeList;
+/** @type {!Object<string, !Element>} */
+StampedTemplate.prototype.$;
+/** @type {!TemplateInfo | undefined} */
+StampedTemplate.prototype.templateInfo;
+
+/** @interface */
+function NodeInfo() { }
+/** @type {string} */
+NodeInfo.prototype.id;
+/** @type {!Array<{name: string, value: string}>}*/
+NodeInfo.prototype.events;
+/** @type {boolean} */
+NodeInfo.prototype.hasInsertionPoint;
+/** @type {!TemplateInfo} */
+NodeInfo.prototype.templateInfo;
+/** @type {!NodeInfo} */
+NodeInfo.prototype.parentInfo;
+/** @type {number} */
+NodeInfo.prototype.parentIndex;
+/** @type {number} */
+NodeInfo.prototype.infoIndex;
+/** @type {!Array<!Binding>} */
+NodeInfo.prototype.bindings;
+
+/** @interface */
+function TemplateInfo() { }
+/** @type {!Array<!NodeInfo>} */
+TemplateInfo.prototype.nodeInfoList;
+/** @type {!Array<!Node>} */
+TemplateInfo.prototype.nodeList;
+/** @type {boolean} */
+TemplateInfo.prototype.stripWhitespace;
+/** @type {boolean | undefined} */
+TemplateInfo.prototype.hasInsertionPoint;
+/** @type {!Object} */
+TemplateInfo.prototype.hostProps;
+/** @type {!Object} */
+TemplateInfo.prototype.propertyEffects;
+/** @type {TemplateInfo | undefined} */
+TemplateInfo.prototype.nextTemplateInfo;
+/** @type {TemplateInfo | undefined} */
+TemplateInfo.prototype.previousTemplateInfo;
+/** @type {!Array<!Node>} */
+TemplateInfo.prototype.childNodes;
+/** @type {boolean} */
+TemplateInfo.prototype.wasPreBound;
+
+/**
+ * type for HTMLTemplateElement with `_templateInfo`
+ *
+ * @constructor
+ * @extends {HTMLTemplateElement}
+ */
+function HTMLTemplateElementWithInfo() { }
+/** @type {TemplateInfo} */
+HTMLTemplateElementWithInfo.prototype._templateInfo;
+
+/**
+ * @typedef {{
+ * literal: string,
+ * compoundIndex: (number | undefined)
+ * }}
+ */
+let LiteralBindingPart;
+
+/**
+ * @typedef {{
+ * literal: boolean,
+ * name: string,
+ * value: (string | number),
+ * rootProperty: (string | undefined),
+ * structured: (boolean | undefined),
+ * wildcard: (boolean | undefined)
+ * }}
+ */
+let MethodArg;
+
+/**
+ * @typedef {{
+ * methodName: string,
+ * static: boolean,
+ * args: !Array<!MethodArg>,
+ * dynamicFn: (boolean | undefined),
+ * }}
+ */
+let MethodSignature;
+
+/**
+ * @typedef {{
+ * mode: string,
+ * negate: boolean,
+ * source: string,
+ * dependencies: !Array<(!MethodArg|string)>,
+ * customEvent: boolean,
+ * signature: Object,
+ * event: string
+ * }}
+ */
+let ExpressionBindingPart;
+
+/**
+ * @typedef {LiteralBindingPart | ExpressionBindingPart}
+ */
+let BindingPart;
+
+/**
+ * @typedef {{
+ * kind: string,
+ * target: string,
+ * parts: Array<!BindingPart>,
+ * literal: (string | undefined),
+ * isCompound: boolean,
+ * listenerEvent: (string | undefined),
+ * listenerNegate: (boolean | undefined)
+ * }}
+ */
+let Binding;
+
+/**
+ * @typedef {{
+ * path: string
+ * }}
+ */
+let PathInfo;
+
+/**
+ * @typedef {{
+ * forwardHostProp: (function(string, *) | undefined),
+ * instanceProps: (Object | undefined),
+ * mutableData: (boolean | undefined),
+ * notifyInstanceProp: (function(*, string, *) | undefined),
+ * parentModel: (boolean | undefined)
+ * }}
+ */
+let TemplatizeOptions;
+
+/** @record */
+function AsyncInterface(){}
+/** @type {function(!Function, number=): number} */
+AsyncInterface.prototype.run;
+/** @type {function(number): void} */
+AsyncInterface.prototype.cancel;
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/externs/polymer-internal-types.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/externs/polymer-internal-types.html
new file mode 100644
index 00000000000..bc7abad6366
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/externs/polymer-internal-types.html
@@ -0,0 +1,11 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<!-- internal shared types for closure pass -->
+<script src="polymer-internal-shared-types.js"></script> \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/externs/webcomponents-externs.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/externs/webcomponents-externs.js
new file mode 100644
index 00000000000..8bcf4cede57
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/externs/webcomponents-externs.js
@@ -0,0 +1,64 @@
+/**
+ * @fileoverview Externs for webcomponents polyfills
+ * @externs
+ *
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+/* eslint-disable */
+
+let HTMLImports = {
+ /**
+ * @param {function()} callback
+ */
+ whenReady(callback){},
+ /**
+ * @param {Element} element
+ * @returns {Document} document
+ */
+ importForElement(element){}
+};
+
+window.HTMLImports = HTMLImports;
+
+let ShadyDOM = {
+ inUse: false,
+ flush(){},
+ /**
+ * @param {!Node} target
+ * @param {function(Array<MutationRecord>, MutationObserver)} callback
+ * @return {MutationObserver}
+ */
+ observeChildren(target, callback){},
+ /**
+ * @param {MutationObserver} observer
+ */
+ unobserveChildren(observer){},
+ /**
+ * @param {Node} node
+ */
+ patch(node){}
+};
+
+window.ShadyDOM = ShadyDOM;
+
+let WebComponents = {};
+window.WebComponents = WebComponents;
+
+/** @type {Element} */
+HTMLElement.prototype._activeElement;
+
+/**
+ * @param {HTMLTemplateElement} template
+ */
+HTMLTemplateElement.decorate = function(template){};
+
+/**
+ * @param {function(function())} cb callback
+ */
+CustomElementRegistry.prototype.polyfillWrapFlushCallback = function(cb){};
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/gen-tsd.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/gen-tsd.json
new file mode 100644
index 00000000000..3d3a5e71348
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/gen-tsd.json
@@ -0,0 +1,23 @@
+{
+ "excludeFiles": [
+ "dist/**",
+ "externs/**",
+ "gulpfile.js",
+ "test/**",
+ "util/**",
+ "index.html"
+ ],
+ "removeReferences": [
+ "../shadycss/apply-shim.d.ts",
+ "../shadycss/custom-style-interface.d.ts"
+ ],
+ "addReferences": {
+ "lib/utils/boot.d.ts": [
+ "extra-types.d.ts"
+ ]
+ },
+ "renameTypes": {
+ "Polymer_PropertyEffects": "Polymer.PropertyEffects",
+ "Element": "_Element"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/img/migration.png b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/img/migration.png
new file mode 100644
index 00000000000..b410b1c266b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/img/migration.png
Binary files differ
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/index.html
new file mode 100644
index 00000000000..fc969123587
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/index.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<!--
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/array-selector.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/array-selector.html
new file mode 100644
index 00000000000..436983a0163
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/array-selector.html
@@ -0,0 +1,440 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer-element.html">
+<link rel="import" href="../utils/mixin.html">
+<link rel="import" href="../utils/array-splice.html">
+
+<script>
+(function() {
+ 'use strict';
+
+ /**
+ * Element mixin for recording dynamic associations between item paths in a
+ * master `items` array and a `selected` array such that path changes to the
+ * master array (at the host) element or elsewhere via data-binding) are
+ * correctly propagated to items in the selected array and vice-versa.
+ *
+ * The `items` property accepts an array of user data, and via the
+ * `select(item)` and `deselect(item)` API, updates the `selected` property
+ * which may be bound to other parts of the application, and any changes to
+ * sub-fields of `selected` item(s) will be kept in sync with items in the
+ * `items` array. When `multi` is false, `selected` is a property
+ * representing the last selected item. When `multi` is true, `selected`
+ * is an array of multiply selected items.
+ *
+ * @polymer
+ * @mixinFunction
+ * @appliesMixin Polymer.ElementMixin
+ * @memberof Polymer
+ * @summary Element mixin for recording dynamic associations between item paths in a
+ * master `items` array and a `selected` array
+ */
+ let ArraySelectorMixin = Polymer.dedupingMixin(superClass => {
+
+ /**
+ * @constructor
+ * @extends {superClass}
+ * @implements {Polymer_ElementMixin}
+ */
+ let elementBase = Polymer.ElementMixin(superClass);
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_ArraySelectorMixin}
+ * @unrestricted
+ */
+ class ArraySelectorMixin extends elementBase {
+
+ static get properties() {
+
+ return {
+
+ /**
+ * An array containing items from which selection will be made.
+ */
+ items: {
+ type: Array,
+ },
+
+ /**
+ * When `true`, multiple items may be selected at once (in this case,
+ * `selected` is an array of currently selected items). When `false`,
+ * only one item may be selected at a time.
+ */
+ multi: {
+ type: Boolean,
+ value: false,
+ },
+
+ /**
+ * When `multi` is true, this is an array that contains any selected.
+ * When `multi` is false, this is the currently selected item, or `null`
+ * if no item is selected.
+ * @type {?(Object|Array<!Object>)}
+ */
+ selected: {
+ type: Object,
+ notify: true
+ },
+
+ /**
+ * When `multi` is false, this is the currently selected item, or `null`
+ * if no item is selected.
+ * @type {?Object}
+ */
+ selectedItem: {
+ type: Object,
+ notify: true
+ },
+
+ /**
+ * When `true`, calling `select` on an item that is already selected
+ * will deselect the item.
+ */
+ toggle: {
+ type: Boolean,
+ value: false
+ }
+
+ };
+ }
+
+ static get observers() {
+ return ['__updateSelection(multi, items.*)'];
+ }
+
+ constructor() {
+ super();
+ this.__lastItems = null;
+ this.__lastMulti = null;
+ this.__selectedMap = null;
+ }
+
+ __updateSelection(multi, itemsInfo) {
+ let path = itemsInfo.path;
+ if (path == 'items') {
+ // Case 1 - items array changed, so diff against previous array and
+ // deselect any removed items and adjust selected indices
+ let newItems = itemsInfo.base || [];
+ let lastItems = this.__lastItems;
+ let lastMulti = this.__lastMulti;
+ if (multi !== lastMulti) {
+ this.clearSelection();
+ }
+ if (lastItems) {
+ let splices = Polymer.ArraySplice.calculateSplices(newItems, lastItems);
+ this.__applySplices(splices);
+ }
+ this.__lastItems = newItems;
+ this.__lastMulti = multi;
+ } else if (itemsInfo.path == 'items.splices') {
+ // Case 2 - got specific splice information describing the array mutation:
+ // deselect any removed items and adjust selected indices
+ this.__applySplices(itemsInfo.value.indexSplices);
+ } else {
+ // Case 3 - an array element was changed, so deselect the previous
+ // item for that index if it was previously selected
+ let part = path.slice('items.'.length);
+ let idx = parseInt(part, 10);
+ if ((part.indexOf('.') < 0) && part == idx) {
+ this.__deselectChangedIdx(idx);
+ }
+ }
+ }
+
+ __applySplices(splices) {
+ let selected = this.__selectedMap;
+ // Adjust selected indices and mark removals
+ for (let i=0; i<splices.length; i++) {
+ let s = splices[i];
+ selected.forEach((idx, item) => {
+ if (idx < s.index) {
+ // no change
+ } else if (idx >= s.index + s.removed.length) {
+ // adjust index
+ selected.set(item, idx + s.addedCount - s.removed.length);
+ } else {
+ // remove index
+ selected.set(item, -1);
+ }
+ });
+ for (let j=0; j<s.addedCount; j++) {
+ let idx = s.index + j;
+ if (selected.has(this.items[idx])) {
+ selected.set(this.items[idx], idx);
+ }
+ }
+ }
+ // Update linked paths
+ this.__updateLinks();
+ // Remove selected items that were removed from the items array
+ let sidx = 0;
+ selected.forEach((idx, item) => {
+ if (idx < 0) {
+ if (this.multi) {
+ this.splice('selected', sidx, 1);
+ } else {
+ this.selected = this.selectedItem = null;
+ }
+ selected.delete(item);
+ } else {
+ sidx++;
+ }
+ });
+ }
+
+ __updateLinks() {
+ this.__dataLinkedPaths = {};
+ if (this.multi) {
+ let sidx = 0;
+ this.__selectedMap.forEach(idx => {
+ if (idx >= 0) {
+ this.linkPaths('items.' + idx, 'selected.' + sidx++);
+ }
+ });
+ } else {
+ this.__selectedMap.forEach(idx => {
+ this.linkPaths('selected', 'items.' + idx);
+ this.linkPaths('selectedItem', 'items.' + idx);
+ });
+ }
+ }
+
+ /**
+ * Clears the selection state.
+ * @return {void}
+ */
+ clearSelection() {
+ // Unbind previous selection
+ this.__dataLinkedPaths = {};
+ // The selected map stores 3 pieces of information:
+ // key: items array object
+ // value: items array index
+ // order: selected array index
+ this.__selectedMap = new Map();
+ // Initialize selection
+ this.selected = this.multi ? [] : null;
+ this.selectedItem = null;
+ }
+
+ /**
+ * Returns whether the item is currently selected.
+ *
+ * @param {*} item Item from `items` array to test
+ * @return {boolean} Whether the item is selected
+ */
+ isSelected(item) {
+ return this.__selectedMap.has(item);
+ }
+
+ /**
+ * Returns whether the item is currently selected.
+ *
+ * @param {number} idx Index from `items` array to test
+ * @return {boolean} Whether the item is selected
+ */
+ isIndexSelected(idx) {
+ return this.isSelected(this.items[idx]);
+ }
+
+ __deselectChangedIdx(idx) {
+ let sidx = this.__selectedIndexForItemIndex(idx);
+ if (sidx >= 0) {
+ let i = 0;
+ this.__selectedMap.forEach((idx, item) => {
+ if (sidx == i++) {
+ this.deselect(item);
+ }
+ });
+ }
+ }
+
+ __selectedIndexForItemIndex(idx) {
+ let selected = this.__dataLinkedPaths['items.' + idx];
+ if (selected) {
+ return parseInt(selected.slice('selected.'.length), 10);
+ }
+ }
+
+ /**
+ * Deselects the given item if it is already selected.
+ *
+ * @param {*} item Item from `items` array to deselect
+ * @return {void}
+ */
+ deselect(item) {
+ let idx = this.__selectedMap.get(item);
+ if (idx >= 0) {
+ this.__selectedMap.delete(item);
+ let sidx;
+ if (this.multi) {
+ sidx = this.__selectedIndexForItemIndex(idx);
+ }
+ this.__updateLinks();
+ if (this.multi) {
+ this.splice('selected', sidx, 1);
+ } else {
+ this.selected = this.selectedItem = null;
+ }
+ }
+ }
+
+ /**
+ * Deselects the given index if it is already selected.
+ *
+ * @param {number} idx Index from `items` array to deselect
+ * @return {void}
+ */
+ deselectIndex(idx) {
+ this.deselect(this.items[idx]);
+ }
+
+ /**
+ * Selects the given item. When `toggle` is true, this will automatically
+ * deselect the item if already selected.
+ *
+ * @param {*} item Item from `items` array to select
+ * @return {void}
+ */
+ select(item) {
+ this.selectIndex(this.items.indexOf(item));
+ }
+
+ /**
+ * Selects the given index. When `toggle` is true, this will automatically
+ * deselect the item if already selected.
+ *
+ * @param {number} idx Index from `items` array to select
+ * @return {void}
+ */
+ selectIndex(idx) {
+ let item = this.items[idx];
+ if (!this.isSelected(item)) {
+ if (!this.multi) {
+ this.__selectedMap.clear();
+ }
+ this.__selectedMap.set(item, idx);
+ this.__updateLinks();
+ if (this.multi) {
+ this.push('selected', item);
+ } else {
+ this.selected = this.selectedItem = item;
+ }
+ } else if (this.toggle) {
+ this.deselectIndex(idx);
+ }
+ }
+
+ }
+
+ return ArraySelectorMixin;
+
+ });
+
+ // export mixin
+ Polymer.ArraySelectorMixin = ArraySelectorMixin;
+
+ /**
+ * @constructor
+ * @extends {Polymer.Element}
+ * @implements {Polymer_ArraySelectorMixin}
+ */
+ let baseArraySelector = ArraySelectorMixin(Polymer.Element);
+
+ /**
+ * Element implementing the `Polymer.ArraySelector` mixin, which records
+ * dynamic associations between item paths in a master `items` array and a
+ * `selected` array such that path changes to the master array (at the host)
+ * element or elsewhere via data-binding) are correctly propagated to items
+ * in the selected array and vice-versa.
+ *
+ * The `items` property accepts an array of user data, and via the
+ * `select(item)` and `deselect(item)` API, updates the `selected` property
+ * which may be bound to other parts of the application, and any changes to
+ * sub-fields of `selected` item(s) will be kept in sync with items in the
+ * `items` array. When `multi` is false, `selected` is a property
+ * representing the last selected item. When `multi` is true, `selected`
+ * is an array of multiply selected items.
+ *
+ * Example:
+ *
+ * ```html
+ * <dom-module id="employee-list">
+ *
+ * <template>
+ *
+ * <div> Employee list: </div>
+ * <dom-repeat id="employeeList" items="{{employees}}">
+ * <template>
+ * <div>First name: <span>{{item.first}}</span></div>
+ * <div>Last name: <span>{{item.last}}</span></div>
+ * <button on-click="toggleSelection">Select</button>
+ * </template>
+ * </dom-repeat>
+ *
+ * <array-selector id="selector" items="{{employees}}" selected="{{selected}}" multi toggle></array-selector>
+ *
+ * <div> Selected employees: </div>
+ * <dom-repeat items="{{selected}}">
+ * <template>
+ * <div>First name: <span>{{item.first}}</span></div>
+ * <div>Last name: <span>{{item.last}}</span></div>
+ * </template>
+ * </dom-repeat>
+ *
+ * </template>
+ *
+ * </dom-module>
+ * ```
+ *
+ * ```js
+ *class EmployeeList extends Polymer.Element {
+ * static get is() { return 'employee-list'; }
+ * static get properties() {
+ * return {
+ * employees: {
+ * value() {
+ * return [
+ * {first: 'Bob', last: 'Smith'},
+ * {first: 'Sally', last: 'Johnson'},
+ * ...
+ * ];
+ * }
+ * }
+ * };
+ * }
+ * toggleSelection(e) {
+ * let item = this.$.employeeList.itemForElement(e.target);
+ * this.$.selector.select(item);
+ * }
+ *}
+ * ```
+ *
+ * @polymer
+ * @customElement
+ * @extends {baseArraySelector}
+ * @appliesMixin Polymer.ArraySelectorMixin
+ * @memberof Polymer
+ * @summary Custom element that links paths between an input `items` array and
+ * an output `selected` item or array based on calls to its selection API.
+ */
+ class ArraySelector extends baseArraySelector {
+ // Not needed to find template; can be removed once the analyzer
+ // can find the tag name from customElements.define call
+ static get is() { return 'array-selector'; }
+ }
+ customElements.define(ArraySelector.is, ArraySelector);
+ Polymer.ArraySelector = ArraySelector;
+
+})();
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/custom-style.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/custom-style.html
new file mode 100644
index 00000000000..67c3f657e5b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/custom-style.html
@@ -0,0 +1,114 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../../../shadycss/custom-style-interface.html">
+<link rel="import" href="../utils/style-gather.html">
+<script>
+(function() {
+ 'use strict';
+
+ const attr = 'include';
+
+ const CustomStyleInterface = window.ShadyCSS.CustomStyleInterface;
+
+ /**
+ * Custom element for defining styles in the main document that can take
+ * advantage of [shady DOM](https://github.com/webcomponents/shadycss) shims
+ * for style encapsulation, custom properties, and custom mixins.
+ *
+ * - Document styles defined in a `<custom-style>` are shimmed to ensure they
+ * do not leak into local DOM when running on browsers without native
+ * Shadow DOM.
+ * - Custom properties can be defined in a `<custom-style>`. Use the `html` selector
+ * to define custom properties that apply to all custom elements.
+ * - Custom mixins can be defined in a `<custom-style>`, if you import the optional
+ * [apply shim](https://github.com/webcomponents/shadycss#about-applyshim)
+ * (`shadycss/apply-shim.html`).
+ *
+ * To use:
+ *
+ * - Import `custom-style.html`.
+ * - Place a `<custom-style>` element in the main document, wrapping an inline `<style>` tag that
+ * contains the CSS rules you want to shim.
+ *
+ * For example:
+ *
+ * ```html
+ * <!-- import apply shim--only required if using mixins -->
+ * <link rel="import" href="bower_components/shadycss/apply-shim.html">
+ * <!-- import custom-style element -->
+ * <link rel="import" href="bower_components/polymer/lib/elements/custom-style.html">
+ *
+ * <custom-style>
+ * <style>
+ * html {
+ * --custom-color: blue;
+ * --custom-mixin: {
+ * font-weight: bold;
+ * color: red;
+ * };
+ * }
+ * </style>
+ * </custom-style>
+ * ```
+ *
+ * @customElement
+ * @extends HTMLElement
+ * @memberof Polymer
+ * @summary Custom element for defining styles in the main document that can
+ * take advantage of Polymer's style scoping and custom properties shims.
+ */
+ class CustomStyle extends HTMLElement {
+ constructor() {
+ super();
+ this._style = null;
+ CustomStyleInterface.addCustomStyle(this);
+ }
+ /**
+ * Returns the light-DOM `<style>` child this element wraps. Upon first
+ * call any style modules referenced via the `include` attribute will be
+ * concatenated to this element's `<style>`.
+ *
+ * @return {HTMLStyleElement} This element's light-DOM `<style>`
+ */
+ getStyle() {
+ if (this._style) {
+ return this._style;
+ }
+ const style = /** @type {HTMLStyleElement} */(this.querySelector('style'));
+ if (!style) {
+ return null;
+ }
+ this._style = style;
+ const include = style.getAttribute(attr);
+ if (include) {
+ style.removeAttribute(attr);
+ style.textContent = Polymer.StyleGather.cssFromModules(include) + style.textContent;
+ }
+ /*
+ HTML Imports styling the main document are deprecated in Chrome
+ https://crbug.com/523952
+
+ If this element is not in the main document, then it must be in an HTML Import document.
+ In that case, move the custom style to the main document.
+
+ The ordering of `<custom-style>` should stay the same as when loaded by HTML Imports, but there may be odd
+ cases of ordering w.r.t the main document styles.
+ */
+ if (this.ownerDocument !== window.document) {
+ window.document.head.appendChild(this);
+ }
+ return this._style;
+ }
+ }
+
+ window.customElements.define('custom-style', CustomStyle);
+ Polymer.CustomStyle = CustomStyle;
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/dom-bind.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/dom-bind.html
new file mode 100644
index 00000000000..8b64cca385d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/dom-bind.html
@@ -0,0 +1,139 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../utils/boot.html">
+<link rel="import" href="../mixins/property-effects.html">
+<link rel="import" href="../mixins/mutable-data.html">
+<link rel="import" href="../mixins/gesture-event-listeners.html">
+
+<script>
+
+ (function() {
+ 'use strict';
+
+ /**
+ * @constructor
+ * @extends {HTMLElement}
+ * @implements {Polymer_PropertyEffects}
+ * @implements {Polymer_OptionalMutableData}
+ * @implements {Polymer_GestureEventListeners}
+ */
+ const domBindBase =
+ Polymer.GestureEventListeners(
+ Polymer.OptionalMutableData(
+ Polymer.PropertyEffects(HTMLElement)));
+
+ /**
+ * Custom element to allow using Polymer's template features (data binding,
+ * declarative event listeners, etc.) in the main document without defining
+ * a new custom element.
+ *
+ * `<template>` tags utilizing bindings may be wrapped with the `<dom-bind>`
+ * element, which will immediately stamp the wrapped template into the main
+ * document and bind elements to the `dom-bind` element itself as the
+ * binding scope.
+ *
+ * @polymer
+ * @customElement
+ * @appliesMixin Polymer.PropertyEffects
+ * @appliesMixin Polymer.OptionalMutableData
+ * @appliesMixin Polymer.GestureEventListeners
+ * @extends {domBindBase}
+ * @memberof Polymer
+ * @summary Custom element to allow using Polymer's template features (data
+ * binding, declarative event listeners, etc.) in the main document.
+ */
+ class DomBind extends domBindBase {
+
+ static get observedAttributes() { return ['mutable-data']; }
+
+ constructor() {
+ super();
+ this.root = null;
+ this.$ = null;
+ this.__children = null;
+ }
+
+ /** @return {void} */
+ attributeChangedCallback() {
+ // assumes only one observed attribute
+ this.mutableData = true;
+ }
+
+ /** @return {void} */
+ connectedCallback() {
+ this.style.display = 'none';
+ this.render();
+ }
+
+ /** @return {void} */
+ disconnectedCallback() {
+ this.__removeChildren();
+ }
+
+ __insertChildren() {
+ this.parentNode.insertBefore(this.root, this);
+ }
+
+ __removeChildren() {
+ if (this.__children) {
+ for (let i=0; i<this.__children.length; i++) {
+ this.root.appendChild(this.__children[i]);
+ }
+ }
+ }
+
+ /**
+ * Forces the element to render its content. This is typically only
+ * necessary to call if HTMLImports with the async attribute are used.
+ * @return {void}
+ */
+ render() {
+ let template;
+ if (!this.__children) {
+ template = /** @type {HTMLTemplateElement} */(template || this.querySelector('template'));
+ if (!template) {
+ // Wait until childList changes and template should be there by then
+ let observer = new MutationObserver(() => {
+ template = /** @type {HTMLTemplateElement} */(this.querySelector('template'));
+ if (template) {
+ observer.disconnect();
+ this.render();
+ } else {
+ throw new Error('dom-bind requires a <template> child');
+ }
+ });
+ observer.observe(this, {childList: true});
+ return;
+ }
+ this.root = this._stampTemplate(template);
+ this.$ = this.root.$;
+ this.__children = [];
+ for (let n=this.root.firstChild; n; n=n.nextSibling) {
+ this.__children[this.__children.length] = n;
+ }
+ this._enableProperties();
+ }
+ this.__insertChildren();
+ this.dispatchEvent(new CustomEvent('dom-change', {
+ bubbles: true,
+ composed: true
+ }));
+ }
+
+ }
+
+ customElements.define('dom-bind', DomBind);
+
+ Polymer.DomBind = DomBind;
+
+ })();
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/dom-if.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/dom-if.html
new file mode 100644
index 00000000000..527ede86ae0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/dom-if.html
@@ -0,0 +1,288 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer-element.html">
+<link rel="import" href="../utils/templatize.html">
+<link rel="import" href="../utils/debounce.html">
+<link rel="import" href="../utils/flush.html">
+
+<script>
+
+(function() {
+ 'use strict';
+
+ /**
+ * The `<dom-if>` element will stamp a light-dom `<template>` child when
+ * the `if` property becomes truthy, and the template can use Polymer
+ * data-binding and declarative event features when used in the context of
+ * a Polymer element's template.
+ *
+ * When `if` becomes falsy, the stamped content is hidden but not
+ * removed from dom. When `if` subsequently becomes truthy again, the content
+ * is simply re-shown. This approach is used due to its favorable performance
+ * characteristics: the expense of creating template content is paid only
+ * once and lazily.
+ *
+ * Set the `restamp` property to true to force the stamped content to be
+ * created / destroyed when the `if` condition changes.
+ *
+ * @customElement
+ * @polymer
+ * @extends Polymer.Element
+ * @memberof Polymer
+ * @summary Custom element that conditionally stamps and hides or removes
+ * template content based on a boolean flag.
+ */
+ class DomIf extends Polymer.Element {
+
+ // Not needed to find template; can be removed once the analyzer
+ // can find the tag name from customElements.define call
+ static get is() { return 'dom-if'; }
+
+ static get template() { return null; }
+
+ static get properties() {
+
+ return {
+
+ /**
+ * Fired whenever DOM is added or removed/hidden by this template (by
+ * default, rendering occurs lazily). To force immediate rendering, call
+ * `render`.
+ *
+ * @event dom-change
+ */
+
+ /**
+ * A boolean indicating whether this template should stamp.
+ */
+ if: {
+ type: Boolean,
+ observer: '__debounceRender'
+ },
+
+ /**
+ * When true, elements will be removed from DOM and discarded when `if`
+ * becomes false and re-created and added back to the DOM when `if`
+ * becomes true. By default, stamped elements will be hidden but left
+ * in the DOM when `if` becomes false, which is generally results
+ * in better performance.
+ */
+ restamp: {
+ type: Boolean,
+ observer: '__debounceRender'
+ }
+
+ };
+
+ }
+
+ constructor() {
+ super();
+ this.__renderDebouncer = null;
+ this.__invalidProps = null;
+ this.__instance = null;
+ this._lastIf = false;
+ this.__ctor = null;
+ }
+
+ __debounceRender() {
+ // Render is async for 2 reasons:
+ // 1. To eliminate dom creation trashing if user code thrashes `if` in the
+ // same turn. This was more common in 1.x where a compound computed
+ // property could result in the result changing multiple times, but is
+ // mitigated to a large extent by batched property processing in 2.x.
+ // 2. To avoid double object propagation when a bag including values bound
+ // to the `if` property as well as one or more hostProps could enqueue
+ // the <dom-if> to flush before the <template>'s host property
+ // forwarding. In that scenario creating an instance would result in
+ // the host props being set once, and then the enqueued changes on the
+ // template would set properties a second time, potentially causing an
+ // object to be set to an instance more than once. Creating the
+ // instance async from flushing data ensures this doesn't happen. If
+ // we wanted a sync option in the future, simply having <dom-if> flush
+ // (or clear) its template's pending host properties before creating
+ // the instance would also avoid the problem.
+ this.__renderDebouncer = Polymer.Debouncer.debounce(
+ this.__renderDebouncer
+ , Polymer.Async.microTask
+ , () => this.__render());
+ Polymer.enqueueDebouncer(this.__renderDebouncer);
+ }
+
+ /**
+ * @return {void}
+ */
+ disconnectedCallback() {
+ super.disconnectedCallback();
+ if (!this.parentNode ||
+ (this.parentNode.nodeType == Node.DOCUMENT_FRAGMENT_NODE &&
+ !this.parentNode.host)) {
+ this.__teardownInstance();
+ }
+ }
+
+ /**
+ * @return {void}
+ */
+ connectedCallback() {
+ super.connectedCallback();
+ this.style.display = 'none';
+ if (this.if) {
+ this.__debounceRender();
+ }
+ }
+
+ /**
+ * Forces the element to render its content. Normally rendering is
+ * asynchronous to a provoking change. This is done for efficiency so
+ * that multiple changes trigger only a single render. The render method
+ * should be called if, for example, template rendering is required to
+ * validate application state.
+ * @return {void}
+ */
+ render() {
+ Polymer.flush();
+ }
+
+ __render() {
+ if (this.if) {
+ if (!this.__ensureInstance()) {
+ // No template found yet
+ return;
+ }
+ this._showHideChildren();
+ } else if (this.restamp) {
+ this.__teardownInstance();
+ }
+ if (!this.restamp && this.__instance) {
+ this._showHideChildren();
+ }
+ if (this.if != this._lastIf) {
+ this.dispatchEvent(new CustomEvent('dom-change', {
+ bubbles: true,
+ composed: true
+ }));
+ this._lastIf = this.if;
+ }
+ }
+
+ __ensureInstance() {
+ let parentNode = this.parentNode;
+ // Guard against element being detached while render was queued
+ if (parentNode) {
+ if (!this.__ctor) {
+ let template = /** @type {HTMLTemplateElement} */(this.querySelector('template'));
+ if (!template) {
+ // Wait until childList changes and template should be there by then
+ let observer = new MutationObserver(() => {
+ if (this.querySelector('template')) {
+ observer.disconnect();
+ this.__render();
+ } else {
+ throw new Error('dom-if requires a <template> child');
+ }
+ });
+ observer.observe(this, {childList: true});
+ return false;
+ }
+ this.__ctor = Polymer.Templatize.templatize(template, this, {
+ // dom-if templatizer instances require `mutable: true`, as
+ // `__syncHostProperties` relies on that behavior to sync objects
+ mutableData: true,
+ /**
+ * @param {string} prop Property to forward
+ * @param {*} value Value of property
+ * @this {this}
+ */
+ forwardHostProp: function(prop, value) {
+ if (this.__instance) {
+ if (this.if) {
+ this.__instance.forwardHostProp(prop, value);
+ } else {
+ // If we have an instance but are squelching host property
+ // forwarding due to if being false, note the invalidated
+ // properties so `__syncHostProperties` can sync them the next
+ // time `if` becomes true
+ this.__invalidProps = this.__invalidProps || Object.create(null);
+ this.__invalidProps[Polymer.Path.root(prop)] = true;
+ }
+ }
+ }
+ });
+ }
+ if (!this.__instance) {
+ this.__instance = new this.__ctor();
+ parentNode.insertBefore(this.__instance.root, this);
+ } else {
+ this.__syncHostProperties();
+ let c$ = this.__instance.children;
+ if (c$ && c$.length) {
+ // Detect case where dom-if was re-attached in new position
+ let lastChild = this.previousSibling;
+ if (lastChild !== c$[c$.length-1]) {
+ for (let i=0, n; (i<c$.length) && (n=c$[i]); i++) {
+ parentNode.insertBefore(n, this);
+ }
+ }
+ }
+ }
+ }
+ return true;
+ }
+
+ __syncHostProperties() {
+ let props = this.__invalidProps;
+ if (props) {
+ for (let prop in props) {
+ this.__instance._setPendingProperty(prop, this.__dataHost[prop]);
+ }
+ this.__invalidProps = null;
+ this.__instance._flushProperties();
+ }
+ }
+
+ __teardownInstance() {
+ if (this.__instance) {
+ let c$ = this.__instance.children;
+ if (c$ && c$.length) {
+ // use first child parent, for case when dom-if may have been detached
+ let parent = c$[0].parentNode;
+ for (let i=0, n; (i<c$.length) && (n=c$[i]); i++) {
+ parent.removeChild(n);
+ }
+ }
+ this.__instance = null;
+ this.__invalidProps = null;
+ }
+ }
+
+ /**
+ * Shows or hides the template instance top level child elements. For
+ * text nodes, `textContent` is removed while "hidden" and replaced when
+ * "shown."
+ * @return {void}
+ * @protected
+ */
+ _showHideChildren() {
+ let hidden = this.__hideTemplateChildren__ || !this.if;
+ if (this.__instance) {
+ this.__instance._showHideChildren(hidden);
+ }
+ }
+
+ }
+
+ customElements.define(DomIf.is, DomIf);
+
+ Polymer.DomIf = DomIf;
+
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/dom-module.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/dom-module.html
new file mode 100644
index 00000000000..3ca593b1a91
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/dom-module.html
@@ -0,0 +1,143 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../utils/boot.html">
+<link rel="import" href="../utils/resolve-url.html">
+<script>
+(function() {
+ 'use strict';
+
+ let modules = {};
+ let lcModules = {};
+ function findModule(id) {
+ return modules[id] || lcModules[id.toLowerCase()];
+ }
+
+ function styleOutsideTemplateCheck(inst) {
+ if (inst.querySelector('style')) {
+ console.warn('dom-module %s has style outside template', inst.id);
+ }
+ }
+
+ /**
+ * The `dom-module` element registers the dom it contains to the name given
+ * by the module's id attribute. It provides a unified database of dom
+ * accessible via its static `import` API.
+ *
+ * A key use case of `dom-module` is for providing custom element `<template>`s
+ * via HTML imports that are parsed by the native HTML parser, that can be
+ * relocated during a bundling pass and still looked up by `id`.
+ *
+ * Example:
+ *
+ * <dom-module id="foo">
+ * <img src="stuff.png">
+ * </dom-module>
+ *
+ * Then in code in some other location that cannot access the dom-module above
+ *
+ * let img = customElements.get('dom-module').import('foo', 'img');
+ *
+ * @customElement
+ * @extends HTMLElement
+ * @memberof Polymer
+ * @summary Custom element that provides a registry of relocatable DOM content
+ * by `id` that is agnostic to bundling.
+ * @unrestricted
+ */
+ class DomModule extends HTMLElement {
+
+ static get observedAttributes() { return ['id']; }
+
+ /**
+ * Retrieves the element specified by the css `selector` in the module
+ * registered by `id`. For example, this.import('foo', 'img');
+ * @param {string} id The id of the dom-module in which to search.
+ * @param {string=} selector The css selector by which to find the element.
+ * @return {Element} Returns the element which matches `selector` in the
+ * module registered at the specified `id`.
+ */
+ static import(id, selector) {
+ if (id) {
+ let m = findModule(id);
+ if (m && selector) {
+ return m.querySelector(selector);
+ }
+ return m;
+ }
+ return null;
+ }
+
+ /**
+ * @param {string} name Name of attribute.
+ * @param {?string} old Old value of attribute.
+ * @param {?string} value Current value of attribute.
+ * @return {void}
+ */
+ attributeChangedCallback(name, old, value) {
+ if (old !== value) {
+ this.register();
+ }
+ }
+
+ /**
+ * The absolute URL of the original location of this `dom-module`.
+ *
+ * This value will differ from this element's `ownerDocument` in the
+ * following ways:
+ * - Takes into account any `assetpath` attribute added during bundling
+ * to indicate the original location relative to the bundled location
+ * - Uses the HTMLImports polyfill's `importForElement` API to ensure
+ * the path is relative to the import document's location since
+ * `ownerDocument` is not currently polyfilled
+ */
+ get assetpath() {
+ // Don't override existing assetpath.
+ if (!this.__assetpath) {
+ // note: assetpath set via an attribute must be relative to this
+ // element's location; accomodate polyfilled HTMLImports
+ const owner = window.HTMLImports && HTMLImports.importForElement ?
+ HTMLImports.importForElement(this) || document : this.ownerDocument;
+ const url = Polymer.ResolveUrl.resolveUrl(
+ this.getAttribute('assetpath') || '', owner.baseURI);
+ this.__assetpath = Polymer.ResolveUrl.pathFromUrl(url);
+ }
+ return this.__assetpath;
+ }
+
+ /**
+ * Registers the dom-module at a given id. This method should only be called
+ * when a dom-module is imperatively created. For
+ * example, `document.createElement('dom-module').register('foo')`.
+ * @param {string=} id The id at which to register the dom-module.
+ * @return {void}
+ */
+ register(id) {
+ id = id || this.id;
+ if (id) {
+ this.id = id;
+ // store id separate from lowercased id so that
+ // in all cases mixedCase id will stored distinctly
+ // and lowercase version is a fallback
+ modules[id] = this;
+ lcModules[id.toLowerCase()] = this;
+ styleOutsideTemplateCheck(this);
+ }
+ }
+ }
+
+ DomModule.prototype['modules'] = modules;
+
+ customElements.define('dom-module', DomModule);
+
+ // export
+ Polymer.DomModule = DomModule;
+
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/dom-repeat.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/dom-repeat.html
new file mode 100644
index 00000000000..f14f88f7a77
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/elements/dom-repeat.html
@@ -0,0 +1,738 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../polymer-element.html">
+<link rel="import" href="../utils/templatize.html">
+<link rel="import" href="../utils/debounce.html">
+<link rel="import" href="../utils/flush.html">
+<link rel="import" href="../mixins/mutable-data.html">
+
+<script>
+(function() {
+ 'use strict';
+
+ let TemplateInstanceBase = Polymer.TemplateInstanceBase; // eslint-disable-line
+
+ /**
+ * @constructor
+ * @implements {Polymer_OptionalMutableData}
+ * @extends {Polymer.Element}
+ */
+ const domRepeatBase = Polymer.OptionalMutableData(Polymer.Element);
+
+ /**
+ * The `<dom-repeat>` element will automatically stamp and binds one instance
+ * of template content to each object in a user-provided array.
+ * `dom-repeat` accepts an `items` property, and one instance of the template
+ * is stamped for each item into the DOM at the location of the `dom-repeat`
+ * element. The `item` property will be set on each instance's binding
+ * scope, thus templates should bind to sub-properties of `item`.
+ *
+ * Example:
+ *
+ * ```html
+ * <dom-module id="employee-list">
+ *
+ * <template>
+ *
+ * <div> Employee list: </div>
+ * <dom-repeat items="{{employees}}">
+ * <template>
+ * <div>First name: <span>{{item.first}}</span></div>
+ * <div>Last name: <span>{{item.last}}</span></div>
+ * </template>
+ * </dom-repeat>
+ *
+ * </template>
+ *
+ * </dom-module>
+ * ```
+ *
+ * With the following custom element definition:
+ *
+ * ```js
+ * class EmployeeList extends Polymer.Element {
+ * static get is() { return 'employee-list'; }
+ * static get properties() {
+ * return {
+ * employees: {
+ * value() {
+ * return [
+ * {first: 'Bob', last: 'Smith'},
+ * {first: 'Sally', last: 'Johnson'},
+ * ...
+ * ];
+ * }
+ * }
+ * };
+ * }
+ * }
+ * ```
+ *
+ * Notifications for changes to items sub-properties will be forwarded to template
+ * instances, which will update via the normal structured data notification system.
+ *
+ * Mutations to the `items` array itself should be made using the Array
+ * mutation API's on `Polymer.Base` (`push`, `pop`, `splice`, `shift`,
+ * `unshift`), and template instances will be kept in sync with the data in the
+ * array.
+ *
+ * Events caught by event handlers within the `dom-repeat` template will be
+ * decorated with a `model` property, which represents the binding scope for
+ * each template instance. The model is an instance of Polymer.Base, and should
+ * be used to manipulate data on the instance, for example
+ * `event.model.set('item.checked', true);`.
+ *
+ * Alternatively, the model for a template instance for an element stamped by
+ * a `dom-repeat` can be obtained using the `modelForElement` API on the
+ * `dom-repeat` that stamped it, for example
+ * `this.$.domRepeat.modelForElement(event.target).set('item.checked', true);`.
+ * This may be useful for manipulating instance data of event targets obtained
+ * by event handlers on parents of the `dom-repeat` (event delegation).
+ *
+ * A view-specific filter/sort may be applied to each `dom-repeat` by supplying a
+ * `filter` and/or `sort` property. This may be a string that names a function on
+ * the host, or a function may be assigned to the property directly. The functions
+ * should implemented following the standard `Array` filter/sort API.
+ *
+ * In order to re-run the filter or sort functions based on changes to sub-fields
+ * of `items`, the `observe` property may be set as a space-separated list of
+ * `item` sub-fields that should cause a re-filter/sort when modified. If
+ * the filter or sort function depends on properties not contained in `items`,
+ * the user should observe changes to those properties and call `render` to update
+ * the view based on the dependency change.
+ *
+ * For example, for an `dom-repeat` with a filter of the following:
+ *
+ * ```js
+ * isEngineer(item) {
+ * return item.type == 'engineer' || item.manager.type == 'engineer';
+ * }
+ * ```
+ *
+ * Then the `observe` property should be configured as follows:
+ *
+ * ```html
+ * <dom-repeat items="{{employees}}" filter="isEngineer" observe="type manager.type">
+ * ```
+ *
+ * @customElement
+ * @polymer
+ * @memberof Polymer
+ * @extends {domRepeatBase}
+ * @appliesMixin Polymer.OptionalMutableData
+ * @summary Custom element for stamping instance of a template bound to
+ * items in an array.
+ */
+ class DomRepeat extends domRepeatBase {
+
+ // Not needed to find template; can be removed once the analyzer
+ // can find the tag name from customElements.define call
+ static get is() { return 'dom-repeat'; }
+
+ static get template() { return null; }
+
+ static get properties() {
+
+ /**
+ * Fired whenever DOM is added or removed by this template (by
+ * default, rendering occurs lazily). To force immediate rendering, call
+ * `render`.
+ *
+ * @event dom-change
+ */
+ return {
+
+ /**
+ * An array containing items determining how many instances of the template
+ * to stamp and that that each template instance should bind to.
+ */
+ items: {
+ type: Array
+ },
+
+ /**
+ * The name of the variable to add to the binding scope for the array
+ * element associated with a given template instance.
+ */
+ as: {
+ type: String,
+ value: 'item'
+ },
+
+ /**
+ * The name of the variable to add to the binding scope with the index
+ * of the instance in the sorted and filtered list of rendered items.
+ * Note, for the index in the `this.items` array, use the value of the
+ * `itemsIndexAs` property.
+ */
+ indexAs: {
+ type: String,
+ value: 'index'
+ },
+
+ /**
+ * The name of the variable to add to the binding scope with the index
+ * of the instance in the `this.items` array. Note, for the index of
+ * this instance in the sorted and filtered list of rendered items,
+ * use the value of the `indexAs` property.
+ */
+ itemsIndexAs: {
+ type: String,
+ value: 'itemsIndex'
+ },
+
+ /**
+ * A function that should determine the sort order of the items. This
+ * property should either be provided as a string, indicating a method
+ * name on the element's host, or else be an actual function. The
+ * function should match the sort function passed to `Array.sort`.
+ * Using a sort function has no effect on the underlying `items` array.
+ */
+ sort: {
+ type: Function,
+ observer: '__sortChanged'
+ },
+
+ /**
+ * A function that can be used to filter items out of the view. This
+ * property should either be provided as a string, indicating a method
+ * name on the element's host, or else be an actual function. The
+ * function should match the sort function passed to `Array.filter`.
+ * Using a filter function has no effect on the underlying `items` array.
+ */
+ filter: {
+ type: Function,
+ observer: '__filterChanged'
+ },
+
+ /**
+ * When using a `filter` or `sort` function, the `observe` property
+ * should be set to a space-separated list of the names of item
+ * sub-fields that should trigger a re-sort or re-filter when changed.
+ * These should generally be fields of `item` that the sort or filter
+ * function depends on.
+ */
+ observe: {
+ type: String,
+ observer: '__observeChanged'
+ },
+
+ /**
+ * When using a `filter` or `sort` function, the `delay` property
+ * determines a debounce time in ms after a change to observed item
+ * properties that must pass before the filter or sort is re-run.
+ * This is useful in rate-limiting shuffling of the view when
+ * item changes may be frequent.
+ */
+ delay: Number,
+
+ /**
+ * Count of currently rendered items after `filter` (if any) has been applied.
+ * If "chunking mode" is enabled, `renderedItemCount` is updated each time a
+ * set of template instances is rendered.
+ *
+ */
+ renderedItemCount: {
+ type: Number,
+ notify: true,
+ readOnly: true
+ },
+
+ /**
+ * Defines an initial count of template instances to render after setting
+ * the `items` array, before the next paint, and puts the `dom-repeat`
+ * into "chunking mode". The remaining items will be created and rendered
+ * incrementally at each animation frame therof until all instances have
+ * been rendered.
+ */
+ initialCount: {
+ type: Number,
+ observer: '__initializeChunking'
+ },
+
+ /**
+ * When `initialCount` is used, this property defines a frame rate (in
+ * fps) to target by throttling the number of instances rendered each
+ * frame to not exceed the budget for the target frame rate. The
+ * framerate is effectively the number of `requestAnimationFrame`s that
+ * it tries to allow to actually fire in a given second. It does this
+ * by measuring the time between `rAF`s and continuously adjusting the
+ * number of items created each `rAF` to maintain the target framerate.
+ * Setting this to a higher number allows lower latency and higher
+ * throughput for event handlers and other tasks, but results in a
+ * longer time for the remaining items to complete rendering.
+ */
+ targetFramerate: {
+ type: Number,
+ value: 20
+ },
+
+ _targetFrameTime: {
+ type: Number,
+ computed: '__computeFrameTime(targetFramerate)'
+ }
+
+ };
+
+ }
+
+ static get observers() {
+ return [ '__itemsChanged(items.*)' ];
+ }
+
+ constructor() {
+ super();
+ this.__instances = [];
+ this.__limit = Infinity;
+ this.__pool = [];
+ this.__renderDebouncer = null;
+ this.__itemsIdxToInstIdx = {};
+ this.__chunkCount = null;
+ this.__lastChunkTime = null;
+ this.__sortFn = null;
+ this.__filterFn = null;
+ this.__observePaths = null;
+ this.__ctor = null;
+ this.__isDetached = true;
+ this.template = null;
+ }
+
+ /**
+ * @return {void}
+ */
+ disconnectedCallback() {
+ super.disconnectedCallback();
+ this.__isDetached = true;
+ for (let i=0; i<this.__instances.length; i++) {
+ this.__detachInstance(i);
+ }
+ }
+
+ /**
+ * @return {void}
+ */
+ connectedCallback() {
+ super.connectedCallback();
+ this.style.display = 'none';
+ // only perform attachment if the element was previously detached.
+ if (this.__isDetached) {
+ this.__isDetached = false;
+ let parent = this.parentNode;
+ for (let i=0; i<this.__instances.length; i++) {
+ this.__attachInstance(i, parent);
+ }
+ }
+ }
+
+ __ensureTemplatized() {
+ // Templatizing (generating the instance constructor) needs to wait
+ // until ready, since won't have its template content handed back to
+ // it until then
+ if (!this.__ctor) {
+ let template = this.template = /** @type {HTMLTemplateElement} */(this.querySelector('template'));
+ if (!template) {
+ // // Wait until childList changes and template should be there by then
+ let observer = new MutationObserver(() => {
+ if (this.querySelector('template')) {
+ observer.disconnect();
+ this.__render();
+ } else {
+ throw new Error('dom-repeat requires a <template> child');
+ }
+ });
+ observer.observe(this, {childList: true});
+ return false;
+ }
+ // Template instance props that should be excluded from forwarding
+ let instanceProps = {};
+ instanceProps[this.as] = true;
+ instanceProps[this.indexAs] = true;
+ instanceProps[this.itemsIndexAs] = true;
+ this.__ctor = Polymer.Templatize.templatize(template, this, {
+ mutableData: this.mutableData,
+ parentModel: true,
+ instanceProps: instanceProps,
+ /**
+ * @this {this}
+ * @param {string} prop Property to set
+ * @param {*} value Value to set property to
+ */
+ forwardHostProp: function(prop, value) {
+ let i$ = this.__instances;
+ for (let i=0, inst; (i<i$.length) && (inst=i$[i]); i++) {
+ inst.forwardHostProp(prop, value);
+ }
+ },
+ /**
+ * @this {this}
+ * @param {Object} inst Instance to notify
+ * @param {string} prop Property to notify
+ * @param {*} value Value to notify
+ */
+ notifyInstanceProp: function(inst, prop, value) {
+ if (Polymer.Path.matches(this.as, prop)) {
+ let idx = inst[this.itemsIndexAs];
+ if (prop == this.as) {
+ this.items[idx] = value;
+ }
+ let path = Polymer.Path.translate(this.as, 'items.' + idx, prop);
+ this.notifyPath(path, value);
+ }
+ }
+ });
+ }
+ return true;
+ }
+
+ __getMethodHost() {
+ // Technically this should be the owner of the outermost template.
+ // In shadow dom, this is always getRootNode().host, but we can
+ // approximate this via cooperation with our dataHost always setting
+ // `_methodHost` as long as there were bindings (or id's) on this
+ // instance causing it to get a dataHost.
+ return this.__dataHost._methodHost || this.__dataHost;
+ }
+
+ __functionFromPropertyValue(functionOrMethodName) {
+ if (typeof functionOrMethodName === 'string') {
+ let methodName = functionOrMethodName;
+ let obj = this.__getMethodHost();
+ return function() { return obj[methodName].apply(obj, arguments); };
+ }
+
+ return functionOrMethodName;
+ }
+
+ __sortChanged(sort) {
+ this.__sortFn = this.__functionFromPropertyValue(sort);
+ if (this.items) { this.__debounceRender(this.__render); }
+ }
+
+ __filterChanged(filter) {
+ this.__filterFn = this.__functionFromPropertyValue(filter);
+ if (this.items) { this.__debounceRender(this.__render); }
+ }
+
+ __computeFrameTime(rate) {
+ return Math.ceil(1000/rate);
+ }
+
+ __initializeChunking() {
+ if (this.initialCount) {
+ this.__limit = this.initialCount;
+ this.__chunkCount = this.initialCount;
+ this.__lastChunkTime = performance.now();
+ }
+ }
+
+ __tryRenderChunk() {
+ // Debounced so that multiple calls through `_render` between animation
+ // frames only queue one new rAF (e.g. array mutation & chunked render)
+ if (this.items && this.__limit < this.items.length) {
+ this.__debounceRender(this.__requestRenderChunk);
+ }
+ }
+
+ __requestRenderChunk() {
+ requestAnimationFrame(()=>this.__renderChunk());
+ }
+
+ __renderChunk() {
+ // Simple auto chunkSize throttling algorithm based on feedback loop:
+ // measure actual time between frames and scale chunk count by ratio
+ // of target/actual frame time
+ let currChunkTime = performance.now();
+ let ratio = this._targetFrameTime / (currChunkTime - this.__lastChunkTime);
+ this.__chunkCount = Math.round(this.__chunkCount * ratio) || 1;
+ this.__limit += this.__chunkCount;
+ this.__lastChunkTime = currChunkTime;
+ this.__debounceRender(this.__render);
+ }
+
+ __observeChanged() {
+ this.__observePaths = this.observe &&
+ this.observe.replace('.*', '.').split(' ');
+ }
+
+ __itemsChanged(change) {
+ if (this.items && !Array.isArray(this.items)) {
+ console.warn('dom-repeat expected array for `items`, found', this.items);
+ }
+ // If path was to an item (e.g. 'items.3' or 'items.3.foo'), forward the
+ // path to that instance synchronously (returns false for non-item paths)
+ if (!this.__handleItemPath(change.path, change.value)) {
+ // Otherwise, the array was reset ('items') or spliced ('items.splices'),
+ // so queue a full refresh
+ this.__initializeChunking();
+ this.__debounceRender(this.__render);
+ }
+ }
+
+ __handleObservedPaths(path) {
+ // Handle cases where path changes should cause a re-sort/filter
+ if (this.__sortFn || this.__filterFn) {
+ if (!path) {
+ // Always re-render if the item itself changed
+ this.__debounceRender(this.__render, this.delay);
+ } else if (this.__observePaths) {
+ // Otherwise, re-render if the path changed matches an observed path
+ let paths = this.__observePaths;
+ for (let i=0; i<paths.length; i++) {
+ if (path.indexOf(paths[i]) === 0) {
+ this.__debounceRender(this.__render, this.delay);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * @param {function(this:DomRepeat)} fn Function to debounce.
+ * @param {number=} delay Delay in ms to debounce by.
+ */
+ __debounceRender(fn, delay = 0) {
+ this.__renderDebouncer = Polymer.Debouncer.debounce(
+ this.__renderDebouncer
+ , delay > 0 ? Polymer.Async.timeOut.after(delay) : Polymer.Async.microTask
+ , fn.bind(this));
+ Polymer.enqueueDebouncer(this.__renderDebouncer);
+ }
+
+ /**
+ * Forces the element to render its content. Normally rendering is
+ * asynchronous to a provoking change. This is done for efficiency so
+ * that multiple changes trigger only a single render. The render method
+ * should be called if, for example, template rendering is required to
+ * validate application state.
+ * @return {void}
+ */
+ render() {
+ // Queue this repeater, then flush all in order
+ this.__debounceRender(this.__render);
+ Polymer.flush();
+ }
+
+ __render() {
+ if (!this.__ensureTemplatized()) {
+ // No template found yet
+ return;
+ }
+ this.__applyFullRefresh();
+ // Reset the pool
+ // TODO(kschaaf): Reuse pool across turns and nested templates
+ // Now that objects/arrays are re-evaluated when set, we can safely
+ // reuse pooled instances across turns, however we still need to decide
+ // semantics regarding how long to hold, how many to hold, etc.
+ this.__pool.length = 0;
+ // Set rendered item count
+ this._setRenderedItemCount(this.__instances.length);
+ // Notify users
+ this.dispatchEvent(new CustomEvent('dom-change', {
+ bubbles: true,
+ composed: true
+ }));
+ // Check to see if we need to render more items
+ this.__tryRenderChunk();
+ }
+
+ __applyFullRefresh() {
+ let items = this.items || [];
+ let isntIdxToItemsIdx = new Array(items.length);
+ for (let i=0; i<items.length; i++) {
+ isntIdxToItemsIdx[i] = i;
+ }
+ // Apply user filter
+ if (this.__filterFn) {
+ isntIdxToItemsIdx = isntIdxToItemsIdx.filter((i, idx, array) =>
+ this.__filterFn(items[i], idx, array));
+ }
+ // Apply user sort
+ if (this.__sortFn) {
+ isntIdxToItemsIdx.sort((a, b) => this.__sortFn(items[a], items[b]));
+ }
+ // items->inst map kept for item path forwarding
+ const itemsIdxToInstIdx = this.__itemsIdxToInstIdx = {};
+ let instIdx = 0;
+ // Generate instances and assign items
+ const limit = Math.min(isntIdxToItemsIdx.length, this.__limit);
+ for (; instIdx<limit; instIdx++) {
+ let inst = this.__instances[instIdx];
+ let itemIdx = isntIdxToItemsIdx[instIdx];
+ let item = items[itemIdx];
+ itemsIdxToInstIdx[itemIdx] = instIdx;
+ if (inst) {
+ inst._setPendingProperty(this.as, item);
+ inst._setPendingProperty(this.indexAs, instIdx);
+ inst._setPendingProperty(this.itemsIndexAs, itemIdx);
+ inst._flushProperties();
+ } else {
+ this.__insertInstance(item, instIdx, itemIdx);
+ }
+ }
+ // Remove any extra instances from previous state
+ for (let i=this.__instances.length-1; i>=instIdx; i--) {
+ this.__detachAndRemoveInstance(i);
+ }
+ }
+
+ __detachInstance(idx) {
+ let inst = this.__instances[idx];
+ for (let i=0; i<inst.children.length; i++) {
+ let el = inst.children[i];
+ inst.root.appendChild(el);
+ }
+ return inst;
+ }
+
+ __attachInstance(idx, parent) {
+ let inst = this.__instances[idx];
+ parent.insertBefore(inst.root, this);
+ }
+
+ __detachAndRemoveInstance(idx) {
+ let inst = this.__detachInstance(idx);
+ if (inst) {
+ this.__pool.push(inst);
+ }
+ this.__instances.splice(idx, 1);
+ }
+
+ __stampInstance(item, instIdx, itemIdx) {
+ let model = {};
+ model[this.as] = item;
+ model[this.indexAs] = instIdx;
+ model[this.itemsIndexAs] = itemIdx;
+ return new this.__ctor(model);
+ }
+
+ __insertInstance(item, instIdx, itemIdx) {
+ let inst = this.__pool.pop();
+ if (inst) {
+ // TODO(kschaaf): If the pool is shared across turns, hostProps
+ // need to be re-set to reused instances in addition to item
+ inst._setPendingProperty(this.as, item);
+ inst._setPendingProperty(this.indexAs, instIdx);
+ inst._setPendingProperty(this.itemsIndexAs, itemIdx);
+ inst._flushProperties();
+ } else {
+ inst = this.__stampInstance(item, instIdx, itemIdx);
+ }
+ let beforeRow = this.__instances[instIdx + 1];
+ let beforeNode = beforeRow ? beforeRow.children[0] : this;
+ this.parentNode.insertBefore(inst.root, beforeNode);
+ this.__instances[instIdx] = inst;
+ return inst;
+ }
+
+ // Implements extension point from Templatize mixin
+ /**
+ * Shows or hides the template instance top level child elements. For
+ * text nodes, `textContent` is removed while "hidden" and replaced when
+ * "shown."
+ * @param {boolean} hidden Set to true to hide the children;
+ * set to false to show them.
+ * @return {void}
+ * @protected
+ */
+ _showHideChildren(hidden) {
+ for (let i=0; i<this.__instances.length; i++) {
+ this.__instances[i]._showHideChildren(hidden);
+ }
+ }
+
+ // Called as a side effect of a host items.<key>.<path> path change,
+ // responsible for notifying item.<path> changes to inst for key
+ __handleItemPath(path, value) {
+ let itemsPath = path.slice(6); // 'items.'.length == 6
+ let dot = itemsPath.indexOf('.');
+ let itemsIdx = dot < 0 ? itemsPath : itemsPath.substring(0, dot);
+ // If path was index into array...
+ if (itemsIdx == parseInt(itemsIdx, 10)) {
+ let itemSubPath = dot < 0 ? '' : itemsPath.substring(dot+1);
+ // If the path is observed, it will trigger a full refresh
+ this.__handleObservedPaths(itemSubPath);
+ // Note, even if a rull refresh is triggered, always do the path
+ // notification because unless mutableData is used for dom-repeat
+ // and all elements in the instance subtree, a full refresh may
+ // not trigger the proper update.
+ let instIdx = this.__itemsIdxToInstIdx[itemsIdx];
+ let inst = this.__instances[instIdx];
+ if (inst) {
+ let itemPath = this.as + (itemSubPath ? '.' + itemSubPath : '');
+ // This is effectively `notifyPath`, but avoids some of the overhead
+ // of the public API
+ inst._setPendingPropertyOrPath(itemPath, value, false, true);
+ inst._flushProperties();
+ }
+ return true;
+ }
+ }
+
+ /**
+ * Returns the item associated with a given element stamped by
+ * this `dom-repeat`.
+ *
+ * Note, to modify sub-properties of the item,
+ * `modelForElement(el).set('item.<sub-prop>', value)`
+ * should be used.
+ *
+ * @param {!HTMLElement} el Element for which to return the item.
+ * @return {*} Item associated with the element.
+ */
+ itemForElement(el) {
+ let instance = this.modelForElement(el);
+ return instance && instance[this.as];
+ }
+
+ /**
+ * Returns the inst index for a given element stamped by this `dom-repeat`.
+ * If `sort` is provided, the index will reflect the sorted order (rather
+ * than the original array order).
+ *
+ * @param {!HTMLElement} el Element for which to return the index.
+ * @return {?number} Row index associated with the element (note this may
+ * not correspond to the array index if a user `sort` is applied).
+ */
+ indexForElement(el) {
+ let instance = this.modelForElement(el);
+ return instance && instance[this.indexAs];
+ }
+
+ /**
+ * Returns the template "model" associated with a given element, which
+ * serves as the binding scope for the template instance the element is
+ * contained in. A template model is an instance of `Polymer.Base`, and
+ * should be used to manipulate data associated with this template instance.
+ *
+ * Example:
+ *
+ * let model = modelForElement(el);
+ * if (model.index < 10) {
+ * model.set('item.checked', true);
+ * }
+ *
+ * @param {!HTMLElement} el Element for which to return a template model.
+ * @return {TemplateInstanceBase} Model representing the binding scope for
+ * the element.
+ */
+ modelForElement(el) {
+ return Polymer.Templatize.modelForElement(this.template, el);
+ }
+
+ }
+
+ customElements.define(DomRepeat.is, DomRepeat);
+
+ Polymer.DomRepeat = DomRepeat;
+
+})();
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/class.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/class.html
new file mode 100644
index 00000000000..afe838cc575
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/class.html
@@ -0,0 +1,376 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="legacy-element-mixin.html">
+<script>
+
+ (function() {
+
+ 'use strict';
+
+ let metaProps = {
+ attached: true,
+ detached: true,
+ ready: true,
+ created: true,
+ beforeRegister: true,
+ registered: true,
+ attributeChanged: true,
+ // meta objects
+ behaviors: true
+ };
+
+ /**
+ * Applies a "legacy" behavior or array of behaviors to the provided class.
+ *
+ * Note: this method will automatically also apply the `Polymer.LegacyElementMixin`
+ * to ensure that any legacy behaviors can rely on legacy Polymer API on
+ * the underlying element.
+ *
+ * @template T
+ * @param {!Object|!Array<!Object>} behaviors Behavior object or array of behaviors.
+ * @param {function(new:T)} klass Element class.
+ * @return {function(new:T)} Returns a new Element class extended by the
+ * passed in `behaviors` and also by `Polymer.LegacyElementMixin`.
+ * @memberof Polymer
+ * @suppress {invalidCasts, checkTypes}
+ */
+ function mixinBehaviors(behaviors, klass) {
+ if (!behaviors) {
+ klass = /** @type {HTMLElement} */(klass); // eslint-disable-line no-self-assign
+ return klass;
+ }
+ // NOTE: ensure the behavior is extending a class with
+ // legacy element api. This is necessary since behaviors expect to be able
+ // to access 1.x legacy api.
+ klass = Polymer.LegacyElementMixin(klass);
+ if (!Array.isArray(behaviors)) {
+ behaviors = [behaviors];
+ }
+ let superBehaviors = klass.prototype.behaviors;
+ // get flattened, deduped list of behaviors *not* already on super class
+ behaviors = flattenBehaviors(behaviors, null, superBehaviors);
+ // mixin new behaviors
+ klass = _mixinBehaviors(behaviors, klass);
+ if (superBehaviors) {
+ behaviors = superBehaviors.concat(behaviors);
+ }
+ // Set behaviors on prototype for BC...
+ klass.prototype.behaviors = behaviors;
+ return klass;
+ }
+
+ // NOTE:
+ // 1.x
+ // Behaviors were mixed in *in reverse order* and de-duped on the fly.
+ // The rule was that behavior properties were copied onto the element
+ // prototype if and only if the property did not already exist.
+ // Given: Polymer{ behaviors: [A, B, C, A, B]}, property copy order was:
+ // (1), B, (2), A, (3) C. This means prototype properties win over
+ // B properties win over A win over C. This mirrors what would happen
+ // with inheritance if element extended B extended A extended C.
+ //
+ // Again given, Polymer{ behaviors: [A, B, C, A, B]}, the resulting
+ // `behaviors` array was [C, A, B].
+ // Behavior lifecycle methods were called in behavior array order
+ // followed by the element, e.g. (1) C.created, (2) A.created,
+ // (3) B.created, (4) element.created. There was no support for
+ // super, and "super-behavior" methods were callable only by name).
+ //
+ // 2.x
+ // Behaviors are made into proper mixins which live in the
+ // element's prototype chain. Behaviors are placed in the element prototype
+ // eldest to youngest and de-duped youngest to oldest:
+ // So, first [A, B, C, A, B] becomes [C, A, B] then,
+ // the element prototype becomes (oldest) (1) Polymer.Element, (2) class(C),
+ // (3) class(A), (4) class(B), (5) class(Polymer({...})).
+ // Result:
+ // This means element properties win over B properties win over A win
+ // over C. (same as 1.x)
+ // If lifecycle is called (super then me), order is
+ // (1) C.created, (2) A.created, (3) B.created, (4) element.created
+ // (again same as 1.x)
+ function _mixinBehaviors(behaviors, klass) {
+ for (let i=0; i<behaviors.length; i++) {
+ let b = behaviors[i];
+ if (b) {
+ klass = Array.isArray(b) ? _mixinBehaviors(b, klass) :
+ GenerateClassFromInfo(b, klass);
+ }
+ }
+ return klass;
+ }
+
+ /**
+ * @param {Array} behaviors List of behaviors to flatten.
+ * @param {Array=} list Target list to flatten behaviors into.
+ * @param {Array=} exclude List of behaviors to exclude from the list.
+ * @return {!Array} Returns the list of flattened behaviors.
+ */
+ function flattenBehaviors(behaviors, list, exclude) {
+ list = list || [];
+ for (let i=behaviors.length-1; i >= 0; i--) {
+ let b = behaviors[i];
+ if (b) {
+ if (Array.isArray(b)) {
+ flattenBehaviors(b, list);
+ } else {
+ // dedup
+ if (list.indexOf(b) < 0 && (!exclude || exclude.indexOf(b) < 0)) {
+ list.unshift(b);
+ }
+ }
+ } else {
+ console.warn('behavior is null, check for missing or 404 import');
+ }
+ }
+ return list;
+ }
+
+ /**
+ * @param {!PolymerInit} info Polymer info object
+ * @param {function(new:HTMLElement)} Base base class to extend with info object
+ * @return {function(new:HTMLElement)} Generated class
+ * @suppress {checkTypes}
+ * @private
+ */
+ function GenerateClassFromInfo(info, Base) {
+
+ class PolymerGenerated extends Base {
+
+ static get properties() {
+ return info.properties;
+ }
+
+ static get observers() {
+ return info.observers;
+ }
+
+ /**
+ * @return {HTMLTemplateElement} template for this class
+ */
+ static get template() {
+ // get template first from any imperative set in `info._template`
+ return info._template ||
+ // next look in dom-module associated with this element's is.
+ Polymer.DomModule && Polymer.DomModule.import(this.is, 'template') ||
+ // next look for superclass template (note: use superclass symbol
+ // to ensure correct `this.is`)
+ Base.template ||
+ // finally fall back to `_template` in element's prototype.
+ this.prototype._template ||
+ null;
+ }
+
+ /**
+ * @return {void}
+ */
+ created() {
+ super.created();
+ if (info.created) {
+ info.created.call(this);
+ }
+ }
+
+ /**
+ * @return {void}
+ */
+ _registered() {
+ super._registered();
+ /* NOTE: `beforeRegister` is called here for bc, but the behavior
+ is different than in 1.x. In 1.0, the method was called *after*
+ mixing prototypes together but *before* processing of meta-objects.
+ However, dynamic effects can still be set here and can be done either
+ in `beforeRegister` or `registered`. It is no longer possible to set
+ `is` in `beforeRegister` as you could in 1.x.
+ */
+ if (info.beforeRegister) {
+ info.beforeRegister.call(Object.getPrototypeOf(this));
+ }
+ if (info.registered) {
+ info.registered.call(Object.getPrototypeOf(this));
+ }
+ }
+
+ /**
+ * @return {void}
+ */
+ _applyListeners() {
+ super._applyListeners();
+ if (info.listeners) {
+ for (let l in info.listeners) {
+ this._addMethodEventListenerToNode(this, l, info.listeners[l]);
+ }
+ }
+ }
+
+ // note: exception to "super then me" rule;
+ // do work before calling super so that super attributes
+ // only apply if not already set.
+ /**
+ * @return {void}
+ */
+ _ensureAttributes() {
+ if (info.hostAttributes) {
+ for (let a in info.hostAttributes) {
+ this._ensureAttribute(a, info.hostAttributes[a]);
+ }
+ }
+ super._ensureAttributes();
+ }
+
+ /**
+ * @return {void}
+ */
+ ready() {
+ super.ready();
+ if (info.ready) {
+ info.ready.call(this);
+ }
+ }
+
+ /**
+ * @return {void}
+ */
+ attached() {
+ super.attached();
+ if (info.attached) {
+ info.attached.call(this);
+ }
+ }
+
+ /**
+ * @return {void}
+ */
+ detached() {
+ super.detached();
+ if (info.detached) {
+ info.detached.call(this);
+ }
+ }
+
+ /**
+ * Implements native Custom Elements `attributeChangedCallback` to
+ * set an attribute value to a property via `_attributeToProperty`.
+ *
+ * @param {string} name Name of attribute that changed
+ * @param {?string} old Old attribute value
+ * @param {?string} value New attribute value
+ * @return {void}
+ */
+ attributeChanged(name, old, value) {
+ super.attributeChanged(name, old, value);
+ if (info.attributeChanged) {
+ info.attributeChanged.call(this, name, old, value);
+ }
+ }
+ }
+
+ PolymerGenerated.generatedFrom = info;
+
+ for (let p in info) {
+ // NOTE: cannot copy `metaProps` methods onto prototype at least because
+ // `super.ready` must be called and is not included in the user fn.
+ if (!(p in metaProps)) {
+ let pd = Object.getOwnPropertyDescriptor(info, p);
+ if (pd) {
+ Object.defineProperty(PolymerGenerated.prototype, p, pd);
+ }
+ }
+ }
+
+ return PolymerGenerated;
+ }
+
+ /**
+ * Generates a class that extends `Polymer.LegacyElement` based on the
+ * provided info object. Metadata objects on the `info` object
+ * (`properties`, `observers`, `listeners`, `behaviors`, `is`) are used
+ * for Polymer's meta-programming systems, and any functions are copied
+ * to the generated class.
+ *
+ * Valid "metadata" values are as follows:
+ *
+ * `is`: String providing the tag name to register the element under. In
+ * addition, if a `dom-module` with the same id exists, the first template
+ * in that `dom-module` will be stamped into the shadow root of this element,
+ * with support for declarative event listeners (`on-...`), Polymer data
+ * bindings (`[[...]]` and `{{...}}`), and id-based node finding into
+ * `this.$`.
+ *
+ * `properties`: Object describing property-related metadata used by Polymer
+ * features (key: property names, value: object containing property metadata).
+ * Valid keys in per-property metadata include:
+ * - `type` (String|Number|Object|Array|...): Used by
+ * `attributeChangedCallback` to determine how string-based attributes
+ * are deserialized to JavaScript property values.
+ * - `notify` (boolean): Causes a change in the property to fire a
+ * non-bubbling event called `<property>-changed`. Elements that have
+ * enabled two-way binding to the property use this event to observe changes.
+ * - `readOnly` (boolean): Creates a getter for the property, but no setter.
+ * To set a read-only property, use the private setter method
+ * `_setProperty(property, value)`.
+ * - `observer` (string): Observer method name that will be called when
+ * the property changes. The arguments of the method are
+ * `(value, previousValue)`.
+ * - `computed` (string): String describing method and dependent properties
+ * for computing the value of this property (e.g. `'computeFoo(bar, zot)'`).
+ * Computed properties are read-only by default and can only be changed
+ * via the return value of the computing method.
+ *
+ * `observers`: Array of strings describing multi-property observer methods
+ * and their dependent properties (e.g. `'observeABC(a, b, c)'`).
+ *
+ * `listeners`: Object describing event listeners to be added to each
+ * instance of this element (key: event name, value: method name).
+ *
+ * `behaviors`: Array of additional `info` objects containing metadata
+ * and callbacks in the same format as the `info` object here which are
+ * merged into this element.
+ *
+ * `hostAttributes`: Object listing attributes to be applied to the host
+ * once created (key: attribute name, value: attribute value). Values
+ * are serialized based on the type of the value. Host attributes should
+ * generally be limited to attributes such as `tabIndex` and `aria-...`.
+ * Attributes in `hostAttributes` are only applied if a user-supplied
+ * attribute is not already present (attributes in markup override
+ * `hostAttributes`).
+ *
+ * In addition, the following Polymer-specific callbacks may be provided:
+ * - `registered`: called after first instance of this element,
+ * - `created`: called during `constructor`
+ * - `attached`: called during `connectedCallback`
+ * - `detached`: called during `disconnectedCallback`
+ * - `ready`: called before first `attached`, after all properties of
+ * this element have been propagated to its template and all observers
+ * have run
+ *
+ * @param {!PolymerInit} info Object containing Polymer metadata and functions
+ * to become class methods.
+ * @return {function(new:HTMLElement)} Generated class
+ * @memberof Polymer
+ */
+ Polymer.Class = function(info) {
+ if (!info) {
+ console.warn('Polymer.Class requires `info` argument');
+ }
+ let klass = GenerateClassFromInfo(info, info.behaviors ?
+ // note: mixinBehaviors ensures `LegacyElementMixin`.
+ mixinBehaviors(info.behaviors, HTMLElement) :
+ Polymer.LegacyElementMixin(HTMLElement));
+ // decorate klass with registration info
+ klass.is = info.is;
+ return klass;
+ };
+
+ Polymer.mixinBehaviors = mixinBehaviors;
+
+ })();
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/legacy-element-mixin.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/legacy-element-mixin.html
new file mode 100644
index 00000000000..7306c651407
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/legacy-element-mixin.html
@@ -0,0 +1,1003 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../../../shadycss/apply-shim.html">
+<link rel="import" href="../mixins/element-mixin.html">
+<link rel="import" href="../mixins/gesture-event-listeners.html">
+<link rel="import" href="../mixins/dir-mixin.html">
+<link rel="import" href="../utils/mixin.html">
+<link rel="import" href="../utils/import-href.html">
+<link rel="import" href="../utils/render-status.html">
+<link rel="import" href="../utils/unresolved.html">
+<link rel="import" href="polymer.dom.html">
+
+<script>
+(function() {
+
+ 'use strict';
+
+ let styleInterface = window.ShadyCSS;
+
+ /**
+ * Element class mixin that provides Polymer's "legacy" API intended to be
+ * backward-compatible to the greatest extent possible with the API
+ * found on the Polymer 1.x `Polymer.Base` prototype applied to all elements
+ * defined using the `Polymer({...})` function.
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin Polymer.ElementMixin
+ * @appliesMixin Polymer.GestureEventListeners
+ * @property isAttached {boolean} Set to `true` in this element's
+ * `connectedCallback` and `false` in `disconnectedCallback`
+ * @memberof Polymer
+ * @summary Element class mixin that provides Polymer's "legacy" API
+ */
+ Polymer.LegacyElementMixin = Polymer.dedupingMixin((base) => {
+
+ /**
+ * @constructor
+ * @extends {base}
+ * @implements {Polymer_ElementMixin}
+ * @implements {Polymer_GestureEventListeners}
+ * @implements {Polymer_DirMixin}
+ */
+ const legacyElementBase = Polymer.DirMixin(Polymer.GestureEventListeners(Polymer.ElementMixin(base)));
+
+ /**
+ * Map of simple names to touch action names
+ * @dict
+ */
+ const DIRECTION_MAP = {
+ 'x': 'pan-x',
+ 'y': 'pan-y',
+ 'none': 'none',
+ 'all': 'auto'
+ };
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @extends {legacyElementBase}
+ * @implements {Polymer_LegacyElementMixin}
+ * @unrestricted
+ */
+ class LegacyElement extends legacyElementBase {
+
+ constructor() {
+ super();
+ /** @type {boolean} */
+ this.isAttached;
+ /** @type {WeakMap<!Element, !Object<string, !Function>>} */
+ this.__boundListeners;
+ /** @type {Object<string, Function>} */
+ this._debouncers;
+ // Ensure listeners are applied immediately so that they are
+ // added before declarative event listeners. This allows an element to
+ // decorate itself via an event prior to any declarative listeners
+ // seeing the event. Note, this ensures compatibility with 1.x ordering.
+ this._applyListeners();
+ }
+
+ /**
+ * Legacy callback called during the `constructor`, for overriding
+ * by the user.
+ * @return {void}
+ */
+ created() {}
+
+ /**
+ * Provides an implementation of `connectedCallback`
+ * which adds Polymer legacy API's `attached` method.
+ * @return {void}
+ * @override
+ */
+ connectedCallback() {
+ super.connectedCallback();
+ this.isAttached = true;
+ this.attached();
+ }
+
+ /**
+ * Legacy callback called during `connectedCallback`, for overriding
+ * by the user.
+ * @return {void}
+ */
+ attached() {}
+
+ /**
+ * Provides an implementation of `disconnectedCallback`
+ * which adds Polymer legacy API's `detached` method.
+ * @return {void}
+ * @override
+ */
+ disconnectedCallback() {
+ super.disconnectedCallback();
+ this.isAttached = false;
+ this.detached();
+ }
+
+ /**
+ * Legacy callback called during `disconnectedCallback`, for overriding
+ * by the user.
+ * @return {void}
+ */
+ detached() {}
+
+ /**
+ * Provides an override implementation of `attributeChangedCallback`
+ * which adds the Polymer legacy API's `attributeChanged` method.
+ * @param {string} name Name of attribute.
+ * @param {?string} old Old value of attribute.
+ * @param {?string} value Current value of attribute.
+ * @return {void}
+ * @override
+ */
+ attributeChangedCallback(name, old, value) {
+ if (old !== value) {
+ super.attributeChangedCallback(name, old, value);
+ this.attributeChanged(name, old, value);
+ }
+ }
+
+ /**
+ * Legacy callback called during `attributeChangedChallback`, for overriding
+ * by the user.
+ * @param {string} name Name of attribute.
+ * @param {?string} old Old value of attribute.
+ * @param {?string} value Current value of attribute.
+ * @return {void}
+ */
+ attributeChanged(name, old, value) {} // eslint-disable-line no-unused-vars
+
+ /**
+ * Overrides the default `Polymer.PropertyEffects` implementation to
+ * add support for class initialization via the `_registered` callback.
+ * This is called only when the first instance of the element is created.
+ *
+ * @return {void}
+ * @override
+ * @suppress {invalidCasts}
+ */
+ _initializeProperties() {
+ let proto = Object.getPrototypeOf(this);
+ if (!proto.hasOwnProperty('__hasRegisterFinished')) {
+ proto.__hasRegisterFinished = true;
+ this._registered();
+ }
+ super._initializeProperties();
+ this.root = /** @type {HTMLElement} */(this);
+ this.created();
+ }
+
+ /**
+ * Called automatically when an element is initializing.
+ * Users may override this method to perform class registration time
+ * work. The implementation should ensure the work is performed
+ * only once for the class.
+ * @protected
+ * @return {void}
+ */
+ _registered() {}
+
+ /**
+ * Overrides the default `Polymer.PropertyEffects` implementation to
+ * add support for installing `hostAttributes` and `listeners`.
+ *
+ * @return {void}
+ * @override
+ */
+ ready() {
+ this._ensureAttributes();
+ super.ready();
+ }
+
+ /**
+ * Ensures an element has required attributes. Called when the element
+ * is being readied via `ready`. Users should override to set the
+ * element's required attributes. The implementation should be sure
+ * to check and not override existing attributes added by
+ * the user of the element. Typically, setting attributes should be left
+ * to the element user and not done here; reasonable exceptions include
+ * setting aria roles and focusability.
+ * @protected
+ * @return {void}
+ */
+ _ensureAttributes() {}
+
+ /**
+ * Adds element event listeners. Called when the element
+ * is being readied via `ready`. Users should override to
+ * add any required element event listeners.
+ * In performance critical elements, the work done here should be kept
+ * to a minimum since it is done before the element is rendered. In
+ * these elements, consider adding listeners asynchronously so as not to
+ * block render.
+ * @protected
+ * @return {void}
+ */
+ _applyListeners() {}
+
+ /**
+ * Converts a typed JavaScript value to a string.
+ *
+ * Note this method is provided as backward-compatible legacy API
+ * only. It is not directly called by any Polymer features. To customize
+ * how properties are serialized to attributes for attribute bindings and
+ * `reflectToAttribute: true` properties as well as this method, override
+ * the `_serializeValue` method provided by `Polymer.PropertyAccessors`.
+ *
+ * @param {*} value Value to deserialize
+ * @return {string | undefined} Serialized value
+ */
+ serialize(value) {
+ return this._serializeValue(value);
+ }
+
+ /**
+ * Converts a string to a typed JavaScript value.
+ *
+ * Note this method is provided as backward-compatible legacy API
+ * only. It is not directly called by any Polymer features. To customize
+ * how attributes are deserialized to properties for in
+ * `attributeChangedCallback`, override `_deserializeValue` method
+ * provided by `Polymer.PropertyAccessors`.
+ *
+ * @param {string} value String to deserialize
+ * @param {*} type Type to deserialize the string to
+ * @return {*} Returns the deserialized value in the `type` given.
+ */
+ deserialize(value, type) {
+ return this._deserializeValue(value, type);
+ }
+
+ /**
+ * Serializes a property to its associated attribute.
+ *
+ * Note this method is provided as backward-compatible legacy API
+ * only. It is not directly called by any Polymer features.
+ *
+ * @param {string} property Property name to reflect.
+ * @param {string=} attribute Attribute name to reflect.
+ * @param {*=} value Property value to reflect.
+ * @return {void}
+ */
+ reflectPropertyToAttribute(property, attribute, value) {
+ this._propertyToAttribute(property, attribute, value);
+ }
+
+ /**
+ * Sets a typed value to an HTML attribute on a node.
+ *
+ * Note this method is provided as backward-compatible legacy API
+ * only. It is not directly called by any Polymer features.
+ *
+ * @param {*} value Value to serialize.
+ * @param {string} attribute Attribute name to serialize to.
+ * @param {Element} node Element to set attribute to.
+ * @return {void}
+ */
+ serializeValueToAttribute(value, attribute, node) {
+ this._valueToNodeAttribute(/** @type {Element} */ (node || this), value, attribute);
+ }
+
+ /**
+ * Copies own properties (including accessor descriptors) from a source
+ * object to a target object.
+ *
+ * @param {Object} prototype Target object to copy properties to.
+ * @param {Object} api Source object to copy properties from.
+ * @return {Object} prototype object that was passed as first argument.
+ */
+ extend(prototype, api) {
+ if (!(prototype && api)) {
+ return prototype || api;
+ }
+ let n$ = Object.getOwnPropertyNames(api);
+ for (let i=0, n; (i<n$.length) && (n=n$[i]); i++) {
+ let pd = Object.getOwnPropertyDescriptor(api, n);
+ if (pd) {
+ Object.defineProperty(prototype, n, pd);
+ }
+ }
+ return prototype;
+ }
+
+ /**
+ * Copies props from a source object to a target object.
+ *
+ * Note, this method uses a simple `for...in` strategy for enumerating
+ * properties. To ensure only `ownProperties` are copied from source
+ * to target and that accessor implementations are copied, use `extend`.
+ *
+ * @param {!Object} target Target object to copy properties to.
+ * @param {!Object} source Source object to copy properties from.
+ * @return {!Object} Target object that was passed as first argument.
+ */
+ mixin(target, source) {
+ for (let i in source) {
+ target[i] = source[i];
+ }
+ return target;
+ }
+
+ /**
+ * Sets the prototype of an object.
+ *
+ * Note this method is provided as backward-compatible legacy API
+ * only. It is not directly called by any Polymer features.
+ * @param {Object} object The object on which to set the prototype.
+ * @param {Object} prototype The prototype that will be set on the given
+ * `object`.
+ * @return {Object} Returns the given `object` with its prototype set
+ * to the given `prototype` object.
+ */
+ chainObject(object, prototype) {
+ if (object && prototype && object !== prototype) {
+ object.__proto__ = prototype;
+ }
+ return object;
+ }
+
+ /* **** Begin Template **** */
+
+ /**
+ * Calls `importNode` on the `content` of the `template` specified and
+ * returns a document fragment containing the imported content.
+ *
+ * @param {HTMLTemplateElement} template HTML template element to instance.
+ * @return {!DocumentFragment} Document fragment containing the imported
+ * template content.
+ */
+ instanceTemplate(template) {
+ let content = this.constructor._contentForTemplate(template);
+ let dom = /** @type {!DocumentFragment} */
+ (document.importNode(content, true));
+ return dom;
+ }
+
+ /* **** Begin Events **** */
+
+
+
+ /**
+ * Dispatches a custom event with an optional detail value.
+ *
+ * @param {string} type Name of event type.
+ * @param {*=} detail Detail value containing event-specific
+ * payload.
+ * @param {{ bubbles: (boolean|undefined), cancelable: (boolean|undefined), composed: (boolean|undefined) }=}
+ * options Object specifying options. These may include:
+ * `bubbles` (boolean, defaults to `true`),
+ * `cancelable` (boolean, defaults to false), and
+ * `node` on which to fire the event (HTMLElement, defaults to `this`).
+ * @return {!Event} The new event that was fired.
+ */
+ fire(type, detail, options) {
+ options = options || {};
+ detail = (detail === null || detail === undefined) ? {} : detail;
+ let event = new Event(type, {
+ bubbles: options.bubbles === undefined ? true : options.bubbles,
+ cancelable: Boolean(options.cancelable),
+ composed: options.composed === undefined ? true: options.composed
+ });
+ event.detail = detail;
+ let node = options.node || this;
+ node.dispatchEvent(event);
+ return event;
+ }
+
+ /**
+ * Convenience method to add an event listener on a given element,
+ * late bound to a named method on this element.
+ *
+ * @param {Element} node Element to add event listener to.
+ * @param {string} eventName Name of event to listen for.
+ * @param {string} methodName Name of handler method on `this` to call.
+ * @return {void}
+ */
+ listen(node, eventName, methodName) {
+ node = /** @type {!Element} */ (node || this);
+ let hbl = this.__boundListeners ||
+ (this.__boundListeners = new WeakMap());
+ let bl = hbl.get(node);
+ if (!bl) {
+ bl = {};
+ hbl.set(node, bl);
+ }
+ let key = eventName + methodName;
+ if (!bl[key]) {
+ bl[key] = this._addMethodEventListenerToNode(
+ node, eventName, methodName, this);
+ }
+ }
+
+ /**
+ * Convenience method to remove an event listener from a given element,
+ * late bound to a named method on this element.
+ *
+ * @param {Element} node Element to remove event listener from.
+ * @param {string} eventName Name of event to stop listening to.
+ * @param {string} methodName Name of handler method on `this` to not call
+ anymore.
+ * @return {void}
+ */
+ unlisten(node, eventName, methodName) {
+ node = /** @type {!Element} */ (node || this);
+ let bl = this.__boundListeners && this.__boundListeners.get(node);
+ let key = eventName + methodName;
+ let handler = bl && bl[key];
+ if (handler) {
+ this._removeEventListenerFromNode(node, eventName, handler);
+ bl[key] = null;
+ }
+ }
+
+ /**
+ * Override scrolling behavior to all direction, one direction, or none.
+ *
+ * Valid scroll directions:
+ * - 'all': scroll in any direction
+ * - 'x': scroll only in the 'x' direction
+ * - 'y': scroll only in the 'y' direction
+ * - 'none': disable scrolling for this node
+ *
+ * @param {string=} direction Direction to allow scrolling
+ * Defaults to `all`.
+ * @param {Element=} node Element to apply scroll direction setting.
+ * Defaults to `this`.
+ * @return {void}
+ */
+ setScrollDirection(direction, node) {
+ Polymer.Gestures.setTouchAction(/** @type {Element} */ (node || this), DIRECTION_MAP[direction] || 'auto');
+ }
+ /* **** End Events **** */
+
+ /**
+ * Convenience method to run `querySelector` on this local DOM scope.
+ *
+ * This function calls `Polymer.dom(this.root).querySelector(slctr)`.
+ *
+ * @param {string} slctr Selector to run on this local DOM scope
+ * @return {Element} Element found by the selector, or null if not found.
+ */
+ $$(slctr) {
+ return this.root.querySelector(slctr);
+ }
+
+ /**
+ * Return the element whose local dom within which this element
+ * is contained. This is a shorthand for
+ * `this.getRootNode().host`.
+ * @this {Element}
+ */
+ get domHost() {
+ let root = this.getRootNode();
+ return (root instanceof DocumentFragment) ? /** @type {ShadowRoot} */ (root).host : root;
+ }
+
+ /**
+ * Force this element to distribute its children to its local dom.
+ * This should not be necessary as of Polymer 2.0.2 and is provided only
+ * for backwards compatibility.
+ * @return {void}
+ */
+ distributeContent() {
+ if (window.ShadyDOM && this.shadowRoot) {
+ ShadyDOM.flush();
+ }
+ }
+
+ /**
+ * Returns a list of nodes that are the effective childNodes. The effective
+ * childNodes list is the same as the element's childNodes except that
+ * any `<content>` elements are replaced with the list of nodes distributed
+ * to the `<content>`, the result of its `getDistributedNodes` method.
+ * @return {!Array<!Node>} List of effective child nodes.
+ * @suppress {invalidCasts} LegacyElementMixin must be applied to an HTMLElement
+ */
+ getEffectiveChildNodes() {
+ const thisEl = /** @type {Element} */ (this);
+ const domApi = /** @type {Polymer.DomApi} */(Polymer.dom(thisEl));
+ return domApi.getEffectiveChildNodes();
+ }
+
+ /**
+ * Returns a list of nodes distributed within this element that match
+ * `selector`. These can be dom children or elements distributed to
+ * children that are insertion points.
+ * @param {string} selector Selector to run.
+ * @return {!Array<!Node>} List of distributed elements that match selector.
+ * @suppress {invalidCasts} LegacyElementMixin must be applied to an HTMLElement
+ */
+ queryDistributedElements(selector) {
+ const thisEl = /** @type {Element} */ (this);
+ const domApi = /** @type {Polymer.DomApi} */(Polymer.dom(thisEl));
+ return domApi.queryDistributedElements(selector);
+ }
+
+ /**
+ * Returns a list of elements that are the effective children. The effective
+ * children list is the same as the element's children except that
+ * any `<content>` elements are replaced with the list of elements
+ * distributed to the `<content>`.
+ *
+ * @return {!Array<!Node>} List of effective children.
+ */
+ getEffectiveChildren() {
+ let list = this.getEffectiveChildNodes();
+ return list.filter(function(/** @type {!Node} */ n) {
+ return (n.nodeType === Node.ELEMENT_NODE);
+ });
+ }
+
+ /**
+ * Returns a string of text content that is the concatenation of the
+ * text content's of the element's effective childNodes (the elements
+ * returned by <a href="#getEffectiveChildNodes>getEffectiveChildNodes</a>.
+ *
+ * @return {string} List of effective children.
+ */
+ getEffectiveTextContent() {
+ let cn = this.getEffectiveChildNodes();
+ let tc = [];
+ for (let i=0, c; (c = cn[i]); i++) {
+ if (c.nodeType !== Node.COMMENT_NODE) {
+ tc.push(c.textContent);
+ }
+ }
+ return tc.join('');
+ }
+
+ /**
+ * Returns the first effective childNode within this element that
+ * match `selector`. These can be dom child nodes or elements distributed
+ * to children that are insertion points.
+ * @param {string} selector Selector to run.
+ * @return {Node} First effective child node that matches selector.
+ */
+ queryEffectiveChildren(selector) {
+ let e$ = this.queryDistributedElements(selector);
+ return e$ && e$[0];
+ }
+
+ /**
+ * Returns a list of effective childNodes within this element that
+ * match `selector`. These can be dom child nodes or elements distributed
+ * to children that are insertion points.
+ * @param {string} selector Selector to run.
+ * @return {!Array<!Node>} List of effective child nodes that match selector.
+ */
+ queryAllEffectiveChildren(selector) {
+ return this.queryDistributedElements(selector);
+ }
+
+ /**
+ * Returns a list of nodes distributed to this element's `<slot>`.
+ *
+ * If this element contains more than one `<slot>` in its local DOM,
+ * an optional selector may be passed to choose the desired content.
+ *
+ * @param {string=} slctr CSS selector to choose the desired
+ * `<slot>`. Defaults to `content`.
+ * @return {!Array<!Node>} List of distributed nodes for the `<slot>`.
+ */
+ getContentChildNodes(slctr) {
+ let content = this.root.querySelector(slctr || 'slot');
+ return content ? /** @type {Polymer.DomApi} */(Polymer.dom(content)).getDistributedNodes() : [];
+ }
+
+ /**
+ * Returns a list of element children distributed to this element's
+ * `<slot>`.
+ *
+ * If this element contains more than one `<slot>` in its
+ * local DOM, an optional selector may be passed to choose the desired
+ * content. This method differs from `getContentChildNodes` in that only
+ * elements are returned.
+ *
+ * @param {string=} slctr CSS selector to choose the desired
+ * `<content>`. Defaults to `content`.
+ * @return {!Array<!HTMLElement>} List of distributed nodes for the
+ * `<slot>`.
+ * @suppress {invalidCasts}
+ */
+ getContentChildren(slctr) {
+ let children = /** @type {!Array<!HTMLElement>} */(this.getContentChildNodes(slctr).filter(function(n) {
+ return (n.nodeType === Node.ELEMENT_NODE);
+ }));
+ return children;
+ }
+
+ /**
+ * Checks whether an element is in this element's light DOM tree.
+ *
+ * @param {?Node} node The element to be checked.
+ * @return {boolean} true if node is in this element's light DOM tree.
+ * @suppress {invalidCasts} LegacyElementMixin must be applied to an HTMLElement
+ */
+ isLightDescendant(node) {
+ const thisNode = /** @type {Node} */ (this);
+ return thisNode !== node && thisNode.contains(node) &&
+ thisNode.getRootNode() === node.getRootNode();
+ }
+
+ /**
+ * Checks whether an element is in this element's local DOM tree.
+ *
+ * @param {!Element} node The element to be checked.
+ * @return {boolean} true if node is in this element's local DOM tree.
+ */
+ isLocalDescendant(node) {
+ return this.root === node.getRootNode();
+ }
+
+ /**
+ * No-op for backwards compatibility. This should now be handled by
+ * ShadyCss library.
+ * @param {*} container Unused
+ * @param {*} shouldObserve Unused
+ * @return {void}
+ */
+ scopeSubtree(container, shouldObserve) { // eslint-disable-line no-unused-vars
+ }
+
+ /**
+ * Returns the computed style value for the given property.
+ * @param {string} property The css property name.
+ * @return {string} Returns the computed css property value for the given
+ * `property`.
+ * @suppress {invalidCasts} LegacyElementMixin must be applied to an HTMLElement
+ */
+ getComputedStyleValue(property) {
+ return styleInterface.getComputedStyleValue(/** @type {!Element} */(this), property);
+ }
+
+ // debounce
+
+ /**
+ * Call `debounce` to collapse multiple requests for a named task into
+ * one invocation which is made after the wait time has elapsed with
+ * no new request. If no wait time is given, the callback will be called
+ * at microtask timing (guaranteed before paint).
+ *
+ * debouncedClickAction(e) {
+ * // will not call `processClick` more than once per 100ms
+ * this.debounce('click', function() {
+ * this.processClick();
+ * } 100);
+ * }
+ *
+ * @param {string} jobName String to identify the debounce job.
+ * @param {function():void} callback Function that is called (with `this`
+ * context) when the wait time elapses.
+ * @param {number} wait Optional wait time in milliseconds (ms) after the
+ * last signal that must elapse before invoking `callback`
+ * @return {!Object} Returns a debouncer object on which exists the
+ * following methods: `isActive()` returns true if the debouncer is
+ * active; `cancel()` cancels the debouncer if it is active;
+ * `flush()` immediately invokes the debounced callback if the debouncer
+ * is active.
+ */
+ debounce(jobName, callback, wait) {
+ this._debouncers = this._debouncers || {};
+ return this._debouncers[jobName] = Polymer.Debouncer.debounce(
+ this._debouncers[jobName]
+ , wait > 0 ? Polymer.Async.timeOut.after(wait) : Polymer.Async.microTask
+ , callback.bind(this));
+ }
+
+ /**
+ * Returns whether a named debouncer is active.
+ *
+ * @param {string} jobName The name of the debouncer started with `debounce`
+ * @return {boolean} Whether the debouncer is active (has not yet fired).
+ */
+ isDebouncerActive(jobName) {
+ this._debouncers = this._debouncers || {};
+ let debouncer = this._debouncers[jobName];
+ return !!(debouncer && debouncer.isActive());
+ }
+
+ /**
+ * Immediately calls the debouncer `callback` and inactivates it.
+ *
+ * @param {string} jobName The name of the debouncer started with `debounce`
+ * @return {void}
+ */
+ flushDebouncer(jobName) {
+ this._debouncers = this._debouncers || {};
+ let debouncer = this._debouncers[jobName];
+ if (debouncer) {
+ debouncer.flush();
+ }
+ }
+
+ /**
+ * Cancels an active debouncer. The `callback` will not be called.
+ *
+ * @param {string} jobName The name of the debouncer started with `debounce`
+ * @return {void}
+ */
+ cancelDebouncer(jobName) {
+ this._debouncers = this._debouncers || {};
+ let debouncer = this._debouncers[jobName];
+ if (debouncer) {
+ debouncer.cancel();
+ }
+ }
+
+ /**
+ * Runs a callback function asynchronously.
+ *
+ * By default (if no waitTime is specified), async callbacks are run at
+ * microtask timing, which will occur before paint.
+ *
+ * @param {!Function} callback The callback function to run, bound to `this`.
+ * @param {number=} waitTime Time to wait before calling the
+ * `callback`. If unspecified or 0, the callback will be run at microtask
+ * timing (before paint).
+ * @return {number} Handle that may be used to cancel the async job.
+ */
+ async(callback, waitTime) {
+ return waitTime > 0 ? Polymer.Async.timeOut.run(callback.bind(this), waitTime) :
+ ~Polymer.Async.microTask.run(callback.bind(this));
+ }
+
+ /**
+ * Cancels an async operation started with `async`.
+ *
+ * @param {number} handle Handle returned from original `async` call to
+ * cancel.
+ * @return {void}
+ */
+ cancelAsync(handle) {
+ handle < 0 ? Polymer.Async.microTask.cancel(~handle) :
+ Polymer.Async.timeOut.cancel(handle);
+ }
+
+ // other
+
+ /**
+ * Convenience method for creating an element and configuring it.
+ *
+ * @param {string} tag HTML element tag to create.
+ * @param {Object=} props Object of properties to configure on the
+ * instance.
+ * @return {!Element} Newly created and configured element.
+ */
+ create(tag, props) {
+ let elt = document.createElement(tag);
+ if (props) {
+ if (elt.setProperties) {
+ elt.setProperties(props);
+ } else {
+ for (let n in props) {
+ elt[n] = props[n];
+ }
+ }
+ }
+ return elt;
+ }
+
+ /**
+ * Convenience method for importing an HTML document imperatively.
+ *
+ * This method creates a new `<link rel="import">` element with
+ * the provided URL and appends it to the document to start loading.
+ * In the `onload` callback, the `import` property of the `link`
+ * element will contain the imported document contents.
+ *
+ * @param {string} href URL to document to load.
+ * @param {?function(!Event):void=} onload Callback to notify when an import successfully
+ * loaded.
+ * @param {?function(!ErrorEvent):void=} onerror Callback to notify when an import
+ * unsuccessfully loaded.
+ * @param {boolean=} optAsync True if the import should be loaded `async`.
+ * Defaults to `false`.
+ * @return {!HTMLLinkElement} The link element for the URL to be loaded.
+ */
+ importHref(href, onload, onerror, optAsync) { // eslint-disable-line no-unused-vars
+ let loadFn = onload ? onload.bind(this) : null;
+ let errorFn = onerror ? onerror.bind(this) : null;
+ return Polymer.importHref(href, loadFn, errorFn, optAsync);
+ }
+
+ /**
+ * Polyfill for Element.prototype.matches, which is sometimes still
+ * prefixed.
+ *
+ * @param {string} selector Selector to test.
+ * @param {!Element=} node Element to test the selector against.
+ * @return {boolean} Whether the element matches the selector.
+ */
+ elementMatches(selector, node) {
+ return Polymer.dom.matchesSelector(/** @type {!Element} */ (node || this), selector);
+ }
+
+ /**
+ * Toggles an HTML attribute on or off.
+ *
+ * @param {string} name HTML attribute name
+ * @param {boolean=} bool Boolean to force the attribute on or off.
+ * When unspecified, the state of the attribute will be reversed.
+ * @param {Element=} node Node to target. Defaults to `this`.
+ * @return {void}
+ */
+ toggleAttribute(name, bool, node) {
+ node = /** @type {Element} */ (node || this);
+ if (arguments.length == 1) {
+ bool = !node.hasAttribute(name);
+ }
+ if (bool) {
+ node.setAttribute(name, '');
+ } else {
+ node.removeAttribute(name);
+ }
+ }
+
+
+ /**
+ * Toggles a CSS class on or off.
+ *
+ * @param {string} name CSS class name
+ * @param {boolean=} bool Boolean to force the class on or off.
+ * When unspecified, the state of the class will be reversed.
+ * @param {Element=} node Node to target. Defaults to `this`.
+ * @return {void}
+ */
+ toggleClass(name, bool, node) {
+ node = /** @type {Element} */ (node || this);
+ if (arguments.length == 1) {
+ bool = !node.classList.contains(name);
+ }
+ if (bool) {
+ node.classList.add(name);
+ } else {
+ node.classList.remove(name);
+ }
+ }
+
+ /**
+ * Cross-platform helper for setting an element's CSS `transform` property.
+ *
+ * @param {string} transformText Transform setting.
+ * @param {Element=} node Element to apply the transform to.
+ * Defaults to `this`
+ * @return {void}
+ */
+ transform(transformText, node) {
+ node = /** @type {Element} */ (node || this);
+ node.style.webkitTransform = transformText;
+ node.style.transform = transformText;
+ }
+
+ /**
+ * Cross-platform helper for setting an element's CSS `translate3d`
+ * property.
+ *
+ * @param {number} x X offset.
+ * @param {number} y Y offset.
+ * @param {number} z Z offset.
+ * @param {Element=} node Element to apply the transform to.
+ * Defaults to `this`.
+ * @return {void}
+ */
+ translate3d(x, y, z, node) {
+ node = /** @type {Element} */ (node || this);
+ this.transform('translate3d(' + x + ',' + y + ',' + z + ')', node);
+ }
+
+ /**
+ * Removes an item from an array, if it exists.
+ *
+ * If the array is specified by path, a change notification is
+ * generated, so that observers, data bindings and computed
+ * properties watching that path can update.
+ *
+ * If the array is passed directly, **no change
+ * notification is generated**.
+ *
+ * @param {string | !Array<number|string>} arrayOrPath Path to array from which to remove the item
+ * (or the array itself).
+ * @param {*} item Item to remove.
+ * @return {Array} Array containing item removed.
+ */
+ arrayDelete(arrayOrPath, item) {
+ let index;
+ if (Array.isArray(arrayOrPath)) {
+ index = arrayOrPath.indexOf(item);
+ if (index >= 0) {
+ return arrayOrPath.splice(index, 1);
+ }
+ } else {
+ let arr = Polymer.Path.get(this, arrayOrPath);
+ index = arr.indexOf(item);
+ if (index >= 0) {
+ return this.splice(arrayOrPath, index, 1);
+ }
+ }
+ return null;
+ }
+
+ // logging
+
+ /**
+ * Facades `console.log`/`warn`/`error` as override point.
+ *
+ * @param {string} level One of 'log', 'warn', 'error'
+ * @param {Array} args Array of strings or objects to log
+ * @return {void}
+ */
+ _logger(level, args) {
+ // accept ['foo', 'bar'] and [['foo', 'bar']]
+ if (Array.isArray(args) && args.length === 1 && Array.isArray(args[0])) {
+ args = args[0];
+ }
+ switch(level) {
+ case 'log':
+ case 'warn':
+ case 'error':
+ console[level](...args);
+ }
+ }
+
+ /**
+ * Facades `console.log` as an override point.
+ *
+ * @param {...*} args Array of strings or objects to log
+ * @return {void}
+ */
+ _log(...args) {
+ this._logger('log', args);
+ }
+
+ /**
+ * Facades `console.warn` as an override point.
+ *
+ * @param {...*} args Array of strings or objects to log
+ * @return {void}
+ */
+ _warn(...args) {
+ this._logger('warn', args);
+ }
+
+ /**
+ * Facades `console.error` as an override point.
+ *
+ * @param {...*} args Array of strings or objects to log
+ * @return {void}
+ */
+ _error(...args) {
+ this._logger('error', args);
+ }
+
+ /**
+ * Formats a message using the element type an a method name.
+ *
+ * @param {string} methodName Method name to associate with message
+ * @param {...*} args Array of strings or objects to log
+ * @return {Array} Array with formatting information for `console`
+ * logging.
+ */
+ _logf(methodName, ...args) {
+ return ['[%s::%s]', this.is, methodName, ...args];
+ }
+
+ }
+
+ LegacyElement.prototype.is = '';
+
+ return LegacyElement;
+
+ });
+
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/mutable-data-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/mutable-data-behavior.html
new file mode 100644
index 00000000000..0d666131919
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/mutable-data-behavior.html
@@ -0,0 +1,161 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../mixins/mutable-data.html">
+
+<script>
+(function() {
+ 'use strict';
+
+ let mutablePropertyChange;
+ /** @suppress {missingProperties} */
+ (() => {
+ mutablePropertyChange = Polymer.MutableData._mutablePropertyChange;
+ })();
+
+ /**
+ * Legacy element behavior to skip strict dirty-checking for objects and arrays,
+ * (always consider them to be "dirty") for use on legacy API Polymer elements.
+ *
+ * By default, `Polymer.PropertyEffects` performs strict dirty checking on
+ * objects, which means that any deep modifications to an object or array will
+ * not be propagated unless "immutable" data patterns are used (i.e. all object
+ * references from the root to the mutation were changed).
+ *
+ * Polymer also provides a proprietary data mutation and path notification API
+ * (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient
+ * mutation and notification of deep changes in an object graph to all elements
+ * bound to the same object graph.
+ *
+ * In cases where neither immutable patterns nor the data mutation API can be
+ * used, applying this mixin will cause Polymer to skip dirty checking for
+ * objects and arrays (always consider them to be "dirty"). This allows a
+ * user to make a deep modification to a bound object graph, and then either
+ * simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath`
+ * (e.g. `this.notifyPath('items')`) to update the tree. Note that all
+ * elements that wish to be updated based on deep mutations must apply this
+ * mixin or otherwise skip strict dirty checking for objects/arrays.
+ * Specifically, any elements in the binding tree between the source of a
+ * mutation and the consumption of it must apply this behavior or enable the
+ * `Polymer.OptionalMutableDataBehavior`.
+ *
+ * In order to make the dirty check strategy configurable, see
+ * `Polymer.OptionalMutableDataBehavior`.
+ *
+ * Note, the performance characteristics of propagating large object graphs
+ * will be worse as opposed to using strict dirty checking with immutable
+ * patterns or Polymer's path notification API.
+ *
+ * @polymerBehavior
+ * @memberof Polymer
+ * @summary Behavior to skip strict dirty-checking for objects and
+ * arrays
+ */
+ Polymer.MutableDataBehavior = {
+
+ /**
+ * Overrides `Polymer.PropertyEffects` to provide option for skipping
+ * strict equality checking for Objects and Arrays.
+ *
+ * This method pulls the value to dirty check against from the `__dataTemp`
+ * cache (rather than the normal `__data` cache) for Objects. Since the temp
+ * cache is cleared at the end of a turn, this implementation allows
+ * side-effects of deep object changes to be processed by re-setting the
+ * same object (using the temp cache as an in-turn backstop to prevent
+ * cycles due to 2-way notification).
+ *
+ * @param {string} property Property name
+ * @param {*} value New property value
+ * @param {*} old Previous property value
+ * @return {boolean} Whether the property should be considered a change
+ * @protected
+ */
+ _shouldPropertyChange(property, value, old) {
+ return mutablePropertyChange(this, property, value, old, true);
+ }
+ };
+
+ /**
+ * Legacy element behavior to add the optional ability to skip strict
+ * dirty-checking for objects and arrays (always consider them to be
+ * "dirty") by setting a `mutable-data` attribute on an element instance.
+ *
+ * By default, `Polymer.PropertyEffects` performs strict dirty checking on
+ * objects, which means that any deep modifications to an object or array will
+ * not be propagated unless "immutable" data patterns are used (i.e. all object
+ * references from the root to the mutation were changed).
+ *
+ * Polymer also provides a proprietary data mutation and path notification API
+ * (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient
+ * mutation and notification of deep changes in an object graph to all elements
+ * bound to the same object graph.
+ *
+ * In cases where neither immutable patterns nor the data mutation API can be
+ * used, applying this mixin will allow Polymer to skip dirty checking for
+ * objects and arrays (always consider them to be "dirty"). This allows a
+ * user to make a deep modification to a bound object graph, and then either
+ * simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath`
+ * (e.g. `this.notifyPath('items')`) to update the tree. Note that all
+ * elements that wish to be updated based on deep mutations must apply this
+ * mixin or otherwise skip strict dirty checking for objects/arrays.
+ * Specifically, any elements in the binding tree between the source of a
+ * mutation and the consumption of it must enable this behavior or apply the
+ * `Polymer.OptionalMutableDataBehavior`.
+ *
+ * While this behavior adds the ability to forgo Object/Array dirty checking,
+ * the `mutableData` flag defaults to false and must be set on the instance.
+ *
+ * Note, the performance characteristics of propagating large object graphs
+ * will be worse by relying on `mutableData: true` as opposed to using
+ * strict dirty checking with immutable patterns or Polymer's path notification
+ * API.
+ *
+ * @polymerBehavior
+ * @memberof Polymer
+ * @summary Behavior to optionally skip strict dirty-checking for objects and
+ * arrays
+ */
+ Polymer.OptionalMutableDataBehavior = {
+
+ properties: {
+ /**
+ * Instance-level flag for configuring the dirty-checking strategy
+ * for this element. When true, Objects and Arrays will skip dirty
+ * checking, otherwise strict equality checking will be used.
+ */
+ mutableData: Boolean
+ },
+
+ /**
+ * Overrides `Polymer.PropertyEffects` to skip strict equality checking
+ * for Objects and Arrays.
+ *
+ * Pulls the value to dirty check against from the `__dataTemp` cache
+ * (rather than the normal `__data` cache) for Objects. Since the temp
+ * cache is cleared at the end of a turn, this implementation allows
+ * side-effects of deep object changes to be processed by re-setting the
+ * same object (using the temp cache as an in-turn backstop to prevent
+ * cycles due to 2-way notification).
+ *
+ * @param {string} property Property name
+ * @param {*} value New property value
+ * @param {*} old Previous property value
+ * @return {boolean} Whether the property should be considered a change
+ * @this {this}
+ * @protected
+ */
+ _shouldPropertyChange(property, value, old) {
+ return mutablePropertyChange(this, property, value, old, this.mutableData);
+ }
+ };
+
+})();
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/polymer-fn.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/polymer-fn.html
new file mode 100644
index 00000000000..80106a89ed7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/polymer-fn.html
@@ -0,0 +1,50 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="class.html">
+
+<script>
+
+ (function() {
+ 'use strict';
+
+ /**
+ * Legacy class factory and registration helper for defining Polymer
+ * elements.
+ *
+ * This method is equivalent to
+ * `customElements.define(info.is, Polymer.Class(info));`
+ *
+ * See `Polymer.Class` for details on valid legacy metadata format for `info`.
+ *
+ * @global
+ * @override
+ * @function Polymer
+ * @param {!PolymerInit} info Object containing Polymer metadata and functions
+ * to become class methods.
+ * @return {function(new: HTMLElement)} Generated class
+ * @suppress {duplicate, invalidCasts, checkTypes}
+ */
+ window.Polymer._polymerFn = function(info) {
+ // if input is a `class` (aka a function with a prototype), use the prototype
+ // remember that the `constructor` will never be called
+ let klass;
+ if (typeof info === 'function') {
+ klass = info;
+ } else {
+ klass = Polymer.Class(info);
+ }
+ customElements.define(klass.is, /** @type {!HTMLElement} */(klass));
+ return klass;
+ };
+
+ })();
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/polymer.dom.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/polymer.dom.html
new file mode 100644
index 00000000000..5417f12e142
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/polymer.dom.html
@@ -0,0 +1,405 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../utils/boot.html">
+<link rel="import" href="../utils/settings.html">
+<link rel="import" href="../utils/flattened-nodes-observer.html">
+<link rel="import" href="../utils/flush.html">
+<script>
+(function() {
+ 'use strict';
+
+ const p = Element.prototype;
+ /**
+ * @const {function(this:Node, string): boolean}
+ */
+ const normalizedMatchesSelector = p.matches || p.matchesSelector ||
+ p.mozMatchesSelector || p.msMatchesSelector ||
+ p.oMatchesSelector || p.webkitMatchesSelector;
+
+ /**
+ * Cross-platform `element.matches` shim.
+ *
+ * @function matchesSelector
+ * @memberof Polymer.dom
+ * @param {!Node} node Node to check selector against
+ * @param {string} selector Selector to match
+ * @return {boolean} True if node matched selector
+ */
+ const matchesSelector = function(node, selector) {
+ return normalizedMatchesSelector.call(node, selector);
+ };
+
+ /**
+ * Node API wrapper class returned from `Polymer.dom.(target)` when
+ * `target` is a `Node`.
+ *
+ * @memberof Polymer
+ */
+ class DomApi {
+
+ /**
+ * @param {Node} node Node for which to create a Polymer.dom helper object.
+ */
+ constructor(node) {
+ this.node = node;
+ }
+
+ /**
+ * Returns an instance of `Polymer.FlattenedNodesObserver` that
+ * listens for node changes on this element.
+ *
+ * @param {function(!Element, { target: !Element, addedNodes: !Array<!Element>, removedNodes: !Array<!Element> }):void} callback Called when direct or distributed children
+ * of this element changes
+ * @return {!Polymer.FlattenedNodesObserver} Observer instance
+ */
+ observeNodes(callback) {
+ return new Polymer.FlattenedNodesObserver(this.node, callback);
+ }
+
+ /**
+ * Disconnects an observer previously created via `observeNodes`
+ *
+ * @param {!Polymer.FlattenedNodesObserver} observerHandle Observer instance
+ * to disconnect.
+ * @return {void}
+ */
+ unobserveNodes(observerHandle) {
+ observerHandle.disconnect();
+ }
+
+ /**
+ * Provided as a backwards-compatible API only. This method does nothing.
+ * @return {void}
+ */
+ notifyObserver() {}
+
+ /**
+ * Returns true if the provided node is contained with this element's
+ * light-DOM children or shadow root, including any nested shadow roots
+ * of children therein.
+ *
+ * @param {Node} node Node to test
+ * @return {boolean} Returns true if the given `node` is contained within
+ * this element's light or shadow DOM.
+ */
+ deepContains(node) {
+ if (this.node.contains(node)) {
+ return true;
+ }
+ let n = node;
+ let doc = node.ownerDocument;
+ // walk from node to `this` or `document`
+ while (n && n !== doc && n !== this.node) {
+ // use logical parentnode, or native ShadowRoot host
+ n = n.parentNode || n.host;
+ }
+ return n === this.node;
+ }
+
+ /**
+ * Returns the root node of this node. Equivalent to `getRoodNode()`.
+ *
+ * @return {Node} Top most element in the dom tree in which the node
+ * exists. If the node is connected to a document this is either a
+ * shadowRoot or the document; otherwise, it may be the node
+ * itself or a node or document fragment containing it.
+ */
+ getOwnerRoot() {
+ return this.node.getRootNode();
+ }
+
+ /**
+ * For slot elements, returns the nodes assigned to the slot; otherwise
+ * an empty array. It is equivalent to `<slot>.addignedNodes({flatten:true})`.
+ *
+ * @return {!Array<!Node>} Array of assigned nodes
+ */
+ getDistributedNodes() {
+ return (this.node.localName === 'slot') ?
+ this.node.assignedNodes({flatten: true}) :
+ [];
+ }
+
+ /**
+ * Returns an array of all slots this element was distributed to.
+ *
+ * @return {!Array<!HTMLSlotElement>} Description
+ */
+ getDestinationInsertionPoints() {
+ let ip$ = [];
+ let n = this.node.assignedSlot;
+ while (n) {
+ ip$.push(n);
+ n = n.assignedSlot;
+ }
+ return ip$;
+ }
+
+ /**
+ * Calls `importNode` on the `ownerDocument` for this node.
+ *
+ * @param {!Node} node Node to import
+ * @param {boolean} deep True if the node should be cloned deeply during
+ * import
+ * @return {Node} Clone of given node imported to this owner document
+ */
+ importNode(node, deep) {
+ let doc = this.node instanceof Document ? this.node :
+ this.node.ownerDocument;
+ return doc.importNode(node, deep);
+ }
+
+ /**
+ * @return {!Array<!Node>} Returns a flattened list of all child nodes and
+ * nodes assigned to child slots.
+ */
+ getEffectiveChildNodes() {
+ return Polymer.FlattenedNodesObserver.getFlattenedNodes(this.node);
+ }
+
+ /**
+ * Returns a filtered list of flattened child elements for this element based
+ * on the given selector.
+ *
+ * @param {string} selector Selector to filter nodes against
+ * @return {!Array<!HTMLElement>} List of flattened child elements
+ */
+ queryDistributedElements(selector) {
+ let c$ = this.getEffectiveChildNodes();
+ let list = [];
+ for (let i=0, l=c$.length, c; (i<l) && (c=c$[i]); i++) {
+ if ((c.nodeType === Node.ELEMENT_NODE) &&
+ matchesSelector(c, selector)) {
+ list.push(c);
+ }
+ }
+ return list;
+ }
+
+ /**
+ * For shadow roots, returns the currently focused element within this
+ * shadow root.
+ *
+ * @return {Node|undefined} Currently focused element
+ */
+ get activeElement() {
+ let node = this.node;
+ return node._activeElement !== undefined ? node._activeElement : node.activeElement;
+ }
+ }
+
+ function forwardMethods(proto, methods) {
+ for (let i=0; i < methods.length; i++) {
+ let method = methods[i];
+ /* eslint-disable valid-jsdoc */
+ proto[method] = /** @this {DomApi} */ function() {
+ return this.node[method].apply(this.node, arguments);
+ };
+ /* eslint-enable */
+ }
+ }
+
+ function forwardReadOnlyProperties(proto, properties) {
+ for (let i=0; i < properties.length; i++) {
+ let name = properties[i];
+ Object.defineProperty(proto, name, {
+ get: function() {
+ const domApi = /** @type {DomApi} */(this);
+ return domApi.node[name];
+ },
+ configurable: true
+ });
+ }
+ }
+
+ function forwardProperties(proto, properties) {
+ for (let i=0; i < properties.length; i++) {
+ let name = properties[i];
+ Object.defineProperty(proto, name, {
+ get: function() {
+ const domApi = /** @type {DomApi} */(this);
+ return domApi.node[name];
+ },
+ set: function(value) {
+ /** @type {DomApi} */ (this).node[name] = value;
+ },
+ configurable: true
+ });
+ }
+ }
+
+ forwardMethods(DomApi.prototype, [
+ 'cloneNode', 'appendChild', 'insertBefore', 'removeChild',
+ 'replaceChild', 'setAttribute', 'removeAttribute',
+ 'querySelector', 'querySelectorAll'
+ ]);
+
+ forwardReadOnlyProperties(DomApi.prototype, [
+ 'parentNode', 'firstChild', 'lastChild',
+ 'nextSibling', 'previousSibling', 'firstElementChild',
+ 'lastElementChild', 'nextElementSibling', 'previousElementSibling',
+ 'childNodes', 'children', 'classList'
+ ]);
+
+ forwardProperties(DomApi.prototype, [
+ 'textContent', 'innerHTML'
+ ]);
+
+
+ /**
+ * Event API wrapper class returned from `Polymer.dom.(target)` when
+ * `target` is an `Event`.
+ */
+ class EventApi {
+ constructor(event) {
+ this.event = event;
+ }
+
+ /**
+ * Returns the first node on the `composedPath` of this event.
+ *
+ * @return {!EventTarget} The node this event was dispatched to
+ */
+ get rootTarget() {
+ return this.event.composedPath()[0];
+ }
+
+ /**
+ * Returns the local (re-targeted) target for this event.
+ *
+ * @return {!EventTarget} The local (re-targeted) target for this event.
+ */
+ get localTarget() {
+ return this.event.target;
+ }
+
+ /**
+ * Returns the `composedPath` for this event.
+ * @return {!Array<!EventTarget>} The nodes this event propagated through
+ */
+ get path() {
+ return this.event.composedPath();
+ }
+ }
+
+ Polymer.DomApi = DomApi;
+
+ /**
+ * @function
+ * @param {boolean=} deep
+ * @return {!Node}
+ */
+ Polymer.DomApi.prototype.cloneNode;
+ /**
+ * @function
+ * @param {!Node} node
+ * @return {!Node}
+ */
+ Polymer.DomApi.prototype.appendChild;
+ /**
+ * @function
+ * @param {!Node} newChild
+ * @param {Node} refChild
+ * @return {!Node}
+ */
+ Polymer.DomApi.prototype.insertBefore;
+ /**
+ * @function
+ * @param {!Node} node
+ * @return {!Node}
+ */
+ Polymer.DomApi.prototype.removeChild;
+ /**
+ * @function
+ * @param {!Node} oldChild
+ * @param {!Node} newChild
+ * @return {!Node}
+ */
+ Polymer.DomApi.prototype.replaceChild;
+ /**
+ * @function
+ * @param {string} name
+ * @param {string} value
+ * @return {void}
+ */
+ Polymer.DomApi.prototype.setAttribute;
+ /**
+ * @function
+ * @param {string} name
+ * @return {void}
+ */
+ Polymer.DomApi.prototype.removeAttribute;
+ /**
+ * @function
+ * @param {string} selector
+ * @return {?Element}
+ */
+ Polymer.DomApi.prototype.querySelector;
+ /**
+ * @function
+ * @param {string} selector
+ * @return {!NodeList<!Element>}
+ */
+ Polymer.DomApi.prototype.querySelectorAll;
+
+ /**
+ * Legacy DOM and Event manipulation API wrapper factory used to abstract
+ * differences between native Shadow DOM and "Shady DOM" when polyfilling on
+ * older browsers.
+ *
+ * Note that in Polymer 2.x use of `Polymer.dom` is no longer required and
+ * in the majority of cases simply facades directly to the standard native
+ * API.
+ *
+ * @namespace
+ * @summary Legacy DOM and Event manipulation API wrapper factory used to
+ * abstract differences between native Shadow DOM and "Shady DOM."
+ * @memberof Polymer
+ * @param {(Node|Event)=} obj Node or event to operate on
+ * @return {!DomApi|!EventApi} Wrapper providing either node API or event API
+ */
+ Polymer.dom = function(obj) {
+ obj = obj || document;
+ if (!obj.__domApi) {
+ let helper;
+ if (obj instanceof Event) {
+ helper = new EventApi(obj);
+ } else {
+ helper = new DomApi(obj);
+ }
+ obj.__domApi = helper;
+ }
+ return obj.__domApi;
+ };
+
+ Polymer.dom.matchesSelector = matchesSelector;
+
+ /**
+ * Forces several classes of asynchronously queued tasks to flush:
+ * - Debouncers added via `Polymer.enqueueDebouncer`
+ * - ShadyDOM distribution
+ *
+ * This method facades to `Polymer.flush`.
+ *
+ * @memberof Polymer.dom
+ */
+ Polymer.dom.flush = Polymer.flush;
+
+ /**
+ * Adds a `Polymer.Debouncer` to a list of globally flushable tasks.
+ *
+ * This method facades to `Polymer.enqueueDebouncer`.
+ *
+ * @memberof Polymer.dom
+ * @param {Polymer.Debouncer} debouncer Debouncer to enqueue
+ */
+ Polymer.dom.addDebouncer = Polymer.enqueueDebouncer;
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/templatizer-behavior.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/templatizer-behavior.html
new file mode 100644
index 00000000000..05ad62d0d49
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/legacy/templatizer-behavior.html
@@ -0,0 +1,151 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../utils/templatize.html">
+
+<script>
+ (function() {
+ 'use strict';
+
+ let TemplateInstanceBase = Polymer.TemplateInstanceBase; // eslint-disable-line
+
+ /**
+ * @typedef {{
+ * _templatizerTemplate: HTMLTemplateElement,
+ * _parentModel: boolean,
+ * _instanceProps: Object,
+ * _forwardHostPropV2: Function,
+ * _notifyInstancePropV2: Function,
+ * ctor: TemplateInstanceBase
+ * }}
+ */
+ let TemplatizerUser; // eslint-disable-line
+
+ /**
+ * The `Polymer.Templatizer` behavior adds methods to generate instances of
+ * templates that are each managed by an anonymous `Polymer.PropertyEffects`
+ * instance where data-bindings in the stamped template content are bound to
+ * accessors on itself.
+ *
+ * This behavior is provided in Polymer 2.x as a hybrid-element convenience
+ * only. For non-hybrid usage, the `Polymer.Templatize` library
+ * should be used instead.
+ *
+ * Example:
+ *
+ * // Get a template from somewhere, e.g. light DOM
+ * let template = this.querySelector('template');
+ * // Prepare the template
+ * this.templatize(template);
+ * // Instance the template with an initial data model
+ * let instance = this.stamp({myProp: 'initial'});
+ * // Insert the instance's DOM somewhere, e.g. light DOM
+ * Polymer.dom(this).appendChild(instance.root);
+ * // Changing a property on the instance will propagate to bindings
+ * // in the template
+ * instance.myProp = 'new value';
+ *
+ * Users of `Templatizer` may need to implement the following abstract
+ * API's to determine how properties and paths from the host should be
+ * forwarded into to instances:
+ *
+ * _forwardHostPropV2: function(prop, value)
+ *
+ * Likewise, users may implement these additional abstract API's to determine
+ * how instance-specific properties that change on the instance should be
+ * forwarded out to the host, if necessary.
+ *
+ * _notifyInstancePropV2: function(inst, prop, value)
+ *
+ * In order to determine which properties are instance-specific and require
+ * custom notification via `_notifyInstanceProp`, define an `_instanceProps`
+ * object containing keys for each instance prop, for example:
+ *
+ * _instanceProps: {
+ * item: true,
+ * index: true
+ * }
+ *
+ * Any properties used in the template that are not defined in _instanceProp
+ * will be forwarded out to the Templatize `owner` automatically.
+ *
+ * Users may also implement the following abstract function to show or
+ * hide any DOM generated using `stamp`:
+ *
+ * _showHideChildren: function(shouldHide)
+ *
+ * Note that some callbacks are suffixed with `V2` in the Polymer 2.x behavior
+ * as the implementations will need to differ from the callbacks required
+ * by the 1.x Templatizer API due to changes in the `TemplateInstance` API
+ * between versions 1.x and 2.x.
+ *
+ * @polymerBehavior
+ */
+ Polymer.Templatizer = {
+
+ /**
+ * Generates an anonymous `TemplateInstance` class (stored as `this.ctor`)
+ * for the provided template. This method should be called once per
+ * template to prepare an element for stamping the template, followed
+ * by `stamp` to create new instances of the template.
+ *
+ * @param {!HTMLTemplateElement} template Template to prepare
+ * @param {boolean=} mutableData When `true`, the generated class will skip
+ * strict dirty-checking for objects and arrays (always consider them to
+ * be "dirty"). Defaults to false.
+ * @return {void}
+ * @this {TemplatizerUser}
+ */
+ templatize(template, mutableData) {
+ this._templatizerTemplate = template;
+ this.ctor = Polymer.Templatize.templatize(template, this, {
+ mutableData: Boolean(mutableData),
+ parentModel: this._parentModel,
+ instanceProps: this._instanceProps,
+ forwardHostProp: this._forwardHostPropV2,
+ notifyInstanceProp: this._notifyInstancePropV2
+ });
+ },
+
+ /**
+ * Creates an instance of the template prepared by `templatize`. The object
+ * returned is an instance of the anonymous class generated by `templatize`
+ * whose `root` property is a document fragment containing newly cloned
+ * template content, and which has property accessors corresponding to
+ * properties referenced in template bindings.
+ *
+ * @param {Object=} model Object containing initial property values to
+ * populate into the template bindings.
+ * @return {TemplateInstanceBase} Returns the created instance of
+ * the template prepared by `templatize`.
+ * @this {TemplatizerUser}
+ */
+ stamp(model) {
+ return new this.ctor(model);
+ },
+
+ /**
+ * Returns the template "model" (`TemplateInstance`) associated with
+ * a given element, which serves as the binding scope for the template
+ * instance the element is contained in. A template model should be used
+ * to manipulate data associated with this template instance.
+ *
+ * @param {HTMLElement} el Element for which to return a template model.
+ * @return {TemplateInstanceBase} Model representing the binding scope for
+ * the element.
+ * @this {TemplatizerUser}
+ */
+ modelForElement(el) {
+ return Polymer.Templatize.modelForElement(this._templatizerTemplate, el);
+ }
+ };
+
+ })();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/dir-mixin.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/dir-mixin.html
new file mode 100644
index 00000000000..68db35d5fef
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/dir-mixin.html
@@ -0,0 +1,181 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="property-accessors.html">
+
+<script>
+ (function() {
+ 'use strict';
+
+ const HOST_DIR = /:host\(:dir\((ltr|rtl)\)\)/g;
+ const HOST_DIR_REPLACMENT = ':host([dir="$1"])';
+
+ const EL_DIR = /([\s\w-#\.\[\]\*]*):dir\((ltr|rtl)\)/g;
+ const EL_DIR_REPLACMENT = ':host([dir="$2"]) $1';
+
+ /**
+ * @type {!Array<!Polymer_DirMixin>}
+ */
+ const DIR_INSTANCES = [];
+
+ /** @type {MutationObserver} */
+ let observer = null;
+
+ let DOCUMENT_DIR = '';
+
+ function getRTL() {
+ DOCUMENT_DIR = document.documentElement.getAttribute('dir');
+ }
+
+ /**
+ * @param {!Polymer_DirMixin} instance Instance to set RTL status on
+ */
+ function setRTL(instance) {
+ if (!instance.__autoDirOptOut) {
+ const el = /** @type {!HTMLElement} */(instance);
+ el.setAttribute('dir', DOCUMENT_DIR);
+ }
+ }
+
+ function updateDirection() {
+ getRTL();
+ DOCUMENT_DIR = document.documentElement.getAttribute('dir');
+ for (let i = 0; i < DIR_INSTANCES.length; i++) {
+ setRTL(DIR_INSTANCES[i]);
+ }
+ }
+
+ function takeRecords() {
+ if (observer && observer.takeRecords().length) {
+ updateDirection();
+ }
+ }
+
+ /**
+ * Element class mixin that allows elements to use the `:dir` CSS Selector to have
+ * text direction specific styling.
+ *
+ * With this mixin, any stylesheet provided in the template will transform `:dir` into
+ * `:host([dir])` and sync direction with the page via the element's `dir` attribute.
+ *
+ * Elements can opt out of the global page text direction by setting the `dir` attribute
+ * directly in `ready()` or in HTML.
+ *
+ * Caveats:
+ * - Applications must set `<html dir="ltr">` or `<html dir="rtl">` to sync direction
+ * - Automatic left-to-right or right-to-left styling is sync'd with the `<html>` element only.
+ * - Changing `dir` at runtime is supported.
+ * - Opting out of the global direction styling is permanent
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin Polymer.PropertyAccessors
+ * @memberof Polymer
+ */
+ Polymer.DirMixin = Polymer.dedupingMixin((base) => {
+
+ if (!observer) {
+ getRTL();
+ observer = new MutationObserver(updateDirection);
+ observer.observe(document.documentElement, {attributes: true, attributeFilter: ['dir']});
+ }
+
+ /**
+ * @constructor
+ * @extends {base}
+ * @implements {Polymer_PropertyAccessors}
+ */
+ const elementBase = Polymer.PropertyAccessors(base);
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_DirMixin}
+ */
+ class Dir extends elementBase {
+
+ /**
+ * @override
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static _processStyleText(cssText, baseURI) {
+ cssText = super._processStyleText(cssText, baseURI);
+ cssText = this._replaceDirInCssText(cssText);
+ return cssText;
+ }
+
+ /**
+ * Replace `:dir` in the given CSS text
+ *
+ * @param {string} text CSS text to replace DIR
+ * @return {string} Modified CSS
+ */
+ static _replaceDirInCssText(text) {
+ let replacedText = text;
+ replacedText = replacedText.replace(HOST_DIR, HOST_DIR_REPLACMENT);
+ replacedText = replacedText.replace(EL_DIR, EL_DIR_REPLACMENT);
+ if (text !== replacedText) {
+ this.__activateDir = true;
+ }
+ return replacedText;
+ }
+
+ constructor() {
+ super();
+ /** @type {boolean} */
+ this.__autoDirOptOut = false;
+ }
+
+ /**
+ * @suppress {invalidCasts} Closure doesn't understand that `this` is an HTMLElement
+ * @return {void}
+ */
+ ready() {
+ super.ready();
+ this.__autoDirOptOut = /** @type {!HTMLElement} */(this).hasAttribute('dir');
+ }
+
+ /**
+ * @suppress {missingProperties} If it exists on elementBase, it can be super'd
+ * @return {void}
+ */
+ connectedCallback() {
+ if (elementBase.prototype.connectedCallback) {
+ super.connectedCallback();
+ }
+ if (this.constructor.__activateDir) {
+ takeRecords();
+ DIR_INSTANCES.push(this);
+ setRTL(this);
+ }
+ }
+
+ /**
+ * @suppress {missingProperties} If it exists on elementBase, it can be super'd
+ * @return {void}
+ */
+ disconnectedCallback() {
+ if (elementBase.prototype.disconnectedCallback) {
+ super.disconnectedCallback();
+ }
+ if (this.constructor.__activateDir) {
+ const idx = DIR_INSTANCES.indexOf(this);
+ if (idx > -1) {
+ DIR_INSTANCES.splice(idx, 1);
+ }
+ }
+ }
+ }
+
+ Dir.__activateDir = false;
+
+ return Dir;
+ });
+ })();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/disable-upgrade-mixin.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/disable-upgrade-mixin.html
new file mode 100644
index 00000000000..a94418214e6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/disable-upgrade-mixin.html
@@ -0,0 +1,116 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="element-mixin.html">
+<script>
+(function() {
+ 'use strict';
+
+ const DISABLED_ATTR = 'disable-upgrade';
+
+ /**
+ * Element class mixin that allows the element to boot up in a non-enabled
+ * state when the `disable-upgrade` attribute is present. This mixin is
+ * designed to be used with element classes like Polymer.Element that perform
+ * initial startup work when they are first connected. When the
+ * `disable-upgrade` attribute is removed, if the element is connected, it
+ * boots up and "enables" as it otherwise would; if it is not connected, the
+ * element boots up when it is next connected.
+ *
+ * Using `disable-upgrade` with Polymer.Element prevents any data propagation
+ * to the element, any element DOM from stamping, or any work done in
+ * connected/disconnctedCallback from occuring, but it does not prevent work
+ * done in the element constructor.
+ *
+ * Note, this mixin must be applied on top of any element class that
+ * itself implements a `connectedCallback` so that it can control the work
+ * done in `connectedCallback`. For example,
+ *
+ * MyClass = Polymer.DisableUpgradeMixin(class extends BaseClass {...});
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin Polymer.ElementMixin
+ * @memberof Polymer
+ */
+ Polymer.DisableUpgradeMixin = Polymer.dedupingMixin((base) => {
+
+ /**
+ * @constructor
+ * @extends {base}
+ * @implements {Polymer_ElementMixin}
+ */
+ const superClass = Polymer.ElementMixin(base);
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_DisableUpgradeMixin}
+ */
+ class DisableUpgradeClass extends superClass {
+
+ /** @override */
+ static get observedAttributes() {
+ return super.observedAttributes.concat(DISABLED_ATTR);
+ }
+
+ /** @override */
+ attributeChangedCallback(name, old, value) {
+ if (name == DISABLED_ATTR) {
+ if (!this.__dataEnabled && value == null && this.isConnected) {
+ super.connectedCallback();
+ }
+ } else {
+ super.attributeChangedCallback(name, old, value);
+ }
+ }
+
+ /*
+ NOTE: cannot gate on attribute because this is called before
+ attributes are delivered. Therefore, we stub this out and
+ call `super._initializeProperties()` manually.
+ */
+ /** @override */
+ _initializeProperties() {}
+
+ // prevent user code in connected from running
+ /** @override */
+ connectedCallback() {
+ if (this.__dataEnabled || !this.hasAttribute(DISABLED_ATTR)) {
+ super.connectedCallback();
+ }
+ }
+
+ // prevent element from turning on properties
+ /** @override */
+ _enableProperties() {
+ if (!this.hasAttribute(DISABLED_ATTR)) {
+ if (!this.__dataEnabled) {
+ super._initializeProperties();
+ }
+ super._enableProperties();
+ }
+ }
+
+ // only go if "enabled"
+ /** @override */
+ disconnectedCallback() {
+ if (this.__dataEnabled) {
+ super.disconnectedCallback();
+ }
+ }
+
+ }
+
+ return DisableUpgradeClass;
+
+ });
+
+})();
+
+</script> \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/element-mixin.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/element-mixin.html
new file mode 100644
index 00000000000..d83946cef2f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/element-mixin.html
@@ -0,0 +1,739 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../utils/boot.html">
+<link rel="import" href="../utils/settings.html">
+<link rel="import" href="../utils/mixin.html">
+<link rel="import" href="../utils/style-gather.html">
+<link rel="import" href="../utils/resolve-url.html">
+<link rel="import" href="../elements/dom-module.html">
+<link rel="import" href="property-effects.html">
+<link rel="import" href="properties-mixin.html">
+
+<script>
+(function() {
+ 'use strict';
+
+ /**
+ * Element class mixin that provides the core API for Polymer's meta-programming
+ * features including template stamping, data-binding, attribute deserialization,
+ * and property change observation.
+ *
+ * Subclassers may provide the following static getters to return metadata
+ * used to configure Polymer's features for the class:
+ *
+ * - `static get is()`: When the template is provided via a `dom-module`,
+ * users should return the `dom-module` id from a static `is` getter. If
+ * no template is needed or the template is provided directly via the
+ * `template` getter, there is no need to define `is` for the element.
+ *
+ * - `static get template()`: Users may provide the template directly (as
+ * opposed to via `dom-module`) by implementing a static `template` getter.
+ * The getter may return an `HTMLTemplateElement` or a string, which will
+ * automatically be parsed into a template.
+ *
+ * - `static get properties()`: Should return an object describing
+ * property-related metadata used by Polymer features (key: property name
+ * value: object containing property metadata). Valid keys in per-property
+ * metadata include:
+ * - `type` (String|Number|Object|Array|...): Used by
+ * `attributeChangedCallback` to determine how string-based attributes
+ * are deserialized to JavaScript property values.
+ * - `notify` (boolean): Causes a change in the property to fire a
+ * non-bubbling event called `<property>-changed`. Elements that have
+ * enabled two-way binding to the property use this event to observe changes.
+ * - `readOnly` (boolean): Creates a getter for the property, but no setter.
+ * To set a read-only property, use the private setter method
+ * `_setProperty(property, value)`.
+ * - `observer` (string): Observer method name that will be called when
+ * the property changes. The arguments of the method are
+ * `(value, previousValue)`.
+ * - `computed` (string): String describing method and dependent properties
+ * for computing the value of this property (e.g. `'computeFoo(bar, zot)'`).
+ * Computed properties are read-only by default and can only be changed
+ * via the return value of the computing method.
+ *
+ * - `static get observers()`: Array of strings describing multi-property
+ * observer methods and their dependent properties (e.g.
+ * `'observeABC(a, b, c)'`).
+ *
+ * The base class provides default implementations for the following standard
+ * custom element lifecycle callbacks; users may override these, but should
+ * call the super method to ensure
+ * - `constructor`: Run when the element is created or upgraded
+ * - `connectedCallback`: Run each time the element is connected to the
+ * document
+ * - `disconnectedCallback`: Run each time the element is disconnected from
+ * the document
+ * - `attributeChangedCallback`: Run each time an attribute in
+ * `observedAttributes` is set or removed (note: this element's default
+ * `observedAttributes` implementation will automatically return an array
+ * of dash-cased attributes based on `properties`)
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin Polymer.PropertyEffects
+ * @appliesMixin Polymer.PropertiesMixin
+ * @memberof Polymer
+ * @property rootPath {string} Set to the value of `Polymer.rootPath`,
+ * which defaults to the main document path
+ * @property importPath {string} Set to the value of the class's static
+ * `importPath` property, which defaults to the path of this element's
+ * `dom-module` (when `is` is used), but can be overridden for other
+ * import strategies.
+ * @summary Element class mixin that provides the core API for Polymer's
+ * meta-programming features.
+ */
+ Polymer.ElementMixin = Polymer.dedupingMixin(base => {
+
+ /**
+ * @constructor
+ * @extends {base}
+ * @implements {Polymer_PropertyEffects}
+ * @implements {Polymer_PropertiesMixin}
+ */
+ const polymerElementBase = Polymer.PropertiesMixin(Polymer.PropertyEffects(base));
+
+ /**
+ * Returns a list of properties with default values.
+ * This list is created as an optimization since it is a subset of
+ * the list returned from `_properties`.
+ * This list is used in `_initializeProperties` to set property defaults.
+ *
+ * @param {PolymerElementConstructor} constructor Element class
+ * @return {PolymerElementProperties} Flattened properties for this class
+ * that have default values
+ * @private
+ */
+ function propertyDefaults(constructor) {
+ if (!constructor.hasOwnProperty(
+ JSCompiler_renameProperty('__propertyDefaults', constructor))) {
+ constructor.__propertyDefaults = null;
+ let props = constructor._properties;
+ for (let p in props) {
+ let info = props[p];
+ if ('value' in info) {
+ constructor.__propertyDefaults = constructor.__propertyDefaults || {};
+ constructor.__propertyDefaults[p] = info;
+ }
+ }
+ }
+ return constructor.__propertyDefaults;
+ }
+
+ /**
+ * Returns a memoized version of the the `observers` array.
+ * @param {PolymerElementConstructor} constructor Element class
+ * @return {Array} Array containing own observers for the given class
+ * @protected
+ */
+ function ownObservers(constructor) {
+ if (!constructor.hasOwnProperty(
+ JSCompiler_renameProperty('__ownObservers', constructor))) {
+ constructor.__ownObservers =
+ constructor.hasOwnProperty(JSCompiler_renameProperty('observers', constructor)) ?
+ /** @type {PolymerElementConstructor} */ (constructor).observers : null;
+ }
+ return constructor.__ownObservers;
+ }
+
+ /**
+ * Creates effects for a property.
+ *
+ * Note, once a property has been set to
+ * `readOnly`, `computed`, `reflectToAttribute`, or `notify`
+ * these values may not be changed. For example, a subclass cannot
+ * alter these settings. However, additional `observers` may be added
+ * by subclasses.
+ *
+ * The info object should may contain property metadata as follows:
+ *
+ * * `type`: {function} type to which an attribute matching the property
+ * is deserialized. Note the property is camel-cased from a dash-cased
+ * attribute. For example, 'foo-bar' attribute is deserialized to a
+ * property named 'fooBar'.
+ *
+ * * `readOnly`: {boolean} creates a readOnly property and
+ * makes a private setter for the private of the form '_setFoo' for a
+ * property 'foo',
+ *
+ * * `computed`: {string} creates a computed property. A computed property
+ * also automatically is set to `readOnly: true`. The value is calculated
+ * by running a method and arguments parsed from the given string. For
+ * example 'compute(foo)' will compute a given property when the
+ * 'foo' property changes by executing the 'compute' method. This method
+ * must return the computed value.
+ *
+ * * `reflectToAttribute`: {boolean} If true, the property value is reflected
+ * to an attribute of the same name. Note, the attribute is dash-cased
+ * so a property named 'fooBar' is reflected as 'foo-bar'.
+ *
+ * * `notify`: {boolean} sends a non-bubbling notification event when
+ * the property changes. For example, a property named 'foo' sends an
+ * event named 'foo-changed' with `event.detail` set to the value of
+ * the property.
+ *
+ * * observer: {string} name of a method that runs when the property
+ * changes. The arguments of the method are (value, previousValue).
+ *
+ * Note: Users may want control over modifying property
+ * effects via subclassing. For example, a user might want to make a
+ * reflectToAttribute property not do so in a subclass. We've chosen to
+ * disable this because it leads to additional complication.
+ * For example, a readOnly effect generates a special setter. If a subclass
+ * disables the effect, the setter would fail unexpectedly.
+ * Based on feedback, we may want to try to make effects more malleable
+ * and/or provide an advanced api for manipulating them.
+ * Also consider adding warnings when an effect cannot be changed.
+ *
+ * @param {!PolymerElement} proto Element class prototype to add accessors
+ * and effects to
+ * @param {string} name Name of the property.
+ * @param {Object} info Info object from which to create property effects.
+ * Supported keys:
+ * @param {Object} allProps Flattened map of all properties defined in this
+ * element (including inherited properties)
+ * @return {void}
+ * @private
+ */
+ function createPropertyFromConfig(proto, name, info, allProps) {
+ // computed forces readOnly...
+ if (info.computed) {
+ info.readOnly = true;
+ }
+ // Note, since all computed properties are readOnly, this prevents
+ // adding additional computed property effects (which leads to a confusing
+ // setup where multiple triggers for setting a property)
+ // While we do have `hasComputedEffect` this is set on the property's
+ // dependencies rather than itself.
+ if (info.computed && !proto._hasReadOnlyEffect(name)) {
+ proto._createComputedProperty(name, info.computed, allProps);
+ }
+ if (info.readOnly && !proto._hasReadOnlyEffect(name)) {
+ proto._createReadOnlyProperty(name, !info.computed);
+ }
+ if (info.reflectToAttribute && !proto._hasReflectEffect(name)) {
+ proto._createReflectedProperty(name);
+ }
+ if (info.notify && !proto._hasNotifyEffect(name)) {
+ proto._createNotifyingProperty(name);
+ }
+ // always add observer
+ if (info.observer) {
+ proto._createPropertyObserver(name, info.observer, allProps[info.observer]);
+ }
+ // always create the mapping from attribute back to property for deserialization.
+ proto._addPropertyToAttributeMap(name);
+ }
+
+ /**
+ * Process all style elements in the element template. Styles with the
+ * `include` attribute are processed such that any styles in
+ * the associated "style modules" are included in the element template.
+ * @param {PolymerElementConstructor} klass Element class
+ * @param {!HTMLTemplateElement} template Template to process
+ * @param {string} is Name of element
+ * @param {string} baseURI Base URI for element
+ * @private
+ */
+ function processElementStyles(klass, template, is, baseURI) {
+ const templateStyles = template.content.querySelectorAll('style');
+ const stylesWithImports = Polymer.StyleGather.stylesFromTemplate(template);
+ // insert styles from <link rel="import" type="css"> at the top of the template
+ const linkedStyles = Polymer.StyleGather.stylesFromModuleImports(is);
+ const firstTemplateChild = template.content.firstElementChild;
+ for (let idx = 0; idx < linkedStyles.length; idx++) {
+ let s = linkedStyles[idx];
+ s.textContent = klass._processStyleText(s.textContent, baseURI);
+ template.content.insertBefore(s, firstTemplateChild);
+ }
+ // keep track of the last "concrete" style in the template we have encountered
+ let templateStyleIndex = 0;
+ // ensure all gathered styles are actually in this template.
+ for (let i = 0; i < stylesWithImports.length; i++) {
+ let s = stylesWithImports[i];
+ let templateStyle = templateStyles[templateStyleIndex];
+ // if the style is not in this template, it's been "included" and
+ // we put a clone of it in the template before the style that included it
+ if (templateStyle !== s) {
+ s = s.cloneNode(true);
+ templateStyle.parentNode.insertBefore(s, templateStyle);
+ } else {
+ templateStyleIndex++;
+ }
+ s.textContent = klass._processStyleText(s.textContent, baseURI);
+ }
+ if (window.ShadyCSS) {
+ window.ShadyCSS.prepareTemplate(template, is);
+ }
+ }
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @unrestricted
+ * @implements {Polymer_ElementMixin}
+ */
+ class PolymerElement extends polymerElementBase {
+
+ /**
+ * Override of PropertiesMixin _finalizeClass to create observers and
+ * find the template.
+ * @return {void}
+ * @protected
+ * @override
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static _finalizeClass() {
+ super._finalizeClass();
+ if (this.hasOwnProperty(
+ JSCompiler_renameProperty('is', this)) && this.is) {
+ Polymer.telemetry.register(this.prototype);
+ }
+ const observers = ownObservers(this);
+ if (observers) {
+ this.createObservers(observers, this._properties);
+ }
+ // note: create "working" template that is finalized at instance time
+ let template = /** @type {PolymerElementConstructor} */ (this).template;
+ if (template) {
+ if (typeof template === 'string') {
+ let t = document.createElement('template');
+ t.innerHTML = template;
+ template = t;
+ } else {
+ template = template.cloneNode(true);
+ }
+ }
+
+ this.prototype._template = template;
+ }
+
+ /**
+ * Override of PropertiesChanged createProperties to create accessors
+ * and property effects for all of the properties.
+ * @return {void}
+ * @protected
+ * @override
+ */
+ static createProperties(props) {
+ for (let p in props) {
+ createPropertyFromConfig(this.prototype, p, props[p], props);
+ }
+ }
+
+ /**
+ * Creates observers for the given `observers` array.
+ * Leverages `PropertyEffects` to create observers.
+ * @param {Object} observers Array of observer descriptors for
+ * this class
+ * @param {Object} dynamicFns Object containing keys for any properties
+ * that are functions and should trigger the effect when the function
+ * reference is changed
+ * @return {void}
+ * @protected
+ */
+ static createObservers(observers, dynamicFns) {
+ const proto = this.prototype;
+ for (let i=0; i < observers.length; i++) {
+ proto._createMethodObserver(observers[i], dynamicFns);
+ }
+ }
+
+ /**
+ * Returns the template that will be stamped into this element's shadow root.
+ *
+ * If a `static get is()` getter is defined, the default implementation
+ * will return the first `<template>` in a `dom-module` whose `id`
+ * matches this element's `is`.
+ *
+ * Users may override this getter to return an arbitrary template
+ * (in which case the `is` getter is unnecessary). The template returned
+ * may be either an `HTMLTemplateElement` or a string that will be
+ * automatically parsed into a template.
+ *
+ * Note that when subclassing, if the super class overrode the default
+ * implementation and the subclass would like to provide an alternate
+ * template via a `dom-module`, it should override this getter and
+ * return `Polymer.DomModule.import(this.is, 'template')`.
+ *
+ * If a subclass would like to modify the super class template, it should
+ * clone it rather than modify it in place. If the getter does expensive
+ * work such as cloning/modifying a template, it should memoize the
+ * template for maximum performance:
+ *
+ * let memoizedTemplate;
+ * class MySubClass extends MySuperClass {
+ * static get template() {
+ * if (!memoizedTemplate) {
+ * memoizedTemplate = super.template.cloneNode(true);
+ * let subContent = document.createElement('div');
+ * subContent.textContent = 'This came from MySubClass';
+ * memoizedTemplate.content.appendChild(subContent);
+ * }
+ * return memoizedTemplate;
+ * }
+ * }
+ *
+ * @return {HTMLTemplateElement|string} Template to be stamped
+ */
+ static get template() {
+ if (!this.hasOwnProperty(JSCompiler_renameProperty('_template', this))) {
+ this._template = Polymer.DomModule && Polymer.DomModule.import(
+ /** @type {PolymerElementConstructor}*/ (this).is, 'template') ||
+ // note: implemented so a subclass can retrieve the super
+ // template; call the super impl this way so that `this` points
+ // to the superclass.
+ Object.getPrototypeOf(/** @type {PolymerElementConstructor}*/ (this).prototype).constructor.template;
+ }
+ return this._template;
+ }
+
+ /**
+ * Path matching the url from which the element was imported.
+ * This path is used to resolve url's in template style cssText.
+ * The `importPath` property is also set on element instances and can be
+ * used to create bindings relative to the import path.
+ * Defaults to the path matching the url containing a `dom-module` element
+ * matching this element's static `is` property.
+ * Note, this path should contain a trailing `/`.
+ *
+ * @return {string} The import path for this element class
+ */
+ static get importPath() {
+ if (!this.hasOwnProperty(JSCompiler_renameProperty('_importPath', this))) {
+ const module = Polymer.DomModule && Polymer.DomModule.import(/** @type {PolymerElementConstructor} */ (this).is);
+ this._importPath = module ? module.assetpath : '' ||
+ Object.getPrototypeOf(/** @type {PolymerElementConstructor}*/ (this).prototype).constructor.importPath;
+ }
+ return this._importPath;
+ }
+
+ constructor() {
+ super();
+ /** @type {HTMLTemplateElement} */
+ this._template;
+ /** @type {string} */
+ this._importPath;
+ /** @type {string} */
+ this.rootPath;
+ /** @type {string} */
+ this.importPath;
+ /** @type {StampedTemplate | HTMLElement | ShadowRoot} */
+ this.root;
+ /** @type {!Object<string, !Element>} */
+ this.$;
+ }
+
+ /**
+ * Overrides the default `Polymer.PropertyAccessors` to ensure class
+ * metaprogramming related to property accessors and effects has
+ * completed (calls `finalize`).
+ *
+ * It also initializes any property defaults provided via `value` in
+ * `properties` metadata.
+ *
+ * @return {void}
+ * @override
+ * @suppress {invalidCasts}
+ */
+ _initializeProperties() {
+ Polymer.telemetry.instanceCount++;
+ this.constructor.finalize();
+ const importPath = this.constructor.importPath;
+ // note: finalize template when we have access to `localName` to
+ // avoid dependence on `is` for polyfilling styling.
+ this.constructor._finalizeTemplate(/** @type {!HTMLElement} */(this).localName);
+ super._initializeProperties();
+ // set path defaults
+ this.rootPath = Polymer.rootPath;
+ this.importPath = importPath;
+ // apply property defaults...
+ let p$ = propertyDefaults(this.constructor);
+ if (!p$) {
+ return;
+ }
+ for (let p in p$) {
+ let info = p$[p];
+ // Don't set default value if there is already an own property, which
+ // happens when a `properties` property with default but no effects had
+ // a property set (e.g. bound) by its host before upgrade
+ if (!this.hasOwnProperty(p)) {
+ let value = typeof info.value == 'function' ?
+ info.value.call(this) :
+ info.value;
+ // Set via `_setProperty` if there is an accessor, to enable
+ // initializing readOnly property defaults
+ if (this._hasAccessor(p)) {
+ this._setPendingProperty(p, value, true);
+ } else {
+ this[p] = value;
+ }
+ }
+ }
+ }
+
+ /**
+ * Gather style text for a style element in the template.
+ *
+ * @param {string} cssText Text containing styling to process
+ * @param {string} baseURI Base URI to rebase CSS paths against
+ * @return {string} The processed CSS text
+ * @protected
+ */
+ static _processStyleText(cssText, baseURI) {
+ return Polymer.ResolveUrl.resolveCss(cssText, baseURI);
+ }
+
+ /**
+ * Configures an element `proto` to function with a given `template`.
+ * The element name `is` and extends `ext` must be specified for ShadyCSS
+ * style scoping.
+ *
+ * @param {string} is Tag name (or type extension name) for this element
+ * @return {void}
+ * @protected
+ */
+ static _finalizeTemplate(is) {
+ /** @const {HTMLTemplateElement} */
+ const template = this.prototype._template;
+ if (template && !template.__polymerFinalized) {
+ template.__polymerFinalized = true;
+ const importPath = this.importPath;
+ const baseURI = importPath ? Polymer.ResolveUrl.resolveUrl(importPath) : '';
+ // e.g. support `include="module-name"`, and ShadyCSS
+ processElementStyles(this, template, is, baseURI);
+ this.prototype._bindTemplate(template);
+ }
+ }
+
+ /**
+ * Provides a default implementation of the standard Custom Elements
+ * `connectedCallback`.
+ *
+ * The default implementation enables the property effects system and
+ * flushes any pending properties, and updates shimmed CSS properties
+ * when using the ShadyCSS scoping/custom properties polyfill.
+ *
+ * @suppress {missingProperties, invalidCasts} Super may or may not implement the callback
+ * @return {void}
+ */
+ connectedCallback() {
+ if (window.ShadyCSS && this._template) {
+ window.ShadyCSS.styleElement(/** @type {!HTMLElement} */(this));
+ }
+ super.connectedCallback();
+ }
+
+ /**
+ * Stamps the element template.
+ *
+ * @return {void}
+ * @override
+ */
+ ready() {
+ if (this._template) {
+ this.root = this._stampTemplate(this._template);
+ this.$ = this.root.$;
+ }
+ super.ready();
+ }
+
+ /**
+ * Implements `PropertyEffects`'s `_readyClients` call. Attaches
+ * element dom by calling `_attachDom` with the dom stamped from the
+ * element's template via `_stampTemplate`. Note that this allows
+ * client dom to be attached to the element prior to any observers
+ * running.
+ *
+ * @return {void}
+ * @override
+ */
+ _readyClients() {
+ if (this._template) {
+ this.root = this._attachDom(/** @type {StampedTemplate} */(this.root));
+ }
+ // The super._readyClients here sets the clients initialized flag.
+ // We must wait to do this until after client dom is created/attached
+ // so that this flag can be checked to prevent notifications fired
+ // during this process from being handled before clients are ready.
+ super._readyClients();
+ }
+
+
+ /**
+ * Attaches an element's stamped dom to itself. By default,
+ * this method creates a `shadowRoot` and adds the dom to it.
+ * However, this method may be overridden to allow an element
+ * to put its dom in another location.
+ *
+ * @throws {Error}
+ * @suppress {missingReturn}
+ * @param {StampedTemplate} dom to attach to the element.
+ * @return {ShadowRoot} node to which the dom has been attached.
+ */
+ _attachDom(dom) {
+ if (this.attachShadow) {
+ if (dom) {
+ if (!this.shadowRoot) {
+ this.attachShadow({mode: 'open'});
+ }
+ this.shadowRoot.appendChild(dom);
+ return this.shadowRoot;
+ }
+ return null;
+ } else {
+ throw new Error('ShadowDOM not available. ' +
+ // TODO(sorvell): move to compile-time conditional when supported
+ 'Polymer.Element can create dom as children instead of in ' +
+ 'ShadowDOM by setting `this.root = this;\` before \`ready\`.');
+ }
+ }
+
+ /**
+ * When using the ShadyCSS scoping and custom property shim, causes all
+ * shimmed styles in this element (and its subtree) to be updated
+ * based on current custom property values.
+ *
+ * The optional parameter overrides inline custom property styles with an
+ * object of properties where the keys are CSS properties, and the values
+ * are strings.
+ *
+ * Example: `this.updateStyles({'--color': 'blue'})`
+ *
+ * These properties are retained unless a value of `null` is set.
+ *
+ * Note: This function does not support updating CSS mixins.
+ * You can not dynamically change the value of an `@apply`.
+ *
+ * @param {Object=} properties Bag of custom property key/values to
+ * apply to this element.
+ * @return {void}
+ * @suppress {invalidCasts}
+ */
+ updateStyles(properties) {
+ if (window.ShadyCSS) {
+ window.ShadyCSS.styleSubtree(/** @type {!HTMLElement} */(this), properties);
+ }
+ }
+
+ /**
+ * Rewrites a given URL relative to a base URL. The base URL defaults to
+ * the original location of the document containing the `dom-module` for
+ * this element. This method will return the same URL before and after
+ * bundling.
+ *
+ * Note that this function performs no resolution for URLs that start
+ * with `/` (absolute URLs) or `#` (hash identifiers). For general purpose
+ * URL resolution, use `window.URL`.
+ *
+ * @param {string} url URL to resolve.
+ * @param {string=} base Optional base URL to resolve against, defaults
+ * to the element's `importPath`
+ * @return {string} Rewritten URL relative to base
+ */
+ resolveUrl(url, base) {
+ if (!base && this.importPath) {
+ base = Polymer.ResolveUrl.resolveUrl(this.importPath);
+ }
+ return Polymer.ResolveUrl.resolveUrl(url, base);
+ }
+
+ /**
+ * Overrides `PropertyAccessors` to add map of dynamic functions on
+ * template info, for consumption by `PropertyEffects` template binding
+ * code. This map determines which method templates should have accessors
+ * created for them.
+ *
+ * @override
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static _parseTemplateContent(template, templateInfo, nodeInfo) {
+ templateInfo.dynamicFns = templateInfo.dynamicFns || this._properties;
+ return super._parseTemplateContent(template, templateInfo, nodeInfo);
+ }
+
+ }
+
+ return PolymerElement;
+ });
+
+ /**
+ * Provides basic tracking of element definitions (registrations) and
+ * instance counts.
+ *
+ * @namespace
+ * @summary Provides basic tracking of element definitions (registrations) and
+ * instance counts.
+ */
+ Polymer.telemetry = {
+ /**
+ * Total number of Polymer element instances created.
+ * @type {number}
+ */
+ instanceCount: 0,
+ /**
+ * Array of Polymer element classes that have been finalized.
+ * @type {Array<Polymer.Element>}
+ */
+ registrations: [],
+ /**
+ * @param {!PolymerElementConstructor} prototype Element prototype to log
+ * @this {this}
+ * @private
+ */
+ _regLog: function(prototype) {
+ console.log('[' + prototype.is + ']: registered');
+ },
+ /**
+ * Registers a class prototype for telemetry purposes.
+ * @param {HTMLElement} prototype Element prototype to register
+ * @this {this}
+ * @protected
+ */
+ register: function(prototype) {
+ this.registrations.push(prototype);
+ Polymer.log && this._regLog(prototype);
+ },
+ /**
+ * Logs all elements registered with an `is` to the console.
+ * @public
+ * @this {this}
+ */
+ dumpRegistrations: function() {
+ this.registrations.forEach(this._regLog);
+ }
+ };
+
+ /**
+ * When using the ShadyCSS scoping and custom property shim, causes all
+ * shimmed `styles` (via `custom-style`) in the document (and its subtree)
+ * to be updated based on current custom property values.
+ *
+ * The optional parameter overrides inline custom property styles with an
+ * object of properties where the keys are CSS properties, and the values
+ * are strings.
+ *
+ * Example: `Polymer.updateStyles({'--color': 'blue'})`
+ *
+ * These properties are retained unless a value of `null` is set.
+ *
+ * @param {Object=} props Bag of custom property key/values to
+ * apply to the document.
+ * @return {void}
+ */
+ Polymer.updateStyles = function(props) {
+ if (window.ShadyCSS) {
+ window.ShadyCSS.styleDocument(props);
+ }
+ };
+
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/gesture-event-listeners.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/gesture-event-listeners.html
new file mode 100644
index 00000000000..9ad4f12c8ba
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/gesture-event-listeners.html
@@ -0,0 +1,83 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../utils/boot.html">
+<link rel="import" href="../utils/mixin.html">
+<link rel="import" href="../utils/gestures.html">
+
+<script>
+(function() {
+
+ 'use strict';
+
+ /**
+ * @const {Polymer.Gestures}
+ */
+ const gestures = Polymer.Gestures;
+
+ /**
+ * Element class mixin that provides API for adding Polymer's cross-platform
+ * gesture events to nodes.
+ *
+ * The API is designed to be compatible with override points implemented
+ * in `Polymer.TemplateStamp` such that declarative event listeners in
+ * templates will support gesture events when this mixin is applied along with
+ * `Polymer.TemplateStamp`.
+ *
+ * @mixinFunction
+ * @polymer
+ * @memberof Polymer
+ * @summary Element class mixin that provides API for adding Polymer's cross-platform
+ * gesture events to nodes
+ */
+ Polymer.GestureEventListeners = Polymer.dedupingMixin(superClass => {
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_GestureEventListeners}
+ */
+ class GestureEventListeners extends superClass {
+
+ /**
+ * Add the event listener to the node if it is a gestures event.
+ *
+ * @param {!Node} node Node to add event listener to
+ * @param {string} eventName Name of event
+ * @param {function(!Event):void} handler Listener function to add
+ * @return {void}
+ */
+ _addEventListenerToNode(node, eventName, handler) {
+ if (!gestures.addListener(node, eventName, handler)) {
+ super._addEventListenerToNode(node, eventName, handler);
+ }
+ }
+
+ /**
+ * Remove the event listener to the node if it is a gestures event.
+ *
+ * @param {!Node} node Node to remove event listener from
+ * @param {string} eventName Name of event
+ * @param {function(!Event):void} handler Listener function to remove
+ * @return {void}
+ */
+ _removeEventListenerFromNode(node, eventName, handler) {
+ if (!gestures.removeListener(node, eventName, handler)) {
+ super._removeEventListenerFromNode(node, eventName, handler);
+ }
+ }
+
+ }
+
+ return GestureEventListeners;
+
+ });
+
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/mutable-data.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/mutable-data.html
new file mode 100644
index 00000000000..d5b1587b6d9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/mutable-data.html
@@ -0,0 +1,205 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../utils/mixin.html">
+
+<script>
+(function() {
+ 'use strict';
+
+ // Common implementation for mixin & behavior
+ function mutablePropertyChange(inst, property, value, old, mutableData) {
+ let isObject;
+ if (mutableData) {
+ isObject = (typeof value === 'object' && value !== null);
+ // Pull `old` for Objects from temp cache, but treat `null` as a primitive
+ if (isObject) {
+ old = inst.__dataTemp[property];
+ }
+ }
+ // Strict equality check, but return false for NaN===NaN
+ let shouldChange = (old !== value && (old === old || value === value));
+ // Objects are stored in temporary cache (cleared at end of
+ // turn), which is used for dirty-checking
+ if (isObject && shouldChange) {
+ inst.__dataTemp[property] = value;
+ }
+ return shouldChange;
+ }
+
+ /**
+ * Element class mixin to skip strict dirty-checking for objects and arrays
+ * (always consider them to be "dirty"), for use on elements utilizing
+ * `Polymer.PropertyEffects`
+ *
+ * By default, `Polymer.PropertyEffects` performs strict dirty checking on
+ * objects, which means that any deep modifications to an object or array will
+ * not be propagated unless "immutable" data patterns are used (i.e. all object
+ * references from the root to the mutation were changed).
+ *
+ * Polymer also provides a proprietary data mutation and path notification API
+ * (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient
+ * mutation and notification of deep changes in an object graph to all elements
+ * bound to the same object graph.
+ *
+ * In cases where neither immutable patterns nor the data mutation API can be
+ * used, applying this mixin will cause Polymer to skip dirty checking for
+ * objects and arrays (always consider them to be "dirty"). This allows a
+ * user to make a deep modification to a bound object graph, and then either
+ * simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath`
+ * (e.g. `this.notifyPath('items')`) to update the tree. Note that all
+ * elements that wish to be updated based on deep mutations must apply this
+ * mixin or otherwise skip strict dirty checking for objects/arrays.
+ * Specifically, any elements in the binding tree between the source of a
+ * mutation and the consumption of it must apply this mixin or enable the
+ * `Polymer.OptionalMutableData` mixin.
+ *
+ * In order to make the dirty check strategy configurable, see
+ * `Polymer.OptionalMutableData`.
+ *
+ * Note, the performance characteristics of propagating large object graphs
+ * will be worse as opposed to using strict dirty checking with immutable
+ * patterns or Polymer's path notification API.
+ *
+ * @mixinFunction
+ * @polymer
+ * @memberof Polymer
+ * @summary Element class mixin to skip strict dirty-checking for objects
+ * and arrays
+ */
+ Polymer.MutableData = Polymer.dedupingMixin(superClass => {
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_MutableData}
+ */
+ class MutableData extends superClass {
+ /**
+ * Overrides `Polymer.PropertyEffects` to provide option for skipping
+ * strict equality checking for Objects and Arrays.
+ *
+ * This method pulls the value to dirty check against from the `__dataTemp`
+ * cache (rather than the normal `__data` cache) for Objects. Since the temp
+ * cache is cleared at the end of a turn, this implementation allows
+ * side-effects of deep object changes to be processed by re-setting the
+ * same object (using the temp cache as an in-turn backstop to prevent
+ * cycles due to 2-way notification).
+ *
+ * @param {string} property Property name
+ * @param {*} value New property value
+ * @param {*} old Previous property value
+ * @return {boolean} Whether the property should be considered a change
+ * @protected
+ */
+ _shouldPropertyChange(property, value, old) {
+ return mutablePropertyChange(this, property, value, old, true);
+ }
+
+ }
+
+ return MutableData;
+
+ });
+
+
+ /**
+ * Element class mixin to add the optional ability to skip strict
+ * dirty-checking for objects and arrays (always consider them to be
+ * "dirty") by setting a `mutable-data` attribute on an element instance.
+ *
+ * By default, `Polymer.PropertyEffects` performs strict dirty checking on
+ * objects, which means that any deep modifications to an object or array will
+ * not be propagated unless "immutable" data patterns are used (i.e. all object
+ * references from the root to the mutation were changed).
+ *
+ * Polymer also provides a proprietary data mutation and path notification API
+ * (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient
+ * mutation and notification of deep changes in an object graph to all elements
+ * bound to the same object graph.
+ *
+ * In cases where neither immutable patterns nor the data mutation API can be
+ * used, applying this mixin will allow Polymer to skip dirty checking for
+ * objects and arrays (always consider them to be "dirty"). This allows a
+ * user to make a deep modification to a bound object graph, and then either
+ * simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath`
+ * (e.g. `this.notifyPath('items')`) to update the tree. Note that all
+ * elements that wish to be updated based on deep mutations must apply this
+ * mixin or otherwise skip strict dirty checking for objects/arrays.
+ * Specifically, any elements in the binding tree between the source of a
+ * mutation and the consumption of it must enable this mixin or apply the
+ * `Polymer.MutableData` mixin.
+ *
+ * While this mixin adds the ability to forgo Object/Array dirty checking,
+ * the `mutableData` flag defaults to false and must be set on the instance.
+ *
+ * Note, the performance characteristics of propagating large object graphs
+ * will be worse by relying on `mutableData: true` as opposed to using
+ * strict dirty checking with immutable patterns or Polymer's path notification
+ * API.
+ *
+ * @mixinFunction
+ * @polymer
+ * @memberof Polymer
+ * @summary Element class mixin to optionally skip strict dirty-checking
+ * for objects and arrays
+ */
+ Polymer.OptionalMutableData = Polymer.dedupingMixin(superClass => {
+
+ /**
+ * @mixinClass
+ * @polymer
+ * @implements {Polymer_OptionalMutableData}
+ */
+ class OptionalMutableData extends superClass {
+
+ static get properties() {
+ return {
+ /**
+ * Instance-level flag for configuring the dirty-checking strategy
+ * for this element. When true, Objects and Arrays will skip dirty
+ * checking, otherwise strict equality checking will be used.
+ */
+ mutableData: Boolean
+ };
+ }
+
+ /**
+ * Overrides `Polymer.PropertyEffects` to provide option for skipping
+ * strict equality checking for Objects and Arrays.
+ *
+ * When `this.mutableData` is true on this instance, this method
+ * pulls the value to dirty check against from the `__dataTemp` cache
+ * (rather than the normal `__data` cache) for Objects. Since the temp
+ * cache is cleared at the end of a turn, this implementation allows
+ * side-effects of deep object changes to be processed by re-setting the
+ * same object (using the temp cache as an in-turn backstop to prevent
+ * cycles due to 2-way notification).
+ *
+ * @param {string} property Property name
+ * @param {*} value New property value
+ * @param {*} old Previous property value
+ * @return {boolean} Whether the property should be considered a change
+ * @protected
+ */
+ _shouldPropertyChange(property, value, old) {
+ return mutablePropertyChange(this, property, value, old, this.mutableData);
+ }
+ }
+
+ return OptionalMutableData;
+
+ });
+
+ // Export for use by legacy behavior
+ Polymer.MutableData._mutablePropertyChange = mutablePropertyChange;
+
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/properties-changed.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/properties-changed.html
new file mode 100644
index 00000000000..000c1374afc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/properties-changed.html
@@ -0,0 +1,534 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../utils/boot.html">
+<link rel="import" href="../utils/mixin.html">
+<link rel="import" href="../utils/async.html">
+
+<script>
+ (function () {
+
+ 'use strict';
+
+ /** @const {!AsyncInterface} */
+ const microtask = Polymer.Async.microTask;
+
+ /**
+ * Element class mixin that provides basic meta-programming for creating one
+ * or more property accessors (getter/setter pair) that enqueue an async
+ * (batched) `_propertiesChanged` callback.
+ *
+ * For basic usage of this mixin, call `MyClass.createProperties(props)`
+ * once at class definition time to create property accessors for properties
+ * named in props, implement `_propertiesChanged` to react as desired to
+ * property changes, and implement `static get observedAttributes()` and
+ * include lowercase versions of any property names that should be set from
+ * attributes. Last, call `this._enableProperties()` in the element's
+ * `connectedCallback` to enable the accessors.
+ *
+ * @mixinFunction
+ * @polymer
+ * @memberof Polymer
+ * @summary Element class mixin for reacting to property changes from
+ * generated property accessors.
+ */
+ Polymer.PropertiesChanged = Polymer.dedupingMixin(superClass => {
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @extends {superClass}
+ * @implements {Polymer_PropertiesChanged}
+ * @unrestricted
+ */
+ class PropertiesChanged extends superClass {
+
+ /**
+ * Creates property accessors for the given property names.
+ * @param {!Object} props Object whose keys are names of accessors.
+ * @return {void}
+ * @protected
+ */
+ static createProperties(props) {
+ const proto = this.prototype;
+ for (let prop in props) {
+ // don't stomp an existing accessor
+ if (!(prop in proto)) {
+ proto._createPropertyAccessor(prop);
+ }
+ }
+ }
+
+ /**
+ * Returns an attribute name that corresponds to the given property.
+ * The attribute name is the lowercased property name. Override to
+ * customize this mapping.
+ * @param {string} property Property to convert
+ * @return {string} Attribute name corresponding to the given property.
+ *
+ * @protected
+ */
+ static attributeNameForProperty(property) {
+ return property.toLowerCase();
+ }
+
+ /**
+ * Override point to provide a type to which to deserialize a value to
+ * a given property.
+ * @param {string} name Name of property
+ *
+ * @protected
+ */
+ static typeForProperty(name) { } //eslint-disable-line no-unused-vars
+
+ /**
+ * Creates a setter/getter pair for the named property with its own
+ * local storage. The getter returns the value in the local storage,
+ * and the setter calls `_setProperty`, which updates the local storage
+ * for the property and enqueues a `_propertiesChanged` callback.
+ *
+ * This method may be called on a prototype or an instance. Calling
+ * this method may overwrite a property value that already exists on
+ * the prototype/instance by creating the accessor.
+ *
+ * @param {string} property Name of the property
+ * @param {boolean=} readOnly When true, no setter is created; the
+ * protected `_setProperty` function must be used to set the property
+ * @return {void}
+ * @protected
+ */
+ _createPropertyAccessor(property, readOnly) {
+ this._addPropertyToAttributeMap(property);
+ if (!this.hasOwnProperty('__dataHasAccessor')) {
+ this.__dataHasAccessor = Object.assign({}, this.__dataHasAccessor);
+ }
+ if (!this.__dataHasAccessor[property]) {
+ this.__dataHasAccessor[property] = true;
+ this._definePropertyAccessor(property, readOnly);
+ }
+ }
+
+ /**
+ * Adds the given `property` to a map matching attribute names
+ * to property names, using `attributeNameForProperty`. This map is
+ * used when deserializing attribute values to properties.
+ *
+ * @param {string} property Name of the property
+ */
+ _addPropertyToAttributeMap(property) {
+ if (!this.hasOwnProperty('__dataAttributes')) {
+ this.__dataAttributes = Object.assign({}, this.__dataAttributes);
+ }
+ if (!this.__dataAttributes[property]) {
+ const attr = this.constructor.attributeNameForProperty(property);
+ this.__dataAttributes[attr] = property;
+ }
+ }
+
+ /**
+ * Defines a property accessor for the given property.
+ * @param {string} property Name of the property
+ * @param {boolean=} readOnly When true, no setter is created
+ * @return {void}
+ */
+ _definePropertyAccessor(property, readOnly) {
+ Object.defineProperty(this, property, {
+ /* eslint-disable valid-jsdoc */
+ /** @this {PropertiesChanged} */
+ get() {
+ return this._getProperty(property);
+ },
+ /** @this {PropertiesChanged} */
+ set: readOnly ? function () {} : function (value) {
+ this._setProperty(property, value);
+ }
+ /* eslint-enable */
+ });
+ }
+
+ constructor() {
+ super();
+ this.__dataEnabled = false;
+ this.__dataReady = false;
+ this.__dataInvalid = false;
+ this.__data = {};
+ this.__dataPending = null;
+ this.__dataOld = null;
+ this.__dataInstanceProps = null;
+ this.__serializing = false;
+ this._initializeProperties();
+ }
+
+ /**
+ * Lifecycle callback called when properties are enabled via
+ * `_enableProperties`.
+ *
+ * Users may override this function to implement behavior that is
+ * dependent on the element having its property data initialized, e.g.
+ * from defaults (initialized from `constructor`, `_initializeProperties`),
+ * `attributeChangedCallback`, or values propagated from host e.g. via
+ * bindings. `super.ready()` must be called to ensure the data system
+ * becomes enabled.
+ *
+ * @return {void}
+ * @public
+ */
+ ready() {
+ this.__dataReady = true;
+ this._flushProperties();
+ }
+
+ /**
+ * Initializes the local storage for property accessors.
+ *
+ * Provided as an override point for performing any setup work prior
+ * to initializing the property accessor system.
+ *
+ * @return {void}
+ * @protected
+ */
+ _initializeProperties() {
+ // Capture instance properties; these will be set into accessors
+ // during first flush. Don't set them here, since we want
+ // these to overwrite defaults/constructor assignments
+ for (let p in this.__dataHasAccessor) {
+ if (this.hasOwnProperty(p)) {
+ this.__dataInstanceProps = this.__dataInstanceProps || {};
+ this.__dataInstanceProps[p] = this[p];
+ delete this[p];
+ }
+ }
+ }
+
+ /**
+ * Called at ready time with bag of instance properties that overwrote
+ * accessors when the element upgraded.
+ *
+ * The default implementation sets these properties back into the
+ * setter at ready time. This method is provided as an override
+ * point for customizing or providing more efficient initialization.
+ *
+ * @param {Object} props Bag of property values that were overwritten
+ * when creating property accessors.
+ * @return {void}
+ * @protected
+ */
+ _initializeInstanceProperties(props) {
+ Object.assign(this, props);
+ }
+
+ /**
+ * Updates the local storage for a property (via `_setPendingProperty`)
+ * and enqueues a `_proeprtiesChanged` callback.
+ *
+ * @param {string} property Name of the property
+ * @param {*} value Value to set
+ * @return {void}
+ * @protected
+ */
+ _setProperty(property, value) {
+ if (this._setPendingProperty(property, value)) {
+ this._invalidateProperties();
+ }
+ }
+
+ /**
+ * Returns the value for the given property.
+ * @param {string} property Name of property
+ * @return {*} Value for the given property
+ * @protected
+ */
+ _getProperty(property) {
+ return this.__data[property];
+ }
+
+ /* eslint-disable no-unused-vars */
+ /**
+ * Updates the local storage for a property, records the previous value,
+ * and adds it to the set of "pending changes" that will be passed to the
+ * `_propertiesChanged` callback. This method does not enqueue the
+ * `_propertiesChanged` callback.
+ *
+ * @param {string} property Name of the property
+ * @param {*} value Value to set
+ * @param {boolean=} ext Not used here; affordance for closure
+ * @return {boolean} Returns true if the property changed
+ * @protected
+ */
+ _setPendingProperty(property, value, ext) {
+ let old = this.__data[property];
+ let changed = this._shouldPropertyChange(property, value, old);
+ if (changed) {
+ if (!this.__dataPending) {
+ this.__dataPending = {};
+ this.__dataOld = {};
+ }
+ // Ensure old is captured from the last turn
+ if (this.__dataOld && !(property in this.__dataOld)) {
+ this.__dataOld[property] = old;
+ }
+ this.__data[property] = value;
+ this.__dataPending[property] = value;
+ }
+ return changed;
+ }
+ /* eslint-enable */
+
+ /**
+ * Marks the properties as invalid, and enqueues an async
+ * `_propertiesChanged` callback.
+ *
+ * @return {void}
+ * @protected
+ */
+ _invalidateProperties() {
+ if (!this.__dataInvalid && this.__dataReady) {
+ this.__dataInvalid = true;
+ microtask.run(() => {
+ if (this.__dataInvalid) {
+ this.__dataInvalid = false;
+ this._flushProperties();
+ }
+ });
+ }
+ }
+
+ /**
+ * Call to enable property accessor processing. Before this method is
+ * called accessor values will be set but side effects are
+ * queued. When called, any pending side effects occur immediately.
+ * For elements, generally `connectedCallback` is a normal spot to do so.
+ * It is safe to call this method multiple times as it only turns on
+ * property accessors once.
+ *
+ * @return {void}
+ * @protected
+ */
+ _enableProperties() {
+ if (!this.__dataEnabled) {
+ this.__dataEnabled = true;
+ if (this.__dataInstanceProps) {
+ this._initializeInstanceProperties(this.__dataInstanceProps);
+ this.__dataInstanceProps = null;
+ }
+ this.ready();
+ }
+ }
+
+ /**
+ * Calls the `_propertiesChanged` callback with the current set of
+ * pending changes (and old values recorded when pending changes were
+ * set), and resets the pending set of changes. Generally, this method
+ * should not be called in user code.
+ *
+ * @return {void}
+ * @protected
+ */
+ _flushProperties() {
+ const props = this.__data;
+ const changedProps = this.__dataPending;
+ const old = this.__dataOld;
+ if (this._shouldPropertiesChange(props, changedProps, old)) {
+ this.__dataPending = null;
+ this.__dataOld = null;
+ this._propertiesChanged(props, changedProps, old);
+ }
+ }
+
+ /**
+ * Called in `_flushProperties` to determine if `_propertiesChanged`
+ * should be called. The default implementation returns true if
+ * properties are pending. Override to customize when
+ * `_propertiesChanged` is called.
+ * @param {!Object} currentProps Bag of all current accessor values
+ * @param {!Object} changedProps Bag of properties changed since the last
+ * call to `_propertiesChanged`
+ * @param {!Object} oldProps Bag of previous values for each property
+ * in `changedProps`
+ * @return {boolean} true if changedProps is truthy
+ */
+ _shouldPropertiesChange(currentProps, changedProps, oldProps) { // eslint-disable-line no-unused-vars
+ return Boolean(changedProps);
+ }
+
+ /**
+ * Callback called when any properties with accessors created via
+ * `_createPropertyAccessor` have been set.
+ *
+ * @param {!Object} currentProps Bag of all current accessor values
+ * @param {!Object} changedProps Bag of properties changed since the last
+ * call to `_propertiesChanged`
+ * @param {!Object} oldProps Bag of previous values for each property
+ * in `changedProps`
+ * @return {void}
+ * @protected
+ */
+ _propertiesChanged(currentProps, changedProps, oldProps) { // eslint-disable-line no-unused-vars
+ }
+
+ /**
+ * Method called to determine whether a property value should be
+ * considered as a change and cause the `_propertiesChanged` callback
+ * to be enqueued.
+ *
+ * The default implementation returns `true` if a strict equality
+ * check fails. The method always returns false for `NaN`.
+ *
+ * Override this method to e.g. provide stricter checking for
+ * Objects/Arrays when using immutable patterns.
+ *
+ * @param {string} property Property name
+ * @param {*} value New property value
+ * @param {*} old Previous property value
+ * @return {boolean} Whether the property should be considered a change
+ * and enqueue a `_proeprtiesChanged` callback
+ * @protected
+ */
+ _shouldPropertyChange(property, value, old) {
+ return (
+ // Strict equality check
+ (old !== value &&
+ // This ensures (old==NaN, value==NaN) always returns false
+ (old === old || value === value))
+ );
+ }
+
+ /**
+ * Implements native Custom Elements `attributeChangedCallback` to
+ * set an attribute value to a property via `_attributeToProperty`.
+ *
+ * @param {string} name Name of attribute that changed
+ * @param {?string} old Old attribute value
+ * @param {?string} value New attribute value
+ * @return {void}
+ * @suppress {missingProperties} Super may or may not implement the callback
+ */
+ attributeChangedCallback(name, old, value) {
+ if (old !== value) {
+ this._attributeToProperty(name, value);
+ }
+ if (super.attributeChangedCallback) {
+ super.attributeChangedCallback(name, old, value);
+ }
+ }
+
+ /**
+ * Deserializes an attribute to its associated property.
+ *
+ * This method calls the `_deserializeValue` method to convert the string to
+ * a typed value.
+ *
+ * @param {string} attribute Name of attribute to deserialize.
+ * @param {?string} value of the attribute.
+ * @param {*=} type type to deserialize to, defaults to the value
+ * returned from `typeForProperty`
+ * @return {void}
+ */
+ _attributeToProperty(attribute, value, type) {
+ if (!this.__serializing) {
+ const map = this.__dataAttributes;
+ const property = map && map[attribute] || attribute;
+ this[property] = this._deserializeValue(value, type ||
+ this.constructor.typeForProperty(property));
+ }
+ }
+
+ /**
+ * Serializes a property to its associated attribute.
+ *
+ * @suppress {invalidCasts} Closure can't figure out `this` is an element.
+ *
+ * @param {string} property Property name to reflect.
+ * @param {string=} attribute Attribute name to reflect to.
+ * @param {*=} value Property value to refect.
+ * @return {void}
+ */
+ _propertyToAttribute(property, attribute, value) {
+ this.__serializing = true;
+ value = (arguments.length < 3) ? this[property] : value;
+ this._valueToNodeAttribute(/** @type {!HTMLElement} */(this), value,
+ attribute || this.constructor.attributeNameForProperty(property));
+ this.__serializing = false;
+ }
+
+ /**
+ * Sets a typed value to an HTML attribute on a node.
+ *
+ * This method calls the `_serializeValue` method to convert the typed
+ * value to a string. If the `_serializeValue` method returns `undefined`,
+ * the attribute will be removed (this is the default for boolean
+ * type `false`).
+ *
+ * @param {Element} node Element to set attribute to.
+ * @param {*} value Value to serialize.
+ * @param {string} attribute Attribute name to serialize to.
+ * @return {void}
+ */
+ _valueToNodeAttribute(node, value, attribute) {
+ const str = this._serializeValue(value);
+ if (str === undefined) {
+ node.removeAttribute(attribute);
+ } else {
+ node.setAttribute(attribute, str);
+ }
+ }
+
+ /**
+ * Converts a typed JavaScript value to a string.
+ *
+ * This method is called when setting JS property values to
+ * HTML attributes. Users may override this method to provide
+ * serialization for custom types.
+ *
+ * @param {*} value Property value to serialize.
+ * @return {string | undefined} String serialized from the provided
+ * property value.
+ */
+ _serializeValue(value) {
+ switch (typeof value) {
+ case 'boolean':
+ return value ? '' : undefined;
+ default:
+ return value != null ? value.toString() : undefined;
+ }
+ }
+
+ /**
+ * Converts a string to a typed JavaScript value.
+ *
+ * This method is called when reading HTML attribute values to
+ * JS properties. Users may override this method to provide
+ * deserialization for custom `type`s. Types for `Boolean`, `String`,
+ * and `Number` convert attributes to the expected types.
+ *
+ * @param {?string} value Value to deserialize.
+ * @param {*=} type Type to deserialize the string to.
+ * @return {*} Typed value deserialized from the provided string.
+ */
+ _deserializeValue(value, type) {
+ switch (type) {
+ case Boolean:
+ return (value !== null);
+ case Number:
+ return Number(value);
+ default:
+ return value;
+ }
+ }
+
+ }
+
+ return PropertiesChanged;
+ });
+
+
+ })();
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/properties-mixin.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/properties-mixin.html
new file mode 100644
index 00000000000..782311bb8eb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/properties-mixin.html
@@ -0,0 +1,230 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../utils/boot.html">
+<link rel="import" href="../utils/mixin.html">
+<link rel="import" href="../mixins/properties-changed.html">
+
+<script>
+(function() {
+ 'use strict';
+
+ /**
+ * Creates a copy of `props` with each property normalized such that
+ * upgraded it is an object with at least a type property { type: Type}.
+ *
+ * @param {Object} props Properties to normalize
+ * @return {Object} Copy of input `props` with normalized properties that
+ * are in the form {type: Type}
+ * @private
+ */
+ function normalizeProperties(props) {
+ const output = {};
+ for (let p in props) {
+ const o = props[p];
+ output[p] = (typeof o === 'function') ? {type: o} : o;
+ }
+ return output;
+ }
+
+ /**
+ * Mixin that provides a minimal starting point to using the PropertiesChanged
+ * mixin by providing a mechanism to declare properties in a static
+ * getter (e.g. static get properties() { return { foo: String } }). Changes
+ * are reported via the `_propertiesChanged` method.
+ *
+ * This mixin provides no specific support for rendering. Users are expected
+ * to create a ShadowRoot and put content into it and update it in whatever
+ * way makes sense. This can be done in reaction to properties changing by
+ * implementing `_propertiesChanged`.
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin Polymer.PropertiesChanged
+ * @memberof Polymer
+ * @summary Mixin that provides a minimal starting point for using
+ * the PropertiesChanged mixin by providing a declarative `properties` object.
+ */
+ Polymer.PropertiesMixin = Polymer.dedupingMixin(superClass => {
+
+ /**
+ * @constructor
+ * @extends {superClass}
+ * @implements {Polymer_PropertiesChanged}
+ */
+ const base = Polymer.PropertiesChanged(superClass);
+
+ /**
+ * Returns the super class constructor for the given class, if it is an
+ * instance of the PropertiesMixin.
+ *
+ * @param {!PropertiesMixinConstructor} constructor PropertiesMixin constructor
+ * @return {PropertiesMixinConstructor} Super class constructor
+ */
+ function superPropertiesClass(constructor) {
+ const superCtor = Object.getPrototypeOf(constructor);
+
+ // Note, the `PropertiesMixin` class below only refers to the class
+ // generated by this call to the mixin; the instanceof test only works
+ // because the mixin is deduped and guaranteed only to apply once, hence
+ // all constructors in a proto chain will see the same `PropertiesMixin`
+ return (superCtor.prototype instanceof PropertiesMixin) ?
+ /** @type {PropertiesMixinConstructor} */ (superCtor) : null;
+ }
+
+ /**
+ * Returns a memoized version of the `properties` object for the
+ * given class. Properties not in object format are converted to at
+ * least {type}.
+ *
+ * @param {PropertiesMixinConstructor} constructor PropertiesMixin constructor
+ * @return {Object} Memoized properties object
+ */
+ function ownProperties(constructor) {
+ if (!constructor.hasOwnProperty(JSCompiler_renameProperty('__ownProperties', constructor))) {
+ let props = null;
+
+ if (constructor.hasOwnProperty(JSCompiler_renameProperty('properties', constructor)) && constructor.properties) {
+ props = normalizeProperties(constructor.properties);
+ }
+
+ constructor.__ownProperties = props;
+ }
+ return constructor.__ownProperties;
+ }
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @extends {base}
+ * @implements {Polymer_PropertiesMixin}
+ * @unrestricted
+ */
+ class PropertiesMixin extends base {
+
+ /**
+ * Implements standard custom elements getter to observes the attributes
+ * listed in `properties`.
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static get observedAttributes() {
+ const props = this._properties;
+ return props ? Object.keys(props).map(p => this.attributeNameForProperty(p)) : [];
+ }
+
+ /**
+ * Finalizes an element definition, including ensuring any super classes
+ * are also finalized. This includes ensuring property
+ * accessors exist on the element prototype. This method calls
+ * `_finalizeClass` to finalize each constructor in the prototype chain.
+ * @return {void}
+ */
+ static finalize() {
+ if (!this.hasOwnProperty(JSCompiler_renameProperty('__finalized', this))) {
+ const superCtor = superPropertiesClass(/** @type {PropertiesMixinConstructor} */(this));
+ if (superCtor) {
+ superCtor.finalize();
+ }
+ this.__finalized = true;
+ this._finalizeClass();
+ }
+ }
+
+ /**
+ * Finalize an element class. This includes ensuring property
+ * accessors exist on the element prototype. This method is called by
+ * `finalize` and finalizes the class constructor.
+ *
+ * @protected
+ */
+ static _finalizeClass() {
+ const props = ownProperties(/** @type {PropertiesMixinConstructor} */(this));
+ if (props) {
+ this.createProperties(props);
+ }
+ }
+
+ /**
+ * Returns a memoized version of all properties, including those inherited
+ * from super classes. Properties not in object format are converted to
+ * at least {type}.
+ *
+ * @return {Object} Object containing properties for this class
+ * @protected
+ */
+ static get _properties() {
+ if (!this.hasOwnProperty(
+ JSCompiler_renameProperty('__properties', this))) {
+ const superCtor = superPropertiesClass(/** @type {PropertiesMixinConstructor} */(this));
+ this.__properties = Object.assign({},
+ superCtor && superCtor._properties,
+ ownProperties(/** @type {PropertiesMixinConstructor} */(this)));
+ }
+ return this.__properties;
+ }
+
+ /**
+ * Overrides `PropertiesChanged` method to return type specified in the
+ * static `properties` object for the given property.
+ * @param {string} name Name of property
+ * @return {*} Type to which to deserialize attribute
+ *
+ * @protected
+ */
+ static typeForProperty(name) {
+ const info = this._properties[name];
+ return info && info.type;
+ }
+
+ /**
+ * Overrides `PropertiesChanged` method and adds a call to
+ * `finalize` which lazily configures the element's property accessors.
+ * @override
+ * @return {void}
+ */
+ _initializeProperties() {
+ this.constructor.finalize();
+ super._initializeProperties();
+ }
+
+ /**
+ * Called when the element is added to a document.
+ * Calls `_enableProperties` to turn on property system from
+ * `PropertiesChanged`.
+ * @suppress {missingProperties} Super may or may not implement the callback
+ * @return {void}
+ */
+ connectedCallback() {
+ if (super.connectedCallback) {
+ super.connectedCallback();
+ }
+ this._enableProperties();
+ }
+
+ /**
+ * Called when the element is removed from a document
+ * @suppress {missingProperties} Super may or may not implement the callback
+ * @return {void}
+ */
+ disconnectedCallback() {
+ if (super.disconnectedCallback) {
+ super.disconnectedCallback();
+ }
+ }
+
+ }
+
+ return PropertiesMixin;
+
+ });
+
+})();
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/property-accessors.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/property-accessors.html
new file mode 100644
index 00000000000..f26f467b12f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/property-accessors.html
@@ -0,0 +1,322 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../utils/boot.html">
+<link rel="import" href="../utils/mixin.html">
+<link rel="import" href="../utils/case-map.html">
+<link rel="import" href="properties-changed.html">
+
+<script>
+(function() {
+
+ 'use strict';
+
+ let caseMap = Polymer.CaseMap;
+
+ // Save map of native properties; this forms a blacklist or properties
+ // that won't have their values "saved" by `saveAccessorValue`, since
+ // reading from an HTMLElement accessor from the context of a prototype throws
+ const nativeProperties = {};
+ let proto = HTMLElement.prototype;
+ while (proto) {
+ let props = Object.getOwnPropertyNames(proto);
+ for (let i=0; i<props.length; i++) {
+ nativeProperties[props[i]] = true;
+ }
+ proto = Object.getPrototypeOf(proto);
+ }
+
+ /**
+ * Used to save the value of a property that will be overridden with
+ * an accessor. If the `model` is a prototype, the values will be saved
+ * in `__dataProto`, and it's up to the user (or downstream mixin) to
+ * decide how/when to set these values back into the accessors.
+ * If `model` is already an instance (it has a `__data` property), then
+ * the value will be set as a pending property, meaning the user should
+ * call `_invalidateProperties` or `_flushProperties` to take effect
+ *
+ * @param {Object} model Prototype or instance
+ * @param {string} property Name of property
+ * @return {void}
+ * @private
+ */
+ function saveAccessorValue(model, property) {
+ // Don't read/store value for any native properties since they could throw
+ if (!nativeProperties[property]) {
+ let value = model[property];
+ if (value !== undefined) {
+ if (model.__data) {
+ // Adding accessor to instance; update the property
+ // It is the user's responsibility to call _flushProperties
+ model._setPendingProperty(property, value);
+ } else {
+ // Adding accessor to proto; save proto's value for instance-time use
+ if (!model.__dataProto) {
+ model.__dataProto = {};
+ } else if (!model.hasOwnProperty(JSCompiler_renameProperty('__dataProto', model))) {
+ model.__dataProto = Object.create(model.__dataProto);
+ }
+ model.__dataProto[property] = value;
+ }
+ }
+ }
+ }
+
+ /**
+ * Element class mixin that provides basic meta-programming for creating one
+ * or more property accessors (getter/setter pair) that enqueue an async
+ * (batched) `_propertiesChanged` callback.
+ *
+ * For basic usage of this mixin:
+ *
+ * - Declare attributes to observe via the standard `static get observedAttributes()`. Use
+ * `dash-case` attribute names to represent `camelCase` property names.
+ * - Implement the `_propertiesChanged` callback on the class.
+ * - Call `MyClass.createPropertiesForAttributes()` **once** on the class to generate
+ * property accessors for each observed attribute. This must be called before the first
+ * instance is created, for example, by calling it before calling `customElements.define`.
+ * It can also be called lazily from the element's `constructor`, as long as it's guarded so
+ * that the call is only made once, when the first instance is created.
+ * - Call `this._enableProperties()` in the element's `connectedCallback` to enable
+ * the accessors.
+ *
+ * Any `observedAttributes` will automatically be
+ * deserialized via `attributeChangedCallback` and set to the associated
+ * property using `dash-case`-to-`camelCase` convention.
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin Polymer.PropertiesChanged
+ * @memberof Polymer
+ * @summary Element class mixin for reacting to property changes from
+ * generated property accessors.
+ */
+ Polymer.PropertyAccessors = Polymer.dedupingMixin(superClass => {
+
+ /**
+ * @constructor
+ * @extends {superClass}
+ * @implements {Polymer_PropertiesChanged}
+ * @unrestricted
+ */
+ const base = Polymer.PropertiesChanged(superClass);
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_PropertyAccessors}
+ * @extends {base}
+ * @unrestricted
+ */
+ class PropertyAccessors extends base {
+
+ /**
+ * Generates property accessors for all attributes in the standard
+ * static `observedAttributes` array.
+ *
+ * Attribute names are mapped to property names using the `dash-case` to
+ * `camelCase` convention
+ *
+ * @return {void}
+ */
+ static createPropertiesForAttributes() {
+ let a$ = this.observedAttributes;
+ for (let i=0; i < a$.length; i++) {
+ this.prototype._createPropertyAccessor(caseMap.dashToCamelCase(a$[i]));
+ }
+ }
+
+ /**
+ * Returns an attribute name that corresponds to the given property.
+ * By default, converts camel to dash case, e.g. `fooBar` to `foo-bar`.
+ * @param {string} property Property to convert
+ * @return {string} Attribute name corresponding to the given property.
+ *
+ * @protected
+ */
+ static attributeNameForProperty(property) {
+ return caseMap.camelToDashCase(property);
+ }
+
+ /**
+ * Overrides PropertiesChanged implementation to initialize values for
+ * accessors created for values that already existed on the element
+ * prototype.
+ *
+ * @return {void}
+ * @protected
+ */
+ _initializeProperties() {
+ if (this.__dataProto) {
+ this._initializeProtoProperties(this.__dataProto);
+ this.__dataProto = null;
+ }
+ super._initializeProperties();
+ }
+
+ /**
+ * Called at instance time with bag of properties that were overwritten
+ * by accessors on the prototype when accessors were created.
+ *
+ * The default implementation sets these properties back into the
+ * setter at instance time. This method is provided as an override
+ * point for customizing or providing more efficient initialization.
+ *
+ * @param {Object} props Bag of property values that were overwritten
+ * when creating property accessors.
+ * @return {void}
+ * @protected
+ */
+ _initializeProtoProperties(props) {
+ for (let p in props) {
+ this._setProperty(p, props[p]);
+ }
+ }
+
+ /**
+ * Ensures the element has the given attribute. If it does not,
+ * assigns the given value to the attribute.
+ *
+ * @suppress {invalidCasts} Closure can't figure out `this` is infact an element
+ *
+ * @param {string} attribute Name of attribute to ensure is set.
+ * @param {string} value of the attribute.
+ * @return {void}
+ */
+ _ensureAttribute(attribute, value) {
+ const el = /** @type {!HTMLElement} */(this);
+ if (!el.hasAttribute(attribute)) {
+ this._valueToNodeAttribute(el, value, attribute);
+ }
+ }
+
+ /**
+ * Overrides PropertiesChanged implemention to serialize objects as JSON.
+ *
+ * @param {*} value Property value to serialize.
+ * @return {string | undefined} String serialized from the provided property value.
+ */
+ _serializeValue(value) {
+ /* eslint-disable no-fallthrough */
+ switch (typeof value) {
+ case 'object':
+ if (value instanceof Date) {
+ return value.toString();
+ } else if (value) {
+ try {
+ return JSON.stringify(value);
+ } catch(x) {
+ return '';
+ }
+ }
+
+ default:
+ return super._serializeValue(value);
+ }
+ }
+
+ /**
+ * Converts a string to a typed JavaScript value.
+ *
+ * This method is called by Polymer when reading HTML attribute values to
+ * JS properties. Users may override this method on Polymer element
+ * prototypes to provide deserialization for custom `type`s. Note,
+ * the `type` argument is the value of the `type` field provided in the
+ * `properties` configuration object for a given property, and is
+ * by convention the constructor for the type to deserialize.
+ *
+ *
+ * @param {?string} value Attribute value to deserialize.
+ * @param {*=} type Type to deserialize the string to.
+ * @return {*} Typed value deserialized from the provided string.
+ */
+ _deserializeValue(value, type) {
+ /**
+ * @type {*}
+ */
+ let outValue;
+ switch (type) {
+ case Object:
+ try {
+ outValue = JSON.parse(/** @type {string} */(value));
+ } catch(x) {
+ // allow non-JSON literals like Strings and Numbers
+ outValue = value;
+ }
+ break;
+ case Array:
+ try {
+ outValue = JSON.parse(/** @type {string} */(value));
+ } catch(x) {
+ outValue = null;
+ console.warn(`Polymer::Attributes: couldn't decode Array as JSON: ${value}`);
+ }
+ break;
+ case Date:
+ outValue = isNaN(value) ? String(value) : Number(value);
+ outValue = new Date(outValue);
+ break;
+ default:
+ outValue = super._deserializeValue(value, type);
+ break;
+ }
+ return outValue;
+ }
+ /* eslint-enable no-fallthrough */
+
+ /**
+ * Overrides PropertiesChanged implementation to save existing prototype
+ * property value so that it can be reset.
+ * @param {string} property Name of the property
+ * @param {boolean=} readOnly When true, no setter is created
+ *
+ * When calling on a prototype, any overwritten values are saved in
+ * `__dataProto`, and it is up to the subclasser to decide how/when
+ * to set those properties back into the accessor. When calling on an
+ * instance, the overwritten value is set via `_setPendingProperty`,
+ * and the user should call `_invalidateProperties` or `_flushProperties`
+ * for the values to take effect.
+ * @protected
+ * @return {void}
+ */
+ _definePropertyAccessor(property, readOnly) {
+ saveAccessorValue(this, property);
+ super._definePropertyAccessor(property, readOnly);
+ }
+
+ /**
+ * Returns true if this library created an accessor for the given property.
+ *
+ * @param {string} property Property name
+ * @return {boolean} True if an accessor was created
+ */
+ _hasAccessor(property) {
+ return this.__dataHasAccessor && this.__dataHasAccessor[property];
+ }
+
+ /**
+ * Returns true if the specified property has a pending change.
+ *
+ * @param {string} prop Property name
+ * @return {boolean} True if property has a pending change
+ * @protected
+ */
+ _isPropertyPending(prop) {
+ return Boolean(this.__dataPending && (prop in this.__dataPending));
+ }
+
+ }
+
+ return PropertyAccessors;
+
+ });
+
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/property-effects.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/property-effects.html
new file mode 100644
index 00000000000..0feb7c9e410
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/property-effects.html
@@ -0,0 +1,2808 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../utils/boot.html">
+<link rel="import" href="../utils/mixin.html">
+<link rel="import" href="../utils/path.html">
+<!-- for notify, reflect -->
+<link rel="import" href="../utils/case-map.html">
+<link rel="import" href="property-accessors.html">
+<!-- for annotated effects -->
+<link rel="import" href="template-stamp.html">
+
+
+<script>
+(function() {
+
+ 'use strict';
+
+ /** @const {Object} */
+ const CaseMap = Polymer.CaseMap;
+
+ // Monotonically increasing unique ID used for de-duping effects triggered
+ // from multiple properties in the same turn
+ let dedupeId = 0;
+
+ /**
+ * Property effect types; effects are stored on the prototype using these keys
+ * @enum {string}
+ */
+ const TYPES = {
+ COMPUTE: '__computeEffects',
+ REFLECT: '__reflectEffects',
+ NOTIFY: '__notifyEffects',
+ PROPAGATE: '__propagateEffects',
+ OBSERVE: '__observeEffects',
+ READ_ONLY: '__readOnly'
+ };
+
+ /** @const {string} */
+ const capitalAttributeRegex = /[A-Z]/;
+
+ /**
+ * @typedef {{
+ * name: (string | undefined),
+ * structured: (boolean | undefined),
+ * wildcard: (boolean | undefined)
+ * }}
+ */
+ let DataTrigger; //eslint-disable-line no-unused-vars
+
+ /**
+ * @typedef {{
+ * info: ?,
+ * trigger: (!DataTrigger | undefined),
+ * fn: (!Function | undefined)
+ * }}
+ */
+ let DataEffect; //eslint-disable-line no-unused-vars
+
+ let PropertyEffectsType; //eslint-disable-line no-unused-vars
+
+ /**
+ * Ensures that the model has an own-property map of effects for the given type.
+ * The model may be a prototype or an instance.
+ *
+ * Property effects are stored as arrays of effects by property in a map,
+ * by named type on the model. e.g.
+ *
+ * __computeEffects: {
+ * foo: [ ... ],
+ * bar: [ ... ]
+ * }
+ *
+ * If the model does not yet have an effect map for the type, one is created
+ * and returned. If it does, but it is not an own property (i.e. the
+ * prototype had effects), the the map is deeply cloned and the copy is
+ * set on the model and returned, ready for new effects to be added.
+ *
+ * @param {Object} model Prototype or instance
+ * @param {string} type Property effect type
+ * @return {Object} The own-property map of effects for the given type
+ * @private
+ */
+ function ensureOwnEffectMap(model, type) {
+ let effects = model[type];
+ if (!effects) {
+ effects = model[type] = {};
+ } else if (!model.hasOwnProperty(type)) {
+ effects = model[type] = Object.create(model[type]);
+ for (let p in effects) {
+ let protoFx = effects[p];
+ let instFx = effects[p] = Array(protoFx.length);
+ for (let i=0; i<protoFx.length; i++) {
+ instFx[i] = protoFx[i];
+ }
+ }
+ }
+ return effects;
+ }
+
+ // -- effects ----------------------------------------------
+
+ /**
+ * Runs all effects of a given type for the given set of property changes
+ * on an instance.
+ *
+ * @param {!PropertyEffectsType} inst The instance with effects to run
+ * @param {Object} effects Object map of property-to-Array of effects
+ * @param {Object} props Bag of current property changes
+ * @param {Object=} oldProps Bag of previous values for changed properties
+ * @param {boolean=} hasPaths True with `props` contains one or more paths
+ * @param {*=} extraArgs Additional metadata to pass to effect function
+ * @return {boolean} True if an effect ran for this property
+ * @private
+ */
+ function runEffects(inst, effects, props, oldProps, hasPaths, extraArgs) {
+ if (effects) {
+ let ran = false;
+ let id = dedupeId++;
+ for (let prop in props) {
+ if (runEffectsForProperty(inst, effects, id, prop, props, oldProps, hasPaths, extraArgs)) {
+ ran = true;
+ }
+ }
+ return ran;
+ }
+ return false;
+ }
+
+ /**
+ * Runs a list of effects for a given property.
+ *
+ * @param {!PropertyEffectsType} inst The instance with effects to run
+ * @param {Object} effects Object map of property-to-Array of effects
+ * @param {number} dedupeId Counter used for de-duping effects
+ * @param {string} prop Name of changed property
+ * @param {*} props Changed properties
+ * @param {*} oldProps Old properties
+ * @param {boolean=} hasPaths True with `props` contains one or more paths
+ * @param {*=} extraArgs Additional metadata to pass to effect function
+ * @return {boolean} True if an effect ran for this property
+ * @private
+ */
+ function runEffectsForProperty(inst, effects, dedupeId, prop, props, oldProps, hasPaths, extraArgs) {
+ let ran = false;
+ let rootProperty = hasPaths ? Polymer.Path.root(prop) : prop;
+ let fxs = effects[rootProperty];
+ if (fxs) {
+ for (let i=0, l=fxs.length, fx; (i<l) && (fx=fxs[i]); i++) {
+ if ((!fx.info || fx.info.lastRun !== dedupeId) &&
+ (!hasPaths || pathMatchesTrigger(prop, fx.trigger))) {
+ if (fx.info) {
+ fx.info.lastRun = dedupeId;
+ }
+ fx.fn(inst, prop, props, oldProps, fx.info, hasPaths, extraArgs);
+ ran = true;
+ }
+ }
+ }
+ return ran;
+ }
+
+ /**
+ * Determines whether a property/path that has changed matches the trigger
+ * criteria for an effect. A trigger is a descriptor with the following
+ * structure, which matches the descriptors returned from `parseArg`.
+ * e.g. for `foo.bar.*`:
+ * ```
+ * trigger: {
+ * name: 'a.b',
+ * structured: true,
+ * wildcard: true
+ * }
+ * ```
+ * If no trigger is given, the path is deemed to match.
+ *
+ * @param {string} path Path or property that changed
+ * @param {DataTrigger} trigger Descriptor
+ * @return {boolean} Whether the path matched the trigger
+ */
+ function pathMatchesTrigger(path, trigger) {
+ if (trigger) {
+ let triggerPath = trigger.name;
+ return (triggerPath == path) ||
+ (trigger.structured && Polymer.Path.isAncestor(triggerPath, path)) ||
+ (trigger.wildcard && Polymer.Path.isDescendant(triggerPath, path));
+ } else {
+ return true;
+ }
+ }
+
+ /**
+ * Implements the "observer" effect.
+ *
+ * Calls the method with `info.methodName` on the instance, passing the
+ * new and old values.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {string} property Name of property
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {?} info Effect metadata
+ * @return {void}
+ * @private
+ */
+ function runObserverEffect(inst, property, props, oldProps, info) {
+ let fn = typeof info.method === "string" ? inst[info.method] : info.method;
+ let changedProp = info.property;
+ if (fn) {
+ fn.call(inst, inst.__data[changedProp], oldProps[changedProp]);
+ } else if (!info.dynamicFn) {
+ console.warn('observer method `' + info.method + '` not defined');
+ }
+ }
+
+ /**
+ * Runs "notify" effects for a set of changed properties.
+ *
+ * This method differs from the generic `runEffects` method in that it
+ * will dispatch path notification events in the case that the property
+ * changed was a path and the root property for that path didn't have a
+ * "notify" effect. This is to maintain 1.0 behavior that did not require
+ * `notify: true` to ensure object sub-property notifications were
+ * sent.
+ *
+ * @param {!PropertyEffectsType} inst The instance with effects to run
+ * @param {Object} notifyProps Bag of properties to notify
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {boolean} hasPaths True with `props` contains one or more paths
+ * @return {void}
+ * @private
+ */
+ function runNotifyEffects(inst, notifyProps, props, oldProps, hasPaths) {
+ // Notify
+ let fxs = inst[TYPES.NOTIFY];
+ let notified;
+ let id = dedupeId++;
+ // Try normal notify effects; if none, fall back to try path notification
+ for (let prop in notifyProps) {
+ if (notifyProps[prop]) {
+ if (fxs && runEffectsForProperty(inst, fxs, id, prop, props, oldProps, hasPaths)) {
+ notified = true;
+ } else if (hasPaths && notifyPath(inst, prop, props)) {
+ notified = true;
+ }
+ }
+ }
+ // Flush host if we actually notified and host was batching
+ // And the host has already initialized clients; this prevents
+ // an issue with a host observing data changes before clients are ready.
+ let host;
+ if (notified && (host = inst.__dataHost) && host._invalidateProperties) {
+ host._invalidateProperties();
+ }
+ }
+
+ /**
+ * Dispatches {property}-changed events with path information in the detail
+ * object to indicate a sub-path of the property was changed.
+ *
+ * @param {!PropertyEffectsType} inst The element from which to fire the event
+ * @param {string} path The path that was changed
+ * @param {Object} props Bag of current property changes
+ * @return {boolean} Returns true if the path was notified
+ * @private
+ */
+ function notifyPath(inst, path, props) {
+ let rootProperty = Polymer.Path.root(path);
+ if (rootProperty !== path) {
+ let eventName = Polymer.CaseMap.camelToDashCase(rootProperty) + '-changed';
+ dispatchNotifyEvent(inst, eventName, props[path], path);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Dispatches {property}-changed events to indicate a property (or path)
+ * changed.
+ *
+ * @param {!PropertyEffectsType} inst The element from which to fire the event
+ * @param {string} eventName The name of the event to send ('{property}-changed')
+ * @param {*} value The value of the changed property
+ * @param {string | null | undefined} path If a sub-path of this property changed, the path
+ * that changed (optional).
+ * @return {void}
+ * @private
+ * @suppress {invalidCasts}
+ */
+ function dispatchNotifyEvent(inst, eventName, value, path) {
+ let detail = {
+ value: value,
+ queueProperty: true
+ };
+ if (path) {
+ detail.path = path;
+ }
+ /** @type {!HTMLElement} */(inst).dispatchEvent(new CustomEvent(eventName, { detail }));
+ }
+
+ /**
+ * Implements the "notify" effect.
+ *
+ * Dispatches a non-bubbling event named `info.eventName` on the instance
+ * with a detail object containing the new `value`.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {string} property Name of property
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {?} info Effect metadata
+ * @param {boolean} hasPaths True with `props` contains one or more paths
+ * @return {void}
+ * @private
+ */
+ function runNotifyEffect(inst, property, props, oldProps, info, hasPaths) {
+ let rootProperty = hasPaths ? Polymer.Path.root(property) : property;
+ let path = rootProperty != property ? property : null;
+ let value = path ? Polymer.Path.get(inst, path) : inst.__data[property];
+ if (path && value === undefined) {
+ value = props[property]; // specifically for .splices
+ }
+ dispatchNotifyEvent(inst, info.eventName, value, path);
+ }
+
+ /**
+ * Handler function for 2-way notification events. Receives context
+ * information captured in the `addNotifyListener` closure from the
+ * `__notifyListeners` metadata.
+ *
+ * Sets the value of the notified property to the host property or path. If
+ * the event contained path information, translate that path to the host
+ * scope's name for that path first.
+ *
+ * @param {CustomEvent} event Notification event (e.g. '<property>-changed')
+ * @param {!PropertyEffectsType} inst Host element instance handling the notification event
+ * @param {string} fromProp Child element property that was bound
+ * @param {string} toPath Host property/path that was bound
+ * @param {boolean} negate Whether the binding was negated
+ * @return {void}
+ * @private
+ */
+ function handleNotification(event, inst, fromProp, toPath, negate) {
+ let value;
+ let detail = /** @type {Object} */(event.detail);
+ let fromPath = detail && detail.path;
+ if (fromPath) {
+ toPath = Polymer.Path.translate(fromProp, toPath, fromPath);
+ value = detail && detail.value;
+ } else {
+ value = event.target[fromProp];
+ }
+ value = negate ? !value : value;
+ if (!inst[TYPES.READ_ONLY] || !inst[TYPES.READ_ONLY][toPath]) {
+ if (inst._setPendingPropertyOrPath(toPath, value, true, Boolean(fromPath))
+ && (!detail || !detail.queueProperty)) {
+ inst._invalidateProperties();
+ }
+ }
+ }
+
+ /**
+ * Implements the "reflect" effect.
+ *
+ * Sets the attribute named `info.attrName` to the given property value.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {string} property Name of property
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {?} info Effect metadata
+ * @return {void}
+ * @private
+ */
+ function runReflectEffect(inst, property, props, oldProps, info) {
+ let value = inst.__data[property];
+ if (Polymer.sanitizeDOMValue) {
+ value = Polymer.sanitizeDOMValue(value, info.attrName, 'attribute', /** @type {Node} */(inst));
+ }
+ inst._propertyToAttribute(property, info.attrName, value);
+ }
+
+ /**
+ * Runs "computed" effects for a set of changed properties.
+ *
+ * This method differs from the generic `runEffects` method in that it
+ * continues to run computed effects based on the output of each pass until
+ * there are no more newly computed properties. This ensures that all
+ * properties that will be computed by the initial set of changes are
+ * computed before other effects (binding propagation, observers, and notify)
+ * run.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {!Object} changedProps Bag of changed properties
+ * @param {!Object} oldProps Bag of previous values for changed properties
+ * @param {boolean} hasPaths True with `props` contains one or more paths
+ * @return {void}
+ * @private
+ */
+ function runComputedEffects(inst, changedProps, oldProps, hasPaths) {
+ let computeEffects = inst[TYPES.COMPUTE];
+ if (computeEffects) {
+ let inputProps = changedProps;
+ while (runEffects(inst, computeEffects, inputProps, oldProps, hasPaths)) {
+ Object.assign(oldProps, inst.__dataOld);
+ Object.assign(changedProps, inst.__dataPending);
+ inputProps = inst.__dataPending;
+ inst.__dataPending = null;
+ }
+ }
+ }
+
+ /**
+ * Implements the "computed property" effect by running the method with the
+ * values of the arguments specified in the `info` object and setting the
+ * return value to the computed property specified.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {string} property Name of property
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {?} info Effect metadata
+ * @return {void}
+ * @private
+ */
+ function runComputedEffect(inst, property, props, oldProps, info) {
+ let result = runMethodEffect(inst, property, props, oldProps, info);
+ let computedProp = info.methodInfo;
+ if (inst.__dataHasAccessor && inst.__dataHasAccessor[computedProp]) {
+ inst._setPendingProperty(computedProp, result, true);
+ } else {
+ inst[computedProp] = result;
+ }
+ }
+
+ /**
+ * Computes path changes based on path links set up using the `linkPaths`
+ * API.
+ *
+ * @param {!PropertyEffectsType} inst The instance whose props are changing
+ * @param {string | !Array<(string|number)>} path Path that has changed
+ * @param {*} value Value of changed path
+ * @return {void}
+ * @private
+ */
+ function computeLinkedPaths(inst, path, value) {
+ let links = inst.__dataLinkedPaths;
+ if (links) {
+ let link;
+ for (let a in links) {
+ let b = links[a];
+ if (Polymer.Path.isDescendant(a, path)) {
+ link = Polymer.Path.translate(a, b, path);
+ inst._setPendingPropertyOrPath(link, value, true, true);
+ } else if (Polymer.Path.isDescendant(b, path)) {
+ link = Polymer.Path.translate(b, a, path);
+ inst._setPendingPropertyOrPath(link, value, true, true);
+ }
+ }
+ }
+ }
+
+ // -- bindings ----------------------------------------------
+
+ /**
+ * Adds binding metadata to the current `nodeInfo`, and binding effects
+ * for all part dependencies to `templateInfo`.
+ *
+ * @param {Function} constructor Class that `_parseTemplate` is currently
+ * running on
+ * @param {TemplateInfo} templateInfo Template metadata for current template
+ * @param {NodeInfo} nodeInfo Node metadata for current template node
+ * @param {string} kind Binding kind, either 'property', 'attribute', or 'text'
+ * @param {string} target Target property name
+ * @param {!Array<!BindingPart>} parts Array of binding part metadata
+ * @param {string=} literal Literal text surrounding binding parts (specified
+ * only for 'property' bindings, since these must be initialized as part
+ * of boot-up)
+ * @return {void}
+ * @private
+ */
+ function addBinding(constructor, templateInfo, nodeInfo, kind, target, parts, literal) {
+ // Create binding metadata and add to nodeInfo
+ nodeInfo.bindings = nodeInfo.bindings || [];
+ let /** Binding */ binding = { kind, target, parts, literal, isCompound: (parts.length !== 1) };
+ nodeInfo.bindings.push(binding);
+ // Add listener info to binding metadata
+ if (shouldAddListener(binding)) {
+ let {event, negate} = binding.parts[0];
+ binding.listenerEvent = event || (CaseMap.camelToDashCase(target) + '-changed');
+ binding.listenerNegate = negate;
+ }
+ // Add "propagate" property effects to templateInfo
+ let index = templateInfo.nodeInfoList.length;
+ for (let i=0; i<binding.parts.length; i++) {
+ let part = binding.parts[i];
+ part.compoundIndex = i;
+ addEffectForBindingPart(constructor, templateInfo, binding, part, index);
+ }
+ }
+
+ /**
+ * Adds property effects to the given `templateInfo` for the given binding
+ * part.
+ *
+ * @param {Function} constructor Class that `_parseTemplate` is currently
+ * running on
+ * @param {TemplateInfo} templateInfo Template metadata for current template
+ * @param {!Binding} binding Binding metadata
+ * @param {!BindingPart} part Binding part metadata
+ * @param {number} index Index into `nodeInfoList` for this node
+ * @return {void}
+ */
+ function addEffectForBindingPart(constructor, templateInfo, binding, part, index) {
+ if (!part.literal) {
+ if (binding.kind === 'attribute' && binding.target[0] === '-') {
+ console.warn('Cannot set attribute ' + binding.target +
+ ' because "-" is not a valid attribute starting character');
+ } else {
+ let dependencies = part.dependencies;
+ let info = { index, binding, part, evaluator: constructor };
+ for (let j=0; j<dependencies.length; j++) {
+ let trigger = dependencies[j];
+ if (typeof trigger == 'string') {
+ trigger = parseArg(trigger);
+ trigger.wildcard = true;
+ }
+ constructor._addTemplatePropertyEffect(templateInfo, trigger.rootProperty, {
+ fn: runBindingEffect,
+ info, trigger
+ });
+ }
+ }
+ }
+ }
+
+ /**
+ * Implements the "binding" (property/path binding) effect.
+ *
+ * Note that binding syntax is overridable via `_parseBindings` and
+ * `_evaluateBinding`. This method will call `_evaluateBinding` for any
+ * non-literal parts returned from `_parseBindings`. However,
+ * there is no support for _path_ bindings via custom binding parts,
+ * as this is specific to Polymer's path binding syntax.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {string} path Name of property
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {?} info Effect metadata
+ * @param {boolean} hasPaths True with `props` contains one or more paths
+ * @param {Array} nodeList List of nodes associated with `nodeInfoList` template
+ * metadata
+ * @return {void}
+ * @private
+ */
+ function runBindingEffect(inst, path, props, oldProps, info, hasPaths, nodeList) {
+ let node = nodeList[info.index];
+ let binding = info.binding;
+ let part = info.part;
+ // Subpath notification: transform path and set to client
+ // e.g.: foo="{{obj.sub}}", path: 'obj.sub.prop', set 'foo.prop'=obj.sub.prop
+ if (hasPaths && part.source && (path.length > part.source.length) &&
+ (binding.kind == 'property') && !binding.isCompound &&
+ node.__isPropertyEffectsClient &&
+ node.__dataHasAccessor && node.__dataHasAccessor[binding.target]) {
+ let value = props[path];
+ path = Polymer.Path.translate(part.source, binding.target, path);
+ if (node._setPendingPropertyOrPath(path, value, false, true)) {
+ inst._enqueueClient(node);
+ }
+ } else {
+ let value = info.evaluator._evaluateBinding(inst, part, path, props, oldProps, hasPaths);
+ // Propagate value to child
+ applyBindingValue(inst, node, binding, part, value);
+ }
+ }
+
+ /**
+ * Sets the value for an "binding" (binding) effect to a node,
+ * either as a property or attribute.
+ *
+ * @param {!PropertyEffectsType} inst The instance owning the binding effect
+ * @param {Node} node Target node for binding
+ * @param {!Binding} binding Binding metadata
+ * @param {!BindingPart} part Binding part metadata
+ * @param {*} value Value to set
+ * @return {void}
+ * @private
+ */
+ function applyBindingValue(inst, node, binding, part, value) {
+ value = computeBindingValue(node, value, binding, part);
+ if (Polymer.sanitizeDOMValue) {
+ value = Polymer.sanitizeDOMValue(value, binding.target, binding.kind, node);
+ }
+ if (binding.kind == 'attribute') {
+ // Attribute binding
+ inst._valueToNodeAttribute(/** @type {Element} */(node), value, binding.target);
+ } else {
+ // Property binding
+ let prop = binding.target;
+ if (node.__isPropertyEffectsClient &&
+ node.__dataHasAccessor && node.__dataHasAccessor[prop]) {
+ if (!node[TYPES.READ_ONLY] || !node[TYPES.READ_ONLY][prop]) {
+ if (node._setPendingProperty(prop, value)) {
+ inst._enqueueClient(node);
+ }
+ }
+ } else {
+ inst._setUnmanagedPropertyToNode(node, prop, value);
+ }
+ }
+ }
+
+ /**
+ * Transforms an "binding" effect value based on compound & negation
+ * effect metadata, as well as handling for special-case properties
+ *
+ * @param {Node} node Node the value will be set to
+ * @param {*} value Value to set
+ * @param {!Binding} binding Binding metadata
+ * @param {!BindingPart} part Binding part metadata
+ * @return {*} Transformed value to set
+ * @private
+ */
+ function computeBindingValue(node, value, binding, part) {
+ if (binding.isCompound) {
+ let storage = node.__dataCompoundStorage[binding.target];
+ storage[part.compoundIndex] = value;
+ value = storage.join('');
+ }
+ if (binding.kind !== 'attribute') {
+ // Some browsers serialize `undefined` to `"undefined"`
+ if (binding.target === 'textContent' ||
+ (binding.target === 'value' &&
+ (node.localName === 'input' || node.localName === 'textarea'))) {
+ value = value == undefined ? '' : value;
+ }
+ }
+ return value;
+ }
+
+ /**
+ * Returns true if a binding's metadata meets all the requirements to allow
+ * 2-way binding, and therefore a `<property>-changed` event listener should be
+ * added:
+ * - used curly braces
+ * - is a property (not attribute) binding
+ * - is not a textContent binding
+ * - is not compound
+ *
+ * @param {!Binding} binding Binding metadata
+ * @return {boolean} True if 2-way listener should be added
+ * @private
+ */
+ function shouldAddListener(binding) {
+ return Boolean(binding.target) &&
+ binding.kind != 'attribute' &&
+ binding.kind != 'text' &&
+ !binding.isCompound &&
+ binding.parts[0].mode === '{';
+ }
+
+ /**
+ * Setup compound binding storage structures, notify listeners, and dataHost
+ * references onto the bound nodeList.
+ *
+ * @param {!PropertyEffectsType} inst Instance that bas been previously bound
+ * @param {TemplateInfo} templateInfo Template metadata
+ * @return {void}
+ * @private
+ */
+ function setupBindings(inst, templateInfo) {
+ // Setup compound storage, dataHost, and notify listeners
+ let {nodeList, nodeInfoList} = templateInfo;
+ if (nodeInfoList.length) {
+ for (let i=0; i < nodeInfoList.length; i++) {
+ let info = nodeInfoList[i];
+ let node = nodeList[i];
+ let bindings = info.bindings;
+ if (bindings) {
+ for (let i=0; i<bindings.length; i++) {
+ let binding = bindings[i];
+ setupCompoundStorage(node, binding);
+ addNotifyListener(node, inst, binding);
+ }
+ }
+ node.__dataHost = inst;
+ }
+ }
+ }
+
+ /**
+ * Initializes `__dataCompoundStorage` local storage on a bound node with
+ * initial literal data for compound bindings, and sets the joined
+ * literal parts to the bound property.
+ *
+ * When changes to compound parts occur, they are first set into the compound
+ * storage array for that property, and then the array is joined to result in
+ * the final value set to the property/attribute.
+ *
+ * @param {Node} node Bound node to initialize
+ * @param {Binding} binding Binding metadata
+ * @return {void}
+ * @private
+ */
+ function setupCompoundStorage(node, binding) {
+ if (binding.isCompound) {
+ // Create compound storage map
+ let storage = node.__dataCompoundStorage ||
+ (node.__dataCompoundStorage = {});
+ let parts = binding.parts;
+ // Copy literals from parts into storage for this binding
+ let literals = new Array(parts.length);
+ for (let j=0; j<parts.length; j++) {
+ literals[j] = parts[j].literal;
+ }
+ let target = binding.target;
+ storage[target] = literals;
+ // Configure properties with their literal parts
+ if (binding.literal && binding.kind == 'property') {
+ node[target] = binding.literal;
+ }
+ }
+ }
+
+ /**
+ * Adds a 2-way binding notification event listener to the node specified
+ *
+ * @param {Object} node Child element to add listener to
+ * @param {!PropertyEffectsType} inst Host element instance to handle notification event
+ * @param {Binding} binding Binding metadata
+ * @return {void}
+ * @private
+ */
+ function addNotifyListener(node, inst, binding) {
+ if (binding.listenerEvent) {
+ let part = binding.parts[0];
+ node.addEventListener(binding.listenerEvent, function(e) {
+ handleNotification(e, inst, binding.target, part.source, part.negate);
+ });
+ }
+ }
+
+ // -- for method-based effects (complexObserver & computed) --------------
+
+ /**
+ * Adds property effects for each argument in the method signature (and
+ * optionally, for the method name if `dynamic` is true) that calls the
+ * provided effect function.
+ *
+ * @param {Element | Object} model Prototype or instance
+ * @param {!MethodSignature} sig Method signature metadata
+ * @param {string} type Type of property effect to add
+ * @param {Function} effectFn Function to run when arguments change
+ * @param {*=} methodInfo Effect-specific information to be included in
+ * method effect metadata
+ * @param {boolean|Object=} dynamicFn Boolean or object map indicating whether
+ * method names should be included as a dependency to the effect. Note,
+ * defaults to true if the signature is static (sig.static is true).
+ * @return {void}
+ * @private
+ */
+ function createMethodEffect(model, sig, type, effectFn, methodInfo, dynamicFn) {
+ dynamicFn = sig.static || (dynamicFn &&
+ (typeof dynamicFn !== 'object' || dynamicFn[sig.methodName]));
+ let info = {
+ methodName: sig.methodName,
+ args: sig.args,
+ methodInfo,
+ dynamicFn
+ };
+ for (let i=0, arg; (i<sig.args.length) && (arg=sig.args[i]); i++) {
+ if (!arg.literal) {
+ model._addPropertyEffect(arg.rootProperty, type, {
+ fn: effectFn, info: info, trigger: arg
+ });
+ }
+ }
+ if (dynamicFn) {
+ model._addPropertyEffect(sig.methodName, type, {
+ fn: effectFn, info: info
+ });
+ }
+ }
+
+ /**
+ * Calls a method with arguments marshaled from properties on the instance
+ * based on the method signature contained in the effect metadata.
+ *
+ * Multi-property observers, computed properties, and inline computing
+ * functions call this function to invoke the method, then use the return
+ * value accordingly.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {string} property Name of property
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {?} info Effect metadata
+ * @return {*} Returns the return value from the method invocation
+ * @private
+ */
+ function runMethodEffect(inst, property, props, oldProps, info) {
+ // Instances can optionally have a _methodHost which allows redirecting where
+ // to find methods. Currently used by `templatize`.
+ let context = inst._methodHost || inst;
+ let fn = context[info.methodName];
+ if (fn) {
+ let args = marshalArgs(inst.__data, info.args, property, props);
+ return fn.apply(context, args);
+ } else if (!info.dynamicFn) {
+ console.warn('method `' + info.methodName + '` not defined');
+ }
+ }
+
+ const emptyArray = [];
+
+ // Regular expressions used for binding
+ const IDENT = '(?:' + '[a-zA-Z_$][\\w.:$\\-*]*' + ')';
+ const NUMBER = '(?:' + '[-+]?[0-9]*\\.?[0-9]+(?:[eE][-+]?[0-9]+)?' + ')';
+ const SQUOTE_STRING = '(?:' + '\'(?:[^\'\\\\]|\\\\.)*\'' + ')';
+ const DQUOTE_STRING = '(?:' + '"(?:[^"\\\\]|\\\\.)*"' + ')';
+ const STRING = '(?:' + SQUOTE_STRING + '|' + DQUOTE_STRING + ')';
+ const ARGUMENT = '(?:(' + IDENT + '|' + NUMBER + '|' + STRING + ')\\s*' + ')';
+ const ARGUMENTS = '(?:' + ARGUMENT + '(?:,\\s*' + ARGUMENT + ')*' + ')';
+ const ARGUMENT_LIST = '(?:' + '\\(\\s*' +
+ '(?:' + ARGUMENTS + '?' + ')' +
+ '\\)\\s*' + ')';
+ const BINDING = '(' + IDENT + '\\s*' + ARGUMENT_LIST + '?' + ')'; // Group 3
+ const OPEN_BRACKET = '(\\[\\[|{{)' + '\\s*';
+ const CLOSE_BRACKET = '(?:]]|}})';
+ const NEGATE = '(?:(!)\\s*)?'; // Group 2
+ const EXPRESSION = OPEN_BRACKET + NEGATE + BINDING + CLOSE_BRACKET;
+ const bindingRegex = new RegExp(EXPRESSION, "g");
+
+ /**
+ * Create a string from binding parts of all the literal parts
+ *
+ * @param {!Array<BindingPart>} parts All parts to stringify
+ * @return {string} String made from the literal parts
+ */
+ function literalFromParts(parts) {
+ let s = '';
+ for (let i=0; i<parts.length; i++) {
+ let literal = parts[i].literal;
+ s += literal || '';
+ }
+ return s;
+ }
+
+ /**
+ * Parses an expression string for a method signature, and returns a metadata
+ * describing the method in terms of `methodName`, `static` (whether all the
+ * arguments are literals), and an array of `args`
+ *
+ * @param {string} expression The expression to parse
+ * @return {?MethodSignature} The method metadata object if a method expression was
+ * found, otherwise `undefined`
+ * @private
+ */
+ function parseMethod(expression) {
+ // tries to match valid javascript property names
+ let m = expression.match(/([^\s]+?)\(([\s\S]*)\)/);
+ if (m) {
+ let methodName = m[1];
+ let sig = { methodName, static: true, args: emptyArray };
+ if (m[2].trim()) {
+ // replace escaped commas with comma entity, split on un-escaped commas
+ let args = m[2].replace(/\\,/g, '&comma;').split(',');
+ return parseArgs(args, sig);
+ } else {
+ return sig;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Parses an array of arguments and sets the `args` property of the supplied
+ * signature metadata object. Sets the `static` property to false if any
+ * argument is a non-literal.
+ *
+ * @param {!Array<string>} argList Array of argument names
+ * @param {!MethodSignature} sig Method signature metadata object
+ * @return {!MethodSignature} The updated signature metadata object
+ * @private
+ */
+ function parseArgs(argList, sig) {
+ sig.args = argList.map(function(rawArg) {
+ let arg = parseArg(rawArg);
+ if (!arg.literal) {
+ sig.static = false;
+ }
+ return arg;
+ }, this);
+ return sig;
+ }
+
+ /**
+ * Parses an individual argument, and returns an argument metadata object
+ * with the following fields:
+ *
+ * {
+ * value: 'prop', // property/path or literal value
+ * literal: false, // whether argument is a literal
+ * structured: false, // whether the property is a path
+ * rootProperty: 'prop', // the root property of the path
+ * wildcard: false // whether the argument was a wildcard '.*' path
+ * }
+ *
+ * @param {string} rawArg The string value of the argument
+ * @return {!MethodArg} Argument metadata object
+ * @private
+ */
+ function parseArg(rawArg) {
+ // clean up whitespace
+ let arg = rawArg.trim()
+ // replace comma entity with comma
+ .replace(/&comma;/g, ',')
+ // repair extra escape sequences; note only commas strictly need
+ // escaping, but we allow any other char to be escaped since its
+ // likely users will do this
+ .replace(/\\(.)/g, '\$1')
+ ;
+ // basic argument descriptor
+ let a = {
+ name: arg,
+ value: '',
+ literal: false
+ };
+ // detect literal value (must be String or Number)
+ let fc = arg[0];
+ if (fc === '-') {
+ fc = arg[1];
+ }
+ if (fc >= '0' && fc <= '9') {
+ fc = '#';
+ }
+ switch(fc) {
+ case "'":
+ case '"':
+ a.value = arg.slice(1, -1);
+ a.literal = true;
+ break;
+ case '#':
+ a.value = Number(arg);
+ a.literal = true;
+ break;
+ }
+ // if not literal, look for structured path
+ if (!a.literal) {
+ a.rootProperty = Polymer.Path.root(arg);
+ // detect structured path (has dots)
+ a.structured = Polymer.Path.isPath(arg);
+ if (a.structured) {
+ a.wildcard = (arg.slice(-2) == '.*');
+ if (a.wildcard) {
+ a.name = arg.slice(0, -2);
+ }
+ }
+ }
+ return a;
+ }
+
+ /**
+ * Gather the argument values for a method specified in the provided array
+ * of argument metadata.
+ *
+ * The `path` and `value` arguments are used to fill in wildcard descriptor
+ * when the method is being called as a result of a path notification.
+ *
+ * @param {Object} data Instance data storage object to read properties from
+ * @param {!Array<!MethodArg>} args Array of argument metadata
+ * @param {string} path Property/path name that triggered the method effect
+ * @param {Object} props Bag of current property changes
+ * @return {Array<*>} Array of argument values
+ * @private
+ */
+ function marshalArgs(data, args, path, props) {
+ let values = [];
+ for (let i=0, l=args.length; i<l; i++) {
+ let arg = args[i];
+ let name = arg.name;
+ let v;
+ if (arg.literal) {
+ v = arg.value;
+ } else {
+ if (arg.structured) {
+ v = Polymer.Path.get(data, name);
+ // when data is not stored e.g. `splices`
+ if (v === undefined) {
+ v = props[name];
+ }
+ } else {
+ v = data[name];
+ }
+ }
+ if (arg.wildcard) {
+ // Only send the actual path changed info if the change that
+ // caused the observer to run matched the wildcard
+ let baseChanged = (name.indexOf(path + '.') === 0);
+ let matches = (path.indexOf(name) === 0 && !baseChanged);
+ values[i] = {
+ path: matches ? path : name,
+ value: matches ? props[path] : v,
+ base: v
+ };
+ } else {
+ values[i] = v;
+ }
+ }
+ return values;
+ }
+
+ // data api
+
+ /**
+ * Sends array splice notifications (`.splices` and `.length`)
+ *
+ * Note: this implementation only accepts normalized paths
+ *
+ * @param {!PropertyEffectsType} inst Instance to send notifications to
+ * @param {Array} array The array the mutations occurred on
+ * @param {string} path The path to the array that was mutated
+ * @param {Array} splices Array of splice records
+ * @return {void}
+ * @private
+ */
+ function notifySplices(inst, array, path, splices) {
+ let splicesPath = path + '.splices';
+ inst.notifyPath(splicesPath, { indexSplices: splices });
+ inst.notifyPath(path + '.length', array.length);
+ // Null here to allow potentially large splice records to be GC'ed.
+ inst.__data[splicesPath] = {indexSplices: null};
+ }
+
+ /**
+ * Creates a splice record and sends an array splice notification for
+ * the described mutation
+ *
+ * Note: this implementation only accepts normalized paths
+ *
+ * @param {!PropertyEffectsType} inst Instance to send notifications to
+ * @param {Array} array The array the mutations occurred on
+ * @param {string} path The path to the array that was mutated
+ * @param {number} index Index at which the array mutation occurred
+ * @param {number} addedCount Number of added items
+ * @param {Array} removed Array of removed items
+ * @return {void}
+ * @private
+ */
+ function notifySplice(inst, array, path, index, addedCount, removed) {
+ notifySplices(inst, array, path, [{
+ index: index,
+ addedCount: addedCount,
+ removed: removed,
+ object: array,
+ type: 'splice'
+ }]);
+ }
+
+ /**
+ * Returns an upper-cased version of the string.
+ *
+ * @param {string} name String to uppercase
+ * @return {string} Uppercased string
+ * @private
+ */
+ function upper(name) {
+ return name[0].toUpperCase() + name.substring(1);
+ }
+
+ /**
+ * Element class mixin that provides meta-programming for Polymer's template
+ * binding and data observation (collectively, "property effects") system.
+ *
+ * This mixin uses provides the following key static methods for adding
+ * property effects to an element class:
+ * - `addPropertyEffect`
+ * - `createPropertyObserver`
+ * - `createMethodObserver`
+ * - `createNotifyingProperty`
+ * - `createReadOnlyProperty`
+ * - `createReflectedProperty`
+ * - `createComputedProperty`
+ * - `bindTemplate`
+ *
+ * Each method creates one or more property accessors, along with metadata
+ * used by this mixin's implementation of `_propertiesChanged` to perform
+ * the property effects.
+ *
+ * Underscored versions of the above methods also exist on the element
+ * prototype for adding property effects on instances at runtime.
+ *
+ * Note that this mixin overrides several `PropertyAccessors` methods, in
+ * many cases to maintain guarantees provided by the Polymer 1.x features;
+ * notably it changes property accessors to be synchronous by default
+ * whereas the default when using `PropertyAccessors` standalone is to be
+ * async by default.
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin Polymer.TemplateStamp
+ * @appliesMixin Polymer.PropertyAccessors
+ * @memberof Polymer
+ * @summary Element class mixin that provides meta-programming for Polymer's
+ * template binding and data observation system.
+ */
+ Polymer.PropertyEffects = Polymer.dedupingMixin(superClass => {
+
+ /**
+ * @constructor
+ * @extends {superClass}
+ * @implements {Polymer_PropertyAccessors}
+ * @implements {Polymer_TemplateStamp}
+ * @unrestricted
+ */
+ const propertyEffectsBase = Polymer.TemplateStamp(Polymer.PropertyAccessors(superClass));
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_PropertyEffects}
+ * @extends {propertyEffectsBase}
+ * @unrestricted
+ */
+ class PropertyEffects extends propertyEffectsBase {
+
+ constructor() {
+ super();
+ /** @type {boolean} */
+ // Used to identify users of this mixin, ala instanceof
+ this.__isPropertyEffectsClient = true;
+ /** @type {number} */
+ // NOTE: used to track re-entrant calls to `_flushProperties`
+ // path changes dirty check against `__dataTemp` only during one "turn"
+ // and are cleared when `__dataCounter` returns to 0.
+ this.__dataCounter = 0;
+ /** @type {boolean} */
+ this.__dataClientsReady;
+ /** @type {Array} */
+ this.__dataPendingClients;
+ /** @type {Object} */
+ this.__dataToNotify;
+ /** @type {Object} */
+ this.__dataLinkedPaths;
+ /** @type {boolean} */
+ this.__dataHasPaths;
+ /** @type {Object} */
+ this.__dataCompoundStorage;
+ /** @type {Polymer_PropertyEffects} */
+ this.__dataHost;
+ /** @type {!Object} */
+ this.__dataTemp;
+ /** @type {boolean} */
+ this.__dataClientsInitialized;
+ /** @type {!Object} */
+ this.__data;
+ /** @type {!Object} */
+ this.__dataPending;
+ /** @type {!Object} */
+ this.__dataOld;
+ /** @type {Object} */
+ this.__computeEffects;
+ /** @type {Object} */
+ this.__reflectEffects;
+ /** @type {Object} */
+ this.__notifyEffects;
+ /** @type {Object} */
+ this.__propagateEffects;
+ /** @type {Object} */
+ this.__observeEffects;
+ /** @type {Object} */
+ this.__readOnly;
+ /** @type {!TemplateInfo} */
+ this.__templateInfo;
+ }
+
+ get PROPERTY_EFFECT_TYPES() {
+ return TYPES;
+ }
+
+ /**
+ * @return {void}
+ */
+ _initializeProperties() {
+ super._initializeProperties();
+ hostStack.registerHost(this);
+ this.__dataClientsReady = false;
+ this.__dataPendingClients = null;
+ this.__dataToNotify = null;
+ this.__dataLinkedPaths = null;
+ this.__dataHasPaths = false;
+ // May be set on instance prior to upgrade
+ this.__dataCompoundStorage = this.__dataCompoundStorage || null;
+ this.__dataHost = this.__dataHost || null;
+ this.__dataTemp = {};
+ this.__dataClientsInitialized = false;
+ }
+
+ /**
+ * Overrides `Polymer.PropertyAccessors` implementation to provide a
+ * more efficient implementation of initializing properties from
+ * the prototype on the instance.
+ *
+ * @override
+ * @param {Object} props Properties to initialize on the prototype
+ * @return {void}
+ */
+ _initializeProtoProperties(props) {
+ this.__data = Object.create(props);
+ this.__dataPending = Object.create(props);
+ this.__dataOld = {};
+ }
+
+ /**
+ * Overrides `Polymer.PropertyAccessors` implementation to avoid setting
+ * `_setProperty`'s `shouldNotify: true`.
+ *
+ * @override
+ * @param {Object} props Properties to initialize on the instance
+ * @return {void}
+ */
+ _initializeInstanceProperties(props) {
+ let readOnly = this[TYPES.READ_ONLY];
+ for (let prop in props) {
+ if (!readOnly || !readOnly[prop]) {
+ this.__dataPending = this.__dataPending || {};
+ this.__dataOld = this.__dataOld || {};
+ this.__data[prop] = this.__dataPending[prop] = props[prop];
+ }
+ }
+ }
+
+ // Prototype setup ----------------------------------------
+
+ /**
+ * Equivalent to static `addPropertyEffect` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} property Property that should trigger the effect
+ * @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES
+ * @param {Object=} effect Effect metadata object
+ * @return {void}
+ * @protected
+ */
+ _addPropertyEffect(property, type, effect) {
+ this._createPropertyAccessor(property, type == TYPES.READ_ONLY);
+ // effects are accumulated into arrays per property based on type
+ let effects = ensureOwnEffectMap(this, type)[property];
+ if (!effects) {
+ effects = this[type][property] = [];
+ }
+ effects.push(effect);
+ }
+
+ /**
+ * Removes the given property effect.
+ *
+ * @param {string} property Property the effect was associated with
+ * @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES
+ * @param {Object=} effect Effect metadata object to remove
+ * @return {void}
+ */
+ _removePropertyEffect(property, type, effect) {
+ let effects = ensureOwnEffectMap(this, type)[property];
+ let idx = effects.indexOf(effect);
+ if (idx >= 0) {
+ effects.splice(idx, 1);
+ }
+ }
+
+ /**
+ * Returns whether the current prototype/instance has a property effect
+ * of a certain type.
+ *
+ * @param {string} property Property name
+ * @param {string=} type Effect type, from this.PROPERTY_EFFECT_TYPES
+ * @return {boolean} True if the prototype/instance has an effect of this type
+ * @protected
+ */
+ _hasPropertyEffect(property, type) {
+ let effects = this[type];
+ return Boolean(effects && effects[property]);
+ }
+
+ /**
+ * Returns whether the current prototype/instance has a "read only"
+ * accessor for the given property.
+ *
+ * @param {string} property Property name
+ * @return {boolean} True if the prototype/instance has an effect of this type
+ * @protected
+ */
+ _hasReadOnlyEffect(property) {
+ return this._hasPropertyEffect(property, TYPES.READ_ONLY);
+ }
+
+ /**
+ * Returns whether the current prototype/instance has a "notify"
+ * property effect for the given property.
+ *
+ * @param {string} property Property name
+ * @return {boolean} True if the prototype/instance has an effect of this type
+ * @protected
+ */
+ _hasNotifyEffect(property) {
+ return this._hasPropertyEffect(property, TYPES.NOTIFY);
+ }
+
+ /**
+ * Returns whether the current prototype/instance has a "reflect to attribute"
+ * property effect for the given property.
+ *
+ * @param {string} property Property name
+ * @return {boolean} True if the prototype/instance has an effect of this type
+ * @protected
+ */
+ _hasReflectEffect(property) {
+ return this._hasPropertyEffect(property, TYPES.REFLECT);
+ }
+
+ /**
+ * Returns whether the current prototype/instance has a "computed"
+ * property effect for the given property.
+ *
+ * @param {string} property Property name
+ * @return {boolean} True if the prototype/instance has an effect of this type
+ * @protected
+ */
+ _hasComputedEffect(property) {
+ return this._hasPropertyEffect(property, TYPES.COMPUTE);
+ }
+
+ // Runtime ----------------------------------------
+
+ /**
+ * Sets a pending property or path. If the root property of the path in
+ * question had no accessor, the path is set, otherwise it is enqueued
+ * via `_setPendingProperty`.
+ *
+ * This function isolates relatively expensive functionality necessary
+ * for the public API (`set`, `setProperties`, `notifyPath`, and property
+ * change listeners via {{...}} bindings), such that it is only done
+ * when paths enter the system, and not at every propagation step. It
+ * also sets a `__dataHasPaths` flag on the instance which is used to
+ * fast-path slower path-matching code in the property effects host paths.
+ *
+ * `path` can be a path string or array of path parts as accepted by the
+ * public API.
+ *
+ * @param {string | !Array<number|string>} path Path to set
+ * @param {*} value Value to set
+ * @param {boolean=} shouldNotify Set to true if this change should
+ * cause a property notification event dispatch
+ * @param {boolean=} isPathNotification If the path being set is a path
+ * notification of an already changed value, as opposed to a request
+ * to set and notify the change. In the latter `false` case, a dirty
+ * check is performed and then the value is set to the path before
+ * enqueuing the pending property change.
+ * @return {boolean} Returns true if the property/path was enqueued in
+ * the pending changes bag.
+ * @protected
+ */
+ _setPendingPropertyOrPath(path, value, shouldNotify, isPathNotification) {
+ if (isPathNotification ||
+ Polymer.Path.root(Array.isArray(path) ? path[0] : path) !== path) {
+ // Dirty check changes being set to a path against the actual object,
+ // since this is the entry point for paths into the system; from here
+ // the only dirty checks are against the `__dataTemp` cache to prevent
+ // duplicate work in the same turn only. Note, if this was a notification
+ // of a change already set to a path (isPathNotification: true),
+ // we always let the change through and skip the `set` since it was
+ // already dirty checked at the point of entry and the underlying
+ // object has already been updated
+ if (!isPathNotification) {
+ let old = Polymer.Path.get(this, path);
+ path = /** @type {string} */ (Polymer.Path.set(this, path, value));
+ // Use property-accessor's simpler dirty check
+ if (!path || !super._shouldPropertyChange(path, value, old)) {
+ return false;
+ }
+ }
+ this.__dataHasPaths = true;
+ if (this._setPendingProperty(/**@type{string}*/(path), value, shouldNotify)) {
+ computeLinkedPaths(this, path, value);
+ return true;
+ }
+ } else {
+ if (this.__dataHasAccessor && this.__dataHasAccessor[path]) {
+ return this._setPendingProperty(/**@type{string}*/(path), value, shouldNotify);
+ } else {
+ this[path] = value;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Applies a value to a non-Polymer element/node's property.
+ *
+ * The implementation makes a best-effort at binding interop:
+ * Some native element properties have side-effects when
+ * re-setting the same value (e.g. setting `<input>.value` resets the
+ * cursor position), so we do a dirty-check before setting the value.
+ * However, for better interop with non-Polymer custom elements that
+ * accept objects, we explicitly re-set object changes coming from the
+ * Polymer world (which may include deep object changes without the
+ * top reference changing), erring on the side of providing more
+ * information.
+ *
+ * Users may override this method to provide alternate approaches.
+ *
+ * @param {!Node} node The node to set a property on
+ * @param {string} prop The property to set
+ * @param {*} value The value to set
+ * @return {void}
+ * @protected
+ */
+ _setUnmanagedPropertyToNode(node, prop, value) {
+ // It is a judgment call that resetting primitives is
+ // "bad" and resettings objects is also "good"; alternatively we could
+ // implement a whitelist of tag & property values that should never
+ // be reset (e.g. <input>.value && <select>.value)
+ if (value !== node[prop] || typeof value == 'object') {
+ node[prop] = value;
+ }
+ }
+
+ /**
+ * Overrides the `PropertiesChanged` implementation to introduce special
+ * dirty check logic depending on the property & value being set:
+ *
+ * 1. Any value set to a path (e.g. 'obj.prop': 42 or 'obj.prop': {...})
+ * Stored in `__dataTemp`, dirty checked against `__dataTemp`
+ * 2. Object set to simple property (e.g. 'prop': {...})
+ * Stored in `__dataTemp` and `__data`, dirty checked against
+ * `__dataTemp` by default implementation of `_shouldPropertyChange`
+ * 3. Primitive value set to simple property (e.g. 'prop': 42)
+ * Stored in `__data`, dirty checked against `__data`
+ *
+ * The dirty-check is important to prevent cycles due to two-way
+ * notification, but paths and objects are only dirty checked against any
+ * previous value set during this turn via a "temporary cache" that is
+ * cleared when the last `_propertiesChanged` exits. This is so:
+ * a. any cached array paths (e.g. 'array.3.prop') may be invalidated
+ * due to array mutations like shift/unshift/splice; this is fine
+ * since path changes are dirty-checked at user entry points like `set`
+ * b. dirty-checking for objects only lasts one turn to allow the user
+ * to mutate the object in-place and re-set it with the same identity
+ * and have all sub-properties re-propagated in a subsequent turn.
+ *
+ * The temp cache is not necessarily sufficient to prevent invalid array
+ * paths, since a splice can happen during the same turn (with pathological
+ * user code); we could introduce a "fixup" for temporarily cached array
+ * paths if needed: https://github.com/Polymer/polymer/issues/4227
+ *
+ * @override
+ * @param {string} property Name of the property
+ * @param {*} value Value to set
+ * @param {boolean=} shouldNotify True if property should fire notification
+ * event (applies only for `notify: true` properties)
+ * @return {boolean} Returns true if the property changed
+ */
+ _setPendingProperty(property, value, shouldNotify) {
+ let isPath = this.__dataHasPaths && Polymer.Path.isPath(property);
+ let prevProps = isPath ? this.__dataTemp : this.__data;
+ if (this._shouldPropertyChange(property, value, prevProps[property])) {
+ if (!this.__dataPending) {
+ this.__dataPending = {};
+ this.__dataOld = {};
+ }
+ // Ensure old is captured from the last turn
+ if (!(property in this.__dataOld)) {
+ this.__dataOld[property] = this.__data[property];
+ }
+ // Paths are stored in temporary cache (cleared at end of turn),
+ // which is used for dirty-checking, all others stored in __data
+ if (isPath) {
+ this.__dataTemp[property] = value;
+ } else {
+ this.__data[property] = value;
+ }
+ // All changes go into pending property bag, passed to _propertiesChanged
+ this.__dataPending[property] = value;
+ // Track properties that should notify separately
+ if (isPath || (this[TYPES.NOTIFY] && this[TYPES.NOTIFY][property])) {
+ this.__dataToNotify = this.__dataToNotify || {};
+ this.__dataToNotify[property] = shouldNotify;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Overrides base implementation to ensure all accessors set `shouldNotify`
+ * to true, for per-property notification tracking.
+ *
+ * @override
+ * @param {string} property Name of the property
+ * @param {*} value Value to set
+ * @return {void}
+ */
+ _setProperty(property, value) {
+ if (this._setPendingProperty(property, value, true)) {
+ this._invalidateProperties();
+ }
+ }
+
+ /**
+ * Overrides `PropertyAccessor`'s default async queuing of
+ * `_propertiesChanged`: if `__dataReady` is false (has not yet been
+ * manually flushed), the function no-ops; otherwise flushes
+ * `_propertiesChanged` synchronously.
+ *
+ * @override
+ * @return {void}
+ */
+ _invalidateProperties() {
+ if (this.__dataReady) {
+ this._flushProperties();
+ }
+ }
+
+ /**
+ * Enqueues the given client on a list of pending clients, whose
+ * pending property changes can later be flushed via a call to
+ * `_flushClients`.
+ *
+ * @param {Object} client PropertyEffects client to enqueue
+ * @return {void}
+ * @protected
+ */
+ _enqueueClient(client) {
+ this.__dataPendingClients = this.__dataPendingClients || [];
+ if (client !== this) {
+ this.__dataPendingClients.push(client);
+ }
+ }
+
+ /**
+ * Overrides superclass implementation.
+ *
+ * @return {void}
+ * @protected
+ */
+ _flushProperties() {
+ this.__dataCounter++;
+ super._flushProperties();
+ this.__dataCounter--;
+ }
+
+ /**
+ * Flushes any clients previously enqueued via `_enqueueClient`, causing
+ * their `_flushProperties` method to run.
+ *
+ * @return {void}
+ * @protected
+ */
+ _flushClients() {
+ if (!this.__dataClientsReady) {
+ this.__dataClientsReady = true;
+ this._readyClients();
+ // Override point where accessors are turned on; importantly,
+ // this is after clients have fully readied, providing a guarantee
+ // that any property effects occur only after all clients are ready.
+ this.__dataReady = true;
+ } else {
+ this.__enableOrFlushClients();
+ }
+ }
+
+ // NOTE: We ensure clients either enable or flush as appropriate. This
+ // handles two corner cases:
+ // (1) clients flush properly when connected/enabled before the host
+ // enables; e.g.
+ // (a) Templatize stamps with no properties and does not flush and
+ // (b) the instance is inserted into dom and
+ // (c) then the instance flushes.
+ // (2) clients enable properly when not connected/enabled when the host
+ // flushes; e.g.
+ // (a) a template is runtime stamped and not yet connected/enabled
+ // (b) a host sets a property, causing stamped dom to flush
+ // (c) the stamped dom enables.
+ __enableOrFlushClients() {
+ let clients = this.__dataPendingClients;
+ if (clients) {
+ this.__dataPendingClients = null;
+ for (let i=0; i < clients.length; i++) {
+ let client = clients[i];
+ if (!client.__dataEnabled) {
+ client._enableProperties();
+ } else if (client.__dataPending) {
+ client._flushProperties();
+ }
+ }
+ }
+ }
+
+ /**
+ * Perform any initial setup on client dom. Called before the first
+ * `_flushProperties` call on client dom and before any element
+ * observers are called.
+ *
+ * @return {void}
+ * @protected
+ */
+ _readyClients() {
+ this.__enableOrFlushClients();
+ }
+
+ /**
+ * Sets a bag of property changes to this instance, and
+ * synchronously processes all effects of the properties as a batch.
+ *
+ * Property names must be simple properties, not paths. Batched
+ * path propagation is not supported.
+ *
+ * @param {Object} props Bag of one or more key-value pairs whose key is
+ * a property and value is the new value to set for that property.
+ * @param {boolean=} setReadOnly When true, any private values set in
+ * `props` will be set. By default, `setProperties` will not set
+ * `readOnly: true` root properties.
+ * @return {void}
+ * @public
+ */
+ setProperties(props, setReadOnly) {
+ for (let path in props) {
+ if (setReadOnly || !this[TYPES.READ_ONLY] || !this[TYPES.READ_ONLY][path]) {
+ //TODO(kschaaf): explicitly disallow paths in setProperty?
+ // wildcard observers currently only pass the first changed path
+ // in the `info` object, and you could do some odd things batching
+ // paths, e.g. {'foo.bar': {...}, 'foo': null}
+ this._setPendingPropertyOrPath(path, props[path], true);
+ }
+ }
+ this._invalidateProperties();
+ }
+
+ /**
+ * Overrides `PropertyAccessors` so that property accessor
+ * side effects are not enabled until after client dom is fully ready.
+ * Also calls `_flushClients` callback to ensure client dom is enabled
+ * that was not enabled as a result of flushing properties.
+ *
+ * @override
+ * @return {void}
+ */
+ ready() {
+ // It is important that `super.ready()` is not called here as it
+ // immediately turns on accessors. Instead, we wait until `readyClients`
+ // to enable accessors to provide a guarantee that clients are ready
+ // before processing any accessors side effects.
+ this._flushProperties();
+ // If no data was pending, `_flushProperties` will not `flushClients`
+ // so ensure this is done.
+ if (!this.__dataClientsReady) {
+ this._flushClients();
+ }
+ // Before ready, client notifications do not trigger _flushProperties.
+ // Therefore a flush is necessary here if data has been set.
+ if (this.__dataPending) {
+ this._flushProperties();
+ }
+ }
+
+ /**
+ * Implements `PropertyAccessors`'s properties changed callback.
+ *
+ * Runs each class of effects for the batch of changed properties in
+ * a specific order (compute, propagate, reflect, observe, notify).
+ *
+ * @param {!Object} currentProps Bag of all current accessor values
+ * @param {!Object} changedProps Bag of properties changed since the last
+ * call to `_propertiesChanged`
+ * @param {!Object} oldProps Bag of previous values for each property
+ * in `changedProps`
+ * @return {void}
+ */
+ _propertiesChanged(currentProps, changedProps, oldProps) {
+ // ----------------------------
+ // let c = Object.getOwnPropertyNames(changedProps || {});
+ // window.debug && console.group(this.localName + '#' + this.id + ': ' + c);
+ // if (window.debug) { debugger; }
+ // ----------------------------
+ let hasPaths = this.__dataHasPaths;
+ this.__dataHasPaths = false;
+ // Compute properties
+ runComputedEffects(this, changedProps, oldProps, hasPaths);
+ // Clear notify properties prior to possible reentry (propagate, observe),
+ // but after computing effects have a chance to add to them
+ let notifyProps = this.__dataToNotify;
+ this.__dataToNotify = null;
+ // Propagate properties to clients
+ this._propagatePropertyChanges(changedProps, oldProps, hasPaths);
+ // Flush clients
+ this._flushClients();
+ // Reflect properties
+ runEffects(this, this[TYPES.REFLECT], changedProps, oldProps, hasPaths);
+ // Observe properties
+ runEffects(this, this[TYPES.OBSERVE], changedProps, oldProps, hasPaths);
+ // Notify properties to host
+ if (notifyProps) {
+ runNotifyEffects(this, notifyProps, changedProps, oldProps, hasPaths);
+ }
+ // Clear temporary cache at end of turn
+ if (this.__dataCounter == 1) {
+ this.__dataTemp = {};
+ }
+ // ----------------------------
+ // window.debug && console.groupEnd(this.localName + '#' + this.id + ': ' + c);
+ // ----------------------------
+ }
+
+ /**
+ * Called to propagate any property changes to stamped template nodes
+ * managed by this element.
+ *
+ * @param {Object} changedProps Bag of changed properties
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {boolean} hasPaths True with `props` contains one or more paths
+ * @return {void}
+ * @protected
+ */
+ _propagatePropertyChanges(changedProps, oldProps, hasPaths) {
+ if (this[TYPES.PROPAGATE]) {
+ runEffects(this, this[TYPES.PROPAGATE], changedProps, oldProps, hasPaths);
+ }
+ let templateInfo = this.__templateInfo;
+ while (templateInfo) {
+ runEffects(this, templateInfo.propertyEffects, changedProps, oldProps,
+ hasPaths, templateInfo.nodeList);
+ templateInfo = templateInfo.nextTemplateInfo;
+ }
+ }
+
+ /**
+ * Aliases one data path as another, such that path notifications from one
+ * are routed to the other.
+ *
+ * @param {string | !Array<string|number>} to Target path to link.
+ * @param {string | !Array<string|number>} from Source path to link.
+ * @return {void}
+ * @public
+ */
+ linkPaths(to, from) {
+ to = Polymer.Path.normalize(to);
+ from = Polymer.Path.normalize(from);
+ this.__dataLinkedPaths = this.__dataLinkedPaths || {};
+ this.__dataLinkedPaths[to] = from;
+ }
+
+ /**
+ * Removes a data path alias previously established with `_linkPaths`.
+ *
+ * Note, the path to unlink should be the target (`to`) used when
+ * linking the paths.
+ *
+ * @param {string | !Array<string|number>} path Target path to unlink.
+ * @return {void}
+ * @public
+ */
+ unlinkPaths(path) {
+ path = Polymer.Path.normalize(path);
+ if (this.__dataLinkedPaths) {
+ delete this.__dataLinkedPaths[path];
+ }
+ }
+
+ /**
+ * Notify that an array has changed.
+ *
+ * Example:
+ *
+ * this.items = [ {name: 'Jim'}, {name: 'Todd'}, {name: 'Bill'} ];
+ * ...
+ * this.items.splice(1, 1, {name: 'Sam'});
+ * this.items.push({name: 'Bob'});
+ * this.notifySplices('items', [
+ * { index: 1, removed: [{name: 'Todd'}], addedCount: 1, object: this.items, type: 'splice' },
+ * { index: 3, removed: [], addedCount: 1, object: this.items, type: 'splice'}
+ * ]);
+ *
+ * @param {string} path Path that should be notified.
+ * @param {Array} splices Array of splice records indicating ordered
+ * changes that occurred to the array. Each record should have the
+ * following fields:
+ * * index: index at which the change occurred
+ * * removed: array of items that were removed from this index
+ * * addedCount: number of new items added at this index
+ * * object: a reference to the array in question
+ * * type: the string literal 'splice'
+ *
+ * Note that splice records _must_ be normalized such that they are
+ * reported in index order (raw results from `Object.observe` are not
+ * ordered and must be normalized/merged before notifying).
+ * @return {void}
+ * @public
+ */
+ notifySplices(path, splices) {
+ let info = {path: ''};
+ let array = /** @type {Array} */(Polymer.Path.get(this, path, info));
+ notifySplices(this, array, info.path, splices);
+ }
+
+ /**
+ * Convenience method for reading a value from a path.
+ *
+ * Note, if any part in the path is undefined, this method returns
+ * `undefined` (this method does not throw when dereferencing undefined
+ * paths).
+ *
+ * @param {(string|!Array<(string|number)>)} path Path to the value
+ * to read. The path may be specified as a string (e.g. `foo.bar.baz`)
+ * or an array of path parts (e.g. `['foo.bar', 'baz']`). Note that
+ * bracketed expressions are not supported; string-based path parts
+ * *must* be separated by dots. Note that when dereferencing array
+ * indices, the index may be used as a dotted part directly
+ * (e.g. `users.12.name` or `['users', 12, 'name']`).
+ * @param {Object=} root Root object from which the path is evaluated.
+ * @return {*} Value at the path, or `undefined` if any part of the path
+ * is undefined.
+ * @public
+ */
+ get(path, root) {
+ return Polymer.Path.get(root || this, path);
+ }
+
+ /**
+ * Convenience method for setting a value to a path and notifying any
+ * elements bound to the same path.
+ *
+ * Note, if any part in the path except for the last is undefined,
+ * this method does nothing (this method does not throw when
+ * dereferencing undefined paths).
+ *
+ * @param {(string|!Array<(string|number)>)} path Path to the value
+ * to write. The path may be specified as a string (e.g. `'foo.bar.baz'`)
+ * or an array of path parts (e.g. `['foo.bar', 'baz']`). Note that
+ * bracketed expressions are not supported; string-based path parts
+ * *must* be separated by dots. Note that when dereferencing array
+ * indices, the index may be used as a dotted part directly
+ * (e.g. `'users.12.name'` or `['users', 12, 'name']`).
+ * @param {*} value Value to set at the specified path.
+ * @param {Object=} root Root object from which the path is evaluated.
+ * When specified, no notification will occur.
+ * @return {void}
+ * @public
+ */
+ set(path, value, root) {
+ if (root) {
+ Polymer.Path.set(root, path, value);
+ } else {
+ if (!this[TYPES.READ_ONLY] || !this[TYPES.READ_ONLY][/** @type {string} */(path)]) {
+ if (this._setPendingPropertyOrPath(path, value, true)) {
+ this._invalidateProperties();
+ }
+ }
+ }
+ }
+
+ /**
+ * Adds items onto the end of the array at the path specified.
+ *
+ * The arguments after `path` and return value match that of
+ * `Array.prototype.push`.
+ *
+ * This method notifies other paths to the same array that a
+ * splice occurred to the array.
+ *
+ * @param {string | !Array<string|number>} path Path to array.
+ * @param {...*} items Items to push onto array
+ * @return {number} New length of the array.
+ * @public
+ */
+ push(path, ...items) {
+ let info = {path: ''};
+ let array = /** @type {Array}*/(Polymer.Path.get(this, path, info));
+ let len = array.length;
+ let ret = array.push(...items);
+ if (items.length) {
+ notifySplice(this, array, info.path, len, items.length, []);
+ }
+ return ret;
+ }
+
+ /**
+ * Removes an item from the end of array at the path specified.
+ *
+ * The arguments after `path` and return value match that of
+ * `Array.prototype.pop`.
+ *
+ * This method notifies other paths to the same array that a
+ * splice occurred to the array.
+ *
+ * @param {string | !Array<string|number>} path Path to array.
+ * @return {*} Item that was removed.
+ * @public
+ */
+ pop(path) {
+ let info = {path: ''};
+ let array = /** @type {Array} */(Polymer.Path.get(this, path, info));
+ let hadLength = Boolean(array.length);
+ let ret = array.pop();
+ if (hadLength) {
+ notifySplice(this, array, info.path, array.length, 0, [ret]);
+ }
+ return ret;
+ }
+
+ /**
+ * Starting from the start index specified, removes 0 or more items
+ * from the array and inserts 0 or more new items in their place.
+ *
+ * The arguments after `path` and return value match that of
+ * `Array.prototype.splice`.
+ *
+ * This method notifies other paths to the same array that a
+ * splice occurred to the array.
+ *
+ * @param {string | !Array<string|number>} path Path to array.
+ * @param {number} start Index from which to start removing/inserting.
+ * @param {number} deleteCount Number of items to remove.
+ * @param {...*} items Items to insert into array.
+ * @return {Array} Array of removed items.
+ * @public
+ */
+ splice(path, start, deleteCount, ...items) {
+ let info = {path : ''};
+ let array = /** @type {Array} */(Polymer.Path.get(this, path, info));
+ // Normalize fancy native splice handling of crazy start values
+ if (start < 0) {
+ start = array.length - Math.floor(-start);
+ } else if (start) {
+ start = Math.floor(start);
+ }
+ // array.splice does different things based on the number of arguments
+ // you pass in. Therefore, array.splice(0) and array.splice(0, undefined)
+ // do different things. In the former, the whole array is cleared. In the
+ // latter, no items are removed.
+ // This means that we need to detect whether 1. one of the arguments
+ // is actually passed in and then 2. determine how many arguments
+ // we should pass on to the native array.splice
+ //
+ let ret;
+ // Omit any additional arguments if they were not passed in
+ if (arguments.length === 2) {
+ ret = array.splice(start);
+ // Either start was undefined and the others were defined, but in this
+ // case we can safely pass on all arguments
+ //
+ // Note: this includes the case where none of the arguments were passed in,
+ // e.g. this.splice('array'). However, if both start and deleteCount
+ // are undefined, array.splice will not modify the array (as expected)
+ } else {
+ ret = array.splice(start, deleteCount, ...items);
+ }
+ // At the end, check whether any items were passed in (e.g. insertions)
+ // or if the return array contains items (e.g. deletions).
+ // Only notify if items were added or deleted.
+ if (items.length || ret.length) {
+ notifySplice(this, array, info.path, start, items.length, ret);
+ }
+ return ret;
+ }
+
+ /**
+ * Removes an item from the beginning of array at the path specified.
+ *
+ * The arguments after `path` and return value match that of
+ * `Array.prototype.pop`.
+ *
+ * This method notifies other paths to the same array that a
+ * splice occurred to the array.
+ *
+ * @param {string | !Array<string|number>} path Path to array.
+ * @return {*} Item that was removed.
+ * @public
+ */
+ shift(path) {
+ let info = {path: ''};
+ let array = /** @type {Array} */(Polymer.Path.get(this, path, info));
+ let hadLength = Boolean(array.length);
+ let ret = array.shift();
+ if (hadLength) {
+ notifySplice(this, array, info.path, 0, 0, [ret]);
+ }
+ return ret;
+ }
+
+ /**
+ * Adds items onto the beginning of the array at the path specified.
+ *
+ * The arguments after `path` and return value match that of
+ * `Array.prototype.push`.
+ *
+ * This method notifies other paths to the same array that a
+ * splice occurred to the array.
+ *
+ * @param {string | !Array<string|number>} path Path to array.
+ * @param {...*} items Items to insert info array
+ * @return {number} New length of the array.
+ * @public
+ */
+ unshift(path, ...items) {
+ let info = {path: ''};
+ let array = /** @type {Array} */(Polymer.Path.get(this, path, info));
+ let ret = array.unshift(...items);
+ if (items.length) {
+ notifySplice(this, array, info.path, 0, items.length, []);
+ }
+ return ret;
+ }
+
+ /**
+ * Notify that a path has changed.
+ *
+ * Example:
+ *
+ * this.item.user.name = 'Bob';
+ * this.notifyPath('item.user.name');
+ *
+ * @param {string} path Path that should be notified.
+ * @param {*=} value Value at the path (optional).
+ * @return {void}
+ * @public
+ */
+ notifyPath(path, value) {
+ /** @type {string} */
+ let propPath;
+ if (arguments.length == 1) {
+ // Get value if not supplied
+ let info = {path: ''};
+ value = Polymer.Path.get(this, path, info);
+ propPath = info.path;
+ } else if (Array.isArray(path)) {
+ // Normalize path if needed
+ propPath = Polymer.Path.normalize(path);
+ } else {
+ propPath = /** @type{string} */(path);
+ }
+ if (this._setPendingPropertyOrPath(propPath, value, true, true)) {
+ this._invalidateProperties();
+ }
+ }
+
+ /**
+ * Equivalent to static `createReadOnlyProperty` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} property Property name
+ * @param {boolean=} protectedSetter Creates a custom protected setter
+ * when `true`.
+ * @return {void}
+ * @protected
+ */
+ _createReadOnlyProperty(property, protectedSetter) {
+ this._addPropertyEffect(property, TYPES.READ_ONLY);
+ if (protectedSetter) {
+ this['_set' + upper(property)] = /** @this {PropertyEffects} */function(value) {
+ this._setProperty(property, value);
+ };
+ }
+ }
+
+ /**
+ * Equivalent to static `createPropertyObserver` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} property Property name
+ * @param {string|function(*,*)} method Function or name of observer method to call
+ * @param {boolean=} dynamicFn Whether the method name should be included as
+ * a dependency to the effect.
+ * @return {void}
+ * @protected
+ */
+ _createPropertyObserver(property, method, dynamicFn) {
+ let info = { property, method, dynamicFn: Boolean(dynamicFn) };
+ this._addPropertyEffect(property, TYPES.OBSERVE, {
+ fn: runObserverEffect, info, trigger: {name: property}
+ });
+ if (dynamicFn) {
+ this._addPropertyEffect(/** @type {string} */(method), TYPES.OBSERVE, {
+ fn: runObserverEffect, info, trigger: {name: method}
+ });
+ }
+ }
+
+ /**
+ * Equivalent to static `createMethodObserver` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} expression Method expression
+ * @param {boolean|Object=} dynamicFn Boolean or object map indicating
+ * whether method names should be included as a dependency to the effect.
+ * @return {void}
+ * @protected
+ */
+ _createMethodObserver(expression, dynamicFn) {
+ let sig = parseMethod(expression);
+ if (!sig) {
+ throw new Error("Malformed observer expression '" + expression + "'");
+ }
+ createMethodEffect(this, sig, TYPES.OBSERVE, runMethodEffect, null, dynamicFn);
+ }
+
+ /**
+ * Equivalent to static `createNotifyingProperty` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} property Property name
+ * @return {void}
+ * @protected
+ */
+ _createNotifyingProperty(property) {
+ this._addPropertyEffect(property, TYPES.NOTIFY, {
+ fn: runNotifyEffect,
+ info: {
+ eventName: CaseMap.camelToDashCase(property) + '-changed',
+ property: property
+ }
+ });
+ }
+
+ /**
+ * Equivalent to static `createReflectedProperty` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} property Property name
+ * @return {void}
+ * @protected
+ */
+ _createReflectedProperty(property) {
+ let attr = this.constructor.attributeNameForProperty(property);
+ if (attr[0] === '-') {
+ console.warn('Property ' + property + ' cannot be reflected to attribute ' +
+ attr + ' because "-" is not a valid starting attribute name. Use a lowercase first letter for the property instead.');
+ } else {
+ this._addPropertyEffect(property, TYPES.REFLECT, {
+ fn: runReflectEffect,
+ info: {
+ attrName: attr
+ }
+ });
+ }
+ }
+
+ /**
+ * Equivalent to static `createComputedProperty` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} property Name of computed property to set
+ * @param {string} expression Method expression
+ * @param {boolean|Object=} dynamicFn Boolean or object map indicating
+ * whether method names should be included as a dependency to the effect.
+ * @return {void}
+ * @protected
+ */
+ _createComputedProperty(property, expression, dynamicFn) {
+ let sig = parseMethod(expression);
+ if (!sig) {
+ throw new Error("Malformed computed expression '" + expression + "'");
+ }
+ createMethodEffect(this, sig, TYPES.COMPUTE, runComputedEffect, property, dynamicFn);
+ }
+
+ // -- static class methods ------------
+
+ /**
+ * Ensures an accessor exists for the specified property, and adds
+ * to a list of "property effects" that will run when the accessor for
+ * the specified property is set. Effects are grouped by "type", which
+ * roughly corresponds to a phase in effect processing. The effect
+ * metadata should be in the following form:
+ *
+ * {
+ * fn: effectFunction, // Reference to function to call to perform effect
+ * info: { ... } // Effect metadata passed to function
+ * trigger: { // Optional triggering metadata; if not provided
+ * name: string // the property is treated as a wildcard
+ * structured: boolean
+ * wildcard: boolean
+ * }
+ * }
+ *
+ * Effects are called from `_propertiesChanged` in the following order by
+ * type:
+ *
+ * 1. COMPUTE
+ * 2. PROPAGATE
+ * 3. REFLECT
+ * 4. OBSERVE
+ * 5. NOTIFY
+ *
+ * Effect functions are called with the following signature:
+ *
+ * effectFunction(inst, path, props, oldProps, info, hasPaths)
+ *
+ * @param {string} property Property that should trigger the effect
+ * @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES
+ * @param {Object=} effect Effect metadata object
+ * @return {void}
+ * @protected
+ */
+ static addPropertyEffect(property, type, effect) {
+ this.prototype._addPropertyEffect(property, type, effect);
+ }
+
+ /**
+ * Creates a single-property observer for the given property.
+ *
+ * @param {string} property Property name
+ * @param {string|function(*,*)} method Function or name of observer method to call
+ * @param {boolean=} dynamicFn Whether the method name should be included as
+ * a dependency to the effect.
+ * @return {void}
+ * @protected
+ */
+ static createPropertyObserver(property, method, dynamicFn) {
+ this.prototype._createPropertyObserver(property, method, dynamicFn);
+ }
+
+ /**
+ * Creates a multi-property "method observer" based on the provided
+ * expression, which should be a string in the form of a normal JavaScript
+ * function signature: `'methodName(arg1, [..., argn])'`. Each argument
+ * should correspond to a property or path in the context of this
+ * prototype (or instance), or may be a literal string or number.
+ *
+ * @param {string} expression Method expression
+ * @param {boolean|Object=} dynamicFn Boolean or object map indicating
+ * @return {void}
+ * whether method names should be included as a dependency to the effect.
+ * @protected
+ */
+ static createMethodObserver(expression, dynamicFn) {
+ this.prototype._createMethodObserver(expression, dynamicFn);
+ }
+
+ /**
+ * Causes the setter for the given property to dispatch `<property>-changed`
+ * events to notify of changes to the property.
+ *
+ * @param {string} property Property name
+ * @return {void}
+ * @protected
+ */
+ static createNotifyingProperty(property) {
+ this.prototype._createNotifyingProperty(property);
+ }
+
+ /**
+ * Creates a read-only accessor for the given property.
+ *
+ * To set the property, use the protected `_setProperty` API.
+ * To create a custom protected setter (e.g. `_setMyProp()` for
+ * property `myProp`), pass `true` for `protectedSetter`.
+ *
+ * Note, if the property will have other property effects, this method
+ * should be called first, before adding other effects.
+ *
+ * @param {string} property Property name
+ * @param {boolean=} protectedSetter Creates a custom protected setter
+ * when `true`.
+ * @return {void}
+ * @protected
+ */
+ static createReadOnlyProperty(property, protectedSetter) {
+ this.prototype._createReadOnlyProperty(property, protectedSetter);
+ }
+
+ /**
+ * Causes the setter for the given property to reflect the property value
+ * to a (dash-cased) attribute of the same name.
+ *
+ * @param {string} property Property name
+ * @return {void}
+ * @protected
+ */
+ static createReflectedProperty(property) {
+ this.prototype._createReflectedProperty(property);
+ }
+
+ /**
+ * Creates a computed property whose value is set to the result of the
+ * method described by the given `expression` each time one or more
+ * arguments to the method changes. The expression should be a string
+ * in the form of a normal JavaScript function signature:
+ * `'methodName(arg1, [..., argn])'`
+ *
+ * @param {string} property Name of computed property to set
+ * @param {string} expression Method expression
+ * @param {boolean|Object=} dynamicFn Boolean or object map indicating whether
+ * method names should be included as a dependency to the effect.
+ * @return {void}
+ * @protected
+ */
+ static createComputedProperty(property, expression, dynamicFn) {
+ this.prototype._createComputedProperty(property, expression, dynamicFn);
+ }
+
+ /**
+ * Parses the provided template to ensure binding effects are created
+ * for them, and then ensures property accessors are created for any
+ * dependent properties in the template. Binding effects for bound
+ * templates are stored in a linked list on the instance so that
+ * templates can be efficiently stamped and unstamped.
+ *
+ * @param {!HTMLTemplateElement} template Template containing binding
+ * bindings
+ * @return {!TemplateInfo} Template metadata object
+ * @protected
+ */
+ static bindTemplate(template) {
+ return this.prototype._bindTemplate(template);
+ }
+
+ // -- binding ----------------------------------------------
+
+ /**
+ * Equivalent to static `bindTemplate` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * This method may be called on the prototype (for prototypical template
+ * binding, to avoid creating accessors every instance) once per prototype,
+ * and will be called with `runtimeBinding: true` by `_stampTemplate` to
+ * create and link an instance of the template metadata associated with a
+ * particular stamping.
+ *
+ * @param {!HTMLTemplateElement} template Template containing binding
+ * bindings
+ * @param {boolean=} instanceBinding When false (default), performs
+ * "prototypical" binding of the template and overwrites any previously
+ * bound template for the class. When true (as passed from
+ * `_stampTemplate`), the template info is instanced and linked into
+ * the list of bound templates.
+ * @return {!TemplateInfo} Template metadata object; for `runtimeBinding`,
+ * this is an instance of the prototypical template info
+ * @protected
+ */
+ _bindTemplate(template, instanceBinding) {
+ let templateInfo = this.constructor._parseTemplate(template);
+ let wasPreBound = this.__templateInfo == templateInfo;
+ // Optimization: since this is called twice for proto-bound templates,
+ // don't attempt to recreate accessors if this template was pre-bound
+ if (!wasPreBound) {
+ for (let prop in templateInfo.propertyEffects) {
+ this._createPropertyAccessor(prop);
+ }
+ }
+ if (instanceBinding) {
+ // For instance-time binding, create instance of template metadata
+ // and link into list of templates if necessary
+ templateInfo = /** @type {!TemplateInfo} */(Object.create(templateInfo));
+ templateInfo.wasPreBound = wasPreBound;
+ if (!wasPreBound && this.__templateInfo) {
+ let last = this.__templateInfoLast || this.__templateInfo;
+ this.__templateInfoLast = last.nextTemplateInfo = templateInfo;
+ templateInfo.previousTemplateInfo = last;
+ return templateInfo;
+ }
+ }
+ return this.__templateInfo = templateInfo;
+ }
+
+ /**
+ * Adds a property effect to the given template metadata, which is run
+ * at the "propagate" stage of `_propertiesChanged` when the template
+ * has been bound to the element via `_bindTemplate`.
+ *
+ * The `effect` object should match the format in `_addPropertyEffect`.
+ *
+ * @param {Object} templateInfo Template metadata to add effect to
+ * @param {string} prop Property that should trigger the effect
+ * @param {Object=} effect Effect metadata object
+ * @return {void}
+ * @protected
+ */
+ static _addTemplatePropertyEffect(templateInfo, prop, effect) {
+ let hostProps = templateInfo.hostProps = templateInfo.hostProps || {};
+ hostProps[prop] = true;
+ let effects = templateInfo.propertyEffects = templateInfo.propertyEffects || {};
+ let propEffects = effects[prop] = effects[prop] || [];
+ propEffects.push(effect);
+ }
+
+ /**
+ * Stamps the provided template and performs instance-time setup for
+ * Polymer template features, including data bindings, declarative event
+ * listeners, and the `this.$` map of `id`'s to nodes. A document fragment
+ * is returned containing the stamped DOM, ready for insertion into the
+ * DOM.
+ *
+ * This method may be called more than once; however note that due to
+ * `shadycss` polyfill limitations, only styles from templates prepared
+ * using `ShadyCSS.prepareTemplate` will be correctly polyfilled (scoped
+ * to the shadow root and support CSS custom properties), and note that
+ * `ShadyCSS.prepareTemplate` may only be called once per element. As such,
+ * any styles required by in runtime-stamped templates must be included
+ * in the main element template.
+ *
+ * @param {!HTMLTemplateElement} template Template to stamp
+ * @return {!StampedTemplate} Cloned template content
+ * @override
+ * @protected
+ */
+ _stampTemplate(template) {
+ // Ensures that created dom is `_enqueueClient`'d to this element so
+ // that it can be flushed on next call to `_flushProperties`
+ hostStack.beginHosting(this);
+ let dom = super._stampTemplate(template);
+ hostStack.endHosting(this);
+ let templateInfo = /** @type {!TemplateInfo} */(this._bindTemplate(template, true));
+ // Add template-instance-specific data to instanced templateInfo
+ templateInfo.nodeList = dom.nodeList;
+ // Capture child nodes to allow unstamping of non-prototypical templates
+ if (!templateInfo.wasPreBound) {
+ let nodes = templateInfo.childNodes = [];
+ for (let n=dom.firstChild; n; n=n.nextSibling) {
+ nodes.push(n);
+ }
+ }
+ dom.templateInfo = templateInfo;
+ // Setup compound storage, 2-way listeners, and dataHost for bindings
+ setupBindings(this, templateInfo);
+ // Flush properties into template nodes if already booted
+ if (this.__dataReady) {
+ runEffects(this, templateInfo.propertyEffects, this.__data, null,
+ false, templateInfo.nodeList);
+ }
+ return dom;
+ }
+
+ /**
+ * Removes and unbinds the nodes previously contained in the provided
+ * DocumentFragment returned from `_stampTemplate`.
+ *
+ * @param {!StampedTemplate} dom DocumentFragment previously returned
+ * from `_stampTemplate` associated with the nodes to be removed
+ * @return {void}
+ * @protected
+ */
+ _removeBoundDom(dom) {
+ // Unlink template info
+ let templateInfo = dom.templateInfo;
+ if (templateInfo.previousTemplateInfo) {
+ templateInfo.previousTemplateInfo.nextTemplateInfo =
+ templateInfo.nextTemplateInfo;
+ }
+ if (templateInfo.nextTemplateInfo) {
+ templateInfo.nextTemplateInfo.previousTemplateInfo =
+ templateInfo.previousTemplateInfo;
+ }
+ if (this.__templateInfoLast == templateInfo) {
+ this.__templateInfoLast = templateInfo.previousTemplateInfo;
+ }
+ templateInfo.previousTemplateInfo = templateInfo.nextTemplateInfo = null;
+ // Remove stamped nodes
+ let nodes = templateInfo.childNodes;
+ for (let i=0; i<nodes.length; i++) {
+ let node = nodes[i];
+ node.parentNode.removeChild(node);
+ }
+ }
+
+ /**
+ * Overrides default `TemplateStamp` implementation to add support for
+ * parsing bindings from `TextNode`'s' `textContent`. A `bindings`
+ * array is added to `nodeInfo` and populated with binding metadata
+ * with information capturing the binding target, and a `parts` array
+ * with one or more metadata objects capturing the source(s) of the
+ * binding.
+ *
+ * @override
+ * @param {Node} node Node to parse
+ * @param {TemplateInfo} templateInfo Template metadata for current template
+ * @param {NodeInfo} nodeInfo Node metadata for current template node
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ * @protected
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static _parseTemplateNode(node, templateInfo, nodeInfo) {
+ let noted = super._parseTemplateNode(node, templateInfo, nodeInfo);
+ if (node.nodeType === Node.TEXT_NODE) {
+ let parts = this._parseBindings(node.textContent, templateInfo);
+ if (parts) {
+ // Initialize the textContent with any literal parts
+ // NOTE: default to a space here so the textNode remains; some browsers
+ // (IE) omit an empty textNode following cloneNode/importNode.
+ node.textContent = literalFromParts(parts) || ' ';
+ addBinding(this, templateInfo, nodeInfo, 'text', 'textContent', parts);
+ noted = true;
+ }
+ }
+ return noted;
+ }
+
+ /**
+ * Overrides default `TemplateStamp` implementation to add support for
+ * parsing bindings from attributes. A `bindings`
+ * array is added to `nodeInfo` and populated with binding metadata
+ * with information capturing the binding target, and a `parts` array
+ * with one or more metadata objects capturing the source(s) of the
+ * binding.
+ *
+ * @override
+ * @param {Element} node Node to parse
+ * @param {TemplateInfo} templateInfo Template metadata for current template
+ * @param {NodeInfo} nodeInfo Node metadata for current template node
+ * @param {string} name Attribute name
+ * @param {string} value Attribute value
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ * @protected
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static _parseTemplateNodeAttribute(node, templateInfo, nodeInfo, name, value) {
+ let parts = this._parseBindings(value, templateInfo);
+ if (parts) {
+ // Attribute or property
+ let origName = name;
+ let kind = 'property';
+ // The only way we see a capital letter here is if the attr has
+ // a capital letter in it per spec. In this case, to make sure
+ // this binding works, we go ahead and make the binding to the attribute.
+ if (capitalAttributeRegex.test(name)) {
+ kind = 'attribute';
+ } else if (name[name.length-1] == '$') {
+ name = name.slice(0, -1);
+ kind = 'attribute';
+ }
+ // Initialize attribute bindings with any literal parts
+ let literal = literalFromParts(parts);
+ if (literal && kind == 'attribute') {
+ node.setAttribute(name, literal);
+ }
+ // Clear attribute before removing, since IE won't allow removing
+ // `value` attribute if it previously had a value (can't
+ // unconditionally set '' before removing since attributes with `$`
+ // can't be set using setAttribute)
+ if (node.localName === 'input' && origName === 'value') {
+ node.setAttribute(origName, '');
+ }
+ // Remove annotation
+ node.removeAttribute(origName);
+ // Case hackery: attributes are lower-case, but bind targets
+ // (properties) are case sensitive. Gambit is to map dash-case to
+ // camel-case: `foo-bar` becomes `fooBar`.
+ // Attribute bindings are excepted.
+ if (kind === 'property') {
+ name = Polymer.CaseMap.dashToCamelCase(name);
+ }
+ addBinding(this, templateInfo, nodeInfo, kind, name, parts, literal);
+ return true;
+ } else {
+ return super._parseTemplateNodeAttribute(node, templateInfo, nodeInfo, name, value);
+ }
+ }
+
+ /**
+ * Overrides default `TemplateStamp` implementation to add support for
+ * binding the properties that a nested template depends on to the template
+ * as `_host_<property>`.
+ *
+ * @override
+ * @param {Node} node Node to parse
+ * @param {TemplateInfo} templateInfo Template metadata for current template
+ * @param {NodeInfo} nodeInfo Node metadata for current template node
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ * @protected
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static _parseTemplateNestedTemplate(node, templateInfo, nodeInfo) {
+ let noted = super._parseTemplateNestedTemplate(node, templateInfo, nodeInfo);
+ // Merge host props into outer template and add bindings
+ let hostProps = nodeInfo.templateInfo.hostProps;
+ let mode = '{';
+ for (let source in hostProps) {
+ let parts = [{ mode, source, dependencies: [source] }];
+ addBinding(this, templateInfo, nodeInfo, 'property', '_host_' + source, parts);
+ }
+ return noted;
+ }
+
+ /**
+ * Called to parse text in a template (either attribute values or
+ * textContent) into binding metadata.
+ *
+ * Any overrides of this method should return an array of binding part
+ * metadata representing one or more bindings found in the provided text
+ * and any "literal" text in between. Any non-literal parts will be passed
+ * to `_evaluateBinding` when any dependencies change. The only required
+ * fields of each "part" in the returned array are as follows:
+ *
+ * - `dependencies` - Array containing trigger metadata for each property
+ * that should trigger the binding to update
+ * - `literal` - String containing text if the part represents a literal;
+ * in this case no `dependencies` are needed
+ *
+ * Additional metadata for use by `_evaluateBinding` may be provided in
+ * each part object as needed.
+ *
+ * The default implementation handles the following types of bindings
+ * (one or more may be intermixed with literal strings):
+ * - Property binding: `[[prop]]`
+ * - Path binding: `[[object.prop]]`
+ * - Negated property or path bindings: `[[!prop]]` or `[[!object.prop]]`
+ * - Two-way property or path bindings (supports negation):
+ * `{{prop}}`, `{{object.prop}}`, `{{!prop}}` or `{{!object.prop}}`
+ * - Inline computed method (supports negation):
+ * `[[compute(a, 'literal', b)]]`, `[[!compute(a, 'literal', b)]]`
+ *
+ * @param {string} text Text to parse from attribute or textContent
+ * @param {Object} templateInfo Current template metadata
+ * @return {Array<!BindingPart>} Array of binding part metadata
+ * @protected
+ */
+ static _parseBindings(text, templateInfo) {
+ let parts = [];
+ let lastIndex = 0;
+ let m;
+ // Example: "literal1{{prop}}literal2[[!compute(foo,bar)]]final"
+ // Regex matches:
+ // Iteration 1: Iteration 2:
+ // m[1]: '{{' '[['
+ // m[2]: '' '!'
+ // m[3]: 'prop' 'compute(foo,bar)'
+ while ((m = bindingRegex.exec(text)) !== null) {
+ // Add literal part
+ if (m.index > lastIndex) {
+ parts.push({literal: text.slice(lastIndex, m.index)});
+ }
+ // Add binding part
+ let mode = m[1][0];
+ let negate = Boolean(m[2]);
+ let source = m[3].trim();
+ let customEvent = false, notifyEvent = '', colon = -1;
+ if (mode == '{' && (colon = source.indexOf('::')) > 0) {
+ notifyEvent = source.substring(colon + 2);
+ source = source.substring(0, colon);
+ customEvent = true;
+ }
+ let signature = parseMethod(source);
+ let dependencies = [];
+ if (signature) {
+ // Inline computed function
+ let {args, methodName} = signature;
+ for (let i=0; i<args.length; i++) {
+ let arg = args[i];
+ if (!arg.literal) {
+ dependencies.push(arg);
+ }
+ }
+ let dynamicFns = templateInfo.dynamicFns;
+ if (dynamicFns && dynamicFns[methodName] || signature.static) {
+ dependencies.push(methodName);
+ signature.dynamicFn = true;
+ }
+ } else {
+ // Property or path
+ dependencies.push(source);
+ }
+ parts.push({
+ source, mode, negate, customEvent, signature, dependencies,
+ event: notifyEvent
+ });
+ lastIndex = bindingRegex.lastIndex;
+ }
+ // Add a final literal part
+ if (lastIndex && lastIndex < text.length) {
+ let literal = text.substring(lastIndex);
+ if (literal) {
+ parts.push({
+ literal: literal
+ });
+ }
+ }
+ if (parts.length) {
+ return parts;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Called to evaluate a previously parsed binding part based on a set of
+ * one or more changed dependencies.
+ *
+ * @param {this} inst Element that should be used as scope for
+ * binding dependencies
+ * @param {BindingPart} part Binding part metadata
+ * @param {string} path Property/path that triggered this effect
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {boolean} hasPaths True with `props` contains one or more paths
+ * @return {*} Value the binding part evaluated to
+ * @protected
+ */
+ static _evaluateBinding(inst, part, path, props, oldProps, hasPaths) {
+ let value;
+ if (part.signature) {
+ value = runMethodEffect(inst, path, props, oldProps, part.signature);
+ } else if (path != part.source) {
+ value = Polymer.Path.get(inst, part.source);
+ } else {
+ if (hasPaths && Polymer.Path.isPath(path)) {
+ value = Polymer.Path.get(inst, path);
+ } else {
+ value = inst.__data[path];
+ }
+ }
+ if (part.negate) {
+ value = !value;
+ }
+ return value;
+ }
+
+ }
+
+ // make a typing for closure :P
+ PropertyEffectsType = PropertyEffects;
+
+ return PropertyEffects;
+ });
+
+ /**
+ * Helper api for enqueuing client dom created by a host element.
+ *
+ * By default elements are flushed via `_flushProperties` when
+ * `connectedCallback` is called. Elements attach their client dom to
+ * themselves at `ready` time which results from this first flush.
+ * This provides an ordering guarantee that the client dom an element
+ * creates is flushed before the element itself (i.e. client `ready`
+ * fires before host `ready`).
+ *
+ * However, if `_flushProperties` is called *before* an element is connected,
+ * as for example `Templatize` does, this ordering guarantee cannot be
+ * satisfied because no elements are connected. (Note: Bound elements that
+ * receive data do become enqueued clients and are properly ordered but
+ * unbound elements are not.)
+ *
+ * To maintain the desired "client before host" ordering guarantee for this
+ * case we rely on the "host stack. Client nodes registers themselves with
+ * the creating host element when created. This ensures that all client dom
+ * is readied in the proper order, maintaining the desired guarantee.
+ *
+ * @private
+ */
+ let hostStack = {
+
+ stack: [],
+
+ /**
+ * @param {*} inst Instance to add to hostStack
+ * @return {void}
+ * @this {hostStack}
+ */
+ registerHost(inst) {
+ if (this.stack.length) {
+ let host = this.stack[this.stack.length-1];
+ host._enqueueClient(inst);
+ }
+ },
+
+ /**
+ * @param {*} inst Instance to begin hosting
+ * @return {void}
+ * @this {hostStack}
+ */
+ beginHosting(inst) {
+ this.stack.push(inst);
+ },
+
+ /**
+ * @param {*} inst Instance to end hosting
+ * @return {void}
+ * @this {hostStack}
+ */
+ endHosting(inst) {
+ let stackLen = this.stack.length;
+ if (stackLen && this.stack[stackLen-1] == inst) {
+ this.stack.pop();
+ }
+ }
+
+ };
+
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/template-stamp.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/template-stamp.html
new file mode 100644
index 00000000000..c6fbe947292
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/mixins/template-stamp.html
@@ -0,0 +1,491 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../utils/boot.html">
+<link rel="import" href="../utils/mixin.html">
+
+<script>
+(function() {
+
+ 'use strict';
+
+ // 1.x backwards-compatible auto-wrapper for template type extensions
+ // This is a clear layering violation and gives favored-nation status to
+ // dom-if and dom-repeat templates. This is a conceit we're choosing to keep
+ // a.) to ease 1.x backwards-compatibility due to loss of `is`, and
+ // b.) to maintain if/repeat capability in parser-constrained elements
+ // (e.g. table, select) in lieu of native CE type extensions without
+ // massive new invention in this space (e.g. directive system)
+ const templateExtensions = {
+ 'dom-if': true,
+ 'dom-repeat': true
+ };
+ function wrapTemplateExtension(node) {
+ let is = node.getAttribute('is');
+ if (is && templateExtensions[is]) {
+ let t = node;
+ t.removeAttribute('is');
+ node = t.ownerDocument.createElement(is);
+ t.parentNode.replaceChild(node, t);
+ node.appendChild(t);
+ while(t.attributes.length) {
+ node.setAttribute(t.attributes[0].name, t.attributes[0].value);
+ t.removeAttribute(t.attributes[0].name);
+ }
+ }
+ return node;
+ }
+
+ function findTemplateNode(root, nodeInfo) {
+ // recursively ascend tree until we hit root
+ let parent = nodeInfo.parentInfo && findTemplateNode(root, nodeInfo.parentInfo);
+ // unwind the stack, returning the indexed node at each level
+ if (parent) {
+ // note: marginally faster than indexing via childNodes
+ // (http://jsperf.com/childnodes-lookup)
+ for (let n=parent.firstChild, i=0; n; n=n.nextSibling) {
+ if (nodeInfo.parentIndex === i++) {
+ return n;
+ }
+ }
+ } else {
+ return root;
+ }
+ }
+
+ // construct `$` map (from id annotations)
+ function applyIdToMap(inst, map, node, nodeInfo) {
+ if (nodeInfo.id) {
+ map[nodeInfo.id] = node;
+ }
+ }
+
+ // install event listeners (from event annotations)
+ function applyEventListener(inst, node, nodeInfo) {
+ if (nodeInfo.events && nodeInfo.events.length) {
+ for (let j=0, e$=nodeInfo.events, e; (j<e$.length) && (e=e$[j]); j++) {
+ inst._addMethodEventListenerToNode(node, e.name, e.value, inst);
+ }
+ }
+ }
+
+ // push configuration references at configure time
+ function applyTemplateContent(inst, node, nodeInfo) {
+ if (nodeInfo.templateInfo) {
+ node._templateInfo = nodeInfo.templateInfo;
+ }
+ }
+
+ function createNodeEventHandler(context, eventName, methodName) {
+ // Instances can optionally have a _methodHost which allows redirecting where
+ // to find methods. Currently used by `templatize`.
+ context = context._methodHost || context;
+ let handler = function(e) {
+ if (context[methodName]) {
+ context[methodName](e, e.detail);
+ } else {
+ console.warn('listener method `' + methodName + '` not defined');
+ }
+ };
+ return handler;
+ }
+
+ /**
+ * Element mixin that provides basic template parsing and stamping, including
+ * the following template-related features for stamped templates:
+ *
+ * - Declarative event listeners (`on-eventname="listener"`)
+ * - Map of node id's to stamped node instances (`this.$.id`)
+ * - Nested template content caching/removal and re-installation (performance
+ * optimization)
+ *
+ * @mixinFunction
+ * @polymer
+ * @memberof Polymer
+ * @summary Element class mixin that provides basic template parsing and stamping
+ */
+ Polymer.TemplateStamp = Polymer.dedupingMixin(superClass => {
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_TemplateStamp}
+ */
+ class TemplateStamp extends superClass {
+
+ /**
+ * Scans a template to produce template metadata.
+ *
+ * Template-specific metadata are stored in the object returned, and node-
+ * specific metadata are stored in objects in its flattened `nodeInfoList`
+ * array. Only nodes in the template that were parsed as nodes of
+ * interest contain an object in `nodeInfoList`. Each `nodeInfo` object
+ * contains an `index` (`childNodes` index in parent) and optionally
+ * `parent`, which points to node info of its parent (including its index).
+ *
+ * The template metadata object returned from this method has the following
+ * structure (many fields optional):
+ *
+ * ```js
+ * {
+ * // Flattened list of node metadata (for nodes that generated metadata)
+ * nodeInfoList: [
+ * {
+ * // `id` attribute for any nodes with id's for generating `$` map
+ * id: {string},
+ * // `on-event="handler"` metadata
+ * events: [
+ * {
+ * name: {string}, // event name
+ * value: {string}, // handler method name
+ * }, ...
+ * ],
+ * // Notes when the template contained a `<slot>` for shady DOM
+ * // optimization purposes
+ * hasInsertionPoint: {boolean},
+ * // For nested `<template>`` nodes, nested template metadata
+ * templateInfo: {object}, // nested template metadata
+ * // Metadata to allow efficient retrieval of instanced node
+ * // corresponding to this metadata
+ * parentInfo: {number}, // reference to parent nodeInfo>
+ * parentIndex: {number}, // index in parent's `childNodes` collection
+ * infoIndex: {number}, // index of this `nodeInfo` in `templateInfo.nodeInfoList`
+ * },
+ * ...
+ * ],
+ * // When true, the template had the `strip-whitespace` attribute
+ * // or was nested in a template with that setting
+ * stripWhitespace: {boolean},
+ * // For nested templates, nested template content is moved into
+ * // a document fragment stored here; this is an optimization to
+ * // avoid the cost of nested template cloning
+ * content: {DocumentFragment}
+ * }
+ * ```
+ *
+ * This method kicks off a recursive treewalk as follows:
+ *
+ * ```
+ * _parseTemplate <---------------------+
+ * _parseTemplateContent |
+ * _parseTemplateNode <------------|--+
+ * _parseTemplateNestedTemplate --+ |
+ * _parseTemplateChildNodes ---------+
+ * _parseTemplateNodeAttributes
+ * _parseTemplateNodeAttribute
+ *
+ * ```
+ *
+ * These methods may be overridden to add custom metadata about templates
+ * to either `templateInfo` or `nodeInfo`.
+ *
+ * Note that this method may be destructive to the template, in that
+ * e.g. event annotations may be removed after being noted in the
+ * template metadata.
+ *
+ * @param {!HTMLTemplateElement} template Template to parse
+ * @param {TemplateInfo=} outerTemplateInfo Template metadata from the outer
+ * template, for parsing nested templates
+ * @return {!TemplateInfo} Parsed template metadata
+ */
+ static _parseTemplate(template, outerTemplateInfo) {
+ // since a template may be re-used, memo-ize metadata
+ if (!template._templateInfo) {
+ let templateInfo = template._templateInfo = {};
+ templateInfo.nodeInfoList = [];
+ templateInfo.stripWhiteSpace =
+ (outerTemplateInfo && outerTemplateInfo.stripWhiteSpace) ||
+ template.hasAttribute('strip-whitespace');
+ this._parseTemplateContent(template, templateInfo, {parent: null});
+ }
+ return template._templateInfo;
+ }
+
+ static _parseTemplateContent(template, templateInfo, nodeInfo) {
+ return this._parseTemplateNode(template.content, templateInfo, nodeInfo);
+ }
+
+ /**
+ * Parses template node and adds template and node metadata based on
+ * the current node, and its `childNodes` and `attributes`.
+ *
+ * This method may be overridden to add custom node or template specific
+ * metadata based on this node.
+ *
+ * @param {Node} node Node to parse
+ * @param {!TemplateInfo} templateInfo Template metadata for current template
+ * @param {!NodeInfo} nodeInfo Node metadata for current template.
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ */
+ static _parseTemplateNode(node, templateInfo, nodeInfo) {
+ let noted;
+ let element = /** @type {Element} */(node);
+ if (element.localName == 'template' && !element.hasAttribute('preserve-content')) {
+ noted = this._parseTemplateNestedTemplate(element, templateInfo, nodeInfo) || noted;
+ } else if (element.localName === 'slot') {
+ // For ShadyDom optimization, indicating there is an insertion point
+ templateInfo.hasInsertionPoint = true;
+ }
+ if (element.firstChild) {
+ noted = this._parseTemplateChildNodes(element, templateInfo, nodeInfo) || noted;
+ }
+ if (element.hasAttributes && element.hasAttributes()) {
+ noted = this._parseTemplateNodeAttributes(element, templateInfo, nodeInfo) || noted;
+ }
+ return noted;
+ }
+
+ /**
+ * Parses template child nodes for the given root node.
+ *
+ * This method also wraps whitelisted legacy template extensions
+ * (`is="dom-if"` and `is="dom-repeat"`) with their equivalent element
+ * wrappers, collapses text nodes, and strips whitespace from the template
+ * if the `templateInfo.stripWhitespace` setting was provided.
+ *
+ * @param {Node} root Root node whose `childNodes` will be parsed
+ * @param {!TemplateInfo} templateInfo Template metadata for current template
+ * @param {!NodeInfo} nodeInfo Node metadata for current template.
+ * @return {void}
+ */
+ static _parseTemplateChildNodes(root, templateInfo, nodeInfo) {
+ if (root.localName === 'script' || root.localName === 'style') {
+ return;
+ }
+ for (let node=root.firstChild, parentIndex=0, next; node; node=next) {
+ // Wrap templates
+ if (node.localName == 'template') {
+ node = wrapTemplateExtension(node);
+ }
+ // collapse adjacent textNodes: fixes an IE issue that can cause
+ // text nodes to be inexplicably split =(
+ // note that root.normalize() should work but does not so we do this
+ // manually.
+ next = node.nextSibling;
+ if (node.nodeType === Node.TEXT_NODE) {
+ let /** Node */ n = next;
+ while (n && (n.nodeType === Node.TEXT_NODE)) {
+ node.textContent += n.textContent;
+ next = n.nextSibling;
+ root.removeChild(n);
+ n = next;
+ }
+ // optionally strip whitespace
+ if (templateInfo.stripWhiteSpace && !node.textContent.trim()) {
+ root.removeChild(node);
+ continue;
+ }
+ }
+ let childInfo = { parentIndex, parentInfo: nodeInfo };
+ if (this._parseTemplateNode(node, templateInfo, childInfo)) {
+ childInfo.infoIndex = templateInfo.nodeInfoList.push(/** @type {!NodeInfo} */(childInfo)) - 1;
+ }
+ // Increment if not removed
+ if (node.parentNode) {
+ parentIndex++;
+ }
+ }
+ }
+
+ /**
+ * Parses template content for the given nested `<template>`.
+ *
+ * Nested template info is stored as `templateInfo` in the current node's
+ * `nodeInfo`. `template.content` is removed and stored in `templateInfo`.
+ * It will then be the responsibility of the host to set it back to the
+ * template and for users stamping nested templates to use the
+ * `_contentForTemplate` method to retrieve the content for this template
+ * (an optimization to avoid the cost of cloning nested template content).
+ *
+ * @param {HTMLTemplateElement} node Node to parse (a <template>)
+ * @param {TemplateInfo} outerTemplateInfo Template metadata for current template
+ * that includes the template `node`
+ * @param {!NodeInfo} nodeInfo Node metadata for current template.
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ */
+ static _parseTemplateNestedTemplate(node, outerTemplateInfo, nodeInfo) {
+ let templateInfo = this._parseTemplate(node, outerTemplateInfo);
+ let content = templateInfo.content =
+ node.content.ownerDocument.createDocumentFragment();
+ content.appendChild(node.content);
+ nodeInfo.templateInfo = templateInfo;
+ return true;
+ }
+
+ /**
+ * Parses template node attributes and adds node metadata to `nodeInfo`
+ * for nodes of interest.
+ *
+ * @param {Element} node Node to parse
+ * @param {TemplateInfo} templateInfo Template metadata for current template
+ * @param {NodeInfo} nodeInfo Node metadata for current template.
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ */
+ static _parseTemplateNodeAttributes(node, templateInfo, nodeInfo) {
+ // Make copy of original attribute list, since the order may change
+ // as attributes are added and removed
+ let noted = false;
+ let attrs = Array.from(node.attributes);
+ for (let i=attrs.length-1, a; (a=attrs[i]); i--) {
+ noted = this._parseTemplateNodeAttribute(node, templateInfo, nodeInfo, a.name, a.value) || noted;
+ }
+ return noted;
+ }
+
+ /**
+ * Parses a single template node attribute and adds node metadata to
+ * `nodeInfo` for attributes of interest.
+ *
+ * This implementation adds metadata for `on-event="handler"` attributes
+ * and `id` attributes.
+ *
+ * @param {Element} node Node to parse
+ * @param {!TemplateInfo} templateInfo Template metadata for current template
+ * @param {!NodeInfo} nodeInfo Node metadata for current template.
+ * @param {string} name Attribute name
+ * @param {string} value Attribute value
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ */
+ static _parseTemplateNodeAttribute(node, templateInfo, nodeInfo, name, value) {
+ // events (on-*)
+ if (name.slice(0, 3) === 'on-') {
+ node.removeAttribute(name);
+ nodeInfo.events = nodeInfo.events || [];
+ nodeInfo.events.push({
+ name: name.slice(3),
+ value
+ });
+ return true;
+ }
+ // static id
+ else if (name === 'id') {
+ nodeInfo.id = value;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns the `content` document fragment for a given template.
+ *
+ * For nested templates, Polymer performs an optimization to cache nested
+ * template content to avoid the cost of cloning deeply nested templates.
+ * This method retrieves the cached content for a given template.
+ *
+ * @param {HTMLTemplateElement} template Template to retrieve `content` for
+ * @return {DocumentFragment} Content fragment
+ */
+ static _contentForTemplate(template) {
+ let templateInfo = /** @type {HTMLTemplateElementWithInfo} */ (template)._templateInfo;
+ return (templateInfo && templateInfo.content) || template.content;
+ }
+
+ /**
+ * Clones the provided template content and returns a document fragment
+ * containing the cloned dom.
+ *
+ * The template is parsed (once and memoized) using this library's
+ * template parsing features, and provides the following value-added
+ * features:
+ * * Adds declarative event listeners for `on-event="handler"` attributes
+ * * Generates an "id map" for all nodes with id's under `$` on returned
+ * document fragment
+ * * Passes template info including `content` back to templates as
+ * `_templateInfo` (a performance optimization to avoid deep template
+ * cloning)
+ *
+ * Note that the memoized template parsing process is destructive to the
+ * template: attributes for bindings and declarative event listeners are
+ * removed after being noted in notes, and any nested `<template>.content`
+ * is removed and stored in notes as well.
+ *
+ * @param {!HTMLTemplateElement} template Template to stamp
+ * @return {!StampedTemplate} Cloned template content
+ */
+ _stampTemplate(template) {
+ // Polyfill support: bootstrap the template if it has not already been
+ if (template && !template.content &&
+ window.HTMLTemplateElement && HTMLTemplateElement.decorate) {
+ HTMLTemplateElement.decorate(template);
+ }
+ let templateInfo = this.constructor._parseTemplate(template);
+ let nodeInfo = templateInfo.nodeInfoList;
+ let content = templateInfo.content || template.content;
+ let dom = /** @type {DocumentFragment} */ (document.importNode(content, true));
+ // NOTE: ShadyDom optimization indicating there is an insertion point
+ dom.__noInsertionPoint = !templateInfo.hasInsertionPoint;
+ let nodes = dom.nodeList = new Array(nodeInfo.length);
+ dom.$ = {};
+ for (let i=0, l=nodeInfo.length, info; (i<l) && (info=nodeInfo[i]); i++) {
+ let node = nodes[i] = findTemplateNode(dom, info);
+ applyIdToMap(this, dom.$, node, info);
+ applyTemplateContent(this, node, info);
+ applyEventListener(this, node, info);
+ }
+ dom = /** @type {!StampedTemplate} */(dom); // eslint-disable-line no-self-assign
+ return dom;
+ }
+
+ /**
+ * Adds an event listener by method name for the event provided.
+ *
+ * This method generates a handler function that looks up the method
+ * name at handling time.
+ *
+ * @param {!Node} node Node to add listener on
+ * @param {string} eventName Name of event
+ * @param {string} methodName Name of method
+ * @param {*=} context Context the method will be called on (defaults
+ * to `node`)
+ * @return {Function} Generated handler function
+ */
+ _addMethodEventListenerToNode(node, eventName, methodName, context) {
+ context = context || node;
+ let handler = createNodeEventHandler(context, eventName, methodName);
+ this._addEventListenerToNode(node, eventName, handler);
+ return handler;
+ }
+
+ /**
+ * Override point for adding custom or simulated event handling.
+ *
+ * @param {!Node} node Node to add event listener to
+ * @param {string} eventName Name of event
+ * @param {function(!Event):void} handler Listener function to add
+ * @return {void}
+ */
+ _addEventListenerToNode(node, eventName, handler) {
+ node.addEventListener(eventName, handler);
+ }
+
+ /**
+ * Override point for adding custom or simulated event handling.
+ *
+ * @param {Node} node Node to remove event listener from
+ * @param {string} eventName Name of event
+ * @param {function(!Event):void} handler Listener function to remove
+ * @return {void}
+ */
+ _removeEventListenerFromNode(node, eventName, handler) {
+ node.removeEventListener(eventName, handler);
+ }
+
+ }
+
+ return TemplateStamp;
+
+ });
+
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/array-splice.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/array-splice.html
new file mode 100644
index 00000000000..43420d47113
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/array-splice.html
@@ -0,0 +1,316 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="boot.html">
+<script>
+(function() {
+
+ 'use strict';
+
+ function newSplice(index, removed, addedCount) {
+ return {
+ index: index,
+ removed: removed,
+ addedCount: addedCount
+ };
+ }
+
+ const EDIT_LEAVE = 0;
+ const EDIT_UPDATE = 1;
+ const EDIT_ADD = 2;
+ const EDIT_DELETE = 3;
+
+ // Note: This function is *based* on the computation of the Levenshtein
+ // "edit" distance. The one change is that "updates" are treated as two
+ // edits - not one. With Array splices, an update is really a delete
+ // followed by an add. By retaining this, we optimize for "keeping" the
+ // maximum array items in the original array. For example:
+ //
+ // 'xxxx123' -> '123yyyy'
+ //
+ // With 1-edit updates, the shortest path would be just to update all seven
+ // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This
+ // leaves the substring '123' intact.
+ function calcEditDistances(current, currentStart, currentEnd,
+ old, oldStart, oldEnd) {
+ // "Deletion" columns
+ let rowCount = oldEnd - oldStart + 1;
+ let columnCount = currentEnd - currentStart + 1;
+ let distances = new Array(rowCount);
+
+ // "Addition" rows. Initialize null column.
+ for (let i = 0; i < rowCount; i++) {
+ distances[i] = new Array(columnCount);
+ distances[i][0] = i;
+ }
+
+ // Initialize null row
+ for (let j = 0; j < columnCount; j++)
+ distances[0][j] = j;
+
+ for (let i = 1; i < rowCount; i++) {
+ for (let j = 1; j < columnCount; j++) {
+ if (equals(current[currentStart + j - 1], old[oldStart + i - 1]))
+ distances[i][j] = distances[i - 1][j - 1];
+ else {
+ let north = distances[i - 1][j] + 1;
+ let west = distances[i][j - 1] + 1;
+ distances[i][j] = north < west ? north : west;
+ }
+ }
+ }
+
+ return distances;
+ }
+
+ // This starts at the final weight, and walks "backward" by finding
+ // the minimum previous weight recursively until the origin of the weight
+ // matrix.
+ function spliceOperationsFromEditDistances(distances) {
+ let i = distances.length - 1;
+ let j = distances[0].length - 1;
+ let current = distances[i][j];
+ let edits = [];
+ while (i > 0 || j > 0) {
+ if (i == 0) {
+ edits.push(EDIT_ADD);
+ j--;
+ continue;
+ }
+ if (j == 0) {
+ edits.push(EDIT_DELETE);
+ i--;
+ continue;
+ }
+ let northWest = distances[i - 1][j - 1];
+ let west = distances[i - 1][j];
+ let north = distances[i][j - 1];
+
+ let min;
+ if (west < north)
+ min = west < northWest ? west : northWest;
+ else
+ min = north < northWest ? north : northWest;
+
+ if (min == northWest) {
+ if (northWest == current) {
+ edits.push(EDIT_LEAVE);
+ } else {
+ edits.push(EDIT_UPDATE);
+ current = northWest;
+ }
+ i--;
+ j--;
+ } else if (min == west) {
+ edits.push(EDIT_DELETE);
+ i--;
+ current = west;
+ } else {
+ edits.push(EDIT_ADD);
+ j--;
+ current = north;
+ }
+ }
+
+ edits.reverse();
+ return edits;
+ }
+
+ /**
+ * Splice Projection functions:
+ *
+ * A splice map is a representation of how a previous array of items
+ * was transformed into a new array of items. Conceptually it is a list of
+ * tuples of
+ *
+ * <index, removed, addedCount>
+ *
+ * which are kept in ascending index order of. The tuple represents that at
+ * the |index|, |removed| sequence of items were removed, and counting forward
+ * from |index|, |addedCount| items were added.
+ */
+
+ /**
+ * Lacking individual splice mutation information, the minimal set of
+ * splices can be synthesized given the previous state and final state of an
+ * array. The basic approach is to calculate the edit distance matrix and
+ * choose the shortest path through it.
+ *
+ * Complexity: O(l * p)
+ * l: The length of the current array
+ * p: The length of the old array
+ *
+ * @param {!Array} current The current "changed" array for which to
+ * calculate splices.
+ * @param {number} currentStart Starting index in the `current` array for
+ * which splices are calculated.
+ * @param {number} currentEnd Ending index in the `current` array for
+ * which splices are calculated.
+ * @param {!Array} old The original "unchanged" array to compare `current`
+ * against to determine splices.
+ * @param {number} oldStart Starting index in the `old` array for
+ * which splices are calculated.
+ * @param {number} oldEnd Ending index in the `old` array for
+ * which splices are calculated.
+ * @return {!Array} Returns an array of splice record objects. Each of these
+ * contains: `index` the location where the splice occurred; `removed`
+ * the array of removed items from this location; `addedCount` the number
+ * of items added at this location.
+ */
+ function calcSplices(current, currentStart, currentEnd,
+ old, oldStart, oldEnd) {
+ let prefixCount = 0;
+ let suffixCount = 0;
+ let splice;
+
+ let minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);
+ if (currentStart == 0 && oldStart == 0)
+ prefixCount = sharedPrefix(current, old, minLength);
+
+ if (currentEnd == current.length && oldEnd == old.length)
+ suffixCount = sharedSuffix(current, old, minLength - prefixCount);
+
+ currentStart += prefixCount;
+ oldStart += prefixCount;
+ currentEnd -= suffixCount;
+ oldEnd -= suffixCount;
+
+ if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)
+ return [];
+
+ if (currentStart == currentEnd) {
+ splice = newSplice(currentStart, [], 0);
+ while (oldStart < oldEnd)
+ splice.removed.push(old[oldStart++]);
+
+ return [ splice ];
+ } else if (oldStart == oldEnd)
+ return [ newSplice(currentStart, [], currentEnd - currentStart) ];
+
+ let ops = spliceOperationsFromEditDistances(
+ calcEditDistances(current, currentStart, currentEnd,
+ old, oldStart, oldEnd));
+
+ splice = undefined;
+ let splices = [];
+ let index = currentStart;
+ let oldIndex = oldStart;
+ for (let i = 0; i < ops.length; i++) {
+ switch(ops[i]) {
+ case EDIT_LEAVE:
+ if (splice) {
+ splices.push(splice);
+ splice = undefined;
+ }
+
+ index++;
+ oldIndex++;
+ break;
+ case EDIT_UPDATE:
+ if (!splice)
+ splice = newSplice(index, [], 0);
+
+ splice.addedCount++;
+ index++;
+
+ splice.removed.push(old[oldIndex]);
+ oldIndex++;
+ break;
+ case EDIT_ADD:
+ if (!splice)
+ splice = newSplice(index, [], 0);
+
+ splice.addedCount++;
+ index++;
+ break;
+ case EDIT_DELETE:
+ if (!splice)
+ splice = newSplice(index, [], 0);
+
+ splice.removed.push(old[oldIndex]);
+ oldIndex++;
+ break;
+ }
+ }
+
+ if (splice) {
+ splices.push(splice);
+ }
+ return splices;
+ }
+
+ function sharedPrefix(current, old, searchLength) {
+ for (let i = 0; i < searchLength; i++)
+ if (!equals(current[i], old[i]))
+ return i;
+ return searchLength;
+ }
+
+ function sharedSuffix(current, old, searchLength) {
+ let index1 = current.length;
+ let index2 = old.length;
+ let count = 0;
+ while (count < searchLength && equals(current[--index1], old[--index2]))
+ count++;
+
+ return count;
+ }
+
+ function calculateSplices(current, previous) {
+ return calcSplices(current, 0, current.length, previous, 0,
+ previous.length);
+ }
+
+ function equals(currentValue, previousValue) {
+ return currentValue === previousValue;
+ }
+
+ /**
+ * @namespace
+ * @memberof Polymer
+ * @summary Module that provides utilities for diffing arrays.
+ */
+ Polymer.ArraySplice = {
+ /**
+ * Returns an array of splice records indicating the minimum edits required
+ * to transform the `previous` array into the `current` array.
+ *
+ * Splice records are ordered by index and contain the following fields:
+ * - `index`: index where edit started
+ * - `removed`: array of removed items from this index
+ * - `addedCount`: number of items added at this index
+ *
+ * This function is based on the Levenshtein "minimum edit distance"
+ * algorithm. Note that updates are treated as removal followed by addition.
+ *
+ * The worst-case time complexity of this algorithm is `O(l * p)`
+ * l: The length of the current array
+ * p: The length of the previous array
+ *
+ * However, the worst-case complexity is reduced by an `O(n)` optimization
+ * to detect any shared prefix & suffix between the two arrays and only
+ * perform the more expensive minimum edit distance calculation over the
+ * non-shared portions of the arrays.
+ *
+ * @function
+ * @memberof Polymer.ArraySplice
+ * @param {!Array} current The "changed" array for which splices will be
+ * calculated.
+ * @param {!Array} previous The "unchanged" original array to compare
+ * `current` against to determine the splices.
+ * @return {!Array} Returns an array of splice record objects. Each of these
+ * contains: `index` the location where the splice occurred; `removed`
+ * the array of removed items from this location; `addedCount` the number
+ * of items added at this location.
+ */
+ calculateSplices
+ };
+
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/async.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/async.html
new file mode 100644
index 00000000000..4ddd961c6fc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/async.html
@@ -0,0 +1,216 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="boot.html">
+
+<script>
+(function() {
+
+ 'use strict';
+
+ // Microtask implemented using Mutation Observer
+ let microtaskCurrHandle = 0;
+ let microtaskLastHandle = 0;
+ let microtaskCallbacks = [];
+ let microtaskNodeContent = 0;
+ let microtaskNode = document.createTextNode('');
+ new window.MutationObserver(microtaskFlush).observe(microtaskNode, {characterData: true});
+
+ function microtaskFlush() {
+ const len = microtaskCallbacks.length;
+ for (let i = 0; i < len; i++) {
+ let cb = microtaskCallbacks[i];
+ if (cb) {
+ try {
+ cb();
+ } catch (e) {
+ setTimeout(() => { throw e; });
+ }
+ }
+ }
+ microtaskCallbacks.splice(0, len);
+ microtaskLastHandle += len;
+ }
+
+ /**
+ * Module that provides a number of strategies for enqueuing asynchronous
+ * tasks. Each sub-module provides a standard `run(fn)` interface that returns a
+ * handle, and a `cancel(handle)` interface for canceling async tasks before
+ * they run.
+ *
+ * @namespace
+ * @memberof Polymer
+ * @summary Module that provides a number of strategies for enqueuing asynchronous
+ * tasks.
+ */
+ Polymer.Async = {
+
+ /**
+ * Async interface wrapper around `setTimeout`.
+ *
+ * @namespace
+ * @memberof Polymer.Async
+ * @summary Async interface wrapper around `setTimeout`.
+ */
+ timeOut: {
+ /**
+ * Returns a sub-module with the async interface providing the provided
+ * delay.
+ *
+ * @memberof Polymer.Async.timeOut
+ * @param {number=} delay Time to wait before calling callbacks in ms
+ * @return {!AsyncInterface} An async timeout interface
+ */
+ after(delay) {
+ return {
+ run(fn) { return window.setTimeout(fn, delay); },
+ cancel(handle) {
+ window.clearTimeout(handle);
+ }
+ };
+ },
+ /**
+ * Enqueues a function called in the next task.
+ *
+ * @memberof Polymer.Async.timeOut
+ * @param {!Function} fn Callback to run
+ * @param {number=} delay Delay in milliseconds
+ * @return {number} Handle used for canceling task
+ */
+ run(fn, delay) {
+ return window.setTimeout(fn, delay);
+ },
+ /**
+ * Cancels a previously enqueued `timeOut` callback.
+ *
+ * @memberof Polymer.Async.timeOut
+ * @param {number} handle Handle returned from `run` of callback to cancel
+ * @return {void}
+ */
+ cancel(handle) {
+ window.clearTimeout(handle);
+ }
+ },
+
+ /**
+ * Async interface wrapper around `requestAnimationFrame`.
+ *
+ * @namespace
+ * @memberof Polymer.Async
+ * @summary Async interface wrapper around `requestAnimationFrame`.
+ */
+ animationFrame: {
+ /**
+ * Enqueues a function called at `requestAnimationFrame` timing.
+ *
+ * @memberof Polymer.Async.animationFrame
+ * @param {function(number):void} fn Callback to run
+ * @return {number} Handle used for canceling task
+ */
+ run(fn) {
+ return window.requestAnimationFrame(fn);
+ },
+ /**
+ * Cancels a previously enqueued `animationFrame` callback.
+ *
+ * @memberof Polymer.Async.animationFrame
+ * @param {number} handle Handle returned from `run` of callback to cancel
+ * @return {void}
+ */
+ cancel(handle) {
+ window.cancelAnimationFrame(handle);
+ }
+ },
+
+ /**
+ * Async interface wrapper around `requestIdleCallback`. Falls back to
+ * `setTimeout` on browsers that do not support `requestIdleCallback`.
+ *
+ * @namespace
+ * @memberof Polymer.Async
+ * @summary Async interface wrapper around `requestIdleCallback`.
+ */
+ idlePeriod: {
+ /**
+ * Enqueues a function called at `requestIdleCallback` timing.
+ *
+ * @memberof Polymer.Async.idlePeriod
+ * @param {function(!IdleDeadline):void} fn Callback to run
+ * @return {number} Handle used for canceling task
+ */
+ run(fn) {
+ return window.requestIdleCallback ?
+ window.requestIdleCallback(fn) :
+ window.setTimeout(fn, 16);
+ },
+ /**
+ * Cancels a previously enqueued `idlePeriod` callback.
+ *
+ * @memberof Polymer.Async.idlePeriod
+ * @param {number} handle Handle returned from `run` of callback to cancel
+ * @return {void}
+ */
+ cancel(handle) {
+ window.cancelIdleCallback ?
+ window.cancelIdleCallback(handle) :
+ window.clearTimeout(handle);
+ }
+ },
+
+ /**
+ * Async interface for enqueuing callbacks that run at microtask timing.
+ *
+ * Note that microtask timing is achieved via a single `MutationObserver`,
+ * and thus callbacks enqueued with this API will all run in a single
+ * batch, and not interleaved with other microtasks such as promises.
+ * Promises are avoided as an implementation choice for the time being
+ * due to Safari bugs that cause Promises to lack microtask guarantees.
+ *
+ * @namespace
+ * @memberof Polymer.Async
+ * @summary Async interface for enqueuing callbacks that run at microtask
+ * timing.
+ */
+ microTask: {
+
+ /**
+ * Enqueues a function called at microtask timing.
+ *
+ * @memberof Polymer.Async.microTask
+ * @param {!Function=} callback Callback to run
+ * @return {number} Handle used for canceling task
+ */
+ run(callback) {
+ microtaskNode.textContent = microtaskNodeContent++;
+ microtaskCallbacks.push(callback);
+ return microtaskCurrHandle++;
+ },
+
+ /**
+ * Cancels a previously enqueued `microTask` callback.
+ *
+ * @memberof Polymer.Async.microTask
+ * @param {number} handle Handle returned from `run` of callback to cancel
+ * @return {void}
+ */
+ cancel(handle) {
+ const idx = handle - microtaskLastHandle;
+ if (idx >= 0) {
+ if (!microtaskCallbacks[idx]) {
+ throw new Error('invalid async handle: ' + handle);
+ }
+ microtaskCallbacks[idx] = null;
+ }
+ }
+
+ }
+ };
+
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/boot.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/boot.html
new file mode 100644
index 00000000000..0426caa6562
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/boot.html
@@ -0,0 +1,65 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<script>
+(function() {
+ 'use strict';
+
+ const userPolymer = window.Polymer;
+
+ /**
+ * @namespace Polymer
+ * @summary Polymer is a lightweight library built on top of the web
+ * standards-based Web Components API's, and makes it easy to build your
+ * own custom HTML elements.
+ * @param {!PolymerInit} info Prototype for the custom element. It must contain
+ * an `is` property to specify the element name. Other properties populate
+ * the element prototype. The `properties`, `observers`, `hostAttributes`,
+ * and `listeners` properties are processed to create element features.
+ * @return {!Object} Returns a custom element class for the given provided
+ * prototype `info` object. The name of the element if given by `info.is`.
+ */
+ window.Polymer = function(info) {
+ return window.Polymer._polymerFn(info);
+ };
+
+ // support user settings on the Polymer object
+ if (userPolymer) {
+ Object.assign(Polymer, userPolymer);
+ }
+
+ // To be plugged by legacy implementation if loaded
+ /* eslint-disable valid-jsdoc */
+ /**
+ * @param {!PolymerInit} info Prototype for the custom element. It must contain
+ * an `is` property to specify the element name. Other properties populate
+ * the element prototype. The `properties`, `observers`, `hostAttributes`,
+ * and `listeners` properties are processed to create element features.
+ * @return {!Object} Returns a custom element class for the given provided
+ * prototype `info` object. The name of the element if given by `info.is`.
+ */
+ window.Polymer._polymerFn = function(info) { // eslint-disable-line no-unused-vars
+ throw new Error('Load polymer.html to use the Polymer() function.');
+ };
+ /* eslint-enable */
+
+ window.Polymer.version = '2.6.0';
+
+ /* eslint-disable no-unused-vars */
+ /*
+ When using Closure Compiler, JSCompiler_renameProperty(property, object) is replaced by the munged name for object[property]
+ We cannot alias this function, so we have to use a small shim that has the same behavior when not compiling.
+ */
+ window.JSCompiler_renameProperty = function(prop, obj) {
+ return prop;
+ };
+ /* eslint-enable */
+
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/case-map.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/case-map.html
new file mode 100644
index 00000000000..b1b44cdafe2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/case-map.html
@@ -0,0 +1,64 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="boot.html">
+<script>
+(function() {
+ 'use strict';
+
+ const caseMap = {};
+ const DASH_TO_CAMEL = /-[a-z]/g;
+ const CAMEL_TO_DASH = /([A-Z])/g;
+
+ /**
+ * Module with utilities for converting between "dash-case" and "camelCase"
+ * identifiers.
+ *
+ * @namespace
+ * @memberof Polymer
+ * @summary Module that provides utilities for converting between "dash-case"
+ * and "camelCase".
+ */
+ const CaseMap = {
+
+ /**
+ * Converts "dash-case" identifier (e.g. `foo-bar-baz`) to "camelCase"
+ * (e.g. `fooBarBaz`).
+ *
+ * @memberof Polymer.CaseMap
+ * @param {string} dash Dash-case identifier
+ * @return {string} Camel-case representation of the identifier
+ */
+ dashToCamelCase(dash) {
+ return caseMap[dash] || (
+ caseMap[dash] = dash.indexOf('-') < 0 ? dash : dash.replace(DASH_TO_CAMEL,
+ (m) => m[1].toUpperCase()
+ )
+ );
+ },
+
+ /**
+ * Converts "camelCase" identifier (e.g. `fooBarBaz`) to "dash-case"
+ * (e.g. `foo-bar-baz`).
+ *
+ * @memberof Polymer.CaseMap
+ * @param {string} camel Camel-case identifier
+ * @return {string} Dash-case representation of the identifier
+ */
+ camelToDashCase(camel) {
+ return caseMap[camel] || (
+ caseMap[camel] = camel.replace(CAMEL_TO_DASH, '-$1').toLowerCase()
+ );
+ }
+
+ };
+
+ Polymer.CaseMap = CaseMap;
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/debounce.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/debounce.html
new file mode 100644
index 00000000000..8344af328f8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/debounce.html
@@ -0,0 +1,118 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="boot.html">
+<link rel="import" href="mixin.html">
+<link rel="import" href="async.html">
+
+<script>
+(function() {
+ 'use strict';
+
+ /**
+ * @summary Collapse multiple callbacks into one invocation after a timer.
+ * @memberof Polymer
+ */
+ class Debouncer {
+ constructor() {
+ this._asyncModule = null;
+ this._callback = null;
+ this._timer = null;
+ }
+ /**
+ * Sets the scheduler; that is, a module with the Async interface,
+ * a callback and optional arguments to be passed to the run function
+ * from the async module.
+ *
+ * @param {!AsyncInterface} asyncModule Object with Async interface.
+ * @param {function()} callback Callback to run.
+ * @return {void}
+ */
+ setConfig(asyncModule, callback) {
+ this._asyncModule = asyncModule;
+ this._callback = callback;
+ this._timer = this._asyncModule.run(() => {
+ this._timer = null;
+ this._callback();
+ });
+ }
+ /**
+ * Cancels an active debouncer and returns a reference to itself.
+ *
+ * @return {void}
+ */
+ cancel() {
+ if (this.isActive()) {
+ this._asyncModule.cancel(this._timer);
+ this._timer = null;
+ }
+ }
+ /**
+ * Flushes an active debouncer and returns a reference to itself.
+ *
+ * @return {void}
+ */
+ flush() {
+ if (this.isActive()) {
+ this.cancel();
+ this._callback();
+ }
+ }
+ /**
+ * Returns true if the debouncer is active.
+ *
+ * @return {boolean} True if active.
+ */
+ isActive() {
+ return this._timer != null;
+ }
+ /**
+ * Creates a debouncer if no debouncer is passed as a parameter
+ * or it cancels an active debouncer otherwise. The following
+ * example shows how a debouncer can be called multiple times within a
+ * microtask and "debounced" such that the provided callback function is
+ * called once. Add this method to a custom element:
+ *
+ * _debounceWork() {
+ * this._debounceJob = Polymer.Debouncer.debounce(this._debounceJob,
+ * Polymer.Async.microTask, () => {
+ * this._doWork();
+ * });
+ * }
+ *
+ * If the `_debounceWork` method is called multiple times within the same
+ * microtask, the `_doWork` function will be called only once at the next
+ * microtask checkpoint.
+ *
+ * Note: In testing it is often convenient to avoid asynchrony. To accomplish
+ * this with a debouncer, you can use `Polymer.enqueueDebouncer` and
+ * `Polymer.flush`. For example, extend the above example by adding
+ * `Polymer.enqueueDebouncer(this._debounceJob)` at the end of the
+ * `_debounceWork` method. Then in a test, call `Polymer.flush` to ensure
+ * the debouncer has completed.
+ *
+ * @param {Debouncer?} debouncer Debouncer object.
+ * @param {!AsyncInterface} asyncModule Object with Async interface
+ * @param {function()} callback Callback to run.
+ * @return {!Debouncer} Returns a debouncer object.
+ */
+ static debounce(debouncer, asyncModule, callback) {
+ if (debouncer instanceof Debouncer) {
+ debouncer.cancel();
+ } else {
+ debouncer = new Debouncer();
+ }
+ debouncer.setConfig(asyncModule, callback);
+ return debouncer;
+ }
+ }
+
+ Polymer.Debouncer = Debouncer;
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/flattened-nodes-observer.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/flattened-nodes-observer.html
new file mode 100644
index 00000000000..2273b1604f7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/flattened-nodes-observer.html
@@ -0,0 +1,312 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="../utils/boot.html">
+<link rel="import" href="../utils/array-splice.html">
+<link rel="import" href="../utils/async.html">
+<script>
+(function() {
+ 'use strict';
+
+ /**
+ * Returns true if `node` is a slot element
+ * @param {Node} node Node to test.
+ * @return {boolean} Returns true if the given `node` is a slot
+ * @private
+ */
+ function isSlot(node) {
+ return (node.localName === 'slot');
+ }
+
+ /**
+ * Class that listens for changes (additions or removals) to
+ * "flattened nodes" on a given `node`. The list of flattened nodes consists
+ * of a node's children and, for any children that are `<slot>` elements,
+ * the expanded flattened list of `assignedNodes`.
+ * For example, if the observed node has children `<a></a><slot></slot><b></b>`
+ * and the `<slot>` has one `<div>` assigned to it, then the flattened
+ * nodes list is `<a></a><div></div><b></b>`. If the `<slot>` has other
+ * `<slot>` elements assigned to it, these are flattened as well.
+ *
+ * The provided `callback` is called whenever any change to this list
+ * of flattened nodes occurs, where an addition or removal of a node is
+ * considered a change. The `callback` is called with one argument, an object
+ * containing an array of any `addedNodes` and `removedNodes`.
+ *
+ * Note: the callback is called asynchronous to any changes
+ * at a microtask checkpoint. This is because observation is performed using
+ * `MutationObserver` and the `<slot>` element's `slotchange` event which
+ * are asynchronous.
+ *
+ * An example:
+ * ```js
+ * class TestSelfObserve extends Polymer.Element {
+ * static get is() { return 'test-self-observe';}
+ * connectedCallback() {
+ * super.connectedCallback();
+ * this._observer = new Polymer.FlattenedNodesObserver(this, (info) => {
+ * this.info = info;
+ * });
+ * }
+ * disconnectedCallback() {
+ * super.disconnectedCallback();
+ * this._observer.disconnect();
+ * }
+ * }
+ * customElements.define(TestSelfObserve.is, TestSelfObserve);
+ * ```
+ *
+ * @memberof Polymer
+ * @summary Class that listens for changes (additions or removals) to
+ * "flattened nodes" on a given `node`.
+ */
+ class FlattenedNodesObserver {
+
+ /**
+ * Returns the list of flattened nodes for the given `node`.
+ * This list consists of a node's children and, for any children
+ * that are `<slot>` elements, the expanded flattened list of `assignedNodes`.
+ * For example, if the observed node has children `<a></a><slot></slot><b></b>`
+ * and the `<slot>` has one `<div>` assigned to it, then the flattened
+ * nodes list is `<a></a><div></div><b></b>`. If the `<slot>` has other
+ * `<slot>` elements assigned to it, these are flattened as well.
+ *
+ * @param {HTMLElement|HTMLSlotElement} node The node for which to return the list of flattened nodes.
+ * @return {Array} The list of flattened nodes for the given `node`.
+ */
+ static getFlattenedNodes(node) {
+ if (isSlot(node)) {
+ node = /** @type {HTMLSlotElement} */(node); // eslint-disable-line no-self-assign
+ return node.assignedNodes({flatten: true});
+ } else {
+ return Array.from(node.childNodes).map((node) => {
+ if (isSlot(node)) {
+ node = /** @type {HTMLSlotElement} */(node); // eslint-disable-line no-self-assign
+ return node.assignedNodes({flatten: true});
+ } else {
+ return [node];
+ }
+ }).reduce((a, b) => a.concat(b), []);
+ }
+ }
+
+ /**
+ * @param {Element} target Node on which to listen for changes.
+ * @param {?function(!Element, { target: !Element, addedNodes: !Array<!Element>, removedNodes: !Array<!Element> }):void} callback Function called when there are additions
+ * or removals from the target's list of flattened nodes.
+ */
+ constructor(target, callback) {
+ /**
+ * @type {MutationObserver}
+ * @private
+ */
+ this._shadyChildrenObserver = null;
+ /**
+ * @type {MutationObserver}
+ * @private
+ */
+ this._nativeChildrenObserver = null;
+ this._connected = false;
+ /**
+ * @type {Element}
+ * @private
+ */
+ this._target = target;
+ this.callback = callback;
+ this._effectiveNodes = [];
+ this._observer = null;
+ this._scheduled = false;
+ /**
+ * @type {function()}
+ * @private
+ */
+ this._boundSchedule = () => {
+ this._schedule();
+ };
+ this.connect();
+ this._schedule();
+ }
+
+ /**
+ * Activates an observer. This method is automatically called when
+ * a `FlattenedNodesObserver` is created. It should only be called to
+ * re-activate an observer that has been deactivated via the `disconnect` method.
+ *
+ * @return {void}
+ */
+ connect() {
+ if (isSlot(this._target)) {
+ this._listenSlots([this._target]);
+ } else if (this._target.children) {
+ this._listenSlots(this._target.children);
+ if (window.ShadyDOM) {
+ this._shadyChildrenObserver =
+ ShadyDOM.observeChildren(this._target, (mutations) => {
+ this._processMutations(mutations);
+ });
+ } else {
+ this._nativeChildrenObserver =
+ new MutationObserver((mutations) => {
+ this._processMutations(mutations);
+ });
+ this._nativeChildrenObserver.observe(this._target, {childList: true});
+ }
+ }
+ this._connected = true;
+ }
+
+ /**
+ * Deactivates the flattened nodes observer. After calling this method
+ * the observer callback will not be called when changes to flattened nodes
+ * occur. The `connect` method may be subsequently called to reactivate
+ * the observer.
+ *
+ * @return {void}
+ */
+ disconnect() {
+ if (isSlot(this._target)) {
+ this._unlistenSlots([this._target]);
+ } else if (this._target.children) {
+ this._unlistenSlots(this._target.children);
+ if (window.ShadyDOM && this._shadyChildrenObserver) {
+ ShadyDOM.unobserveChildren(this._shadyChildrenObserver);
+ this._shadyChildrenObserver = null;
+ } else if (this._nativeChildrenObserver) {
+ this._nativeChildrenObserver.disconnect();
+ this._nativeChildrenObserver = null;
+ }
+ }
+ this._connected = false;
+ }
+
+ /**
+ * @return {void}
+ * @private
+ */
+ _schedule() {
+ if (!this._scheduled) {
+ this._scheduled = true;
+ Polymer.Async.microTask.run(() => this.flush());
+ }
+ }
+
+ /**
+ * @param {Array<MutationRecord>} mutations Mutations signaled by the mutation observer
+ * @return {void}
+ * @private
+ */
+ _processMutations(mutations) {
+ this._processSlotMutations(mutations);
+ this.flush();
+ }
+
+ /**
+ * @param {Array<MutationRecord>} mutations Mutations signaled by the mutation observer
+ * @return {void}
+ * @private
+ */
+ _processSlotMutations(mutations) {
+ if (mutations) {
+ for (let i=0; i < mutations.length; i++) {
+ let mutation = mutations[i];
+ if (mutation.addedNodes) {
+ this._listenSlots(mutation.addedNodes);
+ }
+ if (mutation.removedNodes) {
+ this._unlistenSlots(mutation.removedNodes);
+ }
+ }
+ }
+ }
+
+ /**
+ * Flushes the observer causing any pending changes to be immediately
+ * delivered the observer callback. By default these changes are delivered
+ * asynchronously at the next microtask checkpoint.
+ *
+ * @return {boolean} Returns true if any pending changes caused the observer
+ * callback to run.
+ */
+ flush() {
+ if (!this._connected) {
+ return false;
+ }
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ if (this._nativeChildrenObserver) {
+ this._processSlotMutations(this._nativeChildrenObserver.takeRecords());
+ } else if (this._shadyChildrenObserver) {
+ this._processSlotMutations(this._shadyChildrenObserver.takeRecords());
+ }
+ this._scheduled = false;
+ let info = {
+ target: this._target,
+ addedNodes: [],
+ removedNodes: []
+ };
+ let newNodes = this.constructor.getFlattenedNodes(this._target);
+ let splices = Polymer.ArraySplice.calculateSplices(newNodes,
+ this._effectiveNodes);
+ // process removals
+ for (let i=0, s; (i<splices.length) && (s=splices[i]); i++) {
+ for (let j=0, n; (j < s.removed.length) && (n=s.removed[j]); j++) {
+ info.removedNodes.push(n);
+ }
+ }
+ // process adds
+ for (let i=0, s; (i<splices.length) && (s=splices[i]); i++) {
+ for (let j=s.index; j < s.index + s.addedCount; j++) {
+ info.addedNodes.push(newNodes[j]);
+ }
+ }
+ // update cache
+ this._effectiveNodes = newNodes;
+ let didFlush = false;
+ if (info.addedNodes.length || info.removedNodes.length) {
+ didFlush = true;
+ this.callback.call(this._target, info);
+ }
+ return didFlush;
+ }
+
+ /**
+ * @param {!Array<Element|Node>|!NodeList<Node>} nodeList Nodes that could change
+ * @return {void}
+ * @private
+ */
+ _listenSlots(nodeList) {
+ for (let i=0; i < nodeList.length; i++) {
+ let n = nodeList[i];
+ if (isSlot(n)) {
+ n.addEventListener('slotchange', this._boundSchedule);
+ }
+ }
+ }
+
+ /**
+ * @param {!Array<Element|Node>|!NodeList<Node>} nodeList Nodes that could change
+ * @return {void}
+ * @private
+ */
+ _unlistenSlots(nodeList) {
+ for (let i=0; i < nodeList.length; i++) {
+ let n = nodeList[i];
+ if (isSlot(n)) {
+ n.removeEventListener('slotchange', this._boundSchedule);
+ }
+ }
+ }
+
+ }
+
+ Polymer.FlattenedNodesObserver = FlattenedNodesObserver;
+
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/flush.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/flush.html
new file mode 100644
index 00000000000..3feaad61661
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/flush.html
@@ -0,0 +1,62 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="boot.html">
+<script>
+(function() {
+ 'use strict';
+
+ let debouncerQueue = [];
+
+ /**
+ * Adds a `Polymer.Debouncer` to a list of globally flushable tasks.
+ *
+ * @memberof Polymer
+ * @param {!Polymer.Debouncer} debouncer Debouncer to enqueue
+ * @return {void}
+ */
+ Polymer.enqueueDebouncer = function(debouncer) {
+ debouncerQueue.push(debouncer);
+ };
+
+ function flushDebouncers() {
+ const didFlush = Boolean(debouncerQueue.length);
+ while (debouncerQueue.length) {
+ try {
+ debouncerQueue.shift().flush();
+ } catch(e) {
+ setTimeout(() => {
+ throw e;
+ });
+ }
+ }
+ return didFlush;
+ }
+
+ /**
+ * Forces several classes of asynchronously queued tasks to flush:
+ * - Debouncers added via `enqueueDebouncer`
+ * - ShadyDOM distribution
+ *
+ * @memberof Polymer
+ * @return {void}
+ */
+ Polymer.flush = function() {
+ let shadyDOM, debouncers;
+ do {
+ shadyDOM = window.ShadyDOM && ShadyDOM.flush();
+ if (window.ShadyCSS && window.ShadyCSS.ScopingShim) {
+ window.ShadyCSS.ScopingShim.flush();
+ }
+ debouncers = flushDebouncers();
+ } while (shadyDOM || debouncers);
+ };
+
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/gestures.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/gestures.html
new file mode 100644
index 00000000000..2a05daa462e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/gestures.html
@@ -0,0 +1,1093 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="boot.html">
+<link rel="import" href="async.html">
+<link rel="import" href="debounce.html">
+
+<script>
+(function() {
+
+ 'use strict';
+
+ // detect native touch action support
+ let HAS_NATIVE_TA = typeof document.head.style.touchAction === 'string';
+ let GESTURE_KEY = '__polymerGestures';
+ let HANDLED_OBJ = '__polymerGesturesHandled';
+ let TOUCH_ACTION = '__polymerGesturesTouchAction';
+ // radius for tap and track
+ let TAP_DISTANCE = 25;
+ let TRACK_DISTANCE = 5;
+ // number of last N track positions to keep
+ let TRACK_LENGTH = 2;
+
+ // Disabling "mouse" handlers for 2500ms is enough
+ let MOUSE_TIMEOUT = 2500;
+ let MOUSE_EVENTS = ['mousedown', 'mousemove', 'mouseup', 'click'];
+ // an array of bitmask values for mapping MouseEvent.which to MouseEvent.buttons
+ let MOUSE_WHICH_TO_BUTTONS = [0, 1, 4, 2];
+ let MOUSE_HAS_BUTTONS = (function() {
+ try {
+ return new MouseEvent('test', {buttons: 1}).buttons === 1;
+ } catch (e) {
+ return false;
+ }
+ })();
+
+ /**
+ * @param {string} name Possible mouse event name
+ * @return {boolean} true if mouse event, false if not
+ */
+ function isMouseEvent(name) {
+ return MOUSE_EVENTS.indexOf(name) > -1;
+ }
+
+ /* eslint no-empty: ["error", { "allowEmptyCatch": true }] */
+ // check for passive event listeners
+ let SUPPORTS_PASSIVE = false;
+ (function() {
+ try {
+ let opts = Object.defineProperty({}, 'passive', {get() {SUPPORTS_PASSIVE = true;}});
+ window.addEventListener('test', null, opts);
+ window.removeEventListener('test', null, opts);
+ } catch(e) {}
+ })();
+
+ /**
+ * Generate settings for event listeners, dependant on `Polymer.passiveTouchGestures`
+ *
+ * @param {string} eventName Event name to determine if `{passive}` option is needed
+ * @return {{passive: boolean} | undefined} Options to use for addEventListener and removeEventListener
+ */
+ function PASSIVE_TOUCH(eventName) {
+ if (isMouseEvent(eventName) || eventName === 'touchend') {
+ return;
+ }
+ if (HAS_NATIVE_TA && SUPPORTS_PASSIVE && Polymer.passiveTouchGestures) {
+ return {passive: true};
+ } else {
+ return;
+ }
+ }
+
+ // Check for touch-only devices
+ let IS_TOUCH_ONLY = navigator.userAgent.match(/iP(?:[oa]d|hone)|Android/);
+
+ let GestureRecognizer = function(){}; // eslint-disable-line no-unused-vars
+ /** @type {function(): void} */
+ GestureRecognizer.prototype.reset;
+ /** @type {function(MouseEvent): void | undefined} */
+ GestureRecognizer.prototype.mousedown;
+ /** @type {(function(MouseEvent): void | undefined)} */
+ GestureRecognizer.prototype.mousemove;
+ /** @type {(function(MouseEvent): void | undefined)} */
+ GestureRecognizer.prototype.mouseup;
+ /** @type {(function(TouchEvent): void | undefined)} */
+ GestureRecognizer.prototype.touchstart;
+ /** @type {(function(TouchEvent): void | undefined)} */
+ GestureRecognizer.prototype.touchmove;
+ /** @type {(function(TouchEvent): void | undefined)} */
+ GestureRecognizer.prototype.touchend;
+ /** @type {(function(MouseEvent): void | undefined)} */
+ GestureRecognizer.prototype.click;
+
+ // keep track of any labels hit by the mouseCanceller
+ /** @type {!Array<!HTMLLabelElement>} */
+ const clickedLabels = [];
+
+ /** @type {!Object<boolean>} */
+ const labellable = {
+ 'button': true,
+ 'input': true,
+ 'keygen': true,
+ 'meter': true,
+ 'output': true,
+ 'textarea': true,
+ 'progress': true,
+ 'select': true
+ };
+
+ /**
+ * @param {HTMLElement} el Element to check labelling status
+ * @return {boolean} element can have labels
+ */
+ function canBeLabelled(el) {
+ return labellable[el.localName] || false;
+ }
+
+ /**
+ * @param {HTMLElement} el Element that may be labelled.
+ * @return {!Array<!HTMLLabelElement>} Relevant label for `el`
+ */
+ function matchingLabels(el) {
+ let labels = [...(/** @type {HTMLInputElement} */(el).labels || [])];
+ // IE doesn't have `labels` and Safari doesn't populate `labels`
+ // if element is in a shadowroot.
+ // In this instance, finding the non-ancestor labels is enough,
+ // as the mouseCancellor code will handle ancstor labels
+ if (!labels.length) {
+ labels = [];
+ let root = el.getRootNode();
+ // if there is an id on `el`, check for all labels with a matching `for` attribute
+ if (el.id) {
+ let matching = root.querySelectorAll(`label[for = ${el.id}]`);
+ for (let i = 0; i < matching.length; i++) {
+ labels.push(/** @type {!HTMLLabelElement} */(matching[i]));
+ }
+ }
+ }
+ return labels;
+ }
+
+ // touch will make synthetic mouse events
+ // `preventDefault` on touchend will cancel them,
+ // but this breaks `<input>` focus and link clicks
+ // disable mouse handlers for MOUSE_TIMEOUT ms after
+ // a touchend to ignore synthetic mouse events
+ let mouseCanceller = function(mouseEvent) {
+ // Check for sourceCapabilities, used to distinguish synthetic events
+ // if mouseEvent did not come from a device that fires touch events,
+ // it was made by a real mouse and should be counted
+ // http://wicg.github.io/InputDeviceCapabilities/#dom-inputdevicecapabilities-firestouchevents
+ let sc = mouseEvent.sourceCapabilities;
+ if (sc && !sc.firesTouchEvents) {
+ return;
+ }
+ // skip synthetic mouse events
+ mouseEvent[HANDLED_OBJ] = {skip: true};
+ // disable "ghost clicks"
+ if (mouseEvent.type === 'click') {
+ let clickFromLabel = false;
+ let path = mouseEvent.composedPath && mouseEvent.composedPath();
+ if (path) {
+ for (let i = 0; i < path.length; i++) {
+ if (path[i].nodeType === Node.ELEMENT_NODE) {
+ if (path[i].localName === 'label') {
+ clickedLabels.push(path[i]);
+ } else if (canBeLabelled(path[i])) {
+ let ownerLabels = matchingLabels(path[i]);
+ // check if one of the clicked labels is labelling this element
+ for (let j = 0; j < ownerLabels.length; j++) {
+ clickFromLabel = clickFromLabel || clickedLabels.indexOf(ownerLabels[j]) > -1;
+ }
+ }
+ }
+ if (path[i] === POINTERSTATE.mouse.target) {
+ return;
+ }
+ }
+ }
+ // if one of the clicked labels was labelling the target element,
+ // this is not a ghost click
+ if (clickFromLabel) {
+ return;
+ }
+ mouseEvent.preventDefault();
+ mouseEvent.stopPropagation();
+ }
+ };
+
+ /**
+ * @param {boolean=} setup True to add, false to remove.
+ * @return {void}
+ */
+ function setupTeardownMouseCanceller(setup) {
+ let events = IS_TOUCH_ONLY ? ['click'] : MOUSE_EVENTS;
+ for (let i = 0, en; i < events.length; i++) {
+ en = events[i];
+ if (setup) {
+ // reset clickLabels array
+ clickedLabels.length = 0;
+ document.addEventListener(en, mouseCanceller, true);
+ } else {
+ document.removeEventListener(en, mouseCanceller, true);
+ }
+ }
+ }
+
+ function ignoreMouse(e) {
+ if (!POINTERSTATE.mouse.mouseIgnoreJob) {
+ setupTeardownMouseCanceller(true);
+ }
+ let unset = function() {
+ setupTeardownMouseCanceller();
+ POINTERSTATE.mouse.target = null;
+ POINTERSTATE.mouse.mouseIgnoreJob = null;
+ };
+ POINTERSTATE.mouse.target = e.composedPath()[0];
+ POINTERSTATE.mouse.mouseIgnoreJob = Polymer.Debouncer.debounce(
+ POINTERSTATE.mouse.mouseIgnoreJob
+ , Polymer.Async.timeOut.after(MOUSE_TIMEOUT)
+ , unset);
+ }
+
+ /**
+ * @param {MouseEvent} ev event to test for left mouse button down
+ * @return {boolean} has left mouse button down
+ */
+ function hasLeftMouseButton(ev) {
+ let type = ev.type;
+ // exit early if the event is not a mouse event
+ if (!isMouseEvent(type)) {
+ return false;
+ }
+ // ev.button is not reliable for mousemove (0 is overloaded as both left button and no buttons)
+ // instead we use ev.buttons (bitmask of buttons) or fall back to ev.which (deprecated, 0 for no buttons, 1 for left button)
+ if (type === 'mousemove') {
+ // allow undefined for testing events
+ let buttons = ev.buttons === undefined ? 1 : ev.buttons;
+ if ((ev instanceof window.MouseEvent) && !MOUSE_HAS_BUTTONS) {
+ buttons = MOUSE_WHICH_TO_BUTTONS[ev.which] || 0;
+ }
+ // buttons is a bitmask, check that the left button bit is set (1)
+ return Boolean(buttons & 1);
+ } else {
+ // allow undefined for testing events
+ let button = ev.button === undefined ? 0 : ev.button;
+ // ev.button is 0 in mousedown/mouseup/click for left button activation
+ return button === 0;
+ }
+ }
+
+ function isSyntheticClick(ev) {
+ if (ev.type === 'click') {
+ // ev.detail is 0 for HTMLElement.click in most browsers
+ if (ev.detail === 0) {
+ return true;
+ }
+ // in the worst case, check that the x/y position of the click is within
+ // the bounding box of the target of the event
+ // Thanks IE 10 >:(
+ let t = Gestures._findOriginalTarget(ev);
+ // make sure the target of the event is an element so we can use getBoundingClientRect,
+ // if not, just assume it is a synthetic click
+ if (!t.nodeType || /** @type {Element} */(t).nodeType !== Node.ELEMENT_NODE) {
+ return true;
+ }
+ let bcr = /** @type {Element} */(t).getBoundingClientRect();
+ // use page x/y to account for scrolling
+ let x = ev.pageX, y = ev.pageY;
+ // ev is a synthetic click if the position is outside the bounding box of the target
+ return !((x >= bcr.left && x <= bcr.right) && (y >= bcr.top && y <= bcr.bottom));
+ }
+ return false;
+ }
+
+ let POINTERSTATE = {
+ mouse: {
+ target: null,
+ mouseIgnoreJob: null
+ },
+ touch: {
+ x: 0,
+ y: 0,
+ id: -1,
+ scrollDecided: false
+ }
+ };
+
+ function firstTouchAction(ev) {
+ let ta = 'auto';
+ let path = ev.composedPath && ev.composedPath();
+ if (path) {
+ for (let i = 0, n; i < path.length; i++) {
+ n = path[i];
+ if (n[TOUCH_ACTION]) {
+ ta = n[TOUCH_ACTION];
+ break;
+ }
+ }
+ }
+ return ta;
+ }
+
+ function trackDocument(stateObj, movefn, upfn) {
+ stateObj.movefn = movefn;
+ stateObj.upfn = upfn;
+ document.addEventListener('mousemove', movefn);
+ document.addEventListener('mouseup', upfn);
+ }
+
+ function untrackDocument(stateObj) {
+ document.removeEventListener('mousemove', stateObj.movefn);
+ document.removeEventListener('mouseup', stateObj.upfn);
+ stateObj.movefn = null;
+ stateObj.upfn = null;
+ }
+
+ // use a document-wide touchend listener to start the ghost-click prevention mechanism
+ // Use passive event listeners, if supported, to not affect scrolling performance
+ document.addEventListener('touchend', ignoreMouse, SUPPORTS_PASSIVE ? {passive: true} : false);
+
+ /**
+ * Module for adding listeners to a node for the following normalized
+ * cross-platform "gesture" events:
+ * - `down` - mouse or touch went down
+ * - `up` - mouse or touch went up
+ * - `tap` - mouse click or finger tap
+ * - `track` - mouse drag or touch move
+ *
+ * @namespace
+ * @memberof Polymer
+ * @summary Module for adding cross-platform gesture event listeners.
+ */
+ const Gestures = {
+ gestures: {},
+ recognizers: [],
+
+ /**
+ * Finds the element rendered on the screen at the provided coordinates.
+ *
+ * Similar to `document.elementFromPoint`, but pierces through
+ * shadow roots.
+ *
+ * @memberof Polymer.Gestures
+ * @param {number} x Horizontal pixel coordinate
+ * @param {number} y Vertical pixel coordinate
+ * @return {Element} Returns the deepest shadowRoot inclusive element
+ * found at the screen position given.
+ */
+ deepTargetFind: function(x, y) {
+ let node = document.elementFromPoint(x, y);
+ let next = node;
+ // this code path is only taken when native ShadowDOM is used
+ // if there is a shadowroot, it may have a node at x/y
+ // if there is not a shadowroot, exit the loop
+ while (next && next.shadowRoot && !window.ShadyDOM) {
+ // if there is a node at x/y in the shadowroot, look deeper
+ let oldNext = next;
+ next = next.shadowRoot.elementFromPoint(x, y);
+ // on Safari, elementFromPoint may return the shadowRoot host
+ if (oldNext === next) {
+ break;
+ }
+ if (next) {
+ node = next;
+ }
+ }
+ return node;
+ },
+ /**
+ * a cheaper check than ev.composedPath()[0];
+ *
+ * @private
+ * @param {Event} ev Event.
+ * @return {EventTarget} Returns the event target.
+ */
+ _findOriginalTarget: function(ev) {
+ // shadowdom
+ if (ev.composedPath) {
+ const targets = /** @type {!Array<!EventTarget>} */(ev.composedPath());
+ // It shouldn't be, but sometimes targets is empty (window on Safari).
+ return targets.length > 0 ? targets[0] : ev.target;
+ }
+ // shadydom
+ return ev.target;
+ },
+
+ /**
+ * @private
+ * @param {Event} ev Event.
+ * @return {void}
+ */
+ _handleNative: function(ev) {
+ let handled;
+ let type = ev.type;
+ let node = ev.currentTarget;
+ let gobj = node[GESTURE_KEY];
+ if (!gobj) {
+ return;
+ }
+ let gs = gobj[type];
+ if (!gs) {
+ return;
+ }
+ if (!ev[HANDLED_OBJ]) {
+ ev[HANDLED_OBJ] = {};
+ if (type.slice(0, 5) === 'touch') {
+ ev = /** @type {TouchEvent} */(ev); // eslint-disable-line no-self-assign
+ let t = ev.changedTouches[0];
+ if (type === 'touchstart') {
+ // only handle the first finger
+ if (ev.touches.length === 1) {
+ POINTERSTATE.touch.id = t.identifier;
+ }
+ }
+ if (POINTERSTATE.touch.id !== t.identifier) {
+ return;
+ }
+ if (!HAS_NATIVE_TA) {
+ if (type === 'touchstart' || type === 'touchmove') {
+ Gestures._handleTouchAction(ev);
+ }
+ }
+ }
+ }
+ handled = ev[HANDLED_OBJ];
+ // used to ignore synthetic mouse events
+ if (handled.skip) {
+ return;
+ }
+ // reset recognizer state
+ for (let i = 0, r; i < Gestures.recognizers.length; i++) {
+ r = Gestures.recognizers[i];
+ if (gs[r.name] && !handled[r.name]) {
+ if (r.flow && r.flow.start.indexOf(ev.type) > -1 && r.reset) {
+ r.reset();
+ }
+ }
+ }
+ // enforce gesture recognizer order
+ for (let i = 0, r; i < Gestures.recognizers.length; i++) {
+ r = Gestures.recognizers[i];
+ if (gs[r.name] && !handled[r.name]) {
+ handled[r.name] = true;
+ r[type](ev);
+ }
+ }
+ },
+
+ /**
+ * @private
+ * @param {TouchEvent} ev Event.
+ * @return {void}
+ */
+ _handleTouchAction: function(ev) {
+ let t = ev.changedTouches[0];
+ let type = ev.type;
+ if (type === 'touchstart') {
+ POINTERSTATE.touch.x = t.clientX;
+ POINTERSTATE.touch.y = t.clientY;
+ POINTERSTATE.touch.scrollDecided = false;
+ } else if (type === 'touchmove') {
+ if (POINTERSTATE.touch.scrollDecided) {
+ return;
+ }
+ POINTERSTATE.touch.scrollDecided = true;
+ let ta = firstTouchAction(ev);
+ let prevent = false;
+ let dx = Math.abs(POINTERSTATE.touch.x - t.clientX);
+ let dy = Math.abs(POINTERSTATE.touch.y - t.clientY);
+ if (!ev.cancelable) {
+ // scrolling is happening
+ } else if (ta === 'none') {
+ prevent = true;
+ } else if (ta === 'pan-x') {
+ prevent = dy > dx;
+ } else if (ta === 'pan-y') {
+ prevent = dx > dy;
+ }
+ if (prevent) {
+ ev.preventDefault();
+ } else {
+ Gestures.prevent('track');
+ }
+ }
+ },
+
+ /**
+ * Adds an event listener to a node for the given gesture type.
+ *
+ * @memberof Polymer.Gestures
+ * @param {!Node} node Node to add listener on
+ * @param {string} evType Gesture type: `down`, `up`, `track`, or `tap`
+ * @param {!function(!Event):void} handler Event listener function to call
+ * @return {boolean} Returns true if a gesture event listener was added.
+ * @this {Gestures}
+ */
+ addListener: function(node, evType, handler) {
+ if (this.gestures[evType]) {
+ this._add(node, evType, handler);
+ return true;
+ }
+ return false;
+ },
+
+ /**
+ * Removes an event listener from a node for the given gesture type.
+ *
+ * @memberof Polymer.Gestures
+ * @param {!Node} node Node to remove listener from
+ * @param {string} evType Gesture type: `down`, `up`, `track`, or `tap`
+ * @param {!function(!Event):void} handler Event listener function previously passed to
+ * `addListener`.
+ * @return {boolean} Returns true if a gesture event listener was removed.
+ * @this {Gestures}
+ */
+ removeListener: function(node, evType, handler) {
+ if (this.gestures[evType]) {
+ this._remove(node, evType, handler);
+ return true;
+ }
+ return false;
+ },
+
+ /**
+ * automate the event listeners for the native events
+ *
+ * @private
+ * @param {!HTMLElement} node Node on which to add the event.
+ * @param {string} evType Event type to add.
+ * @param {function(!Event)} handler Event handler function.
+ * @return {void}
+ * @this {Gestures}
+ */
+ _add: function(node, evType, handler) {
+ let recognizer = this.gestures[evType];
+ let deps = recognizer.deps;
+ let name = recognizer.name;
+ let gobj = node[GESTURE_KEY];
+ if (!gobj) {
+ node[GESTURE_KEY] = gobj = {};
+ }
+ for (let i = 0, dep, gd; i < deps.length; i++) {
+ dep = deps[i];
+ // don't add mouse handlers on iOS because they cause gray selection overlays
+ if (IS_TOUCH_ONLY && isMouseEvent(dep) && dep !== 'click') {
+ continue;
+ }
+ gd = gobj[dep];
+ if (!gd) {
+ gobj[dep] = gd = {_count: 0};
+ }
+ if (gd._count === 0) {
+ node.addEventListener(dep, this._handleNative, PASSIVE_TOUCH(dep));
+ }
+ gd[name] = (gd[name] || 0) + 1;
+ gd._count = (gd._count || 0) + 1;
+ }
+ node.addEventListener(evType, handler);
+ if (recognizer.touchAction) {
+ this.setTouchAction(node, recognizer.touchAction);
+ }
+ },
+
+ /**
+ * automate event listener removal for native events
+ *
+ * @private
+ * @param {!HTMLElement} node Node on which to remove the event.
+ * @param {string} evType Event type to remove.
+ * @param {function(Event?)} handler Event handler function.
+ * @return {void}
+ * @this {Gestures}
+ */
+ _remove: function(node, evType, handler) {
+ let recognizer = this.gestures[evType];
+ let deps = recognizer.deps;
+ let name = recognizer.name;
+ let gobj = node[GESTURE_KEY];
+ if (gobj) {
+ for (let i = 0, dep, gd; i < deps.length; i++) {
+ dep = deps[i];
+ gd = gobj[dep];
+ if (gd && gd[name]) {
+ gd[name] = (gd[name] || 1) - 1;
+ gd._count = (gd._count || 1) - 1;
+ if (gd._count === 0) {
+ node.removeEventListener(dep, this._handleNative, PASSIVE_TOUCH(dep));
+ }
+ }
+ }
+ }
+ node.removeEventListener(evType, handler);
+ },
+
+ /**
+ * Registers a new gesture event recognizer for adding new custom
+ * gesture event types.
+ *
+ * @memberof Polymer.Gestures
+ * @param {!GestureRecognizer} recog Gesture recognizer descriptor
+ * @return {void}
+ * @this {Gestures}
+ */
+ register: function(recog) {
+ this.recognizers.push(recog);
+ for (let i = 0; i < recog.emits.length; i++) {
+ this.gestures[recog.emits[i]] = recog;
+ }
+ },
+
+ /**
+ * @private
+ * @param {string} evName Event name.
+ * @return {Object} Returns the gesture for the given event name.
+ * @this {Gestures}
+ */
+ _findRecognizerByEvent: function(evName) {
+ for (let i = 0, r; i < this.recognizers.length; i++) {
+ r = this.recognizers[i];
+ for (let j = 0, n; j < r.emits.length; j++) {
+ n = r.emits[j];
+ if (n === evName) {
+ return r;
+ }
+ }
+ }
+ return null;
+ },
+
+ /**
+ * Sets scrolling direction on node.
+ *
+ * This value is checked on first move, thus it should be called prior to
+ * adding event listeners.
+ *
+ * @memberof Polymer.Gestures
+ * @param {!Element} node Node to set touch action setting on
+ * @param {string} value Touch action value
+ * @return {void}
+ */
+ setTouchAction: function(node, value) {
+ if (HAS_NATIVE_TA) {
+ // NOTE: add touchAction async so that events can be added in
+ // custom element constructors. Otherwise we run afoul of custom
+ // elements restriction against settings attributes (style) in the
+ // constructor.
+ Polymer.Async.microTask.run(() => {
+ node.style.touchAction = value;
+ });
+ }
+ node[TOUCH_ACTION] = value;
+ },
+
+ /**
+ * Dispatches an event on the `target` element of `type` with the given
+ * `detail`.
+ * @private
+ * @param {!EventTarget} target The element on which to fire an event.
+ * @param {string} type The type of event to fire.
+ * @param {!Object=} detail The detail object to populate on the event.
+ * @return {void}
+ */
+ _fire: function(target, type, detail) {
+ let ev = new Event(type, { bubbles: true, cancelable: true, composed: true });
+ ev.detail = detail;
+ target.dispatchEvent(ev);
+ // forward `preventDefault` in a clean way
+ if (ev.defaultPrevented) {
+ let preventer = detail.preventer || detail.sourceEvent;
+ if (preventer && preventer.preventDefault) {
+ preventer.preventDefault();
+ }
+ }
+ },
+
+ /**
+ * Prevents the dispatch and default action of the given event name.
+ *
+ * @memberof Polymer.Gestures
+ * @param {string} evName Event name.
+ * @return {void}
+ * @this {Gestures}
+ */
+ prevent: function(evName) {
+ let recognizer = this._findRecognizerByEvent(evName);
+ if (recognizer.info) {
+ recognizer.info.prevent = true;
+ }
+ },
+
+ /**
+ * Reset the 2500ms timeout on processing mouse input after detecting touch input.
+ *
+ * Touch inputs create synthesized mouse inputs anywhere from 0 to 2000ms after the touch.
+ * This method should only be called during testing with simulated touch inputs.
+ * Calling this method in production may cause duplicate taps or other Gestures.
+ *
+ * @memberof Polymer.Gestures
+ * @return {void}
+ */
+ resetMouseCanceller: function() {
+ if (POINTERSTATE.mouse.mouseIgnoreJob) {
+ POINTERSTATE.mouse.mouseIgnoreJob.flush();
+ }
+ }
+ };
+
+ /* eslint-disable valid-jsdoc */
+
+ Gestures.register({
+ name: 'downup',
+ deps: ['mousedown', 'touchstart', 'touchend'],
+ flow: {
+ start: ['mousedown', 'touchstart'],
+ end: ['mouseup', 'touchend']
+ },
+ emits: ['down', 'up'],
+
+ info: {
+ movefn: null,
+ upfn: null
+ },
+
+ /**
+ * @this {GestureRecognizer}
+ * @return {void}
+ */
+ reset: function() {
+ untrackDocument(this.info);
+ },
+
+ /**
+ * @this {GestureRecognizer}
+ * @param {MouseEvent} e
+ * @return {void}
+ */
+ mousedown: function(e) {
+ if (!hasLeftMouseButton(e)) {
+ return;
+ }
+ let t = Gestures._findOriginalTarget(e);
+ let self = this;
+ let movefn = function movefn(e) {
+ if (!hasLeftMouseButton(e)) {
+ self._fire('up', t, e);
+ untrackDocument(self.info);
+ }
+ };
+ let upfn = function upfn(e) {
+ if (hasLeftMouseButton(e)) {
+ self._fire('up', t, e);
+ }
+ untrackDocument(self.info);
+ };
+ trackDocument(this.info, movefn, upfn);
+ this._fire('down', t, e);
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchstart: function(e) {
+ this._fire('down', Gestures._findOriginalTarget(e), e.changedTouches[0], e);
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchend: function(e) {
+ this._fire('up', Gestures._findOriginalTarget(e), e.changedTouches[0], e);
+ },
+ /**
+ * @param {string} type
+ * @param {!EventTarget} target
+ * @param {Event} event
+ * @param {Function} preventer
+ * @return {void}
+ */
+ _fire: function(type, target, event, preventer) {
+ Gestures._fire(target, type, {
+ x: event.clientX,
+ y: event.clientY,
+ sourceEvent: event,
+ preventer: preventer,
+ prevent: function(e) {
+ return Gestures.prevent(e);
+ }
+ });
+ }
+ });
+
+ Gestures.register({
+ name: 'track',
+ touchAction: 'none',
+ deps: ['mousedown', 'touchstart', 'touchmove', 'touchend'],
+ flow: {
+ start: ['mousedown', 'touchstart'],
+ end: ['mouseup', 'touchend']
+ },
+ emits: ['track'],
+
+ info: {
+ x: 0,
+ y: 0,
+ state: 'start',
+ started: false,
+ moves: [],
+ /** @this {GestureRecognizer} */
+ addMove: function(move) {
+ if (this.moves.length > TRACK_LENGTH) {
+ this.moves.shift();
+ }
+ this.moves.push(move);
+ },
+ movefn: null,
+ upfn: null,
+ prevent: false
+ },
+
+ /**
+ * @this {GestureRecognizer}
+ * @return {void}
+ */
+ reset: function() {
+ this.info.state = 'start';
+ this.info.started = false;
+ this.info.moves = [];
+ this.info.x = 0;
+ this.info.y = 0;
+ this.info.prevent = false;
+ untrackDocument(this.info);
+ },
+
+ /**
+ * @this {GestureRecognizer}
+ * @param {number} x
+ * @param {number} y
+ * @return {boolean}
+ */
+ hasMovedEnough: function(x, y) {
+ if (this.info.prevent) {
+ return false;
+ }
+ if (this.info.started) {
+ return true;
+ }
+ let dx = Math.abs(this.info.x - x);
+ let dy = Math.abs(this.info.y - y);
+ return (dx >= TRACK_DISTANCE || dy >= TRACK_DISTANCE);
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {MouseEvent} e
+ * @return {void}
+ */
+ mousedown: function(e) {
+ if (!hasLeftMouseButton(e)) {
+ return;
+ }
+ let t = Gestures._findOriginalTarget(e);
+ let self = this;
+ let movefn = function movefn(e) {
+ let x = e.clientX, y = e.clientY;
+ if (self.hasMovedEnough(x, y)) {
+ // first move is 'start', subsequent moves are 'move', mouseup is 'end'
+ self.info.state = self.info.started ? (e.type === 'mouseup' ? 'end' : 'track') : 'start';
+ if (self.info.state === 'start') {
+ // if and only if tracking, always prevent tap
+ Gestures.prevent('tap');
+ }
+ self.info.addMove({x: x, y: y});
+ if (!hasLeftMouseButton(e)) {
+ // always _fire "end"
+ self.info.state = 'end';
+ untrackDocument(self.info);
+ }
+ self._fire(t, e);
+ self.info.started = true;
+ }
+ };
+ let upfn = function upfn(e) {
+ if (self.info.started) {
+ movefn(e);
+ }
+
+ // remove the temporary listeners
+ untrackDocument(self.info);
+ };
+ // add temporary document listeners as mouse retargets
+ trackDocument(this.info, movefn, upfn);
+ this.info.x = e.clientX;
+ this.info.y = e.clientY;
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchstart: function(e) {
+ let ct = e.changedTouches[0];
+ this.info.x = ct.clientX;
+ this.info.y = ct.clientY;
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchmove: function(e) {
+ let t = Gestures._findOriginalTarget(e);
+ let ct = e.changedTouches[0];
+ let x = ct.clientX, y = ct.clientY;
+ if (this.hasMovedEnough(x, y)) {
+ if (this.info.state === 'start') {
+ // if and only if tracking, always prevent tap
+ Gestures.prevent('tap');
+ }
+ this.info.addMove({x: x, y: y});
+ this._fire(t, ct);
+ this.info.state = 'track';
+ this.info.started = true;
+ }
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchend: function(e) {
+ let t = Gestures._findOriginalTarget(e);
+ let ct = e.changedTouches[0];
+ // only trackend if track was started and not aborted
+ if (this.info.started) {
+ // reset started state on up
+ this.info.state = 'end';
+ this.info.addMove({x: ct.clientX, y: ct.clientY});
+ this._fire(t, ct, e);
+ }
+ },
+
+ /**
+ * @this {GestureRecognizer}
+ * @param {!EventTarget} target
+ * @param {Touch} touch
+ * @return {void}
+ */
+ _fire: function(target, touch) {
+ let secondlast = this.info.moves[this.info.moves.length - 2];
+ let lastmove = this.info.moves[this.info.moves.length - 1];
+ let dx = lastmove.x - this.info.x;
+ let dy = lastmove.y - this.info.y;
+ let ddx, ddy = 0;
+ if (secondlast) {
+ ddx = lastmove.x - secondlast.x;
+ ddy = lastmove.y - secondlast.y;
+ }
+ Gestures._fire(target, 'track', {
+ state: this.info.state,
+ x: touch.clientX,
+ y: touch.clientY,
+ dx: dx,
+ dy: dy,
+ ddx: ddx,
+ ddy: ddy,
+ sourceEvent: touch,
+ hover: function() {
+ return Gestures.deepTargetFind(touch.clientX, touch.clientY);
+ }
+ });
+ }
+
+ });
+
+ Gestures.register({
+ name: 'tap',
+ deps: ['mousedown', 'click', 'touchstart', 'touchend'],
+ flow: {
+ start: ['mousedown', 'touchstart'],
+ end: ['click', 'touchend']
+ },
+ emits: ['tap'],
+ info: {
+ x: NaN,
+ y: NaN,
+ prevent: false
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @return {void}
+ */
+ reset: function() {
+ this.info.x = NaN;
+ this.info.y = NaN;
+ this.info.prevent = false;
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {MouseEvent} e
+ * @return {void}
+ */
+ save: function(e) {
+ this.info.x = e.clientX;
+ this.info.y = e.clientY;
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {MouseEvent} e
+ * @return {void}
+ */
+ mousedown: function(e) {
+ if (hasLeftMouseButton(e)) {
+ this.save(e);
+ }
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {MouseEvent} e
+ * @return {void}
+ */
+ click: function(e) {
+ if (hasLeftMouseButton(e)) {
+ this.forward(e);
+ }
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchstart: function(e) {
+ this.save(e.changedTouches[0], e);
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchend: function(e) {
+ this.forward(e.changedTouches[0], e);
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {Event | Touch} e
+ * @param {Event=} preventer
+ * @return {void}
+ */
+ forward: function(e, preventer) {
+ let dx = Math.abs(e.clientX - this.info.x);
+ let dy = Math.abs(e.clientY - this.info.y);
+ // find original target from `preventer` for TouchEvents, or `e` for MouseEvents
+ let t = Gestures._findOriginalTarget(/** @type {Event} */(preventer || e));
+ if (!t || t.disabled) {
+ return;
+ }
+ // dx,dy can be NaN if `click` has been simulated and there was no `down` for `start`
+ if (isNaN(dx) || isNaN(dy) || (dx <= TAP_DISTANCE && dy <= TAP_DISTANCE) || isSyntheticClick(e)) {
+ // prevent taps from being generated if an event has canceled them
+ if (!this.info.prevent) {
+ Gestures._fire(t, 'tap', {
+ x: e.clientX,
+ y: e.clientY,
+ sourceEvent: e,
+ preventer: preventer
+ });
+ }
+ }
+ }
+ });
+
+ /* eslint-enable valid-jsdoc */
+
+ /** @deprecated */
+ Gestures.findOriginalTarget = Gestures._findOriginalTarget;
+
+ /** @deprecated */
+ Gestures.add = Gestures.addListener;
+
+ /** @deprecated */
+ Gestures.remove = Gestures.removeListener;
+
+ Polymer.Gestures = Gestures;
+
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/html-tag.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/html-tag.html
new file mode 100644
index 00000000000..79028525b02
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/html-tag.html
@@ -0,0 +1,129 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="boot.html">
+<script>
+ (function() {
+ 'use strict';
+
+ /**
+ * Class representing a static string value which can be used to filter
+ * strings by asseting that they have been created via this class. The
+ * `value` property returns the string passed to the constructor.
+ */
+ class LiteralString {
+ constructor(string) {
+ /** @type {string} */
+ this.value = string.toString();
+ }
+ /**
+ * @return {string} LiteralString string value
+ */
+ toString() {
+ return this.value;
+ }
+ }
+
+ /**
+ * @param {*} value Object to stringify into HTML
+ * @return {string} HTML stringified form of `obj`
+ */
+ function literalValue(value) {
+ if (value instanceof LiteralString) {
+ return /** @type {!LiteralString} */(value).value;
+ } else {
+ throw new Error(`non-literal value passed to Polymer.htmlLiteral: ${value}`);
+ }
+ }
+
+ /**
+ * @param {*} value Object to stringify into HTML
+ * @return {string} HTML stringified form of `obj`
+ */
+ function htmlValue(value) {
+ if (value instanceof HTMLTemplateElement) {
+ return /** @type {!HTMLTemplateElement } */(value).innerHTML;
+ } else if (value instanceof LiteralString) {
+ return literalValue(value);
+ } else {
+ throw new Error(`non-template value passed to Polymer.html: ${value}`);
+ }
+ }
+
+ /**
+ * A template literal tag that creates an HTML <template> element from the
+ * contents of the string.
+ *
+ * This allows you to write a Polymer Template in JavaScript.
+ *
+ * Templates can be composed by interpolating `HTMLTemplateElement`s in
+ * expressions in the JavaScript template literal. The nested template's
+ * `innerHTML` is included in the containing template. The only other
+ * values allowed in expressions are those returned from `Polymer.htmlLiteral`
+ * which ensures only literal values from JS source ever reach the HTML, to
+ * guard against XSS risks.
+ *
+ * All other values are disallowed in expressions to help prevent XSS
+ * attacks; however, `Polymer.htmlLiteral` can be used to compose static
+ * string values into templates. This is useful to compose strings into
+ * places that do not accept html, like the css text of a `style`
+ * element.
+ *
+ * Example:
+ *
+ * static get template() {
+ * return Polymer.html`
+ * <style>:host{ content:"..." }</style>
+ * <div class="shadowed">${this.partialTemplate}</div>
+ * ${super.template}
+ * `;
+ * }
+ * static get partialTemplate() { return Polymer.html`<span>Partial!</span>`; }
+ *
+ * @memberof Polymer
+ * @param {!ITemplateArray} strings Constant parts of tagged template literal
+ * @param {...*} values Variable parts of tagged template literal
+ * @return {!HTMLTemplateElement} Constructed HTMLTemplateElement
+ */
+ Polymer.html = function html(strings, ...values) {
+ const template = /** @type {!HTMLTemplateElement} */(document.createElement('template'));
+ template.innerHTML = values.reduce((acc, v, idx) =>
+ acc + htmlValue(v) + strings[idx + 1], strings[0]);
+ return template;
+ };
+
+ /**
+ * An html literal tag that can be used with `Polymer.html` to compose.
+ * a literal string.
+ *
+ * Example:
+ *
+ * static get template() {
+ * return Polymer.html`
+ * <style>
+ * :host { display: block; }
+ * ${styleTemplate}
+ * </style>
+ * <div class="shadowed">${staticValue}</div>
+ * ${super.template}
+ * `;
+ * }
+ * static get styleTemplate() { return Polymer.htmlLiteral`.shadowed { background: gray; }`; }
+ *
+ * @memberof Polymer
+ * @param {!ITemplateArray} strings Constant parts of tagged template literal
+ * @param {...*} values Variable parts of tagged template literal
+ * @return {!LiteralString} Constructed literal string
+ */
+ Polymer.htmlLiteral = function(strings, ...values) {
+ return new LiteralString(values.reduce((acc, v, idx) =>
+ acc + literalValue(v) + strings[idx + 1], strings[0]));
+ };
+ })();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/import-href.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/import-href.html
new file mode 100644
index 00000000000..80d354bc774
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/import-href.html
@@ -0,0 +1,107 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="boot.html">
+
+<script>
+
+(function() {
+
+ 'use strict';
+
+ // run a callback when HTMLImports are ready or immediately if
+ // this api is not available.
+ function whenImportsReady(cb) {
+ if (window.HTMLImports) {
+ HTMLImports.whenReady(cb);
+ } else {
+ cb();
+ }
+ }
+
+ /**
+ * Convenience method for importing an HTML document imperatively.
+ *
+ * This method creates a new `<link rel="import">` element with
+ * the provided URL and appends it to the document to start loading.
+ * In the `onload` callback, the `import` property of the `link`
+ * element will contain the imported document contents.
+ *
+ * @memberof Polymer
+ * @param {string} href URL to document to load.
+ * @param {?function(!Event):void=} onload Callback to notify when an import successfully
+ * loaded.
+ * @param {?function(!ErrorEvent):void=} onerror Callback to notify when an import
+ * unsuccessfully loaded.
+ * @param {boolean=} optAsync True if the import should be loaded `async`.
+ * Defaults to `false`.
+ * @return {!HTMLLinkElement} The link element for the URL to be loaded.
+ */
+ Polymer.importHref = function(href, onload, onerror, optAsync) {
+ let link = /** @type {HTMLLinkElement} */
+ (document.head.querySelector('link[href="' + href + '"][import-href]'));
+ if (!link) {
+ link = /** @type {HTMLLinkElement} */ (document.createElement('link'));
+ link.rel = 'import';
+ link.href = href;
+ link.setAttribute('import-href', '');
+ }
+ // always ensure link has `async` attribute if user specified one,
+ // even if it was previously not async. This is considered less confusing.
+ if (optAsync) {
+ link.setAttribute('async', '');
+ }
+ // NOTE: the link may now be in 3 states: (1) pending insertion,
+ // (2) inflight, (3) already loaded. In each case, we need to add
+ // event listeners to process callbacks.
+ let cleanup = function() {
+ link.removeEventListener('load', loadListener);
+ link.removeEventListener('error', errorListener);
+ };
+ let loadListener = function(event) {
+ cleanup();
+ // In case of a successful load, cache the load event on the link so
+ // that it can be used to short-circuit this method in the future when
+ // it is called with the same href param.
+ link.__dynamicImportLoaded = true;
+ if (onload) {
+ whenImportsReady(() => {
+ onload(event);
+ });
+ }
+ };
+ let errorListener = function(event) {
+ cleanup();
+ // In case of an error, remove the link from the document so that it
+ // will be automatically created again the next time `importHref` is
+ // called.
+ if (link.parentNode) {
+ link.parentNode.removeChild(link);
+ }
+ if (onerror) {
+ whenImportsReady(() => {
+ onerror(event);
+ });
+ }
+ };
+ link.addEventListener('load', loadListener);
+ link.addEventListener('error', errorListener);
+ if (link.parentNode == null) {
+ document.head.appendChild(link);
+ // if the link already loaded, dispatch a fake load event
+ // so that listeners are called and get a proper event argument.
+ } else if (link.__dynamicImportLoaded) {
+ link.dispatchEvent(new Event('load'));
+ }
+ return link;
+ };
+
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/mixin.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/mixin.html
new file mode 100644
index 00000000000..e97b3e21237
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/mixin.html
@@ -0,0 +1,78 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="boot.html">
+
+<script>
+
+(function() {
+
+ 'use strict';
+
+ // unique global id for deduping mixins.
+ let dedupeId = 0;
+
+ /**
+ * @constructor
+ * @extends {Function}
+ */
+ function MixinFunction(){}
+ /** @type {(WeakMap | undefined)} */
+ MixinFunction.prototype.__mixinApplications;
+ /** @type {(Object | undefined)} */
+ MixinFunction.prototype.__mixinSet;
+
+ /* eslint-disable valid-jsdoc */
+ /**
+ * Wraps an ES6 class expression mixin such that the mixin is only applied
+ * if it has not already been applied its base argument. Also memoizes mixin
+ * applications.
+ *
+ * @memberof Polymer
+ * @template T
+ * @param {T} mixin ES6 class expression mixin to wrap
+ * @return {T}
+ * @suppress {invalidCasts}
+ */
+ Polymer.dedupingMixin = function(mixin) {
+ let mixinApplications = /** @type {!MixinFunction} */(mixin).__mixinApplications;
+ if (!mixinApplications) {
+ mixinApplications = new WeakMap();
+ /** @type {!MixinFunction} */(mixin).__mixinApplications = mixinApplications;
+ }
+ // maintain a unique id for each mixin
+ let mixinDedupeId = dedupeId++;
+ function dedupingMixin(base) {
+ let baseSet = /** @type {!MixinFunction} */(base).__mixinSet;
+ if (baseSet && baseSet[mixinDedupeId]) {
+ return base;
+ }
+ let map = mixinApplications;
+ let extended = map.get(base);
+ if (!extended) {
+ extended = /** @type {!Function} */(mixin)(base);
+ map.set(base, extended);
+ }
+ // copy inherited mixin set from the extended class, or the base class
+ // NOTE: we avoid use of Set here because some browser (IE11)
+ // cannot extend a base Set via the constructor.
+ let mixinSet = Object.create(/** @type {!MixinFunction} */(extended).__mixinSet || baseSet || null);
+ mixinSet[mixinDedupeId] = true;
+ /** @type {!MixinFunction} */(extended).__mixinSet = mixinSet;
+ return extended;
+ }
+
+ return /** @type {T} */ (dedupingMixin);
+ };
+ /* eslint-enable valid-jsdoc */
+
+})();
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/path.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/path.html
new file mode 100644
index 00000000000..924c9d0abb3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/path.html
@@ -0,0 +1,284 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="boot.html">
+
+<script>
+(function() {
+ 'use strict';
+
+ /**
+ * Module with utilities for manipulating structured data path strings.
+ *
+ * @namespace
+ * @memberof Polymer
+ * @summary Module with utilities for manipulating structured data path strings.
+ */
+ const Path = {
+
+ /**
+ * Returns true if the given string is a structured data path (has dots).
+ *
+ * Example:
+ *
+ * ```
+ * Polymer.Path.isPath('foo.bar.baz') // true
+ * Polymer.Path.isPath('foo') // false
+ * ```
+ *
+ * @memberof Polymer.Path
+ * @param {string} path Path string
+ * @return {boolean} True if the string contained one or more dots
+ */
+ isPath: function(path) {
+ return path.indexOf('.') >= 0;
+ },
+
+ /**
+ * Returns the root property name for the given path.
+ *
+ * Example:
+ *
+ * ```
+ * Polymer.Path.root('foo.bar.baz') // 'foo'
+ * Polymer.Path.root('foo') // 'foo'
+ * ```
+ *
+ * @memberof Polymer.Path
+ * @param {string} path Path string
+ * @return {string} Root property name
+ */
+ root: function(path) {
+ let dotIndex = path.indexOf('.');
+ if (dotIndex === -1) {
+ return path;
+ }
+ return path.slice(0, dotIndex);
+ },
+
+ /**
+ * Given `base` is `foo.bar`, `foo` is an ancestor, `foo.bar` is not
+ * Returns true if the given path is an ancestor of the base path.
+ *
+ * Example:
+ *
+ * ```
+ * Polymer.Path.isAncestor('foo.bar', 'foo') // true
+ * Polymer.Path.isAncestor('foo.bar', 'foo.bar') // false
+ * Polymer.Path.isAncestor('foo.bar', 'foo.bar.baz') // false
+ * ```
+ *
+ * @memberof Polymer.Path
+ * @param {string} base Path string to test against.
+ * @param {string} path Path string to test.
+ * @return {boolean} True if `path` is an ancestor of `base`.
+ */
+ isAncestor: function(base, path) {
+ // base.startsWith(path + '.');
+ return base.indexOf(path + '.') === 0;
+ },
+
+ /**
+ * Given `base` is `foo.bar`, `foo.bar.baz` is an descendant
+ *
+ * Example:
+ *
+ * ```
+ * Polymer.Path.isDescendant('foo.bar', 'foo.bar.baz') // true
+ * Polymer.Path.isDescendant('foo.bar', 'foo.bar') // false
+ * Polymer.Path.isDescendant('foo.bar', 'foo') // false
+ * ```
+ *
+ * @memberof Polymer.Path
+ * @param {string} base Path string to test against.
+ * @param {string} path Path string to test.
+ * @return {boolean} True if `path` is a descendant of `base`.
+ */
+ isDescendant: function(base, path) {
+ // path.startsWith(base + '.');
+ return path.indexOf(base + '.') === 0;
+ },
+
+ /**
+ * Replaces a previous base path with a new base path, preserving the
+ * remainder of the path.
+ *
+ * User must ensure `path` has a prefix of `base`.
+ *
+ * Example:
+ *
+ * ```
+ * Polymer.Path.translate('foo.bar', 'zot', 'foo.bar.baz') // 'zot.baz'
+ * ```
+ *
+ * @memberof Polymer.Path
+ * @param {string} base Current base string to remove
+ * @param {string} newBase New base string to replace with
+ * @param {string} path Path to translate
+ * @return {string} Translated string
+ */
+ translate: function(base, newBase, path) {
+ return newBase + path.slice(base.length);
+ },
+
+ /**
+ * @param {string} base Path string to test against
+ * @param {string} path Path string to test
+ * @return {boolean} True if `path` is equal to `base`
+ * @this {Path}
+ */
+ matches: function(base, path) {
+ return (base === path) ||
+ this.isAncestor(base, path) ||
+ this.isDescendant(base, path);
+ },
+
+ /**
+ * Converts array-based paths to flattened path. String-based paths
+ * are returned as-is.
+ *
+ * Example:
+ *
+ * ```
+ * Polymer.Path.normalize(['foo.bar', 0, 'baz']) // 'foo.bar.0.baz'
+ * Polymer.Path.normalize('foo.bar.0.baz') // 'foo.bar.0.baz'
+ * ```
+ *
+ * @memberof Polymer.Path
+ * @param {string | !Array<string|number>} path Input path
+ * @return {string} Flattened path
+ */
+ normalize: function(path) {
+ if (Array.isArray(path)) {
+ let parts = [];
+ for (let i=0; i<path.length; i++) {
+ let args = path[i].toString().split('.');
+ for (let j=0; j<args.length; j++) {
+ parts.push(args[j]);
+ }
+ }
+ return parts.join('.');
+ } else {
+ return path;
+ }
+ },
+
+ /**
+ * Splits a path into an array of property names. Accepts either arrays
+ * of path parts or strings.
+ *
+ * Example:
+ *
+ * ```
+ * Polymer.Path.split(['foo.bar', 0, 'baz']) // ['foo', 'bar', '0', 'baz']
+ * Polymer.Path.split('foo.bar.0.baz') // ['foo', 'bar', '0', 'baz']
+ * ```
+ *
+ * @memberof Polymer.Path
+ * @param {string | !Array<string|number>} path Input path
+ * @return {!Array<string>} Array of path parts
+ * @this {Path}
+ * @suppress {checkTypes}
+ */
+ split: function(path) {
+ if (Array.isArray(path)) {
+ return this.normalize(path).split('.');
+ }
+ return path.toString().split('.');
+ },
+
+ /**
+ * Reads a value from a path. If any sub-property in the path is `undefined`,
+ * this method returns `undefined` (will never throw.
+ *
+ * @memberof Polymer.Path
+ * @param {Object} root Object from which to dereference path from
+ * @param {string | !Array<string|number>} path Path to read
+ * @param {Object=} info If an object is provided to `info`, the normalized
+ * (flattened) path will be set to `info.path`.
+ * @return {*} Value at path, or `undefined` if the path could not be
+ * fully dereferenced.
+ * @this {Path}
+ */
+ get: function(root, path, info) {
+ let prop = root;
+ let parts = this.split(path);
+ // Loop over path parts[0..n-1] and dereference
+ for (let i=0; i<parts.length; i++) {
+ if (!prop) {
+ return;
+ }
+ let part = parts[i];
+ prop = prop[part];
+ }
+ if (info) {
+ info.path = parts.join('.');
+ }
+ return prop;
+ },
+
+ /**
+ * Sets a value to a path. If any sub-property in the path is `undefined`,
+ * this method will no-op.
+ *
+ * @memberof Polymer.Path
+ * @param {Object} root Object from which to dereference path from
+ * @param {string | !Array<string|number>} path Path to set
+ * @param {*} value Value to set to path
+ * @return {string | undefined} The normalized version of the input path
+ * @this {Path}
+ */
+ set: function(root, path, value) {
+ let prop = root;
+ let parts = this.split(path);
+ let last = parts[parts.length-1];
+ if (parts.length > 1) {
+ // Loop over path parts[0..n-2] and dereference
+ for (let i=0; i<parts.length-1; i++) {
+ let part = parts[i];
+ prop = prop[part];
+ if (!prop) {
+ return;
+ }
+ }
+ // Set value to object at end of path
+ prop[last] = value;
+ } else {
+ // Simple property set
+ prop[path] = value;
+ }
+ return parts.join('.');
+ }
+
+ };
+
+ /**
+ * Returns true if the given string is a structured data path (has dots).
+ *
+ * This function is deprecated. Use `Polymer.Path.isPath` instead.
+ *
+ * Example:
+ *
+ * ```
+ * Polymer.Path.isDeep('foo.bar.baz') // true
+ * Polymer.Path.isDeep('foo') // false
+ * ```
+ *
+ * @deprecated
+ * @memberof Polymer.Path
+ * @param {string} path Path string
+ * @return {boolean} True if the string contained one or more dots
+ */
+ Path.isDeep = Path.isPath;
+
+ Polymer.Path = Path;
+
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/render-status.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/render-status.html
new file mode 100644
index 00000000000..151f74ebc05
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/render-status.html
@@ -0,0 +1,133 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="boot.html">
+
+<script>
+(function() {
+
+ 'use strict';
+
+ let scheduled = false;
+ let beforeRenderQueue = [];
+ let afterRenderQueue = [];
+
+ function schedule() {
+ scheduled = true;
+ // before next render
+ requestAnimationFrame(function() {
+ scheduled = false;
+ flushQueue(beforeRenderQueue);
+ // after the render
+ setTimeout(function() {
+ runQueue(afterRenderQueue);
+ });
+ });
+ }
+
+ function flushQueue(queue) {
+ while (queue.length) {
+ callMethod(queue.shift());
+ }
+ }
+
+ function runQueue(queue) {
+ for (let i=0, l=queue.length; i < l; i++) {
+ callMethod(queue.shift());
+ }
+ }
+
+ function callMethod(info) {
+ const context = info[0];
+ const callback = info[1];
+ const args = info[2];
+ try {
+ callback.apply(context, args);
+ } catch(e) {
+ setTimeout(() => {
+ throw e;
+ });
+ }
+ }
+
+ function flush() {
+ while (beforeRenderQueue.length || afterRenderQueue.length) {
+ flushQueue(beforeRenderQueue);
+ flushQueue(afterRenderQueue);
+ }
+ scheduled = false;
+ }
+
+ /**
+ * Module for scheduling flushable pre-render and post-render tasks.
+ *
+ * @namespace
+ * @memberof Polymer
+ * @summary Module for scheduling flushable pre-render and post-render tasks.
+ */
+ Polymer.RenderStatus = {
+
+ /**
+ * Enqueues a callback which will be run before the next render, at
+ * `requestAnimationFrame` timing.
+ *
+ * This method is useful for enqueuing work that requires DOM measurement,
+ * since measurement may not be reliable in custom element callbacks before
+ * the first render, as well as for batching measurement tasks in general.
+ *
+ * Tasks in this queue may be flushed by calling `Polymer.RenderStatus.flush()`.
+ *
+ * @memberof Polymer.RenderStatus
+ * @param {*} context Context object the callback function will be bound to
+ * @param {function(...*):void} callback Callback function
+ * @param {!Array=} args An array of arguments to call the callback function with
+ * @return {void}
+ */
+ beforeNextRender: function(context, callback, args) {
+ if (!scheduled) {
+ schedule();
+ }
+ beforeRenderQueue.push([context, callback, args]);
+ },
+
+ /**
+ * Enqueues a callback which will be run after the next render, equivalent
+ * to one task (`setTimeout`) after the next `requestAnimationFrame`.
+ *
+ * This method is useful for tuning the first-render performance of an
+ * element or application by deferring non-critical work until after the
+ * first paint. Typical non-render-critical work may include adding UI
+ * event listeners and aria attributes.
+ *
+ * @memberof Polymer.RenderStatus
+ * @param {*} context Context object the callback function will be bound to
+ * @param {function(...*):void} callback Callback function
+ * @param {!Array=} args An array of arguments to call the callback function with
+ * @return {void}
+ */
+ afterNextRender: function(context, callback, args) {
+ if (!scheduled) {
+ schedule();
+ }
+ afterRenderQueue.push([context, callback, args]);
+ },
+
+ /**
+ * Flushes all `beforeNextRender` tasks, followed by all `afterNextRender`
+ * tasks.
+ *
+ * @memberof Polymer.RenderStatus
+ * @return {void}
+ */
+ flush: flush
+
+ };
+
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/resolve-url.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/resolve-url.html
new file mode 100644
index 00000000000..6d061a826e4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/resolve-url.html
@@ -0,0 +1,112 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="boot.html">
+
+<script>
+
+ (function() {
+ 'use strict';
+
+ let CSS_URL_RX = /(url\()([^)]*)(\))/g;
+ let ABS_URL = /(^\/)|(^#)|(^[\w-\d]*:)/;
+ let workingURL;
+ let resolveDoc;
+ /**
+ * Resolves the given URL against the provided `baseUri'.
+ *
+ * Note that this function performs no resolution for URLs that start
+ * with `/` (absolute URLs) or `#` (hash identifiers). For general purpose
+ * URL resolution, use `window.URL`.
+ *
+ * @memberof Polymer.ResolveUrl
+ * @param {string} url Input URL to resolve
+ * @param {?string=} baseURI Base URI to resolve the URL against
+ * @return {string} resolved URL
+ */
+ function resolveUrl(url, baseURI) {
+ if (url && ABS_URL.test(url)) {
+ return url;
+ }
+ // Lazy feature detection.
+ if (workingURL === undefined) {
+ workingURL = false;
+ try {
+ const u = new URL('b', 'http://a');
+ u.pathname = 'c%20d';
+ workingURL = (u.href === 'http://a/c%20d');
+ } catch (e) {
+ // silently fail
+ }
+ }
+ if (!baseURI) {
+ baseURI = document.baseURI || window.location.href;
+ }
+ if (workingURL) {
+ return (new URL(url, baseURI)).href;
+ }
+ // Fallback to creating an anchor into a disconnected document.
+ if (!resolveDoc) {
+ resolveDoc = document.implementation.createHTMLDocument('temp');
+ resolveDoc.base = resolveDoc.createElement('base');
+ resolveDoc.head.appendChild(resolveDoc.base);
+ resolveDoc.anchor = resolveDoc.createElement('a');
+ resolveDoc.body.appendChild(resolveDoc.anchor);
+ }
+ resolveDoc.base.href = baseURI;
+ resolveDoc.anchor.href = url;
+ return resolveDoc.anchor.href || url;
+
+ }
+
+ /**
+ * Resolves any relative URL's in the given CSS text against the provided
+ * `ownerDocument`'s `baseURI`.
+ *
+ * @memberof Polymer.ResolveUrl
+ * @param {string} cssText CSS text to process
+ * @param {string} baseURI Base URI to resolve the URL against
+ * @return {string} Processed CSS text with resolved URL's
+ */
+ function resolveCss(cssText, baseURI) {
+ return cssText.replace(CSS_URL_RX, function(m, pre, url, post) {
+ return pre + '\'' +
+ resolveUrl(url.replace(/["']/g, ''), baseURI) +
+ '\'' + post;
+ });
+ }
+
+ /**
+ * Returns a path from a given `url`. The path includes the trailing
+ * `/` from the url.
+ *
+ * @memberof Polymer.ResolveUrl
+ * @param {string} url Input URL to transform
+ * @return {string} resolved path
+ */
+ function pathFromUrl(url) {
+ return url.substring(0, url.lastIndexOf('/') + 1);
+ }
+
+ /**
+ * Module with utilities for resolving relative URL's.
+ *
+ * @namespace
+ * @memberof Polymer
+ * @summary Module with utilities for resolving relative URL's.
+ */
+ Polymer.ResolveUrl = {
+ resolveCss: resolveCss,
+ resolveUrl: resolveUrl,
+ pathFromUrl: pathFromUrl
+ };
+
+ })();
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/settings.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/settings.html
new file mode 100644
index 00000000000..5b0dc42039d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/settings.html
@@ -0,0 +1,118 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="../utils/boot.html">
+<link rel="import" href="../utils/resolve-url.html">
+
+<script>
+/** @suppress {deprecated} */
+(function() {
+ 'use strict';
+
+ /**
+ * Sets the global, legacy settings.
+ *
+ * @deprecated
+ * @namespace
+ * @memberof Polymer
+ */
+ Polymer.Settings = Polymer.Settings || {};
+
+ Polymer.Settings.useShadow = !(window.ShadyDOM);
+ Polymer.Settings.useNativeCSSProperties =
+ Boolean(!window.ShadyCSS || window.ShadyCSS.nativeCss);
+ Polymer.Settings.useNativeCustomElements =
+ !(window.customElements.polyfillWrapFlushCallback);
+
+
+ /**
+ * Globally settable property that is automatically assigned to
+ * `Polymer.ElementMixin` instances, useful for binding in templates to
+ * make URL's relative to an application's root. Defaults to the main
+ * document URL, but can be overridden by users. It may be useful to set
+ * `Polymer.rootPath` to provide a stable application mount path when
+ * using client side routing.
+ *
+ * @memberof Polymer
+ */
+ let rootPath = Polymer.rootPath ||
+ Polymer.ResolveUrl.pathFromUrl(document.baseURI || window.location.href);
+
+ Polymer.rootPath = rootPath;
+
+ /**
+ * Sets the global rootPath property used by `Polymer.ElementMixin` and
+ * available via `Polymer.rootPath`.
+ *
+ * @memberof Polymer
+ * @param {string} path The new root path
+ * @return {void}
+ */
+ Polymer.setRootPath = function(path) {
+ Polymer.rootPath = path;
+ };
+
+ /**
+ * A global callback used to sanitize any value before inserting it into the DOM. The callback signature is:
+ *
+ * Polymer = {
+ * sanitizeDOMValue: function(value, name, type, node) { ... }
+ * }
+ *
+ * Where:
+ *
+ * `value` is the value to sanitize.
+ * `name` is the name of an attribute or property (for example, href).
+ * `type` indicates where the value is being inserted: one of property, attribute, or text.
+ * `node` is the node where the value is being inserted.
+ *
+ * @type {(function(*,string,string,Node):*)|undefined}
+ * @memberof Polymer
+ */
+ let sanitizeDOMValue = Polymer.sanitizeDOMValue;
+
+ // This is needed for tooling
+ Polymer.sanitizeDOMValue = sanitizeDOMValue;
+
+ /**
+ * Sets the global sanitizeDOMValue available via `Polymer.sanitizeDOMValue`.
+ *
+ * @memberof Polymer
+ * @param {(function(*,string,string,Node):*)|undefined} newSanitizeDOMValue the global sanitizeDOMValue callback
+ * @return {void}
+ */
+ Polymer.setSanitizeDOMValue = function(newSanitizeDOMValue) {
+ Polymer.sanitizeDOMValue = newSanitizeDOMValue;
+ };
+
+ /**
+ * Globally settable property to make Polymer Gestures use passive TouchEvent listeners when recognizing gestures.
+ * When set to `true`, gestures made from touch will not be able to prevent scrolling, allowing for smoother
+ * scrolling performance.
+ * Defaults to `false` for backwards compatibility.
+ *
+ * @memberof Polymer
+ */
+ let passiveTouchGestures = false;
+
+ Polymer.passiveTouchGestures = passiveTouchGestures;
+
+ /**
+ * Sets `passiveTouchGestures` globally for all elements using Polymer Gestures.
+ *
+ * @memberof Polymer
+ * @param {boolean} usePassive enable or disable passive touch gestures globally
+ * @return {void}
+ */
+ Polymer.setPassiveTouchGestures = function(usePassive) {
+ Polymer.passiveTouchGestures = usePassive;
+ };
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/style-gather.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/style-gather.html
new file mode 100644
index 00000000000..3b0a48da6a8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/style-gather.html
@@ -0,0 +1,299 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="resolve-url.html">
+<script>
+(function() {
+ 'use strict';
+
+ const MODULE_STYLE_LINK_SELECTOR = 'link[rel=import][type~=css]';
+ const INCLUDE_ATTR = 'include';
+ const SHADY_UNSCOPED_ATTR = 'shady-unscoped';
+
+ function importModule(moduleId) {
+ const /** Polymer.DomModule */ PolymerDomModule = customElements.get('dom-module');
+ if (!PolymerDomModule) {
+ return null;
+ }
+ return PolymerDomModule.import(moduleId);
+ }
+
+ function styleForImport(importDoc) {
+ // NOTE: polyfill affordance.
+ // under the HTMLImports polyfill, there will be no 'body',
+ // but the import pseudo-doc can be used directly.
+ let container = importDoc.body ? importDoc.body : importDoc;
+ const importCss = Polymer.ResolveUrl.resolveCss(container.textContent,
+ importDoc.baseURI);
+ const style = document.createElement('style');
+ style.textContent = importCss;
+ return style;
+ }
+
+ /** @typedef {{assetpath: string}} */
+ let templateWithAssetPath; // eslint-disable-line no-unused-vars
+
+ /**
+ * Module with utilities for collection CSS text from `<templates>`, external
+ * stylesheets, and `dom-module`s.
+ *
+ * @namespace
+ * @memberof Polymer
+ * @summary Module with utilities for collection CSS text from various sources.
+ */
+ const StyleGather = {
+
+ /**
+ * Returns a list of <style> elements in a space-separated list of `dom-module`s.
+ *
+ * @memberof Polymer.StyleGather
+ * @param {string} moduleIds List of dom-module id's within which to
+ * search for css.
+ * @return {!Array<!HTMLStyleElement>} Array of contained <style> elements
+ * @this {StyleGather}
+ */
+ stylesFromModules(moduleIds) {
+ const modules = moduleIds.trim().split(/\s+/);
+ const styles = [];
+ for (let i=0; i < modules.length; i++) {
+ styles.push(...this.stylesFromModule(modules[i]));
+ }
+ return styles;
+ },
+
+ /**
+ * Returns a list of <style> elements in a given `dom-module`.
+ * Styles in a `dom-module` can come either from `<style>`s within the
+ * first `<template>`, or else from one or more
+ * `<link rel="import" type="css">` links outside the template.
+ *
+ * @memberof Polymer.StyleGather
+ * @param {string} moduleId dom-module id to gather styles from
+ * @return {!Array<!HTMLStyleElement>} Array of contained styles.
+ * @this {StyleGather}
+ */
+ stylesFromModule(moduleId) {
+ const m = importModule(moduleId);
+
+ if (!m) {
+ console.warn('Could not find style data in module named', moduleId);
+ return [];
+ }
+
+ if (m._styles === undefined) {
+ const styles = [];
+ // module imports: <link rel="import" type="css">
+ styles.push(...this._stylesFromModuleImports(m));
+ // include css from the first template in the module
+ const template = m.querySelector('template');
+ if (template) {
+ styles.push(...this.stylesFromTemplate(template,
+ /** @type {templateWithAssetPath} */(m).assetpath));
+ }
+
+ m._styles = styles;
+ }
+
+ return m._styles;
+ },
+
+ /**
+ * Returns the `<style>` elements within a given template.
+ *
+ * @memberof Polymer.StyleGather
+ * @param {!HTMLTemplateElement} template Template to gather styles from
+ * @param {string} baseURI baseURI for style content
+ * @return {!Array<!HTMLStyleElement>} Array of styles
+ * @this {StyleGather}
+ */
+ stylesFromTemplate(template, baseURI) {
+ if (!template._styles) {
+ const styles = [];
+ // if element is a template, get content from its .content
+ const e$ = template.content.querySelectorAll('style');
+ for (let i=0; i < e$.length; i++) {
+ let e = e$[i];
+ // support style sharing by allowing styles to "include"
+ // other dom-modules that contain styling
+ let include = e.getAttribute(INCLUDE_ATTR);
+ if (include) {
+ styles.push(...this.stylesFromModules(include).filter(function(item, index, self) {
+ return self.indexOf(item) === index;
+ }));
+ }
+ if (baseURI) {
+ e.textContent = Polymer.ResolveUrl.resolveCss(e.textContent, baseURI);
+ }
+ styles.push(e);
+ }
+ template._styles = styles;
+ }
+ return template._styles;
+ },
+
+ /**
+ * Returns a list of <style> elements from stylesheets loaded via `<link rel="import" type="css">` links within the specified `dom-module`.
+ *
+ * @memberof Polymer.StyleGather
+ * @param {string} moduleId Id of `dom-module` to gather CSS from
+ * @return {!Array<!HTMLStyleElement>} Array of contained styles.
+ * @this {StyleGather}
+ */
+ stylesFromModuleImports(moduleId) {
+ let m = importModule(moduleId);
+ return m ? this._stylesFromModuleImports(m) : [];
+ },
+
+ /**
+ * @memberof Polymer.StyleGather
+ * @this {StyleGather}
+ * @param {!HTMLElement} module dom-module element that could contain `<link rel="import" type="css">` styles
+ * @return {!Array<!HTMLStyleElement>} Array of contained styles
+ */
+ _stylesFromModuleImports(module) {
+ const styles = [];
+ const p$ = module.querySelectorAll(MODULE_STYLE_LINK_SELECTOR);
+ for (let i=0; i < p$.length; i++) {
+ let p = p$[i];
+ if (p.import) {
+ const importDoc = p.import;
+ const unscoped = p.hasAttribute(SHADY_UNSCOPED_ATTR);
+ if (unscoped && !importDoc._unscopedStyle) {
+ const style = styleForImport(importDoc);
+ style.setAttribute(SHADY_UNSCOPED_ATTR, '');
+ importDoc._unscopedStyle = style;
+ } else if (!importDoc._style) {
+ importDoc._style = styleForImport(importDoc);
+ }
+ styles.push(unscoped ? importDoc._unscopedStyle : importDoc._style);
+ }
+ }
+ return styles;
+ },
+
+ /**
+ *
+ * Returns CSS text of styles in a space-separated list of `dom-module`s.
+ * Note: This method is deprecated, use `stylesFromModules` instead.
+ *
+ * @deprecated
+ * @memberof Polymer.StyleGather
+ * @param {string} moduleIds List of dom-module id's within which to
+ * search for css.
+ * @return {string} Concatenated CSS content from specified `dom-module`s
+ * @this {StyleGather}
+ */
+ cssFromModules(moduleIds) {
+ let modules = moduleIds.trim().split(/\s+/);
+ let cssText = '';
+ for (let i=0; i < modules.length; i++) {
+ cssText += this.cssFromModule(modules[i]);
+ }
+ return cssText;
+ },
+
+ /**
+ * Returns CSS text of styles in a given `dom-module`. CSS in a `dom-module`
+ * can come either from `<style>`s within the first `<template>`, or else
+ * from one or more `<link rel="import" type="css">` links outside the
+ * template.
+ *
+ * Any `<styles>` processed are removed from their original location.
+ * Note: This method is deprecated, use `styleFromModule` instead.
+ *
+ * @deprecated
+ * @memberof Polymer.StyleGather
+ * @param {string} moduleId dom-module id to gather styles from
+ * @return {string} Concatenated CSS content from specified `dom-module`
+ * @this {StyleGather}
+ */
+ cssFromModule(moduleId) {
+ let m = importModule(moduleId);
+ if (m && m._cssText === undefined) {
+ // module imports: <link rel="import" type="css">
+ let cssText = this._cssFromModuleImports(m);
+ // include css from the first template in the module
+ let t = m.querySelector('template');
+ if (t) {
+ cssText += this.cssFromTemplate(t,
+ /** @type {templateWithAssetPath} */(m).assetpath);
+ }
+ m._cssText = cssText || null;
+ }
+ if (!m) {
+ console.warn('Could not find style data in module named', moduleId);
+ }
+ return m && m._cssText || '';
+ },
+
+ /**
+ * Returns CSS text of `<styles>` within a given template.
+ *
+ * Any `<styles>` processed are removed from their original location.
+ * Note: This method is deprecated, use `styleFromTemplate` instead.
+ *
+ * @deprecated
+ * @memberof Polymer.StyleGather
+ * @param {!HTMLTemplateElement} template Template to gather styles from
+ * @param {string} baseURI Base URI to resolve the URL against
+ * @return {string} Concatenated CSS content from specified template
+ * @this {StyleGather}
+ */
+ cssFromTemplate(template, baseURI) {
+ let cssText = '';
+ const e$ = this.stylesFromTemplate(template, baseURI);
+ // if element is a template, get content from its .content
+ for (let i=0; i < e$.length; i++) {
+ let e = e$[i];
+ if (e.parentNode) {
+ e.parentNode.removeChild(e);
+ }
+ cssText += e.textContent;
+ }
+ return cssText;
+ },
+
+ /**
+ * Returns CSS text from stylesheets loaded via `<link rel="import" type="css">`
+ * links within the specified `dom-module`.
+ *
+ * Note: This method is deprecated, use `stylesFromModuleImports` instead.
+ *
+ * @deprecated
+ *
+ * @memberof Polymer.StyleGather
+ * @param {string} moduleId Id of `dom-module` to gather CSS from
+ * @return {string} Concatenated CSS content from links in specified `dom-module`
+ * @this {StyleGather}
+ */
+ cssFromModuleImports(moduleId) {
+ let m = importModule(moduleId);
+ return m ? this._cssFromModuleImports(m) : '';
+ },
+
+ /**
+ * @deprecated
+ * @memberof Polymer.StyleGather
+ * @this {StyleGather}
+ * @param {!HTMLElement} module dom-module element that could contain `<link rel="import" type="css">` styles
+ * @return {string} Concatenated CSS content from links in the dom-module
+ */
+ _cssFromModuleImports(module) {
+ let cssText = '';
+ let styles = this._stylesFromModuleImports(module);
+ for (let i=0; i < styles.length; i++) {
+ cssText += styles[i].textContent;
+ }
+ return cssText;
+ }
+ };
+
+ Polymer.StyleGather = StyleGather;
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/templatize.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/templatize.html
new file mode 100644
index 00000000000..67b4a531795
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/templatize.html
@@ -0,0 +1,579 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<link rel="import" href="boot.html">
+<link rel="import" href="../mixins/property-effects.html">
+<link rel="import" href="../mixins/mutable-data.html">
+
+<script>
+ (function() {
+ 'use strict';
+
+ // Base class for HTMLTemplateElement extension that has property effects
+ // machinery for propagating host properties to children. This is an ES5
+ // class only because Babel (incorrectly) requires super() in the class
+ // constructor even though no `this` is used and it returns an instance.
+ let newInstance = null;
+ /**
+ * @constructor
+ * @extends {HTMLTemplateElement}
+ */
+ function HTMLTemplateElementExtension() { return newInstance; }
+ HTMLTemplateElementExtension.prototype = Object.create(HTMLTemplateElement.prototype, {
+ constructor: {
+ value: HTMLTemplateElementExtension,
+ writable: true
+ }
+ });
+ /**
+ * @constructor
+ * @implements {Polymer_PropertyEffects}
+ * @extends {HTMLTemplateElementExtension}
+ */
+ const DataTemplate = Polymer.PropertyEffects(HTMLTemplateElementExtension);
+ /**
+ * @constructor
+ * @implements {Polymer_MutableData}
+ * @extends {DataTemplate}
+ */
+ const MutableDataTemplate = Polymer.MutableData(DataTemplate);
+
+ // Applies a DataTemplate subclass to a <template> instance
+ function upgradeTemplate(template, constructor) {
+ newInstance = template;
+ Object.setPrototypeOf(template, constructor.prototype);
+ new constructor();
+ newInstance = null;
+ }
+
+ // Base class for TemplateInstance's
+ /**
+ * @constructor
+ * @implements {Polymer_PropertyEffects}
+ */
+ const base = Polymer.PropertyEffects(class {});
+
+ /**
+ * @polymer
+ * @customElement
+ * @appliesMixin Polymer.PropertyEffects
+ * @unrestricted
+ */
+ class TemplateInstanceBase extends base {
+ constructor(props) {
+ super();
+ this._configureProperties(props);
+ this.root = this._stampTemplate(this.__dataHost);
+ // Save list of stamped children
+ let children = this.children = [];
+ for (let n = this.root.firstChild; n; n=n.nextSibling) {
+ children.push(n);
+ n.__templatizeInstance = this;
+ }
+ if (this.__templatizeOwner &&
+ this.__templatizeOwner.__hideTemplateChildren__) {
+ this._showHideChildren(true);
+ }
+ // Flush props only when props are passed if instance props exist
+ // or when there isn't instance props.
+ let options = this.__templatizeOptions;
+ if ((props && options.instanceProps) || !options.instanceProps) {
+ this._enableProperties();
+ }
+ }
+ /**
+ * Configure the given `props` by calling `_setPendingProperty`. Also
+ * sets any properties stored in `__hostProps`.
+ * @private
+ * @param {Object} props Object of property name-value pairs to set.
+ * @return {void}
+ */
+ _configureProperties(props) {
+ let options = this.__templatizeOptions;
+ if (options.forwardHostProp) {
+ for (let hprop in this.__hostProps) {
+ this._setPendingProperty(hprop, this.__dataHost['_host_' + hprop]);
+ }
+ }
+ // Any instance props passed in the constructor will overwrite host props;
+ // normally this would be a user error but we don't specifically filter them
+ for (let iprop in props) {
+ this._setPendingProperty(iprop, props[iprop]);
+ }
+ }
+ /**
+ * Forwards a host property to this instance. This method should be
+ * called on instances from the `options.forwardHostProp` callback
+ * to propagate changes of host properties to each instance.
+ *
+ * Note this method enqueues the change, which are flushed as a batch.
+ *
+ * @param {string} prop Property or path name
+ * @param {*} value Value of the property to forward
+ * @return {void}
+ */
+ forwardHostProp(prop, value) {
+ if (this._setPendingPropertyOrPath(prop, value, false, true)) {
+ this.__dataHost._enqueueClient(this);
+ }
+ }
+
+ /**
+ * Override point for adding custom or simulated event handling.
+ *
+ * @param {!Node} node Node to add event listener to
+ * @param {string} eventName Name of event
+ * @param {function(!Event):void} handler Listener function to add
+ * @return {void}
+ */
+ _addEventListenerToNode(node, eventName, handler) {
+ if (this._methodHost && this.__templatizeOptions.parentModel) {
+ // If this instance should be considered a parent model, decorate
+ // events this template instance as `model`
+ this._methodHost._addEventListenerToNode(node, eventName, (e) => {
+ e.model = this;
+ handler(e);
+ });
+ } else {
+ // Otherwise delegate to the template's host (which could be)
+ // another template instance
+ let templateHost = this.__dataHost.__dataHost;
+ if (templateHost) {
+ templateHost._addEventListenerToNode(node, eventName, handler);
+ }
+ }
+ }
+ /**
+ * Shows or hides the template instance top level child elements. For
+ * text nodes, `textContent` is removed while "hidden" and replaced when
+ * "shown."
+ * @param {boolean} hide Set to true to hide the children;
+ * set to false to show them.
+ * @return {void}
+ * @protected
+ */
+ _showHideChildren(hide) {
+ let c = this.children;
+ for (let i=0; i<c.length; i++) {
+ let n = c[i];
+ // Ignore non-changes
+ if (Boolean(hide) != Boolean(n.__hideTemplateChildren__)) {
+ if (n.nodeType === Node.TEXT_NODE) {
+ if (hide) {
+ n.__polymerTextContent__ = n.textContent;
+ n.textContent = '';
+ } else {
+ n.textContent = n.__polymerTextContent__;
+ }
+ // remove and replace slot
+ } else if (n.localName === 'slot') {
+ if (hide) {
+ n.__polymerReplaced__ = document.createComment('hidden-slot');
+ n.parentNode.replaceChild(n.__polymerReplaced__, n);
+ } else {
+ const replace = n.__polymerReplaced__;
+ if (replace) {
+ replace.parentNode.replaceChild(n, replace);
+ }
+ }
+ }
+
+ else if (n.style) {
+ if (hide) {
+ n.__polymerDisplay__ = n.style.display;
+ n.style.display = 'none';
+ } else {
+ n.style.display = n.__polymerDisplay__;
+ }
+ }
+ }
+ n.__hideTemplateChildren__ = hide;
+ if (n._showHideChildren) {
+ n._showHideChildren(hide);
+ }
+ }
+ }
+ /**
+ * Overrides default property-effects implementation to intercept
+ * textContent bindings while children are "hidden" and cache in
+ * private storage for later retrieval.
+ *
+ * @param {!Node} node The node to set a property on
+ * @param {string} prop The property to set
+ * @param {*} value The value to set
+ * @return {void}
+ * @protected
+ */
+ _setUnmanagedPropertyToNode(node, prop, value) {
+ if (node.__hideTemplateChildren__ &&
+ node.nodeType == Node.TEXT_NODE && prop == 'textContent') {
+ node.__polymerTextContent__ = value;
+ } else {
+ super._setUnmanagedPropertyToNode(node, prop, value);
+ }
+ }
+ /**
+ * Find the parent model of this template instance. The parent model
+ * is either another templatize instance that had option `parentModel: true`,
+ * or else the host element.
+ *
+ * @return {!Polymer_PropertyEffects} The parent model of this instance
+ */
+ get parentModel() {
+ let model = this.__parentModel;
+ if (!model) {
+ let options;
+ model = this;
+ do {
+ // A template instance's `__dataHost` is a <template>
+ // `model.__dataHost.__dataHost` is the template's host
+ model = model.__dataHost.__dataHost;
+ } while ((options = model.__templatizeOptions) && !options.parentModel);
+ this.__parentModel = model;
+ }
+ return model;
+ }
+
+ /**
+ * Stub of HTMLElement's `dispatchEvent`, so that effects that may
+ * dispatch events safely no-op.
+ *
+ * @param {Event} event Event to dispatch
+ * @return {boolean} Always true.
+ */
+ dispatchEvent(event) { // eslint-disable-line no-unused-vars
+ return true;
+ }
+ }
+
+ /** @type {!DataTemplate} */
+ TemplateInstanceBase.prototype.__dataHost;
+ /** @type {!TemplatizeOptions} */
+ TemplateInstanceBase.prototype.__templatizeOptions;
+ /** @type {!Polymer_PropertyEffects} */
+ TemplateInstanceBase.prototype._methodHost;
+ /** @type {!Object} */
+ TemplateInstanceBase.prototype.__templatizeOwner;
+ /** @type {!Object} */
+ TemplateInstanceBase.prototype.__hostProps;
+
+ /**
+ * @constructor
+ * @extends {TemplateInstanceBase}
+ * @implements {Polymer_MutableData}
+ */
+ const MutableTemplateInstanceBase = Polymer.MutableData(TemplateInstanceBase);
+
+ function findMethodHost(template) {
+ // Technically this should be the owner of the outermost template.
+ // In shadow dom, this is always getRootNode().host, but we can
+ // approximate this via cooperation with our dataHost always setting
+ // `_methodHost` as long as there were bindings (or id's) on this
+ // instance causing it to get a dataHost.
+ let templateHost = template.__dataHost;
+ return templateHost && templateHost._methodHost || templateHost;
+ }
+
+ /* eslint-disable valid-jsdoc */
+ /**
+ * @suppress {missingProperties} class.prototype is not defined for some reason
+ */
+ function createTemplatizerClass(template, templateInfo, options) {
+ // Anonymous class created by the templatize
+ let base = options.mutableData ?
+ MutableTemplateInstanceBase : TemplateInstanceBase;
+ /**
+ * @constructor
+ * @extends {base}
+ * @private
+ */
+ let klass = class extends base { };
+ klass.prototype.__templatizeOptions = options;
+ klass.prototype._bindTemplate(template);
+ addNotifyEffects(klass, template, templateInfo, options);
+ return klass;
+ }
+
+ /**
+ * @suppress {missingProperties} class.prototype is not defined for some reason
+ */
+ function addPropagateEffects(template, templateInfo, options) {
+ let userForwardHostProp = options.forwardHostProp;
+ if (userForwardHostProp) {
+ // Provide data API and property effects on memoized template class
+ let klass = templateInfo.templatizeTemplateClass;
+ if (!klass) {
+ let base = options.mutableData ? MutableDataTemplate : DataTemplate;
+ klass = templateInfo.templatizeTemplateClass =
+ class TemplatizedTemplate extends base {};
+ // Add template - >instances effects
+ // and host <- template effects
+ let hostProps = templateInfo.hostProps;
+ for (let prop in hostProps) {
+ klass.prototype._addPropertyEffect('_host_' + prop,
+ klass.prototype.PROPERTY_EFFECT_TYPES.PROPAGATE,
+ {fn: createForwardHostPropEffect(prop, userForwardHostProp)});
+ klass.prototype._createNotifyingProperty('_host_' + prop);
+ }
+ }
+ upgradeTemplate(template, klass);
+ // Mix any pre-bound data into __data; no need to flush this to
+ // instances since they pull from the template at instance-time
+ if (template.__dataProto) {
+ // Note, generally `__dataProto` could be chained, but it's guaranteed
+ // to not be since this is a vanilla template we just added effects to
+ Object.assign(template.__data, template.__dataProto);
+ }
+ // Clear any pending data for performance
+ template.__dataTemp = {};
+ template.__dataPending = null;
+ template.__dataOld = null;
+ template._enableProperties();
+ }
+ }
+ /* eslint-enable valid-jsdoc */
+
+ function createForwardHostPropEffect(hostProp, userForwardHostProp) {
+ return function forwardHostProp(template, prop, props) {
+ userForwardHostProp.call(template.__templatizeOwner,
+ prop.substring('_host_'.length), props[prop]);
+ };
+ }
+
+ function addNotifyEffects(klass, template, templateInfo, options) {
+ let hostProps = templateInfo.hostProps || {};
+ for (let iprop in options.instanceProps) {
+ delete hostProps[iprop];
+ let userNotifyInstanceProp = options.notifyInstanceProp;
+ if (userNotifyInstanceProp) {
+ klass.prototype._addPropertyEffect(iprop,
+ klass.prototype.PROPERTY_EFFECT_TYPES.NOTIFY,
+ {fn: createNotifyInstancePropEffect(iprop, userNotifyInstanceProp)});
+ }
+ }
+ if (options.forwardHostProp && template.__dataHost) {
+ for (let hprop in hostProps) {
+ klass.prototype._addPropertyEffect(hprop,
+ klass.prototype.PROPERTY_EFFECT_TYPES.NOTIFY,
+ {fn: createNotifyHostPropEffect()});
+ }
+ }
+ }
+
+ function createNotifyInstancePropEffect(instProp, userNotifyInstanceProp) {
+ return function notifyInstanceProp(inst, prop, props) {
+ userNotifyInstanceProp.call(inst.__templatizeOwner,
+ inst, prop, props[prop]);
+ };
+ }
+
+ function createNotifyHostPropEffect() {
+ return function notifyHostProp(inst, prop, props) {
+ inst.__dataHost._setPendingPropertyOrPath('_host_' + prop, props[prop], true, true);
+ };
+ }
+
+ /**
+ * Module for preparing and stamping instances of templates that utilize
+ * Polymer's data-binding and declarative event listener features.
+ *
+ * Example:
+ *
+ * // Get a template from somewhere, e.g. light DOM
+ * let template = this.querySelector('template');
+ * // Prepare the template
+ * let TemplateClass = Polymer.Templatize.templatize(template);
+ * // Instance the template with an initial data model
+ * let instance = new TemplateClass({myProp: 'initial'});
+ * // Insert the instance's DOM somewhere, e.g. element's shadow DOM
+ * this.shadowRoot.appendChild(instance.root);
+ * // Changing a property on the instance will propagate to bindings
+ * // in the template
+ * instance.myProp = 'new value';
+ *
+ * The `options` dictionary passed to `templatize` allows for customizing
+ * features of the generated template class, including how outer-scope host
+ * properties should be forwarded into template instances, how any instance
+ * properties added into the template's scope should be notified out to
+ * the host, and whether the instance should be decorated as a "parent model"
+ * of any event handlers.
+ *
+ * // Customize property forwarding and event model decoration
+ * let TemplateClass = Polymer.Templatize.templatize(template, this, {
+ * parentModel: true,
+ * forwardHostProp(property, value) {...},
+ * instanceProps: {...},
+ * notifyInstanceProp(instance, property, value) {...},
+ * });
+ *
+ * @namespace
+ * @memberof Polymer
+ * @summary Module for preparing and stamping instances of templates
+ * utilizing Polymer templating features.
+ */
+ Polymer.Templatize = {
+
+ /**
+ * Returns an anonymous `Polymer.PropertyEffects` class bound to the
+ * `<template>` provided. Instancing the class will result in the
+ * template being stamped into a document fragment stored as the instance's
+ * `root` property, after which it can be appended to the DOM.
+ *
+ * Templates may utilize all Polymer data-binding features as well as
+ * declarative event listeners. Event listeners and inline computing
+ * functions in the template will be called on the host of the template.
+ *
+ * The constructor returned takes a single argument dictionary of initial
+ * property values to propagate into template bindings. Additionally
+ * host properties can be forwarded in, and instance properties can be
+ * notified out by providing optional callbacks in the `options` dictionary.
+ *
+ * Valid configuration in `options` are as follows:
+ *
+ * - `forwardHostProp(property, value)`: Called when a property referenced
+ * in the template changed on the template's host. As this library does
+ * not retain references to templates instanced by the user, it is the
+ * templatize owner's responsibility to forward host property changes into
+ * user-stamped instances. The `instance.forwardHostProp(property, value)`
+ * method on the generated class should be called to forward host
+ * properties into the template to prevent unnecessary property-changed
+ * notifications. Any properties referenced in the template that are not
+ * defined in `instanceProps` will be notified up to the template's host
+ * automatically.
+ * - `instanceProps`: Dictionary of property names that will be added
+ * to the instance by the templatize owner. These properties shadow any
+ * host properties, and changes within the template to these properties
+ * will result in `notifyInstanceProp` being called.
+ * - `mutableData`: When `true`, the generated class will skip strict
+ * dirty-checking for objects and arrays (always consider them to be
+ * "dirty").
+ * - `notifyInstanceProp(instance, property, value)`: Called when
+ * an instance property changes. Users may choose to call `notifyPath`
+ * on e.g. the owner to notify the change.
+ * - `parentModel`: When `true`, events handled by declarative event listeners
+ * (`on-event="handler"`) will be decorated with a `model` property pointing
+ * to the template instance that stamped it. It will also be returned
+ * from `instance.parentModel` in cases where template instance nesting
+ * causes an inner model to shadow an outer model.
+ *
+ * All callbacks are called bound to the `owner`. Any context
+ * needed for the callbacks (such as references to `instances` stamped)
+ * should be stored on the `owner` such that they can be retrieved via
+ * `this`.
+ *
+ * When `options.forwardHostProp` is declared as an option, any properties
+ * referenced in the template will be automatically forwarded from the host of
+ * the `<template>` to instances, with the exception of any properties listed in
+ * the `options.instanceProps` object. `instanceProps` are assumed to be
+ * managed by the owner of the instances, either passed into the constructor
+ * or set after the fact. Note, any properties passed into the constructor will
+ * always be set to the instance (regardless of whether they would normally
+ * be forwarded from the host).
+ *
+ * Note that `templatize()` can be run only once for a given `<template>`.
+ * Further calls will result in an error. Also, there is a special
+ * behavior if the template was duplicated through a mechanism such as
+ * `<dom-repeat>` or `<test-fixture>`. In this case, all calls to
+ * `templatize()` return the same class for all duplicates of a template.
+ * The class returned from `templatize()` is generated only once using
+ * the `options` from the first call. This means that any `options`
+ * provided to subsequent calls will be ignored. Therefore, it is very
+ * important not to close over any variables inside the callbacks. Also,
+ * arrow functions must be avoided because they bind the outer `this`.
+ * Inside the callbacks, any contextual information can be accessed
+ * through `this`, which points to the `owner`.
+ *
+ * @memberof Polymer.Templatize
+ * @param {!HTMLTemplateElement} template Template to templatize
+ * @param {Polymer_PropertyEffects=} owner Owner of the template instances;
+ * any optional callbacks will be bound to this owner.
+ * @param {Object=} options Options dictionary (see summary for details)
+ * @return {function(new:TemplateInstanceBase)} Generated class bound to the template
+ * provided
+ * @suppress {invalidCasts}
+ */
+ templatize(template, owner, options) {
+ options = /** @type {!TemplatizeOptions} */(options || {});
+ if (template.__templatizeOwner) {
+ throw new Error('A <template> can only be templatized once');
+ }
+ template.__templatizeOwner = owner;
+ const ctor = owner ? owner.constructor : TemplateInstanceBase;
+ let templateInfo = ctor._parseTemplate(template);
+ // Get memoized base class for the prototypical template, which
+ // includes property effects for binding template & forwarding
+ let baseClass = templateInfo.templatizeInstanceClass;
+ if (!baseClass) {
+ baseClass = createTemplatizerClass(template, templateInfo, options);
+ templateInfo.templatizeInstanceClass = baseClass;
+ }
+ // Host property forwarding must be installed onto template instance
+ addPropagateEffects(template, templateInfo, options);
+ // Subclass base class and add reference for this specific template
+ /** @private */
+ let klass = class TemplateInstance extends baseClass {};
+ klass.prototype._methodHost = findMethodHost(template);
+ klass.prototype.__dataHost = template;
+ klass.prototype.__templatizeOwner = owner;
+ klass.prototype.__hostProps = templateInfo.hostProps;
+ klass = /** @type {function(new:TemplateInstanceBase)} */(klass); //eslint-disable-line no-self-assign
+ return klass;
+ },
+
+ /**
+ * Returns the template "model" associated with a given element, which
+ * serves as the binding scope for the template instance the element is
+ * contained in. A template model is an instance of
+ * `TemplateInstanceBase`, and should be used to manipulate data
+ * associated with this template instance.
+ *
+ * Example:
+ *
+ * let model = modelForElement(el);
+ * if (model.index < 10) {
+ * model.set('item.checked', true);
+ * }
+ *
+ * @memberof Polymer.Templatize
+ * @param {HTMLTemplateElement} template The model will be returned for
+ * elements stamped from this template
+ * @param {Node=} node Node for which to return a template model.
+ * @return {TemplateInstanceBase} Template instance representing the
+ * binding scope for the element
+ */
+ modelForElement(template, node) {
+ let model;
+ while (node) {
+ // An element with a __templatizeInstance marks the top boundary
+ // of a scope; walk up until we find one, and then ensure that
+ // its __dataHost matches `this`, meaning this dom-repeat stamped it
+ if ((model = node.__templatizeInstance)) {
+ // Found an element stamped by another template; keep walking up
+ // from its __dataHost
+ if (model.__dataHost != template) {
+ node = model.__dataHost;
+ } else {
+ return model;
+ }
+ } else {
+ // Still in a template scope, keep going up until
+ // a __templatizeInstance is found
+ node = node.parentNode;
+ }
+ }
+ return null;
+ }
+ };
+
+ Polymer.TemplateInstanceBase = TemplateInstanceBase;
+
+ })();
+
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/unresolved.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/unresolved.html
new file mode 100644
index 00000000000..6c8752a97f2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/unresolved.html
@@ -0,0 +1,31 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<script>
+(function() {
+ 'use strict';
+
+ // unresolved
+
+ function resolve() {
+ document.body.removeAttribute('unresolved');
+ }
+
+ if (window.WebComponents) {
+ window.addEventListener('WebComponentsReady', resolve);
+ } else {
+ if (document.readyState === 'interactive' || document.readyState === 'complete') {
+ resolve();
+ } else {
+ window.addEventListener('DOMContentLoaded', resolve);
+ }
+ }
+
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/package-lock.json
new file mode 100644
index 00000000000..ebb58f4e7a0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/package-lock.json
@@ -0,0 +1,10899 @@
+{
+ "name": "@polymer/polymer",
+ "version": "2.6.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@polymer/gen-closure-declarations": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-closure-declarations/-/gen-closure-declarations-0.4.0.tgz",
+ "integrity": "sha512-gRDYxL/2nko1dJDIS+l+nc7BBzIz4x5LF+X+fskXcoiH+2A4PdCBeQXbCSpq9Dne5iig6MIr7GaK+Z3Y+5STCA==",
+ "dev": true,
+ "requires": {
+ "escodegen": "1.9.0",
+ "polymer-analyzer": "2.7.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.0.tgz",
+ "integrity": "sha512-a5DFXI3TdZSVOMH4608LVaBLmcr+mwM2+B8OSBiB9WFNCtdqzUXwtB5We6vBzrThXlO4uRo7d2pEqjNXMAlEkA==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.0",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "4.1.0",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.0",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.12"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-QQL70IC85hI6q9uQeresEMcT1Qf8YR/zDe1qG8WWeeFAZk8z0lmzUpsfcAWz+bM4wpDdXrtd4HitIs4p0CHl/w==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.96",
+ "@types/parse5": "2.2.34",
+ "babel-generator": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "jsonschema": "1.2.2",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "polymer-project-config": "3.8.1",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.1"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ }
+ }
+ }
+ }
+ },
+ "@polymer/sinonjs": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/@polymer/sinonjs/-/sinonjs-1.17.1.tgz",
+ "integrity": "sha512-/U8F/cOTrbF2iVVYgINYmvKbtbexs+89Q3v8AaHADRYabTg7aOZGOb0RyWpOI+sUJt04kj63U4FwMhzW5r4wZA==",
+ "dev": true
+ },
+ "@polymer/test-fixture": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@polymer/test-fixture/-/test-fixture-0.0.3.tgz",
+ "integrity": "sha1-REN1JpfU2Sk7vEEuoLXk00HxSdk=",
+ "dev": true
+ },
+ "@types/assert": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/assert/-/assert-0.0.29.tgz",
+ "integrity": "sha1-jlYnhbqlq9p8BKSfZmXq50MZKNM=",
+ "dev": true
+ },
+ "@types/babel-core": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-core/-/babel-core-6.25.3.tgz",
+ "integrity": "sha512-OlUjfM+Qv+XwcaucEiekBIhfAYe4q4ruvQZZcCkOtQZ27Hykxm1LLY2s0mE6LtP9XQt6x+TUvS70KW2e8Mz0ZA==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-template": "6.25.0",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-template": {
+ "version": "6.25.0",
+ "resolved": "https://registry.npmjs.org/@types/babel-template/-/babel-template-6.25.0.tgz",
+ "integrity": "sha512-TtyfVlrprX92xSuKa8D//7vFz5kBJODBw5IQ1hQXehqO+me26vt1fyNxOZyXhUq2a7jRyT72V8p68IyH4NEZNA==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/bluebird": {
+ "version": "3.5.20",
+ "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.20.tgz",
+ "integrity": "sha512-Wk41MVdF+cHBfVXj/ufUHJeO3BlIQr1McbHZANErMykaCWeDSZbH5erGjNBw2/3UlRdSxZbLfSuQTzFmPOYFsA==",
+ "dev": true
+ },
+ "@types/body-parser": {
+ "version": "1.16.8",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.16.8.tgz",
+ "integrity": "sha512-BdN2PXxOFnTXFcyONPW6t0fHjz2fvRZHVMFpaS0wYr+Y8fWEaNOs4V8LEu/fpzQlMx+ahdndgTaGTwPC+J/EeA==",
+ "dev": true,
+ "requires": {
+ "@types/express": "4.11.0",
+ "@types/node": "6.0.96"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/compression": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/compression/-/compression-0.0.33.tgz",
+ "integrity": "sha1-ldxzOiM5qoRjgdfxN3eS0lU9wn0=",
+ "dev": true,
+ "requires": {
+ "@types/express": "4.11.0"
+ }
+ },
+ "@types/content-type": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@types/content-type/-/content-type-1.1.2.tgz",
+ "integrity": "sha512-w2d7fBCYbCBUBTGtkC4JfX1FicTtgEmq7wTTjc7rC5RA/JdB1Bi7o88nKzUqAnIIBXJVmq0n4tTmF3PJN8QqCg==",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/escodegen": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/@types/escodegen/-/escodegen-0.0.2.tgz",
+ "integrity": "sha1-fOpBqyQukQ6xD2WuGK66RZ1ms18=",
+ "dev": true
+ },
+ "@types/estraverse": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estraverse/-/estraverse-0.0.6.tgz",
+ "integrity": "sha1-Zp9833KreX5hJfjQD+0z1M8wwiE=",
+ "dev": true,
+ "requires": {
+ "@types/estree": "0.0.37"
+ }
+ },
+ "@types/estree": {
+ "version": "0.0.37",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.37.tgz",
+ "integrity": "sha512-1IT6vNpmU9w18P3v6mN9idv18z5KPVTi4t7+rU9VLnkxo0LCam8IXy/eSVzOaQ1Wpabra2cN3A8K/SliPK/Suw==",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz",
+ "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==",
+ "dev": true
+ },
+ "@types/express": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.11.0.tgz",
+ "integrity": "sha512-N1Wdp3v4KmdO3W/CM7KXrDwM4xcVZjlHF2dAOs7sNrTUX8PY3G4n9NkaHlfjGFEfgFeHmRRjywoBd4VkujDs9w==",
+ "dev": true,
+ "requires": {
+ "@types/body-parser": "1.16.8",
+ "@types/express-serve-static-core": "4.11.1",
+ "@types/serve-static": "1.13.1"
+ }
+ },
+ "@types/express-serve-static-core": {
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.11.1.tgz",
+ "integrity": "sha512-EehCl3tpuqiM8RUb+0255M8PhhSwTtLfmO7zBBdv0ay/VTd/zmrqDfQdZFsa5z/PVMbH2yCMZPXsnrImpATyIw==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/node": "6.0.96"
+ }
+ },
+ "@types/freeport": {
+ "version": "1.0.21",
+ "resolved": "https://registry.npmjs.org/@types/freeport/-/freeport-1.0.21.tgz",
+ "integrity": "sha1-c/ZUPtZ9PKP/+XuYVZFZi3CSBm8=",
+ "dev": true,
+ "optional": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.96"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.96"
+ }
+ },
+ "@types/glob-stream": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@types/glob-stream/-/glob-stream-6.1.0.tgz",
+ "integrity": "sha512-RHv6ZQjcTncXo3thYZrsbAVwoy4vSKosSWhuhuQxLOTv74OJuFQxXkmUuZCr3q9uNBEVCvIzmZL/FeRNbHZGUg==",
+ "dev": true,
+ "requires": {
+ "@types/glob": "5.0.35",
+ "@types/node": "6.0.96"
+ }
+ },
+ "@types/launchpad": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@types/launchpad/-/launchpad-0.6.0.tgz",
+ "integrity": "sha1-NylhCbfyd/bmxf1+DAcGvJGPu1E=",
+ "dev": true,
+ "optional": true
+ },
+ "@types/mime": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-0.0.29.tgz",
+ "integrity": "sha1-+8/TMFc7kS71nu7hRgK/rOYwdUs=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/mz": {
+ "version": "0.0.31",
+ "resolved": "https://registry.npmjs.org/@types/mz/-/mz-0.0.31.tgz",
+ "integrity": "sha1-pNgMCC/v5x5Ap8DwfR5lVbu8e1I=",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.96"
+ }
+ },
+ "@types/node": {
+ "version": "6.0.96",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.96.tgz",
+ "integrity": "sha512-fsOOY6tMQ3jCB2wD51XFDmmpgm4wVKkJECdcVRqapbJEa7awJDcr+SaH8toz+4r4KW8YQ3M7ybXMoSDo1QGewA==",
+ "dev": true
+ },
+ "@types/opn": {
+ "version": "3.0.28",
+ "resolved": "https://registry.npmjs.org/@types/opn/-/opn-3.0.28.tgz",
+ "integrity": "sha1-CX0NHJtXSVc6XZbfEyOHu20CEYo=",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.96"
+ }
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.96"
+ }
+ },
+ "@types/pem": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@types/pem/-/pem-1.9.3.tgz",
+ "integrity": "sha512-+hHbGi9PAyHVeRdMJN6yNuMWoshJ+7oTqYuhBB1/vHq0Tfu46ucbvgxmhwBfe0GCiJZvCa20VHhHsA0mY5W6hQ==",
+ "dev": true
+ },
+ "@types/serve-static": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.1.tgz",
+ "integrity": "sha512-jDMH+3BQPtvqZVIcsH700Dfi8Q3MIcEx16g/VdxjoqiGR/NntekB10xdBpirMKnPe9z2C5cBmL0vte0YttOr3Q==",
+ "dev": true,
+ "requires": {
+ "@types/express-serve-static-core": "4.11.1",
+ "@types/mime": "0.0.29"
+ }
+ },
+ "@types/spdy": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/@types/spdy/-/spdy-3.4.4.tgz",
+ "integrity": "sha512-N9LBlbVRRYq6HgYpPkqQc3a9HJ/iEtVZToW6xlTtJiMhmRJ7jJdV7TaZQJw/Ve/1ePUsQiCTDc4JMuzzag94GA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.96"
+ }
+ },
+ "@types/ua-parser-js": {
+ "version": "0.7.32",
+ "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.32.tgz",
+ "integrity": "sha512-+z7Q72Mlnq6SFkQYHzLg2Z70pIsgRVzgx1b5PV8eUv5uaZ/zoqIs45XnhtToW4gTeX4FbjIP49nhIjyvPF4rPg==",
+ "dev": true
+ },
+ "@types/vinyl": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.2.tgz",
+ "integrity": "sha512-2iYpNuOl98SrLPBZfEN9Mh2JCJ2EI9HU35SfgBEb51DcmaHkhp8cKMblYeBqMQiwXMgAD3W60DbQ4i/UdLiXhw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.96"
+ }
+ },
+ "@types/vinyl-fs": {
+ "version": "0.0.28",
+ "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-0.0.28.tgz",
+ "integrity": "sha1-RmMBe8gCxlcOrk80Cf1cq/l8v94=",
+ "dev": true,
+ "requires": {
+ "@types/glob-stream": "6.1.0",
+ "@types/node": "6.0.96",
+ "@types/vinyl": "2.0.2"
+ }
+ },
+ "@types/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-ZrJDWpvg75LTGX4XwuneY9s6bF3OeZcGTpoGh3zDV9ytzcHMFsRrMIaLBRJZQMBoGyKs6unBQfVdrLZiYfb1zQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@types/winston": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.7.tgz",
+ "integrity": "sha512-jNhbkxPtt9xbzvihfA0OavjJbpCIyTDSmwE03BVXgCKcz9lwNsq4cg2wsNkY4Av5eH35ttBArhYtVJa6CIrg2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.96"
+ }
+ },
+ "@webcomponents/shadycss": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.1.1.tgz",
+ "integrity": "sha512-7iVMw1HU0e5tTxL1OIqw/RBGmnYuz1HUNd7t1UYq7VmoBOl5Zm4g3spUBSksyd97SiXauFlXAeSpA0/in9k+dw==",
+ "dev": true
+ },
+ "@webcomponents/webcomponentsjs": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-1.1.0.tgz",
+ "integrity": "sha512-7toNyVlrl7vJnY3PU0eXIK1KWq8phfnEe1IwOdCMxkIl/BfUkUB2aaVs45R0LSx1qxHRnkqj0vlGtskUvKkNkA==",
+ "dev": true
+ },
+ "abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "dev": true
+ },
+ "accepts": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz",
+ "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=",
+ "dev": true,
+ "requires": {
+ "mime-types": "2.1.17",
+ "negotiator": "0.6.1"
+ }
+ },
+ "accessibility-developer-tools": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz",
+ "integrity": "sha1-PaDM6dbsY3OWS4TzXbfPw996tRQ=",
+ "dev": true
+ },
+ "acorn": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz",
+ "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+ "dev": true,
+ "requires": {
+ "acorn": "3.3.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+ "dev": true
+ }
+ }
+ },
+ "adm-zip": {
+ "version": "0.4.7",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz",
+ "integrity": "sha1-hgbCy/HEJs6MjsABdER/1Jtur8E=",
+ "dev": true,
+ "optional": true
+ },
+ "after": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
+ "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
+ "dev": true
+ },
+ "agent-base": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz",
+ "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "extend": "3.0.1",
+ "semver": "5.0.3"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz",
+ "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "dev": true,
+ "requires": {
+ "co": "4.6.0",
+ "fast-deep-equal": "1.0.0",
+ "fast-json-stable-stringify": "2.0.0",
+ "json-schema-traverse": "0.3.1"
+ }
+ },
+ "ajv-keywords": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
+ "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
+ "dev": true
+ },
+ "ansi-align": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
+ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
+ "dev": true,
+ "requires": {
+ "string-width": "2.1.1"
+ }
+ },
+ "ansi-colors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.0.1.tgz",
+ "integrity": "sha512-yopkAU0ZD/WQ56Tms3xLn6jRuX3SyUMAVi0FdmDIbmmnHW3jHiI1sQFdUl3gfVddjnrsP3Y6ywFKvCRopvoVIA==",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-cyan": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
+ "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.0.0.tgz",
+ "integrity": "sha512-v+0wW9Wezwsyb0uF4aBVCjmSqit3Ru7PZFziGF0o2KwTvN2zWfTi3BRLq9EkJFdg3eBbyERXGTntVpBxH1J68Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0"
+ }
+ },
+ "ansi-escapes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz",
+ "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==",
+ "dev": true
+ },
+ "ansi-gray": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
+ "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-red": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
+ "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "ansi-wrap": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
+ "dev": true
+ },
+ "any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=",
+ "dev": true
+ },
+ "append-field": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/append-field/-/append-field-0.1.0.tgz",
+ "integrity": "sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo=",
+ "dev": true
+ },
+ "archiver": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz",
+ "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=",
+ "dev": true,
+ "requires": {
+ "archiver-utils": "1.3.0",
+ "async": "2.6.0",
+ "buffer-crc32": "0.2.13",
+ "glob": "7.1.2",
+ "lodash": "4.17.4",
+ "readable-stream": "2.3.3",
+ "tar-stream": "1.5.2",
+ "walkdir": "0.0.11",
+ "zip-stream": "1.2.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "requires": {
+ "lodash": "4.17.4"
+ }
+ }
+ }
+ },
+ "archiver-utils": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz",
+ "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2",
+ "graceful-fs": "4.1.11",
+ "lazystream": "1.0.0",
+ "lodash": "4.17.4",
+ "normalize-path": "2.1.1",
+ "readable-stream": "2.3.3"
+ }
+ },
+ "archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
+ "dev": true
+ },
+ "argparse": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
+ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "1.0.3"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ },
+ "dependencies": {
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ }
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-differ": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
+ "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
+ "dev": true
+ },
+ "array-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
+ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
+ "dev": true
+ },
+ "array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+ "dev": true
+ },
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
+ "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
+ "dev": true
+ },
+ "array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "dev": true,
+ "requires": {
+ "array-uniq": "1.0.3"
+ }
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "arraybuffer.slice": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
+ "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==",
+ "dev": true
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+ "dev": true
+ },
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+ "dev": true
+ },
+ "asn1": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
+ "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
+ "dev": true
+ },
+ "assert-plus": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
+ "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
+ "dev": true
+ },
+ "assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "async-limiter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
+ "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
+ "dev": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz",
+ "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=",
+ "dev": true
+ },
+ "aws-sign2": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
+ "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
+ "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-core": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz",
+ "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-generator": "6.26.0",
+ "babel-helpers": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-register": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "convert-source-map": "1.5.1",
+ "debug": "2.6.9",
+ "json5": "0.5.1",
+ "lodash": "4.17.4",
+ "minimatch": "3.0.4",
+ "path-is-absolute": "1.0.1",
+ "private": "0.1.8",
+ "slash": "1.0.0",
+ "source-map": "0.5.7"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz",
+ "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.4",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "babel-helper-call-delegate": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+ "dev": true,
+ "requires": {
+ "babel-helper-hoist-variables": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-define-map": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
+ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+ "dev": true,
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.4"
+ }
+ },
+ "babel-helper-evaluate-path": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.2.0.tgz",
+ "integrity": "sha512-0EK9TUKMxHL549hWDPkQoS7R0Ozg1CDLheVBHYds2B2qoAvmr9ejY3zOXFsrICK73TN7bPhU14PBeKc8jcBTwg==",
+ "dev": true
+ },
+ "babel-helper-flip-expressions": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.2.0.tgz",
+ "integrity": "sha512-rAsPA1pWBc7e2E6HepkP2e1sXugT+Oq/VCqhyuHJ8aJ2d/ifwnJfd4Qxjm21qlW43AN8tqaeByagKK6wECFMSw==",
+ "dev": true
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-hoist-variables": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-is-nodes-equiv": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz",
+ "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=",
+ "dev": true
+ },
+ "babel-helper-is-void-0": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.2.0.tgz",
+ "integrity": "sha512-Axj1AYuD0E3Dl7nT3KxROP7VekEofz3XtEljzURf3fABalLpr8PamtgLFt+zuxtaCxRf9iuZmbAMMYWri5Bazw==",
+ "dev": true
+ },
+ "babel-helper-mark-eval-scopes": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.2.0.tgz",
+ "integrity": "sha512-KJuwrOUcHbvbh6he4xRXZFLaivK9DF9o3CrvpWnK1Wp0B+1ANYABXBMgwrnNFIDK/AvicxQ9CNr8wsgivlp4Aw==",
+ "dev": true
+ },
+ "babel-helper-optimise-call-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-regex": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
+ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.4"
+ }
+ },
+ "babel-helper-remove-or-void": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.2.0.tgz",
+ "integrity": "sha512-1Z41upf/XR+PwY7Nd+F15Jo5BiQi5205ZXUuKed3yoyQgDkMyoM7vAdjEJS/T+M6jy32sXjskMUgms4zeiVtRA==",
+ "dev": true
+ },
+ "babel-helper-replace-supers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+ "dev": true,
+ "requires": {
+ "babel-helper-optimise-call-expression": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-to-multiple-sequence-expressions": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.2.0.tgz",
+ "integrity": "sha512-ij9lpfdP3+Zc/7kNwa+NXbTrUlsYEWPwt/ugmQO0qflzLrveTIkbfOqQztvitk81aG5NblYDQXDlRohzu3oa8Q==",
+ "dev": true
+ },
+ "babel-helpers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
+ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-minify-builtins": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.2.0.tgz",
+ "integrity": "sha512-4i+8ntaS8gwVUcOz5y+zE+55OVOl2nTbmHV51D4wAIiKcRI8U5K//ip1GHfhsgk/NJrrHK7h97Oy5jpqt0Iixg==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-constant-folding": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.2.0.tgz",
+ "integrity": "sha512-B3ffQBEUQ8ydlIkYv2MkZtTCbV7FAkWAV7NkyhcXlGpD10PaCxNGQ/B9oguXGowR1m16Q5nGhvNn8Pkn1MO6Hw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-dead-code-elimination": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.2.0.tgz",
+ "integrity": "sha512-zE7y3pRyzA4zK5nBou0kTcwUTSQ/AiFrynt1cIEYN7vcO2gS9ZFZoI0aO9JYLUdct5fsC1vfB35408yrzTyVfg==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.2.0",
+ "babel-helper-mark-eval-scopes": "0.2.0",
+ "babel-helper-remove-or-void": "0.2.0",
+ "lodash.some": "4.6.0"
+ }
+ },
+ "babel-plugin-minify-flip-comparisons": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.2.0.tgz",
+ "integrity": "sha512-QOqXSEmD/LhT3LpM1WCyzAGcQZYYKJF7oOHvS6QbpomHenydrV53DMdPX2mK01icBExKZcJAHF209wvDBa+CSg==",
+ "dev": true,
+ "requires": {
+ "babel-helper-is-void-0": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-guarded-expressions": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.2.0.tgz",
+ "integrity": "sha512-5+NSPdRQ9mnrHaA+zFj+D5OzmSiv90EX5zGH6cWQgR/OUqmCHSDqgTRPFvOctgpo8MJyO7Rt7ajs2UfLnlAwYg==",
+ "dev": true,
+ "requires": {
+ "babel-helper-flip-expressions": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-infinity": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.2.0.tgz",
+ "integrity": "sha512-U694vrla1lN6vDHWGrR832t3a/A2eh+kyl019LxEE2+sS4VTydyOPRsAOIYAdJegWRA4cMX1lm9azAN0cLIr8g==",
+ "dev": true
+ },
+ "babel-plugin-minify-mangle-names": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.2.0.tgz",
+ "integrity": "sha512-Gixuak1/CO7VCdjn15/8Bxe/QsAtDG4zPbnsNoe1mIJGCIH/kcmSjFhMlGJtXDQZd6EKzeMfA5WmX9+jvGRefw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-mark-eval-scopes": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-numeric-literals": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.2.0.tgz",
+ "integrity": "sha512-VcLpb+r1YS7+RIOXdRsFVLLqoh22177USpHf+JM/g1nZbzdqENmfd5v534MLAbRErhbz6SyK+NQViVzVtBxu8g==",
+ "dev": true
+ },
+ "babel-plugin-minify-replace": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.2.0.tgz",
+ "integrity": "sha512-SEW6zoSVxh3OH6E1LCgyhhTWMnCv+JIRu5h5IlJDA11tU4ZeSF7uPQcO4vN/o52+FssRB26dmzJ/8D+z0QPg5Q==",
+ "dev": true
+ },
+ "babel-plugin-minify-simplify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.2.0.tgz",
+ "integrity": "sha512-Mj3Mwy2zVosMfXDWXZrQH5/uMAyfJdmDQ1NVqit+ArbHC3LlXVzptuyC1JxTyai/wgFvjLaichm/7vSUshkWqw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-flip-expressions": "0.2.0",
+ "babel-helper-is-nodes-equiv": "0.0.1",
+ "babel-helper-to-multiple-sequence-expressions": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-type-constructors": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.2.0.tgz",
+ "integrity": "sha512-NiOvvA9Pq6bki6nP4BayXwT5GZadw7DJFDDzHmkpnOQpENWe8RtHtKZM44MG1R6EQ5XxgbLdsdhswIzTkFlO5g==",
+ "dev": true,
+ "requires": {
+ "babel-helper-is-void-0": "0.2.0"
+ }
+ },
+ "babel-plugin-transform-es2015-arrow-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-block-scoped-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-block-scoping": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.4"
+ }
+ },
+ "babel-plugin-transform-es2015-classes": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+ "dev": true,
+ "requires": {
+ "babel-helper-define-map": "6.26.0",
+ "babel-helper-function-name": "6.24.1",
+ "babel-helper-optimise-call-expression": "6.24.1",
+ "babel-helper-replace-supers": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-computed-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-destructuring": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-duplicate-keys": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-for-of": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+ "dev": true,
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-amd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-commonjs": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz",
+ "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-strict-mode": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-object-super": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+ "dev": true,
+ "requires": {
+ "babel-helper-replace-supers": "6.24.1",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-parameters": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+ "dev": true,
+ "requires": {
+ "babel-helper-call-delegate": "6.24.1",
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-shorthand-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-spread": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-sticky-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+ "dev": true,
+ "requires": {
+ "babel-helper-regex": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-template-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-typeof-symbol": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-unicode-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+ "dev": true,
+ "requires": {
+ "babel-helper-regex": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "regexpu-core": "2.0.0"
+ }
+ },
+ "babel-plugin-transform-inline-consecutive-adds": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.2.0.tgz",
+ "integrity": "sha512-GlhOuLOQ28ua9prg0hT33HslCrEmz9xWXy9ZNZSACppCyRxxRW+haYtRgm7uYXCcd0q8ggCWD2pfWEJp5iiZfQ==",
+ "dev": true
+ },
+ "babel-plugin-transform-member-expression-literals": {
+ "version": "6.8.5",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.8.5.tgz",
+ "integrity": "sha512-Ux3ligf+ukzWaCbBYOstDuFBhRgMiJHlpJBKV4P47qtzVkd0lg1ddPj9fqIJqAM0n+CvxipyrZrnNnw3CdtQCg==",
+ "dev": true
+ },
+ "babel-plugin-transform-merge-sibling-variables": {
+ "version": "6.8.6",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.8.6.tgz",
+ "integrity": "sha512-o5Jioq553HtEAUN5uty7ELJMenXIxHI3PIs1yLqYWYQwP6mg6IPVAJ+U7i4zr9XGF/kb2RGsdehglGTV+vngqA==",
+ "dev": true
+ },
+ "babel-plugin-transform-minify-booleans": {
+ "version": "6.8.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.8.3.tgz",
+ "integrity": "sha512-bPbUhkeN2Nc0KH0/A19GwQGj8w+CvdJzyu8t59VoEDgsNMQ9Bopzi5DrVkrSsVjbYUaZpzq/DYLrH+wD5K2Tig==",
+ "dev": true
+ },
+ "babel-plugin-transform-property-literals": {
+ "version": "6.8.5",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.8.5.tgz",
+ "integrity": "sha512-MmiQsQ5AcIaRZMJD0zY5C4H3xuHm06/nWgtOsz7AXV44VEIXIlPiJ39IFYJ4Qx67/fEm8zJAedzR8t+B7d10Bg==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "babel-plugin-transform-regenerator": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
+ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+ "dev": true,
+ "requires": {
+ "regenerator-transform": "0.10.1"
+ }
+ },
+ "babel-plugin-transform-regexp-constructors": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.2.0.tgz",
+ "integrity": "sha512-7IsQ6aQx6LAaOqy97/PthTf+5Nx9grZww3r6E62IdWe76Yr8KsuwVjxzqSPQvESJqTE3EMADQ9S0RtwWDGNG9Q==",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-console": {
+ "version": "6.8.5",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.8.5.tgz",
+ "integrity": "sha512-uuCKvtweCyIvvC8fi92EcWRtO2Kt5KMNMRK6BhpDXdeb3sxvGM7453RSmgeu4DlKns3OlvY9Ep5Q9m5a7RQAgg==",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-debugger": {
+ "version": "6.8.5",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.8.5.tgz",
+ "integrity": "sha512-InDQDdHPOLJKM+G6oXrEesf+P29QFBmcTXID+TAvZziVz+38xe2VO/Bn3FcRcRtnOOycbgsJkUNp9jIK+ist6g==",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-undefined": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.2.0.tgz",
+ "integrity": "sha512-O8v57tPMHkp89kA4ZfQEYds/pzgvz/QYerBJjIuL5/Jc7RnvMVRA5gJY9zFKP7WayW8WOSBV4vh8Y8FJRio+ow==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.2.0"
+ }
+ },
+ "babel-plugin-transform-simplify-comparison-operators": {
+ "version": "6.8.5",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.8.5.tgz",
+ "integrity": "sha512-B3HlBZb+Uq86nRj5yNPO6pJ3noEdqHvzYkEYoUWtrsWTv48ZIRatYlumoOiif/v8llF13YjYjx9zhyznDx+N9g==",
+ "dev": true
+ },
+ "babel-plugin-transform-strict-mode": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-undefined-to-void": {
+ "version": "6.8.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.8.3.tgz",
+ "integrity": "sha512-goYwp8dMrzHD6x9GjZ2M85Mk2vxf1h85CnUgAjfftUnlJvzF4uj5MrbReHBTbjQ96C8CuRzvhYZ3tv8H3Sc1ZA==",
+ "dev": true
+ },
+ "babel-polyfill": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
+ "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.10.5"
+ },
+ "dependencies": {
+ "regenerator-runtime": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+ "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
+ "dev": true
+ }
+ }
+ },
+ "babel-preset-minify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.2.0.tgz",
+ "integrity": "sha512-mR8Q44RmMzm18bM2Lqd9uiPopzk5GDCtVuquNbLFmX6lOKnqWoenaNBxnWW0UhBFC75lEHTIgNGCbnsRI0pJVw==",
+ "dev": true,
+ "requires": {
+ "babel-plugin-minify-builtins": "0.2.0",
+ "babel-plugin-minify-constant-folding": "0.2.0",
+ "babel-plugin-minify-dead-code-elimination": "0.2.0",
+ "babel-plugin-minify-flip-comparisons": "0.2.0",
+ "babel-plugin-minify-guarded-expressions": "0.2.0",
+ "babel-plugin-minify-infinity": "0.2.0",
+ "babel-plugin-minify-mangle-names": "0.2.0",
+ "babel-plugin-minify-numeric-literals": "0.2.0",
+ "babel-plugin-minify-replace": "0.2.0",
+ "babel-plugin-minify-simplify": "0.2.0",
+ "babel-plugin-minify-type-constructors": "0.2.0",
+ "babel-plugin-transform-inline-consecutive-adds": "0.2.0",
+ "babel-plugin-transform-member-expression-literals": "6.8.5",
+ "babel-plugin-transform-merge-sibling-variables": "6.8.6",
+ "babel-plugin-transform-minify-booleans": "6.8.3",
+ "babel-plugin-transform-property-literals": "6.8.5",
+ "babel-plugin-transform-regexp-constructors": "0.2.0",
+ "babel-plugin-transform-remove-console": "6.8.5",
+ "babel-plugin-transform-remove-debugger": "6.8.5",
+ "babel-plugin-transform-remove-undefined": "0.2.0",
+ "babel-plugin-transform-simplify-comparison-operators": "6.8.5",
+ "babel-plugin-transform-undefined-to-void": "6.8.3",
+ "lodash.isplainobject": "4.0.6"
+ }
+ },
+ "babel-register": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
+ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+ "dev": true,
+ "requires": {
+ "babel-core": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "core-js": "2.5.3",
+ "home-or-tmp": "2.0.0",
+ "lodash": "4.17.4",
+ "mkdirp": "0.5.1",
+ "source-map-support": "0.4.18"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.4"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.2",
+ "lodash": "4.17.4"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.4",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "backo2": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+ "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.0",
+ "pascalcase": "0.1.1"
+ }
+ },
+ "base64-arraybuffer": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
+ "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
+ "dev": true
+ },
+ "base64-js": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz",
+ "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=",
+ "dev": true,
+ "optional": true
+ },
+ "base64id": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
+ "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=",
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
+ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "beeper": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz",
+ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=",
+ "dev": true
+ },
+ "better-assert": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
+ "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
+ "dev": true,
+ "requires": {
+ "callsite": "1.0.0"
+ }
+ },
+ "binaryextensions": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-1.0.1.tgz",
+ "integrity": "sha1-HmN0iLNbWL2l9HdL+WpSEqjJB1U=",
+ "dev": true
+ },
+ "bl": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz",
+ "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.3"
+ }
+ },
+ "blob": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
+ "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=",
+ "dev": true
+ },
+ "body-parser": {
+ "version": "1.18.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
+ "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
+ "dev": true,
+ "requires": {
+ "bytes": "3.0.0",
+ "content-type": "1.0.4",
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "http-errors": "1.6.2",
+ "iconv-lite": "0.4.19",
+ "on-finished": "2.3.0",
+ "qs": "6.5.1",
+ "raw-body": "2.3.2",
+ "type-is": "1.6.15"
+ }
+ },
+ "boom": {
+ "version": "2.10.1",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
+ "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
+ "dev": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "boxen": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
+ "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
+ "dev": true,
+ "requires": {
+ "ansi-align": "2.0.0",
+ "camelcase": "4.1.0",
+ "chalk": "2.3.0",
+ "cli-boxes": "1.0.0",
+ "string-width": "2.1.1",
+ "term-size": "1.2.0",
+ "widest-line": "2.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ }
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
+ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.0.tgz",
+ "integrity": "sha512-P4O8UQRdGiMLWSizsApmXVQDBS6KCt7dSexgLKBmH5Hr1CZq7vsnscFh8oR1sP1ab1Zj0uCHCEzZeV6SfUf3rA==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.1",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.1"
+ }
+ },
+ "browser-capabilities": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/browser-capabilities/-/browser-capabilities-0.2.2.tgz",
+ "integrity": "sha512-iS5g9+yT/T7jr9BTjDi5Hu2soieyce457ad+fdp6uDlYp6pacX7ZG/nYtCZ+KQiMCxRfbd65OhAg7GbVJ3RcBw==",
+ "dev": true,
+ "requires": {
+ "@types/ua-parser-js": "0.7.32",
+ "ua-parser-js": "0.7.17"
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
+ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
+ "dev": true
+ },
+ "browserstack": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.0.tgz",
+ "integrity": "sha1-tWVCWtYu1ywQgqHrl51TE8fUdU8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "https-proxy-agent": "1.0.0"
+ }
+ },
+ "buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
+ "dev": true
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "busboy": {
+ "version": "0.2.14",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz",
+ "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=",
+ "dev": true,
+ "requires": {
+ "dicer": "0.2.5",
+ "readable-stream": "1.1.14"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+ "dev": true
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "caller-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+ "dev": true,
+ "requires": {
+ "callsites": "0.2.0"
+ }
+ },
+ "callsite": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
+ "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
+ "dev": true
+ },
+ "callsites": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "2.1.1",
+ "map-obj": "1.0.1"
+ }
+ },
+ "capture-stack-trace": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz",
+ "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
+ "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
+ "dev": true
+ },
+ "chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
+ "dev": true,
+ "requires": {
+ "assertion-error": "1.1.0",
+ "check-error": "1.0.2",
+ "deep-eql": "3.0.1",
+ "get-func-name": "2.0.0",
+ "pathval": "1.1.0",
+ "type-detect": "4.0.7"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "chardet": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
+ "dev": true
+ },
+ "charenc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+ "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=",
+ "dev": true
+ },
+ "check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+ "dev": true
+ },
+ "circular-json": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
+ "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
+ "dev": true
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "cleankill": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/cleankill/-/cleankill-2.0.0.tgz",
+ "integrity": "sha1-WYMN/ItBHVPccq0J1Fp46jMWGpE=",
+ "dev": true
+ },
+ "cli-boxes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
+ "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
+ "dev": true
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "2.0.0"
+ }
+ },
+ "cli-width": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+ "dev": true
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "clone-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+ "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
+ "dev": true
+ },
+ "cloneable-readable": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz",
+ "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "process-nextick-args": "1.0.7",
+ "through2": "2.0.3"
+ }
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
+ "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "1.0.0"
+ }
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ },
+ "dependencies": {
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ }
+ }
+ },
+ "command-line-usage": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
+ "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "4.0.0",
+ "array-back": "2.0.0",
+ "table-layout": "0.4.2",
+ "typical": "2.6.1"
+ }
+ },
+ "commander": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
+ "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
+ "dev": true,
+ "requires": {
+ "graceful-readlink": "1.0.1"
+ }
+ },
+ "component-bind": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
+ "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
+ "dev": true
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "component-inherit": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
+ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
+ "dev": true
+ },
+ "compress-commons": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz",
+ "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=",
+ "dev": true,
+ "requires": {
+ "buffer-crc32": "0.2.13",
+ "crc32-stream": "2.0.0",
+ "normalize-path": "2.1.1",
+ "readable-stream": "2.3.3"
+ }
+ },
+ "compressible": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.12.tgz",
+ "integrity": "sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY=",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.30.0"
+ }
+ },
+ "compression": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.1.tgz",
+ "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=",
+ "dev": true,
+ "requires": {
+ "accepts": "1.3.4",
+ "bytes": "3.0.0",
+ "compressible": "2.0.12",
+ "debug": "2.6.9",
+ "on-headers": "1.0.1",
+ "safe-buffer": "5.1.1",
+ "vary": "1.1.2"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "concat-stream": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
+ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.3",
+ "typedarray": "0.0.6"
+ }
+ },
+ "configstore": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz",
+ "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==",
+ "dev": true,
+ "requires": {
+ "dot-prop": "4.2.0",
+ "graceful-fs": "4.1.11",
+ "make-dir": "1.1.0",
+ "unique-string": "1.0.0",
+ "write-file-atomic": "2.3.0",
+ "xdg-basedir": "3.0.0"
+ }
+ },
+ "content-disposition": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+ "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
+ "dev": true
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "dev": true
+ },
+ "convert-source-map": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
+ "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
+ "dev": true
+ },
+ "cookie": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
+ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
+ "dev": true
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "crc": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/crc/-/crc-3.2.1.tgz",
+ "integrity": "sha1-XZyPt3okXNXsopHl0tAFM0urAII=",
+ "dev": true
+ },
+ "crc32-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz",
+ "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=",
+ "dev": true,
+ "requires": {
+ "crc": "3.5.0",
+ "readable-stream": "2.3.3"
+ },
+ "dependencies": {
+ "crc": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz",
+ "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=",
+ "dev": true
+ }
+ }
+ },
+ "create-error-class": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+ "dev": true,
+ "requires": {
+ "capture-stack-trace": "1.0.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "4.1.1",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
+ "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "1.0.2",
+ "yallist": "2.1.2"
+ }
+ }
+ }
+ },
+ "crypt": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+ "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=",
+ "dev": true
+ },
+ "cryptiles": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
+ "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
+ "dev": true,
+ "requires": {
+ "boom": "2.10.1"
+ }
+ },
+ "crypto-random-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
+ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "dev": true,
+ "requires": {
+ "array-find-index": "1.0.2"
+ }
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "dateformat": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
+ "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-eql": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "dev": true,
+ "requires": {
+ "type-detect": "4.0.7"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
+ "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "defaults": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.3"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
+ "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=",
+ "dev": true
+ }
+ }
+ },
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "del": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
+ "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
+ "dev": true,
+ "requires": {
+ "globby": "6.1.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.0",
+ "p-map": "1.2.0",
+ "pify": "3.0.0",
+ "rimraf": "2.6.2"
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true
+ },
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+ "dev": true
+ },
+ "deprecated": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz",
+ "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=",
+ "dev": true
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+ "dev": true
+ },
+ "detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "detect-node": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz",
+ "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=",
+ "dev": true
+ },
+ "dicer": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz",
+ "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.1.14",
+ "streamsearch": "0.1.2"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "diff": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz",
+ "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom-serializer": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
+ "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1.1.3",
+ "entities": "1.1.1"
+ },
+ "dependencies": {
+ "domelementtype": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
+ "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
+ "dev": true
+ }
+ }
+ },
+ "dom-urls": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz",
+ "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=",
+ "dev": true,
+ "requires": {
+ "urijs": "1.19.0"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "domelementtype": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
+ "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
+ "dev": true
+ },
+ "domhandler": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz",
+ "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1.3.0"
+ }
+ },
+ "domutils": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.6.2.tgz",
+ "integrity": "sha1-GVjMC0yUJuntNn+xyOhUiRsPo/8=",
+ "dev": true,
+ "requires": {
+ "dom-serializer": "0.1.0",
+ "domelementtype": "1.3.0"
+ }
+ },
+ "dot-prop": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
+ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
+ "dev": true,
+ "requires": {
+ "is-obj": "1.0.1"
+ }
+ },
+ "duplexer": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
+ "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
+ "dev": true
+ },
+ "duplexer2": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
+ "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.1.14"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "duplexer3": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+ "dev": true
+ },
+ "duplexify": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.3.tgz",
+ "integrity": "sha512-g8ID9OroF9hKt2POf8YLayy+9594PzmM3scI00/uBXocX3TWNgoB67hjzkFe9ITAbQOne/lLdBxHXvYUM4ZgGA==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.3",
+ "stream-shift": "1.0.0"
+ },
+ "dependencies": {
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0"
+ }
+ }
+ }
+ },
+ "ecc-jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
+ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "jsbn": "0.1.1"
+ }
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+ "dev": true
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+ "dev": true
+ },
+ "end-of-stream": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz",
+ "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=",
+ "dev": true,
+ "requires": {
+ "once": "1.3.3"
+ },
+ "dependencies": {
+ "once": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
+ "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ }
+ }
+ },
+ "engine.io": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.4.tgz",
+ "integrity": "sha1-PQIRtwpVLOhB/8fahiezAamkFi4=",
+ "dev": true,
+ "requires": {
+ "accepts": "1.3.3",
+ "base64id": "1.0.0",
+ "cookie": "0.3.1",
+ "debug": "2.6.9",
+ "engine.io-parser": "2.1.2",
+ "uws": "0.14.5",
+ "ws": "3.3.3"
+ },
+ "dependencies": {
+ "accepts": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz",
+ "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=",
+ "dev": true,
+ "requires": {
+ "mime-types": "2.1.17",
+ "negotiator": "0.6.1"
+ }
+ }
+ }
+ },
+ "engine.io-client": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.4.tgz",
+ "integrity": "sha1-T88TcLRxY70s6b4nM5ckMDUNTqE=",
+ "dev": true,
+ "requires": {
+ "component-emitter": "1.2.1",
+ "component-inherit": "0.0.3",
+ "debug": "2.6.9",
+ "engine.io-parser": "2.1.2",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "parseqs": "0.0.5",
+ "parseuri": "0.0.5",
+ "ws": "3.3.3",
+ "xmlhttprequest-ssl": "1.5.5",
+ "yeast": "0.1.2"
+ }
+ },
+ "engine.io-parser": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz",
+ "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==",
+ "dev": true,
+ "requires": {
+ "after": "0.8.2",
+ "arraybuffer.slice": "0.0.7",
+ "base64-arraybuffer": "0.1.5",
+ "blob": "0.0.4",
+ "has-binary2": "1.0.2"
+ }
+ },
+ "entities": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
+ "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
+ "dev": true
+ },
+ "error-ex": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "0.2.1"
+ }
+ },
+ "es6-promise": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz",
+ "integrity": "sha1-lu258v2wGZWCKyY92KratnSBgbw=",
+ "dev": true
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz",
+ "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.5.7"
+ }
+ },
+ "eslint": {
+ "version": "4.16.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.16.0.tgz",
+ "integrity": "sha512-YVXV4bDhNoHHcv0qzU4Meof7/P26B4EuaktMi5L1Tnt52Aov85KmYA8c5D+xyZr/BkhvwUqr011jDSD/QTULxg==",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "babel-code-frame": "6.26.0",
+ "chalk": "2.3.0",
+ "concat-stream": "1.6.0",
+ "cross-spawn": "5.1.0",
+ "debug": "3.1.0",
+ "doctrine": "2.1.0",
+ "eslint-scope": "3.7.1",
+ "eslint-visitor-keys": "1.0.0",
+ "espree": "3.5.2",
+ "esquery": "1.0.0",
+ "esutils": "2.0.2",
+ "file-entry-cache": "2.0.0",
+ "functional-red-black-tree": "1.0.1",
+ "glob": "7.1.2",
+ "globals": "11.2.0",
+ "ignore": "3.3.7",
+ "imurmurhash": "0.1.4",
+ "inquirer": "3.3.0",
+ "is-resolvable": "1.1.0",
+ "js-yaml": "3.10.0",
+ "json-stable-stringify-without-jsonify": "1.0.1",
+ "levn": "0.3.0",
+ "lodash": "4.17.4",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.1",
+ "natural-compare": "1.4.0",
+ "optionator": "0.8.2",
+ "path-is-inside": "1.0.2",
+ "pluralize": "7.0.0",
+ "progress": "2.0.0",
+ "require-uncached": "1.0.3",
+ "semver": "5.5.0",
+ "strip-ansi": "4.0.0",
+ "strip-json-comments": "2.0.1",
+ "table": "4.0.2",
+ "text-table": "0.2.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.2.0.tgz",
+ "integrity": "sha512-RDC7Tj17I/56wpVvCVLSXtnn2Fo6CQZ9vaj+ARn+qlzm/ozbKQZe+j9fvHZCbSq+4JSGjTpKEt7p/AA1IKXRFA==",
+ "dev": true
+ },
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "eslint-plugin-html": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-4.0.2.tgz",
+ "integrity": "sha512-CrQd0F8GWdNWnu4PFrYZl+LjUCXNVy2h0uhDMtnf/7VKc9HRcnkXSrlg0BSGfptZPSzmwnnwCaREAa9+fnQhYw==",
+ "dev": true,
+ "requires": {
+ "htmlparser2": "3.9.2"
+ }
+ },
+ "eslint-scope": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
+ "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
+ "dev": true,
+ "requires": {
+ "esrecurse": "4.2.0",
+ "estraverse": "4.2.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
+ "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
+ "dev": true
+ },
+ "espree": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz",
+ "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==",
+ "dev": true,
+ "requires": {
+ "acorn": "5.3.0",
+ "acorn-jsx": "3.0.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz",
+ "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=",
+ "dev": true,
+ "requires": {
+ "estraverse": "4.2.0"
+ }
+ },
+ "esrecurse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz",
+ "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=",
+ "dev": true,
+ "requires": {
+ "estraverse": "4.2.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+ "dev": true
+ },
+ "eventemitter3": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz",
+ "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=",
+ "dev": true
+ },
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "5.1.0",
+ "get-stream": "3.0.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.2",
+ "strip-eof": "1.0.0"
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.0",
+ "snapdragon": "0.8.1",
+ "to-regex": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "expand-range": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+ "dev": true,
+ "requires": {
+ "fill-range": "2.2.3"
+ },
+ "dependencies": {
+ "fill-range": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
+ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
+ "dev": true,
+ "requires": {
+ "is-number": "2.1.0",
+ "isobject": "2.1.0",
+ "randomatic": "1.1.7",
+ "repeat-element": "1.1.2",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "1.0.1"
+ }
+ },
+ "express": {
+ "version": "4.16.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz",
+ "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=",
+ "dev": true,
+ "requires": {
+ "accepts": "1.3.4",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.18.2",
+ "content-disposition": "0.5.2",
+ "content-type": "1.0.4",
+ "cookie": "0.3.1",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.8.1",
+ "finalhandler": "1.1.0",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "1.1.2",
+ "on-finished": "2.3.0",
+ "parseurl": "1.3.2",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "2.0.2",
+ "qs": "6.5.1",
+ "range-parser": "1.2.0",
+ "safe-buffer": "5.1.1",
+ "send": "0.16.1",
+ "serve-static": "1.13.1",
+ "setprototypeof": "1.1.0",
+ "statuses": "1.3.1",
+ "type-is": "1.6.15",
+ "utils-merge": "1.0.1",
+ "vary": "1.1.2"
+ },
+ "dependencies": {
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+ "dev": true
+ },
+ "send": {
+ "version": "0.16.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz",
+ "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "destroy": "1.0.4",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "1.6.2",
+ "mime": "1.4.1",
+ "ms": "2.0.0",
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.0",
+ "statuses": "1.3.1"
+ }
+ },
+ "setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+ "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+ "dev": true
+ }
+ }
+ },
+ "extend": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "external-editor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz",
+ "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==",
+ "dev": true,
+ "requires": {
+ "chardet": "0.4.2",
+ "iconv-lite": "0.4.19",
+ "tmp": "0.0.33"
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.0",
+ "snapdragon": "0.8.1",
+ "to-regex": "3.0.1"
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fancy-log": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
+ "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
+ "dev": true,
+ "requires": {
+ "ansi-gray": "0.1.1",
+ "color-support": "1.1.3",
+ "time-stamp": "1.1.0"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz",
+ "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fd-slicer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
+ "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "pend": "1.2.0"
+ }
+ },
+ "feature-detect-es6": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/feature-detect-es6/-/feature-detect-es6-1.4.0.tgz",
+ "integrity": "sha512-7OnRV38WLydGuGcdm/fGk2SG9uo5ljslBSbPhCfEW5Gl0lX/IliaAVXYiYUBcI0UHTbepqO4T1SkJ74K8gtcDg==",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4"
+ },
+ "dependencies": {
+ "array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ }
+ }
+ },
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "file-entry-cache": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
+ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+ "dev": true,
+ "requires": {
+ "flat-cache": "1.3.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "filename-regex": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ }
+ },
+ "finalhandler": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
+ "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "on-finished": "2.3.0",
+ "parseurl": "1.3.2",
+ "statuses": "1.3.1",
+ "unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "statuses": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+ "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+ "dev": true
+ }
+ }
+ },
+ "find-index": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz",
+ "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=",
+ "dev": true
+ },
+ "find-port": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/find-port/-/find-port-1.0.1.tgz",
+ "integrity": "sha1-2whKbL+ZVk2Zhprnn73s9m6KGFw=",
+ "dev": true,
+ "requires": {
+ "async": "0.2.10"
+ },
+ "dependencies": {
+ "async": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
+ "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
+ "dev": true
+ }
+ }
+ },
+ "find-replace": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz",
+ "integrity": "sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "test-value": "2.1.0"
+ },
+ "dependencies": {
+ "array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ }
+ }
+ },
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "requires": {
+ "path-exists": "2.1.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "findup-sync": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
+ "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
+ "dev": true,
+ "requires": {
+ "detect-file": "1.0.0",
+ "is-glob": "3.1.0",
+ "micromatch": "3.1.5",
+ "resolve-dir": "1.0.1"
+ }
+ },
+ "fined": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz",
+ "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "is-plain-object": "2.0.4",
+ "object.defaults": "1.1.0",
+ "object.pick": "1.3.0",
+ "parse-filepath": "1.0.2"
+ }
+ },
+ "first-chunk-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz",
+ "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=",
+ "dev": true
+ },
+ "flagged-respawn": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz",
+ "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=",
+ "dev": true
+ },
+ "flat-cache": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
+ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
+ "dev": true,
+ "requires": {
+ "circular-json": "0.3.3",
+ "del": "2.2.2",
+ "graceful-fs": "4.1.11",
+ "write": "0.2.1"
+ },
+ "dependencies": {
+ "del": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "dev": true,
+ "requires": {
+ "globby": "5.0.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.0",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "rimraf": "2.6.2"
+ }
+ },
+ "globby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+ "dev": true,
+ "requires": {
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "dev": true
+ },
+ "fork-stream": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz",
+ "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=",
+ "dev": true
+ },
+ "form-data": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
+ "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
+ "dev": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.5",
+ "mime-types": "2.1.17"
+ }
+ },
+ "formatio": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz",
+ "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=",
+ "dev": true,
+ "requires": {
+ "samsam": "1.3.0"
+ }
+ },
+ "forwarded": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "freeport": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/freeport/-/freeport-1.0.5.tgz",
+ "integrity": "sha1-JV6KuEFwwzuoXZkOghrl9KGpvF0=",
+ "dev": true,
+ "optional": true
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+ "dev": true
+ },
+ "fs-exists-sync": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
+ "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=",
+ "dev": true
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "gaze": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz",
+ "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=",
+ "dev": true,
+ "requires": {
+ "globule": "0.1.0"
+ }
+ },
+ "generate-function": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
+ "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=",
+ "dev": true
+ },
+ "generate-object-property": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
+ "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
+ "dev": true,
+ "requires": {
+ "is-property": "1.0.2"
+ }
+ },
+ "get-func-name": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-base": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+ "dev": true,
+ "requires": {
+ "glob-parent": "2.0.0",
+ "is-glob": "2.0.1"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+ "dev": true,
+ "requires": {
+ "is-glob": "2.0.1"
+ }
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ }
+ },
+ "glob-stream": {
+ "version": "3.1.18",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz",
+ "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=",
+ "dev": true,
+ "requires": {
+ "glob": "4.5.3",
+ "glob2base": "0.0.12",
+ "minimatch": "2.0.10",
+ "ordered-read-streams": "0.1.0",
+ "through2": "0.6.5",
+ "unique-stream": "1.0.0"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "4.5.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz",
+ "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=",
+ "dev": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "2.0.10",
+ "once": "1.4.0"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz",
+ "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.8"
+ }
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "glob-watcher": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz",
+ "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=",
+ "dev": true,
+ "requires": {
+ "gaze": "0.5.2"
+ }
+ },
+ "glob2base": {
+ "version": "0.0.12",
+ "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz",
+ "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=",
+ "dev": true,
+ "requires": {
+ "find-index": "0.1.1"
+ }
+ },
+ "global-dirs": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+ "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
+ "dev": true,
+ "requires": {
+ "ini": "1.3.5"
+ }
+ },
+ "global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "dev": true,
+ "requires": {
+ "global-prefix": "1.0.2",
+ "is-windows": "1.0.1",
+ "resolve-dir": "1.0.1"
+ }
+ },
+ "global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "homedir-polyfill": "1.0.1",
+ "ini": "1.3.5",
+ "is-windows": "1.0.1",
+ "which": "1.3.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+ "dev": true,
+ "requires": {
+ "array-union": "1.0.2",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "globule": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz",
+ "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=",
+ "dev": true,
+ "requires": {
+ "glob": "3.1.21",
+ "lodash": "1.0.2",
+ "minimatch": "0.2.14"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "3.1.21",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz",
+ "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "1.2.3",
+ "inherits": "1.0.2",
+ "minimatch": "0.2.14"
+ }
+ },
+ "graceful-fs": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
+ "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
+ "dev": true
+ },
+ "inherits": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz",
+ "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=",
+ "dev": true
+ },
+ "lodash": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz",
+ "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "0.2.14",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
+ "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "2.7.3",
+ "sigmund": "1.0.1"
+ }
+ }
+ }
+ },
+ "glogg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz",
+ "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==",
+ "dev": true,
+ "requires": {
+ "sparkles": "1.0.0"
+ }
+ },
+ "google-closure-compiler": {
+ "version": "20180204.0.0",
+ "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20180204.0.0.tgz",
+ "integrity": "sha1-sJf/t1DGXKB6LaRp12xVHTuOIaM=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "vinyl": "2.1.0",
+ "vinyl-sourcemaps-apply": "0.2.1"
+ }
+ },
+ "got": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+ "dev": true,
+ "requires": {
+ "create-error-class": "3.0.2",
+ "duplexer3": "0.1.4",
+ "get-stream": "3.0.0",
+ "is-redirect": "1.0.0",
+ "is-retry-allowed": "1.1.0",
+ "is-stream": "1.1.0",
+ "lowercase-keys": "1.0.0",
+ "safe-buffer": "5.1.1",
+ "timed-out": "4.0.1",
+ "unzip-response": "2.0.1",
+ "url-parse-lax": "1.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "graceful-readlink": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
+ "dev": true
+ },
+ "growl": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz",
+ "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=",
+ "dev": true
+ },
+ "gulp": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz",
+ "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=",
+ "dev": true,
+ "requires": {
+ "archy": "1.0.0",
+ "chalk": "1.1.3",
+ "deprecated": "0.0.1",
+ "gulp-util": "3.0.8",
+ "interpret": "1.1.0",
+ "liftoff": "2.5.0",
+ "minimist": "1.2.0",
+ "orchestrator": "0.3.8",
+ "pretty-hrtime": "1.0.3",
+ "semver": "4.3.6",
+ "tildify": "1.2.0",
+ "v8flags": "2.1.1",
+ "vinyl-fs": "0.3.14"
+ }
+ },
+ "gulp-babel": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/gulp-babel/-/gulp-babel-6.1.3.tgz",
+ "integrity": "sha512-tm15R3rt4gO59WXCuqrwf4QXJM9VIJC+0J2NPYSC6xZn+cZRD5y5RPGAiHaDxCJq7Rz5BDljlrk3cEjWADF+wQ==",
+ "dev": true,
+ "requires": {
+ "babel-core": "6.26.0",
+ "object-assign": "4.1.1",
+ "plugin-error": "1.0.1",
+ "replace-ext": "0.0.1",
+ "through2": "2.0.3",
+ "vinyl-sourcemaps-apply": "0.2.1"
+ },
+ "dependencies": {
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "dev": true
+ }
+ }
+ },
+ "gulp-eslint": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-4.0.2.tgz",
+ "integrity": "sha512-fcFUQzFsN6dJ6KZlG+qPOEkqfcevRUXgztkYCvhNvJeSvOicC8ucutN4qR/ID8LmNZx9YPIkBzazTNnVvbh8wg==",
+ "dev": true,
+ "requires": {
+ "eslint": "4.16.0",
+ "fancy-log": "1.3.2",
+ "plugin-error": "1.0.1"
+ }
+ },
+ "gulp-if": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz",
+ "integrity": "sha1-pJe351cwBQQcqivIt92jyARE1ik=",
+ "dev": true,
+ "requires": {
+ "gulp-match": "1.0.3",
+ "ternary-stream": "2.0.1",
+ "through2": "2.0.3"
+ }
+ },
+ "gulp-match": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.0.3.tgz",
+ "integrity": "sha1-kcfA1/Kb7NZgbVfYCn+Hdqh6uo4=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "gulp-replace": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-0.6.1.tgz",
+ "integrity": "sha1-Eb+Mj85TPjPi9qjy9DC5VboL4GY=",
+ "dev": true,
+ "requires": {
+ "istextorbinary": "1.0.2",
+ "readable-stream": "2.3.3",
+ "replacestream": "4.0.3"
+ }
+ },
+ "gulp-size": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/gulp-size/-/gulp-size-3.0.0.tgz",
+ "integrity": "sha1-yxrI5rqD3t5SQwxH/QOTJPAD/4I=",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.1",
+ "fancy-log": "1.3.2",
+ "gzip-size": "4.1.0",
+ "plugin-error": "0.1.2",
+ "pretty-bytes": "4.0.2",
+ "stream-counter": "1.0.0",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "arr-diff": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
+ "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-slice": "0.2.3"
+ }
+ },
+ "arr-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
+ "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+ "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz",
+ "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.2.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
+ "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
+ "dev": true,
+ "requires": {
+ "kind-of": "1.1.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
+ "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
+ "dev": true
+ },
+ "plugin-error": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
+ "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
+ "dev": true,
+ "requires": {
+ "ansi-cyan": "0.1.1",
+ "ansi-red": "0.1.1",
+ "arr-diff": "1.1.0",
+ "arr-union": "2.1.0",
+ "extend-shallow": "1.1.4"
+ }
+ },
+ "supports-color": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz",
+ "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "gulp-sourcemaps": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz",
+ "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=",
+ "dev": true,
+ "requires": {
+ "convert-source-map": "1.5.1",
+ "graceful-fs": "4.1.11",
+ "strip-bom": "2.0.0",
+ "through2": "2.0.3",
+ "vinyl": "1.2.0"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
+ "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "dev": true
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ },
+ "vinyl": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
+ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.3",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ }
+ }
+ },
+ "gulp-util": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
+ "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
+ "dev": true,
+ "requires": {
+ "array-differ": "1.0.0",
+ "array-uniq": "1.0.3",
+ "beeper": "1.1.1",
+ "chalk": "1.1.3",
+ "dateformat": "2.2.0",
+ "fancy-log": "1.3.2",
+ "gulplog": "1.0.0",
+ "has-gulplog": "0.1.0",
+ "lodash._reescape": "3.0.0",
+ "lodash._reevaluate": "3.0.0",
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.template": "3.6.2",
+ "minimist": "1.2.0",
+ "multipipe": "0.1.2",
+ "object-assign": "3.0.0",
+ "replace-ext": "0.0.1",
+ "through2": "2.0.3",
+ "vinyl": "0.5.3"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
+ "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
+ "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
+ "dev": true
+ },
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "dev": true
+ },
+ "vinyl": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
+ "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.3",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ }
+ }
+ },
+ "gulp-vulcanize": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/gulp-vulcanize/-/gulp-vulcanize-7.0.0.tgz",
+ "integrity": "sha512-SnyChu0+DbCK7QWN0UStPKEG8igkv0feLfx25jLAbrEULTHmvUPhx1BF3vYz6SsA32Azxp5UoU6jNI4Q8PzBPQ==",
+ "dev": true,
+ "requires": {
+ "plugin-error": "0.1.2",
+ "safe-buffer": "5.1.1",
+ "through2": "2.0.3",
+ "vulcanize": "1.16.0"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
+ "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-slice": "0.2.3"
+ }
+ },
+ "arr-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
+ "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+ "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
+ "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
+ "dev": true,
+ "requires": {
+ "kind-of": "1.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
+ "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
+ "dev": true
+ },
+ "plugin-error": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
+ "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
+ "dev": true,
+ "requires": {
+ "ansi-cyan": "0.1.1",
+ "ansi-red": "0.1.1",
+ "arr-diff": "1.1.0",
+ "arr-union": "2.1.0",
+ "extend-shallow": "1.1.4"
+ }
+ }
+ }
+ },
+ "gulplog": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
+ "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
+ "dev": true,
+ "requires": {
+ "glogg": "1.0.1"
+ }
+ },
+ "gzip-size": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-4.1.0.tgz",
+ "integrity": "sha1-iuCWJX6r59acRb4rZ8RIEk/7UXw=",
+ "dev": true,
+ "requires": {
+ "duplexer": "0.1.1",
+ "pify": "3.0.0"
+ }
+ },
+ "handle-thing": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz",
+ "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
+ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "commander": "2.9.0",
+ "is-my-json-valid": "2.17.1",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-binary2": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz",
+ "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=",
+ "dev": true,
+ "requires": {
+ "isarray": "2.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+ "dev": true
+ }
+ }
+ },
+ "has-color": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz",
+ "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=",
+ "dev": true
+ },
+ "has-cors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+ "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+ "dev": true
+ },
+ "has-gulplog": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz",
+ "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
+ "dev": true,
+ "requires": {
+ "sparkles": "1.0.0"
+ }
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "hawk": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+ "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+ "dev": true,
+ "requires": {
+ "boom": "2.10.1",
+ "cryptiles": "2.0.5",
+ "hoek": "2.16.3",
+ "sntp": "1.0.9"
+ }
+ },
+ "he": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+ "dev": true
+ },
+ "hoek": {
+ "version": "2.16.3",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
+ "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
+ "dev": true
+ },
+ "home-or-tmp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
+ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "homedir-polyfill": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
+ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
+ "dev": true,
+ "requires": {
+ "parse-passwd": "1.0.0"
+ }
+ },
+ "hosted-git-info": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
+ "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==",
+ "dev": true
+ },
+ "hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "obuf": "1.1.1",
+ "readable-stream": "2.3.3",
+ "wbuf": "1.7.2"
+ }
+ },
+ "htmlparser2": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz",
+ "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1.3.0",
+ "domhandler": "2.4.1",
+ "domutils": "1.6.2",
+ "entities": "1.1.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.3"
+ }
+ },
+ "http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
+ "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
+ "dev": true,
+ "requires": {
+ "depd": "1.1.1",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.0.3",
+ "statuses": "1.4.0"
+ },
+ "dependencies": {
+ "depd": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
+ "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
+ "dev": true
+ }
+ }
+ },
+ "http-proxy": {
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz",
+ "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=",
+ "dev": true,
+ "requires": {
+ "eventemitter3": "1.2.0",
+ "requires-port": "1.0.0"
+ }
+ },
+ "http-proxy-middleware": {
+ "version": "0.17.4",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz",
+ "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=",
+ "dev": true,
+ "requires": {
+ "http-proxy": "1.16.2",
+ "is-glob": "3.1.0",
+ "lodash": "4.17.4",
+ "micromatch": "2.3.11"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0"
+ }
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+ "dev": true
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "dev": true,
+ "requires": {
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.2"
+ }
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "dev": true,
+ "requires": {
+ "is-posix-bracket": "0.1.1"
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "dev": true,
+ "requires": {
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ }
+ }
+ }
+ }
+ },
+ "http-signature": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
+ "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "0.2.0",
+ "jsprim": "1.4.1",
+ "sshpk": "1.13.1"
+ }
+ },
+ "https-proxy-agent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz",
+ "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "agent-base": "2.1.1",
+ "debug": "2.6.9",
+ "extend": "3.0.1"
+ }
+ },
+ "hydrolysis": {
+ "version": "1.25.0",
+ "resolved": "https://registry.npmjs.org/hydrolysis/-/hydrolysis-1.25.0.tgz",
+ "integrity": "sha1-pPsUo3oeA7DbUtiqpXxoInKhTYQ=",
+ "dev": true,
+ "requires": {
+ "acorn": "3.3.0",
+ "babel-polyfill": "6.26.0",
+ "doctrine": "0.7.2",
+ "dom5": "1.1.0",
+ "escodegen": "1.9.0",
+ "espree": "3.5.2",
+ "estraverse": "3.1.0",
+ "path-is-absolute": "1.0.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz",
+ "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=",
+ "dev": true,
+ "requires": {
+ "esutils": "1.1.6",
+ "isarray": "0.0.1"
+ }
+ },
+ "dom5": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-1.1.0.tgz",
+ "integrity": "sha1-Ogx3AMCDq0xNJpOKeLDwxtzDd5Q=",
+ "dev": true,
+ "requires": {
+ "parse5": "1.5.1"
+ }
+ },
+ "estraverse": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-3.1.0.tgz",
+ "integrity": "sha1-FeKKRGuLgrxwDMyLlseK9NoNbLo=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz",
+ "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "parse5": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
+ "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=",
+ "dev": true
+ }
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.19",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
+ "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
+ "dev": true
+ },
+ "ignore": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
+ "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==",
+ "dev": true
+ },
+ "import-lazy": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+ "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+ "dev": true
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "indexof": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "dev": true
+ },
+ "inquirer": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
+ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "3.0.0",
+ "chalk": "2.3.0",
+ "cli-cursor": "2.1.0",
+ "cli-width": "2.2.0",
+ "external-editor": "2.1.0",
+ "figures": "2.0.0",
+ "lodash": "4.17.4",
+ "mute-stream": "0.0.7",
+ "run-async": "2.3.0",
+ "rx-lite": "4.0.8",
+ "rx-lite-aggregates": "4.0.8",
+ "string-width": "2.1.1",
+ "strip-ansi": "4.0.0",
+ "through": "2.3.8"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "interpret": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
+ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "ipaddr.js": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz",
+ "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=",
+ "dev": true
+ },
+ "is-absolute": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
+ "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
+ "dev": true,
+ "requires": {
+ "is-relative": "1.0.0",
+ "is-windows": "1.0.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+ "dev": true,
+ "requires": {
+ "builtin-modules": "1.1.1"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-dotfile": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+ "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+ "dev": true
+ },
+ "is-equal-shallow": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+ "dev": true,
+ "requires": {
+ "is-primitive": "2.0.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-installed-globally": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
+ "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
+ "dev": true,
+ "requires": {
+ "global-dirs": "0.1.1",
+ "is-path-inside": "1.0.1"
+ }
+ },
+ "is-my-json-valid": {
+ "version": "2.17.1",
+ "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.1.tgz",
+ "integrity": "sha512-Q2khNw+oBlWuaYvEEHtKSw/pCxD2L5Rc1C+UQme9X6JdRDh7m5D7HkozA0qa3DUkQ6VzCnEm8mVIQPyIRkI5sQ==",
+ "dev": true,
+ "requires": {
+ "generate-function": "2.0.0",
+ "generate-object-property": "1.2.0",
+ "jsonpointer": "4.0.1",
+ "xtend": "4.0.1"
+ }
+ },
+ "is-npm": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
+ "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
+ "dev": true
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+ "dev": true
+ },
+ "is-odd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-1.0.0.tgz",
+ "integrity": "sha1-O4qTLrAos3dcObsJ6RdnrM22kIg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0"
+ }
+ },
+ "is-path-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+ "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+ "dev": true
+ },
+ "is-path-in-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
+ "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
+ "dev": true,
+ "requires": {
+ "is-path-inside": "1.0.1"
+ }
+ },
+ "is-path-inside": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+ "dev": true,
+ "requires": {
+ "path-is-inside": "1.0.2"
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-posix-bracket": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+ "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+ "dev": true
+ },
+ "is-primitive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
+ "dev": true
+ },
+ "is-promise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
+ "dev": true
+ },
+ "is-property": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+ "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
+ "dev": true
+ },
+ "is-redirect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+ "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
+ "dev": true
+ },
+ "is-relative": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
+ "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
+ "dev": true,
+ "requires": {
+ "is-unc-path": "1.0.0"
+ }
+ },
+ "is-resolvable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
+ "dev": true
+ },
+ "is-retry-allowed": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
+ "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+ "dev": true
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "is-unc-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
+ "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
+ "dev": true,
+ "requires": {
+ "unc-path-regex": "0.1.2"
+ }
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+ "dev": true
+ },
+ "is-valid-glob": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz",
+ "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=",
+ "dev": true
+ },
+ "is-windows": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.1.tgz",
+ "integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "istextorbinary": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-1.0.2.tgz",
+ "integrity": "sha1-rOGTVNGpoBc+/rEITOD4ewrX3s8=",
+ "dev": true,
+ "requires": {
+ "binaryextensions": "1.0.1",
+ "textextensions": "1.0.2"
+ }
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz",
+ "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==",
+ "dev": true,
+ "requires": {
+ "argparse": "1.0.9",
+ "esprima": "4.0.0"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
+ "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
+ "dev": true
+ }
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "dev": true,
+ "optional": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+ "dev": true
+ },
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+ "dev": true,
+ "requires": {
+ "jsonify": "0.0.0"
+ }
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+ "dev": true
+ },
+ "json3": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
+ "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
+ "dev": true
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+ "dev": true
+ },
+ "jsonpointer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
+ "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
+ "dev": true
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "latest-version": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
+ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
+ "dev": true,
+ "requires": {
+ "package-json": "4.0.1"
+ }
+ },
+ "launchpad": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/launchpad/-/launchpad-0.7.0.tgz",
+ "integrity": "sha1-9CfTwOFehp7hVROCi6/vwW+ce8M=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "async": "2.6.0",
+ "browserstack": "1.5.0",
+ "debug": "2.6.9",
+ "plist": "2.1.0",
+ "q": "1.5.1",
+ "underscore": "1.8.3"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "lodash": "4.17.4"
+ }
+ },
+ "underscore": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
+ "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "lazy-cache": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
+ "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=",
+ "dev": true,
+ "requires": {
+ "set-getter": "0.1.0"
+ }
+ },
+ "lazypipe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lazypipe/-/lazypipe-1.0.1.tgz",
+ "integrity": "sha1-FHGu9rN6NA1Rw030Rpnc7wZMGUA=",
+ "dev": true,
+ "requires": {
+ "stream-combiner": "0.2.2"
+ }
+ },
+ "lazystream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
+ "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.3"
+ }
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "liftoff": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz",
+ "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "findup-sync": "2.0.0",
+ "fined": "1.1.0",
+ "flagged-respawn": "1.0.0",
+ "is-plain-object": "2.0.4",
+ "object.map": "1.0.1",
+ "rechoir": "0.6.2",
+ "resolve": "1.5.0"
+ }
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "strip-bom": "2.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ }
+ }
+ },
+ "lodash": {
+ "version": "4.17.4",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
+ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
+ "dev": true
+ },
+ "lodash._baseassign": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
+ "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
+ "dev": true,
+ "requires": {
+ "lodash._basecopy": "3.0.1",
+ "lodash.keys": "3.1.2"
+ }
+ },
+ "lodash._basecopy": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
+ "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
+ "dev": true
+ },
+ "lodash._basecreate": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz",
+ "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=",
+ "dev": true
+ },
+ "lodash._basetostring": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz",
+ "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=",
+ "dev": true
+ },
+ "lodash._basevalues": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz",
+ "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=",
+ "dev": true
+ },
+ "lodash._getnative": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
+ "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
+ "dev": true
+ },
+ "lodash._isiterateecall": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
+ "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
+ "dev": true
+ },
+ "lodash._reescape": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz",
+ "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=",
+ "dev": true
+ },
+ "lodash._reevaluate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz",
+ "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=",
+ "dev": true
+ },
+ "lodash._reinterpolate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
+ "dev": true
+ },
+ "lodash._root": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
+ "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.create": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz",
+ "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=",
+ "dev": true,
+ "requires": {
+ "lodash._baseassign": "3.2.0",
+ "lodash._basecreate": "3.0.3",
+ "lodash._isiterateecall": "3.0.9"
+ }
+ },
+ "lodash.defaults": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+ "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
+ "dev": true
+ },
+ "lodash.escape": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz",
+ "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
+ "dev": true,
+ "requires": {
+ "lodash._root": "3.0.1"
+ }
+ },
+ "lodash.isarguments": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
+ "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
+ "dev": true
+ },
+ "lodash.isarray": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
+ "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
+ "dev": true
+ },
+ "lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=",
+ "dev": true
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
+ "dev": true
+ },
+ "lodash.keys": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
+ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
+ "dev": true,
+ "requires": {
+ "lodash._getnative": "3.9.1",
+ "lodash.isarguments": "3.1.0",
+ "lodash.isarray": "3.0.4"
+ }
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.restparam": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
+ "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=",
+ "dev": true
+ },
+ "lodash.some": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz",
+ "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=",
+ "dev": true
+ },
+ "lodash.template": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz",
+ "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
+ "dev": true,
+ "requires": {
+ "lodash._basecopy": "3.0.1",
+ "lodash._basetostring": "3.0.1",
+ "lodash._basevalues": "3.0.0",
+ "lodash._isiterateecall": "3.0.9",
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.escape": "3.2.0",
+ "lodash.keys": "3.1.2",
+ "lodash.restparam": "3.6.1",
+ "lodash.templatesettings": "3.1.1"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz",
+ "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.escape": "3.2.0"
+ }
+ },
+ "lolex": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz",
+ "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "dev": true,
+ "requires": {
+ "currently-unhandled": "0.4.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "lowercase-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
+ "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
+ "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=",
+ "dev": true
+ },
+ "make-dir": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz",
+ "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==",
+ "dev": true,
+ "requires": {
+ "pify": "3.0.0"
+ }
+ },
+ "make-iterator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.0.tgz",
+ "integrity": "sha1-V7713IXSOSO6I3ZzJNjo+PPZaUs=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "md5": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
+ "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=",
+ "dev": true,
+ "requires": {
+ "charenc": "0.0.2",
+ "crypt": "0.0.2",
+ "is-buffer": "1.1.6"
+ }
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+ "dev": true
+ },
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "2.1.0",
+ "decamelize": "1.2.0",
+ "loud-rejection": "1.6.0",
+ "map-obj": "1.0.1",
+ "minimist": "1.2.0",
+ "normalize-package-data": "2.4.0",
+ "object-assign": "4.1.1",
+ "read-pkg-up": "1.0.1",
+ "redent": "1.0.0",
+ "trim-newlines": "1.0.0"
+ }
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+ "dev": true
+ },
+ "merge-stream": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
+ "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.3"
+ }
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.5.tgz",
+ "integrity": "sha512-ykttrLPQrz1PUJcXjwsTUjGoPJ64StIGNE2lGVD1c9CuguJ+L7/navsE8IcDNndOoCMvYV0qc/exfVbMHkUhvA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.0",
+ "define-property": "1.0.0",
+ "extend-shallow": "2.0.1",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.7",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.0",
+ "snapdragon": "0.8.1",
+ "to-regex": "3.0.1"
+ }
+ },
+ "mime": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+ "dev": true
+ },
+ "mime-db": {
+ "version": "1.30.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
+ "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.17",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
+ "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.30.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz",
+ "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=",
+ "dev": true
+ },
+ "minimalistic-assert": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz",
+ "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.8"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "mixin-deep": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.0.tgz",
+ "integrity": "sha512-dgaCvoh6i1nosAUBKb0l0pfJ78K8+S9fluyIR2YvAeUD/QuMahnFnF3xYty5eYXMjhGSsB0DsW6A0uAZyetoAg==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ }
+ }
+ },
+ "mocha": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz",
+ "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==",
+ "dev": true,
+ "requires": {
+ "browser-stdout": "1.3.0",
+ "commander": "2.9.0",
+ "debug": "2.6.8",
+ "diff": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "glob": "7.1.1",
+ "growl": "1.9.2",
+ "he": "1.1.1",
+ "json3": "3.3.2",
+ "lodash.create": "3.1.1",
+ "mkdirp": "0.5.1",
+ "supports-color": "3.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.8",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
+ "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
+ "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz",
+ "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "multer": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/multer/-/multer-1.3.0.tgz",
+ "integrity": "sha1-CSsmcPaEb6SRSWXvyM+Uwg/sbNI=",
+ "dev": true,
+ "requires": {
+ "append-field": "0.1.0",
+ "busboy": "0.2.14",
+ "concat-stream": "1.6.0",
+ "mkdirp": "0.5.1",
+ "object-assign": "3.0.0",
+ "on-finished": "2.3.0",
+ "type-is": "1.6.15",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "object-assign": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
+ "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
+ "dev": true
+ }
+ }
+ },
+ "multipipe": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz",
+ "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=",
+ "dev": true,
+ "requires": {
+ "duplexer2": "0.0.2"
+ }
+ },
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+ "dev": true
+ },
+ "mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "requires": {
+ "any-promise": "1.3.0",
+ "object-assign": "4.1.1",
+ "thenify-all": "1.6.0"
+ }
+ },
+ "nanomatch": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.7.tgz",
+ "integrity": "sha512-/5ldsnyurvEw7wNpxLFgjVvBLMta43niEYOy0CJ4ntcYSbx6bugRUTQeFb4BR/WanEL1o3aQgHuVLHQaB6tOqg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "is-odd": "1.0.0",
+ "kind-of": "5.1.0",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.0",
+ "snapdragon": "0.8.1",
+ "to-regex": "3.0.1"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "native-promise-only": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz",
+ "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=",
+ "dev": true
+ },
+ "natives": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.1.tgz",
+ "integrity": "sha512-8eRaxn8u/4wN8tGkhlc2cgwwvOLMLUMUn4IYTexMgWd+LyUDfeXVkk2ygQR0hvIHbJQXgHujia3ieUUDwNGkEA==",
+ "dev": true
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "negotiator": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+ "dev": true
+ },
+ "nodegit-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/nodegit-promise/-/nodegit-promise-4.0.0.tgz",
+ "integrity": "sha1-VyKxhPLfcycWEGSnkdLoQskWezQ=",
+ "dev": true,
+ "requires": {
+ "asap": "2.0.6"
+ }
+ },
+ "nomnom": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz",
+ "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=",
+ "dev": true,
+ "requires": {
+ "chalk": "0.4.0",
+ "underscore": "1.6.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz",
+ "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz",
+ "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "1.0.0",
+ "has-color": "0.1.7",
+ "strip-ansi": "0.1.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz",
+ "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=",
+ "dev": true
+ }
+ }
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "dev": true,
+ "requires": {
+ "abbrev": "1.1.1"
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "2.5.0",
+ "is-builtin-module": "1.0.0",
+ "semver": "4.3.6",
+ "validate-npm-package-license": "3.0.1"
+ }
+ },
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "dev": true,
+ "requires": {
+ "remove-trailing-separator": "1.1.0"
+ }
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "dev": true,
+ "requires": {
+ "path-key": "2.0.1"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+ "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
+ },
+ "object-component": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
+ "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.defaults": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
+ "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+ "dev": true,
+ "requires": {
+ "array-each": "1.0.1",
+ "array-slice": "1.1.0",
+ "for-own": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "object.map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
+ "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
+ "dev": true,
+ "requires": {
+ "for-own": "1.0.0",
+ "make-iterator": "1.0.0"
+ }
+ },
+ "object.omit": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+ "dev": true,
+ "requires": {
+ "for-own": "0.1.5",
+ "is-extendable": "0.1.1"
+ },
+ "dependencies": {
+ "for-own": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ }
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "obuf": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz",
+ "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=",
+ "dev": true
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "on-headers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
+ "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "1.1.0"
+ }
+ },
+ "opn": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/opn/-/opn-3.0.3.tgz",
+ "integrity": "sha1-ttmec5n3jWXDuq/+8fsojpuFJDo=",
+ "dev": true,
+ "requires": {
+ "object-assign": "4.1.1"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "orchestrator": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz",
+ "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "0.1.5",
+ "sequencify": "0.0.7",
+ "stream-consume": "0.1.0"
+ }
+ },
+ "ordered-read-streams": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz",
+ "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=",
+ "dev": true
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "dev": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "dev": true
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+ "dev": true
+ },
+ "p-map": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
+ "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
+ "dev": true
+ },
+ "package-json": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
+ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
+ "dev": true,
+ "requires": {
+ "got": "6.7.1",
+ "registry-auth-token": "3.3.2",
+ "registry-url": "3.1.0",
+ "semver": "5.5.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ }
+ }
+ },
+ "parse-filepath": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
+ "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
+ "dev": true,
+ "requires": {
+ "is-absolute": "1.0.0",
+ "map-cache": "0.2.2",
+ "path-root": "0.1.1"
+ }
+ },
+ "parse-glob": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+ "dev": true,
+ "requires": {
+ "glob-base": "0.3.0",
+ "is-dotfile": "1.0.3",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1"
+ },
+ "dependencies": {
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ }
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "requires": {
+ "error-ex": "1.3.1"
+ }
+ },
+ "parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+ "dev": true
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "parseqs": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
+ "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
+ "dev": true,
+ "requires": {
+ "better-assert": "1.0.2"
+ }
+ },
+ "parseuri": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
+ "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
+ "dev": true,
+ "requires": {
+ "better-assert": "1.0.2"
+ }
+ },
+ "parseurl": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
+ "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "path-posix": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/path-posix/-/path-posix-1.0.0.tgz",
+ "integrity": "sha1-BrJhE/Vr6rBCVFojv6iAA8ysJg8=",
+ "dev": true
+ },
+ "path-root": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
+ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+ "dev": true,
+ "requires": {
+ "path-root-regex": "0.1.2"
+ }
+ },
+ "path-root-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
+ "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
+ "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
+ "dev": true,
+ "requires": {
+ "isarray": "0.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ }
+ }
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "pathval": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
+ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
+ "dev": true
+ },
+ "pem": {
+ "version": "1.12.3",
+ "resolved": "https://registry.npmjs.org/pem/-/pem-1.12.3.tgz",
+ "integrity": "sha512-hT7GwvQL35+0iqgYUl8vn5I5pAVR0HcJas07TXL8bNaR4c5kAFRquk4ZqQk1F9YMcQOr6WjGdY5OnDC0RBnzig==",
+ "dev": true,
+ "requires": {
+ "md5": "2.2.1",
+ "os-tmpdir": "1.0.2",
+ "safe-buffer": "5.1.1",
+ "which": "1.3.0"
+ }
+ },
+ "pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+ "dev": true,
+ "optional": true
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
+ "requires": {
+ "pinkie": "2.0.4"
+ }
+ },
+ "plist": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz",
+ "integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "base64-js": "1.2.0",
+ "xmlbuilder": "8.2.2",
+ "xmldom": "0.1.27"
+ }
+ },
+ "plugin-error": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
+ "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "1.0.1",
+ "arr-diff": "4.0.0",
+ "arr-union": "3.1.0",
+ "extend-shallow": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "pluralize": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
+ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.7",
+ "winston": "2.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-2.7.0.tgz",
+ "integrity": "sha512-yD5FYQ8thX/2vHTaEgTtCs/NSG3ko4VlEb0IjM/PFsu03lHNHnpadC1NGwKyvI9vOjcFhnw4mDEVW0lbxLo8Eg==",
+ "dev": true,
+ "requires": {
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/escodegen": "0.0.2",
+ "@types/estraverse": "0.0.6",
+ "@types/estree": "0.0.37",
+ "@types/node": "6.0.96",
+ "@types/parse5": "2.2.34",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "2.3.0",
+ "escodegen": "1.9.0",
+ "espree": "3.5.2",
+ "estraverse": "4.2.0",
+ "jsonschema": "1.2.2",
+ "parse5": "2.2.3",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0"
+ },
+ "dependencies": {
+ "dom5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz",
+ "integrity": "sha1-+CBJdb0NrLvltYqKk//B/tD/zSo=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "6.0.96",
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "2.2.3"
+ }
+ },
+ "parse5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz",
+ "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-build": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/polymer-build/-/polymer-build-2.1.1.tgz",
+ "integrity": "sha512-SW6gxS0UPz864jECKMXPEdtq3549xzludPAQpxEqeDz6pSAeY/AFDWRG78Gw+z+mS2KES16Wwkc9IdMagBj3FQ==",
+ "dev": true,
+ "requires": {
+ "@types/mz": "0.0.31",
+ "@types/node": "6.0.96",
+ "@types/parse5": "2.2.34",
+ "@types/vinyl": "2.0.2",
+ "@types/vinyl-fs": "0.0.28",
+ "dom5": "2.3.0",
+ "multipipe": "1.0.2",
+ "mz": "2.7.0",
+ "parse5": "2.2.3",
+ "plylog": "0.5.0",
+ "polymer-analyzer": "2.7.0",
+ "polymer-bundler": "3.1.1",
+ "polymer-project-config": "3.8.1",
+ "sw-precache": "5.2.1",
+ "vinyl": "1.2.0",
+ "vinyl-fs": "2.4.4"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0"
+ }
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+ "dev": true
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "dev": true,
+ "requires": {
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.2"
+ }
+ },
+ "clone": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
+ "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
+ "dom5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz",
+ "integrity": "sha1-+CBJdb0NrLvltYqKk//B/tD/zSo=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "6.0.96",
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "2.2.3"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ }
+ }
+ },
+ "duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.3"
+ }
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "dev": true,
+ "requires": {
+ "is-posix-bracket": "0.1.1"
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-stream": {
+ "version": "5.3.5",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz",
+ "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "glob": "5.0.15",
+ "glob-parent": "3.1.0",
+ "micromatch": "2.3.11",
+ "ordered-read-streams": "0.3.0",
+ "through2": "0.6.5",
+ "to-absolute-glob": "0.1.1",
+ "unique-stream": "2.2.1"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "dev": true,
+ "requires": {
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
+ }
+ },
+ "multipipe": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-1.0.2.tgz",
+ "integrity": "sha1-zBPv2DPJzamfIk+GhGG44aP9k50=",
+ "dev": true,
+ "requires": {
+ "duplexer2": "0.1.4",
+ "object-assign": "4.1.1"
+ }
+ },
+ "ordered-read-streams": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz",
+ "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=",
+ "dev": true,
+ "requires": {
+ "is-stream": "1.1.0",
+ "readable-stream": "2.3.3"
+ }
+ },
+ "parse5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz",
+ "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=",
+ "dev": true
+ },
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "dev": true
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ },
+ "unique-stream": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
+ "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
+ "dev": true,
+ "requires": {
+ "json-stable-stringify": "1.0.1",
+ "through2-filter": "2.0.0"
+ }
+ },
+ "vinyl": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
+ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.3",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ },
+ "vinyl-fs": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz",
+ "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=",
+ "dev": true,
+ "requires": {
+ "duplexify": "3.5.3",
+ "glob-stream": "5.3.5",
+ "graceful-fs": "4.1.11",
+ "gulp-sourcemaps": "1.6.0",
+ "is-valid-glob": "0.3.0",
+ "lazystream": "1.0.0",
+ "lodash.isequal": "4.5.0",
+ "merge-stream": "1.0.1",
+ "mkdirp": "0.5.1",
+ "object-assign": "4.1.1",
+ "readable-stream": "2.3.3",
+ "strip-bom": "2.0.0",
+ "strip-bom-stream": "1.0.0",
+ "through2": "2.0.3",
+ "through2-filter": "2.0.0",
+ "vali-date": "1.0.0",
+ "vinyl": "1.2.0"
+ }
+ }
+ }
+ },
+ "polymer-bundler": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/polymer-bundler/-/polymer-bundler-3.1.1.tgz",
+ "integrity": "sha512-a/MItYr/rTRZ8Ymj5npmoAAm89RC5hRh4yz8bs22GyMn+NlE7HqJ4EzLrPkyRWlOyBhbhYFPx2Zot8PlaWXvmQ==",
+ "dev": true,
+ "requires": {
+ "clone": "2.1.1",
+ "command-line-args": "3.0.5",
+ "command-line-usage": "3.0.8",
+ "dom5": "2.3.0",
+ "espree": "3.5.2",
+ "mkdirp": "0.5.1",
+ "parse5": "2.2.3",
+ "polymer-analyzer": "2.7.0",
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "ansi-escape-sequences": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz",
+ "integrity": "sha1-HBg5S2r5t2/5pjUJ+kl2af0s5T4=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4"
+ }
+ },
+ "array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-args": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-3.0.5.tgz",
+ "integrity": "sha1-W9StReeYPlwTRJGOQCgO4mk8WsA=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "find-replace": "1.0.3",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-3.0.8.tgz",
+ "integrity": "sha1-tqIJeMGzg0d/XBGlKUKLiAv+D00=",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "3.0.0",
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "table-layout": "0.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "deep-extend": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
+ "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
+ "dev": true
+ },
+ "dom5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz",
+ "integrity": "sha1-+CBJdb0NrLvltYqKk//B/tD/zSo=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "6.0.96",
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "2.2.3"
+ }
+ },
+ "parse5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz",
+ "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.3.0.tgz",
+ "integrity": "sha1-buINxIPbNxs+XIf3BO0vfHmdLJo=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "core-js": "2.5.3",
+ "deep-extend": "0.4.2",
+ "feature-detect-es6": "1.4.0",
+ "typical": "2.6.1",
+ "wordwrapjs": "2.0.0"
+ }
+ },
+ "wordwrapjs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-2.0.0.tgz",
+ "integrity": "sha1-q1X2leYRjak4WP3XDAU9HF4BrCA=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.8.1.tgz",
+ "integrity": "sha512-MLvnM9gexFWg7nynY24eHZG6NLXocmk718sVds/sx2CAJ6iihhC0JMhhOIa6jnad9KQrHyGl/cs3mMRaaub5Fg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.96",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ }
+ },
+ "polyserve": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/polyserve/-/polyserve-0.23.0.tgz",
+ "integrity": "sha512-ijzCbFttKG1F0hMTWWIzMoo+sxsfpXctoHFigw2ViBcvUt/aUBfJCUTHPKHhi/3zAgtw5Ej3SgoIOY9LflpXAw==",
+ "dev": true,
+ "requires": {
+ "@types/assert": "0.0.29",
+ "@types/babel-core": "6.25.3",
+ "@types/babylon": "6.16.2",
+ "@types/compression": "0.0.33",
+ "@types/content-type": "1.1.2",
+ "@types/express": "4.11.0",
+ "@types/mime": "0.0.29",
+ "@types/mz": "0.0.29",
+ "@types/node": "8.5.9",
+ "@types/opn": "3.0.28",
+ "@types/parse5": "2.2.34",
+ "@types/pem": "1.9.3",
+ "@types/serve-static": "1.13.1",
+ "@types/spdy": "3.4.4",
+ "@types/ua-parser-js": "0.7.32",
+ "babel-core": "6.26.0",
+ "babel-plugin-transform-es2015-arrow-functions": "6.22.0",
+ "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0",
+ "babel-plugin-transform-es2015-block-scoping": "6.26.0",
+ "babel-plugin-transform-es2015-classes": "6.24.1",
+ "babel-plugin-transform-es2015-computed-properties": "6.24.1",
+ "babel-plugin-transform-es2015-destructuring": "6.23.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
+ "babel-plugin-transform-es2015-for-of": "6.23.0",
+ "babel-plugin-transform-es2015-function-name": "6.24.1",
+ "babel-plugin-transform-es2015-literals": "6.22.0",
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-plugin-transform-es2015-object-super": "6.24.1",
+ "babel-plugin-transform-es2015-parameters": "6.24.1",
+ "babel-plugin-transform-es2015-shorthand-properties": "6.24.1",
+ "babel-plugin-transform-es2015-spread": "6.22.0",
+ "babel-plugin-transform-es2015-sticky-regex": "6.24.1",
+ "babel-plugin-transform-es2015-template-literals": "6.22.0",
+ "babel-plugin-transform-es2015-typeof-symbol": "6.23.0",
+ "babel-plugin-transform-es2015-unicode-regex": "6.24.1",
+ "babel-plugin-transform-regenerator": "6.26.0",
+ "babylon": "6.18.0",
+ "browser-capabilities": "0.2.2",
+ "command-line-args": "3.0.5",
+ "command-line-usage": "3.0.8",
+ "compression": "1.7.1",
+ "content-type": "1.0.4",
+ "dom5": "2.3.0",
+ "express": "4.16.2",
+ "find-port": "1.0.1",
+ "http-proxy-middleware": "0.17.4",
+ "lru-cache": "4.1.1",
+ "mime": "1.4.1",
+ "mz": "2.7.0",
+ "opn": "3.0.3",
+ "parse5": "2.2.3",
+ "pem": "1.12.3",
+ "polymer-build": "2.1.1",
+ "requirejs": "2.3.5",
+ "resolve": "1.5.0",
+ "send": "0.14.2",
+ "spdy": "3.4.7"
+ },
+ "dependencies": {
+ "@types/mz": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/mz/-/mz-0.0.29.tgz",
+ "integrity": "sha1-vCRyjGSZc/HHhR6QM/nOUlZowns=",
+ "dev": true,
+ "requires": {
+ "@types/bluebird": "3.5.20",
+ "@types/node": "8.5.9"
+ }
+ },
+ "@types/node": {
+ "version": "8.5.9",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.5.9.tgz",
+ "integrity": "sha512-s+c3AjymyAccTI4hcgNFK4mToH8l+hyPDhu4LIkn71lRy56FLijGu00fyLgldjM/846Pmk9N4KFUs2P8GDs0pA==",
+ "dev": true
+ },
+ "ansi-escape-sequences": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz",
+ "integrity": "sha1-HBg5S2r5t2/5pjUJ+kl2af0s5T4=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4"
+ }
+ },
+ "array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-args": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-3.0.5.tgz",
+ "integrity": "sha1-W9StReeYPlwTRJGOQCgO4mk8WsA=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "find-replace": "1.0.3",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-3.0.8.tgz",
+ "integrity": "sha1-tqIJeMGzg0d/XBGlKUKLiAv+D00=",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "3.0.0",
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "table-layout": "0.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "debug": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
+ "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
+ "dev": true,
+ "requires": {
+ "ms": "0.7.1"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
+ "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
+ "dev": true
+ }
+ }
+ },
+ "deep-extend": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
+ "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
+ "dev": true
+ },
+ "dom5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz",
+ "integrity": "sha1-+CBJdb0NrLvltYqKk//B/tD/zSo=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "6.0.101",
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "2.2.3"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "etag": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz",
+ "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=",
+ "dev": true
+ },
+ "fresh": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz",
+ "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz",
+ "integrity": "sha1-eIwNLB3iyBuebowBhDtrl+uSB1A=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "setprototypeof": "1.0.2",
+ "statuses": "1.3.1"
+ }
+ },
+ "lru-cache": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
+ "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "1.0.2",
+ "yallist": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
+ "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
+ "dev": true
+ },
+ "parse5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz",
+ "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=",
+ "dev": true
+ },
+ "send": {
+ "version": "0.14.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.14.2.tgz",
+ "integrity": "sha1-ObBDiz9RC+Xcb2Z6EfcWiTaM3u8=",
+ "dev": true,
+ "requires": {
+ "debug": "2.2.0",
+ "depd": "1.1.2",
+ "destroy": "1.0.4",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.7.0",
+ "fresh": "0.3.0",
+ "http-errors": "1.5.1",
+ "mime": "1.3.4",
+ "ms": "0.7.2",
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.0",
+ "statuses": "1.3.1"
+ },
+ "dependencies": {
+ "mime": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz",
+ "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=",
+ "dev": true
+ }
+ }
+ },
+ "setprototypeof": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz",
+ "integrity": "sha1-gaVSFB7BBLiOic44MQOtXGZWTQg=",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+ "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.3.0.tgz",
+ "integrity": "sha1-buINxIPbNxs+XIf3BO0vfHmdLJo=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "core-js": "2.5.3",
+ "deep-extend": "0.4.2",
+ "feature-detect-es6": "1.4.0",
+ "typical": "2.6.1",
+ "wordwrapjs": "2.0.0"
+ }
+ },
+ "wordwrapjs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-2.0.0.tgz",
+ "integrity": "sha1-q1X2leYRjak4WP3XDAU9HF4BrCA=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+ "dev": true
+ },
+ "preserve": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
+ "dev": true
+ },
+ "pretty-bytes": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz",
+ "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=",
+ "dev": true
+ },
+ "pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
+ "dev": true
+ },
+ "private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "dev": true
+ },
+ "progress": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
+ "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
+ "dev": true
+ },
+ "promisify-node": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/promisify-node/-/promisify-node-0.4.0.tgz",
+ "integrity": "sha1-MoA4dOxBF4TkeGwzmQKoeheaRpw=",
+ "dev": true,
+ "requires": {
+ "nodegit-promise": "4.0.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "proxy-addr": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz",
+ "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=",
+ "dev": true,
+ "requires": {
+ "forwarded": "0.1.2",
+ "ipaddr.js": "1.5.2"
+ }
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true
+ },
+ "q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+ "dev": true,
+ "optional": true
+ },
+ "qs": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+ "dev": true
+ },
+ "randomatic": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
+ "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "range-parser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+ "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+ "dev": true
+ },
+ "raw-body": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
+ "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
+ "dev": true,
+ "requires": {
+ "bytes": "3.0.0",
+ "http-errors": "1.6.2",
+ "iconv-lite": "0.4.19",
+ "unpipe": "1.0.0"
+ }
+ },
+ "rc": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.4.tgz",
+ "integrity": "sha1-oPYGyq4qO4YrvQ74VILAElsxX6M=",
+ "dev": true,
+ "requires": {
+ "deep-extend": "0.4.2",
+ "ini": "1.3.5",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "deep-extend": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
+ "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
+ "dev": true
+ }
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "1.1.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "1.1.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
+ "requires": {
+ "find-up": "1.1.2",
+ "read-pkg": "1.1.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
+ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+ "dev": true,
+ "requires": {
+ "resolve": "1.5.0"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "2.1.0",
+ "strip-indent": "1.0.1"
+ },
+ "dependencies": {
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "4.0.1"
+ }
+ }
+ }
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerate": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
+ "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regenerator-transform": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "private": "0.1.8"
+ }
+ },
+ "regex-cache": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+ "dev": true,
+ "requires": {
+ "is-equal-shallow": "0.1.3"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.0.tgz",
+ "integrity": "sha1-Qvg+OXcWIt+CawKvF2Ul1qXxV/k=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1"
+ }
+ },
+ "regexpu-core": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+ "dev": true,
+ "requires": {
+ "regenerate": "1.3.3",
+ "regjsgen": "0.2.0",
+ "regjsparser": "0.1.5"
+ }
+ },
+ "registry-auth-token": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
+ "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
+ "dev": true,
+ "requires": {
+ "rc": "1.2.4",
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "registry-url": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+ "dev": true,
+ "requires": {
+ "rc": "1.2.4"
+ }
+ },
+ "regjsgen": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+ "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+ "dev": true
+ },
+ "regjsparser": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+ "dev": true,
+ "requires": {
+ "jsesc": "0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true
+ }
+ }
+ },
+ "remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+ "dev": true
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "replace-ext": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+ "dev": true
+ },
+ "replacestream": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz",
+ "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "1.0.5",
+ "object-assign": "4.1.1",
+ "readable-stream": "2.3.3"
+ }
+ },
+ "request": {
+ "version": "2.79.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz",
+ "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "0.6.0",
+ "aws4": "1.6.0",
+ "caseless": "0.11.0",
+ "combined-stream": "1.0.5",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.1.4",
+ "har-validator": "2.0.6",
+ "hawk": "3.1.3",
+ "http-signature": "1.1.1",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.17",
+ "oauth-sign": "0.8.2",
+ "qs": "6.3.2",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.3",
+ "tunnel-agent": "0.4.3",
+ "uuid": "3.2.1"
+ },
+ "dependencies": {
+ "qs": {
+ "version": "6.3.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
+ "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=",
+ "dev": true
+ }
+ }
+ },
+ "require-uncached": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+ "dev": true,
+ "requires": {
+ "caller-path": "0.1.0",
+ "resolve-from": "1.0.1"
+ }
+ },
+ "requirejs": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.5.tgz",
+ "integrity": "sha512-svnO+aNcR/an9Dpi44C7KSAy5fFGLtmPbaaCeQaklUz8BQhS64tWWIIlvEA5jrWICzlO/X9KSzSeXFnZdBu8nw==",
+ "dev": true
+ },
+ "requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
+ "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "global-modules": "1.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
+ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
+ "dev": true
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "dev": true,
+ "requires": {
+ "onetime": "2.0.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "run-async": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+ "dev": true,
+ "requires": {
+ "is-promise": "2.1.0"
+ }
+ },
+ "run-sequence": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-2.2.1.tgz",
+ "integrity": "sha512-qkzZnQWMZjcKbh3CNly2srtrkaO/2H/SI5f2eliMCapdRD3UhMrwjfOAZJAnZ2H8Ju4aBzFZkBGXUqFs9V0yxw==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "fancy-log": "1.3.2",
+ "plugin-error": "0.1.2"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
+ "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-slice": "0.2.3"
+ }
+ },
+ "arr-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
+ "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+ "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
+ "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
+ "dev": true,
+ "requires": {
+ "kind-of": "1.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
+ "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
+ "dev": true
+ },
+ "plugin-error": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
+ "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
+ "dev": true,
+ "requires": {
+ "ansi-cyan": "0.1.1",
+ "ansi-red": "0.1.1",
+ "arr-diff": "1.1.0",
+ "arr-union": "2.1.0",
+ "extend-shallow": "1.1.4"
+ }
+ }
+ }
+ },
+ "rx-lite": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
+ "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
+ "dev": true
+ },
+ "rx-lite-aggregates": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
+ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
+ "dev": true,
+ "requires": {
+ "rx-lite": "4.0.8"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
+ "dev": true
+ },
+ "samsam": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz",
+ "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==",
+ "dev": true
+ },
+ "sauce-connect-launcher": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.2.3.tgz",
+ "integrity": "sha1-0vkxrXro/avxlopEDnsgQXrKf4Y=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "adm-zip": "0.4.7",
+ "async": "2.6.0",
+ "https-proxy-agent": "1.0.0",
+ "lodash": "4.17.4",
+ "rimraf": "2.6.2"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "lodash": "4.17.4"
+ }
+ }
+ }
+ },
+ "select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+ "dev": true
+ },
+ "selenium-standalone": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-6.12.0.tgz",
+ "integrity": "sha1-eJcw2wmhBfHM4SxkJNeV0RxUO9Q=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "async": "2.6.0",
+ "commander": "2.9.0",
+ "cross-spawn": "5.1.0",
+ "debug": "3.1.0",
+ "lodash": "4.17.4",
+ "minimist": "1.2.0",
+ "mkdirp": "0.5.1",
+ "progress": "2.0.0",
+ "request": "2.79.0",
+ "tar-stream": "1.5.2",
+ "urijs": "1.19.0",
+ "which": "1.3.0",
+ "yauzl": "2.9.1"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "lodash": "4.17.4"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "semver": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
+ "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
+ "dev": true
+ },
+ "semver-diff": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
+ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
+ "dev": true,
+ "requires": {
+ "semver": "5.5.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ }
+ }
+ },
+ "send": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.11.1.tgz",
+ "integrity": "sha1-G+q/1C+eJwn5kCivMHisErRwktU=",
+ "dev": true,
+ "requires": {
+ "debug": "2.1.3",
+ "depd": "1.0.1",
+ "destroy": "1.0.3",
+ "escape-html": "1.0.1",
+ "etag": "1.5.1",
+ "fresh": "0.2.4",
+ "mime": "1.2.11",
+ "ms": "0.7.0",
+ "on-finished": "2.2.1",
+ "range-parser": "1.0.3"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz",
+ "integrity": "sha1-zoqxte6PvuK/o7Yzyrk9NmtjQY4=",
+ "dev": true,
+ "requires": {
+ "ms": "0.7.0"
+ }
+ },
+ "depd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz",
+ "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=",
+ "dev": true
+ },
+ "destroy": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz",
+ "integrity": "sha1-tDO0ck5x/YVR2YhRdIUcX8N34sk=",
+ "dev": true
+ },
+ "ee-first": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz",
+ "integrity": "sha1-ag18YiHkkP7v2S7D9EHJzozQl/Q=",
+ "dev": true
+ },
+ "escape-html": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz",
+ "integrity": "sha1-GBoobq05ejmpKFfPsdQwUuNWv/A=",
+ "dev": true
+ },
+ "etag": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.5.1.tgz",
+ "integrity": "sha1-VMUN4E7kJpVWKSWsVmWIKRvn6eo=",
+ "dev": true,
+ "requires": {
+ "crc": "3.2.1"
+ }
+ },
+ "fresh": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.4.tgz",
+ "integrity": "sha1-NYJJkgbJcjcUGQ7ddLRgT+tKYUw=",
+ "dev": true
+ },
+ "mime": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz",
+ "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=",
+ "dev": true
+ },
+ "ms": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz",
+ "integrity": "sha1-hlvpTC5zl62KV9pqYzpuLzB5i4M=",
+ "dev": true
+ },
+ "on-finished": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.2.1.tgz",
+ "integrity": "sha1-XIXBzDYpn3gCllP2Z/J7a5nrwCk=",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.0"
+ }
+ },
+ "range-parser": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz",
+ "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=",
+ "dev": true
+ }
+ }
+ },
+ "sequencify": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz",
+ "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=",
+ "dev": true
+ },
+ "serve-static": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz",
+ "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==",
+ "dev": true,
+ "requires": {
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "parseurl": "1.3.2",
+ "send": "0.16.1"
+ },
+ "dependencies": {
+ "send": {
+ "version": "0.16.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz",
+ "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "destroy": "1.0.4",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "1.6.2",
+ "mime": "1.4.1",
+ "ms": "2.0.0",
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.0",
+ "statuses": "1.3.1"
+ }
+ },
+ "statuses": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+ "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+ "dev": true
+ }
+ }
+ },
+ "server-destroy": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
+ "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=",
+ "dev": true
+ },
+ "serviceworker-cache-polyfill": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz",
+ "integrity": "sha1-3hnuc77yGrPAdAo3sz22JGS6ves=",
+ "dev": true
+ },
+ "set-getter": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz",
+ "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=",
+ "dev": true,
+ "requires": {
+ "to-object-path": "0.3.0"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ }
+ },
+ "setprototypeof": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
+ "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
+ "dev": true
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true
+ },
+ "sigmund": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
+ "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "dev": true
+ },
+ "sinon": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz",
+ "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==",
+ "dev": true,
+ "requires": {
+ "diff": "3.2.0",
+ "formatio": "1.2.0",
+ "lolex": "1.6.0",
+ "native-promise-only": "0.8.1",
+ "path-to-regexp": "1.7.0",
+ "samsam": "1.3.0",
+ "text-encoding": "0.6.4",
+ "type-detect": "4.0.7"
+ }
+ },
+ "sinon-chai": {
+ "version": "2.14.0",
+ "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz",
+ "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==",
+ "dev": true
+ },
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
+ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0"
+ }
+ },
+ "snapdragon": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz",
+ "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "2.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "sntp": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+ "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
+ "dev": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "socket.io": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz",
+ "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "engine.io": "3.1.4",
+ "socket.io-adapter": "1.1.1",
+ "socket.io-client": "2.0.4",
+ "socket.io-parser": "3.1.2"
+ }
+ },
+ "socket.io-adapter": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz",
+ "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=",
+ "dev": true
+ },
+ "socket.io-client": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz",
+ "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=",
+ "dev": true,
+ "requires": {
+ "backo2": "1.0.2",
+ "base64-arraybuffer": "0.1.5",
+ "component-bind": "1.0.0",
+ "component-emitter": "1.2.1",
+ "debug": "2.6.9",
+ "engine.io-client": "3.1.4",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "object-component": "0.0.3",
+ "parseqs": "0.0.5",
+ "parseuri": "0.0.5",
+ "socket.io-parser": "3.1.2",
+ "to-array": "0.1.4"
+ }
+ },
+ "socket.io-parser": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.2.tgz",
+ "integrity": "sha1-28IoIVH8T6675Aru3Ady66YZ9/I=",
+ "dev": true,
+ "requires": {
+ "component-emitter": "1.2.1",
+ "debug": "2.6.9",
+ "has-binary2": "1.0.2",
+ "isarray": "2.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+ "dev": true
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.0.3",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-support": {
+ "version": "0.4.18",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
+ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "sparkles": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz",
+ "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=",
+ "dev": true
+ },
+ "spdx-correct": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
+ "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
+ "dev": true,
+ "requires": {
+ "spdx-license-ids": "1.2.2"
+ }
+ },
+ "spdx-expression-parse": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
+ "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=",
+ "dev": true
+ },
+ "spdx-license-ids": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
+ "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=",
+ "dev": true
+ },
+ "spdy": {
+ "version": "3.4.7",
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz",
+ "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "handle-thing": "1.2.5",
+ "http-deceiver": "1.2.7",
+ "safe-buffer": "5.1.1",
+ "select-hose": "2.0.0",
+ "spdy-transport": "2.0.20"
+ }
+ },
+ "spdy-transport": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz",
+ "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "detect-node": "2.0.3",
+ "hpack.js": "2.1.6",
+ "obuf": "1.1.1",
+ "readable-stream": "2.3.3",
+ "safe-buffer": "5.1.1",
+ "wbuf": "1.7.2"
+ }
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "sshpk": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz",
+ "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=",
+ "dev": true,
+ "requires": {
+ "asn1": "0.2.3",
+ "assert-plus": "1.0.0",
+ "bcrypt-pbkdf": "1.0.1",
+ "dashdash": "1.14.1",
+ "ecc-jsbn": "0.1.1",
+ "getpass": "0.1.7",
+ "jsbn": "0.1.1",
+ "tweetnacl": "0.14.5"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "stacky": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/stacky/-/stacky-1.3.1.tgz",
+ "integrity": "sha1-PxF+UYe5pz0j+HbWnwXIWxGAShI=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "lodash": "3.10.1"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true
+ }
+ }
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "statuses": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+ "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+ "dev": true
+ },
+ "stream-combiner": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz",
+ "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=",
+ "dev": true,
+ "requires": {
+ "duplexer": "0.1.1",
+ "through": "2.3.8"
+ }
+ },
+ "stream-consume": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz",
+ "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=",
+ "dev": true
+ },
+ "stream-counter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-1.0.0.tgz",
+ "integrity": "sha1-kc8lac5NxQYf6816yyY5SloRR1E=",
+ "dev": true
+ },
+ "stream-shift": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
+ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
+ "dev": true
+ },
+ "streamsearch": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
+ "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ }
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "stringstream": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
+ "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-bom": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz",
+ "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=",
+ "dev": true,
+ "requires": {
+ "first-chunk-stream": "1.0.0",
+ "is-utf8": "0.2.1"
+ }
+ },
+ "strip-bom-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz",
+ "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=",
+ "dev": true,
+ "requires": {
+ "first-chunk-stream": "1.0.0",
+ "strip-bom": "2.0.0"
+ },
+ "dependencies": {
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ }
+ }
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "dev": true
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "sw-precache": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.1.tgz",
+ "integrity": "sha512-8FAy+BP/FXE+ILfiVTt+GQJ6UEf4CVHD9OfhzH0JX+3zoy2uFk7Vn9EfXASOtVmmIVbL3jE/W8Z66VgPSZcMhw==",
+ "dev": true,
+ "requires": {
+ "dom-urls": "1.1.0",
+ "es6-promise": "4.2.4",
+ "glob": "7.1.2",
+ "lodash.defaults": "4.2.0",
+ "lodash.template": "4.4.0",
+ "meow": "3.7.0",
+ "mkdirp": "0.5.1",
+ "pretty-bytes": "4.0.2",
+ "sw-toolbox": "3.6.0",
+ "update-notifier": "2.3.0"
+ },
+ "dependencies": {
+ "es6-promise": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
+ "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==",
+ "dev": true
+ },
+ "lodash.template": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz",
+ "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.templatesettings": "4.1.0"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz",
+ "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0"
+ }
+ },
+ "pretty-bytes": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz",
+ "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=",
+ "dev": true
+ }
+ }
+ },
+ "sw-toolbox": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz",
+ "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=",
+ "dev": true,
+ "requires": {
+ "path-to-regexp": "1.7.0",
+ "serviceworker-cache-polyfill": "4.0.0"
+ }
+ },
+ "table": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
+ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "ajv-keywords": "2.1.1",
+ "chalk": "2.3.0",
+ "lodash": "4.17.4",
+ "slice-ansi": "1.0.0",
+ "string-width": "2.1.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ }
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "table-layout": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
+ "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.0",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ }
+ },
+ "tar-stream": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.2.tgz",
+ "integrity": "sha1-+8bG6DwaGdTLSMfZYXH8JI7/x78=",
+ "dev": true,
+ "requires": {
+ "bl": "1.2.1",
+ "end-of-stream": "1.4.1",
+ "readable-stream": "2.3.3",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0"
+ }
+ }
+ }
+ },
+ "temp": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz",
+ "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "os-tmpdir": "1.0.2",
+ "rimraf": "2.2.8"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "2.2.8",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
+ "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "term-size": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
+ "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
+ "dev": true,
+ "requires": {
+ "execa": "0.7.0"
+ }
+ },
+ "ternary-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.0.1.tgz",
+ "integrity": "sha1-Bk5Im0tb9gumpre8fy9cJ07Pgmk=",
+ "dev": true,
+ "requires": {
+ "duplexify": "3.5.3",
+ "fork-stream": "0.0.4",
+ "merge-stream": "1.0.1",
+ "through2": "2.0.3"
+ }
+ },
+ "test-value": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
+ "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "typical": "2.6.1"
+ },
+ "dependencies": {
+ "array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ }
+ }
+ },
+ "text-encoding": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz",
+ "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=",
+ "dev": true
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "textextensions": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-1.0.2.tgz",
+ "integrity": "sha1-ZUhjk+4fK7A5pgy7oFsLaL2VAdI=",
+ "dev": true
+ },
+ "thenify": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz",
+ "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=",
+ "dev": true,
+ "requires": {
+ "any-promise": "1.3.0"
+ }
+ },
+ "thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
+ "dev": true,
+ "requires": {
+ "thenify": "3.3.0"
+ }
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.3",
+ "xtend": "4.0.1"
+ }
+ },
+ "through2-filter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz",
+ "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=",
+ "dev": true,
+ "requires": {
+ "through2": "2.0.3",
+ "xtend": "4.0.1"
+ }
+ },
+ "tildify": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz",
+ "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "time-stamp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
+ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
+ "dev": true
+ },
+ "timed-out": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
+ "dev": true
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "to-absolute-glob": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz",
+ "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1"
+ }
+ },
+ "to-array": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
+ "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.1.tgz",
+ "integrity": "sha1-FTWL7kosg712N3uh3ASdDxiDeq4=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "regex-not": "1.0.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tough-cookie": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz",
+ "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=",
+ "dev": true,
+ "requires": {
+ "punycode": "1.4.1"
+ }
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "tunnel-agent": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
+ "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
+ "dev": true
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "dev": true,
+ "optional": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "type-detect": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.7.tgz",
+ "integrity": "sha512-4Rh17pAMVdMWzktddFhISRnUnFIStObtUMNGzDwlA6w/77bmGv3aBbRdCmQR6IjzfkTo9otnW+2K/cDRhKSxDA==",
+ "dev": true
+ },
+ "type-is": {
+ "version": "1.6.15",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz",
+ "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=",
+ "dev": true,
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "2.1.17"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "ua-parser-js": {
+ "version": "0.7.17",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz",
+ "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==",
+ "dev": true
+ },
+ "ultron": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
+ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
+ "dev": true
+ },
+ "unc-path-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
+ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
+ "dev": true
+ },
+ "underscore": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
+ "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=",
+ "dev": true
+ },
+ "underscore.string": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz",
+ "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "unique-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz",
+ "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=",
+ "dev": true
+ },
+ "unique-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
+ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
+ "dev": true,
+ "requires": {
+ "crypto-random-string": "1.0.0"
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "unzip-response": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+ "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
+ "dev": true
+ },
+ "update-notifier": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz",
+ "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=",
+ "dev": true,
+ "requires": {
+ "boxen": "1.3.0",
+ "chalk": "2.3.0",
+ "configstore": "3.1.1",
+ "import-lazy": "2.1.0",
+ "is-installed-globally": "0.1.0",
+ "is-npm": "1.0.0",
+ "latest-version": "3.1.0",
+ "semver-diff": "2.1.0",
+ "xdg-basedir": "3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ }
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "urijs": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.0.tgz",
+ "integrity": "sha512-Qs2odXn0hST5VSPVjpi73CMqtbAoanahaqWBujGU+IyMrMqpWcIhDewxQRhCkmqYxuyvICDcSuLdv2O7ncWBGw==",
+ "dev": true
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "url-parse-lax": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+ "dev": true,
+ "requires": {
+ "prepend-http": "1.0.4"
+ }
+ },
+ "use": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz",
+ "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "lazy-cache": "2.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "user-home": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
+ "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
+ "dev": true
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+ "dev": true
+ },
+ "uuid": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
+ "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==",
+ "dev": true
+ },
+ "uws": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/uws/-/uws-0.14.5.tgz",
+ "integrity": "sha1-Z6rzPEaypYel9mZtAPdpEyjxSdw=",
+ "dev": true,
+ "optional": true
+ },
+ "v8flags": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
+ "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
+ "dev": true,
+ "requires": {
+ "user-home": "1.1.1"
+ }
+ },
+ "vali-date": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz",
+ "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=",
+ "dev": true
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
+ "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "1.0.2",
+ "spdx-expression-parse": "1.0.4"
+ }
+ },
+ "vargs": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/vargs/-/vargs-0.1.0.tgz",
+ "integrity": "sha1-a2GE2mUgzDIEzhtAfKwm2SYJ6/8=",
+ "dev": true
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+ "dev": true
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "1.3.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "vinyl": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
+ "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=",
+ "dev": true,
+ "requires": {
+ "clone": "2.1.1",
+ "clone-buffer": "1.0.0",
+ "clone-stats": "1.0.0",
+ "cloneable-readable": "1.0.0",
+ "remove-trailing-separator": "1.1.0",
+ "replace-ext": "1.0.0"
+ }
+ },
+ "vinyl-fs": {
+ "version": "0.3.14",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz",
+ "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=",
+ "dev": true,
+ "requires": {
+ "defaults": "1.0.3",
+ "glob-stream": "3.1.18",
+ "glob-watcher": "0.0.6",
+ "graceful-fs": "3.0.11",
+ "mkdirp": "0.5.1",
+ "strip-bom": "1.0.0",
+ "through2": "0.6.5",
+ "vinyl": "0.4.6"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
+ "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
+ "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
+ "dev": true,
+ "requires": {
+ "natives": "1.1.1"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ },
+ "vinyl": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
+ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
+ "dev": true,
+ "requires": {
+ "clone": "0.2.0",
+ "clone-stats": "0.0.1"
+ }
+ }
+ }
+ },
+ "vinyl-sourcemaps-apply": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz",
+ "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7"
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.1.tgz",
+ "integrity": "sha1-Eahr7+rDxKo+wIYjZRo8gabQu8g=",
+ "dev": true
+ },
+ "vulcanize": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/vulcanize/-/vulcanize-1.16.0.tgz",
+ "integrity": "sha512-TYlFljSc896b5+0FmMiw0JAMrHNBiHx0IAFC/dQR3Dxdb9Nx43ohm6wMWTlPXQn4sk/0WkqfgoAA6SLxyvPCLQ==",
+ "dev": true,
+ "requires": {
+ "dom5": "1.3.6",
+ "es6-promise": "2.3.0",
+ "hydrolysis": "1.25.0",
+ "nopt": "3.0.6",
+ "path-posix": "1.0.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "0.0.31",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-0.0.31.tgz",
+ "integrity": "sha1-6Cekk6RDsVbhtYKi5MO9wAQPLuc=",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.101"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.101",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz",
+ "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==",
+ "dev": true
+ }
+ }
+ },
+ "clone": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
+ "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=",
+ "dev": true
+ },
+ "dom5": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-1.3.6.tgz",
+ "integrity": "sha1-pwiKn8XzsI3J9u2kx6uuskGUXg0=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "4.2.23",
+ "@types/parse5": "0.0.31",
+ "clone": "1.0.3",
+ "parse5": "1.5.1"
+ }
+ },
+ "parse5": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
+ "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=",
+ "dev": true
+ }
+ }
+ },
+ "walkdir": {
+ "version": "0.0.11",
+ "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz",
+ "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=",
+ "dev": true
+ },
+ "wbuf": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz",
+ "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=",
+ "dev": true,
+ "requires": {
+ "minimalistic-assert": "1.0.0"
+ }
+ },
+ "wct-local": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wct-local/-/wct-local-2.1.0.tgz",
+ "integrity": "sha512-OiMSbxp6e5tyvTbUA4VAQbw4we53EXEmekx9BbIgS/HryoQISzap5DSAE/kvpRpJ2Axt0z12d8ChxqwNflApfA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "@types/express": "4.11.0",
+ "@types/freeport": "1.0.21",
+ "@types/launchpad": "0.6.0",
+ "@types/node": "9.4.0",
+ "@types/which": "1.3.1",
+ "chalk": "2.3.0",
+ "cleankill": "2.0.0",
+ "freeport": "1.0.5",
+ "launchpad": "0.7.0",
+ "promisify-node": "0.4.0",
+ "selenium-standalone": "6.12.0",
+ "which": "1.3.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "9.4.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.0.tgz",
+ "integrity": "sha512-zkYho6/4wZyX6o9UQ8rd0ReEaiEYNNCqYFIAACe2Tf9DrYlgzWW27OigYHnnztnnZQwVRpwWmZKegFmDpinIsA==",
+ "dev": true,
+ "optional": true
+ },
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ }
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "wct-sauce": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/wct-sauce/-/wct-sauce-2.0.0.tgz",
+ "integrity": "sha512-amICD6iZOVJEJ4uymfdPFdk17CkSIYwHPDzDh4cH/ITYcNskZ3VB/2VPtU9ZIKuWMVdqPwfBovXcjlhn8+8idA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "cleankill": "2.0.0",
+ "lodash": "3.10.1",
+ "request": "2.79.0",
+ "sauce-connect-launcher": "1.2.3",
+ "temp": "0.8.3",
+ "uuid": "2.0.3"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true,
+ "optional": true
+ },
+ "uuid": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
+ "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "wd": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/wd/-/wd-1.5.0.tgz",
+ "integrity": "sha512-e/KpzTlhtSG3Ek0AcRz4G6PhxGsc53Nro+GkI1er9p05tWQ7W9dpGZR5SqQzGUqvbaqJCThDSAGaY7LHgi6MiA==",
+ "dev": true,
+ "requires": {
+ "archiver": "1.3.0",
+ "async": "2.0.1",
+ "lodash": "4.16.2",
+ "mkdirp": "0.5.1",
+ "q": "1.4.1",
+ "request": "2.79.0",
+ "underscore.string": "3.3.4",
+ "vargs": "0.1.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.0.1.tgz",
+ "integrity": "sha1-twnMAoCpw28J9FNr6CPIOKkEniU=",
+ "dev": true,
+ "requires": {
+ "lodash": "4.16.2"
+ }
+ },
+ "lodash": {
+ "version": "4.16.2",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.2.tgz",
+ "integrity": "sha1-PmJtuCcEimmSgaihJSJjJs/A5lI=",
+ "dev": true
+ },
+ "q": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz",
+ "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=",
+ "dev": true
+ }
+ }
+ },
+ "web-component-tester": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/web-component-tester/-/web-component-tester-6.5.0.tgz",
+ "integrity": "sha512-C8nK7mhLTGzm/3QcjBIzI5Pk3OLrEvup246Pc9stAD+sTvLWtH8tjVL+vU5KCOAdudKVnelGMbE4ICaNrl69+A==",
+ "dev": true,
+ "requires": {
+ "@polymer/sinonjs": "1.17.1",
+ "@polymer/test-fixture": "0.0.3",
+ "@webcomponents/webcomponentsjs": "1.1.0",
+ "accessibility-developer-tools": "2.12.0",
+ "async": "2.6.0",
+ "body-parser": "1.18.2",
+ "chai": "4.1.2",
+ "chalk": "1.1.3",
+ "cleankill": "2.0.0",
+ "express": "4.16.2",
+ "findup-sync": "1.0.0",
+ "glob": "7.1.2",
+ "lodash": "3.10.1",
+ "mocha": "3.5.3",
+ "multer": "1.3.0",
+ "nomnom": "1.8.1",
+ "polyserve": "0.23.0",
+ "promisify-node": "0.4.0",
+ "resolve": "1.5.0",
+ "semver": "5.5.0",
+ "send": "0.11.1",
+ "server-destroy": "1.0.1",
+ "sinon": "2.4.1",
+ "sinon-chai": "2.14.0",
+ "socket.io": "2.0.4",
+ "stacky": "1.3.1",
+ "update-notifier": "2.3.0",
+ "wct-local": "2.1.0",
+ "wct-sauce": "2.0.0",
+ "wd": "1.5.0"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0"
+ }
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+ "dev": true
+ },
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "requires": {
+ "lodash": "4.17.4"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "4.17.4",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
+ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
+ "dev": true
+ }
+ }
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "dev": true,
+ "requires": {
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.2"
+ }
+ },
+ "detect-file": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz",
+ "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=",
+ "dev": true,
+ "requires": {
+ "fs-exists-sync": "0.1.0"
+ }
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "dev": true,
+ "requires": {
+ "is-posix-bracket": "0.1.1"
+ }
+ },
+ "expand-tilde": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz",
+ "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "findup-sync": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-1.0.0.tgz",
+ "integrity": "sha1-b35LV7buOkA3tEFOrt6j9Y9x4Ow=",
+ "dev": true,
+ "requires": {
+ "detect-file": "0.1.0",
+ "is-glob": "2.0.1",
+ "micromatch": "2.3.11",
+ "resolve-dir": "0.1.1"
+ }
+ },
+ "global-modules": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz",
+ "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=",
+ "dev": true,
+ "requires": {
+ "global-prefix": "0.1.5",
+ "is-windows": "0.2.0"
+ }
+ },
+ "global-prefix": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz",
+ "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "1.0.1",
+ "ini": "1.3.5",
+ "is-windows": "0.2.0",
+ "which": "1.3.0"
+ }
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ },
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "dev": true,
+ "requires": {
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
+ }
+ },
+ "resolve-dir": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz",
+ "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "1.2.2",
+ "global-modules": "0.2.3"
+ }
+ },
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ }
+ }
+ },
+ "which": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
+ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
+ "dev": true,
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ },
+ "widest-line": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz",
+ "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=",
+ "dev": true,
+ "requires": {
+ "string-width": "2.1.1"
+ }
+ },
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "write": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+ "dev": true,
+ "requires": {
+ "mkdirp": "0.5.1"
+ }
+ },
+ "write-file-atomic": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
+ "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "imurmurhash": "0.1.4",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "ws": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
+ "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
+ "dev": true,
+ "requires": {
+ "async-limiter": "1.0.0",
+ "safe-buffer": "5.1.1",
+ "ultron": "1.1.1"
+ }
+ },
+ "xdg-basedir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
+ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
+ "dev": true
+ },
+ "xmlbuilder": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",
+ "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=",
+ "dev": true,
+ "optional": true
+ },
+ "xmldom": {
+ "version": "0.1.27",
+ "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz",
+ "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=",
+ "dev": true,
+ "optional": true
+ },
+ "xmlhttprequest-ssl": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
+ "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=",
+ "dev": true
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ },
+ "yauzl": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz",
+ "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "buffer-crc32": "0.2.13",
+ "fd-slicer": "1.0.1"
+ }
+ },
+ "yeast": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
+ "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
+ "dev": true
+ },
+ "zip-stream": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz",
+ "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=",
+ "dev": true,
+ "requires": {
+ "archiver-utils": "1.3.0",
+ "compress-commons": "1.2.2",
+ "lodash": "4.17.4",
+ "readable-stream": "2.3.3"
+ }
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/package.json
new file mode 100644
index 00000000000..6dd76ec68cb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/package.json
@@ -0,0 +1,56 @@
+{
+ "name": "@polymer/polymer",
+ "version": "2.6.0",
+ "description": "The Polymer library makes it easy to create your own web components. Give your element some markup and properties, and then use it on a site. Polymer provides features like dynamic templates and data binding to reduce the amount of boilerplate you need to write",
+ "main": "polymer.html",
+ "directories": {
+ "doc": "docs",
+ "test": "test"
+ },
+ "devDependencies": {
+ "@polymer/gen-closure-declarations": "^0.4.0",
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "@webcomponents/shadycss": "^1.1.0",
+ "@webcomponents/webcomponentsjs": "^1.1.0",
+ "babel-preset-minify": "^0.2.0",
+ "del": "^3.0.0",
+ "dom5": "^3.0.0",
+ "eslint-plugin-html": "^4.0.1",
+ "fs-extra": "^5.0.0",
+ "google-closure-compiler": "^20180204.0.0",
+ "gulp": "^3.9.1",
+ "gulp-babel": "^6.1.2",
+ "gulp-eslint": "^4.0.0",
+ "gulp-if": "^2.0.1",
+ "gulp-replace": "^0.6.1",
+ "gulp-size": "^3.0.0",
+ "gulp-vulcanize": "^7.0.0",
+ "lazypipe": "^1.0.1",
+ "merge-stream": "^1.0.1",
+ "parse5": "^4.0.0",
+ "polymer-build": "^2.1.1",
+ "run-sequence": "^2.2.0",
+ "through2": "^2.0.0",
+ "web-component-tester": "^6.5.0"
+ },
+ "scripts": {
+ "build": "gulp",
+ "test": "npm run lint && wct",
+ "lint": "gulp lint",
+ "version": "gulp update-version && git add lib/utils/boot.html",
+ "update-types": "gulp update-types"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/Polymer/polymer.git"
+ },
+ "author": "The Polymer Project Authors",
+ "license": "BSD-3-Clause",
+ "bugs": {
+ "url": "https://github.com/Polymer/polymer/issues"
+ },
+ "homepage": "https://github.com/Polymer/polymer",
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/polymer-element.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/polymer-element.html
new file mode 100644
index 00000000000..aeb4a0e1937
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/polymer-element.html
@@ -0,0 +1,44 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="lib/mixins/element-mixin.html">
+<!-- import html-tag to export html -->
+<link rel="import" href="lib/utils/html-tag.html">
+<script>
+(function() {
+ 'use strict';
+
+ /**
+ * Base class that provides the core API for Polymer's meta-programming
+ * features including template stamping, data-binding, attribute deserialization,
+ * and property change observation.
+ *
+ * @customElement
+ * @polymer
+ * @memberof Polymer
+ * @constructor
+ * @implements {Polymer_ElementMixin}
+ * @extends HTMLElement
+ * @appliesMixin Polymer.ElementMixin
+ * @summary Custom element base class that provides the core API for Polymer's
+ * key meta-programming features including template stamping, data-binding,
+ * attribute deserialization, and property change observation
+ */
+ const Element = Polymer.ElementMixin(HTMLElement);
+ /**
+ * @constructor
+ * @implements {Polymer_ElementMixin}
+ * @extends {HTMLElement}
+ */
+ Polymer.Element = Element;
+
+ // NOTE: this is here for modulizer to export `html` for the module version of this file
+ Polymer.html = Polymer.html;
+})();
+</script> \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/polymer.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/polymer.html
new file mode 100644
index 00000000000..a2ceeadb0cc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/polymer.html
@@ -0,0 +1,30 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<link rel="import" href="lib/legacy/legacy-element-mixin.html">
+<link rel="import" href="lib/legacy/polymer-fn.html">
+<!-- template elements -->
+<link rel="import" href="lib/legacy/templatizer-behavior.html">
+<link rel="import" href="lib/elements/dom-bind.html">
+<link rel="import" href="lib/elements/dom-repeat.html">
+<link rel="import" href="lib/elements/dom-if.html">
+<link rel="import" href="lib/elements/array-selector.html">
+<!-- custom-style -->
+<link rel="import" href="lib/elements/custom-style.html">
+<!-- bc behaviors -->
+<link rel="import" href="lib/legacy/mutable-data-behavior.html">
+<!-- import html-tag to export html -->
+<link rel="import" href="lib/utils/html-tag.html">
+<script>
+ // bc
+ Polymer.Base = Polymer.LegacyElementMixin(HTMLElement).prototype;
+
+ // NOTE: this is here for modulizer to export `html` for the module version of this file
+ Polymer.html = Polymer.html;
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/extra-types.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/extra-types.d.ts
new file mode 100644
index 00000000000..c4d38f5fb52
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/extra-types.d.ts
@@ -0,0 +1,147 @@
+/**
+ * This file contains the types that are required for compilation of the
+ * Polymer generated type declarations, but which could not themselves be
+ * automatically generated.
+ */
+
+// Types from "externs/polymer-externs.js"
+
+interface PolymerElementPropertiesMeta {
+ type?: Function;
+ value?: any;
+ readOnly?: boolean;
+ computed?: string;
+ reflectToAttribute?: boolean;
+ notify?: boolean;
+ observer?: string|((val: any, old: any) => void);
+}
+
+type PolymerElementProperties = {
+ [key: string]: PolymerElementPropertiesMeta
+};
+
+// TODO Document these properties.
+interface PolymerInit {
+ is: string;
+ extends?: string;
+ properties?: PolymerElementProperties;
+ observers?: string[];
+ template?: HTMLTemplateElement|string;
+ hostAttributes?: {[key: string]: any};
+ listeners?: {[key: string]: string};
+}
+
+// Types from "externs/polymer-internal-shared-types.js"
+
+interface StampedTemplate extends DocumentFragment {
+ __noInsertionPoint: boolean;
+ nodeList: Node[];
+ $: {[key: string]: Node};
+ templateInfo?: TemplateInfo;
+}
+
+interface NodeInfo {
+ id: string;
+ events: {name: string, value: string}[];
+ hasInsertionPoint: boolean;
+ templateInfo: TemplateInfo;
+ parentInfo: NodeInfo;
+ parentIndex: number;
+ infoIndex: number;
+ bindings: Binding[];
+}
+
+interface TemplateInfo {
+ nodeInfoList: NodeInfo[];
+ nodeList: Node[];
+ stripWhitespace: boolean;
+ hasInsertionPoint?: boolean;
+ hostProps: Object;
+ propertyEffects: Object;
+ nextTemplateInfo?: TemplateInfo;
+ previousTemplateInfo?: TemplateInfo;
+ childNodes: Node[];
+ wasPreBound: boolean;
+}
+
+interface LiteralBindingPart {
+ literal: string;
+ compoundIndex?: number;
+}
+
+interface MethodArg {
+ literal: boolean;
+ name: string;
+ value: string|number;
+ rootProperty?: string;
+ structured?: boolean;
+ wildcard?: boolean;
+}
+
+interface MethodSignature {
+ methodName: string;
+ static: boolean;
+ args: MethodArg[];
+ dynamicFn?: boolean;
+}
+
+interface ExpressionBindingPart {
+ mode: string;
+ negate: boolean;
+ source: string;
+ dependencies: Array<MethodArg|string>;
+ customEvent: boolean;
+ signature: Object|null;
+ event: string;
+}
+
+type BindingPart = LiteralBindingPart|ExpressionBindingPart;
+
+interface Binding {
+ kind: string;
+ target: string;
+ parts: BindingPart[];
+ literal?: string;
+ isCompound: boolean;
+ listenerEvent?: string;
+ listenerNegate?: boolean;
+}
+
+interface AsyncInterface {
+ run: (fn: Function, delay?: number) => number;
+ cancel: (handle: number) => void;
+}
+
+// Types from "lib/utils/gestures.html"
+
+interface GestureRecognizer {
+ reset: () => void;
+ mousedown?: (e: MouseEvent) => void;
+ mousemove?: (e: MouseEvent) => void;
+ mouseup?: (e: MouseEvent) => void;
+ touchstart?: (e: TouchEvent) => void;
+ touchmove?: (e: TouchEvent) => void;
+ touchend?: (e: TouchEvent) => void;
+ click?: (e: MouseEvent) => void;
+}
+
+/**
+ * Not defined in the TypeScript DOM library.
+ * See https://developer.mozilla.org/en-US/docs/Web/API/IdleDeadline
+ */
+interface IdleDeadline {
+ didTimeout: boolean;
+ timeRemaining(): number;
+}
+
+/**
+ * Polymer defines its own `Element` class, shadowing the standard global
+ * `Element` class. This means that references to `Element` within the `Polymer`
+ * namespace inadvertently reference `Polymer.Element`. Here we define an alias
+ * of the global `Element`, so that we can reference it from declarations within
+ * the `Polymer` namespace.
+ *
+ * See https://github.com/Microsoft/TypeScript/issues/983 for general discussion
+ * of this shadowing problem in TypeScript.
+ */
+type _Element = Element;
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/array-selector.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/array-selector.d.ts
new file mode 100644
index 00000000000..1d99ee52e4e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/array-selector.d.ts
@@ -0,0 +1,200 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/elements/array-selector.html
+ */
+
+/// <reference path="../../polymer-element.d.ts" />
+/// <reference path="../utils/mixin.d.ts" />
+/// <reference path="../utils/array-splice.d.ts" />
+
+declare namespace Polymer {
+
+
+ /**
+ * Element mixin for recording dynamic associations between item paths in a
+ * master `items` array and a `selected` array such that path changes to the
+ * master array (at the host) element or elsewhere via data-binding) are
+ * correctly propagated to items in the selected array and vice-versa.
+ *
+ * The `items` property accepts an array of user data, and via the
+ * `select(item)` and `deselect(item)` API, updates the `selected` property
+ * which may be bound to other parts of the application, and any changes to
+ * sub-fields of `selected` item(s) will be kept in sync with items in the
+ * `items` array. When `multi` is false, `selected` is a property
+ * representing the last selected item. When `multi` is true, `selected`
+ * is an array of multiply selected items.
+ */
+ function ArraySelectorMixin<T extends new (...args: any[]) => {}>(base: T): T & ArraySelectorMixinConstructor & Polymer.ElementMixinConstructor & Polymer.PropertyEffectsConstructor & Polymer.TemplateStampConstructor & Polymer.PropertyAccessorsConstructor & Polymer.PropertiesChangedConstructor & Polymer.PropertiesMixinConstructor;
+
+ interface ArraySelectorMixinConstructor {
+ new(...args: any[]): ArraySelectorMixin;
+ }
+
+ interface ArraySelectorMixin {
+
+ /**
+ * An array containing items from which selection will be made.
+ */
+ items: any[]|null|undefined;
+
+ /**
+ * When `true`, multiple items may be selected at once (in this case,
+ * `selected` is an array of currently selected items). When `false`,
+ * only one item may be selected at a time.
+ */
+ multi: boolean|null|undefined;
+
+ /**
+ * When `multi` is true, this is an array that contains any selected.
+ * When `multi` is false, this is the currently selected item, or `null`
+ * if no item is selected.
+ */
+ selected: object|object[]|null;
+
+ /**
+ * When `multi` is false, this is the currently selected item, or `null`
+ * if no item is selected.
+ */
+ selectedItem: object|null;
+
+ /**
+ * When `true`, calling `select` on an item that is already selected
+ * will deselect the item.
+ */
+ toggle: boolean|null|undefined;
+
+ /**
+ * Clears the selection state.
+ */
+ clearSelection(): void;
+
+ /**
+ * Returns whether the item is currently selected.
+ *
+ * @param item Item from `items` array to test
+ * @returns Whether the item is selected
+ */
+ isSelected(item: any): boolean;
+
+ /**
+ * Returns whether the item is currently selected.
+ *
+ * @param idx Index from `items` array to test
+ * @returns Whether the item is selected
+ */
+ isIndexSelected(idx: number): boolean;
+
+ /**
+ * Deselects the given item if it is already selected.
+ *
+ * @param item Item from `items` array to deselect
+ */
+ deselect(item: any): void;
+
+ /**
+ * Deselects the given index if it is already selected.
+ *
+ * @param idx Index from `items` array to deselect
+ */
+ deselectIndex(idx: number): void;
+
+ /**
+ * Selects the given item. When `toggle` is true, this will automatically
+ * deselect the item if already selected.
+ *
+ * @param item Item from `items` array to select
+ */
+ select(item: any): void;
+
+ /**
+ * Selects the given index. When `toggle` is true, this will automatically
+ * deselect the item if already selected.
+ *
+ * @param idx Index from `items` array to select
+ */
+ selectIndex(idx: number): void;
+ }
+
+ /**
+ * Element implementing the `Polymer.ArraySelector` mixin, which records
+ * dynamic associations between item paths in a master `items` array and a
+ * `selected` array such that path changes to the master array (at the host)
+ * element or elsewhere via data-binding) are correctly propagated to items
+ * in the selected array and vice-versa.
+ *
+ * The `items` property accepts an array of user data, and via the
+ * `select(item)` and `deselect(item)` API, updates the `selected` property
+ * which may be bound to other parts of the application, and any changes to
+ * sub-fields of `selected` item(s) will be kept in sync with items in the
+ * `items` array. When `multi` is false, `selected` is a property
+ * representing the last selected item. When `multi` is true, `selected`
+ * is an array of multiply selected items.
+ *
+ * Example:
+ *
+ * ```html
+ * <dom-module id="employee-list">
+ *
+ * <template>
+ *
+ * <div> Employee list: </div>
+ * <dom-repeat id="employeeList" items="{{employees}}">
+ * <template>
+ * <div>First name: <span>{{item.first}}</span></div>
+ * <div>Last name: <span>{{item.last}}</span></div>
+ * <button on-click="toggleSelection">Select</button>
+ * </template>
+ * </dom-repeat>
+ *
+ * <array-selector id="selector" items="{{employees}}" selected="{{selected}}" multi toggle></array-selector>
+ *
+ * <div> Selected employees: </div>
+ * <dom-repeat items="{{selected}}">
+ * <template>
+ * <div>First name: <span>{{item.first}}</span></div>
+ * <div>Last name: <span>{{item.last}}</span></div>
+ * </template>
+ * </dom-repeat>
+ *
+ * </template>
+ *
+ * </dom-module>
+ * ```
+ *
+ * ```js
+ * class EmployeeList extends Polymer.Element {
+ * static get is() { return 'employee-list'; }
+ * static get properties() {
+ * return {
+ * employees: {
+ * value() {
+ * return [
+ * {first: 'Bob', last: 'Smith'},
+ * {first: 'Sally', last: 'Johnson'},
+ * ...
+ * ];
+ * }
+ * }
+ * };
+ * }
+ * toggleSelection(e) {
+ * let item = this.$.employeeList.itemForElement(e.target);
+ * this.$.selector.select(item);
+ * }
+ * }
+ * ```
+ */
+ class ArraySelector extends
+ Polymer.ArraySelectorMixin(
+ Polymer.Element) {
+ }
+}
+
+interface HTMLElementTagNameMap {
+ "array-selector": Polymer.ArraySelector;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/custom-style.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/custom-style.d.ts
new file mode 100644
index 00000000000..a0c19a23d14
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/custom-style.d.ts
@@ -0,0 +1,71 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/elements/custom-style.html
+ */
+
+/// <reference path="../utils/style-gather.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Custom element for defining styles in the main document that can take
+ * advantage of [shady DOM](https://github.com/webcomponents/shadycss) shims
+ * for style encapsulation, custom properties, and custom mixins.
+ *
+ * - Document styles defined in a `<custom-style>` are shimmed to ensure they
+ * do not leak into local DOM when running on browsers without native
+ * Shadow DOM.
+ * - Custom properties can be defined in a `<custom-style>`. Use the `html` selector
+ * to define custom properties that apply to all custom elements.
+ * - Custom mixins can be defined in a `<custom-style>`, if you import the optional
+ * [apply shim](https://github.com/webcomponents/shadycss#about-applyshim)
+ * (`shadycss/apply-shim.html`).
+ *
+ * To use:
+ *
+ * - Import `custom-style.html`.
+ * - Place a `<custom-style>` element in the main document, wrapping an inline `<style>` tag that
+ * contains the CSS rules you want to shim.
+ *
+ * For example:
+ *
+ * ```html
+ * <!-- import apply shim--only required if using mixins -->
+ * <link rel="import" href="bower_components/shadycss/apply-shim.html">
+ * <!-- import custom-style element -->
+ * <link rel="import" href="bower_components/polymer/lib/elements/custom-style.html">
+ *
+ * <custom-style>
+ * <style>
+ * html {
+ * --custom-color: blue;
+ * --custom-mixin: {
+ * font-weight: bold;
+ * color: red;
+ * };
+ * }
+ * </style>
+ * </custom-style>
+ * ```
+ */
+ class CustomStyle extends HTMLElement {
+
+ /**
+ * Returns the light-DOM `<style>` child this element wraps. Upon first
+ * call any style modules referenced via the `include` attribute will be
+ * concatenated to this element's `<style>`.
+ *
+ * @returns This element's light-DOM `<style>`
+ */
+ getStyle(): HTMLStyleElement|null;
+ }
+}
+
+interface HTMLElementTagNameMap {
+ "custom-style": Polymer.CustomStyle;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/dom-bind.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/dom-bind.d.ts
new file mode 100644
index 00000000000..716dd3f9e29
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/dom-bind.d.ts
@@ -0,0 +1,47 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/elements/dom-bind.html
+ */
+
+/// <reference path="../utils/boot.d.ts" />
+/// <reference path="../mixins/property-effects.d.ts" />
+/// <reference path="../mixins/mutable-data.d.ts" />
+/// <reference path="../mixins/gesture-event-listeners.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Custom element to allow using Polymer's template features (data binding,
+ * declarative event listeners, etc.) in the main document without defining
+ * a new custom element.
+ *
+ * `<template>` tags utilizing bindings may be wrapped with the `<dom-bind>`
+ * element, which will immediately stamp the wrapped template into the main
+ * document and bind elements to the `dom-bind` element itself as the
+ * binding scope.
+ */
+ class DomBind extends
+ Polymer.PropertyEffects(
+ Polymer.OptionalMutableData(
+ Polymer.GestureEventListeners(
+ Polymer.Element))) {
+ attributeChangedCallback(): void;
+ connectedCallback(): void;
+ disconnectedCallback(): void;
+
+ /**
+ * Forces the element to render its content. This is typically only
+ * necessary to call if HTMLImports with the async attribute are used.
+ */
+ render(): void;
+ }
+}
+
+interface HTMLElementTagNameMap {
+ "dom-bind": Polymer.DomBind;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/dom-if.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/dom-if.d.ts
new file mode 100644
index 00000000000..53348545d91
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/dom-if.d.ts
@@ -0,0 +1,71 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/elements/dom-if.html
+ */
+
+/// <reference path="../../polymer-element.d.ts" />
+/// <reference path="../utils/templatize.d.ts" />
+/// <reference path="../utils/debounce.d.ts" />
+/// <reference path="../utils/flush.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * The `<dom-if>` element will stamp a light-dom `<template>` child when
+ * the `if` property becomes truthy, and the template can use Polymer
+ * data-binding and declarative event features when used in the context of
+ * a Polymer element's template.
+ *
+ * When `if` becomes falsy, the stamped content is hidden but not
+ * removed from dom. When `if` subsequently becomes truthy again, the content
+ * is simply re-shown. This approach is used due to its favorable performance
+ * characteristics: the expense of creating template content is paid only
+ * once and lazily.
+ *
+ * Set the `restamp` property to true to force the stamped content to be
+ * created / destroyed when the `if` condition changes.
+ */
+ class DomIf extends Polymer.Element {
+
+ /**
+ * A boolean indicating whether this template should stamp.
+ */
+ if: boolean|null|undefined;
+
+ /**
+ * When true, elements will be removed from DOM and discarded when `if`
+ * becomes false and re-created and added back to the DOM when `if`
+ * becomes true. By default, stamped elements will be hidden but left
+ * in the DOM when `if` becomes false, which is generally results
+ * in better performance.
+ */
+ restamp: boolean|null|undefined;
+ connectedCallback(): void;
+ disconnectedCallback(): void;
+
+ /**
+ * Forces the element to render its content. Normally rendering is
+ * asynchronous to a provoking change. This is done for efficiency so
+ * that multiple changes trigger only a single render. The render method
+ * should be called if, for example, template rendering is required to
+ * validate application state.
+ */
+ render(): void;
+
+ /**
+ * Shows or hides the template instance top level child elements. For
+ * text nodes, `textContent` is removed while "hidden" and replaced when
+ * "shown."
+ */
+ _showHideChildren(): void;
+ }
+}
+
+interface HTMLElementTagNameMap {
+ "dom-if": Polymer.DomIf;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/dom-module.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/dom-module.d.ts
new file mode 100644
index 00000000000..7229968d42a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/dom-module.d.ts
@@ -0,0 +1,82 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/elements/dom-module.html
+ */
+
+/// <reference path="../utils/boot.d.ts" />
+/// <reference path="../utils/resolve-url.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * The `dom-module` element registers the dom it contains to the name given
+ * by the module's id attribute. It provides a unified database of dom
+ * accessible via its static `import` API.
+ *
+ * A key use case of `dom-module` is for providing custom element `<template>`s
+ * via HTML imports that are parsed by the native HTML parser, that can be
+ * relocated during a bundling pass and still looked up by `id`.
+ *
+ * Example:
+ *
+ * <dom-module id="foo">
+ * <img src="stuff.png">
+ * </dom-module>
+ *
+ * Then in code in some other location that cannot access the dom-module above
+ *
+ * let img = customElements.get('dom-module').import('foo', 'img');
+ */
+ class DomModule extends HTMLElement {
+
+ /**
+ * The absolute URL of the original location of this `dom-module`.
+ *
+ * This value will differ from this element's `ownerDocument` in the
+ * following ways:
+ * - Takes into account any `assetpath` attribute added during bundling
+ * to indicate the original location relative to the bundled location
+ * - Uses the HTMLImports polyfill's `importForElement` API to ensure
+ * the path is relative to the import document's location since
+ * `ownerDocument` is not currently polyfilled
+ *
+ */
+ readonly assetpath: any;
+
+ /**
+ * Retrieves the element specified by the css `selector` in the module
+ * registered by `id`. For example, this.import('foo', 'img');
+ *
+ * @param id The id of the dom-module in which to search.
+ * @param selector The css selector by which to find the element.
+ * @returns Returns the element which matches `selector` in the
+ * module registered at the specified `id`.
+ */
+ static import(id: string, selector?: string): _Element|null;
+
+ /**
+ * @param name Name of attribute.
+ * @param old Old value of attribute.
+ * @param value Current value of attribute.
+ */
+ attributeChangedCallback(name: string, old: string|null, value: string|null): void;
+
+ /**
+ * Registers the dom-module at a given id. This method should only be called
+ * when a dom-module is imperatively created. For
+ * example, `document.createElement('dom-module').register('foo')`.
+ *
+ * @param id The id at which to register the dom-module.
+ */
+ register(id?: string): void;
+ }
+}
+
+interface HTMLElementTagNameMap {
+ "dom-module": Polymer.DomModule;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/dom-repeat.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/dom-repeat.d.ts
new file mode 100644
index 00000000000..db3c543b73d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/elements/dom-repeat.d.ts
@@ -0,0 +1,282 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/elements/dom-repeat.html
+ */
+
+/// <reference path="../../polymer-element.d.ts" />
+/// <reference path="../utils/templatize.d.ts" />
+/// <reference path="../utils/debounce.d.ts" />
+/// <reference path="../utils/flush.d.ts" />
+/// <reference path="../mixins/mutable-data.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * The `<dom-repeat>` element will automatically stamp and binds one instance
+ * of template content to each object in a user-provided array.
+ * `dom-repeat` accepts an `items` property, and one instance of the template
+ * is stamped for each item into the DOM at the location of the `dom-repeat`
+ * element. The `item` property will be set on each instance's binding
+ * scope, thus templates should bind to sub-properties of `item`.
+ *
+ * Example:
+ *
+ * ```html
+ * <dom-module id="employee-list">
+ *
+ * <template>
+ *
+ * <div> Employee list: </div>
+ * <dom-repeat items="{{employees}}">
+ * <template>
+ * <div>First name: <span>{{item.first}}</span></div>
+ * <div>Last name: <span>{{item.last}}</span></div>
+ * </template>
+ * </dom-repeat>
+ *
+ * </template>
+ *
+ * </dom-module>
+ * ```
+ *
+ * With the following custom element definition:
+ *
+ * ```js
+ * class EmployeeList extends Polymer.Element {
+ * static get is() { return 'employee-list'; }
+ * static get properties() {
+ * return {
+ * employees: {
+ * value() {
+ * return [
+ * {first: 'Bob', last: 'Smith'},
+ * {first: 'Sally', last: 'Johnson'},
+ * ...
+ * ];
+ * }
+ * }
+ * };
+ * }
+ * }
+ * ```
+ *
+ * Notifications for changes to items sub-properties will be forwarded to template
+ * instances, which will update via the normal structured data notification system.
+ *
+ * Mutations to the `items` array itself should be made using the Array
+ * mutation API's on `Polymer.Base` (`push`, `pop`, `splice`, `shift`,
+ * `unshift`), and template instances will be kept in sync with the data in the
+ * array.
+ *
+ * Events caught by event handlers within the `dom-repeat` template will be
+ * decorated with a `model` property, which represents the binding scope for
+ * each template instance. The model is an instance of Polymer.Base, and should
+ * be used to manipulate data on the instance, for example
+ * `event.model.set('item.checked', true);`.
+ *
+ * Alternatively, the model for a template instance for an element stamped by
+ * a `dom-repeat` can be obtained using the `modelForElement` API on the
+ * `dom-repeat` that stamped it, for example
+ * `this.$.domRepeat.modelForElement(event.target).set('item.checked', true);`.
+ * This may be useful for manipulating instance data of event targets obtained
+ * by event handlers on parents of the `dom-repeat` (event delegation).
+ *
+ * A view-specific filter/sort may be applied to each `dom-repeat` by supplying a
+ * `filter` and/or `sort` property. This may be a string that names a function on
+ * the host, or a function may be assigned to the property directly. The functions
+ * should implemented following the standard `Array` filter/sort API.
+ *
+ * In order to re-run the filter or sort functions based on changes to sub-fields
+ * of `items`, the `observe` property may be set as a space-separated list of
+ * `item` sub-fields that should cause a re-filter/sort when modified. If
+ * the filter or sort function depends on properties not contained in `items`,
+ * the user should observe changes to those properties and call `render` to update
+ * the view based on the dependency change.
+ *
+ * For example, for an `dom-repeat` with a filter of the following:
+ *
+ * ```js
+ * isEngineer(item) {
+ * return item.type == 'engineer' || item.manager.type == 'engineer';
+ * }
+ * ```
+ *
+ * Then the `observe` property should be configured as follows:
+ *
+ * ```html
+ * <dom-repeat items="{{employees}}" filter="isEngineer" observe="type manager.type">
+ * ```
+ */
+ class DomRepeat extends
+ Polymer.OptionalMutableData(
+ Polymer.Element) {
+
+ /**
+ * An array containing items determining how many instances of the template
+ * to stamp and that that each template instance should bind to.
+ */
+ items: any[]|null|undefined;
+
+ /**
+ * The name of the variable to add to the binding scope for the array
+ * element associated with a given template instance.
+ */
+ as: string|null|undefined;
+
+ /**
+ * The name of the variable to add to the binding scope with the index
+ * of the instance in the sorted and filtered list of rendered items.
+ * Note, for the index in the `this.items` array, use the value of the
+ * `itemsIndexAs` property.
+ */
+ indexAs: string|null|undefined;
+
+ /**
+ * The name of the variable to add to the binding scope with the index
+ * of the instance in the `this.items` array. Note, for the index of
+ * this instance in the sorted and filtered list of rendered items,
+ * use the value of the `indexAs` property.
+ */
+ itemsIndexAs: string|null|undefined;
+
+ /**
+ * A function that should determine the sort order of the items. This
+ * property should either be provided as a string, indicating a method
+ * name on the element's host, or else be an actual function. The
+ * function should match the sort function passed to `Array.sort`.
+ * Using a sort function has no effect on the underlying `items` array.
+ */
+ sort: Function|null|undefined;
+
+ /**
+ * A function that can be used to filter items out of the view. This
+ * property should either be provided as a string, indicating a method
+ * name on the element's host, or else be an actual function. The
+ * function should match the sort function passed to `Array.filter`.
+ * Using a filter function has no effect on the underlying `items` array.
+ */
+ filter: Function|null|undefined;
+
+ /**
+ * When using a `filter` or `sort` function, the `observe` property
+ * should be set to a space-separated list of the names of item
+ * sub-fields that should trigger a re-sort or re-filter when changed.
+ * These should generally be fields of `item` that the sort or filter
+ * function depends on.
+ */
+ observe: string|null|undefined;
+
+ /**
+ * When using a `filter` or `sort` function, the `delay` property
+ * determines a debounce time in ms after a change to observed item
+ * properties that must pass before the filter or sort is re-run.
+ * This is useful in rate-limiting shuffling of the view when
+ * item changes may be frequent.
+ */
+ delay: number|null|undefined;
+
+ /**
+ * Count of currently rendered items after `filter` (if any) has been applied.
+ * If "chunking mode" is enabled, `renderedItemCount` is updated each time a
+ * set of template instances is rendered.
+ */
+ readonly renderedItemCount: number|null|undefined;
+
+ /**
+ * Defines an initial count of template instances to render after setting
+ * the `items` array, before the next paint, and puts the `dom-repeat`
+ * into "chunking mode". The remaining items will be created and rendered
+ * incrementally at each animation frame therof until all instances have
+ * been rendered.
+ */
+ initialCount: number|null|undefined;
+
+ /**
+ * When `initialCount` is used, this property defines a frame rate (in
+ * fps) to target by throttling the number of instances rendered each
+ * frame to not exceed the budget for the target frame rate. The
+ * framerate is effectively the number of `requestAnimationFrame`s that
+ * it tries to allow to actually fire in a given second. It does this
+ * by measuring the time between `rAF`s and continuously adjusting the
+ * number of items created each `rAF` to maintain the target framerate.
+ * Setting this to a higher number allows lower latency and higher
+ * throughput for event handlers and other tasks, but results in a
+ * longer time for the remaining items to complete rendering.
+ */
+ targetFramerate: number|null|undefined;
+ readonly _targetFrameTime: number|null|undefined;
+ disconnectedCallback(): void;
+ connectedCallback(): void;
+
+ /**
+ * Forces the element to render its content. Normally rendering is
+ * asynchronous to a provoking change. This is done for efficiency so
+ * that multiple changes trigger only a single render. The render method
+ * should be called if, for example, template rendering is required to
+ * validate application state.
+ */
+ render(): void;
+
+ /**
+ * Shows or hides the template instance top level child elements. For
+ * text nodes, `textContent` is removed while "hidden" and replaced when
+ * "shown."
+ *
+ * @param hidden Set to true to hide the children;
+ * set to false to show them.
+ */
+ _showHideChildren(hidden: boolean): void;
+
+ /**
+ * Returns the item associated with a given element stamped by
+ * this `dom-repeat`.
+ *
+ * Note, to modify sub-properties of the item,
+ * `modelForElement(el).set('item.<sub-prop>', value)`
+ * should be used.
+ *
+ * @param el Element for which to return the item.
+ * @returns Item associated with the element.
+ */
+ itemForElement(el: HTMLElement): any;
+
+ /**
+ * Returns the inst index for a given element stamped by this `dom-repeat`.
+ * If `sort` is provided, the index will reflect the sorted order (rather
+ * than the original array order).
+ *
+ * @param el Element for which to return the index.
+ * @returns Row index associated with the element (note this may
+ * not correspond to the array index if a user `sort` is applied).
+ */
+ indexForElement(el: HTMLElement): number|null;
+
+ /**
+ * Returns the template "model" associated with a given element, which
+ * serves as the binding scope for the template instance the element is
+ * contained in. A template model is an instance of `Polymer.Base`, and
+ * should be used to manipulate data associated with this template instance.
+ *
+ * Example:
+ *
+ * let model = modelForElement(el);
+ * if (model.index < 10) {
+ * model.set('item.checked', true);
+ * }
+ *
+ * @param el Element for which to return a template model.
+ * @returns Model representing the binding scope for
+ * the element.
+ */
+ modelForElement(el: HTMLElement): TemplateInstanceBase|null;
+ }
+}
+
+interface HTMLElementTagNameMap {
+ "dom-repeat": Polymer.DomRepeat;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/class.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/class.d.ts
new file mode 100644
index 00000000000..df52a92a2be
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/class.d.ts
@@ -0,0 +1,115 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/legacy/class.html
+ */
+
+/// <reference path="legacy-element-mixin.d.ts" />
+
+declare namespace Polymer {
+
+
+ /**
+ * Applies a "legacy" behavior or array of behaviors to the provided class.
+ *
+ * Note: this method will automatically also apply the `Polymer.LegacyElementMixin`
+ * to ensure that any legacy behaviors can rely on legacy Polymer API on
+ * the underlying element.
+ *
+ * @returns Returns a new Element class extended by the
+ * passed in `behaviors` and also by `Polymer.LegacyElementMixin`.
+ */
+ function mixinBehaviors<T>(behaviors: object|object[], klass: {new(): T}): {new(): T};
+
+
+ /**
+ * Generates a class that extends `Polymer.LegacyElement` based on the
+ * provided info object. Metadata objects on the `info` object
+ * (`properties`, `observers`, `listeners`, `behaviors`, `is`) are used
+ * for Polymer's meta-programming systems, and any functions are copied
+ * to the generated class.
+ *
+ * Valid "metadata" values are as follows:
+ *
+ * `is`: String providing the tag name to register the element under. In
+ * addition, if a `dom-module` with the same id exists, the first template
+ * in that `dom-module` will be stamped into the shadow root of this element,
+ * with support for declarative event listeners (`on-...`), Polymer data
+ * bindings (`[[...]]` and `{{...}}`), and id-based node finding into
+ * `this.$`.
+ *
+ * `properties`: Object describing property-related metadata used by Polymer
+ * features (key: property names, value: object containing property metadata).
+ * Valid keys in per-property metadata include:
+ * - `type` (String|Number|Object|Array|...): Used by
+ * `attributeChangedCallback` to determine how string-based attributes
+ * are deserialized to JavaScript property values.
+ * - `notify` (boolean): Causes a change in the property to fire a
+ * non-bubbling event called `<property>-changed`. Elements that have
+ * enabled two-way binding to the property use this event to observe changes.
+ * - `readOnly` (boolean): Creates a getter for the property, but no setter.
+ * To set a read-only property, use the private setter method
+ * `_setProperty(property, value)`.
+ * - `observer` (string): Observer method name that will be called when
+ * the property changes. The arguments of the method are
+ * `(value, previousValue)`.
+ * - `computed` (string): String describing method and dependent properties
+ * for computing the value of this property (e.g. `'computeFoo(bar, zot)'`).
+ * Computed properties are read-only by default and can only be changed
+ * via the return value of the computing method.
+ *
+ * `observers`: Array of strings describing multi-property observer methods
+ * and their dependent properties (e.g. `'observeABC(a, b, c)'`).
+ *
+ * `listeners`: Object describing event listeners to be added to each
+ * instance of this element (key: event name, value: method name).
+ *
+ * `behaviors`: Array of additional `info` objects containing metadata
+ * and callbacks in the same format as the `info` object here which are
+ * merged into this element.
+ *
+ * `hostAttributes`: Object listing attributes to be applied to the host
+ * once created (key: attribute name, value: attribute value). Values
+ * are serialized based on the type of the value. Host attributes should
+ * generally be limited to attributes such as `tabIndex` and `aria-...`.
+ * Attributes in `hostAttributes` are only applied if a user-supplied
+ * attribute is not already present (attributes in markup override
+ * `hostAttributes`).
+ *
+ * In addition, the following Polymer-specific callbacks may be provided:
+ * - `registered`: called after first instance of this element,
+ * - `created`: called during `constructor`
+ * - `attached`: called during `connectedCallback`
+ * - `detached`: called during `disconnectedCallback`
+ * - `ready`: called before first `attached`, after all properties of
+ * this element have been propagated to its template and all observers
+ * have run
+ *
+ * @returns Generated class
+ */
+ function Class(info: PolymerInit): {new(): HTMLElement};
+}
+
+declare class PolymerGenerated {
+ created(): void;
+ _registered(): void;
+ _applyListeners(): void;
+ _ensureAttributes(): void;
+ ready(): void;
+ attached(): void;
+ detached(): void;
+
+ /**
+ * Implements native Custom Elements `attributeChangedCallback` to
+ * set an attribute value to a property via `_attributeToProperty`.
+ *
+ * @param name Name of attribute that changed
+ * @param old Old attribute value
+ * @param value New attribute value
+ */
+ attributeChanged(name: string, old: string|null, value: string|null): void;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/legacy-element-mixin.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/legacy-element-mixin.d.ts
new file mode 100644
index 00000000000..cfe91646787
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/legacy-element-mixin.d.ts
@@ -0,0 +1,634 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/legacy/legacy-element-mixin.html
+ */
+
+/// <reference path="../mixins/element-mixin.d.ts" />
+/// <reference path="../mixins/gesture-event-listeners.d.ts" />
+/// <reference path="../mixins/dir-mixin.d.ts" />
+/// <reference path="../utils/mixin.d.ts" />
+/// <reference path="../utils/import-href.d.ts" />
+/// <reference path="../utils/render-status.d.ts" />
+/// <reference path="../utils/unresolved.d.ts" />
+/// <reference path="polymer.dom.d.ts" />
+
+declare namespace Polymer {
+
+
+ /**
+ * Element class mixin that provides Polymer's "legacy" API intended to be
+ * backward-compatible to the greatest extent possible with the API
+ * found on the Polymer 1.x `Polymer.Base` prototype applied to all elements
+ * defined using the `Polymer({...})` function.
+ */
+ function LegacyElementMixin<T extends new (...args: any[]) => {}>(base: T): T & LegacyElementMixinConstructor & Polymer.ElementMixinConstructor & Polymer.PropertyEffectsConstructor & Polymer.TemplateStampConstructor & Polymer.PropertyAccessorsConstructor & Polymer.PropertiesChangedConstructor & Polymer.PropertiesMixinConstructor & Polymer.GestureEventListenersConstructor;
+
+ interface LegacyElementMixinConstructor {
+ new(...args: any[]): LegacyElementMixin;
+ }
+
+ interface LegacyElementMixin {
+ isAttached: boolean;
+ _debouncers: {[key: string]: Function|null};
+
+ /**
+ * Return the element whose local dom within which this element
+ * is contained. This is a shorthand for
+ * `this.getRootNode().host`.
+ */
+ readonly domHost: any;
+
+ /**
+ * Overrides the default `Polymer.PropertyEffects` implementation to
+ * add support for installing `hostAttributes` and `listeners`.
+ */
+ ready(): void;
+
+ /**
+ * Overrides the default `Polymer.PropertyEffects` implementation to
+ * add support for class initialization via the `_registered` callback.
+ * This is called only when the first instance of the element is created.
+ */
+ _initializeProperties(): void;
+
+ /**
+ * Provides an override implementation of `attributeChangedCallback`
+ * which adds the Polymer legacy API's `attributeChanged` method.
+ *
+ * @param name Name of attribute.
+ * @param old Old value of attribute.
+ * @param value Current value of attribute.
+ */
+ attributeChangedCallback(name: string, old: string|null, value: string|null): void;
+
+ /**
+ * Provides an implementation of `connectedCallback`
+ * which adds Polymer legacy API's `attached` method.
+ */
+ connectedCallback(): void;
+
+ /**
+ * Provides an implementation of `disconnectedCallback`
+ * which adds Polymer legacy API's `detached` method.
+ */
+ disconnectedCallback(): void;
+
+ /**
+ * Legacy callback called during the `constructor`, for overriding
+ * by the user.
+ */
+ created(): void;
+
+ /**
+ * Legacy callback called during `connectedCallback`, for overriding
+ * by the user.
+ */
+ attached(): void;
+
+ /**
+ * Legacy callback called during `disconnectedCallback`, for overriding
+ * by the user.
+ */
+ detached(): void;
+
+ /**
+ * Legacy callback called during `attributeChangedChallback`, for overriding
+ * by the user.
+ *
+ * @param name Name of attribute.
+ * @param old Old value of attribute.
+ * @param value Current value of attribute.
+ */
+ attributeChanged(name: string, old: string|null, value: string|null): void;
+
+ /**
+ * Called automatically when an element is initializing.
+ * Users may override this method to perform class registration time
+ * work. The implementation should ensure the work is performed
+ * only once for the class.
+ */
+ _registered(): void;
+
+ /**
+ * Ensures an element has required attributes. Called when the element
+ * is being readied via `ready`. Users should override to set the
+ * element's required attributes. The implementation should be sure
+ * to check and not override existing attributes added by
+ * the user of the element. Typically, setting attributes should be left
+ * to the element user and not done here; reasonable exceptions include
+ * setting aria roles and focusability.
+ */
+ _ensureAttributes(): void;
+
+ /**
+ * Adds element event listeners. Called when the element
+ * is being readied via `ready`. Users should override to
+ * add any required element event listeners.
+ * In performance critical elements, the work done here should be kept
+ * to a minimum since it is done before the element is rendered. In
+ * these elements, consider adding listeners asynchronously so as not to
+ * block render.
+ */
+ _applyListeners(): void;
+
+ /**
+ * Converts a typed JavaScript value to a string.
+ *
+ * Note this method is provided as backward-compatible legacy API
+ * only. It is not directly called by any Polymer features. To customize
+ * how properties are serialized to attributes for attribute bindings and
+ * `reflectToAttribute: true` properties as well as this method, override
+ * the `_serializeValue` method provided by `Polymer.PropertyAccessors`.
+ *
+ * @param value Value to deserialize
+ * @returns Serialized value
+ */
+ serialize(value: any): string|undefined;
+
+ /**
+ * Converts a string to a typed JavaScript value.
+ *
+ * Note this method is provided as backward-compatible legacy API
+ * only. It is not directly called by any Polymer features. To customize
+ * how attributes are deserialized to properties for in
+ * `attributeChangedCallback`, override `_deserializeValue` method
+ * provided by `Polymer.PropertyAccessors`.
+ *
+ * @param value String to deserialize
+ * @param type Type to deserialize the string to
+ * @returns Returns the deserialized value in the `type` given.
+ */
+ deserialize(value: string, type: any): any;
+
+ /**
+ * Serializes a property to its associated attribute.
+ *
+ * Note this method is provided as backward-compatible legacy API
+ * only. It is not directly called by any Polymer features.
+ *
+ * @param property Property name to reflect.
+ * @param attribute Attribute name to reflect.
+ * @param value Property value to reflect.
+ */
+ reflectPropertyToAttribute(property: string, attribute?: string, value?: any): void;
+
+ /**
+ * Sets a typed value to an HTML attribute on a node.
+ *
+ * Note this method is provided as backward-compatible legacy API
+ * only. It is not directly called by any Polymer features.
+ *
+ * @param value Value to serialize.
+ * @param attribute Attribute name to serialize to.
+ * @param node Element to set attribute to.
+ */
+ serializeValueToAttribute(value: any, attribute: string, node: _Element|null): void;
+
+ /**
+ * Copies own properties (including accessor descriptors) from a source
+ * object to a target object.
+ *
+ * @param prototype Target object to copy properties to.
+ * @param api Source object to copy properties from.
+ * @returns prototype object that was passed as first argument.
+ */
+ extend(prototype: object|null, api: object|null): object|null;
+
+ /**
+ * Copies props from a source object to a target object.
+ *
+ * Note, this method uses a simple `for...in` strategy for enumerating
+ * properties. To ensure only `ownProperties` are copied from source
+ * to target and that accessor implementations are copied, use `extend`.
+ *
+ * @param target Target object to copy properties to.
+ * @param source Source object to copy properties from.
+ * @returns Target object that was passed as first argument.
+ */
+ mixin(target: object, source: object): object;
+
+ /**
+ * Sets the prototype of an object.
+ *
+ * Note this method is provided as backward-compatible legacy API
+ * only. It is not directly called by any Polymer features.
+ *
+ * @param object The object on which to set the prototype.
+ * @param prototype The prototype that will be set on the given
+ * `object`.
+ * @returns Returns the given `object` with its prototype set
+ * to the given `prototype` object.
+ */
+ chainObject(object: object|null, prototype: object|null): object|null;
+
+ /**
+ * Calls `importNode` on the `content` of the `template` specified and
+ * returns a document fragment containing the imported content.
+ *
+ * @param template HTML template element to instance.
+ * @returns Document fragment containing the imported
+ * template content.
+ */
+ instanceTemplate(template: HTMLTemplateElement|null): DocumentFragment;
+
+ /**
+ * Dispatches a custom event with an optional detail value.
+ *
+ * @param type Name of event type.
+ * @param detail Detail value containing event-specific
+ * payload.
+ * @param options Object specifying options. These may include:
+ * `bubbles` (boolean, defaults to `true`),
+ * `cancelable` (boolean, defaults to false), and
+ * `node` on which to fire the event (HTMLElement, defaults to `this`).
+ * @returns The new event that was fired.
+ */
+ fire(type: string, detail?: any, options?: {bubbles?: boolean, cancelable?: boolean, composed?: boolean}): Event;
+
+ /**
+ * Convenience method to add an event listener on a given element,
+ * late bound to a named method on this element.
+ *
+ * @param node Element to add event listener to.
+ * @param eventName Name of event to listen for.
+ * @param methodName Name of handler method on `this` to call.
+ */
+ listen(node: _Element|null, eventName: string, methodName: string): void;
+
+ /**
+ * Convenience method to remove an event listener from a given element,
+ * late bound to a named method on this element.
+ *
+ * @param node Element to remove event listener from.
+ * @param eventName Name of event to stop listening to.
+ * @param methodName Name of handler method on `this` to not call
+ * anymore.
+ */
+ unlisten(node: _Element|null, eventName: string, methodName: string): void;
+
+ /**
+ * Override scrolling behavior to all direction, one direction, or none.
+ *
+ * Valid scroll directions:
+ * - 'all': scroll in any direction
+ * - 'x': scroll only in the 'x' direction
+ * - 'y': scroll only in the 'y' direction
+ * - 'none': disable scrolling for this node
+ *
+ * @param direction Direction to allow scrolling
+ * Defaults to `all`.
+ * @param node Element to apply scroll direction setting.
+ * Defaults to `this`.
+ */
+ setScrollDirection(direction?: string, node?: _Element|null): void;
+
+ /**
+ * Convenience method to run `querySelector` on this local DOM scope.
+ *
+ * This function calls `Polymer.dom(this.root).querySelector(slctr)`.
+ *
+ * @param slctr Selector to run on this local DOM scope
+ * @returns Element found by the selector, or null if not found.
+ */
+ $$(slctr: string): _Element|null;
+
+ /**
+ * Force this element to distribute its children to its local dom.
+ * This should not be necessary as of Polymer 2.0.2 and is provided only
+ * for backwards compatibility.
+ */
+ distributeContent(): void;
+
+ /**
+ * Returns a list of nodes that are the effective childNodes. The effective
+ * childNodes list is the same as the element's childNodes except that
+ * any `<content>` elements are replaced with the list of nodes distributed
+ * to the `<content>`, the result of its `getDistributedNodes` method.
+ *
+ * @returns List of effective child nodes.
+ */
+ getEffectiveChildNodes(): Node[];
+
+ /**
+ * Returns a list of nodes distributed within this element that match
+ * `selector`. These can be dom children or elements distributed to
+ * children that are insertion points.
+ *
+ * @param selector Selector to run.
+ * @returns List of distributed elements that match selector.
+ */
+ queryDistributedElements(selector: string): Node[];
+
+ /**
+ * Returns a list of elements that are the effective children. The effective
+ * children list is the same as the element's children except that
+ * any `<content>` elements are replaced with the list of elements
+ * distributed to the `<content>`.
+ *
+ * @returns List of effective children.
+ */
+ getEffectiveChildren(): Node[];
+
+ /**
+ * Returns a string of text content that is the concatenation of the
+ * text content's of the element's effective childNodes (the elements
+ * returned by <a href="#getEffectiveChildNodes>getEffectiveChildNodes</a>.
+ *
+ * @returns List of effective children.
+ */
+ getEffectiveTextContent(): string;
+
+ /**
+ * Returns the first effective childNode within this element that
+ * match `selector`. These can be dom child nodes or elements distributed
+ * to children that are insertion points.
+ *
+ * @param selector Selector to run.
+ * @returns First effective child node that matches selector.
+ */
+ queryEffectiveChildren(selector: string): Node|null;
+
+ /**
+ * Returns a list of effective childNodes within this element that
+ * match `selector`. These can be dom child nodes or elements distributed
+ * to children that are insertion points.
+ *
+ * @param selector Selector to run.
+ * @returns List of effective child nodes that match selector.
+ */
+ queryAllEffectiveChildren(selector: string): Node[];
+
+ /**
+ * Returns a list of nodes distributed to this element's `<slot>`.
+ *
+ * If this element contains more than one `<slot>` in its local DOM,
+ * an optional selector may be passed to choose the desired content.
+ *
+ * @param slctr CSS selector to choose the desired
+ * `<slot>`. Defaults to `content`.
+ * @returns List of distributed nodes for the `<slot>`.
+ */
+ getContentChildNodes(slctr?: string): Node[];
+
+ /**
+ * Returns a list of element children distributed to this element's
+ * `<slot>`.
+ *
+ * If this element contains more than one `<slot>` in its
+ * local DOM, an optional selector may be passed to choose the desired
+ * content. This method differs from `getContentChildNodes` in that only
+ * elements are returned.
+ *
+ * @param slctr CSS selector to choose the desired
+ * `<content>`. Defaults to `content`.
+ * @returns List of distributed nodes for the
+ * `<slot>`.
+ */
+ getContentChildren(slctr?: string): HTMLElement[];
+
+ /**
+ * Checks whether an element is in this element's light DOM tree.
+ *
+ * @param node The element to be checked.
+ * @returns true if node is in this element's light DOM tree.
+ */
+ isLightDescendant(node: Node|null): boolean;
+
+ /**
+ * Checks whether an element is in this element's local DOM tree.
+ *
+ * @param node The element to be checked.
+ * @returns true if node is in this element's local DOM tree.
+ */
+ isLocalDescendant(node: _Element): boolean;
+
+ /**
+ * No-op for backwards compatibility. This should now be handled by
+ * ShadyCss library.
+ *
+ * @param container Unused
+ * @param shouldObserve Unused
+ */
+ scopeSubtree(container: any, shouldObserve: any): void;
+
+ /**
+ * Returns the computed style value for the given property.
+ *
+ * @param property The css property name.
+ * @returns Returns the computed css property value for the given
+ * `property`.
+ */
+ getComputedStyleValue(property: string): string;
+
+ /**
+ * Call `debounce` to collapse multiple requests for a named task into
+ * one invocation which is made after the wait time has elapsed with
+ * no new request. If no wait time is given, the callback will be called
+ * at microtask timing (guaranteed before paint).
+ *
+ * debouncedClickAction(e) {
+ * // will not call `processClick` more than once per 100ms
+ * this.debounce('click', function() {
+ * this.processClick();
+ * } 100);
+ * }
+ *
+ * @param jobName String to identify the debounce job.
+ * @param callback Function that is called (with `this`
+ * context) when the wait time elapses.
+ * @param wait Optional wait time in milliseconds (ms) after the
+ * last signal that must elapse before invoking `callback`
+ * @returns Returns a debouncer object on which exists the
+ * following methods: `isActive()` returns true if the debouncer is
+ * active; `cancel()` cancels the debouncer if it is active;
+ * `flush()` immediately invokes the debounced callback if the debouncer
+ * is active.
+ */
+ debounce(jobName: string, callback: () => void, wait: number): object;
+
+ /**
+ * Returns whether a named debouncer is active.
+ *
+ * @param jobName The name of the debouncer started with `debounce`
+ * @returns Whether the debouncer is active (has not yet fired).
+ */
+ isDebouncerActive(jobName: string): boolean;
+
+ /**
+ * Immediately calls the debouncer `callback` and inactivates it.
+ *
+ * @param jobName The name of the debouncer started with `debounce`
+ */
+ flushDebouncer(jobName: string): void;
+
+ /**
+ * Cancels an active debouncer. The `callback` will not be called.
+ *
+ * @param jobName The name of the debouncer started with `debounce`
+ */
+ cancelDebouncer(jobName: string): void;
+
+ /**
+ * Runs a callback function asynchronously.
+ *
+ * By default (if no waitTime is specified), async callbacks are run at
+ * microtask timing, which will occur before paint.
+ *
+ * @param callback The callback function to run, bound to `this`.
+ * @param waitTime Time to wait before calling the
+ * `callback`. If unspecified or 0, the callback will be run at microtask
+ * timing (before paint).
+ * @returns Handle that may be used to cancel the async job.
+ */
+ async(callback: Function, waitTime?: number): number;
+
+ /**
+ * Cancels an async operation started with `async`.
+ *
+ * @param handle Handle returned from original `async` call to
+ * cancel.
+ */
+ cancelAsync(handle: number): void;
+
+ /**
+ * Convenience method for creating an element and configuring it.
+ *
+ * @param tag HTML element tag to create.
+ * @param props Object of properties to configure on the
+ * instance.
+ * @returns Newly created and configured element.
+ */
+ create(tag: string, props?: object|null): _Element;
+
+ /**
+ * Convenience method for importing an HTML document imperatively.
+ *
+ * This method creates a new `<link rel="import">` element with
+ * the provided URL and appends it to the document to start loading.
+ * In the `onload` callback, the `import` property of the `link`
+ * element will contain the imported document contents.
+ *
+ * @param href URL to document to load.
+ * @param onload Callback to notify when an import successfully
+ * loaded.
+ * @param onerror Callback to notify when an import
+ * unsuccessfully loaded.
+ * @param optAsync True if the import should be loaded `async`.
+ * Defaults to `false`.
+ * @returns The link element for the URL to be loaded.
+ */
+ importHref(href: string, onload?: ((p0: Event) => void)|null, onerror?: ((p0: ErrorEvent) => void)|null, optAsync?: boolean): HTMLLinkElement;
+
+ /**
+ * Polyfill for Element.prototype.matches, which is sometimes still
+ * prefixed.
+ *
+ * @param selector Selector to test.
+ * @param node Element to test the selector against.
+ * @returns Whether the element matches the selector.
+ */
+ elementMatches(selector: string, node?: _Element): boolean;
+
+ /**
+ * Toggles an HTML attribute on or off.
+ *
+ * @param name HTML attribute name
+ * @param bool Boolean to force the attribute on or off.
+ * When unspecified, the state of the attribute will be reversed.
+ * @param node Node to target. Defaults to `this`.
+ */
+ toggleAttribute(name: string, bool?: boolean, node?: _Element|null): void;
+
+ /**
+ * Toggles a CSS class on or off.
+ *
+ * @param name CSS class name
+ * @param bool Boolean to force the class on or off.
+ * When unspecified, the state of the class will be reversed.
+ * @param node Node to target. Defaults to `this`.
+ */
+ toggleClass(name: string, bool?: boolean, node?: _Element|null): void;
+
+ /**
+ * Cross-platform helper for setting an element's CSS `transform` property.
+ *
+ * @param transformText Transform setting.
+ * @param node Element to apply the transform to.
+ * Defaults to `this`
+ */
+ transform(transformText: string, node?: _Element|null): void;
+
+ /**
+ * Cross-platform helper for setting an element's CSS `translate3d`
+ * property.
+ *
+ * @param x X offset.
+ * @param y Y offset.
+ * @param z Z offset.
+ * @param node Element to apply the transform to.
+ * Defaults to `this`.
+ */
+ translate3d(x: number, y: number, z: number, node?: _Element|null): void;
+
+ /**
+ * Removes an item from an array, if it exists.
+ *
+ * If the array is specified by path, a change notification is
+ * generated, so that observers, data bindings and computed
+ * properties watching that path can update.
+ *
+ * If the array is passed directly, **no change
+ * notification is generated**.
+ *
+ * @param arrayOrPath Path to array from which to remove the item
+ * (or the array itself).
+ * @param item Item to remove.
+ * @returns Array containing item removed.
+ */
+ arrayDelete(arrayOrPath: string|Array<number|string>, item: any): any[]|null;
+
+ /**
+ * Facades `console.log`/`warn`/`error` as override point.
+ *
+ * @param level One of 'log', 'warn', 'error'
+ * @param args Array of strings or objects to log
+ */
+ _logger(level: string, args: any[]|null): void;
+
+ /**
+ * Facades `console.log` as an override point.
+ *
+ * @param args Array of strings or objects to log
+ */
+ _log(...args: any[]): void;
+
+ /**
+ * Facades `console.warn` as an override point.
+ *
+ * @param args Array of strings or objects to log
+ */
+ _warn(...args: any[]): void;
+
+ /**
+ * Facades `console.error` as an override point.
+ *
+ * @param args Array of strings or objects to log
+ */
+ _error(...args: any[]): void;
+
+ /**
+ * Formats a message using the element type an a method name.
+ *
+ * @param methodName Method name to associate with message
+ * @param args Array of strings or objects to log
+ * @returns Array with formatting information for `console`
+ * logging.
+ */
+ _logf(methodName: string, ...args: any[]): any[]|null;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/mutable-data-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/mutable-data-behavior.d.ts
new file mode 100644
index 00000000000..ea580cc881a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/mutable-data-behavior.d.ts
@@ -0,0 +1,135 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/legacy/mutable-data-behavior.html
+ */
+
+/// <reference path="../mixins/mutable-data.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Legacy element behavior to skip strict dirty-checking for objects and arrays,
+ * (always consider them to be "dirty") for use on legacy API Polymer elements.
+ *
+ * By default, `Polymer.PropertyEffects` performs strict dirty checking on
+ * objects, which means that any deep modifications to an object or array will
+ * not be propagated unless "immutable" data patterns are used (i.e. all object
+ * references from the root to the mutation were changed).
+ *
+ * Polymer also provides a proprietary data mutation and path notification API
+ * (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient
+ * mutation and notification of deep changes in an object graph to all elements
+ * bound to the same object graph.
+ *
+ * In cases where neither immutable patterns nor the data mutation API can be
+ * used, applying this mixin will cause Polymer to skip dirty checking for
+ * objects and arrays (always consider them to be "dirty"). This allows a
+ * user to make a deep modification to a bound object graph, and then either
+ * simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath`
+ * (e.g. `this.notifyPath('items')`) to update the tree. Note that all
+ * elements that wish to be updated based on deep mutations must apply this
+ * mixin or otherwise skip strict dirty checking for objects/arrays.
+ * Specifically, any elements in the binding tree between the source of a
+ * mutation and the consumption of it must apply this behavior or enable the
+ * `Polymer.OptionalMutableDataBehavior`.
+ *
+ * In order to make the dirty check strategy configurable, see
+ * `Polymer.OptionalMutableDataBehavior`.
+ *
+ * Note, the performance characteristics of propagating large object graphs
+ * will be worse as opposed to using strict dirty checking with immutable
+ * patterns or Polymer's path notification API.
+ */
+ interface MutableDataBehavior {
+
+ /**
+ * Overrides `Polymer.PropertyEffects` to provide option for skipping
+ * strict equality checking for Objects and Arrays.
+ *
+ * This method pulls the value to dirty check against from the `__dataTemp`
+ * cache (rather than the normal `__data` cache) for Objects. Since the temp
+ * cache is cleared at the end of a turn, this implementation allows
+ * side-effects of deep object changes to be processed by re-setting the
+ * same object (using the temp cache as an in-turn backstop to prevent
+ * cycles due to 2-way notification).
+ *
+ * @param property Property name
+ * @param value New property value
+ * @param old Previous property value
+ * @returns Whether the property should be considered a change
+ */
+ _shouldPropertyChange(property: string, value: any, old: any): boolean;
+ }
+
+ const MutableDataBehavior: object;
+
+ /**
+ * Legacy element behavior to add the optional ability to skip strict
+ * dirty-checking for objects and arrays (always consider them to be
+ * "dirty") by setting a `mutable-data` attribute on an element instance.
+ *
+ * By default, `Polymer.PropertyEffects` performs strict dirty checking on
+ * objects, which means that any deep modifications to an object or array will
+ * not be propagated unless "immutable" data patterns are used (i.e. all object
+ * references from the root to the mutation were changed).
+ *
+ * Polymer also provides a proprietary data mutation and path notification API
+ * (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient
+ * mutation and notification of deep changes in an object graph to all elements
+ * bound to the same object graph.
+ *
+ * In cases where neither immutable patterns nor the data mutation API can be
+ * used, applying this mixin will allow Polymer to skip dirty checking for
+ * objects and arrays (always consider them to be "dirty"). This allows a
+ * user to make a deep modification to a bound object graph, and then either
+ * simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath`
+ * (e.g. `this.notifyPath('items')`) to update the tree. Note that all
+ * elements that wish to be updated based on deep mutations must apply this
+ * mixin or otherwise skip strict dirty checking for objects/arrays.
+ * Specifically, any elements in the binding tree between the source of a
+ * mutation and the consumption of it must enable this behavior or apply the
+ * `Polymer.OptionalMutableDataBehavior`.
+ *
+ * While this behavior adds the ability to forgo Object/Array dirty checking,
+ * the `mutableData` flag defaults to false and must be set on the instance.
+ *
+ * Note, the performance characteristics of propagating large object graphs
+ * will be worse by relying on `mutableData: true` as opposed to using
+ * strict dirty checking with immutable patterns or Polymer's path notification
+ * API.
+ */
+ interface OptionalMutableDataBehavior {
+
+ /**
+ * Instance-level flag for configuring the dirty-checking strategy
+ * for this element. When true, Objects and Arrays will skip dirty
+ * checking, otherwise strict equality checking will be used.
+ */
+ mutableData: boolean|null|undefined;
+
+ /**
+ * Overrides `Polymer.PropertyEffects` to skip strict equality checking
+ * for Objects and Arrays.
+ *
+ * Pulls the value to dirty check against from the `__dataTemp` cache
+ * (rather than the normal `__data` cache) for Objects. Since the temp
+ * cache is cleared at the end of a turn, this implementation allows
+ * side-effects of deep object changes to be processed by re-setting the
+ * same object (using the temp cache as an in-turn backstop to prevent
+ * cycles due to 2-way notification).
+ *
+ * @param property Property name
+ * @param value New property value
+ * @param old Previous property value
+ * @returns Whether the property should be considered a change
+ */
+ _shouldPropertyChange(property: string, value: any, old: any): boolean;
+ }
+
+ const OptionalMutableDataBehavior: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/polymer-fn.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/polymer-fn.d.ts
new file mode 100644
index 00000000000..bd881fd7467
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/polymer-fn.d.ts
@@ -0,0 +1,25 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/legacy/polymer-fn.html
+ */
+
+/// <reference path="class.d.ts" />
+
+
+/**
+ * Legacy class factory and registration helper for defining Polymer
+ * elements.
+ *
+ * This method is equivalent to
+ * `customElements.define(info.is, Polymer.Class(info));`
+ *
+ * See `Polymer.Class` for details on valid legacy metadata format for `info`.
+ *
+ * @returns Generated class
+ */
+declare function Polymer(info: PolymerInit): {new(): HTMLElement};
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/polymer.dom.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/polymer.dom.d.ts
new file mode 100644
index 00000000000..e0992bfe64b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/polymer.dom.d.ts
@@ -0,0 +1,179 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/legacy/polymer.dom.html
+ */
+
+/// <reference path="../utils/boot.d.ts" />
+/// <reference path="../utils/settings.d.ts" />
+/// <reference path="../utils/flattened-nodes-observer.d.ts" />
+/// <reference path="../utils/flush.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Legacy DOM and Event manipulation API wrapper factory used to abstract
+ * differences between native Shadow DOM and "Shady DOM" when polyfilling on
+ * older browsers.
+ *
+ * Note that in Polymer 2.x use of `Polymer.dom` is no longer required and
+ * in the majority of cases simply facades directly to the standard native
+ * API.
+ */
+ namespace dom {
+
+
+ /**
+ * Cross-platform `element.matches` shim.
+ *
+ * @returns True if node matched selector
+ */
+ function matchesSelector(node: Node, selector: string): boolean;
+ }
+
+ /**
+ * Node API wrapper class returned from `Polymer.dom.(target)` when
+ * `target` is a `Node`.
+ */
+ class DomApi {
+
+ /**
+ * For shadow roots, returns the currently focused element within this
+ * shadow root.
+ */
+ readonly activeElement: Node|null|undefined;
+
+ /**
+ * Returns an instance of `Polymer.FlattenedNodesObserver` that
+ * listens for node changes on this element.
+ *
+ * @param callback Called when direct or distributed children
+ * of this element changes
+ * @returns Observer instance
+ */
+ observeNodes(callback: (p0: _Element, p1: {target: _Element, addedNodes: _Element[], removedNodes: _Element[]}) => void): Polymer.FlattenedNodesObserver;
+
+ /**
+ * Disconnects an observer previously created via `observeNodes`
+ *
+ * @param observerHandle Observer instance
+ * to disconnect.
+ */
+ unobserveNodes(observerHandle: Polymer.FlattenedNodesObserver): void;
+
+ /**
+ * Provided as a backwards-compatible API only. This method does nothing.
+ */
+ notifyObserver(): void;
+
+ /**
+ * Returns true if the provided node is contained with this element's
+ * light-DOM children or shadow root, including any nested shadow roots
+ * of children therein.
+ *
+ * @param node Node to test
+ * @returns Returns true if the given `node` is contained within
+ * this element's light or shadow DOM.
+ */
+ deepContains(node: Node|null): boolean;
+
+ /**
+ * Returns the root node of this node. Equivalent to `getRoodNode()`.
+ *
+ * @returns Top most element in the dom tree in which the node
+ * exists. If the node is connected to a document this is either a
+ * shadowRoot or the document; otherwise, it may be the node
+ * itself or a node or document fragment containing it.
+ */
+ getOwnerRoot(): Node|null;
+
+ /**
+ * For slot elements, returns the nodes assigned to the slot; otherwise
+ * an empty array. It is equivalent to `<slot>.addignedNodes({flatten:true})`.
+ *
+ * @returns Array of assigned nodes
+ */
+ getDistributedNodes(): Node[];
+
+ /**
+ * Returns an array of all slots this element was distributed to.
+ *
+ * @returns Description
+ */
+ getDestinationInsertionPoints(): HTMLSlotElement[];
+
+ /**
+ * Calls `importNode` on the `ownerDocument` for this node.
+ *
+ * @param node Node to import
+ * @param deep True if the node should be cloned deeply during
+ * import
+ * @returns Clone of given node imported to this owner document
+ */
+ importNode(node: Node, deep: boolean): Node|null;
+
+ /**
+ * @returns Returns a flattened list of all child nodes and
+ * nodes assigned to child slots.
+ */
+ getEffectiveChildNodes(): Node[];
+
+ /**
+ * Returns a filtered list of flattened child elements for this element based
+ * on the given selector.
+ *
+ * @param selector Selector to filter nodes against
+ * @returns List of flattened child elements
+ */
+ queryDistributedElements(selector: string): HTMLElement[];
+ cloneNode(deep?: boolean): Node;
+ appendChild(node: Node): Node;
+ insertBefore(newChild: Node, refChild: Node|null): Node;
+ removeChild(node: Node): Node;
+ replaceChild(oldChild: Node, newChild: Node): Node;
+ setAttribute(name: string, value: string): void;
+ removeAttribute(name: string): void;
+ querySelector(selector: string): _Element|null;
+ querySelectorAll(selector: string): NodeListOf<_Element>;
+ }
+
+
+ /**
+ * Legacy DOM and Event manipulation API wrapper factory used to abstract
+ * differences between native Shadow DOM and "Shady DOM" when polyfilling on
+ * older browsers.
+ *
+ * Note that in Polymer 2.x use of `Polymer.dom` is no longer required and
+ * in the majority of cases simply facades directly to the standard native
+ * API.
+ *
+ * @returns Wrapper providing either node API or event API
+ */
+ function dom(obj?: Node|Event|null): DomApi|EventApi;
+}
+
+/**
+ * Event API wrapper class returned from `Polymer.dom.(target)` when
+ * `target` is an `Event`.
+ */
+declare class EventApi {
+
+ /**
+ * Returns the first node on the `composedPath` of this event.
+ */
+ readonly rootTarget: EventTarget;
+
+ /**
+ * Returns the local (re-targeted) target for this event.
+ */
+ readonly localTarget: EventTarget;
+
+ /**
+ * Returns the `composedPath` for this event.
+ */
+ readonly path: EventTarget[];
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/templatizer-behavior.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/templatizer-behavior.d.ts
new file mode 100644
index 00000000000..81f1df4a2e6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/legacy/templatizer-behavior.d.ts
@@ -0,0 +1,116 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/legacy/templatizer-behavior.html
+ */
+
+/// <reference path="../utils/templatize.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * The `Polymer.Templatizer` behavior adds methods to generate instances of
+ * templates that are each managed by an anonymous `Polymer.PropertyEffects`
+ * instance where data-bindings in the stamped template content are bound to
+ * accessors on itself.
+ *
+ * This behavior is provided in Polymer 2.x as a hybrid-element convenience
+ * only. For non-hybrid usage, the `Polymer.Templatize` library
+ * should be used instead.
+ *
+ * Example:
+ *
+ * // Get a template from somewhere, e.g. light DOM
+ * let template = this.querySelector('template');
+ * // Prepare the template
+ * this.templatize(template);
+ * // Instance the template with an initial data model
+ * let instance = this.stamp({myProp: 'initial'});
+ * // Insert the instance's DOM somewhere, e.g. light DOM
+ * Polymer.dom(this).appendChild(instance.root);
+ * // Changing a property on the instance will propagate to bindings
+ * // in the template
+ * instance.myProp = 'new value';
+ *
+ * Users of `Templatizer` may need to implement the following abstract
+ * API's to determine how properties and paths from the host should be
+ * forwarded into to instances:
+ *
+ * _forwardHostPropV2: function(prop, value)
+ *
+ * Likewise, users may implement these additional abstract API's to determine
+ * how instance-specific properties that change on the instance should be
+ * forwarded out to the host, if necessary.
+ *
+ * _notifyInstancePropV2: function(inst, prop, value)
+ *
+ * In order to determine which properties are instance-specific and require
+ * custom notification via `_notifyInstanceProp`, define an `_instanceProps`
+ * object containing keys for each instance prop, for example:
+ *
+ * _instanceProps: {
+ * item: true,
+ * index: true
+ * }
+ *
+ * Any properties used in the template that are not defined in _instanceProp
+ * will be forwarded out to the Templatize `owner` automatically.
+ *
+ * Users may also implement the following abstract function to show or
+ * hide any DOM generated using `stamp`:
+ *
+ * _showHideChildren: function(shouldHide)
+ *
+ * Note that some callbacks are suffixed with `V2` in the Polymer 2.x behavior
+ * as the implementations will need to differ from the callbacks required
+ * by the 1.x Templatizer API due to changes in the `TemplateInstance` API
+ * between versions 1.x and 2.x.
+ */
+ interface Templatizer {
+
+ /**
+ * Generates an anonymous `TemplateInstance` class (stored as `this.ctor`)
+ * for the provided template. This method should be called once per
+ * template to prepare an element for stamping the template, followed
+ * by `stamp` to create new instances of the template.
+ *
+ * @param template Template to prepare
+ * @param mutableData When `true`, the generated class will skip
+ * strict dirty-checking for objects and arrays (always consider them to
+ * be "dirty"). Defaults to false.
+ */
+ templatize(template: HTMLTemplateElement, mutableData?: boolean): void;
+
+ /**
+ * Creates an instance of the template prepared by `templatize`. The object
+ * returned is an instance of the anonymous class generated by `templatize`
+ * whose `root` property is a document fragment containing newly cloned
+ * template content, and which has property accessors corresponding to
+ * properties referenced in template bindings.
+ *
+ * @param model Object containing initial property values to
+ * populate into the template bindings.
+ * @returns Returns the created instance of
+ * the template prepared by `templatize`.
+ */
+ stamp(model?: object|null): TemplateInstanceBase|null;
+
+ /**
+ * Returns the template "model" (`TemplateInstance`) associated with
+ * a given element, which serves as the binding scope for the template
+ * instance the element is contained in. A template model should be used
+ * to manipulate data associated with this template instance.
+ *
+ * @param el Element for which to return a template model.
+ * @returns Model representing the binding scope for
+ * the element.
+ */
+ modelForElement(el: HTMLElement|null): TemplateInstanceBase|null;
+ }
+
+ const Templatizer: object;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/dir-mixin.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/dir-mixin.d.ts
new file mode 100644
index 00000000000..58aa8136b9e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/dir-mixin.d.ts
@@ -0,0 +1,52 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/mixins/dir-mixin.html
+ */
+
+/// <reference path="property-accessors.d.ts" />
+
+declare namespace Polymer {
+
+
+ /**
+ * Element class mixin that allows elements to use the `:dir` CSS Selector to have
+ * text direction specific styling.
+ *
+ * With this mixin, any stylesheet provided in the template will transform `:dir` into
+ * `:host([dir])` and sync direction with the page via the element's `dir` attribute.
+ *
+ * Elements can opt out of the global page text direction by setting the `dir` attribute
+ * directly in `ready()` or in HTML.
+ *
+ * Caveats:
+ * - Applications must set `<html dir="ltr">` or `<html dir="rtl">` to sync direction
+ * - Automatic left-to-right or right-to-left styling is sync'd with the `<html>` element only.
+ * - Changing `dir` at runtime is supported.
+ * - Opting out of the global direction styling is permanent
+ */
+ function DirMixin<T extends new (...args: any[]) => {}>(base: T): T & DirMixinConstructor & Polymer.PropertyAccessorsConstructor & Polymer.PropertiesChangedConstructor;
+
+ interface DirMixinConstructor {
+ new(...args: any[]): DirMixin;
+ _processStyleText(cssText: any, baseURI: any): any;
+
+ /**
+ * Replace `:dir` in the given CSS text
+ *
+ * @param text CSS text to replace DIR
+ * @returns Modified CSS
+ */
+ _replaceDirInCssText(text: string): string;
+ }
+
+ interface DirMixin {
+ ready(): void;
+ connectedCallback(): void;
+ disconnectedCallback(): void;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/disable-upgrade-mixin.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/disable-upgrade-mixin.d.ts
new file mode 100644
index 00000000000..f8584219d82
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/disable-upgrade-mixin.d.ts
@@ -0,0 +1,49 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/mixins/disable-upgrade-mixin.html
+ */
+
+/// <reference path="element-mixin.d.ts" />
+
+declare namespace Polymer {
+
+
+ /**
+ * Element class mixin that allows the element to boot up in a non-enabled
+ * state when the `disable-upgrade` attribute is present. This mixin is
+ * designed to be used with element classes like Polymer.Element that perform
+ * initial startup work when they are first connected. When the
+ * `disable-upgrade` attribute is removed, if the element is connected, it
+ * boots up and "enables" as it otherwise would; if it is not connected, the
+ * element boots up when it is next connected.
+ *
+ * Using `disable-upgrade` with Polymer.Element prevents any data propagation
+ * to the element, any element DOM from stamping, or any work done in
+ * connected/disconnctedCallback from occuring, but it does not prevent work
+ * done in the element constructor.
+ *
+ * Note, this mixin must be applied on top of any element class that
+ * itself implements a `connectedCallback` so that it can control the work
+ * done in `connectedCallback`. For example,
+ *
+ * MyClass = Polymer.DisableUpgradeMixin(class extends BaseClass {...});
+ */
+ function DisableUpgradeMixin<T extends new (...args: any[]) => {}>(base: T): T & DisableUpgradeMixinConstructor & Polymer.ElementMixinConstructor & Polymer.PropertyEffectsConstructor & Polymer.TemplateStampConstructor & Polymer.PropertyAccessorsConstructor & Polymer.PropertiesChangedConstructor & Polymer.PropertiesMixinConstructor;
+
+ interface DisableUpgradeMixinConstructor {
+ new(...args: any[]): DisableUpgradeMixin;
+ }
+
+ interface DisableUpgradeMixin {
+ _initializeProperties(): void;
+ _enableProperties(): void;
+ attributeChangedCallback(name: any, old: any, value: any): void;
+ connectedCallback(): void;
+ disconnectedCallback(): void;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/element-mixin.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/element-mixin.d.ts
new file mode 100644
index 00000000000..879ca122d77
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/element-mixin.d.ts
@@ -0,0 +1,233 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/mixins/element-mixin.html
+ */
+
+/// <reference path="../utils/boot.d.ts" />
+/// <reference path="../utils/settings.d.ts" />
+/// <reference path="../utils/mixin.d.ts" />
+/// <reference path="../utils/style-gather.d.ts" />
+/// <reference path="../utils/resolve-url.d.ts" />
+/// <reference path="../elements/dom-module.d.ts" />
+/// <reference path="property-effects.d.ts" />
+/// <reference path="properties-mixin.d.ts" />
+
+declare namespace Polymer {
+
+
+ /**
+ * Element class mixin that provides the core API for Polymer's meta-programming
+ * features including template stamping, data-binding, attribute deserialization,
+ * and property change observation.
+ *
+ * Subclassers may provide the following static getters to return metadata
+ * used to configure Polymer's features for the class:
+ *
+ * - `static get is()`: When the template is provided via a `dom-module`,
+ * users should return the `dom-module` id from a static `is` getter. If
+ * no template is needed or the template is provided directly via the
+ * `template` getter, there is no need to define `is` for the element.
+ *
+ * - `static get template()`: Users may provide the template directly (as
+ * opposed to via `dom-module`) by implementing a static `template` getter.
+ * The getter may return an `HTMLTemplateElement` or a string, which will
+ * automatically be parsed into a template.
+ *
+ * - `static get properties()`: Should return an object describing
+ * property-related metadata used by Polymer features (key: property name
+ * value: object containing property metadata). Valid keys in per-property
+ * metadata include:
+ * - `type` (String|Number|Object|Array|...): Used by
+ * `attributeChangedCallback` to determine how string-based attributes
+ * are deserialized to JavaScript property values.
+ * - `notify` (boolean): Causes a change in the property to fire a
+ * non-bubbling event called `<property>-changed`. Elements that have
+ * enabled two-way binding to the property use this event to observe changes.
+ * - `readOnly` (boolean): Creates a getter for the property, but no setter.
+ * To set a read-only property, use the private setter method
+ * `_setProperty(property, value)`.
+ * - `observer` (string): Observer method name that will be called when
+ * the property changes. The arguments of the method are
+ * `(value, previousValue)`.
+ * - `computed` (string): String describing method and dependent properties
+ * for computing the value of this property (e.g. `'computeFoo(bar, zot)'`).
+ * Computed properties are read-only by default and can only be changed
+ * via the return value of the computing method.
+ *
+ * - `static get observers()`: Array of strings describing multi-property
+ * observer methods and their dependent properties (e.g.
+ * `'observeABC(a, b, c)'`).
+ *
+ * The base class provides default implementations for the following standard
+ * custom element lifecycle callbacks; users may override these, but should
+ * call the super method to ensure
+ * - `constructor`: Run when the element is created or upgraded
+ * - `connectedCallback`: Run each time the element is connected to the
+ * document
+ * - `disconnectedCallback`: Run each time the element is disconnected from
+ * the document
+ * - `attributeChangedCallback`: Run each time an attribute in
+ * `observedAttributes` is set or removed (note: this element's default
+ * `observedAttributes` implementation will automatically return an array
+ * of dash-cased attributes based on `properties`)
+ */
+ function ElementMixin<T extends new (...args: any[]) => {}>(base: T): T & ElementMixinConstructor & Polymer.PropertyEffectsConstructor & Polymer.TemplateStampConstructor & Polymer.PropertyAccessorsConstructor & Polymer.PropertiesChangedConstructor & Polymer.PropertiesMixinConstructor;
+
+ interface ElementMixinConstructor {
+ new(...args: any[]): ElementMixin;
+
+ /**
+ * Overrides `PropertyAccessors` to add map of dynamic functions on
+ * template info, for consumption by `PropertyEffects` template binding
+ * code. This map determines which method templates should have accessors
+ * created for them.
+ */
+ _parseTemplateContent(template: any, templateInfo: any, nodeInfo: any): any;
+
+ /**
+ * Override of PropertiesChanged createProperties to create accessors
+ * and property effects for all of the properties.
+ */
+ createProperties(props: any): void;
+
+ /**
+ * Override of PropertiesMixin _finalizeClass to create observers and
+ * find the template.
+ */
+ _finalizeClass(): void;
+
+ /**
+ * Creates observers for the given `observers` array.
+ * Leverages `PropertyEffects` to create observers.
+ *
+ * @param observers Array of observer descriptors for
+ * this class
+ * @param dynamicFns Object containing keys for any properties
+ * that are functions and should trigger the effect when the function
+ * reference is changed
+ */
+ createObservers(observers: object|null, dynamicFns: object|null): void;
+
+ /**
+ * Gather style text for a style element in the template.
+ *
+ * @param cssText Text containing styling to process
+ * @param baseURI Base URI to rebase CSS paths against
+ * @returns The processed CSS text
+ */
+ _processStyleText(cssText: string, baseURI: string): string;
+
+ /**
+ * Configures an element `proto` to function with a given `template`.
+ * The element name `is` and extends `ext` must be specified for ShadyCSS
+ * style scoping.
+ *
+ * @param is Tag name (or type extension name) for this element
+ */
+ _finalizeTemplate(is: string): void;
+ }
+
+ interface ElementMixin {
+ _template: HTMLTemplateElement|null;
+ _importPath: string;
+ rootPath: string;
+ importPath: string;
+ root: StampedTemplate|HTMLElement|ShadowRoot|null;
+ $: {[key: string]: _Element};
+
+ /**
+ * Stamps the element template.
+ */
+ ready(): void;
+
+ /**
+ * Overrides the default `Polymer.PropertyAccessors` to ensure class
+ * metaprogramming related to property accessors and effects has
+ * completed (calls `finalize`).
+ *
+ * It also initializes any property defaults provided via `value` in
+ * `properties` metadata.
+ */
+ _initializeProperties(): void;
+
+ /**
+ * Implements `PropertyEffects`'s `_readyClients` call. Attaches
+ * element dom by calling `_attachDom` with the dom stamped from the
+ * element's template via `_stampTemplate`. Note that this allows
+ * client dom to be attached to the element prior to any observers
+ * running.
+ */
+ _readyClients(): void;
+
+ /**
+ * Provides a default implementation of the standard Custom Elements
+ * `connectedCallback`.
+ *
+ * The default implementation enables the property effects system and
+ * flushes any pending properties, and updates shimmed CSS properties
+ * when using the ShadyCSS scoping/custom properties polyfill.
+ */
+ connectedCallback(): void;
+
+ /**
+ * Attaches an element's stamped dom to itself. By default,
+ * this method creates a `shadowRoot` and adds the dom to it.
+ * However, this method may be overridden to allow an element
+ * to put its dom in another location.
+ *
+ * @param dom to attach to the element.
+ * @returns node to which the dom has been attached.
+ */
+ _attachDom(dom: StampedTemplate|null): ShadowRoot|null;
+
+ /**
+ * When using the ShadyCSS scoping and custom property shim, causes all
+ * shimmed styles in this element (and its subtree) to be updated
+ * based on current custom property values.
+ *
+ * The optional parameter overrides inline custom property styles with an
+ * object of properties where the keys are CSS properties, and the values
+ * are strings.
+ *
+ * Example: `this.updateStyles({'--color': 'blue'})`
+ *
+ * These properties are retained unless a value of `null` is set.
+ *
+ * Note: This function does not support updating CSS mixins.
+ * You can not dynamically change the value of an `@apply`.
+ *
+ * @param properties Bag of custom property key/values to
+ * apply to this element.
+ */
+ updateStyles(properties?: object|null): void;
+
+ /**
+ * Rewrites a given URL relative to a base URL. The base URL defaults to
+ * the original location of the document containing the `dom-module` for
+ * this element. This method will return the same URL before and after
+ * bundling.
+ *
+ * Note that this function performs no resolution for URLs that start
+ * with `/` (absolute URLs) or `#` (hash identifiers). For general purpose
+ * URL resolution, use `window.URL`.
+ *
+ * @param url URL to resolve.
+ * @param base Optional base URL to resolve against, defaults
+ * to the element's `importPath`
+ * @returns Rewritten URL relative to base
+ */
+ resolveUrl(url: string, base?: string): string;
+ }
+
+ /**
+ * Provides basic tracking of element definitions (registrations) and
+ * instance counts.
+ */
+ namespace telemetry {
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/gesture-event-listeners.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/gesture-event-listeners.d.ts
new file mode 100644
index 00000000000..714c5e055aa
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/gesture-event-listeners.d.ts
@@ -0,0 +1,53 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/mixins/gesture-event-listeners.html
+ */
+
+/// <reference path="../utils/boot.d.ts" />
+/// <reference path="../utils/mixin.d.ts" />
+/// <reference path="../utils/gestures.d.ts" />
+
+declare namespace Polymer {
+
+
+ /**
+ * Element class mixin that provides API for adding Polymer's cross-platform
+ * gesture events to nodes.
+ *
+ * The API is designed to be compatible with override points implemented
+ * in `Polymer.TemplateStamp` such that declarative event listeners in
+ * templates will support gesture events when this mixin is applied along with
+ * `Polymer.TemplateStamp`.
+ */
+ function GestureEventListeners<T extends new (...args: any[]) => {}>(base: T): T & GestureEventListenersConstructor;
+
+ interface GestureEventListenersConstructor {
+ new(...args: any[]): GestureEventListeners;
+ }
+
+ interface GestureEventListeners {
+
+ /**
+ * Add the event listener to the node if it is a gestures event.
+ *
+ * @param node Node to add event listener to
+ * @param eventName Name of event
+ * @param handler Listener function to add
+ */
+ _addEventListenerToNode(node: Node, eventName: string, handler: (p0: Event) => void): void;
+
+ /**
+ * Remove the event listener to the node if it is a gestures event.
+ *
+ * @param node Node to remove event listener from
+ * @param eventName Name of event
+ * @param handler Listener function to remove
+ */
+ _removeEventListenerFromNode(node: Node, eventName: string, handler: (p0: Event) => void): void;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/mutable-data.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/mutable-data.d.ts
new file mode 100644
index 00000000000..5859e3276be
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/mutable-data.d.ts
@@ -0,0 +1,147 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/mixins/mutable-data.html
+ */
+
+/// <reference path="../utils/mixin.d.ts" />
+
+declare namespace Polymer {
+
+
+ /**
+ * Element class mixin to skip strict dirty-checking for objects and arrays
+ * (always consider them to be "dirty"), for use on elements utilizing
+ * `Polymer.PropertyEffects`
+ *
+ * By default, `Polymer.PropertyEffects` performs strict dirty checking on
+ * objects, which means that any deep modifications to an object or array will
+ * not be propagated unless "immutable" data patterns are used (i.e. all object
+ * references from the root to the mutation were changed).
+ *
+ * Polymer also provides a proprietary data mutation and path notification API
+ * (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient
+ * mutation and notification of deep changes in an object graph to all elements
+ * bound to the same object graph.
+ *
+ * In cases where neither immutable patterns nor the data mutation API can be
+ * used, applying this mixin will cause Polymer to skip dirty checking for
+ * objects and arrays (always consider them to be "dirty"). This allows a
+ * user to make a deep modification to a bound object graph, and then either
+ * simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath`
+ * (e.g. `this.notifyPath('items')`) to update the tree. Note that all
+ * elements that wish to be updated based on deep mutations must apply this
+ * mixin or otherwise skip strict dirty checking for objects/arrays.
+ * Specifically, any elements in the binding tree between the source of a
+ * mutation and the consumption of it must apply this mixin or enable the
+ * `Polymer.OptionalMutableData` mixin.
+ *
+ * In order to make the dirty check strategy configurable, see
+ * `Polymer.OptionalMutableData`.
+ *
+ * Note, the performance characteristics of propagating large object graphs
+ * will be worse as opposed to using strict dirty checking with immutable
+ * patterns or Polymer's path notification API.
+ */
+ function MutableData<T extends new (...args: any[]) => {}>(base: T): T & MutableDataConstructor;
+
+ interface MutableDataConstructor {
+ new(...args: any[]): MutableData;
+ }
+
+ interface MutableData {
+
+ /**
+ * Overrides `Polymer.PropertyEffects` to provide option for skipping
+ * strict equality checking for Objects and Arrays.
+ *
+ * This method pulls the value to dirty check against from the `__dataTemp`
+ * cache (rather than the normal `__data` cache) for Objects. Since the temp
+ * cache is cleared at the end of a turn, this implementation allows
+ * side-effects of deep object changes to be processed by re-setting the
+ * same object (using the temp cache as an in-turn backstop to prevent
+ * cycles due to 2-way notification).
+ *
+ * @param property Property name
+ * @param value New property value
+ * @param old Previous property value
+ * @returns Whether the property should be considered a change
+ */
+ _shouldPropertyChange(property: string, value: any, old: any): boolean;
+ }
+
+
+ /**
+ * Element class mixin to add the optional ability to skip strict
+ * dirty-checking for objects and arrays (always consider them to be
+ * "dirty") by setting a `mutable-data` attribute on an element instance.
+ *
+ * By default, `Polymer.PropertyEffects` performs strict dirty checking on
+ * objects, which means that any deep modifications to an object or array will
+ * not be propagated unless "immutable" data patterns are used (i.e. all object
+ * references from the root to the mutation were changed).
+ *
+ * Polymer also provides a proprietary data mutation and path notification API
+ * (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient
+ * mutation and notification of deep changes in an object graph to all elements
+ * bound to the same object graph.
+ *
+ * In cases where neither immutable patterns nor the data mutation API can be
+ * used, applying this mixin will allow Polymer to skip dirty checking for
+ * objects and arrays (always consider them to be "dirty"). This allows a
+ * user to make a deep modification to a bound object graph, and then either
+ * simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath`
+ * (e.g. `this.notifyPath('items')`) to update the tree. Note that all
+ * elements that wish to be updated based on deep mutations must apply this
+ * mixin or otherwise skip strict dirty checking for objects/arrays.
+ * Specifically, any elements in the binding tree between the source of a
+ * mutation and the consumption of it must enable this mixin or apply the
+ * `Polymer.MutableData` mixin.
+ *
+ * While this mixin adds the ability to forgo Object/Array dirty checking,
+ * the `mutableData` flag defaults to false and must be set on the instance.
+ *
+ * Note, the performance characteristics of propagating large object graphs
+ * will be worse by relying on `mutableData: true` as opposed to using
+ * strict dirty checking with immutable patterns or Polymer's path notification
+ * API.
+ */
+ function OptionalMutableData<T extends new (...args: any[]) => {}>(base: T): T & OptionalMutableDataConstructor;
+
+ interface OptionalMutableDataConstructor {
+ new(...args: any[]): OptionalMutableData;
+ }
+
+ interface OptionalMutableData {
+
+ /**
+ * Instance-level flag for configuring the dirty-checking strategy
+ * for this element. When true, Objects and Arrays will skip dirty
+ * checking, otherwise strict equality checking will be used.
+ */
+ mutableData: boolean|null|undefined;
+
+ /**
+ * Overrides `Polymer.PropertyEffects` to provide option for skipping
+ * strict equality checking for Objects and Arrays.
+ *
+ * When `this.mutableData` is true on this instance, this method
+ * pulls the value to dirty check against from the `__dataTemp` cache
+ * (rather than the normal `__data` cache) for Objects. Since the temp
+ * cache is cleared at the end of a turn, this implementation allows
+ * side-effects of deep object changes to be processed by re-setting the
+ * same object (using the temp cache as an in-turn backstop to prevent
+ * cycles due to 2-way notification).
+ *
+ * @param property Property name
+ * @param value New property value
+ * @param old Previous property value
+ * @returns Whether the property should be considered a change
+ */
+ _shouldPropertyChange(property: string, value: any, old: any): boolean;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/properties-changed.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/properties-changed.d.ts
new file mode 100644
index 00000000000..13364e19808
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/properties-changed.d.ts
@@ -0,0 +1,304 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/mixins/properties-changed.html
+ */
+
+/// <reference path="../utils/boot.d.ts" />
+/// <reference path="../utils/mixin.d.ts" />
+/// <reference path="../utils/async.d.ts" />
+
+declare namespace Polymer {
+
+
+ /**
+ * Element class mixin that provides basic meta-programming for creating one
+ * or more property accessors (getter/setter pair) that enqueue an async
+ * (batched) `_propertiesChanged` callback.
+ *
+ * For basic usage of this mixin, call `MyClass.createProperties(props)`
+ * once at class definition time to create property accessors for properties
+ * named in props, implement `_propertiesChanged` to react as desired to
+ * property changes, and implement `static get observedAttributes()` and
+ * include lowercase versions of any property names that should be set from
+ * attributes. Last, call `this._enableProperties()` in the element's
+ * `connectedCallback` to enable the accessors.
+ */
+ function PropertiesChanged<T extends new (...args: any[]) => {}>(base: T): T & PropertiesChangedConstructor;
+
+ interface PropertiesChangedConstructor {
+ new(...args: any[]): PropertiesChanged;
+
+ /**
+ * Creates property accessors for the given property names.
+ *
+ * @param props Object whose keys are names of accessors.
+ */
+ createProperties(props: object): void;
+
+ /**
+ * Returns an attribute name that corresponds to the given property.
+ * The attribute name is the lowercased property name. Override to
+ * customize this mapping.
+ *
+ * @param property Property to convert
+ * @returns Attribute name corresponding to the given property.
+ */
+ attributeNameForProperty(property: string): string;
+
+ /**
+ * Override point to provide a type to which to deserialize a value to
+ * a given property.
+ *
+ * @param name Name of property
+ */
+ typeForProperty(name: string): void;
+ }
+
+ interface PropertiesChanged {
+
+ /**
+ * Creates a setter/getter pair for the named property with its own
+ * local storage. The getter returns the value in the local storage,
+ * and the setter calls `_setProperty`, which updates the local storage
+ * for the property and enqueues a `_propertiesChanged` callback.
+ *
+ * This method may be called on a prototype or an instance. Calling
+ * this method may overwrite a property value that already exists on
+ * the prototype/instance by creating the accessor.
+ *
+ * @param property Name of the property
+ * @param readOnly When true, no setter is created; the
+ * protected `_setProperty` function must be used to set the property
+ */
+ _createPropertyAccessor(property: string, readOnly?: boolean): void;
+
+ /**
+ * Adds the given `property` to a map matching attribute names
+ * to property names, using `attributeNameForProperty`. This map is
+ * used when deserializing attribute values to properties.
+ *
+ * @param property Name of the property
+ */
+ _addPropertyToAttributeMap(property: string): void;
+
+ /**
+ * Defines a property accessor for the given property.
+ *
+ * @param property Name of the property
+ * @param readOnly When true, no setter is created
+ */
+ _definePropertyAccessor(property: string, readOnly?: boolean): void;
+
+ /**
+ * Lifecycle callback called when properties are enabled via
+ * `_enableProperties`.
+ *
+ * Users may override this function to implement behavior that is
+ * dependent on the element having its property data initialized, e.g.
+ * from defaults (initialized from `constructor`, `_initializeProperties`),
+ * `attributeChangedCallback`, or values propagated from host e.g. via
+ * bindings. `super.ready()` must be called to ensure the data system
+ * becomes enabled.
+ */
+ ready(): void;
+
+ /**
+ * Initializes the local storage for property accessors.
+ *
+ * Provided as an override point for performing any setup work prior
+ * to initializing the property accessor system.
+ */
+ _initializeProperties(): void;
+
+ /**
+ * Called at ready time with bag of instance properties that overwrote
+ * accessors when the element upgraded.
+ *
+ * The default implementation sets these properties back into the
+ * setter at ready time. This method is provided as an override
+ * point for customizing or providing more efficient initialization.
+ *
+ * @param props Bag of property values that were overwritten
+ * when creating property accessors.
+ */
+ _initializeInstanceProperties(props: object|null): void;
+
+ /**
+ * Updates the local storage for a property (via `_setPendingProperty`)
+ * and enqueues a `_proeprtiesChanged` callback.
+ *
+ * @param property Name of the property
+ * @param value Value to set
+ */
+ _setProperty(property: string, value: any): void;
+
+ /**
+ * Returns the value for the given property.
+ *
+ * @param property Name of property
+ * @returns Value for the given property
+ */
+ _getProperty(property: string): any;
+
+ /**
+ * Updates the local storage for a property, records the previous value,
+ * and adds it to the set of "pending changes" that will be passed to the
+ * `_propertiesChanged` callback. This method does not enqueue the
+ * `_propertiesChanged` callback.
+ *
+ * @param property Name of the property
+ * @param value Value to set
+ * @param ext Not used here; affordance for closure
+ * @returns Returns true if the property changed
+ */
+ _setPendingProperty(property: string, value: any, ext?: boolean): boolean;
+
+ /**
+ * Marks the properties as invalid, and enqueues an async
+ * `_propertiesChanged` callback.
+ */
+ _invalidateProperties(): void;
+
+ /**
+ * Call to enable property accessor processing. Before this method is
+ * called accessor values will be set but side effects are
+ * queued. When called, any pending side effects occur immediately.
+ * For elements, generally `connectedCallback` is a normal spot to do so.
+ * It is safe to call this method multiple times as it only turns on
+ * property accessors once.
+ */
+ _enableProperties(): void;
+
+ /**
+ * Calls the `_propertiesChanged` callback with the current set of
+ * pending changes (and old values recorded when pending changes were
+ * set), and resets the pending set of changes. Generally, this method
+ * should not be called in user code.
+ */
+ _flushProperties(): void;
+
+ /**
+ * Called in `_flushProperties` to determine if `_propertiesChanged`
+ * should be called. The default implementation returns true if
+ * properties are pending. Override to customize when
+ * `_propertiesChanged` is called.
+ *
+ * @param currentProps Bag of all current accessor values
+ * @param changedProps Bag of properties changed since the last
+ * call to `_propertiesChanged`
+ * @param oldProps Bag of previous values for each property
+ * in `changedProps`
+ * @returns true if changedProps is truthy
+ */
+ _shouldPropertiesChange(currentProps: object, changedProps: object, oldProps: object): boolean;
+
+ /**
+ * Callback called when any properties with accessors created via
+ * `_createPropertyAccessor` have been set.
+ *
+ * @param currentProps Bag of all current accessor values
+ * @param changedProps Bag of properties changed since the last
+ * call to `_propertiesChanged`
+ * @param oldProps Bag of previous values for each property
+ * in `changedProps`
+ */
+ _propertiesChanged(currentProps: object, changedProps: object, oldProps: object): void;
+
+ /**
+ * Method called to determine whether a property value should be
+ * considered as a change and cause the `_propertiesChanged` callback
+ * to be enqueued.
+ *
+ * The default implementation returns `true` if a strict equality
+ * check fails. The method always returns false for `NaN`.
+ *
+ * Override this method to e.g. provide stricter checking for
+ * Objects/Arrays when using immutable patterns.
+ *
+ * @param property Property name
+ * @param value New property value
+ * @param old Previous property value
+ * @returns Whether the property should be considered a change
+ * and enqueue a `_proeprtiesChanged` callback
+ */
+ _shouldPropertyChange(property: string, value: any, old: any): boolean;
+
+ /**
+ * Implements native Custom Elements `attributeChangedCallback` to
+ * set an attribute value to a property via `_attributeToProperty`.
+ *
+ * @param name Name of attribute that changed
+ * @param old Old attribute value
+ * @param value New attribute value
+ */
+ attributeChangedCallback(name: string, old: string|null, value: string|null): void;
+
+ /**
+ * Deserializes an attribute to its associated property.
+ *
+ * This method calls the `_deserializeValue` method to convert the string to
+ * a typed value.
+ *
+ * @param attribute Name of attribute to deserialize.
+ * @param value of the attribute.
+ * @param type type to deserialize to, defaults to the value
+ * returned from `typeForProperty`
+ */
+ _attributeToProperty(attribute: string, value: string|null, type?: any): void;
+
+ /**
+ * Serializes a property to its associated attribute.
+ *
+ * @param property Property name to reflect.
+ * @param attribute Attribute name to reflect to.
+ * @param value Property value to refect.
+ */
+ _propertyToAttribute(property: string, attribute?: string, value?: any): void;
+
+ /**
+ * Sets a typed value to an HTML attribute on a node.
+ *
+ * This method calls the `_serializeValue` method to convert the typed
+ * value to a string. If the `_serializeValue` method returns `undefined`,
+ * the attribute will be removed (this is the default for boolean
+ * type `false`).
+ *
+ * @param node Element to set attribute to.
+ * @param value Value to serialize.
+ * @param attribute Attribute name to serialize to.
+ */
+ _valueToNodeAttribute(node: _Element|null, value: any, attribute: string): void;
+
+ /**
+ * Converts a typed JavaScript value to a string.
+ *
+ * This method is called when setting JS property values to
+ * HTML attributes. Users may override this method to provide
+ * serialization for custom types.
+ *
+ * @param value Property value to serialize.
+ * @returns String serialized from the provided
+ * property value.
+ */
+ _serializeValue(value: any): string|undefined;
+
+ /**
+ * Converts a string to a typed JavaScript value.
+ *
+ * This method is called when reading HTML attribute values to
+ * JS properties. Users may override this method to provide
+ * deserialization for custom `type`s. Types for `Boolean`, `String`,
+ * and `Number` convert attributes to the expected types.
+ *
+ * @param value Value to deserialize.
+ * @param type Type to deserialize the string to.
+ * @returns Typed value deserialized from the provided string.
+ */
+ _deserializeValue(value: string|null, type?: any): any;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/properties-mixin.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/properties-mixin.d.ts
new file mode 100644
index 00000000000..566cd68633f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/properties-mixin.d.ts
@@ -0,0 +1,79 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/mixins/properties-mixin.html
+ */
+
+/// <reference path="../utils/boot.d.ts" />
+/// <reference path="../utils/mixin.d.ts" />
+/// <reference path="properties-changed.d.ts" />
+
+declare namespace Polymer {
+
+
+ /**
+ * Mixin that provides a minimal starting point to using the PropertiesChanged
+ * mixin by providing a mechanism to declare properties in a static
+ * getter (e.g. static get properties() { return { foo: String } }). Changes
+ * are reported via the `_propertiesChanged` method.
+ *
+ * This mixin provides no specific support for rendering. Users are expected
+ * to create a ShadowRoot and put content into it and update it in whatever
+ * way makes sense. This can be done in reaction to properties changing by
+ * implementing `_propertiesChanged`.
+ */
+ function PropertiesMixin<T extends new (...args: any[]) => {}>(base: T): T & PropertiesMixinConstructor & Polymer.PropertiesChangedConstructor;
+
+ interface PropertiesMixinConstructor {
+ new(...args: any[]): PropertiesMixin;
+
+ /**
+ * Overrides `PropertiesChanged` method to return type specified in the
+ * static `properties` object for the given property.
+ *
+ * @param name Name of property
+ * @returns Type to which to deserialize attribute
+ */
+ typeForProperty(name: string): any;
+
+ /**
+ * Finalizes an element definition, including ensuring any super classes
+ * are also finalized. This includes ensuring property
+ * accessors exist on the element prototype. This method calls
+ * `_finalizeClass` to finalize each constructor in the prototype chain.
+ */
+ finalize(): void;
+
+ /**
+ * Finalize an element class. This includes ensuring property
+ * accessors exist on the element prototype. This method is called by
+ * `finalize` and finalizes the class constructor.
+ */
+ _finalizeClass(): void;
+ }
+
+ interface PropertiesMixin {
+
+ /**
+ * Overrides `PropertiesChanged` method and adds a call to
+ * `finalize` which lazily configures the element's property accessors.
+ */
+ _initializeProperties(): void;
+
+ /**
+ * Called when the element is added to a document.
+ * Calls `_enableProperties` to turn on property system from
+ * `PropertiesChanged`.
+ */
+ connectedCallback(): void;
+
+ /**
+ * Called when the element is removed from a document
+ */
+ disconnectedCallback(): void;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/property-accessors.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/property-accessors.d.ts
new file mode 100644
index 00000000000..b4c738aca7d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/property-accessors.d.ts
@@ -0,0 +1,152 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/mixins/property-accessors.html
+ */
+
+/// <reference path="../utils/boot.d.ts" />
+/// <reference path="../utils/mixin.d.ts" />
+/// <reference path="../utils/case-map.d.ts" />
+/// <reference path="properties-changed.d.ts" />
+
+declare namespace Polymer {
+
+
+ /**
+ * Element class mixin that provides basic meta-programming for creating one
+ * or more property accessors (getter/setter pair) that enqueue an async
+ * (batched) `_propertiesChanged` callback.
+ *
+ * For basic usage of this mixin:
+ *
+ * - Declare attributes to observe via the standard `static get observedAttributes()`. Use
+ * `dash-case` attribute names to represent `camelCase` property names.
+ * - Implement the `_propertiesChanged` callback on the class.
+ * - Call `MyClass.createPropertiesForAttributes()` **once** on the class to generate
+ * property accessors for each observed attribute. This must be called before the first
+ * instance is created, for example, by calling it before calling `customElements.define`.
+ * It can also be called lazily from the element's `constructor`, as long as it's guarded so
+ * that the call is only made once, when the first instance is created.
+ * - Call `this._enableProperties()` in the element's `connectedCallback` to enable
+ * the accessors.
+ *
+ * Any `observedAttributes` will automatically be
+ * deserialized via `attributeChangedCallback` and set to the associated
+ * property using `dash-case`-to-`camelCase` convention.
+ */
+ function PropertyAccessors<T extends new (...args: any[]) => {}>(base: T): T & PropertyAccessorsConstructor & Polymer.PropertiesChangedConstructor;
+
+ interface PropertyAccessorsConstructor {
+ new(...args: any[]): PropertyAccessors;
+
+ /**
+ * Returns an attribute name that corresponds to the given property.
+ * By default, converts camel to dash case, e.g. `fooBar` to `foo-bar`.
+ *
+ * @param property Property to convert
+ * @returns Attribute name corresponding to the given property.
+ */
+ attributeNameForProperty(property: string): string;
+
+ /**
+ * Generates property accessors for all attributes in the standard
+ * static `observedAttributes` array.
+ *
+ * Attribute names are mapped to property names using the `dash-case` to
+ * `camelCase` convention
+ */
+ createPropertiesForAttributes(): void;
+ }
+
+ interface PropertyAccessors {
+
+ /**
+ * Overrides PropertiesChanged implementation to save existing prototype
+ * property value so that it can be reset.
+ *
+ * @param property Name of the property
+ * @param readOnly When true, no setter is created
+ *
+ * When calling on a prototype, any overwritten values are saved in
+ * `__dataProto`, and it is up to the subclasser to decide how/when
+ * to set those properties back into the accessor. When calling on an
+ * instance, the overwritten value is set via `_setPendingProperty`,
+ * and the user should call `_invalidateProperties` or `_flushProperties`
+ * for the values to take effect.
+ */
+ _definePropertyAccessor(property: string, readOnly?: boolean): void;
+
+ /**
+ * Overrides PropertiesChanged implementation to initialize values for
+ * accessors created for values that already existed on the element
+ * prototype.
+ */
+ _initializeProperties(): void;
+
+ /**
+ * Overrides PropertiesChanged implemention to serialize objects as JSON.
+ *
+ * @param value Property value to serialize.
+ * @returns String serialized from the provided property value.
+ */
+ _serializeValue(value: any): string|undefined;
+
+ /**
+ * Converts a string to a typed JavaScript value.
+ *
+ * This method is called by Polymer when reading HTML attribute values to
+ * JS properties. Users may override this method on Polymer element
+ * prototypes to provide deserialization for custom `type`s. Note,
+ * the `type` argument is the value of the `type` field provided in the
+ * `properties` configuration object for a given property, and is
+ * by convention the constructor for the type to deserialize.
+ *
+ * @param value Attribute value to deserialize.
+ * @param type Type to deserialize the string to.
+ * @returns Typed value deserialized from the provided string.
+ */
+ _deserializeValue(value: string|null, type?: any): any;
+
+ /**
+ * Called at instance time with bag of properties that were overwritten
+ * by accessors on the prototype when accessors were created.
+ *
+ * The default implementation sets these properties back into the
+ * setter at instance time. This method is provided as an override
+ * point for customizing or providing more efficient initialization.
+ *
+ * @param props Bag of property values that were overwritten
+ * when creating property accessors.
+ */
+ _initializeProtoProperties(props: object|null): void;
+
+ /**
+ * Ensures the element has the given attribute. If it does not,
+ * assigns the given value to the attribute.
+ *
+ * @param attribute Name of attribute to ensure is set.
+ * @param value of the attribute.
+ */
+ _ensureAttribute(attribute: string, value: string): void;
+
+ /**
+ * Returns true if this library created an accessor for the given property.
+ *
+ * @param property Property name
+ * @returns True if an accessor was created
+ */
+ _hasAccessor(property: string): boolean;
+
+ /**
+ * Returns true if the specified property has a pending change.
+ *
+ * @param prop Property name
+ * @returns True if property has a pending change
+ */
+ _isPropertyPending(prop: string): boolean;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/property-effects.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/property-effects.d.ts
new file mode 100644
index 00000000000..572674abe38
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/property-effects.d.ts
@@ -0,0 +1,841 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/mixins/property-effects.html
+ */
+
+/// <reference path="../utils/boot.d.ts" />
+/// <reference path="../utils/mixin.d.ts" />
+/// <reference path="../utils/path.d.ts" />
+/// <reference path="../utils/case-map.d.ts" />
+/// <reference path="property-accessors.d.ts" />
+/// <reference path="template-stamp.d.ts" />
+
+declare namespace Polymer {
+
+
+ /**
+ * Element class mixin that provides meta-programming for Polymer's template
+ * binding and data observation (collectively, "property effects") system.
+ *
+ * This mixin uses provides the following key static methods for adding
+ * property effects to an element class:
+ * - `addPropertyEffect`
+ * - `createPropertyObserver`
+ * - `createMethodObserver`
+ * - `createNotifyingProperty`
+ * - `createReadOnlyProperty`
+ * - `createReflectedProperty`
+ * - `createComputedProperty`
+ * - `bindTemplate`
+ *
+ * Each method creates one or more property accessors, along with metadata
+ * used by this mixin's implementation of `_propertiesChanged` to perform
+ * the property effects.
+ *
+ * Underscored versions of the above methods also exist on the element
+ * prototype for adding property effects on instances at runtime.
+ *
+ * Note that this mixin overrides several `PropertyAccessors` methods, in
+ * many cases to maintain guarantees provided by the Polymer 1.x features;
+ * notably it changes property accessors to be synchronous by default
+ * whereas the default when using `PropertyAccessors` standalone is to be
+ * async by default.
+ */
+ function PropertyEffects<T extends new (...args: any[]) => {}>(base: T): T & PropertyEffectsConstructor & Polymer.TemplateStampConstructor & Polymer.PropertyAccessorsConstructor & Polymer.PropertiesChangedConstructor;
+
+ interface PropertyEffectsConstructor {
+ new(...args: any[]): PropertyEffects;
+
+ /**
+ * Overrides default `TemplateStamp` implementation to add support for
+ * parsing bindings from `TextNode`'s' `textContent`. A `bindings`
+ * array is added to `nodeInfo` and populated with binding metadata
+ * with information capturing the binding target, and a `parts` array
+ * with one or more metadata objects capturing the source(s) of the
+ * binding.
+ *
+ * @param node Node to parse
+ * @param templateInfo Template metadata for current template
+ * @param nodeInfo Node metadata for current template node
+ * @returns `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ */
+ _parseTemplateNode(node: Node|null, templateInfo: TemplateInfo|null, nodeInfo: NodeInfo|null): boolean;
+
+ /**
+ * Overrides default `TemplateStamp` implementation to add support for
+ * binding the properties that a nested template depends on to the template
+ * as `_host_<property>`.
+ *
+ * @param node Node to parse
+ * @param templateInfo Template metadata for current template
+ * @param nodeInfo Node metadata for current template node
+ * @returns `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ */
+ _parseTemplateNestedTemplate(node: Node|null, templateInfo: TemplateInfo|null, nodeInfo: NodeInfo|null): boolean;
+
+ /**
+ * Overrides default `TemplateStamp` implementation to add support for
+ * parsing bindings from attributes. A `bindings`
+ * array is added to `nodeInfo` and populated with binding metadata
+ * with information capturing the binding target, and a `parts` array
+ * with one or more metadata objects capturing the source(s) of the
+ * binding.
+ *
+ * @param node Node to parse
+ * @param templateInfo Template metadata for current template
+ * @param nodeInfo Node metadata for current template node
+ * @param name Attribute name
+ * @param value Attribute value
+ * @returns `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ */
+ _parseTemplateNodeAttribute(node: _Element|null, templateInfo: TemplateInfo|null, nodeInfo: NodeInfo|null, name: string, value: string): boolean;
+
+ /**
+ * Ensures an accessor exists for the specified property, and adds
+ * to a list of "property effects" that will run when the accessor for
+ * the specified property is set. Effects are grouped by "type", which
+ * roughly corresponds to a phase in effect processing. The effect
+ * metadata should be in the following form:
+ *
+ * {
+ * fn: effectFunction, // Reference to function to call to perform effect
+ * info: { ... } // Effect metadata passed to function
+ * trigger: { // Optional triggering metadata; if not provided
+ * name: string // the property is treated as a wildcard
+ * structured: boolean
+ * wildcard: boolean
+ * }
+ * }
+ *
+ * Effects are called from `_propertiesChanged` in the following order by
+ * type:
+ *
+ * 1. COMPUTE
+ * 2. PROPAGATE
+ * 3. REFLECT
+ * 4. OBSERVE
+ * 5. NOTIFY
+ *
+ * Effect functions are called with the following signature:
+ *
+ * effectFunction(inst, path, props, oldProps, info, hasPaths)
+ *
+ * @param property Property that should trigger the effect
+ * @param type Effect type, from this.PROPERTY_EFFECT_TYPES
+ * @param effect Effect metadata object
+ */
+ addPropertyEffect(property: string, type: string, effect?: object|null): void;
+
+ /**
+ * Creates a single-property observer for the given property.
+ *
+ * @param property Property name
+ * @param method Function or name of observer method to call
+ * @param dynamicFn Whether the method name should be included as
+ * a dependency to the effect.
+ */
+ createPropertyObserver(property: string, method: string|((p0: any, p1: any) => any), dynamicFn?: boolean): void;
+
+ /**
+ * Creates a multi-property "method observer" based on the provided
+ * expression, which should be a string in the form of a normal JavaScript
+ * function signature: `'methodName(arg1, [..., argn])'`. Each argument
+ * should correspond to a property or path in the context of this
+ * prototype (or instance), or may be a literal string or number.
+ *
+ * @param expression Method expression
+ * @param dynamicFn Boolean or object map indicating
+ * @returns whether method names should be included as a dependency to the effect.
+ */
+ createMethodObserver(expression: string, dynamicFn?: boolean|object|null): void;
+
+ /**
+ * Causes the setter for the given property to dispatch `<property>-changed`
+ * events to notify of changes to the property.
+ *
+ * @param property Property name
+ */
+ createNotifyingProperty(property: string): void;
+
+ /**
+ * Creates a read-only accessor for the given property.
+ *
+ * To set the property, use the protected `_setProperty` API.
+ * To create a custom protected setter (e.g. `_setMyProp()` for
+ * property `myProp`), pass `true` for `protectedSetter`.
+ *
+ * Note, if the property will have other property effects, this method
+ * should be called first, before adding other effects.
+ *
+ * @param property Property name
+ * @param protectedSetter Creates a custom protected setter
+ * when `true`.
+ */
+ createReadOnlyProperty(property: string, protectedSetter?: boolean): void;
+
+ /**
+ * Causes the setter for the given property to reflect the property value
+ * to a (dash-cased) attribute of the same name.
+ *
+ * @param property Property name
+ */
+ createReflectedProperty(property: string): void;
+
+ /**
+ * Creates a computed property whose value is set to the result of the
+ * method described by the given `expression` each time one or more
+ * arguments to the method changes. The expression should be a string
+ * in the form of a normal JavaScript function signature:
+ * `'methodName(arg1, [..., argn])'`
+ *
+ * @param property Name of computed property to set
+ * @param expression Method expression
+ * @param dynamicFn Boolean or object map indicating whether
+ * method names should be included as a dependency to the effect.
+ */
+ createComputedProperty(property: string, expression: string, dynamicFn?: boolean|object|null): void;
+
+ /**
+ * Parses the provided template to ensure binding effects are created
+ * for them, and then ensures property accessors are created for any
+ * dependent properties in the template. Binding effects for bound
+ * templates are stored in a linked list on the instance so that
+ * templates can be efficiently stamped and unstamped.
+ *
+ * @param template Template containing binding
+ * bindings
+ * @returns Template metadata object
+ */
+ bindTemplate(template: HTMLTemplateElement): TemplateInfo;
+
+ /**
+ * Adds a property effect to the given template metadata, which is run
+ * at the "propagate" stage of `_propertiesChanged` when the template
+ * has been bound to the element via `_bindTemplate`.
+ *
+ * The `effect` object should match the format in `_addPropertyEffect`.
+ *
+ * @param templateInfo Template metadata to add effect to
+ * @param prop Property that should trigger the effect
+ * @param effect Effect metadata object
+ */
+ _addTemplatePropertyEffect(templateInfo: object|null, prop: string, effect?: object|null): void;
+
+ /**
+ * Called to parse text in a template (either attribute values or
+ * textContent) into binding metadata.
+ *
+ * Any overrides of this method should return an array of binding part
+ * metadata representing one or more bindings found in the provided text
+ * and any "literal" text in between. Any non-literal parts will be passed
+ * to `_evaluateBinding` when any dependencies change. The only required
+ * fields of each "part" in the returned array are as follows:
+ *
+ * - `dependencies` - Array containing trigger metadata for each property
+ * that should trigger the binding to update
+ * - `literal` - String containing text if the part represents a literal;
+ * in this case no `dependencies` are needed
+ *
+ * Additional metadata for use by `_evaluateBinding` may be provided in
+ * each part object as needed.
+ *
+ * The default implementation handles the following types of bindings
+ * (one or more may be intermixed with literal strings):
+ * - Property binding: `[[prop]]`
+ * - Path binding: `[[object.prop]]`
+ * - Negated property or path bindings: `[[!prop]]` or `[[!object.prop]]`
+ * - Two-way property or path bindings (supports negation):
+ * `{{prop}}`, `{{object.prop}}`, `{{!prop}}` or `{{!object.prop}}`
+ * - Inline computed method (supports negation):
+ * `[[compute(a, 'literal', b)]]`, `[[!compute(a, 'literal', b)]]`
+ *
+ * @param text Text to parse from attribute or textContent
+ * @param templateInfo Current template metadata
+ * @returns Array of binding part metadata
+ */
+ _parseBindings(text: string, templateInfo: object|null): BindingPart[]|null;
+
+ /**
+ * Called to evaluate a previously parsed binding part based on a set of
+ * one or more changed dependencies.
+ *
+ * @param inst Element that should be used as scope for
+ * binding dependencies
+ * @param part Binding part metadata
+ * @param path Property/path that triggered this effect
+ * @param props Bag of current property changes
+ * @param oldProps Bag of previous values for changed properties
+ * @param hasPaths True with `props` contains one or more paths
+ * @returns Value the binding part evaluated to
+ */
+ _evaluateBinding(inst: this|null, part: BindingPart|null, path: string, props: object|null, oldProps: object|null, hasPaths: boolean): any;
+ }
+
+ interface PropertyEffects {
+ readonly PROPERTY_EFFECT_TYPES: any;
+
+ /**
+ * Stamps the provided template and performs instance-time setup for
+ * Polymer template features, including data bindings, declarative event
+ * listeners, and the `this.$` map of `id`'s to nodes. A document fragment
+ * is returned containing the stamped DOM, ready for insertion into the
+ * DOM.
+ *
+ * This method may be called more than once; however note that due to
+ * `shadycss` polyfill limitations, only styles from templates prepared
+ * using `ShadyCSS.prepareTemplate` will be correctly polyfilled (scoped
+ * to the shadow root and support CSS custom properties), and note that
+ * `ShadyCSS.prepareTemplate` may only be called once per element. As such,
+ * any styles required by in runtime-stamped templates must be included
+ * in the main element template.
+ *
+ * @param template Template to stamp
+ * @returns Cloned template content
+ */
+ _stampTemplate(template: HTMLTemplateElement): StampedTemplate;
+
+ /**
+ * Overrides `PropertyAccessors` so that property accessor
+ * side effects are not enabled until after client dom is fully ready.
+ * Also calls `_flushClients` callback to ensure client dom is enabled
+ * that was not enabled as a result of flushing properties.
+ */
+ ready(): void;
+ _initializeProperties(): void;
+
+ /**
+ * Overrides `Polymer.PropertyAccessors` implementation to avoid setting
+ * `_setProperty`'s `shouldNotify: true`.
+ *
+ * @param props Properties to initialize on the instance
+ */
+ _initializeInstanceProperties(props: object|null): void;
+
+ /**
+ * Overrides base implementation to ensure all accessors set `shouldNotify`
+ * to true, for per-property notification tracking.
+ *
+ * @param property Name of the property
+ * @param value Value to set
+ */
+ _setProperty(property: string, value: any): void;
+
+ /**
+ * Overrides the `PropertiesChanged` implementation to introduce special
+ * dirty check logic depending on the property & value being set:
+ *
+ * 1. Any value set to a path (e.g. 'obj.prop': 42 or 'obj.prop': {...})
+ * Stored in `__dataTemp`, dirty checked against `__dataTemp`
+ * 2. Object set to simple property (e.g. 'prop': {...})
+ * Stored in `__dataTemp` and `__data`, dirty checked against
+ * `__dataTemp` by default implementation of `_shouldPropertyChange`
+ * 3. Primitive value set to simple property (e.g. 'prop': 42)
+ * Stored in `__data`, dirty checked against `__data`
+ *
+ * The dirty-check is important to prevent cycles due to two-way
+ * notification, but paths and objects are only dirty checked against any
+ * previous value set during this turn via a "temporary cache" that is
+ * cleared when the last `_propertiesChanged` exits. This is so:
+ * a. any cached array paths (e.g. 'array.3.prop') may be invalidated
+ * due to array mutations like shift/unshift/splice; this is fine
+ * since path changes are dirty-checked at user entry points like `set`
+ * b. dirty-checking for objects only lasts one turn to allow the user
+ * to mutate the object in-place and re-set it with the same identity
+ * and have all sub-properties re-propagated in a subsequent turn.
+ *
+ * The temp cache is not necessarily sufficient to prevent invalid array
+ * paths, since a splice can happen during the same turn (with pathological
+ * user code); we could introduce a "fixup" for temporarily cached array
+ * paths if needed: https://github.com/Polymer/polymer/issues/4227
+ *
+ * @param property Name of the property
+ * @param value Value to set
+ * @param shouldNotify True if property should fire notification
+ * event (applies only for `notify: true` properties)
+ * @returns Returns true if the property changed
+ */
+ _setPendingProperty(property: string, value: any, shouldNotify?: boolean): boolean;
+
+ /**
+ * Overrides `PropertyAccessor`'s default async queuing of
+ * `_propertiesChanged`: if `__dataReady` is false (has not yet been
+ * manually flushed), the function no-ops; otherwise flushes
+ * `_propertiesChanged` synchronously.
+ */
+ _invalidateProperties(): void;
+
+ /**
+ * Overrides superclass implementation.
+ */
+ _flushProperties(): void;
+
+ /**
+ * Implements `PropertyAccessors`'s properties changed callback.
+ *
+ * Runs each class of effects for the batch of changed properties in
+ * a specific order (compute, propagate, reflect, observe, notify).
+ *
+ * @param currentProps Bag of all current accessor values
+ * @param changedProps Bag of properties changed since the last
+ * call to `_propertiesChanged`
+ * @param oldProps Bag of previous values for each property
+ * in `changedProps`
+ */
+ _propertiesChanged(currentProps: object, changedProps: object, oldProps: object): void;
+
+ /**
+ * Overrides `Polymer.PropertyAccessors` implementation to provide a
+ * more efficient implementation of initializing properties from
+ * the prototype on the instance.
+ *
+ * @param props Properties to initialize on the prototype
+ */
+ _initializeProtoProperties(props: object|null): void;
+
+ /**
+ * Equivalent to static `addPropertyEffect` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param property Property that should trigger the effect
+ * @param type Effect type, from this.PROPERTY_EFFECT_TYPES
+ * @param effect Effect metadata object
+ */
+ _addPropertyEffect(property: string, type: string, effect?: object|null): void;
+
+ /**
+ * Removes the given property effect.
+ *
+ * @param property Property the effect was associated with
+ * @param type Effect type, from this.PROPERTY_EFFECT_TYPES
+ * @param effect Effect metadata object to remove
+ */
+ _removePropertyEffect(property: string, type: string, effect?: object|null): void;
+
+ /**
+ * Returns whether the current prototype/instance has a property effect
+ * of a certain type.
+ *
+ * @param property Property name
+ * @param type Effect type, from this.PROPERTY_EFFECT_TYPES
+ * @returns True if the prototype/instance has an effect of this type
+ */
+ _hasPropertyEffect(property: string, type?: string): boolean;
+
+ /**
+ * Returns whether the current prototype/instance has a "read only"
+ * accessor for the given property.
+ *
+ * @param property Property name
+ * @returns True if the prototype/instance has an effect of this type
+ */
+ _hasReadOnlyEffect(property: string): boolean;
+
+ /**
+ * Returns whether the current prototype/instance has a "notify"
+ * property effect for the given property.
+ *
+ * @param property Property name
+ * @returns True if the prototype/instance has an effect of this type
+ */
+ _hasNotifyEffect(property: string): boolean;
+
+ /**
+ * Returns whether the current prototype/instance has a "reflect to attribute"
+ * property effect for the given property.
+ *
+ * @param property Property name
+ * @returns True if the prototype/instance has an effect of this type
+ */
+ _hasReflectEffect(property: string): boolean;
+
+ /**
+ * Returns whether the current prototype/instance has a "computed"
+ * property effect for the given property.
+ *
+ * @param property Property name
+ * @returns True if the prototype/instance has an effect of this type
+ */
+ _hasComputedEffect(property: string): boolean;
+
+ /**
+ * Sets a pending property or path. If the root property of the path in
+ * question had no accessor, the path is set, otherwise it is enqueued
+ * via `_setPendingProperty`.
+ *
+ * This function isolates relatively expensive functionality necessary
+ * for the public API (`set`, `setProperties`, `notifyPath`, and property
+ * change listeners via {{...}} bindings), such that it is only done
+ * when paths enter the system, and not at every propagation step. It
+ * also sets a `__dataHasPaths` flag on the instance which is used to
+ * fast-path slower path-matching code in the property effects host paths.
+ *
+ * `path` can be a path string or array of path parts as accepted by the
+ * public API.
+ *
+ * @param path Path to set
+ * @param value Value to set
+ * @param shouldNotify Set to true if this change should
+ * cause a property notification event dispatch
+ * @param isPathNotification If the path being set is a path
+ * notification of an already changed value, as opposed to a request
+ * to set and notify the change. In the latter `false` case, a dirty
+ * check is performed and then the value is set to the path before
+ * enqueuing the pending property change.
+ * @returns Returns true if the property/path was enqueued in
+ * the pending changes bag.
+ */
+ _setPendingPropertyOrPath(path: string|Array<number|string>, value: any, shouldNotify?: boolean, isPathNotification?: boolean): boolean;
+
+ /**
+ * Applies a value to a non-Polymer element/node's property.
+ *
+ * The implementation makes a best-effort at binding interop:
+ * Some native element properties have side-effects when
+ * re-setting the same value (e.g. setting `<input>.value` resets the
+ * cursor position), so we do a dirty-check before setting the value.
+ * However, for better interop with non-Polymer custom elements that
+ * accept objects, we explicitly re-set object changes coming from the
+ * Polymer world (which may include deep object changes without the
+ * top reference changing), erring on the side of providing more
+ * information.
+ *
+ * Users may override this method to provide alternate approaches.
+ *
+ * @param node The node to set a property on
+ * @param prop The property to set
+ * @param value The value to set
+ */
+ _setUnmanagedPropertyToNode(node: Node, prop: string, value: any): void;
+
+ /**
+ * Enqueues the given client on a list of pending clients, whose
+ * pending property changes can later be flushed via a call to
+ * `_flushClients`.
+ *
+ * @param client PropertyEffects client to enqueue
+ */
+ _enqueueClient(client: object|null): void;
+
+ /**
+ * Flushes any clients previously enqueued via `_enqueueClient`, causing
+ * their `_flushProperties` method to run.
+ */
+ _flushClients(): void;
+
+ /**
+ * Perform any initial setup on client dom. Called before the first
+ * `_flushProperties` call on client dom and before any element
+ * observers are called.
+ */
+ _readyClients(): void;
+
+ /**
+ * Sets a bag of property changes to this instance, and
+ * synchronously processes all effects of the properties as a batch.
+ *
+ * Property names must be simple properties, not paths. Batched
+ * path propagation is not supported.
+ *
+ * @param props Bag of one or more key-value pairs whose key is
+ * a property and value is the new value to set for that property.
+ * @param setReadOnly When true, any private values set in
+ * `props` will be set. By default, `setProperties` will not set
+ * `readOnly: true` root properties.
+ */
+ setProperties(props: object|null, setReadOnly?: boolean): void;
+
+ /**
+ * Called to propagate any property changes to stamped template nodes
+ * managed by this element.
+ *
+ * @param changedProps Bag of changed properties
+ * @param oldProps Bag of previous values for changed properties
+ * @param hasPaths True with `props` contains one or more paths
+ */
+ _propagatePropertyChanges(changedProps: object|null, oldProps: object|null, hasPaths: boolean): void;
+
+ /**
+ * Aliases one data path as another, such that path notifications from one
+ * are routed to the other.
+ *
+ * @param to Target path to link.
+ * @param from Source path to link.
+ */
+ linkPaths(to: string|Array<string|number>, from: string|Array<string|number>): void;
+
+ /**
+ * Removes a data path alias previously established with `_linkPaths`.
+ *
+ * Note, the path to unlink should be the target (`to`) used when
+ * linking the paths.
+ *
+ * @param path Target path to unlink.
+ */
+ unlinkPaths(path: string|Array<string|number>): void;
+
+ /**
+ * Notify that an array has changed.
+ *
+ * Example:
+ *
+ * this.items = [ {name: 'Jim'}, {name: 'Todd'}, {name: 'Bill'} ];
+ * ...
+ * this.items.splice(1, 1, {name: 'Sam'});
+ * this.items.push({name: 'Bob'});
+ * this.notifySplices('items', [
+ * { index: 1, removed: [{name: 'Todd'}], addedCount: 1, object: this.items, type: 'splice' },
+ * { index: 3, removed: [], addedCount: 1, object: this.items, type: 'splice'}
+ * ]);
+ *
+ * @param path Path that should be notified.
+ * @param splices Array of splice records indicating ordered
+ * changes that occurred to the array. Each record should have the
+ * following fields:
+ * * index: index at which the change occurred
+ * * removed: array of items that were removed from this index
+ * * addedCount: number of new items added at this index
+ * * object: a reference to the array in question
+ * * type: the string literal 'splice'
+ *
+ * Note that splice records _must_ be normalized such that they are
+ * reported in index order (raw results from `Object.observe` are not
+ * ordered and must be normalized/merged before notifying).
+ */
+ notifySplices(path: string, splices: any[]|null): void;
+
+ /**
+ * Convenience method for reading a value from a path.
+ *
+ * Note, if any part in the path is undefined, this method returns
+ * `undefined` (this method does not throw when dereferencing undefined
+ * paths).
+ *
+ * @param path Path to the value
+ * to read. The path may be specified as a string (e.g. `foo.bar.baz`)
+ * or an array of path parts (e.g. `['foo.bar', 'baz']`). Note that
+ * bracketed expressions are not supported; string-based path parts
+ * *must* be separated by dots. Note that when dereferencing array
+ * indices, the index may be used as a dotted part directly
+ * (e.g. `users.12.name` or `['users', 12, 'name']`).
+ * @param root Root object from which the path is evaluated.
+ * @returns Value at the path, or `undefined` if any part of the path
+ * is undefined.
+ */
+ get(path: string|Array<string|number>, root?: object|null): any;
+
+ /**
+ * Convenience method for setting a value to a path and notifying any
+ * elements bound to the same path.
+ *
+ * Note, if any part in the path except for the last is undefined,
+ * this method does nothing (this method does not throw when
+ * dereferencing undefined paths).
+ *
+ * @param path Path to the value
+ * to write. The path may be specified as a string (e.g. `'foo.bar.baz'`)
+ * or an array of path parts (e.g. `['foo.bar', 'baz']`). Note that
+ * bracketed expressions are not supported; string-based path parts
+ * *must* be separated by dots. Note that when dereferencing array
+ * indices, the index may be used as a dotted part directly
+ * (e.g. `'users.12.name'` or `['users', 12, 'name']`).
+ * @param value Value to set at the specified path.
+ * @param root Root object from which the path is evaluated.
+ * When specified, no notification will occur.
+ */
+ set(path: string|Array<string|number>, value: any, root?: object|null): void;
+
+ /**
+ * Adds items onto the end of the array at the path specified.
+ *
+ * The arguments after `path` and return value match that of
+ * `Array.prototype.push`.
+ *
+ * This method notifies other paths to the same array that a
+ * splice occurred to the array.
+ *
+ * @param path Path to array.
+ * @param items Items to push onto array
+ * @returns New length of the array.
+ */
+ push(path: string|Array<string|number>, ...items: any[]): number;
+
+ /**
+ * Removes an item from the end of array at the path specified.
+ *
+ * The arguments after `path` and return value match that of
+ * `Array.prototype.pop`.
+ *
+ * This method notifies other paths to the same array that a
+ * splice occurred to the array.
+ *
+ * @param path Path to array.
+ * @returns Item that was removed.
+ */
+ pop(path: string|Array<string|number>): any;
+
+ /**
+ * Starting from the start index specified, removes 0 or more items
+ * from the array and inserts 0 or more new items in their place.
+ *
+ * The arguments after `path` and return value match that of
+ * `Array.prototype.splice`.
+ *
+ * This method notifies other paths to the same array that a
+ * splice occurred to the array.
+ *
+ * @param path Path to array.
+ * @param start Index from which to start removing/inserting.
+ * @param deleteCount Number of items to remove.
+ * @param items Items to insert into array.
+ * @returns Array of removed items.
+ */
+ splice(path: string|Array<string|number>, start: number, deleteCount: number, ...items: any[]): any[]|null;
+
+ /**
+ * Removes an item from the beginning of array at the path specified.
+ *
+ * The arguments after `path` and return value match that of
+ * `Array.prototype.pop`.
+ *
+ * This method notifies other paths to the same array that a
+ * splice occurred to the array.
+ *
+ * @param path Path to array.
+ * @returns Item that was removed.
+ */
+ shift(path: string|Array<string|number>): any;
+
+ /**
+ * Adds items onto the beginning of the array at the path specified.
+ *
+ * The arguments after `path` and return value match that of
+ * `Array.prototype.push`.
+ *
+ * This method notifies other paths to the same array that a
+ * splice occurred to the array.
+ *
+ * @param path Path to array.
+ * @param items Items to insert info array
+ * @returns New length of the array.
+ */
+ unshift(path: string|Array<string|number>, ...items: any[]): number;
+
+ /**
+ * Notify that a path has changed.
+ *
+ * Example:
+ *
+ * this.item.user.name = 'Bob';
+ * this.notifyPath('item.user.name');
+ *
+ * @param path Path that should be notified.
+ * @param value Value at the path (optional).
+ */
+ notifyPath(path: string, value?: any): void;
+
+ /**
+ * Equivalent to static `createReadOnlyProperty` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param property Property name
+ * @param protectedSetter Creates a custom protected setter
+ * when `true`.
+ */
+ _createReadOnlyProperty(property: string, protectedSetter?: boolean): void;
+
+ /**
+ * Equivalent to static `createPropertyObserver` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param property Property name
+ * @param method Function or name of observer method to call
+ * @param dynamicFn Whether the method name should be included as
+ * a dependency to the effect.
+ */
+ _createPropertyObserver(property: string, method: string|((p0: any, p1: any) => any), dynamicFn?: boolean): void;
+
+ /**
+ * Equivalent to static `createMethodObserver` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param expression Method expression
+ * @param dynamicFn Boolean or object map indicating
+ * whether method names should be included as a dependency to the effect.
+ */
+ _createMethodObserver(expression: string, dynamicFn?: boolean|object|null): void;
+
+ /**
+ * Equivalent to static `createNotifyingProperty` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param property Property name
+ */
+ _createNotifyingProperty(property: string): void;
+
+ /**
+ * Equivalent to static `createReflectedProperty` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param property Property name
+ */
+ _createReflectedProperty(property: string): void;
+
+ /**
+ * Equivalent to static `createComputedProperty` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param property Name of computed property to set
+ * @param expression Method expression
+ * @param dynamicFn Boolean or object map indicating
+ * whether method names should be included as a dependency to the effect.
+ */
+ _createComputedProperty(property: string, expression: string, dynamicFn?: boolean|object|null): void;
+
+ /**
+ * Equivalent to static `bindTemplate` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * This method may be called on the prototype (for prototypical template
+ * binding, to avoid creating accessors every instance) once per prototype,
+ * and will be called with `runtimeBinding: true` by `_stampTemplate` to
+ * create and link an instance of the template metadata associated with a
+ * particular stamping.
+ *
+ * @param template Template containing binding
+ * bindings
+ * @param instanceBinding When false (default), performs
+ * "prototypical" binding of the template and overwrites any previously
+ * bound template for the class. When true (as passed from
+ * `_stampTemplate`), the template info is instanced and linked into
+ * the list of bound templates.
+ * @returns Template metadata object; for `runtimeBinding`,
+ * this is an instance of the prototypical template info
+ */
+ _bindTemplate(template: HTMLTemplateElement, instanceBinding?: boolean): TemplateInfo;
+
+ /**
+ * Removes and unbinds the nodes previously contained in the provided
+ * DocumentFragment returned from `_stampTemplate`.
+ *
+ * @param dom DocumentFragment previously returned
+ * from `_stampTemplate` associated with the nodes to be removed
+ */
+ _removeBoundDom(dom: StampedTemplate): void;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/template-stamp.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/template-stamp.d.ts
new file mode 100644
index 00000000000..6019d130174
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/mixins/template-stamp.d.ts
@@ -0,0 +1,258 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/mixins/template-stamp.html
+ */
+
+/// <reference path="../utils/boot.d.ts" />
+/// <reference path="../utils/mixin.d.ts" />
+
+declare namespace Polymer {
+
+
+ /**
+ * Element mixin that provides basic template parsing and stamping, including
+ * the following template-related features for stamped templates:
+ *
+ * - Declarative event listeners (`on-eventname="listener"`)
+ * - Map of node id's to stamped node instances (`this.$.id`)
+ * - Nested template content caching/removal and re-installation (performance
+ * optimization)
+ */
+ function TemplateStamp<T extends new (...args: any[]) => {}>(base: T): T & TemplateStampConstructor;
+
+ interface TemplateStampConstructor {
+ new(...args: any[]): TemplateStamp;
+
+ /**
+ * Scans a template to produce template metadata.
+ *
+ * Template-specific metadata are stored in the object returned, and node-
+ * specific metadata are stored in objects in its flattened `nodeInfoList`
+ * array. Only nodes in the template that were parsed as nodes of
+ * interest contain an object in `nodeInfoList`. Each `nodeInfo` object
+ * contains an `index` (`childNodes` index in parent) and optionally
+ * `parent`, which points to node info of its parent (including its index).
+ *
+ * The template metadata object returned from this method has the following
+ * structure (many fields optional):
+ *
+ * ```js
+ * {
+ * // Flattened list of node metadata (for nodes that generated metadata)
+ * nodeInfoList: [
+ * {
+ * // `id` attribute for any nodes with id's for generating `$` map
+ * id: {string},
+ * // `on-event="handler"` metadata
+ * events: [
+ * {
+ * name: {string}, // event name
+ * value: {string}, // handler method name
+ * }, ...
+ * ],
+ * // Notes when the template contained a `<slot>` for shady DOM
+ * // optimization purposes
+ * hasInsertionPoint: {boolean},
+ * // For nested `<template>`` nodes, nested template metadata
+ * templateInfo: {object}, // nested template metadata
+ * // Metadata to allow efficient retrieval of instanced node
+ * // corresponding to this metadata
+ * parentInfo: {number}, // reference to parent nodeInfo>
+ * parentIndex: {number}, // index in parent's `childNodes` collection
+ * infoIndex: {number}, // index of this `nodeInfo` in `templateInfo.nodeInfoList`
+ * },
+ * ...
+ * ],
+ * // When true, the template had the `strip-whitespace` attribute
+ * // or was nested in a template with that setting
+ * stripWhitespace: {boolean},
+ * // For nested templates, nested template content is moved into
+ * // a document fragment stored here; this is an optimization to
+ * // avoid the cost of nested template cloning
+ * content: {DocumentFragment}
+ * }
+ * ```
+ *
+ * This method kicks off a recursive treewalk as follows:
+ *
+ * ```
+ * _parseTemplate <---------------------+
+ * _parseTemplateContent |
+ * _parseTemplateNode <------------|--+
+ * _parseTemplateNestedTemplate --+ |
+ * _parseTemplateChildNodes ---------+
+ * _parseTemplateNodeAttributes
+ * _parseTemplateNodeAttribute
+ *
+ * ```
+ *
+ * These methods may be overridden to add custom metadata about templates
+ * to either `templateInfo` or `nodeInfo`.
+ *
+ * Note that this method may be destructive to the template, in that
+ * e.g. event annotations may be removed after being noted in the
+ * template metadata.
+ *
+ * @param template Template to parse
+ * @param outerTemplateInfo Template metadata from the outer
+ * template, for parsing nested templates
+ * @returns Parsed template metadata
+ */
+ _parseTemplate(template: HTMLTemplateElement, outerTemplateInfo?: TemplateInfo|null): TemplateInfo;
+ _parseTemplateContent(template: any, templateInfo: any, nodeInfo: any): any;
+
+ /**
+ * Parses template node and adds template and node metadata based on
+ * the current node, and its `childNodes` and `attributes`.
+ *
+ * This method may be overridden to add custom node or template specific
+ * metadata based on this node.
+ *
+ * @param node Node to parse
+ * @param templateInfo Template metadata for current template
+ * @param nodeInfo Node metadata for current template.
+ * @returns `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ */
+ _parseTemplateNode(node: Node|null, templateInfo: TemplateInfo, nodeInfo: NodeInfo): boolean;
+
+ /**
+ * Parses template child nodes for the given root node.
+ *
+ * This method also wraps whitelisted legacy template extensions
+ * (`is="dom-if"` and `is="dom-repeat"`) with their equivalent element
+ * wrappers, collapses text nodes, and strips whitespace from the template
+ * if the `templateInfo.stripWhitespace` setting was provided.
+ *
+ * @param root Root node whose `childNodes` will be parsed
+ * @param templateInfo Template metadata for current template
+ * @param nodeInfo Node metadata for current template.
+ */
+ _parseTemplateChildNodes(root: Node|null, templateInfo: TemplateInfo, nodeInfo: NodeInfo): void;
+
+ /**
+ * Parses template content for the given nested `<template>`.
+ *
+ * Nested template info is stored as `templateInfo` in the current node's
+ * `nodeInfo`. `template.content` is removed and stored in `templateInfo`.
+ * It will then be the responsibility of the host to set it back to the
+ * template and for users stamping nested templates to use the
+ * `_contentForTemplate` method to retrieve the content for this template
+ * (an optimization to avoid the cost of cloning nested template content).
+ *
+ * @param node Node to parse (a <template>)
+ * @param outerTemplateInfo Template metadata for current template
+ * that includes the template `node`
+ * @param nodeInfo Node metadata for current template.
+ * @returns `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ */
+ _parseTemplateNestedTemplate(node: HTMLTemplateElement|null, outerTemplateInfo: TemplateInfo|null, nodeInfo: NodeInfo): boolean;
+
+ /**
+ * Parses template node attributes and adds node metadata to `nodeInfo`
+ * for nodes of interest.
+ *
+ * @param node Node to parse
+ * @param templateInfo Template metadata for current template
+ * @param nodeInfo Node metadata for current template.
+ * @returns `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ */
+ _parseTemplateNodeAttributes(node: _Element|null, templateInfo: TemplateInfo|null, nodeInfo: NodeInfo|null): boolean;
+
+ /**
+ * Parses a single template node attribute and adds node metadata to
+ * `nodeInfo` for attributes of interest.
+ *
+ * This implementation adds metadata for `on-event="handler"` attributes
+ * and `id` attributes.
+ *
+ * @param node Node to parse
+ * @param templateInfo Template metadata for current template
+ * @param nodeInfo Node metadata for current template.
+ * @param name Attribute name
+ * @param value Attribute value
+ * @returns `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ */
+ _parseTemplateNodeAttribute(node: _Element|null, templateInfo: TemplateInfo, nodeInfo: NodeInfo, name: string, value: string): boolean;
+
+ /**
+ * Returns the `content` document fragment for a given template.
+ *
+ * For nested templates, Polymer performs an optimization to cache nested
+ * template content to avoid the cost of cloning deeply nested templates.
+ * This method retrieves the cached content for a given template.
+ *
+ * @param template Template to retrieve `content` for
+ * @returns Content fragment
+ */
+ _contentForTemplate(template: HTMLTemplateElement|null): DocumentFragment|null;
+ }
+
+ interface TemplateStamp {
+
+ /**
+ * Clones the provided template content and returns a document fragment
+ * containing the cloned dom.
+ *
+ * The template is parsed (once and memoized) using this library's
+ * template parsing features, and provides the following value-added
+ * features:
+ * * Adds declarative event listeners for `on-event="handler"` attributes
+ * * Generates an "id map" for all nodes with id's under `$` on returned
+ * document fragment
+ * * Passes template info including `content` back to templates as
+ * `_templateInfo` (a performance optimization to avoid deep template
+ * cloning)
+ *
+ * Note that the memoized template parsing process is destructive to the
+ * template: attributes for bindings and declarative event listeners are
+ * removed after being noted in notes, and any nested `<template>.content`
+ * is removed and stored in notes as well.
+ *
+ * @param template Template to stamp
+ * @returns Cloned template content
+ */
+ _stampTemplate(template: HTMLTemplateElement): StampedTemplate;
+
+ /**
+ * Adds an event listener by method name for the event provided.
+ *
+ * This method generates a handler function that looks up the method
+ * name at handling time.
+ *
+ * @param node Node to add listener on
+ * @param eventName Name of event
+ * @param methodName Name of method
+ * @param context Context the method will be called on (defaults
+ * to `node`)
+ * @returns Generated handler function
+ */
+ _addMethodEventListenerToNode(node: Node, eventName: string, methodName: string, context?: any): Function|null;
+
+ /**
+ * Override point for adding custom or simulated event handling.
+ *
+ * @param node Node to add event listener to
+ * @param eventName Name of event
+ * @param handler Listener function to add
+ */
+ _addEventListenerToNode(node: Node, eventName: string, handler: (p0: Event) => void): void;
+
+ /**
+ * Override point for adding custom or simulated event handling.
+ *
+ * @param node Node to remove event listener from
+ * @param eventName Name of event
+ * @param handler Listener function to remove
+ */
+ _removeEventListenerFromNode(node: Node|null, eventName: string, handler: (p0: Event) => void): void;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/array-splice.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/array-splice.d.ts
new file mode 100644
index 00000000000..faeb7c3dc03
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/array-splice.d.ts
@@ -0,0 +1,49 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/utils/array-splice.html
+ */
+
+/// <reference path="boot.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Module that provides utilities for diffing arrays.
+ */
+ namespace ArraySplice {
+
+
+ /**
+ * Returns an array of splice records indicating the minimum edits required
+ * to transform the `previous` array into the `current` array.
+ *
+ * Splice records are ordered by index and contain the following fields:
+ * - `index`: index where edit started
+ * - `removed`: array of removed items from this index
+ * - `addedCount`: number of items added at this index
+ *
+ * This function is based on the Levenshtein "minimum edit distance"
+ * algorithm. Note that updates are treated as removal followed by addition.
+ *
+ * The worst-case time complexity of this algorithm is `O(l * p)`
+ * l: The length of the current array
+ * p: The length of the previous array
+ *
+ * However, the worst-case complexity is reduced by an `O(n)` optimization
+ * to detect any shared prefix & suffix between the two arrays and only
+ * perform the more expensive minimum edit distance calculation over the
+ * non-shared portions of the arrays.
+ *
+ * @returns Returns an array of splice record objects. Each of these
+ * contains: `index` the location where the splice occurred; `removed`
+ * the array of removed items from this location; `addedCount` the number
+ * of items added at this location.
+ */
+ function calculateSplices(current: any[], previous: any[]): any[];
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/async.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/async.d.ts
new file mode 100644
index 00000000000..9588dd36c15
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/async.d.ts
@@ -0,0 +1,119 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/utils/async.html
+ */
+
+/// <reference path="boot.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Module that provides a number of strategies for enqueuing asynchronous
+ * tasks. Each sub-module provides a standard `run(fn)` interface that returns a
+ * handle, and a `cancel(handle)` interface for canceling async tasks before
+ * they run.
+ */
+ namespace Async {
+
+ /**
+ * Async interface wrapper around `setTimeout`.
+ */
+ namespace timeOut {
+
+
+ /**
+ * Returns a sub-module with the async interface providing the provided
+ * delay.
+ *
+ * @returns An async timeout interface
+ */
+ function after(delay?: number): AsyncInterface;
+
+
+ /**
+ * Enqueues a function called in the next task.
+ *
+ * @returns Handle used for canceling task
+ */
+ function run(fn: Function, delay?: number): number;
+
+
+ /**
+ * Cancels a previously enqueued `timeOut` callback.
+ */
+ function cancel(handle: number): void;
+ }
+
+ /**
+ * Async interface wrapper around `requestAnimationFrame`.
+ */
+ namespace animationFrame {
+
+
+ /**
+ * Enqueues a function called at `requestAnimationFrame` timing.
+ *
+ * @returns Handle used for canceling task
+ */
+ function run(fn: (p0: number) => void): number;
+
+
+ /**
+ * Cancels a previously enqueued `animationFrame` callback.
+ */
+ function cancel(handle: number): void;
+ }
+
+ /**
+ * Async interface wrapper around `requestIdleCallback`. Falls back to
+ * `setTimeout` on browsers that do not support `requestIdleCallback`.
+ */
+ namespace idlePeriod {
+
+
+ /**
+ * Enqueues a function called at `requestIdleCallback` timing.
+ *
+ * @returns Handle used for canceling task
+ */
+ function run(fn: (p0: IdleDeadline) => void): number;
+
+
+ /**
+ * Cancels a previously enqueued `idlePeriod` callback.
+ */
+ function cancel(handle: number): void;
+ }
+
+ /**
+ * Async interface for enqueuing callbacks that run at microtask timing.
+ *
+ * Note that microtask timing is achieved via a single `MutationObserver`,
+ * and thus callbacks enqueued with this API will all run in a single
+ * batch, and not interleaved with other microtasks such as promises.
+ * Promises are avoided as an implementation choice for the time being
+ * due to Safari bugs that cause Promises to lack microtask guarantees.
+ */
+ namespace microTask {
+
+
+ /**
+ * Enqueues a function called at microtask timing.
+ *
+ * @returns Handle used for canceling task
+ */
+ function run(callback?: Function): number;
+
+
+ /**
+ * Cancels a previously enqueued `microTask` callback.
+ */
+ function cancel(handle: number): void;
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/boot.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/boot.d.ts
new file mode 100644
index 00000000000..4175f318465
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/boot.d.ts
@@ -0,0 +1,19 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/utils/boot.html
+ */
+
+/// <reference path="../../extra-types.d.ts" />
+
+/**
+ * Polymer is a lightweight library built on top of the web
+ * standards-based Web Components API's, and makes it easy to build your
+ * own custom HTML elements.
+ */
+declare namespace Polymer {
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/case-map.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/case-map.d.ts
new file mode 100644
index 00000000000..9fc51175393
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/case-map.d.ts
@@ -0,0 +1,39 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/utils/case-map.html
+ */
+
+/// <reference path="boot.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Module with utilities for converting between "dash-case" and "camelCase"
+ * identifiers.
+ */
+ namespace CaseMap {
+
+
+ /**
+ * Converts "dash-case" identifier (e.g. `foo-bar-baz`) to "camelCase"
+ * (e.g. `fooBarBaz`).
+ *
+ * @returns Camel-case representation of the identifier
+ */
+ function dashToCamelCase(dash: string): string;
+
+
+ /**
+ * Converts "camelCase" identifier (e.g. `fooBarBaz`) to "dash-case"
+ * (e.g. `foo-bar-baz`).
+ *
+ * @returns Dash-case representation of the identifier
+ */
+ function camelToDashCase(camel: string): string;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/debounce.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/debounce.d.ts
new file mode 100644
index 00000000000..d8ee1eabc26
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/debounce.d.ts
@@ -0,0 +1,78 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/utils/debounce.html
+ */
+
+/// <reference path="boot.d.ts" />
+/// <reference path="mixin.d.ts" />
+/// <reference path="async.d.ts" />
+
+declare namespace Polymer {
+
+ class Debouncer {
+
+ /**
+ * Creates a debouncer if no debouncer is passed as a parameter
+ * or it cancels an active debouncer otherwise. The following
+ * example shows how a debouncer can be called multiple times within a
+ * microtask and "debounced" such that the provided callback function is
+ * called once. Add this method to a custom element:
+ *
+ * _debounceWork() {
+ * this._debounceJob = Polymer.Debouncer.debounce(this._debounceJob,
+ * Polymer.Async.microTask, () => {
+ * this._doWork();
+ * });
+ * }
+ *
+ * If the `_debounceWork` method is called multiple times within the same
+ * microtask, the `_doWork` function will be called only once at the next
+ * microtask checkpoint.
+ *
+ * Note: In testing it is often convenient to avoid asynchrony. To accomplish
+ * this with a debouncer, you can use `Polymer.enqueueDebouncer` and
+ * `Polymer.flush`. For example, extend the above example by adding
+ * `Polymer.enqueueDebouncer(this._debounceJob)` at the end of the
+ * `_debounceWork` method. Then in a test, call `Polymer.flush` to ensure
+ * the debouncer has completed.
+ *
+ * @param debouncer Debouncer object.
+ * @param asyncModule Object with Async interface
+ * @param callback Callback to run.
+ * @returns Returns a debouncer object.
+ */
+ static debounce(debouncer: Debouncer|null, asyncModule: AsyncInterface, callback: () => any): Debouncer;
+
+ /**
+ * Sets the scheduler; that is, a module with the Async interface,
+ * a callback and optional arguments to be passed to the run function
+ * from the async module.
+ *
+ * @param asyncModule Object with Async interface.
+ * @param callback Callback to run.
+ */
+ setConfig(asyncModule: AsyncInterface, callback: () => any): void;
+
+ /**
+ * Cancels an active debouncer and returns a reference to itself.
+ */
+ cancel(): void;
+
+ /**
+ * Flushes an active debouncer and returns a reference to itself.
+ */
+ flush(): void;
+
+ /**
+ * Returns true if the debouncer is active.
+ *
+ * @returns True if active.
+ */
+ isActive(): boolean;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/flattened-nodes-observer.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/flattened-nodes-observer.d.ts
new file mode 100644
index 00000000000..32915b4bd35
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/flattened-nodes-observer.d.ts
@@ -0,0 +1,96 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/utils/flattened-nodes-observer.html
+ */
+
+/// <reference path="boot.d.ts" />
+/// <reference path="array-splice.d.ts" />
+/// <reference path="async.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Class that listens for changes (additions or removals) to
+ * "flattened nodes" on a given `node`. The list of flattened nodes consists
+ * of a node's children and, for any children that are `<slot>` elements,
+ * the expanded flattened list of `assignedNodes`.
+ * For example, if the observed node has children `<a></a><slot></slot><b></b>`
+ * and the `<slot>` has one `<div>` assigned to it, then the flattened
+ * nodes list is `<a></a><div></div><b></b>`. If the `<slot>` has other
+ * `<slot>` elements assigned to it, these are flattened as well.
+ *
+ * The provided `callback` is called whenever any change to this list
+ * of flattened nodes occurs, where an addition or removal of a node is
+ * considered a change. The `callback` is called with one argument, an object
+ * containing an array of any `addedNodes` and `removedNodes`.
+ *
+ * Note: the callback is called asynchronous to any changes
+ * at a microtask checkpoint. This is because observation is performed using
+ * `MutationObserver` and the `<slot>` element's `slotchange` event which
+ * are asynchronous.
+ *
+ * An example:
+ * ```js
+ * class TestSelfObserve extends Polymer.Element {
+ * static get is() { return 'test-self-observe';}
+ * connectedCallback() {
+ * super.connectedCallback();
+ * this._observer = new Polymer.FlattenedNodesObserver(this, (info) => {
+ * this.info = info;
+ * });
+ * }
+ * disconnectedCallback() {
+ * super.disconnectedCallback();
+ * this._observer.disconnect();
+ * }
+ * }
+ * customElements.define(TestSelfObserve.is, TestSelfObserve);
+ * ```
+ */
+ class FlattenedNodesObserver {
+
+ /**
+ * Returns the list of flattened nodes for the given `node`.
+ * This list consists of a node's children and, for any children
+ * that are `<slot>` elements, the expanded flattened list of `assignedNodes`.
+ * For example, if the observed node has children `<a></a><slot></slot><b></b>`
+ * and the `<slot>` has one `<div>` assigned to it, then the flattened
+ * nodes list is `<a></a><div></div><b></b>`. If the `<slot>` has other
+ * `<slot>` elements assigned to it, these are flattened as well.
+ *
+ * @param node The node for which to return the list of flattened nodes.
+ * @returns The list of flattened nodes for the given `node`.
+ */
+ static getFlattenedNodes(node: HTMLElement|HTMLSlotElement|null): any[]|null;
+
+ /**
+ * Activates an observer. This method is automatically called when
+ * a `FlattenedNodesObserver` is created. It should only be called to
+ * re-activate an observer that has been deactivated via the `disconnect` method.
+ */
+ connect(): void;
+
+ /**
+ * Deactivates the flattened nodes observer. After calling this method
+ * the observer callback will not be called when changes to flattened nodes
+ * occur. The `connect` method may be subsequently called to reactivate
+ * the observer.
+ */
+ disconnect(): void;
+
+ /**
+ * Flushes the observer causing any pending changes to be immediately
+ * delivered the observer callback. By default these changes are delivered
+ * asynchronously at the next microtask checkpoint.
+ *
+ * @returns Returns true if any pending changes caused the observer
+ * callback to run.
+ */
+ flush(): boolean;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/flush.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/flush.d.ts
new file mode 100644
index 00000000000..5481803ec2b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/flush.d.ts
@@ -0,0 +1,28 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/utils/flush.html
+ */
+
+/// <reference path="boot.d.ts" />
+
+declare namespace Polymer {
+
+
+ /**
+ * Adds a `Polymer.Debouncer` to a list of globally flushable tasks.
+ */
+ function enqueueDebouncer(debouncer: Polymer.Debouncer): void;
+
+
+ /**
+ * Forces several classes of asynchronously queued tasks to flush:
+ * - Debouncers added via `enqueueDebouncer`
+ * - ShadyDOM distribution
+ */
+ function flush(): void;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/gestures.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/gestures.d.ts
new file mode 100644
index 00000000000..6c7843506c3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/gestures.d.ts
@@ -0,0 +1,87 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/utils/gestures.html
+ */
+
+/// <reference path="boot.d.ts" />
+/// <reference path="async.d.ts" />
+/// <reference path="debounce.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Module for adding listeners to a node for the following normalized
+ * cross-platform "gesture" events:
+ * - `down` - mouse or touch went down
+ * - `up` - mouse or touch went up
+ * - `tap` - mouse click or finger tap
+ * - `track` - mouse drag or touch move
+ */
+ namespace Gestures {
+
+
+ /**
+ * Finds the element rendered on the screen at the provided coordinates.
+ *
+ * Similar to `document.elementFromPoint`, but pierces through
+ * shadow roots.
+ *
+ * @returns Returns the deepest shadowRoot inclusive element
+ * found at the screen position given.
+ */
+ function deepTargetFind(x: number, y: number): _Element|null;
+
+
+ /**
+ * Adds an event listener to a node for the given gesture type.
+ *
+ * @returns Returns true if a gesture event listener was added.
+ */
+ function addListener(node: Node, evType: string, handler: (p0: Event) => void): boolean;
+
+
+ /**
+ * Removes an event listener from a node for the given gesture type.
+ *
+ * @returns Returns true if a gesture event listener was removed.
+ */
+ function removeListener(node: Node, evType: string, handler: (p0: Event) => void): boolean;
+
+
+ /**
+ * Registers a new gesture event recognizer for adding new custom
+ * gesture event types.
+ */
+ function register(recog: GestureRecognizer): void;
+
+
+ /**
+ * Sets scrolling direction on node.
+ *
+ * This value is checked on first move, thus it should be called prior to
+ * adding event listeners.
+ */
+ function setTouchAction(node: _Element, value: string): void;
+
+
+ /**
+ * Prevents the dispatch and default action of the given event name.
+ */
+ function prevent(evName: string): void;
+
+
+ /**
+ * Reset the 2500ms timeout on processing mouse input after detecting touch input.
+ *
+ * Touch inputs create synthesized mouse inputs anywhere from 0 to 2000ms after the touch.
+ * This method should only be called during testing with simulated touch inputs.
+ * Calling this method in production may cause duplicate taps or other Gestures.
+ */
+ function resetMouseCanceller(): void;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/html-tag.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/html-tag.d.ts
new file mode 100644
index 00000000000..5c138ccc6ed
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/html-tag.d.ts
@@ -0,0 +1,86 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/utils/html-tag.html
+ */
+
+/// <reference path="boot.d.ts" />
+
+/**
+ * Class representing a static string value which can be used to filter
+ * strings by asseting that they have been created via this class. The
+ * `value` property returns the string passed to the constructor.
+ */
+declare class LiteralString {
+ value: string;
+
+ /**
+ * @returns LiteralString string value
+ */
+ toString(): string;
+}
+
+declare namespace Polymer {
+
+
+ /**
+ * A template literal tag that creates an HTML <template> element from the
+ * contents of the string.
+ *
+ * This allows you to write a Polymer Template in JavaScript.
+ *
+ * Templates can be composed by interpolating `HTMLTemplateElement`s in
+ * expressions in the JavaScript template literal. The nested template's
+ * `innerHTML` is included in the containing template. The only other
+ * values allowed in expressions are those returned from `Polymer.htmlLiteral`
+ * which ensures only literal values from JS source ever reach the HTML, to
+ * guard against XSS risks.
+ *
+ * All other values are disallowed in expressions to help prevent XSS
+ * attacks; however, `Polymer.htmlLiteral` can be used to compose static
+ * string values into templates. This is useful to compose strings into
+ * places that do not accept html, like the css text of a `style`
+ * element.
+ *
+ * Example:
+ *
+ * static get template() {
+ * return Polymer.html`
+ * <style>:host{ content:"..." }</style>
+ * <div class="shadowed">${this.partialTemplate}</div>
+ * ${super.template}
+ * `;
+ * }
+ * static get partialTemplate() { return Polymer.html`<span>Partial!</span>`; }
+ *
+ * @returns Constructed HTMLTemplateElement
+ */
+ function html(strings: TemplateStringsArray, ...values: any[]): HTMLTemplateElement;
+
+
+ /**
+ * An html literal tag that can be used with `Polymer.html` to compose.
+ * a literal string.
+ *
+ * Example:
+ *
+ * static get template() {
+ * return Polymer.html`
+ * <style>
+ * :host { display: block; }
+ * ${styleTemplate}
+ * </style>
+ * <div class="shadowed">${staticValue}</div>
+ * ${super.template}
+ * `;
+ * }
+ * static get styleTemplate() { return Polymer.htmlLiteral`.shadowed { background: gray; }`; }
+ *
+ * @returns Constructed literal string
+ */
+ function htmlLiteral(strings: TemplateStringsArray, ...values: any[]): LiteralString;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/import-href.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/import-href.d.ts
new file mode 100644
index 00000000000..16a0ae3e716
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/import-href.d.ts
@@ -0,0 +1,27 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/utils/import-href.html
+ */
+
+/// <reference path="boot.d.ts" />
+
+declare namespace Polymer {
+
+
+ /**
+ * Convenience method for importing an HTML document imperatively.
+ *
+ * This method creates a new `<link rel="import">` element with
+ * the provided URL and appends it to the document to start loading.
+ * In the `onload` callback, the `import` property of the `link`
+ * element will contain the imported document contents.
+ *
+ * @returns The link element for the URL to be loaded.
+ */
+ function importHref(href: string, onload?: ((p0: Event) => void)|null, onerror?: ((p0: ErrorEvent) => void)|null, optAsync?: boolean): HTMLLinkElement;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/mixin.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/mixin.d.ts
new file mode 100644
index 00000000000..a42c969c204
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/mixin.d.ts
@@ -0,0 +1,22 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/utils/mixin.html
+ */
+
+/// <reference path="boot.d.ts" />
+
+declare namespace Polymer {
+
+
+ /**
+ * Wraps an ES6 class expression mixin such that the mixin is only applied
+ * if it has not already been applied its base argument. Also memoizes mixin
+ * applications.
+ */
+ function dedupingMixin<T>(mixin: T): T;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/path.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/path.d.ts
new file mode 100644
index 00000000000..afcc5efbac7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/path.d.ts
@@ -0,0 +1,151 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/utils/path.html
+ */
+
+/// <reference path="boot.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Module with utilities for manipulating structured data path strings.
+ */
+ namespace Path {
+
+
+ /**
+ * Returns true if the given string is a structured data path (has dots).
+ *
+ * Example:
+ *
+ * ```
+ * Polymer.Path.isPath('foo.bar.baz') // true
+ * Polymer.Path.isPath('foo') // false
+ * ```
+ *
+ * @returns True if the string contained one or more dots
+ */
+ function isPath(path: string): boolean;
+
+
+ /**
+ * Returns the root property name for the given path.
+ *
+ * Example:
+ *
+ * ```
+ * Polymer.Path.root('foo.bar.baz') // 'foo'
+ * Polymer.Path.root('foo') // 'foo'
+ * ```
+ *
+ * @returns Root property name
+ */
+ function root(path: string): string;
+
+
+ /**
+ * Given `base` is `foo.bar`, `foo` is an ancestor, `foo.bar` is not
+ * Returns true if the given path is an ancestor of the base path.
+ *
+ * Example:
+ *
+ * ```
+ * Polymer.Path.isAncestor('foo.bar', 'foo') // true
+ * Polymer.Path.isAncestor('foo.bar', 'foo.bar') // false
+ * Polymer.Path.isAncestor('foo.bar', 'foo.bar.baz') // false
+ * ```
+ *
+ * @returns True if `path` is an ancestor of `base`.
+ */
+ function isAncestor(base: string, path: string): boolean;
+
+
+ /**
+ * Given `base` is `foo.bar`, `foo.bar.baz` is an descendant
+ *
+ * Example:
+ *
+ * ```
+ * Polymer.Path.isDescendant('foo.bar', 'foo.bar.baz') // true
+ * Polymer.Path.isDescendant('foo.bar', 'foo.bar') // false
+ * Polymer.Path.isDescendant('foo.bar', 'foo') // false
+ * ```
+ *
+ * @returns True if `path` is a descendant of `base`.
+ */
+ function isDescendant(base: string, path: string): boolean;
+
+
+ /**
+ * Replaces a previous base path with a new base path, preserving the
+ * remainder of the path.
+ *
+ * User must ensure `path` has a prefix of `base`.
+ *
+ * Example:
+ *
+ * ```
+ * Polymer.Path.translate('foo.bar', 'zot', 'foo.bar.baz') // 'zot.baz'
+ * ```
+ *
+ * @returns Translated string
+ */
+ function translate(base: string, newBase: string, path: string): string;
+
+
+ /**
+ * Converts array-based paths to flattened path. String-based paths
+ * are returned as-is.
+ *
+ * Example:
+ *
+ * ```
+ * Polymer.Path.normalize(['foo.bar', 0, 'baz']) // 'foo.bar.0.baz'
+ * Polymer.Path.normalize('foo.bar.0.baz') // 'foo.bar.0.baz'
+ * ```
+ *
+ * @returns Flattened path
+ */
+ function normalize(path: string|Array<string|number>): string;
+
+
+ /**
+ * Splits a path into an array of property names. Accepts either arrays
+ * of path parts or strings.
+ *
+ * Example:
+ *
+ * ```
+ * Polymer.Path.split(['foo.bar', 0, 'baz']) // ['foo', 'bar', '0', 'baz']
+ * Polymer.Path.split('foo.bar.0.baz') // ['foo', 'bar', '0', 'baz']
+ * ```
+ *
+ * @returns Array of path parts
+ */
+ function split(path: string|Array<string|number>): string[];
+
+
+ /**
+ * Reads a value from a path. If any sub-property in the path is `undefined`,
+ * this method returns `undefined` (will never throw.
+ *
+ * @returns Value at path, or `undefined` if the path could not be
+ * fully dereferenced.
+ */
+ function get(root: object|null, path: string|Array<string|number>, info?: object|null): any;
+
+
+ /**
+ * Sets a value to a path. If any sub-property in the path is `undefined`,
+ * this method will no-op.
+ *
+ * @returns The normalized version of the input path
+ */
+ function set(root: object|null, path: string|Array<string|number>, value: any): string|undefined;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/render-status.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/render-status.d.ts
new file mode 100644
index 00000000000..5d4424fcb2a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/render-status.d.ts
@@ -0,0 +1,45 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/utils/render-status.html
+ */
+
+/// <reference path="boot.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Module for scheduling flushable pre-render and post-render tasks.
+ */
+ namespace RenderStatus {
+
+
+ /**
+ * Enqueues a callback which will be run before the next render, at
+ * `requestAnimationFrame` timing.
+ *
+ * This method is useful for enqueuing work that requires DOM measurement,
+ * since measurement may not be reliable in custom element callbacks before
+ * the first render, as well as for batching measurement tasks in general.
+ *
+ * Tasks in this queue may be flushed by calling `Polymer.RenderStatus.flush()`.
+ */
+ function beforeNextRender(context: any, callback: (...p0: any[]) => void, args?: any[]): void;
+
+
+ /**
+ * Enqueues a callback which will be run after the next render, equivalent
+ * to one task (`setTimeout`) after the next `requestAnimationFrame`.
+ *
+ * This method is useful for tuning the first-render performance of an
+ * element or application by deferring non-critical work until after the
+ * first paint. Typical non-render-critical work may include adding UI
+ * event listeners and aria attributes.
+ */
+ function afterNextRender(context: any, callback: (...p0: any[]) => void, args?: any[]): void;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/resolve-url.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/resolve-url.d.ts
new file mode 100644
index 00000000000..5aae176fffc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/resolve-url.d.ts
@@ -0,0 +1,50 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/utils/resolve-url.html
+ */
+
+/// <reference path="boot.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Module with utilities for resolving relative URL's.
+ */
+ namespace ResolveUrl {
+
+
+ /**
+ * Resolves the given URL against the provided `baseUri'.
+ *
+ * Note that this function performs no resolution for URLs that start
+ * with `/` (absolute URLs) or `#` (hash identifiers). For general purpose
+ * URL resolution, use `window.URL`.
+ *
+ * @returns resolved URL
+ */
+ function resolveUrl(url: string, baseURI?: string|null): string;
+
+
+ /**
+ * Resolves any relative URL's in the given CSS text against the provided
+ * `ownerDocument`'s `baseURI`.
+ *
+ * @returns Processed CSS text with resolved URL's
+ */
+ function resolveCss(cssText: string, baseURI: string): string;
+
+
+ /**
+ * Returns a path from a given `url`. The path includes the trailing
+ * `/` from the url.
+ *
+ * @returns resolved path
+ */
+ function pathFromUrl(url: string): string;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/settings.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/settings.d.ts
new file mode 100644
index 00000000000..b2f90ffe764
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/settings.d.ts
@@ -0,0 +1,40 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/utils/settings.html
+ */
+
+/// <reference path="boot.d.ts" />
+/// <reference path="resolve-url.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Sets the global, legacy settings.
+ */
+ namespace Settings {
+ }
+
+
+ /**
+ * Sets the global rootPath property used by `Polymer.ElementMixin` and
+ * available via `Polymer.rootPath`.
+ */
+ function setRootPath(path: string): void;
+
+
+ /**
+ * Sets the global sanitizeDOMValue available via `Polymer.sanitizeDOMValue`.
+ */
+ function setSanitizeDOMValue(newSanitizeDOMValue: ((p0: any, p1: string, p2: string, p3: Node|null) => any)|undefined): void;
+
+
+ /**
+ * Sets `passiveTouchGestures` globally for all elements using Polymer Gestures.
+ */
+ function setPassiveTouchGestures(usePassive: boolean): void;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/style-gather.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/style-gather.d.ts
new file mode 100644
index 00000000000..842a70d472a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/style-gather.d.ts
@@ -0,0 +1,113 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/utils/style-gather.html
+ */
+
+/// <reference path="resolve-url.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Module with utilities for collection CSS text from `<templates>`, external
+ * stylesheets, and `dom-module`s.
+ */
+ namespace StyleGather {
+
+
+ /**
+ * Returns a list of <style> elements in a space-separated list of `dom-module`s.
+ *
+ * @returns Array of contained <style> elements
+ */
+ function stylesFromModules(moduleIds: string): HTMLStyleElement[];
+
+
+ /**
+ * Returns a list of <style> elements in a given `dom-module`.
+ * Styles in a `dom-module` can come either from `<style>`s within the
+ * first `<template>`, or else from one or more
+ * `<link rel="import" type="css">` links outside the template.
+ *
+ * @returns Array of contained styles.
+ */
+ function stylesFromModule(moduleId: string): HTMLStyleElement[];
+
+
+ /**
+ * Returns the `<style>` elements within a given template.
+ *
+ * @returns Array of styles
+ */
+ function stylesFromTemplate(template: HTMLTemplateElement, baseURI: string): HTMLStyleElement[];
+
+
+ /**
+ * Returns a list of <style> elements from stylesheets loaded via `<link rel="import" type="css">` links within the specified `dom-module`.
+ *
+ * @returns Array of contained styles.
+ */
+ function stylesFromModuleImports(moduleId: string): HTMLStyleElement[];
+
+
+ /**
+ * @returns Array of contained styles
+ */
+ function _stylesFromModuleImports(module: HTMLElement): HTMLStyleElement[];
+
+
+ /**
+ * Returns CSS text of styles in a space-separated list of `dom-module`s.
+ * Note: This method is deprecated, use `stylesFromModules` instead.
+ *
+ * @returns Concatenated CSS content from specified `dom-module`s
+ */
+ function cssFromModules(moduleIds: string): string;
+
+
+ /**
+ * Returns CSS text of styles in a given `dom-module`. CSS in a `dom-module`
+ * can come either from `<style>`s within the first `<template>`, or else
+ * from one or more `<link rel="import" type="css">` links outside the
+ * template.
+ *
+ * Any `<styles>` processed are removed from their original location.
+ * Note: This method is deprecated, use `styleFromModule` instead.
+ *
+ * @returns Concatenated CSS content from specified `dom-module`
+ */
+ function cssFromModule(moduleId: string): string;
+
+
+ /**
+ * Returns CSS text of `<styles>` within a given template.
+ *
+ * Any `<styles>` processed are removed from their original location.
+ * Note: This method is deprecated, use `styleFromTemplate` instead.
+ *
+ * @returns Concatenated CSS content from specified template
+ */
+ function cssFromTemplate(template: HTMLTemplateElement, baseURI: string): string;
+
+
+ /**
+ * Returns CSS text from stylesheets loaded via `<link rel="import" type="css">`
+ * links within the specified `dom-module`.
+ *
+ * Note: This method is deprecated, use `stylesFromModuleImports` instead.
+ *
+ * @returns Concatenated CSS content from links in specified `dom-module`
+ */
+ function cssFromModuleImports(moduleId: string): string;
+
+
+ /**
+ * @returns Concatenated CSS content from links in the dom-module
+ */
+ function _cssFromModuleImports(module: HTMLElement): string;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/templatize.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/templatize.d.ts
new file mode 100644
index 00000000000..df7ae0ce4b6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/templatize.d.ts
@@ -0,0 +1,218 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/utils/templatize.html
+ */
+
+/// <reference path="boot.d.ts" />
+/// <reference path="../mixins/property-effects.d.ts" />
+/// <reference path="../mixins/mutable-data.d.ts" />
+
+declare class TemplateInstanceBase extends
+ Polymer.PropertyEffects(
+ Polymer.Element) {
+
+ /**
+ * Find the parent model of this template instance. The parent model
+ * is either another templatize instance that had option `parentModel: true`,
+ * or else the host element.
+ */
+ readonly parentModel: Polymer.PropertyEffects;
+ _methodHost: Polymer.PropertyEffects;
+
+ /**
+ * Override point for adding custom or simulated event handling.
+ *
+ * @param node Node to add event listener to
+ * @param eventName Name of event
+ * @param handler Listener function to add
+ */
+ _addEventListenerToNode(node: Node, eventName: string, handler: (p0: Event) => void): void;
+
+ /**
+ * Overrides default property-effects implementation to intercept
+ * textContent bindings while children are "hidden" and cache in
+ * private storage for later retrieval.
+ *
+ * @param node The node to set a property on
+ * @param prop The property to set
+ * @param value The value to set
+ */
+ _setUnmanagedPropertyToNode(node: Node, prop: string, value: any): void;
+
+ /**
+ * Forwards a host property to this instance. This method should be
+ * called on instances from the `options.forwardHostProp` callback
+ * to propagate changes of host properties to each instance.
+ *
+ * Note this method enqueues the change, which are flushed as a batch.
+ *
+ * @param prop Property or path name
+ * @param value Value of the property to forward
+ */
+ forwardHostProp(prop: string, value: any): void;
+
+ /**
+ * Shows or hides the template instance top level child elements. For
+ * text nodes, `textContent` is removed while "hidden" and replaced when
+ * "shown."
+ *
+ * @param hide Set to true to hide the children;
+ * set to false to show them.
+ */
+ _showHideChildren(hide: boolean): void;
+
+ /**
+ * Stub of HTMLElement's `dispatchEvent`, so that effects that may
+ * dispatch events safely no-op.
+ *
+ * @param event Event to dispatch
+ * @returns Always true.
+ */
+ dispatchEvent(event: Event|null): boolean;
+}
+
+declare namespace templateInfo {
+
+ class templatizeTemplateClass {
+ }
+}
+
+declare namespace Polymer {
+
+ /**
+ * Module for preparing and stamping instances of templates that utilize
+ * Polymer's data-binding and declarative event listener features.
+ *
+ * Example:
+ *
+ * // Get a template from somewhere, e.g. light DOM
+ * let template = this.querySelector('template');
+ * // Prepare the template
+ * let TemplateClass = Polymer.Templatize.templatize(template);
+ * // Instance the template with an initial data model
+ * let instance = new TemplateClass({myProp: 'initial'});
+ * // Insert the instance's DOM somewhere, e.g. element's shadow DOM
+ * this.shadowRoot.appendChild(instance.root);
+ * // Changing a property on the instance will propagate to bindings
+ * // in the template
+ * instance.myProp = 'new value';
+ *
+ * The `options` dictionary passed to `templatize` allows for customizing
+ * features of the generated template class, including how outer-scope host
+ * properties should be forwarded into template instances, how any instance
+ * properties added into the template's scope should be notified out to
+ * the host, and whether the instance should be decorated as a "parent model"
+ * of any event handlers.
+ *
+ * // Customize property forwarding and event model decoration
+ * let TemplateClass = Polymer.Templatize.templatize(template, this, {
+ * parentModel: true,
+ * forwardHostProp(property, value) {...},
+ * instanceProps: {...},
+ * notifyInstanceProp(instance, property, value) {...},
+ * });
+ */
+ namespace Templatize {
+
+
+ /**
+ * Returns an anonymous `Polymer.PropertyEffects` class bound to the
+ * `<template>` provided. Instancing the class will result in the
+ * template being stamped into a document fragment stored as the instance's
+ * `root` property, after which it can be appended to the DOM.
+ *
+ * Templates may utilize all Polymer data-binding features as well as
+ * declarative event listeners. Event listeners and inline computing
+ * functions in the template will be called on the host of the template.
+ *
+ * The constructor returned takes a single argument dictionary of initial
+ * property values to propagate into template bindings. Additionally
+ * host properties can be forwarded in, and instance properties can be
+ * notified out by providing optional callbacks in the `options` dictionary.
+ *
+ * Valid configuration in `options` are as follows:
+ *
+ * - `forwardHostProp(property, value)`: Called when a property referenced
+ * in the template changed on the template's host. As this library does
+ * not retain references to templates instanced by the user, it is the
+ * templatize owner's responsibility to forward host property changes into
+ * user-stamped instances. The `instance.forwardHostProp(property, value)`
+ * method on the generated class should be called to forward host
+ * properties into the template to prevent unnecessary property-changed
+ * notifications. Any properties referenced in the template that are not
+ * defined in `instanceProps` will be notified up to the template's host
+ * automatically.
+ * - `instanceProps`: Dictionary of property names that will be added
+ * to the instance by the templatize owner. These properties shadow any
+ * host properties, and changes within the template to these properties
+ * will result in `notifyInstanceProp` being called.
+ * - `mutableData`: When `true`, the generated class will skip strict
+ * dirty-checking for objects and arrays (always consider them to be
+ * "dirty").
+ * - `notifyInstanceProp(instance, property, value)`: Called when
+ * an instance property changes. Users may choose to call `notifyPath`
+ * on e.g. the owner to notify the change.
+ * - `parentModel`: When `true`, events handled by declarative event listeners
+ * (`on-event="handler"`) will be decorated with a `model` property pointing
+ * to the template instance that stamped it. It will also be returned
+ * from `instance.parentModel` in cases where template instance nesting
+ * causes an inner model to shadow an outer model.
+ *
+ * All callbacks are called bound to the `owner`. Any context
+ * needed for the callbacks (such as references to `instances` stamped)
+ * should be stored on the `owner` such that they can be retrieved via
+ * `this`.
+ *
+ * When `options.forwardHostProp` is declared as an option, any properties
+ * referenced in the template will be automatically forwarded from the host of
+ * the `<template>` to instances, with the exception of any properties listed in
+ * the `options.instanceProps` object. `instanceProps` are assumed to be
+ * managed by the owner of the instances, either passed into the constructor
+ * or set after the fact. Note, any properties passed into the constructor will
+ * always be set to the instance (regardless of whether they would normally
+ * be forwarded from the host).
+ *
+ * Note that `templatize()` can be run only once for a given `<template>`.
+ * Further calls will result in an error. Also, there is a special
+ * behavior if the template was duplicated through a mechanism such as
+ * `<dom-repeat>` or `<test-fixture>`. In this case, all calls to
+ * `templatize()` return the same class for all duplicates of a template.
+ * The class returned from `templatize()` is generated only once using
+ * the `options` from the first call. This means that any `options`
+ * provided to subsequent calls will be ignored. Therefore, it is very
+ * important not to close over any variables inside the callbacks. Also,
+ * arrow functions must be avoided because they bind the outer `this`.
+ * Inside the callbacks, any contextual information can be accessed
+ * through `this`, which points to the `owner`.
+ *
+ * @returns Generated class bound to the template
+ * provided
+ */
+ function templatize(template: HTMLTemplateElement, owner?: Polymer.PropertyEffects|null, options?: object|null): {new(): TemplateInstanceBase};
+
+
+ /**
+ * Returns the template "model" associated with a given element, which
+ * serves as the binding scope for the template instance the element is
+ * contained in. A template model is an instance of
+ * `TemplateInstanceBase`, and should be used to manipulate data
+ * associated with this template instance.
+ *
+ * Example:
+ *
+ * let model = modelForElement(el);
+ * if (model.index < 10) {
+ * model.set('item.checked', true);
+ * }
+ *
+ * @returns Template instance representing the
+ * binding scope for the element
+ */
+ function modelForElement(template: HTMLTemplateElement|null, node?: Node|null): TemplateInstanceBase|null;
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/unresolved.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/unresolved.d.ts
new file mode 100644
index 00000000000..a46e651d507
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/lib/utils/unresolved.d.ts
@@ -0,0 +1,10 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * lib/utils/unresolved.html
+ */
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/polymer-element.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/polymer-element.d.ts
new file mode 100644
index 00000000000..2bb74590d2f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/polymer-element.d.ts
@@ -0,0 +1,25 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * polymer-element.html
+ */
+
+/// <reference path="lib/mixins/element-mixin.d.ts" />
+/// <reference path="lib/utils/html-tag.d.ts" />
+
+declare namespace Polymer {
+
+ /**
+ * Base class that provides the core API for Polymer's meta-programming
+ * features including template stamping, data-binding, attribute deserialization,
+ * and property change observation.
+ */
+ class Element extends
+ Polymer.ElementMixin(
+ HTMLElement) {
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/polymer.d.ts b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/polymer.d.ts
new file mode 100644
index 00000000000..feb2c4aa2d9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/types/polymer.d.ts
@@ -0,0 +1,21 @@
+/**
+ * DO NOT EDIT
+ *
+ * This file was automatically generated by
+ * https://github.com/Polymer/gen-typescript-declarations
+ *
+ * To modify these typings, edit the source file(s):
+ * polymer.html
+ */
+
+/// <reference path="lib/legacy/legacy-element-mixin.d.ts" />
+/// <reference path="lib/legacy/polymer-fn.d.ts" />
+/// <reference path="lib/legacy/templatizer-behavior.d.ts" />
+/// <reference path="lib/elements/dom-bind.d.ts" />
+/// <reference path="lib/elements/dom-repeat.d.ts" />
+/// <reference path="lib/elements/dom-if.d.ts" />
+/// <reference path="lib/elements/array-selector.d.ts" />
+/// <reference path="lib/elements/custom-style.d.ts" />
+/// <reference path="lib/legacy/mutable-data-behavior.d.ts" />
+/// <reference path="lib/utils/html-tag.d.ts" />
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/wct.conf.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/wct.conf.json
new file mode 100644
index 00000000000..5b315d73625
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/wct.conf.json
@@ -0,0 +1,20 @@
+{
+ "suites": ["test/runner.html"],
+ "environmentImports": [
+ "test-fixture/test-fixture.html"
+ ],
+ "plugins": {
+ "local": {
+ "browserOptions": {
+ "chrome": [
+ "headless",
+ "disable-gpu",
+ "no-sandbox"
+ ],
+ "firefox": [
+ "-headless"
+ ]
+ }
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/.bower.json
new file mode 100644
index 00000000000..34fd0c3c8b1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/.bower.json
@@ -0,0 +1,46 @@
+{
+ "name": "shadycss",
+ "main": "scoping-shim.min.js",
+ "description": "Styling helpers for ShadyDOM",
+ "authors": [
+ "The Polymer Project Authors (https://polymer.github.io/AUTHORS.txt)"
+ ],
+ "license": "BSD-3-Clause",
+ "keywords": [
+ "shady-css",
+ "shadycss",
+ "shadow-css",
+ "shadowcss",
+ "web-components",
+ "webcomponents",
+ "polyfill",
+ "shim"
+ ],
+ "homepage": "https://webcomponents.org/polyfills",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests"
+ ],
+ "devDependencies": {
+ "web-component-tester": "^6",
+ "es6-promise": "stefanpenner/es6-promise#~4.1.0",
+ "template": "webcomponents/template#^1.0.0",
+ "html-imports": "webcomponents/html-imports#^1.0.0",
+ "custom-elements": "webcomponents/custom-elements#^1.0.0",
+ "shadydom": "webcomponents/shadydom#^1.0.0",
+ "webcomponents-platform": "webcomponents/webcomponents-platform#^1.0.0"
+ },
+ "version": "1.2.1",
+ "_release": "1.2.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v1.2.1",
+ "commit": "2aea216187280d2db8f50629905810b3388cbe49"
+ },
+ "_source": "https://github.com/webcomponents/shadycss.git",
+ "_target": "^v1.1.0",
+ "_originalSource": "webcomponents/shadycss"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/README.md
new file mode 100644
index 00000000000..c873ee095fa
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/README.md
@@ -0,0 +1,400 @@
+# ShadyCSS
+
+ShadyCSS provides a library to simulate ShadowDOM style encapsulation (ScopingShim), a shim for the proposed CSS mixin `@apply` syntax (ApplyShim), and a library to integrate document-level stylesheets with both of the former libraries (CustomStyleInterface).
+
+## Requirements
+ShadyCSS requires support for the `<template>` element, ShadowDOM, MutationObserver, Promise, and Object.assign
+
+## Loading
+
+ShadyCSS can be used by loading the ScopingShim, ApplyShim, CustomStyleInterface, or any combination of those.
+
+The most-supported loading order is:
+1. ScopingShim
+1. ApplyShim
+1. CustomStyleInterface
+
+All libraries will expose an object on `window` named `ShadyCSS` with the following interface:
+
+```js
+ShadyCSS = {
+ prepareTemplate(templateElement, elementName, elementExtension){},
+ styleElement(element){},
+ styleSubtree(element, overrideProperties){},
+ styleDocument(overrideProperties){},
+ getComputedStyleValue(element, propertyName){
+ return // style value for property name on element
+ },
+ nativeCss: Boolean,
+ nativeShadow: Boolean
+}
+```
+
+## About ScopingShim
+
+ScopingShim provides simulated ShadyDOM style encapsulation, and a shim for CSS Custom Properties.
+
+ScopingShim works by rewriting style contents and transforming selectors to enforce scoping.
+Additionally, if CSS Custom Properties is not detected, ScopingShim will replace CSS Custom Property usage with realized values.
+
+### Example:
+Here's an example of a custom element when Scoping Shim is not needed.
+
+```html
+<my-element>
+ <!-- shadow-root -->
+ <style>
+ :host {
+ display: block;
+ }
+ #container slot::slotted(*) {
+ color: gray;
+ }
+ #foo {
+ color: black;
+ }
+ </style>
+ <div id="foo">Shadow</div>
+ <div id="container">
+ <slot>
+ <!-- span distributed here -->
+ </slot>
+ </div>
+ <!-- /shadow-root -->
+ <span>Light</span>
+</my-element>
+```
+
+becomes:
+
+```html
+<style scope="my-element">
+my-element {
+ display: block;
+}
+#container.my-element > * {
+ color: gray;
+}
+#foo.my-element {
+ color: black;
+}
+</style>
+<my-element>
+<div id="foo">Shadow</div>
+<div id="container">
+ <span>Light</span>
+</div>
+</my-element>
+```
+
+## About ApplyShim
+
+ApplyShim provides a shim for the `@apply` syntax proposed at https://tabatkins.github.io/specs/css-apply-rule/, which expands the definition CSS Custom Properties to include objects that can be applied as a block.
+
+This is done by transforming the block definition into a set of CSS Custom Properties, and replacing uses of `@apply` with consumption of those custom properties.
+
+### Status:
+
+The `@apply` proposal has been abandoned in favor of the ::part/::theme [Shadow Parts spec](https://tabatkins.github.io/specs/css-shadow-parts/). Therefore, the ApplyShim library is deprecated and provided only for backwards compatibility. Support going forward will be limited to critical bug fixes.
+
+### Known Issues:
+
+* Mixin properties cannot be modified at runtime.
+* Nested mixins are not supported.
+* Shorthand properties are not expanded and may conflict with more explicit properties. Whenever shorthand notations are used in conjunction with their expanded forms in `@apply`, depending in the order of usage of the mixins, properties can be overridden. This means that using both `background-color: green;` and `background: red;` in two separate CSS selectors
+ can result in `background-color: transparent` in the selector that `background: red;` is specified.
+
+ ```css
+ #nonexistent {
+ --my-mixin: {
+ background: red;
+ }
+ }
+ ```
+ with an element style definition of
+ ```css
+ :host {
+ display: block;
+ background-color: green;
+ @apply(--my-mixin);
+ }
+ ```
+ results in the background being `transparent`, as an empty `background` definition replaces
+ the `@apply` definition.
+
+ For this reason, we recommend avoiding shorthand properties.
+
+### Example:
+
+Here we define a block called `--mixin` at the document level, and apply that block to `my-element` somewhere in the page.
+
+```css
+html {
+ --mixin: {
+ border: 2px solid black;
+ background-color: green;
+ }
+}
+
+my-element {
+ border: 1px dotted orange;
+ @apply --mixin;
+}
+```
+
+becomes:
+
+```css
+html {
+ --mixin_-_border: 2px solid black;
+ --mixin_-_background-color: green;
+}
+
+my-element {
+ border: var(--mixin_-_border, 1px dotted orange);
+ background-color: var(--mixin_-_background-color);
+}
+```
+
+## About CustomStyleInterface
+
+CustomStyleInterface provides API to process `<style>` elements that are not inside of
+ShadowRoots, and simulate upper-boundary style scoping for ShadyDOM.
+
+To add document-level styles to ShadyCSS, one can call `CustomStyleInterface.addCustomStyle(styleElement)` or `CustomStyleInterface.addCustomStyle({getStyle: () => styleElement})`
+
+An example usage of the document-level styling api can be found in `examples/document-style-lib.js`, and another example that uses a custom element wrapper can be found in `examples/custom-style-element.js`
+
+### Example:
+
+```html
+<style class="document-style">
+html {
+ --content-color: brown;
+}
+</style>
+<my-element>This text will be brown!</my-element>
+<script>
+CustomStyleInterface.addCustomStyle(document.querySelector('style.document-style'));
+</script>
+```
+
+Another example with a wrapper `<custom-style>` element
+
+```html
+<custom-style>
+ <style>
+ html {
+ --content-color: brown;
+ }
+ </style>
+</custom-style>
+<script>
+class CustomStyle extends HTMLElement {
+ constructor() {
+ CustomStyleInterface.addCustomStyle(this);
+ }
+ getStyle() {
+ return this.querySelector('style');
+ }
+}
+</script>
+<my-element>This this text will be brown!</my-element>
+```
+
+Another example with a function that produces style elements
+
+```html
+<my-element>This this text will be brown!</my-element>
+<script>
+CustomStyleInterface.addCustomStyle({
+ getStyle() {
+ const s = document.createElement('style');
+ s.textContent = 'html{ --content-color: brown }';
+ return s;
+ }
+});
+</script>
+```
+
+## Usage
+
+To use ShadyCSS:
+
+1. First, call `ShadyCSS.prepareTemplate(template, name)` on a
+`<template>` element that will be imported into a `shadowRoot`.
+
+2. When the element instance is connected, call `ShadyCSS.styleElement(element)`
+
+3. Create and stamp the element's shadowRoot
+
+4. Whenever dynamic updates are required, call `ShadyCSS.styleSubtree(element)`.
+
+5. If a styling change is made that may affect the whole document, call
+`ShadyCSS.styleDocument()`.
+
+The following example uses ShadyCSS and ShadyDOM to define a custom element.
+
+```html
+<template id="myElementTemplate">
+ <style>
+ :host {
+ display: block;
+ padding: 8px;
+ }
+
+ #content {
+ background-color: var(--content-color);
+ }
+
+ .slot-container ::slotted(*) {
+ border: 1px solid steelblue;
+ margin: 4px;
+ }
+ </style>
+ <div id="content">Content</div>
+ <div class="slot-container">
+ <slot></slot>
+ </div>
+</template>
+<script>
+ ShadyCSS.prepareTemplate(myElementTemplate, 'my-element');
+ class MyElement extends HTMLElement {
+ connectedCallback() {
+ ShadyCSS.styleElement(this);
+ if (!this.shadowRoot) {
+ this.attachShadow({mode: 'open'});
+ this.shadowRoot.appendChild(
+ document.importNode(myElementTemplate.content, true));
+ }
+ }
+ }
+
+ customElements.define('my-element', MyElement);
+</script>
+```
+
+## Type Extension elements
+
+ShadyCSS can also be used with type extension elements by supplying the base
+element name to `prepareTemplate` as a third argument.
+
+### Example
+
+```html
+<template id="myElementTemplate">
+ <style>
+ :host {
+ display: block;
+ padding: 8px;
+ }
+
+ #content {
+ background-color: var(--content-color);
+ }
+
+ .slot-container ::slotted(*) {
+ border: 1px solid steelblue;
+ margin: 4px;
+ }
+ </style>
+ <div id="content">Content</div>
+ <div class="slot-container">
+ <slot></slot>
+ </div>
+</template>
+<script>
+ ShadyCSS.prepareTemplate(myElementTemplate, 'my-element', 'div');
+ class MyElement extends HTMLDivElement {
+ connectedCallback() {
+ ShadyCSS.styleElement(this);
+ if (!this.shadowRoot) {
+ this.attachShadow({mode: 'open'});
+ this.shadowRoot.appendChild(
+ document.importNode(myElementTemplate.content, true));
+ }
+ }
+ }
+
+ customElements.define('my-element', MyElement, {extends: 'div'});
+</script>
+```
+
+## Imperative values for Custom properties
+
+To set the value of a CSS Custom Property imperatively, `ShadyCSS.styleSubtree`
+and `ShadyCSS.styleDocument` support an additional argument of an object mapping
+variable name to value.
+
+When using ApplyShim, defining new mixins or new values for current mixins imperatively is not
+supported.
+
+### Example
+```html
+<my-element id="a">Text</my-element>
+<my-element>Text</my-element>
+<script>
+let el = document.querySelector('my-element#a');
+// Set the color of all my-element instances to 'green'
+ShadyCSS.styleDocument({'--content-color' : 'green'});
+// Set the color my-element#a's text to 'red'
+ShadyCSS.styleSubtree(el, {'--content-color' : 'red'});
+</script>
+```
+
+## Limitations
+
+### Selector scoping
+
+You must have a selector for ascendants of the `<slot>` element when using the `::slotted`
+pseudo-element.
+
+You cannot use any selector for the `<slot>` element. Rules like `.foo .bar::slotted(*)` are not supported.
+
+### Custom properties and `@apply`
+
+Dynamic changes are not automatically applied. If elements change such that they
+conditionally match selectors they did not previously, `ShadyCSS.styleDocument()`
+must be called.
+
+For a given element's shadowRoot, only 1 value is allowed per custom properties.
+Properties cannot change from parent to child as they can under native custom
+properties; they can only change when a shadowRoot boundary is crossed.
+
+To receive a custom property, an element must directly match a selector that
+defines the property in its host's stylesheet.
+
+### `<custom-style>` Flash of unstyled content
+
+If `ShadyCSS.applyStyle` is never called, `<custom-style>` elements will process
+after HTML Imports have loaded, after the document loads, or after the next paint.
+This means that there may be a flash of unstyled content on the first load.
+
+### Mixins do not cascade throught `<slot>`
+
+Crawling the DOM and updating styles is very expensive, and we found that trying to
+update mixins through `<slot>` insertion points to be too expensive to justify for both
+polyfilled CSS Mixins and polyfilled CSS Custom Properties.
+
+### External stylesheets not currently supported
+
+External stylesheets loaded via `<link rel="stylesheet">` within a shadow root or
+`@import` syntax inside a shadow root's stylesheet are not currently shimmed by
+the polyfill. This is mainly due to the fact that shimming them would require
+a fetch of the stylesheet text that is async cannot be easily coordinated with
+the upgrade timing of custom elements using them, making it impossible to avoid
+"flash of unstyled content" when running on polyfill.
+
+### Document level styling is not scoped by default
+
+ShadyCSS mimics the behavior of shadow dom, but it is not able to prevent document
+level styling to affect elements inside a shady dom. Global styles defined in
+`index.html` or any styles not processed by ShadyCSS will affect all elements on the page.
+
+To scope document level styling, the style must be wrapped in the `<custom-style>` element
+found in Polymer, or use the `CustomStyleInterface` library to modify document level styles.
+
+### Dynamically created styles are not supported
+
+ShadyCSS works by processing a template for a given custom element class. Only the style
+elements present in that template will be scoped for the custom element's ShadowRoot.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/apply-shim.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/apply-shim.html
new file mode 100644
index 00000000000..d344ec3721b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/apply-shim.html
@@ -0,0 +1,10 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<script src="apply-shim.min.js"></script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/apply-shim.min.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/apply-shim.min.js
new file mode 100644
index 00000000000..8bfb6328a3b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/apply-shim.min.js
@@ -0,0 +1,30 @@
+(function(){/*
+
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+'use strict';var k={};function n(){this.end=this.start=0;this.rules=this.parent=this.previous=null;this.cssText=this.parsedCssText="";this.atRule=!1;this.type=0;this.parsedSelector=this.selector=this.keyframesName=""}
+function p(a){a=a.replace(r,"").replace(aa,"");var c=t,b=a,d=new n;d.start=0;d.end=b.length;for(var e=d,f=0,h=b.length;f<h;f++)if("{"===b[f]){e.rules||(e.rules=[]);var g=e,m=g.rules[g.rules.length-1]||null;e=new n;e.start=f+1;e.parent=g;e.previous=m;g.rules.push(e)}else"}"===b[f]&&(e.end=f+1,e=e.parent||d);return c(d,a)}
+function t(a,c){var b=c.substring(a.start,a.end-1);a.parsedCssText=a.cssText=b.trim();a.parent&&(b=c.substring(a.previous?a.previous.end:a.parent.start,a.start-1),b=ba(b),b=b.replace(u," "),b=b.substring(b.lastIndexOf(";")+1),b=a.parsedSelector=a.selector=b.trim(),a.atRule=0===b.indexOf("@"),a.atRule?0===b.indexOf("@media")?a.type=v:b.match(ca)&&(a.type=x,a.keyframesName=a.selector.split(u).pop()):a.type=0===b.indexOf("--")?y:z);if(b=a.rules)for(var d=0,e=b.length,f;d<e&&(f=b[d]);d++)t(f,c);return a}
+function ba(a){return a.replace(/\\([0-9a-f]{1,6})\s/gi,function(a,b){a=b;for(b=6-a.length;b--;)a="0"+a;return"\\"+a})}
+function A(a,c,b){b=void 0===b?"":b;var d="";if(a.cssText||a.rules){var e=a.rules,f;if(f=e)f=e[0],f=!(f&&f.selector&&0===f.selector.indexOf("--"));if(f){f=0;for(var h=e.length,g;f<h&&(g=e[f]);f++)d=A(g,c,d)}else c?c=a.cssText:(c=a.cssText,c=c.replace(da,"").replace(ea,""),c=c.replace(fa,"").replace(ha,"")),(d=c.trim())&&(d=" "+d+"\n")}d&&(a.selector&&(b+=a.selector+" {\n"),b+=d,a.selector&&(b+="}\n\n"));return b}
+var z=1,x=7,v=4,y=1E3,r=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,aa=/@import[^;]*;/gim,da=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,ea=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,fa=/@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,ha=/[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,ca=/^@[^\s]*keyframes/,u=/\s+/g;var ia=Promise.resolve();function ja(a){if(a=k[a])a._applyShimCurrentVersion=a._applyShimCurrentVersion||0,a._applyShimValidatingVersion=a._applyShimValidatingVersion||0,a._applyShimNextVersion=(a._applyShimNextVersion||0)+1}function B(a){return a._applyShimCurrentVersion===a._applyShimNextVersion}function ka(a){a._applyShimValidatingVersion=a._applyShimNextVersion;a.b||(a.b=!0,ia.then(function(){a._applyShimCurrentVersion=a._applyShimNextVersion;a.b=!1}))};var C=!(window.ShadyDOM&&window.ShadyDOM.inUse),D;function F(a){D=a&&a.shimcssproperties?!1:C||!(navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/)||!window.CSS||!CSS.supports||!CSS.supports("box-shadow","0 0 0 var(--foo)"))}window.ShadyCSS&&void 0!==window.ShadyCSS.nativeCss?D=window.ShadyCSS.nativeCss:window.ShadyCSS?(F(window.ShadyCSS),window.ShadyCSS=void 0):F(window.WebComponents&&window.WebComponents.flags);var G=D;var H=/(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};{])+)|\{([^}]*)\}(?:(?=[;\s}])|$))/gi,I=/(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi,la=/@media\s(.*)/;var J=new Set;function K(a){if(!a)return"";"string"===typeof a&&(a=p(a));return A(a,G)}function L(a){!a.__cssRules&&a.textContent&&(a.__cssRules=p(a.textContent));return a.__cssRules||null}function M(a,c,b,d){if(a){var e=!1,f=a.type;if(d&&f===v){var h=a.selector.match(la);h&&(window.matchMedia(h[1]).matches||(e=!0))}f===z?c(a):b&&f===x?b(a):f===y&&(e=!0);if((a=a.rules)&&!e){e=0;f=a.length;for(var g;e<f&&(g=a[e]);e++)M(g,c,b,d)}}}
+function N(a,c){var b=a.indexOf("var(");if(-1===b)return c(a,"","","");a:{var d=0;var e=b+3;for(var f=a.length;e<f;e++)if("("===a[e])d++;else if(")"===a[e]&&0===--d)break a;e=-1}d=a.substring(b+4,e);b=a.substring(0,b);a=N(a.substring(e+1),c);e=d.indexOf(",");return-1===e?c(b,d.trim(),"",a):c(b,d.substring(0,e).trim(),d.substring(e+1).trim(),a)};var ma=/;\s*/m,na=/^\s*(initial)|(inherit)\s*$/,O=/\s*!important/;function P(){this.a={}}P.prototype.set=function(a,c){a=a.trim();this.a[a]={h:c,i:{}}};P.prototype.get=function(a){a=a.trim();return this.a[a]||null};var Q=null;function R(){this.b=this.c=null;this.a=new P}R.prototype.o=function(a){a=I.test(a)||H.test(a);I.lastIndex=0;H.lastIndex=0;return a};
+R.prototype.m=function(a,c){if(void 0===a.a){var b=[];for(var d=a.content.querySelectorAll("style"),e=0;e<d.length;e++){var f=d[e];if(f.hasAttribute("shady-unscoped")){if(!C){var h=f.textContent;J.has(h)||(J.add(h),h=f.cloneNode(!0),document.head.appendChild(h));f.parentNode.removeChild(f)}}else b.push(f.textContent),f.parentNode.removeChild(f)}(b=b.join("").trim())?(d=document.createElement("style"),d.textContent=b,a.content.insertBefore(d,a.content.firstChild),b=d):b=null;a.a=b}return(a=a.a)?this.j(a,
+c):null};R.prototype.j=function(a,c){c=void 0===c?"":c;var b=L(a);this.l(b,c);a.textContent=K(b);return b};R.prototype.f=function(a){var c=this,b=L(a);M(b,function(a){":root"===a.selector&&(a.selector="html");c.g(a)});a.textContent=K(b);return b};R.prototype.l=function(a,c){var b=this;this.c=c;M(a,function(a){b.g(a)});this.c=null};R.prototype.g=function(a){a.cssText=oa(this,a.parsedCssText);":root"===a.selector&&(a.selector=":host > *")};
+function oa(a,c){c=c.replace(H,function(b,c,e,f){return pa(a,b,c,e,f)});return S(a,c)}
+function S(a,c){for(var b;b=I.exec(c);){var d=b[0],e=b[1];b=b.index;var f=c.slice(0,b+d.indexOf("@apply"));c=c.slice(b+d.length);var h=T(a,f);d=void 0;var g=a;e=e.replace(ma,"");var m=[];var l=g.a.get(e);l||(g.a.set(e,{}),l=g.a.get(e));if(l){g.c&&(l.i[g.c]=!0);var q=l.h;for(d in q)g=h&&h[d],l=[d,": var(",e,"_-_",d],g&&l.push(",",g.replace(O,"")),l.push(")"),O.test(q[d])&&l.push(" !important"),m.push(l.join(""))}d=m.join("; ");c=""+f+d+c;I.lastIndex=b+d.length}return c}
+function T(a,c){c=c.split(";");for(var b,d,e={},f=0,h;f<c.length;f++)if(b=c[f])if(h=b.split(":"),1<h.length){b=h[0].trim();var g=a;d=b;h=h.slice(1).join(":");var m=na.exec(h);m&&(m[1]?(g.b||(g.b=document.createElement("meta"),g.b.setAttribute("apply-shim-measure",""),g.b.style.all="initial",document.head.appendChild(g.b)),d=window.getComputedStyle(g.b).getPropertyValue(d)):d="apply-shim-inherit",h=d);d=h;e[b]=d}return e}function qa(a,c){if(Q)for(var b in c.i)b!==a.c&&Q(b)}
+function pa(a,c,b,d,e){d&&N(d,function(c,b){b&&a.a.get(b)&&(e="@apply "+b+";")});if(!e)return c;var f=S(a,""+e),h=c.slice(0,c.indexOf("--")),g=f=T(a,f),m=a.a.get(b),l=m&&m.h;l?g=Object.assign(Object.create(l),f):a.a.set(b,g);var q=[],w,X=!1;for(w in g){var E=f[w];void 0===E&&(E="initial");!l||w in l||(X=!0);q.push(""+b+"_-_"+w+": "+E)}X&&qa(a,m);m&&(m.h=g);d&&(h=c+";"+h);return""+h+q.join("; ")+";"}R.prototype.detectMixin=R.prototype.o;R.prototype.transformStyle=R.prototype.j;
+R.prototype.transformCustomStyle=R.prototype.f;R.prototype.transformRules=R.prototype.l;R.prototype.transformRule=R.prototype.g;R.prototype.transformTemplate=R.prototype.m;R.prototype._separator="_-_";Object.defineProperty(R.prototype,"invalidCallback",{get:function(){return Q},set:function(a){Q=a}});var U=new R;function V(){this.a=null;U.invalidCallback=ja}function W(a){a.a||(a.a=window.ShadyCSS.CustomStyleInterface,a.a&&(a.a.transformCallback=function(a){U.f(a)},a.a.validateCallback=function(){requestAnimationFrame(function(){a.a.enqueued&&a.flushCustomStyles()})}))}V.prototype.prepareTemplate=function(a,c){W(this);k[c]=a;c=U.m(a,c);a._styleAst=c};
+V.prototype.flushCustomStyles=function(){W(this);if(this.a){var a=this.a.processStyles();if(this.a.enqueued){for(var c=0;c<a.length;c++){var b=this.a.getStyleForCustomStyle(a[c]);b&&U.f(b)}this.a.enqueued=!1}}};
+V.prototype.styleSubtree=function(a,c){W(this);if(c)for(var b in c)null===b?a.style.removeProperty(b):a.style.setProperty(b,c[b]);if(a.shadowRoot)for(this.styleElement(a),a=a.shadowRoot.children||a.shadowRoot.childNodes,c=0;c<a.length;c++)this.styleSubtree(a[c]);else for(a=a.children||a.childNodes,c=0;c<a.length;c++)this.styleSubtree(a[c])};
+V.prototype.styleElement=function(a){W(this);var c=a.localName,b;c?-1<c.indexOf("-")?b=c:b=a.getAttribute&&a.getAttribute("is")||"":b=a.is;if((c=k[b])&&!B(c)){if(B(c)||c._applyShimValidatingVersion!==c._applyShimNextVersion)this.prepareTemplate(c,b),ka(c);if(a=a.shadowRoot)if(a=a.querySelector("style"))a.__cssRules=c._styleAst,a.textContent=K(c._styleAst)}};V.prototype.styleDocument=function(a){W(this);this.styleSubtree(document.body,a)};
+if(!window.ShadyCSS||!window.ShadyCSS.ScopingShim){var Y=new V,Z=window.ShadyCSS&&window.ShadyCSS.CustomStyleInterface;window.ShadyCSS={prepareTemplate:function(a,c){Y.flushCustomStyles();Y.prepareTemplate(a,c)},styleSubtree:function(a,c){Y.flushCustomStyles();Y.styleSubtree(a,c)},styleElement:function(a){Y.flushCustomStyles();Y.styleElement(a)},styleDocument:function(a){Y.flushCustomStyles();Y.styleDocument(a)},getComputedStyleValue:function(a,c){return(a=window.getComputedStyle(a).getPropertyValue(c))?
+a.trim():""},flushCustomStyles:function(){Y.flushCustomStyles()},nativeCss:G,nativeShadow:C};Z&&(window.ShadyCSS.CustomStyleInterface=Z)}window.ShadyCSS.ApplyShim=U;}).call(this);
+
+//# sourceMappingURL=apply-shim.min.js.map
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/apply-shim.min.js.map b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/apply-shim.min.js.map
new file mode 100644
index 00000000000..9117e961d31
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/apply-shim.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["src/template-map.js","src/css-parse.js","src/apply-shim-utils.js","src/style-settings.js","src/common-regex.js","src/unscoped-style-handler.js","src/style-util.js","src/apply-shim.js","src/common-utils.js","entrypoints/apply-shim.js"],"names":["templateMap","constructor","StyleNode","parse","text","replace","RX$$module$src$css_parse.comments","RX$$module$src$css_parse.port","parseCss","root","length","n","i","l","OPEN_BRACE","p","previous","push","CLOSE_BRACE","node","t","substring","trim","ss","_expandUnicodeEscapes","RX$$module$src$css_parse.multipleSpaces","lastIndexOf","s","indexOf","AT_START","MEDIA_START","types$$module$src$css_parse.MEDIA_RULE","match","RX$$module$src$css_parse.keyframesRule","types$$module$src$css_parse.KEYFRAMES_RULE","split","pop","VAR_START","types$$module$src$css_parse.MIXIN_RULE","types$$module$src$css_parse.STYLE_RULE","r$","r","code","repeat","stringify","preserveProperties","cssText","rules","RX$$module$src$css_parse.customProp","RX$$module$src$css_parse.mixinProp","RX$$module$src$css_parse.mixinApply","RX$$module$src$css_parse.varApply","STYLE_RULE","KEYFRAMES_RULE","MEDIA_RULE","MIXIN_RULE","comments","port","customProp","mixinProp","mixinApply","varApply","keyframesRule","multipleSpaces","promise","Promise","resolve","invalidate","elementName","template","templateIsValid","startValidatingTemplate","_validating","then","nativeShadow","window","nativeCssVariables_","calcCssVariables","settings","navigator","userAgent","CSS","supports","ShadyCSS","undefined","nativeCss","nativeCssVariables","VAR_ASSIGN","MIXIN_MATCH","MEDIA_MATCH","styleTextSet","Set","toCssText","rulesForStyle","style","textContent","forEachRule","styleRuleCallback","keyframesRuleCallback","onlyActiveRules","skipRules","type","matchMedia","matches","processVariableAndFallback","str","callback","start","level","inner","end","prefix","suffix","comma","value","fallback","APPLY_NAME_CLEAN","INITIAL_INHERIT","IMPORTANT","MixinMap","_map","set","name","props","properties","dependants","get","invalidCallback","ApplyShim","_measureElement","_currentElement","detectMixin","has","test","lastIndex","transformTemplate","_gatheredStyle","styleTextParts","styles","content","querySelectorAll","hasAttribute","scopingAttribute","add","newStyle","cloneNode","document","head","appendChild","parentNode","removeChild","styleText","join","createElement","insertBefore","firstChild","transformStyle","ast","transformRules","transformCustomStyle","rule","transformRule","transformCssText","matchText","propertyName","valueProperty","valueMixin","_produceCssProperties","_consumeCssProperties","m","exec","mixinName","idx","index","textBeforeApply","slice","textAfterApply","defaults","_cssTextToMap","_atApplyToCssProperties","vars","mixinEntry","f","fallbacks","parts","MIXIN_VAR_SEP","replacement","property","out","sp","_replaceInitialOrInherit","setAttribute","all","getComputedStyle","getPropertyValue","_invalidateMixinEntry","mixinAsProperties","combinedProps","mixinValues","oldProps","Object","assign","create","needToInvalidate","v","prototype","defineProperty","cb","applyShim","ApplyShimInterface","customStyleInterface","ensure","CustomStyleInterface","requestAnimationFrame","flushCustomStyles","prepareTemplate","cs","styleSubtree","element","removeProperty","setProperty","shadowRoot","styleElement","shadowChildren","children","childNodes","localName","is","getAttribute","querySelector","styleDocument","body","ScopingShim","applyShimInterface","getComputedStyleValue"],"mappings":"A;;;;;;;;;aAeA,IAAMA,EAAc,E,CCIlBC,QADIC,EACO,EAAG,CAIZ,IAAA,IAAA,CAFA,IAAA,MAEA,CAFgB,CAQhB,KAAA,MAAA,CAFA,IAAA,OAEA,CAJA,IAAA,SAIA,CAJmB,IAQnB,KAAA,QAAA,CAFA,IAAA,cAEA,CAFwB,EAIxB,KAAA,OAAA,CAAiB,CAAA,CAEjB,KAAA,KAAA,CAAe,CAMf,KAAA,eAAA,CAFA,IAAA,SAEA,CAJA,IAAA,cAIA,CAJwB,EApBZ;AAmCTC,QAASA,EAAK,CAACC,CAAD,CAAO,CAC1BA,CAAA,CAAaA,CAUNC,QAAA,CAAgBC,CAAhB,CAA6B,EAA7B,CAAAD,QAAA,CAAyCE,EAAzC,CAAkD,EAAlD,CATAC,KAAAA,EAAAA,CAAAA,CAAaJ,EAAAA,CAAbI,CAkBHC,EAAO,IAAIP,CACfO,EAAA,MAAA,CAAgB,CAChBA,EAAA,IAAA,CAAcL,CAAAM,OAEd,KADA,IAAIC,EAAIF,CAAR,CACSG,EAAI,CADb,CACgBC,EAAIT,CAAAM,OAApB,CAAiCE,CAAjC,CAAqCC,CAArC,CAAwCD,CAAA,EAAxC,CACE,GAuKeE,GAvKf,GAAIV,CAAA,CAAKQ,CAAL,CAAJ,CAA4B,CACrBD,CAAA,MAAL,GACEA,CAAA,MADF,CACe,EADf,CAGA,KAAII,EAAIJ,CAAR,CACIK,EAAWD,CAAA,MAAA,CAAWA,CAAA,MAAAL,OAAX,CAA+B,CAA/B,CAAXM,EAAgD,IACpDL,EAAA,CAAI,IAAIT,CACRS,EAAA,MAAA,CAAaC,CAAb,CAAiB,CACjBD,EAAA,OAAA,CAAcI,CACdJ,EAAA,SAAA,CAAgBK,CAChBD,EAAA,MAAAE,KAAA,CAAgBN,CAAhB,CAV0B,CAA5B,IAwKgBO,GA7JT,GAAId,CAAA,CAAKQ,CAAL,CAAJ,GACLD,CAAA,IACA,CADWC,CACX,CADe,CACf,CAAAD,CAAA,CAAIA,CAAA,OAAJ,EAAmBF,CAFd,CAlCT,OAAOD,EAAA,CAuCAC,CAvCA,CAAoBL,CAApB,CAFmB;AAkD5BI,QAASA,EAAQ,CAACW,CAAD,CAAOf,CAAP,CAAa,CAC5B,IAAIgB,EAAIhB,CAAAiB,UAAA,CAAeF,CAAA,MAAf,CAA8BA,CAAA,IAA9B,CAA4C,CAA5C,CACRA,EAAA,cAAA,CAAwBA,CAAA,QAAxB,CAA0CC,CAAAE,KAAA,EACtCH,EAAA,OAAJ,GAEEC,CASA,CATIhB,CAAAiB,UAAA,CADKF,CAAA,SAAAI,CAAmBJ,CAAA,SAAA,IAAnBI,CAA6CJ,CAAA,OAAA,MAClD,CAAmBA,CAAA,MAAnB,CAAmC,CAAnC,CASJ,CARAC,CAQA,CARII,EAAA,CAAsBJ,CAAtB,CAQJ,CAPAA,CAOA,CAPIA,CAAAf,QAAA,CAAUoB,CAAV,CAA6B,GAA7B,CAOJ,CAJAL,CAIA,CAJIA,CAAAC,UAAA,CAAYD,CAAAM,YAAA,CAAc,GAAd,CAAZ,CAAiC,CAAjC,CAIJ,CAHIC,CAGJ,CAHQR,CAAA,eAGR,CAHiCA,CAAA,SAGjC,CAHoDC,CAAAE,KAAA,EAGpD,CAFAH,CAAA,OAEA,CAF0C,CAE1C,GAFkBQ,CAAAC,QAAA,CAmJLC,GAnJK,CAElB,CAAIV,CAAA,OAAJ,CACiC,CAA/B,GAAIQ,CAAAC,QAAA,CA+IUE,QA/IV,CAAJ,CACEX,CAAA,KADF,CACiBY,CADjB,CAEWJ,CAAAK,MAAA,CAAQC,EAAR,CAFX,GAGEd,CAAA,KACA,CADee,CACf,CAAAf,CAAA,cAAA,CACEA,CAAA,SAAAgB,MAAA,CAAuBV,CAAvB,CAAAW,IAAA,EALJ,CADF,CAUIjB,CAAA,KAVJ,CAS+B,CAA7B,GAAIQ,CAAAC,QAAA,CAsIQS,IAtIR,CAAJ,CACiBC,CADjB,CAGiBC,CAvBrB,CA4BA,IADIC,CACJ,CADSrB,CAAA,MACT,CACE,IADM,IACGP,EAAI,CADP,CACUC,EAAI2B,CAAA9B,OADd,CACyB+B,CAA/B,CACG7B,CADH,CACOC,CADP,GACc4B,CADd,CACkBD,CAAA,CAAG5B,CAAH,CADlB,EAC0BA,CAAA,EAD1B,CAEEJ,CAAA,CAASiC,CAAT,CAAYrC,CAAZ,CAGJ,OAAOe,EArCqB;AA8C9BK,QAASA,GAAqB,CAACG,CAAD,CAAI,CAChC,MAAOA,EAAAtB,QAAA,CAAU,uBAAV,CAAmC,QAAQ,CAAA,CAAA,CAAA,CAAA,CAAG,CAC/CqC,CAAAA,CAAO,CAEX,KADEC,CACF,CADW,CACX,CADeD,CAAAhC,OACf,CAAOiC,CAAA,EAAP,CAAA,CACED,CAAA,CAAO,GAAP,CAAaA,CAEf,OAAO,IAAP,CAAcA,CANqC,CAA9C,CADyB;AAkB3BE,QAASA,EAAS,CAACzB,CAAD,CAAO0B,CAAP,CAA2BzC,CAA3B,CAAsC,CAAXA,CAAA,CAAA,IAAA,EAAA,GAAAA,CAAA,CAAO,EAAP,CAAAA,CAElD,KAAI0C,EAAU,EACd,IAAI3B,CAAA,QAAJ,EAAuBA,CAAA,MAAvB,CAAsC,CACpC,IAAIqB,EAAKrB,CAAA,MAAT,CACI,CAAA,IAAAqB,CAAA,CAAAA,CAAA,CAgCFC,CAhCQ,CAAAM,CAgCJ,CAAM,CAAN,CAhCI,CAAA,CAAA,CAAA,EAiCGN,CAjCH,EAiCiBA,CAAA,SAjCjB,EAiCwE,CAjCxE,GAiCmCA,CAAA,SAAAb,QAAA,CAuD/BS,IAvD+B,CAjCnC,CAAV,IAAI,CAAJ,CAA+B,CACpBzB,CAAAA,CAAI,CAAb,KAD6B,IACbC,EAAI2B,CAAA9B,OADS,CACE+B,CAA/B,CACG7B,CADH,CACOC,CADP,GACc4B,CADd,CACkBD,CAAA,CAAG5B,CAAH,CADlB,EAC0BA,CAAA,EAD1B,CAEEkC,CAAA,CAAUF,CAAA,CAAUH,CAAV,CAAaI,CAAb,CAAiCC,CAAjC,CAHiB,CAA/B,IAMYD,EAAA,CAAqB,CAArB,CAAqB,CAAA,QAArB,EACR,CAmCN,CAnCM,CAAA,QAmCN,CADAC,CACA,CADqCA,CAS9BzC,QAAA,CACI2C,EADJ,CACmB,EADnB,CAAA3C,QAAA,CAEI4C,EAFJ,CAEkB,EAFlB,CARP,CAAA,CAAA,CAA6BH,CAkBtBzC,QAAA,CACI6C,EADJ,CACmB,EADnB,CAAA7C,QAAA,CAEI8C,EAFJ,CAEiB,EAFjB,CAtDO,CAGV,EADAL,CACA,CAHUA,CAEAxB,KAAA,EACV,IACEwB,CADF,CACY,IADZ,CACmBA,CADnB,CAC6B,IAD7B,CAXkC,CAiBlCA,CAAJ,GACM3B,CAAA,SAIJ,GAHEf,CAGF,EAHUe,CAAA,SAGV,CAHgD,MAGhD,EADAf,CACA,EADQ0C,CACR,CAAI3B,CAAA,SAAJ,GACEf,CADF,EACU,OADV,CALF,CASA,OAAOA,EA7BsD;AAwE7DgD,IAAAA,EAAYA,CAAZA,CACAC,EAAgBA,CADhBD,CAEAE,EAAYA,CAFZF,CAGAG,EAAYA,GAHZH,CAWAI,EAAUA,mCAXVJ,CAYAK,GAAMA,kBAZNL,CAaAM,GAAYA,mDAbZN,CAcAO,GAAWA,4DAdXP,CAeAQ,GAAYA,yCAfZR,CAgBAS,GAAUA,2CAhBVT,CAiBAU,GAAeA,mBAjBfV,CAkBAW,EAAgBA,M,CCjOlB,IAAMC,GAAUC,OAAAC,QAAA,EAKTC,SAASA,GAAU,CAACC,CAAD,CAAa,CAErC,GADIC,CACJ,CFxBarE,CEuBE,CAAYoE,CAAZ,CACf,CACqBC,CAerB,yBAIA,CAnBqBA,CAeO,yBAI5B,EAJyD,CAIzD,CAnBqBA,CAiBrB,4BAEA,CAnBqBA,CAiBU,4BAE/B,EAF+D,CAE/D,CAnBqBA,CAmBrB,sBAAA,EAnBqBA,CAmBK,sBAA1B,EAAoD,CAApD,EAAyD,CAtBpB,CAyChCC,QAASA,EAAe,CAACD,CAAD,CAAW,CACxC,MAAOA,EAAA,yBAAP,GAAqCA,CAAA,sBADG,CA4CnCE,QAASA,GAAuB,CAACF,CAAD,CAAW,CAEhDA,CAAA,4BAAA,CAA+BA,CAAA,sBAE1BA,EAAAG,EAAL,GACEH,CAAAG,EACA,CADuB,CAAA,CACvB,CAAAR,EAAAS,KAAA,CAAa,QAAQ,EAAG,CAEtBJ,CAAA,yBAAA,CAA4BA,CAAA,sBAC5BA,EAAAG,EAAA,CAAuB,CAAA,CAHD,CAAxB,CAFF,CAJgD,C,CC/G3C,IAAME,EAAe,EAAEC,MAAA,SAAF,EAAwBA,MAAA,SAAA,MAAxB,CAArB,CACHC,CAKJC,SAASA,EAAgB,CAACC,CAAD,CAAW,CAEhCF,CAAA,CADEE,CAAJ,EAAgBA,CAAA,kBAAhB,CACwB,CAAA,CADxB,CASwBJ,CATxB,EASwC,EAASK,SAAAC,UAAAhD,MAAA,CAA0B,2BAA1B,CAAT,EACpCiD,CAAAN,MAAAM,IADoC,EACtBC,CAAAD,GAAAC,SADsB,EACN,CAAAD,GAAAC,SAAA,CAAa,YAAb,CAA2B,kBAA3B,CADM,CAVN,CAehCP,MAAAQ,SAAJ,EAAqDC,IAAAA,EAArD,GAAuBT,MAAAQ,SAAAE,UAAvB,CACET,CADF,CACwBD,MAAAQ,SAAAE,UADxB,CAEWV,MAAAQ,SAAJ,EACLN,CAAA,CAAiBF,MAAAQ,SAAjB,CAEA,CAAAR,MAAAQ,SAAA,CAAkBC,IAAAA,EAHb,EAKLP,CAAA,CAAiBF,MAAA,cAAjB,EAA4CA,MAAA,cAAA,MAA5C,CAMK,KAAMW,EAA4CV,C,CCpClD,IAAMW,EAAa,yHAAnB,CACMC,EAAc,sCADpB,CAIMC,GAAc,c,CCD3B,IAAMC,EAAe,IAAIC,G,CCSlBC,QAASA,EAAU,CAAC7C,CAAD,CAAkB,CAC1C,GAAI,CAACA,CAAL,CACE,MAAO,EAEY,SAArB,GAAI,MAAOA,EAAX,GACEA,CADF,CL4Bc5C,CK3BJ,CAAM4C,CAAN,CADV,CAMA,OLwIcH,EKxIP,CAAUG,CAAV,CHcIuC,CGdJ,CAVmC,CAiBrCO,QAASA,EAAa,CAACC,CAAD,CAAQ,CAC/B,CAACA,CAAA,WAAL,EAA4BA,CAAAC,YAA5B,GACED,CAAA,WADF,CLcc3F,CKbU,CAAM2F,CAAAC,YAAN,CADxB,CAGA,OAAOD,EAAA,WAAP,EAA8B,IAJK,CAyB9BE,QAASA,EAAW,CAAC7E,CAAD,CAAO8E,CAAP,CAA0BC,CAA1B,CAAiDC,CAAjD,CAAkE,CAC3F,GAAKhF,CAAL,CAAA,CAGA,IAAIiF,EAAY,CAAA,CAAhB,CACIC,EAAOlF,CAAA,KACX,IAAIgF,CAAJ,EACME,CADN,GACetE,CADf,CACiC,CAC7B,IAAIuE,EAAanF,CAAA,SAAAa,MAAA,CF1DVyD,EE0DU,CACba,EAAJ,GAEO3B,MAAA2B,WAAA,CAAkBA,CAAA,CAAW,CAAX,CAAlB,CAAAC,QAFP,GAGIH,CAHJ,CAGgB,CAAA,CAHhB,EAF6B,CAU7BC,CAAJ,GAAa9D,CAAb,CACE0D,CAAA,CAAkB9E,CAAlB,CADF,CAEW+E,CAAJ,EACLG,CADK,GACInE,CADJ,CAELgE,CAAA,CAAsB/E,CAAtB,CAFK,CAGIkF,CAHJ,GAGa/D,CAHb,GAIL8D,CAJK,CAIO,CAAA,CAJP,CAOP,KADI5D,CACJ,CADSrB,CAAA,MACT,GAAU,CAACiF,CAAX,CAAsB,CACXxF,CAAAA,CAAE,CAAGC,EAAAA,CAAE2B,CAAA9B,OAAhB,KAAK,IAAsB+B,CAA3B,CAA+B7B,CAA/B,CAAiCC,CAAjC,GAAwC4B,CAAxC,CAA0CD,CAAA,CAAG5B,CAAH,CAA1C,EAAkDA,CAAA,EAAlD,CACEoF,CAAA,CAAYvD,CAAZ,CAAewD,CAAf,CAAkCC,CAAlC,CAAyDC,CAAzD,CAFkB,CAzBtB,CAD2F;AAiJtFK,QAASA,EAA0B,CAACC,CAAD,CAAMC,CAAN,CAAgB,CAExD,IAAIC,EAAQF,CAAA7E,QAAA,CAAY,MAAZ,CACZ,IAAe,EAAf,GAAI+E,CAAJ,CAEE,MAAOD,EAAA,CAASD,CAAT,CAAc,EAAd,CAAkB,EAAlB,CAAsB,EAAtB,CAvB6B,EAAA,CAAA,CACtC,IAAIG,EAAQ,CACHhG,KAAAA,EAwBwB+F,CAxBxB/F,CAwBgC,CAxBzC,KAAK,IAAaC,EAwBU4F,CAxBR/F,OAApB,CAAiCE,CAAjC,CAAqCC,CAArC,CAAwCD,CAAA,EAAxC,CACE,GAAgB,GAAhB,GAuB0B6F,CAvBtB,CAAK7F,CAAL,CAAJ,CACEgG,CAAA,EADF,KAEO,IAAgB,GAAhB,GAqBmBH,CArBf,CAAK7F,CAAL,CAAJ,EACW,CADX,GACD,EAAEgG,CADD,CAEH,MAAA,CAIN,EAAA,CAAQ,EAX8B,CA2BlCC,CAAAA,CAAQJ,CAAApF,UAAA,CAAcsF,CAAd,CAAsB,CAAtB,CAAyBG,CAAzB,CACRC,EAAAA,CAASN,CAAApF,UAAA,CAAc,CAAd,CAAiBsF,CAAjB,CAETK,EAAAA,CAASR,CAAA,CAA2BC,CAAApF,UAAA,CAAcyF,CAAd,CAAoB,CAApB,CAA3B,CAAmDJ,CAAnD,CACTO,EAAAA,CAAQJ,CAAAjF,QAAA,CAAc,GAAd,CAEZ,OAAe,EAAf,GAAIqF,CAAJ,CAESP,CAAA,CAASK,CAAT,CAAiBF,CAAAvF,KAAA,EAAjB,CAA+B,EAA/B,CAAmC0F,CAAnC,CAFT,CAOON,CAAA,CAASK,CAAT,CAFKF,CAAAxF,UAAA,CAAgB,CAAhB,CAAmB4F,CAAnB,CAAA3F,KAAA4F,EAEL,CADQL,CAAAxF,UAAA,CAAgB4F,CAAhB,CAAwB,CAAxB,CAAA3F,KAAA6F,EACR,CAAkCH,CAAlC,CAtBiD,C,CCnI1D,IAAMI,GAAmB,OAAzB,CACMC,GAAkB,6BADxB,CAEMC,EAAY,eA0BhBrH,SADIsH,EACO,EAAG,CAEZ,IAAAC,EAAA,CAAY,EAFA,CAQd,CAAA,UAAA,IAAA,CAAAC,QAAG,CAACC,CAAD,CAAOC,CAAP,CAAc,CACfD,CAAA,CAAOA,CAAApG,KAAA,EACP,KAAAkG,EAAA,CAAUE,CAAV,CAAA,CAAkB,CAChBE,EAAYD,CADI,CAEhBE,EAAY,EAFI,CAFH,CAWjB,EAAA,UAAA,IAAA,CAAAC,QAAG,CAACJ,CAAD,CAAO,CACRA,CAAA,CAAOA,CAAApG,KAAA,EACP,OAAO,KAAAkG,EAAA,CAAUE,CAAV,CAAP,EAA0B,IAFlB,CAUZ,KAAIK,EAAkB,IAIpB9H,SADI+H,EACO,EAAG,CAIZ,IAAAC,EAAA,CAFA,IAAAC,EAEA,CAFuB,IAGvB,KAAAV,EAAA,CAAY,IAAID,CALJ,CAYd,CAAA,UAAA,EAAA,CAAAY,QAAW,CAACrF,CAAD,CAAU,CClGfsF,CAAAA,CJ1CK5C,CI0CC6C,KAAA,CDmGSvF,CCnGT,CAANsF,EJ3CK7C,CI2C8B8C,KAAA,CDmGpBvF,CCnGoB,CJ1C9B0C,EI4CX8C,UAAA,CAAwB,CJ7Cb/C,EI8CX+C,UAAA,CAAuB,CDgGrB,OC/FKF,ED8Fc,CAwBrB;CAAA,UAAA,EAAA,CAAAG,QAAiB,CAAClE,CAAD,CAAWD,CAAX,CAAwB,CACvC,GAAgCgB,IAAAA,EAAhC,GAAIf,CAAAmE,EAAJ,CAA2C,CDsGvCC,IAAAA,EAAiB,EAEvB,KADA,IAAMC,ECtG0CrE,CAhBZsE,QDsHuBC,iBAAA,CAAyB,OAAzB,CAA3D,CACShI,EAAI,CAAb,CAAgBA,CAAhB,CAAoB8H,CAAAhI,OAApB,CAAmCE,CAAA,EAAnC,CAAwC,CACtC,IAAMkF,EAAQ4C,CAAA,CAAO9H,CAAP,CACd,IAAoBkF,CDpPf+C,aAAA,CAvBuBC,gBAuBvB,CCoPL,CACE,IAAI,CH/QGpE,CG+QP,CAAmB,CDnQvB,IAAMtE,ECoQqB0F,CDpQdC,YACRL,EAAA0C,IAAA,CAAiBhI,CAAjB,CAAL,GACEsF,CAAAqD,IAAA,CAAiB3I,CAAjB,CAEA,CADM4I,CACN,CCgQyBlD,CDjQRmD,UAAA,CAAgB,CAAA,CAAhB,CACjB,CAAAC,QAAAC,KAAAC,YAAA,CAA0BJ,CAA1B,CAHF,CCoQMlD,EAAAuD,WAAAC,YAAA,CAA6BxD,CAA7B,CAFiB,CAAnB,CADF,IAME2C,EAAAxH,KAAA,CAAoB6E,CAAAC,YAApB,CACA,CAAAD,CAAAuD,WAAAC,YAAA,CAA6BxD,CAA7B,CAToC,CCtHtC,CADMyD,CACN,CDkIKd,CAAAe,KAAA,CAAoB,EAApB,CAAAlI,KAAA,EClIL,GACQwE,CAGN,CAH+CoD,QAAAO,cAAA,CAAuB,OAAvB,CAG/C,CAFA3D,CAAAC,YAEA,CAFoBwD,CAEpB,CAW4ClF,CAZ5CsE,QAAAe,aAAA,CAA8B5D,CAA9B,CAY4CzB,CAZPsE,QAAAgB,WAArC,CACA,CAAA,CAAA,CAAO7D,CAJT,EAMA,CANA,CAMO,IASLzB,EAAAmE,EAAA,CAA0B,CADe,CAK3C,MAAO,CADD1C,CACC,CADOzB,CAAAmE,EACP,EAAQ,IAAAoB,EAAA,CAAoB9D,CAApB;AAA2B1B,CAA3B,CAAR,CAAkD,IANlB,CAazC,EAAA,UAAA,EAAA,CAAAwF,QAAc,CAAC9D,CAAD,CAAQ1B,CAAR,CAA0B,CAAlBA,CAAA,CAAA,IAAA,EAAA,GAAAA,CAAA,CAAc,EAAd,CAAAA,CACpB,KAAIyF,EDtJQhE,CCsJF,CAAcC,CAAd,CACV,KAAAgE,EAAA,CAAoBD,CAApB,CAAyBzF,CAAzB,CACA0B,EAAAC,YAAA,CDzKYH,CCyKQ,CAAUiE,CAAV,CACpB,OAAOA,EAJ+B,CAUxC,EAAA,UAAA,EAAA,CAAAE,QAAoB,CAACjE,CAAD,CAAQ,CAAA,IAAA,EAAA,IAAA,CACtB+D,EDhKQhE,CCgKF,CAAcC,CAAd,CDvIEE,ECwIZ,CAAY6D,CAAZ,CAAiB,QAAA,CAACG,CAAD,CAAU,CACA,OAAzB,GAAIA,CAAA,SAAJ,GACEA,CAAA,SADF,CACqB,MADrB,CAGA,EAAAC,EAAA,CAAmBD,CAAnB,CAJyB,CAA3B,CAMAlE,EAAAC,YAAA,CDxLYH,CCwLQ,CAAUiE,CAAV,CACpB,OAAOA,EATmB,CAe5B,EAAA,UAAA,EAAA,CAAAC,QAAc,CAAC/G,CAAD,CAAQqB,CAAR,CAAqB,CAAA,IAAA,EAAA,IACjC,KAAA8D,EAAA,CAAuB9D,CDtJX4B,ECuJZ,CAAYjD,CAAZ,CAAmB,QAAA,CAACN,CAAD,CAAO,CACxB,CAAAwH,EAAA,CAAmBxH,CAAnB,CADwB,CAA1B,CAGA,KAAAyF,EAAA,CAAuB,IALU,CAUnC,EAAA,UAAA,EAAA,CAAA+B,QAAa,CAACD,CAAD,CAAO,CAClBA,CAAA,QAAA,CAAkBE,EAAA,CAAAA,IAAA,CAAsBF,CAAA,cAAtB,CAIO,QAAzB,GAAIA,CAAA,SAAJ,GACEA,CAAA,SADF,CACqB,WADrB,CALkB,CAapBE;QAAA,GAAgB,CAAhBA,CAAgB,CAACpH,CAAD,CAAU,CAExBA,CAAA,CAAUA,CAAAzC,QAAA,CHpODkF,CGoOC,CAA4B,QAAA,CAAC4E,CAAD,CAAYC,CAAZ,CAA0BC,CAA1B,CAAyCC,CAAzC,CACpC,CAAA,MAAAC,GAAA,CAHsBA,CAGtB,CAA2BJ,CAA3B,CAAsCC,CAAtC,CAAoDC,CAApD,CAAmEC,CAAnE,CAAA,CADQ,CAGV,OAAOE,EAAA,CAAAA,CAAA,CAA2B1H,CAA3B,CALiB;AAyB1B0H,QAAA,EAAqB,CAArBA,CAAqB,CAACpK,CAAD,CAAO,CAI1B,IAFA,IAAIqK,CAEJ,CAAOA,CAAP,CH9PSjF,CG8PEkF,KAAA,CAAiBtK,CAAjB,CAAX,CAAA,CAAoC,CAClC,IAAI+J,EAAYM,CAAA,CAAE,CAAF,CAAhB,CACIE,EAAYF,CAAA,CAAE,CAAF,CACZG,EAAAA,CAAMH,CAAAI,MAMV,KAAIC,EAAkB1K,CAAA2K,MAAA,CAAW,CAAX,CAHPH,CAGO,CAHDT,CAAAvI,QAAA,CAAkB,QAAlB,CAGC,CAClBoJ,EAAAA,CAAiB5K,CAAA2K,MAAA,CAHDH,CAGC,CAHKT,CAAAzJ,OAGL,CACrB,KAAIuK,EAAWC,CAAA,CAAAA,CAAA,CAAmBJ,CAAnB,CAiCX/J,EAAAA,CAAAA,IAAAA,EAhCcoK,KAAAA,EAAAA,CAmBpBR,EAAA,CAAYA,CAAAtK,QAAA,CAAkB+G,EAAlB,CAAoC,EAApC,CACZ,KAAIgE,EAAO,EACPC,KAAAA,EAAa,CAAA7D,EAAAM,IAAA,CAAc6C,CAAd,CAGZU,EAAL,GACE,CAAA7D,EAAAC,IAAA,CAAckD,CAAd,CAAyB,EAAzB,CACA,CAAAU,CAAA,CAAa,CAAA7D,EAAAM,IAAA,CAAc6C,CAAd,CAFf,CAIA,IAAIU,CAAJ,CAAgB,CACV,CAAAnD,EAAJ,GACEmD,CAAAxD,EAAA,CAAsB,CAAAK,EAAtB,CADF,CACgD,CAAA,CADhD,CAIA,KAAMN,EAAayD,CAAAzD,EACnB,KAAK7G,CAAL,GAAU6G,EAAV,CACE0D,CASA,CATIC,CASJ,EATiBA,CAAA,CAAUxK,CAAV,CASjB,CARAyK,CAQA,CARQ,CAACzK,CAAD,CAAI,QAAJ,CAAc4J,CAAd,CArOMc,KAqON,CAAwC1K,CAAxC,CAQR,CAPIuK,CAOJ,EANEE,CAAAvK,KAAA,CAAW,GAAX,CAAgBqK,CAAAjL,QAAA,CAAUiH,CAAV,CAAqB,EAArB,CAAhB,CAMF,CAJAkE,CAAAvK,KAAA,CAAW,GAAX,CAIA,CAHIqG,CAAAe,KAAA,CAAeT,CAAA,CAAW7G,CAAX,CAAf,CAGJ,EAFEyK,CAAAvK,KAAA,CAAW,aAAX,CAEF,CAAAmK,CAAAnK,KAAA,CAAUuK,CAAAhC,KAAA,CAAW,EAAX,CAAV,CAhBY,CAmBhB,CAAA,CAAO4B,CAAA5B,KAAA,CAAU,IAAV,CA7CLpJ,EAAA,CAAO,EAAP,CAAU0K,CAAV,CAA4BY,CAA5B,CAA0CV,CH5QnCxF,EG8QP8C,UAAA,CAAwBsC,CAAxB,CAA8Bc,CAAAhL,OAhBI,CAkBpC,MAAON,EAtBmB;AAgG5B8K,QAAA,EAAa,CAAbA,CAAa,CAAC9K,CAAD,CAAO,CACduH,CAAAA,CAAQvH,CAAA+B,MAAA,CAAW,GAAX,CAGZ,KAJkB,IAEdwJ,CAFc,CAEJzE,CAFI,CAGd0E,EAAM,EAHQ,CAIThL,EAAI,CAJK,CAICiL,CAAnB,CAAuBjL,CAAvB,CAA2B+G,CAAAjH,OAA3B,CAAyCE,CAAA,EAAzC,CAEE,GADAG,CACA,CADI4G,CAAA,CAAM/G,CAAN,CACJ,CAGE,GAFAiL,CAEI,CAFC9K,CAAAoB,MAAA,CAAQ,GAAR,CAED,CAAY,CAAZ,CAAA0J,CAAAnL,OAAJ,CAAmB,CACjBiL,CAAA,CAAWE,CAAA,CAAG,CAAH,CAAAvK,KAAA,EAEHwK,KAAAA,EAAAA,CAA8BH,EAAAA,CAAAA,CAAU,EAAA,CAAAE,CAAAd,MAAA,CAAS,CAAT,CAAAvB,KAAA,CAAiB,GAAjB,CApCtD,KAAIxH,EAAQqF,EAAAqD,KAAA,CAAqBxD,CAArB,CACRlF,EAAJ,GACMA,CAAA,CAAM,CAAN,CAAJ,EAvFG,CAAAiG,EAML,GALE,CAAAA,EAGA,CAHsDiB,QAAAO,cAAA,CAAuB,MAAvB,CAGtD,CAFA,CAAAxB,EAAA8D,aAAA,CAAkC,oBAAlC,CAAwD,EAAxD,CAEA,CADA,CAAA9D,EAAAnC,MAAAkG,IACA,CADiC,SACjC,CAAA9C,QAAAC,KAAAC,YAAA,CAA0B,CAAAnB,EAA1B,CAEF,EAAA,CAAA,CAAOtD,MAAAsH,iBAAA,CAAwB,CAAAhE,EAAxB,CAAAiE,iBAAA,CAA+DP,CAA/D,CAiFL,EAUU,CAVV,CAUU,oBAPR,CAAAzE,CAAA,CAHF,CADF,CAcA,EAAA,CAAOA,CAsBD0E,EAAA,CAAID,CAAJ,CAAA,CAAgBzE,CAJC,CAQvB,MAAO0E,EAjBW,CAuBpBO,QAAA,GAAqB,CAArBA,CAAqB,CAACd,CAAD,CAAa,CAChC,GAAKtD,CAAL,CAGA,IAAK3D,IAAIA,CAAT,GAAwBiH,EAAAxD,EAAxB,CACMzD,CAAJ,GAAoB,CAAA8D,EAApB,EACEH,CAAA,CAAgB3D,CAAhB,CAN4B;AAkBlCmG,QAAA,GAAqB,CAArBA,CAAqB,CAACJ,CAAD,CAAYC,CAAZ,CAA0BC,CAA1B,CAAyCC,CAAzC,CAAqD,CAEpED,CAAJ,ED/LY7D,CCiMV,CAA2B6D,CAA3B,CAA0C,QAAA,CAACtD,CAAD,CAASG,CAAT,CAAmB,CACvDA,CAAJ,EALoE,CAKvDM,EAAAM,IAAA,CAAcZ,CAAd,CAAb,GACEoD,CADF,CACe,SADf,CACyBpD,CADzB,CAC8B,GAD9B,CAD2D,CAA7D,CAMF,IAAI,CAACoD,CAAL,CACE,MAAOH,EAET,KAAIiC,EAAoB5B,CAAA,CAAAA,CAAA,CAA2B,EAA3B,CAAgCF,CAAhC,CAAxB,CACIvD,EAASoD,CAAAY,MAAA,CAAgB,CAAhB,CAAmBZ,CAAAvI,QAAA,CAAkB,IAAlB,CAAnB,CADb,CAGIyK,EADAC,CACAD,CADcnB,CAAA,CAAAA,CAAA,CAAmBkB,CAAnB,CAFlB,CAIIf,EAAa,CAAA7D,EAAAM,IAAA,CAAcsC,CAAd,CAJjB,CAKImC,EAAWlB,CAAXkB,EAAyBlB,CAAAzD,EACzB2E,EAAJ,CAGEF,CAHF,CAGkBG,MAAAC,OAAA,CAAcD,MAAAE,OAAA,CAAcH,CAAd,CAAd,CAAuCD,CAAvC,CAHlB,CAKE,CAAA9E,EAAAC,IAAA,CAAc2C,CAAd,CAA4BiC,CAA5B,CAEF,KAAIT,EAAM,EAAV,CACI7K,CADJ,CAGI4L,EAAmB,CAAA,CACvB,KAAK5L,CAAL,GAAUsL,EAAV,CAAyB,CACvB,IAAAO,EAAIN,CAAA,CAAYvL,CAAZ,CAEMqE,KAAAA,EAAV,GAAIwH,CAAJ,GACEA,CADF,CACM,SADN,CAGIL,EAAAA,CAAJ,EAAkBxL,CAAlB,GAAuBwL,EAAvB,GACEI,CADF,CACqB,CAAA,CADrB,CAGAf,EAAA3K,KAAA,CAAS,EAAT,CAAYmJ,CAAZ,CAjWgBqB,KAiWhB,CAA2C1K,CAA3C,CAA4C,IAA5C,CAAiD6L,CAAjD,CATuB,CAWrBD,CAAJ,EACER,EAAA,CAAAA,CAAA,CAA2Bd,CAA3B,CAEEA,EAAJ,GACEA,CAAAzD,EADF,CAC0ByE,CAD1B,CAaIhC,EAAJ,GACEtD,CADF,CACcoD,CADd,CACuB,GADvB,CAC2BpD,CAD3B,CAGA,OAAO,EAAP,CAAUA,CAAV,CAAmB6E,CAAApC,KAAA,CAAS,IAAT,CAAnB,CAAiC,GA5DuC,CAiE5ExB,CAAA6E,UAAA,YAAA,CAAqC7E,CAAA6E,UAAA1E,EACrCH,EAAA6E,UAAA,eAAA,CAAwC7E,CAAA6E,UAAAjD,EACxC5B;CAAA6E,UAAA,qBAAA,CAA8C7E,CAAA6E,UAAA9C,EAC9C/B,EAAA6E,UAAA,eAAA,CAAwC7E,CAAA6E,UAAA/C,EACxC9B,EAAA6E,UAAA,cAAA,CAAuC7E,CAAA6E,UAAA5C,EACvCjC,EAAA6E,UAAA,kBAAA,CAA2C7E,CAAA6E,UAAAtE,EAC3CP,EAAA6E,UAAA,WAAA,CAjYsBpB,KAkYtBe,OAAAM,eAAA,CAAsB9E,CAAA6E,UAAtB,CAA2C,iBAA3C,CAA8D,CAE5D,IAAA/E,QAAG,EAAG,CACJ,MAAOC,EADH,CAFsD,CAM5D,IAAAN,QAAG,CAACsF,CAAD,CAAK,CACNhF,CAAA,CAAkBgF,CADZ,CANoD,CAA9D,C,CEjcA,IAAMC,EAAY,IF4cHhF,CEzcb/H,SADIgN,EACO,EAAG,CAEZ,IAAAC,EAAA,CAA4B,IAC5BF,EAAA,gBAAA,CPWY7I,EOdA,CAKdgJ,QAAA,EAAM,CAANA,CAAM,CAAG,CACH,CAAAD,EAAJ,GAGA,CAAAA,EACA,CAD4BvI,MAAAQ,SAAAiI,qBAC5B,CAAI,CAAAF,EAAJ,GACE,CAAAA,EAAA,kBAGA,CAHiD,QAAA,CAACpH,CAAD,CAAW,CAC1DkH,CAAAjD,EAAA,CAA+BjE,CAA/B,CAD0D,CAG5D,CAAA,CAAAoH,EAAA,iBAAA,CAAgD,QAAA,EAAM,CACpDG,qBAAA,CAAsB,QAAA,EAAM,CAVzB,CAWGH,EAAA,SAAJ,EAXC,CAYCI,kBAAA,EAFwB,CAA5B,CADoD,CAJxD,CAJA,CADO,CAsBT,CAAA,UAAA,gBAAA,CAAAC,QAAe,CAAClJ,CAAD,CAAWD,CAAX,CAAwB,CACrC+I,CAAA,CAAAA,IAAA,CTpCWnN,ESqCX,CAAYoE,CAAZ,CAAA,CAA2BC,CACvBwF,EAAAA,CAAMmD,CAAAzE,EAAA,CAA4BlE,CAA5B,CAAsCD,CAAtC,CAEVC,EAAA,UAAA,CAAwBwF,CALa,CAOvC;CAAA,UAAA,kBAAA,CAAAyD,QAAiB,EAAG,CAClBH,CAAA,CAAAA,IAAA,CACA,IAAK,IAAAD,EAAL,CAAA,CAGA,IAAIxE,EAAS,IAAAwE,EAAA,cAAA,EACb,IAAK,IAAAA,EAAA,SAAL,CAAA,CAGA,IAAK,IAAItM,EAAI,CAAb,CAAgBA,CAAhB,CAAoB8H,CAAAhI,OAApB,CAAmCE,CAAA,EAAnC,CAAyC,CAEvC,IAAIkF,EAAQ,IAAAoH,EAAA,uBAAA,CADHxE,CAAA8E,CAAO5M,CAAP4M,CACG,CACR1H,EAAJ,EACEkH,CAAAjD,EAAA,CAA+BjE,CAA/B,CAJqC,CAOzC,IAAAoH,EAAA,SAAA,CAAwC,CAAA,CAVxC,CAJA,CAFkB,CAsBpB;CAAA,UAAA,aAAA,CAAAO,QAAY,CAACC,CAAD,CAAU9F,CAAV,CAAsB,CAChCuF,CAAA,CAAAA,IAAA,CACA,IAAIvF,CAAJ,CD9DF,IAAK7G,IAAIA,CAAT,GC+DoC6G,ED/DpC,CAEY,IAAV,GAAI7G,CAAJ,CC6DyB2M,CD5DvB5H,MAAA6H,eAAA,CAA6B5M,CAA7B,CADF,CC6DyB2M,CD1DvB5H,MAAA8H,YAAA,CAA0B7M,CAA1B,CC0DgC6G,CD1DH,CAAW7G,CAAX,CAA7B,CC4DF,IAAI2M,CAAAG,WAAJ,CAGE,IAFA,IAAAC,aAAA,CAAkBJ,CAAlB,CAES9M,CADLmN,CACKnN,CADY8M,CAAAG,WAAAG,SACZpN,EAD2C8M,CAAAG,WAAAI,WAC3CrN,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CAAoBmN,CAAArN,OAApB,CAA2CE,CAAA,EAA3C,CACE,IAAA6M,aAAA,CAA6CM,CAAA,CAAenN,CAAf,CAA7C,CAJJ,KAQE,KADIoN,CACKpN,CADM8M,CAAAM,SACNpN,EAD0B8M,CAAAO,WAC1BrN,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CAAoBoN,CAAAtN,OAApB,CAAqCE,CAAA,EAArC,CACE,IAAA6M,aAAA,CAA6CO,CAAA,CAASpN,CAAT,CAA7C,CAd4B,CAqBlC;CAAA,UAAA,aAAA,CAAAkN,QAAY,CAACJ,CAAD,CAAU,CACpBP,CAAA,CAAAA,IAAA,CHsJF,KAAIe,EGrJsBR,CHqJV,UAAhB,CACIS,CAKAD,EAAJ,CACgC,EAA9B,CAAIA,CAAAtM,QAAA,CAAkB,GAAlB,CAAJ,CACEuM,CADF,CACOD,CADP,CAIEC,CAJF,CG5JwBT,CHgKhBU,aAJR,EG5JwBV,CHgKQU,aAAA,CAAqB,IAArB,CAJhC,EAI+D,EALjE,CAQED,CARF,CG3J0BT,CHmKHS,GGjKrB,KADI9J,CACJ,CTzFWrE,CSwFI,CAAYmO,CAAZ,CACf,GAAgB,CP1BJ7J,CO0BK,CAA+BD,CAA/B,CAAjB,CAA2D,CAEzD,GPLIC,CAAA,COKqCD,CPLrC,COKJ,EAAyCA,CPLR,4BOKjC,GAAyCA,CPLyB,sBOKlE,CACE,IAAAkJ,gBAAA,CAAqBlJ,CAArB,CAA+B8J,CAA/B,CACA,CPcQ5J,EOdR,CAAuCF,CAAvC,CAIF,IADI5D,CACJ,CADWiN,CAAAG,WACX,CAEE,GADI/H,CACJ,CAD4CrF,CAAA4N,cAAA,CAAmB,OAAnB,CAC5C,CAEEvI,CAAA,WACA,CADsBzB,CAAA,UACtB,CAAAyB,CAAAC,YAAA,CHhGMH,CGgGc,CAAUvB,CAAA,UAAV,CAbiC,CAJvC,CAyBtB,EAAA,UAAA,cAAA,CAAAiK,QAAa,CAAC1G,CAAD,CAAa,CACxBuF,CAAA,CAAAA,IAAA,CACA,KAAAM,aAAA,CAAkBvE,QAAAqF,KAAlB,CAAiC3G,CAAjC,CAFwB,CAM5B;GAAI,CAACjD,MAAAQ,SAAL,EAAwB,CAACR,MAAAQ,SAAAqJ,YAAzB,CAAsD,CACpD,IAAMC,EAAqB,IAAIxB,CAA/B,CACIG,EAAuBzI,MAAAQ,SAAvBiI,EAA0CzI,MAAAQ,SAAAiI,qBAG9CzI,OAAAQ,SAAA,CAAkB,CAMhB,gBAAAoI,QAAe,CAAClJ,CAAD,CAAWD,CAAX,CAAwC,CACrDqK,CAAAnB,kBAAA,EACAmB,EAAAlB,gBAAA,CAAmClJ,CAAnC,CAA6CD,CAA7C,CAFqD,CANvC,CAehB,aAAAqJ,QAAY,CAACC,CAAD,CAAU9F,CAAV,CAAsB,CAChC6G,CAAAnB,kBAAA,EACAmB,EAAAhB,aAAA,CAAgCC,CAAhC,CAAyC9F,CAAzC,CAFgC,CAflB,CAuBhB,aAAAkG,QAAY,CAACJ,CAAD,CAAU,CACpBe,CAAAnB,kBAAA,EACAmB,EAAAX,aAAA,CAAgCJ,CAAhC,CAFoB,CAvBN,CA+BhB,cAAAY,QAAa,CAAC1G,CAAD,CAAa,CACxB6G,CAAAnB,kBAAA,EACAmB,EAAAH,cAAA,CAAiC1G,CAAjC,CAFwB,CA/BV,CAyChB,sBAAA8G,QAAqB,CAAChB,CAAD,CAAU/B,CAAV,CAAoB,CACvC,MD3IJ,CADMzE,CACN,CADcvC,MAAAsH,iBAAA,CC4ImByB,CD5InB,CAAAxB,iBAAA,CC4I4BP,CD5I5B,CACd;AAGSzE,CAAA5F,KAAA,EAHT,CACS,ECyIkC,CAzCzB,CA6ChB,kBAAAgM,QAAiB,EAAG,CAClBmB,CAAAnB,kBAAA,EADkB,CA7CJ,CAiDhBjI,UN5ISC,CM2FO,CAkDhBZ,aN/KSA,CM6HO,CAqDd0I,EAAJ,GACEzI,MAAAQ,SAAAiI,qBADF,CACyCA,CADzC,CA1DoD,CA+DtDzI,MAAAQ,SAAA6C,UAAA,CAA4BgF","file":"apply-shim.min.js","sourcesContent":["/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/**\n * @const {!Object<string, !HTMLTemplateElement>}\n */\nconst templateMap = {};\nexport default templateMap;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/*\nExtremely simple css parser. Intended to be not more than what we need\nand definitely not necessarily correct =).\n*/\n\n'use strict';\n\n/** @unrestricted */\nclass StyleNode {\n constructor() {\n /** @type {number} */\n this['start'] = 0;\n /** @type {number} */\n this['end'] = 0;\n /** @type {StyleNode} */\n this['previous'] = null;\n /** @type {StyleNode} */\n this['parent'] = null;\n /** @type {Array<StyleNode>} */\n this['rules'] = null;\n /** @type {string} */\n this['parsedCssText'] = '';\n /** @type {string} */\n this['cssText'] = '';\n /** @type {boolean} */\n this['atRule'] = false;\n /** @type {number} */\n this['type'] = 0;\n /** @type {string} */\n this['keyframesName'] = '';\n /** @type {string} */\n this['selector'] = '';\n /** @type {string} */\n this['parsedSelector'] = '';\n }\n}\n\nexport {StyleNode}\n\n// given a string of css, return a simple rule tree\n/**\n * @param {string} text\n * @return {StyleNode}\n */\nexport function parse(text) {\n text = clean(text);\n return parseCss(lex(text), text);\n}\n\n// remove stuff we don't care about that may hinder parsing\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction clean(cssText) {\n return cssText.replace(RX.comments, '').replace(RX.port, '');\n}\n\n// super simple {...} lexer that returns a node tree\n/**\n * @param {string} text\n * @return {StyleNode}\n */\nfunction lex(text) {\n let root = new StyleNode();\n root['start'] = 0;\n root['end'] = text.length\n let n = root;\n for (let i = 0, l = text.length; i < l; i++) {\n if (text[i] === OPEN_BRACE) {\n if (!n['rules']) {\n n['rules'] = [];\n }\n let p = n;\n let previous = p['rules'][p['rules'].length - 1] || null;\n n = new StyleNode();\n n['start'] = i + 1;\n n['parent'] = p;\n n['previous'] = previous;\n p['rules'].push(n);\n } else if (text[i] === CLOSE_BRACE) {\n n['end'] = i + 1;\n n = n['parent'] || root;\n }\n }\n return root;\n}\n\n// add selectors/cssText to node tree\n/**\n * @param {StyleNode} node\n * @param {string} text\n * @return {StyleNode}\n */\nfunction parseCss(node, text) {\n let t = text.substring(node['start'], node['end'] - 1);\n node['parsedCssText'] = node['cssText'] = t.trim();\n if (node['parent']) {\n let ss = node['previous'] ? node['previous']['end'] : node['parent']['start'];\n t = text.substring(ss, node['start'] - 1);\n t = _expandUnicodeEscapes(t);\n t = t.replace(RX.multipleSpaces, ' ');\n // TODO(sorvell): ad hoc; make selector include only after last ;\n // helps with mixin syntax\n t = t.substring(t.lastIndexOf(';') + 1);\n let s = node['parsedSelector'] = node['selector'] = t.trim();\n node['atRule'] = (s.indexOf(AT_START) === 0);\n // note, support a subset of rule types...\n if (node['atRule']) {\n if (s.indexOf(MEDIA_START) === 0) {\n node['type'] = types.MEDIA_RULE;\n } else if (s.match(RX.keyframesRule)) {\n node['type'] = types.KEYFRAMES_RULE;\n node['keyframesName'] =\n node['selector'].split(RX.multipleSpaces).pop();\n }\n } else {\n if (s.indexOf(VAR_START) === 0) {\n node['type'] = types.MIXIN_RULE;\n } else {\n node['type'] = types.STYLE_RULE;\n }\n }\n }\n let r$ = node['rules'];\n if (r$) {\n for (let i = 0, l = r$.length, r;\n (i < l) && (r = r$[i]); i++) {\n parseCss(r, text);\n }\n }\n return node;\n}\n\n/**\n * conversion of sort unicode escapes with spaces like `\\33 ` (and longer) into\n * expanded form that doesn't require trailing space `\\000033`\n * @param {string} s\n * @return {string}\n */\nfunction _expandUnicodeEscapes(s) {\n return s.replace(/\\\\([0-9a-f]{1,6})\\s/gi, function() {\n let code = arguments[1],\n repeat = 6 - code.length;\n while (repeat--) {\n code = '0' + code;\n }\n return '\\\\' + code;\n });\n}\n\n/**\n * stringify parsed css.\n * @param {StyleNode} node\n * @param {boolean=} preserveProperties\n * @param {string=} text\n * @return {string}\n */\nexport function stringify(node, preserveProperties, text = '') {\n // calc rule cssText\n let cssText = '';\n if (node['cssText'] || node['rules']) {\n let r$ = node['rules'];\n if (r$ && !_hasMixinRules(r$)) {\n for (let i = 0, l = r$.length, r;\n (i < l) && (r = r$[i]); i++) {\n cssText = stringify(r, preserveProperties, cssText);\n }\n } else {\n cssText = preserveProperties ? node['cssText'] :\n removeCustomProps(node['cssText']);\n cssText = cssText.trim();\n if (cssText) {\n cssText = ' ' + cssText + '\\n';\n }\n }\n }\n // emit rule if there is cssText\n if (cssText) {\n if (node['selector']) {\n text += node['selector'] + ' ' + OPEN_BRACE + '\\n';\n }\n text += cssText;\n if (node['selector']) {\n text += CLOSE_BRACE + '\\n\\n';\n }\n }\n return text;\n}\n\n/**\n * @param {Array<StyleNode>} rules\n * @return {boolean}\n */\nfunction _hasMixinRules(rules) {\n let r = rules[0];\n return Boolean(r) && Boolean(r['selector']) && r['selector'].indexOf(VAR_START) === 0;\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction removeCustomProps(cssText) {\n cssText = removeCustomPropAssignment(cssText);\n return removeCustomPropApply(cssText);\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nexport function removeCustomPropAssignment(cssText) {\n return cssText\n .replace(RX.customProp, '')\n .replace(RX.mixinProp, '');\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction removeCustomPropApply(cssText) {\n return cssText\n .replace(RX.mixinApply, '')\n .replace(RX.varApply, '');\n}\n\n/** @enum {number} */\nexport const types = {\n STYLE_RULE: 1,\n KEYFRAMES_RULE: 7,\n MEDIA_RULE: 4,\n MIXIN_RULE: 1000\n}\n\nconst OPEN_BRACE = '{';\nconst CLOSE_BRACE = '}';\n\n// helper regexp's\nconst RX = {\n comments: /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n port: /@import[^;]*;/gim,\n customProp: /(?:^[^;\\-\\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\\n]|$)/gim,\n mixinProp: /(?:^[^;\\-\\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\\n]|$)?/gim,\n mixinApply: /@apply\\s*\\(?[^);]*\\)?\\s*(?:[;\\n]|$)?/gim,\n varApply: /[^;:]*?:[^;]*?var\\([^;]*\\)(?:[;\\n]|$)?/gim,\n keyframesRule: /^@[^\\s]*keyframes/,\n multipleSpaces: /\\s+/g\n}\n\nconst VAR_START = '--';\nconst MEDIA_START = '@media';\nconst AT_START = '@';\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\nimport templateMap from './template-map.js';\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\n\n/*\n * Utilities for handling invalidating apply-shim mixins for a given template.\n *\n * The invalidation strategy involves keeping track of the \"current\" version of a template's mixins, and updating that count when a mixin is invalidated.\n * The template\n */\n\n/** @const {string} */\nconst CURRENT_VERSION = '_applyShimCurrentVersion';\n\n/** @const {string} */\nconst NEXT_VERSION = '_applyShimNextVersion';\n\n/** @const {string} */\nconst VALIDATING_VERSION = '_applyShimValidatingVersion';\n\n/**\n * @const {Promise<void>}\n */\nconst promise = Promise.resolve();\n\n/**\n * @param {string} elementName\n */\nexport function invalidate(elementName){\n let template = templateMap[elementName];\n if (template) {\n invalidateTemplate(template);\n }\n}\n\n/**\n * This function can be called multiple times to mark a template invalid\n * and signal that the style inside must be regenerated.\n *\n * Use `startValidatingTemplate` to begin an asynchronous validation cycle.\n * During that cycle, call `templateIsValidating` to see if the template must\n * be revalidated\n * @param {HTMLTemplateElement} template\n */\nexport function invalidateTemplate(template) {\n // default the current version to 0\n template[CURRENT_VERSION] = template[CURRENT_VERSION] || 0;\n // ensure the \"validating for\" flag exists\n template[VALIDATING_VERSION] = template[VALIDATING_VERSION] || 0;\n // increment the next version\n template[NEXT_VERSION] = (template[NEXT_VERSION] || 0) + 1;\n}\n\n/**\n * @param {string} elementName\n * @return {boolean}\n */\nexport function isValid(elementName) {\n let template = templateMap[elementName];\n if (template) {\n return templateIsValid(template);\n }\n return true;\n}\n\n/**\n * @param {HTMLTemplateElement} template\n * @return {boolean}\n */\nexport function templateIsValid(template) {\n return template[CURRENT_VERSION] === template[NEXT_VERSION];\n}\n\n/**\n * @param {string} elementName\n * @return {boolean}\n */\nexport function isValidating(elementName) {\n let template = templateMap[elementName];\n if (template) {\n return templateIsValidating(template);\n }\n return false;\n}\n\n/**\n * Returns true if the template is currently invalid and `startValidating` has been called since the last invalidation.\n * If false, the template must be validated.\n * @param {HTMLTemplateElement} template\n * @return {boolean}\n */\nexport function templateIsValidating(template) {\n return !templateIsValid(template) && template[VALIDATING_VERSION] === template[NEXT_VERSION];\n}\n\n/**\n * the template is marked as `validating` for one microtask so that all instances\n * found in the tree crawl of `applyStyle` will update themselves,\n * but the template will only be updated once.\n * @param {string} elementName\n*/\nexport function startValidating(elementName) {\n let template = templateMap[elementName];\n startValidatingTemplate(template);\n}\n\n/**\n * Begin an asynchronous invalidation cycle.\n * This should be called after every validation of a template\n *\n * After one microtask, the template will be marked as valid until the next call to `invalidateTemplate`\n * @param {HTMLTemplateElement} template\n */\nexport function startValidatingTemplate(template) {\n // remember that the current \"next version\" is the reason for this validation cycle\n template[VALIDATING_VERSION] = template[NEXT_VERSION];\n // however, there only needs to be one async task to clear the counters\n if (!template._validating) {\n template._validating = true;\n promise.then(function() {\n // sync the current version to let future invalidations cause a refresh cycle\n template[CURRENT_VERSION] = template[NEXT_VERSION];\n template._validating = false;\n });\n }\n}\n\n/**\n * @return {boolean}\n */\nexport function elementsAreInvalid() {\n for (let elementName in templateMap) {\n let template = templateMap[elementName];\n if (!templateIsValid(template)) {\n return true;\n }\n }\n return false;\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nexport const nativeShadow = !(window['ShadyDOM'] && window['ShadyDOM']['inUse']);\nlet nativeCssVariables_;\n\n/**\n * @param {(ShadyCSSOptions | ShadyCSSInterface)=} settings\n */\nfunction calcCssVariables(settings) {\n if (settings && settings['shimcssproperties']) {\n nativeCssVariables_ = false;\n } else {\n // chrome 49 has semi-working css vars, check if box-shadow works\n // safari 9.1 has a recalc bug: https://bugs.webkit.org/show_bug.cgi?id=155782\n // However, shim css custom properties are only supported with ShadyDOM enabled,\n // so fall back on native if we do not detect ShadyDOM\n // Edge 15: custom properties used in ::before and ::after will also be used in the parent element\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12414257/\n nativeCssVariables_ = nativeShadow || Boolean(!navigator.userAgent.match(/AppleWebKit\\/601|Edge\\/15/) &&\n window.CSS && CSS.supports && CSS.supports('box-shadow', '0 0 0 var(--foo)'));\n }\n}\n\nif (window.ShadyCSS && window.ShadyCSS.nativeCss !== undefined) {\n nativeCssVariables_ = window.ShadyCSS.nativeCss;\n} else if (window.ShadyCSS) {\n calcCssVariables(window.ShadyCSS);\n // reset window variable to let ShadyCSS API take its place\n window.ShadyCSS = undefined;\n} else {\n calcCssVariables(window['WebComponents'] && window['WebComponents']['flags']);\n}\n\n// Hack for type error under new type inference which doesn't like that\n// nativeCssVariables is updated in a function and assigns the type\n// `function(): ?` instead of `boolean`.\nexport const nativeCssVariables = /** @type {boolean} */(nativeCssVariables_);\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nexport const VAR_ASSIGN = /(?:^|[;\\s{]\\s*)(--[\\w-]*?)\\s*:\\s*(?:((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^)]*?\\)|[^};{])+)|\\{([^}]*)\\}(?:(?=[;\\s}])|$))/gi;\nexport const MIXIN_MATCH = /(?:^|\\W+)@apply\\s*\\(?([^);\\n]*)\\)?/gi;\nexport const VAR_CONSUMED = /(--[\\w-]+)\\s*([:,;)]|$)/gi;\nexport const ANIMATION_MATCH = /(animation\\s*:)|(animation-name\\s*:)/;\nexport const MEDIA_MATCH = /@media\\s(.*)/;\nexport const IS_VAR = /^--/;\nexport const BRACKETED = /\\{[^}]*\\}/g;\nexport const HOST_PREFIX = '(?:^|[^.#[:])';\nexport const HOST_SUFFIX = '($|[.:[\\\\s>+~])';\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/** @type {!Set<string>} */\nconst styleTextSet = new Set();\n\nexport const scopingAttribute = 'shady-unscoped';\n\n/**\n * Add a specifically-marked style to the document directly, and only one copy of that style.\n *\n * @param {!HTMLStyleElement} style\n * @return {undefined}\n */\nexport function processUnscopedStyle(style) {\n const text = style.textContent;\n if (!styleTextSet.has(text)) {\n styleTextSet.add(text);\n const newStyle = style.cloneNode(true);\n document.head.appendChild(newStyle);\n }\n}\n\n/**\n * Check if a style is supposed to be unscoped\n * @param {!HTMLStyleElement} style\n * @return {boolean} true if the style has the unscoping attribute\n */\nexport function isUnscopedStyle(style) {\n return style.hasAttribute(scopingAttribute);\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {nativeShadow, nativeCssVariables} from './style-settings.js';\nimport {parse, stringify, types, StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\nimport {MEDIA_MATCH} from './common-regex.js';\nimport {processUnscopedStyle, isUnscopedStyle} from './unscoped-style-handler.js';\n\n/**\n * @param {string|StyleNode} rules\n * @param {function(StyleNode)=} callback\n * @return {string}\n */\nexport function toCssText (rules, callback) {\n if (!rules) {\n return '';\n }\n if (typeof rules === 'string') {\n rules = parse(rules);\n }\n if (callback) {\n forEachRule(rules, callback);\n }\n return stringify(rules, nativeCssVariables);\n}\n\n/**\n * @param {HTMLStyleElement} style\n * @return {StyleNode}\n */\nexport function rulesForStyle(style) {\n if (!style['__cssRules'] && style.textContent) {\n style['__cssRules'] = parse(style.textContent);\n }\n return style['__cssRules'] || null;\n}\n\n// Tests if a rule is a keyframes selector, which looks almost exactly\n// like a normal selector but is not (it has nothing to do with scoping\n// for example).\n/**\n * @param {StyleNode} rule\n * @return {boolean}\n */\nexport function isKeyframesSelector(rule) {\n return Boolean(rule['parent']) &&\n rule['parent']['type'] === types.KEYFRAMES_RULE;\n}\n\n/**\n * @param {StyleNode} node\n * @param {Function=} styleRuleCallback\n * @param {Function=} keyframesRuleCallback\n * @param {boolean=} onlyActiveRules\n */\nexport function forEachRule(node, styleRuleCallback, keyframesRuleCallback, onlyActiveRules) {\n if (!node) {\n return;\n }\n let skipRules = false;\n let type = node['type'];\n if (onlyActiveRules) {\n if (type === types.MEDIA_RULE) {\n let matchMedia = node['selector'].match(MEDIA_MATCH);\n if (matchMedia) {\n // if rule is a non matching @media rule, skip subrules\n if (!window.matchMedia(matchMedia[1]).matches) {\n skipRules = true;\n }\n }\n }\n }\n if (type === types.STYLE_RULE) {\n styleRuleCallback(node);\n } else if (keyframesRuleCallback &&\n type === types.KEYFRAMES_RULE) {\n keyframesRuleCallback(node);\n } else if (type === types.MIXIN_RULE) {\n skipRules = true;\n }\n let r$ = node['rules'];\n if (r$ && !skipRules) {\n for (let i=0, l=r$.length, r; (i<l) && (r=r$[i]); i++) {\n forEachRule(r, styleRuleCallback, keyframesRuleCallback, onlyActiveRules);\n }\n }\n}\n\n// add a string of cssText to the document.\n/**\n * @param {string} cssText\n * @param {string} moniker\n * @param {Node} target\n * @param {Node} contextNode\n * @return {HTMLStyleElement}\n */\nexport function applyCss(cssText, moniker, target, contextNode) {\n let style = createScopeStyle(cssText, moniker);\n applyStyle(style, target, contextNode);\n return style;\n}\n\n/**\n * @param {string} cssText\n * @param {string} moniker\n * @return {HTMLStyleElement}\n */\nexport function createScopeStyle(cssText, moniker) {\n let style = /** @type {HTMLStyleElement} */(document.createElement('style'));\n if (moniker) {\n style.setAttribute('scope', moniker);\n }\n style.textContent = cssText;\n return style;\n}\n\n/**\n * Track the position of the last added style for placing placeholders\n * @type {Node}\n */\nlet lastHeadApplyNode = null;\n\n// insert a comment node as a styling position placeholder.\n/**\n * @param {string} moniker\n * @return {!Comment}\n */\nexport function applyStylePlaceHolder(moniker) {\n let placeHolder = document.createComment(' Shady DOM styles for ' +\n moniker + ' ');\n let after = lastHeadApplyNode ?\n lastHeadApplyNode['nextSibling'] : null;\n let scope = document.head;\n scope.insertBefore(placeHolder, after || scope.firstChild);\n lastHeadApplyNode = placeHolder;\n return placeHolder;\n}\n\n/**\n * @param {HTMLStyleElement} style\n * @param {?Node} target\n * @param {?Node} contextNode\n */\nexport function applyStyle(style, target, contextNode) {\n target = target || document.head;\n let after = (contextNode && contextNode.nextSibling) ||\n target.firstChild;\n target.insertBefore(style, after);\n if (!lastHeadApplyNode) {\n lastHeadApplyNode = style;\n } else {\n // only update lastHeadApplyNode if the new style is inserted after the old lastHeadApplyNode\n let position = style.compareDocumentPosition(lastHeadApplyNode);\n if (position === Node.DOCUMENT_POSITION_PRECEDING) {\n lastHeadApplyNode = style;\n }\n }\n}\n\n/**\n * @param {string} buildType\n * @return {boolean}\n */\nexport function isTargetedBuild(buildType) {\n return nativeShadow ? buildType === 'shadow' : buildType === 'shady';\n}\n\n/**\n * @param {Element} element\n * @return {?string}\n */\nexport function getCssBuildType(element) {\n return element.getAttribute('css-build');\n}\n\n/**\n * Walk from text[start] matching parens and\n * returns position of the outer end paren\n * @param {string} text\n * @param {number} start\n * @return {number}\n */\nfunction findMatchingParen(text, start) {\n let level = 0;\n for (let i=start, l=text.length; i < l; i++) {\n if (text[i] === '(') {\n level++;\n } else if (text[i] === ')') {\n if (--level === 0) {\n return i;\n }\n }\n }\n return -1;\n}\n\n/**\n * @param {string} str\n * @param {function(string, string, string, string)} callback\n */\nexport function processVariableAndFallback(str, callback) {\n // find 'var('\n let start = str.indexOf('var(');\n if (start === -1) {\n // no var?, everything is prefix\n return callback(str, '', '', '');\n }\n //${prefix}var(${inner})${suffix}\n let end = findMatchingParen(str, start + 3);\n let inner = str.substring(start + 4, end);\n let prefix = str.substring(0, start);\n // suffix may have other variables\n let suffix = processVariableAndFallback(str.substring(end + 1), callback);\n let comma = inner.indexOf(',');\n // value and fallback args should be trimmed to match in property lookup\n if (comma === -1) {\n // variable, no fallback\n return callback(prefix, inner.trim(), '', suffix);\n }\n // var(${value},${fallback})\n let value = inner.substring(0, comma).trim();\n let fallback = inner.substring(comma + 1).trim();\n return callback(prefix, value, fallback, suffix);\n}\n\n/**\n * @param {Element} element\n * @param {string} value\n */\nexport function setElementClassRaw(element, value) {\n // use native setAttribute provided by ShadyDOM when setAttribute is patched\n if (nativeShadow) {\n element.setAttribute('class', value);\n } else {\n window['ShadyDOM']['nativeMethods']['setAttribute'].call(element, 'class', value);\n }\n}\n\n/**\n * @param {Element | {is: string, extends: string}} element\n * @return {{is: string, typeExtension: string}}\n */\nexport function getIsExtends(element) {\n let localName = element['localName'];\n let is = '', typeExtension = '';\n /*\n NOTE: technically, this can be wrong for certain svg elements\n with `-` in the name like `<font-face>`\n */\n if (localName) {\n if (localName.indexOf('-') > -1) {\n is = localName;\n } else {\n typeExtension = localName;\n is = (element.getAttribute && element.getAttribute('is')) || '';\n }\n } else {\n is = /** @type {?} */(element).is;\n typeExtension = /** @type {?} */(element).extends;\n }\n return {is, typeExtension};\n}\n\n/**\n * @param {Element|DocumentFragment} element\n * @return {string}\n */\nexport function gatherStyleText(element) {\n /** @type {!Array<string>} */\n const styleTextParts = [];\n const styles = /** @type {!NodeList<!HTMLStyleElement>} */(element.querySelectorAll('style'));\n for (let i = 0; i < styles.length; i++) {\n const style = styles[i];\n if (isUnscopedStyle(style)) {\n if (!nativeShadow) {\n processUnscopedStyle(style);\n style.parentNode.removeChild(style);\n }\n } else {\n styleTextParts.push(style.textContent);\n style.parentNode.removeChild(style);\n }\n }\n return styleTextParts.join('').trim();\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n/*\n * The apply shim simulates the behavior of `@apply` proposed at\n * https://tabatkins.github.io/specs/css-apply-rule/.\n * The approach is to convert a property like this:\n *\n * --foo: {color: red; background: blue;}\n *\n * to this:\n *\n * --foo_-_color: red;\n * --foo_-_background: blue;\n *\n * Then where `@apply --foo` is used, that is converted to:\n *\n * color: var(--foo_-_color);\n * background: var(--foo_-_background);\n *\n * This approach generally works but there are some issues and limitations.\n * Consider, for example, that somewhere *between* where `--foo` is set and used,\n * another element sets it to:\n *\n * --foo: { border: 2px solid red; }\n *\n * We must now ensure that the color and background from the previous setting\n * do not apply. This is accomplished by changing the property set to this:\n *\n * --foo_-_border: 2px solid red;\n * --foo_-_color: initial;\n * --foo_-_background: initial;\n *\n * This works but introduces one new issue.\n * Consider this setup at the point where the `@apply` is used:\n *\n * background: orange;\n * `@apply` --foo;\n *\n * In this case the background will be unset (initial) rather than the desired\n * `orange`. We address this by altering the property set to use a fallback\n * value like this:\n *\n * color: var(--foo_-_color);\n * background: var(--foo_-_background, orange);\n * border: var(--foo_-_border);\n *\n * Note that the default is retained in the property set and the `background` is\n * the desired `orange`. This leads us to a limitation.\n *\n * Limitation 1:\n\n * Only properties in the rule where the `@apply`\n * is used are considered as default values.\n * If another rule matches the element and sets `background` with\n * less specificity than the rule in which `@apply` appears,\n * the `background` will not be set.\n *\n * Limitation 2:\n *\n * When using Polymer's `updateStyles` api, new properties may not be set for\n * `@apply` properties.\n\n*/\n\n'use strict';\n\nimport {forEachRule, processVariableAndFallback, rulesForStyle, toCssText, gatherStyleText} from './style-util.js';\nimport {MIXIN_MATCH, VAR_ASSIGN} from './common-regex.js';\nimport {detectMixin} from './common-utils.js';\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\n\nconst APPLY_NAME_CLEAN = /;\\s*/m;\nconst INITIAL_INHERIT = /^\\s*(initial)|(inherit)\\s*$/;\nconst IMPORTANT = /\\s*!important/;\n\n// separator used between mixin-name and mixin-property-name when producing properties\n// NOTE: plain '-' may cause collisions in user styles\nconst MIXIN_VAR_SEP = '_-_';\n\n/**\n * @typedef {!Object<string, string>}\n */\nlet PropertyEntry; // eslint-disable-line no-unused-vars\n\n/**\n * @typedef {!Object<string, boolean>}\n */\nlet DependantsEntry; // eslint-disable-line no-unused-vars\n\n/** @typedef {{\n * properties: PropertyEntry,\n * dependants: DependantsEntry\n * }}\n */\nlet MixinMapEntry; // eslint-disable-line no-unused-vars\n\n// map of mixin to property names\n// --foo: {border: 2px} -> {properties: {(--foo, ['border'])}, dependants: {'element-name': proto}}\nclass MixinMap {\n constructor() {\n /** @type {!Object<string, !MixinMapEntry>} */\n this._map = {};\n }\n /**\n * @param {string} name\n * @param {!PropertyEntry} props\n */\n set(name, props) {\n name = name.trim();\n this._map[name] = {\n properties: props,\n dependants: {}\n }\n }\n /**\n * @param {string} name\n * @return {MixinMapEntry}\n */\n get(name) {\n name = name.trim();\n return this._map[name] || null;\n }\n}\n\n/**\n * Callback for when an element is marked invalid\n * @type {?function(string)}\n */\nlet invalidCallback = null;\n\n/** @unrestricted */\nclass ApplyShim {\n constructor() {\n /** @type {?string} */\n this._currentElement = null;\n /** @type {HTMLMetaElement} */\n this._measureElement = null;\n this._map = new MixinMap();\n }\n /**\n * return true if `cssText` contains a mixin definition or consumption\n * @param {string} cssText\n * @return {boolean}\n */\n detectMixin(cssText) {\n return detectMixin(cssText);\n }\n\n /**\n * Gather styles into one style for easier processing\n * @param {!HTMLTemplateElement} template\n * @return {HTMLStyleElement}\n */\n gatherStyles(template) {\n const styleText = gatherStyleText(template.content);\n if (styleText) {\n const style = /** @type {!HTMLStyleElement} */(document.createElement('style'));\n style.textContent = styleText;\n template.content.insertBefore(style, template.content.firstChild);\n return style;\n }\n return null;\n }\n /**\n * @param {!HTMLTemplateElement} template\n * @param {string} elementName\n * @return {StyleNode}\n */\n transformTemplate(template, elementName) {\n if (template._gatheredStyle === undefined) {\n template._gatheredStyle = this.gatherStyles(template);\n }\n /** @type {HTMLStyleElement} */\n const style = template._gatheredStyle;\n return style ? this.transformStyle(style, elementName) : null;\n }\n /**\n * @param {!HTMLStyleElement} style\n * @param {string} elementName\n * @return {StyleNode}\n */\n transformStyle(style, elementName = '') {\n let ast = rulesForStyle(style);\n this.transformRules(ast, elementName);\n style.textContent = toCssText(ast);\n return ast;\n }\n /**\n * @param {!HTMLStyleElement} style\n * @return {StyleNode}\n */\n transformCustomStyle(style) {\n let ast = rulesForStyle(style);\n forEachRule(ast, (rule) => {\n if (rule['selector'] === ':root') {\n rule['selector'] = 'html';\n }\n this.transformRule(rule);\n })\n style.textContent = toCssText(ast);\n return ast;\n }\n /**\n * @param {StyleNode} rules\n * @param {string} elementName\n */\n transformRules(rules, elementName) {\n this._currentElement = elementName;\n forEachRule(rules, (r) => {\n this.transformRule(r);\n });\n this._currentElement = null;\n }\n /**\n * @param {!StyleNode} rule\n */\n transformRule(rule) {\n rule['cssText'] = this.transformCssText(rule['parsedCssText']);\n // :root was only used for variable assignment in property shim,\n // but generates invalid selectors with real properties.\n // replace with `:host > *`, which serves the same effect\n if (rule['selector'] === ':root') {\n rule['selector'] = ':host > *';\n }\n }\n /**\n * @param {string} cssText\n * @return {string}\n */\n transformCssText(cssText) {\n // produce variables\n cssText = cssText.replace(VAR_ASSIGN, (matchText, propertyName, valueProperty, valueMixin) =>\n this._produceCssProperties(matchText, propertyName, valueProperty, valueMixin));\n // consume mixins\n return this._consumeCssProperties(cssText);\n }\n /**\n * @param {string} property\n * @return {string}\n */\n _getInitialValueForProperty(property) {\n if (!this._measureElement) {\n this._measureElement = /** @type {HTMLMetaElement} */(document.createElement('meta'));\n this._measureElement.setAttribute('apply-shim-measure', '');\n this._measureElement.style.all = 'initial';\n document.head.appendChild(this._measureElement);\n }\n return window.getComputedStyle(this._measureElement).getPropertyValue(property);\n }\n /**\n * replace mixin consumption with variable consumption\n * @param {string} text\n * @return {string}\n */\n _consumeCssProperties(text) {\n /** @type {Array} */\n let m = null;\n // loop over text until all mixins with defintions have been applied\n while((m = MIXIN_MATCH.exec(text))) {\n let matchText = m[0];\n let mixinName = m[1];\n let idx = m.index;\n // collect properties before apply to be \"defaults\" if mixin might override them\n // match includes a \"prefix\", so find the start and end positions of @apply\n let applyPos = idx + matchText.indexOf('@apply');\n let afterApplyPos = idx + matchText.length;\n // find props defined before this @apply\n let textBeforeApply = text.slice(0, applyPos);\n let textAfterApply = text.slice(afterApplyPos);\n let defaults = this._cssTextToMap(textBeforeApply);\n let replacement = this._atApplyToCssProperties(mixinName, defaults);\n // use regex match position to replace mixin, keep linear processing time\n text = `${textBeforeApply}${replacement}${textAfterApply}`;\n // move regex search to _after_ replacement\n MIXIN_MATCH.lastIndex = idx + replacement.length;\n }\n return text;\n }\n /**\n * produce variable consumption at the site of mixin consumption\n * `@apply` --foo; -> for all props (${propname}: var(--foo_-_${propname}, ${fallback[propname]}}))\n * Example:\n * border: var(--foo_-_border); padding: var(--foo_-_padding, 2px)\n *\n * @param {string} mixinName\n * @param {Object} fallbacks\n * @return {string}\n */\n _atApplyToCssProperties(mixinName, fallbacks) {\n mixinName = mixinName.replace(APPLY_NAME_CLEAN, '');\n let vars = [];\n let mixinEntry = this._map.get(mixinName);\n // if we depend on a mixin before it is created\n // make a sentinel entry in the map to add this element as a dependency for when it is defined.\n if (!mixinEntry) {\n this._map.set(mixinName, {});\n mixinEntry = this._map.get(mixinName);\n }\n if (mixinEntry) {\n if (this._currentElement) {\n mixinEntry.dependants[this._currentElement] = true;\n }\n let p, parts, f;\n const properties = mixinEntry.properties;\n for (p in properties) {\n f = fallbacks && fallbacks[p];\n parts = [p, ': var(', mixinName, MIXIN_VAR_SEP, p];\n if (f) {\n parts.push(',', f.replace(IMPORTANT, ''));\n }\n parts.push(')');\n if (IMPORTANT.test(properties[p])) {\n parts.push(' !important');\n }\n vars.push(parts.join(''));\n }\n }\n return vars.join('; ');\n }\n\n /**\n * @param {string} property\n * @param {string} value\n * @return {string}\n */\n _replaceInitialOrInherit(property, value) {\n let match = INITIAL_INHERIT.exec(value);\n if (match) {\n if (match[1]) {\n // initial\n // replace `initial` with the concrete initial value for this property\n value = this._getInitialValueForProperty(property);\n } else {\n // inherit\n // with this purposfully illegal value, the variable will be invalid at\n // compute time (https://www.w3.org/TR/css-variables/#invalid-at-computed-value-time)\n // and for inheriting values, will behave similarly\n // we cannot support the same behavior for non inheriting values like 'border'\n value = 'apply-shim-inherit';\n }\n }\n return value;\n }\n\n /**\n * \"parse\" a mixin definition into a map of properties and values\n * cssTextToMap('border: 2px solid black') -> ('border', '2px solid black')\n * @param {string} text\n * @return {!Object<string, string>}\n */\n _cssTextToMap(text) {\n let props = text.split(';');\n let property, value;\n let out = {};\n for (let i = 0, p, sp; i < props.length; i++) {\n p = props[i];\n if (p) {\n sp = p.split(':');\n // ignore lines that aren't definitions like @media\n if (sp.length > 1) {\n property = sp[0].trim();\n // some properties may have ':' in the value, like data urls\n value = this._replaceInitialOrInherit(property, sp.slice(1).join(':'));\n out[property] = value;\n }\n }\n }\n return out;\n }\n\n /**\n * @param {MixinMapEntry} mixinEntry\n */\n _invalidateMixinEntry(mixinEntry) {\n if (!invalidCallback) {\n return;\n }\n for (let elementName in mixinEntry.dependants) {\n if (elementName !== this._currentElement) {\n invalidCallback(elementName);\n }\n }\n }\n\n /**\n * @param {string} matchText\n * @param {string} propertyName\n * @param {?string} valueProperty\n * @param {?string} valueMixin\n * @return {string}\n */\n _produceCssProperties(matchText, propertyName, valueProperty, valueMixin) {\n // handle case where property value is a mixin\n if (valueProperty) {\n // form: --mixin2: var(--mixin1), where --mixin1 is in the map\n processVariableAndFallback(valueProperty, (prefix, value) => {\n if (value && this._map.get(value)) {\n valueMixin = `@apply ${value};`\n }\n });\n }\n if (!valueMixin) {\n return matchText;\n }\n let mixinAsProperties = this._consumeCssProperties('' + valueMixin);\n let prefix = matchText.slice(0, matchText.indexOf('--'));\n let mixinValues = this._cssTextToMap(mixinAsProperties);\n let combinedProps = mixinValues;\n let mixinEntry = this._map.get(propertyName);\n let oldProps = mixinEntry && mixinEntry.properties;\n if (oldProps) {\n // NOTE: since we use mixin, the map of properties is updated here\n // and this is what we want.\n combinedProps = Object.assign(Object.create(oldProps), mixinValues);\n } else {\n this._map.set(propertyName, combinedProps);\n }\n let out = [];\n let p, v;\n // set variables defined by current mixin\n let needToInvalidate = false;\n for (p in combinedProps) {\n v = mixinValues[p];\n // if property not defined by current mixin, set initial\n if (v === undefined) {\n v = 'initial';\n }\n if (oldProps && !(p in oldProps)) {\n needToInvalidate = true;\n }\n out.push(`${propertyName}${MIXIN_VAR_SEP}${p}: ${v}`);\n }\n if (needToInvalidate) {\n this._invalidateMixinEntry(mixinEntry);\n }\n if (mixinEntry) {\n mixinEntry.properties = combinedProps;\n }\n // because the mixinMap is global, the mixin might conflict with\n // a different scope's simple variable definition:\n // Example:\n // some style somewhere:\n // --mixin1:{ ... }\n // --mixin2: var(--mixin1);\n // some other element:\n // --mixin1: 10px solid red;\n // --foo: var(--mixin1);\n // In this case, we leave the original variable definition in place.\n if (valueProperty) {\n prefix = `${matchText};${prefix}`;\n }\n return `${prefix}${out.join('; ')};`;\n }\n}\n\n/* exports */\nApplyShim.prototype['detectMixin'] = ApplyShim.prototype.detectMixin;\nApplyShim.prototype['transformStyle'] = ApplyShim.prototype.transformStyle;\nApplyShim.prototype['transformCustomStyle'] = ApplyShim.prototype.transformCustomStyle;\nApplyShim.prototype['transformRules'] = ApplyShim.prototype.transformRules;\nApplyShim.prototype['transformRule'] = ApplyShim.prototype.transformRule;\nApplyShim.prototype['transformTemplate'] = ApplyShim.prototype.transformTemplate;\nApplyShim.prototype['_separator'] = MIXIN_VAR_SEP;\nObject.defineProperty(ApplyShim.prototype, 'invalidCallback', {\n /** @return {?function(string)} */\n get() {\n return invalidCallback;\n },\n /** @param {?function(string)} cb */\n set(cb) {\n invalidCallback = cb;\n }\n});\n\nexport default ApplyShim;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport { MIXIN_MATCH, VAR_ASSIGN } from './common-regex.js';\n\n/**\n * @param {Element} element\n * @param {Object=} properties\n */\nexport function updateNativeProperties(element, properties) {\n // remove previous properties\n for (let p in properties) {\n // NOTE: for bc with shim, don't apply null values.\n if (p === null) {\n element.style.removeProperty(p);\n } else {\n element.style.setProperty(p, properties[p]);\n }\n }\n}\n\n/**\n * @param {Element} element\n * @param {string} property\n * @return {string}\n */\nexport function getComputedStyleValue(element, property) {\n /**\n * @const {string}\n */\n const value = window.getComputedStyle(element).getPropertyValue(property);\n if (!value) {\n return '';\n } else {\n return value.trim();\n }\n}\n\n/**\n * return true if `cssText` contains a mixin definition or consumption\n * @param {string} cssText\n * @return {boolean}\n */\nexport function detectMixin(cssText) {\n const has = MIXIN_MATCH.test(cssText) || VAR_ASSIGN.test(cssText);\n // reset state of the regexes\n MIXIN_MATCH.lastIndex = 0;\n VAR_ASSIGN.lastIndex = 0;\n return has;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport ApplyShim from '../src/apply-shim.js';\nimport templateMap from '../src/template-map.js';\nimport {getIsExtends, toCssText} from '../src/style-util.js';\nimport * as ApplyShimUtils from '../src/apply-shim-utils.js';\nimport {getComputedStyleValue, updateNativeProperties} from '../src/common-utils.js';\nimport {CustomStyleInterfaceInterface} from '../src/custom-style-interface.js'; // eslint-disable-line no-unused-vars\nimport {nativeCssVariables, nativeShadow} from '../src/style-settings.js';\n\n/** @const {ApplyShim} */\nconst applyShim = new ApplyShim();\n\nclass ApplyShimInterface {\n constructor() {\n /** @type {?CustomStyleInterfaceInterface} */\n this.customStyleInterface = null;\n applyShim['invalidCallback'] = ApplyShimUtils.invalidate;\n }\n ensure() {\n if (this.customStyleInterface) {\n return;\n }\n this.customStyleInterface = window.ShadyCSS.CustomStyleInterface;\n if (this.customStyleInterface) {\n this.customStyleInterface['transformCallback'] = (style) => {\n applyShim.transformCustomStyle(style);\n };\n this.customStyleInterface['validateCallback'] = () => {\n requestAnimationFrame(() => {\n if (this.customStyleInterface['enqueued']) {\n this.flushCustomStyles();\n }\n });\n }\n }\n }\n /**\n * @param {!HTMLTemplateElement} template\n * @param {string} elementName\n */\n prepareTemplate(template, elementName) {\n this.ensure();\n templateMap[elementName] = template;\n let ast = applyShim.transformTemplate(template, elementName);\n // save original style ast to use for revalidating instances\n template['_styleAst'] = ast;\n }\n flushCustomStyles() {\n this.ensure();\n if (!this.customStyleInterface) {\n return;\n }\n let styles = this.customStyleInterface['processStyles']();\n if (!this.customStyleInterface['enqueued']) {\n return;\n }\n for (let i = 0; i < styles.length; i++ ) {\n let cs = styles[i];\n let style = this.customStyleInterface['getStyleForCustomStyle'](cs);\n if (style) {\n applyShim.transformCustomStyle(style);\n }\n }\n this.customStyleInterface['enqueued'] = false;\n }\n /**\n * @param {HTMLElement} element\n * @param {Object=} properties\n */\n styleSubtree(element, properties) {\n this.ensure();\n if (properties) {\n updateNativeProperties(element, properties);\n }\n if (element.shadowRoot) {\n this.styleElement(element);\n let shadowChildren = element.shadowRoot.children || element.shadowRoot.childNodes;\n for (let i = 0; i < shadowChildren.length; i++) {\n this.styleSubtree(/** @type {HTMLElement} */(shadowChildren[i]));\n }\n } else {\n let children = element.children || element.childNodes;\n for (let i = 0; i < children.length; i++) {\n this.styleSubtree(/** @type {HTMLElement} */(children[i]));\n }\n }\n }\n /**\n * @param {HTMLElement} element\n */\n styleElement(element) {\n this.ensure();\n let {is} = getIsExtends(element);\n let template = templateMap[is];\n if (template && !ApplyShimUtils.templateIsValid(template)) {\n // only revalidate template once\n if (!ApplyShimUtils.templateIsValidating(template)) {\n this.prepareTemplate(template, is);\n ApplyShimUtils.startValidatingTemplate(template);\n }\n // update this element instance\n let root = element.shadowRoot;\n if (root) {\n let style = /** @type {HTMLStyleElement} */(root.querySelector('style'));\n if (style) {\n // reuse the template's style ast, it has all the original css text\n style['__cssRules'] = template['_styleAst'];\n style.textContent = toCssText(template['_styleAst'])\n }\n }\n }\n }\n /**\n * @param {Object=} properties\n */\n styleDocument(properties) {\n this.ensure();\n this.styleSubtree(document.body, properties);\n }\n}\n\nif (!window.ShadyCSS || !window.ShadyCSS.ScopingShim) {\n const applyShimInterface = new ApplyShimInterface();\n let CustomStyleInterface = window.ShadyCSS && window.ShadyCSS.CustomStyleInterface;\n\n /** @suppress {duplicate} */\n window.ShadyCSS = {\n /**\n * @param {!HTMLTemplateElement} template\n * @param {string} elementName\n * @param {string=} elementExtends\n */\n prepareTemplate(template, elementName, elementExtends) { // eslint-disable-line no-unused-vars\n applyShimInterface.flushCustomStyles();\n applyShimInterface.prepareTemplate(template, elementName)\n },\n\n /**\n * @param {!HTMLElement} element\n * @param {Object=} properties\n */\n styleSubtree(element, properties) {\n applyShimInterface.flushCustomStyles();\n applyShimInterface.styleSubtree(element, properties);\n },\n\n /**\n * @param {!HTMLElement} element\n */\n styleElement(element) {\n applyShimInterface.flushCustomStyles();\n applyShimInterface.styleElement(element);\n },\n\n /**\n * @param {Object=} properties\n */\n styleDocument(properties) {\n applyShimInterface.flushCustomStyles();\n applyShimInterface.styleDocument(properties);\n },\n\n /**\n * @param {Element} element\n * @param {string} property\n * @return {string}\n */\n getComputedStyleValue(element, property) {\n return getComputedStyleValue(element, property);\n },\n\n flushCustomStyles() {\n applyShimInterface.flushCustomStyles();\n },\n\n nativeCss: nativeCssVariables,\n nativeShadow: nativeShadow\n };\n\n if (CustomStyleInterface) {\n window.ShadyCSS.CustomStyleInterface = CustomStyleInterface;\n }\n}\n\nwindow.ShadyCSS.ApplyShim = applyShim;\n"]} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/bower.json
new file mode 100644
index 00000000000..5d3a7d91727
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/bower.json
@@ -0,0 +1,36 @@
+{
+ "name": "shadycss",
+ "main": "scoping-shim.min.js",
+ "description": "Styling helpers for ShadyDOM",
+ "authors": [
+ "The Polymer Project Authors (https://polymer.github.io/AUTHORS.txt)"
+ ],
+ "license": "BSD-3-Clause",
+ "keywords": [
+ "shady-css",
+ "shadycss",
+ "shadow-css",
+ "shadowcss",
+ "web-components",
+ "webcomponents",
+ "polyfill",
+ "shim"
+ ],
+ "homepage": "https://webcomponents.org/polyfills",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests"
+ ],
+ "devDependencies": {
+ "web-component-tester": "^6",
+ "es6-promise": "stefanpenner/es6-promise#~4.1.0",
+ "template": "webcomponents/template#^1.0.0",
+ "html-imports": "webcomponents/html-imports#^1.0.0",
+ "custom-elements": "webcomponents/custom-elements#^1.0.0",
+ "shadydom": "webcomponents/shadydom#^1.0.0",
+ "webcomponents-platform": "webcomponents/webcomponents-platform#^1.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/custom-style-interface.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/custom-style-interface.html
new file mode 100644
index 00000000000..a3919fad810
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/custom-style-interface.html
@@ -0,0 +1,10 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<script src="custom-style-interface.min.js"></script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/custom-style-interface.min.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/custom-style-interface.min.js
new file mode 100644
index 00000000000..6e72026f7b5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/custom-style-interface.min.js
@@ -0,0 +1,14 @@
+(function(){/*
+
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+'use strict';var c=!(window.ShadyDOM&&window.ShadyDOM.inUse),f;function g(a){f=a&&a.shimcssproperties?!1:c||!(navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/)||!window.CSS||!CSS.supports||!CSS.supports("box-shadow","0 0 0 var(--foo)"))}window.ShadyCSS&&void 0!==window.ShadyCSS.nativeCss?f=window.ShadyCSS.nativeCss:window.ShadyCSS?(g(window.ShadyCSS),window.ShadyCSS=void 0):g(window.WebComponents&&window.WebComponents.flags);var h=f;function k(a,b){for(var d in b)null===d?a.style.removeProperty(d):a.style.setProperty(d,b[d])};var l=null,m=window.HTMLImports&&window.HTMLImports.whenReady||null,n;function p(a){requestAnimationFrame(function(){m?m(a):(l||(l=new Promise(function(a){n=a}),"complete"===document.readyState?n():document.addEventListener("readystatechange",function(){"complete"===document.readyState&&n()})),l.then(function(){a&&a()}))})};var q=null,r=null;function t(){this.customStyles=[];this.enqueued=!1;p(function(){window.ShadyCSS.flushCustomStyles&&window.ShadyCSS.flushCustomStyles()})}function u(a){!a.enqueued&&r&&(a.enqueued=!0,p(r))}t.prototype.c=function(a){a.__seenByShadyCSS||(a.__seenByShadyCSS=!0,this.customStyles.push(a),u(this))};t.prototype.b=function(a){if(a.__shadyCSSCachedStyle)return a.__shadyCSSCachedStyle;var b;a.getStyle?b=a.getStyle():b=a;return b};
+t.prototype.a=function(){for(var a=this.customStyles,b=0;b<a.length;b++){var d=a[b];if(!d.__shadyCSSCachedStyle){var e=this.b(d);e&&(e=e.__appliedElement||e,q&&q(e),d.__shadyCSSCachedStyle=e)}}return a};t.prototype.addCustomStyle=t.prototype.c;t.prototype.getStyleForCustomStyle=t.prototype.b;t.prototype.processStyles=t.prototype.a;
+Object.defineProperties(t.prototype,{transformCallback:{get:function(){return q},set:function(a){q=a}},validateCallback:{get:function(){return r},set:function(a){var b=!1;r||(b=!0);r=a;b&&u(this)}}});var v=new t;window.ShadyCSS||(window.ShadyCSS={prepareTemplate:function(){},styleSubtree:function(a,b){v.a();k(a,b)},styleElement:function(){v.a()},styleDocument:function(a){v.a();k(document.body,a)},getComputedStyleValue:function(a,b){return(a=window.getComputedStyle(a).getPropertyValue(b))?a.trim():""},flushCustomStyles:function(){},nativeCss:h,nativeShadow:c});window.ShadyCSS.CustomStyleInterface=v;}).call(this);
+
+//# sourceMappingURL=custom-style-interface.min.js.map
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/custom-style-interface.min.js.map b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/custom-style-interface.min.js.map
new file mode 100644
index 00000000000..e0cfd81f901
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/custom-style-interface.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["src/style-settings.js","src/common-utils.js","src/document-wait.js","src/custom-style-interface.js","entrypoints/custom-style-interface.js"],"names":["nativeShadow","window","nativeCssVariables_","calcCssVariables","settings","navigator","userAgent","match","CSS","supports","ShadyCSS","undefined","nativeCss","nativeCssVariables","updateNativeProperties","element","properties","p","style","removeProperty","setProperty","readyPromise","whenReady","resolveFn","documentWait","callback","requestAnimationFrame","Promise","resolve","document","readyState","addEventListener","then","transformFn","validateFn","constructor","CustomStyleInterface","enqueueDocumentValidation","addCustomStyle","push","getStyleForCustomStyle","customStyle","processStyles","cs","i","length","styleToTransform","prototype","Object","defineProperties","get","set","fn","needsEnqueue","customStyleInterface","prepareTemplate","styleSubtree","styleElement","styleDocument","body","getComputedStyleValue","property","value","getComputedStyle","getPropertyValue","trim","flushCustomStyles"],"mappings":"A;;;;;;;;;aAYO,IAAMA,EAAe,EAAEC,MAAA,SAAF,EAAwBA,MAAA,SAAA,MAAxB,CAArB,CACHC,CAKJC,SAASA,EAAgB,CAACC,CAAD,CAAW,CAEhCF,CAAA,CADEE,CAAJ,EAAgBA,CAAA,kBAAhB,CACwB,CAAA,CADxB,CASwBJ,CATxB,EASwC,EAASK,SAAAC,UAAAC,MAAA,CAA0B,2BAA1B,CAAT,EACpCC,CAAAP,MAAAO,IADoC,EACtBC,CAAAD,GAAAC,SADsB,EACN,CAAAD,GAAAC,SAAA,CAAa,YAAb,CAA2B,kBAA3B,CADM,CAVN,CAehCR,MAAAS,SAAJ,EAAqDC,IAAAA,EAArD,GAAuBV,MAAAS,SAAAE,UAAvB,CACEV,CADF,CACwBD,MAAAS,SAAAE,UADxB,CAEWX,MAAAS,SAAJ,EACLP,CAAA,CAAiBF,MAAAS,SAAjB,CAEA,CAAAT,MAAAS,SAAA,CAAkBC,IAAAA,EAHb,EAKLR,CAAA,CAAiBF,MAAA,cAAjB,EAA4CA,MAAA,cAAA,MAA5C,CAMK,KAAMY,EAA4CX,C,CC5BlDY,QAASA,EAAsB,CAACC,CAAD,CAAUC,CAAV,CAAsB,CAE1D,IAAKC,IAAIA,CAAT,GAAcD,EAAd,CAEY,IAAV,GAAIC,CAAJ,CACEF,CAAAG,MAAAC,eAAA,CAA6BF,CAA7B,CADF,CAGEF,CAAAG,MAAAE,YAAA,CAA0BH,CAA1B,CAA6BD,CAAA,CAAWC,CAAX,CAA7B,CAPsD,C,CCL5D,IAAII,EAAe,IAAnB,CAGIC,EAAYrB,MAAA,YAAZqB,EAAqCrB,MAAA,YAAA,UAArCqB,EAA2E,IAH/E,CAMIC,CAKWC,SAASA,EAAY,CAACC,CAAD,CAAW,CAC7CC,qBAAA,CAAsB,QAAQ,EAAG,CAC3BJ,CAAJ,CACEA,CAAA,CAAUG,CAAV,CADF,EAGOJ,CAYL,GAXEA,CACA,CADe,IAAIM,OAAJ,CAAY,QAAA,CAACC,CAAD,CAAa,CAACL,CAAA,CAAYK,CAAb,CAAzB,CACf,CAA4B,UAA5B,GAAIC,QAAAC,WAAJ,CACEP,CAAA,EADF,CAGEM,QAAAE,iBAAA,CAA0B,kBAA1B,CAA8C,QAAA,EAAM,CACtB,UAA5B,GAAIF,QAAAC,WAAJ,EACEP,CAAA,EAFgD,CAApD,CAOJ,EAAAF,CAAAW,KAAA,CAAkB,QAAQ,EAAE,CAAEP,CAAA,EAAYA,CAAA,EAAd,CAA5B,CAfF,CAD+B,CAAjC,CAD6C,C,CCD/C,IAAIQ,EAAc,IAAlB,CAGIC,EAAa,IAiBfC,SADmBC,EACR,EAAG,CAEZ,IAAA,aAAA,CAAuB,EACvB,KAAA,SAAA,CAAmB,CAAA,CDtBRZ,ECwBX,CAAa,QAAA,EAAM,CACbvB,MAAA,SAAA,kBAAJ,EACEA,MAAA,SAAA,kBAAA,EAFe,CAAnB,CALY,CAcdoC,QAAA,EAAyB,CAAzBA,CAAyB,CAAG,CACtB,CAAA,CAAA,SAAJ,EAAyBH,CAAzB,GAGA,CAAA,SACA,CADmB,CAAA,CACnB,CDtCWV,CCsCX,CAAaU,CAAb,CAJA,CAD0B,CAU5B,CAAA,UAAA,EAAA,CAAAI,QAAc,CAACpB,CAAD,CAAQ,CACfA,CAAA,iBAAL,GACEA,CAAA,iBAEA,CAFqB,CAAA,CAErB,CADA,IAAA,aAAAqB,KAAA,CAA0BrB,CAA1B,CACA,CAAAmB,CAAA,CAAAA,IAAA,CAHF,CADoB,CAWtB,EAAA,UAAA,EAAA,CAAAG,QAAsB,CAACC,CAAD,CAAc,CAClC,GAAIA,CAAA,sBAAJ,CACE,MAAOA,EAAA,sBAET,KAAIvB,CACAuB,EAAA,SAAJ,CACEvB,CADF,CACUuB,CAAA,SAAA,EADV,CAGEvB,CAHF,CAGUuB,CAEV,OAAOvB,EAV2B,CAepC;CAAA,UAAA,EAAA,CAAAwB,QAAa,EAAG,CAEd,IADA,IAAMC,EAAK,IAAA,aAAX,CACSC,EAAI,CAAb,CAAgBA,CAAhB,CAAoBD,CAAAE,OAApB,CAA+BD,CAAA,EAA/B,CAAoC,CAClC,IAAMH,EAAcE,CAAA,CAAGC,CAAH,CACpB,IAAI,CAAAH,CAAA,sBAAJ,CAAA,CAGA,IAAMvB,EAAQ,IAAAsB,EAAA,CAA4BC,CAA5B,CACVvB,EAAJ,GAGQ4B,CAIN,CAJ0D5B,CAAA,iBAI1D,EAJuFA,CAIvF,CAHIe,CAGJ,EAFEA,CAAA,CAAYa,CAAZ,CAEF,CAAAL,CAAA,sBAAA,CAA4BK,CAP9B,CAJA,CAFkC,CAgBpC,MAAOH,EAlBO,CAsBlBP,EAAAW,UAAA,eAAA,CAAmDX,CAAAW,UAAAT,EACnDF,EAAAW,UAAA,uBAAA,CAA2DX,CAAAW,UAAAP,EAC3DJ,EAAAW,UAAA,cAAA,CAAkDX,CAAAW,UAAAL,EAElDM;MAAAC,iBAAA,CAAwBb,CAAAW,UAAxB,CAAwD,CACtD,kBAAqB,CAEnB,IAAAG,QAAG,EAAG,CACJ,MAAOjB,EADH,CAFa,CAMnB,IAAAkB,QAAG,CAACC,CAAD,CAAK,CACNnB,CAAA,CAAcmB,CADR,CANW,CADiC,CAWtD,iBAAoB,CAElB,IAAAF,QAAG,EAAG,CACJ,MAAOhB,EADH,CAFY,CASlB,IAAAiB,QAAG,CAACC,CAAD,CAAK,CACN,IAAIC,EAAe,CAAA,CACdnB,EAAL,GACEmB,CADF,CACiB,CAAA,CADjB,CAGAnB,EAAA,CAAakB,CACTC,EAAJ,EACEhB,CAAA,CAAAA,IAAA,CAPI,CATU,CAXkC,CAAxD,C,CCvGA,IAAMiB,EAAuB,ID0BdlB,CCxBVnC,OAAAS,SAAL,GACET,MAAAS,SADF,CACoB,CAMhB,gBAAA6C,QAAe,EAAwC,EANvC,CAYhB,aAAAC,QAAY,CAACzC,CAAD,CAAUC,CAAV,CAAsB,CAChCsC,CAAAZ,EAAA,EHdU5B,EGeV,CAAuBC,CAAvB,CAAgCC,CAAhC,CAFgC,CAZlB,CAoBhB,aAAAyC,QAAY,EAAU,CACpBH,CAAAZ,EAAA,EADoB,CApBN,CA2BhB,cAAAgB,QAAa,CAAC1C,CAAD,CAAa,CACxBsC,CAAAZ,EAAA,EH7BU5B,EG8BV,CAAuBe,QAAA8B,KAAvB,CAAsC3C,CAAtC,CAFwB,CA3BV,CAqChB,sBAAA4C,QAAqB,CAAC7C,CAAD,CAAU8C,CAAV,CAAoB,CACvC,MHjBJ,CADMC,CACN,CADc7D,MAAA8D,iBAAA,CGkBmBhD,CHlBnB,CAAAiD,iBAAA,CGkB4BH,CHlB5B,CACd,EAGSC,CAAAG,KAAA,EAHT,CACS,EGekC,CArCzB,CAyChB,kBAAAC,QAAiB,EAAG,EAzCJ,CA0ChBtD,UJfSC,CI3BO,CA2ChBb,aJlDSA,CIOO,CADpB,CAgDAC,OAAAS,SAAA0B,qBAAA,CAAuCkB","file":"custom-style-interface.min.js","sourcesContent":["/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nexport const nativeShadow = !(window['ShadyDOM'] && window['ShadyDOM']['inUse']);\nlet nativeCssVariables_;\n\n/**\n * @param {(ShadyCSSOptions | ShadyCSSInterface)=} settings\n */\nfunction calcCssVariables(settings) {\n if (settings && settings['shimcssproperties']) {\n nativeCssVariables_ = false;\n } else {\n // chrome 49 has semi-working css vars, check if box-shadow works\n // safari 9.1 has a recalc bug: https://bugs.webkit.org/show_bug.cgi?id=155782\n // However, shim css custom properties are only supported with ShadyDOM enabled,\n // so fall back on native if we do not detect ShadyDOM\n // Edge 15: custom properties used in ::before and ::after will also be used in the parent element\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12414257/\n nativeCssVariables_ = nativeShadow || Boolean(!navigator.userAgent.match(/AppleWebKit\\/601|Edge\\/15/) &&\n window.CSS && CSS.supports && CSS.supports('box-shadow', '0 0 0 var(--foo)'));\n }\n}\n\nif (window.ShadyCSS && window.ShadyCSS.nativeCss !== undefined) {\n nativeCssVariables_ = window.ShadyCSS.nativeCss;\n} else if (window.ShadyCSS) {\n calcCssVariables(window.ShadyCSS);\n // reset window variable to let ShadyCSS API take its place\n window.ShadyCSS = undefined;\n} else {\n calcCssVariables(window['WebComponents'] && window['WebComponents']['flags']);\n}\n\n// Hack for type error under new type inference which doesn't like that\n// nativeCssVariables is updated in a function and assigns the type\n// `function(): ?` instead of `boolean`.\nexport const nativeCssVariables = /** @type {boolean} */(nativeCssVariables_);\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport { MIXIN_MATCH, VAR_ASSIGN } from './common-regex.js';\n\n/**\n * @param {Element} element\n * @param {Object=} properties\n */\nexport function updateNativeProperties(element, properties) {\n // remove previous properties\n for (let p in properties) {\n // NOTE: for bc with shim, don't apply null values.\n if (p === null) {\n element.style.removeProperty(p);\n } else {\n element.style.setProperty(p, properties[p]);\n }\n }\n}\n\n/**\n * @param {Element} element\n * @param {string} property\n * @return {string}\n */\nexport function getComputedStyleValue(element, property) {\n /**\n * @const {string}\n */\n const value = window.getComputedStyle(element).getPropertyValue(property);\n if (!value) {\n return '';\n } else {\n return value.trim();\n }\n}\n\n/**\n * return true if `cssText` contains a mixin definition or consumption\n * @param {string} cssText\n * @return {boolean}\n */\nexport function detectMixin(cssText) {\n const has = MIXIN_MATCH.test(cssText) || VAR_ASSIGN.test(cssText);\n // reset state of the regexes\n MIXIN_MATCH.lastIndex = 0;\n VAR_ASSIGN.lastIndex = 0;\n return has;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/** @type {Promise<void>} */\nlet readyPromise = null;\n\n/** @type {?function(?function())} */\nlet whenReady = window['HTMLImports'] && window['HTMLImports']['whenReady'] || null;\n\n/** @type {function()} */\nlet resolveFn;\n\n/**\n * @param {?function()} callback\n */\nexport default function documentWait(callback) {\n requestAnimationFrame(function() {\n if (whenReady) {\n whenReady(callback)\n } else {\n if (!readyPromise) {\n readyPromise = new Promise((resolve) => {resolveFn = resolve});\n if (document.readyState === 'complete') {\n resolveFn();\n } else {\n document.addEventListener('readystatechange', () => {\n if (document.readyState === 'complete') {\n resolveFn();\n }\n });\n }\n }\n readyPromise.then(function(){ callback && callback(); });\n }\n });\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport documentWait from './document-wait.js';\n\n/**\n * @typedef {HTMLStyleElement | {getStyle: function():HTMLStyleElement}}\n */\nexport let CustomStyleProvider;\n\nconst SEEN_MARKER = '__seenByShadyCSS';\nconst CACHED_STYLE = '__shadyCSSCachedStyle';\n\n/** @type {?function(!HTMLStyleElement)} */\nlet transformFn = null;\n\n/** @type {?function()} */\nlet validateFn = null;\n\n/**\nThis interface is provided to add document-level <style> elements to ShadyCSS for processing.\nThese styles must be processed by ShadyCSS to simulate ShadowRoot upper-bound encapsulation from outside styles\nIn addition, these styles may also need to be processed for @apply rules and CSS Custom Properties\n\nTo add document-level styles to ShadyCSS, one can call `ShadyCSS.addDocumentStyle(styleElement)` or `ShadyCSS.addDocumentStyle({getStyle: () => styleElement})`\n\nIn addition, if the process used to discover document-level styles can be synchronously flushed, one should set `ShadyCSS.documentStyleFlush`.\nThis function will be called when calculating styles.\n\nAn example usage of the document-level styling api can be found in `examples/document-style-lib.js`\n\n@unrestricted\n*/\nexport default class CustomStyleInterface {\n constructor() {\n /** @type {!Array<!CustomStyleProvider>} */\n this['customStyles'] = [];\n this['enqueued'] = false;\n // NOTE(dfreedm): use quotes here to prevent closure inlining to `function(){}`;\n documentWait(() => {\n if (window['ShadyCSS']['flushCustomStyles']) {\n window['ShadyCSS']['flushCustomStyles']();\n }\n })\n }\n /**\n * Queue a validation for new custom styles to batch style recalculations\n */\n enqueueDocumentValidation() {\n if (this['enqueued'] || !validateFn) {\n return;\n }\n this['enqueued'] = true;\n documentWait(validateFn);\n }\n /**\n * @param {!HTMLStyleElement} style\n */\n addCustomStyle(style) {\n if (!style[SEEN_MARKER]) {\n style[SEEN_MARKER] = true;\n this['customStyles'].push(style);\n this.enqueueDocumentValidation();\n }\n }\n /**\n * @param {!CustomStyleProvider} customStyle\n * @return {HTMLStyleElement}\n */\n getStyleForCustomStyle(customStyle) {\n if (customStyle[CACHED_STYLE]) {\n return customStyle[CACHED_STYLE];\n }\n let style;\n if (customStyle['getStyle']) {\n style = customStyle['getStyle']();\n } else {\n style = customStyle;\n }\n return style;\n }\n /**\n * @return {!Array<!CustomStyleProvider>}\n */\n processStyles() {\n const cs = this['customStyles'];\n for (let i = 0; i < cs.length; i++) {\n const customStyle = cs[i];\n if (customStyle[CACHED_STYLE]) {\n continue;\n }\n const style = this.getStyleForCustomStyle(customStyle);\n if (style) {\n // HTMLImports polyfill may have cloned the style into the main document,\n // which is referenced with __appliedElement.\n const styleToTransform = /** @type {!HTMLStyleElement} */(style['__appliedElement'] || style);\n if (transformFn) {\n transformFn(styleToTransform);\n }\n customStyle[CACHED_STYLE] = styleToTransform;\n }\n }\n return cs;\n }\n}\n\nCustomStyleInterface.prototype['addCustomStyle'] = CustomStyleInterface.prototype.addCustomStyle;\nCustomStyleInterface.prototype['getStyleForCustomStyle'] = CustomStyleInterface.prototype.getStyleForCustomStyle;\nCustomStyleInterface.prototype['processStyles'] = CustomStyleInterface.prototype.processStyles;\n\nObject.defineProperties(CustomStyleInterface.prototype, {\n 'transformCallback': {\n /** @return {?function(!HTMLStyleElement)} */\n get() {\n return transformFn;\n },\n /** @param {?function(!HTMLStyleElement)} fn */\n set(fn) {\n transformFn = fn;\n }\n },\n 'validateCallback': {\n /** @return {?function()} */\n get() {\n return validateFn;\n },\n /**\n * @param {?function()} fn\n * @this {CustomStyleInterface}\n */\n set(fn) {\n let needsEnqueue = false;\n if (!validateFn) {\n needsEnqueue = true;\n }\n validateFn = fn;\n if (needsEnqueue) {\n this.enqueueDocumentValidation();\n }\n },\n }\n})\n\n/** @typedef {{\n * customStyles: !Array<!CustomStyleProvider>,\n * addCustomStyle: function(!CustomStyleProvider),\n * getStyleForCustomStyle: function(!CustomStyleProvider): HTMLStyleElement,\n * findStyles: function(),\n * transformCallback: ?function(!HTMLStyleElement),\n * validateCallback: ?function()\n * }}\n */\nexport let CustomStyleInterfaceInterface;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport CustomStyleInterface from '../src/custom-style-interface.js';\nimport {getComputedStyleValue, updateNativeProperties} from '../src/common-utils.js';\nimport {nativeCssVariables, nativeShadow} from '../src/style-settings.js';\n\nconst customStyleInterface = new CustomStyleInterface();\n\nif (!window.ShadyCSS) {\n window.ShadyCSS = {\n /**\n * @param {HTMLTemplateElement} template\n * @param {string} elementName\n * @param {string=} elementExtends\n */\n prepareTemplate(template, elementName, elementExtends) {}, // eslint-disable-line no-unused-vars\n\n /**\n * @param {Element} element\n * @param {Object=} properties\n */\n styleSubtree(element, properties) {\n customStyleInterface.processStyles();\n updateNativeProperties(element, properties);\n },\n\n /**\n * @param {Element} element\n */\n styleElement(element) { // eslint-disable-line no-unused-vars\n customStyleInterface.processStyles();\n },\n\n /**\n * @param {Object=} properties\n */\n styleDocument(properties) {\n customStyleInterface.processStyles();\n updateNativeProperties(document.body, properties);\n },\n\n /**\n * @param {Element} element\n * @param {string} property\n * @return {string}\n */\n getComputedStyleValue(element, property) {\n return getComputedStyleValue(element, property);\n },\n\n flushCustomStyles() {},\n nativeCss: nativeCssVariables,\n nativeShadow: nativeShadow\n }\n}\n\nwindow.ShadyCSS.CustomStyleInterface = customStyleInterface;"]} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/entrypoints/apply-shim.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/entrypoints/apply-shim.js
new file mode 100644
index 00000000000..66372fffa9f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/entrypoints/apply-shim.js
@@ -0,0 +1,196 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+'use strict';
+
+import ApplyShim from '../src/apply-shim.js';
+import templateMap from '../src/template-map.js';
+import {getIsExtends, toCssText} from '../src/style-util.js';
+import * as ApplyShimUtils from '../src/apply-shim-utils.js';
+import {getComputedStyleValue, updateNativeProperties} from '../src/common-utils.js';
+import {CustomStyleInterfaceInterface} from '../src/custom-style-interface.js'; // eslint-disable-line no-unused-vars
+import {nativeCssVariables, nativeShadow} from '../src/style-settings.js';
+
+/** @const {ApplyShim} */
+const applyShim = new ApplyShim();
+
+class ApplyShimInterface {
+ constructor() {
+ /** @type {?CustomStyleInterfaceInterface} */
+ this.customStyleInterface = null;
+ applyShim['invalidCallback'] = ApplyShimUtils.invalidate;
+ }
+ ensure() {
+ if (this.customStyleInterface) {
+ return;
+ }
+ this.customStyleInterface = window.ShadyCSS.CustomStyleInterface;
+ if (this.customStyleInterface) {
+ this.customStyleInterface['transformCallback'] = (style) => {
+ applyShim.transformCustomStyle(style);
+ };
+ this.customStyleInterface['validateCallback'] = () => {
+ requestAnimationFrame(() => {
+ if (this.customStyleInterface['enqueued']) {
+ this.flushCustomStyles();
+ }
+ });
+ }
+ }
+ }
+ /**
+ * @param {!HTMLTemplateElement} template
+ * @param {string} elementName
+ */
+ prepareTemplate(template, elementName) {
+ this.ensure();
+ templateMap[elementName] = template;
+ let ast = applyShim.transformTemplate(template, elementName);
+ // save original style ast to use for revalidating instances
+ template['_styleAst'] = ast;
+ }
+ flushCustomStyles() {
+ this.ensure();
+ if (!this.customStyleInterface) {
+ return;
+ }
+ let styles = this.customStyleInterface['processStyles']();
+ if (!this.customStyleInterface['enqueued']) {
+ return;
+ }
+ for (let i = 0; i < styles.length; i++ ) {
+ let cs = styles[i];
+ let style = this.customStyleInterface['getStyleForCustomStyle'](cs);
+ if (style) {
+ applyShim.transformCustomStyle(style);
+ }
+ }
+ this.customStyleInterface['enqueued'] = false;
+ }
+ /**
+ * @param {HTMLElement} element
+ * @param {Object=} properties
+ */
+ styleSubtree(element, properties) {
+ this.ensure();
+ if (properties) {
+ updateNativeProperties(element, properties);
+ }
+ if (element.shadowRoot) {
+ this.styleElement(element);
+ let shadowChildren = element.shadowRoot.children || element.shadowRoot.childNodes;
+ for (let i = 0; i < shadowChildren.length; i++) {
+ this.styleSubtree(/** @type {HTMLElement} */(shadowChildren[i]));
+ }
+ } else {
+ let children = element.children || element.childNodes;
+ for (let i = 0; i < children.length; i++) {
+ this.styleSubtree(/** @type {HTMLElement} */(children[i]));
+ }
+ }
+ }
+ /**
+ * @param {HTMLElement} element
+ */
+ styleElement(element) {
+ this.ensure();
+ let {is} = getIsExtends(element);
+ let template = templateMap[is];
+ if (template && !ApplyShimUtils.templateIsValid(template)) {
+ // only revalidate template once
+ if (!ApplyShimUtils.templateIsValidating(template)) {
+ this.prepareTemplate(template, is);
+ ApplyShimUtils.startValidatingTemplate(template);
+ }
+ // update this element instance
+ let root = element.shadowRoot;
+ if (root) {
+ let style = /** @type {HTMLStyleElement} */(root.querySelector('style'));
+ if (style) {
+ // reuse the template's style ast, it has all the original css text
+ style['__cssRules'] = template['_styleAst'];
+ style.textContent = toCssText(template['_styleAst'])
+ }
+ }
+ }
+ }
+ /**
+ * @param {Object=} properties
+ */
+ styleDocument(properties) {
+ this.ensure();
+ this.styleSubtree(document.body, properties);
+ }
+}
+
+if (!window.ShadyCSS || !window.ShadyCSS.ScopingShim) {
+ const applyShimInterface = new ApplyShimInterface();
+ let CustomStyleInterface = window.ShadyCSS && window.ShadyCSS.CustomStyleInterface;
+
+ /** @suppress {duplicate} */
+ window.ShadyCSS = {
+ /**
+ * @param {!HTMLTemplateElement} template
+ * @param {string} elementName
+ * @param {string=} elementExtends
+ */
+ prepareTemplate(template, elementName, elementExtends) { // eslint-disable-line no-unused-vars
+ applyShimInterface.flushCustomStyles();
+ applyShimInterface.prepareTemplate(template, elementName)
+ },
+
+ /**
+ * @param {!HTMLElement} element
+ * @param {Object=} properties
+ */
+ styleSubtree(element, properties) {
+ applyShimInterface.flushCustomStyles();
+ applyShimInterface.styleSubtree(element, properties);
+ },
+
+ /**
+ * @param {!HTMLElement} element
+ */
+ styleElement(element) {
+ applyShimInterface.flushCustomStyles();
+ applyShimInterface.styleElement(element);
+ },
+
+ /**
+ * @param {Object=} properties
+ */
+ styleDocument(properties) {
+ applyShimInterface.flushCustomStyles();
+ applyShimInterface.styleDocument(properties);
+ },
+
+ /**
+ * @param {Element} element
+ * @param {string} property
+ * @return {string}
+ */
+ getComputedStyleValue(element, property) {
+ return getComputedStyleValue(element, property);
+ },
+
+ flushCustomStyles() {
+ applyShimInterface.flushCustomStyles();
+ },
+
+ nativeCss: nativeCssVariables,
+ nativeShadow: nativeShadow
+ };
+
+ if (CustomStyleInterface) {
+ window.ShadyCSS.CustomStyleInterface = CustomStyleInterface;
+ }
+}
+
+window.ShadyCSS.ApplyShim = applyShim;
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/entrypoints/custom-style-interface.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/entrypoints/custom-style-interface.js
new file mode 100644
index 00000000000..487fc9d7abb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/entrypoints/custom-style-interface.js
@@ -0,0 +1,67 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+'use strict';
+
+import CustomStyleInterface from '../src/custom-style-interface.js';
+import {getComputedStyleValue, updateNativeProperties} from '../src/common-utils.js';
+import {nativeCssVariables, nativeShadow} from '../src/style-settings.js';
+
+const customStyleInterface = new CustomStyleInterface();
+
+if (!window.ShadyCSS) {
+ window.ShadyCSS = {
+ /**
+ * @param {HTMLTemplateElement} template
+ * @param {string} elementName
+ * @param {string=} elementExtends
+ */
+ prepareTemplate(template, elementName, elementExtends) {}, // eslint-disable-line no-unused-vars
+
+ /**
+ * @param {Element} element
+ * @param {Object=} properties
+ */
+ styleSubtree(element, properties) {
+ customStyleInterface.processStyles();
+ updateNativeProperties(element, properties);
+ },
+
+ /**
+ * @param {Element} element
+ */
+ styleElement(element) { // eslint-disable-line no-unused-vars
+ customStyleInterface.processStyles();
+ },
+
+ /**
+ * @param {Object=} properties
+ */
+ styleDocument(properties) {
+ customStyleInterface.processStyles();
+ updateNativeProperties(document.body, properties);
+ },
+
+ /**
+ * @param {Element} element
+ * @param {string} property
+ * @return {string}
+ */
+ getComputedStyleValue(element, property) {
+ return getComputedStyleValue(element, property);
+ },
+
+ flushCustomStyles() {},
+ nativeCss: nativeCssVariables,
+ nativeShadow: nativeShadow
+ }
+}
+
+window.ShadyCSS.CustomStyleInterface = customStyleInterface; \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/entrypoints/scoping-shim.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/entrypoints/scoping-shim.js
new file mode 100644
index 00000000000..8b857cbae2d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/entrypoints/scoping-shim.js
@@ -0,0 +1,87 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+'use strict';
+
+import ScopingShim from '../src/scoping-shim.js';
+import {nativeCssVariables, nativeShadow} from '../src/style-settings.js';
+
+/** @const {ScopingShim} */
+const scopingShim = new ScopingShim();
+
+let ApplyShim, CustomStyleInterface;
+
+if (window['ShadyCSS']) {
+ ApplyShim = window['ShadyCSS']['ApplyShim'];
+ CustomStyleInterface = window['ShadyCSS']['CustomStyleInterface'];
+}
+
+window.ShadyCSS = {
+ ScopingShim: scopingShim,
+ /**
+ * @param {!HTMLTemplateElement} template
+ * @param {string} elementName
+ * @param {string=} elementExtends
+ */
+ prepareTemplate(template, elementName, elementExtends) {
+ scopingShim.flushCustomStyles();
+ scopingShim.prepareTemplate(template, elementName, elementExtends)
+ },
+
+ /**
+ * @param {!HTMLElement} element
+ * @param {Object=} properties
+ */
+ styleSubtree(element, properties) {
+ scopingShim.flushCustomStyles();
+ scopingShim.styleSubtree(element, properties);
+ },
+
+ /**
+ * @param {!HTMLElement} element
+ */
+ styleElement(element) {
+ scopingShim.flushCustomStyles();
+ scopingShim.styleElement(element);
+ },
+
+ /**
+ * @param {Object=} properties
+ */
+ styleDocument(properties) {
+ scopingShim.flushCustomStyles();
+ scopingShim.styleDocument(properties);
+ },
+
+ flushCustomStyles() {
+ scopingShim.flushCustomStyles();
+ },
+
+ /**
+ * @param {Element} element
+ * @param {string} property
+ * @return {string}
+ */
+ getComputedStyleValue(element, property) {
+ return scopingShim.getComputedStyleValue(element, property);
+ },
+
+ nativeCss: nativeCssVariables,
+
+ nativeShadow: nativeShadow
+};
+
+if (ApplyShim) {
+ window.ShadyCSS.ApplyShim = ApplyShim;
+}
+
+if (CustomStyleInterface) {
+ window.ShadyCSS.CustomStyleInterface = CustomStyleInterface;
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/examples/custom-style-element.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/examples/custom-style-element.js
new file mode 100644
index 00000000000..0542e8a1f53
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/examples/custom-style-element.js
@@ -0,0 +1,42 @@
+/**
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+/*
+Wrapper over <style> elements to co-operate with ShadyCSS
+
+Example:
+<custom-style>
+ <style>
+ ...
+ </style>
+</custom-style>
+*/
+(function() {
+ 'use strict';
+
+ const CustomStyleInterface = window.ShadyCSS.CustomStyleInterface;
+
+ class CustomStyle extends HTMLElement {
+ constructor() {
+ super();
+ this._style = null;
+ CustomStyleInterface.addCustomStyle(this);
+ }
+ getStyle() {
+ if (!this._style) {
+ this._style = this.querySelector('style');
+ }
+ return this._style;
+ }
+ }
+
+ window.CustomStyle = CustomStyle;
+ window.customElements.define('custom-style', CustomStyle);
+})(); \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/examples/document-style-lib.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/examples/document-style-lib.js
new file mode 100644
index 00000000000..a1c032c0fdf
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/examples/document-style-lib.js
@@ -0,0 +1,54 @@
+/**
+@license
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+/*
+Example library for adding document-level styles to ShadyCSS
+
+After DOMContentLoaded, synchronously add all document document level styles.
+Then, start a MutationObserver for dynamically added styles.
+
+Caveat: ShadyCSS will add a `scope` attribute to styles it controls, so do not add those styles.
+*/
+(function() {
+ 'use strict';
+
+ const CustomStyleInterface = window.ShadyCSS.CustomStyleInterface;
+
+ function shouldAddDocumentStyle(n) {
+ return n.nodeType === Node.ELEMENT_NODE && n.localName === 'style' && !n.hasAttribute('scope');
+ }
+
+ function handler(mxns) {
+ for (let i = 0; i < mxns.length; i++) {
+ let mxn = mxns[i];
+ for (let j = 0; j < mxn.addedNodes.length; j++) {
+ let n = mxn.addedNodes[j];
+ if (shouldAddDocumentStyle(n)) {
+ CustomStyleInterface.addCustomStyle(n);
+ }
+ }
+ }
+ }
+
+ const observer = new MutationObserver(handler);
+
+ document.addEventListener('DOMContentLoaded', () => {
+ const candidates = document.querySelectorAll('custom-style');
+ for (let i = 0; i < candidates.length; i++) {
+ const candidate = candidates[i];
+ if (shouldAddDocumentStyle(candidate)) {
+ CustomStyleInterface.addCustomStyle(candidate);
+ }
+ }
+ observer.observe(document, {childList: true, subtree: true});
+ });
+
+ window.documentStyleFlush = () => {handler(observer.takeRecords())};
+})(); \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/externs/shadycss-externs.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/externs/shadycss-externs.js
new file mode 100644
index 00000000000..de17c450b75
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/externs/shadycss-externs.js
@@ -0,0 +1,26 @@
+/** @typedef {{
+ * styleElement: function(!HTMLElement),
+ * styleSubtree: function(!HTMLElement, Object<string, string>=),
+ * prepareTemplate: function(!HTMLTemplateElement, string, string=),
+ * styleDocument: function(Object<string, string>=),
+ * flushCustomStyles: function(),
+ * getComputedStyleValue: function(!Element, string): string,
+ * ScopingShim: (Object|undefined),
+ * ApplyShim: (Object|undefined),
+ * CustomStyleInterface: (Object|undefined),
+ * nativeCss: boolean,
+ * nativeShadow: boolean,
+ * }}
+ */
+let ShadyCSSInterface; //eslint-disable-line no-unused-vars
+
+/**
+ * @typedef {{
+ * shimcssproperties: (boolean | undefined),
+ * shimshadow: (boolean | undefined)
+ * }}
+ */
+let ShadyCSSOptions; //eslint-disable-line no-unused-vars
+
+/** @type {(ShadyCSSInterface | ShadyCSSOptions | undefined)} */
+window.ShadyCSS; \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/gulpfile.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/gulpfile.js
new file mode 100644
index 00000000000..d2c75095334
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/gulpfile.js
@@ -0,0 +1,113 @@
+/**
+ * @license
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+'use strict';
+
+/* eslint-env node */
+/* eslint-disable no-console */
+
+const gulp = require('gulp');
+const sourcemaps = require('gulp-sourcemaps');
+const del = require('del');
+const rename = require('gulp-rename');
+const rollup = require('rollup-stream');
+const buffer = require('vinyl-buffer');
+const source = require('vinyl-source-stream');
+const closure = require('google-closure-compiler').gulp();
+const size = require('gulp-size');
+const runseq = require('run-sequence');
+
+const modules = [
+ 'css-parse',
+ 'custom-style-element',
+ 'make-element',
+ 'svg-in-shadow',
+ 'style-util',
+ 'style-transformer',
+ 'style-settings'
+];
+
+const moduleTasks = modules.map((m) => {
+ gulp.task(`test-module-${m}`, () => {
+ return rollup({
+ entry: `tests/module/${m}.js`,
+ format: 'iife',
+ moduleName: m.replace(/-/g, '_')
+ })
+ .pipe(source(`${m}.js`, 'tests/module'))
+ .pipe(gulp.dest('./tests/module/generated'))
+ });
+ return `test-module-${m}`;
+});
+
+gulp.task('clean-test-modules', () => del(['tests/module/generated']));
+
+gulp.task('test-modules', (cb) => {
+ runseq('clean-test-modules', moduleTasks, cb);
+});
+
+function closurify(entry) {
+ gulp.task(`closure-${entry}`, () => {
+ return gulp.src(['src/*.js', 'entrypoints/*.js'], {base: './'})
+ .pipe(sourcemaps.init())
+ .pipe(closure({
+ new_type_inf: true,
+ compilation_level: 'ADVANCED',
+ language_in: 'ES6_STRICT',
+ language_out: 'ES5_STRICT',
+ isolation_mode: 'IIFE',
+ assume_function_wrapper: true,
+ js_output_file: `${entry}.min.js`,
+ entry_point: `./entrypoints/${entry}.js`,
+ dependency_mode: 'STRICT',
+ warning_level: 'VERBOSE',
+ rewrite_polyfills: false,
+ externs: 'externs/shadycss-externs.js'
+ }))
+ .pipe(size({showFiles: true, showTotal: false, gzip: true}))
+ .pipe(sourcemaps.write('.'))
+ .pipe(gulp.dest('.'))
+ });
+ return `closure-${entry}`;
+}
+
+function debugify(entry) {
+ gulp.task(`debug-${entry}`, () => {
+ return rollup({
+ entry: `entrypoints/${entry}.js`,
+ format: 'iife',
+ moduleName: `${entry}`.replace(/-/g, '_'),
+ })
+ .pipe(source(`${entry}.js`, 'entrypoints'))
+ .pipe(buffer())
+ .pipe(sourcemaps.init({loadMaps: true}))
+ .pipe(rename(`${entry}.min.js`))
+ .pipe(size({showFiles: true, showTotal: false, gzip: true}))
+ .pipe(gulp.dest('./'))
+ });
+ return `debug-${entry}`;
+}
+
+const entrypoints = [
+ 'scoping-shim',
+ 'apply-shim',
+ 'custom-style-interface'
+]
+
+let closureTasks = entrypoints.map((e) => closurify(e));
+let debugTasks = entrypoints.map((e) => debugify(e));
+
+gulp.task('default', ['closure', 'test-modules']);
+
+gulp.task('closure', (cb) => {
+ runseq.apply(null, closureTasks.concat(cb))
+});
+
+gulp.task('debug', debugTasks);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/package-lock.json
new file mode 100644
index 00000000000..0e6fd9940e7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/package-lock.json
@@ -0,0 +1,11002 @@
+{
+ "name": "@webcomponents/shadycss",
+ "version": "1.2.1",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@gulp-sourcemaps/identity-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz",
+ "integrity": "sha1-z6I7xYQPkQTOMqZedNt+epdLvuE=",
+ "dev": true,
+ "requires": {
+ "acorn": "5.5.3",
+ "css": "2.2.1",
+ "normalize-path": "2.1.1",
+ "source-map": "0.5.7",
+ "through2": "2.0.3"
+ }
+ },
+ "@gulp-sourcemaps/map-sources": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz",
+ "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=",
+ "dev": true,
+ "requires": {
+ "normalize-path": "2.1.1",
+ "through2": "2.0.3"
+ }
+ },
+ "@polymer/polymer": {
+ "version": "3.0.0-pre.11",
+ "resolved": "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.0.0-pre.11.tgz",
+ "integrity": "sha512-lz0+3so+URZqH6IUV9nzlR6akO8jPRauM7EEIMqPx3H6w4Zh7wzoj4Ngbi18Nwpt71l90F4YhuHDGNRQEwhk+w==",
+ "dev": true,
+ "requires": {
+ "@webcomponents/shadycss": "1.1.1",
+ "@webcomponents/webcomponentsjs": "1.1.0"
+ }
+ },
+ "@polymer/sinonjs": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/@polymer/sinonjs/-/sinonjs-1.17.1.tgz",
+ "integrity": "sha512-/U8F/cOTrbF2iVVYgINYmvKbtbexs+89Q3v8AaHADRYabTg7aOZGOb0RyWpOI+sUJt04kj63U4FwMhzW5r4wZA==",
+ "dev": true
+ },
+ "@polymer/test-fixture": {
+ "version": "3.0.0-pre.11",
+ "resolved": "https://registry.npmjs.org/@polymer/test-fixture/-/test-fixture-3.0.0-pre.11.tgz",
+ "integrity": "sha512-0xrKREkvhS62pCOUTjCi1hSickrG1ZosZ0yPhs35/fGewZIrVnJ6QLuEnYpqFWxWASjQbIc22lJwPcGJXewlyg==",
+ "dev": true
+ },
+ "@types/assert": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/assert/-/assert-0.0.29.tgz",
+ "integrity": "sha1-jlYnhbqlq9p8BKSfZmXq50MZKNM=",
+ "dev": true
+ },
+ "@types/babel-core": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-core/-/babel-core-6.25.3.tgz",
+ "integrity": "sha512-OlUjfM+Qv+XwcaucEiekBIhfAYe4q4ruvQZZcCkOtQZ27Hykxm1LLY2s0mE6LtP9XQt6x+TUvS70KW2e8Mz0ZA==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-template": "6.25.0",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "7.0.1",
+ "@types/babylon": "6.16.2"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "7.0.1"
+ }
+ },
+ "@types/babel-template": {
+ "version": "6.25.0",
+ "resolved": "https://registry.npmjs.org/@types/babel-template/-/babel-template-6.25.0.tgz",
+ "integrity": "sha512-TtyfVlrprX92xSuKa8D//7vFz5kBJODBw5IQ1hQXehqO+me26vt1fyNxOZyXhUq2a7jRyT72V8p68IyH4NEZNA==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "7.0.1",
+ "@types/babylon": "6.16.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "7.0.1"
+ }
+ },
+ "@types/babel-types": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.1.tgz",
+ "integrity": "sha512-EkcOk09rjhivbovP8WreGRbXW20YRfe/qdgXOGq3it3u3aAOWDRNsQhL/XPAWFF7zhZZ+uR+nT+3b+TCkIap1w==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "7.0.1"
+ }
+ },
+ "@types/bluebird": {
+ "version": "3.5.20",
+ "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.20.tgz",
+ "integrity": "sha512-Wk41MVdF+cHBfVXj/ufUHJeO3BlIQr1McbHZANErMykaCWeDSZbH5erGjNBw2/3UlRdSxZbLfSuQTzFmPOYFsA==",
+ "dev": true
+ },
+ "@types/body-parser": {
+ "version": "1.16.8",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.16.8.tgz",
+ "integrity": "sha512-BdN2PXxOFnTXFcyONPW6t0fHjz2fvRZHVMFpaS0wYr+Y8fWEaNOs4V8LEu/fpzQlMx+ahdndgTaGTwPC+J/EeA==",
+ "dev": true,
+ "requires": {
+ "@types/express": "4.11.1",
+ "@types/node": "8.9.5"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.2"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clean-css": {
+ "version": "3.4.30",
+ "resolved": "https://registry.npmjs.org/@types/clean-css/-/clean-css-3.4.30.tgz",
+ "integrity": "sha1-AFLBNvUkgAJCjjY4s33ko5gYZB0=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/compression": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/compression/-/compression-0.0.33.tgz",
+ "integrity": "sha1-ldxzOiM5qoRjgdfxN3eS0lU9wn0=",
+ "dev": true,
+ "requires": {
+ "@types/express": "4.11.1"
+ }
+ },
+ "@types/content-type": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@types/content-type/-/content-type-1.1.2.tgz",
+ "integrity": "sha512-w2d7fBCYbCBUBTGtkC4JfX1FicTtgEmq7wTTjc7rC5RA/JdB1Bi7o88nKzUqAnIIBXJVmq0n4tTmF3PJN8QqCg==",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/escodegen": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/@types/escodegen/-/escodegen-0.0.2.tgz",
+ "integrity": "sha1-fOpBqyQukQ6xD2WuGK66RZ1ms18=",
+ "dev": true
+ },
+ "@types/estraverse": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estraverse/-/estraverse-0.0.6.tgz",
+ "integrity": "sha1-Zp9833KreX5hJfjQD+0z1M8wwiE=",
+ "dev": true,
+ "requires": {
+ "@types/estree": "0.0.37"
+ }
+ },
+ "@types/estree": {
+ "version": "0.0.37",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.37.tgz",
+ "integrity": "sha512-1IT6vNpmU9w18P3v6mN9idv18z5KPVTi4t7+rU9VLnkxo0LCam8IXy/eSVzOaQ1Wpabra2cN3A8K/SliPK/Suw==",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/express": {
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.11.1.tgz",
+ "integrity": "sha512-ttWle8cnPA5rAelauSWeWJimtY2RsUf2aspYZs7xPHiWgOlPn6nnUfBMtrkcnjFJuIHJF4gNOdVvpLK2Zmvh6g==",
+ "dev": true,
+ "requires": {
+ "@types/body-parser": "1.16.8",
+ "@types/express-serve-static-core": "4.11.1",
+ "@types/serve-static": "1.13.1"
+ }
+ },
+ "@types/express-serve-static-core": {
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.11.1.tgz",
+ "integrity": "sha512-EehCl3tpuqiM8RUb+0255M8PhhSwTtLfmO7zBBdv0ay/VTd/zmrqDfQdZFsa5z/PVMbH2yCMZPXsnrImpATyIw==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/node": "8.9.5"
+ }
+ },
+ "@types/freeport": {
+ "version": "1.0.21",
+ "resolved": "https://registry.npmjs.org/@types/freeport/-/freeport-1.0.21.tgz",
+ "integrity": "sha1-c/ZUPtZ9PKP/+XuYVZFZi3CSBm8=",
+ "dev": true,
+ "optional": true
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "8.9.5"
+ }
+ },
+ "@types/glob-stream": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@types/glob-stream/-/glob-stream-6.1.0.tgz",
+ "integrity": "sha512-RHv6ZQjcTncXo3thYZrsbAVwoy4vSKosSWhuhuQxLOTv74OJuFQxXkmUuZCr3q9uNBEVCvIzmZL/FeRNbHZGUg==",
+ "dev": true,
+ "requires": {
+ "@types/glob": "5.0.35",
+ "@types/node": "8.9.5"
+ }
+ },
+ "@types/gulp-if": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/gulp-if/-/gulp-if-0.0.33.tgz",
+ "integrity": "sha512-J5lzff21X7r1x/4hSzn02GgIUEyjCqYIXZ9GgGBLhbsD3RiBdqwnkFWgF16/0jO5rcVZ52Zp+6MQMQdvIsWuKg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.9.5",
+ "@types/vinyl": "2.0.2"
+ }
+ },
+ "@types/html-minifier": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/@types/html-minifier/-/html-minifier-3.5.1.tgz",
+ "integrity": "sha512-h9+AmtRHohUxclj4k86KJ/Le548WHIFcXf8zdMnpc6jEmH9G64dJ8brpbFX7z/k48bhytQXAiHXrJ+fay6FYTg==",
+ "dev": true,
+ "requires": {
+ "@types/clean-css": "3.4.30",
+ "@types/relateurl": "0.2.28",
+ "@types/uglify-js": "2.6.30"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/launchpad": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@types/launchpad/-/launchpad-0.6.0.tgz",
+ "integrity": "sha1-NylhCbfyd/bmxf1+DAcGvJGPu1E=",
+ "dev": true,
+ "optional": true
+ },
+ "@types/mime": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-0.0.29.tgz",
+ "integrity": "sha1-+8/TMFc7kS71nu7hRgK/rOYwdUs=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/mz": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/mz/-/mz-0.0.29.tgz",
+ "integrity": "sha1-vCRyjGSZc/HHhR6QM/nOUlZowns=",
+ "dev": true,
+ "requires": {
+ "@types/bluebird": "3.5.20",
+ "@types/node": "8.9.5"
+ }
+ },
+ "@types/node": {
+ "version": "8.9.5",
+ "resolved": "http://registry.npmjs.org/@types/node/-/node-8.9.5.tgz",
+ "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==",
+ "dev": true
+ },
+ "@types/opn": {
+ "version": "3.0.28",
+ "resolved": "https://registry.npmjs.org/@types/opn/-/opn-3.0.28.tgz",
+ "integrity": "sha1-CX0NHJtXSVc6XZbfEyOHu20CEYo=",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.9.5"
+ }
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.9.5"
+ }
+ },
+ "@types/pem": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@types/pem/-/pem-1.9.3.tgz",
+ "integrity": "sha512-+hHbGi9PAyHVeRdMJN6yNuMWoshJ+7oTqYuhBB1/vHq0Tfu46ucbvgxmhwBfe0GCiJZvCa20VHhHsA0mY5W6hQ==",
+ "dev": true
+ },
+ "@types/relateurl": {
+ "version": "0.2.28",
+ "resolved": "https://registry.npmjs.org/@types/relateurl/-/relateurl-0.2.28.tgz",
+ "integrity": "sha1-a9p9uGU/piZD9e5p6facEaOS46Y=",
+ "dev": true
+ },
+ "@types/resolve": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.7.tgz",
+ "integrity": "sha512-GPewdjkb0Q76o459qgp6pBLzJj/bD3oveS2kfLhIkZ9U3t3AFKtl5DlFB6lGTw0iZmcmxoGC8lpLW3NNJKrN9A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.9.5"
+ }
+ },
+ "@types/serve-static": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.1.tgz",
+ "integrity": "sha512-jDMH+3BQPtvqZVIcsH700Dfi8Q3MIcEx16g/VdxjoqiGR/NntekB10xdBpirMKnPe9z2C5cBmL0vte0YttOr3Q==",
+ "dev": true,
+ "requires": {
+ "@types/express-serve-static-core": "4.11.1",
+ "@types/mime": "0.0.29"
+ }
+ },
+ "@types/spdy": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/@types/spdy/-/spdy-3.4.4.tgz",
+ "integrity": "sha512-N9LBlbVRRYq6HgYpPkqQc3a9HJ/iEtVZToW6xlTtJiMhmRJ7jJdV7TaZQJw/Ve/1ePUsQiCTDc4JMuzzag94GA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.9.5"
+ }
+ },
+ "@types/ua-parser-js": {
+ "version": "0.7.32",
+ "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.32.tgz",
+ "integrity": "sha512-+z7Q72Mlnq6SFkQYHzLg2Z70pIsgRVzgx1b5PV8eUv5uaZ/zoqIs45XnhtToW4gTeX4FbjIP49nhIjyvPF4rPg==",
+ "dev": true
+ },
+ "@types/uglify-js": {
+ "version": "2.6.30",
+ "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-2.6.30.tgz",
+ "integrity": "sha512-NjiBNGFl58vHJeijl63w1fWRIjLnrfOvimsXF5b3lTzEzkTV1BnVsbqQeLejg54upsHPWIF63aiub5TEwH619A==",
+ "dev": true,
+ "requires": {
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "@types/uuid": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz",
+ "integrity": "sha512-5fRLCYhLtDb3hMWqQyH10qtF+Ud2JnNCXTCZ+9ktNdCcgslcuXkDTkFcJNk++MT29yDntDnlF1+jD+uVGumsbw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.9.5"
+ }
+ },
+ "@types/vinyl": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.2.tgz",
+ "integrity": "sha512-2iYpNuOl98SrLPBZfEN9Mh2JCJ2EI9HU35SfgBEb51DcmaHkhp8cKMblYeBqMQiwXMgAD3W60DbQ4i/UdLiXhw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.9.5"
+ }
+ },
+ "@types/vinyl-fs": {
+ "version": "0.0.28",
+ "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-0.0.28.tgz",
+ "integrity": "sha1-RmMBe8gCxlcOrk80Cf1cq/l8v94=",
+ "dev": true,
+ "requires": {
+ "@types/glob-stream": "6.1.0",
+ "@types/node": "8.9.5",
+ "@types/vinyl": "2.0.2"
+ }
+ },
+ "@types/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-ZrJDWpvg75LTGX4XwuneY9s6bF3OeZcGTpoGh3zDV9ytzcHMFsRrMIaLBRJZQMBoGyKs6unBQfVdrLZiYfb1zQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@types/winston": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.8.tgz",
+ "integrity": "sha512-QqR0j08RCS1AQYPMRPHikEpcmK+2aEEbcSzWLwOqyJ4FhLmHUx/WjRrnn7tTQg/y4IKnMhzskh/o7qvGIZZ7iA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.9.5"
+ }
+ },
+ "@webcomponents/custom-elements": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@webcomponents/custom-elements/-/custom-elements-1.1.0.tgz",
+ "integrity": "sha512-M872VYia7mXvtgsxKTTNBNPDYNLEvM3DDd0reyNusd/5weWH0XouKYYgp68b6gvWdMPHcMomg3SzUZaOo/bv9w==",
+ "dev": true
+ },
+ "@webcomponents/html-imports": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@webcomponents/html-imports/-/html-imports-1.1.1.tgz",
+ "integrity": "sha512-GVywdQzoSGtXv0qlGjqxFefSeLvICsT5QQaEhPKW6swhdIoNtTb6LJ4D/EBcfukgNcOLocplGz99YDVVHnqAEQ==",
+ "dev": true
+ },
+ "@webcomponents/shadycss": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.1.1.tgz",
+ "integrity": "sha512-7iVMw1HU0e5tTxL1OIqw/RBGmnYuz1HUNd7t1UYq7VmoBOl5Zm4g3spUBSksyd97SiXauFlXAeSpA0/in9k+dw==",
+ "dev": true
+ },
+ "@webcomponents/shadydom": {
+ "version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/@webcomponents/shadydom/-/shadydom-1.0.14.tgz",
+ "integrity": "sha512-6jhMR4gEJr6xe4pg+GjmOVx8GB2XAaCIEND6+YUV3EcgOIaCG6jl2QJJ4JiuFmJALNBn2sHIsnz6Gvw74F9Mzw==",
+ "dev": true
+ },
+ "@webcomponents/template": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@webcomponents/template/-/template-1.2.4.tgz",
+ "integrity": "sha512-lbhJfT+VuQ9/1hLrX7vkbz+vbJBGwkhnwHeEdajBgDCu5La+FmfnTyBPyYplBN/3yDss9jJ0HMMrKFho3KYXPQ==",
+ "dev": true
+ },
+ "@webcomponents/webcomponents-platform": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@webcomponents/webcomponents-platform/-/webcomponents-platform-1.0.0.tgz",
+ "integrity": "sha1-iHkUY4DdvsuGF+MiSX1Z53w/9Gg=",
+ "dev": true
+ },
+ "@webcomponents/webcomponentsjs": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-1.1.0.tgz",
+ "integrity": "sha512-7toNyVlrl7vJnY3PU0eXIK1KWq8phfnEe1IwOdCMxkIl/BfUkUB2aaVs45R0LSx1qxHRnkqj0vlGtskUvKkNkA==",
+ "dev": true
+ },
+ "accepts": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
+ "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
+ "dev": true,
+ "requires": {
+ "mime-types": "2.1.18",
+ "negotiator": "0.6.1"
+ }
+ },
+ "accessibility-developer-tools": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz",
+ "integrity": "sha1-PaDM6dbsY3OWS4TzXbfPw996tRQ=",
+ "dev": true
+ },
+ "acorn": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
+ "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+ "dev": true,
+ "requires": {
+ "acorn": "3.3.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+ "dev": true
+ }
+ }
+ },
+ "adm-zip": {
+ "version": "0.4.7",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz",
+ "integrity": "sha1-hgbCy/HEJs6MjsABdER/1Jtur8E=",
+ "dev": true,
+ "optional": true
+ },
+ "after": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
+ "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
+ "dev": true
+ },
+ "agent-base": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz",
+ "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "extend": "3.0.1",
+ "semver": "5.0.3"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz",
+ "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "dev": true,
+ "requires": {
+ "co": "4.6.0",
+ "fast-deep-equal": "1.1.0",
+ "fast-json-stable-stringify": "2.0.0",
+ "json-schema-traverse": "0.3.1"
+ }
+ },
+ "ajv-keywords": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
+ "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
+ "dev": true
+ },
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+ "dev": true
+ },
+ "ansi-align": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
+ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
+ "dev": true,
+ "requires": {
+ "string-width": "2.1.1"
+ }
+ },
+ "ansi-cyan": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
+ "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz",
+ "integrity": "sha1-HBg5S2r5t2/5pjUJ+kl2af0s5T4=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4"
+ }
+ },
+ "ansi-escapes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
+ "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
+ "dev": true
+ },
+ "ansi-gray": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
+ "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-red": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
+ "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "ansi-wrap": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
+ "dev": true
+ },
+ "any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=",
+ "dev": true
+ },
+ "append-field": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/append-field/-/append-field-0.1.0.tgz",
+ "integrity": "sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo=",
+ "dev": true
+ },
+ "archiver": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz",
+ "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=",
+ "dev": true,
+ "requires": {
+ "archiver-utils": "1.3.0",
+ "async": "2.6.0",
+ "buffer-crc32": "0.2.13",
+ "glob": "7.1.2",
+ "lodash": "4.17.5",
+ "readable-stream": "2.3.5",
+ "tar-stream": "1.5.2",
+ "walkdir": "0.0.11",
+ "zip-stream": "1.2.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "requires": {
+ "lodash": "4.17.5"
+ }
+ }
+ }
+ },
+ "archiver-utils": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz",
+ "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2",
+ "graceful-fs": "4.1.11",
+ "lazystream": "1.0.0",
+ "lodash": "4.17.5",
+ "normalize-path": "2.1.1",
+ "readable-stream": "2.3.5"
+ }
+ },
+ "archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
+ "dev": true
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "1.0.3"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-differ": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
+ "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
+ "dev": true
+ },
+ "array-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
+ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
+ "dev": true
+ },
+ "array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+ "dev": true
+ },
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
+ "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
+ "dev": true
+ },
+ "array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "dev": true,
+ "requires": {
+ "array-uniq": "1.0.3"
+ }
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "arraybuffer.slice": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
+ "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==",
+ "dev": true
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+ "dev": true
+ },
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+ "dev": true
+ },
+ "asn1": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
+ "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
+ "dev": true
+ },
+ "assert-plus": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
+ "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
+ "dev": true
+ },
+ "assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ },
+ "async-limiter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
+ "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
+ "dev": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz",
+ "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=",
+ "dev": true
+ },
+ "aws-sign2": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
+ "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
+ "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "babel-core": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz",
+ "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-generator": "6.26.1",
+ "babel-helpers": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-register": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "convert-source-map": "1.5.1",
+ "debug": "2.6.9",
+ "json5": "0.5.1",
+ "lodash": "4.17.5",
+ "minimatch": "3.0.4",
+ "path-is-absolute": "1.0.1",
+ "private": "0.1.8",
+ "slash": "1.0.0",
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "babel-helper-call-delegate": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+ "dev": true,
+ "requires": {
+ "babel-helper-hoist-variables": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-define-map": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
+ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+ "dev": true,
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-helper-evaluate-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.3.0.tgz",
+ "integrity": "sha512-dRFlMTqUJRGzx5a2smKxmptDdNCXKSkPcXWzKLwAV72hvIZumrd/0z9RcewHkr7PmAEq+ETtpD1GK6wZ6ZUXzw==",
+ "dev": true
+ },
+ "babel-helper-flip-expressions": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.3.0.tgz",
+ "integrity": "sha512-kNGohWmtAG3b7tN1xocRQ5rsKkH/hpvZsMiGOJ1VwGJKhnwzR5KlB3rvKBaBPl5/IGHcopB2JN+r1SUEX1iMAw==",
+ "dev": true
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-hoist-variables": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-is-nodes-equiv": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz",
+ "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=",
+ "dev": true
+ },
+ "babel-helper-is-void-0": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.3.0.tgz",
+ "integrity": "sha512-JVqdX8y7Rf/x4NwbqtUI7mdQjL9HWoDnoAEQ8Gv8oxzjvbJv+n75f7l36m9Y8C7sCUltX3V5edndrp7Hp1oSXQ==",
+ "dev": true
+ },
+ "babel-helper-mark-eval-scopes": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.3.0.tgz",
+ "integrity": "sha512-nrho5Dg4vl0VUgURVpGpEGiwbst5JX7efIyDHFxmkCx/ocQFnrPt8ze9Kxl6TKjR29bJ7D/XKY1NMlSxOQJRbQ==",
+ "dev": true
+ },
+ "babel-helper-optimise-call-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-regex": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
+ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-helper-remove-or-void": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.3.0.tgz",
+ "integrity": "sha512-D68W1M3ibCcbg0ysh3ww4/O0g10X1CXK720oOuR8kpfY7w0yP4tVcpK7zDmI1JecynycTQYAZ1rhLJo9aVtIKQ==",
+ "dev": true
+ },
+ "babel-helper-replace-supers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+ "dev": true,
+ "requires": {
+ "babel-helper-optimise-call-expression": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-to-multiple-sequence-expressions": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.3.0.tgz",
+ "integrity": "sha512-1uCrBD+EAaMnAYh7hc944n8Ga19y3daEnoXWPYDvFVsxMCc1l8aDjksApaCEaNSSuewq8BEcff47Cy1PbLg2Gw==",
+ "dev": true
+ },
+ "babel-helpers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
+ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-check-es2015-constants": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
+ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-external-helpers": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz",
+ "integrity": "sha1-IoX0iwK9Xe3oUXXK+MYuhq3M76E=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-minify-builtins": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.3.0.tgz",
+ "integrity": "sha512-MqhSHlxkmgURqj3144qPksbZ/qof1JWdumcbucc4tysFcf3P3V3z3munTevQgKEFNMd8F5/ECGnwb63xogLjAg==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.3.0"
+ }
+ },
+ "babel-plugin-minify-constant-folding": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.3.0.tgz",
+ "integrity": "sha512-1XeRpx+aY1BuNY6QU/cm6P+FtEi3ar3XceYbmC+4q4W+2Ewq5pL7V68oHg1hKXkBIE0Z4/FjSoHz6vosZLOe/A==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.3.0"
+ }
+ },
+ "babel-plugin-minify-dead-code-elimination": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.3.0.tgz",
+ "integrity": "sha512-SjM2Fzg85YZz+q/PNJ/HU4O3W98FKFOiP9K5z3sfonlamGOzvZw3Eup2OTiEBsbbqTeY8yzNCAv3qpJRYCgGmw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.3.0",
+ "babel-helper-mark-eval-scopes": "0.3.0",
+ "babel-helper-remove-or-void": "0.3.0",
+ "lodash.some": "4.6.0"
+ }
+ },
+ "babel-plugin-minify-flip-comparisons": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.3.0.tgz",
+ "integrity": "sha512-B8lK+ekcpSNVH7PZpWDe5nC5zxjRiiT4nTsa6h3QkF3Kk6y9qooIFLemdGlqBq6j0zALEnebvCpw8v7gAdpgnw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-is-void-0": "0.3.0"
+ }
+ },
+ "babel-plugin-minify-guarded-expressions": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.3.0.tgz",
+ "integrity": "sha512-O+6CvF5/Ttsth3LMg4/BhyvVZ82GImeKMXGdVRQGK/8jFiP15EjRpdgFlxv3cnqRjqdYxLCS6r28VfLpb9C/kA==",
+ "dev": true,
+ "requires": {
+ "babel-helper-flip-expressions": "0.3.0"
+ }
+ },
+ "babel-plugin-minify-infinity": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.3.0.tgz",
+ "integrity": "sha512-Sj8ia3/w9158DWieUxU6/VvnYVy59geeFEkVgLZYBE8EBP+sN48tHtBM/jSgz0ejEdBlcfqJ6TnvPmVXTzR2BQ==",
+ "dev": true
+ },
+ "babel-plugin-minify-mangle-names": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.3.0.tgz",
+ "integrity": "sha512-PYTonhFWURsfAN8achDwvR5Xgy6EeTClLz+fSgGRqjAIXb0OyFm3/xfccbQviVi1qDXmlSnt6oJhBg8KE4Fn7Q==",
+ "dev": true,
+ "requires": {
+ "babel-helper-mark-eval-scopes": "0.3.0"
+ }
+ },
+ "babel-plugin-minify-numeric-literals": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.3.0.tgz",
+ "integrity": "sha512-TgZj6ay8zDw74AS3yiIfoQ8vRSNJisYO/Du60S8nPV7EW7JM6fDMx5Sar6yVHlVuuwNgvDUBh191K33bVrAhpg==",
+ "dev": true
+ },
+ "babel-plugin-minify-replace": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.3.0.tgz",
+ "integrity": "sha512-VR6tTg2Lt0TicHIOw04fsUtpPw7RaRP8PC8YzSFwEixnzvguZjZJoL7TgG7ZyEWQD1cJ96UezswECmFNa815bg==",
+ "dev": true
+ },
+ "babel-plugin-minify-simplify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.3.0.tgz",
+ "integrity": "sha512-2M16ytQOCqBi7bYMu4DCWn8e6KyFCA108F6+tVrBJxOmm5u2sOmTFEa8s94tR9RHRRNYmcUf+rgidfnzL3ik9Q==",
+ "dev": true,
+ "requires": {
+ "babel-helper-flip-expressions": "0.3.0",
+ "babel-helper-is-nodes-equiv": "0.0.1",
+ "babel-helper-to-multiple-sequence-expressions": "0.3.0"
+ }
+ },
+ "babel-plugin-minify-type-constructors": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.3.0.tgz",
+ "integrity": "sha512-XRXpvsUCPeVw9YEUw+9vSiugcSZfow81oIJT0yR9s8H4W7yJ6FHbImi5DJHoL8KcDUjYnL9wYASXk/fOkbyR6Q==",
+ "dev": true,
+ "requires": {
+ "babel-helper-is-void-0": "0.3.0"
+ }
+ },
+ "babel-plugin-syntax-dynamic-import": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz",
+ "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=",
+ "dev": true
+ },
+ "babel-plugin-syntax-export-extensions": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz",
+ "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=",
+ "dev": true
+ },
+ "babel-plugin-syntax-object-rest-spread": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
+ "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=",
+ "dev": true
+ },
+ "babel-plugin-transform-es2015-arrow-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-block-scoped-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-block-scoping": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-plugin-transform-es2015-classes": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+ "dev": true,
+ "requires": {
+ "babel-helper-define-map": "6.26.0",
+ "babel-helper-function-name": "6.24.1",
+ "babel-helper-optimise-call-expression": "6.24.1",
+ "babel-helper-replace-supers": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-computed-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-destructuring": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-duplicate-keys": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-for-of": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+ "dev": true,
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-amd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-commonjs": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz",
+ "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-strict-mode": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-systemjs": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+ "dev": true,
+ "requires": {
+ "babel-helper-hoist-variables": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-umd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
+ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-object-super": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+ "dev": true,
+ "requires": {
+ "babel-helper-replace-supers": "6.24.1",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-parameters": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+ "dev": true,
+ "requires": {
+ "babel-helper-call-delegate": "6.24.1",
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-shorthand-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-spread": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-sticky-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+ "dev": true,
+ "requires": {
+ "babel-helper-regex": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-template-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-typeof-symbol": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-unicode-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+ "dev": true,
+ "requires": {
+ "babel-helper-regex": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "regexpu-core": "2.0.0"
+ }
+ },
+ "babel-plugin-transform-inline-consecutive-adds": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.3.0.tgz",
+ "integrity": "sha512-iZsYAIjYLLfLK0yN5WVT7Xf7Y3wQ9Z75j9A8q/0IglQSpUt2ppTdHlwl/GeaXnxdaSmsxBu861klbTBbv2n+RA==",
+ "dev": true
+ },
+ "babel-plugin-transform-member-expression-literals": {
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.0.tgz",
+ "integrity": "sha512-bxtac+8w755ctVeDs4vU98RhWY49eW1wO02HAN+eirZYSKk/dVrKONIznXbHmxWKxT4UX1rpTKOCyezuzLpbTw==",
+ "dev": true
+ },
+ "babel-plugin-transform-merge-sibling-variables": {
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.0.tgz",
+ "integrity": "sha512-9G1URVEEKoQLDqe0GwqYudECN7kE/q0OCNo5TiD1iwWnnaKi97xY915l5r2KKUvNflXEm9c3faNWknSXYQ7h6Q==",
+ "dev": true
+ },
+ "babel-plugin-transform-minify-booleans": {
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.0.tgz",
+ "integrity": "sha512-JtpyTRyF+wF/r7GSxpRbNCrVve5M/aCC8xoGcnFItaPUDqjxKmFYvBzMc9u+g0lgo8NWjuZLc16MYaIwkHKD/A==",
+ "dev": true
+ },
+ "babel-plugin-transform-object-rest-spread": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
+ "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-syntax-object-rest-spread": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-property-literals": {
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.0.tgz",
+ "integrity": "sha512-B8s+71+4DPye9+pmZiPGgLPy3YqcmIuvE/9UcZLczPlwL5ALwF6qRUdLC3Fk17NhL6jxp4u33ZVZ8R4kvASPzw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "babel-plugin-transform-regenerator": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
+ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+ "dev": true,
+ "requires": {
+ "regenerator-transform": "0.10.1"
+ }
+ },
+ "babel-plugin-transform-regexp-constructors": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.3.0.tgz",
+ "integrity": "sha512-h92YHzyl042rb0naKO8frTHntpRFwRgKkfWD8602kFHoQingjJNtbvZzvxqHncJ6XmKVyYvfrBpDOSkCTDIIxw==",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-console": {
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.0.tgz",
+ "integrity": "sha512-mck9//yGTwObqqqDzY/sISO88/5/XfIB3ILb4uJLXk2xq124NT4yQVjFSRgVSbLcNq8OyBAn2acxKUqg4W/okQ==",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-debugger": {
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.0.tgz",
+ "integrity": "sha512-i/HWGjsmL2d1N2dl+eIzf44XpSP5v7hi1/GXB0xzom9kjrU8js3T8Kadizn95ZxfHK592Vg8P4JJWP/fvimEWw==",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-undefined": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.3.0.tgz",
+ "integrity": "sha512-TYGQucc8iP3LJwN3kDZLEz5aa/2KuFrqpT+s8f8NnHsBU1sAgR3y8Opns0xhC+smyDYWscqFCKM1gbkWQOhhnw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.3.0"
+ }
+ },
+ "babel-plugin-transform-simplify-comparison-operators": {
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.0.tgz",
+ "integrity": "sha512-EJyfYeph0CSekwQuwWVwJqy2go/bETkR95iaWQ/HTUis7tkCGNYmXngaFzuIXdmoPXfvmXYCvAXR4/93hqHVjw==",
+ "dev": true
+ },
+ "babel-plugin-transform-strict-mode": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-undefined-to-void": {
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.0.tgz",
+ "integrity": "sha512-AVDVEmp0S9mbF1O8zekWbsOOmqnR08PZah5NRZJqSvJnFgiL0ep4Lwo4EymH8OieJR2QgQdR3q71TNW+wiVn4g==",
+ "dev": true
+ },
+ "babel-preset-es2015": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz",
+ "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-check-es2015-constants": "6.22.0",
+ "babel-plugin-transform-es2015-arrow-functions": "6.22.0",
+ "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0",
+ "babel-plugin-transform-es2015-block-scoping": "6.26.0",
+ "babel-plugin-transform-es2015-classes": "6.24.1",
+ "babel-plugin-transform-es2015-computed-properties": "6.24.1",
+ "babel-plugin-transform-es2015-destructuring": "6.23.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
+ "babel-plugin-transform-es2015-for-of": "6.23.0",
+ "babel-plugin-transform-es2015-function-name": "6.24.1",
+ "babel-plugin-transform-es2015-literals": "6.22.0",
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
+ "babel-plugin-transform-es2015-modules-systemjs": "6.24.1",
+ "babel-plugin-transform-es2015-modules-umd": "6.24.1",
+ "babel-plugin-transform-es2015-object-super": "6.24.1",
+ "babel-plugin-transform-es2015-parameters": "6.24.1",
+ "babel-plugin-transform-es2015-shorthand-properties": "6.24.1",
+ "babel-plugin-transform-es2015-spread": "6.22.0",
+ "babel-plugin-transform-es2015-sticky-regex": "6.24.1",
+ "babel-plugin-transform-es2015-template-literals": "6.22.0",
+ "babel-plugin-transform-es2015-typeof-symbol": "6.23.0",
+ "babel-plugin-transform-es2015-unicode-regex": "6.24.1",
+ "babel-plugin-transform-regenerator": "6.26.0"
+ }
+ },
+ "babel-preset-minify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.3.0.tgz",
+ "integrity": "sha512-+VV2GWEyak3eDOmzT1DDMuqHrw3VbE9nBNkx2LLVs4pH/Me32ND8DRpVDd8IRvk1xX5p75nygyRPtkMh6GIAbQ==",
+ "dev": true,
+ "requires": {
+ "babel-plugin-minify-builtins": "0.3.0",
+ "babel-plugin-minify-constant-folding": "0.3.0",
+ "babel-plugin-minify-dead-code-elimination": "0.3.0",
+ "babel-plugin-minify-flip-comparisons": "0.3.0",
+ "babel-plugin-minify-guarded-expressions": "0.3.0",
+ "babel-plugin-minify-infinity": "0.3.0",
+ "babel-plugin-minify-mangle-names": "0.3.0",
+ "babel-plugin-minify-numeric-literals": "0.3.0",
+ "babel-plugin-minify-replace": "0.3.0",
+ "babel-plugin-minify-simplify": "0.3.0",
+ "babel-plugin-minify-type-constructors": "0.3.0",
+ "babel-plugin-transform-inline-consecutive-adds": "0.3.0",
+ "babel-plugin-transform-member-expression-literals": "6.9.0",
+ "babel-plugin-transform-merge-sibling-variables": "6.9.0",
+ "babel-plugin-transform-minify-booleans": "6.9.0",
+ "babel-plugin-transform-property-literals": "6.9.0",
+ "babel-plugin-transform-regexp-constructors": "0.3.0",
+ "babel-plugin-transform-remove-console": "6.9.0",
+ "babel-plugin-transform-remove-debugger": "6.9.0",
+ "babel-plugin-transform-remove-undefined": "0.3.0",
+ "babel-plugin-transform-simplify-comparison-operators": "6.9.0",
+ "babel-plugin-transform-undefined-to-void": "6.9.0",
+ "lodash.isplainobject": "4.0.6"
+ }
+ },
+ "babel-register": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
+ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+ "dev": true,
+ "requires": {
+ "babel-core": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "core-js": "2.5.3",
+ "home-or-tmp": "2.0.0",
+ "lodash": "4.17.5",
+ "mkdirp": "0.5.1",
+ "source-map-support": "0.4.18"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "backo2": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+ "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ }
+ }
+ },
+ "base64-arraybuffer": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
+ "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
+ "dev": true
+ },
+ "base64-js": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz",
+ "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=",
+ "dev": true,
+ "optional": true
+ },
+ "base64id": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
+ "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=",
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
+ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "beeper": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz",
+ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=",
+ "dev": true
+ },
+ "better-assert": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
+ "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
+ "dev": true,
+ "requires": {
+ "callsite": "1.0.0"
+ }
+ },
+ "bl": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz",
+ "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.5"
+ }
+ },
+ "blob": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
+ "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=",
+ "dev": true
+ },
+ "body-parser": {
+ "version": "1.18.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
+ "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
+ "dev": true,
+ "requires": {
+ "bytes": "3.0.0",
+ "content-type": "1.0.4",
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "http-errors": "1.6.2",
+ "iconv-lite": "0.4.19",
+ "on-finished": "2.3.0",
+ "qs": "6.5.1",
+ "raw-body": "2.3.2",
+ "type-is": "1.6.16"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "boom": {
+ "version": "2.10.1",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
+ "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
+ "dev": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "boxen": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
+ "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
+ "dev": true,
+ "requires": {
+ "ansi-align": "2.0.0",
+ "camelcase": "4.1.0",
+ "chalk": "2.3.2",
+ "cli-boxes": "1.0.0",
+ "string-width": "2.1.1",
+ "term-size": "1.2.0",
+ "widest-line": "2.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ }
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz",
+ "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "kind-of": "6.0.2",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "browser-capabilities": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/browser-capabilities/-/browser-capabilities-0.2.2.tgz",
+ "integrity": "sha512-iS5g9+yT/T7jr9BTjDi5Hu2soieyce457ad+fdp6uDlYp6pacX7ZG/nYtCZ+KQiMCxRfbd65OhAg7GbVJ3RcBw==",
+ "dev": true,
+ "requires": {
+ "@types/ua-parser-js": "0.7.32",
+ "ua-parser-js": "0.7.17"
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
+ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
+ "dev": true
+ },
+ "browserstack": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.0.tgz",
+ "integrity": "sha1-tWVCWtYu1ywQgqHrl51TE8fUdU8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "https-proxy-agent": "1.0.0"
+ }
+ },
+ "buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
+ "dev": true
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "busboy": {
+ "version": "0.2.14",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz",
+ "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=",
+ "dev": true,
+ "requires": {
+ "dicer": "0.2.5",
+ "readable-stream": "1.1.14"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+ "dev": true
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "caller-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+ "dev": true,
+ "requires": {
+ "callsites": "0.2.0"
+ }
+ },
+ "callsite": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
+ "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
+ "dev": true
+ },
+ "callsites": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+ "dev": true
+ },
+ "camel-case": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
+ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+ "dev": true,
+ "requires": {
+ "no-case": "2.3.2",
+ "upper-case": "1.1.3"
+ }
+ },
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "2.1.1",
+ "map-obj": "1.0.1"
+ }
+ },
+ "capture-stack-trace": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz",
+ "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
+ "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
+ "dev": true
+ },
+ "chai": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz",
+ "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=",
+ "dev": true,
+ "requires": {
+ "assertion-error": "1.1.0",
+ "deep-eql": "0.1.3",
+ "type-detect": "1.0.0"
+ }
+ },
+ "chalk": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.3.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "supports-color": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "chardet": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
+ "dev": true
+ },
+ "charenc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+ "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=",
+ "dev": true
+ },
+ "check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+ "dev": true
+ },
+ "circular-json": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
+ "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
+ "dev": true
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "clean-css": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz",
+ "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7"
+ }
+ },
+ "cleankill": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/cleankill/-/cleankill-2.0.0.tgz",
+ "integrity": "sha1-WYMN/ItBHVPccq0J1Fp46jMWGpE=",
+ "dev": true
+ },
+ "cli-boxes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
+ "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
+ "dev": true
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "2.0.0"
+ }
+ },
+ "cli-width": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+ "dev": true
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "clone-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+ "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
+ "dev": true
+ },
+ "cloneable-readable": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz",
+ "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "process-nextick-args": "2.0.0",
+ "readable-stream": "2.3.5"
+ }
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
+ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "1.0.0"
+ }
+ },
+ "command-line-args": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-3.0.5.tgz",
+ "integrity": "sha1-W9StReeYPlwTRJGOQCgO4mk8WsA=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "find-replace": "1.0.3",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-3.0.8.tgz",
+ "integrity": "sha1-tqIJeMGzg0d/XBGlKUKLiAv+D00=",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "3.0.0",
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "table-layout": "0.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "commander": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
+ "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
+ "dev": true,
+ "requires": {
+ "graceful-readlink": "1.0.1"
+ }
+ },
+ "component-bind": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
+ "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
+ "dev": true
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "component-inherit": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
+ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
+ "dev": true
+ },
+ "compress-commons": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz",
+ "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=",
+ "dev": true,
+ "requires": {
+ "buffer-crc32": "0.2.13",
+ "crc32-stream": "2.0.0",
+ "normalize-path": "2.1.1",
+ "readable-stream": "2.3.5"
+ }
+ },
+ "compressible": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz",
+ "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.33.0"
+ }
+ },
+ "compression": {
+ "version": "1.7.2",
+ "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz",
+ "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=",
+ "dev": true,
+ "requires": {
+ "accepts": "1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "2.0.13",
+ "debug": "2.6.9",
+ "on-headers": "1.0.1",
+ "safe-buffer": "5.1.1",
+ "vary": "1.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "concat-stream": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz",
+ "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5",
+ "typedarray": "0.0.6"
+ }
+ },
+ "configstore": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz",
+ "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==",
+ "dev": true,
+ "requires": {
+ "dot-prop": "4.2.0",
+ "graceful-fs": "4.1.11",
+ "make-dir": "1.2.0",
+ "unique-string": "1.0.0",
+ "write-file-atomic": "2.3.0",
+ "xdg-basedir": "3.0.0"
+ }
+ },
+ "content-disposition": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+ "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
+ "dev": true
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "dev": true
+ },
+ "convert-source-map": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
+ "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
+ "dev": true
+ },
+ "cookie": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
+ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
+ "dev": true
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "crc": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/crc/-/crc-3.2.1.tgz",
+ "integrity": "sha1-XZyPt3okXNXsopHl0tAFM0urAII=",
+ "dev": true
+ },
+ "crc32-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz",
+ "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=",
+ "dev": true,
+ "requires": {
+ "crc": "3.5.0",
+ "readable-stream": "2.3.5"
+ },
+ "dependencies": {
+ "crc": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz",
+ "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=",
+ "dev": true
+ }
+ }
+ },
+ "create-error-class": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+ "dev": true,
+ "requires": {
+ "capture-stack-trace": "1.0.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "4.1.2",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ }
+ },
+ "crypt": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+ "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=",
+ "dev": true
+ },
+ "cryptiles": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
+ "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
+ "dev": true,
+ "requires": {
+ "boom": "2.10.1"
+ }
+ },
+ "crypto-random-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
+ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
+ "dev": true
+ },
+ "css": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/css/-/css-2.2.1.tgz",
+ "integrity": "sha1-c6TIHehdtmTU7mdPfUcIXjstVdw=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "source-map": "0.1.43",
+ "source-map-resolve": "0.3.1",
+ "urix": "0.1.0"
+ },
+ "dependencies": {
+ "atob": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-1.1.3.tgz",
+ "integrity": "sha1-lfE2KbEsOlGl0hWr3OKqnzL4B3M=",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.1.43",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
+ "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
+ "dev": true,
+ "requires": {
+ "amdefine": "1.0.1"
+ }
+ },
+ "source-map-resolve": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.3.1.tgz",
+ "integrity": "sha1-YQ9hIqRFuN1RU1oqcbeD38Ekh2E=",
+ "dev": true,
+ "requires": {
+ "atob": "1.1.3",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.3.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.3.0.tgz",
+ "integrity": "sha1-fsrxO1e80J2opAxdJp2zN5nUqvk=",
+ "dev": true
+ }
+ }
+ },
+ "css-slam": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/css-slam/-/css-slam-2.1.0.tgz",
+ "integrity": "sha512-WY1C869GTC5zNMFsQUkiW+JB4TkCQ6XJC5LaCqFfVd0KiZu563/KnacaMYpCj6mSooTMGij5g809e4Lp4x+WvQ==",
+ "dev": true,
+ "requires": {
+ "command-line-args": "3.0.5",
+ "command-line-usage": "3.0.8",
+ "dom5": "3.0.0",
+ "parse5": "4.0.0",
+ "shady-css-parser": "0.1.0"
+ },
+ "dependencies": {
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ }
+ }
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "dev": true,
+ "requires": {
+ "array-find-index": "1.0.2"
+ }
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "d": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
+ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
+ "dev": true,
+ "requires": {
+ "es5-ext": "0.10.40"
+ }
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "dateformat": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
+ "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "debug-fabulous": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.0.0.tgz",
+ "integrity": "sha512-dsd50qQ1atDeurcxL7XOjPp4nZCGZzWIONDujDXzl1atSyC3hMbZD+v6440etw+Vt0Pr8ce4TQzHfX3KZM05Mw==",
+ "dev": true,
+ "requires": {
+ "debug": "3.1.0",
+ "memoizee": "0.4.12",
+ "object-assign": "4.1.1"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-eql": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
+ "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=",
+ "dev": true,
+ "requires": {
+ "type-detect": "0.1.1"
+ },
+ "dependencies": {
+ "type-detect": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
+ "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=",
+ "dev": true
+ }
+ }
+ },
+ "deep-extend": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
+ "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "defaults": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.3"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
+ "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=",
+ "dev": true
+ }
+ }
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ }
+ },
+ "del": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
+ "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
+ "dev": true,
+ "requires": {
+ "globby": "6.1.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.0",
+ "p-map": "1.2.0",
+ "pify": "3.0.0",
+ "rimraf": "2.6.2"
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true
+ },
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+ "dev": true
+ },
+ "deprecated": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz",
+ "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=",
+ "dev": true
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+ "dev": true
+ },
+ "detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "detect-newline": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
+ "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=",
+ "dev": true
+ },
+ "detect-node": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz",
+ "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=",
+ "dev": true
+ },
+ "dicer": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz",
+ "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.1.14",
+ "streamsearch": "0.1.2"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "diff": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz",
+ "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom-serializer": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
+ "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1.1.3",
+ "entities": "1.1.1"
+ },
+ "dependencies": {
+ "domelementtype": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
+ "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
+ "dev": true
+ }
+ }
+ },
+ "dom-urls": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz",
+ "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=",
+ "dev": true,
+ "requires": {
+ "urijs": "1.19.1"
+ }
+ },
+ "dom5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz",
+ "integrity": "sha1-+CBJdb0NrLvltYqKk//B/tD/zSo=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "6.0.102",
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "2.2.3"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.102",
+ "resolved": "http://registry.npmjs.org/@types/node/-/node-6.0.102.tgz",
+ "integrity": "sha512-EhNufyBoC1Kqaj+XMHGzi6mPUC8wVABOMTPE5XaSJc49LIVvXsyrV1HYMAPTUViT7E4wLUB38OdDmb+HshjGmA==",
+ "dev": true
+ }
+ }
+ },
+ "domelementtype": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
+ "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
+ "dev": true
+ },
+ "domhandler": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz",
+ "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1.3.0"
+ }
+ },
+ "domutils": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+ "dev": true,
+ "requires": {
+ "dom-serializer": "0.1.0",
+ "domelementtype": "1.3.0"
+ }
+ },
+ "dot-prop": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
+ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
+ "dev": true,
+ "requires": {
+ "is-obj": "1.0.1"
+ }
+ },
+ "duplexer": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
+ "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
+ "dev": true
+ },
+ "duplexer2": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
+ "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.1.14"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "duplexer3": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+ "dev": true
+ },
+ "duplexify": {
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz",
+ "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5",
+ "stream-shift": "1.0.0"
+ },
+ "dependencies": {
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0"
+ }
+ }
+ }
+ },
+ "ecc-jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
+ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "jsbn": "0.1.1"
+ }
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+ "dev": true
+ },
+ "emitter-component": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.1.tgz",
+ "integrity": "sha1-Bl4tvtaVm/RwZ57avq95gdEAOrY=",
+ "dev": true
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+ "dev": true
+ },
+ "end-of-stream": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz",
+ "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=",
+ "dev": true,
+ "requires": {
+ "once": "1.3.3"
+ },
+ "dependencies": {
+ "once": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
+ "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ }
+ }
+ },
+ "engine.io": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.5.tgz",
+ "integrity": "sha512-D06ivJkYxyRrcEe0bTpNnBQNgP9d3xog+qZlLbui8EsMr/DouQpf5o9FzJnWYHEYE0YsFHllUv2R1dkgYZXHcA==",
+ "dev": true,
+ "requires": {
+ "accepts": "1.3.5",
+ "base64id": "1.0.0",
+ "cookie": "0.3.1",
+ "debug": "3.1.0",
+ "engine.io-parser": "2.1.2",
+ "uws": "9.14.0",
+ "ws": "3.3.3"
+ }
+ },
+ "engine.io-client": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.6.tgz",
+ "integrity": "sha512-hnuHsFluXnsKOndS4Hv6SvUrgdYx1pk2NqfaDMW+GWdgfU3+/V25Cj7I8a0x92idSpa5PIhJRKxPvp9mnoLsfg==",
+ "dev": true,
+ "requires": {
+ "component-emitter": "1.2.1",
+ "component-inherit": "0.0.3",
+ "debug": "3.1.0",
+ "engine.io-parser": "2.1.2",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "parseqs": "0.0.5",
+ "parseuri": "0.0.5",
+ "ws": "3.3.3",
+ "xmlhttprequest-ssl": "1.5.5",
+ "yeast": "0.1.2"
+ }
+ },
+ "engine.io-parser": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz",
+ "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==",
+ "dev": true,
+ "requires": {
+ "after": "0.8.2",
+ "arraybuffer.slice": "0.0.7",
+ "base64-arraybuffer": "0.1.5",
+ "blob": "0.0.4",
+ "has-binary2": "1.0.2"
+ }
+ },
+ "entities": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
+ "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
+ "dev": true
+ },
+ "error-ex": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "0.2.1"
+ }
+ },
+ "es5-ext": {
+ "version": "0.10.40",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.40.tgz",
+ "integrity": "sha512-S9Fh3oya5OOvYSNGvPZJ+vyrs6VYpe1IXPowVe3N1OhaiwVaGlwfn3Zf5P5klYcWOA0toIwYQW8XEv/QqhdHvQ==",
+ "dev": true,
+ "requires": {
+ "es6-iterator": "2.0.3",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.40",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "es6-promise": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
+ "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==",
+ "dev": true
+ },
+ "es6-symbol": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.40"
+ }
+ },
+ "es6-weak-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
+ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.40",
+ "es6-iterator": "2.0.3",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "eslint": {
+ "version": "4.19.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
+ "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "babel-code-frame": "6.26.0",
+ "chalk": "2.3.2",
+ "concat-stream": "1.6.1",
+ "cross-spawn": "5.1.0",
+ "debug": "3.1.0",
+ "doctrine": "2.1.0",
+ "eslint-scope": "3.7.1",
+ "eslint-visitor-keys": "1.0.0",
+ "espree": "3.5.4",
+ "esquery": "1.0.1",
+ "esutils": "2.0.2",
+ "file-entry-cache": "2.0.0",
+ "functional-red-black-tree": "1.0.1",
+ "glob": "7.1.2",
+ "globals": "11.4.0",
+ "ignore": "3.3.7",
+ "imurmurhash": "0.1.4",
+ "inquirer": "3.3.0",
+ "is-resolvable": "1.1.0",
+ "js-yaml": "3.11.0",
+ "json-stable-stringify-without-jsonify": "1.0.1",
+ "levn": "0.3.0",
+ "lodash": "4.17.5",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.1",
+ "natural-compare": "1.4.0",
+ "optionator": "0.8.2",
+ "path-is-inside": "1.0.2",
+ "pluralize": "7.0.0",
+ "progress": "2.0.0",
+ "regexpp": "1.1.0",
+ "require-uncached": "1.0.3",
+ "semver": "5.5.0",
+ "strip-ansi": "4.0.0",
+ "strip-json-comments": "2.0.1",
+ "table": "4.0.2",
+ "text-table": "0.2.0"
+ }
+ },
+ "eslint-plugin-html": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-3.2.2.tgz",
+ "integrity": "sha512-sSuafathF6ImPrzF2vUKEJY6Llq06d/riMTMzlsruDRDhNsQMYp2viUKo+jx+JRr1QevskeUpQcuptp2gN1XVQ==",
+ "dev": true,
+ "requires": {
+ "htmlparser2": "3.9.2",
+ "semver": "5.5.0"
+ }
+ },
+ "eslint-scope": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
+ "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
+ "dev": true,
+ "requires": {
+ "esrecurse": "4.2.1",
+ "estraverse": "4.2.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
+ "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
+ "dev": true
+ },
+ "espree": {
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
+ "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
+ "dev": true,
+ "requires": {
+ "acorn": "5.5.3",
+ "acorn-jsx": "3.0.1"
+ }
+ },
+ "esprima": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
+ "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
+ "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
+ "dev": true,
+ "requires": {
+ "estraverse": "4.2.0"
+ }
+ },
+ "esrecurse": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
+ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+ "dev": true,
+ "requires": {
+ "estraverse": "4.2.0"
+ }
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+ "dev": true
+ },
+ "event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.40"
+ }
+ },
+ "eventemitter3": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz",
+ "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=",
+ "dev": true
+ },
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "5.1.0",
+ "get-stream": "3.0.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.2",
+ "strip-eof": "1.0.0"
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "expand-range": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+ "dev": true,
+ "requires": {
+ "fill-range": "2.2.3"
+ },
+ "dependencies": {
+ "fill-range": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
+ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
+ "dev": true,
+ "requires": {
+ "is-number": "2.1.0",
+ "isobject": "2.1.0",
+ "randomatic": "1.1.7",
+ "repeat-element": "1.1.2",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "1.0.1"
+ }
+ },
+ "express": {
+ "version": "4.16.3",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz",
+ "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
+ "dev": true,
+ "requires": {
+ "accepts": "1.3.5",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.18.2",
+ "content-disposition": "0.5.2",
+ "content-type": "1.0.4",
+ "cookie": "0.3.1",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.8.1",
+ "finalhandler": "1.1.1",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "1.1.2",
+ "on-finished": "2.3.0",
+ "parseurl": "1.3.2",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "2.0.3",
+ "qs": "6.5.1",
+ "range-parser": "1.2.0",
+ "safe-buffer": "5.1.1",
+ "send": "0.16.2",
+ "serve-static": "1.13.2",
+ "setprototypeof": "1.1.0",
+ "statuses": "1.4.0",
+ "type-is": "1.6.16",
+ "utils-merge": "1.0.1",
+ "vary": "1.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "send": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
+ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "destroy": "1.0.4",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "1.6.2",
+ "mime": "1.4.1",
+ "ms": "2.0.0",
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.0",
+ "statuses": "1.4.0"
+ }
+ },
+ "setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "dev": true
+ }
+ }
+ },
+ "extend": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "external-editor": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
+ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
+ "dev": true,
+ "requires": {
+ "chardet": "0.4.2",
+ "iconv-lite": "0.4.19",
+ "tmp": "0.0.33"
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fancy-log": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
+ "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
+ "dev": true,
+ "requires": {
+ "ansi-gray": "0.1.1",
+ "color-support": "1.1.3",
+ "time-stamp": "1.1.0"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+ "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fd-slicer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
+ "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "pend": "1.2.0"
+ }
+ },
+ "feature-detect-es6": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/feature-detect-es6/-/feature-detect-es6-1.4.0.tgz",
+ "integrity": "sha512-7OnRV38WLydGuGcdm/fGk2SG9uo5ljslBSbPhCfEW5Gl0lX/IliaAVXYiYUBcI0UHTbepqO4T1SkJ74K8gtcDg==",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4"
+ }
+ },
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "file-entry-cache": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
+ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+ "dev": true,
+ "requires": {
+ "flat-cache": "1.3.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "filename-regex": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "finalhandler": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
+ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "on-finished": "2.3.0",
+ "parseurl": "1.3.2",
+ "statuses": "1.4.0",
+ "unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "find-index": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz",
+ "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=",
+ "dev": true
+ },
+ "find-port": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/find-port/-/find-port-1.0.1.tgz",
+ "integrity": "sha1-2whKbL+ZVk2Zhprnn73s9m6KGFw=",
+ "dev": true,
+ "requires": {
+ "async": "0.2.10"
+ },
+ "dependencies": {
+ "async": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
+ "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
+ "dev": true
+ }
+ }
+ },
+ "find-replace": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz",
+ "integrity": "sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "test-value": "2.1.0"
+ }
+ },
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "requires": {
+ "path-exists": "2.1.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "findup-sync": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
+ "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
+ "dev": true,
+ "requires": {
+ "detect-file": "1.0.0",
+ "is-glob": "3.1.0",
+ "micromatch": "3.1.9",
+ "resolve-dir": "1.0.1"
+ }
+ },
+ "fined": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz",
+ "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "is-plain-object": "2.0.4",
+ "object.defaults": "1.1.0",
+ "object.pick": "1.3.0",
+ "parse-filepath": "1.0.2"
+ }
+ },
+ "first-chunk-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz",
+ "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=",
+ "dev": true
+ },
+ "flagged-respawn": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz",
+ "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=",
+ "dev": true
+ },
+ "flat-cache": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
+ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
+ "dev": true,
+ "requires": {
+ "circular-json": "0.3.3",
+ "del": "2.2.2",
+ "graceful-fs": "4.1.11",
+ "write": "0.2.1"
+ },
+ "dependencies": {
+ "del": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "dev": true,
+ "requires": {
+ "globby": "5.0.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.0",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "rimraf": "2.6.2"
+ }
+ },
+ "globby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+ "dev": true,
+ "requires": {
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "dev": true
+ },
+ "fork-stream": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz",
+ "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=",
+ "dev": true
+ },
+ "form-data": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
+ "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
+ "dev": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.6",
+ "mime-types": "2.1.18"
+ }
+ },
+ "formatio": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz",
+ "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=",
+ "dev": true,
+ "requires": {
+ "samsam": "1.1.2"
+ }
+ },
+ "forwarded": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "freeport": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/freeport/-/freeport-1.0.5.tgz",
+ "integrity": "sha1-JV6KuEFwwzuoXZkOghrl9KGpvF0=",
+ "dev": true,
+ "optional": true
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+ "dev": true
+ },
+ "fs-exists-sync": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
+ "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "gaze": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz",
+ "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=",
+ "dev": true,
+ "requires": {
+ "globule": "0.1.0"
+ }
+ },
+ "generate-function": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
+ "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=",
+ "dev": true
+ },
+ "generate-object-property": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
+ "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
+ "dev": true,
+ "requires": {
+ "is-property": "1.0.2"
+ }
+ },
+ "get-func-name": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-base": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+ "dev": true,
+ "requires": {
+ "glob-parent": "2.0.0",
+ "is-glob": "2.0.1"
+ },
+ "dependencies": {
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+ "dev": true,
+ "requires": {
+ "is-glob": "2.0.1"
+ },
+ "dependencies": {
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ }
+ }
+ },
+ "glob-stream": {
+ "version": "3.1.18",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz",
+ "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=",
+ "dev": true,
+ "requires": {
+ "glob": "4.5.3",
+ "glob2base": "0.0.12",
+ "minimatch": "2.0.10",
+ "ordered-read-streams": "0.1.0",
+ "through2": "0.6.5",
+ "unique-stream": "1.0.0"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "4.5.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz",
+ "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=",
+ "dev": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "2.0.10",
+ "once": "1.4.0"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz",
+ "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "glob-watcher": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz",
+ "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=",
+ "dev": true,
+ "requires": {
+ "gaze": "0.5.2"
+ }
+ },
+ "glob2base": {
+ "version": "0.0.12",
+ "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz",
+ "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=",
+ "dev": true,
+ "requires": {
+ "find-index": "0.1.1"
+ }
+ },
+ "global-dirs": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+ "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
+ "dev": true,
+ "requires": {
+ "ini": "1.3.5"
+ }
+ },
+ "global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "dev": true,
+ "requires": {
+ "global-prefix": "1.0.2",
+ "is-windows": "1.0.2",
+ "resolve-dir": "1.0.1"
+ }
+ },
+ "global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "homedir-polyfill": "1.0.1",
+ "ini": "1.3.5",
+ "is-windows": "1.0.2",
+ "which": "1.3.0"
+ }
+ },
+ "globals": {
+ "version": "11.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.4.0.tgz",
+ "integrity": "sha512-Dyzmifil8n/TmSqYDEXbm+C8yitzJQqQIlJQLNRMwa+BOUJpRC19pyVeN12JAjt61xonvXjtff+hJruTRXn5HA==",
+ "dev": true
+ },
+ "globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+ "dev": true,
+ "requires": {
+ "array-union": "1.0.2",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "globule": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz",
+ "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=",
+ "dev": true,
+ "requires": {
+ "glob": "3.1.21",
+ "lodash": "1.0.2",
+ "minimatch": "0.2.14"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "3.1.21",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz",
+ "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "1.2.3",
+ "inherits": "1.0.2",
+ "minimatch": "0.2.14"
+ }
+ },
+ "graceful-fs": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
+ "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
+ "dev": true
+ },
+ "inherits": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz",
+ "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=",
+ "dev": true
+ },
+ "lodash": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz",
+ "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
+ "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "0.2.14",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
+ "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "2.7.3",
+ "sigmund": "1.0.1"
+ }
+ }
+ }
+ },
+ "glogg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz",
+ "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==",
+ "dev": true,
+ "requires": {
+ "sparkles": "1.0.0"
+ }
+ },
+ "google-closure-compiler": {
+ "version": "20170910.0.0",
+ "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20170910.0.0.tgz",
+ "integrity": "sha1-enz1ER1zdrN2znRhE34bA5MD8eo=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "vinyl": "2.1.0",
+ "vinyl-sourcemaps-apply": "0.2.1"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "got": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+ "dev": true,
+ "requires": {
+ "create-error-class": "3.0.2",
+ "duplexer3": "0.1.4",
+ "get-stream": "3.0.0",
+ "is-redirect": "1.0.0",
+ "is-retry-allowed": "1.1.0",
+ "is-stream": "1.1.0",
+ "lowercase-keys": "1.0.0",
+ "safe-buffer": "5.1.1",
+ "timed-out": "4.0.1",
+ "unzip-response": "2.0.1",
+ "url-parse-lax": "1.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "graceful-readlink": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
+ "dev": true
+ },
+ "growl": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz",
+ "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=",
+ "dev": true
+ },
+ "gulp": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz",
+ "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=",
+ "dev": true,
+ "requires": {
+ "archy": "1.0.0",
+ "chalk": "1.1.3",
+ "deprecated": "0.0.1",
+ "gulp-util": "3.0.8",
+ "interpret": "1.1.0",
+ "liftoff": "2.5.0",
+ "minimist": "1.2.0",
+ "orchestrator": "0.3.8",
+ "pretty-hrtime": "1.0.3",
+ "semver": "4.3.6",
+ "tildify": "1.2.0",
+ "v8flags": "2.1.1",
+ "vinyl-fs": "0.3.14"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "semver": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
+ "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "gulp-if": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz",
+ "integrity": "sha1-pJe351cwBQQcqivIt92jyARE1ik=",
+ "dev": true,
+ "requires": {
+ "gulp-match": "1.0.3",
+ "ternary-stream": "2.0.1",
+ "through2": "2.0.3"
+ }
+ },
+ "gulp-match": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.0.3.tgz",
+ "integrity": "sha1-kcfA1/Kb7NZgbVfYCn+Hdqh6uo4=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "gulp-rename": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz",
+ "integrity": "sha1-OtRCh2PwXidk3sHGfYaNsnVoeBc=",
+ "dev": true
+ },
+ "gulp-size": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/gulp-size/-/gulp-size-2.1.0.tgz",
+ "integrity": "sha1-HCtk8X+QcdWr2Z0VS3s0gfj7oSg=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "gulp-util": "3.0.8",
+ "gzip-size": "3.0.0",
+ "object-assign": "4.1.1",
+ "pretty-bytes": "3.0.1",
+ "stream-counter": "1.0.0",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "gulp-sourcemaps": {
+ "version": "2.6.4",
+ "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.4.tgz",
+ "integrity": "sha1-y7IAhFCxvM5s0jv5gze+dRv24wo=",
+ "dev": true,
+ "requires": {
+ "@gulp-sourcemaps/identity-map": "1.0.1",
+ "@gulp-sourcemaps/map-sources": "1.0.0",
+ "acorn": "5.5.3",
+ "convert-source-map": "1.5.1",
+ "css": "2.2.1",
+ "debug-fabulous": "1.0.0",
+ "detect-newline": "2.1.0",
+ "graceful-fs": "4.1.11",
+ "source-map": "0.6.1",
+ "strip-bom-string": "1.0.0",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "gulp-util": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
+ "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
+ "dev": true,
+ "requires": {
+ "array-differ": "1.0.0",
+ "array-uniq": "1.0.3",
+ "beeper": "1.1.1",
+ "chalk": "1.1.3",
+ "dateformat": "2.2.0",
+ "fancy-log": "1.3.2",
+ "gulplog": "1.0.0",
+ "has-gulplog": "0.1.0",
+ "lodash._reescape": "3.0.0",
+ "lodash._reevaluate": "3.0.0",
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.template": "3.6.2",
+ "minimist": "1.2.0",
+ "multipipe": "0.1.2",
+ "object-assign": "3.0.0",
+ "replace-ext": "0.0.1",
+ "through2": "2.0.3",
+ "vinyl": "0.5.3"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
+ "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
+ "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
+ "dev": true
+ },
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "vinyl": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
+ "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.3",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ }
+ }
+ },
+ "gulplog": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
+ "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
+ "dev": true,
+ "requires": {
+ "glogg": "1.0.1"
+ }
+ },
+ "gzip-size": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz",
+ "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=",
+ "dev": true,
+ "requires": {
+ "duplexer": "0.1.1"
+ }
+ },
+ "handle-thing": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz",
+ "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
+ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "commander": "2.9.0",
+ "is-my-json-valid": "2.17.2",
+ "pinkie-promise": "2.0.1"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-binary2": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz",
+ "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=",
+ "dev": true,
+ "requires": {
+ "isarray": "2.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+ "dev": true
+ }
+ }
+ },
+ "has-color": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz",
+ "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=",
+ "dev": true
+ },
+ "has-cors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+ "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-gulplog": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz",
+ "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
+ "dev": true,
+ "requires": {
+ "sparkles": "1.0.0"
+ }
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "hawk": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+ "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+ "dev": true,
+ "requires": {
+ "boom": "2.10.1",
+ "cryptiles": "2.0.5",
+ "hoek": "2.16.3",
+ "sntp": "1.0.9"
+ }
+ },
+ "he": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+ "dev": true
+ },
+ "hoek": {
+ "version": "2.16.3",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
+ "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
+ "dev": true
+ },
+ "home-or-tmp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
+ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "homedir-polyfill": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
+ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
+ "dev": true,
+ "requires": {
+ "parse-passwd": "1.0.0"
+ }
+ },
+ "hosted-git-info": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz",
+ "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==",
+ "dev": true
+ },
+ "hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "obuf": "1.1.2",
+ "readable-stream": "2.3.5",
+ "wbuf": "1.7.3"
+ }
+ },
+ "html-minifier": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.11.tgz",
+ "integrity": "sha512-kIi9C090qWW5cGxEf+EwNUczduyVR6krk29WB3zDSWBQN6xuh/1jCXgmY4SvqzaJMOZFCnf8wcNzA8iPsfLiUQ==",
+ "dev": true,
+ "requires": {
+ "camel-case": "3.0.0",
+ "clean-css": "4.1.11",
+ "commander": "2.15.0",
+ "he": "1.1.1",
+ "ncname": "1.0.0",
+ "param-case": "2.1.1",
+ "relateurl": "0.2.7",
+ "uglify-js": "3.3.15"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.15.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.0.tgz",
+ "integrity": "sha512-7B1ilBwtYSbetCgTY1NJFg+gVpestg0fdA1MhC1Vs4ssyfSXnCAjFr+QcQM9/RedXC0EaUx1sG8Smgw2VfgKEg==",
+ "dev": true
+ }
+ }
+ },
+ "htmlparser2": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz",
+ "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1.3.0",
+ "domhandler": "2.4.1",
+ "domutils": "1.7.0",
+ "entities": "1.1.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5"
+ }
+ },
+ "http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
+ "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
+ "dev": true,
+ "requires": {
+ "depd": "1.1.1",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.0.3",
+ "statuses": "1.4.0"
+ },
+ "dependencies": {
+ "depd": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
+ "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
+ "dev": true
+ }
+ }
+ },
+ "http-proxy": {
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz",
+ "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=",
+ "dev": true,
+ "requires": {
+ "eventemitter3": "1.2.0",
+ "requires-port": "1.0.0"
+ }
+ },
+ "http-proxy-middleware": {
+ "version": "0.17.4",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz",
+ "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=",
+ "dev": true,
+ "requires": {
+ "http-proxy": "1.16.2",
+ "is-glob": "3.1.0",
+ "lodash": "4.17.5",
+ "micromatch": "2.3.11"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0"
+ }
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+ "dev": true
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "dev": true,
+ "requires": {
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.2"
+ }
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "dev": true,
+ "requires": {
+ "is-posix-bracket": "0.1.1"
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "dev": true,
+ "requires": {
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ }
+ }
+ }
+ }
+ },
+ "http-signature": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
+ "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "0.2.0",
+ "jsprim": "1.4.1",
+ "sshpk": "1.14.1"
+ }
+ },
+ "https-proxy-agent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz",
+ "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "agent-base": "2.1.1",
+ "debug": "2.6.9",
+ "extend": "3.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.19",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
+ "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
+ "dev": true
+ },
+ "ignore": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
+ "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==",
+ "dev": true
+ },
+ "import-lazy": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+ "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+ "dev": true
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "indexof": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "dev": true
+ },
+ "inquirer": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
+ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "3.1.0",
+ "chalk": "2.3.2",
+ "cli-cursor": "2.1.0",
+ "cli-width": "2.2.0",
+ "external-editor": "2.2.0",
+ "figures": "2.0.0",
+ "lodash": "4.17.5",
+ "mute-stream": "0.0.7",
+ "run-async": "2.3.0",
+ "rx-lite": "4.0.8",
+ "rx-lite-aggregates": "4.0.8",
+ "string-width": "2.1.1",
+ "strip-ansi": "4.0.0",
+ "through": "2.3.8"
+ }
+ },
+ "interpret": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
+ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "ipaddr.js": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz",
+ "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=",
+ "dev": true
+ },
+ "is-absolute": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
+ "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
+ "dev": true,
+ "requires": {
+ "is-relative": "1.0.0",
+ "is-windows": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+ "dev": true,
+ "requires": {
+ "builtin-modules": "1.1.1"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-dotfile": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+ "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+ "dev": true
+ },
+ "is-equal-shallow": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+ "dev": true,
+ "requires": {
+ "is-primitive": "2.0.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-installed-globally": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
+ "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
+ "dev": true,
+ "requires": {
+ "global-dirs": "0.1.1",
+ "is-path-inside": "1.0.1"
+ }
+ },
+ "is-my-ip-valid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz",
+ "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==",
+ "dev": true
+ },
+ "is-my-json-valid": {
+ "version": "2.17.2",
+ "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz",
+ "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==",
+ "dev": true,
+ "requires": {
+ "generate-function": "2.0.0",
+ "generate-object-property": "1.2.0",
+ "is-my-ip-valid": "1.0.0",
+ "jsonpointer": "4.0.1",
+ "xtend": "4.0.1"
+ }
+ },
+ "is-npm": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
+ "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
+ "dev": true
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+ "dev": true
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-path-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+ "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+ "dev": true
+ },
+ "is-path-in-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
+ "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
+ "dev": true,
+ "requires": {
+ "is-path-inside": "1.0.1"
+ }
+ },
+ "is-path-inside": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+ "dev": true,
+ "requires": {
+ "path-is-inside": "1.0.2"
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-posix-bracket": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+ "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+ "dev": true
+ },
+ "is-primitive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
+ "dev": true
+ },
+ "is-promise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
+ "dev": true
+ },
+ "is-property": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+ "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
+ "dev": true
+ },
+ "is-redirect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+ "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
+ "dev": true
+ },
+ "is-relative": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
+ "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
+ "dev": true,
+ "requires": {
+ "is-unc-path": "1.0.0"
+ }
+ },
+ "is-resolvable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
+ "dev": true
+ },
+ "is-retry-allowed": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
+ "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+ "dev": true
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "is-unc-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
+ "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
+ "dev": true,
+ "requires": {
+ "unc-path-regex": "0.1.2"
+ }
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+ "dev": true
+ },
+ "is-valid-glob": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz",
+ "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=",
+ "dev": true
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz",
+ "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==",
+ "dev": true,
+ "requires": {
+ "argparse": "1.0.10",
+ "esprima": "4.0.0"
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "dev": true,
+ "optional": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+ "dev": true
+ },
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+ "dev": true,
+ "requires": {
+ "jsonify": "0.0.0"
+ }
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+ "dev": true
+ },
+ "json3": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
+ "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
+ "dev": true
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+ "dev": true
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+ "dev": true
+ },
+ "jsonpointer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
+ "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
+ "dev": true
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "latest-version": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
+ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
+ "dev": true,
+ "requires": {
+ "package-json": "4.0.1"
+ }
+ },
+ "launchpad": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/launchpad/-/launchpad-0.7.0.tgz",
+ "integrity": "sha1-9CfTwOFehp7hVROCi6/vwW+ce8M=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "async": "2.6.0",
+ "browserstack": "1.5.0",
+ "debug": "2.6.9",
+ "plist": "2.1.0",
+ "q": "1.5.1",
+ "underscore": "1.8.3"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "lodash": "4.17.5"
+ }
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "underscore": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
+ "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "lazystream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
+ "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.5"
+ }
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "liftoff": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz",
+ "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "findup-sync": "2.0.0",
+ "fined": "1.1.0",
+ "flagged-respawn": "1.0.0",
+ "is-plain-object": "2.0.4",
+ "object.map": "1.0.1",
+ "rechoir": "0.6.2",
+ "resolve": "1.5.0"
+ }
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "strip-bom": "2.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ }
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "lodash._baseassign": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
+ "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
+ "dev": true,
+ "requires": {
+ "lodash._basecopy": "3.0.1",
+ "lodash.keys": "3.1.2"
+ }
+ },
+ "lodash._basecopy": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
+ "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
+ "dev": true
+ },
+ "lodash._basecreate": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz",
+ "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=",
+ "dev": true
+ },
+ "lodash._basetostring": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz",
+ "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=",
+ "dev": true
+ },
+ "lodash._basevalues": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz",
+ "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=",
+ "dev": true
+ },
+ "lodash._getnative": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
+ "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
+ "dev": true
+ },
+ "lodash._isiterateecall": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
+ "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
+ "dev": true
+ },
+ "lodash._reescape": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz",
+ "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=",
+ "dev": true
+ },
+ "lodash._reevaluate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz",
+ "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=",
+ "dev": true
+ },
+ "lodash._reinterpolate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
+ "dev": true
+ },
+ "lodash._root": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
+ "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=",
+ "dev": true
+ },
+ "lodash.create": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz",
+ "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=",
+ "dev": true,
+ "requires": {
+ "lodash._baseassign": "3.2.0",
+ "lodash._basecreate": "3.0.3",
+ "lodash._isiterateecall": "3.0.9"
+ }
+ },
+ "lodash.defaults": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+ "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
+ "dev": true
+ },
+ "lodash.escape": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz",
+ "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
+ "dev": true,
+ "requires": {
+ "lodash._root": "3.0.1"
+ }
+ },
+ "lodash.isarguments": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
+ "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
+ "dev": true
+ },
+ "lodash.isarray": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
+ "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
+ "dev": true
+ },
+ "lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=",
+ "dev": true
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
+ "dev": true
+ },
+ "lodash.keys": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
+ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
+ "dev": true,
+ "requires": {
+ "lodash._getnative": "3.9.1",
+ "lodash.isarguments": "3.1.0",
+ "lodash.isarray": "3.0.4"
+ }
+ },
+ "lodash.restparam": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
+ "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=",
+ "dev": true
+ },
+ "lodash.some": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz",
+ "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "lodash.template": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz",
+ "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
+ "dev": true,
+ "requires": {
+ "lodash._basecopy": "3.0.1",
+ "lodash._basetostring": "3.0.1",
+ "lodash._basevalues": "3.0.0",
+ "lodash._isiterateecall": "3.0.9",
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.escape": "3.2.0",
+ "lodash.keys": "3.1.2",
+ "lodash.restparam": "3.6.1",
+ "lodash.templatesettings": "3.1.1"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz",
+ "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.escape": "3.2.0"
+ }
+ },
+ "lolex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz",
+ "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "dev": true,
+ "requires": {
+ "currently-unhandled": "0.4.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "lower-case": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
+ "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
+ "dev": true
+ },
+ "lowercase-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
+ "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz",
+ "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "1.0.2",
+ "yallist": "2.1.2"
+ }
+ },
+ "lru-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
+ "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=",
+ "dev": true,
+ "requires": {
+ "es5-ext": "0.10.40"
+ }
+ },
+ "make-dir": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz",
+ "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==",
+ "dev": true,
+ "requires": {
+ "pify": "3.0.0"
+ }
+ },
+ "make-iterator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.0.tgz",
+ "integrity": "sha1-V7713IXSOSO6I3ZzJNjo+PPZaUs=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "matcher": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.0.tgz",
+ "integrity": "sha512-aZGv6JBTHqfqAd09jmAlbKnAICTfIvb5Z8gXVxPB5WZtFfHMaAMdACL7tQflD2V+6/8KNcY8s6DYtWLgpJP5lA==",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "md5": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
+ "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=",
+ "dev": true,
+ "requires": {
+ "charenc": "0.0.2",
+ "crypt": "0.0.2",
+ "is-buffer": "1.1.6"
+ }
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+ "dev": true
+ },
+ "memoizee": {
+ "version": "0.4.12",
+ "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.12.tgz",
+ "integrity": "sha512-sprBu6nwxBWBvBOh5v2jcsGqiGLlL2xr2dLub3vR8dnE8YB17omwtm/0NSHl8jjNbcsJd5GMWJAnTSVe/O0Wfg==",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.40",
+ "es6-weak-map": "2.0.2",
+ "event-emitter": "0.3.5",
+ "is-promise": "2.1.0",
+ "lru-queue": "0.1.0",
+ "next-tick": "1.0.0",
+ "timers-ext": "0.1.5"
+ }
+ },
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "2.1.0",
+ "decamelize": "1.2.0",
+ "loud-rejection": "1.6.0",
+ "map-obj": "1.0.1",
+ "minimist": "1.2.0",
+ "normalize-package-data": "2.4.0",
+ "object-assign": "4.1.1",
+ "read-pkg-up": "1.0.1",
+ "redent": "1.0.0",
+ "trim-newlines": "1.0.0"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ }
+ }
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+ "dev": true
+ },
+ "merge-stream": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
+ "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.5"
+ }
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz",
+ "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.1",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "mime": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+ "dev": true
+ },
+ "mime-db": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
+ "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.18",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
+ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.33.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "dev": true
+ },
+ "minimalistic-assert": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz",
+ "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "mocha": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz",
+ "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==",
+ "dev": true,
+ "requires": {
+ "browser-stdout": "1.3.0",
+ "commander": "2.9.0",
+ "debug": "2.6.8",
+ "diff": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "glob": "7.1.1",
+ "growl": "1.9.2",
+ "he": "1.1.1",
+ "json3": "3.3.2",
+ "lodash.create": "3.1.1",
+ "mkdirp": "0.5.1",
+ "supports-color": "3.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.8",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
+ "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
+ "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz",
+ "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "multer": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/multer/-/multer-1.3.0.tgz",
+ "integrity": "sha1-CSsmcPaEb6SRSWXvyM+Uwg/sbNI=",
+ "dev": true,
+ "requires": {
+ "append-field": "0.1.0",
+ "busboy": "0.2.14",
+ "concat-stream": "1.6.1",
+ "mkdirp": "0.5.1",
+ "object-assign": "3.0.0",
+ "on-finished": "2.3.0",
+ "type-is": "1.6.16",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "object-assign": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
+ "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
+ "dev": true
+ }
+ }
+ },
+ "multipipe": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz",
+ "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=",
+ "dev": true,
+ "requires": {
+ "duplexer2": "0.0.2"
+ }
+ },
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+ "dev": true
+ },
+ "mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "requires": {
+ "any-promise": "1.3.0",
+ "object-assign": "4.1.1",
+ "thenify-all": "1.6.0"
+ }
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "native-promise-only": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz",
+ "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=",
+ "dev": true
+ },
+ "natives": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.2.tgz",
+ "integrity": "sha512-5bRASydE1gu6zPOenLN043++J8xj1Ob7ArkfdYO3JN4DF5rDmG7bMoiybkTyD+GnXQEMixVeDHMzuqm6kpBmiA==",
+ "dev": true
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "ncname": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz",
+ "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=",
+ "dev": true,
+ "requires": {
+ "xml-char-classes": "1.0.0"
+ }
+ },
+ "negotiator": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+ "dev": true
+ },
+ "next-tick": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
+ "dev": true
+ },
+ "nice-try": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz",
+ "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==",
+ "dev": true,
+ "optional": true
+ },
+ "no-case": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+ "dev": true,
+ "requires": {
+ "lower-case": "1.1.4"
+ }
+ },
+ "nodegit-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/nodegit-promise/-/nodegit-promise-4.0.0.tgz",
+ "integrity": "sha1-VyKxhPLfcycWEGSnkdLoQskWezQ=",
+ "dev": true,
+ "requires": {
+ "asap": "2.0.6"
+ }
+ },
+ "nomnom": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz",
+ "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=",
+ "dev": true,
+ "requires": {
+ "chalk": "0.4.0",
+ "underscore": "1.6.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz",
+ "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz",
+ "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "1.0.0",
+ "has-color": "0.1.7",
+ "strip-ansi": "0.1.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz",
+ "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=",
+ "dev": true
+ }
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "2.6.0",
+ "is-builtin-module": "1.0.0",
+ "semver": "5.5.0",
+ "validate-npm-package-license": "3.0.3"
+ }
+ },
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "dev": true,
+ "requires": {
+ "remove-trailing-separator": "1.1.0"
+ }
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "dev": true,
+ "requires": {
+ "path-key": "2.0.1"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+ "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
+ },
+ "object-component": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
+ "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.defaults": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
+ "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+ "dev": true,
+ "requires": {
+ "array-each": "1.0.1",
+ "array-slice": "1.1.0",
+ "for-own": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "object.map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
+ "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
+ "dev": true,
+ "requires": {
+ "for-own": "1.0.0",
+ "make-iterator": "1.0.0"
+ }
+ },
+ "object.omit": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+ "dev": true,
+ "requires": {
+ "for-own": "0.1.5",
+ "is-extendable": "0.1.1"
+ },
+ "dependencies": {
+ "for-own": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ }
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+ "dev": true
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "on-headers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
+ "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "1.2.0"
+ }
+ },
+ "opn": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/opn/-/opn-3.0.3.tgz",
+ "integrity": "sha1-ttmec5n3jWXDuq/+8fsojpuFJDo=",
+ "dev": true,
+ "requires": {
+ "object-assign": "4.1.1"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "orchestrator": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz",
+ "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "0.1.5",
+ "sequencify": "0.0.7",
+ "stream-consume": "0.1.1"
+ }
+ },
+ "ordered-read-streams": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz",
+ "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=",
+ "dev": true
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "dev": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "dev": true
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+ "dev": true
+ },
+ "p-map": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
+ "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
+ "dev": true
+ },
+ "package-json": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
+ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
+ "dev": true,
+ "requires": {
+ "got": "6.7.1",
+ "registry-auth-token": "3.3.2",
+ "registry-url": "3.1.0",
+ "semver": "5.5.0"
+ }
+ },
+ "param-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
+ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+ "dev": true,
+ "requires": {
+ "no-case": "2.3.2"
+ }
+ },
+ "parse-filepath": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
+ "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
+ "dev": true,
+ "requires": {
+ "is-absolute": "1.0.0",
+ "map-cache": "0.2.2",
+ "path-root": "0.1.1"
+ }
+ },
+ "parse-glob": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+ "dev": true,
+ "requires": {
+ "glob-base": "0.3.0",
+ "is-dotfile": "1.0.3",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1"
+ },
+ "dependencies": {
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ }
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "requires": {
+ "error-ex": "1.3.1"
+ }
+ },
+ "parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+ "dev": true
+ },
+ "parse5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz",
+ "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=",
+ "dev": true
+ },
+ "parseqs": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
+ "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
+ "dev": true,
+ "requires": {
+ "better-assert": "1.0.2"
+ }
+ },
+ "parseuri": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
+ "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
+ "dev": true,
+ "requires": {
+ "better-assert": "1.0.2"
+ }
+ },
+ "parseurl": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
+ "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "path-root": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
+ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+ "dev": true,
+ "requires": {
+ "path-root-regex": "0.1.2"
+ }
+ },
+ "path-root-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
+ "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+ "dev": true
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "pathval": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
+ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
+ "dev": true
+ },
+ "pem": {
+ "version": "1.12.3",
+ "resolved": "https://registry.npmjs.org/pem/-/pem-1.12.3.tgz",
+ "integrity": "sha512-hT7GwvQL35+0iqgYUl8vn5I5pAVR0HcJas07TXL8bNaR4c5kAFRquk4ZqQk1F9YMcQOr6WjGdY5OnDC0RBnzig==",
+ "dev": true,
+ "requires": {
+ "md5": "2.2.1",
+ "os-tmpdir": "1.0.2",
+ "safe-buffer": "5.1.1",
+ "which": "1.3.0"
+ }
+ },
+ "pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+ "dev": true,
+ "optional": true
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
+ "requires": {
+ "pinkie": "2.0.4"
+ }
+ },
+ "plist": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz",
+ "integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "base64-js": "1.2.0",
+ "xmlbuilder": "8.2.2",
+ "xmldom": "0.1.27"
+ }
+ },
+ "plugin-error": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
+ "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
+ "dev": true,
+ "requires": {
+ "ansi-cyan": "0.1.1",
+ "ansi-red": "0.1.1",
+ "arr-diff": "1.1.0",
+ "arr-union": "2.1.0",
+ "extend-shallow": "1.1.4"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
+ "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-slice": "0.2.3"
+ }
+ },
+ "arr-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
+ "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+ "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
+ "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
+ "dev": true,
+ "requires": {
+ "kind-of": "1.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
+ "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
+ "dev": true
+ }
+ }
+ },
+ "pluralize": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
+ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.8",
+ "winston": "2.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-2.7.0.tgz",
+ "integrity": "sha512-yD5FYQ8thX/2vHTaEgTtCs/NSG3ko4VlEb0IjM/PFsu03lHNHnpadC1NGwKyvI9vOjcFhnw4mDEVW0lbxLo8Eg==",
+ "dev": true,
+ "requires": {
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/escodegen": "0.0.2",
+ "@types/estraverse": "0.0.6",
+ "@types/estree": "0.0.37",
+ "@types/node": "6.0.102",
+ "@types/parse5": "2.2.34",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "2.3.0",
+ "escodegen": "1.9.1",
+ "espree": "3.5.4",
+ "estraverse": "4.2.0",
+ "jsonschema": "1.2.2",
+ "parse5": "2.2.3",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.102",
+ "resolved": "http://registry.npmjs.org/@types/node/-/node-6.0.102.tgz",
+ "integrity": "sha512-EhNufyBoC1Kqaj+XMHGzi6mPUC8wVABOMTPE5XaSJc49LIVvXsyrV1HYMAPTUViT7E4wLUB38OdDmb+HshjGmA==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "polymer-build": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/polymer-build/-/polymer-build-2.3.3.tgz",
+ "integrity": "sha512-n2uL0TT9KrvxSd7wcBFbv8FAE0vwoRrde79fHtuu+QF53XPnPYXHxrQ9NZMgKQwxyVWp4wOwHSiirQzKo0RqKg==",
+ "dev": true,
+ "requires": {
+ "@types/babel-core": "6.25.3",
+ "@types/babel-traverse": "6.25.3",
+ "@types/gulp-if": "0.0.33",
+ "@types/html-minifier": "3.5.1",
+ "@types/is-windows": "0.2.0",
+ "@types/mz": "0.0.31",
+ "@types/node": "6.0.102",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.7",
+ "@types/uuid": "3.4.3",
+ "@types/vinyl": "2.0.2",
+ "@types/vinyl-fs": "0.0.28",
+ "babel-plugin-external-helpers": "6.22.0",
+ "babel-plugin-syntax-dynamic-import": "6.18.0",
+ "babel-plugin-syntax-export-extensions": "6.13.0",
+ "babel-plugin-syntax-object-rest-spread": "6.13.0",
+ "babel-plugin-transform-object-rest-spread": "6.26.0",
+ "babel-preset-es2015": "6.24.1",
+ "babel-preset-minify": "0.3.0",
+ "babel-traverse": "6.26.0",
+ "css-slam": "2.1.0",
+ "dom5": "2.3.0",
+ "gulp-if": "2.0.2",
+ "html-minifier": "3.5.11",
+ "is-windows": "1.0.2",
+ "matcher": "1.1.0",
+ "multipipe": "1.0.2",
+ "mz": "2.7.0",
+ "parse5": "2.2.3",
+ "plylog": "0.5.0",
+ "polymer-analyzer": "2.7.0",
+ "polymer-bundler": "3.1.1",
+ "polymer-project-config": "3.10.0",
+ "resolve": "1.5.0",
+ "stream": "0.0.2",
+ "sw-precache": "5.2.1",
+ "uuid": "3.2.1",
+ "vinyl": "1.2.0",
+ "vinyl-fs": "2.4.4",
+ "whatwg-url": "6.4.0"
+ },
+ "dependencies": {
+ "@types/mz": {
+ "version": "0.0.31",
+ "resolved": "https://registry.npmjs.org/@types/mz/-/mz-0.0.31.tgz",
+ "integrity": "sha1-pNgMCC/v5x5Ap8DwfR5lVbu8e1I=",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.102"
+ }
+ },
+ "@types/node": {
+ "version": "6.0.102",
+ "resolved": "http://registry.npmjs.org/@types/node/-/node-6.0.102.tgz",
+ "integrity": "sha512-EhNufyBoC1Kqaj+XMHGzi6mPUC8wVABOMTPE5XaSJc49LIVvXsyrV1HYMAPTUViT7E4wLUB38OdDmb+HshjGmA==",
+ "dev": true
+ },
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0"
+ }
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+ "dev": true
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "dev": true,
+ "requires": {
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.2"
+ }
+ },
+ "clone": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
+ "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
+ "duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.5"
+ }
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "dev": true,
+ "requires": {
+ "is-posix-bracket": "0.1.1"
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ }
+ },
+ "glob-stream": {
+ "version": "5.3.5",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz",
+ "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "glob": "5.0.15",
+ "glob-parent": "3.1.0",
+ "micromatch": "2.3.11",
+ "ordered-read-streams": "0.3.0",
+ "through2": "0.6.5",
+ "to-absolute-glob": "0.1.1",
+ "unique-stream": "2.2.1"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "gulp-sourcemaps": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz",
+ "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=",
+ "dev": true,
+ "requires": {
+ "convert-source-map": "1.5.1",
+ "graceful-fs": "4.1.11",
+ "strip-bom": "2.0.0",
+ "through2": "2.0.3",
+ "vinyl": "1.2.0"
+ }
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "dev": true,
+ "requires": {
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ }
+ }
+ },
+ "multipipe": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-1.0.2.tgz",
+ "integrity": "sha1-zBPv2DPJzamfIk+GhGG44aP9k50=",
+ "dev": true,
+ "requires": {
+ "duplexer2": "0.1.4",
+ "object-assign": "4.1.1"
+ }
+ },
+ "ordered-read-streams": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz",
+ "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=",
+ "dev": true,
+ "requires": {
+ "is-stream": "1.1.0",
+ "readable-stream": "2.3.5"
+ }
+ },
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "dev": true
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ },
+ "unique-stream": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
+ "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
+ "dev": true,
+ "requires": {
+ "json-stable-stringify": "1.0.1",
+ "through2-filter": "2.0.0"
+ }
+ },
+ "vinyl": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
+ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.3",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ },
+ "vinyl-fs": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz",
+ "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=",
+ "dev": true,
+ "requires": {
+ "duplexify": "3.5.4",
+ "glob-stream": "5.3.5",
+ "graceful-fs": "4.1.11",
+ "gulp-sourcemaps": "1.6.0",
+ "is-valid-glob": "0.3.0",
+ "lazystream": "1.0.0",
+ "lodash.isequal": "4.5.0",
+ "merge-stream": "1.0.1",
+ "mkdirp": "0.5.1",
+ "object-assign": "4.1.1",
+ "readable-stream": "2.3.5",
+ "strip-bom": "2.0.0",
+ "strip-bom-stream": "1.0.0",
+ "through2": "2.0.3",
+ "through2-filter": "2.0.0",
+ "vali-date": "1.0.0",
+ "vinyl": "1.2.0"
+ }
+ }
+ }
+ },
+ "polymer-bundler": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/polymer-bundler/-/polymer-bundler-3.1.1.tgz",
+ "integrity": "sha512-a/MItYr/rTRZ8Ymj5npmoAAm89RC5hRh4yz8bs22GyMn+NlE7HqJ4EzLrPkyRWlOyBhbhYFPx2Zot8PlaWXvmQ==",
+ "dev": true,
+ "requires": {
+ "clone": "2.1.1",
+ "command-line-args": "3.0.5",
+ "command-line-usage": "3.0.8",
+ "dom5": "2.3.0",
+ "espree": "3.5.4",
+ "mkdirp": "0.5.1",
+ "parse5": "2.2.3",
+ "polymer-analyzer": "2.7.0",
+ "source-map": "0.5.7"
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.10.0.tgz",
+ "integrity": "sha512-+vrx5aAZM3rpViqnYhTX1bIpXXTlGpiAGZEsk7WzN6EqSMQPI5eYRw4XD1kmjo1W6GShIhPfvhh+Ik/pywGGkw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.102",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.102",
+ "resolved": "http://registry.npmjs.org/@types/node/-/node-6.0.102.tgz",
+ "integrity": "sha512-EhNufyBoC1Kqaj+XMHGzi6mPUC8wVABOMTPE5XaSJc49LIVvXsyrV1HYMAPTUViT7E4wLUB38OdDmb+HshjGmA==",
+ "dev": true
+ }
+ }
+ },
+ "polyserve": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/polyserve/-/polyserve-0.23.0.tgz",
+ "integrity": "sha512-ijzCbFttKG1F0hMTWWIzMoo+sxsfpXctoHFigw2ViBcvUt/aUBfJCUTHPKHhi/3zAgtw5Ej3SgoIOY9LflpXAw==",
+ "dev": true,
+ "requires": {
+ "@types/assert": "0.0.29",
+ "@types/babel-core": "6.25.3",
+ "@types/babylon": "6.16.2",
+ "@types/compression": "0.0.33",
+ "@types/content-type": "1.1.2",
+ "@types/express": "4.11.1",
+ "@types/mime": "0.0.29",
+ "@types/mz": "0.0.29",
+ "@types/node": "8.9.5",
+ "@types/opn": "3.0.28",
+ "@types/parse5": "2.2.34",
+ "@types/pem": "1.9.3",
+ "@types/serve-static": "1.13.1",
+ "@types/spdy": "3.4.4",
+ "@types/ua-parser-js": "0.7.32",
+ "babel-core": "6.26.0",
+ "babel-plugin-transform-es2015-arrow-functions": "6.22.0",
+ "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0",
+ "babel-plugin-transform-es2015-block-scoping": "6.26.0",
+ "babel-plugin-transform-es2015-classes": "6.24.1",
+ "babel-plugin-transform-es2015-computed-properties": "6.24.1",
+ "babel-plugin-transform-es2015-destructuring": "6.23.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
+ "babel-plugin-transform-es2015-for-of": "6.23.0",
+ "babel-plugin-transform-es2015-function-name": "6.24.1",
+ "babel-plugin-transform-es2015-literals": "6.22.0",
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-plugin-transform-es2015-object-super": "6.24.1",
+ "babel-plugin-transform-es2015-parameters": "6.24.1",
+ "babel-plugin-transform-es2015-shorthand-properties": "6.24.1",
+ "babel-plugin-transform-es2015-spread": "6.22.0",
+ "babel-plugin-transform-es2015-sticky-regex": "6.24.1",
+ "babel-plugin-transform-es2015-template-literals": "6.22.0",
+ "babel-plugin-transform-es2015-typeof-symbol": "6.23.0",
+ "babel-plugin-transform-es2015-unicode-regex": "6.24.1",
+ "babel-plugin-transform-regenerator": "6.26.0",
+ "babylon": "6.18.0",
+ "browser-capabilities": "0.2.2",
+ "command-line-args": "3.0.5",
+ "command-line-usage": "3.0.8",
+ "compression": "1.7.2",
+ "content-type": "1.0.4",
+ "dom5": "2.3.0",
+ "express": "4.16.3",
+ "find-port": "1.0.1",
+ "http-proxy-middleware": "0.17.4",
+ "lru-cache": "4.1.2",
+ "mime": "1.4.1",
+ "mz": "2.7.0",
+ "opn": "3.0.3",
+ "parse5": "2.2.3",
+ "pem": "1.12.3",
+ "polymer-build": "2.3.3",
+ "requirejs": "2.3.5",
+ "resolve": "1.5.0",
+ "send": "0.14.2",
+ "spdy": "3.4.7"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
+ "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
+ "dev": true,
+ "requires": {
+ "ms": "0.7.1"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
+ "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
+ "dev": true
+ }
+ }
+ },
+ "etag": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz",
+ "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=",
+ "dev": true
+ },
+ "fresh": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz",
+ "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz",
+ "integrity": "sha1-eIwNLB3iyBuebowBhDtrl+uSB1A=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "setprototypeof": "1.0.2",
+ "statuses": "1.3.1"
+ }
+ },
+ "ms": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
+ "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
+ "dev": true
+ },
+ "send": {
+ "version": "0.14.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.14.2.tgz",
+ "integrity": "sha1-ObBDiz9RC+Xcb2Z6EfcWiTaM3u8=",
+ "dev": true,
+ "requires": {
+ "debug": "2.2.0",
+ "depd": "1.1.2",
+ "destroy": "1.0.4",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.7.0",
+ "fresh": "0.3.0",
+ "http-errors": "1.5.1",
+ "mime": "1.3.4",
+ "ms": "0.7.2",
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.0",
+ "statuses": "1.3.1"
+ },
+ "dependencies": {
+ "mime": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz",
+ "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=",
+ "dev": true
+ }
+ }
+ },
+ "setprototypeof": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz",
+ "integrity": "sha1-gaVSFB7BBLiOic44MQOtXGZWTQg=",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+ "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+ "dev": true
+ },
+ "preserve": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
+ "dev": true
+ },
+ "pretty-bytes": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz",
+ "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
+ "dev": true
+ },
+ "private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
+ "dev": true
+ },
+ "progress": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
+ "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
+ "dev": true
+ },
+ "promisify-node": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/promisify-node/-/promisify-node-0.4.0.tgz",
+ "integrity": "sha1-MoA4dOxBF4TkeGwzmQKoeheaRpw=",
+ "dev": true,
+ "requires": {
+ "nodegit-promise": "4.0.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "proxy-addr": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz",
+ "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==",
+ "dev": true,
+ "requires": {
+ "forwarded": "0.1.2",
+ "ipaddr.js": "1.6.0"
+ }
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+ "dev": true,
+ "optional": true
+ },
+ "qs": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+ "dev": true
+ },
+ "randomatic": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
+ "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "range-parser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+ "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+ "dev": true
+ },
+ "raw-body": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
+ "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
+ "dev": true,
+ "requires": {
+ "bytes": "3.0.0",
+ "http-errors": "1.6.2",
+ "iconv-lite": "0.4.19",
+ "unpipe": "1.0.0"
+ }
+ },
+ "rc": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz",
+ "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=",
+ "dev": true,
+ "requires": {
+ "deep-extend": "0.4.2",
+ "ini": "1.3.5",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ }
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "1.1.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "1.1.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
+ "requires": {
+ "find-up": "1.1.2",
+ "read-pkg": "1.1.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz",
+ "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+ "dev": true,
+ "requires": {
+ "resolve": "1.5.0"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "2.1.0",
+ "strip-indent": "1.0.1"
+ },
+ "dependencies": {
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "4.0.1"
+ }
+ }
+ }
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerate": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
+ "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regenerator-transform": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "private": "0.1.8"
+ }
+ },
+ "regex-cache": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+ "dev": true,
+ "requires": {
+ "is-equal-shallow": "0.1.3"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "regexpp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
+ "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==",
+ "dev": true
+ },
+ "regexpu-core": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+ "dev": true,
+ "requires": {
+ "regenerate": "1.3.3",
+ "regjsgen": "0.2.0",
+ "regjsparser": "0.1.5"
+ }
+ },
+ "registry-auth-token": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
+ "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
+ "dev": true,
+ "requires": {
+ "rc": "1.2.6",
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "registry-url": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+ "dev": true,
+ "requires": {
+ "rc": "1.2.6"
+ }
+ },
+ "regjsgen": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+ "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+ "dev": true
+ },
+ "regjsparser": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+ "dev": true,
+ "requires": {
+ "jsesc": "0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true
+ }
+ }
+ },
+ "relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
+ "dev": true
+ },
+ "remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+ "dev": true
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "replace-ext": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+ "dev": true
+ },
+ "request": {
+ "version": "2.79.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz",
+ "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "0.6.0",
+ "aws4": "1.6.0",
+ "caseless": "0.11.0",
+ "combined-stream": "1.0.6",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.1.4",
+ "har-validator": "2.0.6",
+ "hawk": "3.1.3",
+ "http-signature": "1.1.1",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.18",
+ "oauth-sign": "0.8.2",
+ "qs": "6.3.2",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.4",
+ "tunnel-agent": "0.4.3",
+ "uuid": "3.2.1"
+ },
+ "dependencies": {
+ "qs": {
+ "version": "6.3.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
+ "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=",
+ "dev": true
+ }
+ }
+ },
+ "require-uncached": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+ "dev": true,
+ "requires": {
+ "caller-path": "0.1.0",
+ "resolve-from": "1.0.1"
+ }
+ },
+ "requirejs": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.5.tgz",
+ "integrity": "sha512-svnO+aNcR/an9Dpi44C7KSAy5fFGLtmPbaaCeQaklUz8BQhS64tWWIIlvEA5jrWICzlO/X9KSzSeXFnZdBu8nw==",
+ "dev": true
+ },
+ "requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
+ "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "global-modules": "1.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
+ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
+ "dev": true
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "dev": true,
+ "requires": {
+ "onetime": "2.0.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "rollup": {
+ "version": "0.45.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.45.2.tgz",
+ "integrity": "sha512-2+bq5GQSrocdhr+M92mOQRmF1evtLRzv9NdmEC2wo7BILvTG8irHCtD0q+zg8ikNu63iJicdN5IzyxAXRTFKOQ==",
+ "dev": true,
+ "requires": {
+ "source-map-support": "0.4.18"
+ }
+ },
+ "rollup-stream": {
+ "version": "1.23.1",
+ "resolved": "https://registry.npmjs.org/rollup-stream/-/rollup-stream-1.23.1.tgz",
+ "integrity": "sha512-niUbTM3sqckz1FNebsSiN+koCR7RdgrRZ2HCcR4V2DT9PSs53tB4z1xzdTGxrX6bo3QT00R2sQA5n1jr/to69Q==",
+ "dev": true,
+ "requires": {
+ "rollup": "0.45.2"
+ }
+ },
+ "run-async": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+ "dev": true,
+ "requires": {
+ "is-promise": "2.1.0"
+ }
+ },
+ "run-sequence": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-2.2.1.tgz",
+ "integrity": "sha512-qkzZnQWMZjcKbh3CNly2srtrkaO/2H/SI5f2eliMCapdRD3UhMrwjfOAZJAnZ2H8Ju4aBzFZkBGXUqFs9V0yxw==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "fancy-log": "1.3.2",
+ "plugin-error": "0.1.2"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "rx-lite": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
+ "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
+ "dev": true
+ },
+ "rx-lite-aggregates": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
+ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
+ "dev": true,
+ "requires": {
+ "rx-lite": "4.0.8"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "samsam": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz",
+ "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=",
+ "dev": true
+ },
+ "sauce-connect-launcher": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.2.3.tgz",
+ "integrity": "sha1-0vkxrXro/avxlopEDnsgQXrKf4Y=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "adm-zip": "0.4.7",
+ "async": "2.6.0",
+ "https-proxy-agent": "1.0.0",
+ "lodash": "4.17.5",
+ "rimraf": "2.6.2"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "lodash": "4.17.5"
+ }
+ }
+ }
+ },
+ "select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+ "dev": true
+ },
+ "selenium-standalone": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-6.13.0.tgz",
+ "integrity": "sha512-JV1+AySJ9RccsAIZlnDb8QUx/SDeVGK8j/zCJcNlbz/LCRiketU3Su0YE5Uc1raaBGpT/venof0+9Ry0oGuvYw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "async": "2.6.0",
+ "commander": "2.9.0",
+ "cross-spawn": "6.0.5",
+ "debug": "3.1.0",
+ "lodash": "4.17.5",
+ "minimist": "1.2.0",
+ "mkdirp": "0.5.1",
+ "progress": "2.0.0",
+ "request": "2.79.0",
+ "tar-stream": "1.5.2",
+ "urijs": "1.19.1",
+ "which": "1.3.0",
+ "yauzl": "2.9.1"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "lodash": "4.17.5"
+ }
+ },
+ "cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nice-try": "1.0.4",
+ "path-key": "2.0.1",
+ "semver": "5.5.0",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ },
+ "semver-diff": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
+ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
+ "dev": true,
+ "requires": {
+ "semver": "5.5.0"
+ }
+ },
+ "send": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.11.1.tgz",
+ "integrity": "sha1-G+q/1C+eJwn5kCivMHisErRwktU=",
+ "dev": true,
+ "requires": {
+ "debug": "2.1.3",
+ "depd": "1.0.1",
+ "destroy": "1.0.3",
+ "escape-html": "1.0.1",
+ "etag": "1.5.1",
+ "fresh": "0.2.4",
+ "mime": "1.2.11",
+ "ms": "0.7.0",
+ "on-finished": "2.2.1",
+ "range-parser": "1.0.3"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz",
+ "integrity": "sha1-zoqxte6PvuK/o7Yzyrk9NmtjQY4=",
+ "dev": true,
+ "requires": {
+ "ms": "0.7.0"
+ }
+ },
+ "depd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz",
+ "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=",
+ "dev": true
+ },
+ "destroy": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz",
+ "integrity": "sha1-tDO0ck5x/YVR2YhRdIUcX8N34sk=",
+ "dev": true
+ },
+ "ee-first": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz",
+ "integrity": "sha1-ag18YiHkkP7v2S7D9EHJzozQl/Q=",
+ "dev": true
+ },
+ "escape-html": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz",
+ "integrity": "sha1-GBoobq05ejmpKFfPsdQwUuNWv/A=",
+ "dev": true
+ },
+ "etag": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.5.1.tgz",
+ "integrity": "sha1-VMUN4E7kJpVWKSWsVmWIKRvn6eo=",
+ "dev": true,
+ "requires": {
+ "crc": "3.2.1"
+ }
+ },
+ "fresh": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.4.tgz",
+ "integrity": "sha1-NYJJkgbJcjcUGQ7ddLRgT+tKYUw=",
+ "dev": true
+ },
+ "mime": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz",
+ "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=",
+ "dev": true
+ },
+ "ms": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz",
+ "integrity": "sha1-hlvpTC5zl62KV9pqYzpuLzB5i4M=",
+ "dev": true
+ },
+ "on-finished": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.2.1.tgz",
+ "integrity": "sha1-XIXBzDYpn3gCllP2Z/J7a5nrwCk=",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.0"
+ }
+ },
+ "range-parser": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz",
+ "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=",
+ "dev": true
+ }
+ }
+ },
+ "sequencify": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz",
+ "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=",
+ "dev": true
+ },
+ "serve-static": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
+ "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
+ "dev": true,
+ "requires": {
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "parseurl": "1.3.2",
+ "send": "0.16.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "send": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
+ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "destroy": "1.0.4",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "1.6.2",
+ "mime": "1.4.1",
+ "ms": "2.0.0",
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.0",
+ "statuses": "1.4.0"
+ }
+ }
+ }
+ },
+ "server-destroy": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
+ "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=",
+ "dev": true
+ },
+ "serviceworker-cache-polyfill": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz",
+ "integrity": "sha1-3hnuc77yGrPAdAo3sz22JGS6ves=",
+ "dev": true
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "setprototypeof": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
+ "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
+ "dev": true
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true
+ },
+ "sigmund": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
+ "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "dev": true
+ },
+ "sinon": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz",
+ "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=",
+ "dev": true,
+ "requires": {
+ "formatio": "1.1.1",
+ "lolex": "1.3.2",
+ "samsam": "1.1.2",
+ "util": "0.10.3"
+ }
+ },
+ "sinon-chai": {
+ "version": "2.14.0",
+ "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz",
+ "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==",
+ "dev": true
+ },
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
+ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0"
+ }
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "sntp": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+ "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
+ "dev": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "socket.io": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz",
+ "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "engine.io": "3.1.5",
+ "socket.io-adapter": "1.1.1",
+ "socket.io-client": "2.0.4",
+ "socket.io-parser": "3.1.3"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "socket.io-adapter": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz",
+ "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=",
+ "dev": true
+ },
+ "socket.io-client": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz",
+ "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=",
+ "dev": true,
+ "requires": {
+ "backo2": "1.0.2",
+ "base64-arraybuffer": "0.1.5",
+ "component-bind": "1.0.0",
+ "component-emitter": "1.2.1",
+ "debug": "2.6.9",
+ "engine.io-client": "3.1.6",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "object-component": "0.0.3",
+ "parseqs": "0.0.5",
+ "parseuri": "0.0.5",
+ "socket.io-parser": "3.1.3",
+ "to-array": "0.1.4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "socket.io-parser": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.3.tgz",
+ "integrity": "sha512-g0a2HPqLguqAczs3dMECuA1RgoGFPyvDqcbaDEdCWY9g59kdUAz3YRmaJBNKXflrHNwB7Q12Gkf/0CZXfdHR7g==",
+ "dev": true,
+ "requires": {
+ "component-emitter": "1.2.1",
+ "debug": "3.1.0",
+ "has-binary2": "1.0.2",
+ "isarray": "2.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+ "dev": true
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.0.3",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-support": {
+ "version": "0.4.18",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
+ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "sparkles": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz",
+ "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=",
+ "dev": true
+ },
+ "spdx-correct": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
+ "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
+ "dev": true,
+ "requires": {
+ "spdx-expression-parse": "3.0.0",
+ "spdx-license-ids": "3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
+ "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==",
+ "dev": true
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "dev": true,
+ "requires": {
+ "spdx-exceptions": "2.1.0",
+ "spdx-license-ids": "3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
+ "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==",
+ "dev": true
+ },
+ "spdy": {
+ "version": "3.4.7",
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz",
+ "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "handle-thing": "1.2.5",
+ "http-deceiver": "1.2.7",
+ "safe-buffer": "5.1.1",
+ "select-hose": "2.0.0",
+ "spdy-transport": "2.0.20"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "spdy-transport": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz",
+ "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "detect-node": "2.0.3",
+ "hpack.js": "2.1.6",
+ "obuf": "1.1.2",
+ "readable-stream": "2.3.5",
+ "safe-buffer": "5.1.1",
+ "wbuf": "1.7.3"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "sshpk": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz",
+ "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=",
+ "dev": true,
+ "requires": {
+ "asn1": "0.2.3",
+ "assert-plus": "1.0.0",
+ "bcrypt-pbkdf": "1.0.1",
+ "dashdash": "1.14.1",
+ "ecc-jsbn": "0.1.1",
+ "getpass": "0.1.7",
+ "jsbn": "0.1.1",
+ "tweetnacl": "0.14.5"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "stacky": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/stacky/-/stacky-1.3.1.tgz",
+ "integrity": "sha1-PxF+UYe5pz0j+HbWnwXIWxGAShI=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "lodash": "3.10.1"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "statuses": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+ "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+ "dev": true
+ },
+ "stream": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stream/-/stream-0.0.2.tgz",
+ "integrity": "sha1-f1Nj8Ff2WSxVlfALyAon9c7B8O8=",
+ "dev": true,
+ "requires": {
+ "emitter-component": "1.1.1"
+ }
+ },
+ "stream-consume": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz",
+ "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==",
+ "dev": true
+ },
+ "stream-counter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-1.0.0.tgz",
+ "integrity": "sha1-kc8lac5NxQYf6816yyY5SloRR1E=",
+ "dev": true
+ },
+ "stream-shift": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
+ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
+ "dev": true
+ },
+ "streamsearch": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
+ "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "stringstream": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
+ "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ }
+ }
+ },
+ "strip-bom": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz",
+ "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=",
+ "dev": true,
+ "requires": {
+ "first-chunk-stream": "1.0.0",
+ "is-utf8": "0.2.1"
+ }
+ },
+ "strip-bom-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz",
+ "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=",
+ "dev": true,
+ "requires": {
+ "first-chunk-stream": "1.0.0",
+ "strip-bom": "2.0.0"
+ },
+ "dependencies": {
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ }
+ }
+ },
+ "strip-bom-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
+ "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=",
+ "dev": true
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "dev": true
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "sw-precache": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.1.tgz",
+ "integrity": "sha512-8FAy+BP/FXE+ILfiVTt+GQJ6UEf4CVHD9OfhzH0JX+3zoy2uFk7Vn9EfXASOtVmmIVbL3jE/W8Z66VgPSZcMhw==",
+ "dev": true,
+ "requires": {
+ "dom-urls": "1.1.0",
+ "es6-promise": "4.2.4",
+ "glob": "7.1.2",
+ "lodash.defaults": "4.2.0",
+ "lodash.template": "4.4.0",
+ "meow": "3.7.0",
+ "mkdirp": "0.5.1",
+ "pretty-bytes": "4.0.2",
+ "sw-toolbox": "3.6.0",
+ "update-notifier": "2.3.0"
+ },
+ "dependencies": {
+ "lodash.template": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz",
+ "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.templatesettings": "4.1.0"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz",
+ "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0"
+ }
+ },
+ "pretty-bytes": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz",
+ "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=",
+ "dev": true
+ }
+ }
+ },
+ "sw-toolbox": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz",
+ "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=",
+ "dev": true,
+ "requires": {
+ "path-to-regexp": "1.7.0",
+ "serviceworker-cache-polyfill": "4.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
+ "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
+ "dev": true,
+ "requires": {
+ "isarray": "0.0.1"
+ }
+ }
+ }
+ },
+ "table": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
+ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "ajv-keywords": "2.1.1",
+ "chalk": "2.3.2",
+ "lodash": "4.17.5",
+ "slice-ansi": "1.0.0",
+ "string-width": "2.1.1"
+ }
+ },
+ "table-layout": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.3.0.tgz",
+ "integrity": "sha1-buINxIPbNxs+XIf3BO0vfHmdLJo=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "core-js": "2.5.3",
+ "deep-extend": "0.4.2",
+ "feature-detect-es6": "1.4.0",
+ "typical": "2.6.1",
+ "wordwrapjs": "2.0.0"
+ }
+ },
+ "tar-stream": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.2.tgz",
+ "integrity": "sha1-+8bG6DwaGdTLSMfZYXH8JI7/x78=",
+ "dev": true,
+ "requires": {
+ "bl": "1.2.1",
+ "end-of-stream": "1.4.1",
+ "readable-stream": "2.3.5",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0"
+ }
+ }
+ }
+ },
+ "temp": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz",
+ "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "os-tmpdir": "1.0.2",
+ "rimraf": "2.2.8"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "2.2.8",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
+ "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "term-size": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
+ "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
+ "dev": true,
+ "requires": {
+ "execa": "0.7.0"
+ }
+ },
+ "ternary-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.0.1.tgz",
+ "integrity": "sha1-Bk5Im0tb9gumpre8fy9cJ07Pgmk=",
+ "dev": true,
+ "requires": {
+ "duplexify": "3.5.4",
+ "fork-stream": "0.0.4",
+ "merge-stream": "1.0.1",
+ "through2": "2.0.3"
+ }
+ },
+ "test-value": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
+ "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "typical": "2.6.1"
+ }
+ },
+ "text-encoding": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz",
+ "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=",
+ "dev": true
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "thenify": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz",
+ "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=",
+ "dev": true,
+ "requires": {
+ "any-promise": "1.3.0"
+ }
+ },
+ "thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
+ "dev": true,
+ "requires": {
+ "thenify": "3.3.0"
+ }
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.5",
+ "xtend": "4.0.1"
+ }
+ },
+ "through2-filter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz",
+ "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=",
+ "dev": true,
+ "requires": {
+ "through2": "2.0.3",
+ "xtend": "4.0.1"
+ }
+ },
+ "tildify": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz",
+ "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "time-stamp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
+ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
+ "dev": true
+ },
+ "timed-out": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
+ "dev": true
+ },
+ "timers-ext": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.5.tgz",
+ "integrity": "sha512-tsEStd7kmACHENhsUPaxb8Jf8/+GZZxyNFQbZD07HQOyooOa6At1rQqjffgvg7n+dxscQa9cjjMdWhJtsP2sxg==",
+ "dev": true,
+ "requires": {
+ "es5-ext": "0.10.40",
+ "next-tick": "1.0.0"
+ }
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "to-absolute-glob": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz",
+ "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "to-array": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
+ "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "tough-cookie": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
+ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
+ "dev": true,
+ "requires": {
+ "punycode": "1.4.1"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true
+ }
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "tunnel-agent": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
+ "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
+ "dev": true
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "dev": true,
+ "optional": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "type-detect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz",
+ "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=",
+ "dev": true
+ },
+ "type-is": {
+ "version": "1.6.16",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
+ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
+ "dev": true,
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "2.1.18"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "ua-parser-js": {
+ "version": "0.7.17",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz",
+ "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==",
+ "dev": true
+ },
+ "uglify-js": {
+ "version": "3.3.15",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.15.tgz",
+ "integrity": "sha512-bqtBCAINYXX/OkdnqMGpbXr+OPWc00hsozRpk+dAtfnbdk2jjKiLmyOkQ7zamg648lVMnzATL8JrSN6LmaVpYA==",
+ "dev": true,
+ "requires": {
+ "commander": "2.15.0",
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.15.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.0.tgz",
+ "integrity": "sha512-7B1ilBwtYSbetCgTY1NJFg+gVpestg0fdA1MhC1Vs4ssyfSXnCAjFr+QcQM9/RedXC0EaUx1sG8Smgw2VfgKEg==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "ultron": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
+ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
+ "dev": true
+ },
+ "unc-path-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
+ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
+ "dev": true
+ },
+ "underscore": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
+ "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=",
+ "dev": true
+ },
+ "underscore.string": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz",
+ "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "unique-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz",
+ "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=",
+ "dev": true
+ },
+ "unique-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
+ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
+ "dev": true,
+ "requires": {
+ "crypto-random-string": "1.0.0"
+ }
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "unzip-response": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+ "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
+ "dev": true
+ },
+ "update-notifier": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz",
+ "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=",
+ "dev": true,
+ "requires": {
+ "boxen": "1.3.0",
+ "chalk": "2.3.2",
+ "configstore": "3.1.1",
+ "import-lazy": "2.1.0",
+ "is-installed-globally": "0.1.0",
+ "is-npm": "1.0.0",
+ "latest-version": "3.1.0",
+ "semver-diff": "2.1.0",
+ "xdg-basedir": "3.0.0"
+ }
+ },
+ "upper-case": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
+ "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
+ "dev": true
+ },
+ "urijs": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz",
+ "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==",
+ "dev": true
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "url-parse-lax": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+ "dev": true,
+ "requires": {
+ "prepend-http": "1.0.4"
+ }
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "user-home": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
+ "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
+ "dev": true
+ },
+ "util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.1"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+ "dev": true
+ }
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+ "dev": true
+ },
+ "uuid": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
+ "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==",
+ "dev": true
+ },
+ "uws": {
+ "version": "9.14.0",
+ "resolved": "https://registry.npmjs.org/uws/-/uws-9.14.0.tgz",
+ "integrity": "sha512-HNMztPP5A1sKuVFmdZ6BPVpBQd5bUjNC8EFMFiICK+oho/OQsAJy5hnIx4btMHiOk8j04f/DbIlqnEZ9d72dqg==",
+ "dev": true,
+ "optional": true
+ },
+ "v8flags": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
+ "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
+ "dev": true,
+ "requires": {
+ "user-home": "1.1.1"
+ }
+ },
+ "vali-date": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz",
+ "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=",
+ "dev": true
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
+ "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "3.0.0",
+ "spdx-expression-parse": "3.0.0"
+ }
+ },
+ "vargs": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/vargs/-/vargs-0.1.0.tgz",
+ "integrity": "sha1-a2GE2mUgzDIEzhtAfKwm2SYJ6/8=",
+ "dev": true
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+ "dev": true
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "1.3.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "vinyl": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
+ "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=",
+ "dev": true,
+ "requires": {
+ "clone": "2.1.1",
+ "clone-buffer": "1.0.0",
+ "clone-stats": "1.0.0",
+ "cloneable-readable": "1.1.2",
+ "remove-trailing-separator": "1.1.0",
+ "replace-ext": "1.0.0"
+ }
+ },
+ "vinyl-buffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vinyl-buffer/-/vinyl-buffer-1.0.1.tgz",
+ "integrity": "sha1-lsGjR5uMU5JULGEgKQE7Wyf4i78=",
+ "dev": true,
+ "requires": {
+ "bl": "1.2.1",
+ "through2": "2.0.3"
+ }
+ },
+ "vinyl-fs": {
+ "version": "0.3.14",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz",
+ "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=",
+ "dev": true,
+ "requires": {
+ "defaults": "1.0.3",
+ "glob-stream": "3.1.18",
+ "glob-watcher": "0.0.6",
+ "graceful-fs": "3.0.11",
+ "mkdirp": "0.5.1",
+ "strip-bom": "1.0.0",
+ "through2": "0.6.5",
+ "vinyl": "0.4.6"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
+ "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
+ "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
+ "dev": true,
+ "requires": {
+ "natives": "1.1.2"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ },
+ "vinyl": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
+ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
+ "dev": true,
+ "requires": {
+ "clone": "0.2.0",
+ "clone-stats": "0.0.1"
+ }
+ }
+ }
+ },
+ "vinyl-source-stream": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz",
+ "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=",
+ "dev": true,
+ "requires": {
+ "through2": "2.0.3",
+ "vinyl": "0.4.6"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
+ "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
+ "vinyl": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
+ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
+ "dev": true,
+ "requires": {
+ "clone": "0.2.0",
+ "clone-stats": "0.0.1"
+ }
+ }
+ }
+ },
+ "vinyl-sourcemaps-apply": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz",
+ "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7"
+ }
+ },
+ "walkdir": {
+ "version": "0.0.11",
+ "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz",
+ "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=",
+ "dev": true
+ },
+ "wbuf": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "dev": true,
+ "requires": {
+ "minimalistic-assert": "1.0.0"
+ }
+ },
+ "wct-browser-legacy": {
+ "version": "0.0.1-pre.11",
+ "resolved": "https://registry.npmjs.org/wct-browser-legacy/-/wct-browser-legacy-0.0.1-pre.11.tgz",
+ "integrity": "sha512-BZ8DUAAtFAX5l/SRQhB3Gtcimazr4fHgIt3Zdi+++cEvz7TjYBDp67uVakmUXIdEg0Wpnt2n19PGxA8O0OwaUQ==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.11",
+ "@polymer/sinonjs": "1.17.1",
+ "@polymer/test-fixture": "3.0.0-pre.11",
+ "@webcomponents/webcomponentsjs": "1.1.0",
+ "accessibility-developer-tools": "2.12.0",
+ "async": "1.5.2",
+ "chai": "3.5.0",
+ "lodash": "3.10.1",
+ "mocha": "3.5.3",
+ "sinon": "1.17.7",
+ "sinon-chai": "2.14.0",
+ "stacky": "1.3.1"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true
+ }
+ }
+ },
+ "wct-local": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wct-local/-/wct-local-2.1.0.tgz",
+ "integrity": "sha512-OiMSbxp6e5tyvTbUA4VAQbw4we53EXEmekx9BbIgS/HryoQISzap5DSAE/kvpRpJ2Axt0z12d8ChxqwNflApfA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "@types/express": "4.11.1",
+ "@types/freeport": "1.0.21",
+ "@types/launchpad": "0.6.0",
+ "@types/node": "9.4.7",
+ "@types/which": "1.3.1",
+ "chalk": "2.3.2",
+ "cleankill": "2.0.0",
+ "freeport": "1.0.5",
+ "launchpad": "0.7.0",
+ "promisify-node": "0.4.0",
+ "selenium-standalone": "6.13.0",
+ "which": "1.3.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "9.4.7",
+ "resolved": "http://registry.npmjs.org/@types/node/-/node-9.4.7.tgz",
+ "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "wct-sauce": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/wct-sauce/-/wct-sauce-2.0.0.tgz",
+ "integrity": "sha512-amICD6iZOVJEJ4uymfdPFdk17CkSIYwHPDzDh4cH/ITYcNskZ3VB/2VPtU9ZIKuWMVdqPwfBovXcjlhn8+8idA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "cleankill": "2.0.0",
+ "lodash": "3.10.1",
+ "request": "2.79.0",
+ "sauce-connect-launcher": "1.2.3",
+ "temp": "0.8.3",
+ "uuid": "2.0.3"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true,
+ "optional": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "uuid": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
+ "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "wd": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/wd/-/wd-1.6.1.tgz",
+ "integrity": "sha512-X3KnoYBqZ4Xj7phL3hWnraapl2w0N4z9lHKDFVNOpO2j3okoO2lhd9+oAFdd/qTbCNeNuGM59Pte360jx1hMVQ==",
+ "dev": true,
+ "requires": {
+ "archiver": "1.3.0",
+ "async": "2.0.1",
+ "lodash": "4.16.2",
+ "mkdirp": "0.5.1",
+ "q": "1.4.1",
+ "request": "2.79.0",
+ "underscore.string": "3.3.4",
+ "vargs": "0.1.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.0.1.tgz",
+ "integrity": "sha1-twnMAoCpw28J9FNr6CPIOKkEniU=",
+ "dev": true,
+ "requires": {
+ "lodash": "4.16.2"
+ }
+ },
+ "lodash": {
+ "version": "4.16.2",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.2.tgz",
+ "integrity": "sha1-PmJtuCcEimmSgaihJSJjJs/A5lI=",
+ "dev": true
+ },
+ "q": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz",
+ "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=",
+ "dev": true
+ }
+ }
+ },
+ "web-component-tester": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/web-component-tester/-/web-component-tester-6.5.0.tgz",
+ "integrity": "sha512-C8nK7mhLTGzm/3QcjBIzI5Pk3OLrEvup246Pc9stAD+sTvLWtH8tjVL+vU5KCOAdudKVnelGMbE4ICaNrl69+A==",
+ "dev": true,
+ "requires": {
+ "@polymer/sinonjs": "1.17.1",
+ "@polymer/test-fixture": "0.0.3",
+ "@webcomponents/webcomponentsjs": "1.1.0",
+ "accessibility-developer-tools": "2.12.0",
+ "async": "2.6.0",
+ "body-parser": "1.18.2",
+ "chai": "4.1.2",
+ "chalk": "1.1.3",
+ "cleankill": "2.0.0",
+ "express": "4.16.3",
+ "findup-sync": "1.0.0",
+ "glob": "7.1.2",
+ "lodash": "3.10.1",
+ "mocha": "3.5.3",
+ "multer": "1.3.0",
+ "nomnom": "1.8.1",
+ "polyserve": "0.23.0",
+ "promisify-node": "0.4.0",
+ "resolve": "1.5.0",
+ "semver": "5.5.0",
+ "send": "0.11.1",
+ "server-destroy": "1.0.1",
+ "sinon": "2.4.1",
+ "sinon-chai": "2.14.0",
+ "socket.io": "2.0.4",
+ "stacky": "1.3.1",
+ "update-notifier": "2.3.0",
+ "wct-local": "2.1.0",
+ "wct-sauce": "2.0.0",
+ "wd": "1.6.1"
+ },
+ "dependencies": {
+ "@polymer/test-fixture": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@polymer/test-fixture/-/test-fixture-0.0.3.tgz",
+ "integrity": "sha1-REN1JpfU2Sk7vEEuoLXk00HxSdk=",
+ "dev": true
+ },
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0"
+ }
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+ "dev": true
+ },
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "requires": {
+ "lodash": "4.17.5"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ }
+ }
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "dev": true,
+ "requires": {
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.2"
+ }
+ },
+ "chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
+ "dev": true,
+ "requires": {
+ "assertion-error": "1.1.0",
+ "check-error": "1.0.2",
+ "deep-eql": "3.0.1",
+ "get-func-name": "2.0.0",
+ "pathval": "1.1.0",
+ "type-detect": "4.0.8"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "deep-eql": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "dev": true,
+ "requires": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "detect-file": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz",
+ "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=",
+ "dev": true,
+ "requires": {
+ "fs-exists-sync": "0.1.0"
+ }
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "dev": true,
+ "requires": {
+ "is-posix-bracket": "0.1.1"
+ }
+ },
+ "expand-tilde": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz",
+ "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "findup-sync": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-1.0.0.tgz",
+ "integrity": "sha1-b35LV7buOkA3tEFOrt6j9Y9x4Ow=",
+ "dev": true,
+ "requires": {
+ "detect-file": "0.1.0",
+ "is-glob": "2.0.1",
+ "micromatch": "2.3.11",
+ "resolve-dir": "0.1.1"
+ }
+ },
+ "formatio": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz",
+ "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=",
+ "dev": true,
+ "requires": {
+ "samsam": "1.3.0"
+ }
+ },
+ "global-modules": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz",
+ "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=",
+ "dev": true,
+ "requires": {
+ "global-prefix": "0.1.5",
+ "is-windows": "0.2.0"
+ }
+ },
+ "global-prefix": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz",
+ "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "1.0.1",
+ "ini": "1.3.5",
+ "is-windows": "0.2.0",
+ "which": "1.3.0"
+ }
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ },
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true
+ },
+ "lolex": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz",
+ "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "dev": true,
+ "requires": {
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
+ }
+ },
+ "path-to-regexp": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
+ "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
+ "dev": true,
+ "requires": {
+ "isarray": "0.0.1"
+ }
+ },
+ "resolve-dir": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz",
+ "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "1.2.2",
+ "global-modules": "0.2.3"
+ }
+ },
+ "samsam": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz",
+ "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==",
+ "dev": true
+ },
+ "sinon": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz",
+ "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==",
+ "dev": true,
+ "requires": {
+ "diff": "3.2.0",
+ "formatio": "1.2.0",
+ "lolex": "1.6.0",
+ "native-promise-only": "0.8.1",
+ "path-to-regexp": "1.7.0",
+ "samsam": "1.3.0",
+ "text-encoding": "0.6.4",
+ "type-detect": "4.0.8"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true
+ }
+ }
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "which": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
+ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
+ "dev": true,
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ },
+ "widest-line": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz",
+ "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=",
+ "dev": true,
+ "requires": {
+ "string-width": "2.1.1"
+ }
+ },
+ "winston": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.1.tgz",
+ "integrity": "sha512-k/+Dkzd39ZdyJHYkuaYmf4ff+7j+sCIy73UCOWHYA67/WXU+FF/Y6PF28j+Vy7qNRPHWO+dR+/+zkoQWPimPqg==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ }
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-2.0.0.tgz",
+ "integrity": "sha1-q1X2leYRjak4WP3XDAU9HF4BrCA=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "write": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+ "dev": true,
+ "requires": {
+ "mkdirp": "0.5.1"
+ }
+ },
+ "write-file-atomic": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
+ "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "imurmurhash": "0.1.4",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "ws": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
+ "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
+ "dev": true,
+ "requires": {
+ "async-limiter": "1.0.0",
+ "safe-buffer": "5.1.1",
+ "ultron": "1.1.1"
+ }
+ },
+ "xdg-basedir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
+ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
+ "dev": true
+ },
+ "xml-char-classes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz",
+ "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=",
+ "dev": true
+ },
+ "xmlbuilder": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",
+ "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=",
+ "dev": true,
+ "optional": true
+ },
+ "xmldom": {
+ "version": "0.1.27",
+ "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz",
+ "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=",
+ "dev": true,
+ "optional": true
+ },
+ "xmlhttprequest-ssl": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
+ "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=",
+ "dev": true
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ },
+ "yauzl": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz",
+ "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "buffer-crc32": "0.2.13",
+ "fd-slicer": "1.0.1"
+ }
+ },
+ "yeast": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
+ "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
+ "dev": true
+ },
+ "zip-stream": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz",
+ "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=",
+ "dev": true,
+ "requires": {
+ "archiver-utils": "1.3.0",
+ "compress-commons": "1.2.2",
+ "lodash": "4.17.5",
+ "readable-stream": "2.3.5"
+ }
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/package.json
new file mode 100644
index 00000000000..dbda3c7a156
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/package.json
@@ -0,0 +1,59 @@
+{
+ "name": "@webcomponents/shadycss",
+ "version": "1.2.1",
+ "description": "Styling helpers for ShadyDOM",
+ "main": "shadycss.min.js",
+ "directories": {
+ "test": "tests"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/webcomponents/shadycss.git"
+ },
+ "author": "The Polymer Project Authors (https://polymer.github.io/AUTHORS.txt)",
+ "license": "BSD-3-Clause",
+ "keywords": [
+ "shady-css",
+ "shadycss",
+ "shadow-css",
+ "shadowcss",
+ "web-components",
+ "webcomponents",
+ "polyfill",
+ "shim"
+ ],
+ "bugs": {
+ "url": "https://github.com/webcomponents/shadycss/issues"
+ },
+ "scripts": {
+ "build": "gulp",
+ "lint": "eslint src test entrypoints",
+ "test": "npm run lint && gulp test-modules && wct"
+ },
+ "homepage": "https://webcomponents.org/polyfills",
+ "devDependencies": {
+ "@webcomponents/custom-elements": "^1.1.0",
+ "@webcomponents/html-imports": "^1.1.1",
+ "@webcomponents/shadydom": "^1.0.14",
+ "@webcomponents/template": "^1.2.4",
+ "@webcomponents/webcomponents-platform": "^1.0.0",
+ "del": "^3.0.0",
+ "es6-promise": "^4.2.4",
+ "eslint": "^4.19.1",
+ "eslint-plugin-html": "^3.2.2",
+ "google-closure-compiler": "^20170910.0.0",
+ "gulp": "^3.8.8",
+ "gulp-rename": "^1.2.2",
+ "gulp-size": "^2.1.0",
+ "gulp-sourcemaps": "^2.6.4",
+ "rollup-stream": "=1.23.1",
+ "run-sequence": "^2.2.1",
+ "vinyl-buffer": "^1.0.1",
+ "vinyl-source-stream": "^1.1.2",
+ "wct-browser-legacy": "0.0.1-pre.11",
+ "web-component-tester": "^6.5.0"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/scoping-shim.min.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/scoping-shim.min.js
new file mode 100644
index 00000000000..e3e8adca6d3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/scoping-shim.min.js
@@ -0,0 +1,53 @@
+(function(){/*
+
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+'use strict';var l,aa="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this,m={};function n(){this.end=this.start=0;this.rules=this.parent=this.previous=null;this.cssText=this.parsedCssText="";this.atRule=!1;this.type=0;this.parsedSelector=this.selector=this.keyframesName=""}
+function p(a){a=a.replace(ba,"").replace(ca,"");var b=da,c=a,e=new n;e.start=0;e.end=c.length;for(var d=e,f=0,h=c.length;f<h;f++)if("{"===c[f]){d.rules||(d.rules=[]);var g=d,k=g.rules[g.rules.length-1]||null;d=new n;d.start=f+1;d.parent=g;d.previous=k;g.rules.push(d)}else"}"===c[f]&&(d.end=f+1,d=d.parent||e);return b(e,a)}
+function da(a,b){var c=b.substring(a.start,a.end-1);a.parsedCssText=a.cssText=c.trim();a.parent&&(c=b.substring(a.previous?a.previous.end:a.parent.start,a.start-1),c=ea(c),c=c.replace(fa," "),c=c.substring(c.lastIndexOf(";")+1),c=a.parsedSelector=a.selector=c.trim(),a.atRule=0===c.indexOf("@"),a.atRule?0===c.indexOf("@media")?a.type=ha:c.match(ia)&&(a.type=r,a.keyframesName=a.selector.split(fa).pop()):a.type=0===c.indexOf("--")?ja:ka);if(c=a.rules)for(var e=0,d=c.length,f;e<d&&(f=c[e]);e++)da(f,b);
+return a}function ea(a){return a.replace(/\\([0-9a-f]{1,6})\s/gi,function(a,c){a=c;for(c=6-a.length;c--;)a="0"+a;return"\\"+a})}
+function la(a,b,c){c=void 0===c?"":c;var e="";if(a.cssText||a.rules){var d=a.rules,f;if(f=d)f=d[0],f=!(f&&f.selector&&0===f.selector.indexOf("--"));if(f){f=0;for(var h=d.length,g;f<h&&(g=d[f]);f++)e=la(g,b,e)}else b?b=a.cssText:(b=a.cssText,b=b.replace(ma,"").replace(na,""),b=b.replace(oa,"").replace(pa,"")),(e=b.trim())&&(e=" "+e+"\n")}e&&(a.selector&&(c+=a.selector+" {\n"),c+=e,a.selector&&(c+="}\n\n"));return c}
+var ka=1,r=7,ha=4,ja=1E3,ba=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,ca=/@import[^;]*;/gim,ma=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,na=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,oa=/@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,pa=/[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,ia=/^@[^\s]*keyframes/,fa=/\s+/g;var qa=Promise.resolve();function ra(a){if(a=m[a])a._applyShimCurrentVersion=a._applyShimCurrentVersion||0,a._applyShimValidatingVersion=a._applyShimValidatingVersion||0,a._applyShimNextVersion=(a._applyShimNextVersion||0)+1}function sa(a){return a._applyShimCurrentVersion===a._applyShimNextVersion}function ta(a){a._applyShimValidatingVersion=a._applyShimNextVersion;a.b||(a.b=!0,qa.then(function(){a._applyShimCurrentVersion=a._applyShimNextVersion;a.b=!1}))};var t=!(window.ShadyDOM&&window.ShadyDOM.inUse),u;function ua(a){u=a&&a.shimcssproperties?!1:t||!(navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/)||!window.CSS||!CSS.supports||!CSS.supports("box-shadow","0 0 0 var(--foo)"))}window.ShadyCSS&&void 0!==window.ShadyCSS.nativeCss?u=window.ShadyCSS.nativeCss:window.ShadyCSS?(ua(window.ShadyCSS),window.ShadyCSS=void 0):ua(window.WebComponents&&window.WebComponents.flags);var v=u;var w=/(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};{])+)|\{([^}]*)\}(?:(?=[;\s}])|$))/gi,y=/(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi,va=/(--[\w-]+)\s*([:,;)]|$)/gi,wa=/(animation\s*:)|(animation-name\s*:)/,xa=/@media\s(.*)/,ya=/\{[^}]*\}/g;var za=new Set;function z(a,b){if(!a)return"";"string"===typeof a&&(a=p(a));b&&A(a,b);return la(a,v)}function B(a){!a.__cssRules&&a.textContent&&(a.__cssRules=p(a.textContent));return a.__cssRules||null}function Aa(a){return!!a.parent&&a.parent.type===r}function A(a,b,c,e){if(a){var d=!1,f=a.type;if(e&&f===ha){var h=a.selector.match(xa);h&&(window.matchMedia(h[1]).matches||(d=!0))}f===ka?b(a):c&&f===r?c(a):f===ja&&(d=!0);if((a=a.rules)&&!d){d=0;f=a.length;for(var g;d<f&&(g=a[d]);d++)A(g,b,c,e)}}}
+function C(a,b,c,e){var d=document.createElement("style");b&&d.setAttribute("scope",b);d.textContent=a;Ba(d,c,e);return d}var D=null;function Ba(a,b,c){b=b||document.head;b.insertBefore(a,c&&c.nextSibling||b.firstChild);D?a.compareDocumentPosition(D)===Node.DOCUMENT_POSITION_PRECEDING&&(D=a):D=a}
+function Ca(a,b){var c=a.indexOf("var(");if(-1===c)return b(a,"","","");a:{var e=0;var d=c+3;for(var f=a.length;d<f;d++)if("("===a[d])e++;else if(")"===a[d]&&0===--e)break a;d=-1}e=a.substring(c+4,d);c=a.substring(0,c);a=Ca(a.substring(d+1),b);d=e.indexOf(",");return-1===d?b(c,e.trim(),"",a):b(c,e.substring(0,d).trim(),e.substring(d+1).trim(),a)}function E(a,b){t?a.setAttribute("class",b):window.ShadyDOM.nativeMethods.setAttribute.call(a,"class",b)}
+function F(a){var b=a.localName,c="";b?-1<b.indexOf("-")||(c=b,b=a.getAttribute&&a.getAttribute("is")||""):(b=a.is,c=a.extends);return{is:b,s:c}};function G(){}function H(a,b,c){var e=I;a.__styleScoped?a.__styleScoped=null:Da(e,a,b||"",c)}function Da(a,b,c,e){b.nodeType===Node.ELEMENT_NODE&&Ea(b,c,e);if(b="template"===b.localName?(b.content||b.P).childNodes:b.children||b.childNodes)for(var d=0;d<b.length;d++)Da(a,b[d],c,e)}
+function Ea(a,b,c){if(b)if(a.classList)c?(a.classList.remove("style-scope"),a.classList.remove(b)):(a.classList.add("style-scope"),a.classList.add(b));else if(a.getAttribute){var e=a.getAttribute(Fa);c?e&&(b=e.replace("style-scope","").replace(b,""),E(a,b)):E(a,(e?e+" ":"")+"style-scope "+b)}}function J(a,b,c){var e=I,d=a.__cssBuild;t||"shady"===d?b=z(b,c):(a=F(a),b=Ga(e,b,a.is,a.s,c)+"\n\n");return b.trim()}
+function Ga(a,b,c,e,d){var f=K(c,e);c=c?Ha+c:"";return z(b,function(b){b.c||(b.selector=b.g=L(a,b,a.b,c,f),b.c=!0);d&&d(b,c,f)})}function K(a,b){return b?"[is="+a+"]":a}function L(a,b,c,e,d){var f=b.selector.split(Ia);if(!Aa(b)){b=0;for(var h=f.length,g;b<h&&(g=f[b]);b++)f[b]=c.call(a,g,e,d)}return f.join(Ia)}function Ja(a){return a.replace(M,function(a,c,e){-1<e.indexOf("+")?e=e.replace(/\+/g,"___"):-1<e.indexOf("___")&&(e=e.replace(/___/g,"+"));return":"+c+"("+e+")"})}
+G.prototype.b=function(a,b,c){var e=!1;a=a.trim();var d=M.test(a);d&&(a=a.replace(M,function(a,b,c){return":"+b+"("+c.replace(/\s/g,"")+")"}),a=Ja(a));a=a.replace(Ka,N+" $1");a=a.replace(La,function(a,d,g){e||(a=Ma(g,d,b,c),e=e||a.stop,d=a.G,g=a.value);return d+g});d&&(a=Ja(a));return a};
+function Ma(a,b,c,e){var d=a.indexOf(Na);0<=a.indexOf(N)?a=Oa(a,e):0!==d&&(a=c?Pa(a,c):a);c=!1;0<=d&&(b="",c=!0);if(c){var f=!0;c&&(a=a.replace(Qa,function(a,b){return" > "+b}))}a=a.replace(Ra,function(a,b,c){return'[dir="'+c+'"] '+b+", "+b+'[dir="'+c+'"]'});return{value:a,G:b,stop:f}}function Pa(a,b){a=a.split(Sa);a[0]+=b;return a.join(Sa)}
+function Oa(a,b){var c=a.match(Ta);return(c=c&&c[2].trim()||"")?c[0].match(Ua)?a.replace(Ta,function(a,c,f){return b+f}):c.split(Ua)[0]===b?c:Va:a.replace(N,b)}function Wa(a){a.selector===Xa&&(a.selector="html")}G.prototype.c=function(a){return a.match(Na)?this.b(a,Ya):Pa(a.trim(),Ya)};aa.Object.defineProperties(G.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"style-scope"}}});
+var M=/:(nth[-\w]+)\(([^)]+)\)/,Ya=":not(.style-scope)",Ia=",",La=/(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=[])+)/g,Ua=/[[.:#*]/,N=":host",Xa=":root",Na="::slotted",Ka=new RegExp("^("+Na+")"),Ta=/(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Qa=/(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Ra=/(.*):dir\((?:(ltr|rtl))\)/,Ha=".",Sa=":",Fa="class",Va="should_not_match",I=new G;function Za(){}
+function $a(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.target!==document.documentElement&&c.target!==document.head)for(var e=0;e<c.addedNodes.length;e++){var d=c.addedNodes[e];if(d.nodeType===Node.ELEMENT_NODE){var f=d.getRootNode();var h=d;var g=[];h.classList?g=Array.from(h.classList):h instanceof window.SVGElement&&h.hasAttribute("class")&&(g=h.getAttribute("class").split(/\s+/));h=g;g=h.indexOf(I.a);if((h=-1<g?h[g+1]:"")&&f===d.ownerDocument)H(d,h,!0);else if(f.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&(f=
+f.host))if(f=F(f).is,h===f)for(d=window.ShadyDOM.nativeMethods.querySelectorAll.call(d,":not(."+I.a+")"),f=0;f<d.length;f++)Ea(d[f],h);else h&&H(d,h,!0),H(d,f)}}}}
+if(!t){var ab=new MutationObserver($a),bb=function(a){ab.observe(a,{childList:!0,subtree:!0})};if(window.customElements&&!window.customElements.polyfillWrapFlushCallback)bb(document);else{var cb=function(){bb(document.body)};window.HTMLImports?window.HTMLImports.whenReady(cb):requestAnimationFrame(function(){if("loading"===document.readyState){var a=function(){cb();document.removeEventListener("readystatechange",a)};document.addEventListener("readystatechange",a)}else cb()})}Za=function(){$a(ab.takeRecords())}}
+var db=Za;function P(a,b,c,e,d){this.j=a||null;this.b=b||null;this.A=c||[];this.o=null;this.s=d||"";this.a=this.h=this.m=null}function Q(a){return a?a.__styleInfo:null}function eb(a,b){return a.__styleInfo=b}P.prototype.c=function(){return this.j};P.prototype._getStyleRules=P.prototype.c;function fb(a){var b=this.matches||this.matchesSelector||this.mozMatchesSelector||this.msMatchesSelector||this.oMatchesSelector||this.webkitMatchesSelector;return b&&b.call(this,a)}var gb=navigator.userAgent.match("Trident");function hb(){}function ib(a){var b={},c=[],e=0;A(a,function(a){R(a);a.index=e++;a=a.f.cssText;for(var c;c=va.exec(a);){var d=c[1];":"!==c[2]&&(b[d]=!0)}},function(a){c.push(a)});a.b=c;a=[];for(var d in b)a.push(d);return a}
+function R(a){if(!a.f){var b={},c={};S(a,c)&&(b.i=c,a.rules=null);b.cssText=a.parsedCssText.replace(ya,"").replace(w,"");a.f=b}}function S(a,b){var c=a.f;if(c){if(c.i)return Object.assign(b,c.i),!0}else{c=a.parsedCssText;for(var e;a=w.exec(c);){e=(a[2]||a[3]).trim();if("inherit"!==e||"unset"!==e)b[a[1].trim()]=e;e=!0}return e}}
+function T(a,b,c){b&&(b=0<=b.indexOf(";")?jb(a,b,c):Ca(b,function(b,d,f,h){if(!d)return b+h;(d=T(a,c[d],c))&&"initial"!==d?"apply-shim-inherit"===d&&(d="inherit"):d=T(a,c[f]||f,c)||f;return b+(d||"")+h}));return b&&b.trim()||""}
+function jb(a,b,c){b=b.split(";");for(var e=0,d,f;e<b.length;e++)if(d=b[e]){y.lastIndex=0;if(f=y.exec(d))d=T(a,c[f[1]],c);else if(f=d.indexOf(":"),-1!==f){var h=d.substring(f);h=h.trim();h=T(a,h,c)||h;d=d.substring(0,f)+h}b[e]=d&&d.lastIndexOf(";")===d.length-1?d.slice(0,-1):d||""}return b.join(";")}
+function kb(a,b){var c={},e=[];A(a,function(a){a.f||R(a);var d=a.g||a.parsedSelector;b&&a.f.i&&d&&fb.call(b,d)&&(S(a,c),a=a.index,d=parseInt(a/32,10),e[d]=(e[d]||0)|1<<a%32)},null,!0);return{i:c,key:e}}
+function lb(a,b,c,e,d){c.f||R(c);if(c.f.i){b=F(b);a=b.is;b=b.s;b=a?K(a,b):"html";var f=c.parsedSelector,h=":host > *"===f||"html"===f,g=0===f.indexOf(":host")&&!h;"shady"===e&&(h=f===b+" > *."+b||-1!==f.indexOf("html"),g=!h&&0===f.indexOf(b));"shadow"===e&&(h=":host > *"===f||"html"===f,g=g&&!h);if(h||g)e=b,g&&(c.g||(c.g=L(I,c,I.b,a?Ha+a:"",b)),e=c.g||b),d({L:e,J:g,R:h})}}
+function mb(a,b){var c={},e={},d=U,f=b&&b.__cssBuild;A(b,function(b){lb(d,a,b,f,function(d){fb.call(a.w||a,d.L)&&(d.J?S(b,c):S(b,e))})},null,!0);return{K:e,I:c}}
+function nb(a,b,c,e){var d=F(b),f=K(d.is,d.s),h=new RegExp("(?:^|[^.#[:])"+(b.extends?"\\"+f.slice(0,-1)+"\\]":f)+"($|[.:[\\s>+~])");d=Q(b).j;var g=ob(d,e);return J(b,d,function(b){var d="";b.f||R(b);b.f.cssText&&(d=jb(a,b.f.cssText,c));b.cssText=d;if(!t&&!Aa(b)&&b.cssText){var k=d=b.cssText;null==b.B&&(b.B=wa.test(d));if(b.B)if(null==b.v){b.v=[];for(var q in g)k=g[q],k=k(d),d!==k&&(d=k,b.v.push(q))}else{for(q=0;q<b.v.length;++q)k=g[b.v[q]],d=k(d);k=d}b.cssText=k;b.g=b.g||b.selector;d="."+e;q=b.g.split(",");
+k=0;for(var ub=q.length,O;k<ub&&(O=q[k]);k++)q[k]=O.match(h)?O.replace(f,d):d+" "+O;b.selector=q.join(",")}})}function ob(a,b){a=a.b;var c={};if(!t&&a)for(var e=0,d=a[e];e<a.length;d=a[++e]){var f=d,h=b;f.l=new RegExp("\\b"+f.keyframesName+"(?!\\B|-)","g");f.a=f.keyframesName+"-"+h;f.g=f.g||f.selector;f.selector=f.g.replace(f.keyframesName,f.a);c[d.keyframesName]=pb(d)}return c}function pb(a){return function(b){return b.replace(a.l,a.a)}}
+function qb(a,b){var c=U,e=B(a);a.textContent=z(e,function(a){var d=a.cssText=a.parsedCssText;a.f&&a.f.cssText&&(d=d.replace(ma,"").replace(na,""),a.cssText=jb(c,d,b))})}aa.Object.defineProperties(hb.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"x-scope"}}});var U=new hb;var rb={},V=window.customElements;if(V&&!t){var sb=V.define;V.define=function(a,b,c){var e=document.createComment(" Shady DOM styles for "+a+" "),d=document.head;d.insertBefore(e,(D?D.nextSibling:null)||d.firstChild);D=e;rb[a]=e;sb.call(V,a,b,c)}};var W=new function(){this.cache={};this.a=100};function X(){this.w={};this.c=document.documentElement;var a=new n;a.rules=[];this.l=eb(this.c,new P(a));this.u=!1;this.b=this.a=null}l=X.prototype;l.D=function(){db()};l.H=function(a){return B(a)};l.N=function(a){return z(a)};
+l.prepareTemplate=function(a,b,c){if(!a.l){a.l=!0;a.name=b;a.extends=c;m[b]=a;var e=(e=a.content.querySelector("style"))?e.getAttribute("css-build")||"":"";var d=[];for(var f=a.content.querySelectorAll("style"),h=0;h<f.length;h++){var g=f[h];if(g.hasAttribute("shady-unscoped")){if(!t){var k=g.textContent;za.has(k)||(za.add(k),k=g.cloneNode(!0),document.head.appendChild(k));g.parentNode.removeChild(g)}}else d.push(g.textContent),g.parentNode.removeChild(g)}d=d.join("").trim();c={is:b,extends:c,O:e};
+t||H(a.content,b);Y(this);f=y.test(d)||w.test(d);y.lastIndex=0;w.lastIndex=0;d=p(d);f&&v&&this.a&&this.a.transformRules(d,b);a._styleAst=d;a.u=e;e=[];v||(e=ib(a._styleAst));if(!e.length||v)d=t?a.content:null,b=rb[b],f=J(c,a._styleAst),b=f.length?C(f,c.is,d,b):void 0,a.a=b;a.c=e}};
+function tb(a){!a.b&&window.ShadyCSS&&window.ShadyCSS.CustomStyleInterface&&(a.b=window.ShadyCSS.CustomStyleInterface,a.b.transformCallback=function(b){a.C(b)},a.b.validateCallback=function(){requestAnimationFrame(function(){(a.b.enqueued||a.u)&&a.flushCustomStyles()})})}function Y(a){!a.a&&window.ShadyCSS&&window.ShadyCSS.ApplyShim&&(a.a=window.ShadyCSS.ApplyShim,a.a.invalidCallback=ra);tb(a)}
+l.flushCustomStyles=function(){Y(this);if(this.b){var a=this.b.processStyles();if(this.b.enqueued){if(v)for(var b=0;b<a.length;b++){var c=this.b.getStyleForCustomStyle(a[b]);if(c&&v&&this.a){var e=B(c);Y(this);this.a.transformRules(e);c.textContent=z(e)}}else for(vb(this,this.c,this.l),b=0;b<a.length;b++)(c=this.b.getStyleForCustomStyle(a[b]))&&qb(c,this.l.m);this.b.enqueued=!1;this.u&&!v&&this.styleDocument()}}};
+l.styleElement=function(a,b){var c=F(a).is,e=Q(a);if(!e){var d=F(a);e=d.is;d=d.s;var f=rb[e];e=m[e];if(e){var h=e._styleAst;var g=e.c}e=eb(a,new P(h,f,g,0,d))}a!==this.c&&(this.u=!0);b&&(e.o=e.o||{},Object.assign(e.o,b));if(v){if(e.o){b=e.o;for(var k in b)null===k?a.style.removeProperty(k):a.style.setProperty(k,b[k])}if(((k=m[c])||a===this.c)&&k&&k.a&&!sa(k)){if(sa(k)||k._applyShimValidatingVersion!==k._applyShimNextVersion)Y(this),this.a&&this.a.transformRules(k._styleAst,c),k.a.textContent=J(a,
+e.j),ta(k);t&&(c=a.shadowRoot)&&(c.querySelector("style").textContent=J(a,e.j));e.j=k._styleAst}}else if(vb(this,a,e),e.A&&e.A.length){c=e;k=F(a).is;a:{if(b=W.cache[k])for(h=b.length-1;0<=h;h--){g=b[h];b:{e=c.A;for(d=0;d<e.length;d++)if(f=e[d],g.i[f]!==c.m[f]){e=!1;break b}e=!0}if(e){b=g;break a}}b=void 0}e=b?b.styleElement:null;h=c.h;(g=b&&b.h)||(g=this.w[k]=(this.w[k]||0)+1,g=k+"-"+g);c.h=g;g=c.h;d=U;d=e?e.textContent||"":nb(d,a,c.m,g);f=Q(a);var x=f.a;x&&!t&&x!==e&&(x._useCount--,0>=x._useCount&&
+x.parentNode&&x.parentNode.removeChild(x));t?f.a?(f.a.textContent=d,e=f.a):d&&(e=C(d,g,a.shadowRoot,f.b)):e?e.parentNode||(gb&&-1<d.indexOf("@media")&&(e.textContent=d),Ba(e,null,f.b)):d&&(e=C(d,g,null,f.b));e&&(e._useCount=e._useCount||0,f.a!=e&&e._useCount++,f.a=e);g=e;t||(e=c.h,f=d=a.getAttribute("class")||"",h&&(f=d.replace(new RegExp("\\s*x-scope\\s*"+h+"\\s*","g")," ")),f+=(f?" ":"")+"x-scope "+e,d!==f&&E(a,f));b||(a=W.cache[k]||[],a.push({i:c.m,styleElement:g,h:c.h}),a.length>W.a&&a.shift(),
+W.cache[k]=a)}};function wb(a,b){return(b=b.getRootNode().host)?Q(b)?b:wb(a,b):a.c}function vb(a,b,c){a=wb(a,b);var e=Q(a);a=Object.create(e.m||null);var d=mb(b,c.j);b=kb(e.j,b).i;Object.assign(a,d.I,b,d.K);b=c.o;for(var f in b)if((d=b[f])||0===d)a[f]=d;f=U;b=Object.getOwnPropertyNames(a);for(d=0;d<b.length;d++)e=b[d],a[e]=T(f,a[e],a);c.m=a}l.styleDocument=function(a){this.styleSubtree(this.c,a)};
+l.styleSubtree=function(a,b){var c=a.shadowRoot;(c||a===this.c)&&this.styleElement(a,b);if(b=c&&(c.children||c.childNodes))for(a=0;a<b.length;a++)this.styleSubtree(b[a]);else if(a=a.children||a.childNodes)for(b=0;b<a.length;b++)this.styleSubtree(a[b])};l.C=function(a){var b=this,c=B(a);A(c,function(a){if(t)Wa(a);else{var c=I;a.selector=a.parsedSelector;Wa(a);a.selector=a.g=L(c,a,c.c,void 0,void 0)}v&&(Y(b),b.a&&b.a.transformRule(a))});v?a.textContent=z(c):this.l.j.rules.push(c)};
+l.getComputedStyleValue=function(a,b){var c;v||(c=(Q(a)||Q(wb(this,a))).m[b]);return(c=c||window.getComputedStyle(a).getPropertyValue(b))?c.trim():""};l.M=function(a,b){var c=a.getRootNode();b=b?b.split(/\s/):[];c=c.host&&c.host.localName;if(!c){var e=a.getAttribute("class");if(e){e=e.split(/\s/);for(var d=0;d<e.length;d++)if(e[d]===I.a){c=e[d+1];break}}}c&&b.push(I.a,c);v||(c=Q(a))&&c.h&&b.push(U.a,c.h);E(a,b.join(" "))};l.F=function(a){return Q(a)};X.prototype.flush=X.prototype.D;
+X.prototype.prepareTemplate=X.prototype.prepareTemplate;X.prototype.styleElement=X.prototype.styleElement;X.prototype.styleDocument=X.prototype.styleDocument;X.prototype.styleSubtree=X.prototype.styleSubtree;X.prototype.getComputedStyleValue=X.prototype.getComputedStyleValue;X.prototype.setElementClass=X.prototype.M;X.prototype._styleInfoForNode=X.prototype.F;X.prototype.transformCustomStyleForDocument=X.prototype.C;X.prototype.getStyleAst=X.prototype.H;X.prototype.styleAstToString=X.prototype.N;
+X.prototype.flushCustomStyles=X.prototype.flushCustomStyles;Object.defineProperties(X.prototype,{nativeShadow:{get:function(){return t}},nativeCss:{get:function(){return v}}});var Z=new X,xb,yb;window.ShadyCSS&&(xb=window.ShadyCSS.ApplyShim,yb=window.ShadyCSS.CustomStyleInterface);
+window.ShadyCSS={ScopingShim:Z,prepareTemplate:function(a,b,c){Z.flushCustomStyles();Z.prepareTemplate(a,b,c)},styleSubtree:function(a,b){Z.flushCustomStyles();Z.styleSubtree(a,b)},styleElement:function(a){Z.flushCustomStyles();Z.styleElement(a)},styleDocument:function(a){Z.flushCustomStyles();Z.styleDocument(a)},flushCustomStyles:function(){Z.flushCustomStyles()},getComputedStyleValue:function(a,b){return Z.getComputedStyleValue(a,b)},nativeCss:v,nativeShadow:t};xb&&(window.ShadyCSS.ApplyShim=xb);
+yb&&(window.ShadyCSS.CustomStyleInterface=yb);}).call(this);
+
+//# sourceMappingURL=scoping-shim.min.js.map
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/scoping-shim.min.js.map b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/scoping-shim.min.js.map
new file mode 100644
index 00000000000..21211ca699d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/scoping-shim.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["src/template-map.js"," [synthetic:util/global] ","src/css-parse.js","src/apply-shim-utils.js","src/style-settings.js","src/common-regex.js","src/unscoped-style-handler.js","src/style-util.js","src/style-transformer.js","src/document-watcher.js","src/style-info.js","src/style-properties.js","src/style-placeholder.js","src/scoping-shim.js","src/style-cache.js","src/common-utils.js","entrypoints/scoping-shim.js"],"names":["$jscomp.global","templateMap","constructor","StyleNode","parse","text","replace","RX$$module$src$css_parse.comments","RX$$module$src$css_parse.port","parseCss","root","length","n","i","l","OPEN_BRACE","p","previous","push","CLOSE_BRACE","node","t","substring","trim","ss","_expandUnicodeEscapes","RX$$module$src$css_parse.multipleSpaces","lastIndexOf","s","indexOf","AT_START","MEDIA_START","types$$module$src$css_parse.MEDIA_RULE","match","RX$$module$src$css_parse.keyframesRule","types$$module$src$css_parse.KEYFRAMES_RULE","split","pop","VAR_START","types$$module$src$css_parse.MIXIN_RULE","types$$module$src$css_parse.STYLE_RULE","r$","r","code","repeat","stringify","preserveProperties","cssText","rules","RX$$module$src$css_parse.customProp","RX$$module$src$css_parse.mixinProp","RX$$module$src$css_parse.mixinApply","RX$$module$src$css_parse.varApply","STYLE_RULE","KEYFRAMES_RULE","MEDIA_RULE","MIXIN_RULE","comments","port","customProp","mixinProp","mixinApply","varApply","keyframesRule","multipleSpaces","promise","Promise","resolve","invalidate","elementName","template","templateIsValid","startValidatingTemplate","_validating","then","nativeShadow","window","nativeCssVariables_","calcCssVariables","settings","navigator","userAgent","CSS","supports","ShadyCSS","undefined","nativeCss","nativeCssVariables","VAR_ASSIGN","MIXIN_MATCH","VAR_CONSUMED","ANIMATION_MATCH","MEDIA_MATCH","BRACKETED","styleTextSet","Set","toCssText","callback","forEachRule","rulesForStyle","style","textContent","isKeyframesSelector","rule","styleRuleCallback","keyframesRuleCallback","onlyActiveRules","skipRules","type","matchMedia","matches","applyCss","moniker","target","contextNode","document","createElement","setAttribute","applyStyle","lastHeadApplyNode","head","insertBefore","nextSibling","firstChild","compareDocumentPosition","position","Node","DOCUMENT_POSITION_PRECEDING","processVariableAndFallback","str","start","level","inner","end","prefix","suffix","comma","value","fallback","setElementClassRaw","element","call","getIsExtends","localName","typeExtension","is","getAttribute","extends","StyleTransformer","dom","scope","shouldRemoveScope","$jscompDefaultExport","_transformDom","selector","nodeType","ELEMENT_NODE","c$","childNodes","content","_content","children","classList","remove","SCOPE_NAME","add","c","CLASS","newValue","elementStyles","styleRules","cssBuildType","css","ext","hostScope","_calcHostScope","CSS_CLASS_PREFIX","isScoped","transformedSelector","_transformRuleCss","self","_transformComplexSelector","transformer","p$","COMPLEX_SELECTOR_SEP","join","_twiddleNthPlus","NTH","m","inside","stop","isNth","test","SLOTTED_START","HOST","SIMPLE_SELECTOR_SEP","info","_transformCompoundSelector","combinator","slottedIndex","SLOTTED","_transformHostSelector","_transformSimpleSelector","slotted","SLOTTED_PAREN","paren","DIR_PAREN","before","dir","PSEUDO_PREFIX","HOST_PAREN","SIMPLE_SELECTOR_PREFIX","host","typeSelector","SELECTOR_NO_MATCH","normalizeRootSelector","ROOT","_transformDocumentSelector","SCOPE_DOC_SELECTOR","$jscomp.global.Object.defineProperties","RegExp","flush","handler","mxns","x","mxn","documentElement","addedNodes","getRootNode","classes","Array","from","hasAttribute","idx","ownerDocument","currentScope","DOCUMENT_FRAGMENT_NODE","newScope","unscoped","j","observer","MutationObserver","observe","childList","subtree","delayedStart","body","requestAnimationFrame","readyState","listener","removeEventListener","addEventListener","takeRecords","module$src$document_watcher.flush","StyleInfo","ast","placeholder","ownStylePropertyNames","overrideStyleProperties","customStyle","scopeSelector","styleProperties","get","set","styleInfo","_getStyleRules","prototype","matchesSelector","method","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","IS_IE","StyleProperties","decorateStyles","props","keyframes","ruleIndex","decorateRule","index","propertyInfo","exec","name","onKeyframesRule","_keyframes","names","properties","collectProperties","hasProperties","Object","assign","any","valueForProperty","property","valueForProperties","fn","propertyValue","parts","lastIndex","colon","pp","slice","propertyDataFromStyles","o","selectorToMatch","parseInt","key","whenHostOrRootRule","cssBuild","parsedSelector","isRoot","isHost","hostAndRootPropertiesForScope","hostProps","rootProps","_element","transformStyles","hostSelector","hostRx","HOST_PREFIX","rxHostSelector","HOST_SUFFIX","StyleInfo$$module$src$style_info.get","keyframeTransforms","_elementKeyframeTransforms","output","input","hasAnimations","keyframeNamesToTransform","keyframe","transform","keyframesRules","keyframesNameRx","transformedKeyframesName","scopeId","_keyframesRuleTransformer","applyCustomStyle","XSCOPE_NAME","placeholderMap","ce","origDefine","wrappedDefine","clazz","options","placeHolder","createComment","after","styleCache","cache","typeMax","ScopingShim","_scopeCounter","_documentOwner","_documentOwnerStyleInfo","StyleInfo$$module$src$style_info.set","_elementsHaveApplied","_customStyleInterface","_applyShim","ScopingShim$$module$src$scoping_shim.prototype","?.prototype","ScopingShim$$module$src$scoping_shim_prototype$flush","getStyleAst","styleAstToString","prepareTemplate","_prepared","querySelector","styleTextParts","styles","querySelectorAll","scopingAttribute","has","newStyle","cloneNode","appendChild","parentNode","removeChild","__cssBuild","_ensure","_cssBuild","ownPropertyNames","shadowroot","_style","_ownPropertyNames","_ensureCustomStyleInterface","CustomStyleInterface","transformCustomStyleForDocument","flushCustomStyles","_ensureApplyShim","ApplyShim","customStyles","_revalidateCustomStyleApplyShim","_updateProperties","_applyCustomStyles","styleDocument","styleElement","overrideProps","_isRootOwner","removeProperty","setProperty","shadowRoot","list","entry","pn","cachedStyle","cacheEntry","oldScopeSelector","cachedScopeSelector","id","v","shift","_styleOwnerForNode","owner","ownerStyleInfo","create","hostAndRootProps","propertiesMatchingHost","propertyData","overrides","getOwnPropertyNames","styleSubtree","shadowChildren","_transformRule","getComputedStyleValue","getComputedStyle","getPropertyValue","setElementClass","classString","scopeName","classAttr","k$","_styleInfoForNode","defineProperties","scopingShim","elementExtends"],"mappings":"A;;;;;;;;;aAUA,IAAA,CAAA,CCiCAA,GAb2B,WAAlB,EAAC,MAAO,OAAR,EAAiC,MAAjC,GAa0B,IAb1B,CAa0B,IAb1B,CAEe,WAAlB,EAAC,MAAO,OAAR,EAA2C,IAA3C,EAAiC,MAAjC,CAAmD,MAAnD,CAW6B,IDjCnC,CAKMC,EAAc,E,CEIlBC,QADIC,EACO,EAAG,CAIZ,IAAA,IAAA,CAFA,IAAA,MAEA,CAFgB,CAQhB,KAAA,MAAA,CAFA,IAAA,OAEA,CAJA,IAAA,SAIA,CAJmB,IAQnB,KAAA,QAAA,CAFA,IAAA,cAEA,CAFwB,EAIxB,KAAA,OAAA,CAAiB,CAAA,CAEjB,KAAA,KAAA,CAAe,CAMf,KAAA,eAAA,CAFA,IAAA,SAEA,CAJA,IAAA,cAIA,CAJwB,EApBZ;AAmCTC,QAASA,EAAK,CAACC,CAAD,CAAO,CAC1BA,CAAA,CAAaA,CAUNC,QAAA,CAAgBC,EAAhB,CAA6B,EAA7B,CAAAD,QAAA,CAAyCE,EAAzC,CAAkD,EAAlD,CATAC,KAAAA,EAAAA,EAAAA,CAAaJ,EAAAA,CAAbI,CAkBHC,EAAO,IAAIP,CACfO,EAAA,MAAA,CAAgB,CAChBA,EAAA,IAAA,CAAcL,CAAAM,OAEd,KADA,IAAIC,EAAIF,CAAR,CACSG,EAAI,CADb,CACgBC,EAAIT,CAAAM,OAApB,CAAiCE,CAAjC,CAAqCC,CAArC,CAAwCD,CAAA,EAAxC,CACE,GAuKeE,GAvKf,GAAIV,CAAA,CAAKQ,CAAL,CAAJ,CAA4B,CACrBD,CAAA,MAAL,GACEA,CAAA,MADF,CACe,EADf,CAGA,KAAII,EAAIJ,CAAR,CACIK,EAAWD,CAAA,MAAA,CAAWA,CAAA,MAAAL,OAAX,CAA+B,CAA/B,CAAXM,EAAgD,IACpDL,EAAA,CAAI,IAAIT,CACRS,EAAA,MAAA,CAAaC,CAAb,CAAiB,CACjBD,EAAA,OAAA,CAAcI,CACdJ,EAAA,SAAA,CAAgBK,CAChBD,EAAA,MAAAE,KAAA,CAAgBN,CAAhB,CAV0B,CAA5B,IAwKgBO,GA7JT,GAAId,CAAA,CAAKQ,CAAL,CAAJ,GACLD,CAAA,IACA,CADWC,CACX,CADe,CACf,CAAAD,CAAA,CAAIA,CAAA,OAAJ,EAAmBF,CAFd,CAlCT,OAAOD,EAAA,CAuCAC,CAvCA,CAAoBL,CAApB,CAFmB;AAkD5BI,QAASA,GAAQ,CAACW,CAAD,CAAOf,CAAP,CAAa,CAC5B,IAAIgB,EAAIhB,CAAAiB,UAAA,CAAeF,CAAA,MAAf,CAA8BA,CAAA,IAA9B,CAA4C,CAA5C,CACRA,EAAA,cAAA,CAAwBA,CAAA,QAAxB,CAA0CC,CAAAE,KAAA,EACtCH,EAAA,OAAJ,GAEEC,CASA,CATIhB,CAAAiB,UAAA,CADKF,CAAA,SAAAI,CAAmBJ,CAAA,SAAA,IAAnBI,CAA6CJ,CAAA,OAAA,MAClD,CAAmBA,CAAA,MAAnB,CAAmC,CAAnC,CASJ,CARAC,CAQA,CARII,EAAA,CAAsBJ,CAAtB,CAQJ,CAPAA,CAOA,CAPIA,CAAAf,QAAA,CAAUoB,EAAV,CAA6B,GAA7B,CAOJ,CAJAL,CAIA,CAJIA,CAAAC,UAAA,CAAYD,CAAAM,YAAA,CAAc,GAAd,CAAZ,CAAiC,CAAjC,CAIJ,CAHIC,CAGJ,CAHQR,CAAA,eAGR,CAHiCA,CAAA,SAGjC,CAHoDC,CAAAE,KAAA,EAGpD,CAFAH,CAAA,OAEA,CAF0C,CAE1C,GAFkBQ,CAAAC,QAAA,CAmJLC,GAnJK,CAElB,CAAIV,CAAA,OAAJ,CACiC,CAA/B,GAAIQ,CAAAC,QAAA,CA+IUE,QA/IV,CAAJ,CACEX,CAAA,KADF,CACiBY,EADjB,CAEWJ,CAAAK,MAAA,CAAQC,EAAR,CAFX,GAGEd,CAAA,KACA,CADee,CACf,CAAAf,CAAA,cAAA,CACEA,CAAA,SAAAgB,MAAA,CAAuBV,EAAvB,CAAAW,IAAA,EALJ,CADF,CAUIjB,CAAA,KAVJ,CAS+B,CAA7B,GAAIQ,CAAAC,QAAA,CAsIQS,IAtIR,CAAJ,CACiBC,EADjB,CAGiBC,EAvBrB,CA4BA,IADIC,CACJ,CADSrB,CAAA,MACT,CACE,IADM,IACGP,EAAI,CADP,CACUC,EAAI2B,CAAA9B,OADd,CACyB+B,CAA/B,CACG7B,CADH,CACOC,CADP,GACc4B,CADd,CACkBD,CAAA,CAAG5B,CAAH,CADlB,EAC0BA,CAAA,EAD1B,CAEEJ,EAAA,CAASiC,CAAT,CAAYrC,CAAZ,CAGJ;MAAOe,EArCqB,CA8C9BK,QAASA,GAAqB,CAACG,CAAD,CAAI,CAChC,MAAOA,EAAAtB,QAAA,CAAU,uBAAV,CAAmC,QAAQ,CAAA,CAAA,CAAA,CAAA,CAAG,CAC/CqC,CAAAA,CAAO,CAEX,KADEC,CACF,CADW,CACX,CADeD,CAAAhC,OACf,CAAOiC,CAAA,EAAP,CAAA,CACED,CAAA,CAAO,GAAP,CAAaA,CAEf,OAAO,IAAP,CAAcA,CANqC,CAA9C,CADyB;AAkB3BE,QAASA,GAAS,CAACzB,CAAD,CAAO0B,CAAP,CAA2BzC,CAA3B,CAAsC,CAAXA,CAAA,CAAA,IAAA,EAAA,GAAAA,CAAA,CAAO,EAAP,CAAAA,CAElD,KAAI0C,EAAU,EACd,IAAI3B,CAAA,QAAJ,EAAuBA,CAAA,MAAvB,CAAsC,CACpC,IAAIqB,EAAKrB,CAAA,MAAT,CACI,CAAA,IAAAqB,CAAA,CAAAA,CAAA,CAgCFC,CAhCQ,CAAAM,CAgCJ,CAAM,CAAN,CAhCI,CAAA,CAAA,CAAA,EAiCGN,CAjCH,EAiCiBA,CAAA,SAjCjB,EAiCwE,CAjCxE,GAiCmCA,CAAA,SAAAb,QAAA,CAuD/BS,IAvD+B,CAjCnC,CAAV,IAAI,CAAJ,CAA+B,CACpBzB,CAAAA,CAAI,CAAb,KAD6B,IACbC,EAAI2B,CAAA9B,OADS,CACE+B,CAA/B,CACG7B,CADH,CACOC,CADP,GACc4B,CADd,CACkBD,CAAA,CAAG5B,CAAH,CADlB,EAC0BA,CAAA,EAD1B,CAEEkC,CAAA,CAAUF,EAAA,CAAUH,CAAV,CAAaI,CAAb,CAAiCC,CAAjC,CAHiB,CAA/B,IAMYD,EAAA,CAAqB,CAArB,CAAqB,CAAA,QAArB,EACR,CAmCN,CAnCM,CAAA,QAmCN,CADAC,CACA,CADqCA,CAS9BzC,QAAA,CACI2C,EADJ,CACmB,EADnB,CAAA3C,QAAA,CAEI4C,EAFJ,CAEkB,EAFlB,CARP,CAAA,CAAA,CAA6BH,CAkBtBzC,QAAA,CACI6C,EADJ,CACmB,EADnB,CAAA7C,QAAA,CAEI8C,EAFJ,CAEiB,EAFjB,CAtDO,CAGV,EADAL,CACA,CAHUA,CAEAxB,KAAA,EACV,IACEwB,CADF,CACY,IADZ,CACmBA,CADnB,CAC6B,IAD7B,CAXkC,CAiBlCA,CAAJ,GACM3B,CAAA,SAIJ,GAHEf,CAGF,EAHUe,CAAA,SAGV,CAHgD,MAGhD,EADAf,CACA,EADQ0C,CACR,CAAI3B,CAAA,SAAJ,GACEf,CADF,EACU,OADV,CALF,CASA,OAAOA,EA7BsD;AAwE7DgD,IAAAA,GAAYA,CAAZA,CACAC,EAAgBA,CADhBD,CAEAE,GAAYA,CAFZF,CAGAG,GAAYA,GAHZH,CAWAI,GAAUA,mCAXVJ,CAYAK,GAAMA,kBAZNL,CAaAM,GAAYA,mDAbZN,CAcAO,GAAWA,4DAdXP,CAeAQ,GAAYA,yCAfZR,CAgBAS,GAAUA,2CAhBVT,CAiBAU,GAAeA,mBAjBfV,CAkBAW,GAAgBA,M,CCjOlB,IAAMC,GAAUC,OAAAC,QAAA,EAKTC,SAASA,GAAU,CAACC,CAAD,CAAa,CAErC,GADIC,CACJ,CHxBarE,CGuBE,CAAYoE,CAAZ,CACf,CACqBC,CAerB,yBAIA,CAnBqBA,CAeO,yBAI5B,EAJyD,CAIzD,CAnBqBA,CAiBrB,4BAEA,CAnBqBA,CAiBU,4BAE/B,EAF+D,CAE/D,CAnBqBA,CAmBrB,sBAAA,EAnBqBA,CAmBK,sBAA1B,EAAoD,CAApD,EAAyD,CAtBpB,CAyChCC,QAASA,GAAe,CAACD,CAAD,CAAW,CACxC,MAAOA,EAAA,yBAAP,GAAqCA,CAAA,sBADG,CA4CnCE,QAASA,GAAuB,CAACF,CAAD,CAAW,CAEhDA,CAAA,4BAAA,CAA+BA,CAAA,sBAE1BA,EAAAG,EAAL,GACEH,CAAAG,EACA,CADuB,CAAA,CACvB,CAAAR,EAAAS,KAAA,CAAa,QAAQ,EAAG,CAEtBJ,CAAA,yBAAA,CAA4BA,CAAA,sBAC5BA,EAAAG,EAAA,CAAuB,CAAA,CAHD,CAAxB,CAFF,CAJgD,C,CC/G3C,IAAME,EAAe,EAAEC,MAAA,SAAF,EAAwBA,MAAA,SAAA,MAAxB,CAArB,CACHC,CAKJC,SAASA,GAAgB,CAACC,CAAD,CAAW,CAEhCF,CAAA,CADEE,CAAJ,EAAgBA,CAAA,kBAAhB,CACwB,CAAA,CADxB,CASwBJ,CATxB,EASwC,EAASK,SAAAC,UAAAhD,MAAA,CAA0B,2BAA1B,CAAT,EACpCiD,CAAAN,MAAAM,IADoC,EACtBC,CAAAD,GAAAC,SADsB,EACN,CAAAD,GAAAC,SAAA,CAAa,YAAb,CAA2B,kBAA3B,CADM,CAVN,CAehCP,MAAAQ,SAAJ,EAAqDC,IAAAA,EAArD,GAAuBT,MAAAQ,SAAAE,UAAvB,CACET,CADF,CACwBD,MAAAQ,SAAAE,UADxB,CAEWV,MAAAQ,SAAJ,EACLN,EAAA,CAAiBF,MAAAQ,SAAjB,CAEA,CAAAR,MAAAQ,SAAA,CAAkBC,IAAAA,EAHb,EAKLP,EAAA,CAAiBF,MAAA,cAAjB,EAA4CA,MAAA,cAAA,MAA5C,CAMK,KAAMW,EAA4CV,C,CCpClD,IAAMW,EAAa,yHAAnB,CACMC,EAAc,sCADpB,CAEMC,GAAe,2BAFrB,CAGMC,GAAkB,sCAHxB,CAIMC,GAAc,cAJpB,CAMMC,GAAY,Y,CCHzB,IAAMC,GAAe,IAAIC,G,CCSlBC,QAASA,EAAU,CAAChD,CAAD,CAAQiD,CAAR,CAAkB,CAC1C,GAAI,CAACjD,CAAL,CACE,MAAO,EAEY,SAArB,GAAI,MAAOA,EAAX,GACEA,CADF,CL4Bc5C,CK3BJ,CAAM4C,CAAN,CADV,CAGIiD,EAAJ,EACEC,CAAA,CAAYlD,CAAZ,CAAmBiD,CAAnB,CAEF,OLwIcpD,GKxIP,CAAUG,CAAV,CHcIuC,CGdJ,CAVmC,CAiBrCY,QAASA,EAAa,CAACC,CAAD,CAAQ,CAC/B,CAACA,CAAA,WAAL,EAA4BA,CAAAC,YAA5B,GACED,CAAA,WADF,CLcchG,CKbU,CAAMgG,CAAAC,YAAN,CADxB,CAGA,OAAOD,EAAA,WAAP,EAA8B,IAJK,CAc9BE,QAASA,GAAmB,CAACC,CAAD,CAAO,CACxC,MAAO,CAAA,CAAQA,CAAA,OAAf,EACAA,CAAA,OAAA,KADA,GAC2BpE,CAFa,CAWnC+D,QAASA,EAAW,CAAC9E,CAAD,CAAOoF,CAAP,CAA0BC,CAA1B,CAAiDC,CAAjD,CAAkE,CAC3F,GAAKtF,CAAL,CAAA,CAGA,IAAIuF,EAAY,CAAA,CAAhB,CACIC,EAAOxF,CAAA,KACX,IAAIsF,CAAJ,EACME,CADN,GACe5E,EADf,CACiC,CAC7B,IAAI6E,EAAazF,CAAA,SAAAa,MAAA,CF1DV2D,EE0DU,CACbiB,EAAJ,GAEOjC,MAAAiC,WAAA,CAAkBA,CAAA,CAAW,CAAX,CAAlB,CAAAC,QAFP,GAGIH,CAHJ,CAGgB,CAAA,CAHhB,EAF6B,CAU7BC,CAAJ,GAAapE,EAAb,CACEgE,CAAA,CAAkBpF,CAAlB,CADF,CAEWqF,CAAJ,EACLG,CADK,GACIzE,CADJ,CAELsE,CAAA,CAAsBrF,CAAtB,CAFK,CAGIwF,CAHJ,GAGarE,EAHb,GAILoE,CAJK,CAIO,CAAA,CAJP,CAOP,KADIlE,CACJ,CADSrB,CAAA,MACT,GAAU,CAACuF,CAAX,CAAsB,CACX9F,CAAAA,CAAE,CAAGC,EAAAA,CAAE2B,CAAA9B,OAAhB,KAAK,IAAsB+B,CAA3B,CAA+B7B,CAA/B,CAAiCC,CAAjC,GAAwC4B,CAAxC,CAA0CD,CAAA,CAAG5B,CAAH,CAA1C,EAAkDA,CAAA,EAAlD,CACEqF,CAAA,CAAYxD,CAAZ,CAAe8D,CAAf,CAAkCC,CAAlC,CAAyDC,CAAzD,CAFkB,CAzBtB,CAD2F;AAyCtFK,QAASA,EAAQ,CAAChE,CAAD,CAAUiE,CAAV,CAAmBC,CAAnB,CAA2BC,CAA3B,CAAwC,CAY9D,IAAId,EAAwCe,QAAAC,cAAA,CAAuB,OAAvB,CAXNJ,EAYtC,EACEZ,CAAAiB,aAAA,CAAmB,OAAnB,CAboCL,CAapC,CAEFZ,EAAAC,YAAA,CAf6BtD,CAC7BuE,GAAA,CAeOlB,CAfP,CAAkBa,CAAlB,CAA0BC,CAA1B,CACA,OAcOd,EAjBuD,CAwBhE,IAAImB,EAAoB,IAuBjBD,SAASA,GAAU,CAAClB,CAAD,CAAQa,CAAR,CAAgBC,CAAhB,CAA6B,CACrDD,CAAA,CAASA,CAAT,EAAmBE,QAAAK,KAGnBP,EAAAQ,aAAA,CAAoBrB,CAApB,CAFac,CAEb,EAF4BA,CAAAQ,YAE5B,EADET,CAAAU,WACF,CACKJ,EAAL,CAIiBnB,CAAAwB,wBAAAC,CAA8BN,CAA9BM,CAJjB,GAKmBC,IAAAC,4BALnB,GAMIR,CANJ,CAMwBnB,CANxB,EACEmB,CADF,CACsBnB,CAN+B;AAyDhD4B,QAASA,GAA0B,CAACC,CAAD,CAAMhC,CAAN,CAAgB,CAExD,IAAIiC,EAAQD,CAAApG,QAAA,CAAY,MAAZ,CACZ,IAAe,EAAf,GAAIqG,CAAJ,CAEE,MAAOjC,EAAA,CAASgC,CAAT,CAAc,EAAd,CAAkB,EAAlB,CAAsB,EAAtB,CAvB6B,EAAA,CAAA,CACtC,IAAIE,EAAQ,CACHtH,KAAAA,EAwBwBqH,CAxBxBrH,CAwBgC,CAxBzC,KAAK,IAAaC,EAwBUmH,CAxBRtH,OAApB,CAAiCE,CAAjC,CAAqCC,CAArC,CAAwCD,CAAA,EAAxC,CACE,GAAgB,GAAhB,GAuB0BoH,CAvBtB,CAAKpH,CAAL,CAAJ,CACEsH,CAAA,EADF,KAEO,IAAgB,GAAhB,GAqBmBF,CArBf,CAAKpH,CAAL,CAAJ,EACW,CADX,GACD,EAAEsH,CADD,CAEH,MAAA,CAIN,EAAA,CAAQ,EAX8B,CA2BlCC,CAAAA,CAAQH,CAAA3G,UAAA,CAAc4G,CAAd,CAAsB,CAAtB,CAAyBG,CAAzB,CACRC,EAAAA,CAASL,CAAA3G,UAAA,CAAc,CAAd,CAAiB4G,CAAjB,CAETK,EAAAA,CAASP,EAAA,CAA2BC,CAAA3G,UAAA,CAAc+G,CAAd,CAAoB,CAApB,CAA3B,CAAmDpC,CAAnD,CACTuC,EAAAA,CAAQJ,CAAAvG,QAAA,CAAc,GAAd,CAEZ,OAAe,EAAf,GAAI2G,CAAJ,CAESvC,CAAA,CAASqC,CAAT,CAAiBF,CAAA7G,KAAA,EAAjB,CAA+B,EAA/B,CAAmCgH,CAAnC,CAFT,CAOOtC,CAAA,CAASqC,CAAT,CAFKF,CAAA9G,UAAA,CAAgB,CAAhB,CAAmBkH,CAAnB,CAAAjH,KAAAkH,EAEL,CADQL,CAAA9G,UAAA,CAAgBkH,CAAhB,CAAwB,CAAxB,CAAAjH,KAAAmH,EACR,CAAkCH,CAAlC,CAtBiD,CA6BnDI,QAASA,EAAkB,CAACC,CAAD,CAAUH,CAAV,CAAiB,CHlOtC9D,CGoOX,CACEiE,CAAAvB,aAAA,CAAqB,OAArB,CAA8BoB,CAA9B,CADF,CAGE7D,MAAA,SAAA,cAAA,aAAAiE,KAAA,CAAyDD,CAAzD,CAAkE,OAAlE,CAA2EH,CAA3E,CAL+C;AAa5CK,QAASA,EAAY,CAACF,CAAD,CAAU,CACpC,IAAIG,EAAYH,CAAA,UAAhB,CACaI,EAAgB,EAKzBD,EAAJ,CACgC,EADhC,CACMA,CAAAlH,QAAA,CAAkB,GAAlB,CADN,GAIImH,CACA,CADgBD,CAChB,CAAAE,CAAA,CAAML,CAAAM,aAAN,EAA8BN,CAAAM,aAAA,CAAqB,IAArB,CAA9B,EAA6D,EALjE,GAQED,CACA,CADsBL,CAADK,GACrB,CAAAD,CAAA,CAAiCJ,CAADO,QATlC,CAWA,OAAO,CAACF,GAAAA,CAAD,CAAKD,EAAAA,CAAL,CAlB6B,C,CCrNtC,QAAMI,EAAN,EAAA,EAWEC,QAAA,EAAG,CAACjI,CAAD,CAAOkI,CAAP,CAAcC,CAAd,CAAiC,CAyTvBC,IAAAA,EAAAA,CAvTPpI,EAAA,cAAJ,CACEA,CAAA,cADF,CAC0B,IAD1B,CAGEqI,EAAA,CAAAA,CAAA,CAAmBrI,CAAnB,CAAyBkI,CAAzB,EAAkC,EAAlC,CAAsCC,CAAtC,CALgC,CASpCE,QAAA,GAAa,CAAbA,CAAa,CAACrI,CAAD,CAAOsI,CAAP,CAAiBH,CAAjB,CAAoC,CAC3CnI,CAAAuI,SAAJ,GAAsB7B,IAAA8B,aAAtB,EACEhB,EAAA,CAAaxH,CAAb,CAAmBsI,CAAnB,CAA6BH,CAA7B,CAKF,IAHIM,CAGJ,CAH6B,UAApB,GAACzI,CAAA2H,UAAD,CACPe,CAAC1I,CAAA2I,QAADD,EAAiB1I,CAAA4I,EAAjBF,YADO,CAEP1I,CAAA6I,SAFO,EAEU7I,CAAA0I,WACnB,CACE,IAAK,IAAIjJ,EAAE,CAAX,CAAcA,CAAd,CAAgBgJ,CAAAlJ,OAAhB,CAA2BE,CAAA,EAA3B,CACE4I,EAAA,CAAAA,CAAA,CAAmBI,CAAA,CAAGhJ,CAAH,CAAnB,CAA0B6I,CAA1B,CAAoCH,CAApC,CAT2C;AAkBjDX,QAAA,GAAO,CAACA,CAAD,CAAUU,CAAV,CAAiBC,CAAjB,CAAoC,CAIzC,GAAID,CAAJ,CAEE,GAAIV,CAAAsB,UAAJ,CACMX,CAAJ,EACEX,CAAAsB,UAAAC,OAAA,CAhDSC,aAgDT,CACA,CAAAxB,CAAAsB,UAAAC,OAAA,CAAyBb,CAAzB,CAFF,GAIEV,CAAAsB,UAAAG,IAAA,CAnDSD,aAmDT,CACA,CAAAxB,CAAAsB,UAAAG,IAAA,CAAsBf,CAAtB,CALF,CADF,KAQO,IAAIV,CAAAM,aAAJ,CAA0B,CAC/B,IAAIoB,EAAI1B,CAAAM,aAAA,CAAqBqB,EAArB,CACJhB,EAAJ,CACMe,CADN,GAEQE,CACJ,CADeF,CAAAhK,QAAA,CA1DR8J,aA0DQ,CAAsB,EAAtB,CAAA9J,QAAA,CAAkCgJ,CAAlC,CAAyC,EAAzC,CACf,CD+IIX,CC/IJ,CAA6BC,CAA7B,CAAsC4B,CAAtC,CAHJ,EDkJQ7B,CC3IN,CAA6BC,CAA7B,EADgB0B,CAAA,CAAIA,CAAJ,CAAQ,GAAR,CAAc,EAC9B,EADiD,cACjD,CADuDhB,CACvD,CAT6B,CAdM,CAkC3CmB,QAAA,EAAa,CAAC7B,CAAD,CAAU8B,CAAV,CAAsBzE,CAAtB,CAAgC,CA4PhCuD,IAAAA,EAAAA,CAAAA,CA3PPmB,EAAe/B,CAAA,WJnGVjE,EI2GT,EAAqC,OAArC,GAAoBgG,CAApB,CACE5H,CADF,CDjGYiD,CCkGA,CAAoB0E,CAApB,CAAgCzE,CAAhC,CADZ,EAGM,CACJ,CDgIU6C,CCjIgB,CAAuBF,CAAvB,CAC1B,CAAA7F,CAAA,CAAU6H,EAAA,CAAAA,CAAA,CAASF,CAAT,CADL,CAAAzB,GACK,CADD,CAAAD,EACC,CAAwC/C,CAAxC,CAAV,CAA8D,MAJhE,CAMA,OAAOlD,EAAAxB,KAAA,EAfoC;AAsB7CqJ,QAAA,GAAG,CAAHA,CAAG,CAAC5H,CAAD,CAAQsG,CAAR,CAAeuB,CAAf,CAAoB5E,CAApB,CAA8B,CAC/B,IAAI6E,EAAYC,CAAA,CAAoBzB,CAApB,CAA2BuB,CAA3B,CAChBvB,EAAA,CAA+BA,CAc/B,CACS0B,EADT,CAd+B1B,CAc/B,CAGS,EAfT,ODlHYtD,ECkHL,CAAoBhD,CAApB,CAA2B,QAAQ,CAAiBuD,CAAjB,CAAuB,CAC1DA,CAAA0E,EAAL,GACY1E,CAqCd,SApCI,CADUA,CAqCK2E,EApCf,CAqCFC,CAAA,CAzCSC,CAyCT,CAtCY7E,CAsCZ,CAzCS6E,CAyBeC,EAgBxB,CAtCkB/B,CAsClB,CAtCyBwB,CAsCzB,CArCE,CAAAvE,CAAA0E,EAAA,CAAgB,CAAA,CAFlB,CAIIhF,EAAJ,EACEA,CAAA,CAASM,CAAT,CAAe+C,CAAf,CAAsBwB,CAAtB,CAN6D,CAA1D,CAJwB,CAuBjCC,QAAA,EAAc,CAACzB,CAAD,CAAQuB,CAAR,CAAa,CACzB,MAAOA,EAAA,CAAM,MAAN,CAAavB,CAAb,CAAkB,GAAlB,CAAwBA,CADN,CA8B3B6B,QAAA,EAAiB,CAAjBA,CAAiB,CAAC5E,CAAD,CAAO+E,CAAP,CAAoBhC,CAApB,CAA2BwB,CAA3B,CAAsC,CACrD,IAAIS,EAAKhF,CAAA,SAAAnE,MAAA,CAAuBoJ,EAAvB,CAGT,IAAI,CDxIQlF,ECwIP,CAA8BC,CAA9B,CAAL,CAA0C,CAC/B1F,CAAAA,CAAE,CAAX,KADwC,IAC1BC,EAAEyK,CAAA5K,OADwB,CACbK,CAA3B,CAA+BH,CAA/B,CAAiCC,CAAjC,GAAwCE,CAAxC,CAA0CuK,CAAA,CAAG1K,CAAH,CAA1C,EAAkDA,CAAA,EAAlD,CACE0K,CAAA,CAAG1K,CAAH,CAAA,CAAQyK,CAAAzC,KAAA,CAAiB,CAAjB,CAAuB7H,CAAvB,CAA0BsI,CAA1B,CAAiCwB,CAAjC,CAF8B,CAK1C,MAAOS,EAAAE,KAAA,CAAQD,EAAR,CAT8C,CAgBvDE,QAAA,GAAe,CAAChC,CAAD,CAAW,CACxB,MAAOA,EAAApJ,QAAA,CAAiBqL,CAAjB,CAAsB,QAAA,CAACC,CAAD,CAAIhF,CAAJ,CAAUiF,CAAV,CAAqB,CACrB,EAA3B,CAAIA,CAAAhK,QAAA,CAAe,GAAf,CAAJ,CACEgK,CADF,CACWA,CAAAvL,QAAA,CAAe,KAAf,CAAsB,KAAtB,CADX,CAEoC,EAFpC,CAEWuL,CAAAhK,QAAA,CAAe,KAAf,CAFX,GAGEgK,CAHF,CAGWA,CAAAvL,QAAA,CAAe,MAAf,CAAuB,GAAvB,CAHX,CAKA,OAAO,GAAP,CAAWsG,CAAX,CAAe,GAAf,CAAmBiF,CAAnB,CAAyB,GANuB,CAA3C,CADiB;AAgB1B,CAAA,UAAA,EAAA,CAAAR,QAAyB,CAAC3B,CAAD,CAAWJ,CAAX,CAAkBwB,CAAlB,CAA6B,CACpD,IAAIgB,EAAO,CAAA,CACXpC,EAAA,CAAWA,CAAAnI,KAAA,EAEX,KAAIwK,EAAQJ,CAAAK,KAAA,CAAStC,CAAT,CACRqC,EAAJ,GACErC,CACA,CADWA,CAAApJ,QAAA,CAAiBqL,CAAjB,CAAsB,QAAA,CAACC,CAAD,CAAIhF,CAAJ,CAAUwB,CAAV,CAAoB,CAAA,MAAA,GAAA,CAAIxB,CAAJ,CAAQ,GAAR,CAAYwB,CAAA9H,QAAA,CAAc,KAAd,CAAqB,EAArB,CAAZ,CAAoC,GAApC,CAA1C,CACX,CAAAoJ,CAAA,CAAWgC,EAAA,CAAqBhC,CAArB,CAFb,CAIAA,EAAA,CAAWA,CAAApJ,QAAA,CAAiB2L,EAAjB,CAAmCC,CAAnC,CAAuC,KAAvC,CACXxC,EAAA,CAAWA,CAAApJ,QAAA,CAAiB6L,EAAjB,CAAsC,QAAA,CAACP,CAAD,CAAItB,CAAJ,CAAO1I,CAAP,CAAa,CACvDkK,CAAL,GACMM,CAGJ,CAHWC,EAAA,CAAgCzK,CAAhC,CAAmC0I,CAAnC,CAAsChB,CAAtC,CAA6CwB,CAA7C,CAGX,CAFAgB,CAEA,CAFOA,CAEP,EAFeM,CAAAN,KAEf,CADAxB,CACA,CADI8B,CAAAE,EACJ,CAAA1K,CAAA,CAAIwK,CAAA3D,MAJN,CAMA,OAAO6B,EAAP,CAAW1I,CAPiD,CAAnD,CASPmK,EAAJ,GACErC,CADF,CACagC,EAAA,CAAqBhC,CAArB,CADb,CAGA,OAAOA,EAtB6C,CAyBtD2C;QAAA,GAA0B,CAAC3C,CAAD,CAAW4C,CAAX,CAAuBhD,CAAvB,CAA8BwB,CAA9B,CAAyC,CAEjE,IAAIyB,EAAe7C,CAAA7H,QAAA,CAAiB2K,EAAjB,CACW,EAA9B,EAAI9C,CAAA7H,QAAA,CAAiBqK,CAAjB,CAAJ,CACExC,CADF,CACa+C,EAAA,CAA4B/C,CAA5B,CAAsCoB,CAAtC,CADb,CAG4B,CAH5B,GAGWyB,CAHX,GAIE7C,CAJF,CAIaJ,CAAA,CAAQoD,EAAA,CAA8BhD,CAA9B,CAAwCJ,CAAxC,CAAR,CACTI,CALJ,CASIiD,EAAAA,CAAU,CAAA,CACM,EAApB,EAAIJ,CAAJ,GACED,CACA,CADa,EACb,CAAAK,CAAA,CAAU,CAAA,CAFZ,CAMA,IAAIA,CAAJ,CAAa,CACX,IAAAb,EAAO,CAAA,CACHa,EAAJ,GAEEjD,CAFF,CAEaA,CAAApJ,QAAA,CAAiBsM,EAAjB,CAAgC,QAAA,CAAChB,CAAD,CAAIiB,CAAJ,CAAc,CAAA,MAAA,KAAA,CAAMA,CAAN,CAA9C,CAFb,CAFW,CAObnD,CAAA,CAAWA,CAAApJ,QAAA,CAAiBwM,EAAjB,CAA4B,QAAA,CAAClB,CAAD,CAAImB,CAAJ,CAAYC,CAAZ,CACrC,CAAA,MAAA,QAAA,CAASA,CAAT,CAAY,KAAZ,CAAkBD,CAAlB,CAAwB,IAAxB,CAA6BA,CAA7B,CAAmC,QAAnC,CAA4CC,CAA5C,CAA+C,IAA/C,CADS,CAEX,OAAO,CAACvE,MAAOiB,CAAR,CAAkB4C,EAAAA,CAAlB,CAA8BR,KAAAA,CAA9B,CA5B0D,CA+BnEY,QAAA,GAAwB,CAAChD,CAAD,CAAWJ,CAAX,CAAkB,CACpCiC,CAAAA,CAAK7B,CAAAtH,MAAA,CAAe6K,EAAf,CACT1B,EAAA,CAAG,CAAH,CAAA,EAASjC,CACT,OAAOiC,EAAAE,KAAA,CAAQwB,EAAR,CAHiC;AAO1CR,QAAA,GAAsB,CAAC/C,CAAD,CAAWoB,CAAX,CAAsB,CAC1C,IAAIc,EAAIlC,CAAAzH,MAAA,CAAeiL,EAAf,CAER,OAAA,CADIL,CACJ,CADYjB,CACZ,EADiBA,CAAA,CAAE,CAAF,CAAArK,KAAA,EACjB,EADgC,EAChC,EACOsL,CAAA,CAAM,CAAN,CAAA5K,MAAA,CAAekL,EAAf,CAAL,CAcSzD,CAAApJ,QAAA,CAAiB4M,EAAjB,CAA6B,QAAQ,CAACtB,CAAD,CAAIwB,CAAJ,CAAUP,CAAV,CAAiB,CAC3D,MAAO/B,EAAP,CAAmB+B,CADwC,CAAtD,CAdT,CAEqBA,CAAAzK,MAAA,CAAY+K,EAAZ,CAAAE,CAAoC,CAApCA,CAEnB,GAAqBvC,CAArB,CACS+B,CADT,CAKSS,EAVb,CAyBS5D,CAAApJ,QAAA,CAAiB4L,CAAjB,CAAuBpB,CAAvB,CA5BiC,CA6C5CyC,QAAA,GAAqB,CAAChH,CAAD,CAAO,CACtBA,CAAA,SAAJ,GAAyBiH,EAAzB,GACEjH,CAAA,SADF,CACqB,MADrB,CAD0B,CAS5B,CAAA,UAAA,EAAA,CAAAkH,QAA0B,CAAC/D,CAAD,CAAW,CACnC,MAAOA,EAAAzH,MAAA,CAAeuK,EAAf,CAAA,CACL,IAAAnB,EAAA,CAA+B3B,CAA/B,CAAyCgE,EAAzC,CADK,CAELhB,EAAA,CAA8BhD,CAAAnI,KAAA,EAA9B,CAA+CmM,EAA/C,CAHiC,CAxSvCC,GAAA,OAAA,iBAAA,CAAA,CAAA,UAAA,CAAA,CAAA,EACM,CAAA,aAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,IAAavD,QAAA,EAAA,CACf,MAJeA,aAGA,CAAb,CADN,CAAA,CA+SA;IAAIuB,EAAM,yBAAV,CACI+B,GAAqB,oBADzB,CAEIlC,GAAuB,GAF3B,CAGIW,GAAsB,wCAH1B,CAIIgB,GAAyB,SAJ7B,CAKIjB,EAAO,OALX,CAMIsB,GAAO,OANX,CAOIhB,GAAU,WAPd,CAQIP,GAAgB,IAAI2B,MAAJ,CAAW,IAAX,CAAgBpB,EAAhB,CAAuB,GAAvB,CARpB,CAYIU,GAAa,0CAZjB,CAcIN,GAAgB,gDAdpB,CAeIE,GAAY,2BAfhB,CAgBI9B,GAAmB,GAhBvB,CAiBIiC,GAAgB,GAjBpB,CAkBI1C,GAAQ,OAlBZ,CAmBI+C,GAAoB,kBAnBxB,CAqBA9D,EAAe,IAAIJ,C,CC1VAyE,QAAA,GAAQ,EAAG;AAgC9BC,QAASA,GAAO,CAACC,CAAD,CAAO,CACrB,IAAK,IAAIC,EAAE,CAAX,CAAcA,CAAd,CAAkBD,CAAApN,OAAlB,CAA+BqN,CAAA,EAA/B,CAAoC,CAClC,IAAIC,EAAMF,CAAA,CAAKC,CAAL,CACV,IAAIC,CAAAhH,OAAJ,GAAmBE,QAAA+G,gBAAnB,EACED,CAAAhH,OADF,GACiBE,QAAAK,KADjB,CAIA,IAAK,IAAI3G,EAAE,CAAX,CAAcA,CAAd,CAAkBoN,CAAAE,WAAAxN,OAAlB,CAAyCE,CAAA,EAAzC,CAA8C,CAC5C,IAAID,EAAIqN,CAAAE,WAAA,CAAetN,CAAf,CACR,IAAID,CAAA+I,SAAJ,GAAmB7B,IAAA8B,aAAnB,CAAA,CAIA,IAAIlJ,EAAOE,CAAAwN,YAAA,EACwBxN,KAAAA,EAAAA,CAvCvC,KAAIyN,EAAU,EACVzF,EAAAsB,UAAJ,CACEmE,CADF,CACYC,KAAAC,KAAA,CAAW3F,CAAAsB,UAAX,CADZ,CAEWtB,CAFX,WAE8BhE,OAAA,WAF9B,EAEsDgE,CAAA4F,aAAA,CAAqB,OAArB,CAFtD,GAGEH,CAHF,CAGYzF,CAAAM,aAAA,CAAqB,OAArB,CAAA9G,MAAA,CAAoC,KAApC,CAHZ,CAKA,EAAA,CAAOiM,CASHI,EAAAA,CAAMJ,CAAAxM,QAAA,CDoUG2H,CCpUaY,EAAhB,CA0BN,KAzBJ,CAyBI,CAzBO,EAAX,CAAIqE,CAAJ,CACSJ,CAAA,CAAQI,CAAR,CAAc,CAAd,CADT,CAGO,EAsBH,GAAoB/N,CAApB,GAA6BE,CAAA8N,cAA7B,CACErF,CAAA,CAAqBzI,CAArB,CAAwB+N,CAAxB,CAAsC,CAAA,CAAtC,CADF,KAEO,IAAIjO,CAAAiJ,SAAJ,GAAsB7B,IAAA8G,uBAAtB,GAEDxB,CAFC;AAEgC1M,CAAD0M,KAF/B,EAQL,GADAyB,CACI,CFiLI/F,CElLG,CAAasE,CAAb,CAAAnE,GACP,CAAA0F,CAAA,GAAiBE,CAArB,CAIE,IAFIC,CAEKC,CAFMnK,MAAA,SAAA,cAAA,iBAAAiE,KAAA,CACbjI,CADa,CACV,QADU,CD8RV4I,CC7RSY,EADC,CAC0B,GAD1B,CAEN2E,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CAAoBD,CAAAnO,OAApB,CAAqCoO,CAAA,EAArC,CACEnG,EAAA,CAAyBkG,CAAA,CAASC,CAAT,CAAzB,CAAsCJ,CAAtC,CALJ,KASIA,EAGJ,EAFEtF,CAAA,CAAqBzI,CAArB,CAAwB+N,CAAxB,CAAsC,CAAA,CAAtC,CAEF,CAAAtF,CAAA,CAAqBzI,CAArB,CAAwBiO,CAAxB,CA7BF,CAF4C,CANZ,CADf;AA4CvB,GAAI,CLhFSlK,CKgFb,CAAmB,CACjB,IAAIqK,GAAW,IAAIC,gBAAJ,CAAqBnB,EAArB,CAAf,CACI5F,GAAQA,QAAA,CAAC9G,CAAD,CAAU,CACpB4N,EAAAE,QAAA,CAAiB9N,CAAjB,CAAuB,CAAC+N,UAAW,CAAA,CAAZ,CAAkBC,QAAS,CAAA,CAA3B,CAAvB,CADoB,CAStB,IAN4BxK,MAAA,eAM5B,EALE,CAACA,MAAA,eAAA,0BAKH,CACEsD,EAAA,CAAMf,QAAN,CADF,KAEO,CACL,IAAIkI,GAAeA,QAAA,EAAM,CACvBnH,EAAA,CAAMf,QAAAmI,KAAN,CADuB,CAIrB1K,OAAA,YAAJ,CACEA,MAAA,YAAA,UAAA,CAAmCyK,EAAnC,CADF,CAKEE,qBAAA,CAAsB,QAAQ,EAAG,CAC/B,GAA4B,SAA5B,GAAIpI,QAAAqI,WAAJ,CAAuC,CACrC,IAAIC,EAAWA,QAAQ,EAAG,CACxBJ,EAAA,EACAlI,SAAAuI,oBAAA,CAA6B,kBAA7B,CAAiDD,CAAjD,CAFwB,CAI1BtI,SAAAwI,iBAAA,CAA0B,kBAA1B,CAA8CF,CAA9C,CALqC,CAAvC,IAOEJ,GAAA,EAR6B,CAAjC,CAVG,CAwBPxB,EAAA,CAAQA,QAAQ,EAAG,CACjBC,EAAA,CAAQkB,EAAAY,YAAA,EAAR,CADiB,CArCF;AA5ER/B,IAAAgC,GAAAhC,E,CC8BT3N,QA7BmB4P,EA6BR,CAACC,CAAD,CAAMC,CAAN,CAAmBC,CAAnB,CAA0C5L,CAA1C,CAAuD2E,CAAvD,CAAgF,CAEzF,IAAA0B,EAAA,CAAkBqF,CAAlB,EAAyB,IAEzB,KAAAC,EAAA,CAAmBA,CAAnB,EAAkC,IAElC,KAAAC,EAAA,CAA6BA,CAA7B,EAAsD,EAEtD,KAAAC,EAAA,CAA+B,IAM/B,KAAAlH,EAAA,CAAqBA,CAArB,EAAsC,EAMtC,KAAAmH,EAAA,CAFA,IAAAC,EAEA,CAJA,IAAAC,EAIA,CAJuB,IAhBkE,CAxB3FC,QAAO,EAAG,CAAClP,CAAD,CAAO,CACf,MAAIA,EAAJ,CACSA,CAAA,YADT,CAGS,IAJM,CAYjBmP,QAAO,GAAG,CAACnP,CAAD,CAAOoP,CAAP,CAAkB,CAE1B,MADApP,EAAA,YACA,CADgBoP,CADU,CAkC5B,CAAA,UAAA,EAAA,CAAAC,QAAc,EAAG,CACf,MAAO,KAAA/F,EADQ,CAKnBoF,EAAAY,UAAA,eAAA,CAAwCZ,CAAAY,UAAAD,E,CChDhBE,QAAA,GAAQ,CAACjH,CAAD,CAAW,CACzC,IAAMkH,EAAS,IAAA9J,QAAT8J,EAAyB,IAAAD,gBAAzBC,EACJ,IAAAC,mBADID,EACuB,IAAAE,kBADvBF,EAEJ,IAAAG,iBAFIH,EAEqB,IAAAI,sBAC3B,OAAOJ,EAAP,EAAiBA,CAAA/H,KAAA,CAAY,IAAZ,CAAkBa,CAAlB,CAJwB,CAO3C,IAAMuH,GAAQjM,SAAAC,UAAAhD,MAAA,CAA0B,SAA1B,CAId,SAAMiP,GAAN,EAAA,EAUEC,QAAA,GAAc,CAACnO,CAAD,CAAQ,CAAA,IACHoO,EAAQ,EADL,CACSC,EAAY,EADrB,CACyBC,EAAY,CJiB7CpL,EIhBZ,CAAsBlD,CAAtB,CAA6B,QAAQ,CAACuD,CAAD,CAAO,CAC1CgL,CAAA,CAAkBhL,CAAlB,CAEAA,EAAAiL,MAAA,CAAaF,CAAA,EACmBvO,EAAAA,CAAAwD,CAAAkL,EAAA1O,QAwElC,KADA,IAAI6I,CACJ,CAAQA,CAAR,CNhHSlG,EMgHGgM,KAAA,CAAqB3O,CAArB,CAAZ,CAAA,CAA4C,CAC1C,IAAI4O,EAAO/F,CAAA,CAAE,CAAF,CAGE,IAAb,GAAIA,CAAA,CAAE,CAAF,CAAJ,GA5E2DwF,CA6EzD,CAAMO,CAAN,CADF,CACgB,CAAA,CADhB,CAJ0C,CA5EA,CAA5C,CAKGC,QAAwB,CAACrL,CAAD,CAAO,CAChC8K,CAAAnQ,KAAA,CAAeqF,CAAf,CADgC,CALlC,CASAvD,EAAA6O,EAAA,CAAmBR,CAEfS,EAAAA,CAAQ,EACZ,KAAKjR,IAAIA,CAAT,GAAcuQ,EAAd,CACEU,CAAA5Q,KAAA,CAAWL,CAAX,CAEF,OAAOiR,EAjBa;AAqBtBP,QAAA,EAAY,CAAChL,CAAD,CAAO,CACjB,GAAIkL,CAAAlL,CAAAkL,EAAJ,CAAA,CADiB,IAIbrF,EAAO,EAJM,CAIF2F,EAAa,EACRC,EAAAC,CAAuB1L,CAAvB0L,CAA6BF,CAA7BE,CACpB,GACE7F,CAAA2F,EAEA,CAFkBA,CAElB,CAAAxL,CAAA,MAAA,CAAgB,IAHlB,CAKA6F,EAAArJ,QAAA,CAAmCwD,CAkCCxD,cAM7BzC,QAAA,CNtGEuF,EMsGF,CAA8B,EAA9B,CAAAvF,QAAA,CN5GEkF,CM4GF,CACmB,EADnB,CAvCPe,EAAAkL,EAAA,CAAoBrF,CAXpB,CADiB,CAiBnB4F,QAAA,EAAiB,CAACzL,CAAD,CAAOwL,CAAP,CAAmB,CAClC,IAAI3F,EAAO7F,CAAAkL,EACX,IAAIrF,CAAJ,CACE,IAAIA,CAAA2F,EAAJ,CAEE,MADAG,OAAAC,OAAA,CAAcJ,CAAd,CAA0B3F,CAAA2F,EAA1B,CACO,CAAA,CAAA,CAFT,CADF,IAKO,CAEDhP,CAAAA,CAAUwD,CAAA,cAGd,KAFA,IAAIkC,CAEJ,CAAQmD,CAAR,CNtFOpG,CMsFKkM,KAAA,CAAQ3O,CAAR,CAAZ,CAAA,CAA+B,CAE7B0F,CAAA,CAAQlH,CAACqK,CAAA,CAAE,CAAF,CAADrK,EAASqK,CAAA,CAAE,CAAF,CAATrK,MAAA,EAER,IAAc,SAAd,GAAIkH,CAAJ,EAAqC,OAArC,GAA2BA,CAA3B,CACEsJ,CAAA,CAAWnG,CAAA,CAAE,CAAF,CAAArK,KAAA,EAAX,CAAA,CAA0BkH,CAE5B2J,EAAA,CAAM,CAAA,CAPuB,CAS/B,MAAOA,EAdF,CAP2B;AAoEpCC,QAAA,EAAgB,CAAhBA,CAAgB,CAACC,CAAD,CAAWlB,CAAX,CAAkB,CAG5BkB,CAAJ,GAEIA,CAFJ,CAC8B,CAA5B,EAAIA,CAAAzQ,QAAA,CAAiB,GAAjB,CAAJ,CACa0Q,EAAA,CAAAA,CAAA,CAAwBD,CAAxB,CAAkClB,CAAlC,CADb,CJqDUpJ,EI9BG,CAAqCsK,CAArC,CAlBFE,QAAQ,CAAClK,CAAD,CAASG,CAAT,CAAgBC,CAAhB,CAA0BH,CAA1B,CAAkC,CACjD,GAAI,CAACE,CAAL,CACE,MAAOH,EAAP,CAAgBC,CAIlB,EAFIkK,CAEJ,CAFoBJ,CAAA,CALXjH,CAKW,CAAsBgG,CAAA,CAAM3I,CAAN,CAAtB,CAAoC2I,CAApC,CAEpB,GAAwC,SAAxC,GAAsBqB,CAAtB,CAI6B,oBAJ7B,GAIWA,CAJX,GAQEA,CARF,CAQkB,SARlB,EAEEA,CAFF,CAEkBJ,CAAA,CATTjH,CASS,CAAsBgG,CAAA,CAAM1I,CAAN,CAAtB,EAAyCA,CAAzC,CAAmD0I,CAAnD,CAFlB,EAGE1I,CAOF,OAAOJ,EAAP,EAAiBmK,CAAjB,EAAkC,EAAlC,EAAwClK,CAhBS,CAkBxC,CAxBf,CA2BA,OAAO+J,EAAP,EAAmBA,CAAA/Q,KAAA,EAAnB,EAAsC,EA9BN;AAkClCgR,QAAA,GAAkB,CAAlBA,CAAkB,CAACD,CAAD,CAAWlB,CAAX,CAAkB,CAC9BsB,CAAAA,CAAQJ,CAAAlQ,MAAA,CAAe,GAAf,CACZ,KAFkC,IAEzBvB,EAAE,CAFuB,CAEpBG,CAFoB,CAEjB4K,CAAjB,CAAoB/K,CAApB,CAAsB6R,CAAA/R,OAAtB,CAAoCE,CAAA,EAApC,CACE,GAAKG,CAAL,CAAS0R,CAAA,CAAM7R,CAAN,CAAT,CAAoB,CNlLb4E,CMmLLkN,UAAA,CAA2B,CAE3B,IADA/G,CACA,CNrLKnG,CMoLDiM,KAAA,CAAoB1Q,CAApB,CACJ,CACEA,CAAA,CAAIqR,CAAA,CAAAA,CAAA,CAAsBjB,CAAA,CAAMxF,CAAA,CAAE,CAAF,CAAN,CAAtB,CAAmCwF,CAAnC,CADN,KAIE,IADIwB,CACA,CADQ5R,CAAAa,QAAA,CAAU,GAAV,CACR,CAAW,EAAX,GAAA+Q,CAAJ,CAAkB,CAChB,IAAIC,EAAK7R,CAAAM,UAAA,CAAYsR,CAAZ,CACTC,EAAA,CAAKA,CAAAtR,KAAA,EACLsR,EAAA,CAAKR,CAAA,CAAAA,CAAA,CAAsBQ,CAAtB,CAA0BzB,CAA1B,CAAL,EAAyCyB,CACzC7R,EAAA,CAAIA,CAAAM,UAAA,CAAY,CAAZ,CAAesR,CAAf,CAAJ,CAA4BC,CAJZ,CAOpBH,CAAA,CAAM7R,CAAN,CAAA,CAAYG,CAAD,EAAMA,CAAAW,YAAA,CAAc,GAAd,CAAN,GAA6BX,CAAAL,OAA7B,CAAwC,CAAxC,CAETK,CAAA8R,MAAA,CAAQ,CAAR,CAAY,EAAZ,CAFS,CAGT9R,CAHS,EAGJ,EAjBW,CAoBtB,MAAO0R,EAAAjH,KAAA,CAAW,GAAX,CAvB2B;AAoFpCsH,QAAA,GAAsB,CAAC/P,CAAD,CAAQ4F,CAAR,CAAiB,CAAA,IACjCwI,EAAQ,EADyB,CAGjC4B,EAAI,EJjNI9M,EImNZ,CAAsBlD,CAAtB,CAA6B,QAAQ,CAACuD,CAAD,CAAO,CAGrCA,CAAAkL,EAAL,EACEF,CAAA,CAAkBhL,CAAlB,CAKF,KAAI0M,EAAkB1M,CAAA2E,EAAlB+H,EAA8C1M,CAAA,eAC9CqC,EAAJ,EAAerC,CAAAkL,EAAAM,EAAf,EAA+CkB,CAA/C,EACMtC,EAAA9H,KAAA,CAAqBD,CAArB,CAA8BqK,CAA9B,CADN,GAEIjB,CAAA,CAAuBzL,CAAvB,CAA6B6K,CAA7B,CAiUR,CA/TqBI,CA+TrB,CA/TqBjL,CAAAiL,MA+TrB,CAFIwB,CAEJ,CAFQE,QAAA,CAAStS,CAAT,CAAa,EAAb,CAAiB,EAAjB,CAER,CA/TiCoS,CA+TjC,CAAKA,CAAL,CAAA,EA/TiCA,CA+TtB,CAAKA,CAAL,CAAX,EAAsB,CAAtB,EADQ,CACR,EADcpS,CACd,CADkB,EAlUd,CAV0C,CAA5C,CAiBG,IAjBH,CAiBS,CAAA,CAjBT,CAkBA,OAAO,CAACmR,EAAYX,CAAb,CAAoB+B,IAAKH,CAAzB,CAvB8B;AAgCvCI,QAAA,GAAkB,CAAlBA,CAAkB,CAAC9J,CAAD,CAAQ/C,CAAR,CAAc8M,CAAd,CAAwBpN,CAAxB,CAAkC,CAC7CM,CAAAkL,EAAL,EACEF,CAAA,CAAkBhL,CAAlB,CAEF,IAAKA,CAAAkL,EAAAM,EAAL,CAAA,CAGI,CAAA,CJ1DQjJ,CI0Dc,CAAuBQ,CAAvB,CAArB,EAAA,CAAA,CAAA,GAAI,EAAA,CAAA,CAAA,EACLwB,EAAAA,CAAY7B,CAAA,CACd8B,CAAA,CAAgC9B,CAAhC,CAAoCD,CAApC,CADc,CAEd,MACF,KAAIsK,EAAiB/M,CAAA,eAArB,CACIgN,EAA6B,WAA7BA,GAAUD,CAAVC,EAA+D,MAA/DA,GAA4CD,CADhD,CAEIE,EAA6C,CAA7CA,GAASF,CAAAzR,QAAA,CAAuB,OAAvB,CAAT2R,EAAkD,CAACD,CAItC,QAAjB,GAAIF,CAAJ,GAEEE,CAEA,CAFSD,CAET,GAF6BxI,CAE7B,CAFyC,OAEzC,CAFmDA,CAEnD,EAFqG,EAErG,GAFiEwI,CAAAzR,QAAA,CAAuB,MAAvB,CAEjE,CAAA2R,CAAA,CAAS,CAACD,CAAV,EAA0D,CAA1D,GAAoBD,CAAAzR,QAAA,CAAuBiJ,CAAvB,CAJtB,CAMiB,SAAjB,GAAIuI,CAAJ,GACEE,CACA,CAD4B,WAC5B,GADSD,CACT,EAD8D,MAC9D,GAD2CA,CAC3C,CAAAE,CAAA,CAASA,CAAT,EAAmB,CAACD,CAFtB,CAIA,IAAKA,CAAL,EAAgBC,CAAhB,CAGIP,CAeJ,CAfsBnI,CAetB,CAdI0I,CAcJ,GAZOjN,CAAA2E,EAUL,GARE3E,CAAA2E,EAQF,CAPEC,CAAA,CHwBO3B,CGxBP,CACEjD,CADF,CHwBOiD,CGtBL6B,EAFF,CAGqCpC,CHjMzC,CACS+B,EADT,CGiMyC/B,CHjMzC,CAGS,EG2LL,CAIE6B,CAJF,CAOF,EAAAmI,CAAA,CAAkB1M,CAAA2E,EAAlB,EAA8CJ,CAEhD,EAAA7E,CAAA,CAAS,CACPyD,EAAUuJ,CADH,CAEPO,EAAQA,CAFD,CAGPD,EAAQA,CAHD,CAAT,CAzCA,CAJkD;AAwDpDE,QAAA,GAA6B,CAACnK,CAAD,CAAQtG,CAAR,CAAe,CAAA,IACtC0Q,EAAY,EAD0B,CACtBC,EAAY,EADU,CACNvI,EA4PzB5B,CA7P+B,CAGtC6J,EAAWrQ,CAAXqQ,EAAoBrQ,CAAA,WJzSZkD,EI0SZ,CAAsBlD,CAAtB,CAA6B,QAAQ,CAACuD,CAAD,CAAO,CAE1C6M,EAAA,CAAAhI,CAAA,CAAwB9B,CAAxB,CAA+B/C,CAA/B,CAAqC8M,CAArC,CAA+C,QAAQ,CAACjH,CAAD,CAAO,CAExDuE,EAAA9H,KAAA,CADUS,CAAAsK,EACV,EAD4BtK,CAC5B,CAA8B8C,CAAA1C,EAA9B,CAAJ,GACM0C,CAAAoH,EAAJ,CACExB,CAAA,CAAuBzL,CAAvB,CAA6BmN,CAA7B,CADF,CAGE1B,CAAA,CAAuBzL,CAAvB,CAA6BoN,CAA7B,CAJJ,CAF4D,CAA9D,CAF0C,CAA5C,CAYG,IAZH,CAYS,CAAA,CAZT,CAaA,OAAO,CAACA,EAAWA,CAAZ,CAAuBD,EAAWA,CAAlC,CAjBmC;AAyB5CG,QAAA,GAAe,CAAfA,CAAe,CAACjL,CAAD,CAAUmJ,CAAV,CAAsB3B,CAAtB,CAAqC,CAE9C,IAAA,EJtIQtH,CIsIc,CAAuBF,CAAvB,CAAtB,CACAkL,EAAe/I,CAAA,CADd,CAAA9B,GACc,CADV,CAAAD,EACU,CADf,CAMA+K,EAAS,IAAInG,MAAJ,CNtXUoG,eMsXV,EAHQpL,CAAAO,QAAA8K,CACnB,IADmBA,CACZH,CAAAhB,MAAA,CAAmB,CAAnB,CAAuB,EAAvB,CADYmB,CACgB,KADhBA,CAEnBH,CACW,ENrXUI,iBMqXV,CAETlR,EAAAA,CAAQmR,CAAA,CAAcvL,CAAd,CAAA8B,EACZ,KAAI0J,EACFC,EAAA,CAAyCrR,CAAzC,CAAgDoN,CAAhD,CACF,OAAO3F,EAAA,CAA+B7B,CAA/B,CAAwC5F,CAAxC,CAA+C,QAAQ,CAACuD,CAAD,CAAO,CAvLrE,IAAI+N,EAAS,EAwLU/N,EAtLlBkL,EAAL,EACEF,CAAA,CAqLqBhL,CArLrB,CAqLqBA,EAnLnBkL,EAAA1O,QAAJ,GACEuR,CADF,CACW/B,EAAA,CAqKAnH,CArKA,CAkLY7E,CAlLYkL,EAAA1O,QAAxB,CAkLkBgP,CAlLlB,CADX,CAmLuBxL,EAhLvB,QAAA,CAAkB+N,CAiLhB,IAAI,CPlYG3P,COkYP,EACI,CJ1VM2B,EI0VL,CAA8BC,CAA9B,CADL,EAEIA,CAAA,QAFJ,CAEqB,CA3KvB,IAAI+N,EADAC,CACAD,CA8K6B/N,CA/KrB,QAEc,KAA1B,EA6KiCA,CA7K7BiO,EAAJ,GA6KiCjO,CA3K/BiO,EAFF,CNzNS7O,EM2NcqG,KAAA,CAAwBuI,CAAxB,CAFvB,CAKA,IAwKiChO,CAxK7BiO,EAAJ,CAIE,GAAqC,IAArC,EAoK+BjO,CApK3BkO,EAAJ,CAA2C,CAoKZlO,CAnK7BkO,EAAA,CAAgC,EAChC,KAAKC,IAAIA,CAAT,GAkKmCN,EAlKnC,CACEO,CAIA,CA6JiCP,CAjKrB,CAAmBM,CAAnB,CAIZ,CAHAJ,CAGA,CAHSK,CAAA,CAAUJ,CAAV,CAGT,CAAIA,CAAJ,GAAcD,CAAd,GACEC,CACA,CADQD,CACR,CA2JyB/N,CA3JzBkO,EAAAvT,KAAA,CAAmCwT,CAAnC,CAFF,CAPuC,CAA3C,IAYO,CAGL,IAAS7T,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAqJ6B0F,CArJTkO,EAAA9T,OAApB,CAA0D,EAAEE,CAA5D,CACE8T,CACA,CAmJiCP,CApJrB,CAoJe7N,CApJIkO,EAAA,CAA8B5T,CAA9B,CAAnB,CACZ,CAAA0T,CAAA,CAAQI,CAAA,CAAUJ,CAAV,CAEVD,EAAA,CAASC,CAPJ,CAwJwBhO,CA9IjC,QAAA,CAAkB+N,CA+IM/N,EA4ExB2E,EAAA,CA5EwB3E,CA4EG2E,EAA3B,EA5EwB3E,CA4E+B,SAEnD+C,EAAAA,CAAQ,GAARA,CA9EgD8G,CA+EhDsC,EAAAA,CA/EoBnM,CA6ET2E,EAEH9I,MAAA,CAAe,GAAf,CACHvB;CAAAA,CAAE,CAAX,KALkD,IAKpCC,GAAE4R,CAAA/R,OALkC,CAKpBK,CAA9B,CAAkCH,CAAlC,CAAoCC,EAApC,GAA2CE,CAA3C,CAA6C0R,CAAA,CAAM7R,CAAN,CAA7C,EAAwDA,CAAA,EAAxD,CACE6R,CAAA,CAAM7R,CAAN,CAAA,CAAWG,CAAAiB,MAAA,CAjFiB8R,CAiFjB,CAAA,CACT/S,CAAAV,QAAA,CAlFkCwT,CAkFlC,CAAwBxK,CAAxB,CADS,CAETA,CAFS,CAED,GAFC,CAEKtI,CAnFMuF,EAqFxB,SAAA,CAAmBmM,CAAAjH,KAAA,CAAW,GAAX,CAzFI,CAJ8C,CAA9D,CAb2C,CAgCpD4I,QAAA,GAA0B,CAAUrR,CAAV,CAAiBoN,CAAjB,CAAgC,CACpDwE,CAAAA,CAAiB5R,CAAA6O,EACrB,KAAIuC,EAAqB,EACzB,IAAI,CPtZKzP,COsZT,EAAqBiQ,CAArB,CAIE,IAJmC,IAI1B/T,EAAI,CAJsB,CAInBkD,EAAgB6Q,CAAA,CAAe/T,CAAf,CAAhC,CACKA,CADL,CACS+T,CAAAjU,OADT,CAEKoD,CAFL,CAEqB6Q,CAAA,CAAe,EAAE/T,CAAjB,CAFrB,CAE0C,CACnBkD,IAAAA,EAAAA,CAAAA,CAAeqM,EAAAA,CAiCxC7J,EAAAsO,EAAA,CAAuB,IAAIjH,MAAJ,CAAW,KAAX,CAAiBrH,CAAA,cAAjB,CAAsC,WAAtC,CAAmD,GAAnD,CACvBA,EAAAuO,EAAA,CAAgCvO,CAAA,cAAhC,CAAwD,GAAxD,CAA8DwO,CAC9DxO,EAAA2E,EAAA,CAA2B3E,CAAA2E,EAA3B,EAAuD3E,CAAA,SACvDA,EAAA,SAAA,CAAmBA,CAAA2E,EAAA5K,QAAA,CACfiG,CAAA,cADe,CACQA,CAAAuO,EADR,CAnCfV,EAAA,CAAmBrQ,CAAA,cAAnB,CAAA,CACIiR,EAAA,CAA+BjR,CAA/B,CAHoC,CAM5C,MAAOqQ,EAfiD,CAwB1DY,QAAA,GAAyB,CAACjR,CAAD,CAAgB,CACvC,MAAO,SAAQ,CAAChB,CAAD,CAAU,CACvB,MAAOA,EAAAzC,QAAA,CACHyD,CAAA8Q,EADG,CAEH9Q,CAAA+Q,EAFG,CADgB,CADc;AA4IzCG,QAAA,GAAgB,CAAC7O,CAAD,CAAQ2L,CAAR,CAAoB,CAgCvBvI,IAAAA,EAAAA,CAAAA,CA/BPxG,EJ7hBQmD,CI6hBA,CAAwDC,CAAxD,CAEZA,EAAAC,YAAA,CJhjBYL,CIgjBQ,CAAoBhD,CAApB,CAA2B,QAAQ,CAAiBuD,CAAjB,CAAuB,CAC5E,IAAIqE,EAAMrE,CAAA,QAANqE,CAAwBrE,CAAA,cACxBA,EAAAkL,EAAJ,EAAyBlL,CAAAkL,EAAA1O,QAAzB,GASE6H,CAEA,CAFuDA,CTlXtDtK,QAAA,CACI2C,EADJ,CACmB,EADnB,CAAA3C,QAAA,CAEI4C,EAFJ,CAEkB,EAFlB,CSoXD,CAAAqD,CAAA,QAAA,CAAkBgM,EAAA,CAdXnH,CAcW,CAAwBR,CAAxB,CAA6BmH,CAA7B,CAXpB,CAF4E,CAA1D,CAHc,CA/hBtCpE,EAAA,OAAA,iBAAA,CAAA,EAAA,UAAA,CAAA,CAAA,EACM,CAAA,aAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,IAAcuH,QAAA,EAAA,CAChB,MAJgBA,SAGA,CAAd,CADN,CAAA,CA+jBA,KAAA1L,EAAe,IAAI0H,E,CCnlBnB,IAAIiE,GAAiB,EAArB,CAKMC,EAAKxQ,MAAA,eACX,IAAIwQ,CAAJ,EAAU,CRVGzQ,CQUb,CAAyB,CAIvB,IAAM0Q,GAAaD,CAAA,OAUnBA,EAAA,OAAA,CAJsBE,QAAA,CAAC3D,CAAD,CAAO4D,CAAP,CAAcC,CAAd,CAA0B,CLyGhD,IAAIC,EAActO,QAAAuO,cAAA,CAAuB,wBAAvB,CKxG6B/D,CLwG7B,CACN,GADM,CAAlB,CAIIrI,EAAQnC,QAAAK,KACZ8B,EAAA7B,aAAA,CAAmBgO,CAAnB,EAHYlO,CAAAoO,CACVpO,CAAA,YADUoO,CACyB,IAErC,GAAyCrM,CAAA3B,WAAzC,CACAJ,EAAA,CAAoBkO,CK9GlBN,GAAA,CAAexD,CAAf,CAAA,CL+GK8D,CK9GLJ,GAAAxM,KAAA,CAAsDuM,CAAtD,CAA2DzD,CAA3D,CAAiE4D,CAAjE,CAAwEC,CAAxE,CAF8C,CAVzB,C,CCOzB,IAAMI,EAAa,ICjBjB1V,QAAW,EAAgB,CAEzB,IAAA2V,MAAA,CAAa,EACb,KAAAC,EAAA,CAHoBA,GAAK,CDoB3B5V,SADmB6V,EACR,EAAG,CACZ,IAAAC,EAAA,CAAqB,EACrB,KAAAC,EAAA,CAAsB9O,QAAA+G,gBACtB,KAAI6B,EAAM,IXYN5P,CWXJ4P,EAAA,MAAA,CAAe,EACf,KAAAmG,EAAA,CAA+BC,EAAA,CAAc,IAAAF,EAAd,CAAmC,IHpBvDnG,CGoBuD,CAAcC,CAAd,CAAnC,CAC/B,KAAAqG,EAAA,CAA4B,CAAA,CAG5B,KAAAC,EAAA,CAFA,IAAAC,EAEA,CAFkB,IAPN,CAWd,CAAA,CAjCF,CAAAC,UAiCEC,EAAAC,EAAA,CAAA5I,QAAK,EAAG,CACNgC,EAAA,EADM,CAOR2G,EAAAE,EAAA,CAAAA,QAAW,CAACtQ,CAAD,CAAQ,CACjB,MNZYD,EMYL,CAAwBC,CAAxB,CADU,CAGnBoQ,EAAAG,EAAA,CAAAA,QAAgB,CAAC5G,CAAD,CAAM,CACpB,MNhCY/J,EMgCL,CAAoB+J,CAApB,CADa,CAoBtByG;CAAAI,gBAAA,CAAAA,QAAe,CAACtS,CAAD,CAAWD,CAAX,CAAwB2E,CAAxB,CAAuC,CACpD,GAAI6N,CAAAvS,CAAAuS,EAAJ,CAAA,CAGAvS,CAAAuS,EAAA,CAAqB,CAAA,CACrBvS,EAAAqN,KAAA,CAAgBtN,CAChBC,EAAA6E,QAAA,CAAmBH,Cb/DR/I,EagEX,CAAYoE,CAAZ,CAAA,CAA2BC,CAnB3B,KAAA,EAAA,CADI8B,CACJ,CAoBiC9B,CArBrByF,QAAA+M,cAAA,CAA+B,OAA/B,CACZ,EAGO1Q,CAAA8C,aAAA,CAAmB,WAAnB,CAHP,EAG0C,EAH1C,CACS,ENwNL6N,KAAAA,EAAiB,EAEvB,KADA,IAAMC,EMrM6B1S,CAzBAyF,QN8NwBkN,iBAAA,CAAyB,OAAzB,CAA3D,CACSpW,EAAI,CAAb,CAAgBA,CAAhB,CAAoBmW,CAAArW,OAApB,CAAmCE,CAAA,EAAnC,CAAwC,CACtC,IAAMuF,EAAQ4Q,CAAA,CAAOnW,CAAP,CACd,IAAoBuF,CDpPfoI,aAAA,CAvBuB0I,gBAuBvB,CCoPL,CACE,IAAI,CH/QGvS,CG+QP,CAAmB,CDnQvB,IAAMtE,ECoQqB+F,CDpQdC,YACRP,GAAAqR,IAAA,CAAiB9W,CAAjB,CAAL,GACEyF,EAAAuE,IAAA,CAAiBhK,CAAjB,CAEA,CADM+W,CACN,CCgQyBhR,CDjQRiR,UAAA,CAAgB,CAAA,CAAhB,CACjB,CAAAlQ,QAAAK,KAAA8P,YAAA,CAA0BF,CAA1B,CAHF,CCoQMhR,EAAAmR,WAAAC,YAAA,CAA6BpR,CAA7B,CAFiB,CAAnB,CADF,IAME2Q,EAAA7V,KAAA,CAAoBkF,CAAAC,YAApB,CACA,CAAAD,CAAAmR,WAAAC,YAAA,CAA6BpR,CAA7B,CAToC,CAYxC,CAAA,CAAO2Q,CAAAtL,KAAA,CAAoB,EAApB,CAAAlK,KAAA,EMjND6K,EAAAA,CAAO,CACTnD,GAAI5E,CADK,CAET8E,QAASH,CAFA,CAGTyO,EAAYpE,CAHH,CTvEF1O;CS4ET,EACE0E,CAAA,CAAqB/E,CAAAyF,QAArB,CAAuC1F,CAAvC,CAGFqT,EAAA,CAAAA,IAAA,CEvCIP,EAAAA,CV1CK1R,CU0CCuG,KAAA,CFwCkBjJ,CExClB,CAANoU,EV3CK3R,CU2C8BwG,KAAA,CFwCXjJ,CExCW,CV1C9B0C,EU4CXkN,UAAA,CAAwB,CV7CbnN,EU8CXmN,UAAA,CAAuB,CFsCjB5C,EAAAA,CXxCQ3P,CWwCF,CAAM2C,CAAN,CErCLoU,EFuCL,ETlDS5R,CSkDT,EAAuC,IAAA+Q,EAAvC,EACE,IAAAA,EAAA,eAAA,CAAkCvG,CAAlC,CAAuC1L,CAAvC,CAEFC,EAAA,UAAA,CAAwByL,CACxBzL,EAAAqT,EAAA,CAAqBtE,CAEjBuE,EAAAA,CAAmB,ETxDdrS,ESyDT,GACEqS,CADF,CACqBzG,EAAA,CAA+B7M,CAAA,UAA/B,CADrB,CAGA,IAAI,CAACsT,CAAAjX,OAAL,ET5DS4E,CS4DT,CACa7E,CAGX,CTlGOiE,CS+FIjE,CAAe4D,CAAAyF,QAAfrJ,CAAkCA,IAG7C,CAFkBsP,CAElB,CDvESmF,ECqESnF,CAAe3L,CAAf2L,CAElB,CAKEjN,CALF,CAKY0H,CAAA,CAN0B2B,CAM1B,CANgC9H,CAAAtB,UAMhC,CALZ,CAOA,CAPA,CAMED,CAAApC,OAAJ,CNXYoG,CMYH,CAAmBhE,CAAnB,CAR+BqJ,CAQHnD,GAA5B,CAAqC4O,CAArC,CAAiD7H,CAAjD,CADT,CAFyD,IAAA,EAJvD,CAAA1L,CAAAwT,EAAA,CAAkB1R,CAEpB9B,EAAAyT,EAAA,CAA6BH,CAtC7B,CADoD,CA8EtDI;QAAA,GAA2B,CAA3BA,CAA2B,CAAG,CACxB3B,CAAA,CAAAA,EAAJ,EAEWzR,MAAAQ,SAFX,EAE8BR,MAAAQ,SAAA6S,qBAF9B,GAGE,CAAA5B,EAGA,CAH2EzR,MAAAQ,SAAA6S,qBAG3E,CADA,CAAA5B,EAAA,kBACA,CADkD,QAAA,CAACjQ,CAAD,CAAW,CANnC,CAMoC8R,EAAA,CAAqC9R,CAArC,CAAD,CAC7D,CAAA,CAAAiQ,EAAA,iBAAA,CAAiD,QAAA,EAAM,CACrD9G,qBAAA,CAAsB,QAAA,EAAM,CAC1B,CATsB,CASlB8G,EAAA,SAAJ,EATsB,CASwBD,EAA9C,GATsB,CAUpB+B,kBAAA,EAFwB,CAA5B,CADqD,CANzD,CAD4B,CAgB9BT,QAAA,EAAO,CAAPA,CAAO,CAAG,CAvBJpB,CAwBJ8B,CAxBI9B,EAAJ,EAEW1R,MAAAQ,SAFX,EAE8BR,MAAAQ,SAAAiT,UAF9B,GAwBAD,CArBE9B,EACA,CADkB1R,MAAAQ,SAAAiT,UAClB,CAoBFD,CApBE9B,EAAA,gBAAA,CV9GUlS,EU0GZ,CAyBA4T,GAAA,CAAAA,CAAA,CAFQ;AAOVxB,CAAA2B,kBAAA,CAAAA,QAAiB,EAAG,CAClBT,CAAA,CAAAA,IAAA,CACA,IAAK,IAAArB,EAAL,CAAA,CAGA,IAAIiC,EAAe,IAAAjC,EAAA,cAAA,EAEnB,IAAK,IAAAA,EAAA,SAAL,CAAA,CAGA,GT1IS9Q,CS0IT,CAsKA,IAAK,IAAI1E,EAAI,CAAb,CAAgBA,CAAhB,CAlKuCyX,CAkKnB3X,OAApB,CAAyCE,CAAA,EAAzC,CAA8C,CAE5C,IAAIe,EApKJ2W,IAoKQlC,EAAA,uBAAA,CApK6BiC,CAmK7BhO,CAAazJ,CAAbyJ,CACA,CACR,IAAI1I,CAAJ,ETnTO2D,CSmTP,EArKAgT,IAuMwBjC,EAlCxB,CAkCyC,CACzC,IAAIvG,EN7VM5J,CM6VA,CAAwBC,CAAxB,CACVsR,EAAA,CAzMAa,IAyMA,CAzMAA,KA0MAjC,EAAA,eAAA,CAAkCvG,CAAlC,CACA3J,EAAAC,YAAA,CNjXUL,CMiXU,CAAoB+J,CAApB,CAJqB,CArCG,CAtK9C,IA+KA,KA9KEyI,EAAA,CAAAA,IAAA,CAAuB,IAAAvC,EAAvB,CAA4C,IAAAC,EAA5C,CA8KOrV,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CA7K0ByX,CA6KN3X,OAApB,CAAyCE,CAAA,EAAzC,CAGE,CADIe,CACJ,CAhLA6W,IA+KQpC,EAAA,uBAAA,CA/KgBiC,CA8KhBhO,CAAazJ,CAAbyJ,CACA,CACR,GACE2K,EAAA,CAAiCrT,CAAjC,CAjLF6W,IAiLsCvC,EAAA7F,EAApC,CA7KJ,KAAAgG,EAAA,SAAA,CAAyC,CAAA,CAErC,KAAAD,EAAJ,EAAiC,CTlJxB7Q,CSkJT,EACE,IAAAmT,cAAA,EAZF,CALA,CAFkB,CA4BpBlC;CAAAmC,aAAA,CAAAA,QAAY,CAACvL,CAAD,CAAOwL,CAAP,CAAsB,CAC3B,IAAA,ENgDO9P,CMhDD,CAAuBsE,CAAvB,CAAN,GAAA,CACDoD,EAAY2D,CAAA,CAAc/G,CAAd,CAChB,IAAKoD,CAAAA,CAAL,CAAA,CApFI,IAAA,ENkIQ1H,CMlIc,CAqFMsE,CArFN,CAArB,EAAA,CAAA,CAAA,GAAI,EAAA,CAAA,CAAA,EACT,KAAI4C,EDnFOmF,ECmFO,CAAelM,CAAf,CACd3E,EAAAA,Cb3GOrE,Ca2GI,CAAYgJ,CAAZ,CAIf,IAAI3E,CAAJ,CAAc,CACZ,IAAAyL,EAAMzL,CAAA,UACN,KAAA2L,EAAwB3L,CAAAyT,EAFZ,CAKd,CAAA,CAAO5B,EAAA,CA0EyB/I,CA1EzB,CACL,IHpHS0C,CGoHT,CACEC,CADF,CAEEC,CAFF,CAGEC,CAHF,CAIEhH,CAJF,CAKED,CALF,CADK,CAyEP,CAIuBoE,CAAvB,GAAKyL,IAuDY5C,EAvDjB,GACE,IAAAG,EADF,CAC8B,CAAA,CAD9B,CAGIwC,EAAJ,GACEpI,CAAAN,EAEA,CADEM,CAAAN,EACF,EADuC,EACvC,CAAAgC,MAAAC,OAAA,CAAc3B,CAAAN,EAAd,CAAiD0I,CAAjD,CAHF,CAKA,IT3KSrT,CS2KT,CAKO,CACL,GAAIiL,CAAAN,EAAJ,CAAA,CAC+BA,CAAAA,CAAAM,CAAAN,EE5MnC,KAAKlP,IAAIA,CAAT,GAAc+Q,EAAd,CAEY,IAAV,GAAI/Q,CAAJ,CF0M2BoM,CEzMzBhH,MAAA0S,eAAA,CAA6B9X,CAA7B,CADF,CF0M2BoM,CEvMzBhH,MAAA2S,YAAA,CAA0B/X,CAA1B,CAA6B+Q,CAAA,CAAW/Q,CAAX,CAA7B,CFsMA,CAKA,KAFIsD,CAEJ,CbpNSrE,CakNM,CAAYgJ,CAAZ,CAEf,GAAoCmE,CAApC,GAAkByL,IAoCH5C,EApCf,GAGI3R,CAHJ,EAGgBA,CAAAwT,EAHhB,EAGmC,CVxJzBvT,EUwJ0B,CAA+BD,CAA/B,CAHpC,CAG8E,CAE5E,GVnIEC,EAAA,CUmIuCD,CVnIvC,CUmIF,EAAyCA,CVnIV,4BUmI/B,GAAyCA,CVnIuB,sBUmIhE,CACEoT,CAAA,CAAAA,IAAA,CAGA,CAFA,IAAApB,EAEA,EAFmB,IAAAA,EAAA,eAAA,CAAkChS,CAAA,UAAlC,CAAyD2E,CAAzD,CAEnB,CADA3E,CAAAwT,EAAAzR,YACA,CAD8BoE,CAAA,CAA+B2C,CAA/B;AAAqCoD,CAAA9F,EAArC,CAC9B,CVlHMlG,EUkHN,CAAuCF,CAAvC,CTjOGK,ESoOL,GACMjE,CADN,CACa0M,CAAA4L,WADb,IAGgBtY,CAAAoW,cAAA1Q,CAAmB,OAAnBA,CACZC,YAJJ,CAIwBoE,CAAA,CAA+B2C,CAA/B,CAAqCoD,CAAA9F,EAArC,CAJxB,CAOA8F,EAAA9F,EAAA,CAAuBpG,CAAA,UAhBqD,CATzE,CALP,IAEE,IADDkU,EAAA,CAAAA,IAAA,CAAuBpL,CAAvB,CAA6BoD,CAA7B,CACK,CAAAA,CAAAP,EAAA,EAAmCO,CAAAP,EAAAtP,OAAvC,CAAA,CACmC6P,CAAAA,CAAAA,CA+CjCvH,EAAAA,CNhBQH,CMgBH,CA/CsBsE,CA+CtB,CAAAnE,GCtOkC,EAAA,CAAA,CAE3C,GADIgQ,CACJ,CDqOiBrD,CCtONC,MAAA,CDsOuB5M,CCtOvB,CACX,CAIA,IAASwF,CAAT,CAAewK,CAAAtY,OAAf,CAA6B,CAA7B,CAAuC,CAAvC,EAAgC8N,CAAhC,CAA0CA,CAAA,EAA1C,CAAiD,CAC3CyK,CAAAA,CAAQD,CAAA,CAAKxK,CAAL,CA1BoC,EAAA,CAAA,CD0PewB,CAAAA,CAAAO,CAAAP,ECzPjE,KAASxB,CAAT,CAAe,CAAf,CAAkBA,CAAlB,CAAwBmJ,CAAAjX,OAAxB,CAAiD8N,CAAA,EAAjD,CAEE,GADI0K,CACA,CADKvB,CAAA,CAAiBnJ,CAAjB,CACL,CAwBeyK,CAxBfnH,EAAA,CAAsBoH,CAAtB,CAAA,GDuPgC3I,CAAAH,ECvPF,CAAW8I,CAAX,CAAlC,CAAkD,CAChD,CAAA,CAAO,CAAA,CAAP,OAAA,CADgD,CAIpD,CAAA,CAAO,CAAA,CAP2C,CA2BhD,GAAI,CAAJ,CAAyD,CACvD,CAAA,CAAOD,CAAP,OAAA,CADuD,CAFV,CANN,CAAA,CAAA,IAAA,EAAA,CDyOvCE,CAAAA,CAAcC,CAAA,CAAaA,CAAAV,aAAb,CAAuC,IACrDW,EAAAA,CAAmB9I,CAAAJ,EAEG,EAJAmJ,CAIA,CAJAA,CAIA,EAJAA,CAAAA,EAIA,IAlOtBC,CACJ,CAiOiD,IAlOxCxD,EAAA,CAkOwCrE,CAlOxC,CACT,EAiOiD,IAlOZqE,EAAA,CAkOYrE,CAlOZ,CACrC,EADiE,CACjE,EADsE,CACtE,CAAA,CAAA,CAiOiDA,CAjOjD,CAAc,GAAd,CAAkB6H,CAiOQ,CAA1BhJ,EAAAJ,EAAA,CAA0B,CACqDA,EAAAA,CAAAI,CAAAJ,EFiVpE5G,EAAAA,CAAAA,CA5FPzG,EAAAA,CAAUqD,CAAA,CAAQA,CAAAC,YAAR,EAA6B,EAA7B,CACZwN,EAAA,CAAAA,CAAA,CE5S6BzG,CF4S7B,CEtPkDoD,CAAAH,EFsPlD,CAA0C3G,CAA1C,CAEE8G,EAAAA,CAAY2D,CAAA,CE9Se/G,CF8Sf,CAChB,KAAIxL,EAAI4O,CAAAL,EACJvO,EAAJ,EAAS,CPhgBA+C,COggBT,EAA2B/C,CAA3B,GAAiCwE,CAAjC,GACExE,CAAA,UAAA,EACA,CAAsB,CAAtB,EAAIA,CAAA,UAAJ;AAA2BA,CAAA2V,WAA3B,EACE3V,CAAA2V,WAAAC,YAAA,CAAyB5V,CAAzB,CAHJ,CPhgBS+C,EOwgBT,CAEM6L,CAAAL,EAAJ,EACEK,CAAAL,EAAA9J,YACA,CADoCtD,CACpC,CAAAqD,CAAA,CAAQoK,CAAAL,EAFV,EAIWpN,CAJX,GAOEqD,CAPF,CJ7aUW,CIobA,CAAmBhE,CAAnB,CAA4B2G,CAA5B,CEjUmB0D,CFiUmB4L,WAAtC,CACNxI,CAAAR,EADM,CAPV,CAFF,CAcO5J,CAAL,CAQYA,CAAAmR,WARZ,GASMtG,EAKJ,EAL0C,EAK1C,CALalO,CAAAlB,QAAA,CAAgB,QAAhB,CAKb,GAFEuE,CAAAC,YAEF,CAFsBtD,CAEtB,EJxZQuE,EIwZR,CAAqBlB,CAArB,CAA4B,IAA5B,CAAkCoK,CAAAR,EAAlC,CAdF,EAGMjN,CAHN,GAIIqD,CAJJ,CJzbUW,CI6bE,CAAmBhE,CAAnB,CAA4B2G,CAA5B,CAAsC,IAAtC,CACN8G,CAAAR,EADM,CAJZ,CAkBE5J,EAAJ,GACEA,CAAA,UAKA,CALqBA,CAAA,UAKrB,EAL2C,CAK3C,CAHIoK,CAAAL,EAGJ,EAH6B/J,CAG7B,EAFEA,CAAA,UAAA,EAEF,CAAAoK,CAAAL,EAAA,CAAwB/J,CAN1B,CAQA,EAAA,CAAOA,CPhjBEzB,ESuQT,GACkDyL,CFqOlD,CErOkDI,CAAAJ,EFqOlD,CANIqJ,CAMJ,CAPInP,CAOJ,CE7R+B8C,CFsRvBlE,aAAA,CAAqB,OAArB,CAOR,EAPyC,EAOzC,CErO2EoQ,CFqO3E,GAJEG,CAIF,CAJMnP,CAAAhK,QAAA,CACF,IAAIsN,MAAJ,CAAW,iBAAX,CElOuE0L,CFkOvE,CAAiD,MAAjD,CAAyD,GAAzD,CADE,CAC6D,GAD7D,CAIN,EADAG,CACA,GADMA,CAAA,CAAI,GAAJ,CAAU,EAChB,EADoC,UACpC,CAD0C/P,CAC1C,CAAIY,CAAJ,GAAUmP,CAAV,EJ3QY9Q,CI4QV,CE9R6ByE,CF8R7B,CAAsCqM,CAAtC,CEvOF,CAGKJ,EAAL,GCzPIJ,CAKJ,CDqPErD,CC1PSC,MAAA,CD0PQ5M,CC1PR,CAKX,EALkC,EAKlC,CAJAgQ,CAAA/X,KAAA,CAAU,CAAC6Q,EDyPYvB,CAAAH,ECzPb,CAAasI,aDyP2BvS,CCzPxC,CAA2BgK,EDyPoBI,CAAAJ,ECzP/C,CAAV,CAIA,CAHI6I,CAAAtY,OAGJ,CDqPEiV,CCxPgBE,EAGlB,EAFEmD,CAAAS,MAAA,EAEF;ADqPE9D,CCrPFC,MAAA,CDqPmB5M,CCrPnB,CAAA,CAAsBgQ,CDoPtB,CA3DE,CAjB8B,CAiDlCU,SAAA,GAAkB,CAAlBA,CAAkB,CAACvY,CAAD,CAAO,CAGvB,MAAA,CADIgM,CACJ,CAFWhM,CAAAgN,YAAA1N,EACA0M,KACX,EACM+G,CAAA,CAAc/G,CAAd,CAAJ,CACSA,CADT,CAGSuM,EAAA,CAAAA,CAAA,CAAwBvM,CAAxB,CAJX,CAOO,CAAA6I,EAVgB,CAgCzBuC,QAAA,GAAiB,CAAjBA,CAAiB,CAACpL,CAAD,CAAOoD,CAAP,CAAkB,CAC7BoJ,CAAAA,CAAQD,EAAA,CAAAA,CAAA,CAAwBvM,CAAxB,CACZ,KAAIyM,EAAiB1F,CAAA,CAAcyF,CAAd,CAEjBxI,EAAAA,CAAQc,MAAA4H,OAAA,CADUD,CAAAxJ,EACV,EAAiC,IAAjC,CACZ,KAAI0J,EAAmBtG,EAAA,CAA8CrG,CAA9C,CAAoDoD,CAAA9F,EAApD,CAEnBsP,EAAAA,CADejH,EAAAkH,CAAuCJ,CAAAnP,EAAvCuP,CAAkE7M,CAAlE6M,CACUlI,EAC7BG,OAAAC,OAAA,CACEf,CADF,CAEE2I,CAAArG,EAFF,CAGEsG,CAHF,CAIED,CAAApG,EAJF,CAMiCzD,EAAAA,CAAAM,CAAAN,EAKjC,KAAKlP,IAAIA,CAAT,GAAckZ,EAAd,CAIE,IAHIT,CAGJ,CAHQS,CAAA,CAAUlZ,CAAV,CAGR,GAAe,CAAf,GAASyY,CAAT,CATwBrI,CAUtB,CAAMpQ,CAAN,CAAA,CAAWyY,CFgTJjQ,EAAAA,CAAAA,CAzdPsI,EAAAA,CAAQI,MAAAiI,oBAAA,CEgKU/I,CFhKV,CACZ,KAASvQ,CAAT,CAAW,CAAX,CAAiBA,CAAjB,CAAqBiR,CAAAnR,OAArB,CAAmCE,CAAA,EAAnC,CACED,CACA,CADIkR,CAAA,CAAMjR,CAAN,CACJ,CE6JoBuQ,CF7JpB,CAAMxQ,CAAN,CAAA,CAAWyR,CAAA,CAAAA,CAAA,CE6JSjB,CF7Ja,CAAMxQ,CAAN,CAAtB,CE6JSwQ,CF7JT,CE8JbZ,EAAAH,EAAA,CAA4Be,CAhBK,CAiCnCoF,CAAAkC,cAAA,CAAAA,QAAa,CAAC3G,CAAD,CAAa,CACxB,IAAAqI,aAAA,CAAkB,IAAAnE,EAAlB,CAAuClE,CAAvC,CADwB,CAS1ByE;CAAA4D,aAAA,CAAAA,QAAY,CAAChN,CAAD,CAAO2E,CAAP,CAAmB,CAC7B,IAAIrR,EAAO0M,CAAA4L,WACX,EAAItY,CAAJ,EAA8B0M,CAA9B,GAAYyL,IA/DK5C,EA+DjB,GACE,IAAA0C,aAAA,CAAkBvL,CAAlB,CAAwB2E,CAAxB,CAIF,IADIsI,CACJ,CADqB3Z,CACrB,GAD8BA,CAAAuJ,SAC9B,EAD+CvJ,CAAAoJ,WAC/C,EACE,IAASjJ,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBwZ,CAAA1Z,OAApB,CAA2CE,CAAA,EAA3C,CAEE,IAAAuZ,aAAA,CADoCC,CAAA/P,CAAezJ,CAAfyJ,CACpC,CAHJ,KAQE,IADIL,CACJ,CADemD,CAAAnD,SACf,EADgCmD,CAAAtD,WAChC,CACE,IAASjJ,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBoJ,CAAAtJ,OAApB,CAAqCE,CAAA,EAArC,CAEE,IAAAuZ,aAAA,CADoCnQ,CAAAK,CAASzJ,CAATyJ,CACpC,CAlBuB,CA0C/BkM,EAAA0B,EAAA,CAAAA,QAA+B,CAAC9R,CAAD,CAAQ,CAAA,IAAA,EAAA,IAAA,CACjC2J,ENzUQ5J,CMyUF,CAAwBC,CAAxB,CNhTEF,EMiTZ,CAAsB6J,CAAtB,CAA2B,QAAA,CAACxJ,CAAD,CAAU,CACnC,GTtWO5B,CSsWP,CACE4I,EAAA,CAAuChH,CAAvC,CADF,KAAA,CLRSiD,IAAAA,EAAAA,CKWuBjD,ELxDlC,SAAA,CKwDkCA,CLxDf,eACnBgH,GAAA,CKuDkChH,CLvDlC,CKuDkCA,ELtMlC,SAAA,CKsMkCA,CLtMf2E,EAAnB,CACEC,CAAA,CA+IFmP,CA/IE,CKqMgC/T,CLrMhC,CA+IwB,CAAAkH,EA/IxB,CA+IFnE,IAAA,EA/IE,CA+IFwB,IAAA,EA/IE,CKkMA,CTpUOvF,CSyUP,GACEmS,CAAA,CAAAA,CAAA,CACA,CAAA,CAAApB,EAAA,EAAmB,CAAAA,EAAA,cAAA,CAAiC/P,CAAjC,CAFrB,CANmC,CAArC,CTnUShB,ES8UT,CACEa,CAAAC,YADF,CNtWYL,CMuWU,CAAoB+J,CAApB,CADtB,CAGE,IAAAmG,EAAAxL,EAAA,MAAAxJ,KAAA,CAAsD6O,CAAtD,CAhBmC,CA2BvCyG;CAAA+D,sBAAA,CAAAA,QAAqB,CAAC3R,CAAD,CAAU0J,CAAV,CAAoB,CACvC,IAAI7J,CT7VKlD,ES8VT,GAGEkD,CAHF,CAGU4H,CADQ8D,CAAA,CAAcvL,CAAd,CACRyH,EADkC8D,CAAA,CAAcwF,EAAA,CAAAA,IAAA,CAAwB/Q,CAAxB,CAAd,CAClCyH,GAAA,CAA0BiC,CAA1B,CAHV,CASA,OAAO,CAHP7J,CAGO,CAHCA,CAGD,EAHU7D,MAAA4V,iBAAA,CAAwB5R,CAAxB,CAAA6R,iBAAA,CAAkDnI,CAAlD,CAGV,EAAQ7J,CAAAlH,KAAA,EAAR,CAAuB,EAXS,CAgBzCiV,EAAAkE,EAAA,CAAAA,QAAe,CAAC9R,CAAD,CAAU+R,CAAV,CAAuB,CACpC,IAAIja,EAAOkI,CAAAwF,YAAA,EACPC,EAAAA,CAAUsM,CAAA,CAAcA,CAAAvY,MAAA,CAAkB,IAAlB,CAAd,CAAwC,EAClDwY,EAAAA,CAAYla,CAAA0M,KAAZwN,EAAyBla,CAAA0M,KAAArE,UAI7B,IAAI,CAAC6R,CAAL,CAAgB,CACd,IAAIC,EAAYjS,CAAAM,aAAA,CAAqB,OAArB,CAChB,IAAI2R,CAAJ,CAAe,CACTC,CAAAA,CAAKD,CAAAzY,MAAA,CAAgB,IAAhB,CACT,KAAK,IAAIvB,EAAE,CAAX,CAAcA,CAAd,CAAkBia,CAAAna,OAAlB,CAA6BE,CAAA,EAA7B,CACE,GAAIia,CAAA,CAAGja,CAAH,CAAJ,GL5DK2I,CK4DSY,EAAd,CAA2C,CACzCwQ,CAAA,CAAYE,CAAA,CAAGja,CAAH,CAAK,CAAL,CACZ,MAFyC,CAHhC,CAFD,CAYZ+Z,CAAJ,EACEvM,CAAAnN,KAAA,CLpESsI,CKoEIY,EAAb,CAA0CwQ,CAA1C,CThYOrV,ESkYT,GACMiL,CADN,CACkB2D,CAAA,CAAcvL,CAAd,CADlB,GAEmB4H,CAAAJ,EAFnB,EAGI/B,CAAAnN,KAAA,CFgLOsI,CEhLM0L,EAAb,CAA0C1E,CAAAJ,EAA1C,CNrMQzH,EMwMZ,CAA6BC,CAA7B,CAAsCyF,CAAA5C,KAAA,CAAa,GAAb,CAAtC,CA5BoC,CA8BtC+K,EAAAuE,EAAA,CAAAA,QAAiB,CAAC3Z,CAAD,CAAO,CACtB,MAAO+S,EAAA,CAAc/S,CAAd,CADe,CAM1B2U,EAAArF,UAAA,MAAA,CAAiCqF,CAAArF,UAAA7C,EACjCkI;CAAArF,UAAA,gBAAA,CAA2CqF,CAAArF,UAAAkG,gBAC3Cb,EAAArF,UAAA,aAAA,CAAwCqF,CAAArF,UAAAiI,aACxC5C,EAAArF,UAAA,cAAA,CAAyCqF,CAAArF,UAAAgI,cACzC3C,EAAArF,UAAA,aAAA,CAAwCqF,CAAArF,UAAA0J,aACxCrE,EAAArF,UAAA,sBAAA,CAAiDqF,CAAArF,UAAA6J,sBACjDxE,EAAArF,UAAA,gBAAA,CAA2CqF,CAAArF,UAAAgK,EAC3C3E,EAAArF,UAAA,kBAAA,CAA6CqF,CAAArF,UAAAqK,EAC7ChF,EAAArF,UAAA,gCAAA,CAA2DqF,CAAArF,UAAAwH,EAC3DnC,EAAArF,UAAA,YAAA,CAAuCqF,CAAArF,UAAAgG,EACvCX,EAAArF,UAAA,iBAAA,CAA4CqF,CAAArF,UAAAiG,EAC5CZ;CAAArF,UAAA,kBAAA,CAA6CqF,CAAArF,UAAAyH,kBAC7CjG,OAAA8I,iBAAA,CAAwBjF,CAAArF,UAAxB,CAA+C,CAC7C,aAAgB,CACd,IAAAJ,QAAG,EAAG,CACJ,MTjcO3L,ESgcH,CADQ,CAD6B,CAM7C,UAAa,CACX,IAAA2L,QAAG,EAAG,CACJ,MTpaO/K,ESmaH,CADK,CANgC,CAA/C,C,CG1bA,IAAM0V,EAAc,IHeLlF,CGff,CAEIsC,EAFJ,CAEeJ,EAEXrT,OAAA,SAAJ,GACEyT,EACA,CADYzT,MAAA,SAAA,UACZ,CAAAqT,EAAA,CAAuBrT,MAAA,SAAA,qBAFzB,CAKAA;MAAAQ,SAAA,CAAkB,CAChB2Q,YAAakF,CADG,CAOhB,gBAAArE,QAAe,CAACtS,CAAD,CAAWD,CAAX,CAAwB6W,CAAxB,CAAwC,CACrDD,CAAA9C,kBAAA,EACA8C,EAAArE,gBAAA,CAA4BtS,CAA5B,CAAsCD,CAAtC,CAAmD6W,CAAnD,CAFqD,CAPvC,CAgBhB,aAAAd,QAAY,CAACxR,CAAD,CAAUmJ,CAAV,CAAsB,CAChCkJ,CAAA9C,kBAAA,EACA8C,EAAAb,aAAA,CAAyBxR,CAAzB,CAAkCmJ,CAAlC,CAFgC,CAhBlB,CAwBhB,aAAA4G,QAAY,CAAC/P,CAAD,CAAU,CACpBqS,CAAA9C,kBAAA,EACA8C,EAAAtC,aAAA,CAAyB/P,CAAzB,CAFoB,CAxBN,CAgChB,cAAA8P,QAAa,CAAC3G,CAAD,CAAa,CACxBkJ,CAAA9C,kBAAA,EACA8C,EAAAvC,cAAA,CAA0B3G,CAA1B,CAFwB,CAhCV,CAqChB,kBAAAoG,QAAiB,EAAG,CAClB8C,CAAA9C,kBAAA,EADkB,CArCJ,CA8ChB,sBAAAoC,QAAqB,CAAC3R,CAAD,CAAU0J,CAAV,CAAoB,CACvC,MAAO2I,EAAAV,sBAAA,CAAkC3R,CAAlC,CAA2C0J,CAA3C,CADgC,CA9CzB,CAkDhBhN,UZ7BWC,CYrBK,CAoDhBZ,aZjEWA,CYaK,CAuDd0T,GAAJ,GACEzT,MAAAQ,SAAAiT,UADF,CAC8BA,EAD9B,CAIIJ;EAAJ,GACErT,MAAAQ,SAAA6S,qBADF,CACyCA,EADzC","file":"scoping-shim.min.js","sourcesContent":["/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/**\n * @const {!Object<string, !HTMLTemplateElement>}\n */\nconst templateMap = {};\nexport default templateMap;\n",null,"/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/*\nExtremely simple css parser. Intended to be not more than what we need\nand definitely not necessarily correct =).\n*/\n\n'use strict';\n\n/** @unrestricted */\nclass StyleNode {\n constructor() {\n /** @type {number} */\n this['start'] = 0;\n /** @type {number} */\n this['end'] = 0;\n /** @type {StyleNode} */\n this['previous'] = null;\n /** @type {StyleNode} */\n this['parent'] = null;\n /** @type {Array<StyleNode>} */\n this['rules'] = null;\n /** @type {string} */\n this['parsedCssText'] = '';\n /** @type {string} */\n this['cssText'] = '';\n /** @type {boolean} */\n this['atRule'] = false;\n /** @type {number} */\n this['type'] = 0;\n /** @type {string} */\n this['keyframesName'] = '';\n /** @type {string} */\n this['selector'] = '';\n /** @type {string} */\n this['parsedSelector'] = '';\n }\n}\n\nexport {StyleNode}\n\n// given a string of css, return a simple rule tree\n/**\n * @param {string} text\n * @return {StyleNode}\n */\nexport function parse(text) {\n text = clean(text);\n return parseCss(lex(text), text);\n}\n\n// remove stuff we don't care about that may hinder parsing\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction clean(cssText) {\n return cssText.replace(RX.comments, '').replace(RX.port, '');\n}\n\n// super simple {...} lexer that returns a node tree\n/**\n * @param {string} text\n * @return {StyleNode}\n */\nfunction lex(text) {\n let root = new StyleNode();\n root['start'] = 0;\n root['end'] = text.length\n let n = root;\n for (let i = 0, l = text.length; i < l; i++) {\n if (text[i] === OPEN_BRACE) {\n if (!n['rules']) {\n n['rules'] = [];\n }\n let p = n;\n let previous = p['rules'][p['rules'].length - 1] || null;\n n = new StyleNode();\n n['start'] = i + 1;\n n['parent'] = p;\n n['previous'] = previous;\n p['rules'].push(n);\n } else if (text[i] === CLOSE_BRACE) {\n n['end'] = i + 1;\n n = n['parent'] || root;\n }\n }\n return root;\n}\n\n// add selectors/cssText to node tree\n/**\n * @param {StyleNode} node\n * @param {string} text\n * @return {StyleNode}\n */\nfunction parseCss(node, text) {\n let t = text.substring(node['start'], node['end'] - 1);\n node['parsedCssText'] = node['cssText'] = t.trim();\n if (node['parent']) {\n let ss = node['previous'] ? node['previous']['end'] : node['parent']['start'];\n t = text.substring(ss, node['start'] - 1);\n t = _expandUnicodeEscapes(t);\n t = t.replace(RX.multipleSpaces, ' ');\n // TODO(sorvell): ad hoc; make selector include only after last ;\n // helps with mixin syntax\n t = t.substring(t.lastIndexOf(';') + 1);\n let s = node['parsedSelector'] = node['selector'] = t.trim();\n node['atRule'] = (s.indexOf(AT_START) === 0);\n // note, support a subset of rule types...\n if (node['atRule']) {\n if (s.indexOf(MEDIA_START) === 0) {\n node['type'] = types.MEDIA_RULE;\n } else if (s.match(RX.keyframesRule)) {\n node['type'] = types.KEYFRAMES_RULE;\n node['keyframesName'] =\n node['selector'].split(RX.multipleSpaces).pop();\n }\n } else {\n if (s.indexOf(VAR_START) === 0) {\n node['type'] = types.MIXIN_RULE;\n } else {\n node['type'] = types.STYLE_RULE;\n }\n }\n }\n let r$ = node['rules'];\n if (r$) {\n for (let i = 0, l = r$.length, r;\n (i < l) && (r = r$[i]); i++) {\n parseCss(r, text);\n }\n }\n return node;\n}\n\n/**\n * conversion of sort unicode escapes with spaces like `\\33 ` (and longer) into\n * expanded form that doesn't require trailing space `\\000033`\n * @param {string} s\n * @return {string}\n */\nfunction _expandUnicodeEscapes(s) {\n return s.replace(/\\\\([0-9a-f]{1,6})\\s/gi, function() {\n let code = arguments[1],\n repeat = 6 - code.length;\n while (repeat--) {\n code = '0' + code;\n }\n return '\\\\' + code;\n });\n}\n\n/**\n * stringify parsed css.\n * @param {StyleNode} node\n * @param {boolean=} preserveProperties\n * @param {string=} text\n * @return {string}\n */\nexport function stringify(node, preserveProperties, text = '') {\n // calc rule cssText\n let cssText = '';\n if (node['cssText'] || node['rules']) {\n let r$ = node['rules'];\n if (r$ && !_hasMixinRules(r$)) {\n for (let i = 0, l = r$.length, r;\n (i < l) && (r = r$[i]); i++) {\n cssText = stringify(r, preserveProperties, cssText);\n }\n } else {\n cssText = preserveProperties ? node['cssText'] :\n removeCustomProps(node['cssText']);\n cssText = cssText.trim();\n if (cssText) {\n cssText = ' ' + cssText + '\\n';\n }\n }\n }\n // emit rule if there is cssText\n if (cssText) {\n if (node['selector']) {\n text += node['selector'] + ' ' + OPEN_BRACE + '\\n';\n }\n text += cssText;\n if (node['selector']) {\n text += CLOSE_BRACE + '\\n\\n';\n }\n }\n return text;\n}\n\n/**\n * @param {Array<StyleNode>} rules\n * @return {boolean}\n */\nfunction _hasMixinRules(rules) {\n let r = rules[0];\n return Boolean(r) && Boolean(r['selector']) && r['selector'].indexOf(VAR_START) === 0;\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction removeCustomProps(cssText) {\n cssText = removeCustomPropAssignment(cssText);\n return removeCustomPropApply(cssText);\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nexport function removeCustomPropAssignment(cssText) {\n return cssText\n .replace(RX.customProp, '')\n .replace(RX.mixinProp, '');\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction removeCustomPropApply(cssText) {\n return cssText\n .replace(RX.mixinApply, '')\n .replace(RX.varApply, '');\n}\n\n/** @enum {number} */\nexport const types = {\n STYLE_RULE: 1,\n KEYFRAMES_RULE: 7,\n MEDIA_RULE: 4,\n MIXIN_RULE: 1000\n}\n\nconst OPEN_BRACE = '{';\nconst CLOSE_BRACE = '}';\n\n// helper regexp's\nconst RX = {\n comments: /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n port: /@import[^;]*;/gim,\n customProp: /(?:^[^;\\-\\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\\n]|$)/gim,\n mixinProp: /(?:^[^;\\-\\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\\n]|$)?/gim,\n mixinApply: /@apply\\s*\\(?[^);]*\\)?\\s*(?:[;\\n]|$)?/gim,\n varApply: /[^;:]*?:[^;]*?var\\([^;]*\\)(?:[;\\n]|$)?/gim,\n keyframesRule: /^@[^\\s]*keyframes/,\n multipleSpaces: /\\s+/g\n}\n\nconst VAR_START = '--';\nconst MEDIA_START = '@media';\nconst AT_START = '@';\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\nimport templateMap from './template-map.js';\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\n\n/*\n * Utilities for handling invalidating apply-shim mixins for a given template.\n *\n * The invalidation strategy involves keeping track of the \"current\" version of a template's mixins, and updating that count when a mixin is invalidated.\n * The template\n */\n\n/** @const {string} */\nconst CURRENT_VERSION = '_applyShimCurrentVersion';\n\n/** @const {string} */\nconst NEXT_VERSION = '_applyShimNextVersion';\n\n/** @const {string} */\nconst VALIDATING_VERSION = '_applyShimValidatingVersion';\n\n/**\n * @const {Promise<void>}\n */\nconst promise = Promise.resolve();\n\n/**\n * @param {string} elementName\n */\nexport function invalidate(elementName){\n let template = templateMap[elementName];\n if (template) {\n invalidateTemplate(template);\n }\n}\n\n/**\n * This function can be called multiple times to mark a template invalid\n * and signal that the style inside must be regenerated.\n *\n * Use `startValidatingTemplate` to begin an asynchronous validation cycle.\n * During that cycle, call `templateIsValidating` to see if the template must\n * be revalidated\n * @param {HTMLTemplateElement} template\n */\nexport function invalidateTemplate(template) {\n // default the current version to 0\n template[CURRENT_VERSION] = template[CURRENT_VERSION] || 0;\n // ensure the \"validating for\" flag exists\n template[VALIDATING_VERSION] = template[VALIDATING_VERSION] || 0;\n // increment the next version\n template[NEXT_VERSION] = (template[NEXT_VERSION] || 0) + 1;\n}\n\n/**\n * @param {string} elementName\n * @return {boolean}\n */\nexport function isValid(elementName) {\n let template = templateMap[elementName];\n if (template) {\n return templateIsValid(template);\n }\n return true;\n}\n\n/**\n * @param {HTMLTemplateElement} template\n * @return {boolean}\n */\nexport function templateIsValid(template) {\n return template[CURRENT_VERSION] === template[NEXT_VERSION];\n}\n\n/**\n * @param {string} elementName\n * @return {boolean}\n */\nexport function isValidating(elementName) {\n let template = templateMap[elementName];\n if (template) {\n return templateIsValidating(template);\n }\n return false;\n}\n\n/**\n * Returns true if the template is currently invalid and `startValidating` has been called since the last invalidation.\n * If false, the template must be validated.\n * @param {HTMLTemplateElement} template\n * @return {boolean}\n */\nexport function templateIsValidating(template) {\n return !templateIsValid(template) && template[VALIDATING_VERSION] === template[NEXT_VERSION];\n}\n\n/**\n * the template is marked as `validating` for one microtask so that all instances\n * found in the tree crawl of `applyStyle` will update themselves,\n * but the template will only be updated once.\n * @param {string} elementName\n*/\nexport function startValidating(elementName) {\n let template = templateMap[elementName];\n startValidatingTemplate(template);\n}\n\n/**\n * Begin an asynchronous invalidation cycle.\n * This should be called after every validation of a template\n *\n * After one microtask, the template will be marked as valid until the next call to `invalidateTemplate`\n * @param {HTMLTemplateElement} template\n */\nexport function startValidatingTemplate(template) {\n // remember that the current \"next version\" is the reason for this validation cycle\n template[VALIDATING_VERSION] = template[NEXT_VERSION];\n // however, there only needs to be one async task to clear the counters\n if (!template._validating) {\n template._validating = true;\n promise.then(function() {\n // sync the current version to let future invalidations cause a refresh cycle\n template[CURRENT_VERSION] = template[NEXT_VERSION];\n template._validating = false;\n });\n }\n}\n\n/**\n * @return {boolean}\n */\nexport function elementsAreInvalid() {\n for (let elementName in templateMap) {\n let template = templateMap[elementName];\n if (!templateIsValid(template)) {\n return true;\n }\n }\n return false;\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nexport const nativeShadow = !(window['ShadyDOM'] && window['ShadyDOM']['inUse']);\nlet nativeCssVariables_;\n\n/**\n * @param {(ShadyCSSOptions | ShadyCSSInterface)=} settings\n */\nfunction calcCssVariables(settings) {\n if (settings && settings['shimcssproperties']) {\n nativeCssVariables_ = false;\n } else {\n // chrome 49 has semi-working css vars, check if box-shadow works\n // safari 9.1 has a recalc bug: https://bugs.webkit.org/show_bug.cgi?id=155782\n // However, shim css custom properties are only supported with ShadyDOM enabled,\n // so fall back on native if we do not detect ShadyDOM\n // Edge 15: custom properties used in ::before and ::after will also be used in the parent element\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12414257/\n nativeCssVariables_ = nativeShadow || Boolean(!navigator.userAgent.match(/AppleWebKit\\/601|Edge\\/15/) &&\n window.CSS && CSS.supports && CSS.supports('box-shadow', '0 0 0 var(--foo)'));\n }\n}\n\nif (window.ShadyCSS && window.ShadyCSS.nativeCss !== undefined) {\n nativeCssVariables_ = window.ShadyCSS.nativeCss;\n} else if (window.ShadyCSS) {\n calcCssVariables(window.ShadyCSS);\n // reset window variable to let ShadyCSS API take its place\n window.ShadyCSS = undefined;\n} else {\n calcCssVariables(window['WebComponents'] && window['WebComponents']['flags']);\n}\n\n// Hack for type error under new type inference which doesn't like that\n// nativeCssVariables is updated in a function and assigns the type\n// `function(): ?` instead of `boolean`.\nexport const nativeCssVariables = /** @type {boolean} */(nativeCssVariables_);\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nexport const VAR_ASSIGN = /(?:^|[;\\s{]\\s*)(--[\\w-]*?)\\s*:\\s*(?:((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^)]*?\\)|[^};{])+)|\\{([^}]*)\\}(?:(?=[;\\s}])|$))/gi;\nexport const MIXIN_MATCH = /(?:^|\\W+)@apply\\s*\\(?([^);\\n]*)\\)?/gi;\nexport const VAR_CONSUMED = /(--[\\w-]+)\\s*([:,;)]|$)/gi;\nexport const ANIMATION_MATCH = /(animation\\s*:)|(animation-name\\s*:)/;\nexport const MEDIA_MATCH = /@media\\s(.*)/;\nexport const IS_VAR = /^--/;\nexport const BRACKETED = /\\{[^}]*\\}/g;\nexport const HOST_PREFIX = '(?:^|[^.#[:])';\nexport const HOST_SUFFIX = '($|[.:[\\\\s>+~])';\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/** @type {!Set<string>} */\nconst styleTextSet = new Set();\n\nexport const scopingAttribute = 'shady-unscoped';\n\n/**\n * Add a specifically-marked style to the document directly, and only one copy of that style.\n *\n * @param {!HTMLStyleElement} style\n * @return {undefined}\n */\nexport function processUnscopedStyle(style) {\n const text = style.textContent;\n if (!styleTextSet.has(text)) {\n styleTextSet.add(text);\n const newStyle = style.cloneNode(true);\n document.head.appendChild(newStyle);\n }\n}\n\n/**\n * Check if a style is supposed to be unscoped\n * @param {!HTMLStyleElement} style\n * @return {boolean} true if the style has the unscoping attribute\n */\nexport function isUnscopedStyle(style) {\n return style.hasAttribute(scopingAttribute);\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {nativeShadow, nativeCssVariables} from './style-settings.js';\nimport {parse, stringify, types, StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\nimport {MEDIA_MATCH} from './common-regex.js';\nimport {processUnscopedStyle, isUnscopedStyle} from './unscoped-style-handler.js';\n\n/**\n * @param {string|StyleNode} rules\n * @param {function(StyleNode)=} callback\n * @return {string}\n */\nexport function toCssText (rules, callback) {\n if (!rules) {\n return '';\n }\n if (typeof rules === 'string') {\n rules = parse(rules);\n }\n if (callback) {\n forEachRule(rules, callback);\n }\n return stringify(rules, nativeCssVariables);\n}\n\n/**\n * @param {HTMLStyleElement} style\n * @return {StyleNode}\n */\nexport function rulesForStyle(style) {\n if (!style['__cssRules'] && style.textContent) {\n style['__cssRules'] = parse(style.textContent);\n }\n return style['__cssRules'] || null;\n}\n\n// Tests if a rule is a keyframes selector, which looks almost exactly\n// like a normal selector but is not (it has nothing to do with scoping\n// for example).\n/**\n * @param {StyleNode} rule\n * @return {boolean}\n */\nexport function isKeyframesSelector(rule) {\n return Boolean(rule['parent']) &&\n rule['parent']['type'] === types.KEYFRAMES_RULE;\n}\n\n/**\n * @param {StyleNode} node\n * @param {Function=} styleRuleCallback\n * @param {Function=} keyframesRuleCallback\n * @param {boolean=} onlyActiveRules\n */\nexport function forEachRule(node, styleRuleCallback, keyframesRuleCallback, onlyActiveRules) {\n if (!node) {\n return;\n }\n let skipRules = false;\n let type = node['type'];\n if (onlyActiveRules) {\n if (type === types.MEDIA_RULE) {\n let matchMedia = node['selector'].match(MEDIA_MATCH);\n if (matchMedia) {\n // if rule is a non matching @media rule, skip subrules\n if (!window.matchMedia(matchMedia[1]).matches) {\n skipRules = true;\n }\n }\n }\n }\n if (type === types.STYLE_RULE) {\n styleRuleCallback(node);\n } else if (keyframesRuleCallback &&\n type === types.KEYFRAMES_RULE) {\n keyframesRuleCallback(node);\n } else if (type === types.MIXIN_RULE) {\n skipRules = true;\n }\n let r$ = node['rules'];\n if (r$ && !skipRules) {\n for (let i=0, l=r$.length, r; (i<l) && (r=r$[i]); i++) {\n forEachRule(r, styleRuleCallback, keyframesRuleCallback, onlyActiveRules);\n }\n }\n}\n\n// add a string of cssText to the document.\n/**\n * @param {string} cssText\n * @param {string} moniker\n * @param {Node} target\n * @param {Node} contextNode\n * @return {HTMLStyleElement}\n */\nexport function applyCss(cssText, moniker, target, contextNode) {\n let style = createScopeStyle(cssText, moniker);\n applyStyle(style, target, contextNode);\n return style;\n}\n\n/**\n * @param {string} cssText\n * @param {string} moniker\n * @return {HTMLStyleElement}\n */\nexport function createScopeStyle(cssText, moniker) {\n let style = /** @type {HTMLStyleElement} */(document.createElement('style'));\n if (moniker) {\n style.setAttribute('scope', moniker);\n }\n style.textContent = cssText;\n return style;\n}\n\n/**\n * Track the position of the last added style for placing placeholders\n * @type {Node}\n */\nlet lastHeadApplyNode = null;\n\n// insert a comment node as a styling position placeholder.\n/**\n * @param {string} moniker\n * @return {!Comment}\n */\nexport function applyStylePlaceHolder(moniker) {\n let placeHolder = document.createComment(' Shady DOM styles for ' +\n moniker + ' ');\n let after = lastHeadApplyNode ?\n lastHeadApplyNode['nextSibling'] : null;\n let scope = document.head;\n scope.insertBefore(placeHolder, after || scope.firstChild);\n lastHeadApplyNode = placeHolder;\n return placeHolder;\n}\n\n/**\n * @param {HTMLStyleElement} style\n * @param {?Node} target\n * @param {?Node} contextNode\n */\nexport function applyStyle(style, target, contextNode) {\n target = target || document.head;\n let after = (contextNode && contextNode.nextSibling) ||\n target.firstChild;\n target.insertBefore(style, after);\n if (!lastHeadApplyNode) {\n lastHeadApplyNode = style;\n } else {\n // only update lastHeadApplyNode if the new style is inserted after the old lastHeadApplyNode\n let position = style.compareDocumentPosition(lastHeadApplyNode);\n if (position === Node.DOCUMENT_POSITION_PRECEDING) {\n lastHeadApplyNode = style;\n }\n }\n}\n\n/**\n * @param {string} buildType\n * @return {boolean}\n */\nexport function isTargetedBuild(buildType) {\n return nativeShadow ? buildType === 'shadow' : buildType === 'shady';\n}\n\n/**\n * @param {Element} element\n * @return {?string}\n */\nexport function getCssBuildType(element) {\n return element.getAttribute('css-build');\n}\n\n/**\n * Walk from text[start] matching parens and\n * returns position of the outer end paren\n * @param {string} text\n * @param {number} start\n * @return {number}\n */\nfunction findMatchingParen(text, start) {\n let level = 0;\n for (let i=start, l=text.length; i < l; i++) {\n if (text[i] === '(') {\n level++;\n } else if (text[i] === ')') {\n if (--level === 0) {\n return i;\n }\n }\n }\n return -1;\n}\n\n/**\n * @param {string} str\n * @param {function(string, string, string, string)} callback\n */\nexport function processVariableAndFallback(str, callback) {\n // find 'var('\n let start = str.indexOf('var(');\n if (start === -1) {\n // no var?, everything is prefix\n return callback(str, '', '', '');\n }\n //${prefix}var(${inner})${suffix}\n let end = findMatchingParen(str, start + 3);\n let inner = str.substring(start + 4, end);\n let prefix = str.substring(0, start);\n // suffix may have other variables\n let suffix = processVariableAndFallback(str.substring(end + 1), callback);\n let comma = inner.indexOf(',');\n // value and fallback args should be trimmed to match in property lookup\n if (comma === -1) {\n // variable, no fallback\n return callback(prefix, inner.trim(), '', suffix);\n }\n // var(${value},${fallback})\n let value = inner.substring(0, comma).trim();\n let fallback = inner.substring(comma + 1).trim();\n return callback(prefix, value, fallback, suffix);\n}\n\n/**\n * @param {Element} element\n * @param {string} value\n */\nexport function setElementClassRaw(element, value) {\n // use native setAttribute provided by ShadyDOM when setAttribute is patched\n if (nativeShadow) {\n element.setAttribute('class', value);\n } else {\n window['ShadyDOM']['nativeMethods']['setAttribute'].call(element, 'class', value);\n }\n}\n\n/**\n * @param {Element | {is: string, extends: string}} element\n * @return {{is: string, typeExtension: string}}\n */\nexport function getIsExtends(element) {\n let localName = element['localName'];\n let is = '', typeExtension = '';\n /*\n NOTE: technically, this can be wrong for certain svg elements\n with `-` in the name like `<font-face>`\n */\n if (localName) {\n if (localName.indexOf('-') > -1) {\n is = localName;\n } else {\n typeExtension = localName;\n is = (element.getAttribute && element.getAttribute('is')) || '';\n }\n } else {\n is = /** @type {?} */(element).is;\n typeExtension = /** @type {?} */(element).extends;\n }\n return {is, typeExtension};\n}\n\n/**\n * @param {Element|DocumentFragment} element\n * @return {string}\n */\nexport function gatherStyleText(element) {\n /** @type {!Array<string>} */\n const styleTextParts = [];\n const styles = /** @type {!NodeList<!HTMLStyleElement>} */(element.querySelectorAll('style'));\n for (let i = 0; i < styles.length; i++) {\n const style = styles[i];\n if (isUnscopedStyle(style)) {\n if (!nativeShadow) {\n processUnscopedStyle(style);\n style.parentNode.removeChild(style);\n }\n } else {\n styleTextParts.push(style.textContent);\n style.parentNode.removeChild(style);\n }\n }\n return styleTextParts.join('').trim();\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\nimport * as StyleUtil from './style-util.js';\nimport {nativeShadow} from './style-settings.js';\n\n/* Transforms ShadowDOM styling into ShadyDOM styling\n\n* scoping:\n\n * elements in scope get scoping selector class=\"x-foo-scope\"\n * selectors re-written as follows:\n\n div button -> div.x-foo-scope button.x-foo-scope\n\n* :host -> scopeName\n\n* :host(...) -> scopeName...\n\n* ::slotted(...) -> scopeName > ...\n\n* ...:dir(ltr|rtl) -> [dir=\"ltr|rtl\"] ..., ...[dir=\"ltr|rtl\"]\n\n* :host(:dir[rtl]) -> scopeName:dir(rtl) -> [dir=\"rtl\"] scopeName, scopeName[dir=\"rtl\"]\n\n*/\nconst SCOPE_NAME = 'style-scope';\n\nclass StyleTransformer {\n get SCOPE_NAME() {\n return SCOPE_NAME;\n }\n /**\n * Given a node and scope name, add a scoping class to each node\n * in the tree. This facilitates transforming css into scoped rules.\n * @param {?} node\n * @param {?} scope\n * @param {?=} shouldRemoveScope\n */\n dom(node, scope, shouldRemoveScope) {\n // one time optimization to skip scoping...\n if (node['__styleScoped']) {\n node['__styleScoped'] = null;\n } else {\n this._transformDom(node, scope || '', shouldRemoveScope);\n }\n }\n\n _transformDom(node, selector, shouldRemoveScope) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n this.element(node, selector, shouldRemoveScope);\n }\n let c$ = (node.localName === 'template') ?\n (node.content || node._content).childNodes :\n node.children || node.childNodes;\n if (c$) {\n for (let i=0; i<c$.length; i++) {\n this._transformDom(c$[i], selector, shouldRemoveScope);\n }\n }\n }\n /**\n * @param {?} element\n * @param {?} scope\n * @param {?=} shouldRemoveScope\n */\n element(element, scope, shouldRemoveScope) {\n // note: if using classes, we add both the general 'style-scope' class\n // as well as the specific scope. This enables easy filtering of all\n // `style-scope` elements\n if (scope) {\n // note: svg on IE does not have classList so fallback to class\n if (element.classList) {\n if (shouldRemoveScope) {\n element.classList.remove(SCOPE_NAME);\n element.classList.remove(scope);\n } else {\n element.classList.add(SCOPE_NAME);\n element.classList.add(scope);\n }\n } else if (element.getAttribute) {\n let c = element.getAttribute(CLASS);\n if (shouldRemoveScope) {\n if (c) {\n let newValue = c.replace(SCOPE_NAME, '').replace(scope, '');\n StyleUtil.setElementClassRaw(element, newValue);\n }\n } else {\n let newValue = (c ? c + ' ' : '') + SCOPE_NAME + ' ' + scope;\n StyleUtil.setElementClassRaw(element, newValue);\n }\n }\n }\n }\n\n /**\n * @param {?} element\n * @param {?} styleRules\n * @param {?=} callback\n */\n elementStyles(element, styleRules, callback) {\n let cssBuildType = element['__cssBuild'];\n // no need to shim selectors if settings.useNativeShadow, also\n // a shady css build will already have transformed selectors\n // NOTE: This method may be called as part of static or property shimming.\n // When there is a targeted build it will not be called for static shimming,\n // but when the property shim is used it is called and should opt out of\n // static shimming work when a proper build exists.\n let cssText = '';\n if (nativeShadow || cssBuildType === 'shady') {\n cssText = StyleUtil.toCssText(styleRules, callback);\n } else {\n let {is, typeExtension} = StyleUtil.getIsExtends(element);\n cssText = this.css(styleRules, is, typeExtension, callback) + '\\n\\n';\n }\n return cssText.trim();\n }\n\n // Given a string of cssText and a scoping string (scope), returns\n // a string of scoped css where each selector is transformed to include\n // a class created from the scope. ShadowDOM selectors are also transformed\n // (e.g. :host) to use the scoping selector.\n css(rules, scope, ext, callback) {\n let hostScope = this._calcHostScope(scope, ext);\n scope = this._calcElementScope(scope);\n let self = this;\n return StyleUtil.toCssText(rules, function(/** StyleNode */rule) {\n if (!rule.isScoped) {\n self.rule(rule, scope, hostScope);\n rule.isScoped = true;\n }\n if (callback) {\n callback(rule, scope, hostScope);\n }\n });\n }\n\n _calcElementScope(scope) {\n if (scope) {\n return CSS_CLASS_PREFIX + scope;\n } else {\n return '';\n }\n }\n\n _calcHostScope(scope, ext) {\n return ext ? `[is=${scope}]` : scope;\n }\n\n rule(rule, scope, hostScope) {\n this._transformRule(rule, this._transformComplexSelector,\n scope, hostScope);\n }\n\n /**\n * transforms a css rule to a scoped rule.\n *\n * @param {StyleNode} rule\n * @param {Function} transformer\n * @param {string=} scope\n * @param {string=} hostScope\n */\n _transformRule(rule, transformer, scope, hostScope) {\n // NOTE: save transformedSelector for subsequent matching of elements\n // against selectors (e.g. when calculating style properties)\n rule['selector'] = rule.transformedSelector =\n this._transformRuleCss(rule, transformer, scope, hostScope);\n }\n\n /**\n * @param {StyleNode} rule\n * @param {Function} transformer\n * @param {string=} scope\n * @param {string=} hostScope\n */\n _transformRuleCss(rule, transformer, scope, hostScope) {\n let p$ = rule['selector'].split(COMPLEX_SELECTOR_SEP);\n // we want to skip transformation of rules that appear in keyframes,\n // because they are keyframe selectors, not element selectors.\n if (!StyleUtil.isKeyframesSelector(rule)) {\n for (let i=0, l=p$.length, p; (i<l) && (p=p$[i]); i++) {\n p$[i] = transformer.call(this, p, scope, hostScope);\n }\n }\n return p$.join(COMPLEX_SELECTOR_SEP);\n }\n\n /**\n * @param {string} selector\n * @return {string}\n */\n _twiddleNthPlus(selector) {\n return selector.replace(NTH, (m, type, inside) => {\n if (inside.indexOf('+') > -1) {\n inside = inside.replace(/\\+/g, '___');\n } else if (inside.indexOf('___') > -1) {\n inside = inside.replace(/___/g, '+');\n }\n return `:${type}(${inside})`;\n });\n }\n\n/**\n * @param {string} selector\n * @param {string} scope\n * @param {string=} hostScope\n */\n _transformComplexSelector(selector, scope, hostScope) {\n let stop = false;\n selector = selector.trim();\n // Remove spaces inside of selectors like `:nth-of-type` because it confuses SIMPLE_SELECTOR_SEP\n let isNth = NTH.test(selector);\n if (isNth) {\n selector = selector.replace(NTH, (m, type, inner) => `:${type}(${inner.replace(/\\s/g, '')})`)\n selector = this._twiddleNthPlus(selector);\n }\n selector = selector.replace(SLOTTED_START, `${HOST} $1`);\n selector = selector.replace(SIMPLE_SELECTOR_SEP, (m, c, s) => {\n if (!stop) {\n let info = this._transformCompoundSelector(s, c, scope, hostScope);\n stop = stop || info.stop;\n c = info.combinator;\n s = info.value;\n }\n return c + s;\n });\n if (isNth) {\n selector = this._twiddleNthPlus(selector);\n }\n return selector;\n }\n\n _transformCompoundSelector(selector, combinator, scope, hostScope) {\n // replace :host with host scoping class\n let slottedIndex = selector.indexOf(SLOTTED);\n if (selector.indexOf(HOST) >= 0) {\n selector = this._transformHostSelector(selector, hostScope);\n // replace other selectors with scoping class\n } else if (slottedIndex !== 0) {\n selector = scope ? this._transformSimpleSelector(selector, scope) :\n selector;\n }\n // mark ::slotted() scope jump to replace with descendant selector + arg\n // also ignore left-side combinator\n let slotted = false;\n if (slottedIndex >= 0) {\n combinator = '';\n slotted = true;\n }\n // process scope jumping selectors up to the scope jump and then stop\n let stop;\n if (slotted) {\n stop = true;\n if (slotted) {\n // .zonk ::slotted(.foo) -> .zonk.scope > .foo\n selector = selector.replace(SLOTTED_PAREN, (m, paren) => ` > ${paren}`);\n }\n }\n selector = selector.replace(DIR_PAREN, (m, before, dir) =>\n `[dir=\"${dir}\"] ${before}, ${before}[dir=\"${dir}\"]`);\n return {value: selector, combinator, stop};\n }\n\n _transformSimpleSelector(selector, scope) {\n let p$ = selector.split(PSEUDO_PREFIX);\n p$[0] += scope;\n return p$.join(PSEUDO_PREFIX);\n }\n\n // :host(...) -> scopeName...\n _transformHostSelector(selector, hostScope) {\n let m = selector.match(HOST_PAREN);\n let paren = m && m[2].trim() || '';\n if (paren) {\n if (!paren[0].match(SIMPLE_SELECTOR_PREFIX)) {\n // paren starts with a type selector\n let typeSelector = paren.split(SIMPLE_SELECTOR_PREFIX)[0];\n // if the type selector is our hostScope then avoid pre-pending it\n if (typeSelector === hostScope) {\n return paren;\n // otherwise, this selector should not match in this scope so\n // output a bogus selector.\n } else {\n return SELECTOR_NO_MATCH;\n }\n } else {\n // make sure to do a replace here to catch selectors like:\n // `:host(.foo)::before`\n return selector.replace(HOST_PAREN, function(m, host, paren) {\n return hostScope + paren;\n });\n }\n // if no paren, do a straight :host replacement.\n // TODO(sorvell): this should not strictly be necessary but\n // it's needed to maintain support for `:host[foo]` type selectors\n // which have been improperly used under Shady DOM. This should be\n // deprecated.\n } else {\n return selector.replace(HOST, hostScope);\n }\n }\n\n /**\n * @param {StyleNode} rule\n */\n documentRule(rule) {\n // reset selector in case this is redone.\n rule['selector'] = rule['parsedSelector'];\n this.normalizeRootSelector(rule);\n this._transformRule(rule, this._transformDocumentSelector);\n }\n\n /**\n * @param {StyleNode} rule\n */\n normalizeRootSelector(rule) {\n if (rule['selector'] === ROOT) {\n rule['selector'] = 'html';\n }\n }\n\n/**\n * @param {string} selector\n */\n _transformDocumentSelector(selector) {\n return selector.match(SLOTTED) ?\n this._transformComplexSelector(selector, SCOPE_DOC_SELECTOR) :\n this._transformSimpleSelector(selector.trim(), SCOPE_DOC_SELECTOR);\n }\n}\n\nlet NTH = /:(nth[-\\w]+)\\(([^)]+)\\)/;\nlet SCOPE_DOC_SELECTOR = `:not(.${SCOPE_NAME})`;\nlet COMPLEX_SELECTOR_SEP = ',';\nlet SIMPLE_SELECTOR_SEP = /(^|[\\s>+~]+)((?:\\[.+?\\]|[^\\s>+~=[])+)/g;\nlet SIMPLE_SELECTOR_PREFIX = /[[.:#*]/;\nlet HOST = ':host';\nlet ROOT = ':root';\nlet SLOTTED = '::slotted';\nlet SLOTTED_START = new RegExp(`^(${SLOTTED})`);\n// NOTE: this supports 1 nested () pair for things like\n// :host(:not([selected]), more general support requires\n// parsing which seems like overkill\nlet HOST_PAREN = /(:host)(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))/;\n// similar to HOST_PAREN\nlet SLOTTED_PAREN = /(?:::slotted)(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))/;\nlet DIR_PAREN = /(.*):dir\\((?:(ltr|rtl))\\)/;\nlet CSS_CLASS_PREFIX = '.';\nlet PSEUDO_PREFIX = ':';\nlet CLASS = 'class';\nlet SELECTOR_NO_MATCH = 'should_not_match';\n\nexport default new StyleTransformer()\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {nativeShadow} from './style-settings.js';\nimport StyleTransformer from './style-transformer.js';\nimport {getIsExtends} from './style-util.js';\n\nexport let flush = function() {};\n\n/**\n * @param {HTMLElement} element\n * @return {!Array<string>}\n */\nfunction getClasses(element) {\n let classes = [];\n if (element.classList) {\n classes = Array.from(element.classList);\n } else if (element instanceof window['SVGElement'] && element.hasAttribute('class')) {\n classes = element.getAttribute('class').split(/\\s+/);\n }\n return classes;\n}\n\n/**\n * @param {HTMLElement} element\n * @return {string}\n */\nfunction getCurrentScope(element) {\n let classes = getClasses(element);\n let idx = classes.indexOf(StyleTransformer.SCOPE_NAME);\n if (idx > -1) {\n return classes[idx + 1];\n }\n return '';\n}\n\n/**\n * @param {Array<MutationRecord|null>|null} mxns\n */\nfunction handler(mxns) {\n for (let x=0; x < mxns.length; x++) {\n let mxn = mxns[x];\n if (mxn.target === document.documentElement ||\n mxn.target === document.head) {\n continue;\n }\n for (let i=0; i < mxn.addedNodes.length; i++) {\n let n = mxn.addedNodes[i];\n if (n.nodeType !== Node.ELEMENT_NODE) {\n continue;\n }\n n = /** @type {HTMLElement} */(n); // eslint-disable-line no-self-assign\n let root = n.getRootNode();\n let currentScope = getCurrentScope(n);\n // node was scoped, but now is in document\n if (currentScope && root === n.ownerDocument) {\n StyleTransformer.dom(n, currentScope, true);\n } else if (root.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n let newScope;\n let host = /** @type {ShadowRoot} */(root).host;\n // element may no longer be in a shadowroot\n if (!host) {\n continue;\n }\n newScope = getIsExtends(host).is;\n if (currentScope === newScope) {\n // make sure all the subtree elements are scoped correctly\n let unscoped = window['ShadyDOM']['nativeMethods']['querySelectorAll'].call(\n n, `:not(.${StyleTransformer.SCOPE_NAME})`);\n for (let j = 0; j < unscoped.length; j++) {\n StyleTransformer.element(unscoped[j], currentScope);\n }\n continue;\n }\n if (currentScope) {\n StyleTransformer.dom(n, currentScope, true);\n }\n StyleTransformer.dom(n, newScope);\n }\n }\n }\n}\n\nif (!nativeShadow) {\n let observer = new MutationObserver(handler);\n let start = (node) => {\n observer.observe(node, {childList: true, subtree: true});\n }\n let nativeCustomElements = (window['customElements'] &&\n !window['customElements']['polyfillWrapFlushCallback']);\n // need to start immediately with native custom elements\n // TODO(dfreedm): with polyfilled HTMLImports and native custom elements\n // excessive mutations may be observed; this can be optimized via cooperation\n // with the HTMLImports polyfill.\n if (nativeCustomElements) {\n start(document);\n } else {\n let delayedStart = () => {\n start(document.body);\n }\n // use polyfill timing if it's available\n if (window['HTMLImports']) {\n window['HTMLImports']['whenReady'](delayedStart);\n // otherwise push beyond native imports being ready\n // which requires RAF + readystate interactive.\n } else {\n requestAnimationFrame(function() {\n if (document.readyState === 'loading') {\n let listener = function() {\n delayedStart();\n document.removeEventListener('readystatechange', listener);\n }\n document.addEventListener('readystatechange', listener);\n } else {\n delayedStart();\n }\n });\n }\n }\n\n flush = function() {\n handler(observer.takeRecords());\n }\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\n\n/** @const {string} */\nconst infoKey = '__styleInfo';\n\nexport default class StyleInfo {\n /**\n * @param {Element} node\n * @return {StyleInfo}\n */\n static get(node) {\n if (node) {\n return node[infoKey];\n } else {\n return null;\n }\n }\n /**\n * @param {!Element} node\n * @param {StyleInfo} styleInfo\n * @return {StyleInfo}\n */\n static set(node, styleInfo) {\n node[infoKey] = styleInfo;\n return styleInfo;\n }\n /**\n * @param {StyleNode} ast\n * @param {Node=} placeholder\n * @param {Array<string>=} ownStylePropertyNames\n * @param {string=} elementName\n * @param {string=} typeExtension\n * @param {string=} cssBuild\n */\n constructor(ast, placeholder, ownStylePropertyNames, elementName, typeExtension, cssBuild) {\n /** @type {StyleNode} */\n this.styleRules = ast || null;\n /** @type {Node} */\n this.placeholder = placeholder || null;\n /** @type {!Array<string>} */\n this.ownStylePropertyNames = ownStylePropertyNames || [];\n /** @type {Array<Object>} */\n this.overrideStyleProperties = null;\n /** @type {string} */\n this.elementName = elementName || '';\n /** @type {string} */\n this.cssBuild = cssBuild || '';\n /** @type {string} */\n this.typeExtension = typeExtension || '';\n /** @type {Object<string, string>} */\n this.styleProperties = null;\n /** @type {?string} */\n this.scopeSelector = null;\n /** @type {HTMLStyleElement} */\n this.customStyle = null;\n }\n _getStyleRules() {\n return this.styleRules;\n }\n}\n\nStyleInfo.prototype['_getStyleRules'] = StyleInfo.prototype._getStyleRules;","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {removeCustomPropAssignment, StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\nimport {nativeShadow} from './style-settings.js';\nimport StyleTransformer from './style-transformer.js';\nimport * as StyleUtil from './style-util.js';\nimport * as RX from './common-regex.js';\nimport StyleInfo from './style-info.js';\n\n// TODO: dedupe with shady\n/**\n * @param {string} selector\n * @return {boolean}\n * @this {Element}\n */\nconst matchesSelector = function(selector) {\n const method = this.matches || this.matchesSelector ||\n this.mozMatchesSelector || this.msMatchesSelector ||\n this.oMatchesSelector || this.webkitMatchesSelector;\n return method && method.call(this, selector);\n};\n\nconst IS_IE = navigator.userAgent.match('Trident');\n\nconst XSCOPE_NAME = 'x-scope';\n\nclass StyleProperties {\n get XSCOPE_NAME() {\n return XSCOPE_NAME;\n }\n/**\n * decorates styles with rule info and returns an array of used style property names\n *\n * @param {StyleNode} rules\n * @return {Array<string>}\n */\n decorateStyles(rules) {\n let self = this, props = {}, keyframes = [], ruleIndex = 0;\n StyleUtil.forEachRule(rules, function(rule) {\n self.decorateRule(rule);\n // mark in-order position of ast rule in styles block, used for cache key\n rule.index = ruleIndex++;\n self.collectPropertiesInCssText(rule.propertyInfo.cssText, props);\n }, function onKeyframesRule(rule) {\n keyframes.push(rule);\n });\n // Cache all found keyframes rules for later reference:\n rules._keyframes = keyframes;\n // return this list of property names *consumes* in these styles.\n let names = [];\n for (let i in props) {\n names.push(i);\n }\n return names;\n }\n\n // decorate a single rule with property info\n decorateRule(rule) {\n if (rule.propertyInfo) {\n return rule.propertyInfo;\n }\n let info = {}, properties = {};\n let hasProperties = this.collectProperties(rule, properties);\n if (hasProperties) {\n info.properties = properties;\n // TODO(sorvell): workaround parser seeing mixins as additional rules\n rule['rules'] = null;\n }\n info.cssText = this.collectCssText(rule);\n rule.propertyInfo = info;\n return info;\n }\n\n // collects the custom properties from a rule's cssText\n collectProperties(rule, properties) {\n let info = rule.propertyInfo;\n if (info) {\n if (info.properties) {\n Object.assign(properties, info.properties);\n return true;\n }\n } else {\n let m, rx = RX.VAR_ASSIGN;\n let cssText = rule['parsedCssText'];\n let value;\n let any;\n while ((m = rx.exec(cssText))) {\n // note: group 2 is var, 3 is mixin\n value = (m[2] || m[3]).trim();\n // value of 'inherit' or 'unset' is equivalent to not setting the property here\n if (value !== 'inherit' || value !== 'unset') {\n properties[m[1].trim()] = value;\n }\n any = true;\n }\n return any;\n }\n\n }\n\n // returns cssText of properties that consume variables/mixins\n collectCssText(rule) {\n return this.collectConsumingCssText(rule['parsedCssText']);\n }\n\n // NOTE: we support consumption inside mixin assignment\n // but not production, so strip out {...}\n collectConsumingCssText(cssText) {\n return cssText.replace(RX.BRACKETED, '')\n .replace(RX.VAR_ASSIGN, '');\n }\n\n collectPropertiesInCssText(cssText, props) {\n let m;\n while ((m = RX.VAR_CONSUMED.exec(cssText))) {\n let name = m[1];\n // This regex catches all variable names, and following non-whitespace char\n // If next char is not ':', then variable is a consumer\n if (m[2] !== ':') {\n props[name] = true;\n }\n }\n }\n\n // turns custom properties into realized values.\n reify(props) {\n // big perf optimization here: reify only *own* properties\n // since this object has __proto__ of the element's scope properties\n let names = Object.getOwnPropertyNames(props);\n for (let i=0, n; i < names.length; i++) {\n n = names[i];\n props[n] = this.valueForProperty(props[n], props);\n }\n }\n\n // given a property value, returns the reified value\n // a property value may be:\n // (1) a literal value like: red or 5px;\n // (2) a variable value like: var(--a), var(--a, red), or var(--a, --b) or\n // var(--a, var(--b));\n // (3) a literal mixin value like { properties }. Each of these properties\n // can have values that are: (a) literal, (b) variables, (c) @apply mixins.\n valueForProperty(property, props) {\n // case (1) default\n // case (3) defines a mixin and we have to reify the internals\n if (property) {\n if (property.indexOf(';') >=0) {\n property = this.valueForProperties(property, props);\n } else {\n // case (2) variable\n let self = this;\n let fn = function(prefix, value, fallback, suffix) {\n if (!value) {\n return prefix + suffix;\n }\n let propertyValue = self.valueForProperty(props[value], props);\n // if value is \"initial\", then the variable should be treated as unset\n if (!propertyValue || propertyValue === 'initial') {\n // fallback may be --a or var(--a) or literal\n propertyValue = self.valueForProperty(props[fallback] || fallback, props) ||\n fallback;\n } else if (propertyValue === 'apply-shim-inherit') {\n // CSS build will replace `inherit` with `apply-shim-inherit`\n // for use with native css variables.\n // Since we have full control, we can use `inherit` directly.\n propertyValue = 'inherit';\n }\n return prefix + (propertyValue || '') + suffix;\n };\n property = StyleUtil.processVariableAndFallback(property, fn);\n }\n }\n return property && property.trim() || '';\n }\n\n // note: we do not yet support mixin within mixin\n valueForProperties(property, props) {\n let parts = property.split(';');\n for (let i=0, p, m; i<parts.length; i++) {\n if ((p = parts[i])) {\n RX.MIXIN_MATCH.lastIndex = 0;\n m = RX.MIXIN_MATCH.exec(p);\n if (m) {\n p = this.valueForProperty(props[m[1]], props);\n } else {\n let colon = p.indexOf(':');\n if (colon !== -1) {\n let pp = p.substring(colon);\n pp = pp.trim();\n pp = this.valueForProperty(pp, props) || pp;\n p = p.substring(0, colon) + pp;\n }\n }\n parts[i] = (p && p.lastIndexOf(';') === p.length - 1) ?\n // strip trailing ;\n p.slice(0, -1) :\n p || '';\n }\n }\n return parts.join(';');\n }\n\n applyProperties(rule, props) {\n let output = '';\n // dynamically added sheets may not be decorated so ensure they are.\n if (!rule.propertyInfo) {\n this.decorateRule(rule);\n }\n if (rule.propertyInfo.cssText) {\n output = this.valueForProperties(rule.propertyInfo.cssText, props);\n }\n rule['cssText'] = output;\n }\n\n // Apply keyframe transformations to the cssText of a given rule. The\n // keyframeTransforms object is a map of keyframe names to transformer\n // functions which take in cssText and spit out transformed cssText.\n applyKeyframeTransforms(rule, keyframeTransforms) {\n let input = rule['cssText'];\n let output = rule['cssText'];\n if (rule.hasAnimations == null) {\n // Cache whether or not the rule has any animations to begin with:\n rule.hasAnimations = RX.ANIMATION_MATCH.test(input);\n }\n // If there are no animations referenced, we can skip transforms:\n if (rule.hasAnimations) {\n let transform;\n // If we haven't transformed this rule before, we iterate over all\n // transforms:\n if (rule.keyframeNamesToTransform == null) {\n rule.keyframeNamesToTransform = [];\n for (let keyframe in keyframeTransforms) {\n transform = keyframeTransforms[keyframe];\n output = transform(input);\n // If the transform actually changed the CSS text, we cache the\n // transform name for future use:\n if (input !== output) {\n input = output;\n rule.keyframeNamesToTransform.push(keyframe);\n }\n }\n } else {\n // If we already have a list of keyframe names that apply to this\n // rule, we apply only those keyframe name transforms:\n for (let i = 0; i < rule.keyframeNamesToTransform.length; ++i) {\n transform = keyframeTransforms[rule.keyframeNamesToTransform[i]];\n input = transform(input);\n }\n output = input;\n }\n }\n rule['cssText'] = output;\n }\n\n // Test if the rules in these styles matches the given `element` and if so,\n // collect any custom properties into `props`.\n /**\n * @param {StyleNode} rules\n * @param {Element} element\n */\n propertyDataFromStyles(rules, element) {\n let props = {}, self = this;\n // generates a unique key for these matches\n let o = [];\n // note: active rules excludes non-matching @media rules\n StyleUtil.forEachRule(rules, function(rule) {\n // TODO(sorvell): we could trim the set of rules at declaration\n // time to only include ones that have properties\n if (!rule.propertyInfo) {\n self.decorateRule(rule);\n }\n // match element against transformedSelector: selector may contain\n // unwanted uniquification and parsedSelector does not directly match\n // for :host selectors.\n let selectorToMatch = rule.transformedSelector || rule['parsedSelector'];\n if (element && rule.propertyInfo.properties && selectorToMatch) {\n if (matchesSelector.call(element, selectorToMatch)) {\n self.collectProperties(rule, props);\n // produce numeric key for these matches for lookup\n addToBitMask(rule.index, o);\n }\n }\n }, null, true);\n return {properties: props, key: o};\n }\n\n /**\n * @param {Element} scope\n * @param {StyleNode} rule\n * @param {string|undefined} cssBuild\n * @param {function(Object)} callback\n */\n whenHostOrRootRule(scope, rule, cssBuild, callback) {\n if (!rule.propertyInfo) {\n this.decorateRule(rule);\n }\n if (!rule.propertyInfo.properties) {\n return;\n }\n let {is, typeExtension} = StyleUtil.getIsExtends(scope);\n let hostScope = is ?\n StyleTransformer._calcHostScope(is, typeExtension) :\n 'html';\n let parsedSelector = rule['parsedSelector'];\n let isRoot = (parsedSelector === ':host > *' || parsedSelector === 'html');\n let isHost = parsedSelector.indexOf(':host') === 0 && !isRoot;\n // build info is either in scope (when scope is an element) or in the style\n // when scope is the default scope; note: this allows default scope to have\n // mixed mode built and unbuilt styles.\n if (cssBuild === 'shady') {\n // :root -> x-foo > *.x-foo for elements and html for custom-style\n isRoot = parsedSelector === (hostScope + ' > *.' + hostScope) || parsedSelector.indexOf('html') !== -1;\n // :host -> x-foo for elements, but sub-rules have .x-foo in them\n isHost = !isRoot && parsedSelector.indexOf(hostScope) === 0;\n }\n if (cssBuild === 'shadow') {\n isRoot = parsedSelector === ':host > *' || parsedSelector === 'html';\n isHost = isHost && !isRoot;\n }\n if (!isRoot && !isHost) {\n return;\n }\n let selectorToMatch = hostScope;\n if (isHost) {\n // need to transform :host because `:host` does not work with `matches`\n if (!rule.transformedSelector) {\n // transform :host into a matchable selector\n rule.transformedSelector =\n StyleTransformer._transformRuleCss(\n rule,\n StyleTransformer._transformComplexSelector,\n StyleTransformer._calcElementScope(is),\n hostScope\n );\n }\n selectorToMatch = rule.transformedSelector || hostScope;\n }\n callback({\n selector: selectorToMatch,\n isHost: isHost,\n isRoot: isRoot\n });\n }\n/**\n * @param {Element} scope\n * @param {StyleNode} rules\n * @return {Object}\n */\n hostAndRootPropertiesForScope(scope, rules) {\n let hostProps = {}, rootProps = {}, self = this;\n // note: active rules excludes non-matching @media rules\n let cssBuild = rules && rules['__cssBuild'];\n StyleUtil.forEachRule(rules, function(rule) {\n // if scope is StyleDefaults, use _element for matchesSelector\n self.whenHostOrRootRule(scope, rule, cssBuild, function(info) {\n let element = scope._element || scope;\n if (matchesSelector.call(element, info.selector)) {\n if (info.isHost) {\n self.collectProperties(rule, hostProps);\n } else {\n self.collectProperties(rule, rootProps);\n }\n }\n });\n }, null, true);\n return {rootProps: rootProps, hostProps: hostProps};\n }\n\n /**\n * @param {Element} element\n * @param {Object} properties\n * @param {string} scopeSelector\n */\n transformStyles(element, properties, scopeSelector) {\n let self = this;\n let {is, typeExtension} = StyleUtil.getIsExtends(element);\n let hostSelector = StyleTransformer\n ._calcHostScope(is, typeExtension);\n let rxHostSelector = element.extends ?\n '\\\\' + hostSelector.slice(0, -1) + '\\\\]' :\n hostSelector;\n let hostRx = new RegExp(RX.HOST_PREFIX + rxHostSelector +\n RX.HOST_SUFFIX);\n let rules = StyleInfo.get(element).styleRules;\n let keyframeTransforms =\n this._elementKeyframeTransforms(element, rules, scopeSelector);\n return StyleTransformer.elementStyles(element, rules, function(rule) {\n self.applyProperties(rule, properties);\n if (!nativeShadow &&\n !StyleUtil.isKeyframesSelector(rule) &&\n rule['cssText']) {\n // NOTE: keyframe transforms only scope munge animation names, so it\n // is not necessary to apply them in ShadowDOM.\n self.applyKeyframeTransforms(rule, keyframeTransforms);\n self._scopeSelector(rule, hostRx, hostSelector, scopeSelector);\n }\n });\n }\n\n /**\n * @param {Element} element\n * @param {StyleNode} rules\n * @param {string} scopeSelector\n * @return {Object}\n */\n _elementKeyframeTransforms(element, rules, scopeSelector) {\n let keyframesRules = rules._keyframes;\n let keyframeTransforms = {};\n if (!nativeShadow && keyframesRules) {\n // For non-ShadowDOM, we transform all known keyframes rules in\n // advance for the current scope. This allows us to catch keyframes\n // rules that appear anywhere in the stylesheet:\n for (let i = 0, keyframesRule = keyframesRules[i];\n i < keyframesRules.length;\n keyframesRule = keyframesRules[++i]) {\n this._scopeKeyframes(keyframesRule, scopeSelector);\n keyframeTransforms[keyframesRule['keyframesName']] =\n this._keyframesRuleTransformer(keyframesRule);\n }\n }\n return keyframeTransforms;\n }\n\n // Generate a factory for transforming a chunk of CSS text to handle a\n // particular scoped keyframes rule.\n /**\n * @param {StyleNode} keyframesRule\n * @return {function(string):string}\n */\n _keyframesRuleTransformer(keyframesRule) {\n return function(cssText) {\n return cssText.replace(\n keyframesRule.keyframesNameRx,\n keyframesRule.transformedKeyframesName);\n };\n }\n\n/**\n * Transforms `@keyframes` names to be unique for the current host.\n * Example: @keyframes foo-anim -> @keyframes foo-anim-x-foo-0\n *\n * @param {StyleNode} rule\n * @param {string} scopeId\n */\n _scopeKeyframes(rule, scopeId) {\n // Animation names are of the form [\\w-], so ensure that the name regex does not partially apply\n // to similarly named keyframe names by checking for a word boundary at the beginning and\n // a non-word boundary or `-` at the end.\n rule.keyframesNameRx = new RegExp(`\\\\b${rule['keyframesName']}(?!\\\\B|-)`, 'g');\n rule.transformedKeyframesName = rule['keyframesName'] + '-' + scopeId;\n rule.transformedSelector = rule.transformedSelector || rule['selector'];\n rule['selector'] = rule.transformedSelector.replace(\n rule['keyframesName'], rule.transformedKeyframesName);\n }\n\n // Strategy: x scope shim a selector e.g. to scope `.x-foo-42` (via classes):\n // non-host selector: .a.x-foo -> .x-foo-42 .a.x-foo\n // host selector: x-foo.wide -> .x-foo-42.wide\n // note: we use only the scope class (.x-foo-42) and not the hostSelector\n // (x-foo) to scope :host rules; this helps make property host rules\n // have low specificity. They are overrideable by class selectors but,\n // unfortunately, not by type selectors (e.g. overriding via\n // `.special` is ok, but not by `x-foo`).\n /**\n * @param {StyleNode} rule\n * @param {RegExp} hostRx\n * @param {string} hostSelector\n * @param {string} scopeId\n */\n _scopeSelector(rule, hostRx, hostSelector, scopeId) {\n rule.transformedSelector = rule.transformedSelector || rule['selector'];\n let selector = rule.transformedSelector;\n let scope = '.' + scopeId;\n let parts = selector.split(',');\n for (let i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n parts[i] = p.match(hostRx) ?\n p.replace(hostSelector, scope) :\n scope + ' ' + p;\n }\n rule['selector'] = parts.join(',');\n }\n\n /**\n * @param {Element} element\n * @param {string} selector\n * @param {string} old\n */\n applyElementScopeSelector(element, selector, old) {\n let c = element.getAttribute('class') || '';\n let v = c;\n if (old) {\n v = c.replace(\n new RegExp('\\\\s*' + XSCOPE_NAME + '\\\\s*' + old + '\\\\s*', 'g'), ' ');\n }\n v += (v ? ' ' : '') + XSCOPE_NAME + ' ' + selector;\n if (c !== v) {\n StyleUtil.setElementClassRaw(element, v);\n }\n }\n\n /**\n * @param {HTMLElement} element\n * @param {Object} properties\n * @param {string} selector\n * @param {HTMLStyleElement} style\n * @return {HTMLStyleElement}\n */\n applyElementStyle(element, properties, selector, style) {\n // calculate cssText to apply\n let cssText = style ? style.textContent || '' :\n this.transformStyles(element, properties, selector);\n // if shady and we have a cached style that is not style, decrement\n let styleInfo = StyleInfo.get(element);\n let s = styleInfo.customStyle;\n if (s && !nativeShadow && (s !== style)) {\n s['_useCount']--;\n if (s['_useCount'] <= 0 && s.parentNode) {\n s.parentNode.removeChild(s);\n }\n }\n // apply styling always under native or if we generated style\n // or the cached style is not in document(!)\n if (nativeShadow) {\n // update existing style only under native\n if (styleInfo.customStyle) {\n styleInfo.customStyle.textContent = cssText;\n style = styleInfo.customStyle;\n // otherwise, if we have css to apply, do so\n } else if (cssText) {\n // apply css after the scope style of the element to help with\n // style precedence rules.\n style = StyleUtil.applyCss(cssText, selector, element.shadowRoot,\n styleInfo.placeholder);\n }\n } else {\n // shady and no cache hit\n if (!style) {\n // apply css after the scope style of the element to help with\n // style precedence rules.\n if (cssText) {\n style = StyleUtil.applyCss(cssText, selector, null,\n styleInfo.placeholder);\n }\n // shady and cache hit but not in document\n } else if (!style.parentNode) {\n if (IS_IE && cssText.indexOf('@media') > -1) {\n // @media rules may be stale in IE 10 and 11\n // refresh the text content of the style to revalidate them.\n style.textContent = cssText;\n }\n StyleUtil.applyStyle(style, null, styleInfo.placeholder);\n }\n }\n // ensure this style is our custom style and increment its use count.\n if (style) {\n style['_useCount'] = style['_useCount'] || 0;\n // increment use count if we changed styles\n if (styleInfo.customStyle != style) {\n style['_useCount']++;\n }\n styleInfo.customStyle = style;\n }\n return style;\n }\n\n /**\n * @param {Element} style\n * @param {Object} properties\n */\n applyCustomStyle(style, properties) {\n let rules = StyleUtil.rulesForStyle(/** @type {HTMLStyleElement} */(style));\n let self = this;\n style.textContent = StyleUtil.toCssText(rules, function(/** StyleNode */rule) {\n let css = rule['cssText'] = rule['parsedCssText'];\n if (rule.propertyInfo && rule.propertyInfo.cssText) {\n // remove property assignments\n // so next function isn't confused\n // NOTE: we have 3 categories of css:\n // (1) normal properties,\n // (2) custom property assignments (--foo: red;),\n // (3) custom property usage: border: var(--foo); @apply(--foo);\n // In elements, 1 and 3 are separated for efficiency; here they\n // are not and this makes this case unique.\n css = removeCustomPropAssignment(/** @type {string} */(css));\n // replace with reified properties, scenario is same as mixin\n rule['cssText'] = self.valueForProperties(css, properties);\n }\n });\n }\n}\n\n/**\n * @param {number} n\n * @param {Array<number>} bits\n */\nfunction addToBitMask(n, bits) {\n let o = parseInt(n / 32, 10);\n let v = 1 << (n % 32);\n bits[o] = (bits[o] || 0) | v;\n}\n\nexport default new StyleProperties();","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {applyStylePlaceHolder} from './style-util.js';\nimport {nativeShadow} from './style-settings.js';\n\n/** @type {Object<string, !Node>} */\nlet placeholderMap = {};\n\n/**\n * @const {CustomElementRegistry}\n */\nconst ce = window['customElements'];\nif (ce && !nativeShadow) {\n /**\n * @const {function(this:CustomElementRegistry, string,function(new:HTMLElement),{extends: string}=)}\n */\n const origDefine = ce['define'];\n /**\n * @param {string} name\n * @param {function(new:HTMLElement)} clazz\n * @param {{extends: string}=} options\n */\n const wrappedDefine = (name, clazz, options) => {\n placeholderMap[name] = applyStylePlaceHolder(name);\n origDefine.call(/** @type {!CustomElementRegistry} */(ce), name, clazz, options);\n };\n ce['define'] = wrappedDefine;\n}\n\nexport default placeholderMap;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {parse, StyleNode} from './css-parse.js';\nimport {nativeShadow, nativeCssVariables} from './style-settings.js';\nimport StyleTransformer from './style-transformer.js';\nimport * as StyleUtil from './style-util.js';\nimport StyleProperties from './style-properties.js';\nimport placeholderMap from './style-placeholder.js';\nimport StyleInfo from './style-info.js';\nimport StyleCache from './style-cache.js';\nimport {flush as watcherFlush} from './document-watcher.js';\nimport templateMap from './template-map.js';\nimport * as ApplyShimUtils from './apply-shim-utils.js';\nimport {updateNativeProperties, detectMixin} from './common-utils.js';\nimport {CustomStyleInterfaceInterface} from './custom-style-interface.js'; // eslint-disable-line no-unused-vars\n\n/**\n * @const {StyleCache}\n */\nconst styleCache = new StyleCache();\n\nexport default class ScopingShim {\n constructor() {\n this._scopeCounter = {};\n this._documentOwner = document.documentElement;\n let ast = new StyleNode();\n ast['rules'] = [];\n this._documentOwnerStyleInfo = StyleInfo.set(this._documentOwner, new StyleInfo(ast));\n this._elementsHaveApplied = false;\n this._applyShim = null;\n /** @type {?CustomStyleInterfaceInterface} */\n this._customStyleInterface = null;\n }\n flush() {\n watcherFlush();\n }\n _generateScopeSelector(name) {\n let id = this._scopeCounter[name] = (this._scopeCounter[name] || 0) + 1;\n return `${name}-${id}`;\n }\n getStyleAst(style) {\n return StyleUtil.rulesForStyle(style);\n }\n styleAstToString(ast) {\n return StyleUtil.toCssText(ast);\n }\n _gatherStyles(template) {\n return StyleUtil.gatherStyleText(template.content);\n }\n _getCssBuild(template) {\n let style = template.content.querySelector('style');\n if (!style) {\n return '';\n }\n return style.getAttribute('css-build') || '';\n }\n /**\n * Prepare the styling and template for the given element type\n *\n * @param {HTMLTemplateElement} template\n * @param {string} elementName\n * @param {string=} typeExtension\n */\n prepareTemplate(template, elementName, typeExtension) {\n if (template._prepared) {\n return;\n }\n template._prepared = true;\n template.name = elementName;\n template.extends = typeExtension;\n templateMap[elementName] = template;\n let cssBuild = this._getCssBuild(template);\n let cssText = this._gatherStyles(template);\n let info = {\n is: elementName,\n extends: typeExtension,\n __cssBuild: cssBuild,\n };\n if (!nativeShadow) {\n StyleTransformer.dom(template.content, elementName);\n }\n // check if the styling has mixin definitions or uses\n this._ensure();\n let hasMixins = detectMixin(cssText)\n let ast = parse(cssText);\n // only run the applyshim transforms if there is a mixin involved\n if (hasMixins && nativeCssVariables && this._applyShim) {\n this._applyShim['transformRules'](ast, elementName);\n }\n template['_styleAst'] = ast;\n template._cssBuild = cssBuild;\n\n let ownPropertyNames = [];\n if (!nativeCssVariables) {\n ownPropertyNames = StyleProperties.decorateStyles(template['_styleAst']);\n }\n if (!ownPropertyNames.length || nativeCssVariables) {\n let root = nativeShadow ? template.content : null;\n let placeholder = placeholderMap[elementName];\n let style = this._generateStaticStyle(info, template['_styleAst'], root, placeholder);\n template._style = style;\n }\n template._ownPropertyNames = ownPropertyNames;\n }\n _generateStaticStyle(info, rules, shadowroot, placeholder) {\n let cssText = StyleTransformer.elementStyles(info, rules);\n if (cssText.length) {\n return StyleUtil.applyCss(cssText, info.is, shadowroot, placeholder);\n }\n }\n _prepareHost(host) {\n let {is, typeExtension} = StyleUtil.getIsExtends(host);\n let placeholder = placeholderMap[is];\n let template = templateMap[is];\n let ast;\n let ownStylePropertyNames;\n let cssBuild;\n if (template) {\n ast = template['_styleAst'];\n ownStylePropertyNames = template._ownPropertyNames;\n cssBuild = template._cssBuild;\n }\n return StyleInfo.set(host,\n new StyleInfo(\n ast,\n placeholder,\n ownStylePropertyNames,\n is,\n typeExtension,\n cssBuild\n )\n );\n }\n _ensureApplyShim() {\n if (this._applyShim) {\n return;\n } else if (window.ShadyCSS && window.ShadyCSS.ApplyShim) {\n this._applyShim = window.ShadyCSS.ApplyShim;\n this._applyShim['invalidCallback'] = ApplyShimUtils.invalidate;\n }\n }\n _ensureCustomStyleInterface() {\n if (this._customStyleInterface) {\n return;\n } else if (window.ShadyCSS && window.ShadyCSS.CustomStyleInterface) {\n this._customStyleInterface = /** @type {!CustomStyleInterfaceInterface} */(window.ShadyCSS.CustomStyleInterface);\n /** @type {function(!HTMLStyleElement)} */\n this._customStyleInterface['transformCallback'] = (style) => {this.transformCustomStyleForDocument(style)};\n this._customStyleInterface['validateCallback'] = () => {\n requestAnimationFrame(() => {\n if (this._customStyleInterface['enqueued'] || this._elementsHaveApplied) {\n this.flushCustomStyles();\n }\n })\n };\n }\n }\n _ensure() {\n this._ensureApplyShim();\n this._ensureCustomStyleInterface();\n }\n /**\n * Flush and apply custom styles to document\n */\n flushCustomStyles() {\n this._ensure();\n if (!this._customStyleInterface) {\n return;\n }\n let customStyles = this._customStyleInterface['processStyles']();\n // early return if custom-styles don't need validation\n if (!this._customStyleInterface['enqueued']) {\n return;\n }\n if (!nativeCssVariables) {\n this._updateProperties(this._documentOwner, this._documentOwnerStyleInfo);\n this._applyCustomStyles(customStyles);\n } else {\n this._revalidateCustomStyleApplyShim(customStyles);\n }\n this._customStyleInterface['enqueued'] = false;\n // if custom elements have upgraded and there are no native css variables, we must recalculate the whole tree\n if (this._elementsHaveApplied && !nativeCssVariables) {\n this.styleDocument();\n }\n }\n /**\n * Apply styles for the given element\n *\n * @param {!HTMLElement} host\n * @param {Object=} overrideProps\n */\n styleElement(host, overrideProps) {\n let {is} = StyleUtil.getIsExtends(host);\n let styleInfo = StyleInfo.get(host);\n if (!styleInfo) {\n styleInfo = this._prepareHost(host);\n }\n // Only trip the `elementsHaveApplied` flag if a node other that the root document has `applyStyle` called\n if (!this._isRootOwner(host)) {\n this._elementsHaveApplied = true;\n }\n if (overrideProps) {\n styleInfo.overrideStyleProperties =\n styleInfo.overrideStyleProperties || {};\n Object.assign(styleInfo.overrideStyleProperties, overrideProps);\n }\n if (!nativeCssVariables) {\n this._updateProperties(host, styleInfo);\n if (styleInfo.ownStylePropertyNames && styleInfo.ownStylePropertyNames.length) {\n this._applyStyleProperties(host, styleInfo);\n }\n } else {\n if (styleInfo.overrideStyleProperties) {\n updateNativeProperties(host, styleInfo.overrideStyleProperties);\n }\n let template = templateMap[is];\n // bail early if there is no shadowroot for this element\n if (!template && !this._isRootOwner(host)) {\n return;\n }\n if (template && template._style && !ApplyShimUtils.templateIsValid(template)) {\n // update template\n if (!ApplyShimUtils.templateIsValidating(template)) {\n this._ensure();\n this._applyShim && this._applyShim['transformRules'](template['_styleAst'], is);\n template._style.textContent = StyleTransformer.elementStyles(host, styleInfo.styleRules);\n ApplyShimUtils.startValidatingTemplate(template);\n }\n // update instance if native shadowdom\n if (nativeShadow) {\n let root = host.shadowRoot;\n if (root) {\n let style = root.querySelector('style');\n style.textContent = StyleTransformer.elementStyles(host, styleInfo.styleRules);\n }\n }\n styleInfo.styleRules = template['_styleAst'];\n }\n }\n }\n _styleOwnerForNode(node) {\n let root = node.getRootNode();\n let host = root.host;\n if (host) {\n if (StyleInfo.get(host)) {\n return host;\n } else {\n return this._styleOwnerForNode(host);\n }\n }\n return this._documentOwner;\n }\n _isRootOwner(node) {\n return (node === this._documentOwner);\n }\n _applyStyleProperties(host, styleInfo) {\n let is = StyleUtil.getIsExtends(host).is;\n let cacheEntry = styleCache.fetch(is, styleInfo.styleProperties, styleInfo.ownStylePropertyNames);\n let cachedScopeSelector = cacheEntry && cacheEntry.scopeSelector;\n let cachedStyle = cacheEntry ? cacheEntry.styleElement : null;\n let oldScopeSelector = styleInfo.scopeSelector;\n // only generate new scope if cached style is not found\n styleInfo.scopeSelector = cachedScopeSelector || this._generateScopeSelector(is);\n let style = StyleProperties.applyElementStyle(host, styleInfo.styleProperties, styleInfo.scopeSelector, cachedStyle);\n if (!nativeShadow) {\n StyleProperties.applyElementScopeSelector(host, styleInfo.scopeSelector, oldScopeSelector);\n }\n if (!cacheEntry) {\n styleCache.store(is, styleInfo.styleProperties, style, styleInfo.scopeSelector);\n }\n return style;\n }\n _updateProperties(host, styleInfo) {\n let owner = this._styleOwnerForNode(host);\n let ownerStyleInfo = StyleInfo.get(owner);\n let ownerProperties = ownerStyleInfo.styleProperties;\n let props = Object.create(ownerProperties || null);\n let hostAndRootProps = StyleProperties.hostAndRootPropertiesForScope(host, styleInfo.styleRules);\n let propertyData = StyleProperties.propertyDataFromStyles(ownerStyleInfo.styleRules, host);\n let propertiesMatchingHost = propertyData.properties\n Object.assign(\n props,\n hostAndRootProps.hostProps,\n propertiesMatchingHost,\n hostAndRootProps.rootProps\n );\n this._mixinOverrideStyles(props, styleInfo.overrideStyleProperties);\n StyleProperties.reify(props);\n styleInfo.styleProperties = props;\n }\n _mixinOverrideStyles(props, overrides) {\n for (let p in overrides) {\n let v = overrides[p];\n // skip override props if they are not truthy or 0\n // in order to fall back to inherited values\n if (v || v === 0) {\n props[p] = v;\n }\n }\n }\n /**\n * Update styles of the whole document\n *\n * @param {Object=} properties\n */\n styleDocument(properties) {\n this.styleSubtree(this._documentOwner, properties);\n }\n /**\n * Update styles of a subtree\n *\n * @param {!HTMLElement} host\n * @param {Object=} properties\n */\n styleSubtree(host, properties) {\n let root = host.shadowRoot;\n if (root || this._isRootOwner(host)) {\n this.styleElement(host, properties);\n }\n // process the shadowdom children of `host`\n let shadowChildren = root && (root.children || root.childNodes);\n if (shadowChildren) {\n for (let i = 0; i < shadowChildren.length; i++) {\n let c = /** @type {!HTMLElement} */(shadowChildren[i]);\n this.styleSubtree(c);\n }\n } else {\n // process the lightdom children of `host`\n let children = host.children || host.childNodes;\n if (children) {\n for (let i = 0; i < children.length; i++) {\n let c = /** @type {!HTMLElement} */(children[i]);\n this.styleSubtree(c);\n }\n }\n }\n }\n /* Custom Style operations */\n _revalidateCustomStyleApplyShim(customStyles) {\n for (let i = 0; i < customStyles.length; i++) {\n let c = customStyles[i];\n let s = this._customStyleInterface['getStyleForCustomStyle'](c);\n if (s) {\n this._revalidateApplyShim(s);\n }\n }\n }\n _applyCustomStyles(customStyles) {\n for (let i = 0; i < customStyles.length; i++) {\n let c = customStyles[i];\n let s = this._customStyleInterface['getStyleForCustomStyle'](c);\n if (s) {\n StyleProperties.applyCustomStyle(s, this._documentOwnerStyleInfo.styleProperties);\n }\n }\n }\n transformCustomStyleForDocument(style) {\n let ast = StyleUtil.rulesForStyle(style);\n StyleUtil.forEachRule(ast, (rule) => {\n if (nativeShadow) {\n StyleTransformer.normalizeRootSelector(rule);\n } else {\n StyleTransformer.documentRule(rule);\n }\n if (nativeCssVariables) {\n this._ensure();\n this._applyShim && this._applyShim['transformRule'](rule);\n }\n });\n if (nativeCssVariables) {\n style.textContent = StyleUtil.toCssText(ast);\n } else {\n this._documentOwnerStyleInfo.styleRules['rules'].push(ast);\n }\n }\n _revalidateApplyShim(style) {\n if (nativeCssVariables && this._applyShim) {\n let ast = StyleUtil.rulesForStyle(style);\n this._ensure();\n this._applyShim['transformRules'](ast);\n style.textContent = StyleUtil.toCssText(ast);\n }\n }\n getComputedStyleValue(element, property) {\n let value;\n if (!nativeCssVariables) {\n // element is either a style host, or an ancestor of a style host\n let styleInfo = StyleInfo.get(element) || StyleInfo.get(this._styleOwnerForNode(element));\n value = styleInfo.styleProperties[property];\n }\n // fall back to the property value from the computed styling\n value = value || window.getComputedStyle(element).getPropertyValue(property);\n // trim whitespace that can come after the `:` in css\n // example: padding: 2px -> \" 2px\"\n return value ? value.trim() : '';\n }\n // given an element and a classString, replaces\n // the element's class with the provided classString and adds\n // any necessary ShadyCSS static and property based scoping selectors\n setElementClass(element, classString) {\n let root = element.getRootNode();\n let classes = classString ? classString.split(/\\s/) : [];\n let scopeName = root.host && root.host.localName;\n // If no scope, try to discover scope name from existing class.\n // This can occur if, for example, a template stamped element that\n // has been scoped is manipulated when not in a root.\n if (!scopeName) {\n var classAttr = element.getAttribute('class');\n if (classAttr) {\n let k$ = classAttr.split(/\\s/);\n for (let i=0; i < k$.length; i++) {\n if (k$[i] === StyleTransformer.SCOPE_NAME) {\n scopeName = k$[i+1];\n break;\n }\n }\n }\n }\n if (scopeName) {\n classes.push(StyleTransformer.SCOPE_NAME, scopeName);\n }\n if (!nativeCssVariables) {\n let styleInfo = StyleInfo.get(element);\n if (styleInfo && styleInfo.scopeSelector) {\n classes.push(StyleProperties.XSCOPE_NAME, styleInfo.scopeSelector);\n }\n }\n StyleUtil.setElementClassRaw(element, classes.join(' '));\n }\n _styleInfoForNode(node) {\n return StyleInfo.get(node);\n }\n}\n\n/* exports */\nScopingShim.prototype['flush'] = ScopingShim.prototype.flush;\nScopingShim.prototype['prepareTemplate'] = ScopingShim.prototype.prepareTemplate;\nScopingShim.prototype['styleElement'] = ScopingShim.prototype.styleElement;\nScopingShim.prototype['styleDocument'] = ScopingShim.prototype.styleDocument;\nScopingShim.prototype['styleSubtree'] = ScopingShim.prototype.styleSubtree;\nScopingShim.prototype['getComputedStyleValue'] = ScopingShim.prototype.getComputedStyleValue;\nScopingShim.prototype['setElementClass'] = ScopingShim.prototype.setElementClass;\nScopingShim.prototype['_styleInfoForNode'] = ScopingShim.prototype._styleInfoForNode;\nScopingShim.prototype['transformCustomStyleForDocument'] = ScopingShim.prototype.transformCustomStyleForDocument;\nScopingShim.prototype['getStyleAst'] = ScopingShim.prototype.getStyleAst;\nScopingShim.prototype['styleAstToString'] = ScopingShim.prototype.styleAstToString;\nScopingShim.prototype['flushCustomStyles'] = ScopingShim.prototype.flushCustomStyles;\nObject.defineProperties(ScopingShim.prototype, {\n 'nativeShadow': {\n get() {\n return nativeShadow;\n }\n },\n 'nativeCss': {\n get() {\n return nativeCssVariables;\n }\n }\n});\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n'use strict';\n\nexport default class StyleCache {\n constructor(typeMax = 100) {\n // map element name -> [{properties, styleElement, scopeSelector}]\n this.cache = {};\n this.typeMax = typeMax;\n }\n\n _validate(cacheEntry, properties, ownPropertyNames) {\n for (let idx = 0; idx < ownPropertyNames.length; idx++) {\n let pn = ownPropertyNames[idx];\n if (cacheEntry.properties[pn] !== properties[pn]) {\n return false;\n }\n }\n return true;\n }\n\n store(tagname, properties, styleElement, scopeSelector) {\n let list = this.cache[tagname] || [];\n list.push({properties, styleElement, scopeSelector});\n if (list.length > this.typeMax) {\n list.shift();\n }\n this.cache[tagname] = list;\n }\n\n fetch(tagname, properties, ownPropertyNames) {\n let list = this.cache[tagname];\n if (!list) {\n return;\n }\n // reverse list for most-recent lookups\n for (let idx = list.length - 1; idx >= 0; idx--) {\n let entry = list[idx];\n if (this._validate(entry, properties, ownPropertyNames)) {\n return entry;\n }\n }\n }\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport { MIXIN_MATCH, VAR_ASSIGN } from './common-regex.js';\n\n/**\n * @param {Element} element\n * @param {Object=} properties\n */\nexport function updateNativeProperties(element, properties) {\n // remove previous properties\n for (let p in properties) {\n // NOTE: for bc with shim, don't apply null values.\n if (p === null) {\n element.style.removeProperty(p);\n } else {\n element.style.setProperty(p, properties[p]);\n }\n }\n}\n\n/**\n * @param {Element} element\n * @param {string} property\n * @return {string}\n */\nexport function getComputedStyleValue(element, property) {\n /**\n * @const {string}\n */\n const value = window.getComputedStyle(element).getPropertyValue(property);\n if (!value) {\n return '';\n } else {\n return value.trim();\n }\n}\n\n/**\n * return true if `cssText` contains a mixin definition or consumption\n * @param {string} cssText\n * @return {boolean}\n */\nexport function detectMixin(cssText) {\n const has = MIXIN_MATCH.test(cssText) || VAR_ASSIGN.test(cssText);\n // reset state of the regexes\n MIXIN_MATCH.lastIndex = 0;\n VAR_ASSIGN.lastIndex = 0;\n return has;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport ScopingShim from '../src/scoping-shim.js';\nimport {nativeCssVariables, nativeShadow} from '../src/style-settings.js';\n\n/** @const {ScopingShim} */\nconst scopingShim = new ScopingShim();\n\nlet ApplyShim, CustomStyleInterface;\n\nif (window['ShadyCSS']) {\n ApplyShim = window['ShadyCSS']['ApplyShim'];\n CustomStyleInterface = window['ShadyCSS']['CustomStyleInterface'];\n}\n\nwindow.ShadyCSS = {\n ScopingShim: scopingShim,\n /**\n * @param {!HTMLTemplateElement} template\n * @param {string} elementName\n * @param {string=} elementExtends\n */\n prepareTemplate(template, elementName, elementExtends) {\n scopingShim.flushCustomStyles();\n scopingShim.prepareTemplate(template, elementName, elementExtends)\n },\n\n /**\n * @param {!HTMLElement} element\n * @param {Object=} properties\n */\n styleSubtree(element, properties) {\n scopingShim.flushCustomStyles();\n scopingShim.styleSubtree(element, properties);\n },\n\n /**\n * @param {!HTMLElement} element\n */\n styleElement(element) {\n scopingShim.flushCustomStyles();\n scopingShim.styleElement(element);\n },\n\n /**\n * @param {Object=} properties\n */\n styleDocument(properties) {\n scopingShim.flushCustomStyles();\n scopingShim.styleDocument(properties);\n },\n\n flushCustomStyles() {\n scopingShim.flushCustomStyles();\n },\n\n /**\n * @param {Element} element\n * @param {string} property\n * @return {string}\n */\n getComputedStyleValue(element, property) {\n return scopingShim.getComputedStyleValue(element, property);\n },\n\n nativeCss: nativeCssVariables,\n\n nativeShadow: nativeShadow\n};\n\nif (ApplyShim) {\n window.ShadyCSS.ApplyShim = ApplyShim;\n}\n\nif (CustomStyleInterface) {\n window.ShadyCSS.CustomStyleInterface = CustomStyleInterface;\n}"]} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/apply-shim-utils.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/apply-shim-utils.js
new file mode 100644
index 00000000000..ff2480b1031
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/apply-shim-utils.js
@@ -0,0 +1,149 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+'use strict';
+import templateMap from './template-map.js';
+import {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars
+
+/*
+ * Utilities for handling invalidating apply-shim mixins for a given template.
+ *
+ * The invalidation strategy involves keeping track of the "current" version of a template's mixins, and updating that count when a mixin is invalidated.
+ * The template
+ */
+
+/** @const {string} */
+const CURRENT_VERSION = '_applyShimCurrentVersion';
+
+/** @const {string} */
+const NEXT_VERSION = '_applyShimNextVersion';
+
+/** @const {string} */
+const VALIDATING_VERSION = '_applyShimValidatingVersion';
+
+/**
+ * @const {Promise<void>}
+ */
+const promise = Promise.resolve();
+
+/**
+ * @param {string} elementName
+ */
+export function invalidate(elementName){
+ let template = templateMap[elementName];
+ if (template) {
+ invalidateTemplate(template);
+ }
+}
+
+/**
+ * This function can be called multiple times to mark a template invalid
+ * and signal that the style inside must be regenerated.
+ *
+ * Use `startValidatingTemplate` to begin an asynchronous validation cycle.
+ * During that cycle, call `templateIsValidating` to see if the template must
+ * be revalidated
+ * @param {HTMLTemplateElement} template
+ */
+export function invalidateTemplate(template) {
+ // default the current version to 0
+ template[CURRENT_VERSION] = template[CURRENT_VERSION] || 0;
+ // ensure the "validating for" flag exists
+ template[VALIDATING_VERSION] = template[VALIDATING_VERSION] || 0;
+ // increment the next version
+ template[NEXT_VERSION] = (template[NEXT_VERSION] || 0) + 1;
+}
+
+/**
+ * @param {string} elementName
+ * @return {boolean}
+ */
+export function isValid(elementName) {
+ let template = templateMap[elementName];
+ if (template) {
+ return templateIsValid(template);
+ }
+ return true;
+}
+
+/**
+ * @param {HTMLTemplateElement} template
+ * @return {boolean}
+ */
+export function templateIsValid(template) {
+ return template[CURRENT_VERSION] === template[NEXT_VERSION];
+}
+
+/**
+ * @param {string} elementName
+ * @return {boolean}
+ */
+export function isValidating(elementName) {
+ let template = templateMap[elementName];
+ if (template) {
+ return templateIsValidating(template);
+ }
+ return false;
+}
+
+/**
+ * Returns true if the template is currently invalid and `startValidating` has been called since the last invalidation.
+ * If false, the template must be validated.
+ * @param {HTMLTemplateElement} template
+ * @return {boolean}
+ */
+export function templateIsValidating(template) {
+ return !templateIsValid(template) && template[VALIDATING_VERSION] === template[NEXT_VERSION];
+}
+
+/**
+ * the template is marked as `validating` for one microtask so that all instances
+ * found in the tree crawl of `applyStyle` will update themselves,
+ * but the template will only be updated once.
+ * @param {string} elementName
+*/
+export function startValidating(elementName) {
+ let template = templateMap[elementName];
+ startValidatingTemplate(template);
+}
+
+/**
+ * Begin an asynchronous invalidation cycle.
+ * This should be called after every validation of a template
+ *
+ * After one microtask, the template will be marked as valid until the next call to `invalidateTemplate`
+ * @param {HTMLTemplateElement} template
+ */
+export function startValidatingTemplate(template) {
+ // remember that the current "next version" is the reason for this validation cycle
+ template[VALIDATING_VERSION] = template[NEXT_VERSION];
+ // however, there only needs to be one async task to clear the counters
+ if (!template._validating) {
+ template._validating = true;
+ promise.then(function() {
+ // sync the current version to let future invalidations cause a refresh cycle
+ template[CURRENT_VERSION] = template[NEXT_VERSION];
+ template._validating = false;
+ });
+ }
+}
+
+/**
+ * @return {boolean}
+ */
+export function elementsAreInvalid() {
+ for (let elementName in templateMap) {
+ let template = templateMap[elementName];
+ if (!templateIsValid(template)) {
+ return true;
+ }
+ }
+ return false;
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/apply-shim.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/apply-shim.js
new file mode 100644
index 00000000000..80776b02c5e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/apply-shim.js
@@ -0,0 +1,482 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+/*
+ * The apply shim simulates the behavior of `@apply` proposed at
+ * https://tabatkins.github.io/specs/css-apply-rule/.
+ * The approach is to convert a property like this:
+ *
+ * --foo: {color: red; background: blue;}
+ *
+ * to this:
+ *
+ * --foo_-_color: red;
+ * --foo_-_background: blue;
+ *
+ * Then where `@apply --foo` is used, that is converted to:
+ *
+ * color: var(--foo_-_color);
+ * background: var(--foo_-_background);
+ *
+ * This approach generally works but there are some issues and limitations.
+ * Consider, for example, that somewhere *between* where `--foo` is set and used,
+ * another element sets it to:
+ *
+ * --foo: { border: 2px solid red; }
+ *
+ * We must now ensure that the color and background from the previous setting
+ * do not apply. This is accomplished by changing the property set to this:
+ *
+ * --foo_-_border: 2px solid red;
+ * --foo_-_color: initial;
+ * --foo_-_background: initial;
+ *
+ * This works but introduces one new issue.
+ * Consider this setup at the point where the `@apply` is used:
+ *
+ * background: orange;
+ * `@apply` --foo;
+ *
+ * In this case the background will be unset (initial) rather than the desired
+ * `orange`. We address this by altering the property set to use a fallback
+ * value like this:
+ *
+ * color: var(--foo_-_color);
+ * background: var(--foo_-_background, orange);
+ * border: var(--foo_-_border);
+ *
+ * Note that the default is retained in the property set and the `background` is
+ * the desired `orange`. This leads us to a limitation.
+ *
+ * Limitation 1:
+
+ * Only properties in the rule where the `@apply`
+ * is used are considered as default values.
+ * If another rule matches the element and sets `background` with
+ * less specificity than the rule in which `@apply` appears,
+ * the `background` will not be set.
+ *
+ * Limitation 2:
+ *
+ * When using Polymer's `updateStyles` api, new properties may not be set for
+ * `@apply` properties.
+
+*/
+
+'use strict';
+
+import {forEachRule, processVariableAndFallback, rulesForStyle, toCssText, gatherStyleText} from './style-util.js';
+import {MIXIN_MATCH, VAR_ASSIGN} from './common-regex.js';
+import {detectMixin} from './common-utils.js';
+import {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars
+
+const APPLY_NAME_CLEAN = /;\s*/m;
+const INITIAL_INHERIT = /^\s*(initial)|(inherit)\s*$/;
+const IMPORTANT = /\s*!important/;
+
+// separator used between mixin-name and mixin-property-name when producing properties
+// NOTE: plain '-' may cause collisions in user styles
+const MIXIN_VAR_SEP = '_-_';
+
+/**
+ * @typedef {!Object<string, string>}
+ */
+let PropertyEntry; // eslint-disable-line no-unused-vars
+
+/**
+ * @typedef {!Object<string, boolean>}
+ */
+let DependantsEntry; // eslint-disable-line no-unused-vars
+
+/** @typedef {{
+ * properties: PropertyEntry,
+ * dependants: DependantsEntry
+ * }}
+ */
+let MixinMapEntry; // eslint-disable-line no-unused-vars
+
+// map of mixin to property names
+// --foo: {border: 2px} -> {properties: {(--foo, ['border'])}, dependants: {'element-name': proto}}
+class MixinMap {
+ constructor() {
+ /** @type {!Object<string, !MixinMapEntry>} */
+ this._map = {};
+ }
+ /**
+ * @param {string} name
+ * @param {!PropertyEntry} props
+ */
+ set(name, props) {
+ name = name.trim();
+ this._map[name] = {
+ properties: props,
+ dependants: {}
+ }
+ }
+ /**
+ * @param {string} name
+ * @return {MixinMapEntry}
+ */
+ get(name) {
+ name = name.trim();
+ return this._map[name] || null;
+ }
+}
+
+/**
+ * Callback for when an element is marked invalid
+ * @type {?function(string)}
+ */
+let invalidCallback = null;
+
+/** @unrestricted */
+class ApplyShim {
+ constructor() {
+ /** @type {?string} */
+ this._currentElement = null;
+ /** @type {HTMLMetaElement} */
+ this._measureElement = null;
+ this._map = new MixinMap();
+ }
+ /**
+ * return true if `cssText` contains a mixin definition or consumption
+ * @param {string} cssText
+ * @return {boolean}
+ */
+ detectMixin(cssText) {
+ return detectMixin(cssText);
+ }
+
+ /**
+ * Gather styles into one style for easier processing
+ * @param {!HTMLTemplateElement} template
+ * @return {HTMLStyleElement}
+ */
+ gatherStyles(template) {
+ const styleText = gatherStyleText(template.content);
+ if (styleText) {
+ const style = /** @type {!HTMLStyleElement} */(document.createElement('style'));
+ style.textContent = styleText;
+ template.content.insertBefore(style, template.content.firstChild);
+ return style;
+ }
+ return null;
+ }
+ /**
+ * @param {!HTMLTemplateElement} template
+ * @param {string} elementName
+ * @return {StyleNode}
+ */
+ transformTemplate(template, elementName) {
+ if (template._gatheredStyle === undefined) {
+ template._gatheredStyle = this.gatherStyles(template);
+ }
+ /** @type {HTMLStyleElement} */
+ const style = template._gatheredStyle;
+ return style ? this.transformStyle(style, elementName) : null;
+ }
+ /**
+ * @param {!HTMLStyleElement} style
+ * @param {string} elementName
+ * @return {StyleNode}
+ */
+ transformStyle(style, elementName = '') {
+ let ast = rulesForStyle(style);
+ this.transformRules(ast, elementName);
+ style.textContent = toCssText(ast);
+ return ast;
+ }
+ /**
+ * @param {!HTMLStyleElement} style
+ * @return {StyleNode}
+ */
+ transformCustomStyle(style) {
+ let ast = rulesForStyle(style);
+ forEachRule(ast, (rule) => {
+ if (rule['selector'] === ':root') {
+ rule['selector'] = 'html';
+ }
+ this.transformRule(rule);
+ })
+ style.textContent = toCssText(ast);
+ return ast;
+ }
+ /**
+ * @param {StyleNode} rules
+ * @param {string} elementName
+ */
+ transformRules(rules, elementName) {
+ this._currentElement = elementName;
+ forEachRule(rules, (r) => {
+ this.transformRule(r);
+ });
+ this._currentElement = null;
+ }
+ /**
+ * @param {!StyleNode} rule
+ */
+ transformRule(rule) {
+ rule['cssText'] = this.transformCssText(rule['parsedCssText']);
+ // :root was only used for variable assignment in property shim,
+ // but generates invalid selectors with real properties.
+ // replace with `:host > *`, which serves the same effect
+ if (rule['selector'] === ':root') {
+ rule['selector'] = ':host > *';
+ }
+ }
+ /**
+ * @param {string} cssText
+ * @return {string}
+ */
+ transformCssText(cssText) {
+ // produce variables
+ cssText = cssText.replace(VAR_ASSIGN, (matchText, propertyName, valueProperty, valueMixin) =>
+ this._produceCssProperties(matchText, propertyName, valueProperty, valueMixin));
+ // consume mixins
+ return this._consumeCssProperties(cssText);
+ }
+ /**
+ * @param {string} property
+ * @return {string}
+ */
+ _getInitialValueForProperty(property) {
+ if (!this._measureElement) {
+ this._measureElement = /** @type {HTMLMetaElement} */(document.createElement('meta'));
+ this._measureElement.setAttribute('apply-shim-measure', '');
+ this._measureElement.style.all = 'initial';
+ document.head.appendChild(this._measureElement);
+ }
+ return window.getComputedStyle(this._measureElement).getPropertyValue(property);
+ }
+ /**
+ * replace mixin consumption with variable consumption
+ * @param {string} text
+ * @return {string}
+ */
+ _consumeCssProperties(text) {
+ /** @type {Array} */
+ let m = null;
+ // loop over text until all mixins with defintions have been applied
+ while((m = MIXIN_MATCH.exec(text))) {
+ let matchText = m[0];
+ let mixinName = m[1];
+ let idx = m.index;
+ // collect properties before apply to be "defaults" if mixin might override them
+ // match includes a "prefix", so find the start and end positions of @apply
+ let applyPos = idx + matchText.indexOf('@apply');
+ let afterApplyPos = idx + matchText.length;
+ // find props defined before this @apply
+ let textBeforeApply = text.slice(0, applyPos);
+ let textAfterApply = text.slice(afterApplyPos);
+ let defaults = this._cssTextToMap(textBeforeApply);
+ let replacement = this._atApplyToCssProperties(mixinName, defaults);
+ // use regex match position to replace mixin, keep linear processing time
+ text = `${textBeforeApply}${replacement}${textAfterApply}`;
+ // move regex search to _after_ replacement
+ MIXIN_MATCH.lastIndex = idx + replacement.length;
+ }
+ return text;
+ }
+ /**
+ * produce variable consumption at the site of mixin consumption
+ * `@apply` --foo; -> for all props (${propname}: var(--foo_-_${propname}, ${fallback[propname]}}))
+ * Example:
+ * border: var(--foo_-_border); padding: var(--foo_-_padding, 2px)
+ *
+ * @param {string} mixinName
+ * @param {Object} fallbacks
+ * @return {string}
+ */
+ _atApplyToCssProperties(mixinName, fallbacks) {
+ mixinName = mixinName.replace(APPLY_NAME_CLEAN, '');
+ let vars = [];
+ let mixinEntry = this._map.get(mixinName);
+ // if we depend on a mixin before it is created
+ // make a sentinel entry in the map to add this element as a dependency for when it is defined.
+ if (!mixinEntry) {
+ this._map.set(mixinName, {});
+ mixinEntry = this._map.get(mixinName);
+ }
+ if (mixinEntry) {
+ if (this._currentElement) {
+ mixinEntry.dependants[this._currentElement] = true;
+ }
+ let p, parts, f;
+ const properties = mixinEntry.properties;
+ for (p in properties) {
+ f = fallbacks && fallbacks[p];
+ parts = [p, ': var(', mixinName, MIXIN_VAR_SEP, p];
+ if (f) {
+ parts.push(',', f.replace(IMPORTANT, ''));
+ }
+ parts.push(')');
+ if (IMPORTANT.test(properties[p])) {
+ parts.push(' !important');
+ }
+ vars.push(parts.join(''));
+ }
+ }
+ return vars.join('; ');
+ }
+
+ /**
+ * @param {string} property
+ * @param {string} value
+ * @return {string}
+ */
+ _replaceInitialOrInherit(property, value) {
+ let match = INITIAL_INHERIT.exec(value);
+ if (match) {
+ if (match[1]) {
+ // initial
+ // replace `initial` with the concrete initial value for this property
+ value = this._getInitialValueForProperty(property);
+ } else {
+ // inherit
+ // with this purposfully illegal value, the variable will be invalid at
+ // compute time (https://www.w3.org/TR/css-variables/#invalid-at-computed-value-time)
+ // and for inheriting values, will behave similarly
+ // we cannot support the same behavior for non inheriting values like 'border'
+ value = 'apply-shim-inherit';
+ }
+ }
+ return value;
+ }
+
+ /**
+ * "parse" a mixin definition into a map of properties and values
+ * cssTextToMap('border: 2px solid black') -> ('border', '2px solid black')
+ * @param {string} text
+ * @return {!Object<string, string>}
+ */
+ _cssTextToMap(text) {
+ let props = text.split(';');
+ let property, value;
+ let out = {};
+ for (let i = 0, p, sp; i < props.length; i++) {
+ p = props[i];
+ if (p) {
+ sp = p.split(':');
+ // ignore lines that aren't definitions like @media
+ if (sp.length > 1) {
+ property = sp[0].trim();
+ // some properties may have ':' in the value, like data urls
+ value = this._replaceInitialOrInherit(property, sp.slice(1).join(':'));
+ out[property] = value;
+ }
+ }
+ }
+ return out;
+ }
+
+ /**
+ * @param {MixinMapEntry} mixinEntry
+ */
+ _invalidateMixinEntry(mixinEntry) {
+ if (!invalidCallback) {
+ return;
+ }
+ for (let elementName in mixinEntry.dependants) {
+ if (elementName !== this._currentElement) {
+ invalidCallback(elementName);
+ }
+ }
+ }
+
+ /**
+ * @param {string} matchText
+ * @param {string} propertyName
+ * @param {?string} valueProperty
+ * @param {?string} valueMixin
+ * @return {string}
+ */
+ _produceCssProperties(matchText, propertyName, valueProperty, valueMixin) {
+ // handle case where property value is a mixin
+ if (valueProperty) {
+ // form: --mixin2: var(--mixin1), where --mixin1 is in the map
+ processVariableAndFallback(valueProperty, (prefix, value) => {
+ if (value && this._map.get(value)) {
+ valueMixin = `@apply ${value};`
+ }
+ });
+ }
+ if (!valueMixin) {
+ return matchText;
+ }
+ let mixinAsProperties = this._consumeCssProperties('' + valueMixin);
+ let prefix = matchText.slice(0, matchText.indexOf('--'));
+ let mixinValues = this._cssTextToMap(mixinAsProperties);
+ let combinedProps = mixinValues;
+ let mixinEntry = this._map.get(propertyName);
+ let oldProps = mixinEntry && mixinEntry.properties;
+ if (oldProps) {
+ // NOTE: since we use mixin, the map of properties is updated here
+ // and this is what we want.
+ combinedProps = Object.assign(Object.create(oldProps), mixinValues);
+ } else {
+ this._map.set(propertyName, combinedProps);
+ }
+ let out = [];
+ let p, v;
+ // set variables defined by current mixin
+ let needToInvalidate = false;
+ for (p in combinedProps) {
+ v = mixinValues[p];
+ // if property not defined by current mixin, set initial
+ if (v === undefined) {
+ v = 'initial';
+ }
+ if (oldProps && !(p in oldProps)) {
+ needToInvalidate = true;
+ }
+ out.push(`${propertyName}${MIXIN_VAR_SEP}${p}: ${v}`);
+ }
+ if (needToInvalidate) {
+ this._invalidateMixinEntry(mixinEntry);
+ }
+ if (mixinEntry) {
+ mixinEntry.properties = combinedProps;
+ }
+ // because the mixinMap is global, the mixin might conflict with
+ // a different scope's simple variable definition:
+ // Example:
+ // some style somewhere:
+ // --mixin1:{ ... }
+ // --mixin2: var(--mixin1);
+ // some other element:
+ // --mixin1: 10px solid red;
+ // --foo: var(--mixin1);
+ // In this case, we leave the original variable definition in place.
+ if (valueProperty) {
+ prefix = `${matchText};${prefix}`;
+ }
+ return `${prefix}${out.join('; ')};`;
+ }
+}
+
+/* exports */
+ApplyShim.prototype['detectMixin'] = ApplyShim.prototype.detectMixin;
+ApplyShim.prototype['transformStyle'] = ApplyShim.prototype.transformStyle;
+ApplyShim.prototype['transformCustomStyle'] = ApplyShim.prototype.transformCustomStyle;
+ApplyShim.prototype['transformRules'] = ApplyShim.prototype.transformRules;
+ApplyShim.prototype['transformRule'] = ApplyShim.prototype.transformRule;
+ApplyShim.prototype['transformTemplate'] = ApplyShim.prototype.transformTemplate;
+ApplyShim.prototype['_separator'] = MIXIN_VAR_SEP;
+Object.defineProperty(ApplyShim.prototype, 'invalidCallback', {
+ /** @return {?function(string)} */
+ get() {
+ return invalidCallback;
+ },
+ /** @param {?function(string)} cb */
+ set(cb) {
+ invalidCallback = cb;
+ }
+});
+
+export default ApplyShim;
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/common-regex.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/common-regex.js
new file mode 100644
index 00000000000..126fc15c141
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/common-regex.js
@@ -0,0 +1,19 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+export const VAR_ASSIGN = /(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};{])+)|\{([^}]*)\}(?:(?=[;\s}])|$))/gi;
+export const MIXIN_MATCH = /(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi;
+export const VAR_CONSUMED = /(--[\w-]+)\s*([:,;)]|$)/gi;
+export const ANIMATION_MATCH = /(animation\s*:)|(animation-name\s*:)/;
+export const MEDIA_MATCH = /@media\s(.*)/;
+export const IS_VAR = /^--/;
+export const BRACKETED = /\{[^}]*\}/g;
+export const HOST_PREFIX = '(?:^|[^.#[:])';
+export const HOST_SUFFIX = '($|[.:[\\s>+~])';
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/common-utils.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/common-utils.js
new file mode 100644
index 00000000000..863250be2f4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/common-utils.js
@@ -0,0 +1,59 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+'use strict';
+
+import { MIXIN_MATCH, VAR_ASSIGN } from './common-regex.js';
+
+/**
+ * @param {Element} element
+ * @param {Object=} properties
+ */
+export function updateNativeProperties(element, properties) {
+ // remove previous properties
+ for (let p in properties) {
+ // NOTE: for bc with shim, don't apply null values.
+ if (p === null) {
+ element.style.removeProperty(p);
+ } else {
+ element.style.setProperty(p, properties[p]);
+ }
+ }
+}
+
+/**
+ * @param {Element} element
+ * @param {string} property
+ * @return {string}
+ */
+export function getComputedStyleValue(element, property) {
+ /**
+ * @const {string}
+ */
+ const value = window.getComputedStyle(element).getPropertyValue(property);
+ if (!value) {
+ return '';
+ } else {
+ return value.trim();
+ }
+}
+
+/**
+ * return true if `cssText` contains a mixin definition or consumption
+ * @param {string} cssText
+ * @return {boolean}
+ */
+export function detectMixin(cssText) {
+ const has = MIXIN_MATCH.test(cssText) || VAR_ASSIGN.test(cssText);
+ // reset state of the regexes
+ MIXIN_MATCH.lastIndex = 0;
+ VAR_ASSIGN.lastIndex = 0;
+ return has;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/css-parse.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/css-parse.js
new file mode 100644
index 00000000000..8a8fb1cd9ea
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/css-parse.js
@@ -0,0 +1,264 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+/*
+Extremely simple css parser. Intended to be not more than what we need
+and definitely not necessarily correct =).
+*/
+
+'use strict';
+
+/** @unrestricted */
+class StyleNode {
+ constructor() {
+ /** @type {number} */
+ this['start'] = 0;
+ /** @type {number} */
+ this['end'] = 0;
+ /** @type {StyleNode} */
+ this['previous'] = null;
+ /** @type {StyleNode} */
+ this['parent'] = null;
+ /** @type {Array<StyleNode>} */
+ this['rules'] = null;
+ /** @type {string} */
+ this['parsedCssText'] = '';
+ /** @type {string} */
+ this['cssText'] = '';
+ /** @type {boolean} */
+ this['atRule'] = false;
+ /** @type {number} */
+ this['type'] = 0;
+ /** @type {string} */
+ this['keyframesName'] = '';
+ /** @type {string} */
+ this['selector'] = '';
+ /** @type {string} */
+ this['parsedSelector'] = '';
+ }
+}
+
+export {StyleNode}
+
+// given a string of css, return a simple rule tree
+/**
+ * @param {string} text
+ * @return {StyleNode}
+ */
+export function parse(text) {
+ text = clean(text);
+ return parseCss(lex(text), text);
+}
+
+// remove stuff we don't care about that may hinder parsing
+/**
+ * @param {string} cssText
+ * @return {string}
+ */
+function clean(cssText) {
+ return cssText.replace(RX.comments, '').replace(RX.port, '');
+}
+
+// super simple {...} lexer that returns a node tree
+/**
+ * @param {string} text
+ * @return {StyleNode}
+ */
+function lex(text) {
+ let root = new StyleNode();
+ root['start'] = 0;
+ root['end'] = text.length
+ let n = root;
+ for (let i = 0, l = text.length; i < l; i++) {
+ if (text[i] === OPEN_BRACE) {
+ if (!n['rules']) {
+ n['rules'] = [];
+ }
+ let p = n;
+ let previous = p['rules'][p['rules'].length - 1] || null;
+ n = new StyleNode();
+ n['start'] = i + 1;
+ n['parent'] = p;
+ n['previous'] = previous;
+ p['rules'].push(n);
+ } else if (text[i] === CLOSE_BRACE) {
+ n['end'] = i + 1;
+ n = n['parent'] || root;
+ }
+ }
+ return root;
+}
+
+// add selectors/cssText to node tree
+/**
+ * @param {StyleNode} node
+ * @param {string} text
+ * @return {StyleNode}
+ */
+function parseCss(node, text) {
+ let t = text.substring(node['start'], node['end'] - 1);
+ node['parsedCssText'] = node['cssText'] = t.trim();
+ if (node['parent']) {
+ let ss = node['previous'] ? node['previous']['end'] : node['parent']['start'];
+ t = text.substring(ss, node['start'] - 1);
+ t = _expandUnicodeEscapes(t);
+ t = t.replace(RX.multipleSpaces, ' ');
+ // TODO(sorvell): ad hoc; make selector include only after last ;
+ // helps with mixin syntax
+ t = t.substring(t.lastIndexOf(';') + 1);
+ let s = node['parsedSelector'] = node['selector'] = t.trim();
+ node['atRule'] = (s.indexOf(AT_START) === 0);
+ // note, support a subset of rule types...
+ if (node['atRule']) {
+ if (s.indexOf(MEDIA_START) === 0) {
+ node['type'] = types.MEDIA_RULE;
+ } else if (s.match(RX.keyframesRule)) {
+ node['type'] = types.KEYFRAMES_RULE;
+ node['keyframesName'] =
+ node['selector'].split(RX.multipleSpaces).pop();
+ }
+ } else {
+ if (s.indexOf(VAR_START) === 0) {
+ node['type'] = types.MIXIN_RULE;
+ } else {
+ node['type'] = types.STYLE_RULE;
+ }
+ }
+ }
+ let r$ = node['rules'];
+ if (r$) {
+ for (let i = 0, l = r$.length, r;
+ (i < l) && (r = r$[i]); i++) {
+ parseCss(r, text);
+ }
+ }
+ return node;
+}
+
+/**
+ * conversion of sort unicode escapes with spaces like `\33 ` (and longer) into
+ * expanded form that doesn't require trailing space `\000033`
+ * @param {string} s
+ * @return {string}
+ */
+function _expandUnicodeEscapes(s) {
+ return s.replace(/\\([0-9a-f]{1,6})\s/gi, function() {
+ let code = arguments[1],
+ repeat = 6 - code.length;
+ while (repeat--) {
+ code = '0' + code;
+ }
+ return '\\' + code;
+ });
+}
+
+/**
+ * stringify parsed css.
+ * @param {StyleNode} node
+ * @param {boolean=} preserveProperties
+ * @param {string=} text
+ * @return {string}
+ */
+export function stringify(node, preserveProperties, text = '') {
+ // calc rule cssText
+ let cssText = '';
+ if (node['cssText'] || node['rules']) {
+ let r$ = node['rules'];
+ if (r$ && !_hasMixinRules(r$)) {
+ for (let i = 0, l = r$.length, r;
+ (i < l) && (r = r$[i]); i++) {
+ cssText = stringify(r, preserveProperties, cssText);
+ }
+ } else {
+ cssText = preserveProperties ? node['cssText'] :
+ removeCustomProps(node['cssText']);
+ cssText = cssText.trim();
+ if (cssText) {
+ cssText = ' ' + cssText + '\n';
+ }
+ }
+ }
+ // emit rule if there is cssText
+ if (cssText) {
+ if (node['selector']) {
+ text += node['selector'] + ' ' + OPEN_BRACE + '\n';
+ }
+ text += cssText;
+ if (node['selector']) {
+ text += CLOSE_BRACE + '\n\n';
+ }
+ }
+ return text;
+}
+
+/**
+ * @param {Array<StyleNode>} rules
+ * @return {boolean}
+ */
+function _hasMixinRules(rules) {
+ let r = rules[0];
+ return Boolean(r) && Boolean(r['selector']) && r['selector'].indexOf(VAR_START) === 0;
+}
+
+/**
+ * @param {string} cssText
+ * @return {string}
+ */
+function removeCustomProps(cssText) {
+ cssText = removeCustomPropAssignment(cssText);
+ return removeCustomPropApply(cssText);
+}
+
+/**
+ * @param {string} cssText
+ * @return {string}
+ */
+export function removeCustomPropAssignment(cssText) {
+ return cssText
+ .replace(RX.customProp, '')
+ .replace(RX.mixinProp, '');
+}
+
+/**
+ * @param {string} cssText
+ * @return {string}
+ */
+function removeCustomPropApply(cssText) {
+ return cssText
+ .replace(RX.mixinApply, '')
+ .replace(RX.varApply, '');
+}
+
+/** @enum {number} */
+export const types = {
+ STYLE_RULE: 1,
+ KEYFRAMES_RULE: 7,
+ MEDIA_RULE: 4,
+ MIXIN_RULE: 1000
+}
+
+const OPEN_BRACE = '{';
+const CLOSE_BRACE = '}';
+
+// helper regexp's
+const RX = {
+ comments: /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,
+ port: /@import[^;]*;/gim,
+ customProp: /(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,
+ mixinProp: /(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,
+ mixinApply: /@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,
+ varApply: /[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,
+ keyframesRule: /^@[^\s]*keyframes/,
+ multipleSpaces: /\s+/g
+}
+
+const VAR_START = '--';
+const MEDIA_START = '@media';
+const AT_START = '@';
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/custom-style-interface.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/custom-style-interface.js
new file mode 100644
index 00000000000..d0389b87b67
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/custom-style-interface.js
@@ -0,0 +1,162 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+'use strict';
+
+import documentWait from './document-wait.js';
+
+/**
+ * @typedef {HTMLStyleElement | {getStyle: function():HTMLStyleElement}}
+ */
+export let CustomStyleProvider;
+
+const SEEN_MARKER = '__seenByShadyCSS';
+const CACHED_STYLE = '__shadyCSSCachedStyle';
+
+/** @type {?function(!HTMLStyleElement)} */
+let transformFn = null;
+
+/** @type {?function()} */
+let validateFn = null;
+
+/**
+This interface is provided to add document-level <style> elements to ShadyCSS for processing.
+These styles must be processed by ShadyCSS to simulate ShadowRoot upper-bound encapsulation from outside styles
+In addition, these styles may also need to be processed for @apply rules and CSS Custom Properties
+
+To add document-level styles to ShadyCSS, one can call `ShadyCSS.addDocumentStyle(styleElement)` or `ShadyCSS.addDocumentStyle({getStyle: () => styleElement})`
+
+In addition, if the process used to discover document-level styles can be synchronously flushed, one should set `ShadyCSS.documentStyleFlush`.
+This function will be called when calculating styles.
+
+An example usage of the document-level styling api can be found in `examples/document-style-lib.js`
+
+@unrestricted
+*/
+export default class CustomStyleInterface {
+ constructor() {
+ /** @type {!Array<!CustomStyleProvider>} */
+ this['customStyles'] = [];
+ this['enqueued'] = false;
+ // NOTE(dfreedm): use quotes here to prevent closure inlining to `function(){}`;
+ documentWait(() => {
+ if (window['ShadyCSS']['flushCustomStyles']) {
+ window['ShadyCSS']['flushCustomStyles']();
+ }
+ })
+ }
+ /**
+ * Queue a validation for new custom styles to batch style recalculations
+ */
+ enqueueDocumentValidation() {
+ if (this['enqueued'] || !validateFn) {
+ return;
+ }
+ this['enqueued'] = true;
+ documentWait(validateFn);
+ }
+ /**
+ * @param {!HTMLStyleElement} style
+ */
+ addCustomStyle(style) {
+ if (!style[SEEN_MARKER]) {
+ style[SEEN_MARKER] = true;
+ this['customStyles'].push(style);
+ this.enqueueDocumentValidation();
+ }
+ }
+ /**
+ * @param {!CustomStyleProvider} customStyle
+ * @return {HTMLStyleElement}
+ */
+ getStyleForCustomStyle(customStyle) {
+ if (customStyle[CACHED_STYLE]) {
+ return customStyle[CACHED_STYLE];
+ }
+ let style;
+ if (customStyle['getStyle']) {
+ style = customStyle['getStyle']();
+ } else {
+ style = customStyle;
+ }
+ return style;
+ }
+ /**
+ * @return {!Array<!CustomStyleProvider>}
+ */
+ processStyles() {
+ const cs = this['customStyles'];
+ for (let i = 0; i < cs.length; i++) {
+ const customStyle = cs[i];
+ if (customStyle[CACHED_STYLE]) {
+ continue;
+ }
+ const style = this.getStyleForCustomStyle(customStyle);
+ if (style) {
+ // HTMLImports polyfill may have cloned the style into the main document,
+ // which is referenced with __appliedElement.
+ const styleToTransform = /** @type {!HTMLStyleElement} */(style['__appliedElement'] || style);
+ if (transformFn) {
+ transformFn(styleToTransform);
+ }
+ customStyle[CACHED_STYLE] = styleToTransform;
+ }
+ }
+ return cs;
+ }
+}
+
+CustomStyleInterface.prototype['addCustomStyle'] = CustomStyleInterface.prototype.addCustomStyle;
+CustomStyleInterface.prototype['getStyleForCustomStyle'] = CustomStyleInterface.prototype.getStyleForCustomStyle;
+CustomStyleInterface.prototype['processStyles'] = CustomStyleInterface.prototype.processStyles;
+
+Object.defineProperties(CustomStyleInterface.prototype, {
+ 'transformCallback': {
+ /** @return {?function(!HTMLStyleElement)} */
+ get() {
+ return transformFn;
+ },
+ /** @param {?function(!HTMLStyleElement)} fn */
+ set(fn) {
+ transformFn = fn;
+ }
+ },
+ 'validateCallback': {
+ /** @return {?function()} */
+ get() {
+ return validateFn;
+ },
+ /**
+ * @param {?function()} fn
+ * @this {CustomStyleInterface}
+ */
+ set(fn) {
+ let needsEnqueue = false;
+ if (!validateFn) {
+ needsEnqueue = true;
+ }
+ validateFn = fn;
+ if (needsEnqueue) {
+ this.enqueueDocumentValidation();
+ }
+ },
+ }
+})
+
+/** @typedef {{
+ * customStyles: !Array<!CustomStyleProvider>,
+ * addCustomStyle: function(!CustomStyleProvider),
+ * getStyleForCustomStyle: function(!CustomStyleProvider): HTMLStyleElement,
+ * findStyles: function(),
+ * transformCallback: ?function(!HTMLStyleElement),
+ * validateCallback: ?function()
+ * }}
+ */
+export let CustomStyleInterfaceInterface;
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/document-wait.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/document-wait.js
new file mode 100644
index 00000000000..398ca056820
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/document-wait.js
@@ -0,0 +1,45 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+'use strict';
+
+/** @type {Promise<void>} */
+let readyPromise = null;
+
+/** @type {?function(?function())} */
+let whenReady = window['HTMLImports'] && window['HTMLImports']['whenReady'] || null;
+
+/** @type {function()} */
+let resolveFn;
+
+/**
+ * @param {?function()} callback
+ */
+export default function documentWait(callback) {
+ requestAnimationFrame(function() {
+ if (whenReady) {
+ whenReady(callback)
+ } else {
+ if (!readyPromise) {
+ readyPromise = new Promise((resolve) => {resolveFn = resolve});
+ if (document.readyState === 'complete') {
+ resolveFn();
+ } else {
+ document.addEventListener('readystatechange', () => {
+ if (document.readyState === 'complete') {
+ resolveFn();
+ }
+ });
+ }
+ }
+ readyPromise.then(function(){ callback && callback(); });
+ }
+ });
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/document-watcher.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/document-watcher.js
new file mode 100644
index 00000000000..5ac1543f9f0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/document-watcher.js
@@ -0,0 +1,133 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+'use strict';
+
+import {nativeShadow} from './style-settings.js';
+import StyleTransformer from './style-transformer.js';
+import {getIsExtends} from './style-util.js';
+
+export let flush = function() {};
+
+/**
+ * @param {HTMLElement} element
+ * @return {!Array<string>}
+ */
+function getClasses(element) {
+ let classes = [];
+ if (element.classList) {
+ classes = Array.from(element.classList);
+ } else if (element instanceof window['SVGElement'] && element.hasAttribute('class')) {
+ classes = element.getAttribute('class').split(/\s+/);
+ }
+ return classes;
+}
+
+/**
+ * @param {HTMLElement} element
+ * @return {string}
+ */
+function getCurrentScope(element) {
+ let classes = getClasses(element);
+ let idx = classes.indexOf(StyleTransformer.SCOPE_NAME);
+ if (idx > -1) {
+ return classes[idx + 1];
+ }
+ return '';
+}
+
+/**
+ * @param {Array<MutationRecord|null>|null} mxns
+ */
+function handler(mxns) {
+ for (let x=0; x < mxns.length; x++) {
+ let mxn = mxns[x];
+ if (mxn.target === document.documentElement ||
+ mxn.target === document.head) {
+ continue;
+ }
+ for (let i=0; i < mxn.addedNodes.length; i++) {
+ let n = mxn.addedNodes[i];
+ if (n.nodeType !== Node.ELEMENT_NODE) {
+ continue;
+ }
+ n = /** @type {HTMLElement} */(n); // eslint-disable-line no-self-assign
+ let root = n.getRootNode();
+ let currentScope = getCurrentScope(n);
+ // node was scoped, but now is in document
+ if (currentScope && root === n.ownerDocument) {
+ StyleTransformer.dom(n, currentScope, true);
+ } else if (root.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
+ let newScope;
+ let host = /** @type {ShadowRoot} */(root).host;
+ // element may no longer be in a shadowroot
+ if (!host) {
+ continue;
+ }
+ newScope = getIsExtends(host).is;
+ if (currentScope === newScope) {
+ // make sure all the subtree elements are scoped correctly
+ let unscoped = window['ShadyDOM']['nativeMethods']['querySelectorAll'].call(
+ n, `:not(.${StyleTransformer.SCOPE_NAME})`);
+ for (let j = 0; j < unscoped.length; j++) {
+ StyleTransformer.element(unscoped[j], currentScope);
+ }
+ continue;
+ }
+ if (currentScope) {
+ StyleTransformer.dom(n, currentScope, true);
+ }
+ StyleTransformer.dom(n, newScope);
+ }
+ }
+ }
+}
+
+if (!nativeShadow) {
+ let observer = new MutationObserver(handler);
+ let start = (node) => {
+ observer.observe(node, {childList: true, subtree: true});
+ }
+ let nativeCustomElements = (window['customElements'] &&
+ !window['customElements']['polyfillWrapFlushCallback']);
+ // need to start immediately with native custom elements
+ // TODO(dfreedm): with polyfilled HTMLImports and native custom elements
+ // excessive mutations may be observed; this can be optimized via cooperation
+ // with the HTMLImports polyfill.
+ if (nativeCustomElements) {
+ start(document);
+ } else {
+ let delayedStart = () => {
+ start(document.body);
+ }
+ // use polyfill timing if it's available
+ if (window['HTMLImports']) {
+ window['HTMLImports']['whenReady'](delayedStart);
+ // otherwise push beyond native imports being ready
+ // which requires RAF + readystate interactive.
+ } else {
+ requestAnimationFrame(function() {
+ if (document.readyState === 'loading') {
+ let listener = function() {
+ delayedStart();
+ document.removeEventListener('readystatechange', listener);
+ }
+ document.addEventListener('readystatechange', listener);
+ } else {
+ delayedStart();
+ }
+ });
+ }
+ }
+
+ flush = function() {
+ handler(observer.takeRecords());
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/scoping-shim.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/scoping-shim.js
new file mode 100644
index 00000000000..00225ecd0aa
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/scoping-shim.js
@@ -0,0 +1,470 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+'use strict';
+
+import {parse, StyleNode} from './css-parse.js';
+import {nativeShadow, nativeCssVariables} from './style-settings.js';
+import StyleTransformer from './style-transformer.js';
+import * as StyleUtil from './style-util.js';
+import StyleProperties from './style-properties.js';
+import placeholderMap from './style-placeholder.js';
+import StyleInfo from './style-info.js';
+import StyleCache from './style-cache.js';
+import {flush as watcherFlush} from './document-watcher.js';
+import templateMap from './template-map.js';
+import * as ApplyShimUtils from './apply-shim-utils.js';
+import {updateNativeProperties, detectMixin} from './common-utils.js';
+import {CustomStyleInterfaceInterface} from './custom-style-interface.js'; // eslint-disable-line no-unused-vars
+
+/**
+ * @const {StyleCache}
+ */
+const styleCache = new StyleCache();
+
+export default class ScopingShim {
+ constructor() {
+ this._scopeCounter = {};
+ this._documentOwner = document.documentElement;
+ let ast = new StyleNode();
+ ast['rules'] = [];
+ this._documentOwnerStyleInfo = StyleInfo.set(this._documentOwner, new StyleInfo(ast));
+ this._elementsHaveApplied = false;
+ this._applyShim = null;
+ /** @type {?CustomStyleInterfaceInterface} */
+ this._customStyleInterface = null;
+ }
+ flush() {
+ watcherFlush();
+ }
+ _generateScopeSelector(name) {
+ let id = this._scopeCounter[name] = (this._scopeCounter[name] || 0) + 1;
+ return `${name}-${id}`;
+ }
+ getStyleAst(style) {
+ return StyleUtil.rulesForStyle(style);
+ }
+ styleAstToString(ast) {
+ return StyleUtil.toCssText(ast);
+ }
+ _gatherStyles(template) {
+ return StyleUtil.gatherStyleText(template.content);
+ }
+ _getCssBuild(template) {
+ let style = template.content.querySelector('style');
+ if (!style) {
+ return '';
+ }
+ return style.getAttribute('css-build') || '';
+ }
+ /**
+ * Prepare the styling and template for the given element type
+ *
+ * @param {HTMLTemplateElement} template
+ * @param {string} elementName
+ * @param {string=} typeExtension
+ */
+ prepareTemplate(template, elementName, typeExtension) {
+ if (template._prepared) {
+ return;
+ }
+ template._prepared = true;
+ template.name = elementName;
+ template.extends = typeExtension;
+ templateMap[elementName] = template;
+ let cssBuild = this._getCssBuild(template);
+ let cssText = this._gatherStyles(template);
+ let info = {
+ is: elementName,
+ extends: typeExtension,
+ __cssBuild: cssBuild,
+ };
+ if (!nativeShadow) {
+ StyleTransformer.dom(template.content, elementName);
+ }
+ // check if the styling has mixin definitions or uses
+ this._ensure();
+ let hasMixins = detectMixin(cssText)
+ let ast = parse(cssText);
+ // only run the applyshim transforms if there is a mixin involved
+ if (hasMixins && nativeCssVariables && this._applyShim) {
+ this._applyShim['transformRules'](ast, elementName);
+ }
+ template['_styleAst'] = ast;
+ template._cssBuild = cssBuild;
+
+ let ownPropertyNames = [];
+ if (!nativeCssVariables) {
+ ownPropertyNames = StyleProperties.decorateStyles(template['_styleAst']);
+ }
+ if (!ownPropertyNames.length || nativeCssVariables) {
+ let root = nativeShadow ? template.content : null;
+ let placeholder = placeholderMap[elementName];
+ let style = this._generateStaticStyle(info, template['_styleAst'], root, placeholder);
+ template._style = style;
+ }
+ template._ownPropertyNames = ownPropertyNames;
+ }
+ _generateStaticStyle(info, rules, shadowroot, placeholder) {
+ let cssText = StyleTransformer.elementStyles(info, rules);
+ if (cssText.length) {
+ return StyleUtil.applyCss(cssText, info.is, shadowroot, placeholder);
+ }
+ }
+ _prepareHost(host) {
+ let {is, typeExtension} = StyleUtil.getIsExtends(host);
+ let placeholder = placeholderMap[is];
+ let template = templateMap[is];
+ let ast;
+ let ownStylePropertyNames;
+ let cssBuild;
+ if (template) {
+ ast = template['_styleAst'];
+ ownStylePropertyNames = template._ownPropertyNames;
+ cssBuild = template._cssBuild;
+ }
+ return StyleInfo.set(host,
+ new StyleInfo(
+ ast,
+ placeholder,
+ ownStylePropertyNames,
+ is,
+ typeExtension,
+ cssBuild
+ )
+ );
+ }
+ _ensureApplyShim() {
+ if (this._applyShim) {
+ return;
+ } else if (window.ShadyCSS && window.ShadyCSS.ApplyShim) {
+ this._applyShim = window.ShadyCSS.ApplyShim;
+ this._applyShim['invalidCallback'] = ApplyShimUtils.invalidate;
+ }
+ }
+ _ensureCustomStyleInterface() {
+ if (this._customStyleInterface) {
+ return;
+ } else if (window.ShadyCSS && window.ShadyCSS.CustomStyleInterface) {
+ this._customStyleInterface = /** @type {!CustomStyleInterfaceInterface} */(window.ShadyCSS.CustomStyleInterface);
+ /** @type {function(!HTMLStyleElement)} */
+ this._customStyleInterface['transformCallback'] = (style) => {this.transformCustomStyleForDocument(style)};
+ this._customStyleInterface['validateCallback'] = () => {
+ requestAnimationFrame(() => {
+ if (this._customStyleInterface['enqueued'] || this._elementsHaveApplied) {
+ this.flushCustomStyles();
+ }
+ })
+ };
+ }
+ }
+ _ensure() {
+ this._ensureApplyShim();
+ this._ensureCustomStyleInterface();
+ }
+ /**
+ * Flush and apply custom styles to document
+ */
+ flushCustomStyles() {
+ this._ensure();
+ if (!this._customStyleInterface) {
+ return;
+ }
+ let customStyles = this._customStyleInterface['processStyles']();
+ // early return if custom-styles don't need validation
+ if (!this._customStyleInterface['enqueued']) {
+ return;
+ }
+ if (!nativeCssVariables) {
+ this._updateProperties(this._documentOwner, this._documentOwnerStyleInfo);
+ this._applyCustomStyles(customStyles);
+ } else {
+ this._revalidateCustomStyleApplyShim(customStyles);
+ }
+ this._customStyleInterface['enqueued'] = false;
+ // if custom elements have upgraded and there are no native css variables, we must recalculate the whole tree
+ if (this._elementsHaveApplied && !nativeCssVariables) {
+ this.styleDocument();
+ }
+ }
+ /**
+ * Apply styles for the given element
+ *
+ * @param {!HTMLElement} host
+ * @param {Object=} overrideProps
+ */
+ styleElement(host, overrideProps) {
+ let {is} = StyleUtil.getIsExtends(host);
+ let styleInfo = StyleInfo.get(host);
+ if (!styleInfo) {
+ styleInfo = this._prepareHost(host);
+ }
+ // Only trip the `elementsHaveApplied` flag if a node other that the root document has `applyStyle` called
+ if (!this._isRootOwner(host)) {
+ this._elementsHaveApplied = true;
+ }
+ if (overrideProps) {
+ styleInfo.overrideStyleProperties =
+ styleInfo.overrideStyleProperties || {};
+ Object.assign(styleInfo.overrideStyleProperties, overrideProps);
+ }
+ if (!nativeCssVariables) {
+ this._updateProperties(host, styleInfo);
+ if (styleInfo.ownStylePropertyNames && styleInfo.ownStylePropertyNames.length) {
+ this._applyStyleProperties(host, styleInfo);
+ }
+ } else {
+ if (styleInfo.overrideStyleProperties) {
+ updateNativeProperties(host, styleInfo.overrideStyleProperties);
+ }
+ let template = templateMap[is];
+ // bail early if there is no shadowroot for this element
+ if (!template && !this._isRootOwner(host)) {
+ return;
+ }
+ if (template && template._style && !ApplyShimUtils.templateIsValid(template)) {
+ // update template
+ if (!ApplyShimUtils.templateIsValidating(template)) {
+ this._ensure();
+ this._applyShim && this._applyShim['transformRules'](template['_styleAst'], is);
+ template._style.textContent = StyleTransformer.elementStyles(host, styleInfo.styleRules);
+ ApplyShimUtils.startValidatingTemplate(template);
+ }
+ // update instance if native shadowdom
+ if (nativeShadow) {
+ let root = host.shadowRoot;
+ if (root) {
+ let style = root.querySelector('style');
+ style.textContent = StyleTransformer.elementStyles(host, styleInfo.styleRules);
+ }
+ }
+ styleInfo.styleRules = template['_styleAst'];
+ }
+ }
+ }
+ _styleOwnerForNode(node) {
+ let root = node.getRootNode();
+ let host = root.host;
+ if (host) {
+ if (StyleInfo.get(host)) {
+ return host;
+ } else {
+ return this._styleOwnerForNode(host);
+ }
+ }
+ return this._documentOwner;
+ }
+ _isRootOwner(node) {
+ return (node === this._documentOwner);
+ }
+ _applyStyleProperties(host, styleInfo) {
+ let is = StyleUtil.getIsExtends(host).is;
+ let cacheEntry = styleCache.fetch(is, styleInfo.styleProperties, styleInfo.ownStylePropertyNames);
+ let cachedScopeSelector = cacheEntry && cacheEntry.scopeSelector;
+ let cachedStyle = cacheEntry ? cacheEntry.styleElement : null;
+ let oldScopeSelector = styleInfo.scopeSelector;
+ // only generate new scope if cached style is not found
+ styleInfo.scopeSelector = cachedScopeSelector || this._generateScopeSelector(is);
+ let style = StyleProperties.applyElementStyle(host, styleInfo.styleProperties, styleInfo.scopeSelector, cachedStyle);
+ if (!nativeShadow) {
+ StyleProperties.applyElementScopeSelector(host, styleInfo.scopeSelector, oldScopeSelector);
+ }
+ if (!cacheEntry) {
+ styleCache.store(is, styleInfo.styleProperties, style, styleInfo.scopeSelector);
+ }
+ return style;
+ }
+ _updateProperties(host, styleInfo) {
+ let owner = this._styleOwnerForNode(host);
+ let ownerStyleInfo = StyleInfo.get(owner);
+ let ownerProperties = ownerStyleInfo.styleProperties;
+ let props = Object.create(ownerProperties || null);
+ let hostAndRootProps = StyleProperties.hostAndRootPropertiesForScope(host, styleInfo.styleRules);
+ let propertyData = StyleProperties.propertyDataFromStyles(ownerStyleInfo.styleRules, host);
+ let propertiesMatchingHost = propertyData.properties
+ Object.assign(
+ props,
+ hostAndRootProps.hostProps,
+ propertiesMatchingHost,
+ hostAndRootProps.rootProps
+ );
+ this._mixinOverrideStyles(props, styleInfo.overrideStyleProperties);
+ StyleProperties.reify(props);
+ styleInfo.styleProperties = props;
+ }
+ _mixinOverrideStyles(props, overrides) {
+ for (let p in overrides) {
+ let v = overrides[p];
+ // skip override props if they are not truthy or 0
+ // in order to fall back to inherited values
+ if (v || v === 0) {
+ props[p] = v;
+ }
+ }
+ }
+ /**
+ * Update styles of the whole document
+ *
+ * @param {Object=} properties
+ */
+ styleDocument(properties) {
+ this.styleSubtree(this._documentOwner, properties);
+ }
+ /**
+ * Update styles of a subtree
+ *
+ * @param {!HTMLElement} host
+ * @param {Object=} properties
+ */
+ styleSubtree(host, properties) {
+ let root = host.shadowRoot;
+ if (root || this._isRootOwner(host)) {
+ this.styleElement(host, properties);
+ }
+ // process the shadowdom children of `host`
+ let shadowChildren = root && (root.children || root.childNodes);
+ if (shadowChildren) {
+ for (let i = 0; i < shadowChildren.length; i++) {
+ let c = /** @type {!HTMLElement} */(shadowChildren[i]);
+ this.styleSubtree(c);
+ }
+ } else {
+ // process the lightdom children of `host`
+ let children = host.children || host.childNodes;
+ if (children) {
+ for (let i = 0; i < children.length; i++) {
+ let c = /** @type {!HTMLElement} */(children[i]);
+ this.styleSubtree(c);
+ }
+ }
+ }
+ }
+ /* Custom Style operations */
+ _revalidateCustomStyleApplyShim(customStyles) {
+ for (let i = 0; i < customStyles.length; i++) {
+ let c = customStyles[i];
+ let s = this._customStyleInterface['getStyleForCustomStyle'](c);
+ if (s) {
+ this._revalidateApplyShim(s);
+ }
+ }
+ }
+ _applyCustomStyles(customStyles) {
+ for (let i = 0; i < customStyles.length; i++) {
+ let c = customStyles[i];
+ let s = this._customStyleInterface['getStyleForCustomStyle'](c);
+ if (s) {
+ StyleProperties.applyCustomStyle(s, this._documentOwnerStyleInfo.styleProperties);
+ }
+ }
+ }
+ transformCustomStyleForDocument(style) {
+ let ast = StyleUtil.rulesForStyle(style);
+ StyleUtil.forEachRule(ast, (rule) => {
+ if (nativeShadow) {
+ StyleTransformer.normalizeRootSelector(rule);
+ } else {
+ StyleTransformer.documentRule(rule);
+ }
+ if (nativeCssVariables) {
+ this._ensure();
+ this._applyShim && this._applyShim['transformRule'](rule);
+ }
+ });
+ if (nativeCssVariables) {
+ style.textContent = StyleUtil.toCssText(ast);
+ } else {
+ this._documentOwnerStyleInfo.styleRules['rules'].push(ast);
+ }
+ }
+ _revalidateApplyShim(style) {
+ if (nativeCssVariables && this._applyShim) {
+ let ast = StyleUtil.rulesForStyle(style);
+ this._ensure();
+ this._applyShim['transformRules'](ast);
+ style.textContent = StyleUtil.toCssText(ast);
+ }
+ }
+ getComputedStyleValue(element, property) {
+ let value;
+ if (!nativeCssVariables) {
+ // element is either a style host, or an ancestor of a style host
+ let styleInfo = StyleInfo.get(element) || StyleInfo.get(this._styleOwnerForNode(element));
+ value = styleInfo.styleProperties[property];
+ }
+ // fall back to the property value from the computed styling
+ value = value || window.getComputedStyle(element).getPropertyValue(property);
+ // trim whitespace that can come after the `:` in css
+ // example: padding: 2px -> " 2px"
+ return value ? value.trim() : '';
+ }
+ // given an element and a classString, replaces
+ // the element's class with the provided classString and adds
+ // any necessary ShadyCSS static and property based scoping selectors
+ setElementClass(element, classString) {
+ let root = element.getRootNode();
+ let classes = classString ? classString.split(/\s/) : [];
+ let scopeName = root.host && root.host.localName;
+ // If no scope, try to discover scope name from existing class.
+ // This can occur if, for example, a template stamped element that
+ // has been scoped is manipulated when not in a root.
+ if (!scopeName) {
+ var classAttr = element.getAttribute('class');
+ if (classAttr) {
+ let k$ = classAttr.split(/\s/);
+ for (let i=0; i < k$.length; i++) {
+ if (k$[i] === StyleTransformer.SCOPE_NAME) {
+ scopeName = k$[i+1];
+ break;
+ }
+ }
+ }
+ }
+ if (scopeName) {
+ classes.push(StyleTransformer.SCOPE_NAME, scopeName);
+ }
+ if (!nativeCssVariables) {
+ let styleInfo = StyleInfo.get(element);
+ if (styleInfo && styleInfo.scopeSelector) {
+ classes.push(StyleProperties.XSCOPE_NAME, styleInfo.scopeSelector);
+ }
+ }
+ StyleUtil.setElementClassRaw(element, classes.join(' '));
+ }
+ _styleInfoForNode(node) {
+ return StyleInfo.get(node);
+ }
+}
+
+/* exports */
+ScopingShim.prototype['flush'] = ScopingShim.prototype.flush;
+ScopingShim.prototype['prepareTemplate'] = ScopingShim.prototype.prepareTemplate;
+ScopingShim.prototype['styleElement'] = ScopingShim.prototype.styleElement;
+ScopingShim.prototype['styleDocument'] = ScopingShim.prototype.styleDocument;
+ScopingShim.prototype['styleSubtree'] = ScopingShim.prototype.styleSubtree;
+ScopingShim.prototype['getComputedStyleValue'] = ScopingShim.prototype.getComputedStyleValue;
+ScopingShim.prototype['setElementClass'] = ScopingShim.prototype.setElementClass;
+ScopingShim.prototype['_styleInfoForNode'] = ScopingShim.prototype._styleInfoForNode;
+ScopingShim.prototype['transformCustomStyleForDocument'] = ScopingShim.prototype.transformCustomStyleForDocument;
+ScopingShim.prototype['getStyleAst'] = ScopingShim.prototype.getStyleAst;
+ScopingShim.prototype['styleAstToString'] = ScopingShim.prototype.styleAstToString;
+ScopingShim.prototype['flushCustomStyles'] = ScopingShim.prototype.flushCustomStyles;
+Object.defineProperties(ScopingShim.prototype, {
+ 'nativeShadow': {
+ get() {
+ return nativeShadow;
+ }
+ },
+ 'nativeCss': {
+ get() {
+ return nativeCssVariables;
+ }
+ }
+});
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-cache.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-cache.js
new file mode 100644
index 00000000000..7b51d0f4fce
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-cache.js
@@ -0,0 +1,51 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+'use strict';
+
+export default class StyleCache {
+ constructor(typeMax = 100) {
+ // map element name -> [{properties, styleElement, scopeSelector}]
+ this.cache = {};
+ this.typeMax = typeMax;
+ }
+
+ _validate(cacheEntry, properties, ownPropertyNames) {
+ for (let idx = 0; idx < ownPropertyNames.length; idx++) {
+ let pn = ownPropertyNames[idx];
+ if (cacheEntry.properties[pn] !== properties[pn]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ store(tagname, properties, styleElement, scopeSelector) {
+ let list = this.cache[tagname] || [];
+ list.push({properties, styleElement, scopeSelector});
+ if (list.length > this.typeMax) {
+ list.shift();
+ }
+ this.cache[tagname] = list;
+ }
+
+ fetch(tagname, properties, ownPropertyNames) {
+ let list = this.cache[tagname];
+ if (!list) {
+ return;
+ }
+ // reverse list for most-recent lookups
+ for (let idx = list.length - 1; idx >= 0; idx--) {
+ let entry = list[idx];
+ if (this._validate(entry, properties, ownPropertyNames)) {
+ return entry;
+ }
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-info.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-info.js
new file mode 100644
index 00000000000..39dbd370047
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-info.js
@@ -0,0 +1,74 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+'use strict';
+
+import {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars
+
+/** @const {string} */
+const infoKey = '__styleInfo';
+
+export default class StyleInfo {
+ /**
+ * @param {Element} node
+ * @return {StyleInfo}
+ */
+ static get(node) {
+ if (node) {
+ return node[infoKey];
+ } else {
+ return null;
+ }
+ }
+ /**
+ * @param {!Element} node
+ * @param {StyleInfo} styleInfo
+ * @return {StyleInfo}
+ */
+ static set(node, styleInfo) {
+ node[infoKey] = styleInfo;
+ return styleInfo;
+ }
+ /**
+ * @param {StyleNode} ast
+ * @param {Node=} placeholder
+ * @param {Array<string>=} ownStylePropertyNames
+ * @param {string=} elementName
+ * @param {string=} typeExtension
+ * @param {string=} cssBuild
+ */
+ constructor(ast, placeholder, ownStylePropertyNames, elementName, typeExtension, cssBuild) {
+ /** @type {StyleNode} */
+ this.styleRules = ast || null;
+ /** @type {Node} */
+ this.placeholder = placeholder || null;
+ /** @type {!Array<string>} */
+ this.ownStylePropertyNames = ownStylePropertyNames || [];
+ /** @type {Array<Object>} */
+ this.overrideStyleProperties = null;
+ /** @type {string} */
+ this.elementName = elementName || '';
+ /** @type {string} */
+ this.cssBuild = cssBuild || '';
+ /** @type {string} */
+ this.typeExtension = typeExtension || '';
+ /** @type {Object<string, string>} */
+ this.styleProperties = null;
+ /** @type {?string} */
+ this.scopeSelector = null;
+ /** @type {HTMLStyleElement} */
+ this.customStyle = null;
+ }
+ _getStyleRules() {
+ return this.styleRules;
+ }
+}
+
+StyleInfo.prototype['_getStyleRules'] = StyleInfo.prototype._getStyleRules; \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-placeholder.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-placeholder.js
new file mode 100644
index 00000000000..66db235f8d8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-placeholder.js
@@ -0,0 +1,40 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+'use strict';
+
+import {applyStylePlaceHolder} from './style-util.js';
+import {nativeShadow} from './style-settings.js';
+
+/** @type {Object<string, !Node>} */
+let placeholderMap = {};
+
+/**
+ * @const {CustomElementRegistry}
+ */
+const ce = window['customElements'];
+if (ce && !nativeShadow) {
+ /**
+ * @const {function(this:CustomElementRegistry, string,function(new:HTMLElement),{extends: string}=)}
+ */
+ const origDefine = ce['define'];
+ /**
+ * @param {string} name
+ * @param {function(new:HTMLElement)} clazz
+ * @param {{extends: string}=} options
+ */
+ const wrappedDefine = (name, clazz, options) => {
+ placeholderMap[name] = applyStylePlaceHolder(name);
+ origDefine.call(/** @type {!CustomElementRegistry} */(ce), name, clazz, options);
+ };
+ ce['define'] = wrappedDefine;
+}
+
+export default placeholderMap;
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-properties.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-properties.js
new file mode 100644
index 00000000000..453d3bbcef7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-properties.js
@@ -0,0 +1,612 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+'use strict';
+
+import {removeCustomPropAssignment, StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars
+import {nativeShadow} from './style-settings.js';
+import StyleTransformer from './style-transformer.js';
+import * as StyleUtil from './style-util.js';
+import * as RX from './common-regex.js';
+import StyleInfo from './style-info.js';
+
+// TODO: dedupe with shady
+/**
+ * @param {string} selector
+ * @return {boolean}
+ * @this {Element}
+ */
+const matchesSelector = function(selector) {
+ const method = this.matches || this.matchesSelector ||
+ this.mozMatchesSelector || this.msMatchesSelector ||
+ this.oMatchesSelector || this.webkitMatchesSelector;
+ return method && method.call(this, selector);
+};
+
+const IS_IE = navigator.userAgent.match('Trident');
+
+const XSCOPE_NAME = 'x-scope';
+
+class StyleProperties {
+ get XSCOPE_NAME() {
+ return XSCOPE_NAME;
+ }
+/**
+ * decorates styles with rule info and returns an array of used style property names
+ *
+ * @param {StyleNode} rules
+ * @return {Array<string>}
+ */
+ decorateStyles(rules) {
+ let self = this, props = {}, keyframes = [], ruleIndex = 0;
+ StyleUtil.forEachRule(rules, function(rule) {
+ self.decorateRule(rule);
+ // mark in-order position of ast rule in styles block, used for cache key
+ rule.index = ruleIndex++;
+ self.collectPropertiesInCssText(rule.propertyInfo.cssText, props);
+ }, function onKeyframesRule(rule) {
+ keyframes.push(rule);
+ });
+ // Cache all found keyframes rules for later reference:
+ rules._keyframes = keyframes;
+ // return this list of property names *consumes* in these styles.
+ let names = [];
+ for (let i in props) {
+ names.push(i);
+ }
+ return names;
+ }
+
+ // decorate a single rule with property info
+ decorateRule(rule) {
+ if (rule.propertyInfo) {
+ return rule.propertyInfo;
+ }
+ let info = {}, properties = {};
+ let hasProperties = this.collectProperties(rule, properties);
+ if (hasProperties) {
+ info.properties = properties;
+ // TODO(sorvell): workaround parser seeing mixins as additional rules
+ rule['rules'] = null;
+ }
+ info.cssText = this.collectCssText(rule);
+ rule.propertyInfo = info;
+ return info;
+ }
+
+ // collects the custom properties from a rule's cssText
+ collectProperties(rule, properties) {
+ let info = rule.propertyInfo;
+ if (info) {
+ if (info.properties) {
+ Object.assign(properties, info.properties);
+ return true;
+ }
+ } else {
+ let m, rx = RX.VAR_ASSIGN;
+ let cssText = rule['parsedCssText'];
+ let value;
+ let any;
+ while ((m = rx.exec(cssText))) {
+ // note: group 2 is var, 3 is mixin
+ value = (m[2] || m[3]).trim();
+ // value of 'inherit' or 'unset' is equivalent to not setting the property here
+ if (value !== 'inherit' || value !== 'unset') {
+ properties[m[1].trim()] = value;
+ }
+ any = true;
+ }
+ return any;
+ }
+
+ }
+
+ // returns cssText of properties that consume variables/mixins
+ collectCssText(rule) {
+ return this.collectConsumingCssText(rule['parsedCssText']);
+ }
+
+ // NOTE: we support consumption inside mixin assignment
+ // but not production, so strip out {...}
+ collectConsumingCssText(cssText) {
+ return cssText.replace(RX.BRACKETED, '')
+ .replace(RX.VAR_ASSIGN, '');
+ }
+
+ collectPropertiesInCssText(cssText, props) {
+ let m;
+ while ((m = RX.VAR_CONSUMED.exec(cssText))) {
+ let name = m[1];
+ // This regex catches all variable names, and following non-whitespace char
+ // If next char is not ':', then variable is a consumer
+ if (m[2] !== ':') {
+ props[name] = true;
+ }
+ }
+ }
+
+ // turns custom properties into realized values.
+ reify(props) {
+ // big perf optimization here: reify only *own* properties
+ // since this object has __proto__ of the element's scope properties
+ let names = Object.getOwnPropertyNames(props);
+ for (let i=0, n; i < names.length; i++) {
+ n = names[i];
+ props[n] = this.valueForProperty(props[n], props);
+ }
+ }
+
+ // given a property value, returns the reified value
+ // a property value may be:
+ // (1) a literal value like: red or 5px;
+ // (2) a variable value like: var(--a), var(--a, red), or var(--a, --b) or
+ // var(--a, var(--b));
+ // (3) a literal mixin value like { properties }. Each of these properties
+ // can have values that are: (a) literal, (b) variables, (c) @apply mixins.
+ valueForProperty(property, props) {
+ // case (1) default
+ // case (3) defines a mixin and we have to reify the internals
+ if (property) {
+ if (property.indexOf(';') >=0) {
+ property = this.valueForProperties(property, props);
+ } else {
+ // case (2) variable
+ let self = this;
+ let fn = function(prefix, value, fallback, suffix) {
+ if (!value) {
+ return prefix + suffix;
+ }
+ let propertyValue = self.valueForProperty(props[value], props);
+ // if value is "initial", then the variable should be treated as unset
+ if (!propertyValue || propertyValue === 'initial') {
+ // fallback may be --a or var(--a) or literal
+ propertyValue = self.valueForProperty(props[fallback] || fallback, props) ||
+ fallback;
+ } else if (propertyValue === 'apply-shim-inherit') {
+ // CSS build will replace `inherit` with `apply-shim-inherit`
+ // for use with native css variables.
+ // Since we have full control, we can use `inherit` directly.
+ propertyValue = 'inherit';
+ }
+ return prefix + (propertyValue || '') + suffix;
+ };
+ property = StyleUtil.processVariableAndFallback(property, fn);
+ }
+ }
+ return property && property.trim() || '';
+ }
+
+ // note: we do not yet support mixin within mixin
+ valueForProperties(property, props) {
+ let parts = property.split(';');
+ for (let i=0, p, m; i<parts.length; i++) {
+ if ((p = parts[i])) {
+ RX.MIXIN_MATCH.lastIndex = 0;
+ m = RX.MIXIN_MATCH.exec(p);
+ if (m) {
+ p = this.valueForProperty(props[m[1]], props);
+ } else {
+ let colon = p.indexOf(':');
+ if (colon !== -1) {
+ let pp = p.substring(colon);
+ pp = pp.trim();
+ pp = this.valueForProperty(pp, props) || pp;
+ p = p.substring(0, colon) + pp;
+ }
+ }
+ parts[i] = (p && p.lastIndexOf(';') === p.length - 1) ?
+ // strip trailing ;
+ p.slice(0, -1) :
+ p || '';
+ }
+ }
+ return parts.join(';');
+ }
+
+ applyProperties(rule, props) {
+ let output = '';
+ // dynamically added sheets may not be decorated so ensure they are.
+ if (!rule.propertyInfo) {
+ this.decorateRule(rule);
+ }
+ if (rule.propertyInfo.cssText) {
+ output = this.valueForProperties(rule.propertyInfo.cssText, props);
+ }
+ rule['cssText'] = output;
+ }
+
+ // Apply keyframe transformations to the cssText of a given rule. The
+ // keyframeTransforms object is a map of keyframe names to transformer
+ // functions which take in cssText and spit out transformed cssText.
+ applyKeyframeTransforms(rule, keyframeTransforms) {
+ let input = rule['cssText'];
+ let output = rule['cssText'];
+ if (rule.hasAnimations == null) {
+ // Cache whether or not the rule has any animations to begin with:
+ rule.hasAnimations = RX.ANIMATION_MATCH.test(input);
+ }
+ // If there are no animations referenced, we can skip transforms:
+ if (rule.hasAnimations) {
+ let transform;
+ // If we haven't transformed this rule before, we iterate over all
+ // transforms:
+ if (rule.keyframeNamesToTransform == null) {
+ rule.keyframeNamesToTransform = [];
+ for (let keyframe in keyframeTransforms) {
+ transform = keyframeTransforms[keyframe];
+ output = transform(input);
+ // If the transform actually changed the CSS text, we cache the
+ // transform name for future use:
+ if (input !== output) {
+ input = output;
+ rule.keyframeNamesToTransform.push(keyframe);
+ }
+ }
+ } else {
+ // If we already have a list of keyframe names that apply to this
+ // rule, we apply only those keyframe name transforms:
+ for (let i = 0; i < rule.keyframeNamesToTransform.length; ++i) {
+ transform = keyframeTransforms[rule.keyframeNamesToTransform[i]];
+ input = transform(input);
+ }
+ output = input;
+ }
+ }
+ rule['cssText'] = output;
+ }
+
+ // Test if the rules in these styles matches the given `element` and if so,
+ // collect any custom properties into `props`.
+ /**
+ * @param {StyleNode} rules
+ * @param {Element} element
+ */
+ propertyDataFromStyles(rules, element) {
+ let props = {}, self = this;
+ // generates a unique key for these matches
+ let o = [];
+ // note: active rules excludes non-matching @media rules
+ StyleUtil.forEachRule(rules, function(rule) {
+ // TODO(sorvell): we could trim the set of rules at declaration
+ // time to only include ones that have properties
+ if (!rule.propertyInfo) {
+ self.decorateRule(rule);
+ }
+ // match element against transformedSelector: selector may contain
+ // unwanted uniquification and parsedSelector does not directly match
+ // for :host selectors.
+ let selectorToMatch = rule.transformedSelector || rule['parsedSelector'];
+ if (element && rule.propertyInfo.properties && selectorToMatch) {
+ if (matchesSelector.call(element, selectorToMatch)) {
+ self.collectProperties(rule, props);
+ // produce numeric key for these matches for lookup
+ addToBitMask(rule.index, o);
+ }
+ }
+ }, null, true);
+ return {properties: props, key: o};
+ }
+
+ /**
+ * @param {Element} scope
+ * @param {StyleNode} rule
+ * @param {string|undefined} cssBuild
+ * @param {function(Object)} callback
+ */
+ whenHostOrRootRule(scope, rule, cssBuild, callback) {
+ if (!rule.propertyInfo) {
+ this.decorateRule(rule);
+ }
+ if (!rule.propertyInfo.properties) {
+ return;
+ }
+ let {is, typeExtension} = StyleUtil.getIsExtends(scope);
+ let hostScope = is ?
+ StyleTransformer._calcHostScope(is, typeExtension) :
+ 'html';
+ let parsedSelector = rule['parsedSelector'];
+ let isRoot = (parsedSelector === ':host > *' || parsedSelector === 'html');
+ let isHost = parsedSelector.indexOf(':host') === 0 && !isRoot;
+ // build info is either in scope (when scope is an element) or in the style
+ // when scope is the default scope; note: this allows default scope to have
+ // mixed mode built and unbuilt styles.
+ if (cssBuild === 'shady') {
+ // :root -> x-foo > *.x-foo for elements and html for custom-style
+ isRoot = parsedSelector === (hostScope + ' > *.' + hostScope) || parsedSelector.indexOf('html') !== -1;
+ // :host -> x-foo for elements, but sub-rules have .x-foo in them
+ isHost = !isRoot && parsedSelector.indexOf(hostScope) === 0;
+ }
+ if (cssBuild === 'shadow') {
+ isRoot = parsedSelector === ':host > *' || parsedSelector === 'html';
+ isHost = isHost && !isRoot;
+ }
+ if (!isRoot && !isHost) {
+ return;
+ }
+ let selectorToMatch = hostScope;
+ if (isHost) {
+ // need to transform :host because `:host` does not work with `matches`
+ if (!rule.transformedSelector) {
+ // transform :host into a matchable selector
+ rule.transformedSelector =
+ StyleTransformer._transformRuleCss(
+ rule,
+ StyleTransformer._transformComplexSelector,
+ StyleTransformer._calcElementScope(is),
+ hostScope
+ );
+ }
+ selectorToMatch = rule.transformedSelector || hostScope;
+ }
+ callback({
+ selector: selectorToMatch,
+ isHost: isHost,
+ isRoot: isRoot
+ });
+ }
+/**
+ * @param {Element} scope
+ * @param {StyleNode} rules
+ * @return {Object}
+ */
+ hostAndRootPropertiesForScope(scope, rules) {
+ let hostProps = {}, rootProps = {}, self = this;
+ // note: active rules excludes non-matching @media rules
+ let cssBuild = rules && rules['__cssBuild'];
+ StyleUtil.forEachRule(rules, function(rule) {
+ // if scope is StyleDefaults, use _element for matchesSelector
+ self.whenHostOrRootRule(scope, rule, cssBuild, function(info) {
+ let element = scope._element || scope;
+ if (matchesSelector.call(element, info.selector)) {
+ if (info.isHost) {
+ self.collectProperties(rule, hostProps);
+ } else {
+ self.collectProperties(rule, rootProps);
+ }
+ }
+ });
+ }, null, true);
+ return {rootProps: rootProps, hostProps: hostProps};
+ }
+
+ /**
+ * @param {Element} element
+ * @param {Object} properties
+ * @param {string} scopeSelector
+ */
+ transformStyles(element, properties, scopeSelector) {
+ let self = this;
+ let {is, typeExtension} = StyleUtil.getIsExtends(element);
+ let hostSelector = StyleTransformer
+ ._calcHostScope(is, typeExtension);
+ let rxHostSelector = element.extends ?
+ '\\' + hostSelector.slice(0, -1) + '\\]' :
+ hostSelector;
+ let hostRx = new RegExp(RX.HOST_PREFIX + rxHostSelector +
+ RX.HOST_SUFFIX);
+ let rules = StyleInfo.get(element).styleRules;
+ let keyframeTransforms =
+ this._elementKeyframeTransforms(element, rules, scopeSelector);
+ return StyleTransformer.elementStyles(element, rules, function(rule) {
+ self.applyProperties(rule, properties);
+ if (!nativeShadow &&
+ !StyleUtil.isKeyframesSelector(rule) &&
+ rule['cssText']) {
+ // NOTE: keyframe transforms only scope munge animation names, so it
+ // is not necessary to apply them in ShadowDOM.
+ self.applyKeyframeTransforms(rule, keyframeTransforms);
+ self._scopeSelector(rule, hostRx, hostSelector, scopeSelector);
+ }
+ });
+ }
+
+ /**
+ * @param {Element} element
+ * @param {StyleNode} rules
+ * @param {string} scopeSelector
+ * @return {Object}
+ */
+ _elementKeyframeTransforms(element, rules, scopeSelector) {
+ let keyframesRules = rules._keyframes;
+ let keyframeTransforms = {};
+ if (!nativeShadow && keyframesRules) {
+ // For non-ShadowDOM, we transform all known keyframes rules in
+ // advance for the current scope. This allows us to catch keyframes
+ // rules that appear anywhere in the stylesheet:
+ for (let i = 0, keyframesRule = keyframesRules[i];
+ i < keyframesRules.length;
+ keyframesRule = keyframesRules[++i]) {
+ this._scopeKeyframes(keyframesRule, scopeSelector);
+ keyframeTransforms[keyframesRule['keyframesName']] =
+ this._keyframesRuleTransformer(keyframesRule);
+ }
+ }
+ return keyframeTransforms;
+ }
+
+ // Generate a factory for transforming a chunk of CSS text to handle a
+ // particular scoped keyframes rule.
+ /**
+ * @param {StyleNode} keyframesRule
+ * @return {function(string):string}
+ */
+ _keyframesRuleTransformer(keyframesRule) {
+ return function(cssText) {
+ return cssText.replace(
+ keyframesRule.keyframesNameRx,
+ keyframesRule.transformedKeyframesName);
+ };
+ }
+
+/**
+ * Transforms `@keyframes` names to be unique for the current host.
+ * Example: @keyframes foo-anim -> @keyframes foo-anim-x-foo-0
+ *
+ * @param {StyleNode} rule
+ * @param {string} scopeId
+ */
+ _scopeKeyframes(rule, scopeId) {
+ // Animation names are of the form [\w-], so ensure that the name regex does not partially apply
+ // to similarly named keyframe names by checking for a word boundary at the beginning and
+ // a non-word boundary or `-` at the end.
+ rule.keyframesNameRx = new RegExp(`\\b${rule['keyframesName']}(?!\\B|-)`, 'g');
+ rule.transformedKeyframesName = rule['keyframesName'] + '-' + scopeId;
+ rule.transformedSelector = rule.transformedSelector || rule['selector'];
+ rule['selector'] = rule.transformedSelector.replace(
+ rule['keyframesName'], rule.transformedKeyframesName);
+ }
+
+ // Strategy: x scope shim a selector e.g. to scope `.x-foo-42` (via classes):
+ // non-host selector: .a.x-foo -> .x-foo-42 .a.x-foo
+ // host selector: x-foo.wide -> .x-foo-42.wide
+ // note: we use only the scope class (.x-foo-42) and not the hostSelector
+ // (x-foo) to scope :host rules; this helps make property host rules
+ // have low specificity. They are overrideable by class selectors but,
+ // unfortunately, not by type selectors (e.g. overriding via
+ // `.special` is ok, but not by `x-foo`).
+ /**
+ * @param {StyleNode} rule
+ * @param {RegExp} hostRx
+ * @param {string} hostSelector
+ * @param {string} scopeId
+ */
+ _scopeSelector(rule, hostRx, hostSelector, scopeId) {
+ rule.transformedSelector = rule.transformedSelector || rule['selector'];
+ let selector = rule.transformedSelector;
+ let scope = '.' + scopeId;
+ let parts = selector.split(',');
+ for (let i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {
+ parts[i] = p.match(hostRx) ?
+ p.replace(hostSelector, scope) :
+ scope + ' ' + p;
+ }
+ rule['selector'] = parts.join(',');
+ }
+
+ /**
+ * @param {Element} element
+ * @param {string} selector
+ * @param {string} old
+ */
+ applyElementScopeSelector(element, selector, old) {
+ let c = element.getAttribute('class') || '';
+ let v = c;
+ if (old) {
+ v = c.replace(
+ new RegExp('\\s*' + XSCOPE_NAME + '\\s*' + old + '\\s*', 'g'), ' ');
+ }
+ v += (v ? ' ' : '') + XSCOPE_NAME + ' ' + selector;
+ if (c !== v) {
+ StyleUtil.setElementClassRaw(element, v);
+ }
+ }
+
+ /**
+ * @param {HTMLElement} element
+ * @param {Object} properties
+ * @param {string} selector
+ * @param {HTMLStyleElement} style
+ * @return {HTMLStyleElement}
+ */
+ applyElementStyle(element, properties, selector, style) {
+ // calculate cssText to apply
+ let cssText = style ? style.textContent || '' :
+ this.transformStyles(element, properties, selector);
+ // if shady and we have a cached style that is not style, decrement
+ let styleInfo = StyleInfo.get(element);
+ let s = styleInfo.customStyle;
+ if (s && !nativeShadow && (s !== style)) {
+ s['_useCount']--;
+ if (s['_useCount'] <= 0 && s.parentNode) {
+ s.parentNode.removeChild(s);
+ }
+ }
+ // apply styling always under native or if we generated style
+ // or the cached style is not in document(!)
+ if (nativeShadow) {
+ // update existing style only under native
+ if (styleInfo.customStyle) {
+ styleInfo.customStyle.textContent = cssText;
+ style = styleInfo.customStyle;
+ // otherwise, if we have css to apply, do so
+ } else if (cssText) {
+ // apply css after the scope style of the element to help with
+ // style precedence rules.
+ style = StyleUtil.applyCss(cssText, selector, element.shadowRoot,
+ styleInfo.placeholder);
+ }
+ } else {
+ // shady and no cache hit
+ if (!style) {
+ // apply css after the scope style of the element to help with
+ // style precedence rules.
+ if (cssText) {
+ style = StyleUtil.applyCss(cssText, selector, null,
+ styleInfo.placeholder);
+ }
+ // shady and cache hit but not in document
+ } else if (!style.parentNode) {
+ if (IS_IE && cssText.indexOf('@media') > -1) {
+ // @media rules may be stale in IE 10 and 11
+ // refresh the text content of the style to revalidate them.
+ style.textContent = cssText;
+ }
+ StyleUtil.applyStyle(style, null, styleInfo.placeholder);
+ }
+ }
+ // ensure this style is our custom style and increment its use count.
+ if (style) {
+ style['_useCount'] = style['_useCount'] || 0;
+ // increment use count if we changed styles
+ if (styleInfo.customStyle != style) {
+ style['_useCount']++;
+ }
+ styleInfo.customStyle = style;
+ }
+ return style;
+ }
+
+ /**
+ * @param {Element} style
+ * @param {Object} properties
+ */
+ applyCustomStyle(style, properties) {
+ let rules = StyleUtil.rulesForStyle(/** @type {HTMLStyleElement} */(style));
+ let self = this;
+ style.textContent = StyleUtil.toCssText(rules, function(/** StyleNode */rule) {
+ let css = rule['cssText'] = rule['parsedCssText'];
+ if (rule.propertyInfo && rule.propertyInfo.cssText) {
+ // remove property assignments
+ // so next function isn't confused
+ // NOTE: we have 3 categories of css:
+ // (1) normal properties,
+ // (2) custom property assignments (--foo: red;),
+ // (3) custom property usage: border: var(--foo); @apply(--foo);
+ // In elements, 1 and 3 are separated for efficiency; here they
+ // are not and this makes this case unique.
+ css = removeCustomPropAssignment(/** @type {string} */(css));
+ // replace with reified properties, scenario is same as mixin
+ rule['cssText'] = self.valueForProperties(css, properties);
+ }
+ });
+ }
+}
+
+/**
+ * @param {number} n
+ * @param {Array<number>} bits
+ */
+function addToBitMask(n, bits) {
+ let o = parseInt(n / 32, 10);
+ let v = 1 << (n % 32);
+ bits[o] = (bits[o] || 0) | v;
+}
+
+export default new StyleProperties(); \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-settings.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-settings.js
new file mode 100644
index 00000000000..5ed9718f5a1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-settings.js
@@ -0,0 +1,47 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+'use strict';
+
+export const nativeShadow = !(window['ShadyDOM'] && window['ShadyDOM']['inUse']);
+let nativeCssVariables_;
+
+/**
+ * @param {(ShadyCSSOptions | ShadyCSSInterface)=} settings
+ */
+function calcCssVariables(settings) {
+ if (settings && settings['shimcssproperties']) {
+ nativeCssVariables_ = false;
+ } else {
+ // chrome 49 has semi-working css vars, check if box-shadow works
+ // safari 9.1 has a recalc bug: https://bugs.webkit.org/show_bug.cgi?id=155782
+ // However, shim css custom properties are only supported with ShadyDOM enabled,
+ // so fall back on native if we do not detect ShadyDOM
+ // Edge 15: custom properties used in ::before and ::after will also be used in the parent element
+ // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12414257/
+ nativeCssVariables_ = nativeShadow || Boolean(!navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/) &&
+ window.CSS && CSS.supports && CSS.supports('box-shadow', '0 0 0 var(--foo)'));
+ }
+}
+
+if (window.ShadyCSS && window.ShadyCSS.nativeCss !== undefined) {
+ nativeCssVariables_ = window.ShadyCSS.nativeCss;
+} else if (window.ShadyCSS) {
+ calcCssVariables(window.ShadyCSS);
+ // reset window variable to let ShadyCSS API take its place
+ window.ShadyCSS = undefined;
+} else {
+ calcCssVariables(window['WebComponents'] && window['WebComponents']['flags']);
+}
+
+// Hack for type error under new type inference which doesn't like that
+// nativeCssVariables is updated in a function and assigns the type
+// `function(): ?` instead of `boolean`.
+export const nativeCssVariables = /** @type {boolean} */(nativeCssVariables_);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-transformer.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-transformer.js
new file mode 100644
index 00000000000..498f3ad5f51
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-transformer.js
@@ -0,0 +1,363 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+'use strict';
+
+import {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars
+import * as StyleUtil from './style-util.js';
+import {nativeShadow} from './style-settings.js';
+
+/* Transforms ShadowDOM styling into ShadyDOM styling
+
+* scoping:
+
+ * elements in scope get scoping selector class="x-foo-scope"
+ * selectors re-written as follows:
+
+ div button -> div.x-foo-scope button.x-foo-scope
+
+* :host -> scopeName
+
+* :host(...) -> scopeName...
+
+* ::slotted(...) -> scopeName > ...
+
+* ...:dir(ltr|rtl) -> [dir="ltr|rtl"] ..., ...[dir="ltr|rtl"]
+
+* :host(:dir[rtl]) -> scopeName:dir(rtl) -> [dir="rtl"] scopeName, scopeName[dir="rtl"]
+
+*/
+const SCOPE_NAME = 'style-scope';
+
+class StyleTransformer {
+ get SCOPE_NAME() {
+ return SCOPE_NAME;
+ }
+ /**
+ * Given a node and scope name, add a scoping class to each node
+ * in the tree. This facilitates transforming css into scoped rules.
+ * @param {?} node
+ * @param {?} scope
+ * @param {?=} shouldRemoveScope
+ */
+ dom(node, scope, shouldRemoveScope) {
+ // one time optimization to skip scoping...
+ if (node['__styleScoped']) {
+ node['__styleScoped'] = null;
+ } else {
+ this._transformDom(node, scope || '', shouldRemoveScope);
+ }
+ }
+
+ _transformDom(node, selector, shouldRemoveScope) {
+ if (node.nodeType === Node.ELEMENT_NODE) {
+ this.element(node, selector, shouldRemoveScope);
+ }
+ let c$ = (node.localName === 'template') ?
+ (node.content || node._content).childNodes :
+ node.children || node.childNodes;
+ if (c$) {
+ for (let i=0; i<c$.length; i++) {
+ this._transformDom(c$[i], selector, shouldRemoveScope);
+ }
+ }
+ }
+ /**
+ * @param {?} element
+ * @param {?} scope
+ * @param {?=} shouldRemoveScope
+ */
+ element(element, scope, shouldRemoveScope) {
+ // note: if using classes, we add both the general 'style-scope' class
+ // as well as the specific scope. This enables easy filtering of all
+ // `style-scope` elements
+ if (scope) {
+ // note: svg on IE does not have classList so fallback to class
+ if (element.classList) {
+ if (shouldRemoveScope) {
+ element.classList.remove(SCOPE_NAME);
+ element.classList.remove(scope);
+ } else {
+ element.classList.add(SCOPE_NAME);
+ element.classList.add(scope);
+ }
+ } else if (element.getAttribute) {
+ let c = element.getAttribute(CLASS);
+ if (shouldRemoveScope) {
+ if (c) {
+ let newValue = c.replace(SCOPE_NAME, '').replace(scope, '');
+ StyleUtil.setElementClassRaw(element, newValue);
+ }
+ } else {
+ let newValue = (c ? c + ' ' : '') + SCOPE_NAME + ' ' + scope;
+ StyleUtil.setElementClassRaw(element, newValue);
+ }
+ }
+ }
+ }
+
+ /**
+ * @param {?} element
+ * @param {?} styleRules
+ * @param {?=} callback
+ */
+ elementStyles(element, styleRules, callback) {
+ let cssBuildType = element['__cssBuild'];
+ // no need to shim selectors if settings.useNativeShadow, also
+ // a shady css build will already have transformed selectors
+ // NOTE: This method may be called as part of static or property shimming.
+ // When there is a targeted build it will not be called for static shimming,
+ // but when the property shim is used it is called and should opt out of
+ // static shimming work when a proper build exists.
+ let cssText = '';
+ if (nativeShadow || cssBuildType === 'shady') {
+ cssText = StyleUtil.toCssText(styleRules, callback);
+ } else {
+ let {is, typeExtension} = StyleUtil.getIsExtends(element);
+ cssText = this.css(styleRules, is, typeExtension, callback) + '\n\n';
+ }
+ return cssText.trim();
+ }
+
+ // Given a string of cssText and a scoping string (scope), returns
+ // a string of scoped css where each selector is transformed to include
+ // a class created from the scope. ShadowDOM selectors are also transformed
+ // (e.g. :host) to use the scoping selector.
+ css(rules, scope, ext, callback) {
+ let hostScope = this._calcHostScope(scope, ext);
+ scope = this._calcElementScope(scope);
+ let self = this;
+ return StyleUtil.toCssText(rules, function(/** StyleNode */rule) {
+ if (!rule.isScoped) {
+ self.rule(rule, scope, hostScope);
+ rule.isScoped = true;
+ }
+ if (callback) {
+ callback(rule, scope, hostScope);
+ }
+ });
+ }
+
+ _calcElementScope(scope) {
+ if (scope) {
+ return CSS_CLASS_PREFIX + scope;
+ } else {
+ return '';
+ }
+ }
+
+ _calcHostScope(scope, ext) {
+ return ext ? `[is=${scope}]` : scope;
+ }
+
+ rule(rule, scope, hostScope) {
+ this._transformRule(rule, this._transformComplexSelector,
+ scope, hostScope);
+ }
+
+ /**
+ * transforms a css rule to a scoped rule.
+ *
+ * @param {StyleNode} rule
+ * @param {Function} transformer
+ * @param {string=} scope
+ * @param {string=} hostScope
+ */
+ _transformRule(rule, transformer, scope, hostScope) {
+ // NOTE: save transformedSelector for subsequent matching of elements
+ // against selectors (e.g. when calculating style properties)
+ rule['selector'] = rule.transformedSelector =
+ this._transformRuleCss(rule, transformer, scope, hostScope);
+ }
+
+ /**
+ * @param {StyleNode} rule
+ * @param {Function} transformer
+ * @param {string=} scope
+ * @param {string=} hostScope
+ */
+ _transformRuleCss(rule, transformer, scope, hostScope) {
+ let p$ = rule['selector'].split(COMPLEX_SELECTOR_SEP);
+ // we want to skip transformation of rules that appear in keyframes,
+ // because they are keyframe selectors, not element selectors.
+ if (!StyleUtil.isKeyframesSelector(rule)) {
+ for (let i=0, l=p$.length, p; (i<l) && (p=p$[i]); i++) {
+ p$[i] = transformer.call(this, p, scope, hostScope);
+ }
+ }
+ return p$.join(COMPLEX_SELECTOR_SEP);
+ }
+
+ /**
+ * @param {string} selector
+ * @return {string}
+ */
+ _twiddleNthPlus(selector) {
+ return selector.replace(NTH, (m, type, inside) => {
+ if (inside.indexOf('+') > -1) {
+ inside = inside.replace(/\+/g, '___');
+ } else if (inside.indexOf('___') > -1) {
+ inside = inside.replace(/___/g, '+');
+ }
+ return `:${type}(${inside})`;
+ });
+ }
+
+/**
+ * @param {string} selector
+ * @param {string} scope
+ * @param {string=} hostScope
+ */
+ _transformComplexSelector(selector, scope, hostScope) {
+ let stop = false;
+ selector = selector.trim();
+ // Remove spaces inside of selectors like `:nth-of-type` because it confuses SIMPLE_SELECTOR_SEP
+ let isNth = NTH.test(selector);
+ if (isNth) {
+ selector = selector.replace(NTH, (m, type, inner) => `:${type}(${inner.replace(/\s/g, '')})`)
+ selector = this._twiddleNthPlus(selector);
+ }
+ selector = selector.replace(SLOTTED_START, `${HOST} $1`);
+ selector = selector.replace(SIMPLE_SELECTOR_SEP, (m, c, s) => {
+ if (!stop) {
+ let info = this._transformCompoundSelector(s, c, scope, hostScope);
+ stop = stop || info.stop;
+ c = info.combinator;
+ s = info.value;
+ }
+ return c + s;
+ });
+ if (isNth) {
+ selector = this._twiddleNthPlus(selector);
+ }
+ return selector;
+ }
+
+ _transformCompoundSelector(selector, combinator, scope, hostScope) {
+ // replace :host with host scoping class
+ let slottedIndex = selector.indexOf(SLOTTED);
+ if (selector.indexOf(HOST) >= 0) {
+ selector = this._transformHostSelector(selector, hostScope);
+ // replace other selectors with scoping class
+ } else if (slottedIndex !== 0) {
+ selector = scope ? this._transformSimpleSelector(selector, scope) :
+ selector;
+ }
+ // mark ::slotted() scope jump to replace with descendant selector + arg
+ // also ignore left-side combinator
+ let slotted = false;
+ if (slottedIndex >= 0) {
+ combinator = '';
+ slotted = true;
+ }
+ // process scope jumping selectors up to the scope jump and then stop
+ let stop;
+ if (slotted) {
+ stop = true;
+ if (slotted) {
+ // .zonk ::slotted(.foo) -> .zonk.scope > .foo
+ selector = selector.replace(SLOTTED_PAREN, (m, paren) => ` > ${paren}`);
+ }
+ }
+ selector = selector.replace(DIR_PAREN, (m, before, dir) =>
+ `[dir="${dir}"] ${before}, ${before}[dir="${dir}"]`);
+ return {value: selector, combinator, stop};
+ }
+
+ _transformSimpleSelector(selector, scope) {
+ let p$ = selector.split(PSEUDO_PREFIX);
+ p$[0] += scope;
+ return p$.join(PSEUDO_PREFIX);
+ }
+
+ // :host(...) -> scopeName...
+ _transformHostSelector(selector, hostScope) {
+ let m = selector.match(HOST_PAREN);
+ let paren = m && m[2].trim() || '';
+ if (paren) {
+ if (!paren[0].match(SIMPLE_SELECTOR_PREFIX)) {
+ // paren starts with a type selector
+ let typeSelector = paren.split(SIMPLE_SELECTOR_PREFIX)[0];
+ // if the type selector is our hostScope then avoid pre-pending it
+ if (typeSelector === hostScope) {
+ return paren;
+ // otherwise, this selector should not match in this scope so
+ // output a bogus selector.
+ } else {
+ return SELECTOR_NO_MATCH;
+ }
+ } else {
+ // make sure to do a replace here to catch selectors like:
+ // `:host(.foo)::before`
+ return selector.replace(HOST_PAREN, function(m, host, paren) {
+ return hostScope + paren;
+ });
+ }
+ // if no paren, do a straight :host replacement.
+ // TODO(sorvell): this should not strictly be necessary but
+ // it's needed to maintain support for `:host[foo]` type selectors
+ // which have been improperly used under Shady DOM. This should be
+ // deprecated.
+ } else {
+ return selector.replace(HOST, hostScope);
+ }
+ }
+
+ /**
+ * @param {StyleNode} rule
+ */
+ documentRule(rule) {
+ // reset selector in case this is redone.
+ rule['selector'] = rule['parsedSelector'];
+ this.normalizeRootSelector(rule);
+ this._transformRule(rule, this._transformDocumentSelector);
+ }
+
+ /**
+ * @param {StyleNode} rule
+ */
+ normalizeRootSelector(rule) {
+ if (rule['selector'] === ROOT) {
+ rule['selector'] = 'html';
+ }
+ }
+
+/**
+ * @param {string} selector
+ */
+ _transformDocumentSelector(selector) {
+ return selector.match(SLOTTED) ?
+ this._transformComplexSelector(selector, SCOPE_DOC_SELECTOR) :
+ this._transformSimpleSelector(selector.trim(), SCOPE_DOC_SELECTOR);
+ }
+}
+
+let NTH = /:(nth[-\w]+)\(([^)]+)\)/;
+let SCOPE_DOC_SELECTOR = `:not(.${SCOPE_NAME})`;
+let COMPLEX_SELECTOR_SEP = ',';
+let SIMPLE_SELECTOR_SEP = /(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=[])+)/g;
+let SIMPLE_SELECTOR_PREFIX = /[[.:#*]/;
+let HOST = ':host';
+let ROOT = ':root';
+let SLOTTED = '::slotted';
+let SLOTTED_START = new RegExp(`^(${SLOTTED})`);
+// NOTE: this supports 1 nested () pair for things like
+// :host(:not([selected]), more general support requires
+// parsing which seems like overkill
+let HOST_PAREN = /(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/;
+// similar to HOST_PAREN
+let SLOTTED_PAREN = /(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/;
+let DIR_PAREN = /(.*):dir\((?:(ltr|rtl))\)/;
+let CSS_CLASS_PREFIX = '.';
+let PSEUDO_PREFIX = ':';
+let CLASS = 'class';
+let SELECTOR_NO_MATCH = 'should_not_match';
+
+export default new StyleTransformer()
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-util.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-util.js
new file mode 100644
index 00000000000..a1f7c24b8ad
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/style-util.js
@@ -0,0 +1,294 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+'use strict';
+
+import {nativeShadow, nativeCssVariables} from './style-settings.js';
+import {parse, stringify, types, StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars
+import {MEDIA_MATCH} from './common-regex.js';
+import {processUnscopedStyle, isUnscopedStyle} from './unscoped-style-handler.js';
+
+/**
+ * @param {string|StyleNode} rules
+ * @param {function(StyleNode)=} callback
+ * @return {string}
+ */
+export function toCssText (rules, callback) {
+ if (!rules) {
+ return '';
+ }
+ if (typeof rules === 'string') {
+ rules = parse(rules);
+ }
+ if (callback) {
+ forEachRule(rules, callback);
+ }
+ return stringify(rules, nativeCssVariables);
+}
+
+/**
+ * @param {HTMLStyleElement} style
+ * @return {StyleNode}
+ */
+export function rulesForStyle(style) {
+ if (!style['__cssRules'] && style.textContent) {
+ style['__cssRules'] = parse(style.textContent);
+ }
+ return style['__cssRules'] || null;
+}
+
+// Tests if a rule is a keyframes selector, which looks almost exactly
+// like a normal selector but is not (it has nothing to do with scoping
+// for example).
+/**
+ * @param {StyleNode} rule
+ * @return {boolean}
+ */
+export function isKeyframesSelector(rule) {
+ return Boolean(rule['parent']) &&
+ rule['parent']['type'] === types.KEYFRAMES_RULE;
+}
+
+/**
+ * @param {StyleNode} node
+ * @param {Function=} styleRuleCallback
+ * @param {Function=} keyframesRuleCallback
+ * @param {boolean=} onlyActiveRules
+ */
+export function forEachRule(node, styleRuleCallback, keyframesRuleCallback, onlyActiveRules) {
+ if (!node) {
+ return;
+ }
+ let skipRules = false;
+ let type = node['type'];
+ if (onlyActiveRules) {
+ if (type === types.MEDIA_RULE) {
+ let matchMedia = node['selector'].match(MEDIA_MATCH);
+ if (matchMedia) {
+ // if rule is a non matching @media rule, skip subrules
+ if (!window.matchMedia(matchMedia[1]).matches) {
+ skipRules = true;
+ }
+ }
+ }
+ }
+ if (type === types.STYLE_RULE) {
+ styleRuleCallback(node);
+ } else if (keyframesRuleCallback &&
+ type === types.KEYFRAMES_RULE) {
+ keyframesRuleCallback(node);
+ } else if (type === types.MIXIN_RULE) {
+ skipRules = true;
+ }
+ let r$ = node['rules'];
+ if (r$ && !skipRules) {
+ for (let i=0, l=r$.length, r; (i<l) && (r=r$[i]); i++) {
+ forEachRule(r, styleRuleCallback, keyframesRuleCallback, onlyActiveRules);
+ }
+ }
+}
+
+// add a string of cssText to the document.
+/**
+ * @param {string} cssText
+ * @param {string} moniker
+ * @param {Node} target
+ * @param {Node} contextNode
+ * @return {HTMLStyleElement}
+ */
+export function applyCss(cssText, moniker, target, contextNode) {
+ let style = createScopeStyle(cssText, moniker);
+ applyStyle(style, target, contextNode);
+ return style;
+}
+
+/**
+ * @param {string} cssText
+ * @param {string} moniker
+ * @return {HTMLStyleElement}
+ */
+export function createScopeStyle(cssText, moniker) {
+ let style = /** @type {HTMLStyleElement} */(document.createElement('style'));
+ if (moniker) {
+ style.setAttribute('scope', moniker);
+ }
+ style.textContent = cssText;
+ return style;
+}
+
+/**
+ * Track the position of the last added style for placing placeholders
+ * @type {Node}
+ */
+let lastHeadApplyNode = null;
+
+// insert a comment node as a styling position placeholder.
+/**
+ * @param {string} moniker
+ * @return {!Comment}
+ */
+export function applyStylePlaceHolder(moniker) {
+ let placeHolder = document.createComment(' Shady DOM styles for ' +
+ moniker + ' ');
+ let after = lastHeadApplyNode ?
+ lastHeadApplyNode['nextSibling'] : null;
+ let scope = document.head;
+ scope.insertBefore(placeHolder, after || scope.firstChild);
+ lastHeadApplyNode = placeHolder;
+ return placeHolder;
+}
+
+/**
+ * @param {HTMLStyleElement} style
+ * @param {?Node} target
+ * @param {?Node} contextNode
+ */
+export function applyStyle(style, target, contextNode) {
+ target = target || document.head;
+ let after = (contextNode && contextNode.nextSibling) ||
+ target.firstChild;
+ target.insertBefore(style, after);
+ if (!lastHeadApplyNode) {
+ lastHeadApplyNode = style;
+ } else {
+ // only update lastHeadApplyNode if the new style is inserted after the old lastHeadApplyNode
+ let position = style.compareDocumentPosition(lastHeadApplyNode);
+ if (position === Node.DOCUMENT_POSITION_PRECEDING) {
+ lastHeadApplyNode = style;
+ }
+ }
+}
+
+/**
+ * @param {string} buildType
+ * @return {boolean}
+ */
+export function isTargetedBuild(buildType) {
+ return nativeShadow ? buildType === 'shadow' : buildType === 'shady';
+}
+
+/**
+ * @param {Element} element
+ * @return {?string}
+ */
+export function getCssBuildType(element) {
+ return element.getAttribute('css-build');
+}
+
+/**
+ * Walk from text[start] matching parens and
+ * returns position of the outer end paren
+ * @param {string} text
+ * @param {number} start
+ * @return {number}
+ */
+function findMatchingParen(text, start) {
+ let level = 0;
+ for (let i=start, l=text.length; i < l; i++) {
+ if (text[i] === '(') {
+ level++;
+ } else if (text[i] === ')') {
+ if (--level === 0) {
+ return i;
+ }
+ }
+ }
+ return -1;
+}
+
+/**
+ * @param {string} str
+ * @param {function(string, string, string, string)} callback
+ */
+export function processVariableAndFallback(str, callback) {
+ // find 'var('
+ let start = str.indexOf('var(');
+ if (start === -1) {
+ // no var?, everything is prefix
+ return callback(str, '', '', '');
+ }
+ //${prefix}var(${inner})${suffix}
+ let end = findMatchingParen(str, start + 3);
+ let inner = str.substring(start + 4, end);
+ let prefix = str.substring(0, start);
+ // suffix may have other variables
+ let suffix = processVariableAndFallback(str.substring(end + 1), callback);
+ let comma = inner.indexOf(',');
+ // value and fallback args should be trimmed to match in property lookup
+ if (comma === -1) {
+ // variable, no fallback
+ return callback(prefix, inner.trim(), '', suffix);
+ }
+ // var(${value},${fallback})
+ let value = inner.substring(0, comma).trim();
+ let fallback = inner.substring(comma + 1).trim();
+ return callback(prefix, value, fallback, suffix);
+}
+
+/**
+ * @param {Element} element
+ * @param {string} value
+ */
+export function setElementClassRaw(element, value) {
+ // use native setAttribute provided by ShadyDOM when setAttribute is patched
+ if (nativeShadow) {
+ element.setAttribute('class', value);
+ } else {
+ window['ShadyDOM']['nativeMethods']['setAttribute'].call(element, 'class', value);
+ }
+}
+
+/**
+ * @param {Element | {is: string, extends: string}} element
+ * @return {{is: string, typeExtension: string}}
+ */
+export function getIsExtends(element) {
+ let localName = element['localName'];
+ let is = '', typeExtension = '';
+ /*
+ NOTE: technically, this can be wrong for certain svg elements
+ with `-` in the name like `<font-face>`
+ */
+ if (localName) {
+ if (localName.indexOf('-') > -1) {
+ is = localName;
+ } else {
+ typeExtension = localName;
+ is = (element.getAttribute && element.getAttribute('is')) || '';
+ }
+ } else {
+ is = /** @type {?} */(element).is;
+ typeExtension = /** @type {?} */(element).extends;
+ }
+ return {is, typeExtension};
+}
+
+/**
+ * @param {Element|DocumentFragment} element
+ * @return {string}
+ */
+export function gatherStyleText(element) {
+ /** @type {!Array<string>} */
+ const styleTextParts = [];
+ const styles = /** @type {!NodeList<!HTMLStyleElement>} */(element.querySelectorAll('style'));
+ for (let i = 0; i < styles.length; i++) {
+ const style = styles[i];
+ if (isUnscopedStyle(style)) {
+ if (!nativeShadow) {
+ processUnscopedStyle(style);
+ style.parentNode.removeChild(style);
+ }
+ } else {
+ styleTextParts.push(style.textContent);
+ style.parentNode.removeChild(style);
+ }
+ }
+ return styleTextParts.join('').trim();
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/template-map.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/template-map.js
new file mode 100644
index 00000000000..d3eb8409a13
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/template-map.js
@@ -0,0 +1,17 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+'use strict';
+
+/**
+ * @const {!Object<string, !HTMLTemplateElement>}
+ */
+const templateMap = {};
+export default templateMap;
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/unscoped-style-handler.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/unscoped-style-handler.js
new file mode 100644
index 00000000000..95e994fae95
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/src/unscoped-style-handler.js
@@ -0,0 +1,40 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+'use strict';
+
+/** @type {!Set<string>} */
+const styleTextSet = new Set();
+
+export const scopingAttribute = 'shady-unscoped';
+
+/**
+ * Add a specifically-marked style to the document directly, and only one copy of that style.
+ *
+ * @param {!HTMLStyleElement} style
+ * @return {undefined}
+ */
+export function processUnscopedStyle(style) {
+ const text = style.textContent;
+ if (!styleTextSet.has(text)) {
+ styleTextSet.add(text);
+ const newStyle = style.cloneNode(true);
+ document.head.appendChild(newStyle);
+ }
+}
+
+/**
+ * Check if a style is supposed to be unscoped
+ * @param {!HTMLStyleElement} style
+ * @return {boolean} true if the style has the unscoping attribute
+ */
+export function isUnscopedStyle(style) {
+ return style.hasAttribute(scopingAttribute);
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/wct.conf.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/wct.conf.json
new file mode 100644
index 00000000000..7c08b8df08e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/shadycss/wct.conf.json
@@ -0,0 +1,17 @@
+{
+ "suites": ["tests/runner.html"],
+ "plugins": {
+ "local": {
+ "browserOptions": {
+ "chrome": [
+ "no-sandbox",
+ "disable-gpu",
+ "headless"
+ ],
+ "firefox": [
+ "-headless"
+ ]
+ }
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/.bower.json
new file mode 100644
index 00000000000..11a0201f416
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/.bower.json
@@ -0,0 +1,14 @@
+{
+ "name": "sinon-chai",
+ "homepage": "https://github.com/domenic/sinon-chai",
+ "version": "2.14.0",
+ "_release": "2.14.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v2.14.0",
+ "commit": "3ddf66c1d706aa14178753587d038a104153fb60"
+ },
+ "_source": "https://github.com/domenic/sinon-chai.git",
+ "_target": "^2.7.0",
+ "_originalSource": "sinon-chai"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/.editorconfig b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/.editorconfig
new file mode 100644
index 00000000000..911234fa4a2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/.editorconfig
@@ -0,0 +1,9 @@
+root = true
+
+[*]
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+charset = utf-8
+indent_style = space
+indent_size = 4
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/.eslintignore b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/.eslintignore
new file mode 100644
index 00000000000..404abb22121
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/.eslintignore
@@ -0,0 +1 @@
+coverage/
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/.eslintrc.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/.eslintrc.json
new file mode 100644
index 00000000000..f34ba89f582
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/.eslintrc.json
@@ -0,0 +1,229 @@
+{
+ "root": true,
+ "env": {
+ "node": true,
+ "amd": true,
+ "es6": false
+ },
+ "parserOptions": {
+ "ecmaVersion": 5
+ },
+ "rules": {
+ // Possible errors
+ "no-await-in-loop": "off",
+ "comma-dangle": ["error", "never"],
+ "no-cond-assign": ["error", "except-parens"],
+ "no-console": "off",
+ "no-constant-condition": "error",
+ "no-control-regex": "error",
+ "no-debugger": "error",
+ "no-dupe-args": "error",
+ "no-dupe-keys": "error",
+ "no-duplicate-case": "error",
+ "no-empty": "error",
+ "no-empty-character-class": "error",
+ "no-ex-assign": "error",
+ "no-extra-boolean-cast": "error",
+ "no-extra-parens": ["error", "all", { "conditionalAssign": false, "nestedBinaryExpressions": false }],
+ "no-extra-semi": "error",
+ "no-func-assign": "error",
+ "no-inner-declarations": "off",
+ "no-invalid-regexp": "error",
+ "no-irregular-whitespace": "error",
+ "no-obj-calls": "error",
+ "no-prototype-builtins": "error",
+ "no-regex-spaces": "error",
+ "no-sparse-arrays": "error",
+ "no-template-curly-in-string": "error",
+ "no-unexpected-multiline": "error",
+ "no-unreachable": "error",
+ "no-unsafe-finally": "off",
+ "no-unsafe-negation": "error",
+ "use-isnan": "error",
+ "valid-jsdoc": "off",
+ "valid-typeof": "error",
+
+ // Best practices
+ "accessor-pairs": "error",
+ "array-callback-return": "error",
+ "block-scoped-var": "off",
+ "class-methods-use-this": "error",
+ "complexity": "off",
+ "consistent-return": "error",
+ "curly": ["error", "all"],
+ "default-case": "off",
+ "dot-location": ["error", "property"],
+ "dot-notation": "error",
+ "eqeqeq": "error",
+ "guard-for-in": "off",
+ "no-alert": "error",
+ "no-caller": "error",
+ "no-case-declarations": "error",
+ "no-div-regex": "off",
+ "no-else-return": "error",
+ "no-empty-function": "error",
+ "no-empty-pattern": "error",
+ "no-eq-null": "error",
+ "no-eval": "error",
+ "no-extend-native": "error",
+ "no-extra-bind": "error",
+ "no-extra-label": "error",
+ "no-fallthrough": "error",
+ "no-floating-decimal": "error",
+ "no-global-assign": "error",
+ "no-implicit-coercion": "error",
+ "no-implicit-globals": "error",
+ "no-implied-eval": "off",
+ "no-invalid-this": "error",
+ "no-iterator": "error",
+ "no-labels": ["error", { "allowLoop": true }],
+ "no-lone-blocks": "error",
+ "no-loop-func": "off",
+ "no-magic-numbers": "off",
+ "no-multi-spaces": "error",
+ "no-multi-str": "error",
+ "no-new": "error",
+ "no-new-func": "error",
+ "no-new-wrappers": "error",
+ "no-octal": "error",
+ "no-octal-escape": "error",
+ "no-param-reassign": "off",
+ "no-process-env": "error",
+ "no-proto": "error",
+ "no-redeclare": "error",
+ "no-restricted-properties": "off",
+ "no-return-assign": ["error", "except-parens"],
+ "no-return-await": "error",
+ "no-script-url": "off",
+ "no-self-assign": "error",
+ "no-self-compare": "error",
+ "no-sequences": "error",
+ "no-throw-literal": "error",
+ "no-unmodified-loop-condition": "error",
+ "no-unused-expressions": "error",
+ "no-unused-labels": "error",
+ "no-useless-call": "error",
+ "no-useless-concat": "error",
+ "no-useless-escape": "error",
+ "no-useless-return": "error",
+ "no-void": "error",
+ "no-warning-comments": "off",
+ "no-with": "error",
+ "radix": ["error", "as-needed"],
+ "require-await": "error",
+ "vars-on-top": "off",
+ "wrap-iife": ["error", "outside"],
+ "yoda": ["error", "never"],
+
+ // Strict Mode
+ "strict": ["error", "global"],
+
+ // Variables
+ "init-declarations": "off",
+ "no-catch-shadow": "error",
+ "no-delete-var": "error",
+ "no-label-var": "error",
+ "no-restricted-globals": "off",
+ "no-shadow": "error",
+ "no-shadow-restricted-names": "error",
+ "no-undef": "error",
+ "no-undef-init": "error",
+ "no-undefined": "off",
+ "no-unused-vars": "error",
+ "no-use-before-define": ["error", "nofunc"],
+
+ // Node.js and CommonJS
+ "callback-return": "off",
+ "global-require": "error",
+ "handle-callback-err": "error",
+ "no-mixed-requires": ["error", true],
+ "no-new-require": "error",
+ "no-path-concat": "error",
+ "no-process-exit": "error",
+ "no-restricted-imports": "off",
+ "no-restricted-modules": "off",
+ "no-sync": "off",
+
+ // Stylistic Issues
+ "array-bracket-spacing": ["error", "never"],
+ "block-spacing": ["error", "always"],
+ "brace-style": ["error", "1tbs", { "allowSingleLine": false }],
+ "camelcase": ["error", { "properties": "always" }],
+ "capitalized-comments": ["error", "always", { "ignoreConsecutiveComments": true }],
+ "comma-spacing": ["error", { "before": false, "after": true }],
+ "comma-style": ["error", "last"],
+ "computed-property-spacing": ["error", "never"],
+ "consistent-this": "off",
+ "eol-last": "error",
+ "func-call-spacing": ["error", "never"],
+ "func-name-matching": ["error", "always"],
+ "func-names": ["error", "never"],
+ "func-style": ["error", "declaration"],
+ "id-blacklist": "off",
+ "id-length": "off",
+ "id-match": "off",
+ "indent": ["error", 4, { "SwitchCase": 1 }],
+ "jsx-quotes": "off",
+ "key-spacing": ["error", { "beforeColon": false, "afterColon": true, "mode": "strict" }],
+ "keyword-spacing": ["error", { "before": true, "after": true }],
+ "line-comment-position": "off",
+ "linebreak-style": ["error", "unix"],
+ "lines-around-comment": "off",
+ "lines-around-directive": "off",
+ "max-depth": "off",
+ "max-len": ["error", 120, { "ignoreUrls": true }],
+ "max-lines": "off",
+ "max-nested-callbacks": "off",
+ "max-params": "off",
+ "max-statements": "off",
+ "max-statements-per-line": ["error", { "max": 1 }],
+ "multiline-ternary": "off",
+ "new-cap": "error",
+ "new-parens": "error",
+ "newline-after-var": "off",
+ "newline-before-return": "off",
+ "newline-per-chained-call": "off",
+ "no-array-constructor": "error",
+ "no-bitwise": "off",
+ "no-continue": "off",
+ "no-inline-comments": "off",
+ "no-lonely-if": "error",
+ "no-mixed-operators": "error",
+ "no-mixed-spaces-and-tabs": "error",
+ "no-multiple-empty-lines": "error",
+ "no-negated-condition": "off",
+ "no-nested-ternary": "error",
+ "no-new-object": "error",
+ "no-plusplus": "off",
+ "no-restricted-syntax": "off",
+ "no-tabs": "error",
+ "no-ternary": "off",
+ "no-trailing-spaces": "error",
+ "no-underscore-dangle": "off",
+ "no-unneeded-ternary": "error",
+ "no-whitespace-before-property": "error",
+ "object-curly-newline": ["error", { "multiline": true }],
+ "object-curly-spacing": ["error", "always"],
+ "object-property-newline": "off",
+ "one-var": ["error", "never"],
+ "one-var-declaration-per-line": ["error", "initializations"],
+ "operator-assignment": ["error", "always"],
+ "operator-linebreak": ["error", "after"],
+ "padded-blocks": ["error", "never"],
+ "quote-props": ["error", "as-needed"],
+ "quotes": ["error", "double", { "avoidEscape": true, "allowTemplateLiterals": true }],
+ "require-jsdoc": "off",
+ "semi": ["error", "always"],
+ "semi-spacing": "error",
+ "sort-keys": "off",
+ "sort-vars": "off",
+ "space-before-blocks": ["error", "always"],
+ "space-before-function-paren": ["error", { "anonymous": "always", "named": "never" }],
+ "space-in-parens": ["error", "never"],
+ "space-infix-ops": "error",
+ "space-unary-ops": ["error", { "words": true, "nonwords": false }],
+ "spaced-comment": ["error", "always", { "markers": ["///"] }],
+ "unicode-bom": ["error", "never"],
+ "wrap-regex": "off"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/.travis.yml
new file mode 100644
index 00000000000..0f161f78e75
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/.travis.yml
@@ -0,0 +1,30 @@
+language: node_js
+node_js:
+ - "0.10"
+ - stable
+env:
+ # Can't figure out how to DRY this up: http://stackoverflow.com/q/22397300/3191
+ - CHAI_VERSION=^1.9.2 SINON_VERSION=^1.4.0
+ - CHAI_VERSION=^2.0.0 SINON_VERSION=^1.4.0
+ - CHAI_VERSION=^3.0.0 SINON_VERSION=^1.4.0
+ - CHAI_VERSION=^4.0.0 SINON_VERSION=^1.4.0
+ - CHAI_VERSION=^1.9.2 SINON_VERSION=^2.1.0
+ - CHAI_VERSION=^2.0.0 SINON_VERSION=^2.1.0
+ - CHAI_VERSION=^3.0.0 SINON_VERSION=^2.1.0
+ - CHAI_VERSION=^4.0.0 SINON_VERSION=^2.1.0
+ - CHAI_VERSION=^1.9.2 SINON_VERSION=^3.0.0
+ - CHAI_VERSION=^2.0.0 SINON_VERSION=^3.0.0
+ - CHAI_VERSION=^3.0.0 SINON_VERSION=^3.0.0
+ - CHAI_VERSION=^4.0.0 SINON_VERSION=^3.0.0
+ - CHAI_VERSION=^1.9.2 SINON_VERSION=^4.0.0
+ - CHAI_VERSION=^2.0.0 SINON_VERSION=^4.0.0
+ - CHAI_VERSION=^3.0.0 SINON_VERSION=^4.0.0
+ - CHAI_VERSION=^4.0.0 SINON_VERSION=^4.0.0
+script:
+ - test $TRAVIS_NODE_VERSION == "0.10" || npm run lint
+ - npm run test-travis
+before_install:
+ - if [ `npm -v` = "5.3.0" ]; then
+ npm install -g npm@^5.4.2;
+ npm -v;
+ fi
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/LICENSE.txt b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/LICENSE.txt
new file mode 100644
index 00000000000..1e11f2e7d23
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/LICENSE.txt
@@ -0,0 +1,49 @@
+Dual licensed under WTFPL and BSD:
+
+---
+
+Copyright © 2012–2017 Domenic Denicola <d@domenic.me>
+
+This work is free. You can redistribute it and/or modify it under the
+terms of the Do What The Fuck You Want To Public License, Version 2,
+as published by Sam Hocevar. See below for more details.
+
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ Version 2, December 2004
+
+ Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
+
+ Everyone is permitted to copy and distribute verbatim or modified
+ copies of this license document, and changing it is allowed as long
+ as the name is changed.
+
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. You just DO WHAT THE FUCK YOU WANT TO.
+
+---
+
+Copyright © 2012–2017, Domenic Denicola <d@domenic.me>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/README.md
new file mode 100644
index 00000000000..b9112b75508
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/README.md
@@ -0,0 +1,256 @@
+# Sinon.JS Assertions for Chai
+
+**Sinon–Chai** provides a set of custom assertions for using the [Sinon.JS][] spy, stub, and mocking framework with the
+[Chai][] assertion library. You get all the benefits of Chai with all the powerful tools of Sinon.JS.
+
+Instead of using Sinon.JS's assertions:
+
+```javascript
+sinon.assertCalledWith(mySpy, "foo");
+```
+
+or awkwardly trying to use Chai's `should` or `expect` interfaces on spy properties:
+
+```javascript
+mySpy.calledWith("foo").should.be.ok;
+expect(mySpy.calledWith("foo")).to.be.ok;
+```
+
+you can say
+
+```javascript
+mySpy.should.have.been.calledWith("foo");
+expect(mySpy).to.have.been.calledWith("foo");
+```
+
+## Assertions
+
+All of your favorite Sinon.JS assertions made their way into Sinon–Chai. We show the `should` syntax here; the `expect`
+equivalent is also available.
+
+<table>
+ <thead>
+ <tr>
+ <th>Sinon.JS property/method</th>
+ <th>Sinon–Chai assertion</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>called</td>
+ <td>spy.should.have.been.called</td>
+ </tr>
+ <tr>
+ <td>callCount</td>
+ <td>spy.should.have.callCount(n)</td>
+ </tr>
+ <tr>
+ <td>calledOnce</td>
+ <td>spy.should.have.been.calledOnce</td>
+ </tr>
+ <tr>
+ <td>calledTwice</td>
+ <td>spy.should.have.been.calledTwice</td>
+ </tr>
+ <tr>
+ <td>calledThrice</td>
+ <td>spy.should.have.been.calledThrice</td>
+ </tr>
+ <tr>
+ <td>calledBefore</td>
+ <td>spy1.should.have.been.calledBefore(spy2)</td>
+ </tr>
+ <tr>
+ <td>calledAfter</td>
+ <td>spy1.should.have.been.calledAfter(spy2)</td>
+ </tr>
+ <tr>
+ <td>calledImmediatelyBefore</td>
+ <td>spy.should.have.been.calledImmediatelyBefore(spy2)</td>
+ </tr>
+ <tr>
+ <td>calledImmediatelyAfter</td>
+ <td>spy.should.have.been.calledImmediatelyAfter(spy2)</td>
+ </tr>
+ <tr>
+ <td>calledWithNew</td>
+ <td>spy.should.have.been.calledWithNew</td>
+ </tr>
+ <tr>
+ <td>alwaysCalledWithNew</td>
+ <td>spy.should.always.have.been.calledWithNew</td>
+ </tr>
+ <tr>
+ <td>calledOn</td>
+ <td>spy.should.have.been.calledOn(context)</td>
+ </tr>
+ <tr>
+ <td>alwaysCalledOn</td>
+ <td>spy.should.always.have.been.calledOn(context)</td>
+ </tr>
+ <tr>
+ <td>calledWith</td>
+ <td>spy.should.have.been.calledWith(...args)</td>
+ </tr>
+ <tr>
+ <td>alwaysCalledWith</td>
+ <td>spy.should.always.have.been.calledWith(...args)</td>
+ </tr>
+ <tr>
+ <td>calledWithExactly</td>
+ <td>spy.should.have.been.calledWithExactly(...args)</td>
+ </tr>
+ <tr>
+ <td>alwaysCalledWithExactly</td>
+ <td>spy.should.always.have.been.calledWithExactly(...args)</td>
+ </tr>
+ <tr>
+ <td>calledWithMatch</td>
+ <td>spy.should.have.been.calledWithMatch(...args)</td>
+ </tr>
+ <tr>
+ <td>alwaysCalledWithMatch</td>
+ <td>spy.should.always.have.been.calledWithMatch(...args)</td>
+ </tr>
+ <tr>
+ <td>returned</td>
+ <td>spy.should.have.returned(returnVal)</td>
+ </tr>
+ <tr>
+ <td>alwaysReturned</td>
+ <td>spy.should.have.always.returned(returnVal)</td>
+ </tr>
+ <tr>
+ <td>threw</td>
+ <td>spy.should.have.thrown(errorObjOrErrorTypeStringOrNothing)</td>
+ </tr>
+ <tr>
+ <td>alwaysThrew</td>
+ <td>spy.should.have.always.thrown(errorObjOrErrorTypeStringOrNothing)</td>
+ </tr>
+ </tbody>
+</table>
+
+For more information on the behavior of each assertion, see
+[the documentation for the corresponding spy methods][spymethods]. These of course work on not only spies, but
+individual spy calls, stubs, and mocks as well.
+
+Note that you can negate any assertion with Chai's `.not`. E. g. for `notCalled` use `spy.should.have.not.been.called`.
+
+For `assert` interface there is no need for this library. You can install [Sinon.JS assertions][sinonassertions] right into Chai's `assert` object with `expose`:
+
+```javascript
+var chai = require("chai");
+var sinon = require("sinon");
+
+sinon.assert.expose(chai.assert, { prefix: "" });
+```
+
+## Examples
+
+Using Chai's `should`:
+
+```javascript
+"use strict";
+var chai = require("chai");
+var sinon = require("sinon");
+var sinonChai = require("sinon-chai");
+chai.should();
+chai.use(sinonChai);
+
+function hello(name, cb) {
+ cb("hello " + name);
+}
+
+describe("hello", function () {
+ it("should call callback with correct greeting", function () {
+ var cb = sinon.spy();
+
+ hello("foo", cb);
+
+ cb.should.have.been.calledWith("hello foo");
+ });
+});
+```
+
+Using Chai's `expect`:
+
+```javascript
+"use strict";
+var chai = require("chai");
+var sinon = require("sinon");
+var sinonChai = require("sinon-chai");
+var expect = chai.expect;
+chai.use(sinonChai);
+
+function hello(name, cb) {
+ cb("hello " + name);
+}
+
+describe("hello", function () {
+ it("should call callback with correct greeting", function () {
+ var cb = sinon.spy();
+
+ hello("foo", cb);
+
+ expect(cb).to.have.been.calledWith("hello foo");
+ });
+});
+```
+
+## Installation and Usage
+
+### Node
+
+Do an `npm install sinon-chai` to get up and running. Then:
+
+```javascript
+var chai = require("chai");
+var sinonChai = require("sinon-chai");
+
+chai.use(sinonChai);
+```
+
+You can of course put this code in a common test fixture file; for an example using [Mocha][], see
+[the Sinon–Chai tests themselves][fixturedemo].
+
+### AMD
+
+Sinon–Chai supports being used as an [AMD][] module, registering itself anonymously (just like Chai). So, assuming you
+have configured your loader to map the Chai and Sinon–Chai files to the respective module IDs `"chai"` and
+`"sinon-chai"`, you can use them as follows:
+
+```javascript
+define(function (require, exports, module) {
+ var chai = require("chai");
+ var sinonChai = require("sinon-chai");
+
+ chai.use(sinonChai);
+});
+```
+
+### `<script>` tag
+
+If you include Sinon–Chai directly with a `<script>` tag, after the one for Chai itself, then it will automatically plug
+in to Chai and be ready for use. Note that you'll want to get the latest browser build of Sinon.JS as well:
+
+```html
+<script src="chai.js"></script>
+<script src="sinon-chai.js"></script>
+<script src="sinon.js"></script>
+```
+
+### Ruby on Rails
+
+Thanks to [Cymen Vig][], there's now [a Ruby gem][] of Sinon–Chai that integrates it with the Rails asset pipeline!
+
+
+[Sinon.JS]: http://sinonjs.org/
+[Chai]: http://chaijs.com/
+[spymethods]: http://sinonjs.org/docs/#spies-api
+[sinonassertions]: http://sinonjs.org/docs/#assertions
+[Mocha]: https://mochajs.org/
+[fixturedemo]: https://github.com/domenic/sinon-chai/tree/master/test/
+[AMD]: https://github.com/amdjs/amdjs-api/wiki/AMD
+[Cymen Vig]: https://github.com/cymen
+[a Ruby gem]: https://github.com/cymen/sinon-chai-rails
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/lib/sinon-chai.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/lib/sinon-chai.js
new file mode 100644
index 00000000000..32d4e4ec52d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/lib/sinon-chai.js
@@ -0,0 +1,147 @@
+"use strict";
+/* eslint-disable no-invalid-this */
+
+(function (sinonChai) {
+ // Module systems magic dance.
+
+ /* istanbul ignore else */
+ if (typeof require === "function" && typeof exports === "object" && typeof module === "object") {
+ // NodeJS
+ module.exports = sinonChai;
+ } else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(function () {
+ return sinonChai;
+ });
+ } else {
+ // Other environment (usually <script> tag): plug in to global chai instance directly.
+ /* global chai: false */
+ chai.use(sinonChai);
+ }
+}(function (chai, utils) {
+ var slice = Array.prototype.slice;
+
+ function isSpy(putativeSpy) {
+ return typeof putativeSpy === "function" &&
+ typeof putativeSpy.getCall === "function" &&
+ typeof putativeSpy.calledWithExactly === "function";
+ }
+
+ function timesInWords(count) {
+ switch (count) {
+ case 1: {
+ return "once";
+ }
+ case 2: {
+ return "twice";
+ }
+ case 3: {
+ return "thrice";
+ }
+ default: {
+ return (count || 0) + " times";
+ }
+ }
+ }
+
+ function isCall(putativeCall) {
+ return putativeCall && isSpy(putativeCall.proxy);
+ }
+
+ function assertCanWorkWith(assertion) {
+ if (!isSpy(assertion._obj) && !isCall(assertion._obj)) {
+ throw new TypeError(utils.inspect(assertion._obj) + " is not a spy or a call to a spy!");
+ }
+ }
+
+ function getMessages(spy, action, nonNegatedSuffix, always, args) {
+ var verbPhrase = always ? "always have " : "have ";
+ nonNegatedSuffix = nonNegatedSuffix || "";
+ if (isSpy(spy.proxy)) {
+ spy = spy.proxy;
+ }
+
+ function printfArray(array) {
+ return spy.printf.apply(spy, array);
+ }
+
+ return {
+ affirmative: function () {
+ return printfArray(["expected %n to " + verbPhrase + action + nonNegatedSuffix].concat(args));
+ },
+ negative: function () {
+ return printfArray(["expected %n to not " + verbPhrase + action].concat(args));
+ }
+ };
+ }
+
+ function sinonProperty(name, action, nonNegatedSuffix) {
+ utils.addProperty(chai.Assertion.prototype, name, function () {
+ assertCanWorkWith(this);
+
+ var messages = getMessages(this._obj, action, nonNegatedSuffix, false);
+ this.assert(this._obj[name], messages.affirmative, messages.negative);
+ });
+ }
+
+ function sinonPropertyAsBooleanMethod(name, action, nonNegatedSuffix) {
+ utils.addMethod(chai.Assertion.prototype, name, function (arg) {
+ assertCanWorkWith(this);
+
+ var messages = getMessages(this._obj, action, nonNegatedSuffix, false, [timesInWords(arg)]);
+ this.assert(this._obj[name] === arg, messages.affirmative, messages.negative);
+ });
+ }
+
+ function createSinonMethodHandler(sinonName, action, nonNegatedSuffix) {
+ return function () {
+ assertCanWorkWith(this);
+
+ var alwaysSinonMethod = "always" + sinonName[0].toUpperCase() + sinonName.substring(1);
+ var shouldBeAlways = utils.flag(this, "always") && typeof this._obj[alwaysSinonMethod] === "function";
+ var sinonMethodName = shouldBeAlways ? alwaysSinonMethod : sinonName;
+
+ var messages = getMessages(this._obj, action, nonNegatedSuffix, shouldBeAlways, slice.call(arguments));
+ this.assert(
+ this._obj[sinonMethodName].apply(this._obj, arguments),
+ messages.affirmative,
+ messages.negative
+ );
+ };
+ }
+
+ function sinonMethodAsProperty(name, action, nonNegatedSuffix) {
+ var handler = createSinonMethodHandler(name, action, nonNegatedSuffix);
+ utils.addProperty(chai.Assertion.prototype, name, handler);
+ }
+
+ function exceptionalSinonMethod(chaiName, sinonName, action, nonNegatedSuffix) {
+ var handler = createSinonMethodHandler(sinonName, action, nonNegatedSuffix);
+ utils.addMethod(chai.Assertion.prototype, chaiName, handler);
+ }
+
+ function sinonMethod(name, action, nonNegatedSuffix) {
+ exceptionalSinonMethod(name, name, action, nonNegatedSuffix);
+ }
+
+ utils.addProperty(chai.Assertion.prototype, "always", function () {
+ utils.flag(this, "always", true);
+ });
+
+ sinonProperty("called", "been called", " at least once, but it was never called");
+ sinonPropertyAsBooleanMethod("callCount", "been called exactly %1", ", but it was called %c%C");
+ sinonProperty("calledOnce", "been called exactly once", ", but it was called %c%C");
+ sinonProperty("calledTwice", "been called exactly twice", ", but it was called %c%C");
+ sinonProperty("calledThrice", "been called exactly thrice", ", but it was called %c%C");
+ sinonMethodAsProperty("calledWithNew", "been called with new");
+ sinonMethod("calledBefore", "been called before %1");
+ sinonMethod("calledAfter", "been called after %1");
+ sinonMethod("calledImmediatelyBefore", "been called immediately before %1");
+ sinonMethod("calledImmediatelyAfter", "been called immediately after %1");
+ sinonMethod("calledOn", "been called with %1 as this", ", but it was called with %t instead");
+ sinonMethod("calledWith", "been called with arguments %*", "%D");
+ sinonMethod("calledWithExactly", "been called with exact arguments %*", "%D");
+ sinonMethod("calledWithMatch", "been called with arguments matching %*", "%D");
+ sinonMethod("returned", "returned %1");
+ exceptionalSinonMethod("thrown", "threw", "thrown %1");
+}));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/package-lock.json
new file mode 100644
index 00000000000..1176e5c2fa2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/package-lock.json
@@ -0,0 +1,1830 @@
+{
+ "name": "sinon-chai",
+ "version": "2.14.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "abbrev": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
+ "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=",
+ "dev": true
+ },
+ "acorn": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.0.3.tgz",
+ "integrity": "sha1-xGDfCEkUY/AozLguqzcwvwEIez0=",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+ "dev": true,
+ "requires": {
+ "acorn": "3.3.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+ "dev": true
+ }
+ }
+ },
+ "ajv": {
+ "version": "4.11.8",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
+ "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
+ "dev": true,
+ "requires": {
+ "co": "4.6.0",
+ "json-stable-stringify": "1.0.1"
+ }
+ },
+ "ajv-keywords": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz",
+ "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=",
+ "dev": true
+ },
+ "align-text": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2",
+ "longest": "1.0.1",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+ "dev": true
+ },
+ "ansi-escapes": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
+ "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argparse": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
+ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "1.0.3"
+ }
+ },
+ "array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "dev": true,
+ "requires": {
+ "array-uniq": "1.0.3"
+ }
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+ "dev": true
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+ "dev": true
+ },
+ "assertion-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz",
+ "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz",
+ "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.1"
+ }
+ },
+ "balanced-match": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
+ "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz",
+ "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=",
+ "dev": true,
+ "requires": {
+ "balanced-match": "0.4.2",
+ "concat-map": "0.0.1"
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
+ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
+ "dev": true
+ },
+ "caller-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+ "dev": true,
+ "requires": {
+ "callsites": "0.2.0"
+ }
+ },
+ "callsites": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+ "dev": true,
+ "optional": true
+ },
+ "center-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "align-text": "0.1.4",
+ "lazy-cache": "1.0.4"
+ }
+ },
+ "chai": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.1.tgz",
+ "integrity": "sha1-ZuISeebzxkFf+CMYeCJ5AOIXGzk=",
+ "dev": true,
+ "requires": {
+ "assertion-error": "1.0.2",
+ "check-error": "1.0.2",
+ "deep-eql": "2.0.2",
+ "get-func-name": "2.0.0",
+ "pathval": "1.1.0",
+ "type-detect": "4.0.3"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+ "dev": true
+ },
+ "circular-json": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.1.tgz",
+ "integrity": "sha1-vos2rvzN6LPKeqLWr8B6NyQsDS0=",
+ "dev": true
+ },
+ "cli-cursor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
+ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "1.0.1"
+ }
+ },
+ "cli-width": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz",
+ "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=",
+ "dev": true
+ },
+ "cliui": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "center-align": "0.1.3",
+ "right-align": "0.1.3",
+ "wordwrap": "0.0.2"
+ },
+ "dependencies": {
+ "wordwrap": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+ "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
+ "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
+ "dev": true,
+ "requires": {
+ "graceful-readlink": "1.0.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "concat-stream": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
+ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.2.11",
+ "typedarray": "0.0.6"
+ }
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "d": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
+ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
+ "dev": true,
+ "requires": {
+ "es5-ext": "0.10.23"
+ }
+ },
+ "debug": {
+ "version": "2.6.8",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
+ "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true,
+ "optional": true
+ },
+ "deep-eql": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-2.0.2.tgz",
+ "integrity": "sha1-sbrAblbwp2d3aG1Qyf63XC7XZ5o=",
+ "dev": true,
+ "requires": {
+ "type-detect": "3.0.0"
+ },
+ "dependencies": {
+ "type-detect": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-3.0.0.tgz",
+ "integrity": "sha1-RtDMhVOrt7E6NSsNbeov1Y8tm1U=",
+ "dev": true
+ }
+ }
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "del": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "dev": true,
+ "requires": {
+ "globby": "5.0.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.0",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "rimraf": "2.6.1"
+ }
+ },
+ "diff": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz",
+ "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz",
+ "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "isarray": "1.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ }
+ }
+ },
+ "es5-ext": {
+ "version": "0.10.23",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.23.tgz",
+ "integrity": "sha1-dXi1G+l0IHpUh4IbVlOMIk5Oezg=",
+ "dev": true,
+ "requires": {
+ "es6-iterator": "2.0.1",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "es6-iterator": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz",
+ "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.23",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "es6-map": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
+ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.23",
+ "es6-iterator": "2.0.1",
+ "es6-set": "0.1.5",
+ "es6-symbol": "3.1.1",
+ "event-emitter": "0.3.5"
+ }
+ },
+ "es6-set": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
+ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.23",
+ "es6-iterator": "2.0.1",
+ "es6-symbol": "3.1.1",
+ "event-emitter": "0.3.5"
+ }
+ },
+ "es6-symbol": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.23"
+ }
+ },
+ "es6-weak-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
+ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.23",
+ "es6-iterator": "2.0.1",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
+ "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
+ "dev": true,
+ "requires": {
+ "esprima": "2.7.3",
+ "estraverse": "1.9.3",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.2.0"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
+ "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
+ "dev": true
+ }
+ }
+ },
+ "escope": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
+ "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
+ "dev": true,
+ "requires": {
+ "es6-map": "0.1.5",
+ "es6-weak-map": "2.0.2",
+ "esrecurse": "4.1.0",
+ "estraverse": "4.2.0"
+ }
+ },
+ "eslint": {
+ "version": "3.19.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz",
+ "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.22.0",
+ "chalk": "1.1.3",
+ "concat-stream": "1.6.0",
+ "debug": "2.6.8",
+ "doctrine": "2.0.0",
+ "escope": "3.6.0",
+ "espree": "3.4.3",
+ "esquery": "1.0.0",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "file-entry-cache": "2.0.0",
+ "glob": "7.1.2",
+ "globals": "9.18.0",
+ "ignore": "3.3.3",
+ "imurmurhash": "0.1.4",
+ "inquirer": "0.12.0",
+ "is-my-json-valid": "2.16.0",
+ "is-resolvable": "1.0.0",
+ "js-yaml": "3.8.4",
+ "json-stable-stringify": "1.0.1",
+ "levn": "0.3.0",
+ "lodash": "4.17.4",
+ "mkdirp": "0.5.1",
+ "natural-compare": "1.4.0",
+ "optionator": "0.8.2",
+ "path-is-inside": "1.0.2",
+ "pluralize": "1.2.1",
+ "progress": "1.1.8",
+ "require-uncached": "1.0.3",
+ "shelljs": "0.7.8",
+ "strip-bom": "3.0.0",
+ "strip-json-comments": "2.0.1",
+ "table": "3.8.3",
+ "text-table": "0.2.0",
+ "user-home": "2.0.0"
+ }
+ },
+ "espree": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-3.4.3.tgz",
+ "integrity": "sha1-KRC1zNSc6JPC//+qtP2LOjG4I3Q=",
+ "dev": true,
+ "requires": {
+ "acorn": "5.0.3",
+ "acorn-jsx": "3.0.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz",
+ "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=",
+ "dev": true,
+ "requires": {
+ "estraverse": "4.2.0"
+ }
+ },
+ "esrecurse": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.1.0.tgz",
+ "integrity": "sha1-RxO2U2rffyrE8yfVWed1a/9kgiA=",
+ "dev": true,
+ "requires": {
+ "estraverse": "4.1.1",
+ "object-assign": "4.1.1"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz",
+ "integrity": "sha1-9srKcokzqFDvkGYdDheYK6RxEaI=",
+ "dev": true
+ }
+ }
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.23"
+ }
+ },
+ "exit-hook": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
+ "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "figures": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
+ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "1.0.5",
+ "object-assign": "4.1.1"
+ }
+ },
+ "file-entry-cache": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
+ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+ "dev": true,
+ "requires": {
+ "flat-cache": "1.2.2",
+ "object-assign": "4.1.1"
+ }
+ },
+ "flat-cache": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz",
+ "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=",
+ "dev": true,
+ "requires": {
+ "circular-json": "0.3.1",
+ "del": "2.2.2",
+ "graceful-fs": "4.1.11",
+ "write": "0.2.1"
+ }
+ },
+ "formatio": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz",
+ "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=",
+ "dev": true,
+ "requires": {
+ "samsam": "1.2.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "generate-function": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
+ "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=",
+ "dev": true
+ },
+ "generate-object-property": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
+ "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
+ "dev": true,
+ "requires": {
+ "is-property": "1.0.2"
+ }
+ },
+ "get-func-name": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "globby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+ "dev": true,
+ "requires": {
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "graceful-readlink": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
+ "dev": true
+ },
+ "growl": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz",
+ "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=",
+ "dev": true
+ },
+ "handlebars": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz",
+ "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "optimist": "0.6.1",
+ "source-map": "0.4.4",
+ "uglify-js": "2.8.29"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+ "dev": true,
+ "requires": {
+ "amdefine": "1.0.1"
+ }
+ }
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "ignore": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz",
+ "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=",
+ "dev": true
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "inquirer": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz",
+ "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "1.4.0",
+ "ansi-regex": "2.1.1",
+ "chalk": "1.1.3",
+ "cli-cursor": "1.0.2",
+ "cli-width": "2.1.0",
+ "figures": "1.7.0",
+ "lodash": "4.17.4",
+ "readline2": "1.0.1",
+ "run-async": "0.1.0",
+ "rx-lite": "3.1.2",
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "through": "2.3.8"
+ }
+ },
+ "interpret": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz",
+ "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=",
+ "dev": true
+ },
+ "is-buffer": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
+ "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-my-json-valid": {
+ "version": "2.16.0",
+ "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz",
+ "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=",
+ "dev": true,
+ "requires": {
+ "generate-function": "2.0.0",
+ "generate-object-property": "1.2.0",
+ "jsonpointer": "4.0.1",
+ "xtend": "4.0.1"
+ }
+ },
+ "is-path-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+ "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+ "dev": true
+ },
+ "is-path-in-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
+ "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
+ "dev": true,
+ "requires": {
+ "is-path-inside": "1.0.0"
+ }
+ },
+ "is-path-inside": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz",
+ "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=",
+ "dev": true,
+ "requires": {
+ "path-is-inside": "1.0.2"
+ }
+ },
+ "is-property": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+ "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
+ "dev": true
+ },
+ "is-resolvable": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz",
+ "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=",
+ "dev": true,
+ "requires": {
+ "tryit": "1.0.3"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "istanbul": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz",
+ "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=",
+ "dev": true,
+ "requires": {
+ "abbrev": "1.0.9",
+ "async": "1.5.2",
+ "escodegen": "1.8.1",
+ "esprima": "2.7.3",
+ "glob": "5.0.15",
+ "handlebars": "4.0.10",
+ "js-yaml": "3.8.4",
+ "mkdirp": "0.5.1",
+ "nopt": "3.0.6",
+ "once": "1.4.0",
+ "resolve": "1.1.7",
+ "supports-color": "3.2.3",
+ "which": "1.3.0",
+ "wordwrap": "1.0.0"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
+ "dev": true
+ },
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "resolve": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "js-tokens": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz",
+ "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.8.4",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.4.tgz",
+ "integrity": "sha1-UgtFZPhlc7qWZir4Woyvp7S1pvY=",
+ "dev": true,
+ "requires": {
+ "argparse": "1.0.9",
+ "esprima": "3.1.3"
+ }
+ },
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+ "dev": true,
+ "requires": {
+ "jsonify": "0.0.0"
+ }
+ },
+ "json3": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
+ "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
+ "dev": true
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+ "dev": true
+ },
+ "jsonpointer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
+ "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
+ "dev": true
+ },
+ "just-extend": {
+ "version": "1.1.22",
+ "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.22.tgz",
+ "integrity": "sha1-MzCvdWyralQnAMZLLk5KoGLVL/8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.5"
+ }
+ },
+ "lazy-cache": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
+ "dev": true,
+ "optional": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.4",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
+ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
+ "dev": true
+ },
+ "lodash._baseassign": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
+ "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
+ "dev": true,
+ "requires": {
+ "lodash._basecopy": "3.0.1",
+ "lodash.keys": "3.1.2"
+ }
+ },
+ "lodash._basecopy": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
+ "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
+ "dev": true
+ },
+ "lodash._basecreate": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz",
+ "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=",
+ "dev": true
+ },
+ "lodash._getnative": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
+ "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
+ "dev": true
+ },
+ "lodash._isiterateecall": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
+ "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
+ "dev": true
+ },
+ "lodash.create": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz",
+ "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=",
+ "dev": true,
+ "requires": {
+ "lodash._baseassign": "3.2.0",
+ "lodash._basecreate": "3.0.3",
+ "lodash._isiterateecall": "3.0.9"
+ }
+ },
+ "lodash.get": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
+ "dev": true
+ },
+ "lodash.isarguments": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
+ "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
+ "dev": true
+ },
+ "lodash.isarray": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
+ "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
+ "dev": true
+ },
+ "lodash.keys": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
+ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
+ "dev": true,
+ "requires": {
+ "lodash._getnative": "3.9.1",
+ "lodash.isarguments": "3.1.0",
+ "lodash.isarray": "3.0.4"
+ }
+ },
+ "lolex": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.1.2.tgz",
+ "integrity": "sha1-JpS5U8nqTQE+W4v7qJHJkQJbJik=",
+ "dev": true
+ },
+ "longest": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+ "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "mocha": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.0.tgz",
+ "integrity": "sha512-pIU2PJjrPYvYRqVpjXzj76qltO9uBYI7woYAMoxbSefsa+vqAfptjoeevd6bUgwD0mPIO+hv9f7ltvsNreL2PA==",
+ "dev": true,
+ "requires": {
+ "browser-stdout": "1.3.0",
+ "commander": "2.9.0",
+ "debug": "2.6.8",
+ "diff": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "glob": "7.1.1",
+ "growl": "1.9.2",
+ "json3": "3.3.2",
+ "lodash.create": "3.1.1",
+ "mkdirp": "0.5.1",
+ "supports-color": "3.1.2"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
+ "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "supports-color": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz",
+ "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "mute-stream": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz",
+ "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=",
+ "dev": true
+ },
+ "native-promise-only": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz",
+ "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=",
+ "dev": true
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "dev": true,
+ "requires": {
+ "abbrev": "1.0.9"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "onetime": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+ "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
+ "dev": true
+ },
+ "opener": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz",
+ "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=",
+ "dev": true
+ },
+ "optimist": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8",
+ "wordwrap": "0.0.3"
+ },
+ "dependencies": {
+ "wordwrap": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
+ "dev": true
+ }
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
+ "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
+ "dev": true,
+ "requires": {
+ "isarray": "0.0.1"
+ }
+ },
+ "pathval": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
+ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
+ "dev": true
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
+ "requires": {
+ "pinkie": "2.0.4"
+ }
+ },
+ "pluralize": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz",
+ "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "dev": true
+ },
+ "progress": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
+ "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.2.11",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.11.tgz",
+ "integrity": "sha512-h+8+r3MKEhkiVrwdKL8aWs1oc1VvBu33ueshOvS26RsZQ3Amhx/oO3TKe4lApSV9ueY6as8EAh7mtuFjdlhg9Q==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "safe-buffer": "5.0.1",
+ "string_decoder": "1.0.2",
+ "util-deprecate": "1.0.2"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ }
+ }
+ },
+ "readline2": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz",
+ "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "mute-stream": "0.0.5"
+ }
+ },
+ "rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+ "dev": true,
+ "requires": {
+ "resolve": "1.3.3"
+ }
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "require-uncached": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+ "dev": true,
+ "requires": {
+ "caller-path": "0.1.0",
+ "resolve-from": "1.0.1"
+ }
+ },
+ "resolve": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz",
+ "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-from": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
+ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
+ "dev": true
+ },
+ "restore-cursor": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
+ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
+ "dev": true,
+ "requires": {
+ "exit-hook": "1.1.1",
+ "onetime": "1.1.0"
+ }
+ },
+ "right-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "align-text": "0.1.4"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz",
+ "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "run-async": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz",
+ "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0"
+ }
+ },
+ "rx-lite": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz",
+ "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=",
+ "dev": true
+ },
+ "safe-buffer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz",
+ "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=",
+ "dev": true
+ },
+ "samsam": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.2.1.tgz",
+ "integrity": "sha1-7dOQk6MYQ3DLhZJDsr3yVefY6mc=",
+ "dev": true
+ },
+ "shelljs": {
+ "version": "0.7.8",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz",
+ "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2",
+ "interpret": "1.0.3",
+ "rechoir": "0.6.2"
+ }
+ },
+ "sinon": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.0.0.tgz",
+ "integrity": "sha1-pUpfAjeqHdIhXl6ByJtCtQxP22s=",
+ "dev": true,
+ "requires": {
+ "diff": "3.2.0",
+ "formatio": "1.2.0",
+ "lodash.get": "4.4.2",
+ "lolex": "2.1.2",
+ "native-promise-only": "0.8.1",
+ "nise": "1.1.0",
+ "path-to-regexp": "1.7.0",
+ "samsam": "1.2.1",
+ "text-encoding": "0.6.4",
+ "type-detect": "4.0.3"
+ },
+ "dependencies": {
+ "nise": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/nise/-/nise-1.1.0.tgz",
+ "integrity": "sha512-lIFidCxB0mJGyq1i33tLRNojtMoYX95EAI7WQEU+/ees0w6hvXZQHZ7WD130Tjeh5+YJAUVLfQ3k/s9EA8jj+w==",
+ "dev": true,
+ "requires": {
+ "formatio": "1.2.0",
+ "just-extend": "1.1.22",
+ "lolex": "1.6.0",
+ "path-to-regexp": "1.7.0",
+ "text-encoding": "0.6.4"
+ },
+ "dependencies": {
+ "lolex": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz",
+ "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=",
+ "dev": true
+ }
+ }
+ }
+ }
+ },
+ "slice-ansi": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz",
+ "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
+ "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "amdefine": "1.0.1"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.2.tgz",
+ "integrity": "sha1-sp4fThEl+pehA4K4pTNze3SR4Xk=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "table": {
+ "version": "3.8.3",
+ "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz",
+ "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=",
+ "dev": true,
+ "requires": {
+ "ajv": "4.11.8",
+ "ajv-keywords": "1.5.1",
+ "chalk": "1.1.3",
+ "lodash": "4.17.4",
+ "slice-ansi": "0.0.4",
+ "string-width": "2.0.0"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz",
+ "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
+ }
+ },
+ "text-encoding": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz",
+ "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=",
+ "dev": true
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
+ "tryit": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz",
+ "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "type-detect": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz",
+ "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=",
+ "dev": true
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "uglify-js": {
+ "version": "2.8.29",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "source-map": "0.5.6",
+ "uglify-to-browserify": "1.0.2",
+ "yargs": "3.10.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
+ "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "uglify-to-browserify": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
+ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+ "dev": true,
+ "optional": true
+ },
+ "user-home": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz",
+ "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "which": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
+ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
+ "dev": true,
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ },
+ "window-size": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
+ "dev": true,
+ "optional": true
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "write": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+ "dev": true,
+ "requires": {
+ "mkdirp": "0.5.1"
+ }
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+ "dev": true
+ },
+ "yargs": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "camelcase": "1.2.1",
+ "cliui": "2.1.0",
+ "decamelize": "1.2.0",
+ "window-size": "0.1.0"
+ }
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/package.json
new file mode 100644
index 00000000000..e2c842e6ea8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinon-chai/package.json
@@ -0,0 +1,42 @@
+{
+ "name": "sinon-chai",
+ "description": "Extends Chai with assertions for the Sinon.JS mocking framework.",
+ "keywords": [
+ "chai",
+ "chai-plugin",
+ "browser",
+ "vendor",
+ "mocks-and-spies",
+ "sinon",
+ "testing",
+ "spies",
+ "stubs",
+ "mocks"
+ ],
+ "version": "2.14.0",
+ "author": "Domenic Denicola <d@domenic.me> (https://domenic.me/)",
+ "license": "(BSD-2-Clause OR WTFPL)",
+ "repository": "domenic/sinon-chai",
+ "main": "./lib/sinon-chai.js",
+ "files": [
+ "lib"
+ ],
+ "scripts": {
+ "test": "mocha",
+ "test-travis": "npm install chai@$CHAI_VERSION && npm install sinon@$SINON_VERSION && npm install && npm test",
+ "lint": "eslint .",
+ "cover": "istanbul cover node_modules/mocha/bin/_mocha && opener ./coverage/lcov-report/lib/sinon-chai.js.html"
+ },
+ "peerDependencies": {
+ "chai": ">=1.9.2 <5",
+ "sinon": "^1.4.0 || ^2.1.0 || ^3.0.0 || ^4.0.0"
+ },
+ "devDependencies": {
+ "chai": "^4.1.0",
+ "eslint": "^3.19.0",
+ "istanbul": "~0.4.5",
+ "mocha": "^3.4.2",
+ "opener": "^1.4.3",
+ "sinon": "^4.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/sinonjs/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinonjs/.bower.json
new file mode 100644
index 00000000000..27baea0f663
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinonjs/.bower.json
@@ -0,0 +1,20 @@
+{
+ "name": "sinonjs",
+ "version": "1.17.1",
+ "main": "sinon.js",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "components"
+ ],
+ "homepage": "https://github.com/blittle/sinon.js",
+ "_release": "1.17.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v1.17.1",
+ "commit": "9b970e7b8ff7fcb95d2c4d9a41b33370af764fc9"
+ },
+ "_source": "https://github.com/blittle/sinon.js.git",
+ "_target": "^1.14.1",
+ "_originalSource": "sinonjs"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/sinonjs/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinonjs/README.md
new file mode 100644
index 00000000000..5bfd79ba0df
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinonjs/README.md
@@ -0,0 +1,8 @@
+sinon.js
+========
+
+SinonJS proxy repository for the BowerJS package manager
+
+Install with: `bower install sinonjs`
+
+For more information on SinonJS: https://github.com/cjohansen/Sinon.JS
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/sinonjs/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinonjs/bower.json
new file mode 100644
index 00000000000..64f3d97ab1d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinonjs/bower.json
@@ -0,0 +1,10 @@
+{
+ "name": "sinonjs",
+ "version": "1.17.1",
+ "main": "sinon.js",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "components"
+ ]
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/sinonjs/sinon.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinonjs/sinon.js
new file mode 100644
index 00000000000..6080c45b1dd
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/sinonjs/sinon.js
@@ -0,0 +1,6383 @@
+/**
+ * Sinon.JS 1.17.1, 2015/09/26
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS
+ *
+ * (The BSD License)
+ *
+ * Copyright (c) 2010-2014, Christian Johansen, christian@cjohansen.no
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of Christian Johansen nor the names of his contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+(function (root, factory) {
+ 'use strict';
+ if (typeof define === 'function' && define.amd) {
+ define('sinon', [], function () {
+ return (root.sinon = factory());
+ });
+ } else if (typeof exports === 'object') {
+ module.exports = factory();
+ } else {
+ root.sinon = factory();
+ }
+}(this, function () {
+ 'use strict';
+ var samsam, formatio, lolex;
+ (function () {
+ function define(mod, deps, fn) {
+ if (mod == "samsam") {
+ samsam = deps();
+ } else if (typeof deps === "function" && mod.length === 0) {
+ lolex = deps();
+ } else if (typeof fn === "function") {
+ formatio = fn(samsam);
+ }
+ }
+ define.amd = {};
+((typeof define === "function" && define.amd && function (m) { define("samsam", m); }) ||
+ (typeof module === "object" &&
+ function (m) { module.exports = m(); }) || // Node
+ function (m) { this.samsam = m(); } // Browser globals
+)(function () {
+ var o = Object.prototype;
+ var div = typeof document !== "undefined" && document.createElement("div");
+
+ function isNaN(value) {
+ // Unlike global isNaN, this avoids type coercion
+ // typeof check avoids IE host object issues, hat tip to
+ // lodash
+ var val = value; // JsLint thinks value !== value is "weird"
+ return typeof value === "number" && value !== val;
+ }
+
+ function getClass(value) {
+ // Returns the internal [[Class]] by calling Object.prototype.toString
+ // with the provided value as this. Return value is a string, naming the
+ // internal class, e.g. "Array"
+ return o.toString.call(value).split(/[ \]]/)[1];
+ }
+
+ /**
+ * @name samsam.isArguments
+ * @param Object object
+ *
+ * Returns ``true`` if ``object`` is an ``arguments`` object,
+ * ``false`` otherwise.
+ */
+ function isArguments(object) {
+ if (getClass(object) === 'Arguments') { return true; }
+ if (typeof object !== "object" || typeof object.length !== "number" ||
+ getClass(object) === "Array") {
+ return false;
+ }
+ if (typeof object.callee == "function") { return true; }
+ try {
+ object[object.length] = 6;
+ delete object[object.length];
+ } catch (e) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * @name samsam.isElement
+ * @param Object object
+ *
+ * Returns ``true`` if ``object`` is a DOM element node. Unlike
+ * Underscore.js/lodash, this function will return ``false`` if ``object``
+ * is an *element-like* object, i.e. a regular object with a ``nodeType``
+ * property that holds the value ``1``.
+ */
+ function isElement(object) {
+ if (!object || object.nodeType !== 1 || !div) { return false; }
+ try {
+ object.appendChild(div);
+ object.removeChild(div);
+ } catch (e) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * @name samsam.keys
+ * @param Object object
+ *
+ * Return an array of own property names.
+ */
+ function keys(object) {
+ var ks = [], prop;
+ for (prop in object) {
+ if (o.hasOwnProperty.call(object, prop)) { ks.push(prop); }
+ }
+ return ks;
+ }
+
+ /**
+ * @name samsam.isDate
+ * @param Object value
+ *
+ * Returns true if the object is a ``Date``, or *date-like*. Duck typing
+ * of date objects work by checking that the object has a ``getTime``
+ * function whose return value equals the return value from the object's
+ * ``valueOf``.
+ */
+ function isDate(value) {
+ return typeof value.getTime == "function" &&
+ value.getTime() == value.valueOf();
+ }
+
+ /**
+ * @name samsam.isNegZero
+ * @param Object value
+ *
+ * Returns ``true`` if ``value`` is ``-0``.
+ */
+ function isNegZero(value) {
+ return value === 0 && 1 / value === -Infinity;
+ }
+
+ /**
+ * @name samsam.equal
+ * @param Object obj1
+ * @param Object obj2
+ *
+ * Returns ``true`` if two objects are strictly equal. Compared to
+ * ``===`` there are two exceptions:
+ *
+ * - NaN is considered equal to NaN
+ * - -0 and +0 are not considered equal
+ */
+ function identical(obj1, obj2) {
+ if (obj1 === obj2 || (isNaN(obj1) && isNaN(obj2))) {
+ return obj1 !== 0 || isNegZero(obj1) === isNegZero(obj2);
+ }
+ }
+
+
+ /**
+ * @name samsam.deepEqual
+ * @param Object obj1
+ * @param Object obj2
+ *
+ * Deep equal comparison. Two values are "deep equal" if:
+ *
+ * - They are equal, according to samsam.identical
+ * - They are both date objects representing the same time
+ * - They are both arrays containing elements that are all deepEqual
+ * - They are objects with the same set of properties, and each property
+ * in ``obj1`` is deepEqual to the corresponding property in ``obj2``
+ *
+ * Supports cyclic objects.
+ */
+ function deepEqualCyclic(obj1, obj2) {
+
+ // used for cyclic comparison
+ // contain already visited objects
+ var objects1 = [],
+ objects2 = [],
+ // contain pathes (position in the object structure)
+ // of the already visited objects
+ // indexes same as in objects arrays
+ paths1 = [],
+ paths2 = [],
+ // contains combinations of already compared objects
+ // in the manner: { "$1['ref']$2['ref']": true }
+ compared = {};
+
+ /**
+ * used to check, if the value of a property is an object
+ * (cyclic logic is only needed for objects)
+ * only needed for cyclic logic
+ */
+ function isObject(value) {
+
+ if (typeof value === 'object' && value !== null &&
+ !(value instanceof Boolean) &&
+ !(value instanceof Date) &&
+ !(value instanceof Number) &&
+ !(value instanceof RegExp) &&
+ !(value instanceof String)) {
+
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * returns the index of the given object in the
+ * given objects array, -1 if not contained
+ * only needed for cyclic logic
+ */
+ function getIndex(objects, obj) {
+
+ var i;
+ for (i = 0; i < objects.length; i++) {
+ if (objects[i] === obj) {
+ return i;
+ }
+ }
+
+ return -1;
+ }
+
+ // does the recursion for the deep equal check
+ return (function deepEqual(obj1, obj2, path1, path2) {
+ var type1 = typeof obj1;
+ var type2 = typeof obj2;
+
+ // == null also matches undefined
+ if (obj1 === obj2 ||
+ isNaN(obj1) || isNaN(obj2) ||
+ obj1 == null || obj2 == null ||
+ type1 !== "object" || type2 !== "object") {
+
+ return identical(obj1, obj2);
+ }
+
+ // Elements are only equal if identical(expected, actual)
+ if (isElement(obj1) || isElement(obj2)) { return false; }
+
+ var isDate1 = isDate(obj1), isDate2 = isDate(obj2);
+ if (isDate1 || isDate2) {
+ if (!isDate1 || !isDate2 || obj1.getTime() !== obj2.getTime()) {
+ return false;
+ }
+ }
+
+ if (obj1 instanceof RegExp && obj2 instanceof RegExp) {
+ if (obj1.toString() !== obj2.toString()) { return false; }
+ }
+
+ var class1 = getClass(obj1);
+ var class2 = getClass(obj2);
+ var keys1 = keys(obj1);
+ var keys2 = keys(obj2);
+
+ if (isArguments(obj1) || isArguments(obj2)) {
+ if (obj1.length !== obj2.length) { return false; }
+ } else {
+ if (type1 !== type2 || class1 !== class2 ||
+ keys1.length !== keys2.length) {
+ return false;
+ }
+ }
+
+ var key, i, l,
+ // following vars are used for the cyclic logic
+ value1, value2,
+ isObject1, isObject2,
+ index1, index2,
+ newPath1, newPath2;
+
+ for (i = 0, l = keys1.length; i < l; i++) {
+ key = keys1[i];
+ if (!o.hasOwnProperty.call(obj2, key)) {
+ return false;
+ }
+
+ // Start of the cyclic logic
+
+ value1 = obj1[key];
+ value2 = obj2[key];
+
+ isObject1 = isObject(value1);
+ isObject2 = isObject(value2);
+
+ // determine, if the objects were already visited
+ // (it's faster to check for isObject first, than to
+ // get -1 from getIndex for non objects)
+ index1 = isObject1 ? getIndex(objects1, value1) : -1;
+ index2 = isObject2 ? getIndex(objects2, value2) : -1;
+
+ // determine the new pathes of the objects
+ // - for non cyclic objects the current path will be extended
+ // by current property name
+ // - for cyclic objects the stored path is taken
+ newPath1 = index1 !== -1
+ ? paths1[index1]
+ : path1 + '[' + JSON.stringify(key) + ']';
+ newPath2 = index2 !== -1
+ ? paths2[index2]
+ : path2 + '[' + JSON.stringify(key) + ']';
+
+ // stop recursion if current objects are already compared
+ if (compared[newPath1 + newPath2]) {
+ return true;
+ }
+
+ // remember the current objects and their pathes
+ if (index1 === -1 && isObject1) {
+ objects1.push(value1);
+ paths1.push(newPath1);
+ }
+ if (index2 === -1 && isObject2) {
+ objects2.push(value2);
+ paths2.push(newPath2);
+ }
+
+ // remember that the current objects are already compared
+ if (isObject1 && isObject2) {
+ compared[newPath1 + newPath2] = true;
+ }
+
+ // End of cyclic logic
+
+ // neither value1 nor value2 is a cycle
+ // continue with next level
+ if (!deepEqual(value1, value2, newPath1, newPath2)) {
+ return false;
+ }
+ }
+
+ return true;
+
+ }(obj1, obj2, '$1', '$2'));
+ }
+
+ var match;
+
+ function arrayContains(array, subset) {
+ if (subset.length === 0) { return true; }
+ var i, l, j, k;
+ for (i = 0, l = array.length; i < l; ++i) {
+ if (match(array[i], subset[0])) {
+ for (j = 0, k = subset.length; j < k; ++j) {
+ if (!match(array[i + j], subset[j])) { return false; }
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @name samsam.match
+ * @param Object object
+ * @param Object matcher
+ *
+ * Compare arbitrary value ``object`` with matcher.
+ */
+ match = function match(object, matcher) {
+ if (matcher && typeof matcher.test === "function") {
+ return matcher.test(object);
+ }
+
+ if (typeof matcher === "function") {
+ return matcher(object) === true;
+ }
+
+ if (typeof matcher === "string") {
+ matcher = matcher.toLowerCase();
+ var notNull = typeof object === "string" || !!object;
+ return notNull &&
+ (String(object)).toLowerCase().indexOf(matcher) >= 0;
+ }
+
+ if (typeof matcher === "number") {
+ return matcher === object;
+ }
+
+ if (typeof matcher === "boolean") {
+ return matcher === object;
+ }
+
+ if (typeof(matcher) === "undefined") {
+ return typeof(object) === "undefined";
+ }
+
+ if (matcher === null) {
+ return object === null;
+ }
+
+ if (getClass(object) === "Array" && getClass(matcher) === "Array") {
+ return arrayContains(object, matcher);
+ }
+
+ if (matcher && typeof matcher === "object") {
+ if (matcher === object) {
+ return true;
+ }
+ var prop;
+ for (prop in matcher) {
+ var value = object[prop];
+ if (typeof value === "undefined" &&
+ typeof object.getAttribute === "function") {
+ value = object.getAttribute(prop);
+ }
+ if (matcher[prop] === null || typeof matcher[prop] === 'undefined') {
+ if (value !== matcher[prop]) {
+ return false;
+ }
+ } else if (typeof value === "undefined" || !match(value, matcher[prop])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ throw new Error("Matcher was not a string, a number, a " +
+ "function, a boolean or an object");
+ };
+
+ return {
+ isArguments: isArguments,
+ isElement: isElement,
+ isDate: isDate,
+ isNegZero: isNegZero,
+ identical: identical,
+ deepEqual: deepEqualCyclic,
+ match: match,
+ keys: keys
+ };
+});
+((typeof define === "function" && define.amd && function (m) {
+ define("formatio", ["samsam"], m);
+}) || (typeof module === "object" && function (m) {
+ module.exports = m(require("samsam"));
+}) || function (m) { this.formatio = m(this.samsam); }
+)(function (samsam) {
+
+ var formatio = {
+ excludeConstructors: ["Object", /^.$/],
+ quoteStrings: true,
+ limitChildrenCount: 0
+ };
+
+ var hasOwn = Object.prototype.hasOwnProperty;
+
+ var specialObjects = [];
+ if (typeof global !== "undefined") {
+ specialObjects.push({ object: global, value: "[object global]" });
+ }
+ if (typeof document !== "undefined") {
+ specialObjects.push({
+ object: document,
+ value: "[object HTMLDocument]"
+ });
+ }
+ if (typeof window !== "undefined") {
+ specialObjects.push({ object: window, value: "[object Window]" });
+ }
+
+ function functionName(func) {
+ if (!func) { return ""; }
+ if (func.displayName) { return func.displayName; }
+ if (func.name) { return func.name; }
+ var matches = func.toString().match(/function\s+([^\(]+)/m);
+ return (matches && matches[1]) || "";
+ }
+
+ function constructorName(f, object) {
+ var name = functionName(object && object.constructor);
+ var excludes = f.excludeConstructors ||
+ formatio.excludeConstructors || [];
+
+ var i, l;
+ for (i = 0, l = excludes.length; i < l; ++i) {
+ if (typeof excludes[i] === "string" && excludes[i] === name) {
+ return "";
+ } else if (excludes[i].test && excludes[i].test(name)) {
+ return "";
+ }
+ }
+
+ return name;
+ }
+
+ function isCircular(object, objects) {
+ if (typeof object !== "object") { return false; }
+ var i, l;
+ for (i = 0, l = objects.length; i < l; ++i) {
+ if (objects[i] === object) { return true; }
+ }
+ return false;
+ }
+
+ function ascii(f, object, processed, indent) {
+ if (typeof object === "string") {
+ var qs = f.quoteStrings;
+ var quote = typeof qs !== "boolean" || qs;
+ return processed || quote ? '"' + object + '"' : object;
+ }
+
+ if (typeof object === "function" && !(object instanceof RegExp)) {
+ return ascii.func(object);
+ }
+
+ processed = processed || [];
+
+ if (isCircular(object, processed)) { return "[Circular]"; }
+
+ if (Object.prototype.toString.call(object) === "[object Array]") {
+ return ascii.array.call(f, object, processed);
+ }
+
+ if (!object) { return String((1/object) === -Infinity ? "-0" : object); }
+ if (samsam.isElement(object)) { return ascii.element(object); }
+
+ if (typeof object.toString === "function" &&
+ object.toString !== Object.prototype.toString) {
+ return object.toString();
+ }
+
+ var i, l;
+ for (i = 0, l = specialObjects.length; i < l; i++) {
+ if (object === specialObjects[i].object) {
+ return specialObjects[i].value;
+ }
+ }
+
+ return ascii.object.call(f, object, processed, indent);
+ }
+
+ ascii.func = function (func) {
+ return "function " + functionName(func) + "() {}";
+ };
+
+ ascii.array = function (array, processed) {
+ processed = processed || [];
+ processed.push(array);
+ var pieces = [];
+ var i, l;
+ l = (this.limitChildrenCount > 0) ?
+ Math.min(this.limitChildrenCount, array.length) : array.length;
+
+ for (i = 0; i < l; ++i) {
+ pieces.push(ascii(this, array[i], processed));
+ }
+
+ if(l < array.length)
+ pieces.push("[... " + (array.length - l) + " more elements]");
+
+ return "[" + pieces.join(", ") + "]";
+ };
+
+ ascii.object = function (object, processed, indent) {
+ processed = processed || [];
+ processed.push(object);
+ indent = indent || 0;
+ var pieces = [], properties = samsam.keys(object).sort();
+ var length = 3;
+ var prop, str, obj, i, k, l;
+ l = (this.limitChildrenCount > 0) ?
+ Math.min(this.limitChildrenCount, properties.length) : properties.length;
+
+ for (i = 0; i < l; ++i) {
+ prop = properties[i];
+ obj = object[prop];
+
+ if (isCircular(obj, processed)) {
+ str = "[Circular]";
+ } else {
+ str = ascii(this, obj, processed, indent + 2);
+ }
+
+ str = (/\s/.test(prop) ? '"' + prop + '"' : prop) + ": " + str;
+ length += str.length;
+ pieces.push(str);
+ }
+
+ var cons = constructorName(this, object);
+ var prefix = cons ? "[" + cons + "] " : "";
+ var is = "";
+ for (i = 0, k = indent; i < k; ++i) { is += " "; }
+
+ if(l < properties.length)
+ pieces.push("[... " + (properties.length - l) + " more elements]");
+
+ if (length + indent > 80) {
+ return prefix + "{\n " + is + pieces.join(",\n " + is) + "\n" +
+ is + "}";
+ }
+ return prefix + "{ " + pieces.join(", ") + " }";
+ };
+
+ ascii.element = function (element) {
+ var tagName = element.tagName.toLowerCase();
+ var attrs = element.attributes, attr, pairs = [], attrName, i, l, val;
+
+ for (i = 0, l = attrs.length; i < l; ++i) {
+ attr = attrs.item(i);
+ attrName = attr.nodeName.toLowerCase().replace("html:", "");
+ val = attr.nodeValue;
+ if (attrName !== "contenteditable" || val !== "inherit") {
+ if (!!val) { pairs.push(attrName + "=\"" + val + "\""); }
+ }
+ }
+
+ var formatted = "<" + tagName + (pairs.length > 0 ? " " : "");
+ var content = element.innerHTML;
+
+ if (content.length > 20) {
+ content = content.substr(0, 20) + "[...]";
+ }
+
+ var res = formatted + pairs.join(" ") + ">" + content +
+ "</" + tagName + ">";
+
+ return res.replace(/ contentEditable="inherit"/, "");
+ };
+
+ function Formatio(options) {
+ for (var opt in options) {
+ this[opt] = options[opt];
+ }
+ }
+
+ Formatio.prototype = {
+ functionName: functionName,
+
+ configure: function (options) {
+ return new Formatio(options);
+ },
+
+ constructorName: function (object) {
+ return constructorName(this, object);
+ },
+
+ ascii: function (object, processed, indent) {
+ return ascii(this, object, processed, indent);
+ }
+ };
+
+ return Formatio.prototype;
+});
+!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.lolex=e()}}(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);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+(function (global){
+/*global global, window*/
+/**
+ * @author Christian Johansen (christian@cjohansen.no) and contributors
+ * @license BSD
+ *
+ * Copyright (c) 2010-2014 Christian Johansen
+ */
+
+(function (global) {
+
+ // Make properties writable in IE, as per
+ // http://www.adequatelygood.com/Replacing-setTimeout-Globally.html
+ // JSLint being anal
+ var glbl = global;
+
+ global.setTimeout = glbl.setTimeout;
+ global.clearTimeout = glbl.clearTimeout;
+ global.setInterval = glbl.setInterval;
+ global.clearInterval = glbl.clearInterval;
+ global.Date = glbl.Date;
+
+ // setImmediate is not a standard function
+ // avoid adding the prop to the window object if not present
+ if('setImmediate' in global) {
+ global.setImmediate = glbl.setImmediate;
+ global.clearImmediate = glbl.clearImmediate;
+ }
+
+ // node expects setTimeout/setInterval to return a fn object w/ .ref()/.unref()
+ // browsers, a number.
+ // see https://github.com/cjohansen/Sinon.JS/pull/436
+
+ var NOOP = function () { return undefined; };
+ var timeoutResult = setTimeout(NOOP, 0);
+ var addTimerReturnsObject = typeof timeoutResult === "object";
+ clearTimeout(timeoutResult);
+
+ var NativeDate = Date;
+ var uniqueTimerId = 1;
+
+ /**
+ * Parse strings like "01:10:00" (meaning 1 hour, 10 minutes, 0 seconds) into
+ * number of milliseconds. This is used to support human-readable strings passed
+ * to clock.tick()
+ */
+ function parseTime(str) {
+ if (!str) {
+ return 0;
+ }
+
+ var strings = str.split(":");
+ var l = strings.length, i = l;
+ var ms = 0, parsed;
+
+ if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) {
+ throw new Error("tick only understands numbers and 'h:m:s'");
+ }
+
+ while (i--) {
+ parsed = parseInt(strings[i], 10);
+
+ if (parsed >= 60) {
+ throw new Error("Invalid time " + str);
+ }
+
+ ms += parsed * Math.pow(60, (l - i - 1));
+ }
+
+ return ms * 1000;
+ }
+
+ /**
+ * Used to grok the `now` parameter to createClock.
+ */
+ function getEpoch(epoch) {
+ if (!epoch) { return 0; }
+ if (typeof epoch.getTime === "function") { return epoch.getTime(); }
+ if (typeof epoch === "number") { return epoch; }
+ throw new TypeError("now should be milliseconds since UNIX epoch");
+ }
+
+ function inRange(from, to, timer) {
+ return timer && timer.callAt >= from && timer.callAt <= to;
+ }
+
+ function mirrorDateProperties(target, source) {
+ var prop;
+ for (prop in source) {
+ if (source.hasOwnProperty(prop)) {
+ target[prop] = source[prop];
+ }
+ }
+
+ // set special now implementation
+ if (source.now) {
+ target.now = function now() {
+ return target.clock.now;
+ };
+ } else {
+ delete target.now;
+ }
+
+ // set special toSource implementation
+ if (source.toSource) {
+ target.toSource = function toSource() {
+ return source.toSource();
+ };
+ } else {
+ delete target.toSource;
+ }
+
+ // set special toString implementation
+ target.toString = function toString() {
+ return source.toString();
+ };
+
+ target.prototype = source.prototype;
+ target.parse = source.parse;
+ target.UTC = source.UTC;
+ target.prototype.toUTCString = source.prototype.toUTCString;
+
+ return target;
+ }
+
+ function createDate() {
+ function ClockDate(year, month, date, hour, minute, second, ms) {
+ // Defensive and verbose to avoid potential harm in passing
+ // explicit undefined when user does not pass argument
+ switch (arguments.length) {
+ case 0:
+ return new NativeDate(ClockDate.clock.now);
+ case 1:
+ return new NativeDate(year);
+ case 2:
+ return new NativeDate(year, month);
+ case 3:
+ return new NativeDate(year, month, date);
+ case 4:
+ return new NativeDate(year, month, date, hour);
+ case 5:
+ return new NativeDate(year, month, date, hour, minute);
+ case 6:
+ return new NativeDate(year, month, date, hour, minute, second);
+ default:
+ return new NativeDate(year, month, date, hour, minute, second, ms);
+ }
+ }
+
+ return mirrorDateProperties(ClockDate, NativeDate);
+ }
+
+ function addTimer(clock, timer) {
+ if (timer.func === undefined) {
+ throw new Error("Callback must be provided to timer calls");
+ }
+
+ if (!clock.timers) {
+ clock.timers = {};
+ }
+
+ timer.id = uniqueTimerId++;
+ timer.createdAt = clock.now;
+ timer.callAt = clock.now + (timer.delay || (clock.duringTick ? 1 : 0));
+
+ clock.timers[timer.id] = timer;
+
+ if (addTimerReturnsObject) {
+ return {
+ id: timer.id,
+ ref: NOOP,
+ unref: NOOP
+ };
+ }
+
+ return timer.id;
+ }
+
+
+ function compareTimers(a, b) {
+ // Sort first by absolute timing
+ if (a.callAt < b.callAt) {
+ return -1;
+ }
+ if (a.callAt > b.callAt) {
+ return 1;
+ }
+
+ // Sort next by immediate, immediate timers take precedence
+ if (a.immediate && !b.immediate) {
+ return -1;
+ }
+ if (!a.immediate && b.immediate) {
+ return 1;
+ }
+
+ // Sort next by creation time, earlier-created timers take precedence
+ if (a.createdAt < b.createdAt) {
+ return -1;
+ }
+ if (a.createdAt > b.createdAt) {
+ return 1;
+ }
+
+ // Sort next by id, lower-id timers take precedence
+ if (a.id < b.id) {
+ return -1;
+ }
+ if (a.id > b.id) {
+ return 1;
+ }
+
+ // As timer ids are unique, no fallback `0` is necessary
+ }
+
+ function firstTimerInRange(clock, from, to) {
+ var timers = clock.timers,
+ timer = null,
+ id,
+ isInRange;
+
+ for (id in timers) {
+ if (timers.hasOwnProperty(id)) {
+ isInRange = inRange(from, to, timers[id]);
+
+ if (isInRange && (!timer || compareTimers(timer, timers[id]) === 1)) {
+ timer = timers[id];
+ }
+ }
+ }
+
+ return timer;
+ }
+
+ function callTimer(clock, timer) {
+ var exception;
+
+ if (typeof timer.interval === "number") {
+ clock.timers[timer.id].callAt += timer.interval;
+ } else {
+ delete clock.timers[timer.id];
+ }
+
+ try {
+ if (typeof timer.func === "function") {
+ timer.func.apply(null, timer.args);
+ } else {
+ eval(timer.func);
+ }
+ } catch (e) {
+ exception = e;
+ }
+
+ if (!clock.timers[timer.id]) {
+ if (exception) {
+ throw exception;
+ }
+ return;
+ }
+
+ if (exception) {
+ throw exception;
+ }
+ }
+
+ function timerType(timer) {
+ if (timer.immediate) {
+ return "Immediate";
+ } else if (typeof timer.interval !== "undefined") {
+ return "Interval";
+ } else {
+ return "Timeout";
+ }
+ }
+
+ function clearTimer(clock, timerId, ttype) {
+ if (!timerId) {
+ // null appears to be allowed in most browsers, and appears to be
+ // relied upon by some libraries, like Bootstrap carousel
+ return;
+ }
+
+ if (!clock.timers) {
+ clock.timers = [];
+ }
+
+ // in Node, timerId is an object with .ref()/.unref(), and
+ // its .id field is the actual timer id.
+ if (typeof timerId === "object") {
+ timerId = timerId.id;
+ }
+
+ if (clock.timers.hasOwnProperty(timerId)) {
+ // check that the ID matches a timer of the correct type
+ var timer = clock.timers[timerId];
+ if (timerType(timer) === ttype) {
+ delete clock.timers[timerId];
+ } else {
+ throw new Error("Cannot clear timer: timer created with set" + ttype + "() but cleared with clear" + timerType(timer) + "()");
+ }
+ }
+ }
+
+ function uninstall(clock, target) {
+ var method,
+ i,
+ l;
+
+ for (i = 0, l = clock.methods.length; i < l; i++) {
+ method = clock.methods[i];
+
+ if (target[method].hadOwnProperty) {
+ target[method] = clock["_" + method];
+ } else {
+ try {
+ delete target[method];
+ } catch (ignore) {}
+ }
+ }
+
+ // Prevent multiple executions which will completely remove these props
+ clock.methods = [];
+ }
+
+ function hijackMethod(target, method, clock) {
+ var prop;
+
+ clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(target, method);
+ clock["_" + method] = target[method];
+
+ if (method === "Date") {
+ var date = mirrorDateProperties(clock[method], target[method]);
+ target[method] = date;
+ } else {
+ target[method] = function () {
+ return clock[method].apply(clock, arguments);
+ };
+
+ for (prop in clock[method]) {
+ if (clock[method].hasOwnProperty(prop)) {
+ target[method][prop] = clock[method][prop];
+ }
+ }
+ }
+
+ target[method].clock = clock;
+ }
+
+ var timers = {
+ setTimeout: setTimeout,
+ clearTimeout: clearTimeout,
+ setImmediate: global.setImmediate,
+ clearImmediate: global.clearImmediate,
+ setInterval: setInterval,
+ clearInterval: clearInterval,
+ Date: Date
+ };
+
+ var keys = Object.keys || function (obj) {
+ var ks = [],
+ key;
+
+ for (key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ ks.push(key);
+ }
+ }
+
+ return ks;
+ };
+
+ exports.timers = timers;
+
+ function createClock(now) {
+ var clock = {
+ now: getEpoch(now),
+ timeouts: {},
+ Date: createDate()
+ };
+
+ clock.Date.clock = clock;
+
+ clock.setTimeout = function setTimeout(func, timeout) {
+ return addTimer(clock, {
+ func: func,
+ args: Array.prototype.slice.call(arguments, 2),
+ delay: timeout
+ });
+ };
+
+ clock.clearTimeout = function clearTimeout(timerId) {
+ return clearTimer(clock, timerId, "Timeout");
+ };
+
+ clock.setInterval = function setInterval(func, timeout) {
+ return addTimer(clock, {
+ func: func,
+ args: Array.prototype.slice.call(arguments, 2),
+ delay: timeout,
+ interval: timeout
+ });
+ };
+
+ clock.clearInterval = function clearInterval(timerId) {
+ return clearTimer(clock, timerId, "Interval");
+ };
+
+ clock.setImmediate = function setImmediate(func) {
+ return addTimer(clock, {
+ func: func,
+ args: Array.prototype.slice.call(arguments, 1),
+ immediate: true
+ });
+ };
+
+ clock.clearImmediate = function clearImmediate(timerId) {
+ return clearTimer(clock, timerId, "Immediate");
+ };
+
+ clock.tick = function tick(ms) {
+ ms = typeof ms === "number" ? ms : parseTime(ms);
+ var tickFrom = clock.now, tickTo = clock.now + ms, previous = clock.now;
+ var timer = firstTimerInRange(clock, tickFrom, tickTo);
+ var oldNow;
+
+ clock.duringTick = true;
+
+ var firstException;
+ while (timer && tickFrom <= tickTo) {
+ if (clock.timers[timer.id]) {
+ tickFrom = clock.now = timer.callAt;
+ try {
+ oldNow = clock.now;
+ callTimer(clock, timer);
+ // compensate for any setSystemTime() call during timer callback
+ if (oldNow !== clock.now) {
+ tickFrom += clock.now - oldNow;
+ tickTo += clock.now - oldNow;
+ previous += clock.now - oldNow;
+ }
+ } catch (e) {
+ firstException = firstException || e;
+ }
+ }
+
+ timer = firstTimerInRange(clock, previous, tickTo);
+ previous = tickFrom;
+ }
+
+ clock.duringTick = false;
+ clock.now = tickTo;
+
+ if (firstException) {
+ throw firstException;
+ }
+
+ return clock.now;
+ };
+
+ clock.reset = function reset() {
+ clock.timers = {};
+ };
+
+ clock.setSystemTime = function setSystemTime(now) {
+ // determine time difference
+ var newNow = getEpoch(now);
+ var difference = newNow - clock.now;
+
+ // update 'system clock'
+ clock.now = newNow;
+
+ // update timers and intervals to keep them stable
+ for (var id in clock.timers) {
+ if (clock.timers.hasOwnProperty(id)) {
+ var timer = clock.timers[id];
+ timer.createdAt += difference;
+ timer.callAt += difference;
+ }
+ }
+ };
+
+ return clock;
+ }
+ exports.createClock = createClock;
+
+ exports.install = function install(target, now, toFake) {
+ var i,
+ l;
+
+ if (typeof target === "number") {
+ toFake = now;
+ now = target;
+ target = null;
+ }
+
+ if (!target) {
+ target = global;
+ }
+
+ var clock = createClock(now);
+
+ clock.uninstall = function () {
+ uninstall(clock, target);
+ };
+
+ clock.methods = toFake || [];
+
+ if (clock.methods.length === 0) {
+ clock.methods = keys(timers);
+ }
+
+ for (i = 0, l = clock.methods.length; i < l; i++) {
+ hijackMethod(target, clock.methods[i], clock);
+ }
+
+ return clock;
+ };
+
+}(global || this));
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}]},{},[1])(1)
+});
+ })();
+ var define;
+/**
+ * Sinon core utilities. For internal use only.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+var sinon = (function () {
+"use strict";
+ // eslint-disable-line no-unused-vars
+
+ var sinonModule;
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ function loadDependencies(require, exports, module) {
+ sinonModule = module.exports = require("./sinon/util/core");
+ require("./sinon/extend");
+ require("./sinon/walk");
+ require("./sinon/typeOf");
+ require("./sinon/times_in_words");
+ require("./sinon/spy");
+ require("./sinon/call");
+ require("./sinon/behavior");
+ require("./sinon/stub");
+ require("./sinon/mock");
+ require("./sinon/collection");
+ require("./sinon/assert");
+ require("./sinon/sandbox");
+ require("./sinon/test");
+ require("./sinon/test_case");
+ require("./sinon/match");
+ require("./sinon/format");
+ require("./sinon/log_error");
+ }
+
+ if (isAMD) {
+ define(loadDependencies);
+ } else if (isNode) {
+ loadDependencies(require, module.exports, module);
+ sinonModule = module.exports;
+ } else {
+ sinonModule = {};
+ }
+
+ return sinonModule;
+}());
+
+/**
+ * @depend ../../sinon.js
+ */
+/**
+ * Sinon core utilities. For internal use only.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal) {
+
+ var div = typeof document !== "undefined" && document.createElement("div");
+ var hasOwn = Object.prototype.hasOwnProperty;
+
+ function isDOMNode(obj) {
+ var success = false;
+
+ try {
+ obj.appendChild(div);
+ success = div.parentNode === obj;
+ } catch (e) {
+ return false;
+ } finally {
+ try {
+ obj.removeChild(div);
+ } catch (e) {
+ // Remove failed, not much we can do about that
+ }
+ }
+
+ return success;
+ }
+
+ function isElement(obj) {
+ return div && obj && obj.nodeType === 1 && isDOMNode(obj);
+ }
+
+ function isFunction(obj) {
+ return typeof obj === "function" || !!(obj && obj.constructor && obj.call && obj.apply);
+ }
+
+ function isReallyNaN(val) {
+ return typeof val === "number" && isNaN(val);
+ }
+
+ function mirrorProperties(target, source) {
+ for (var prop in source) {
+ if (!hasOwn.call(target, prop)) {
+ target[prop] = source[prop];
+ }
+ }
+ }
+
+ function isRestorable(obj) {
+ return typeof obj === "function" && typeof obj.restore === "function" && obj.restore.sinon;
+ }
+
+ // Cheap way to detect if we have ES5 support.
+ var hasES5Support = "keys" in Object;
+
+ function makeApi(sinon) {
+ sinon.wrapMethod = function wrapMethod(object, property, method) {
+ if (!object) {
+ throw new TypeError("Should wrap property of object");
+ }
+
+ if (typeof method !== "function" && typeof method !== "object") {
+ throw new TypeError("Method wrapper should be a function or a property descriptor");
+ }
+
+ function checkWrappedMethod(wrappedMethod) {
+ var error;
+
+ if (!isFunction(wrappedMethod)) {
+ error = new TypeError("Attempted to wrap " + (typeof wrappedMethod) + " property " +
+ property + " as function");
+ } else if (wrappedMethod.restore && wrappedMethod.restore.sinon) {
+ error = new TypeError("Attempted to wrap " + property + " which is already wrapped");
+ } else if (wrappedMethod.calledBefore) {
+ var verb = wrappedMethod.returns ? "stubbed" : "spied on";
+ error = new TypeError("Attempted to wrap " + property + " which is already " + verb);
+ }
+
+ if (error) {
+ if (wrappedMethod && wrappedMethod.stackTrace) {
+ error.stack += "\n--------------\n" + wrappedMethod.stackTrace;
+ }
+ throw error;
+ }
+ }
+
+ var error, wrappedMethod, i;
+
+ // IE 8 does not support hasOwnProperty on the window object and Firefox has a problem
+ // when using hasOwn.call on objects from other frames.
+ var owned = object.hasOwnProperty ? object.hasOwnProperty(property) : hasOwn.call(object, property);
+
+ if (hasES5Support) {
+ var methodDesc = (typeof method === "function") ? {value: method} : method;
+ var wrappedMethodDesc = sinon.getPropertyDescriptor(object, property);
+
+ if (!wrappedMethodDesc) {
+ error = new TypeError("Attempted to wrap " + (typeof wrappedMethod) + " property " +
+ property + " as function");
+ } else if (wrappedMethodDesc.restore && wrappedMethodDesc.restore.sinon) {
+ error = new TypeError("Attempted to wrap " + property + " which is already wrapped");
+ }
+ if (error) {
+ if (wrappedMethodDesc && wrappedMethodDesc.stackTrace) {
+ error.stack += "\n--------------\n" + wrappedMethodDesc.stackTrace;
+ }
+ throw error;
+ }
+
+ var types = sinon.objectKeys(methodDesc);
+ for (i = 0; i < types.length; i++) {
+ wrappedMethod = wrappedMethodDesc[types[i]];
+ checkWrappedMethod(wrappedMethod);
+ }
+
+ mirrorProperties(methodDesc, wrappedMethodDesc);
+ for (i = 0; i < types.length; i++) {
+ mirrorProperties(methodDesc[types[i]], wrappedMethodDesc[types[i]]);
+ }
+ Object.defineProperty(object, property, methodDesc);
+ } else {
+ wrappedMethod = object[property];
+ checkWrappedMethod(wrappedMethod);
+ object[property] = method;
+ method.displayName = property;
+ }
+
+ method.displayName = property;
+
+ // Set up a stack trace which can be used later to find what line of
+ // code the original method was created on.
+ method.stackTrace = (new Error("Stack Trace for original")).stack;
+
+ method.restore = function () {
+ // For prototype properties try to reset by delete first.
+ // If this fails (ex: localStorage on mobile safari) then force a reset
+ // via direct assignment.
+ if (!owned) {
+ // In some cases `delete` may throw an error
+ try {
+ delete object[property];
+ } catch (e) {} // eslint-disable-line no-empty
+ // For native code functions `delete` fails without throwing an error
+ // on Chrome < 43, PhantomJS, etc.
+ } else if (hasES5Support) {
+ Object.defineProperty(object, property, wrappedMethodDesc);
+ }
+
+ // Use strict equality comparison to check failures then force a reset
+ // via direct assignment.
+ if (object[property] === method) {
+ object[property] = wrappedMethod;
+ }
+ };
+
+ method.restore.sinon = true;
+
+ if (!hasES5Support) {
+ mirrorProperties(method, wrappedMethod);
+ }
+
+ return method;
+ };
+
+ sinon.create = function create(proto) {
+ var F = function () {};
+ F.prototype = proto;
+ return new F();
+ };
+
+ sinon.deepEqual = function deepEqual(a, b) {
+ if (sinon.match && sinon.match.isMatcher(a)) {
+ return a.test(b);
+ }
+
+ if (typeof a !== "object" || typeof b !== "object") {
+ return isReallyNaN(a) && isReallyNaN(b) || a === b;
+ }
+
+ if (isElement(a) || isElement(b)) {
+ return a === b;
+ }
+
+ if (a === b) {
+ return true;
+ }
+
+ if ((a === null && b !== null) || (a !== null && b === null)) {
+ return false;
+ }
+
+ if (a instanceof RegExp && b instanceof RegExp) {
+ return (a.source === b.source) && (a.global === b.global) &&
+ (a.ignoreCase === b.ignoreCase) && (a.multiline === b.multiline);
+ }
+
+ var aString = Object.prototype.toString.call(a);
+ if (aString !== Object.prototype.toString.call(b)) {
+ return false;
+ }
+
+ if (aString === "[object Date]") {
+ return a.valueOf() === b.valueOf();
+ }
+
+ var prop;
+ var aLength = 0;
+ var bLength = 0;
+
+ if (aString === "[object Array]" && a.length !== b.length) {
+ return false;
+ }
+
+ for (prop in a) {
+ if (a.hasOwnProperty(prop)) {
+ aLength += 1;
+
+ if (!(prop in b)) {
+ return false;
+ }
+
+ if (!deepEqual(a[prop], b[prop])) {
+ return false;
+ }
+ }
+ }
+
+ for (prop in b) {
+ if (b.hasOwnProperty(prop)) {
+ bLength += 1;
+ }
+ }
+
+ return aLength === bLength;
+ };
+
+ sinon.functionName = function functionName(func) {
+ var name = func.displayName || func.name;
+
+ // Use function decomposition as a last resort to get function
+ // name. Does not rely on function decomposition to work - if it
+ // doesn't debugging will be slightly less informative
+ // (i.e. toString will say 'spy' rather than 'myFunc').
+ if (!name) {
+ var matches = func.toString().match(/function ([^\s\(]+)/);
+ name = matches && matches[1];
+ }
+
+ return name;
+ };
+
+ sinon.functionToString = function toString() {
+ if (this.getCall && this.callCount) {
+ var thisValue,
+ prop;
+ var i = this.callCount;
+
+ while (i--) {
+ thisValue = this.getCall(i).thisValue;
+
+ for (prop in thisValue) {
+ if (thisValue[prop] === this) {
+ return prop;
+ }
+ }
+ }
+ }
+
+ return this.displayName || "sinon fake";
+ };
+
+ sinon.objectKeys = function objectKeys(obj) {
+ if (obj !== Object(obj)) {
+ throw new TypeError("sinon.objectKeys called on a non-object");
+ }
+
+ var keys = [];
+ var key;
+ for (key in obj) {
+ if (hasOwn.call(obj, key)) {
+ keys.push(key);
+ }
+ }
+
+ return keys;
+ };
+
+ sinon.getPropertyDescriptor = function getPropertyDescriptor(object, property) {
+ var proto = object;
+ var descriptor;
+
+ while (proto && !(descriptor = Object.getOwnPropertyDescriptor(proto, property))) {
+ proto = Object.getPrototypeOf(proto);
+ }
+ return descriptor;
+ };
+
+ sinon.getConfig = function (custom) {
+ var config = {};
+ custom = custom || {};
+ var defaults = sinon.defaultConfig;
+
+ for (var prop in defaults) {
+ if (defaults.hasOwnProperty(prop)) {
+ config[prop] = custom.hasOwnProperty(prop) ? custom[prop] : defaults[prop];
+ }
+ }
+
+ return config;
+ };
+
+ sinon.defaultConfig = {
+ injectIntoThis: true,
+ injectInto: null,
+ properties: ["spy", "stub", "mock", "clock", "server", "requests"],
+ useFakeTimers: true,
+ useFakeServer: true
+ };
+
+ sinon.timesInWords = function timesInWords(count) {
+ return count === 1 && "once" ||
+ count === 2 && "twice" ||
+ count === 3 && "thrice" ||
+ (count || 0) + " times";
+ };
+
+ sinon.calledInOrder = function (spies) {
+ for (var i = 1, l = spies.length; i < l; i++) {
+ if (!spies[i - 1].calledBefore(spies[i]) || !spies[i].called) {
+ return false;
+ }
+ }
+
+ return true;
+ };
+
+ sinon.orderByFirstCall = function (spies) {
+ return spies.sort(function (a, b) {
+ // uuid, won't ever be equal
+ var aCall = a.getCall(0);
+ var bCall = b.getCall(0);
+ var aId = aCall && aCall.callId || -1;
+ var bId = bCall && bCall.callId || -1;
+
+ return aId < bId ? -1 : 1;
+ });
+ };
+
+ sinon.createStubInstance = function (constructor) {
+ if (typeof constructor !== "function") {
+ throw new TypeError("The constructor should be a function.");
+ }
+ return sinon.stub(sinon.create(constructor.prototype));
+ };
+
+ sinon.restore = function (object) {
+ if (object !== null && typeof object === "object") {
+ for (var prop in object) {
+ if (isRestorable(object[prop])) {
+ object[prop].restore();
+ }
+ }
+ } else if (isRestorable(object)) {
+ object.restore();
+ }
+ };
+
+ return sinon;
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ function loadDependencies(require, exports) {
+ makeApi(exports);
+ }
+
+ if (isAMD) {
+ define(loadDependencies);
+ return;
+ }
+
+ if (isNode) {
+ loadDependencies(require, module.exports, module);
+ return;
+ }
+
+ if (sinonGlobal) {
+ makeApi(sinonGlobal);
+ }
+}(
+ typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ */
+(function (sinonGlobal) {
+
+ function makeApi(sinon) {
+
+ // Adapted from https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug
+ var hasDontEnumBug = (function () {
+ var obj = {
+ constructor: function () {
+ return "0";
+ },
+ toString: function () {
+ return "1";
+ },
+ valueOf: function () {
+ return "2";
+ },
+ toLocaleString: function () {
+ return "3";
+ },
+ prototype: function () {
+ return "4";
+ },
+ isPrototypeOf: function () {
+ return "5";
+ },
+ propertyIsEnumerable: function () {
+ return "6";
+ },
+ hasOwnProperty: function () {
+ return "7";
+ },
+ length: function () {
+ return "8";
+ },
+ unique: function () {
+ return "9";
+ }
+ };
+
+ var result = [];
+ for (var prop in obj) {
+ if (obj.hasOwnProperty(prop)) {
+ result.push(obj[prop]());
+ }
+ }
+ return result.join("") !== "0123456789";
+ })();
+
+ /* Public: Extend target in place with all (own) properties from sources in-order. Thus, last source will
+ * override properties in previous sources.
+ *
+ * target - The Object to extend
+ * sources - Objects to copy properties from.
+ *
+ * Returns the extended target
+ */
+ function extend(target /*, sources */) {
+ var sources = Array.prototype.slice.call(arguments, 1);
+ var source, i, prop;
+
+ for (i = 0; i < sources.length; i++) {
+ source = sources[i];
+
+ for (prop in source) {
+ if (source.hasOwnProperty(prop)) {
+ target[prop] = source[prop];
+ }
+ }
+
+ // Make sure we copy (own) toString method even when in JScript with DontEnum bug
+ // See https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug
+ if (hasDontEnumBug && source.hasOwnProperty("toString") && source.toString !== target.toString) {
+ target.toString = source.toString;
+ }
+ }
+
+ return target;
+ }
+
+ sinon.extend = extend;
+ return sinon.extend;
+ }
+
+ function loadDependencies(require, exports, module) {
+ var sinon = require("./util/core");
+ module.exports = makeApi(sinon);
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ if (isAMD) {
+ define(loadDependencies);
+ return;
+ }
+
+ if (isNode) {
+ loadDependencies(require, module.exports, module);
+ return;
+ }
+
+ if (sinonGlobal) {
+ makeApi(sinonGlobal);
+ }
+}(
+ typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ */
+(function (sinonGlobal) {
+
+ function makeApi(sinon) {
+
+ function timesInWords(count) {
+ switch (count) {
+ case 1:
+ return "once";
+ case 2:
+ return "twice";
+ case 3:
+ return "thrice";
+ default:
+ return (count || 0) + " times";
+ }
+ }
+
+ sinon.timesInWords = timesInWords;
+ return sinon.timesInWords;
+ }
+
+ function loadDependencies(require, exports, module) {
+ var core = require("./util/core");
+ module.exports = makeApi(core);
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ if (isAMD) {
+ define(loadDependencies);
+ return;
+ }
+
+ if (isNode) {
+ loadDependencies(require, module.exports, module);
+ return;
+ }
+
+ if (sinonGlobal) {
+ makeApi(sinonGlobal);
+ }
+}(
+ typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ */
+/**
+ * Format functions
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2014 Christian Johansen
+ */
+(function (sinonGlobal) {
+
+ function makeApi(sinon) {
+ function typeOf(value) {
+ if (value === null) {
+ return "null";
+ } else if (value === undefined) {
+ return "undefined";
+ }
+ var string = Object.prototype.toString.call(value);
+ return string.substring(8, string.length - 1).toLowerCase();
+ }
+
+ sinon.typeOf = typeOf;
+ return sinon.typeOf;
+ }
+
+ function loadDependencies(require, exports, module) {
+ var core = require("./util/core");
+ module.exports = makeApi(core);
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ if (isAMD) {
+ define(loadDependencies);
+ return;
+ }
+
+ if (isNode) {
+ loadDependencies(require, module.exports, module);
+ return;
+ }
+
+ if (sinonGlobal) {
+ makeApi(sinonGlobal);
+ }
+}(
+ typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ * @depend typeOf.js
+ */
+/*jslint eqeqeq: false, onevar: false, plusplus: false*/
+/*global module, require, sinon*/
+/**
+ * Match functions
+ *
+ * @author Maximilian Antoni (mail@maxantoni.de)
+ * @license BSD
+ *
+ * Copyright (c) 2012 Maximilian Antoni
+ */
+(function (sinonGlobal) {
+
+ function makeApi(sinon) {
+ function assertType(value, type, name) {
+ var actual = sinon.typeOf(value);
+ if (actual !== type) {
+ throw new TypeError("Expected type of " + name + " to be " +
+ type + ", but was " + actual);
+ }
+ }
+
+ var matcher = {
+ toString: function () {
+ return this.message;
+ }
+ };
+
+ function isMatcher(object) {
+ return matcher.isPrototypeOf(object);
+ }
+
+ function matchObject(expectation, actual) {
+ if (actual === null || actual === undefined) {
+ return false;
+ }
+ for (var key in expectation) {
+ if (expectation.hasOwnProperty(key)) {
+ var exp = expectation[key];
+ var act = actual[key];
+ if (isMatcher(exp)) {
+ if (!exp.test(act)) {
+ return false;
+ }
+ } else if (sinon.typeOf(exp) === "object") {
+ if (!matchObject(exp, act)) {
+ return false;
+ }
+ } else if (!sinon.deepEqual(exp, act)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ function match(expectation, message) {
+ var m = sinon.create(matcher);
+ var type = sinon.typeOf(expectation);
+ switch (type) {
+ case "object":
+ if (typeof expectation.test === "function") {
+ m.test = function (actual) {
+ return expectation.test(actual) === true;
+ };
+ m.message = "match(" + sinon.functionName(expectation.test) + ")";
+ return m;
+ }
+ var str = [];
+ for (var key in expectation) {
+ if (expectation.hasOwnProperty(key)) {
+ str.push(key + ": " + expectation[key]);
+ }
+ }
+ m.test = function (actual) {
+ return matchObject(expectation, actual);
+ };
+ m.message = "match(" + str.join(", ") + ")";
+ break;
+ case "number":
+ m.test = function (actual) {
+ // we need type coercion here
+ return expectation == actual; // eslint-disable-line eqeqeq
+ };
+ break;
+ case "string":
+ m.test = function (actual) {
+ if (typeof actual !== "string") {
+ return false;
+ }
+ return actual.indexOf(expectation) !== -1;
+ };
+ m.message = "match(\"" + expectation + "\")";
+ break;
+ case "regexp":
+ m.test = function (actual) {
+ if (typeof actual !== "string") {
+ return false;
+ }
+ return expectation.test(actual);
+ };
+ break;
+ case "function":
+ m.test = expectation;
+ if (message) {
+ m.message = message;
+ } else {
+ m.message = "match(" + sinon.functionName(expectation) + ")";
+ }
+ break;
+ default:
+ m.test = function (actual) {
+ return sinon.deepEqual(expectation, actual);
+ };
+ }
+ if (!m.message) {
+ m.message = "match(" + expectation + ")";
+ }
+ return m;
+ }
+
+ matcher.or = function (m2) {
+ if (!arguments.length) {
+ throw new TypeError("Matcher expected");
+ } else if (!isMatcher(m2)) {
+ m2 = match(m2);
+ }
+ var m1 = this;
+ var or = sinon.create(matcher);
+ or.test = function (actual) {
+ return m1.test(actual) || m2.test(actual);
+ };
+ or.message = m1.message + ".or(" + m2.message + ")";
+ return or;
+ };
+
+ matcher.and = function (m2) {
+ if (!arguments.length) {
+ throw new TypeError("Matcher expected");
+ } else if (!isMatcher(m2)) {
+ m2 = match(m2);
+ }
+ var m1 = this;
+ var and = sinon.create(matcher);
+ and.test = function (actual) {
+ return m1.test(actual) && m2.test(actual);
+ };
+ and.message = m1.message + ".and(" + m2.message + ")";
+ return and;
+ };
+
+ match.isMatcher = isMatcher;
+
+ match.any = match(function () {
+ return true;
+ }, "any");
+
+ match.defined = match(function (actual) {
+ return actual !== null && actual !== undefined;
+ }, "defined");
+
+ match.truthy = match(function (actual) {
+ return !!actual;
+ }, "truthy");
+
+ match.falsy = match(function (actual) {
+ return !actual;
+ }, "falsy");
+
+ match.same = function (expectation) {
+ return match(function (actual) {
+ return expectation === actual;
+ }, "same(" + expectation + ")");
+ };
+
+ match.typeOf = function (type) {
+ assertType(type, "string", "type");
+ return match(function (actual) {
+ return sinon.typeOf(actual) === type;
+ }, "typeOf(\"" + type + "\")");
+ };
+
+ match.instanceOf = function (type) {
+ assertType(type, "function", "type");
+ return match(function (actual) {
+ return actual instanceof type;
+ }, "instanceOf(" + sinon.functionName(type) + ")");
+ };
+
+ function createPropertyMatcher(propertyTest, messagePrefix) {
+ return function (property, value) {
+ assertType(property, "string", "property");
+ var onlyProperty = arguments.length === 1;
+ var message = messagePrefix + "(\"" + property + "\"";
+ if (!onlyProperty) {
+ message += ", " + value;
+ }
+ message += ")";
+ return match(function (actual) {
+ if (actual === undefined || actual === null ||
+ !propertyTest(actual, property)) {
+ return false;
+ }
+ return onlyProperty || sinon.deepEqual(value, actual[property]);
+ }, message);
+ };
+ }
+
+ match.has = createPropertyMatcher(function (actual, property) {
+ if (typeof actual === "object") {
+ return property in actual;
+ }
+ return actual[property] !== undefined;
+ }, "has");
+
+ match.hasOwn = createPropertyMatcher(function (actual, property) {
+ return actual.hasOwnProperty(property);
+ }, "hasOwn");
+
+ match.bool = match.typeOf("boolean");
+ match.number = match.typeOf("number");
+ match.string = match.typeOf("string");
+ match.object = match.typeOf("object");
+ match.func = match.typeOf("function");
+ match.array = match.typeOf("array");
+ match.regexp = match.typeOf("regexp");
+ match.date = match.typeOf("date");
+
+ sinon.match = match;
+ return match;
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ function loadDependencies(require, exports, module) {
+ var sinon = require("./util/core");
+ require("./typeOf");
+ module.exports = makeApi(sinon);
+ }
+
+ if (isAMD) {
+ define(loadDependencies);
+ return;
+ }
+
+ if (isNode) {
+ loadDependencies(require, module.exports, module);
+ return;
+ }
+
+ if (sinonGlobal) {
+ makeApi(sinonGlobal);
+ }
+}(
+ typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ */
+/**
+ * Format functions
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2014 Christian Johansen
+ */
+(function (sinonGlobal, formatio) {
+
+ function makeApi(sinon) {
+ function valueFormatter(value) {
+ return "" + value;
+ }
+
+ function getFormatioFormatter() {
+ var formatter = formatio.configure({
+ quoteStrings: false,
+ limitChildrenCount: 250
+ });
+
+ function format() {
+ return formatter.ascii.apply(formatter, arguments);
+ }
+
+ return format;
+ }
+
+ function getNodeFormatter() {
+ try {
+ var util = require("util");
+ } catch (e) {
+ /* Node, but no util module - would be very old, but better safe than sorry */
+ }
+
+ function format(v) {
+ var isObjectWithNativeToString = typeof v === "object" && v.toString === Object.prototype.toString;
+ return isObjectWithNativeToString ? util.inspect(v) : v;
+ }
+
+ return util ? format : valueFormatter;
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var formatter;
+
+ if (isNode) {
+ try {
+ formatio = require("formatio");
+ }
+ catch (e) {} // eslint-disable-line no-empty
+ }
+
+ if (formatio) {
+ formatter = getFormatioFormatter();
+ } else if (isNode) {
+ formatter = getNodeFormatter();
+ } else {
+ formatter = valueFormatter;
+ }
+
+ sinon.format = formatter;
+ return sinon.format;
+ }
+
+ function loadDependencies(require, exports, module) {
+ var sinon = require("./util/core");
+ module.exports = makeApi(sinon);
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ if (isAMD) {
+ define(loadDependencies);
+ return;
+ }
+
+ if (isNode) {
+ loadDependencies(require, module.exports, module);
+ return;
+ }
+
+ if (sinonGlobal) {
+ makeApi(sinonGlobal);
+ }
+}(
+ typeof sinon === "object" && sinon, // eslint-disable-line no-undef
+ typeof formatio === "object" && formatio // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ * @depend match.js
+ * @depend format.js
+ */
+/**
+ * Spy calls
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @author Maximilian Antoni (mail@maxantoni.de)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ * Copyright (c) 2013 Maximilian Antoni
+ */
+(function (sinonGlobal) {
+
+ var slice = Array.prototype.slice;
+
+ function makeApi(sinon) {
+ function throwYieldError(proxy, text, args) {
+ var msg = sinon.functionName(proxy) + text;
+ if (args.length) {
+ msg += " Received [" + slice.call(args).join(", ") + "]";
+ }
+ throw new Error(msg);
+ }
+
+ var callProto = {
+ calledOn: function calledOn(thisValue) {
+ if (sinon.match && sinon.match.isMatcher(thisValue)) {
+ return thisValue.test(this.thisValue);
+ }
+ return this.thisValue === thisValue;
+ },
+
+ calledWith: function calledWith() {
+ var l = arguments.length;
+ if (l > this.args.length) {
+ return false;
+ }
+ for (var i = 0; i < l; i += 1) {
+ if (!sinon.deepEqual(arguments[i], this.args[i])) {
+ return false;
+ }
+ }
+
+ return true;
+ },
+
+ calledWithMatch: function calledWithMatch() {
+ var l = arguments.length;
+ if (l > this.args.length) {
+ return false;
+ }
+ for (var i = 0; i < l; i += 1) {
+ var actual = this.args[i];
+ var expectation = arguments[i];
+ if (!sinon.match || !sinon.match(expectation).test(actual)) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ calledWithExactly: function calledWithExactly() {
+ return arguments.length === this.args.length &&
+ this.calledWith.apply(this, arguments);
+ },
+
+ notCalledWith: function notCalledWith() {
+ return !this.calledWith.apply(this, arguments);
+ },
+
+ notCalledWithMatch: function notCalledWithMatch() {
+ return !this.calledWithMatch.apply(this, arguments);
+ },
+
+ returned: function returned(value) {
+ return sinon.deepEqual(value, this.returnValue);
+ },
+
+ threw: function threw(error) {
+ if (typeof error === "undefined" || !this.exception) {
+ return !!this.exception;
+ }
+
+ return this.exception === error || this.exception.name === error;
+ },
+
+ calledWithNew: function calledWithNew() {
+ return this.proxy.prototype && this.thisValue instanceof this.proxy;
+ },
+
+ calledBefore: function (other) {
+ return this.callId < other.callId;
+ },
+
+ calledAfter: function (other) {
+ return this.callId > other.callId;
+ },
+
+ callArg: function (pos) {
+ this.args[pos]();
+ },
+
+ callArgOn: function (pos, thisValue) {
+ this.args[pos].apply(thisValue);
+ },
+
+ callArgWith: function (pos) {
+ this.callArgOnWith.apply(this, [pos, null].concat(slice.call(arguments, 1)));
+ },
+
+ callArgOnWith: function (pos, thisValue) {
+ var args = slice.call(arguments, 2);
+ this.args[pos].apply(thisValue, args);
+ },
+
+ "yield": function () {
+ this.yieldOn.apply(this, [null].concat(slice.call(arguments, 0)));
+ },
+
+ yieldOn: function (thisValue) {
+ var args = this.args;
+ for (var i = 0, l = args.length; i < l; ++i) {
+ if (typeof args[i] === "function") {
+ args[i].apply(thisValue, slice.call(arguments, 1));
+ return;
+ }
+ }
+ throwYieldError(this.proxy, " cannot yield since no callback was passed.", args);
+ },
+
+ yieldTo: function (prop) {
+ this.yieldToOn.apply(this, [prop, null].concat(slice.call(arguments, 1)));
+ },
+
+ yieldToOn: function (prop, thisValue) {
+ var args = this.args;
+ for (var i = 0, l = args.length; i < l; ++i) {
+ if (args[i] && typeof args[i][prop] === "function") {
+ args[i][prop].apply(thisValue, slice.call(arguments, 2));
+ return;
+ }
+ }
+ throwYieldError(this.proxy, " cannot yield to '" + prop +
+ "' since no callback was passed.", args);
+ },
+
+ getStackFrames: function () {
+ // Omit the error message and the two top stack frames in sinon itself:
+ return this.stack && this.stack.split("\n").slice(3);
+ },
+
+ toString: function () {
+ var callStr = this.proxy.toString() + "(";
+ var args = [];
+
+ for (var i = 0, l = this.args.length; i < l; ++i) {
+ args.push(sinon.format(this.args[i]));
+ }
+
+ callStr = callStr + args.join(", ") + ")";
+
+ if (typeof this.returnValue !== "undefined") {
+ callStr += " => " + sinon.format(this.returnValue);
+ }
+
+ if (this.exception) {
+ callStr += " !" + this.exception.name;
+
+ if (this.exception.message) {
+ callStr += "(" + this.exception.message + ")";
+ }
+ }
+ if (this.stack) {
+ callStr += this.getStackFrames()[0].replace(/^\s*(?:at\s+|@)?/, " at ");
+
+ }
+
+ return callStr;
+ }
+ };
+
+ callProto.invokeCallback = callProto.yield;
+
+ function createSpyCall(spy, thisValue, args, returnValue, exception, id, stack) {
+ if (typeof id !== "number") {
+ throw new TypeError("Call id is not a number");
+ }
+ var proxyCall = sinon.create(callProto);
+ proxyCall.proxy = spy;
+ proxyCall.thisValue = thisValue;
+ proxyCall.args = args;
+ proxyCall.returnValue = returnValue;
+ proxyCall.exception = exception;
+ proxyCall.callId = id;
+ proxyCall.stack = stack;
+
+ return proxyCall;
+ }
+ createSpyCall.toString = callProto.toString; // used by mocks
+
+ sinon.spyCall = createSpyCall;
+ return createSpyCall;
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ function loadDependencies(require, exports, module) {
+ var sinon = require("./util/core");
+ require("./match");
+ require("./format");
+ module.exports = makeApi(sinon);
+ }
+
+ if (isAMD) {
+ define(loadDependencies);
+ return;
+ }
+
+ if (isNode) {
+ loadDependencies(require, module.exports, module);
+ return;
+ }
+
+ if (sinonGlobal) {
+ makeApi(sinonGlobal);
+ }
+}(
+ typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend times_in_words.js
+ * @depend util/core.js
+ * @depend extend.js
+ * @depend call.js
+ * @depend format.js
+ */
+/**
+ * Spy functions
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal) {
+
+ function makeApi(sinon) {
+ var push = Array.prototype.push;
+ var slice = Array.prototype.slice;
+ var callId = 0;
+
+ function spy(object, property, types) {
+ if (!property && typeof object === "function") {
+ return spy.create(object);
+ }
+
+ if (!object && !property) {
+ return spy.create(function () { });
+ }
+
+ if (types) {
+ var methodDesc = sinon.getPropertyDescriptor(object, property);
+ for (var i = 0; i < types.length; i++) {
+ methodDesc[types[i]] = spy.create(methodDesc[types[i]]);
+ }
+ return sinon.wrapMethod(object, property, methodDesc);
+ }
+
+ return sinon.wrapMethod(object, property, spy.create(object[property]));
+ }
+
+ function matchingFake(fakes, args, strict) {
+ if (!fakes) {
+ return undefined;
+ }
+
+ for (var i = 0, l = fakes.length; i < l; i++) {
+ if (fakes[i].matches(args, strict)) {
+ return fakes[i];
+ }
+ }
+ }
+
+ function incrementCallCount() {
+ this.called = true;
+ this.callCount += 1;
+ this.notCalled = false;
+ this.calledOnce = this.callCount === 1;
+ this.calledTwice = this.callCount === 2;
+ this.calledThrice = this.callCount === 3;
+ }
+
+ function createCallProperties() {
+ this.firstCall = this.getCall(0);
+ this.secondCall = this.getCall(1);
+ this.thirdCall = this.getCall(2);
+ this.lastCall = this.getCall(this.callCount - 1);
+ }
+
+ var vars = "a,b,c,d,e,f,g,h,i,j,k,l";
+ function createProxy(func, proxyLength) {
+ // Retain the function length:
+ var p;
+ if (proxyLength) {
+ eval("p = (function proxy(" + vars.substring(0, proxyLength * 2 - 1) + // eslint-disable-line no-eval
+ ") { return p.invoke(func, this, slice.call(arguments)); });");
+ } else {
+ p = function proxy() {
+ return p.invoke(func, this, slice.call(arguments));
+ };
+ }
+ p.isSinonProxy = true;
+ return p;
+ }
+
+ var uuid = 0;
+
+ // Public API
+ var spyApi = {
+ reset: function () {
+ if (this.invoking) {
+ var err = new Error("Cannot reset Sinon function while invoking it. " +
+ "Move the call to .reset outside of the callback.");
+ err.name = "InvalidResetException";
+ throw err;
+ }
+
+ this.called = false;
+ this.notCalled = true;
+ this.calledOnce = false;
+ this.calledTwice = false;
+ this.calledThrice = false;
+ this.callCount = 0;
+ this.firstCall = null;
+ this.secondCall = null;
+ this.thirdCall = null;
+ this.lastCall = null;
+ this.args = [];
+ this.returnValues = [];
+ this.thisValues = [];
+ this.exceptions = [];
+ this.callIds = [];
+ this.stacks = [];
+ if (this.fakes) {
+ for (var i = 0; i < this.fakes.length; i++) {
+ this.fakes[i].reset();
+ }
+ }
+
+ return this;
+ },
+
+ create: function create(func, spyLength) {
+ var name;
+
+ if (typeof func !== "function") {
+ func = function () { };
+ } else {
+ name = sinon.functionName(func);
+ }
+
+ if (!spyLength) {
+ spyLength = func.length;
+ }
+
+ var proxy = createProxy(func, spyLength);
+
+ sinon.extend(proxy, spy);
+ delete proxy.create;
+ sinon.extend(proxy, func);
+
+ proxy.reset();
+ proxy.prototype = func.prototype;
+ proxy.displayName = name || "spy";
+ proxy.toString = sinon.functionToString;
+ proxy.instantiateFake = sinon.spy.create;
+ proxy.id = "spy#" + uuid++;
+
+ return proxy;
+ },
+
+ invoke: function invoke(func, thisValue, args) {
+ var matching = matchingFake(this.fakes, args);
+ var exception, returnValue;
+
+ incrementCallCount.call(this);
+ push.call(this.thisValues, thisValue);
+ push.call(this.args, args);
+ push.call(this.callIds, callId++);
+
+ // Make call properties available from within the spied function:
+ createCallProperties.call(this);
+
+ try {
+ this.invoking = true;
+
+ if (matching) {
+ returnValue = matching.invoke(func, thisValue, args);
+ } else {
+ returnValue = (this.func || func).apply(thisValue, args);
+ }
+
+ var thisCall = this.getCall(this.callCount - 1);
+ if (thisCall.calledWithNew() && typeof returnValue !== "object") {
+ returnValue = thisValue;
+ }
+ } catch (e) {
+ exception = e;
+ } finally {
+ delete this.invoking;
+ }
+
+ push.call(this.exceptions, exception);
+ push.call(this.returnValues, returnValue);
+ push.call(this.stacks, new Error().stack);
+
+ // Make return value and exception available in the calls:
+ createCallProperties.call(this);
+
+ if (exception !== undefined) {
+ throw exception;
+ }
+
+ return returnValue;
+ },
+
+ named: function named(name) {
+ this.displayName = name;
+ return this;
+ },
+
+ getCall: function getCall(i) {
+ if (i < 0 || i >= this.callCount) {
+ return null;
+ }
+
+ return sinon.spyCall(this, this.thisValues[i], this.args[i],
+ this.returnValues[i], this.exceptions[i],
+ this.callIds[i], this.stacks[i]);
+ },
+
+ getCalls: function () {
+ var calls = [];
+ var i;
+
+ for (i = 0; i < this.callCount; i++) {
+ calls.push(this.getCall(i));
+ }
+
+ return calls;
+ },
+
+ calledBefore: function calledBefore(spyFn) {
+ if (!this.called) {
+ return false;
+ }
+
+ if (!spyFn.called) {
+ return true;
+ }
+
+ return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1];
+ },
+
+ calledAfter: function calledAfter(spyFn) {
+ if (!this.called || !spyFn.called) {
+ return false;
+ }
+
+ return this.callIds[this.callCount - 1] > spyFn.callIds[spyFn.callCount - 1];
+ },
+
+ withArgs: function () {
+ var args = slice.call(arguments);
+
+ if (this.fakes) {
+ var match = matchingFake(this.fakes, args, true);
+
+ if (match) {
+ return match;
+ }
+ } else {
+ this.fakes = [];
+ }
+
+ var original = this;
+ var fake = this.instantiateFake();
+ fake.matchingAguments = args;
+ fake.parent = this;
+ push.call(this.fakes, fake);
+
+ fake.withArgs = function () {
+ return original.withArgs.apply(original, arguments);
+ };
+
+ for (var i = 0; i < this.args.length; i++) {
+ if (fake.matches(this.args[i])) {
+ incrementCallCount.call(fake);
+ push.call(fake.thisValues, this.thisValues[i]);
+ push.call(fake.args, this.args[i]);
+ push.call(fake.returnValues, this.returnValues[i]);
+ push.call(fake.exceptions, this.exceptions[i]);
+ push.call(fake.callIds, this.callIds[i]);
+ }
+ }
+ createCallProperties.call(fake);
+
+ return fake;
+ },
+
+ matches: function (args, strict) {
+ var margs = this.matchingAguments;
+
+ if (margs.length <= args.length &&
+ sinon.deepEqual(margs, args.slice(0, margs.length))) {
+ return !strict || margs.length === args.length;
+ }
+ },
+
+ printf: function (format) {
+ var spyInstance = this;
+ var args = slice.call(arguments, 1);
+ var formatter;
+
+ return (format || "").replace(/%(.)/g, function (match, specifyer) {
+ formatter = spyApi.formatters[specifyer];
+
+ if (typeof formatter === "function") {
+ return formatter.call(null, spyInstance, args);
+ } else if (!isNaN(parseInt(specifyer, 10))) {
+ return sinon.format(args[specifyer - 1]);
+ }
+
+ return "%" + specifyer;
+ });
+ }
+ };
+
+ function delegateToCalls(method, matchAny, actual, notCalled) {
+ spyApi[method] = function () {
+ if (!this.called) {
+ if (notCalled) {
+ return notCalled.apply(this, arguments);
+ }
+ return false;
+ }
+
+ var currentCall;
+ var matches = 0;
+
+ for (var i = 0, l = this.callCount; i < l; i += 1) {
+ currentCall = this.getCall(i);
+
+ if (currentCall[actual || method].apply(currentCall, arguments)) {
+ matches += 1;
+
+ if (matchAny) {
+ return true;
+ }
+ }
+ }
+
+ return matches === this.callCount;
+ };
+ }
+
+ delegateToCalls("calledOn", true);
+ delegateToCalls("alwaysCalledOn", false, "calledOn");
+ delegateToCalls("calledWith", true);
+ delegateToCalls("calledWithMatch", true);
+ delegateToCalls("alwaysCalledWith", false, "calledWith");
+ delegateToCalls("alwaysCalledWithMatch", false, "calledWithMatch");
+ delegateToCalls("calledWithExactly", true);
+ delegateToCalls("alwaysCalledWithExactly", false, "calledWithExactly");
+ delegateToCalls("neverCalledWith", false, "notCalledWith", function () {
+ return true;
+ });
+ delegateToCalls("neverCalledWithMatch", false, "notCalledWithMatch", function () {
+ return true;
+ });
+ delegateToCalls("threw", true);
+ delegateToCalls("alwaysThrew", false, "threw");
+ delegateToCalls("returned", true);
+ delegateToCalls("alwaysReturned", false, "returned");
+ delegateToCalls("calledWithNew", true);
+ delegateToCalls("alwaysCalledWithNew", false, "calledWithNew");
+ delegateToCalls("callArg", false, "callArgWith", function () {
+ throw new Error(this.toString() + " cannot call arg since it was not yet invoked.");
+ });
+ spyApi.callArgWith = spyApi.callArg;
+ delegateToCalls("callArgOn", false, "callArgOnWith", function () {
+ throw new Error(this.toString() + " cannot call arg since it was not yet invoked.");
+ });
+ spyApi.callArgOnWith = spyApi.callArgOn;
+ delegateToCalls("yield", false, "yield", function () {
+ throw new Error(this.toString() + " cannot yield since it was not yet invoked.");
+ });
+ // "invokeCallback" is an alias for "yield" since "yield" is invalid in strict mode.
+ spyApi.invokeCallback = spyApi.yield;
+ delegateToCalls("yieldOn", false, "yieldOn", function () {
+ throw new Error(this.toString() + " cannot yield since it was not yet invoked.");
+ });
+ delegateToCalls("yieldTo", false, "yieldTo", function (property) {
+ throw new Error(this.toString() + " cannot yield to '" + property +
+ "' since it was not yet invoked.");
+ });
+ delegateToCalls("yieldToOn", false, "yieldToOn", function (property) {
+ throw new Error(this.toString() + " cannot yield to '" + property +
+ "' since it was not yet invoked.");
+ });
+
+ spyApi.formatters = {
+ c: function (spyInstance) {
+ return sinon.timesInWords(spyInstance.callCount);
+ },
+
+ n: function (spyInstance) {
+ return spyInstance.toString();
+ },
+
+ C: function (spyInstance) {
+ var calls = [];
+
+ for (var i = 0, l = spyInstance.callCount; i < l; ++i) {
+ var stringifiedCall = " " + spyInstance.getCall(i).toString();
+ if (/\n/.test(calls[i - 1])) {
+ stringifiedCall = "\n" + stringifiedCall;
+ }
+ push.call(calls, stringifiedCall);
+ }
+
+ return calls.length > 0 ? "\n" + calls.join("\n") : "";
+ },
+
+ t: function (spyInstance) {
+ var objects = [];
+
+ for (var i = 0, l = spyInstance.callCount; i < l; ++i) {
+ push.call(objects, sinon.format(spyInstance.thisValues[i]));
+ }
+
+ return objects.join(", ");
+ },
+
+ "*": function (spyInstance, args) {
+ var formatted = [];
+
+ for (var i = 0, l = args.length; i < l; ++i) {
+ push.call(formatted, sinon.format(args[i]));
+ }
+
+ return formatted.join(", ");
+ }
+ };
+
+ sinon.extend(spy, spyApi);
+
+ spy.spyCall = sinon.spyCall;
+ sinon.spy = spy;
+
+ return spy;
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ function loadDependencies(require, exports, module) {
+ var core = require("./util/core");
+ require("./call");
+ require("./extend");
+ require("./times_in_words");
+ require("./format");
+ module.exports = makeApi(core);
+ }
+
+ if (isAMD) {
+ define(loadDependencies);
+ return;
+ }
+
+ if (isNode) {
+ loadDependencies(require, module.exports, module);
+ return;
+ }
+
+ if (sinonGlobal) {
+ makeApi(sinonGlobal);
+ }
+}(
+ typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ * @depend extend.js
+ */
+/**
+ * Stub behavior
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @author Tim Fischbach (mail@timfischbach.de)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal) {
+
+ var slice = Array.prototype.slice;
+ var join = Array.prototype.join;
+ var useLeftMostCallback = -1;
+ var useRightMostCallback = -2;
+
+ var nextTick = (function () {
+ if (typeof process === "object" && typeof process.nextTick === "function") {
+ return process.nextTick;
+ }
+
+ if (typeof setImmediate === "function") {
+ return setImmediate;
+ }
+
+ return function (callback) {
+ setTimeout(callback, 0);
+ };
+ })();
+
+ function throwsException(error, message) {
+ if (typeof error === "string") {
+ this.exception = new Error(message || "");
+ this.exception.name = error;
+ } else if (!error) {
+ this.exception = new Error("Error");
+ } else {
+ this.exception = error;
+ }
+
+ return this;
+ }
+
+ function getCallback(behavior, args) {
+ var callArgAt = behavior.callArgAt;
+
+ if (callArgAt >= 0) {
+ return args[callArgAt];
+ }
+
+ var argumentList;
+
+ if (callArgAt === useLeftMostCallback) {
+ argumentList = args;
+ }
+
+ if (callArgAt === useRightMostCallback) {
+ argumentList = slice.call(args).reverse();
+ }
+
+ var callArgProp = behavior.callArgProp;
+
+ for (var i = 0, l = argumentList.length; i < l; ++i) {
+ if (!callArgProp && typeof argumentList[i] === "function") {
+ return argumentList[i];
+ }
+
+ if (callArgProp && argumentList[i] &&
+ typeof argumentList[i][callArgProp] === "function") {
+ return argumentList[i][callArgProp];
+ }
+ }
+
+ return null;
+ }
+
+ function makeApi(sinon) {
+ function getCallbackError(behavior, func, args) {
+ if (behavior.callArgAt < 0) {
+ var msg;
+
+ if (behavior.callArgProp) {
+ msg = sinon.functionName(behavior.stub) +
+ " expected to yield to '" + behavior.callArgProp +
+ "', but no object with such a property was passed.";
+ } else {
+ msg = sinon.functionName(behavior.stub) +
+ " expected to yield, but no callback was passed.";
+ }
+
+ if (args.length > 0) {
+ msg += " Received [" + join.call(args, ", ") + "]";
+ }
+
+ return msg;
+ }
+
+ return "argument at index " + behavior.callArgAt + " is not a function: " + func;
+ }
+
+ function callCallback(behavior, args) {
+ if (typeof behavior.callArgAt === "number") {
+ var func = getCallback(behavior, args);
+
+ if (typeof func !== "function") {
+ throw new TypeError(getCallbackError(behavior, func, args));
+ }
+
+ if (behavior.callbackAsync) {
+ nextTick(function () {
+ func.apply(behavior.callbackContext, behavior.callbackArguments);
+ });
+ } else {
+ func.apply(behavior.callbackContext, behavior.callbackArguments);
+ }
+ }
+ }
+
+ var proto = {
+ create: function create(stub) {
+ var behavior = sinon.extend({}, sinon.behavior);
+ delete behavior.create;
+ behavior.stub = stub;
+
+ return behavior;
+ },
+
+ isPresent: function isPresent() {
+ return (typeof this.callArgAt === "number" ||
+ this.exception ||
+ typeof this.returnArgAt === "number" ||
+ this.returnThis ||
+ this.returnValueDefined);
+ },
+
+ invoke: function invoke(context, args) {
+ callCallback(this, args);
+
+ if (this.exception) {
+ throw this.exception;
+ } else if (typeof this.returnArgAt === "number") {
+ return args[this.returnArgAt];
+ } else if (this.returnThis) {
+ return context;
+ }
+
+ return this.returnValue;
+ },
+
+ onCall: function onCall(index) {
+ return this.stub.onCall(index);
+ },
+
+ onFirstCall: function onFirstCall() {
+ return this.stub.onFirstCall();
+ },
+
+ onSecondCall: function onSecondCall() {
+ return this.stub.onSecondCall();
+ },
+
+ onThirdCall: function onThirdCall() {
+ return this.stub.onThirdCall();
+ },
+
+ withArgs: function withArgs(/* arguments */) {
+ throw new Error(
+ "Defining a stub by invoking \"stub.onCall(...).withArgs(...)\" " +
+ "is not supported. Use \"stub.withArgs(...).onCall(...)\" " +
+ "to define sequential behavior for calls with certain arguments."
+ );
+ },
+
+ callsArg: function callsArg(pos) {
+ if (typeof pos !== "number") {
+ throw new TypeError("argument index is not number");
+ }
+
+ this.callArgAt = pos;
+ this.callbackArguments = [];
+ this.callbackContext = undefined;
+ this.callArgProp = undefined;
+ this.callbackAsync = false;
+
+ return this;
+ },
+
+ callsArgOn: function callsArgOn(pos, context) {
+ if (typeof pos !== "number") {
+ throw new TypeError("argument index is not number");
+ }
+ if (typeof context !== "object") {
+ throw new TypeError("argument context is not an object");
+ }
+
+ this.callArgAt = pos;
+ this.callbackArguments = [];
+ this.callbackContext = context;
+ this.callArgProp = undefined;
+ this.callbackAsync = false;
+
+ return this;
+ },
+
+ callsArgWith: function callsArgWith(pos) {
+ if (typeof pos !== "number") {
+ throw new TypeError("argument index is not number");
+ }
+
+ this.callArgAt = pos;
+ this.callbackArguments = slice.call(arguments, 1);
+ this.callbackContext = undefined;
+ this.callArgProp = undefined;
+ this.callbackAsync = false;
+
+ return this;
+ },
+
+ callsArgOnWith: function callsArgWith(pos, context) {
+ if (typeof pos !== "number") {
+ throw new TypeError("argument index is not number");
+ }
+ if (typeof context !== "object") {
+ throw new TypeError("argument context is not an object");
+ }
+
+ this.callArgAt = pos;
+ this.callbackArguments = slice.call(arguments, 2);
+ this.callbackContext = context;
+ this.callArgProp = undefined;
+ this.callbackAsync = false;
+
+ return this;
+ },
+
+ yields: function () {
+ this.callArgAt = useLeftMostCallback;
+ this.callbackArguments = slice.call(arguments, 0);
+ this.callbackContext = undefined;
+ this.callArgProp = undefined;
+ this.callbackAsync = false;
+
+ return this;
+ },
+
+ yieldsRight: function () {
+ this.callArgAt = useRightMostCallback;
+ this.callbackArguments = slice.call(arguments, 0);
+ this.callbackContext = undefined;
+ this.callArgProp = undefined;
+ this.callbackAsync = false;
+
+ return this;
+ },
+
+ yieldsOn: function (context) {
+ if (typeof context !== "object") {
+ throw new TypeError("argument context is not an object");
+ }
+
+ this.callArgAt = useLeftMostCallback;
+ this.callbackArguments = slice.call(arguments, 1);
+ this.callbackContext = context;
+ this.callArgProp = undefined;
+ this.callbackAsync = false;
+
+ return this;
+ },
+
+ yieldsTo: function (prop) {
+ this.callArgAt = useLeftMostCallback;
+ this.callbackArguments = slice.call(arguments, 1);
+ this.callbackContext = undefined;
+ this.callArgProp = prop;
+ this.callbackAsync = false;
+
+ return this;
+ },
+
+ yieldsToOn: function (prop, context) {
+ if (typeof context !== "object") {
+ throw new TypeError("argument context is not an object");
+ }
+
+ this.callArgAt = useLeftMostCallback;
+ this.callbackArguments = slice.call(arguments, 2);
+ this.callbackContext = context;
+ this.callArgProp = prop;
+ this.callbackAsync = false;
+
+ return this;
+ },
+
+ throws: throwsException,
+ throwsException: throwsException,
+
+ returns: function returns(value) {
+ this.returnValue = value;
+ this.returnValueDefined = true;
+ this.exception = undefined;
+
+ return this;
+ },
+
+ returnsArg: function returnsArg(pos) {
+ if (typeof pos !== "number") {
+ throw new TypeError("argument index is not number");
+ }
+
+ this.returnArgAt = pos;
+
+ return this;
+ },
+
+ returnsThis: function returnsThis() {
+ this.returnThis = true;
+
+ return this;
+ }
+ };
+
+ function createAsyncVersion(syncFnName) {
+ return function () {
+ var result = this[syncFnName].apply(this, arguments);
+ this.callbackAsync = true;
+ return result;
+ };
+ }
+
+ // create asynchronous versions of callsArg* and yields* methods
+ for (var method in proto) {
+ // need to avoid creating anotherasync versions of the newly added async methods
+ if (proto.hasOwnProperty(method) && method.match(/^(callsArg|yields)/) && !method.match(/Async/)) {
+ proto[method + "Async"] = createAsyncVersion(method);
+ }
+ }
+
+ sinon.behavior = proto;
+ return proto;
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ function loadDependencies(require, exports, module) {
+ var sinon = require("./util/core");
+ require("./extend");
+ module.exports = makeApi(sinon);
+ }
+
+ if (isAMD) {
+ define(loadDependencies);
+ return;
+ }
+
+ if (isNode) {
+ loadDependencies(require, module.exports, module);
+ return;
+ }
+
+ if (sinonGlobal) {
+ makeApi(sinonGlobal);
+ }
+}(
+ typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ */
+(function (sinonGlobal) {
+
+ function makeApi(sinon) {
+ function walkInternal(obj, iterator, context, originalObj) {
+ var proto, prop;
+
+ if (typeof Object.getOwnPropertyNames !== "function") {
+ // We explicitly want to enumerate through all of the prototype's properties
+ // in this case, therefore we deliberately leave out an own property check.
+ /* eslint-disable guard-for-in */
+ for (prop in obj) {
+ iterator.call(context, obj[prop], prop, obj);
+ }
+ /* eslint-enable guard-for-in */
+
+ return;
+ }
+
+ Object.getOwnPropertyNames(obj).forEach(function (k) {
+ var target = typeof Object.getOwnPropertyDescriptor(obj, k).get === "function" ?
+ originalObj : obj;
+ iterator.call(context, target[k], k, target);
+ });
+
+ proto = Object.getPrototypeOf(obj);
+ if (proto) {
+ walkInternal(proto, iterator, context, originalObj);
+ }
+ }
+
+ /* Public: walks the prototype chain of an object and iterates over every own property
+ * name encountered. The iterator is called in the same fashion that Array.prototype.forEach
+ * works, where it is passed the value, key, and own object as the 1st, 2nd, and 3rd positional
+ * argument, respectively. In cases where Object.getOwnPropertyNames is not available, walk will
+ * default to using a simple for..in loop.
+ *
+ * obj - The object to walk the prototype chain for.
+ * iterator - The function to be called on each pass of the walk.
+ * context - (Optional) When given, the iterator will be called with this object as the receiver.
+ */
+ function walk(obj, iterator, context) {
+ return walkInternal(obj, iterator, context, obj);
+ }
+
+ sinon.walk = walk;
+ return sinon.walk;
+ }
+
+ function loadDependencies(require, exports, module) {
+ var sinon = require("./util/core");
+ module.exports = makeApi(sinon);
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ if (isAMD) {
+ define(loadDependencies);
+ return;
+ }
+
+ if (isNode) {
+ loadDependencies(require, module.exports, module);
+ return;
+ }
+
+ if (sinonGlobal) {
+ makeApi(sinonGlobal);
+ }
+}(
+ typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ * @depend extend.js
+ * @depend spy.js
+ * @depend behavior.js
+ * @depend walk.js
+ */
+/**
+ * Stub functions
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal) {
+
+ function makeApi(sinon) {
+ function stub(object, property, func) {
+ if (!!func && typeof func !== "function" && typeof func !== "object") {
+ throw new TypeError("Custom stub should be a function or a property descriptor");
+ }
+
+ var wrapper;
+
+ if (func) {
+ if (typeof func === "function") {
+ wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func;
+ } else {
+ wrapper = func;
+ if (sinon.spy && sinon.spy.create) {
+ var types = sinon.objectKeys(wrapper);
+ for (var i = 0; i < types.length; i++) {
+ wrapper[types[i]] = sinon.spy.create(wrapper[types[i]]);
+ }
+ }
+ }
+ } else {
+ var stubLength = 0;
+ if (typeof object === "object" && typeof object[property] === "function") {
+ stubLength = object[property].length;
+ }
+ wrapper = stub.create(stubLength);
+ }
+
+ if (!object && typeof property === "undefined") {
+ return sinon.stub.create();
+ }
+
+ if (typeof property === "undefined" && typeof object === "object") {
+ sinon.walk(object || {}, function (value, prop, propOwner) {
+ // we don't want to stub things like toString(), valueOf(), etc. so we only stub if the object
+ // is not Object.prototype
+ if (
+ propOwner !== Object.prototype &&
+ prop !== "constructor" &&
+ typeof sinon.getPropertyDescriptor(propOwner, prop).value === "function"
+ ) {
+ stub(object, prop);
+ }
+ });
+
+ return object;
+ }
+
+ return sinon.wrapMethod(object, property, wrapper);
+ }
+
+
+ /*eslint-disable no-use-before-define*/
+ function getParentBehaviour(stubInstance) {
+ return (stubInstance.parent && getCurrentBehavior(stubInstance.parent));
+ }
+
+ function getDefaultBehavior(stubInstance) {
+ return stubInstance.defaultBehavior ||
+ getParentBehaviour(stubInstance) ||
+ sinon.behavior.create(stubInstance);
+ }
+
+ function getCurrentBehavior(stubInstance) {
+ var behavior = stubInstance.behaviors[stubInstance.callCount - 1];
+ return behavior && behavior.isPresent() ? behavior : getDefaultBehavior(stubInstance);
+ }
+ /*eslint-enable no-use-before-define*/
+
+ var uuid = 0;
+
+ var proto = {
+ create: function create(stubLength) {
+ var functionStub = function () {
+ return getCurrentBehavior(functionStub).invoke(this, arguments);
+ };
+
+ functionStub.id = "stub#" + uuid++;
+ var orig = functionStub;
+ functionStub = sinon.spy.create(functionStub, stubLength);
+ functionStub.func = orig;
+
+ sinon.extend(functionStub, stub);
+ functionStub.instantiateFake = sinon.stub.create;
+ functionStub.displayName = "stub";
+ functionStub.toString = sinon.functionToString;
+
+ functionStub.defaultBehavior = null;
+ functionStub.behaviors = [];
+
+ return functionStub;
+ },
+
+ resetBehavior: function () {
+ var i;
+
+ this.defaultBehavior = null;
+ this.behaviors = [];
+
+ delete this.returnValue;
+ delete this.returnArgAt;
+ this.returnThis = false;
+
+ if (this.fakes) {
+ for (i = 0; i < this.fakes.length; i++) {
+ this.fakes[i].resetBehavior();
+ }
+ }
+ },
+
+ onCall: function onCall(index) {
+ if (!this.behaviors[index]) {
+ this.behaviors[index] = sinon.behavior.create(this);
+ }
+
+ return this.behaviors[index];
+ },
+
+ onFirstCall: function onFirstCall() {
+ return this.onCall(0);
+ },
+
+ onSecondCall: function onSecondCall() {
+ return this.onCall(1);
+ },
+
+ onThirdCall: function onThirdCall() {
+ return this.onCall(2);
+ }
+ };
+
+ function createBehavior(behaviorMethod) {
+ return function () {
+ this.defaultBehavior = this.defaultBehavior || sinon.behavior.create(this);
+ this.defaultBehavior[behaviorMethod].apply(this.defaultBehavior, arguments);
+ return this;
+ };
+ }
+
+ for (var method in sinon.behavior) {
+ if (sinon.behavior.hasOwnProperty(method) &&
+ !proto.hasOwnProperty(method) &&
+ method !== "create" &&
+ method !== "withArgs" &&
+ method !== "invoke") {
+ proto[method] = createBehavior(method);
+ }
+ }
+
+ sinon.extend(stub, proto);
+ sinon.stub = stub;
+
+ return stub;
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ function loadDependencies(require, exports, module) {
+ var core = require("./util/core");
+ require("./behavior");
+ require("./spy");
+ require("./extend");
+ module.exports = makeApi(core);
+ }
+
+ if (isAMD) {
+ define(loadDependencies);
+ return;
+ }
+
+ if (isNode) {
+ loadDependencies(require, module.exports, module);
+ return;
+ }
+
+ if (sinonGlobal) {
+ makeApi(sinonGlobal);
+ }
+}(
+ typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend times_in_words.js
+ * @depend util/core.js
+ * @depend call.js
+ * @depend extend.js
+ * @depend match.js
+ * @depend spy.js
+ * @depend stub.js
+ * @depend format.js
+ */
+/**
+ * Mock functions.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal) {
+
+ function makeApi(sinon) {
+ var push = [].push;
+ var match = sinon.match;
+
+ function mock(object) {
+ // if (typeof console !== undefined && console.warn) {
+ // console.warn("mock will be removed from Sinon.JS v2.0");
+ // }
+
+ if (!object) {
+ return sinon.expectation.create("Anonymous mock");
+ }
+
+ return mock.create(object);
+ }
+
+ function each(collection, callback) {
+ if (!collection) {
+ return;
+ }
+
+ for (var i = 0, l = collection.length; i < l; i += 1) {
+ callback(collection[i]);
+ }
+ }
+
+ function arrayEquals(arr1, arr2, compareLength) {
+ if (compareLength && (arr1.length !== arr2.length)) {
+ return false;
+ }
+
+ for (var i = 0, l = arr1.length; i < l; i++) {
+ if (!sinon.deepEqual(arr1[i], arr2[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ sinon.extend(mock, {
+ create: function create(object) {
+ if (!object) {
+ throw new TypeError("object is null");
+ }
+
+ var mockObject = sinon.extend({}, mock);
+ mockObject.object = object;
+ delete mockObject.create;
+
+ return mockObject;
+ },
+
+ expects: function expects(method) {
+ if (!method) {
+ throw new TypeError("method is falsy");
+ }
+
+ if (!this.expectations) {
+ this.expectations = {};
+ this.proxies = [];
+ }
+
+ if (!this.expectations[method]) {
+ this.expectations[method] = [];
+ var mockObject = this;
+
+ sinon.wrapMethod(this.object, method, function () {
+ return mockObject.invokeMethod(method, this, arguments);
+ });
+
+ push.call(this.proxies, method);
+ }
+
+ var expectation = sinon.expectation.create(method);
+ push.call(this.expectations[method], expectation);
+
+ return expectation;
+ },
+
+ restore: function restore() {
+ var object = this.object;
+
+ each(this.proxies, function (proxy) {
+ if (typeof object[proxy].restore === "function") {
+ object[proxy].restore();
+ }
+ });
+ },
+
+ verify: function verify() {
+ var expectations = this.expectations || {};
+ var messages = [];
+ var met = [];
+
+ each(this.proxies, function (proxy) {
+ each(expectations[proxy], function (expectation) {
+ if (!expectation.met()) {
+ push.call(messages, expectation.toString());
+ } else {
+ push.call(met, expectation.toString());
+ }
+ });
+ });
+
+ this.restore();
+
+ if (messages.length > 0) {
+ sinon.expectation.fail(messages.concat(met).join("\n"));
+ } else if (met.length > 0) {
+ sinon.expectation.pass(messages.concat(met).join("\n"));
+ }
+
+ return true;
+ },
+
+ invokeMethod: function invokeMethod(method, thisValue, args) {
+ var expectations = this.expectations && this.expectations[method] ? this.expectations[method] : [];
+ var expectationsWithMatchingArgs = [];
+ var currentArgs = args || [];
+ var i, available;
+
+ for (i = 0; i < expectations.length; i += 1) {
+ var expectedArgs = expectations[i].expectedArguments || [];
+ if (arrayEquals(expectedArgs, currentArgs, expectations[i].expectsExactArgCount)) {
+ expectationsWithMatchingArgs.push(expectations[i]);
+ }
+ }
+
+ for (i = 0; i < expectationsWithMatchingArgs.length; i += 1) {
+ if (!expectationsWithMatchingArgs[i].met() &&
+ expectationsWithMatchingArgs[i].allowsCall(thisValue, args)) {
+ return expectationsWithMatchingArgs[i].apply(thisValue, args);
+ }
+ }
+
+ var messages = [];
+ var exhausted = 0;
+
+ for (i = 0; i < expectationsWithMatchingArgs.length; i += 1) {
+ if (expectationsWithMatchingArgs[i].allowsCall(thisValue, args)) {
+ available = available || expectationsWithMatchingArgs[i];
+ } else {
+ exhausted += 1;
+ }
+ }
+
+ if (available && exhausted === 0) {
+ return available.apply(thisValue, args);
+ }
+
+ for (i = 0; i < expectations.length; i += 1) {
+ push.call(messages, " " + expectations[i].toString());
+ }
+
+ messages.unshift("Unexpected call: " + sinon.spyCall.toString.call({
+ proxy: method,
+ args: args
+ }));
+
+ sinon.expectation.fail(messages.join("\n"));
+ }
+ });
+
+ var times = sinon.timesInWords;
+ var slice = Array.prototype.slice;
+
+ function callCountInWords(callCount) {
+ if (callCount === 0) {
+ return "never called";
+ }
+
+ return "called " + times(callCount);
+ }
+
+ function expectedCallCountInWords(expectation) {
+ var min = expectation.minCalls;
+ var max = expectation.maxCalls;
+
+ if (typeof min === "number" && typeof max === "number") {
+ var str = times(min);
+
+ if (min !== max) {
+ str = "at least " + str + " and at most " + times(max);
+ }
+
+ return str;
+ }
+
+ if (typeof min === "number") {
+ return "at least " + times(min);
+ }
+
+ return "at most " + times(max);
+ }
+
+ function receivedMinCalls(expectation) {
+ var hasMinLimit = typeof expectation.minCalls === "number";
+ return !hasMinLimit || expectation.callCount >= expectation.minCalls;
+ }
+
+ function receivedMaxCalls(expectation) {
+ if (typeof expectation.maxCalls !== "number") {
+ return false;
+ }
+
+ return expectation.callCount === expectation.maxCalls;
+ }
+
+ function verifyMatcher(possibleMatcher, arg) {
+ var isMatcher = match && match.isMatcher(possibleMatcher);
+
+ return isMatcher && possibleMatcher.test(arg) || true;
+ }
+
+ sinon.expectation = {
+ minCalls: 1,
+ maxCalls: 1,
+
+ create: function create(methodName) {
+ var expectation = sinon.extend(sinon.stub.create(), sinon.expectation);
+ delete expectation.create;
+ expectation.method = methodName;
+
+ return expectation;
+ },
+
+ invoke: function invoke(func, thisValue, args) {
+ this.verifyCallAllowed(thisValue, args);
+
+ return sinon.spy.invoke.apply(this, arguments);
+ },
+
+ atLeast: function atLeast(num) {
+ if (typeof num !== "number") {
+ throw new TypeError("'" + num + "' is not number");
+ }
+
+ if (!this.limitsSet) {
+ this.maxCalls = null;
+ this.limitsSet = true;
+ }
+
+ this.minCalls = num;
+
+ return this;
+ },
+
+ atMost: function atMost(num) {
+ if (typeof num !== "number") {
+ throw new TypeError("'" + num + "' is not number");
+ }
+
+ if (!this.limitsSet) {
+ this.minCalls = null;
+ this.limitsSet = true;
+ }
+
+ this.maxCalls = num;
+
+ return this;
+ },
+
+ never: function never() {
+ return this.exactly(0);
+ },
+
+ once: function once() {
+ return this.exactly(1);
+ },
+
+ twice: function twice() {
+ return this.exactly(2);
+ },
+
+ thrice: function thrice() {
+ return this.exactly(3);
+ },
+
+ exactly: function exactly(num) {
+ if (typeof num !== "number") {
+ throw new TypeError("'" + num + "' is not a number");
+ }
+
+ this.atLeast(num);
+ return this.atMost(num);
+ },
+
+ met: function met() {
+ return !this.failed && receivedMinCalls(this);
+ },
+
+ verifyCallAllowed: function verifyCallAllowed(thisValue, args) {
+ if (receivedMaxCalls(this)) {
+ this.failed = true;
+ sinon.expectation.fail(this.method + " already called " + times(this.maxCalls));
+ }
+
+ if ("expectedThis" in this && this.expectedThis !== thisValue) {
+ sinon.expectation.fail(this.method + " called with " + thisValue + " as thisValue, expected " +
+ this.expectedThis);
+ }
+
+ if (!("expectedArguments" in this)) {
+ return;
+ }
+
+ if (!args) {
+ sinon.expectation.fail(this.method + " received no arguments, expected " +
+ sinon.format(this.expectedArguments));
+ }
+
+ if (args.length < this.expectedArguments.length) {
+ sinon.expectation.fail(this.method + " received too few arguments (" + sinon.format(args) +
+ "), expected " + sinon.format(this.expectedArguments));
+ }
+
+ if (this.expectsExactArgCount &&
+ args.length !== this.expectedArguments.length) {
+ sinon.expectation.fail(this.method + " received too many arguments (" + sinon.format(args) +
+ "), expected " + sinon.format(this.expectedArguments));
+ }
+
+ for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {
+
+ if (!verifyMatcher(this.expectedArguments[i], args[i])) {
+ sinon.expectation.fail(this.method + " received wrong arguments " + sinon.format(args) +
+ ", didn't match " + this.expectedArguments.toString());
+ }
+
+ if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {
+ sinon.expectation.fail(this.method + " received wrong arguments " + sinon.format(args) +
+ ", expected " + sinon.format(this.expectedArguments));
+ }
+ }
+ },
+
+ allowsCall: function allowsCall(thisValue, args) {
+ if (this.met() && receivedMaxCalls(this)) {
+ return false;
+ }
+
+ if ("expectedThis" in this && this.expectedThis !== thisValue) {
+ return false;
+ }
+
+ if (!("expectedArguments" in this)) {
+ return true;
+ }
+
+ args = args || [];
+
+ if (args.length < this.expectedArguments.length) {
+ return false;
+ }
+
+ if (this.expectsExactArgCount &&
+ args.length !== this.expectedArguments.length) {
+ return false;
+ }
+
+ for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {
+ if (!verifyMatcher(this.expectedArguments[i], args[i])) {
+ return false;
+ }
+
+ if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {
+ return false;
+ }
+ }
+
+ return true;
+ },
+
+ withArgs: function withArgs() {
+ this.expectedArguments = slice.call(arguments);
+ return this;
+ },
+
+ withExactArgs: function withExactArgs() {
+ this.withArgs.apply(this, arguments);
+ this.expectsExactArgCount = true;
+ return this;
+ },
+
+ on: function on(thisValue) {
+ this.expectedThis = thisValue;
+ return this;
+ },
+
+ toString: function () {
+ var args = (this.expectedArguments || []).slice();
+
+ if (!this.expectsExactArgCount) {
+ push.call(args, "[...]");
+ }
+
+ var callStr = sinon.spyCall.toString.call({
+ proxy: this.method || "anonymous mock expectation",
+ args: args
+ });
+
+ var message = callStr.replace(", [...", "[, ...") + " " +
+ expectedCallCountInWords(this);
+
+ if (this.met()) {
+ return "Expectation met: " + message;
+ }
+
+ return "Expected " + message + " (" +
+ callCountInWords(this.callCount) + ")";
+ },
+
+ verify: function verify() {
+ if (!this.met()) {
+ sinon.expectation.fail(this.toString());
+ } else {
+ sinon.expectation.pass(this.toString());
+ }
+
+ return true;
+ },
+
+ pass: function pass(message) {
+ sinon.assert.pass(message);
+ },
+
+ fail: function fail(message) {
+ var exception = new Error(message);
+ exception.name = "ExpectationError";
+
+ throw exception;
+ }
+ };
+
+ sinon.mock = mock;
+ return mock;
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ function loadDependencies(require, exports, module) {
+ var sinon = require("./util/core");
+ require("./times_in_words");
+ require("./call");
+ require("./extend");
+ require("./match");
+ require("./spy");
+ require("./stub");
+ require("./format");
+
+ module.exports = makeApi(sinon);
+ }
+
+ if (isAMD) {
+ define(loadDependencies);
+ return;
+ }
+
+ if (isNode) {
+ loadDependencies(require, module.exports, module);
+ return;
+ }
+
+ if (sinonGlobal) {
+ makeApi(sinonGlobal);
+ }
+}(
+ typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ * @depend spy.js
+ * @depend stub.js
+ * @depend mock.js
+ */
+/**
+ * Collections of stubs, spies and mocks.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal) {
+
+ var push = [].push;
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+ function getFakes(fakeCollection) {
+ if (!fakeCollection.fakes) {
+ fakeCollection.fakes = [];
+ }
+
+ return fakeCollection.fakes;
+ }
+
+ function each(fakeCollection, method) {
+ var fakes = getFakes(fakeCollection);
+
+ for (var i = 0, l = fakes.length; i < l; i += 1) {
+ if (typeof fakes[i][method] === "function") {
+ fakes[i][method]();
+ }
+ }
+ }
+
+ function compact(fakeCollection) {
+ var fakes = getFakes(fakeCollection);
+ var i = 0;
+ while (i < fakes.length) {
+ fakes.splice(i, 1);
+ }
+ }
+
+ function makeApi(sinon) {
+ var collection = {
+ verify: function resolve() {
+ each(this, "verify");
+ },
+
+ restore: function restore() {
+ each(this, "restore");
+ compact(this);
+ },
+
+ reset: function restore() {
+ each(this, "reset");
+ },
+
+ verifyAndRestore: function verifyAndRestore() {
+ var exception;
+
+ try {
+ this.verify();
+ } catch (e) {
+ exception = e;
+ }
+
+ this.restore();
+
+ if (exception) {
+ throw exception;
+ }
+ },
+
+ add: function add(fake) {
+ push.call(getFakes(this), fake);
+ return fake;
+ },
+
+ spy: function spy() {
+ return this.add(sinon.spy.apply(sinon, arguments));
+ },
+
+ stub: function stub(object, property, value) {
+ if (property) {
+ var original = object[property];
+
+ if (typeof original !== "function") {
+ if (!hasOwnProperty.call(object, property)) {
+ throw new TypeError("Cannot stub non-existent own property " + property);
+ }
+
+ object[property] = value;
+
+ return this.add({
+ restore: function () {
+ object[property] = original;
+ }
+ });
+ }
+ }
+ if (!property && !!object && typeof object === "object") {
+ var stubbedObj = sinon.stub.apply(sinon, arguments);
+
+ for (var prop in stubbedObj) {
+ if (typeof stubbedObj[prop] === "function") {
+ this.add(stubbedObj[prop]);
+ }
+ }
+
+ return stubbedObj;
+ }
+
+ return this.add(sinon.stub.apply(sinon, arguments));
+ },
+
+ mock: function mock() {
+ return this.add(sinon.mock.apply(sinon, arguments));
+ },
+
+ inject: function inject(obj) {
+ var col = this;
+
+ obj.spy = function () {
+ return col.spy.apply(col, arguments);
+ };
+
+ obj.stub = function () {
+ return col.stub.apply(col, arguments);
+ };
+
+ obj.mock = function () {
+ return col.mock.apply(col, arguments);
+ };
+
+ return obj;
+ }
+ };
+
+ sinon.collection = collection;
+ return collection;
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ function loadDependencies(require, exports, module) {
+ var sinon = require("./util/core");
+ require("./mock");
+ require("./spy");
+ require("./stub");
+ module.exports = makeApi(sinon);
+ }
+
+ if (isAMD) {
+ define(loadDependencies);
+ return;
+ }
+
+ if (isNode) {
+ loadDependencies(require, module.exports, module);
+ return;
+ }
+
+ if (sinonGlobal) {
+ makeApi(sinonGlobal);
+ }
+}(
+ typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * Fake timer API
+ * setTimeout
+ * setInterval
+ * clearTimeout
+ * clearInterval
+ * tick
+ * reset
+ * Date
+ *
+ * Inspired by jsUnitMockTimeOut from JsUnit
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function () {
+
+ function makeApi(s, lol) {
+ /*global lolex */
+ var llx = typeof lolex !== "undefined" ? lolex : lol;
+
+ s.useFakeTimers = function () {
+ var now;
+ var methods = Array.prototype.slice.call(arguments);
+
+ if (typeof methods[0] === "string") {
+ now = 0;
+ } else {
+ now = methods.shift();
+ }
+
+ var clock = llx.install(now || 0, methods);
+ clock.restore = clock.uninstall;
+ return clock;
+ };
+
+ s.clock = {
+ create: function (now) {
+ return llx.createClock(now);
+ }
+ };
+
+ s.timers = {
+ setTimeout: setTimeout,
+ clearTimeout: clearTimeout,
+ setImmediate: (typeof setImmediate !== "undefined" ? setImmediate : undefined),
+ clearImmediate: (typeof clearImmediate !== "undefined" ? clearImmediate : undefined),
+ setInterval: setInterval,
+ clearInterval: clearInterval,
+ Date: Date
+ };
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ function loadDependencies(require, epxorts, module, lolex) {
+ var core = require("./core");
+ makeApi(core, lolex);
+ module.exports = core;
+ }
+
+ if (isAMD) {
+ define(loadDependencies);
+ } else if (isNode) {
+ loadDependencies(require, module.exports, module, require("lolex"));
+ } else {
+ makeApi(sinon); // eslint-disable-line no-undef
+ }
+}());
+
+/**
+ * Minimal Event interface implementation
+ *
+ * Original implementation by Sven Fuchs: https://gist.github.com/995028
+ * Modifications and tests by Christian Johansen.
+ *
+ * @author Sven Fuchs (svenfuchs@artweb-design.de)
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2011 Sven Fuchs, Christian Johansen
+ */
+if (typeof sinon === "undefined") {
+ this.sinon = {};
+}
+
+(function () {
+
+ var push = [].push;
+
+ function makeApi(sinon) {
+ sinon.Event = function Event(type, bubbles, cancelable, target) {
+ this.initEvent(type, bubbles, cancelable, target);
+ };
+
+ sinon.Event.prototype = {
+ initEvent: function (type, bubbles, cancelable, target) {
+ this.type = type;
+ this.bubbles = bubbles;
+ this.cancelable = cancelable;
+ this.target = target;
+ },
+
+ stopPropagation: function () {},
+
+ preventDefault: function () {
+ this.defaultPrevented = true;
+ }
+ };
+
+ sinon.ProgressEvent = function ProgressEvent(type, progressEventRaw, target) {
+ this.initEvent(type, false, false, target);
+ this.loaded = progressEventRaw.loaded || null;
+ this.total = progressEventRaw.total || null;
+ this.lengthComputable = !!progressEventRaw.total;
+ };
+
+ sinon.ProgressEvent.prototype = new sinon.Event();
+
+ sinon.ProgressEvent.prototype.constructor = sinon.ProgressEvent;
+
+ sinon.CustomEvent = function CustomEvent(type, customData, target) {
+ this.initEvent(type, false, false, target);
+ this.detail = customData.detail || null;
+ };
+
+ sinon.CustomEvent.prototype = new sinon.Event();
+
+ sinon.CustomEvent.prototype.constructor = sinon.CustomEvent;
+
+ sinon.EventTarget = {
+ addEventListener: function addEventListener(event, listener) {
+ this.eventListeners = this.eventListeners || {};
+ this.eventListeners[event] = this.eventListeners[event] || [];
+ push.call(this.eventListeners[event], listener);
+ },
+
+ removeEventListener: function removeEventListener(event, listener) {
+ var listeners = this.eventListeners && this.eventListeners[event] || [];
+
+ for (var i = 0, l = listeners.length; i < l; ++i) {
+ if (listeners[i] === listener) {
+ return listeners.splice(i, 1);
+ }
+ }
+ },
+
+ dispatchEvent: function dispatchEvent(event) {
+ var type = event.type;
+ var listeners = this.eventListeners && this.eventListeners[type] || [];
+
+ for (var i = 0; i < listeners.length; i++) {
+ if (typeof listeners[i] === "function") {
+ listeners[i].call(this, event);
+ } else {
+ listeners[i].handleEvent(event);
+ }
+ }
+
+ return !!event.defaultPrevented;
+ }
+ };
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ function loadDependencies(require) {
+ var sinon = require("./core");
+ makeApi(sinon);
+ }
+
+ if (isAMD) {
+ define(loadDependencies);
+ } else if (isNode) {
+ loadDependencies(require);
+ } else {
+ makeApi(sinon); // eslint-disable-line no-undef
+ }
+}());
+
+/**
+ * @depend util/core.js
+ */
+/**
+ * Logs errors
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2014 Christian Johansen
+ */
+(function (sinonGlobal) {
+
+ // cache a reference to setTimeout, so that our reference won't be stubbed out
+ // when using fake timers and errors will still get logged
+ // https://github.com/cjohansen/Sinon.JS/issues/381
+ var realSetTimeout = setTimeout;
+
+ function makeApi(sinon) {
+
+ function log() {}
+
+ function logError(label, err) {
+ var msg = label + " threw exception: ";
+
+ function throwLoggedError() {
+ err.message = msg + err.message;
+ throw err;
+ }
+
+ sinon.log(msg + "[" + err.name + "] " + err.message);
+
+ if (err.stack) {
+ sinon.log(err.stack);
+ }
+
+ if (logError.useImmediateExceptions) {
+ throwLoggedError();
+ } else {
+ logError.setTimeout(throwLoggedError, 0);
+ }
+ }
+
+ // When set to true, any errors logged will be thrown immediately;
+ // If set to false, the errors will be thrown in separate execution frame.
+ logError.useImmediateExceptions = false;
+
+ // wrap realSetTimeout with something we can stub in tests
+ logError.setTimeout = function (func, timeout) {
+ realSetTimeout(func, timeout);
+ };
+
+ var exports = {};
+ exports.log = sinon.log = log;
+ exports.logError = sinon.logError = logError;
+
+ return exports;
+ }
+
+ function loadDependencies(require, exports, module) {
+ var sinon = require("./util/core");
+ module.exports = makeApi(sinon);
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ if (isAMD) {
+ define(loadDependencies);
+ return;
+ }
+
+ if (isNode) {
+ loadDependencies(require, module.exports, module);
+ return;
+ }
+
+ if (sinonGlobal) {
+ makeApi(sinonGlobal);
+ }
+}(
+ typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend core.js
+ * @depend ../extend.js
+ * @depend event.js
+ * @depend ../log_error.js
+ */
+/**
+ * Fake XDomainRequest object
+ */
+if (typeof sinon === "undefined") {
+ this.sinon = {};
+}
+
+// wrapper for global
+(function (global) {
+
+ var xdr = { XDomainRequest: global.XDomainRequest };
+ xdr.GlobalXDomainRequest = global.XDomainRequest;
+ xdr.supportsXDR = typeof xdr.GlobalXDomainRequest !== "undefined";
+ xdr.workingXDR = xdr.supportsXDR ? xdr.GlobalXDomainRequest : false;
+
+ function makeApi(sinon) {
+ sinon.xdr = xdr;
+
+ function FakeXDomainRequest() {
+ this.readyState = FakeXDomainRequest.UNSENT;
+ this.requestBody = null;
+ this.requestHeaders = {};
+ this.status = 0;
+ this.timeout = null;
+
+ if (typeof FakeXDomainRequest.onCreate === "function") {
+ FakeXDomainRequest.onCreate(this);
+ }
+ }
+
+ function verifyState(x) {
+ if (x.readyState !== FakeXDomainRequest.OPENED) {
+ throw new Error("INVALID_STATE_ERR");
+ }
+
+ if (x.sendFlag) {
+ throw new Error("INVALID_STATE_ERR");
+ }
+ }
+
+ function verifyRequestSent(x) {
+ if (x.readyState === FakeXDomainRequest.UNSENT) {
+ throw new Error("Request not sent");
+ }
+ if (x.readyState === FakeXDomainRequest.DONE) {
+ throw new Error("Request done");
+ }
+ }
+
+ function verifyResponseBodyType(body) {
+ if (typeof body !== "string") {
+ var error = new Error("Attempted to respond to fake XDomainRequest with " +
+ body + ", which is not a string.");
+ error.name = "InvalidBodyException";
+ throw error;
+ }
+ }
+
+ sinon.extend(FakeXDomainRequest.prototype, sinon.EventTarget, {
+ open: function open(method, url) {
+ this.method = method;
+ this.url = url;
+
+ this.responseText = null;
+ this.sendFlag = false;
+
+ this.readyStateChange(FakeXDomainRequest.OPENED);
+ },
+
+ readyStateChange: function readyStateChange(state) {
+ this.readyState = state;
+ var eventName = "";
+ switch (this.readyState) {
+ case FakeXDomainRequest.UNSENT:
+ break;
+ case FakeXDomainRequest.OPENED:
+ break;
+ case FakeXDomainRequest.LOADING:
+ if (this.sendFlag) {
+ //raise the progress event
+ eventName = "onprogress";
+ }
+ break;
+ case FakeXDomainRequest.DONE:
+ if (this.isTimeout) {
+ eventName = "ontimeout";
+ } else if (this.errorFlag || (this.status < 200 || this.status > 299)) {
+ eventName = "onerror";
+ } else {
+ eventName = "onload";
+ }
+ break;
+ }
+
+ // raising event (if defined)
+ if (eventName) {
+ if (typeof this[eventName] === "function") {
+ try {
+ this[eventName]();
+ } catch (e) {
+ sinon.logError("Fake XHR " + eventName + " handler", e);
+ }
+ }
+ }
+ },
+
+ send: function send(data) {
+ verifyState(this);
+
+ if (!/^(get|head)$/i.test(this.method)) {
+ this.requestBody = data;
+ }
+ this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8";
+
+ this.errorFlag = false;
+ this.sendFlag = true;
+ this.readyStateChange(FakeXDomainRequest.OPENED);
+
+ if (typeof this.onSend === "function") {
+ this.onSend(this);
+ }
+ },
+
+ abort: function abort() {
+ this.aborted = true;
+ this.responseText = null;
+ this.errorFlag = true;
+
+ if (this.readyState > sinon.FakeXDomainRequest.UNSENT && this.sendFlag) {
+ this.readyStateChange(sinon.FakeXDomainRequest.DONE);
+ this.sendFlag = false;
+ }
+ },
+
+ setResponseBody: function setResponseBody(body) {
+ verifyRequestSent(this);
+ verifyResponseBodyType(body);
+
+ var chunkSize = this.chunkSize || 10;
+ var index = 0;
+ this.responseText = "";
+
+ do {
+ this.readyStateChange(FakeXDomainRequest.LOADING);
+ this.responseText += body.substring(index, index + chunkSize);
+ index += chunkSize;
+ } while (index < body.length);
+
+ this.readyStateChange(FakeXDomainRequest.DONE);
+ },
+
+ respond: function respond(status, contentType, body) {
+ // content-type ignored, since XDomainRequest does not carry this
+ // we keep the same syntax for respond(...) as for FakeXMLHttpRequest to ease
+ // test integration across browsers
+ this.status = typeof status === "number" ? status : 200;
+ this.setResponseBody(body || "");
+ },
+
+ simulatetimeout: function simulatetimeout() {
+ this.status = 0;
+ this.isTimeout = true;
+ // Access to this should actually throw an error
+ this.responseText = undefined;
+ this.readyStateChange(FakeXDomainRequest.DONE);
+ }
+ });
+
+ sinon.extend(FakeXDomainRequest, {
+ UNSENT: 0,
+ OPENED: 1,
+ LOADING: 3,
+ DONE: 4
+ });
+
+ sinon.useFakeXDomainRequest = function useFakeXDomainRequest() {
+ sinon.FakeXDomainRequest.restore = function restore(keepOnCreate) {
+ if (xdr.supportsXDR) {
+ global.XDomainRequest = xdr.GlobalXDomainRequest;
+ }
+
+ delete sinon.FakeXDomainRequest.restore;
+
+ if (keepOnCreate !== true) {
+ delete sinon.FakeXDomainRequest.onCreate;
+ }
+ };
+ if (xdr.supportsXDR) {
+ global.XDomainRequest = sinon.FakeXDomainRequest;
+ }
+ return sinon.FakeXDomainRequest;
+ };
+
+ sinon.FakeXDomainRequest = FakeXDomainRequest;
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ function loadDependencies(require, exports, module) {
+ var sinon = require("./core");
+ require("../extend");
+ require("./event");
+ require("../log_error");
+ makeApi(sinon);
+ module.exports = sinon;
+ }
+
+ if (isAMD) {
+ define(loadDependencies);
+ } else if (isNode) {
+ loadDependencies(require, module.exports, module);
+ } else {
+ makeApi(sinon); // eslint-disable-line no-undef
+ }
+})(typeof global !== "undefined" ? global : self);
+
+/**
+ * @depend core.js
+ * @depend ../extend.js
+ * @depend event.js
+ * @depend ../log_error.js
+ */
+/**
+ * Fake XMLHttpRequest object
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal, global) {
+
+ function getWorkingXHR(globalScope) {
+ var supportsXHR = typeof globalScope.XMLHttpRequest !== "undefined";
+ if (supportsXHR) {
+ return globalScope.XMLHttpRequest;
+ }
+
+ var supportsActiveX = typeof globalScope.ActiveXObject !== "undefined";
+ if (supportsActiveX) {
+ return function () {
+ return new globalScope.ActiveXObject("MSXML2.XMLHTTP.3.0");
+ };
+ }
+
+ return false;
+ }
+
+ var supportsProgress = typeof ProgressEvent !== "undefined";
+ var supportsCustomEvent = typeof CustomEvent !== "undefined";
+ var supportsFormData = typeof FormData !== "undefined";
+ var supportsArrayBuffer = typeof ArrayBuffer !== "undefined";
+ var supportsBlob = typeof Blob === "function";
+ var sinonXhr = { XMLHttpRequest: global.XMLHttpRequest };
+ sinonXhr.GlobalXMLHttpRequest = global.XMLHttpRequest;
+ sinonXhr.GlobalActiveXObject = global.ActiveXObject;
+ sinonXhr.supportsActiveX = typeof sinonXhr.GlobalActiveXObject !== "undefined";
+ sinonXhr.supportsXHR = typeof sinonXhr.GlobalXMLHttpRequest !== "undefined";
+ sinonXhr.workingXHR = getWorkingXHR(global);
+ sinonXhr.supportsCORS = sinonXhr.supportsXHR && "withCredentials" in (new sinonXhr.GlobalXMLHttpRequest());
+
+ var unsafeHeaders = {
+ "Accept-Charset": true,
+ "Accept-Encoding": true,
+ Connection: true,
+ "Content-Length": true,
+ Cookie: true,
+ Cookie2: true,
+ "Content-Transfer-Encoding": true,
+ Date: true,
+ Expect: true,
+ Host: true,
+ "Keep-Alive": true,
+ Referer: true,
+ TE: true,
+ Trailer: true,
+ "Transfer-Encoding": true,
+ Upgrade: true,
+ "User-Agent": true,
+ Via: true
+ };
+
+ // An upload object is created for each
+ // FakeXMLHttpRequest and allows upload
+ // events to be simulated using uploadProgress
+ // and uploadError.
+ function UploadProgress() {
+ this.eventListeners = {
+ progress: [],
+ load: [],
+ abort: [],
+ error: []
+ };
+ }
+
+ UploadProgress.prototype.addEventListener = function addEventListener(event, listener) {
+ this.eventListeners[event].push(listener);
+ };
+
+ UploadProgress.prototype.removeEventListener = function removeEventListener(event, listener) {
+ var listeners = this.eventListeners[event] || [];
+
+ for (var i = 0, l = listeners.length; i < l; ++i) {
+ if (listeners[i] === listener) {
+ return listeners.splice(i, 1);
+ }
+ }
+ };
+
+ UploadProgress.prototype.dispatchEvent = function dispatchEvent(event) {
+ var listeners = this.eventListeners[event.type] || [];
+
+ for (var i = 0, listener; (listener = listeners[i]) != null; i++) {
+ listener(event);
+ }
+ };
+
+ // Note that for FakeXMLHttpRequest to work pre ES5
+ // we lose some of the alignment with the spec.
+ // To ensure as close a match as possible,
+ // set responseType before calling open, send or respond;
+ function FakeXMLHttpRequest() {
+ this.readyState = FakeXMLHttpRequest.UNSENT;
+ this.requestHeaders = {};
+ this.requestBody = null;
+ this.status = 0;
+ this.statusText = "";
+ this.upload = new UploadProgress();
+ this.responseType = "";
+ this.response = "";
+ if (sinonXhr.supportsCORS) {
+ this.withCredentials = false;
+ }
+
+ var xhr = this;
+ var events = ["loadstart", "load", "abort", "loadend"];
+
+ function addEventListener(eventName) {
+ xhr.addEventListener(eventName, function (event) {
+ var listener = xhr["on" + eventName];
+
+ if (listener && typeof listener === "function") {
+ listener.call(this, event);
+ }
+ });
+ }
+
+ for (var i = events.length - 1; i >= 0; i--) {
+ addEventListener(events[i]);
+ }
+
+ if (typeof FakeXMLHttpRequest.onCreate === "function") {
+ FakeXMLHttpRequest.onCreate(this);
+ }
+ }
+
+ function verifyState(xhr) {
+ if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {
+ throw new Error("INVALID_STATE_ERR");
+ }
+
+ if (xhr.sendFlag) {
+ throw new Error("INVALID_STATE_ERR");
+ }
+ }
+
+ function getHeader(headers, header) {
+ header = header.toLowerCase();
+
+ for (var h in headers) {
+ if (h.toLowerCase() === header) {
+ return h;
+ }
+ }
+
+ return null;
+ }
+
+ // filtering to enable a white-list version of Sinon FakeXhr,
+ // where whitelisted requests are passed through to real XHR
+ function each(collection, callback) {
+ if (!collection) {
+ return;
+ }
+
+ for (var i = 0, l = collection.length; i < l; i += 1) {
+ callback(collection[i]);
+ }
+ }
+ function some(collection, callback) {
+ for (var index = 0; index < collection.length; index++) {
+ if (callback(collection[index]) === true) {
+ return true;
+ }
+ }
+ return false;
+ }
+ // largest arity in XHR is 5 - XHR#open
+ var apply = function (obj, method, args) {
+ switch (args.length) {
+ case 0: return obj[method]();
+ case 1: return obj[method](args[0]);
+ case 2: return obj[method](args[0], args[1]);
+ case 3: return obj[method](args[0], args[1], args[2]);
+ case 4: return obj[method](args[0], args[1], args[2], args[3]);
+ case 5: return obj[method](args[0], args[1], args[2], args[3], args[4]);
+ }
+ };
+
+ FakeXMLHttpRequest.filters = [];
+ FakeXMLHttpRequest.addFilter = function addFilter(fn) {
+ this.filters.push(fn);
+ };
+ var IE6Re = /MSIE 6/;
+ FakeXMLHttpRequest.defake = function defake(fakeXhr, xhrArgs) {
+ var xhr = new sinonXhr.workingXHR(); // eslint-disable-line new-cap
+
+ each([
+ "open",
+ "setRequestHeader",
+ "send",
+ "abort",
+ "getResponseHeader",
+ "getAllResponseHeaders",
+ "addEventListener",
+ "overrideMimeType",
+ "removeEventListener"
+ ], function (method) {
+ fakeXhr[method] = function () {
+ return apply(xhr, method, arguments);
+ };
+ });
+
+ var copyAttrs = function (args) {
+ each(args, function (attr) {
+ try {
+ fakeXhr[attr] = xhr[attr];
+ } catch (e) {
+ if (!IE6Re.test(navigator.userAgent)) {
+ throw e;
+ }
+ }
+ });
+ };
+
+ var stateChange = function stateChange() {
+ fakeXhr.readyState = xhr.readyState;
+ if (xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) {
+ copyAttrs(["status", "statusText"]);
+ }
+ if (xhr.readyState >= FakeXMLHttpRequest.LOADING) {
+ copyAttrs(["responseText", "response"]);
+ }
+ if (xhr.readyState === FakeXMLHttpRequest.DONE) {
+ copyAttrs(["responseXML"]);
+ }
+ if (fakeXhr.onreadystatechange) {
+ fakeXhr.onreadystatechange.call(fakeXhr, { target: fakeXhr });
+ }
+ };
+
+ if (xhr.addEventListener) {
+ for (var event in fakeXhr.eventListeners) {
+ if (fakeXhr.eventListeners.hasOwnProperty(event)) {
+
+ /*eslint-disable no-loop-func*/
+ each(fakeXhr.eventListeners[event], function (handler) {
+ xhr.addEventListener(event, handler);
+ });
+ /*eslint-enable no-loop-func*/
+ }
+ }
+ xhr.addEventListener("readystatechange", stateChange);
+ } else {
+ xhr.onreadystatechange = stateChange;
+ }
+ apply(xhr, "open", xhrArgs);
+ };
+ FakeXMLHttpRequest.useFilters = false;
+
+ function verifyRequestOpened(xhr) {
+ if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {
+ throw new Error("INVALID_STATE_ERR - " + xhr.readyState);
+ }
+ }
+
+ function verifyRequestSent(xhr) {
+ if (xhr.readyState === FakeXMLHttpRequest.DONE) {
+ throw new Error("Request done");
+ }
+ }
+
+ function verifyHeadersReceived(xhr) {
+ if (xhr.async && xhr.readyState !== FakeXMLHttpRequest.HEADERS_RECEIVED) {
+ throw new Error("No headers received");
+ }
+ }
+
+ function verifyResponseBodyType(body) {
+ if (typeof body !== "string") {
+ var error = new Error("Attempted to respond to fake XMLHttpRequest with " +
+ body + ", which is not a string.");
+ error.name = "InvalidBodyException";
+ throw error;
+ }
+ }
+
+ function convertToArrayBuffer(body) {
+ var buffer = new ArrayBuffer(body.length);
+ var view = new Uint8Array(buffer);
+ for (var i = 0; i < body.length; i++) {
+ var charCode = body.charCodeAt(i);
+ if (charCode >= 256) {
+ throw new TypeError("arraybuffer or blob responseTypes require binary string, " +
+ "invalid character " + body[i] + " found.");
+ }
+ view[i] = charCode;
+ }
+ return buffer;
+ }
+
+ function isXmlContentType(contentType) {
+ return !contentType || /(text\/xml)|(application\/xml)|(\+xml)/.test(contentType);
+ }
+
+ function convertResponseBody(responseType, contentType, body) {
+ if (responseType === "" || responseType === "text") {
+ return body;
+ } else if (supportsArrayBuffer && responseType === "arraybuffer") {
+ return convertToArrayBuffer(body);
+ } else if (responseType === "json") {
+ try {
+ return JSON.parse(body);
+ } catch (e) {
+ // Return parsing failure as null
+ return null;
+ }
+ } else if (supportsBlob && responseType === "blob") {
+ var blobOptions = {};
+ if (contentType) {
+ blobOptions.type = contentType;
+ }
+ return new Blob([convertToArrayBuffer(body)], blobOptions);
+ } else if (responseType === "document") {
+ if (isXmlContentType(contentType)) {
+ return FakeXMLHttpRequest.parseXML(body);
+ }
+ return null;
+ }
+ throw new Error("Invalid responseType " + responseType);
+ }
+
+ function clearResponse(xhr) {
+ if (xhr.responseType === "" || xhr.responseType === "text") {
+ xhr.response = xhr.responseText = "";
+ } else {
+ xhr.response = xhr.responseText = null;
+ }
+ xhr.responseXML = null;
+ }
+
+ FakeXMLHttpRequest.parseXML = function parseXML(text) {
+ // Treat empty string as parsing failure
+ if (text !== "") {
+ try {
+ if (typeof DOMParser !== "undefined") {
+ var parser = new DOMParser();
+ return parser.parseFromString(text, "text/xml");
+ }
+ var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
+ xmlDoc.async = "false";
+ xmlDoc.loadXML(text);
+ return xmlDoc;
+ } catch (e) {
+ // Unable to parse XML - no biggie
+ }
+ }
+
+ return null;
+ };
+
+ FakeXMLHttpRequest.statusCodes = {
+ 100: "Continue",
+ 101: "Switching Protocols",
+ 200: "OK",
+ 201: "Created",
+ 202: "Accepted",
+ 203: "Non-Authoritative Information",
+ 204: "No Content",
+ 205: "Reset Content",
+ 206: "Partial Content",
+ 207: "Multi-Status",
+ 300: "Multiple Choice",
+ 301: "Moved Permanently",
+ 302: "Found",
+ 303: "See Other",
+ 304: "Not Modified",
+ 305: "Use Proxy",
+ 307: "Temporary Redirect",
+ 400: "Bad Request",
+ 401: "Unauthorized",
+ 402: "Payment Required",
+ 403: "Forbidden",
+ 404: "Not Found",
+ 405: "Method Not Allowed",
+ 406: "Not Acceptable",
+ 407: "Proxy Authentication Required",
+ 408: "Request Timeout",
+ 409: "Conflict",
+ 410: "Gone",
+ 411: "Length Required",
+ 412: "Precondition Failed",
+ 413: "Request Entity Too Large",
+ 414: "Request-URI Too Long",
+ 415: "Unsupported Media Type",
+ 416: "Requested Range Not Satisfiable",
+ 417: "Expectation Failed",
+ 422: "Unprocessable Entity",
+ 500: "Internal Server Error",
+ 501: "Not Implemented",
+ 502: "Bad Gateway",
+ 503: "Service Unavailable",
+ 504: "Gateway Timeout",
+ 505: "HTTP Version Not Supported"
+ };
+
+ function makeApi(sinon) {
+ sinon.xhr = sinonXhr;
+
+ sinon.extend(FakeXMLHttpRequest.prototype, sinon.EventTarget, {
+ async: true,
+
+ open: function open(method, url, async, username, password) {
+ this.method = method;
+ this.url = url;
+ this.async = typeof async === "boolean" ? async : true;
+ this.username = username;
+ this.password = password;
+ clearResponse(this);
+ this.requestHeaders = {};
+ this.sendFlag = false;
+
+ if (FakeXMLHttpRequest.useFilters === true) {
+ var xhrArgs = arguments;
+ var defake = some(FakeXMLHttpRequest.filters, function (filter) {
+ return filter.apply(this, xhrArgs);
+ });
+ if (defake) {
+ return FakeXMLHttpRequest.defake(this, arguments);
+ }
+ }
+ this.readyStateChange(FakeXMLHttpRequest.OPENED);
+ },
+
+ readyStateChange: function readyStateChange(state) {
+ this.readyState = state;
+
+ var readyStateChangeEvent = new sinon.Event("readystatechange", false, false, this);
+
+ if (typeof this.onreadystatechange === "function") {
+ try {
+ this.onreadystatechange(readyStateChangeEvent);
+ } catch (e) {
+ sinon.logError("Fake XHR onreadystatechange handler", e);
+ }
+ }
+
+ switch (this.readyState) {
+ case FakeXMLHttpRequest.DONE:
+ if (supportsProgress) {
+ this.upload.dispatchEvent(new sinon.ProgressEvent("progress", {loaded: 100, total: 100}));
+ this.dispatchEvent(new sinon.ProgressEvent("progress", {loaded: 100, total: 100}));
+ }
+ this.upload.dispatchEvent(new sinon.Event("load", false, false, this));
+ this.dispatchEvent(new sinon.Event("load", false, false, this));
+ this.dispatchEvent(new sinon.Event("loadend", false, false, this));
+ break;
+ }
+
+ this.dispatchEvent(readyStateChangeEvent);
+ },
+
+ setRequestHeader: function setRequestHeader(header, value) {
+ verifyState(this);
+
+ if (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header)) {
+ throw new Error("Refused to set unsafe header \"" + header + "\"");
+ }
+
+ if (this.requestHeaders[header]) {
+ this.requestHeaders[header] += "," + value;
+ } else {
+ this.requestHeaders[header] = value;
+ }
+ },
+
+ // Helps testing
+ setResponseHeaders: function setResponseHeaders(headers) {
+ verifyRequestOpened(this);
+ this.responseHeaders = {};
+
+ for (var header in headers) {
+ if (headers.hasOwnProperty(header)) {
+ this.responseHeaders[header] = headers[header];
+ }
+ }
+
+ if (this.async) {
+ this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED);
+ } else {
+ this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED;
+ }
+ },
+
+ // Currently treats ALL data as a DOMString (i.e. no Document)
+ send: function send(data) {
+ verifyState(this);
+
+ if (!/^(get|head)$/i.test(this.method)) {
+ var contentType = getHeader(this.requestHeaders, "Content-Type");
+ if (this.requestHeaders[contentType]) {
+ var value = this.requestHeaders[contentType].split(";");
+ this.requestHeaders[contentType] = value[0] + ";charset=utf-8";
+ } else if (supportsFormData && !(data instanceof FormData)) {
+ this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8";
+ }
+
+ this.requestBody = data;
+ }
+
+ this.errorFlag = false;
+ this.sendFlag = this.async;
+ clearResponse(this);
+ this.readyStateChange(FakeXMLHttpRequest.OPENED);
+
+ if (typeof this.onSend === "function") {
+ this.onSend(this);
+ }
+
+ this.dispatchEvent(new sinon.Event("loadstart", false, false, this));
+ },
+
+ abort: function abort() {
+ this.aborted = true;
+ clearResponse(this);
+ this.errorFlag = true;
+ this.requestHeaders = {};
+ this.responseHeaders = {};
+
+ if (this.readyState > FakeXMLHttpRequest.UNSENT && this.sendFlag) {
+ this.readyStateChange(FakeXMLHttpRequest.DONE);
+ this.sendFlag = false;
+ }
+
+ this.readyState = FakeXMLHttpRequest.UNSENT;
+
+ this.dispatchEvent(new sinon.Event("abort", false, false, this));
+
+ this.upload.dispatchEvent(new sinon.Event("abort", false, false, this));
+
+ if (typeof this.onerror === "function") {
+ this.onerror();
+ }
+ },
+
+ getResponseHeader: function getResponseHeader(header) {
+ if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {
+ return null;
+ }
+
+ if (/^Set-Cookie2?$/i.test(header)) {
+ return null;
+ }
+
+ header = getHeader(this.responseHeaders, header);
+
+ return this.responseHeaders[header] || null;
+ },
+
+ getAllResponseHeaders: function getAllResponseHeaders() {
+ if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {
+ return "";
+ }
+
+ var headers = "";
+
+ for (var header in this.responseHeaders) {
+ if (this.responseHeaders.hasOwnProperty(header) &&
+ !/^Set-Cookie2?$/i.test(header)) {
+ headers += header + ": " + this.responseHeaders[header] + "\r\n";
+ }
+ }
+
+ return headers;
+ },
+
+ setResponseBody: function setResponseBody(body) {
+ verifyRequestSent(this);
+ verifyHeadersReceived(this);
+ verifyResponseBodyType(body);
+ var contentType = this.getResponseHeader("Content-Type");
+
+ var isTextResponse = this.responseType === "" || this.responseType === "text";
+ clearResponse(this);
+ if (this.async) {
+ var chunkSize = this.chunkSize || 10;
+ var index = 0;
+
+ do {
+ this.readyStateChange(FakeXMLHttpRequest.LOADING);
+
+ if (isTextResponse) {
+ this.responseText = this.response += body.substring(index, index + chunkSize);
+ }
+ index += chunkSize;
+ } while (index < body.length);
+ }
+
+ this.response = convertResponseBody(this.responseType, contentType, body);
+ if (isTextResponse) {
+ this.responseText = this.response;
+ }
+
+ if (this.responseType === "document") {
+ this.responseXML = this.response;
+ } else if (this.responseType === "" && isXmlContentType(contentType)) {
+ this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText);
+ }
+ this.readyStateChange(FakeXMLHttpRequest.DONE);
+ },
+
+ respond: function respond(status, headers, body) {
+ this.status = typeof status === "number" ? status : 200;
+ this.statusText = FakeXMLHttpRequest.statusCodes[this.status];
+ this.setResponseHeaders(headers || {});
+ this.setResponseBody(body || "");
+ },
+
+ uploadProgress: function uploadProgress(progressEventRaw) {
+ if (supportsProgress) {
+ this.upload.dispatchEvent(new sinon.ProgressEvent("progress", progressEventRaw));
+ }
+ },
+
+ downloadProgress: function downloadProgress(progressEventRaw) {
+ if (supportsProgress) {
+ this.dispatchEvent(new sinon.ProgressEvent("progress", progressEventRaw));
+ }
+ },
+
+ uploadError: function uploadError(error) {
+ if (supportsCustomEvent) {
+ this.upload.dispatchEvent(new sinon.CustomEvent("error", {detail: error}));
+ }
+ }
+ });
+
+ sinon.extend(FakeXMLHttpRequest, {
+ UNSENT: 0,
+ OPENED: 1,
+ HEADERS_RECEIVED: 2,
+ LOADING: 3,
+ DONE: 4
+ });
+
+ sinon.useFakeXMLHttpRequest = function () {
+ FakeXMLHttpRequest.restore = function restore(keepOnCreate) {
+ if (sinonXhr.supportsXHR) {
+ global.XMLHttpRequest = sinonXhr.GlobalXMLHttpRequest;
+ }
+
+ if (sinonXhr.supportsActiveX) {
+ global.ActiveXObject = sinonXhr.GlobalActiveXObject;
+ }
+
+ delete FakeXMLHttpRequest.restore;
+
+ if (keepOnCreate !== true) {
+ delete FakeXMLHttpRequest.onCreate;
+ }
+ };
+ if (sinonXhr.supportsXHR) {
+ global.XMLHttpRequest = FakeXMLHttpRequest;
+ }
+
+ if (sinonXhr.supportsActiveX) {
+ global.ActiveXObject = function ActiveXObject(objId) {
+ if (objId === "Microsoft.XMLHTTP" || /^Msxml2\.XMLHTTP/i.test(objId)) {
+
+ return new FakeXMLHttpRequest();
+ }
+
+ return new sinonXhr.GlobalActiveXObject(objId);
+ };
+ }
+
+ return FakeXMLHttpRequest;
+ };
+
+ sinon.FakeXMLHttpRequest = FakeXMLHttpRequest;
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ function loadDependencies(require, exports, module) {
+ var sinon = require("./core");
+ require("../extend");
+ require("./event");
+ require("../log_error");
+ makeApi(sinon);
+ module.exports = sinon;
+ }
+
+ if (isAMD) {
+ define(loadDependencies);
+ return;
+ }
+
+ if (isNode) {
+ loadDependencies(require, module.exports, module);
+ return;
+ }
+
+ if (sinonGlobal) {
+ makeApi(sinonGlobal);
+ }
+}(
+ typeof sinon === "object" && sinon, // eslint-disable-line no-undef
+ typeof global !== "undefined" ? global : self
+));
+
+/**
+ * @depend fake_xdomain_request.js
+ * @depend fake_xml_http_request.js
+ * @depend ../format.js
+ * @depend ../log_error.js
+ */
+/**
+ * The Sinon "server" mimics a web server that receives requests from
+ * sinon.FakeXMLHttpRequest and provides an API to respond to those requests,
+ * both synchronously and asynchronously. To respond synchronuously, canned
+ * answers have to be provided upfront.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function () {
+
+ var push = [].push;
+
+ function responseArray(handler) {
+ var response = handler;
+
+ if (Object.prototype.toString.call(handler) !== "[object Array]") {
+ response = [200, {}, handler];
+ }
+
+ if (typeof response[2] !== "string") {
+ throw new TypeError("Fake server response body should be string, but was " +
+ typeof response[2]);
+ }
+
+ return response;
+ }
+
+ var wloc = typeof window !== "undefined" ? window.location : {};
+ var rCurrLoc = new RegExp("^" + wloc.protocol + "//" + wloc.host);
+
+ function matchOne(response, reqMethod, reqUrl) {
+ var rmeth = response.method;
+ var matchMethod = !rmeth || rmeth.toLowerCase() === reqMethod.toLowerCase();
+ var url = response.url;
+ var matchUrl = !url || url === reqUrl || (typeof url.test === "function" && url.test(reqUrl));
+
+ return matchMethod && matchUrl;
+ }
+
+ function match(response, request) {
+ var requestUrl = request.url;
+
+ if (!/^https?:\/\//.test(requestUrl) || rCurrLoc.test(requestUrl)) {
+ requestUrl = requestUrl.replace(rCurrLoc, "");
+ }
+
+ if (matchOne(response, this.getHTTPMethod(request), requestUrl)) {
+ if (typeof response.response === "function") {
+ var ru = response.url;
+ var args = [request].concat(ru && typeof ru.exec === "function" ? ru.exec(requestUrl).slice(1) : []);
+ return response.response.apply(response, args);
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+
+ function makeApi(sinon) {
+ sinon.fakeServer = {
+ create: function (config) {
+ var server = sinon.create(this);
+ server.configure(config);
+ if (!sinon.xhr.supportsCORS) {
+ this.xhr = sinon.useFakeXDomainRequest();
+ } else {
+ this.xhr = sinon.useFakeXMLHttpRequest();
+ }
+ server.requests = [];
+
+ this.xhr.onCreate = function (xhrObj) {
+ server.addRequest(xhrObj);
+ };
+
+ return server;
+ },
+ configure: function (config) {
+ var whitelist = {
+ "autoRespond": true,
+ "autoRespondAfter": true,
+ "respondImmediately": true,
+ "fakeHTTPMethods": true
+ };
+ var setting;
+
+ config = config || {};
+ for (setting in config) {
+ if (whitelist.hasOwnProperty(setting) && config.hasOwnProperty(setting)) {
+ this[setting] = config[setting];
+ }
+ }
+ },
+ addRequest: function addRequest(xhrObj) {
+ var server = this;
+ push.call(this.requests, xhrObj);
+
+ xhrObj.onSend = function () {
+ server.handleRequest(this);
+
+ if (server.respondImmediately) {
+ server.respond();
+ } else if (server.autoRespond && !server.responding) {
+ setTimeout(function () {
+ server.responding = false;
+ server.respond();
+ }, server.autoRespondAfter || 10);
+
+ server.responding = true;
+ }
+ };
+ },
+
+ getHTTPMethod: function getHTTPMethod(request) {
+ if (this.fakeHTTPMethods && /post/i.test(request.method)) {
+ var matches = (request.requestBody || "").match(/_method=([^\b;]+)/);
+ return matches ? matches[1] : request.method;
+ }
+
+ return request.method;
+ },
+
+ handleRequest: function handleRequest(xhr) {
+ if (xhr.async) {
+ if (!this.queue) {
+ this.queue = [];
+ }
+
+ push.call(this.queue, xhr);
+ } else {
+ this.processRequest(xhr);
+ }
+ },
+
+ log: function log(response, request) {
+ var str;
+
+ str = "Request:\n" + sinon.format(request) + "\n\n";
+ str += "Response:\n" + sinon.format(response) + "\n\n";
+
+ sinon.log(str);
+ },
+
+ respondWith: function respondWith(method, url, body) {
+ if (arguments.length === 1 && typeof method !== "function") {
+ this.response = responseArray(method);
+ return;
+ }
+
+ if (!this.responses) {
+ this.responses = [];
+ }
+
+ if (arguments.length === 1) {
+ body = method;
+ url = method = null;
+ }
+
+ if (arguments.length === 2) {
+ body = url;
+ url = method;
+ method = null;
+ }
+
+ push.call(this.responses, {
+ method: method,
+ url: url,
+ response: typeof body === "function" ? body : responseArray(body)
+ });
+ },
+
+ respond: function respond() {
+ if (arguments.length > 0) {
+ this.respondWith.apply(this, arguments);
+ }
+
+ var queue = this.queue || [];
+ var requests = queue.splice(0, queue.length);
+
+ for (var i = 0; i < requests.length; i++) {
+ this.processRequest(requests[i]);
+ }
+ },
+
+ processRequest: function processRequest(request) {
+ try {
+ if (request.aborted) {
+ return;
+ }
+
+ var response = this.response || [404, {}, ""];
+
+ if (this.responses) {
+ for (var l = this.responses.length, i = l - 1; i >= 0; i--) {
+ if (match.call(this, this.responses[i], request)) {
+ response = this.responses[i].response;
+ break;
+ }
+ }
+ }
+
+ if (request.readyState !== 4) {
+ this.log(response, request);
+
+ request.respond(response[0], response[1], response[2]);
+ }
+ } catch (e) {
+ sinon.logError("Fake server request processing", e);
+ }
+ },
+
+ restore: function restore() {
+ return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments);
+ }
+ };
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ function loadDependencies(require, exports, module) {
+ var sinon = require("./core");
+ require("./fake_xdomain_request");
+ require("./fake_xml_http_request");
+ require("../format");
+ makeApi(sinon);
+ module.exports = sinon;
+ }
+
+ if (isAMD) {
+ define(loadDependencies);
+ } else if (isNode) {
+ loadDependencies(require, module.exports, module);
+ } else {
+ makeApi(sinon); // eslint-disable-line no-undef
+ }
+}());
+
+/**
+ * @depend fake_server.js
+ * @depend fake_timers.js
+ */
+/**
+ * Add-on for sinon.fakeServer that automatically handles a fake timer along with
+ * the FakeXMLHttpRequest. The direct inspiration for this add-on is jQuery
+ * 1.3.x, which does not use xhr object's onreadystatehandler at all - instead,
+ * it polls the object for completion with setInterval. Dispite the direct
+ * motivation, there is nothing jQuery-specific in this file, so it can be used
+ * in any environment where the ajax implementation depends on setInterval or
+ * setTimeout.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function () {
+
+ function makeApi(sinon) {
+ function Server() {}
+ Server.prototype = sinon.fakeServer;
+
+ sinon.fakeServerWithClock = new Server();
+
+ sinon.fakeServerWithClock.addRequest = function addRequest(xhr) {
+ if (xhr.async) {
+ if (typeof setTimeout.clock === "object") {
+ this.clock = setTimeout.clock;
+ } else {
+ this.clock = sinon.useFakeTimers();
+ this.resetClock = true;
+ }
+
+ if (!this.longestTimeout) {
+ var clockSetTimeout = this.clock.setTimeout;
+ var clockSetInterval = this.clock.setInterval;
+ var server = this;
+
+ this.clock.setTimeout = function (fn, timeout) {
+ server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);
+
+ return clockSetTimeout.apply(this, arguments);
+ };
+
+ this.clock.setInterval = function (fn, timeout) {
+ server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);
+
+ return clockSetInterval.apply(this, arguments);
+ };
+ }
+ }
+
+ return sinon.fakeServer.addRequest.call(this, xhr);
+ };
+
+ sinon.fakeServerWithClock.respond = function respond() {
+ var returnVal = sinon.fakeServer.respond.apply(this, arguments);
+
+ if (this.clock) {
+ this.clock.tick(this.longestTimeout || 0);
+ this.longestTimeout = 0;
+
+ if (this.resetClock) {
+ this.clock.restore();
+ this.resetClock = false;
+ }
+ }
+
+ return returnVal;
+ };
+
+ sinon.fakeServerWithClock.restore = function restore() {
+ if (this.clock) {
+ this.clock.restore();
+ }
+
+ return sinon.fakeServer.restore.apply(this, arguments);
+ };
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ function loadDependencies(require) {
+ var sinon = require("./core");
+ require("./fake_server");
+ require("./fake_timers");
+ makeApi(sinon);
+ }
+
+ if (isAMD) {
+ define(loadDependencies);
+ } else if (isNode) {
+ loadDependencies(require);
+ } else {
+ makeApi(sinon); // eslint-disable-line no-undef
+ }
+}());
+
+/**
+ * @depend util/core.js
+ * @depend extend.js
+ * @depend collection.js
+ * @depend util/fake_timers.js
+ * @depend util/fake_server_with_clock.js
+ */
+/**
+ * Manages fake collections as well as fake utilities such as Sinon's
+ * timers and fake XHR implementation in one convenient object.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal) {
+
+ function makeApi(sinon) {
+ var push = [].push;
+
+ function exposeValue(sandbox, config, key, value) {
+ if (!value) {
+ return;
+ }
+
+ if (config.injectInto && !(key in config.injectInto)) {
+ config.injectInto[key] = value;
+ sandbox.injectedKeys.push(key);
+ } else {
+ push.call(sandbox.args, value);
+ }
+ }
+
+ function prepareSandboxFromConfig(config) {
+ var sandbox = sinon.create(sinon.sandbox);
+
+ if (config.useFakeServer) {
+ if (typeof config.useFakeServer === "object") {
+ sandbox.serverPrototype = config.useFakeServer;
+ }
+
+ sandbox.useFakeServer();
+ }
+
+ if (config.useFakeTimers) {
+ if (typeof config.useFakeTimers === "object") {
+ sandbox.useFakeTimers.apply(sandbox, config.useFakeTimers);
+ } else {
+ sandbox.useFakeTimers();
+ }
+ }
+
+ return sandbox;
+ }
+
+ sinon.sandbox = sinon.extend(sinon.create(sinon.collection), {
+ useFakeTimers: function useFakeTimers() {
+ this.clock = sinon.useFakeTimers.apply(sinon, arguments);
+
+ return this.add(this.clock);
+ },
+
+ serverPrototype: sinon.fakeServer,
+
+ useFakeServer: function useFakeServer() {
+ var proto = this.serverPrototype || sinon.fakeServer;
+
+ if (!proto || !proto.create) {
+ return null;
+ }
+
+ this.server = proto.create();
+ return this.add(this.server);
+ },
+
+ inject: function (obj) {
+ sinon.collection.inject.call(this, obj);
+
+ if (this.clock) {
+ obj.clock = this.clock;
+ }
+
+ if (this.server) {
+ obj.server = this.server;
+ obj.requests = this.server.requests;
+ }
+
+ obj.match = sinon.match;
+
+ return obj;
+ },
+
+ restore: function () {
+ sinon.collection.restore.apply(this, arguments);
+ this.restoreContext();
+ },
+
+ restoreContext: function () {
+ if (this.injectedKeys) {
+ for (var i = 0, j = this.injectedKeys.length; i < j; i++) {
+ delete this.injectInto[this.injectedKeys[i]];
+ }
+ this.injectedKeys = [];
+ }
+ },
+
+ create: function (config) {
+ if (!config) {
+ return sinon.create(sinon.sandbox);
+ }
+
+ var sandbox = prepareSandboxFromConfig(config);
+ sandbox.args = sandbox.args || [];
+ sandbox.injectedKeys = [];
+ sandbox.injectInto = config.injectInto;
+ var prop,
+ value;
+ var exposed = sandbox.inject({});
+
+ if (config.properties) {
+ for (var i = 0, l = config.properties.length; i < l; i++) {
+ prop = config.properties[i];
+ value = exposed[prop] || prop === "sandbox" && sandbox;
+ exposeValue(sandbox, config, prop, value);
+ }
+ } else {
+ exposeValue(sandbox, config, "sandbox", value);
+ }
+
+ return sandbox;
+ },
+
+ match: sinon.match
+ });
+
+ sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer;
+
+ return sinon.sandbox;
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ function loadDependencies(require, exports, module) {
+ var sinon = require("./util/core");
+ require("./extend");
+ require("./util/fake_server_with_clock");
+ require("./util/fake_timers");
+ require("./collection");
+ module.exports = makeApi(sinon);
+ }
+
+ if (isAMD) {
+ define(loadDependencies);
+ return;
+ }
+
+ if (isNode) {
+ loadDependencies(require, module.exports, module);
+ return;
+ }
+
+ if (sinonGlobal) {
+ makeApi(sinonGlobal);
+ }
+}(
+ typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ * @depend sandbox.js
+ */
+/**
+ * Test function, sandboxes fakes
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal) {
+
+ function makeApi(sinon) {
+ var slice = Array.prototype.slice;
+
+ function test(callback) {
+ var type = typeof callback;
+
+ if (type !== "function") {
+ throw new TypeError("sinon.test needs to wrap a test function, got " + type);
+ }
+
+ function sinonSandboxedTest() {
+ var config = sinon.getConfig(sinon.config);
+ config.injectInto = config.injectIntoThis && this || config.injectInto;
+ var sandbox = sinon.sandbox.create(config);
+ var args = slice.call(arguments);
+ var oldDone = args.length && args[args.length - 1];
+ var exception, result;
+
+ if (typeof oldDone === "function") {
+ args[args.length - 1] = function sinonDone(res) {
+ if (res) {
+ sandbox.restore();
+ } else {
+ sandbox.verifyAndRestore();
+ }
+ oldDone(res);
+ };
+ }
+
+ try {
+ result = callback.apply(this, args.concat(sandbox.args));
+ } catch (e) {
+ exception = e;
+ }
+
+ if (typeof oldDone !== "function") {
+ if (typeof exception !== "undefined") {
+ sandbox.restore();
+ throw exception;
+ } else {
+ sandbox.verifyAndRestore();
+ }
+ }
+
+ return result;
+ }
+
+ if (callback.length) {
+ return function sinonAsyncSandboxedTest(done) { // eslint-disable-line no-unused-vars
+ return sinonSandboxedTest.apply(this, arguments);
+ };
+ }
+
+ return sinonSandboxedTest;
+ }
+
+ test.config = {
+ injectIntoThis: true,
+ injectInto: null,
+ properties: ["spy", "stub", "mock", "clock", "server", "requests"],
+ useFakeTimers: true,
+ useFakeServer: true
+ };
+
+ sinon.test = test;
+ return test;
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ function loadDependencies(require, exports, module) {
+ var core = require("./util/core");
+ require("./sandbox");
+ module.exports = makeApi(core);
+ }
+
+ if (isAMD) {
+ define(loadDependencies);
+ } else if (isNode) {
+ loadDependencies(require, module.exports, module);
+ } else if (sinonGlobal) {
+ makeApi(sinonGlobal);
+ }
+}(typeof sinon === "object" && sinon || null)); // eslint-disable-line no-undef
+
+/**
+ * @depend util/core.js
+ * @depend test.js
+ */
+/**
+ * Test case, sandboxes all test functions
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal) {
+
+ function createTest(property, setUp, tearDown) {
+ return function () {
+ if (setUp) {
+ setUp.apply(this, arguments);
+ }
+
+ var exception, result;
+
+ try {
+ result = property.apply(this, arguments);
+ } catch (e) {
+ exception = e;
+ }
+
+ if (tearDown) {
+ tearDown.apply(this, arguments);
+ }
+
+ if (exception) {
+ throw exception;
+ }
+
+ return result;
+ };
+ }
+
+ function makeApi(sinon) {
+ function testCase(tests, prefix) {
+ if (!tests || typeof tests !== "object") {
+ throw new TypeError("sinon.testCase needs an object with test functions");
+ }
+
+ prefix = prefix || "test";
+ var rPrefix = new RegExp("^" + prefix);
+ var methods = {};
+ var setUp = tests.setUp;
+ var tearDown = tests.tearDown;
+ var testName,
+ property,
+ method;
+
+ for (testName in tests) {
+ if (tests.hasOwnProperty(testName) && !/^(setUp|tearDown)$/.test(testName)) {
+ property = tests[testName];
+
+ if (typeof property === "function" && rPrefix.test(testName)) {
+ method = property;
+
+ if (setUp || tearDown) {
+ method = createTest(property, setUp, tearDown);
+ }
+
+ methods[testName] = sinon.test(method);
+ } else {
+ methods[testName] = tests[testName];
+ }
+ }
+ }
+
+ return methods;
+ }
+
+ sinon.testCase = testCase;
+ return testCase;
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ function loadDependencies(require, exports, module) {
+ var core = require("./util/core");
+ require("./test");
+ module.exports = makeApi(core);
+ }
+
+ if (isAMD) {
+ define(loadDependencies);
+ return;
+ }
+
+ if (isNode) {
+ loadDependencies(require, module.exports, module);
+ return;
+ }
+
+ if (sinonGlobal) {
+ makeApi(sinonGlobal);
+ }
+}(
+ typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend times_in_words.js
+ * @depend util/core.js
+ * @depend match.js
+ * @depend format.js
+ */
+/**
+ * Assertions matching the test spy retrieval interface.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal, global) {
+
+ var slice = Array.prototype.slice;
+
+ function makeApi(sinon) {
+ var assert;
+
+ function verifyIsStub() {
+ var method;
+
+ for (var i = 0, l = arguments.length; i < l; ++i) {
+ method = arguments[i];
+
+ if (!method) {
+ assert.fail("fake is not a spy");
+ }
+
+ if (method.proxy && method.proxy.isSinonProxy) {
+ verifyIsStub(method.proxy);
+ } else {
+ if (typeof method !== "function") {
+ assert.fail(method + " is not a function");
+ }
+
+ if (typeof method.getCall !== "function") {
+ assert.fail(method + " is not stubbed");
+ }
+ }
+
+ }
+ }
+
+ function failAssertion(object, msg) {
+ object = object || global;
+ var failMethod = object.fail || assert.fail;
+ failMethod.call(object, msg);
+ }
+
+ function mirrorPropAsAssertion(name, method, message) {
+ if (arguments.length === 2) {
+ message = method;
+ method = name;
+ }
+
+ assert[name] = function (fake) {
+ verifyIsStub(fake);
+
+ var args = slice.call(arguments, 1);
+ var failed = false;
+
+ if (typeof method === "function") {
+ failed = !method(fake);
+ } else {
+ failed = typeof fake[method] === "function" ?
+ !fake[method].apply(fake, args) : !fake[method];
+ }
+
+ if (failed) {
+ failAssertion(this, (fake.printf || fake.proxy.printf).apply(fake, [message].concat(args)));
+ } else {
+ assert.pass(name);
+ }
+ };
+ }
+
+ function exposedName(prefix, prop) {
+ return !prefix || /^fail/.test(prop) ? prop :
+ prefix + prop.slice(0, 1).toUpperCase() + prop.slice(1);
+ }
+
+ assert = {
+ failException: "AssertError",
+
+ fail: function fail(message) {
+ var error = new Error(message);
+ error.name = this.failException || assert.failException;
+
+ throw error;
+ },
+
+ pass: function pass() {},
+
+ callOrder: function assertCallOrder() {
+ verifyIsStub.apply(null, arguments);
+ var expected = "";
+ var actual = "";
+
+ if (!sinon.calledInOrder(arguments)) {
+ try {
+ expected = [].join.call(arguments, ", ");
+ var calls = slice.call(arguments);
+ var i = calls.length;
+ while (i) {
+ if (!calls[--i].called) {
+ calls.splice(i, 1);
+ }
+ }
+ actual = sinon.orderByFirstCall(calls).join(", ");
+ } catch (e) {
+ // If this fails, we'll just fall back to the blank string
+ }
+
+ failAssertion(this, "expected " + expected + " to be " +
+ "called in order but were called as " + actual);
+ } else {
+ assert.pass("callOrder");
+ }
+ },
+
+ callCount: function assertCallCount(method, count) {
+ verifyIsStub(method);
+
+ if (method.callCount !== count) {
+ var msg = "expected %n to be called " + sinon.timesInWords(count) +
+ " but was called %c%C";
+ failAssertion(this, method.printf(msg));
+ } else {
+ assert.pass("callCount");
+ }
+ },
+
+ expose: function expose(target, options) {
+ if (!target) {
+ throw new TypeError("target is null or undefined");
+ }
+
+ var o = options || {};
+ var prefix = typeof o.prefix === "undefined" && "assert" || o.prefix;
+ var includeFail = typeof o.includeFail === "undefined" || !!o.includeFail;
+
+ for (var method in this) {
+ if (method !== "expose" && (includeFail || !/^(fail)/.test(method))) {
+ target[exposedName(prefix, method)] = this[method];
+ }
+ }
+
+ return target;
+ },
+
+ match: function match(actual, expectation) {
+ var matcher = sinon.match(expectation);
+ if (matcher.test(actual)) {
+ assert.pass("match");
+ } else {
+ var formatted = [
+ "expected value to match",
+ " expected = " + sinon.format(expectation),
+ " actual = " + sinon.format(actual)
+ ];
+
+ failAssertion(this, formatted.join("\n"));
+ }
+ }
+ };
+
+ mirrorPropAsAssertion("called", "expected %n to have been called at least once but was never called");
+ mirrorPropAsAssertion("notCalled", function (spy) {
+ return !spy.called;
+ }, "expected %n to not have been called but was called %c%C");
+ mirrorPropAsAssertion("calledOnce", "expected %n to be called once but was called %c%C");
+ mirrorPropAsAssertion("calledTwice", "expected %n to be called twice but was called %c%C");
+ mirrorPropAsAssertion("calledThrice", "expected %n to be called thrice but was called %c%C");
+ mirrorPropAsAssertion("calledOn", "expected %n to be called with %1 as this but was called with %t");
+ mirrorPropAsAssertion(
+ "alwaysCalledOn",
+ "expected %n to always be called with %1 as this but was called with %t"
+ );
+ mirrorPropAsAssertion("calledWithNew", "expected %n to be called with new");
+ mirrorPropAsAssertion("alwaysCalledWithNew", "expected %n to always be called with new");
+ mirrorPropAsAssertion("calledWith", "expected %n to be called with arguments %*%C");
+ mirrorPropAsAssertion("calledWithMatch", "expected %n to be called with match %*%C");
+ mirrorPropAsAssertion("alwaysCalledWith", "expected %n to always be called with arguments %*%C");
+ mirrorPropAsAssertion("alwaysCalledWithMatch", "expected %n to always be called with match %*%C");
+ mirrorPropAsAssertion("calledWithExactly", "expected %n to be called with exact arguments %*%C");
+ mirrorPropAsAssertion("alwaysCalledWithExactly", "expected %n to always be called with exact arguments %*%C");
+ mirrorPropAsAssertion("neverCalledWith", "expected %n to never be called with arguments %*%C");
+ mirrorPropAsAssertion("neverCalledWithMatch", "expected %n to never be called with match %*%C");
+ mirrorPropAsAssertion("threw", "%n did not throw exception%C");
+ mirrorPropAsAssertion("alwaysThrew", "%n did not always throw exception%C");
+
+ sinon.assert = assert;
+ return assert;
+ }
+
+ var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+ var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+ function loadDependencies(require, exports, module) {
+ var sinon = require("./util/core");
+ require("./match");
+ require("./format");
+ module.exports = makeApi(sinon);
+ }
+
+ if (isAMD) {
+ define(loadDependencies);
+ return;
+ }
+
+ if (isNode) {
+ loadDependencies(require, module.exports, module);
+ return;
+ }
+
+ if (sinonGlobal) {
+ makeApi(sinonGlobal);
+ }
+}(
+ typeof sinon === "object" && sinon, // eslint-disable-line no-undef
+ typeof global !== "undefined" ? global : self
+));
+
+ return sinon;
+}));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/.bower.json
new file mode 100644
index 00000000000..7edb13dc76e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/.bower.json
@@ -0,0 +1,37 @@
+{
+ "name": "stacky",
+ "description": "Stacky parses stack traces from various sources, and formats them in readable ways.",
+ "main": "browser.js",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "ignore": [
+ "*",
+ "!/lib/*.js",
+ "!/LICENSE",
+ "!/browser.js"
+ ],
+ "license": "BSD-3-Clause",
+ "keywords": [
+ "stack",
+ "trace",
+ "error",
+ "stack parser",
+ "trace parser"
+ ],
+ "homepage": "https://github.com/PolymerLabs/stacky",
+ "moduleType": [
+ "amd",
+ "globals"
+ ],
+ "version": "1.3.2",
+ "_release": "1.3.2",
+ "_resolution": {
+ "type": "version",
+ "tag": "v1.3.2",
+ "commit": "fa297bb077559544c56b4a123c05df2ff97e9fdc"
+ },
+ "_source": "https://github.com/PolymerLabs/stacky.git",
+ "_target": "^1.3.0",
+ "_originalSource": "stacky"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/LICENSE b/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/LICENSE
new file mode 100644
index 00000000000..322c5a866e2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2014 The Polymer Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/bower.json
new file mode 100644
index 00000000000..c3f0f7a23f4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/bower.json
@@ -0,0 +1,28 @@
+{
+ "name": "stacky",
+ "description": "Stacky parses stack traces from various sources, and formats them in readable ways.",
+ "main": "browser.js",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "ignore": [
+ "*",
+ "!/lib/*.js",
+ "!/LICENSE",
+ "!/browser.js"
+ ],
+ "license": "BSD-3-Clause",
+ "keywords": [
+ "stack",
+ "trace",
+ "error",
+ "stack parser",
+ "trace parser"
+ ],
+ "homepage": "https://github.com/PolymerLabs/stacky",
+ "moduleType": [
+ "amd",
+ "globals"
+ ],
+ "version": "1.3.2"
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/browser.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/browser.js
new file mode 100644
index 00000000000..7cbd20251bc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/browser.js
@@ -0,0 +1,346 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Stacky = f()}})(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);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+/**
+ * @license
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ *
+ * This code may only be used under the BSD style license found at polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also subject to
+ * an additional IP rights grant found at polymer.github.io/PATENTS.txt
+ */
+(function(scope) {
+'use strict';
+
+var parse = scope.parse || require('./parsing').parse;
+
+scope.defaults = {
+ // Methods are aligned up to this much padding.
+ maxMethodPadding: 40,
+ // A string to prefix each line with.
+ indent: '',
+ // A string to show for stack lines that are missing a method.
+ methodPlaceholder: '<unknown>',
+ // A list of Strings/RegExps that will be stripped from `location` values on
+ // each line (via `String#replace`).
+ locationStrip: [],
+ // A list of Strings/RegExps that indicate that a line is *not* important, and
+ // should be styled as such.
+ unimportantLocation: [],
+ // A filter function to completely remove lines
+ filter: function() { return false; },
+ // styles are functions that take a string and return that string when styled.
+ styles: {
+ method: passthrough,
+ location: passthrough,
+ line: passthrough,
+ column: passthrough,
+ unimportant: passthrough,
+ },
+};
+
+// See Tero Tolonen's answer at
+// http://stackoverflow.com/questions/17575790/environment-detection-node-js-or-browser
+/*jshint -W054 */
+var isNode = new Function('try {return this===global;}catch(e){return false;}');
+
+// For Stacky-in-Node, we default to colored stacks.
+if (isNode()) {
+ var chalk = require('chalk');
+
+ scope.defaults.styles = {
+ method: chalk.magenta,
+ location: chalk.blue,
+ line: chalk.cyan,
+ column: chalk.cyan,
+ unimportant: chalk.dim
+ };
+}
+
+
+function pretty(stackOrParsed, options) {
+ options = mergeDefaults(options || {}, scope.defaults);
+ var lines = Array.isArray(stackOrParsed) ? stackOrParsed : parse(stackOrParsed);
+ lines = clean(lines, options);
+
+ var padSize = methodPadding(lines, options);
+ var parts = lines.map(function(line) {
+ var method = line.method || options.methodPlaceholder;
+ var pad = options.indent + padding(padSize - method.length);
+
+ var locationBits = [
+ options.styles.location(line.location),
+ options.styles.line(line.line),
+ ];
+ if ('column' in line) {
+ locationBits.push(options.styles.column(line.column));
+ }
+ var location = locationBits.join(':');
+
+ var text = pad + options.styles.method(method) + ' at ' + location;
+ if (!line.important) {
+ text = options.styles.unimportant(text);
+ }
+ return text;
+ });
+
+ return parts.join('\n');
+}
+
+function clean(lines, options) {
+ var result = [];
+ for (var i = 0, line; line = lines[i]; i++) {
+ if (options.filter(line)) continue;
+ line.location = cleanLocation(line.location, options);
+ line.important = isImportant(line, options);
+ result.push(line);
+ }
+
+ return result;
+}
+
+// Utility
+
+function passthrough(string) {
+ return string;
+}
+
+function mergeDefaults(options, defaults) {
+ var result = Object.create(defaults);
+ Object.keys(options).forEach(function(key) {
+ var value = options[key];
+ if (typeof value === 'object' && !Array.isArray(value)) {
+ value = mergeDefaults(value, defaults[key]);
+ }
+ result[key] = value;
+ });
+ return result;
+}
+
+function methodPadding(lines, options) {
+ var size = options.methodPlaceholder.length;
+ for (var i = 0, line; line = lines[i]; i++) {
+ size = Math.min(options.maxMethodPadding, Math.max(size, line.method.length));
+ }
+ return size;
+}
+
+function padding(length) {
+ var result = '';
+ for (var i = 0; i < length; i++) {
+ result = result + ' ';
+ }
+ return result;
+}
+
+function cleanLocation(location, options) {
+ if (options.locationStrip) {
+ for (var i = 0, matcher; matcher = options.locationStrip[i]; i++) {
+ location = location.replace(matcher, '');
+ }
+ }
+
+ return location;
+}
+
+function isImportant(line, options) {
+ if (options.unimportantLocation) {
+ for (var i = 0, matcher; matcher = options.unimportantLocation[i]; i++) {
+ if (line.location.match(matcher)) return false;
+ }
+ }
+
+ return true;
+}
+
+scope.clean = clean;
+scope.pretty = pretty;
+})(typeof module !== 'undefined' ? module.exports : (this.Stacky = this.Stacky || {}));
+
+
+},{"./parsing":4,"chalk":undefined}],2:[function(require,module,exports){
+/**
+ * @license
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ *
+ * This code may only be used under the BSD style license found at polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also subject to
+ * an additional IP rights grant found at polymer.github.io/PATENTS.txt
+ */
+'use strict';
+
+var formatting = require('./formatting');
+var normalization = require('./normalization');
+var parsing = require('./parsing');
+
+module.exports = {
+ // Shorthands for your convenience.
+ normalize: normalization.normalize,
+ parse: parsing.parse,
+ pretty: formatting.pretty,
+ // Or the full modules.
+ formatting: formatting,
+ normalization: normalization,
+ parsing: parsing,
+};
+
+},{"./formatting":1,"./normalization":3,"./parsing":4}],3:[function(require,module,exports){
+/**
+ * @license
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ *
+ * This code may only be used under the BSD style license found at polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also subject to
+ * an additional IP rights grant found at polymer.github.io/PATENTS.txt
+ */
+(function(scope) {
+'use strict';
+
+var parse = scope.parse || require('./parsing').parse;
+var pretty = scope.pretty || require('./formatting').pretty;
+
+function normalize(error, prettyOptions) {
+ if (error.parsedStack) return error;
+ var message = error.message || error.description || error || '<unknown error>';
+ var parsedStack = [];
+ try {
+ parsedStack = parse(error.stack || error.toString());
+ } catch (error) {
+ // Ah well.
+ }
+
+ if (parsedStack.length === 0 && error.fileName) {
+ parsedStack.push({
+ method: '',
+ location: error.fileName,
+ line: error.lineNumber,
+ column: error.columnNumber,
+ });
+ }
+
+ if (!prettyOptions || !prettyOptions.showColumns) {
+ for (var i = 0, line; line = parsedStack[i]; i++) {
+ delete line.column;
+ }
+ }
+
+ var prettyStack = message;
+ if (parsedStack.length > 0) {
+ prettyStack = prettyStack + '\n' + pretty(parsedStack, prettyOptions);
+ }
+
+ var cleanErr = Object.create(Error.prototype);
+ cleanErr.message = message;
+ cleanErr.stack = prettyStack;
+ cleanErr.parsedStack = parsedStack;
+
+ return cleanErr;
+}
+
+scope.normalize = normalize;
+})(typeof module !== 'undefined' ? module.exports : (this.Stacky = this.Stacky || {}));
+
+
+},{"./formatting":1,"./parsing":4}],4:[function(require,module,exports){
+/**
+ * @license
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ *
+ * This code may only be used under the BSD style license found at polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also subject to
+ * an additional IP rights grant found at polymer.github.io/PATENTS.txt
+ */
+(function(scope) {
+'use strict';
+
+function parse(stack) {
+ var rawLines = stack.split('\n');
+
+ var stackyLines = compact(rawLines.map(parseStackyLine));
+ if (stackyLines.length === rawLines.length) return stackyLines;
+
+ var v8Lines = compact(rawLines.map(parseV8Line));
+ if (v8Lines.length > 0) return v8Lines;
+
+ var geckoLines = compact(rawLines.map(parseGeckoLine));
+ if (geckoLines.length > 0) return geckoLines;
+
+ throw new Error('Unknown stack format: ' + stack);
+}
+
+// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/Stack
+var GECKO_LINE = /^(?:([^@]*)@)?(.*?):(\d+)(?::(\d+))?$/;
+
+function parseGeckoLine(line) {
+ var match = line.match(GECKO_LINE);
+ if (!match) return null;
+ return {
+ method: match[1] || '',
+ location: match[2] || '',
+ line: parseInt(match[3]) || 0,
+ column: parseInt(match[4]) || 0,
+ };
+}
+
+// https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi
+var V8_OUTER1 = /^\s*(eval )?at (.*) \((.*)\)$/;
+var V8_OUTER2 = /^\s*at()() (\S+)$/;
+var V8_INNER = /^\(?([^\(]+):(\d+):(\d+)\)?$/;
+
+function parseV8Line(line) {
+ var outer = line.match(V8_OUTER1) || line.match(V8_OUTER2);
+ if (!outer) return null;
+ var inner = outer[3].match(V8_INNER);
+ if (!inner) return null;
+
+ var method = outer[2] || '';
+ if (outer[1]) method = 'eval at ' + method;
+ return {
+ method: method,
+ location: inner[1] || '',
+ line: parseInt(inner[2]) || 0,
+ column: parseInt(inner[3]) || 0,
+ };
+}
+
+// Stacky.formatting.pretty
+
+var STACKY_LINE = /^\s*(.+) at (.+):(\d+):(\d+)$/;
+
+function parseStackyLine(line) {
+ var match = line.match(STACKY_LINE);
+ if (!match) return null;
+ return {
+ method: match[1] || '',
+ location: match[2] || '',
+ line: parseInt(match[3]) || 0,
+ column: parseInt(match[4]) || 0,
+ };
+}
+
+// Helpers
+
+function compact(array) {
+ var result = [];
+ array.forEach(function(value) {
+ if (value) {
+ result.push(value);
+ }
+ });
+ return result;
+}
+
+scope.parse = parse;
+scope.parseGeckoLine = parseGeckoLine;
+scope.parseV8Line = parseV8Line;
+scope.parseStackyLine = parseStackyLine;
+})(typeof module !== 'undefined' ? module.exports : (this.Stacky = this.Stacky || {}));
+
+},{}]},{},[2])(2)
+}); \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/lib/formatting.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/lib/formatting.js
new file mode 100644
index 00000000000..651cf3c4e3d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/lib/formatting.js
@@ -0,0 +1,158 @@
+/**
+ * @license
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ *
+ * This code may only be used under the BSD style license found at polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also subject to
+ * an additional IP rights grant found at polymer.github.io/PATENTS.txt
+ */
+(function(scope) {
+'use strict';
+
+var parse = scope.parse || require('./parsing').parse;
+
+scope.defaults = {
+ // Methods are aligned up to this much padding.
+ maxMethodPadding: 40,
+ // A string to prefix each line with.
+ indent: '',
+ // A string to show for stack lines that are missing a method.
+ methodPlaceholder: '<unknown>',
+ // A list of Strings/RegExps that will be stripped from `location` values on
+ // each line (via `String#replace`).
+ locationStrip: [],
+ // A list of Strings/RegExps that indicate that a line is *not* important, and
+ // should be styled as such.
+ unimportantLocation: [],
+ // A filter function to completely remove lines
+ filter: function() { return false; },
+ // styles are functions that take a string and return that string when styled.
+ styles: {
+ method: passthrough,
+ location: passthrough,
+ line: passthrough,
+ column: passthrough,
+ unimportant: passthrough,
+ },
+};
+
+// See Tero Tolonen's answer at
+// http://stackoverflow.com/questions/17575790/environment-detection-node-js-or-browser
+/*jshint -W054 */
+var isNode = new Function('try {return this===global;}catch(e){return false;}');
+
+// For Stacky-in-Node, we default to colored stacks.
+if (isNode()) {
+ var chalk = require('chalk');
+
+ scope.defaults.styles = {
+ method: chalk.magenta,
+ location: chalk.blue,
+ line: chalk.cyan,
+ column: chalk.cyan,
+ unimportant: chalk.dim
+ };
+}
+
+
+function pretty(stackOrParsed, options) {
+ options = mergeDefaults(options || {}, scope.defaults);
+ var lines = Array.isArray(stackOrParsed) ? stackOrParsed : parse(stackOrParsed);
+ lines = clean(lines, options);
+
+ var padSize = methodPadding(lines, options);
+ var parts = lines.map(function(line) {
+ var method = line.method || options.methodPlaceholder;
+ var pad = options.indent + padding(padSize - method.length);
+
+ var locationBits = [
+ options.styles.location(line.location),
+ options.styles.line(line.line),
+ ];
+ if ('column' in line) {
+ locationBits.push(options.styles.column(line.column));
+ }
+ var location = locationBits.join(':');
+
+ var text = pad + options.styles.method(method) + ' at ' + location;
+ if (!line.important) {
+ text = options.styles.unimportant(text);
+ }
+ return text;
+ });
+
+ return parts.join('\n');
+}
+
+function clean(lines, options) {
+ var result = [];
+ for (var i = 0, line; line = lines[i]; i++) {
+ if (options.filter(line)) continue;
+ line.location = cleanLocation(line.location, options);
+ line.important = isImportant(line, options);
+ result.push(line);
+ }
+
+ return result;
+}
+
+// Utility
+
+function passthrough(string) {
+ return string;
+}
+
+function mergeDefaults(options, defaults) {
+ var result = Object.create(defaults);
+ Object.keys(options).forEach(function(key) {
+ var value = options[key];
+ if (typeof value === 'object' && !Array.isArray(value)) {
+ value = mergeDefaults(value, defaults[key]);
+ }
+ result[key] = value;
+ });
+ return result;
+}
+
+function methodPadding(lines, options) {
+ var size = options.methodPlaceholder.length;
+ for (var i = 0, line; line = lines[i]; i++) {
+ size = Math.min(options.maxMethodPadding, Math.max(size, line.method.length));
+ }
+ return size;
+}
+
+function padding(length) {
+ var result = '';
+ for (var i = 0; i < length; i++) {
+ result = result + ' ';
+ }
+ return result;
+}
+
+function cleanLocation(location, options) {
+ if (options.locationStrip) {
+ for (var i = 0, matcher; matcher = options.locationStrip[i]; i++) {
+ location = location.replace(matcher, '');
+ }
+ }
+
+ return location;
+}
+
+function isImportant(line, options) {
+ if (options.unimportantLocation) {
+ for (var i = 0, matcher; matcher = options.unimportantLocation[i]; i++) {
+ if (line.location.match(matcher)) return false;
+ }
+ }
+
+ return true;
+}
+
+scope.clean = clean;
+scope.pretty = pretty;
+})(typeof module !== 'undefined' ? module.exports : (this.Stacky = this.Stacky || {}));
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/lib/index.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/lib/index.js
new file mode 100644
index 00000000000..4cfc16ac2db
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/lib/index.js
@@ -0,0 +1,26 @@
+/**
+ * @license
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ *
+ * This code may only be used under the BSD style license found at polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also subject to
+ * an additional IP rights grant found at polymer.github.io/PATENTS.txt
+ */
+'use strict';
+
+var formatting = require('./formatting');
+var normalization = require('./normalization');
+var parsing = require('./parsing');
+
+module.exports = {
+ // Shorthands for your convenience.
+ normalize: normalization.normalize,
+ parse: parsing.parse,
+ pretty: formatting.pretty,
+ // Or the full modules.
+ formatting: formatting,
+ normalization: normalization,
+ parsing: parsing,
+};
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/lib/normalization.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/lib/normalization.js
new file mode 100644
index 00000000000..ac3bb92ec9f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/lib/normalization.js
@@ -0,0 +1,57 @@
+/**
+ * @license
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ *
+ * This code may only be used under the BSD style license found at polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also subject to
+ * an additional IP rights grant found at polymer.github.io/PATENTS.txt
+ */
+(function(scope) {
+'use strict';
+
+var parse = scope.parse || require('./parsing').parse;
+var pretty = scope.pretty || require('./formatting').pretty;
+
+function normalize(error, prettyOptions) {
+ if (error.parsedStack) return error;
+ var message = error.message || error.description || error || '<unknown error>';
+ var parsedStack = [];
+ try {
+ parsedStack = parse(error.stack || error.toString());
+ } catch (error) {
+ // Ah well.
+ }
+
+ if (parsedStack.length === 0 && error.fileName) {
+ parsedStack.push({
+ method: '',
+ location: error.fileName,
+ line: error.lineNumber,
+ column: error.columnNumber,
+ });
+ }
+
+ if (!prettyOptions || !prettyOptions.showColumns) {
+ for (var i = 0, line; line = parsedStack[i]; i++) {
+ delete line.column;
+ }
+ }
+
+ var prettyStack = message;
+ if (parsedStack.length > 0) {
+ prettyStack = prettyStack + '\n' + pretty(parsedStack, prettyOptions);
+ }
+
+ var cleanErr = Object.create(Error.prototype);
+ cleanErr.message = message;
+ cleanErr.stack = prettyStack;
+ cleanErr.parsedStack = parsedStack;
+
+ return cleanErr;
+}
+
+scope.normalize = normalize;
+})(typeof module !== 'undefined' ? module.exports : (this.Stacky = this.Stacky || {}));
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/lib/parsing.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/lib/parsing.js
new file mode 100644
index 00000000000..bb2613b6ff3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/stacky/lib/parsing.js
@@ -0,0 +1,95 @@
+/**
+ * @license
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ *
+ * This code may only be used under the BSD style license found at polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also subject to
+ * an additional IP rights grant found at polymer.github.io/PATENTS.txt
+ */
+(function(scope) {
+'use strict';
+
+function parse(stack) {
+ var rawLines = stack.split('\n');
+
+ var stackyLines = compact(rawLines.map(parseStackyLine));
+ if (stackyLines.length === rawLines.length) return stackyLines;
+
+ var v8Lines = compact(rawLines.map(parseV8Line));
+ if (v8Lines.length > 0) return v8Lines;
+
+ var geckoLines = compact(rawLines.map(parseGeckoLine));
+ if (geckoLines.length > 0) return geckoLines;
+
+ throw new Error('Unknown stack format: ' + stack);
+}
+
+// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/Stack
+var GECKO_LINE = /^(?:([^@]*)@)?(.*?):(\d+)(?::(\d+))?$/;
+
+function parseGeckoLine(line) {
+ var match = line.match(GECKO_LINE);
+ if (!match) return null;
+ return {
+ method: match[1] || '',
+ location: match[2] || '',
+ line: parseInt(match[3]) || 0,
+ column: parseInt(match[4]) || 0,
+ };
+}
+
+// https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi
+var V8_OUTER1 = /^\s*(eval )?at (.*) \((.*)\)$/;
+var V8_OUTER2 = /^\s*at()() (\S+)$/;
+var V8_INNER = /^\(?([^\(]+):(\d+):(\d+)\)?$/;
+
+function parseV8Line(line) {
+ var outer = line.match(V8_OUTER1) || line.match(V8_OUTER2);
+ if (!outer) return null;
+ var inner = outer[3].match(V8_INNER);
+ if (!inner) return null;
+
+ var method = outer[2] || '';
+ if (outer[1]) method = 'eval at ' + method;
+ return {
+ method: method,
+ location: inner[1] || '',
+ line: parseInt(inner[2]) || 0,
+ column: parseInt(inner[3]) || 0,
+ };
+}
+
+// Stacky.formatting.pretty
+
+var STACKY_LINE = /^\s*(.+) at (.+):(\d+):(\d+)$/;
+
+function parseStackyLine(line) {
+ var match = line.match(STACKY_LINE);
+ if (!match) return null;
+ return {
+ method: match[1] || '',
+ location: match[2] || '',
+ line: parseInt(match[3]) || 0,
+ column: parseInt(match[4]) || 0,
+ };
+}
+
+// Helpers
+
+function compact(array) {
+ var result = [];
+ array.forEach(function(value) {
+ if (value) {
+ result.push(value);
+ }
+ });
+ return result;
+}
+
+scope.parse = parse;
+scope.parseGeckoLine = parseGeckoLine;
+scope.parseV8Line = parseV8Line;
+scope.parseStackyLine = parseStackyLine;
+})(typeof module !== 'undefined' ? module.exports : (this.Stacky = this.Stacky || {}));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/.bower.json
new file mode 100644
index 00000000000..05ed1ac33e3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/.bower.json
@@ -0,0 +1,35 @@
+{
+ "name": "test-fixture",
+ "version": "3.0.0",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "A simple element to fixture DOM for tests",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "testing"
+ ],
+ "devDependencies": {
+ "web-component-tester": "^6.0.0-prerelease.5",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0-rc.1"
+ },
+ "variants": {
+ "1.x": {
+ "devDependencies": {
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ }
+ }
+ },
+ "main": "test-fixture.html",
+ "ignore": [],
+ "homepage": "https://github.com/PolymerElements/test-fixture",
+ "_release": "3.0.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v3.0.0",
+ "commit": "05caebd9ecbb464024455923bd351d2ba640932e"
+ },
+ "_source": "https://github.com/PolymerElements/test-fixture.git",
+ "_target": "^3.0.0",
+ "_originalSource": "test-fixture"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..79e7094467b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,33 @@
+<!-- Instructions: https://github.com/PolymerElements/test-fixture/CONTRIBUTING.md#filing-issues -->
+### Description
+<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
+
+### Expected outcome
+
+<!-- Example: The page stays the same color. -->
+
+### Actual outcome
+
+<!-- Example: The page turns pink. -->
+
+### Live Demo
+<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
+
+### Steps to reproduce
+
+<!-- Example
+1. Put a `paper-foo` element in the page.
+2. Open the page in a web browser.
+3. Click the `paper-foo` element.
+-->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] Safari 7
+- [ ] Edge
+- [ ] IE 11
+- [ ] IE 10
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/.travis.yml
new file mode 100644
index 00000000000..15e89b65165
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/.travis.yml
@@ -0,0 +1,21 @@
+language: node_js
+sudo: required
+dist: trusty
+before_script:
+ - npm install -g bower polymer-cli@next
+ - polymer install --variants
+node_js: 6
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+script:
+ - xvfb-run polymer test
+ - if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default'; fi
+env:
+ global:
+ - secure: ahgtHFWqjsRiKiGtnkthNYWM4tz+IcQoA8/kFk+aYXGbljeGHdtdDkaUUsedlTyMdfupCG+Wn0PssEWb6qGsUo3BP9LyfDHL/UEO5//llOWaNTSWr5ztDPgDvOawk6g1y8bmA/2R1Gifhhe1zcLySprzCNMVgq+NFRkKD3maiv8=
+ - secure: i2DBL7MR4aHWO8fRi5m0d8kfujeO8slLe0RIV98snzHnO7wm7q9Wtxmf6rFYKawib1KPe+c4+/sCyECVLHw4r0BBZrN602Qc/8O5WxEeCAjjjMrytGYEKFGhsJRAzzw/M8ZfM2FfHuGdhzkJSqLUqgmf2Nzsmehgw5aUEBRimBo=
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/CONTRIBUTING.md
new file mode 100644
index 00000000000..093090d4354
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+<!--
+This file is autogenerated based on
+https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
+
+If you edit that file, it will get updated everywhere else.
+If you edit this file, your changes will get overridden :)
+
+You can however override the jsbin link with one that's customized to this
+specific element:
+
+jsbin=https://jsbin.com/cagaye/edit?html,output
+-->
+
+# Polymer Elements
+## Guide for Contributors
+
+Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
+
+### Filing Issues
+
+**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
+
+ 1. **Who will use the feature?** _“As someone filling out a form…”_
+ 2. **When will they use the feature?** _“When I enter an invalid value…”_
+ 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
+
+**If you are filing an issue to report a bug**, please provide:
+
+ 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
+
+ ```markdown
+ The `paper-foo` element causes the page to turn pink when clicked.
+
+ ## Expected outcome
+
+ The page stays the same color.
+
+ ## Actual outcome
+
+ The page turns pink.
+
+ ## Steps to reproduce
+
+ 1. Put a `paper-foo` element in the page.
+ 2. Open the page in a web browser.
+ 3. Click the `paper-foo` element.
+ ```
+
+ 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
+
+ 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
+
+### Submitting Pull Requests
+
+**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
+
+When submitting pull requests, please provide:
+
+ 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
+
+ ```markdown
+ (For a single issue)
+ Fixes #20
+
+ (For multiple issues)
+ Fixes #32, fixes #40
+ ```
+
+ 2. **A succinct description of the design** used to fix any related issues. For example:
+
+ ```markdown
+ This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
+ ```
+
+ 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
+
+If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/README.md
new file mode 100644
index 00000000000..594b9c3d227
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/README.md
@@ -0,0 +1,148 @@
+
+<!---
+
+This README is automatically generated from the comments in these files:
+test-fixture.html
+
+Edit those files, and our readme bot will duplicate them over here!
+Edit this file, and the bot will squash your changes :)
+
+The bot does some handling of markdown. Please file a bug if it does the wrong
+thing! https://github.com/PolymerLabs/tedium/issues
+
+-->
+
+[![Build status](https://travis-ci.org/PolymerElements/test-fixture.svg?branch=master)](https://travis-ci.org/PolymerElements/test-fixture)
+
+
+##&lt;test-fixture&gt;
+
+The `<test-fixture>` element can simplify the exercise of consistently
+resetting a test suite's DOM. To use it, wrap the test suite's DOM as a template:
+
+```html
+<test-fixture id="SomeElementFixture">
+ <template>
+ <some-element id="SomeElementForTesting"></some-element>
+ </template>
+</test-fixture>
+```
+
+Now, the `<test-fixture>` element can be used to generate a copy of its
+template:
+
+```html
+<script>
+describe('<some-element>', function () {
+ var someElement;
+
+ beforeEach(function () {
+ document.getElementById('SomeElementFixture').create();
+ someElement = document.getElementById('SomeElementForTesting');
+ });
+});
+</script>
+```
+
+Fixtured elements can be cleaned up by calling `restore` on the `<test-fixture>`:
+
+```javascript
+ afterEach(function () {
+ document.getElementById('SomeElementFixture').restore();
+ // <some-element id='SomeElementForTesting'> has been removed
+ });
+```
+
+`<test-fixture>` will create fixtures from all of its immediate `<template>`
+children. The DOM structure of fixture templates can be as simple or as complex
+as the situation calls for.
+
+## Even simpler usage in Mocha
+
+In Mocha, usage can be simplified even further. Include `test-fixture-mocha.js`
+after Mocha in the `<head>` of your document and then fixture elements like so:
+
+```html
+<script>
+describe('<some-element>', function () {
+ var someElement;
+
+ beforeEach(function () {
+ someElement = fixture('SomeElementFixture');
+ });
+});
+</script>
+```
+
+Fixtured elements will be automatically restored in the `afterEach` phase of the
+current Mocha `Suite`.
+
+## Data-bound templates
+
+Data-binding systems are also supported, as long as your (custom) template
+elements define a `stamp(model)` method that returns a document fragment. This
+allows you to stamp out templates w/ custom models for your fixtures.
+
+For example, using Polymer 0.8's `dom-template`:
+
+```html
+<test-fixture id="bound">
+ <template is="dom-template">
+ <span>{{greeting}}</span>
+ </template>
+</test-fixture>
+```
+
+You can pass an optional context argument to `create()` or `fixture()` to pass
+the model:
+
+```js
+var bound = fixture('bound', {greeting: 'ohai thurr'});
+```
+
+## The problem being addressed
+
+Consider the following `web-component-tester` test suite:
+
+```html
+<!doctype html>
+<html>
+<head>
+ <title>some-element test suite</title>
+
+ <link rel="import" href="../some-element.html">
+</head>
+<body>
+ <some-element id="SomeElementForTesting"></some-element>
+ <script>
+describe('<some-element>', function () {
+ var someElement;
+
+ beforeEach(function () {
+ someElement = document.getElementById('SomeElementForTesting');
+ });
+
+ it('can receive property `foo`', function () {
+ someElement.foo = 'bar';
+ expect(someElement.foo).to.be.equal('bar');
+ });
+
+ it('has a default `foo` value of `undefined`', function () {
+ expect(someElement.foo).to.be.equal(undefined);
+ });
+});
+ </script>
+</body>
+</html>
+```
+
+In this contrived example, the suite will pass or fail depending on which order
+the tests are run in. It is non-deterministic because `someElement` has
+internal state that is not properly reset at the end of each test.
+
+It would be trivial in the above example to simply reset `someElement.foo` to
+the expected default value of `undefined` in an `afterEach` hook. However, for
+non-contrived test suites that target complex elements, this can result in a
+large quantity of ever-growing set-up and tear-down boilerplate.
+
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/bower.json
new file mode 100644
index 00000000000..96d142845f7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/bower.json
@@ -0,0 +1,25 @@
+{
+ "name": "test-fixture",
+ "version": "3.0.0",
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "description": "A simple element to fixture DOM for tests",
+ "keywords": [
+ "web-components",
+ "polymer",
+ "testing"
+ ],
+ "devDependencies": {
+ "web-component-tester": "^6.0.0-prerelease.5",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0-rc.1"
+ },
+ "variants": {
+ "1.x": {
+ "devDependencies": {
+ "web-component-tester": "^4.0.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+ }
+ }
+ },
+ "main": "test-fixture.html",
+ "ignore": []
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/package.json
new file mode 100644
index 00000000000..fe33db4847b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "test-fixture",
+ "version": "3.0.0-rc.1",
+ "description": "A simple element to fixture DOM for tests",
+ "main": "test-fixture.html",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/polymerelements/test-fixture.git"
+ },
+ "keywords": [
+ "web-components",
+ "polymer",
+ "testing"
+ ],
+ "author": "The Polymer Authors",
+ "license": "BSD-3-Clause",
+ "bugs": {
+ "url": "https://github.com/polymerelements/test-fixture/issues"
+ },
+ "homepage": "https://github.com/polymerelements/test-fixture#readme",
+ "devDependencies": {
+ "web-component-tester": "^6.0.0-prerelease.5"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/test-fixture-mocha.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/test-fixture-mocha.js
new file mode 100644
index 00000000000..bef3b76f145
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/test-fixture-mocha.js
@@ -0,0 +1,40 @@
+/**
+ * @license
+ * Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+(function (Mocha) {
+ function extendInterfaceWithFixture (interfaceName) {
+ var originalInterface = Mocha.interfaces[interfaceName];
+ var teardownProperty = interfaceName === 'bdd' ? 'afterEach' : 'teardown';
+
+ Mocha.interfaces[interfaceName] = function (suite) {
+ originalInterface.apply(this, arguments);
+
+ suite.on('pre-require', function (context, file, mocha) {
+ if (!(context[teardownProperty])) {
+ return;
+ }
+
+ context.fixture = function (fixtureId, model) {
+ context[teardownProperty](function () {
+ document
+ .getElementById(fixtureId)
+ .restore();
+ });
+
+ return document
+ .getElementById(fixtureId)
+ .create(model);
+ };
+ });
+ };
+ }
+
+ Object.keys(Mocha.interfaces).forEach(extendInterfaceWithFixture);
+})(this.Mocha);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/test-fixture.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/test-fixture.html
new file mode 100644
index 00000000000..2194e147904
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/test-fixture.html
@@ -0,0 +1,351 @@
+<!--
+@license
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<!--
+
+The `<test-fixture>` element can simplify the exercise of consistently
+resetting a test suite's DOM. To use it, wrap the test suite's DOM as a template:
+
+```html
+<test-fixture id="SomeElementFixture">
+ <template>
+ <some-element id="SomeElementForTesting"></some-element>
+ </template>
+</test-fixture>
+```
+
+Now, the `<test-fixture>` element can be used to generate a copy of its
+template:
+
+```html
+<script>
+describe('<some-element>', function () {
+ var someElement;
+
+ beforeEach(function () {
+ document.getElementById('SomeElementFixture').create();
+ someElement = document.getElementById('SomeElementForTesting');
+ });
+});
+</script>
+```
+
+Fixtured elements can be cleaned up by calling `restore` on the `<test-fixture>`:
+
+```javascript
+ afterEach(function () {
+ document.getElementById('SomeElementFixture').restore();
+ // <some-element id='SomeElementForTesting'> has been removed
+ });
+```
+
+`<test-fixture>` will create fixtures from all of its immediate `<template>`
+children. The DOM structure of fixture templates can be as simple or as complex
+as the situation calls for.
+
+## Even simpler usage in Mocha
+
+In Mocha, usage can be simplified even further. Include `test-fixture-mocha.js`
+after Mocha in the `<head>` of your document and then fixture elements like so:
+
+```html
+<script>
+describe('<some-element>', function () {
+ var someElement;
+
+ beforeEach(function () {
+ someElement = fixture('SomeElementFixture');
+ });
+});
+</script>
+```
+
+Fixtured elements will be automatically restored in the `afterEach` phase of the
+current Mocha `Suite`.
+
+## Data-bound templates
+
+Data-binding systems are also supported, as long as your (custom) template
+elements define a `stamp(model)` method that returns a document fragment. This
+allows you to stamp out templates w/ custom models for your fixtures.
+
+For example, using Polymer 0.8's `dom-template`:
+
+```html
+<test-fixture id="bound">
+ <template is="dom-template">
+ <span>{{greeting}}</span>
+ </template>
+</test-fixture>
+```
+
+You can pass an optional context argument to `create()` or `fixture()` to pass
+the model:
+
+```js
+var bound = fixture('bound', {greeting: 'ohai thurr'});
+```
+
+## The problem being addressed
+
+Consider the following `web-component-tester` test suite:
+
+```html
+<!doctype html>
+<html>
+<head>
+ <title>some-element test suite</title>
+
+ <link rel="import" href="../some-element.html">
+</head>
+<body>
+ <some-element id="SomeElementForTesting"></some-element>
+ <script>
+describe('<some-element>', function () {
+ var someElement;
+
+ beforeEach(function () {
+ someElement = document.getElementById('SomeElementForTesting');
+ });
+
+ it('can receive property `foo`', function () {
+ someElement.foo = 'bar';
+ expect(someElement.foo).to.be.equal('bar');
+ });
+
+ it('has a default `foo` value of `undefined`', function () {
+ expect(someElement.foo).to.be.equal(undefined);
+ });
+});
+ </script>
+</body>
+</html>
+```
+
+In this contrived example, the suite will pass or fail depending on which order
+the tests are run in. It is non-deterministic because `someElement` has
+internal state that is not properly reset at the end of each test.
+
+It would be trivial in the above example to simply reset `someElement.foo` to
+the expected default value of `undefined` in an `afterEach` hook. However, for
+non-contrived test suites that target complex elements, this can result in a
+large quantity of ever-growing set-up and tear-down boilerplate.
+
+@pseudoElement test-fixture
+ -->
+
+<script>
+
+(function () {
+ var TestFixturePrototype = Object.create(HTMLElement.prototype);
+ var TestFixtureExtension = {
+ _fixtureTemplates: null,
+
+ _elementsFixtured: false,
+
+ get elementsFixtured () {
+ return this._elementsFixtured;
+ },
+
+ get fixtureTemplates () {
+ if (!this._fixtureTemplates) {
+ // Copy fixtures to a true Array for Safari 7. This prevents their
+ // `content` property from being improperly garbage collected.
+ this._fixtureTemplates = Array.prototype.slice.apply(this.querySelectorAll('template'));
+ }
+
+ return this._fixtureTemplates;
+ },
+
+ create: function (model) {
+ var generatedDoms = [];
+
+ this.restore();
+
+ this.removeElements(this.fixtureTemplates);
+
+ this.forElements(this.fixtureTemplates, function (fixtureTemplate) {
+ generatedDoms.push(
+ this.createFrom(fixtureTemplate, model)
+ );
+ }, this);
+
+ this.forcePolyfillAttachedStateSynchrony();
+
+ if (generatedDoms.length < 2) {
+ return generatedDoms[0];
+ }
+
+ return generatedDoms;
+ },
+
+ createFrom: function (fixtureTemplate, model) {
+ var fixturedFragment;
+ var fixturedElements;
+ var fixturedElement;
+
+ if (!(fixtureTemplate &&
+ fixtureTemplate.tagName === 'TEMPLATE')) {
+ return;
+ }
+
+ try {
+ fixturedFragment = this.stamp(fixtureTemplate, model);
+ } catch (error) {
+ console.error('Error stamping', fixtureTemplate, error);
+ throw error;
+ }
+
+ fixturedElements = this.collectElementChildren(fixturedFragment);
+
+ this.appendChild(fixturedFragment);
+ this._elementsFixtured = true;
+
+ if (fixturedElements.length < 2) {
+ return fixturedElements[0];
+ }
+
+ return fixturedElements;
+ },
+
+ restore: function () {
+ if (!this._elementsFixtured) {
+ return;
+ }
+
+ this.removeElements(this.children);
+
+ this.forElements(this.fixtureTemplates, function (fixtureTemplate) {
+ this.appendChild(fixtureTemplate);
+ }, this);
+
+ this.generatedDomStack = [];
+
+ this._elementsFixtured = false;
+
+ this.forcePolyfillAttachedStateSynchrony();
+ },
+
+ forcePolyfillAttachedStateSynchrony: function () {
+ // Force synchrony in attachedCallback and detachedCallback where
+ // implemented, in the event that we are dealing with one of these async
+ // polyfills:
+ // 1. Web Components CustomElements polyfill (v1 or v0).
+ if (window.customElements && window.customElements.flush) {
+ window.customElements.flush();
+ } else if (window.CustomElements && window.CustomElements.takeRecords) {
+ window.CustomElements.takeRecords();
+ }
+ // 2. ShadyDOM polyfill.
+ if (window.ShadyDOM && window.ShadyDOM.flush) {
+ window.ShadyDOM.flush();
+ }
+ },
+
+ collectElementChildren: function (parent) {
+ // Note: Safari 7.1 does not support `firstElementChild` or
+ // `nextElementSibling`, so we do things the old-fashioned way:
+ var elements = [];
+ var child = parent.firstChild;
+
+ while (child) {
+ if (child.nodeType === Node.ELEMENT_NODE) {
+ elements.push(child);
+ }
+
+ child = child.nextSibling;
+ }
+
+ return elements;
+ },
+
+ removeElements: function (elements) {
+ this.forElements(elements, function (element) {
+ this.removeChild(element);
+ }, this);
+ },
+
+ forElements: function (elements, iterator, context) {
+ Array.prototype.slice.call(elements)
+ .forEach(iterator, context);
+ },
+
+ stamp: function (fixtureTemplate, model) {
+ var stamped;
+ // Check if we are dealing with a "stampable" `<template>`. This is a
+ // vaguely defined special case of a `<template>` that is a custom
+ // element with a public `stamp` method that implements some manner of
+ // data binding.
+ if (fixtureTemplate.stamp) {
+ stamped = fixtureTemplate.stamp(model);
+ // We leak Polymer specifics a little; if there is an element `root`, we
+ // want that to be returned.
+ stamped = stamped.root || stamped;
+
+ // Otherwise, we fall back to standard HTML templates, which do not have
+ // any sort of binding support.
+ } else {
+ if (model) {
+ console.warn(this, 'was given a model to stamp, but the template is not of a bindable type');
+ }
+
+ stamped = document.importNode(fixtureTemplate.content, true);
+
+ // Immediately upgrade the subtree if we are dealing with async
+ // Web Components polyfill.
+ // https://github.com/Polymer/polymer/blob/0.8-preview/src/features/mini/template.html#L52
+ if (window.CustomElements && window.CustomElements.upgradeSubtree) {
+ window.CustomElements.upgradeSubtree(stamped);
+ }
+ }
+
+ return stamped;
+ }
+ };
+
+ Object.getOwnPropertyNames(TestFixtureExtension)
+ .forEach(function (property) {
+ Object.defineProperty(
+ TestFixturePrototype,
+ property,
+ Object.getOwnPropertyDescriptor(TestFixtureExtension, property)
+ );
+ });
+
+ try {
+ if (window.customElements) {
+ function TestFixture() {
+ return ((window.Reflect && Reflect.construct) ?
+ Reflect.construct(HTMLElement, [], TestFixture)
+ : HTMLElement.call(this)) || this;
+ }
+ TestFixture.prototype = TestFixturePrototype;
+ // `constructor` is not writable on Safari 9, but is configurable.
+ Object.defineProperty(TestFixture.prototype, 'constructor', {
+ configurable: true,
+ enumerable: true,
+ writable: true,
+ value: TestFixture,
+ });
+ window.customElements.define('test-fixture', TestFixture);
+ } else {
+ document.registerElement('test-fixture', {
+ prototype: TestFixturePrototype
+ });
+ }
+ } catch (e) {
+ if (window.WCT) {
+ console.warn('if you are using WCT, you do not need to manually import test-fixture.html');
+ } else {
+ console.warn('test-fixture has already been registered!');
+ }
+ }
+})();
+</script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/wct.conf.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/wct.conf.json
new file mode 100644
index 00000000000..d36d92bb641
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/test-fixture/wct.conf.json
@@ -0,0 +1,5 @@
+{
+ "clientOptions": {
+ "environmentImports": []
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/.bower.json
new file mode 100644
index 00000000000..04e60962400
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/.bower.json
@@ -0,0 +1,40 @@
+{
+ "name": "web-animations-js",
+ "description": "JavaScript implementation of the Web Animations API",
+ "homepage": "https://github.com/web-animations/web-animations-js",
+ "main": "web-animations.min.js",
+ "moduleType": [
+ "globals"
+ ],
+ "keywords": [
+ "animations",
+ "polyfill"
+ ],
+ "license": "Apache-2.0",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "templates",
+ "test",
+ "Gruntfile.js",
+ "package.json",
+ "target-config.js",
+ "target-loader.js",
+ "web-animations.dev.html",
+ "web-animations.dev.js",
+ "web-animations-next.dev.html",
+ "web-animations-next.dev.js",
+ "web-animations-next-lite.dev.html",
+ "web-animations-next-lite.dev.js"
+ ],
+ "version": "2.3.1",
+ "_release": "2.3.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "2.3.1",
+ "commit": "a2dddad1c210c8abe5bc1c5a5e126e9946d44252"
+ },
+ "_source": "https://github.com/web-animations/web-animations-js.git",
+ "_target": "^2.0.0",
+ "_originalSource": "web-animations-js"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/CONTRIBUTING.md
new file mode 100644
index 00000000000..15142a7e5e6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/CONTRIBUTING.md
@@ -0,0 +1,123 @@
+## Developer instructions
+
+### Setup
+
+1. Fork web-animations/web-animations-js.
+1. `git clone git@github.com:$GITHUB_USER/web-animations-js.git`
+1. `git submodule update --init --recursive` (Necessary for running tests.)
+1. Install [node](https://nodejs.org/en/) and make sure `npm` is in your $PATH
+1. Run `npm install` in the respository to pull in development dependencies.
+1. Run `npm install -g grunt-cli` to get the build tools for the command line.
+
+### Contributing
+
+Note that development should occur against the `dev` branch, not `master`. This
+is the default target for pull requests.
+
+1. In your fork of web-animations-js, `git checkout dev` or create a new branch whose parent is dev.
+1. Run `grunt` to build the polyfill.
+1. Run `grunt test` to run polyfill and web-platform-tests tests.
+1. Commit changes to your fork.
+1. Create a pull request from your fork of web-animations-js to
+ [web-animations/web-animations-js/dev](https://github.com/web-animations/web-animations-js/tree/dev).
+1. Ensure that you've signed the [Google Contributor License Agreement](https://cla.developers.google.com/clas).
+
+
+## Debugging tests
+
+You can run the tests in an interactive mode with `grunt debug`. This starts the
+Karma server once for each polyfill target for each test framework.
+Navigate to `http://localhost:9876/debug.html` to open the test runner in your
+browser of choice, all test results appear in the Javascript console.
+Test failures can be accessed via `window.failures` and `window.formattedFailures`
+once the tests have completed.
+
+The polyfill target and tests can be specified as arguments to the `debug` task.
+Example: `grunt debug:web-animations-next:test/web-platform-tests/web-animations/animation/pause.html`
+Multiple test files may be listed with comma separation. Specifying files will output their URL in the command line.
+Example: `http://localhost:9876/base/test/web-platform-tests/web-animations/animation/pause.html`
+
+
+## Design notes
+
+[Design diagrams](https://drive.google.com/folderview?id=0B9rpPoIDv3vTNlZxOVp6a2tNa1E&usp=sharing)
+
+
+## Publishing a release
+
+1. Determine the version number for the release
+
+ * Increment the first number and reset others to 0 when there are large breaking changes
+ * Increment the second number and reset the third to 0 when there are significant new, but backwards compatible features
+ * Otherwise, increment the third number
+
+1. Add versioned release notes to `History.md`, for example:
+
+ ### 3.13.37 — *November 1, 2001*
+
+ * Fixed a bug where nothing worked
+
+ Use the following to generate a summary of commits, but edit the list to contain only
+ relevant information.
+
+ git log --first-parent `git describe --tags --abbrev=0 master`..dev --pretty=format:" * %s"
+
+1. Specify the new version inside `package.json` (for NPM), for example:
+
+ ```js
+ "version": "3.13.37",
+ ```
+
+1. Build the polyfill with `npm install && grunt` then update `docs/experimental.md`'s Build Target Comparison with the current gzipped sizes.
+
+1. Commit the above changes to web-animations-js/dev and merge to
+ web-animations-js/master.
+
+ ```sh
+ git checkout master
+ git merge dev --no-edit --quiet
+ ```
+
+1. Build and commit minified JavaScript files.
+
+ ```sh
+ npm install
+ grunt
+ # Optional "grunt test" to make sure everything still passes.
+ git add -f *.min.js{,.map}
+ git rm .gitignore
+ git commit -m 'Add build artifacts from '`cat .git/refs/heads/dev`
+ git push HEAD:refs/heads/master
+ ```
+
+1. Draft a [new release](https://github.com/web-animations/web-animations-js/releases) at the
+ commit pushed to web-animations-js in step #4. Copy the release notes from `History.md`
+ added in step #2.
+
+1. Once you've pushed to web-animations-js, run `npm publish` from that checked-out folder
+
+ To do this, you'll need to be a collaborator [on the NPM project](https://www.npmjs.com/package/web-animations-js), or have a collaborator help you.
+
+1. If there are any breaking changes to the API in this release you must notify web-animations-changes@googlegroups.com.
+
+ Only owners of the group may post to it so you may need to request ownership or ask someone to post it for you.
+
+## Testing architecture
+
+This is an overview of what happens when `grunt test` is run.
+
+1. Polyfill tests written in mocha and chai are run.
+ 1. grunt creates a karma config with mocha and chai adapters.
+ 1. grunt adds the test/js files as includes to the karma config.
+ 1. grunt starts the karma server with the config and waits for the result.
+ 1. The mocha adaptor runs the included tests and reports the results to karma.
+ 1. karma outputs results to the console and returns the final pass/fail result to grunt.
+1. web-platform-tests/web-animations tests written in testtharness.js are run.
+ 1. grunt creates a karma config with karma-testharness-adaptor.js included.
+ 1. grunt adds the web-platform-tests/web-animations files to the custom testharnessTests config in the karma config.
+ 1. grunt adds failure expectations to the custom testharnessTests config in the karma config.
+ 1. grunt starts the karma server with the config and waits for the result.
+ 1. The testharness.js adaptor runs the included tests (ignoring expected failures) and reports the results to karma.
+ 1. karma outputs results to the console and returns the final pass/fail result to grunt.
+1. grunt exits successfully if both test runs passed.
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/COPYING b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/COPYING
new file mode 100644
index 00000000000..d6456956733
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/COPYING
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/History.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/History.md
new file mode 100644
index 00000000000..6deef415a4b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/History.md
@@ -0,0 +1,265 @@
+### 2.3.1 - *July 20 2017*
+
+ * Fix [https://github.com/web-animations/web-animations-js/issues/157](missing web-animations.min.js issue)
+
+### 2.3.0 - *July 20 2017*
+
+ * [Support IE/Edge SVG transforms.](https://github.com/web-animations/web-animations-js/pull/148)
+
+ * [Parse and evaluate calc expressions without eval.](https://github.com/web-animations/web-animations-js/pull/151)
+
+### 2.2.5 - *April 17 2017*
+
+ * Removed erroneously added *.gz files from release.
+
+### 2.2.4 - *April 14 2017*
+
+ * [Reverted adding 'use strict' to source files.](https://github.com/web-animations/web-animations-next/pull/124)
+
+### 2.2.3 - *April 13 2017*
+
+ * [Added HTML import targets.](https://github.com/web-animations/web-animations-js/pull/94)
+
+ * Added support for animating SVG related properties:
+ * [fill](https://github.com/web-animations/web-animations-next/pull/484)
+ * [floodColor](https://github.com/web-animations/web-animations-next/pull/484)
+ * [lightingColor](https://github.com/web-animations/web-animations-next/pull/484)
+ * [stopColor](https://github.com/web-animations/web-animations-next/pull/484)
+ * [strokeDashoffset](https://github.com/web-animations/web-animations-js/pull/96)
+ * [strokeDasharray](https://github.com/web-animations/web-animations-js/pull/120)
+
+ * [Fixed crash when animating non-invertable matrices.](https://github.com/web-animations/web-animations-js/pull/121)
+
+ * [Fixed source maps for Bower installs.](https://github.com/web-animations/web-animations-js/pull/93)
+
+ * [Updated README.md documentation structure.](https://github.com/web-animations/web-animations-next/pull/489)
+
+ * [Added 'use strict' to source files.](https://github.com/web-animations/web-animations-next/pull/488)
+
+### 2.2.2 - *August 3 2016*
+
+ * [Fixed handling of keyframes with overlapping offsets.](https://github.com/web-animations/web-animations-next/pull/470)
+
+ * [Throw TypeError on invalid keyframe input.](https://github.com/web-animations/web-animations-next/pull/471)
+
+ * [Fixed display and other animation properties being animated.](https://github.com/web-animations/web-animations-next/pull/474)
+
+ * [Throw InvalidStateError when calling play() on reversed infinite animation.](https://github.com/web-animations/web-animations-next/pull/475)
+
+ * [Fixed infinite loop in cubic-bezier timing function.](https://github.com/web-animations/web-animations-next/pull/476)
+
+ * [Fixed idle animations not becoming paused when seeked.](https://github.com/web-animations/web-animations-next/pull/479)
+
+ * [Fixed pause() not rewinding idl animations.](https://github.com/web-animations/web-animations-next/pull/480)
+
+ * [Extended cubic-bezier timing function domain from [0, 1] to (-Infinity, Infinity).](https://github.com/web-animations/web-animations-next/pull/481)
+
+ * [Fixed timing model to handle corner cases involving Infinity and 0 correctly.](https://github.com/web-animations/web-animations-next/pull/482)
+
+ * [Fixed source files missing from npm package.](https://github.com/web-animations/web-animations-next/pull/483)
+
+ * [Improved performance of starting and updating individual animations.](https://github.com/web-animations/web-animations-next/pull/485)
+
+### 2.2.1 - *April 28 2016*
+ * [Deprecated invalid timing inputs](https://github.com/web-animations/web-animations-next/pull/437) as they will soon throw [TypeErrors](https://github.com/web-animations/web-animations-next/pull/426) in native browsers.
+
+ For example, this is deprecated and will eventually throw a TypeError:
+
+ element.animate([], {
+ duration: -1,
+ iterationStart: -1,
+ iterations: -1,
+ easing: 'garbage string',
+ });
+
+ * [Fixed polyfill crash in browsers based on Chromium 36 to 46.](https://github.com/web-animations/web-animations-next/pull/434)
+
+ * [Increased cubic-bezier accuracy.](https://github.com/web-animations/web-animations-next/pull/428)
+
+ * [Added support for grad and turn units for angles.](https://github.com/web-animations/web-animations-next/pull/427)
+
+### 2.2.0 - *April 6 2016*
+ * Deprecated the use of hyphens in property names.
+
+ For example, this is deprecated:
+
+ element.animate([{'font-size': '0px'}, {'font-size': '10px'}]);
+
+ and this should be used instead:
+
+ element.animate([{fontSize: '0px'}, {fontSize: '10px'}]);
+
+ * Added arbitrary easing capitalisation.
+
+ * Added "id" effect option. (http://w3c.github.io/web-animations/#dom-keyframeanimationoptions-id)
+
+ * Added "oncancel" event handler.
+
+ * Added value list keyframe syntax.
+
+ As as alternative to:
+
+ element.animate([{color: 'red'}, {color: 'green'}, {color: 'blue'}]);
+
+ you can now use:
+
+ element.animate({color: ['red', 'green', 'blue']});
+
+ * Fixed easing TypeError in FireFox Nightly when using groups.
+
+ * Fixed delayed animation updates on Safari and Firefox
+
+ * Fixed infinite recursion when setting onfinish to null.
+
+### 2.1.4 - *December 1 2015*
+ * Use `Date.now()` instead of `performace.now()` for mobile Safari.
+
+### 2.1.3 - *October 12 2015*
+ * Removed web-animations.min.js.gz
+
+### 2.1.2 - *July 8 2015*
+ * Fix a bug where onfinish was being called for GroupEffects before they were finished.
+
+### 2.1.1 - *July 1 2015*
+ * Add Animation.timeline getter
+ * Add AnimationEffect.parent getter
+ * Make AnimationEffectTiming (returned by AnimationEffect.timing) attributes mutable
+ * Expose the Animation constructor
+ * Change custom effects from AnimationEffects to onsample functions. Custom effects should now be created by setting the onsample attribute of a KeyframeEffect.
+
+ For example, this is deprecated:
+
+ var myEffect = new KeyframeEffect(
+ element,
+ function(timeFraction, target, effect) {
+ target.style.opacity = timeFraction;
+ },
+ 1000);
+ var myAnimation = document.timeline.play(myEffect);
+
+ and this should be used insead:
+
+ var myEffect = new KeyframeEffect(element, [], 1000);
+ effect.onsample = function(timeFraction, effect, animation) {
+ effect.target.style.opacity = timeFraction;
+ };
+ var myAnimation = document.timeline.play(myEffect);
+
+### 2.1.0 - *June 15 2015*
+ * Fix bug affecting GroupEffects with infinite iteration children
+ * Add GroupEffect.firstChild and GroupEffect.lastChild
+ * Add initial values for most CSS properties
+ * Allow `timeline.play()` to be called with no arguments
+ * Add AnimationEffect.clone
+ * Add GroupEffect.append and GroupEffect.prepend
+ * Add AnimationEffect.remove
+ * Add Animation.ready and Animation.finished promises
+
+### 2.0.0 - *April 5 2015*
+
+ * Improve behavior of group Animation playback rate.
+ * Rename Animation to KeyframeEffect.
+ * Rename AnimationSequence to SequenceEffect.
+ * Rename AnimationGroup to GroupEffect.
+ * Rename AnimationPlayer to Animation.
+ * Remove KeyframeEffect.effect and add KeyframeEffect.getFrames.
+ * Rename Animation.source to Animation.effect.
+ * Rename Timeline.getAnimationPlayers to Timeline.getAnimations.
+ * Rename Element.getAnimationPlayers to Element.getAnimations.
+
+### 1.0.7 - *March 10 2015*
+
+ * Improve performance of constructing groups and sequences.
+ * Remove support for animating zoom.
+ * Add bower file.
+
+### 1.0.6 - *February 5 2015*
+
+ * Implement playbackRate setter for group players.
+ * Fix pausing a group player before its first tick.
+ * Fix cancelling a group player before its first tick.
+ * Fix excess CPU use on idle pages where custom effects and groups were used.
+ * Suppress AnimationTiming.playbackRate deprecation warning for cases where AnimationTiming.playbackRate == 1.
+
+### 1.0.5 - *January 6 2015*
+
+ * Fix loading the polyfill in an SVG document
+ * Fix a problem where groups didn't take effect in their first frame
+ * Don't rely on performance.now
+
+### 1.0.4 - *December 8 2014*
+
+ * Fix a critical bug where deprecation logic wasn't being loaded
+ when `web-animations-next` and `web-animations-next-lite` were
+ executed on top of a native `element.animate`.
+
+### 1.0.3 - *December 4 2014*
+
+ * Fix a critical bug on iOS 7 and Safari <= 6. Due to limitations,
+ inline style patching is not supported on these platforms.
+
+### 1.0.2 - *November 28 2014*
+
+ * Deprecated `AnimationTiming.playbackRate`.
+
+ For example, this is no longer supported:
+
+ var player = element.animate(
+ keyframes,
+ {duration: 1000, playbackRate: 2});
+
+ Use `AnimationPlayer.playbackRate` instead:
+
+ var player = element.animate(
+ keyframes,
+ {duration: 1000});
+ player.playbackRate = 2;
+
+ If you have any feedback on this change, please start a discussion
+ on the public-fx mailing list:
+ http://lists.w3.org/Archives/Public/public-fx/
+
+ Or file an issue against the specification on GitHub:
+ https://github.com/w3c/web-animations/issues/new
+
+### 1.0.1 - *November 26 2014*
+
+ * Players should be constructed in idle state
+ * `play()` and `reverse()` should not force a start times
+ * Add `requestAnimationFrame` ids and `cancelAnimationFrame`
+
+### 1.0.0 — *November 21 2014*
+
+ The web-animations-js hackers are pleased to announce the release of
+ a new codebase for the Web Animations Polyfill:
+ https://github.com/web-animations/web-animations-js
+
+ The previous polyfill has been moved to:
+ https://github.com/web-animations/web-animations-js-legacy
+
+ The new codebase is focused on code-size -- our smallest target is
+ now only 33kb or 11kb after gzip.
+
+ We've implemented native fallback. If the target browser provides
+ Web Animations features natively, the Polyfill will use them.
+
+ We now provide three different build targets:
+
+ `web-animations.min.js` - Tracks the Web Animations features that
+ are supported natively in browsers. Today that means Element.animate
+ and Playback Control in Chrome. If you’re not sure what features you
+ will need, start with this.
+
+ `web-animations-next.min.js` - All of web-animations.min.js plus
+ features that are still undergoing discussion or have yet to be
+ implemented natively.
+
+ `web-animations-next-lite.min.js` - A cut down version of
+ web-animations-next, removes several lesser used property handlers
+ and some of the larger and less used features such as matrix
+ interpolation/decomposition.
+
+ Not all features of the previous polyfill have been ported to the
+ new codebase; most notably mutation of Animations and Groups and
+ Additive Animations are not yet supported. These features are still
+ important and will be implemented in the coming weeks.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/README.md
new file mode 100644
index 00000000000..e3410b6182d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/README.md
@@ -0,0 +1,80 @@
+
+What is Web Animations?
+-----------------------
+
+A new JavaScript API for driving animated content on the web. By unifying
+the animation features of SVG and CSS, Web Animations unlocks features
+previously only usable declaratively, and exposes powerful, high-performance
+animation capabilities to developers.
+
+What is in this repository?
+---------------------------
+
+A JavaScript implementation of the Web Animations API that provides Web
+Animation features in browsers that do not support it natively. The polyfill
+falls back to the native implementation when one is available.
+
+Quick start
+-----------
+
+Here's a simple example of an animation that fades and scales a `<div>`.
+[Try it as a live demo.](http://jsbin.com/yageyezabo/edit?html,js,output)
+
+```html
+<!-- Include the polyfill -->
+<script src="web-animations.min.js"></script>
+
+<!-- Set up a target to animate -->
+<div class="pulse" style="width: 150px;">Hello world!</div>
+
+<!-- Animate! -->
+<script>
+ var elem = document.querySelector('.pulse');
+ var animation = elem.animate({
+ opacity: [0.5, 1],
+ transform: ['scale(0.5)', 'scale(1)'],
+ }, {
+ direction: 'alternate',
+ duration: 500,
+ iterations: Infinity,
+ });
+</script>
+```
+
+Documentation
+-------------
+
+* [Codelab tutorial](https://github.com/web-animations/web-animations-codelabs)
+* [Examples of usage](/docs/examples.md)
+* [Live demos](https://web-animations.github.io/web-animations-demos)
+* [MDN reference](https://developer.mozilla.org/en-US/docs/Web/API/Element/animate)
+* [W3C specification](http://w3c.github.io/web-animations/)
+
+We love feedback!
+-----------------
+
+* For feedback on the API and the specification:
+ * File an issue on GitHub: <https://github.com/w3c/web-animations/issues/new>
+ * Alternatively, send an email to <public-fx@w3.org> with subject line
+"[web-animations] ... message topic ..."
+([archives](http://lists.w3.org/Archives/Public/public-fx/)).
+
+* For issues with the polyfill, report them on GitHub:
+<https://github.com/web-animations/web-animations-js/issues/new>.
+
+Keep up-to-date
+---------------
+
+Breaking polyfill changes will be announced on this low-volume mailing list:
+[web-animations-changes@googlegroups.com](https://groups.google.com/forum/#!forum/web-animations-changes).
+
+More info
+---------
+
+* [Technical details about the polyfill](/docs/support.md)
+ * [Browser support](/docs/support.md#browser-support)
+ * [Fallback to native](/docs/support.md#native-fallback)
+ * [Feature list](/docs/support.md#features)
+ * [Feature deprecation and removal processes](/docs/support.md#process-for-breaking-changes)
+* To test experimental API features, try one of the
+ [experimental targets](/docs/experimental.md)
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/bower.json
new file mode 100644
index 00000000000..afa0f9e198b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/bower.json
@@ -0,0 +1,30 @@
+{
+ "name": "web-animations-js",
+ "description": "JavaScript implementation of the Web Animations API",
+ "homepage": "https://github.com/web-animations/web-animations-js",
+ "main": "web-animations.min.js",
+ "moduleType": [
+ "globals"
+ ],
+ "keywords": [
+ "animations",
+ "polyfill"
+ ],
+ "license": "Apache-2.0",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "templates",
+ "test",
+ "Gruntfile.js",
+ "package.json",
+ "target-config.js",
+ "target-loader.js",
+ "web-animations.dev.html",
+ "web-animations.dev.js",
+ "web-animations-next.dev.html",
+ "web-animations-next.dev.js",
+ "web-animations-next-lite.dev.html",
+ "web-animations-next-lite.dev.js"
+ ]
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/docs/examples.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/docs/examples.md
new file mode 100644
index 00000000000..7957a29c649
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/docs/examples.md
@@ -0,0 +1,241 @@
+#Examples of using Web Animations
+
+Property indexed keyframes syntax
+---------------------------------
+- Each CSS property specifies its keyframe values as a list, different properties may have differently sized lists.
+- The `easing` property applies its timing function to all keyframes.
+
+[**Live demo**](http://jsbin.com/qiyeriruru/edit?js,output)
+```javascript
+element.animate({
+ transform: [
+ 'scaleY(0.5)',
+ 'scaleX(0.5)',
+ 'scaleY(0.5)',
+ ],
+ background: [
+ 'red',
+ 'blue',
+ 'orange',
+ 'red',
+ ],
+ easing: 'ease-in-out',
+}, {
+ duration: 2000,
+ iterations: Infinity,
+});
+```
+
+Keyframe list syntax
+--------------------
+- Keyframes can be specified as a list of multiple CSS property values.
+- Individual keyframes can be given specific offsets and easings.
+- Not all properties need to be specified in every keyframe.
+- Offsets are implicitly distributed if not specified.
+
+[**Live demo**](http://jsbin.com/yajatoyere/edit?js,output)
+```javascript
+element.animate([
+ {
+ background: 'red',
+ transform: 'none',
+ easing: 'ease-out',
+ },
+ {
+ offset: 0.1,
+ transform: 'translateY(100px)',
+ easing: 'ease-in-out',
+ },
+ {
+ offset: 0.2,
+ transform: 'translate(100px, 100px)',
+ easing: 'ease-in-out',
+ },
+ {
+ offset: 0.4,
+ transform: 'translateX(100px)',
+ easing: 'ease-out',
+ },
+ {
+ background: 'blue',
+ transform: 'none',
+ },
+], {
+ duration: 4000,
+ iterations: Infinity,
+});
+```
+
+Timing parameters
+-----------------
+- Web Animations inherits many of its timing parameters from CSS Animations.
+- See the [specification](http://w3c.github.io/web-animations/#animationeffecttimingreadonly) for details on each parameter.
+
+[**Live demo**](http://jsbin.com/dabehipiyo/edit?js,output)
+```javascript
+element.animate({
+ transform: ['none', 'translateX(100px)'],
+ background: ['green', 'lime'],
+}, {
+ // Apply effect during delay.
+ fill: 'backwards',
+
+ // Delay starting by 500ms.
+ delay: 500,
+
+ // Iterations last for 2000ms.
+ duration: 2000,
+
+ // Start at 25% through an iteration.
+ iterationStart: 0.25,
+
+ // Run for 2 iterations.
+ iterations: 2,
+
+ // Play every second iteration backwards.
+ direction: 'alternate',
+
+ // Stop animating 500ms earlier.
+ endDelay: -500,
+
+ // The timing function to use with each iteration.
+ easing: 'ease-in-out',
+});
+```
+
+Playback controls
+-----------------
+- element.animate() returns an Animation object with basic playback controls.
+- See the [specification](http://w3c.github.io/web-animations/#the-animation-interface) for details on each method.
+
+[**Live demo**](http://jsbin.com/kutaqoxejo/edit?js,output)
+```javascript
+var animation = element.animate({
+ transform: ['none', 'translateX(200px)'],
+ background: ['red', 'orange'],
+}, {
+ duration: 4000,
+ fill: 'both',
+});
+animation.play();
+animation.reverse();
+animation.pause();
+animation.currentTime = 2000;
+animation.playbackRate += 0.25;
+animation.playbackRate -= 0.25;
+animation.finish();
+animation.cancel();
+```
+
+Transitioning states with element.animate()
+-------------------------------------------
+- This is an example of how to animate from one state to another using Web Animations.
+
+[**Live demo**](http://jsbin.com/musufiwule/edit?js,output)
+```javascript
+var isOpen = false;
+var openHeight = '100px';
+var closedHeight = '0px';
+var duration = 300;
+
+button.addEventListener('click', function() {
+ // Prevent clicks while we transition states.
+ button.disabled = true;
+ button.textContent = '...';
+
+ // Determine where we're animation from/to.
+ var fromHeight = isOpen ? openHeight : closedHeight;
+ var toHeight = isOpen ? closedHeight : openHeight;
+
+ // Start an animation transitioning from our current state to the final state.
+ var animation = element.animate({ height: [fromHeight, toHeight] }, duration);
+
+ // Update the button once the animation finishes.
+ animation.onfinish = function() {
+ isOpen = !isOpen;
+ button.textContent = isOpen ? 'Close' : 'Open';
+ button.disabled = false;
+ };
+
+ // Put our element in the final state.
+ // Inline styles are overridden by active animations.
+ // When the above animation finishes it will stop applying and
+ // the element's style will fall back onto this inline style value.
+ element.style.setProperty('height', toHeight);
+});
+```
+
+Generating animations
+---------------------
+- The Javascript API allows for procedurally generating a diverse range of interesting animations.
+
+[**Live demo**](http://jsbin.com/xolacasiyu/edit?js,output)
+```html
+<!DOCTYPE html>
+<script src="https://rawgit.com/web-animations/web-animations-js/master/web-animations.min.js"></script>
+
+<style>
+#perspective {
+ margin-left: 100px;
+ width: 300px;
+ height: 300px;
+ perspective: 600px;
+}
+
+#container {
+ width: 300px;
+ height: 300px;
+ line-height: 0;
+ transform-style: preserve-3d;
+}
+
+.box {
+ display: inline-block;
+ width: 20px;
+ height: 20px;
+ background: black;
+}
+</style>
+
+<div id="perspective">
+ <div id="container"></div>
+</div>
+
+<script>
+container.animate({
+ transform: [
+ 'rotateX(70deg) rotateZ(0deg)',
+ 'rotateX(70deg) rotateZ(360deg)',
+ ],
+}, {
+ duration: 20000,
+ iterations: Infinity,
+});
+
+for (var y = -7; y <= 7; y++) {
+ for (var x = -7; x <= 7; x++) {
+ var box = createBox();
+ box.animate({
+ transform: [
+ 'translateZ(0px)',
+ 'translateZ(20px)',
+ ],
+ opacity: [1, 0],
+ }, {
+ delay: (x*x + y*y) * 20,
+ duration: 2000,
+ iterations: Infinity,
+ direction: 'alternate',
+ easing: 'ease-in',
+ });
+ }
+}
+
+function createBox() {
+ var box = document.createElement('div');
+ box.className = 'box';
+ container.appendChild(box);
+ return box;
+}
+</script>
+```
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/docs/experimental.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/docs/experimental.md
new file mode 100644
index 00000000000..e3f228985c3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/docs/experimental.md
@@ -0,0 +1,58 @@
+
+Experimental build targets
+--------------------------
+
+Most people should use the basic polyfill in `web-animations.min.js`. This
+tracks the Web Animations features that are supported natively in browsers.
+However, we also provide two additional build targets that contain experimental
+features.
+
+### web-animations-next.min.js
+
+Contains all of web-animations.min.js plus features that are still undergoing
+discussion or have yet to be implemented natively.
+
+### web-animations-next-lite.min.js
+
+A cut down version of web-animations-next, it removes several lesser used
+property handlers and some of the larger and less used features such as matrix
+interpolation/decomposition.
+
+Build target comparison
+-----------------------
+
+| | web-animations | web-animations-next | web-animations-next-lite |
+|------------------------|:--------------:|:-------------------:|:------------------------:|
+|Size (gzipped) | 15KB | 19KB | 15KB |
+|Element.animate | ✔ | ✔ | ✔ |
+|Timing input (easings, duration, fillMode, etc.) for animation effects| ✔ | ✔ | ✔ |
+|Playback control | ✔ | ✔ | ✔ |
+|Support for animating lengths, transforms and opacity| ✔ | ✔ | ✔ |
+|Support for animating other CSS properties| ✔ | ✔ | 🚫 |
+|Matrix fallback for transform animations | ✔ | ✔ | 🚫 |
+|KeyframeEffect constructor | 🚫 | ✔ | ✔ |
+|Simple GroupEffects & SequenceEffects | 🚫 | ✔ | ✔ |
+|Custom Effects | 🚫 | ✔ | ✔ |
+|Timing input (easings, duration, fillMode, etc.) for groups</div>| 🚫 | 🚫\* | 🚫 |
+|Additive animation | 🚫\* | 🚫\* | 🚫 |
+|Motion path | 🚫\* | 🚫\* | 🚫 |
+|Modifiable keyframe effect timing| 🚫 | 🚫\* | 🚫\* |
+|Modifiable group timing | 🚫 | 🚫\* | 🚫\* |
+|Usable inline style\*\* | ✔ | ✔ | 🚫 |
+
+\* support is planned for these features.
+\*\* see inline style caveat below.
+
+Caveat: Inline style
+--------------------
+
+Inline style modification is the mechanism used by the polyfill to animate
+properties. Both web-animations and web-animations-next incorporate a module
+that emulates a vanilla inline style object, so that style modification from
+JavaScript can still work in the presence of animations. However, to keep the
+size of web-animations-next-lite as small as possible, the style emulation
+module is not included. When using this version of the polyfill, JavaScript
+inline style modification will be overwritten by animations.
+Due to browser constraints inline style modification is not supported on iOS 7
+or Safari 6 (or earlier versions).
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/docs/support.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/docs/support.md
new file mode 100644
index 00000000000..ae07af76ed5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/docs/support.md
@@ -0,0 +1,69 @@
+
+Getting the polyfill
+--------------------
+
+There are three ways to get a copy of the polyfill:
+
+1. Download and use the `web-animations.min.js` file directly from this repository
+1. Using npm: Add [`web-animations-js`](https://www.npmjs.com/package/web-animations-js) to your `package.json`
+1. Using Bower: Add `web-animations/web-animations-js` to your `bower.json`
+
+Browser support
+---------------
+
+The polyfill is supported on modern versions of all major browsers, including:
+
+* Chrome 55+
+* Firefox 27+
+* IE10+ (including Edge)
+* Safari (iOS) 7.1+
+* Safari (Mac) 9+
+
+Native fallback
+---------------
+
+When the polyfill runs on a browser that implements `Element.animate()` and
+`Animation` playback control, it will detect and use the underlying native
+features for better performance.
+
+Features
+--------
+
+The `web-animations.min.js` polyfill target tracks the Web Animations features
+that are supported natively in browsers. These include:
+
+* Element.animate()
+* Timing input (easings, duration, fillMode, etc.) for animation effects
+* Playback control (play, pause, reverse, currentTime, cancel, onfinish)
+* Support for animating CSS properties
+
+Caveat: Prefix handling
+-----------------------
+
+The polyfill will automatically detect the correctly prefixed name to use when
+writing animated properties back to the platform. Where possible, the polyfill
+will only accept unprefixed versions of experimental features. For example:
+
+```js
+element.animate({transform: ['none', 'translateX(100px)']}, 1000);
+```
+
+will work in all browsers that implement a conforming version of transform, but
+
+```js
+element.animate({webkitTransform: ['none', 'translateX(100px)']}, 1000);
+```
+
+will not work anywhere.
+
+Process for breaking changes
+----------------------------
+
+When we make a potentially breaking change to the polyfill's API
+surface (like a rename) we will, where possible, continue supporting the
+old version, deprecated, for three months, and ensure that there are
+console warnings to indicate that a change is pending. After three
+months, the old version of the API surface (e.g. the old version of a
+function name) will be removed. *If you see deprecation warnings, you
+can't avoid them by not updating*.
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/externs/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/externs/README.md
new file mode 100644
index 00000000000..3f16bf659a3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/externs/README.md
@@ -0,0 +1,10 @@
+
+Closure Compiler Externs for Web Animations
+-------------------------------------------
+
+This folder contains externs for using the Web Animations API with the Closure
+Compiler. These externs aren't strictly part of the polyfill, as they can be
+used for either the native or polyfilled versions.
+
+web-animations-next requires that you also include web-animations.
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/externs/web-animations-next.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/externs/web-animations-next.js
new file mode 100644
index 00000000000..743a3ba5648
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/externs/web-animations-next.js
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2016 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+
+/**
+ * @fileoverview Basic externs for the Web Animations API (Level 2 / Groups).
+ * This is not intended to be exhaustive, and requires the base externs from
+ * web-animations.js.
+ * @externs
+ */
+
+
+/**
+ * @interface
+ */
+var AnimationEffectReadOnly = function() {};
+
+/** @type {!AnimationEffectTiming} */
+AnimationEffectReadOnly.prototype.timing;
+
+
+/**
+ * @param {Element} target
+ * @param {!Array<!Object>} frames
+ * @param {(number|AnimationEffectTimingProperties)=} opt_options
+ * @constructor
+ * @implements {AnimationEffectReadOnly}
+ */
+var KeyframeEffect = function(target, frames, opt_options) {};
+
+/**
+ * @return {!Array<!Object>}
+ */
+KeyframeEffect.prototype.getFrames = function() {};
+
+/** @type {!AnimationEffectTiming} */
+KeyframeEffect.prototype.timing;
+
+/** @type {Element} */
+KeyframeEffect.prototype.target;
+
+/** @type {?function(number, !KeyframeEffect, !Animation)} */
+KeyframeEffect.prototype.onsample;
+
+
+/**
+ * @param {!Array<!AnimationEffectReadOnly>} children
+ * @param {AnimationEffectTimingProperties=} opt_timing
+ * @constructor
+ * @implements {AnimationEffectReadOnly}
+ */
+var SequenceEffect = function(children, opt_timing) {};
+
+/** @type {!AnimationEffectTiming} */
+SequenceEffect.prototype.timing;
+
+/** @type {!Array<!AnimationEffectReadOnly>} */
+SequenceEffect.prototype.children;
+
+
+/**
+ * @param {!Array<!AnimationEffectReadOnly>} children
+ * @param {AnimationEffectTimingProperties=} opt_timing
+ * @constructor
+ * @implements {AnimationEffectReadOnly}
+ */
+var GroupEffect = function(children, opt_timing) {};
+
+/** @type {!AnimationEffectTiming} */
+GroupEffect.prototype.timing;
+
+/** @type {!Array<!AnimationEffectReadOnly>} */
+GroupEffect.prototype.children;
+
+
+/**
+ * @interface
+ */
+var AnimationTimeline = function() {};
+
+/** @type {?number} */
+AnimationTimeline.prototype.currentTime;
+
+/**
+ * @param {!AnimationEffectReadOnly} effect
+ * @return {!Animation}
+ */
+AnimationTimeline.prototype.play = function(effect) {};
+
+/**
+ * @interface
+ * @extends {AnimationTimeline}
+ */
+var DocumentTimeline = function() {};
+
+/** @type {AnimationEffectReadOnly|undefined} */
+Animation.prototype.effect;
+
+/** @type {!DocumentTimeline} */
+Document.prototype.timeline;
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/externs/web-animations.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/externs/web-animations.js
new file mode 100644
index 00000000000..7059b4000b2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/externs/web-animations.js
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2016 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+
+/**
+ * @fileoverview Basic externs for the Web Animations API. This is not
+ * nessecarily exhaustive. For more information, see the spec-
+ * https://w3c.github.io/web-animations
+ * @externs
+ */
+
+
+/**
+ * @param {!Array<!Object>} frames
+ * @param {(number|AnimationEffectTimingProperties)=} opt_options
+ * @return {!Animation}
+ */
+Element.prototype.animate = function(frames, opt_options) {};
+
+
+/**
+ * @interface
+ * @extends {EventTarget}
+ */
+var Animation = function() {};
+
+/**
+ * @return {undefined}
+ */
+Animation.prototype.cancel = function() {};
+
+/**
+ * @return {undefined}
+ */
+Animation.prototype.finish = function() {};
+
+/**
+ * @return {undefined}
+ */
+Animation.prototype.reverse = function() {};
+
+/**
+ * @return {undefined}
+ */
+Animation.prototype.pause = function() {};
+
+/**
+ * @return {undefined}
+ */
+Animation.prototype.play = function() {};
+
+/** @type {number} */
+Animation.prototype.startTime;
+
+/** @type {number} */
+Animation.prototype.currentTime;
+
+/** @type {number} */
+Animation.prototype.playbackRate;
+
+/** @type {string} */
+Animation.prototype.playState;
+
+/** @type {?function(!Event)} */
+Animation.prototype.oncancel;
+
+/** @type {?function(!Event)} */
+Animation.prototype.onfinish;
+
+
+/**
+ * @typedef {{
+ * delay: (number|undefined),
+ * endDelay: (number|undefined),
+ * fillMode: (string|undefined),
+ * iterationStart: (number|undefined),
+ * iterations: (number|undefined),
+ * duration: (number|string|undefined),
+ * direction: (string|undefined),
+ * easing: (string|undefined)
+ * }}
+ */
+var AnimationEffectTimingProperties;
+
+
+/**
+ * @interface
+ */
+var AnimationEffectTiming = function() {};
+
+/** @type {number} */
+AnimationEffectTiming.prototype.delay;
+
+/** @type {number} */
+AnimationEffectTiming.prototype.endDelay;
+
+/** @type {string} */
+AnimationEffectTiming.prototype.fillMode;
+
+/** @type {number} */
+AnimationEffectTiming.prototype.iterationStart;
+
+/** @type {number} */
+AnimationEffectTiming.prototype.iterations;
+
+/** @type {number|string} */
+AnimationEffectTiming.prototype.duration;
+
+/** @type {string} */
+AnimationEffectTiming.prototype.direction;
+
+/** @type {string} */
+AnimationEffectTiming.prototype.easing;
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/animation.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/animation.js
new file mode 100644
index 00000000000..e9f64826875
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/animation.js
@@ -0,0 +1,279 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(shared, scope, testing) {
+
+ shared.sequenceNumber = 0;
+
+ var AnimationEvent = function(target, currentTime, timelineTime) {
+ this.target = target;
+ this.currentTime = currentTime;
+ this.timelineTime = timelineTime;
+
+ this.type = 'finish';
+ this.bubbles = false;
+ this.cancelable = false;
+ this.currentTarget = target;
+ this.defaultPrevented = false;
+ this.eventPhase = Event.AT_TARGET;
+ this.timeStamp = Date.now();
+ };
+
+ scope.Animation = function(effect) {
+ this.id = '';
+ if (effect && effect._id) {
+ this.id = effect._id;
+ }
+ this._sequenceNumber = shared.sequenceNumber++;
+ this._currentTime = 0;
+ this._startTime = null;
+ this._paused = false;
+ this._playbackRate = 1;
+ this._inTimeline = true;
+ this._finishedFlag = true;
+ this.onfinish = null;
+ this._finishHandlers = [];
+ this._effect = effect;
+ this._inEffect = this._effect._update(0);
+ this._idle = true;
+ this._currentTimePending = false;
+ };
+
+ scope.Animation.prototype = {
+ _ensureAlive: function() {
+ // If an animation is playing backwards and is not fill backwards/both
+ // then it should go out of effect when it reaches the start of its
+ // active interval (currentTime == 0).
+ if (this.playbackRate < 0 && this.currentTime === 0) {
+ this._inEffect = this._effect._update(-1);
+ } else {
+ this._inEffect = this._effect._update(this.currentTime);
+ }
+ if (!this._inTimeline && (this._inEffect || !this._finishedFlag)) {
+ this._inTimeline = true;
+ scope.timeline._animations.push(this);
+ }
+ },
+ _tickCurrentTime: function(newTime, ignoreLimit) {
+ if (newTime != this._currentTime) {
+ this._currentTime = newTime;
+ if (this._isFinished && !ignoreLimit)
+ this._currentTime = this._playbackRate > 0 ? this._totalDuration : 0;
+ this._ensureAlive();
+ }
+ },
+ get currentTime() {
+ if (this._idle || this._currentTimePending)
+ return null;
+ return this._currentTime;
+ },
+ set currentTime(newTime) {
+ newTime = +newTime;
+ if (isNaN(newTime))
+ return;
+ scope.restart();
+ if (!this._paused && this._startTime != null) {
+ this._startTime = this._timeline.currentTime - newTime / this._playbackRate;
+ }
+ this._currentTimePending = false;
+ if (this._currentTime == newTime)
+ return;
+ if (this._idle) {
+ this._idle = false;
+ this._paused = true;
+ }
+ this._tickCurrentTime(newTime, true);
+ scope.applyDirtiedAnimation(this);
+ },
+ get startTime() {
+ return this._startTime;
+ },
+ set startTime(newTime) {
+ newTime = +newTime;
+ if (isNaN(newTime))
+ return;
+ if (this._paused || this._idle)
+ return;
+ this._startTime = newTime;
+ this._tickCurrentTime((this._timeline.currentTime - this._startTime) * this.playbackRate);
+ scope.applyDirtiedAnimation(this);
+ },
+ get playbackRate() {
+ return this._playbackRate;
+ },
+ set playbackRate(value) {
+ if (value == this._playbackRate) {
+ return;
+ }
+ var oldCurrentTime = this.currentTime;
+ this._playbackRate = value;
+ this._startTime = null;
+ if (this.playState != 'paused' && this.playState != 'idle') {
+ this._finishedFlag = false;
+ this._idle = false;
+ this._ensureAlive();
+ scope.applyDirtiedAnimation(this);
+ }
+ if (oldCurrentTime != null) {
+ this.currentTime = oldCurrentTime;
+ }
+ },
+ get _isFinished() {
+ return !this._idle && (this._playbackRate > 0 && this._currentTime >= this._totalDuration ||
+ this._playbackRate < 0 && this._currentTime <= 0);
+ },
+ get _totalDuration() { return this._effect._totalDuration; },
+ get playState() {
+ if (this._idle)
+ return 'idle';
+ if ((this._startTime == null && !this._paused && this.playbackRate != 0) || this._currentTimePending)
+ return 'pending';
+ if (this._paused)
+ return 'paused';
+ if (this._isFinished)
+ return 'finished';
+ return 'running';
+ },
+ _rewind: function() {
+ if (this._playbackRate >= 0) {
+ this._currentTime = 0;
+ } else if (this._totalDuration < Infinity) {
+ this._currentTime = this._totalDuration;
+ } else {
+ throw new DOMException(
+ 'Unable to rewind negative playback rate animation with infinite duration',
+ 'InvalidStateError');
+ }
+ },
+ play: function() {
+ this._paused = false;
+ if (this._isFinished || this._idle) {
+ this._rewind();
+ this._startTime = null;
+ }
+ this._finishedFlag = false;
+ this._idle = false;
+ this._ensureAlive();
+ scope.applyDirtiedAnimation(this);
+ },
+ pause: function() {
+ if (!this._isFinished && !this._paused && !this._idle) {
+ this._currentTimePending = true;
+ } else if (this._idle) {
+ this._rewind();
+ this._idle = false;
+ }
+ this._startTime = null;
+ this._paused = true;
+ },
+ finish: function() {
+ if (this._idle)
+ return;
+ this.currentTime = this._playbackRate > 0 ? this._totalDuration : 0;
+ this._startTime = this._totalDuration - this.currentTime;
+ this._currentTimePending = false;
+ scope.applyDirtiedAnimation(this);
+ },
+ cancel: function() {
+ if (!this._inEffect)
+ return;
+ this._inEffect = false;
+ this._idle = true;
+ this._paused = false;
+ this._isFinished = true;
+ this._finishedFlag = true;
+ this._currentTime = 0;
+ this._startTime = null;
+ this._effect._update(null);
+ // effects are invalid after cancellation as the animation state
+ // needs to un-apply.
+ scope.applyDirtiedAnimation(this);
+ },
+ reverse: function() {
+ this.playbackRate *= -1;
+ this.play();
+ },
+ addEventListener: function(type, handler) {
+ if (typeof handler == 'function' && type == 'finish')
+ this._finishHandlers.push(handler);
+ },
+ removeEventListener: function(type, handler) {
+ if (type != 'finish')
+ return;
+ var index = this._finishHandlers.indexOf(handler);
+ if (index >= 0)
+ this._finishHandlers.splice(index, 1);
+ },
+ _fireEvents: function(baseTime) {
+ if (this._isFinished) {
+ if (!this._finishedFlag) {
+ var event = new AnimationEvent(this, this._currentTime, baseTime);
+ var handlers = this._finishHandlers.concat(this.onfinish ? [this.onfinish] : []);
+ setTimeout(function() {
+ handlers.forEach(function(handler) {
+ handler.call(event.target, event);
+ });
+ }, 0);
+ this._finishedFlag = true;
+ }
+ } else {
+ this._finishedFlag = false;
+ }
+ },
+ _tick: function(timelineTime, isAnimationFrame) {
+ if (!this._idle && !this._paused) {
+ if (this._startTime == null) {
+ if (isAnimationFrame) {
+ this.startTime = timelineTime - this._currentTime / this.playbackRate;
+ }
+ } else if (!this._isFinished) {
+ this._tickCurrentTime((timelineTime - this._startTime) * this.playbackRate);
+ }
+ }
+
+ if (isAnimationFrame) {
+ this._currentTimePending = false;
+ this._fireEvents(timelineTime);
+ }
+ },
+ get _needsTick() {
+ return (this.playState in {'pending': 1, 'running': 1}) || !this._finishedFlag;
+ },
+ _targetAnimations: function() {
+ var target = this._effect._target;
+ if (!target._activeAnimations) {
+ target._activeAnimations = [];
+ }
+ return target._activeAnimations;
+ },
+ _markTarget: function() {
+ var animations = this._targetAnimations();
+ if (animations.indexOf(this) === -1) {
+ animations.push(this);
+ }
+ },
+ _unmarkTarget: function() {
+ var animations = this._targetAnimations();
+ var index = animations.indexOf(this);
+ if (index !== -1) {
+ animations.splice(index, 1);
+ }
+ },
+ };
+
+ if (WEB_ANIMATIONS_TESTING) {
+ testing.webAnimations1Animation = scope.Animation;
+ }
+
+})(webAnimationsShared, webAnimations1, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/apply-preserving-inline-style.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/apply-preserving-inline-style.js
new file mode 100644
index 00000000000..4002a2f5688
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/apply-preserving-inline-style.js
@@ -0,0 +1,239 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(scope, testing) {
+
+ var SVG_TRANSFORM_PROP = '_webAnimationsUpdateSvgTransformAttr';
+
+ /**
+ * IE/Edge do not support `transform` styles for SVG elements. Instead,
+ * `transform` attribute can be animated with some restrictions.
+ * See https://connect.microsoft.com/IE/feedback/details/811744/ie11-bug-with-implementation-of-css-transforms-in-svg,
+ * https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/1173754/,
+ * https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/101242/, etc.
+ * The same problem is exhibited by pre-Chrome Android browsers (ICS).
+ * Unfortunately, there's no easy way to feature-detect it.
+ */
+ function updateSvgTransformAttr(window, element) {
+ if (!element.namespaceURI || element.namespaceURI.indexOf('/svg') == -1) {
+ return false;
+ }
+ if (!(SVG_TRANSFORM_PROP in window)) {
+ window[SVG_TRANSFORM_PROP] =
+ /Trident|MSIE|IEMobile|Edge|Android 4/i.test(window.navigator.userAgent);
+ }
+ return window[SVG_TRANSFORM_PROP];
+ }
+
+ var styleAttributes = {
+ cssText: 1,
+ length: 1,
+ parentRule: 1,
+ };
+
+ var styleMethods = {
+ getPropertyCSSValue: 1,
+ getPropertyPriority: 1,
+ getPropertyValue: 1,
+ item: 1,
+ removeProperty: 1,
+ setProperty: 1,
+ };
+
+ var styleMutatingMethods = {
+ removeProperty: 1,
+ setProperty: 1,
+ };
+
+ function configureProperty(object, property, descriptor) {
+ descriptor.enumerable = true;
+ descriptor.configurable = true;
+ Object.defineProperty(object, property, descriptor);
+ }
+
+ function AnimatedCSSStyleDeclaration(element) {
+ WEB_ANIMATIONS_TESTING && console.assert(!(element.style instanceof AnimatedCSSStyleDeclaration),
+ 'Element must not already have an animated style attached.');
+
+ this._element = element;
+ // Stores the inline style of the element on its behalf while the
+ // polyfill uses the element's inline style to simulate web animations.
+ // This is needed to fake regular inline style CSSOM access on the element.
+ this._surrogateStyle = document.createElementNS('http://www.w3.org/1999/xhtml', 'div').style;
+ this._style = element.style;
+ this._length = 0;
+ this._isAnimatedProperty = {};
+ this._updateSvgTransformAttr = updateSvgTransformAttr(window, element);
+ this._savedTransformAttr = null;
+
+ // Copy the inline style contents over to the surrogate.
+ for (var i = 0; i < this._style.length; i++) {
+ var property = this._style[i];
+ this._surrogateStyle[property] = this._style[property];
+ }
+ this._updateIndices();
+ }
+
+ AnimatedCSSStyleDeclaration.prototype = {
+ get cssText() {
+ return this._surrogateStyle.cssText;
+ },
+ set cssText(text) {
+ var isAffectedProperty = {};
+ for (var i = 0; i < this._surrogateStyle.length; i++) {
+ isAffectedProperty[this._surrogateStyle[i]] = true;
+ }
+ this._surrogateStyle.cssText = text;
+ this._updateIndices();
+ for (var i = 0; i < this._surrogateStyle.length; i++) {
+ isAffectedProperty[this._surrogateStyle[i]] = true;
+ }
+ for (var property in isAffectedProperty) {
+ if (!this._isAnimatedProperty[property]) {
+ this._style.setProperty(property, this._surrogateStyle.getPropertyValue(property));
+ }
+ }
+ },
+ get length() {
+ return this._surrogateStyle.length;
+ },
+ get parentRule() {
+ return this._style.parentRule;
+ },
+ // Mirror the indexed getters and setters of the surrogate style.
+ _updateIndices: function() {
+ while (this._length < this._surrogateStyle.length) {
+ Object.defineProperty(this, this._length, {
+ configurable: true,
+ enumerable: false,
+ get: (function(index) {
+ return function() { return this._surrogateStyle[index]; };
+ })(this._length)
+ });
+ this._length++;
+ }
+ while (this._length > this._surrogateStyle.length) {
+ this._length--;
+ Object.defineProperty(this, this._length, {
+ configurable: true,
+ enumerable: false,
+ value: undefined
+ });
+ }
+ },
+ _set: function(property, value) {
+ this._style[property] = value;
+ this._isAnimatedProperty[property] = true;
+ if (this._updateSvgTransformAttr &&
+ scope.unprefixedPropertyName(property) == 'transform') {
+ // On IE/Edge, also set SVG element's `transform` attribute to 2d
+ // matrix of the transform. The `transform` style does not work, but
+ // `transform` attribute can be used instead.
+ // Notice, if the platform indeed supports SVG/CSS transforms the CSS
+ // declaration is supposed to override the attribute.
+ if (this._savedTransformAttr == null) {
+ this._savedTransformAttr = this._element.getAttribute('transform');
+ }
+ this._element.setAttribute('transform', scope.transformToSvgMatrix(value));
+ }
+ },
+ _clear: function(property) {
+ this._style[property] = this._surrogateStyle[property];
+ if (this._updateSvgTransformAttr &&
+ scope.unprefixedPropertyName(property) == 'transform') {
+ if (this._savedTransformAttr) {
+ this._element.setAttribute('transform', this._savedTransformAttr);
+ } else {
+ this._element.removeAttribute('transform');
+ }
+ this._savedTransformAttr = null;
+ }
+ delete this._isAnimatedProperty[property];
+ },
+ };
+
+ // Wrap the style methods.
+ for (var method in styleMethods) {
+ AnimatedCSSStyleDeclaration.prototype[method] = (function(method, modifiesStyle) {
+ return function() {
+ var result = this._surrogateStyle[method].apply(this._surrogateStyle, arguments);
+ if (modifiesStyle) {
+ if (!this._isAnimatedProperty[arguments[0]])
+ this._style[method].apply(this._style, arguments);
+ this._updateIndices();
+ }
+ return result;
+ }
+ })(method, method in styleMutatingMethods);
+ }
+
+ // Wrap the style.cssProperty getters and setters.
+ for (var property in document.documentElement.style) {
+ if (property in styleAttributes || property in styleMethods) {
+ continue;
+ }
+ (function(property) {
+ configureProperty(AnimatedCSSStyleDeclaration.prototype, property, {
+ get: function() {
+ return this._surrogateStyle[property];
+ },
+ set: function(value) {
+ this._surrogateStyle[property] = value;
+ this._updateIndices();
+ if (!this._isAnimatedProperty[property])
+ this._style[property] = value;
+ }
+ });
+ })(property);
+ }
+
+ function ensureStyleIsPatched(element) {
+ if (element._webAnimationsPatchedStyle)
+ return;
+
+ var animatedStyle = new AnimatedCSSStyleDeclaration(element);
+ try {
+ configureProperty(element, 'style', { get: function() { return animatedStyle; } });
+ } catch (_) {
+ // iOS and older versions of Safari (pre v7) do not support overriding an element's
+ // style object. Animations will clobber any inline styles as a result.
+ element.style._set = function(property, value) {
+ element.style[property] = value;
+ };
+ element.style._clear = function(property) {
+ element.style[property] = '';
+ };
+ }
+
+ // We must keep a handle on the patched style to prevent it from getting GC'd.
+ element._webAnimationsPatchedStyle = element.style;
+ }
+
+ scope.apply = function(element, property, value) {
+ ensureStyleIsPatched(element);
+ element.style._set(scope.propertyName(property), value);
+ };
+
+ scope.clear = function(element, property) {
+ if (element._webAnimationsPatchedStyle) {
+ element.style._clear(scope.propertyName(property));
+ }
+ };
+
+ if (WEB_ANIMATIONS_TESTING) {
+ testing.ensureStyleIsPatched = ensureStyleIsPatched;
+ testing.updateSvgTransformAttr = updateSvgTransformAttr;
+ }
+
+})(webAnimations1, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/apply.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/apply.js
new file mode 100644
index 00000000000..3200f967eaa
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/apply.js
@@ -0,0 +1,25 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(scope, testing) {
+
+ scope.apply = function(element, property, value) {
+ element.style[scope.propertyName(property)] = value;
+ };
+
+ scope.clear = function(element, property) {
+ element.style[scope.propertyName(property)] = '';
+ };
+
+})(webAnimations1, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/box-handler.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/box-handler.js
new file mode 100644
index 00000000000..3399263a486
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/box-handler.js
@@ -0,0 +1,57 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(scope, testing) {
+ function consumeLengthPercentOrAuto(string) {
+ return scope.consumeLengthOrPercent(string) || scope.consumeToken(/^auto/, string);
+ }
+ function parseBox(string) {
+ var result = scope.consumeList([
+ scope.ignore(scope.consumeToken.bind(null, /^rect/)),
+ scope.ignore(scope.consumeToken.bind(null, /^\(/)),
+ scope.consumeRepeated.bind(null, consumeLengthPercentOrAuto, /^,/),
+ scope.ignore(scope.consumeToken.bind(null, /^\)/)),
+ ], string);
+ if (result && result[0].length == 4) {
+ return result[0];
+ }
+ }
+
+ function mergeComponent(left, right) {
+ if (left == 'auto' || right == 'auto') {
+ return [true, false, function(t) {
+ var result = t ? left : right;
+ if (result == 'auto') {
+ return 'auto';
+ }
+ // FIXME: There's probably a better way to turn a dimension back into a string.
+ var merged = scope.mergeDimensions(result, result);
+ return merged[2](merged[0]);
+ }];
+ }
+ return scope.mergeDimensions(left, right);
+ }
+
+ function wrap(result) {
+ return 'rect(' + result + ')';
+ }
+
+ var mergeBoxes = scope.mergeWrappedNestedRepeated.bind(null, wrap, mergeComponent, ', ');
+
+ scope.parseBox = parseBox;
+ scope.mergeBoxes = mergeBoxes;
+
+ scope.addPropertiesHandler(parseBox, mergeBoxes, ['clip']);
+
+})(webAnimations1, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/color-handler.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/color-handler.js
new file mode 100644
index 00000000000..3a05bff07fa
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/color-handler.js
@@ -0,0 +1,63 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(scope, testing) {
+
+ var canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');
+ canvas.width = canvas.height = 1;
+ var context = canvas.getContext('2d');
+
+ function parseColor(string) {
+ string = string.trim();
+ // The context ignores invalid colors
+ context.fillStyle = '#000';
+ context.fillStyle = string;
+ var contextSerializedFillStyle = context.fillStyle;
+ context.fillStyle = '#fff';
+ context.fillStyle = string;
+ if (contextSerializedFillStyle != context.fillStyle)
+ return;
+ context.fillRect(0, 0, 1, 1);
+ var pixelColor = context.getImageData(0, 0, 1, 1).data;
+ context.clearRect(0, 0, 1, 1);
+ var alpha = pixelColor[3] / 255;
+ return [pixelColor[0] * alpha, pixelColor[1] * alpha, pixelColor[2] * alpha, alpha];
+ }
+
+ function mergeColors(left, right) {
+ return [left, right, function(x) {
+ function clamp(v) {
+ return Math.max(0, Math.min(255, v));
+ }
+ if (x[3]) {
+ for (var i = 0; i < 3; i++)
+ x[i] = Math.round(clamp(x[i] / x[3]));
+ }
+ x[3] = scope.numberToString(scope.clamp(0, 1, x[3]));
+ return 'rgba(' + x.join(',') + ')';
+ }];
+ }
+
+ scope.addPropertiesHandler(parseColor, mergeColors,
+ ['background-color', 'border-bottom-color', 'border-left-color', 'border-right-color',
+ 'border-top-color', 'color', 'fill', 'flood-color', 'lighting-color',
+ 'outline-color', 'stop-color', 'stroke', 'text-decoration-color']);
+ scope.consumeColor = scope.consumeParenthesised.bind(null, parseColor);
+ scope.mergeColors = mergeColors;
+
+ if (WEB_ANIMATIONS_TESTING) {
+ testing.parseColor = parseColor;
+ }
+
+})(webAnimations1, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/deprecation.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/deprecation.js
new file mode 100644
index 00000000000..6bdb4a2223c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/deprecation.js
@@ -0,0 +1,47 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(shared) {
+
+ var silenced = {};
+
+ shared.isDeprecated = function(feature, date, advice, plural) {
+ if (WEB_ANIMATIONS_TESTING) {
+ return true;
+ }
+
+ var auxVerb = plural ? 'are' : 'is';
+ var today = new Date();
+ var expiry = new Date(date);
+ expiry.setMonth(expiry.getMonth() + 3); // 3 months grace period
+
+ if (today < expiry) {
+ if (!(feature in silenced)) {
+ console.warn('Web Animations: ' + feature + ' ' + auxVerb + ' deprecated and will stop working on ' + expiry.toDateString() + '. ' + advice);
+ }
+ silenced[feature] = true;
+ return false;
+ } else {
+ return true;
+ }
+ };
+
+ shared.deprecated = function(feature, date, advice, plural) {
+ var auxVerb = plural ? 'are' : 'is';
+ if (shared.isDeprecated(feature, date, advice, plural)) {
+ throw new Error(feature + ' ' + auxVerb + ' no longer supported. ' + advice);
+ }
+ };
+
+})(webAnimationsShared);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/dev.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/dev.js
new file mode 100644
index 00000000000..a5e225c08c2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/dev.js
@@ -0,0 +1,16 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+var WEB_ANIMATIONS_TESTING = false;
+var webAnimationsTesting = null;
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/dimension-handler.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/dimension-handler.js
new file mode 100644
index 00000000000..9e487f972a8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/dimension-handler.js
@@ -0,0 +1,240 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(scope, testing) {
+
+ // Evaluates a calc expression.
+ // https://drafts.csswg.org/css-values-3/#calc-notation
+ function calculate(expression) {
+ // In calc expressions, white space is required on both sides of the
+ // + and - operators. https://drafts.csswg.org/css-values-3/#calc-notation
+ // Thus any + or - immediately adjacent to . or 0..9 is part of the number,
+ // e.g. -1.23e+45
+ // This regular expression matches ( ) * / + - and numbers.
+ var tokenRegularExpression = /([\+\-\w\.]+|[\(\)\*\/])/g;
+ var currentToken;
+ function consume() {
+ var matchResult = tokenRegularExpression.exec(expression);
+ if (matchResult)
+ currentToken = matchResult[0];
+ else
+ currentToken = undefined;
+ }
+ consume(); // Read the initial token.
+
+ function calcNumber() {
+ // https://drafts.csswg.org/css-values-3/#number-value
+ var result = Number(currentToken);
+ consume();
+ return result;
+ }
+
+ function calcValue() {
+ // <calc-value> = <number> | <dimension> | <percentage> | ( <calc-sum> )
+ if (currentToken !== '(')
+ return calcNumber();
+ consume();
+ var result = calcSum();
+ if (currentToken !== ')')
+ return NaN;
+ consume();
+ return result;
+ }
+
+ function calcProduct() {
+ // <calc-product> = <calc-value> [ '*' <calc-value> | '/' <calc-number-value> ]*
+ var left = calcValue();
+ while (currentToken === '*' || currentToken === '/') {
+ var operator = currentToken;
+ consume();
+ var right = calcValue();
+ if (operator === '*')
+ left *= right;
+ else
+ left /= right;
+ }
+ return left;
+ }
+
+ function calcSum() {
+ // <calc-sum> = <calc-product> [ [ '+' | '-' ] <calc-product> ]*
+ var left = calcProduct();
+ while (currentToken === '+' || currentToken === '-') {
+ var operator = currentToken;
+ consume();
+ var right = calcProduct();
+ if (operator === '+')
+ left += right;
+ else
+ left -= right;
+ }
+ return left;
+ }
+
+ // <calc()> = calc( <calc-sum> )
+ return calcSum();
+ }
+
+ function parseDimension(unitRegExp, string) {
+ string = string.trim().toLowerCase();
+
+ if (string == '0' && 'px'.search(unitRegExp) >= 0)
+ return {px: 0};
+
+ // If we have parenthesis, we're a calc and need to start with 'calc'.
+ if (!/^[^(]*$|^calc/.test(string))
+ return;
+ string = string.replace(/calc\(/g, '(');
+
+ // We tag units by prefixing them with 'U' (note that we are already
+ // lowercase) to prevent problems with types which are substrings of
+ // each other (although prefixes may be problematic!)
+ var matchedUnits = {};
+ string = string.replace(unitRegExp, function(match) {
+ matchedUnits[match] = null;
+ return 'U' + match;
+ });
+ var taggedUnitRegExp = 'U(' + unitRegExp.source + ')';
+
+ // Validating input is simply applying as many reductions as we can.
+ var typeCheck = string.replace(/[-+]?(\d*\.)?\d+([Ee][-+]?\d+)?/g, 'N')
+ .replace(new RegExp('N' + taggedUnitRegExp, 'g'), 'D')
+ .replace(/\s[+-]\s/g, 'O')
+ .replace(/\s/g, '');
+ var reductions = [/N\*(D)/g, /(N|D)[*/]N/g, /(N|D)O\1/g, /\((N|D)\)/g];
+ var i = 0;
+ while (i < reductions.length) {
+ if (reductions[i].test(typeCheck)) {
+ typeCheck = typeCheck.replace(reductions[i], '$1');
+ i = 0;
+ } else {
+ i++;
+ }
+ }
+ if (typeCheck != 'D')
+ return;
+
+ for (var unit in matchedUnits) {
+ var result = calculate(string.replace(new RegExp('U' + unit, 'g'), '').replace(new RegExp(taggedUnitRegExp, 'g'), '*0'));
+ if (!isFinite(result))
+ return;
+ matchedUnits[unit] = result;
+ }
+ return matchedUnits;
+ }
+
+ function mergeDimensionsNonNegative(left, right) {
+ return mergeDimensions(left, right, true);
+ }
+
+ function mergeDimensions(left, right, nonNegative) {
+ var units = [], unit;
+ for (unit in left)
+ units.push(unit);
+ for (unit in right) {
+ if (units.indexOf(unit) < 0)
+ units.push(unit);
+ }
+
+ left = units.map(function(unit) { return left[unit] || 0; });
+ right = units.map(function(unit) { return right[unit] || 0; });
+ return [left, right, function(values) {
+ var result = values.map(function(value, i) {
+ if (values.length == 1 && nonNegative) {
+ value = Math.max(value, 0);
+ }
+ // Scientific notation (e.g. 1e2) is not yet widely supported by browser vendors.
+ return scope.numberToString(value) + units[i];
+ }).join(' + ');
+ return values.length > 1 ? 'calc(' + result + ')' : result;
+ }];
+ }
+
+ var lengthUnits = 'px|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc';
+ var parseLength = parseDimension.bind(null, new RegExp(lengthUnits, 'g'));
+ var parseLengthOrPercent = parseDimension.bind(null, new RegExp(lengthUnits + '|%', 'g'));
+ var parseAngle = parseDimension.bind(null, /deg|rad|grad|turn/g);
+
+ scope.parseLength = parseLength;
+ scope.parseLengthOrPercent = parseLengthOrPercent;
+ scope.consumeLengthOrPercent = scope.consumeParenthesised.bind(null, parseLengthOrPercent);
+ scope.parseAngle = parseAngle;
+ scope.mergeDimensions = mergeDimensions;
+
+ var consumeLength = scope.consumeParenthesised.bind(null, parseLength);
+ var consumeSizePair = scope.consumeRepeated.bind(undefined, consumeLength, /^/);
+ var consumeSizePairList = scope.consumeRepeated.bind(undefined, consumeSizePair, /^,/);
+ scope.consumeSizePairList = consumeSizePairList;
+
+ var parseSizePairList = function(input) {
+ var result = consumeSizePairList(input);
+ if (result && result[1] == '') {
+ return result[0];
+ }
+ };
+
+ var mergeNonNegativeSizePair = scope.mergeNestedRepeated.bind(undefined, mergeDimensionsNonNegative, ' ');
+ var mergeNonNegativeSizePairList = scope.mergeNestedRepeated.bind(undefined, mergeNonNegativeSizePair, ',');
+ scope.mergeNonNegativeSizePair = mergeNonNegativeSizePair;
+
+ scope.addPropertiesHandler(parseSizePairList, mergeNonNegativeSizePairList, [
+ 'background-size'
+ ]);
+
+ scope.addPropertiesHandler(parseLengthOrPercent, mergeDimensionsNonNegative, [
+ 'border-bottom-width',
+ 'border-image-width',
+ 'border-left-width',
+ 'border-right-width',
+ 'border-top-width',
+ 'flex-basis',
+ 'font-size',
+ 'height',
+ 'line-height',
+ 'max-height',
+ 'max-width',
+ 'outline-width',
+ 'width',
+ ]);
+
+ scope.addPropertiesHandler(parseLengthOrPercent, mergeDimensions, [
+ 'border-bottom-left-radius',
+ 'border-bottom-right-radius',
+ 'border-top-left-radius',
+ 'border-top-right-radius',
+ 'bottom',
+ 'left',
+ 'letter-spacing',
+ 'margin-bottom',
+ 'margin-left',
+ 'margin-right',
+ 'margin-top',
+ 'min-height',
+ 'min-width',
+ 'outline-offset',
+ 'padding-bottom',
+ 'padding-left',
+ 'padding-right',
+ 'padding-top',
+ 'perspective',
+ 'right',
+ 'shape-margin',
+ 'stroke-dashoffset',
+ 'text-indent',
+ 'top',
+ 'vertical-align',
+ 'word-spacing',
+ ]);
+
+})(webAnimations1, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/effect-callback.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/effect-callback.js
new file mode 100644
index 00000000000..3051a59303e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/effect-callback.js
@@ -0,0 +1,98 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+(function(shared, scope, testing) {
+
+ var nullTarget = document.createElementNS('http://www.w3.org/1999/xhtml', 'div');
+
+ var sequenceNumber = 0;
+ scope.bindAnimationForCustomEffect = function(animation) {
+ var target = animation.effect.target;
+ var effectFunction;
+ var isKeyframeEffect = typeof animation.effect.getFrames() == 'function';
+ if (isKeyframeEffect) {
+ effectFunction = animation.effect.getFrames();
+ } else {
+ effectFunction = animation.effect._onsample;
+ }
+ var timing = animation.effect.timing;
+ var last = null;
+ timing = shared.normalizeTimingInput(timing);
+ var callback = function() {
+ var t = callback._animation ? callback._animation.currentTime : null;
+ if (t !== null) {
+ t = shared.calculateIterationProgress(shared.calculateActiveDuration(timing), t, timing);
+ if (isNaN(t))
+ t = null;
+ }
+ // FIXME: There are actually more conditions under which the effectFunction
+ // should be called.
+ if (t !== last) {
+ if (isKeyframeEffect) {
+ effectFunction(t, target, animation.effect);
+ } else {
+ effectFunction(t, animation.effect, animation.effect._animation);
+ }
+ }
+ last = t;
+ };
+
+ callback._animation = animation;
+ callback._registered = false;
+ callback._sequenceNumber = sequenceNumber++;
+ animation._callback = callback;
+ register(callback);
+ };
+
+ var callbacks = [];
+ var ticking = false;
+ function register(callback) {
+ if (callback._registered)
+ return;
+ callback._registered = true;
+ callbacks.push(callback);
+ if (!ticking) {
+ ticking = true;
+ requestAnimationFrame(tick);
+ }
+ }
+
+ function tick(t) {
+ var updating = callbacks;
+ callbacks = [];
+ updating.sort(function(left, right) {
+ return left._sequenceNumber - right._sequenceNumber;
+ });
+ updating = updating.filter(function(callback) {
+ callback();
+ var playState = callback._animation ? callback._animation.playState : 'idle';
+ if (playState != 'running' && playState != 'pending')
+ callback._registered = false;
+ return callback._registered;
+ });
+ callbacks.push.apply(callbacks, updating);
+
+ if (callbacks.length) {
+ ticking = true;
+ requestAnimationFrame(tick);
+ } else {
+ ticking = false;
+ }
+ }
+
+ scope.Animation.prototype._register = function() {
+ if (this._callback)
+ register(this._callback);
+ };
+
+})(webAnimationsShared, webAnimationsNext, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/element-animatable.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/element-animatable.js
new file mode 100644
index 00000000000..765edf06fec
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/element-animatable.js
@@ -0,0 +1,23 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(scope) {
+ window.Element.prototype.animate = function(effectInput, options) {
+ var id = '';
+ if (options && options.id) {
+ id = options.id;
+ }
+ return scope.timeline._play(scope.KeyframeEffect(this, effectInput, options, id));
+ };
+})(webAnimations1);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/font-weight-handler.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/font-weight-handler.js
new file mode 100644
index 00000000000..4760486a66c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/font-weight-handler.js
@@ -0,0 +1,42 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(scope) {
+ function parse(string) {
+ var out = Number(string);
+ if (isNaN(out) || out < 100 || out > 900 || out % 100 !== 0) {
+ return;
+ }
+ return out;
+ }
+
+ function toCss(value) {
+ value = Math.round(value / 100) * 100;
+ value = scope.clamp(100, 900, value);
+ if (value === 400) {
+ return 'normal';
+ }
+ if (value === 700) {
+ return 'bold';
+ }
+ return String(value);
+ }
+
+ function merge(left, right) {
+ return [left, right, toCss];
+ }
+
+ scope.addPropertiesHandler(parse, merge, ['font-weight']);
+
+})(webAnimations1);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/group-constructors.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/group-constructors.js
new file mode 100644
index 00000000000..e5c0a102b07
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/group-constructors.js
@@ -0,0 +1,204 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(shared, scope, testing) {
+
+ function groupChildDuration(node) {
+ return node._timing.delay + node.activeDuration + node._timing.endDelay;
+ }
+
+ function constructor(children, timingInput, id) {
+ this._id = id;
+ this._parent = null;
+ this.children = children || [];
+ this._reparent(this.children);
+ timingInput = shared.numericTimingToObject(timingInput);
+ this._timingInput = shared.cloneTimingInput(timingInput);
+ this._timing = shared.normalizeTimingInput(timingInput, true);
+ this.timing = shared.makeTiming(timingInput, true, this);
+ this.timing._effect = this;
+
+ if (this._timing.duration === 'auto') {
+ this._timing.duration = this.activeDuration;
+ }
+ }
+
+ window.SequenceEffect = function() {
+ constructor.apply(this, arguments);
+ };
+
+ window.GroupEffect = function() {
+ constructor.apply(this, arguments);
+ };
+
+ constructor.prototype = {
+ _isAncestor: function(effect) {
+ var a = this;
+ while (a !== null) {
+ if (a == effect)
+ return true;
+ a = a._parent;
+ }
+ return false;
+ },
+ _rebuild: function() {
+ // Re-calculate durations for ancestors with specified duration 'auto'.
+ var node = this;
+ while (node) {
+ if (node.timing.duration === 'auto') {
+ node._timing.duration = node.activeDuration;
+ }
+ node = node._parent;
+ }
+ if (this._animation) {
+ this._animation._rebuildUnderlyingAnimation();
+ }
+ },
+ _reparent: function(newChildren) {
+ scope.removeMulti(newChildren);
+ for (var i = 0; i < newChildren.length; i++) {
+ newChildren[i]._parent = this;
+ }
+ },
+ _putChild: function(args, isAppend) {
+ var message = isAppend ? 'Cannot append an ancestor or self' : 'Cannot prepend an ancestor or self';
+ for (var i = 0; i < args.length; i++) {
+ if (this._isAncestor(args[i])) {
+ throw {
+ type: DOMException.HIERARCHY_REQUEST_ERR,
+ name: 'HierarchyRequestError',
+ message: message
+ };
+ }
+ }
+ var oldParents = [];
+ for (var i = 0; i < args.length; i++) {
+ isAppend ? this.children.push(args[i]) : this.children.unshift(args[i]);
+ }
+ this._reparent(args);
+ this._rebuild();
+ },
+ append: function() {
+ this._putChild(arguments, true);
+ },
+ prepend: function() {
+ this._putChild(arguments, false);
+ },
+ get parent() {
+ return this._parent;
+ },
+ get firstChild() {
+ return this.children.length ? this.children[0] : null;
+ },
+ get lastChild() {
+ return this.children.length ? this.children[this.children.length - 1] : null;
+ },
+ clone: function() {
+ var clonedTiming = shared.cloneTimingInput(this._timingInput);
+ var clonedChildren = [];
+ for (var i = 0; i < this.children.length; i++) {
+ clonedChildren.push(this.children[i].clone());
+ }
+ return (this instanceof GroupEffect) ?
+ new GroupEffect(clonedChildren, clonedTiming) :
+ new SequenceEffect(clonedChildren, clonedTiming);
+ },
+ remove: function() {
+ scope.removeMulti([this]);
+ }
+ };
+
+ window.SequenceEffect.prototype = Object.create(constructor.prototype);
+ Object.defineProperty(
+ window.SequenceEffect.prototype,
+ 'activeDuration',
+ {
+ get: function() {
+ var total = 0;
+ this.children.forEach(function(child) {
+ total += groupChildDuration(child);
+ });
+ return Math.max(total, 0);
+ }
+ });
+
+ window.GroupEffect.prototype = Object.create(constructor.prototype);
+ Object.defineProperty(
+ window.GroupEffect.prototype,
+ 'activeDuration',
+ {
+ get: function() {
+ var max = 0;
+ this.children.forEach(function(child) {
+ max = Math.max(max, groupChildDuration(child));
+ });
+ return max;
+ }
+ });
+
+ scope.newUnderlyingAnimationForGroup = function(group) {
+ var underlyingAnimation;
+ var timing = null;
+ var ticker = function(tf) {
+ var animation = underlyingAnimation._wrapper;
+ if (!animation) {
+ return;
+ }
+ if (animation.playState == 'pending') {
+ return;
+ }
+ if (!animation.effect) {
+ return;
+ }
+ if (tf == null) {
+ animation._removeChildAnimations();
+ return;
+ }
+
+ // If the group has a negative playback rate and is not fill backwards/both, then it should go
+ // out of effect when it reaches the start of its active interval (tf == 0). If it is fill
+ // backwards/both then it should stay in effect. calculateIterationProgress will return 0 in the
+ // backwards-filling case, and null otherwise.
+ if (tf == 0 && animation.playbackRate < 0) {
+ if (!timing) {
+ timing = shared.normalizeTimingInput(animation.effect.timing);
+ }
+ tf = shared.calculateIterationProgress(shared.calculateActiveDuration(timing), -1, timing);
+ if (isNaN(tf) || tf == null) {
+ animation._forEachChild(function(child) {
+ child.currentTime = -1;
+ });
+ animation._removeChildAnimations();
+ return;
+ }
+ }
+ };
+
+ var underlyingEffect = new KeyframeEffect(null, [], group._timing, group._id);
+ underlyingEffect.onsample = ticker;
+ underlyingAnimation = scope.timeline._play(underlyingEffect);
+ return underlyingAnimation;
+ };
+
+ scope.bindAnimationForGroup = function(animation) {
+ animation._animation._wrapper = animation;
+ animation._isGroup = true;
+ scope.awaitStartTime(animation);
+ animation._constructChildAnimations();
+ animation._setExternalAnimation(animation);
+ };
+
+ scope.groupChildDuration = groupChildDuration;
+
+})(webAnimationsShared, webAnimationsNext, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/handler-utils.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/handler-utils.js
new file mode 100644
index 00000000000..d9f05e17e99
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/handler-utils.js
@@ -0,0 +1,177 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(scope) {
+
+ // consume* functions return a 2 value array of [parsed-data, '' or not-yet consumed input]
+
+ // Regex should be anchored with /^
+ function consumeToken(regex, string) {
+ var result = regex.exec(string);
+ if (result) {
+ result = regex.ignoreCase ? result[0].toLowerCase() : result[0];
+ return [result, string.substr(result.length)];
+ }
+ }
+
+ function consumeTrimmed(consumer, string) {
+ string = string.replace(/^\s*/, '');
+ var result = consumer(string);
+ if (result) {
+ return [result[0], result[1].replace(/^\s*/, '')];
+ }
+ }
+
+ function consumeRepeated(consumer, separator, string) {
+ consumer = consumeTrimmed.bind(null, consumer);
+ var list = [];
+ while (true) {
+ var result = consumer(string);
+ if (!result) {
+ return [list, string];
+ }
+ list.push(result[0]);
+ string = result[1];
+ result = consumeToken(separator, string);
+ if (!result || result[1] == '') {
+ return [list, string];
+ }
+ string = result[1];
+ }
+ }
+
+ // Consumes a token or expression with balanced parentheses
+ function consumeParenthesised(parser, string) {
+ var nesting = 0;
+ for (var n = 0; n < string.length; n++) {
+ if (/\s|,/.test(string[n]) && nesting == 0) {
+ break;
+ } else if (string[n] == '(') {
+ nesting++;
+ } else if (string[n] == ')') {
+ nesting--;
+ if (nesting == 0)
+ n++;
+ if (nesting <= 0)
+ break;
+ }
+ }
+ var parsed = parser(string.substr(0, n));
+ return parsed == undefined ? undefined : [parsed, string.substr(n)];
+ }
+
+ function lcm(a, b) {
+ var c = a;
+ var d = b;
+ while (c && d)
+ c > d ? c %= d : d %= c;
+ c = (a * b) / (c + d);
+ return c;
+ }
+
+ function ignore(value) {
+ return function(input) {
+ var result = value(input);
+ if (result)
+ result[0] = undefined;
+ return result;
+ }
+ }
+
+ function optional(value, defaultValue) {
+ return function(input) {
+ var result = value(input);
+ if (result)
+ return result;
+ return [defaultValue, input];
+ }
+ }
+
+ function consumeList(list, input) {
+ var output = [];
+ for (var i = 0; i < list.length; i++) {
+ var result = scope.consumeTrimmed(list[i], input);
+ if (!result || result[0] == '')
+ return;
+ if (result[0] !== undefined)
+ output.push(result[0]);
+ input = result[1];
+ }
+ if (input == '') {
+ return output;
+ }
+ }
+
+ function mergeWrappedNestedRepeated(wrap, nestedMerge, separator, left, right) {
+ var matchingLeft = [];
+ var matchingRight = [];
+ var reconsititution = [];
+ var length = lcm(left.length, right.length);
+ for (var i = 0; i < length; i++) {
+ var thing = nestedMerge(left[i % left.length], right[i % right.length]);
+ if (!thing) {
+ return;
+ }
+ matchingLeft.push(thing[0]);
+ matchingRight.push(thing[1]);
+ reconsititution.push(thing[2]);
+ }
+ return [matchingLeft, matchingRight, function(positions) {
+ var result = positions.map(function(position, i) {
+ return reconsititution[i](position);
+ }).join(separator);
+ return wrap ? wrap(result) : result;
+ }];
+ }
+
+ function mergeList(left, right, list) {
+ var lefts = [];
+ var rights = [];
+ var functions = [];
+ var j = 0;
+ for (var i = 0; i < list.length; i++) {
+ if (typeof list[i] == 'function') {
+ var result = list[i](left[j], right[j++]);
+ lefts.push(result[0]);
+ rights.push(result[1]);
+ functions.push(result[2]);
+ } else {
+ (function(pos) {
+ lefts.push(false);
+ rights.push(false);
+ functions.push(function() { return list[pos]; });
+ })(i);
+ }
+ }
+ return [lefts, rights, function(results) {
+ var result = '';
+ for (var i = 0; i < results.length; i++) {
+ result += functions[i](results[i]);
+ }
+ return result;
+ }];
+ }
+
+ scope.consumeToken = consumeToken;
+ scope.consumeTrimmed = consumeTrimmed;
+ scope.consumeRepeated = consumeRepeated;
+ scope.consumeParenthesised = consumeParenthesised;
+ scope.ignore = ignore;
+ scope.optional = optional;
+ scope.consumeList = consumeList;
+ scope.mergeNestedRepeated = mergeWrappedNestedRepeated.bind(null, null);
+ scope.mergeWrappedNestedRepeated = mergeWrappedNestedRepeated;
+ scope.mergeList = mergeList;
+
+})(webAnimations1);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/interpolation.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/interpolation.js
new file mode 100644
index 00000000000..ba63ed358fd
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/interpolation.js
@@ -0,0 +1,49 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(scope, testing) {
+
+ function interpolate(from, to, f) {
+ if ((typeof from == 'number') && (typeof to == 'number')) {
+ return from * (1 - f) + to * f;
+ }
+ if ((typeof from == 'boolean') && (typeof to == 'boolean')) {
+ return f < 0.5 ? from : to;
+ }
+
+ WEB_ANIMATIONS_TESTING && console.assert(
+ Array.isArray(from) && Array.isArray(to),
+ 'If interpolation arguments are not numbers or bools they must be arrays');
+
+ if (from.length == to.length) {
+ var r = [];
+ for (var i = 0; i < from.length; i++) {
+ r.push(interpolate(from[i], to[i], f));
+ }
+ return r;
+ }
+ throw 'Mismatched interpolation arguments ' + from + ':' + to;
+ }
+
+ scope.Interpolation = function(from, to, convertToString) {
+ return function(f) {
+ return convertToString(interpolate(from, to, f));
+ }
+ };
+
+ if (WEB_ANIMATIONS_TESTING) {
+ testing.interpolate = interpolate;
+ }
+
+})(webAnimations1, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/keyframe-effect-constructor.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/keyframe-effect-constructor.js
new file mode 100644
index 00000000000..3d0f1bd6b1a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/keyframe-effect-constructor.js
@@ -0,0 +1,183 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(shared, scope, testing) {
+
+ var disassociate = function(effect) {
+ effect._animation = undefined;
+ if (effect instanceof window.SequenceEffect || effect instanceof window.GroupEffect) {
+ for (var i = 0; i < effect.children.length; i++) {
+ disassociate(effect.children[i]);
+ }
+ }
+ };
+
+ scope.removeMulti = function(effects) {
+ var oldParents = [];
+ for (var i = 0; i < effects.length; i++) {
+ var effect = effects[i];
+ if (effect._parent) {
+ if (oldParents.indexOf(effect._parent) == -1) {
+ oldParents.push(effect._parent);
+ }
+ effect._parent.children.splice(effect._parent.children.indexOf(effect), 1);
+ effect._parent = null;
+ disassociate(effect);
+ } else if (effect._animation && (effect._animation.effect == effect)) {
+ effect._animation.cancel();
+ effect._animation.effect = new KeyframeEffect(null, []);
+ if (effect._animation._callback) {
+ effect._animation._callback._animation = null;
+ }
+ effect._animation._rebuildUnderlyingAnimation();
+ disassociate(effect);
+ }
+ }
+ for (i = 0; i < oldParents.length; i++) {
+ oldParents[i]._rebuild();
+ }
+ };
+
+ function KeyframeList(effectInput) {
+ this._frames = shared.normalizeKeyframes(effectInput);
+ }
+
+ scope.KeyframeEffect = function(target, effectInput, timingInput, id) {
+ this.target = target;
+ this._parent = null;
+
+ timingInput = shared.numericTimingToObject(timingInput);
+ this._timingInput = shared.cloneTimingInput(timingInput);
+ this._timing = shared.normalizeTimingInput(timingInput);
+
+ this.timing = shared.makeTiming(timingInput, false, this);
+ this.timing._effect = this;
+ if (typeof effectInput == 'function') {
+ shared.deprecated('Custom KeyframeEffect', '2015-06-22', 'Use KeyframeEffect.onsample instead.');
+ this._normalizedKeyframes = effectInput;
+ } else {
+ this._normalizedKeyframes = new KeyframeList(effectInput);
+ }
+ this._keyframes = effectInput;
+ this.activeDuration = shared.calculateActiveDuration(this._timing);
+ this._id = id;
+ return this;
+ };
+
+ scope.KeyframeEffect.prototype = {
+ getFrames: function() {
+ if (typeof this._normalizedKeyframes == 'function')
+ return this._normalizedKeyframes;
+ return this._normalizedKeyframes._frames;
+ },
+ set onsample(callback) {
+ if (typeof this.getFrames() == 'function') {
+ throw new Error('Setting onsample on custom effect KeyframeEffect is not supported.');
+ }
+ this._onsample = callback;
+ if (this._animation) {
+ this._animation._rebuildUnderlyingAnimation();
+ }
+ },
+ get parent() {
+ return this._parent;
+ },
+ clone: function() {
+ if (typeof this.getFrames() == 'function') {
+ throw new Error('Cloning custom effects is not supported.');
+ }
+ var clone = new KeyframeEffect(this.target, [], shared.cloneTimingInput(this._timingInput), this._id);
+ clone._normalizedKeyframes = this._normalizedKeyframes;
+ clone._keyframes = this._keyframes;
+ return clone;
+ },
+ remove: function() {
+ scope.removeMulti([this]);
+ }
+ };
+
+ var originalElementAnimate = Element.prototype.animate;
+ Element.prototype.animate = function(effectInput, options) {
+ var id = '';
+ if (options && options.id) {
+ id = options.id;
+ }
+ return scope.timeline._play(new scope.KeyframeEffect(this, effectInput, options, id));
+ };
+
+ var nullTarget = document.createElementNS('http://www.w3.org/1999/xhtml', 'div');
+ scope.newUnderlyingAnimationForKeyframeEffect = function(keyframeEffect) {
+ if (keyframeEffect) {
+ var target = keyframeEffect.target || nullTarget;
+ var keyframes = keyframeEffect._keyframes;
+ if (typeof keyframes == 'function') {
+ keyframes = [];
+ }
+ var options = keyframeEffect._timingInput;
+ options.id = keyframeEffect._id;
+ } else {
+ var target = nullTarget;
+ var keyframes = [];
+ var options = 0;
+ }
+ return originalElementAnimate.apply(target, [keyframes, options]);
+ };
+
+ // TODO: Remove this once we remove support for custom KeyframeEffects.
+ scope.bindAnimationForKeyframeEffect = function(animation) {
+ if (animation.effect && typeof animation.effect._normalizedKeyframes == 'function') {
+ scope.bindAnimationForCustomEffect(animation);
+ }
+ };
+
+ var pendingGroups = [];
+ scope.awaitStartTime = function(groupAnimation) {
+ if (groupAnimation.startTime !== null || !groupAnimation._isGroup)
+ return;
+ if (pendingGroups.length == 0) {
+ requestAnimationFrame(updatePendingGroups);
+ }
+ pendingGroups.push(groupAnimation);
+ };
+ function updatePendingGroups() {
+ var updated = false;
+ while (pendingGroups.length) {
+ var group = pendingGroups.shift();
+ group._updateChildren();
+ updated = true;
+ }
+ return updated;
+ }
+ var originalGetComputedStyle = window.getComputedStyle;
+ Object.defineProperty(window, 'getComputedStyle', {
+ configurable: true,
+ enumerable: true,
+ value: function() {
+ scope.timeline._updateAnimationsPromises();
+ var result = originalGetComputedStyle.apply(this, arguments);
+ if (updatePendingGroups())
+ result = originalGetComputedStyle.apply(this, arguments);
+ scope.timeline._updateAnimationsPromises();
+ return result;
+ },
+ });
+
+ window.KeyframeEffect = scope.KeyframeEffect;
+ window.Element.prototype.getAnimations = function() {
+ return document.timeline.getAnimations().filter(function(animation) {
+ return animation.effect !== null && animation.effect.target == this;
+ }.bind(this));
+ };
+
+}(webAnimationsShared, webAnimationsNext, webAnimationsTesting));
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/keyframe-effect.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/keyframe-effect.js
new file mode 100644
index 00000000000..7775d5852b9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/keyframe-effect.js
@@ -0,0 +1,57 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(shared, scope, testing) {
+
+ function EffectTime(timing) {
+ var timeFraction = 0;
+ var activeDuration = shared.calculateActiveDuration(timing);
+ var effectTime = function(localTime) {
+ return shared.calculateIterationProgress(activeDuration, localTime, timing);
+ };
+ effectTime._totalDuration = timing.delay + activeDuration + timing.endDelay;
+ return effectTime;
+ }
+
+ scope.KeyframeEffect = function(target, effectInput, timingInput, id) {
+ var effectTime = EffectTime(shared.normalizeTimingInput(timingInput));
+ var interpolations = scope.convertEffectInput(effectInput);
+ var timeFraction;
+ var keyframeEffect = function() {
+ WEB_ANIMATIONS_TESTING && console.assert(typeof timeFraction !== 'undefined');
+ interpolations(target, timeFraction);
+ };
+ // Returns whether the keyframeEffect is in effect or not after the timing update.
+ keyframeEffect._update = function(localTime) {
+ timeFraction = effectTime(localTime);
+ return timeFraction !== null;
+ };
+ keyframeEffect._clear = function() {
+ interpolations(target, null);
+ };
+ keyframeEffect._hasSameTarget = function(otherTarget) {
+ return target === otherTarget;
+ };
+ keyframeEffect._target = target;
+ keyframeEffect._totalDuration = effectTime._totalDuration;
+ keyframeEffect._id = id;
+ return keyframeEffect;
+ };
+
+ if (WEB_ANIMATIONS_TESTING) {
+ testing.webAnimations1KeyframeEffect = scope.KeyframeEffect;
+ testing.effectTime = EffectTime;
+ }
+
+})(webAnimationsShared, webAnimations1, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/keyframe-interpolations.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/keyframe-interpolations.js
new file mode 100644
index 00000000000..cab801edb2b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/keyframe-interpolations.js
@@ -0,0 +1,123 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(shared, scope, testing) {
+
+ scope.convertEffectInput = function(effectInput) {
+ var keyframes = shared.normalizeKeyframes(effectInput);
+ var propertySpecificKeyframeGroups = makePropertySpecificKeyframeGroups(keyframes);
+ var interpolations = makeInterpolations(propertySpecificKeyframeGroups);
+ return function(target, fraction) {
+ if (fraction != null) {
+ interpolations.filter(function(interpolation) {
+ return fraction >= interpolation.applyFrom && fraction < interpolation.applyTo;
+ }).forEach(function(interpolation) {
+ var offsetFraction = fraction - interpolation.startOffset;
+ var localDuration = interpolation.endOffset - interpolation.startOffset;
+ var scaledLocalTime = localDuration == 0 ? 0 : interpolation.easingFunction(offsetFraction / localDuration);
+ scope.apply(target, interpolation.property, interpolation.interpolation(scaledLocalTime));
+ });
+ } else {
+ for (var property in propertySpecificKeyframeGroups)
+ if (property != 'offset' && property != 'easing' && property != 'composite')
+ scope.clear(target, property);
+ }
+ };
+ };
+
+
+ function makePropertySpecificKeyframeGroups(keyframes) {
+ var propertySpecificKeyframeGroups = {};
+
+ for (var i = 0; i < keyframes.length; i++) {
+ for (var member in keyframes[i]) {
+ if (member != 'offset' && member != 'easing' && member != 'composite') {
+ var propertySpecificKeyframe = {
+ offset: keyframes[i].offset,
+ easing: keyframes[i].easing,
+ value: keyframes[i][member]
+ };
+ propertySpecificKeyframeGroups[member] = propertySpecificKeyframeGroups[member] || [];
+ propertySpecificKeyframeGroups[member].push(propertySpecificKeyframe);
+ }
+ }
+ }
+
+ for (var groupName in propertySpecificKeyframeGroups) {
+ var group = propertySpecificKeyframeGroups[groupName];
+ if (group[0].offset != 0 || group[group.length - 1].offset != 1) {
+ throw {
+ type: DOMException.NOT_SUPPORTED_ERR,
+ name: 'NotSupportedError',
+ message: 'Partial keyframes are not supported'
+ };
+ }
+ }
+ return propertySpecificKeyframeGroups;
+ }
+
+
+ function makeInterpolations(propertySpecificKeyframeGroups) {
+ var interpolations = [];
+ for (var groupName in propertySpecificKeyframeGroups) {
+ var keyframes = propertySpecificKeyframeGroups[groupName];
+ for (var i = 0; i < keyframes.length - 1; i++) {
+ var startIndex = i;
+ var endIndex = i + 1;
+ var startOffset = keyframes[startIndex].offset;
+ var endOffset = keyframes[endIndex].offset;
+ var applyFrom = startOffset;
+ var applyTo = endOffset;
+
+ if (i == 0) {
+ applyFrom = -Infinity;
+ WEB_ANIMATIONS_TESTING && console.assert(startOffset == 0);
+ if (endOffset == 0) {
+ endIndex = startIndex;
+ }
+ }
+ if (i == keyframes.length - 2) {
+ applyTo = Infinity;
+ WEB_ANIMATIONS_TESTING && console.assert(endOffset == 1);
+ if (startOffset == 1) {
+ startIndex = endIndex;
+ }
+ }
+
+ interpolations.push({
+ applyFrom: applyFrom,
+ applyTo: applyTo,
+ startOffset: keyframes[startIndex].offset,
+ endOffset: keyframes[endIndex].offset,
+ easingFunction: shared.parseEasingFunction(keyframes[startIndex].easing),
+ property: groupName,
+ interpolation: scope.propertyInterpolation(groupName,
+ keyframes[startIndex].value,
+ keyframes[endIndex].value)
+ });
+ }
+ }
+ interpolations.sort(function(leftInterpolation, rightInterpolation) {
+ return leftInterpolation.startOffset - rightInterpolation.startOffset;
+ });
+ return interpolations;
+ }
+
+
+ if (WEB_ANIMATIONS_TESTING) {
+ testing.makePropertySpecificKeyframeGroups = makePropertySpecificKeyframeGroups;
+ testing.makeInterpolations = makeInterpolations;
+ }
+
+})(webAnimationsShared, webAnimations1, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/matrix-decomposition.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/matrix-decomposition.js
new file mode 100644
index 00000000000..aa9cfe7690f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/matrix-decomposition.js
@@ -0,0 +1,440 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(scope, testing) {
+ var decomposeMatrix = (function() {
+ function determinant(m) {
+ return m[0][0] * m[1][1] * m[2][2] +
+ m[1][0] * m[2][1] * m[0][2] +
+ m[2][0] * m[0][1] * m[1][2] -
+ m[0][2] * m[1][1] * m[2][0] -
+ m[1][2] * m[2][1] * m[0][0] -
+ m[2][2] * m[0][1] * m[1][0];
+ }
+
+ // from Wikipedia:
+ //
+ // [A B]^-1 = [A^-1 + A^-1B(D - CA^-1B)^-1CA^-1 -A^-1B(D - CA^-1B)^-1]
+ // [C D] [-(D - CA^-1B)^-1CA^-1 (D - CA^-1B)^-1 ]
+ //
+ // Therefore
+ //
+ // [A [0]]^-1 = [A^-1 [0]]
+ // [C 1 ] [ -CA^-1 1 ]
+ function inverse(m) {
+ var iDet = 1 / determinant(m);
+ var a = m[0][0], b = m[0][1], c = m[0][2];
+ var d = m[1][0], e = m[1][1], f = m[1][2];
+ var g = m[2][0], h = m[2][1], k = m[2][2];
+ var Ainv = [
+ [(e * k - f * h) * iDet, (c * h - b * k) * iDet,
+ (b * f - c * e) * iDet, 0],
+ [(f * g - d * k) * iDet, (a * k - c * g) * iDet,
+ (c * d - a * f) * iDet, 0],
+ [(d * h - e * g) * iDet, (g * b - a * h) * iDet,
+ (a * e - b * d) * iDet, 0]
+ ];
+ var lastRow = [];
+ for (var i = 0; i < 3; i++) {
+ var val = 0;
+ for (var j = 0; j < 3; j++) {
+ val += m[3][j] * Ainv[j][i];
+ }
+ lastRow.push(val);
+ }
+ lastRow.push(1);
+ Ainv.push(lastRow);
+ return Ainv;
+ }
+
+ function transposeMatrix4(m) {
+ return [[m[0][0], m[1][0], m[2][0], m[3][0]],
+ [m[0][1], m[1][1], m[2][1], m[3][1]],
+ [m[0][2], m[1][2], m[2][2], m[3][2]],
+ [m[0][3], m[1][3], m[2][3], m[3][3]]];
+ }
+
+ function multVecMatrix(v, m) {
+ var result = [];
+ for (var i = 0; i < 4; i++) {
+ var val = 0;
+ for (var j = 0; j < 4; j++) {
+ val += v[j] * m[j][i];
+ }
+ result.push(val);
+ }
+ return result;
+ }
+
+ function normalize(v) {
+ var len = length(v);
+ return [v[0] / len, v[1] / len, v[2] / len];
+ }
+
+ function length(v) {
+ return Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
+ }
+
+ function combine(v1, v2, v1s, v2s) {
+ return [v1s * v1[0] + v2s * v2[0], v1s * v1[1] + v2s * v2[1],
+ v1s * v1[2] + v2s * v2[2]];
+ }
+
+ function cross(v1, v2) {
+ return [v1[1] * v2[2] - v1[2] * v2[1],
+ v1[2] * v2[0] - v1[0] * v2[2],
+ v1[0] * v2[1] - v1[1] * v2[0]];
+ }
+
+ function decomposeMatrix(matrix) {
+ var m3d = [
+ matrix.slice(0, 4),
+ matrix.slice(4, 8),
+ matrix.slice(8, 12),
+ matrix.slice(12, 16)
+ ];
+
+ // skip normalization step as m3d[3][3] should always be 1
+ if (m3d[3][3] !== 1) {
+ return null;
+ }
+
+ var perspectiveMatrix = [];
+ for (var i = 0; i < 4; i++) {
+ perspectiveMatrix.push(m3d[i].slice());
+ }
+
+ for (var i = 0; i < 3; i++) {
+ perspectiveMatrix[i][3] = 0;
+ }
+
+ if (determinant(perspectiveMatrix) === 0) {
+ return null;
+ }
+
+ var rhs = [];
+
+ var perspective;
+ if (m3d[0][3] || m3d[1][3] || m3d[2][3]) {
+ rhs.push(m3d[0][3]);
+ rhs.push(m3d[1][3]);
+ rhs.push(m3d[2][3]);
+ rhs.push(m3d[3][3]);
+
+ var inversePerspectiveMatrix = inverse(perspectiveMatrix);
+ var transposedInversePerspectiveMatrix =
+ transposeMatrix4(inversePerspectiveMatrix);
+ perspective = multVecMatrix(rhs, transposedInversePerspectiveMatrix);
+ } else {
+ perspective = [0, 0, 0, 1];
+ }
+
+ var translate = m3d[3].slice(0, 3);
+
+ var row = [];
+ row.push(m3d[0].slice(0, 3));
+ var scale = [];
+ scale.push(length(row[0]));
+ row[0] = normalize(row[0]);
+
+ var skew = [];
+ row.push(m3d[1].slice(0, 3));
+ skew.push(dot(row[0], row[1]));
+ row[1] = combine(row[1], row[0], 1.0, -skew[0]);
+
+ scale.push(length(row[1]));
+ row[1] = normalize(row[1]);
+ skew[0] /= scale[1];
+
+ row.push(m3d[2].slice(0, 3));
+ skew.push(dot(row[0], row[2]));
+ row[2] = combine(row[2], row[0], 1.0, -skew[1]);
+ skew.push(dot(row[1], row[2]));
+ row[2] = combine(row[2], row[1], 1.0, -skew[2]);
+
+ scale.push(length(row[2]));
+ row[2] = normalize(row[2]);
+ skew[1] /= scale[2];
+ skew[2] /= scale[2];
+
+ var pdum3 = cross(row[1], row[2]);
+ if (dot(row[0], pdum3) < 0) {
+ for (var i = 0; i < 3; i++) {
+ scale[i] *= -1;
+ row[i][0] *= -1;
+ row[i][1] *= -1;
+ row[i][2] *= -1;
+ }
+ }
+
+ var t = row[0][0] + row[1][1] + row[2][2] + 1;
+ var s;
+ var quaternion;
+
+ if (t > 1e-4) {
+ s = 0.5 / Math.sqrt(t);
+ quaternion = [
+ (row[2][1] - row[1][2]) * s,
+ (row[0][2] - row[2][0]) * s,
+ (row[1][0] - row[0][1]) * s,
+ 0.25 / s
+ ];
+ } else if (row[0][0] > row[1][1] && row[0][0] > row[2][2]) {
+ s = Math.sqrt(1 + row[0][0] - row[1][1] - row[2][2]) * 2.0;
+ quaternion = [
+ 0.25 * s,
+ (row[0][1] + row[1][0]) / s,
+ (row[0][2] + row[2][0]) / s,
+ (row[2][1] - row[1][2]) / s
+ ];
+ } else if (row[1][1] > row[2][2]) {
+ s = Math.sqrt(1.0 + row[1][1] - row[0][0] - row[2][2]) * 2.0;
+ quaternion = [
+ (row[0][1] + row[1][0]) / s,
+ 0.25 * s,
+ (row[1][2] + row[2][1]) / s,
+ (row[0][2] - row[2][0]) / s
+ ];
+ } else {
+ s = Math.sqrt(1.0 + row[2][2] - row[0][0] - row[1][1]) * 2.0;
+ quaternion = [
+ (row[0][2] + row[2][0]) / s,
+ (row[1][2] + row[2][1]) / s,
+ 0.25 * s,
+ (row[1][0] - row[0][1]) / s
+ ];
+ }
+
+ return [translate, scale, skew, quaternion, perspective];
+ }
+ return decomposeMatrix;
+ })();
+
+ function dot(v1, v2) {
+ var result = 0;
+ for (var i = 0; i < v1.length; i++) {
+ result += v1[i] * v2[i];
+ }
+ return result;
+ }
+
+ function multiplyMatrices(a, b) {
+ return [
+ a[0] * b[0] + a[4] * b[1] + a[8] * b[2] + a[12] * b[3],
+ a[1] * b[0] + a[5] * b[1] + a[9] * b[2] + a[13] * b[3],
+ a[2] * b[0] + a[6] * b[1] + a[10] * b[2] + a[14] * b[3],
+ a[3] * b[0] + a[7] * b[1] + a[11] * b[2] + a[15] * b[3],
+
+ a[0] * b[4] + a[4] * b[5] + a[8] * b[6] + a[12] * b[7],
+ a[1] * b[4] + a[5] * b[5] + a[9] * b[6] + a[13] * b[7],
+ a[2] * b[4] + a[6] * b[5] + a[10] * b[6] + a[14] * b[7],
+ a[3] * b[4] + a[7] * b[5] + a[11] * b[6] + a[15] * b[7],
+
+ a[0] * b[8] + a[4] * b[9] + a[8] * b[10] + a[12] * b[11],
+ a[1] * b[8] + a[5] * b[9] + a[9] * b[10] + a[13] * b[11],
+ a[2] * b[8] + a[6] * b[9] + a[10] * b[10] + a[14] * b[11],
+ a[3] * b[8] + a[7] * b[9] + a[11] * b[10] + a[15] * b[11],
+
+ a[0] * b[12] + a[4] * b[13] + a[8] * b[14] + a[12] * b[15],
+ a[1] * b[12] + a[5] * b[13] + a[9] * b[14] + a[13] * b[15],
+ a[2] * b[12] + a[6] * b[13] + a[10] * b[14] + a[14] * b[15],
+ a[3] * b[12] + a[7] * b[13] + a[11] * b[14] + a[15] * b[15]
+ ];
+ }
+
+ function toRadians(arg) {
+ var rads = arg.rad || 0;
+ var degs = arg.deg || 0;
+ var grads = arg.grad || 0;
+ var turns = arg.turn || 0;
+ var angle = (degs / 360 + grads / 400 + turns) * (2 * Math.PI) + rads;
+ return angle;
+ }
+
+ function convertItemToMatrix(item) {
+ switch (item.t) {
+ case 'rotatex':
+ var angle = toRadians(item.d[0]);
+ return [1, 0, 0, 0,
+ 0, Math.cos(angle), Math.sin(angle), 0,
+ 0, -Math.sin(angle), Math.cos(angle), 0,
+ 0, 0, 0, 1];
+ case 'rotatey':
+ var angle = toRadians(item.d[0]);
+ return [Math.cos(angle), 0, -Math.sin(angle), 0,
+ 0, 1, 0, 0,
+ Math.sin(angle), 0, Math.cos(angle), 0,
+ 0, 0, 0, 1];
+ case 'rotate':
+ case 'rotatez':
+ var angle = toRadians(item.d[0]);
+ return [Math.cos(angle), Math.sin(angle), 0, 0,
+ -Math.sin(angle), Math.cos(angle), 0, 0,
+ 0, 0, 1, 0,
+ 0, 0, 0, 1];
+ case 'rotate3d':
+ var x = item.d[0];
+ var y = item.d[1];
+ var z = item.d[2];
+ var angle = toRadians(item.d[3]);
+
+ var sqrLength = x * x + y * y + z * z;
+ if (sqrLength === 0) {
+ x = 1;
+ y = 0;
+ z = 0;
+ } else if (sqrLength !== 1) {
+ var length = Math.sqrt(sqrLength);
+ x /= length;
+ y /= length;
+ z /= length;
+ }
+
+ var s = Math.sin(angle / 2);
+ var sc = s * Math.cos(angle / 2);
+ var sq = s * s;
+ return [
+ 1 - 2 * (y * y + z * z) * sq,
+ 2 * (x * y * sq + z * sc),
+ 2 * (x * z * sq - y * sc),
+ 0,
+
+ 2 * (x * y * sq - z * sc),
+ 1 - 2 * (x * x + z * z) * sq,
+ 2 * (y * z * sq + x * sc),
+ 0,
+
+ 2 * (x * z * sq + y * sc),
+ 2 * (y * z * sq - x * sc),
+ 1 - 2 * (x * x + y * y) * sq,
+ 0,
+
+ 0, 0, 0, 1
+ ];
+ case 'scale':
+ return [item.d[0], 0, 0, 0,
+ 0, item.d[1], 0, 0,
+ 0, 0, 1, 0,
+ 0, 0, 0, 1];
+ case 'scalex':
+ return [item.d[0], 0, 0, 0,
+ 0, 1, 0, 0,
+ 0, 0, 1, 0,
+ 0, 0, 0, 1];
+ case 'scaley':
+ return [1, 0, 0, 0,
+ 0, item.d[0], 0, 0,
+ 0, 0, 1, 0,
+ 0, 0, 0, 1];
+ case 'scalez':
+ return [1, 0, 0, 0,
+ 0, 1, 0, 0,
+ 0, 0, item.d[0], 0,
+ 0, 0, 0, 1];
+ case 'scale3d':
+ return [item.d[0], 0, 0, 0,
+ 0, item.d[1], 0, 0,
+ 0, 0, item.d[2], 0,
+ 0, 0, 0, 1];
+ case 'skew':
+ var xAngle = toRadians(item.d[0]);
+ var yAngle = toRadians(item.d[1]);
+ return [1, Math.tan(yAngle), 0, 0,
+ Math.tan(xAngle), 1, 0, 0,
+ 0, 0, 1, 0,
+ 0, 0, 0, 1];
+ case 'skewx':
+ var angle = toRadians(item.d[0]);
+ return [1, 0, 0, 0,
+ Math.tan(angle), 1, 0, 0,
+ 0, 0, 1, 0,
+ 0, 0, 0, 1];
+ case 'skewy':
+ var angle = toRadians(item.d[0]);
+ return [1, Math.tan(angle), 0, 0,
+ 0, 1, 0, 0,
+ 0, 0, 1, 0,
+ 0, 0, 0, 1];
+ case 'translate':
+ var x = item.d[0].px || 0;
+ var y = item.d[1].px || 0;
+ return [1, 0, 0, 0,
+ 0, 1, 0, 0,
+ 0, 0, 1, 0,
+ x, y, 0, 1];
+ case 'translatex':
+ var x = item.d[0].px || 0;
+ return [1, 0, 0, 0,
+ 0, 1, 0, 0,
+ 0, 0, 1, 0,
+ x, 0, 0, 1];
+ case 'translatey':
+ var y = item.d[0].px || 0;
+ return [1, 0, 0, 0,
+ 0, 1, 0, 0,
+ 0, 0, 1, 0,
+ 0, y, 0, 1];
+ case 'translatez':
+ var z = item.d[0].px || 0;
+ return [1, 0, 0, 0,
+ 0, 1, 0, 0,
+ 0, 0, 1, 0,
+ 0, 0, z, 1];
+ case 'translate3d':
+ var x = item.d[0].px || 0;
+ var y = item.d[1].px || 0;
+ var z = item.d[2].px || 0;
+ return [1, 0, 0, 0,
+ 0, 1, 0, 0,
+ 0, 0, 1, 0,
+ x, y, z, 1];
+ case 'perspective':
+ var p = item.d[0].px ? (-1 / item.d[0].px) : 0;
+ return [
+ 1, 0, 0, 0,
+ 0, 1, 0, 0,
+ 0, 0, 1, p,
+ 0, 0, 0, 1];
+ case 'matrix':
+ return [item.d[0], item.d[1], 0, 0,
+ item.d[2], item.d[3], 0, 0,
+ 0, 0, 1, 0,
+ item.d[4], item.d[5], 0, 1];
+ case 'matrix3d':
+ return item.d;
+ default:
+ WEB_ANIMATIONS_TESTING && console.assert(false, 'Transform item type ' + item.t +
+ ' conversion to matrix not yet implemented.');
+ }
+ }
+
+ function convertToMatrix(transformList) {
+ if (transformList.length === 0) {
+ return [1, 0, 0, 0,
+ 0, 1, 0, 0,
+ 0, 0, 1, 0,
+ 0, 0, 0, 1];
+ }
+ return transformList.map(convertItemToMatrix).reduce(multiplyMatrices);
+ }
+
+ function makeMatrixDecomposition(transformList) {
+ return [decomposeMatrix(convertToMatrix(transformList))];
+ }
+
+ scope.dot = dot;
+ scope.makeMatrixDecomposition = makeMatrixDecomposition;
+ scope.transformListToMatrix = convertToMatrix;
+
+})(webAnimations1, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/matrix-interpolation.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/matrix-interpolation.js
new file mode 100644
index 00000000000..9a35de3bef3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/matrix-interpolation.js
@@ -0,0 +1,130 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(scope, testing) {
+ var composeMatrix = (function() {
+ function multiply(a, b) {
+ var result = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]];
+ for (var i = 0; i < 4; i++) {
+ for (var j = 0; j < 4; j++) {
+ for (var k = 0; k < 4; k++) {
+ result[i][j] += b[i][k] * a[k][j];
+ }
+ }
+ }
+ return result;
+ }
+
+ function is2D(m) {
+ return (
+ m[0][2] == 0 &&
+ m[0][3] == 0 &&
+ m[1][2] == 0 &&
+ m[1][3] == 0 &&
+ m[2][0] == 0 &&
+ m[2][1] == 0 &&
+ m[2][2] == 1 &&
+ m[2][3] == 0 &&
+ m[3][2] == 0 &&
+ m[3][3] == 1);
+ }
+
+ function composeMatrix(translate, scale, skew, quat, perspective) {
+ var matrix = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]];
+
+ for (var i = 0; i < 4; i++) {
+ matrix[i][3] = perspective[i];
+ }
+
+ for (var i = 0; i < 3; i++) {
+ for (var j = 0; j < 3; j++) {
+ matrix[3][i] += translate[j] * matrix[j][i];
+ }
+ }
+
+ var x = quat[0], y = quat[1], z = quat[2], w = quat[3];
+
+ var rotMatrix = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]];
+
+ rotMatrix[0][0] = 1 - 2 * (y * y + z * z);
+ rotMatrix[0][1] = 2 * (x * y - z * w);
+ rotMatrix[0][2] = 2 * (x * z + y * w);
+ rotMatrix[1][0] = 2 * (x * y + z * w);
+ rotMatrix[1][1] = 1 - 2 * (x * x + z * z);
+ rotMatrix[1][2] = 2 * (y * z - x * w);
+ rotMatrix[2][0] = 2 * (x * z - y * w);
+ rotMatrix[2][1] = 2 * (y * z + x * w);
+ rotMatrix[2][2] = 1 - 2 * (x * x + y * y);
+
+ matrix = multiply(matrix, rotMatrix);
+
+ var temp = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]];
+ if (skew[2]) {
+ temp[2][1] = skew[2];
+ matrix = multiply(matrix, temp);
+ }
+
+ if (skew[1]) {
+ temp[2][1] = 0;
+ temp[2][0] = skew[0];
+ matrix = multiply(matrix, temp);
+ }
+
+ if (skew[0]) {
+ temp[2][0] = 0;
+ temp[1][0] = skew[0];
+ matrix = multiply(matrix, temp);
+ }
+
+ for (var i = 0; i < 3; i++) {
+ for (var j = 0; j < 3; j++) {
+ matrix[i][j] *= scale[i];
+ }
+ }
+
+ if (is2D(matrix)) {
+ return [matrix[0][0], matrix[0][1], matrix[1][0], matrix[1][1], matrix[3][0], matrix[3][1]];
+ }
+ return matrix[0].concat(matrix[1], matrix[2], matrix[3]);
+ }
+ return composeMatrix;
+ })();
+
+ function clamp(x, min, max) {
+ return Math.max(Math.min(x, max), min);
+ };
+
+ function quat(fromQ, toQ, f) {
+ var product = scope.dot(fromQ, toQ);
+ product = clamp(product, -1.0, 1.0);
+
+ var quat = [];
+ if (product === 1.0) {
+ quat = fromQ;
+ } else {
+ var theta = Math.acos(product);
+ var w = Math.sin(f * theta) * 1 / Math.sqrt(1 - product * product);
+
+ for (var i = 0; i < 4; i++) {
+ quat.push(fromQ[i] * (Math.cos(f * theta) - product * w) +
+ toQ[i] * w);
+ }
+ }
+ return quat;
+ }
+
+ scope.composeMatrix = composeMatrix;
+ scope.quat = quat;
+
+})(webAnimations1, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/normalize-keyframes.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/normalize-keyframes.js
new file mode 100644
index 00000000000..1fd02548775
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/normalize-keyframes.js
@@ -0,0 +1,321 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(shared, testing) {
+ var shorthandToLonghand = {
+ background: [
+ 'backgroundImage',
+ 'backgroundPosition',
+ 'backgroundSize',
+ 'backgroundRepeat',
+ 'backgroundAttachment',
+ 'backgroundOrigin',
+ 'backgroundClip',
+ 'backgroundColor'
+ ],
+ border: [
+ 'borderTopColor',
+ 'borderTopStyle',
+ 'borderTopWidth',
+ 'borderRightColor',
+ 'borderRightStyle',
+ 'borderRightWidth',
+ 'borderBottomColor',
+ 'borderBottomStyle',
+ 'borderBottomWidth',
+ 'borderLeftColor',
+ 'borderLeftStyle',
+ 'borderLeftWidth'
+ ],
+ borderBottom: [
+ 'borderBottomWidth',
+ 'borderBottomStyle',
+ 'borderBottomColor'
+ ],
+ borderColor: [
+ 'borderTopColor',
+ 'borderRightColor',
+ 'borderBottomColor',
+ 'borderLeftColor'
+ ],
+ borderLeft: [
+ 'borderLeftWidth',
+ 'borderLeftStyle',
+ 'borderLeftColor'
+ ],
+ borderRadius: [
+ 'borderTopLeftRadius',
+ 'borderTopRightRadius',
+ 'borderBottomRightRadius',
+ 'borderBottomLeftRadius'
+ ],
+ borderRight: [
+ 'borderRightWidth',
+ 'borderRightStyle',
+ 'borderRightColor'
+ ],
+ borderTop: [
+ 'borderTopWidth',
+ 'borderTopStyle',
+ 'borderTopColor'
+ ],
+ borderWidth: [
+ 'borderTopWidth',
+ 'borderRightWidth',
+ 'borderBottomWidth',
+ 'borderLeftWidth'
+ ],
+ flex: [
+ 'flexGrow',
+ 'flexShrink',
+ 'flexBasis'
+ ],
+ font: [
+ 'fontFamily',
+ 'fontSize',
+ 'fontStyle',
+ 'fontVariant',
+ 'fontWeight',
+ 'lineHeight'
+ ],
+ margin: [
+ 'marginTop',
+ 'marginRight',
+ 'marginBottom',
+ 'marginLeft'
+ ],
+ outline: [
+ 'outlineColor',
+ 'outlineStyle',
+ 'outlineWidth'
+ ],
+ padding: [
+ 'paddingTop',
+ 'paddingRight',
+ 'paddingBottom',
+ 'paddingLeft'
+ ]
+ };
+
+ var shorthandExpanderElem = document.createElementNS('http://www.w3.org/1999/xhtml', 'div');
+
+ var borderWidthAliases = {
+ thin: '1px',
+ medium: '3px',
+ thick: '5px'
+ };
+
+ var aliases = {
+ borderBottomWidth: borderWidthAliases,
+ borderLeftWidth: borderWidthAliases,
+ borderRightWidth: borderWidthAliases,
+ borderTopWidth: borderWidthAliases,
+ fontSize: {
+ 'xx-small': '60%',
+ 'x-small': '75%',
+ 'small': '89%',
+ 'medium': '100%',
+ 'large': '120%',
+ 'x-large': '150%',
+ 'xx-large': '200%'
+ },
+ fontWeight: {
+ normal: '400',
+ bold: '700'
+ },
+ outlineWidth: borderWidthAliases,
+ textShadow: {
+ none: '0px 0px 0px transparent'
+ },
+ boxShadow: {
+ none: '0px 0px 0px 0px transparent'
+ }
+ };
+
+ function antiAlias(property, value) {
+ if (property in aliases) {
+ return aliases[property][value] || value;
+ }
+ return value;
+ }
+
+ function isNotAnimatable(property) {
+ // https://w3c.github.io/web-animations/#concept-not-animatable
+ return property === 'display' || property.lastIndexOf('animation', 0) === 0 || property.lastIndexOf('transition', 0) === 0;
+ }
+
+ // This delegates parsing shorthand value syntax to the browser.
+ function expandShorthandAndAntiAlias(property, value, result) {
+ if (isNotAnimatable(property)) {
+ return;
+ }
+ var longProperties = shorthandToLonghand[property];
+ if (longProperties) {
+ shorthandExpanderElem.style[property] = value;
+ for (var i in longProperties) {
+ var longProperty = longProperties[i];
+ var longhandValue = shorthandExpanderElem.style[longProperty];
+ result[longProperty] = antiAlias(longProperty, longhandValue);
+ }
+ } else {
+ result[property] = antiAlias(property, value);
+ }
+ };
+
+ function convertToArrayForm(effectInput) {
+ var normalizedEffectInput = [];
+
+ for (var property in effectInput) {
+ if (property in ['easing', 'offset', 'composite']) {
+ continue;
+ }
+
+ var values = effectInput[property];
+ if (!Array.isArray(values)) {
+ values = [values];
+ }
+
+ var keyframe;
+ var numKeyframes = values.length;
+ for (var i = 0; i < numKeyframes; i++) {
+ keyframe = {};
+
+ if ('offset' in effectInput) {
+ keyframe.offset = effectInput.offset;
+ } else if (numKeyframes == 1) {
+ keyframe.offset = 1.0;
+ } else {
+ keyframe.offset = i / (numKeyframes - 1.0);
+ }
+
+ if ('easing' in effectInput) {
+ keyframe.easing = effectInput.easing;
+ }
+
+ if ('composite' in effectInput) {
+ keyframe.composite = effectInput.composite;
+ }
+
+ keyframe[property] = values[i];
+
+ normalizedEffectInput.push(keyframe);
+ }
+ }
+
+ normalizedEffectInput.sort(function(a, b) { return a.offset - b.offset; });
+ return normalizedEffectInput;
+ };
+
+ function normalizeKeyframes(effectInput) {
+ if (effectInput == null) {
+ return [];
+ }
+
+ if (window.Symbol && Symbol.iterator && Array.prototype.from && effectInput[Symbol.iterator]) {
+ // Handle custom iterables in most browsers by converting to an array
+ effectInput = Array.from(effectInput);
+ }
+
+ if (!Array.isArray(effectInput)) {
+ effectInput = convertToArrayForm(effectInput);
+ }
+
+ var keyframes = effectInput.map(function(originalKeyframe) {
+ var keyframe = {};
+ for (var member in originalKeyframe) {
+ var memberValue = originalKeyframe[member];
+ if (member == 'offset') {
+ if (memberValue != null) {
+ memberValue = Number(memberValue);
+ if (!isFinite(memberValue))
+ throw new TypeError('Keyframe offsets must be numbers.');
+ if (memberValue < 0 || memberValue > 1)
+ throw new TypeError('Keyframe offsets must be between 0 and 1.');
+ }
+ } else if (member == 'composite') {
+ if (memberValue == 'add' || memberValue == 'accumulate') {
+ throw {
+ type: DOMException.NOT_SUPPORTED_ERR,
+ name: 'NotSupportedError',
+ message: 'add compositing is not supported'
+ };
+ } else if (memberValue != 'replace') {
+ throw new TypeError('Invalid composite mode ' + memberValue + '.');
+ }
+ } else if (member == 'easing') {
+ memberValue = shared.normalizeEasing(memberValue);
+ } else {
+ memberValue = '' + memberValue;
+ }
+ expandShorthandAndAntiAlias(member, memberValue, keyframe);
+ }
+ if (keyframe.offset == undefined)
+ keyframe.offset = null;
+ if (keyframe.easing == undefined)
+ keyframe.easing = 'linear';
+ return keyframe;
+ });
+
+ var everyFrameHasOffset = true;
+ var looselySortedByOffset = true;
+ var previousOffset = -Infinity;
+ for (var i = 0; i < keyframes.length; i++) {
+ var offset = keyframes[i].offset;
+ if (offset != null) {
+ if (offset < previousOffset) {
+ throw new TypeError('Keyframes are not loosely sorted by offset. Sort or specify offsets.');
+ }
+ previousOffset = offset;
+ } else {
+ everyFrameHasOffset = false;
+ }
+ }
+
+ keyframes = keyframes.filter(function(keyframe) {
+ return keyframe.offset >= 0 && keyframe.offset <= 1;
+ });
+
+ function spaceKeyframes() {
+ var length = keyframes.length;
+ if (keyframes[length - 1].offset == null)
+ keyframes[length - 1].offset = 1;
+ if (length > 1 && keyframes[0].offset == null)
+ keyframes[0].offset = 0;
+
+ var previousIndex = 0;
+ var previousOffset = keyframes[0].offset;
+ for (var i = 1; i < length; i++) {
+ var offset = keyframes[i].offset;
+ if (offset != null) {
+ for (var j = 1; j < i - previousIndex; j++)
+ keyframes[previousIndex + j].offset = previousOffset + (offset - previousOffset) * j / (i - previousIndex);
+ previousIndex = i;
+ previousOffset = offset;
+ }
+ }
+ }
+ if (!everyFrameHasOffset)
+ spaceKeyframes();
+
+ return keyframes;
+ }
+
+ shared.convertToArrayForm = convertToArrayForm;
+ shared.normalizeKeyframes = normalizeKeyframes;
+
+ if (WEB_ANIMATIONS_TESTING) {
+ testing.normalizeKeyframes = normalizeKeyframes;
+ }
+
+})(webAnimationsShared, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/number-handler.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/number-handler.js
new file mode 100644
index 00000000000..7d0e7f9bfb3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/number-handler.js
@@ -0,0 +1,97 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(scope, testing) {
+
+ function numberToString(x) {
+ return x.toFixed(3).replace(/0+$/, '').replace(/\.$/, '');
+ }
+
+ function clamp(min, max, x) {
+ return Math.min(max, Math.max(min, x));
+ }
+
+ function parseNumber(string) {
+ if (/^\s*[-+]?(\d*\.)?\d+\s*$/.test(string))
+ return Number(string);
+ }
+
+ function mergeNumbers(left, right) {
+ return [left, right, numberToString];
+ }
+
+ // FIXME: This should probably go in it's own handler.
+ function mergeFlex(left, right) {
+ if (left == 0)
+ return;
+ return clampedMergeNumbers(0, Infinity)(left, right);
+ }
+
+ function mergePositiveIntegers(left, right) {
+ return [left, right, function(x) {
+ return Math.round(clamp(1, Infinity, x));
+ }];
+ }
+
+ function clampedMergeNumbers(min, max) {
+ return function(left, right) {
+ return [left, right, function(x) {
+ return numberToString(clamp(min, max, x));
+ }];
+ };
+ }
+
+ function parseNumberList(string) {
+ var items = string.trim().split(/\s*[\s,]\s*/);
+ if (items.length === 0) {
+ return;
+ }
+ var result = [];
+ for (var i = 0; i < items.length; i++) {
+ var number = parseNumber(items[i]);
+ if (number === undefined) {
+ return;
+ }
+ result.push(number);
+ }
+ return result;
+ }
+
+ function mergeNumberLists(left, right) {
+ if (left.length != right.length) {
+ return;
+ }
+ return [left, right, function(numberList) {
+ return numberList.map(numberToString).join(' ');
+ }];
+ }
+
+ function round(left, right) {
+ return [left, right, Math.round];
+ }
+
+ scope.clamp = clamp;
+ scope.addPropertiesHandler(parseNumberList, mergeNumberLists, ['stroke-dasharray']);
+ scope.addPropertiesHandler(parseNumber, clampedMergeNumbers(0, Infinity), ['border-image-width', 'line-height']);
+ scope.addPropertiesHandler(parseNumber, clampedMergeNumbers(0, 1), ['opacity', 'shape-image-threshold']);
+ scope.addPropertiesHandler(parseNumber, mergeFlex, ['flex-grow', 'flex-shrink']);
+ scope.addPropertiesHandler(parseNumber, mergePositiveIntegers, ['orphans', 'widows']);
+ scope.addPropertiesHandler(parseNumber, round, ['z-index']);
+
+ scope.parseNumber = parseNumber;
+ scope.parseNumberList = parseNumberList;
+ scope.mergeNumbers = mergeNumbers;
+ scope.numberToString = numberToString;
+
+})(webAnimations1, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/position-handler.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/position-handler.js
new file mode 100644
index 00000000000..18cea438cd6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/position-handler.js
@@ -0,0 +1,117 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(scope) {
+
+ function negateDimension(dimension) {
+ var result = {};
+ for (var k in dimension) {
+ result[k] = -dimension[k];
+ }
+ return result;
+ }
+
+ function consumeOffset(string) {
+ return scope.consumeToken(/^(left|center|right|top|bottom)\b/i, string) || scope.consumeLengthOrPercent(string);
+ }
+
+ var offsetMap = {
+ left: {'%': 0},
+ center: {'%': 50},
+ right: {'%': 100},
+ top: {'%': 0},
+ bottom: {'%': 100},
+ };
+
+ function parseOrigin(slots, string) {
+ var result = scope.consumeRepeated(consumeOffset, /^/, string);
+ if (!result || result[1] != '') return;
+ var tokens = result[0];
+ tokens[0] = tokens[0] || 'center';
+ tokens[1] = tokens[1] || 'center';
+ if (slots == 3) {
+ tokens[2] = tokens[2] || {px: 0};
+ }
+ if (tokens.length != slots) {
+ return;
+ }
+ // Reorder so that the horizontal axis comes first.
+ if (/top|bottom/.test(tokens[0]) || /left|right/.test(tokens[1])) {
+ var tmp = tokens[0];
+ tokens[0] = tokens[1];
+ tokens[1] = tmp;
+ }
+ // Invalid if not horizontal then vertical.
+ if (!/left|right|center|Object/.test(tokens[0]))
+ return;
+ if (!/top|bottom|center|Object/.test(tokens[1]))
+ return;
+ return tokens.map(function(position) {
+ return typeof position == 'object' ? position : offsetMap[position];
+ });
+ }
+
+ var mergeOffsetList = scope.mergeNestedRepeated.bind(null, scope.mergeDimensions, ' ');
+ scope.addPropertiesHandler(parseOrigin.bind(null, 3), mergeOffsetList, ['transform-origin']);
+ scope.addPropertiesHandler(parseOrigin.bind(null, 2), mergeOffsetList, ['perspective-origin']);
+
+ function consumePosition(string) {
+ var result = scope.consumeRepeated(consumeOffset, /^/, string);
+ if (!result) {
+ return;
+ }
+
+ var tokens = result[0];
+ var out = [{'%': 50}, {'%': 50}];
+ var pos = 0;
+ var bottomOrRight = false;
+
+ for (var i = 0; i < tokens.length; i++) {
+ var token = tokens[i];
+ if (typeof token == 'string') {
+ bottomOrRight = /bottom|right/.test(token);
+ pos = {left: 0, right: 0, center: pos, top: 1, bottom: 1}[token];
+ out[pos] = offsetMap[token];
+ if (token == 'center') {
+ // Center doesn't accept a length offset.
+ pos++;
+ }
+ } else {
+ if (bottomOrRight) {
+ // If bottom or right we need to subtract the length from 100%
+ token = negateDimension(token);
+ token['%'] = (token['%'] || 0) + 100;
+ }
+ out[pos] = token;
+ pos++;
+ bottomOrRight = false;
+ }
+ }
+ return [out, result[1]];
+ }
+
+ function parsePositionList(string) {
+ var result = scope.consumeRepeated(consumePosition, /^,/, string);
+ if (result && result[1] == '') {
+ return result[0];
+ }
+ }
+
+ scope.consumePosition = consumePosition;
+ scope.mergeOffsetList = mergeOffsetList;
+
+ var mergePositionList = scope.mergeNestedRepeated.bind(null, mergeOffsetList, ', ');
+ scope.addPropertiesHandler(parsePositionList, mergePositionList, ['background-position', 'object-position']);
+
+})(webAnimations1);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/property-interpolation.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/property-interpolation.js
new file mode 100644
index 00000000000..b7e594f3934
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/property-interpolation.js
@@ -0,0 +1,127 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(shared, scope, testing) {
+
+ var propertyHandlers = {};
+
+ function toCamelCase(property) {
+ return property.replace(/-(.)/g, function(_, c) {
+ return c.toUpperCase();
+ });
+ }
+
+ function addPropertyHandler(parser, merger, property) {
+ propertyHandlers[property] = propertyHandlers[property] || [];
+ propertyHandlers[property].push([parser, merger]);
+ }
+ function addPropertiesHandler(parser, merger, properties) {
+ for (var i = 0; i < properties.length; i++) {
+ var property = properties[i];
+ WEB_ANIMATIONS_TESTING && console.assert(property.toLowerCase() === property);
+ addPropertyHandler(parser, merger, toCamelCase(property));
+ }
+ }
+ scope.addPropertiesHandler = addPropertiesHandler;
+
+ var initialValues = {
+ backgroundColor: 'transparent',
+ backgroundPosition: '0% 0%',
+ borderBottomColor: 'currentColor',
+ borderBottomLeftRadius: '0px',
+ borderBottomRightRadius: '0px',
+ borderBottomWidth: '3px',
+ borderLeftColor: 'currentColor',
+ borderLeftWidth: '3px',
+ borderRightColor: 'currentColor',
+ borderRightWidth: '3px',
+ // Spec says this should be 0 but in practise it is 2px.
+ borderSpacing: '2px',
+ borderTopColor: 'currentColor',
+ borderTopLeftRadius: '0px',
+ borderTopRightRadius: '0px',
+ borderTopWidth: '3px',
+ bottom: 'auto',
+ clip: 'rect(0px, 0px, 0px, 0px)',
+ color: 'black', // Depends on user agent.
+ fontSize: '100%',
+ fontWeight: '400',
+ height: 'auto',
+ left: 'auto',
+ letterSpacing: 'normal',
+ lineHeight: '120%',
+ marginBottom: '0px',
+ marginLeft: '0px',
+ marginRight: '0px',
+ marginTop: '0px',
+ maxHeight: 'none',
+ maxWidth: 'none',
+ minHeight: '0px',
+ minWidth: '0px',
+ opacity: '1.0',
+ outlineColor: 'invert',
+ outlineOffset: '0px',
+ outlineWidth: '3px',
+ paddingBottom: '0px',
+ paddingLeft: '0px',
+ paddingRight: '0px',
+ paddingTop: '0px',
+ right: 'auto',
+ strokeDasharray: 'none',
+ strokeDashoffset: '0px',
+ textIndent: '0px',
+ textShadow: '0px 0px 0px transparent',
+ top: 'auto',
+ transform: '',
+ verticalAlign: '0px',
+ visibility: 'visible',
+ width: 'auto',
+ wordSpacing: 'normal',
+ zIndex: 'auto'
+ };
+
+ function propertyInterpolation(property, left, right) {
+ var ucProperty = property;
+ if (/-/.test(property) && !shared.isDeprecated('Hyphenated property names', '2016-03-22', 'Use camelCase instead.', true)) {
+ ucProperty = toCamelCase(property);
+ }
+ if (left == 'initial' || right == 'initial') {
+ if (left == 'initial')
+ left = initialValues[ucProperty];
+ if (right == 'initial')
+ right = initialValues[ucProperty];
+ }
+ var handlers = left == right ? [] : propertyHandlers[ucProperty];
+ for (var i = 0; handlers && i < handlers.length; i++) {
+ var parsedLeft = handlers[i][0](left);
+ var parsedRight = handlers[i][0](right);
+ if (parsedLeft !== undefined && parsedRight !== undefined) {
+ var interpolationArgs = handlers[i][1](parsedLeft, parsedRight);
+ if (interpolationArgs) {
+ var interp = scope.Interpolation.apply(null, interpolationArgs);
+ return function(t) {
+ if (t == 0) return left;
+ if (t == 1) return right;
+ return interp(t);
+ };
+ }
+ }
+ }
+ return scope.Interpolation(false, true, function(bool) {
+ return bool ? right : left;
+ });
+ }
+ scope.propertyInterpolation = propertyInterpolation;
+
+})(webAnimationsShared, webAnimations1, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/property-names.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/property-names.js
new file mode 100644
index 00000000000..f106c066ab9
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/property-names.js
@@ -0,0 +1,40 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(scope, testing) {
+
+ var prefixed = {};
+ var unprefixed = {};
+
+ function alias(name, aliases) {
+ aliases.concat([name]).forEach(function(candidate) {
+ if (candidate in document.documentElement.style) {
+ prefixed[name] = candidate;
+ }
+ unprefixed[candidate] = name;
+ });
+ }
+ alias('transform', ['webkitTransform', 'msTransform']);
+ alias('transformOrigin', ['webkitTransformOrigin']);
+ alias('perspective', ['webkitPerspective']);
+ alias('perspectiveOrigin', ['webkitPerspectiveOrigin']);
+
+ scope.propertyName = function(property) {
+ return prefixed[property] || property;
+ };
+ scope.unprefixedPropertyName = function(property) {
+ return unprefixed[property] || property;
+ };
+
+})(webAnimations1, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/scope.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/scope.js
new file mode 100644
index 00000000000..c8248802bce
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/scope.js
@@ -0,0 +1,20 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+var webAnimationsShared = {};
+var webAnimations1 = {};
+var webAnimationsNext = {};
+
+if (!WEB_ANIMATIONS_TESTING)
+ var webAnimationsTesting = null;
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/shadow-handler.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/shadow-handler.js
new file mode 100644
index 00000000000..3f8201d8a49
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/shadow-handler.js
@@ -0,0 +1,108 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(scope) {
+
+ function consumeShadow(string) {
+ var shadow = {
+ inset: false,
+ lengths: [],
+ color: null,
+ };
+ function consumePart(string) {
+ var result = scope.consumeToken(/^inset/i, string);
+ if (result) {
+ shadow.inset = true;
+ return result;
+ }
+ var result = scope.consumeLengthOrPercent(string);
+ if (result) {
+ shadow.lengths.push(result[0]);
+ return result;
+ }
+ var result = scope.consumeColor(string);
+ if (result) {
+ shadow.color = result[0];
+ return result;
+ }
+ }
+ var result = scope.consumeRepeated(consumePart, /^/, string);
+ if (result && result[0].length) {
+ return [shadow, result[1]];
+ }
+ }
+
+ function parseShadowList(string) {
+ var result = scope.consumeRepeated(consumeShadow, /^,/, string);
+ if (result && result[1] == '') {
+ return result[0];
+ }
+ }
+
+ function mergeShadow(left, right) {
+ while (left.lengths.length < Math.max(left.lengths.length, right.lengths.length))
+ left.lengths.push({px: 0});
+ while (right.lengths.length < Math.max(left.lengths.length, right.lengths.length))
+ right.lengths.push({px: 0});
+
+ if (left.inset != right.inset || !!left.color != !!right.color) {
+ return;
+ }
+ var lengthReconstitution = [];
+ var colorReconstitution;
+ var matchingLeft = [[], 0];
+ var matchingRight = [[], 0];
+ for (var i = 0; i < left.lengths.length; i++) {
+ var mergedDimensions = scope.mergeDimensions(left.lengths[i], right.lengths[i], i == 2);
+ matchingLeft[0].push(mergedDimensions[0]);
+ matchingRight[0].push(mergedDimensions[1]);
+ lengthReconstitution.push(mergedDimensions[2]);
+ }
+ if (left.color && right.color) {
+ var mergedColor = scope.mergeColors(left.color, right.color);
+ matchingLeft[1] = mergedColor[0];
+ matchingRight[1] = mergedColor[1];
+ colorReconstitution = mergedColor[2];
+ }
+ return [matchingLeft, matchingRight, function(value) {
+ var result = left.inset ? 'inset ' : ' ';
+ for (var i = 0; i < lengthReconstitution.length; i++) {
+ result += lengthReconstitution[i](value[0][i]) + ' ';
+ }
+ if (colorReconstitution) {
+ result += colorReconstitution(value[1]);
+ }
+ return result;
+ }];
+ }
+
+ function mergeNestedRepeatedShadow(nestedMerge, separator, left, right) {
+ var leftCopy = [];
+ var rightCopy = [];
+ function defaultShadow(inset) {
+ return {inset: inset, color: [0, 0, 0, 0], lengths: [{px: 0}, {px: 0}, {px: 0}, {px: 0}]};
+ }
+ for (var i = 0; i < left.length || i < right.length; i++) {
+ var l = left[i] || defaultShadow(right[i].inset);
+ var r = right[i] || defaultShadow(left[i].inset);
+ leftCopy.push(l);
+ rightCopy.push(r);
+ }
+ return scope.mergeNestedRepeated(nestedMerge, separator, leftCopy, rightCopy);
+ }
+
+ var mergeShadowList = mergeNestedRepeatedShadow.bind(null, mergeShadow, ', ');
+ scope.addPropertiesHandler(parseShadowList, mergeShadowList, ['box-shadow', 'text-shadow']);
+
+})(webAnimations1);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/shape-handler.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/shape-handler.js
new file mode 100644
index 00000000000..6bbf79fe488
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/shape-handler.js
@@ -0,0 +1,85 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(scope) {
+
+ var consumeLengthOrPercent = scope.consumeParenthesised.bind(null, scope.parseLengthOrPercent);
+ var consumeLengthOrPercentPair = scope.consumeRepeated.bind(undefined, consumeLengthOrPercent, /^/);
+
+ var mergeSizePair = scope.mergeNestedRepeated.bind(undefined, scope.mergeDimensions, ' ');
+ var mergeSizePairList = scope.mergeNestedRepeated.bind(undefined, mergeSizePair, ',');
+
+ function parseShape(input) {
+ var circle = scope.consumeToken(/^circle/, input);
+ if (circle && circle[0]) {
+ return ['circle'].concat(scope.consumeList([
+ scope.ignore(scope.consumeToken.bind(undefined, /^\(/)),
+ consumeLengthOrPercent,
+ scope.ignore(scope.consumeToken.bind(undefined, /^at/)),
+ scope.consumePosition,
+ scope.ignore(scope.consumeToken.bind(undefined, /^\)/))
+ ], circle[1]));
+ }
+ var ellipse = scope.consumeToken(/^ellipse/, input);
+ if (ellipse && ellipse[0]) {
+ return ['ellipse'].concat(scope.consumeList([
+ scope.ignore(scope.consumeToken.bind(undefined, /^\(/)),
+ consumeLengthOrPercentPair,
+ scope.ignore(scope.consumeToken.bind(undefined, /^at/)),
+ scope.consumePosition,
+ scope.ignore(scope.consumeToken.bind(undefined, /^\)/))
+ ], ellipse[1]));
+ }
+ var polygon = scope.consumeToken(/^polygon/, input);
+ if (polygon && polygon[0]) {
+ return ['polygon'].concat(scope.consumeList([
+ scope.ignore(scope.consumeToken.bind(undefined, /^\(/)),
+ scope.optional(scope.consumeToken.bind(undefined, /^nonzero\s*,|^evenodd\s*,/), 'nonzero,'),
+ scope.consumeSizePairList,
+ scope.ignore(scope.consumeToken.bind(undefined, /^\)/))
+ ], polygon[1]));
+ }
+ }
+
+ function mergeShapes(left, right) {
+ if (left[0] !== right[0])
+ return;
+ if (left[0] == 'circle') {
+ return scope.mergeList(left.slice(1), right.slice(1), [
+ 'circle(',
+ scope.mergeDimensions,
+ ' at ',
+ scope.mergeOffsetList,
+ ')']);
+ }
+ if (left[0] == 'ellipse') {
+ return scope.mergeList(left.slice(1), right.slice(1), [
+ 'ellipse(',
+ scope.mergeNonNegativeSizePair,
+ ' at ',
+ scope.mergeOffsetList,
+ ')']);
+ }
+ if (left[0] == 'polygon' && left[1] == right[1]) {
+ return scope.mergeList(left.slice(2), right.slice(2), [
+ 'polygon(',
+ left[1],
+ mergeSizePairList,
+ ')']);
+ }
+ }
+
+ scope.addPropertiesHandler(parseShape, mergeShapes, ['shape-outside']);
+
+})(webAnimations1);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/tick.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/tick.js
new file mode 100644
index 00000000000..08b0a140909
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/tick.js
@@ -0,0 +1,181 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+(function(shared, scope, testing) {
+ var originalRequestAnimationFrame = window.requestAnimationFrame;
+ var rafCallbacks = [];
+ var rafId = 0;
+ window.requestAnimationFrame = function(f) {
+ var id = rafId++;
+ if (rafCallbacks.length == 0 && !WEB_ANIMATIONS_TESTING) {
+ originalRequestAnimationFrame(processRafCallbacks);
+ }
+ rafCallbacks.push([id, f]);
+ return id;
+ };
+
+ window.cancelAnimationFrame = function(id) {
+ rafCallbacks.forEach(function(entry) {
+ if (entry[0] == id) {
+ entry[1] = function() {};
+ }
+ });
+ };
+
+ function processRafCallbacks(t) {
+ var processing = rafCallbacks;
+ rafCallbacks = [];
+ if (t < timeline.currentTime)
+ t = timeline.currentTime;
+ timeline._animations.sort(compareAnimations);
+ timeline._animations = tick(t, true, timeline._animations)[0];
+ processing.forEach(function(entry) { entry[1](t); });
+ applyPendingEffects();
+ _now = undefined;
+ }
+
+ function compareAnimations(leftAnimation, rightAnimation) {
+ return leftAnimation._sequenceNumber - rightAnimation._sequenceNumber;
+ }
+
+ function InternalTimeline() {
+ this._animations = [];
+ // Android 4.3 browser has window.performance, but not window.performance.now
+ this.currentTime = window.performance && performance.now ? performance.now() : 0;
+ };
+
+ InternalTimeline.prototype = {
+ _play: function(effect) {
+ effect._timing = shared.normalizeTimingInput(effect.timing);
+ var animation = new scope.Animation(effect);
+ animation._idle = false;
+ animation._timeline = this;
+ this._animations.push(animation);
+ scope.restart();
+ scope.applyDirtiedAnimation(animation);
+ return animation;
+ }
+ };
+
+ var _now = undefined;
+
+ if (WEB_ANIMATIONS_TESTING) {
+ var now = function() { return timeline.currentTime; };
+ } else {
+ var now = function() {
+ if (_now == undefined)
+ _now = window.performance && performance.now ? performance.now() : Date.now();
+ return _now;
+ };
+ }
+
+ var ticking = false;
+ var hasRestartedThisFrame = false;
+
+ scope.restart = function() {
+ if (!ticking) {
+ ticking = true;
+ requestAnimationFrame(function() {});
+ hasRestartedThisFrame = true;
+ }
+ return hasRestartedThisFrame;
+ };
+
+ // RAF is supposed to be the last script to occur before frame rendering but not
+ // all browsers behave like this. This function is for synchonously updating an
+ // animation's effects whenever its state is mutated by script to work around
+ // incorrect script execution ordering by the browser.
+ scope.applyDirtiedAnimation = function(animation) {
+ if (inTick) {
+ return;
+ }
+ animation._markTarget();
+ var animations = animation._targetAnimations();
+ animations.sort(compareAnimations);
+ var inactiveAnimations = tick(scope.timeline.currentTime, false, animations.slice())[1];
+ inactiveAnimations.forEach(function(animation) {
+ var index = timeline._animations.indexOf(animation);
+ if (index !== -1) {
+ timeline._animations.splice(index, 1);
+ }
+ });
+ applyPendingEffects();
+ };
+
+ var pendingEffects = [];
+ function applyPendingEffects() {
+ pendingEffects.forEach(function(f) { f(); });
+ pendingEffects.length = 0;
+ }
+
+ var t60hz = 1000 / 60;
+
+ var inTick = false;
+ function tick(t, isAnimationFrame, updatingAnimations) {
+ inTick = true;
+ hasRestartedThisFrame = false;
+ var timeline = scope.timeline;
+
+ timeline.currentTime = t;
+ ticking = false;
+
+ var newPendingClears = [];
+ var newPendingEffects = [];
+ var activeAnimations = [];
+ var inactiveAnimations = [];
+ updatingAnimations.forEach(function(animation) {
+ animation._tick(t, isAnimationFrame);
+
+ if (!animation._inEffect) {
+ newPendingClears.push(animation._effect);
+ animation._unmarkTarget();
+ } else {
+ newPendingEffects.push(animation._effect);
+ animation._markTarget();
+ }
+
+ if (animation._needsTick)
+ ticking = true;
+
+ var alive = animation._inEffect || animation._needsTick;
+ animation._inTimeline = alive;
+ if (alive) {
+ activeAnimations.push(animation);
+ } else {
+ inactiveAnimations.push(animation);
+ }
+ });
+
+ // FIXME: Should remove dupliactes from pendingEffects.
+ pendingEffects.push.apply(pendingEffects, newPendingClears);
+ pendingEffects.push.apply(pendingEffects, newPendingEffects);
+
+ if (ticking)
+ requestAnimationFrame(function() {});
+
+ inTick = false;
+ return [activeAnimations, inactiveAnimations];
+ };
+
+ if (WEB_ANIMATIONS_TESTING) {
+ testing.tick = function(t) { timeline.currentTime = t; processRafCallbacks(t); };
+ testing.isTicking = function() { return ticking; };
+ testing.setTicking = function(newVal) { ticking = newVal; };
+ }
+
+ var timeline = new InternalTimeline();
+ scope.timeline = timeline;
+
+})(webAnimationsShared, webAnimations1, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/timeline.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/timeline.js
new file mode 100644
index 00000000000..2b213b5550e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/timeline.js
@@ -0,0 +1,101 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+(function(shared, scope, testing) {
+ var originalRequestAnimationFrame = window.requestAnimationFrame;
+ window.requestAnimationFrame = function(f) {
+ return originalRequestAnimationFrame(function(x) {
+ scope.timeline._updateAnimationsPromises();
+ f(x);
+ scope.timeline._updateAnimationsPromises();
+ });
+ };
+
+ scope.AnimationTimeline = function() {
+ this._animations = [];
+ this.currentTime = undefined;
+ };
+
+ scope.AnimationTimeline.prototype = {
+ getAnimations: function() {
+ this._discardAnimations();
+ return this._animations.slice();
+ },
+ _updateAnimationsPromises: function() {
+ scope.animationsWithPromises = scope.animationsWithPromises.filter(function(animation) {
+ return animation._updatePromises();
+ });
+ },
+ _discardAnimations: function() {
+ this._updateAnimationsPromises();
+ this._animations = this._animations.filter(function(animation) {
+ return animation.playState != 'finished' && animation.playState != 'idle';
+ });
+ },
+ _play: function(effect) {
+ var animation = new scope.Animation(effect, this);
+ this._animations.push(animation);
+ scope.restartWebAnimationsNextTick();
+ // Use animation._animation.play() here, NOT animation.play().
+ //
+ // Timeline.play calls new scope.Animation(effect) which (indirectly) calls Timeline.play on
+ // effect's children, and Animation.play is also recursive. We only need to call play on each
+ // animation in the tree once.
+ animation._updatePromises();
+ animation._animation.play();
+ animation._updatePromises();
+ return animation;
+ },
+ play: function(effect) {
+ if (effect) {
+ effect.remove();
+ }
+ return this._play(effect);
+ }
+ };
+
+ var ticking = false;
+
+ scope.restartWebAnimationsNextTick = function() {
+ if (!ticking) {
+ ticking = true;
+ requestAnimationFrame(webAnimationsNextTick);
+ }
+ };
+
+ function webAnimationsNextTick(t) {
+ var timeline = scope.timeline;
+ timeline.currentTime = t;
+ timeline._discardAnimations();
+ if (timeline._animations.length == 0)
+ ticking = false;
+ else
+ requestAnimationFrame(webAnimationsNextTick);
+ }
+
+ var timeline = new scope.AnimationTimeline();
+ scope.timeline = timeline;
+
+ try {
+ Object.defineProperty(window.document, 'timeline', {
+ configurable: true,
+ get: function() { return timeline; }
+ });
+ } catch (e) { }
+ try {
+ window.document.timeline = timeline;
+ } catch (e) { }
+
+})(webAnimationsShared, webAnimationsNext, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/timing-utilities.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/timing-utilities.js
new file mode 100644
index 00000000000..2f16f3b1598
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/timing-utilities.js
@@ -0,0 +1,420 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(shared, testing) {
+
+ var fills = 'backwards|forwards|both|none'.split('|');
+ var directions = 'reverse|alternate|alternate-reverse'.split('|');
+ var linear = function(x) { return x; };
+
+ function cloneTimingInput(timingInput) {
+ if (typeof timingInput == 'number') {
+ return timingInput;
+ }
+ var clone = {};
+ for (var m in timingInput) {
+ clone[m] = timingInput[m];
+ }
+ return clone;
+ }
+
+ function AnimationEffectTiming() {
+ this._delay = 0;
+ this._endDelay = 0;
+ this._fill = 'none';
+ this._iterationStart = 0;
+ this._iterations = 1;
+ this._duration = 0;
+ this._playbackRate = 1;
+ this._direction = 'normal';
+ this._easing = 'linear';
+ this._easingFunction = linear;
+ }
+
+ function isInvalidTimingDeprecated() {
+ return shared.isDeprecated('Invalid timing inputs', '2016-03-02', 'TypeError exceptions will be thrown instead.', true);
+ }
+
+ AnimationEffectTiming.prototype = {
+ _setMember: function(member, value) {
+ this['_' + member] = value;
+ if (this._effect) {
+ this._effect._timingInput[member] = value;
+ this._effect._timing = shared.normalizeTimingInput(this._effect._timingInput);
+ this._effect.activeDuration = shared.calculateActiveDuration(this._effect._timing);
+ if (this._effect._animation) {
+ this._effect._animation._rebuildUnderlyingAnimation();
+ }
+ }
+ },
+ get playbackRate() {
+ return this._playbackRate;
+ },
+ set delay(value) {
+ this._setMember('delay', value);
+ },
+ get delay() {
+ return this._delay;
+ },
+ set endDelay(value) {
+ this._setMember('endDelay', value);
+ },
+ get endDelay() {
+ return this._endDelay;
+ },
+ set fill(value) {
+ this._setMember('fill', value);
+ },
+ get fill() {
+ return this._fill;
+ },
+ set iterationStart(value) {
+ if ((isNaN(value) || value < 0) && isInvalidTimingDeprecated()) {
+ throw new TypeError('iterationStart must be a non-negative number, received: ' + timing.iterationStart);
+ }
+ this._setMember('iterationStart', value);
+ },
+ get iterationStart() {
+ return this._iterationStart;
+ },
+ set duration(value) {
+ if (value != 'auto' && (isNaN(value) || value < 0) && isInvalidTimingDeprecated()) {
+ throw new TypeError('duration must be non-negative or auto, received: ' + value);
+ }
+ this._setMember('duration', value);
+ },
+ get duration() {
+ return this._duration;
+ },
+ set direction(value) {
+ this._setMember('direction', value);
+ },
+ get direction() {
+ return this._direction;
+ },
+ set easing(value) {
+ this._easingFunction = parseEasingFunction(normalizeEasing(value));
+ this._setMember('easing', value);
+ },
+ get easing() {
+ return this._easing;
+ },
+ set iterations(value) {
+ if ((isNaN(value) || value < 0) && isInvalidTimingDeprecated()) {
+ throw new TypeError('iterations must be non-negative, received: ' + value);
+ }
+ this._setMember('iterations', value);
+ },
+ get iterations() {
+ return this._iterations;
+ }
+ };
+
+ function makeTiming(timingInput, forGroup, effect) {
+ var timing = new AnimationEffectTiming();
+ if (forGroup) {
+ timing.fill = 'both';
+ timing.duration = 'auto';
+ }
+ if (typeof timingInput == 'number' && !isNaN(timingInput)) {
+ timing.duration = timingInput;
+ } else if (timingInput !== undefined) {
+ Object.getOwnPropertyNames(timingInput).forEach(function(property) {
+ if (timingInput[property] != 'auto') {
+ if (typeof timing[property] == 'number' || property == 'duration') {
+ if (typeof timingInput[property] != 'number' || isNaN(timingInput[property])) {
+ return;
+ }
+ }
+ if ((property == 'fill') && (fills.indexOf(timingInput[property]) == -1)) {
+ return;
+ }
+ if ((property == 'direction') && (directions.indexOf(timingInput[property]) == -1)) {
+ return;
+ }
+ if (property == 'playbackRate' && timingInput[property] !== 1 && shared.isDeprecated('AnimationEffectTiming.playbackRate', '2014-11-28', 'Use Animation.playbackRate instead.')) {
+ return;
+ }
+ timing[property] = timingInput[property];
+ }
+ });
+ }
+ return timing;
+ }
+
+ function numericTimingToObject(timingInput) {
+ if (typeof timingInput == 'number') {
+ if (isNaN(timingInput)) {
+ timingInput = { duration: 0 };
+ } else {
+ timingInput = { duration: timingInput };
+ }
+ }
+ return timingInput;
+ }
+
+ function normalizeTimingInput(timingInput, forGroup) {
+ timingInput = shared.numericTimingToObject(timingInput);
+ return makeTiming(timingInput, forGroup);
+ }
+
+ function cubic(a, b, c, d) {
+ if (a < 0 || a > 1 || c < 0 || c > 1) {
+ return linear;
+ }
+ return function(x) {
+ if (x <= 0) {
+ var start_gradient = 0;
+ if (a > 0)
+ start_gradient = b / a;
+ else if (!b && c > 0)
+ start_gradient = d / c;
+ return start_gradient * x;
+ }
+ if (x >= 1) {
+ var end_gradient = 0;
+ if (c < 1)
+ end_gradient = (d - 1) / (c - 1);
+ else if (c == 1 && a < 1)
+ end_gradient = (b - 1) / (a - 1);
+ return 1 + end_gradient * (x - 1);
+ }
+
+ var start = 0, end = 1;
+ while (start < end) {
+ var mid = (start + end) / 2;
+ function f(a, b, m) { return 3 * a * (1 - m) * (1 - m) * m + 3 * b * (1 - m) * m * m + m * m * m};
+ var xEst = f(a, c, mid);
+ if (Math.abs(x - xEst) < 0.00001) {
+ return f(b, d, mid);
+ }
+ if (xEst < x) {
+ start = mid;
+ } else {
+ end = mid;
+ }
+ }
+ return f(b, d, mid);
+ }
+ }
+
+ var Start = 1;
+ var Middle = 0.5;
+ var End = 0;
+
+ function step(count, pos) {
+ return function(x) {
+ if (x >= 1) {
+ return 1;
+ }
+ var stepSize = 1 / count;
+ x += pos * stepSize;
+ return x - x % stepSize;
+ }
+ }
+
+ var presets = {
+ 'ease': cubic(0.25, 0.1, 0.25, 1),
+ 'ease-in': cubic(0.42, 0, 1, 1),
+ 'ease-out': cubic(0, 0, 0.58, 1),
+ 'ease-in-out': cubic(0.42, 0, 0.58, 1),
+ 'step-start': step(1, Start),
+ 'step-middle': step(1, Middle),
+ 'step-end': step(1, End)
+ };
+
+ var styleForCleaning = null;
+ var numberString = '\\s*(-?\\d+\\.?\\d*|-?\\.\\d+)\\s*';
+ var cubicBezierRe = new RegExp('cubic-bezier\\(' + numberString + ',' + numberString + ',' + numberString + ',' + numberString + '\\)');
+ var stepRe = /steps\(\s*(\d+)\s*,\s*(start|middle|end)\s*\)/;
+
+ function normalizeEasing(easing) {
+ if (!styleForCleaning) {
+ styleForCleaning = document.createElement('div').style;
+ }
+ styleForCleaning.animationTimingFunction = '';
+ styleForCleaning.animationTimingFunction = easing;
+ var normalizedEasing = styleForCleaning.animationTimingFunction;
+ if (normalizedEasing == '' && isInvalidTimingDeprecated()) {
+ throw new TypeError(easing + ' is not a valid value for easing');
+ }
+ return normalizedEasing;
+ }
+
+ function parseEasingFunction(normalizedEasing) {
+ if (normalizedEasing == 'linear') {
+ return linear;
+ }
+ var cubicData = cubicBezierRe.exec(normalizedEasing);
+ if (cubicData) {
+ return cubic.apply(this, cubicData.slice(1).map(Number));
+ }
+ var stepData = stepRe.exec(normalizedEasing);
+ if (stepData) {
+ return step(Number(stepData[1]), {'start': Start, 'middle': Middle, 'end': End}[stepData[2]]);
+ }
+ var preset = presets[normalizedEasing];
+ if (preset) {
+ return preset;
+ }
+ // At this point none of our parse attempts succeeded; the easing is invalid.
+ // Fall back to linear in the interest of not crashing the page.
+ return linear;
+ }
+
+ function calculateActiveDuration(timing) {
+ return Math.abs(repeatedDuration(timing) / timing.playbackRate);
+ }
+
+ function repeatedDuration(timing) {
+ // https://w3c.github.io/web-animations/#calculating-the-active-duration
+ if (timing.duration === 0 || timing.iterations === 0) {
+ return 0;
+ }
+ return timing.duration * timing.iterations;
+ }
+
+ var PhaseNone = 0;
+ var PhaseBefore = 1;
+ var PhaseAfter = 2;
+ var PhaseActive = 3;
+
+ function calculatePhase(activeDuration, localTime, timing) {
+ // https://w3c.github.io/web-animations/#animation-effect-phases-and-states
+ if (localTime == null) {
+ return PhaseNone;
+ }
+
+ var endTime = timing.delay + activeDuration + timing.endDelay;
+ if (localTime < Math.min(timing.delay, endTime)) {
+ return PhaseBefore;
+ }
+ if (localTime >= Math.min(timing.delay + activeDuration, endTime)) {
+ return PhaseAfter;
+ }
+
+ return PhaseActive;
+ }
+
+ function calculateActiveTime(activeDuration, fillMode, localTime, phase, delay) {
+ // https://w3c.github.io/web-animations/#calculating-the-active-time
+ switch (phase) {
+ case PhaseBefore:
+ if (fillMode == 'backwards' || fillMode == 'both')
+ return 0;
+ return null;
+ case PhaseActive:
+ return localTime - delay;
+ case PhaseAfter:
+ if (fillMode == 'forwards' || fillMode == 'both')
+ return activeDuration;
+ return null;
+ case PhaseNone:
+ return null;
+ }
+ }
+
+ function calculateOverallProgress(iterationDuration, phase, iterations, activeTime, iterationStart) {
+ // https://w3c.github.io/web-animations/#calculating-the-overall-progress
+ var overallProgress = iterationStart;
+ if (iterationDuration === 0) {
+ if (phase !== PhaseBefore) {
+ overallProgress += iterations;
+ }
+ } else {
+ overallProgress += activeTime / iterationDuration;
+ }
+ return overallProgress;
+ }
+
+ function calculateSimpleIterationProgress(overallProgress, iterationStart, phase, iterations, activeTime, iterationDuration) {
+ // https://w3c.github.io/web-animations/#calculating-the-simple-iteration-progress
+
+ var simpleIterationProgress = (overallProgress === Infinity) ? iterationStart % 1 : overallProgress % 1;
+ if (simpleIterationProgress === 0 && phase === PhaseAfter && iterations !== 0 &&
+ (activeTime !== 0 || iterationDuration === 0)) {
+ simpleIterationProgress = 1;
+ }
+ return simpleIterationProgress;
+ }
+
+ function calculateCurrentIteration(phase, iterations, simpleIterationProgress, overallProgress) {
+ // https://w3c.github.io/web-animations/#calculating-the-current-iteration
+ if (phase === PhaseAfter && iterations === Infinity) {
+ return Infinity;
+ }
+ if (simpleIterationProgress === 1) {
+ return Math.floor(overallProgress) - 1;
+ }
+ return Math.floor(overallProgress);
+ }
+
+ function calculateDirectedProgress(playbackDirection, currentIteration, simpleIterationProgress) {
+ // https://w3c.github.io/web-animations/#calculating-the-directed-progress
+ var currentDirection = playbackDirection;
+ if (playbackDirection !== 'normal' && playbackDirection !== 'reverse') {
+ var d = currentIteration;
+ if (playbackDirection === 'alternate-reverse') {
+ d += 1;
+ }
+ currentDirection = 'normal';
+ if (d !== Infinity && d % 2 !== 0) {
+ currentDirection = 'reverse';
+ }
+ }
+ if (currentDirection === 'normal') {
+ return simpleIterationProgress;
+ }
+ return 1 - simpleIterationProgress;
+ }
+
+ function calculateIterationProgress(activeDuration, localTime, timing) {
+ var phase = calculatePhase(activeDuration, localTime, timing);
+ var activeTime = calculateActiveTime(activeDuration, timing.fill, localTime, phase, timing.delay);
+ if (activeTime === null)
+ return null;
+
+ var overallProgress = calculateOverallProgress(timing.duration, phase, timing.iterations, activeTime, timing.iterationStart);
+ var simpleIterationProgress = calculateSimpleIterationProgress(overallProgress, timing.iterationStart, phase, timing.iterations, activeTime, timing.duration);
+ var currentIteration = calculateCurrentIteration(phase, timing.iterations, simpleIterationProgress, overallProgress);
+ var directedProgress = calculateDirectedProgress(timing.direction, currentIteration, simpleIterationProgress);
+
+ // https://w3c.github.io/web-animations/#calculating-the-transformed-progress
+ // https://w3c.github.io/web-animations/#calculating-the-iteration-progress
+ return timing._easingFunction(directedProgress);
+ }
+
+ shared.cloneTimingInput = cloneTimingInput;
+ shared.makeTiming = makeTiming;
+ shared.numericTimingToObject = numericTimingToObject;
+ shared.normalizeTimingInput = normalizeTimingInput;
+ shared.calculateActiveDuration = calculateActiveDuration;
+ shared.calculateIterationProgress = calculateIterationProgress;
+ shared.calculatePhase = calculatePhase;
+ shared.normalizeEasing = normalizeEasing;
+ shared.parseEasingFunction = parseEasingFunction;
+
+ if (WEB_ANIMATIONS_TESTING) {
+ testing.normalizeTimingInput = normalizeTimingInput;
+ testing.normalizeEasing = normalizeEasing;
+ testing.parseEasingFunction = parseEasingFunction;
+ testing.calculateActiveDuration = calculateActiveDuration;
+ testing.calculatePhase = calculatePhase;
+ testing.PhaseNone = PhaseNone;
+ testing.PhaseBefore = PhaseBefore;
+ testing.PhaseActive = PhaseActive;
+ testing.PhaseAfter = PhaseAfter;
+ }
+
+})(webAnimationsShared, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/transform-handler.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/transform-handler.js
new file mode 100644
index 00000000000..c6b4d934ebb
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/transform-handler.js
@@ -0,0 +1,275 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(scope, testing) {
+
+ // This returns a function for converting transform functions to equivalent
+ // primitive functions, which will take an array of values from the
+ // derivative type and fill in the blanks (underscores) with them.
+ var _ = null;
+ function cast(pattern) {
+ return function(contents) {
+ var i = 0;
+ return pattern.map(function(x) { return x === _ ? contents[i++] : x; });
+ }
+ }
+
+ function id(x) { return x; }
+
+ var Opx = {px: 0};
+ var Odeg = {deg: 0};
+
+ // type: [argTypes, convertTo3D, convertTo2D]
+ // In the argument types string, lowercase characters represent optional arguments
+ var transformFunctions = {
+ matrix: ['NNNNNN', [_, _, 0, 0, _, _, 0, 0, 0, 0, 1, 0, _, _, 0, 1], id],
+ matrix3d: ['NNNNNNNNNNNNNNNN', id],
+ rotate: ['A'],
+ rotatex: ['A'],
+ rotatey: ['A'],
+ rotatez: ['A'],
+ rotate3d: ['NNNA'],
+ perspective: ['L'],
+ scale: ['Nn', cast([_, _, 1]), id],
+ scalex: ['N', cast([_, 1, 1]), cast([_, 1])],
+ scaley: ['N', cast([1, _, 1]), cast([1, _])],
+ scalez: ['N', cast([1, 1, _])],
+ scale3d: ['NNN', id],
+ skew: ['Aa', null, id],
+ skewx: ['A', null, cast([_, Odeg])],
+ skewy: ['A', null, cast([Odeg, _])],
+ translate: ['Tt', cast([_, _, Opx]), id],
+ translatex: ['T', cast([_, Opx, Opx]), cast([_, Opx])],
+ translatey: ['T', cast([Opx, _, Opx]), cast([Opx, _])],
+ translatez: ['L', cast([Opx, Opx, _])],
+ translate3d: ['TTL', id],
+ };
+
+ function parseTransform(string) {
+ string = string.toLowerCase().trim();
+ if (string == 'none')
+ return [];
+ // FIXME: Using a RegExp means calcs won't work here
+ var transformRegExp = /\s*(\w+)\(([^)]*)\)/g;
+ var result = [];
+ var match;
+ var prevLastIndex = 0;
+ while (match = transformRegExp.exec(string)) {
+ if (match.index != prevLastIndex)
+ return;
+ prevLastIndex = match.index + match[0].length;
+ var functionName = match[1];
+ var functionData = transformFunctions[functionName];
+ if (!functionData)
+ return;
+ var args = match[2].split(',');
+ var argTypes = functionData[0];
+ if (argTypes.length < args.length)
+ return;
+
+ var parsedArgs = [];
+ for (var i = 0; i < argTypes.length; i++) {
+ var arg = args[i];
+ var type = argTypes[i];
+ var parsedArg;
+ if (!arg)
+ parsedArg = ({a: Odeg,
+ n: parsedArgs[0],
+ t: Opx})[type];
+ else
+ parsedArg = ({A: function(s) { return s.trim() == '0' ? Odeg : scope.parseAngle(s); },
+ N: scope.parseNumber,
+ T: scope.parseLengthOrPercent,
+ L: scope.parseLength})[type.toUpperCase()](arg);
+ if (parsedArg === undefined)
+ return;
+ parsedArgs.push(parsedArg);
+ }
+ result.push({t: functionName, d: parsedArgs});
+
+ if (transformRegExp.lastIndex == string.length)
+ return result;
+ }
+ };
+
+ function numberToLongString(x) {
+ return x.toFixed(6).replace('.000000', '');
+ }
+
+ function mergeMatrices(left, right) {
+ if (left.decompositionPair !== right) {
+ left.decompositionPair = right;
+ var leftArgs = scope.makeMatrixDecomposition(left);
+ }
+ if (right.decompositionPair !== left) {
+ right.decompositionPair = left;
+ var rightArgs = scope.makeMatrixDecomposition(right);
+ }
+ if (leftArgs[0] == null || rightArgs[0] == null)
+ return [[false], [true], function(x) { return x ? right[0].d : left[0].d; }];
+ leftArgs[0].push(0);
+ rightArgs[0].push(1);
+ return [
+ leftArgs,
+ rightArgs,
+ function(list) {
+ var quat = scope.quat(leftArgs[0][3], rightArgs[0][3], list[5]);
+ var mat = scope.composeMatrix(list[0], list[1], list[2], quat, list[4]);
+ var stringifiedArgs = mat.map(numberToLongString).join(',');
+ return stringifiedArgs;
+ }
+ ];
+ }
+
+ function typeTo2D(type) {
+ return type.replace(/[xy]/, '');
+ }
+
+ function typeTo3D(type) {
+ return type.replace(/(x|y|z|3d)?$/, '3d');
+ }
+
+ function mergeTransforms(left, right) {
+ var matrixModulesLoaded = scope.makeMatrixDecomposition && true;
+
+ var flipResults = false;
+ if (!left.length || !right.length) {
+ if (!left.length) {
+ flipResults = true;
+ left = right;
+ right = [];
+ }
+ for (var i = 0; i < left.length; i++) {
+ var type = left[i].t;
+ var args = left[i].d;
+ var defaultValue = type.substr(0, 5) == 'scale' ? 1 : 0;
+ right.push({t: type, d: args.map(function(arg) {
+ if (typeof arg == 'number')
+ return defaultValue;
+ var result = {};
+ for (var unit in arg)
+ result[unit] = defaultValue;
+ return result;
+ })});
+ }
+ }
+
+ var isMatrixOrPerspective = function(lt, rt) {
+ return ((lt == 'perspective') && (rt == 'perspective')) ||
+ ((lt == 'matrix' || lt == 'matrix3d') && (rt == 'matrix' || rt == 'matrix3d'));
+ };
+ var leftResult = [];
+ var rightResult = [];
+ var types = [];
+
+ if (left.length != right.length) {
+ if (!matrixModulesLoaded)
+ return;
+ var merged = mergeMatrices(left, right);
+ leftResult = [merged[0]];
+ rightResult = [merged[1]];
+ types = [['matrix', [merged[2]]]];
+ } else {
+ for (var i = 0; i < left.length; i++) {
+ var leftType = left[i].t;
+ var rightType = right[i].t;
+ var leftArgs = left[i].d;
+ var rightArgs = right[i].d;
+
+ var leftFunctionData = transformFunctions[leftType];
+ var rightFunctionData = transformFunctions[rightType];
+
+ var type;
+ if (isMatrixOrPerspective(leftType, rightType)) {
+ if (!matrixModulesLoaded)
+ return;
+ var merged = mergeMatrices([left[i]], [right[i]]);
+ leftResult.push(merged[0]);
+ rightResult.push(merged[1]);
+ types.push(['matrix', [merged[2]]]);
+ continue;
+ } else if (leftType == rightType) {
+ type = leftType;
+ } else if (leftFunctionData[2] && rightFunctionData[2] && typeTo2D(leftType) == typeTo2D(rightType)) {
+ type = typeTo2D(leftType);
+ leftArgs = leftFunctionData[2](leftArgs);
+ rightArgs = rightFunctionData[2](rightArgs);
+ } else if (leftFunctionData[1] && rightFunctionData[1] && typeTo3D(leftType) == typeTo3D(rightType)) {
+ type = typeTo3D(leftType);
+ leftArgs = leftFunctionData[1](leftArgs);
+ rightArgs = rightFunctionData[1](rightArgs);
+ } else {
+ if (!matrixModulesLoaded)
+ return;
+ var merged = mergeMatrices(left, right);
+ leftResult = [merged[0]];
+ rightResult = [merged[1]];
+ types = [['matrix', [merged[2]]]];
+ break;
+ }
+
+ var leftArgsCopy = [];
+ var rightArgsCopy = [];
+ var stringConversions = [];
+ for (var j = 0; j < leftArgs.length; j++) {
+ var merge = typeof leftArgs[j] == 'number' ? scope.mergeNumbers : scope.mergeDimensions;
+ var merged = merge(leftArgs[j], rightArgs[j]);
+ leftArgsCopy[j] = merged[0];
+ rightArgsCopy[j] = merged[1];
+ stringConversions.push(merged[2]);
+ }
+ leftResult.push(leftArgsCopy);
+ rightResult.push(rightArgsCopy);
+ types.push([type, stringConversions]);
+ }
+ }
+
+ if (flipResults) {
+ var tmp = leftResult;
+ leftResult = rightResult;
+ rightResult = tmp;
+ }
+
+ return [leftResult, rightResult, function(list) {
+ return list.map(function(args, i) {
+ var stringifiedArgs = args.map(function(arg, j) {
+ return types[i][1][j](arg);
+ }).join(',');
+ if (types[i][0] == 'matrix' && stringifiedArgs.split(',').length == 16)
+ types[i][0] = 'matrix3d';
+ return types[i][0] + '(' + stringifiedArgs + ')';
+
+ }).join(' ');
+ }];
+ }
+
+ scope.addPropertiesHandler(parseTransform, mergeTransforms, ['transform']);
+
+ scope.transformToSvgMatrix = function(string) {
+ // matrix(<a> <b> <c> <d> <e> <f>)
+ var mat = scope.transformListToMatrix(parseTransform(string));
+ return 'matrix(' +
+ numberToLongString(mat[0]) + ' ' + // <a>
+ numberToLongString(mat[1]) + ' ' + // <b>
+ numberToLongString(mat[4]) + ' ' + // <c>
+ numberToLongString(mat[5]) + ' ' + // <d>
+ numberToLongString(mat[12]) + ' ' + // <e>
+ numberToLongString(mat[13]) + // <f>
+ ')';
+ };
+
+ if (WEB_ANIMATIONS_TESTING)
+ testing.parseTransform = parseTransform;
+
+})(webAnimations1, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/visibility-handler.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/visibility-handler.js
new file mode 100644
index 00000000000..53f29535548
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/visibility-handler.js
@@ -0,0 +1,29 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(scope, testing) {
+
+ function merge(left, right) {
+ if (left != 'visible' && right != 'visible') return;
+ return [0, 1, function(x) {
+ if (x <= 0) return left;
+ if (x >= 1) return right;
+ return 'visible';
+ }];
+ }
+
+ scope.addPropertiesHandler(String, merge, ['visibility']);
+
+})(webAnimations1);
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/web-animations-bonus-cancel-events.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/web-animations-bonus-cancel-events.js
new file mode 100644
index 00000000000..3905496f480
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/web-animations-bonus-cancel-events.js
@@ -0,0 +1,83 @@
+// Copyright 2016 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function() {
+
+ if (document.createElement('div').animate([]).oncancel !== undefined) {
+ return;
+ }
+
+ if (WEB_ANIMATIONS_TESTING) {
+ var now = function() { return webAnimations1.timeline.currentTime; };
+ } else if (window.performance && performance.now) {
+ var now = function() { return performance.now(); };
+ } else {
+ var now = function() { return Date.now(); };
+ }
+
+ var AnimationCancelEvent = function(target, currentTime, timelineTime) {
+ this.target = target;
+ this.currentTime = currentTime;
+ this.timelineTime = timelineTime;
+
+ this.type = 'cancel';
+ this.bubbles = false;
+ this.cancelable = false;
+ this.currentTarget = target;
+ this.defaultPrevented = false;
+ this.eventPhase = Event.AT_TARGET;
+ this.timeStamp = Date.now();
+ };
+
+ var originalElementAnimate = window.Element.prototype.animate;
+ window.Element.prototype.animate = function(effectInput, options) {
+ var animation = originalElementAnimate.call(this, effectInput, options);
+
+ animation._cancelHandlers = [];
+ animation.oncancel = null;
+
+ var originalCancel = animation.cancel;
+ animation.cancel = function() {
+ originalCancel.call(this);
+ var event = new AnimationCancelEvent(this, null, now());
+ var handlers = this._cancelHandlers.concat(this.oncancel ? [this.oncancel] : []);
+ setTimeout(function() {
+ handlers.forEach(function(handler) {
+ handler.call(event.target, event);
+ });
+ }, 0);
+ };
+
+ var originalAddEventListener = animation.addEventListener;
+ animation.addEventListener = function(type, handler) {
+ if (typeof handler == 'function' && type == 'cancel')
+ this._cancelHandlers.push(handler);
+ else
+ originalAddEventListener.call(this, type, handler);
+ };
+
+ var originalRemoveEventListener = animation.removeEventListener;
+ animation.removeEventListener = function(type, handler) {
+ if (type == 'cancel') {
+ var index = this._cancelHandlers.indexOf(handler);
+ if (index >= 0)
+ this._cancelHandlers.splice(index, 1);
+ } else {
+ originalRemoveEventListener.call(this, type, handler);
+ }
+ };
+
+ return animation;
+ };
+})();
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/web-animations-bonus-object-form-keyframes.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/web-animations-bonus-object-form-keyframes.js
new file mode 100644
index 00000000000..c1b6ecdc574
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/web-animations-bonus-object-form-keyframes.js
@@ -0,0 +1,63 @@
+// Copyright 2016 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(shared) {
+ // If the polyfill is being loaded in a context where Element.animate is
+ // supported but object-form syntax is not, then creating an animation
+ // using the new syntax will either have no effect or will throw an exception.
+ // In either case, we want to proceed to load this part of the polyfill.
+ //
+ // The test animation uses an opacity other than the one the element already
+ // has, and doesn't need to change during the animation for the test to work.
+ // After the test, the element's opacity will be left how we found it:
+ // - If the animation is not created, the test will leave the element's
+ // opacity untouched at originalOpacity.
+ // - If the animation is created, it will be cancelled, and leave the
+ // element's opacity at originalOpacity.
+ // - If the animation is somehow created and runs without being cancelled,
+ // when it finishes after 1ms, it will cease to have any effect (because
+ // fill is not specified), and opacity will again be left at originalOpacity.
+ var element = document.documentElement;
+ var animation = null;
+ var animated = false;
+ try {
+ var originalOpacity = getComputedStyle(element).getPropertyValue('opacity');
+ var testOpacity = originalOpacity == '0' ? '1' : '0';
+ animation = element.animate({'opacity': [testOpacity, testOpacity]},
+ {duration: 1});
+ animation.currentTime = 0;
+ animated = getComputedStyle(element).getPropertyValue('opacity') == testOpacity;
+ } catch (error) {
+ } finally {
+ if (animation)
+ animation.cancel();
+ }
+ if (animated) {
+ return;
+ }
+
+ var originalElementAnimate = window.Element.prototype.animate;
+ window.Element.prototype.animate = function(effectInput, options) {
+ if (window.Symbol && Symbol.iterator && Array.prototype.from && effectInput[Symbol.iterator]) {
+ // Handle custom iterables in most browsers by converting to an array
+ effectInput = Array.from(effectInput);
+ }
+
+ if (!Array.isArray(effectInput) && effectInput !== null) {
+ effectInput = shared.convertToArrayForm(effectInput);
+ }
+
+ return originalElementAnimate.call(this, effectInput, options);
+ };
+})(webAnimationsShared);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/web-animations-next-animation.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/web-animations-next-animation.js
new file mode 100644
index 00000000000..698532cd972
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/src/web-animations-next-animation.js
@@ -0,0 +1,383 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(shared, scope, testing) {
+ scope.animationsWithPromises = [];
+
+ scope.Animation = function(effect, timeline) {
+ this.id = '';
+ if (effect && effect._id) {
+ this.id = effect._id;
+ }
+ this.effect = effect;
+ if (effect) {
+ effect._animation = this;
+ }
+ if (!timeline) {
+ throw new Error('Animation with null timeline is not supported');
+ }
+ this._timeline = timeline;
+ this._sequenceNumber = shared.sequenceNumber++;
+ this._holdTime = 0;
+ this._paused = false;
+ this._isGroup = false;
+ this._animation = null;
+ this._childAnimations = [];
+ this._callback = null;
+ this._oldPlayState = 'idle';
+ this._rebuildUnderlyingAnimation();
+ // Animations are constructed in the idle state.
+ this._animation.cancel();
+ this._updatePromises();
+ };
+
+ scope.Animation.prototype = {
+ _updatePromises: function() {
+ var oldPlayState = this._oldPlayState;
+ var newPlayState = this.playState;
+ if (this._readyPromise && newPlayState !== oldPlayState) {
+ if (newPlayState == 'idle') {
+ this._rejectReadyPromise();
+ this._readyPromise = undefined;
+ } else if (oldPlayState == 'pending') {
+ this._resolveReadyPromise();
+ } else if (newPlayState == 'pending') {
+ this._readyPromise = undefined;
+ }
+ }
+ if (this._finishedPromise && newPlayState !== oldPlayState) {
+ if (newPlayState == 'idle') {
+ this._rejectFinishedPromise();
+ this._finishedPromise = undefined;
+ } else if (newPlayState == 'finished') {
+ this._resolveFinishedPromise();
+ } else if (oldPlayState == 'finished') {
+ this._finishedPromise = undefined;
+ }
+ }
+ this._oldPlayState = this.playState;
+ return (this._readyPromise || this._finishedPromise);
+ },
+ _rebuildUnderlyingAnimation: function() {
+ this._updatePromises();
+ var oldPlaybackRate;
+ var oldPaused;
+ var oldStartTime;
+ var oldCurrentTime;
+ var hadUnderlying = this._animation ? true : false;
+ if (hadUnderlying) {
+ oldPlaybackRate = this.playbackRate;
+ oldPaused = this._paused;
+ oldStartTime = this.startTime;
+ oldCurrentTime = this.currentTime;
+ this._animation.cancel();
+ this._animation._wrapper = null;
+ this._animation = null;
+ }
+
+ if (!this.effect || this.effect instanceof window.KeyframeEffect) {
+ this._animation = scope.newUnderlyingAnimationForKeyframeEffect(this.effect);
+ scope.bindAnimationForKeyframeEffect(this);
+ }
+ if (this.effect instanceof window.SequenceEffect || this.effect instanceof window.GroupEffect) {
+ this._animation = scope.newUnderlyingAnimationForGroup(this.effect);
+ scope.bindAnimationForGroup(this);
+ }
+ if (this.effect && this.effect._onsample) {
+ scope.bindAnimationForCustomEffect(this);
+ }
+ if (hadUnderlying) {
+ if (oldPlaybackRate != 1) {
+ this.playbackRate = oldPlaybackRate;
+ }
+ if (oldStartTime !== null) {
+ this.startTime = oldStartTime;
+ } else if (oldCurrentTime !== null) {
+ this.currentTime = oldCurrentTime;
+ } else if (this._holdTime !== null) {
+ this.currentTime = this._holdTime;
+ }
+ if (oldPaused) {
+ this.pause();
+ }
+ }
+ this._updatePromises();
+ },
+ _updateChildren: function() {
+ if (!this.effect || this.playState == 'idle')
+ return;
+
+ var offset = this.effect._timing.delay;
+ this._childAnimations.forEach(function(childAnimation) {
+ this._arrangeChildren(childAnimation, offset);
+ if (this.effect instanceof window.SequenceEffect)
+ offset += scope.groupChildDuration(childAnimation.effect);
+ }.bind(this));
+ },
+ _setExternalAnimation: function(animation) {
+ if (!this.effect || !this._isGroup)
+ return;
+ for (var i = 0; i < this.effect.children.length; i++) {
+ this.effect.children[i]._animation = animation;
+ this._childAnimations[i]._setExternalAnimation(animation);
+ }
+ },
+ _constructChildAnimations: function() {
+ if (!this.effect || !this._isGroup)
+ return;
+ var offset = this.effect._timing.delay;
+ this._removeChildAnimations();
+ this.effect.children.forEach(function(child) {
+ var childAnimation = scope.timeline._play(child);
+ this._childAnimations.push(childAnimation);
+ childAnimation.playbackRate = this.playbackRate;
+ if (this._paused)
+ childAnimation.pause();
+ child._animation = this.effect._animation;
+
+ this._arrangeChildren(childAnimation, offset);
+
+ if (this.effect instanceof window.SequenceEffect)
+ offset += scope.groupChildDuration(child);
+ }.bind(this));
+ },
+ _arrangeChildren: function(childAnimation, offset) {
+ if (this.startTime === null) {
+ childAnimation.currentTime = this.currentTime - offset / this.playbackRate;
+ } else if (childAnimation.startTime !== this.startTime + offset / this.playbackRate) {
+ childAnimation.startTime = this.startTime + offset / this.playbackRate;
+ }
+ },
+ get timeline() {
+ return this._timeline;
+ },
+ get playState() {
+ return this._animation ? this._animation.playState : 'idle';
+ },
+ get finished() {
+ if (!window.Promise) {
+ console.warn('Animation Promises require JavaScript Promise constructor');
+ return null;
+ }
+ if (!this._finishedPromise) {
+ if (scope.animationsWithPromises.indexOf(this) == -1) {
+ scope.animationsWithPromises.push(this);
+ }
+ this._finishedPromise = new Promise(
+ function(resolve, reject) {
+ this._resolveFinishedPromise = function() {
+ resolve(this);
+ };
+ this._rejectFinishedPromise = function() {
+ reject({type: DOMException.ABORT_ERR, name: 'AbortError'});
+ };
+ }.bind(this));
+ if (this.playState == 'finished') {
+ this._resolveFinishedPromise();
+ }
+ }
+ return this._finishedPromise;
+ },
+ get ready() {
+ if (!window.Promise) {
+ console.warn('Animation Promises require JavaScript Promise constructor');
+ return null;
+ }
+ if (!this._readyPromise) {
+ if (scope.animationsWithPromises.indexOf(this) == -1) {
+ scope.animationsWithPromises.push(this);
+ }
+ this._readyPromise = new Promise(
+ function(resolve, reject) {
+ this._resolveReadyPromise = function() {
+ resolve(this);
+ };
+ this._rejectReadyPromise = function() {
+ reject({type: DOMException.ABORT_ERR, name: 'AbortError'});
+ };
+ }.bind(this));
+ if (this.playState !== 'pending') {
+ this._resolveReadyPromise();
+ }
+ }
+ return this._readyPromise;
+ },
+ get onfinish() {
+ return this._animation.onfinish;
+ },
+ set onfinish(v) {
+ if (typeof v == 'function') {
+ this._animation.onfinish = (function(e) {
+ e.target = this;
+ v.call(this, e);
+ }).bind(this);
+ } else {
+ this._animation.onfinish = v;
+ }
+ },
+ get oncancel() {
+ return this._animation.oncancel;
+ },
+ set oncancel(v) {
+ if (typeof v == 'function') {
+ this._animation.oncancel = (function(e) {
+ e.target = this;
+ v.call(this, e);
+ }).bind(this);
+ } else {
+ this._animation.oncancel = v;
+ }
+ },
+ get currentTime() {
+ this._updatePromises();
+ var currentTime = this._animation.currentTime;
+ this._updatePromises();
+ return currentTime;
+ },
+ set currentTime(v) {
+ this._updatePromises();
+ this._animation.currentTime = isFinite(v) ? v : Math.sign(v) * Number.MAX_VALUE;
+ this._register();
+ this._forEachChild(function(child, offset) {
+ child.currentTime = v - offset;
+ });
+ this._updatePromises();
+ },
+ get startTime() {
+ return this._animation.startTime;
+ },
+ set startTime(v) {
+ this._updatePromises();
+ this._animation.startTime = isFinite(v) ? v : Math.sign(v) * Number.MAX_VALUE;
+ this._register();
+ this._forEachChild(function(child, offset) {
+ child.startTime = v + offset;
+ });
+ this._updatePromises();
+ },
+ get playbackRate() {
+ return this._animation.playbackRate;
+ },
+ set playbackRate(value) {
+ this._updatePromises();
+ var oldCurrentTime = this.currentTime;
+ this._animation.playbackRate = value;
+ this._forEachChild(function(childAnimation) {
+ childAnimation.playbackRate = value;
+ });
+ if (oldCurrentTime !== null) {
+ this.currentTime = oldCurrentTime;
+ }
+ this._updatePromises();
+ },
+ play: function() {
+ this._updatePromises();
+ this._paused = false;
+ this._animation.play();
+ if (this._timeline._animations.indexOf(this) == -1) {
+ this._timeline._animations.push(this);
+ }
+ this._register();
+ scope.awaitStartTime(this);
+ this._forEachChild(function(child) {
+ var time = child.currentTime;
+ child.play();
+ child.currentTime = time;
+ });
+ this._updatePromises();
+ },
+ pause: function() {
+ this._updatePromises();
+ if (this.currentTime) {
+ this._holdTime = this.currentTime;
+ }
+ this._animation.pause();
+ this._register();
+ this._forEachChild(function(child) {
+ child.pause();
+ });
+ this._paused = true;
+ this._updatePromises();
+ },
+ finish: function() {
+ this._updatePromises();
+ this._animation.finish();
+ this._register();
+ this._updatePromises();
+ },
+ cancel: function() {
+ this._updatePromises();
+ this._animation.cancel();
+ this._register();
+ this._removeChildAnimations();
+ this._updatePromises();
+ },
+ reverse: function() {
+ this._updatePromises();
+ var oldCurrentTime = this.currentTime;
+ this._animation.reverse();
+ this._forEachChild(function(childAnimation) {
+ childAnimation.reverse();
+ });
+ if (oldCurrentTime !== null) {
+ this.currentTime = oldCurrentTime;
+ }
+ this._updatePromises();
+ },
+ addEventListener: function(type, handler) {
+ var wrapped = handler;
+ if (typeof handler == 'function') {
+ wrapped = (function(e) {
+ e.target = this;
+ handler.call(this, e);
+ }).bind(this);
+ handler._wrapper = wrapped;
+ }
+ this._animation.addEventListener(type, wrapped);
+ },
+ removeEventListener: function(type, handler) {
+ this._animation.removeEventListener(type, (handler && handler._wrapper) || handler);
+ },
+ _removeChildAnimations: function() {
+ while (this._childAnimations.length)
+ this._childAnimations.pop().cancel();
+ },
+ _forEachChild: function(f) {
+ var offset = 0;
+ if (this.effect.children && this._childAnimations.length < this.effect.children.length)
+ this._constructChildAnimations();
+ this._childAnimations.forEach(function(child) {
+ f.call(this, child, offset);
+ if (this.effect instanceof window.SequenceEffect)
+ offset += child.effect.activeDuration;
+ }.bind(this));
+
+ if (this.playState == 'pending')
+ return;
+ var timing = this.effect._timing;
+ var t = this.currentTime;
+ if (t !== null)
+ t = shared.calculateIterationProgress(shared.calculateActiveDuration(timing), t, timing);
+ if (t == null || isNaN(t))
+ this._removeChildAnimations();
+ },
+ };
+
+ window.Animation = scope.Animation;
+
+ if (WEB_ANIMATIONS_TESTING) {
+ testing.webAnimationsNextAnimation = scope.Animation;
+ }
+
+})(webAnimationsShared, webAnimationsNext, webAnimationsTesting);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next-lite.min.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next-lite.min.html
new file mode 100644
index 00000000000..3580355ab12
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next-lite.min.html
@@ -0,0 +1 @@
+<script src="./web-animations-next-lite.min.js"></script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next-lite.min.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next-lite.min.js
new file mode 100644
index 00000000000..965fcbb226c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next-lite.min.js
@@ -0,0 +1,16 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+!function(a,b){var c={},d={},e={};!function(a,b){function c(a){if("number"==typeof a)return a;var b={};for(var c in a)b[c]=a[c];return b}function d(){this._delay=0,this._endDelay=0,this._fill="none",this._iterationStart=0,this._iterations=1,this._duration=0,this._playbackRate=1,this._direction="normal",this._easing="linear",this._easingFunction=x}function e(){return a.isDeprecated("Invalid timing inputs","2016-03-02","TypeError exceptions will be thrown instead.",!0)}function f(b,c,e){var f=new d;return c&&(f.fill="both",f.duration="auto"),"number"!=typeof b||isNaN(b)?void 0!==b&&Object.getOwnPropertyNames(b).forEach(function(c){if("auto"!=b[c]){if(("number"==typeof f[c]||"duration"==c)&&("number"!=typeof b[c]||isNaN(b[c])))return;if("fill"==c&&-1==v.indexOf(b[c]))return;if("direction"==c&&-1==w.indexOf(b[c]))return;if("playbackRate"==c&&1!==b[c]&&a.isDeprecated("AnimationEffectTiming.playbackRate","2014-11-28","Use Animation.playbackRate instead."))return;f[c]=b[c]}}):f.duration=b,f}function g(a){return"number"==typeof a&&(a=isNaN(a)?{duration:0}:{duration:a}),a}function h(b,c){return b=a.numericTimingToObject(b),f(b,c)}function i(a,b,c,d){return a<0||a>1||c<0||c>1?x:function(e){function f(a,b,c){return 3*a*(1-c)*(1-c)*c+3*b*(1-c)*c*c+c*c*c}if(e<=0){var g=0;return a>0?g=b/a:!b&&c>0&&(g=d/c),g*e}if(e>=1){var h=0;return c<1?h=(d-1)/(c-1):1==c&&a<1&&(h=(b-1)/(a-1)),1+h*(e-1)}for(var i=0,j=1;i<j;){var k=(i+j)/2,l=f(a,c,k);if(Math.abs(e-l)<1e-5)return f(b,d,k);l<e?i=k:j=k}return f(b,d,k)}}function j(a,b){return function(c){if(c>=1)return 1;var d=1/a;return(c+=b*d)-c%d}}function k(a){C||(C=document.createElement("div").style),C.animationTimingFunction="",C.animationTimingFunction=a;var b=C.animationTimingFunction;if(""==b&&e())throw new TypeError(a+" is not a valid value for easing");return b}function l(a){if("linear"==a)return x;var b=E.exec(a);if(b)return i.apply(this,b.slice(1).map(Number));var c=F.exec(a);return c?j(Number(c[1]),{start:y,middle:z,end:A}[c[2]]):B[a]||x}function m(a){return Math.abs(n(a)/a.playbackRate)}function n(a){return 0===a.duration||0===a.iterations?0:a.duration*a.iterations}function o(a,b,c){if(null==b)return G;var d=c.delay+a+c.endDelay;return b<Math.min(c.delay,d)?H:b>=Math.min(c.delay+a,d)?I:J}function p(a,b,c,d,e){switch(d){case H:return"backwards"==b||"both"==b?0:null;case J:return c-e;case I:return"forwards"==b||"both"==b?a:null;case G:return null}}function q(a,b,c,d,e){var f=e;return 0===a?b!==H&&(f+=c):f+=d/a,f}function r(a,b,c,d,e,f){var g=a===1/0?b%1:a%1;return 0!==g||c!==I||0===d||0===e&&0!==f||(g=1),g}function s(a,b,c,d){return a===I&&b===1/0?1/0:1===c?Math.floor(d)-1:Math.floor(d)}function t(a,b,c){var d=a;if("normal"!==a&&"reverse"!==a){var e=b;"alternate-reverse"===a&&(e+=1),d="normal",e!==1/0&&e%2!=0&&(d="reverse")}return"normal"===d?c:1-c}function u(a,b,c){var d=o(a,b,c),e=p(a,c.fill,b,d,c.delay);if(null===e)return null;var f=q(c.duration,d,c.iterations,e,c.iterationStart),g=r(f,c.iterationStart,d,c.iterations,e,c.duration),h=s(d,c.iterations,g,f),i=t(c.direction,h,g);return c._easingFunction(i)}var v="backwards|forwards|both|none".split("|"),w="reverse|alternate|alternate-reverse".split("|"),x=function(a){return a};d.prototype={_setMember:function(b,c){this["_"+b]=c,this._effect&&(this._effect._timingInput[b]=c,this._effect._timing=a.normalizeTimingInput(this._effect._timingInput),this._effect.activeDuration=a.calculateActiveDuration(this._effect._timing),this._effect._animation&&this._effect._animation._rebuildUnderlyingAnimation())},get playbackRate(){return this._playbackRate},set delay(a){this._setMember("delay",a)},get delay(){return this._delay},set endDelay(a){this._setMember("endDelay",a)},get endDelay(){return this._endDelay},set fill(a){this._setMember("fill",a)},get fill(){return this._fill},set iterationStart(a){if((isNaN(a)||a<0)&&e())throw new TypeError("iterationStart must be a non-negative number, received: "+timing.iterationStart);this._setMember("iterationStart",a)},get iterationStart(){return this._iterationStart},set duration(a){if("auto"!=a&&(isNaN(a)||a<0)&&e())throw new TypeError("duration must be non-negative or auto, received: "+a);this._setMember("duration",a)},get duration(){return this._duration},set direction(a){this._setMember("direction",a)},get direction(){return this._direction},set easing(a){this._easingFunction=l(k(a)),this._setMember("easing",a)},get easing(){return this._easing},set iterations(a){if((isNaN(a)||a<0)&&e())throw new TypeError("iterations must be non-negative, received: "+a);this._setMember("iterations",a)},get iterations(){return this._iterations}};var y=1,z=.5,A=0,B={ease:i(.25,.1,.25,1),"ease-in":i(.42,0,1,1),"ease-out":i(0,0,.58,1),"ease-in-out":i(.42,0,.58,1),"step-start":j(1,y),"step-middle":j(1,z),"step-end":j(1,A)},C=null,D="\\s*(-?\\d+\\.?\\d*|-?\\.\\d+)\\s*",E=new RegExp("cubic-bezier\\("+D+","+D+","+D+","+D+"\\)"),F=/steps\(\s*(\d+)\s*,\s*(start|middle|end)\s*\)/,G=0,H=1,I=2,J=3;a.cloneTimingInput=c,a.makeTiming=f,a.numericTimingToObject=g,a.normalizeTimingInput=h,a.calculateActiveDuration=m,a.calculateIterationProgress=u,a.calculatePhase=o,a.normalizeEasing=k,a.parseEasingFunction=l}(c),function(a,b){function c(a,b){return a in k?k[a][b]||b:b}function d(a){return"display"===a||0===a.lastIndexOf("animation",0)||0===a.lastIndexOf("transition",0)}function e(a,b,e){if(!d(a)){var f=h[a];if(f){i.style[a]=b;for(var g in f){var j=f[g],k=i.style[j];e[j]=c(j,k)}}else e[a]=c(a,b)}}function f(a){var b=[];for(var c in a)if(!(c in["easing","offset","composite"])){var d=a[c];Array.isArray(d)||(d=[d]);for(var e,f=d.length,g=0;g<f;g++)e={},e.offset="offset"in a?a.offset:1==f?1:g/(f-1),"easing"in a&&(e.easing=a.easing),"composite"in a&&(e.composite=a.composite),e[c]=d[g],b.push(e)}return b.sort(function(a,b){return a.offset-b.offset}),b}function g(b){function c(){var a=d.length;null==d[a-1].offset&&(d[a-1].offset=1),a>1&&null==d[0].offset&&(d[0].offset=0);for(var b=0,c=d[0].offset,e=1;e<a;e++){var f=d[e].offset;if(null!=f){for(var g=1;g<e-b;g++)d[b+g].offset=c+(f-c)*g/(e-b);b=e,c=f}}}if(null==b)return[];window.Symbol&&Symbol.iterator&&Array.prototype.from&&b[Symbol.iterator]&&(b=Array.from(b)),Array.isArray(b)||(b=f(b));for(var d=b.map(function(b){var c={};for(var d in b){var f=b[d];if("offset"==d){if(null!=f){if(f=Number(f),!isFinite(f))throw new TypeError("Keyframe offsets must be numbers.");if(f<0||f>1)throw new TypeError("Keyframe offsets must be between 0 and 1.")}}else if("composite"==d){if("add"==f||"accumulate"==f)throw{type:DOMException.NOT_SUPPORTED_ERR,name:"NotSupportedError",message:"add compositing is not supported"};if("replace"!=f)throw new TypeError("Invalid composite mode "+f+".")}else f="easing"==d?a.normalizeEasing(f):""+f;e(d,f,c)}return void 0==c.offset&&(c.offset=null),void 0==c.easing&&(c.easing="linear"),c}),g=!0,h=-1/0,i=0;i<d.length;i++){var j=d[i].offset;if(null!=j){if(j<h)throw new TypeError("Keyframes are not loosely sorted by offset. Sort or specify offsets.");h=j}else g=!1}return d=d.filter(function(a){return a.offset>=0&&a.offset<=1}),g||c(),d}var h={background:["backgroundImage","backgroundPosition","backgroundSize","backgroundRepeat","backgroundAttachment","backgroundOrigin","backgroundClip","backgroundColor"],border:["borderTopColor","borderTopStyle","borderTopWidth","borderRightColor","borderRightStyle","borderRightWidth","borderBottomColor","borderBottomStyle","borderBottomWidth","borderLeftColor","borderLeftStyle","borderLeftWidth"],borderBottom:["borderBottomWidth","borderBottomStyle","borderBottomColor"],borderColor:["borderTopColor","borderRightColor","borderBottomColor","borderLeftColor"],borderLeft:["borderLeftWidth","borderLeftStyle","borderLeftColor"],borderRadius:["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],borderRight:["borderRightWidth","borderRightStyle","borderRightColor"],borderTop:["borderTopWidth","borderTopStyle","borderTopColor"],borderWidth:["borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth"],flex:["flexGrow","flexShrink","flexBasis"],font:["fontFamily","fontSize","fontStyle","fontVariant","fontWeight","lineHeight"],margin:["marginTop","marginRight","marginBottom","marginLeft"],outline:["outlineColor","outlineStyle","outlineWidth"],padding:["paddingTop","paddingRight","paddingBottom","paddingLeft"]},i=document.createElementNS("http://www.w3.org/1999/xhtml","div"),j={thin:"1px",medium:"3px",thick:"5px"},k={borderBottomWidth:j,borderLeftWidth:j,borderRightWidth:j,borderTopWidth:j,fontSize:{"xx-small":"60%","x-small":"75%",small:"89%",medium:"100%",large:"120%","x-large":"150%","xx-large":"200%"},fontWeight:{normal:"400",bold:"700"},outlineWidth:j,textShadow:{none:"0px 0px 0px transparent"},boxShadow:{none:"0px 0px 0px 0px transparent"}};a.convertToArrayForm=f,a.normalizeKeyframes=g}(c),function(a){var b={};a.isDeprecated=function(a,c,d,e){var f=e?"are":"is",g=new Date,h=new Date(c);return h.setMonth(h.getMonth()+3),!(g<h&&(a in b||console.warn("Web Animations: "+a+" "+f+" deprecated and will stop working on "+h.toDateString()+". "+d),b[a]=!0,1))},a.deprecated=function(b,c,d,e){var f=e?"are":"is";if(a.isDeprecated(b,c,d,e))throw new Error(b+" "+f+" no longer supported. "+d)}}(c),function(){if(document.documentElement.animate){var a=document.documentElement.animate([],0),b=!0;if(a&&(b=!1,"play|currentTime|pause|reverse|playbackRate|cancel|finish|startTime|playState".split("|").forEach(function(c){void 0===a[c]&&(b=!0)})),!b)return}!function(a,b,c){function d(a){for(var b={},c=0;c<a.length;c++)for(var d in a[c])if("offset"!=d&&"easing"!=d&&"composite"!=d){var e={offset:a[c].offset,easing:a[c].easing,value:a[c][d]};b[d]=b[d]||[],b[d].push(e)}for(var f in b){var g=b[f];if(0!=g[0].offset||1!=g[g.length-1].offset)throw{type:DOMException.NOT_SUPPORTED_ERR,name:"NotSupportedError",message:"Partial keyframes are not supported"}}return b}function e(c){var d=[];for(var e in c)for(var f=c[e],g=0;g<f.length-1;g++){var h=g,i=g+1,j=f[h].offset,k=f[i].offset,l=j,m=k;0==g&&(l=-1/0,0==k&&(i=h)),g==f.length-2&&(m=1/0,1==j&&(h=i)),d.push({applyFrom:l,applyTo:m,startOffset:f[h].offset,endOffset:f[i].offset,easingFunction:a.parseEasingFunction(f[h].easing),property:e,interpolation:b.propertyInterpolation(e,f[h].value,f[i].value)})}return d.sort(function(a,b){return a.startOffset-b.startOffset}),d}b.convertEffectInput=function(c){var f=a.normalizeKeyframes(c),g=d(f),h=e(g);return function(a,c){if(null!=c)h.filter(function(a){return c>=a.applyFrom&&c<a.applyTo}).forEach(function(d){var e=c-d.startOffset,f=d.endOffset-d.startOffset,g=0==f?0:d.easingFunction(e/f);b.apply(a,d.property,d.interpolation(g))});else for(var d in g)"offset"!=d&&"easing"!=d&&"composite"!=d&&b.clear(a,d)}}}(c,d),function(a,b,c){function d(a){return a.replace(/-(.)/g,function(a,b){return b.toUpperCase()})}function e(a,b,c){h[c]=h[c]||[],h[c].push([a,b])}function f(a,b,c){for(var f=0;f<c.length;f++){e(a,b,d(c[f]))}}function g(c,e,f){var g=c;/-/.test(c)&&!a.isDeprecated("Hyphenated property names","2016-03-22","Use camelCase instead.",!0)&&(g=d(c)),"initial"!=e&&"initial"!=f||("initial"==e&&(e=i[g]),"initial"==f&&(f=i[g]));for(var j=e==f?[]:h[g],k=0;j&&k<j.length;k++){var l=j[k][0](e),m=j[k][0](f);if(void 0!==l&&void 0!==m){var n=j[k][1](l,m);if(n){var o=b.Interpolation.apply(null,n);return function(a){return 0==a?e:1==a?f:o(a)}}}}return b.Interpolation(!1,!0,function(a){return a?f:e})}var h={};b.addPropertiesHandler=f;var i={backgroundColor:"transparent",backgroundPosition:"0% 0%",borderBottomColor:"currentColor",borderBottomLeftRadius:"0px",borderBottomRightRadius:"0px",borderBottomWidth:"3px",borderLeftColor:"currentColor",borderLeftWidth:"3px",borderRightColor:"currentColor",borderRightWidth:"3px",borderSpacing:"2px",borderTopColor:"currentColor",borderTopLeftRadius:"0px",borderTopRightRadius:"0px",borderTopWidth:"3px",bottom:"auto",clip:"rect(0px, 0px, 0px, 0px)",color:"black",fontSize:"100%",fontWeight:"400",height:"auto",left:"auto",letterSpacing:"normal",lineHeight:"120%",marginBottom:"0px",marginLeft:"0px",marginRight:"0px",marginTop:"0px",maxHeight:"none",maxWidth:"none",minHeight:"0px",minWidth:"0px",opacity:"1.0",outlineColor:"invert",outlineOffset:"0px",outlineWidth:"3px",paddingBottom:"0px",paddingLeft:"0px",paddingRight:"0px",paddingTop:"0px",right:"auto",strokeDasharray:"none",strokeDashoffset:"0px",textIndent:"0px",textShadow:"0px 0px 0px transparent",top:"auto",transform:"",verticalAlign:"0px",visibility:"visible",width:"auto",wordSpacing:"normal",zIndex:"auto"};b.propertyInterpolation=g}(c,d),function(a,b,c){function d(b){var c=a.calculateActiveDuration(b),d=function(d){return a.calculateIterationProgress(c,d,b)};return d._totalDuration=b.delay+c+b.endDelay,d}b.KeyframeEffect=function(c,e,f,g){var h,i=d(a.normalizeTimingInput(f)),j=b.convertEffectInput(e),k=function(){j(c,h)};return k._update=function(a){return null!==(h=i(a))},k._clear=function(){j(c,null)},k._hasSameTarget=function(a){return c===a},k._target=c,k._totalDuration=i._totalDuration,k._id=g,k}}(c,d),function(a,b){a.apply=function(b,c,d){b.style[a.propertyName(c)]=d},a.clear=function(b,c){b.style[a.propertyName(c)]=""}}(d),function(a){window.Element.prototype.animate=function(b,c){var d="";return c&&c.id&&(d=c.id),a.timeline._play(a.KeyframeEffect(this,b,c,d))}}(d),function(a,b){function c(a,b,d){if("number"==typeof a&&"number"==typeof b)return a*(1-d)+b*d;if("boolean"==typeof a&&"boolean"==typeof b)return d<.5?a:b;if(a.length==b.length){for(var e=[],f=0;f<a.length;f++)e.push(c(a[f],b[f],d));return e}throw"Mismatched interpolation arguments "+a+":"+b}a.Interpolation=function(a,b,d){return function(e){return d(c(a,b,e))}}}(d),function(a,b,c){a.sequenceNumber=0;var d=function(a,b,c){this.target=a,this.currentTime=b,this.timelineTime=c,this.type="finish",this.bubbles=!1,this.cancelable=!1,this.currentTarget=a,this.defaultPrevented=!1,this.eventPhase=Event.AT_TARGET,this.timeStamp=Date.now()};b.Animation=function(b){this.id="",b&&b._id&&(this.id=b._id),this._sequenceNumber=a.sequenceNumber++,this._currentTime=0,this._startTime=null,this._paused=!1,this._playbackRate=1,this._inTimeline=!0,this._finishedFlag=!0,this.onfinish=null,this._finishHandlers=[],this._effect=b,this._inEffect=this._effect._update(0),this._idle=!0,this._currentTimePending=!1},b.Animation.prototype={_ensureAlive:function(){this.playbackRate<0&&0===this.currentTime?this._inEffect=this._effect._update(-1):this._inEffect=this._effect._update(this.currentTime),this._inTimeline||!this._inEffect&&this._finishedFlag||(this._inTimeline=!0,b.timeline._animations.push(this))},_tickCurrentTime:function(a,b){a!=this._currentTime&&(this._currentTime=a,this._isFinished&&!b&&(this._currentTime=this._playbackRate>0?this._totalDuration:0),this._ensureAlive())},get currentTime(){return this._idle||this._currentTimePending?null:this._currentTime},set currentTime(a){a=+a,isNaN(a)||(b.restart(),this._paused||null==this._startTime||(this._startTime=this._timeline.currentTime-a/this._playbackRate),this._currentTimePending=!1,this._currentTime!=a&&(this._idle&&(this._idle=!1,this._paused=!0),this._tickCurrentTime(a,!0),b.applyDirtiedAnimation(this)))},get startTime(){return this._startTime},set startTime(a){a=+a,isNaN(a)||this._paused||this._idle||(this._startTime=a,this._tickCurrentTime((this._timeline.currentTime-this._startTime)*this.playbackRate),b.applyDirtiedAnimation(this))},get playbackRate(){return this._playbackRate},set playbackRate(a){if(a!=this._playbackRate){var c=this.currentTime;this._playbackRate=a,this._startTime=null,"paused"!=this.playState&&"idle"!=this.playState&&(this._finishedFlag=!1,this._idle=!1,this._ensureAlive(),b.applyDirtiedAnimation(this)),null!=c&&(this.currentTime=c)}},get _isFinished(){return!this._idle&&(this._playbackRate>0&&this._currentTime>=this._totalDuration||this._playbackRate<0&&this._currentTime<=0)},get _totalDuration(){return this._effect._totalDuration},get playState(){return this._idle?"idle":null==this._startTime&&!this._paused&&0!=this.playbackRate||this._currentTimePending?"pending":this._paused?"paused":this._isFinished?"finished":"running"},_rewind:function(){if(this._playbackRate>=0)this._currentTime=0;else{if(!(this._totalDuration<1/0))throw new DOMException("Unable to rewind negative playback rate animation with infinite duration","InvalidStateError");this._currentTime=this._totalDuration}},play:function(){this._paused=!1,(this._isFinished||this._idle)&&(this._rewind(),this._startTime=null),this._finishedFlag=!1,this._idle=!1,this._ensureAlive(),b.applyDirtiedAnimation(this)},pause:function(){this._isFinished||this._paused||this._idle?this._idle&&(this._rewind(),this._idle=!1):this._currentTimePending=!0,this._startTime=null,this._paused=!0},finish:function(){this._idle||(this.currentTime=this._playbackRate>0?this._totalDuration:0,this._startTime=this._totalDuration-this.currentTime,this._currentTimePending=!1,b.applyDirtiedAnimation(this))},cancel:function(){this._inEffect&&(this._inEffect=!1,this._idle=!0,this._paused=!1,this._isFinished=!0,this._finishedFlag=!0,this._currentTime=0,this._startTime=null,this._effect._update(null),b.applyDirtiedAnimation(this))},reverse:function(){this.playbackRate*=-1,this.play()},addEventListener:function(a,b){"function"==typeof b&&"finish"==a&&this._finishHandlers.push(b)},removeEventListener:function(a,b){if("finish"==a){var c=this._finishHandlers.indexOf(b);c>=0&&this._finishHandlers.splice(c,1)}},_fireEvents:function(a){if(this._isFinished){if(!this._finishedFlag){var b=new d(this,this._currentTime,a),c=this._finishHandlers.concat(this.onfinish?[this.onfinish]:[]);setTimeout(function(){c.forEach(function(a){a.call(b.target,b)})},0),this._finishedFlag=!0}}else this._finishedFlag=!1},_tick:function(a,b){this._idle||this._paused||(null==this._startTime?b&&(this.startTime=a-this._currentTime/this.playbackRate):this._isFinished||this._tickCurrentTime((a-this._startTime)*this.playbackRate)),b&&(this._currentTimePending=!1,this._fireEvents(a))},get _needsTick(){return this.playState in{pending:1,running:1}||!this._finishedFlag},_targetAnimations:function(){var a=this._effect._target;return a._activeAnimations||(a._activeAnimations=[]),a._activeAnimations},_markTarget:function(){var a=this._targetAnimations();-1===a.indexOf(this)&&a.push(this)},_unmarkTarget:function(){var a=this._targetAnimations(),b=a.indexOf(this);-1!==b&&a.splice(b,1)}}}(c,d),function(a,b,c){function d(a){var b=j;j=[],a<q.currentTime&&(a=q.currentTime),q._animations.sort(e),q._animations=h(a,!0,q._animations)[0],b.forEach(function(b){b[1](a)}),g(),l=void 0}function e(a,b){return a._sequenceNumber-b._sequenceNumber}function f(){this._animations=[],this.currentTime=window.performance&&performance.now?performance.now():0}function g(){o.forEach(function(a){a()}),o.length=0}function h(a,c,d){p=!0,n=!1,b.timeline.currentTime=a,m=!1;var e=[],f=[],g=[],h=[];return d.forEach(function(b){b._tick(a,c),b._inEffect?(f.push(b._effect),b._markTarget()):(e.push(b._effect),b._unmarkTarget()),b._needsTick&&(m=!0);var d=b._inEffect||b._needsTick;b._inTimeline=d,d?g.push(b):h.push(b)}),o.push.apply(o,e),o.push.apply(o,f),m&&requestAnimationFrame(function(){}),p=!1,[g,h]}var i=window.requestAnimationFrame,j=[],k=0;window.requestAnimationFrame=function(a){var b=k++;return 0==j.length&&i(d),j.push([b,a]),b},window.cancelAnimationFrame=function(a){j.forEach(function(b){b[0]==a&&(b[1]=function(){})})},f.prototype={_play:function(c){c._timing=a.normalizeTimingInput(c.timing);var d=new b.Animation(c);return d._idle=!1,d._timeline=this,this._animations.push(d),b.restart(),b.applyDirtiedAnimation(d),d}};var l=void 0,m=!1,n=!1;b.restart=function(){return m||(m=!0,requestAnimationFrame(function(){}),n=!0),n},b.applyDirtiedAnimation=function(a){if(!p){a._markTarget();var c=a._targetAnimations();c.sort(e),h(b.timeline.currentTime,!1,c.slice())[1].forEach(function(a){var b=q._animations.indexOf(a);-1!==b&&q._animations.splice(b,1)}),g()}};var o=[],p=!1,q=new f;b.timeline=q}(c,d),function(a){function b(a,b){var c=a.exec(b);if(c)return c=a.ignoreCase?c[0].toLowerCase():c[0],[c,b.substr(c.length)]}function c(a,b){b=b.replace(/^\s*/,"");var c=a(b);if(c)return[c[0],c[1].replace(/^\s*/,"")]}function d(a,d,e){a=c.bind(null,a);for(var f=[];;){var g=a(e);if(!g)return[f,e];if(f.push(g[0]),e=g[1],!(g=b(d,e))||""==g[1])return[f,e];e=g[1]}}function e(a,b){for(var c=0,d=0;d<b.length&&(!/\s|,/.test(b[d])||0!=c);d++)if("("==b[d])c++;else if(")"==b[d]&&(c--,0==c&&d++,c<=0))break;var e=a(b.substr(0,d));return void 0==e?void 0:[e,b.substr(d)]}function f(a,b){for(var c=a,d=b;c&&d;)c>d?c%=d:d%=c;return c=a*b/(c+d)}function g(a){return function(b){var c=a(b);return c&&(c[0]=void 0),c}}function h(a,b){return function(c){return a(c)||[b,c]}}function i(b,c){for(var d=[],e=0;e<b.length;e++){var f=a.consumeTrimmed(b[e],c);if(!f||""==f[0])return;void 0!==f[0]&&d.push(f[0]),c=f[1]}if(""==c)return d}function j(a,b,c,d,e){for(var g=[],h=[],i=[],j=f(d.length,e.length),k=0;k<j;k++){var l=b(d[k%d.length],e[k%e.length]);if(!l)return;g.push(l[0]),h.push(l[1]),i.push(l[2])}return[g,h,function(b){var d=b.map(function(a,b){return i[b](a)}).join(c);return a?a(d):d}]}function k(a,b,c){for(var d=[],e=[],f=[],g=0,h=0;h<c.length;h++)if("function"==typeof c[h]){var i=c[h](a[g],b[g++]);d.push(i[0]),e.push(i[1]),f.push(i[2])}else!function(a){d.push(!1),e.push(!1),f.push(function(){return c[a]})}(h);return[d,e,function(a){for(var b="",c=0;c<a.length;c++)b+=f[c](a[c]);return b}]}a.consumeToken=b,a.consumeTrimmed=c,a.consumeRepeated=d,a.consumeParenthesised=e,a.ignore=g,a.optional=h,a.consumeList=i,a.mergeNestedRepeated=j.bind(null,null),a.mergeWrappedNestedRepeated=j,a.mergeList=k}(d),function(a){function b(b){function c(b){var c=a.consumeToken(/^inset/i,b);if(c)return d.inset=!0,c;var c=a.consumeLengthOrPercent(b);if(c)return d.lengths.push(c[0]),c;var c=a.consumeColor(b);return c?(d.color=c[0],c):void 0}var d={inset:!1,lengths:[],color:null},e=a.consumeRepeated(c,/^/,b);if(e&&e[0].length)return[d,e[1]]}function c(c){var d=a.consumeRepeated(b,/^,/,c);if(d&&""==d[1])return d[0]}function d(b,c){for(;b.lengths.length<Math.max(b.lengths.length,c.lengths.length);)b.lengths.push({px:0});for(;c.lengths.length<Math.max(b.lengths.length,c.lengths.length);)c.lengths.push({px:0});if(b.inset==c.inset&&!!b.color==!!c.color){for(var d,e=[],f=[[],0],g=[[],0],h=0;h<b.lengths.length;h++){var i=a.mergeDimensions(b.lengths[h],c.lengths[h],2==h);f[0].push(i[0]),g[0].push(i[1]),e.push(i[2])}if(b.color&&c.color){var j=a.mergeColors(b.color,c.color);f[1]=j[0],g[1]=j[1],d=j[2]}return[f,g,function(a){for(var c=b.inset?"inset ":" ",f=0;f<e.length;f++)c+=e[f](a[0][f])+" ";return d&&(c+=d(a[1])),c}]}}function e(b,c,d,e){function f(a){return{inset:a,color:[0,0,0,0],lengths:[{px:0},{px:0},{px:0},{px:0}]}}for(var g=[],h=[],i=0;i<d.length||i<e.length;i++){var j=d[i]||f(e[i].inset),k=e[i]||f(d[i].inset);g.push(j),h.push(k)}return a.mergeNestedRepeated(b,c,g,h)}var f=e.bind(null,d,", ");a.addPropertiesHandler(c,f,["box-shadow","text-shadow"])}(d),function(a,b){function c(a){return a.toFixed(3).replace(/0+$/,"").replace(/\.$/,"")}function d(a,b,c){return Math.min(b,Math.max(a,c))}function e(a){if(/^\s*[-+]?(\d*\.)?\d+\s*$/.test(a))return Number(a)}function f(a,b){return[a,b,c]}function g(a,b){if(0!=a)return i(0,1/0)(a,b)}function h(a,b){return[a,b,function(a){return Math.round(d(1,1/0,a))}]}function i(a,b){return function(e,f){return[e,f,function(e){return c(d(a,b,e))}]}}function j(a){var b=a.trim().split(/\s*[\s,]\s*/);if(0!==b.length){for(var c=[],d=0;d<b.length;d++){var f=e(b[d]);if(void 0===f)return;c.push(f)}return c}}function k(a,b){if(a.length==b.length)return[a,b,function(a){return a.map(c).join(" ")}]}function l(a,b){return[a,b,Math.round]}a.clamp=d,a.addPropertiesHandler(j,k,["stroke-dasharray"]),a.addPropertiesHandler(e,i(0,1/0),["border-image-width","line-height"]),a.addPropertiesHandler(e,i(0,1),["opacity","shape-image-threshold"]),a.addPropertiesHandler(e,g,["flex-grow","flex-shrink"]),a.addPropertiesHandler(e,h,["orphans","widows"]),a.addPropertiesHandler(e,l,["z-index"]),a.parseNumber=e,a.parseNumberList=j,a.mergeNumbers=f,a.numberToString=c}(d),function(a,b){function c(a,b){if("visible"==a||"visible"==b)return[0,1,function(c){return c<=0?a:c>=1?b:"visible"}]}a.addPropertiesHandler(String,c,["visibility"])}(d),function(a,b){function c(a){a=a.trim(),f.fillStyle="#000",f.fillStyle=a;var b=f.fillStyle;if(f.fillStyle="#fff",f.fillStyle=a,b==f.fillStyle){f.fillRect(0,0,1,1);var c=f.getImageData(0,0,1,1).data;f.clearRect(0,0,1,1);var d=c[3]/255;return[c[0]*d,c[1]*d,c[2]*d,d]}}function d(b,c){return[b,c,function(b){function c(a){return Math.max(0,Math.min(255,a))}if(b[3])for(var d=0;d<3;d++)b[d]=Math.round(c(b[d]/b[3]));return b[3]=a.numberToString(a.clamp(0,1,b[3])),"rgba("+b.join(",")+")"}]}var e=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");e.width=e.height=1;var f=e.getContext("2d");a.addPropertiesHandler(c,d,["background-color","border-bottom-color","border-left-color","border-right-color","border-top-color","color","fill","flood-color","lighting-color","outline-color","stop-color","stroke","text-decoration-color"]),a.consumeColor=a.consumeParenthesised.bind(null,c),a.mergeColors=d}(d),function(a,b){function c(a){function b(){var b=h.exec(a);g=b?b[0]:void 0}function c(){var a=Number(g);return b(),a}function d(){if("("!==g)return c();b();var a=f();return")"!==g?NaN:(b(),a)}function e(){for(var a=d();"*"===g||"/"===g;){var c=g;b();var e=d();"*"===c?a*=e:a/=e}return a}function f(){for(var a=e();"+"===g||"-"===g;){var c=g;b();var d=e();"+"===c?a+=d:a-=d}return a}var g,h=/([\+\-\w\.]+|[\(\)\*\/])/g;return b(),f()}function d(a,b){if("0"==(b=b.trim().toLowerCase())&&"px".search(a)>=0)return{px:0};if(/^[^(]*$|^calc/.test(b)){b=b.replace(/calc\(/g,"(");var d={};b=b.replace(a,function(a){return d[a]=null,"U"+a});for(var e="U("+a.source+")",f=b.replace(/[-+]?(\d*\.)?\d+([Ee][-+]?\d+)?/g,"N").replace(new RegExp("N"+e,"g"),"D").replace(/\s[+-]\s/g,"O").replace(/\s/g,""),g=[/N\*(D)/g,/(N|D)[*\/]N/g,/(N|D)O\1/g,/\((N|D)\)/g],h=0;h<g.length;)g[h].test(f)?(f=f.replace(g[h],"$1"),h=0):h++;if("D"==f){for(var i in d){var j=c(b.replace(new RegExp("U"+i,"g"),"").replace(new RegExp(e,"g"),"*0"));if(!isFinite(j))return;d[i]=j}return d}}}function e(a,b){return f(a,b,!0)}function f(b,c,d){var e,f=[];for(e in b)f.push(e);for(e in c)f.indexOf(e)<0&&f.push(e);return b=f.map(function(a){return b[a]||0}),c=f.map(function(a){return c[a]||0}),[b,c,function(b){var c=b.map(function(c,e){return 1==b.length&&d&&(c=Math.max(c,0)),a.numberToString(c)+f[e]}).join(" + ");return b.length>1?"calc("+c+")":c}]}var g="px|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc",h=d.bind(null,new RegExp(g,"g")),i=d.bind(null,new RegExp(g+"|%","g")),j=d.bind(null,/deg|rad|grad|turn/g);a.parseLength=h,a.parseLengthOrPercent=i,a.consumeLengthOrPercent=a.consumeParenthesised.bind(null,i),a.parseAngle=j,a.mergeDimensions=f;var k=a.consumeParenthesised.bind(null,h),l=a.consumeRepeated.bind(void 0,k,/^/),m=a.consumeRepeated.bind(void 0,l,/^,/);a.consumeSizePairList=m;var n=function(a){var b=m(a);if(b&&""==b[1])return b[0]},o=a.mergeNestedRepeated.bind(void 0,e," "),p=a.mergeNestedRepeated.bind(void 0,o,",");a.mergeNonNegativeSizePair=o,a.addPropertiesHandler(n,p,["background-size"]),a.addPropertiesHandler(i,e,["border-bottom-width","border-image-width","border-left-width","border-right-width","border-top-width","flex-basis","font-size","height","line-height","max-height","max-width","outline-width","width"]),a.addPropertiesHandler(i,f,["border-bottom-left-radius","border-bottom-right-radius","border-top-left-radius","border-top-right-radius","bottom","left","letter-spacing","margin-bottom","margin-left","margin-right","margin-top","min-height","min-width","outline-offset","padding-bottom","padding-left","padding-right","padding-top","perspective","right","shape-margin","stroke-dashoffset","text-indent","top","vertical-align","word-spacing"])}(d),function(a,b){function c(b){return a.consumeLengthOrPercent(b)||a.consumeToken(/^auto/,b)}function d(b){var d=a.consumeList([a.ignore(a.consumeToken.bind(null,/^rect/)),a.ignore(a.consumeToken.bind(null,/^\(/)),a.consumeRepeated.bind(null,c,/^,/),a.ignore(a.consumeToken.bind(null,/^\)/))],b);if(d&&4==d[0].length)return d[0]}function e(b,c){return"auto"==b||"auto"==c?[!0,!1,function(d){var e=d?b:c;if("auto"==e)return"auto";var f=a.mergeDimensions(e,e);return f[2](f[0])}]:a.mergeDimensions(b,c)}function f(a){return"rect("+a+")"}var g=a.mergeWrappedNestedRepeated.bind(null,f,e,", ");a.parseBox=d,a.mergeBoxes=g,a.addPropertiesHandler(d,g,["clip"])}(d),function(a,b){function c(a){return function(b){var c=0;return a.map(function(a){return a===k?b[c++]:a})}}function d(a){return a}function e(b){if("none"==(b=b.toLowerCase().trim()))return[];for(var c,d=/\s*(\w+)\(([^)]*)\)/g,e=[],f=0;c=d.exec(b);){if(c.index!=f)return;f=c.index+c[0].length;var g=c[1],h=n[g];if(!h)return;var i=c[2].split(","),j=h[0];if(j.length<i.length)return;for(var k=[],o=0;o<j.length;o++){var p,q=i[o],r=j[o];if(void 0===(p=q?{A:function(b){return"0"==b.trim()?m:a.parseAngle(b)},N:a.parseNumber,T:a.parseLengthOrPercent,L:a.parseLength}[r.toUpperCase()](q):{a:m,n:k[0],t:l}[r]))return;k.push(p)}if(e.push({t:g,d:k}),d.lastIndex==b.length)return e}}function f(a){return a.toFixed(6).replace(".000000","")}function g(b,c){if(b.decompositionPair!==c){b.decompositionPair=c;var d=a.makeMatrixDecomposition(b)}if(c.decompositionPair!==b){c.decompositionPair=b;var e=a.makeMatrixDecomposition(c)}return null==d[0]||null==e[0]?[[!1],[!0],function(a){return a?c[0].d:b[0].d}]:(d[0].push(0),e[0].push(1),[d,e,function(b){var c=a.quat(d[0][3],e[0][3],b[5]);return a.composeMatrix(b[0],b[1],b[2],c,b[4]).map(f).join(",")}])}function h(a){return a.replace(/[xy]/,"")}function i(a){return a.replace(/(x|y|z|3d)?$/,"3d")}function j(b,c){var d=a.makeMatrixDecomposition&&!0,e=!1;if(!b.length||!c.length){b.length||(e=!0,b=c,c=[]);for(var f=0;f<b.length;f++){var j=b[f].t,k=b[f].d,l="scale"==j.substr(0,5)?1:0;c.push({t:j,d:k.map(function(a){if("number"==typeof a)return l;var b={};for(var c in a)b[c]=l;return b})})}}var m=function(a,b){return"perspective"==a&&"perspective"==b||("matrix"==a||"matrix3d"==a)&&("matrix"==b||"matrix3d"==b)},o=[],p=[],q=[];if(b.length!=c.length){if(!d)return;var r=g(b,c);o=[r[0]],p=[r[1]],q=[["matrix",[r[2]]]]}else for(var f=0;f<b.length;f++){var j,s=b[f].t,t=c[f].t,u=b[f].d,v=c[f].d,w=n[s],x=n[t];if(m(s,t)){if(!d)return;var r=g([b[f]],[c[f]]);o.push(r[0]),p.push(r[1]),q.push(["matrix",[r[2]]])}else{if(s==t)j=s;else if(w[2]&&x[2]&&h(s)==h(t))j=h(s),u=w[2](u),v=x[2](v);else{if(!w[1]||!x[1]||i(s)!=i(t)){if(!d)return;var r=g(b,c);o=[r[0]],p=[r[1]],q=[["matrix",[r[2]]]];break}j=i(s),u=w[1](u),v=x[1](v)}for(var y=[],z=[],A=[],B=0;B<u.length;B++){var C="number"==typeof u[B]?a.mergeNumbers:a.mergeDimensions,r=C(u[B],v[B]);y[B]=r[0],z[B]=r[1],A.push(r[2])}o.push(y),p.push(z),q.push([j,A])}}if(e){var D=o;o=p,p=D}return[o,p,function(a){return a.map(function(a,b){var c=a.map(function(a,c){return q[b][1][c](a)}).join(",");return"matrix"==q[b][0]&&16==c.split(",").length&&(q[b][0]="matrix3d"),q[b][0]+"("+c+")"}).join(" ")}]}var k=null,l={px:0},m={deg:0},n={matrix:["NNNNNN",[k,k,0,0,k,k,0,0,0,0,1,0,k,k,0,1],d],matrix3d:["NNNNNNNNNNNNNNNN",d],rotate:["A"],rotatex:["A"],rotatey:["A"],rotatez:["A"],rotate3d:["NNNA"],perspective:["L"],scale:["Nn",c([k,k,1]),d],scalex:["N",c([k,1,1]),c([k,1])],scaley:["N",c([1,k,1]),c([1,k])],scalez:["N",c([1,1,k])],scale3d:["NNN",d],skew:["Aa",null,d],skewx:["A",null,c([k,m])],skewy:["A",null,c([m,k])],translate:["Tt",c([k,k,l]),d],translatex:["T",c([k,l,l]),c([k,l])],translatey:["T",c([l,k,l]),c([l,k])],translatez:["L",c([l,l,k])],translate3d:["TTL",d]};a.addPropertiesHandler(e,j,["transform"]),a.transformToSvgMatrix=function(b){var c=a.transformListToMatrix(e(b));return"matrix("+f(c[0])+" "+f(c[1])+" "+f(c[4])+" "+f(c[5])+" "+f(c[12])+" "+f(c[13])+")"}}(d),function(a,b){function c(a,b){b.concat([a]).forEach(function(b){b in document.documentElement.style&&(d[a]=b),e[b]=a})}var d={},e={};c("transform",["webkitTransform","msTransform"]),c("transformOrigin",["webkitTransformOrigin"]),c("perspective",["webkitPerspective"]),c("perspectiveOrigin",["webkitPerspectiveOrigin"]),a.propertyName=function(a){return d[a]||a},a.unprefixedPropertyName=function(a){return e[a]||a}}(d)}(),function(){if(void 0===document.createElement("div").animate([]).oncancel){var a;if(window.performance&&performance.now)var a=function(){return performance.now()};else var a=function(){return Date.now()};var b=function(a,b,c){this.target=a,this.currentTime=b,this.timelineTime=c,this.type="cancel",this.bubbles=!1,this.cancelable=!1,this.currentTarget=a,this.defaultPrevented=!1,this.eventPhase=Event.AT_TARGET,this.timeStamp=Date.now()},c=window.Element.prototype.animate;window.Element.prototype.animate=function(d,e){var f=c.call(this,d,e);f._cancelHandlers=[],f.oncancel=null;var g=f.cancel;f.cancel=function(){g.call(this);var c=new b(this,null,a()),d=this._cancelHandlers.concat(this.oncancel?[this.oncancel]:[]);setTimeout(function(){d.forEach(function(a){a.call(c.target,c)})},0)};var h=f.addEventListener;f.addEventListener=function(a,b){"function"==typeof b&&"cancel"==a?this._cancelHandlers.push(b):h.call(this,a,b)};var i=f.removeEventListener;return f.removeEventListener=function(a,b){if("cancel"==a){var c=this._cancelHandlers.indexOf(b);c>=0&&this._cancelHandlers.splice(c,1)}else i.call(this,a,b)},f}}}(),function(a){var b=document.documentElement,c=null,d=!1;try{var e=getComputedStyle(b).getPropertyValue("opacity"),f="0"==e?"1":"0";c=b.animate({opacity:[f,f]},{duration:1}),c.currentTime=0,d=getComputedStyle(b).getPropertyValue("opacity")==f}catch(a){}finally{c&&c.cancel()}if(!d){var g=window.Element.prototype.animate;window.Element.prototype.animate=function(b,c){return window.Symbol&&Symbol.iterator&&Array.prototype.from&&b[Symbol.iterator]&&(b=Array.from(b)),Array.isArray(b)||null===b||(b=a.convertToArrayForm(b)),g.call(this,b,c)}}}(c),function(a,b,c){function d(a){var c=b.timeline;c.currentTime=a,c._discardAnimations(),0==c._animations.length?f=!1:requestAnimationFrame(d)}var e=window.requestAnimationFrame;window.requestAnimationFrame=function(a){return e(function(c){b.timeline._updateAnimationsPromises(),a(c),b.timeline._updateAnimationsPromises()})},b.AnimationTimeline=function(){this._animations=[],this.currentTime=void 0},b.AnimationTimeline.prototype={getAnimations:function(){return this._discardAnimations(),this._animations.slice()},_updateAnimationsPromises:function(){b.animationsWithPromises=b.animationsWithPromises.filter(function(a){return a._updatePromises()})},_discardAnimations:function(){this._updateAnimationsPromises(),this._animations=this._animations.filter(function(a){return"finished"!=a.playState&&"idle"!=a.playState})},_play:function(a){var c=new b.Animation(a,this);return this._animations.push(c),b.restartWebAnimationsNextTick(),c._updatePromises(),c._animation.play(),c._updatePromises(),c},play:function(a){return a&&a.remove(),this._play(a)}};var f=!1;b.restartWebAnimationsNextTick=function(){f||(f=!0,requestAnimationFrame(d))};var g=new b.AnimationTimeline;b.timeline=g;try{Object.defineProperty(window.document,"timeline",{configurable:!0,get:function(){return g}})}catch(a){}try{window.document.timeline=g}catch(a){}}(0,e),function(a,b,c){b.animationsWithPromises=[],b.Animation=function(b,c){if(this.id="",b&&b._id&&(this.id=b._id),this.effect=b,b&&(b._animation=this),!c)throw new Error("Animation with null timeline is not supported");this._timeline=c,this._sequenceNumber=a.sequenceNumber++,this._holdTime=0,this._paused=!1,this._isGroup=!1,this._animation=null,this._childAnimations=[],this._callback=null,this._oldPlayState="idle",this._rebuildUnderlyingAnimation(),this._animation.cancel(),this._updatePromises()},b.Animation.prototype={_updatePromises:function(){var a=this._oldPlayState,b=this.playState;return this._readyPromise&&b!==a&&("idle"==b?(this._rejectReadyPromise(),this._readyPromise=void 0):"pending"==a?this._resolveReadyPromise():"pending"==b&&(this._readyPromise=void 0)),this._finishedPromise&&b!==a&&("idle"==b?(this._rejectFinishedPromise(),this._finishedPromise=void 0):"finished"==b?this._resolveFinishedPromise():"finished"==a&&(this._finishedPromise=void 0)),this._oldPlayState=this.playState,this._readyPromise||this._finishedPromise},_rebuildUnderlyingAnimation:function(){this._updatePromises();var a,c,d,e,f=!!this._animation;f&&(a=this.playbackRate,c=this._paused,d=this.startTime,e=this.currentTime,this._animation.cancel(),this._animation._wrapper=null,this._animation=null),(!this.effect||this.effect instanceof window.KeyframeEffect)&&(this._animation=b.newUnderlyingAnimationForKeyframeEffect(this.effect),b.bindAnimationForKeyframeEffect(this)),(this.effect instanceof window.SequenceEffect||this.effect instanceof window.GroupEffect)&&(this._animation=b.newUnderlyingAnimationForGroup(this.effect),b.bindAnimationForGroup(this)),this.effect&&this.effect._onsample&&b.bindAnimationForCustomEffect(this),f&&(1!=a&&(this.playbackRate=a),null!==d?this.startTime=d:null!==e?this.currentTime=e:null!==this._holdTime&&(this.currentTime=this._holdTime),c&&this.pause()),this._updatePromises()},_updateChildren:function(){if(this.effect&&"idle"!=this.playState){var a=this.effect._timing.delay;this._childAnimations.forEach(function(c){this._arrangeChildren(c,a),this.effect instanceof window.SequenceEffect&&(a+=b.groupChildDuration(c.effect))}.bind(this))}},_setExternalAnimation:function(a){if(this.effect&&this._isGroup)for(var b=0;b<this.effect.children.length;b++)this.effect.children[b]._animation=a,this._childAnimations[b]._setExternalAnimation(a)},_constructChildAnimations:function(){if(this.effect&&this._isGroup){var a=this.effect._timing.delay;this._removeChildAnimations(),this.effect.children.forEach(function(c){var d=b.timeline._play(c);this._childAnimations.push(d),d.playbackRate=this.playbackRate,this._paused&&d.pause(),c._animation=this.effect._animation,this._arrangeChildren(d,a),this.effect instanceof window.SequenceEffect&&(a+=b.groupChildDuration(c))}.bind(this))}},_arrangeChildren:function(a,b){null===this.startTime?a.currentTime=this.currentTime-b/this.playbackRate:a.startTime!==this.startTime+b/this.playbackRate&&(a.startTime=this.startTime+b/this.playbackRate)},get timeline(){return this._timeline},get playState(){return this._animation?this._animation.playState:"idle"},get finished(){return window.Promise?(this._finishedPromise||(-1==b.animationsWithPromises.indexOf(this)&&b.animationsWithPromises.push(this),this._finishedPromise=new Promise(function(a,b){this._resolveFinishedPromise=function(){a(this)},this._rejectFinishedPromise=function(){b({type:DOMException.ABORT_ERR,name:"AbortError"})}}.bind(this)),"finished"==this.playState&&this._resolveFinishedPromise()),this._finishedPromise):(console.warn("Animation Promises require JavaScript Promise constructor"),null)},get ready(){return window.Promise?(this._readyPromise||(-1==b.animationsWithPromises.indexOf(this)&&b.animationsWithPromises.push(this),this._readyPromise=new Promise(function(a,b){this._resolveReadyPromise=function(){a(this)},this._rejectReadyPromise=function(){b({type:DOMException.ABORT_ERR,name:"AbortError"})}}.bind(this)),"pending"!==this.playState&&this._resolveReadyPromise()),this._readyPromise):(console.warn("Animation Promises require JavaScript Promise constructor"),null)},get onfinish(){return this._animation.onfinish},set onfinish(a){this._animation.onfinish="function"==typeof a?function(b){b.target=this,a.call(this,b)}.bind(this):a},get oncancel(){return this._animation.oncancel},set oncancel(a){this._animation.oncancel="function"==typeof a?function(b){b.target=this,a.call(this,b)}.bind(this):a},get currentTime(){this._updatePromises();var a=this._animation.currentTime;return this._updatePromises(),a},set currentTime(a){this._updatePromises(),this._animation.currentTime=isFinite(a)?a:Math.sign(a)*Number.MAX_VALUE,this._register(),this._forEachChild(function(b,c){b.currentTime=a-c}),this._updatePromises()},get startTime(){return this._animation.startTime},set startTime(a){this._updatePromises(),this._animation.startTime=isFinite(a)?a:Math.sign(a)*Number.MAX_VALUE,this._register(),this._forEachChild(function(b,c){b.startTime=a+c}),this._updatePromises()},get playbackRate(){return this._animation.playbackRate},set playbackRate(a){this._updatePromises();var b=this.currentTime;this._animation.playbackRate=a,this._forEachChild(function(b){b.playbackRate=a}),null!==b&&(this.currentTime=b),this._updatePromises()},play:function(){this._updatePromises(),this._paused=!1,this._animation.play(),-1==this._timeline._animations.indexOf(this)&&this._timeline._animations.push(this),this._register(),b.awaitStartTime(this),this._forEachChild(function(a){var b=a.currentTime;a.play(),a.currentTime=b}),this._updatePromises()},pause:function(){this._updatePromises(),this.currentTime&&(this._holdTime=this.currentTime),this._animation.pause(),this._register(),this._forEachChild(function(a){a.pause()}),this._paused=!0,this._updatePromises()},finish:function(){this._updatePromises(),this._animation.finish(),this._register(),this._updatePromises()},cancel:function(){this._updatePromises(),this._animation.cancel(),this._register(),this._removeChildAnimations(),this._updatePromises()},reverse:function(){this._updatePromises();var a=this.currentTime;this._animation.reverse(),this._forEachChild(function(a){a.reverse()}),null!==a&&(this.currentTime=a),this._updatePromises()},addEventListener:function(a,b){var c=b;"function"==typeof b&&(c=function(a){a.target=this,b.call(this,a)}.bind(this),b._wrapper=c),this._animation.addEventListener(a,c)},removeEventListener:function(a,b){this._animation.removeEventListener(a,b&&b._wrapper||b)},_removeChildAnimations:function(){for(;this._childAnimations.length;)this._childAnimations.pop().cancel()},_forEachChild:function(b){var c=0;if(this.effect.children&&this._childAnimations.length<this.effect.children.length&&this._constructChildAnimations(),this._childAnimations.forEach(function(a){b.call(this,a,c),this.effect instanceof window.SequenceEffect&&(c+=a.effect.activeDuration)}.bind(this)),"pending"!=this.playState){var d=this.effect._timing,e=this.currentTime;null!==e&&(e=a.calculateIterationProgress(a.calculateActiveDuration(d),e,d)),(null==e||isNaN(e))&&this._removeChildAnimations()}}},window.Animation=b.Animation}(c,e),function(a,b,c){function d(b){this._frames=a.normalizeKeyframes(b)}function e(){for(var a=!1;i.length;)i.shift()._updateChildren(),a=!0;return a}var f=function(a){if(a._animation=void 0,a instanceof window.SequenceEffect||a instanceof window.GroupEffect)for(var b=0;b<a.children.length;b++)f(a.children[b])};b.removeMulti=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c];d._parent?(-1==b.indexOf(d._parent)&&b.push(d._parent),d._parent.children.splice(d._parent.children.indexOf(d),1),d._parent=null,f(d)):d._animation&&d._animation.effect==d&&(d._animation.cancel(),d._animation.effect=new KeyframeEffect(null,[]),d._animation._callback&&(d._animation._callback._animation=null),d._animation._rebuildUnderlyingAnimation(),f(d))}for(c=0;c<b.length;c++)b[c]._rebuild()},b.KeyframeEffect=function(b,c,e,f){return this.target=b,this._parent=null,e=a.numericTimingToObject(e),this._timingInput=a.cloneTimingInput(e),this._timing=a.normalizeTimingInput(e),this.timing=a.makeTiming(e,!1,this),this.timing._effect=this,"function"==typeof c?(a.deprecated("Custom KeyframeEffect","2015-06-22","Use KeyframeEffect.onsample instead."),this._normalizedKeyframes=c):this._normalizedKeyframes=new d(c),this._keyframes=c,this.activeDuration=a.calculateActiveDuration(this._timing),this._id=f,this},b.KeyframeEffect.prototype={getFrames:function(){return"function"==typeof this._normalizedKeyframes?this._normalizedKeyframes:this._normalizedKeyframes._frames},set onsample(a){if("function"==typeof this.getFrames())throw new Error("Setting onsample on custom effect KeyframeEffect is not supported.");this._onsample=a,this._animation&&this._animation._rebuildUnderlyingAnimation()},get parent(){return this._parent},clone:function(){if("function"==typeof this.getFrames())throw new Error("Cloning custom effects is not supported.");var b=new KeyframeEffect(this.target,[],a.cloneTimingInput(this._timingInput),this._id);return b._normalizedKeyframes=this._normalizedKeyframes,b._keyframes=this._keyframes,b},remove:function(){b.removeMulti([this])}};var g=Element.prototype.animate;Element.prototype.animate=function(a,c){var d="";return c&&c.id&&(d=c.id),b.timeline._play(new b.KeyframeEffect(this,a,c,d))};var h=document.createElementNS("http://www.w3.org/1999/xhtml","div");b.newUnderlyingAnimationForKeyframeEffect=function(a){if(a){var b=a.target||h,c=a._keyframes;"function"==typeof c&&(c=[]);var d=a._timingInput;d.id=a._id}else var b=h,c=[],d=0;return g.apply(b,[c,d])},b.bindAnimationForKeyframeEffect=function(a){a.effect&&"function"==typeof a.effect._normalizedKeyframes&&b.bindAnimationForCustomEffect(a)};var i=[];b.awaitStartTime=function(a){null===a.startTime&&a._isGroup&&(0==i.length&&requestAnimationFrame(e),i.push(a))};var j=window.getComputedStyle;Object.defineProperty(window,"getComputedStyle",{configurable:!0,enumerable:!0,value:function(){b.timeline._updateAnimationsPromises();var a=j.apply(this,arguments);return e()&&(a=j.apply(this,arguments)),b.timeline._updateAnimationsPromises(),a}}),window.KeyframeEffect=b.KeyframeEffect,window.Element.prototype.getAnimations=function(){return document.timeline.getAnimations().filter(function(a){return null!==a.effect&&a.effect.target==this}.bind(this))}}(c,e),function(a,b,c){function d(a){a._registered||(a._registered=!0,g.push(a),h||(h=!0,requestAnimationFrame(e)))}function e(a){var b=g;g=[],b.sort(function(a,b){return a._sequenceNumber-b._sequenceNumber}),b=b.filter(function(a){a();var b=a._animation?a._animation.playState:"idle";return"running"!=b&&"pending"!=b&&(a._registered=!1),a._registered}),g.push.apply(g,b),g.length?(h=!0,requestAnimationFrame(e)):h=!1}var f=(document.createElementNS("http://www.w3.org/1999/xhtml","div"),0);b.bindAnimationForCustomEffect=function(b){var c,e=b.effect.target,g="function"==typeof b.effect.getFrames();c=g?b.effect.getFrames():b.effect._onsample;var h=b.effect.timing,i=null;h=a.normalizeTimingInput(h);var j=function(){var d=j._animation?j._animation.currentTime:null;null!==d&&(d=a.calculateIterationProgress(a.calculateActiveDuration(h),d,h),isNaN(d)&&(d=null)),d!==i&&(g?c(d,e,b.effect):c(d,b.effect,b.effect._animation)),i=d};j._animation=b,j._registered=!1,j._sequenceNumber=f++,b._callback=j,d(j)};var g=[],h=!1;b.Animation.prototype._register=function(){this._callback&&d(this._callback)}}(c,e),function(a,b,c){function d(a){return a._timing.delay+a.activeDuration+a._timing.endDelay}function e(b,c,d){this._id=d,this._parent=null,this.children=b||[],this._reparent(this.children),c=a.numericTimingToObject(c),this._timingInput=a.cloneTimingInput(c),this._timing=a.normalizeTimingInput(c,!0),this.timing=a.makeTiming(c,!0,this),this.timing._effect=this,"auto"===this._timing.duration&&(this._timing.duration=this.activeDuration)}window.SequenceEffect=function(){e.apply(this,arguments)},window.GroupEffect=function(){e.apply(this,arguments)},e.prototype={_isAncestor:function(a){for(var b=this;null!==b;){if(b==a)return!0;b=b._parent}return!1},_rebuild:function(){for(var a=this;a;)"auto"===a.timing.duration&&(a._timing.duration=a.activeDuration),a=a._parent;this._animation&&this._animation._rebuildUnderlyingAnimation()},_reparent:function(a){b.removeMulti(a);for(var c=0;c<a.length;c++)a[c]._parent=this},_putChild:function(a,b){for(var c=b?"Cannot append an ancestor or self":"Cannot prepend an ancestor or self",d=0;d<a.length;d++)if(this._isAncestor(a[d]))throw{type:DOMException.HIERARCHY_REQUEST_ERR,name:"HierarchyRequestError",message:c};for(var d=0;d<a.length;d++)b?this.children.push(a[d]):this.children.unshift(a[d]);this._reparent(a),this._rebuild()},append:function(){this._putChild(arguments,!0)},prepend:function(){this._putChild(arguments,!1)},get parent(){return this._parent},get firstChild(){return this.children.length?this.children[0]:null},get lastChild(){return this.children.length?this.children[this.children.length-1]:null},clone:function(){for(var b=a.cloneTimingInput(this._timingInput),c=[],d=0;d<this.children.length;d++)c.push(this.children[d].clone());return this instanceof GroupEffect?new GroupEffect(c,b):new SequenceEffect(c,b)},remove:function(){b.removeMulti([this])}},window.SequenceEffect.prototype=Object.create(e.prototype),Object.defineProperty(window.SequenceEffect.prototype,"activeDuration",{get:function(){var a=0;return this.children.forEach(function(b){a+=d(b)}),Math.max(a,0)}}),window.GroupEffect.prototype=Object.create(e.prototype),Object.defineProperty(window.GroupEffect.prototype,"activeDuration",{get:function(){var a=0;return this.children.forEach(function(b){a=Math.max(a,d(b))}),a}}),b.newUnderlyingAnimationForGroup=function(c){var d,e=null,f=function(b){var c=d._wrapper;if(c&&"pending"!=c.playState&&c.effect)return null==b?void c._removeChildAnimations():0==b&&c.playbackRate<0&&(e||(e=a.normalizeTimingInput(c.effect.timing)),b=a.calculateIterationProgress(a.calculateActiveDuration(e),-1,e),isNaN(b)||null==b)?(c._forEachChild(function(a){a.currentTime=-1}),void c._removeChildAnimations()):void 0},g=new KeyframeEffect(null,[],c._timing,c._id);return g.onsample=f,d=b.timeline._play(g)},b.bindAnimationForGroup=function(a){a._animation._wrapper=a,a._isGroup=!0,b.awaitStartTime(a),a._constructChildAnimations(),a._setExternalAnimation(a)},b.groupChildDuration=d}(c,e),b.true=a}({},function(){return this}());
+//# sourceMappingURL=web-animations-next-lite.min.js.map \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next-lite.min.js.map b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next-lite.min.js.map
new file mode 100644
index 00000000000..2234d48221d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next-lite.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["src/scope.js","src/timing-utilities.js","src/normalize-keyframes.js","src/deprecation.js","src/web-animations-bonus-cancel-events.js","src/web-animations-bonus-object-form-keyframes.js","src/timeline.js","src/web-animations-next-animation.js","src/keyframe-effect-constructor.js","src/effect-callback.js","src/group-constructors.js"],"names":["webAnimationsShared","webAnimations1","webAnimationsNext","shared","testing","cloneTimingInput","timingInput","clone","m","AnimationEffectTiming","this","_delay","_endDelay","_fill","_iterationStart","_iterations","_duration","_playbackRate","_direction","_easing","_easingFunction","linear","isInvalidTimingDeprecated","isDeprecated","makeTiming","forGroup","effect","timing","fill","duration","isNaN","Object","getOwnPropertyNames","forEach","property","fills","indexOf","directions","numericTimingToObject","normalizeTimingInput","cubic","a","b","c","d","x","f","start_gradient","end_gradient","start","end","mid","xEst","Math","abs","step","count","pos","stepSize","normalizeEasing","easing","styleForCleaning","document","createElement","style","animationTimingFunction","normalizedEasing","TypeError","parseEasingFunction","cubicData","cubicBezierRe","exec","apply","slice","map","Number","stepData","stepRe","Start","middle","Middle","End","presets","calculateActiveDuration","repeatedDuration","playbackRate","iterations","calculatePhase","activeDuration","localTime","PhaseNone","endTime","delay","endDelay","min","PhaseBefore","PhaseAfter","PhaseActive","calculateActiveTime","fillMode","phase","calculateOverallProgress","iterationDuration","activeTime","iterationStart","overallProgress","calculateSimpleIterationProgress","simpleIterationProgress","Infinity","calculateCurrentIteration","floor","calculateDirectedProgress","playbackDirection","currentIteration","currentDirection","calculateIterationProgress","directedProgress","direction","split","prototype","_setMember","member","value","_effect","_timingInput","_timing","_animation","_rebuildUnderlyingAnimation","ease","ease-in","ease-out","ease-in-out","step-start","step-middle","step-end","numberString","RegExp","antiAlias","aliases","isNotAnimatable","lastIndexOf","expandShorthandAndAntiAlias","result","longProperties","shorthandToLonghand","shorthandExpanderElem","i","longProperty","longhandValue","convertToArrayForm","effectInput","normalizedEffectInput","values","Array","isArray","keyframe","numKeyframes","length","offset","composite","push","sort","normalizeKeyframes","spaceKeyframes","keyframes","previousIndex","previousOffset","j","window","Symbol","iterator","from","originalKeyframe","memberValue","isFinite","type","DOMException","NOT_SUPPORTED_ERR","name","message","everyFrameHasOffset","filter","background","border","borderBottom","borderColor","borderLeft","borderRadius","borderRight","borderTop","borderWidth","flex","font","margin","outline","padding","createElementNS","borderWidthAliases","thin","medium","thick","borderBottomWidth","borderLeftWidth","borderRightWidth","borderTopWidth","fontSize","xx-small","x-small","small","large","x-large","xx-large","fontWeight","normal","bold","outlineWidth","textShadow","none","boxShadow","silenced","feature","date","advice","plural","auxVerb","today","Date","expiry","setMonth","getMonth","console","warn","toDateString","deprecated","Error","animate","oncancel","now","performance","AnimationCancelEvent","target","currentTime","timelineTime","bubbles","cancelable","currentTarget","defaultPrevented","eventPhase","Event","AT_TARGET","timeStamp","originalElementAnimate","Element","options","animation","call","_cancelHandlers","originalCancel","cancel","event","handlers","concat","setTimeout","handler","originalAddEventListener","addEventListener","originalRemoveEventListener","removeEventListener","index","splice","element","documentElement","animated","originalOpacity","getComputedStyle","getPropertyValue","testOpacity","opacity","error","scope","webAnimationsNextTick","t","timeline","_discardAnimations","_animations","ticking","requestAnimationFrame","originalRequestAnimationFrame","_updateAnimationsPromises","AnimationTimeline","getAnimations","animationsWithPromises","_updatePromises","playState","_play","Animation","restartWebAnimationsNextTick","play","remove","defineProperty","configurable","get","e","id","_id","_timeline","_sequenceNumber","sequenceNumber","_holdTime","_paused","_isGroup","_childAnimations","_callback","_oldPlayState","oldPlayState","newPlayState","_readyPromise","_rejectReadyPromise","_resolveReadyPromise","_finishedPromise","_rejectFinishedPromise","_resolveFinishedPromise","oldPlaybackRate","oldPaused","oldStartTime","oldCurrentTime","hadUnderlying","startTime","_wrapper","KeyframeEffect","newUnderlyingAnimationForKeyframeEffect","bindAnimationForKeyframeEffect","SequenceEffect","GroupEffect","newUnderlyingAnimationForGroup","bindAnimationForGroup","_onsample","bindAnimationForCustomEffect","pause","_updateChildren","childAnimation","_arrangeChildren","groupChildDuration","bind","_setExternalAnimation","children","_constructChildAnimations","_removeChildAnimations","child","finished","Promise","resolve","reject","ABORT_ERR","ready","onfinish","v","sign","MAX_VALUE","_register","_forEachChild","awaitStartTime","time","finish","reverse","wrapped","pop","KeyframeList","_frames","updatePendingGroups","updated","pendingGroups","shift","disassociate","removeMulti","effects","oldParents","_parent","_rebuild","_normalizedKeyframes","_keyframes","getFrames","onsample","callback","parent","nullTarget","keyframeEffect","groupAnimation","originalGetComputedStyle","enumerable","arguments","register","_registered","callbacks","tick","updating","left","right","effectFunction","isKeyframeEffect","last","node","constructor","_reparent","_isAncestor","newChildren","_putChild","args","isAppend","HIERARCHY_REQUEST_ERR","unshift","append","prepend","firstChild","lastChild","clonedTiming","clonedChildren","create","total","max","group","underlyingAnimation","ticker","tf","underlyingEffect","exports","webAnimationsTesting"],"mappings":";;;;;;;;;;;;;;CAcA,SAAIA,EAAAA,GAAJ,GAAIA,MACAC,KACAC,MCFJ,SAAUC,EAAQC,GAMhB,QAASC,GAAiBC,GACxB,GAA0B,gBAAfA,GACT,MAAOA,EAET,IAAIC,KACJ,KAAK,GAAIC,KAAKF,GACZC,EAAMC,GAAKF,EAAYE,EAEzB,OAAOD,GAGT,QAASE,KACPC,KAAKC,OAAS,EACdD,KAAKE,UAAY,EACjBF,KAAKG,MAAQ,OACbH,KAAKI,gBAAkB,EACvBJ,KAAKK,YAAc,EACnBL,KAAKM,UAAY,EACjBN,KAAKO,cAAgB,EACrBP,KAAKQ,WAAa,SAClBR,KAAKS,QAAU,SACfT,KAAKU,gBAAkBC,EAGzB,QAASC,KACP,MAAOnB,GAAOoB,aAAa,wBAAyB,aAAc,gDAAA,GA8EpE,QAASC,GAAWlB,EAAamB,EAAUC,GACzC,GAAIC,GAAS,GAAIlB,EA4BjB,OA3BIgB,KACFE,EAAOC,KAAO,OACdD,EAAOE,SAAW,QAEM,gBAAfvB,IAA4BwB,MAAMxB,OAAAA,KAElCA,GACTyB,OAAOC,oBAAoB1B,GAAa2B,QAAQ,SAASC,GACvD,GAA6B,QAAzB5B,EAAY4B,GAAqB,CACnC,IAA+B,gBAApBP,GAAOO,IAAqC,YAAZA,KACL,gBAAzB5B,GAAY4B,IAAyBJ,MAAMxB,EAAY4B,KAChE,MAGJ,IAAiB,QAAZA,IAAiE,GAAzCC,EAAMC,QAAQ9B,EAAY4B,IACrD,MAEF,IAAiB,aAAZA,IAA2E,GAA9CG,EAAWD,QAAQ9B,EAAY4B,IAC/D,MAEF,IAAgB,gBAAZA,GAAwD,IAA1B5B,EAAY4B,IAAmB/B,EAAOoB,aAAa,qCAAsC,aAAc,uCACvI,MAEFI,GAAOO,GAAY5B,EAAY4B,MAlBnCP,EAAOE,SAAWvB,EAsBbqB,EAGT,QAASW,GAAsBhC,GAQ7B,MAP0B,gBAAfA,KAEPA,EADEwB,MAAMxB,IACQuB,SAAU,IAEVA,SAAUvB,IAGvBA,EAGT,QAASiC,GAAqBjC,EAAamB,GAEzC,MADAnB,GAAcH,EAAOmC,sBAAsBhC,GACpCkB,EAAWlB,EAAamB,GAGjC,QAASe,GAAMC,EAAGC,EAAGC,EAAGC,GACtB,MAAIH,GAAI,GAAKA,EAAI,GAAKE,EAAI,GAAKA,EAAI,EAC1BtB,EAEF,SAASwB,GAqBZ,QAASC,GAAEL,EAAGC,EAAGlC,GAAK,MAAO,GAAIiC,GAAK,EAAIjC,IAAM,EAAIA,GAAKA,EAAI,EAAIkC,GAAK,EAAIlC,GAAKA,EAAIA,EAAIA,EAAIA,EAAIA,EApBjG,GAAIqC,GAAK,EAAG,CACV,GAAIE,GAAiB,CAKrB,OAJIN,GAAI,EACNM,EAAiBL,EAAID,GACbC,GAAKC,EAAI,IACjBI,EAAiBH,EAAID,GAChBI,EAAiBF,EAE1B,GAAIA,GAAK,EAAG,CACV,GAAIG,GAAe,CAKnB,OAJIL,GAAI,EACNK,GAAgBJ,EAAI,IAAMD,EAAI,GAClB,GAALA,GAAUF,EAAI,IACrBO,GAAgBN,EAAI,IAAMD,EAAI,IACzB,EAAIO,GAAgBH,EAAI,GAIjC,IADA,GAAII,GAAQ,EAAGC,EAAM,EACdD,EAAQC,GAAK,CAClB,GAAIC,IAAOF,EAAQC,GAAO,EAEtBE,EAAON,EAAEL,EAAGE,EAAGQ,EACnB,IAAIE,KAAKC,IAAIT,EAAIO,GAAQ,KACvB,MAAON,GAAEJ,EAAGE,EAAGO,EAEbC,GAAOP,EACTI,EAAQE,EAERD,EAAMC,EAGV,MAAOL,GAAEJ,EAAGE,EAAGO,IAQnB,QAASI,GAAKC,EAAOC,GACnB,MAAO,UAASZ,GACd,GAAIA,GAAK,EACP,MAAO,EAET,IAAIa,GAAW,EAAIF,CAEnB,QADAX,GAAKY,EAAMC,GACAb,EAAIa,GAmBnB,QAASC,GAAgBC,GAClBC,IACHA,EAAmBC,SAASC,cAAc,OAAOC,OAEnDH,EAAiBI,wBAA0B,GAC3CJ,EAAiBI,wBAA0BL,CAC3C,IAAIM,GAAmBL,EAAiBI,uBACxC,IAAwB,IAApBC,GAA0B5C,IAC5B,KAAM,IAAI6C,WAAUP,EAAS,mCAE/B,OAAOM,GAGT,QAASE,GAAoBF,GAC3B,GAAwB,UAApBA,EACF,MAAO7C,EAET,IAAIgD,GAAYC,EAAcC,KAAKL,EACnC,IAAIG,EACF,MAAO7B,GAAMgC,MAAM9D,KAAM2D,EAAUI,MAAM,GAAGC,IAAIC,QAElD,IAAIC,GAAWC,EAAON,KAAKL,EAC3B,OAAIU,GACKrB,EAAKoB,OAAOC,EAAS,KAAM3B,MAAS6B,EAAOC,OAAUC,EAAQ9B,IAAO+B,GAAKL,EAAS,KAE9EM,EAAQhB,IAMd7C,EAGT,QAAS8D,GAAwBxD,GAC/B,MAAO0B,MAAKC,IAAI8B,EAAiBzD,GAAUA,EAAO0D,cAGpD,QAASD,GAAiBzD,GAExB,MAAwB,KAApBA,EAAOE,UAAwC,IAAtBF,EAAO2D,WAC3B,EAEF3D,EAAOE,SAAWF,EAAO2D,WAQlC,QAASC,GAAeC,EAAgBC,EAAW9D,GAEjD,GAAiB,MAAb8D,EACF,MAAOC,EAGT,IAAIC,GAAUhE,EAAOiE,MAAQJ,EAAiB7D,EAAOkE,QACrD,OAAIJ,GAAYpC,KAAKyC,IAAInE,EAAOiE,MAAOD,GAC9BI,EAELN,GAAapC,KAAKyC,IAAInE,EAAOiE,MAAQJ,EAAgBG,GAChDK,EAGFC,EAGT,QAASC,GAAoBV,EAAgBW,EAAUV,EAAWW,EAAOR,GAEvE,OAAQQ,GACN,IAAKL,GACH,MAAgB,aAAZI,GAAuC,QAAZA,EACtB,EACF,IACT,KAAKF,GACH,MAAOR,GAAYG,CACrB,KAAKI,GACH,MAAgB,YAAZG,GAAsC,QAAZA,EACrBX,EACF,IACT,KAAKE,GACH,MAAO,OAIb,QAASW,GAAyBC,EAAmBF,EAAOd,EAAYiB,EAAYC,GAElF,GAAIC,GAAkBD,CAQtB,OAP0B,KAAtBF,EACEF,IAAUL,IACZU,GAAmBnB,GAGrBmB,GAAmBF,EAAaD,EAE3BG,EAGT,QAASC,GAAiCD,EAAiBD,EAAgBJ,EAAOd,EAAYiB,EAAYD,GAGxG,GAAIK,GAA2BF,IAAoBG,EAAAA,EAAYJ,EAAiB,EAAIC,EAAkB,CAKtG,OAJgC,KAA5BE,GAAiCP,IAAUJ,GAA6B,IAAfV,GACzC,IAAfiB,GAA0C,IAAtBD,IACvBK,EAA0B,GAErBA,EAGT,QAASE,GAA0BT,EAAOd,EAAYqB,EAAyBF,GAE7E,MAAIL,KAAUJ,GAAcV,IAAesB,EAAAA,EAClCA,EAAAA,EAEuB,IAA5BD,EACKtD,KAAKyD,MAAML,GAAmB,EAEhCpD,KAAKyD,MAAML,GAGpB,QAASM,GAA0BC,EAAmBC,EAAkBN,GAEtE,GAAIO,GAAmBF,CACvB,IAA0B,WAAtBA,GAAwD,YAAtBA,EAAiC,CACrE,GAAIpE,GAAIqE,CACkB,uBAAtBD,IACFpE,GAAK,GAEPsE,EAAmB,SACftE,IAAMgE,EAAAA,GAAYhE,EAAI,GAAM,IAC9BsE,EAAmB,WAGvB,MAAyB,WAArBA,EACKP,EAEF,EAAIA,EAGb,QAASQ,GAA2B3B,EAAgBC,EAAW9D,GAC7D,GAAIyE,GAAQb,EAAeC,EAAgBC,EAAW9D,GAClD4E,EAAaL,EAAoBV,EAAgB7D,EAAOC,KAAM6D,EAAWW,EAAOzE,EAAOiE,MAC3F,IAAmB,OAAfW,EACF,MAAO,KAET,IAAIE,GAAkBJ,EAAyB1E,EAAOE,SAAUuE,EAAOzE,EAAO2D,WAAYiB,EAAY5E,EAAO6E,gBACzGG,EAA0BD,EAAiCD,EAAiB9E,EAAO6E,eAAgBJ,EAAOzE,EAAO2D,WAAYiB,EAAY5E,EAAOE,UAChJoF,EAAmBJ,EAA0BT,EAAOzE,EAAO2D,WAAYqB,EAAyBF,GAChGW,EAAmBL,EAA0BpF,EAAO0F,UAAWJ,EAAkBN,EAIrF,OAAOhF,GAAOP,gBAAgBgG,GA1XhC,GAAIjF,GAAQ,+BAA+BmF,MAAM,KAC7CjF,EAAa,sCAAsCiF,MAAM,KACzDjG,EAAS,SAASwB,GAAK,MAAOA,GA8BlCpC,GAAsB8G,WACpBC,WAAY,SAASC,EAAQC,GAC3BhH,KAAK,IAAM+G,GAAUC,EACjBhH,KAAKiH,UACPjH,KAAKiH,QAAQC,aAAaH,GAAUC,EACpChH,KAAKiH,QAAQE,QAAU1H,EAAOoC,qBAAqB7B,KAAKiH,QAAQC,cAChElH,KAAKiH,QAAQnC,eAAiBrF,EAAOgF,wBAAwBzE,KAAKiH,QAAQE,SACtEnH,KAAKiH,QAAQG,YACfpH,KAAKiH,QAAQG,WAAWC,gCAI9B1C,mBACE,MAAO3E,MAAKO,eAEd2E,UAAU8B,GACRhH,KAAK8G,WAAW,QAASE,IAE3B9B,YACE,MAAOlF,MAAKC,QAEdkF,aAAa6B,GACXhH,KAAK8G,WAAW,WAAYE,IAE9B7B,eACE,MAAOnF,MAAKE,WAEdgB,SAAS8F,GACPhH,KAAK8G,WAAW,OAAQE,IAE1B9F,WACE,MAAOlB,MAAKG,OAEd2F,mBAAmBkB,GACjB,IAAK5F,MAAM4F,IAAUA,EAAQ,IAAMpG,IACjC,KAAM,IAAI6C,WAAU,2DAA6DxC,OAAO6E,eAE1F9F,MAAK8G,WAAW,iBAAkBE,IAEpClB,qBACE,MAAO9F,MAAKI,iBAEde,aAAa6F,GACX,GAAa,QAATA,IAAoB5F,MAAM4F,IAAUA,EAAQ,IAAMpG,IACpD,KAAM,IAAI6C,WAAU,oDAAsDuD,EAE5EhH,MAAK8G,WAAW,WAAYE,IAE9B7F,eACE,MAAOnB,MAAKM,WAEdqG,cAAcK,GACZhH,KAAK8G,WAAW,YAAaE,IAE/BL,gBACE,MAAO3G,MAAKQ,YAEd0C,WAAW8D,GACThH,KAAKU,gBAAkBgD,EAAoBT,EAAgB+D,IAC3DhH,KAAK8G,WAAW,SAAUE,IAE5B9D,aACE,MAAOlD,MAAKS,SAEdmE,eAAeoC,GACb,IAAK5F,MAAM4F,IAAUA,EAAQ,IAAMpG,IACjC,KAAM,IAAI6C,WAAU,8CAAgDuD,EAEtEhH,MAAK8G,WAAW,aAAcE,IAEhCpC,iBACE,MAAO5E,MAAKK,aA4FhB,IAAI+D,GAAQ,EACRE,EAAS,GACTC,EAAM,EAaNC,GACF8C,KAAQxF,EAAM,IAAM,GAAK,IAAM,GAC/ByF,UAAWzF,EAAM,IAAM,EAAG,EAAG,GAC7B0F,WAAY1F,EAAM,EAAG,EAAG,IAAM,GAC9B2F,cAAe3F,EAAM,IAAM,EAAG,IAAM,GACpC4F,aAAc7E,EAAK,EAAGuB,GACtBuD,cAAe9E,EAAK,EAAGyB,GACvBsD,WAAY/E,EAAK,EAAG0B,IAGlBpB,EAAmB,KACnB0E,EAAe,qCACfjE,EAAgB,GAAIkE,QAAO,kBAAoBD,EAAe,IAAMA,EAAe,IAAMA,EAAe,IAAMA,EAAe,OAC7H1D,EAAS,gDAgDTa,EAAY,EACZK,EAAc,EACdC,EAAa,EACbC,EAAc,CA2GlB9F,GAAOE,iBAAmBA,EAC1BF,EAAOqB,WAAaA,EACpBrB,EAAOmC,sBAAwBA,EAC/BnC,EAAOoC,qBAAuBA,EAC9BpC,EAAOgF,wBAA0BA,EACjChF,EAAOgH,2BAA6BA,EACpChH,EAAOoF,eAAiBA,EACxBpF,EAAOwD,gBAAkBA,EACzBxD,EAAOiE,oBAAsBA,GAc5BpE,GCrZH,SAAUG,EAAQC,GAmIhB,QAASqI,GAAUvG,EAAUwF,GAC3B,MAAIxF,KAAYwG,GACPA,EAAQxG,GAAUwF,IAAUA,EAE9BA,EAGT,QAASiB,GAAgBzG,GAEvB,MAAoB,YAAbA,GAAmE,IAAzCA,EAAS0G,YAAY,YAAa,IAAsD,IAA1C1G,EAAS0G,YAAY,aAAc,GAIpH,QAASC,GAA4B3G,EAAUwF,EAAOoB,GACpD,IAAIH,EAAgBzG,GAApB,CAGA,GAAI6G,GAAiBC,EAAoB9G,EACzC,IAAI6G,EAAgB,CAClBE,EAAsBjF,MAAM9B,GAAYwF,CACxC,KAAK,GAAIwB,KAAKH,GAAgB,CAC5B,GAAII,GAAeJ,EAAeG,GAC9BE,EAAgBH,EAAsBjF,MAAMmF,EAChDL,GAAOK,GAAgBV,EAAUU,EAAcC,QAGjDN,GAAO5G,GAAYuG,EAAUvG,EAAUwF,IAI3C,QAAS2B,GAAmBC,GAC1B,GAAIC,KAEJ,KAAK,GAAIrH,KAAYoH,GACnB,KAAIpH,KAAa,SAAU,SAAU,cAArC,CAIA,GAAIsH,GAASF,EAAYpH,EACpBuH,OAAMC,QAAQF,KACjBA,GAAUA,GAKZ,KAAK,GAFDG,GACAC,EAAeJ,EAAOK,OACjBX,EAAI,EAAGA,EAAIU,EAAcV,IAChCS,KAGEA,EAASG,OADP,UAAYR,GACIA,EAAYQ,OACL,GAAhBF,EACS,EAEAV,GAAKU,EAAe,GAGpC,UAAYN,KACdK,EAAS/F,OAAS0F,EAAY1F,QAG5B,aAAe0F,KACjBK,EAASI,UAAYT,EAAYS,WAGnCJ,EAASzH,GAAYsH,EAAON,GAE5BK,EAAsBS,KAAKL,GAK/B,MADAJ,GAAsBU,KAAK,SAASxH,EAAGC,GAAK,MAAOD,GAAEqH,OAASpH,EAAEoH,SACzDP,EAGT,QAASW,GAAmBZ,GAqE1B,QAASa,KACP,GAAIN,GAASO,EAAUP,MACa,OAAhCO,EAAUP,EAAS,GAAGC,SACxBM,EAAUP,EAAS,GAAGC,OAAS,GAC7BD,EAAS,GAA4B,MAAvBO,EAAU,GAAGN,SAC7BM,EAAU,GAAGN,OAAS,EAIxB,KAAK,GAFDO,GAAgB,EAChBC,EAAiBF,EAAU,GAAGN,OACzBZ,EAAI,EAAGA,EAAIW,EAAQX,IAAK,CAC/B,GAAIY,GAASM,EAAUlB,GAAGY,MAC1B,IAAc,MAAVA,EAAgB,CAClB,IAAK,GAAIS,GAAI,EAAGA,EAAIrB,EAAImB,EAAeE,IACrCH,EAAUC,EAAgBE,GAAGT,OAASQ,GAAkBR,EAASQ,GAAkBC,GAAKrB,EAAImB,EAC9FA,GAAgBnB,EAChBoB,EAAiBR,IAnFvB,GAAmB,MAAfR,EACF,QAGEkB,QAAOC,QAAUA,OAAOC,UAAYjB,MAAMlC,UAAUoD,MAAQrB,EAAYmB,OAAOC,YAEjFpB,EAAcG,MAAMkB,KAAKrB,IAGtBG,MAAMC,QAAQJ,KACjBA,EAAcD,EAAmBC,GA0CnC,KAAK,GAvCDc,GAAYd,EAAY5E,IAAI,SAASkG,GACvC,GAAIjB,KACJ,KAAK,GAAIlC,KAAUmD,GAAkB,CACnC,GAAIC,GAAcD,EAAiBnD,EACnC,IAAc,UAAVA,GACF,GAAmB,MAAfoD,EAAqB,CAEvB,GADAA,EAAclG,OAAOkG,IAChBC,SAASD,GACZ,KAAM,IAAI1G,WAAU,oCACtB,IAAI0G,EAAc,GAAKA,EAAc,EACnC,KAAM,IAAI1G,WAAU,kDAEnB,IAAc,aAAVsD,EAAuB,CAChC,GAAmB,OAAfoD,GAAuC,cAAfA,EAC1B,MACEE,KAAMC,aAAaC,kBACnBC,KAAM,oBACNC,QAAS,mCAEN,IAAmB,WAAfN,EACT,KAAM,IAAI1G,WAAU,0BAA4B0G,EAAc,SAGhEA,GADmB,UAAVpD,EACKtH,EAAOwD,gBAAgBkH,GAEvB,GAAKA,CAErBhC,GAA4BpB,EAAQoD,EAAalB,GAMnD,WAAA,IAJIA,EAASG,SACXH,EAASG,OAAS,UAAA,IAChBH,EAAS/F,SACX+F,EAAS/F,OAAS,UACb+F,IAGLyB,GAAAA,EAEAd,GAAAA,EAAAA,EACKpB,EAAI,EAAGA,EAAIkB,EAAUP,OAAQX,IAAK,CACzC,GAAIY,GAASM,EAAUlB,GAAGY,MAC1B,IAAc,MAAVA,EAAgB,CAClB,GAAIA,EAASQ,EACX,KAAM,IAAInG,WAAU,uEAEtBmG,GAAiBR,MAEjBsB,IAAAA,EA8BJ,MA1BAhB,GAAYA,EAAUiB,OAAO,SAAS1B,GACpC,MAAOA,GAASG,QAAU,GAAKH,EAASG,QAAU,IAsB/CsB,GACHjB,IAEKC,EAvST,GAAIpB,IACFsC,YACE,kBACA,qBACA,iBACA,mBACA,uBACA,mBACA,iBACA,mBAEFC,QACE,iBACA,iBACA,iBACA,mBACA,mBACA,mBACA,oBACA,oBACA,oBACA,kBACA,kBACA,mBAEFC,cACE,oBACA,oBACA,qBAEFC,aACE,iBACA,mBACA,oBACA,mBAEFC,YACE,kBACA,kBACA,mBAEFC,cACE,sBACA,uBACA,0BACA,0BAEFC,aACE,mBACA,mBACA,oBAEFC,WACE,iBACA,iBACA,kBAEFC,aACE,iBACA,mBACA,oBACA,mBAEFC,MACE,WACA,aACA,aAEFC,MACE,aACA,WACA,YACA,cACA,aACA,cAEFC,QACE,YACA,cACA,eACA,cAEFC,SACE,eACA,eACA,gBAEFC,SACE,aACA,eACA,gBACA,gBAIAlD,EAAwBnF,SAASsI,gBAAgB,+BAAgC,OAEjFC,GACFC,KAAM,MACNC,OAAQ,MACRC,MAAO,OAGL9D,GACF+D,kBAAmBJ,EACnBK,gBAAiBL,EACjBM,iBAAkBN,EAClBO,eAAgBP,EAChBQ,UACEC,WAAY,MACZC,UAAW,MACXC,MAAS,MACTT,OAAU,OACVU,MAAS,OACTC,UAAW,OACXC,WAAY,QAEdC,YACEC,OAAQ,MACRC,KAAM,OAERC,aAAclB,EACdmB,YACEC,KAAM,2BAERC,WACED,KAAM,+BA4KVtN,GAAOkJ,mBAAqBA,EAC5BlJ,EAAO+J,mBAAqBA,GAM3BlK,GClTH,SAAUG,GAER,GAAIwN,KAEJxN,GAAOoB,aAAe,SAASqM,EAASC,EAAMC,EAAQC,GAKpD,GAAIC,GAAUD,EAAS,MAAQ,KAC3BE,EAAQ,GAAIC,MACZC,EAAS,GAAID,MAAKL,EAGtB,OAFAM,GAAOC,SAASD,EAAOE,WAAa,KAEhCJ,EAAQE,IACJP,IAAWD,IACfW,QAAQC,KAAK,mBAAqBX,EAAU,IAAMI,EAAU,wCAA0CG,EAAOK,eAAiB,KAAOV,GAEvIH,EAASC,IAAAA,EAAW,KAOxBzN,EAAOsO,WAAa,SAASb,EAASC,EAAMC,EAAQC,GAClD,GAAIC,GAAUD,EAAS,MAAQ,IAC/B,IAAI5N,EAAOoB,aAAaqM,EAASC,EAAMC,EAAQC,GAC7C,KAAM,IAAIW,OAAMd,EAAU,IAAMI,EAAU,yBAA2BF,KAIxE9N,0stBChCH,WAEE,OAAA,KAAI8D,SAASC,cAAc,OAAO4K,YAAYC,SAA9C,CAKE,GAAIC,EACC,IAAIrE,OAAOsE,aAAeA,YAAYD,IAC3C,GAAIA,GAAM,WAAa,MAAOC,aAAYD,WAE1C,IAAIA,GAAM,WAAa,MAAOX,MAAKW,MAGrC,IAAIE,GAAuB,SAASC,EAAQC,EAAaC,GACvDxO,KAAKsO,OAASA,EACdtO,KAAKuO,YAAcA,EACnBvO,KAAKwO,aAAeA,EAEpBxO,KAAKqK,KAAO,SACZrK,KAAKyO,SAAAA,EACLzO,KAAK0O,YAAAA,EACL1O,KAAK2O,cAAgBL,EACrBtO,KAAK4O,kBAAAA,EACL5O,KAAK6O,WAAaC,MAAMC,UACxB/O,KAAKgP,UAAYxB,KAAKW,OAGpBc,EAAyBnF,OAAOoF,QAAQrI,UAAUoH,OACtDnE,QAAOoF,QAAQrI,UAAUoH,QAAU,SAASrF,EAAauG,GACvD,GAAIC,GAAYH,EAAuBI,KAAKrP,KAAM4I,EAAauG,EAE/DC,GAAUE,mBACVF,EAAUlB,SAAW,IAErB,IAAIqB,GAAiBH,EAAUI,MAC/BJ,GAAUI,OAAS,WACjBD,EAAeF,KAAKrP,KACpB,IAAIyP,GAAQ,GAAIpB,GAAqBrO,KAAM,KAAMmO,KAC7CuB,EAAW1P,KAAKsP,gBAAgBK,OAAO3P,KAAKkO,UAAYlO,KAAKkO,aACjE0B,YAAW,WACTF,EAASnO,QAAQ,SAASsO,GACxBA,EAAQR,KAAKI,EAAMnB,OAAQmB,MAE5B,GAGL,IAAIK,GAA2BV,EAAUW,gBACzCX,GAAUW,iBAAmB,SAAS1F,EAAMwF,GACpB,kBAAXA,IAAiC,UAARxF,EAClCrK,KAAKsP,gBAAgBhG,KAAKuG,GAE1BC,EAAyBT,KAAKrP,KAAMqK,EAAMwF,GAG9C,IAAIG,GAA8BZ,EAAUa,mBAW5C,OAVAb,GAAUa,oBAAsB,SAAS5F,EAAMwF,GAC7C,GAAY,UAARxF,EAAkB,CACpB,GAAI6F,GAAQlQ,KAAKsP,gBAAgB5N,QAAQmO,EACrCK,IAAS,GACXlQ,KAAKsP,gBAAgBa,OAAOD,EAAO,OAErCF,GAA4BX,KAAKrP,KAAMqK,EAAMwF,IAI1CT,OClEX,SAAU3P,GAgBR,GAAI2Q,GAAUhN,SAASiN,gBACnBjB,EAAY,KACZkB,GAAAA,CACJ,KACE,GAAIC,GAAkBC,iBAAiBJ,GAASK,iBAAiB,WAC7DC,EAAiC,KAAnBH,EAAyB,IAAM,GACjDnB,GAAYgB,EAAQnC,SAAS0C,SAAYD,EAAaA,KACjDvP,SAAU,IACfiO,EAAUb,YAAc,EACxB+B,EAAWE,iBAAiBJ,GAASK,iBAAiB,YAAcC,EACpE,MAAOE,IACP,QACIxB,GACFA,EAAUI,SAEd,IAAIc,EAAJ,CAIA,GAAIrB,GAAyBnF,OAAOoF,QAAQrI,UAAUoH,OACtDnE,QAAOoF,QAAQrI,UAAUoH,QAAU,SAASrF,EAAauG,GAUvD,MATIrF,QAAOC,QAAUA,OAAOC,UAAYjB,MAAMlC,UAAUoD,MAAQrB,EAAYmB,OAAOC,YAEjFpB,EAAcG,MAAMkB,KAAKrB,IAGtBG,MAAMC,QAAQJ,IAAgC,OAAhBA,IACjCA,EAAcnJ,EAAOkJ,mBAAmBC,IAGnCqG,EAAuBI,KAAKrP,KAAM4I,EAAauG,MAEvD7P,GC/CH,SAAUG,EAAQoR,EAAOnR,GA8DvB,QAASoR,GAAsBC,GAC7B,GAAIC,GAAWH,EAAMG,QACrBA,GAASzC,YAAcwC,EACvBC,EAASC,qBAC0B,GAA/BD,EAASE,YAAY/H,OACvBgI,GAAAA,EAEAC,sBAAsBN,GApE1B,GAAIO,GAAgCvH,OAAOsH,qBAC3CtH,QAAOsH,sBAAwB,SAAShP,GACtC,MAAOiP,GAA8B,SAASlP,GAC5C0O,EAAMG,SAASM,4BACflP,EAAED,GACF0O,EAAMG,SAASM,+BAInBT,EAAMU,kBAAoB,WACxBvR,KAAKkR,eACLlR,KAAKuO,gBAAAA,IAGPsC,EAAMU,kBAAkB1K,WACtB2K,cAAe,WAEb,MADAxR,MAAKiR,qBACEjR,KAAKkR,YAAYnN,SAE1BuN,0BAA2B,WACzBT,EAAMY,uBAAyBZ,EAAMY,uBAAuB9G,OAAO,SAASyE,GAC1E,MAAOA,GAAUsC,qBAGrBT,mBAAoB,WAClBjR,KAAKsR,4BACLtR,KAAKkR,YAAclR,KAAKkR,YAAYvG,OAAO,SAASyE,GAClD,MAA8B,YAAvBA,EAAUuC,WAAkD,QAAvBvC,EAAUuC,aAG1DC,MAAO,SAAS5Q,GACd,GAAIoO,GAAY,GAAIyB,GAAMgB,UAAU7Q,EAAQhB,KAW5C,OAVAA,MAAKkR,YAAY5H,KAAK8F,GACtByB,EAAMiB,+BAMN1C,EAAUsC,kBACVtC,EAAUhI,WAAW2K,OACrB3C,EAAUsC,kBACHtC,GAET2C,KAAM,SAAS/Q,GAIb,MAHIA,IACFA,EAAOgR,SAEFhS,KAAK4R,MAAM5Q,IAItB,IAAImQ,IAAAA,CAEJN,GAAMiB,6BAA+B,WAC9BX,IACHA,GAAAA,EACAC,sBAAsBN,IAc1B,IAAIE,GAAW,GAAIH,GAAMU,iBACzBV,GAAMG,SAAWA,CAEjB,KACE3P,OAAO4Q,eAAenI,OAAO1G,SAAU,YACrC8O,cAAAA,EACAC,IAAK,WAAa,MAAOnB,MAE3B,MAAOoB,IACT,IACEtI,OAAO1G,SAAS4N,SAAWA,EAC3B,MAAOoB,MAER9S,EAAqBE,GCtFxB,SAAUC,EAAQoR,EAAOnR,GACvBmR,EAAMY,0BAENZ,EAAMgB,UAAY,SAAS7Q,EAAQgQ,GASjC,GARAhR,KAAKqS,GAAK,GACNrR,GAAUA,EAAOsR,MACnBtS,KAAKqS,GAAKrR,EAAOsR,KAEnBtS,KAAKgB,OAASA,EACVA,IACFA,EAAOoG,WAAapH,OAEjBgR,EACH,KAAM,IAAIhD,OAAM,gDAElBhO,MAAKuS,UAAYvB,EACjBhR,KAAKwS,gBAAkB/S,EAAOgT,iBAC9BzS,KAAK0S,UAAY,EACjB1S,KAAK2S,SAAAA,EACL3S,KAAK4S,UAAAA,EACL5S,KAAKoH,WAAa,KAClBpH,KAAK6S,oBACL7S,KAAK8S,UAAY,KACjB9S,KAAK+S,cAAgB,OACrB/S,KAAKqH,8BAELrH,KAAKoH,WAAWoI,SAChBxP,KAAK0R,mBAGPb,EAAMgB,UAAUhL,WACd6K,gBAAiB,WACf,GAAIsB,GAAehT,KAAK+S,cACpBE,EAAejT,KAAK2R,SAsBxB,OArBI3R,MAAKkT,eAAiBD,IAAiBD,IACrB,QAAhBC,GACFjT,KAAKmT,sBACLnT,KAAKkT,kBAAAA,IACoB,WAAhBF,EACThT,KAAKoT,uBACoB,WAAhBH,IACTjT,KAAKkT,kBAAAA,KAGLlT,KAAKqT,kBAAoBJ,IAAiBD,IACxB,QAAhBC,GACFjT,KAAKsT,yBACLtT,KAAKqT,qBAAAA,IACoB,YAAhBJ,EACTjT,KAAKuT,0BACoB,YAAhBP,IACThT,KAAKqT,qBAAAA,KAGTrT,KAAK+S,cAAgB/S,KAAK2R,UAClB3R,KAAKkT,eAAiBlT,KAAKqT,kBAErChM,4BAA6B,WAC3BrH,KAAK0R,iBACL,IAAI8B,GACAC,EACAC,EACAC,EACAC,IAAgB5T,KAAKoH,UACrBwM,KACFJ,EAAkBxT,KAAK2E,aACvB8O,EAAYzT,KAAK2S,QACjBe,EAAe1T,KAAK6T,UACpBF,EAAiB3T,KAAKuO,YACtBvO,KAAKoH,WAAWoI,SAChBxP,KAAKoH,WAAW0M,SAAW,KAC3B9T,KAAKoH,WAAa,QAGfpH,KAAKgB,QAAUhB,KAAKgB,iBAAkB8I,QAAOiK,kBAChD/T,KAAKoH,WAAayJ,EAAMmD,wCAAwChU,KAAKgB,QACrE6P,EAAMoD,+BAA+BjU,QAEnCA,KAAKgB,iBAAkB8I,QAAOoK,gBAAkBlU,KAAKgB,iBAAkB8I,QAAOqK,eAChFnU,KAAKoH,WAAayJ,EAAMuD,+BAA+BpU,KAAKgB,QAC5D6P,EAAMwD,sBAAsBrU,OAE1BA,KAAKgB,QAAUhB,KAAKgB,OAAOsT,WAC7BzD,EAAM0D,6BAA6BvU,MAEjC4T,IACqB,GAAnBJ,IACFxT,KAAK2E,aAAe6O,GAED,OAAjBE,EACF1T,KAAK6T,UAAYH,EACW,OAAnBC,EACT3T,KAAKuO,YAAcoF,EACS,OAAnB3T,KAAK0S,YACd1S,KAAKuO,YAAcvO,KAAK0S,WAEtBe,GACFzT,KAAKwU,SAGTxU,KAAK0R,mBAEP+C,gBAAiB,WACf,GAAKzU,KAAKgB,QAA4B,QAAlBhB,KAAK2R,UAAzB,CAGA,GAAIvI,GAASpJ,KAAKgB,OAAOmG,QAAQjC,KACjClF,MAAK6S,iBAAiBtR,QAAQ,SAASmT,GACrC1U,KAAK2U,iBAAiBD,EAAgBtL,GAClCpJ,KAAKgB,iBAAkB8I,QAAOoK,iBAChC9K,GAAUyH,EAAM+D,mBAAmBF,EAAe1T,UACpD6T,KAAK7U,SAET8U,sBAAuB,SAAS1F,GAC9B,GAAKpP,KAAKgB,QAAWhB,KAAK4S,SAE1B,IAAK,GAAIpK,GAAI,EAAGA,EAAIxI,KAAKgB,OAAO+T,SAAS5L,OAAQX,IAC/CxI,KAAKgB,OAAO+T,SAASvM,GAAGpB,WAAagI,EACrCpP,KAAK6S,iBAAiBrK,GAAGsM,sBAAsB1F,IAGnD4F,0BAA2B,WACzB,GAAKhV,KAAKgB,QAAWhB,KAAK4S,SAA1B,CAEA,GAAIxJ,GAASpJ,KAAKgB,OAAOmG,QAAQjC,KACjClF,MAAKiV,yBACLjV,KAAKgB,OAAO+T,SAASxT,QAAQ,SAAS2T,GACpC,GAAIR,GAAiB7D,EAAMG,SAASY,MAAMsD,EAC1ClV,MAAK6S,iBAAiBvJ,KAAKoL,GAC3BA,EAAe/P,aAAe3E,KAAK2E,aAC/B3E,KAAK2S,SACP+B,EAAeF,QACjBU,EAAM9N,WAAapH,KAAKgB,OAAOoG,WAE/BpH,KAAK2U,iBAAiBD,EAAgBtL,GAElCpJ,KAAKgB,iBAAkB8I,QAAOoK,iBAChC9K,GAAUyH,EAAM+D,mBAAmBM,KACrCL,KAAK7U,SAET2U,iBAAkB,SAASD,EAAgBtL,GAClB,OAAnBpJ,KAAK6T,UACPa,EAAenG,YAAcvO,KAAKuO,YAAcnF,EAASpJ,KAAK2E,aACrD+P,EAAeb,YAAc7T,KAAK6T,UAAYzK,EAASpJ,KAAK2E,eACrE+P,EAAeb,UAAY7T,KAAK6T,UAAYzK,EAASpJ,KAAK2E,eAG9DqM,eACE,MAAOhR,MAAKuS,WAEdZ,gBACE,MAAO3R,MAAKoH,WAAapH,KAAKoH,WAAWuK,UAAY,QAEvDwD,eACE,MAAKrL,QAAOsL,SAIPpV,KAAKqT,oBAC2C,GAA/CxC,EAAMY,uBAAuB/P,QAAQ1B,OACvC6Q,EAAMY,uBAAuBnI,KAAKtJ,MAEpCA,KAAKqT,iBAAmB,GAAI+B,SACxB,SAASC,EAASC,GAChBtV,KAAKuT,wBAA0B,WAC7B8B,EAAQrV,OAEVA,KAAKsT,uBAAyB,WAC5BgC,GAAQjL,KAAMC,aAAaiL,UAAW/K,KAAM,iBAE9CqK,KAAK7U,OACW,YAAlBA,KAAK2R,WACP3R,KAAKuT,2BAGFvT,KAAKqT,mBApBVzF,QAAQC,KAAK,6DACN,OAqBX2H,YACE,MAAK1L,QAAOsL,SAIPpV,KAAKkT,iBAC2C,GAA/CrC,EAAMY,uBAAuB/P,QAAQ1B,OACvC6Q,EAAMY,uBAAuBnI,KAAKtJ,MAEpCA,KAAKkT,cAAgB,GAAIkC,SACrB,SAASC,EAASC,GAChBtV,KAAKoT,qBAAuB,WAC1BiC,EAAQrV,OAEVA,KAAKmT,oBAAsB,WACzBmC,GAAQjL,KAAMC,aAAaiL,UAAW/K,KAAM,iBAE9CqK,KAAK7U,OACY,YAAnBA,KAAK2R,WACP3R,KAAKoT,wBAGFpT,KAAKkT,gBApBVtF,QAAQC,KAAK,6DACN,OAqBX4H,eACE,MAAOzV,MAAKoH,WAAWqO,UAEzBA,aAAaC,GAET1V,KAAKoH,WAAWqO,SADF,kBAALC,GACkB,SAAUtD,GACnCA,EAAE9D,OAAStO,KACX0V,EAAErG,KAAKrP,KAAMoS,IACZyC,KAAK7U,MAEmB0V,GAG/BxH,eACE,MAAOlO,MAAKoH,WAAW8G,UAEzBA,aAAawH,GAET1V,KAAKoH,WAAW8G,SADF,kBAALwH,GACkB,SAAUtD,GACnCA,EAAE9D,OAAStO,KACX0V,EAAErG,KAAKrP,KAAMoS,IACZyC,KAAK7U,MAEmB0V,GAG/BnH,kBACEvO,KAAK0R,iBACL,IAAInD,GAAcvO,KAAKoH,WAAWmH,WAElC,OADAvO,MAAK0R,kBACEnD,GAETA,gBAAgBmH,GACd1V,KAAK0R,kBACL1R,KAAKoH,WAAWmH,YAAcnE,SAASsL,GAAKA,EAAI/S,KAAKgT,KAAKD,GAAKzR,OAAO2R,UACtE5V,KAAK6V,YACL7V,KAAK8V,cAAc,SAASZ,EAAO9L,GACjC8L,EAAM3G,YAAcmH,EAAItM,IAE1BpJ,KAAK0R,mBAEPmC,gBACE,MAAO7T,MAAKoH,WAAWyM,WAEzBA,cAAc6B,GACZ1V,KAAK0R,kBACL1R,KAAKoH,WAAWyM,UAAYzJ,SAASsL,GAAKA,EAAI/S,KAAKgT,KAAKD,GAAKzR,OAAO2R,UACpE5V,KAAK6V,YACL7V,KAAK8V,cAAc,SAASZ,EAAO9L,GACjC8L,EAAMrB,UAAY6B,EAAItM,IAExBpJ,KAAK0R,mBAEP/M,mBACE,MAAO3E,MAAKoH,WAAWzC,cAEzBA,iBAAiBqC,GACfhH,KAAK0R,iBACL,IAAIiC,GAAiB3T,KAAKuO,WAC1BvO,MAAKoH,WAAWzC,aAAeqC,EAC/BhH,KAAK8V,cAAc,SAASpB,GAC1BA,EAAe/P,aAAeqC,IAET,OAAnB2M,IACF3T,KAAKuO,YAAcoF,GAErB3T,KAAK0R,mBAEPK,KAAM,WACJ/R,KAAK0R,kBACL1R,KAAK2S,SAAAA,EACL3S,KAAKoH,WAAW2K,QACiC,GAA7C/R,KAAKuS,UAAUrB,YAAYxP,QAAQ1B,OACrCA,KAAKuS,UAAUrB,YAAY5H,KAAKtJ,MAElCA,KAAK6V,YACLhF,EAAMkF,eAAe/V,MACrBA,KAAK8V,cAAc,SAASZ,GAC1B,GAAIc,GAAOd,EAAM3G,WACjB2G,GAAMnD,OACNmD,EAAM3G,YAAcyH,IAEtBhW,KAAK0R,mBAEP8C,MAAO,WACLxU,KAAK0R,kBACD1R,KAAKuO,cACPvO,KAAK0S,UAAY1S,KAAKuO,aAExBvO,KAAKoH,WAAWoN,QAChBxU,KAAK6V,YACL7V,KAAK8V,cAAc,SAASZ,GAC1BA,EAAMV,UAERxU,KAAK2S,SAAAA,EACL3S,KAAK0R,mBAEPuE,OAAQ,WACNjW,KAAK0R,kBACL1R,KAAKoH,WAAW6O,SAChBjW,KAAK6V,YACL7V,KAAK0R,mBAEPlC,OAAQ,WACNxP,KAAK0R,kBACL1R,KAAKoH,WAAWoI,SAChBxP,KAAK6V,YACL7V,KAAKiV,yBACLjV,KAAK0R,mBAEPwE,QAAS,WACPlW,KAAK0R,iBACL,IAAIiC,GAAiB3T,KAAKuO,WAC1BvO,MAAKoH,WAAW8O,UAChBlW,KAAK8V,cAAc,SAASpB,GAC1BA,EAAewB,YAEM,OAAnBvC,IACF3T,KAAKuO,YAAcoF,GAErB3T,KAAK0R,mBAEP3B,iBAAkB,SAAS1F,EAAMwF,GAC/B,GAAIsG,GAAUtG,CACQ,mBAAXA,KACTsG,EAAU,SAAU/D,GAClBA,EAAE9D,OAAStO,KACX6P,EAAQR,KAAKrP,KAAMoS,IAClByC,KAAK7U,MACR6P,EAAQiE,SAAWqC,GAErBnW,KAAKoH,WAAW2I,iBAAiB1F,EAAM8L,IAEzClG,oBAAqB,SAAS5F,EAAMwF,GAClC7P,KAAKoH,WAAW6I,oBAAoB5F,EAAOwF,GAAWA,EAAQiE,UAAajE,IAE7EoF,uBAAwB,WACtB,KAAOjV,KAAK6S,iBAAiB1J,QAC3BnJ,KAAK6S,iBAAiBuD,MAAM5G,UAEhCsG,cAAe,SAAS1T,GACtB,GAAIgH,GAAS,CASb,IARIpJ,KAAKgB,OAAO+T,UAAY/U,KAAK6S,iBAAiB1J,OAASnJ,KAAKgB,OAAO+T,SAAS5L,QAC9EnJ,KAAKgV,4BACPhV,KAAK6S,iBAAiBtR,QAAQ,SAAS2T,GACrC9S,EAAEiN,KAAKrP,KAAMkV,EAAO9L,GAChBpJ,KAAKgB,iBAAkB8I,QAAOoK,iBAChC9K,GAAU8L,EAAMlU,OAAO8D,iBACzB+P,KAAK7U,OAEe,WAAlBA,KAAK2R,UAAT,CAEA,GAAI1Q,GAASjB,KAAKgB,OAAOmG,QACrB4J,EAAI/Q,KAAKuO,WACH,QAANwC,IACFA,EAAItR,EAAOgH,2BAA2BhH,EAAOgF,wBAAwBxD,GAAS8P,EAAG9P,KAC1E,MAAL8P,GAAa3P,MAAM2P,KACrB/Q,KAAKiV,4BAIXnL,OAAO+H,UAAYhB,EAAMgB,WAMxBvS,EAAqBE,GChXvB,SAASC,EAAQoR,EAAOnR,GAqCvB,QAAS2W,GAAazN,GACpB5I,KAAKsW,QAAU7W,EAAO+J,mBAAmBZ,GAoG3C,QAAS2N,KAEP,IADA,GAAIC,IAAAA,EACGC,EAActN,QACPsN,EAAcC,QACpBjC,kBACN+B,GAAAA,CAEF,OAAOA,GA/IT,GAAIG,GAAe,SAAS3V,GAE1B,GADAA,EAAOoG,eAAAA,GACHpG,YAAkB8I,QAAOoK,gBAAkBlT,YAAkB8I,QAAOqK,YACtE,IAAK,GAAI3L,GAAI,EAAGA,EAAIxH,EAAO+T,SAAS5L,OAAQX,IAC1CmO,EAAa3V,EAAO+T,SAASvM,IAKnCqI,GAAM+F,YAAc,SAASC,GAE3B,IAAK,GADDC,MACKtO,EAAI,EAAGA,EAAIqO,EAAQ1N,OAAQX,IAAK,CACvC,GAAIxH,GAAS6V,EAAQrO,EACjBxH,GAAO+V,UACkC,GAAvCD,EAAWpV,QAAQV,EAAO+V,UAC5BD,EAAWxN,KAAKtI,EAAO+V,SAEzB/V,EAAO+V,QAAQhC,SAAS5E,OAAOnP,EAAO+V,QAAQhC,SAASrT,QAAQV,GAAS,GACxEA,EAAO+V,QAAU,KACjBJ,EAAa3V,IACJA,EAAOoG,YAAepG,EAAOoG,WAAWpG,QAAUA,IAC3DA,EAAOoG,WAAWoI,SAClBxO,EAAOoG,WAAWpG,OAAS,GAAI+S,gBAAe,SAC1C/S,EAAOoG,WAAW0L,YACpB9R,EAAOoG,WAAW0L,UAAU1L,WAAa,MAE3CpG,EAAOoG,WAAWC,8BAClBsP,EAAa3V,IAGjB,IAAKwH,EAAI,EAAGA,EAAIsO,EAAW3N,OAAQX,IACjCsO,EAAWtO,GAAGwO,YAQlBnG,EAAMkD,eAAiB,SAASzF,EAAQ1F,EAAahJ,EAAayS,GAmBhE,MAlBArS,MAAKsO,OAASA,EACdtO,KAAK+W,QAAU,KAEfnX,EAAcH,EAAOmC,sBAAsBhC,GAC3CI,KAAKkH,aAAezH,EAAOE,iBAAiBC,GAC5CI,KAAKmH,QAAU1H,EAAOoC,qBAAqBjC,GAE3CI,KAAKiB,OAASxB,EAAOqB,WAAWlB,GAAAA,EAAoBI,MACpDA,KAAKiB,OAAOgG,QAAUjH,KACI,kBAAf4I,IACTnJ,EAAOsO,WAAW,wBAAyB,aAAc,wCACzD/N,KAAKiX,qBAAuBrO,GAE5B5I,KAAKiX,qBAAuB,GAAIZ,GAAazN,GAE/C5I,KAAKkX,WAAatO,EAClB5I,KAAK8E,eAAiBrF,EAAOgF,wBAAwBzE,KAAKmH,SAC1DnH,KAAKsS,IAAMD,EACJrS,MAGT6Q,EAAMkD,eAAelN,WACnBsQ,UAAW,WACT,MAAwC,kBAA7BnX,MAAKiX,qBACPjX,KAAKiX,qBACPjX,KAAKiX,qBAAqBX,SAEnCc,aAAaC,GACX,GAA+B,kBAApBrX,MAAKmX,YACd,KAAM,IAAInJ,OAAM,qEAElBhO,MAAKsU,UAAY+C,EACbrX,KAAKoH,YACPpH,KAAKoH,WAAWC,+BAGpBiQ,aACE,MAAOtX,MAAK+W,SAEdlX,MAAO,WACL,GAA+B,kBAApBG,MAAKmX,YACd,KAAM,IAAInJ,OAAM,2CAElB,IAAInO,GAAQ,GAAIkU,gBAAe/T,KAAKsO,UAAY7O,EAAOE,iBAAiBK,KAAKkH,cAAelH,KAAKsS,IAGjG,OAFAzS,GAAMoX,qBAAuBjX,KAAKiX,qBAClCpX,EAAMqX,WAAalX,KAAKkX,WACjBrX,GAETmS,OAAQ,WACNnB,EAAM+F,aAAa5W,QAIvB,IAAIiP,GAAyBC,QAAQrI,UAAUoH,OAC/CiB,SAAQrI,UAAUoH,QAAU,SAASrF,EAAauG,GAChD,GAAIkD,GAAK,EAIT,OAHIlD,IAAWA,EAAQkD,KACrBA,EAAKlD,EAAQkD,IAERxB,EAAMG,SAASY,MAAM,GAAIf,GAAMkD,eAAe/T,KAAM4I,EAAauG,EAASkD,IAGnF,IAAIkF,GAAanU,SAASsI,gBAAgB,+BAAgC,MAC1EmF,GAAMmD,wCAA0C,SAASwD,GACvD,GAAIA,EAAgB,CAClB,GAAIlJ,GAASkJ,EAAelJ,QAAUiJ,EAClC7N,EAAY8N,EAAeN,UACP,mBAAbxN,KACTA,KAEF,IAAIyF,GAAUqI,EAAetQ,YAC7BiI,GAAQkD,GAAKmF,EAAelF,QAE5B,IAAIhE,GAASiJ,EACT7N,KACAyF,EAAU,CAEhB,OAAOF,GAAuBnL,MAAMwK,GAAS5E,EAAWyF,KAI1D0B,EAAMoD,+BAAiC,SAAS7E,GAC1CA,EAAUpO,QAA0D,kBAAzCoO,GAAUpO,OAAOiW,sBAC9CpG,EAAM0D,6BAA6BnF,GAIvC,IAAIqH,KACJ5F,GAAMkF,eAAiB,SAAS0B,GACG,OAA7BA,EAAe5D,WAAuB4D,EAAe7E,WAE7B,GAAxB6D,EAActN,QAChBiI,sBAAsBmF,GAExBE,EAAcnN,KAAKmO,IAWrB,IAAIC,GAA2B5N,OAAO0G,gBACtCnP,QAAO4Q,eAAenI,OAAQ,oBAC5BoI,cAAAA,EACAyF,YAAAA,EACA3Q,MAAO,WACL6J,EAAMG,SAASM,2BACf,IAAIlJ,GAASsP,EAAyB5T,MAAM9D,KAAM4X,UAIlD,OAHIrB,OACFnO,EAASsP,EAAyB5T,MAAM9D,KAAM4X,YAChD/G,EAAMG,SAASM,4BACRlJ,KAIX0B,OAAOiK,eAAiBlD,EAAMkD,eAC9BjK,OAAOoF,QAAQrI,UAAU2K,cAAgB,WACvC,MAAOpO,UAAS4N,SAASQ,gBAAgB7G,OAAO,SAASyE,GACvD,MAA4B,QAArBA,EAAUpO,QAAmBoO,EAAUpO,OAAOsN,QAAUtO,MAC/D6U,KAAK7U,SAGTV,EAAqBE,GCzKvB,SAAUC,EAAQoR,EAAOnR,GA6CvB,QAASmY,GAASR,GACZA,EAASS,cAEbT,EAASS,aAAAA,EACTC,EAAUzO,KAAK+N,GACVlG,IACHA,GAAAA,EACAC,sBAAsB4G,KAI1B,QAASA,GAAKjH,GACZ,GAAIkH,GAAWF,CACfA,MACAE,EAAS1O,KAAK,SAAS2O,EAAMC,GAC3B,MAAOD,GAAK1F,gBAAkB2F,EAAM3F,kBAEtCyF,EAAWA,EAAStN,OAAO,SAAS0M,GAClCA,GACA,IAAI1F,GAAY0F,EAASjQ,WAAaiQ,EAASjQ,WAAWuK,UAAY,MAGtE,OAFiB,WAAbA,GAAuC,WAAbA,IAC5B0F,EAASS,aAAAA,GACJT,EAASS,cAElBC,EAAUzO,KAAKxF,MAAMiU,EAAWE,GAE5BF,EAAU5O,QACZgI,GAAAA,EACAC,sBAAsB4G,IAEtB7G,GAAAA,EAzEJ,GAEIsB,IAFarP,SAASsI,gBAAgB,+BAAgC,OAErD,EACrBmF,GAAM0D,6BAA+B,SAASnF,GAC5C,GACIgJ,GADA9J,EAASc,EAAUpO,OAAOsN,OAE1B+J,EAA0D,kBAAhCjJ,GAAUpO,OAAOmW,WAE7CiB,GADEC,EACejJ,EAAUpO,OAAOmW,YAEjB/H,EAAUpO,OAAOsT,SAEpC,IAAIrT,GAASmO,EAAUpO,OAAOC,OAC1BqX,EAAO,IACXrX,GAASxB,EAAOoC,qBAAqBZ,EACrC,IAAIoW,GAAW,WACb,GAAItG,GAAIsG,EAASjQ,WAAaiQ,EAASjQ,WAAWmH,YAAc,IACtD,QAANwC,IACFA,EAAItR,EAAOgH,2BAA2BhH,EAAOgF,wBAAwBxD,GAAS8P,EAAG9P,GAC7EG,MAAM2P,KACRA,EAAI,OAIJA,IAAMuH,IACJD,EACFD,EAAerH,EAAGzC,EAAQc,EAAUpO,QAEpCoX,EAAerH,EAAG3B,EAAUpO,OAAQoO,EAAUpO,OAAOoG,aAGzDkR,EAAOvH,EAGTsG,GAASjQ,WAAagI,EACtBiI,EAASS,aAAAA,EACTT,EAAS7E,gBAAkBC,IAC3BrD,EAAU0D,UAAYuE,EACtBQ,EAASR,GAGX,IAAIU,MACA5G,GAAAA,CAmCJN,GAAMgB,UAAUhL,UAAUgP,UAAY,WAChC7V,KAAK8S,WACP+E,EAAS7X,KAAK8S,aAGjBxT,EAAqBE,GCnFxB,SAAUC,EAAQoR,EAAOnR,GAEvB,QAASkV,GAAmB2D,GAC1B,MAAOA,GAAKpR,QAAQjC,MAAQqT,EAAKzT,eAAiByT,EAAKpR,QAAQhC,SAGjE,QAASqT,GAAYzD,EAAUnV,EAAayS,GAC1CrS,KAAKsS,IAAMD,EACXrS,KAAK+W,QAAU,KACf/W,KAAK+U,SAAWA,MAChB/U,KAAKyY,UAAUzY,KAAK+U,UACpBnV,EAAcH,EAAOmC,sBAAsBhC,GAC3CI,KAAKkH,aAAezH,EAAOE,iBAAiBC,GAC5CI,KAAKmH,QAAU1H,EAAOoC,qBAAqBjC,GAAAA,GAC3CI,KAAKiB,OAASxB,EAAOqB,WAAWlB,GAAAA,EAAmBI,MACnDA,KAAKiB,OAAOgG,QAAUjH,KAEQ,SAA1BA,KAAKmH,QAAQhG,WACfnB,KAAKmH,QAAQhG,SAAWnB,KAAK8E,gBAIjCgF,OAAOoK,eAAiB,WACtBsE,EAAY1U,MAAM9D,KAAM4X,YAG1B9N,OAAOqK,YAAc,WACnBqE,EAAY1U,MAAM9D,KAAM4X,YAG1BY,EAAY3R,WACV6R,YAAa,SAAS1X,GAEpB,IADA,GAAIe,GAAI/B,KACK,OAAN+B,GAAY,CACjB,GAAIA,GAAKf,EACP,OAAA,CACFe,GAAIA,EAAEgV,QAER,OAAA,GAEFC,SAAU,WAGR,IADA,GAAIuB,GAAOvY,KACJuY,GACwB,SAAzBA,EAAKtX,OAAOE,WACdoX,EAAKpR,QAAQhG,SAAWoX,EAAKzT,gBAE/ByT,EAAOA,EAAKxB,OAEV/W,MAAKoH,YACPpH,KAAKoH,WAAWC,+BAGpBoR,UAAW,SAASE,GAClB9H,EAAM+F,YAAY+B,EAClB,KAAK,GAAInQ,GAAI,EAAGA,EAAImQ,EAAYxP,OAAQX,IACtCmQ,EAAYnQ,GAAGuO,QAAU/W,MAG7B4Y,UAAW,SAASC,EAAMC,GAExB,IAAK,GADDrO,GAAUqO,EAAW,oCAAsC,qCACtDtQ,EAAI,EAAGA,EAAIqQ,EAAK1P,OAAQX,IAC/B,GAAIxI,KAAK0Y,YAAYG,EAAKrQ,IACxB,MACE6B,KAAMC,aAAayO,sBACnBvO,KAAM,wBACNC,QAASA,EAKf,KAAK,GAAIjC,GAAI,EAAGA,EAAIqQ,EAAK1P,OAAQX,IAC/BsQ,EAAW9Y,KAAK+U,SAASzL,KAAKuP,EAAKrQ,IAAMxI,KAAK+U,SAASiE,QAAQH,EAAKrQ,GAEtExI,MAAKyY,UAAUI,GACf7Y,KAAKgX,YAEPiC,OAAQ,WACNjZ,KAAK4Y,UAAUhB,WAAAA,IAEjBsB,QAAS,WACPlZ,KAAK4Y,UAAUhB,WAAAA,IAEjBN,aACE,MAAOtX,MAAK+W,SAEdoC,iBACE,MAAOnZ,MAAK+U,SAAS5L,OAASnJ,KAAK+U,SAAS,GAAK,MAEnDqE,gBACE,MAAOpZ,MAAK+U,SAAS5L,OAASnJ,KAAK+U,SAAS/U,KAAK+U,SAAS5L,OAAS,GAAK,MAE1EtJ,MAAO,WAGL,IAAK,GAFDwZ,GAAe5Z,EAAOE,iBAAiBK,KAAKkH,cAC5CoS,KACK9Q,EAAI,EAAGA,EAAIxI,KAAK+U,SAAS5L,OAAQX,IACxC8Q,EAAehQ,KAAKtJ,KAAK+U,SAASvM,GAAG3I,QAEvC,OAAQG,gBAAgBmU,aACpB,GAAIA,aAAYmF,EAAgBD,GAChC,GAAInF,gBAAeoF,EAAgBD,IAEzCrH,OAAQ,WACNnB,EAAM+F,aAAa5W,SAIvB8J,OAAOoK,eAAerN,UAAYxF,OAAOkY,OAAOf,EAAY3R,WAC5DxF,OAAO4Q,eACHnI,OAAOoK,eAAerN,UACtB,kBAEEsL,IAAK,WACH,GAAIqH,GAAQ,CAIZ,OAHAxZ,MAAK+U,SAASxT,QAAQ,SAAS2T,GAC7BsE,GAAS5E,EAAmBM,KAEvBvS,KAAK8W,IAAID,EAAO,MAI/B1P,OAAOqK,YAAYtN,UAAYxF,OAAOkY,OAAOf,EAAY3R,WACzDxF,OAAO4Q,eACHnI,OAAOqK,YAAYtN,UACnB,kBAEEsL,IAAK,WACH,GAAIsH,GAAM,CAIV,OAHAzZ,MAAK+U,SAASxT,QAAQ,SAAS2T,GAC7BuE,EAAM9W,KAAK8W,IAAIA,EAAK7E,EAAmBM,MAElCuE,KAIf5I,EAAMuD,+BAAiC,SAASsF,GAC9C,GAAIC,GACA1Y,EAAS,KACT2Y,EAAS,SAASC,GACpB,GAAIzK,GAAYuK,EAAoB7F,QACpC,IAAK1E,GAGsB,WAAvBA,EAAUuC,WAGTvC,EAAUpO,OAGf,MAAU,OAAN6Y,MACFzK,GAAU6F,yBAQF,GAAN4E,GAAWzK,EAAUzK,aAAe,IACjC1D,IACHA,EAASxB,EAAOoC,qBAAqBuN,EAAUpO,OAAOC,SAExD4Y,EAAKpa,EAAOgH,2BAA2BhH,EAAOgF,wBAAwBxD,IAAU,EAAGA,GAC/EG,MAAMyY,IAAa,MAANA,IACfzK,EAAU0G,cAAc,SAASZ,GAC/BA,EAAM3G,aAAe,QAEvBa,GAAU6F,8BAAAA,IAMZ6E,EAAmB,GAAI/F,gBAAe,QAAU2F,EAAMvS,QAASuS,EAAMpH,IAGzE,OAFAwH,GAAiB1C,SAAWwC,EAC5BD,EAAsB9I,EAAMG,SAASY,MAAMkI,IAI7CjJ,EAAMwD,sBAAwB,SAASjF,GACrCA,EAAUhI,WAAW0M,SAAW1E,EAChCA,EAAUwD,UAAAA,EACV/B,EAAMkF,eAAe3G,GACrBA,EAAU4F,4BACV5F,EAAU0F,sBAAsB1F,IAGlCyB,EAAM+D,mBAAqBA,GAE1BtV,EAAqBE,GV3LpBA,EAAAA,KAEJua,MACMC,WAAAA,MAAuBha","file":"web-animations-next-lite.min.js"} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next.min.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next.min.html
new file mode 100644
index 00000000000..536e092daf5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next.min.html
@@ -0,0 +1 @@
+<script src="./web-animations-next.min.js"></script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next.min.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next.min.js
new file mode 100644
index 00000000000..99e293f46b7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next.min.js
@@ -0,0 +1,16 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+!function(a,b){var c={},d={},e={};!function(a,b){function c(a){if("number"==typeof a)return a;var b={};for(var c in a)b[c]=a[c];return b}function d(){this._delay=0,this._endDelay=0,this._fill="none",this._iterationStart=0,this._iterations=1,this._duration=0,this._playbackRate=1,this._direction="normal",this._easing="linear",this._easingFunction=x}function e(){return a.isDeprecated("Invalid timing inputs","2016-03-02","TypeError exceptions will be thrown instead.",!0)}function f(b,c,e){var f=new d;return c&&(f.fill="both",f.duration="auto"),"number"!=typeof b||isNaN(b)?void 0!==b&&Object.getOwnPropertyNames(b).forEach(function(c){if("auto"!=b[c]){if(("number"==typeof f[c]||"duration"==c)&&("number"!=typeof b[c]||isNaN(b[c])))return;if("fill"==c&&-1==v.indexOf(b[c]))return;if("direction"==c&&-1==w.indexOf(b[c]))return;if("playbackRate"==c&&1!==b[c]&&a.isDeprecated("AnimationEffectTiming.playbackRate","2014-11-28","Use Animation.playbackRate instead."))return;f[c]=b[c]}}):f.duration=b,f}function g(a){return"number"==typeof a&&(a=isNaN(a)?{duration:0}:{duration:a}),a}function h(b,c){return b=a.numericTimingToObject(b),f(b,c)}function i(a,b,c,d){return a<0||a>1||c<0||c>1?x:function(e){function f(a,b,c){return 3*a*(1-c)*(1-c)*c+3*b*(1-c)*c*c+c*c*c}if(e<=0){var g=0;return a>0?g=b/a:!b&&c>0&&(g=d/c),g*e}if(e>=1){var h=0;return c<1?h=(d-1)/(c-1):1==c&&a<1&&(h=(b-1)/(a-1)),1+h*(e-1)}for(var i=0,j=1;i<j;){var k=(i+j)/2,l=f(a,c,k);if(Math.abs(e-l)<1e-5)return f(b,d,k);l<e?i=k:j=k}return f(b,d,k)}}function j(a,b){return function(c){if(c>=1)return 1;var d=1/a;return(c+=b*d)-c%d}}function k(a){C||(C=document.createElement("div").style),C.animationTimingFunction="",C.animationTimingFunction=a;var b=C.animationTimingFunction;if(""==b&&e())throw new TypeError(a+" is not a valid value for easing");return b}function l(a){if("linear"==a)return x;var b=E.exec(a);if(b)return i.apply(this,b.slice(1).map(Number));var c=F.exec(a);return c?j(Number(c[1]),{start:y,middle:z,end:A}[c[2]]):B[a]||x}function m(a){return Math.abs(n(a)/a.playbackRate)}function n(a){return 0===a.duration||0===a.iterations?0:a.duration*a.iterations}function o(a,b,c){if(null==b)return G;var d=c.delay+a+c.endDelay;return b<Math.min(c.delay,d)?H:b>=Math.min(c.delay+a,d)?I:J}function p(a,b,c,d,e){switch(d){case H:return"backwards"==b||"both"==b?0:null;case J:return c-e;case I:return"forwards"==b||"both"==b?a:null;case G:return null}}function q(a,b,c,d,e){var f=e;return 0===a?b!==H&&(f+=c):f+=d/a,f}function r(a,b,c,d,e,f){var g=a===1/0?b%1:a%1;return 0!==g||c!==I||0===d||0===e&&0!==f||(g=1),g}function s(a,b,c,d){return a===I&&b===1/0?1/0:1===c?Math.floor(d)-1:Math.floor(d)}function t(a,b,c){var d=a;if("normal"!==a&&"reverse"!==a){var e=b;"alternate-reverse"===a&&(e+=1),d="normal",e!==1/0&&e%2!=0&&(d="reverse")}return"normal"===d?c:1-c}function u(a,b,c){var d=o(a,b,c),e=p(a,c.fill,b,d,c.delay);if(null===e)return null;var f=q(c.duration,d,c.iterations,e,c.iterationStart),g=r(f,c.iterationStart,d,c.iterations,e,c.duration),h=s(d,c.iterations,g,f),i=t(c.direction,h,g);return c._easingFunction(i)}var v="backwards|forwards|both|none".split("|"),w="reverse|alternate|alternate-reverse".split("|"),x=function(a){return a};d.prototype={_setMember:function(b,c){this["_"+b]=c,this._effect&&(this._effect._timingInput[b]=c,this._effect._timing=a.normalizeTimingInput(this._effect._timingInput),this._effect.activeDuration=a.calculateActiveDuration(this._effect._timing),this._effect._animation&&this._effect._animation._rebuildUnderlyingAnimation())},get playbackRate(){return this._playbackRate},set delay(a){this._setMember("delay",a)},get delay(){return this._delay},set endDelay(a){this._setMember("endDelay",a)},get endDelay(){return this._endDelay},set fill(a){this._setMember("fill",a)},get fill(){return this._fill},set iterationStart(a){if((isNaN(a)||a<0)&&e())throw new TypeError("iterationStart must be a non-negative number, received: "+timing.iterationStart);this._setMember("iterationStart",a)},get iterationStart(){return this._iterationStart},set duration(a){if("auto"!=a&&(isNaN(a)||a<0)&&e())throw new TypeError("duration must be non-negative or auto, received: "+a);this._setMember("duration",a)},get duration(){return this._duration},set direction(a){this._setMember("direction",a)},get direction(){return this._direction},set easing(a){this._easingFunction=l(k(a)),this._setMember("easing",a)},get easing(){return this._easing},set iterations(a){if((isNaN(a)||a<0)&&e())throw new TypeError("iterations must be non-negative, received: "+a);this._setMember("iterations",a)},get iterations(){return this._iterations}};var y=1,z=.5,A=0,B={ease:i(.25,.1,.25,1),"ease-in":i(.42,0,1,1),"ease-out":i(0,0,.58,1),"ease-in-out":i(.42,0,.58,1),"step-start":j(1,y),"step-middle":j(1,z),"step-end":j(1,A)},C=null,D="\\s*(-?\\d+\\.?\\d*|-?\\.\\d+)\\s*",E=new RegExp("cubic-bezier\\("+D+","+D+","+D+","+D+"\\)"),F=/steps\(\s*(\d+)\s*,\s*(start|middle|end)\s*\)/,G=0,H=1,I=2,J=3;a.cloneTimingInput=c,a.makeTiming=f,a.numericTimingToObject=g,a.normalizeTimingInput=h,a.calculateActiveDuration=m,a.calculateIterationProgress=u,a.calculatePhase=o,a.normalizeEasing=k,a.parseEasingFunction=l}(c),function(a,b){function c(a,b){return a in k?k[a][b]||b:b}function d(a){return"display"===a||0===a.lastIndexOf("animation",0)||0===a.lastIndexOf("transition",0)}function e(a,b,e){if(!d(a)){var f=h[a];if(f){i.style[a]=b;for(var g in f){var j=f[g],k=i.style[j];e[j]=c(j,k)}}else e[a]=c(a,b)}}function f(a){var b=[];for(var c in a)if(!(c in["easing","offset","composite"])){var d=a[c];Array.isArray(d)||(d=[d]);for(var e,f=d.length,g=0;g<f;g++)e={},e.offset="offset"in a?a.offset:1==f?1:g/(f-1),"easing"in a&&(e.easing=a.easing),"composite"in a&&(e.composite=a.composite),e[c]=d[g],b.push(e)}return b.sort(function(a,b){return a.offset-b.offset}),b}function g(b){function c(){var a=d.length;null==d[a-1].offset&&(d[a-1].offset=1),a>1&&null==d[0].offset&&(d[0].offset=0);for(var b=0,c=d[0].offset,e=1;e<a;e++){var f=d[e].offset;if(null!=f){for(var g=1;g<e-b;g++)d[b+g].offset=c+(f-c)*g/(e-b);b=e,c=f}}}if(null==b)return[];window.Symbol&&Symbol.iterator&&Array.prototype.from&&b[Symbol.iterator]&&(b=Array.from(b)),Array.isArray(b)||(b=f(b));for(var d=b.map(function(b){var c={};for(var d in b){var f=b[d];if("offset"==d){if(null!=f){if(f=Number(f),!isFinite(f))throw new TypeError("Keyframe offsets must be numbers.");if(f<0||f>1)throw new TypeError("Keyframe offsets must be between 0 and 1.")}}else if("composite"==d){if("add"==f||"accumulate"==f)throw{type:DOMException.NOT_SUPPORTED_ERR,name:"NotSupportedError",message:"add compositing is not supported"};if("replace"!=f)throw new TypeError("Invalid composite mode "+f+".")}else f="easing"==d?a.normalizeEasing(f):""+f;e(d,f,c)}return void 0==c.offset&&(c.offset=null),void 0==c.easing&&(c.easing="linear"),c}),g=!0,h=-1/0,i=0;i<d.length;i++){var j=d[i].offset;if(null!=j){if(j<h)throw new TypeError("Keyframes are not loosely sorted by offset. Sort or specify offsets.");h=j}else g=!1}return d=d.filter(function(a){return a.offset>=0&&a.offset<=1}),g||c(),d}var h={background:["backgroundImage","backgroundPosition","backgroundSize","backgroundRepeat","backgroundAttachment","backgroundOrigin","backgroundClip","backgroundColor"],border:["borderTopColor","borderTopStyle","borderTopWidth","borderRightColor","borderRightStyle","borderRightWidth","borderBottomColor","borderBottomStyle","borderBottomWidth","borderLeftColor","borderLeftStyle","borderLeftWidth"],borderBottom:["borderBottomWidth","borderBottomStyle","borderBottomColor"],borderColor:["borderTopColor","borderRightColor","borderBottomColor","borderLeftColor"],borderLeft:["borderLeftWidth","borderLeftStyle","borderLeftColor"],borderRadius:["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],borderRight:["borderRightWidth","borderRightStyle","borderRightColor"],borderTop:["borderTopWidth","borderTopStyle","borderTopColor"],borderWidth:["borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth"],flex:["flexGrow","flexShrink","flexBasis"],font:["fontFamily","fontSize","fontStyle","fontVariant","fontWeight","lineHeight"],margin:["marginTop","marginRight","marginBottom","marginLeft"],outline:["outlineColor","outlineStyle","outlineWidth"],padding:["paddingTop","paddingRight","paddingBottom","paddingLeft"]},i=document.createElementNS("http://www.w3.org/1999/xhtml","div"),j={thin:"1px",medium:"3px",thick:"5px"},k={borderBottomWidth:j,borderLeftWidth:j,borderRightWidth:j,borderTopWidth:j,fontSize:{"xx-small":"60%","x-small":"75%",small:"89%",medium:"100%",large:"120%","x-large":"150%","xx-large":"200%"},fontWeight:{normal:"400",bold:"700"},outlineWidth:j,textShadow:{none:"0px 0px 0px transparent"},boxShadow:{none:"0px 0px 0px 0px transparent"}};a.convertToArrayForm=f,a.normalizeKeyframes=g}(c),function(a){var b={};a.isDeprecated=function(a,c,d,e){var f=e?"are":"is",g=new Date,h=new Date(c);return h.setMonth(h.getMonth()+3),!(g<h&&(a in b||console.warn("Web Animations: "+a+" "+f+" deprecated and will stop working on "+h.toDateString()+". "+d),b[a]=!0,1))},a.deprecated=function(b,c,d,e){var f=e?"are":"is";if(a.isDeprecated(b,c,d,e))throw new Error(b+" "+f+" no longer supported. "+d)}}(c),function(){if(document.documentElement.animate){var a=document.documentElement.animate([],0),b=!0;if(a&&(b=!1,"play|currentTime|pause|reverse|playbackRate|cancel|finish|startTime|playState".split("|").forEach(function(c){void 0===a[c]&&(b=!0)})),!b)return}!function(a,b,c){function d(a){for(var b={},c=0;c<a.length;c++)for(var d in a[c])if("offset"!=d&&"easing"!=d&&"composite"!=d){var e={offset:a[c].offset,easing:a[c].easing,value:a[c][d]};b[d]=b[d]||[],b[d].push(e)}for(var f in b){var g=b[f];if(0!=g[0].offset||1!=g[g.length-1].offset)throw{type:DOMException.NOT_SUPPORTED_ERR,name:"NotSupportedError",message:"Partial keyframes are not supported"}}return b}function e(c){var d=[];for(var e in c)for(var f=c[e],g=0;g<f.length-1;g++){var h=g,i=g+1,j=f[h].offset,k=f[i].offset,l=j,m=k;0==g&&(l=-1/0,0==k&&(i=h)),g==f.length-2&&(m=1/0,1==j&&(h=i)),d.push({applyFrom:l,applyTo:m,startOffset:f[h].offset,endOffset:f[i].offset,easingFunction:a.parseEasingFunction(f[h].easing),property:e,interpolation:b.propertyInterpolation(e,f[h].value,f[i].value)})}return d.sort(function(a,b){return a.startOffset-b.startOffset}),d}b.convertEffectInput=function(c){var f=a.normalizeKeyframes(c),g=d(f),h=e(g);return function(a,c){if(null!=c)h.filter(function(a){return c>=a.applyFrom&&c<a.applyTo}).forEach(function(d){var e=c-d.startOffset,f=d.endOffset-d.startOffset,g=0==f?0:d.easingFunction(e/f);b.apply(a,d.property,d.interpolation(g))});else for(var d in g)"offset"!=d&&"easing"!=d&&"composite"!=d&&b.clear(a,d)}}}(c,d),function(a,b,c){function d(a){return a.replace(/-(.)/g,function(a,b){return b.toUpperCase()})}function e(a,b,c){h[c]=h[c]||[],h[c].push([a,b])}function f(a,b,c){for(var f=0;f<c.length;f++){e(a,b,d(c[f]))}}function g(c,e,f){var g=c;/-/.test(c)&&!a.isDeprecated("Hyphenated property names","2016-03-22","Use camelCase instead.",!0)&&(g=d(c)),"initial"!=e&&"initial"!=f||("initial"==e&&(e=i[g]),"initial"==f&&(f=i[g]));for(var j=e==f?[]:h[g],k=0;j&&k<j.length;k++){var l=j[k][0](e),m=j[k][0](f);if(void 0!==l&&void 0!==m){var n=j[k][1](l,m);if(n){var o=b.Interpolation.apply(null,n);return function(a){return 0==a?e:1==a?f:o(a)}}}}return b.Interpolation(!1,!0,function(a){return a?f:e})}var h={};b.addPropertiesHandler=f;var i={backgroundColor:"transparent",backgroundPosition:"0% 0%",borderBottomColor:"currentColor",borderBottomLeftRadius:"0px",borderBottomRightRadius:"0px",borderBottomWidth:"3px",borderLeftColor:"currentColor",borderLeftWidth:"3px",borderRightColor:"currentColor",borderRightWidth:"3px",borderSpacing:"2px",borderTopColor:"currentColor",borderTopLeftRadius:"0px",borderTopRightRadius:"0px",borderTopWidth:"3px",bottom:"auto",clip:"rect(0px, 0px, 0px, 0px)",color:"black",fontSize:"100%",fontWeight:"400",height:"auto",left:"auto",letterSpacing:"normal",lineHeight:"120%",marginBottom:"0px",marginLeft:"0px",marginRight:"0px",marginTop:"0px",maxHeight:"none",maxWidth:"none",minHeight:"0px",minWidth:"0px",opacity:"1.0",outlineColor:"invert",outlineOffset:"0px",outlineWidth:"3px",paddingBottom:"0px",paddingLeft:"0px",paddingRight:"0px",paddingTop:"0px",right:"auto",strokeDasharray:"none",strokeDashoffset:"0px",textIndent:"0px",textShadow:"0px 0px 0px transparent",top:"auto",transform:"",verticalAlign:"0px",visibility:"visible",width:"auto",wordSpacing:"normal",zIndex:"auto"};b.propertyInterpolation=g}(c,d),function(a,b,c){function d(b){var c=a.calculateActiveDuration(b),d=function(d){return a.calculateIterationProgress(c,d,b)};return d._totalDuration=b.delay+c+b.endDelay,d}b.KeyframeEffect=function(c,e,f,g){var h,i=d(a.normalizeTimingInput(f)),j=b.convertEffectInput(e),k=function(){j(c,h)};return k._update=function(a){return null!==(h=i(a))},k._clear=function(){j(c,null)},k._hasSameTarget=function(a){return c===a},k._target=c,k._totalDuration=i._totalDuration,k._id=g,k}}(c,d),function(a,b){function c(a,b){return!(!b.namespaceURI||-1==b.namespaceURI.indexOf("/svg"))&&(g in a||(a[g]=/Trident|MSIE|IEMobile|Edge|Android 4/i.test(a.navigator.userAgent)),a[g])}function d(a,b,c){c.enumerable=!0,c.configurable=!0,Object.defineProperty(a,b,c)}function e(a){this._element=a,this._surrogateStyle=document.createElementNS("http://www.w3.org/1999/xhtml","div").style,this._style=a.style,this._length=0,this._isAnimatedProperty={},this._updateSvgTransformAttr=c(window,a),this._savedTransformAttr=null;for(var b=0;b<this._style.length;b++){var d=this._style[b];this._surrogateStyle[d]=this._style[d]}this._updateIndices()}function f(a){if(!a._webAnimationsPatchedStyle){var b=new e(a);try{d(a,"style",{get:function(){return b}})}catch(b){a.style._set=function(b,c){a.style[b]=c},a.style._clear=function(b){a.style[b]=""}}a._webAnimationsPatchedStyle=a.style}}var g="_webAnimationsUpdateSvgTransformAttr",h={cssText:1,length:1,parentRule:1},i={getPropertyCSSValue:1,getPropertyPriority:1,getPropertyValue:1,item:1,removeProperty:1,setProperty:1},j={removeProperty:1,setProperty:1};e.prototype={get cssText(){return this._surrogateStyle.cssText},set cssText(a){for(var b={},c=0;c<this._surrogateStyle.length;c++)b[this._surrogateStyle[c]]=!0;this._surrogateStyle.cssText=a,this._updateIndices();for(var c=0;c<this._surrogateStyle.length;c++)b[this._surrogateStyle[c]]=!0;for(var d in b)this._isAnimatedProperty[d]||this._style.setProperty(d,this._surrogateStyle.getPropertyValue(d))},get length(){return this._surrogateStyle.length},get parentRule(){return this._style.parentRule},_updateIndices:function(){for(;this._length<this._surrogateStyle.length;)Object.defineProperty(this,this._length,{configurable:!0,enumerable:!1,get:function(a){return function(){return this._surrogateStyle[a]}}(this._length)}),this._length++;for(;this._length>this._surrogateStyle.length;)this._length--,Object.defineProperty(this,this._length,{configurable:!0,enumerable:!1,value:void 0})},_set:function(b,c){this._style[b]=c,this._isAnimatedProperty[b]=!0,this._updateSvgTransformAttr&&"transform"==a.unprefixedPropertyName(b)&&(null==this._savedTransformAttr&&(this._savedTransformAttr=this._element.getAttribute("transform")),this._element.setAttribute("transform",a.transformToSvgMatrix(c)))},_clear:function(b){this._style[b]=this._surrogateStyle[b],this._updateSvgTransformAttr&&"transform"==a.unprefixedPropertyName(b)&&(this._savedTransformAttr?this._element.setAttribute("transform",this._savedTransformAttr):this._element.removeAttribute("transform"),this._savedTransformAttr=null),delete this._isAnimatedProperty[b]}};for(var k in i)e.prototype[k]=function(a,b){return function(){var c=this._surrogateStyle[a].apply(this._surrogateStyle,arguments);return b&&(this._isAnimatedProperty[arguments[0]]||this._style[a].apply(this._style,arguments),this._updateIndices()),c}}(k,k in j);for(var l in document.documentElement.style)l in h||l in i||function(a){d(e.prototype,a,{get:function(){return this._surrogateStyle[a]},set:function(b){this._surrogateStyle[a]=b,this._updateIndices(),this._isAnimatedProperty[a]||(this._style[a]=b)}})}(l);a.apply=function(b,c,d){f(b),b.style._set(a.propertyName(c),d)},a.clear=function(b,c){b._webAnimationsPatchedStyle&&b.style._clear(a.propertyName(c))}}(d),function(a){window.Element.prototype.animate=function(b,c){var d="";return c&&c.id&&(d=c.id),a.timeline._play(a.KeyframeEffect(this,b,c,d))}}(d),function(a,b){function c(a,b,d){if("number"==typeof a&&"number"==typeof b)return a*(1-d)+b*d;if("boolean"==typeof a&&"boolean"==typeof b)return d<.5?a:b;if(a.length==b.length){for(var e=[],f=0;f<a.length;f++)e.push(c(a[f],b[f],d));return e}throw"Mismatched interpolation arguments "+a+":"+b}a.Interpolation=function(a,b,d){return function(e){return d(c(a,b,e))}}}(d),function(a,b){function c(a,b,c){return Math.max(Math.min(a,c),b)}function d(b,d,e){var f=a.dot(b,d);f=c(f,-1,1);var g=[];if(1===f)g=b;else for(var h=Math.acos(f),i=1*Math.sin(e*h)/Math.sqrt(1-f*f),j=0;j<4;j++)g.push(b[j]*(Math.cos(e*h)-f*i)+d[j]*i);return g}var e=function(){function a(a,b){for(var c=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],d=0;d<4;d++)for(var e=0;e<4;e++)for(var f=0;f<4;f++)c[d][e]+=b[d][f]*a[f][e];return c}function b(a){return 0==a[0][2]&&0==a[0][3]&&0==a[1][2]&&0==a[1][3]&&0==a[2][0]&&0==a[2][1]&&1==a[2][2]&&0==a[2][3]&&0==a[3][2]&&1==a[3][3]}function c(c,d,e,f,g){for(var h=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],i=0;i<4;i++)h[i][3]=g[i];for(var i=0;i<3;i++)for(var j=0;j<3;j++)h[3][i]+=c[j]*h[j][i];var k=f[0],l=f[1],m=f[2],n=f[3],o=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]];o[0][0]=1-2*(l*l+m*m),o[0][1]=2*(k*l-m*n),o[0][2]=2*(k*m+l*n),o[1][0]=2*(k*l+m*n),o[1][1]=1-2*(k*k+m*m),o[1][2]=2*(l*m-k*n),o[2][0]=2*(k*m-l*n),o[2][1]=2*(l*m+k*n),o[2][2]=1-2*(k*k+l*l),h=a(h,o);var p=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]];e[2]&&(p[2][1]=e[2],h=a(h,p)),e[1]&&(p[2][1]=0,p[2][0]=e[0],h=a(h,p)),e[0]&&(p[2][0]=0,p[1][0]=e[0],h=a(h,p));for(var i=0;i<3;i++)for(var j=0;j<3;j++)h[i][j]*=d[i];return b(h)?[h[0][0],h[0][1],h[1][0],h[1][1],h[3][0],h[3][1]]:h[0].concat(h[1],h[2],h[3])}return c}();a.composeMatrix=e,a.quat=d}(d),function(a,b,c){a.sequenceNumber=0;var d=function(a,b,c){this.target=a,this.currentTime=b,this.timelineTime=c,this.type="finish",this.bubbles=!1,this.cancelable=!1,this.currentTarget=a,this.defaultPrevented=!1,this.eventPhase=Event.AT_TARGET,this.timeStamp=Date.now()};b.Animation=function(b){this.id="",b&&b._id&&(this.id=b._id),this._sequenceNumber=a.sequenceNumber++,this._currentTime=0,this._startTime=null,this._paused=!1,this._playbackRate=1,this._inTimeline=!0,this._finishedFlag=!0,this.onfinish=null,this._finishHandlers=[],this._effect=b,this._inEffect=this._effect._update(0),this._idle=!0,this._currentTimePending=!1},b.Animation.prototype={_ensureAlive:function(){this.playbackRate<0&&0===this.currentTime?this._inEffect=this._effect._update(-1):this._inEffect=this._effect._update(this.currentTime),this._inTimeline||!this._inEffect&&this._finishedFlag||(this._inTimeline=!0,b.timeline._animations.push(this))},_tickCurrentTime:function(a,b){a!=this._currentTime&&(this._currentTime=a,this._isFinished&&!b&&(this._currentTime=this._playbackRate>0?this._totalDuration:0),this._ensureAlive())},get currentTime(){return this._idle||this._currentTimePending?null:this._currentTime},set currentTime(a){a=+a,isNaN(a)||(b.restart(),this._paused||null==this._startTime||(this._startTime=this._timeline.currentTime-a/this._playbackRate),this._currentTimePending=!1,this._currentTime!=a&&(this._idle&&(this._idle=!1,this._paused=!0),this._tickCurrentTime(a,!0),b.applyDirtiedAnimation(this)))},get startTime(){return this._startTime},set startTime(a){a=+a,isNaN(a)||this._paused||this._idle||(this._startTime=a,this._tickCurrentTime((this._timeline.currentTime-this._startTime)*this.playbackRate),b.applyDirtiedAnimation(this))},get playbackRate(){return this._playbackRate},set playbackRate(a){if(a!=this._playbackRate){var c=this.currentTime;this._playbackRate=a,this._startTime=null,"paused"!=this.playState&&"idle"!=this.playState&&(this._finishedFlag=!1,this._idle=!1,this._ensureAlive(),b.applyDirtiedAnimation(this)),null!=c&&(this.currentTime=c)}},get _isFinished(){return!this._idle&&(this._playbackRate>0&&this._currentTime>=this._totalDuration||this._playbackRate<0&&this._currentTime<=0)},get _totalDuration(){return this._effect._totalDuration},get playState(){return this._idle?"idle":null==this._startTime&&!this._paused&&0!=this.playbackRate||this._currentTimePending?"pending":this._paused?"paused":this._isFinished?"finished":"running"},_rewind:function(){if(this._playbackRate>=0)this._currentTime=0;else{if(!(this._totalDuration<1/0))throw new DOMException("Unable to rewind negative playback rate animation with infinite duration","InvalidStateError");this._currentTime=this._totalDuration}},play:function(){this._paused=!1,(this._isFinished||this._idle)&&(this._rewind(),this._startTime=null),this._finishedFlag=!1,this._idle=!1,this._ensureAlive(),b.applyDirtiedAnimation(this)},pause:function(){this._isFinished||this._paused||this._idle?this._idle&&(this._rewind(),this._idle=!1):this._currentTimePending=!0,this._startTime=null,this._paused=!0},finish:function(){this._idle||(this.currentTime=this._playbackRate>0?this._totalDuration:0,this._startTime=this._totalDuration-this.currentTime,this._currentTimePending=!1,b.applyDirtiedAnimation(this))},cancel:function(){this._inEffect&&(this._inEffect=!1,this._idle=!0,this._paused=!1,this._isFinished=!0,this._finishedFlag=!0,this._currentTime=0,this._startTime=null,this._effect._update(null),b.applyDirtiedAnimation(this))},reverse:function(){this.playbackRate*=-1,this.play()},addEventListener:function(a,b){"function"==typeof b&&"finish"==a&&this._finishHandlers.push(b)},removeEventListener:function(a,b){if("finish"==a){var c=this._finishHandlers.indexOf(b);c>=0&&this._finishHandlers.splice(c,1)}},_fireEvents:function(a){if(this._isFinished){if(!this._finishedFlag){var b=new d(this,this._currentTime,a),c=this._finishHandlers.concat(this.onfinish?[this.onfinish]:[]);setTimeout(function(){c.forEach(function(a){a.call(b.target,b)})},0),this._finishedFlag=!0}}else this._finishedFlag=!1},_tick:function(a,b){this._idle||this._paused||(null==this._startTime?b&&(this.startTime=a-this._currentTime/this.playbackRate):this._isFinished||this._tickCurrentTime((a-this._startTime)*this.playbackRate)),b&&(this._currentTimePending=!1,this._fireEvents(a))},get _needsTick(){return this.playState in{pending:1,running:1}||!this._finishedFlag},_targetAnimations:function(){var a=this._effect._target;return a._activeAnimations||(a._activeAnimations=[]),a._activeAnimations},_markTarget:function(){var a=this._targetAnimations();-1===a.indexOf(this)&&a.push(this)},_unmarkTarget:function(){var a=this._targetAnimations(),b=a.indexOf(this);-1!==b&&a.splice(b,1)}}}(c,d),function(a,b,c){function d(a){var b=j;j=[],a<q.currentTime&&(a=q.currentTime),q._animations.sort(e),q._animations=h(a,!0,q._animations)[0],b.forEach(function(b){b[1](a)}),g(),l=void 0}function e(a,b){return a._sequenceNumber-b._sequenceNumber}function f(){this._animations=[],this.currentTime=window.performance&&performance.now?performance.now():0}function g(){o.forEach(function(a){a()}),o.length=0}function h(a,c,d){p=!0,n=!1,b.timeline.currentTime=a,m=!1;var e=[],f=[],g=[],h=[];return d.forEach(function(b){b._tick(a,c),b._inEffect?(f.push(b._effect),b._markTarget()):(e.push(b._effect),b._unmarkTarget()),b._needsTick&&(m=!0);var d=b._inEffect||b._needsTick;b._inTimeline=d,d?g.push(b):h.push(b)}),o.push.apply(o,e),o.push.apply(o,f),m&&requestAnimationFrame(function(){}),p=!1,[g,h]}var i=window.requestAnimationFrame,j=[],k=0;window.requestAnimationFrame=function(a){var b=k++;return 0==j.length&&i(d),j.push([b,a]),b},window.cancelAnimationFrame=function(a){j.forEach(function(b){b[0]==a&&(b[1]=function(){})})},f.prototype={_play:function(c){c._timing=a.normalizeTimingInput(c.timing);var d=new b.Animation(c);return d._idle=!1,d._timeline=this,this._animations.push(d),b.restart(),b.applyDirtiedAnimation(d),d}};var l=void 0,m=!1,n=!1;b.restart=function(){return m||(m=!0,requestAnimationFrame(function(){}),n=!0),n},b.applyDirtiedAnimation=function(a){if(!p){a._markTarget();var c=a._targetAnimations();c.sort(e),h(b.timeline.currentTime,!1,c.slice())[1].forEach(function(a){var b=q._animations.indexOf(a);-1!==b&&q._animations.splice(b,1)}),g()}};var o=[],p=!1,q=new f;b.timeline=q}(c,d),function(a,b){function c(a,b){for(var c=0,d=0;d<a.length;d++)c+=a[d]*b[d];return c}function d(a,b){return[a[0]*b[0]+a[4]*b[1]+a[8]*b[2]+a[12]*b[3],a[1]*b[0]+a[5]*b[1]+a[9]*b[2]+a[13]*b[3],a[2]*b[0]+a[6]*b[1]+a[10]*b[2]+a[14]*b[3],a[3]*b[0]+a[7]*b[1]+a[11]*b[2]+a[15]*b[3],a[0]*b[4]+a[4]*b[5]+a[8]*b[6]+a[12]*b[7],a[1]*b[4]+a[5]*b[5]+a[9]*b[6]+a[13]*b[7],a[2]*b[4]+a[6]*b[5]+a[10]*b[6]+a[14]*b[7],a[3]*b[4]+a[7]*b[5]+a[11]*b[6]+a[15]*b[7],a[0]*b[8]+a[4]*b[9]+a[8]*b[10]+a[12]*b[11],a[1]*b[8]+a[5]*b[9]+a[9]*b[10]+a[13]*b[11],a[2]*b[8]+a[6]*b[9]+a[10]*b[10]+a[14]*b[11],a[3]*b[8]+a[7]*b[9]+a[11]*b[10]+a[15]*b[11],a[0]*b[12]+a[4]*b[13]+a[8]*b[14]+a[12]*b[15],a[1]*b[12]+a[5]*b[13]+a[9]*b[14]+a[13]*b[15],a[2]*b[12]+a[6]*b[13]+a[10]*b[14]+a[14]*b[15],a[3]*b[12]+a[7]*b[13]+a[11]*b[14]+a[15]*b[15]]}function e(a){var b=a.rad||0;return((a.deg||0)/360+(a.grad||0)/400+(a.turn||0))*(2*Math.PI)+b}function f(a){switch(a.t){case"rotatex":var b=e(a.d[0]);return[1,0,0,0,0,Math.cos(b),Math.sin(b),0,0,-Math.sin(b),Math.cos(b),0,0,0,0,1];case"rotatey":var b=e(a.d[0]);return[Math.cos(b),0,-Math.sin(b),0,0,1,0,0,Math.sin(b),0,Math.cos(b),0,0,0,0,1];case"rotate":case"rotatez":var b=e(a.d[0]);return[Math.cos(b),Math.sin(b),0,0,-Math.sin(b),Math.cos(b),0,0,0,0,1,0,0,0,0,1];case"rotate3d":var c=a.d[0],d=a.d[1],f=a.d[2],b=e(a.d[3]),g=c*c+d*d+f*f;if(0===g)c=1,d=0,f=0;else if(1!==g){var h=Math.sqrt(g);c/=h,d/=h,f/=h}var i=Math.sin(b/2),j=i*Math.cos(b/2),k=i*i;return[1-2*(d*d+f*f)*k,2*(c*d*k+f*j),2*(c*f*k-d*j),0,2*(c*d*k-f*j),1-2*(c*c+f*f)*k,2*(d*f*k+c*j),0,2*(c*f*k+d*j),2*(d*f*k-c*j),1-2*(c*c+d*d)*k,0,0,0,0,1];case"scale":return[a.d[0],0,0,0,0,a.d[1],0,0,0,0,1,0,0,0,0,1];case"scalex":return[a.d[0],0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];case"scaley":return[1,0,0,0,0,a.d[0],0,0,0,0,1,0,0,0,0,1];case"scalez":return[1,0,0,0,0,1,0,0,0,0,a.d[0],0,0,0,0,1];case"scale3d":return[a.d[0],0,0,0,0,a.d[1],0,0,0,0,a.d[2],0,0,0,0,1];case"skew":var l=e(a.d[0]),m=e(a.d[1]);return[1,Math.tan(m),0,0,Math.tan(l),1,0,0,0,0,1,0,0,0,0,1];case"skewx":var b=e(a.d[0]);return[1,0,0,0,Math.tan(b),1,0,0,0,0,1,0,0,0,0,1];case"skewy":var b=e(a.d[0]);return[1,Math.tan(b),0,0,0,1,0,0,0,0,1,0,0,0,0,1];case"translate":var c=a.d[0].px||0,d=a.d[1].px||0;return[1,0,0,0,0,1,0,0,0,0,1,0,c,d,0,1];case"translatex":var c=a.d[0].px||0;return[1,0,0,0,0,1,0,0,0,0,1,0,c,0,0,1];case"translatey":var d=a.d[0].px||0;return[1,0,0,0,0,1,0,0,0,0,1,0,0,d,0,1];case"translatez":var f=a.d[0].px||0;return[1,0,0,0,0,1,0,0,0,0,1,0,0,0,f,1];case"translate3d":var c=a.d[0].px||0,d=a.d[1].px||0,f=a.d[2].px||0;return[1,0,0,0,0,1,0,0,0,0,1,0,c,d,f,1];case"perspective":return[1,0,0,0,0,1,0,0,0,0,1,a.d[0].px?-1/a.d[0].px:0,0,0,0,1];case"matrix":return[a.d[0],a.d[1],0,0,a.d[2],a.d[3],0,0,0,0,1,0,a.d[4],a.d[5],0,1];case"matrix3d":return a.d}}function g(a){return 0===a.length?[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]:a.map(f).reduce(d)}function h(a){return[i(g(a))]}var i=function(){function a(a){return a[0][0]*a[1][1]*a[2][2]+a[1][0]*a[2][1]*a[0][2]+a[2][0]*a[0][1]*a[1][2]-a[0][2]*a[1][1]*a[2][0]-a[1][2]*a[2][1]*a[0][0]-a[2][2]*a[0][1]*a[1][0]}function b(b){for(var c=1/a(b),d=b[0][0],e=b[0][1],f=b[0][2],g=b[1][0],h=b[1][1],i=b[1][2],j=b[2][0],k=b[2][1],l=b[2][2],m=[[(h*l-i*k)*c,(f*k-e*l)*c,(e*i-f*h)*c,0],[(i*j-g*l)*c,(d*l-f*j)*c,(f*g-d*i)*c,0],[(g*k-h*j)*c,(j*e-d*k)*c,(d*h-e*g)*c,0]],n=[],o=0;o<3;o++){for(var p=0,q=0;q<3;q++)p+=b[3][q]*m[q][o];n.push(p)}return n.push(1),m.push(n),m}function d(a){return[[a[0][0],a[1][0],a[2][0],a[3][0]],[a[0][1],a[1][1],a[2][1],a[3][1]],[a[0][2],a[1][2],a[2][2],a[3][2]],[a[0][3],a[1][3],a[2][3],a[3][3]]]}function e(a,b){for(var c=[],d=0;d<4;d++){for(var e=0,f=0;f<4;f++)e+=a[f]*b[f][d];c.push(e)}return c}function f(a){var b=g(a);return[a[0]/b,a[1]/b,a[2]/b]}function g(a){return Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2])}function h(a,b,c,d){return[c*a[0]+d*b[0],c*a[1]+d*b[1],c*a[2]+d*b[2]]}function i(a,b){return[a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]]}function j(j){var k=[j.slice(0,4),j.slice(4,8),j.slice(8,12),j.slice(12,16)];if(1!==k[3][3])return null;for(var l=[],m=0;m<4;m++)l.push(k[m].slice());for(var m=0;m<3;m++)l[m][3]=0;if(0===a(l))return null;var n,o=[];k[0][3]||k[1][3]||k[2][3]?(o.push(k[0][3]),o.push(k[1][3]),o.push(k[2][3]),o.push(k[3][3]),n=e(o,d(b(l)))):n=[0,0,0,1];var p=k[3].slice(0,3),q=[];q.push(k[0].slice(0,3));var r=[];r.push(g(q[0])),q[0]=f(q[0]);var s=[];q.push(k[1].slice(0,3)),s.push(c(q[0],q[1])),q[1]=h(q[1],q[0],1,-s[0]),r.push(g(q[1])),q[1]=f(q[1]),s[0]/=r[1],q.push(k[2].slice(0,3)),s.push(c(q[0],q[2])),q[2]=h(q[2],q[0],1,-s[1]),s.push(c(q[1],q[2])),q[2]=h(q[2],q[1],1,-s[2]),r.push(g(q[2])),q[2]=f(q[2]),s[1]/=r[2],s[2]/=r[2];var t=i(q[1],q[2]);if(c(q[0],t)<0)for(var m=0;m<3;m++)r[m]*=-1,q[m][0]*=-1,q[m][1]*=-1,q[m][2]*=-1;var u,v,w=q[0][0]+q[1][1]+q[2][2]+1;return w>1e-4?(u=.5/Math.sqrt(w),v=[(q[2][1]-q[1][2])*u,(q[0][2]-q[2][0])*u,(q[1][0]-q[0][1])*u,.25/u]):q[0][0]>q[1][1]&&q[0][0]>q[2][2]?(u=2*Math.sqrt(1+q[0][0]-q[1][1]-q[2][2]),v=[.25*u,(q[0][1]+q[1][0])/u,(q[0][2]+q[2][0])/u,(q[2][1]-q[1][2])/u]):q[1][1]>q[2][2]?(u=2*Math.sqrt(1+q[1][1]-q[0][0]-q[2][2]),v=[(q[0][1]+q[1][0])/u,.25*u,(q[1][2]+q[2][1])/u,(q[0][2]-q[2][0])/u]):(u=2*Math.sqrt(1+q[2][2]-q[0][0]-q[1][1]),v=[(q[0][2]+q[2][0])/u,(q[1][2]+q[2][1])/u,.25*u,(q[1][0]-q[0][1])/u]),[p,r,s,v,n]}return j}();a.dot=c,a.makeMatrixDecomposition=h,a.transformListToMatrix=g}(d),function(a){function b(a,b){var c=a.exec(b);if(c)return c=a.ignoreCase?c[0].toLowerCase():c[0],[c,b.substr(c.length)]}function c(a,b){b=b.replace(/^\s*/,"");var c=a(b);if(c)return[c[0],c[1].replace(/^\s*/,"")]}function d(a,d,e){a=c.bind(null,a);for(var f=[];;){var g=a(e);if(!g)return[f,e];if(f.push(g[0]),e=g[1],!(g=b(d,e))||""==g[1])return[f,e];e=g[1]}}function e(a,b){for(var c=0,d=0;d<b.length&&(!/\s|,/.test(b[d])||0!=c);d++)if("("==b[d])c++;else if(")"==b[d]&&(c--,0==c&&d++,c<=0))break;var e=a(b.substr(0,d));return void 0==e?void 0:[e,b.substr(d)]}function f(a,b){for(var c=a,d=b;c&&d;)c>d?c%=d:d%=c;return c=a*b/(c+d)}function g(a){return function(b){var c=a(b);return c&&(c[0]=void 0),c}}function h(a,b){return function(c){return a(c)||[b,c]}}function i(b,c){for(var d=[],e=0;e<b.length;e++){var f=a.consumeTrimmed(b[e],c);if(!f||""==f[0])return;void 0!==f[0]&&d.push(f[0]),c=f[1]}if(""==c)return d}function j(a,b,c,d,e){for(var g=[],h=[],i=[],j=f(d.length,e.length),k=0;k<j;k++){var l=b(d[k%d.length],e[k%e.length]);if(!l)return;g.push(l[0]),h.push(l[1]),i.push(l[2])}return[g,h,function(b){var d=b.map(function(a,b){return i[b](a)}).join(c);return a?a(d):d}]}function k(a,b,c){for(var d=[],e=[],f=[],g=0,h=0;h<c.length;h++)if("function"==typeof c[h]){var i=c[h](a[g],b[g++]);d.push(i[0]),e.push(i[1]),f.push(i[2])}else!function(a){d.push(!1),e.push(!1),f.push(function(){return c[a]})}(h);return[d,e,function(a){for(var b="",c=0;c<a.length;c++)b+=f[c](a[c]);return b}]}a.consumeToken=b,a.consumeTrimmed=c,a.consumeRepeated=d,a.consumeParenthesised=e,a.ignore=g,a.optional=h,a.consumeList=i,a.mergeNestedRepeated=j.bind(null,null),a.mergeWrappedNestedRepeated=j,a.mergeList=k}(d),function(a){function b(b){function c(b){var c=a.consumeToken(/^inset/i,b);if(c)return d.inset=!0,c;var c=a.consumeLengthOrPercent(b);if(c)return d.lengths.push(c[0]),c;var c=a.consumeColor(b);return c?(d.color=c[0],c):void 0}var d={inset:!1,lengths:[],color:null},e=a.consumeRepeated(c,/^/,b);if(e&&e[0].length)return[d,e[1]]}function c(c){var d=a.consumeRepeated(b,/^,/,c);if(d&&""==d[1])return d[0]}function d(b,c){for(;b.lengths.length<Math.max(b.lengths.length,c.lengths.length);)b.lengths.push({px:0});for(;c.lengths.length<Math.max(b.lengths.length,c.lengths.length);)c.lengths.push({px:0});if(b.inset==c.inset&&!!b.color==!!c.color){for(var d,e=[],f=[[],0],g=[[],0],h=0;h<b.lengths.length;h++){var i=a.mergeDimensions(b.lengths[h],c.lengths[h],2==h);f[0].push(i[0]),g[0].push(i[1]),e.push(i[2])}if(b.color&&c.color){var j=a.mergeColors(b.color,c.color);f[1]=j[0],g[1]=j[1],d=j[2]}return[f,g,function(a){for(var c=b.inset?"inset ":" ",f=0;f<e.length;f++)c+=e[f](a[0][f])+" ";return d&&(c+=d(a[1])),c}]}}function e(b,c,d,e){function f(a){return{inset:a,color:[0,0,0,0],lengths:[{px:0},{px:0},{px:0},{px:0}]}}for(var g=[],h=[],i=0;i<d.length||i<e.length;i++){var j=d[i]||f(e[i].inset),k=e[i]||f(d[i].inset);g.push(j),h.push(k)}return a.mergeNestedRepeated(b,c,g,h)}var f=e.bind(null,d,", ");a.addPropertiesHandler(c,f,["box-shadow","text-shadow"])}(d),function(a,b){function c(a){return a.toFixed(3).replace(/0+$/,"").replace(/\.$/,"")}function d(a,b,c){return Math.min(b,Math.max(a,c))}function e(a){if(/^\s*[-+]?(\d*\.)?\d+\s*$/.test(a))return Number(a)}function f(a,b){return[a,b,c]}function g(a,b){if(0!=a)return i(0,1/0)(a,b)}function h(a,b){return[a,b,function(a){return Math.round(d(1,1/0,a))}]}function i(a,b){return function(e,f){return[e,f,function(e){return c(d(a,b,e))}]}}function j(a){var b=a.trim().split(/\s*[\s,]\s*/);if(0!==b.length){for(var c=[],d=0;d<b.length;d++){var f=e(b[d]);if(void 0===f)return;c.push(f)}return c}}function k(a,b){if(a.length==b.length)return[a,b,function(a){return a.map(c).join(" ")}]}function l(a,b){return[a,b,Math.round]}a.clamp=d,a.addPropertiesHandler(j,k,["stroke-dasharray"]),a.addPropertiesHandler(e,i(0,1/0),["border-image-width","line-height"]),a.addPropertiesHandler(e,i(0,1),["opacity","shape-image-threshold"]),a.addPropertiesHandler(e,g,["flex-grow","flex-shrink"]),a.addPropertiesHandler(e,h,["orphans","widows"]),a.addPropertiesHandler(e,l,["z-index"]),a.parseNumber=e,a.parseNumberList=j,a.mergeNumbers=f,a.numberToString=c}(d),function(a,b){function c(a,b){if("visible"==a||"visible"==b)return[0,1,function(c){return c<=0?a:c>=1?b:"visible"}]}a.addPropertiesHandler(String,c,["visibility"])}(d),function(a,b){function c(a){a=a.trim(),f.fillStyle="#000",f.fillStyle=a;var b=f.fillStyle;if(f.fillStyle="#fff",f.fillStyle=a,b==f.fillStyle){f.fillRect(0,0,1,1);var c=f.getImageData(0,0,1,1).data;f.clearRect(0,0,1,1);var d=c[3]/255;return[c[0]*d,c[1]*d,c[2]*d,d]}}function d(b,c){return[b,c,function(b){function c(a){return Math.max(0,Math.min(255,a))}if(b[3])for(var d=0;d<3;d++)b[d]=Math.round(c(b[d]/b[3]));return b[3]=a.numberToString(a.clamp(0,1,b[3])),"rgba("+b.join(",")+")"}]}var e=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");e.width=e.height=1;var f=e.getContext("2d");a.addPropertiesHandler(c,d,["background-color","border-bottom-color","border-left-color","border-right-color","border-top-color","color","fill","flood-color","lighting-color","outline-color","stop-color","stroke","text-decoration-color"]),a.consumeColor=a.consumeParenthesised.bind(null,c),a.mergeColors=d}(d),function(a,b){function c(a){function b(){var b=h.exec(a);g=b?b[0]:void 0}function c(){var a=Number(g);return b(),a}function d(){if("("!==g)return c();b();var a=f();return")"!==g?NaN:(b(),a)}function e(){for(var a=d();"*"===g||"/"===g;){var c=g;b();var e=d();"*"===c?a*=e:a/=e}return a}function f(){for(var a=e();"+"===g||"-"===g;){var c=g;b();var d=e();"+"===c?a+=d:a-=d}return a}var g,h=/([\+\-\w\.]+|[\(\)\*\/])/g;return b(),f()}function d(a,b){if("0"==(b=b.trim().toLowerCase())&&"px".search(a)>=0)return{px:0};if(/^[^(]*$|^calc/.test(b)){b=b.replace(/calc\(/g,"(");var d={};b=b.replace(a,function(a){return d[a]=null,"U"+a});for(var e="U("+a.source+")",f=b.replace(/[-+]?(\d*\.)?\d+([Ee][-+]?\d+)?/g,"N").replace(new RegExp("N"+e,"g"),"D").replace(/\s[+-]\s/g,"O").replace(/\s/g,""),g=[/N\*(D)/g,/(N|D)[*\/]N/g,/(N|D)O\1/g,/\((N|D)\)/g],h=0;h<g.length;)g[h].test(f)?(f=f.replace(g[h],"$1"),h=0):h++;if("D"==f){for(var i in d){var j=c(b.replace(new RegExp("U"+i,"g"),"").replace(new RegExp(e,"g"),"*0"));if(!isFinite(j))return;d[i]=j}return d}}}function e(a,b){return f(a,b,!0)}function f(b,c,d){var e,f=[];for(e in b)f.push(e);for(e in c)f.indexOf(e)<0&&f.push(e);return b=f.map(function(a){return b[a]||0}),c=f.map(function(a){return c[a]||0}),[b,c,function(b){var c=b.map(function(c,e){return 1==b.length&&d&&(c=Math.max(c,0)),a.numberToString(c)+f[e]}).join(" + ");return b.length>1?"calc("+c+")":c}]}var g="px|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc",h=d.bind(null,new RegExp(g,"g")),i=d.bind(null,new RegExp(g+"|%","g")),j=d.bind(null,/deg|rad|grad|turn/g);a.parseLength=h,a.parseLengthOrPercent=i,a.consumeLengthOrPercent=a.consumeParenthesised.bind(null,i),a.parseAngle=j,a.mergeDimensions=f;var k=a.consumeParenthesised.bind(null,h),l=a.consumeRepeated.bind(void 0,k,/^/),m=a.consumeRepeated.bind(void 0,l,/^,/);a.consumeSizePairList=m;var n=function(a){var b=m(a);if(b&&""==b[1])return b[0]},o=a.mergeNestedRepeated.bind(void 0,e," "),p=a.mergeNestedRepeated.bind(void 0,o,",");a.mergeNonNegativeSizePair=o,a.addPropertiesHandler(n,p,["background-size"]),a.addPropertiesHandler(i,e,["border-bottom-width","border-image-width","border-left-width","border-right-width","border-top-width","flex-basis","font-size","height","line-height","max-height","max-width","outline-width","width"]),a.addPropertiesHandler(i,f,["border-bottom-left-radius","border-bottom-right-radius","border-top-left-radius","border-top-right-radius","bottom","left","letter-spacing","margin-bottom","margin-left","margin-right","margin-top","min-height","min-width","outline-offset","padding-bottom","padding-left","padding-right","padding-top","perspective","right","shape-margin","stroke-dashoffset","text-indent","top","vertical-align","word-spacing"])}(d),function(a,b){function c(b){return a.consumeLengthOrPercent(b)||a.consumeToken(/^auto/,b)}function d(b){var d=a.consumeList([a.ignore(a.consumeToken.bind(null,/^rect/)),a.ignore(a.consumeToken.bind(null,/^\(/)),a.consumeRepeated.bind(null,c,/^,/),a.ignore(a.consumeToken.bind(null,/^\)/))],b);if(d&&4==d[0].length)return d[0]}function e(b,c){return"auto"==b||"auto"==c?[!0,!1,function(d){var e=d?b:c;if("auto"==e)return"auto";var f=a.mergeDimensions(e,e);return f[2](f[0])}]:a.mergeDimensions(b,c)}function f(a){return"rect("+a+")"}var g=a.mergeWrappedNestedRepeated.bind(null,f,e,", ");a.parseBox=d,a.mergeBoxes=g,a.addPropertiesHandler(d,g,["clip"])}(d),function(a,b){function c(a){return function(b){var c=0;return a.map(function(a){return a===k?b[c++]:a})}}function d(a){return a}function e(b){if("none"==(b=b.toLowerCase().trim()))return[];for(var c,d=/\s*(\w+)\(([^)]*)\)/g,e=[],f=0;c=d.exec(b);){if(c.index!=f)return;f=c.index+c[0].length;var g=c[1],h=n[g];if(!h)return;var i=c[2].split(","),j=h[0];if(j.length<i.length)return;for(var k=[],o=0;o<j.length;o++){var p,q=i[o],r=j[o];if(void 0===(p=q?{A:function(b){return"0"==b.trim()?m:a.parseAngle(b)},N:a.parseNumber,T:a.parseLengthOrPercent,L:a.parseLength}[r.toUpperCase()](q):{a:m,n:k[0],t:l}[r]))return;k.push(p)}if(e.push({t:g,d:k}),d.lastIndex==b.length)return e}}function f(a){return a.toFixed(6).replace(".000000","")}function g(b,c){if(b.decompositionPair!==c){b.decompositionPair=c;var d=a.makeMatrixDecomposition(b)}if(c.decompositionPair!==b){c.decompositionPair=b;var e=a.makeMatrixDecomposition(c)}return null==d[0]||null==e[0]?[[!1],[!0],function(a){return a?c[0].d:b[0].d}]:(d[0].push(0),e[0].push(1),[d,e,function(b){var c=a.quat(d[0][3],e[0][3],b[5]);return a.composeMatrix(b[0],b[1],b[2],c,b[4]).map(f).join(",")}])}function h(a){return a.replace(/[xy]/,"")}function i(a){return a.replace(/(x|y|z|3d)?$/,"3d")}function j(b,c){var d=a.makeMatrixDecomposition&&!0,e=!1;if(!b.length||!c.length){b.length||(e=!0,b=c,c=[]);for(var f=0;f<b.length;f++){var j=b[f].t,k=b[f].d,l="scale"==j.substr(0,5)?1:0;c.push({t:j,d:k.map(function(a){if("number"==typeof a)return l;var b={};for(var c in a)b[c]=l;return b})})}}var m=function(a,b){return"perspective"==a&&"perspective"==b||("matrix"==a||"matrix3d"==a)&&("matrix"==b||"matrix3d"==b)},o=[],p=[],q=[];if(b.length!=c.length){if(!d)return;var r=g(b,c);o=[r[0]],p=[r[1]],q=[["matrix",[r[2]]]]}else for(var f=0;f<b.length;f++){var j,s=b[f].t,t=c[f].t,u=b[f].d,v=c[f].d,w=n[s],x=n[t];if(m(s,t)){if(!d)return;var r=g([b[f]],[c[f]]);o.push(r[0]),p.push(r[1]),q.push(["matrix",[r[2]]])}else{if(s==t)j=s;else if(w[2]&&x[2]&&h(s)==h(t))j=h(s),u=w[2](u),v=x[2](v);else{if(!w[1]||!x[1]||i(s)!=i(t)){if(!d)return;var r=g(b,c);o=[r[0]],p=[r[1]],q=[["matrix",[r[2]]]];break}j=i(s),u=w[1](u),v=x[1](v)}for(var y=[],z=[],A=[],B=0;B<u.length;B++){var C="number"==typeof u[B]?a.mergeNumbers:a.mergeDimensions,r=C(u[B],v[B]);y[B]=r[0],z[B]=r[1],A.push(r[2])}o.push(y),p.push(z),q.push([j,A])}}if(e){var D=o;o=p,p=D}return[o,p,function(a){return a.map(function(a,b){var c=a.map(function(a,c){return q[b][1][c](a)}).join(",");return"matrix"==q[b][0]&&16==c.split(",").length&&(q[b][0]="matrix3d"),q[b][0]+"("+c+")"}).join(" ")}]}var k=null,l={px:0},m={deg:0},n={matrix:["NNNNNN",[k,k,0,0,k,k,0,0,0,0,1,0,k,k,0,1],d],matrix3d:["NNNNNNNNNNNNNNNN",d],rotate:["A"],rotatex:["A"],rotatey:["A"],rotatez:["A"],rotate3d:["NNNA"],perspective:["L"],scale:["Nn",c([k,k,1]),d],scalex:["N",c([k,1,1]),c([k,1])],scaley:["N",c([1,k,1]),c([1,k])],scalez:["N",c([1,1,k])],scale3d:["NNN",d],skew:["Aa",null,d],skewx:["A",null,c([k,m])],skewy:["A",null,c([m,k])],translate:["Tt",c([k,k,l]),d],translatex:["T",c([k,l,l]),c([k,l])],translatey:["T",c([l,k,l]),c([l,k])],translatez:["L",c([l,l,k])],translate3d:["TTL",d]};a.addPropertiesHandler(e,j,["transform"]),a.transformToSvgMatrix=function(b){var c=a.transformListToMatrix(e(b));return"matrix("+f(c[0])+" "+f(c[1])+" "+f(c[4])+" "+f(c[5])+" "+f(c[12])+" "+f(c[13])+")"}}(d),function(a){function b(a){var b=Number(a);if(!(isNaN(b)||b<100||b>900||b%100!=0))return b}function c(b){return b=100*Math.round(b/100),b=a.clamp(100,900,b),400===b?"normal":700===b?"bold":String(b)}function d(a,b){return[a,b,c]}a.addPropertiesHandler(b,d,["font-weight"])}(d),function(a){function b(a){var b={};for(var c in a)b[c]=-a[c];return b}function c(b){return a.consumeToken(/^(left|center|right|top|bottom)\b/i,b)||a.consumeLengthOrPercent(b)}function d(b,d){var e=a.consumeRepeated(c,/^/,d);if(e&&""==e[1]){var f=e[0];if(f[0]=f[0]||"center",f[1]=f[1]||"center",3==b&&(f[2]=f[2]||{px:0}),f.length==b){if(/top|bottom/.test(f[0])||/left|right/.test(f[1])){var h=f[0];f[0]=f[1],f[1]=h}if(/left|right|center|Object/.test(f[0])&&/top|bottom|center|Object/.test(f[1]))return f.map(function(a){return"object"==typeof a?a:g[a]})}}}function e(d){var e=a.consumeRepeated(c,/^/,d);if(e){for(var f=e[0],h=[{"%":50},{"%":50}],i=0,j=!1,k=0;k<f.length;k++){var l=f[k];"string"==typeof l?(j=/bottom|right/.test(l),i={left:0,right:0,center:i,top:1,bottom:1}[l],h[i]=g[l],"center"==l&&i++):(j&&(l=b(l),l["%"]=(l["%"]||0)+100),h[i]=l,i++,j=!1)}return[h,e[1]]}}function f(b){var c=a.consumeRepeated(e,/^,/,b);if(c&&""==c[1])return c[0]}var g={left:{"%":0},center:{"%":50},right:{"%":100},top:{"%":0},bottom:{"%":100}},h=a.mergeNestedRepeated.bind(null,a.mergeDimensions," ");a.addPropertiesHandler(d.bind(null,3),h,["transform-origin"]),a.addPropertiesHandler(d.bind(null,2),h,["perspective-origin"]),a.consumePosition=e,a.mergeOffsetList=h;var i=a.mergeNestedRepeated.bind(null,h,", ");a.addPropertiesHandler(f,i,["background-position","object-position"])}(d),function(a){function b(b){var c=a.consumeToken(/^circle/,b);if(c&&c[0])return["circle"].concat(a.consumeList([a.ignore(a.consumeToken.bind(void 0,/^\(/)),d,a.ignore(a.consumeToken.bind(void 0,/^at/)),a.consumePosition,a.ignore(a.consumeToken.bind(void 0,/^\)/))],c[1]));var f=a.consumeToken(/^ellipse/,b);if(f&&f[0])return["ellipse"].concat(a.consumeList([a.ignore(a.consumeToken.bind(void 0,/^\(/)),e,a.ignore(a.consumeToken.bind(void 0,/^at/)),a.consumePosition,a.ignore(a.consumeToken.bind(void 0,/^\)/))],f[1]));var g=a.consumeToken(/^polygon/,b);return g&&g[0]?["polygon"].concat(a.consumeList([a.ignore(a.consumeToken.bind(void 0,/^\(/)),a.optional(a.consumeToken.bind(void 0,/^nonzero\s*,|^evenodd\s*,/),"nonzero,"),a.consumeSizePairList,a.ignore(a.consumeToken.bind(void 0,/^\)/))],g[1])):void 0}function c(b,c){if(b[0]===c[0])return"circle"==b[0]?a.mergeList(b.slice(1),c.slice(1),["circle(",a.mergeDimensions," at ",a.mergeOffsetList,")"]):"ellipse"==b[0]?a.mergeList(b.slice(1),c.slice(1),["ellipse(",a.mergeNonNegativeSizePair," at ",a.mergeOffsetList,")"]):"polygon"==b[0]&&b[1]==c[1]?a.mergeList(b.slice(2),c.slice(2),["polygon(",b[1],g,")"]):void 0}var d=a.consumeParenthesised.bind(null,a.parseLengthOrPercent),e=a.consumeRepeated.bind(void 0,d,/^/),f=a.mergeNestedRepeated.bind(void 0,a.mergeDimensions," "),g=a.mergeNestedRepeated.bind(void 0,f,",");a.addPropertiesHandler(b,c,["shape-outside"])}(d),function(a,b){function c(a,b){b.concat([a]).forEach(function(b){b in document.documentElement.style&&(d[a]=b),e[b]=a})}var d={},e={};c("transform",["webkitTransform","msTransform"]),c("transformOrigin",["webkitTransformOrigin"]),c("perspective",["webkitPerspective"]),c("perspectiveOrigin",["webkitPerspectiveOrigin"]),a.propertyName=function(a){return d[a]||a},a.unprefixedPropertyName=function(a){return e[a]||a}}(d)}(),function(){if(void 0===document.createElement("div").animate([]).oncancel){var a;if(window.performance&&performance.now)var a=function(){return performance.now()};else var a=function(){return Date.now()};var b=function(a,b,c){this.target=a,this.currentTime=b,this.timelineTime=c,this.type="cancel",this.bubbles=!1,this.cancelable=!1,this.currentTarget=a,this.defaultPrevented=!1,this.eventPhase=Event.AT_TARGET,this.timeStamp=Date.now()},c=window.Element.prototype.animate;window.Element.prototype.animate=function(d,e){var f=c.call(this,d,e);f._cancelHandlers=[],f.oncancel=null;var g=f.cancel;f.cancel=function(){g.call(this);var c=new b(this,null,a()),d=this._cancelHandlers.concat(this.oncancel?[this.oncancel]:[]);setTimeout(function(){d.forEach(function(a){a.call(c.target,c)})},0)};var h=f.addEventListener;f.addEventListener=function(a,b){"function"==typeof b&&"cancel"==a?this._cancelHandlers.push(b):h.call(this,a,b)};var i=f.removeEventListener;return f.removeEventListener=function(a,b){if("cancel"==a){var c=this._cancelHandlers.indexOf(b);c>=0&&this._cancelHandlers.splice(c,1)}else i.call(this,a,b)},f}}}(),function(a){var b=document.documentElement,c=null,d=!1;try{var e=getComputedStyle(b).getPropertyValue("opacity"),f="0"==e?"1":"0";c=b.animate({opacity:[f,f]},{duration:1}),c.currentTime=0,d=getComputedStyle(b).getPropertyValue("opacity")==f}catch(a){}finally{c&&c.cancel()}if(!d){var g=window.Element.prototype.animate;window.Element.prototype.animate=function(b,c){return window.Symbol&&Symbol.iterator&&Array.prototype.from&&b[Symbol.iterator]&&(b=Array.from(b)),Array.isArray(b)||null===b||(b=a.convertToArrayForm(b)),g.call(this,b,c)}}}(c),function(a,b,c){function d(a){var c=b.timeline;c.currentTime=a,c._discardAnimations(),0==c._animations.length?f=!1:requestAnimationFrame(d)}var e=window.requestAnimationFrame;window.requestAnimationFrame=function(a){return e(function(c){b.timeline._updateAnimationsPromises(),a(c),b.timeline._updateAnimationsPromises()})},b.AnimationTimeline=function(){this._animations=[],this.currentTime=void 0},b.AnimationTimeline.prototype={getAnimations:function(){return this._discardAnimations(),this._animations.slice()},_updateAnimationsPromises:function(){b.animationsWithPromises=b.animationsWithPromises.filter(function(a){return a._updatePromises()})},_discardAnimations:function(){this._updateAnimationsPromises(),this._animations=this._animations.filter(function(a){return"finished"!=a.playState&&"idle"!=a.playState})},_play:function(a){var c=new b.Animation(a,this);return this._animations.push(c),b.restartWebAnimationsNextTick(),c._updatePromises(),c._animation.play(),c._updatePromises(),c},play:function(a){return a&&a.remove(),this._play(a)}};var f=!1;b.restartWebAnimationsNextTick=function(){f||(f=!0,requestAnimationFrame(d))};var g=new b.AnimationTimeline;b.timeline=g;try{Object.defineProperty(window.document,"timeline",{configurable:!0,get:function(){return g}})}catch(a){}try{window.document.timeline=g}catch(a){}}(0,e),function(a,b,c){b.animationsWithPromises=[],b.Animation=function(b,c){if(this.id="",b&&b._id&&(this.id=b._id),this.effect=b,b&&(b._animation=this),!c)throw new Error("Animation with null timeline is not supported");this._timeline=c,this._sequenceNumber=a.sequenceNumber++,this._holdTime=0,this._paused=!1,this._isGroup=!1,this._animation=null,this._childAnimations=[],this._callback=null,this._oldPlayState="idle",this._rebuildUnderlyingAnimation(),this._animation.cancel(),this._updatePromises()},b.Animation.prototype={_updatePromises:function(){var a=this._oldPlayState,b=this.playState;return this._readyPromise&&b!==a&&("idle"==b?(this._rejectReadyPromise(),this._readyPromise=void 0):"pending"==a?this._resolveReadyPromise():"pending"==b&&(this._readyPromise=void 0)),this._finishedPromise&&b!==a&&("idle"==b?(this._rejectFinishedPromise(),this._finishedPromise=void 0):"finished"==b?this._resolveFinishedPromise():"finished"==a&&(this._finishedPromise=void 0)),this._oldPlayState=this.playState,this._readyPromise||this._finishedPromise},_rebuildUnderlyingAnimation:function(){this._updatePromises();var a,c,d,e,f=!!this._animation;f&&(a=this.playbackRate,c=this._paused,d=this.startTime,e=this.currentTime,this._animation.cancel(),this._animation._wrapper=null,this._animation=null),(!this.effect||this.effect instanceof window.KeyframeEffect)&&(this._animation=b.newUnderlyingAnimationForKeyframeEffect(this.effect),b.bindAnimationForKeyframeEffect(this)),(this.effect instanceof window.SequenceEffect||this.effect instanceof window.GroupEffect)&&(this._animation=b.newUnderlyingAnimationForGroup(this.effect),b.bindAnimationForGroup(this)),this.effect&&this.effect._onsample&&b.bindAnimationForCustomEffect(this),f&&(1!=a&&(this.playbackRate=a),null!==d?this.startTime=d:null!==e?this.currentTime=e:null!==this._holdTime&&(this.currentTime=this._holdTime),c&&this.pause()),this._updatePromises()},_updateChildren:function(){if(this.effect&&"idle"!=this.playState){var a=this.effect._timing.delay;this._childAnimations.forEach(function(c){this._arrangeChildren(c,a),this.effect instanceof window.SequenceEffect&&(a+=b.groupChildDuration(c.effect))}.bind(this))}},_setExternalAnimation:function(a){if(this.effect&&this._isGroup)for(var b=0;b<this.effect.children.length;b++)this.effect.children[b]._animation=a,this._childAnimations[b]._setExternalAnimation(a)},_constructChildAnimations:function(){if(this.effect&&this._isGroup){var a=this.effect._timing.delay;this._removeChildAnimations(),this.effect.children.forEach(function(c){var d=b.timeline._play(c);this._childAnimations.push(d),d.playbackRate=this.playbackRate,this._paused&&d.pause(),c._animation=this.effect._animation,this._arrangeChildren(d,a),this.effect instanceof window.SequenceEffect&&(a+=b.groupChildDuration(c))}.bind(this))}},_arrangeChildren:function(a,b){null===this.startTime?a.currentTime=this.currentTime-b/this.playbackRate:a.startTime!==this.startTime+b/this.playbackRate&&(a.startTime=this.startTime+b/this.playbackRate)},get timeline(){return this._timeline},get playState(){return this._animation?this._animation.playState:"idle"},get finished(){return window.Promise?(this._finishedPromise||(-1==b.animationsWithPromises.indexOf(this)&&b.animationsWithPromises.push(this),this._finishedPromise=new Promise(function(a,b){this._resolveFinishedPromise=function(){a(this)},this._rejectFinishedPromise=function(){b({type:DOMException.ABORT_ERR,name:"AbortError"})}}.bind(this)),"finished"==this.playState&&this._resolveFinishedPromise()),this._finishedPromise):(console.warn("Animation Promises require JavaScript Promise constructor"),null)},get ready(){return window.Promise?(this._readyPromise||(-1==b.animationsWithPromises.indexOf(this)&&b.animationsWithPromises.push(this),this._readyPromise=new Promise(function(a,b){this._resolveReadyPromise=function(){a(this)},this._rejectReadyPromise=function(){b({type:DOMException.ABORT_ERR,name:"AbortError"})}}.bind(this)),"pending"!==this.playState&&this._resolveReadyPromise()),this._readyPromise):(console.warn("Animation Promises require JavaScript Promise constructor"),null)},get onfinish(){return this._animation.onfinish},set onfinish(a){this._animation.onfinish="function"==typeof a?function(b){b.target=this,a.call(this,b)}.bind(this):a},get oncancel(){return this._animation.oncancel},set oncancel(a){this._animation.oncancel="function"==typeof a?function(b){b.target=this,a.call(this,b)}.bind(this):a},get currentTime(){this._updatePromises();var a=this._animation.currentTime;return this._updatePromises(),a},set currentTime(a){this._updatePromises(),this._animation.currentTime=isFinite(a)?a:Math.sign(a)*Number.MAX_VALUE,this._register(),this._forEachChild(function(b,c){b.currentTime=a-c}),this._updatePromises()},get startTime(){return this._animation.startTime},set startTime(a){this._updatePromises(),this._animation.startTime=isFinite(a)?a:Math.sign(a)*Number.MAX_VALUE,this._register(),this._forEachChild(function(b,c){b.startTime=a+c}),this._updatePromises()},get playbackRate(){return this._animation.playbackRate},set playbackRate(a){this._updatePromises();var b=this.currentTime;this._animation.playbackRate=a,this._forEachChild(function(b){b.playbackRate=a}),null!==b&&(this.currentTime=b),this._updatePromises()},play:function(){this._updatePromises(),this._paused=!1,this._animation.play(),-1==this._timeline._animations.indexOf(this)&&this._timeline._animations.push(this),this._register(),b.awaitStartTime(this),this._forEachChild(function(a){var b=a.currentTime;a.play(),a.currentTime=b}),this._updatePromises()},pause:function(){this._updatePromises(),this.currentTime&&(this._holdTime=this.currentTime),this._animation.pause(),this._register(),this._forEachChild(function(a){a.pause()}),this._paused=!0,this._updatePromises()},finish:function(){this._updatePromises(),this._animation.finish(),this._register(),this._updatePromises()},cancel:function(){this._updatePromises(),this._animation.cancel(),this._register(),this._removeChildAnimations(),this._updatePromises()},reverse:function(){this._updatePromises();var a=this.currentTime;this._animation.reverse(),this._forEachChild(function(a){a.reverse()}),null!==a&&(this.currentTime=a),this._updatePromises()},addEventListener:function(a,b){var c=b;"function"==typeof b&&(c=function(a){a.target=this,b.call(this,a)}.bind(this),b._wrapper=c),this._animation.addEventListener(a,c)},removeEventListener:function(a,b){this._animation.removeEventListener(a,b&&b._wrapper||b)},_removeChildAnimations:function(){for(;this._childAnimations.length;)this._childAnimations.pop().cancel()},_forEachChild:function(b){var c=0;if(this.effect.children&&this._childAnimations.length<this.effect.children.length&&this._constructChildAnimations(),this._childAnimations.forEach(function(a){b.call(this,a,c),this.effect instanceof window.SequenceEffect&&(c+=a.effect.activeDuration)}.bind(this)),"pending"!=this.playState){var d=this.effect._timing,e=this.currentTime;null!==e&&(e=a.calculateIterationProgress(a.calculateActiveDuration(d),e,d)),(null==e||isNaN(e))&&this._removeChildAnimations()}}},window.Animation=b.Animation}(c,e),function(a,b,c){function d(b){this._frames=a.normalizeKeyframes(b)}function e(){for(var a=!1;i.length;)i.shift()._updateChildren(),a=!0;return a}var f=function(a){if(a._animation=void 0,a instanceof window.SequenceEffect||a instanceof window.GroupEffect)for(var b=0;b<a.children.length;b++)f(a.children[b])};b.removeMulti=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c];d._parent?(-1==b.indexOf(d._parent)&&b.push(d._parent),d._parent.children.splice(d._parent.children.indexOf(d),1),d._parent=null,f(d)):d._animation&&d._animation.effect==d&&(d._animation.cancel(),d._animation.effect=new KeyframeEffect(null,[]),d._animation._callback&&(d._animation._callback._animation=null),d._animation._rebuildUnderlyingAnimation(),f(d))}for(c=0;c<b.length;c++)b[c]._rebuild()},b.KeyframeEffect=function(b,c,e,f){return this.target=b,this._parent=null,e=a.numericTimingToObject(e),this._timingInput=a.cloneTimingInput(e),this._timing=a.normalizeTimingInput(e),this.timing=a.makeTiming(e,!1,this),this.timing._effect=this,"function"==typeof c?(a.deprecated("Custom KeyframeEffect","2015-06-22","Use KeyframeEffect.onsample instead."),this._normalizedKeyframes=c):this._normalizedKeyframes=new d(c),this._keyframes=c,this.activeDuration=a.calculateActiveDuration(this._timing),this._id=f,this},b.KeyframeEffect.prototype={getFrames:function(){return"function"==typeof this._normalizedKeyframes?this._normalizedKeyframes:this._normalizedKeyframes._frames},set onsample(a){if("function"==typeof this.getFrames())throw new Error("Setting onsample on custom effect KeyframeEffect is not supported.");this._onsample=a,this._animation&&this._animation._rebuildUnderlyingAnimation()},get parent(){return this._parent},clone:function(){if("function"==typeof this.getFrames())throw new Error("Cloning custom effects is not supported.");var b=new KeyframeEffect(this.target,[],a.cloneTimingInput(this._timingInput),this._id);return b._normalizedKeyframes=this._normalizedKeyframes,b._keyframes=this._keyframes,b},remove:function(){b.removeMulti([this])}};var g=Element.prototype.animate;Element.prototype.animate=function(a,c){var d="";return c&&c.id&&(d=c.id),b.timeline._play(new b.KeyframeEffect(this,a,c,d))};var h=document.createElementNS("http://www.w3.org/1999/xhtml","div");b.newUnderlyingAnimationForKeyframeEffect=function(a){if(a){var b=a.target||h,c=a._keyframes;"function"==typeof c&&(c=[]);var d=a._timingInput;d.id=a._id}else var b=h,c=[],d=0;return g.apply(b,[c,d])},b.bindAnimationForKeyframeEffect=function(a){a.effect&&"function"==typeof a.effect._normalizedKeyframes&&b.bindAnimationForCustomEffect(a)};var i=[];b.awaitStartTime=function(a){null===a.startTime&&a._isGroup&&(0==i.length&&requestAnimationFrame(e),i.push(a))};var j=window.getComputedStyle;Object.defineProperty(window,"getComputedStyle",{configurable:!0,enumerable:!0,value:function(){b.timeline._updateAnimationsPromises();var a=j.apply(this,arguments);return e()&&(a=j.apply(this,arguments)),b.timeline._updateAnimationsPromises(),a}}),window.KeyframeEffect=b.KeyframeEffect,window.Element.prototype.getAnimations=function(){return document.timeline.getAnimations().filter(function(a){return null!==a.effect&&a.effect.target==this}.bind(this))}}(c,e),function(a,b,c){function d(a){a._registered||(a._registered=!0,g.push(a),h||(h=!0,requestAnimationFrame(e)))}function e(a){var b=g;g=[],b.sort(function(a,b){return a._sequenceNumber-b._sequenceNumber}),b=b.filter(function(a){a();var b=a._animation?a._animation.playState:"idle";return"running"!=b&&"pending"!=b&&(a._registered=!1),a._registered}),g.push.apply(g,b),g.length?(h=!0,requestAnimationFrame(e)):h=!1}var f=(document.createElementNS("http://www.w3.org/1999/xhtml","div"),0);b.bindAnimationForCustomEffect=function(b){var c,e=b.effect.target,g="function"==typeof b.effect.getFrames();c=g?b.effect.getFrames():b.effect._onsample;var h=b.effect.timing,i=null;h=a.normalizeTimingInput(h);var j=function(){var d=j._animation?j._animation.currentTime:null;null!==d&&(d=a.calculateIterationProgress(a.calculateActiveDuration(h),d,h),isNaN(d)&&(d=null)),d!==i&&(g?c(d,e,b.effect):c(d,b.effect,b.effect._animation)),i=d};j._animation=b,j._registered=!1,j._sequenceNumber=f++,b._callback=j,d(j)};var g=[],h=!1;b.Animation.prototype._register=function(){this._callback&&d(this._callback)}}(c,e),function(a,b,c){function d(a){return a._timing.delay+a.activeDuration+a._timing.endDelay}function e(b,c,d){this._id=d,this._parent=null,this.children=b||[],this._reparent(this.children),c=a.numericTimingToObject(c),this._timingInput=a.cloneTimingInput(c),this._timing=a.normalizeTimingInput(c,!0),this.timing=a.makeTiming(c,!0,this),this.timing._effect=this,"auto"===this._timing.duration&&(this._timing.duration=this.activeDuration)}window.SequenceEffect=function(){e.apply(this,arguments)},window.GroupEffect=function(){e.apply(this,arguments)},e.prototype={_isAncestor:function(a){for(var b=this;null!==b;){if(b==a)return!0;b=b._parent}return!1},_rebuild:function(){for(var a=this;a;)"auto"===a.timing.duration&&(a._timing.duration=a.activeDuration),a=a._parent;this._animation&&this._animation._rebuildUnderlyingAnimation()},_reparent:function(a){b.removeMulti(a);for(var c=0;c<a.length;c++)a[c]._parent=this},_putChild:function(a,b){for(var c=b?"Cannot append an ancestor or self":"Cannot prepend an ancestor or self",d=0;d<a.length;d++)if(this._isAncestor(a[d]))throw{type:DOMException.HIERARCHY_REQUEST_ERR,name:"HierarchyRequestError",message:c};for(var d=0;d<a.length;d++)b?this.children.push(a[d]):this.children.unshift(a[d]);this._reparent(a),this._rebuild()},append:function(){this._putChild(arguments,!0)},prepend:function(){this._putChild(arguments,!1)},get parent(){return this._parent},get firstChild(){return this.children.length?this.children[0]:null},get lastChild(){return this.children.length?this.children[this.children.length-1]:null},clone:function(){for(var b=a.cloneTimingInput(this._timingInput),c=[],d=0;d<this.children.length;d++)c.push(this.children[d].clone());return this instanceof GroupEffect?new GroupEffect(c,b):new SequenceEffect(c,b)},remove:function(){b.removeMulti([this])}},window.SequenceEffect.prototype=Object.create(e.prototype),Object.defineProperty(window.SequenceEffect.prototype,"activeDuration",{get:function(){var a=0;return this.children.forEach(function(b){a+=d(b)}),Math.max(a,0)}}),window.GroupEffect.prototype=Object.create(e.prototype),Object.defineProperty(window.GroupEffect.prototype,"activeDuration",{get:function(){var a=0;return this.children.forEach(function(b){a=Math.max(a,d(b))}),a}}),b.newUnderlyingAnimationForGroup=function(c){var d,e=null,f=function(b){var c=d._wrapper;if(c&&"pending"!=c.playState&&c.effect)return null==b?void c._removeChildAnimations():0==b&&c.playbackRate<0&&(e||(e=a.normalizeTimingInput(c.effect.timing)),b=a.calculateIterationProgress(a.calculateActiveDuration(e),-1,e),isNaN(b)||null==b)?(c._forEachChild(function(a){a.currentTime=-1}),void c._removeChildAnimations()):void 0},g=new KeyframeEffect(null,[],c._timing,c._id);return g.onsample=f,d=b.timeline._play(g)},b.bindAnimationForGroup=function(a){a._animation._wrapper=a,a._isGroup=!0,b.awaitStartTime(a),a._constructChildAnimations(),a._setExternalAnimation(a)},b.groupChildDuration=d}(c,e),b.true=a}({},function(){return this}());
+//# sourceMappingURL=web-animations-next.min.js.map \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next.min.js.map b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next.min.js.map
new file mode 100644
index 00000000000..0646f1cfa3d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations-next.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["src/scope.js","src/timing-utilities.js","src/normalize-keyframes.js","src/deprecation.js","src/web-animations-bonus-cancel-events.js","src/web-animations-bonus-object-form-keyframes.js","src/timeline.js","src/web-animations-next-animation.js","src/keyframe-effect-constructor.js","src/effect-callback.js","src/group-constructors.js"],"names":["webAnimationsShared","webAnimations1","webAnimationsNext","shared","testing","cloneTimingInput","timingInput","clone","m","AnimationEffectTiming","this","_delay","_endDelay","_fill","_iterationStart","_iterations","_duration","_playbackRate","_direction","_easing","_easingFunction","linear","isInvalidTimingDeprecated","isDeprecated","makeTiming","forGroup","effect","timing","fill","duration","isNaN","Object","getOwnPropertyNames","forEach","property","fills","indexOf","directions","numericTimingToObject","normalizeTimingInput","cubic","a","b","c","d","x","f","start_gradient","end_gradient","start","end","mid","xEst","Math","abs","step","count","pos","stepSize","normalizeEasing","easing","styleForCleaning","document","createElement","style","animationTimingFunction","normalizedEasing","TypeError","parseEasingFunction","cubicData","cubicBezierRe","exec","apply","slice","map","Number","stepData","stepRe","Start","middle","Middle","End","presets","calculateActiveDuration","repeatedDuration","playbackRate","iterations","calculatePhase","activeDuration","localTime","PhaseNone","endTime","delay","endDelay","min","PhaseBefore","PhaseAfter","PhaseActive","calculateActiveTime","fillMode","phase","calculateOverallProgress","iterationDuration","activeTime","iterationStart","overallProgress","calculateSimpleIterationProgress","simpleIterationProgress","Infinity","calculateCurrentIteration","floor","calculateDirectedProgress","playbackDirection","currentIteration","currentDirection","calculateIterationProgress","directedProgress","direction","split","prototype","_setMember","member","value","_effect","_timingInput","_timing","_animation","_rebuildUnderlyingAnimation","ease","ease-in","ease-out","ease-in-out","step-start","step-middle","step-end","numberString","RegExp","antiAlias","aliases","isNotAnimatable","lastIndexOf","expandShorthandAndAntiAlias","result","longProperties","shorthandToLonghand","shorthandExpanderElem","i","longProperty","longhandValue","convertToArrayForm","effectInput","normalizedEffectInput","values","Array","isArray","keyframe","numKeyframes","length","offset","composite","push","sort","normalizeKeyframes","spaceKeyframes","keyframes","previousIndex","previousOffset","j","window","Symbol","iterator","from","originalKeyframe","memberValue","isFinite","type","DOMException","NOT_SUPPORTED_ERR","name","message","everyFrameHasOffset","filter","background","border","borderBottom","borderColor","borderLeft","borderRadius","borderRight","borderTop","borderWidth","flex","font","margin","outline","padding","createElementNS","borderWidthAliases","thin","medium","thick","borderBottomWidth","borderLeftWidth","borderRightWidth","borderTopWidth","fontSize","xx-small","x-small","small","large","x-large","xx-large","fontWeight","normal","bold","outlineWidth","textShadow","none","boxShadow","silenced","feature","date","advice","plural","auxVerb","today","Date","expiry","setMonth","getMonth","console","warn","toDateString","deprecated","Error","animate","oncancel","now","performance","AnimationCancelEvent","target","currentTime","timelineTime","bubbles","cancelable","currentTarget","defaultPrevented","eventPhase","Event","AT_TARGET","timeStamp","originalElementAnimate","Element","options","animation","call","_cancelHandlers","originalCancel","cancel","event","handlers","concat","setTimeout","handler","originalAddEventListener","addEventListener","originalRemoveEventListener","removeEventListener","index","splice","element","documentElement","animated","originalOpacity","getComputedStyle","getPropertyValue","testOpacity","opacity","error","scope","webAnimationsNextTick","t","timeline","_discardAnimations","_animations","ticking","requestAnimationFrame","originalRequestAnimationFrame","_updateAnimationsPromises","AnimationTimeline","getAnimations","animationsWithPromises","_updatePromises","playState","_play","Animation","restartWebAnimationsNextTick","play","remove","defineProperty","configurable","get","e","id","_id","_timeline","_sequenceNumber","sequenceNumber","_holdTime","_paused","_isGroup","_childAnimations","_callback","_oldPlayState","oldPlayState","newPlayState","_readyPromise","_rejectReadyPromise","_resolveReadyPromise","_finishedPromise","_rejectFinishedPromise","_resolveFinishedPromise","oldPlaybackRate","oldPaused","oldStartTime","oldCurrentTime","hadUnderlying","startTime","_wrapper","KeyframeEffect","newUnderlyingAnimationForKeyframeEffect","bindAnimationForKeyframeEffect","SequenceEffect","GroupEffect","newUnderlyingAnimationForGroup","bindAnimationForGroup","_onsample","bindAnimationForCustomEffect","pause","_updateChildren","childAnimation","_arrangeChildren","groupChildDuration","bind","_setExternalAnimation","children","_constructChildAnimations","_removeChildAnimations","child","finished","Promise","resolve","reject","ABORT_ERR","ready","onfinish","v","sign","MAX_VALUE","_register","_forEachChild","awaitStartTime","time","finish","reverse","wrapped","pop","KeyframeList","_frames","updatePendingGroups","updated","pendingGroups","shift","disassociate","removeMulti","effects","oldParents","_parent","_rebuild","_normalizedKeyframes","_keyframes","getFrames","onsample","callback","parent","nullTarget","keyframeEffect","groupAnimation","originalGetComputedStyle","enumerable","arguments","register","_registered","callbacks","tick","updating","left","right","effectFunction","isKeyframeEffect","last","node","constructor","_reparent","_isAncestor","newChildren","_putChild","args","isAppend","HIERARCHY_REQUEST_ERR","unshift","append","prepend","firstChild","lastChild","clonedTiming","clonedChildren","create","total","max","group","underlyingAnimation","ticker","tf","underlyingEffect","exports","webAnimationsTesting"],"mappings":";;;;;;;;;;;;;;CAcA,SAAIA,EAAAA,GAAJ,GAAIA,MACAC,KACAC,MCFJ,SAAUC,EAAQC,GAMhB,QAASC,GAAiBC,GACxB,GAA0B,gBAAfA,GACT,MAAOA,EAET,IAAIC,KACJ,KAAK,GAAIC,KAAKF,GACZC,EAAMC,GAAKF,EAAYE,EAEzB,OAAOD,GAGT,QAASE,KACPC,KAAKC,OAAS,EACdD,KAAKE,UAAY,EACjBF,KAAKG,MAAQ,OACbH,KAAKI,gBAAkB,EACvBJ,KAAKK,YAAc,EACnBL,KAAKM,UAAY,EACjBN,KAAKO,cAAgB,EACrBP,KAAKQ,WAAa,SAClBR,KAAKS,QAAU,SACfT,KAAKU,gBAAkBC,EAGzB,QAASC,KACP,MAAOnB,GAAOoB,aAAa,wBAAyB,aAAc,gDAAA,GA8EpE,QAASC,GAAWlB,EAAamB,EAAUC,GACzC,GAAIC,GAAS,GAAIlB,EA4BjB,OA3BIgB,KACFE,EAAOC,KAAO,OACdD,EAAOE,SAAW,QAEM,gBAAfvB,IAA4BwB,MAAMxB,OAAAA,KAElCA,GACTyB,OAAOC,oBAAoB1B,GAAa2B,QAAQ,SAASC,GACvD,GAA6B,QAAzB5B,EAAY4B,GAAqB,CACnC,IAA+B,gBAApBP,GAAOO,IAAqC,YAAZA,KACL,gBAAzB5B,GAAY4B,IAAyBJ,MAAMxB,EAAY4B,KAChE,MAGJ,IAAiB,QAAZA,IAAiE,GAAzCC,EAAMC,QAAQ9B,EAAY4B,IACrD,MAEF,IAAiB,aAAZA,IAA2E,GAA9CG,EAAWD,QAAQ9B,EAAY4B,IAC/D,MAEF,IAAgB,gBAAZA,GAAwD,IAA1B5B,EAAY4B,IAAmB/B,EAAOoB,aAAa,qCAAsC,aAAc,uCACvI,MAEFI,GAAOO,GAAY5B,EAAY4B,MAlBnCP,EAAOE,SAAWvB,EAsBbqB,EAGT,QAASW,GAAsBhC,GAQ7B,MAP0B,gBAAfA,KAEPA,EADEwB,MAAMxB,IACQuB,SAAU,IAEVA,SAAUvB,IAGvBA,EAGT,QAASiC,GAAqBjC,EAAamB,GAEzC,MADAnB,GAAcH,EAAOmC,sBAAsBhC,GACpCkB,EAAWlB,EAAamB,GAGjC,QAASe,GAAMC,EAAGC,EAAGC,EAAGC,GACtB,MAAIH,GAAI,GAAKA,EAAI,GAAKE,EAAI,GAAKA,EAAI,EAC1BtB,EAEF,SAASwB,GAqBZ,QAASC,GAAEL,EAAGC,EAAGlC,GAAK,MAAO,GAAIiC,GAAK,EAAIjC,IAAM,EAAIA,GAAKA,EAAI,EAAIkC,GAAK,EAAIlC,GAAKA,EAAIA,EAAIA,EAAIA,EAAIA,EApBjG,GAAIqC,GAAK,EAAG,CACV,GAAIE,GAAiB,CAKrB,OAJIN,GAAI,EACNM,EAAiBL,EAAID,GACbC,GAAKC,EAAI,IACjBI,EAAiBH,EAAID,GAChBI,EAAiBF,EAE1B,GAAIA,GAAK,EAAG,CACV,GAAIG,GAAe,CAKnB,OAJIL,GAAI,EACNK,GAAgBJ,EAAI,IAAMD,EAAI,GAClB,GAALA,GAAUF,EAAI,IACrBO,GAAgBN,EAAI,IAAMD,EAAI,IACzB,EAAIO,GAAgBH,EAAI,GAIjC,IADA,GAAII,GAAQ,EAAGC,EAAM,EACdD,EAAQC,GAAK,CAClB,GAAIC,IAAOF,EAAQC,GAAO,EAEtBE,EAAON,EAAEL,EAAGE,EAAGQ,EACnB,IAAIE,KAAKC,IAAIT,EAAIO,GAAQ,KACvB,MAAON,GAAEJ,EAAGE,EAAGO,EAEbC,GAAOP,EACTI,EAAQE,EAERD,EAAMC,EAGV,MAAOL,GAAEJ,EAAGE,EAAGO,IAQnB,QAASI,GAAKC,EAAOC,GACnB,MAAO,UAASZ,GACd,GAAIA,GAAK,EACP,MAAO,EAET,IAAIa,GAAW,EAAIF,CAEnB,QADAX,GAAKY,EAAMC,GACAb,EAAIa,GAmBnB,QAASC,GAAgBC,GAClBC,IACHA,EAAmBC,SAASC,cAAc,OAAOC,OAEnDH,EAAiBI,wBAA0B,GAC3CJ,EAAiBI,wBAA0BL,CAC3C,IAAIM,GAAmBL,EAAiBI,uBACxC,IAAwB,IAApBC,GAA0B5C,IAC5B,KAAM,IAAI6C,WAAUP,EAAS,mCAE/B,OAAOM,GAGT,QAASE,GAAoBF,GAC3B,GAAwB,UAApBA,EACF,MAAO7C,EAET,IAAIgD,GAAYC,EAAcC,KAAKL,EACnC,IAAIG,EACF,MAAO7B,GAAMgC,MAAM9D,KAAM2D,EAAUI,MAAM,GAAGC,IAAIC,QAElD,IAAIC,GAAWC,EAAON,KAAKL,EAC3B,OAAIU,GACKrB,EAAKoB,OAAOC,EAAS,KAAM3B,MAAS6B,EAAOC,OAAUC,EAAQ9B,IAAO+B,GAAKL,EAAS,KAE9EM,EAAQhB,IAMd7C,EAGT,QAAS8D,GAAwBxD,GAC/B,MAAO0B,MAAKC,IAAI8B,EAAiBzD,GAAUA,EAAO0D,cAGpD,QAASD,GAAiBzD,GAExB,MAAwB,KAApBA,EAAOE,UAAwC,IAAtBF,EAAO2D,WAC3B,EAEF3D,EAAOE,SAAWF,EAAO2D,WAQlC,QAASC,GAAeC,EAAgBC,EAAW9D,GAEjD,GAAiB,MAAb8D,EACF,MAAOC,EAGT,IAAIC,GAAUhE,EAAOiE,MAAQJ,EAAiB7D,EAAOkE,QACrD,OAAIJ,GAAYpC,KAAKyC,IAAInE,EAAOiE,MAAOD,GAC9BI,EAELN,GAAapC,KAAKyC,IAAInE,EAAOiE,MAAQJ,EAAgBG,GAChDK,EAGFC,EAGT,QAASC,GAAoBV,EAAgBW,EAAUV,EAAWW,EAAOR,GAEvE,OAAQQ,GACN,IAAKL,GACH,MAAgB,aAAZI,GAAuC,QAAZA,EACtB,EACF,IACT,KAAKF,GACH,MAAOR,GAAYG,CACrB,KAAKI,GACH,MAAgB,YAAZG,GAAsC,QAAZA,EACrBX,EACF,IACT,KAAKE,GACH,MAAO,OAIb,QAASW,GAAyBC,EAAmBF,EAAOd,EAAYiB,EAAYC,GAElF,GAAIC,GAAkBD,CAQtB,OAP0B,KAAtBF,EACEF,IAAUL,IACZU,GAAmBnB,GAGrBmB,GAAmBF,EAAaD,EAE3BG,EAGT,QAASC,GAAiCD,EAAiBD,EAAgBJ,EAAOd,EAAYiB,EAAYD,GAGxG,GAAIK,GAA2BF,IAAoBG,EAAAA,EAAYJ,EAAiB,EAAIC,EAAkB,CAKtG,OAJgC,KAA5BE,GAAiCP,IAAUJ,GAA6B,IAAfV,GACzC,IAAfiB,GAA0C,IAAtBD,IACvBK,EAA0B,GAErBA,EAGT,QAASE,GAA0BT,EAAOd,EAAYqB,EAAyBF,GAE7E,MAAIL,KAAUJ,GAAcV,IAAesB,EAAAA,EAClCA,EAAAA,EAEuB,IAA5BD,EACKtD,KAAKyD,MAAML,GAAmB,EAEhCpD,KAAKyD,MAAML,GAGpB,QAASM,GAA0BC,EAAmBC,EAAkBN,GAEtE,GAAIO,GAAmBF,CACvB,IAA0B,WAAtBA,GAAwD,YAAtBA,EAAiC,CACrE,GAAIpE,GAAIqE,CACkB,uBAAtBD,IACFpE,GAAK,GAEPsE,EAAmB,SACftE,IAAMgE,EAAAA,GAAYhE,EAAI,GAAM,IAC9BsE,EAAmB,WAGvB,MAAyB,WAArBA,EACKP,EAEF,EAAIA,EAGb,QAASQ,GAA2B3B,EAAgBC,EAAW9D,GAC7D,GAAIyE,GAAQb,EAAeC,EAAgBC,EAAW9D,GAClD4E,EAAaL,EAAoBV,EAAgB7D,EAAOC,KAAM6D,EAAWW,EAAOzE,EAAOiE,MAC3F,IAAmB,OAAfW,EACF,MAAO,KAET,IAAIE,GAAkBJ,EAAyB1E,EAAOE,SAAUuE,EAAOzE,EAAO2D,WAAYiB,EAAY5E,EAAO6E,gBACzGG,EAA0BD,EAAiCD,EAAiB9E,EAAO6E,eAAgBJ,EAAOzE,EAAO2D,WAAYiB,EAAY5E,EAAOE,UAChJoF,EAAmBJ,EAA0BT,EAAOzE,EAAO2D,WAAYqB,EAAyBF,GAChGW,EAAmBL,EAA0BpF,EAAO0F,UAAWJ,EAAkBN,EAIrF,OAAOhF,GAAOP,gBAAgBgG,GA1XhC,GAAIjF,GAAQ,+BAA+BmF,MAAM,KAC7CjF,EAAa,sCAAsCiF,MAAM,KACzDjG,EAAS,SAASwB,GAAK,MAAOA,GA8BlCpC,GAAsB8G,WACpBC,WAAY,SAASC,EAAQC,GAC3BhH,KAAK,IAAM+G,GAAUC,EACjBhH,KAAKiH,UACPjH,KAAKiH,QAAQC,aAAaH,GAAUC,EACpChH,KAAKiH,QAAQE,QAAU1H,EAAOoC,qBAAqB7B,KAAKiH,QAAQC,cAChElH,KAAKiH,QAAQnC,eAAiBrF,EAAOgF,wBAAwBzE,KAAKiH,QAAQE,SACtEnH,KAAKiH,QAAQG,YACfpH,KAAKiH,QAAQG,WAAWC,gCAI9B1C,mBACE,MAAO3E,MAAKO,eAEd2E,UAAU8B,GACRhH,KAAK8G,WAAW,QAASE,IAE3B9B,YACE,MAAOlF,MAAKC,QAEdkF,aAAa6B,GACXhH,KAAK8G,WAAW,WAAYE,IAE9B7B,eACE,MAAOnF,MAAKE,WAEdgB,SAAS8F,GACPhH,KAAK8G,WAAW,OAAQE,IAE1B9F,WACE,MAAOlB,MAAKG,OAEd2F,mBAAmBkB,GACjB,IAAK5F,MAAM4F,IAAUA,EAAQ,IAAMpG,IACjC,KAAM,IAAI6C,WAAU,2DAA6DxC,OAAO6E,eAE1F9F,MAAK8G,WAAW,iBAAkBE,IAEpClB,qBACE,MAAO9F,MAAKI,iBAEde,aAAa6F,GACX,GAAa,QAATA,IAAoB5F,MAAM4F,IAAUA,EAAQ,IAAMpG,IACpD,KAAM,IAAI6C,WAAU,oDAAsDuD,EAE5EhH,MAAK8G,WAAW,WAAYE,IAE9B7F,eACE,MAAOnB,MAAKM,WAEdqG,cAAcK,GACZhH,KAAK8G,WAAW,YAAaE,IAE/BL,gBACE,MAAO3G,MAAKQ,YAEd0C,WAAW8D,GACThH,KAAKU,gBAAkBgD,EAAoBT,EAAgB+D,IAC3DhH,KAAK8G,WAAW,SAAUE,IAE5B9D,aACE,MAAOlD,MAAKS,SAEdmE,eAAeoC,GACb,IAAK5F,MAAM4F,IAAUA,EAAQ,IAAMpG,IACjC,KAAM,IAAI6C,WAAU,8CAAgDuD,EAEtEhH,MAAK8G,WAAW,aAAcE,IAEhCpC,iBACE,MAAO5E,MAAKK,aA4FhB,IAAI+D,GAAQ,EACRE,EAAS,GACTC,EAAM,EAaNC,GACF8C,KAAQxF,EAAM,IAAM,GAAK,IAAM,GAC/ByF,UAAWzF,EAAM,IAAM,EAAG,EAAG,GAC7B0F,WAAY1F,EAAM,EAAG,EAAG,IAAM,GAC9B2F,cAAe3F,EAAM,IAAM,EAAG,IAAM,GACpC4F,aAAc7E,EAAK,EAAGuB,GACtBuD,cAAe9E,EAAK,EAAGyB,GACvBsD,WAAY/E,EAAK,EAAG0B,IAGlBpB,EAAmB,KACnB0E,EAAe,qCACfjE,EAAgB,GAAIkE,QAAO,kBAAoBD,EAAe,IAAMA,EAAe,IAAMA,EAAe,IAAMA,EAAe,OAC7H1D,EAAS,gDAgDTa,EAAY,EACZK,EAAc,EACdC,EAAa,EACbC,EAAc,CA2GlB9F,GAAOE,iBAAmBA,EAC1BF,EAAOqB,WAAaA,EACpBrB,EAAOmC,sBAAwBA,EAC/BnC,EAAOoC,qBAAuBA,EAC9BpC,EAAOgF,wBAA0BA,EACjChF,EAAOgH,2BAA6BA,EACpChH,EAAOoF,eAAiBA,EACxBpF,EAAOwD,gBAAkBA,EACzBxD,EAAOiE,oBAAsBA,GAc5BpE,GCrZH,SAAUG,EAAQC,GAmIhB,QAASqI,GAAUvG,EAAUwF,GAC3B,MAAIxF,KAAYwG,GACPA,EAAQxG,GAAUwF,IAAUA,EAE9BA,EAGT,QAASiB,GAAgBzG,GAEvB,MAAoB,YAAbA,GAAmE,IAAzCA,EAAS0G,YAAY,YAAa,IAAsD,IAA1C1G,EAAS0G,YAAY,aAAc,GAIpH,QAASC,GAA4B3G,EAAUwF,EAAOoB,GACpD,IAAIH,EAAgBzG,GAApB,CAGA,GAAI6G,GAAiBC,EAAoB9G,EACzC,IAAI6G,EAAgB,CAClBE,EAAsBjF,MAAM9B,GAAYwF,CACxC,KAAK,GAAIwB,KAAKH,GAAgB,CAC5B,GAAII,GAAeJ,EAAeG,GAC9BE,EAAgBH,EAAsBjF,MAAMmF,EAChDL,GAAOK,GAAgBV,EAAUU,EAAcC,QAGjDN,GAAO5G,GAAYuG,EAAUvG,EAAUwF,IAI3C,QAAS2B,GAAmBC,GAC1B,GAAIC,KAEJ,KAAK,GAAIrH,KAAYoH,GACnB,KAAIpH,KAAa,SAAU,SAAU,cAArC,CAIA,GAAIsH,GAASF,EAAYpH,EACpBuH,OAAMC,QAAQF,KACjBA,GAAUA,GAKZ,KAAK,GAFDG,GACAC,EAAeJ,EAAOK,OACjBX,EAAI,EAAGA,EAAIU,EAAcV,IAChCS,KAGEA,EAASG,OADP,UAAYR,GACIA,EAAYQ,OACL,GAAhBF,EACS,EAEAV,GAAKU,EAAe,GAGpC,UAAYN,KACdK,EAAS/F,OAAS0F,EAAY1F,QAG5B,aAAe0F,KACjBK,EAASI,UAAYT,EAAYS,WAGnCJ,EAASzH,GAAYsH,EAAON,GAE5BK,EAAsBS,KAAKL,GAK/B,MADAJ,GAAsBU,KAAK,SAASxH,EAAGC,GAAK,MAAOD,GAAEqH,OAASpH,EAAEoH,SACzDP,EAGT,QAASW,GAAmBZ,GAqE1B,QAASa,KACP,GAAIN,GAASO,EAAUP,MACa,OAAhCO,EAAUP,EAAS,GAAGC,SACxBM,EAAUP,EAAS,GAAGC,OAAS,GAC7BD,EAAS,GAA4B,MAAvBO,EAAU,GAAGN,SAC7BM,EAAU,GAAGN,OAAS,EAIxB,KAAK,GAFDO,GAAgB,EAChBC,EAAiBF,EAAU,GAAGN,OACzBZ,EAAI,EAAGA,EAAIW,EAAQX,IAAK,CAC/B,GAAIY,GAASM,EAAUlB,GAAGY,MAC1B,IAAc,MAAVA,EAAgB,CAClB,IAAK,GAAIS,GAAI,EAAGA,EAAIrB,EAAImB,EAAeE,IACrCH,EAAUC,EAAgBE,GAAGT,OAASQ,GAAkBR,EAASQ,GAAkBC,GAAKrB,EAAImB,EAC9FA,GAAgBnB,EAChBoB,EAAiBR,IAnFvB,GAAmB,MAAfR,EACF,QAGEkB,QAAOC,QAAUA,OAAOC,UAAYjB,MAAMlC,UAAUoD,MAAQrB,EAAYmB,OAAOC,YAEjFpB,EAAcG,MAAMkB,KAAKrB,IAGtBG,MAAMC,QAAQJ,KACjBA,EAAcD,EAAmBC,GA0CnC,KAAK,GAvCDc,GAAYd,EAAY5E,IAAI,SAASkG,GACvC,GAAIjB,KACJ,KAAK,GAAIlC,KAAUmD,GAAkB,CACnC,GAAIC,GAAcD,EAAiBnD,EACnC,IAAc,UAAVA,GACF,GAAmB,MAAfoD,EAAqB,CAEvB,GADAA,EAAclG,OAAOkG,IAChBC,SAASD,GACZ,KAAM,IAAI1G,WAAU,oCACtB,IAAI0G,EAAc,GAAKA,EAAc,EACnC,KAAM,IAAI1G,WAAU,kDAEnB,IAAc,aAAVsD,EAAuB,CAChC,GAAmB,OAAfoD,GAAuC,cAAfA,EAC1B,MACEE,KAAMC,aAAaC,kBACnBC,KAAM,oBACNC,QAAS,mCAEN,IAAmB,WAAfN,EACT,KAAM,IAAI1G,WAAU,0BAA4B0G,EAAc,SAGhEA,GADmB,UAAVpD,EACKtH,EAAOwD,gBAAgBkH,GAEvB,GAAKA,CAErBhC,GAA4BpB,EAAQoD,EAAalB,GAMnD,WAAA,IAJIA,EAASG,SACXH,EAASG,OAAS,UAAA,IAChBH,EAAS/F,SACX+F,EAAS/F,OAAS,UACb+F,IAGLyB,GAAAA,EAEAd,GAAAA,EAAAA,EACKpB,EAAI,EAAGA,EAAIkB,EAAUP,OAAQX,IAAK,CACzC,GAAIY,GAASM,EAAUlB,GAAGY,MAC1B,IAAc,MAAVA,EAAgB,CAClB,GAAIA,EAASQ,EACX,KAAM,IAAInG,WAAU,uEAEtBmG,GAAiBR,MAEjBsB,IAAAA,EA8BJ,MA1BAhB,GAAYA,EAAUiB,OAAO,SAAS1B,GACpC,MAAOA,GAASG,QAAU,GAAKH,EAASG,QAAU,IAsB/CsB,GACHjB,IAEKC,EAvST,GAAIpB,IACFsC,YACE,kBACA,qBACA,iBACA,mBACA,uBACA,mBACA,iBACA,mBAEFC,QACE,iBACA,iBACA,iBACA,mBACA,mBACA,mBACA,oBACA,oBACA,oBACA,kBACA,kBACA,mBAEFC,cACE,oBACA,oBACA,qBAEFC,aACE,iBACA,mBACA,oBACA,mBAEFC,YACE,kBACA,kBACA,mBAEFC,cACE,sBACA,uBACA,0BACA,0BAEFC,aACE,mBACA,mBACA,oBAEFC,WACE,iBACA,iBACA,kBAEFC,aACE,iBACA,mBACA,oBACA,mBAEFC,MACE,WACA,aACA,aAEFC,MACE,aACA,WACA,YACA,cACA,aACA,cAEFC,QACE,YACA,cACA,eACA,cAEFC,SACE,eACA,eACA,gBAEFC,SACE,aACA,eACA,gBACA,gBAIAlD,EAAwBnF,SAASsI,gBAAgB,+BAAgC,OAEjFC,GACFC,KAAM,MACNC,OAAQ,MACRC,MAAO,OAGL9D,GACF+D,kBAAmBJ,EACnBK,gBAAiBL,EACjBM,iBAAkBN,EAClBO,eAAgBP,EAChBQ,UACEC,WAAY,MACZC,UAAW,MACXC,MAAS,MACTT,OAAU,OACVU,MAAS,OACTC,UAAW,OACXC,WAAY,QAEdC,YACEC,OAAQ,MACRC,KAAM,OAERC,aAAclB,EACdmB,YACEC,KAAM,2BAERC,WACED,KAAM,+BA4KVtN,GAAOkJ,mBAAqBA,EAC5BlJ,EAAO+J,mBAAqBA,GAM3BlK,GClTH,SAAUG,GAER,GAAIwN,KAEJxN,GAAOoB,aAAe,SAASqM,EAASC,EAAMC,EAAQC,GAKpD,GAAIC,GAAUD,EAAS,MAAQ,KAC3BE,EAAQ,GAAIC,MACZC,EAAS,GAAID,MAAKL,EAGtB,OAFAM,GAAOC,SAASD,EAAOE,WAAa,KAEhCJ,EAAQE,IACJP,IAAWD,IACfW,QAAQC,KAAK,mBAAqBX,EAAU,IAAMI,EAAU,wCAA0CG,EAAOK,eAAiB,KAAOV,GAEvIH,EAASC,IAAAA,EAAW,KAOxBzN,EAAOsO,WAAa,SAASb,EAASC,EAAMC,EAAQC,GAClD,GAAIC,GAAUD,EAAS,MAAQ,IAC/B,IAAI5N,EAAOoB,aAAaqM,EAASC,EAAMC,EAAQC,GAC7C,KAAM,IAAIW,OAAMd,EAAU,IAAMI,EAAU,yBAA2BF,KAIxE9N,62mCChCH,WAEE,OAAA,KAAI8D,SAASC,cAAc,OAAO4K,YAAYC,SAA9C,CAKE,GAAIC,EACC,IAAIrE,OAAOsE,aAAeA,YAAYD,IAC3C,GAAIA,GAAM,WAAa,MAAOC,aAAYD,WAE1C,IAAIA,GAAM,WAAa,MAAOX,MAAKW,MAGrC,IAAIE,GAAuB,SAASC,EAAQC,EAAaC,GACvDxO,KAAKsO,OAASA,EACdtO,KAAKuO,YAAcA,EACnBvO,KAAKwO,aAAeA,EAEpBxO,KAAKqK,KAAO,SACZrK,KAAKyO,SAAAA,EACLzO,KAAK0O,YAAAA,EACL1O,KAAK2O,cAAgBL,EACrBtO,KAAK4O,kBAAAA,EACL5O,KAAK6O,WAAaC,MAAMC,UACxB/O,KAAKgP,UAAYxB,KAAKW,OAGpBc,EAAyBnF,OAAOoF,QAAQrI,UAAUoH,OACtDnE,QAAOoF,QAAQrI,UAAUoH,QAAU,SAASrF,EAAauG,GACvD,GAAIC,GAAYH,EAAuBI,KAAKrP,KAAM4I,EAAauG,EAE/DC,GAAUE,mBACVF,EAAUlB,SAAW,IAErB,IAAIqB,GAAiBH,EAAUI,MAC/BJ,GAAUI,OAAS,WACjBD,EAAeF,KAAKrP,KACpB,IAAIyP,GAAQ,GAAIpB,GAAqBrO,KAAM,KAAMmO,KAC7CuB,EAAW1P,KAAKsP,gBAAgBK,OAAO3P,KAAKkO,UAAYlO,KAAKkO,aACjE0B,YAAW,WACTF,EAASnO,QAAQ,SAASsO,GACxBA,EAAQR,KAAKI,EAAMnB,OAAQmB,MAE5B,GAGL,IAAIK,GAA2BV,EAAUW,gBACzCX,GAAUW,iBAAmB,SAAS1F,EAAMwF,GACpB,kBAAXA,IAAiC,UAARxF,EAClCrK,KAAKsP,gBAAgBhG,KAAKuG,GAE1BC,EAAyBT,KAAKrP,KAAMqK,EAAMwF,GAG9C,IAAIG,GAA8BZ,EAAUa,mBAW5C,OAVAb,GAAUa,oBAAsB,SAAS5F,EAAMwF,GAC7C,GAAY,UAARxF,EAAkB,CACpB,GAAI6F,GAAQlQ,KAAKsP,gBAAgB5N,QAAQmO,EACrCK,IAAS,GACXlQ,KAAKsP,gBAAgBa,OAAOD,EAAO,OAErCF,GAA4BX,KAAKrP,KAAMqK,EAAMwF,IAI1CT,OClEX,SAAU3P,GAgBR,GAAI2Q,GAAUhN,SAASiN,gBACnBjB,EAAY,KACZkB,GAAAA,CACJ,KACE,GAAIC,GAAkBC,iBAAiBJ,GAASK,iBAAiB,WAC7DC,EAAiC,KAAnBH,EAAyB,IAAM,GACjDnB,GAAYgB,EAAQnC,SAAS0C,SAAYD,EAAaA,KACjDvP,SAAU,IACfiO,EAAUb,YAAc,EACxB+B,EAAWE,iBAAiBJ,GAASK,iBAAiB,YAAcC,EACpE,MAAOE,IACP,QACIxB,GACFA,EAAUI,SAEd,IAAIc,EAAJ,CAIA,GAAIrB,GAAyBnF,OAAOoF,QAAQrI,UAAUoH,OACtDnE,QAAOoF,QAAQrI,UAAUoH,QAAU,SAASrF,EAAauG,GAUvD,MATIrF,QAAOC,QAAUA,OAAOC,UAAYjB,MAAMlC,UAAUoD,MAAQrB,EAAYmB,OAAOC,YAEjFpB,EAAcG,MAAMkB,KAAKrB,IAGtBG,MAAMC,QAAQJ,IAAgC,OAAhBA,IACjCA,EAAcnJ,EAAOkJ,mBAAmBC,IAGnCqG,EAAuBI,KAAKrP,KAAM4I,EAAauG,MAEvD7P,GC/CH,SAAUG,EAAQoR,EAAOnR,GA8DvB,QAASoR,GAAsBC,GAC7B,GAAIC,GAAWH,EAAMG,QACrBA,GAASzC,YAAcwC,EACvBC,EAASC,qBAC0B,GAA/BD,EAASE,YAAY/H,OACvBgI,GAAAA,EAEAC,sBAAsBN,GApE1B,GAAIO,GAAgCvH,OAAOsH,qBAC3CtH,QAAOsH,sBAAwB,SAAShP,GACtC,MAAOiP,GAA8B,SAASlP,GAC5C0O,EAAMG,SAASM,4BACflP,EAAED,GACF0O,EAAMG,SAASM,+BAInBT,EAAMU,kBAAoB,WACxBvR,KAAKkR,eACLlR,KAAKuO,gBAAAA,IAGPsC,EAAMU,kBAAkB1K,WACtB2K,cAAe,WAEb,MADAxR,MAAKiR,qBACEjR,KAAKkR,YAAYnN,SAE1BuN,0BAA2B,WACzBT,EAAMY,uBAAyBZ,EAAMY,uBAAuB9G,OAAO,SAASyE,GAC1E,MAAOA,GAAUsC,qBAGrBT,mBAAoB,WAClBjR,KAAKsR,4BACLtR,KAAKkR,YAAclR,KAAKkR,YAAYvG,OAAO,SAASyE,GAClD,MAA8B,YAAvBA,EAAUuC,WAAkD,QAAvBvC,EAAUuC,aAG1DC,MAAO,SAAS5Q,GACd,GAAIoO,GAAY,GAAIyB,GAAMgB,UAAU7Q,EAAQhB,KAW5C,OAVAA,MAAKkR,YAAY5H,KAAK8F,GACtByB,EAAMiB,+BAMN1C,EAAUsC,kBACVtC,EAAUhI,WAAW2K,OACrB3C,EAAUsC,kBACHtC,GAET2C,KAAM,SAAS/Q,GAIb,MAHIA,IACFA,EAAOgR,SAEFhS,KAAK4R,MAAM5Q,IAItB,IAAImQ,IAAAA,CAEJN,GAAMiB,6BAA+B,WAC9BX,IACHA,GAAAA,EACAC,sBAAsBN,IAc1B,IAAIE,GAAW,GAAIH,GAAMU,iBACzBV,GAAMG,SAAWA,CAEjB,KACE3P,OAAO4Q,eAAenI,OAAO1G,SAAU,YACrC8O,cAAAA,EACAC,IAAK,WAAa,MAAOnB,MAE3B,MAAOoB,IACT,IACEtI,OAAO1G,SAAS4N,SAAWA,EAC3B,MAAOoB,MAER9S,EAAqBE,GCtFxB,SAAUC,EAAQoR,EAAOnR,GACvBmR,EAAMY,0BAENZ,EAAMgB,UAAY,SAAS7Q,EAAQgQ,GASjC,GARAhR,KAAKqS,GAAK,GACNrR,GAAUA,EAAOsR,MACnBtS,KAAKqS,GAAKrR,EAAOsR,KAEnBtS,KAAKgB,OAASA,EACVA,IACFA,EAAOoG,WAAapH,OAEjBgR,EACH,KAAM,IAAIhD,OAAM,gDAElBhO,MAAKuS,UAAYvB,EACjBhR,KAAKwS,gBAAkB/S,EAAOgT,iBAC9BzS,KAAK0S,UAAY,EACjB1S,KAAK2S,SAAAA,EACL3S,KAAK4S,UAAAA,EACL5S,KAAKoH,WAAa,KAClBpH,KAAK6S,oBACL7S,KAAK8S,UAAY,KACjB9S,KAAK+S,cAAgB,OACrB/S,KAAKqH,8BAELrH,KAAKoH,WAAWoI,SAChBxP,KAAK0R,mBAGPb,EAAMgB,UAAUhL,WACd6K,gBAAiB,WACf,GAAIsB,GAAehT,KAAK+S,cACpBE,EAAejT,KAAK2R,SAsBxB,OArBI3R,MAAKkT,eAAiBD,IAAiBD,IACrB,QAAhBC,GACFjT,KAAKmT,sBACLnT,KAAKkT,kBAAAA,IACoB,WAAhBF,EACThT,KAAKoT,uBACoB,WAAhBH,IACTjT,KAAKkT,kBAAAA,KAGLlT,KAAKqT,kBAAoBJ,IAAiBD,IACxB,QAAhBC,GACFjT,KAAKsT,yBACLtT,KAAKqT,qBAAAA,IACoB,YAAhBJ,EACTjT,KAAKuT,0BACoB,YAAhBP,IACThT,KAAKqT,qBAAAA,KAGTrT,KAAK+S,cAAgB/S,KAAK2R,UAClB3R,KAAKkT,eAAiBlT,KAAKqT,kBAErChM,4BAA6B,WAC3BrH,KAAK0R,iBACL,IAAI8B,GACAC,EACAC,EACAC,EACAC,IAAgB5T,KAAKoH,UACrBwM,KACFJ,EAAkBxT,KAAK2E,aACvB8O,EAAYzT,KAAK2S,QACjBe,EAAe1T,KAAK6T,UACpBF,EAAiB3T,KAAKuO,YACtBvO,KAAKoH,WAAWoI,SAChBxP,KAAKoH,WAAW0M,SAAW,KAC3B9T,KAAKoH,WAAa,QAGfpH,KAAKgB,QAAUhB,KAAKgB,iBAAkB8I,QAAOiK,kBAChD/T,KAAKoH,WAAayJ,EAAMmD,wCAAwChU,KAAKgB,QACrE6P,EAAMoD,+BAA+BjU,QAEnCA,KAAKgB,iBAAkB8I,QAAOoK,gBAAkBlU,KAAKgB,iBAAkB8I,QAAOqK,eAChFnU,KAAKoH,WAAayJ,EAAMuD,+BAA+BpU,KAAKgB,QAC5D6P,EAAMwD,sBAAsBrU,OAE1BA,KAAKgB,QAAUhB,KAAKgB,OAAOsT,WAC7BzD,EAAM0D,6BAA6BvU,MAEjC4T,IACqB,GAAnBJ,IACFxT,KAAK2E,aAAe6O,GAED,OAAjBE,EACF1T,KAAK6T,UAAYH,EACW,OAAnBC,EACT3T,KAAKuO,YAAcoF,EACS,OAAnB3T,KAAK0S,YACd1S,KAAKuO,YAAcvO,KAAK0S,WAEtBe,GACFzT,KAAKwU,SAGTxU,KAAK0R,mBAEP+C,gBAAiB,WACf,GAAKzU,KAAKgB,QAA4B,QAAlBhB,KAAK2R,UAAzB,CAGA,GAAIvI,GAASpJ,KAAKgB,OAAOmG,QAAQjC,KACjClF,MAAK6S,iBAAiBtR,QAAQ,SAASmT,GACrC1U,KAAK2U,iBAAiBD,EAAgBtL,GAClCpJ,KAAKgB,iBAAkB8I,QAAOoK,iBAChC9K,GAAUyH,EAAM+D,mBAAmBF,EAAe1T,UACpD6T,KAAK7U,SAET8U,sBAAuB,SAAS1F,GAC9B,GAAKpP,KAAKgB,QAAWhB,KAAK4S,SAE1B,IAAK,GAAIpK,GAAI,EAAGA,EAAIxI,KAAKgB,OAAO+T,SAAS5L,OAAQX,IAC/CxI,KAAKgB,OAAO+T,SAASvM,GAAGpB,WAAagI,EACrCpP,KAAK6S,iBAAiBrK,GAAGsM,sBAAsB1F,IAGnD4F,0BAA2B,WACzB,GAAKhV,KAAKgB,QAAWhB,KAAK4S,SAA1B,CAEA,GAAIxJ,GAASpJ,KAAKgB,OAAOmG,QAAQjC,KACjClF,MAAKiV,yBACLjV,KAAKgB,OAAO+T,SAASxT,QAAQ,SAAS2T,GACpC,GAAIR,GAAiB7D,EAAMG,SAASY,MAAMsD,EAC1ClV,MAAK6S,iBAAiBvJ,KAAKoL,GAC3BA,EAAe/P,aAAe3E,KAAK2E,aAC/B3E,KAAK2S,SACP+B,EAAeF,QACjBU,EAAM9N,WAAapH,KAAKgB,OAAOoG,WAE/BpH,KAAK2U,iBAAiBD,EAAgBtL,GAElCpJ,KAAKgB,iBAAkB8I,QAAOoK,iBAChC9K,GAAUyH,EAAM+D,mBAAmBM,KACrCL,KAAK7U,SAET2U,iBAAkB,SAASD,EAAgBtL,GAClB,OAAnBpJ,KAAK6T,UACPa,EAAenG,YAAcvO,KAAKuO,YAAcnF,EAASpJ,KAAK2E,aACrD+P,EAAeb,YAAc7T,KAAK6T,UAAYzK,EAASpJ,KAAK2E,eACrE+P,EAAeb,UAAY7T,KAAK6T,UAAYzK,EAASpJ,KAAK2E,eAG9DqM,eACE,MAAOhR,MAAKuS,WAEdZ,gBACE,MAAO3R,MAAKoH,WAAapH,KAAKoH,WAAWuK,UAAY,QAEvDwD,eACE,MAAKrL,QAAOsL,SAIPpV,KAAKqT,oBAC2C,GAA/CxC,EAAMY,uBAAuB/P,QAAQ1B,OACvC6Q,EAAMY,uBAAuBnI,KAAKtJ,MAEpCA,KAAKqT,iBAAmB,GAAI+B,SACxB,SAASC,EAASC,GAChBtV,KAAKuT,wBAA0B,WAC7B8B,EAAQrV,OAEVA,KAAKsT,uBAAyB,WAC5BgC,GAAQjL,KAAMC,aAAaiL,UAAW/K,KAAM,iBAE9CqK,KAAK7U,OACW,YAAlBA,KAAK2R,WACP3R,KAAKuT,2BAGFvT,KAAKqT,mBApBVzF,QAAQC,KAAK,6DACN,OAqBX2H,YACE,MAAK1L,QAAOsL,SAIPpV,KAAKkT,iBAC2C,GAA/CrC,EAAMY,uBAAuB/P,QAAQ1B,OACvC6Q,EAAMY,uBAAuBnI,KAAKtJ,MAEpCA,KAAKkT,cAAgB,GAAIkC,SACrB,SAASC,EAASC,GAChBtV,KAAKoT,qBAAuB,WAC1BiC,EAAQrV,OAEVA,KAAKmT,oBAAsB,WACzBmC,GAAQjL,KAAMC,aAAaiL,UAAW/K,KAAM,iBAE9CqK,KAAK7U,OACY,YAAnBA,KAAK2R,WACP3R,KAAKoT,wBAGFpT,KAAKkT,gBApBVtF,QAAQC,KAAK,6DACN,OAqBX4H,eACE,MAAOzV,MAAKoH,WAAWqO,UAEzBA,aAAaC,GAET1V,KAAKoH,WAAWqO,SADF,kBAALC,GACkB,SAAUtD,GACnCA,EAAE9D,OAAStO,KACX0V,EAAErG,KAAKrP,KAAMoS,IACZyC,KAAK7U,MAEmB0V,GAG/BxH,eACE,MAAOlO,MAAKoH,WAAW8G,UAEzBA,aAAawH,GAET1V,KAAKoH,WAAW8G,SADF,kBAALwH,GACkB,SAAUtD,GACnCA,EAAE9D,OAAStO,KACX0V,EAAErG,KAAKrP,KAAMoS,IACZyC,KAAK7U,MAEmB0V,GAG/BnH,kBACEvO,KAAK0R,iBACL,IAAInD,GAAcvO,KAAKoH,WAAWmH,WAElC,OADAvO,MAAK0R,kBACEnD,GAETA,gBAAgBmH,GACd1V,KAAK0R,kBACL1R,KAAKoH,WAAWmH,YAAcnE,SAASsL,GAAKA,EAAI/S,KAAKgT,KAAKD,GAAKzR,OAAO2R,UACtE5V,KAAK6V,YACL7V,KAAK8V,cAAc,SAASZ,EAAO9L,GACjC8L,EAAM3G,YAAcmH,EAAItM,IAE1BpJ,KAAK0R,mBAEPmC,gBACE,MAAO7T,MAAKoH,WAAWyM,WAEzBA,cAAc6B,GACZ1V,KAAK0R,kBACL1R,KAAKoH,WAAWyM,UAAYzJ,SAASsL,GAAKA,EAAI/S,KAAKgT,KAAKD,GAAKzR,OAAO2R,UACpE5V,KAAK6V,YACL7V,KAAK8V,cAAc,SAASZ,EAAO9L,GACjC8L,EAAMrB,UAAY6B,EAAItM,IAExBpJ,KAAK0R,mBAEP/M,mBACE,MAAO3E,MAAKoH,WAAWzC,cAEzBA,iBAAiBqC,GACfhH,KAAK0R,iBACL,IAAIiC,GAAiB3T,KAAKuO,WAC1BvO,MAAKoH,WAAWzC,aAAeqC,EAC/BhH,KAAK8V,cAAc,SAASpB,GAC1BA,EAAe/P,aAAeqC,IAET,OAAnB2M,IACF3T,KAAKuO,YAAcoF,GAErB3T,KAAK0R,mBAEPK,KAAM,WACJ/R,KAAK0R,kBACL1R,KAAK2S,SAAAA,EACL3S,KAAKoH,WAAW2K,QACiC,GAA7C/R,KAAKuS,UAAUrB,YAAYxP,QAAQ1B,OACrCA,KAAKuS,UAAUrB,YAAY5H,KAAKtJ,MAElCA,KAAK6V,YACLhF,EAAMkF,eAAe/V,MACrBA,KAAK8V,cAAc,SAASZ,GAC1B,GAAIc,GAAOd,EAAM3G,WACjB2G,GAAMnD,OACNmD,EAAM3G,YAAcyH,IAEtBhW,KAAK0R,mBAEP8C,MAAO,WACLxU,KAAK0R,kBACD1R,KAAKuO,cACPvO,KAAK0S,UAAY1S,KAAKuO,aAExBvO,KAAKoH,WAAWoN,QAChBxU,KAAK6V,YACL7V,KAAK8V,cAAc,SAASZ,GAC1BA,EAAMV,UAERxU,KAAK2S,SAAAA,EACL3S,KAAK0R,mBAEPuE,OAAQ,WACNjW,KAAK0R,kBACL1R,KAAKoH,WAAW6O,SAChBjW,KAAK6V,YACL7V,KAAK0R,mBAEPlC,OAAQ,WACNxP,KAAK0R,kBACL1R,KAAKoH,WAAWoI,SAChBxP,KAAK6V,YACL7V,KAAKiV,yBACLjV,KAAK0R,mBAEPwE,QAAS,WACPlW,KAAK0R,iBACL,IAAIiC,GAAiB3T,KAAKuO,WAC1BvO,MAAKoH,WAAW8O,UAChBlW,KAAK8V,cAAc,SAASpB,GAC1BA,EAAewB,YAEM,OAAnBvC,IACF3T,KAAKuO,YAAcoF,GAErB3T,KAAK0R,mBAEP3B,iBAAkB,SAAS1F,EAAMwF,GAC/B,GAAIsG,GAAUtG,CACQ,mBAAXA,KACTsG,EAAU,SAAU/D,GAClBA,EAAE9D,OAAStO,KACX6P,EAAQR,KAAKrP,KAAMoS,IAClByC,KAAK7U,MACR6P,EAAQiE,SAAWqC,GAErBnW,KAAKoH,WAAW2I,iBAAiB1F,EAAM8L,IAEzClG,oBAAqB,SAAS5F,EAAMwF,GAClC7P,KAAKoH,WAAW6I,oBAAoB5F,EAAOwF,GAAWA,EAAQiE,UAAajE,IAE7EoF,uBAAwB,WACtB,KAAOjV,KAAK6S,iBAAiB1J,QAC3BnJ,KAAK6S,iBAAiBuD,MAAM5G,UAEhCsG,cAAe,SAAS1T,GACtB,GAAIgH,GAAS,CASb,IARIpJ,KAAKgB,OAAO+T,UAAY/U,KAAK6S,iBAAiB1J,OAASnJ,KAAKgB,OAAO+T,SAAS5L,QAC9EnJ,KAAKgV,4BACPhV,KAAK6S,iBAAiBtR,QAAQ,SAAS2T,GACrC9S,EAAEiN,KAAKrP,KAAMkV,EAAO9L,GAChBpJ,KAAKgB,iBAAkB8I,QAAOoK,iBAChC9K,GAAU8L,EAAMlU,OAAO8D,iBACzB+P,KAAK7U,OAEe,WAAlBA,KAAK2R,UAAT,CAEA,GAAI1Q,GAASjB,KAAKgB,OAAOmG,QACrB4J,EAAI/Q,KAAKuO,WACH,QAANwC,IACFA,EAAItR,EAAOgH,2BAA2BhH,EAAOgF,wBAAwBxD,GAAS8P,EAAG9P,KAC1E,MAAL8P,GAAa3P,MAAM2P,KACrB/Q,KAAKiV,4BAIXnL,OAAO+H,UAAYhB,EAAMgB,WAMxBvS,EAAqBE,GChXvB,SAASC,EAAQoR,EAAOnR,GAqCvB,QAAS2W,GAAazN,GACpB5I,KAAKsW,QAAU7W,EAAO+J,mBAAmBZ,GAoG3C,QAAS2N,KAEP,IADA,GAAIC,IAAAA,EACGC,EAActN,QACPsN,EAAcC,QACpBjC,kBACN+B,GAAAA,CAEF,OAAOA,GA/IT,GAAIG,GAAe,SAAS3V,GAE1B,GADAA,EAAOoG,eAAAA,GACHpG,YAAkB8I,QAAOoK,gBAAkBlT,YAAkB8I,QAAOqK,YACtE,IAAK,GAAI3L,GAAI,EAAGA,EAAIxH,EAAO+T,SAAS5L,OAAQX,IAC1CmO,EAAa3V,EAAO+T,SAASvM,IAKnCqI,GAAM+F,YAAc,SAASC,GAE3B,IAAK,GADDC,MACKtO,EAAI,EAAGA,EAAIqO,EAAQ1N,OAAQX,IAAK,CACvC,GAAIxH,GAAS6V,EAAQrO,EACjBxH,GAAO+V,UACkC,GAAvCD,EAAWpV,QAAQV,EAAO+V,UAC5BD,EAAWxN,KAAKtI,EAAO+V,SAEzB/V,EAAO+V,QAAQhC,SAAS5E,OAAOnP,EAAO+V,QAAQhC,SAASrT,QAAQV,GAAS,GACxEA,EAAO+V,QAAU,KACjBJ,EAAa3V,IACJA,EAAOoG,YAAepG,EAAOoG,WAAWpG,QAAUA,IAC3DA,EAAOoG,WAAWoI,SAClBxO,EAAOoG,WAAWpG,OAAS,GAAI+S,gBAAe,SAC1C/S,EAAOoG,WAAW0L,YACpB9R,EAAOoG,WAAW0L,UAAU1L,WAAa,MAE3CpG,EAAOoG,WAAWC,8BAClBsP,EAAa3V,IAGjB,IAAKwH,EAAI,EAAGA,EAAIsO,EAAW3N,OAAQX,IACjCsO,EAAWtO,GAAGwO,YAQlBnG,EAAMkD,eAAiB,SAASzF,EAAQ1F,EAAahJ,EAAayS,GAmBhE,MAlBArS,MAAKsO,OAASA,EACdtO,KAAK+W,QAAU,KAEfnX,EAAcH,EAAOmC,sBAAsBhC,GAC3CI,KAAKkH,aAAezH,EAAOE,iBAAiBC,GAC5CI,KAAKmH,QAAU1H,EAAOoC,qBAAqBjC,GAE3CI,KAAKiB,OAASxB,EAAOqB,WAAWlB,GAAAA,EAAoBI,MACpDA,KAAKiB,OAAOgG,QAAUjH,KACI,kBAAf4I,IACTnJ,EAAOsO,WAAW,wBAAyB,aAAc,wCACzD/N,KAAKiX,qBAAuBrO,GAE5B5I,KAAKiX,qBAAuB,GAAIZ,GAAazN,GAE/C5I,KAAKkX,WAAatO,EAClB5I,KAAK8E,eAAiBrF,EAAOgF,wBAAwBzE,KAAKmH,SAC1DnH,KAAKsS,IAAMD,EACJrS,MAGT6Q,EAAMkD,eAAelN,WACnBsQ,UAAW,WACT,MAAwC,kBAA7BnX,MAAKiX,qBACPjX,KAAKiX,qBACPjX,KAAKiX,qBAAqBX,SAEnCc,aAAaC,GACX,GAA+B,kBAApBrX,MAAKmX,YACd,KAAM,IAAInJ,OAAM,qEAElBhO,MAAKsU,UAAY+C,EACbrX,KAAKoH,YACPpH,KAAKoH,WAAWC,+BAGpBiQ,aACE,MAAOtX,MAAK+W,SAEdlX,MAAO,WACL,GAA+B,kBAApBG,MAAKmX,YACd,KAAM,IAAInJ,OAAM,2CAElB,IAAInO,GAAQ,GAAIkU,gBAAe/T,KAAKsO,UAAY7O,EAAOE,iBAAiBK,KAAKkH,cAAelH,KAAKsS,IAGjG,OAFAzS,GAAMoX,qBAAuBjX,KAAKiX,qBAClCpX,EAAMqX,WAAalX,KAAKkX,WACjBrX,GAETmS,OAAQ,WACNnB,EAAM+F,aAAa5W,QAIvB,IAAIiP,GAAyBC,QAAQrI,UAAUoH,OAC/CiB,SAAQrI,UAAUoH,QAAU,SAASrF,EAAauG,GAChD,GAAIkD,GAAK,EAIT,OAHIlD,IAAWA,EAAQkD,KACrBA,EAAKlD,EAAQkD,IAERxB,EAAMG,SAASY,MAAM,GAAIf,GAAMkD,eAAe/T,KAAM4I,EAAauG,EAASkD,IAGnF,IAAIkF,GAAanU,SAASsI,gBAAgB,+BAAgC,MAC1EmF,GAAMmD,wCAA0C,SAASwD,GACvD,GAAIA,EAAgB,CAClB,GAAIlJ,GAASkJ,EAAelJ,QAAUiJ,EAClC7N,EAAY8N,EAAeN,UACP,mBAAbxN,KACTA,KAEF,IAAIyF,GAAUqI,EAAetQ,YAC7BiI,GAAQkD,GAAKmF,EAAelF,QAE5B,IAAIhE,GAASiJ,EACT7N,KACAyF,EAAU,CAEhB,OAAOF,GAAuBnL,MAAMwK,GAAS5E,EAAWyF,KAI1D0B,EAAMoD,+BAAiC,SAAS7E,GAC1CA,EAAUpO,QAA0D,kBAAzCoO,GAAUpO,OAAOiW,sBAC9CpG,EAAM0D,6BAA6BnF,GAIvC,IAAIqH,KACJ5F,GAAMkF,eAAiB,SAAS0B,GACG,OAA7BA,EAAe5D,WAAuB4D,EAAe7E,WAE7B,GAAxB6D,EAActN,QAChBiI,sBAAsBmF,GAExBE,EAAcnN,KAAKmO,IAWrB,IAAIC,GAA2B5N,OAAO0G,gBACtCnP,QAAO4Q,eAAenI,OAAQ,oBAC5BoI,cAAAA,EACAyF,YAAAA,EACA3Q,MAAO,WACL6J,EAAMG,SAASM,2BACf,IAAIlJ,GAASsP,EAAyB5T,MAAM9D,KAAM4X,UAIlD,OAHIrB,OACFnO,EAASsP,EAAyB5T,MAAM9D,KAAM4X,YAChD/G,EAAMG,SAASM,4BACRlJ,KAIX0B,OAAOiK,eAAiBlD,EAAMkD,eAC9BjK,OAAOoF,QAAQrI,UAAU2K,cAAgB,WACvC,MAAOpO,UAAS4N,SAASQ,gBAAgB7G,OAAO,SAASyE,GACvD,MAA4B,QAArBA,EAAUpO,QAAmBoO,EAAUpO,OAAOsN,QAAUtO,MAC/D6U,KAAK7U,SAGTV,EAAqBE,GCzKvB,SAAUC,EAAQoR,EAAOnR,GA6CvB,QAASmY,GAASR,GACZA,EAASS,cAEbT,EAASS,aAAAA,EACTC,EAAUzO,KAAK+N,GACVlG,IACHA,GAAAA,EACAC,sBAAsB4G,KAI1B,QAASA,GAAKjH,GACZ,GAAIkH,GAAWF,CACfA,MACAE,EAAS1O,KAAK,SAAS2O,EAAMC,GAC3B,MAAOD,GAAK1F,gBAAkB2F,EAAM3F,kBAEtCyF,EAAWA,EAAStN,OAAO,SAAS0M,GAClCA,GACA,IAAI1F,GAAY0F,EAASjQ,WAAaiQ,EAASjQ,WAAWuK,UAAY,MAGtE,OAFiB,WAAbA,GAAuC,WAAbA,IAC5B0F,EAASS,aAAAA,GACJT,EAASS,cAElBC,EAAUzO,KAAKxF,MAAMiU,EAAWE,GAE5BF,EAAU5O,QACZgI,GAAAA,EACAC,sBAAsB4G,IAEtB7G,GAAAA,EAzEJ,GAEIsB,IAFarP,SAASsI,gBAAgB,+BAAgC,OAErD,EACrBmF,GAAM0D,6BAA+B,SAASnF,GAC5C,GACIgJ,GADA9J,EAASc,EAAUpO,OAAOsN,OAE1B+J,EAA0D,kBAAhCjJ,GAAUpO,OAAOmW,WAE7CiB,GADEC,EACejJ,EAAUpO,OAAOmW,YAEjB/H,EAAUpO,OAAOsT,SAEpC,IAAIrT,GAASmO,EAAUpO,OAAOC,OAC1BqX,EAAO,IACXrX,GAASxB,EAAOoC,qBAAqBZ,EACrC,IAAIoW,GAAW,WACb,GAAItG,GAAIsG,EAASjQ,WAAaiQ,EAASjQ,WAAWmH,YAAc,IACtD,QAANwC,IACFA,EAAItR,EAAOgH,2BAA2BhH,EAAOgF,wBAAwBxD,GAAS8P,EAAG9P,GAC7EG,MAAM2P,KACRA,EAAI,OAIJA,IAAMuH,IACJD,EACFD,EAAerH,EAAGzC,EAAQc,EAAUpO,QAEpCoX,EAAerH,EAAG3B,EAAUpO,OAAQoO,EAAUpO,OAAOoG,aAGzDkR,EAAOvH,EAGTsG,GAASjQ,WAAagI,EACtBiI,EAASS,aAAAA,EACTT,EAAS7E,gBAAkBC,IAC3BrD,EAAU0D,UAAYuE,EACtBQ,EAASR,GAGX,IAAIU,MACA5G,GAAAA,CAmCJN,GAAMgB,UAAUhL,UAAUgP,UAAY,WAChC7V,KAAK8S,WACP+E,EAAS7X,KAAK8S,aAGjBxT,EAAqBE,GCnFxB,SAAUC,EAAQoR,EAAOnR,GAEvB,QAASkV,GAAmB2D,GAC1B,MAAOA,GAAKpR,QAAQjC,MAAQqT,EAAKzT,eAAiByT,EAAKpR,QAAQhC,SAGjE,QAASqT,GAAYzD,EAAUnV,EAAayS,GAC1CrS,KAAKsS,IAAMD,EACXrS,KAAK+W,QAAU,KACf/W,KAAK+U,SAAWA,MAChB/U,KAAKyY,UAAUzY,KAAK+U,UACpBnV,EAAcH,EAAOmC,sBAAsBhC,GAC3CI,KAAKkH,aAAezH,EAAOE,iBAAiBC,GAC5CI,KAAKmH,QAAU1H,EAAOoC,qBAAqBjC,GAAAA,GAC3CI,KAAKiB,OAASxB,EAAOqB,WAAWlB,GAAAA,EAAmBI,MACnDA,KAAKiB,OAAOgG,QAAUjH,KAEQ,SAA1BA,KAAKmH,QAAQhG,WACfnB,KAAKmH,QAAQhG,SAAWnB,KAAK8E,gBAIjCgF,OAAOoK,eAAiB,WACtBsE,EAAY1U,MAAM9D,KAAM4X,YAG1B9N,OAAOqK,YAAc,WACnBqE,EAAY1U,MAAM9D,KAAM4X,YAG1BY,EAAY3R,WACV6R,YAAa,SAAS1X,GAEpB,IADA,GAAIe,GAAI/B,KACK,OAAN+B,GAAY,CACjB,GAAIA,GAAKf,EACP,OAAA,CACFe,GAAIA,EAAEgV,QAER,OAAA,GAEFC,SAAU,WAGR,IADA,GAAIuB,GAAOvY,KACJuY,GACwB,SAAzBA,EAAKtX,OAAOE,WACdoX,EAAKpR,QAAQhG,SAAWoX,EAAKzT,gBAE/ByT,EAAOA,EAAKxB,OAEV/W,MAAKoH,YACPpH,KAAKoH,WAAWC,+BAGpBoR,UAAW,SAASE,GAClB9H,EAAM+F,YAAY+B,EAClB,KAAK,GAAInQ,GAAI,EAAGA,EAAImQ,EAAYxP,OAAQX,IACtCmQ,EAAYnQ,GAAGuO,QAAU/W,MAG7B4Y,UAAW,SAASC,EAAMC,GAExB,IAAK,GADDrO,GAAUqO,EAAW,oCAAsC,qCACtDtQ,EAAI,EAAGA,EAAIqQ,EAAK1P,OAAQX,IAC/B,GAAIxI,KAAK0Y,YAAYG,EAAKrQ,IACxB,MACE6B,KAAMC,aAAayO,sBACnBvO,KAAM,wBACNC,QAASA,EAKf,KAAK,GAAIjC,GAAI,EAAGA,EAAIqQ,EAAK1P,OAAQX,IAC/BsQ,EAAW9Y,KAAK+U,SAASzL,KAAKuP,EAAKrQ,IAAMxI,KAAK+U,SAASiE,QAAQH,EAAKrQ,GAEtExI,MAAKyY,UAAUI,GACf7Y,KAAKgX,YAEPiC,OAAQ,WACNjZ,KAAK4Y,UAAUhB,WAAAA,IAEjBsB,QAAS,WACPlZ,KAAK4Y,UAAUhB,WAAAA,IAEjBN,aACE,MAAOtX,MAAK+W,SAEdoC,iBACE,MAAOnZ,MAAK+U,SAAS5L,OAASnJ,KAAK+U,SAAS,GAAK,MAEnDqE,gBACE,MAAOpZ,MAAK+U,SAAS5L,OAASnJ,KAAK+U,SAAS/U,KAAK+U,SAAS5L,OAAS,GAAK,MAE1EtJ,MAAO,WAGL,IAAK,GAFDwZ,GAAe5Z,EAAOE,iBAAiBK,KAAKkH,cAC5CoS,KACK9Q,EAAI,EAAGA,EAAIxI,KAAK+U,SAAS5L,OAAQX,IACxC8Q,EAAehQ,KAAKtJ,KAAK+U,SAASvM,GAAG3I,QAEvC,OAAQG,gBAAgBmU,aACpB,GAAIA,aAAYmF,EAAgBD,GAChC,GAAInF,gBAAeoF,EAAgBD,IAEzCrH,OAAQ,WACNnB,EAAM+F,aAAa5W,SAIvB8J,OAAOoK,eAAerN,UAAYxF,OAAOkY,OAAOf,EAAY3R,WAC5DxF,OAAO4Q,eACHnI,OAAOoK,eAAerN,UACtB,kBAEEsL,IAAK,WACH,GAAIqH,GAAQ,CAIZ,OAHAxZ,MAAK+U,SAASxT,QAAQ,SAAS2T,GAC7BsE,GAAS5E,EAAmBM,KAEvBvS,KAAK8W,IAAID,EAAO,MAI/B1P,OAAOqK,YAAYtN,UAAYxF,OAAOkY,OAAOf,EAAY3R,WACzDxF,OAAO4Q,eACHnI,OAAOqK,YAAYtN,UACnB,kBAEEsL,IAAK,WACH,GAAIsH,GAAM,CAIV,OAHAzZ,MAAK+U,SAASxT,QAAQ,SAAS2T,GAC7BuE,EAAM9W,KAAK8W,IAAIA,EAAK7E,EAAmBM,MAElCuE,KAIf5I,EAAMuD,+BAAiC,SAASsF,GAC9C,GAAIC,GACA1Y,EAAS,KACT2Y,EAAS,SAASC,GACpB,GAAIzK,GAAYuK,EAAoB7F,QACpC,IAAK1E,GAGsB,WAAvBA,EAAUuC,WAGTvC,EAAUpO,OAGf,MAAU,OAAN6Y,MACFzK,GAAU6F,yBAQF,GAAN4E,GAAWzK,EAAUzK,aAAe,IACjC1D,IACHA,EAASxB,EAAOoC,qBAAqBuN,EAAUpO,OAAOC,SAExD4Y,EAAKpa,EAAOgH,2BAA2BhH,EAAOgF,wBAAwBxD,IAAU,EAAGA,GAC/EG,MAAMyY,IAAa,MAANA,IACfzK,EAAU0G,cAAc,SAASZ,GAC/BA,EAAM3G,aAAe,QAEvBa,GAAU6F,8BAAAA,IAMZ6E,EAAmB,GAAI/F,gBAAe,QAAU2F,EAAMvS,QAASuS,EAAMpH,IAGzE,OAFAwH,GAAiB1C,SAAWwC,EAC5BD,EAAsB9I,EAAMG,SAASY,MAAMkI,IAI7CjJ,EAAMwD,sBAAwB,SAASjF,GACrCA,EAAUhI,WAAW0M,SAAW1E,EAChCA,EAAUwD,UAAAA,EACV/B,EAAMkF,eAAe3G,GACrBA,EAAU4F,4BACV5F,EAAU0F,sBAAsB1F,IAGlCyB,EAAM+D,mBAAqBA,GAE1BtV,EAAqBE,GV3LpBA,EAAAA,KAEJua,MACMC,WAAAA,MAAuBha","file":"web-animations-next.min.js"} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations.html
new file mode 100644
index 00000000000..b5de36c855e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations.html
@@ -0,0 +1,50 @@
+<!--
+ Copyright 2014 Google Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- WARNING: This file is DEPRECATED, for development purposes use
+ web-animations*.dev.html instead or depend on
+ web-animations*.min.js in the web-animations-js
+ repository -->
+
+<script src="src/dev.js"></script>
+<script src="src/scope.js"></script>
+<script src="src/deprecation.js"></script>
+<script src="src/timing-utilities.js"></script>
+<script src="src/normalize-keyframes.js"></script>
+<script src="src/animation-node.js"></script>
+<script src="src/effect.js"></script>
+<script src="src/property-interpolation.js"></script>
+<script src="src/animation.js"></script>
+<script src="src/apply.js"></script>
+<script src="src/element-animatable.js"></script>
+<script src="src/interpolation.js"></script>
+<script src="src/player.js"></script>
+<script src="src/tick.js"></script>
+<script src="src/handler-utils.js"></script>
+<script src="src/shadow-handler.js"></script>
+<script src="src/number-handler.js"></script>
+<script src="src/visibility-handler.js"></script>
+<script src="src/color-handler.js"></script>
+<script src="src/dimension-handler.js"></script>
+<script src="src/box-handler.js"></script>
+<script src="src/transform-handler.js"></script>
+<script src="src/property-names.js"></script>
+<script src="src/timeline.js"></script>
+<script src="src/maxifill-player.js"></script>
+<script src="src/animation-constructor.js"></script>
+<script src="src/effect-callback.js"></script>
+<script src="src/group-constructors.js"></script>
+
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations.min.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations.min.html
new file mode 100644
index 00000000000..b36940d336c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations.min.html
@@ -0,0 +1 @@
+<script src="./web-animations.min.js"></script>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations.min.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations.min.js
new file mode 100644
index 00000000000..46156b20940
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations.min.js
@@ -0,0 +1,16 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+!function(a,b){var c={},d={};!function(a,b){function c(a){if("number"==typeof a)return a;var b={};for(var c in a)b[c]=a[c];return b}function d(){this._delay=0,this._endDelay=0,this._fill="none",this._iterationStart=0,this._iterations=1,this._duration=0,this._playbackRate=1,this._direction="normal",this._easing="linear",this._easingFunction=x}function e(){return a.isDeprecated("Invalid timing inputs","2016-03-02","TypeError exceptions will be thrown instead.",!0)}function f(b,c,e){var f=new d;return c&&(f.fill="both",f.duration="auto"),"number"!=typeof b||isNaN(b)?void 0!==b&&Object.getOwnPropertyNames(b).forEach(function(c){if("auto"!=b[c]){if(("number"==typeof f[c]||"duration"==c)&&("number"!=typeof b[c]||isNaN(b[c])))return;if("fill"==c&&-1==v.indexOf(b[c]))return;if("direction"==c&&-1==w.indexOf(b[c]))return;if("playbackRate"==c&&1!==b[c]&&a.isDeprecated("AnimationEffectTiming.playbackRate","2014-11-28","Use Animation.playbackRate instead."))return;f[c]=b[c]}}):f.duration=b,f}function g(a){return"number"==typeof a&&(a=isNaN(a)?{duration:0}:{duration:a}),a}function h(b,c){return b=a.numericTimingToObject(b),f(b,c)}function i(a,b,c,d){return a<0||a>1||c<0||c>1?x:function(e){function f(a,b,c){return 3*a*(1-c)*(1-c)*c+3*b*(1-c)*c*c+c*c*c}if(e<=0){var g=0;return a>0?g=b/a:!b&&c>0&&(g=d/c),g*e}if(e>=1){var h=0;return c<1?h=(d-1)/(c-1):1==c&&a<1&&(h=(b-1)/(a-1)),1+h*(e-1)}for(var i=0,j=1;i<j;){var k=(i+j)/2,l=f(a,c,k);if(Math.abs(e-l)<1e-5)return f(b,d,k);l<e?i=k:j=k}return f(b,d,k)}}function j(a,b){return function(c){if(c>=1)return 1;var d=1/a;return(c+=b*d)-c%d}}function k(a){C||(C=document.createElement("div").style),C.animationTimingFunction="",C.animationTimingFunction=a;var b=C.animationTimingFunction;if(""==b&&e())throw new TypeError(a+" is not a valid value for easing");return b}function l(a){if("linear"==a)return x;var b=E.exec(a);if(b)return i.apply(this,b.slice(1).map(Number));var c=F.exec(a);return c?j(Number(c[1]),{start:y,middle:z,end:A}[c[2]]):B[a]||x}function m(a){return Math.abs(n(a)/a.playbackRate)}function n(a){return 0===a.duration||0===a.iterations?0:a.duration*a.iterations}function o(a,b,c){if(null==b)return G;var d=c.delay+a+c.endDelay;return b<Math.min(c.delay,d)?H:b>=Math.min(c.delay+a,d)?I:J}function p(a,b,c,d,e){switch(d){case H:return"backwards"==b||"both"==b?0:null;case J:return c-e;case I:return"forwards"==b||"both"==b?a:null;case G:return null}}function q(a,b,c,d,e){var f=e;return 0===a?b!==H&&(f+=c):f+=d/a,f}function r(a,b,c,d,e,f){var g=a===1/0?b%1:a%1;return 0!==g||c!==I||0===d||0===e&&0!==f||(g=1),g}function s(a,b,c,d){return a===I&&b===1/0?1/0:1===c?Math.floor(d)-1:Math.floor(d)}function t(a,b,c){var d=a;if("normal"!==a&&"reverse"!==a){var e=b;"alternate-reverse"===a&&(e+=1),d="normal",e!==1/0&&e%2!=0&&(d="reverse")}return"normal"===d?c:1-c}function u(a,b,c){var d=o(a,b,c),e=p(a,c.fill,b,d,c.delay);if(null===e)return null;var f=q(c.duration,d,c.iterations,e,c.iterationStart),g=r(f,c.iterationStart,d,c.iterations,e,c.duration),h=s(d,c.iterations,g,f),i=t(c.direction,h,g);return c._easingFunction(i)}var v="backwards|forwards|both|none".split("|"),w="reverse|alternate|alternate-reverse".split("|"),x=function(a){return a};d.prototype={_setMember:function(b,c){this["_"+b]=c,this._effect&&(this._effect._timingInput[b]=c,this._effect._timing=a.normalizeTimingInput(this._effect._timingInput),this._effect.activeDuration=a.calculateActiveDuration(this._effect._timing),this._effect._animation&&this._effect._animation._rebuildUnderlyingAnimation())},get playbackRate(){return this._playbackRate},set delay(a){this._setMember("delay",a)},get delay(){return this._delay},set endDelay(a){this._setMember("endDelay",a)},get endDelay(){return this._endDelay},set fill(a){this._setMember("fill",a)},get fill(){return this._fill},set iterationStart(a){if((isNaN(a)||a<0)&&e())throw new TypeError("iterationStart must be a non-negative number, received: "+timing.iterationStart);this._setMember("iterationStart",a)},get iterationStart(){return this._iterationStart},set duration(a){if("auto"!=a&&(isNaN(a)||a<0)&&e())throw new TypeError("duration must be non-negative or auto, received: "+a);this._setMember("duration",a)},get duration(){return this._duration},set direction(a){this._setMember("direction",a)},get direction(){return this._direction},set easing(a){this._easingFunction=l(k(a)),this._setMember("easing",a)},get easing(){return this._easing},set iterations(a){if((isNaN(a)||a<0)&&e())throw new TypeError("iterations must be non-negative, received: "+a);this._setMember("iterations",a)},get iterations(){return this._iterations}};var y=1,z=.5,A=0,B={ease:i(.25,.1,.25,1),"ease-in":i(.42,0,1,1),"ease-out":i(0,0,.58,1),"ease-in-out":i(.42,0,.58,1),"step-start":j(1,y),"step-middle":j(1,z),"step-end":j(1,A)},C=null,D="\\s*(-?\\d+\\.?\\d*|-?\\.\\d+)\\s*",E=new RegExp("cubic-bezier\\("+D+","+D+","+D+","+D+"\\)"),F=/steps\(\s*(\d+)\s*,\s*(start|middle|end)\s*\)/,G=0,H=1,I=2,J=3;a.cloneTimingInput=c,a.makeTiming=f,a.numericTimingToObject=g,a.normalizeTimingInput=h,a.calculateActiveDuration=m,a.calculateIterationProgress=u,a.calculatePhase=o,a.normalizeEasing=k,a.parseEasingFunction=l}(c),function(a,b){function c(a,b){return a in k?k[a][b]||b:b}function d(a){return"display"===a||0===a.lastIndexOf("animation",0)||0===a.lastIndexOf("transition",0)}function e(a,b,e){if(!d(a)){var f=h[a];if(f){i.style[a]=b;for(var g in f){var j=f[g],k=i.style[j];e[j]=c(j,k)}}else e[a]=c(a,b)}}function f(a){var b=[];for(var c in a)if(!(c in["easing","offset","composite"])){var d=a[c];Array.isArray(d)||(d=[d]);for(var e,f=d.length,g=0;g<f;g++)e={},e.offset="offset"in a?a.offset:1==f?1:g/(f-1),"easing"in a&&(e.easing=a.easing),"composite"in a&&(e.composite=a.composite),e[c]=d[g],b.push(e)}return b.sort(function(a,b){return a.offset-b.offset}),b}function g(b){function c(){var a=d.length;null==d[a-1].offset&&(d[a-1].offset=1),a>1&&null==d[0].offset&&(d[0].offset=0);for(var b=0,c=d[0].offset,e=1;e<a;e++){var f=d[e].offset;if(null!=f){for(var g=1;g<e-b;g++)d[b+g].offset=c+(f-c)*g/(e-b);b=e,c=f}}}if(null==b)return[];window.Symbol&&Symbol.iterator&&Array.prototype.from&&b[Symbol.iterator]&&(b=Array.from(b)),Array.isArray(b)||(b=f(b));for(var d=b.map(function(b){var c={};for(var d in b){var f=b[d];if("offset"==d){if(null!=f){if(f=Number(f),!isFinite(f))throw new TypeError("Keyframe offsets must be numbers.");if(f<0||f>1)throw new TypeError("Keyframe offsets must be between 0 and 1.")}}else if("composite"==d){if("add"==f||"accumulate"==f)throw{type:DOMException.NOT_SUPPORTED_ERR,name:"NotSupportedError",message:"add compositing is not supported"};if("replace"!=f)throw new TypeError("Invalid composite mode "+f+".")}else f="easing"==d?a.normalizeEasing(f):""+f;e(d,f,c)}return void 0==c.offset&&(c.offset=null),void 0==c.easing&&(c.easing="linear"),c}),g=!0,h=-1/0,i=0;i<d.length;i++){var j=d[i].offset;if(null!=j){if(j<h)throw new TypeError("Keyframes are not loosely sorted by offset. Sort or specify offsets.");h=j}else g=!1}return d=d.filter(function(a){return a.offset>=0&&a.offset<=1}),g||c(),d}var h={background:["backgroundImage","backgroundPosition","backgroundSize","backgroundRepeat","backgroundAttachment","backgroundOrigin","backgroundClip","backgroundColor"],border:["borderTopColor","borderTopStyle","borderTopWidth","borderRightColor","borderRightStyle","borderRightWidth","borderBottomColor","borderBottomStyle","borderBottomWidth","borderLeftColor","borderLeftStyle","borderLeftWidth"],borderBottom:["borderBottomWidth","borderBottomStyle","borderBottomColor"],borderColor:["borderTopColor","borderRightColor","borderBottomColor","borderLeftColor"],borderLeft:["borderLeftWidth","borderLeftStyle","borderLeftColor"],borderRadius:["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],borderRight:["borderRightWidth","borderRightStyle","borderRightColor"],borderTop:["borderTopWidth","borderTopStyle","borderTopColor"],borderWidth:["borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth"],flex:["flexGrow","flexShrink","flexBasis"],font:["fontFamily","fontSize","fontStyle","fontVariant","fontWeight","lineHeight"],margin:["marginTop","marginRight","marginBottom","marginLeft"],outline:["outlineColor","outlineStyle","outlineWidth"],padding:["paddingTop","paddingRight","paddingBottom","paddingLeft"]},i=document.createElementNS("http://www.w3.org/1999/xhtml","div"),j={thin:"1px",medium:"3px",thick:"5px"},k={borderBottomWidth:j,borderLeftWidth:j,borderRightWidth:j,borderTopWidth:j,fontSize:{"xx-small":"60%","x-small":"75%",small:"89%",medium:"100%",large:"120%","x-large":"150%","xx-large":"200%"},fontWeight:{normal:"400",bold:"700"},outlineWidth:j,textShadow:{none:"0px 0px 0px transparent"},boxShadow:{none:"0px 0px 0px 0px transparent"}};a.convertToArrayForm=f,a.normalizeKeyframes=g}(c),function(a){var b={};a.isDeprecated=function(a,c,d,e){var f=e?"are":"is",g=new Date,h=new Date(c);return h.setMonth(h.getMonth()+3),!(g<h&&(a in b||console.warn("Web Animations: "+a+" "+f+" deprecated and will stop working on "+h.toDateString()+". "+d),b[a]=!0,1))},a.deprecated=function(b,c,d,e){var f=e?"are":"is";if(a.isDeprecated(b,c,d,e))throw new Error(b+" "+f+" no longer supported. "+d)}}(c),function(){if(document.documentElement.animate){var a=document.documentElement.animate([],0),b=!0;if(a&&(b=!1,"play|currentTime|pause|reverse|playbackRate|cancel|finish|startTime|playState".split("|").forEach(function(c){void 0===a[c]&&(b=!0)})),!b)return}!function(a,b,c){function d(a){for(var b={},c=0;c<a.length;c++)for(var d in a[c])if("offset"!=d&&"easing"!=d&&"composite"!=d){var e={offset:a[c].offset,easing:a[c].easing,value:a[c][d]};b[d]=b[d]||[],b[d].push(e)}for(var f in b){var g=b[f];if(0!=g[0].offset||1!=g[g.length-1].offset)throw{type:DOMException.NOT_SUPPORTED_ERR,name:"NotSupportedError",message:"Partial keyframes are not supported"}}return b}function e(c){var d=[];for(var e in c)for(var f=c[e],g=0;g<f.length-1;g++){var h=g,i=g+1,j=f[h].offset,k=f[i].offset,l=j,m=k;0==g&&(l=-1/0,0==k&&(i=h)),g==f.length-2&&(m=1/0,1==j&&(h=i)),d.push({applyFrom:l,applyTo:m,startOffset:f[h].offset,endOffset:f[i].offset,easingFunction:a.parseEasingFunction(f[h].easing),property:e,interpolation:b.propertyInterpolation(e,f[h].value,f[i].value)})}return d.sort(function(a,b){return a.startOffset-b.startOffset}),d}b.convertEffectInput=function(c){var f=a.normalizeKeyframes(c),g=d(f),h=e(g);return function(a,c){if(null!=c)h.filter(function(a){return c>=a.applyFrom&&c<a.applyTo}).forEach(function(d){var e=c-d.startOffset,f=d.endOffset-d.startOffset,g=0==f?0:d.easingFunction(e/f);b.apply(a,d.property,d.interpolation(g))});else for(var d in g)"offset"!=d&&"easing"!=d&&"composite"!=d&&b.clear(a,d)}}}(c,d),function(a,b,c){function d(a){return a.replace(/-(.)/g,function(a,b){return b.toUpperCase()})}function e(a,b,c){h[c]=h[c]||[],h[c].push([a,b])}function f(a,b,c){for(var f=0;f<c.length;f++){e(a,b,d(c[f]))}}function g(c,e,f){var g=c;/-/.test(c)&&!a.isDeprecated("Hyphenated property names","2016-03-22","Use camelCase instead.",!0)&&(g=d(c)),"initial"!=e&&"initial"!=f||("initial"==e&&(e=i[g]),"initial"==f&&(f=i[g]));for(var j=e==f?[]:h[g],k=0;j&&k<j.length;k++){var l=j[k][0](e),m=j[k][0](f);if(void 0!==l&&void 0!==m){var n=j[k][1](l,m);if(n){var o=b.Interpolation.apply(null,n);return function(a){return 0==a?e:1==a?f:o(a)}}}}return b.Interpolation(!1,!0,function(a){return a?f:e})}var h={};b.addPropertiesHandler=f;var i={backgroundColor:"transparent",backgroundPosition:"0% 0%",borderBottomColor:"currentColor",borderBottomLeftRadius:"0px",borderBottomRightRadius:"0px",borderBottomWidth:"3px",borderLeftColor:"currentColor",borderLeftWidth:"3px",borderRightColor:"currentColor",borderRightWidth:"3px",borderSpacing:"2px",borderTopColor:"currentColor",borderTopLeftRadius:"0px",borderTopRightRadius:"0px",borderTopWidth:"3px",bottom:"auto",clip:"rect(0px, 0px, 0px, 0px)",color:"black",fontSize:"100%",fontWeight:"400",height:"auto",left:"auto",letterSpacing:"normal",lineHeight:"120%",marginBottom:"0px",marginLeft:"0px",marginRight:"0px",marginTop:"0px",maxHeight:"none",maxWidth:"none",minHeight:"0px",minWidth:"0px",opacity:"1.0",outlineColor:"invert",outlineOffset:"0px",outlineWidth:"3px",paddingBottom:"0px",paddingLeft:"0px",paddingRight:"0px",paddingTop:"0px",right:"auto",strokeDasharray:"none",strokeDashoffset:"0px",textIndent:"0px",textShadow:"0px 0px 0px transparent",top:"auto",transform:"",verticalAlign:"0px",visibility:"visible",width:"auto",wordSpacing:"normal",zIndex:"auto"};b.propertyInterpolation=g}(c,d),function(a,b,c){function d(b){var c=a.calculateActiveDuration(b),d=function(d){return a.calculateIterationProgress(c,d,b)};return d._totalDuration=b.delay+c+b.endDelay,d}b.KeyframeEffect=function(c,e,f,g){var h,i=d(a.normalizeTimingInput(f)),j=b.convertEffectInput(e),k=function(){j(c,h)};return k._update=function(a){return null!==(h=i(a))},k._clear=function(){j(c,null)},k._hasSameTarget=function(a){return c===a},k._target=c,k._totalDuration=i._totalDuration,k._id=g,k}}(c,d),function(a,b){function c(a,b){return!(!b.namespaceURI||-1==b.namespaceURI.indexOf("/svg"))&&(g in a||(a[g]=/Trident|MSIE|IEMobile|Edge|Android 4/i.test(a.navigator.userAgent)),a[g])}function d(a,b,c){c.enumerable=!0,c.configurable=!0,Object.defineProperty(a,b,c)}function e(a){this._element=a,this._surrogateStyle=document.createElementNS("http://www.w3.org/1999/xhtml","div").style,this._style=a.style,this._length=0,this._isAnimatedProperty={},this._updateSvgTransformAttr=c(window,a),this._savedTransformAttr=null;for(var b=0;b<this._style.length;b++){var d=this._style[b];this._surrogateStyle[d]=this._style[d]}this._updateIndices()}function f(a){if(!a._webAnimationsPatchedStyle){var b=new e(a);try{d(a,"style",{get:function(){return b}})}catch(b){a.style._set=function(b,c){a.style[b]=c},a.style._clear=function(b){a.style[b]=""}}a._webAnimationsPatchedStyle=a.style}}var g="_webAnimationsUpdateSvgTransformAttr",h={cssText:1,length:1,parentRule:1},i={getPropertyCSSValue:1,getPropertyPriority:1,getPropertyValue:1,item:1,removeProperty:1,setProperty:1},j={removeProperty:1,setProperty:1};e.prototype={get cssText(){return this._surrogateStyle.cssText},set cssText(a){for(var b={},c=0;c<this._surrogateStyle.length;c++)b[this._surrogateStyle[c]]=!0;this._surrogateStyle.cssText=a,this._updateIndices();for(var c=0;c<this._surrogateStyle.length;c++)b[this._surrogateStyle[c]]=!0;for(var d in b)this._isAnimatedProperty[d]||this._style.setProperty(d,this._surrogateStyle.getPropertyValue(d))},get length(){return this._surrogateStyle.length},get parentRule(){return this._style.parentRule},_updateIndices:function(){for(;this._length<this._surrogateStyle.length;)Object.defineProperty(this,this._length,{configurable:!0,enumerable:!1,get:function(a){return function(){return this._surrogateStyle[a]}}(this._length)}),this._length++;for(;this._length>this._surrogateStyle.length;)this._length--,Object.defineProperty(this,this._length,{configurable:!0,enumerable:!1,value:void 0})},_set:function(b,c){this._style[b]=c,this._isAnimatedProperty[b]=!0,this._updateSvgTransformAttr&&"transform"==a.unprefixedPropertyName(b)&&(null==this._savedTransformAttr&&(this._savedTransformAttr=this._element.getAttribute("transform")),this._element.setAttribute("transform",a.transformToSvgMatrix(c)))},_clear:function(b){this._style[b]=this._surrogateStyle[b],this._updateSvgTransformAttr&&"transform"==a.unprefixedPropertyName(b)&&(this._savedTransformAttr?this._element.setAttribute("transform",this._savedTransformAttr):this._element.removeAttribute("transform"),this._savedTransformAttr=null),delete this._isAnimatedProperty[b]}};for(var k in i)e.prototype[k]=function(a,b){return function(){var c=this._surrogateStyle[a].apply(this._surrogateStyle,arguments);return b&&(this._isAnimatedProperty[arguments[0]]||this._style[a].apply(this._style,arguments),this._updateIndices()),c}}(k,k in j);for(var l in document.documentElement.style)l in h||l in i||function(a){d(e.prototype,a,{get:function(){return this._surrogateStyle[a]},set:function(b){this._surrogateStyle[a]=b,this._updateIndices(),this._isAnimatedProperty[a]||(this._style[a]=b)}})}(l);a.apply=function(b,c,d){f(b),b.style._set(a.propertyName(c),d)},a.clear=function(b,c){b._webAnimationsPatchedStyle&&b.style._clear(a.propertyName(c))}}(d),function(a){window.Element.prototype.animate=function(b,c){var d="";return c&&c.id&&(d=c.id),a.timeline._play(a.KeyframeEffect(this,b,c,d))}}(d),function(a,b){function c(a,b,d){if("number"==typeof a&&"number"==typeof b)return a*(1-d)+b*d;if("boolean"==typeof a&&"boolean"==typeof b)return d<.5?a:b;if(a.length==b.length){for(var e=[],f=0;f<a.length;f++)e.push(c(a[f],b[f],d));return e}throw"Mismatched interpolation arguments "+a+":"+b}a.Interpolation=function(a,b,d){return function(e){return d(c(a,b,e))}}}(d),function(a,b){function c(a,b,c){return Math.max(Math.min(a,c),b)}function d(b,d,e){var f=a.dot(b,d);f=c(f,-1,1);var g=[];if(1===f)g=b;else for(var h=Math.acos(f),i=1*Math.sin(e*h)/Math.sqrt(1-f*f),j=0;j<4;j++)g.push(b[j]*(Math.cos(e*h)-f*i)+d[j]*i);return g}var e=function(){function a(a,b){for(var c=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],d=0;d<4;d++)for(var e=0;e<4;e++)for(var f=0;f<4;f++)c[d][e]+=b[d][f]*a[f][e];return c}function b(a){return 0==a[0][2]&&0==a[0][3]&&0==a[1][2]&&0==a[1][3]&&0==a[2][0]&&0==a[2][1]&&1==a[2][2]&&0==a[2][3]&&0==a[3][2]&&1==a[3][3]}function c(c,d,e,f,g){for(var h=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],i=0;i<4;i++)h[i][3]=g[i];for(var i=0;i<3;i++)for(var j=0;j<3;j++)h[3][i]+=c[j]*h[j][i];var k=f[0],l=f[1],m=f[2],n=f[3],o=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]];o[0][0]=1-2*(l*l+m*m),o[0][1]=2*(k*l-m*n),o[0][2]=2*(k*m+l*n),o[1][0]=2*(k*l+m*n),o[1][1]=1-2*(k*k+m*m),o[1][2]=2*(l*m-k*n),o[2][0]=2*(k*m-l*n),o[2][1]=2*(l*m+k*n),o[2][2]=1-2*(k*k+l*l),h=a(h,o);var p=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]];e[2]&&(p[2][1]=e[2],h=a(h,p)),e[1]&&(p[2][1]=0,p[2][0]=e[0],h=a(h,p)),e[0]&&(p[2][0]=0,p[1][0]=e[0],h=a(h,p));for(var i=0;i<3;i++)for(var j=0;j<3;j++)h[i][j]*=d[i];return b(h)?[h[0][0],h[0][1],h[1][0],h[1][1],h[3][0],h[3][1]]:h[0].concat(h[1],h[2],h[3])}return c}();a.composeMatrix=e,a.quat=d}(d),function(a,b,c){a.sequenceNumber=0;var d=function(a,b,c){this.target=a,this.currentTime=b,this.timelineTime=c,this.type="finish",this.bubbles=!1,this.cancelable=!1,this.currentTarget=a,this.defaultPrevented=!1,this.eventPhase=Event.AT_TARGET,this.timeStamp=Date.now()};b.Animation=function(b){this.id="",b&&b._id&&(this.id=b._id),this._sequenceNumber=a.sequenceNumber++,this._currentTime=0,this._startTime=null,this._paused=!1,this._playbackRate=1,this._inTimeline=!0,this._finishedFlag=!0,this.onfinish=null,this._finishHandlers=[],this._effect=b,this._inEffect=this._effect._update(0),this._idle=!0,this._currentTimePending=!1},b.Animation.prototype={_ensureAlive:function(){this.playbackRate<0&&0===this.currentTime?this._inEffect=this._effect._update(-1):this._inEffect=this._effect._update(this.currentTime),this._inTimeline||!this._inEffect&&this._finishedFlag||(this._inTimeline=!0,b.timeline._animations.push(this))},_tickCurrentTime:function(a,b){a!=this._currentTime&&(this._currentTime=a,this._isFinished&&!b&&(this._currentTime=this._playbackRate>0?this._totalDuration:0),this._ensureAlive())},get currentTime(){return this._idle||this._currentTimePending?null:this._currentTime},set currentTime(a){a=+a,isNaN(a)||(b.restart(),this._paused||null==this._startTime||(this._startTime=this._timeline.currentTime-a/this._playbackRate),this._currentTimePending=!1,this._currentTime!=a&&(this._idle&&(this._idle=!1,this._paused=!0),this._tickCurrentTime(a,!0),b.applyDirtiedAnimation(this)))},get startTime(){return this._startTime},set startTime(a){a=+a,isNaN(a)||this._paused||this._idle||(this._startTime=a,this._tickCurrentTime((this._timeline.currentTime-this._startTime)*this.playbackRate),b.applyDirtiedAnimation(this))},get playbackRate(){return this._playbackRate},set playbackRate(a){if(a!=this._playbackRate){var c=this.currentTime;this._playbackRate=a,this._startTime=null,"paused"!=this.playState&&"idle"!=this.playState&&(this._finishedFlag=!1,this._idle=!1,this._ensureAlive(),b.applyDirtiedAnimation(this)),null!=c&&(this.currentTime=c)}},get _isFinished(){return!this._idle&&(this._playbackRate>0&&this._currentTime>=this._totalDuration||this._playbackRate<0&&this._currentTime<=0)},get _totalDuration(){return this._effect._totalDuration},get playState(){return this._idle?"idle":null==this._startTime&&!this._paused&&0!=this.playbackRate||this._currentTimePending?"pending":this._paused?"paused":this._isFinished?"finished":"running"},_rewind:function(){if(this._playbackRate>=0)this._currentTime=0;else{if(!(this._totalDuration<1/0))throw new DOMException("Unable to rewind negative playback rate animation with infinite duration","InvalidStateError");this._currentTime=this._totalDuration}},play:function(){this._paused=!1,(this._isFinished||this._idle)&&(this._rewind(),this._startTime=null),this._finishedFlag=!1,this._idle=!1,this._ensureAlive(),b.applyDirtiedAnimation(this)},pause:function(){this._isFinished||this._paused||this._idle?this._idle&&(this._rewind(),this._idle=!1):this._currentTimePending=!0,this._startTime=null,this._paused=!0},finish:function(){this._idle||(this.currentTime=this._playbackRate>0?this._totalDuration:0,this._startTime=this._totalDuration-this.currentTime,this._currentTimePending=!1,b.applyDirtiedAnimation(this))},cancel:function(){this._inEffect&&(this._inEffect=!1,this._idle=!0,this._paused=!1,this._isFinished=!0,this._finishedFlag=!0,this._currentTime=0,this._startTime=null,this._effect._update(null),b.applyDirtiedAnimation(this))},reverse:function(){this.playbackRate*=-1,this.play()},addEventListener:function(a,b){"function"==typeof b&&"finish"==a&&this._finishHandlers.push(b)},removeEventListener:function(a,b){if("finish"==a){var c=this._finishHandlers.indexOf(b);c>=0&&this._finishHandlers.splice(c,1)}},_fireEvents:function(a){if(this._isFinished){if(!this._finishedFlag){var b=new d(this,this._currentTime,a),c=this._finishHandlers.concat(this.onfinish?[this.onfinish]:[]);setTimeout(function(){c.forEach(function(a){a.call(b.target,b)})},0),this._finishedFlag=!0}}else this._finishedFlag=!1},_tick:function(a,b){this._idle||this._paused||(null==this._startTime?b&&(this.startTime=a-this._currentTime/this.playbackRate):this._isFinished||this._tickCurrentTime((a-this._startTime)*this.playbackRate)),b&&(this._currentTimePending=!1,this._fireEvents(a))},get _needsTick(){return this.playState in{pending:1,running:1}||!this._finishedFlag},_targetAnimations:function(){var a=this._effect._target;return a._activeAnimations||(a._activeAnimations=[]),a._activeAnimations},_markTarget:function(){var a=this._targetAnimations();-1===a.indexOf(this)&&a.push(this)},_unmarkTarget:function(){var a=this._targetAnimations(),b=a.indexOf(this);-1!==b&&a.splice(b,1)}}}(c,d),function(a,b,c){function d(a){var b=j;j=[],a<q.currentTime&&(a=q.currentTime),q._animations.sort(e),q._animations=h(a,!0,q._animations)[0],b.forEach(function(b){b[1](a)}),g(),l=void 0}function e(a,b){return a._sequenceNumber-b._sequenceNumber}function f(){this._animations=[],this.currentTime=window.performance&&performance.now?performance.now():0}function g(){o.forEach(function(a){a()}),o.length=0}function h(a,c,d){p=!0,n=!1,b.timeline.currentTime=a,m=!1;var e=[],f=[],g=[],h=[];return d.forEach(function(b){b._tick(a,c),b._inEffect?(f.push(b._effect),b._markTarget()):(e.push(b._effect),b._unmarkTarget()),b._needsTick&&(m=!0);var d=b._inEffect||b._needsTick;b._inTimeline=d,d?g.push(b):h.push(b)}),o.push.apply(o,e),o.push.apply(o,f),m&&requestAnimationFrame(function(){}),p=!1,[g,h]}var i=window.requestAnimationFrame,j=[],k=0;window.requestAnimationFrame=function(a){var b=k++;return 0==j.length&&i(d),j.push([b,a]),b},window.cancelAnimationFrame=function(a){j.forEach(function(b){b[0]==a&&(b[1]=function(){})})},f.prototype={_play:function(c){c._timing=a.normalizeTimingInput(c.timing);var d=new b.Animation(c);return d._idle=!1,d._timeline=this,this._animations.push(d),b.restart(),b.applyDirtiedAnimation(d),d}};var l=void 0,m=!1,n=!1;b.restart=function(){return m||(m=!0,requestAnimationFrame(function(){}),n=!0),n},b.applyDirtiedAnimation=function(a){if(!p){a._markTarget();var c=a._targetAnimations();c.sort(e),h(b.timeline.currentTime,!1,c.slice())[1].forEach(function(a){var b=q._animations.indexOf(a);-1!==b&&q._animations.splice(b,1)}),g()}};var o=[],p=!1,q=new f;b.timeline=q}(c,d),function(a,b){function c(a,b){for(var c=0,d=0;d<a.length;d++)c+=a[d]*b[d];return c}function d(a,b){return[a[0]*b[0]+a[4]*b[1]+a[8]*b[2]+a[12]*b[3],a[1]*b[0]+a[5]*b[1]+a[9]*b[2]+a[13]*b[3],a[2]*b[0]+a[6]*b[1]+a[10]*b[2]+a[14]*b[3],a[3]*b[0]+a[7]*b[1]+a[11]*b[2]+a[15]*b[3],a[0]*b[4]+a[4]*b[5]+a[8]*b[6]+a[12]*b[7],a[1]*b[4]+a[5]*b[5]+a[9]*b[6]+a[13]*b[7],a[2]*b[4]+a[6]*b[5]+a[10]*b[6]+a[14]*b[7],a[3]*b[4]+a[7]*b[5]+a[11]*b[6]+a[15]*b[7],a[0]*b[8]+a[4]*b[9]+a[8]*b[10]+a[12]*b[11],a[1]*b[8]+a[5]*b[9]+a[9]*b[10]+a[13]*b[11],a[2]*b[8]+a[6]*b[9]+a[10]*b[10]+a[14]*b[11],a[3]*b[8]+a[7]*b[9]+a[11]*b[10]+a[15]*b[11],a[0]*b[12]+a[4]*b[13]+a[8]*b[14]+a[12]*b[15],a[1]*b[12]+a[5]*b[13]+a[9]*b[14]+a[13]*b[15],a[2]*b[12]+a[6]*b[13]+a[10]*b[14]+a[14]*b[15],a[3]*b[12]+a[7]*b[13]+a[11]*b[14]+a[15]*b[15]]}function e(a){var b=a.rad||0;return((a.deg||0)/360+(a.grad||0)/400+(a.turn||0))*(2*Math.PI)+b}function f(a){switch(a.t){case"rotatex":var b=e(a.d[0]);return[1,0,0,0,0,Math.cos(b),Math.sin(b),0,0,-Math.sin(b),Math.cos(b),0,0,0,0,1];case"rotatey":var b=e(a.d[0]);return[Math.cos(b),0,-Math.sin(b),0,0,1,0,0,Math.sin(b),0,Math.cos(b),0,0,0,0,1];case"rotate":case"rotatez":var b=e(a.d[0]);return[Math.cos(b),Math.sin(b),0,0,-Math.sin(b),Math.cos(b),0,0,0,0,1,0,0,0,0,1];case"rotate3d":var c=a.d[0],d=a.d[1],f=a.d[2],b=e(a.d[3]),g=c*c+d*d+f*f;if(0===g)c=1,d=0,f=0;else if(1!==g){var h=Math.sqrt(g);c/=h,d/=h,f/=h}var i=Math.sin(b/2),j=i*Math.cos(b/2),k=i*i;return[1-2*(d*d+f*f)*k,2*(c*d*k+f*j),2*(c*f*k-d*j),0,2*(c*d*k-f*j),1-2*(c*c+f*f)*k,2*(d*f*k+c*j),0,2*(c*f*k+d*j),2*(d*f*k-c*j),1-2*(c*c+d*d)*k,0,0,0,0,1];case"scale":return[a.d[0],0,0,0,0,a.d[1],0,0,0,0,1,0,0,0,0,1];case"scalex":return[a.d[0],0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];case"scaley":return[1,0,0,0,0,a.d[0],0,0,0,0,1,0,0,0,0,1];case"scalez":return[1,0,0,0,0,1,0,0,0,0,a.d[0],0,0,0,0,1];case"scale3d":return[a.d[0],0,0,0,0,a.d[1],0,0,0,0,a.d[2],0,0,0,0,1];case"skew":var l=e(a.d[0]),m=e(a.d[1]);return[1,Math.tan(m),0,0,Math.tan(l),1,0,0,0,0,1,0,0,0,0,1];case"skewx":var b=e(a.d[0]);return[1,0,0,0,Math.tan(b),1,0,0,0,0,1,0,0,0,0,1];case"skewy":var b=e(a.d[0]);return[1,Math.tan(b),0,0,0,1,0,0,0,0,1,0,0,0,0,1];case"translate":var c=a.d[0].px||0,d=a.d[1].px||0;return[1,0,0,0,0,1,0,0,0,0,1,0,c,d,0,1];case"translatex":var c=a.d[0].px||0;return[1,0,0,0,0,1,0,0,0,0,1,0,c,0,0,1];case"translatey":var d=a.d[0].px||0;return[1,0,0,0,0,1,0,0,0,0,1,0,0,d,0,1];case"translatez":var f=a.d[0].px||0;return[1,0,0,0,0,1,0,0,0,0,1,0,0,0,f,1];case"translate3d":var c=a.d[0].px||0,d=a.d[1].px||0,f=a.d[2].px||0;return[1,0,0,0,0,1,0,0,0,0,1,0,c,d,f,1];case"perspective":return[1,0,0,0,0,1,0,0,0,0,1,a.d[0].px?-1/a.d[0].px:0,0,0,0,1];case"matrix":return[a.d[0],a.d[1],0,0,a.d[2],a.d[3],0,0,0,0,1,0,a.d[4],a.d[5],0,1];case"matrix3d":return a.d}}function g(a){return 0===a.length?[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]:a.map(f).reduce(d)}function h(a){return[i(g(a))]}var i=function(){function a(a){return a[0][0]*a[1][1]*a[2][2]+a[1][0]*a[2][1]*a[0][2]+a[2][0]*a[0][1]*a[1][2]-a[0][2]*a[1][1]*a[2][0]-a[1][2]*a[2][1]*a[0][0]-a[2][2]*a[0][1]*a[1][0]}function b(b){for(var c=1/a(b),d=b[0][0],e=b[0][1],f=b[0][2],g=b[1][0],h=b[1][1],i=b[1][2],j=b[2][0],k=b[2][1],l=b[2][2],m=[[(h*l-i*k)*c,(f*k-e*l)*c,(e*i-f*h)*c,0],[(i*j-g*l)*c,(d*l-f*j)*c,(f*g-d*i)*c,0],[(g*k-h*j)*c,(j*e-d*k)*c,(d*h-e*g)*c,0]],n=[],o=0;o<3;o++){for(var p=0,q=0;q<3;q++)p+=b[3][q]*m[q][o];n.push(p)}return n.push(1),m.push(n),m}function d(a){return[[a[0][0],a[1][0],a[2][0],a[3][0]],[a[0][1],a[1][1],a[2][1],a[3][1]],[a[0][2],a[1][2],a[2][2],a[3][2]],[a[0][3],a[1][3],a[2][3],a[3][3]]]}function e(a,b){for(var c=[],d=0;d<4;d++){for(var e=0,f=0;f<4;f++)e+=a[f]*b[f][d];c.push(e)}return c}function f(a){var b=g(a);return[a[0]/b,a[1]/b,a[2]/b]}function g(a){return Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2])}function h(a,b,c,d){return[c*a[0]+d*b[0],c*a[1]+d*b[1],c*a[2]+d*b[2]]}function i(a,b){return[a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]]}function j(j){var k=[j.slice(0,4),j.slice(4,8),j.slice(8,12),j.slice(12,16)];if(1!==k[3][3])return null;for(var l=[],m=0;m<4;m++)l.push(k[m].slice());for(var m=0;m<3;m++)l[m][3]=0;if(0===a(l))return null;var n,o=[];k[0][3]||k[1][3]||k[2][3]?(o.push(k[0][3]),o.push(k[1][3]),o.push(k[2][3]),o.push(k[3][3]),n=e(o,d(b(l)))):n=[0,0,0,1];var p=k[3].slice(0,3),q=[];q.push(k[0].slice(0,3));var r=[];r.push(g(q[0])),q[0]=f(q[0]);var s=[];q.push(k[1].slice(0,3)),s.push(c(q[0],q[1])),q[1]=h(q[1],q[0],1,-s[0]),r.push(g(q[1])),q[1]=f(q[1]),s[0]/=r[1],q.push(k[2].slice(0,3)),s.push(c(q[0],q[2])),q[2]=h(q[2],q[0],1,-s[1]),s.push(c(q[1],q[2])),q[2]=h(q[2],q[1],1,-s[2]),r.push(g(q[2])),q[2]=f(q[2]),s[1]/=r[2],s[2]/=r[2];var t=i(q[1],q[2]);if(c(q[0],t)<0)for(var m=0;m<3;m++)r[m]*=-1,q[m][0]*=-1,q[m][1]*=-1,q[m][2]*=-1;var u,v,w=q[0][0]+q[1][1]+q[2][2]+1;return w>1e-4?(u=.5/Math.sqrt(w),v=[(q[2][1]-q[1][2])*u,(q[0][2]-q[2][0])*u,(q[1][0]-q[0][1])*u,.25/u]):q[0][0]>q[1][1]&&q[0][0]>q[2][2]?(u=2*Math.sqrt(1+q[0][0]-q[1][1]-q[2][2]),v=[.25*u,(q[0][1]+q[1][0])/u,(q[0][2]+q[2][0])/u,(q[2][1]-q[1][2])/u]):q[1][1]>q[2][2]?(u=2*Math.sqrt(1+q[1][1]-q[0][0]-q[2][2]),v=[(q[0][1]+q[1][0])/u,.25*u,(q[1][2]+q[2][1])/u,(q[0][2]-q[2][0])/u]):(u=2*Math.sqrt(1+q[2][2]-q[0][0]-q[1][1]),v=[(q[0][2]+q[2][0])/u,(q[1][2]+q[2][1])/u,.25*u,(q[1][0]-q[0][1])/u]),[p,r,s,v,n]}return j}();a.dot=c,a.makeMatrixDecomposition=h,a.transformListToMatrix=g}(d),function(a){function b(a,b){var c=a.exec(b);if(c)return c=a.ignoreCase?c[0].toLowerCase():c[0],[c,b.substr(c.length)]}function c(a,b){b=b.replace(/^\s*/,"");var c=a(b);if(c)return[c[0],c[1].replace(/^\s*/,"")]}function d(a,d,e){a=c.bind(null,a);for(var f=[];;){var g=a(e);if(!g)return[f,e];if(f.push(g[0]),e=g[1],!(g=b(d,e))||""==g[1])return[f,e];e=g[1]}}function e(a,b){for(var c=0,d=0;d<b.length&&(!/\s|,/.test(b[d])||0!=c);d++)if("("==b[d])c++;else if(")"==b[d]&&(c--,0==c&&d++,c<=0))break;var e=a(b.substr(0,d));return void 0==e?void 0:[e,b.substr(d)]}function f(a,b){for(var c=a,d=b;c&&d;)c>d?c%=d:d%=c;return c=a*b/(c+d)}function g(a){return function(b){var c=a(b);return c&&(c[0]=void 0),c}}function h(a,b){return function(c){return a(c)||[b,c]}}function i(b,c){for(var d=[],e=0;e<b.length;e++){var f=a.consumeTrimmed(b[e],c);if(!f||""==f[0])return;void 0!==f[0]&&d.push(f[0]),c=f[1]}if(""==c)return d}function j(a,b,c,d,e){for(var g=[],h=[],i=[],j=f(d.length,e.length),k=0;k<j;k++){var l=b(d[k%d.length],e[k%e.length]);if(!l)return;g.push(l[0]),h.push(l[1]),i.push(l[2])}return[g,h,function(b){var d=b.map(function(a,b){return i[b](a)}).join(c);return a?a(d):d}]}function k(a,b,c){for(var d=[],e=[],f=[],g=0,h=0;h<c.length;h++)if("function"==typeof c[h]){var i=c[h](a[g],b[g++]);d.push(i[0]),e.push(i[1]),f.push(i[2])}else!function(a){d.push(!1),e.push(!1),f.push(function(){return c[a]})}(h);return[d,e,function(a){for(var b="",c=0;c<a.length;c++)b+=f[c](a[c]);return b}]}a.consumeToken=b,a.consumeTrimmed=c,a.consumeRepeated=d,a.consumeParenthesised=e,a.ignore=g,a.optional=h,a.consumeList=i,a.mergeNestedRepeated=j.bind(null,null),a.mergeWrappedNestedRepeated=j,a.mergeList=k}(d),function(a){function b(b){function c(b){var c=a.consumeToken(/^inset/i,b);if(c)return d.inset=!0,c;var c=a.consumeLengthOrPercent(b);if(c)return d.lengths.push(c[0]),c;var c=a.consumeColor(b);return c?(d.color=c[0],c):void 0}var d={inset:!1,lengths:[],color:null},e=a.consumeRepeated(c,/^/,b);if(e&&e[0].length)return[d,e[1]]}function c(c){var d=a.consumeRepeated(b,/^,/,c);if(d&&""==d[1])return d[0]}function d(b,c){for(;b.lengths.length<Math.max(b.lengths.length,c.lengths.length);)b.lengths.push({px:0});for(;c.lengths.length<Math.max(b.lengths.length,c.lengths.length);)c.lengths.push({px:0});if(b.inset==c.inset&&!!b.color==!!c.color){for(var d,e=[],f=[[],0],g=[[],0],h=0;h<b.lengths.length;h++){var i=a.mergeDimensions(b.lengths[h],c.lengths[h],2==h);f[0].push(i[0]),g[0].push(i[1]),e.push(i[2])}if(b.color&&c.color){var j=a.mergeColors(b.color,c.color);f[1]=j[0],g[1]=j[1],d=j[2]}return[f,g,function(a){for(var c=b.inset?"inset ":" ",f=0;f<e.length;f++)c+=e[f](a[0][f])+" ";return d&&(c+=d(a[1])),c}]}}function e(b,c,d,e){function f(a){return{inset:a,color:[0,0,0,0],lengths:[{px:0},{px:0},{px:0},{px:0}]}}for(var g=[],h=[],i=0;i<d.length||i<e.length;i++){var j=d[i]||f(e[i].inset),k=e[i]||f(d[i].inset);g.push(j),h.push(k)}return a.mergeNestedRepeated(b,c,g,h)}var f=e.bind(null,d,", ");a.addPropertiesHandler(c,f,["box-shadow","text-shadow"])}(d),function(a,b){function c(a){return a.toFixed(3).replace(/0+$/,"").replace(/\.$/,"")}function d(a,b,c){return Math.min(b,Math.max(a,c))}function e(a){if(/^\s*[-+]?(\d*\.)?\d+\s*$/.test(a))return Number(a)}function f(a,b){return[a,b,c]}function g(a,b){if(0!=a)return i(0,1/0)(a,b)}function h(a,b){return[a,b,function(a){return Math.round(d(1,1/0,a))}]}function i(a,b){return function(e,f){return[e,f,function(e){return c(d(a,b,e))}]}}function j(a){var b=a.trim().split(/\s*[\s,]\s*/);if(0!==b.length){for(var c=[],d=0;d<b.length;d++){var f=e(b[d]);if(void 0===f)return;c.push(f)}return c}}function k(a,b){if(a.length==b.length)return[a,b,function(a){return a.map(c).join(" ")}]}function l(a,b){return[a,b,Math.round]}a.clamp=d,a.addPropertiesHandler(j,k,["stroke-dasharray"]),a.addPropertiesHandler(e,i(0,1/0),["border-image-width","line-height"]),a.addPropertiesHandler(e,i(0,1),["opacity","shape-image-threshold"]),a.addPropertiesHandler(e,g,["flex-grow","flex-shrink"]),a.addPropertiesHandler(e,h,["orphans","widows"]),a.addPropertiesHandler(e,l,["z-index"]),a.parseNumber=e,a.parseNumberList=j,a.mergeNumbers=f,a.numberToString=c}(d),function(a,b){function c(a,b){if("visible"==a||"visible"==b)return[0,1,function(c){return c<=0?a:c>=1?b:"visible"}]}a.addPropertiesHandler(String,c,["visibility"])}(d),function(a,b){function c(a){a=a.trim(),f.fillStyle="#000",f.fillStyle=a;var b=f.fillStyle;if(f.fillStyle="#fff",f.fillStyle=a,b==f.fillStyle){f.fillRect(0,0,1,1);var c=f.getImageData(0,0,1,1).data;f.clearRect(0,0,1,1);var d=c[3]/255;return[c[0]*d,c[1]*d,c[2]*d,d]}}function d(b,c){return[b,c,function(b){function c(a){return Math.max(0,Math.min(255,a))}if(b[3])for(var d=0;d<3;d++)b[d]=Math.round(c(b[d]/b[3]));return b[3]=a.numberToString(a.clamp(0,1,b[3])),"rgba("+b.join(",")+")"}]}var e=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");e.width=e.height=1;var f=e.getContext("2d");a.addPropertiesHandler(c,d,["background-color","border-bottom-color","border-left-color","border-right-color","border-top-color","color","fill","flood-color","lighting-color","outline-color","stop-color","stroke","text-decoration-color"]),a.consumeColor=a.consumeParenthesised.bind(null,c),a.mergeColors=d}(d),function(a,b){function c(a){function b(){var b=h.exec(a);g=b?b[0]:void 0}function c(){var a=Number(g);return b(),a}function d(){if("("!==g)return c();b();var a=f();return")"!==g?NaN:(b(),a)}function e(){for(var a=d();"*"===g||"/"===g;){var c=g;b();var e=d();"*"===c?a*=e:a/=e}return a}function f(){for(var a=e();"+"===g||"-"===g;){var c=g;b();var d=e();"+"===c?a+=d:a-=d}return a}var g,h=/([\+\-\w\.]+|[\(\)\*\/])/g;return b(),f()}function d(a,b){if("0"==(b=b.trim().toLowerCase())&&"px".search(a)>=0)return{px:0};if(/^[^(]*$|^calc/.test(b)){b=b.replace(/calc\(/g,"(");var d={};b=b.replace(a,function(a){return d[a]=null,"U"+a});for(var e="U("+a.source+")",f=b.replace(/[-+]?(\d*\.)?\d+([Ee][-+]?\d+)?/g,"N").replace(new RegExp("N"+e,"g"),"D").replace(/\s[+-]\s/g,"O").replace(/\s/g,""),g=[/N\*(D)/g,/(N|D)[*\/]N/g,/(N|D)O\1/g,/\((N|D)\)/g],h=0;h<g.length;)g[h].test(f)?(f=f.replace(g[h],"$1"),h=0):h++;if("D"==f){for(var i in d){var j=c(b.replace(new RegExp("U"+i,"g"),"").replace(new RegExp(e,"g"),"*0"));if(!isFinite(j))return;d[i]=j}return d}}}function e(a,b){return f(a,b,!0)}function f(b,c,d){var e,f=[];for(e in b)f.push(e);for(e in c)f.indexOf(e)<0&&f.push(e);return b=f.map(function(a){return b[a]||0}),c=f.map(function(a){return c[a]||0}),[b,c,function(b){var c=b.map(function(c,e){return 1==b.length&&d&&(c=Math.max(c,0)),a.numberToString(c)+f[e]}).join(" + ");return b.length>1?"calc("+c+")":c}]}var g="px|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc",h=d.bind(null,new RegExp(g,"g")),i=d.bind(null,new RegExp(g+"|%","g")),j=d.bind(null,/deg|rad|grad|turn/g);a.parseLength=h,a.parseLengthOrPercent=i,a.consumeLengthOrPercent=a.consumeParenthesised.bind(null,i),a.parseAngle=j,a.mergeDimensions=f;var k=a.consumeParenthesised.bind(null,h),l=a.consumeRepeated.bind(void 0,k,/^/),m=a.consumeRepeated.bind(void 0,l,/^,/);a.consumeSizePairList=m;var n=function(a){var b=m(a);if(b&&""==b[1])return b[0]},o=a.mergeNestedRepeated.bind(void 0,e," "),p=a.mergeNestedRepeated.bind(void 0,o,",");a.mergeNonNegativeSizePair=o,a.addPropertiesHandler(n,p,["background-size"]),a.addPropertiesHandler(i,e,["border-bottom-width","border-image-width","border-left-width","border-right-width","border-top-width","flex-basis","font-size","height","line-height","max-height","max-width","outline-width","width"]),a.addPropertiesHandler(i,f,["border-bottom-left-radius","border-bottom-right-radius","border-top-left-radius","border-top-right-radius","bottom","left","letter-spacing","margin-bottom","margin-left","margin-right","margin-top","min-height","min-width","outline-offset","padding-bottom","padding-left","padding-right","padding-top","perspective","right","shape-margin","stroke-dashoffset","text-indent","top","vertical-align","word-spacing"])}(d),function(a,b){function c(b){return a.consumeLengthOrPercent(b)||a.consumeToken(/^auto/,b)}function d(b){var d=a.consumeList([a.ignore(a.consumeToken.bind(null,/^rect/)),a.ignore(a.consumeToken.bind(null,/^\(/)),a.consumeRepeated.bind(null,c,/^,/),a.ignore(a.consumeToken.bind(null,/^\)/))],b);if(d&&4==d[0].length)return d[0]}function e(b,c){return"auto"==b||"auto"==c?[!0,!1,function(d){var e=d?b:c;if("auto"==e)return"auto";var f=a.mergeDimensions(e,e);return f[2](f[0])}]:a.mergeDimensions(b,c)}function f(a){return"rect("+a+")"}var g=a.mergeWrappedNestedRepeated.bind(null,f,e,", ");a.parseBox=d,a.mergeBoxes=g,a.addPropertiesHandler(d,g,["clip"])}(d),function(a,b){function c(a){return function(b){var c=0;return a.map(function(a){return a===k?b[c++]:a})}}function d(a){return a}function e(b){if("none"==(b=b.toLowerCase().trim()))return[];for(var c,d=/\s*(\w+)\(([^)]*)\)/g,e=[],f=0;c=d.exec(b);){if(c.index!=f)return;f=c.index+c[0].length;var g=c[1],h=n[g];if(!h)return;var i=c[2].split(","),j=h[0];if(j.length<i.length)return;for(var k=[],o=0;o<j.length;o++){var p,q=i[o],r=j[o];if(void 0===(p=q?{A:function(b){return"0"==b.trim()?m:a.parseAngle(b)},N:a.parseNumber,T:a.parseLengthOrPercent,L:a.parseLength}[r.toUpperCase()](q):{a:m,n:k[0],t:l}[r]))return;k.push(p)}if(e.push({t:g,d:k}),d.lastIndex==b.length)return e}}function f(a){return a.toFixed(6).replace(".000000","")}function g(b,c){if(b.decompositionPair!==c){b.decompositionPair=c;var d=a.makeMatrixDecomposition(b)}if(c.decompositionPair!==b){c.decompositionPair=b;var e=a.makeMatrixDecomposition(c)}return null==d[0]||null==e[0]?[[!1],[!0],function(a){return a?c[0].d:b[0].d}]:(d[0].push(0),e[0].push(1),[d,e,function(b){var c=a.quat(d[0][3],e[0][3],b[5]);return a.composeMatrix(b[0],b[1],b[2],c,b[4]).map(f).join(",")}])}function h(a){return a.replace(/[xy]/,"")}function i(a){return a.replace(/(x|y|z|3d)?$/,"3d")}function j(b,c){var d=a.makeMatrixDecomposition&&!0,e=!1;if(!b.length||!c.length){b.length||(e=!0,b=c,c=[]);for(var f=0;f<b.length;f++){var j=b[f].t,k=b[f].d,l="scale"==j.substr(0,5)?1:0;c.push({t:j,d:k.map(function(a){if("number"==typeof a)return l;var b={};for(var c in a)b[c]=l;return b})})}}var m=function(a,b){return"perspective"==a&&"perspective"==b||("matrix"==a||"matrix3d"==a)&&("matrix"==b||"matrix3d"==b)},o=[],p=[],q=[];if(b.length!=c.length){if(!d)return;var r=g(b,c);o=[r[0]],p=[r[1]],q=[["matrix",[r[2]]]]}else for(var f=0;f<b.length;f++){var j,s=b[f].t,t=c[f].t,u=b[f].d,v=c[f].d,w=n[s],x=n[t];if(m(s,t)){if(!d)return;var r=g([b[f]],[c[f]]);o.push(r[0]),p.push(r[1]),q.push(["matrix",[r[2]]])}else{if(s==t)j=s;else if(w[2]&&x[2]&&h(s)==h(t))j=h(s),u=w[2](u),v=x[2](v);else{if(!w[1]||!x[1]||i(s)!=i(t)){if(!d)return;var r=g(b,c);o=[r[0]],p=[r[1]],q=[["matrix",[r[2]]]];break}j=i(s),u=w[1](u),v=x[1](v)}for(var y=[],z=[],A=[],B=0;B<u.length;B++){var C="number"==typeof u[B]?a.mergeNumbers:a.mergeDimensions,r=C(u[B],v[B]);y[B]=r[0],z[B]=r[1],A.push(r[2])}o.push(y),p.push(z),q.push([j,A])}}if(e){var D=o;o=p,p=D}return[o,p,function(a){return a.map(function(a,b){var c=a.map(function(a,c){return q[b][1][c](a)}).join(",");return"matrix"==q[b][0]&&16==c.split(",").length&&(q[b][0]="matrix3d"),q[b][0]+"("+c+")"}).join(" ")}]}var k=null,l={px:0},m={deg:0},n={matrix:["NNNNNN",[k,k,0,0,k,k,0,0,0,0,1,0,k,k,0,1],d],matrix3d:["NNNNNNNNNNNNNNNN",d],rotate:["A"],rotatex:["A"],rotatey:["A"],rotatez:["A"],rotate3d:["NNNA"],perspective:["L"],scale:["Nn",c([k,k,1]),d],scalex:["N",c([k,1,1]),c([k,1])],scaley:["N",c([1,k,1]),c([1,k])],scalez:["N",c([1,1,k])],scale3d:["NNN",d],skew:["Aa",null,d],skewx:["A",null,c([k,m])],skewy:["A",null,c([m,k])],translate:["Tt",c([k,k,l]),d],translatex:["T",c([k,l,l]),c([k,l])],translatey:["T",c([l,k,l]),c([l,k])],translatez:["L",c([l,l,k])],translate3d:["TTL",d]};a.addPropertiesHandler(e,j,["transform"]),a.transformToSvgMatrix=function(b){var c=a.transformListToMatrix(e(b));return"matrix("+f(c[0])+" "+f(c[1])+" "+f(c[4])+" "+f(c[5])+" "+f(c[12])+" "+f(c[13])+")"}}(d),function(a){function b(a){var b=Number(a);if(!(isNaN(b)||b<100||b>900||b%100!=0))return b}function c(b){return b=100*Math.round(b/100),b=a.clamp(100,900,b),400===b?"normal":700===b?"bold":String(b)}function d(a,b){return[a,b,c]}a.addPropertiesHandler(b,d,["font-weight"])}(d),function(a){function b(a){var b={};for(var c in a)b[c]=-a[c];return b}function c(b){return a.consumeToken(/^(left|center|right|top|bottom)\b/i,b)||a.consumeLengthOrPercent(b)}function d(b,d){var e=a.consumeRepeated(c,/^/,d);if(e&&""==e[1]){var f=e[0];if(f[0]=f[0]||"center",f[1]=f[1]||"center",3==b&&(f[2]=f[2]||{px:0}),f.length==b){if(/top|bottom/.test(f[0])||/left|right/.test(f[1])){var h=f[0];f[0]=f[1],f[1]=h}if(/left|right|center|Object/.test(f[0])&&/top|bottom|center|Object/.test(f[1]))return f.map(function(a){return"object"==typeof a?a:g[a]})}}}function e(d){var e=a.consumeRepeated(c,/^/,d);if(e){for(var f=e[0],h=[{"%":50},{"%":50}],i=0,j=!1,k=0;k<f.length;k++){var l=f[k];"string"==typeof l?(j=/bottom|right/.test(l),i={left:0,right:0,center:i,top:1,bottom:1}[l],h[i]=g[l],"center"==l&&i++):(j&&(l=b(l),l["%"]=(l["%"]||0)+100),h[i]=l,i++,j=!1)}return[h,e[1]]}}function f(b){var c=a.consumeRepeated(e,/^,/,b);if(c&&""==c[1])return c[0]}var g={left:{"%":0},center:{"%":50},right:{"%":100},top:{"%":0},bottom:{"%":100}},h=a.mergeNestedRepeated.bind(null,a.mergeDimensions," ");a.addPropertiesHandler(d.bind(null,3),h,["transform-origin"]),a.addPropertiesHandler(d.bind(null,2),h,["perspective-origin"]),a.consumePosition=e,a.mergeOffsetList=h;var i=a.mergeNestedRepeated.bind(null,h,", ");a.addPropertiesHandler(f,i,["background-position","object-position"])}(d),function(a){function b(b){var c=a.consumeToken(/^circle/,b);if(c&&c[0])return["circle"].concat(a.consumeList([a.ignore(a.consumeToken.bind(void 0,/^\(/)),d,a.ignore(a.consumeToken.bind(void 0,/^at/)),a.consumePosition,a.ignore(a.consumeToken.bind(void 0,/^\)/))],c[1]));var f=a.consumeToken(/^ellipse/,b);if(f&&f[0])return["ellipse"].concat(a.consumeList([a.ignore(a.consumeToken.bind(void 0,/^\(/)),e,a.ignore(a.consumeToken.bind(void 0,/^at/)),a.consumePosition,a.ignore(a.consumeToken.bind(void 0,/^\)/))],f[1]));var g=a.consumeToken(/^polygon/,b);return g&&g[0]?["polygon"].concat(a.consumeList([a.ignore(a.consumeToken.bind(void 0,/^\(/)),a.optional(a.consumeToken.bind(void 0,/^nonzero\s*,|^evenodd\s*,/),"nonzero,"),a.consumeSizePairList,a.ignore(a.consumeToken.bind(void 0,/^\)/))],g[1])):void 0}function c(b,c){if(b[0]===c[0])return"circle"==b[0]?a.mergeList(b.slice(1),c.slice(1),["circle(",a.mergeDimensions," at ",a.mergeOffsetList,")"]):"ellipse"==b[0]?a.mergeList(b.slice(1),c.slice(1),["ellipse(",a.mergeNonNegativeSizePair," at ",a.mergeOffsetList,")"]):"polygon"==b[0]&&b[1]==c[1]?a.mergeList(b.slice(2),c.slice(2),["polygon(",b[1],g,")"]):void 0}var d=a.consumeParenthesised.bind(null,a.parseLengthOrPercent),e=a.consumeRepeated.bind(void 0,d,/^/),f=a.mergeNestedRepeated.bind(void 0,a.mergeDimensions," "),g=a.mergeNestedRepeated.bind(void 0,f,",");a.addPropertiesHandler(b,c,["shape-outside"])}(d),function(a,b){function c(a,b){b.concat([a]).forEach(function(b){b in document.documentElement.style&&(d[a]=b),e[b]=a})}var d={},e={};c("transform",["webkitTransform","msTransform"]),c("transformOrigin",["webkitTransformOrigin"]),c("perspective",["webkitPerspective"]),c("perspectiveOrigin",["webkitPerspectiveOrigin"]),a.propertyName=function(a){return d[a]||a},a.unprefixedPropertyName=function(a){return e[a]||a}}(d)}(),function(){if(void 0===document.createElement("div").animate([]).oncancel){var a;if(window.performance&&performance.now)var a=function(){return performance.now()};else var a=function(){return Date.now()};var b=function(a,b,c){this.target=a,this.currentTime=b,this.timelineTime=c,this.type="cancel",this.bubbles=!1,this.cancelable=!1,this.currentTarget=a,this.defaultPrevented=!1,this.eventPhase=Event.AT_TARGET,this.timeStamp=Date.now()},c=window.Element.prototype.animate;window.Element.prototype.animate=function(d,e){var f=c.call(this,d,e);f._cancelHandlers=[],f.oncancel=null;var g=f.cancel;f.cancel=function(){g.call(this);var c=new b(this,null,a()),d=this._cancelHandlers.concat(this.oncancel?[this.oncancel]:[]);setTimeout(function(){d.forEach(function(a){a.call(c.target,c)})},0)};var h=f.addEventListener;f.addEventListener=function(a,b){"function"==typeof b&&"cancel"==a?this._cancelHandlers.push(b):h.call(this,a,b)};var i=f.removeEventListener;return f.removeEventListener=function(a,b){if("cancel"==a){var c=this._cancelHandlers.indexOf(b);c>=0&&this._cancelHandlers.splice(c,1)}else i.call(this,a,b)},f}}}(),function(a){var b=document.documentElement,c=null,d=!1;try{var e=getComputedStyle(b).getPropertyValue("opacity"),f="0"==e?"1":"0";c=b.animate({opacity:[f,f]},{duration:1}),c.currentTime=0,d=getComputedStyle(b).getPropertyValue("opacity")==f}catch(a){}finally{c&&c.cancel()}if(!d){var g=window.Element.prototype.animate;window.Element.prototype.animate=function(b,c){return window.Symbol&&Symbol.iterator&&Array.prototype.from&&b[Symbol.iterator]&&(b=Array.from(b)),Array.isArray(b)||null===b||(b=a.convertToArrayForm(b)),g.call(this,b,c)}}}(c),b.true=a}({},function(){return this}());
+//# sourceMappingURL=web-animations.min.js.map \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations.min.js.map b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations.min.js.map
new file mode 100644
index 00000000000..c78ace0f3a4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-animations-js/web-animations.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["src/scope.js","src/timing-utilities.js","src/normalize-keyframes.js","src/deprecation.js","src/web-animations-bonus-cancel-events.js","src/web-animations-bonus-object-form-keyframes.js"],"names":["webAnimationsShared","webAnimations1","shared","testing","cloneTimingInput","timingInput","clone","m","AnimationEffectTiming","this","_delay","_endDelay","_fill","_iterationStart","_iterations","_duration","_playbackRate","_direction","_easing","_easingFunction","linear","isInvalidTimingDeprecated","isDeprecated","makeTiming","forGroup","effect","timing","fill","duration","isNaN","Object","getOwnPropertyNames","forEach","property","fills","indexOf","directions","numericTimingToObject","normalizeTimingInput","cubic","a","b","c","d","x","f","start_gradient","end_gradient","start","end","mid","xEst","Math","abs","step","count","pos","stepSize","normalizeEasing","easing","styleForCleaning","document","createElement","style","animationTimingFunction","normalizedEasing","TypeError","parseEasingFunction","cubicData","cubicBezierRe","exec","apply","slice","map","Number","stepData","stepRe","Start","middle","Middle","End","presets","calculateActiveDuration","repeatedDuration","playbackRate","iterations","calculatePhase","activeDuration","localTime","PhaseNone","endTime","delay","endDelay","min","PhaseBefore","PhaseAfter","PhaseActive","calculateActiveTime","fillMode","phase","calculateOverallProgress","iterationDuration","activeTime","iterationStart","overallProgress","calculateSimpleIterationProgress","simpleIterationProgress","Infinity","calculateCurrentIteration","floor","calculateDirectedProgress","playbackDirection","currentIteration","currentDirection","calculateIterationProgress","directedProgress","direction","split","prototype","_setMember","member","value","_effect","_timingInput","_timing","_animation","_rebuildUnderlyingAnimation","ease","ease-in","ease-out","ease-in-out","step-start","step-middle","step-end","numberString","RegExp","antiAlias","aliases","isNotAnimatable","lastIndexOf","expandShorthandAndAntiAlias","result","longProperties","shorthandToLonghand","shorthandExpanderElem","i","longProperty","longhandValue","convertToArrayForm","effectInput","normalizedEffectInput","values","Array","isArray","keyframe","numKeyframes","length","offset","composite","push","sort","normalizeKeyframes","spaceKeyframes","keyframes","previousIndex","previousOffset","j","window","Symbol","iterator","from","originalKeyframe","memberValue","isFinite","type","DOMException","NOT_SUPPORTED_ERR","name","message","everyFrameHasOffset","filter","background","border","borderBottom","borderColor","borderLeft","borderRadius","borderRight","borderTop","borderWidth","flex","font","margin","outline","padding","createElementNS","borderWidthAliases","thin","medium","thick","borderBottomWidth","borderLeftWidth","borderRightWidth","borderTopWidth","fontSize","xx-small","x-small","small","large","x-large","xx-large","fontWeight","normal","bold","outlineWidth","textShadow","none","boxShadow","silenced","feature","date","advice","plural","auxVerb","today","Date","expiry","setMonth","getMonth","console","warn","toDateString","deprecated","Error","animate","oncancel","now","performance","AnimationCancelEvent","target","currentTime","timelineTime","bubbles","cancelable","currentTarget","defaultPrevented","eventPhase","Event","AT_TARGET","timeStamp","originalElementAnimate","Element","options","animation","call","_cancelHandlers","originalCancel","cancel","event","handlers","concat","setTimeout","handler","originalAddEventListener","addEventListener","originalRemoveEventListener","removeEventListener","index","splice","element","documentElement","animated","originalOpacity","getComputedStyle","getPropertyValue","testOpacity","opacity","error","webAnimationsNext","exports","webAnimationsTesting"],"mappings":";;;;;;;;;;;;;;CAcA,SAAIA,EAAAA,GAAJ,GAAIA,MACAC,MCDJ,SAAUC,EAAQC,GAMhB,QAASC,GAAiBC,GACxB,GAA0B,gBAAfA,GACT,MAAOA,EAET,IAAIC,KACJ,KAAK,GAAIC,KAAKF,GACZC,EAAMC,GAAKF,EAAYE,EAEzB,OAAOD,GAGT,QAASE,KACPC,KAAKC,OAAS,EACdD,KAAKE,UAAY,EACjBF,KAAKG,MAAQ,OACbH,KAAKI,gBAAkB,EACvBJ,KAAKK,YAAc,EACnBL,KAAKM,UAAY,EACjBN,KAAKO,cAAgB,EACrBP,KAAKQ,WAAa,SAClBR,KAAKS,QAAU,SACfT,KAAKU,gBAAkBC,EAGzB,QAASC,KACP,MAAOnB,GAAOoB,aAAa,wBAAyB,aAAc,gDAAA,GA8EpE,QAASC,GAAWlB,EAAamB,EAAUC,GACzC,GAAIC,GAAS,GAAIlB,EA4BjB,OA3BIgB,KACFE,EAAOC,KAAO,OACdD,EAAOE,SAAW,QAEM,gBAAfvB,IAA4BwB,MAAMxB,OAAAA,KAElCA,GACTyB,OAAOC,oBAAoB1B,GAAa2B,QAAQ,SAASC,GACvD,GAA6B,QAAzB5B,EAAY4B,GAAqB,CACnC,IAA+B,gBAApBP,GAAOO,IAAqC,YAAZA,KACL,gBAAzB5B,GAAY4B,IAAyBJ,MAAMxB,EAAY4B,KAChE,MAGJ,IAAiB,QAAZA,IAAiE,GAAzCC,EAAMC,QAAQ9B,EAAY4B,IACrD,MAEF,IAAiB,aAAZA,IAA2E,GAA9CG,EAAWD,QAAQ9B,EAAY4B,IAC/D,MAEF,IAAgB,gBAAZA,GAAwD,IAA1B5B,EAAY4B,IAAmB/B,EAAOoB,aAAa,qCAAsC,aAAc,uCACvI,MAEFI,GAAOO,GAAY5B,EAAY4B,MAlBnCP,EAAOE,SAAWvB,EAsBbqB,EAGT,QAASW,GAAsBhC,GAQ7B,MAP0B,gBAAfA,KAEPA,EADEwB,MAAMxB,IACQuB,SAAU,IAEVA,SAAUvB,IAGvBA,EAGT,QAASiC,GAAqBjC,EAAamB,GAEzC,MADAnB,GAAcH,EAAOmC,sBAAsBhC,GACpCkB,EAAWlB,EAAamB,GAGjC,QAASe,GAAMC,EAAGC,EAAGC,EAAGC,GACtB,MAAIH,GAAI,GAAKA,EAAI,GAAKE,EAAI,GAAKA,EAAI,EAC1BtB,EAEF,SAASwB,GAqBZ,QAASC,GAAEL,EAAGC,EAAGlC,GAAK,MAAO,GAAIiC,GAAK,EAAIjC,IAAM,EAAIA,GAAKA,EAAI,EAAIkC,GAAK,EAAIlC,GAAKA,EAAIA,EAAIA,EAAIA,EAAIA,EApBjG,GAAIqC,GAAK,EAAG,CACV,GAAIE,GAAiB,CAKrB,OAJIN,GAAI,EACNM,EAAiBL,EAAID,GACbC,GAAKC,EAAI,IACjBI,EAAiBH,EAAID,GAChBI,EAAiBF,EAE1B,GAAIA,GAAK,EAAG,CACV,GAAIG,GAAe,CAKnB,OAJIL,GAAI,EACNK,GAAgBJ,EAAI,IAAMD,EAAI,GAClB,GAALA,GAAUF,EAAI,IACrBO,GAAgBN,EAAI,IAAMD,EAAI,IACzB,EAAIO,GAAgBH,EAAI,GAIjC,IADA,GAAII,GAAQ,EAAGC,EAAM,EACdD,EAAQC,GAAK,CAClB,GAAIC,IAAOF,EAAQC,GAAO,EAEtBE,EAAON,EAAEL,EAAGE,EAAGQ,EACnB,IAAIE,KAAKC,IAAIT,EAAIO,GAAQ,KACvB,MAAON,GAAEJ,EAAGE,EAAGO,EAEbC,GAAOP,EACTI,EAAQE,EAERD,EAAMC,EAGV,MAAOL,GAAEJ,EAAGE,EAAGO,IAQnB,QAASI,GAAKC,EAAOC,GACnB,MAAO,UAASZ,GACd,GAAIA,GAAK,EACP,MAAO,EAET,IAAIa,GAAW,EAAIF,CAEnB,QADAX,GAAKY,EAAMC,GACAb,EAAIa,GAmBnB,QAASC,GAAgBC,GAClBC,IACHA,EAAmBC,SAASC,cAAc,OAAOC,OAEnDH,EAAiBI,wBAA0B,GAC3CJ,EAAiBI,wBAA0BL,CAC3C,IAAIM,GAAmBL,EAAiBI,uBACxC,IAAwB,IAApBC,GAA0B5C,IAC5B,KAAM,IAAI6C,WAAUP,EAAS,mCAE/B,OAAOM,GAGT,QAASE,GAAoBF,GAC3B,GAAwB,UAApBA,EACF,MAAO7C,EAET,IAAIgD,GAAYC,EAAcC,KAAKL,EACnC,IAAIG,EACF,MAAO7B,GAAMgC,MAAM9D,KAAM2D,EAAUI,MAAM,GAAGC,IAAIC,QAElD,IAAIC,GAAWC,EAAON,KAAKL,EAC3B,OAAIU,GACKrB,EAAKoB,OAAOC,EAAS,KAAM3B,MAAS6B,EAAOC,OAAUC,EAAQ9B,IAAO+B,GAAKL,EAAS,KAE9EM,EAAQhB,IAMd7C,EAGT,QAAS8D,GAAwBxD,GAC/B,MAAO0B,MAAKC,IAAI8B,EAAiBzD,GAAUA,EAAO0D,cAGpD,QAASD,GAAiBzD,GAExB,MAAwB,KAApBA,EAAOE,UAAwC,IAAtBF,EAAO2D,WAC3B,EAEF3D,EAAOE,SAAWF,EAAO2D,WAQlC,QAASC,GAAeC,EAAgBC,EAAW9D,GAEjD,GAAiB,MAAb8D,EACF,MAAOC,EAGT,IAAIC,GAAUhE,EAAOiE,MAAQJ,EAAiB7D,EAAOkE,QACrD,OAAIJ,GAAYpC,KAAKyC,IAAInE,EAAOiE,MAAOD,GAC9BI,EAELN,GAAapC,KAAKyC,IAAInE,EAAOiE,MAAQJ,EAAgBG,GAChDK,EAGFC,EAGT,QAASC,GAAoBV,EAAgBW,EAAUV,EAAWW,EAAOR,GAEvE,OAAQQ,GACN,IAAKL,GACH,MAAgB,aAAZI,GAAuC,QAAZA,EACtB,EACF,IACT,KAAKF,GACH,MAAOR,GAAYG,CACrB,KAAKI,GACH,MAAgB,YAAZG,GAAsC,QAAZA,EACrBX,EACF,IACT,KAAKE,GACH,MAAO,OAIb,QAASW,GAAyBC,EAAmBF,EAAOd,EAAYiB,EAAYC,GAElF,GAAIC,GAAkBD,CAQtB,OAP0B,KAAtBF,EACEF,IAAUL,IACZU,GAAmBnB,GAGrBmB,GAAmBF,EAAaD,EAE3BG,EAGT,QAASC,GAAiCD,EAAiBD,EAAgBJ,EAAOd,EAAYiB,EAAYD,GAGxG,GAAIK,GAA2BF,IAAoBG,EAAAA,EAAYJ,EAAiB,EAAIC,EAAkB,CAKtG,OAJgC,KAA5BE,GAAiCP,IAAUJ,GAA6B,IAAfV,GACzC,IAAfiB,GAA0C,IAAtBD,IACvBK,EAA0B,GAErBA,EAGT,QAASE,GAA0BT,EAAOd,EAAYqB,EAAyBF,GAE7E,MAAIL,KAAUJ,GAAcV,IAAesB,EAAAA,EAClCA,EAAAA,EAEuB,IAA5BD,EACKtD,KAAKyD,MAAML,GAAmB,EAEhCpD,KAAKyD,MAAML,GAGpB,QAASM,GAA0BC,EAAmBC,EAAkBN,GAEtE,GAAIO,GAAmBF,CACvB,IAA0B,WAAtBA,GAAwD,YAAtBA,EAAiC,CACrE,GAAIpE,GAAIqE,CACkB,uBAAtBD,IACFpE,GAAK,GAEPsE,EAAmB,SACftE,IAAMgE,EAAAA,GAAYhE,EAAI,GAAM,IAC9BsE,EAAmB,WAGvB,MAAyB,WAArBA,EACKP,EAEF,EAAIA,EAGb,QAASQ,GAA2B3B,EAAgBC,EAAW9D,GAC7D,GAAIyE,GAAQb,EAAeC,EAAgBC,EAAW9D,GAClD4E,EAAaL,EAAoBV,EAAgB7D,EAAOC,KAAM6D,EAAWW,EAAOzE,EAAOiE,MAC3F,IAAmB,OAAfW,EACF,MAAO,KAET,IAAIE,GAAkBJ,EAAyB1E,EAAOE,SAAUuE,EAAOzE,EAAO2D,WAAYiB,EAAY5E,EAAO6E,gBACzGG,EAA0BD,EAAiCD,EAAiB9E,EAAO6E,eAAgBJ,EAAOzE,EAAO2D,WAAYiB,EAAY5E,EAAOE,UAChJoF,EAAmBJ,EAA0BT,EAAOzE,EAAO2D,WAAYqB,EAAyBF,GAChGW,EAAmBL,EAA0BpF,EAAO0F,UAAWJ,EAAkBN,EAIrF,OAAOhF,GAAOP,gBAAgBgG,GA1XhC,GAAIjF,GAAQ,+BAA+BmF,MAAM,KAC7CjF,EAAa,sCAAsCiF,MAAM,KACzDjG,EAAS,SAASwB,GAAK,MAAOA,GA8BlCpC,GAAsB8G,WACpBC,WAAY,SAASC,EAAQC,GAC3BhH,KAAK,IAAM+G,GAAUC,EACjBhH,KAAKiH,UACPjH,KAAKiH,QAAQC,aAAaH,GAAUC,EACpChH,KAAKiH,QAAQE,QAAU1H,EAAOoC,qBAAqB7B,KAAKiH,QAAQC,cAChElH,KAAKiH,QAAQnC,eAAiBrF,EAAOgF,wBAAwBzE,KAAKiH,QAAQE,SACtEnH,KAAKiH,QAAQG,YACfpH,KAAKiH,QAAQG,WAAWC,gCAI9B1C,mBACE,MAAO3E,MAAKO,eAEd2E,UAAU8B,GACRhH,KAAK8G,WAAW,QAASE,IAE3B9B,YACE,MAAOlF,MAAKC,QAEdkF,aAAa6B,GACXhH,KAAK8G,WAAW,WAAYE,IAE9B7B,eACE,MAAOnF,MAAKE,WAEdgB,SAAS8F,GACPhH,KAAK8G,WAAW,OAAQE,IAE1B9F,WACE,MAAOlB,MAAKG,OAEd2F,mBAAmBkB,GACjB,IAAK5F,MAAM4F,IAAUA,EAAQ,IAAMpG,IACjC,KAAM,IAAI6C,WAAU,2DAA6DxC,OAAO6E,eAE1F9F,MAAK8G,WAAW,iBAAkBE,IAEpClB,qBACE,MAAO9F,MAAKI,iBAEde,aAAa6F,GACX,GAAa,QAATA,IAAoB5F,MAAM4F,IAAUA,EAAQ,IAAMpG,IACpD,KAAM,IAAI6C,WAAU,oDAAsDuD,EAE5EhH,MAAK8G,WAAW,WAAYE,IAE9B7F,eACE,MAAOnB,MAAKM,WAEdqG,cAAcK,GACZhH,KAAK8G,WAAW,YAAaE,IAE/BL,gBACE,MAAO3G,MAAKQ,YAEd0C,WAAW8D,GACThH,KAAKU,gBAAkBgD,EAAoBT,EAAgB+D,IAC3DhH,KAAK8G,WAAW,SAAUE,IAE5B9D,aACE,MAAOlD,MAAKS,SAEdmE,eAAeoC,GACb,IAAK5F,MAAM4F,IAAUA,EAAQ,IAAMpG,IACjC,KAAM,IAAI6C,WAAU,8CAAgDuD,EAEtEhH,MAAK8G,WAAW,aAAcE,IAEhCpC,iBACE,MAAO5E,MAAKK,aA4FhB,IAAI+D,GAAQ,EACRE,EAAS,GACTC,EAAM,EAaNC,GACF8C,KAAQxF,EAAM,IAAM,GAAK,IAAM,GAC/ByF,UAAWzF,EAAM,IAAM,EAAG,EAAG,GAC7B0F,WAAY1F,EAAM,EAAG,EAAG,IAAM,GAC9B2F,cAAe3F,EAAM,IAAM,EAAG,IAAM,GACpC4F,aAAc7E,EAAK,EAAGuB,GACtBuD,cAAe9E,EAAK,EAAGyB,GACvBsD,WAAY/E,EAAK,EAAG0B,IAGlBpB,EAAmB,KACnB0E,EAAe,qCACfjE,EAAgB,GAAIkE,QAAO,kBAAoBD,EAAe,IAAMA,EAAe,IAAMA,EAAe,IAAMA,EAAe,OAC7H1D,EAAS,gDAgDTa,EAAY,EACZK,EAAc,EACdC,EAAa,EACbC,EAAc,CA2GlB9F,GAAOE,iBAAmBA,EAC1BF,EAAOqB,WAAaA,EACpBrB,EAAOmC,sBAAwBA,EAC/BnC,EAAOoC,qBAAuBA,EAC9BpC,EAAOgF,wBAA0BA,EACjChF,EAAOgH,2BAA6BA,EACpChH,EAAOoF,eAAiBA,EACxBpF,EAAOwD,gBAAkBA,EACzBxD,EAAOiE,oBAAsBA,GAc5BnE,GCrZH,SAAUE,EAAQC,GAmIhB,QAASqI,GAAUvG,EAAUwF,GAC3B,MAAIxF,KAAYwG,GACPA,EAAQxG,GAAUwF,IAAUA,EAE9BA,EAGT,QAASiB,GAAgBzG,GAEvB,MAAoB,YAAbA,GAAmE,IAAzCA,EAAS0G,YAAY,YAAa,IAAsD,IAA1C1G,EAAS0G,YAAY,aAAc,GAIpH,QAASC,GAA4B3G,EAAUwF,EAAOoB,GACpD,IAAIH,EAAgBzG,GAApB,CAGA,GAAI6G,GAAiBC,EAAoB9G,EACzC,IAAI6G,EAAgB,CAClBE,EAAsBjF,MAAM9B,GAAYwF,CACxC,KAAK,GAAIwB,KAAKH,GAAgB,CAC5B,GAAII,GAAeJ,EAAeG,GAC9BE,EAAgBH,EAAsBjF,MAAMmF,EAChDL,GAAOK,GAAgBV,EAAUU,EAAcC,QAGjDN,GAAO5G,GAAYuG,EAAUvG,EAAUwF,IAI3C,QAAS2B,GAAmBC,GAC1B,GAAIC,KAEJ,KAAK,GAAIrH,KAAYoH,GACnB,KAAIpH,KAAa,SAAU,SAAU,cAArC,CAIA,GAAIsH,GAASF,EAAYpH,EACpBuH,OAAMC,QAAQF,KACjBA,GAAUA,GAKZ,KAAK,GAFDG,GACAC,EAAeJ,EAAOK,OACjBX,EAAI,EAAGA,EAAIU,EAAcV,IAChCS,KAGEA,EAASG,OADP,UAAYR,GACIA,EAAYQ,OACL,GAAhBF,EACS,EAEAV,GAAKU,EAAe,GAGpC,UAAYN,KACdK,EAAS/F,OAAS0F,EAAY1F,QAG5B,aAAe0F,KACjBK,EAASI,UAAYT,EAAYS,WAGnCJ,EAASzH,GAAYsH,EAAON,GAE5BK,EAAsBS,KAAKL,GAK/B,MADAJ,GAAsBU,KAAK,SAASxH,EAAGC,GAAK,MAAOD,GAAEqH,OAASpH,EAAEoH,SACzDP,EAGT,QAASW,GAAmBZ,GAqE1B,QAASa,KACP,GAAIN,GAASO,EAAUP,MACa,OAAhCO,EAAUP,EAAS,GAAGC,SACxBM,EAAUP,EAAS,GAAGC,OAAS,GAC7BD,EAAS,GAA4B,MAAvBO,EAAU,GAAGN,SAC7BM,EAAU,GAAGN,OAAS,EAIxB,KAAK,GAFDO,GAAgB,EAChBC,EAAiBF,EAAU,GAAGN,OACzBZ,EAAI,EAAGA,EAAIW,EAAQX,IAAK,CAC/B,GAAIY,GAASM,EAAUlB,GAAGY,MAC1B,IAAc,MAAVA,EAAgB,CAClB,IAAK,GAAIS,GAAI,EAAGA,EAAIrB,EAAImB,EAAeE,IACrCH,EAAUC,EAAgBE,GAAGT,OAASQ,GAAkBR,EAASQ,GAAkBC,GAAKrB,EAAImB,EAC9FA,GAAgBnB,EAChBoB,EAAiBR,IAnFvB,GAAmB,MAAfR,EACF,QAGEkB,QAAOC,QAAUA,OAAOC,UAAYjB,MAAMlC,UAAUoD,MAAQrB,EAAYmB,OAAOC,YAEjFpB,EAAcG,MAAMkB,KAAKrB,IAGtBG,MAAMC,QAAQJ,KACjBA,EAAcD,EAAmBC,GA0CnC,KAAK,GAvCDc,GAAYd,EAAY5E,IAAI,SAASkG,GACvC,GAAIjB,KACJ,KAAK,GAAIlC,KAAUmD,GAAkB,CACnC,GAAIC,GAAcD,EAAiBnD,EACnC,IAAc,UAAVA,GACF,GAAmB,MAAfoD,EAAqB,CAEvB,GADAA,EAAclG,OAAOkG,IAChBC,SAASD,GACZ,KAAM,IAAI1G,WAAU,oCACtB,IAAI0G,EAAc,GAAKA,EAAc,EACnC,KAAM,IAAI1G,WAAU,kDAEnB,IAAc,aAAVsD,EAAuB,CAChC,GAAmB,OAAfoD,GAAuC,cAAfA,EAC1B,MACEE,KAAMC,aAAaC,kBACnBC,KAAM,oBACNC,QAAS,mCAEN,IAAmB,WAAfN,EACT,KAAM,IAAI1G,WAAU,0BAA4B0G,EAAc,SAGhEA,GADmB,UAAVpD,EACKtH,EAAOwD,gBAAgBkH,GAEvB,GAAKA,CAErBhC,GAA4BpB,EAAQoD,EAAalB,GAMnD,WAAA,IAJIA,EAASG,SACXH,EAASG,OAAS,UAAA,IAChBH,EAAS/F,SACX+F,EAAS/F,OAAS,UACb+F,IAGLyB,GAAAA,EAEAd,GAAAA,EAAAA,EACKpB,EAAI,EAAGA,EAAIkB,EAAUP,OAAQX,IAAK,CACzC,GAAIY,GAASM,EAAUlB,GAAGY,MAC1B,IAAc,MAAVA,EAAgB,CAClB,GAAIA,EAASQ,EACX,KAAM,IAAInG,WAAU,uEAEtBmG,GAAiBR,MAEjBsB,IAAAA,EA8BJ,MA1BAhB,GAAYA,EAAUiB,OAAO,SAAS1B,GACpC,MAAOA,GAASG,QAAU,GAAKH,EAASG,QAAU,IAsB/CsB,GACHjB,IAEKC,EAvST,GAAIpB,IACFsC,YACE,kBACA,qBACA,iBACA,mBACA,uBACA,mBACA,iBACA,mBAEFC,QACE,iBACA,iBACA,iBACA,mBACA,mBACA,mBACA,oBACA,oBACA,oBACA,kBACA,kBACA,mBAEFC,cACE,oBACA,oBACA,qBAEFC,aACE,iBACA,mBACA,oBACA,mBAEFC,YACE,kBACA,kBACA,mBAEFC,cACE,sBACA,uBACA,0BACA,0BAEFC,aACE,mBACA,mBACA,oBAEFC,WACE,iBACA,iBACA,kBAEFC,aACE,iBACA,mBACA,oBACA,mBAEFC,MACE,WACA,aACA,aAEFC,MACE,aACA,WACA,YACA,cACA,aACA,cAEFC,QACE,YACA,cACA,eACA,cAEFC,SACE,eACA,eACA,gBAEFC,SACE,aACA,eACA,gBACA,gBAIAlD,EAAwBnF,SAASsI,gBAAgB,+BAAgC,OAEjFC,GACFC,KAAM,MACNC,OAAQ,MACRC,MAAO,OAGL9D,GACF+D,kBAAmBJ,EACnBK,gBAAiBL,EACjBM,iBAAkBN,EAClBO,eAAgBP,EAChBQ,UACEC,WAAY,MACZC,UAAW,MACXC,MAAS,MACTT,OAAU,OACVU,MAAS,OACTC,UAAW,OACXC,WAAY,QAEdC,YACEC,OAAQ,MACRC,KAAM,OAERC,aAAclB,EACdmB,YACEC,KAAM,2BAERC,WACED,KAAM,+BA4KVtN,GAAOkJ,mBAAqBA,EAC5BlJ,EAAO+J,mBAAqBA,GAM3BjK,GClTH,SAAUE,GAER,GAAIwN,KAEJxN,GAAOoB,aAAe,SAASqM,EAASC,EAAMC,EAAQC,GAKpD,GAAIC,GAAUD,EAAS,MAAQ,KAC3BE,EAAQ,GAAIC,MACZC,EAAS,GAAID,MAAKL,EAGtB,OAFAM,GAAOC,SAASD,EAAOE,WAAa,KAEhCJ,EAAQE,IACJP,IAAWD,IACfW,QAAQC,KAAK,mBAAqBX,EAAU,IAAMI,EAAU,wCAA0CG,EAAOK,eAAiB,KAAOV,GAEvIH,EAASC,IAAAA,EAAW,KAOxBzN,EAAOsO,WAAa,SAASb,EAASC,EAAMC,EAAQC,GAClD,GAAIC,GAAUD,EAAS,MAAQ,IAC/B,IAAI5N,EAAOoB,aAAaqM,EAASC,EAAMC,EAAQC,GAC7C,KAAM,IAAIW,OAAMd,EAAU,IAAMI,EAAU,yBAA2BF,KAIxE7N,62mCChCH,WAEE,OAAA,KAAI6D,SAASC,cAAc,OAAO4K,YAAYC,SAA9C,CAKE,GAAIC,EACC,IAAIrE,OAAOsE,aAAeA,YAAYD,IAC3C,GAAIA,GAAM,WAAa,MAAOC,aAAYD,WAE1C,IAAIA,GAAM,WAAa,MAAOX,MAAKW,MAGrC,IAAIE,GAAuB,SAASC,EAAQC,EAAaC,GACvDxO,KAAKsO,OAASA,EACdtO,KAAKuO,YAAcA,EACnBvO,KAAKwO,aAAeA,EAEpBxO,KAAKqK,KAAO,SACZrK,KAAKyO,SAAAA,EACLzO,KAAK0O,YAAAA,EACL1O,KAAK2O,cAAgBL,EACrBtO,KAAK4O,kBAAAA,EACL5O,KAAK6O,WAAaC,MAAMC,UACxB/O,KAAKgP,UAAYxB,KAAKW,OAGpBc,EAAyBnF,OAAOoF,QAAQrI,UAAUoH,OACtDnE,QAAOoF,QAAQrI,UAAUoH,QAAU,SAASrF,EAAauG,GACvD,GAAIC,GAAYH,EAAuBI,KAAKrP,KAAM4I,EAAauG,EAE/DC,GAAUE,mBACVF,EAAUlB,SAAW,IAErB,IAAIqB,GAAiBH,EAAUI,MAC/BJ,GAAUI,OAAS,WACjBD,EAAeF,KAAKrP,KACpB,IAAIyP,GAAQ,GAAIpB,GAAqBrO,KAAM,KAAMmO,KAC7CuB,EAAW1P,KAAKsP,gBAAgBK,OAAO3P,KAAKkO,UAAYlO,KAAKkO,aACjE0B,YAAW,WACTF,EAASnO,QAAQ,SAASsO,GACxBA,EAAQR,KAAKI,EAAMnB,OAAQmB,MAE5B,GAGL,IAAIK,GAA2BV,EAAUW,gBACzCX,GAAUW,iBAAmB,SAAS1F,EAAMwF,GACpB,kBAAXA,IAAiC,UAARxF,EAClCrK,KAAKsP,gBAAgBhG,KAAKuG,GAE1BC,EAAyBT,KAAKrP,KAAMqK,EAAMwF,GAG9C,IAAIG,GAA8BZ,EAAUa,mBAW5C,OAVAb,GAAUa,oBAAsB,SAAS5F,EAAMwF,GAC7C,GAAY,UAARxF,EAAkB,CACpB,GAAI6F,GAAQlQ,KAAKsP,gBAAgB5N,QAAQmO,EACrCK,IAAS,GACXlQ,KAAKsP,gBAAgBa,OAAOD,EAAO,OAErCF,GAA4BX,KAAKrP,KAAMqK,EAAMwF,IAI1CT,OClEX,SAAU3P,GAgBR,GAAI2Q,GAAUhN,SAASiN,gBACnBjB,EAAY,KACZkB,GAAAA,CACJ,KACE,GAAIC,GAAkBC,iBAAiBJ,GAASK,iBAAiB,WAC7DC,EAAiC,KAAnBH,EAAyB,IAAM,GACjDnB,GAAYgB,EAAQnC,SAAS0C,SAAYD,EAAaA,KACjDvP,SAAU,IACfiO,EAAUb,YAAc,EACxB+B,EAAWE,iBAAiBJ,GAASK,iBAAiB,YAAcC,EACpE,MAAOE,IACP,QACIxB,GACFA,EAAUI,SAEd,IAAIc,EAAJ,CAIA,GAAIrB,GAAyBnF,OAAOoF,QAAQrI,UAAUoH,OACtDnE,QAAOoF,QAAQrI,UAAUoH,QAAU,SAASrF,EAAauG,GAUvD,MATIrF,QAAOC,QAAUA,OAAOC,UAAYjB,MAAMlC,UAAUoD,MAAQrB,EAAYmB,OAAOC,YAEjFpB,EAAcG,MAAMkB,KAAKrB,IAGtBG,MAAMC,QAAQJ,IAAgC,OAAhBA,IACjCA,EAAcnJ,EAAOkJ,mBAAmBC,IAGnCqG,EAAuBI,KAAKrP,KAAM4I,EAAauG,MAEvD5P,GL9CCsR,EAAAA,KAEJC,MACMC,WAAAA,MAAuB/Q","file":"web-animations.min.js"} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/.bower.json
new file mode 100644
index 00000000000..df9108d26b8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/.bower.json
@@ -0,0 +1,53 @@
+{
+ "name": "web-component-tester",
+ "description": "web-component-tester makes testing your web components a breeze!",
+ "version": "6.5.0",
+ "main": [
+ "browser.js"
+ ],
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "ignore": [
+ "*",
+ "!/data/*",
+ "!/browser.js",
+ "!/browser.js.map",
+ "!/package.json",
+ "!/bower.json"
+ ],
+ "keywords": [
+ "browser",
+ "grunt",
+ "gruntplugin",
+ "gulp",
+ "polymer",
+ "test",
+ "testing",
+ "web component",
+ "web"
+ ],
+ "dependencies": {
+ "accessibility-developer-tools": "^2.10.0",
+ "async": "^1.5.0",
+ "chai": "^3.2.0",
+ "lodash": "^3.7.0",
+ "mocha": "^3.1.2",
+ "sinon-chai": "^2.7.0",
+ "sinonjs": "^1.14.1",
+ "stacky": "^1.3.0",
+ "test-fixture": "^3.0.0"
+ },
+ "devDependencies": {
+ "polymer": "Polymer/polymer#^1.5.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.22"
+ },
+ "homepage": "https://github.com/Polymer/web-component-tester",
+ "_release": "6.5.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v6.5.0",
+ "commit": "0fc9578a61862266820c4ce11b2be5fa3c2241a5"
+ },
+ "_source": "https://github.com/Polymer/web-component-tester.git",
+ "_target": "^6.5.0",
+ "_originalSource": "web-component-tester"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/bower.json
new file mode 100644
index 00000000000..9defbb91430
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/bower.json
@@ -0,0 +1,43 @@
+{
+ "name": "web-component-tester",
+ "description": "web-component-tester makes testing your web components a breeze!",
+ "version": "6.0.0",
+ "main": [
+ "browser.js"
+ ],
+ "license": "http://polymer.github.io/LICENSE.txt",
+ "ignore": [
+ "*",
+ "!/data/*",
+ "!/browser.js",
+ "!/browser.js.map",
+ "!/package.json",
+ "!/bower.json"
+ ],
+ "keywords": [
+ "browser",
+ "grunt",
+ "gruntplugin",
+ "gulp",
+ "polymer",
+ "test",
+ "testing",
+ "web component",
+ "web"
+ ],
+ "dependencies": {
+ "accessibility-developer-tools": "^2.10.0",
+ "async": "^1.5.0",
+ "chai": "^3.2.0",
+ "lodash": "^3.7.0",
+ "mocha": "^3.1.2",
+ "sinon-chai": "^2.7.0",
+ "sinonjs": "^1.14.1",
+ "stacky": "^1.3.0",
+ "test-fixture": "^3.0.0"
+ },
+ "devDependencies": {
+ "polymer": "Polymer/polymer#^1.5.0",
+ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.22"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/browser.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/browser.js
new file mode 100644
index 00000000000..1db061798e6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/browser.js
@@ -0,0 +1,1865 @@
+/**
+ * @license
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+/**
+ * THIS FILE IS AUTOMATICALLY GENERATED!
+ * To make changes to browser.js, please edit the source files in the repo's `browser/` directory!
+ */
+
+(function () {
+'use strict';
+
+window.__wctUseNpm = false;
+/**
+ * @license
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at
+ * http://polymer.github.io/LICENSE.txt The complete set of authors may be found
+ * at http://polymer.github.io/AUTHORS.txt The complete set of contributors may
+ * be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by
+ * Google as part of the polymer project is also subject to an additional IP
+ * rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+// Make sure that we use native timers, in case they're being stubbed out.
+var nativeSetInterval = window.setInterval;
+var nativeSetTimeout = window.setTimeout;
+var nativeRequestAnimationFrame = window.requestAnimationFrame;
+/**
+ * Runs `stepFn`, catching any error and passing it to `callback` (Node-style).
+ * Otherwise, calls `callback` with no arguments on success.
+ *
+ * @param {function()} callback
+ * @param {function()} stepFn
+ */
+function safeStep(callback, stepFn) {
+ var err;
+ try {
+ stepFn();
+ }
+ catch (error) {
+ err = error;
+ }
+ callback(err);
+}
+/**
+ * Runs your test at declaration time (before Mocha has begun tests). Handy for
+ * when you need to test document initialization.
+ *
+ * Be aware that any errors thrown asynchronously cannot be tied to your test.
+ * You may want to catch them and pass them to the done event, instead. See
+ * `safeStep`.
+ *
+ * @param {string} name The name of the test.
+ * @param {function(?function())} testFn The test function. If an argument is
+ * accepted, the test will be treated as async, just like Mocha tests.
+ */
+function testImmediate(name, testFn) {
+ if (testFn.length > 0) {
+ return testImmediateAsync(name, testFn);
+ }
+ var err;
+ try {
+ testFn();
+ }
+ catch (error) {
+ err = error;
+ }
+ test(name, function (done) {
+ done(err);
+ });
+}
+/**
+ * An async-only variant of `testImmediate`.
+ *
+ * @param {string} name
+ * @param {function(?function())} testFn
+ */
+function testImmediateAsync(name, testFn) {
+ var testComplete = false;
+ var err;
+ test(name, function (done) {
+ var intervalId = nativeSetInterval(function () {
+ if (!testComplete)
+ return;
+ clearInterval(intervalId);
+ done(err);
+ }, 10);
+ });
+ try {
+ testFn(function (error) {
+ if (error)
+ err = error;
+ testComplete = true;
+ });
+ }
+ catch (error) {
+ err = error;
+ testComplete = true;
+ }
+}
+/**
+ * Triggers a flush of any pending events, observations, etc and calls you back
+ * after they have been processed.
+ *
+ * @param {function()} callback
+ */
+function flush(callback) {
+ // Ideally, this function would be a call to Polymer.dom.flush, but that
+ // doesn't support a callback yet
+ // (https://github.com/Polymer/polymer-dev/issues/851),
+ // ...and there's cross-browser flakiness to deal with.
+ // Make sure that we're invoking the callback with no arguments so that the
+ // caller can pass Mocha callbacks, etc.
+ var done = function done() {
+ callback();
+ };
+ // Because endOfMicrotask is flaky for IE, we perform microtask checkpoints
+ // ourselves (https://github.com/Polymer/polymer-dev/issues/114):
+ var isIE = navigator.appName === 'Microsoft Internet Explorer';
+ if (isIE && window.Platform && window.Platform.performMicrotaskCheckpoint) {
+ var reallyDone_1 = done;
+ done = function doneIE() {
+ Platform.performMicrotaskCheckpoint();
+ nativeSetTimeout(reallyDone_1, 0);
+ };
+ }
+ // Everyone else gets a regular flush.
+ var scope;
+ if (window.Polymer && window.Polymer.dom && window.Polymer.dom.flush) {
+ scope = window.Polymer.dom;
+ }
+ else if (window.Polymer && window.Polymer.flush) {
+ scope = window.Polymer;
+ }
+ else if (window.WebComponents && window.WebComponents.flush) {
+ scope = window.WebComponents;
+ }
+ if (scope) {
+ scope.flush();
+ }
+ // Ensure that we are creating a new _task_ to allow all active microtasks to
+ // finish (the code you're testing may be using endOfMicrotask, too).
+ nativeSetTimeout(done, 0);
+}
+/**
+ * Advances a single animation frame.
+ *
+ * Calls `flush`, `requestAnimationFrame`, `flush`, and `callback` sequentially
+ * @param {function()} callback
+ */
+function animationFrameFlush(callback) {
+ flush(function () {
+ nativeRequestAnimationFrame(function () {
+ flush(callback);
+ });
+ });
+}
+/**
+ * DEPRECATED: Use `flush`.
+ * @param {function} callback
+ */
+function asyncPlatformFlush(callback) {
+ console.warn('asyncPlatformFlush is deprecated in favor of the more terse flush()');
+ return window.flush(callback);
+}
+/**
+ *
+ */
+function waitFor(fn, next, intervalOrMutationEl, timeout, timeoutTime) {
+ timeoutTime = timeoutTime || Date.now() + (timeout || 1000);
+ intervalOrMutationEl = intervalOrMutationEl || 32;
+ try {
+ fn();
+ }
+ catch (e) {
+ if (Date.now() > timeoutTime) {
+ throw e;
+ }
+ else {
+ if (typeof intervalOrMutationEl !== 'number') {
+ intervalOrMutationEl.onMutation(intervalOrMutationEl, function () {
+ waitFor(fn, next, intervalOrMutationEl, timeout, timeoutTime);
+ });
+ }
+ else {
+ nativeSetTimeout(function () {
+ waitFor(fn, next, intervalOrMutationEl, timeout, timeoutTime);
+ }, intervalOrMutationEl);
+ }
+ return;
+ }
+ }
+ next();
+}
+window.safeStep = safeStep;
+window.testImmediate = testImmediate;
+window.testImmediateAsync = testImmediateAsync;
+window.flush = flush;
+window.animationFrameFlush = animationFrameFlush;
+window.asyncPlatformFlush = asyncPlatformFlush;
+window.waitFor = waitFor;
+
+/**
+ * The global configuration state for WCT's browser client.
+ */
+var _config = {
+ environmentScripts: !!window.__wctUseNpm ?
+ [
+ 'stacky/browser.js', 'async/lib/async.js', 'lodash/index.js',
+ 'mocha/mocha.js', 'chai/chai.js', '@polymer/sinonjs/sinon.js',
+ 'sinon-chai/lib/sinon-chai.js',
+ 'accessibility-developer-tools/dist/js/axs_testing.js',
+ '@polymer/test-fixture/test-fixture.js'
+ ] :
+ [
+ 'stacky/browser.js', 'async/lib/async.js', 'lodash/lodash.js',
+ 'mocha/mocha.js', 'chai/chai.js', 'sinonjs/sinon.js',
+ 'sinon-chai/lib/sinon-chai.js',
+ 'accessibility-developer-tools/dist/js/axs_testing.js'
+ ],
+ environmentImports: !!window.__wctUseNpm ? [] :
+ ['test-fixture/test-fixture.html'],
+ root: null,
+ waitForFrameworks: true,
+ waitFor: null,
+ numConcurrentSuites: 1,
+ trackConsoleError: true,
+ mochaOptions: { timeout: 10 * 1000 },
+ verbose: false,
+};
+/**
+ * Merges initial `options` into WCT's global configuration.
+ *
+ * @param {Object} options The options to merge. See `browser/config.js` for a
+ * reference.
+ */
+function setup(options) {
+ var childRunner = ChildRunner.current();
+ if (childRunner) {
+ _deepMerge(_config, childRunner.parentScope.WCT._config);
+ // But do not force the mocha UI
+ delete _config.mochaOptions.ui;
+ }
+ if (options && typeof options === 'object') {
+ _deepMerge(_config, options);
+ }
+ if (!_config.root) {
+ // Sibling dependencies.
+ var root = scriptPrefix('browser.js');
+ _config.root = basePath(root.substr(0, root.length - 1));
+ if (!_config.root) {
+ throw new Error('Unable to detect root URL for WCT sources. Please set WCT.root before including browser.js');
+ }
+ }
+}
+/**
+ * Retrieves a configuration value.
+ */
+function get(key) {
+ return _config[key];
+}
+// Internal
+function _deepMerge(target, source) {
+ Object.keys(source).forEach(function (key) {
+ if (target[key] !== null && typeof target[key] === 'object' &&
+ !Array.isArray(target[key])) {
+ _deepMerge(target[key], source[key]);
+ }
+ else {
+ target[key] = source[key];
+ }
+ });
+}
+
+/**
+ * @param {function()} callback A function to call when the active web component
+ * frameworks have loaded.
+ */
+function whenFrameworksReady(callback) {
+ debug('whenFrameworksReady');
+ var done = function () {
+ debug('whenFrameworksReady done');
+ callback();
+ };
+ // If webcomponents script is in the document, wait for WebComponentsReady.
+ if (window.WebComponents && !window.WebComponents.ready) {
+ debug('WebComponentsReady?');
+ window.addEventListener('WebComponentsReady', function wcReady() {
+ window.removeEventListener('WebComponentsReady', wcReady);
+ debug('WebComponentsReady');
+ done();
+ });
+ }
+ else {
+ done();
+ }
+}
+/**
+ * @return {string} '<count> <kind> tests' or '<count> <kind> test'.
+ */
+function pluralizedStat(count, kind) {
+ if (count === 1) {
+ return count + ' ' + kind + ' test';
+ }
+ else {
+ return count + ' ' + kind + ' tests';
+ }
+}
+/**
+ * @param {string} path The URI of the script to load.
+ * @param {function} done
+ */
+function loadScript(path, done) {
+ var script = document.createElement('script');
+ script.src = path;
+ if (done) {
+ script.onload = done.bind(null, null);
+ script.onerror = done.bind(null, 'Failed to load script ' + script.src);
+ }
+ document.head.appendChild(script);
+}
+/**
+ * @param {string} path The URI of the stylesheet to load.
+ * @param {function} done
+ */
+function loadStyle(path, done) {
+ var link = document.createElement('link');
+ link.rel = 'stylesheet';
+ link.href = path;
+ if (done) {
+ link.onload = done.bind(null, null);
+ link.onerror = done.bind(null, 'Failed to load stylesheet ' + link.href);
+ }
+ document.head.appendChild(link);
+}
+/**
+ * @param {...*} var_args Logs values to the console when the `debug`
+ * configuration option is true.
+ */
+function debug() {
+ var var_args = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ var_args[_i] = arguments[_i];
+ }
+ if (!get('verbose')) {
+ return;
+ }
+ var args = [window.location.pathname].concat(var_args);
+ (console.debug || console.log).apply(console, args);
+}
+// URL Processing
+/**
+ * @param {string} url
+ * @return {{base: string, params: string}}
+ */
+function parseUrl(url) {
+ var parts = url.match(/^(.*?)(?:\?(.*))?$/);
+ return {
+ base: parts[1],
+ params: getParams(parts[2] || ''),
+ };
+}
+/**
+ * Expands a URL that may or may not be relative to `base`.
+ *
+ * @param {string} url
+ * @param {string} base
+ * @return {string}
+ */
+function expandUrl(url, base) {
+ if (!base)
+ return url;
+ if (url.match(/^(\/|https?:\/\/)/))
+ return url;
+ if (base.substr(base.length - 1) !== '/') {
+ base = base + '/';
+ }
+ return base + url;
+}
+/**
+ * @param {string=} opt_query A query string to parse.
+ * @return {!Object<string, !Array<string>>} All params on the URL's query.
+ */
+function getParams(query) {
+ query = typeof query === 'string' ? query : window.location.search;
+ if (query.substring(0, 1) === '?') {
+ query = query.substring(1);
+ }
+ // python's SimpleHTTPServer tacks a `/` on the end of query strings :(
+ if (query.slice(-1) === '/') {
+ query = query.substring(0, query.length - 1);
+ }
+ if (query === '')
+ return {};
+ var result = {};
+ query.split('&').forEach(function (part) {
+ var pair = part.split('=');
+ if (pair.length !== 2) {
+ console.warn('Invalid URL query part:', part);
+ return;
+ }
+ var key = decodeURIComponent(pair[0]);
+ var value = decodeURIComponent(pair[1]);
+ if (!result[key]) {
+ result[key] = [];
+ }
+ result[key].push(value);
+ });
+ return result;
+}
+/**
+ * Merges params from `source` into `target` (mutating `target`).
+ *
+ * @param {!Object<string, !Array<string>>} target
+ * @param {!Object<string, !Array<string>>} source
+ */
+function mergeParams(target, source) {
+ Object.keys(source).forEach(function (key) {
+ if (!(key in target)) {
+ target[key] = [];
+ }
+ target[key] = target[key].concat(source[key]);
+ });
+}
+/**
+ * @param {string} param The param to return a value for.
+ * @return {?string} The first value for `param`, if found.
+ */
+function getParam(param) {
+ var params = getParams();
+ return params[param] ? params[param][0] : null;
+}
+/**
+ * @param {!Object<string, !Array<string>>} params
+ * @return {string} `params` encoded as a URI query.
+ */
+function paramsToQuery(params) {
+ var pairs = [];
+ Object.keys(params).forEach(function (key) {
+ params[key].forEach(function (value) {
+ pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
+ });
+ });
+ return (pairs.length > 0) ? ('?' + pairs.join('&')) : '';
+}
+function getPathName(location) {
+ return typeof location === 'string' ? location : location.pathname;
+}
+function basePath(location) {
+ return getPathName(location).match(/^.*\//)[0];
+}
+function relativeLocation(location, basePath) {
+ var path = getPathName(location);
+ if (path.indexOf(basePath) === 0) {
+ path = path.substring(basePath.length);
+ }
+ return path;
+}
+function cleanLocation(location) {
+ var path = getPathName(location);
+ if (path.slice(-11) === '/index.html') {
+ path = path.slice(0, path.length - 10);
+ }
+ return path;
+}
+function parallel(runners, maybeLimit, done) {
+ var limit;
+ if (typeof maybeLimit !== 'number') {
+ done = maybeLimit;
+ limit = 0;
+ }
+ else {
+ limit = maybeLimit;
+ }
+ if (!runners.length) {
+ return done();
+ }
+ var called = false;
+ var total = runners.length;
+ var numActive = 0;
+ var numDone = 0;
+ function runnerDone(error) {
+ if (called) {
+ return;
+ }
+ numDone = numDone + 1;
+ numActive = numActive - 1;
+ if (error || numDone >= total) {
+ called = true;
+ done(error);
+ }
+ else {
+ runOne();
+ }
+ }
+ function runOne() {
+ if (limit && numActive >= limit) {
+ return;
+ }
+ if (!runners.length) {
+ return;
+ }
+ numActive = numActive + 1;
+ runners.shift()(runnerDone);
+ }
+ runners.forEach(runOne);
+}
+/**
+ * Finds the directory that a loaded script is hosted on.
+ *
+ * @param {string} filename
+ * @return {string?}
+ */
+function scriptPrefix(filename) {
+ var scripts = document.querySelectorAll('script[src*="' + filename + '"]');
+ if (scripts.length !== 1) {
+ return null;
+ }
+ var script = scripts[0].src;
+ return script.substring(0, script.indexOf(filename));
+}
+
+
+var util = Object.freeze({
+ whenFrameworksReady: whenFrameworksReady,
+ pluralizedStat: pluralizedStat,
+ loadScript: loadScript,
+ loadStyle: loadStyle,
+ debug: debug,
+ parseUrl: parseUrl,
+ expandUrl: expandUrl,
+ getParams: getParams,
+ mergeParams: mergeParams,
+ getParam: getParam,
+ paramsToQuery: paramsToQuery,
+ basePath: basePath,
+ relativeLocation: relativeLocation,
+ cleanLocation: cleanLocation,
+ parallel: parallel,
+ scriptPrefix: scriptPrefix
+});
+
+/**
+ * A Mocha suite (or suites) run within a child iframe, but reported as if they
+ * are part of the current context.
+ */
+var ChildRunner = /** @class */ (function () {
+ function ChildRunner(url, parentScope) {
+ var urlBits = parseUrl(url);
+ mergeParams(urlBits.params, getParams(parentScope.location.search));
+ delete urlBits.params.cli_browser_id;
+ this.url = urlBits.base + paramsToQuery(urlBits.params);
+ this.parentScope = parentScope;
+ this.state = 'initializing';
+ }
+ /**
+ * @return {ChildRunner} The `ChildRunner` that was registered for this
+ * window.
+ */
+ ChildRunner.current = function () {
+ return ChildRunner.get(window);
+ };
+ /**
+ * @param {!Window} target A window to find the ChildRunner of.
+ * @param {boolean} traversal Whether this is a traversal from a child window.
+ * @return {ChildRunner} The `ChildRunner` that was registered for `target`.
+ */
+ ChildRunner.get = function (target, traversal) {
+ var childRunner = ChildRunner._byUrl[target.location.href];
+ if (childRunner) {
+ return childRunner;
+ }
+ if (window.parent === window) {
+ if (traversal) {
+ console.warn('Subsuite loaded but was never registered. This most likely is due to wonky history behavior. Reloading...');
+ window.location.reload();
+ }
+ return null;
+ }
+ // Otherwise, traverse.
+ return window.parent.WCT._ChildRunner.get(target, true);
+ };
+ /**
+ * Loads and runs the subsuite.
+ *
+ * @param {function} done Node-style callback.
+ */
+ ChildRunner.prototype.run = function (done) {
+ debug('ChildRunner#run', this.url);
+ this.state = 'loading';
+ this.onRunComplete = done;
+ this.iframe = document.createElement('iframe');
+ this.iframe.src = this.url;
+ this.iframe.classList.add('subsuite');
+ var container = document.getElementById('subsuites');
+ if (!container) {
+ container = document.createElement('div');
+ container.id = 'subsuites';
+ document.body.appendChild(container);
+ }
+ container.appendChild(this.iframe);
+ // let the iframe expand the URL for us.
+ this.url = this.iframe.src;
+ ChildRunner._byUrl[this.url] = this;
+ this.timeoutId = setTimeout(this.loaded.bind(this, new Error('Timed out loading ' + this.url)), ChildRunner.loadTimeout);
+ this.iframe.addEventListener('error', this.loaded.bind(this, new Error('Failed to load document ' + this.url)));
+ this.iframe.contentWindow.addEventListener('DOMContentLoaded', this.loaded.bind(this, null));
+ };
+ /**
+ * Called when the sub suite's iframe has loaded (or errored during load).
+ *
+ * @param {*} error The error that occured, if any.
+ */
+ ChildRunner.prototype.loaded = function (error) {
+ debug('ChildRunner#loaded', this.url, error);
+ // Not all targets have WCT loaded (compatiblity mode)
+ if (this.iframe.contentWindow.WCT) {
+ this.share = this.iframe.contentWindow.WCT.share;
+ }
+ if (error) {
+ this.signalRunComplete(error);
+ this.done();
+ }
+ };
+ /**
+ * Called in mocha/run.js when all dependencies have loaded, and the child is
+ * ready to start running tests
+ *
+ * @param {*} error The error that occured, if any.
+ */
+ ChildRunner.prototype.ready = function (error) {
+ debug('ChildRunner#ready', this.url, error);
+ if (this.timeoutId) {
+ clearTimeout(this.timeoutId);
+ }
+ if (error) {
+ this.signalRunComplete(error);
+ this.done();
+ }
+ };
+ /**
+ * Called when the sub suite's tests are complete, so that it can clean up.
+ */
+ ChildRunner.prototype.done = function () {
+ debug('ChildRunner#done', this.url, arguments);
+ // make sure to clear that timeout
+ this.ready();
+ this.signalRunComplete();
+ if (!this.iframe)
+ return;
+ // Be safe and avoid potential browser crashes when logic attempts to
+ // interact with the removed iframe.
+ setTimeout(function () {
+ this.iframe.parentNode.removeChild(this.iframe);
+ this.iframe = null;
+ }.bind(this), 1);
+ };
+ ChildRunner.prototype.signalRunComplete = function (error) {
+ if (!this.onRunComplete)
+ return;
+ this.state = 'complete';
+ this.onRunComplete(error);
+ this.onRunComplete = null;
+ };
+ // ChildRunners get a pretty generous load timeout by default.
+ ChildRunner.loadTimeout = 60000;
+ // We can't maintain properties on iframe elements in Firefox/Safari/???, so
+ // we track childRunners by URL.
+ ChildRunner._byUrl = {};
+ return ChildRunner;
+}());
+
+var SOCKETIO_ENDPOINT = window.location.protocol + '//' + window.location.host;
+var SOCKETIO_LIBRARY = SOCKETIO_ENDPOINT + '/socket.io/socket.io.js';
+/**
+ * A socket for communication between the CLI and browser runners.
+ *
+ * @param {string} browserId An ID generated by the CLI runner.
+ * @param {!io.Socket} socket The socket.io `Socket` to communicate over.
+ */
+var CLISocket = /** @class */ (function () {
+ function CLISocket(browserId, socket) {
+ this.browserId = browserId;
+ this.socket = socket;
+ }
+ /**
+ * @param {!Mocha.Runner} runner The Mocha `Runner` to observe, reporting
+ * interesting events back to the CLI runner.
+ */
+ CLISocket.prototype.observe = function (runner) {
+ var _this = this;
+ this.emitEvent('browser-start', {
+ url: window.location.toString(),
+ });
+ // We only emit a subset of events that we care about, and follow a more
+ // general event format that is hopefully applicable to test runners beyond
+ // mocha.
+ //
+ // For all possible mocha events, see:
+ // https://github.com/visionmedia/mocha/blob/master/lib/runner.js#L36
+ runner.on('test', function (test) {
+ _this.emitEvent('test-start', { test: getTitles(test) });
+ });
+ runner.on('test end', function (test) {
+ _this.emitEvent('test-end', {
+ state: getState(test),
+ test: getTitles(test),
+ duration: test.duration,
+ error: test.err,
+ });
+ });
+ runner.on('fail', function (test, err) {
+ // fail the test run if we catch errors outside of a test function
+ if (test.type !== 'test') {
+ _this.emitEvent('browser-fail', 'Error thrown outside of test function: ' + err.stack);
+ }
+ });
+ runner.on('childRunner start', function (childRunner) {
+ _this.emitEvent('sub-suite-start', childRunner.share);
+ });
+ runner.on('childRunner end', function (childRunner) {
+ _this.emitEvent('sub-suite-end', childRunner.share);
+ });
+ runner.on('end', function () {
+ _this.emitEvent('browser-end');
+ });
+ };
+ /**
+ * @param {string} event The name of the event to fire.
+ * @param {*} data Additional data to pass with the event.
+ */
+ CLISocket.prototype.emitEvent = function (event, data) {
+ this.socket.emit('client-event', {
+ browserId: this.browserId,
+ event: event,
+ data: data,
+ });
+ };
+ /**
+ * Builds a `CLISocket` if we are within a CLI-run environment; short-circuits
+ * otherwise.
+ *
+ * @param {function(*, CLISocket)} done Node-style callback.
+ */
+ CLISocket.init = function (done) {
+ var browserId = getParam('cli_browser_id');
+ if (!browserId)
+ return done();
+ // Only fire up the socket for root runners.
+ if (ChildRunner.current())
+ return done();
+ loadScript(SOCKETIO_LIBRARY, function (error) {
+ if (error)
+ return done(error);
+ var socket = io(SOCKETIO_ENDPOINT);
+ socket.on('error', function (error) {
+ socket.off();
+ done(error);
+ });
+ socket.on('connect', function () {
+ socket.off();
+ done(null, new CLISocket(browserId, socket));
+ });
+ });
+ };
+ return CLISocket;
+}());
+// Misc Utility
+/**
+ * @param {!Mocha.Runnable} runnable The test or suite to extract titles from.
+ * @return {!Array.<string>} The titles of the runnable and its parents.
+ */
+function getTitles(runnable) {
+ var titles = [];
+ while (runnable && !runnable.root && runnable.title) {
+ titles.unshift(runnable.title);
+ runnable = runnable.parent;
+ }
+ return titles;
+}
+/**
+ * @param {!Mocha.Runnable} runnable
+ * @return {string}
+ */
+function getState(runnable) {
+ if (runnable.state === 'passed') {
+ return 'passing';
+ }
+ else if (runnable.state === 'failed') {
+ return 'failing';
+ }
+ else if (runnable.pending) {
+ return 'pending';
+ }
+ else {
+ return 'unknown';
+ }
+}
+
+// We capture console events when running tests; so make sure we have a
+// reference to the original one.
+var console$1 = window.console;
+var FONT = ';font: normal 13px "Roboto", "Helvetica Neue", "Helvetica", sans-serif;';
+var STYLES = {
+ plain: FONT,
+ suite: 'color: #5c6bc0' + FONT,
+ test: FONT,
+ passing: 'color: #259b24' + FONT,
+ pending: 'color: #e65100' + FONT,
+ failing: 'color: #c41411' + FONT,
+ stack: 'color: #c41411',
+ results: FONT + 'font-size: 16px',
+};
+// I don't think we can feature detect this one...
+var userAgent = navigator.userAgent.toLowerCase();
+var CAN_STYLE_LOG = userAgent.match('firefox') || userAgent.match('webkit');
+var CAN_STYLE_GROUP = userAgent.match('webkit');
+// Track the indent for faked `console.group`
+var logIndent = '';
+function log(text, style) {
+ text = text.split('\n')
+ .map(function (l) {
+ return logIndent + l;
+ })
+ .join('\n');
+ if (CAN_STYLE_LOG) {
+ console$1.log('%c' + text, STYLES[style] || STYLES.plain);
+ }
+ else {
+ console$1.log(text);
+ }
+}
+function logGroup(text, style) {
+ if (CAN_STYLE_GROUP) {
+ console$1.group('%c' + text, STYLES[style] || STYLES.plain);
+ }
+ else if (console$1.group) {
+ console$1.group(text);
+ }
+ else {
+ logIndent = logIndent + ' ';
+ log(text, style);
+ }
+}
+function logGroupEnd() {
+ if (console$1.groupEnd) {
+ console$1.groupEnd();
+ }
+ else {
+ logIndent = logIndent.substr(0, logIndent.length - 2);
+ }
+}
+function logException(error) {
+ log(error.stack || error.message || (error + ''), 'stack');
+}
+/**
+ * A Mocha reporter that logs results out to the web `console`.
+ */
+var Console = /** @class */ (function () {
+ /**
+ * @param runner The runner that is being reported on.
+ */
+ function Console(runner) {
+ Mocha.reporters.Base.call(this, runner);
+ runner.on('suite', function (suite) {
+ if (suite.root) {
+ return;
+ }
+ logGroup(suite.title, 'suite');
+ }.bind(this));
+ runner.on('suite end', function (suite) {
+ if (suite.root) {
+ return;
+ }
+ logGroupEnd();
+ }.bind(this));
+ runner.on('test', function (test) {
+ logGroup(test.title, 'test');
+ }.bind(this));
+ runner.on('pending', function (test) {
+ logGroup(test.title, 'pending');
+ }.bind(this));
+ runner.on('fail', function (_test, error) {
+ logException(error);
+ }.bind(this));
+ runner.on('test end', function (_test) {
+ logGroupEnd();
+ }.bind(this));
+ runner.on('end', this.logSummary.bind(this));
+ }
+ /** Prints out a final summary of test results. */
+ Console.prototype.logSummary = function () {
+ logGroup('Test Results', 'results');
+ if (this.stats.failures > 0) {
+ log(pluralizedStat(this.stats.failures, 'failing'), 'failing');
+ }
+ if (this.stats.pending > 0) {
+ log(pluralizedStat(this.stats.pending, 'pending'), 'pending');
+ }
+ log(pluralizedStat(this.stats.passes, 'passing'));
+ if (!this.stats.failures) {
+ log('test suite passed', 'passing');
+ }
+ log('Evaluated ' + this.stats.tests + ' tests in ' +
+ this.stats.duration + 'ms.');
+ logGroupEnd();
+ };
+ return Console;
+}());
+
+/**
+ * @license
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at
+ * http://polymer.github.io/LICENSE.txt The complete set of authors may be found
+ * at http://polymer.github.io/AUTHORS.txt The complete set of contributors may
+ * be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by
+ * Google as part of the polymer project is also subject to an additional IP
+ * rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+/**
+ * WCT-specific behavior on top of Mocha's default HTML reporter.
+ *
+ * @param {!Mocha.Runner} runner The runner that is being reported on.
+ */
+function HTML(runner) {
+ var output = document.createElement('div');
+ output.id = 'mocha';
+ document.body.appendChild(output);
+ runner.on('suite', function (_test) {
+ this.total = runner.total;
+ }.bind(this));
+ Mocha.reporters.HTML.call(this, runner);
+}
+// Woo! What a hack. This just saves us from adding a bunch of complexity around
+// style loading.
+var style = document.createElement('style');
+style.textContent = "\n html, body {\n position: relative;\n height: 100%;\n width: 100%;\n min-width: 900px;\n }\n #mocha, #subsuites {\n height: 100%;\n position: absolute;\n top: 0;\n }\n #mocha {\n box-sizing: border-box;\n margin: 0 !important;\n padding: 60px 20px;\n right: 0;\n left: 500px;\n }\n #subsuites {\n -ms-flex-direction: column;\n -webkit-flex-direction: column;\n display: -ms-flexbox;\n display: -webkit-flex;\n display: flex;\n flex-direction: column;\n left: 0;\n width: 500px;\n }\n #subsuites .subsuite {\n border: 0;\n width: 100%;\n height: 100%;\n }\n #mocha .test.pass .duration {\n color: #555 !important;\n }\n";
+document.head.appendChild(style);
+
+var STACKY_CONFIG = {
+ indent: ' ',
+ locationStrip: [
+ /^https?:\/\/[^\/]+/,
+ /\?.*$/,
+ ],
+ filter: function (line) {
+ return !!line.location.match(/\/web-component-tester\/[^\/]+(\?.*)?$/);
+ },
+};
+// https://github.com/visionmedia/mocha/blob/master/lib/runner.js#L36-46
+var MOCHA_EVENTS = [
+ 'start', 'end', 'suite', 'suite end', 'test', 'test end', 'hook', 'hook end',
+ 'pass', 'fail', 'pending', 'childRunner end'
+];
+// Until a suite has loaded, we assume this many tests in it.
+var ESTIMATED_TESTS_PER_SUITE = 3;
+/**
+ * A Mocha-like reporter that combines the output of multiple Mocha suites.
+ */
+var MultiReporter = /** @class */ (function () {
+ /**
+ * @param numSuites The number of suites that will be run, in order to
+ * estimate the total number of tests that will be performed.
+ * @param reporters The set of reporters that
+ * should receive the unified event stream.
+ * @param parent The parent reporter, if present.
+ */
+ function MultiReporter(numSuites, reporters, parent) {
+ var _this = this;
+ this.reporters = reporters.map(function (reporter) {
+ return new reporter(_this);
+ });
+ this.parent = parent;
+ this.basePath = parent && parent.basePath || basePath(window.location);
+ this.total = numSuites * ESTIMATED_TESTS_PER_SUITE;
+ // Mocha reporters assume a stream of events, so we have to be careful to
+ // only report on one runner at a time...
+ this.currentRunner = null;
+ // ...while we buffer events for any other active runners.
+ this.pendingEvents = [];
+ this.emit('start');
+ }
+ /**
+ * @param location The location this reporter represents.
+ * @return A reporter-like "class" for each child suite
+ * that should be passed to `mocha.run`.
+ */
+ MultiReporter.prototype.childReporter = function (location) {
+ var name = this.suiteTitle(location);
+ // The reporter is used as a constructor, so we can't depend on `this` being
+ // properly bound.
+ var self = this;
+ return _a = /** @class */ (function () {
+ function ChildReporter(runner) {
+ runner.name = window.name;
+ self.bindChildRunner(runner);
+ }
+ return ChildReporter;
+ }()),
+ _a.title = window.name,
+ _a;
+ var _a;
+ };
+ /** Must be called once all runners have finished. */
+ MultiReporter.prototype.done = function () {
+ this.complete = true;
+ this.flushPendingEvents();
+ this.emit('end');
+ };
+ /**
+ * Emit a top level test that is not part of any suite managed by this
+ * reporter.
+ *
+ * Helpful for reporting on global errors, loading issues, etc.
+ *
+ * @param title The title of the test.
+ * @param error An error associated with this test. If falsy, test is
+ * considered to be passing.
+ * @param suiteTitle Title for the suite that's wrapping the test.
+ * @param estimated If this test was included in the original
+ * estimate of `numSuites`.
+ */
+ MultiReporter.prototype.emitOutOfBandTest = function (title, error, suiteTitle, estimated) {
+ debug('MultiReporter#emitOutOfBandTest(', arguments, ')');
+ var root = new Mocha.Suite(suiteTitle || '');
+ var test = new Mocha.Test(title, function () { });
+ test.parent = root;
+ test.state = error ? 'failed' : 'passed';
+ test.err = error;
+ if (!estimated) {
+ this.total = this.total + ESTIMATED_TESTS_PER_SUITE;
+ }
+ var runner = { total: 1 };
+ this.proxyEvent('start', runner);
+ this.proxyEvent('suite', runner, root);
+ this.proxyEvent('test', runner, test);
+ if (error) {
+ this.proxyEvent('fail', runner, test, error);
+ }
+ else {
+ this.proxyEvent('pass', runner, test);
+ }
+ this.proxyEvent('test end', runner, test);
+ this.proxyEvent('suite end', runner, root);
+ this.proxyEvent('end', runner);
+ };
+ /**
+ * @param {!Location|string} location
+ * @return {string}
+ */
+ MultiReporter.prototype.suiteTitle = function (location) {
+ var path = relativeLocation(location, this.basePath);
+ path = cleanLocation(path);
+ return path;
+ };
+ // Internal Interface
+ /** @param {!Mocha.runners.Base} runner The runner to listen to events for. */
+ MultiReporter.prototype.bindChildRunner = function (runner) {
+ var _this = this;
+ MOCHA_EVENTS.forEach(function (eventName) {
+ runner.on(eventName, _this.proxyEvent.bind(_this, eventName, runner));
+ });
+ };
+ /**
+ * Evaluates an event fired by `runner`, proxying it forward or buffering it.
+ *
+ * @param {string} eventName
+ * @param {!Mocha.runners.Base} runner The runner that emitted this event.
+ * @param {...*} var_args Any additional data passed as part of the event.
+ */
+ MultiReporter.prototype.proxyEvent = function (eventName, runner) {
+ var _args = [];
+ for (var _i = 2; _i < arguments.length; _i++) {
+ _args[_i - 2] = arguments[_i];
+ }
+ var extraArgs = Array.prototype.slice.call(arguments, 2);
+ if (this.complete) {
+ console.warn('out of order Mocha event for ' + runner.name + ':', eventName, extraArgs);
+ return;
+ }
+ if (this.currentRunner && runner !== this.currentRunner) {
+ this.pendingEvents.push(Array.prototype.slice.call(arguments));
+ return;
+ }
+ debug('MultiReporter#proxyEvent(', arguments, ')');
+ // This appears to be a Mocha bug: Tests failed by passing an error to their
+ // done function don't set `err` properly.
+ //
+ // TODO(nevir): Track down.
+ if (eventName === 'fail' && !extraArgs[0].err) {
+ extraArgs[0].err = extraArgs[1];
+ }
+ if (eventName === 'start') {
+ this.onRunnerStart(runner);
+ }
+ else if (eventName === 'end') {
+ this.onRunnerEnd(runner);
+ }
+ else {
+ this.cleanEvent(eventName, runner, extraArgs);
+ this.emit.apply(this, [eventName].concat(extraArgs));
+ }
+ };
+ /**
+ * Cleans or modifies an event if needed.
+ *
+ * @param eventName
+ * @param runner The runner that emitted this event.
+ * @param extraArgs
+ */
+ MultiReporter.prototype.cleanEvent = function (eventName, _runner, extraArgs) {
+ // Suite hierarchy
+ if (extraArgs[0]) {
+ extraArgs[0] = this.showRootSuite(extraArgs[0]);
+ }
+ // Normalize errors
+ if (eventName === 'fail') {
+ extraArgs[1] = Stacky.normalize(extraArgs[1], STACKY_CONFIG);
+ }
+ if (extraArgs[0] && extraArgs[0].err) {
+ extraArgs[0].err = Stacky.normalize(extraArgs[0].err, STACKY_CONFIG);
+ }
+ };
+ /**
+ * We like to show the root suite's title, which requires a little bit of
+ * trickery in the suite hierarchy.
+ *
+ * @param {!Mocha.Runnable} node
+ */
+ MultiReporter.prototype.showRootSuite = function (node) {
+ var leaf = node = Object.create(node);
+ while (node && node.parent) {
+ var wrappedParent = Object.create(node.parent);
+ node.parent = wrappedParent;
+ node = wrappedParent;
+ }
+ node.root = false;
+ return leaf;
+ };
+ /** @param {!Mocha.runners.Base} runner */
+ MultiReporter.prototype.onRunnerStart = function (runner) {
+ debug('MultiReporter#onRunnerStart:', runner.name);
+ this.total = this.total - ESTIMATED_TESTS_PER_SUITE + runner.total;
+ this.currentRunner = runner;
+ };
+ /** @param {!Mocha.runners.Base} runner */
+ MultiReporter.prototype.onRunnerEnd = function (runner) {
+ debug('MultiReporter#onRunnerEnd:', runner.name);
+ this.currentRunner = null;
+ this.flushPendingEvents();
+ };
+ /**
+ * Flushes any buffered events and runs them through `proxyEvent`. This will
+ * loop until all buffered runners are complete, or we have run out of
+ * buffered events.
+ */
+ MultiReporter.prototype.flushPendingEvents = function () {
+ var _this = this;
+ var events = this.pendingEvents;
+ this.pendingEvents = [];
+ events.forEach(function (eventArgs) {
+ _this.proxyEvent.apply(_this, eventArgs);
+ });
+ };
+ return MultiReporter;
+}());
+
+var ARC_OFFSET = 0; // start at the right.
+var ARC_WIDTH = 6;
+/**
+ * A Mocha reporter that updates the document's title and favicon with
+ * at-a-glance stats.
+ *
+ * @param {!Mocha.Runner} runner The runner that is being reported on.
+ */
+var Title = /** @class */ (function () {
+ function Title(runner) {
+ Mocha.reporters.Base.call(this, runner);
+ runner.on('test end', this.report.bind(this));
+ }
+ /** Reports current stats via the page title and favicon. */
+ Title.prototype.report = function () {
+ this.updateTitle();
+ this.updateFavicon();
+ };
+ /** Updates the document title with a summary of current stats. */
+ Title.prototype.updateTitle = function () {
+ if (this.stats.failures > 0) {
+ document.title = pluralizedStat(this.stats.failures, 'failing');
+ }
+ else {
+ document.title = pluralizedStat(this.stats.passes, 'passing');
+ }
+ };
+ /** Updates the document's favicon w/ a summary of current stats. */
+ Title.prototype.updateFavicon = function () {
+ var canvas = document.createElement('canvas');
+ canvas.height = canvas.width = 32;
+ var context = canvas.getContext('2d');
+ var passing = this.stats.passes;
+ var pending = this.stats.pending;
+ var failing = this.stats.failures;
+ var total = Math.max(this.runner.total, passing + pending + failing);
+ drawFaviconArc(context, total, 0, passing, '#0e9c57');
+ drawFaviconArc(context, total, passing, pending, '#f3b300');
+ drawFaviconArc(context, total, pending + passing, failing, '#ff5621');
+ this.setFavicon(canvas.toDataURL());
+ };
+ /** Sets the current favicon by URL. */
+ Title.prototype.setFavicon = function (url) {
+ var current = document.head.querySelector('link[rel="icon"]');
+ if (current) {
+ document.head.removeChild(current);
+ }
+ var link = document.createElement('link');
+ link.rel = 'icon';
+ link.type = 'image/x-icon';
+ link.href = url;
+ link.setAttribute('sizes', '32x32');
+ document.head.appendChild(link);
+ };
+ return Title;
+}());
+/**
+ * Draws an arc for the favicon status, relative to the total number of tests.
+ */
+function drawFaviconArc(context, total, start, length, color) {
+ var arcStart = ARC_OFFSET + Math.PI * 2 * (start / total);
+ var arcEnd = ARC_OFFSET + Math.PI * 2 * ((start + length) / total);
+ context.beginPath();
+ context.strokeStyle = color;
+ context.lineWidth = ARC_WIDTH;
+ context.arc(16, 16, 16 - ARC_WIDTH / 2, arcStart, arcEnd);
+ context.stroke();
+}
+
+var htmlSuites$1 = [];
+var jsSuites$1 = [];
+// We process grep ourselves to avoid loading suites that will be filtered.
+var GREP = getParam('grep');
+// work around mocha bug (https://github.com/mochajs/mocha/issues/2070)
+if (GREP) {
+ GREP = GREP.replace(/\\\./g, '.');
+}
+/**
+ * Loads suites of tests, supporting both `.js` and `.html` files.
+ *
+ * @param files The files to load.
+ */
+function loadSuites(files) {
+ files.forEach(function (file) {
+ if (/\.js(\?.*)?$/.test(file)) {
+ jsSuites$1.push(file);
+ }
+ else if (/\.html(\?.*)?$/.test(file)) {
+ htmlSuites$1.push(file);
+ }
+ else {
+ throw new Error('Unknown resource type: ' + file);
+ }
+ });
+}
+/**
+ * @return The child suites that should be loaded, ignoring
+ * those that would not match `GREP`.
+ */
+function activeChildSuites() {
+ var subsuites = htmlSuites$1;
+ if (GREP) {
+ var cleanSubsuites = [];
+ for (var i = 0, subsuite = void 0; subsuite = subsuites[i]; i++) {
+ if (GREP.indexOf(cleanLocation(subsuite)) !== -1) {
+ cleanSubsuites.push(subsuite);
+ }
+ }
+ subsuites = cleanSubsuites;
+ }
+ return subsuites;
+}
+/**
+ * Loads all `.js` sources requested by the current suite.
+ */
+function loadJsSuites(_reporter, done) {
+ debug('loadJsSuites', jsSuites$1);
+ var loaders = jsSuites$1.map(function (file) {
+ // We only support `.js` dependencies for now.
+ return loadScript.bind(util, file);
+ });
+ parallel(loaders, done);
+}
+function runSuites(reporter, childSuites, done) {
+ debug('runSuites');
+ var suiteRunners = [
+ // Run the local tests (if any) first, not stopping on error;
+ _runMocha.bind(null, reporter),
+ ];
+ // As well as any sub suites. Again, don't stop on error.
+ childSuites.forEach(function (file) {
+ suiteRunners.push(function (next) {
+ var childRunner = new ChildRunner(file, window);
+ reporter.emit('childRunner start', childRunner);
+ childRunner.run(function (error) {
+ reporter.emit('childRunner end', childRunner);
+ if (error)
+ reporter.emitOutOfBandTest(file, error);
+ next();
+ });
+ });
+ });
+ parallel(suiteRunners, get('numConcurrentSuites'), function (error) {
+ reporter.done();
+ done(error);
+ });
+}
+/**
+ * Kicks off a mocha run, waiting for frameworks to load if necessary.
+ *
+ * @param {!MultiReporter} reporter Where to send Mocha's events.
+ * @param {function} done A callback fired, _no error is passed_.
+ */
+function _runMocha(reporter, done, waited) {
+ if (get('waitForFrameworks') && !waited) {
+ var waitFor = (get('waitFor') || whenFrameworksReady).bind(window);
+ waitFor(function () {
+ _fixCustomElements();
+ _runMocha(reporter, done, true);
+ });
+ return;
+ }
+ debug('_runMocha');
+ var mocha = window.mocha;
+ var Mocha = window.Mocha;
+ mocha.reporter(reporter.childReporter(window.location));
+ mocha.suite.title = reporter.suiteTitle(window.location);
+ mocha.grep(GREP);
+ // We can't use `mocha.run` because it bashes over grep, invert, and friends.
+ // See https://github.com/visionmedia/mocha/blob/master/support/tail.js#L137
+ var runner = Mocha.prototype.run.call(mocha, function (_error) {
+ if (document.getElementById('mocha')) {
+ Mocha.utils.highlightTags('code');
+ }
+ done(); // We ignore the Mocha failure count.
+ });
+ // Mocha's default `onerror` handling strips the stack (to support really old
+ // browsers). We upgrade this to get better stacks for async errors.
+ //
+ // TODO(nevir): Can we expand support to other browsers?
+ if (navigator.userAgent.match(/chrome/i)) {
+ window.onerror = null;
+ window.addEventListener('error', function (event) {
+ if (!event.error)
+ return;
+ if (event.error.ignore)
+ return;
+ runner.uncaught(event.error);
+ });
+ }
+}
+/**
+ * In Chrome57 custom elements in the document might not get upgraded when
+ * there is a high GC
+ * https://bugs.chromium.org/p/chromium/issues/detail?id=701601 We clone and
+ * replace the ones that weren't upgraded.
+ */
+function _fixCustomElements() {
+ // Bail out if it is not Chrome 57.
+ var raw = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);
+ var isM57 = raw && raw[2] === '57';
+ if (!isM57)
+ return;
+ var elements = document.body.querySelectorAll('*:not(script):not(style)');
+ var constructors = {};
+ for (var i = 0; i < elements.length; i++) {
+ var el = elements[i];
+ // This child has already been cloned and replaced by its parent, skip it!
+ if (!el.isConnected)
+ continue;
+ var tag = el.localName;
+ // Not a custom element!
+ if (tag.indexOf('-') === -1)
+ continue;
+ // Memoize correct constructors.
+ constructors[tag] =
+ constructors[tag] || document.createElement(tag).constructor;
+ // This one was correctly upgraded.
+ if (el instanceof constructors[tag])
+ continue;
+ debug('_fixCustomElements: found non-upgraded custom element ' + el);
+ var clone = document.importNode(el, true);
+ el.parentNode.replaceChild(clone, el);
+ }
+}
+
+/**
+ * @param {CLISocket} socket The CLI socket, if present.
+ * @param {MultiReporter} parent The parent reporter, if present.
+ * @return {!Array.<!Mocha.reporters.Base} The reporters that should be used.
+ */
+function determineReporters(socket, parent) {
+ // Parents are greedy.
+ if (parent) {
+ return [parent.childReporter(window.location)];
+ }
+ // Otherwise, we get to run wild without any parental supervision!
+ var reporters = [Title, Console];
+ if (socket) {
+ reporters.push(function (runner) {
+ socket.observe(runner);
+ });
+ }
+ if (htmlSuites$1.length > 0 || jsSuites$1.length > 0) {
+ reporters.push(HTML);
+ }
+ return reporters;
+}
+/**
+ * Yeah, hideous, but this allows us to be loaded before Mocha, which is handy.
+ */
+function injectMocha(Mocha) {
+ _injectPrototype(Console, Mocha.reporters.Base.prototype);
+ _injectPrototype(HTML, Mocha.reporters.HTML.prototype);
+ // Mocha doesn't expose its `EventEmitter` shim directly, so:
+ _injectPrototype(MultiReporter, Object.getPrototypeOf(Mocha.Runner.prototype));
+}
+function _injectPrototype(klass, prototype) {
+ var newPrototype = Object.create(prototype);
+ // Only support
+ Object.keys(klass.prototype).forEach(function (key) {
+ newPrototype[key] = klass.prototype[key];
+ });
+ klass.prototype = newPrototype;
+}
+
+/**
+ * Loads all environment scripts ...synchronously ...after us.
+ */
+function loadSync() {
+ debug('Loading environment scripts:');
+ var a11ySuiteScriptPath = 'web-component-tester/data/a11ySuite.js';
+ var scripts = get('environmentScripts');
+ var a11ySuiteWillBeLoaded = window.__generatedByWct || scripts.indexOf(a11ySuiteScriptPath) > -1;
+ // We can't inject a11ySuite when running the npm version because it is a
+ // module-based script that needs `<script type=module>` and compilation
+ // for browsers without module support.
+ if (!a11ySuiteWillBeLoaded && !window.__wctUseNpm) {
+ // wct is running as a bower dependency, load a11ySuite from data/
+ scripts.push(a11ySuiteScriptPath);
+ }
+ scripts.forEach(function (path) {
+ var url = expandUrl(path, get('root'));
+ debug('Loading environment script:', url);
+ // Synchronous load.
+ document.write('<script src="' + encodeURI(url) +
+ '"></script>'); // jshint ignore:line
+ });
+ debug('Environment scripts loaded');
+ var imports = get('environmentImports');
+ imports.forEach(function (path) {
+ var url = expandUrl(path, get('root'));
+ debug('Loading environment import:', url);
+ // Synchronous load.
+ document.write('<link rel="import" href="' + encodeURI(url) +
+ '">'); // jshint ignore:line
+ });
+ debug('Environment imports loaded');
+}
+/**
+ * We have some hard dependencies on things that should be loaded via
+ * `environmentScripts`, so we assert that they're present here; and do any
+ * post-facto setup.
+ */
+function ensureDependenciesPresent() {
+ _ensureMocha();
+ _checkChai();
+}
+function _ensureMocha() {
+ var Mocha = window.Mocha;
+ if (!Mocha) {
+ throw new Error('WCT requires Mocha. Please ensure that it is present in WCT.environmentScripts, or that you load it before loading web-component-tester/browser.js');
+ }
+ injectMocha(Mocha);
+ // Magic loading of mocha's stylesheet
+ var mochaPrefix = scriptPrefix('mocha.js');
+ // only load mocha stylesheet for the test runner output
+ // Not the end of the world, if it doesn't load.
+ if (mochaPrefix && window.top === window.self) {
+ loadStyle(mochaPrefix + 'mocha.css');
+ }
+}
+function _checkChai() {
+ if (!window.chai) {
+ debug('Chai not present; not registering shorthands');
+ return;
+ }
+ window.assert = window.chai.assert;
+ window.expect = window.chai.expect;
+}
+
+// We may encounter errors during initialization (for example, syntax errors in
+// a test file). Hang onto those (and more) until we are ready to report them.
+var globalErrors = [];
+/**
+ * Hook the environment to pick up on global errors.
+ */
+function listenForErrors() {
+ window.addEventListener('error', function (event) {
+ globalErrors.push(event.error);
+ });
+ // Also, we treat `console.error` as a test failure. Unless you prefer not.
+ var origConsole = console;
+ var origError = console.error;
+ console.error = function wctShimmedError() {
+ origError.apply(origConsole, arguments);
+ if (get('trackConsoleError')) {
+ throw 'console.error: ' + Array.prototype.join.call(arguments, ' ');
+ }
+ };
+}
+
+var interfaceExtensions = [];
+/**
+ * Registers an extension that extends the global `Mocha` implementation
+ * with new helper methods. These helper methods will be added to the `window`
+ * when tests run for both BDD and TDD interfaces.
+ */
+function extendInterfaces(helperName, helperFactory) {
+ interfaceExtensions.push(function () {
+ var Mocha = window.Mocha;
+ // For all Mocha interfaces (probably just TDD and BDD):
+ Object.keys(Mocha.interfaces)
+ .forEach(function (interfaceName) {
+ // This is the original callback that defines the interface (TDD or
+ // BDD):
+ var originalInterface = Mocha.interfaces[interfaceName];
+ // This is the name of the "teardown" or "afterEach" property for the
+ // current interface:
+ var teardownProperty = interfaceName === 'tdd' ? 'teardown' : 'afterEach';
+ // The original callback is monkey patched with a new one that appends
+ // to the global context however we want it to:
+ Mocha.interfaces[interfaceName] = function (suite) {
+ // Call back to the original callback so that we get the base
+ // interface:
+ originalInterface.apply(this, arguments);
+ // Register a listener so that we can further extend the base
+ // interface:
+ suite.on('pre-require', function (context, _file, _mocha) {
+ // Capture a bound reference to the teardown function as a
+ // convenience:
+ var teardown = context[teardownProperty].bind(context);
+ // Add our new helper to the testing context. The helper is
+ // generated by a factory method that receives the context,
+ // the teardown function and the interface name and returns
+ // the new method to be added to that context:
+ context[helperName] =
+ helperFactory(context, teardown, interfaceName);
+ });
+ };
+ });
+ });
+}
+/**
+ * Applies any registered interface extensions. The extensions will be applied
+ * as many times as this function is called, so don't call it more than once.
+ */
+function applyExtensions() {
+ interfaceExtensions.forEach(function (applyExtension) {
+ applyExtension();
+ });
+}
+
+extendInterfaces('fixture', function (context, teardown) {
+ // Return context.fixture if it is already a thing, for backwards
+ // compatibility with `test-fixture-mocha.js`:
+ return context.fixture || function fixture(fixtureId, model) {
+ // Automatically register a teardown callback that will restore the
+ // test-fixture:
+ teardown(function () {
+ document.getElementById(fixtureId).restore();
+ });
+ // Find the test-fixture with the provided ID and create it, returning
+ // the results:
+ return document.getElementById(fixtureId).create(model);
+ };
+});
+
+/**
+ * stub
+ *
+ * The stub addon allows the tester to partially replace the implementation of
+ * an element with some custom implementation. Usage example:
+ *
+ * beforeEach(function() {
+ * stub('x-foo', {
+ * attached: function() {
+ * // Custom implementation of the `attached` method of element `x-foo`..
+ * },
+ * otherMethod: function() {
+ * // More custom implementation..
+ * },
+ * getterSetterProperty: {
+ * get: function() {
+ * // Custom getter implementation..
+ * },
+ * set: function() {
+ * // Custom setter implementation..
+ * }
+ * },
+ * // etc..
+ * });
+ * });
+ */
+extendInterfaces('stub', function (_context, teardown) {
+ return function stub(tagName, implementation) {
+ // Find the prototype of the element being stubbed:
+ var proto = document.createElement(tagName).constructor.prototype;
+ // For all keys in the implementation to stub with..
+ var stubs = Object.keys(implementation).map(function (key) {
+ // Stub the method on the element prototype with Sinon:
+ return sinon.stub(proto, key, implementation[key]);
+ });
+ // After all tests..
+ teardown(function () {
+ stubs.forEach(function (stub) {
+ stub.restore();
+ });
+ });
+ };
+});
+
+// replacement map stores what should be
+var replacements = {};
+var replaceTeardownAttached = false;
+/**
+ * replace
+ *
+ * The replace addon allows the tester to replace all usages of one element with
+ * another element within all Polymer elements created within the time span of
+ * the test. Usage example:
+ *
+ * beforeEach(function() {
+ * replace('x-foo').with('x-fake-foo');
+ * });
+ *
+ * All annotations and attributes will be set on the placement element the way
+ * they were set for the original element.
+ */
+extendInterfaces('replace', function (_context, teardown) {
+ return function replace(oldTagName) {
+ return {
+ with: function (tagName) {
+ // Standardizes our replacements map
+ oldTagName = oldTagName.toLowerCase();
+ tagName = tagName.toLowerCase();
+ replacements[oldTagName] = tagName;
+ // If the function is already a stub, restore it to original
+ if (document.importNode.isSinonProxy) {
+ return;
+ }
+ if (!window.Polymer.Element) {
+ window.Polymer.Element = function () { };
+ window.Polymer.Element.prototype._stampTemplate = function () { };
+ }
+ // Keep a reference to the original `document.importNode`
+ // implementation for later:
+ var originalImportNode = document.importNode;
+ // Use Sinon to stub `document.ImportNode`:
+ sinon.stub(document, 'importNode', function (origContent, deep) {
+ var templateClone = document.createElement('template');
+ var content = templateClone.content;
+ var inertDoc = content.ownerDocument;
+ // imports node from inertDoc which holds inert nodes.
+ templateClone.content.appendChild(inertDoc.importNode(origContent, true));
+ // optional arguments are not optional on IE.
+ var nodeIterator = document.createNodeIterator(content, NodeFilter.SHOW_ELEMENT, null, true);
+ var node;
+ // Traverses the tree. A recently-replaced node will be put next,
+ // so if a node is replaced, it will be checked if it needs to be
+ // replaced again.
+ while (node = nodeIterator.nextNode()) {
+ var currentTagName = node.tagName.toLowerCase();
+ if (replacements.hasOwnProperty(currentTagName)) {
+ currentTagName = replacements[currentTagName];
+ // find the final tag name.
+ while (replacements[currentTagName]) {
+ currentTagName = replacements[currentTagName];
+ }
+ // Create a replacement:
+ var replacement = document.createElement(currentTagName);
+ // For all attributes in the original node..
+ for (var index = 0; index < node.attributes.length; ++index) {
+ // Set that attribute on the replacement:
+ replacement.setAttribute(node.attributes[index].name, node.attributes[index].value);
+ }
+ // Replace the original node with the replacement node:
+ node.parentNode.replaceChild(replacement, node);
+ }
+ }
+ return originalImportNode.call(this, content, deep);
+ });
+ if (!replaceTeardownAttached) {
+ // After each test...
+ teardown(function () {
+ replaceTeardownAttached = true;
+ // Restore the stubbed version of `document.importNode`:
+ var documentImportNode = document.importNode;
+ if (documentImportNode.isSinonProxy) {
+ documentImportNode.restore();
+ }
+ // Empty the replacement map
+ replacements = {};
+ });
+ }
+ }
+ };
+ };
+});
+
+// Mocha global helpers, broken out by testing method.
+//
+// Keys are the method for a particular interface; values are their analog in
+// the opposite interface.
+var MOCHA_EXPORTS = {
+ // https://github.com/visionmedia/mocha/blob/master/lib/interfaces/tdd.js
+ tdd: {
+ 'setup': '"before"',
+ 'teardown': '"after"',
+ 'suiteSetup': '"beforeEach"',
+ 'suiteTeardown': '"afterEach"',
+ 'suite': '"describe" or "context"',
+ 'test': '"it" or "specify"',
+ },
+ // https://github.com/visionmedia/mocha/blob/master/lib/interfaces/bdd.js
+ bdd: {
+ 'before': '"setup"',
+ 'after': '"teardown"',
+ 'beforeEach': '"suiteSetup"',
+ 'afterEach': '"suiteTeardown"',
+ 'describe': '"suite"',
+ 'context': '"suite"',
+ 'xdescribe': '"suite.skip"',
+ 'xcontext': '"suite.skip"',
+ 'it': '"test"',
+ 'xit': '"test.skip"',
+ 'specify': '"test"',
+ 'xspecify': '"test.skip"',
+ },
+};
+/**
+ * Exposes all Mocha methods up front, configuring and running mocha
+ * automatically when you call them.
+ *
+ * The assumption is that it is a one-off (sub-)suite of tests being run.
+ */
+function stubInterfaces() {
+ var keys = Object.keys(MOCHA_EXPORTS);
+ keys.forEach(function (ui) {
+ Object.keys(MOCHA_EXPORTS[ui]).forEach(function (key) {
+ window[key] = function wrappedMochaFunction() {
+ _setupMocha(ui, key, MOCHA_EXPORTS[ui][key]);
+ if (!window[key] || window[key] === wrappedMochaFunction) {
+ throw new Error('Expected mocha.setup to define ' + key);
+ }
+ window[key].apply(window, arguments);
+ };
+ });
+ });
+}
+// Whether we've called `mocha.setup`
+var _mochaIsSetup = false;
+/**
+ * @param {string} ui Sets up mocha to run `ui`-style tests.
+ * @param {string} key The method called that triggered this.
+ * @param {string} alternate The matching method in the opposite interface.
+ */
+function _setupMocha(ui, key, alternate) {
+ var mochaOptions = get('mochaOptions');
+ if (mochaOptions.ui && mochaOptions.ui !== ui) {
+ var message = 'Mixing ' + mochaOptions.ui + ' and ' + ui +
+ ' Mocha styles is not supported. ' +
+ 'You called "' + key + '". Did you mean ' + alternate + '?';
+ throw new Error(message);
+ }
+ if (_mochaIsSetup) {
+ return;
+ }
+ applyExtensions();
+ mochaOptions.ui = ui;
+ mocha.setup(mochaOptions); // Note that the reporter is configured in run.js.
+}
+
+// You can configure WCT before it has loaded by assigning your custom
+// configuration to the global `WCT`.
+setup(window.WCT);
+// Maybe some day we'll expose WCT as a module to whatever module registry you
+// are using (aka the UMD approach), or as an es6 module.
+var WCT = window.WCT = {
+ // A generic place to hang data about the current suite. This object is
+ // reported
+ // back via the `sub-suite-start` and `sub-suite-end` events.
+ share: {},
+ // Until then, we get to rely on it to expose parent runners to their
+ // children.
+ _ChildRunner: ChildRunner,
+ _reporter: undefined,
+ _config: _config,
+ // Public API
+ /**
+ * Loads suites of tests, supporting both `.js` and `.html` files.
+ *
+ * @param {!Array.<string>} files The files to load.
+ */
+ loadSuites: loadSuites,
+};
+// Load Process
+listenForErrors();
+stubInterfaces();
+loadSync();
+// Give any scripts on the page a chance to declare tests and muck with things.
+document.addEventListener('DOMContentLoaded', function () {
+ debug('DOMContentLoaded');
+ ensureDependenciesPresent();
+ // We need the socket built prior to building its reporter.
+ CLISocket.init(function (error, socket) {
+ if (error)
+ throw error;
+ // Are we a child of another run?
+ var current = ChildRunner.current();
+ var parent = current && current.parentScope.WCT._reporter;
+ debug('parentReporter:', parent);
+ var childSuites = activeChildSuites();
+ var reportersToUse = determineReporters(socket, parent);
+ // +1 for any local tests.
+ var reporter = new MultiReporter(childSuites.length + 1, reportersToUse, parent);
+ WCT._reporter = reporter; // For environment/compatibility.js
+ // We need the reporter so that we can report errors during load.
+ loadJsSuites(reporter, function (error) {
+ // Let our parent know that we're about to start the tests.
+ if (current)
+ current.ready(error);
+ if (error)
+ throw error;
+ // Emit any errors we've encountered up til now
+ globalErrors.forEach(function onError(error) {
+ reporter.emitOutOfBandTest('Test Suite Initialization', error);
+ });
+ runSuites(reporter, childSuites, function (error) {
+ // Make sure to let our parent know that we're done.
+ if (current)
+ current.done();
+ if (error)
+ throw error;
+ });
+ });
+ });
+});
+
+}());
+//# sourceMappingURL=browser.js.map \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/browser.js.map b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/browser.js.map
new file mode 100644
index 00000000000..89893182811
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/browser.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"browser.js.map","sources":["browser/environment/helpers.js","browser/config.js","browser/util.js","browser/childrunner.js","browser/clisocket.js","browser/reporters/console.js","browser/reporters/html.js","browser/reporters/multi.js","browser/reporters/title.js","browser/suites.js","browser/reporters.js","browser/environment.js","browser/environment/errors.js","browser/mocha/extend.js","browser/mocha/fixture.js","browser/mocha/stub.js","browser/mocha/replace.js","browser/mocha.js","browser/index.js"],"sourcesContent":["/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n * at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n * be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n * Google as part of the polymer project is also subject to an additional IP\n * rights grant found at http://polymer.github.io/PATENTS.txt\n */\n// Make sure that we use native timers, in case they're being stubbed out.\nvar nativeSetInterval = window.setInterval;\nvar nativeSetTimeout = window.setTimeout;\nvar nativeRequestAnimationFrame = window.requestAnimationFrame;\n/**\n * Runs `stepFn`, catching any error and passing it to `callback` (Node-style).\n * Otherwise, calls `callback` with no arguments on success.\n *\n * @param {function()} callback\n * @param {function()} stepFn\n */\nfunction safeStep(callback, stepFn) {\n var err;\n try {\n stepFn();\n }\n catch (error) {\n err = error;\n }\n callback(err);\n}\n/**\n * Runs your test at declaration time (before Mocha has begun tests). Handy for\n * when you need to test document initialization.\n *\n * Be aware that any errors thrown asynchronously cannot be tied to your test.\n * You may want to catch them and pass them to the done event, instead. See\n * `safeStep`.\n *\n * @param {string} name The name of the test.\n * @param {function(?function())} testFn The test function. If an argument is\n * accepted, the test will be treated as async, just like Mocha tests.\n */\nfunction testImmediate(name, testFn) {\n if (testFn.length > 0) {\n return testImmediateAsync(name, testFn);\n }\n var err;\n try {\n testFn();\n }\n catch (error) {\n err = error;\n }\n test(name, function (done) {\n done(err);\n });\n}\n/**\n * An async-only variant of `testImmediate`.\n *\n * @param {string} name\n * @param {function(?function())} testFn\n */\nfunction testImmediateAsync(name, testFn) {\n var testComplete = false;\n var err;\n test(name, function (done) {\n var intervalId = nativeSetInterval(function () {\n if (!testComplete)\n return;\n clearInterval(intervalId);\n done(err);\n }, 10);\n });\n try {\n testFn(function (error) {\n if (error)\n err = error;\n testComplete = true;\n });\n }\n catch (error) {\n err = error;\n testComplete = true;\n }\n}\n/**\n * Triggers a flush of any pending events, observations, etc and calls you back\n * after they have been processed.\n *\n * @param {function()} callback\n */\nfunction flush(callback) {\n // Ideally, this function would be a call to Polymer.dom.flush, but that\n // doesn't support a callback yet\n // (https://github.com/Polymer/polymer-dev/issues/851),\n // ...and there's cross-browser flakiness to deal with.\n // Make sure that we're invoking the callback with no arguments so that the\n // caller can pass Mocha callbacks, etc.\n var done = function done() {\n callback();\n };\n // Because endOfMicrotask is flaky for IE, we perform microtask checkpoints\n // ourselves (https://github.com/Polymer/polymer-dev/issues/114):\n var isIE = navigator.appName === 'Microsoft Internet Explorer';\n if (isIE && window.Platform && window.Platform.performMicrotaskCheckpoint) {\n var reallyDone_1 = done;\n done = function doneIE() {\n Platform.performMicrotaskCheckpoint();\n nativeSetTimeout(reallyDone_1, 0);\n };\n }\n // Everyone else gets a regular flush.\n var scope;\n if (window.Polymer && window.Polymer.dom && window.Polymer.dom.flush) {\n scope = window.Polymer.dom;\n }\n else if (window.Polymer && window.Polymer.flush) {\n scope = window.Polymer;\n }\n else if (window.WebComponents && window.WebComponents.flush) {\n scope = window.WebComponents;\n }\n if (scope) {\n scope.flush();\n }\n // Ensure that we are creating a new _task_ to allow all active microtasks to\n // finish (the code you're testing may be using endOfMicrotask, too).\n nativeSetTimeout(done, 0);\n}\n/**\n * Advances a single animation frame.\n *\n * Calls `flush`, `requestAnimationFrame`, `flush`, and `callback` sequentially\n * @param {function()} callback\n */\nfunction animationFrameFlush(callback) {\n flush(function () {\n nativeRequestAnimationFrame(function () {\n flush(callback);\n });\n });\n}\n/**\n * DEPRECATED: Use `flush`.\n * @param {function} callback\n */\nfunction asyncPlatformFlush(callback) {\n console.warn('asyncPlatformFlush is deprecated in favor of the more terse flush()');\n return window.flush(callback);\n}\n/**\n *\n */\nfunction waitFor(fn, next, intervalOrMutationEl, timeout, timeoutTime) {\n timeoutTime = timeoutTime || Date.now() + (timeout || 1000);\n intervalOrMutationEl = intervalOrMutationEl || 32;\n try {\n fn();\n }\n catch (e) {\n if (Date.now() > timeoutTime) {\n throw e;\n }\n else {\n if (typeof intervalOrMutationEl !== 'number') {\n intervalOrMutationEl.onMutation(intervalOrMutationEl, function () {\n waitFor(fn, next, intervalOrMutationEl, timeout, timeoutTime);\n });\n }\n else {\n nativeSetTimeout(function () {\n waitFor(fn, next, intervalOrMutationEl, timeout, timeoutTime);\n }, intervalOrMutationEl);\n }\n return;\n }\n }\n next();\n}\nwindow.safeStep = safeStep;\nwindow.testImmediate = testImmediate;\nwindow.testImmediateAsync = testImmediateAsync;\nwindow.flush = flush;\nwindow.animationFrameFlush = animationFrameFlush;\nwindow.asyncPlatformFlush = asyncPlatformFlush;\nwindow.waitFor = waitFor;\n","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n * at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n * be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n * Google as part of the polymer project is also subject to an additional IP\n * rights grant found at http://polymer.github.io/PATENTS.txt\n */\nimport ChildRunner from './childrunner.js';\nimport * as util from './util.js';\n/**\n * The global configuration state for WCT's browser client.\n */\nexport var _config = {\n environmentScripts: !!window.__wctUseNpm ?\n [\n 'stacky/browser.js', 'async/lib/async.js', 'lodash/index.js',\n 'mocha/mocha.js', 'chai/chai.js', '@polymer/sinonjs/sinon.js',\n 'sinon-chai/lib/sinon-chai.js',\n 'accessibility-developer-tools/dist/js/axs_testing.js',\n '@polymer/test-fixture/test-fixture.js'\n ] :\n [\n 'stacky/browser.js', 'async/lib/async.js', 'lodash/lodash.js',\n 'mocha/mocha.js', 'chai/chai.js', 'sinonjs/sinon.js',\n 'sinon-chai/lib/sinon-chai.js',\n 'accessibility-developer-tools/dist/js/axs_testing.js'\n ],\n environmentImports: !!window.__wctUseNpm ? [] :\n ['test-fixture/test-fixture.html'],\n root: null,\n waitForFrameworks: true,\n waitFor: null,\n numConcurrentSuites: 1,\n trackConsoleError: true,\n mochaOptions: { timeout: 10 * 1000 },\n verbose: false,\n};\n/**\n * Merges initial `options` into WCT's global configuration.\n *\n * @param {Object} options The options to merge. See `browser/config.js` for a\n * reference.\n */\nexport function setup(options) {\n var childRunner = ChildRunner.current();\n if (childRunner) {\n _deepMerge(_config, childRunner.parentScope.WCT._config);\n // But do not force the mocha UI\n delete _config.mochaOptions.ui;\n }\n if (options && typeof options === 'object') {\n _deepMerge(_config, options);\n }\n if (!_config.root) {\n // Sibling dependencies.\n var root = util.scriptPrefix('browser.js');\n _config.root = util.basePath(root.substr(0, root.length - 1));\n if (!_config.root) {\n throw new Error('Unable to detect root URL for WCT sources. Please set WCT.root before including browser.js');\n }\n }\n}\n/**\n * Retrieves a configuration value.\n */\nexport function get(key) {\n return _config[key];\n}\n// Internal\nfunction _deepMerge(target, source) {\n Object.keys(source).forEach(function (key) {\n if (target[key] !== null && typeof target[key] === 'object' &&\n !Array.isArray(target[key])) {\n _deepMerge(target[key], source[key]);\n }\n else {\n target[key] = source[key];\n }\n });\n}\n","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n * at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n * be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n * Google as part of the polymer project is also subject to an additional IP\n * rights grant found at http://polymer.github.io/PATENTS.txt\n */\nimport * as config from './config.js';\n/**\n * @param {function()} callback A function to call when the active web component\n * frameworks have loaded.\n */\nexport function whenFrameworksReady(callback) {\n debug('whenFrameworksReady');\n var done = function () {\n debug('whenFrameworksReady done');\n callback();\n };\n // If webcomponents script is in the document, wait for WebComponentsReady.\n if (window.WebComponents && !window.WebComponents.ready) {\n debug('WebComponentsReady?');\n window.addEventListener('WebComponentsReady', function wcReady() {\n window.removeEventListener('WebComponentsReady', wcReady);\n debug('WebComponentsReady');\n done();\n });\n }\n else {\n done();\n }\n}\n/**\n * @return {string} '<count> <kind> tests' or '<count> <kind> test'.\n */\nexport function pluralizedStat(count, kind) {\n if (count === 1) {\n return count + ' ' + kind + ' test';\n }\n else {\n return count + ' ' + kind + ' tests';\n }\n}\n/**\n * @param {string} path The URI of the script to load.\n * @param {function} done\n */\nexport function loadScript(path, done) {\n var script = document.createElement('script');\n script.src = path;\n if (done) {\n script.onload = done.bind(null, null);\n script.onerror = done.bind(null, 'Failed to load script ' + script.src);\n }\n document.head.appendChild(script);\n}\n/**\n * @param {string} path The URI of the stylesheet to load.\n * @param {function} done\n */\nexport function loadStyle(path, done) {\n var link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = path;\n if (done) {\n link.onload = done.bind(null, null);\n link.onerror = done.bind(null, 'Failed to load stylesheet ' + link.href);\n }\n document.head.appendChild(link);\n}\n/**\n * @param {...*} var_args Logs values to the console when the `debug`\n * configuration option is true.\n */\nexport function debug() {\n var var_args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n var_args[_i] = arguments[_i];\n }\n if (!config.get('verbose')) {\n return;\n }\n var args = [window.location.pathname].concat(var_args);\n (console.debug || console.log).apply(console, args);\n}\n// URL Processing\n/**\n * @param {string} url\n * @return {{base: string, params: string}}\n */\nexport function parseUrl(url) {\n var parts = url.match(/^(.*?)(?:\\?(.*))?$/);\n return {\n base: parts[1],\n params: getParams(parts[2] || ''),\n };\n}\n/**\n * Expands a URL that may or may not be relative to `base`.\n *\n * @param {string} url\n * @param {string} base\n * @return {string}\n */\nexport function expandUrl(url, base) {\n if (!base)\n return url;\n if (url.match(/^(\\/|https?:\\/\\/)/))\n return url;\n if (base.substr(base.length - 1) !== '/') {\n base = base + '/';\n }\n return base + url;\n}\n/**\n * @param {string=} opt_query A query string to parse.\n * @return {!Object<string, !Array<string>>} All params on the URL's query.\n */\nexport function getParams(query) {\n query = typeof query === 'string' ? query : window.location.search;\n if (query.substring(0, 1) === '?') {\n query = query.substring(1);\n }\n // python's SimpleHTTPServer tacks a `/` on the end of query strings :(\n if (query.slice(-1) === '/') {\n query = query.substring(0, query.length - 1);\n }\n if (query === '')\n return {};\n var result = {};\n query.split('&').forEach(function (part) {\n var pair = part.split('=');\n if (pair.length !== 2) {\n console.warn('Invalid URL query part:', part);\n return;\n }\n var key = decodeURIComponent(pair[0]);\n var value = decodeURIComponent(pair[1]);\n if (!result[key]) {\n result[key] = [];\n }\n result[key].push(value);\n });\n return result;\n}\n/**\n * Merges params from `source` into `target` (mutating `target`).\n *\n * @param {!Object<string, !Array<string>>} target\n * @param {!Object<string, !Array<string>>} source\n */\nexport function mergeParams(target, source) {\n Object.keys(source).forEach(function (key) {\n if (!(key in target)) {\n target[key] = [];\n }\n target[key] = target[key].concat(source[key]);\n });\n}\n/**\n * @param {string} param The param to return a value for.\n * @return {?string} The first value for `param`, if found.\n */\nexport function getParam(param) {\n var params = getParams();\n return params[param] ? params[param][0] : null;\n}\n/**\n * @param {!Object<string, !Array<string>>} params\n * @return {string} `params` encoded as a URI query.\n */\nexport function paramsToQuery(params) {\n var pairs = [];\n Object.keys(params).forEach(function (key) {\n params[key].forEach(function (value) {\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n });\n });\n return (pairs.length > 0) ? ('?' + pairs.join('&')) : '';\n}\nfunction getPathName(location) {\n return typeof location === 'string' ? location : location.pathname;\n}\nexport function basePath(location) {\n return getPathName(location).match(/^.*\\//)[0];\n}\nexport function relativeLocation(location, basePath) {\n var path = getPathName(location);\n if (path.indexOf(basePath) === 0) {\n path = path.substring(basePath.length);\n }\n return path;\n}\nexport function cleanLocation(location) {\n var path = getPathName(location);\n if (path.slice(-11) === '/index.html') {\n path = path.slice(0, path.length - 10);\n }\n return path;\n}\nexport function parallel(runners, maybeLimit, done) {\n var limit;\n if (typeof maybeLimit !== 'number') {\n done = maybeLimit;\n limit = 0;\n }\n else {\n limit = maybeLimit;\n }\n if (!runners.length) {\n return done();\n }\n var called = false;\n var total = runners.length;\n var numActive = 0;\n var numDone = 0;\n function runnerDone(error) {\n if (called) {\n return;\n }\n numDone = numDone + 1;\n numActive = numActive - 1;\n if (error || numDone >= total) {\n called = true;\n done(error);\n }\n else {\n runOne();\n }\n }\n function runOne() {\n if (limit && numActive >= limit) {\n return;\n }\n if (!runners.length) {\n return;\n }\n numActive = numActive + 1;\n runners.shift()(runnerDone);\n }\n runners.forEach(runOne);\n}\n/**\n * Finds the directory that a loaded script is hosted on.\n *\n * @param {string} filename\n * @return {string?}\n */\nexport function scriptPrefix(filename) {\n var scripts = document.querySelectorAll('script[src*=\"' + filename + '\"]');\n if (scripts.length !== 1) {\n return null;\n }\n var script = scripts[0].src;\n return script.substring(0, script.indexOf(filename));\n}\n","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n * at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n * be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n * Google as part of the polymer project is also subject to an additional IP\n * rights grant found at http://polymer.github.io/PATENTS.txt\n */\nimport * as util from './util.js';\n/**\n * A Mocha suite (or suites) run within a child iframe, but reported as if they\n * are part of the current context.\n */\nvar ChildRunner = /** @class */ (function () {\n function ChildRunner(url, parentScope) {\n var urlBits = util.parseUrl(url);\n util.mergeParams(urlBits.params, util.getParams(parentScope.location.search));\n delete urlBits.params.cli_browser_id;\n this.url = urlBits.base + util.paramsToQuery(urlBits.params);\n this.parentScope = parentScope;\n this.state = 'initializing';\n }\n /**\n * @return {ChildRunner} The `ChildRunner` that was registered for this\n * window.\n */\n ChildRunner.current = function () {\n return ChildRunner.get(window);\n };\n /**\n * @param {!Window} target A window to find the ChildRunner of.\n * @param {boolean} traversal Whether this is a traversal from a child window.\n * @return {ChildRunner} The `ChildRunner` that was registered for `target`.\n */\n ChildRunner.get = function (target, traversal) {\n var childRunner = ChildRunner._byUrl[target.location.href];\n if (childRunner) {\n return childRunner;\n }\n if (window.parent === window) {\n if (traversal) {\n console.warn('Subsuite loaded but was never registered. This most likely is due to wonky history behavior. Reloading...');\n window.location.reload();\n }\n return null;\n }\n // Otherwise, traverse.\n return window.parent.WCT._ChildRunner.get(target, true);\n };\n /**\n * Loads and runs the subsuite.\n *\n * @param {function} done Node-style callback.\n */\n ChildRunner.prototype.run = function (done) {\n util.debug('ChildRunner#run', this.url);\n this.state = 'loading';\n this.onRunComplete = done;\n this.iframe = document.createElement('iframe');\n this.iframe.src = this.url;\n this.iframe.classList.add('subsuite');\n var container = document.getElementById('subsuites');\n if (!container) {\n container = document.createElement('div');\n container.id = 'subsuites';\n document.body.appendChild(container);\n }\n container.appendChild(this.iframe);\n // let the iframe expand the URL for us.\n this.url = this.iframe.src;\n ChildRunner._byUrl[this.url] = this;\n this.timeoutId = setTimeout(this.loaded.bind(this, new Error('Timed out loading ' + this.url)), ChildRunner.loadTimeout);\n this.iframe.addEventListener('error', this.loaded.bind(this, new Error('Failed to load document ' + this.url)));\n this.iframe.contentWindow.addEventListener('DOMContentLoaded', this.loaded.bind(this, null));\n };\n /**\n * Called when the sub suite's iframe has loaded (or errored during load).\n *\n * @param {*} error The error that occured, if any.\n */\n ChildRunner.prototype.loaded = function (error) {\n util.debug('ChildRunner#loaded', this.url, error);\n // Not all targets have WCT loaded (compatiblity mode)\n if (this.iframe.contentWindow.WCT) {\n this.share = this.iframe.contentWindow.WCT.share;\n }\n if (error) {\n this.signalRunComplete(error);\n this.done();\n }\n };\n /**\n * Called in mocha/run.js when all dependencies have loaded, and the child is\n * ready to start running tests\n *\n * @param {*} error The error that occured, if any.\n */\n ChildRunner.prototype.ready = function (error) {\n util.debug('ChildRunner#ready', this.url, error);\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n }\n if (error) {\n this.signalRunComplete(error);\n this.done();\n }\n };\n /**\n * Called when the sub suite's tests are complete, so that it can clean up.\n */\n ChildRunner.prototype.done = function () {\n util.debug('ChildRunner#done', this.url, arguments);\n // make sure to clear that timeout\n this.ready();\n this.signalRunComplete();\n if (!this.iframe)\n return;\n // Be safe and avoid potential browser crashes when logic attempts to\n // interact with the removed iframe.\n setTimeout(function () {\n this.iframe.parentNode.removeChild(this.iframe);\n this.iframe = null;\n }.bind(this), 1);\n };\n ChildRunner.prototype.signalRunComplete = function (error) {\n if (!this.onRunComplete)\n return;\n this.state = 'complete';\n this.onRunComplete(error);\n this.onRunComplete = null;\n };\n // ChildRunners get a pretty generous load timeout by default.\n ChildRunner.loadTimeout = 60000;\n // We can't maintain properties on iframe elements in Firefox/Safari/???, so\n // we track childRunners by URL.\n ChildRunner._byUrl = {};\n return ChildRunner;\n}());\nexport default ChildRunner;\n","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n * at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n * be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n * Google as part of the polymer project is also subject to an additional IP\n * rights grant found at http://polymer.github.io/PATENTS.txt\n */\nimport ChildRunner from './childrunner.js';\nimport * as util from './util.js';\nvar SOCKETIO_ENDPOINT = window.location.protocol + '//' + window.location.host;\nvar SOCKETIO_LIBRARY = SOCKETIO_ENDPOINT + '/socket.io/socket.io.js';\n/**\n * A socket for communication between the CLI and browser runners.\n *\n * @param {string} browserId An ID generated by the CLI runner.\n * @param {!io.Socket} socket The socket.io `Socket` to communicate over.\n */\nvar CLISocket = /** @class */ (function () {\n function CLISocket(browserId, socket) {\n this.browserId = browserId;\n this.socket = socket;\n }\n /**\n * @param {!Mocha.Runner} runner The Mocha `Runner` to observe, reporting\n * interesting events back to the CLI runner.\n */\n CLISocket.prototype.observe = function (runner) {\n var _this = this;\n this.emitEvent('browser-start', {\n url: window.location.toString(),\n });\n // We only emit a subset of events that we care about, and follow a more\n // general event format that is hopefully applicable to test runners beyond\n // mocha.\n //\n // For all possible mocha events, see:\n // https://github.com/visionmedia/mocha/blob/master/lib/runner.js#L36\n runner.on('test', function (test) {\n _this.emitEvent('test-start', { test: getTitles(test) });\n });\n runner.on('test end', function (test) {\n _this.emitEvent('test-end', {\n state: getState(test),\n test: getTitles(test),\n duration: test.duration,\n error: test.err,\n });\n });\n runner.on('fail', function (test, err) {\n // fail the test run if we catch errors outside of a test function\n if (test.type !== 'test') {\n _this.emitEvent('browser-fail', 'Error thrown outside of test function: ' + err.stack);\n }\n });\n runner.on('childRunner start', function (childRunner) {\n _this.emitEvent('sub-suite-start', childRunner.share);\n });\n runner.on('childRunner end', function (childRunner) {\n _this.emitEvent('sub-suite-end', childRunner.share);\n });\n runner.on('end', function () {\n _this.emitEvent('browser-end');\n });\n };\n /**\n * @param {string} event The name of the event to fire.\n * @param {*} data Additional data to pass with the event.\n */\n CLISocket.prototype.emitEvent = function (event, data) {\n this.socket.emit('client-event', {\n browserId: this.browserId,\n event: event,\n data: data,\n });\n };\n /**\n * Builds a `CLISocket` if we are within a CLI-run environment; short-circuits\n * otherwise.\n *\n * @param {function(*, CLISocket)} done Node-style callback.\n */\n CLISocket.init = function (done) {\n var browserId = util.getParam('cli_browser_id');\n if (!browserId)\n return done();\n // Only fire up the socket for root runners.\n if (ChildRunner.current())\n return done();\n util.loadScript(SOCKETIO_LIBRARY, function (error) {\n if (error)\n return done(error);\n var socket = io(SOCKETIO_ENDPOINT);\n socket.on('error', function (error) {\n socket.off();\n done(error);\n });\n socket.on('connect', function () {\n socket.off();\n done(null, new CLISocket(browserId, socket));\n });\n });\n };\n return CLISocket;\n}());\nexport default CLISocket;\n// Misc Utility\n/**\n * @param {!Mocha.Runnable} runnable The test or suite to extract titles from.\n * @return {!Array.<string>} The titles of the runnable and its parents.\n */\nfunction getTitles(runnable) {\n var titles = [];\n while (runnable && !runnable.root && runnable.title) {\n titles.unshift(runnable.title);\n runnable = runnable.parent;\n }\n return titles;\n}\n/**\n * @param {!Mocha.Runnable} runnable\n * @return {string}\n */\nfunction getState(runnable) {\n if (runnable.state === 'passed') {\n return 'passing';\n }\n else if (runnable.state === 'failed') {\n return 'failing';\n }\n else if (runnable.pending) {\n return 'pending';\n }\n else {\n return 'unknown';\n }\n}\n","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n * at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n * be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n * Google as part of the polymer project is also subject to an additional IP\n * rights grant found at http://polymer.github.io/PATENTS.txt\n */\nimport * as util from '../util.js';\n// We capture console events when running tests; so make sure we have a\n// reference to the original one.\nvar console = window.console;\nvar FONT = ';font: normal 13px \"Roboto\", \"Helvetica Neue\", \"Helvetica\", sans-serif;';\nvar STYLES = {\n plain: FONT,\n suite: 'color: #5c6bc0' + FONT,\n test: FONT,\n passing: 'color: #259b24' + FONT,\n pending: 'color: #e65100' + FONT,\n failing: 'color: #c41411' + FONT,\n stack: 'color: #c41411',\n results: FONT + 'font-size: 16px',\n};\n// I don't think we can feature detect this one...\nvar userAgent = navigator.userAgent.toLowerCase();\nvar CAN_STYLE_LOG = userAgent.match('firefox') || userAgent.match('webkit');\nvar CAN_STYLE_GROUP = userAgent.match('webkit');\n// Track the indent for faked `console.group`\nvar logIndent = '';\nfunction log(text, style) {\n text = text.split('\\n')\n .map(function (l) {\n return logIndent + l;\n })\n .join('\\n');\n if (CAN_STYLE_LOG) {\n console.log('%c' + text, STYLES[style] || STYLES.plain);\n }\n else {\n console.log(text);\n }\n}\nfunction logGroup(text, style) {\n if (CAN_STYLE_GROUP) {\n console.group('%c' + text, STYLES[style] || STYLES.plain);\n }\n else if (console.group) {\n console.group(text);\n }\n else {\n logIndent = logIndent + ' ';\n log(text, style);\n }\n}\nfunction logGroupEnd() {\n if (console.groupEnd) {\n console.groupEnd();\n }\n else {\n logIndent = logIndent.substr(0, logIndent.length - 2);\n }\n}\nfunction logException(error) {\n log(error.stack || error.message || (error + ''), 'stack');\n}\n/**\n * A Mocha reporter that logs results out to the web `console`.\n */\nvar Console = /** @class */ (function () {\n /**\n * @param runner The runner that is being reported on.\n */\n function Console(runner) {\n Mocha.reporters.Base.call(this, runner);\n runner.on('suite', function (suite) {\n if (suite.root) {\n return;\n }\n logGroup(suite.title, 'suite');\n }.bind(this));\n runner.on('suite end', function (suite) {\n if (suite.root) {\n return;\n }\n logGroupEnd();\n }.bind(this));\n runner.on('test', function (test) {\n logGroup(test.title, 'test');\n }.bind(this));\n runner.on('pending', function (test) {\n logGroup(test.title, 'pending');\n }.bind(this));\n runner.on('fail', function (_test, error) {\n logException(error);\n }.bind(this));\n runner.on('test end', function (_test) {\n logGroupEnd();\n }.bind(this));\n runner.on('end', this.logSummary.bind(this));\n }\n /** Prints out a final summary of test results. */\n Console.prototype.logSummary = function () {\n logGroup('Test Results', 'results');\n if (this.stats.failures > 0) {\n log(util.pluralizedStat(this.stats.failures, 'failing'), 'failing');\n }\n if (this.stats.pending > 0) {\n log(util.pluralizedStat(this.stats.pending, 'pending'), 'pending');\n }\n log(util.pluralizedStat(this.stats.passes, 'passing'));\n if (!this.stats.failures) {\n log('test suite passed', 'passing');\n }\n log('Evaluated ' + this.stats.tests + ' tests in ' +\n this.stats.duration + 'ms.');\n logGroupEnd();\n };\n return Console;\n}());\nexport default Console;\n","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n * at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n * be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n * Google as part of the polymer project is also subject to an additional IP\n * rights grant found at http://polymer.github.io/PATENTS.txt\n */\n/**\n * WCT-specific behavior on top of Mocha's default HTML reporter.\n *\n * @param {!Mocha.Runner} runner The runner that is being reported on.\n */\nexport default function HTML(runner) {\n var output = document.createElement('div');\n output.id = 'mocha';\n document.body.appendChild(output);\n runner.on('suite', function (_test) {\n this.total = runner.total;\n }.bind(this));\n Mocha.reporters.HTML.call(this, runner);\n}\n// Woo! What a hack. This just saves us from adding a bunch of complexity around\n// style loading.\nvar style = document.createElement('style');\nstyle.textContent = \"\\n html, body {\\n position: relative;\\n height: 100%;\\n width: 100%;\\n min-width: 900px;\\n }\\n #mocha, #subsuites {\\n height: 100%;\\n position: absolute;\\n top: 0;\\n }\\n #mocha {\\n box-sizing: border-box;\\n margin: 0 !important;\\n padding: 60px 20px;\\n right: 0;\\n left: 500px;\\n }\\n #subsuites {\\n -ms-flex-direction: column;\\n -webkit-flex-direction: column;\\n display: -ms-flexbox;\\n display: -webkit-flex;\\n display: flex;\\n flex-direction: column;\\n left: 0;\\n width: 500px;\\n }\\n #subsuites .subsuite {\\n border: 0;\\n width: 100%;\\n height: 100%;\\n }\\n #mocha .test.pass .duration {\\n color: #555 !important;\\n }\\n\";\ndocument.head.appendChild(style);\n","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n * at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n * be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n * Google as part of the polymer project is also subject to an additional IP\n * rights grant found at http://polymer.github.io/PATENTS.txt\n */\nimport * as util from '../util.js';\nvar STACKY_CONFIG = {\n indent: ' ',\n locationStrip: [\n /^https?:\\/\\/[^\\/]+/,\n /\\?.*$/,\n ],\n filter: function (line) {\n return !!line.location.match(/\\/web-component-tester\\/[^\\/]+(\\?.*)?$/);\n },\n};\n// https://github.com/visionmedia/mocha/blob/master/lib/runner.js#L36-46\nvar MOCHA_EVENTS = [\n 'start', 'end', 'suite', 'suite end', 'test', 'test end', 'hook', 'hook end',\n 'pass', 'fail', 'pending', 'childRunner end'\n];\n// Until a suite has loaded, we assume this many tests in it.\nvar ESTIMATED_TESTS_PER_SUITE = 3;\n/**\n * A Mocha-like reporter that combines the output of multiple Mocha suites.\n */\nvar MultiReporter = /** @class */ (function () {\n /**\n * @param numSuites The number of suites that will be run, in order to\n * estimate the total number of tests that will be performed.\n * @param reporters The set of reporters that\n * should receive the unified event stream.\n * @param parent The parent reporter, if present.\n */\n function MultiReporter(numSuites, reporters, parent) {\n var _this = this;\n this.reporters = reporters.map(function (reporter) {\n return new reporter(_this);\n });\n this.parent = parent;\n this.basePath = parent && parent.basePath || util.basePath(window.location);\n this.total = numSuites * ESTIMATED_TESTS_PER_SUITE;\n // Mocha reporters assume a stream of events, so we have to be careful to\n // only report on one runner at a time...\n this.currentRunner = null;\n // ...while we buffer events for any other active runners.\n this.pendingEvents = [];\n this.emit('start');\n }\n /**\n * @param location The location this reporter represents.\n * @return A reporter-like \"class\" for each child suite\n * that should be passed to `mocha.run`.\n */\n MultiReporter.prototype.childReporter = function (location) {\n var name = this.suiteTitle(location);\n // The reporter is used as a constructor, so we can't depend on `this` being\n // properly bound.\n var self = this;\n return _a = /** @class */ (function () {\n function ChildReporter(runner) {\n runner.name = window.name;\n self.bindChildRunner(runner);\n }\n return ChildReporter;\n }()),\n _a.title = window.name,\n _a;\n var _a;\n };\n /** Must be called once all runners have finished. */\n MultiReporter.prototype.done = function () {\n this.complete = true;\n this.flushPendingEvents();\n this.emit('end');\n };\n /**\n * Emit a top level test that is not part of any suite managed by this\n * reporter.\n *\n * Helpful for reporting on global errors, loading issues, etc.\n *\n * @param title The title of the test.\n * @param error An error associated with this test. If falsy, test is\n * considered to be passing.\n * @param suiteTitle Title for the suite that's wrapping the test.\n * @param estimated If this test was included in the original\n * estimate of `numSuites`.\n */\n MultiReporter.prototype.emitOutOfBandTest = function (title, error, suiteTitle, estimated) {\n util.debug('MultiReporter#emitOutOfBandTest(', arguments, ')');\n var root = new Mocha.Suite(suiteTitle || '');\n var test = new Mocha.Test(title, function () { });\n test.parent = root;\n test.state = error ? 'failed' : 'passed';\n test.err = error;\n if (!estimated) {\n this.total = this.total + ESTIMATED_TESTS_PER_SUITE;\n }\n var runner = { total: 1 };\n this.proxyEvent('start', runner);\n this.proxyEvent('suite', runner, root);\n this.proxyEvent('test', runner, test);\n if (error) {\n this.proxyEvent('fail', runner, test, error);\n }\n else {\n this.proxyEvent('pass', runner, test);\n }\n this.proxyEvent('test end', runner, test);\n this.proxyEvent('suite end', runner, root);\n this.proxyEvent('end', runner);\n };\n /**\n * @param {!Location|string} location\n * @return {string}\n */\n MultiReporter.prototype.suiteTitle = function (location) {\n var path = util.relativeLocation(location, this.basePath);\n path = util.cleanLocation(path);\n return path;\n };\n // Internal Interface\n /** @param {!Mocha.runners.Base} runner The runner to listen to events for. */\n MultiReporter.prototype.bindChildRunner = function (runner) {\n var _this = this;\n MOCHA_EVENTS.forEach(function (eventName) {\n runner.on(eventName, _this.proxyEvent.bind(_this, eventName, runner));\n });\n };\n /**\n * Evaluates an event fired by `runner`, proxying it forward or buffering it.\n *\n * @param {string} eventName\n * @param {!Mocha.runners.Base} runner The runner that emitted this event.\n * @param {...*} var_args Any additional data passed as part of the event.\n */\n MultiReporter.prototype.proxyEvent = function (eventName, runner) {\n var _args = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n _args[_i - 2] = arguments[_i];\n }\n var extraArgs = Array.prototype.slice.call(arguments, 2);\n if (this.complete) {\n console.warn('out of order Mocha event for ' + runner.name + ':', eventName, extraArgs);\n return;\n }\n if (this.currentRunner && runner !== this.currentRunner) {\n this.pendingEvents.push(Array.prototype.slice.call(arguments));\n return;\n }\n util.debug('MultiReporter#proxyEvent(', arguments, ')');\n // This appears to be a Mocha bug: Tests failed by passing an error to their\n // done function don't set `err` properly.\n //\n // TODO(nevir): Track down.\n if (eventName === 'fail' && !extraArgs[0].err) {\n extraArgs[0].err = extraArgs[1];\n }\n if (eventName === 'start') {\n this.onRunnerStart(runner);\n }\n else if (eventName === 'end') {\n this.onRunnerEnd(runner);\n }\n else {\n this.cleanEvent(eventName, runner, extraArgs);\n this.emit.apply(this, [eventName].concat(extraArgs));\n }\n };\n /**\n * Cleans or modifies an event if needed.\n *\n * @param eventName\n * @param runner The runner that emitted this event.\n * @param extraArgs\n */\n MultiReporter.prototype.cleanEvent = function (eventName, _runner, extraArgs) {\n // Suite hierarchy\n if (extraArgs[0]) {\n extraArgs[0] = this.showRootSuite(extraArgs[0]);\n }\n // Normalize errors\n if (eventName === 'fail') {\n extraArgs[1] = Stacky.normalize(extraArgs[1], STACKY_CONFIG);\n }\n if (extraArgs[0] && extraArgs[0].err) {\n extraArgs[0].err = Stacky.normalize(extraArgs[0].err, STACKY_CONFIG);\n }\n };\n /**\n * We like to show the root suite's title, which requires a little bit of\n * trickery in the suite hierarchy.\n *\n * @param {!Mocha.Runnable} node\n */\n MultiReporter.prototype.showRootSuite = function (node) {\n var leaf = node = Object.create(node);\n while (node && node.parent) {\n var wrappedParent = Object.create(node.parent);\n node.parent = wrappedParent;\n node = wrappedParent;\n }\n node.root = false;\n return leaf;\n };\n /** @param {!Mocha.runners.Base} runner */\n MultiReporter.prototype.onRunnerStart = function (runner) {\n util.debug('MultiReporter#onRunnerStart:', runner.name);\n this.total = this.total - ESTIMATED_TESTS_PER_SUITE + runner.total;\n this.currentRunner = runner;\n };\n /** @param {!Mocha.runners.Base} runner */\n MultiReporter.prototype.onRunnerEnd = function (runner) {\n util.debug('MultiReporter#onRunnerEnd:', runner.name);\n this.currentRunner = null;\n this.flushPendingEvents();\n };\n /**\n * Flushes any buffered events and runs them through `proxyEvent`. This will\n * loop until all buffered runners are complete, or we have run out of\n * buffered events.\n */\n MultiReporter.prototype.flushPendingEvents = function () {\n var _this = this;\n var events = this.pendingEvents;\n this.pendingEvents = [];\n events.forEach(function (eventArgs) {\n _this.proxyEvent.apply(_this, eventArgs);\n });\n };\n return MultiReporter;\n}());\nexport default MultiReporter;\n","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n * at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n * be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n * Google as part of the polymer project is also subject to an additional IP\n * rights grant found at http://polymer.github.io/PATENTS.txt\n */\nimport * as util from '../util.js';\nvar ARC_OFFSET = 0; // start at the right.\nvar ARC_WIDTH = 6;\n/**\n * A Mocha reporter that updates the document's title and favicon with\n * at-a-glance stats.\n *\n * @param {!Mocha.Runner} runner The runner that is being reported on.\n */\nvar Title = /** @class */ (function () {\n function Title(runner) {\n Mocha.reporters.Base.call(this, runner);\n runner.on('test end', this.report.bind(this));\n }\n /** Reports current stats via the page title and favicon. */\n Title.prototype.report = function () {\n this.updateTitle();\n this.updateFavicon();\n };\n /** Updates the document title with a summary of current stats. */\n Title.prototype.updateTitle = function () {\n if (this.stats.failures > 0) {\n document.title = util.pluralizedStat(this.stats.failures, 'failing');\n }\n else {\n document.title = util.pluralizedStat(this.stats.passes, 'passing');\n }\n };\n /** Updates the document's favicon w/ a summary of current stats. */\n Title.prototype.updateFavicon = function () {\n var canvas = document.createElement('canvas');\n canvas.height = canvas.width = 32;\n var context = canvas.getContext('2d');\n var passing = this.stats.passes;\n var pending = this.stats.pending;\n var failing = this.stats.failures;\n var total = Math.max(this.runner.total, passing + pending + failing);\n drawFaviconArc(context, total, 0, passing, '#0e9c57');\n drawFaviconArc(context, total, passing, pending, '#f3b300');\n drawFaviconArc(context, total, pending + passing, failing, '#ff5621');\n this.setFavicon(canvas.toDataURL());\n };\n /** Sets the current favicon by URL. */\n Title.prototype.setFavicon = function (url) {\n var current = document.head.querySelector('link[rel=\"icon\"]');\n if (current) {\n document.head.removeChild(current);\n }\n var link = document.createElement('link');\n link.rel = 'icon';\n link.type = 'image/x-icon';\n link.href = url;\n link.setAttribute('sizes', '32x32');\n document.head.appendChild(link);\n };\n return Title;\n}());\nexport default Title;\n/**\n * Draws an arc for the favicon status, relative to the total number of tests.\n */\nfunction drawFaviconArc(context, total, start, length, color) {\n var arcStart = ARC_OFFSET + Math.PI * 2 * (start / total);\n var arcEnd = ARC_OFFSET + Math.PI * 2 * ((start + length) / total);\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = ARC_WIDTH;\n context.arc(16, 16, 16 - ARC_WIDTH / 2, arcStart, arcEnd);\n context.stroke();\n}\n","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n * at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n * be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n * Google as part of the polymer project is also subject to an additional IP\n * rights grant found at http://polymer.github.io/PATENTS.txt\n */\nimport ChildRunner from './childrunner.js';\nimport * as config from './config.js';\nimport * as util from './util.js';\nexport var htmlSuites = [];\nexport var jsSuites = [];\n// We process grep ourselves to avoid loading suites that will be filtered.\nvar GREP = util.getParam('grep');\n// work around mocha bug (https://github.com/mochajs/mocha/issues/2070)\nif (GREP) {\n GREP = GREP.replace(/\\\\\\./g, '.');\n}\n/**\n * Loads suites of tests, supporting both `.js` and `.html` files.\n *\n * @param files The files to load.\n */\nexport function loadSuites(files) {\n files.forEach(function (file) {\n if (/\\.js(\\?.*)?$/.test(file)) {\n jsSuites.push(file);\n }\n else if (/\\.html(\\?.*)?$/.test(file)) {\n htmlSuites.push(file);\n }\n else {\n throw new Error('Unknown resource type: ' + file);\n }\n });\n}\n/**\n * @return The child suites that should be loaded, ignoring\n * those that would not match `GREP`.\n */\nexport function activeChildSuites() {\n var subsuites = htmlSuites;\n if (GREP) {\n var cleanSubsuites = [];\n for (var i = 0, subsuite = void 0; subsuite = subsuites[i]; i++) {\n if (GREP.indexOf(util.cleanLocation(subsuite)) !== -1) {\n cleanSubsuites.push(subsuite);\n }\n }\n subsuites = cleanSubsuites;\n }\n return subsuites;\n}\n/**\n * Loads all `.js` sources requested by the current suite.\n */\nexport function loadJsSuites(_reporter, done) {\n util.debug('loadJsSuites', jsSuites);\n var loaders = jsSuites.map(function (file) {\n // We only support `.js` dependencies for now.\n return util.loadScript.bind(util, file);\n });\n util.parallel(loaders, done);\n}\nexport function runSuites(reporter, childSuites, done) {\n util.debug('runSuites');\n var suiteRunners = [\n // Run the local tests (if any) first, not stopping on error;\n _runMocha.bind(null, reporter),\n ];\n // As well as any sub suites. Again, don't stop on error.\n childSuites.forEach(function (file) {\n suiteRunners.push(function (next) {\n var childRunner = new ChildRunner(file, window);\n reporter.emit('childRunner start', childRunner);\n childRunner.run(function (error) {\n reporter.emit('childRunner end', childRunner);\n if (error)\n reporter.emitOutOfBandTest(file, error);\n next();\n });\n });\n });\n util.parallel(suiteRunners, config.get('numConcurrentSuites'), function (error) {\n reporter.done();\n done(error);\n });\n}\n/**\n * Kicks off a mocha run, waiting for frameworks to load if necessary.\n *\n * @param {!MultiReporter} reporter Where to send Mocha's events.\n * @param {function} done A callback fired, _no error is passed_.\n */\nfunction _runMocha(reporter, done, waited) {\n if (config.get('waitForFrameworks') && !waited) {\n var waitFor = (config.get('waitFor') || util.whenFrameworksReady).bind(window);\n waitFor(function () {\n _fixCustomElements();\n _runMocha(reporter, done, true);\n });\n return;\n }\n util.debug('_runMocha');\n var mocha = window.mocha;\n var Mocha = window.Mocha;\n mocha.reporter(reporter.childReporter(window.location));\n mocha.suite.title = reporter.suiteTitle(window.location);\n mocha.grep(GREP);\n // We can't use `mocha.run` because it bashes over grep, invert, and friends.\n // See https://github.com/visionmedia/mocha/blob/master/support/tail.js#L137\n var runner = Mocha.prototype.run.call(mocha, function (_error) {\n if (document.getElementById('mocha')) {\n Mocha.utils.highlightTags('code');\n }\n done(); // We ignore the Mocha failure count.\n });\n // Mocha's default `onerror` handling strips the stack (to support really old\n // browsers). We upgrade this to get better stacks for async errors.\n //\n // TODO(nevir): Can we expand support to other browsers?\n if (navigator.userAgent.match(/chrome/i)) {\n window.onerror = null;\n window.addEventListener('error', function (event) {\n if (!event.error)\n return;\n if (event.error.ignore)\n return;\n runner.uncaught(event.error);\n });\n }\n}\n/**\n * In Chrome57 custom elements in the document might not get upgraded when\n * there is a high GC\n * https://bugs.chromium.org/p/chromium/issues/detail?id=701601 We clone and\n * replace the ones that weren't upgraded.\n */\nfunction _fixCustomElements() {\n // Bail out if it is not Chrome 57.\n var raw = navigator.userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\n var isM57 = raw && raw[2] === '57';\n if (!isM57)\n return;\n var elements = document.body.querySelectorAll('*:not(script):not(style)');\n var constructors = {};\n for (var i = 0; i < elements.length; i++) {\n var el = elements[i];\n // This child has already been cloned and replaced by its parent, skip it!\n if (!el.isConnected)\n continue;\n var tag = el.localName;\n // Not a custom element!\n if (tag.indexOf('-') === -1)\n continue;\n // Memoize correct constructors.\n constructors[tag] =\n constructors[tag] || document.createElement(tag).constructor;\n // This one was correctly upgraded.\n if (el instanceof constructors[tag])\n continue;\n util.debug('_fixCustomElements: found non-upgraded custom element ' + el);\n var clone = document.importNode(el, true);\n el.parentNode.replaceChild(clone, el);\n }\n}\n","import ConsoleReporter from './reporters/console.js';\nimport HTMLReporter from './reporters/html.js';\nimport MultiReporter from './reporters/multi.js';\nimport TitleReporter from './reporters/title.js';\nimport * as suites from './suites.js';\nexport var htmlSuites = [];\nexport var jsSuites = [];\n/**\n * @param {CLISocket} socket The CLI socket, if present.\n * @param {MultiReporter} parent The parent reporter, if present.\n * @return {!Array.<!Mocha.reporters.Base} The reporters that should be used.\n */\nexport function determineReporters(socket, parent) {\n // Parents are greedy.\n if (parent) {\n return [parent.childReporter(window.location)];\n }\n // Otherwise, we get to run wild without any parental supervision!\n var reporters = [TitleReporter, ConsoleReporter];\n if (socket) {\n reporters.push(function (runner) {\n socket.observe(runner);\n });\n }\n if (suites.htmlSuites.length > 0 || suites.jsSuites.length > 0) {\n reporters.push(HTMLReporter);\n }\n return reporters;\n}\n/**\n * Yeah, hideous, but this allows us to be loaded before Mocha, which is handy.\n */\nexport function injectMocha(Mocha) {\n _injectPrototype(ConsoleReporter, Mocha.reporters.Base.prototype);\n _injectPrototype(HTMLReporter, Mocha.reporters.HTML.prototype);\n // Mocha doesn't expose its `EventEmitter` shim directly, so:\n _injectPrototype(MultiReporter, Object.getPrototypeOf(Mocha.Runner.prototype));\n}\nfunction _injectPrototype(klass, prototype) {\n var newPrototype = Object.create(prototype);\n // Only support\n Object.keys(klass.prototype).forEach(function (key) {\n newPrototype[key] = klass.prototype[key];\n });\n klass.prototype = newPrototype;\n}\n","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n * at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n * be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n * Google as part of the polymer project is also subject to an additional IP\n * rights grant found at http://polymer.github.io/PATENTS.txt\n */\nimport * as config from './config.js';\nimport * as reporters from './reporters.js';\nimport * as util from './util.js';\n/**\n * Loads all environment scripts ...synchronously ...after us.\n */\nexport function loadSync() {\n util.debug('Loading environment scripts:');\n var a11ySuiteScriptPath = 'web-component-tester/data/a11ySuite.js';\n var scripts = config.get('environmentScripts');\n var a11ySuiteWillBeLoaded = window.__generatedByWct || scripts.indexOf(a11ySuiteScriptPath) > -1;\n // We can't inject a11ySuite when running the npm version because it is a\n // module-based script that needs `<script type=module>` and compilation\n // for browsers without module support.\n if (!a11ySuiteWillBeLoaded && !window.__wctUseNpm) {\n // wct is running as a bower dependency, load a11ySuite from data/\n scripts.push(a11ySuiteScriptPath);\n }\n scripts.forEach(function (path) {\n var url = util.expandUrl(path, config.get('root'));\n util.debug('Loading environment script:', url);\n // Synchronous load.\n document.write('<script src=\"' + encodeURI(url) +\n '\"></script>'); // jshint ignore:line\n });\n util.debug('Environment scripts loaded');\n var imports = config.get('environmentImports');\n imports.forEach(function (path) {\n var url = util.expandUrl(path, config.get('root'));\n util.debug('Loading environment import:', url);\n // Synchronous load.\n document.write('<link rel=\"import\" href=\"' + encodeURI(url) +\n '\">'); // jshint ignore:line\n });\n util.debug('Environment imports loaded');\n}\n/**\n * We have some hard dependencies on things that should be loaded via\n * `environmentScripts`, so we assert that they're present here; and do any\n * post-facto setup.\n */\nexport function ensureDependenciesPresent() {\n _ensureMocha();\n _checkChai();\n}\nfunction _ensureMocha() {\n var Mocha = window.Mocha;\n if (!Mocha) {\n throw new Error('WCT requires Mocha. Please ensure that it is present in WCT.environmentScripts, or that you load it before loading web-component-tester/browser.js');\n }\n reporters.injectMocha(Mocha);\n // Magic loading of mocha's stylesheet\n var mochaPrefix = util.scriptPrefix('mocha.js');\n // only load mocha stylesheet for the test runner output\n // Not the end of the world, if it doesn't load.\n if (mochaPrefix && window.top === window.self) {\n util.loadStyle(mochaPrefix + 'mocha.css');\n }\n}\nfunction _checkChai() {\n if (!window.chai) {\n util.debug('Chai not present; not registering shorthands');\n return;\n }\n window.assert = window.chai.assert;\n window.expect = window.chai.expect;\n}\n","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n * at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n * be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n * Google as part of the polymer project is also subject to an additional IP\n * rights grant found at http://polymer.github.io/PATENTS.txt\n */\nimport * as config from '../config.js';\n// We may encounter errors during initialization (for example, syntax errors in\n// a test file). Hang onto those (and more) until we are ready to report them.\nexport var globalErrors = [];\n/**\n * Hook the environment to pick up on global errors.\n */\nexport function listenForErrors() {\n window.addEventListener('error', function (event) {\n globalErrors.push(event.error);\n });\n // Also, we treat `console.error` as a test failure. Unless you prefer not.\n var origConsole = console;\n var origError = console.error;\n console.error = function wctShimmedError() {\n origError.apply(origConsole, arguments);\n if (config.get('trackConsoleError')) {\n throw 'console.error: ' + Array.prototype.join.call(arguments, ' ');\n }\n };\n}\n","var interfaceExtensions = [];\n/**\n * Registers an extension that extends the global `Mocha` implementation\n * with new helper methods. These helper methods will be added to the `window`\n * when tests run for both BDD and TDD interfaces.\n */\nexport function extendInterfaces(helperName, helperFactory) {\n interfaceExtensions.push(function () {\n var Mocha = window.Mocha;\n // For all Mocha interfaces (probably just TDD and BDD):\n Object.keys(Mocha.interfaces)\n .forEach(function (interfaceName) {\n // This is the original callback that defines the interface (TDD or\n // BDD):\n var originalInterface = Mocha.interfaces[interfaceName];\n // This is the name of the \"teardown\" or \"afterEach\" property for the\n // current interface:\n var teardownProperty = interfaceName === 'tdd' ? 'teardown' : 'afterEach';\n // The original callback is monkey patched with a new one that appends\n // to the global context however we want it to:\n Mocha.interfaces[interfaceName] = function (suite) {\n // Call back to the original callback so that we get the base\n // interface:\n originalInterface.apply(this, arguments);\n // Register a listener so that we can further extend the base\n // interface:\n suite.on('pre-require', function (context, _file, _mocha) {\n // Capture a bound reference to the teardown function as a\n // convenience:\n var teardown = context[teardownProperty].bind(context);\n // Add our new helper to the testing context. The helper is\n // generated by a factory method that receives the context,\n // the teardown function and the interface name and returns\n // the new method to be added to that context:\n context[helperName] =\n helperFactory(context, teardown, interfaceName);\n });\n };\n });\n });\n}\n/**\n * Applies any registered interface extensions. The extensions will be applied\n * as many times as this function is called, so don't call it more than once.\n */\nexport function applyExtensions() {\n interfaceExtensions.forEach(function (applyExtension) {\n applyExtension();\n });\n}\n","import { extendInterfaces } from './extend.js';\nextendInterfaces('fixture', function (context, teardown) {\n // Return context.fixture if it is already a thing, for backwards\n // compatibility with `test-fixture-mocha.js`:\n return context.fixture || function fixture(fixtureId, model) {\n // Automatically register a teardown callback that will restore the\n // test-fixture:\n teardown(function () {\n document.getElementById(fixtureId).restore();\n });\n // Find the test-fixture with the provided ID and create it, returning\n // the results:\n return document.getElementById(fixtureId).create(model);\n };\n});\n","import { extendInterfaces } from './extend.js';\n/**\n * stub\n *\n * The stub addon allows the tester to partially replace the implementation of\n * an element with some custom implementation. Usage example:\n *\n * beforeEach(function() {\n * stub('x-foo', {\n * attached: function() {\n * // Custom implementation of the `attached` method of element `x-foo`..\n * },\n * otherMethod: function() {\n * // More custom implementation..\n * },\n * getterSetterProperty: {\n * get: function() {\n * // Custom getter implementation..\n * },\n * set: function() {\n * // Custom setter implementation..\n * }\n * },\n * // etc..\n * });\n * });\n */\nextendInterfaces('stub', function (_context, teardown) {\n return function stub(tagName, implementation) {\n // Find the prototype of the element being stubbed:\n var proto = document.createElement(tagName).constructor.prototype;\n // For all keys in the implementation to stub with..\n var stubs = Object.keys(implementation).map(function (key) {\n // Stub the method on the element prototype with Sinon:\n return sinon.stub(proto, key, implementation[key]);\n });\n // After all tests..\n teardown(function () {\n stubs.forEach(function (stub) {\n stub.restore();\n });\n });\n };\n});\n","import { extendInterfaces } from './extend.js';\n// replacement map stores what should be\nvar replacements = {};\nvar replaceTeardownAttached = false;\n/**\n * replace\n *\n * The replace addon allows the tester to replace all usages of one element with\n * another element within all Polymer elements created within the time span of\n * the test. Usage example:\n *\n * beforeEach(function() {\n * replace('x-foo').with('x-fake-foo');\n * });\n *\n * All annotations and attributes will be set on the placement element the way\n * they were set for the original element.\n */\nextendInterfaces('replace', function (_context, teardown) {\n return function replace(oldTagName) {\n return {\n with: function (tagName) {\n // Standardizes our replacements map\n oldTagName = oldTagName.toLowerCase();\n tagName = tagName.toLowerCase();\n replacements[oldTagName] = tagName;\n // If the function is already a stub, restore it to original\n if (document.importNode.isSinonProxy) {\n return;\n }\n if (!window.Polymer.Element) {\n window.Polymer.Element = function () { };\n window.Polymer.Element.prototype._stampTemplate = function () { };\n }\n // Keep a reference to the original `document.importNode`\n // implementation for later:\n var originalImportNode = document.importNode;\n // Use Sinon to stub `document.ImportNode`:\n sinon.stub(document, 'importNode', function (origContent, deep) {\n var templateClone = document.createElement('template');\n var content = templateClone.content;\n var inertDoc = content.ownerDocument;\n // imports node from inertDoc which holds inert nodes.\n templateClone.content.appendChild(inertDoc.importNode(origContent, true));\n // optional arguments are not optional on IE.\n var nodeIterator = document.createNodeIterator(content, NodeFilter.SHOW_ELEMENT, null, true);\n var node;\n // Traverses the tree. A recently-replaced node will be put next,\n // so if a node is replaced, it will be checked if it needs to be\n // replaced again.\n while (node = nodeIterator.nextNode()) {\n var currentTagName = node.tagName.toLowerCase();\n if (replacements.hasOwnProperty(currentTagName)) {\n currentTagName = replacements[currentTagName];\n // find the final tag name.\n while (replacements[currentTagName]) {\n currentTagName = replacements[currentTagName];\n }\n // Create a replacement:\n var replacement = document.createElement(currentTagName);\n // For all attributes in the original node..\n for (var index = 0; index < node.attributes.length; ++index) {\n // Set that attribute on the replacement:\n replacement.setAttribute(node.attributes[index].name, node.attributes[index].value);\n }\n // Replace the original node with the replacement node:\n node.parentNode.replaceChild(replacement, node);\n }\n }\n return originalImportNode.call(this, content, deep);\n });\n if (!replaceTeardownAttached) {\n // After each test...\n teardown(function () {\n replaceTeardownAttached = true;\n // Restore the stubbed version of `document.importNode`:\n var documentImportNode = document.importNode;\n if (documentImportNode.isSinonProxy) {\n documentImportNode.restore();\n }\n // Empty the replacement map\n replacements = {};\n });\n }\n }\n };\n };\n});\n","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n * at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n * be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n * Google as part of the polymer project is also subject to an additional IP\n * rights grant found at http://polymer.github.io/PATENTS.txt\n */\nimport './mocha/fixture.js';\nimport './mocha/stub.js';\nimport './mocha/replace.js';\nimport * as config from './config.js';\nimport { applyExtensions } from './mocha/extend.js';\n// Mocha global helpers, broken out by testing method.\n//\n// Keys are the method for a particular interface; values are their analog in\n// the opposite interface.\nvar MOCHA_EXPORTS = {\n // https://github.com/visionmedia/mocha/blob/master/lib/interfaces/tdd.js\n tdd: {\n 'setup': '\"before\"',\n 'teardown': '\"after\"',\n 'suiteSetup': '\"beforeEach\"',\n 'suiteTeardown': '\"afterEach\"',\n 'suite': '\"describe\" or \"context\"',\n 'test': '\"it\" or \"specify\"',\n },\n // https://github.com/visionmedia/mocha/blob/master/lib/interfaces/bdd.js\n bdd: {\n 'before': '\"setup\"',\n 'after': '\"teardown\"',\n 'beforeEach': '\"suiteSetup\"',\n 'afterEach': '\"suiteTeardown\"',\n 'describe': '\"suite\"',\n 'context': '\"suite\"',\n 'xdescribe': '\"suite.skip\"',\n 'xcontext': '\"suite.skip\"',\n 'it': '\"test\"',\n 'xit': '\"test.skip\"',\n 'specify': '\"test\"',\n 'xspecify': '\"test.skip\"',\n },\n};\n/**\n * Exposes all Mocha methods up front, configuring and running mocha\n * automatically when you call them.\n *\n * The assumption is that it is a one-off (sub-)suite of tests being run.\n */\nexport function stubInterfaces() {\n var keys = Object.keys(MOCHA_EXPORTS);\n keys.forEach(function (ui) {\n Object.keys(MOCHA_EXPORTS[ui]).forEach(function (key) {\n window[key] = function wrappedMochaFunction() {\n _setupMocha(ui, key, MOCHA_EXPORTS[ui][key]);\n if (!window[key] || window[key] === wrappedMochaFunction) {\n throw new Error('Expected mocha.setup to define ' + key);\n }\n window[key].apply(window, arguments);\n };\n });\n });\n}\n// Whether we've called `mocha.setup`\nvar _mochaIsSetup = false;\n/**\n * @param {string} ui Sets up mocha to run `ui`-style tests.\n * @param {string} key The method called that triggered this.\n * @param {string} alternate The matching method in the opposite interface.\n */\nfunction _setupMocha(ui, key, alternate) {\n var mochaOptions = config.get('mochaOptions');\n if (mochaOptions.ui && mochaOptions.ui !== ui) {\n var message = 'Mixing ' + mochaOptions.ui + ' and ' + ui +\n ' Mocha styles is not supported. ' +\n 'You called \"' + key + '\". Did you mean ' + alternate + '?';\n throw new Error(message);\n }\n if (_mochaIsSetup) {\n return;\n }\n applyExtensions();\n mochaOptions.ui = ui;\n mocha.setup(mochaOptions); // Note that the reporter is configured in run.js.\n}\n","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n * at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n * be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n * Google as part of the polymer project is also subject to an additional IP\n * rights grant found at http://polymer.github.io/PATENTS.txt\n */\n/**\n * This file is the entry point into `web-component-tester`'s browser client.\n */\n// Registers a bunch of globals:\nimport './environment/helpers.js';\nimport ChildRunner from './childrunner.js';\nimport CLISocket from './clisocket.js';\nimport * as config from './config.js';\nimport * as environment from './environment.js';\nimport * as errors from './environment/errors.js';\nimport * as mocha from './mocha.js';\nimport * as reporters from './reporters.js';\nimport MultiReporter from './reporters/multi.js';\nimport * as suites from './suites.js';\nimport * as util from './util.js';\n// You can configure WCT before it has loaded by assigning your custom\n// configuration to the global `WCT`.\nconfig.setup(window.WCT);\n// Maybe some day we'll expose WCT as a module to whatever module registry you\n// are using (aka the UMD approach), or as an es6 module.\nvar WCT = window.WCT = {\n // A generic place to hang data about the current suite. This object is\n // reported\n // back via the `sub-suite-start` and `sub-suite-end` events.\n share: {},\n // Until then, we get to rely on it to expose parent runners to their\n // children.\n _ChildRunner: ChildRunner,\n _reporter: undefined,\n _config: config._config,\n // Public API\n /**\n * Loads suites of tests, supporting both `.js` and `.html` files.\n *\n * @param {!Array.<string>} files The files to load.\n */\n loadSuites: suites.loadSuites,\n};\n// Load Process\nerrors.listenForErrors();\nmocha.stubInterfaces();\nenvironment.loadSync();\n// Give any scripts on the page a chance to declare tests and muck with things.\ndocument.addEventListener('DOMContentLoaded', function () {\n util.debug('DOMContentLoaded');\n environment.ensureDependenciesPresent();\n // We need the socket built prior to building its reporter.\n CLISocket.init(function (error, socket) {\n if (error)\n throw error;\n // Are we a child of another run?\n var current = ChildRunner.current();\n var parent = current && current.parentScope.WCT._reporter;\n util.debug('parentReporter:', parent);\n var childSuites = suites.activeChildSuites();\n var reportersToUse = reporters.determineReporters(socket, parent);\n // +1 for any local tests.\n var reporter = new MultiReporter(childSuites.length + 1, reportersToUse, parent);\n WCT._reporter = reporter; // For environment/compatibility.js\n // We need the reporter so that we can report errors during load.\n suites.loadJsSuites(reporter, function (error) {\n // Let our parent know that we're about to start the tests.\n if (current)\n current.ready(error);\n if (error)\n throw error;\n // Emit any errors we've encountered up til now\n errors.globalErrors.forEach(function onError(error) {\n reporter.emitOutOfBandTest('Test Suite Initialization', error);\n });\n suites.runSuites(reporter, childSuites, function (error) {\n // Make sure to let our parent know that we're done.\n if (current)\n current.done();\n if (error)\n throw error;\n });\n });\n });\n});\n"],"names":["util.basePath","util.scriptPrefix","config.get","util.debug","util.paramsToQuery","util.getParams","util.mergeParams","util.parseUrl","util.loadScript","util.getParam","console","util.pluralizedStat","util.cleanLocation","util.relativeLocation","htmlSuites","jsSuites","util.parallel","util.whenFrameworksReady","HTMLReporter","suites.jsSuites","suites.htmlSuites","ConsoleReporter","TitleReporter","util.expandUrl","util.loadStyle","reporters.injectMocha","config.setup","suites.loadSuites","config._config","errors.listenForErrors","mocha.stubInterfaces","environment.loadSync","suites.runSuites","errors.globalErrors","suites.loadJsSuites","reporters.determineReporters","suites.activeChildSuites","environment.ensureDependenciesPresent"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;AAWA,IAAI,iBAAiB,GAAG,MAAM,CAAC,WAAW,CAAC;AAC3C,IAAI,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAAC;AACzC,IAAI,2BAA2B,GAAG,MAAM,CAAC,qBAAqB,CAAC;;;;;;;;AAQ/D,SAAS,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE;IAChC,IAAI,GAAG,CAAC;IACR,IAAI;QACA,MAAM,EAAE,CAAC;KACZ;IACD,OAAO,KAAK,EAAE;QACV,GAAG,GAAG,KAAK,CAAC;KACf;IACD,QAAQ,CAAC,GAAG,CAAC,CAAC;CACjB;;;;;;;;;;;;;AAaD,SAAS,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE;IACjC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;QACnB,OAAO,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;KAC3C;IACD,IAAI,GAAG,CAAC;IACR,IAAI;QACA,MAAM,EAAE,CAAC;KACZ;IACD,OAAO,KAAK,EAAE;QACV,GAAG,GAAG,KAAK,CAAC;KACf;IACD,IAAI,CAAC,IAAI,EAAE,UAAU,IAAI,EAAE;QACvB,IAAI,CAAC,GAAG,CAAC,CAAC;KACb,CAAC,CAAC;CACN;;;;;;;AAOD,SAAS,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE;IACtC,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,GAAG,CAAC;IACR,IAAI,CAAC,IAAI,EAAE,UAAU,IAAI,EAAE;QACvB,IAAI,UAAU,GAAG,iBAAiB,CAAC,YAAY;YAC3C,IAAI,CAAC,YAAY;gBACb,OAAO;YACX,aAAa,CAAC,UAAU,CAAC,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,CAAC;SACb,EAAE,EAAE,CAAC,CAAC;KACV,CAAC,CAAC;IACH,IAAI;QACA,MAAM,CAAC,UAAU,KAAK,EAAE;YACpB,IAAI,KAAK;gBACL,GAAG,GAAG,KAAK,CAAC;YAChB,YAAY,GAAG,IAAI,CAAC;SACvB,CAAC,CAAC;KACN;IACD,OAAO,KAAK,EAAE;QACV,GAAG,GAAG,KAAK,CAAC;QACZ,YAAY,GAAG,IAAI,CAAC;KACvB;CACJ;;;;;;;AAOD,SAAS,KAAK,CAAC,QAAQ,EAAE;;;;;;;IAOrB,IAAI,IAAI,GAAG,SAAS,IAAI,GAAG;QACvB,QAAQ,EAAE,CAAC;KACd,CAAC;;;IAGF,IAAI,IAAI,GAAG,SAAS,CAAC,OAAO,KAAK,6BAA6B,CAAC;IAC/D,IAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,0BAA0B,EAAE;QACvE,IAAI,YAAY,GAAG,IAAI,CAAC;QACxB,IAAI,GAAG,SAAS,MAAM,GAAG;YACrB,QAAQ,CAAC,0BAA0B,EAAE,CAAC;YACtC,gBAAgB,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;SACrC,CAAC;KACL;;IAED,IAAI,KAAK,CAAC;IACV,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE;QAClE,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;KAC9B;SACI,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE;QAC7C,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC;KAC1B;SACI,IAAI,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE;QACzD,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;KAChC;IACD,IAAI,KAAK,EAAE;QACP,KAAK,CAAC,KAAK,EAAE,CAAC;KACjB;;;IAGD,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;CAC7B;;;;;;;AAOD,SAAS,mBAAmB,CAAC,QAAQ,EAAE;IACnC,KAAK,CAAC,YAAY;QACd,2BAA2B,CAAC,YAAY;YACpC,KAAK,CAAC,QAAQ,CAAC,CAAC;SACnB,CAAC,CAAC;KACN,CAAC,CAAC;CACN;;;;;AAKD,SAAS,kBAAkB,CAAC,QAAQ,EAAE;IAClC,OAAO,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;IACpF,OAAO,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;CACjC;;;;AAID,SAAS,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,WAAW,EAAE;IACnE,WAAW,GAAG,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;IAC5D,oBAAoB,GAAG,oBAAoB,IAAI,EAAE,CAAC;IAClD,IAAI;QACA,EAAE,EAAE,CAAC;KACR;IACD,OAAO,CAAC,EAAE;QACN,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,EAAE;YAC1B,MAAM,CAAC,CAAC;SACX;aACI;YACD,IAAI,OAAO,oBAAoB,KAAK,QAAQ,EAAE;gBAC1C,oBAAoB,CAAC,UAAU,CAAC,oBAAoB,EAAE,YAAY;oBAC9D,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;iBACjE,CAAC,CAAC;aACN;iBACI;gBACD,gBAAgB,CAAC,YAAY;oBACzB,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;iBACjE,EAAE,oBAAoB,CAAC,CAAC;aAC5B;YACD,OAAO;SACV;KACJ;IACD,IAAI,EAAE,CAAC;CACV;AACD,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC3B,MAAM,CAAC,aAAa,GAAG,aAAa,CAAC;AACrC,MAAM,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;AAC/C,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;AACrB,MAAM,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;AACjD,MAAM,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;AAC/C,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;;AC/KzB;;;AAGA,AAAO,IAAI,OAAO,GAAG;IACjB,kBAAkB,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW;QACpC;YACI,mBAAmB,EAAE,oBAAoB,EAAE,iBAAiB;YAC5D,gBAAgB,EAAE,cAAc,EAAE,2BAA2B;YAC7D,8BAA8B;YAC9B,sDAAsD;YACtD,uCAAuC;SAC1C;QACD;YACI,mBAAmB,EAAE,oBAAoB,EAAE,kBAAkB;YAC7D,gBAAgB,EAAE,cAAc,EAAE,kBAAkB;YACpD,8BAA8B;YAC9B,sDAAsD;SACzD;IACL,kBAAkB,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,GAAG,EAAE;QACzC,CAAC,gCAAgC,CAAC;IACtC,IAAI,EAAE,IAAI;IACV,iBAAiB,EAAE,IAAI;IACvB,OAAO,EAAE,IAAI;IACb,mBAAmB,EAAE,CAAC;IACtB,iBAAiB,EAAE,IAAI;IACvB,YAAY,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE;IACpC,OAAO,EAAE,KAAK;CACjB,CAAC;;;;;;;AAOF,AAAO,SAAS,KAAK,CAAC,OAAO,EAAE;IAC3B,IAAI,WAAW,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;IACxC,IAAI,WAAW,EAAE;QACb,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;;QAEzD,OAAO,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;KAClC;IACD,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;QACxC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;KAChC;IACD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;;QAEf,IAAI,IAAI,GAAGC,YAAiB,CAAC,YAAY,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,GAAGD,QAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YACf,MAAM,IAAI,KAAK,CAAC,4FAA4F,CAAC,CAAC;SACjH;KACJ;CACJ;;;;AAID,AAAO,SAAS,GAAG,CAAC,GAAG,EAAE;IACrB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;CACvB;;AAED,SAAS,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE;IAChC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,GAAG,EAAE;QACvC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ;YACvD,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;YAC7B,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;SACxC;aACI;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;SAC7B;KACJ,CAAC,CAAC;CACN;;ACvED;;;;AAIA,AAAO,SAAS,mBAAmB,CAAC,QAAQ,EAAE;IAC1C,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC7B,IAAI,IAAI,GAAG,YAAY;QACnB,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAClC,QAAQ,EAAE,CAAC;KACd,CAAC;;IAEF,IAAI,MAAM,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE;QACrD,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC7B,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,SAAS,OAAO,GAAG;YAC7D,MAAM,CAAC,mBAAmB,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;YAC1D,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAC5B,IAAI,EAAE,CAAC;SACV,CAAC,CAAC;KACN;SACI;QACD,IAAI,EAAE,CAAC;KACV;CACJ;;;;AAID,AAAO,SAAS,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE;IACxC,IAAI,KAAK,KAAK,CAAC,EAAE;QACb,OAAO,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,OAAO,CAAC;KACvC;SACI;QACD,OAAO,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,QAAQ,CAAC;KACxC;CACJ;;;;;AAKD,AAAO,SAAS,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE;IACnC,IAAI,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC;IAClB,IAAI,IAAI,EAAE;QACN,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,wBAAwB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;KAC3E;IACD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;CACrC;;;;;AAKD,AAAO,SAAS,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE;IAClC,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC;IACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACjB,IAAI,IAAI,EAAE;QACN,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,4BAA4B,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;KAC5E;IACD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;CACnC;;;;;AAKD,AAAO,SAAS,KAAK,GAAG;IACpB,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE;QAC1C,QAAQ,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;KAChC;IACD,IAAI,CAACE,GAAU,CAAC,SAAS,CAAC,EAAE;QACxB,OAAO;KACV;IACD,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;CACvD;;;;;;AAMD,AAAO,SAAS,QAAQ,CAAC,GAAG,EAAE;IAC1B,IAAI,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC5C,OAAO;QACH,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QACd,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;KACpC,CAAC;CACL;;;;;;;;AAQD,AAAO,SAAS,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE;IACjC,IAAI,CAAC,IAAI;QACL,OAAO,GAAG,CAAC;IACf,IAAI,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC;QAC9B,OAAO,GAAG,CAAC;IACf,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE;QACtC,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;KACrB;IACD,OAAO,IAAI,GAAG,GAAG,CAAC;CACrB;;;;;AAKD,AAAO,SAAS,SAAS,CAAC,KAAK,EAAE;IAC7B,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IACnE,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,EAAE;QAC/B,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;KAC9B;;IAED,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;QACzB,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;KAChD;IACD,IAAI,KAAK,KAAK,EAAE;QACZ,OAAO,EAAE,CAAC;IACd,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE;QACrC,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YACnB,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAC;YAC9C,OAAO;SACV;QACD,IAAI,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACd,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;SACpB;QACD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC3B,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;CACjB;;;;;;;AAOD,AAAO,SAAS,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE;IACxC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,GAAG,EAAE;QACvC,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE;YAClB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;SACpB;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;KACjD,CAAC,CAAC;CACN;;;;;AAKD,AAAO,SAAS,QAAQ,CAAC,KAAK,EAAE;IAC5B,IAAI,MAAM,GAAG,SAAS,EAAE,CAAC;IACzB,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;CAClD;;;;;AAKD,AAAO,SAAS,aAAa,CAAC,MAAM,EAAE;IAClC,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,GAAG,EAAE;QACvC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,KAAK,EAAE;YACjC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;SACzE,CAAC,CAAC;KACN,CAAC,CAAC;IACH,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;CAC5D;AACD,SAAS,WAAW,CAAC,QAAQ,EAAE;IAC3B,OAAO,OAAO,QAAQ,KAAK,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;CACtE;AACD,AAAO,SAAS,QAAQ,CAAC,QAAQ,EAAE;IAC/B,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;CAClD;AACD,AAAO,SAAS,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE;IACjD,IAAI,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QAC9B,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;KAC1C;IACD,OAAO,IAAI,CAAC;CACf;AACD,AAAO,SAAS,aAAa,CAAC,QAAQ,EAAE;IACpC,IAAI,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,aAAa,EAAE;QACnC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;KAC1C;IACD,OAAO,IAAI,CAAC;CACf;AACD,AAAO,SAAS,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE;IAChD,IAAI,KAAK,CAAC;IACV,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;QAChC,IAAI,GAAG,UAAU,CAAC;QAClB,KAAK,GAAG,CAAC,CAAC;KACb;SACI;QACD,KAAK,GAAG,UAAU,CAAC;KACtB;IACD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;QACjB,OAAO,IAAI,EAAE,CAAC;KACjB;IACD,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAC3B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,SAAS,UAAU,CAAC,KAAK,EAAE;QACvB,IAAI,MAAM,EAAE;YACR,OAAO;SACV;QACD,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC;QACtB,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;QAC1B,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,EAAE;YAC3B,MAAM,GAAG,IAAI,CAAC;YACd,IAAI,CAAC,KAAK,CAAC,CAAC;SACf;aACI;YACD,MAAM,EAAE,CAAC;SACZ;KACJ;IACD,SAAS,MAAM,GAAG;QACd,IAAI,KAAK,IAAI,SAAS,IAAI,KAAK,EAAE;YAC7B,OAAO;SACV;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACjB,OAAO;SACV;QACD,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;QAC1B,OAAO,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,CAAC;KAC/B;IACD,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3B;;;;;;;AAOD,AAAO,SAAS,YAAY,CAAC,QAAQ,EAAE;IACnC,IAAI,OAAO,GAAG,QAAQ,CAAC,gBAAgB,CAAC,eAAe,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC3E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;QACtB,OAAO,IAAI,CAAC;KACf;IACD,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5B,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;CACxD;;;ACtPD;;;;AAIA,IAAI,WAAW,iBAAiB,CAAC,YAAY;IACzC,SAAS,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE;QACnC,IAAI,OAAO,GAAGK,QAAa,CAAC,GAAG,CAAC,CAAC;QACjCD,WAAgB,CAAC,OAAO,CAAC,MAAM,EAAED,SAAc,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9E,OAAO,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC;QACrC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,IAAI,GAAGD,aAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC;KAC/B;;;;;IAKD,WAAW,CAAC,OAAO,GAAG,YAAY;QAC9B,OAAO,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;KAClC,CAAC;;;;;;IAMF,WAAW,CAAC,GAAG,GAAG,UAAU,MAAM,EAAE,SAAS,EAAE;QAC3C,IAAI,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,WAAW,EAAE;YACb,OAAO,WAAW,CAAC;SACtB;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE;YAC1B,IAAI,SAAS,EAAE;gBACX,OAAO,CAAC,IAAI,CAAC,2GAA2G,CAAC,CAAC;gBAC1H,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;aAC5B;YACD,OAAO,IAAI,CAAC;SACf;;QAED,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;KAC3D,CAAC;;;;;;IAMF,WAAW,CAAC,SAAS,CAAC,GAAG,GAAG,UAAU,IAAI,EAAE;QACxCD,KAAU,CAAC,iBAAiB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,EAAE;YACZ,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC1C,SAAS,CAAC,EAAE,GAAG,WAAW,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;SACxC;QACD,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;QAEnC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QAC3B,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;QACzH,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,0BAA0B,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChH,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;KAChG,CAAC;;;;;;IAMF,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,UAAU,KAAK,EAAE;QAC5CA,KAAU,CAAC,oBAAoB,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;;QAElD,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE;YAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;SACpD;QACD,IAAI,KAAK,EAAE;YACP,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;SACf;KACJ,CAAC;;;;;;;IAOF,WAAW,CAAC,SAAS,CAAC,KAAK,GAAG,UAAU,KAAK,EAAE;QAC3CA,KAAU,CAAC,mBAAmB,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,SAAS,EAAE;YAChB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAChC;QACD,IAAI,KAAK,EAAE;YACP,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;SACf;KACJ,CAAC;;;;IAIF,WAAW,CAAC,SAAS,CAAC,IAAI,GAAG,YAAY;QACrCA,KAAU,CAAC,kBAAkB,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;;QAEpD,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,MAAM;YACZ,OAAO;;;QAGX,UAAU,CAAC,YAAY;YACnB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;SACtB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;KACpB,CAAC;IACF,WAAW,CAAC,SAAS,CAAC,iBAAiB,GAAG,UAAU,KAAK,EAAE;QACvD,IAAI,CAAC,IAAI,CAAC,aAAa;YACnB,OAAO;QACX,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;QACxB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;KAC7B,CAAC;;IAEF,WAAW,CAAC,WAAW,GAAG,KAAK,CAAC;;;IAGhC,WAAW,CAAC,MAAM,GAAG,EAAE,CAAC;IACxB,OAAO,WAAW,CAAC;CACtB,EAAE,CAAC,CAAC;;AC/HL,IAAI,iBAAiB,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC/E,IAAI,gBAAgB,GAAG,iBAAiB,GAAG,yBAAyB,CAAC;;;;;;;AAOrE,IAAI,SAAS,iBAAiB,CAAC,YAAY;IACvC,SAAS,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE;QAClC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;KACxB;;;;;IAKD,SAAS,CAAC,SAAS,CAAC,OAAO,GAAG,UAAU,MAAM,EAAE;QAC5C,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE;YAC5B,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE;SAClC,CAAC,CAAC;;;;;;;QAOH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,IAAI,EAAE;YAC9B,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAC5D,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,IAAI,EAAE;YAClC,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE;gBACxB,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC;gBACrB,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,KAAK,EAAE,IAAI,CAAC,GAAG;aAClB,CAAC,CAAC;SACN,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,IAAI,EAAE,GAAG,EAAE;;YAEnC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE;gBACtB,KAAK,CAAC,SAAS,CAAC,cAAc,EAAE,yCAAyC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;aAC1F;SACJ,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,mBAAmB,EAAE,UAAU,WAAW,EAAE;YAClD,KAAK,CAAC,SAAS,CAAC,iBAAiB,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;SACzD,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,iBAAiB,EAAE,UAAU,WAAW,EAAE;YAChD,KAAK,CAAC,SAAS,CAAC,eAAe,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;SACvD,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY;YACzB,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;SAClC,CAAC,CAAC;KACN,CAAC;;;;;IAKF,SAAS,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,KAAK,EAAE,IAAI,EAAE;QACnD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,IAAI;SACb,CAAC,CAAC;KACN,CAAC;;;;;;;IAOF,SAAS,CAAC,IAAI,GAAG,UAAU,IAAI,EAAE;QAC7B,IAAI,SAAS,GAAGM,QAAa,CAAC,gBAAgB,CAAC,CAAC;QAChD,IAAI,CAAC,SAAS;YACV,OAAO,IAAI,EAAE,CAAC;;QAElB,IAAI,WAAW,CAAC,OAAO,EAAE;YACrB,OAAO,IAAI,EAAE,CAAC;QAClBD,UAAe,CAAC,gBAAgB,EAAE,UAAU,KAAK,EAAE;YAC/C,IAAI,KAAK;gBACL,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,IAAI,MAAM,GAAG,EAAE,CAAC,iBAAiB,CAAC,CAAC;YACnC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,EAAE;gBAChC,MAAM,CAAC,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,KAAK,CAAC,CAAC;aACf,CAAC,CAAC;YACH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY;gBAC7B,MAAM,CAAC,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;aAChD,CAAC,CAAC;SACN,CAAC,CAAC;KACN,CAAC;IACF,OAAO,SAAS,CAAC;CACpB,EAAE,CAAC,CAAC;AACL,AACA;;;;;AAKA,SAAS,SAAS,CAAC,QAAQ,EAAE;IACzB,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,OAAO,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE;QACjD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/B,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;KAC9B;IACD,OAAO,MAAM,CAAC;CACjB;;;;;AAKD,SAAS,QAAQ,CAAC,QAAQ,EAAE;IACxB,IAAI,QAAQ,CAAC,KAAK,KAAK,QAAQ,EAAE;QAC7B,OAAO,SAAS,CAAC;KACpB;SACI,IAAI,QAAQ,CAAC,KAAK,KAAK,QAAQ,EAAE;QAClC,OAAO,SAAS,CAAC;KACpB;SACI,IAAI,QAAQ,CAAC,OAAO,EAAE;QACvB,OAAO,SAAS,CAAC;KACpB;SACI;QACD,OAAO,SAAS,CAAC;KACpB;CACJ;;AC/HD;;AAEA,IAAIE,SAAO,GAAG,MAAM,CAAC,OAAO,CAAC;AAC7B,IAAI,IAAI,GAAG,yEAAyE,CAAC;AACrF,IAAI,MAAM,GAAG;IACT,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAC9B,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAChC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAChC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAChC,KAAK,EAAE,gBAAgB;IACvB,OAAO,EAAE,IAAI,GAAG,iBAAiB;CACpC,CAAC;;AAEF,IAAI,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;AAClD,IAAI,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC5E,IAAI,eAAe,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;;AAEhD,IAAI,SAAS,GAAG,EAAE,CAAC;AACnB,SAAS,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;IACtB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;SAClB,GAAG,CAAC,UAAU,CAAC,EAAE;QAClB,OAAO,SAAS,GAAG,CAAC,CAAC;KACxB,CAAC;SACG,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,IAAI,aAAa,EAAE;QACfA,SAAO,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;KAC3D;SACI;QACDA,SAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KACrB;CACJ;AACD,SAAS,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE;IAC3B,IAAI,eAAe,EAAE;QACjBA,SAAO,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;KAC7D;SACI,IAAIA,SAAO,CAAC,KAAK,EAAE;QACpBA,SAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;KACvB;SACI;QACD,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC;QAC7B,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;KACpB;CACJ;AACD,SAAS,WAAW,GAAG;IACnB,IAAIA,SAAO,CAAC,QAAQ,EAAE;QAClBA,SAAO,CAAC,QAAQ,EAAE,CAAC;KACtB;SACI;QACD,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;KACzD;CACJ;AACD,SAAS,YAAY,CAAC,KAAK,EAAE;IACzB,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;CAC9D;;;;AAID,IAAI,OAAO,iBAAiB,CAAC,YAAY;;;;IAIrC,SAAS,OAAO,CAAC,MAAM,EAAE;QACrB,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,EAAE;YAChC,IAAI,KAAK,CAAC,IAAI,EAAE;gBACZ,OAAO;aACV;YACD,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;SAClC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACd,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,UAAU,KAAK,EAAE;YACpC,IAAI,KAAK,CAAC,IAAI,EAAE;gBACZ,OAAO;aACV;YACD,WAAW,EAAE,CAAC;SACjB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACd,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,IAAI,EAAE;YAC9B,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;SAChC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACd,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,IAAI,EAAE;YACjC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;SACnC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACd,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,EAAE,KAAK,EAAE;YACtC,YAAY,CAAC,KAAK,CAAC,CAAC;SACvB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACd,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,EAAE;YACnC,WAAW,EAAE,CAAC;SACjB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACd,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;KAChD;;IAED,OAAO,CAAC,SAAS,CAAC,UAAU,GAAG,YAAY;QACvC,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE;YACzB,GAAG,CAACC,cAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;SACvE;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE;YACxB,GAAG,CAACA,cAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;SACtE;QACD,GAAG,CAACA,cAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YACtB,GAAG,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;SACvC;QACD,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,YAAY;YAC9C,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC;QACjC,WAAW,EAAE,CAAC;KACjB,CAAC;IACF,OAAO,OAAO,CAAC;CAClB,EAAE,CAAC,CAAC;;ACxHL;;;;;;;;;;;;;;;AAeA,AAAe,SAAS,IAAI,CAAC,MAAM,EAAE;IACjC,IAAI,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC;IACpB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,EAAE;QAChC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;KAC7B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACd,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;CAC3C;;;AAGD,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAC5C,KAAK,CAAC,WAAW,GAAG,2wBAA2wB,CAAC;AAChyB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;;ACjBjC,IAAI,aAAa,GAAG;IAChB,MAAM,EAAE,IAAI;IACZ,aAAa,EAAE;QACX,oBAAoB;QACpB,OAAO;KACV;IACD,MAAM,EAAE,UAAU,IAAI,EAAE;QACpB,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;KAC1E;CACJ,CAAC;;AAEF,IAAI,YAAY,GAAG;IACf,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU;IAC5E,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB;CAC/C,CAAC;;AAEF,IAAI,yBAAyB,GAAG,CAAC,CAAC;;;;AAIlC,IAAI,aAAa,iBAAiB,CAAC,YAAY;;;;;;;;IAQ3C,SAAS,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE;QACjD,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,QAAQ,EAAE;YAC/C,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;SAC9B,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,MAAM,CAAC,QAAQ,IAAIX,QAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5E,IAAI,CAAC,KAAK,GAAG,SAAS,GAAG,yBAAyB,CAAC;;;QAGnD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;;QAE1B,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KACtB;;;;;;IAMD,aAAa,CAAC,SAAS,CAAC,aAAa,GAAG,UAAU,QAAQ,EAAE;QACxD,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;;;QAGrC,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,OAAO,EAAE,iBAAiB,CAAC,YAAY;gBAC/B,SAAS,aAAa,CAAC,MAAM,EAAE;oBAC3B,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;oBAC1B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;iBAChC;gBACD,OAAO,aAAa,CAAC;aACxB,EAAE,CAAC;YACJ,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI;YACtB,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;KACV,CAAC;;IAEF,aAAa,CAAC,SAAS,CAAC,IAAI,GAAG,YAAY;QACvC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACpB,CAAC;;;;;;;;;;;;;;IAcF,aAAa,CAAC,SAAS,CAAC,iBAAiB,GAAG,UAAU,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE;QACvFG,KAAU,CAAC,kCAAkC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QAC/D,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;QAC7C,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACzC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;QACjB,IAAI,CAAC,SAAS,EAAE;YACZ,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,yBAAyB,CAAC;SACvD;QACD,IAAI,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE;YACP,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;SAChD;aACI;YACD,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;SACzC;QACD,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;KAClC,CAAC;;;;;IAKF,aAAa,CAAC,SAAS,CAAC,UAAU,GAAG,UAAU,QAAQ,EAAE;QACrD,IAAI,IAAI,GAAGU,gBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1D,IAAI,GAAGD,aAAkB,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;KACf,CAAC;;;IAGF,aAAa,CAAC,SAAS,CAAC,eAAe,GAAG,UAAU,MAAM,EAAE;QACxD,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,YAAY,CAAC,OAAO,CAAC,UAAU,SAAS,EAAE;YACtC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;SACzE,CAAC,CAAC;KACN,CAAC;;;;;;;;IAQF,aAAa,CAAC,SAAS,CAAC,UAAU,GAAG,UAAU,SAAS,EAAE,MAAM,EAAE;QAC9D,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE;YAC1C,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;SACjC;QACD,IAAI,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,QAAQ,EAAE;YACf,OAAO,CAAC,IAAI,CAAC,+BAA+B,GAAG,MAAM,CAAC,IAAI,GAAG,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YACxF,OAAO;SACV;QACD,IAAI,IAAI,CAAC,aAAa,IAAI,MAAM,KAAK,IAAI,CAAC,aAAa,EAAE;YACrD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YAC/D,OAAO;SACV;QACDT,KAAU,CAAC,2BAA2B,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;;;;;QAKxD,IAAI,SAAS,KAAK,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;YAC3C,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;SACnC;QACD,IAAI,SAAS,KAAK,OAAO,EAAE;YACvB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;SAC9B;aACI,IAAI,SAAS,KAAK,KAAK,EAAE;YAC1B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;SAC5B;aACI;YACD,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;SACxD;KACJ,CAAC;;;;;;;;IAQF,aAAa,CAAC,SAAS,CAAC,UAAU,GAAG,UAAU,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE;;QAE1E,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE;YACd,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;SACnD;;QAED,IAAI,SAAS,KAAK,MAAM,EAAE;YACtB,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;SAChE;QACD,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;YAClC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;SACxE;KACJ,CAAC;;;;;;;IAOF,aAAa,CAAC,SAAS,CAAC,aAAa,GAAG,UAAU,IAAI,EAAE;QACpD,IAAI,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;YACxB,IAAI,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC;YAC5B,IAAI,GAAG,aAAa,CAAC;SACxB;QACD,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,OAAO,IAAI,CAAC;KACf,CAAC;;IAEF,aAAa,CAAC,SAAS,CAAC,aAAa,GAAG,UAAU,MAAM,EAAE;QACtDA,KAAU,CAAC,8BAA8B,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,yBAAyB,GAAG,MAAM,CAAC,KAAK,CAAC;QACnE,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;KAC/B,CAAC;;IAEF,aAAa,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,MAAM,EAAE;QACpDA,KAAU,CAAC,4BAA4B,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,kBAAkB,EAAE,CAAC;KAC7B,CAAC;;;;;;IAMF,aAAa,CAAC,SAAS,CAAC,kBAAkB,GAAG,YAAY;QACrD,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;QAChC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,MAAM,CAAC,OAAO,CAAC,UAAU,SAAS,EAAE;YAChC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;SAC5C,CAAC,CAAC;KACN,CAAC;IACF,OAAO,aAAa,CAAC;CACxB,EAAE,CAAC,CAAC;;AClOL,IAAI,UAAU,GAAG,CAAC,CAAC;AACnB,IAAI,SAAS,GAAG,CAAC,CAAC;;;;;;;AAOlB,IAAI,KAAK,iBAAiB,CAAC,YAAY;IACnC,SAAS,KAAK,CAAC,MAAM,EAAE;QACnB,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;KACjD;;IAED,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;QACjC,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,aAAa,EAAE,CAAC;KACxB,CAAC;;IAEF,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,YAAY;QACtC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE;YACzB,QAAQ,CAAC,KAAK,GAAGQ,cAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;SACxE;aACI;YACD,QAAQ,CAAC,KAAK,GAAGA,cAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;SACtE;KACJ,CAAC;;IAEF,KAAK,CAAC,SAAS,CAAC,aAAa,GAAG,YAAY;QACxC,IAAI,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;QAClC,IAAI,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAChC,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QACjC,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QAClC,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC;QACrE,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACtD,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC5D,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACtE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;KACvC,CAAC;;IAEF,KAAK,CAAC,SAAS,CAAC,UAAU,GAAG,UAAU,GAAG,EAAE;QACxC,IAAI,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;QAC9D,IAAI,OAAO,EAAE;YACT,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;SACtC;QACD,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC;QAClB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;KACnC,CAAC;IACF,OAAO,KAAK,CAAC;CAChB,EAAE,CAAC,CAAC;AACL,AACA;;;AAGA,SAAS,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;IAC1D,IAAI,QAAQ,GAAG,UAAU,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;IAC1D,IAAI,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC;IACnE,OAAO,CAAC,SAAS,EAAE,CAAC;IACpB,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC;IAC5B,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,SAAS,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1D,OAAO,CAAC,MAAM,EAAE,CAAC;CACpB;;AClEM,IAAIG,YAAU,GAAG,EAAE,CAAC;AAC3B,AAAO,IAAIC,UAAQ,GAAG,EAAE,CAAC;;AAEzB,IAAI,IAAI,GAAGN,QAAa,CAAC,MAAM,CAAC,CAAC;;AAEjC,IAAI,IAAI,EAAE;IACN,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;CACrC;;;;;;AAMD,AAAO,SAAS,UAAU,CAAC,KAAK,EAAE;IAC9B,KAAK,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE;QAC1B,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC3BM,UAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACvB;aACI,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAClCD,YAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACzB;aACI;YACD,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;SACrD;KACJ,CAAC,CAAC;CACN;;;;;AAKD,AAAO,SAAS,iBAAiB,GAAG;IAChC,IAAI,SAAS,GAAGA,YAAU,CAAC;IAC3B,IAAI,IAAI,EAAE;QACN,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC7D,IAAI,IAAI,CAAC,OAAO,CAACF,aAAkB,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;gBACnD,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aACjC;SACJ;QACD,SAAS,GAAG,cAAc,CAAC;KAC9B;IACD,OAAO,SAAS,CAAC;CACpB;;;;AAID,AAAO,SAAS,YAAY,CAAC,SAAS,EAAE,IAAI,EAAE;IAC1CT,KAAU,CAAC,cAAc,EAAEY,UAAQ,CAAC,CAAC;IACrC,IAAI,OAAO,GAAGA,UAAQ,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE;;QAEvC,OAAOP,UAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KAC3C,CAAC,CAAC;IACHQ,QAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;CAChC;AACD,AAAO,SAAS,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE;IACnDb,KAAU,CAAC,WAAW,CAAC,CAAC;IACxB,IAAI,YAAY,GAAG;;QAEf,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;KACjC,CAAC;;IAEF,WAAW,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE;QAChC,YAAY,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE;YAC9B,IAAI,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAChD,QAAQ,CAAC,IAAI,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;YAChD,WAAW,CAAC,GAAG,CAAC,UAAU,KAAK,EAAE;gBAC7B,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;gBAC9C,IAAI,KAAK;oBACL,QAAQ,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC5C,IAAI,EAAE,CAAC;aACV,CAAC,CAAC;SACN,CAAC,CAAC;KACN,CAAC,CAAC;IACHa,QAAa,CAAC,YAAY,EAAEd,GAAU,CAAC,qBAAqB,CAAC,EAAE,UAAU,KAAK,EAAE;QAC5E,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,CAAC,CAAC;KACf,CAAC,CAAC;CACN;;;;;;;AAOD,SAAS,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;IACvC,IAAIA,GAAU,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE;QAC5C,IAAI,OAAO,GAAG,CAACA,GAAU,CAAC,SAAS,CAAC,IAAIe,mBAAwB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/E,OAAO,CAAC,YAAY;YAChB,kBAAkB,EAAE,CAAC;YACrB,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;SACnC,CAAC,CAAC;QACH,OAAO;KACV;IACDd,KAAU,CAAC,WAAW,CAAC,CAAC;IACxB,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IACzB,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IACzB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxD,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;;IAGjB,IAAI,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,MAAM,EAAE;QAC3D,IAAI,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE;YAClC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;SACrC;QACD,IAAI,EAAE,CAAC;KACV,CAAC,CAAC;;;;;IAKH,IAAI,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;QACtC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,KAAK,EAAE;YAC9C,IAAI,CAAC,KAAK,CAAC,KAAK;gBACZ,OAAO;YACX,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM;gBAClB,OAAO;YACX,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SAChC,CAAC,CAAC;KACN;CACJ;;;;;;;AAOD,SAAS,kBAAkB,GAAG;;IAE1B,IAAI,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAChE,IAAI,KAAK,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACnC,IAAI,CAAC,KAAK;QACN,OAAO;IACX,IAAI,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,0BAA0B,CAAC,CAAC;IAC1E,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;;QAErB,IAAI,CAAC,EAAE,CAAC,WAAW;YACf,SAAS;QACb,IAAI,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC;;QAEvB,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACvB,SAAS;;QAEb,YAAY,CAAC,GAAG,CAAC;YACb,YAAY,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC;;QAEjE,IAAI,EAAE,YAAY,YAAY,CAAC,GAAG,CAAC;YAC/B,SAAS;QACbA,KAAU,CAAC,wDAAwD,GAAG,EAAE,CAAC,CAAC;QAC1E,IAAI,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC1C,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;KACzC;CACJ;;ACjKD;;;;;AAKA,AAAO,SAAS,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE;;IAE/C,IAAI,MAAM,EAAE;QACR,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;KAClD;;IAED,IAAI,SAAS,GAAG,CAACmB,KAAa,EAAED,OAAe,CAAC,CAAC;IACjD,IAAI,MAAM,EAAE;QACR,SAAS,CAAC,IAAI,CAAC,UAAU,MAAM,EAAE;YAC7B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;SAC1B,CAAC,CAAC;KACN;IACD,IAAID,YAAiB,CAAC,MAAM,GAAG,CAAC,IAAID,UAAe,CAAC,MAAM,GAAG,CAAC,EAAE;QAC5D,SAAS,CAAC,IAAI,CAACD,IAAY,CAAC,CAAC;KAChC;IACD,OAAO,SAAS,CAAC;CACpB;;;;AAID,AAAO,SAAS,WAAW,CAAC,KAAK,EAAE;IAC/B,gBAAgB,CAACG,OAAe,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClE,gBAAgB,CAACH,IAAY,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;;IAE/D,gBAAgB,CAAC,aAAa,EAAE,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;CAClF;AACD,SAAS,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE;IACxC,IAAI,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;;IAE5C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,UAAU,GAAG,EAAE;QAChD,YAAY,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;KAC5C,CAAC,CAAC;IACH,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC;CAClC;;AChCD;;;AAGA,AAAO,SAAS,QAAQ,GAAG;IACvBf,KAAU,CAAC,8BAA8B,CAAC,CAAC;IAC3C,IAAI,mBAAmB,GAAG,wCAAwC,CAAC;IACnE,IAAI,OAAO,GAAGD,GAAU,CAAC,oBAAoB,CAAC,CAAC;IAC/C,IAAI,qBAAqB,GAAG,MAAM,CAAC,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;;;;IAIjG,IAAI,CAAC,qBAAqB,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;;QAE/C,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;KACrC;IACD,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE;QAC5B,IAAI,GAAG,GAAGqB,SAAc,CAAC,IAAI,EAAErB,GAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QACnDC,KAAU,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;;QAE/C,QAAQ,CAAC,KAAK,CAAC,eAAe,GAAG,SAAS,CAAC,GAAG,CAAC;YAC3C,aAAa,CAAC,CAAC;KACtB,CAAC,CAAC;IACHA,KAAU,CAAC,4BAA4B,CAAC,CAAC;IACzC,IAAI,OAAO,GAAGD,GAAU,CAAC,oBAAoB,CAAC,CAAC;IAC/C,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE;QAC5B,IAAI,GAAG,GAAGqB,SAAc,CAAC,IAAI,EAAErB,GAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QACnDC,KAAU,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;;QAE/C,QAAQ,CAAC,KAAK,CAAC,2BAA2B,GAAG,SAAS,CAAC,GAAG,CAAC;YACvD,IAAI,CAAC,CAAC;KACb,CAAC,CAAC;IACHA,KAAU,CAAC,4BAA4B,CAAC,CAAC;CAC5C;;;;;;AAMD,AAAO,SAAS,yBAAyB,GAAG;IACxC,YAAY,EAAE,CAAC;IACf,UAAU,EAAE,CAAC;CAChB;AACD,SAAS,YAAY,GAAG;IACpB,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE;QACR,MAAM,IAAI,KAAK,CAAC,oJAAoJ,CAAC,CAAC;KACzK;IACDsB,WAAqB,CAAC,KAAK,CAAC,CAAC;;IAE7B,IAAI,WAAW,GAAGxB,YAAiB,CAAC,UAAU,CAAC,CAAC;;;IAGhD,IAAI,WAAW,IAAI,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,IAAI,EAAE;QAC3CuB,SAAc,CAAC,WAAW,GAAG,WAAW,CAAC,CAAC;KAC7C;CACJ;AACD,SAAS,UAAU,GAAG;IAClB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QACdrB,KAAU,CAAC,8CAA8C,CAAC,CAAC;QAC3D,OAAO;KACV;IACD,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;IACnC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;CACtC;;ACjED;;AAEA,AAAO,IAAI,YAAY,GAAG,EAAE,CAAC;;;;AAI7B,AAAO,SAAS,eAAe,GAAG;IAC9B,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,KAAK,EAAE;QAC9C,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;KAClC,CAAC,CAAC;;IAEH,IAAI,WAAW,GAAG,OAAO,CAAC;IAC1B,IAAI,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC;IAC9B,OAAO,CAAC,KAAK,GAAG,SAAS,eAAe,GAAG;QACvC,SAAS,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACxC,IAAID,GAAU,CAAC,mBAAmB,CAAC,EAAE;YACjC,MAAM,iBAAiB,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;SACvE;KACJ,CAAC;CACL;;AC9BD,IAAI,mBAAmB,GAAG,EAAE,CAAC;;;;;;AAM7B,AAAO,SAAS,gBAAgB,CAAC,UAAU,EAAE,aAAa,EAAE;IACxD,mBAAmB,CAAC,IAAI,CAAC,YAAY;QACjC,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;;QAEzB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;aACxB,OAAO,CAAC,UAAU,aAAa,EAAE;;;YAGlC,IAAI,iBAAiB,GAAG,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;;;YAGxD,IAAI,gBAAgB,GAAG,aAAa,KAAK,KAAK,GAAG,UAAU,GAAG,WAAW,CAAC;;;YAG1E,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,GAAG,UAAU,KAAK,EAAE;;;gBAG/C,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;;;gBAGzC,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,UAAU,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;;;oBAGtD,IAAI,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;;;;;oBAKvD,OAAO,CAAC,UAAU,CAAC;wBACf,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;iBACvD,CAAC,CAAC;aACN,CAAC;SACL,CAAC,CAAC;KACN,CAAC,CAAC;CACN;;;;;AAKD,AAAO,SAAS,eAAe,GAAG;IAC9B,mBAAmB,CAAC,OAAO,CAAC,UAAU,cAAc,EAAE;QAClD,cAAc,EAAE,CAAC;KACpB,CAAC,CAAC;CACN;;AChDD,gBAAgB,CAAC,SAAS,EAAE,UAAU,OAAO,EAAE,QAAQ,EAAE;;;IAGrD,OAAO,OAAO,CAAC,OAAO,IAAI,SAAS,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE;;;QAGzD,QAAQ,CAAC,YAAY;YACjB,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;SAChD,CAAC,CAAC;;;QAGH,OAAO,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC3D,CAAC;CACL,CAAC,CAAC;;ACbH;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,gBAAgB,CAAC,MAAM,EAAE,UAAU,QAAQ,EAAE,QAAQ,EAAE;IACnD,OAAO,SAAS,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE;;QAE1C,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC;;QAElE,IAAI,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,UAAU,GAAG,EAAE;;YAEvD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;SACtD,CAAC,CAAC;;QAEH,QAAQ,CAAC,YAAY;YACjB,KAAK,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE;gBAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;aAClB,CAAC,CAAC;SACN,CAAC,CAAC;KACN,CAAC;CACL,CAAC,CAAC;;AC1CH;AACA,IAAI,YAAY,GAAG,EAAE,CAAC;AACtB,IAAI,uBAAuB,GAAG,KAAK,CAAC;;;;;;;;;;;;;;;AAepC,gBAAgB,CAAC,SAAS,EAAE,UAAU,QAAQ,EAAE,QAAQ,EAAE;IACtD,OAAO,SAAS,OAAO,CAAC,UAAU,EAAE;QAChC,OAAO;YACH,IAAI,EAAE,UAAU,OAAO,EAAE;;gBAErB,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;gBACtC,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;gBAChC,YAAY,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC;;gBAEnC,IAAI,QAAQ,CAAC,UAAU,CAAC,YAAY,EAAE;oBAClC,OAAO;iBACV;gBACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE;oBACzB,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,YAAY,GAAG,CAAC;oBACzC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,cAAc,GAAG,YAAY,GAAG,CAAC;iBACrE;;;gBAGD,IAAI,kBAAkB,GAAG,QAAQ,CAAC,UAAU,CAAC;;gBAE7C,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,WAAW,EAAE,IAAI,EAAE;oBAC5D,IAAI,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;oBACvD,IAAI,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;oBACpC,IAAI,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC;;oBAErC,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;;oBAE1E,IAAI,YAAY,GAAG,QAAQ,CAAC,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;oBAC7F,IAAI,IAAI,CAAC;;;;oBAIT,OAAO,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,EAAE;wBACnC,IAAI,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;wBAChD,IAAI,YAAY,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE;4BAC7C,cAAc,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;;4BAE9C,OAAO,YAAY,CAAC,cAAc,CAAC,EAAE;gCACjC,cAAc,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;6BACjD;;4BAED,IAAI,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;;4BAEzD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE;;gCAEzD,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;6BACvF;;4BAED,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;yBACnD;qBACJ;oBACD,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;iBACvD,CAAC,CAAC;gBACH,IAAI,CAAC,uBAAuB,EAAE;;oBAE1B,QAAQ,CAAC,YAAY;wBACjB,uBAAuB,GAAG,IAAI,CAAC;;wBAE/B,IAAI,kBAAkB,GAAG,QAAQ,CAAC,UAAU,CAAC;wBAC7C,IAAI,kBAAkB,CAAC,YAAY,EAAE;4BACjC,kBAAkB,CAAC,OAAO,EAAE,CAAC;yBAChC;;wBAED,YAAY,GAAG,EAAE,CAAC;qBACrB,CAAC,CAAC;iBACN;aACJ;SACJ,CAAC;KACL,CAAC;CACL,CAAC,CAAC;;ACxEH;;;;AAIA,IAAI,aAAa,GAAG;;IAEhB,GAAG,EAAE;QACD,OAAO,EAAE,UAAU;QACnB,UAAU,EAAE,SAAS;QACrB,YAAY,EAAE,cAAc;QAC5B,eAAe,EAAE,aAAa;QAC9B,OAAO,EAAE,yBAAyB;QAClC,MAAM,EAAE,mBAAmB;KAC9B;;IAED,GAAG,EAAE;QACD,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE,YAAY;QACrB,YAAY,EAAE,cAAc;QAC5B,WAAW,EAAE,iBAAiB;QAC9B,UAAU,EAAE,SAAS;QACrB,SAAS,EAAE,SAAS;QACpB,WAAW,EAAE,cAAc;QAC3B,UAAU,EAAE,cAAc;QAC1B,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,aAAa;QACpB,SAAS,EAAE,QAAQ;QACnB,UAAU,EAAE,aAAa;KAC5B;CACJ,CAAC;;;;;;;AAOF,AAAO,SAAS,cAAc,GAAG;IAC7B,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACtC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE;QACvB,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,GAAG,EAAE;YAClD,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,oBAAoB,GAAG;gBAC1C,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC7C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,oBAAoB,EAAE;oBACtD,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,GAAG,CAAC,CAAC;iBAC5D;gBACD,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;aACxC,CAAC;SACL,CAAC,CAAC;KACN,CAAC,CAAC;CACN;;AAED,IAAI,aAAa,GAAG,KAAK,CAAC;;;;;;AAM1B,SAAS,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE;IACrC,IAAI,YAAY,GAAGA,GAAU,CAAC,cAAc,CAAC,CAAC;IAC9C,IAAI,YAAY,CAAC,EAAE,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE;QAC3C,IAAI,OAAO,GAAG,SAAS,GAAG,YAAY,CAAC,EAAE,GAAG,OAAO,GAAG,EAAE;YACpD,kCAAkC;YAClC,cAAc,GAAG,GAAG,GAAG,kBAAkB,GAAG,SAAS,GAAG,GAAG,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;KAC5B;IACD,IAAI,aAAa,EAAE;QACf,OAAO;KACV;IACD,eAAe,EAAE,CAAC;IAClB,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC;IACrB,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;CAC7B;;AC7DD;;AAEAwB,KAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;;;AAGzB,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG;;;;IAInB,KAAK,EAAE,EAAE;;;IAGT,YAAY,EAAE,WAAW;IACzB,SAAS,EAAE,SAAS;IACpB,OAAO,EAAEE,OAAc;;;;;;;IAOvB,UAAU,EAAED,UAAiB;CAChC,CAAC;;AAEFE,eAAsB,EAAE,CAAC;AACzBC,cAAoB,EAAE,CAAC;AACvBC,QAAoB,EAAE,CAAC;;AAEvB,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,YAAY;IACtD5B,KAAU,CAAC,kBAAkB,CAAC,CAAC;IAC/BkC,yBAAqC,EAAE,CAAC;;IAExC,SAAS,CAAC,IAAI,CAAC,UAAU,KAAK,EAAE,MAAM,EAAE;QACpC,IAAI,KAAK;YACL,MAAM,KAAK,CAAC;;QAEhB,IAAI,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,MAAM,GAAG,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;QAC1DlC,KAAU,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QACtC,IAAI,WAAW,GAAGiC,iBAAwB,EAAE,CAAC;QAC7C,IAAI,cAAc,GAAGD,kBAA4B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;;QAElE,IAAI,QAAQ,GAAG,IAAI,aAAa,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;QACjF,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC;;QAEzBD,YAAmB,CAAC,QAAQ,EAAE,UAAU,KAAK,EAAE;;YAE3C,IAAI,OAAO;gBACP,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,KAAK;gBACL,MAAM,KAAK,CAAC;;YAEhBD,YAAmB,CAAC,OAAO,CAAC,SAAS,OAAO,CAAC,KAAK,EAAE;gBAChD,QAAQ,CAAC,iBAAiB,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;aAClE,CAAC,CAAC;YACHD,SAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,KAAK,EAAE;;gBAErD,IAAI,OAAO;oBACP,OAAO,CAAC,IAAI,EAAE,CAAC;gBACnB,IAAI,KAAK;oBACL,MAAM,KAAK,CAAC;aACnB,CAAC,CAAC;SACN,CAAC,CAAC;KACN,CAAC,CAAC;CACN,CAAC,CAAC,;;"} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/data/a11ySuite-npm-header.txt b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/data/a11ySuite-npm-header.txt
new file mode 100644
index 00000000000..8c8e7b1581d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/data/a11ySuite-npm-header.txt
@@ -0,0 +1,5 @@
+import * as polymerDom from '../@polymer/polymer/lib/legacy/polymer.dom.js';
+const Polymer = { dom: polymerDom };
+export {a11ySuiteExport as a11ySuite};
+
+// wct-browser-legacy/a11ySuite.js is a generated file. Source is in web-component-tester/data/a11ySuite.js
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/data/a11ySuite.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/data/a11ySuite.js
new file mode 100644
index 00000000000..e4da16b787f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/data/a11ySuite.js
@@ -0,0 +1,130 @@
+/**
+ * @license
+ * Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+var a11ySuiteExport;
+
+(function(Mocha, chai, axs) {
+
+ Object.keys(Mocha.interfaces).forEach(function(iface) {
+ var orig = Mocha.interfaces[iface];
+
+ Mocha.interfaces[iface] = function(suite) {
+ orig.apply(this, arguments);
+
+ var Suite = Mocha.Suite;
+ var Test = Mocha.Test;
+
+ suite.on('pre-require', function(context, file, mocha) {
+
+ /**
+ * Runs the Chrome Accessibility Developer Tools Audit against a test-fixture
+ *
+ * @param {String} fixtureId ID of the fixture element in the document to use
+ * @param {Array?} ignoredRules Array of rules to ignore for this suite
+ * @param {Function?} beforeEach Function to be called before each test to ensure proper setup
+ */
+ a11ySuiteExport = context.a11ySuite = function(fixtureId, ignoredRules, beforeEach) {
+ // capture a reference to the fixture element early
+ var fixtureElement = document.getElementById(fixtureId);
+ if (!fixtureElement) {
+ return;
+ }
+
+ // build an audit config to disable certain ignorable tests
+ var axsConfig = new axs.AuditConfiguration();
+ axsConfig.scope = document.body;
+ axsConfig.showUnsupportedRulesWarning = false;
+ axsConfig.auditRulesToIgnore = ignoredRules;
+
+ // build mocha suite
+ var a11ySuite = Suite.create(suite, 'A11y Audit - Fixture: ' + fixtureId);
+
+ // override the `eachTest` function to hackily create the tests
+ //
+ // eachTest is called right before test runs to calculate the total
+ // number of tests
+ a11ySuite.eachTest = function() {
+ // instantiate fixture
+ fixtureElement.create();
+
+ // Make sure lazy-loaded dom is ready (eg <template is='dom-repeat'>)
+ Polymer.dom.flush();
+
+ // If we have a beforeEach function, call it
+ if (beforeEach) {
+ beforeEach();
+ }
+
+ // run audit
+ var auditResults = axs.Audit.run(axsConfig);
+
+ // create tests for audit results
+ auditResults.forEach(function(result, index) {
+ // only show applicable tests
+ if (result.result !== 'NA') {
+ var title = result.rule.heading;
+ // fail test if audit result is FAIL
+ var error = result.result === 'FAIL' ? axs.Audit.accessibilityErrorMessage(result) : null;
+ var test = new Test(title, function() {
+ if (error) {
+ throw new Error(error);
+ }
+ });
+ test.file = file;
+ a11ySuite.addTest(test);
+ }
+ });
+
+ // teardown fixture
+ fixtureElement.restore();
+
+ suite.eachTest.apply(a11ySuite, arguments);
+ this.eachTest = suite.eachTest;
+ };
+
+ return a11ySuite;
+ };
+ });
+ };
+ });
+
+ chai.use(function(chai, util) {
+ var Assertion = chai.Assertion;
+
+ // assert
+ chai.assert.a11yLabel = function(node, exp, msg){
+ new Assertion(node).to.have.a11yLabel(exp, msg);
+ };
+
+ // expect / should
+ Assertion.addMethod('a11yLabel', function(str, msg) {
+ if (msg) {
+ util.flag(this, 'message', msg);
+ }
+
+ var node = this._obj;
+
+ // obj must be a Node
+ new Assertion(node).to.be.instanceOf(Node);
+
+ // vind the text alternative with the help of accessibility dev tools
+ var textAlternative = axs.properties.findTextAlternatives(node, {});
+
+ this.assert(
+ textAlternative === str,
+ 'expected #{this} to have text alternative #{exp} but got #{act}',
+ 'expected #{this} to not have text alternative #{act}',
+ str,
+ textAlternative,
+ true
+ );
+ });
+ });
+})(window.Mocha, window.chai, window.axs);
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/data/index.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/data/index.html
new file mode 100644
index 00000000000..ebc361e2b8d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/data/index.html
@@ -0,0 +1,27 @@
+<!doctype html>
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <script>
+ WCT = <%= JSON.stringify(clientOptions) %>;
+ </script>
+ <script>
+ window.__generatedByWct = true;
+ </script>
+ <script src="../<%= browserScript %>"></script>
+ <% extraScripts.forEach(function(script) { %>
+ <script src="<%- script %>"></script>
+ <% }); %>
+ <% if (typeof npm === 'undefined' || !npm) { %>
+ <script src="../<%= a11ySuiteScript %>"></script>
+ <% } %>
+</head>
+
+<body>
+ <script>
+ WCT.loadSuites(<%= JSON.stringify(suites) %>);
+ </script>
+</body>
+
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/package.json
new file mode 100644
index 00000000000..4f1ac8d1eb8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/web-component-tester/package.json
@@ -0,0 +1,131 @@
+{
+ "name": "web-component-tester",
+ "version": "6.5.0",
+ "--private-wct--": {
+ "client-side-version-range": "4 - 6 || ^6.0.0-prerelease.1",
+ "wct-browser-legacy-version-range": "0.0.1-pre.1 || ^1.0.0"
+ },
+ "description": "web-component-tester makes testing your web components a breeze!",
+ "keywords": [
+ "browser",
+ "grunt",
+ "gruntplugin",
+ "gulp",
+ "polymer",
+ "test",
+ "testing",
+ "web component",
+ "web"
+ ],
+ "homepage": "https://github.com/Polymer/web-component-tester",
+ "bugs": "https://github.com/Polymer/web-component-tester/issues",
+ "license": "BSD-3-Clause",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/Polymer/web-component-tester.git"
+ },
+ "main": "runner.js",
+ "bin": {
+ "wct": "./bin/wct",
+ "wct-st": "./bin/wct-st"
+ },
+ "files": [
+ "bin/",
+ "data/",
+ "runner/",
+ "scripts/",
+ "tasks/",
+ ".bowerrc",
+ "bower.json",
+ "browser.js",
+ "browser.js.map",
+ "package.json",
+ "LICENSE",
+ "README.md",
+ "runner.js"
+ ],
+ "scripts": {
+ "lint": "gulp lint",
+ "build": "tsc && gulp build",
+ "test": "tsc && gulp test",
+ "prepublishOnly": "gulp prepublish",
+ "test:watch": "watch 'gulp test:unit' runner/ browser/ bin/ test/ tasks/",
+ "format": "find runner test | grep '\\.js$\\|\\.ts$' | xargs ./node_modules/.bin/clang-format --style=file -i"
+ },
+ "dependencies": {
+ "@polymer/sinonjs": "^1.14.1",
+ "@polymer/test-fixture": "^0.0.3",
+ "@webcomponents/webcomponentsjs": "^1.0.7",
+ "accessibility-developer-tools": "^2.12.0",
+ "async": "^2.4.1",
+ "body-parser": "^1.17.2",
+ "chai": "^4.0.2",
+ "chalk": "^1.1.3",
+ "cleankill": "^2.0.0",
+ "express": "^4.15.3",
+ "findup-sync": "^1.0.0",
+ "glob": "^7.1.2",
+ "lodash": "^3.10.1",
+ "mocha": "^3.4.2",
+ "multer": "^1.3.0",
+ "nomnom": "^1.8.1",
+ "polyserve": "^0.23.0",
+ "promisify-node": "^0.4.0",
+ "resolve": "^1.3.3",
+ "semver": "^5.3.0",
+ "send": "^0.11.1",
+ "server-destroy": "^1.0.1",
+ "sinon": "^2.3.5",
+ "sinon-chai": "^2.10.0",
+ "socket.io": "^2.0.3",
+ "stacky": "^1.3.1",
+ "wd": "^1.2.0"
+ },
+ "optionalDependencies": {
+ "update-notifier": "^2.2.0",
+ "wct-local": "^2.1.0",
+ "wct-sauce": "^2.0.0"
+ },
+ "devDependencies": {
+ "@types/body-parser": "0.0.33",
+ "@types/chai": "^3.4.34",
+ "@types/chalk": "^0.4.31",
+ "@types/express": "^4.0.33",
+ "@types/express-serve-static-core": "^4.0.39",
+ "@types/glob": "^5.0.30",
+ "@types/grunt": "^0.4.20",
+ "@types/gulp": "^3.8.8",
+ "@types/lodash": "^4.14.38",
+ "@types/mime": "0.0.29",
+ "@types/minimatch": "^2.0.29",
+ "@types/mocha": "^2.2.32",
+ "@types/multer": "0.0.32",
+ "@types/node": "^8.0.0",
+ "@types/nomnom": "0.0.28",
+ "@types/rimraf": "0.0.28",
+ "@types/semver": "^5.3.30",
+ "@types/sinon": "^1.16.31",
+ "@types/sinon-chai": "^2.7.27",
+ "@types/socket.io": "^1.4.27",
+ "bower": "^1.7.9",
+ "clang-format": "^1.0.43",
+ "depcheck": "^0.6.3",
+ "grunt": "^0.4.5",
+ "gulp": "^3.8.8",
+ "gulp-bower": "0.0.13",
+ "gulp-concat": "^2.6.1",
+ "gulp-spawn-mocha": "^3.1.0",
+ "gulp-tslint": "^8.1.2",
+ "gulp-typescript": "^3.1.2",
+ "lazypipe": "^1.0.1",
+ "rimraf": "^2.5.4",
+ "rollup": "^0.25.1",
+ "run-sequence": "^1.0.1",
+ "tslint": "^5.7.0",
+ "typescript": "^2.1.4",
+ "watch": "^0.18.0"
+ },
+ "engines": {
+ "node": ">= 6.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/.bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/.bower.json
new file mode 100644
index 00000000000..162339f7e45
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/.bower.json
@@ -0,0 +1,34 @@
+{
+ "name": "webcomponentsjs",
+ "description": "Web components polyfill",
+ "main": "webcomponents.js",
+ "homepage": "http://webcomponents.org",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/webcomponents/webcomponentsjs.git"
+ },
+ "keywords": [
+ "webcomponents",
+ "web-components",
+ "polyfill",
+ "shim"
+ ],
+ "license": "BSD-3-Clause",
+ "ignore": [],
+ "devDependencies": {
+ "web-component-tester": "^v6.0.0"
+ },
+ "version": "1.2.0",
+ "_release": "1.2.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v1.2.0",
+ "commit": "e6728c15201987b0f71aec6464b743d4277d99ae"
+ },
+ "_source": "https://github.com/webcomponents/webcomponentsjs.git",
+ "_target": "^v1.1.0",
+ "_originalSource": "webcomponents/webcomponentsjs"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/.eslintrc.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/.eslintrc.json
new file mode 100644
index 00000000000..fcf4db69f4f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/.eslintrc.json
@@ -0,0 +1,11 @@
+{
+ "extends": "eslint:recommended",
+ "env": {
+ "browser": true,
+ "es6": true
+ },
+ "parserOptions": {
+ "ecmaVersion": 6,
+ "sourceType": "module"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/.github/CODEOWNERS
new file mode 100644
index 00000000000..93bd76fe93e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/.github/CODEOWNERS
@@ -0,0 +1 @@
+* @azakus
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/.travis.yml b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/.travis.yml
new file mode 100644
index 00000000000..a72b5cff873
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/.travis.yml
@@ -0,0 +1,25 @@
+language: node_js
+sudo: required
+dist: trusty
+node_js: stable
+addons:
+ firefox: latest
+ apt:
+ sources:
+ - google-chrome
+ packages:
+ - google-chrome-stable
+before_script:
+- export DISPLAY=:99.0
+- sh -e /etc/init.d/xvfb start
+- sleep 3
+script:
+- npm install -g bower
+- bower install
+- wct -l chrome
+- wct -l firefox
+- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'windows 10/microsoftedge@14' -s 'windows 8.1/internet explorer@11' -s 'os x 10.11/safari@10' -s 'os x 10.11/safari@9' -s 'Linux/chrome@41'; fi
+env:
+ global:
+ - secure: Fpp9LwJSGOdTrSIImQTlbzxozBsqe/2AJN5OfTXSe12FZxqzz50gevdxQcIlLypKaNyCtjb980DJbwdJR2cXUqaunLZAPWxrKa7ZPwamUxW+zVL7EHqy5zuvD+yJ+Vmk3ahs3WBTVyJ8T3XoaSfo9VumDIcKggWGJwgvM3blIMg=
+ - secure: Bj8MgzUVP0X8MLgK3d9eF48V7x0rPJyrN1IyguzKyJJVC8LV2XZXF+6o/M+zNsVMSsjhgXMkS3RRuaUShxO/OS6gHeG31FWcZqbXfZfgMMyH8a8zDls+r8m2lGEICaZo1OTXR0uiR/VNVt7n2xoBnTmjmRFwkaxAZk4yCjbXYzQ=
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/CONTRIBUTING.md
new file mode 100644
index 00000000000..29a78331707
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/CONTRIBUTING.md
@@ -0,0 +1,66 @@
+# Contributing
+
+Want to contribute to webcomponents.js? Great!
+
+We are more than happy to accept external contributions to the project in the form of [bug reports](../../issues) and pull requests.
+
+For any bug report, please use [this jsbin](http://jsbin.com/birajez/edit?html,console,output) to provide a concrete reproduction case that we can debug.
+
+## Contributor License Agreement
+
+Before we can accept patches, there's a quick web form you need to fill out.
+
+- If you're contributing as an individual (e.g. you own the intellectual property), fill out [this form](http://code.google.com/legal/individual-cla-v1.0.html).
+- If you're contributing under a company, fill out [this form](http://code.google.com/legal/corporate-cla-v1.0.html) instead.
+
+This CLA asserts that contributions are owned by you and that we can license all work under our [license](LICENSE).
+
+Other projects require a similar agreement: jQuery, Firefox, Apache, Node, and many more.
+
+[More about CLAs](https://www.google.com/search?q=Contributor%20License%20Agreement)
+
+## Initial setup
+
+1. Setup Gulp: `sudo npm install -g gulp`
+1. Fork the project on github and pull down your copy.
+ > replace the {{ username }} with your username and {{ repository }} with the repository name
+
+ git clone git@github.com:{{ username }}/{{ repository }}.git
+
+1. Test your change results in a working build.
+ > in the repo you've made changes to, try generating a build:
+
+ cd $REPO
+ npm install
+ gulp
+
+The builds will be placed into the `dist/` directory if all goes well.
+
+1. Commit your code and make a pull request.
+
+That's it for the one time setup. Now you're ready to make a change.
+
+## Submitting a pull request
+
+We iterate fast! To avoid potential merge conflicts, it's a good idea to pull from the main project before making a change and submitting a pull request. The easiest way to do this is setup a remote called `upstream` and do a pull before working on a change:
+
+ git remote add upstream git://github.com/polymer/webcomponentsjs.git
+
+Then before making a change, do a pull from the upstream `master` branch:
+
+ git pull upstream master
+
+To make life easier, add a "pull upstream" alias in your `.gitconfig`:
+
+ [alias]
+ pu = !"git fetch origin -v; git fetch upstream -v; git merge upstream/master"
+
+That will pull in changes from your forked repo, the main (upstream) repo, and merge the two. Then it's just a matter of running `git pu` before a change and pushing to your repo:
+
+ git checkout master
+ git pu
+ # make change
+ git commit -a -m 'Awesome things.'
+ git push
+
+Lastly, don't forget to submit the pull request.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/LICENSE.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/LICENSE.md
new file mode 100644
index 00000000000..bb3f440330f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/LICENSE.md
@@ -0,0 +1,19 @@
+# License
+
+Everything in this repo is BSD style license unless otherwise specified.
+
+Copyright (c) 2015 The Polymer Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+* Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/README.md b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/README.md
new file mode 100644
index 00000000000..dc1b41cb513
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/README.md
@@ -0,0 +1,169 @@
+webcomponents.js (v1 spec polyfills)
+================
+
+[![Build Status](https://travis-ci.org/webcomponents/webcomponentsjs.svg?branch=master)](https://travis-ci.org/webcomponents/webcomponentsjs)
+
+> **Note**. For polyfills that work with the older Custom Elements and Shadow DOM v0 specs, see the [v0 branch](https://github.com/webcomponents/webcomponentsjs/tree/v0).
+
+A suite of polyfills supporting the [Web Components](http://webcomponents.org) specs:
+
+- **Custom Elements v1**: allows authors to define their own custom tags ([spec](https://w3c.github.io/webcomponents/spec/custom/), [tutorial](https://developers.google.com/web/fundamentals/getting-started/primers/customelements)).
+- **HTML Imports**: a way to include and reuse HTML documents via other HTML documents ([spec](https://w3c.github.io/webcomponents/spec/imports/), [tutorial](https://www.html5rocks.com/en/tutorials/webcomponents/imports/)).
+- **Shadow DOM v1**: provides encapsulation by hiding DOM subtrees under shadow roots ([spec](https://w3c.github.io/webcomponents/spec/shadow/), [tutorial](https://developers.google.com/web/fundamentals/getting-started/primers/shadowdom)).
+
+For browsers that need it, there are also some minor polyfills included:
+- [`HTMLTemplateElement`](https://github.com/webcomponents/template)
+- [`Promise`](https://github.com/stefanpenner/es6-promise)
+- `Event`, `CustomEvent`, `MouseEvent` constructors and `Object.assign`, `Array.from` (see [webcomponents-platform](https://github.com/webcomponents/webcomponents-platform))
+
+## How to use
+
+The polyfills are built (concatenated & minified) into several bundles that target
+different browsers and spec readiness:
+
+- `webcomponents-hi.js` -- HTML Imports (needed by Safari Tech Preview)
+- `webcomponents-hi-ce.js` -- HTML Imports and Custom Elements v1 (needed by Safari 10)
+- `webcomponents-hi-sd-ce.js` -- HTML Imports, Custom Elements v1 and Shady DOM/CSS (needed by Safari 9, Firefox, Edge)
+- `webcomponents-sd-ce.js` -- Custom Elements and Shady DOM/CSS (no HTML Imports)
+- `webcomponents-lite.js` -- all of the polyfills: HTML Imports, Custom Elements, Shady DOM/CSS and generic platform polyfills (such as ES6 Promise, Constructable events, etc.) (needed by Internet Explorer 11), and Template (needed by IE 11 and Edge)
+
+If you are only targeting a specific browser, you can just use the bundle that's
+needed by it; alternatively, if your server is capable of serving different assets based on user agent, you can send the polyfill bundle that's necessary for the browser making that request.
+
+## `webcomponents-loader.js`
+Alternatively, this repo also comes with `webcomponents-loader.js`, a client-side
+loader that dynamically loads the minimum polyfill bundle, using feature detection.
+Note that because the bundle will be loaded asynchronously, you should wait for the `WebComponentsReady` before you can safely assume that all the polyfills have
+loaded and are ready to be used (i.e. if you want to dynamically load other custom
+elements, etc.).
+
+Additionally, you can check if `window.WebComponents` exists to know if the `WebComponentsReady` event will fire, and you can check if `window.WebComponents.ready` is true to check if the `WebComponentsReady` event has already fired.
+
+Here's an example:
+
+```html
+<!-- Load polyfills; note that "loader" will load these async -->
+<script src="bower_components/webcomponentsjs/webcomponents-loader.js"></script>
+
+<!-- Load a custom element definition via HTMLImports -->
+<link rel="import" href="my-element.html">
+
+<!-- Use the custom element -->
+<my-element></my-element>
+
+<!-- Interact with the upgraded element -->
+<script>
+ window.addEventListener('WebComponentsReady', function() {
+ // At this point we are guaranteed that all required polyfills have loaded,
+ // all HTML imports have loaded, and all defined custom elements have upgraded
+ let MyElement = customElements.get('my-element');
+ let element = document.querySelector('my-element');
+ console.assert(element instanceof MyElement); // 👍
+ element.someAPI(); // 👍
+ });
+</script>
+```
+
+## `custom-elements-es5-adapter.js`
+According to the spec, Custom Elements must be ES6 classes (https://html.spec.whatwg.org/multipage/scripting.html#custom-element-conformance). Since most projects need to support a wide range of browsers that don't necessary support ES6, it may make sense to compile your project to ES5. However, ES5-style custom element classes will **not** work with native Custom Elements because ES5-style classes cannot properly extend ES6 classes, like `HTMLElement`.
+
+To work around this, load `custom-elements-es5-adapter.js` before declaring new Custom Elements.
+
+**The adapter must NOT be compiled.**
+
+```html
+<!-- Load Custom Elements es5 adapter -->
+<script src="bower_components/webcomponentsjs/custom-elements-es5-adapter.js"></script>
+<!-- Load polyfills; note that "loader" will load these async -->
+<script src="bower_components/webcomponentsjs/webcomponents-loader.js"></script>
+<!-- Load the es5 compiled custom element definition -->
+<link rel="import" href="my-es5-element.html">
+
+<!-- Use the custom element -->
+<my-es5-element></my-es5-element>
+```
+
+## Browser Support
+
+The polyfills are intended to work in the latest versions of evergreen browsers. See below
+for our complete browser support matrix:
+
+| Polyfill | IE11+ | Chrome* | Firefox* | Safari 9+* | Chrome Android* | Mobile Safari* |
+| ---------- |:-----:|:-------:|:--------:|:----------:|:---------------:|:--------------:|
+| Custom Elements | ✓ | ✓ | ✓ | ✓ | ✓| ✓ |
+| HTML Imports | ✓ | ✓ | ✓ | ✓| ✓| ✓ |
+| Shady CSS/DOM | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
+
+\*Indicates the current version of the browser
+
+The polyfills may work in older browsers, however require additional polyfills (such as classList, or other [platform](https://github.com/webcomponents/webcomponents-platform)
+polyfills) to be used. We cannot guarantee support for browsers outside of our compatibility matrix.
+
+
+### Manually Building
+
+If you wish to build the bundles yourself, you'll need `node` and `npm` on your system:
+
+ * install [node.js](http://nodejs.org/) using the instructions on their website
+ * use `npm` to install [gulp.js](http://gulpjs.com/): `npm install -g gulp`
+
+Now you are ready to build the polyfills with:
+
+ # install dependencies
+ npm install
+ bower install
+ # build
+ gulp
+
+The builds will be placed into the root directory.
+
+## Contribute
+
+See the [contributing guide](CONTRIBUTING.md)
+
+## License
+
+Everything in this repository is BSD style license unless otherwise specified.
+
+Copyright (c) 2015 The Polymer Authors. All rights reserved.
+
+## Helper utilities
+
+### `WebComponentsReady`
+
+Under native HTML Imports, `<script>` tags in the main document block the loading of such imports. This is to ensure the imports have loaded and any registered elements in them have been upgraded.
+
+The `webcomponents-lite.js` polyfill (as well as the smaller bundles and the loader) parse element definitions and handle their upgrade asynchronously. If prematurely fetching the element from the DOM before it has an opportunity to upgrade, you'll be working with an `HTMLUnknownElement`.
+
+For these situations, you can use the `WebComponentsReady` event as a signal before interacting with the element. The criteria for this event to fire is all Custom Elements with definitions registered by the time HTML Imports available at load time have loaded have upgraded.
+
+```js
+window.addEventListener('WebComponentsReady', function(e) {
+ // imports are loaded and elements have been registered
+ console.log('Components are ready');
+});
+```
+
+## Known Issues
+
+ * [ShadowDOM CSS is not encapsulated out of the box](#shadycss)
+ * [Custom element's constructor property is unreliable](#constructor)
+ * [Contenteditable elements do not trigger MutationObserver](#contentedit)
+ * [ShadyCSS: :host(.zot:not(.bar:nth-child(2))) doesn't work](#nestedparens)
+
+### ShadowDOM CSS is not encapsulated out of the box <a id="shadycss"></a>
+The ShadowDOM polyfill is not able to encapsulate CSS in ShadowDOM out of the box. You need to use specific code from the ShadyCSS library, included with the polyfill. See [ShadyCSS instructions](https://github.com/webcomponents/shadycss).
+
+### Custom element's constructor property is unreliable <a id="constructor"></a>
+See [#215](https://github.com/webcomponents/webcomponentsjs/issues/215) for background.
+
+In Safari and IE, instances of Custom Elements have a `constructor` property of `HTMLUnknownElementConstructor` and `HTMLUnknownElement`, respectively. It's unsafe to rely on this property for checking element types.
+
+It's worth noting that `customElement.__proto__.__proto__.constructor` is `HTMLElementPrototype` and that the prototype chain isn't modified by the polyfills(onto `ElementPrototype`, etc.)
+
+### Contenteditable elements do not trigger MutationObserver <a id="contentedit"></a>
+Using the MutationObserver polyfill, it isn't possible to monitor mutations of an element marked `contenteditable`.
+See [the mailing list](https://groups.google.com/forum/#!msg/polymer-dev/LHdtRVXXVsA/v1sGoiTYWUkJ)
+
+### ShadyCSS: :host(.zot:not(.bar:nth-child(2))) doesn't work <a id="nestedparens"></a>
+ShadyCSS `:host()` rules can only have (at most) 1-level of nested parentheses in its argument selector under ShadyCSS. For example, `:host(.zot)` and `:host(.zot:not(.bar))` both work, but `:host(.zot:not(.bar:nth-child(2)))` does not.
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/bower.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/bower.json
new file mode 100644
index 00000000000..4f5d918b183
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/bower.json
@@ -0,0 +1,24 @@
+{
+ "name": "webcomponentsjs",
+ "description": "Web components polyfill",
+ "main": "webcomponents.js",
+ "homepage": "http://webcomponents.org",
+ "authors": [
+ "The Polymer Authors"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/webcomponents/webcomponentsjs.git"
+ },
+ "keywords": [
+ "webcomponents",
+ "web-components",
+ "polyfill",
+ "shim"
+ ],
+ "license": "BSD-3-Clause",
+ "ignore": [],
+ "devDependencies": {
+ "web-component-tester": "^v6.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/closure-output.txt b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/closure-output.txt
new file mode 100644
index 00000000000..e7db2a2133f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/closure-output.txt
@@ -0,0 +1,10 @@
+/**
+@license @nocompile
+Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+(function(){%output%}).call(this); \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/custom-elements-es5-adapter.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/custom-elements-es5-adapter.js
new file mode 100644
index 00000000000..4bcb525b475
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/custom-elements-es5-adapter.js
@@ -0,0 +1,16 @@
+(function () {
+'use strict';
+
+(()=>{'use strict';if(!window.customElements)return;const a=window.HTMLElement,b=window.customElements.define,c=window.customElements.get,d=new Map,e=new Map;let f=!1,g=!1;window.HTMLElement=function(){if(!f){const a=d.get(this.constructor),b=c.call(window.customElements,a);g=!0;const e=new b;return e}f=!1;},window.HTMLElement.prototype=a.prototype;Object.defineProperty(window,'customElements',{value:window.customElements,configurable:!0,writable:!0}),Object.defineProperty(window.customElements,'define',{value:(c,h)=>{const i=h.prototype,j=class extends a{constructor(){super(),Object.setPrototypeOf(this,i),g||(f=!0,h.call(this)),g=!1;}},k=j.prototype;j.observedAttributes=h.observedAttributes,k.connectedCallback=i.connectedCallback,k.disconnectedCallback=i.disconnectedCallback,k.attributeChangedCallback=i.attributeChangedCallback,k.adoptedCallback=i.adoptedCallback,d.set(h,c),e.set(c,h),b.call(window.customElements,c,j);},configurable:!0,writable:!0}),Object.defineProperty(window.customElements,'get',{value:(a)=>e.get(a),configurable:!0,writable:!0});})();
+
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+}());
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/custom-elements-es5-adapter-index.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/custom-elements-es5-adapter-index.js
new file mode 100644
index 00000000000..7000b62ce97
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/custom-elements-es5-adapter-index.js
@@ -0,0 +1,16 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+'use strict';
+
+/*
+ * Polyfills loaded: Custom Elements ES5 Shim
+ */
+
+import '../node_modules/@webcomponents/custom-elements/src/native-shim.js';
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-hi-ce-index.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-hi-ce-index.js
new file mode 100644
index 00000000000..4f6ab4da8f6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-hi-ce-index.js
@@ -0,0 +1,21 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+'use strict';
+
+/*
+ * Polyfills loaded: HTML Imports, Custom Elements
+ * Used in: Safari 10, Firefox once SD is shipped
+ */
+
+import '../node_modules/@webcomponents/html-imports/src/html-imports.js';
+import '../node_modules/@webcomponents/custom-elements/src/custom-elements.js';
+
+import '../src/post-polyfill.js';
+import '../src/unresolved.js';
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-hi-index.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-hi-index.js
new file mode 100644
index 00000000000..e55027f7456
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-hi-index.js
@@ -0,0 +1,20 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+'use strict';
+
+/*
+ * Polyfills loaded: HTML Imports
+ * Used in: Safari Tech Preview
+ */
+
+import '../node_modules/@webcomponents/html-imports/src/html-imports.js';
+
+import '../src/post-polyfill.js';
+import '../src/unresolved.js'; \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-hi-sd-ce-index.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-hi-sd-ce-index.js
new file mode 100644
index 00000000000..3dbc4dac273
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-hi-sd-ce-index.js
@@ -0,0 +1,22 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+'use strict';
+
+/*
+ * Polyfills loaded: HTML Imports, Custom Elements, Shady DOM/Shady CSS
+ * Used in: Safari 9, Firefox, Edge
+ */
+
+import '../node_modules/@webcomponents/html-imports/src/html-imports.js';
+import '../node_modules/@webcomponents/shadydom/src/shadydom.js';
+import '../node_modules/@webcomponents/custom-elements/src/custom-elements.js';
+import '../node_modules/@webcomponents/shadycss/entrypoints/scoping-shim.js';
+import '../src/post-polyfill.js';
+import '../src/unresolved.js';
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-hi-sd-ce-pf-index.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-hi-sd-ce-pf-index.js
new file mode 100644
index 00000000000..4e32ab2f368
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-hi-sd-ce-pf-index.js
@@ -0,0 +1,26 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+'use strict';
+
+/*
+ * Polyfills loaded: HTML Imports, Custom Elements, Shady DOM/Shady CSS, platform polyfills, template
+ * Used in: IE 11
+ */
+
+import '../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js';
+import '../node_modules/@webcomponents/template/template.js';
+import '../src/promise.js';
+import '../node_modules/@webcomponents/html-imports/src/html-imports.js';
+import '../src/pre-polyfill.js';
+import '../node_modules/@webcomponents/shadydom/src/shadydom.js';
+import '../node_modules/@webcomponents/custom-elements/src/custom-elements.js';
+import '../node_modules/@webcomponents/shadycss/entrypoints/scoping-shim.js';
+import '../src/post-polyfill.js';
+import '../src/unresolved.js'; \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-hi-sd-index.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-hi-sd-index.js
new file mode 100644
index 00000000000..ca217ce74d8
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-hi-sd-index.js
@@ -0,0 +1,21 @@
+/**
+@license
+Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+'use strict';
+
+/*
+ * Polyfills loaded: HTML Imports, Shady DOM/Shady CSS
+ * Used in: Firefox with CustomElements enabled
+ */
+
+import '../node_modules/@webcomponents/html-imports/src/html-imports.js';
+import '../node_modules/@webcomponents/shadydom/src/shadydom.js';
+import '../node_modules/@webcomponents/shadycss/entrypoints/scoping-shim.js';
+import '../src/post-polyfill.js';
+import '../src/unresolved.js';
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-sd-ce-index.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-sd-ce-index.js
new file mode 100644
index 00000000000..1ff8e2c4939
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/entrypoints/webcomponents-sd-ce-index.js
@@ -0,0 +1,42 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+'use strict';
+
+/*
+ * Polyfills loaded: Custom Elements, Shady DOM/Shady CSS
+ * Used in: Safari 9, Firefox, Edge
+ */
+
+import '../node_modules/@webcomponents/shadydom/src/shadydom.js';
+import '../node_modules/@webcomponents/custom-elements/src/custom-elements.js';
+import '../node_modules/@webcomponents/shadycss/entrypoints/scoping-shim.js';
+
+let document = window.document;
+// global for (1) existence means `WebComponentsReady` will file,
+// (2) WebComponents.ready == true means event has fired.
+window.WebComponents = window.WebComponents || {};
+
+function fire() {
+ requestAnimationFrame(() => {
+ window.WebComponents.ready = true;
+ window.document.dispatchEvent(new CustomEvent('WebComponentsReady', { bubbles: true }));
+ })
+}
+
+function wait() {
+ fire();
+ document.removeEventListener('readystatechange', wait);
+}
+
+if (document.readyState !== 'loading') {
+ fire();
+} else {
+ document.addEventListener('readystatechange', wait);
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/externs/webcomponents.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/externs/webcomponents.js
new file mode 100644
index 00000000000..43f7794b98e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/externs/webcomponents.js
@@ -0,0 +1,25 @@
+/**
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ *
+ * @fileoverview Symbols needed to compile webcomponents
+ * @externs
+ */
+var require;
+var global;
+var ES6Promise;
+var process;
+var define;
+var module;
+var exports;
+
+var ShadyDOM;
+var WebComponents;
+
+/** @type !Function */
+Promise.cast; \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/gulpfile.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/gulpfile.js
new file mode 100644
index 00000000000..d7049066c96
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/gulpfile.js
@@ -0,0 +1,187 @@
+/**
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+'use strict';
+
+/* eslint-env node */
+/* eslint-disable no-console */
+
+const gulp = require('gulp');
+const sourcemaps = require('gulp-sourcemaps');
+const rename = require('gulp-rename');
+const rollup = require('rollup-stream');
+const source = require('vinyl-source-stream');
+const del = require('del');
+const runseq = require('run-sequence');
+const closure = require('google-closure-compiler').gulp();
+const babel = require('rollup-plugin-babel');
+
+function debugify(sourceName, fileName, extraRollupOptions) {
+ if (!fileName)
+ fileName = sourceName;
+
+ const options = {
+ entry: `./entrypoints/${sourceName}-index.js`,
+ format: 'iife',
+ moduleName: 'webcomponentsjs'
+ };
+
+ Object.assign(options, extraRollupOptions);
+
+ return rollup(options)
+ .pipe(source(`${sourceName}-index.js`), 'entrypoints')
+ .pipe(rename(fileName + '.js'))
+ .pipe(gulp.dest('./'))
+}
+
+function closurify(sourceName, fileName) {
+ if (!fileName) {
+ fileName = sourceName;
+ }
+
+ const closureOptions = {
+ new_type_inf: true,
+ compilation_level: 'ADVANCED',
+ language_in: 'ES6_STRICT',
+ language_out: 'ES5_STRICT',
+ isolation_mode: 'NONE',
+ output_wrapper_file: 'closure-output.txt',
+ assume_function_wrapper: true,
+ js_output_file: `${fileName}.js`,
+ warning_level: 'VERBOSE',
+ rewrite_polyfills: false,
+ module_resolution: 'NODE',
+ entry_point: `entrypoints/${sourceName}-index.js`,
+ dependency_mode: 'STRICT',
+ externs: [
+ 'externs/webcomponents.js',
+ 'node_modules/@webcomponents/custom-elements/externs/custom-elements.js',
+ 'node_modules/@webcomponents/html-imports/externs/html-imports.js',
+ 'node_modules/@webcomponents/shadycss/externs/shadycss-externs.js',
+ 'node_modules/@webcomponents/shadydom/externs/shadydom.js'
+ ]
+ };
+
+ return gulp.src([
+ 'entrypoints/*.js',
+ 'src/*.js',
+ 'node_modules/es6-promise/lib/es6-promise/**/*.js',
+ 'node_modules/@webcomponents/**/*.js',
+ '!node_modules/@webcomponents/*/externs/*.js',
+ '!node_modules/@webcomponents/*/node_modules/**',
+ '!**/bower_components/**'
+ ], {base: './', follow: true})
+ .pipe(sourcemaps.init())
+ .pipe(closure(closureOptions))
+ .pipe(sourcemaps.write('.'))
+ .pipe(gulp.dest('.'));
+}
+
+gulp.task('debugify-hi', () => {
+ return debugify('webcomponents-hi')
+});
+
+gulp.task('debugify-hi-ce', () => {
+ return debugify('webcomponents-hi-ce')
+});
+
+gulp.task('debugify-hi-sd-ce', () => {
+ return debugify('webcomponents-hi-sd-ce')
+});
+
+gulp.task('debugify-hi-sd-ce-pf', () => {
+ // The es6-promise polyfill needs to set the correct context.
+ // See https://github.com/rollup/rollup/wiki/Troubleshooting#this-is-undefined
+ const extraOptions = {context: 'window'};
+ return debugify('webcomponents-hi-sd-ce-pf', 'webcomponents-lite', extraOptions)
+});
+
+gulp.task('debugify-sd-ce', () => {
+ return debugify('webcomponents-sd-ce')
+});
+
+gulp.task('debugify-hi-sd', () => {
+ return debugify('webcomponents-hi-sd')
+});
+
+gulp.task('closurify-hi', () => {
+ return closurify('webcomponents-hi')
+});
+
+gulp.task('closurify-hi-ce', () => {
+ return closurify('webcomponents-hi-ce')
+});
+
+gulp.task('closurify-hi-sd-ce', () => {
+ return closurify('webcomponents-hi-sd-ce')
+});
+
+gulp.task('closurify-hi-sd-ce-pf', () => {
+ return closurify('webcomponents-hi-sd-ce-pf', 'webcomponents-lite')
+});
+
+gulp.task('closurify-sd-ce', () => {
+ return closurify('webcomponents-sd-ce')
+});
+
+gulp.task('closurify-hi-sd', () => {
+ return closurify('webcomponents-hi-sd')
+})
+
+function singleLicenseComment() {
+ let hasLicense = false;
+ return (comment) => {
+ if (hasLicense) {
+ return false;
+ }
+ return hasLicense = /@license/.test(comment);
+ }
+}
+
+const babelOptions = {
+ presets: 'minify',
+ shouldPrintComment: singleLicenseComment()
+};
+
+gulp.task('debugify-ce-es5-adapter', () => {
+ return debugify('custom-elements-es5-adapter', '', {plugins: [babel(babelOptions)]});
+});
+
+gulp.task('default', ['closure']);
+
+gulp.task('clean-builds', () => {
+ return del(['custom-elements-es5-adapter.js{,.map}', 'webcomponents*.js{,.map}', '!webcomponents-loader.js']);
+});
+
+gulp.task('debug', (cb) => {
+ const tasks = [
+ 'debugify-hi',
+ 'debugify-hi-ce',
+ 'debugify-hi-sd',
+ 'debugify-hi-sd-ce',
+ 'debugify-hi-sd-ce-pf',
+ 'debugify-sd-ce',
+ 'debugify-ce-es5-adapter'
+ ];
+ runseq('clean-builds', tasks, cb);
+});
+
+gulp.task('closure', (cb) => {
+ const tasks = [
+ 'closurify-hi',
+ 'closurify-hi-ce',
+ 'closurify-hi-sd',
+ 'closurify-hi-sd-ce',
+ 'closurify-hi-sd-ce-pf',
+ 'closurify-sd-ce',
+ 'debugify-ce-es5-adapter'
+ ];
+ runseq('clean-builds', ...tasks, cb);
+}); \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/package-lock.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/package-lock.json
new file mode 100644
index 00000000000..9f7a77c5761
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/package-lock.json
@@ -0,0 +1,9534 @@
+{
+ "name": "@webcomponents/webcomponentsjs",
+ "version": "1.2.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@gulp-sourcemaps/identity-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz",
+ "integrity": "sha1-z6I7xYQPkQTOMqZedNt+epdLvuE=",
+ "dev": true,
+ "requires": {
+ "acorn": "5.3.0",
+ "css": "2.2.1",
+ "normalize-path": "2.1.1",
+ "source-map": "0.5.7",
+ "through2": "2.0.3"
+ }
+ },
+ "@gulp-sourcemaps/map-sources": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz",
+ "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=",
+ "dev": true,
+ "requires": {
+ "normalize-path": "2.1.1",
+ "through2": "2.0.3"
+ }
+ },
+ "@polymer/sinonjs": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/@polymer/sinonjs/-/sinonjs-1.17.1.tgz",
+ "integrity": "sha512-/U8F/cOTrbF2iVVYgINYmvKbtbexs+89Q3v8AaHADRYabTg7aOZGOb0RyWpOI+sUJt04kj63U4FwMhzW5r4wZA==",
+ "dev": true
+ },
+ "@polymer/test-fixture": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@polymer/test-fixture/-/test-fixture-0.0.3.tgz",
+ "integrity": "sha1-REN1JpfU2Sk7vEEuoLXk00HxSdk=",
+ "dev": true
+ },
+ "@types/assert": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/assert/-/assert-0.0.29.tgz",
+ "integrity": "sha1-jlYnhbqlq9p8BKSfZmXq50MZKNM=",
+ "dev": true
+ },
+ "@types/babel-core": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-core/-/babel-core-6.25.3.tgz",
+ "integrity": "sha512-OlUjfM+Qv+XwcaucEiekBIhfAYe4q4ruvQZZcCkOtQZ27Hykxm1LLY2s0mE6LtP9XQt6x+TUvS70KW2e8Mz0ZA==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-template": "6.25.0",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "7.0.0",
+ "@types/babylon": "6.16.2"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "7.0.0"
+ }
+ },
+ "@types/babel-template": {
+ "version": "6.25.0",
+ "resolved": "https://registry.npmjs.org/@types/babel-template/-/babel-template-6.25.0.tgz",
+ "integrity": "sha512-TtyfVlrprX92xSuKa8D//7vFz5kBJODBw5IQ1hQXehqO+me26vt1fyNxOZyXhUq2a7jRyT72V8p68IyH4NEZNA==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "7.0.0",
+ "@types/babylon": "6.16.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "7.0.0"
+ }
+ },
+ "@types/babel-types": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.0.tgz",
+ "integrity": "sha512-PyWcbX0W4r4GcgXLI0Vu4jyJ/Erueo3PwjgvQcOmWAOBW0ObhzBBciEX+sHvjkNE0umI6nqD192FDKvYZTL91A==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "7.0.0"
+ }
+ },
+ "@types/bluebird": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.19.tgz",
+ "integrity": "sha512-2nHw8pBp6J0N4mHPEO5GJptmd0KKjLFz/wpBiLMOT8UVnGqAP2e7P44wKVj+ujPvsFuIGyB2waDA3dpYX3c6Aw==",
+ "dev": true
+ },
+ "@types/body-parser": {
+ "version": "1.16.8",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.16.8.tgz",
+ "integrity": "sha512-BdN2PXxOFnTXFcyONPW6t0fHjz2fvRZHVMFpaS0wYr+Y8fWEaNOs4V8LEu/fpzQlMx+ahdndgTaGTwPC+J/EeA==",
+ "dev": true,
+ "requires": {
+ "@types/express": "4.11.0",
+ "@types/node": "8.5.9"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.1.tgz",
+ "integrity": "sha512-nU82bD1xUJ1BKKPNQPJffXjNQtjh5XdF7hqKhnjrpLw+5jMJdJcx6UqwWycCPnKKWQbNszOq9g9vSn1Xc0Ll/Q==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.1"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/compression": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/compression/-/compression-0.0.33.tgz",
+ "integrity": "sha1-ldxzOiM5qoRjgdfxN3eS0lU9wn0=",
+ "dev": true,
+ "requires": {
+ "@types/express": "4.11.0"
+ }
+ },
+ "@types/content-type": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@types/content-type/-/content-type-1.1.2.tgz",
+ "integrity": "sha512-w2d7fBCYbCBUBTGtkC4JfX1FicTtgEmq7wTTjc7rC5RA/JdB1Bi7o88nKzUqAnIIBXJVmq0n4tTmF3PJN8QqCg==",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/escodegen": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/@types/escodegen/-/escodegen-0.0.2.tgz",
+ "integrity": "sha1-fOpBqyQukQ6xD2WuGK66RZ1ms18=",
+ "dev": true
+ },
+ "@types/estraverse": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estraverse/-/estraverse-0.0.6.tgz",
+ "integrity": "sha1-Zp9833KreX5hJfjQD+0z1M8wwiE=",
+ "dev": true,
+ "requires": {
+ "@types/estree": "0.0.37"
+ }
+ },
+ "@types/estree": {
+ "version": "0.0.37",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.37.tgz",
+ "integrity": "sha512-1IT6vNpmU9w18P3v6mN9idv18z5KPVTi4t7+rU9VLnkxo0LCam8IXy/eSVzOaQ1Wpabra2cN3A8K/SliPK/Suw==",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz",
+ "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==",
+ "dev": true
+ },
+ "@types/express": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.11.0.tgz",
+ "integrity": "sha512-N1Wdp3v4KmdO3W/CM7KXrDwM4xcVZjlHF2dAOs7sNrTUX8PY3G4n9NkaHlfjGFEfgFeHmRRjywoBd4VkujDs9w==",
+ "dev": true,
+ "requires": {
+ "@types/body-parser": "1.16.8",
+ "@types/express-serve-static-core": "4.11.1",
+ "@types/serve-static": "1.13.1"
+ }
+ },
+ "@types/express-serve-static-core": {
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.11.1.tgz",
+ "integrity": "sha512-EehCl3tpuqiM8RUb+0255M8PhhSwTtLfmO7zBBdv0ay/VTd/zmrqDfQdZFsa5z/PVMbH2yCMZPXsnrImpATyIw==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/node": "8.5.9"
+ }
+ },
+ "@types/freeport": {
+ "version": "1.0.21",
+ "resolved": "https://registry.npmjs.org/@types/freeport/-/freeport-1.0.21.tgz",
+ "integrity": "sha1-c/ZUPtZ9PKP/+XuYVZFZi3CSBm8=",
+ "dev": true,
+ "optional": true
+ },
+ "@types/glob": {
+ "version": "5.0.34",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.34.tgz",
+ "integrity": "sha512-sUvpieq+HsWTLdkeOI8Mi8u22Ag3AoGuM3sv+XMP1bKtbaIAHpEA2f52K2mz6vK5PVhTa3bFyRZLZMqTxOo2Cw==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "8.5.9"
+ }
+ },
+ "@types/glob-stream": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@types/glob-stream/-/glob-stream-6.1.0.tgz",
+ "integrity": "sha512-RHv6ZQjcTncXo3thYZrsbAVwoy4vSKosSWhuhuQxLOTv74OJuFQxXkmUuZCr3q9uNBEVCvIzmZL/FeRNbHZGUg==",
+ "dev": true,
+ "requires": {
+ "@types/glob": "5.0.34",
+ "@types/node": "8.5.9"
+ }
+ },
+ "@types/launchpad": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@types/launchpad/-/launchpad-0.6.0.tgz",
+ "integrity": "sha1-NylhCbfyd/bmxf1+DAcGvJGPu1E=",
+ "dev": true,
+ "optional": true
+ },
+ "@types/mime": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-0.0.29.tgz",
+ "integrity": "sha1-+8/TMFc7kS71nu7hRgK/rOYwdUs=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/mz": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/mz/-/mz-0.0.29.tgz",
+ "integrity": "sha1-vCRyjGSZc/HHhR6QM/nOUlZowns=",
+ "dev": true,
+ "requires": {
+ "@types/bluebird": "3.5.19",
+ "@types/node": "8.5.9"
+ }
+ },
+ "@types/node": {
+ "version": "8.5.9",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.5.9.tgz",
+ "integrity": "sha512-s+c3AjymyAccTI4hcgNFK4mToH8l+hyPDhu4LIkn71lRy56FLijGu00fyLgldjM/846Pmk9N4KFUs2P8GDs0pA==",
+ "dev": true
+ },
+ "@types/opn": {
+ "version": "3.0.28",
+ "resolved": "https://registry.npmjs.org/@types/opn/-/opn-3.0.28.tgz",
+ "integrity": "sha1-CX0NHJtXSVc6XZbfEyOHu20CEYo=",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.5.9"
+ }
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.5.9"
+ }
+ },
+ "@types/pem": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@types/pem/-/pem-1.9.3.tgz",
+ "integrity": "sha512-+hHbGi9PAyHVeRdMJN6yNuMWoshJ+7oTqYuhBB1/vHq0Tfu46ucbvgxmhwBfe0GCiJZvCa20VHhHsA0mY5W6hQ==",
+ "dev": true
+ },
+ "@types/serve-static": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.1.tgz",
+ "integrity": "sha512-jDMH+3BQPtvqZVIcsH700Dfi8Q3MIcEx16g/VdxjoqiGR/NntekB10xdBpirMKnPe9z2C5cBmL0vte0YttOr3Q==",
+ "dev": true,
+ "requires": {
+ "@types/express-serve-static-core": "4.11.1",
+ "@types/mime": "0.0.29"
+ }
+ },
+ "@types/spdy": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/@types/spdy/-/spdy-3.4.4.tgz",
+ "integrity": "sha512-N9LBlbVRRYq6HgYpPkqQc3a9HJ/iEtVZToW6xlTtJiMhmRJ7jJdV7TaZQJw/Ve/1ePUsQiCTDc4JMuzzag94GA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.5.9"
+ }
+ },
+ "@types/ua-parser-js": {
+ "version": "0.7.32",
+ "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.32.tgz",
+ "integrity": "sha512-+z7Q72Mlnq6SFkQYHzLg2Z70pIsgRVzgx1b5PV8eUv5uaZ/zoqIs45XnhtToW4gTeX4FbjIP49nhIjyvPF4rPg==",
+ "dev": true
+ },
+ "@types/vinyl": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.2.tgz",
+ "integrity": "sha512-2iYpNuOl98SrLPBZfEN9Mh2JCJ2EI9HU35SfgBEb51DcmaHkhp8cKMblYeBqMQiwXMgAD3W60DbQ4i/UdLiXhw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.5.9"
+ }
+ },
+ "@types/vinyl-fs": {
+ "version": "0.0.28",
+ "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-0.0.28.tgz",
+ "integrity": "sha1-RmMBe8gCxlcOrk80Cf1cq/l8v94=",
+ "dev": true,
+ "requires": {
+ "@types/glob-stream": "6.1.0",
+ "@types/node": "8.5.9",
+ "@types/vinyl": "2.0.2"
+ }
+ },
+ "@types/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-ZrJDWpvg75LTGX4XwuneY9s6bF3OeZcGTpoGh3zDV9ytzcHMFsRrMIaLBRJZQMBoGyKs6unBQfVdrLZiYfb1zQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@types/winston": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.7.tgz",
+ "integrity": "sha512-jNhbkxPtt9xbzvihfA0OavjJbpCIyTDSmwE03BVXgCKcz9lwNsq4cg2wsNkY4Av5eH35ttBArhYtVJa6CIrg2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.5.9"
+ }
+ },
+ "@webcomponents/custom-elements": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@webcomponents/custom-elements/-/custom-elements-1.1.0.tgz",
+ "integrity": "sha512-M872VYia7mXvtgsxKTTNBNPDYNLEvM3DDd0reyNusd/5weWH0XouKYYgp68b6gvWdMPHcMomg3SzUZaOo/bv9w==",
+ "dev": true
+ },
+ "@webcomponents/html-imports": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@webcomponents/html-imports/-/html-imports-1.1.1.tgz",
+ "integrity": "sha512-GVywdQzoSGtXv0qlGjqxFefSeLvICsT5QQaEhPKW6swhdIoNtTb6LJ4D/EBcfukgNcOLocplGz99YDVVHnqAEQ==",
+ "dev": true
+ },
+ "@webcomponents/shadycss": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.1.3.tgz",
+ "integrity": "sha512-tGap6j8LVgy8ORM7pL5Yf6u8tTUH0jJaMmA5St/Ijy9WCNttDnrmZTiEF7fl7QQNerzMnCVQHtO0vuX8kybxfQ==",
+ "dev": true
+ },
+ "@webcomponents/shadydom": {
+ "version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/@webcomponents/shadydom/-/shadydom-1.0.14.tgz",
+ "integrity": "sha512-6jhMR4gEJr6xe4pg+GjmOVx8GB2XAaCIEND6+YUV3EcgOIaCG6jl2QJJ4JiuFmJALNBn2sHIsnz6Gvw74F9Mzw==",
+ "dev": true
+ },
+ "@webcomponents/template": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@webcomponents/template/-/template-1.2.4.tgz",
+ "integrity": "sha512-lbhJfT+VuQ9/1hLrX7vkbz+vbJBGwkhnwHeEdajBgDCu5La+FmfnTyBPyYplBN/3yDss9jJ0HMMrKFho3KYXPQ==",
+ "dev": true
+ },
+ "@webcomponents/webcomponents-platform": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@webcomponents/webcomponents-platform/-/webcomponents-platform-1.0.0.tgz",
+ "integrity": "sha1-iHkUY4DdvsuGF+MiSX1Z53w/9Gg=",
+ "dev": true
+ },
+ "@webcomponents/webcomponentsjs": {
+ "version": "1.0.22",
+ "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-1.0.22.tgz",
+ "integrity": "sha512-VREMJxIe5ydR6LdMpg27ojyfL635jH03680na5X2LNLY2UF1GOzNrNOAVaEf2mr+SDUpc9Rey+gt+qCvtbCGhQ==",
+ "dev": true
+ },
+ "accepts": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz",
+ "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=",
+ "dev": true,
+ "requires": {
+ "mime-types": "2.1.17",
+ "negotiator": "0.6.1"
+ }
+ },
+ "accessibility-developer-tools": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz",
+ "integrity": "sha1-PaDM6dbsY3OWS4TzXbfPw996tRQ=",
+ "dev": true
+ },
+ "acorn": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz",
+ "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+ "dev": true,
+ "requires": {
+ "acorn": "3.3.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+ "dev": true
+ }
+ }
+ },
+ "adm-zip": {
+ "version": "0.4.7",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz",
+ "integrity": "sha1-hgbCy/HEJs6MjsABdER/1Jtur8E=",
+ "dev": true,
+ "optional": true
+ },
+ "after": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
+ "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
+ "dev": true
+ },
+ "agent-base": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz",
+ "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "extend": "3.0.1",
+ "semver": "5.0.3"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz",
+ "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "dev": true,
+ "requires": {
+ "co": "4.6.0",
+ "fast-deep-equal": "1.1.0",
+ "fast-json-stable-stringify": "2.0.0",
+ "json-schema-traverse": "0.3.1"
+ }
+ },
+ "ajv-keywords": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
+ "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
+ "dev": true
+ },
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+ "dev": true
+ },
+ "ansi-align": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-1.1.0.tgz",
+ "integrity": "sha1-LwwWWIKXOa3V67FeawxuNCPwFro=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "ansi-cyan": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
+ "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz",
+ "integrity": "sha1-HBg5S2r5t2/5pjUJ+kl2af0s5T4=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4"
+ }
+ },
+ "ansi-escapes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz",
+ "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==",
+ "dev": true
+ },
+ "ansi-gray": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
+ "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-red": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
+ "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "ansi-wrap": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
+ "dev": true
+ },
+ "any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=",
+ "dev": true
+ },
+ "append-field": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/append-field/-/append-field-0.1.0.tgz",
+ "integrity": "sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo=",
+ "dev": true
+ },
+ "archiver": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz",
+ "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=",
+ "dev": true,
+ "requires": {
+ "archiver-utils": "1.3.0",
+ "async": "2.6.0",
+ "buffer-crc32": "0.2.13",
+ "glob": "7.1.2",
+ "lodash": "4.17.4",
+ "readable-stream": "2.3.3",
+ "tar-stream": "1.5.2",
+ "walkdir": "0.0.11",
+ "zip-stream": "1.2.0"
+ }
+ },
+ "archiver-utils": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz",
+ "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2",
+ "graceful-fs": "4.1.11",
+ "lazystream": "1.0.0",
+ "lodash": "4.17.4",
+ "normalize-path": "2.1.1",
+ "readable-stream": "2.3.3"
+ }
+ },
+ "archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
+ "dev": true
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "1.0.3"
+ }
+ },
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0"
+ }
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
+ "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-differ": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
+ "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
+ "dev": true
+ },
+ "array-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
+ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
+ "dev": true
+ },
+ "array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+ "dev": true
+ },
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.0.0.tgz",
+ "integrity": "sha1-5zA08A3MH0CHYAj9IP6ud71LfC8=",
+ "dev": true
+ },
+ "array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "dev": true,
+ "requires": {
+ "array-uniq": "1.0.3"
+ }
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+ "dev": true
+ },
+ "arraybuffer.slice": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
+ "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==",
+ "dev": true
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+ "dev": true
+ },
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+ "dev": true
+ },
+ "asn1": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
+ "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
+ "dev": true
+ },
+ "assert-plus": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
+ "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
+ "dev": true
+ },
+ "assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true
+ },
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "requires": {
+ "lodash": "4.17.4"
+ }
+ },
+ "async-limiter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
+ "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
+ "dev": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-1.1.3.tgz",
+ "integrity": "sha1-lfE2KbEsOlGl0hWr3OKqnzL4B3M=",
+ "dev": true
+ },
+ "aws-sign2": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
+ "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
+ "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "babel-core": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz",
+ "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-generator": "6.26.0",
+ "babel-helpers": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-register": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "convert-source-map": "1.5.0",
+ "debug": "2.6.9",
+ "json5": "0.5.1",
+ "lodash": "4.17.4",
+ "minimatch": "3.0.4",
+ "path-is-absolute": "1.0.1",
+ "private": "0.1.7",
+ "slash": "1.0.0",
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz",
+ "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.4",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "babel-helper-call-delegate": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+ "dev": true,
+ "requires": {
+ "babel-helper-hoist-variables": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-define-map": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
+ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+ "dev": true,
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.4"
+ }
+ },
+ "babel-helper-evaluate-path": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.2.0.tgz",
+ "integrity": "sha512-0EK9TUKMxHL549hWDPkQoS7R0Ozg1CDLheVBHYds2B2qoAvmr9ejY3zOXFsrICK73TN7bPhU14PBeKc8jcBTwg==",
+ "dev": true
+ },
+ "babel-helper-flip-expressions": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.2.0.tgz",
+ "integrity": "sha512-rAsPA1pWBc7e2E6HepkP2e1sXugT+Oq/VCqhyuHJ8aJ2d/ifwnJfd4Qxjm21qlW43AN8tqaeByagKK6wECFMSw==",
+ "dev": true
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-hoist-variables": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-is-nodes-equiv": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz",
+ "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=",
+ "dev": true
+ },
+ "babel-helper-is-void-0": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.2.0.tgz",
+ "integrity": "sha512-Axj1AYuD0E3Dl7nT3KxROP7VekEofz3XtEljzURf3fABalLpr8PamtgLFt+zuxtaCxRf9iuZmbAMMYWri5Bazw==",
+ "dev": true
+ },
+ "babel-helper-mark-eval-scopes": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.2.0.tgz",
+ "integrity": "sha512-KJuwrOUcHbvbh6he4xRXZFLaivK9DF9o3CrvpWnK1Wp0B+1ANYABXBMgwrnNFIDK/AvicxQ9CNr8wsgivlp4Aw==",
+ "dev": true
+ },
+ "babel-helper-optimise-call-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-regex": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
+ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.4"
+ }
+ },
+ "babel-helper-remove-or-void": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.2.0.tgz",
+ "integrity": "sha512-1Z41upf/XR+PwY7Nd+F15Jo5BiQi5205ZXUuKed3yoyQgDkMyoM7vAdjEJS/T+M6jy32sXjskMUgms4zeiVtRA==",
+ "dev": true
+ },
+ "babel-helper-replace-supers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+ "dev": true,
+ "requires": {
+ "babel-helper-optimise-call-expression": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-to-multiple-sequence-expressions": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.2.0.tgz",
+ "integrity": "sha512-ij9lpfdP3+Zc/7kNwa+NXbTrUlsYEWPwt/ugmQO0qflzLrveTIkbfOqQztvitk81aG5NblYDQXDlRohzu3oa8Q==",
+ "dev": true
+ },
+ "babel-helpers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
+ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-minify-builtins": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.2.0.tgz",
+ "integrity": "sha512-4i+8ntaS8gwVUcOz5y+zE+55OVOl2nTbmHV51D4wAIiKcRI8U5K//ip1GHfhsgk/NJrrHK7h97Oy5jpqt0Iixg==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-constant-folding": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.2.0.tgz",
+ "integrity": "sha512-B3ffQBEUQ8ydlIkYv2MkZtTCbV7FAkWAV7NkyhcXlGpD10PaCxNGQ/B9oguXGowR1m16Q5nGhvNn8Pkn1MO6Hw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-dead-code-elimination": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.2.0.tgz",
+ "integrity": "sha512-zE7y3pRyzA4zK5nBou0kTcwUTSQ/AiFrynt1cIEYN7vcO2gS9ZFZoI0aO9JYLUdct5fsC1vfB35408yrzTyVfg==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.2.0",
+ "babel-helper-mark-eval-scopes": "0.2.0",
+ "babel-helper-remove-or-void": "0.2.0",
+ "lodash.some": "4.6.0"
+ }
+ },
+ "babel-plugin-minify-flip-comparisons": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.2.0.tgz",
+ "integrity": "sha512-QOqXSEmD/LhT3LpM1WCyzAGcQZYYKJF7oOHvS6QbpomHenydrV53DMdPX2mK01icBExKZcJAHF209wvDBa+CSg==",
+ "dev": true,
+ "requires": {
+ "babel-helper-is-void-0": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-guarded-expressions": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.2.0.tgz",
+ "integrity": "sha512-5+NSPdRQ9mnrHaA+zFj+D5OzmSiv90EX5zGH6cWQgR/OUqmCHSDqgTRPFvOctgpo8MJyO7Rt7ajs2UfLnlAwYg==",
+ "dev": true,
+ "requires": {
+ "babel-helper-flip-expressions": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-infinity": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.2.0.tgz",
+ "integrity": "sha512-U694vrla1lN6vDHWGrR832t3a/A2eh+kyl019LxEE2+sS4VTydyOPRsAOIYAdJegWRA4cMX1lm9azAN0cLIr8g==",
+ "dev": true
+ },
+ "babel-plugin-minify-mangle-names": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.2.0.tgz",
+ "integrity": "sha512-Gixuak1/CO7VCdjn15/8Bxe/QsAtDG4zPbnsNoe1mIJGCIH/kcmSjFhMlGJtXDQZd6EKzeMfA5WmX9+jvGRefw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-mark-eval-scopes": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-numeric-literals": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.2.0.tgz",
+ "integrity": "sha512-VcLpb+r1YS7+RIOXdRsFVLLqoh22177USpHf+JM/g1nZbzdqENmfd5v534MLAbRErhbz6SyK+NQViVzVtBxu8g==",
+ "dev": true
+ },
+ "babel-plugin-minify-replace": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.2.0.tgz",
+ "integrity": "sha512-SEW6zoSVxh3OH6E1LCgyhhTWMnCv+JIRu5h5IlJDA11tU4ZeSF7uPQcO4vN/o52+FssRB26dmzJ/8D+z0QPg5Q==",
+ "dev": true
+ },
+ "babel-plugin-minify-simplify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.2.0.tgz",
+ "integrity": "sha512-Mj3Mwy2zVosMfXDWXZrQH5/uMAyfJdmDQ1NVqit+ArbHC3LlXVzptuyC1JxTyai/wgFvjLaichm/7vSUshkWqw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-flip-expressions": "0.2.0",
+ "babel-helper-is-nodes-equiv": "0.0.1",
+ "babel-helper-to-multiple-sequence-expressions": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-type-constructors": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.2.0.tgz",
+ "integrity": "sha512-NiOvvA9Pq6bki6nP4BayXwT5GZadw7DJFDDzHmkpnOQpENWe8RtHtKZM44MG1R6EQ5XxgbLdsdhswIzTkFlO5g==",
+ "dev": true,
+ "requires": {
+ "babel-helper-is-void-0": "0.2.0"
+ }
+ },
+ "babel-plugin-transform-es2015-arrow-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-block-scoped-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-block-scoping": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.4"
+ }
+ },
+ "babel-plugin-transform-es2015-classes": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+ "dev": true,
+ "requires": {
+ "babel-helper-define-map": "6.26.0",
+ "babel-helper-function-name": "6.24.1",
+ "babel-helper-optimise-call-expression": "6.24.1",
+ "babel-helper-replace-supers": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-computed-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-destructuring": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-duplicate-keys": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-for-of": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+ "dev": true,
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-amd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-commonjs": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz",
+ "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-strict-mode": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-object-super": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+ "dev": true,
+ "requires": {
+ "babel-helper-replace-supers": "6.24.1",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-parameters": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+ "dev": true,
+ "requires": {
+ "babel-helper-call-delegate": "6.24.1",
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-shorthand-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-spread": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-sticky-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+ "dev": true,
+ "requires": {
+ "babel-helper-regex": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-template-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-typeof-symbol": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-unicode-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+ "dev": true,
+ "requires": {
+ "babel-helper-regex": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "regexpu-core": "2.0.0"
+ }
+ },
+ "babel-plugin-transform-inline-consecutive-adds": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.2.0.tgz",
+ "integrity": "sha512-GlhOuLOQ28ua9prg0hT33HslCrEmz9xWXy9ZNZSACppCyRxxRW+haYtRgm7uYXCcd0q8ggCWD2pfWEJp5iiZfQ==",
+ "dev": true
+ },
+ "babel-plugin-transform-member-expression-literals": {
+ "version": "6.8.5",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.8.5.tgz",
+ "integrity": "sha512-Ux3ligf+ukzWaCbBYOstDuFBhRgMiJHlpJBKV4P47qtzVkd0lg1ddPj9fqIJqAM0n+CvxipyrZrnNnw3CdtQCg==",
+ "dev": true
+ },
+ "babel-plugin-transform-merge-sibling-variables": {
+ "version": "6.8.6",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.8.6.tgz",
+ "integrity": "sha512-o5Jioq553HtEAUN5uty7ELJMenXIxHI3PIs1yLqYWYQwP6mg6IPVAJ+U7i4zr9XGF/kb2RGsdehglGTV+vngqA==",
+ "dev": true
+ },
+ "babel-plugin-transform-minify-booleans": {
+ "version": "6.8.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.8.3.tgz",
+ "integrity": "sha512-bPbUhkeN2Nc0KH0/A19GwQGj8w+CvdJzyu8t59VoEDgsNMQ9Bopzi5DrVkrSsVjbYUaZpzq/DYLrH+wD5K2Tig==",
+ "dev": true
+ },
+ "babel-plugin-transform-property-literals": {
+ "version": "6.8.5",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.8.5.tgz",
+ "integrity": "sha512-MmiQsQ5AcIaRZMJD0zY5C4H3xuHm06/nWgtOsz7AXV44VEIXIlPiJ39IFYJ4Qx67/fEm8zJAedzR8t+B7d10Bg==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "babel-plugin-transform-regenerator": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
+ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+ "dev": true,
+ "requires": {
+ "regenerator-transform": "0.10.1"
+ }
+ },
+ "babel-plugin-transform-regexp-constructors": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.2.0.tgz",
+ "integrity": "sha512-7IsQ6aQx6LAaOqy97/PthTf+5Nx9grZww3r6E62IdWe76Yr8KsuwVjxzqSPQvESJqTE3EMADQ9S0RtwWDGNG9Q==",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-console": {
+ "version": "6.8.5",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.8.5.tgz",
+ "integrity": "sha512-uuCKvtweCyIvvC8fi92EcWRtO2Kt5KMNMRK6BhpDXdeb3sxvGM7453RSmgeu4DlKns3OlvY9Ep5Q9m5a7RQAgg==",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-debugger": {
+ "version": "6.8.5",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.8.5.tgz",
+ "integrity": "sha512-InDQDdHPOLJKM+G6oXrEesf+P29QFBmcTXID+TAvZziVz+38xe2VO/Bn3FcRcRtnOOycbgsJkUNp9jIK+ist6g==",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-undefined": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.2.0.tgz",
+ "integrity": "sha512-O8v57tPMHkp89kA4ZfQEYds/pzgvz/QYerBJjIuL5/Jc7RnvMVRA5gJY9zFKP7WayW8WOSBV4vh8Y8FJRio+ow==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.2.0"
+ }
+ },
+ "babel-plugin-transform-simplify-comparison-operators": {
+ "version": "6.8.5",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.8.5.tgz",
+ "integrity": "sha512-B3HlBZb+Uq86nRj5yNPO6pJ3noEdqHvzYkEYoUWtrsWTv48ZIRatYlumoOiif/v8llF13YjYjx9zhyznDx+N9g==",
+ "dev": true
+ },
+ "babel-plugin-transform-strict-mode": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-undefined-to-void": {
+ "version": "6.8.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.8.3.tgz",
+ "integrity": "sha512-goYwp8dMrzHD6x9GjZ2M85Mk2vxf1h85CnUgAjfftUnlJvzF4uj5MrbReHBTbjQ96C8CuRzvhYZ3tv8H3Sc1ZA==",
+ "dev": true
+ },
+ "babel-preset-minify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.2.0.tgz",
+ "integrity": "sha512-mR8Q44RmMzm18bM2Lqd9uiPopzk5GDCtVuquNbLFmX6lOKnqWoenaNBxnWW0UhBFC75lEHTIgNGCbnsRI0pJVw==",
+ "dev": true,
+ "requires": {
+ "babel-plugin-minify-builtins": "0.2.0",
+ "babel-plugin-minify-constant-folding": "0.2.0",
+ "babel-plugin-minify-dead-code-elimination": "0.2.0",
+ "babel-plugin-minify-flip-comparisons": "0.2.0",
+ "babel-plugin-minify-guarded-expressions": "0.2.0",
+ "babel-plugin-minify-infinity": "0.2.0",
+ "babel-plugin-minify-mangle-names": "0.2.0",
+ "babel-plugin-minify-numeric-literals": "0.2.0",
+ "babel-plugin-minify-replace": "0.2.0",
+ "babel-plugin-minify-simplify": "0.2.0",
+ "babel-plugin-minify-type-constructors": "0.2.0",
+ "babel-plugin-transform-inline-consecutive-adds": "0.2.0",
+ "babel-plugin-transform-member-expression-literals": "6.8.5",
+ "babel-plugin-transform-merge-sibling-variables": "6.8.6",
+ "babel-plugin-transform-minify-booleans": "6.8.3",
+ "babel-plugin-transform-property-literals": "6.8.5",
+ "babel-plugin-transform-regexp-constructors": "0.2.0",
+ "babel-plugin-transform-remove-console": "6.8.5",
+ "babel-plugin-transform-remove-debugger": "6.8.5",
+ "babel-plugin-transform-remove-undefined": "0.2.0",
+ "babel-plugin-transform-simplify-comparison-operators": "6.8.5",
+ "babel-plugin-transform-undefined-to-void": "6.8.3",
+ "lodash.isplainobject": "4.0.6"
+ }
+ },
+ "babel-register": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
+ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+ "dev": true,
+ "requires": {
+ "babel-core": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "core-js": "2.5.1",
+ "home-or-tmp": "2.0.0",
+ "lodash": "4.17.4",
+ "mkdirp": "0.5.1",
+ "source-map-support": "0.4.18"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.1",
+ "regenerator-runtime": "0.11.0"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.4"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.2",
+ "lodash": "4.17.4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.4",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "backo2": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+ "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base64-arraybuffer": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
+ "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
+ "dev": true
+ },
+ "base64-js": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz",
+ "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=",
+ "dev": true,
+ "optional": true
+ },
+ "base64id": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
+ "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=",
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
+ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "beeper": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz",
+ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=",
+ "dev": true
+ },
+ "better-assert": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
+ "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
+ "dev": true,
+ "requires": {
+ "callsite": "1.0.0"
+ }
+ },
+ "bl": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz",
+ "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.3"
+ }
+ },
+ "blob": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
+ "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=",
+ "dev": true
+ },
+ "body-parser": {
+ "version": "1.18.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
+ "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
+ "dev": true,
+ "requires": {
+ "bytes": "3.0.0",
+ "content-type": "1.0.4",
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "http-errors": "1.6.2",
+ "iconv-lite": "0.4.19",
+ "on-finished": "2.3.0",
+ "qs": "6.5.1",
+ "raw-body": "2.3.2",
+ "type-is": "1.6.15"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "boom": {
+ "version": "2.10.1",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
+ "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
+ "dev": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "boxen": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-0.6.0.tgz",
+ "integrity": "sha1-g2TUJIrDT/DvGy8r9JpsYM4NgbY=",
+ "dev": true,
+ "requires": {
+ "ansi-align": "1.1.0",
+ "camelcase": "2.1.1",
+ "chalk": "1.1.3",
+ "cli-boxes": "1.0.0",
+ "filled-array": "1.1.0",
+ "object-assign": "4.1.1",
+ "repeating": "2.0.1",
+ "string-width": "1.0.2",
+ "widest-line": "1.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
+ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "dev": true,
+ "requires": {
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.2"
+ }
+ },
+ "browser-capabilities": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/browser-capabilities/-/browser-capabilities-0.2.2.tgz",
+ "integrity": "sha512-iS5g9+yT/T7jr9BTjDi5Hu2soieyce457ad+fdp6uDlYp6pacX7ZG/nYtCZ+KQiMCxRfbd65OhAg7GbVJ3RcBw==",
+ "dev": true,
+ "requires": {
+ "@types/ua-parser-js": "0.7.32",
+ "ua-parser-js": "0.7.17"
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
+ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
+ "dev": true
+ },
+ "browserstack": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.0.tgz",
+ "integrity": "sha1-tWVCWtYu1ywQgqHrl51TE8fUdU8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "https-proxy-agent": "1.0.0"
+ }
+ },
+ "buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
+ "dev": true
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "busboy": {
+ "version": "0.2.14",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz",
+ "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=",
+ "dev": true,
+ "requires": {
+ "dicer": "0.2.5",
+ "readable-stream": "1.1.14"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+ "dev": true
+ },
+ "caller-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+ "dev": true,
+ "requires": {
+ "callsites": "0.2.0"
+ }
+ },
+ "callsite": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
+ "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
+ "dev": true
+ },
+ "callsites": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "2.1.1",
+ "map-obj": "1.0.1"
+ }
+ },
+ "capture-stack-trace": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz",
+ "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
+ "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
+ "dev": true
+ },
+ "chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
+ "dev": true,
+ "requires": {
+ "assertion-error": "1.1.0",
+ "check-error": "1.0.2",
+ "deep-eql": "3.0.1",
+ "get-func-name": "2.0.0",
+ "pathval": "1.1.0",
+ "type-detect": "4.0.7"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "chardet": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
+ "dev": true
+ },
+ "charenc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+ "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=",
+ "dev": true
+ },
+ "check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+ "dev": true
+ },
+ "circular-json": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
+ "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
+ "dev": true
+ },
+ "cleankill": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/cleankill/-/cleankill-2.0.0.tgz",
+ "integrity": "sha1-WYMN/ItBHVPccq0J1Fp46jMWGpE=",
+ "dev": true
+ },
+ "cli-boxes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
+ "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
+ "dev": true
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "2.0.0"
+ }
+ },
+ "cli-width": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+ "dev": true
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "clone-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+ "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
+ "dev": true
+ },
+ "cloneable-readable": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz",
+ "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "process-nextick-args": "1.0.7",
+ "through2": "2.0.3"
+ }
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "dev": true
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
+ "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "1.0.0"
+ }
+ },
+ "command-line-args": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-3.0.5.tgz",
+ "integrity": "sha1-W9StReeYPlwTRJGOQCgO4mk8WsA=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "find-replace": "1.0.3",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-3.0.8.tgz",
+ "integrity": "sha1-tqIJeMGzg0d/XBGlKUKLiAv+D00=",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "3.0.0",
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "table-layout": "0.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "commander": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
+ "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
+ "dev": true,
+ "requires": {
+ "graceful-readlink": "1.0.1"
+ }
+ },
+ "component-bind": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
+ "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
+ "dev": true
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "component-inherit": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
+ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
+ "dev": true
+ },
+ "compress-commons": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz",
+ "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=",
+ "dev": true,
+ "requires": {
+ "buffer-crc32": "0.2.13",
+ "crc32-stream": "2.0.0",
+ "normalize-path": "2.1.1",
+ "readable-stream": "2.3.3"
+ }
+ },
+ "compressible": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.12.tgz",
+ "integrity": "sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY=",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.30.0"
+ }
+ },
+ "compression": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.1.tgz",
+ "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=",
+ "dev": true,
+ "requires": {
+ "accepts": "1.3.4",
+ "bytes": "3.0.0",
+ "compressible": "2.0.12",
+ "debug": "2.6.9",
+ "on-headers": "1.0.1",
+ "safe-buffer": "5.1.1",
+ "vary": "1.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "concat-stream": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
+ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.3",
+ "typedarray": "0.0.6"
+ }
+ },
+ "concat-with-sourcemaps": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.0.5.tgz",
+ "integrity": "sha512-YtnS0VEY+e2Khzsey/6mra9EoM6h/5gxaC0e3mcHpA5yfDxafhygytNmcJWodvUgyXzSiL5MSkPO6bQGgfliHw==",
+ "dev": true,
+ "requires": {
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "configstore": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz",
+ "integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=",
+ "dev": true,
+ "requires": {
+ "dot-prop": "3.0.0",
+ "graceful-fs": "4.1.11",
+ "mkdirp": "0.5.1",
+ "object-assign": "4.1.1",
+ "os-tmpdir": "1.0.2",
+ "osenv": "0.1.4",
+ "uuid": "2.0.3",
+ "write-file-atomic": "1.3.4",
+ "xdg-basedir": "2.0.0"
+ }
+ },
+ "content-disposition": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+ "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
+ "dev": true
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "dev": true
+ },
+ "convert-source-map": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz",
+ "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=",
+ "dev": true
+ },
+ "cookie": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
+ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
+ "dev": true
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz",
+ "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "crc": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/crc/-/crc-3.2.1.tgz",
+ "integrity": "sha1-XZyPt3okXNXsopHl0tAFM0urAII=",
+ "dev": true
+ },
+ "crc32-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz",
+ "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=",
+ "dev": true,
+ "requires": {
+ "crc": "3.5.0",
+ "readable-stream": "2.3.3"
+ },
+ "dependencies": {
+ "crc": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz",
+ "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=",
+ "dev": true
+ }
+ }
+ },
+ "create-error-class": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+ "dev": true,
+ "requires": {
+ "capture-stack-trace": "1.0.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "4.1.1",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ }
+ },
+ "crypt": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+ "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=",
+ "dev": true
+ },
+ "cryptiles": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
+ "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
+ "dev": true,
+ "requires": {
+ "boom": "2.10.1"
+ }
+ },
+ "crypto-random-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
+ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
+ "dev": true,
+ "optional": true
+ },
+ "css": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/css/-/css-2.2.1.tgz",
+ "integrity": "sha1-c6TIHehdtmTU7mdPfUcIXjstVdw=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "source-map": "0.1.43",
+ "source-map-resolve": "0.3.1",
+ "urix": "0.1.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.1.43",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
+ "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
+ "dev": true,
+ "requires": {
+ "amdefine": "1.0.1"
+ }
+ }
+ }
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "dev": true,
+ "requires": {
+ "array-find-index": "1.0.2"
+ }
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "d": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
+ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
+ "dev": true,
+ "requires": {
+ "es5-ext": "0.10.38"
+ }
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "dateformat": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
+ "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "debug-fabulous": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.0.0.tgz",
+ "integrity": "sha512-dsd50qQ1atDeurcxL7XOjPp4nZCGZzWIONDujDXzl1atSyC3hMbZD+v6440etw+Vt0Pr8ce4TQzHfX3KZM05Mw==",
+ "dev": true,
+ "requires": {
+ "debug": "3.1.0",
+ "memoizee": "0.4.11",
+ "object-assign": "4.1.1"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "deep-eql": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "dev": true,
+ "requires": {
+ "type-detect": "4.0.7"
+ }
+ },
+ "deep-extend": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
+ "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "defaults": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.2"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz",
+ "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=",
+ "dev": true
+ }
+ }
+ },
+ "del": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
+ "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
+ "dev": true,
+ "requires": {
+ "globby": "6.1.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.0",
+ "p-map": "1.2.0",
+ "pify": "3.0.0",
+ "rimraf": "2.6.2"
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true
+ },
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+ "dev": true
+ },
+ "deprecated": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz",
+ "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=",
+ "dev": true
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+ "dev": true
+ },
+ "detect-file": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz",
+ "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=",
+ "dev": true,
+ "requires": {
+ "fs-exists-sync": "0.1.0"
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "detect-newline": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
+ "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=",
+ "dev": true
+ },
+ "detect-node": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz",
+ "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=",
+ "dev": true
+ },
+ "dicer": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz",
+ "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.1.14",
+ "streamsearch": "0.1.2"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "diff": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz",
+ "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom-urls": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz",
+ "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=",
+ "dev": true,
+ "requires": {
+ "urijs": "1.19.0"
+ }
+ },
+ "dom5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz",
+ "integrity": "sha1-+CBJdb0NrLvltYqKk//B/tD/zSo=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "6.0.96",
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "2.2.3"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.96",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.96.tgz",
+ "integrity": "sha512-fsOOY6tMQ3jCB2wD51XFDmmpgm4wVKkJECdcVRqapbJEa7awJDcr+SaH8toz+4r4KW8YQ3M7ybXMoSDo1QGewA==",
+ "dev": true
+ }
+ }
+ },
+ "dot-prop": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz",
+ "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=",
+ "dev": true,
+ "requires": {
+ "is-obj": "1.0.1"
+ }
+ },
+ "duplexer": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
+ "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
+ "dev": true
+ },
+ "duplexer2": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
+ "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.1.14"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "duplexer3": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+ "dev": true,
+ "optional": true
+ },
+ "duplexify": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.3.tgz",
+ "integrity": "sha512-g8ID9OroF9hKt2POf8YLayy+9594PzmM3scI00/uBXocX3TWNgoB67hjzkFe9ITAbQOne/lLdBxHXvYUM4ZgGA==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.3",
+ "stream-shift": "1.0.0"
+ },
+ "dependencies": {
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0"
+ }
+ }
+ }
+ },
+ "ecc-jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
+ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "jsbn": "0.1.1"
+ }
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+ "dev": true
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+ "dev": true
+ },
+ "end-of-stream": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz",
+ "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=",
+ "dev": true,
+ "requires": {
+ "once": "1.3.3"
+ },
+ "dependencies": {
+ "once": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
+ "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ }
+ }
+ },
+ "engine.io": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.4.tgz",
+ "integrity": "sha1-PQIRtwpVLOhB/8fahiezAamkFi4=",
+ "dev": true,
+ "requires": {
+ "accepts": "1.3.3",
+ "base64id": "1.0.0",
+ "cookie": "0.3.1",
+ "debug": "2.6.9",
+ "engine.io-parser": "2.1.2",
+ "uws": "0.14.5",
+ "ws": "3.3.3"
+ },
+ "dependencies": {
+ "accepts": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz",
+ "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=",
+ "dev": true,
+ "requires": {
+ "mime-types": "2.1.17",
+ "negotiator": "0.6.1"
+ }
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "engine.io-client": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.4.tgz",
+ "integrity": "sha1-T88TcLRxY70s6b4nM5ckMDUNTqE=",
+ "dev": true,
+ "requires": {
+ "component-emitter": "1.2.1",
+ "component-inherit": "0.0.3",
+ "debug": "2.6.9",
+ "engine.io-parser": "2.1.2",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "parseqs": "0.0.5",
+ "parseuri": "0.0.5",
+ "ws": "3.3.3",
+ "xmlhttprequest-ssl": "1.5.5",
+ "yeast": "0.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "engine.io-parser": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz",
+ "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==",
+ "dev": true,
+ "requires": {
+ "after": "0.8.2",
+ "arraybuffer.slice": "0.0.7",
+ "base64-arraybuffer": "0.1.5",
+ "blob": "0.0.4",
+ "has-binary2": "1.0.2"
+ }
+ },
+ "error-ex": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "0.2.1"
+ }
+ },
+ "es5-ext": {
+ "version": "0.10.38",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.38.tgz",
+ "integrity": "sha512-jCMyePo7AXbUESwbl8Qi01VSH2piY9s/a3rSU/5w/MlTIx8HPL1xn2InGN8ejt/xulcJgnTO7vqNtOAxzYd2Kg==",
+ "dev": true,
+ "requires": {
+ "es6-iterator": "2.0.3",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "es6-promise": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.1.1.tgz",
+ "integrity": "sha512-OaU1hHjgJf+b0NzsxCg7NdIYERD6Hy/PEmFLTjw+b65scuisG3Kt4QoTvJ66BBkPZ581gr0kpoVzKnxniM8nng==",
+ "dev": true
+ },
+ "es6-symbol": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38"
+ }
+ },
+ "es6-weak-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
+ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38",
+ "es6-iterator": "2.0.3",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz",
+ "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ }
+ }
+ },
+ "eslint": {
+ "version": "4.19.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
+ "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "babel-code-frame": "6.26.0",
+ "chalk": "2.3.0",
+ "concat-stream": "1.6.0",
+ "cross-spawn": "5.1.0",
+ "debug": "3.1.0",
+ "doctrine": "2.1.0",
+ "eslint-scope": "3.7.1",
+ "eslint-visitor-keys": "1.0.0",
+ "espree": "3.5.4",
+ "esquery": "1.0.0",
+ "esutils": "2.0.2",
+ "file-entry-cache": "2.0.0",
+ "functional-red-black-tree": "1.0.1",
+ "glob": "7.1.2",
+ "globals": "11.3.0",
+ "ignore": "3.3.7",
+ "imurmurhash": "0.1.4",
+ "inquirer": "3.3.0",
+ "is-resolvable": "1.1.0",
+ "js-yaml": "3.11.0",
+ "json-stable-stringify-without-jsonify": "1.0.1",
+ "levn": "0.3.0",
+ "lodash": "4.17.4",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.1",
+ "natural-compare": "1.4.0",
+ "optionator": "0.8.2",
+ "path-is-inside": "1.0.2",
+ "pluralize": "7.0.0",
+ "progress": "2.0.0",
+ "regexpp": "1.0.1",
+ "require-uncached": "1.0.3",
+ "semver": "5.5.0",
+ "strip-ansi": "4.0.0",
+ "strip-json-comments": "2.0.1",
+ "table": "4.0.2",
+ "text-table": "0.2.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
+ "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==",
+ "dev": true
+ },
+ "espree": {
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
+ "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
+ "dev": true,
+ "requires": {
+ "acorn": "5.5.3",
+ "acorn-jsx": "3.0.1"
+ }
+ },
+ "globals": {
+ "version": "11.3.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz",
+ "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-scope": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
+ "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
+ "dev": true,
+ "requires": {
+ "esrecurse": "4.2.1",
+ "estraverse": "4.2.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
+ "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
+ "dev": true
+ },
+ "espree": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz",
+ "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==",
+ "dev": true,
+ "requires": {
+ "acorn": "5.3.0",
+ "acorn-jsx": "3.0.1"
+ }
+ },
+ "esprima": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
+ "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz",
+ "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=",
+ "dev": true,
+ "requires": {
+ "estraverse": "4.2.0"
+ }
+ },
+ "esrecurse": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
+ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+ "dev": true,
+ "requires": {
+ "estraverse": "4.2.0"
+ }
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "estree-walker": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.2.1.tgz",
+ "integrity": "sha1-va/oCVOD2EFNXcLs9MkXO225QS4=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+ "dev": true
+ },
+ "event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38"
+ }
+ },
+ "event-stream": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.1.7.tgz",
+ "integrity": "sha1-tMVAAS0P4UmEIPPYlGAI22OTw3o=",
+ "dev": true,
+ "requires": {
+ "duplexer": "0.1.1",
+ "from": "0.1.7",
+ "map-stream": "0.1.0",
+ "pause-stream": "0.0.11",
+ "split": "0.2.10",
+ "stream-combiner": "0.0.4",
+ "through": "2.3.8"
+ }
+ },
+ "eventemitter3": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz",
+ "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=",
+ "dev": true
+ },
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "cross-spawn": "5.1.0",
+ "get-stream": "3.0.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.2",
+ "strip-eof": "1.0.0"
+ }
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "dev": true,
+ "requires": {
+ "is-posix-bracket": "0.1.1"
+ }
+ },
+ "expand-range": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+ "dev": true,
+ "requires": {
+ "fill-range": "2.2.3"
+ }
+ },
+ "expand-tilde": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz",
+ "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "express": {
+ "version": "4.16.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz",
+ "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=",
+ "dev": true,
+ "requires": {
+ "accepts": "1.3.4",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.18.2",
+ "content-disposition": "0.5.2",
+ "content-type": "1.0.4",
+ "cookie": "0.3.1",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.8.1",
+ "finalhandler": "1.1.0",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "1.1.2",
+ "on-finished": "2.3.0",
+ "parseurl": "1.3.2",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "2.0.2",
+ "qs": "6.5.1",
+ "range-parser": "1.2.0",
+ "safe-buffer": "5.1.1",
+ "send": "0.16.1",
+ "serve-static": "1.13.1",
+ "setprototypeof": "1.1.0",
+ "statuses": "1.3.1",
+ "type-is": "1.6.15",
+ "utils-merge": "1.0.1",
+ "vary": "1.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "send": {
+ "version": "0.16.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz",
+ "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "destroy": "1.0.4",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "1.6.2",
+ "mime": "1.4.1",
+ "ms": "2.0.0",
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.0",
+ "statuses": "1.3.1"
+ }
+ },
+ "setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+ "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+ "dev": true
+ }
+ }
+ },
+ "extend": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
+ "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
+ "dev": true,
+ "requires": {
+ "kind-of": "1.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
+ "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
+ "dev": true
+ }
+ }
+ },
+ "external-editor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz",
+ "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==",
+ "dev": true,
+ "requires": {
+ "chardet": "0.4.2",
+ "iconv-lite": "0.4.19",
+ "tmp": "0.0.33"
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fancy-log": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz",
+ "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "time-stamp": "1.1.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "fast-deep-equal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+ "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fd-slicer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
+ "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "pend": "1.2.0"
+ }
+ },
+ "feature-detect-es6": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/feature-detect-es6/-/feature-detect-es6-1.4.0.tgz",
+ "integrity": "sha512-7OnRV38WLydGuGcdm/fGk2SG9uo5ljslBSbPhCfEW5Gl0lX/IliaAVXYiYUBcI0UHTbepqO4T1SkJ74K8gtcDg==",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4"
+ }
+ },
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "file-entry-cache": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
+ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+ "dev": true,
+ "requires": {
+ "flat-cache": "1.3.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "filename-regex": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
+ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
+ "dev": true,
+ "requires": {
+ "is-number": "2.1.0",
+ "isobject": "2.1.0",
+ "randomatic": "1.1.7",
+ "repeat-element": "1.1.2",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "filled-array": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/filled-array/-/filled-array-1.1.0.tgz",
+ "integrity": "sha1-w8T2xmO5I0WamqKZEtLQMfFQf4Q=",
+ "dev": true
+ },
+ "finalhandler": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
+ "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "on-finished": "2.3.0",
+ "parseurl": "1.3.2",
+ "statuses": "1.3.1",
+ "unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "statuses": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+ "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+ "dev": true
+ }
+ }
+ },
+ "find-index": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz",
+ "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=",
+ "dev": true
+ },
+ "find-port": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/find-port/-/find-port-1.0.1.tgz",
+ "integrity": "sha1-2whKbL+ZVk2Zhprnn73s9m6KGFw=",
+ "dev": true,
+ "requires": {
+ "async": "0.2.10"
+ },
+ "dependencies": {
+ "async": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
+ "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
+ "dev": true
+ }
+ }
+ },
+ "find-replace": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz",
+ "integrity": "sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "test-value": "2.1.0"
+ }
+ },
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "requires": {
+ "path-exists": "2.1.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "findup-sync": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz",
+ "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=",
+ "dev": true,
+ "requires": {
+ "detect-file": "0.1.0",
+ "is-glob": "2.0.1",
+ "micromatch": "2.3.11",
+ "resolve-dir": "0.1.1"
+ }
+ },
+ "fined": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz",
+ "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "is-plain-object": "2.0.4",
+ "object.defaults": "1.1.0",
+ "object.pick": "1.3.0",
+ "parse-filepath": "1.0.1"
+ },
+ "dependencies": {
+ "expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "1.0.1"
+ }
+ }
+ }
+ },
+ "first-chunk-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz",
+ "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=",
+ "dev": true
+ },
+ "flagged-respawn": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz",
+ "integrity": "sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU=",
+ "dev": true
+ },
+ "flat-cache": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
+ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
+ "dev": true,
+ "requires": {
+ "circular-json": "0.3.3",
+ "del": "2.2.2",
+ "graceful-fs": "4.1.11",
+ "write": "0.2.1"
+ },
+ "dependencies": {
+ "del": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "dev": true,
+ "requires": {
+ "globby": "5.0.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.0",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "rimraf": "2.6.2"
+ }
+ },
+ "globby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+ "dev": true,
+ "requires": {
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "for-own": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "dev": true
+ },
+ "form-data": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
+ "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
+ "dev": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.5",
+ "mime-types": "2.1.17"
+ }
+ },
+ "formatio": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz",
+ "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=",
+ "dev": true,
+ "requires": {
+ "samsam": "1.3.0"
+ }
+ },
+ "forwarded": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+ "dev": true
+ },
+ "freeport": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/freeport/-/freeport-1.0.5.tgz",
+ "integrity": "sha1-JV6KuEFwwzuoXZkOghrl9KGpvF0=",
+ "dev": true,
+ "optional": true
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+ "dev": true
+ },
+ "from": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
+ "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=",
+ "dev": true
+ },
+ "fs-exists-sync": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
+ "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "gaze": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz",
+ "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=",
+ "dev": true,
+ "requires": {
+ "globule": "0.1.0"
+ }
+ },
+ "generate-function": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
+ "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=",
+ "dev": true
+ },
+ "generate-object-property": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
+ "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
+ "dev": true,
+ "requires": {
+ "is-property": "1.0.2"
+ }
+ },
+ "get-func-name": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+ "dev": true
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-base": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+ "dev": true,
+ "requires": {
+ "glob-parent": "2.0.0",
+ "is-glob": "2.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+ "dev": true,
+ "requires": {
+ "is-glob": "2.0.1"
+ }
+ },
+ "glob-stream": {
+ "version": "3.1.18",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz",
+ "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=",
+ "dev": true,
+ "requires": {
+ "glob": "4.5.3",
+ "glob2base": "0.0.12",
+ "minimatch": "2.0.10",
+ "ordered-read-streams": "0.1.0",
+ "through2": "0.6.5",
+ "unique-stream": "1.0.0"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "4.5.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz",
+ "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=",
+ "dev": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "2.0.10",
+ "once": "1.4.0"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz",
+ "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.8"
+ }
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "glob-watcher": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz",
+ "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=",
+ "dev": true,
+ "requires": {
+ "gaze": "0.5.2"
+ }
+ },
+ "glob2base": {
+ "version": "0.0.12",
+ "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz",
+ "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=",
+ "dev": true,
+ "requires": {
+ "find-index": "0.1.1"
+ }
+ },
+ "global-dirs": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+ "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ini": "1.3.4"
+ }
+ },
+ "global-modules": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz",
+ "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=",
+ "dev": true,
+ "requires": {
+ "global-prefix": "0.1.5",
+ "is-windows": "0.2.0"
+ }
+ },
+ "global-prefix": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz",
+ "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "1.0.1",
+ "ini": "1.3.4",
+ "is-windows": "0.2.0",
+ "which": "1.3.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+ "dev": true,
+ "requires": {
+ "array-union": "1.0.2",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "globule": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz",
+ "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=",
+ "dev": true,
+ "requires": {
+ "glob": "3.1.21",
+ "lodash": "1.0.2",
+ "minimatch": "0.2.14"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "3.1.21",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz",
+ "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "1.2.3",
+ "inherits": "1.0.2",
+ "minimatch": "0.2.14"
+ }
+ },
+ "graceful-fs": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
+ "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
+ "dev": true
+ },
+ "inherits": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz",
+ "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=",
+ "dev": true
+ },
+ "lodash": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz",
+ "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
+ "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "0.2.14",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
+ "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "2.7.3",
+ "sigmund": "1.0.1"
+ }
+ }
+ }
+ },
+ "glogg": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz",
+ "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=",
+ "dev": true,
+ "requires": {
+ "sparkles": "1.0.0"
+ }
+ },
+ "google-closure-compiler": {
+ "version": "20171203.0.0",
+ "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20171203.0.0.tgz",
+ "integrity": "sha1-gpW5QFo145HB2I0IJYBo4x0TEaE=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "vinyl": "2.1.0",
+ "vinyl-sourcemaps-apply": "0.2.1"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "got": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz",
+ "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=",
+ "dev": true,
+ "requires": {
+ "create-error-class": "3.0.2",
+ "duplexer2": "0.1.4",
+ "is-redirect": "1.0.0",
+ "is-retry-allowed": "1.1.0",
+ "is-stream": "1.1.0",
+ "lowercase-keys": "1.0.0",
+ "node-status-codes": "1.0.0",
+ "object-assign": "4.1.1",
+ "parse-json": "2.2.0",
+ "pinkie-promise": "2.0.1",
+ "read-all-stream": "3.1.0",
+ "readable-stream": "2.3.3",
+ "timed-out": "3.1.3",
+ "unzip-response": "1.0.2",
+ "url-parse-lax": "1.0.0"
+ },
+ "dependencies": {
+ "duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.3"
+ }
+ }
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "graceful-readlink": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
+ "dev": true
+ },
+ "growl": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz",
+ "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=",
+ "dev": true
+ },
+ "gulp": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz",
+ "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=",
+ "dev": true,
+ "requires": {
+ "archy": "1.0.0",
+ "chalk": "1.1.3",
+ "deprecated": "0.0.1",
+ "gulp-util": "3.0.8",
+ "interpret": "1.0.4",
+ "liftoff": "2.3.0",
+ "minimist": "1.2.0",
+ "orchestrator": "0.3.8",
+ "pretty-hrtime": "1.0.3",
+ "semver": "4.3.6",
+ "tildify": "1.2.0",
+ "v8flags": "2.1.1",
+ "vinyl-fs": "0.3.14"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "semver": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
+ "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "gulp-add-src": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/gulp-add-src/-/gulp-add-src-0.2.0.tgz",
+ "integrity": "sha1-nhApRhn5Gg5/QhfE9eUYQbzb7xc=",
+ "dev": true,
+ "requires": {
+ "event-stream": "3.1.7",
+ "streamqueue": "0.1.3",
+ "through2": "0.4.2",
+ "vinyl-fs": "0.3.14"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz",
+ "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "2.1.2"
+ }
+ },
+ "xtend": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
+ "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
+ "dev": true,
+ "requires": {
+ "object-keys": "0.4.0"
+ }
+ }
+ }
+ },
+ "gulp-header": {
+ "version": "1.8.12",
+ "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz",
+ "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==",
+ "dev": true,
+ "requires": {
+ "concat-with-sourcemaps": "1.0.5",
+ "lodash.template": "4.4.0",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "lodash.template": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz",
+ "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.templatesettings": "4.1.0"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz",
+ "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0"
+ }
+ }
+ }
+ },
+ "gulp-rename": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz",
+ "integrity": "sha1-OtRCh2PwXidk3sHGfYaNsnVoeBc=",
+ "dev": true
+ },
+ "gulp-sourcemaps": {
+ "version": "2.6.4",
+ "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.4.tgz",
+ "integrity": "sha1-y7IAhFCxvM5s0jv5gze+dRv24wo=",
+ "dev": true,
+ "requires": {
+ "@gulp-sourcemaps/identity-map": "1.0.1",
+ "@gulp-sourcemaps/map-sources": "1.0.0",
+ "acorn": "5.3.0",
+ "convert-source-map": "1.5.0",
+ "css": "2.2.1",
+ "debug-fabulous": "1.0.0",
+ "detect-newline": "2.1.0",
+ "graceful-fs": "4.1.11",
+ "source-map": "0.6.1",
+ "strip-bom-string": "1.0.0",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "gulp-util": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
+ "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
+ "dev": true,
+ "requires": {
+ "array-differ": "1.0.0",
+ "array-uniq": "1.0.3",
+ "beeper": "1.1.1",
+ "chalk": "1.1.3",
+ "dateformat": "2.2.0",
+ "fancy-log": "1.3.0",
+ "gulplog": "1.0.0",
+ "has-gulplog": "0.1.0",
+ "lodash._reescape": "3.0.0",
+ "lodash._reevaluate": "3.0.0",
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.template": "3.6.2",
+ "minimist": "1.2.0",
+ "multipipe": "0.1.2",
+ "object-assign": "3.0.0",
+ "replace-ext": "0.0.1",
+ "through2": "2.0.3",
+ "vinyl": "0.5.3"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz",
+ "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
+ "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
+ "dev": true
+ },
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "vinyl": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
+ "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.2",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ }
+ }
+ },
+ "gulplog": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
+ "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
+ "dev": true,
+ "requires": {
+ "glogg": "1.0.0"
+ }
+ },
+ "handle-thing": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz",
+ "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
+ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "commander": "2.9.0",
+ "is-my-json-valid": "2.17.1",
+ "pinkie-promise": "2.0.1"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-binary2": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz",
+ "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=",
+ "dev": true,
+ "requires": {
+ "isarray": "2.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+ "dev": true
+ }
+ }
+ },
+ "has-color": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz",
+ "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=",
+ "dev": true
+ },
+ "has-cors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+ "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+ "dev": true
+ },
+ "has-gulplog": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz",
+ "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
+ "dev": true,
+ "requires": {
+ "sparkles": "1.0.0"
+ }
+ },
+ "hawk": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+ "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+ "dev": true,
+ "requires": {
+ "boom": "2.10.1",
+ "cryptiles": "2.0.5",
+ "hoek": "2.16.3",
+ "sntp": "1.0.9"
+ }
+ },
+ "he": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+ "dev": true
+ },
+ "hoek": {
+ "version": "2.16.3",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
+ "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
+ "dev": true
+ },
+ "home-or-tmp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
+ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "homedir-polyfill": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
+ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
+ "dev": true,
+ "requires": {
+ "parse-passwd": "1.0.0"
+ }
+ },
+ "hosted-git-info": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
+ "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==",
+ "dev": true
+ },
+ "hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "obuf": "1.1.1",
+ "readable-stream": "2.3.3",
+ "wbuf": "1.7.2"
+ }
+ },
+ "http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
+ "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
+ "dev": true,
+ "requires": {
+ "depd": "1.1.1",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.0.3",
+ "statuses": "1.4.0"
+ },
+ "dependencies": {
+ "depd": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
+ "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
+ "dev": true
+ }
+ }
+ },
+ "http-proxy": {
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz",
+ "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=",
+ "dev": true,
+ "requires": {
+ "eventemitter3": "1.2.0",
+ "requires-port": "1.0.0"
+ }
+ },
+ "http-proxy-middleware": {
+ "version": "0.17.4",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz",
+ "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=",
+ "dev": true,
+ "requires": {
+ "http-proxy": "1.16.2",
+ "is-glob": "3.1.0",
+ "lodash": "4.17.4",
+ "micromatch": "2.3.11"
+ },
+ "dependencies": {
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "http-signature": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
+ "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "0.2.0",
+ "jsprim": "1.4.1",
+ "sshpk": "1.13.1"
+ }
+ },
+ "https-proxy-agent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz",
+ "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "agent-base": "2.1.1",
+ "debug": "2.6.9",
+ "extend": "3.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.19",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
+ "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
+ "dev": true
+ },
+ "ignore": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
+ "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==",
+ "dev": true
+ },
+ "import-lazy": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+ "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+ "dev": true,
+ "optional": true
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "indexof": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz",
+ "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=",
+ "dev": true
+ },
+ "inquirer": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
+ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "3.0.0",
+ "chalk": "2.3.0",
+ "cli-cursor": "2.1.0",
+ "cli-width": "2.2.0",
+ "external-editor": "2.1.0",
+ "figures": "2.0.0",
+ "lodash": "4.17.4",
+ "mute-stream": "0.0.7",
+ "run-async": "2.3.0",
+ "rx-lite": "4.0.8",
+ "rx-lite-aggregates": "4.0.8",
+ "string-width": "2.1.1",
+ "strip-ansi": "4.0.0",
+ "through": "2.3.8"
+ }
+ },
+ "interpret": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz",
+ "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "ipaddr.js": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz",
+ "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=",
+ "dev": true
+ },
+ "is-absolute": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz",
+ "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=",
+ "dev": true,
+ "requires": {
+ "is-relative": "0.2.1",
+ "is-windows": "0.2.0"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-buffer": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
+ "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=",
+ "dev": true
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+ "dev": true,
+ "requires": {
+ "builtin-modules": "1.1.1"
+ }
+ },
+ "is-dotfile": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+ "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+ "dev": true
+ },
+ "is-equal-shallow": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+ "dev": true,
+ "requires": {
+ "is-primitive": "2.0.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "is-installed-globally": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
+ "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "global-dirs": "0.1.1",
+ "is-path-inside": "1.0.0"
+ }
+ },
+ "is-my-json-valid": {
+ "version": "2.17.1",
+ "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.1.tgz",
+ "integrity": "sha512-Q2khNw+oBlWuaYvEEHtKSw/pCxD2L5Rc1C+UQme9X6JdRDh7m5D7HkozA0qa3DUkQ6VzCnEm8mVIQPyIRkI5sQ==",
+ "dev": true,
+ "requires": {
+ "generate-function": "2.0.0",
+ "generate-object-property": "1.2.0",
+ "jsonpointer": "4.0.1",
+ "xtend": "4.0.1"
+ }
+ },
+ "is-npm": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
+ "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
+ "dev": true
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+ "dev": true
+ },
+ "is-path-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+ "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+ "dev": true
+ },
+ "is-path-in-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
+ "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
+ "dev": true,
+ "requires": {
+ "is-path-inside": "1.0.0"
+ }
+ },
+ "is-path-inside": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz",
+ "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=",
+ "dev": true,
+ "requires": {
+ "path-is-inside": "1.0.2"
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "is-posix-bracket": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+ "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+ "dev": true
+ },
+ "is-primitive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
+ "dev": true
+ },
+ "is-promise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
+ "dev": true
+ },
+ "is-property": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+ "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
+ "dev": true
+ },
+ "is-redirect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+ "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
+ "dev": true
+ },
+ "is-relative": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz",
+ "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=",
+ "dev": true,
+ "requires": {
+ "is-unc-path": "0.1.2"
+ }
+ },
+ "is-resolvable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
+ "dev": true
+ },
+ "is-retry-allowed": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
+ "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+ "dev": true
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "is-unc-path": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz",
+ "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=",
+ "dev": true,
+ "requires": {
+ "unc-path-regex": "0.1.2"
+ }
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+ "dev": true
+ },
+ "is-valid-glob": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz",
+ "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=",
+ "dev": true
+ },
+ "is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz",
+ "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==",
+ "dev": true,
+ "requires": {
+ "argparse": "1.0.10",
+ "esprima": "4.0.0"
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "dev": true,
+ "optional": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+ "dev": true
+ },
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+ "dev": true,
+ "requires": {
+ "jsonify": "0.0.0"
+ }
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+ "dev": true
+ },
+ "json3": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
+ "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
+ "dev": true
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+ "dev": true
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+ "dev": true
+ },
+ "jsonpointer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
+ "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
+ "dev": true
+ },
+ "jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
+ "dev": true
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.5"
+ }
+ },
+ "latest-version": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-2.0.0.tgz",
+ "integrity": "sha1-VvjWE5YghHuAF/jx9NeOIRMkFos=",
+ "dev": true,
+ "requires": {
+ "package-json": "2.4.0"
+ }
+ },
+ "launchpad": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/launchpad/-/launchpad-0.7.0.tgz",
+ "integrity": "sha1-9CfTwOFehp7hVROCi6/vwW+ce8M=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "async": "2.6.0",
+ "browserstack": "1.5.0",
+ "debug": "2.6.9",
+ "plist": "2.1.0",
+ "q": "1.5.1",
+ "underscore": "1.8.3"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "underscore": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
+ "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "lazy-req": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz",
+ "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=",
+ "dev": true
+ },
+ "lazystream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
+ "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.3"
+ }
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "liftoff": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.3.0.tgz",
+ "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "findup-sync": "0.4.3",
+ "fined": "1.1.0",
+ "flagged-respawn": "0.3.2",
+ "lodash.isplainobject": "4.0.6",
+ "lodash.isstring": "4.0.1",
+ "lodash.mapvalues": "4.6.0",
+ "rechoir": "0.6.2",
+ "resolve": "1.4.0"
+ }
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "strip-bom": "2.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ }
+ }
+ },
+ "lodash": {
+ "version": "4.17.4",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
+ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
+ "dev": true
+ },
+ "lodash._baseassign": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
+ "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
+ "dev": true,
+ "requires": {
+ "lodash._basecopy": "3.0.1",
+ "lodash.keys": "3.1.2"
+ }
+ },
+ "lodash._basecopy": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
+ "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
+ "dev": true
+ },
+ "lodash._basecreate": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz",
+ "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=",
+ "dev": true
+ },
+ "lodash._basetostring": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz",
+ "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=",
+ "dev": true
+ },
+ "lodash._basevalues": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz",
+ "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=",
+ "dev": true
+ },
+ "lodash._getnative": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
+ "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
+ "dev": true
+ },
+ "lodash._isiterateecall": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
+ "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
+ "dev": true
+ },
+ "lodash._reescape": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz",
+ "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=",
+ "dev": true
+ },
+ "lodash._reevaluate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz",
+ "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=",
+ "dev": true
+ },
+ "lodash._reinterpolate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
+ "dev": true
+ },
+ "lodash._root": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
+ "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=",
+ "dev": true
+ },
+ "lodash.create": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz",
+ "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=",
+ "dev": true,
+ "requires": {
+ "lodash._baseassign": "3.2.0",
+ "lodash._basecreate": "3.0.3",
+ "lodash._isiterateecall": "3.0.9"
+ }
+ },
+ "lodash.defaults": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+ "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
+ "dev": true
+ },
+ "lodash.escape": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz",
+ "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
+ "dev": true,
+ "requires": {
+ "lodash._root": "3.0.1"
+ }
+ },
+ "lodash.isarguments": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
+ "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
+ "dev": true
+ },
+ "lodash.isarray": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
+ "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
+ "dev": true
+ },
+ "lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=",
+ "dev": true
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
+ "dev": true
+ },
+ "lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=",
+ "dev": true
+ },
+ "lodash.keys": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
+ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
+ "dev": true,
+ "requires": {
+ "lodash._getnative": "3.9.1",
+ "lodash.isarguments": "3.1.0",
+ "lodash.isarray": "3.0.4"
+ }
+ },
+ "lodash.mapvalues": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz",
+ "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=",
+ "dev": true
+ },
+ "lodash.restparam": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
+ "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=",
+ "dev": true
+ },
+ "lodash.some": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz",
+ "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=",
+ "dev": true
+ },
+ "lodash.template": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz",
+ "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
+ "dev": true,
+ "requires": {
+ "lodash._basecopy": "3.0.1",
+ "lodash._basetostring": "3.0.1",
+ "lodash._basevalues": "3.0.0",
+ "lodash._isiterateecall": "3.0.9",
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.escape": "3.2.0",
+ "lodash.keys": "3.1.2",
+ "lodash.restparam": "3.6.1",
+ "lodash.templatesettings": "3.1.1"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz",
+ "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.escape": "3.2.0"
+ }
+ },
+ "lolex": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz",
+ "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "dev": true,
+ "requires": {
+ "currently-unhandled": "0.4.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "lowercase-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
+ "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
+ "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "1.0.2",
+ "yallist": "2.1.2"
+ }
+ },
+ "lru-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
+ "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=",
+ "dev": true,
+ "requires": {
+ "es5-ext": "0.10.38"
+ }
+ },
+ "make-dir": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz",
+ "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "pify": "3.0.0"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ },
+ "map-stream": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
+ "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=",
+ "dev": true
+ },
+ "md5": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
+ "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=",
+ "dev": true,
+ "requires": {
+ "charenc": "0.0.2",
+ "crypt": "0.0.2",
+ "is-buffer": "1.1.5"
+ }
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+ "dev": true
+ },
+ "memoizee": {
+ "version": "0.4.11",
+ "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.11.tgz",
+ "integrity": "sha1-vemBdmPJ5A/bKk6hw2cpYIeujI8=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38",
+ "es6-weak-map": "2.0.2",
+ "event-emitter": "0.3.5",
+ "is-promise": "2.1.0",
+ "lru-queue": "0.1.0",
+ "next-tick": "1.0.0",
+ "timers-ext": "0.1.2"
+ }
+ },
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "2.1.0",
+ "decamelize": "1.2.0",
+ "loud-rejection": "1.6.0",
+ "map-obj": "1.0.1",
+ "minimist": "1.2.0",
+ "normalize-package-data": "2.4.0",
+ "object-assign": "4.1.1",
+ "read-pkg-up": "1.0.1",
+ "redent": "1.0.0",
+ "trim-newlines": "1.0.0"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ }
+ }
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+ "dev": true
+ },
+ "merge-stream": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
+ "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.3"
+ }
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "dev": true,
+ "requires": {
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
+ }
+ },
+ "mime": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+ "dev": true
+ },
+ "mime-db": {
+ "version": "1.30.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
+ "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.17",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
+ "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.30.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "dev": true
+ },
+ "minimalistic-assert": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz",
+ "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.8"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "mocha": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz",
+ "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==",
+ "dev": true,
+ "requires": {
+ "browser-stdout": "1.3.0",
+ "commander": "2.9.0",
+ "debug": "2.6.8",
+ "diff": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "glob": "7.1.1",
+ "growl": "1.9.2",
+ "he": "1.1.1",
+ "json3": "3.3.2",
+ "lodash.create": "3.1.1",
+ "mkdirp": "0.5.1",
+ "supports-color": "3.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.8",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
+ "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
+ "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz",
+ "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "multer": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/multer/-/multer-1.3.0.tgz",
+ "integrity": "sha1-CSsmcPaEb6SRSWXvyM+Uwg/sbNI=",
+ "dev": true,
+ "requires": {
+ "append-field": "0.1.0",
+ "busboy": "0.2.14",
+ "concat-stream": "1.6.0",
+ "mkdirp": "0.5.1",
+ "object-assign": "3.0.0",
+ "on-finished": "2.3.0",
+ "type-is": "1.6.15",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "object-assign": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
+ "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
+ "dev": true
+ }
+ }
+ },
+ "multipipe": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz",
+ "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=",
+ "dev": true,
+ "requires": {
+ "duplexer2": "0.0.2"
+ }
+ },
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+ "dev": true
+ },
+ "mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "requires": {
+ "any-promise": "1.3.0",
+ "object-assign": "4.1.1",
+ "thenify-all": "1.6.0"
+ }
+ },
+ "native-promise-only": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz",
+ "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=",
+ "dev": true
+ },
+ "natives": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz",
+ "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=",
+ "dev": true
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "negotiator": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+ "dev": true
+ },
+ "next-tick": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
+ "dev": true
+ },
+ "node-status-codes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz",
+ "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=",
+ "dev": true
+ },
+ "nodegit-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/nodegit-promise/-/nodegit-promise-4.0.0.tgz",
+ "integrity": "sha1-VyKxhPLfcycWEGSnkdLoQskWezQ=",
+ "dev": true,
+ "requires": {
+ "asap": "2.0.6"
+ }
+ },
+ "nomnom": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz",
+ "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=",
+ "dev": true,
+ "requires": {
+ "chalk": "0.4.0",
+ "underscore": "1.6.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz",
+ "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz",
+ "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "1.0.0",
+ "has-color": "0.1.7",
+ "strip-ansi": "0.1.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz",
+ "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=",
+ "dev": true
+ }
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "2.5.0",
+ "is-builtin-module": "1.0.0",
+ "semver": "5.5.0",
+ "validate-npm-package-license": "3.0.1"
+ }
+ },
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "dev": true,
+ "requires": {
+ "remove-trailing-separator": "1.1.0"
+ }
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "path-key": "2.0.1"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+ "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
+ },
+ "object-component": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
+ "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
+ "dev": true
+ },
+ "object-keys": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
+ "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=",
+ "dev": true
+ },
+ "object.defaults": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
+ "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+ "dev": true,
+ "requires": {
+ "array-each": "1.0.1",
+ "array-slice": "1.0.0",
+ "for-own": "1.0.0",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "object.omit": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+ "dev": true,
+ "requires": {
+ "for-own": "0.1.5",
+ "is-extendable": "0.1.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "obuf": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz",
+ "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=",
+ "dev": true
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "on-headers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
+ "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "1.2.0"
+ }
+ },
+ "opn": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/opn/-/opn-3.0.3.tgz",
+ "integrity": "sha1-ttmec5n3jWXDuq/+8fsojpuFJDo=",
+ "dev": true,
+ "requires": {
+ "object-assign": "4.1.1"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "orchestrator": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz",
+ "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "0.1.5",
+ "sequencify": "0.0.7",
+ "stream-consume": "0.1.0"
+ }
+ },
+ "ordered-read-streams": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz",
+ "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=",
+ "dev": true
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "dev": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "dev": true
+ },
+ "osenv": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz",
+ "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+ "dev": true,
+ "optional": true
+ },
+ "p-map": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
+ "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
+ "dev": true
+ },
+ "package-json": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz",
+ "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=",
+ "dev": true,
+ "requires": {
+ "got": "5.7.1",
+ "registry-auth-token": "3.3.1",
+ "registry-url": "3.1.0",
+ "semver": "5.5.0"
+ }
+ },
+ "parse-filepath": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz",
+ "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=",
+ "dev": true,
+ "requires": {
+ "is-absolute": "0.2.6",
+ "map-cache": "0.2.2",
+ "path-root": "0.1.1"
+ }
+ },
+ "parse-glob": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+ "dev": true,
+ "requires": {
+ "glob-base": "0.3.0",
+ "is-dotfile": "1.0.3",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "requires": {
+ "error-ex": "1.3.1"
+ }
+ },
+ "parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+ "dev": true
+ },
+ "parse5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz",
+ "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=",
+ "dev": true
+ },
+ "parseqs": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
+ "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
+ "dev": true,
+ "requires": {
+ "better-assert": "1.0.2"
+ }
+ },
+ "parseuri": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
+ "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
+ "dev": true,
+ "requires": {
+ "better-assert": "1.0.2"
+ }
+ },
+ "parseurl": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
+ "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "dev": true,
+ "optional": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "path-root": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
+ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+ "dev": true,
+ "requires": {
+ "path-root-regex": "0.1.2"
+ }
+ },
+ "path-root-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
+ "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+ "dev": true
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "pathval": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
+ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
+ "dev": true
+ },
+ "pause-stream": {
+ "version": "0.0.11",
+ "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
+ "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
+ "dev": true,
+ "requires": {
+ "through": "2.3.8"
+ }
+ },
+ "pem": {
+ "version": "1.12.3",
+ "resolved": "https://registry.npmjs.org/pem/-/pem-1.12.3.tgz",
+ "integrity": "sha512-hT7GwvQL35+0iqgYUl8vn5I5pAVR0HcJas07TXL8bNaR4c5kAFRquk4ZqQk1F9YMcQOr6WjGdY5OnDC0RBnzig==",
+ "dev": true,
+ "requires": {
+ "md5": "2.2.1",
+ "os-tmpdir": "1.0.2",
+ "safe-buffer": "5.1.1",
+ "which": "1.3.0"
+ }
+ },
+ "pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+ "dev": true,
+ "optional": true
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
+ "requires": {
+ "pinkie": "2.0.4"
+ }
+ },
+ "plist": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz",
+ "integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "base64-js": "1.2.0",
+ "xmlbuilder": "8.2.2",
+ "xmldom": "0.1.27"
+ }
+ },
+ "plugin-error": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
+ "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
+ "dev": true,
+ "requires": {
+ "ansi-cyan": "0.1.1",
+ "ansi-red": "0.1.1",
+ "arr-diff": "1.1.0",
+ "arr-union": "2.1.0",
+ "extend-shallow": "1.1.4"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
+ "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-slice": "0.2.3"
+ }
+ },
+ "array-slice": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+ "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+ "dev": true
+ }
+ }
+ },
+ "pluralize": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
+ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.7",
+ "winston": "2.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-2.7.0.tgz",
+ "integrity": "sha512-yD5FYQ8thX/2vHTaEgTtCs/NSG3ko4VlEb0IjM/PFsu03lHNHnpadC1NGwKyvI9vOjcFhnw4mDEVW0lbxLo8Eg==",
+ "dev": true,
+ "requires": {
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/escodegen": "0.0.2",
+ "@types/estraverse": "0.0.6",
+ "@types/estree": "0.0.37",
+ "@types/node": "6.0.96",
+ "@types/parse5": "2.2.34",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "2.3.0",
+ "escodegen": "1.9.0",
+ "espree": "3.5.2",
+ "estraverse": "4.2.0",
+ "jsonschema": "1.2.2",
+ "parse5": "2.2.3",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.6",
+ "strip-indent": "2.0.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.96",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.96.tgz",
+ "integrity": "sha512-fsOOY6tMQ3jCB2wD51XFDmmpgm4wVKkJECdcVRqapbJEa7awJDcr+SaH8toz+4r4KW8YQ3M7ybXMoSDo1QGewA==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "polymer-build": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/polymer-build/-/polymer-build-2.1.1.tgz",
+ "integrity": "sha512-SW6gxS0UPz864jECKMXPEdtq3549xzludPAQpxEqeDz6pSAeY/AFDWRG78Gw+z+mS2KES16Wwkc9IdMagBj3FQ==",
+ "dev": true,
+ "requires": {
+ "@types/mz": "0.0.31",
+ "@types/node": "6.0.96",
+ "@types/parse5": "2.2.34",
+ "@types/vinyl": "2.0.2",
+ "@types/vinyl-fs": "0.0.28",
+ "dom5": "2.3.0",
+ "multipipe": "1.0.2",
+ "mz": "2.7.0",
+ "parse5": "2.2.3",
+ "plylog": "0.5.0",
+ "polymer-analyzer": "2.7.0",
+ "polymer-bundler": "3.1.1",
+ "polymer-project-config": "3.7.0",
+ "sw-precache": "5.2.0",
+ "vinyl": "1.2.0",
+ "vinyl-fs": "2.4.4"
+ },
+ "dependencies": {
+ "@types/mz": {
+ "version": "0.0.31",
+ "resolved": "https://registry.npmjs.org/@types/mz/-/mz-0.0.31.tgz",
+ "integrity": "sha1-pNgMCC/v5x5Ap8DwfR5lVbu8e1I=",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.96"
+ }
+ },
+ "@types/node": {
+ "version": "6.0.96",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.96.tgz",
+ "integrity": "sha512-fsOOY6tMQ3jCB2wD51XFDmmpgm4wVKkJECdcVRqapbJEa7awJDcr+SaH8toz+4r4KW8YQ3M7ybXMoSDo1QGewA==",
+ "dev": true
+ },
+ "clone": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
+ "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
+ "duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.3"
+ }
+ },
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ }
+ },
+ "glob-stream": {
+ "version": "5.3.5",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz",
+ "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "glob": "5.0.15",
+ "glob-parent": "3.1.0",
+ "micromatch": "2.3.11",
+ "ordered-read-streams": "0.3.0",
+ "through2": "0.6.5",
+ "to-absolute-glob": "0.1.1",
+ "unique-stream": "2.2.1"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "gulp-sourcemaps": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz",
+ "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=",
+ "dev": true,
+ "requires": {
+ "convert-source-map": "1.5.0",
+ "graceful-fs": "4.1.11",
+ "strip-bom": "2.0.0",
+ "through2": "2.0.3",
+ "vinyl": "1.2.0"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "multipipe": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-1.0.2.tgz",
+ "integrity": "sha1-zBPv2DPJzamfIk+GhGG44aP9k50=",
+ "dev": true,
+ "requires": {
+ "duplexer2": "0.1.4",
+ "object-assign": "4.1.1"
+ }
+ },
+ "ordered-read-streams": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz",
+ "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=",
+ "dev": true,
+ "requires": {
+ "is-stream": "1.1.0",
+ "readable-stream": "2.3.3"
+ }
+ },
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "dev": true
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ },
+ "unique-stream": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
+ "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
+ "dev": true,
+ "requires": {
+ "json-stable-stringify": "1.0.1",
+ "through2-filter": "2.0.0"
+ }
+ },
+ "vinyl": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
+ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.3",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ },
+ "vinyl-fs": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz",
+ "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=",
+ "dev": true,
+ "requires": {
+ "duplexify": "3.5.3",
+ "glob-stream": "5.3.5",
+ "graceful-fs": "4.1.11",
+ "gulp-sourcemaps": "1.6.0",
+ "is-valid-glob": "0.3.0",
+ "lazystream": "1.0.0",
+ "lodash.isequal": "4.5.0",
+ "merge-stream": "1.0.1",
+ "mkdirp": "0.5.1",
+ "object-assign": "4.1.1",
+ "readable-stream": "2.3.3",
+ "strip-bom": "2.0.0",
+ "strip-bom-stream": "1.0.0",
+ "through2": "2.0.3",
+ "through2-filter": "2.0.0",
+ "vali-date": "1.0.0",
+ "vinyl": "1.2.0"
+ }
+ }
+ }
+ },
+ "polymer-bundler": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/polymer-bundler/-/polymer-bundler-3.1.1.tgz",
+ "integrity": "sha512-a/MItYr/rTRZ8Ymj5npmoAAm89RC5hRh4yz8bs22GyMn+NlE7HqJ4EzLrPkyRWlOyBhbhYFPx2Zot8PlaWXvmQ==",
+ "dev": true,
+ "requires": {
+ "clone": "2.1.1",
+ "command-line-args": "3.0.5",
+ "command-line-usage": "3.0.8",
+ "dom5": "2.3.0",
+ "espree": "3.5.2",
+ "mkdirp": "0.5.1",
+ "parse5": "2.2.3",
+ "polymer-analyzer": "2.7.0",
+ "source-map": "0.5.7"
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.7.0.tgz",
+ "integrity": "sha512-d3GTy/JRu05rlaaiLRTDgSU4ZbbS/KQiZ6NFIFWQCJytJ32EhDTl2rK10xsf2ll0G2c97FqFV67IsBRF0yXthg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.96",
+ "jsonschema": "1.2.2",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.96",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.96.tgz",
+ "integrity": "sha512-fsOOY6tMQ3jCB2wD51XFDmmpgm4wVKkJECdcVRqapbJEa7awJDcr+SaH8toz+4r4KW8YQ3M7ybXMoSDo1QGewA==",
+ "dev": true
+ }
+ }
+ },
+ "polyserve": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/polyserve/-/polyserve-0.23.0.tgz",
+ "integrity": "sha512-ijzCbFttKG1F0hMTWWIzMoo+sxsfpXctoHFigw2ViBcvUt/aUBfJCUTHPKHhi/3zAgtw5Ej3SgoIOY9LflpXAw==",
+ "dev": true,
+ "requires": {
+ "@types/assert": "0.0.29",
+ "@types/babel-core": "6.25.3",
+ "@types/babylon": "6.16.2",
+ "@types/compression": "0.0.33",
+ "@types/content-type": "1.1.2",
+ "@types/express": "4.11.0",
+ "@types/mime": "0.0.29",
+ "@types/mz": "0.0.29",
+ "@types/node": "8.5.9",
+ "@types/opn": "3.0.28",
+ "@types/parse5": "2.2.34",
+ "@types/pem": "1.9.3",
+ "@types/serve-static": "1.13.1",
+ "@types/spdy": "3.4.4",
+ "@types/ua-parser-js": "0.7.32",
+ "babel-core": "6.26.0",
+ "babel-plugin-transform-es2015-arrow-functions": "6.22.0",
+ "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0",
+ "babel-plugin-transform-es2015-block-scoping": "6.26.0",
+ "babel-plugin-transform-es2015-classes": "6.24.1",
+ "babel-plugin-transform-es2015-computed-properties": "6.24.1",
+ "babel-plugin-transform-es2015-destructuring": "6.23.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
+ "babel-plugin-transform-es2015-for-of": "6.23.0",
+ "babel-plugin-transform-es2015-function-name": "6.24.1",
+ "babel-plugin-transform-es2015-literals": "6.22.0",
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-plugin-transform-es2015-object-super": "6.24.1",
+ "babel-plugin-transform-es2015-parameters": "6.24.1",
+ "babel-plugin-transform-es2015-shorthand-properties": "6.24.1",
+ "babel-plugin-transform-es2015-spread": "6.22.0",
+ "babel-plugin-transform-es2015-sticky-regex": "6.24.1",
+ "babel-plugin-transform-es2015-template-literals": "6.22.0",
+ "babel-plugin-transform-es2015-typeof-symbol": "6.23.0",
+ "babel-plugin-transform-es2015-unicode-regex": "6.24.1",
+ "babel-plugin-transform-regenerator": "6.26.0",
+ "babylon": "6.18.0",
+ "browser-capabilities": "0.2.2",
+ "command-line-args": "3.0.5",
+ "command-line-usage": "3.0.8",
+ "compression": "1.7.1",
+ "content-type": "1.0.4",
+ "dom5": "2.3.0",
+ "express": "4.16.2",
+ "find-port": "1.0.1",
+ "http-proxy-middleware": "0.17.4",
+ "lru-cache": "4.1.1",
+ "mime": "1.4.1",
+ "mz": "2.7.0",
+ "opn": "3.0.3",
+ "parse5": "2.2.3",
+ "pem": "1.12.3",
+ "polymer-build": "2.1.1",
+ "requirejs": "2.3.5",
+ "resolve": "1.4.0",
+ "send": "0.14.2",
+ "spdy": "3.4.7"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
+ "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
+ "dev": true,
+ "requires": {
+ "ms": "0.7.1"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
+ "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
+ "dev": true
+ }
+ }
+ },
+ "etag": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz",
+ "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=",
+ "dev": true
+ },
+ "fresh": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz",
+ "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz",
+ "integrity": "sha1-eIwNLB3iyBuebowBhDtrl+uSB1A=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "setprototypeof": "1.0.2",
+ "statuses": "1.3.1"
+ }
+ },
+ "ms": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
+ "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
+ "dev": true
+ },
+ "send": {
+ "version": "0.14.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.14.2.tgz",
+ "integrity": "sha1-ObBDiz9RC+Xcb2Z6EfcWiTaM3u8=",
+ "dev": true,
+ "requires": {
+ "debug": "2.2.0",
+ "depd": "1.1.2",
+ "destroy": "1.0.4",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.7.0",
+ "fresh": "0.3.0",
+ "http-errors": "1.5.1",
+ "mime": "1.3.4",
+ "ms": "0.7.2",
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.0",
+ "statuses": "1.3.1"
+ },
+ "dependencies": {
+ "mime": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz",
+ "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=",
+ "dev": true
+ }
+ }
+ },
+ "setprototypeof": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz",
+ "integrity": "sha1-gaVSFB7BBLiOic44MQOtXGZWTQg=",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+ "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+ "dev": true
+ },
+ "preserve": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
+ "dev": true
+ },
+ "pretty-bytes": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz",
+ "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=",
+ "dev": true
+ },
+ "pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
+ "dev": true
+ },
+ "private": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz",
+ "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "dev": true
+ },
+ "progress": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
+ "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
+ "dev": true
+ },
+ "promisify-node": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/promisify-node/-/promisify-node-0.4.0.tgz",
+ "integrity": "sha1-MoA4dOxBF4TkeGwzmQKoeheaRpw=",
+ "dev": true,
+ "requires": {
+ "nodegit-promise": "4.0.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "proxy-addr": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz",
+ "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=",
+ "dev": true,
+ "requires": {
+ "forwarded": "0.1.2",
+ "ipaddr.js": "1.5.2"
+ }
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true
+ },
+ "q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+ "dev": true,
+ "optional": true
+ },
+ "qs": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+ "dev": true
+ },
+ "randomatic": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
+ "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.5"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.5"
+ }
+ }
+ }
+ },
+ "range-parser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+ "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+ "dev": true
+ },
+ "raw-body": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
+ "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
+ "dev": true,
+ "requires": {
+ "bytes": "3.0.0",
+ "http-errors": "1.6.2",
+ "iconv-lite": "0.4.19",
+ "unpipe": "1.0.0"
+ }
+ },
+ "rc": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.4.tgz",
+ "integrity": "sha1-oPYGyq4qO4YrvQ74VILAElsxX6M=",
+ "dev": true,
+ "requires": {
+ "deep-extend": "0.4.2",
+ "ini": "1.3.4",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ }
+ }
+ },
+ "read-all-stream": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz",
+ "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "2.0.1",
+ "readable-stream": "2.3.3"
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "1.1.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "1.1.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
+ "requires": {
+ "find-up": "1.1.2",
+ "read-pkg": "1.1.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
+ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+ "dev": true,
+ "requires": {
+ "resolve": "1.4.0"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "2.1.0",
+ "strip-indent": "1.0.1"
+ },
+ "dependencies": {
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "4.0.1"
+ }
+ }
+ }
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerate": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
+ "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz",
+ "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==",
+ "dev": true
+ },
+ "regenerator-transform": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "private": "0.1.7"
+ }
+ },
+ "regex-cache": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+ "dev": true,
+ "requires": {
+ "is-equal-shallow": "0.1.3"
+ }
+ },
+ "regexpp": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.0.1.tgz",
+ "integrity": "sha512-8Ph721maXiOYSLtaDGKVmDn5wdsNaF6Px85qFNeMPQq0r8K5Y10tgP6YuR65Ws35n4DvzFcCxEnRNBIXQunzLw==",
+ "dev": true
+ },
+ "regexpu-core": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+ "dev": true,
+ "requires": {
+ "regenerate": "1.3.3",
+ "regjsgen": "0.2.0",
+ "regjsparser": "0.1.5"
+ }
+ },
+ "registry-auth-token": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz",
+ "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=",
+ "dev": true,
+ "requires": {
+ "rc": "1.2.4",
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "registry-url": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+ "dev": true,
+ "requires": {
+ "rc": "1.2.4"
+ }
+ },
+ "regjsgen": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+ "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+ "dev": true
+ },
+ "regjsparser": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+ "dev": true,
+ "requires": {
+ "jsesc": "0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true
+ }
+ }
+ },
+ "remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+ "dev": true
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "replace-ext": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+ "dev": true
+ },
+ "request": {
+ "version": "2.79.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz",
+ "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "0.6.0",
+ "aws4": "1.6.0",
+ "caseless": "0.11.0",
+ "combined-stream": "1.0.5",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.1.4",
+ "har-validator": "2.0.6",
+ "hawk": "3.1.3",
+ "http-signature": "1.1.1",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.17",
+ "oauth-sign": "0.8.2",
+ "qs": "6.3.2",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.3",
+ "tunnel-agent": "0.4.3",
+ "uuid": "3.2.1"
+ },
+ "dependencies": {
+ "qs": {
+ "version": "6.3.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
+ "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=",
+ "dev": true
+ },
+ "uuid": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
+ "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==",
+ "dev": true
+ }
+ }
+ },
+ "require-uncached": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+ "dev": true,
+ "requires": {
+ "caller-path": "0.1.0",
+ "resolve-from": "1.0.1"
+ }
+ },
+ "requirejs": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.5.tgz",
+ "integrity": "sha512-svnO+aNcR/an9Dpi44C7KSAy5fFGLtmPbaaCeQaklUz8BQhS64tWWIIlvEA5jrWICzlO/X9KSzSeXFnZdBu8nw==",
+ "dev": true
+ },
+ "requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz",
+ "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-dir": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz",
+ "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "1.2.2",
+ "global-modules": "0.2.3"
+ }
+ },
+ "resolve-from": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
+ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
+ "dev": true
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "dev": true,
+ "requires": {
+ "onetime": "2.0.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "rollup": {
+ "version": "0.45.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.45.2.tgz",
+ "integrity": "sha512-2+bq5GQSrocdhr+M92mOQRmF1evtLRzv9NdmEC2wo7BILvTG8irHCtD0q+zg8ikNu63iJicdN5IzyxAXRTFKOQ==",
+ "dev": true,
+ "requires": {
+ "source-map-support": "0.4.18"
+ }
+ },
+ "rollup-plugin-babel": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-2.7.1.tgz",
+ "integrity": "sha1-FlKBl7D5OKFTb0RoPHqT1XMYL1c=",
+ "dev": true,
+ "requires": {
+ "babel-core": "6.26.0",
+ "babel-plugin-transform-es2015-classes": "6.24.1",
+ "object-assign": "4.1.1",
+ "rollup-pluginutils": "1.5.2"
+ }
+ },
+ "rollup-pluginutils": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz",
+ "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=",
+ "dev": true,
+ "requires": {
+ "estree-walker": "0.2.1",
+ "minimatch": "3.0.4"
+ }
+ },
+ "rollup-stream": {
+ "version": "1.23.1",
+ "resolved": "https://registry.npmjs.org/rollup-stream/-/rollup-stream-1.23.1.tgz",
+ "integrity": "sha512-niUbTM3sqckz1FNebsSiN+koCR7RdgrRZ2HCcR4V2DT9PSs53tB4z1xzdTGxrX6bo3QT00R2sQA5n1jr/to69Q==",
+ "dev": true,
+ "requires": {
+ "rollup": "0.45.2"
+ }
+ },
+ "run-async": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+ "dev": true,
+ "requires": {
+ "is-promise": "2.1.0"
+ }
+ },
+ "run-sequence": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-2.2.1.tgz",
+ "integrity": "sha512-qkzZnQWMZjcKbh3CNly2srtrkaO/2H/SI5f2eliMCapdRD3UhMrwjfOAZJAnZ2H8Ju4aBzFZkBGXUqFs9V0yxw==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "fancy-log": "1.3.2",
+ "plugin-error": "0.1.2"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "fancy-log": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
+ "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
+ "dev": true,
+ "requires": {
+ "ansi-gray": "0.1.1",
+ "color-support": "1.1.3",
+ "time-stamp": "1.1.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "rx-lite": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
+ "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
+ "dev": true
+ },
+ "rx-lite-aggregates": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
+ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
+ "dev": true,
+ "requires": {
+ "rx-lite": "4.0.8"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
+ "dev": true
+ },
+ "samsam": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz",
+ "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==",
+ "dev": true
+ },
+ "sauce-connect-launcher": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.2.3.tgz",
+ "integrity": "sha1-0vkxrXro/avxlopEDnsgQXrKf4Y=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "adm-zip": "0.4.7",
+ "async": "2.6.0",
+ "https-proxy-agent": "1.0.0",
+ "lodash": "4.17.4",
+ "rimraf": "2.6.2"
+ }
+ },
+ "select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+ "dev": true
+ },
+ "selenium-standalone": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-6.12.0.tgz",
+ "integrity": "sha1-eJcw2wmhBfHM4SxkJNeV0RxUO9Q=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "async": "2.6.0",
+ "commander": "2.9.0",
+ "cross-spawn": "5.1.0",
+ "debug": "3.1.0",
+ "lodash": "4.17.4",
+ "minimist": "1.2.0",
+ "mkdirp": "0.5.1",
+ "progress": "2.0.0",
+ "request": "2.79.0",
+ "tar-stream": "1.5.2",
+ "urijs": "1.19.0",
+ "which": "1.3.0",
+ "yauzl": "2.9.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ },
+ "semver-diff": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
+ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
+ "dev": true,
+ "requires": {
+ "semver": "5.5.0"
+ }
+ },
+ "send": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.11.1.tgz",
+ "integrity": "sha1-G+q/1C+eJwn5kCivMHisErRwktU=",
+ "dev": true,
+ "requires": {
+ "debug": "2.1.3",
+ "depd": "1.0.1",
+ "destroy": "1.0.3",
+ "escape-html": "1.0.1",
+ "etag": "1.5.1",
+ "fresh": "0.2.4",
+ "mime": "1.2.11",
+ "ms": "0.7.0",
+ "on-finished": "2.2.1",
+ "range-parser": "1.0.3"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz",
+ "integrity": "sha1-zoqxte6PvuK/o7Yzyrk9NmtjQY4=",
+ "dev": true,
+ "requires": {
+ "ms": "0.7.0"
+ }
+ },
+ "depd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz",
+ "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=",
+ "dev": true
+ },
+ "destroy": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz",
+ "integrity": "sha1-tDO0ck5x/YVR2YhRdIUcX8N34sk=",
+ "dev": true
+ },
+ "ee-first": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz",
+ "integrity": "sha1-ag18YiHkkP7v2S7D9EHJzozQl/Q=",
+ "dev": true
+ },
+ "escape-html": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz",
+ "integrity": "sha1-GBoobq05ejmpKFfPsdQwUuNWv/A=",
+ "dev": true
+ },
+ "etag": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.5.1.tgz",
+ "integrity": "sha1-VMUN4E7kJpVWKSWsVmWIKRvn6eo=",
+ "dev": true,
+ "requires": {
+ "crc": "3.2.1"
+ }
+ },
+ "fresh": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.4.tgz",
+ "integrity": "sha1-NYJJkgbJcjcUGQ7ddLRgT+tKYUw=",
+ "dev": true
+ },
+ "mime": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz",
+ "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=",
+ "dev": true
+ },
+ "ms": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz",
+ "integrity": "sha1-hlvpTC5zl62KV9pqYzpuLzB5i4M=",
+ "dev": true
+ },
+ "on-finished": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.2.1.tgz",
+ "integrity": "sha1-XIXBzDYpn3gCllP2Z/J7a5nrwCk=",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.0"
+ }
+ },
+ "range-parser": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz",
+ "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=",
+ "dev": true
+ }
+ }
+ },
+ "sequencify": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz",
+ "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=",
+ "dev": true
+ },
+ "serve-static": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz",
+ "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==",
+ "dev": true,
+ "requires": {
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "parseurl": "1.3.2",
+ "send": "0.16.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "send": {
+ "version": "0.16.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz",
+ "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "destroy": "1.0.4",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "1.6.2",
+ "mime": "1.4.1",
+ "ms": "2.0.0",
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.0",
+ "statuses": "1.3.1"
+ }
+ },
+ "statuses": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+ "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+ "dev": true
+ }
+ }
+ },
+ "server-destroy": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
+ "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=",
+ "dev": true
+ },
+ "serviceworker-cache-polyfill": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz",
+ "integrity": "sha1-3hnuc77yGrPAdAo3sz22JGS6ves=",
+ "dev": true
+ },
+ "setprototypeof": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
+ "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
+ "dev": true
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true
+ },
+ "sigmund": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
+ "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "dev": true
+ },
+ "sinon": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz",
+ "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==",
+ "dev": true,
+ "requires": {
+ "diff": "3.2.0",
+ "formatio": "1.2.0",
+ "lolex": "1.6.0",
+ "native-promise-only": "0.8.1",
+ "path-to-regexp": "1.7.0",
+ "samsam": "1.3.0",
+ "text-encoding": "0.6.4",
+ "type-detect": "4.0.7"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
+ "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
+ "dev": true,
+ "requires": {
+ "isarray": "0.0.1"
+ }
+ }
+ }
+ },
+ "sinon-chai": {
+ "version": "2.14.0",
+ "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz",
+ "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==",
+ "dev": true
+ },
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
+ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0"
+ }
+ },
+ "slide": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
+ "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=",
+ "dev": true
+ },
+ "sntp": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+ "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
+ "dev": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "socket.io": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz",
+ "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "engine.io": "3.1.4",
+ "socket.io-adapter": "1.1.1",
+ "socket.io-client": "2.0.4",
+ "socket.io-parser": "3.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "socket.io-adapter": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz",
+ "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=",
+ "dev": true
+ },
+ "socket.io-client": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz",
+ "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=",
+ "dev": true,
+ "requires": {
+ "backo2": "1.0.2",
+ "base64-arraybuffer": "0.1.5",
+ "component-bind": "1.0.0",
+ "component-emitter": "1.2.1",
+ "debug": "2.6.9",
+ "engine.io-client": "3.1.4",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "object-component": "0.0.3",
+ "parseqs": "0.0.5",
+ "parseuri": "0.0.5",
+ "socket.io-parser": "3.1.2",
+ "to-array": "0.1.4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "socket.io-parser": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.2.tgz",
+ "integrity": "sha1-28IoIVH8T6675Aru3Ady66YZ9/I=",
+ "dev": true,
+ "requires": {
+ "component-emitter": "1.2.1",
+ "debug": "2.6.9",
+ "has-binary2": "1.0.2",
+ "isarray": "2.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+ "dev": true
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "source-map-resolve": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.3.1.tgz",
+ "integrity": "sha1-YQ9hIqRFuN1RU1oqcbeD38Ekh2E=",
+ "dev": true,
+ "requires": {
+ "atob": "1.1.3",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.3.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-support": {
+ "version": "0.4.18",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
+ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7"
+ }
+ },
+ "source-map-url": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.3.0.tgz",
+ "integrity": "sha1-fsrxO1e80J2opAxdJp2zN5nUqvk=",
+ "dev": true
+ },
+ "sparkles": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz",
+ "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=",
+ "dev": true
+ },
+ "spdx-correct": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
+ "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
+ "dev": true,
+ "requires": {
+ "spdx-license-ids": "1.2.2"
+ }
+ },
+ "spdx-expression-parse": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
+ "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=",
+ "dev": true
+ },
+ "spdx-license-ids": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
+ "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=",
+ "dev": true
+ },
+ "spdy": {
+ "version": "3.4.7",
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz",
+ "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "handle-thing": "1.2.5",
+ "http-deceiver": "1.2.7",
+ "safe-buffer": "5.1.1",
+ "select-hose": "2.0.0",
+ "spdy-transport": "2.0.20"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "spdy-transport": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz",
+ "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "detect-node": "2.0.3",
+ "hpack.js": "2.1.6",
+ "obuf": "1.1.1",
+ "readable-stream": "2.3.3",
+ "safe-buffer": "5.1.1",
+ "wbuf": "1.7.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "split": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/split/-/split-0.2.10.tgz",
+ "integrity": "sha1-Zwl8YB1pfOE2j0GPBs0gHPBSGlc=",
+ "dev": true,
+ "requires": {
+ "through": "2.3.8"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "sshpk": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz",
+ "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=",
+ "dev": true,
+ "requires": {
+ "asn1": "0.2.3",
+ "assert-plus": "1.0.0",
+ "bcrypt-pbkdf": "1.0.1",
+ "dashdash": "1.14.1",
+ "ecc-jsbn": "0.1.1",
+ "getpass": "0.1.7",
+ "jsbn": "0.1.1",
+ "tweetnacl": "0.14.5"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "stacky": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/stacky/-/stacky-1.3.1.tgz",
+ "integrity": "sha1-PxF+UYe5pz0j+HbWnwXIWxGAShI=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "lodash": "3.10.1"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "statuses": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+ "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+ "dev": true
+ },
+ "stream-combiner": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
+ "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=",
+ "dev": true,
+ "requires": {
+ "duplexer": "0.1.1"
+ }
+ },
+ "stream-consume": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz",
+ "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=",
+ "dev": true
+ },
+ "stream-shift": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
+ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
+ "dev": true
+ },
+ "streamqueue": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/streamqueue/-/streamqueue-0.1.3.tgz",
+ "integrity": "sha1-sQ1lFYr1ec46X0jJJ20B2yPU+LU=",
+ "dev": true,
+ "requires": {
+ "isstream": "0.1.2",
+ "readable-stream": "1.0.34"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "streamsearch": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
+ "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "stringstream": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
+ "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ }
+ }
+ },
+ "strip-bom": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz",
+ "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=",
+ "dev": true,
+ "requires": {
+ "first-chunk-stream": "1.0.0",
+ "is-utf8": "0.2.1"
+ }
+ },
+ "strip-bom-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz",
+ "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=",
+ "dev": true,
+ "requires": {
+ "first-chunk-stream": "1.0.0",
+ "strip-bom": "2.0.0"
+ },
+ "dependencies": {
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ }
+ }
+ },
+ "strip-bom-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
+ "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=",
+ "dev": true
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "dev": true,
+ "optional": true
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "sw-precache": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.0.tgz",
+ "integrity": "sha512-sKctdX+5hUxkqJ/1DM88ubQ+QRvyw7CnxWdk909N2DgvxMqc1gcQFrwL7zpVc87wFmCA/OvRQd0iMC2XdFopYg==",
+ "dev": true,
+ "requires": {
+ "dom-urls": "1.1.0",
+ "es6-promise": "4.1.1",
+ "glob": "7.1.2",
+ "lodash.defaults": "4.2.0",
+ "lodash.template": "4.4.0",
+ "meow": "3.7.0",
+ "mkdirp": "0.5.1",
+ "pretty-bytes": "4.0.2",
+ "sw-toolbox": "3.6.0",
+ "update-notifier": "1.0.3"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "lodash.template": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz",
+ "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.templatesettings": "4.1.0"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz",
+ "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "update-notifier": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-1.0.3.tgz",
+ "integrity": "sha1-j5LFFUgr1oMbfJMBPnD4dVLHz1o=",
+ "dev": true,
+ "requires": {
+ "boxen": "0.6.0",
+ "chalk": "1.1.3",
+ "configstore": "2.1.0",
+ "is-npm": "1.0.0",
+ "latest-version": "2.0.0",
+ "lazy-req": "1.1.0",
+ "semver-diff": "2.1.0",
+ "xdg-basedir": "2.0.0"
+ }
+ }
+ }
+ },
+ "sw-toolbox": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz",
+ "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=",
+ "dev": true,
+ "requires": {
+ "path-to-regexp": "1.7.0",
+ "serviceworker-cache-polyfill": "4.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
+ "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
+ "dev": true,
+ "requires": {
+ "isarray": "0.0.1"
+ }
+ }
+ }
+ },
+ "table": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
+ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "ajv-keywords": "2.1.1",
+ "chalk": "2.3.0",
+ "lodash": "4.17.4",
+ "slice-ansi": "1.0.0",
+ "string-width": "2.1.1"
+ }
+ },
+ "table-layout": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.3.0.tgz",
+ "integrity": "sha1-buINxIPbNxs+XIf3BO0vfHmdLJo=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "core-js": "2.5.1",
+ "deep-extend": "0.4.2",
+ "feature-detect-es6": "1.4.0",
+ "typical": "2.6.1",
+ "wordwrapjs": "2.0.0"
+ }
+ },
+ "tar-stream": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.2.tgz",
+ "integrity": "sha1-+8bG6DwaGdTLSMfZYXH8JI7/x78=",
+ "dev": true,
+ "requires": {
+ "bl": "1.2.1",
+ "end-of-stream": "1.4.1",
+ "readable-stream": "2.3.3",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0"
+ }
+ }
+ }
+ },
+ "temp": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz",
+ "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "os-tmpdir": "1.0.2",
+ "rimraf": "2.2.8"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "2.2.8",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
+ "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "term-size": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
+ "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "execa": "0.7.0"
+ }
+ },
+ "test-value": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
+ "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "typical": "2.6.1"
+ }
+ },
+ "text-encoding": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz",
+ "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=",
+ "dev": true
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "thenify": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz",
+ "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=",
+ "dev": true,
+ "requires": {
+ "any-promise": "1.3.0"
+ }
+ },
+ "thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
+ "dev": true,
+ "requires": {
+ "thenify": "3.3.0"
+ }
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.3",
+ "xtend": "4.0.1"
+ }
+ },
+ "through2-filter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz",
+ "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=",
+ "dev": true,
+ "requires": {
+ "through2": "2.0.3",
+ "xtend": "4.0.1"
+ }
+ },
+ "tildify": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz",
+ "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "time-stamp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
+ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
+ "dev": true
+ },
+ "timed-out": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz",
+ "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=",
+ "dev": true
+ },
+ "timers-ext": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.2.tgz",
+ "integrity": "sha1-YcxHp2wavTGV8UUn+XjViulMUgQ=",
+ "dev": true,
+ "requires": {
+ "es5-ext": "0.10.38",
+ "next-tick": "1.0.0"
+ }
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "to-absolute-glob": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz",
+ "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "to-array": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
+ "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "tough-cookie": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz",
+ "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=",
+ "dev": true,
+ "requires": {
+ "punycode": "1.4.1"
+ }
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "tunnel-agent": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
+ "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
+ "dev": true
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "dev": true,
+ "optional": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "type-detect": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.7.tgz",
+ "integrity": "sha512-4Rh17pAMVdMWzktddFhISRnUnFIStObtUMNGzDwlA6w/77bmGv3aBbRdCmQR6IjzfkTo9otnW+2K/cDRhKSxDA==",
+ "dev": true
+ },
+ "type-is": {
+ "version": "1.6.15",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz",
+ "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=",
+ "dev": true,
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "2.1.17"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "ua-parser-js": {
+ "version": "0.7.17",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz",
+ "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==",
+ "dev": true
+ },
+ "ultron": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
+ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
+ "dev": true
+ },
+ "unc-path-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
+ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
+ "dev": true
+ },
+ "underscore": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
+ "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=",
+ "dev": true
+ },
+ "underscore.string": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz",
+ "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "unique-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz",
+ "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=",
+ "dev": true
+ },
+ "unique-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
+ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "crypto-random-string": "1.0.0"
+ }
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+ "dev": true
+ },
+ "unzip-response": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz",
+ "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=",
+ "dev": true
+ },
+ "update-notifier": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz",
+ "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "boxen": "1.3.0",
+ "chalk": "2.3.0",
+ "configstore": "3.1.1",
+ "import-lazy": "2.1.0",
+ "is-installed-globally": "0.1.0",
+ "is-npm": "1.0.0",
+ "latest-version": "3.1.0",
+ "semver-diff": "2.1.0",
+ "xdg-basedir": "3.0.0"
+ },
+ "dependencies": {
+ "ansi-align": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
+ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "string-width": "2.1.1"
+ }
+ },
+ "boxen": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
+ "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-align": "2.0.0",
+ "camelcase": "4.1.0",
+ "chalk": "2.3.0",
+ "cli-boxes": "1.0.0",
+ "string-width": "2.1.1",
+ "term-size": "1.2.0",
+ "widest-line": "2.0.0"
+ }
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true,
+ "optional": true
+ },
+ "configstore": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz",
+ "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "dot-prop": "4.2.0",
+ "graceful-fs": "4.1.11",
+ "make-dir": "1.1.0",
+ "unique-string": "1.0.0",
+ "write-file-atomic": "2.3.0",
+ "xdg-basedir": "3.0.0"
+ }
+ },
+ "dot-prop": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
+ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-obj": "1.0.1"
+ }
+ },
+ "got": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "create-error-class": "3.0.2",
+ "duplexer3": "0.1.4",
+ "get-stream": "3.0.0",
+ "is-redirect": "1.0.0",
+ "is-retry-allowed": "1.1.0",
+ "is-stream": "1.1.0",
+ "lowercase-keys": "1.0.0",
+ "safe-buffer": "5.1.1",
+ "timed-out": "4.0.1",
+ "unzip-response": "2.0.1",
+ "url-parse-lax": "1.0.0"
+ }
+ },
+ "latest-version": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
+ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "package-json": "4.0.1"
+ }
+ },
+ "package-json": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
+ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "got": "6.7.1",
+ "registry-auth-token": "3.3.1",
+ "registry-url": "3.1.0",
+ "semver": "5.5.0"
+ }
+ },
+ "timed-out": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
+ "dev": true,
+ "optional": true
+ },
+ "unzip-response": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+ "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
+ "dev": true,
+ "optional": true
+ },
+ "widest-line": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz",
+ "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "string-width": "2.1.1"
+ }
+ },
+ "write-file-atomic": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
+ "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "imurmurhash": "0.1.4",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "xdg-basedir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
+ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
+ "dev": true
+ }
+ }
+ },
+ "urijs": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.0.tgz",
+ "integrity": "sha512-Qs2odXn0hST5VSPVjpi73CMqtbAoanahaqWBujGU+IyMrMqpWcIhDewxQRhCkmqYxuyvICDcSuLdv2O7ncWBGw==",
+ "dev": true
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "url-parse-lax": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+ "dev": true,
+ "requires": {
+ "prepend-http": "1.0.4"
+ }
+ },
+ "user-home": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
+ "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
+ "dev": true
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+ "dev": true
+ },
+ "uuid": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
+ "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=",
+ "dev": true
+ },
+ "uws": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/uws/-/uws-0.14.5.tgz",
+ "integrity": "sha1-Z6rzPEaypYel9mZtAPdpEyjxSdw=",
+ "dev": true,
+ "optional": true
+ },
+ "v8flags": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
+ "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
+ "dev": true,
+ "requires": {
+ "user-home": "1.1.1"
+ }
+ },
+ "vali-date": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz",
+ "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=",
+ "dev": true
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
+ "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "1.0.2",
+ "spdx-expression-parse": "1.0.4"
+ }
+ },
+ "vargs": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/vargs/-/vargs-0.1.0.tgz",
+ "integrity": "sha1-a2GE2mUgzDIEzhtAfKwm2SYJ6/8=",
+ "dev": true
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+ "dev": true
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "1.3.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "vinyl": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
+ "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=",
+ "dev": true,
+ "requires": {
+ "clone": "2.1.1",
+ "clone-buffer": "1.0.0",
+ "clone-stats": "1.0.0",
+ "cloneable-readable": "1.0.0",
+ "remove-trailing-separator": "1.1.0",
+ "replace-ext": "1.0.0"
+ }
+ },
+ "vinyl-buffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vinyl-buffer/-/vinyl-buffer-1.0.1.tgz",
+ "integrity": "sha1-lsGjR5uMU5JULGEgKQE7Wyf4i78=",
+ "dev": true,
+ "requires": {
+ "bl": "1.2.1",
+ "through2": "2.0.3"
+ }
+ },
+ "vinyl-fs": {
+ "version": "0.3.14",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz",
+ "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=",
+ "dev": true,
+ "requires": {
+ "defaults": "1.0.3",
+ "glob-stream": "3.1.18",
+ "glob-watcher": "0.0.6",
+ "graceful-fs": "3.0.11",
+ "mkdirp": "0.5.1",
+ "strip-bom": "1.0.0",
+ "through2": "0.6.5",
+ "vinyl": "0.4.6"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
+ "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
+ "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
+ "dev": true,
+ "requires": {
+ "natives": "1.1.0"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ },
+ "vinyl": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
+ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
+ "dev": true,
+ "requires": {
+ "clone": "0.2.0",
+ "clone-stats": "0.0.1"
+ }
+ }
+ }
+ },
+ "vinyl-source-stream": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz",
+ "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=",
+ "dev": true,
+ "requires": {
+ "through2": "2.0.3",
+ "vinyl": "0.4.6"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
+ "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
+ "vinyl": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
+ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
+ "dev": true,
+ "requires": {
+ "clone": "0.2.0",
+ "clone-stats": "0.0.1"
+ }
+ }
+ }
+ },
+ "vinyl-sourcemaps-apply": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz",
+ "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7"
+ }
+ },
+ "walkdir": {
+ "version": "0.0.11",
+ "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz",
+ "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=",
+ "dev": true
+ },
+ "wbuf": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz",
+ "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=",
+ "dev": true,
+ "requires": {
+ "minimalistic-assert": "1.0.0"
+ }
+ },
+ "wct-local": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wct-local/-/wct-local-2.1.0.tgz",
+ "integrity": "sha512-OiMSbxp6e5tyvTbUA4VAQbw4we53EXEmekx9BbIgS/HryoQISzap5DSAE/kvpRpJ2Axt0z12d8ChxqwNflApfA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "@types/express": "4.11.0",
+ "@types/freeport": "1.0.21",
+ "@types/launchpad": "0.6.0",
+ "@types/node": "9.3.0",
+ "@types/which": "1.3.1",
+ "chalk": "2.3.0",
+ "cleankill": "2.0.0",
+ "freeport": "1.0.5",
+ "launchpad": "0.7.0",
+ "promisify-node": "0.4.0",
+ "selenium-standalone": "6.12.0",
+ "which": "1.3.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.3.0.tgz",
+ "integrity": "sha512-wNBfvNjzsJl4tswIZKXCFQY0lss9nKUyJnG6T94X/eqjRgI2jHZ4evdjhQYBSan/vGtF6XVXPApOmNH2rf0KKw==",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "wct-sauce": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/wct-sauce/-/wct-sauce-2.0.0.tgz",
+ "integrity": "sha512-amICD6iZOVJEJ4uymfdPFdk17CkSIYwHPDzDh4cH/ITYcNskZ3VB/2VPtU9ZIKuWMVdqPwfBovXcjlhn8+8idA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "cleankill": "2.0.0",
+ "lodash": "3.10.1",
+ "request": "2.79.0",
+ "sauce-connect-launcher": "1.2.3",
+ "temp": "0.8.3",
+ "uuid": "2.0.3"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true,
+ "optional": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "wd": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/wd/-/wd-1.5.0.tgz",
+ "integrity": "sha512-e/KpzTlhtSG3Ek0AcRz4G6PhxGsc53Nro+GkI1er9p05tWQ7W9dpGZR5SqQzGUqvbaqJCThDSAGaY7LHgi6MiA==",
+ "dev": true,
+ "requires": {
+ "archiver": "1.3.0",
+ "async": "2.0.1",
+ "lodash": "4.16.2",
+ "mkdirp": "0.5.1",
+ "q": "1.4.1",
+ "request": "2.79.0",
+ "underscore.string": "3.3.4",
+ "vargs": "0.1.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.0.1.tgz",
+ "integrity": "sha1-twnMAoCpw28J9FNr6CPIOKkEniU=",
+ "dev": true,
+ "requires": {
+ "lodash": "4.16.2"
+ }
+ },
+ "lodash": {
+ "version": "4.16.2",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.2.tgz",
+ "integrity": "sha1-PmJtuCcEimmSgaihJSJjJs/A5lI=",
+ "dev": true
+ },
+ "q": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz",
+ "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=",
+ "dev": true
+ }
+ }
+ },
+ "web-component-tester": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/web-component-tester/-/web-component-tester-6.5.0.tgz",
+ "integrity": "sha512-C8nK7mhLTGzm/3QcjBIzI5Pk3OLrEvup246Pc9stAD+sTvLWtH8tjVL+vU5KCOAdudKVnelGMbE4ICaNrl69+A==",
+ "dev": true,
+ "requires": {
+ "@polymer/sinonjs": "1.17.1",
+ "@polymer/test-fixture": "0.0.3",
+ "@webcomponents/webcomponentsjs": "1.0.22",
+ "accessibility-developer-tools": "2.12.0",
+ "async": "2.6.0",
+ "body-parser": "1.18.2",
+ "chai": "4.1.2",
+ "chalk": "1.1.3",
+ "cleankill": "2.0.0",
+ "express": "4.16.2",
+ "findup-sync": "1.0.0",
+ "glob": "7.1.2",
+ "lodash": "3.10.1",
+ "mocha": "3.5.3",
+ "multer": "1.3.0",
+ "nomnom": "1.8.1",
+ "polyserve": "0.23.0",
+ "promisify-node": "0.4.0",
+ "resolve": "1.4.0",
+ "semver": "5.5.0",
+ "send": "0.11.1",
+ "server-destroy": "1.0.1",
+ "sinon": "2.4.1",
+ "sinon-chai": "2.14.0",
+ "socket.io": "2.0.4",
+ "stacky": "1.3.1",
+ "update-notifier": "2.3.0",
+ "wct-local": "2.1.0",
+ "wct-sauce": "2.0.0",
+ "wd": "1.5.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "findup-sync": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-1.0.0.tgz",
+ "integrity": "sha1-b35LV7buOkA3tEFOrt6j9Y9x4Ow=",
+ "dev": true,
+ "requires": {
+ "detect-file": "0.1.0",
+ "is-glob": "2.0.1",
+ "micromatch": "2.3.11",
+ "resolve-dir": "0.1.1"
+ }
+ },
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "which": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
+ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
+ "dev": true,
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ },
+ "widest-line": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz",
+ "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "winston": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz",
+ "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ }
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-2.0.0.tgz",
+ "integrity": "sha1-q1X2leYRjak4WP3XDAU9HF4BrCA=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "write": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+ "dev": true,
+ "requires": {
+ "mkdirp": "0.5.1"
+ }
+ },
+ "write-file-atomic": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz",
+ "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "imurmurhash": "0.1.4",
+ "slide": "1.1.6"
+ }
+ },
+ "ws": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
+ "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
+ "dev": true,
+ "requires": {
+ "async-limiter": "1.0.0",
+ "safe-buffer": "5.1.1",
+ "ultron": "1.1.1"
+ }
+ },
+ "xdg-basedir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz",
+ "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "xmlbuilder": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",
+ "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=",
+ "dev": true,
+ "optional": true
+ },
+ "xmldom": {
+ "version": "0.1.27",
+ "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz",
+ "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=",
+ "dev": true,
+ "optional": true
+ },
+ "xmlhttprequest-ssl": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
+ "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=",
+ "dev": true
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ },
+ "yauzl": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz",
+ "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "buffer-crc32": "0.2.13",
+ "fd-slicer": "1.0.1"
+ }
+ },
+ "yeast": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
+ "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
+ "dev": true
+ },
+ "zip-stream": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz",
+ "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=",
+ "dev": true,
+ "requires": {
+ "archiver-utils": "1.3.0",
+ "compress-commons": "1.2.2",
+ "lodash": "4.17.4",
+ "readable-stream": "2.3.3"
+ }
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/package.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/package.json
new file mode 100644
index 00000000000..a434247bd83
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/package.json
@@ -0,0 +1,56 @@
+{
+ "name": "@webcomponents/webcomponentsjs",
+ "version": "1.2.0",
+ "description": "Web Components Polyfills",
+ "main": "webcomponents-lite.js",
+ "directories": {
+ "test": "tests"
+ },
+ "keywords": [
+ "webcomponents",
+ "web-components",
+ "polyfill",
+ "shim"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/webcomponents/webcomponentsjs.git"
+ },
+ "author": "The Polymer Authors",
+ "license": "BSD-3-Clause",
+ "bugs": {
+ "url": "https://github.com/webcomponents/webcomponentsjs/issues"
+ },
+ "scripts": {
+ "build": "gulp",
+ "test": "wct"
+ },
+ "homepage": "https://webcomponents.org/polyfills",
+ "devDependencies": {
+ "@webcomponents/custom-elements": "^1.1.0",
+ "@webcomponents/html-imports": "^1.1.1",
+ "@webcomponents/shadycss": "^1.1.3",
+ "@webcomponents/shadydom": "^1.0.14",
+ "@webcomponents/template": "^1.2.4",
+ "@webcomponents/webcomponents-platform": "^1.0.0",
+ "babel-preset-minify": "^0.2.0",
+ "del": "^3.0.0",
+ "es6-promise": "4.1.x",
+ "eslint": "^4.19.1",
+ "google-closure-compiler": "^20171203.0.0",
+ "gulp": "^3.8.8",
+ "gulp-add-src": "^0.2.0",
+ "gulp-header": "^1.8.12",
+ "gulp-rename": "^1.2.2",
+ "gulp-sourcemaps": "^2.6.4",
+ "rollup-plugin-babel": "^2.7.1",
+ "rollup-stream": "=1.23",
+ "run-sequence": "^2.2.1",
+ "vinyl-buffer": "^1.0.1",
+ "vinyl-source-stream": "^1.1.2",
+ "web-component-tester": "^6.5.0"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/src/post-polyfill.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/src/post-polyfill.js
new file mode 100644
index 00000000000..2e36ad32268
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/src/post-polyfill.js
@@ -0,0 +1,63 @@
+/**
+ * @license
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+'use strict';
+
+let customElements = window['customElements'];
+let HTMLImports = window['HTMLImports'];
+let Template = window['HTMLTemplateElement'];
+
+// global for (1) existence means `WebComponentsReady` will file,
+// (2) WebComponents.ready == true means event has fired.
+window.WebComponents = window.WebComponents || {};
+
+if (customElements && customElements['polyfillWrapFlushCallback']) {
+ // Here we ensure that the public `HTMLImports.whenReady`
+ // always comes *after* custom elements have upgraded.
+ let flushCallback;
+ let runAndClearCallback = function runAndClearCallback() {
+ if (flushCallback) {
+ // make sure to run the HTMLTemplateElement polyfill before custom elements upgrade
+ if (Template.bootstrap) {
+ Template.bootstrap(window.document);
+ }
+ let cb = flushCallback;
+ flushCallback = null;
+ cb();
+ return true;
+ }
+ }
+ let origWhenReady = HTMLImports['whenReady'];
+ customElements['polyfillWrapFlushCallback'](function(cb) {
+ flushCallback = cb;
+ origWhenReady(runAndClearCallback);
+ });
+
+ HTMLImports['whenReady'] = function(cb) {
+ origWhenReady(function() {
+ // custom element code may add dynamic imports
+ // to match processing of native custom elements before
+ // domContentLoaded, we wait for these imports to resolve first.
+ if (runAndClearCallback()) {
+ HTMLImports['whenReady'](cb);
+ } else {
+ cb();
+ }
+ });
+ }
+
+}
+
+HTMLImports['whenReady'](function() {
+ requestAnimationFrame(function() {
+ window.WebComponents.ready = true;
+ document.dispatchEvent(new CustomEvent('WebComponentsReady', {bubbles: true}));
+ });
+}); \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/src/pre-polyfill.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/src/pre-polyfill.js
new file mode 100644
index 00000000000..336a86ebdd4
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/src/pre-polyfill.js
@@ -0,0 +1,63 @@
+/**
+ * @license
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+'use strict';
+
+// Establish scope.
+window['WebComponents'] = window['WebComponents'] || {'flags':{}};
+
+// loading script
+let file = 'webcomponents-lite.js';
+let script = document.querySelector('script[src*="' + file + '"]');
+let flagMatcher = /wc-(.+)/;
+
+// Flags. Convert url arguments to flags
+let flags = {};
+if (!flags['noOpts']) {
+ // from url
+ location.search.slice(1).split('&').forEach(function(option) {
+ let parts = option.split('=');
+ let match;
+ if (parts[0] && (match = parts[0].match(flagMatcher))) {
+ flags[match[1]] = parts[1] || true;
+ }
+ });
+ // from script
+ if (script) {
+ for (let i=0, a; (a=script.attributes[i]); i++) {
+ if (a.name !== 'src') {
+ flags[a.name] = a.value || true;
+ }
+ }
+ }
+ // log flags
+ if (flags['log'] && flags['log']['split']) {
+ let parts = flags['log'].split(',');
+ flags['log'] = {};
+ parts.forEach(function(f) {
+ flags['log'][f] = true;
+ });
+ } else {
+ flags['log'] = {};
+ }
+}
+
+// exports
+window['WebComponents']['flags'] = flags;
+let forceShady = flags['shadydom'];
+if (forceShady) {
+ window['ShadyDOM'] = window['ShadyDOM'] || {};
+ window['ShadyDOM']['force'] = forceShady;
+}
+
+let forceCE = flags['register'] || flags['ce'];
+if (forceCE && window['customElements']) {
+ window['customElements']['forcePolyfill'] = forceCE;
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/src/promise.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/src/promise.js
new file mode 100644
index 00000000000..ca01d623147
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/src/promise.js
@@ -0,0 +1,26 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+'use strict';
+import ES6Promise from '../node_modules/es6-promise/lib/es6-promise/promise.js';
+
+/*
+Assign the ES6 promise polyfill to window ourselves instead of using the "auto" polyfill
+to work around https://github.com/webcomponents/webcomponentsjs/issues/837
+*/
+if (!window.Promise) {
+ window.Promise = ES6Promise;
+ // save Promise API
+ ES6Promise.prototype['catch'] = ES6Promise.prototype.catch;
+ ES6Promise.prototype['then'] = ES6Promise.prototype.then;
+ ES6Promise['all'] = ES6Promise.all;
+ ES6Promise['race'] = ES6Promise.race;
+ ES6Promise['resolve'] = ES6Promise.resolve;
+ ES6Promise['reject'] = ES6Promise.reject;
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/src/unresolved.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/src/unresolved.js
new file mode 100644
index 00000000000..f6f2bb24dbe
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/src/unresolved.js
@@ -0,0 +1,31 @@
+/**
+ * @license
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+'use strict';
+// It's desireable to provide a default stylesheet
+// that's convenient for styling unresolved elements, but
+// it's cumbersome to have to include this manually in every page.
+// It would make sense to put inside some HTMLImport but
+// the HTMLImports polyfill does not allow loading of stylesheets
+// that block rendering. Therefore this injection is tolerated here.
+//
+// NOTE: position: relative fixes IE's failure to inherit opacity
+// when a child is not statically positioned.
+let style = document.createElement('style');
+style.textContent = ''
+ + 'body {'
+ + 'transition: opacity ease-in 0.2s;'
+ + ' } \n'
+ + 'body[unresolved] {'
+ + 'opacity: 0; display: block; overflow: hidden; position: relative;'
+ + ' } \n'
+ ;
+let head = document.querySelector('head');
+head.insertBefore(style, head.firstChild); \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/wct.conf.json b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/wct.conf.json
new file mode 100644
index 00000000000..76d7ee0bc6f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/wct.conf.json
@@ -0,0 +1,6 @@
+{
+ "suites": ["tests/runner.html"],
+ "clientOptions": {
+ "environmentImports": []
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-ce.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-ce.js
new file mode 100644
index 00000000000..916284ca2f5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-ce.js
@@ -0,0 +1,81 @@
+/**
+@license @nocompile
+Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+(function(){/*
+
+ Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ Code distributed by Google as part of the polymer project is also
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+'use strict';(function(a){function b(a,b){if("function"===typeof window.CustomEvent)return new CustomEvent(a,b);var c=document.createEvent("CustomEvent");c.initCustomEvent(a,!!b.bubbles,!!b.cancelable,b.detail);return c}function c(a){if(J)return a.ownerDocument!==document?a.ownerDocument:null;var b=a.__importDoc;if(!b&&a.parentNode){b=a.parentNode;if("function"===typeof b.closest)b=b.closest("link[rel=import]");else for(;!h(b)&&(b=b.parentNode););a.__importDoc=b}return b}function d(a){var b=l(document,
+"link[rel=import]:not([import-dependency])"),c=b.length;c?r(b,function(b){return k(b,function(){0===--c&&a()})}):a()}function e(a){function b(){"loading"!==document.readyState&&document.body&&(document.removeEventListener("readystatechange",b),a())}document.addEventListener("readystatechange",b);b()}function f(a){e(function(){return d(function(){return a&&a()})})}function k(a,b){if(a.__loaded)b&&b();else if("script"===a.localName&&!a.src||"style"===a.localName&&!a.firstChild)a.__loaded=!0,b&&b();
+else{var c=function(e){a.removeEventListener(e.type,c);a.__loaded=!0;b&&b()};a.addEventListener("load",c);K&&"style"===a.localName||a.addEventListener("error",c)}}function h(a){return a.nodeType===Node.ELEMENT_NODE&&"link"===a.localName&&"import"===a.rel}function g(){var a=this;this.a={};this.b=0;this.c=new MutationObserver(function(b){return a.K(b)});this.c.observe(document.head,{childList:!0,subtree:!0});this.loadImports(document)}function n(a){r(l(a,"template"),function(a){r(l(a.content,'script:not([type]),script[type="application/javascript"],script[type="text/javascript"]'),
+function(a){var b=document.createElement("script");r(a.attributes,function(a){return b.setAttribute(a.name,a.value)});b.textContent=a.textContent;a.parentNode.replaceChild(b,a)});n(a.content)})}function l(a,b){return a.childNodes.length?a.querySelectorAll(b):ya}function r(a,b,c){var e=a?a.length:0,d=c?-1:1;for(c=c?e-1:0;c<e&&0<=c;c+=d)b(a[c],c)}var A=document.createElement("link"),J="import"in A,ya=A.querySelectorAll("*"),L=null;!1==="currentScript"in document&&Object.defineProperty(document,"currentScript",
+{get:function(){return L||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null)},configurable:!0});var za=/(url\()([^)]*)(\))/g,Aa=/(@import[\s]+(?!url\())([^;]*)(;)/g,Ba=/(<link[^>]*)(rel=['|"]?stylesheet['|"]?[^>]*>)/g,t={I:function(a,b){a.href&&a.setAttribute("href",t.j(a.getAttribute("href"),b));a.src&&a.setAttribute("src",t.j(a.getAttribute("src"),b));if("style"===a.localName){var c=t.D(a.textContent,b,za);a.textContent=t.D(c,b,Aa)}},D:function(a,b,c){return a.replace(c,
+function(a,c,e,d){a=e.replace(/["']/g,"");b&&(a=t.j(a,b));return c+"'"+a+"'"+d})},j:function(a,b){if(void 0===t.m){t.m=!1;try{var c=new URL("b","http://a");c.pathname="c%20d";t.m="http://a/c%20d"===c.href}catch(Va){}}if(t.m)return(new URL(a,b)).href;c=t.F;c||(c=document.implementation.createHTMLDocument("temp"),t.F=c,c.A=c.createElement("base"),c.head.appendChild(c.A),c.w=c.createElement("a"));c.A.href=b;c.w.href=a;return c.w.href||a}},Z={async:!0,load:function(a,b,c){if(a)if(a.match(/^data:/)){a=
+a.split(",");var e=a[1];e=-1<a[0].indexOf(";base64")?atob(e):decodeURIComponent(e);b(e)}else{var d=new XMLHttpRequest;d.open("GET",a,Z.async);d.onload=function(){var a=d.responseURL||d.getResponseHeader("Location");a&&0===a.indexOf("/")&&(a=(location.origin||location.protocol+"//"+location.host)+a);var e=d.response||d.responseText;304===d.status||0===d.status||200<=d.status&&300>d.status?b(e,a):c(e)};d.send()}else c("error: href must be specified")}},K=/Trident/.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent);
+g.prototype.loadImports=function(a){var b=this;r(l(a,"link[rel=import]"),function(a){return b.B(a)})};g.prototype.B=function(a){var b=this,c=a.href;if(void 0!==this.a[c]){var e=this.a[c];e&&e.__loaded&&(a.__import=e,this.g(a))}else this.b++,this.a[c]="pending",Z.load(c,function(a,e){a=b.L(a,e||c);b.a[c]=a;b.b--;b.loadImports(a);b.C()},function(){b.a[c]=null;b.b--;b.C()})};g.prototype.L=function(a,b){if(!a)return document.createDocumentFragment();K&&(a=a.replace(Ba,function(a,b,c){return-1===a.indexOf("type=")?
+b+" type=import-disable "+c:a}));var c=document.createElement("template");c.innerHTML=a;if(c.content)a=c.content,n(a);else for(a=document.createDocumentFragment();c.firstChild;)a.appendChild(c.firstChild);if(c=a.querySelector("base"))b=t.j(c.getAttribute("href"),b),c.removeAttribute("href");var e=0;r(l(a,'link[rel=import],link[rel=stylesheet][href][type=import-disable],style:not([type]),link[rel=stylesheet][href]:not([type]),script:not([type]),script[type="application/javascript"],script[type="text/javascript"]'),
+function(a){k(a);t.I(a,b);a.setAttribute("import-dependency","");"script"===a.localName&&!a.src&&a.textContent&&(a.setAttribute("src","data:text/javascript;charset=utf-8,"+encodeURIComponent(a.textContent+("\n//# sourceURL="+b+(e?"-"+e:"")+".js\n"))),a.textContent="",e++)});return a};g.prototype.C=function(){var a=this;if(!this.b){this.c.disconnect();this.flatten(document);var b=!1,c=!1,e=function(){c&&b&&(a.loadImports(document),a.b||(a.c.observe(document.head,{childList:!0,subtree:!0}),a.J()))};
+this.N(function(){c=!0;e()});this.M(function(){b=!0;e()})}};g.prototype.flatten=function(a){var b=this;r(l(a,"link[rel=import]"),function(a){var c=b.a[a.href];(a.__import=c)&&c.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&(b.a[a.href]=a,a.readyState="loading",a.__import=a,b.flatten(c),a.appendChild(c))})};g.prototype.M=function(a){function b(d){if(d<e){var f=c[d],h=document.createElement("script");f.removeAttribute("import-dependency");r(f.attributes,function(a){return h.setAttribute(a.name,a.value)});
+L=h;f.parentNode.replaceChild(h,f);k(h,function(){L=null;b(d+1)})}else a()}var c=l(document,"script[import-dependency]"),e=c.length;b(0)};g.prototype.N=function(a){var b=l(document,"style[import-dependency],link[rel=stylesheet][import-dependency]"),e=b.length;if(e){var d=K&&!!document.querySelector("link[rel=stylesheet][href][type=import-disable]");r(b,function(b){k(b,function(){b.removeAttribute("import-dependency");0===--e&&a()});if(d&&b.parentNode!==document.head){var f=document.createElement(b.localName);
+f.__appliedElement=b;f.setAttribute("type","import-placeholder");b.parentNode.insertBefore(f,b.nextSibling);for(f=c(b);f&&c(f);)f=c(f);f.parentNode!==document.head&&(f=null);document.head.insertBefore(b,f);b.removeAttribute("type")}})}else a()};g.prototype.J=function(){var a=this;r(l(document,"link[rel=import]"),function(b){return a.g(b)},!0)};g.prototype.g=function(a){a.__loaded||(a.__loaded=!0,a.import&&(a.import.readyState="complete"),a.dispatchEvent(b(a.import?"load":"error",{bubbles:!1,cancelable:!1,
+detail:void 0})))};g.prototype.K=function(a){var b=this;r(a,function(a){return r(a.addedNodes,function(a){a&&a.nodeType===Node.ELEMENT_NODE&&(h(a)?b.B(a):b.loadImports(a))})})};var M=null;if(J)r(l(document,"link[rel=import]"),function(a){a.import&&"loading"===a.import.readyState||(a.__loaded=!0)}),A=function(a){a=a.target;h(a)&&(a.__loaded=!0)},document.addEventListener("load",A,!0),document.addEventListener("error",A,!0);else{var B=Object.getOwnPropertyDescriptor(Node.prototype,"baseURI");Object.defineProperty((!B||
+B.configurable?Node:Element).prototype,"baseURI",{get:function(){var a=h(this)?this:c(this);return a?a.href:B&&B.get?B.get.call(this):(document.querySelector("base")||window.location).href},configurable:!0,enumerable:!0});Object.defineProperty(HTMLLinkElement.prototype,"import",{get:function(){return this.__import||null},configurable:!0,enumerable:!0});e(function(){M=new g})}f(function(){return document.dispatchEvent(b("HTMLImportsLoaded",{cancelable:!0,bubbles:!0,detail:void 0}))});a.useNative=J;
+a.whenReady=f;a.importForElement=c;a.loadImports=function(a){M&&M.loadImports(a)}})(window.HTMLImports=window.HTMLImports||{});var aa=new Set("annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph".split(" "));function ba(a){var b=aa.has(a);a=/^[a-z][.0-9_a-z]*-[\-.0-9_a-z]*$/.test(a);return!b&&a}function m(a){var b=a.isConnected;if(void 0!==b)return b;for(;a&&!(a.__CE_isImportDocument||a instanceof Document);)a=a.parentNode||(window.ShadowRoot&&a instanceof ShadowRoot?a.host:void 0);return!(!a||!(a.__CE_isImportDocument||a instanceof Document))}
+function p(a,b){for(;b&&b!==a&&!b.nextSibling;)b=b.parentNode;return b&&b!==a?b.nextSibling:null}
+function q(a,b,c){c=void 0===c?new Set:c;for(var d=a;d;){if(d.nodeType===Node.ELEMENT_NODE){var e=d;b(e);var f=e.localName;if("link"===f&&"import"===e.getAttribute("rel")){d=e.import;if(d instanceof Node&&!c.has(d))for(c.add(d),d=d.firstChild;d;d=d.nextSibling)q(d,b,c);d=p(a,e);continue}else if("template"===f){d=p(a,e);continue}if(e=e.__CE_shadowRoot)for(e=e.firstChild;e;e=e.nextSibling)q(e,b,c)}d=d.firstChild?d.firstChild:p(a,d)}}function u(a,b,c){a[b]=c};function v(){this.a=new Map;this.g=new Map;this.c=[];this.b=!1}function ca(a,b,c){a.a.set(b,c);a.g.set(c.constructor,c)}function da(a,b){a.b=!0;a.c.push(b)}function w(a,b){a.b&&q(b,function(b){return x(a,b)})}function x(a,b){if(a.b&&!b.__CE_patched){b.__CE_patched=!0;for(var c=0;c<a.c.length;c++)a.c[c](b)}}function y(a,b){var c=[];q(b,function(a){return c.push(a)});for(b=0;b<c.length;b++){var d=c[b];1===d.__CE_state?a.connectedCallback(d):z(a,d)}}
+function C(a,b){var c=[];q(b,function(a){return c.push(a)});for(b=0;b<c.length;b++){var d=c[b];1===d.__CE_state&&a.disconnectedCallback(d)}}
+function D(a,b,c){c=void 0===c?{}:c;var d=c.O||new Set,e=c.l||function(b){return z(a,b)},f=[];q(b,function(b){if("link"===b.localName&&"import"===b.getAttribute("rel")){var c=b.import;c instanceof Node&&(c.__CE_isImportDocument=!0,c.__CE_hasRegistry=!0);c&&"complete"===c.readyState?c.__CE_documentLoadHandled=!0:b.addEventListener("load",function(){var c=b.import;if(!c.__CE_documentLoadHandled){c.__CE_documentLoadHandled=!0;var f=new Set(d);f.delete(c);D(a,c,{O:f,l:e})}})}else f.push(b)},d);if(a.b)for(b=
+0;b<f.length;b++)x(a,f[b]);for(b=0;b<f.length;b++)e(f[b])}
+function z(a,b){if(void 0===b.__CE_state){var c=b.ownerDocument;if(c.defaultView||c.__CE_isImportDocument&&c.__CE_hasRegistry)if(c=a.a.get(b.localName)){c.constructionStack.push(b);var d=c.constructor;try{try{if(new d!==b)throw Error("The custom element constructor did not produce the element being upgraded.");}finally{c.constructionStack.pop()}}catch(k){throw b.__CE_state=2,k;}b.__CE_state=1;b.__CE_definition=c;if(c.attributeChangedCallback)for(c=c.observedAttributes,d=0;d<c.length;d++){var e=c[d],
+f=b.getAttribute(e);null!==f&&a.attributeChangedCallback(b,e,null,f,null)}m(b)&&a.connectedCallback(b)}}}v.prototype.connectedCallback=function(a){var b=a.__CE_definition;b.connectedCallback&&b.connectedCallback.call(a)};v.prototype.disconnectedCallback=function(a){var b=a.__CE_definition;b.disconnectedCallback&&b.disconnectedCallback.call(a)};
+v.prototype.attributeChangedCallback=function(a,b,c,d,e){var f=a.__CE_definition;f.attributeChangedCallback&&-1<f.observedAttributes.indexOf(b)&&f.attributeChangedCallback.call(a,b,c,d,e)};function E(a){var b=document;this.f=a;this.a=b;this.b=void 0;D(this.f,this.a);"loading"===this.a.readyState&&(this.b=new MutationObserver(this.c.bind(this)),this.b.observe(this.a,{childList:!0,subtree:!0}))}E.prototype.disconnect=function(){this.b&&this.b.disconnect()};E.prototype.c=function(a){var b=this.a.readyState;"interactive"!==b&&"complete"!==b||this.disconnect();for(b=0;b<a.length;b++)for(var c=a[b].addedNodes,d=0;d<c.length;d++)D(this.f,c[d])};function ea(){var a=this;this.b=this.a=void 0;this.c=new Promise(function(b){a.b=b;a.a&&b(a.a)})}function fa(a){if(a.a)throw Error("Already resolved.");a.a=void 0;a.b&&a.b(void 0)};function F(a){this.o=!1;this.f=a;this.v=new Map;this.s=function(a){return a()};this.h=!1;this.u=[];this.G=new E(a)}
+F.prototype.a=function(a,b){var c=this;if(!(b instanceof Function))throw new TypeError("Custom element constructors must be functions.");if(!ba(a))throw new SyntaxError("The element name '"+a+"' is not valid.");if(this.f.a.get(a))throw Error("A custom element with name '"+a+"' has already been defined.");if(this.o)throw Error("A custom element is already being defined.");this.o=!0;try{var d=function(a){var b=e[a];if(void 0!==b&&!(b instanceof Function))throw Error("The '"+a+"' callback must be a function.");
+return b},e=b.prototype;if(!(e instanceof Object))throw new TypeError("The custom element constructor's prototype is not an object.");var f=d("connectedCallback");var k=d("disconnectedCallback");var h=d("adoptedCallback");var g=d("attributeChangedCallback");var n=b.observedAttributes||[]}catch(l){return}finally{this.o=!1}b={localName:a,constructor:b,connectedCallback:f,disconnectedCallback:k,adoptedCallback:h,attributeChangedCallback:g,observedAttributes:n,constructionStack:[]};ca(this.f,a,b);this.u.push(b);
+this.h||(this.h=!0,this.s(function(){return ha(c)}))};F.prototype.l=function(a){D(this.f,a)};function ha(a){if(!1!==a.h){a.h=!1;for(var b=a.u,c=[],d=new Map,e=0;e<b.length;e++)d.set(b[e].localName,[]);D(a.f,document,{l:function(b){if(void 0===b.__CE_state){var e=b.localName,f=d.get(e);f?f.push(b):a.f.a.get(e)&&c.push(b)}}});for(e=0;e<c.length;e++)z(a.f,c[e]);for(;0<b.length;){var f=b.shift();e=f.localName;f=d.get(f.localName);for(var k=0;k<f.length;k++)z(a.f,f[k]);(e=a.v.get(e))&&fa(e)}}}
+F.prototype.get=function(a){if(a=this.f.a.get(a))return a.constructor};F.prototype.b=function(a){if(!ba(a))return Promise.reject(new SyntaxError("'"+a+"' is not a valid custom element name."));var b=this.v.get(a);if(b)return b.c;b=new ea;this.v.set(a,b);this.f.a.get(a)&&!this.u.some(function(b){return b.localName===a})&&fa(b);return b.c};F.prototype.c=function(a){this.G.disconnect();var b=this.s;this.s=function(c){return a(function(){return b(c)})}};window.CustomElementRegistry=F;
+F.prototype.define=F.prototype.a;F.prototype.upgrade=F.prototype.l;F.prototype.get=F.prototype.get;F.prototype.whenDefined=F.prototype.b;F.prototype.polyfillWrapFlushCallback=F.prototype.c;var G=window.Document.prototype.createElement,ia=window.Document.prototype.createElementNS,ja=window.Document.prototype.importNode,ka=window.Document.prototype.prepend,la=window.Document.prototype.append,ma=window.DocumentFragment.prototype.prepend,na=window.DocumentFragment.prototype.append,oa=window.Node.prototype.cloneNode,H=window.Node.prototype.appendChild,pa=window.Node.prototype.insertBefore,I=window.Node.prototype.removeChild,qa=window.Node.prototype.replaceChild,N=Object.getOwnPropertyDescriptor(window.Node.prototype,
+"textContent"),ra=window.Element.prototype.attachShadow,O=Object.getOwnPropertyDescriptor(window.Element.prototype,"innerHTML"),P=window.Element.prototype.getAttribute,sa=window.Element.prototype.setAttribute,ta=window.Element.prototype.removeAttribute,Q=window.Element.prototype.getAttributeNS,ua=window.Element.prototype.setAttributeNS,va=window.Element.prototype.removeAttributeNS,wa=window.Element.prototype.insertAdjacentElement,xa=window.Element.prototype.insertAdjacentHTML,Ca=window.Element.prototype.prepend,
+Da=window.Element.prototype.append,R=window.Element.prototype.before,Ea=window.Element.prototype.after,Fa=window.Element.prototype.replaceWith,Ga=window.Element.prototype.remove,Ha=window.HTMLElement,S=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML"),Ia=window.HTMLElement.prototype.insertAdjacentElement,Ja=window.HTMLElement.prototype.insertAdjacentHTML;var Ka=new function(){};function La(){var a=T;window.HTMLElement=function(){function b(){var b=this.constructor,d=a.g.get(b);if(!d)throw Error("The custom element being constructed was not registered with `customElements`.");var e=d.constructionStack;if(0===e.length)return e=G.call(document,d.localName),Object.setPrototypeOf(e,b.prototype),e.__CE_state=1,e.__CE_definition=d,x(a,e),e;d=e.length-1;var f=e[d];if(f===Ka)throw Error("The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.");
+e[d]=Ka;Object.setPrototypeOf(f,b.prototype);x(a,f);return f}b.prototype=Ha.prototype;return b}()};function U(a,b,c){function d(b){return function(c){for(var e=[],d=0;d<arguments.length;++d)e[d-0]=arguments[d];d=[];for(var f=[],n=0;n<e.length;n++){var l=e[n];l instanceof Element&&m(l)&&f.push(l);if(l instanceof DocumentFragment)for(l=l.firstChild;l;l=l.nextSibling)d.push(l);else d.push(l)}b.apply(this,e);for(e=0;e<f.length;e++)C(a,f[e]);if(m(this))for(e=0;e<d.length;e++)f=d[e],f instanceof Element&&y(a,f)}}void 0!==c.i&&(b.prepend=d(c.i));void 0!==c.append&&(b.append=d(c.append))};function Ma(){var a=T;u(Document.prototype,"createElement",function(b){if(this.__CE_hasRegistry){var c=a.a.get(b);if(c)return new c.constructor}b=G.call(this,b);x(a,b);return b});u(Document.prototype,"importNode",function(b,c){b=ja.call(this,b,c);this.__CE_hasRegistry?D(a,b):w(a,b);return b});u(Document.prototype,"createElementNS",function(b,c){if(this.__CE_hasRegistry&&(null===b||"http://www.w3.org/1999/xhtml"===b)){var d=a.a.get(c);if(d)return new d.constructor}b=ia.call(this,b,c);x(a,b);return b});
+U(a,Document.prototype,{i:ka,append:la})};function Na(){var a=T;function b(b,d){Object.defineProperty(b,"textContent",{enumerable:d.enumerable,configurable:!0,get:d.get,set:function(b){if(this.nodeType===Node.TEXT_NODE)d.set.call(this,b);else{var c=void 0;if(this.firstChild){var e=this.childNodes,h=e.length;if(0<h&&m(this)){c=Array(h);for(var g=0;g<h;g++)c[g]=e[g]}}d.set.call(this,b);if(c)for(b=0;b<c.length;b++)C(a,c[b])}}})}u(Node.prototype,"insertBefore",function(b,d){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);
+b=pa.call(this,b,d);if(m(this))for(d=0;d<c.length;d++)y(a,c[d]);return b}c=m(b);d=pa.call(this,b,d);c&&C(a,b);m(this)&&y(a,b);return d});u(Node.prototype,"appendChild",function(b){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);b=H.call(this,b);if(m(this))for(var e=0;e<c.length;e++)y(a,c[e]);return b}c=m(b);e=H.call(this,b);c&&C(a,b);m(this)&&y(a,b);return e});u(Node.prototype,"cloneNode",function(b){b=oa.call(this,b);this.ownerDocument.__CE_hasRegistry?D(a,b):w(a,
+b);return b});u(Node.prototype,"removeChild",function(b){var c=m(b),e=I.call(this,b);c&&C(a,b);return e});u(Node.prototype,"replaceChild",function(b,d){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);b=qa.call(this,b,d);if(m(this))for(C(a,d),d=0;d<c.length;d++)y(a,c[d]);return b}c=m(b);var f=qa.call(this,b,d),k=m(this);k&&C(a,d);c&&C(a,b);k&&y(a,b);return f});N&&N.get?b(Node.prototype,N):da(a,function(a){b(a,{enumerable:!0,configurable:!0,get:function(){for(var a=
+[],b=0;b<this.childNodes.length;b++)a.push(this.childNodes[b].textContent);return a.join("")},set:function(a){for(;this.firstChild;)I.call(this,this.firstChild);H.call(this,document.createTextNode(a))}})})};function Oa(a){var b=Element.prototype;function c(b){return function(c){for(var e=[],d=0;d<arguments.length;++d)e[d-0]=arguments[d];d=[];for(var h=[],g=0;g<e.length;g++){var n=e[g];n instanceof Element&&m(n)&&h.push(n);if(n instanceof DocumentFragment)for(n=n.firstChild;n;n=n.nextSibling)d.push(n);else d.push(n)}b.apply(this,e);for(e=0;e<h.length;e++)C(a,h[e]);if(m(this))for(e=0;e<d.length;e++)h=d[e],h instanceof Element&&y(a,h)}}void 0!==R&&(b.before=c(R));void 0!==R&&(b.after=c(Ea));void 0!==Fa&&
+u(b,"replaceWith",function(b){for(var c=[],d=0;d<arguments.length;++d)c[d-0]=arguments[d];d=[];for(var k=[],h=0;h<c.length;h++){var g=c[h];g instanceof Element&&m(g)&&k.push(g);if(g instanceof DocumentFragment)for(g=g.firstChild;g;g=g.nextSibling)d.push(g);else d.push(g)}h=m(this);Fa.apply(this,c);for(c=0;c<k.length;c++)C(a,k[c]);if(h)for(C(a,this),c=0;c<d.length;c++)k=d[c],k instanceof Element&&y(a,k)});void 0!==Ga&&u(b,"remove",function(){var b=m(this);Ga.call(this);b&&C(a,this)})};function Pa(){var a=T;function b(b,c){Object.defineProperty(b,"innerHTML",{enumerable:c.enumerable,configurable:!0,get:c.get,set:function(b){var e=this,d=void 0;m(this)&&(d=[],q(this,function(a){a!==e&&d.push(a)}));c.set.call(this,b);if(d)for(var f=0;f<d.length;f++){var k=d[f];1===k.__CE_state&&a.disconnectedCallback(k)}this.ownerDocument.__CE_hasRegistry?D(a,this):w(a,this);return b}})}function c(b,c){u(b,"insertAdjacentElement",function(b,e){var d=m(e);b=c.call(this,b,e);d&&C(a,e);m(b)&&y(a,e);
+return b})}function d(b,c){function e(b,c){for(var e=[];b!==c;b=b.nextSibling)e.push(b);for(c=0;c<e.length;c++)D(a,e[c])}u(b,"insertAdjacentHTML",function(a,b){a=a.toLowerCase();if("beforebegin"===a){var d=this.previousSibling;c.call(this,a,b);e(d||this.parentNode.firstChild,this)}else if("afterbegin"===a)d=this.firstChild,c.call(this,a,b),e(this.firstChild,d);else if("beforeend"===a)d=this.lastChild,c.call(this,a,b),e(d||this.firstChild,null);else if("afterend"===a)d=this.nextSibling,c.call(this,
+a,b),e(this.nextSibling,d);else throw new SyntaxError("The value provided ("+String(a)+") is not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'.");})}ra&&u(Element.prototype,"attachShadow",function(a){return this.__CE_shadowRoot=a=ra.call(this,a)});O&&O.get?b(Element.prototype,O):S&&S.get?b(HTMLElement.prototype,S):da(a,function(a){b(a,{enumerable:!0,configurable:!0,get:function(){return oa.call(this,!0).innerHTML},set:function(a){var b="template"===this.localName,c=b?this.content:
+this,e=G.call(document,this.localName);for(e.innerHTML=a;0<c.childNodes.length;)I.call(c,c.childNodes[0]);for(a=b?e.content:e;0<a.childNodes.length;)H.call(c,a.childNodes[0])}})});u(Element.prototype,"setAttribute",function(b,c){if(1!==this.__CE_state)return sa.call(this,b,c);var e=P.call(this,b);sa.call(this,b,c);c=P.call(this,b);a.attributeChangedCallback(this,b,e,c,null)});u(Element.prototype,"setAttributeNS",function(b,c,d){if(1!==this.__CE_state)return ua.call(this,b,c,d);var e=Q.call(this,b,
+c);ua.call(this,b,c,d);d=Q.call(this,b,c);a.attributeChangedCallback(this,c,e,d,b)});u(Element.prototype,"removeAttribute",function(b){if(1!==this.__CE_state)return ta.call(this,b);var c=P.call(this,b);ta.call(this,b);null!==c&&a.attributeChangedCallback(this,b,c,null,null)});u(Element.prototype,"removeAttributeNS",function(b,c){if(1!==this.__CE_state)return va.call(this,b,c);var d=Q.call(this,b,c);va.call(this,b,c);var e=Q.call(this,b,c);d!==e&&a.attributeChangedCallback(this,c,d,e,b)});Ia?c(HTMLElement.prototype,
+Ia):wa?c(Element.prototype,wa):console.warn("Custom Elements: `Element#insertAdjacentElement` was not patched.");Ja?d(HTMLElement.prototype,Ja):xa?d(Element.prototype,xa):console.warn("Custom Elements: `Element#insertAdjacentHTML` was not patched.");U(a,Element.prototype,{i:Ca,append:Da});Oa(a)};var V=window.customElements;if(!V||V.forcePolyfill||"function"!=typeof V.define||"function"!=typeof V.get){var T=new v;La();Ma();U(T,DocumentFragment.prototype,{i:ma,append:na});Na();Pa();document.__CE_hasRegistry=!0;var customElements=new F(T);Object.defineProperty(window,"customElements",{configurable:!0,enumerable:!0,value:customElements})};/*
+
+ Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ Code distributed by Google as part of the polymer project is also
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+var W=window.customElements,X=window.HTMLImports,Qa=window.HTMLTemplateElement;window.WebComponents=window.WebComponents||{};if(W&&W.polyfillWrapFlushCallback){var Y,Ra=function(){if(Y){Qa.H&&Qa.H(window.document);var a=Y;Y=null;a();return!0}},Sa=X.whenReady;W.polyfillWrapFlushCallback(function(a){Y=a;Sa(Ra)});X.whenReady=function(a){Sa(function(){Ra()?X.whenReady(a):a()})}}
+X.whenReady(function(){requestAnimationFrame(function(){window.WebComponents.ready=!0;document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})});var Ta=document.createElement("style");Ta.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var Ua=document.querySelector("head");Ua.insertBefore(Ta,Ua.firstChild);/*
+
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+}).call(this);
+
+//# sourceMappingURL=webcomponents-hi-ce.js.map
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-ce.js.map b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-ce.js.map
new file mode 100644
index 00000000000..ad850a2db16
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-ce.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["node_modules/@webcomponents/html-imports/src/html-imports.js","node_modules/@webcomponents/custom-elements/src/Utilities.js","node_modules/@webcomponents/custom-elements/src/CustomElementInternals.js","node_modules/@webcomponents/custom-elements/src/CustomElementState.js","node_modules/@webcomponents/custom-elements/src/DocumentConstructionObserver.js","node_modules/@webcomponents/custom-elements/src/CustomElementRegistry.js","node_modules/@webcomponents/custom-elements/src/Deferred.js","node_modules/@webcomponents/custom-elements/src/Patch/Native.js","node_modules/@webcomponents/custom-elements/src/AlreadyConstructedMarker.js","node_modules/@webcomponents/custom-elements/src/Patch/HTMLElement.js","node_modules/@webcomponents/custom-elements/src/custom-elements.js","node_modules/@webcomponents/custom-elements/src/Patch/Interface/ParentNode.js","node_modules/@webcomponents/custom-elements/src/Patch/Document.js","node_modules/@webcomponents/custom-elements/src/Patch/Node.js","node_modules/@webcomponents/custom-elements/src/Patch/Interface/ChildNode.js","node_modules/@webcomponents/custom-elements/src/Patch/Element.js","node_modules/@webcomponents/custom-elements/src/Patch/DocumentFragment.js","src/post-polyfill.js","src/unresolved.js"],"names":["scope","newCustomEvent","type","params","window","CustomEvent","event","document","createEvent","initCustomEvent","bubbles","cancelable","detail","importForElement","element","useNative","ownerDocument","doc","parentNode","closest","importSelector","isImportLink","whenImportsReady","callback","imports","QSA","rootImportSelector","pending","length","forEach","imp","whenElementLoaded","whenDocumentReady","stateChanged","readyState","body","removeEventListener","addEventListener","whenReady","localName","src","firstChild","onLoadingDone","isIE","node","nodeType","Node","ELEMENT_NODE","rel","constructor","Importer","documents","inflight","dynamicImportsMO","MutationObserver","m","handleMutations","observe","head","childList","subtree","loadImports","replaceScripts","fragment","template","content","scriptsSelector","script","clone","createElement","attributes","attr","setAttribute","name","value","textContent","replaceChild","selector","childNodes","querySelectorAll","emptyNodeList","list","inverseOrder","increment","i","link","currentScript","Object","defineProperty","get","scripts","configurable","CSS_URL_REGEXP","CSS_IMPORT_REGEXP","STYLESHEET_REGEXP","Path","fixUrls","base","href","resolveUrl","getAttribute","r","replaceUrls","text","linkUrl","regexp","replace","pre","url","post","urlPath","undefined","__workingURL","u","URL","pathname","e","__tempDoc","implementation","createHTMLDocument","__base","appendChild","__anchor","Xhr","async","load","success","fail","match","pieces","split","resource","header","indexOf","atob","decodeURIComponent","request","XMLHttpRequest","open","onload","request.onload","redirectedUrl","responseURL","getResponseHeader","location","origin","protocol","host","response","responseText","status","send","test","navigator","userAgent","links","loadImport","fireEventIfNeeded","makeDocument","processImportsIfLoadingDone","createDocumentFragment","p1","p2","innerHTML","baseEl","querySelector","removeAttribute","inlineScriptIndex","n$","importDependenciesSelector","n","importDependencyAttr","encodeURIComponent","num","disconnect","flatten","scriptsOk","stylesOk","fireEvents","waitForStyles","runScripts","DOCUMENT_FRAGMENT_NODE","cloneScript","l","s","s$","pendingScriptsSelector","pendingStylesSelector","needsMove","disabledLinkSelector","placeholder","insertBefore","nextSibling","newSibling","import","dispatchEvent","eventType","mutations","addedNodes","elem","importer","imps","target","native_baseURI","getOwnPropertyDescriptor","prototype","klass","Element","ownerDoc","call","enumerable","HTMLLinkElement","HTMLImports","reservedTagList","Set","isValidCustomElementName","reserved","has","validForm","isConnected","nativeValue","current","__CE_isImportDocument","Document","ShadowRoot","nextSiblingOrAncestorSibling","root","start","walkDeepDescendantElements","visitedImports","importNode","add","child","shadowRoot","__CE_shadowRoot","setPropertyUnchecked","destination","CustomElementInternals","_localNameToDefinition","Map","_constructorToDefinition","_patches","_hasPatches","setDefinition","definition","set","addPatch","listener","push","patchTree","patch","__CE_patched","connectTree","elements","custom","__CE_state","connectedCallback","upgradeElement","disconnectTree","disconnectedCallback","patchAndUpgradeTree","options","upgrade","gatherElements","__CE_hasRegistry","__CE_documentLoadHandled","clonedVisitedImports","delete","defaultView","localNameToDefinition","constructionStack","result","Error","pop","failed","__CE_definition","attributeChangedCallback","observedAttributes","oldValue","newValue","namespace","DocumentConstructionObserver","internals","_internals","_document","_observer","_handleMutations","bind","j","Deferred","_resolve","_value","_promise","Promise","resolve","CustomElementRegistry","_elementDefinitionIsRunning","_whenDefinedDeferred","_flushCallback","this._flushCallback","fn","_flushPending","_pendingDefinitions","_documentConstructionObserver","define","Function","TypeError","SyntaxError","getCallback","callbackValue","adoptedCallback","_flush","pendingDefinitions","elementsWithStableDefinitions","elementsWithPendingDefinitions","pendingElements","shift","pendingUpgradableElements","deferred","whenDefined","reject","prior","some","d","polyfillWrapFlushCallback","outer","inner","flush","Document_createElement","Document_createElementNS","createElementNS","Document_importNode","Document_prepend","Document_append","DocumentFragment_prepend","DocumentFragment","DocumentFragment_append","Node_cloneNode","cloneNode","Node_appendChild","Node_insertBefore","Node_removeChild","removeChild","Node_replaceChild","Node_textContent","Element_attachShadow","Element_innerHTML","Element_getAttribute","Element_setAttribute","Element_removeAttribute","Element_getAttributeNS","getAttributeNS","Element_setAttributeNS","setAttributeNS","Element_removeAttributeNS","removeAttributeNS","Element_insertAdjacentElement","Element_insertAdjacentHTML","Element_prepend","Element_append","Element_before","Element_after","Element_replaceWith","Element_remove","HTMLElement","HTMLElement_innerHTML","HTMLElement_insertAdjacentElement","HTMLElement_insertAdjacentHTML","$jscompDefaultExport","AlreadyConstructedMarker","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Document_createElement.call","setPrototypeOf","lastIndex","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.HTMLElement","builtIn","appendPrependPatch","builtInMethod","flattenedNodes","connectedElements","nodes","apply","prepend","append","deep","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Document_importNode.call","NS_HTML","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Document_createElementNS.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Document_prepend","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Document_append","patch_textContent","baseDescriptor","assignedValue","TEXT_NODE","removedNodes","childNodesLength","Array","refNode","insertedNodes","slice","nativeResult","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_insertBefore.call","nodeWasConnected","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_appendChild.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_cloneNode.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_removeChild.call","nodeToInsert","nodeToRemove","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_replaceChild.call","nodeToInsertWasConnected","thisIsConnected","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_textContent","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_textContent.get","parts","join","createTextNode","beforeAfterPatch","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_before","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_after","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_replaceWith","wasConnected","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_remove","patch_innerHTML","htmlString","removedElements","patch_insertAdjacentElement","baseMethod","position","insertedElement","patch_insertAdjacentHTML","upgradeNodesInRange","end","toLowerCase","marker","previousSibling","lastChild","String","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_attachShadow","init","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_attachShadow.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_innerHTML","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_innerHTML.get","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.HTMLElement_innerHTML","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.HTMLElement_innerHTML.get","isTemplate","rawElement","container","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_setAttribute.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_getAttribute.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_setAttributeNS.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_getAttributeNS.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_removeAttribute.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_removeAttributeNS.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.HTMLElement_insertAdjacentElement","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_insertAdjacentElement","console","warn","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.HTMLElement_insertAdjacentHTML","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_insertAdjacentHTML","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_prepend","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_append","priorCustomElements","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.DocumentFragment_prepend","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.DocumentFragment_append","customElements","Template","WebComponents","flushCallback","runAndClearCallback","bootstrap","cb","origWhenReady","requestAnimationFrame","ready","style"],"mappings":"A;;;;;;;;;;;;;;;;;;aASC,SAAA,CAAAA,CAAA,CAAS,CAsqBeC,QAAA,EAAA,CAACC,CAAD,CAAOC,CAAP,CAAkB,CACvC,GAAkC,UAAlC,GAAI,MAAOC,OAAAC,YAAX,CACE,MAAO,KAAIA,WAAJ,CAAgBH,CAAhB,CAAsBC,CAAtB,CAET,KAAMG,EAAqCC,QAAAC,YAAA,CAAqB,aAArB,CAC3CF,EAAAG,gBAAA,CAAsBP,CAAtB,CAA4B,CAAA,CAAQC,CAAAO,QAApC,CAAqD,CAAA,CAAQP,CAAAQ,WAA7D,CAAiFR,CAAAS,OAAjF,CACA,OAAON,EANgC,CAjChBO,QAAA,EAAA,CAAAC,CAAA,CAAW,CAClC,GAAIC,CAAJ,CAEE,MAAOD,EAAAE,cAAA,GAA0BT,QAA1B,CAAqCO,CAAAE,cAArC,CAA6D,IAEtE,KAAIC,EAAMH,CAAA,YACV,IAAI,CAACG,CAAL,EAAYH,CAAAI,WAAZ,CAAgC,CAC9BD,CAAA,CAA+BH,CAAAI,WAC/B,IAA2B,UAA3B,GAAI,MAAOD,EAAAE,QAAX,CAGEF,CAAA,CAAMA,CAAAE,QAAA,CAndWC,kBAmdX,CAHR,KAME,KAAA,CAAO,CAACC,CAAA,CAAaJ,CAAb,CAAR,GAA8BA,CAA9B,CAAoCA,CAAAC,WAApC,EAAA,EAEFJ,CAAA,YAAA,CAAyBG,CAVK,CAYhC,MAAOA,EAlB2B,CApBXK,QAAA,EAAA,CAAAC,CAAA,CAAY,CACnC,IAAIC,EACDC,CAAA,CAAIlB,QAAJ;AAvasBmB,2CAuatB,CADH,CAEIC,EAAUH,CAAAI,OACTD,EAAL,CAIAE,CAAA,CAAQL,CAAR,CAAiB,QAAA,CAAAM,CAAA,CAAO,CAAA,MAAAC,EAAA,CAAkBD,CAAlB,CAAuB,QAAA,EAAM,CACjC,CAAlB,GAAI,EAAEH,CAAN,EACEJ,CAAA,EAFiD,CAA7B,CAAA,CAAxB,CAJA,CACEA,CAAA,EALiC,CAlBXS,QAAA,EAAA,CAAAT,CAAA,CAAY,CACfU,QAAA,EAAA,EAAM,CAGG,SAA5B,GAAI1B,QAAA2B,WAAJ,EAA2C3B,QAAA4B,KAA3C,GACE5B,QAAA6B,oBAAA,CAA6B,kBAA7B,CAAiDH,CAAjD,CACA,CAAAV,CAAA,EAFF,CAHyB,CAQ3BhB,QAAA8B,iBAAA,CAA0B,kBAA1B,CAA8CJ,CAA9C,CACAA,EAAA,EAVoC,CAXpBK,QAAA,EAAA,CAAAf,CAAA,CAAY,CAG5BS,CAAA,CAAkB,QAAA,EAAM,CAAA,MAAAV,EAAA,CAAiB,QAAA,EAAM,CAAA,MAAAC,EAAA,EAAYA,CAAA,EAAZ,CAAvB,CAAA,CAAxB,CAH4B,CAhCJQ,QAAA,EAAA,CAACjB,CAAD,CAAUS,CAAV,CAAuB,CAC/C,GAAIT,CAAA,SAAJ,CACES,CAAA,EAAYA,CAAA,EADd,KAEO,IAA2B,QAA3B,GAAKT,CAAAyB,UAAL,EAAuC,CAACzB,CAAA0B,IAAxC,EACkB,OADlB,GACJ1B,CAAAyB,UADI,EAC6B,CAACzB,CAAA2B,WAD9B,CAIL3B,CAAA,SACA,CADsB,CAAA,CACtB,CAAAS,CAAA,EAAYA,CAAA,EALP;IAMA,CACL,IAAMmB,EAAgBA,QAAA,CAAApC,CAAA,CAAS,CAC7BQ,CAAAsB,oBAAA,CAA4B9B,CAAAJ,KAA5B,CAAwCwC,CAAxC,CACA5B,EAAA,SAAA,CAAsB,CAAA,CACtBS,EAAA,EAAYA,CAAA,EAHiB,CAK/BT,EAAAuB,iBAAA,CAAyB,MAAzB,CAAiCK,CAAjC,CAKKC,EAAL,EAAmC,OAAnC,GAAa7B,CAAAyB,UAAb,EACEzB,CAAAuB,iBAAA,CAAyB,OAAzB,CAAkCK,CAAlC,CAZG,CATwC,CAX5BrB,QAAA,EAAA,CAAAuB,CAAA,CAAQ,CAC3B,MAAOA,EAAAC,SAAP,GAAyBC,IAAAC,aAAzB,EAAiE,MAAjE,GAA8CH,CAAAL,UAA9C,EACmD,QADnD,GACqCK,CAADI,IAFT,CA9U3BC,QADIC,EACO,EAAG,CAAA,IAAA,EAAA,IACZ,KAAAC,EAAA,CAAiB,EAGjB,KAAAC,EAAA,CAAgB,CAChB,KAAAC,EAAA,CAAwB,IAAIC,gBAAJ,CAAqB,QAAA,CAAAC,CAAA,CAAK,CAAA,MAAA,EAAAC,EAAA,CAAqBD,CAArB,CAAA,CAA1B,CAExB,KAAAF,EAAAI,QAAA,CAA8BlD,QAAAmD,KAA9B,CAA6C,CAC3CC,UAAW,CAAA,CADgC,CAE3CC,QAAS,CAAA,CAFkC,CAA7C,CAQA,KAAAC,YAAA,CAAiBtD,QAAjB,CAfY,CApKOuD,QAAA,EAAA,CAACC,CAAD,CAAc,CACnClC,CAAA,CAAQJ,CAAA,CAAIsC,CAAJ,CAAc,UAAd,CAAR,CAAmC,QAAA,CAAAC,CAAA,CAAY,CAC7CnC,CAAA,CAAQJ,CAAA,CAAIuC,CAAAC,QAAJ,CA2IYC,yFA3IZ,CAAR;AAAgD,QAAA,CAAAC,CAAA,CAAU,CACxD,IAAMC,EACH7D,QAAA8D,cAAA,CAAuB,QAAvB,CACHxC,EAAA,CAAQsC,CAAAG,WAAR,CAA2B,QAAA,CAAAC,CAAA,CAAQ,CAAA,MAAAH,EAAAI,aAAA,CAAmBD,CAAAE,KAAnB,CAA8BF,CAAAG,MAA9B,CAAA,CAAnC,CACAN,EAAAO,YAAA,CAAoBR,CAAAQ,YACpBR,EAAAjD,WAAA0D,aAAA,CAA+BR,CAA/B,CAAsCD,CAAtC,CALwD,CAA1D,CAOAL,EAAA,CAAeE,CAAAC,QAAf,CAR6C,CAA/C,CADmC,CAZzBxC,QAAA,EAAA,CAACmB,CAAD,CAAOiC,CAAP,CAAoB,CAG9B,MAAKjC,EAAAkC,WAAAlD,OAAL,CAGOgB,CAAAmC,iBAAA,CAAsBF,CAAtB,CAHP,CACSG,EAJqB,CAdhBnD,QAAA,EAAA,CAACoD,CAAD,CAAO1D,CAAP,CAAiB2D,CAAjB,CAAkC,CAChD,IAAMtD,EAASqD,CAAA,CAAOA,CAAArD,OAAP,CAAqB,CAApC,CACMuD,EAAYD,CAAA,CAAgB,EAAhB,CAAoB,CAEtC,KADIE,CACJ,CADQF,CAAA,CAAetD,CAAf,CAAwB,CAAxB,CAA4B,CACpC,CAAOwD,CAAP,CAAWxD,CAAX,EAA0B,CAA1B,EAAqBwD,CAArB,CAAiCA,CAAjC,EAAqCD,CAArC,CACE5D,CAAA,CAAS0D,CAAA,CAAKG,CAAL,CAAT,CAAkBA,CAAlB,CAL8C,CA1BlD,IAAMC,EAAO9E,QAAA8D,cAAA,CAAuB,MAAvB,CAAb,CACMtD,EAAoB,QAApBA,EAAgCsE,EADtC,CAEML,GAAgBK,CAAAN,iBAAA,CAAsB,GAAtB,CAFtB,CAKIO,EAAgB,IACgB,EAAA,CAApC,GAAI,eAAJ,EAAuB/E,SAAvB,EACEgF,MAAAC,eAAA,CAAsBjF,QAAtB,CAAgC,eAAhC;AAAiD,CAC/C,IAAAkF,QAAG,EAAG,CACJ,MAAOH,EAAP,GAK2B,UAAxB,GAAA/E,QAAA2B,WAAA,CACC3B,QAAAmF,QAAA,CAAiBnF,QAAAmF,QAAA9D,OAAjB,CAA2C,CAA3C,CADD,CACiD,IANpD,CADI,CADyC,CAU/C+D,aAAc,CAAA,CAViC,CAAjD,CA2DF,KAAMC,GAAiB,qBAAvB,CACMC,GAAoB,oCAD1B,CAEMC,GAAoB,iDAF1B,CAMMC,EAAO,CAEX,EAAAC,QAAO,CAAClF,CAAD,CAAUmF,CAAV,CAAgB,CACjBnF,CAAAoF,KAAJ,EACEpF,CAAA0D,aAAA,CAAqB,MAArB,CACEuB,CAAAI,EAAA,CAAgBrF,CAAAsF,aAAA,CAAqB,MAArB,CAAhB,CAA8CH,CAA9C,CADF,CAGEnF,EAAA0B,IAAJ,EACE1B,CAAA0D,aAAA,CAAqB,KAArB,CACEuB,CAAAI,EAAA,CAAgBrF,CAAAsF,aAAA,CAAqB,KAArB,CAAhB,CAA6CH,CAA7C,CADF,CAGF,IAA0B,OAA1B,GAAInF,CAAAyB,UAAJ,CAAmC,CACjC,IAAM8D,EAAIN,CAAAO,EAAA,CAAiBxF,CAAA6D,YAAjB,CAAsCsB,CAAtC,CAA4CL,EAA5C,CACV9E,EAAA6D,YAAA,CAAsBoB,CAAAO,EAAA,CAAiBD,CAAjB,CAAoBJ,CAApB,CAA0BJ,EAA1B,CAFW,CATd,CAFZ,CAiBX,EAAAS,QAAW,CAACC,CAAD,CAAOC,CAAP,CAAgBC,CAAhB,CAAwB,CACjC,MAAOF,EAAAG,QAAA,CAAaD,CAAb;AAAqB,QAAA,CAAClD,CAAD,CAAIoD,CAAJ,CAASC,CAAT,CAAcC,CAAd,CAAuB,CAC7CC,CAAAA,CAAUF,CAAAF,QAAA,CAAY,OAAZ,CAAqB,EAArB,CACVF,EAAJ,GACEM,CADF,CACYf,CAAAI,EAAA,CAAgBW,CAAhB,CAAyBN,CAAzB,CADZ,CAGA,OAAOG,EAAP,CAAa,GAAb,CAAoBG,CAApB,CAA8B,GAA9B,CAAqCD,CALY,CAA5C,CAD0B,CAjBxB,CA2BX,EAAAV,QAAU,CAACS,CAAD,CAAMX,CAAN,CAAY,CAEpB,GAA0Bc,IAAAA,EAA1B,GAAIhB,CAAAiB,EAAJ,CAAqC,CACnCjB,CAAAiB,EAAA,CAAoB,CAAA,CACpB,IAAI,CACF,IAAMC,EAAI,IAAIC,GAAJ,CAAQ,GAAR,CAAa,UAAb,CACVD,EAAAE,SAAA,CAAa,OACbpB,EAAAiB,EAAA,CAAgC,gBAAhC,GAAqBC,CAAAf,KAHnB,CAIF,MAAOkB,EAAP,CAAU,EANuB,CASrC,GAAIrB,CAAAiB,EAAJ,CACE,MAAOd,CAAC,IAAIgB,GAAJ,CAAQN,CAAR,CAAaX,CAAb,CAADC,MAILjF,EAAAA,CAAM8E,CAAAsB,EACLpG,EAAL,GACEA,CAIA,CAJMV,QAAA+G,eAAAC,mBAAA,CAA2C,MAA3C,CAIN,CAHAxB,CAAAsB,EAGA,CAHiBpG,CAGjB,CAFAA,CAAAuG,EAEA,CAFavG,CAAAoD,cAAA,CAAkB,MAAlB,CAEb,CADApD,CAAAyC,KAAA+D,YAAA,CAAqBxG,CAAAuG,EAArB,CACA,CAAAvG,CAAAyG,EAAA,CAAezG,CAAAoD,cAAA,CAAkB,GAAlB,CALjB,CAOApD,EAAAuG,EAAAtB,KAAA,CAAkBD,CAClBhF,EAAAyG,EAAAxB,KAAA,CAAoBU,CACpB,OAAO3F,EAAAyG,EAAAxB,KAAP,EAA4BU,CA1BR,CA3BX,CANb,CAgEMe,EAAM,CAEVC,MAAO,CAAA,CAFG,CASV,KAAAC,QAAI,CAACjB,CAAD,CAAMkB,CAAN,CAAeC,CAAf,CAAqB,CACvB,GAAKnB,CAAL,CAEO,GAAIA,CAAAoB,MAAA,CAAU,QAAV,CAAJ,CAAyB,CAExBC,CAAAA;AAASrB,CAAAsB,MAAA,CAAU,GAAV,CAEf,KAAIC,EAAWF,CAAA,CAAO,CAAP,CAEbE,EAAA,CAD+B,EAAjC,CAFeF,CAAAG,CAAO,CAAPA,CAEXC,QAAA,CAAe,SAAf,CAAJ,CACaC,IAAA,CAAKH,CAAL,CADb,CAGaI,kBAAA,CAAmBJ,CAAnB,CAEbL,EAAA,CAAQK,CAAR,CAV8B,CAAzB,IAWA,CACL,IAAMK,EAAU,IAAIC,cACpBD,EAAAE,KAAA,CAAa,KAAb,CAAoB9B,CAApB,CAAyBe,CAAAC,MAAzB,CACAY,EAAAG,OAAA,CAAiBC,QAAA,EAAM,CAKrB,IAAIC,EAAgBL,CAAAM,YAAhBD,EAAuCL,CAAAO,kBAAA,CAA0B,UAA1B,CACvCF,EAAJ,EAAoD,CAApD,GAAqBA,CAAAR,QAAA,CAAsB,GAAtB,CAArB,GAIEQ,CAJF,EAGkBG,QAAAC,OAHlB,EAGqCD,QAAAE,SAHrC,CAGyD,IAHzD,CAGgEF,QAAAG,KAHhE,EAI2BN,CAJ3B,CAMA,KAAMV,EAAkCK,CAAAY,SAAlCjB,EAAsDK,CAAAa,aACrC,IAAvB,GAAIb,CAAAc,OAAJ,EAAiD,CAAjD,GAA8Bd,CAAAc,OAA9B,EACoB,GADpB,EACEd,CAAAc,OADF,EAC4C,GAD5C,CAC2Bd,CAAAc,OAD3B,CAEExB,CAAA,CAAQK,CAAR,CAAkBU,CAAlB,CAFF,CAIEd,CAAA,CAAKI,CAAL,CAjBmB,CAoBvBK,EAAAe,KAAA,EAvBK,CAbP,IACExB,EAAA,CAAK,+BAAL,CAFqB,CATf,CAhEZ,CAqHMpF,EAAO,SAAA6G,KAAA,CAAeC,SAAAC,UAAf,CAAP/G,EACJ,YAAA6G,KAAA,CAAkBC,SAAAC,UAAlB,CAqDA;CAAA,UAAA,YAAA,CAAA7F,QAAW,CAAC5C,CAAD,CAAM,CAAA,IAAA,EAAA,IAGfY,EAAA,CADGJ,CAAAkI,CAAI1I,CAAJ0I,CArDgBvI,kBAqDhBuI,CACH,CAAe,QAAA,CAAAtE,CAAA,CAAQ,CAAA,MAAA,EAAAuE,EAAA,CAAgBvE,CAAhB,CAAA,CAAvB,CAHe,CASjB,EAAA,UAAA,EAAA,CAAAuE,QAAU,CAACvE,CAAD,CAAO,CAAA,IAAA,EAAA,IAAA,CACTuB,EAAMvB,CAAAa,KAEZ,IAA4Ba,IAAAA,EAA5B,GAAI,IAAA5D,EAAA,CAAeyD,CAAf,CAAJ,CAAuC,CAGrC,IAAM9E,EAAM,IAAAqB,EAAA,CAAeyD,CAAf,CACR9E,EAAJ,EAAWA,CAAA,SAAX,GACEuD,CAAA,SACA,CADmBvD,CACnB,CAAA,IAAA+H,EAAA,CAAuBxE,CAAvB,CAFF,CAJqC,CAAvC,IAUA,KAAAjC,EAAA,EAGA,CADA,IAAAD,EAAA,CAAeyD,CAAf,CACA,CADsB,SACtB,CAAAe,CAAAE,KAAA,CAASjB,CAAT,CAAc,QAAA,CAACuB,CAAD,CAAWU,CAAX,CAA6B,CACnC5H,CAAAA,CAAM,CAAA6I,EAAA,CAAkB3B,CAAlB,CAA4BU,CAA5B,EAA6CjC,CAA7C,CACZ,EAAAzD,EAAA,CAAeyD,CAAf,CAAA,CAAsB3F,CACtB,EAAAmC,EAAA,EAEA,EAAAS,YAAA,CAAiB5C,CAAjB,CACA,EAAA8I,EAAA,EANyC,CAA3C,CAOG,QAAA,EAAM,CAEP,CAAA5G,EAAA,CAAeyD,CAAf,CAAA,CAAsB,IACtB,EAAAxD,EAAA,EACA,EAAA2G,EAAA,EAJO,CAPT,CAhBe,CAqCjB,EAAA,UAAA,EAAA,CAAAD,QAAY,CAAC3B,CAAD,CAAWvB,CAAX,CAAgB,CAC1B,GAAI,CAACuB,CAAL,CACE,MAAO5H,SAAAyJ,uBAAA,EAGLrH,EAAJ,GAKEwF,CALF,CAKaA,CAAAzB,QAAA,CAAiBZ,EAAjB,CAAoC,QAAA,CAACkC,CAAD,CAAQiC,CAAR,CAAYC,CAAZ,CAAmB,CAChE,MAAgC,EAAhC,GAAIlC,CAAAK,QAAA,CAAc,OAAd,CAAJ;AACY4B,CADZ,CACwC,uBADxC,CAC4CC,CAD5C,CAGOlC,CAJyD,CAAvD,CALb,CAcA,KAAMhE,EACHzD,QAAA8D,cAAA,CAAuB,UAAvB,CACHL,EAAAmG,UAAA,CAAqBhC,CACrB,IAAInE,CAAAC,QAAJ,CACEA,CAGA,CAHUD,CAAAC,QAGV,CAAAH,CAAA,CAAeG,CAAf,CAJF,KAQE,KADAA,CACA,CADU1D,QAAAyJ,uBAAA,EACV,CAAOhG,CAAAvB,WAAP,CAAA,CACEwB,CAAAwD,YAAA,CAAoBzD,CAAAvB,WAApB,CAMJ,IADM2H,CACN,CADenG,CAAAoG,cAAA,CAAsB,MAAtB,CACf,CACEzD,CACA,CADMb,CAAAI,EAAA,CAAgBiE,CAAAhE,aAAA,CAAoB,MAApB,CAAhB,CAA6CQ,CAA7C,CACN,CAAAwD,CAAAE,gBAAA,CAAuB,MAAvB,CAMF,KAAIC,EAAoB,CACxB1I,EAAA,CAHGJ,CAAA+I,CAAIvG,CAAJuG,CAlI4BC,mNAkI5BD,CAGH;AAAY,QAAA,CAAAE,CAAA,CAAK,CAEf3I,CAAA,CAAkB2I,CAAlB,CACA3E,EAAAC,EAAA,CAAa0E,CAAb,CAAgB9D,CAAhB,CAEA8D,EAAAlG,aAAA,CAvIuBmG,mBAuIvB,CAAqC,EAArC,CAEoB,SAApB,GAAID,CAAAnI,UAAJ,EAAgC,CAACmI,CAAAlI,IAAjC,EAA0CkI,CAAA/F,YAA1C,GAKE+F,CAAAlG,aAAA,CAAe,KAAf,CAAsB,qCAAtB,CAA8DoG,kBAAA,CAH9CF,CAAA/F,YAG8C,EAH9B,kBAG8B,CAHXiC,CAGW,EAJlD2D,CAAAM,CAAoB,GAApBA,CAAwBN,CAAxBM,CAA8C,EAII,EAHF,OAGE,EAA9D,CAEA,CADAH,CAAA/F,YACA,CADgB,EAChB,CAAA4F,CAAA,EAPF,CAPe,CAAjB,CAiBA,OAAOtG,EA/DmB,CAsE5B,EAAA,UAAA,EAAA,CAAA8F,QAA2B,EAAG,CAAA,IAAA,EAAA,IAE5B,IAAI3G,CAAA,IAAAA,EAAJ,CAAA,CAGA,IAAAC,EAAAyH,WAAA,EACA,KAAAC,QAAA,CAAaxK,QAAb,CAN4B,KAcxByK,EAAY,CAAA,CAdY,CAe1BC,EAAW,CAAA,CAfe,CAgBtBvI,EAAgBA,QAAA,EAAM,CACtBuI,CAAJ,EAAgBD,CAAhB,GAGE,CAAAnH,YAAA,CAAiBtD,QAAjB,CACA,CAAI,CAAA6C,EAAJ,GAGA,CAAAC,EAAAI,QAAA,CAA8BlD,QAAAmD,KAA9B,CAA6C,CAC3CC,UAAW,CAAA,CADgC,CAE3CC,QAAS,CAAA,CAFkC,CAA7C,CAIA,CAAA,CAAAsH,EAAA,EAPA,CAJF,CAD0B,CAe5B;IAAAC,EAAA,CAAmB,QAAA,EAAM,CACvBF,CAAA,CAAW,CAAA,CACXvI,EAAA,EAFuB,CAAzB,CAIA,KAAA0I,EAAA,CAAgB,QAAA,EAAM,CACpBJ,CAAA,CAAY,CAAA,CACZtI,EAAA,EAFoB,CAAtB,CAjCA,CAF4B,CA4C9B,EAAA,UAAA,QAAA,CAAAqI,QAAO,CAAC9J,CAAD,CAAM,CAAA,IAAA,EAAA,IAGXY,EAAA,CADGJ,CAAA+I,CAAIvJ,CAAJuJ,CArNgBpJ,kBAqNhBoJ,CACH,CAAY,QAAA,CAAAE,CAAA,CAAK,CACf,IAAM5I,EAAM,CAAAqB,EAAA,CAAeuH,CAAAxE,KAAf,CAEZ,EADAwE,CAAA,SACA,CAD0C5I,CAC1C,GAAWA,CAAAe,SAAX,GAA4BC,IAAAuI,uBAA5B,GAGE,CAAAlI,EAAA,CAAeuH,CAAAxE,KAAf,CAIA,CAJyBwE,CAIzB,CAHAA,CAAAxI,WAGA,CAHe,SAGf,CAFAwI,CAAA,SAEA,CAFgBA,CAEhB,CADA,CAAAK,QAAA,CAAajJ,CAAb,CACA,CAAA4I,CAAAjD,YAAA,CAAc3F,CAAd,CAPF,CAHe,CAAjB,CAHW,CAuBb,EAAA,UAAA,EAAA,CAAAsJ,QAAU,CAAC7J,CAAD,CAAW,CAGC+J,QAAA,EAAA,CAAAlG,CAAA,CAAK,CACvB,GAAIA,CAAJ,CAAQmG,CAAR,CAAW,CAKT,IAAMC,EAAIC,CAAA,CAAGrG,CAAH,CAAV,CACMhB,EACH7D,QAAA8D,cAAA,CAAuB,QAAvB,CAEHmH,EAAAlB,gBAAA,CA1OqBK,mBA0OrB,CACA9I,EAAA,CAAQ2J,CAAAlH,WAAR,CAAsB,QAAA,CAAAC,CAAA,CAAQ,CAAA,MAAAH,EAAAI,aAAA,CAAmBD,CAAAE,KAAnB,CAA8BF,CAAAG,MAA9B,CAAA,CAA9B,CAEAY;CAAA,CAAgBlB,CAChBoH,EAAAtK,WAAA0D,aAAA,CAA0BR,CAA1B,CAAiCoH,CAAjC,CACAzJ,EAAA,CAAkBqC,CAAlB,CAAyB,QAAA,EAAM,CAC7BkB,CAAA,CAAgB,IAChBgG,EAAA,CAAYlG,CAAZ,CAAgB,CAAhB,CAF6B,CAA/B,CAdS,CAAX,IAmBE7D,EAAA,EApBqB,CAFzB,IAAMkK,EAAKhK,CAAA,CAAIlB,QAAJ,CA1NgBmL,2BA0NhB,CAAX,CACMH,EAAIE,CAAA7J,OAwBV0J,EAAA,CAAY,CAAZ,CA1BmB,CAiCrB,EAAA,UAAA,EAAA,CAAAH,QAAa,CAAC5J,CAAD,CAAW,CACtB,IAAMkK,EACHhK,CAAA,CAAIlB,QAAJ,CA1PuBoL,kEA0PvB,CADH,CAEIhK,EAAU8J,CAAA7J,OACd,IAAKD,CAAL,CAAA,CASA,IAAMiK,EAAYjJ,CAAZiJ,EAAoB,CAAC,CAACrL,QAAA8J,cAAA,CAnRHwB,iDAmRG,CAC5BhK,EAAA,CAAQ4J,CAAR,CAAY,QAAA,CAAAD,CAAA,CAAK,CAEfzJ,CAAA,CAAkByJ,CAAlB,CAAqB,QAAA,EAAM,CACzBA,CAAAlB,gBAAA,CA/QqBK,mBA+QrB,CACkB,EAAlB,GAAI,EAAEhJ,CAAN,EACEJ,CAAA,EAHuB,CAA3B,CAQA,IAAIqK,CAAJ,EAAiBJ,CAAAtK,WAAjB,GAAkCX,QAAAmD,KAAlC,CAAiD,CAE/C,IAAMoI,EAAcvL,QAAA8D,cAAA,CAAuBmH,CAAAjJ,UAAvB,CAEpBuJ;CAAA,iBAAA,CAAkCN,CAElCM,EAAAtH,aAAA,CAAyB,MAAzB,CAAiC,oBAAjC,CAEAgH,EAAAtK,WAAA6K,aAAA,CAA0BD,CAA1B,CAAuCN,CAAAQ,YAAvC,CAEA,KADIC,CACJ,CADiBpL,CAAA,CAAiB2K,CAAjB,CACjB,CAAOS,CAAP,EAAqBpL,CAAA,CAAiBoL,CAAjB,CAArB,CAAA,CACEA,CAAA,CAAapL,CAAA,CAAiBoL,CAAjB,CAEXA,EAAA/K,WAAJ,GAA8BX,QAAAmD,KAA9B,GACEuI,CADF,CACe,IADf,CAGA1L,SAAAmD,KAAAqI,aAAA,CAA2BP,CAA3B,CAA8BS,CAA9B,CAEAT,EAAAlB,gBAAA,CAAkB,MAAlB,CAlB+C,CAVlC,CAAjB,CAVA,CAAA,IACE/I,EAAA,EALoB,CAkDxB,EAAA,UAAA,EAAA,CAAA2J,QAAU,EAAG,CAAA,IAAA,EAAA,IAIXrJ,EAAA,CAFGJ,CAAA+I,CAAIjK,QAAJiK,CA/TgBpJ,kBA+ThBoJ,CAEH,CAAY,QAAA,CAAAE,CAAA,CAAK,CAAA,MAAA,EAAAb,EAAA,CAAuBa,CAAvB,CAAA,CAAjB,CAA4C,CAAA,CAA5C,CAJW,CAWb,EAAA,UAAA,EAAA,CAAAb,QAAiB,CAACxE,CAAD,CAAO,CAEjBA,CAAA,SAAL,GACEA,CAAA,SAIA,CAJmB,CAAA,CAInB,CAFAA,CAAA6G,OAEA,GAFgB7G,CAAA6G,OAAAhK,WAEhB,CAFyC,UAEzC,EAAAmD,CAAA8G,cAAA,CAAmBlM,CAAA,CADDoF,CAAA6G,OAAAE,CAAc,MAAdA,CAAuB,OACtB,CAA0B,CAC3C1L,QAAS,CAAA,CADkC,CAE3CC,WAAY,CAAA,CAF+B;AAG3CC,OAAQmG,IAAAA,EAHmC,CAA1B,CAAnB,CALF,CAFsB,CAkBxB,EAAA,UAAA,EAAA,CAAAvD,QAAe,CAAC6I,CAAD,CAAY,CAAA,IAAA,EAAA,IACzBxK,EAAA,CAAQwK,CAAR,CAAmB,QAAA,CAAA9I,CAAA,CAAK,CAAA,MAAA1B,EAAA,CAAQ0B,CAAA+I,WAAR,CAAsB,QAAA,CAAAC,CAAA,CAAQ,CAChDA,CAAJ,EAAYA,CAAA1J,SAAZ,GAA8BC,IAAAC,aAA9B,GAEM1B,CAAA,CAAakL,CAAb,CAAJ,CACE,CAAA3C,EAAA,CAAkD2C,CAAlD,CADF,CAGE,CAAA1I,YAAA,CAA2C0I,CAA3C,CALJ,CADoD,CAA9B,CAAA,CAAxB,CADyB,CAmI7B,KAAIC,EAAW,IAqBf,IAAIzL,CAAJ,CAOEc,CAAA,CADGJ,CAAAgL,CAAIlM,QAAJkM,CAxfkBrL,kBAwflBqL,CACH,CAAc,QAAA,CAAA3K,CAAA,CAAO,CACdA,CAAAoK,OAAL,EAA6C,SAA7C,GAAmBpK,CAAAoK,OAAAhK,WAAnB,GACEJ,CAAA,SADF,CACoB,CAAA,CADpB,CADmB,CAArB,CAgBA,CAPMY,CAON,CAPsBA,QAAA,CAAApC,CAAA,CAAS,CACvBiM,CAAAA,CAAgCjM,CAAAoM,OAClCrL,EAAA,CAAakL,CAAb,CAAJ,GACEA,CAAA,SADF,CACqB,CAAA,CADrB,CAF6B,CAO/B,CADAhM,QAAA8B,iBAAA,CAA0B,MAA1B,CAAkCK,CAAlC,CAAiD,CAAA,CAAjD,CACA,CAAAnC,QAAA8B,iBAAA,CAA0B,OAA1B,CAAmCK,CAAnC,CAAkD,CAAA,CAAlD,CAvBF,KAwBO,CAML,IAAMiK,EAAiBpH,MAAAqH,yBAAA,CAAgC9J,IAAA+J,UAAhC,CAAgD,SAAhD,CAGvBtH,OAAAC,eAAA,CAAsBqH,CADR,CAACF,CAADG;AAAmBH,CAAAhH,aAAnBmH,CAAiDhK,IAAjDgK,CAAwDC,OAChDF,WAAtB,CAAuC,SAAvC,CAAkD,CAChD,IAAApH,QAAG,EAAG,CACJ,IAAMuH,EAA2C3L,CAAA,CAAa,IAAb,CAAA,CAAqB,IAArB,CAA4BR,CAAA,CAAiB,IAAjB,CAC7E,OAAImM,EAAJ,CAAqBA,CAAA9G,KAArB,CAEIyG,CAAJ,EAAsBA,CAAAlH,IAAtB,CAAiDkH,CAAAlH,IAAAwH,KAAA,CAAwB,IAAxB,CAAjD,CAGO/G,CADsC3F,QAAA8J,cAAApE,CAAuB,MAAvBA,CACtCC,EAAS9F,MAAA4I,SAAT9C,MAPH,CAD0C,CAUhDP,aAAc,CAAA,CAVkC,CAWhDuH,WAAY,CAAA,CAXoC,CAAlD,CAeA3H,OAAAC,eAAA,CAAsB2H,eAAAN,UAAtB,CAAiD,QAAjD,CAA2D,CACzD,IAAApH,QAAG,EAAG,CACJ,MAAuC,KAAD,SAAtC,EAA4D,IADxD,CADmD,CAIzDE,aAAc,CAAA,CAJ2C,CAKzDuH,WAAY,CAAA,CAL6C,CAA3D,CAQAlL,EAAA,CAAkB,QAAA,EAAM,CACtBwK,CAAA,CAAW,IAAItJ,CADO,CAAxB,CAhCK,CAgDPZ,CAAA,CAAU,QAAA,EAAM,CAAA,MAAA/B,SAAA4L,cAAA,CAAuBlM,CAAA,CAAe,mBAAf,CAAoC,CACzEU,WAAY,CAAA,CAD6D,CAEzED,QAAS,CAAA,CAFgE,CAGzEE,OAAQmG,IAAAA,EAHiE,CAApC,CAAvB,CAAA,CAAhB,CAOA/G,EAAAe,UAAA,CAAkBA,CAClBf;CAAAsC,UAAA,CAAkBA,CAClBtC,EAAAa,iBAAA,CAAyBA,CACzBb,EAAA6D,YAAA,CAjGoBA,QAAA,CAAC5C,CAAD,CAAS,CACvBuL,CAAJ,EACEA,CAAA3I,YAAA,CAAqB5C,CAArB,CAFyB,CAhqBrB,CAAT,CAAD,CAmwBGb,MAAAgN,YAnwBH,CAmwByBhN,MAAAgN,YAnwBzB,EAmwB+C,EAnwB/C,C,CCTA,IAAMC,GAAkB,IAAIC,GAAJ,CAAQ,kHAAA,MAAA,CAAA,GAAA,CAAR,CAejBC,SAASA,GAAwB,CAAChL,CAAD,CAAY,CAClD,IAAMiL,EAAWH,EAAAI,IAAA,CAAoBlL,CAApB,CACXmL,EAAAA,CAAY,kCAAAlE,KAAA,CAAwCjH,CAAxC,CAClB,OAAO,CAACiL,CAAR,EAAoBE,CAH8B,CAW7CC,QAASA,EAAW,CAAC/K,CAAD,CAAO,CAEhC,IAAMgL,EAAchL,CAAA+K,YACpB,IAAoB5G,IAAAA,EAApB,GAAI6G,CAAJ,CACE,MAAOA,EAKT,KAAA,CAAOC,CAAP,EAAkB,EAAEA,CAAAC,sBAAF,EAAmCD,CAAnC,WAAsDE,SAAtD,CAAlB,CAAA,CACEF,CAAA,CAAUA,CAAA3M,WAAV,GAAiCd,MAAA4N,WAAA,EAAqBH,CAArB,WAAwCG,WAAxC,CAAqDH,CAAA1E,KAArD,CAAoEpC,IAAAA,EAArG,CAEF,OAAO,EAAG8G,CAAAA,CAAH,EAAe,EAAAA,CAAAC,sBAAA,EAAiCD,CAAjC,WAAoDE,SAApD,CAAf,CAZyB;AAoBlCE,QAASA,EAA4B,CAACC,CAAD,CAAOC,CAAP,CAAc,CAEjD,IAAA,CAAOvL,CAAP,EAAeA,CAAf,GAAwBsL,CAAxB,EAAgC,CAACtL,CAAAoJ,YAAjC,CAAA,CACEpJ,CAAA,CAAOA,CAAA1B,WAET,OAAS0B,EAAF,EAAUA,CAAV,GAAmBsL,CAAnB,CAAkCtL,CAAAoJ,YAAlC,CAA2B,IALe;AAsB5CoC,QAASA,EAA0B,CAACF,CAAD,CAAO3M,CAAP,CAAiB8M,CAAjB,CAA6C,CAA5BA,CAAA,CAAA,IAAA,EAAA,GAAAA,CAAA,CAAiB,IAAIf,GAArB,CAAAe,CAEzD,KADA,IAAIzL,EAAOsL,CACX,CAAOtL,CAAP,CAAA,CAAa,CACX,GAAIA,CAAAC,SAAJ,GAAsBC,IAAAC,aAAtB,CAAyC,CACvC,IAAMjC,EAAkC8B,CAExCrB,EAAA,CAAST,CAAT,CAEA,KAAMyB,EAAYzB,CAAAyB,UAClB,IAAkB,MAAlB,GAAIA,CAAJ,EAA4D,QAA5D,GAA4BzB,CAAAsF,aAAA,CAAqB,KAArB,CAA5B,CAAsE,CAG9DkI,CAAAA,CAAmCxN,CAAAoL,OACzC,IAAIoC,CAAJ,WAA0BxL,KAA1B,EAAkC,CAACuL,CAAAZ,IAAA,CAAmBa,CAAnB,CAAnC,CAIE,IAFAD,CAAAE,IAAA,CAAmBD,CAAnB,CAESE,CAAAA,CAAAA,CAAQF,CAAA7L,WAAjB,CAAwC+L,CAAxC,CAA+CA,CAA/C,CAAuDA,CAAAxC,YAAvD,CACEoC,CAAA,CAA2BI,CAA3B,CAAkCjN,CAAlC,CAA4C8M,CAA5C,CAOJzL,EAAA,CAAOqL,CAAA,CAA6BC,CAA7B,CAAmCpN,CAAnC,CACP,SAjBoE,CAAtE,IAkBO,IAAkB,UAAlB,GAAIyB,CAAJ,CAA8B,CAKnCK,CAAA,CAAOqL,CAAA,CAA6BC,CAA7B,CAAmCpN,CAAnC,CACP,SANmC,CAWrC,GADM2N,CACN,CADmB3N,CAAA4N,gBACnB,CACE,IAASF,CAAT,CAAiBC,CAAAhM,WAAjB,CAAwC+L,CAAxC,CAA+CA,CAA/C,CAAuDA,CAAAxC,YAAvD,CACEoC,CAAA,CAA2BI,CAA3B,CAAkCjN,CAAlC,CAA4C8M,CAA5C,CArCmC,CA0CzCzL,CAAA,CAAsBA,CArDjBH,WAAA,CAqDiBG,CArDEH,WAAnB,CAAsCwL,CAAA,CAqD3BC,CArD2B,CAqDrBtL,CArDqB,CAUhC,CAFwE,CA0DhF+L,QAASA,EAAoB,CAACC,CAAD,CAAcnK,CAAd,CAAoBC,CAApB,CAA2B,CAC7DkK,CAAA,CAAYnK,CAAZ,CAAA,CAAoBC,CADyC,C,CC1H7DzB,QADmB4L,EACR,EAAG,CAEZ,IAAAC,EAAA,CAA8B,IAAIC,GAGlC,KAAAC,EAAA,CAAgC,IAAID,GAGpC,KAAAE,EAAA,CAAgB,EAGhB,KAAAC,EAAA,CAAmB,CAAA,CAXP,CAkBdC,QAAA,GAAa,CAAbA,CAAa,CAAC5M,CAAD,CAAY6M,CAAZ,CAAwB,CACnC,CAAAN,EAAAO,IAAA,CAAgC9M,CAAhC,CAA2C6M,CAA3C,CACA,EAAAJ,EAAAK,IAAA,CAAkCD,CAAAnM,YAAlC,CAA0DmM,CAA1D,CAFmC,CAwBrCE,QAAA,GAAQ,CAARA,CAAQ,CAACC,CAAD,CAAW,CACjB,CAAAL,EAAA,CAAmB,CAAA,CACnB,EAAAD,EAAAO,KAAA,CAAmBD,CAAnB,CAFiB,CAQnBE,QAAA,EAAS,CAATA,CAAS,CAAC7M,CAAD,CAAO,CACT,CAAAsM,EAAL,EDaYd,CCXZ,CAAqCxL,CAArC,CAA2C,QAAA,CAAA9B,CAAA,CAAW,CAAA,MAAA4O,EAAA,CAHxCA,CAGwC,CAAW5O,CAAX,CAAA,CAAtD,CAHc,CAShB4O,QAAA,EAAK,CAALA,CAAK,CAAC9M,CAAD,CAAO,CACV,GAAK,CAAAsM,EAAL,EAEIS,CAAA/M,CAAA+M,aAFJ,CAEA,CACA/M,CAAA+M,aAAA,CAAoB,CAAA,CAEpB,KAAK,IAAIvK,EAAI,CAAb,CAAgBA,CAAhB,CAAoB,CAAA6J,EAAArN,OAApB,CAA0CwD,CAAA,EAA1C,CACE,CAAA6J,EAAA,CAAc7J,CAAd,CAAA,CAAiBxC,CAAjB,CAJF,CAHU,CAcZgN,QAAA,EAAW,CAAXA,CAAW,CAAC1B,CAAD,CAAO,CAChB,IAAM2B,EAAW,EDVLzB,ECYZ,CAAqCF,CAArC,CAA2C,QAAA,CAAApN,CAAA,CAAW,CAAA,MAAA+O,EAAAL,KAAA,CAAc1O,CAAd,CAAA,CAAtD,CAEA,KAASsE,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoByK,CAAAjO,OAApB,CAAqCwD,CAAA,EAArC,CAA0C,CACxC,IAAMtE,EAAU+O,CAAA,CAASzK,CAAT,CC/EZ0K,EDgFJ,GAAIhP,CAAAiP,WAAJ,CACE,CAAAC,kBAAA,CAAuBlP,CAAvB,CADF,CAGEmP,CAAA,CAAAA,CAAA,CAAoBnP,CAApB,CALsC,CAL1B;AAkBlBoP,QAAA,EAAc,CAAdA,CAAc,CAAChC,CAAD,CAAO,CACnB,IAAM2B,EAAW,ED5BLzB,EC8BZ,CAAqCF,CAArC,CAA2C,QAAA,CAAApN,CAAA,CAAW,CAAA,MAAA+O,EAAAL,KAAA,CAAc1O,CAAd,CAAA,CAAtD,CAEA,KAASsE,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoByK,CAAAjO,OAApB,CAAqCwD,CAAA,EAArC,CAA0C,CACxC,IAAMtE,EAAU+O,CAAA,CAASzK,CAAT,CCjGZ0K,EDkGJ,GAAIhP,CAAAiP,WAAJ,EACE,CAAAI,qBAAA,CAA0BrP,CAA1B,CAHsC,CALvB;AA+ErBsP,QAAA,EAAmB,CAAnBA,CAAmB,CAAClC,CAAD,CAAOmC,CAAP,CAAqB,CAAdA,CAAA,CAAA,IAAA,EAAA,GAAAA,CAAA,CAAU,EAAV,CAAAA,CACxB,KAAMhC,EAAiBgC,CAAAhC,EAAjBA,EAA2C,IAAIf,GAArD,CACMgD,EAAUD,CAAAC,EAAVA,EAA8B,QAAA,CAAAxP,CAAA,CAAW,CAAA,MAAAmP,EAAA,CAFTA,CAES,CAAoBnP,CAApB,CAAA,CAD/C,CAGM+O,EAAW,ED9GLzB,ECyJZ,CAAqCF,CAArC,CAzCuBqC,QAAA,CAAAzP,CAAA,CAAW,CAChC,GAA0B,MAA1B,GAAIA,CAAAyB,UAAJ,EAAoE,QAApE,GAAoCzB,CAAAsF,aAAA,CAAqB,KAArB,CAApC,CAA8E,CAG5E,IAAMkI,EAAmCxN,CAAAoL,OAErCoC,EAAJ,WAA0BxL,KAA1B,GACEwL,CAAAR,sBAEA,CAFmC,CAAA,CAEnC,CAAAQ,CAAAkC,iBAAA,CAA8B,CAAA,CAHhC,CAMIlC,EAAJ,EAA4C,UAA5C,GAAkBA,CAAApM,WAAlB,CACEoM,CAAAmC,yBADF,CACwC,CAAA,CADxC,CAKE3P,CAAAuB,iBAAA,CAAyB,MAAzB,CAAiC,QAAA,EAAM,CACrC,IAAMiM,EAAmCxN,CAAAoL,OAEzC,IAAIuE,CAAAnC,CAAAmC,yBAAJ,CAAA,CACAnC,CAAAmC,yBAAA,CAAsC,CAAA,CAOtC,KAAMC,EAAuB,IAAIpD,GAAJ,CAAQe,CAAR,CAC7BqC,EAAAC,OAAA,CAA4BrC,CAA5B,CAEA8B,EAAA,CArC8BA,CAqC9B,CAAyB9B,CAAzB,CAAqC,CAACD,EAAgBqC,CAAjB,CAAuCJ,EAAAA,CAAvC,CAArC,CAXA,CAHqC,CAAvC,CAhB0E,CAA9E,IAkCET,EAAAL,KAAA,CAAc1O,CAAd,CAnC8B,CAyClC,CAA2DuN,CAA3D,CAEA,IAAI,CAAAa,EAAJ,CACE,IAAS9J,CAAT;AAAa,CAAb,CAAgBA,CAAhB,CAAoByK,CAAAjO,OAApB,CAAqCwD,CAAA,EAArC,CACEsK,CAAA,CAAAA,CAAA,CAAWG,CAAA,CAASzK,CAAT,CAAX,CAIJ,KAASA,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoByK,CAAAjO,OAApB,CAAqCwD,CAAA,EAArC,CACEkL,CAAA,CAAQT,CAAA,CAASzK,CAAT,CAAR,CAxDoC;AA+DxC6K,QAAA,EAAc,CAAdA,CAAc,CAACnP,CAAD,CAAU,CAEtB,GAAqBiG,IAAAA,EAArB,GADqBjG,CAAAiP,WACrB,CAAA,CAYA,IAAM/O,EAAgBF,CAAAE,cACtB,IACGA,CAAA4P,YADH,EAEI5P,CAAA8M,sBAFJ,EAE2C9M,CAAAwP,iBAF3C,CAMA,GADMpB,CACN,CADmByB,CAjOZ/B,EAAArJ,IAAA,CAiOuC3E,CAAAyB,UAjOvC,CAkOP,CAAA,CAEA6M,CAAA0B,kBAAAtB,KAAA,CAAkC1O,CAAlC,CAEA,KAAMmC,EAAcmM,CAAAnM,YACpB,IAAI,CACF,GAAI,CAEF,GADa8N,IAAK9N,CAClB,GAAenC,CAAf,CACE,KAAUkQ,MAAJ,CAAU,4EAAV,CAAN,CAHA,CAAJ,OAKU,CACR5B,CAAA0B,kBAAAG,IAAA,EADQ,CANR,CASF,MAAO7J,CAAP,CAAU,CAEV,KADAtG,EAAAiP,WACM3I,CC7QF8J,CD6QE9J,CAAAA,CAAN,CAFU,CAKZtG,CAAAiP,WAAA,CCjRMD,CDkRNhP,EAAAqQ,gBAAA,CAA0B/B,CAE1B,IAAIA,CAAAgC,yBAAJ,CAEE,IADMC,CACGjM,CADkBgK,CAAAiC,mBAClBjM,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CAAoBiM,CAAAzP,OAApB,CAA+CwD,CAAA,EAA/C,CAAoD,CAClD,IAAMX,EAAO4M,CAAA,CAAmBjM,CAAnB,CAAb;AACMV,EAAQ5D,CAAAsF,aAAA,CAAqB3B,CAArB,CACA,KAAd,GAAIC,CAAJ,EACE,CAAA0M,yBAAA,CAA8BtQ,CAA9B,CAAuC2D,CAAvC,CAA6C,IAA7C,CAAmDC,CAAnD,CAA0D,IAA1D,CAJgD,CDhQ1CiJ,CCyQR,CAAsB7M,CAAtB,CAAJ,EACE,CAAAkP,kBAAA,CAAuBlP,CAAvB,CAlCF,CAnBA,CAFsB,CA8DxB,CAAA,UAAA,kBAAA,CAAAkP,QAAiB,CAAClP,CAAD,CAAU,CACzB,IAAMsO,EAAatO,CAAAqQ,gBACf/B,EAAAY,kBAAJ,EACEZ,CAAAY,kBAAA/C,KAAA,CAAkCnM,CAAlC,CAHuB,CAU3B,EAAA,UAAA,qBAAA,CAAAqP,QAAoB,CAACrP,CAAD,CAAU,CAC5B,IAAMsO,EAAatO,CAAAqQ,gBACf/B,EAAAe,qBAAJ,EACEf,CAAAe,qBAAAlD,KAAA,CAAqCnM,CAArC,CAH0B,CAc9B;CAAA,UAAA,yBAAA,CAAAsQ,QAAwB,CAACtQ,CAAD,CAAU2D,CAAV,CAAgB6M,CAAhB,CAA0BC,CAA1B,CAAoCC,CAApC,CAA+C,CACrE,IAAMpC,EAAatO,CAAAqQ,gBAEjB/B,EAAAgC,yBADF,EAEiD,EAFjD,CAEEhC,CAAAiC,mBAAAhJ,QAAA,CAAsC5D,CAAtC,CAFF,EAIE2K,CAAAgC,yBAAAnE,KAAA,CAAyCnM,CAAzC,CAAkD2D,CAAlD,CAAwD6M,CAAxD,CAAkEC,CAAlE,CAA4EC,CAA5E,CANmE,C,CEhUvEvO,QADmBwO,EACR,CAACC,CAAD,CAAiB,CAALzQ,IAAAA,ECoD4DV,QDhDjF,KAAAoR,EAAA,CAAkBD,CAKlB,KAAAE,EAAA,CAAiB3Q,CAKjB,KAAA4Q,EAAA,CAAiB9K,IAAAA,EAKjBqJ,EAAA,CAAA,IAAAuB,EAAA,CAAoC,IAAAC,EAApC,CAEkC,UAAlC,GAAI,IAAAA,EAAA1P,WAAJ,GACE,IAAA2P,EAMA,CANiB,IAAIvO,gBAAJ,CAAqB,IAAAwO,EAAAC,KAAA,CAA2B,IAA3B,CAArB,CAMjB,CAAA,IAAAF,EAAApO,QAAA,CAAuB,IAAAmO,EAAvB,CAAuC,CACrCjO,UAAW,CAAA,CAD0B,CAErCC,QAAS,CAAA,CAF4B,CAAvC,CAPF,CArB0B,CAmC5B,CAAA,UAAA,WAAA,CAAAkH,QAAU,EAAG,CACP,IAAA+G,EAAJ,EACE,IAAAA,EAAA/G,WAAA,EAFS,CASb,EAAA,UAAA,EAAA,CAAAgH,QAAgB,CAACzF,CAAD,CAAY,CAI1B,IAAMnK,EAAa,IAAA0P,EAAA1P,WACA,cAAnB,GAAIA,CAAJ,EAAmD,UAAnD,GAAoCA,CAApC,EACE,IAAA4I,WAAA,EAGF,KAAS1F,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBiH,CAAAzK,OAApB,CAAsCwD,CAAA,EAAtC,CAEE,IADA,IAAMkH,EAAaD,CAAA,CAAUjH,CAAV,CAAAkH,WAAnB,CACS0F,EAAI,CAAb,CAAgBA,CAAhB,CAAoB1F,CAAA1K,OAApB,CAAuCoQ,CAAA,EAAvC,CAEE5B,CAAA,CAAA,IAAAuB,EAAA,CADarF,CAAA1J,CAAWoP,CAAXpP,CACb,CAbsB,C,CE3C5BK,QADmBgP,GACR,EAAG,CAAA,IAAA,EAAA,IAWZ,KAAAC,EAAA,CANA,IAAAC,EAMA,CANcpL,IAAAA,EAYd,KAAAqL,EAAA,CAAgB,IAAIC,OAAJ,CAAY,QAAA,CAAAC,CAAA,CAAW,CACrC,CAAAJ,EAAA,CAAgBI,CAEZ,EAAAH,EAAJ,EACEG,CAAA,CAAQ,CAAAH,EAAR,CAJmC,CAAvB,CAjBJ,CA6BdG,QAAA,GAAO,CAAPA,CAAO,CAAQ,CACb,GAAI,CAAAH,EAAJ,CACE,KAAUnB,MAAJ,CAAU,mBAAV,CAAN,CAGF,CAAAmB,EAAA,CDoKqBpL,IAAAA,EClKjB,EAAAmL,EAAJ,EACE,CAAAA,EAAA,CDiKmBnL,IAAAA,ECjKnB,CARW,C,CDpBf9D,QALmBsP,EAKR,CAACb,CAAD,CAAY,CAKrB,IAAAc,EAAA,CAAmC,CAAA,CAMnC,KAAAb,EAAA,CAAkBD,CAMlB,KAAAe,EAAA,CAA4B,IAAI1D,GAOhC,KAAA2D,EAAA,CAAsBC,QAAA,CAAAC,CAAA,CAAM,CAAA,MAAAA,EAAA,EAAA,CAM5B,KAAAC,EAAA,CAAqB,CAAA,CAMrB,KAAAC,EAAA,CAA2B,EAM3B,KAAAC,EAAA,CAAqC,IDrD1BtB,CCqD0B,CAAiCC,CAAjC,CA1ChB;AAiDvB,CAAA,UAAA,EAAA,CAAAsB,QAAM,CAACzQ,CAAD,CAAYU,CAAZ,CAAyB,CAAA,IAAA,EAAA,IAC7B,IAAI,EAAEA,CAAF,WAAyBgQ,SAAzB,CAAJ,CACE,KAAM,KAAIC,SAAJ,CAAc,gDAAd,CAAN,CAGF,GAAI,CJpDQ3F,EIoDP,CAAmChL,CAAnC,CAAL,CACE,KAAM,KAAI4Q,WAAJ,CAAgB,oBAAhB,CAAqC5Q,CAArC,CAA8C,iBAA9C,CAAN,CAGF,GAAI,IAAAoP,EHvCG7C,EAAArJ,IAAA,CGuCmClD,CHvCnC,CGuCP,CACE,KAAUyO,MAAJ,CAAU,8BAAV,CAAyCzO,CAAzC,CAAkD,6BAAlD,CAAN,CAGF,GAAI,IAAAiQ,EAAJ,CACE,KAAUxB,MAAJ,CAAU,4CAAV,CAAN,CAEF,IAAAwB,EAAA,CAAmC,CAAA,CAOnC,IAAI,CAOFY,IAASA,EAATA,QAAoB,CAAC3O,CAAD,CAAO,CACzB,IAAM4O,EAAgBxG,CAAA,CAAUpI,CAAV,CACtB,IAAsBsC,IAAAA,EAAtB,GAAIsM,CAAJ,EAAmC,EAAEA,CAAF,WAA2BJ,SAA3B,CAAnC,CACE,KAAUjC,MAAJ,CAAU,OAAV,CAAkBvM,CAAlB,CAAsB,gCAAtB,CAAN;AAEF,MAAO4O,EALkB,CAA3BD,CALMvG,EAAY5J,CAAA4J,UAClB,IAAI,EAAEA,CAAF,WAAuBtH,OAAvB,CAAJ,CACE,KAAM,KAAI2N,SAAJ,CAAc,8DAAd,CAAN,CAWF,IAAAlD,EAAoBoD,CAAA,CAAY,mBAAZ,CACpB,KAAAjD,EAAuBiD,CAAA,CAAY,sBAAZ,CACvB,KAAAE,EAAkBF,CAAA,CAAY,iBAAZ,CAClB,KAAAhC,EAA2BgC,CAAA,CAAY,0BAAZ,CAC3B,KAAA/B,EAAqBpO,CAAA,mBAArBoO,EAA0D,EAnBxD,CAoBF,MAAOjK,CAAP,CAAU,CACV,MADU,CApBZ,OAsBU,CACR,IAAAoL,EAAA,CAAmC,CAAA,CAD3B,CAIJpD,CAAAA,CAAa,CACjB7M,UAAAA,CADiB,CAEjBU,YAAAA,CAFiB,CAGjB+M,kBAAAA,CAHiB,CAIjBG,qBAAAA,CAJiB,CAKjBmD,gBAAAA,CALiB,CAMjBlC,yBAAAA,CANiB,CAOjBC,mBAAAA,CAPiB,CAQjBP,kBAAmB,EARF,CAWnB3B,GAAA,CAAA,IAAAwC,EAAA,CAA8BpP,CAA9B,CAAyC6M,CAAzC,CACA,KAAA0D,EAAAtD,KAAA,CAA8BJ,CAA9B,CAIK;IAAAyD,EAAL,GACE,IAAAA,EACA,CADqB,CAAA,CACrB,CAAA,IAAAH,EAAA,CAAoB,QAAA,EAAM,CAAA,MAAAa,GAAA,CAAAA,CAAA,CAAA,CAA1B,CAFF,CAjE6B,CAuE/B,EAAA,UAAA,EAAA,CAAAjD,QAAO,CAACxP,CAAD,CAAU,CACfsP,CAAA,CAAA,IAAAuB,EAAA,CAAoC7Q,CAApC,CADe,CAIjByS,SAAA,GAAM,CAANA,CAAM,CAAG,CAIP,GAA2B,CAAA,CAA3B,GAAI,CAAAV,EAAJ,CAAA,CACA,CAAAA,EAAA,CAAqB,CAAA,CAiBrB,KAfA,IAAMW,EAAqB,CAAAV,EAA3B,CAOMW,EAAgC,EAPtC,CAcMC,EAAiC,IAAI3E,GAd3C,CAeS3J,EAAI,CAAb,CAAgBA,CAAhB,CAAoBoO,CAAA5R,OAApB,CAA+CwD,CAAA,EAA/C,CACEsO,CAAArE,IAAA,CAAmCmE,CAAA,CAAmBpO,CAAnB,CAAA7C,UAAnC,CAAoE,EAApE,CAGF6N,EAAA,CAAA,CAAAuB,EAAA,CAAoCpR,QAApC,CAA8C,CAC5C+P,EAASA,QAAA,CAAAxP,CAAA,CAAW,CAElB,GAA2BiG,IAAAA,EAA3B,GAAIjG,CAAAiP,WAAJ,CAAA,CAEA,IAAMxN,EAAYzB,CAAAyB,UAAlB,CAIMoR,EAAkBD,CAAAjO,IAAA,CAAmClD,CAAnC,CACpBoR,EAAJ,CACEA,CAAAnE,KAAA,CAAqB1O,CAArB,CADF,CApCG,CAwCQ6Q,EHjJR7C,EAAArJ,IAAA,CGiJ8ClD,CHjJ9C,CG6IH,EAKEkR,CAAAjE,KAAA,CAAmC1O,CAAnC,CAZF,CAFkB,CADwB,CAA9C,CAqBA,KAASsE,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBqO,CAAA7R,OAApB,CAA0DwD,CAAA,EAA1D,CACE6K,CAAA,CAAA,CAAA0B,EAAA,CAA+B8B,CAAA,CAA8BrO,CAA9B,CAA/B,CAIF,KAAA,CAAmC,CAAnC,CAAOoO,CAAA5R,OAAP,CAAA,CAAsC,CACpC,IAAMwN,EAAaoE,CAAAI,MAAA,EACbrR,EAAAA,CAAY6M,CAAA7M,UAGZsR,EAAAA,CAA4BH,CAAAjO,IAAA,CAAmC2J,CAAA7M,UAAnC,CAClC,KAAK,IAAI6C,EAAI,CAAb,CAAgBA,CAAhB,CAAoByO,CAAAjS,OAApB,CAAsDwD,CAAA,EAAtD,CACE6K,CAAA,CAAA,CAAA0B,EAAA,CAA+BkC,CAAA,CAA0BzO,CAA1B,CAA/B,CAKF,EADM0O,CACN,CADiB,CAAArB,EAAAhN,IAAA,CAA8BlD,CAA9B,CACjB,GACE+P,EAAA,CAAAwB,CAAA,CAbkC,CAhDtC,CAJO;AA0ET,CAAA,UAAA,IAAA,CAAArO,QAAG,CAAClD,CAAD,CAAY,CAEb,GADM6M,CACN,CADmB,IAAAuC,EHpLZ7C,EAAArJ,IAAA,CGoLkDlD,CHpLlD,CGqLP,CACE,MAAO6M,EAAAnM,YAHI,CAaf,EAAA,UAAA,EAAA,CAAA8Q,QAAW,CAACxR,CAAD,CAAY,CACrB,GAAI,CJlNQgL,EIkNP,CAAmChL,CAAnC,CAAL,CACE,MAAO8P,QAAA2B,OAAA,CAAe,IAAIb,WAAJ,CAAgB,GAAhB,CAAoB5Q,CAApB,CAA6B,uCAA7B,CAAf,CAGT,KAAM0R,EAAQ,IAAAxB,EAAAhN,IAAA,CAA8BlD,CAA9B,CACd,IAAI0R,CAAJ,CACE,MAAOA,ECtLF7B,EDyLD0B,EAAAA,CAAW,ICvON7B,EDwOX,KAAAQ,EAAApD,IAAA,CAA8B9M,CAA9B,CAAyCuR,CAAzC,CAEmB,KAAAnC,EH7MZ7C,EAAArJ,IAAA2J,CG6MkD7M,CH7MlD6M,CGiNP,EAAkB,CAAC,IAAA0D,EAAAoB,KAAA,CAA8B,QAAA,CAAAC,CAAA,CAAK,CAAA,MAAAA,EAAA5R,UAAA,GAAgBA,CAAhB,CAAnC,CAAnB,EACE+P,EAAA,CAAAwB,CAAA,CAGF,OAAOA,ECpMA1B,ED+Kc,CAwBvB,EAAA,UAAA,EAAA,CAAAgC,QAAyB,CAACC,CAAD,CAAQ,CAC/B,IAAAtB,EAAAjI,WAAA,EACA,KAAMwJ,EAAQ,IAAA5B,EACd,KAAAA,EAAA,CAAsBC,QAAA,CAAA4B,CAAA,CAAS,CAAA,MAAAF,EAAA,CAAM,QAAA,EAAM,CAAA,MAAAC,EAAA,CAAMC,CAAN,CAAA,CAAZ,CAAA,CAHA,CAQnCnU,OAAA,sBAAA,CAAkCmS,CAClCA;CAAA1F,UAAA,OAAA,CAA4C0F,CAAA1F,UAAAmG,EAC5CT,EAAA1F,UAAA,QAAA,CAA6C0F,CAAA1F,UAAAyD,EAC7CiC,EAAA1F,UAAA,IAAA,CAAyC0F,CAAA1F,UAAApH,IACzC8M,EAAA1F,UAAA,YAAA,CAAiD0F,CAAA1F,UAAAkH,EACjDxB,EAAA1F,UAAA,0BAAA,CAA+D0F,CAAA1F,UAAAuH,E,CEpQ7DI,IAAAA,EAAwBpU,MAAA2N,SAAAlB,UAAAxI,cAAxBmQ,CACAC,GAA0BrU,MAAA2N,SAAAlB,UAAA6H,gBAD1BF,CAEAG,GAAqBvU,MAAA2N,SAAAlB,UAAAyB,WAFrBkG,CAGAI,GAAkBxU,MAAA2N,SAAAlB,UAAA+H,QAHlBJ,CAIAK,GAAiBzU,MAAA2N,SAAAlB,UAAAgI,OAJjBL,CAKAM,GAA0B1U,MAAA2U,iBAAAlI,UAAAiI,QAL1BN,CAMAQ,GAAyB5U,MAAA2U,iBAAAlI,UAAAmI,OANzBR,CAOAS,GAAgB7U,MAAA0C,KAAA+J,UAAAqI,UAPhBV,CAQAW,EAAkB/U,MAAA0C,KAAA+J,UAAApF,YARlB+M,CASAY,GAAmBhV,MAAA0C,KAAA+J,UAAAd,aATnByI,CAUAa,EAAkBjV,MAAA0C,KAAA+J,UAAAyI,YAVlBd,CAWAe,GAAmBnV,MAAA0C,KAAA+J,UAAAjI,aAXnB4P,CAYAgB,EAAkBjQ,MAAAqH,yBAAA4I,CAAgCpV,MAAA0C,KAAA+J,UAAhC2I;AAAuDA,aAAvDA,CAZlBhB,CAaAiB,GAAsBrV,MAAA2M,QAAAF,UAAA4I,aAbtBjB,CAcAkB,EAAmBnQ,MAAAqH,yBAAA8I,CAAgCtV,MAAA2M,QAAAF,UAAhC6I,CAA0DA,WAA1DA,CAdnBlB,CAeAmB,EAAsBvV,MAAA2M,QAAAF,UAAAzG,aAftBoO,CAgBAoB,GAAsBxV,MAAA2M,QAAAF,UAAArI,aAhBtBgQ,CAiBAqB,GAAyBzV,MAAA2M,QAAAF,UAAAvC,gBAjBzBkK,CAkBAsB,EAAwB1V,MAAA2M,QAAAF,UAAAkJ,eAlBxBvB,CAmBAwB,GAAwB5V,MAAA2M,QAAAF,UAAAoJ,eAnBxBzB,CAoBA0B,GAA2B9V,MAAA2M,QAAAF,UAAAsJ,kBApB3B3B,CAqBA4B,GAA+BhW,MAAA2M,QAAAF,UAAAuJ,sBArB/B5B,CAsBA6B,GAA4BjW,MAAA2M,QAAAF,UAAAwJ,mBAtB5B7B,CAuBA8B,GAAiBlW,MAAA2M,QAAAF,UAAAyJ,QAvBjB9B;AAwBA+B,GAAgBnW,MAAA2M,QAAAF,UAAA0J,OAxBhB/B,CAyBAgC,EAAgBpW,MAAA2M,QAAAF,UAAA2J,OAzBhBhC,CA0BAiC,GAAerW,MAAA2M,QAAAF,UAAA4J,MA1BfjC,CA2BAkC,GAAqBtW,MAAA2M,QAAAF,UAAA6J,YA3BrBlC,CA4BAmC,GAAgBvW,MAAA2M,QAAAF,UAAA8J,OA5BhBnC,CA6BAoC,GAAaxW,MAAAwW,YA7BbpC,CA8BAqC,EAAuBtR,MAAAqH,yBAAAiK,CAAgCzW,MAAAwW,YAAA/J,UAAhCgK,CAA8DA,WAA9DA,CA9BvBrC,CA+BAsC,GAAmC1W,MAAAwW,YAAA/J,UAAAiK,sBA/BnCtC,CAgCAuC,GAAgC3W,MAAAwW,YAAA/J,UAAAkK,mB,CCxBlC,IAAAC,GAAe,IAFfC,QAAA,EAAA,E,CCCe,QAAA,GAAQ,EAAY,CAAXvF,IAAAA,ECoBLA,CDnBjBtR,OAAA,YAAA,CAAyB,QAAQ,EAAG,CAIlCwW,QAASA,EAAW,EAAG,CAKrB,IAAM3T,EAAc,IAAAA,YAApB,CAEMmM,EAAasC,CPoBd1C,EAAAvJ,IAAA,COpBgDxC,CPoBhD,COnBL,IAAI,CAACmM,CAAL,CACE,KAAU4B,MAAJ,CAAU,gFAAV,CAAN,CAGF,IAAMF,EAAoB1B,CAAA0B,kBAE1B,IAAiC,CAAjC,GAAIA,CAAAlP,OAAJ,CAME,MALMd,EAKCA,CALSoW,CAAAjK,KAAA,CAAmC1M,QAAnC,CAA6C6O,CAAA7M,UAA7C,CAKTzB,CAJPyE,MAAA4R,eAAA,CAAsBrW,CAAtB,CAA+BmC,CAAA4J,UAA/B,CAIO/L,CAHPA,CAAAiP,WAGOjP,CN7BLgP,CM6BKhP,CAFPA,CAAAqQ,gBAEOrQ,CAFmBsO,CAEnBtO,CADP4O,CAAA,CAAAgC,CAAA,CAAgB5Q,CAAhB,CACOA,CAAAA,CAGHsW,EAAAA,CAAYtG,CAAAlP,OAAZwV,CAAuC,CAC7C,KAAMtW,EAAUgQ,CAAA,CAAkBsG,CAAlB,CAChB,IAAItW,CAAJ,GD7BSkW,EC6BT,CACE,KAAUhG,MAAJ,CAAU,0GAAV,CAAN;AAEFF,CAAA,CAAkBsG,CAAlB,CAAA,CDhCSJ,ECkCTzR,OAAA4R,eAAA,CAAsBrW,CAAtB,CAA+BmC,CAAA4J,UAA/B,CACA6C,EAAA,CAAAgC,CAAA,CAA6C5Q,CAA7C,CAEA,OAAOA,EAjCc,CAoCvB8V,CAAA/J,UAAA,CAAwBwK,EAAAxK,UAExB,OAAO+J,EA1C2B,CAAZ,EADS,C,CEQpB,QAAA,EAAQ,CAAClF,CAAD,CAAY9C,CAAZ,CAAyB0I,CAAzB,CAAkC,CAKvDC,QAASA,EAAkB,CAACC,CAAD,CAAgB,CACzC,MAAO,SAAQ,CAAC,CAAD,CAAW,CAAV,IAAA,IAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,SAAA,OAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAKRC,EAAAA,CAAiB,EAQvB,KAFA,IAAMC,EAAoB,EAA1B,CAEStS,EAAI,CAAb,CAAgBA,CAAhB,CAbwBuS,CAaJ/V,OAApB,CAAkCwD,CAAA,EAAlC,CAAuC,CACrC,IAAMxC,EAdgB+U,CAcT,CAAMvS,CAAN,CAETxC,EAAJ,WAAoBmK,QAApB,EVZQY,CUYuB,CAAsB/K,CAAtB,CAA/B,EACE8U,CAAAlI,KAAA,CAAuB5M,CAAvB,CAGF,IAAIA,CAAJ,WAAoBmS,iBAApB,CACE,IAASvG,CAAT,CAAiB5L,CAAAH,WAAjB,CAAkC+L,CAAlC,CAAyCA,CAAzC,CAAiDA,CAAAxC,YAAjD,CACEyL,CAAAjI,KAAA,CAAoBhB,CAApB,CAFJ,KAKEiJ,EAAAjI,KAAA,CAAoB5M,CAApB,CAZmC,CAgBvC4U,CAAAI,MAAA,CAAoB,IAApB,CA7BwBD,CA6BxB,CAEA,KAASvS,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBsS,CAAA9V,OAApB,CAA8CwD,CAAA,EAA9C,CACE8K,CAAA,CAAAwB,CAAA,CAAyBgG,CAAA,CAAkBtS,CAAlB,CAAzB,CAGF,IV/BUuI,CU+BN,CAAsB,IAAtB,CAAJ,CACE,IAASvI,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBqS,CAAA7V,OAApB,CAA2CwD,CAAA,EAA3C,CACQxC,CACN,CADa6U,CAAA,CAAerS,CAAf,CACb,CAAIxC,CAAJ,WAAoBmK,QAApB,EACE6C,CAAA,CAAA8B,CAAA,CAAsB9O,CAAtB,CAvCkB,CADe,CA+CnBmE,IAAAA,EAAxB,GAAIuQ,CAAAO,EAAJ,GACiCjJ,CV0DjC,QU3DA,CACyD2I,CAAA7S,CAAmB4S,CAAAO,EAAnBnT,CADzD,CAIuBqC,KAAAA,EAAvB,GAAIuQ,CAAAQ,OAAJ,GACiClJ,CVsDjC,OUvDA,CACwD2I,CAAA7S,CAAmB4S,CAAAQ,OAAnBpT,CADxD,CAxDuD,C,CCP1C,QAAA,GAAQ,EAAY,CAAXgN,IAAAA,EFoBRA,CTiGA/C,EWpHd,CAA+BZ,QAAAlB,UAA/B,CAAmD,eAAnD,CAME,QAAQ,CAACtK,CAAD,CAAY,CAElB,GAAI,IAAAiO,iBAAJ,CAA2B,CACzB,IAAMpB,EAAasC,CVahB5C,EAAArJ,IAAA,CUbgDlD,CVahD,CUZH,IAAI6M,CAAJ,CACE,MAAO,KAAKA,CAAAnM,YAHW,CAOrB8N,CAAAA,CACHmG,CAAAjK,KAAA,CAAmC,IAAnC,CAAyC1K,CAAzC,CACHmN,EAAA,CAAAgC,CAAA,CAAgBX,CAAhB,CACA,OAAOA,EAZW,CANtB,CXoHcpC,EW/Fd,CAA+BZ,QAAAlB,UAA/B,CAAmD,YAAnD,CAOE,QAAQ,CAACjK,CAAD,CAAOmV,CAAP,CAAa,CACb3T,CAAAA,CAAQ4T,EAAA/K,KAAA,CAAgC,IAAhC,CAAsCrK,CAAtC,CAA4CmV,CAA5C,CAET,KAAAvH,iBAAL,CAGEJ,CAAA,CAAAsB,CAAA,CAA8BtN,CAA9B,CAHF,CACEqL,CAAA,CAAAiC,CAAA,CAAoBtN,CAApB,CAIF,OAAOA,EARY,CAPvB,CX+FcuK,EW3Ed,CAA+BZ,QAAAlB,UAA/B,CAAmD,iBAAnD,CAOE,QAAQ,CAAC2E,CAAD,CAAYjP,CAAZ,CAAuB,CAE7B,GAAI,IAAAiO,iBAAJ,GAA4C,IAA5C,GAA8BgB,CAA9B,EAXYyG,8BAWZ,GAAoDzG,CAApD,EAA4E,CAC1E,IAAMpC,EAAasC,CV7BhB5C,EAAArJ,IAAA,CU6BgDlD,CV7BhD,CU8BH,IAAI6M,CAAJ,CACE,MAAO,KAAKA,CAAAnM,YAH4D,CAOtE8N,CAAAA,CACHmH,EAAAjL,KAAA,CAAqC,IAArC,CAA2CuE,CAA3C,CAAsDjP,CAAtD,CACHmN,EAAA,CAAAgC,CAAA,CAAgBX,CAAhB,CACA,OAAOA,EAZsB,CAPjC,CDnCaiG;CCyDb,CAAgBtF,CAAhB,CAA2B3D,QAAAlB,UAA3B,CAA+C,CAC7CgL,EAASM,EADoC,CAE7CL,OAAQM,EAFqC,CAA/C,CAhEiC,C,CCFpB,QAAA,GAAQ,EAAY,CAAX1G,IAAAA,EHwBZA,CGuIV2G,SAASA,EAAiB,CAACzJ,CAAD,CAAc0J,CAAd,CAA8B,CACtD/S,MAAAC,eAAA,CAAsBoJ,CAAtB,CAAmC,aAAnC,CAAkD,CAChD1B,WAAYoL,CAAApL,WADoC,CAEhDvH,aAAc,CAAA,CAFkC,CAGhDF,IAAK6S,CAAA7S,IAH2C,CAIhD4J,IAAyBA,QAAQ,CAACkJ,CAAD,CAAgB,CAE/C,GAAI,IAAA1V,SAAJ,GAAsBC,IAAA0V,UAAtB,CACEF,CAAAjJ,IAAApC,KAAA,CAAwB,IAAxB,CAA8BsL,CAA9B,CADF,KAAA,CAKA,IAAIE,EAAe1R,IAAAA,EAGnB,IAAI,IAAAtE,WAAJ,CAAqB,CAGnB,IAAMqC,EAAa,IAAAA,WAAnB,CACM4T,EAAmB5T,CAAAlD,OACzB,IAAuB,CAAvB,CAAI8W,CAAJ,EZhKM/K,CYgKsB,CAAsB,IAAtB,CAA5B,CAAyD,CAEvD8K,CAAA,CAAmBE,KAAJ,CAAUD,CAAV,CACf,KAAK,IAAItT,EAAI,CAAb,CAAgBA,CAAhB,CAAoBsT,CAApB,CAAsCtT,CAAA,EAAtC,CACEqT,CAAA,CAAarT,CAAb,CAAA,CAAkBN,CAAA,CAAWM,CAAX,CAJmC,CALtC,CAcrBkT,CAAAjJ,IAAApC,KAAA,CAAwB,IAAxB,CAA8BsL,CAA9B,CAEA,IAAIE,CAAJ,CACE,IAASrT,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBqT,CAAA7W,OAApB,CAAyCwD,CAAA,EAAzC,CACE8K,CAAA,CAAAwB,CAAA,CAAyB+G,CAAA,CAAarT,CAAb,CAAzB,CA1BJ,CAF+C,CAJD,CAAlD,CADsD,CZxC1CuJ,CYnHd,CAA+B7L,IAAA+J,UAA/B,CAA+C,cAA/C,CAOE,QAAQ,CAACjK,CAAD,CAAOgW,CAAP,CAAgB,CACtB,GAAIhW,CAAJ,WAAoBmS,iBAApB,CAAsC,CACpC,IAAM8D,EAAgBF,KAAA9L,UAAAiM,MAAAlB,MAAA,CAA4BhV,CAAAkC,WAA5B,CAChBiU;CAAAA,CAAeC,EAAA/L,KAAA,CAA8B,IAA9B,CAAoCrK,CAApC,CAA0CgW,CAA1C,CAKrB,IZAQjL,CYAJ,CAAsB,IAAtB,CAAJ,CACE,IAASvI,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoByT,CAAAjX,OAApB,CAA0CwD,CAAA,EAA1C,CACEwK,CAAA,CAAA8B,CAAA,CAAsBmH,CAAA,CAAczT,CAAd,CAAtB,CAIJ,OAAO2T,EAb6B,CAgBhCE,CAAAA,CZTItL,CYSe,CAAsB/K,CAAtB,CACnBmW,EAAAA,CAAeC,EAAA/L,KAAA,CAA8B,IAA9B,CAAoCrK,CAApC,CAA0CgW,CAA1C,CAEjBK,EAAJ,EACE/I,CAAA,CAAAwB,CAAA,CAAyB9O,CAAzB,CZbQ+K,EYgBN,CAAsB,IAAtB,CAAJ,EACEiC,CAAA,CAAA8B,CAAA,CAAsB9O,CAAtB,CAGF,OAAOmW,EA5Be,CAP1B,CZmHcpK,EY7Ed,CAA+B7L,IAAA+J,UAA/B,CAA+C,aAA/C,CAME,QAAQ,CAACjK,CAAD,CAAO,CACb,GAAIA,CAAJ,WAAoBmS,iBAApB,CAAsC,CACpC,IAAM8D,EAAgBF,KAAA9L,UAAAiM,MAAAlB,MAAA,CAA4BhV,CAAAkC,WAA5B,CAChBiU,EAAAA,CAAeG,CAAAjM,KAAA,CAA6B,IAA7B,CAAmCrK,CAAnC,CAKrB,IZrCQ+K,CYqCJ,CAAsB,IAAtB,CAAJ,CACE,IAAK,IAAIvI,EAAI,CAAb,CAAgBA,CAAhB,CAAoByT,CAAAjX,OAApB,CAA0CwD,CAAA,EAA1C,CACEwK,CAAA,CAAA8B,CAAA,CAAsBmH,CAAA,CAAczT,CAAd,CAAtB,CAIJ,OAAO2T,EAb6B,CAgBhCE,CAAAA,CZ9CItL,CY8Ce,CAAsB/K,CAAtB,CACnBmW,EAAAA,CAAeG,CAAAjM,KAAA,CAA6B,IAA7B,CAAmCrK,CAAnC,CAEjBqW,EAAJ,EACE/I,CAAA,CAAAwB,CAAA,CAAyB9O,CAAzB,CZlDQ+K,EYqDN,CAAsB,IAAtB,CAAJ,EACEiC,CAAA,CAAA8B,CAAA,CAAsB9O,CAAtB,CAGF,OAAOmW,EA5BM,CANjB,CZ6EcpK,EYxCd,CAA+B7L,IAAA+J,UAA/B,CAA+C,WAA/C,CAME,QAAQ,CAACkL,CAAD,CAAO,CACP3T,CAAAA,CAAQ+U,EAAAlM,KAAA,CAA2B,IAA3B,CAAiC8K,CAAjC,CAGT,KAAA/W,cAAAwP,iBAAL,CAGEJ,CAAA,CAAAsB,CAAA,CAA8BtN,CAA9B,CAHF,CACEqL,CAAA,CAAAiC,CAAA;AAAoBtN,CAApB,CAIF,OAAOA,EATM,CANjB,CZwCcuK,EYtBd,CAA+B7L,IAAA+J,UAA/B,CAA+C,aAA/C,CAME,QAAQ,CAACjK,CAAD,CAAO,CACb,IAAMqW,EZrFItL,CYqFe,CAAsB/K,CAAtB,CAAzB,CACMmW,EAAeK,CAAAnM,KAAA,CAA6B,IAA7B,CAAmCrK,CAAnC,CAEjBqW,EAAJ,EACE/I,CAAA,CAAAwB,CAAA,CAAyB9O,CAAzB,CAGF,OAAOmW,EARM,CANjB,CZsBcpK,EYLd,CAA+B7L,IAAA+J,UAA/B,CAA+C,cAA/C,CAOE,QAAQ,CAACwM,CAAD,CAAeC,CAAf,CAA6B,CACnC,GAAID,CAAJ,WAA4BtE,iBAA5B,CAA8C,CAC5C,IAAM8D,EAAgBF,KAAA9L,UAAAiM,MAAAlB,MAAA,CAA4ByB,CAAAvU,WAA5B,CAChBiU,EAAAA,CAAeQ,EAAAtM,KAAA,CAA8B,IAA9B,CAAoCoM,CAApC,CAAkDC,CAAlD,CAKrB,IZ9GQ3L,CY8GJ,CAAsB,IAAtB,CAAJ,CAEE,IADAuC,CAAA,CAAAwB,CAAA,CAAyB4H,CAAzB,CACSlU,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CAAoByT,CAAAjX,OAApB,CAA0CwD,CAAA,EAA1C,CACEwK,CAAA,CAAA8B,CAAA,CAAsBmH,CAAA,CAAczT,CAAd,CAAtB,CAIJ,OAAO2T,EAdqC,CAiBxCS,CAAAA,CZxHI7L,CYwHuB,CAAsB0L,CAAtB,CACjC,KAAMN,EAAeQ,EAAAtM,KAAA,CAA8B,IAA9B,CAAoCoM,CAApC,CAAkDC,CAAlD,CAArB,CACMG,EZ1HI9L,CY0Hc,CAAsB,IAAtB,CAEpB8L,EAAJ,EACEvJ,CAAA,CAAAwB,CAAA,CAAyB4H,CAAzB,CAGEE,EAAJ,EACEtJ,CAAA,CAAAwB,CAAA,CAAyB2H,CAAzB,CAGEI,EAAJ,EACE7J,CAAA,CAAA8B,CAAA,CAAsB2H,CAAtB,CAGF,OAAON,EAlC4B,CAPvC,CAqFIW,EAAJ,EAA+BC,CAAAlU,IAA/B,CACE4S,CAAA,CAAkBvV,IAAA+J,UAAlB,CAAkC6M,CAAlC,CADF,CAGEpK,EAAA,CAAAoC,CAAA,CAAmB,QAAQ,CAAC5Q,CAAD,CAAU,CACnCuX,CAAA,CAAkBvX,CAAlB,CAA2B,CACzBoM,WAAY,CAAA,CADa,CAEzBvH,aAAc,CAAA,CAFW,CAKzBF,IAAyBA,QAAQ,EAAG,CAIlC,IAFA,IAAMmU;AAAQ,EAAd,CAESxU,EAAI,CAAb,CAAgBA,CAAhB,CAAoB,IAAAN,WAAAlD,OAApB,CAA4CwD,CAAA,EAA5C,CACEwU,CAAApK,KAAA,CAAW,IAAA1K,WAAA,CAAgBM,CAAhB,CAAAT,YAAX,CAGF,OAAOiV,EAAAC,KAAA,CAAW,EAAX,CAR2B,CALX,CAezBxK,IAAyBA,QAAQ,CAACkJ,CAAD,CAAgB,CAC/C,IAAA,CAAO,IAAA9V,WAAP,CAAA,CACE2W,CAAAnM,KAAA,CAA6B,IAA7B,CAAmC,IAAAxK,WAAnC,CAEFyW,EAAAjM,KAAA,CAA6B,IAA7B,CAAmC1M,QAAAuZ,eAAA,CAAwBvB,CAAxB,CAAnC,CAJ+C,CAfxB,CAA3B,CADmC,CAArC,CA1M+B,C,CCWpB,QAAA,GAAQ,CAAC7G,CAAD,CAAkC,CAAtB9C,IAAAA,ECsRP7B,OAAAF,UDjR1BkN,SAASA,EAAgB,CAACvC,CAAD,CAAgB,CACvC,MAAO,SAAQ,CAAC,CAAD,CAAW,CAAV,IAAA,IAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,SAAA,OAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAKRC,EAAAA,CAAiB,EAQvB,KAFA,IAAMC,EAAoB,EAA1B,CAEStS,EAAI,CAAb,CAAgBA,CAAhB,CAbwBuS,CAaJ/V,OAApB,CAAkCwD,CAAA,EAAlC,CAAuC,CACrC,IAAMxC,EAdgB+U,CAcT,CAAMvS,CAAN,CAETxC,EAAJ,WAAoBmK,QAApB,EbdQY,CacuB,CAAsB/K,CAAtB,CAA/B,EACE8U,CAAAlI,KAAA,CAAuB5M,CAAvB,CAGF,IAAIA,CAAJ,WAAoBmS,iBAApB,CACE,IAASvG,CAAT,CAAiB5L,CAAAH,WAAjB,CAAkC+L,CAAlC,CAAyCA,CAAzC,CAAiDA,CAAAxC,YAAjD,CACEyL,CAAAjI,KAAA,CAAoBhB,CAApB,CAFJ,KAKEiJ,EAAAjI,KAAA,CAAoB5M,CAApB,CAZmC,CAgBvC4U,CAAAI,MAAA,CAAoB,IAApB,CA7BwBD,CA6BxB,CAEA,KAASvS,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBsS,CAAA9V,OAApB,CAA8CwD,CAAA,EAA9C,CACE8K,CAAA,CAAAwB,CAAA,CAAyBgG,CAAA,CAAkBtS,CAAlB,CAAzB,CAGF,IbjCUuI,CaiCN,CAAsB,IAAtB,CAAJ,CACE,IAASvI,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBqS,CAAA7V,OAApB,CAA2CwD,CAAA,EAA3C,CACQxC,CACN,CADa6U,CAAA,CAAerS,CAAf,CACb,CAAIxC,CAAJ,WAAoBmK,QAApB,EACE6C,CAAA,CAAA8B,CAAA,CAAsB9O,CAAtB,CAvCkB,CADa,CA+ClBmE,IAAAA,EAAvB,GCmOUiT,CDnOV,GACiCpL,CbwDjC,OazDA,CACwDmL,CAAArV,CCkO9CsV,CDlO8CtV,CADxD,CAIuBqC,KAAAA,EAAvB,GC+NUiT,CD/NV,GACiCpL,CboDjC,MarDA,CACuDmL,CAAArV,CC+N9CuV,ED/N8CvV,CADvD,CAI4BqC,KAAAA,EAA5B,GC6NemT,ED7Nf;AbgDcvL,Ca/CZ,CAA+BC,CAA/B,CAA4C,aAA5C,CAIE,QAAQ,CAAC,CAAD,CAAW,CAAV,IAAA,IAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,SAAA,OAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAKD6I,EAAAA,CAAiB,EAQvB,KAFA,IAAMC,EAAoB,EAA1B,CAEStS,EAAI,CAAb,CAAgBA,CAAhB,CAbiBuS,CAaG/V,OAApB,CAAkCwD,CAAA,EAAlC,CAAuC,CACrC,IAAMxC,EAdS+U,CAcF,CAAMvS,CAAN,CAETxC,EAAJ,WAAoBmK,QAApB,EbzEMY,CayEyB,CAAsB/K,CAAtB,CAA/B,EACE8U,CAAAlI,KAAA,CAAuB5M,CAAvB,CAGF,IAAIA,CAAJ,WAAoBmS,iBAApB,CACE,IAASvG,CAAT,CAAiB5L,CAAAH,WAAjB,CAAkC+L,CAAlC,CAAyCA,CAAzC,CAAiDA,CAAAxC,YAAjD,CACEyL,CAAAjI,KAAA,CAAoBhB,CAApB,CAFJ,KAKEiJ,EAAAjI,KAAA,CAAoB5M,CAApB,CAZmC,CAgBjCuX,CAAAA,CbtFExM,CasFa,CAAsB,IAAtB,CC2LZuM,GDzLTtC,MAAA,CAA0B,IAA1B,CA/BiBD,CA+BjB,CAEA,KAASvS,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBsS,CAAA9V,OAApB,CAA8CwD,CAAA,EAA9C,CACE8K,CAAA,CAAAwB,CAAA,CAAyBgG,CAAA,CAAkBtS,CAAlB,CAAzB,CAGF,IAAI+U,CAAJ,CAEE,IADAjK,CAAA,CAAAwB,CAAA,CAAyB,IAAzB,CACStM,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CAAoBqS,CAAA7V,OAApB,CAA2CwD,CAAA,EAA3C,CACQxC,CACN,CADa6U,CAAA,CAAerS,CAAf,CACb,CAAIxC,CAAJ,WAAoBmK,QAApB,EACE6C,CAAA,CAAA8B,CAAA,CAAsB9O,CAAtB,CA1CW,CAJrB,CAqDqBmE,KAAAA,EAAvB,GCwKUqT,EDxKV,EbNczL,CaOZ,CAA+BC,CAA/B,CAA4C,QAA5C,CACE,QAAQ,EAAG,CACT,IAAMuL,Eb7GExM,Ca6Ga,CAAsB,IAAtB,CCqKjByM,GDnKJnN,KAAA,CAAoB,IAApB,CAEIkN,EAAJ,EACEjK,CAAA,CAAAwB,CAAA,CAAyB,IAAzB,CANO,CADb,CAnHqD,C,CCP1C,QAAA,GAAQ,EAAY,CAAXA,IAAAA,ELqBTA,CKLb2I,SAASA,EAAe,CAACzL,CAAD,CAAc0J,CAAd,CAA8B,CACpD/S,MAAAC,eAAA,CAAsBoJ,CAAtB,CAAmC,WAAnC,CAAgD,CAC9C1B,WAAYoL,CAAApL,WADkC,CAE9CvH,aAAc,CAAA,CAFgC,CAG9CF,IAAK6S,CAAA7S,IAHyC,CAI9C4J,IAA4BA,QAAQ,CAACiL,CAAD,CAAa,CAAA,IAAA,EAAA,IAAA,CAS3CC,EAAkBxT,IAAAA,Edfd4G,EcOYA,CAAsB,IAAtBA,CASpB,GACE4M,CACA,CADkB,EAClB,CdwBMnM,CcxBN,CAAqC,IAArC,CAA2C,QAAA,CAAAtN,CAAA,CAAW,CAChDA,CAAJ,GAAgB,CAAhB,EACEyZ,CAAA/K,KAAA,CAAqB1O,CAArB,CAFkD,CAAtD,CAFF,CASAwX,EAAAjJ,IAAApC,KAAA,CAAwB,IAAxB,CAA8BqN,CAA9B,CAEA,IAAIC,CAAJ,CACE,IAAK,IAAInV,EAAI,CAAb,CAAgBA,CAAhB,CAAoBmV,CAAA3Y,OAApB,CAA4CwD,CAAA,EAA5C,CAAiD,CAC/C,IAAMtE,EAAUyZ,CAAA,CAAgBnV,CAAhB,CZnDlB0K,EYoDE,GAAIhP,CAAAiP,WAAJ,EACE2B,CAAAvB,qBAAA,CAA+BrP,CAA/B,CAH6C,CAU9C,IAAAE,cAAAwP,iBAAL,CAGEJ,CAAA,CAAAsB,CAAA,CAA8B,IAA9B,CAHF,CACEjC,CAAA,CAAAiC,CAAA,CAAoB,IAApB,CAIF,OAAO4I,EArCwC,CAJH,CAAhD,CADoD,CA2KtDE,QAASA,EAA2B,CAAC5L,CAAD,CAAc6L,CAAd,CAA0B,CdxEhD9L,CcyEZ,CAA+BC,CAA/B,CAA4C,uBAA5C,CAOE,QAAQ,CAAC8L,CAAD,CAAW5Z,CAAX,CAAoB,CAC1B,IAAMqZ,EdrLExM,CcqLa,CAAsB7M,CAAtB,CACf6Z,EAAAA,CACHF,CAAAxN,KAAA,CAAgB,IAAhB,CAAsByN,CAAtB,CAAgC5Z,CAAhC,CAECqZ,EAAJ,EACEjK,CAAA,CAAAwB,CAAA,CAAyB5Q,CAAzB,Cd1LM6M,Ec6LJ,CAAsBgN,CAAtB,CAAJ,EACE/K,CAAA,CAAA8B,CAAA,CAAsB5Q,CAAtB,CAEF;MAAO6Z,EAZmB,CAP9B,CAD4D,CAiC9DC,QAASA,EAAwB,CAAChM,CAAD,CAAc6L,CAAd,CAA0B,CAQzDI,QAASA,EAAmB,CAAC1M,CAAD,CAAQ2M,CAAR,CAAa,CAEvC,IADA,IAAMnD,EAAQ,EACd,CAAuB/U,CAAvB,GAAgCkY,CAAhC,CAAqClY,CAArC,CAA4CA,CAAAoJ,YAA5C,CACE2L,CAAAnI,KAAA,CAAW5M,CAAX,CAEF,KAASwC,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBuS,CAAA/V,OAApB,CAAkCwD,CAAA,EAAlC,CACEgL,CAAA,CAAAsB,CAAA,CAA8BiG,CAAA,CAAMvS,CAAN,CAA9B,CANqC,CdjH7BuJ,Cc2HZ,CAA+BC,CAA/B,CAA4C,oBAA5C,CAME,QAAQ,CAAC8L,CAAD,CAAWnU,CAAX,CAAiB,CACvBmU,CAAA,CAAWA,CAAAK,YAAA,EAEX,IAAiB,aAAjB,GAAIL,CAAJ,CAAgC,CAC9B,IAAMM,EAAS,IAAAC,gBACfR,EAAAxN,KAAA,CAAgB,IAAhB,CAAsByN,CAAtB,CAAgCnU,CAAhC,CACAsU,EAAA,CACwBG,CADxB,EACkC,IAAA9Z,WAAAuB,WADlC,CAC+D,IAD/D,CAH8B,CAAhC,IAKO,IAAiB,YAAjB,GAAIiY,CAAJ,CACCM,CAEN,CAFe,IAAAvY,WAEf,CADAgY,CAAAxN,KAAA,CAAgB,IAAhB,CAAsByN,CAAtB,CAAgCnU,CAAhC,CACA,CAAAsU,CAAA,CAA0C,IAAApY,WAA1C,CAA4DuY,CAA5D,CAHK,KAIA,IAAiB,WAAjB,GAAIN,CAAJ,CACCM,CAEN,CAFe,IAAAE,UAEf,CADAT,CAAAxN,KAAA,CAAgB,IAAhB,CAAsByN,CAAtB,CAAgCnU,CAAhC,CACA,CAAAsU,CAAA,CAAoBG,CAApB,EAA8B,IAAAvY,WAA9B,CAA+C,IAA/C,CAHK,KAIA,IAAiB,UAAjB,GAAIiY,CAAJ,CACCM,CAEN,CAFe,IAAAhP,YAEf,CADAyO,CAAAxN,KAAA,CAAgB,IAAhB;AAAsByN,CAAtB,CAAgCnU,CAAhC,CACA,CAAAsU,CAAA,CAA0C,IAAA7O,YAA1C,CAA6DgP,CAA7D,CAHK,KAKL,MAAM,KAAI7H,WAAJ,CAAgB,sBAAhB,CAAuCgI,MAAA,CAAOT,CAAP,CAAvC,CACJ,0EADI,CAAN,CArBqB,CAN3B,CAlByD,CA3NvDU,EAAJ,EdkHczM,CcjHZ,CAA+B5B,OAAAF,UAA/B,CAAkD,cAAlD,CAME,QAAQ,CAACwO,CAAD,CAAO,CAGb,MADA,KAAA3M,gBACA,CAFMD,CAEN,CAFmB6M,EAAArO,KAAA,CAAiC,IAAjC,CAAuCoO,CAAvC,CADN,CANjB,CA6DEE,EAAJ,EAAgCC,CAAA/V,IAAhC,CACE4U,CAAA,CAAgBtN,OAAAF,UAAhB,CAAmC0O,CAAnC,CADF,CAEWE,CAAJ,EAAoCC,CAAAjW,IAApC,CACL4U,CAAA,CAAgBzD,WAAA/J,UAAhB,CAAuC4O,CAAvC,CADK,CAILnM,EAAA,CAAAoC,CAAA,CAAmB,QAAQ,CAAC5Q,CAAD,CAAU,CACnCuZ,CAAA,CAAgBvZ,CAAhB,CAAyB,CACvBoM,WAAY,CAAA,CADW,CAEvBvH,aAAc,CAAA,CAFS,CAMvBF,IAA4BA,QAAQ,EAAG,CACrC,MAAO0T,GAAAlM,KAAA,CAA2B,IAA3B,CAAiC,CAAA,CAAjC,CAAA9C,UAD8B,CANhB,CAYvBkF,IAA4BA,QAAQ,CAACkJ,CAAD,CAAgB,CAIlD,IAAMoD,EAAiC,UAAjCA,GAAc,IAAApZ,UAApB,CAEM0B,EAAU0X,CAAA,CACb,IAD0B1X,QAAb;AACI,IAHpB,CAKM2X,EAAa1E,CAAAjK,KAAA,CAAmC1M,QAAnC,CACjB,IAAAgC,UADiB,CAInB,KAFAqZ,CAAAzR,UAEA,CAFuBoO,CAEvB,CAAmC,CAAnC,CAAOtU,CAAAa,WAAAlD,OAAP,CAAA,CACEwX,CAAAnM,KAAA,CAA6BhJ,CAA7B,CAAsCA,CAAAa,WAAA,CAAmB,CAAnB,CAAtC,CAGF,KADM+W,CACN,CADkBF,CAAA,CAAaC,CAAA3X,QAAb,CAAkC2X,CACpD,CAAqC,CAArC,CAAOC,CAAA/W,WAAAlD,OAAP,CAAA,CACEsX,CAAAjM,KAAA,CAA6BhJ,CAA7B,CAAsC4X,CAAA/W,WAAA,CAAqB,CAArB,CAAtC,CAlBgD,CAZ7B,CAAzB,CADmC,CAArC,Cd8CY6J,EcPd,CAA+B5B,OAAAF,UAA/B,CAAkD,cAAlD,CAME,QAAQ,CAACpI,CAAD,CAAO8M,CAAP,CAAiB,CAEvB,GZ3HIzB,CY2HJ,GAAI,IAAAC,WAAJ,CACE,MAAO+L,GAAA7O,KAAA,CAAiC,IAAjC,CAAuCxI,CAAvC,CAA6C8M,CAA7C,CAGT,KAAMD,EAAWyK,CAAA9O,KAAA,CAAiC,IAAjC,CAAuCxI,CAAvC,CACjBqX,GAAA7O,KAAA,CAAiC,IAAjC,CAAuCxI,CAAvC,CAA6C8M,CAA7C,CACAA,EAAA,CAAWwK,CAAA9O,KAAA,CAAiC,IAAjC,CAAuCxI,CAAvC,CACXiN,EAAAN,yBAAA,CAAmC,IAAnC,CAAyC3M,CAAzC,CAA+C6M,CAA/C,CAAyDC,CAAzD,CAAmE,IAAnE,CATuB,CAN3B,CdOc5C,EcWd,CAA+B5B,OAAAF,UAA/B,CAAkD,gBAAlD,CAOE,QAAQ,CAAC2E,CAAD,CAAY/M,CAAZ,CAAkB8M,CAAlB,CAA4B,CAElC,GZ9IIzB,CY8IJ,GAAI,IAAAC,WAAJ,CACE,MAAOiM,GAAA/O,KAAA,CAAmC,IAAnC,CAAyCuE,CAAzC,CAAoD/M,CAApD,CAA0D8M,CAA1D,CAGT,KAAMD,EAAW2K,CAAAhP,KAAA,CAAmC,IAAnC,CAAyCuE,CAAzC;AAAoD/M,CAApD,CACjBuX,GAAA/O,KAAA,CAAmC,IAAnC,CAAyCuE,CAAzC,CAAoD/M,CAApD,CAA0D8M,CAA1D,CACAA,EAAA,CAAW0K,CAAAhP,KAAA,CAAmC,IAAnC,CAAyCuE,CAAzC,CAAoD/M,CAApD,CACXiN,EAAAN,yBAAA,CAAmC,IAAnC,CAAyC3M,CAAzC,CAA+C6M,CAA/C,CAAyDC,CAAzD,CAAmEC,CAAnE,CATkC,CAPtC,CdXc7C,Ec8Bd,CAA+B5B,OAAAF,UAA/B,CAAkD,iBAAlD,CAKE,QAAQ,CAACpI,CAAD,CAAO,CAEb,GZ/JIqL,CY+JJ,GAAI,IAAAC,WAAJ,CACE,MAAOmM,GAAAjP,KAAA,CAAoC,IAApC,CAA0CxI,CAA1C,CAGT,KAAM6M,EAAWyK,CAAA9O,KAAA,CAAiC,IAAjC,CAAuCxI,CAAvC,CACjByX,GAAAjP,KAAA,CAAoC,IAApC,CAA0CxI,CAA1C,CACiB,KAAjB,GAAI6M,CAAJ,EACEI,CAAAN,yBAAA,CAAmC,IAAnC,CAAyC3M,CAAzC,CAA+C6M,CAA/C,CAAyD,IAAzD,CAA+D,IAA/D,CATW,CALjB,Cd9Bc3C,EcgDd,CAA+B5B,OAAAF,UAA/B,CAAkD,mBAAlD,CAME,QAAQ,CAAC2E,CAAD,CAAY/M,CAAZ,CAAkB,CAExB,GZlLIqL,CYkLJ,GAAI,IAAAC,WAAJ,CACE,MAAOoM,GAAAlP,KAAA,CAAsC,IAAtC,CAA4CuE,CAA5C,CAAuD/M,CAAvD,CAGT,KAAM6M,EAAW2K,CAAAhP,KAAA,CAAmC,IAAnC,CAAyCuE,CAAzC,CAAoD/M,CAApD,CACjB0X,GAAAlP,KAAA,CAAsC,IAAtC,CAA4CuE,CAA5C,CAAuD/M,CAAvD,CAIA,KAAM8M,EAAW0K,CAAAhP,KAAA,CAAmC,IAAnC,CAAyCuE,CAAzC,CAAoD/M,CAApD,CACb6M,EAAJ,GAAiBC,CAAjB,EACEG,CAAAN,yBAAA,CAAmC,IAAnC,CAAyC3M,CAAzC,CAA+C6M,CAA/C,CAAyDC,CAAzD,CAAmEC,CAAnE,CAbsB,CAN5B,CAgDI4K,GAAJ,CACE5B,CAAA,CAA4B5D,WAAA/J,UAA5B;AAAmDuP,EAAnD,CADF,CAEWC,EAAJ,CACL7B,CAAA,CAA4BzN,OAAAF,UAA5B,CAA+CwP,EAA/C,CADK,CAGLC,OAAAC,KAAA,CAAa,mEAAb,CAuDEC,GAAJ,CACE5B,CAAA,CAAyBhE,WAAA/J,UAAzB,CAAgD2P,EAAhD,CADF,CAEWC,EAAJ,CACL7B,CAAA,CAAyB7N,OAAAF,UAAzB,CAA4C4P,EAA5C,CADK,CAGLH,OAAAC,KAAA,CAAa,gEAAb,CJ/QWvF,EImRb,CAAgBtF,CAAhB,CAA2B3E,OAAAF,UAA3B,CAA8C,CAC5CgL,EAAS6E,EADmC,CAE5C5E,OAAQ6E,EAFoC,CAA9C,CDjRa3F,GCsRb,CAAetF,CAAf,CA7RiC,C,CLQnC,IAAMkL,EAAsBxc,MAAA,eAE5B,IAAI,CAACwc,CAAL,EACKA,CAAA,cADL,EAE8C,UAF9C,EAEM,MAAOA,EAAA,OAFb,EAG2C,UAH3C,EAGM,MAAOA,EAAA,IAHb,CAGwD,CAEtD,IAAMlL,EAAY,IRvBL7C,COKAmI,GCoBb,EEnBaA,GFoBb,ECbaA,EKRb,CNsBsBtF,CMtBtB,CAA2BqD,gBAAAlI,UAA3B,CAAuD,CACrDgL,EAASgF,EAD4C,CAErD/E,OAAQgF,EAF6C,CAAvD,CHDa9F,GHwBb,EKpBaA,GLqBb,EAGAzW,SAAAiQ,iBAAA,CAA4B,CAAA,CAG5B,KAAMuM,eAAiB,IL9BVxK,CK8BU,CAA0Bb,CAA1B,CAEvBnM,OAAAC,eAAA,CAAsBpF,MAAtB,CAA8B,gBAA9B,CAAgD,CAC9CuF,aAAc,CAAA,CADgC,CAE9CuH,WAAY,CAAA,CAFkC,CAG9CxI,MAAOqY,cAHuC,CAAhD,CAhBsD,C;;;;;;;;;AOZxD,IAAIA,EAAiB3c,MAAA,eAArB,CACIgN,EAAchN,MAAA,YADlB,CAEI4c,GAAW5c,MAAA,oBAIfA,OAAA6c,cAAA,CAAuB7c,MAAA6c,cAAvB,EAA+C,EAE/C,IAAIF,CAAJ,EAAsBA,CAAA,0BAAtB,CAAmE,CAGjE,IAAIG,CAAJ,CACIC,GAAsBA,QAA4B,EAAG,CACvD,GAAID,CAAJ,CAAmB,CAEbF,EAAAI,EAAJ,EACEJ,EAAAI,EAAA,CAAmBhd,MAAAG,SAAnB,CAEF,KAAI8c,EAAKH,CACTA,EAAA,CAAgB,IAChBG,EAAA,EACA,OAAO,CAAA,CARU,CADoC,CADzD,CAaIC,GAAgBlQ,CAAA,UACpB2P,EAAA,0BAAA,CAA4C,QAAQ,CAACM,CAAD,CAAK,CACvDH,CAAA,CAAgBG,CAChBC,GAAA,CAAcH,EAAd,CAFuD,CAAzD,CAKA/P,EAAA,UAAA,CAA2B,QAAQ,CAACiQ,CAAD,CAAK,CACtCC,EAAA,CAAc,QAAQ,EAAG,CAInBH,EAAA,EAAJ,CACE/P,CAAA,UAAA,CAAyBiQ,CAAzB,CADF,CAGEA,CAAA,EAPqB,CAAzB,CADsC,CAtByB;AAqCnEjQ,CAAA,UAAA,CAAyB,QAAQ,EAAG,CAClCmQ,qBAAA,CAAsB,QAAQ,EAAG,CAC/Bnd,MAAA6c,cAAAO,MAAA,CAA6B,CAAA,CAC7Bjd,SAAA4L,cAAA,CAAuB,IAAI9L,WAAJ,CAAgB,oBAAhB,CAAsC,CAACK,QAAS,CAAA,CAAV,CAAtC,CAAvB,CAF+B,CAAjC,CADkC,CAApC,C,CCrCA,IAAI+c,GAAQld,QAAA8D,cAAA,CAAuB,OAAvB,CACZoZ,GAAA9Y,YAAA,CAAoB,sIAQpB,KAAIjB,GAAOnD,QAAA8J,cAAA,CAAuB,MAAvB,CACX3G,GAAAqI,aAAA,CAAkB0R,EAAlB,CAAyB/Z,EAAAjB,WAAzB,C","file":"webcomponents-hi-ce.js","sourcesContent":["/**\n * @license\n * Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(scope => {\n\n /********************* base setup *********************/\n const link = document.createElement('link');\n const useNative = Boolean('import' in link);\n const emptyNodeList = link.querySelectorAll('*');\n\n // Polyfill `currentScript` for browsers without it.\n let currentScript = null;\n if ('currentScript' in document === false) {\n Object.defineProperty(document, 'currentScript', {\n get() {\n return currentScript ||\n // NOTE: only works when called in synchronously executing code.\n // readyState should check if `loading` but IE10 is\n // interactive when scripts run so we cheat. This is not needed by\n // html-imports polyfill but helps generally polyfill `currentScript`.\n (document.readyState !== 'complete' ?\n document.scripts[document.scripts.length - 1] : null);\n },\n configurable: true\n });\n }\n\n /**\n * @param {Array|NodeList|NamedNodeMap} list\n * @param {!Function} callback\n * @param {boolean=} inverseOrder\n */\n const forEach = (list, callback, inverseOrder) => {\n const length = list ? list.length : 0;\n const increment = inverseOrder ? -1 : 1;\n let i = inverseOrder ? length - 1 : 0;\n for (; i < length && i >= 0; i = i + increment) {\n callback(list[i], i);\n }\n };\n\n /**\n * @param {!Node} node\n * @param {!string} selector\n * @return {!NodeList<!Element>}\n */\n const QSA = (node, selector) => {\n // IE 11 throws a SyntaxError if a node with no children is queried with\n // a selector containing the `:not([type])` syntax.\n if (!node.childNodes.length) {\n return emptyNodeList;\n }\n return node.querySelectorAll(selector);\n };\n\n /**\n * @param {!DocumentFragment} fragment\n */\n const replaceScripts = (fragment) => {\n forEach(QSA(fragment, 'template'), template => {\n forEach(QSA(template.content, scriptsSelector), script => {\n const clone = /** @type {!HTMLScriptElement} */\n (document.createElement('script'));\n forEach(script.attributes, attr => clone.setAttribute(attr.name, attr.value));\n clone.textContent = script.textContent;\n script.parentNode.replaceChild(clone, script);\n });\n replaceScripts(template.content);\n });\n };\n\n /********************* path fixup *********************/\n const CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\n const CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n const STYLESHEET_REGEXP = /(<link[^>]*)(rel=['|\"]?stylesheet['|\"]?[^>]*>)/g;\n\n // path fixup: style elements in imports must be made relative to the main\n // document. We fixup url's in url() and @import.\n const Path = {\n\n fixUrls(element, base) {\n if (element.href) {\n element.setAttribute('href',\n Path.resolveUrl(element.getAttribute('href'), base));\n }\n if (element.src) {\n element.setAttribute('src',\n Path.resolveUrl(element.getAttribute('src'), base));\n }\n if (element.localName === 'style') {\n const r = Path.replaceUrls(element.textContent, base, CSS_URL_REGEXP);\n element.textContent = Path.replaceUrls(r, base, CSS_IMPORT_REGEXP);\n }\n },\n\n replaceUrls(text, linkUrl, regexp) {\n return text.replace(regexp, (m, pre, url, post) => {\n let urlPath = url.replace(/[\"']/g, '');\n if (linkUrl) {\n urlPath = Path.resolveUrl(urlPath, linkUrl);\n }\n return pre + '\\'' + urlPath + '\\'' + post;\n });\n },\n\n resolveUrl(url, base) {\n // Lazy feature detection.\n if (Path.__workingURL === undefined) {\n Path.__workingURL = false;\n try {\n const u = new URL('b', 'http://a');\n u.pathname = 'c%20d';\n Path.__workingURL = (u.href === 'http://a/c%20d');\n } catch (e) {}\n }\n\n if (Path.__workingURL) {\n return (new URL(url, base)).href;\n }\n\n // Fallback to creating an anchor into a disconnected document.\n let doc = Path.__tempDoc;\n if (!doc) {\n doc = document.implementation.createHTMLDocument('temp');\n Path.__tempDoc = doc;\n doc.__base = doc.createElement('base');\n doc.head.appendChild(doc.__base);\n doc.__anchor = doc.createElement('a');\n }\n doc.__base.href = base;\n doc.__anchor.href = url;\n return doc.__anchor.href || url;\n }\n };\n\n /********************* Xhr processor *********************/\n const Xhr = {\n\n async: true,\n\n /**\n * @param {!string} url\n * @param {!function(!string, string=)} success\n * @param {!function(!string)} fail\n */\n load(url, success, fail) {\n if (!url) {\n fail('error: href must be specified');\n } else if (url.match(/^data:/)) {\n // Handle Data URI Scheme\n const pieces = url.split(',');\n const header = pieces[0];\n let resource = pieces[1];\n if (header.indexOf(';base64') > -1) {\n resource = atob(resource);\n } else {\n resource = decodeURIComponent(resource);\n }\n success(resource);\n } else {\n const request = new XMLHttpRequest();\n request.open('GET', url, Xhr.async);\n request.onload = () => {\n // Servers redirecting an import can add a Location header to help us\n // polyfill correctly. Handle relative and full paths.\n // Prefer responseURL which already resolves redirects\n // https://xhr.spec.whatwg.org/#the-responseurl-attribute\n let redirectedUrl = request.responseURL || request.getResponseHeader('Location');\n if (redirectedUrl && redirectedUrl.indexOf('/') === 0) {\n // In IE location.origin might not work\n // https://connect.microsoft.com/IE/feedback/details/1763802/location-origin-is-undefined-in-ie-11-on-windows-10-but-works-on-windows-7\n const origin = (location.origin || location.protocol + '//' + location.host);\n redirectedUrl = origin + redirectedUrl;\n }\n const resource = /** @type {string} */ (request.response || request.responseText);\n if (request.status === 304 || request.status === 0 ||\n request.status >= 200 && request.status < 300) {\n success(resource, redirectedUrl);\n } else {\n fail(resource);\n }\n };\n request.send();\n }\n }\n };\n\n /********************* importer *********************/\n\n const isIE = /Trident/.test(navigator.userAgent) ||\n /Edge\\/\\d./i.test(navigator.userAgent);\n\n const importSelector = 'link[rel=import]';\n\n // Used to disable loading of resources.\n const importDisableType = 'import-disable';\n\n const disabledLinkSelector = `link[rel=stylesheet][href][type=${importDisableType}]`;\n\n const scriptsSelector = `script:not([type]),script[type=\"application/javascript\"],` +\n `script[type=\"text/javascript\"]`;\n\n const importDependenciesSelector = `${importSelector},${disabledLinkSelector},` +\n `style:not([type]),link[rel=stylesheet][href]:not([type]),` + scriptsSelector;\n\n const importDependencyAttr = 'import-dependency';\n\n const rootImportSelector = `${importSelector}:not([${importDependencyAttr}])`;\n\n const pendingScriptsSelector = `script[${importDependencyAttr}]`;\n\n const pendingStylesSelector = `style[${importDependencyAttr}],` +\n `link[rel=stylesheet][${importDependencyAttr}]`;\n\n /**\n * Importer will:\n * - load any linked import documents (with deduping)\n * - whenever an import is loaded, prompt the parser to try to parse\n * - observe imported documents for new elements (these are handled via the\n * dynamic importer)\n */\n class Importer {\n constructor() {\n this.documents = {};\n // Used to keep track of pending loads, so that flattening and firing of\n // events can be done when all resources are ready.\n this.inflight = 0;\n this.dynamicImportsMO = new MutationObserver(m => this.handleMutations(m));\n // Observe changes on <head>.\n this.dynamicImportsMO.observe(document.head, {\n childList: true,\n subtree: true\n });\n // 1. Load imports contents\n // 2. Assign them to first import links on the document\n // 3. Wait for import styles & scripts to be done loading/running\n // 4. Fire load/error events\n this.loadImports(document);\n }\n\n /**\n * @param {!(HTMLDocument|DocumentFragment|Element)} doc\n */\n loadImports(doc) {\n const links = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(doc, importSelector));\n forEach(links, link => this.loadImport(link));\n }\n\n /**\n * @param {!HTMLLinkElement} link\n */\n loadImport(link) {\n const url = link.href;\n // This resource is already being handled by another import.\n if (this.documents[url] !== undefined) {\n // If import is already loaded, we can safely associate it to the link\n // and fire the load/error event.\n const imp = this.documents[url];\n if (imp && imp['__loaded']) {\n link['__import'] = imp;\n this.fireEventIfNeeded(link);\n }\n return;\n }\n this.inflight++;\n // Mark it as pending to notify others this url is being loaded.\n this.documents[url] = 'pending';\n Xhr.load(url, (resource, redirectedUrl) => {\n const doc = this.makeDocument(resource, redirectedUrl || url);\n this.documents[url] = doc;\n this.inflight--;\n // Load subtree.\n this.loadImports(doc);\n this.processImportsIfLoadingDone();\n }, () => {\n // If load fails, handle error.\n this.documents[url] = null;\n this.inflight--;\n this.processImportsIfLoadingDone();\n });\n }\n\n /**\n * Creates a new document containing resource and normalizes urls accordingly.\n * @param {string=} resource\n * @param {string=} url\n * @return {!DocumentFragment}\n */\n makeDocument(resource, url) {\n if (!resource) {\n return document.createDocumentFragment();\n }\n\n if (isIE) {\n // <link rel=stylesheet> should be appended to <head>. Not doing so\n // in IE/Edge breaks the cascading order. We disable the loading by\n // setting the type before setting innerHTML to avoid loading\n // resources twice.\n resource = resource.replace(STYLESHEET_REGEXP, (match, p1, p2) => {\n if (match.indexOf('type=') === -1) {\n return `${p1} type=${importDisableType} ${p2}`;\n }\n return match;\n });\n }\n\n let content;\n const template = /** @type {!HTMLTemplateElement} */\n (document.createElement('template'));\n template.innerHTML = resource;\n if (template.content) {\n content = template.content;\n // Clone scripts inside templates since they won't execute when the\n // hosting template is cloned.\n replaceScripts(content);\n } else {\n // <template> not supported, create fragment and move content into it.\n content = document.createDocumentFragment();\n while (template.firstChild) {\n content.appendChild(template.firstChild);\n }\n }\n\n // Support <base> in imported docs. Resolve url and remove its href.\n const baseEl = content.querySelector('base');\n if (baseEl) {\n url = Path.resolveUrl(baseEl.getAttribute('href'), url);\n baseEl.removeAttribute('href');\n }\n\n const n$ = /** @type {!NodeList<!(HTMLLinkElement|HTMLScriptElement|HTMLStyleElement)>} */\n (QSA(content, importDependenciesSelector));\n // For source map hints.\n let inlineScriptIndex = 0;\n forEach(n$, n => {\n // Listen for load/error events, then fix urls.\n whenElementLoaded(n);\n Path.fixUrls(n, url);\n // Mark for easier selectors.\n n.setAttribute(importDependencyAttr, '');\n // Generate source map hints for inline scripts.\n if (n.localName === 'script' && !n.src && n.textContent) {\n const num = inlineScriptIndex ? `-${inlineScriptIndex}` : '';\n const content = n.textContent + `\\n//# sourceURL=${url}${num}.js\\n`;\n // We use the src attribute so it triggers load/error events, and it's\n // easier to capture errors (e.g. parsing) like this.\n n.setAttribute('src', 'data:text/javascript;charset=utf-8,' + encodeURIComponent(content));\n n.textContent = '';\n inlineScriptIndex++;\n }\n });\n return content;\n }\n\n /**\n * Waits for loaded imports to finish loading scripts and styles, then fires\n * the load/error events.\n */\n processImportsIfLoadingDone() {\n // Wait until all resources are ready, then load import resources.\n if (this.inflight) return;\n\n // Stop observing, flatten & load resource, then restart observing <head>.\n this.dynamicImportsMO.disconnect();\n this.flatten(document);\n // We wait for styles to load, and at the same time we execute the scripts,\n // then fire the load/error events for imports to have faster whenReady\n // callback execution.\n // NOTE: This is different for native behavior where scripts would be\n // executed after the styles before them are loaded.\n // To achieve that, we could select pending styles and scripts in the\n // document and execute them sequentially in their dom order.\n let scriptsOk = false,\n stylesOk = false;\n const onLoadingDone = () => {\n if (stylesOk && scriptsOk) {\n // Catch any imports that might have been added while we\n // weren't looking, wait for them as well.\n this.loadImports(document);\n if (this.inflight) return;\n\n // Restart observing.\n this.dynamicImportsMO.observe(document.head, {\n childList: true,\n subtree: true\n });\n this.fireEvents();\n }\n }\n this.waitForStyles(() => {\n stylesOk = true;\n onLoadingDone();\n });\n this.runScripts(() => {\n scriptsOk = true;\n onLoadingDone();\n });\n }\n\n /**\n * @param {!HTMLDocument} doc\n */\n flatten(doc) {\n const n$ = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(doc, importSelector));\n forEach(n$, n => {\n const imp = this.documents[n.href];\n n['__import'] = /** @type {!Document} */ (imp);\n if (imp && imp.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n // We set the .import to be the link itself, and update its readyState.\n // Other links with the same href will point to this link.\n this.documents[n.href] = n;\n n.readyState = 'loading';\n n['__import'] = n;\n this.flatten(imp);\n n.appendChild(imp);\n }\n });\n }\n\n /**\n * Replaces all the imported scripts with a clone in order to execute them.\n * Updates the `currentScript`.\n * @param {!function()} callback\n */\n runScripts(callback) {\n const s$ = QSA(document, pendingScriptsSelector);\n const l = s$.length;\n const cloneScript = i => {\n if (i < l) {\n // The pending scripts have been generated through innerHTML and\n // browsers won't execute them for security reasons. We cannot use\n // s.cloneNode(true) either, the only way to run the script is manually\n // creating a new element and copying its attributes.\n const s = s$[i];\n const clone = /** @type {!HTMLScriptElement} */\n (document.createElement('script'));\n // Remove import-dependency attribute to avoid double cloning.\n s.removeAttribute(importDependencyAttr);\n forEach(s.attributes, attr => clone.setAttribute(attr.name, attr.value));\n // Update currentScript and replace original with clone script.\n currentScript = clone;\n s.parentNode.replaceChild(clone, s);\n whenElementLoaded(clone, () => {\n currentScript = null;\n cloneScript(i + 1);\n });\n } else {\n callback();\n }\n };\n cloneScript(0);\n }\n\n /**\n * Waits for all the imported stylesheets/styles to be loaded.\n * @param {!function()} callback\n */\n waitForStyles(callback) {\n const s$ = /** @type {!NodeList<!(HTMLLinkElement|HTMLStyleElement)>} */\n (QSA(document, pendingStylesSelector));\n let pending = s$.length;\n if (!pending) {\n callback();\n return;\n }\n // <link rel=stylesheet> should be appended to <head>. Not doing so\n // in IE/Edge breaks the cascading order\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/10472273/\n // If there is one <link rel=stylesheet> imported, we must move all imported\n // links and styles to <head>.\n const needsMove = isIE && !!document.querySelector(disabledLinkSelector);\n forEach(s$, s => {\n // Listen for load/error events, remove selector once is done loading.\n whenElementLoaded(s, () => {\n s.removeAttribute(importDependencyAttr);\n if (--pending === 0) {\n callback();\n }\n });\n // Check if was already moved to head, to handle the case where the element\n // has already been moved but it is still loading.\n if (needsMove && s.parentNode !== document.head) {\n // Replace the element we're about to move with a placeholder.\n const placeholder = document.createElement(s.localName);\n // Add reference of the moved element.\n placeholder['__appliedElement'] = s;\n // Disable this from appearing in document.styleSheets.\n placeholder.setAttribute('type', 'import-placeholder');\n // Append placeholder next to the sibling, and move original to <head>.\n s.parentNode.insertBefore(placeholder, s.nextSibling);\n let newSibling = importForElement(s);\n while (newSibling && importForElement(newSibling)) {\n newSibling = importForElement(newSibling);\n }\n if (newSibling.parentNode !== document.head) {\n newSibling = null;\n }\n document.head.insertBefore(s, newSibling);\n // Enable the loading of <link rel=stylesheet>.\n s.removeAttribute('type');\n }\n });\n }\n\n /**\n * Fires load/error events for imports in the right order .\n */\n fireEvents() {\n const n$ = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(document, importSelector));\n // Inverse order to have events firing bottom-up.\n forEach(n$, n => this.fireEventIfNeeded(n), true);\n }\n\n /**\n * Fires load/error event for the import if this wasn't done already.\n * @param {!HTMLLinkElement} link\n */\n fireEventIfNeeded(link) {\n // Don't fire twice same event.\n if (!link['__loaded']) {\n link['__loaded'] = true;\n // Update link's import readyState.\n link.import && (link.import.readyState = 'complete');\n const eventType = link.import ? 'load' : 'error';\n link.dispatchEvent(newCustomEvent(eventType, {\n bubbles: false,\n cancelable: false,\n detail: undefined\n }));\n }\n }\n\n /**\n * @param {Array<MutationRecord>} mutations\n */\n handleMutations(mutations) {\n forEach(mutations, m => forEach(m.addedNodes, elem => {\n if (elem && elem.nodeType === Node.ELEMENT_NODE) {\n // NOTE: added scripts are not updating currentScript in IE.\n if (isImportLink(elem)) {\n this.loadImport( /** @type {!HTMLLinkElement} */ (elem));\n } else {\n this.loadImports( /** @type {!Element} */ (elem));\n }\n }\n }));\n }\n }\n\n /**\n * @param {!Node} node\n * @return {boolean}\n */\n const isImportLink = node => {\n return node.nodeType === Node.ELEMENT_NODE && node.localName === 'link' &&\n ( /** @type {!HTMLLinkElement} */ (node).rel === 'import');\n };\n\n /**\n * Waits for an element to finish loading. If already done loading, it will\n * mark the element accordingly.\n * @param {!(HTMLLinkElement|HTMLScriptElement|HTMLStyleElement)} element\n * @param {function()=} callback\n */\n const whenElementLoaded = (element, callback) => {\n if (element['__loaded']) {\n callback && callback();\n } else if ((element.localName === 'script' && !element.src) ||\n (element.localName === 'style' && !element.firstChild)) {\n // Inline scripts and empty styles don't trigger load/error events,\n // consider them already loaded.\n element['__loaded'] = true;\n callback && callback();\n } else {\n const onLoadingDone = event => {\n element.removeEventListener(event.type, onLoadingDone);\n element['__loaded'] = true;\n callback && callback();\n };\n element.addEventListener('load', onLoadingDone);\n // NOTE: We listen only for load events in IE/Edge, because in IE/Edge\n // <style> with @import will fire error events for each failing @import,\n // and finally will trigger the load event when all @import are\n // finished (even if all fail).\n if (!isIE || element.localName !== 'style') {\n element.addEventListener('error', onLoadingDone);\n }\n }\n }\n\n /**\n * Calls the callback when all imports in the document at call time\n * (or at least document ready) have loaded. Callback is called synchronously\n * if imports are already done loading.\n * @param {function()=} callback\n */\n const whenReady = callback => {\n // 1. ensure the document is in a ready state (has dom), then\n // 2. watch for loading of imports and call callback when done\n whenDocumentReady(() => whenImportsReady(() => callback && callback()));\n }\n\n /**\n * Invokes the callback when document is in ready state. Callback is called\n * synchronously if document is already done loading.\n * @param {!function()} callback\n */\n const whenDocumentReady = callback => {\n const stateChanged = () => {\n // NOTE: Firefox can hit readystate interactive without document.body existing.\n // This is anti-spec, but we handle it here anyways by waiting for next change.\n if (document.readyState !== 'loading' && !!document.body) {\n document.removeEventListener('readystatechange', stateChanged);\n callback();\n }\n }\n document.addEventListener('readystatechange', stateChanged);\n stateChanged();\n }\n\n /**\n * Invokes the callback after all imports are loaded. Callback is called\n * synchronously if imports are already done loading.\n * @param {!function()} callback\n */\n const whenImportsReady = callback => {\n let imports = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(document, rootImportSelector));\n let pending = imports.length;\n if (!pending) {\n callback();\n return;\n }\n forEach(imports, imp => whenElementLoaded(imp, () => {\n if (--pending === 0) {\n callback();\n }\n }));\n }\n\n /**\n * Returns the import document containing the element.\n * @param {!Node} element\n * @return {HTMLLinkElement|Document|undefined}\n */\n const importForElement = element => {\n if (useNative) {\n // Return only if not in the main doc!\n return element.ownerDocument !== document ? element.ownerDocument : null;\n }\n let doc = element['__importDoc'];\n if (!doc && element.parentNode) {\n doc = /** @type {!Element} */ (element.parentNode);\n if (typeof doc.closest === 'function') {\n // Element.closest returns the element itself if it matches the selector,\n // so we search the closest import starting from the parent.\n doc = doc.closest(importSelector);\n } else {\n // Walk up the parent tree until we find an import.\n while (!isImportLink(doc) && (doc = doc.parentNode)) {}\n }\n element['__importDoc'] = doc;\n }\n return doc;\n }\n\n let importer = null;\n /**\n * Ensures imports contained in the element are imported.\n * Use this to handle dynamic imports attached to body.\n * @param {!(HTMLDocument|Element)} doc\n */\n const loadImports = (doc) => {\n if (importer) {\n importer.loadImports(doc);\n }\n };\n\n const newCustomEvent = (type, params) => {\n if (typeof window.CustomEvent === 'function') {\n return new CustomEvent(type, params);\n }\n const event = /** @type {!CustomEvent} */ (document.createEvent('CustomEvent'));\n event.initCustomEvent(type, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);\n return event;\n };\n\n if (useNative) {\n // Check for imports that might already be done loading by the time this\n // script is actually executed. Native imports are blocking, so the ones\n // available in the document by this time should already have failed\n // or have .import defined.\n const imps = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(document, importSelector));\n forEach(imps, imp => {\n if (!imp.import || imp.import.readyState !== 'loading') {\n imp['__loaded'] = true;\n }\n });\n // Listen for load/error events to capture dynamically added scripts.\n /**\n * @type {!function(!Event)}\n */\n const onLoadingDone = event => {\n const elem = /** @type {!Element} */ (event.target);\n if (isImportLink(elem)) {\n elem['__loaded'] = true;\n }\n };\n document.addEventListener('load', onLoadingDone, true /* useCapture */ );\n document.addEventListener('error', onLoadingDone, true /* useCapture */ );\n } else {\n // Override baseURI so that imported elements' baseURI can be used seemlessly\n // on native or polyfilled html-imports.\n // NOTE: a <link rel=import> will have `link.baseURI === link.href`, as the link\n // itself is used as the `import` document.\n /** @type {Object|undefined} */\n const native_baseURI = Object.getOwnPropertyDescriptor(Node.prototype, 'baseURI');\n // NOTE: if not configurable (e.g. safari9), set it on the Element prototype. \n const klass = !native_baseURI || native_baseURI.configurable ? Node : Element;\n Object.defineProperty(klass.prototype, 'baseURI', {\n get() {\n const ownerDoc = /** @type {HTMLLinkElement} */ (isImportLink(this) ? this : importForElement(this));\n if (ownerDoc) return ownerDoc.href;\n // Use native baseURI if possible.\n if (native_baseURI && native_baseURI.get) return native_baseURI.get.call(this);\n // Polyfill it if not available.\n const base = /** @type {HTMLBaseElement} */ (document.querySelector('base'));\n return (base || window.location).href;\n },\n configurable: true,\n enumerable: true\n });\n\n // Define 'import' read-only property.\n Object.defineProperty(HTMLLinkElement.prototype, 'import', {\n get() {\n return /** @type {HTMLLinkElement} */ (this)['__import'] || null;\n },\n configurable: true,\n enumerable: true\n });\n\n whenDocumentReady(() => {\n importer = new Importer()\n });\n }\n\n /**\n Add support for the `HTMLImportsLoaded` event and the `HTMLImports.whenReady`\n method. This api is necessary because unlike the native implementation,\n script elements do not force imports to resolve. Instead, users should wrap\n code in either an `HTMLImportsLoaded` handler or after load time in an\n `HTMLImports.whenReady(callback)` call.\n\n NOTE: This module also supports these apis under the native implementation.\n Therefore, if this file is loaded, the same code can be used under both\n the polyfill and native implementation.\n */\n whenReady(() => document.dispatchEvent(newCustomEvent('HTMLImportsLoaded', {\n cancelable: true,\n bubbles: true,\n detail: undefined\n })));\n\n // exports\n scope.useNative = useNative;\n scope.whenReady = whenReady;\n scope.importForElement = importForElement;\n scope.loadImports = loadImports;\n\n})(window.HTMLImports = (window.HTMLImports || {}));","const reservedTagList = new Set([\n 'annotation-xml',\n 'color-profile',\n 'font-face',\n 'font-face-src',\n 'font-face-uri',\n 'font-face-format',\n 'font-face-name',\n 'missing-glyph',\n]);\n\n/**\n * @param {string} localName\n * @returns {boolean}\n */\nexport function isValidCustomElementName(localName) {\n const reserved = reservedTagList.has(localName);\n const validForm = /^[a-z][.0-9_a-z]*-[\\-.0-9_a-z]*$/.test(localName);\n return !reserved && validForm;\n}\n\n/**\n * @private\n * @param {!Node} node\n * @return {boolean}\n */\nexport function isConnected(node) {\n // Use `Node#isConnected`, if defined.\n const nativeValue = node.isConnected;\n if (nativeValue !== undefined) {\n return nativeValue;\n }\n\n /** @type {?Node|undefined} */\n let current = node;\n while (current && !(current.__CE_isImportDocument || current instanceof Document)) {\n current = current.parentNode || (window.ShadowRoot && current instanceof ShadowRoot ? current.host : undefined);\n }\n return !!(current && (current.__CE_isImportDocument || current instanceof Document));\n}\n\n/**\n * @param {!Node} root\n * @param {!Node} start\n * @return {?Node}\n */\nfunction nextSiblingOrAncestorSibling(root, start) {\n let node = start;\n while (node && node !== root && !node.nextSibling) {\n node = node.parentNode;\n }\n return (!node || node === root) ? null : node.nextSibling;\n}\n\n/**\n * @param {!Node} root\n * @param {!Node} start\n * @return {?Node}\n */\nfunction nextNode(root, start) {\n return start.firstChild ? start.firstChild : nextSiblingOrAncestorSibling(root, start);\n}\n\n/**\n * @param {!Node} root\n * @param {!function(!Element)} callback\n * @param {!Set<Node>=} visitedImports\n */\nexport function walkDeepDescendantElements(root, callback, visitedImports = new Set()) {\n let node = root;\n while (node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = /** @type {!Element} */(node);\n\n callback(element);\n\n const localName = element.localName;\n if (localName === 'link' && element.getAttribute('rel') === 'import') {\n // If this import (polyfilled or not) has it's root node available,\n // walk it.\n const importNode = /** @type {!Node} */ (element.import);\n if (importNode instanceof Node && !visitedImports.has(importNode)) {\n // Prevent multiple walks of the same import root.\n visitedImports.add(importNode);\n\n for (let child = importNode.firstChild; child; child = child.nextSibling) {\n walkDeepDescendantElements(child, callback, visitedImports);\n }\n }\n\n // Ignore descendants of import links to prevent attempting to walk the\n // elements created by the HTML Imports polyfill that we just walked\n // above.\n node = nextSiblingOrAncestorSibling(root, element);\n continue;\n } else if (localName === 'template') {\n // Ignore descendants of templates. There shouldn't be any descendants\n // because they will be moved into `.content` during construction in\n // browsers that support template but, in case they exist and are still\n // waiting to be moved by a polyfill, they will be ignored.\n node = nextSiblingOrAncestorSibling(root, element);\n continue;\n }\n\n // Walk shadow roots.\n const shadowRoot = element.__CE_shadowRoot;\n if (shadowRoot) {\n for (let child = shadowRoot.firstChild; child; child = child.nextSibling) {\n walkDeepDescendantElements(child, callback, visitedImports);\n }\n }\n }\n\n node = nextNode(root, node);\n }\n}\n\n/**\n * Used to suppress Closure's \"Modifying the prototype is only allowed if the\n * constructor is in the same scope\" warning without using\n * `@suppress {newCheckTypes, duplicate}` because `newCheckTypes` is too broad.\n *\n * @param {!Object} destination\n * @param {string} name\n * @param {*} value\n */\nexport function setPropertyUnchecked(destination, name, value) {\n destination[name] = value;\n}\n","import * as Utilities from './Utilities.js';\nimport CEState from './CustomElementState.js';\n\nexport default class CustomElementInternals {\n constructor() {\n /** @type {!Map<string, !CustomElementDefinition>} */\n this._localNameToDefinition = new Map();\n\n /** @type {!Map<!Function, !CustomElementDefinition>} */\n this._constructorToDefinition = new Map();\n\n /** @type {!Array<!function(!Node)>} */\n this._patches = [];\n\n /** @type {boolean} */\n this._hasPatches = false;\n }\n\n /**\n * @param {string} localName\n * @param {!CustomElementDefinition} definition\n */\n setDefinition(localName, definition) {\n this._localNameToDefinition.set(localName, definition);\n this._constructorToDefinition.set(definition.constructor, definition);\n }\n\n /**\n * @param {string} localName\n * @return {!CustomElementDefinition|undefined}\n */\n localNameToDefinition(localName) {\n return this._localNameToDefinition.get(localName);\n }\n\n /**\n * @param {!Function} constructor\n * @return {!CustomElementDefinition|undefined}\n */\n constructorToDefinition(constructor) {\n return this._constructorToDefinition.get(constructor);\n }\n\n /**\n * @param {!function(!Node)} listener\n */\n addPatch(listener) {\n this._hasPatches = true;\n this._patches.push(listener);\n }\n\n /**\n * @param {!Node} node\n */\n patchTree(node) {\n if (!this._hasPatches) return;\n\n Utilities.walkDeepDescendantElements(node, element => this.patch(element));\n }\n\n /**\n * @param {!Node} node\n */\n patch(node) {\n if (!this._hasPatches) return;\n\n if (node.__CE_patched) return;\n node.__CE_patched = true;\n\n for (let i = 0; i < this._patches.length; i++) {\n this._patches[i](node);\n }\n }\n\n /**\n * @param {!Node} root\n */\n connectTree(root) {\n const elements = [];\n\n Utilities.walkDeepDescendantElements(root, element => elements.push(element));\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n if (element.__CE_state === CEState.custom) {\n this.connectedCallback(element);\n } else {\n this.upgradeElement(element);\n }\n }\n }\n\n /**\n * @param {!Node} root\n */\n disconnectTree(root) {\n const elements = [];\n\n Utilities.walkDeepDescendantElements(root, element => elements.push(element));\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n if (element.__CE_state === CEState.custom) {\n this.disconnectedCallback(element);\n }\n }\n }\n\n /**\n * Upgrades all uncustomized custom elements at and below a root node for\n * which there is a definition. When custom element reaction callbacks are\n * assumed to be called synchronously (which, by the current DOM / HTML spec\n * definitions, they are *not*), callbacks for both elements customized\n * synchronously by the parser and elements being upgraded occur in the same\n * relative order.\n *\n * NOTE: This function, when used to simulate the construction of a tree that\n * is already created but not customized (i.e. by the parser), does *not*\n * prevent the element from reading the 'final' (true) state of the tree. For\n * example, the element, during truly synchronous parsing / construction would\n * see that it contains no children as they have not yet been inserted.\n * However, this function does not modify the tree, the element will\n * (incorrectly) have children. Additionally, self-modification restrictions\n * for custom element constructors imposed by the DOM spec are *not* enforced.\n *\n *\n * The following nested list shows the steps extending down from the HTML\n * spec's parsing section that cause elements to be synchronously created and\n * upgraded:\n *\n * The \"in body\" insertion mode:\n * https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n * - Switch on token:\n * .. other cases ..\n * -> Any other start tag\n * - [Insert an HTML element](below) for the token.\n *\n * Insert an HTML element:\n * https://html.spec.whatwg.org/multipage/syntax.html#insert-an-html-element\n * - Insert a foreign element for the token in the HTML namespace:\n * https://html.spec.whatwg.org/multipage/syntax.html#insert-a-foreign-element\n * - Create an element for a token:\n * https://html.spec.whatwg.org/multipage/syntax.html#create-an-element-for-the-token\n * - Will execute script flag is true?\n * - (Element queue pushed to the custom element reactions stack.)\n * - Create an element:\n * https://dom.spec.whatwg.org/#concept-create-element\n * - Sync CE flag is true?\n * - Constructor called.\n * - Self-modification restrictions enforced.\n * - Sync CE flag is false?\n * - (Upgrade reaction enqueued.)\n * - Attributes appended to element.\n * (`attributeChangedCallback` reactions enqueued.)\n * - Will execute script flag is true?\n * - (Element queue popped from the custom element reactions stack.\n * Reactions in the popped stack are invoked.)\n * - (Element queue pushed to the custom element reactions stack.)\n * - Insert the element:\n * https://dom.spec.whatwg.org/#concept-node-insert\n * - Shadow-including descendants are connected. During parsing\n * construction, there are no shadow-*excluding* descendants.\n * However, the constructor may have validly attached a shadow\n * tree to itself and added descendants to that shadow tree.\n * (`connectedCallback` reactions enqueued.)\n * - (Element queue popped from the custom element reactions stack.\n * Reactions in the popped stack are invoked.)\n *\n * @param {!Node} root\n * @param {{\n * visitedImports: (!Set<!Node>|undefined),\n * upgrade: (!function(!Element)|undefined),\n * }=} options\n */\n patchAndUpgradeTree(root, options = {}) {\n const visitedImports = options.visitedImports || new Set();\n const upgrade = options.upgrade || (element => this.upgradeElement(element));\n\n const elements = [];\n\n const gatherElements = element => {\n if (element.localName === 'link' && element.getAttribute('rel') === 'import') {\n // The HTML Imports polyfill sets a descendant element of the link to\n // the `import` property, specifically this is *not* a Document.\n const importNode = /** @type {?Node} */ (element.import);\n\n if (importNode instanceof Node) {\n importNode.__CE_isImportDocument = true;\n // Connected links are associated with the registry.\n importNode.__CE_hasRegistry = true;\n }\n\n if (importNode && importNode.readyState === 'complete') {\n importNode.__CE_documentLoadHandled = true;\n } else {\n // If this link's import root is not available, its contents can't be\n // walked. Wait for 'load' and walk it when it's ready.\n element.addEventListener('load', () => {\n const importNode = /** @type {!Node} */ (element.import);\n\n if (importNode.__CE_documentLoadHandled) return;\n importNode.__CE_documentLoadHandled = true;\n\n // Clone the `visitedImports` set that was populated sync during\n // the `patchAndUpgradeTree` call that caused this 'load' handler to\n // be added. Then, remove *this* link's import node so that we can\n // walk that import again, even if it was partially walked later\n // during the same `patchAndUpgradeTree` call.\n const clonedVisitedImports = new Set(visitedImports);\n clonedVisitedImports.delete(importNode);\n\n this.patchAndUpgradeTree(importNode, {visitedImports: clonedVisitedImports, upgrade});\n });\n }\n } else {\n elements.push(element);\n }\n };\n\n // `walkDeepDescendantElements` populates (and internally checks against)\n // `visitedImports` when traversing a loaded import.\n Utilities.walkDeepDescendantElements(root, gatherElements, visitedImports);\n\n if (this._hasPatches) {\n for (let i = 0; i < elements.length; i++) {\n this.patch(elements[i]);\n }\n }\n\n for (let i = 0; i < elements.length; i++) {\n upgrade(elements[i]);\n }\n }\n\n /**\n * @param {!Element} element\n */\n upgradeElement(element) {\n const currentState = element.__CE_state;\n if (currentState !== undefined) return;\n\n // Prevent elements created in documents without a browsing context from\n // upgrading.\n //\n // https://html.spec.whatwg.org/multipage/custom-elements.html#look-up-a-custom-element-definition\n // \"If document does not have a browsing context, return null.\"\n //\n // https://html.spec.whatwg.org/multipage/window-object.html#dom-document-defaultview\n // \"The defaultView IDL attribute of the Document interface, on getting,\n // must return this Document's browsing context's WindowProxy object, if\n // this Document has an associated browsing context, or null otherwise.\"\n const ownerDocument = element.ownerDocument;\n if (\n !ownerDocument.defaultView &&\n !(ownerDocument.__CE_isImportDocument && ownerDocument.__CE_hasRegistry)\n ) return;\n\n const definition = this.localNameToDefinition(element.localName);\n if (!definition) return;\n\n definition.constructionStack.push(element);\n\n const constructor = definition.constructor;\n try {\n try {\n let result = new (constructor)();\n if (result !== element) {\n throw new Error('The custom element constructor did not produce the element being upgraded.');\n }\n } finally {\n definition.constructionStack.pop();\n }\n } catch (e) {\n element.__CE_state = CEState.failed;\n throw e;\n }\n\n element.__CE_state = CEState.custom;\n element.__CE_definition = definition;\n\n if (definition.attributeChangedCallback) {\n const observedAttributes = definition.observedAttributes;\n for (let i = 0; i < observedAttributes.length; i++) {\n const name = observedAttributes[i];\n const value = element.getAttribute(name);\n if (value !== null) {\n this.attributeChangedCallback(element, name, null, value, null);\n }\n }\n }\n\n if (Utilities.isConnected(element)) {\n this.connectedCallback(element);\n }\n }\n\n /**\n * @param {!Element} element\n */\n connectedCallback(element) {\n const definition = element.__CE_definition;\n if (definition.connectedCallback) {\n definition.connectedCallback.call(element);\n }\n }\n\n /**\n * @param {!Element} element\n */\n disconnectedCallback(element) {\n const definition = element.__CE_definition;\n if (definition.disconnectedCallback) {\n definition.disconnectedCallback.call(element);\n }\n }\n\n /**\n * @param {!Element} element\n * @param {string} name\n * @param {?string} oldValue\n * @param {?string} newValue\n * @param {?string} namespace\n */\n attributeChangedCallback(element, name, oldValue, newValue, namespace) {\n const definition = element.__CE_definition;\n if (\n definition.attributeChangedCallback &&\n definition.observedAttributes.indexOf(name) > -1\n ) {\n definition.attributeChangedCallback.call(element, name, oldValue, newValue, namespace);\n }\n }\n}\n","/**\n * @enum {number}\n */\nconst CustomElementState = {\n custom: 1,\n failed: 2,\n};\n\nexport default CustomElementState;\n","import CustomElementInternals from './CustomElementInternals.js';\n\nexport default class DocumentConstructionObserver {\n constructor(internals, doc) {\n /**\n * @type {!CustomElementInternals}\n */\n this._internals = internals;\n\n /**\n * @type {!Document}\n */\n this._document = doc;\n\n /**\n * @type {MutationObserver|undefined}\n */\n this._observer = undefined;\n\n\n // Simulate tree construction for all currently accessible nodes in the\n // document.\n this._internals.patchAndUpgradeTree(this._document);\n\n if (this._document.readyState === 'loading') {\n this._observer = new MutationObserver(this._handleMutations.bind(this));\n\n // Nodes created by the parser are given to the observer *before* the next\n // task runs. Inline scripts are run in a new task. This means that the\n // observer will be able to handle the newly parsed nodes before the inline\n // script is run.\n this._observer.observe(this._document, {\n childList: true,\n subtree: true,\n });\n }\n }\n\n disconnect() {\n if (this._observer) {\n this._observer.disconnect();\n }\n }\n\n /**\n * @param {!Array<!MutationRecord>} mutations\n */\n _handleMutations(mutations) {\n // Once the document's `readyState` is 'interactive' or 'complete', all new\n // nodes created within that document will be the result of script and\n // should be handled by patching.\n const readyState = this._document.readyState;\n if (readyState === 'interactive' || readyState === 'complete') {\n this.disconnect();\n }\n\n for (let i = 0; i < mutations.length; i++) {\n const addedNodes = mutations[i].addedNodes;\n for (let j = 0; j < addedNodes.length; j++) {\n const node = addedNodes[j];\n this._internals.patchAndUpgradeTree(node);\n }\n }\n }\n}\n","import CustomElementInternals from './CustomElementInternals.js';\nimport DocumentConstructionObserver from './DocumentConstructionObserver.js';\nimport Deferred from './Deferred.js';\nimport * as Utilities from './Utilities.js';\n\n/**\n * @unrestricted\n */\nexport default class CustomElementRegistry {\n\n /**\n * @param {!CustomElementInternals} internals\n */\n constructor(internals) {\n /**\n * @private\n * @type {boolean}\n */\n this._elementDefinitionIsRunning = false;\n\n /**\n * @private\n * @type {!CustomElementInternals}\n */\n this._internals = internals;\n\n /**\n * @private\n * @type {!Map<string, !Deferred<undefined>>}\n */\n this._whenDefinedDeferred = new Map();\n\n /**\n * The default flush callback triggers the document walk synchronously.\n * @private\n * @type {!Function}\n */\n this._flushCallback = fn => fn();\n\n /**\n * @private\n * @type {boolean}\n */\n this._flushPending = false;\n\n /**\n * @private\n * @type {!Array<!CustomElementDefinition>}\n */\n this._pendingDefinitions = [];\n\n /**\n * @private\n * @type {!DocumentConstructionObserver}\n */\n this._documentConstructionObserver = new DocumentConstructionObserver(internals, document);\n }\n\n /**\n * @param {string} localName\n * @param {!Function} constructor\n */\n define(localName, constructor) {\n if (!(constructor instanceof Function)) {\n throw new TypeError('Custom element constructors must be functions.');\n }\n\n if (!Utilities.isValidCustomElementName(localName)) {\n throw new SyntaxError(`The element name '${localName}' is not valid.`);\n }\n\n if (this._internals.localNameToDefinition(localName)) {\n throw new Error(`A custom element with name '${localName}' has already been defined.`);\n }\n\n if (this._elementDefinitionIsRunning) {\n throw new Error('A custom element is already being defined.');\n }\n this._elementDefinitionIsRunning = true;\n\n let connectedCallback;\n let disconnectedCallback;\n let adoptedCallback;\n let attributeChangedCallback;\n let observedAttributes;\n try {\n /** @type {!Object} */\n const prototype = constructor.prototype;\n if (!(prototype instanceof Object)) {\n throw new TypeError('The custom element constructor\\'s prototype is not an object.');\n }\n\n function getCallback(name) {\n const callbackValue = prototype[name];\n if (callbackValue !== undefined && !(callbackValue instanceof Function)) {\n throw new Error(`The '${name}' callback must be a function.`);\n }\n return callbackValue;\n }\n\n connectedCallback = getCallback('connectedCallback');\n disconnectedCallback = getCallback('disconnectedCallback');\n adoptedCallback = getCallback('adoptedCallback');\n attributeChangedCallback = getCallback('attributeChangedCallback');\n observedAttributes = constructor['observedAttributes'] || [];\n } catch (e) {\n return;\n } finally {\n this._elementDefinitionIsRunning = false;\n }\n\n const definition = {\n localName,\n constructor,\n connectedCallback,\n disconnectedCallback,\n adoptedCallback,\n attributeChangedCallback,\n observedAttributes,\n constructionStack: [],\n };\n\n this._internals.setDefinition(localName, definition);\n this._pendingDefinitions.push(definition);\n\n // If we've already called the flush callback and it hasn't called back yet,\n // don't call it again.\n if (!this._flushPending) {\n this._flushPending = true;\n this._flushCallback(() => this._flush());\n }\n }\n\n upgrade(element) {\n this._internals.patchAndUpgradeTree(element);\n }\n\n _flush() {\n // If no new definitions were defined, don't attempt to flush. This could\n // happen if a flush callback keeps the function it is given and calls it\n // multiple times.\n if (this._flushPending === false) return;\n this._flushPending = false;\n\n const pendingDefinitions = this._pendingDefinitions;\n\n /**\n * Unupgraded elements with definitions that were defined *before* the last\n * flush, in document order.\n * @type {!Array<!Element>}\n */\n const elementsWithStableDefinitions = [];\n\n /**\n * A map from `localName`s of definitions that were defined *after* the last\n * flush to unupgraded elements matching that definition, in document order.\n * @type {!Map<string, !Array<!Element>>}\n */\n const elementsWithPendingDefinitions = new Map();\n for (let i = 0; i < pendingDefinitions.length; i++) {\n elementsWithPendingDefinitions.set(pendingDefinitions[i].localName, []);\n }\n\n this._internals.patchAndUpgradeTree(document, {\n upgrade: element => {\n // Ignore the element if it has already upgraded or failed to upgrade.\n if (element.__CE_state !== undefined) return;\n\n const localName = element.localName;\n\n // If there is an applicable pending definition for the element, add the\n // element to the list of elements to be upgraded with that definition.\n const pendingElements = elementsWithPendingDefinitions.get(localName);\n if (pendingElements) {\n pendingElements.push(element);\n // If there is *any other* applicable definition for the element, add it\n // to the list of elements with stable definitions that need to be upgraded.\n } else if (this._internals.localNameToDefinition(localName)) {\n elementsWithStableDefinitions.push(element);\n }\n },\n });\n\n // Upgrade elements with 'stable' definitions first.\n for (let i = 0; i < elementsWithStableDefinitions.length; i++) {\n this._internals.upgradeElement(elementsWithStableDefinitions[i]);\n }\n\n // Upgrade elements with 'pending' definitions in the order they were defined.\n while (pendingDefinitions.length > 0) {\n const definition = pendingDefinitions.shift();\n const localName = definition.localName;\n\n // Attempt to upgrade all applicable elements.\n const pendingUpgradableElements = elementsWithPendingDefinitions.get(definition.localName);\n for (let i = 0; i < pendingUpgradableElements.length; i++) {\n this._internals.upgradeElement(pendingUpgradableElements[i]);\n }\n\n // Resolve any promises created by `whenDefined` for the definition.\n const deferred = this._whenDefinedDeferred.get(localName);\n if (deferred) {\n deferred.resolve(undefined);\n }\n }\n }\n\n /**\n * @param {string} localName\n * @return {Function|undefined}\n */\n get(localName) {\n const definition = this._internals.localNameToDefinition(localName);\n if (definition) {\n return definition.constructor;\n }\n\n return undefined;\n }\n\n /**\n * @param {string} localName\n * @return {!Promise<undefined>}\n */\n whenDefined(localName) {\n if (!Utilities.isValidCustomElementName(localName)) {\n return Promise.reject(new SyntaxError(`'${localName}' is not a valid custom element name.`));\n }\n\n const prior = this._whenDefinedDeferred.get(localName);\n if (prior) {\n return prior.toPromise();\n }\n\n const deferred = new Deferred();\n this._whenDefinedDeferred.set(localName, deferred);\n\n const definition = this._internals.localNameToDefinition(localName);\n // Resolve immediately only if the given local name has a definition *and*\n // the full document walk to upgrade elements with that local name has\n // already happened.\n if (definition && !this._pendingDefinitions.some(d => d.localName === localName)) {\n deferred.resolve(undefined);\n }\n\n return deferred.toPromise();\n }\n\n polyfillWrapFlushCallback(outer) {\n this._documentConstructionObserver.disconnect();\n const inner = this._flushCallback;\n this._flushCallback = flush => outer(() => inner(flush));\n }\n}\n\n// Closure compiler exports.\nwindow['CustomElementRegistry'] = CustomElementRegistry;\nCustomElementRegistry.prototype['define'] = CustomElementRegistry.prototype.define;\nCustomElementRegistry.prototype['upgrade'] = CustomElementRegistry.prototype.upgrade;\nCustomElementRegistry.prototype['get'] = CustomElementRegistry.prototype.get;\nCustomElementRegistry.prototype['whenDefined'] = CustomElementRegistry.prototype.whenDefined;\nCustomElementRegistry.prototype['polyfillWrapFlushCallback'] = CustomElementRegistry.prototype.polyfillWrapFlushCallback;\n","/**\n * @template T\n */\nexport default class Deferred {\n constructor() {\n /**\n * @private\n * @type {T|undefined}\n */\n this._value = undefined;\n\n /**\n * @private\n * @type {Function|undefined}\n */\n this._resolve = undefined;\n\n /**\n * @private\n * @type {!Promise<T>}\n */\n this._promise = new Promise(resolve => {\n this._resolve = resolve;\n\n if (this._value) {\n resolve(this._value);\n }\n });\n }\n\n /**\n * @param {T} value\n */\n resolve(value) {\n if (this._value) {\n throw new Error('Already resolved.');\n }\n\n this._value = value;\n\n if (this._resolve) {\n this._resolve(value);\n }\n }\n\n /**\n * @return {!Promise<T>}\n */\n toPromise() {\n return this._promise;\n }\n}\n","export default {\n Document_createElement: window.Document.prototype.createElement,\n Document_createElementNS: window.Document.prototype.createElementNS,\n Document_importNode: window.Document.prototype.importNode,\n Document_prepend: window.Document.prototype['prepend'],\n Document_append: window.Document.prototype['append'],\n DocumentFragment_prepend: window.DocumentFragment.prototype['prepend'],\n DocumentFragment_append: window.DocumentFragment.prototype['append'],\n Node_cloneNode: window.Node.prototype.cloneNode,\n Node_appendChild: window.Node.prototype.appendChild,\n Node_insertBefore: window.Node.prototype.insertBefore,\n Node_removeChild: window.Node.prototype.removeChild,\n Node_replaceChild: window.Node.prototype.replaceChild,\n Node_textContent: Object.getOwnPropertyDescriptor(window.Node.prototype, 'textContent'),\n Element_attachShadow: window.Element.prototype['attachShadow'],\n Element_innerHTML: Object.getOwnPropertyDescriptor(window.Element.prototype, 'innerHTML'),\n Element_getAttribute: window.Element.prototype.getAttribute,\n Element_setAttribute: window.Element.prototype.setAttribute,\n Element_removeAttribute: window.Element.prototype.removeAttribute,\n Element_getAttributeNS: window.Element.prototype.getAttributeNS,\n Element_setAttributeNS: window.Element.prototype.setAttributeNS,\n Element_removeAttributeNS: window.Element.prototype.removeAttributeNS,\n Element_insertAdjacentElement: window.Element.prototype['insertAdjacentElement'],\n Element_insertAdjacentHTML: window.Element.prototype['insertAdjacentHTML'],\n Element_prepend: window.Element.prototype['prepend'],\n Element_append: window.Element.prototype['append'],\n Element_before: window.Element.prototype['before'],\n Element_after: window.Element.prototype['after'],\n Element_replaceWith: window.Element.prototype['replaceWith'],\n Element_remove: window.Element.prototype['remove'],\n HTMLElement: window.HTMLElement,\n HTMLElement_innerHTML: Object.getOwnPropertyDescriptor(window.HTMLElement.prototype, 'innerHTML'),\n HTMLElement_insertAdjacentElement: window.HTMLElement.prototype['insertAdjacentElement'],\n HTMLElement_insertAdjacentHTML: window.HTMLElement.prototype['insertAdjacentHTML'],\n};\n","/**\n * This class exists only to work around Closure's lack of a way to describe\n * singletons. It represents the 'already constructed marker' used in custom\n * element construction stacks.\n *\n * https://html.spec.whatwg.org/#concept-already-constructed-marker\n */\nclass AlreadyConstructedMarker {}\n\nexport default new AlreadyConstructedMarker();\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport CEState from '../CustomElementState.js';\nimport AlreadyConstructedMarker from '../AlreadyConstructedMarker.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n window['HTMLElement'] = (function() {\n /**\n * @type {function(new: HTMLElement): !HTMLElement}\n */\n function HTMLElement() {\n // This should really be `new.target` but `new.target` can't be emulated\n // in ES5. Assuming the user keeps the default value of the constructor's\n // prototype's `constructor` property, this is equivalent.\n /** @type {!Function} */\n const constructor = this.constructor;\n\n const definition = internals.constructorToDefinition(constructor);\n if (!definition) {\n throw new Error('The custom element being constructed was not registered with `customElements`.');\n }\n\n const constructionStack = definition.constructionStack;\n\n if (constructionStack.length === 0) {\n const element = Native.Document_createElement.call(document, definition.localName);\n Object.setPrototypeOf(element, constructor.prototype);\n element.__CE_state = CEState.custom;\n element.__CE_definition = definition;\n internals.patch(element);\n return element;\n }\n\n const lastIndex = constructionStack.length - 1;\n const element = constructionStack[lastIndex];\n if (element === AlreadyConstructedMarker) {\n throw new Error('The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.');\n }\n constructionStack[lastIndex] = AlreadyConstructedMarker;\n\n Object.setPrototypeOf(element, constructor.prototype);\n internals.patch(/** @type {!HTMLElement} */ (element));\n\n return element;\n }\n\n HTMLElement.prototype = Native.HTMLElement.prototype;\n\n return HTMLElement;\n })();\n};\n","/**\n * @license\n * Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nimport CustomElementInternals from './CustomElementInternals.js';\nimport CustomElementRegistry from './CustomElementRegistry.js';\n\nimport PatchHTMLElement from './Patch/HTMLElement.js';\nimport PatchDocument from './Patch/Document.js';\nimport PatchDocumentFragment from './Patch/DocumentFragment.js';\nimport PatchNode from './Patch/Node.js';\nimport PatchElement from './Patch/Element.js';\n\nconst priorCustomElements = window['customElements'];\n\nif (!priorCustomElements ||\n priorCustomElements['forcePolyfill'] ||\n (typeof priorCustomElements['define'] != 'function') ||\n (typeof priorCustomElements['get'] != 'function')) {\n /** @type {!CustomElementInternals} */\n const internals = new CustomElementInternals();\n\n PatchHTMLElement(internals);\n PatchDocument(internals);\n PatchDocumentFragment(internals);\n PatchNode(internals);\n PatchElement(internals);\n\n // The main document is always associated with the registry.\n document.__CE_hasRegistry = true;\n\n /** @type {!CustomElementRegistry} */\n const customElements = new CustomElementRegistry(internals);\n\n Object.defineProperty(window, 'customElements', {\n configurable: true,\n enumerable: true,\n value: customElements,\n });\n}\n","import CustomElementInternals from '../../CustomElementInternals.js';\nimport * as Utilities from '../../Utilities.js';\n\n/**\n * @typedef {{\n * prepend: !function(...(!Node|string)),\n * append: !function(...(!Node|string)),\n * }}\n */\nlet ParentNodeNativeMethods;\n\n/**\n * @param {!CustomElementInternals} internals\n * @param {!Object} destination\n * @param {!ParentNodeNativeMethods} builtIn\n */\nexport default function(internals, destination, builtIn) {\n /**\n * @param {!function(...(!Node|string))} builtInMethod\n * @return {!function(...(!Node|string))}\n */\n function appendPrependPatch(builtInMethod) {\n return function(...nodes) {\n /**\n * A copy of `nodes`, with any DocumentFragment replaced by its children.\n * @type {!Array<!Node>}\n */\n const flattenedNodes = [];\n\n /**\n * Elements in `nodes` that were connected before this call.\n * @type {!Array<!Node>}\n */\n const connectedElements = [];\n\n for (var i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if (node instanceof Element && Utilities.isConnected(node)) {\n connectedElements.push(node);\n }\n\n if (node instanceof DocumentFragment) {\n for (let child = node.firstChild; child; child = child.nextSibling) {\n flattenedNodes.push(child);\n }\n } else {\n flattenedNodes.push(node);\n }\n }\n\n builtInMethod.apply(this, nodes);\n\n for (let i = 0; i < connectedElements.length; i++) {\n internals.disconnectTree(connectedElements[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < flattenedNodes.length; i++) {\n const node = flattenedNodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n }\n\n if (builtIn.prepend !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'prepend', appendPrependPatch(builtIn.prepend));\n }\n\n if (builtIn.append !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'append', appendPrependPatch(builtIn.append));\n }\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport * as Utilities from '../Utilities.js';\n\nimport PatchParentNode from './Interface/ParentNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n Utilities.setPropertyUnchecked(Document.prototype, 'createElement',\n /**\n * @this {Document}\n * @param {string} localName\n * @return {!Element}\n */\n function(localName) {\n // Only create custom elements if this document is associated with the registry.\n if (this.__CE_hasRegistry) {\n const definition = internals.localNameToDefinition(localName);\n if (definition) {\n return new (definition.constructor)();\n }\n }\n\n const result = /** @type {!Element} */\n (Native.Document_createElement.call(this, localName));\n internals.patch(result);\n return result;\n });\n\n Utilities.setPropertyUnchecked(Document.prototype, 'importNode',\n /**\n * @this {Document}\n * @param {!Node} node\n * @param {boolean=} deep\n * @return {!Node}\n */\n function(node, deep) {\n const clone = Native.Document_importNode.call(this, node, deep);\n // Only create custom elements if this document is associated with the registry.\n if (!this.__CE_hasRegistry) {\n internals.patchTree(clone);\n } else {\n internals.patchAndUpgradeTree(clone);\n }\n return clone;\n });\n\n const NS_HTML = \"http://www.w3.org/1999/xhtml\";\n\n Utilities.setPropertyUnchecked(Document.prototype, 'createElementNS',\n /**\n * @this {Document}\n * @param {?string} namespace\n * @param {string} localName\n * @return {!Element}\n */\n function(namespace, localName) {\n // Only create custom elements if this document is associated with the registry.\n if (this.__CE_hasRegistry && (namespace === null || namespace === NS_HTML)) {\n const definition = internals.localNameToDefinition(localName);\n if (definition) {\n return new (definition.constructor)();\n }\n }\n\n const result = /** @type {!Element} */\n (Native.Document_createElementNS.call(this, namespace, localName));\n internals.patch(result);\n return result;\n });\n\n PatchParentNode(internals, Document.prototype, {\n prepend: Native.Document_prepend,\n append: Native.Document_append,\n });\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport * as Utilities from '../Utilities.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n // `Node#nodeValue` is implemented on `Attr`.\n // `Node#textContent` is implemented on `Attr`, `Element`.\n\n Utilities.setPropertyUnchecked(Node.prototype, 'insertBefore',\n /**\n * @this {Node}\n * @param {!Node} node\n * @param {?Node} refNode\n * @return {!Node}\n */\n function(node, refNode) {\n if (node instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(node.childNodes);\n const nativeResult = Native.Node_insertBefore.call(this, node, refNode);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_insertBefore.call(this, node, refNode);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n if (Utilities.isConnected(this)) {\n internals.connectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'appendChild',\n /**\n * @this {Node}\n * @param {!Node} node\n * @return {!Node}\n */\n function(node) {\n if (node instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(node.childNodes);\n const nativeResult = Native.Node_appendChild.call(this, node);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_appendChild.call(this, node);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n if (Utilities.isConnected(this)) {\n internals.connectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'cloneNode',\n /**\n * @this {Node}\n * @param {boolean=} deep\n * @return {!Node}\n */\n function(deep) {\n const clone = Native.Node_cloneNode.call(this, deep);\n // Only create custom elements if this element's owner document is\n // associated with the registry.\n if (!this.ownerDocument.__CE_hasRegistry) {\n internals.patchTree(clone);\n } else {\n internals.patchAndUpgradeTree(clone);\n }\n return clone;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'removeChild',\n /**\n * @this {Node}\n * @param {!Node} node\n * @return {!Node}\n */\n function(node) {\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_removeChild.call(this, node);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'replaceChild',\n /**\n * @this {Node}\n * @param {!Node} nodeToInsert\n * @param {!Node} nodeToRemove\n * @return {!Node}\n */\n function(nodeToInsert, nodeToRemove) {\n if (nodeToInsert instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(nodeToInsert.childNodes);\n const nativeResult = Native.Node_replaceChild.call(this, nodeToInsert, nodeToRemove);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n internals.disconnectTree(nodeToRemove);\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeToInsertWasConnected = Utilities.isConnected(nodeToInsert);\n const nativeResult = Native.Node_replaceChild.call(this, nodeToInsert, nodeToRemove);\n const thisIsConnected = Utilities.isConnected(this);\n\n if (thisIsConnected) {\n internals.disconnectTree(nodeToRemove);\n }\n\n if (nodeToInsertWasConnected) {\n internals.disconnectTree(nodeToInsert);\n }\n\n if (thisIsConnected) {\n internals.connectTree(nodeToInsert);\n }\n\n return nativeResult;\n });\n\n\n function patch_textContent(destination, baseDescriptor) {\n Object.defineProperty(destination, 'textContent', {\n enumerable: baseDescriptor.enumerable,\n configurable: true,\n get: baseDescriptor.get,\n set: /** @this {Node} */ function(assignedValue) {\n // If this is a text node then there are no nodes to disconnect.\n if (this.nodeType === Node.TEXT_NODE) {\n baseDescriptor.set.call(this, assignedValue);\n return;\n }\n\n let removedNodes = undefined;\n // Checking for `firstChild` is faster than reading `childNodes.length`\n // to compare with 0.\n if (this.firstChild) {\n // Using `childNodes` is faster than `children`, even though we only\n // care about elements.\n const childNodes = this.childNodes;\n const childNodesLength = childNodes.length;\n if (childNodesLength > 0 && Utilities.isConnected(this)) {\n // Copying an array by iterating is faster than using slice.\n removedNodes = new Array(childNodesLength);\n for (let i = 0; i < childNodesLength; i++) {\n removedNodes[i] = childNodes[i];\n }\n }\n }\n\n baseDescriptor.set.call(this, assignedValue);\n\n if (removedNodes) {\n for (let i = 0; i < removedNodes.length; i++) {\n internals.disconnectTree(removedNodes[i]);\n }\n }\n },\n });\n }\n\n if (Native.Node_textContent && Native.Node_textContent.get) {\n patch_textContent(Node.prototype, Native.Node_textContent);\n } else {\n internals.addPatch(function(element) {\n patch_textContent(element, {\n enumerable: true,\n configurable: true,\n // NOTE: This implementation of the `textContent` getter assumes that\n // text nodes' `textContent` getter will not be patched.\n get: /** @this {Node} */ function() {\n /** @type {!Array<string>} */\n const parts = [];\n\n for (let i = 0; i < this.childNodes.length; i++) {\n parts.push(this.childNodes[i].textContent);\n }\n\n return parts.join('');\n },\n set: /** @this {Node} */ function(assignedValue) {\n while (this.firstChild) {\n Native.Node_removeChild.call(this, this.firstChild);\n }\n Native.Node_appendChild.call(this, document.createTextNode(assignedValue));\n },\n });\n });\n }\n};\n","import CustomElementInternals from '../../CustomElementInternals.js';\nimport * as Utilities from '../../Utilities.js';\n\n/**\n * @typedef {{\n * before: !function(...(!Node|string)),\n * after: !function(...(!Node|string)),\n * replaceWith: !function(...(!Node|string)),\n * remove: !function(),\n * }}\n */\nlet ChildNodeNativeMethods;\n\n/**\n * @param {!CustomElementInternals} internals\n * @param {!Object} destination\n * @param {!ChildNodeNativeMethods} builtIn\n */\nexport default function(internals, destination, builtIn) {\n /**\n * @param {!function(...(!Node|string))} builtInMethod\n * @return {!function(...(!Node|string))}\n */\n function beforeAfterPatch(builtInMethod) {\n return function(...nodes) {\n /**\n * A copy of `nodes`, with any DocumentFragment replaced by its children.\n * @type {!Array<!Node>}\n */\n const flattenedNodes = [];\n\n /**\n * Elements in `nodes` that were connected before this call.\n * @type {!Array<!Node>}\n */\n const connectedElements = [];\n\n for (var i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if (node instanceof Element && Utilities.isConnected(node)) {\n connectedElements.push(node);\n }\n\n if (node instanceof DocumentFragment) {\n for (let child = node.firstChild; child; child = child.nextSibling) {\n flattenedNodes.push(child);\n }\n } else {\n flattenedNodes.push(node);\n }\n }\n\n builtInMethod.apply(this, nodes);\n\n for (let i = 0; i < connectedElements.length; i++) {\n internals.disconnectTree(connectedElements[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < flattenedNodes.length; i++) {\n const node = flattenedNodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n }\n\n if (builtIn.before !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'before', beforeAfterPatch(builtIn.before));\n }\n\n if (builtIn.before !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'after', beforeAfterPatch(builtIn.after));\n }\n\n if (builtIn.replaceWith !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'replaceWith',\n /**\n * @param {...(!Node|string)} nodes\n */\n function(...nodes) {\n /**\n * A copy of `nodes`, with any DocumentFragment replaced by its children.\n * @type {!Array<!Node>}\n */\n const flattenedNodes = [];\n\n /**\n * Elements in `nodes` that were connected before this call.\n * @type {!Array<!Node>}\n */\n const connectedElements = [];\n\n for (var i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if (node instanceof Element && Utilities.isConnected(node)) {\n connectedElements.push(node);\n }\n\n if (node instanceof DocumentFragment) {\n for (let child = node.firstChild; child; child = child.nextSibling) {\n flattenedNodes.push(child);\n }\n } else {\n flattenedNodes.push(node);\n }\n }\n\n const wasConnected = Utilities.isConnected(this);\n\n builtIn.replaceWith.apply(this, nodes);\n\n for (let i = 0; i < connectedElements.length; i++) {\n internals.disconnectTree(connectedElements[i]);\n }\n\n if (wasConnected) {\n internals.disconnectTree(this);\n for (let i = 0; i < flattenedNodes.length; i++) {\n const node = flattenedNodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n });\n }\n\n if (builtIn.remove !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'remove',\n function() {\n const wasConnected = Utilities.isConnected(this);\n\n builtIn.remove.call(this);\n\n if (wasConnected) {\n internals.disconnectTree(this);\n }\n });\n }\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport CEState from '../CustomElementState.js';\nimport * as Utilities from '../Utilities.js';\n\nimport PatchParentNode from './Interface/ParentNode.js';\nimport PatchChildNode from './Interface/ChildNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n if (Native.Element_attachShadow) {\n Utilities.setPropertyUnchecked(Element.prototype, 'attachShadow',\n /**\n * @this {Element}\n * @param {!{mode: string}} init\n * @return {ShadowRoot}\n */\n function(init) {\n const shadowRoot = Native.Element_attachShadow.call(this, init);\n this.__CE_shadowRoot = shadowRoot;\n return shadowRoot;\n });\n }\n\n\n function patch_innerHTML(destination, baseDescriptor) {\n Object.defineProperty(destination, 'innerHTML', {\n enumerable: baseDescriptor.enumerable,\n configurable: true,\n get: baseDescriptor.get,\n set: /** @this {Element} */ function(htmlString) {\n const isConnected = Utilities.isConnected(this);\n\n // NOTE: In IE11, when using the native `innerHTML` setter, all nodes\n // that were previously descendants of the context element have all of\n // their children removed as part of the set - the entire subtree is\n // 'disassembled'. This work around walks the subtree *before* using the\n // native setter.\n /** @type {!Array<!Element>|undefined} */\n let removedElements = undefined;\n if (isConnected) {\n removedElements = [];\n Utilities.walkDeepDescendantElements(this, element => {\n if (element !== this) {\n removedElements.push(element);\n }\n });\n }\n\n baseDescriptor.set.call(this, htmlString);\n\n if (removedElements) {\n for (let i = 0; i < removedElements.length; i++) {\n const element = removedElements[i];\n if (element.__CE_state === CEState.custom) {\n internals.disconnectedCallback(element);\n }\n }\n }\n\n // Only create custom elements if this element's owner document is\n // associated with the registry.\n if (!this.ownerDocument.__CE_hasRegistry) {\n internals.patchTree(this);\n } else {\n internals.patchAndUpgradeTree(this);\n }\n return htmlString;\n },\n });\n }\n\n if (Native.Element_innerHTML && Native.Element_innerHTML.get) {\n patch_innerHTML(Element.prototype, Native.Element_innerHTML);\n } else if (Native.HTMLElement_innerHTML && Native.HTMLElement_innerHTML.get) {\n patch_innerHTML(HTMLElement.prototype, Native.HTMLElement_innerHTML);\n } else {\n\n internals.addPatch(function(element) {\n patch_innerHTML(element, {\n enumerable: true,\n configurable: true,\n // Implements getting `innerHTML` by performing an unpatched `cloneNode`\n // of the element and returning the resulting element's `innerHTML`.\n // TODO: Is this too expensive?\n get: /** @this {Element} */ function() {\n return Native.Node_cloneNode.call(this, true).innerHTML;\n },\n // Implements setting `innerHTML` by creating an unpatched element,\n // setting `innerHTML` of that element and replacing the target\n // element's children with those of the unpatched element.\n set: /** @this {Element} */ function(assignedValue) {\n // NOTE: re-route to `content` for `template` elements.\n // We need to do this because `template.appendChild` does not\n // route into `template.content`.\n const isTemplate = (this.localName === 'template');\n /** @type {!Node} */\n const content = isTemplate ? (/** @type {!HTMLTemplateElement} */\n (this)).content : this;\n /** @type {!Node} */\n const rawElement = Native.Document_createElement.call(document,\n this.localName);\n rawElement.innerHTML = assignedValue;\n\n while (content.childNodes.length > 0) {\n Native.Node_removeChild.call(content, content.childNodes[0]);\n }\n const container = isTemplate ? rawElement.content : rawElement;\n while (container.childNodes.length > 0) {\n Native.Node_appendChild.call(content, container.childNodes[0]);\n }\n },\n });\n });\n }\n\n\n Utilities.setPropertyUnchecked(Element.prototype, 'setAttribute',\n /**\n * @this {Element}\n * @param {string} name\n * @param {string} newValue\n */\n function(name, newValue) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_setAttribute.call(this, name, newValue);\n }\n\n const oldValue = Native.Element_getAttribute.call(this, name);\n Native.Element_setAttribute.call(this, name, newValue);\n newValue = Native.Element_getAttribute.call(this, name);\n internals.attributeChangedCallback(this, name, oldValue, newValue, null);\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'setAttributeNS',\n /**\n * @this {Element}\n * @param {?string} namespace\n * @param {string} name\n * @param {string} newValue\n */\n function(namespace, name, newValue) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_setAttributeNS.call(this, namespace, name, newValue);\n }\n\n const oldValue = Native.Element_getAttributeNS.call(this, namespace, name);\n Native.Element_setAttributeNS.call(this, namespace, name, newValue);\n newValue = Native.Element_getAttributeNS.call(this, namespace, name);\n internals.attributeChangedCallback(this, name, oldValue, newValue, namespace);\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'removeAttribute',\n /**\n * @this {Element}\n * @param {string} name\n */\n function(name) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_removeAttribute.call(this, name);\n }\n\n const oldValue = Native.Element_getAttribute.call(this, name);\n Native.Element_removeAttribute.call(this, name);\n if (oldValue !== null) {\n internals.attributeChangedCallback(this, name, oldValue, null, null);\n }\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'removeAttributeNS',\n /**\n * @this {Element}\n * @param {?string} namespace\n * @param {string} name\n */\n function(namespace, name) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_removeAttributeNS.call(this, namespace, name);\n }\n\n const oldValue = Native.Element_getAttributeNS.call(this, namespace, name);\n Native.Element_removeAttributeNS.call(this, namespace, name);\n // In older browsers, `Element#getAttributeNS` may return the empty string\n // instead of null if the attribute does not exist. For details, see;\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttributeNS#Notes\n const newValue = Native.Element_getAttributeNS.call(this, namespace, name);\n if (oldValue !== newValue) {\n internals.attributeChangedCallback(this, name, oldValue, newValue, namespace);\n }\n });\n\n\n function patch_insertAdjacentElement(destination, baseMethod) {\n Utilities.setPropertyUnchecked(destination, 'insertAdjacentElement',\n /**\n * @this {Element}\n * @param {string} position\n * @param {!Element} element\n * @return {?Element}\n */\n function(position, element) {\n const wasConnected = Utilities.isConnected(element);\n const insertedElement = /** @type {!Element} */\n (baseMethod.call(this, position, element));\n\n if (wasConnected) {\n internals.disconnectTree(element);\n }\n\n if (Utilities.isConnected(insertedElement)) {\n internals.connectTree(element);\n }\n return insertedElement;\n });\n }\n\n if (Native.HTMLElement_insertAdjacentElement) {\n patch_insertAdjacentElement(HTMLElement.prototype, Native.HTMLElement_insertAdjacentElement);\n } else if (Native.Element_insertAdjacentElement) {\n patch_insertAdjacentElement(Element.prototype, Native.Element_insertAdjacentElement);\n } else {\n console.warn('Custom Elements: `Element#insertAdjacentElement` was not patched.');\n }\n\n\n function patch_insertAdjacentHTML(destination, baseMethod) {\n /**\n * Patches and upgrades all nodes which are siblings between `start`\n * (inclusive) and `end` (exclusive). If `end` is `null`, then all siblings\n * following `start` will be patched and upgraded.\n * @param {!Node} start\n * @param {?Node} end\n */\n function upgradeNodesInRange(start, end) {\n const nodes = [];\n for (let node = start; node !== end; node = node.nextSibling) {\n nodes.push(node);\n }\n for (let i = 0; i < nodes.length; i++) {\n internals.patchAndUpgradeTree(nodes[i]);\n }\n }\n\n Utilities.setPropertyUnchecked(destination, 'insertAdjacentHTML',\n /**\n * @this {Element}\n * @param {string} position\n * @param {string} text\n */\n function(position, text) {\n position = position.toLowerCase();\n\n if (position === \"beforebegin\") {\n const marker = this.previousSibling;\n baseMethod.call(this, position, text);\n upgradeNodesInRange(\n /** @type {!Node} */ (marker || this.parentNode.firstChild), this);\n } else if (position === \"afterbegin\") {\n const marker = this.firstChild;\n baseMethod.call(this, position, text);\n upgradeNodesInRange(/** @type {!Node} */ (this.firstChild), marker);\n } else if (position === \"beforeend\") {\n const marker = this.lastChild;\n baseMethod.call(this, position, text);\n upgradeNodesInRange(marker || this.firstChild, null);\n } else if (position === \"afterend\") {\n const marker = this.nextSibling;\n baseMethod.call(this, position, text);\n upgradeNodesInRange(/** @type {!Node} */ (this.nextSibling), marker);\n } else {\n throw new SyntaxError(`The value provided (${String(position)}) is ` +\n \"not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'.\");\n }\n });\n }\n\n if (Native.HTMLElement_insertAdjacentHTML) {\n patch_insertAdjacentHTML(HTMLElement.prototype, Native.HTMLElement_insertAdjacentHTML);\n } else if (Native.Element_insertAdjacentHTML) {\n patch_insertAdjacentHTML(Element.prototype, Native.Element_insertAdjacentHTML);\n } else {\n console.warn('Custom Elements: `Element#insertAdjacentHTML` was not patched.');\n }\n\n\n PatchParentNode(internals, Element.prototype, {\n prepend: Native.Element_prepend,\n append: Native.Element_append,\n });\n\n PatchChildNode(internals, Element.prototype, {\n before: Native.Element_before,\n after: Native.Element_after,\n replaceWith: Native.Element_replaceWith,\n remove: Native.Element_remove,\n });\n};\n","import CustomElementInternals from '../CustomElementInternals.js';\nimport Native from './Native.js';\nimport PatchParentNode from './Interface/ParentNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n PatchParentNode(internals, DocumentFragment.prototype, {\n prepend: Native.DocumentFragment_prepend,\n append: Native.DocumentFragment_append,\n });\n};\n","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n'use strict';\n\nlet customElements = window['customElements'];\nlet HTMLImports = window['HTMLImports'];\nlet Template = window['HTMLTemplateElement'];\n\n// global for (1) existence means `WebComponentsReady` will file,\n// (2) WebComponents.ready == true means event has fired.\nwindow.WebComponents = window.WebComponents || {};\n\nif (customElements && customElements['polyfillWrapFlushCallback']) {\n // Here we ensure that the public `HTMLImports.whenReady`\n // always comes *after* custom elements have upgraded.\n let flushCallback;\n let runAndClearCallback = function runAndClearCallback() {\n if (flushCallback) {\n // make sure to run the HTMLTemplateElement polyfill before custom elements upgrade\n if (Template.bootstrap) {\n Template.bootstrap(window.document);\n }\n let cb = flushCallback;\n flushCallback = null;\n cb();\n return true;\n }\n }\n let origWhenReady = HTMLImports['whenReady'];\n customElements['polyfillWrapFlushCallback'](function(cb) {\n flushCallback = cb;\n origWhenReady(runAndClearCallback);\n });\n\n HTMLImports['whenReady'] = function(cb) {\n origWhenReady(function() {\n // custom element code may add dynamic imports\n // to match processing of native custom elements before\n // domContentLoaded, we wait for these imports to resolve first.\n if (runAndClearCallback()) {\n HTMLImports['whenReady'](cb);\n } else {\n cb();\n }\n });\n }\n\n}\n\nHTMLImports['whenReady'](function() {\n requestAnimationFrame(function() {\n window.WebComponents.ready = true;\n document.dispatchEvent(new CustomEvent('WebComponentsReady', {bubbles: true}));\n });\n});","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n'use strict';\n// It's desireable to provide a default stylesheet\n// that's convenient for styling unresolved elements, but\n// it's cumbersome to have to include this manually in every page.\n// It would make sense to put inside some HTMLImport but\n// the HTMLImports polyfill does not allow loading of stylesheets\n// that block rendering. Therefore this injection is tolerated here.\n//\n// NOTE: position: relative fixes IE's failure to inherit opacity\n// when a child is not statically positioned.\nlet style = document.createElement('style');\nstyle.textContent = ''\n + 'body {'\n + 'transition: opacity ease-in 0.2s;'\n + ' } \\n'\n + 'body[unresolved] {'\n + 'opacity: 0; display: block; overflow: hidden; position: relative;'\n + ' } \\n'\n ;\nlet head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);"]} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-sd-ce.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-sd-ce.js
new file mode 100644
index 00000000000..8a1a917a94f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-sd-ce.js
@@ -0,0 +1,198 @@
+/**
+@license @nocompile
+Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+(function(){/*
+
+ Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ Code distributed by Google as part of the polymer project is also
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+'use strict';var n,q="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this,ba="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)};function ca(){ca=function(){};q.Symbol||(q.Symbol=da)}var da=function(){var a=0;return function(b){return"jscomp_symbol_"+(b||"")+a++}}();
+function ea(){ca();var a=q.Symbol.iterator;a||(a=q.Symbol.iterator=q.Symbol("iterator"));"function"!=typeof Array.prototype[a]&&ba(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return fa(this)}});ea=function(){}}function fa(a){var b=0;return ha(function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}})}function ha(a){ea();a={next:a};a[q.Symbol.iterator]=function(){return this};return a}function ia(a){ea();var b=a[Symbol.iterator];return b?b.call(a):fa(a)}
+function ka(a){for(var b,c=[];!(b=a.next()).done;)c.push(b.value);return c}
+(function(a){function b(a,b){if("function"===typeof window.CustomEvent)return new CustomEvent(a,b);var c=document.createEvent("CustomEvent");c.initCustomEvent(a,!!b.bubbles,!!b.cancelable,b.detail);return c}function c(a){if(E)return a.ownerDocument!==document?a.ownerDocument:null;var b=a.__importDoc;if(!b&&a.parentNode){b=a.parentNode;if("function"===typeof b.closest)b=b.closest("link[rel=import]");else for(;!g(b)&&(b=b.parentNode););a.__importDoc=b}return b}function d(a){var b=m(document,"link[rel=import]:not([import-dependency])"),
+c=b.length;c?p(b,function(b){return h(b,function(){0===--c&&a()})}):a()}function e(a){function b(){"loading"!==document.readyState&&document.body&&(document.removeEventListener("readystatechange",b),a())}document.addEventListener("readystatechange",b);b()}function f(a){e(function(){return d(function(){return a&&a()})})}function h(a,b){if(a.__loaded)b&&b();else if("script"===a.localName&&!a.src||"style"===a.localName&&!a.firstChild)a.__loaded=!0,b&&b();else{var c=function(d){a.removeEventListener(d.type,
+c);a.__loaded=!0;b&&b()};a.addEventListener("load",c);Pa&&"style"===a.localName||a.addEventListener("error",c)}}function g(a){return a.nodeType===Node.ELEMENT_NODE&&"link"===a.localName&&"import"===a.rel}function k(){var a=this;this.a={};this.b=0;this.c=new MutationObserver(function(b){return a.Ka(b)});this.c.observe(document.head,{childList:!0,subtree:!0});this.loadImports(document)}function l(a){p(m(a,"template"),function(a){p(m(a.content,'script:not([type]),script[type="application/javascript"],script[type="text/javascript"]'),
+function(a){var b=document.createElement("script");p(a.attributes,function(a){return b.setAttribute(a.name,a.value)});b.textContent=a.textContent;a.parentNode.replaceChild(b,a)});l(a.content)})}function m(a,b){return a.childNodes.length?a.querySelectorAll(b):aa}function p(a,b,c){var d=a?a.length:0,e=c?-1:1;for(c=c?d-1:0;c<d&&0<=c;c+=e)b(a[c],c)}var z=document.createElement("link"),E="import"in z,aa=z.querySelectorAll("*"),Qa=null;!1==="currentScript"in document&&Object.defineProperty(document,"currentScript",
+{get:function(){return Qa||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null)},configurable:!0});var ke=/(url\()([^)]*)(\))/g,le=/(@import[\s]+(?!url\())([^;]*)(;)/g,me=/(<link[^>]*)(rel=['|"]?stylesheet['|"]?[^>]*>)/g,H={Ea:function(a,b){a.href&&a.setAttribute("href",H.U(a.getAttribute("href"),b));a.src&&a.setAttribute("src",H.U(a.getAttribute("src"),b));if("style"===a.localName){var c=H.oa(a.textContent,b,ke);a.textContent=H.oa(c,b,le)}},oa:function(a,b,c){return a.replace(c,
+function(a,c,d,e){a=d.replace(/["']/g,"");b&&(a=H.U(a,b));return c+"'"+a+"'"+e})},U:function(a,b){if(void 0===H.$){H.$=!1;try{var c=new URL("b","http://a");c.pathname="c%20d";H.$="http://a/c%20d"===c.href}catch(gg){}}if(H.$)return(new URL(a,b)).href;c=H.va;c||(c=document.implementation.createHTMLDocument("temp"),H.va=c,c.ha=c.createElement("base"),c.head.appendChild(c.ha),c.ga=c.createElement("a"));c.ha.href=b;c.ga.href=a;return c.ga.href||a}},Xb={async:!0,load:function(a,b,c){if(a)if(a.match(/^data:/)){a=
+a.split(",");var d=a[1];d=-1<a[0].indexOf(";base64")?atob(d):decodeURIComponent(d);b(d)}else{var e=new XMLHttpRequest;e.open("GET",a,Xb.async);e.onload=function(){var a=e.responseURL||e.getResponseHeader("Location");a&&0===a.indexOf("/")&&(a=(location.origin||location.protocol+"//"+location.host)+a);var d=e.response||e.responseText;304===e.status||0===e.status||200<=e.status&&300>e.status?b(d,a):c(d)};e.send()}else c("error: href must be specified")}},Pa=/Trident/.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent);
+k.prototype.loadImports=function(a){var b=this;a=m(a,"link[rel=import]");p(a,function(a){return b.m(a)})};k.prototype.m=function(a){var b=this,c=a.href;if(void 0!==this.a[c]){var d=this.a[c];d&&d.__loaded&&(a.__import=d,this.g(a))}else this.b++,this.a[c]="pending",Xb.load(c,function(a,d){a=b.La(a,d||c);b.a[c]=a;b.b--;b.loadImports(a);b.H()},function(){b.a[c]=null;b.b--;b.H()})};k.prototype.La=function(a,b){if(!a)return document.createDocumentFragment();Pa&&(a=a.replace(me,function(a,b,c){return-1===
+a.indexOf("type=")?b+" type=import-disable "+c:a}));var c=document.createElement("template");c.innerHTML=a;if(c.content)a=c.content,l(a);else for(a=document.createDocumentFragment();c.firstChild;)a.appendChild(c.firstChild);if(c=a.querySelector("base"))b=H.U(c.getAttribute("href"),b),c.removeAttribute("href");c=m(a,'link[rel=import],link[rel=stylesheet][href][type=import-disable],style:not([type]),link[rel=stylesheet][href]:not([type]),script:not([type]),script[type="application/javascript"],script[type="text/javascript"]');
+var d=0;p(c,function(a){h(a);H.Ea(a,b);a.setAttribute("import-dependency","");"script"===a.localName&&!a.src&&a.textContent&&(a.setAttribute("src","data:text/javascript;charset=utf-8,"+encodeURIComponent(a.textContent+("\n//# sourceURL="+b+(d?"-"+d:"")+".js\n"))),a.textContent="",d++)});return a};k.prototype.H=function(){var a=this;if(!this.b){this.c.disconnect();this.flatten(document);var b=!1,c=!1,d=function(){c&&b&&(a.loadImports(document),a.b||(a.c.observe(document.head,{childList:!0,subtree:!0}),
+a.Ia()))};this.Na(function(){c=!0;d()});this.Ma(function(){b=!0;d()})}};k.prototype.flatten=function(a){var b=this;a=m(a,"link[rel=import]");p(a,function(a){var c=b.a[a.href];(a.__import=c)&&c.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&(b.a[a.href]=a,a.readyState="loading",a.__import=a,b.flatten(c),a.appendChild(c))})};k.prototype.Ma=function(a){function b(e){if(e<d){var f=c[e],g=document.createElement("script");f.removeAttribute("import-dependency");p(f.attributes,function(a){return g.setAttribute(a.name,
+a.value)});Qa=g;f.parentNode.replaceChild(g,f);h(g,function(){Qa=null;b(e+1)})}else a()}var c=m(document,"script[import-dependency]"),d=c.length;b(0)};k.prototype.Na=function(a){var b=m(document,"style[import-dependency],link[rel=stylesheet][import-dependency]"),d=b.length;if(d){var e=Pa&&!!document.querySelector("link[rel=stylesheet][href][type=import-disable]");p(b,function(b){h(b,function(){b.removeAttribute("import-dependency");0===--d&&a()});if(e&&b.parentNode!==document.head){var f=document.createElement(b.localName);
+f.__appliedElement=b;f.setAttribute("type","import-placeholder");b.parentNode.insertBefore(f,b.nextSibling);for(f=c(b);f&&c(f);)f=c(f);f.parentNode!==document.head&&(f=null);document.head.insertBefore(b,f);b.removeAttribute("type")}})}else a()};k.prototype.Ia=function(){var a=this,b=m(document,"link[rel=import]");p(b,function(b){return a.g(b)},!0)};k.prototype.g=function(a){a.__loaded||(a.__loaded=!0,a.import&&(a.import.readyState="complete"),a.dispatchEvent(b(a.import?"load":"error",{bubbles:!1,
+cancelable:!1,detail:void 0})))};k.prototype.Ka=function(a){var b=this;p(a,function(a){return p(a.addedNodes,function(a){a&&a.nodeType===Node.ELEMENT_NODE&&(g(a)?b.m(a):b.loadImports(a))})})};var Ra=null;if(E)z=m(document,"link[rel=import]"),p(z,function(a){a.import&&"loading"===a.import.readyState||(a.__loaded=!0)}),z=function(a){a=a.target;g(a)&&(a.__loaded=!0)},document.addEventListener("load",z,!0),document.addEventListener("error",z,!0);else{var ja=Object.getOwnPropertyDescriptor(Node.prototype,
+"baseURI");Object.defineProperty((!ja||ja.configurable?Node:Element).prototype,"baseURI",{get:function(){var a=g(this)?this:c(this);return a?a.href:ja&&ja.get?ja.get.call(this):(document.querySelector("base")||window.location).href},configurable:!0,enumerable:!0});Object.defineProperty(HTMLLinkElement.prototype,"import",{get:function(){return this.__import||null},configurable:!0,enumerable:!0});e(function(){Ra=new k})}f(function(){return document.dispatchEvent(b("HTMLImportsLoaded",{cancelable:!0,
+bubbles:!0,detail:void 0}))});a.useNative=E;a.whenReady=f;a.importForElement=c;a.loadImports=function(a){Ra&&Ra.loadImports(a)}})(window.HTMLImports=window.HTMLImports||{});/*
+
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+function la(){this.na=this.root=null;this.R=!1;this.A=this.M=this.da=this.assignedSlot=this.assignedNodes=this.F=null;this.childNodes=this.nextSibling=this.previousSibling=this.lastChild=this.firstChild=this.parentNode=this.I=void 0;this.ta=this.ia=!1}la.prototype.toJSON=function(){return{}};function r(a){a.Y||(a.Y=new la);return a.Y}function t(a){return a&&a.Y};var u=window.ShadyDOM||{};u.Ga=!(!Element.prototype.attachShadow||!Node.prototype.getRootNode);var ma=Object.getOwnPropertyDescriptor(Node.prototype,"firstChild");u.u=!!(ma&&ma.configurable&&ma.get);u.la=u.force||!u.Ga;var na=navigator.userAgent.match("Trident"),oa=navigator.userAgent.match("Edge");void 0===u.qa&&(u.qa=u.u&&(na||oa));function v(a){return(a=t(a))&&void 0!==a.firstChild}function w(a){return"ShadyRoot"===a.ya}function pa(a){a=a.getRootNode();if(w(a))return a}
+var qa=Element.prototype,ra=qa.matches||qa.matchesSelector||qa.mozMatchesSelector||qa.msMatchesSelector||qa.oMatchesSelector||qa.webkitMatchesSelector;function sa(a,b){if(a&&b)for(var c=Object.getOwnPropertyNames(b),d=0,e;d<c.length&&(e=c[d]);d++){var f=Object.getOwnPropertyDescriptor(b,e);f&&Object.defineProperty(a,e,f)}}function ta(a,b){for(var c=[],d=1;d<arguments.length;++d)c[d-1]=arguments[d];for(d=0;d<c.length;d++)sa(a,c[d]);return a}function ua(a,b){for(var c in b)a[c]=b[c]}
+var va=document.createTextNode(""),wa=0,xa=[];(new MutationObserver(function(){for(;xa.length;)try{xa.shift()()}catch(a){throw va.textContent=wa++,a;}})).observe(va,{characterData:!0});function ya(a){xa.push(a);va.textContent=wa++}var za=!!document.contains;function Aa(a,b){for(;b;){if(b==a)return!0;b=b.parentNode}return!1};var Ba=[],Ca;function Da(a){Ca||(Ca=!0,ya(Ea));Ba.push(a)}function Ea(){Ca=!1;for(var a=!!Ba.length;Ba.length;)Ba.shift()();return a}Ea.list=Ba;function Fa(){this.a=!1;this.addedNodes=[];this.removedNodes=[];this.P=new Set}function Ga(a){a.a||(a.a=!0,ya(function(){Ha(a)}))}function Ha(a){if(a.a){a.a=!1;var b=a.takeRecords();b.length&&a.P.forEach(function(a){a(b)})}}Fa.prototype.takeRecords=function(){if(this.addedNodes.length||this.removedNodes.length){var a=[{addedNodes:this.addedNodes,removedNodes:this.removedNodes}];this.addedNodes=[];this.removedNodes=[];return a}return[]};
+function Ia(a,b){var c=r(a);c.F||(c.F=new Fa);c.F.P.add(b);var d=c.F;return{wa:b,C:d,za:a,takeRecords:function(){return d.takeRecords()}}}function Ja(a){var b=a&&a.C;b&&(b.P.delete(a.wa),b.P.size||(r(a.za).F=null))}
+function Ka(a,b){var c=b.getRootNode();return a.map(function(a){var b=c===a.target.getRootNode();if(b&&a.addedNodes){if(b=Array.from(a.addedNodes).filter(function(a){return c===a.getRootNode()}),b.length)return a=Object.create(a),Object.defineProperty(a,"addedNodes",{value:b,configurable:!0}),a}else if(b)return a}).filter(function(a){return a})};var x={},La=Element.prototype.insertBefore,Ma=Element.prototype.replaceChild,Na=Element.prototype.removeChild,Oa=Element.prototype.setAttribute,Sa=Element.prototype.removeAttribute,Ta=Element.prototype.cloneNode,Ua=Document.prototype.importNode,Va=Element.prototype.addEventListener,Wa=Element.prototype.removeEventListener,Xa=Window.prototype.addEventListener,Ya=Window.prototype.removeEventListener,Za=Element.prototype.dispatchEvent,$a=Node.prototype.contains||HTMLElement.prototype.contains,ab=Document.prototype.getElementById,
+bb=Element.prototype.querySelector,cb=DocumentFragment.prototype.querySelector,db=Document.prototype.querySelector,eb=Element.prototype.querySelectorAll,fb=DocumentFragment.prototype.querySelectorAll,gb=Document.prototype.querySelectorAll;x.appendChild=Element.prototype.appendChild;x.insertBefore=La;x.replaceChild=Ma;x.removeChild=Na;x.setAttribute=Oa;x.removeAttribute=Sa;x.cloneNode=Ta;x.importNode=Ua;x.addEventListener=Va;x.removeEventListener=Wa;x.Ua=Xa;x.Va=Ya;x.dispatchEvent=Za;x.contains=$a;
+x.getElementById=ab;x.cb=bb;x.gb=cb;x.ab=db;x.querySelector=function(a){switch(this.nodeType){case Node.ELEMENT_NODE:return bb.call(this,a);case Node.DOCUMENT_NODE:return db.call(this,a);default:return cb.call(this,a)}};x.eb=eb;x.hb=fb;x.bb=gb;x.querySelectorAll=function(a){switch(this.nodeType){case Node.ELEMENT_NODE:return eb.call(this,a);case Node.DOCUMENT_NODE:return gb.call(this,a);default:return fb.call(this,a)}};var hb=/[&\u00A0"]/g,ib=/[&\u00A0<>]/g;function jb(a){switch(a){case "&":return"&amp;";case "<":return"&lt;";case ">":return"&gt;";case '"':return"&quot;";case "\u00a0":return"&nbsp;"}}function kb(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}var lb=kb("area base br col command embed hr img input keygen link meta param source track wbr".split(" ")),mb=kb("style script xmp iframe noembed noframes plaintext noscript".split(" "));
+function nb(a,b){"template"===a.localName&&(a=a.content);for(var c="",d=b?b(a):a.childNodes,e=0,f=d.length,h;e<f&&(h=d[e]);e++){a:{var g=h;var k=a;var l=b;switch(g.nodeType){case Node.ELEMENT_NODE:for(var m=g.localName,p="<"+m,z=g.attributes,E=0;k=z[E];E++)p+=" "+k.name+'="'+k.value.replace(hb,jb)+'"';p+=">";g=lb[m]?p:p+nb(g,l)+"</"+m+">";break a;case Node.TEXT_NODE:g=g.data;g=k&&mb[k.localName]?g:g.replace(ib,jb);break a;case Node.COMMENT_NODE:g="\x3c!--"+g.data+"--\x3e";break a;default:throw window.console.error(g),
+Error("not implemented");}}c+=g}return c};var y={},A=document.createTreeWalker(document,NodeFilter.SHOW_ALL,null,!1),B=document.createTreeWalker(document,NodeFilter.SHOW_ELEMENT,null,!1);function ob(a){var b=[];A.currentNode=a;for(a=A.firstChild();a;)b.push(a),a=A.nextSibling();return b}y.parentNode=function(a){A.currentNode=a;return A.parentNode()};y.firstChild=function(a){A.currentNode=a;return A.firstChild()};y.lastChild=function(a){A.currentNode=a;return A.lastChild()};y.previousSibling=function(a){A.currentNode=a;return A.previousSibling()};
+y.nextSibling=function(a){A.currentNode=a;return A.nextSibling()};y.childNodes=ob;y.parentElement=function(a){B.currentNode=a;return B.parentNode()};y.firstElementChild=function(a){B.currentNode=a;return B.firstChild()};y.lastElementChild=function(a){B.currentNode=a;return B.lastChild()};y.previousElementSibling=function(a){B.currentNode=a;return B.previousSibling()};y.nextElementSibling=function(a){B.currentNode=a;return B.nextSibling()};
+y.children=function(a){var b=[];B.currentNode=a;for(a=B.firstChild();a;)b.push(a),a=B.nextSibling();return b};y.innerHTML=function(a){return nb(a,function(a){return ob(a)})};y.textContent=function(a){switch(a.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:a=document.createTreeWalker(a,NodeFilter.SHOW_TEXT,null,!1);for(var b="",c;c=a.nextNode();)b+=c.nodeValue;return b;default:return a.nodeValue}};var C={},pb=u.u,qb=[Node.prototype,Element.prototype,HTMLElement.prototype];function D(a){var b;a:{for(b=0;b<qb.length;b++){var c=qb[b];if(c.hasOwnProperty(a)){b=c;break a}}b=void 0}if(!b)throw Error("Could not find descriptor for "+a);return Object.getOwnPropertyDescriptor(b,a)}
+var F=pb?{parentNode:D("parentNode"),firstChild:D("firstChild"),lastChild:D("lastChild"),previousSibling:D("previousSibling"),nextSibling:D("nextSibling"),childNodes:D("childNodes"),parentElement:D("parentElement"),previousElementSibling:D("previousElementSibling"),nextElementSibling:D("nextElementSibling"),innerHTML:D("innerHTML"),textContent:D("textContent"),firstElementChild:D("firstElementChild"),lastElementChild:D("lastElementChild"),children:D("children")}:{},rb=pb?{firstElementChild:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,
+"firstElementChild"),lastElementChild:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,"lastElementChild"),children:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,"children")}:{},sb=pb?{firstElementChild:Object.getOwnPropertyDescriptor(Document.prototype,"firstElementChild"),lastElementChild:Object.getOwnPropertyDescriptor(Document.prototype,"lastElementChild"),children:Object.getOwnPropertyDescriptor(Document.prototype,"children")}:{};C.ma=F;C.fb=rb;C.$a=sb;C.parentNode=function(a){return F.parentNode.get.call(a)};
+C.firstChild=function(a){return F.firstChild.get.call(a)};C.lastChild=function(a){return F.lastChild.get.call(a)};C.previousSibling=function(a){return F.previousSibling.get.call(a)};C.nextSibling=function(a){return F.nextSibling.get.call(a)};C.childNodes=function(a){return Array.prototype.slice.call(F.childNodes.get.call(a))};C.parentElement=function(a){return F.parentElement.get.call(a)};C.previousElementSibling=function(a){return F.previousElementSibling.get.call(a)};C.nextElementSibling=function(a){return F.nextElementSibling.get.call(a)};
+C.innerHTML=function(a){return F.innerHTML.get.call(a)};C.textContent=function(a){return F.textContent.get.call(a)};C.children=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:a=rb.children.get.call(a);break;case Node.DOCUMENT_NODE:a=sb.children.get.call(a);break;default:a=F.children.get.call(a)}return Array.prototype.slice.call(a)};
+C.firstElementChild=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return rb.firstElementChild.get.call(a);case Node.DOCUMENT_NODE:return sb.firstElementChild.get.call(a);default:return F.firstElementChild.get.call(a)}};C.lastElementChild=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return rb.lastElementChild.get.call(a);case Node.DOCUMENT_NODE:return sb.lastElementChild.get.call(a);default:return F.lastElementChild.get.call(a)}};var G=u.qa?C:y;function tb(a){for(;a.firstChild;)a.removeChild(a.firstChild)}
+var ub=u.u,vb=document.implementation.createHTMLDocument("inert"),wb=Object.getOwnPropertyDescriptor(Node.prototype,"isConnected"),xb=wb&&wb.get,yb=Object.getOwnPropertyDescriptor(Document.prototype,"activeElement"),zb={parentElement:{get:function(){var a=t(this);(a=a&&a.parentNode)&&a.nodeType!==Node.ELEMENT_NODE&&(a=null);return void 0!==a?a:G.parentElement(this)},configurable:!0},parentNode:{get:function(){var a=t(this);a=a&&a.parentNode;return void 0!==a?a:G.parentNode(this)},configurable:!0},
+nextSibling:{get:function(){var a=t(this);a=a&&a.nextSibling;return void 0!==a?a:G.nextSibling(this)},configurable:!0},previousSibling:{get:function(){var a=t(this);a=a&&a.previousSibling;return void 0!==a?a:G.previousSibling(this)},configurable:!0},nextElementSibling:{get:function(){var a=t(this);if(a&&void 0!==a.nextSibling){for(a=this.nextSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}return G.nextElementSibling(this)},configurable:!0},previousElementSibling:{get:function(){var a=
+t(this);if(a&&void 0!==a.previousSibling){for(a=this.previousSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}return G.previousElementSibling(this)},configurable:!0}},Ab={className:{get:function(){return this.getAttribute("class")||""},set:function(a){this.setAttribute("class",a)},configurable:!0}},Bb={childNodes:{get:function(){if(v(this)){var a=t(this);if(!a.childNodes){a.childNodes=[];for(var b=this.firstChild;b;b=b.nextSibling)a.childNodes.push(b)}var c=a.childNodes}else c=
+G.childNodes(this);c.item=function(a){return c[a]};return c},configurable:!0},childElementCount:{get:function(){return this.children.length},configurable:!0},firstChild:{get:function(){var a=t(this);a=a&&a.firstChild;return void 0!==a?a:G.firstChild(this)},configurable:!0},lastChild:{get:function(){var a=t(this);a=a&&a.lastChild;return void 0!==a?a:G.lastChild(this)},configurable:!0},textContent:{get:function(){if(v(this)){for(var a=[],b=0,c=this.childNodes,d;d=c[b];b++)d.nodeType!==Node.COMMENT_NODE&&
+a.push(d.textContent);return a.join("")}return G.textContent(this)},set:function(a){if("undefined"===typeof a||null===a)a="";switch(this.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:if(!v(this)&&ub){var b=this.firstChild;(b!=this.lastChild||b&&b.nodeType!=Node.TEXT_NODE)&&tb(this);C.ma.textContent.set.call(this,a)}else tb(this),(0<a.length||this.nodeType===Node.ELEMENT_NODE)&&this.appendChild(document.createTextNode(a));break;default:this.nodeValue=a}},configurable:!0},firstElementChild:{get:function(){var a=
+t(this);if(a&&void 0!==a.firstChild){for(a=this.firstChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}return G.firstElementChild(this)},configurable:!0},lastElementChild:{get:function(){var a=t(this);if(a&&void 0!==a.lastChild){for(a=this.lastChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}return G.lastElementChild(this)},configurable:!0},children:{get:function(){var a=v(this)?Array.prototype.filter.call(this.childNodes,function(a){return a.nodeType===Node.ELEMENT_NODE}):
+G.children(this);a.item=function(b){return a[b]};return a},configurable:!0},innerHTML:{get:function(){return v(this)?nb("template"===this.localName?this.content:this):G.innerHTML(this)},set:function(a){var b="template"===this.localName?this.content:this;tb(b);var c=this.localName;c&&"template"!==c||(c="div");c=vb.createElement(c);for(ub?C.ma.innerHTML.set.call(c,a):c.innerHTML=a;c.firstChild;)b.appendChild(c.firstChild)},configurable:!0}},Cb={shadowRoot:{get:function(){var a=t(this);return a&&a.na||
+null},configurable:!0}},Db={activeElement:{get:function(){var a=yb&&yb.get?yb.get.call(document):u.u?void 0:document.activeElement;if(a&&a.nodeType){var b=!!w(this);if(this===document||b&&this.host!==a&&x.contains.call(this.host,a)){for(b=pa(a);b&&b!==this;)a=b.host,b=pa(a);a=this===document?b?null:a:b===this?a:null}else a=null}else a=null;return a},set:function(){},configurable:!0}};
+function I(a,b,c){for(var d in b){var e=Object.getOwnPropertyDescriptor(a,d);e&&e.configurable||!e&&c?Object.defineProperty(a,d,b[d]):c&&console.warn("Could not define",d,"on",a)}}function J(a){I(a,zb);I(a,Ab);I(a,Bb);I(a,Db)}
+function Eb(){var a=Fb.prototype;a.__proto__=DocumentFragment.prototype;I(a,zb,!0);I(a,Bb,!0);I(a,Db,!0);Object.defineProperties(a,{nodeType:{value:Node.DOCUMENT_FRAGMENT_NODE,configurable:!0},nodeName:{value:"#document-fragment",configurable:!0},nodeValue:{value:null,configurable:!0}});["localName","namespaceURI","prefix"].forEach(function(b){Object.defineProperty(a,b,{value:void 0,configurable:!0})});["ownerDocument","baseURI","isConnected"].forEach(function(b){Object.defineProperty(a,b,{get:function(){return this.host[b]},
+configurable:!0})})}var Gb=u.u?function(){}:function(a){var b=r(a);b.ia||(b.ia=!0,I(a,zb,!0),I(a,Ab,!0))},Hb=u.u?function(){}:function(a){r(a).ta||(I(a,Bb,!0),I(a,Cb,!0))};var Ib=G.childNodes;function Jb(a,b,c){Gb(a);c=c||null;var d=r(a),e=r(b),f=c?r(c):null;d.previousSibling=c?f.previousSibling:b.lastChild;if(f=t(d.previousSibling))f.nextSibling=a;if(f=t(d.nextSibling=c))f.previousSibling=a;d.parentNode=b;c?c===e.firstChild&&(e.firstChild=a):(e.lastChild=a,e.firstChild||(e.firstChild=a));e.childNodes=null}
+function Kb(a,b){var c=r(a);if(void 0===c.firstChild)for(b=b||Ib(a),c.firstChild=b[0]||null,c.lastChild=b[b.length-1]||null,Hb(a),c=0;c<b.length;c++){var d=b[c],e=r(d);e.parentNode=a;e.nextSibling=b[c+1]||null;e.previousSibling=b[c-1]||null;Gb(d)}};var Lb=G.parentNode;
+function Mb(a,b,c){if(b===a)throw Error("Failed to execute 'appendChild' on 'Node': The new child element contains the parent.");if(c){var d=t(c);d=d&&d.parentNode;if(void 0!==d&&d!==a||void 0===d&&Lb(c)!==a)throw Error("Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.");}if(c===b)return b;b.parentNode&&Nb(b.parentNode,b);var e,f;if(!b.__noInsertionPoint){if(f=e=pa(a)){var h;"slot"===b.localName?h=[b]:b.querySelectorAll&&
+(h=b.querySelectorAll("slot"));f=h&&h.length?h:void 0}f&&(h=e,d=f,h.s=h.s||[],h.f=h.f||[],h.h=h.h||{},h.s.push.apply(h.s,[].concat(d instanceof Array?d:ka(ia(d)))))}("slot"===a.localName||f)&&(e=e||pa(a))&&Ob(e);if(v(a)){e=c;Hb(a);f=r(a);void 0!==f.firstChild&&(f.childNodes=null);if(b.nodeType===Node.DOCUMENT_FRAGMENT_NODE){f=b.childNodes;for(h=0;h<f.length;h++)Jb(f[h],a,e);e=r(b);f=void 0!==e.firstChild?null:void 0;e.firstChild=e.lastChild=f;e.childNodes=f}else Jb(b,a,e);e=t(a);if(Pb(a)){Ob(e.root);
+var g=!0}else e.root&&(g=!0)}g||(g=w(a)?a.host:a,c?(c=Qb(c),x.insertBefore.call(g,b,c)):x.appendChild.call(g,b));Rb(a,b);return b}
+function Nb(a,b){if(b.parentNode!==a)throw Error("The node to be removed is not a child of this node: "+b);var c=pa(b),d=t(a);if(v(a)){var e=r(b),f=r(a);b===f.firstChild&&(f.firstChild=e.nextSibling);b===f.lastChild&&(f.lastChild=e.previousSibling);var h=e.previousSibling,g=e.nextSibling;h&&(r(h).nextSibling=g);g&&(r(g).previousSibling=h);e.parentNode=e.previousSibling=e.nextSibling=void 0;void 0!==f.childNodes&&(f.childNodes=null);if(Pb(a)){Ob(d.root);var k=!0}}Sb(b);if(c){(e=a&&"slot"===a.localName)&&
+(k=!0);if(c.f){Tb(c);f=c.h;for(aa in f)for(h=f[aa],g=0;g<h.length;g++){var l=h[g];if(Aa(b,l)){h.splice(g,1);var m=c.f.indexOf(l);0<=m&&c.f.splice(m,1);g--;m=t(l);if(l=m.A)for(var p=0;p<l.length;p++){var z=l[p],E=Ub(z);E&&x.removeChild.call(E,z)}m.A=[];m.assignedNodes=[];m=!0}}var aa=m}else aa=void 0;(aa||e)&&Ob(c)}k||(k=w(a)?a.host:a,(!d.root&&"slot"!==b.localName||k===Lb(b))&&x.removeChild.call(k,b));Rb(a,null,b);return b}
+function Sb(a){var b=t(a);if(b&&void 0!==b.I){b=a.childNodes;for(var c=0,d=b.length,e;c<d&&(e=b[c]);c++)Sb(e)}if(a=t(a))a.I=void 0}function Qb(a){var b=a;a&&"slot"===a.localName&&(b=(b=(b=t(a))&&b.A)&&b.length?b[0]:Qb(a.nextSibling));return b}function Pb(a){return(a=(a=t(a))&&a.root)&&Vb(a)}
+function Wb(a,b){if("slot"===b)a=a.parentNode,Pb(a)&&Ob(t(a).root);else if("slot"===a.localName&&"name"===b&&(b=pa(a))){if(b.f){var c=a.ua,d=Yb(a);if(d!==c){c=b.h[c];var e=c.indexOf(a);0<=e&&c.splice(e,1);c=b.h[d]||(b.h[d]=[]);c.push(a);1<c.length&&(b.h[d]=Zb(c))}}Ob(b)}}function Rb(a,b,c){if(a=(a=t(a))&&a.F)b&&a.addedNodes.push(b),c&&a.removedNodes.push(c),Ga(a)}
+function $b(a){if(a&&a.nodeType){var b=r(a),c=b.I;void 0===c&&(w(a)?(c=a,b.I=c):(c=(c=a.parentNode)?$b(c):a,x.contains.call(document.documentElement,a)&&(b.I=c)));return c}}function ac(a,b,c){var d=[];bc(a.childNodes,b,c,d);return d}function bc(a,b,c,d){for(var e=0,f=a.length,h;e<f&&(h=a[e]);e++){var g;if(g=h.nodeType===Node.ELEMENT_NODE){g=h;var k=b,l=c,m=d,p=k(g);p&&m.push(g);l&&l(p)?g=p:(bc(g.childNodes,k,l,m),g=void 0)}if(g)break}}var cc=null;
+function dc(a,b,c){cc||(cc=window.ShadyCSS&&window.ShadyCSS.ScopingShim);cc&&"class"===b?cc.setElementClass(a,c):(x.setAttribute.call(a,b,c),Wb(a,b))}function ec(a,b){if(a.ownerDocument!==document)return x.importNode.call(document,a,b);var c=x.importNode.call(document,a,!1);if(b){a=a.childNodes;b=0;for(var d;b<a.length;b++)d=ec(a[b],!0),c.appendChild(d)}return c};var fc="__eventWrappers"+Date.now(),gc={blur:!0,focus:!0,focusin:!0,focusout:!0,click:!0,dblclick:!0,mousedown:!0,mouseenter:!0,mouseleave:!0,mousemove:!0,mouseout:!0,mouseover:!0,mouseup:!0,wheel:!0,beforeinput:!0,input:!0,keydown:!0,keyup:!0,compositionstart:!0,compositionupdate:!0,compositionend:!0,touchstart:!0,touchend:!0,touchmove:!0,touchcancel:!0,pointerover:!0,pointerenter:!0,pointerdown:!0,pointermove:!0,pointerup:!0,pointercancel:!0,pointerout:!0,pointerleave:!0,gotpointercapture:!0,lostpointercapture:!0,
+dragstart:!0,drag:!0,dragenter:!0,dragleave:!0,dragover:!0,drop:!0,dragend:!0,DOMActivate:!0,DOMFocusIn:!0,DOMFocusOut:!0,keypress:!0};function hc(a,b){var c=[],d=a;for(a=a===window?window:a.getRootNode();d;)c.push(d),d=d.assignedSlot?d.assignedSlot:d.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&d.host&&(b||d!==a)?d.host:d.parentNode;c[c.length-1]===document&&c.push(window);return c}
+function ic(a,b){if(!w)return a;a=hc(a,!0);for(var c=0,d,e,f,h;c<b.length;c++)if(d=b[c],f=d===window?window:d.getRootNode(),f!==e&&(h=a.indexOf(f),e=f),!w(f)||-1<h)return d}
+var jc={get composed(){!1!==this.isTrusted&&void 0===this.W&&(this.W=gc[this.type]);return this.W||!1},composedPath:function(){this.b||(this.b=hc(this.__target,this.composed));return this.b},get target(){return ic(this.currentTarget,this.composedPath())},get relatedTarget(){if(!this.X)return null;this.c||(this.c=hc(this.X,!0));return ic(this.currentTarget,this.c)},stopPropagation:function(){Event.prototype.stopPropagation.call(this);this.a=!0},stopImmediatePropagation:function(){Event.prototype.stopImmediatePropagation.call(this);
+this.a=this.g=!0}};function kc(a){function b(b,d){b=new a(b,d);b.W=d&&!!d.composed;return b}ua(b,a);b.prototype=a.prototype;return b}var lc={focus:!0,blur:!0};function mc(a){return a.__target!==a.target||a.X!==a.relatedTarget}function nc(a,b,c){if(c=b.__handlers&&b.__handlers[a.type]&&b.__handlers[a.type][c])for(var d=0,e;(e=c[d])&&(!mc(a)||a.target!==a.relatedTarget)&&(e.call(b,a),!a.g);d++);}
+function oc(a){var b=a.composedPath();Object.defineProperty(a,"currentTarget",{get:function(){return d},configurable:!0});for(var c=b.length-1;0<=c;c--){var d=b[c];nc(a,d,"capture");if(a.a)return}Object.defineProperty(a,"eventPhase",{get:function(){return Event.AT_TARGET}});var e;for(c=0;c<b.length;c++){d=b[c];var f=t(d);f=f&&f.root;if(0===c||f&&f===e)if(nc(a,d,"bubble"),d!==window&&(e=d.getRootNode()),a.a)break}}
+function pc(a,b,c,d,e,f){for(var h=0;h<a.length;h++){var g=a[h],k=g.type,l=g.capture,m=g.once,p=g.passive;if(b===g.node&&c===k&&d===l&&e===m&&f===p)return h}return-1}
+function qc(a,b,c){if(b){var d=typeof b;if("function"===d||"object"===d)if("object"!==d||b.handleEvent&&"function"===typeof b.handleEvent){if(c&&"object"===typeof c){var e=!!c.capture;var f=!!c.once;var h=!!c.passive}else e=!!c,h=f=!1;var g=c&&c.Z||this,k=b[fc];if(k){if(-1<pc(k,g,a,e,f,h))return}else b[fc]=[];k=function(e){f&&this.removeEventListener(a,b,c);e.__target||rc(e);if(g!==this){var h=Object.getOwnPropertyDescriptor(e,"currentTarget");Object.defineProperty(e,"currentTarget",{get:function(){return g},
+configurable:!0})}if(e.composed||-1<e.composedPath().indexOf(g))if(mc(e)&&e.target===e.relatedTarget)e.eventPhase===Event.BUBBLING_PHASE&&e.stopImmediatePropagation();else if(e.eventPhase===Event.CAPTURING_PHASE||e.bubbles||e.target===g||g instanceof Window){var k="function"===d?b.call(g,e):b.handleEvent&&b.handleEvent(e);g!==this&&(h?(Object.defineProperty(e,"currentTarget",h),h=null):delete e.currentTarget);return k}};b[fc].push({node:g,type:a,capture:e,once:f,passive:h,Wa:k});lc[a]?(this.__handlers=
+this.__handlers||{},this.__handlers[a]=this.__handlers[a]||{capture:[],bubble:[]},this.__handlers[a][e?"capture":"bubble"].push(k)):(this instanceof Window?x.Ua:x.addEventListener).call(this,a,k,c)}}}
+function sc(a,b,c){if(b){if(c&&"object"===typeof c){var d=!!c.capture;var e=!!c.once;var f=!!c.passive}else d=!!c,f=e=!1;var h=c&&c.Z||this,g=void 0;var k=null;try{k=b[fc]}catch(l){}k&&(e=pc(k,h,a,d,e,f),-1<e&&(g=k.splice(e,1)[0].Wa,k.length||(b[fc]=void 0)));(this instanceof Window?x.Va:x.removeEventListener).call(this,a,g||b,c);g&&lc[a]&&this.__handlers&&this.__handlers[a]&&(a=this.__handlers[a][d?"capture":"bubble"],g=a.indexOf(g),-1<g&&a.splice(g,1))}}
+function tc(){for(var a in lc)window.addEventListener(a,function(a){a.__target||(rc(a),oc(a))},!0)}function rc(a){a.__target=a.target;a.X=a.relatedTarget;if(u.u){var b=Object.getPrototypeOf(a);if(!b.hasOwnProperty("__patchProto")){var c=Object.create(b);c.Ya=b;sa(c,jc);b.__patchProto=c}a.__proto__=b.__patchProto}else sa(a,jc)}var uc=kc(window.Event),vc=kc(window.CustomEvent),wc=kc(window.MouseEvent);function xc(a,b){return{index:a,J:[],O:b}}
+function yc(a,b,c,d){var e=0,f=0,h=0,g=0,k=Math.min(b-e,d-f);if(0==e&&0==f)a:{for(h=0;h<k;h++)if(a[h]!==c[h])break a;h=k}if(b==a.length&&d==c.length){g=a.length;for(var l=c.length,m=0;m<k-h&&zc(a[--g],c[--l]);)m++;g=m}e+=h;f+=h;b-=g;d-=g;if(0==b-e&&0==d-f)return[];if(e==b){for(b=xc(e,0);f<d;)b.J.push(c[f++]);return[b]}if(f==d)return[xc(e,b-e)];k=e;h=f;d=d-h+1;g=b-k+1;b=Array(d);for(l=0;l<d;l++)b[l]=Array(g),b[l][0]=l;for(l=0;l<g;l++)b[0][l]=l;for(l=1;l<d;l++)for(m=1;m<g;m++)if(a[k+m-1]===c[h+l-1])b[l][m]=
+b[l-1][m-1];else{var p=b[l-1][m]+1,z=b[l][m-1]+1;b[l][m]=p<z?p:z}k=b.length-1;h=b[0].length-1;d=b[k][h];for(a=[];0<k||0<h;)0==k?(a.push(2),h--):0==h?(a.push(3),k--):(g=b[k-1][h-1],l=b[k-1][h],m=b[k][h-1],p=l<m?l<g?l:g:m<g?m:g,p==g?(g==d?a.push(0):(a.push(1),d=g),k--,h--):p==l?(a.push(3),k--,d=l):(a.push(2),h--,d=m));a.reverse();b=void 0;k=[];for(h=0;h<a.length;h++)switch(a[h]){case 0:b&&(k.push(b),b=void 0);e++;f++;break;case 1:b||(b=xc(e,0));b.O++;e++;b.J.push(c[f]);f++;break;case 2:b||(b=xc(e,0));
+b.O++;e++;break;case 3:b||(b=xc(e,0)),b.J.push(c[f]),f++}b&&k.push(b);return k}function zc(a,b){return a===b};var Ub=G.parentNode,Ac=G.childNodes,Bc={};function Cc(a){var b=[];do b.unshift(a);while(a=a.parentNode);return b}function Fb(a,b,c){if(a!==Bc)throw new TypeError("Illegal constructor");this.ya="ShadyRoot";a=Ac(b);this.host=b;this.a=c&&c.mode;Kb(b,a);c=t(b);c.root=this;c.na="closed"!==this.a?this:null;c=r(this);c.firstChild=c.lastChild=c.parentNode=c.nextSibling=c.previousSibling=null;c.childNodes=[];this.N=!1;this.s=this.h=this.f=null;c=0;for(var d=a.length;c<d;c++)x.removeChild.call(b,a[c])}
+function Ob(a){a.N||(a.N=!0,Da(function(){return Dc(a)}))}function Dc(a){for(var b;a;){a.N&&(b=a);a:{var c=a;a=c.host.getRootNode();if(w(a))for(var d=c.host.childNodes,e=0;e<d.length;e++)if(c=d[e],"slot"==c.localName)break a;a=void 0}}b&&b._renderRoot()}
+Fb.prototype._renderRoot=function(){this.N=!1;if(this.f){Tb(this);for(var a=0,b;a<this.f.length;a++){b=this.f[a];var c=t(b),d=c.assignedNodes;c.assignedNodes=[];c.A=[];if(c.da=d)for(c=0;c<d.length;c++){var e=t(d[c]);e.M=e.assignedSlot;e.assignedSlot===b&&(e.assignedSlot=null)}}for(b=this.host.firstChild;b;b=b.nextSibling)Ec(this,b);for(a=0;a<this.f.length;a++){b=this.f[a];d=t(b);if(!d.assignedNodes.length)for(c=b.firstChild;c;c=c.nextSibling)Ec(this,c,b);(c=(c=t(b.parentNode))&&c.root)&&Vb(c)&&c._renderRoot();
+Fc(this,d.A,d.assignedNodes);if(c=d.da){for(e=0;e<c.length;e++)t(c[e]).M=null;d.da=null;c.length>d.assignedNodes.length&&(d.R=!0)}d.R&&(d.R=!1,Gc(this,b))}a=this.f;b=[];for(d=0;d<a.length;d++)c=a[d].parentNode,(e=t(c))&&e.root||!(0>b.indexOf(c))||b.push(c);for(a=0;a<b.length;a++){d=b[a];c=d===this?this.host:d;e=[];d=d.childNodes;for(var f=0;f<d.length;f++){var h=d[f];if("slot"==h.localName){h=t(h).A;for(var g=0;g<h.length;g++)e.push(h[g])}else e.push(h)}d=void 0;f=Ac(c);h=yc(e,e.length,f,f.length);
+for(var k=g=0;g<h.length&&(d=h[g]);g++){for(var l=0,m;l<d.J.length&&(m=d.J[l]);l++)Ub(m)===c&&x.removeChild.call(c,m),f.splice(d.index+k,1);k-=d.O}for(k=0;k<h.length&&(d=h[k]);k++)for(g=f[d.index],l=d.index;l<d.index+d.O;l++)m=e[l],x.insertBefore.call(c,m,g),f.splice(l,0,m)}}};function Ec(a,b,c){var d=r(b),e=d.M;d.M=null;c||(c=(a=a.h[b.slot||"__catchall"])&&a[0]);c?(r(c).assignedNodes.push(b),d.assignedSlot=c):d.assignedSlot=void 0;e!==d.assignedSlot&&d.assignedSlot&&(r(d.assignedSlot).R=!0)}
+function Fc(a,b,c){for(var d=0,e;d<c.length&&(e=c[d]);d++)if("slot"==e.localName){var f=t(e).assignedNodes;f&&f.length&&Fc(a,b,f)}else b.push(c[d])}function Gc(a,b){x.dispatchEvent.call(b,new Event("slotchange"));b=t(b);b.assignedSlot&&Gc(a,b.assignedSlot)}function Tb(a){if(a.s&&a.s.length){for(var b=a.s,c,d=0;d<b.length;d++){var e=b[d];Kb(e);Kb(e.parentNode);var f=Yb(e);a.h[f]?(c=c||{},c[f]=!0,a.h[f].push(e)):a.h[f]=[e];a.f.push(e)}if(c)for(var h in c)a.h[h]=Zb(a.h[h]);a.s=[]}}
+function Yb(a){var b=a.name||a.getAttribute("name")||"__catchall";return a.ua=b}function Zb(a){return a.sort(function(a,c){a=Cc(a);for(var b=Cc(c),e=0;e<a.length;e++){c=a[e];var f=b[e];if(c!==f)return a=Array.from(c.parentNode.childNodes),a.indexOf(c)-a.indexOf(f)}})}function Vb(a){Tb(a);return!(!a.f||!a.f.length)};function Hc(a){var b=a.getRootNode();w(b)&&Dc(b);return(a=t(a))&&a.assignedSlot||null}
+var Ic={addEventListener:qc.bind(window),removeEventListener:sc.bind(window)},Jc={addEventListener:qc,removeEventListener:sc,appendChild:function(a){return Mb(this,a)},insertBefore:function(a,b){return Mb(this,a,b)},removeChild:function(a){return Nb(this,a)},replaceChild:function(a,b){Mb(this,a,b);Nb(this,b);return a},cloneNode:function(a){if("template"==this.localName)var b=x.cloneNode.call(this,a);else if(b=x.cloneNode.call(this,!1),a){a=this.childNodes;for(var c=0,d;c<a.length;c++)d=a[c].cloneNode(!0),
+b.appendChild(d)}return b},getRootNode:function(){return $b(this)},contains:function(a){return Aa(this,a)},dispatchEvent:function(a){Ea();return x.dispatchEvent.call(this,a)}};
+Object.defineProperties(Jc,{isConnected:{get:function(){if(xb&&xb.call(this))return!0;if(this.nodeType==Node.DOCUMENT_FRAGMENT_NODE)return!1;var a=this.ownerDocument;if(za){if(x.contains.call(a,this))return!0}else if(a.documentElement&&x.contains.call(a.documentElement,this))return!0;for(a=this;a&&!(a instanceof Document);)a=a.parentNode||(w(a)?a.host:void 0);return!!(a&&a instanceof Document)},configurable:!0}});
+var Kc={get assignedSlot(){return Hc(this)}},Lc={querySelector:function(a){return ac(this,function(b){return ra.call(b,a)},function(a){return!!a})[0]||null},querySelectorAll:function(a,b){if(b){b=Array.prototype.slice.call(x.querySelectorAll(this,a));var c=this.getRootNode();return b.filter(function(a){return a.getRootNode()==c})}return ac(this,function(b){return ra.call(b,a)})}},Mc={assignedNodes:function(a){if("slot"===this.localName){var b=this.getRootNode();w(b)&&Dc(b);return(b=t(this))?(a&&a.flatten?
+b.A:b.assignedNodes)||[]:[]}}},Nc=ta({setAttribute:function(a,b){dc(this,a,b)},removeAttribute:function(a){x.removeAttribute.call(this,a);Wb(this,a)},attachShadow:function(a){if(!this)throw"Must provide a host.";if(!a)throw"Not enough arguments.";return new Fb(Bc,this,a)},get slot(){return this.getAttribute("slot")},set slot(a){dc(this,"slot",a)},get assignedSlot(){return Hc(this)}},Lc,Mc);Object.defineProperties(Nc,Cb);
+var Oc=ta({importNode:function(a,b){return ec(a,b)},getElementById:function(a){return ac(this,function(b){return b.id==a},function(a){return!!a})[0]||null}},Lc);Object.defineProperties(Oc,{_activeElement:Db.activeElement});
+var Pc=HTMLElement.prototype.blur,Qc=ta({blur:function(){var a=t(this);(a=(a=a&&a.root)&&a.activeElement)?a.blur():Pc.call(this)}}),Rc={addEventListener:function(a,b,c){"object"!==typeof c&&(c={capture:!!c});c.Z=this;this.host.addEventListener(a,b,c)},removeEventListener:function(a,b,c){"object"!==typeof c&&(c={capture:!!c});c.Z=this;this.host.removeEventListener(a,b,c)},getElementById:function(a){return ac(this,function(b){return b.id==a},function(a){return!!a})[0]||null}};
+function K(a,b){for(var c=Object.getOwnPropertyNames(b),d=0;d<c.length;d++){var e=c[d],f=Object.getOwnPropertyDescriptor(b,e);f.value?a[e]=f.value:Object.defineProperty(a,e,f)}};if(u.la){var ShadyDOM={inUse:u.la,patch:function(a){Hb(a);Gb(a);return a},isShadyRoot:w,enqueue:Da,flush:Ea,settings:u,filterMutations:Ka,observeChildren:Ia,unobserveChildren:Ja,nativeMethods:x,nativeTree:G};window.ShadyDOM=ShadyDOM;window.Event=uc;window.CustomEvent=vc;window.MouseEvent=wc;tc();var Sc=window.customElements&&window.customElements.nativeHTMLElement||HTMLElement;K(Fb.prototype,Rc);K(window.Node.prototype,Jc);K(window.Window.prototype,Ic);K(window.Text.prototype,Kc);K(window.DocumentFragment.prototype,
+Lc);K(window.Element.prototype,Nc);K(window.Document.prototype,Oc);window.HTMLSlotElement&&K(window.HTMLSlotElement.prototype,Mc);K(Sc.prototype,Qc);u.u&&(J(window.Node.prototype),J(window.Text.prototype),J(window.DocumentFragment.prototype),J(window.Element.prototype),J(Sc.prototype),J(window.Document.prototype),window.HTMLSlotElement&&J(window.HTMLSlotElement.prototype));Eb();window.ShadowRoot=Fb};var Tc=new Set("annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph".split(" "));function Uc(a){var b=Tc.has(a);a=/^[a-z][.0-9_a-z]*-[\-.0-9_a-z]*$/.test(a);return!b&&a}function L(a){var b=a.isConnected;if(void 0!==b)return b;for(;a&&!(a.__CE_isImportDocument||a instanceof Document);)a=a.parentNode||(window.ShadowRoot&&a instanceof ShadowRoot?a.host:void 0);return!(!a||!(a.__CE_isImportDocument||a instanceof Document))}
+function Vc(a,b){for(;b&&b!==a&&!b.nextSibling;)b=b.parentNode;return b&&b!==a?b.nextSibling:null}
+function M(a,b,c){c=void 0===c?new Set:c;for(var d=a;d;){if(d.nodeType===Node.ELEMENT_NODE){var e=d;b(e);var f=e.localName;if("link"===f&&"import"===e.getAttribute("rel")){d=e.import;if(d instanceof Node&&!c.has(d))for(c.add(d),d=d.firstChild;d;d=d.nextSibling)M(d,b,c);d=Vc(a,e);continue}else if("template"===f){d=Vc(a,e);continue}if(e=e.__CE_shadowRoot)for(e=e.firstChild;e;e=e.nextSibling)M(e,b,c)}d=d.firstChild?d.firstChild:Vc(a,d)}}function N(a,b,c){a[b]=c};function Wc(){this.a=new Map;this.m=new Map;this.g=[];this.c=!1}function Xc(a,b,c){a.a.set(b,c);a.m.set(c.constructor,c)}function Yc(a,b){a.c=!0;a.g.push(b)}function Zc(a,b){a.c&&M(b,function(b){return a.b(b)})}Wc.prototype.b=function(a){if(this.c&&!a.__CE_patched){a.__CE_patched=!0;for(var b=0;b<this.g.length;b++)this.g[b](a)}};function O(a,b){var c=[];M(b,function(a){return c.push(a)});for(b=0;b<c.length;b++){var d=c[b];1===d.__CE_state?a.connectedCallback(d):$c(a,d)}}
+function P(a,b){var c=[];M(b,function(a){return c.push(a)});for(b=0;b<c.length;b++){var d=c[b];1===d.__CE_state&&a.disconnectedCallback(d)}}
+function Q(a,b,c){c=void 0===c?{}:c;var d=c.Ta||new Set,e=c.V||function(b){return $c(a,b)},f=[];M(b,function(b){if("link"===b.localName&&"import"===b.getAttribute("rel")){var c=b.import;c instanceof Node&&(c.__CE_isImportDocument=!0,c.__CE_hasRegistry=!0);c&&"complete"===c.readyState?c.__CE_documentLoadHandled=!0:b.addEventListener("load",function(){var c=b.import;if(!c.__CE_documentLoadHandled){c.__CE_documentLoadHandled=!0;var f=new Set(d);f.delete(c);Q(a,c,{Ta:f,V:e})}})}else f.push(b)},d);if(a.c)for(b=
+0;b<f.length;b++)a.b(f[b]);for(b=0;b<f.length;b++)e(f[b])}
+function $c(a,b){if(void 0===b.__CE_state){var c=b.ownerDocument;if(c.defaultView||c.__CE_isImportDocument&&c.__CE_hasRegistry)if(c=a.a.get(b.localName)){c.constructionStack.push(b);var d=c.constructor;try{try{if(new d!==b)throw Error("The custom element constructor did not produce the element being upgraded.");}finally{c.constructionStack.pop()}}catch(h){throw b.__CE_state=2,h;}b.__CE_state=1;b.__CE_definition=c;if(c.attributeChangedCallback)for(c=c.observedAttributes,d=0;d<c.length;d++){var e=c[d],
+f=b.getAttribute(e);null!==f&&a.attributeChangedCallback(b,e,null,f,null)}L(b)&&a.connectedCallback(b)}}}Wc.prototype.connectedCallback=function(a){var b=a.__CE_definition;b.connectedCallback&&b.connectedCallback.call(a)};Wc.prototype.disconnectedCallback=function(a){var b=a.__CE_definition;b.disconnectedCallback&&b.disconnectedCallback.call(a)};
+Wc.prototype.attributeChangedCallback=function(a,b,c,d,e){var f=a.__CE_definition;f.attributeChangedCallback&&-1<f.observedAttributes.indexOf(b)&&f.attributeChangedCallback.call(a,b,c,d,e)};function ad(a){var b=document;this.i=a;this.a=b;this.C=void 0;Q(this.i,this.a);"loading"===this.a.readyState&&(this.C=new MutationObserver(this.b.bind(this)),this.C.observe(this.a,{childList:!0,subtree:!0}))}ad.prototype.disconnect=function(){this.C&&this.C.disconnect()};ad.prototype.b=function(a){var b=this.a.readyState;"interactive"!==b&&"complete"!==b||this.disconnect();for(b=0;b<a.length;b++)for(var c=a[b].addedNodes,d=0;d<c.length;d++)Q(this.i,c[d])};function bd(){var a=this;this.b=this.a=void 0;this.c=new Promise(function(b){a.b=b;a.a&&b(a.a)})}function cd(a){if(a.a)throw Error("Already resolved.");a.a=void 0;a.b&&a.b(void 0)};function R(a){this.aa=!1;this.i=a;this.ea=new Map;this.ba=function(a){return a()};this.L=!1;this.ca=[];this.xa=new ad(a)}n=R.prototype;
+n.define=function(a,b){var c=this;if(!(b instanceof Function))throw new TypeError("Custom element constructors must be functions.");if(!Uc(a))throw new SyntaxError("The element name '"+a+"' is not valid.");if(this.i.a.get(a))throw Error("A custom element with name '"+a+"' has already been defined.");if(this.aa)throw Error("A custom element is already being defined.");this.aa=!0;try{var d=function(a){var b=e[a];if(void 0!==b&&!(b instanceof Function))throw Error("The '"+a+"' callback must be a function.");
+return b},e=b.prototype;if(!(e instanceof Object))throw new TypeError("The custom element constructor's prototype is not an object.");var f=d("connectedCallback");var h=d("disconnectedCallback");var g=d("adoptedCallback");var k=d("attributeChangedCallback");var l=b.observedAttributes||[]}catch(m){return}finally{this.aa=!1}b={localName:a,constructor:b,connectedCallback:f,disconnectedCallback:h,adoptedCallback:g,attributeChangedCallback:k,observedAttributes:l,constructionStack:[]};Xc(this.i,a,b);this.ca.push(b);
+this.L||(this.L=!0,this.ba(function(){return dd(c)}))};n.V=function(a){Q(this.i,a)};function dd(a){if(!1!==a.L){a.L=!1;for(var b=a.ca,c=[],d=new Map,e=0;e<b.length;e++)d.set(b[e].localName,[]);Q(a.i,document,{V:function(b){if(void 0===b.__CE_state){var e=b.localName,f=d.get(e);f?f.push(b):a.i.a.get(e)&&c.push(b)}}});for(e=0;e<c.length;e++)$c(a.i,c[e]);for(;0<b.length;){var f=b.shift();e=f.localName;f=d.get(f.localName);for(var h=0;h<f.length;h++)$c(a.i,f[h]);(e=a.ea.get(e))&&cd(e)}}}
+n.get=function(a){if(a=this.i.a.get(a))return a.constructor};n.ra=function(a){if(!Uc(a))return Promise.reject(new SyntaxError("'"+a+"' is not a valid custom element name."));var b=this.ea.get(a);if(b)return b.c;b=new bd;this.ea.set(a,b);this.i.a.get(a)&&!this.ca.some(function(b){return b.localName===a})&&cd(b);return b.c};n.Oa=function(a){this.xa.disconnect();var b=this.ba;this.ba=function(c){return a(function(){return b(c)})}};window.CustomElementRegistry=R;R.prototype.define=R.prototype.define;
+R.prototype.upgrade=R.prototype.V;R.prototype.get=R.prototype.get;R.prototype.whenDefined=R.prototype.ra;R.prototype.polyfillWrapFlushCallback=R.prototype.Oa;var ed=window.Document.prototype.createElement,fd=window.Document.prototype.createElementNS,gd=window.Document.prototype.importNode,hd=window.Document.prototype.prepend,id=window.Document.prototype.append,jd=window.DocumentFragment.prototype.prepend,kd=window.DocumentFragment.prototype.append,ld=window.Node.prototype.cloneNode,md=window.Node.prototype.appendChild,nd=window.Node.prototype.insertBefore,od=window.Node.prototype.removeChild,pd=window.Node.prototype.replaceChild,qd=Object.getOwnPropertyDescriptor(window.Node.prototype,
+"textContent"),rd=window.Element.prototype.attachShadow,sd=Object.getOwnPropertyDescriptor(window.Element.prototype,"innerHTML"),td=window.Element.prototype.getAttribute,ud=window.Element.prototype.setAttribute,vd=window.Element.prototype.removeAttribute,wd=window.Element.prototype.getAttributeNS,xd=window.Element.prototype.setAttributeNS,yd=window.Element.prototype.removeAttributeNS,zd=window.Element.prototype.insertAdjacentElement,Ad=window.Element.prototype.insertAdjacentHTML,Bd=window.Element.prototype.prepend,
+Cd=window.Element.prototype.append,Dd=window.Element.prototype.before,Ed=window.Element.prototype.after,Fd=window.Element.prototype.replaceWith,Gd=window.Element.prototype.remove,Hd=window.HTMLElement,Id=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML"),Jd=window.HTMLElement.prototype.insertAdjacentElement,Kd=window.HTMLElement.prototype.insertAdjacentHTML;var Ld=new function(){};function Md(){var a=Nd;window.HTMLElement=function(){function b(){var b=this.constructor,d=a.m.get(b);if(!d)throw Error("The custom element being constructed was not registered with `customElements`.");var e=d.constructionStack;if(0===e.length)return e=ed.call(document,d.localName),Object.setPrototypeOf(e,b.prototype),e.__CE_state=1,e.__CE_definition=d,a.b(e),e;d=e.length-1;var f=e[d];if(f===Ld)throw Error("The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.");
+e[d]=Ld;Object.setPrototypeOf(f,b.prototype);a.b(f);return f}b.prototype=Hd.prototype;return b}()};function Od(a,b,c){function d(b){return function(c){for(var d=[],e=0;e<arguments.length;++e)d[e-0]=arguments[e];e=[];for(var f=[],l=0;l<d.length;l++){var m=d[l];m instanceof Element&&L(m)&&f.push(m);if(m instanceof DocumentFragment)for(m=m.firstChild;m;m=m.nextSibling)e.push(m);else e.push(m)}b.apply(this,d);for(d=0;d<f.length;d++)P(a,f[d]);if(L(this))for(d=0;d<e.length;d++)f=e[d],f instanceof Element&&O(a,f)}}void 0!==c.T&&(b.prepend=d(c.T));void 0!==c.append&&(b.append=d(c.append))};function Pd(){var a=Nd;N(Document.prototype,"createElement",function(b){if(this.__CE_hasRegistry){var c=a.a.get(b);if(c)return new c.constructor}b=ed.call(this,b);a.b(b);return b});N(Document.prototype,"importNode",function(b,c){b=gd.call(this,b,c);this.__CE_hasRegistry?Q(a,b):Zc(a,b);return b});N(Document.prototype,"createElementNS",function(b,c){if(this.__CE_hasRegistry&&(null===b||"http://www.w3.org/1999/xhtml"===b)){var d=a.a.get(c);if(d)return new d.constructor}b=fd.call(this,b,c);a.b(b);return b});
+Od(a,Document.prototype,{T:hd,append:id})};function Qd(){var a=Nd;function b(b,d){Object.defineProperty(b,"textContent",{enumerable:d.enumerable,configurable:!0,get:d.get,set:function(b){if(this.nodeType===Node.TEXT_NODE)d.set.call(this,b);else{var c=void 0;if(this.firstChild){var e=this.childNodes,g=e.length;if(0<g&&L(this)){c=Array(g);for(var k=0;k<g;k++)c[k]=e[k]}}d.set.call(this,b);if(c)for(b=0;b<c.length;b++)P(a,c[b])}}})}N(Node.prototype,"insertBefore",function(b,d){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);
+b=nd.call(this,b,d);if(L(this))for(d=0;d<c.length;d++)O(a,c[d]);return b}c=L(b);d=nd.call(this,b,d);c&&P(a,b);L(this)&&O(a,b);return d});N(Node.prototype,"appendChild",function(b){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);b=md.call(this,b);if(L(this))for(var e=0;e<c.length;e++)O(a,c[e]);return b}c=L(b);e=md.call(this,b);c&&P(a,b);L(this)&&O(a,b);return e});N(Node.prototype,"cloneNode",function(b){b=ld.call(this,b);this.ownerDocument.__CE_hasRegistry?Q(a,b):
+Zc(a,b);return b});N(Node.prototype,"removeChild",function(b){var c=L(b),e=od.call(this,b);c&&P(a,b);return e});N(Node.prototype,"replaceChild",function(b,d){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);b=pd.call(this,b,d);if(L(this))for(P(a,d),d=0;d<c.length;d++)O(a,c[d]);return b}c=L(b);var f=pd.call(this,b,d),h=L(this);h&&P(a,d);c&&P(a,b);h&&O(a,b);return f});qd&&qd.get?b(Node.prototype,qd):Yc(a,function(a){b(a,{enumerable:!0,configurable:!0,get:function(){for(var a=
+[],b=0;b<this.childNodes.length;b++)a.push(this.childNodes[b].textContent);return a.join("")},set:function(a){for(;this.firstChild;)od.call(this,this.firstChild);md.call(this,document.createTextNode(a))}})})};function Rd(a){var b=Element.prototype;function c(b){return function(c){for(var d=[],e=0;e<arguments.length;++e)d[e-0]=arguments[e];e=[];for(var g=[],k=0;k<d.length;k++){var l=d[k];l instanceof Element&&L(l)&&g.push(l);if(l instanceof DocumentFragment)for(l=l.firstChild;l;l=l.nextSibling)e.push(l);else e.push(l)}b.apply(this,d);for(d=0;d<g.length;d++)P(a,g[d]);if(L(this))for(d=0;d<e.length;d++)g=e[d],g instanceof Element&&O(a,g)}}void 0!==Dd&&(b.before=c(Dd));void 0!==Dd&&(b.after=c(Ed));void 0!==
+Fd&&N(b,"replaceWith",function(b){for(var c=[],d=0;d<arguments.length;++d)c[d-0]=arguments[d];d=[];for(var h=[],g=0;g<c.length;g++){var k=c[g];k instanceof Element&&L(k)&&h.push(k);if(k instanceof DocumentFragment)for(k=k.firstChild;k;k=k.nextSibling)d.push(k);else d.push(k)}g=L(this);Fd.apply(this,c);for(c=0;c<h.length;c++)P(a,h[c]);if(g)for(P(a,this),c=0;c<d.length;c++)h=d[c],h instanceof Element&&O(a,h)});void 0!==Gd&&N(b,"remove",function(){var b=L(this);Gd.call(this);b&&P(a,this)})};function Sd(){var a=Nd;function b(b,c){Object.defineProperty(b,"innerHTML",{enumerable:c.enumerable,configurable:!0,get:c.get,set:function(b){var d=this,e=void 0;L(this)&&(e=[],M(this,function(a){a!==d&&e.push(a)}));c.set.call(this,b);if(e)for(var f=0;f<e.length;f++){var h=e[f];1===h.__CE_state&&a.disconnectedCallback(h)}this.ownerDocument.__CE_hasRegistry?Q(a,this):Zc(a,this);return b}})}function c(b,c){N(b,"insertAdjacentElement",function(b,d){var e=L(d);b=c.call(this,b,d);e&&P(a,d);L(b)&&O(a,d);
+return b})}function d(b,c){function d(b,c){for(var d=[];b!==c;b=b.nextSibling)d.push(b);for(c=0;c<d.length;c++)Q(a,d[c])}N(b,"insertAdjacentHTML",function(a,b){a=a.toLowerCase();if("beforebegin"===a){var e=this.previousSibling;c.call(this,a,b);d(e||this.parentNode.firstChild,this)}else if("afterbegin"===a)e=this.firstChild,c.call(this,a,b),d(this.firstChild,e);else if("beforeend"===a)e=this.lastChild,c.call(this,a,b),d(e||this.firstChild,null);else if("afterend"===a)e=this.nextSibling,c.call(this,
+a,b),d(this.nextSibling,e);else throw new SyntaxError("The value provided ("+String(a)+") is not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'.");})}rd&&N(Element.prototype,"attachShadow",function(a){return this.__CE_shadowRoot=a=rd.call(this,a)});sd&&sd.get?b(Element.prototype,sd):Id&&Id.get?b(HTMLElement.prototype,Id):Yc(a,function(a){b(a,{enumerable:!0,configurable:!0,get:function(){return ld.call(this,!0).innerHTML},set:function(a){var b="template"===this.localName,c=b?this.content:
+this,d=ed.call(document,this.localName);for(d.innerHTML=a;0<c.childNodes.length;)od.call(c,c.childNodes[0]);for(a=b?d.content:d;0<a.childNodes.length;)md.call(c,a.childNodes[0])}})});N(Element.prototype,"setAttribute",function(b,c){if(1!==this.__CE_state)return ud.call(this,b,c);var d=td.call(this,b);ud.call(this,b,c);c=td.call(this,b);a.attributeChangedCallback(this,b,d,c,null)});N(Element.prototype,"setAttributeNS",function(b,c,d){if(1!==this.__CE_state)return xd.call(this,b,c,d);var e=wd.call(this,
+b,c);xd.call(this,b,c,d);d=wd.call(this,b,c);a.attributeChangedCallback(this,c,e,d,b)});N(Element.prototype,"removeAttribute",function(b){if(1!==this.__CE_state)return vd.call(this,b);var c=td.call(this,b);vd.call(this,b);null!==c&&a.attributeChangedCallback(this,b,c,null,null)});N(Element.prototype,"removeAttributeNS",function(b,c){if(1!==this.__CE_state)return yd.call(this,b,c);var d=wd.call(this,b,c);yd.call(this,b,c);var e=wd.call(this,b,c);d!==e&&a.attributeChangedCallback(this,c,d,e,b)});Jd?
+c(HTMLElement.prototype,Jd):zd?c(Element.prototype,zd):console.warn("Custom Elements: `Element#insertAdjacentElement` was not patched.");Kd?d(HTMLElement.prototype,Kd):Ad?d(Element.prototype,Ad):console.warn("Custom Elements: `Element#insertAdjacentHTML` was not patched.");Od(a,Element.prototype,{T:Bd,append:Cd});Rd(a)};var Td=window.customElements;if(!Td||Td.forcePolyfill||"function"!=typeof Td.define||"function"!=typeof Td.get){var Nd=new Wc;Md();Pd();Od(Nd,DocumentFragment.prototype,{T:jd,append:kd});Qd();Sd();document.__CE_hasRegistry=!0;var customElements=new R(Nd);Object.defineProperty(window,"customElements",{configurable:!0,enumerable:!0,value:customElements})};/*
+
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+function Ud(){this.end=this.start=0;this.rules=this.parent=this.previous=null;this.cssText=this.parsedCssText="";this.atRule=!1;this.type=0;this.parsedSelector=this.selector=this.keyframesName=""}
+function Vd(a){a=a.replace(Wd,"").replace(Xd,"");var b=Yd,c=a,d=new Ud;d.start=0;d.end=c.length;for(var e=d,f=0,h=c.length;f<h;f++)if("{"===c[f]){e.rules||(e.rules=[]);var g=e,k=g.rules[g.rules.length-1]||null;e=new Ud;e.start=f+1;e.parent=g;e.previous=k;g.rules.push(e)}else"}"===c[f]&&(e.end=f+1,e=e.parent||d);return b(d,a)}
+function Yd(a,b){var c=b.substring(a.start,a.end-1);a.parsedCssText=a.cssText=c.trim();a.parent&&(c=b.substring(a.previous?a.previous.end:a.parent.start,a.start-1),c=Zd(c),c=c.replace($d," "),c=c.substring(c.lastIndexOf(";")+1),c=a.parsedSelector=a.selector=c.trim(),a.atRule=0===c.indexOf("@"),a.atRule?0===c.indexOf("@media")?a.type=ae:c.match(be)&&(a.type=ce,a.keyframesName=a.selector.split($d).pop()):a.type=0===c.indexOf("--")?de:ee);if(c=a.rules)for(var d=0,e=c.length,f;d<e&&(f=c[d]);d++)Yd(f,
+b);return a}function Zd(a){return a.replace(/\\([0-9a-f]{1,6})\s/gi,function(a,c){a=c;for(c=6-a.length;c--;)a="0"+a;return"\\"+a})}
+function fe(a,b,c){c=void 0===c?"":c;var d="";if(a.cssText||a.rules){var e=a.rules,f;if(f=e)f=e[0],f=!(f&&f.selector&&0===f.selector.indexOf("--"));if(f){f=0;for(var h=e.length,g;f<h&&(g=e[f]);f++)d=fe(g,b,d)}else b?b=a.cssText:(b=a.cssText,b=b.replace(ge,"").replace(he,""),b=b.replace(ie,"").replace(je,"")),(d=b.trim())&&(d=" "+d+"\n")}d&&(a.selector&&(c+=a.selector+" {\n"),c+=d,a.selector&&(c+="}\n\n"));return c}
+var ee=1,ce=7,ae=4,de=1E3,Wd=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,Xd=/@import[^;]*;/gim,ge=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,he=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,ie=/@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,je=/[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,be=/^@[^\s]*keyframes/,$d=/\s+/g;var S=!(window.ShadyDOM&&window.ShadyDOM.inUse),ne;function oe(a){ne=a&&a.shimcssproperties?!1:S||!(navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/)||!window.CSS||!CSS.supports||!CSS.supports("box-shadow","0 0 0 var(--foo)"))}window.ShadyCSS&&void 0!==window.ShadyCSS.nativeCss?ne=window.ShadyCSS.nativeCss:window.ShadyCSS?(oe(window.ShadyCSS),window.ShadyCSS=void 0):oe(window.WebComponents&&window.WebComponents.flags);var T=ne;var pe=/(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};{])+)|\{([^}]*)\}(?:(?=[;\s}])|$))/gi,qe=/(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi,re=/(--[\w-]+)\s*([:,;)]|$)/gi,se=/(animation\s*:)|(animation-name\s*:)/,te=/@media\s(.*)/,ue=/\{[^}]*\}/g;var ve=new Set;function we(a,b){if(!a)return"";"string"===typeof a&&(a=Vd(a));b&&xe(a,b);return fe(a,T)}function ye(a){!a.__cssRules&&a.textContent&&(a.__cssRules=Vd(a.textContent));return a.__cssRules||null}function ze(a){return!!a.parent&&a.parent.type===ce}function xe(a,b,c,d){if(a){var e=!1,f=a.type;if(d&&f===ae){var h=a.selector.match(te);h&&(window.matchMedia(h[1]).matches||(e=!0))}f===ee?b(a):c&&f===ce?c(a):f===de&&(e=!0);if((a=a.rules)&&!e){e=0;f=a.length;for(var g;e<f&&(g=a[e]);e++)xe(g,b,c,d)}}}
+function Ae(a,b,c,d){var e=document.createElement("style");b&&e.setAttribute("scope",b);e.textContent=a;Be(e,c,d);return e}var U=null;function Be(a,b,c){b=b||document.head;b.insertBefore(a,c&&c.nextSibling||b.firstChild);U?a.compareDocumentPosition(U)===Node.DOCUMENT_POSITION_PRECEDING&&(U=a):U=a}
+function Ce(a,b){var c=a.indexOf("var(");if(-1===c)return b(a,"","","");a:{var d=0;var e=c+3;for(var f=a.length;e<f;e++)if("("===a[e])d++;else if(")"===a[e]&&0===--d)break a;e=-1}d=a.substring(c+4,e);c=a.substring(0,c);a=Ce(a.substring(e+1),b);e=d.indexOf(",");return-1===e?b(c,d.trim(),"",a):b(c,d.substring(0,e).trim(),d.substring(e+1).trim(),a)}function De(a,b){S?a.setAttribute("class",b):window.ShadyDOM.nativeMethods.setAttribute.call(a,"class",b)}
+function V(a){var b=a.localName,c="";b?-1<b.indexOf("-")||(c=b,b=a.getAttribute&&a.getAttribute("is")||""):(b=a.is,c=a.extends);return{is:b,K:c}};function Ee(){}function Fe(a,b,c){var d=W;a.__styleScoped?a.__styleScoped=null:Ge(d,a,b||"",c)}function Ge(a,b,c,d){b.nodeType===Node.ELEMENT_NODE&&He(b,c,d);if(b="template"===b.localName?(b.content||b.Za).childNodes:b.children||b.childNodes)for(var e=0;e<b.length;e++)Ge(a,b[e],c,d)}
+function He(a,b,c){if(b)if(a.classList)c?(a.classList.remove("style-scope"),a.classList.remove(b)):(a.classList.add("style-scope"),a.classList.add(b));else if(a.getAttribute){var d=a.getAttribute(Ie);c?d&&(b=d.replace("style-scope","").replace(b,""),De(a,b)):De(a,(d?d+" ":"")+"style-scope "+b)}}function Je(a,b,c){var d=W,e=a.__cssBuild;S||"shady"===e?b=we(b,c):(a=V(a),b=Ke(d,b,a.is,a.K,c)+"\n\n");return b.trim()}
+function Ke(a,b,c,d,e){var f=Le(c,d);c=c?Me+c:"";return we(b,function(b){b.c||(b.selector=b.l=Ne(a,b,a.b,c,f),b.c=!0);e&&e(b,c,f)})}function Le(a,b){return b?"[is="+a+"]":a}function Ne(a,b,c,d,e){var f=b.selector.split(Oe);if(!ze(b)){b=0;for(var h=f.length,g;b<h&&(g=f[b]);b++)f[b]=c.call(a,g,d,e)}return f.join(Oe)}function Pe(a){return a.replace(Qe,function(a,c,d){-1<d.indexOf("+")?d=d.replace(/\+/g,"___"):-1<d.indexOf("___")&&(d=d.replace(/___/g,"+"));return":"+c+"("+d+")"})}
+Ee.prototype.b=function(a,b,c){var d=!1;a=a.trim();var e=Qe.test(a);e&&(a=a.replace(Qe,function(a,b,c){return":"+b+"("+c.replace(/\s/g,"")+")"}),a=Pe(a));a=a.replace(Re,Se+" $1");a=a.replace(Te,function(a,e,g){d||(a=Ue(g,e,b,c),d=d||a.stop,e=a.Da,g=a.value);return e+g});e&&(a=Pe(a));return a};
+function Ue(a,b,c,d){var e=a.indexOf(Ve);0<=a.indexOf(Se)?a=We(a,d):0!==e&&(a=c?Xe(a,c):a);c=!1;0<=e&&(b="",c=!0);if(c){var f=!0;c&&(a=a.replace(Ye,function(a,b){return" > "+b}))}a=a.replace(Ze,function(a,b,c){return'[dir="'+c+'"] '+b+", "+b+'[dir="'+c+'"]'});return{value:a,Da:b,stop:f}}function Xe(a,b){a=a.split($e);a[0]+=b;return a.join($e)}
+function We(a,b){var c=a.match(af);return(c=c&&c[2].trim()||"")?c[0].match(bf)?a.replace(af,function(a,c,f){return b+f}):c.split(bf)[0]===b?c:cf:a.replace(Se,b)}function df(a){a.selector===ef&&(a.selector="html")}Ee.prototype.c=function(a){return a.match(Ve)?this.b(a,ff):Xe(a.trim(),ff)};q.Object.defineProperties(Ee.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"style-scope"}}});
+var Qe=/:(nth[-\w]+)\(([^)]+)\)/,ff=":not(.style-scope)",Oe=",",Te=/(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=[])+)/g,bf=/[[.:#*]/,Se=":host",ef=":root",Ve="::slotted",Re=new RegExp("^("+Ve+")"),af=/(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Ye=/(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Ze=/(.*):dir\((?:(ltr|rtl))\)/,Me=".",$e=":",Ie="class",cf="should_not_match",W=new Ee;function gf(a,b,c,d){this.w=a||null;this.b=b||null;this.fa=c||[];this.G=null;this.K=d||"";this.a=this.o=this.B=null}function X(a){return a?a.__styleInfo:null}function hf(a,b){return a.__styleInfo=b}gf.prototype.c=function(){return this.w};gf.prototype._getStyleRules=gf.prototype.c;function jf(a){var b=this.matches||this.matchesSelector||this.mozMatchesSelector||this.msMatchesSelector||this.oMatchesSelector||this.webkitMatchesSelector;return b&&b.call(this,a)}var kf=navigator.userAgent.match("Trident");function lf(){}function mf(a){var b={},c=[],d=0;xe(a,function(a){nf(a);a.index=d++;a=a.j.cssText;for(var c;c=re.exec(a);){var e=c[1];":"!==c[2]&&(b[e]=!0)}},function(a){c.push(a)});a.b=c;a=[];for(var e in b)a.push(e);return a}
+function nf(a){if(!a.j){var b={},c={};of(a,c)&&(b.v=c,a.rules=null);b.cssText=a.parsedCssText.replace(ue,"").replace(pe,"");a.j=b}}function of(a,b){var c=a.j;if(c){if(c.v)return Object.assign(b,c.v),!0}else{c=a.parsedCssText;for(var d;a=pe.exec(c);){d=(a[2]||a[3]).trim();if("inherit"!==d||"unset"!==d)b[a[1].trim()]=d;d=!0}return d}}
+function pf(a,b,c){b&&(b=0<=b.indexOf(";")?qf(a,b,c):Ce(b,function(b,e,f,h){if(!e)return b+h;(e=pf(a,c[e],c))&&"initial"!==e?"apply-shim-inherit"===e&&(e="inherit"):e=pf(a,c[f]||f,c)||f;return b+(e||"")+h}));return b&&b.trim()||""}
+function qf(a,b,c){b=b.split(";");for(var d=0,e,f;d<b.length;d++)if(e=b[d]){qe.lastIndex=0;if(f=qe.exec(e))e=pf(a,c[f[1]],c);else if(f=e.indexOf(":"),-1!==f){var h=e.substring(f);h=h.trim();h=pf(a,h,c)||h;e=e.substring(0,f)+h}b[d]=e&&e.lastIndexOf(";")===e.length-1?e.slice(0,-1):e||""}return b.join(";")}
+function rf(a,b){var c={},d=[];xe(a,function(a){a.j||nf(a);var e=a.l||a.parsedSelector;b&&a.j.v&&e&&jf.call(b,e)&&(of(a,c),a=a.index,e=parseInt(a/32,10),d[e]=(d[e]||0)|1<<a%32)},null,!0);return{v:c,key:d}}
+function sf(a,b,c,d){b.j||nf(b);if(b.j.v){var e=V(a);a=e.is;e=e.K;e=a?Le(a,e):"html";var f=b.parsedSelector,h=":host > *"===f||"html"===f,g=0===f.indexOf(":host")&&!h;"shady"===c&&(h=f===e+" > *."+e||-1!==f.indexOf("html"),g=!h&&0===f.indexOf(e));"shadow"===c&&(h=":host > *"===f||"html"===f,g=g&&!h);if(h||g)c=e,g&&(b.l||(b.l=Ne(W,b,W.b,a?Me+a:"",e)),c=b.l||e),d({Qa:c,Ja:g,ib:h})}}
+function tf(a,b){var c={},d={},e=b&&b.__cssBuild;xe(b,function(b){sf(a,b,e,function(e){jf.call(a.g||a,e.Qa)&&(e.Ja?of(b,c):of(b,d))})},null,!0);return{Pa:d,Ha:c}}
+function uf(a,b,c,d){var e=V(b),f=Le(e.is,e.K),h=new RegExp("(?:^|[^.#[:])"+(b.extends?"\\"+f.slice(0,-1)+"\\]":f)+"($|[.:[\\s>+~])");e=X(b).w;var g=vf(e,d);return Je(b,e,function(b){var e="";b.j||nf(b);b.j.cssText&&(e=qf(a,b.j.cssText,c));b.cssText=e;if(!S&&!ze(b)&&b.cssText){var k=e=b.cssText;null==b.ka&&(b.ka=se.test(e));if(b.ka)if(null==b.S){b.S=[];for(var p in g)k=g[p],k=k(e),e!==k&&(e=k,b.S.push(p))}else{for(p=0;p<b.S.length;++p)k=g[b.S[p]],e=k(e);k=e}b.cssText=k;b.l=b.l||b.selector;e="."+d;
+p=b.l.split(",");k=0;for(var z=p.length,E;k<z&&(E=p[k]);k++)p[k]=E.match(h)?E.replace(f,e):e+" "+E;b.selector=p.join(",")}})}function vf(a,b){a=a.b;var c={};if(!S&&a)for(var d=0,e=a[d];d<a.length;e=a[++d]){var f=e,h=b;f.g=new RegExp("\\b"+f.keyframesName+"(?!\\B|-)","g");f.a=f.keyframesName+"-"+h;f.l=f.l||f.selector;f.selector=f.l.replace(f.keyframesName,f.a);c[e.keyframesName]=wf(e)}return c}function wf(a){return function(b){return b.replace(a.g,a.a)}}
+function xf(a,b){var c=yf,d=ye(a);a.textContent=we(d,function(a){var d=a.cssText=a.parsedCssText;a.j&&a.j.cssText&&(d=d.replace(ge,"").replace(he,""),a.cssText=qf(c,d,b))})}q.Object.defineProperties(lf.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"x-scope"}}});var yf=new lf;var zf={},Af=window.customElements;if(Af&&!S){var Bf=Af.define;Af.define=function(a,b,c){var d=document.createComment(" Shady DOM styles for "+a+" "),e=document.head;e.insertBefore(d,(U?U.nextSibling:null)||e.firstChild);U=d;zf[a]=d;Bf.call(Af,a,b,c)}};function Cf(){this.cache={}}Cf.prototype.store=function(a,b,c,d){var e=this.cache[a]||[];e.push({v:b,styleElement:c,o:d});100<e.length&&e.shift();this.cache[a]=e};Cf.prototype.fetch=function(a,b,c){if(a=this.cache[a])for(var d=a.length-1;0<=d;d--){var e=a[d],f;a:{for(f=0;f<c.length;f++){var h=c[f];if(e.v[h]!==b[h]){f=!1;break a}}f=!0}if(f)return e}};function Df(){}
+function Ef(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.target!==document.documentElement&&c.target!==document.head)for(var d=0;d<c.addedNodes.length;d++){var e=c.addedNodes[d];if(e.nodeType===Node.ELEMENT_NODE){var f=e.getRootNode();var h=e;var g=[];h.classList?g=Array.from(h.classList):h instanceof window.SVGElement&&h.hasAttribute("class")&&(g=h.getAttribute("class").split(/\s+/));h=g;g=h.indexOf(W.a);if((h=-1<g?h[g+1]:"")&&f===e.ownerDocument)Fe(e,h,!0);else if(f.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&
+(f=f.host))if(f=V(f).is,h===f)for(e=window.ShadyDOM.nativeMethods.querySelectorAll.call(e,":not(."+W.a+")"),f=0;f<e.length;f++)He(e[f],h);else h&&Fe(e,h,!0),Fe(e,f)}}}}
+if(!S){var Ff=new MutationObserver(Ef),Gf=function(a){Ff.observe(a,{childList:!0,subtree:!0})};if(window.customElements&&!window.customElements.polyfillWrapFlushCallback)Gf(document);else{var Hf=function(){Gf(document.body)};window.HTMLImports?window.HTMLImports.whenReady(Hf):requestAnimationFrame(function(){if("loading"===document.readyState){var a=function(){Hf();document.removeEventListener("readystatechange",a)};document.addEventListener("readystatechange",a)}else Hf()})}Df=function(){Ef(Ff.takeRecords())}}
+var If=Df;var Jf={};var Kf=Promise.resolve();function Lf(a){if(a=Jf[a])a._applyShimCurrentVersion=a._applyShimCurrentVersion||0,a._applyShimValidatingVersion=a._applyShimValidatingVersion||0,a._applyShimNextVersion=(a._applyShimNextVersion||0)+1}function Mf(a){return a._applyShimCurrentVersion===a._applyShimNextVersion}function Nf(a){a._applyShimValidatingVersion=a._applyShimNextVersion;a.a||(a.a=!0,Kf.then(function(){a._applyShimCurrentVersion=a._applyShimNextVersion;a.a=!1}))};var Of=null,Pf=window.HTMLImports&&window.HTMLImports.whenReady||null,Qf;function Rf(a){requestAnimationFrame(function(){Pf?Pf(a):(Of||(Of=new Promise(function(a){Qf=a}),"complete"===document.readyState?Qf():document.addEventListener("readystatechange",function(){"complete"===document.readyState&&Qf()})),Of.then(function(){a&&a()}))})};var Sf=new Cf;function Y(){var a=this;this.H={};this.c=document.documentElement;var b=new Ud;b.rules=[];this.g=hf(this.c,new gf(b));this.m=!1;this.b=this.a=null;Rf(function(){Tf(a)})}n=Y.prototype;n.sa=function(){If()};n.Fa=function(a){return ye(a)};n.Sa=function(a){return we(a)};
+n.prepareTemplate=function(a,b,c){if(!a.b){a.b=!0;a.name=b;a.extends=c;Jf[b]=a;var d=(d=a.content.querySelector("style"))?d.getAttribute("css-build")||"":"";var e=[];for(var f=a.content.querySelectorAll("style"),h=0;h<f.length;h++){var g=f[h];if(g.hasAttribute("shady-unscoped")){if(!S){var k=g.textContent;ve.has(k)||(ve.add(k),k=g.cloneNode(!0),document.head.appendChild(k));g.parentNode.removeChild(g)}}else e.push(g.textContent),g.parentNode.removeChild(g)}e=e.join("").trim();c={is:b,extends:c,Xa:d};
+S||Fe(a.content,b);Tf(this);f=qe.test(e)||pe.test(e);qe.lastIndex=0;pe.lastIndex=0;e=Vd(e);f&&T&&this.a&&this.a.transformRules(e,b);a._styleAst=e;a.c=d;d=[];T||(d=mf(a._styleAst));if(!d.length||T)e=S?a.content:null,b=zf[b],f=Je(c,a._styleAst),b=f.length?Ae(f,c.is,e,b):void 0,a.ja=b;a.Aa=d}};
+function Uf(a){!a.b&&window.ShadyCSS&&window.ShadyCSS.CustomStyleInterface&&(a.b=window.ShadyCSS.CustomStyleInterface,a.b.transformCallback=function(b){a.pa(b)},a.b.validateCallback=function(){requestAnimationFrame(function(){(a.b.enqueued||a.m)&&a.D()})})}function Tf(a){!a.a&&window.ShadyCSS&&window.ShadyCSS.ApplyShim&&(a.a=window.ShadyCSS.ApplyShim,a.a.invalidCallback=Lf);Uf(a)}
+n.D=function(){Tf(this);if(this.b){var a=this.b.processStyles();if(this.b.enqueued){if(T)for(var b=0;b<a.length;b++){var c=this.b.getStyleForCustomStyle(a[b]);if(c&&T&&this.a){var d=ye(c);Tf(this);this.a.transformRules(d);c.textContent=we(d)}}else for(Vf(this,this.c,this.g),b=0;b<a.length;b++)(c=this.b.getStyleForCustomStyle(a[b]))&&xf(c,this.g.B);this.b.enqueued=!1;this.m&&!T&&this.styleDocument()}}};
+n.styleElement=function(a,b){var c=V(a).is,d=X(a);if(!d){var e=V(a);d=e.is;e=e.K;var f=zf[d];d=Jf[d];if(d){var h=d._styleAst;var g=d.Aa}d=hf(a,new gf(h,f,g,e))}a!==this.c&&(this.m=!0);b&&(d.G=d.G||{},Object.assign(d.G,b));if(T){if(d.G){b=d.G;for(var k in b)null===k?a.style.removeProperty(k):a.style.setProperty(k,b[k])}if(((k=Jf[c])||a===this.c)&&k&&k.ja&&!Mf(k)){if(Mf(k)||k._applyShimValidatingVersion!==k._applyShimNextVersion)Tf(this),this.a&&this.a.transformRules(k._styleAst,c),k.ja.textContent=
+Je(a,d.w),Nf(k);S&&(c=a.shadowRoot)&&(c.querySelector("style").textContent=Je(a,d.w));d.w=k._styleAst}}else if(Vf(this,a,d),d.fa&&d.fa.length){c=d;k=V(a).is;d=(b=Sf.fetch(k,c.B,c.fa))?b.styleElement:null;h=c.o;(g=b&&b.o)||(g=this.H[k]=(this.H[k]||0)+1,g=k+"-"+g);c.o=g;g=c.o;e=yf;e=d?d.textContent||"":uf(e,a,c.B,g);f=X(a);var l=f.a;l&&!S&&l!==d&&(l._useCount--,0>=l._useCount&&l.parentNode&&l.parentNode.removeChild(l));S?f.a?(f.a.textContent=e,d=f.a):e&&(d=Ae(e,g,a.shadowRoot,f.b)):d?d.parentNode||
+(kf&&-1<e.indexOf("@media")&&(d.textContent=e),Be(d,null,f.b)):e&&(d=Ae(e,g,null,f.b));d&&(d._useCount=d._useCount||0,f.a!=d&&d._useCount++,f.a=d);g=d;S||(d=c.o,f=e=a.getAttribute("class")||"",h&&(f=e.replace(new RegExp("\\s*x-scope\\s*"+h+"\\s*","g")," ")),f+=(f?" ":"")+"x-scope "+d,e!==f&&De(a,f));b||Sf.store(k,c.B,g,c.o)}};function Wf(a,b){return(b=b.getRootNode().host)?X(b)?b:Wf(a,b):a.c}
+function Vf(a,b,c){a=Wf(a,b);var d=X(a);a=Object.create(d.B||null);var e=tf(b,c.w);b=rf(d.w,b).v;Object.assign(a,e.Ha,b,e.Pa);b=c.G;for(var f in b)if((e=b[f])||0===e)a[f]=e;f=yf;b=Object.getOwnPropertyNames(a);for(e=0;e<b.length;e++)d=b[e],a[d]=pf(f,a[d],a);c.B=a}n.styleDocument=function(a){this.styleSubtree(this.c,a)};
+n.styleSubtree=function(a,b){var c=a.shadowRoot;(c||a===this.c)&&this.styleElement(a,b);if(b=c&&(c.children||c.childNodes))for(a=0;a<b.length;a++)this.styleSubtree(b[a]);else if(a=a.children||a.childNodes)for(b=0;b<a.length;b++)this.styleSubtree(a[b])};n.pa=function(a){var b=this,c=ye(a);xe(c,function(a){if(S)df(a);else{var c=W;a.selector=a.parsedSelector;df(a);a.selector=a.l=Ne(c,a,c.c,void 0,void 0)}T&&(Tf(b),b.a&&b.a.transformRule(a))});T?a.textContent=we(c):this.g.w.rules.push(c)};
+n.getComputedStyleValue=function(a,b){var c;T||(c=(X(a)||X(Wf(this,a))).B[b]);return(c=c||window.getComputedStyle(a).getPropertyValue(b))?c.trim():""};n.Ra=function(a,b){var c=a.getRootNode();b=b?b.split(/\s/):[];c=c.host&&c.host.localName;if(!c){var d=a.getAttribute("class");if(d){d=d.split(/\s/);for(var e=0;e<d.length;e++)if(d[e]===W.a){c=d[e+1];break}}}c&&b.push(W.a,c);T||(c=X(a))&&c.o&&b.push(yf.a,c.o);De(a,b.join(" "))};n.Ba=function(a){return X(a)};Y.prototype.flush=Y.prototype.sa;
+Y.prototype.prepareTemplate=Y.prototype.prepareTemplate;Y.prototype.styleElement=Y.prototype.styleElement;Y.prototype.styleDocument=Y.prototype.styleDocument;Y.prototype.styleSubtree=Y.prototype.styleSubtree;Y.prototype.getComputedStyleValue=Y.prototype.getComputedStyleValue;Y.prototype.setElementClass=Y.prototype.Ra;Y.prototype._styleInfoForNode=Y.prototype.Ba;Y.prototype.transformCustomStyleForDocument=Y.prototype.pa;Y.prototype.getStyleAst=Y.prototype.Fa;Y.prototype.styleAstToString=Y.prototype.Sa;
+Y.prototype.flushCustomStyles=Y.prototype.D;Object.defineProperties(Y.prototype,{nativeShadow:{get:function(){return S}},nativeCss:{get:function(){return T}}});var Z=new Y,Xf,Yf;window.ShadyCSS&&(Xf=window.ShadyCSS.ApplyShim,Yf=window.ShadyCSS.CustomStyleInterface);window.ShadyCSS={ScopingShim:Z,prepareTemplate:function(a,b,c){Z.D();Z.prepareTemplate(a,b,c)},styleSubtree:function(a,b){Z.D();Z.styleSubtree(a,b)},styleElement:function(a){Z.D();Z.styleElement(a)},styleDocument:function(a){Z.D();Z.styleDocument(a)},getComputedStyleValue:function(a,b){return Z.getComputedStyleValue(a,b)},nativeCss:T,nativeShadow:S};Xf&&(window.ShadyCSS.ApplyShim=Xf);
+Yf&&(window.ShadyCSS.CustomStyleInterface=Yf);/*
+
+ Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ Code distributed by Google as part of the polymer project is also
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+var Zf=window.customElements,$f=window.HTMLImports,ag=window.HTMLTemplateElement;window.WebComponents=window.WebComponents||{};if(Zf&&Zf.polyfillWrapFlushCallback){var bg,cg=function(){if(bg){ag.Ca&&ag.Ca(window.document);var a=bg;bg=null;a();return!0}},dg=$f.whenReady;Zf.polyfillWrapFlushCallback(function(a){bg=a;dg(cg)});$f.whenReady=function(a){dg(function(){cg()?$f.whenReady(a):a()})}}
+$f.whenReady(function(){requestAnimationFrame(function(){window.WebComponents.ready=!0;document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})});var eg=document.createElement("style");eg.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var fg=document.querySelector("head");fg.insertBefore(eg,fg.firstChild);}).call(this);
+
+//# sourceMappingURL=webcomponents-hi-sd-ce.js.map
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-sd-ce.js.map b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-sd-ce.js.map
new file mode 100644
index 00000000000..40142c326bf
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-sd-ce.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["node_modules/@webcomponents/html-imports/src/html-imports.js"," [synthetic:util/global] "," [synthetic:util/defineproperty] "," [synthetic:es6/symbol] "," [synthetic:es6/util/makeiterator] "," [synthetic:es6/util/arrayfromiterator] ","node_modules/@webcomponents/shadydom/src/shady-data.js","node_modules/@webcomponents/shadydom/src/utils.js","node_modules/@webcomponents/shadydom/src/flush.js","node_modules/@webcomponents/shadydom/src/observe-changes.js","node_modules/@webcomponents/shadydom/src/native-methods.js","node_modules/@webcomponents/shadydom/src/innerHTML.js","node_modules/@webcomponents/shadydom/src/native-tree-walker.js","node_modules/@webcomponents/shadydom/src/native-tree-accessors.js","node_modules/@webcomponents/shadydom/src/native-tree.js","node_modules/@webcomponents/shadydom/src/patch-accessors.js","node_modules/@webcomponents/shadydom/src/attach-shadow.js","node_modules/@webcomponents/shadydom/src/patch-builtins.js","node_modules/@webcomponents/shadydom/src/logical-tree.js","node_modules/@webcomponents/shadydom/src/logical-mutation.js"," [synthetic:es6/util/arrayfromiterable] ","node_modules/@webcomponents/shadydom/src/patch-events.js","node_modules/@webcomponents/shadydom/src/array-splice.js","node_modules/@webcomponents/shadydom/src/shadydom.js","node_modules/@webcomponents/custom-elements/src/Utilities.js","node_modules/@webcomponents/custom-elements/src/CustomElementInternals.js","node_modules/@webcomponents/custom-elements/src/CustomElementState.js","node_modules/@webcomponents/custom-elements/src/DocumentConstructionObserver.js","node_modules/@webcomponents/custom-elements/src/CustomElementRegistry.js","node_modules/@webcomponents/custom-elements/src/Deferred.js","node_modules/@webcomponents/custom-elements/src/Patch/Native.js","node_modules/@webcomponents/custom-elements/src/AlreadyConstructedMarker.js","node_modules/@webcomponents/custom-elements/src/Patch/HTMLElement.js","node_modules/@webcomponents/custom-elements/src/custom-elements.js","node_modules/@webcomponents/custom-elements/src/Patch/Interface/ParentNode.js","node_modules/@webcomponents/custom-elements/src/Patch/Document.js","node_modules/@webcomponents/custom-elements/src/Patch/Node.js","node_modules/@webcomponents/custom-elements/src/Patch/Interface/ChildNode.js","node_modules/@webcomponents/custom-elements/src/Patch/Element.js","node_modules/@webcomponents/custom-elements/src/Patch/DocumentFragment.js","node_modules/@webcomponents/shadycss/src/css-parse.js","node_modules/@webcomponents/shadycss/src/style-settings.js","node_modules/@webcomponents/shadycss/src/common-regex.js","node_modules/@webcomponents/shadycss/src/unscoped-style-handler.js","node_modules/@webcomponents/shadycss/src/style-util.js","node_modules/@webcomponents/shadycss/src/style-transformer.js","node_modules/@webcomponents/shadycss/src/style-info.js","node_modules/@webcomponents/shadycss/src/style-properties.js","node_modules/@webcomponents/shadycss/src/style-placeholder.js","node_modules/@webcomponents/shadycss/src/style-cache.js","node_modules/@webcomponents/shadycss/src/document-watcher.js","node_modules/@webcomponents/shadycss/src/template-map.js","node_modules/@webcomponents/shadycss/src/apply-shim-utils.js","node_modules/@webcomponents/shadycss/src/document-wait.js","node_modules/@webcomponents/shadycss/src/scoping-shim.js","node_modules/@webcomponents/shadycss/src/common-utils.js","node_modules/@webcomponents/shadycss/entrypoints/scoping-shim.js","src/post-polyfill.js","src/unresolved.js"],"names":["$jscomp.global","$jscomp.defineProperty","$jscomp.initSymbol","$jscomp.Symbol","$jscomp.SYMBOL_PREFIX","$jscomp.arrayIterator","$jscomp.initSymbolIterator","$jscomp.iteratorPrototype","scope","newCustomEvent","type","params","window","CustomEvent","event","document","createEvent","initCustomEvent","bubbles","cancelable","detail","importForElement","element","useNative","ownerDocument","doc","parentNode","closest","importSelector","isImportLink","whenImportsReady","callback","imports","QSA","rootImportSelector","pending","length","forEach","imp","whenElementLoaded","whenDocumentReady","stateChanged","readyState","body","removeEventListener","addEventListener","whenReady","localName","src","firstChild","onLoadingDone","isIE","node","nodeType","Node","ELEMENT_NODE","rel","constructor","Importer","documents","inflight","dynamicImportsMO","MutationObserver","m","handleMutations","observe","head","childList","subtree","loadImports","replaceScripts","fragment","template","content","scriptsSelector","script","clone","createElement","attributes","attr","setAttribute","name","value","textContent","replaceChild","selector","childNodes","querySelectorAll","emptyNodeList","list","inverseOrder","increment","i","link","currentScript","Object","defineProperty","get","scripts","configurable","CSS_URL_REGEXP","CSS_IMPORT_REGEXP","STYLESHEET_REGEXP","Path","fixUrls","base","href","resolveUrl","getAttribute","r","replaceUrls","text","linkUrl","regexp","replace","pre","url","post","urlPath","undefined","__workingURL","u","URL","pathname","e","__tempDoc","implementation","createHTMLDocument","__base","appendChild","__anchor","Xhr","async","load","success","fail","match","pieces","split","resource","header","indexOf","atob","decodeURIComponent","request","XMLHttpRequest","open","onload","request.onload","redirectedUrl","responseURL","getResponseHeader","location","origin","protocol","host","response","responseText","status","send","test","navigator","userAgent","links","loadImport","fireEventIfNeeded","makeDocument","processImportsIfLoadingDone","createDocumentFragment","p1","p2","innerHTML","baseEl","querySelector","removeAttribute","n$","importDependenciesSelector","inlineScriptIndex","n","importDependencyAttr","encodeURIComponent","num","disconnect","flatten","scriptsOk","stylesOk","fireEvents","waitForStyles","runScripts","DOCUMENT_FRAGMENT_NODE","cloneScript","l","s","s$","pendingScriptsSelector","pendingStylesSelector","needsMove","disabledLinkSelector","placeholder","insertBefore","nextSibling","newSibling","import","dispatchEvent","eventType","mutations","addedNodes","elem","importer","imps","target","native_baseURI","getOwnPropertyDescriptor","prototype","klass","Element","ownerDoc","call","enumerable","HTMLLinkElement","HTMLImports","ShadyData","publicRoot","root","dirty","flattenedNodes","_prevAssignedSlot","_previouslyAssignedNodes","assignedSlot","assignedNodes","observer","previousSibling","lastChild","ownerShadyRoot","__insideAccessors","__outsideAccessors","toJSON","ensureShadyDataForNode","__shady","shadyDataForNode","settings","hasNativeShadowDOM","attachShadow","getRootNode","desc","hasDescriptors","inUse","IS_IE","IS_EDGE","useNativeAccessors","isTrackingLogicalChildNodes","nodeData","isShadyRoot","obj","_localName","ownerShadyRootForNode","p","matches","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","extend","source","getOwnPropertyNames","pd","extendAll","sources","mixin","twiddle","createTextNode","queue","shift","characterData","microtask","push","hasDocumentContains","contains","container","flushList","scheduled","enqueue","flush","didFlush","AsyncObserver","_scheduled","removedNodes","callbacks","Set","schedule","takeRecords","cb","observeChildren","sd","add","_callback","_observer","_node","unobserveChildren","handle","delete","size","filterMutations","targetRootNode","map","mutation","mutationInScope","nodes","Array","from","filter","create","removeChild","cloneNode","importNode","Document","windowAddEventListener","Window","windowRemoveEventListener","HTMLElement","getElementById","elementQuerySelector","fragmentQuerySelector","DocumentFragment","documentQuerySelector","elementQuerySelectorAll","fragmentQuerySelectorAll","documentQuerySelectorAll","DOCUMENT_NODE","escapeAttrRegExp","escapeDataRegExp","escapeReplace","c","makeSet","arr","set","voidElements","plaintextParents","getInnerHTML","c$","child","tagName","attrs","TEXT_NODE","data","COMMENT_NODE","console","error","Error","nodeWalker","createTreeWalker","NodeFilter","SHOW_ALL","elementWalker","SHOW_ELEMENT","currentNode","parentElement","firstElementChild","lastElementChild","previousElementSibling","nextElementSibling","children","textWalker","SHOW_TEXT","nextNode","nodeValue","nativeProtos","findNodeDescriptor","proto","hasOwnProperty","nodeAccessors","fragmentAccessors","documentAccessors","slice","accessors","nativeTreeAccessors","nativeTreeWalker","clearNode","inertDoc","nativeIsConnectedAccessors","nativeIsConnected","nativeActiveElementDescriptor","OutsideAccessors","ClassNameAccessor","className","InsideAccessors","item","childNodes.item","index","childElementCount","tc","cn","join","nativeAccessors","children.item","containerName","htmlContainer","ShadowRootAccessor","shadowRoot","ActiveElementAccessor","activeElement","active","nativeContains","activeRoot","patchAccessorGroup","descriptors","force","objDesc","warn","patchAccessors","patchShadowRootAccessors","ShadyRoot","__proto__","defineProperties","nodeName","prop","patchOutsideElementAccessors","patchInsideElementAccessors","linkNode","ref_node","containerData","ref_nodeData","psd","nsd","recordChildNodes","parent","refData","ownerRoot","slotsAdded","slots","_ensureSlotData","_pendingSlots","_slotList","_slotMap","$jscomp.arrayFromIterator","$jscomp.makeIterator","_asyncRender","resetTo","parentData","hasShadowRootWithSlot","preventNativeInsert","firstComposedNode","nativeMethods","scheduleObserver","preventNativeRemove","removeOwnerShadyRoot","changeSlotContent","_validateSlots","slot","splice","x","didRemove","removingInsertionPoint","composed","flattened","_hasInsertionPoint","distributeAttributeChange","oldName","__slotName","_nameForSlot","_sortSlots","addedNode","removedNode","documentElement","query","matcher","halter","queryElements","elements","result","scopingShim","deep","nc","eventWrappersName","Date","now","alwaysComposed","pathComposer","startNode","composedPath","current","startRoot","retarget","refNode","path","refNodePath","ancestor","lastRoot","rootIdx","eventMixin","isTrusted","__composed","__composedPath","currentTarget","relatedTarget","__relatedTarget","__relatedTargetComposedPath","stopPropagation","Event","__propagationStopped","stopImmediatePropagation","__immediatePropagationStopped","mixinComposedFlag","Base","klazz","options","nonBubblingEventsToRetarget","hasRetargeted","fireHandlers","phase","hs","__handlers","fn","retargetNonBubblingEvent","AT_TARGET","lastFiredRoot","findListener","wrappers","capture","once","passive","savedType","savedListener","savedCapture","savedOnce","savedPassive","savedNode","fnOrObj","optionsOrCapture","handlerType","handleEvent","__shadyTarget","wrapperFn","patchEvent","lastCurrentTargetDesc","eventPhase","BUBBLING_PHASE","CAPTURING_PHASE","ret","ael","idx","activateFocusEventOverrides","ev","getPrototypeOf","patchProto","__sourceProto","PatchedEvent","PatchedCustomEvent","PatchedMouseEvent","MouseEvent","newSplice","addedCount","removed","calcSplices","currentEnd","old","oldEnd","currentStart","oldStart","prefixCount","suffixCount","minLength","Math","min","currentValue","previousValue","index1","index2","count","equals","rowCount","columnCount","distances","j","north","west","edits","EDIT_ADD","EDIT_DELETE","northWest","EDIT_LEAVE","EDIT_UPDATE","reverse","splices","oldIndex","ShadyRootConstructionToken","ancestorList","ancestors","unshift","token","TypeError","SHADYROOT_NAME","_mode","mode","hostData","MODE_CLOSED","rootData","_renderPending","_render","renderRoot","_distribute","slotData","_distributeNodeToSlot","slotParentRoot","slotParentData","_addAssignedToFlattenedNodes","prevAssignedNodes","_fireSlotChange","_compose","composeList","targetNode","distributedNode","d","next","forcedSlot","oldSlot","CATCHALL_NAME","assigned","nestedAssigned","slotNamesToSort","_mapSlots","sort","a","b","listA","listB","nA","nB","getAssignedSlot","windowMixin","bind","nodeMixin","IsConnectedAccessor","isConnected","textMixin","fragmentMixin","o","slotMixin","elementMixin","documentMixin","id","nativeBlur","blur","htmlElementMixin","shadowActive","shadowRootMixin","patchBuiltin","ShadyDOM","patch","nativeHTMLElement","Text","HTMLSlotElement","ShadowRoot","reservedTagList","isValidCustomElementName","reserved","has","validForm","nativeValue","__CE_isImportDocument","nextSiblingOrAncestorSibling","start","walkDeepDescendantElements","visitedImports","__CE_shadowRoot","setPropertyUnchecked","destination","CustomElementInternals","_localNameToDefinition","Map","_constructorToDefinition","_patches","_hasPatches","setDefinition","definition","addPatch","listener","patchTree","__CE_patched","connectTree","custom","__CE_state","connectedCallback","upgradeElement","disconnectTree","disconnectedCallback","patchAndUpgradeTree","upgrade","gatherElements","__CE_hasRegistry","__CE_documentLoadHandled","clonedVisitedImports","defaultView","localNameToDefinition","constructionStack","pop","failed","__CE_definition","attributeChangedCallback","observedAttributes","oldValue","newValue","namespace","DocumentConstructionObserver","internals","_internals","_document","_handleMutations","Deferred","_resolve","_value","_promise","Promise","resolve","CustomElementRegistry","_elementDefinitionIsRunning","_whenDefinedDeferred","_flushCallback","this._flushCallback","_flushPending","_pendingDefinitions","_documentConstructionObserver","CustomElementRegistry$$module$node_modules$$webcomponents$custom_elements$src$CustomElementRegistry.prototype","?.prototype","define","Function","SyntaxError","getCallback","callbackValue","adoptedCallback","_flush","pendingDefinitions","elementsWithStableDefinitions","elementsWithPendingDefinitions","pendingElements","pendingUpgradableElements","deferred","CustomElementRegistry$$module$node_modules$$webcomponents$custom_elements$src$CustomElementRegistry_prototype$whenDefined","whenDefined","reject","prior","some","polyfillWrapFlushCallback","outer","inner","Document_createElement","Document_createElementNS","createElementNS","Document_importNode","Document_prepend","Document_append","DocumentFragment_prepend","DocumentFragment_append","Node_cloneNode","Node_appendChild","Node_insertBefore","Node_removeChild","Node_replaceChild","Node_textContent","Element_attachShadow","Element_innerHTML","Element_getAttribute","Element_setAttribute","Element_removeAttribute","Element_getAttributeNS","getAttributeNS","Element_setAttributeNS","setAttributeNS","Element_removeAttributeNS","removeAttributeNS","Element_insertAdjacentElement","Element_insertAdjacentHTML","Element_prepend","Element_append","Element_before","Element_after","Element_replaceWith","Element_remove","HTMLElement_innerHTML","HTMLElement_insertAdjacentElement","HTMLElement_insertAdjacentHTML","$jscompDefaultExport","AlreadyConstructedMarker","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Document_createElement.call","setPrototypeOf","lastIndex","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.HTMLElement","builtIn","appendPrependPatch","builtInMethod","connectedElements","apply","prepend","append","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Document_importNode.call","NS_HTML","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Document_createElementNS.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Document_prepend","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Document_append","patch_textContent","baseDescriptor","assignedValue","childNodesLength","insertedNodes","nativeResult","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_insertBefore.call","nodeWasConnected","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_appendChild.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_cloneNode.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_removeChild.call","nodeToInsert","nodeToRemove","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_replaceChild.call","nodeToInsertWasConnected","thisIsConnected","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_textContent","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_textContent.get","parts","beforeAfterPatch","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_before","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_after","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_replaceWith","wasConnected","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_remove","patch_innerHTML","htmlString","removedElements","patch_insertAdjacentElement","baseMethod","position","insertedElement","patch_insertAdjacentHTML","upgradeNodesInRange","end","toLowerCase","marker","String","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_attachShadow","init","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_attachShadow.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_innerHTML","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_innerHTML.get","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.HTMLElement_innerHTML","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.HTMLElement_innerHTML.get","isTemplate","rawElement","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_setAttribute.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_getAttribute.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_setAttributeNS.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_getAttributeNS.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_removeAttribute.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_removeAttributeNS.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.HTMLElement_insertAdjacentElement","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_insertAdjacentElement","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.HTMLElement_insertAdjacentHTML","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_insertAdjacentHTML","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_prepend","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_append","priorCustomElements","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.DocumentFragment_prepend","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.DocumentFragment_append","customElements","StyleNode","parse","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.comments","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.port","parseCss","OPEN_BRACE","previous","CLOSE_BRACE","t","substring","trim","ss","_expandUnicodeEscapes","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.multipleSpaces","lastIndexOf","AT_START","MEDIA_START","types$$module$node_modules$$webcomponents$shadycss$src$css_parse.MEDIA_RULE","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.keyframesRule","types$$module$node_modules$$webcomponents$shadycss$src$css_parse.KEYFRAMES_RULE","VAR_START","types$$module$node_modules$$webcomponents$shadycss$src$css_parse.MIXIN_RULE","types$$module$node_modules$$webcomponents$shadycss$src$css_parse.STYLE_RULE","r$","code","repeat","stringify","preserveProperties","cssText","rules","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.customProp","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.mixinProp","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.mixinApply","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.varApply","STYLE_RULE","KEYFRAMES_RULE","MEDIA_RULE","MIXIN_RULE","comments","port","customProp","mixinProp","mixinApply","varApply","keyframesRule","multipleSpaces","nativeShadow","nativeCssVariables_","calcCssVariables","CSS","supports","ShadyCSS","nativeCss","nativeCssVariables","VAR_ASSIGN","MIXIN_MATCH","VAR_CONSUMED","ANIMATION_MATCH","MEDIA_MATCH","BRACKETED","styleTextSet","toCssText","forEachRule","rulesForStyle","style","isKeyframesSelector","rule","styleRuleCallback","keyframesRuleCallback","onlyActiveRules","skipRules","matchMedia","applyCss","moniker","contextNode","applyStyle","lastHeadApplyNode","compareDocumentPosition","DOCUMENT_POSITION_PRECEDING","processVariableAndFallback","str","level","prefix","suffix","comma","fallback","setElementClassRaw","getIsExtends","typeExtension","is","extends","StyleTransformer","dom","shouldRemoveScope","_transformDom","_content","classList","remove","SCOPE_NAME","CLASS","elementStyles","styleRules","cssBuildType","css","ext","hostScope","_calcHostScope","CSS_CLASS_PREFIX","isScoped","transformedSelector","_transformRuleCss","self","_transformComplexSelector","transformer","p$","COMPLEX_SELECTOR_SEP","_twiddleNthPlus","NTH","inside","stop","isNth","SLOTTED_START","HOST","SIMPLE_SELECTOR_SEP","info","_transformCompoundSelector","combinator","slottedIndex","SLOTTED","_transformHostSelector","_transformSimpleSelector","slotted","SLOTTED_PAREN","paren","DIR_PAREN","before","dir","PSEUDO_PREFIX","HOST_PAREN","SIMPLE_SELECTOR_PREFIX","typeSelector","SELECTOR_NO_MATCH","normalizeRootSelector","ROOT","_transformDocumentSelector","SCOPE_DOC_SELECTOR","$jscomp.global.Object.defineProperties","RegExp","StyleInfo","ast","ownStylePropertyNames","overrideStyleProperties","customStyle","scopeSelector","styleProperties","styleInfo","_getStyleRules","method","StyleProperties","decorateStyles","props","keyframes","ruleIndex","decorateRule","propertyInfo","exec","onKeyframesRule","_keyframes","names","properties","collectProperties","hasProperties","assign","any","valueForProperty","property","valueForProperties","propertyValue","colon","pp","propertyDataFromStyles","selectorToMatch","parseInt","key","whenHostOrRootRule","cssBuild","parsedSelector","isRoot","isHost","hostAndRootPropertiesForScope","hostProps","rootProps","_element","transformStyles","hostSelector","hostRx","HOST_PREFIX","rxHostSelector","HOST_SUFFIX","StyleInfo$$module$node_modules$$webcomponents$shadycss$src$style_info.get","keyframeTransforms","_elementKeyframeTransforms","output","input","hasAnimations","keyframeNamesToTransform","keyframe","transform","keyframesRules","keyframesNameRx","transformedKeyframesName","scopeId","_keyframesRuleTransformer","applyCustomStyle","XSCOPE_NAME","placeholderMap","ce","origDefine","wrappedDefine","clazz","placeHolder","createComment","after","StyleCache","cache","store","tagname","styleElement","typeMax","fetch","ownPropertyNames","entry","pn","handler","mxns","mxn","classes","hasAttribute","currentScope","newScope","unscoped","delayedStart","requestAnimationFrame","module$node_modules$$webcomponents$shadycss$src$document_watcher.flush","templateMap","promise","invalidate","elementName","templateIsValid","startValidatingTemplate","_validating","then","readyPromise","resolveFn","documentWait","styleCache","ScopingShim","_scopeCounter","_documentOwner","_documentOwnerStyleInfo","StyleInfo$$module$node_modules$$webcomponents$shadycss$src$style_info.set","_elementsHaveApplied","_customStyleInterface","_applyShim","_ensure","ScopingShim$$module$node_modules$$webcomponents$shadycss$src$scoping_shim.prototype","ScopingShim$$module$node_modules$$webcomponents$shadycss$src$scoping_shim_prototype$flush","getStyleAst","styleAstToString","prepareTemplate","_prepared","styleTextParts","styles","scopingAttribute","newStyle","__cssBuild","_cssBuild","shadowroot","_style","_ownPropertyNames","_ensureCustomStyleInterface","CustomStyleInterface","transformCustomStyleForDocument","flushCustomStyles","_ensureApplyShim","ApplyShim","customStyles","_revalidateCustomStyleApplyShim","_updateProperties","_applyCustomStyles","styleDocument","overrideProps","_isRootOwner","removeProperty","setProperty","cachedStyle","cacheEntry","oldScopeSelector","cachedScopeSelector","applyElementStyle","v","_styleOwnerForNode","owner","ownerStyleInfo","hostAndRootProps","propertiesMatchingHost","propertyData","overrides","reify","styleSubtree","shadowChildren","documentRule","_transformRule","getComputedStyleValue","getComputedStyle","getPropertyValue","setElementClass","classString","scopeName","classAttr","k$","_styleInfoForNode","elementExtends","Template","WebComponents","flushCallback","runAndClearCallback","bootstrap","origWhenReady","ready"],"mappings":"A;;;;;;;;;;;;;;;;;;aASA,IAAA,CAAA,CCkCAA,EAb2B,WAAlB,EAAC,MAAO,OAAR,EAAiC,MAAjC,GAa0B,IAb1B,CAa0B,IAb1B,CAEe,WAAlB,EAAC,MAAO,OAAR,EAA2C,IAA3C,EAAiC,MAAjC,CAAmD,MAAnD,CAW6B,IDlCnC,CE2BAC,GAC4D,UAAxD,EAAsB,MAAO,OAAA,iBAA7B,CACA,MAAA,eADA,CAEA,QAAQ,CAAC,CAAD,CAAS,CAAT,CAAmB,CAAnB,CAA+B,CAOjC,CAAJ,EAAc,KAAA,UAAd,EAAiC,CAAjC,EAA2C,MAAA,UAA3C,GACA,CAAA,CAAO,CAAP,CADA,CACmB,CAAA,MADnB,CAPqC,CCZtB,SAAA,GAAQ,EAAG,CAE9BC,EAAA,CAAqB,QAAQ,EAAG,EAE3BF,EAAA,OAAL,GACEA,CAAA,OADF,CAC6BG,EAD7B,CAJ8B,CAehC,IAAAA,GAAuD,QAAQ,EAAG,CAChE,IAAI,EAAU,CAUd,OAJA,SAAe,CAAC,CAAD,CAAkB,CAC/B,MA9BoBC,gBA8BpB,EAC6B,CAD7B,EACgD,EADhD,EACuD,CAAA,EAFxB,CAP+B,CAAZ,EAoBzB;QAAA,GAAQ,EAAG,CACtCF,EAAA,EACA,KAAI,EAAiBF,CAAA,OAAA,SAChB,EAAL,GACE,CADF,CACmBA,CAAA,OAAA,SADnB,CAEMA,CAAA,OAAA,CAAyB,UAAzB,CAFN,CAK8C,WAA9C,EAAI,MAAO,MAAA,UAAA,CAAgB,CAAhB,CAAX,EACEC,EAAA,CACI,KAAA,UADJ,CACqB,CADrB,CACqC,CAC/B,aAAc,CAAA,CADiB,CAE/B,SAAU,CAAA,CAFqB,CAO/B,MAAO,QAAQ,EAAG,CAChB,MAAOI,GAAA,CAAsB,IAAtB,CADS,CAPa,CADrC,CAeFC,GAAA,CAA6B,QAAQ,EAAG,EAxBF,CAkChB,QAAA,GAAQ,CAAC,CAAD,CAAQ,CACtC,IAAI,EAAQ,CACZ,OAAOC,GAAA,CAA0B,QAAQ,EAAG,CAC1C,MAAI,EAAJ,CAAY,CAAA,OAAZ,CACS,CACL,KAAM,CAAA,CADD,CAEL,MAAO,CAAA,CAAM,CAAA,EAAN,CAFF,CADT,CAMS,CAAC,KAAM,CAAA,CAAP,CAPiC,CAArC,CAF+B,CA0BZ,QAAA,GAAQ,CAAC,CAAD,CAAO,CACzCD,EAAA,EAEI,EAAA,CAAW,CAAC,KAAM,CAAP,CAKf,EAAA,CAASN,CAAA,OAAA,SAAT,CAAA,CAA8C,QAAQ,EAAG,CAAE,MAAO,KAAT,CACzD,OAAyC,EATA,CC5FpB,QAAA,GAAQ,CAAC,CAAD,CAAW,CACxCM,EAAA,EAGA,KAAI,EAAqC,CAAD,CAAW,MAAA,SAAX,CACxC,OAAO,EAAA,CAAmB,CAAA,KAAA,CAAsB,CAAtB,CAAnB,CACHD,EAAA,CAA6C,CAA7C,CANoC;ACEd,QAAA,GAAQ,CAAC,CAAD,CAAW,CAG7C,IAFA,IAAI,CAAJ,CACI,EAAM,EACV,CAAO,CAAC,CAAC,CAAD,CAAK,CAAA,KAAA,EAAL,MAAR,CAAA,CACE,CAAA,KAAA,CAAS,CAAA,MAAT,CAEF,OAAO,EANsC;ALvB9C,SAAA,CAAAG,CAAA,CAAS,CAsqBeC,QAAA,EAAA,CAACC,CAAD,CAAOC,CAAP,CAAkB,CACvC,GAAkC,UAAlC,GAAI,MAAOC,OAAAC,YAAX,CACE,MAAO,KAAIA,WAAJ,CAAgBH,CAAhB,CAAsBC,CAAtB,CAET,KAAMG,EAAqCC,QAAAC,YAAA,CAAqB,aAArB,CAC3CF,EAAAG,gBAAA,CAAsBP,CAAtB,CAA4B,CAAA,CAAQC,CAAAO,QAApC,CAAqD,CAAA,CAAQP,CAAAQ,WAA7D,CAAiFR,CAAAS,OAAjF,CACA,OAAON,EANgC,CAjChBO,QAAA,EAAA,CAAAC,CAAA,CAAW,CAClC,GAAIC,CAAJ,CAEE,MAAOD,EAAAE,cAAA,GAA0BT,QAA1B,CAAqCO,CAAAE,cAArC,CAA6D,IAEtE,KAAIC,EAAMH,CAAA,YACV,IAAI,CAACG,CAAL,EAAYH,CAAAI,WAAZ,CAAgC,CAC9BD,CAAA,CAA+BH,CAAAI,WAC/B,IAA2B,UAA3B,GAAI,MAAOD,EAAAE,QAAX,CAGEF,CAAA,CAAMA,CAAAE,QAAA,CAndWC,kBAmdX,CAHR,KAME,KAAA,CAAO,CAACC,CAAA,CAAaJ,CAAb,CAAR,GAA8BA,CAA9B,CAAoCA,CAAAC,WAApC,EAAA,EAEFJ,CAAA,YAAA,CAAyBG,CAVK,CAYhC,MAAOA,EAlB2B,CApBXK,QAAA,EAAA,CAAAC,CAAA,CAAY,CACnC,IAAIC,EACDC,CAAA,CAAIlB,QAAJ,CAvasBmB,2CAuatB,CADH;AAEIC,EAAUH,CAAAI,OACTD,EAAL,CAIAE,CAAA,CAAQL,CAAR,CAAiB,QAAA,CAAAM,CAAA,CAAO,CAAA,MAAAC,EAAA,CAAkBD,CAAlB,CAAuB,QAAA,EAAM,CACjC,CAAlB,GAAI,EAAEH,CAAN,EACEJ,CAAA,EAFiD,CAA7B,CAAA,CAAxB,CAJA,CACEA,CAAA,EALiC,CAlBXS,QAAA,EAAA,CAAAT,CAAA,CAAY,CACfU,QAAA,EAAA,EAAM,CAGG,SAA5B,GAAI1B,QAAA2B,WAAJ,EAA2C3B,QAAA4B,KAA3C,GACE5B,QAAA6B,oBAAA,CAA6B,kBAA7B,CAAiDH,CAAjD,CACA,CAAAV,CAAA,EAFF,CAHyB,CAQ3BhB,QAAA8B,iBAAA,CAA0B,kBAA1B,CAA8CJ,CAA9C,CACAA,EAAA,EAVoC,CAXpBK,QAAA,EAAA,CAAAf,CAAA,CAAY,CAG5BS,CAAA,CAAkB,QAAA,EAAM,CAAA,MAAAV,EAAA,CAAiB,QAAA,EAAM,CAAA,MAAAC,EAAA,EAAYA,CAAA,EAAZ,CAAvB,CAAA,CAAxB,CAH4B,CAhCJQ,QAAA,EAAA,CAACjB,CAAD,CAAUS,CAAV,CAAuB,CAC/C,GAAIT,CAAA,SAAJ,CACES,CAAA,EAAYA,CAAA,EADd,KAEO,IAA2B,QAA3B,GAAKT,CAAAyB,UAAL,EAAuC,CAACzB,CAAA0B,IAAxC,EACkB,OADlB,GACJ1B,CAAAyB,UADI,EAC6B,CAACzB,CAAA2B,WAD9B,CAIL3B,CAAA,SACA,CADsB,CAAA,CACtB,CAAAS,CAAA,EAAYA,CAAA,EALP,KAMA,CACL,IAAMmB,EAAgBA,QAAA,CAAApC,CAAA,CAAS,CAC7BQ,CAAAsB,oBAAA,CAA4B9B,CAAAJ,KAA5B;AAAwCwC,CAAxC,CACA5B,EAAA,SAAA,CAAsB,CAAA,CACtBS,EAAA,EAAYA,CAAA,EAHiB,CAK/BT,EAAAuB,iBAAA,CAAyB,MAAzB,CAAiCK,CAAjC,CAKKC,GAAL,EAAmC,OAAnC,GAAa7B,CAAAyB,UAAb,EACEzB,CAAAuB,iBAAA,CAAyB,OAAzB,CAAkCK,CAAlC,CAZG,CATwC,CAX5BrB,QAAA,EAAA,CAAAuB,CAAA,CAAQ,CAC3B,MAAOA,EAAAC,SAAP,GAAyBC,IAAAC,aAAzB,EAAiE,MAAjE,GAA8CH,CAAAL,UAA9C,EACmD,QADnD,GACqCK,CAADI,IAFT,CA9U3BC,QADIC,EACO,EAAG,CAAA,IAAA,EAAA,IACZ,KAAAC,EAAA,CAAiB,EAGjB,KAAAC,EAAA,CAAgB,CAChB,KAAAC,EAAA,CAAwB,IAAIC,gBAAJ,CAAqB,QAAA,CAAAC,CAAA,CAAK,CAAA,MAAA,EAAAC,GAAA,CAAqBD,CAArB,CAAA,CAA1B,CAExB,KAAAF,EAAAI,QAAA,CAA8BlD,QAAAmD,KAA9B,CAA6C,CAC3CC,UAAW,CAAA,CADgC,CAE3CC,QAAS,CAAA,CAFkC,CAA7C,CAQA,KAAAC,YAAA,CAAiBtD,QAAjB,CAfY,CApKOuD,QAAA,EAAA,CAACC,CAAD,CAAc,CACnClC,CAAA,CAAQJ,CAAA,CAAIsC,CAAJ,CAAc,UAAd,CAAR,CAAmC,QAAA,CAAAC,CAAA,CAAY,CAC7CnC,CAAA,CAAQJ,CAAA,CAAIuC,CAAAC,QAAJ,CA2IYC,yFA3IZ,CAAR;AAAgD,QAAA,CAAAC,CAAA,CAAU,CACxD,IAAMC,EACH7D,QAAA8D,cAAA,CAAuB,QAAvB,CACHxC,EAAA,CAAQsC,CAAAG,WAAR,CAA2B,QAAA,CAAAC,CAAA,CAAQ,CAAA,MAAAH,EAAAI,aAAA,CAAmBD,CAAAE,KAAnB,CAA8BF,CAAAG,MAA9B,CAAA,CAAnC,CACAN,EAAAO,YAAA,CAAoBR,CAAAQ,YACpBR,EAAAjD,WAAA0D,aAAA,CAA+BR,CAA/B,CAAsCD,CAAtC,CALwD,CAA1D,CAOAL,EAAA,CAAeE,CAAAC,QAAf,CAR6C,CAA/C,CADmC,CAZzBxC,QAAA,EAAA,CAACmB,CAAD,CAAOiC,CAAP,CAAoB,CAG9B,MAAKjC,EAAAkC,WAAAlD,OAAL,CAGOgB,CAAAmC,iBAAA,CAAsBF,CAAtB,CAHP,CACSG,EAJqB,CAdhBnD,QAAA,EAAA,CAACoD,CAAD,CAAO1D,CAAP,CAAiB2D,CAAjB,CAAkC,CAChD,IAAMtD,EAASqD,CAAA,CAAOA,CAAArD,OAAP,CAAqB,CAApC,CACMuD,EAAYD,CAAA,CAAgB,EAAhB,CAAoB,CAEtC,KADIE,CACJ,CADQF,CAAA,CAAetD,CAAf,CAAwB,CAAxB,CAA4B,CACpC,CAAOwD,CAAP,CAAWxD,CAAX,EAA0B,CAA1B,EAAqBwD,CAArB,CAAiCA,CAAjC,EAAqCD,CAArC,CACE5D,CAAA,CAAS0D,CAAA,CAAKG,CAAL,CAAT,CAAkBA,CAAlB,CAL8C,CA1BlD,IAAMC,EAAO9E,QAAA8D,cAAA,CAAuB,MAAvB,CAAb,CACMtD,EAAoB,QAApBA,EAAgCsE,EADtC,CAEML,GAAgBK,CAAAN,iBAAA,CAAsB,GAAtB,CAFtB,CAKIO,GAAgB,IACgB,EAAA,CAApC,GAAI,eAAJ,EAAuB/E,SAAvB,EACEgF,MAAAC,eAAA,CAAsBjF,QAAtB,CAAgC,eAAhC;AAAiD,CAC/C,IAAAkF,QAAG,EAAG,CACJ,MAAOH,GAAP,GAK2B,UAAxB,GAAA/E,QAAA2B,WAAA,CACC3B,QAAAmF,QAAA,CAAiBnF,QAAAmF,QAAA9D,OAAjB,CAA2C,CAA3C,CADD,CACiD,IANpD,CADI,CADyC,CAU/C+D,aAAc,CAAA,CAViC,CAAjD,CA2DF,KAAMC,GAAiB,qBAAvB,CACMC,GAAoB,oCAD1B,CAEMC,GAAoB,iDAF1B,CAMMC,EAAO,CAEX,GAAAC,QAAO,CAAClF,CAAD,CAAUmF,CAAV,CAAgB,CACjBnF,CAAAoF,KAAJ,EACEpF,CAAA0D,aAAA,CAAqB,MAArB,CACEuB,CAAAI,EAAA,CAAgBrF,CAAAsF,aAAA,CAAqB,MAArB,CAAhB,CAA8CH,CAA9C,CADF,CAGEnF,EAAA0B,IAAJ,EACE1B,CAAA0D,aAAA,CAAqB,KAArB,CACEuB,CAAAI,EAAA,CAAgBrF,CAAAsF,aAAA,CAAqB,KAArB,CAAhB,CAA6CH,CAA7C,CADF,CAGF,IAA0B,OAA1B,GAAInF,CAAAyB,UAAJ,CAAmC,CACjC,IAAM8D,EAAIN,CAAAO,GAAA,CAAiBxF,CAAA6D,YAAjB,CAAsCsB,CAAtC,CAA4CL,EAA5C,CACV9E,EAAA6D,YAAA,CAAsBoB,CAAAO,GAAA,CAAiBD,CAAjB,CAAoBJ,CAApB,CAA0BJ,EAA1B,CAFW,CATd,CAFZ,CAiBX,GAAAS,QAAW,CAACC,CAAD,CAAOC,CAAP,CAAgBC,CAAhB,CAAwB,CACjC,MAAOF,EAAAG,QAAA,CAAaD,CAAb;AAAqB,QAAA,CAAClD,CAAD,CAAIoD,CAAJ,CAASC,CAAT,CAAcC,CAAd,CAAuB,CAC7CC,CAAAA,CAAUF,CAAAF,QAAA,CAAY,OAAZ,CAAqB,EAArB,CACVF,EAAJ,GACEM,CADF,CACYf,CAAAI,EAAA,CAAgBW,CAAhB,CAAyBN,CAAzB,CADZ,CAGA,OAAOG,EAAP,CAAa,GAAb,CAAoBG,CAApB,CAA8B,GAA9B,CAAqCD,CALY,CAA5C,CAD0B,CAjBxB,CA2BX,EAAAV,QAAU,CAACS,CAAD,CAAMX,CAAN,CAAY,CAEpB,GAA0Bc,IAAAA,EAA1B,GAAIhB,CAAAiB,EAAJ,CAAqC,CACnCjB,CAAAiB,EAAA,CAAoB,CAAA,CACpB,IAAI,CACF,IAAMC,EAAI,IAAIC,GAAJ,CAAQ,GAAR,CAAa,UAAb,CACVD,EAAAE,SAAA,CAAa,OACbpB,EAAAiB,EAAA,CAAgC,gBAAhC,GAAqBC,CAAAf,KAHnB,CAIF,MAAOkB,EAAP,CAAU,EANuB,CASrC,GAAIrB,CAAAiB,EAAJ,CACE,MAAOd,CAAC,IAAIgB,GAAJ,CAAQN,CAAR,CAAaX,CAAb,CAADC,MAILjF,EAAAA,CAAM8E,CAAAsB,GACLpG,EAAL,GACEA,CAIA,CAJMV,QAAA+G,eAAAC,mBAAA,CAA2C,MAA3C,CAIN,CAHAxB,CAAAsB,GAGA,CAHiBpG,CAGjB,CAFAA,CAAAuG,GAEA,CAFavG,CAAAoD,cAAA,CAAkB,MAAlB,CAEb,CADApD,CAAAyC,KAAA+D,YAAA,CAAqBxG,CAAAuG,GAArB,CACA,CAAAvG,CAAAyG,GAAA,CAAezG,CAAAoD,cAAA,CAAkB,GAAlB,CALjB,CAOApD,EAAAuG,GAAAtB,KAAA,CAAkBD,CAClBhF,EAAAyG,GAAAxB,KAAA,CAAoBU,CACpB,OAAO3F,EAAAyG,GAAAxB,KAAP,EAA4BU,CA1BR,CA3BX,CANb,CAgEMe,GAAM,CAEVC,MAAO,CAAA,CAFG,CASV,KAAAC,QAAI,CAACjB,CAAD,CAAMkB,CAAN,CAAeC,CAAf,CAAqB,CACvB,GAAKnB,CAAL,CAEO,GAAIA,CAAAoB,MAAA,CAAU,QAAV,CAAJ,CAAyB,CAExBC,CAAAA;AAASrB,CAAAsB,MAAA,CAAU,GAAV,CAEf,KAAIC,EAAWF,CAAA,CAAO,CAAP,CAEbE,EAAA,CAD+B,EAAjC,CAFeF,CAAAG,CAAO,CAAPA,CAEXC,QAAA,CAAe,SAAf,CAAJ,CACaC,IAAA,CAAKH,CAAL,CADb,CAGaI,kBAAA,CAAmBJ,CAAnB,CAEbL,EAAA,CAAQK,CAAR,CAV8B,CAAzB,IAWA,CACL,IAAMK,EAAU,IAAIC,cACpBD,EAAAE,KAAA,CAAa,KAAb,CAAoB9B,CAApB,CAAyBe,EAAAC,MAAzB,CACAY,EAAAG,OAAA,CAAiBC,QAAA,EAAM,CAKrB,IAAIC,EAAgBL,CAAAM,YAAhBD,EAAuCL,CAAAO,kBAAA,CAA0B,UAA1B,CACvCF,EAAJ,EAAoD,CAApD,GAAqBA,CAAAR,QAAA,CAAsB,GAAtB,CAArB,GAIEQ,CAJF,EAGkBG,QAAAC,OAHlB,EAGqCD,QAAAE,SAHrC,CAGyD,IAHzD,CAGgEF,QAAAG,KAHhE,EAI2BN,CAJ3B,CAMA,KAAMV,EAAkCK,CAAAY,SAAlCjB,EAAsDK,CAAAa,aACrC,IAAvB,GAAIb,CAAAc,OAAJ,EAAiD,CAAjD,GAA8Bd,CAAAc,OAA9B,EACoB,GADpB,EACEd,CAAAc,OADF,EAC4C,GAD5C,CAC2Bd,CAAAc,OAD3B,CAEExB,CAAA,CAAQK,CAAR,CAAkBU,CAAlB,CAFF,CAIEd,CAAA,CAAKI,CAAL,CAjBmB,CAoBvBK,EAAAe,KAAA,EAvBK,CAbP,IACExB,EAAA,CAAK,+BAAL,CAFqB,CATf,CAhEZ,CAqHMpF,GAAO,SAAA6G,KAAA,CAAeC,SAAAC,UAAf,CAAP/G,EACJ,YAAA6G,KAAA,CAAkBC,SAAAC,UAAlB,CAqDA;CAAA,UAAA,YAAA,CAAA7F,QAAW,CAAC5C,CAAD,CAAM,CAAA,IAAA,EAAA,IACT0I,EAAAA,CACHlI,CAAA,CAAIR,CAAJ,CArDgBG,kBAqDhB,CACHS,EAAA,CAAQ8H,CAAR,CAAe,QAAA,CAAAtE,CAAA,CAAQ,CAAA,MAAA,EAAAuE,EAAA,CAAgBvE,CAAhB,CAAA,CAAvB,CAHe,CASjB,EAAA,UAAA,EAAA,CAAAuE,QAAU,CAACvE,CAAD,CAAO,CAAA,IAAA,EAAA,IAAA,CACTuB,EAAMvB,CAAAa,KAEZ,IAA4Ba,IAAAA,EAA5B,GAAI,IAAA5D,EAAA,CAAeyD,CAAf,CAAJ,CAAuC,CAGrC,IAAM9E,EAAM,IAAAqB,EAAA,CAAeyD,CAAf,CACR9E,EAAJ,EAAWA,CAAA,SAAX,GACEuD,CAAA,SACA,CADmBvD,CACnB,CAAA,IAAA+H,EAAA,CAAuBxE,CAAvB,CAFF,CAJqC,CAAvC,IAUA,KAAAjC,EAAA,EAGA,CADA,IAAAD,EAAA,CAAeyD,CAAf,CACA,CADsB,SACtB,CAAAe,EAAAE,KAAA,CAASjB,CAAT,CAAc,QAAA,CAACuB,CAAD,CAAWU,CAAX,CAA6B,CACnC5H,CAAAA,CAAM,CAAA6I,GAAA,CAAkB3B,CAAlB,CAA4BU,CAA5B,EAA6CjC,CAA7C,CACZ,EAAAzD,EAAA,CAAeyD,CAAf,CAAA,CAAsB3F,CACtB,EAAAmC,EAAA,EAEA,EAAAS,YAAA,CAAiB5C,CAAjB,CACA,EAAA8I,EAAA,EANyC,CAA3C,CAOG,QAAA,EAAM,CAEP,CAAA5G,EAAA,CAAeyD,CAAf,CAAA,CAAsB,IACtB,EAAAxD,EAAA,EACA,EAAA2G,EAAA,EAJO,CAPT,CAhBe,CAqCjB,EAAA,UAAA,GAAA,CAAAD,QAAY,CAAC3B,CAAD,CAAWvB,CAAX,CAAgB,CAC1B,GAAI,CAACuB,CAAL,CACE,MAAO5H,SAAAyJ,uBAAA,EAGLrH,GAAJ,GAKEwF,CALF,CAKaA,CAAAzB,QAAA,CAAiBZ,EAAjB,CAAoC,QAAA,CAACkC,CAAD,CAAQiC,CAAR,CAAYC,CAAZ,CAAmB,CAChE,MAAgC,EAAhC;AAAIlC,CAAAK,QAAA,CAAc,OAAd,CAAJ,CACY4B,CADZ,CACwC,uBADxC,CAC4CC,CAD5C,CAGOlC,CAJyD,CAAvD,CALb,CAcA,KAAMhE,EACHzD,QAAA8D,cAAA,CAAuB,UAAvB,CACHL,EAAAmG,UAAA,CAAqBhC,CACrB,IAAInE,CAAAC,QAAJ,CACEA,CAGA,CAHUD,CAAAC,QAGV,CAAAH,CAAA,CAAeG,CAAf,CAJF,KAQE,KADAA,CACA,CADU1D,QAAAyJ,uBAAA,EACV,CAAOhG,CAAAvB,WAAP,CAAA,CACEwB,CAAAwD,YAAA,CAAoBzD,CAAAvB,WAApB,CAMJ,IADM2H,CACN,CADenG,CAAAoG,cAAA,CAAsB,MAAtB,CACf,CACEzD,CACA,CADMb,CAAAI,EAAA,CAAgBiE,CAAAhE,aAAA,CAAoB,MAApB,CAAhB,CAA6CQ,CAA7C,CACN,CAAAwD,CAAAE,gBAAA,CAAuB,MAAvB,CAGIC,EAAAA,CACH9I,CAAA,CAAIwC,CAAJ,CAlI4BuG,mNAkI5B,CAEH;IAAIC,EAAoB,CACxB5I,EAAA,CAAQ0I,CAAR,CAAY,QAAA,CAAAG,CAAA,CAAK,CAEf3I,CAAA,CAAkB2I,CAAlB,CACA3E,EAAAC,GAAA,CAAa0E,CAAb,CAAgB9D,CAAhB,CAEA8D,EAAAlG,aAAA,CAvIuBmG,mBAuIvB,CAAqC,EAArC,CAEoB,SAApB,GAAID,CAAAnI,UAAJ,EAAgC,CAACmI,CAAAlI,IAAjC,EAA0CkI,CAAA/F,YAA1C,GAKE+F,CAAAlG,aAAA,CAAe,KAAf,CAAsB,qCAAtB,CAA8DoG,kBAAA,CAH9CF,CAAA/F,YAG8C,EAH9B,kBAG8B,CAHXiC,CAGW,EAJlD6D,CAAAI,CAAoB,GAApBA,CAAwBJ,CAAxBI,CAA8C,EAII,EAHF,OAGE,EAA9D,CAEA,CADAH,CAAA/F,YACA,CADgB,EAChB,CAAA8F,CAAA,EAPF,CAPe,CAAjB,CAiBA,OAAOxG,EA/DmB,CAsE5B,EAAA,UAAA,EAAA,CAAA8F,QAA2B,EAAG,CAAA,IAAA,EAAA,IAE5B,IAAI3G,CAAA,IAAAA,EAAJ,CAAA,CAGA,IAAAC,EAAAyH,WAAA,EACA,KAAAC,QAAA,CAAaxK,QAAb,CAN4B,KAcxByK,EAAY,CAAA,CAdY,CAe1BC,EAAW,CAAA,CAfe,CAgBtBvI,EAAgBA,QAAA,EAAM,CACtBuI,CAAJ,EAAgBD,CAAhB,GAGE,CAAAnH,YAAA,CAAiBtD,QAAjB,CACA,CAAI,CAAA6C,EAAJ,GAGA,CAAAC,EAAAI,QAAA,CAA8BlD,QAAAmD,KAA9B,CAA6C,CAC3CC,UAAW,CAAA,CADgC,CAE3CC,QAAS,CAAA,CAFkC,CAA7C,CAIA;AAAA,CAAAsH,GAAA,EAPA,CAJF,CAD0B,CAe5B,KAAAC,GAAA,CAAmB,QAAA,EAAM,CACvBF,CAAA,CAAW,CAAA,CACXvI,EAAA,EAFuB,CAAzB,CAIA,KAAA0I,GAAA,CAAgB,QAAA,EAAM,CACpBJ,CAAA,CAAY,CAAA,CACZtI,EAAA,EAFoB,CAAtB,CAjCA,CAF4B,CA4C9B,EAAA,UAAA,QAAA,CAAAqI,QAAO,CAAC9J,CAAD,CAAM,CAAA,IAAA,EAAA,IACLsJ,EAAAA,CACH9I,CAAA,CAAIR,CAAJ,CArNgBG,kBAqNhB,CACHS,EAAA,CAAQ0I,CAAR,CAAY,QAAA,CAAAG,CAAA,CAAK,CACf,IAAM5I,EAAM,CAAAqB,EAAA,CAAeuH,CAAAxE,KAAf,CAEZ,EADAwE,CAAA,SACA,CAD0C5I,CAC1C,GAAWA,CAAAe,SAAX,GAA4BC,IAAAuI,uBAA5B,GAGE,CAAAlI,EAAA,CAAeuH,CAAAxE,KAAf,CAIA,CAJyBwE,CAIzB,CAHAA,CAAAxI,WAGA,CAHe,SAGf,CAFAwI,CAAA,SAEA,CAFgBA,CAEhB,CADA,CAAAK,QAAA,CAAajJ,CAAb,CACA,CAAA4I,CAAAjD,YAAA,CAAc3F,CAAd,CAPF,CAHe,CAAjB,CAHW,CAuBb,EAAA,UAAA,GAAA,CAAAsJ,QAAU,CAAC7J,CAAD,CAAW,CAGC+J,QAAA,EAAA,CAAAlG,CAAA,CAAK,CACvB,GAAIA,CAAJ,CAAQmG,CAAR,CAAW,CAKT,IAAMC,EAAIC,CAAA,CAAGrG,CAAH,CAAV,CACMhB,EACH7D,QAAA8D,cAAA,CAAuB,QAAvB,CAEHmH,EAAAlB,gBAAA,CA1OqBK,mBA0OrB,CACA9I,EAAA,CAAQ2J,CAAAlH,WAAR,CAAsB,QAAA,CAAAC,CAAA,CAAQ,CAAA,MAAAH,EAAAI,aAAA,CAAmBD,CAAAE,KAAnB;AAA8BF,CAAAG,MAA9B,CAAA,CAA9B,CAEAY,GAAA,CAAgBlB,CAChBoH,EAAAtK,WAAA0D,aAAA,CAA0BR,CAA1B,CAAiCoH,CAAjC,CACAzJ,EAAA,CAAkBqC,CAAlB,CAAyB,QAAA,EAAM,CAC7BkB,EAAA,CAAgB,IAChBgG,EAAA,CAAYlG,CAAZ,CAAgB,CAAhB,CAF6B,CAA/B,CAdS,CAAX,IAmBE7D,EAAA,EApBqB,CAFzB,IAAMkK,EAAKhK,CAAA,CAAIlB,QAAJ,CA1NgBmL,2BA0NhB,CAAX,CACMH,EAAIE,CAAA7J,OAwBV0J,EAAA,CAAY,CAAZ,CA1BmB,CAiCrB,EAAA,UAAA,GAAA,CAAAH,QAAa,CAAC5J,CAAD,CAAW,CACtB,IAAMkK,EACHhK,CAAA,CAAIlB,QAAJ,CA1PuBoL,kEA0PvB,CADH,CAEIhK,EAAU8J,CAAA7J,OACd,IAAKD,CAAL,CAAA,CASA,IAAMiK,EAAYjJ,EAAZiJ,EAAoB,CAAC,CAACrL,QAAA8J,cAAA,CAnRHwB,iDAmRG,CAC5BhK,EAAA,CAAQ4J,CAAR,CAAY,QAAA,CAAAD,CAAA,CAAK,CAEfzJ,CAAA,CAAkByJ,CAAlB,CAAqB,QAAA,EAAM,CACzBA,CAAAlB,gBAAA,CA/QqBK,mBA+QrB,CACkB,EAAlB,GAAI,EAAEhJ,CAAN,EACEJ,CAAA,EAHuB,CAA3B,CAQA,IAAIqK,CAAJ,EAAiBJ,CAAAtK,WAAjB,GAAkCX,QAAAmD,KAAlC,CAAiD,CAE/C,IAAMoI,EAAcvL,QAAA8D,cAAA,CAAuBmH,CAAAjJ,UAAvB,CAEpBuJ;CAAA,iBAAA,CAAkCN,CAElCM,EAAAtH,aAAA,CAAyB,MAAzB,CAAiC,oBAAjC,CAEAgH,EAAAtK,WAAA6K,aAAA,CAA0BD,CAA1B,CAAuCN,CAAAQ,YAAvC,CAEA,KADIC,CACJ,CADiBpL,CAAA,CAAiB2K,CAAjB,CACjB,CAAOS,CAAP,EAAqBpL,CAAA,CAAiBoL,CAAjB,CAArB,CAAA,CACEA,CAAA,CAAapL,CAAA,CAAiBoL,CAAjB,CAEXA,EAAA/K,WAAJ,GAA8BX,QAAAmD,KAA9B,GACEuI,CADF,CACe,IADf,CAGA1L,SAAAmD,KAAAqI,aAAA,CAA2BP,CAA3B,CAA8BS,CAA9B,CAEAT,EAAAlB,gBAAA,CAAkB,MAAlB,CAlB+C,CAVlC,CAAjB,CAVA,CAAA,IACE/I,EAAA,EALoB,CAkDxB,EAAA,UAAA,GAAA,CAAA2J,QAAU,EAAG,CAAA,IAAA,EAAA,IAAA,CACLX,EACH9I,CAAA,CAAIlB,QAAJ,CA/TgBa,kBA+ThB,CAEHS,EAAA,CAAQ0I,CAAR,CAAY,QAAA,CAAAG,CAAA,CAAK,CAAA,MAAA,EAAAb,EAAA,CAAuBa,CAAvB,CAAA,CAAjB,CAA4C,CAAA,CAA5C,CAJW,CAWb,EAAA,UAAA,EAAA,CAAAb,QAAiB,CAACxE,CAAD,CAAO,CAEjBA,CAAA,SAAL,GACEA,CAAA,SAIA,CAJmB,CAAA,CAInB,CAFAA,CAAA6G,OAEA,GAFgB7G,CAAA6G,OAAAhK,WAEhB,CAFyC,UAEzC,EAAAmD,CAAA8G,cAAA,CAAmBlM,CAAA,CADDoF,CAAA6G,OAAAE,CAAc,MAAdA,CAAuB,OACtB,CAA0B,CAC3C1L,QAAS,CAAA,CADkC;AAE3CC,WAAY,CAAA,CAF+B,CAG3CC,OAAQmG,IAAAA,EAHmC,CAA1B,CAAnB,CALF,CAFsB,CAkBxB,EAAA,UAAA,GAAA,CAAAvD,QAAe,CAAC6I,CAAD,CAAY,CAAA,IAAA,EAAA,IACzBxK,EAAA,CAAQwK,CAAR,CAAmB,QAAA,CAAA9I,CAAA,CAAK,CAAA,MAAA1B,EAAA,CAAQ0B,CAAA+I,WAAR,CAAsB,QAAA,CAAAC,CAAA,CAAQ,CAChDA,CAAJ,EAAYA,CAAA1J,SAAZ,GAA8BC,IAAAC,aAA9B,GAEM1B,CAAA,CAAakL,CAAb,CAAJ,CACE,CAAA3C,EAAA,CAAkD2C,CAAlD,CADF,CAGE,CAAA1I,YAAA,CAA2C0I,CAA3C,CALJ,CADoD,CAA9B,CAAA,CAAxB,CADyB,CAmI7B,KAAIC,GAAW,IAqBf,IAAIzL,CAAJ,CAKQ0L,CAkBN,CAjBGhL,CAAA,CAAIlB,QAAJ,CAxfkBa,kBAwflB,CAiBH,CAhBAS,CAAA,CAAQ4K,CAAR,CAAc,QAAA,CAAA3K,CAAA,CAAO,CACdA,CAAAoK,OAAL,EAA6C,SAA7C,GAAmBpK,CAAAoK,OAAAhK,WAAnB,GACEJ,CAAA,SADF,CACoB,CAAA,CADpB,CADmB,CAArB,CAgBA,CAPMY,CAON,CAPsBA,QAAA,CAAApC,CAAA,CAAS,CACvBiM,CAAAA,CAAgCjM,CAAAoM,OAClCrL,EAAA,CAAakL,CAAb,CAAJ,GACEA,CAAA,SADF,CACqB,CAAA,CADrB,CAF6B,CAO/B,CADAhM,QAAA8B,iBAAA,CAA0B,MAA1B,CAAkCK,CAAlC,CAAiD,CAAA,CAAjD,CACA,CAAAnC,QAAA8B,iBAAA,CAA0B,OAA1B,CAAmCK,CAAnC,CAAkD,CAAA,CAAlD,CAvBF,KAwBO,CAML,IAAMiK,GAAiBpH,MAAAqH,yBAAA,CAAgC9J,IAAA+J,UAAhC;AAAgD,SAAhD,CAGvBtH,OAAAC,eAAA,CAAsBqH,CADR,CAACF,EAADG,EAAmBH,EAAAhH,aAAnBmH,CAAiDhK,IAAjDgK,CAAwDC,OAChDF,WAAtB,CAAuC,SAAvC,CAAkD,CAChD,IAAApH,QAAG,EAAG,CACJ,IAAMuH,EAA2C3L,CAAA,CAAa,IAAb,CAAA,CAAqB,IAArB,CAA4BR,CAAA,CAAiB,IAAjB,CAC7E,OAAImM,EAAJ,CAAqBA,CAAA9G,KAArB,CAEIyG,EAAJ,EAAsBA,EAAAlH,IAAtB,CAAiDkH,EAAAlH,IAAAwH,KAAA,CAAwB,IAAxB,CAAjD,CAGO/G,CADsC3F,QAAA8J,cAAApE,CAAuB,MAAvBA,CACtCC,EAAS9F,MAAA4I,SAAT9C,MAPH,CAD0C,CAUhDP,aAAc,CAAA,CAVkC,CAWhDuH,WAAY,CAAA,CAXoC,CAAlD,CAeA3H,OAAAC,eAAA,CAAsB2H,eAAAN,UAAtB,CAAiD,QAAjD,CAA2D,CACzD,IAAApH,QAAG,EAAG,CACJ,MAAuC,KAAD,SAAtC,EAA4D,IADxD,CADmD,CAIzDE,aAAc,CAAA,CAJ2C,CAKzDuH,WAAY,CAAA,CAL6C,CAA3D,CAQAlL,EAAA,CAAkB,QAAA,EAAM,CACtBwK,EAAA,CAAW,IAAItJ,CADO,CAAxB,CAhCK,CAgDPZ,CAAA,CAAU,QAAA,EAAM,CAAA,MAAA/B,SAAA4L,cAAA,CAAuBlM,CAAA,CAAe,mBAAf,CAAoC,CACzEU,WAAY,CAAA,CAD6D;AAEzED,QAAS,CAAA,CAFgE,CAGzEE,OAAQmG,IAAAA,EAHiE,CAApC,CAAvB,CAAA,CAAhB,CAOA/G,EAAAe,UAAA,CAAkBA,CAClBf,EAAAsC,UAAA,CAAkBA,CAClBtC,EAAAa,iBAAA,CAAyBA,CACzBb,EAAA6D,YAAA,CAjGoBA,QAAA,CAAC5C,CAAD,CAAS,CACvBuL,EAAJ,EACEA,EAAA3I,YAAA,CAAqB5C,CAArB,CAFyB,CAhqBrB,CAAT,CAAD,CAmwBGb,MAAAgN,YAnwBH,CAmwByBhN,MAAAgN,YAnwBzB,EAmwB+C,EAnwB/C,C;;;;;;;;;AMGEnK,QADWoK,GACA,EAAG,CAIZ,IAAAC,GAAA,CAFA,IAAAC,KAEA,CAFY,IAGZ,KAAAC,EAAA,CAAa,CAAA,CAWb,KAAAC,EAAA,CAFA,IAAAC,EAEA,CAJA,IAAAC,GAIA,CANA,IAAAC,aAMA,CARA,IAAAC,cAQA,CAVA,IAAAC,EAUA,CAVgB,IAuBhB,KAAAhJ,WAAA,CAFA,IAAAkH,YAEA,CAJA,IAAA+B,gBAIA,CANA,IAAAC,UAMA,CARA,IAAAvL,WAQA,CAVA,IAAAvB,WAUA,CAZA,IAAA+M,EAYA,CAZsBlH,IAAAA,EActB,KAAAmH,GAAA,CADA,IAAAC,GACA,CAD0B,CAAA,CA9Bd,CAkCd,EAAA,UAAA,OAAA,CAAAC,QAAM,EAAG,CACP,MAAO,EADA,CAKJC,SAASA,EAAsB,CAACzL,CAAD,CAAO,CACtCA,CAAA0L,EAAL,GACE1L,CAAA0L,EADF,CACiB,IAAIjB,EADrB,CAGA,OAAOzK,EAAA0L,EAJoC,CAOtCC,QAASA,EAAgB,CAAC3L,CAAD,CAAO,CACrC,MAAOA,EAAP,EAAeA,CAAA0L,EADsB,C,CC/ChC,IAAIE,EAAWpO,MAAA,SAAXoO,EAAiC,EAE5CA,EAAAC,GAAA,CAA8B,EAAQC,CAAA3B,OAAAF,UAAA6B,aAAR,EAA0CC,CAAA7L,IAAA+J,UAAA8B,YAA1C,CAE9B,KAAIC,GAAOrJ,MAAAqH,yBAAA,CAAgC9J,IAAA+J,UAAhC,CAAgD,YAAhD,CAEX2B,EAAAK,EAAA,CAA0B,CAAA,EAAQD,EAAR,EAAgBA,EAAAjJ,aAAhB,EAAqCiJ,EAAAnJ,IAArC,CAC1B+I,EAAAM,GAAA,CAAiBN,CAAA,MAAjB,EAAsC,CAACA,CAAAC,GAIvC,KAAMM,GAAQtF,SAAAC,UAAA1B,MAAA,CAA0B,SAA1B,CAAd,CACMgH,GAAUvF,SAAAC,UAAA1B,MAAA,CAA0B,MAA1B,CACoBjB,KAAAA,EAApC,GAAIyH,CAAAS,GAAJ,GACET,CAAAS,GADF,CACgCT,CAAAK,EADhC,GAC4DE,EAD5D,EACqEC,EADrE,EAIOE,SAASA,EAA2B,CAACtM,CAAD,CAAO,CAEhD,OADMuM,CACN,CD4BcZ,CC7BG,CAAiB3L,CAAjB,CACjB,GAA4CmE,IAAAA,EAA5C,GAAoBoI,CAAA1M,WAF4B,CAK3C2M,QAASA,EAAW,CAACC,CAAD,CAAM,CAC/B,MAAkC,WAAlC,GAAeA,CAAAC,GADgB,CAI1BC,QAASA,GAAqB,CAAC3M,CAAD,CAAO,CACtC2K,CAAAA,CAAO3K,CAAA+L,YAAA,EACX,IAAIS,CAAA,CAAY7B,CAAZ,CAAJ,CACE,MAAOA,EAHiC;AAO5C,IAAIiC,GAAIzC,OAAAF,UAAR,CACI4C,GAAUD,EAAAC,QAAVA,EAAuBD,EAAAE,gBAAvBD,EACFD,EAAAG,mBADEF,EACsBD,EAAAI,kBADtBH,EAEFD,EAAAK,iBAFEJ,EAEoBD,EAAAM,sBAajBC,SAASA,GAAM,CAACrD,CAAD,CAASsD,CAAT,CAAiB,CACrC,GAAItD,CAAJ,EAAcsD,CAAd,CAEE,IADA,IAAIzF,EAAKhF,MAAA0K,oBAAA,CAA2BD,CAA3B,CAAT,CACS5K,EAAE,CADX,CACcsF,CAAd,CAAkBtF,CAAlB,CAAoBmF,CAAA3I,OAApB,GAAmC8I,CAAnC,CAAqCH,CAAA,CAAGnF,CAAH,CAArC,EAA6CA,CAAA,EAA7C,CAAkD,CATpD,IAAI8K,EAAK3K,MAAAqH,yBAAA,CAUcoD,CAVd,CAUWtF,CAVX,CACLwF,EAAJ,EACE3K,MAAAC,eAAA,CAQ6BkH,CAR7B,CAQkBhC,CARlB,CAAoCwF,CAApC,CAOkD,CAHf,CAUhCC,QAASA,GAAS,CAACzD,CAAD,CAAS,CAAT,CAAqB,CAAZ,IAAA,IAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,SAAA,OAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAChC,KAAStH,CAAT,CAAW,CAAX,CAAcA,CAAd,CAD4CgL,CAC1BxO,OAAlB,CAAkCwD,CAAA,EAAlC,CACE2K,EAAA,CAAOrD,CAAP,CAF0C0D,CAE3B,CAAQhL,CAAR,CAAf,CAEF,OAAOsH,EAJqC,CAOvC2D,QAASA,GAAK,CAAC3D,CAAD,CAASsD,CAAT,CAAiB,CACpC,IAAK5K,IAAIA,CAAT,GAAc4K,EAAd,CACEtD,CAAA,CAAOtH,CAAP,CAAA,CAAY4K,CAAA,CAAO5K,CAAP,CAFsB;AAoBtC,IAAIkL,GAAU/P,QAAAgQ,eAAA,CAAwB,EAAxB,CAAd,CACItM,GAAU,CADd,CAEIuM,GAAQ,EACZ/M,EAAA,IAAIH,gBAAJ,CAAqB,QAAA,EAAM,CACzB,IAAA,CAAOkN,EAAA5O,OAAP,CAAA,CAEE,GAAI,CACF4O,EAAAC,MAAA,EAAA,EADE,CAEF,MAAMrJ,CAAN,CAAS,CAGT,KADAkJ,GAAA3L,YACMyC,CADgBnD,EAAA,EAChBmD,CAAAA,CAAN,CAHS,CALY,CAA3B,CAAA3D,SAAA,CAWW6M,EAXX,CAWoB,CAACI,cAAe,CAAA,CAAhB,CAXpB,CAcOC,SAASA,GAAS,CAACpP,CAAD,CAAW,CAClCiP,EAAAI,KAAA,CAAWrP,CAAX,CACA+O,GAAA3L,YAAA,CAAsBV,EAAA,EAFY,CAK7B,IAAM4M,GAAsB,CAAA,CAAQtQ,QAAAuQ,SAEpCA,SAASA,GAAQ,CAACC,CAAD,CAAYnO,CAAZ,CAAkB,CACxC,IAAA,CAAOA,CAAP,CAAA,CAAa,CACX,GAAIA,CAAJ,EAAYmO,CAAZ,CACE,MAAO,CAAA,CAETnO,EAAA,CAAOA,CAAA1B,WAJI,CAMb,MAAO,CAAA,CAPiC,C,CC5G1C,IAAI8P,GAAY,EAAhB,CACIC,EACGC,SAASA,GAAO,CAAC3P,CAAD,CAAW,CAC3B0P,EAAL,GACEA,EACA,CADY,CAAA,CACZ,CDgGYN,EChGZ,CAAgBQ,EAAhB,CAFF,CAIAH,GAAAJ,KAAA,CAAerP,CAAf,CALgC,CAQ3B4P,QAASA,GAAK,EAAG,CACtBF,EAAA,CAAY,CAAA,CAEZ,KADA,IAAIG,EAAW,CAAA,CAAQJ,EAAApP,OACvB,CAAOoP,EAAApP,OAAP,CAAA,CACEoP,EAAAP,MAAA,EAAA,EAEF,OAAOW,EANe,CASxBD,EAAA,KAAA,CAAgBH,E,CCjBd/N,QAFIoO,GAEO,EAAG,CACZ,IAAAC,EAAA,CAAkB,CAAA,CAClB,KAAAhF,WAAA,CAAkB,EAClB,KAAAiF,aAAA,CAAoB,EACpB,KAAAC,EAAA,CAAiB,IAAIC,GAJT,CAOdC,QAAA,GAAQ,CAARA,CAAQ,CAAG,CACJ,CAAAJ,EAAL,GACE,CAAAA,EACA,CADkB,CAAA,CAClB,CFyFUX,EEzFV,CAAgB,QAAA,EAAM,CACpBQ,EAAA,CAJKA,CAIL,CADoB,CAAtB,CAFF,CADS,CASXA,QAAA,GAAK,CAALA,CAAK,CAAG,CACN,GAAI,CAAAG,EAAJ,CAAqB,CACnB,CAAAA,EAAA,CAAkB,CAAA,CAClB,KAAIjF,EAAY,CAAAsF,YAAA,EACZtF,EAAAzK,OAAJ,EACE,CAAA4P,EAAA3P,QAAA,CAAuB,QAAQ,CAAC+P,CAAD,CAAK,CAClCA,CAAA,CAAGvF,CAAH,CADkC,CAApC,CAJiB,CADf,CAYR,EAAA,UAAA,YAAA,CAAAsF,QAAW,EAAG,CACZ,GAAI,IAAArF,WAAA1K,OAAJ,EAA8B,IAAA2P,aAAA3P,OAA9B,CAAwD,CACtD,IAAIyK,EAAY,CAAC,CACfC,WAAY,IAAAA,WADG,CAEfiF,aAAc,IAAAA,aAFC,CAAD,CAIhB,KAAAjF,WAAA,CAAkB,EAClB,KAAAiF,aAAA,CAAoB,EACpB,OAAOlF,EAP+C,CASxD,MAAO,EAVK,CAoBawF;QAAA,GAAQ,CAACjP,CAAD,CAAOrB,CAAP,CAAiB,CACpD,IAAMuQ,EHbQzD,CGaH,CAAuBzL,CAAvB,CACNkP,EAAAhE,EAAL,GACEgE,CAAAhE,EADF,CACgB,IAAIuD,EADpB,CAGAS,EAAAhE,EAAA0D,EAAAO,IAAA,CAA0BxQ,CAA1B,CACA,KAAIuM,EAAWgE,CAAAhE,EACf,OAAO,CACLkE,GAAWzQ,CADN,CAEL0Q,EAAWnE,CAFN,CAGLoE,GAAOtP,CAHF,CAIL,YAAA+O,QAAW,EAAG,CACZ,MAAO7D,EAAA6D,YAAA,EADK,CAJT,CAP6C,CAiBvBQ,QAAA,GAAQ,CAACC,CAAD,CAAS,CAC9C,IAAItE,EAAWsE,CAAXtE,EAAqBsE,CAAAH,EACrBnE,EAAJ,GACEA,CAAA0D,EAAAa,OAAA,CAA0BD,CAAAJ,GAA1B,CACA,CAAKlE,CAAA0D,EAAAc,KAAL,GHjCYjE,CGkCV,CAAuB+D,CAAAF,GAAvB,CAAApE,EADF,CACkD,IADlD,CAFF,CAF8C;AAUzCyE,QAASA,GAAe,CAAClG,CAAD,CAAYK,CAAZ,CAAoB,CAEjD,IAAM8F,EAAiB9F,CAAAiC,YAAA,EACvB,OAAOtC,EAAAoG,IAAA,CAAc,QAAQ,CAACC,CAAD,CAAW,CAEtC,IAAMC,EAAmBH,CAAnBG,GAAsCD,CAAAhG,OAAAiC,YAAA,EAC5C,IAAIgE,CAAJ,EAAuBD,CAAApG,WAAvB,CAIE,IAHIsG,CAGAhR,CAHQiR,KAAAC,KAAA,CAAWJ,CAAApG,WAAX,CAAAyG,OAAA,CAAuC,QAAQ,CAACrI,CAAD,CAAI,CAC7D,MAAQ8H,EAAR,GAA2B9H,CAAAiE,YAAA,EADkC,CAAnD,CAGR/M,CAAAgR,CAAAhR,OAAJ,CAME,MALA8Q,EAKOA,CALInN,MAAAyN,OAAA,CAAcN,CAAd,CAKJA,CAJPnN,MAAAC,eAAA,CAAsBkN,CAAtB,CAAgC,YAAhC,CAA8C,CAC5ChO,MAAOkO,CADqC,CAE5CjN,aAAc,CAAA,CAF8B,CAA9C,CAIO+M,CAAAA,CANT,CAJF,IAYO,IAAIC,CAAJ,CACL,MAAOD,EAhB6B,CAAjC,CAAAK,OAAA,CAkBG,QAAQ,CAACxP,CAAD,CAAI,CAAE,MAAOA,EAAT,CAlBf,CAH0C,C,CChFnD,IAAA,EAAA,EAAA,CACWwI,GAAegB,OAAAF,UAAAd,aAD1B,CAEWnH,GAAemI,OAAAF,UAAAjI,aAF1B,CAGWqO,GAAclG,OAAAF,UAAAoG,YAHzB,CAIWzO,GAAeuI,OAAAF,UAAArI,aAJ1B,CAKW8F,GAAkByC,OAAAF,UAAAvC,gBAL7B,CAMW4I,GAAYnG,OAAAF,UAAAqG,UANvB,CAOWC,GAAaC,QAAAvG,UAAAsG,WAPxB,CAQW9Q,GAAmB0K,OAAAF,UAAAxK,iBAR9B,CASWD,GAAsB2K,OAAAF,UAAAzK,oBATjC,CAUWiR,GAAyBC,MAAAzG,UAAAxK,iBAVpC,CAWWkR,GAA4BD,MAAAzG,UAAAzK,oBAXvC,CAYW+J,GAAgBY,OAAAF,UAAAV,cAZ3B,CAaW2E,GAAWhO,IAAA+J,UAAAiE,SAAXA,EAAsC0C,WAAA3G,UAAAiE,SAbjD,CAcW2C,GAAiBL,QAAAvG,UAAA4G,eAd5B;AAeWC,GAAuB3G,OAAAF,UAAAxC,cAflC,CAgBWsJ,GAAwBC,gBAAA/G,UAAAxC,cAhBnC,CAiBWwJ,GAAwBT,QAAAvG,UAAAxC,cAjBnC,CA4BWyJ,GAA0B/G,OAAAF,UAAA9H,iBA5BrC,CA6BWgP,GAA2BH,gBAAA/G,UAAA9H,iBA7BtC,CA8BWiP,GAA2BZ,QAAAvG,UAAA9H,iBA9B3B0C,EAAAA,YAAAA,CAAcsF,OAAAF,UAAApF,YACdsE,EAAAA,aAAAA,CAAAA,EACAnH,EAAAA,aAAAA,CAAAA,EACAqO,EAAAA,YAAAA,CAAAA,EACAzO,EAAAA,aAAAA,CAAAA,EACA8F,EAAAA,gBAAAA,CAAAA,EACA4I,EAAAA,UAAAA,CAAAA,EACAC,EAAAA,WAAAA,CAAAA,EACA9Q,EAAAA,iBAAAA,CAAAA,EACAD,EAAAA,oBAAAA,CAAAA,EACAiR,EAAAA,GAAAA,CAAAA,EACAE,EAAAA,GAAAA,CAAAA,EACApH,EAAAA,cAAAA,CAAAA,EACA2E,EAAAA,SAAAA,CAAAA,EACA2C;CAAAA,eAAAA,CAAAA,EACAC,EAAAA,GAAAA,CAAAA,EACAC,EAAAA,GAAAA,CAAAA,EACAE,EAAAA,GAAAA,CAAAA,EACAxJ,EAAAA,cAAAA,CAAgBA,QAAQ,CAACxF,CAAD,CAAW,CAC5C,OAAQ,IAAAhC,SAAR,EACE,KAAKC,IAAAC,aAAL,CACE,MAAO2Q,GAAAzG,KAAA,CAA0B,IAA1B,CAAgCpI,CAAhC,CACT,MAAK/B,IAAAmR,cAAL,CACE,MAAOJ,GAAA5G,KAAA,CAA2B,IAA3B,CAAiCpI,CAAjC,CACT,SACE,MAAO8O,GAAA1G,KAAA,CAA2B,IAA3B,CAAiCpI,CAAjC,CANX,CAD4C,CAUnCiP,EAAAA,GAAAA,CAAAA,EACAC,EAAAA,GAAAA,CAAAA,EACAC,EAAAA,GAAAA,CAAAA,EACAjP,EAAAA,iBAAAA,CAAmBA,QAAQ,CAACF,CAAD,CAAW,CAC/C,OAAQ,IAAAhC,SAAR,EACE,KAAKC,IAAAC,aAAL,CACE,MAAO+Q,GAAA7G,KAAA,CAA6B,IAA7B,CAAmCpI,CAAnC,CACT,MAAK/B,IAAAmR,cAAL,CACE,MAAOD,GAAA/G,KAAA,CAA8B,IAA9B,CAAoCpI,CAApC,CACT,SACE,MAAOkP,GAAA9G,KAAA,CAA8B,IAA9B,CAAoCpI,CAApC,CANX,CAD+C,C,CCzBjD,IAAIqP,GAAmB,aAAvB,CACIC,GAAmB,cAEvBC,SAASA,GAAa,CAACC,CAAD,CAAI,CACxB,OAAQA,CAAR,EACE,KAAK,GAAL,CACE,MAAO,OACT,MAAK,GAAL,CACE,MAAO,MACT,MAAK,GAAL,CACE,MAAO,MACT,MAAK,GAAL,CACE,MAAO,QACT,MAAK,QAAL,CACE,MAAO,QAVX,CADwB,CAuB1BC,QAASA,GAAO,CAACC,CAAD,CAAM,CAEpB,IADA,IAAIC,EAAM,EAAV,CACSpP,EAAI,CAAb,CAAgBA,CAAhB,CAAoBmP,CAAA3S,OAApB,CAAgCwD,CAAA,EAAhC,CACEoP,CAAA,CAAID,CAAA,CAAInP,CAAJ,CAAJ,CAAA,CAAc,CAAA,CAEhB,OAAOoP,EALa,CAStB,IAAIC,GAAeH,EAAA,CAAQ,qFAAA,MAAA,CAAA,GAAA,CAAR,CAAnB,CAmBII,GAAmBJ,EAAA,CAAQ,6DAAA,MAAA,CAAA,GAAA,CAAR,CAoDhBK;QAASA,GAAY,CAAC/R,CAAD,CAAOrB,CAAP,CAAiB,CACpB,UAAvB,GAAIqB,CAAAL,UAAJ,GACEK,CADF,CAC8CA,CAADqB,QAD7C,CAKA,KAFA,IAAIuH,EAAI,EAAR,CACIoJ,EAAKrT,CAAA,CAAWA,CAAA,CAASqB,CAAT,CAAX,CAA4BA,CAAAkC,WADrC,CAESM,EAAE,CAFX,CAEcmG,EAAEqJ,CAAAhT,OAFhB,CAE2BiT,CAA3B,CAAmCzP,CAAnC,CAAqCmG,CAArC,GAA4CsJ,CAA5C,CAAkDD,CAAA,CAAGxP,CAAH,CAAlD,EAA0DA,CAAA,EAA1D,CAA+D,CA1CR,CAAA,CAAA,CA2CnCyP,IAAAA,EAAAA,CAAOjS,KAAAA,EAAAA,CAAMrB,KAAAA,EAAAA,CA1CjC,QAAQqB,CAAAC,SAAR,EACE,KAAKC,IAAAC,aAAL,CAIE,IAHA,IAAI+R,EAAUlS,CAAAL,UAAd,CACIiJ,EAAI,GAAJA,CAAUsJ,CADd,CAEIC,EAAQnS,CAAA0B,WAFZ,CAGSc,EAAI,CAAb,CAAuBb,CAAvB,CAA8BwQ,CAAA,CAAM3P,CAAN,CAA9B,CAAyCA,CAAA,EAAzC,CACEoG,CAAA,EAAK,GAAL,CAAWjH,CAAAE,KAAX,CAAuB,IAAvB,CAAyCF,CAAAG,MA1DxCgC,QAAA,CAAUwN,EAAV,CAA4BE,EAA5B,CA0DD,CAAuD,GAEzD5I,EAAA,EAAK,GACL,EAAA,CAAIiJ,EAAA,CAAaK,CAAb,CAAJ,CACStJ,CADT,CAGOA,CAHP,CAGWmJ,EAAA,CAAa/R,CAAb,CAAmBrB,CAAnB,CAHX,CAG0C,IAH1C,CAGiDuT,CAHjD,CAG2D,GAH3D,OAAA,CAKF,MAAKhS,IAAAkS,UAAL,CACMC,CAAAA,CAA4BrS,CAADqS,KAC/B,EAAA,CAAI/T,CAAJ,EAAkBwT,EAAA,CAAiBxT,CAAAqB,UAAjB,CAAlB,CACS0S,CADT,CAGkBA,CAnEfvO,QAAA,CAAUyN,EAAV,CAA4BC,EAA5B,CAgEH,OAAA,CAKF,MAAKtR,IAAAoS,aAAL,CACE,CAAA,CAAO,SAAP,CAAwCtS,CAADqS,KAAvC,CAAqD,QAArD,OAAA,CAEF,SAEE,KADA7U,OAAA+U,QAAAC,MAAA,CAAqBxS,CAArB,CACM;AAAIyS,KAAJ,CAAU,iBAAV,CAAN,CA1BJ,CADuD,CA2CrD7J,CAAA,EAAK,CADwD,CAG/D,MAAOA,EAToC,C,CChH7C,IAAA,EAAA,EAAA,CAEI8J,EAAa/U,QAAAgV,iBAAA,CAA0BhV,QAA1B,CAAoCiV,UAAAC,SAApC,CACf,IADe,CACT,CAAA,CADS,CAFjB,CAKIC,EAAgBnV,QAAAgV,iBAAA,CAA0BhV,QAA1B,CAAoCiV,UAAAG,aAApC,CAClB,IADkB,CACZ,CAAA,CADY,CA4Bb7Q,SAASA,GAAU,CAAClC,CAAD,CAAO,CAC/B,IAAIgQ,EAAQ,EACZ0C,EAAAM,YAAA,CAAyBhT,CAEzB,KADI8H,CACJ,CADQ4K,CAAA7S,WAAA,EACR,CAAOiI,CAAP,CAAA,CACEkI,CAAAhC,KAAA,CAAWlG,CAAX,CACA,CAAAA,CAAA,CAAI4K,CAAAtJ,YAAA,EAEN,OAAO4G,EARwB,CAzBjB1R,CAAAA,WAAAA,CAATA,QAAmB,CAAC0B,CAAD,CAAO,CAC/B0S,CAAAM,YAAA,CAAyBhT,CACzB,OAAO0S,EAAApU,WAAA,EAFwB,CAKjBuB,EAAAA,WAAAA,CAATA,QAAmB,CAACG,CAAD,CAAO,CAC/B0S,CAAAM,YAAA,CAAyBhT,CACzB,OAAO0S,EAAA7S,WAAA,EAFwB,CAKjBuL,EAAAA,UAAAA,CAATA,QAAkB,CAACpL,CAAD,CAAO,CAC9B0S,CAAAM,YAAA,CAAyBhT,CACzB,OAAO0S,EAAAtH,UAAA,EAFuB,CAKhBD,EAAAA,gBAAAA,CAATA,QAAwB,CAACnL,CAAD,CAAO,CACpC0S,CAAAM,YAAA,CAAyBhT,CACzB,OAAO0S,EAAAvH,gBAAA,EAF6B,CAKtB/B;CAAAA,YAAAA,CAATA,QAAoB,CAACpJ,CAAD,CAAO,CAChC0S,CAAAM,YAAA,CAAyBhT,CACzB,OAAO0S,EAAAtJ,YAAA,EAFyB,CAKlBlH,EAAAA,WAAAA,CAAAA,EAWA+Q,EAAAA,cAAAA,CAATA,QAAsB,CAACjT,CAAD,CAAO,CAClC8S,CAAAE,YAAA,CAA4BhT,CAC5B,OAAO8S,EAAAxU,WAAA,EAF2B,CAKpB4U,EAAAA,kBAAAA,CAATA,QAA0B,CAAClT,CAAD,CAAO,CACtC8S,CAAAE,YAAA,CAA4BhT,CAC5B,OAAO8S,EAAAjT,WAAA,EAF+B,CAKxBsT,EAAAA,iBAAAA,CAATA,QAAyB,CAACnT,CAAD,CAAO,CACrC8S,CAAAE,YAAA,CAA4BhT,CAC5B,OAAO8S,EAAA1H,UAAA,EAF8B,CAKvBgI,EAAAA,uBAAAA,CAATA,QAA+B,CAACpT,CAAD,CAAO,CAC3C8S,CAAAE,YAAA,CAA4BhT,CAC5B,OAAO8S,EAAA3H,gBAAA,EAFoC,CAK7BkI,EAAAA,mBAAAA,CAATA,QAA2B,CAACrT,CAAD,CAAO,CACvC8S,CAAAE,YAAA,CAA4BhT,CAC5B,OAAO8S,EAAA1J,YAAA,EAFgC,CAKzBkK;CAAAA,SAAAA,CAATA,QAAiB,CAACtT,CAAD,CAAO,CAC7B,IAAIgQ,EAAQ,EACZ8C,EAAAE,YAAA,CAA4BhT,CAE5B,KADI8H,CACJ,CADQgL,CAAAjT,WAAA,EACR,CAAOiI,CAAP,CAAA,CACEkI,CAAAhC,KAAA,CAAWlG,CAAX,CACA,CAAAA,CAAA,CAAIgL,CAAA1J,YAAA,EAEN,OAAO4G,EARsB,CAWfzI,EAAAA,UAAAA,CAATA,QAAkB,CAACvH,CAAD,CAAO,CAC9B,MD+Bc+R,GC/BP,CAAa/R,CAAb,CAAmB,QAAA,CAAC8H,CAAD,CAAO,CAAA,MAAA5F,GAAA,CAAW4F,CAAX,CAAA,CAA1B,CADuB,CAIhB/F,EAAAA,YAAAA,CAATA,QAAoB,CAAC/B,CAAD,CAAO,CAEhC,OAAQA,CAAAC,SAAR,EACE,KAAKC,IAAAC,aAAL,CACA,KAAKD,IAAAuI,uBAAL,CACM8K,CAAAA,CAAa5V,QAAAgV,iBAAA,CAA0B3S,CAA1B,CAAgC4S,UAAAY,UAAhC,CACf,IADe,CACT,CAAA,CADS,CAGjB,KAJF,IAGMnS,EAAU,EAHhB,CAGoByG,CAClB,CAASA,CAAT,CAAayL,CAAAE,SAAA,EAAb,CAAA,CAGEpS,CAAA,EAAWyG,CAAA4L,UAEb,OAAOrS,EACT,SACE,MAAOrB,EAAA0T,UAbX,CAFgC,C,CCrFlC,IAAA,EAAA,EAAA,CAEMzH,GNAKL,CMAYK,EAFvB,CAMM0H,GAAe,CAACzT,IAAA+J,UAAD,CAAiBE,OAAAF,UAAjB,CAAoC2G,WAAA3G,UAApC,CAUrB2J,SAASA,EAAkB,CAAC/R,CAAD,CAAO,CAClB,IAAA,CAT6B,EAAA,CAAA,CAC3C,IAASW,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkBmR,EAAA3U,OAAlB,CAAuCwD,CAAA,EAAvC,CAA4C,CAC1C,IAAMqR,EAAQF,EAAA,CAAanR,CAAb,CACd,IAAIqR,CAAAC,eAAA,CAMsCjS,CANtC,CAAJ,CAAgC,CAC9B,CAAA,CAAOgS,CAAP,OAAA,CAD8B,CAFU,CADD,CAAA,CAAA,IAAA,EAAA,CAU3C,GAAI,CAACA,CAAL,CACE,KAAMpB,MAAA,CAAM,gCAAN,CAAuC5Q,CAAvC,CAAN,CAEF,MAAOc,OAAAqH,yBAAA,CAAgC6J,CAAhC,CAAuChS,CAAvC,CALyB;AAQ3B,IAAMkS,EAAgB9H,EAAA,CAAiB,CAC5C3N,WAAYsV,CAAA,CAAmB,YAAnB,CADgC,CAE5C/T,WAAY+T,CAAA,CAAmB,YAAnB,CAFgC,CAG5CxI,UAAWwI,CAAA,CAAmB,WAAnB,CAHiC,CAI5CzI,gBAAiByI,CAAA,CAAmB,iBAAnB,CAJ2B,CAK5CxK,YAAawK,CAAA,CAAmB,aAAnB,CAL+B,CAM5C1R,WAAY0R,CAAA,CAAmB,YAAnB,CANgC,CAO5CX,cAAeW,CAAA,CAAmB,eAAnB,CAP6B,CAQ5CR,uBAAwBQ,CAAA,CAAmB,wBAAnB,CARoB,CAS5CP,mBAAoBO,CAAA,CAAmB,oBAAnB,CATwB,CAU5CrM,UAAWqM,CAAA,CAAmB,WAAnB,CAViC,CAW5C7R,YAAa6R,CAAA,CAAmB,aAAnB,CAX+B,CAY5CV,kBAAmBU,CAAA,CAAmB,mBAAnB,CAZyB,CAa5CT,iBAAkBS,CAAA,CAAmB,kBAAnB,CAb0B,CAc5CN,SAAUM,CAAA,CAAmB,UAAnB,CAdkC,CAAjB,CAezB,EAfG,CAiBMI,GAAoB/H,EAAA,CAAiB,CAChDiH,kBAAmBvQ,MAAAqH,yBAAA,CACjBgH,gBAAA/G,UADiB;AACW,mBADX,CAD6B,CAGhDkJ,iBAAkBxQ,MAAAqH,yBAAA,CAChBgH,gBAAA/G,UADgB,CACY,kBADZ,CAH8B,CAKhDqJ,SAAU3Q,MAAAqH,yBAAA,CACRgH,gBAAA/G,UADQ,CACoB,UADpB,CALsC,CAAjB,CAO7B,EAxBG,CA0BMgK,GAAoBhI,EAAA,CAAiB,CAChDiH,kBAAmBvQ,MAAAqH,yBAAA,CACjBwG,QAAAvG,UADiB,CACG,mBADH,CAD6B,CAGhDkJ,iBAAkBxQ,MAAAqH,yBAAA,CAChBwG,QAAAvG,UADgB,CACI,kBADJ,CAH8B,CAKhDqJ,SAAU3Q,MAAAqH,yBAAA,CACRwG,QAAAvG,UADQ,CACY,UADZ,CALsC,CAAjB,CAO7B,EAjCS8J,EAAAA,GAAAA,CAAAA,CAiBAC,EAAAA,GAAAA,CAAAA,EASAC,EAAAA,GAAAA,CAAAA,EASG3V,EAAAA,WAAAA,CAATA,QAAmB,CAAC0B,CAAD,CAAO,CAC/B,MAAO+T,EAAAzV,WAAAuE,IAAAwH,KAAA,CAAkCrK,CAAlC,CADwB,CAIjBH;CAAAA,WAAAA,CAATA,QAAmB,CAACG,CAAD,CAAO,CAC/B,MAAO+T,EAAAlU,WAAAgD,IAAAwH,KAAA,CAAkCrK,CAAlC,CADwB,CAIjBoL,EAAAA,UAAAA,CAATA,QAAkB,CAACpL,CAAD,CAAO,CAC9B,MAAO+T,EAAA3I,UAAAvI,IAAAwH,KAAA,CAAiCrK,CAAjC,CADuB,CAIhBmL,EAAAA,gBAAAA,CAATA,QAAwB,CAACnL,CAAD,CAAO,CACpC,MAAO+T,EAAA5I,gBAAAtI,IAAAwH,KAAA,CAAuCrK,CAAvC,CAD6B,CAItBoJ,EAAAA,YAAAA,CAATA,QAAoB,CAACpJ,CAAD,CAAO,CAChC,MAAO+T,EAAA3K,YAAAvG,IAAAwH,KAAA,CAAmCrK,CAAnC,CADyB,CAIlBkC,EAAAA,WAAAA,CAATA,QAAmB,CAAClC,CAAD,CAAO,CAC/B,MAAOiQ,MAAAhG,UAAAiK,MAAA7J,KAAA,CAA2B0J,CAAA7R,WAAAW,IAAAwH,KAAA,CAAkCrK,CAAlC,CAA3B,CADwB,CAIjBiT,EAAAA,cAAAA,CAATA,QAAsB,CAACjT,CAAD,CAAO,CAClC,MAAO+T,EAAAd,cAAApQ,IAAAwH,KAAA,CAAqCrK,CAArC,CAD2B,CAIpBoT,EAAAA,uBAAAA,CAATA,QAA+B,CAACpT,CAAD,CAAO,CAC3C,MAAO+T,EAAAX,uBAAAvQ,IAAAwH,KAAA,CAA8CrK,CAA9C,CADoC,CAI7BqT,EAAAA,mBAAAA,CAATA,QAA2B,CAACrT,CAAD,CAAO,CACvC,MAAO+T,EAAAV,mBAAAxQ,IAAAwH,KAAA,CAA0CrK,CAA1C,CADgC,CAIzBuH;CAAAA,UAAAA,CAATA,QAAkB,CAACvH,CAAD,CAAO,CAC9B,MAAO+T,EAAAxM,UAAA1E,IAAAwH,KAAA,CAAiCrK,CAAjC,CADuB,CAIhB+B,EAAAA,YAAAA,CAATA,QAAoB,CAAC/B,CAAD,CAAO,CAChC,MAAO+T,EAAAhS,YAAAc,IAAAwH,KAAA,CAAmCrK,CAAnC,CADyB,CAIlBsT,EAAAA,SAAAA,CAATA,QAAiB,CAACtT,CAAD,CAAO,CAE7B,OAAQA,CAAAC,SAAR,EACE,KAAKC,IAAAuI,uBAAL,CACE6K,CAAA,CAAWU,EAAAV,SAAAzQ,IAAAwH,KAAA,CAAoCrK,CAApC,CACX,MACF,MAAKE,IAAAmR,cAAL,CACEiC,CAAA,CAAWW,EAAAX,SAAAzQ,IAAAwH,KAAA,CAAoCrK,CAApC,CACX,MACF,SACEsT,CAAA,CAAWS,CAAAT,SAAAzQ,IAAAwH,KAAA,CAAgCrK,CAAhC,CARf,CAWA,MAAOiQ,MAAAhG,UAAAiK,MAAA7J,KAAA,CAA2BiJ,CAA3B,CAbsB,CAgBfJ;CAAAA,kBAAAA,CAATA,QAA0B,CAAClT,CAAD,CAAO,CACtC,OAAQA,CAAAC,SAAR,EACE,KAAKC,IAAAuI,uBAAL,CACE,MAAOuL,GAAAd,kBAAArQ,IAAAwH,KAAA,CAA6CrK,CAA7C,CACT,MAAKE,IAAAmR,cAAL,CACE,MAAO4C,GAAAf,kBAAArQ,IAAAwH,KAAA,CAA6CrK,CAA7C,CACT,SACE,MAAO+T,EAAAb,kBAAArQ,IAAAwH,KAAA,CAAyCrK,CAAzC,CANX,CADsC,CAWxBmT,EAAAA,iBAAAA,CAATA,QAAyB,CAACnT,CAAD,CAAO,CACrC,OAAQA,CAAAC,SAAR,EACE,KAAKC,IAAAuI,uBAAL,CACE,MAAOuL,GAAAb,iBAAAtQ,IAAAwH,KAAA,CAA4CrK,CAA5C,CACT,MAAKE,IAAAmR,cAAL,CACE,MAAO4C,GAAAd,iBAAAtQ,IAAAwH,KAAA,CAA4CrK,CAA5C,CACT,SACE,MAAO+T,EAAAZ,iBAAAtQ,IAAAwH,KAAA,CAAwCrK,CAAxC,CANX,CADqC,C,CC7HhC,IAAMmU,EPHFvI,COGcS,GAAA,CACrB+H,CADqB,CACCC,C,CCE1BC,QAASA,GAAS,CAACtU,CAAD,CAAO,CACvB,IAAA,CAAOA,CAAAH,WAAP,CAAA,CACEG,CAAAqQ,YAAA,CAAiBrQ,CAAAH,WAAjB,CAFqB;AAMzB,IAAMoM,GRZKL,CQYYK,EAAvB,CACMsI,GAAW5W,QAAA+G,eAAAC,mBAAA,CAA2C,OAA3C,CADjB,CAGM6P,GAEJ7R,MAAAqH,yBAAA,CAAgC9J,IAAA+J,UAAhC,CAAgD,aAAhD,CALF,CAQMwK,GAAoBD,EAApBC,EAAkDD,EAAA3R,IARxD,CAUM6R,GAEF/R,MAAAqH,yBAAA,CAAgCwG,QAAAvG,UAAhC,CAAoD,eAApD,CAZJ,CA+DI0K,GAAmB,CAErB1B,cAAe,CAEb,IAAApQ,QAAG,EAAG,CACJ,IAAM0J,ETjCIZ,CSiCO,CAAiB,IAAjB,CAEjB,EADIhD,CACJ,CADQ4D,CACR,EADoBA,CAAAjO,WACpB,GAASqK,CAAA1I,SAAT,GAAwBC,IAAAC,aAAxB,GACEwI,CADF,CACM,IADN,CAGA,OAAaxE,KAAAA,EAAN,GAAAwE,CAAA,CAAkBA,CAAlB,CDlFAwL,CCkFsBlB,cAAA,CAAyB,IAAzB,CANzB,CAFO,CAUblQ,aAAc,CAAA,CAVD,CAFM,CAerBzE,WAAY,CAEV,IAAAuE,QAAG,EAAG,CACJ,IAAM0J,ET9CIZ,CS8CO,CAAiB,IAAjB,CACXhD,EAAAA,CAAI4D,CAAJ5D,EAAgB4D,CAAAjO,WACtB,OAAa6F,KAAAA,EAAN,GAAAwE,CAAA,CAAkBA,CAAlB,CD5FAwL,CC4FsB7V,WAAA,CAAsB,IAAtB,CAHzB,CAFI,CAOVyE,aAAc,CAAA,CAPJ,CAfS;AAyBrBqG,YAAa,CAEX,IAAAvG,QAAG,EAAG,CACJ,IAAM0J,ETxDIZ,CSwDO,CAAiB,IAAjB,CACXhD,EAAAA,CAAI4D,CAAJ5D,EAAgB4D,CAAAnD,YACtB,OAAajF,KAAAA,EAAN,GAAAwE,CAAA,CAAkBA,CAAlB,CDtGAwL,CCsGsB/K,YAAA,CAAuB,IAAvB,CAHzB,CAFK,CAOXrG,aAAc,CAAA,CAPH,CAzBQ,CAmCrBoI,gBAAiB,CAEf,IAAAtI,QAAG,EAAG,CACJ,IAAM0J,ETlEIZ,CSkEO,CAAiB,IAAjB,CACXhD,EAAAA,CAAI4D,CAAJ5D,EAAgB4D,CAAApB,gBACtB,OAAahH,KAAAA,EAAN,GAAAwE,CAAA,CAAkBA,CAAlB,CDhHAwL,CCgHsBhJ,gBAAA,CAA2B,IAA3B,CAHzB,CAFS,CAOfpI,aAAc,CAAA,CAPC,CAnCI,CA8CrBsQ,mBAAoB,CAIlB,IAAAxQ,QAAG,EAAG,CACJ,IAAM0J,ET/EIZ,CS+EO,CAAiB,IAAjB,CACjB,IAAIY,CAAJ,EAAyCpI,IAAAA,EAAzC,GAAgBoI,CAAAnD,YAAhB,CAAoD,CAElD,IADItB,CACJ,CADQ,IAAAsB,YACR,CAAOtB,CAAP,EAAYA,CAAA7H,SAAZ,GAA2BC,IAAAC,aAA3B,CAAA,CACE2H,CAAA,CAAIA,CAAAsB,YAEN,OAAOtB,EAL2C,CAOlD,MDnIKqM,ECmIEd,mBAAA,CAA8B,IAA9B,CATL,CAJY,CAgBlBtQ,aAAc,CAAA,CAhBI,CA9CC,CAiErBqQ,uBAAwB,CAItB,IAAAvQ,QAAG,EAAG,CACJ,IAAM0J;ATlGIZ,CSkGO,CAAiB,IAAjB,CACjB,IAAIY,CAAJ,EAA6CpI,IAAAA,EAA7C,GAAgBoI,CAAApB,gBAAhB,CAAwD,CAEtD,IADIrD,CACJ,CADQ,IAAAqD,gBACR,CAAOrD,CAAP,EAAYA,CAAA7H,SAAZ,GAA2BC,IAAAC,aAA3B,CAAA,CACE2H,CAAA,CAAIA,CAAAqD,gBAEN,OAAOrD,EAL+C,CAOtD,MDtJKqM,ECsJEf,uBAAA,CAAkC,IAAlC,CATL,CAJgB,CAgBtBrQ,aAAc,CAAA,CAhBQ,CAjEH,CA/DvB,CAqJa6R,GAAoB,CAC/BC,UAAW,CAIT,IAAAhS,QAAG,EAAG,CACJ,MAAO,KAAAW,aAAA,CAAkB,OAAlB,CAAP,EAAqC,EADjC,CAJG,CAUT,IAAAoO,QAAG,CAAC9P,CAAD,CAAQ,CACT,IAAAF,aAAA,CAAkB,OAAlB,CAA2BE,CAA3B,CADS,CAVF,CAaTiB,aAAc,CAAA,CAbL,CADoB,CArJjC,CAyMI+R,GAAkB,CAEpB5S,WAAY,CAIV,IAAAW,QAAG,EAAG,CAEJ,GR5MUyJ,CQ4MN,CAAkC,IAAlC,CAAJ,CAA6C,CAC3C,IAAMC,ET/KEZ,CS+KS,CAAiB,IAAjB,CACjB,IAAI,CAACY,CAAArK,WAAL,CAA0B,CACxBqK,CAAArK,WAAA,CAAsB,EACtB,KAAK,IAAI4F,EAAE,IAAAjI,WAAX,CAA4BiI,CAA5B,CAA+BA,CAA/B,CAAiCA,CAAAsB,YAAjC,CACEmD,CAAArK,WAAA8L,KAAA,CAAyBlG,CAAzB,CAHsB,CAM1B,IAAA5F,EAAaqK,CAAArK,WAR8B,CAA7C,IAUEA,EAAA;ADpOKiS,CCoOQjS,WAAA,CAAsB,IAAtB,CAEfA,EAAA6S,KAAA,CAAkBC,QAAQ,CAACC,CAAD,CAAQ,CAChC,MAAO/S,EAAA,CAAW+S,CAAX,CADyB,CAGlC,OAAO/S,EAjBH,CAJI,CAuBVa,aAAc,CAAA,CAvBJ,CAFQ,CA4BpBmS,kBAAmB,CAEjB,IAAArS,QAAG,EAAG,CACJ,MAAO,KAAAyQ,SAAAtU,OADH,CAFW,CAKjB+D,aAAc,CAAA,CALG,CA5BC,CAoCpBlD,WAAY,CAEV,IAAAgD,QAAG,EAAG,CACJ,IAAM0J,ET7MIZ,CS6MO,CAAiB,IAAjB,CACXhD,EAAAA,CAAI4D,CAAJ5D,EAAgB4D,CAAA1M,WACtB,OAAasE,KAAAA,EAAN,GAAAwE,CAAA,CAAkBA,CAAlB,CD3PAwL,CC2PsBtU,WAAA,CAAsB,IAAtB,CAHzB,CAFI,CAOVkD,aAAc,CAAA,CAPJ,CApCQ,CA8CpBqI,UAAW,CAET,IAAAvI,QAAG,EAAG,CACJ,IAAM0J,ETvNIZ,CSuNO,CAAiB,IAAjB,CACXhD,EAAAA,CAAI4D,CAAJ5D,EAAgB4D,CAAAnB,UACtB,OAAajH,KAAAA,EAAN,GAAAwE,CAAA,CAAkBA,CAAlB,CDrQAwL,CCqQsB/I,UAAA,CAAqB,IAArB,CAHzB,CAFG,CAOTrI,aAAc,CAAA,CAPL,CA9CS,CAwDpBhB,YAAa,CAIX,IAAAc,QAAG,EAAG,CACJ,GRjQUyJ,CQiQN,CAAkC,IAAlC,CAAJ,CAA6C,CAE3C,IADA,IAAI6I,EAAK,EAAT,CACS3S,EAAI,CADb,CACgB4S,EAAK,IAAAlT,WADrB,CACsCuP,CAAtC,CAA0CA,CAA1C,CAA8C2D,CAAA,CAAG5S,CAAH,CAA9C,CAAsDA,CAAA,EAAtD,CACMiP,CAAAxR,SAAJ,GAAmBC,IAAAoS,aAAnB;AACE6C,CAAAnH,KAAA,CAAQyD,CAAA1P,YAAR,CAGJ,OAAOoT,EAAAE,KAAA,CAAQ,EAAR,CAPoC,CAS3C,MDxRKlB,ECwREpS,YAAA,CAAuB,IAAvB,CAVL,CAJK,CAqBX,IAAA6P,QAAG,CAACjO,CAAD,CAAO,CACR,GAAoB,WAApB,GAAI,MAAOA,EAAX,EAA4C,IAA5C,GAAmCA,CAAnC,CACEA,CAAA,CAAO,EAET,QAAQ,IAAA1D,SAAR,EACE,KAAKC,IAAAC,aAAL,CACA,KAAKD,IAAAuI,uBAAL,CACE,GAAI,CRxRE6D,CQwRD,CAAkC,IAAlC,CAAL,EAAgDL,EAAhD,CAAgE,CAE9D,IAAMpM,EAAa,IAAAA,WACnB,EAAIA,CAAJ,EAAkB,IAAAuL,UAAlB,EACGvL,CADH,EACiBA,CAAAI,SADjB,EACwCC,IAAAkS,UADxC,GAEEkC,EAAA,CAAU,IAAV,CAEFgB,EAAAA,GAAAvT,YAAA6P,IAAAvH,KAAA,CAAqC,IAArC,CAA2C1G,CAA3C,CAP8D,CAAhE,IASE2Q,GAAA,CAAU,IAAV,CAEA,EAAkB,CAAlB,CAAI3Q,CAAA3E,OAAJ,EAAuB,IAAAiB,SAAvB,GAAyCC,IAAAC,aAAzC,GACE,IAAA0E,YAAA,CAAiBlH,QAAAgQ,eAAA,CAAwBhK,CAAxB,CAAjB,CAGJ,MACF,SAEE,IAAA+P,UAAA,CAAiB/P,CArBrB,CAJQ,CArBC,CAkDXZ,aAAc,CAAA,CAlDH,CAxDO,CA8GpBmQ,kBAAmB,CAIjB,IAAArQ,QAAG,EAAG,CACJ,IAAM0J;ATzRIZ,CSyRO,CAAiB,IAAjB,CACjB,IAAIY,CAAJ,EAAwCpI,IAAAA,EAAxC,GAAgBoI,CAAA1M,WAAhB,CAAmD,CAEjD,IADIiI,CACJ,CADQ,IAAAjI,WACR,CAAOiI,CAAP,EAAYA,CAAA7H,SAAZ,GAA2BC,IAAAC,aAA3B,CAAA,CACE2H,CAAA,CAAIA,CAAAsB,YAEN,OAAOtB,EAL0C,CAOjD,MD7UKqM,EC6UEjB,kBAAA,CAA6B,IAA7B,CATL,CAJW,CAgBjBnQ,aAAc,CAAA,CAhBG,CA9GC,CAiIpBoQ,iBAAkB,CAIhB,IAAAtQ,QAAG,EAAG,CACJ,IAAM0J,ET5SIZ,CS4SO,CAAiB,IAAjB,CACjB,IAAIY,CAAJ,EAAuCpI,IAAAA,EAAvC,GAAgBoI,CAAAnB,UAAhB,CAAkD,CAEhD,IADItD,CACJ,CADQ,IAAAsD,UACR,CAAOtD,CAAP,EAAYA,CAAA7H,SAAZ,GAA2BC,IAAAC,aAA3B,CAAA,CACE2H,CAAA,CAAIA,CAAAqD,gBAEN,OAAOrD,EALyC,CAOhD,MDhWKqM,ECgWEhB,iBAAA,CAA4B,IAA5B,CATL,CAJU,CAgBhBpQ,aAAc,CAAA,CAhBE,CAjIE,CAoJpBuQ,SAAU,CAIR,IAAAzQ,QAAG,EAAG,CAGF,IAAAyQ,ER/VQhH,CQ8VN,CAAkC,IAAlC,CAAJ,CACa2D,KAAAhG,UAAAkG,OAAA9F,KAAA,CAA4B,IAAAnI,WAA5B,CAA6C,QAAQ,CAAC4F,CAAD,CAAI,CAClE,MAAQA,EAAA7H,SAAR,GAAuBC,IAAAC,aAD2C,CAAzD,CADb;AD5WOgU,CCiXMb,SAAA,CAAoB,IAApB,CAEbA,EAAAyB,KAAA,CAAgBQ,QAAQ,CAACN,CAAD,CAAQ,CAC9B,MAAO3B,EAAA,CAAS2B,CAAT,CADuB,CAGhC,OAAO3B,EAZH,CAJE,CAkBRvQ,aAAc,CAAA,CAlBN,CApJU,CA0KpBwE,UAAW,CAIT,IAAA1E,QAAG,EAAG,CACJ,MRnXUyJ,EQmXN,CAAkC,IAAlC,CAAJ,CJrRUyF,EIwRD,CAF4B,UAAnB1Q,GAAA,IAAA1B,UAAA0B,CACmB,IAADA,QADlBA,CACmC,IAC5C,CAHT,CDjYO8S,CCsYE5M,UAAA,CAAqB,IAArB,CANL,CAJG,CAgBT,IAAAqK,QAAG,CAACjO,CAAD,CAAO,CACR,IAAMtC,EAA6B,UAAnB,GAAA,IAAA1B,UAAA,CACqB,IAAD0B,QADpB,CACqC,IACrDiT,GAAA,CAAUjT,CAAV,CACA,KAAImU,EAAgB,IAAA7V,UAEf6V,EAAL,EAAwC,UAAxC,GAAsBA,CAAtB,GACEA,CADF,CACkB,KADlB,CAGMC,EAAAA,CAAgBlB,EAAA9S,cAAA,CAAuB+T,CAAvB,CAMtB,KALIvJ,EAAJ,CACEqJ,CAAAA,GAAA/N,UAAAqK,IAAAvH,KAAA,CAAmCoL,CAAnC,CAAkD9R,CAAlD,CADF,CAGE8R,CAAAlO,UAHF,CAG4B5D,CAE5B,CAAO8R,CAAA5V,WAAP,CAAA,CACEwB,CAAAwD,YAAA,CAAoB4Q,CAAA5V,WAApB,CAhBM,CAhBD,CAmCTkD,aAAc,CAAA,CAnCL,CA1KS,CAzMtB,CA8ZW2S,GAAqB,CAE9BC,WAAY,CAIV,IAAA9S,QAAG,EAAG,CACJ,IAAM0J,ETlYIZ,CSkYO,CAAiB,IAAjB,CACjB,OAAOY,EAAP,EAAmBA,CAAA7B,GAAnB;AAA0C,IAFtC,CAJI,CAQV3H,aAAc,CAAA,CARJ,CAFkB,CA9ZhC,CA+aW6S,GAAwB,CAEjCC,cAAe,CAIb,IAAAhT,QAAG,EAAG,CAraN,IAAA,EADE6R,EAAJ,EAAqCA,EAAA7R,IAArC,CACS6R,EAAA7R,IAAAwH,KAAA,CAAuC1M,QAAvC,CADT,CR3BSiO,CQ6BGK,EAAL,CAH2B,IAAA,EAG3B,CACEtO,QAAAkY,cAST,IAAKC,CAAL,EAAgBA,CAAA7V,SAAhB,CAAA,CAGA,IAAIuM,EAAc,CAAC,CRpBLA,CQoBO,CAwZWxM,IAxZX,CACrB,IAuZgCA,IAvZhC,GAAarC,QAAb,EAGO6O,CAHP,EAuZgCxM,IA9Y1BuG,KATN,GASoBuP,CATpB,EAUOC,CAAAA,SAAA1L,KAAA,CA6YyBrK,IA7YLuG,KAApB,CAA+BuP,CAA/B,CAVP,CAAA,CAkBA,IADIE,CACJ,CRnCcrJ,EQkCG,CAA4BmJ,CAA5B,CACjB,CAAOE,CAAP,EAAqBA,CAArB,GAqYgChW,IArYhC,CAAA,CACE8V,CACA,CADSE,CAAAzP,KACT,CAAAyP,CAAA,CRrCYrJ,EQqCC,CAA4BmJ,CAA5B,CAEf,EAAA,CAiYgC9V,IAjYhC,GAAarC,QAAb,CAESqY,CAAA,CAAa,IAAb,CAAoBF,CAF7B,CAMSE,CAAA,GA2XuBhW,IA3XvB,CAAsB8V,CAAtB,CAA+B,IA5BxC,CAAA,IAWI,EAAA,CAAO,IAfX,CAAA,IACE,EAAA,CAAO,IA0ZL,OAAO,EADH,CAJO,CAUb,IAAAlE,QAAG,EAAG,EAVO,CAWb7O,aAAc,CAAA,CAXD,CAFkB,CAyBnCkT;QAASA,EAAkB,CAACxJ,CAAD,CAAMyJ,CAAN,CAAmBC,CAAnB,CAA0B,CACnD,IAAKvJ,IAAIA,CAAT,GAAcsJ,EAAd,CAA2B,CACzB,IAAIE,EAAUzT,MAAAqH,yBAAA,CAAgCyC,CAAhC,CAAqCG,CAArC,CACTwJ,EAAL,EAAgBA,CAAArT,aAAhB,EACG,CAACqT,CADJ,EACeD,CADf,CAEExT,MAAAC,eAAA,CAAsB6J,CAAtB,CAA2BG,CAA3B,CAA8BsJ,CAAA,CAAYtJ,CAAZ,CAA9B,CAFF,CAGWuJ,CAHX,EAIE5D,OAAA8D,KAAA,CAAa,kBAAb,CAAiCzJ,CAAjC,CAAoC,IAApC,CAA0CH,CAA1C,CANuB,CADwB,CAa9C6J,QAASA,EAAc,CAACzC,CAAD,CAAQ,CACpCoC,CAAA,CAAmBpC,CAAnB,CAA0Bc,EAA1B,CACAsB,EAAA,CAAmBpC,CAAnB,CAA0Be,EAA1B,CACAqB,EAAA,CAAmBpC,CAAnB,CAA0BiB,EAA1B,CACAmB,EAAA,CAAmBpC,CAAnB,CAA0B+B,EAA1B,CAJoC;AAO/BW,QAASA,GAAwB,EAAQ,CAAP1C,IAAAA,ECxc5B2C,ECqScvM,UFoKzB4J,EAAA4C,UAAA,CAAkBzF,gBAAA/G,UAElBgM,EAAA,CAAmBpC,CAAnB,CAA0Bc,EAA1B,CAA4C,CAAA,CAA5C,CACAsB,EAAA,CAAmBpC,CAAnB,CAA0BiB,EAA1B,CAA2C,CAAA,CAA3C,CACAmB,EAAA,CAAmBpC,CAAnB,CAA0B+B,EAA1B,CAAiD,CAAA,CAAjD,CAGAjT,OAAA+T,iBAAA,CAAwB7C,CAAxB,CAA+B,CAC7B5T,SAAU,CACR6B,MAAO5B,IAAAuI,uBADC,CAER1F,aAAc,CAAA,CAFN,CADmB,CAK7B4T,SAAU,CACR7U,MAAO,oBADC,CAERiB,aAAc,CAAA,CAFN,CALmB,CAS7B2Q,UAAW,CACT5R,MAAO,IADE,CAETiB,aAAc,CAAA,CAFL,CATkB,CAA/B,CAeA,EACE,WADF,CAEE,cAFF,CAGE,QAHF,CAAA9D,QAAA,CAIU,QAAA,CAAC2X,CAAD,CAAU,CAClBjU,MAAAC,eAAA,CAAsBiR,CAAtB,CAA6B+C,CAA7B,CAAmC,CACjC9U,MAAOqC,IAAAA,EAD0B,CAEjCpB,aAAc,CAAA,CAFmB,CAAnC,CADkB,CAJpB,CAWA,EACE,eADF,CAEE,SAFF,CAGE,aAHF,CAAA9D,QAAA,CAIU,QAAA,CAAC2X,CAAD,CAAU,CAClBjU,MAAAC,eAAA,CAAsBiR,CAAtB,CAA6B+C,CAA7B,CAAmC,CACjC,IAAA/T,QAAG,EAAG,CACJ,MAAO,KAAA0D,KAAA,CAAUqQ,CAAV,CADH,CAD2B;AAIjC7T,aAAc,CAAA,CAJmB,CAAnC,CADkB,CAJpB,CAlC8C,CAiDzC,IAAI8T,GRzhBAjL,CQyhB+BK,EAAA,CACxC,QAAQ,EAAG,EAD6B,CACxB,QAAQ,CAAC/N,CAAD,CAAU,CAChC,IAAMgR,ETnfMzD,CSmfD,CAAuBvN,CAAvB,CACNgR,EAAA3D,GAAL,GACE2D,CAAA3D,GAEA,CAFwB,CAAA,CAExB,CADA0K,CAAA,CAAmB/X,CAAnB,CAA4ByW,EAA5B,CAA8C,CAAA,CAA9C,CACA,CAAAsB,CAAA,CAAmB/X,CAAnB,CAA4B0W,EAA5B,CAA+C,CAAA,CAA/C,CAHF,CAFgC,CAD7B,CAWIkC,GRpiBAlL,CQoiB8BK,EAAA,CACvC,QAAQ,EAAG,EAD4B,CACvB,QAAQ,CAAC/N,CAAD,CAAU,CT7fpBuN,CS8fDyD,CAAuBhR,CAAvBgR,CACN5D,GAAL,GACE2K,CAAA,CAAmB/X,CAAnB,CAA4B4W,EAA5B,CAA6C,CAAA,CAA7C,CACA,CAAAmB,CAAA,CAAmB/X,CAAnB,CAA4BwX,EAA5B,CAAgD,CAAA,CAAhD,CAFF,CAFgC,C,CGliB7B,IAAA,GJAMvB,CIAN,WAwBP4C,SAASA,GAAQ,CAAC/W,CAAD,CAAOmO,CAAP,CAAkB6I,CAAlB,CAA4B,CH8flCH,EG7fT,CAA6B7W,CAA7B,CACAgX,EAAA,CAAWA,CAAX,EAAuB,IACvB,KAAMzK,EZUQd,CYVG,CAAuBzL,CAAvB,CAAjB,CACMiX,EZSQxL,CYTQ,CAAuB0C,CAAvB,CADtB,CAEM+I,EAAeF,CAAA,CZQPvL,CYRkB,CAAuBuL,CAAvB,CAAX,CAA8C,IAEnEzK,EAAApB,gBAAA,CAA2B6L,CAAA,CAAWE,CAAA/L,gBAAX,CACzBgD,CAAA/C,UAEF,IADI+L,CACJ,CZUcxL,CYXJ,CAAiBY,CAAApB,gBAAjB,CACV,CACEgM,CAAA/N,YAAA,CAAkBpJ,CAIpB,IADIoX,CACJ,CZKczL,CYNJ,CAAiBY,CAAAnD,YAAjB,CAAwC4N,CAAxC,CACV,CACEI,CAAAjM,gBAAA,CAAsBnL,CAGxBuM,EAAAjO,WAAA,CAAsB6P,CAClB6I,EAAJ,CACMA,CADN,GACmBC,CAAApX,WADnB,GAEIoX,CAAApX,WAFJ,CAE+BG,CAF/B,GAKEiX,CAAA7L,UACA,CAD0BpL,CAC1B,CAAKiX,CAAApX,WAAL,GACEoX,CAAApX,WADF,CAC6BG,CAD7B,CANF,CAWAiX,EAAA/U,WAAA,CAA2B,IA/BgB;AA8DfmV,QAAA,GAAQ,CAACrX,CAAD,CAAOgQ,CAAP,CAAc,CAClD,IAAMzD,EZlDQd,CYkDG,CAAuBzL,CAAvB,CACjB,IAA4BmE,IAAAA,EAA5B,GAAIoI,CAAA1M,WAAJ,CAKE,IAJMmS,CAIGxP,CAJEwN,CAIFxN,EAJWN,EAAA,CAAWlC,CAAX,CAIXwC,CAHT+J,CAAA1M,WAGS2C,CAHawP,CAAA,CAAG,CAAH,CAGbxP,EAHsB,IAGtBA,CAFT+J,CAAAnB,UAES5I,CAFYwP,CAAA,CAAGA,CAAAhT,OAAH,CAAa,CAAb,CAEZwD,EAF+B,IAE/BA,CHocFsU,EGrcP,CAA4B9W,CAA5B,CACSwC,CAAAA,CAAAA,CAAE,CAAX,CAAcA,CAAd,CAAgBwP,CAAAhT,OAAhB,CAA2BwD,CAAA,EAA3B,CAAgC,CAC9B,IAAMsF,EAAIkK,CAAA,CAAGxP,CAAH,CAAV,CACM0M,EZ1DIzD,CY0DC,CAAuB3D,CAAvB,CACXoH,EAAA5Q,WAAA,CAAgB0B,CAChBkP,EAAA9F,YAAA,CAAiB4I,CAAA,CAAGxP,CAAH,CAAK,CAAL,CAAjB,EAA4B,IAC5B0M,EAAA/D,gBAAA,CAAqB6G,CAAA,CAAGxP,CAAH,CAAK,CAAL,CAArB,EAAgC,IHob3BqU,GGnbL,CAA6B/O,CAA7B,CAN8B,CAPgB,C,CCpF7C,IAAA,GLFMqM,CKEN,WAYAhL;QAASA,GAAY,CAACmO,CAAD,CAAStX,CAAT,CAAegX,CAAf,CAAyB,CACnD,GAAIhX,CAAJ,GAAasX,CAAb,CACE,KAAM7E,MAAA,CAAM,uFAAN,CAAN,CAEF,GAAIuE,CAAJ,CAAc,CACZ,IAAMO,EbyBM5L,CazBI,CAAiBqL,CAAjB,CACVpK,EAAAA,CAAI2K,CAAJ3K,EAAe2K,CAAAjZ,WACrB,IAAW6F,IAAAA,EAAX,GAAKyI,CAAL,EAAwBA,CAAxB,GAA8B0K,CAA9B,EACSnT,IAAAA,EADT,GACGyI,CADH,EACsBtO,EAAA,CAAW0Y,CAAX,CADtB,GAC+CM,CAD/C,CAEE,KAAM7E,MAAA,CAAM,+HAAN,CAAN,CALU,CASd,GAAIuE,CAAJ,GAAiBhX,CAAjB,CACE,MAAOA,EAGLA,EAAA1B,WAAJ,EAGE+R,EAAA,CAAYrQ,CAAA1B,WAAZ,CAA6B0B,CAA7B,CAGF,KACIwX,CADJ,CAEIC,CACJ,IAAI,CAACzX,CAAA,mBAAL,CAAiC,CAElB,GAAAwX,CAAA,CADbA,CACa,CZnBD7K,EYkBA,CAA4B2K,CAA5B,CACC,CAAA,CA2Cf,IAAII,CACmB,OAAvB,GA5C4B1X,CA4CxBL,UAAJ,CACE+X,CADF,CACU,CA7CkB1X,CA6ClB,CADV,CA5C4BA,CA8CjBmC,iBAFX;CAGEuV,CAHF,CA5C4B1X,CA+ClBmC,iBAAA,CAAsB,MAAtB,CAHV,CAME,EAAA,CADEuV,CAAJ,EAAaA,CAAA1Y,OAAb,CACS0Y,CADT,CAPgC,IAAA,EA1CjB,CACTD,CAAJ,GACED,CHkTF,CGlTEA,CHkTF,CGlTsBC,CHkTtB,CGlTsBA,CHkTtB,CADAE,CANAC,EAOA,CADAD,CANqBC,EAOrB,EAP2C,EAO3C,CADAD,CALAE,EAMA,CADAF,CALiBE,EAMjB,EANmC,EAMnC,CADAF,CAJAG,EAKA,CADAH,CAJgBG,EAKhB,EALiC,EAKjC,CAAA,CAAAF,EAAA5J,KAAA,MAAA,CAAA,CAAA4J,EAAA,CAAA,EAAA,OAAA,CAA2BF,CI9U7B,WAAwB,MAAxB,CJ8U6BA,CI9U7B,CAGSK,EAAA,CAA0BC,EAAA,CJ2UNN,CI3UM,CAA1B,CJ2UP,CAAA,CGnTA,CAH+B,CAQjC,CAAyB,MAAzB,GAAIJ,CAAA3X,UAAJ,EAAmC8X,CAAnC,IACED,CADF,CACcA,CADd,EZzBc7K,EY0Ba,CAA4B2K,CAA5B,CAD3B,GAGIW,EAAA,CAAAT,CAAA,CAGJ,IZxCclL,CYwCV,CAAkCgL,CAAlC,CAAJ,CAA+C,CACAN,CAAAA,CAAAA,CJ0etCF,GG9hBT,CCoDuCQ,CDpDvC,CACML,EAAAA,CZiCQxL,CYjCQ,CCmDiB6L,CDnDjB,CACWnT,KAAAA,EAAjC,GAAI8S,CAAApX,WAAJ,GACEoX,CAAA/U,WADF,CAC6B,IAD7B,CAIA,IC8CiClC,CD9C7BC,SAAJ,GAAsBC,IAAAuI,uBAAtB,CAAmD,CAC7CuJ,CAAAA,CC6C2BhS,CD7CtBkC,WACT,KAASM,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkBwP,CAAAhT,OAAlB,CAA6BwD,CAAA,EAA7B,CACEuU,EAAA,CAAS/E,CAAA,CAAGxP,CAAH,CAAT,CC2CmC8U,CD3CnC,CAA2BN,CAA3B,CAGIzK,EAAAA,CZsBMd,CYtBK,CCwCczL,CDxCd,CACbkY,EAAAA,CAAmC/T,IAAAA,EAAzB,GAACoI,CAAA1M,WAAD,CAAsC,IAAtC,CAA6CsE,IAAAA,EAC3DoI,EAAA1M,WAAA,CAAsB0M,CAAAnB,UAAtB,CAA2C8M,CAC3C3L,EAAArK,WAAA,CAAsBgW,CAT2B,CAAnD,IAWEnB,GAAA,CCmC+B/W,CDnC/B,CCmCqCsX,CDnCrC,CAA0BN,CAA1B,CCsCMmB,EAAAA,CbdMxM,CacO,CAAiB2L,CAAjB,CACnB,IAAIc,EAAA,CAAsBd,CAAtB,CAAJ,CAAmC,CACjCW,EAAA,CAAAE,CAAAxN,KAAA,CACA;IAAA0N,EAAsB,CAAA,CAFW,CAAnC,IAKWF,EAAAxN,KAAJ,GACL0N,CADK,CACiB,CAAA,CADjB,CAVsC,CAc1CA,CAAL,GAEMlK,CAGJ,CZtDY3B,CYmDI,CAAkB8K,CAAlB,CAAA,CACYA,CAAD/Q,KADX,CAC2B+Q,CAE3C,CAAIN,CAAJ,EACEA,CACA,CADWsB,EAAA,CAAkBtB,CAAlB,CACX,CAAAuB,CAAApP,aAAAkB,KAAA,CAAgC8D,CAAhC,CAA2CnO,CAA3C,CAAiDgX,CAAjD,CAFF,EAIEuB,CAAA1T,YAAAwF,KAAA,CAA+B8D,CAA/B,CAA0CnO,CAA1C,CATJ,CAYAwY,GAAA,CAAiBlB,CAAjB,CAAyBtX,CAAzB,CACA,OAAOA,EAnE4C;AAyF9CqQ,QAASA,GAAW,CAACiH,CAAD,CAAStX,CAAT,CAAe,CACxC,GAAIA,CAAA1B,WAAJ,GAAwBgZ,CAAxB,CACE,KAAM7E,MAAA,CAAM,sDAAN,CACJzS,CADI,CAAN,CAGF,IACIwX,EZtFU7K,EYsFE,CAA4B3M,CAA5B,CADhB,CAGMmY,EbnEQxM,CamEK,CAAiB2L,CAAjB,CACnB,IZlGchL,CYkGV,CAAkCgL,CAAlC,CAAJ,CAA+C,CDrD/C,IAAM/K,EZtBQd,CYsBG,CCsDezL,CDtDf,CAAjB,CACMiX,EZvBQxL,CYuBQ,CCqDgB6L,CDrDhB,CCqDUtX,EDpDhC,GAAaiX,CAAApX,WAAb,GACEoX,CAAApX,WADF,CAC6B0M,CAAAnD,YAD7B,CCoDgCpJ,EDjDhC,GAAaiX,CAAA7L,UAAb,GACE6L,CAAA7L,UADF,CAC4BmB,CAAApB,gBAD5B,CAGA,KAAIyB,EAAIL,CAAApB,gBAAR,CACIrD,EAAIyE,CAAAnD,YACJwD,EAAJ,GZhCcnB,CYiCZ,CAAuBmB,CAAvB,CAAAxD,YADF,CAC0CtB,CAD1C,CAGIA,EAAJ,GZnCc2D,CYoCZ,CAAuB3D,CAAvB,CAAAqD,gBADF,CAC8CyB,CAD9C,CAMAL,EAAAjO,WAAA,CAAsBiO,CAAApB,gBAAtB,CACAoB,CAAAnD,YADA,CACuBjF,IAAAA,EACUA,KAAAA,EAAjC,GAAI8S,CAAA/U,WAAJ,GAEE+U,CAAA/U,WAFF,CAE6B,IAF7B,CCkCE,IAAIkW,EAAA,CAAsBd,CAAtB,CAAJ,CAAmC,CACjCW,EAAA,CAAAE,CAAAxN,KAAA,CACA,KAAA8N,EAAsB,CAAA,CAFW,CAFU,CAO/CC,EAAA,CAAqB1Y,CAArB,CAEA,IAAIwX,CAAJ,CAAe,CAEb,CADImB,CACJ,CADwBrB,CACxB,EADuD,MACvD,GADkCA,CAAA3X,UAClC;CACE8Y,CADF,CACwB,CAAA,CADxB,CH+SA,IG5SyBjB,CH4SpBK,EAAL,CAAA,CAGAe,EAAA,CG/SyBpB,CH+SzB,CAEM3H,EAAAA,CGjTmB2H,CHiTbM,EACZ,KAAShQ,EAAT,GAAc+H,EAAd,CAEE,IADI6H,CACKlV,CADGqN,CAAA,CAAI/H,EAAJ,CACHtF,CAAAA,CAAAA,CAAE,CAAX,CAAcA,CAAd,CAAkBkV,CAAA1Y,OAAlB,CAAgCwD,CAAA,EAAhC,CAAqC,CACnC,IAAIqW,EAAOnB,CAAA,CAAMlV,CAAN,CACX,ITzUQ0L,ESyUJ,CGtTiDlO,CHsTjD,CAA0B6Y,CAA1B,CAAJ,CAAqC,CACnCnB,CAAAoB,OAAA,CAAatW,CAAb,CAAgB,CAAhB,CACMuW,KAAAA,EGxTavB,CHwTTK,EAAApS,QAAA,CAAuBoT,CAAvB,CACD,EAAT,EAAIE,CAAJ,EGzTmBvB,CH0TjBK,EAAAiB,OAAA,CAAsBC,CAAtB,CAAyB,CAAzB,CAEFvW,EAAA,EAiCA6P,EAAAA,CV/aM1G,CU+aC,CAhCoBkN,CAgCpB,CAEb,IADIlR,CACJ,CADS0K,CAAAxH,EACT,CACE,IAAK,IAAIrI,EAAE,CAAX,CAAcA,CAAd,CAAgBmF,CAAA3I,OAAhB,CAA2BwD,CAAA,EAA3B,CAAgC,CAC9B,IAAIxC,EAAO2H,CAAA,CAAGnF,CAAH,CAAX,CACI8U,EAAShZ,EAAA,CAAW0B,CAAX,CACTsX,EAAJ,EACEjH,CAAAA,YAAAhG,KAAA,CAAiBiN,CAAjB,CAAyBtX,CAAzB,CAJ4B,CAQlCqS,CAAAxH,EAAA,CAAsB,EACtBwH,EAAApH,cAAA,CAAqB,EA3Cf+N,EAAA,CAAY,CAAA,CARuB,CAFF,CAcvC,IAAA,GAAOA,CAtBP,CAAA,IAD+B,GAAA,CAAA,IAAA,EG1S/B,EAAIC,EAAJ,EAA8BN,CAA9B,GACEV,EAAA,CAAAT,CAAA,CAPW,CAUViB,CAAL,GAEMtK,CAOJ,CZzHY3B,CYkHI,CAAkB8K,CAAlB,CAAA,CACYA,CAAD/Q,KADX,CAEd+Q,CAKF,EAAM3M,CAAAwN,CAAAxN,KAAN,EAA4C,MAA5C,GAAyB3K,CAAAL,UAAzB,EACGwO,CADH,GACiB7P,EAAA,CAAW0B,CAAX,CADjB,GAEEuY,CAAAlI,YAAAhG,KAAA,CAA+B8D,CAA/B,CAA0CnO,CAA1C,CAXJ,CAcAwY,GAAA,CAAiBlB,CAAjB,CAAyB,IAAzB,CAA+BtX,CAA/B,CACA,OAAOA,EA3CiC;AA8C1C0Y,QAASA,GAAoB,CAAC1Y,CAAD,CAAO,CAelC,IAAMuM,EbxHQZ,CawHG,CAbM3L,CAaN,CAbjB,IAceuM,CAdf,EAcuDpI,IAAAA,EAdvD,GAc2BoI,CAAAlB,EAd3B,CAA8B,CACxB2G,CAAAA,CAAKhS,CAAAkC,WACT,KAF4B,IAEnBM,EAAE,CAFiB,CAEdmG,EAAEqJ,CAAAhT,OAFY,CAED8I,CAA3B,CAA+BtF,CAA/B,CAAiCmG,CAAjC,GAAwCb,CAAxC,CAA0CkK,CAAA,CAAGxP,CAAH,CAA1C,EAAkDA,CAAA,EAAlD,CACEkW,EAAA,CAAqB5Q,CAArB,CAH0B,CAO9B,GADMyE,CACN,CblHcZ,CaiHG,CAAiB3L,CAAjB,CACjB,CACEuM,CAAAlB,EAAA,CAA0BlH,IAAAA,EAVM,CA0BpCmU,QAASA,GAAiB,CAACtY,CAAD,CAAO,CAC/B,IAAIkZ,EAAWlZ,CACXA,EAAJ,EAA+B,MAA/B,GAAYA,CAAAL,UAAZ,GAGEuZ,CAHF,CAGa,CADLC,CACK,EAFL5M,CAEK,CbxICZ,CasIK,CAAiB3L,CAAjB,CAEN,GADmBuM,CAAA1B,EACnB,GAAasO,CAAAna,OAAb,CAAgCma,CAAA,CAAU,CAAV,CAAhC,CACTb,EAAA,CAAkBtY,CAAAoJ,YAAlB,CAJJ,CAMA,OAAO8P,EARwB,CAWjCd,QAASA,GAAqB,CAACpY,CAAD,CAAO,CAGnC,OADI2K,CACJ,EAFM4B,CAEN,CbjJcZ,Ca+IG,CAAiB3L,CAAjB,CAEjB,GADuBuM,CAAA5B,KACvB,GAAgByO,EAAA,CAAAzO,CAAA,CAHmB;AAarC0O,QAASA,GAAyB,CAACrZ,CAAD,CAAO6B,CAAP,CAAa,CAC7C,GAAa,MAAb,GAAIA,CAAJ,CACQyV,CACN,CADetX,CAAA1B,WACf,CAAI8Z,EAAA,CAAsBd,CAAtB,CAAJ,EACEW,EAAA,Cb/JUtM,Ca+JV,CAAiB2L,CAAjB,CAAA3M,KAAA,CAHJ,KAKO,IAAuB,MAAvB,GAAI3K,CAAAL,UAAJ,EAA0C,MAA1C,GAAiCkC,CAAjC,GACD8I,CADC,CZtLOgC,EYuLD,CAA4B3M,CAA5B,CADN,EAEK,CHqPV,GGpPE2K,CHoPGkN,EAAL,CAAA,CAGA,IAAMyB,EGvPiBtZ,CHuPPuZ,GAAhB,CACM1X,EAAO2X,EAAA,CGxPUxZ,CHwPV,CACb,IAAI6B,CAAJ,GAAayX,CAAb,CAAA,CAII5B,CAAAA,CG7PF/M,CH6PUmN,EAAA,CAAcwB,CAAd,CACZ,KAAM9W,EAAIkV,CAAAjS,QAAA,CG9PazF,CH8Pb,CACD,EAAT,EAAIwC,CAAJ,EACEkV,CAAAoB,OAAA,CAAatW,CAAb,CAAgB,CAAhB,CAGEH,EAAAA,CGnQFsI,CHmQSmN,EAAA,CAAcjW,CAAd,CAAPQ,GGnQFsI,CHmQiCmN,EAAA,CAAcjW,CAAd,CAA/BQ,CAAqD,EAArDA,CACJA,EAAA2L,KAAA,CGpQuBhO,CHoQvB,CACkB,EAAlB,CAAIqC,CAAArD,OAAJ,GGrQE2L,CHsQAmN,EAAA,CAAcjW,CAAd,CADF,CACwB4X,EAAA,CAAgBpX,CAAhB,CADxB,CAZA,CALA,CGnPE4V,EAAA,CAAAtN,CAAA,CAFQ,CARiC,CAoB/C6N,QAASA,GAAgB,CAACxY,CAAD,CAAO0Z,CAAP,CAAkBC,CAAlB,CAA+B,CAGtD,GADMzO,CACN,EAFMqB,CAEN,CblLcZ,CagLG,CAAiB3L,CAAjB,CAEjB,GAD6BuM,CAAArB,EAC7B,CACMwO,CAMJ,EALExO,CAAAxB,WAAAsE,KAAA,CAAyB0L,CAAzB,CAKF,CAHIC,CAGJ,EAFEzO,CAAAyD,aAAAX,KAAA,CAA2B2L,CAA3B,CAEF,CAAA7K,EAAA,CAAA5D,CAAA,CAVoD;AAkBjDa,QAASA,GAAW,CAAC/L,CAAD,CAAgB,CACzC,GAAKA,CAAL,EAAcA,CAAAC,SAAd,CAAA,CAGA,IAAMsM,Eb5MQd,Ca4MG,CAAuBzL,CAAvB,CAAjB,CACI2K,EAAO4B,CAAAlB,EACElH,KAAAA,EAAb,GAAIwG,CAAJ,GZhOc6B,CYiOR,CAAkBxM,CAAlB,CAAJ,EACE2K,CACA,CADO3K,CACP,CAAAuM,CAAAlB,EAAA,CAA0BV,CAF5B,GAKEA,CAMA,CANO,CADH2M,CACG,CADMtX,CAAA1B,WACN,EAASyN,EAAA,CAAYuL,CAAZ,CAAT,CAA+BtX,CAMtC,CAAIuY,CAAArK,SAAA7D,KAAA,CAA4B1M,QAAAic,gBAA5B,CAAsD5Z,CAAtD,CAAJ,GACEuM,CAAAlB,EADF,CAC4BV,CAD5B,CAXF,CADF,CAkBA,OAAOA,EAvBP,CADyC,CAmCpCkP,QAASA,GAAK,CAAC7Z,CAAD,CAAO8Z,CAAP,CAAgBC,CAAhB,CAAwB,CAC3C,IAAI1X,EAAO,EACX2X,GAAA,CAAcha,CAAAkC,WAAd,CAA+B4X,CAA/B,CACEC,CADF,CACU1X,CADV,CAEA,OAAOA,EAJoC,CAO7C2X,QAASA,GAAa,CAACC,CAAD,CAAWH,CAAX,CAAoBC,CAApB,CAA4B1X,CAA5B,CAAkC,CACtD,IADsD,IAC7CG,EAAE,CAD2C,CACxCmG,EAAEsR,CAAAjb,OADsC,CACrByS,CAAjC,CAAqCjP,CAArC,CAAuCmG,CAAvC,GAA8C8I,CAA9C,CAAgDwI,CAAA,CAASzX,CAAT,CAAhD,EAA8DA,CAAA,EAA9D,CAAmE,CAC7D,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,SAAA,GAAA,IAAA,aAAA,CAAA,CACA,CAAA,CAAA,CAAA,KAAA,EAAA,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,CAAA,CAOF0X,EAASJ,CAAA,CAAQ9Z,CAAR,CACTka,EAAJ,EACE7X,CAAA2L,KAAA,CAAUhO,CAAV,CAEE+Z,EAAJ,EAAcA,CAAA,CAAOG,CAAP,CAAd,CACE,CADF,CACSA,CADT,EAGAF,EAAA,CAAcha,CAAAkC,WAAd,CAA+B4X,CAA/B,CACEC,CADF,CACU1X,CADV,CARiD,CAAA,CAAA,CAAA,IAAA,EAKjD,CAZM,CAAJ,GAAI,CAAJ,CAEE,KAH+D,CADb,CA4BxD,IAAI8X,GAAc,IAEXvY;QAASA,GAAY,CAAC5B,CAAD,CAAO2B,CAAP,CAAaG,CAAb,CAAoB,CACzCqY,EAAL,GACEA,EADF,CACgB3c,MAAA,SADhB,EACsCA,MAAA,SAAA,YADtC,CAGI2c,GAAJ,EAA4B,OAA5B,GAAmBxY,CAAnB,CACEwY,EAAA,gBAAA,CAA+Bna,CAA/B,CAAqC8B,CAArC,CADF,EAGEyW,CAAA3W,aAAAyI,KAAA,CAAgCrK,CAAhC,CAAsC2B,CAAtC,CAA4CG,CAA5C,CACA,CAAAuX,EAAA,CAA0BrZ,CAA1B,CAAgC2B,CAAhC,CAJF,CAJ8C,CAsCzC4O,QAASA,GAAU,CAACvQ,CAAD,CAAOoa,CAAP,CAAa,CACrC,GAAIpa,CAAA5B,cAAJ,GAA2BT,QAA3B,CACE,MAAO4a,EAAAhI,WAAAlG,KAAA,CAA8B1M,QAA9B,CAAwCqC,CAAxC,CAA8Coa,CAA9C,CAET,KAAItS,EAAIyQ,CAAAhI,WAAAlG,KAAA,CAA8B1M,QAA9B,CAAwCqC,CAAxC,CAA8C,CAAA,CAA9C,CACR,IAAIoa,CAAJ,CAAU,CACJpI,CAAAA,CAAKhS,CAAAkC,WACAM,EAAAA,CAAE,CAAX,KAAK,IAAS6X,CAAd,CAAkB7X,CAAlB,CAAsBwP,CAAAhT,OAAtB,CAAiCwD,CAAA,EAAjC,CACE6X,CACA,CADK9J,EAAA,CAAWyB,CAAA,CAAGxP,CAAH,CAAX,CAAkB,CAAA,CAAlB,CACL,CAAAsF,CAAAjD,YAAA,CAAcwV,CAAd,CAJM,CAOV,MAAOvS,EAZ8B,C,CEvVvC,IAAoBwS,GAAoB,iBAApBA,CAAsCC,IAAAC,IAAA,EAA1D,CAGIC,GAAiB,CACnB,KAAQ,CAAA,CADW,CAEnB,MAAS,CAAA,CAFU,CAGnB,QAAW,CAAA,CAHQ,CAInB,SAAY,CAAA,CAJO,CAKnB,MAAS,CAAA,CALU,CAMnB,SAAY,CAAA,CANO,CAOnB,UAAa,CAAA,CAPM,CAQnB,WAAc,CAAA,CARK,CASnB,WAAc,CAAA,CATK,CAUnB,UAAa,CAAA,CAVM,CAWnB,SAAY,CAAA,CAXO,CAYnB,UAAa,CAAA,CAZM,CAanB,QAAW,CAAA,CAbQ,CAcnB,MAAS,CAAA,CAdU,CAenB,YAAe,CAAA,CAfI,CAgBnB,MAAS,CAAA,CAhBU,CAiBnB,QAAW,CAAA,CAjBQ,CAkBnB,MAAS,CAAA,CAlBU,CAmBnB,iBAAoB,CAAA,CAnBD,CAoBnB,kBAAqB,CAAA,CApBF,CAqBnB,eAAkB,CAAA,CArBC,CAsBnB,WAAc,CAAA,CAtBK,CAuBnB,SAAY,CAAA,CAvBO,CAwBnB,UAAa,CAAA,CAxBM,CAyBnB,YAAe,CAAA,CAzBI,CA0BnB,YAAe,CAAA,CA1BI,CA2BnB,aAAgB,CAAA,CA3BG,CA4BnB,YAAe,CAAA,CA5BI,CA6BnB,YAAe,CAAA,CA7BI,CA8BnB,UAAa,CAAA,CA9BM,CA+BnB,cAAiB,CAAA,CA/BE,CAgCnB,WAAc,CAAA,CAhCK,CAiCnB,aAAgB,CAAA,CAjCG,CAkCnB,kBAAqB,CAAA,CAlCF,CAmCnB,mBAAsB,CAAA,CAnCH;AAoCnB,UAAa,CAAA,CApCM,CAqCnB,KAAQ,CAAA,CArCW,CAsCnB,UAAa,CAAA,CAtCM,CAuCnB,UAAa,CAAA,CAvCM,CAwCnB,SAAY,CAAA,CAxCO,CAyCnB,KAAQ,CAAA,CAzCW,CA0CnB,QAAW,CAAA,CA1CQ,CA2CnB,YAAe,CAAA,CA3CI,CA4CnB,WAAc,CAAA,CA5CK,CA6CnB,YAAe,CAAA,CA7CI,CA8CnB,SAAY,CAAA,CA9CO,CAiDrBC,SAASA,GAAY,CAACC,CAAD,CAAYzB,CAAZ,CAAsB,CACzC,IAAI0B,EAAe,EAAnB,CACIC,EAAUF,CAEd,KADIG,CACJ,CADgBH,CAAA,GAAcnd,MAAd,CAAuBA,MAAvB,CAAgCmd,CAAA5O,YAAA,EAChD,CAAO8O,CAAP,CAAA,CACED,CAAA5M,KAAA,CAAkB6M,CAAlB,CAEE,CAAAA,CAAA,CADEA,CAAA7P,aAAJ,CACY6P,CAAA7P,aADZ,CAEW6P,CAAA5a,SAAJ,GAAyBC,IAAAuI,uBAAzB,EAAwDoS,CAAAtU,KAAxD,GAAyE2S,CAAzE,EAAqF2B,CAArF,GAAiGC,CAAjG,EACKD,CAAAtU,KADL,CAGKsU,CAAAvc,WAIVsc,EAAA,CAAaA,CAAA5b,OAAb,CAAmC,CAAnC,CAAJ,GAA8CrB,QAA9C,EACEid,CAAA5M,KAAA,CAAkBxQ,MAAlB,CAEF,OAAOod,EAlBkC;AAqB3CG,QAASA,GAAQ,CAACC,CAAD,CAAUC,CAAV,CAAgB,CAC/B,GAAI,Cd3DUzO,Cc2Dd,CACE,MAAOwO,EAILE,EAAAA,CAAcR,EAAA,CAAaM,CAAb,CAAsB,CAAA,CAAtB,CAElB,KAR+B,IAQtBxY,EAAE,CARoB,CAQjB2Y,CARiB,CAQPC,CARO,CAQGzQ,CARH,CAQS0Q,CAAxC,CAAiD7Y,CAAjD,CADSyY,CAC4Cjc,OAArD,CAAgEwD,CAAA,EAAhE,CAOE,GANA2Y,CAMI,CARGF,CAEI,CAAGzY,CAAH,CAMP,CALJmI,CAKI,CALGwQ,CAAA,GAAa3d,MAAb,CAAsBA,MAAtB,CAA+B2d,CAAApP,YAAA,EAKlC,CAJApB,CAIA,GAJSyQ,CAIT,GAHFC,CACA,CADUH,CAAAzV,QAAA,CAAoBkF,CAApB,CACV,CAAAyQ,CAAA,CAAWzQ,CAET,EAAA,CdzEQ6B,CcyEP,CAAkB7B,CAAlB,CAAD,EAAuC,EAAvC,CAA4B0Q,CAAhC,CACE,MAAOF,EAhBoB;AAqBjC,IAAIG,GAAa,CAKXpC,YAAW,EAAA,CAEU,CAAA,CAAvB,GAAI,IAAAqC,UAAJ,EAAoDpX,IAAAA,EAApD,GAAgC,IAAAqX,EAAhC,GACE,IAAAA,EADF,CACoBf,EAAA,CAAe,IAAAnd,KAAf,CADpB,CAGA,OAAO,KAAAke,EAAP,EAA0B,CAAA,CALb,CALA,CAgBf,aAAAZ,QAAY,EAAG,CACR,IAAAa,EAAL,GACE,IAAAA,EADF,CACwBf,EAAA,CAAa,IAAA,SAAb,CAA+B,IAAAxB,SAA/B,CADxB,CAGA,OAAO,KAAAuC,EAJM,CAhBA,CA0BX3R,UAAS,EAAA,CACX,MAAOiR,GAAA,CAAS,IAAAW,cAAT,CAA6B,IAAAd,aAAA,EAA7B,CADI,CA1BE,CAkCXe,iBAAgB,EAAA,CAClB,GAAI,CAAC,IAAAC,EAAL,CACE,MAAO,KAEJ,KAAAC,EAAL,GACE,IAAAA,EADF,CACqCnB,EAAA,CAAa,IAAAkB,EAAb,CAAmC,CAAA,CAAnC,CADrC,CAIA,OAAOb,GAAA,CAAS,IAAAW,cAAT,CAA6B,IAAAG,EAA7B,CARW,CAlCL,CA+Cf,gBAAAC,QAAe,EAAG,CAChBC,KAAA9R,UAAA6R,gBAAAzR,KAAA,CAAqC,IAArC,CACA,KAAA2R,EAAA,CAA4B,CAAA,CAFZ,CA/CH,CAsDf,yBAAAC,QAAwB,EAAG,CACzBF,KAAA9R,UAAAgS,yBAAA5R,KAAA,CAA8C,IAA9C,CAEA;IAAA2R,EAAA,CADA,IAAAE,EACA,CADqC,CAAA,CAFZ,CAtDZ,CA8DjBC,SAASA,GAAiB,CAACC,CAAD,CAAO,CAGnBC,QAAA,EAAQ,CAAC/e,CAAD,CAAOgf,CAAP,CAAgB,CAC9B5e,CAAAA,CAAQ,IAAI0e,CAAJ,CAAS9e,CAAT,CAAegf,CAAf,CACZ5e,EAAA8d,EAAA,CAAmBc,CAAnB,EAA8B,CAAA,CAAQA,CAAA,SACtC,OAAO5e,EAH2B,CdpGtB+P,Ec0Gd,CAAY4O,CAAZ,CAAmBD,CAAnB,CACAC,EAAApS,UAAA,CAAkBmS,CAAAnS,UAClB,OAAOoS,EAXwB,CAcjC,IAAIE,GAA8B,CAChC,MAAS,CAAA,CADuB,CAEhC,KAAQ,CAAA,CAFwB,CAWlCC,SAASA,GAAa,CAAC9e,CAAD,CAAQ,CAC5B,MAAOA,EAAA,SAAP,GAA6BA,CAAAoM,OAA7B,EAA6CpM,CAAAke,EAA7C,GAAuEle,CAAAie,cAD3C,CAU9Bc,QAASA,GAAY,CAAC/e,CAAD,CAAQsC,CAAR,CAAc0c,CAAd,CAAqB,CAGxC,GAFIC,CAEJ,CAFS3c,CAAA4c,WAET,EAF4B5c,CAAA4c,WAAA,CAAgBlf,CAAAJ,KAAhB,CAE5B,EADE0C,CAAA4c,WAAA,CAAgBlf,CAAAJ,KAAhB,CAAA,CAA4Bof,CAA5B,CACF,CACE,IADM,IACGla,EAAI,CADP,CACUqa,CAAhB,EAAqBA,CAArB,CAA0BF,CAAA,CAAGna,CAAH,CAA1B,IACM,CAAAga,EAAA,CAAc9e,CAAd,CADN,EAC8BA,CAAAoM,OAD9B,GAC+CpM,CAAAie,cAD/C,IAIEkB,CAAAxS,KAAA,CAAQrK,CAAR,CAActC,CAAd,CACIwe,CAAAA,CAAAxe,CAAAwe,EALN,EAAkC1Z,CAAA,EAAlC,EAJsC;AAgB1Csa,QAASA,GAAwB,CAACtY,CAAD,CAAI,CACnC,IAAIyW,EAAOzW,CAAAoW,aAAA,EAGXjY,OAAAC,eAAA,CAAsB4B,CAAtB,CAAyB,eAAzB,CAA0C,CACxC3B,IAAKA,QAAQ,EAAG,CACd,MAAO7C,EADO,CADwB,CAIxC+C,aAAc,CAAA,CAJ0B,CAA1C,CAMA,KAAK,IAAIP,EAAIyY,CAAAjc,OAAJwD,CAAkB,CAA3B,CAAmC,CAAnC,EAA8BA,CAA9B,CAAsCA,CAAA,EAAtC,CAA2C,CACzC,IAAAxC,EAAOib,CAAA,CAAKzY,CAAL,CAEPia,GAAA,CAAajY,CAAb,CAAgBxE,CAAhB,CAAsB,SAAtB,CACA,IAAIwE,CAAAwX,EAAJ,CACE,MALuC,CAU3CrZ,MAAAC,eAAA,CAAsB4B,CAAtB,CAAyB,YAAzB,CAAuC,CAAC,IAAA3B,QAAG,EAAG,CAAE,MAAOkZ,MAAAgB,UAAT,CAAP,CAAvC,CAIA,KAAIC,CACJ,KAASxa,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoByY,CAAAjc,OAApB,CAAiCwD,CAAA,EAAjC,CAAsC,CACpCxC,CAAA,CAAOib,CAAA,CAAKzY,CAAL,CACP,KAAM+J,EflMMZ,CekMK,CAAiB3L,CAAjB,CACX2K,EAAAA,CAAO4B,CAAP5B,EAAmB4B,CAAA5B,KACzB,IAAU,CAAV,GAAInI,CAAJ,EAAgBmI,CAAhB,EAAwBA,CAAxB,GAAiCqS,CAAjC,CAME,GALAP,EAAA,CAAajY,CAAb,CAAgBxE,CAAhB,CAAsB,QAAtB,CAKIgc,CAHAhc,CAGAgc,GAHSxe,MAGTwe,GAFFgB,CAEEhB,CAFchc,CAAA+L,YAAA,EAEdiQ,EAAAxX,CAAAwX,EAAJ,CACE,KAXgC,CAzBH;AAyD9BiB,QAASA,GAAY,CAACC,CAAD,CAAWld,CAAX,CAAiB1C,CAAjB,CAAuB6f,CAAvB,CAAgCC,CAAhC,CAAsCC,CAAtC,CAA+C,CACzE,IAAK,IAAI7a,EAAI,CAAb,CAAgBA,CAAhB,CAAoB0a,CAAAle,OAApB,CAAqCwD,CAAA,EAArC,CAA0C,CACd,IAAA,EAAA0a,CAAA,CAAS1a,CAAT,CAAA,CAdpB8a,EAIJC,CAJF,KAc0B,CAbjBC,EAGPD,CAHF,QAa0B,CAZpBE,EAEJF,CAFF,KAY0B,CAXjBG,EACPH,CADF,QAWA,IAAuCvd,CAAvC,GAVEud,CALFI,KAeA,EAA6CrgB,CAA7C,GARSggB,CAQT,EAAmDH,CAAnD,GAPYK,CAOZ,EAA4DJ,CAA5D,GANSK,CAMT,EAAkEJ,CAAlE,GALYK,CAKZ,CACE,MAAOlb,EAF+B,CAK1C,MAAQ,EANiE;AAyBpE/C,QAASA,GAAgB,CAACnC,CAAD,CAAOsgB,CAAP,CAAgBC,CAAhB,CAAkC,CAChE,GAAKD,CAAL,CAAA,CAIA,IAAME,EAAc,MAAOF,EAG3B,IAAoB,UAApB,GAAIE,CAAJ,EAAkD,QAAlD,GAAkCA,CAAlC,CAKA,GAAoB,QAApB,GAAIA,CAAJ,EAAkCF,CAAAG,YAAlC,EAAwF,UAAxF,GAAyD,MAAOH,EAAAG,YAAhE,CAAA,CAWA,GAAIF,CAAJ,EAAoD,QAApD,GAAwB,MAAOA,EAA/B,CAA8D,CAC5D,IAAAV,EAAU,CAAA,CAAQU,CAAAV,QAClB,KAAAC,EAAO,CAAA,CAAQS,CAAAT,KACf,KAAAC,EAAU,CAAA,CAAQQ,CAAAR,QAH0C,CAA9D,IAKEF,EAEA,CAFU,CAAA,CAAQU,CAElB,CAAAR,CAAA,CADAD,CACA,CADO,CAAA,CAMT,KAAItT,EAAU+T,CAAV/T,EAA8B+T,CAAAG,EAA9BlU,EAAiE,IAArE,CAEIoT,EAAWU,CAAA,CAAQtD,EAAR,CACf,IAAI4C,CAAJ,CAEE,IAAoE,EAApE,CAAID,EAAA,CAAaC,CAAb,CAAuBpT,CAAvB,CAA+BxM,CAA/B,CAAqC6f,CAArC,CAA8CC,CAA9C,CAAoDC,CAApD,CAAJ,CACE,MADF,CAFF,IAMEO,EAAA,CAAQtD,EAAR,CAAA,CAA6B,EAOzB2D,EAAAA,CAAYA,QAAQ,CAACzZ,CAAD,CAAI,CAExB4Y,CAAJ,EACE,IAAA5d,oBAAA,CAAyBlC,CAAzB,CAA+BsgB,CAA/B,CAAwCC,CAAxC,CAEGrZ,EAAA,SAAL,EACE0Z,EAAA,CAAW1Z,CAAX,CAGF,IAAIsF,CAAJ,GAAe,IAAf,CAAqB,CAEnB,IAAAqU,EAAwBxb,MAAAqH,yBAAA,CAAgCxF,CAAhC,CAAmC,eAAnC,CACxB7B,OAAAC,eAAA,CAAsB4B,CAAtB,CAAyB,eAAzB,CAA0C,CAAC,IAAA3B,QAAG,EAAG,CAAE,MAAOiH,EAAT,CAAP;AAA0B/G,aAAc,CAAA,CAAxC,CAA1C,CAHmB,CAQrB,GAAIyB,CAAA0U,SAAJ,EAAsD,EAAtD,CAAkB1U,CAAAoW,aAAA,EAAAnV,QAAA,CAAyBqE,CAAzB,CAAlB,CACE,GAAI0S,EAAA,CAAchY,CAAd,CAAJ,EAAwBA,CAAAsF,OAAxB,GAAqCtF,CAAAmX,cAArC,CACMnX,CAAA4Z,WAAJ,GAAqBrC,KAAAsC,eAArB,EACE7Z,CAAAyX,yBAAA,EAFJ,KAOA,IAAIzX,CAAA4Z,WAAJ,GAAqBrC,KAAAuC,gBAArB,EAA+C9Z,CAAA1G,QAA/C,EAA4D0G,CAAAsF,OAA5D,GAAyEA,CAAzE,EAAqFA,CAArF,WAAuG4G,OAAvG,CAAA,CAGA,IAAI6N,EAAsB,UAAhB,GAAAT,CAAA,CACRF,CAAAvT,KAAA,CAAaP,CAAb,CAAqBtF,CAArB,CADQ,CAEPoZ,CAAAG,YAFO,EAEgBH,CAAAG,YAAA,CAAoBvZ,CAApB,CACtBsF,EAAJ,GAAe,IAAf,GAEMqU,CAAJ,EACExb,MAAAC,eAAA,CAAsB4B,CAAtB,CAAyB,eAAzB,CAA0C2Z,CAA1C,CACA,CAAAA,CAAA,CAAwB,IAF1B,EAIE,OAAO3Z,CAAA,cANX,CASA,OAAO+Z,EAfP,CAzB0B,CA4C9BX,EAAA,CAAQtD,EAAR,CAAAtM,KAAA,CAAgC,CAG9BhO,KAAM8J,CAHwB,CAI9BxM,KAAMA,CAJwB,CAK9B6f,QAASA,CALqB,CAM9BC,KAAMA,CANwB,CAO9BC,QAASA,CAPqB,CAQ9BY,GAAWA,CARmB,CAAhC,CAWI1B,GAAA,CAA4Bjf,CAA5B,CAAJ,EACE,IAAAsf,WAGA;AAHkB,IAAAA,WAGlB,EAHqC,EAGrC,CAFA,IAAAA,WAAA,CAAgBtf,CAAhB,CAEA,CAFwB,IAAAsf,WAAA,CAAgBtf,CAAhB,CAExB,EADE,CAAC,QAAW,EAAZ,CAAgB,OAAU,EAA1B,CACF,CAAA,IAAAsf,WAAA,CAAgBtf,CAAhB,CAAA,CAAsB6f,CAAA,CAAU,SAAV,CAAsB,QAA5C,CAAAnP,KAAA,CAA2DiQ,CAA3D,CAJF,EAQE5T,CAFU,IAAAmU,WAAgB9N,OAAhB8N,CAAyBjG,CAAA9H,GAAzB+N,CACRjG,CAAA9Y,iBACF4K,MAAA,CAAS,IAAT,CAAe/M,CAAf,CAAqB2gB,CAArB,CAAgCJ,CAAhC,CAtGF,CAZA,CADgE;AA0H3Dre,QAASA,GAAmB,CAAClC,CAAD,CAAOsgB,CAAP,CAAgBC,CAAhB,CAAkC,CACnE,GAAKD,CAAL,CAAA,CAMA,GAAIC,CAAJ,EAAoD,QAApD,GAAwB,MAAOA,EAA/B,CAA8D,CAC5D,IAAAV,EAAU,CAAA,CAAQU,CAAAV,QAClB,KAAAC,EAAO,CAAA,CAAQS,CAAAT,KACf,KAAAC,EAAU,CAAA,CAAQQ,CAAAR,QAH0C,CAA9D,IAKEF,EAEA,CAFU,CAAA,CAAQU,CAElB,CAAAR,CAAA,CADAD,CACA,CADO,CAAA,CAGT,KAAItT,EAAU+T,CAAV/T,EAA8B+T,CAAAG,EAA9BlU,EAAiE,IAArE,CAEImU,EAAY9Z,IAAAA,EAtJZ+Y,KAAAA,EAAW,IACf,IAAI,CACFA,CAAA,CAqJ8BU,CArJnB,CAAUtD,EAAV,CADT,CAEF,MAAO9V,CAAP,CAAU,EAqJR0Y,CAAJ,GACMuB,CACJ,CADUxB,EAAA,CAAaC,CAAb,CAAuBpT,CAAvB,CAA+BxM,CAA/B,CAAqC6f,CAArC,CAA8CC,CAA9C,CAAoDC,CAApD,CACV,CAAW,EAAX,CAAIoB,CAAJ,GACER,CAEA,CAFYf,CAAApE,OAAA,CAAgB2F,CAAhB,CAAqB,CAArB,CAAA,CAAwB,CAAxB,CAAAR,GAEZ,CAAKf,CAAAle,OAAL,GACE4e,CAAA,CAAQtD,EAAR,CADF,CAC+BnW,IAAAA,EAD/B,CAHF,CAFF,CAYAkG,EAFU,IAAAjK,WAAgBsQ,OAAhBtQ,CAAyBmY,CAAA5H,GAAzBvQ,CACRmY,CAAA/Y,oBACF6K,MAAA,CAAS,IAAT,CAAe/M,CAAf,CAAqB2gB,CAArB,EAAkCL,CAAlC,CAA2CC,CAA3C,CACII,EAAJ,EAAiB1B,EAAA,CAA4Bjf,CAA5B,CAAjB,EACI,IAAAsf,WADJ,EACuB,IAAAA,WAAA,CAAgBtf,CAAhB,CADvB,GAEQqU,CAEN,CAFY,IAAAiL,WAAA,CAAgBtf,CAAhB,CAAA,CAAsB6f,CAAA,CAAU,SAAV,CAAsB,QAA5C,CAEZ,CADMsB,CACN,CADY9M,CAAAlM,QAAA,CAAYwY,CAAZ,CACZ,CAAW,EAAX,CAAIQ,CAAJ,EACE9M,CAAAmH,OAAA,CAAW2F,CAAX,CAAgB,CAAhB,CALJ,CAhCA,CADmE;AA2CrEC,QAASA,GAA2B,EAAG,CACrC,IAAKC,IAAIA,CAAT,GAAepC,GAAf,CACE/e,MAAAiC,iBAAA,CAAwBkf,CAAxB,CAA4B,QAAQ,CAACna,CAAD,CAAI,CACjCA,CAAA,SAAL,GACE0Z,EAAA,CAAW1Z,CAAX,CACA,CAAAsY,EAAA,CAAyBtY,CAAzB,CAFF,CADsC,CAAxC,CAKG,CAAA,CALH,CAFmC,CAWvC0Z,QAASA,GAAU,CAACxgB,CAAD,CAAQ,CACzBA,CAAA,SAAA,CAAoBA,CAAAoM,OACpBpM,EAAAke,EAAA,CAAwBle,CAAAie,cAExB,Id5dS/P,Cc4dLK,EAAJ,CAAA,CdlZA,IAAI4H,EAAQlR,MAAAic,eAAA,CcmZWlhB,CdnZX,CACZ,IAAI,CAACmW,CAAAC,eAAA,CAAqB,cAArB,CAAL,CAA2C,CACzC,IAAI+K,EAAalc,MAAAyN,OAAA,CAAcyD,CAAd,CACjBgL,EAAAC,GAAA,CAA2BjL,CAC3B1G,GAAA,CAAO0R,CAAP,Cc+Y4BvD,Ed/Y5B,CACAzH,EAAA,aAAA,CAAwBgL,CAJiB,CckZpBnhB,Cd3YvB+Y,UAAA,CAAgB5C,CAAA,ac0YhB,CAAA,Id3ac1G,Gc+aZ,CAAazP,CAAb,CAAoB4d,EAApB,CARuB,CAY3B,IAAIyD,GAAe5C,EAAA,CAAkB3e,MAAAue,MAAlB,CAAnB,CACIiD,GAAqB7C,EAAA,CAAkB3e,MAAAC,YAAlB,CADzB,CAEIwhB,GAAoB9C,EAAA,CAAkB3e,MAAA0hB,WAAlB,C,CCvexBC,QAASA,GAAS,CAAClK,CAAD,CAAiBmK,CAAjB,CAA6B,CAC7C,MAAO,CACLnK,MAAOA,CADF,CAELoK,EAwJiCA,EA1J5B,CAGLD,EAAYA,CAHP,CADsC;AAqI/CE,QAASA,GAAW,CAACzE,CAAD,CAAwB0E,CAAxB,CACEC,CADF,CACiBC,CADjB,CACyB,CADfC,IAAAA,EAwGA,CAxGAA,CACHC,EAuGgC,CAxG7BD,CAExBE,EAAc,CAFUF,CAGxBG,EAAc,CAHUH,CAMxBI,EAAYC,IAAAC,IAAA,CAAST,CAAT,CAAsBG,CAAtB,CAAoCD,CAApC,CAA6CE,CAA7C,CAChB,IAAoB,CAApB,EAAID,CAAJ,EAAqC,CAArC,EAAyBC,CAAzB,CA2EgD,CAAA,CAAA,CAChD,IAASnd,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CA3E2Csd,CA2E3C,CAAkCtd,CAAA,EAAlC,CACE,GA5E2BqY,CA4EfoF,CAAQzd,CAARyd,CAAZ,GA5EoCT,CA4EZU,CAAI1d,CAAJ0d,CAAxB,CACE,MAAA,CACJ,EAAA,CA9E2CJ,CA0EK,CAxEhD,GAAIP,CAAJ,EAAkB1E,CAAA7b,OAAlB,EAAoCygB,CAApC,EAA8CD,CAAAxgB,OAA9C,CAAA,CAgFImhB,CAAAA,CA/EyBtF,CA+EhB7b,OAGb,KAFA,IAAIohB,EAhFkCZ,CAgFzBxgB,OAAb,CACIqhB,EAAQ,CACZ,CAAOA,CAAP,CAlF2CP,CAkF3C,CAlFuDF,CAkFvD,EAA+BU,EAAA,CAlFFzF,CAkFS,CAAQ,EAAEsF,CAAV,CAAP,CAlFOX,CAkFmB,CAAI,EAAEY,CAAN,CAA1B,CAA/B,CAAA,CACEC,CAAA,EAEF,EAAA,CAAOA,CAtFP,CAGAX,CAAA,EAAgBE,CAChBD,EAAA,EAAYC,CACZL,EAAA,EAAcM,CACdJ,EAAA,EAAUI,CAEV,IAAiC,CAAjC,EAAIN,CAAJ,CAAiBG,CAAjB,EAA2D,CAA3D,EAAsCD,CAAtC,CAA+CE,CAA/C,CACE,MAAO,EAET,IAAID,CAAJ,EAAoBH,CAApB,CAAgC,CAE9B,IADAzG,CACA,CADSqG,EAAA,CAAUO,CAAV,CAA4B,CAA5B,CACT,CAAOC,CAAP,CAAkBF,CAAlB,CAAA,CACE3G,CAAAuG,EAAArR,KAAA,CAAoBwR,CAAA,CAAIG,CAAA,EAAJ,CAApB,CAEF,OAAO,CAAE7G,CAAF,CALuB,CAMzB,GAAI6G,CAAJ,EAAgBF,CAAhB,CACL,MAAO,CAAEN,EAAA,CAAUO,CAAV,CAA4BH,CAA5B,CAAyCG,CAAzC,CAAF,CAGsBA,EAAAA,CAAAA,CACCC,EAAAA,CAAAA,CA1I5BY,EAAAA,CA0IsCd,CA1ItCc,CAAoBZ,CAApBY,CAA+B,CAC/BC,EAAAA,CAwIyCjB,CAxIzCiB,CAA2Bd,CAA3Bc,CAA0C,CAC1CC,EAAAA,CAAgBxQ,KAAJ,CAAUsQ,CAAV,CAGhB,KAAS/d,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB+d,CAApB,CAA8B/d,CAAA,EAA9B,CACEie,CAAA,CAAUje,CAAV,CACA,CADmByN,KAAJ,CAAUuQ,CAAV,CACf,CAAAC,CAAA,CAAUje,CAAV,CAAA,CAAa,CAAb,CAAA,CAAkBA,CAIpB,KAASke,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBF,CAApB,CAAiCE,CAAA,EAAjC,CACED,CAAA,CAAU,CAAV,CAAA,CAAaC,CAAb,CAAA,CAAkBA,CAEpB,KAASle,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB+d,CAApB,CAA8B/d,CAAA,EAA9B,CACE,IAASke,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBF,CAApB,CAAiCE,CAAA,EAAjC,CACE,GAyHkB7F,CAzHPoF,CAAQP,CAARO,CAAuBS,CAAvBT,CAA2B,CAA3BA,CAAX,GA0HuBT,CA1HmBU,CAAIP,CAAJO,CAAe1d,CAAf0d,CAAmB,CAAnBA,CAA1C,CACEO,CAAA,CAAUje,CAAV,CAAA,CAAake,CAAb,CAAA;AAAkBD,CAAA,CAAUje,CAAV,CAAc,CAAd,CAAA,CAAiBke,CAAjB,CAAqB,CAArB,CADpB,KAEK,CACH,IAAIC,EAAQF,CAAA,CAAUje,CAAV,CAAc,CAAd,CAAA,CAAiBke,CAAjB,CAARC,CAA8B,CAAlC,CACIC,EAAOH,CAAA,CAAUje,CAAV,CAAA,CAAake,CAAb,CAAiB,CAAjB,CAAPE,CAA6B,CACjCH,EAAA,CAAUje,CAAV,CAAA,CAAake,CAAb,CAAA,CAAkBC,CAAA,CAAQC,CAAR,CAAeD,CAAf,CAAuBC,CAHtC,CAeLpe,CAAAA,CAPGie,CAOCzhB,OAAJwD,CAAuB,CACvBke,EAAAA,CARGD,CAQC,CAAU,CAAV,CAAAzhB,OAAJ0hB,CAA0B,CAC1B7F,EAAAA,CATG4F,CASO,CAAUje,CAAV,CAAA,CAAake,CAAb,CAEd,KADIG,CACJ,CADY,EACZ,CAAW,CAAX,CAAOre,CAAP,EAAoB,CAApB,CAAgBke,CAAhB,CAAA,CACW,CAAT,EAAIle,CAAJ,EACEqe,CAAA7S,KAAA,CAxDW8S,CAwDX,CACA,CAAAJ,CAAA,EAFF,EAKS,CAAT,EAAIA,CAAJ,EACEG,CAAA7S,KAAA,CA5Dc+S,CA4Dd,CACA,CAAAve,CAAA,EAFF,GAKIwe,CAUJ,CAhCKP,CAsBW,CAAUje,CAAV,CAAc,CAAd,CAAA,CAAiBke,CAAjB,CAAqB,CAArB,CAUhB,CATIE,CASJ,CAhCKH,CAuBM,CAAUje,CAAV,CAAc,CAAd,CAAA,CAAiBke,CAAjB,CASX,CARIC,CAQJ,CAhCKF,CAwBO,CAAUje,CAAV,CAAA,CAAake,CAAb,CAAiB,CAAjB,CAQZ,CAJEV,CAIF,CALIY,CAAJ,CAAWD,CAAX,CACQC,CAAA,CAAOI,CAAP,CAAmBJ,CAAnB,CAA0BI,CADlC,CAGQL,CAAA,CAAQK,CAAR,CAAoBL,CAApB,CAA4BK,CAEpC,CAAIhB,CAAJ,EAAWgB,CAAX,EACMA,CAAJ,EAAiBnG,CAAjB,CACEgG,CAAA7S,KAAA,CA/EWiT,CA+EX,CADF,EAGEJ,CAAA7S,KAAA,CAhFYkT,CAgFZ,CACA,CAAArG,CAAA,CAAUmG,CAJZ,CAOA,CADAxe,CAAA,EACA,CAAAke,CAAA,EARF,EASWV,CAAJ,EAAWY,CAAX,EACLC,CAAA7S,KAAA,CApFc+S,CAoFd,CAEA,CADAve,CAAA,EACA,CAAAqY,CAAA,CAAU+F,CAHL,GAKLC,CAAA7S,KAAA,CAzFW8S,CAyFX,CAEA,CADAJ,CAAA,EACA,CAAA7F,CAAA,CAAU8F,CAPL,CAxBP,CAmCFE,EAAAM,QAAA,EA8DArI,EAAA,CAAS3U,IAAAA,EACLid,EAAAA,CAAU,EAGd,KAAS5e,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAjEOqe,CAiEa7hB,OAApB,CAAgCwD,CAAA,EAAhC,CACE,OAlEKqe,CAkEE,CAAIre,CAAJ,CAAP,EACE,KArKaye,CAqKb,CACMnI,CAAJ,GACEsI,CAAApT,KAAA,CAAa8K,CAAb,CACA,CAAAA,CAAA,CAAS3U,IAAAA,EAFX,CAKA8Q,EAAA,EACAoM,EAAA,EACA,MACF,MA7KcH,CA6Kd,CACOpI,CAAL,GACEA,CADF,CACWqG,EAAA,CAAUlK,CAAV,CAAqB,CAArB,CADX,CAGA6D,EAAAsG,EAAA,EACAnK,EAAA,EAEA6D,EAAAuG,EAAArR,KAAA,CAAoBwR,CAAA,CAAI6B,CAAJ,CAApB,CACAA,EAAA,EACA,MACF,MAtLWP,CAsLX,CACOhI,CAAL,GACEA,CADF,CACWqG,EAAA,CAAUlK,CAAV,CAAqB,CAArB,CADX,CAGA6D;CAAAsG,EAAA,EACAnK,EAAA,EACA,MACF,MA5Lc8L,CA4Ld,CACOjI,CAIL,GAHEA,CAGF,CAHWqG,EAAA,CAAUlK,CAAV,CAAqB,CAArB,CAGX,EADA6D,CAAAuG,EAAArR,KAAA,CAAoBwR,CAAA,CAAI6B,CAAJ,CAApB,CACA,CAAAA,CAAA,EAhCJ,CAqCEvI,CAAJ,EACEsI,CAAApT,KAAA,CAAa8K,CAAb,CAEF,OAAOsI,EA9EoC,CAkG7Cd,QAASA,GAAM,CAACL,CAAD,CAAeC,CAAf,CAA8B,CAC3C,MAAOD,EAAP,GAAwBC,CADmB,C,CNhOtC,IAAA,GFJM/L,CEIN,WAAA,CAAY,GFJNA,CEIM,WAAZ,CAMDmN,GAA6B,EAOnCC,SAASA,GAAY,CAACvhB,CAAD,CAAO,CAC1B,IAAIwhB,EAAY,EAChB,GACEA,EAAAC,QAAA,CAAkBzhB,CAAlB,CADF,OAEUA,CAFV,CAEiBA,CAAA1B,WAFjB,CAGA,OAAOkjB,EALmB,CAc1BnhB,QAFWmW,GAEA,CAACkL,CAAD,CAAQnb,CAAR,CAAc+V,CAAd,CAAuB,CAChC,GAAIoF,CAAJ,GAAcJ,EAAd,CACE,KAAM,KAAIK,SAAJ,CAAc,qBAAd,CAAN,CAKF,IAAAjV,GAAA,CAzBmBkV,WA0Bb5P,EAAAA,CAAK9P,EAAA,CAAWqE,CAAX,CAEX,KAAAA,KAAA,CAAYA,CACZ,KAAAsb,EAAA,CAAavF,CAAb,EAAwBA,CAAAwF,KE4CjBzK,GF1CP,CAAiB9Q,CAAjB,CAAuByL,CAAvB,CACM+P,EAAAA,CVDMpW,CUCK,CAAiBpF,CAAjB,CACjBwb,EAAApX,KAAA,CAAgB,IAChBoX,EAAArX,GAAA,CAhCgBsX,QAgCM,GAAA,IAAAH,EAAA,CAA6B,IAA7B,CAAoC,IAEpDI,EAAAA,CVZMxW,CUYK,CAAuB,IAAvB,CACjBwW,EAAApiB,WAAA,CAAsBoiB,CAAA7W,UAAtB,CACI6W,CAAA3jB,WADJ,CAC0B2jB,CAAA7Y,YAD1B,CAEI6Y,CAAA9W,gBAFJ,CAE+B,IAC/B8W,EAAA/f,WAAA,CAAsB,EAEtB,KAAAggB,EAAA,CAAsB,CAAA,CAKtB,KAAAtK,EAAA,CADA,IAAAE,EACA,CAFA,IAAAD,EAEA,CAFiB,IAIRrV,EAAAA,CAAE,CAAX,KAAK,IAASmG,EAAEqJ,CAAAhT,OAAhB,CAA2BwD,CAA3B,CAA+BmG,CAA/B,CAAkCnG,CAAA,EAAlC,CACE6N,CAAAA,YAAAhG,KAAA,CAAiB9D,CAAjB,CAAuByL,CAAA,CAAGxP,CAAH,CAAvB,CAhC8B;AAqClCyV,QAAA,GAAY,CAAZA,CAAY,CAAG,CACR,CAAAiK,EAAL,GACE,CAAAA,EACA,CADsB,CAAA,CACtB,CRtEU5T,EQsEV,CAAQ,QAAA,EAAM,CAAA,MAAA6T,GAAA,CAHHA,CAGG,CAAA,CAAd,CAFF,CADa,CAmCfA,QAAA,GAAO,CAAPA,CAAO,CAAG,CAxBR,IAyBa,IAAA,CAzBb,CAAOxX,CAAP,CAAA,CAAa,CACPA,CAAAuX,EAAJ,GACEE,CADF,CACezX,CADf,CAUe,EAAA,CAAA,CAPRA,IAAAA,EAAAA,CAQLA,EAAAA,CAAO,CAAApE,KAAAwF,YAAA,EACX,ITzEYS,CSyER,CAAkB7B,CAAlB,CAAJ,CAEE,IADA,IAAIqH,EAAK,CAAAzL,KAAArE,WAAT,CACSM,EAAE,CAAX,CAAiBA,CAAjB,CAAqBwP,CAAAhT,OAArB,CAAgCwD,CAAA,EAAhC,CAEE,GADAiP,CAsNK,CAtNDO,CAAA,CAAGxP,CAAH,CAsNC,CAAkB,MAAlB,EArNsBiP,CAqNtB9R,UArNL,CACE,MAAA,CAPW,EAAA,CAAA,IAAA,EAAA,CAXJ,CAyBAgL,CACb,EADaA,CAEX,YAAA,EAHM;AAQV,EAAA,UAAA,YAAA,CAAA,QAAe,EAAG,CAChB,IAAAuX,EAAA,CAAsB,CAAA,CACtB,IAAI,IAAArK,EAAJ,CAAoB,CAQpBe,EAAA,CAPEyJ,IAOF,CAEA,KAHY,IAGH7f,EAAE,CAHC,CAGEqW,CAAd,CAAoBrW,CAApB,CATE6f,IASsBxK,EAAA7Y,OAAxB,CAA+CwD,CAAA,EAA/C,CAAoD,CAClDqW,CAAA,CAVAwJ,IAUOxK,EAAA,CAAerV,CAAf,CA0FT,KAAM8f,EV1KM3W,CU0KK,CAAiBkN,CAAjB,CAAjB,CACIlR,EAAK2a,CAAArX,cACTqX,EAAArX,cAAA,CAAyB,EACzBqX,EAAAzX,EAAA,CAA0B,EAE1B,IADAyX,CAAAvX,GACA,CADoCpD,CACpC,CACE,IAASnF,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkBmF,CAAA3I,OAAlB,CAA6BwD,CAAA,EAA7B,CAAkC,CAChC,IAAIsF,EVjLI6D,CUiLA,CAAiBhE,CAAA,CAAGnF,CAAH,CAAjB,CACRsF,EAAAgD,EAAA,CAAsBhD,CAAAkD,aAIlBlD,EAAAkD,aAAJ,GAAuB6N,CAAvB,GACE/Q,CAAAkD,aADF,CACmB,IADnB,CANgC,CAjGgB,CAKpD,IAASlD,CAAT,CAdEua,IAcS9b,KAAA1G,WAAX,CAAiCiI,CAAjC,CAAoCA,CAApC,CAAsCA,CAAAsB,YAAtC,CACEmZ,EAAA,CAfAF,IAeA,CAA2Bva,CAA3B,CAGF,KAAStF,CAAT,CAAW,CAAX,CAAcA,CAAd,CAlBE6f,IAkBgBxK,EAAA7Y,OAAlB,CAAyCwD,CAAA,EAAzC,CAA8C,CACtCqW,CAAN,CAnBAwJ,IAmBaxK,EAAA,CAAerV,CAAf,CACP8f,EAAAA,CV1FI3W,CU0FO,CAAiBkN,CAAjB,CAEjB,IAAI,CAACyJ,CAAArX,cAAAjM,OAAL,CACE,IAAS8I,CAAT,CAAW+Q,CAAAhZ,WAAX,CAA4BiI,CAA5B,CAA+BA,CAA/B,CAAiCA,CAAAsB,YAAjC,CACEmZ,EAAA,CAxBJF,IAwBI,CAA2Bva,CAA3B,CAA8B+Q,CAA9B,CAKJ,EADM2J,CACN,EAFMC,CAEN,CVnGU9W,CUiGa,CAAiBkN,CAAAva,WAAjB,CAEvB,GADyCmkB,CAAA9X,KACzC,GAAsByO,EAAA,CAAAoJ,CAAA,CAAtB,EACEA,CAAA,YAAA,EAEFE;EAAA,CAhCAL,IAgCA,CAAkCC,CAAAzX,EAAlC,CACEyX,CAAArX,cADF,CAGA,IADI0X,CACJ,CADwBL,CAAAvX,GACxB,CAAuB,CACrB,IAASvI,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkBmgB,CAAA3jB,OAAlB,CAA4CwD,CAAA,EAA5C,CV1GQmJ,CU2GN,CAAiBgX,CAAA,CAAkBngB,CAAlB,CAAjB,CAAAsI,EAAA,CAA2D,IAE7DwX,EAAAvX,GAAA,CAAoC,IAEhC4X,EAAA3jB,OAAJ,CAA+BsjB,CAAArX,cAAAjM,OAA/B,GACEsjB,CAAA1X,EADF,CACmB,CAAA,CADnB,CANqB,CAcnB0X,CAAA1X,EAAJ,GACE0X,CAAA1X,EACA,CADiB,CAAA,CACjB,CAAAgY,EAAA,CAnDFP,IAmDE,CAAqBxJ,CAArB,CAFF,CA/B4C,CAmIxCnB,CAAAA,CApJJmL,IAoJYhL,EACViL,EAAAA,CAAc,EAClB,KAAStgB,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkBkV,CAAA1Y,OAAlB,CAAgCwD,CAAA,EAAhC,CACQ8U,CAQN,CAReI,CAAA,CAAMlV,CAAN,CAAAlE,WAQf,EADM6Z,CACN,CVtOUxM,CUqOS,CAAiB2L,CAAjB,CACnB,GAAoBa,CAAAxN,KAApB,EACE,EAA8B,CAA9B,CAAAmY,CAAArd,QAAA,CAAoB6R,CAApB,CAAA,CADF,EAEEwL,CAAA9U,KAAA,CAAiBsJ,CAAjB,CAGJ,KAAS9U,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkBsgB,CAAA9jB,OAAlB,CAAsCwD,CAAA,EAAtC,CAA2C,CACnCxC,CAAAA,CAAO8iB,CAAA,CAAYtgB,CAAZ,CACMugB,EAAAA,CAAA/iB,CAAA+iB,GAtKnBF,IAsKmBE,CAtKnBF,IAsKmCtc,KAAhBwc,CAA4B/iB,CAO7CsT,EAAAA,CAAW,EACXtB,EAAAA,CAPmDhS,CAO9CkC,WACT,KAAK,IAAIM,EAAI,CAAb,CAAgBA,CAAhB,CAAoBwP,CAAAhT,OAApB,CAA+BwD,CAAA,EAA/B,CAAoC,CAClC,IAAIyP,EAAQD,CAAA,CAAGxP,CAAH,CAIZ,IAcyB,MAdzB,EAA2ByP,CAcpBtS,UAdP,CAAmC,CAC7BkL,CAAAA,CV5PIc,CU4Pa,CAAiBsG,CAAjB,CAAApH,EACrB,KAAK,IAAI6V,EAAI,CAAb,CAAgBA,CAAhB,CAAoB7V,CAAA7L,OAApB,CAA2C0hB,CAAA,EAA3C,CAEIpN,CAAAtF,KAAA,CADoBnD,CAAAmY,CAAetC,CAAfsC,CACpB,CAJ6B,CAAnC,IAOE1P,EAAAtF,KAAA,CAAciE,CAAd,CAZgC,CA2BjBrJ,CAAAA,CAAAA,IAAAA,EAHfsQ,EAAAA,CAAWhX,EAAA,CAAWiM,CAAX,CACXiT,EAAAA,CMlFC9B,EAAA,CNkF0BhM,CMlF1B,CNkF0BA,CMlFFtU,OAAxB,CNkFoCka,CMlFpC,CNkFoCA,CMjFnBla,OADjB,CNoFL;IAJqC,IAIvBikB,EAALzgB,CAAKygB,CAAH,CAAX,CAAuBzgB,CAAvB,CAAyB4e,CAAApiB,OAAzB,GAA6C4J,CAA7C,CAA+CwY,CAAA,CAAQ5e,CAAR,CAA/C,EAA4DA,CAAA,EAA5D,CAAiE,CAC/D,IAD+D,IACtDke,EAAE,CADoD,CACjD5Y,CAAd,CAAkB4Y,CAAlB,CAAsB9X,CAAAyW,EAAArgB,OAAtB,GAA4C8I,CAA5C,CAA8Cc,CAAAyW,EAAA,CAAUqB,CAAV,CAA9C,EAA6DA,CAAA,EAA7D,CAKMpiB,EAAA,CAAWwJ,CAAX,CAIJ,GAJsBqG,CAItB,EAHEkC,CAAAA,YAAAhG,KAAA,CAAiB8D,CAAjB,CAA4BrG,CAA5B,CAGF,CAAAoR,CAAAJ,OAAA,CAAgBlQ,CAAAqM,MAAhB,CAA0BgO,CAA1B,CAA6B,CAA7B,CAEFA,EAAA,EAAKra,CAAAwW,EAZ0D,CAejE,IAAS5c,CAAT,CAAW,CAAX,CAAwBA,CAAxB,CAA0B4e,CAAApiB,OAA1B,GAA8C4J,CAA9C,CAAgDwY,CAAA,CAAQ5e,CAAR,CAAhD,EAA6DA,CAAA,EAA7D,CAEE,IADA0gB,CACSxC,CADFxH,CAAA,CAAStQ,CAAAqM,MAAT,CACEyL,CAAAA,CAAAA,CAAE9X,CAAAqM,MAAX,CAAuByL,CAAvB,CAA2B9X,CAAAqM,MAA3B,CAAqCrM,CAAAwW,EAArC,CAAmDsB,CAAA,EAAnD,CACE5Y,CAEA,CAFIwL,CAAA,CAASoN,CAAT,CAEJ,CADAvX,CAAAA,aAAAkB,KAAA,CAAkB8D,CAAlB,CAA6BrG,CAA7B,CAAgCob,CAAhC,CACA,CAAAhK,CAAAJ,OAAA,CAAgB4H,CAAhB,CAAmB,CAAnB,CAAsB5Y,CAAtB,CA1DuC,CAtKvB,CAFJ,CAqElBya,SAAA,GAAqB,CAArBA,CAAqB,CAACviB,CAAD,CAAOmjB,CAAP,CAAmB,CACtC,IAAM5W,EVhJMd,CUgJK,CAAuBzL,CAAvB,CAAjB,CACIojB,EAAU7W,CAAAzB,EACdyB,EAAAzB,EAAA,CAA6B,IAExB+N,EAAL,GAGEA,CAHF,EAEQxW,CAFR,CAEe,CAAAyV,EAAA,CADF9X,CAAA6Y,KACE,EA/KGwK,YA+KH,CAFf,GAGiBhhB,CAAA,CAAK,CAAL,CAHjB,CAKIwW,EAAJ,EVzJYpN,CU0JO6W,CAAuBzJ,CAAvByJ,CACjBrX,cAAA+C,KAAA,CAA4BhO,CAA5B,CACA,CAAAuM,CAAAvB,aAAA,CAAwB6N,CAH1B,EAKEtM,CAAAvB,aALF,CAK0B7G,IAAAA,EAEtBif,EAAJ,GAAgB7W,CAAAvB,aAAhB,EACMuB,CAAAvB,aADN,GVhKYS,CUkKR,CAAuBc,CAAAvB,aAAvB,CAAAJ,EAFJ,CAE0D,CAAA,CAF1D,CAjBsC;AAqDxC8X,QAAA,GAA4B,CAA5BA,CAA4B,CAACvJ,CAAD,CAAYmK,CAAZ,CAAsB,CAChD,IADgD,IACvC9gB,EAAE,CADqC,CAClCsF,CAAd,CAAkBtF,CAAlB,CAAoB8gB,CAAAtkB,OAApB,GAAyC8I,CAAzC,CAA2Cwb,CAAA,CAAS9gB,CAAT,CAA3C,EAAyDA,CAAA,EAAzD,CACE,GAAmB,MAAnB,EAAIsF,CAAAnI,UAAJ,CAA2B,CACzB,IAAM4jB,EVhME5X,CUgMe,CAAiB7D,CAAjB,CAAAmD,cACnBsY,EAAJ,EAAsBA,CAAAvkB,OAAtB,EACE0jB,EAAA,CAAAA,CAAA,CAAkCvJ,CAAlC,CAA6CoK,CAA7C,CAHuB,CAA3B,IAMEpK,EAAAnL,KAAA,CAAesV,CAAA,CAAS9gB,CAAT,CAAf,CAR4C,CAalDogB,QAAA,GAAe,CAAfA,CAAe,CAAC/J,CAAD,CAAO,CAIpBtP,CAAAA,cAAAc,KAAA,CAAmBwO,CAAnB,CAAyB,IAAIkD,KAAJ,CAAU,YAAV,CAAzB,CACMuG,EAAAA,CV/MM3W,CU+MK,CAAiBkN,CAAjB,CACbyJ,EAAAtX,aAAJ,EACE4X,EAAA,CAAAA,CAAA,CAAqBN,CAAAtX,aAArB,CAPkB,CA2GtB4N,QAAA,GAAc,CAAdA,CAAc,CAAG,CACf,GAAI,CAAAhB,EAAJ,EAA0B,CAAAA,EAAA5Y,OAA1B,CAAqD,CAYrD,IAXiB4Y,IAAAA,EAAAA,CAAAA,EAAAA,CAUb4L,CAVa5L,CAWRpV,EAAE,CAAX,CAAcA,CAAd,CAAkBkV,CAAA1Y,OAAlB,CAAgCwD,CAAA,EAAhC,CAAqC,CACnC,IAAIqW,EAAOnB,CAAA,CAAMlV,CAAN,CEzRN6U,GF+RL,CAAiBwB,CAAjB,CE/RKxB,GFgSL,CAAiBwB,CAAAva,WAAjB,CACA,KAAIuD,EAAO2X,EAAA,CAAkBX,CAAlB,CApBX4K,EAqBI3L,EAAA,CAAcjW,CAAd,CAAJ,EACE2hB,CAEA,CAFkBA,CAElB,EAFqC,EAErC,CADAA,CAAA,CAAgB3hB,CAAhB,CACA,CADwB,CAAA,CACxB,CAxBF4hB,CAwBE3L,EAAA,CAAcjW,CAAd,CAAAmM,KAAA,CAAyB6K,CAAzB,CAHF,EArBA4K,CA0BE3L,EAAA,CAAcjW,CAAd,CALF,CAKwB,CAACgX,CAAD,CA1BxB4K,EA4BA5L,EAAA7J,KAAA,CAAoB6K,CAApB,CAjBmC,CAmBrC,GAAI2K,CAAJ,CACE,IAAK1b,IAAIA,CAAT,GAAc0b,EAAd,CA/BAC,CAgCE3L,EAAA,CAAchQ,CAAd,CAAA,CAAmB2R,EAAA,CAhCrBgK,CAgCqC3L,EAAA,CAAchQ,CAAd,CAAhB,CA/BrB,EAAA8P,EAAA,CAAqB,EAF8B,CADtC;AAuCjB4B,QAAA,GAAY,CAACX,CAAD,CAAO,CACjB,IAAMhX,EAAOgX,CAAA,KAAPhX,EAAuBgX,CAAArV,aAAA,CAAkB,MAAlB,CAAvB3B,EA7XYwhB,YA+XlB,OADAxK,EAAAU,GACA,CADkB1X,CAFD,CAUnB4X,QAAA,GAAU,CAAC/B,CAAD,CAAQ,CAIhB,MAAOA,EAAAgM,KAAA,CAAW,QAAA,CAACC,CAAD,CAAIC,CAAJ,CAAU,CACtBC,CAAAA,CAAQtC,EAAA,CAAaoC,CAAb,CAEZ,KADA,IAAIG,EAAQvC,EAAA,CAAaqC,CAAb,CAAZ,CACSphB,EAAE,CAAX,CAAcA,CAAd,CAAkBqhB,CAAA7kB,OAAlB,CAAgCwD,CAAA,EAAhC,CAAqC,CAC/BuhB,CAAAA,CAAKF,CAAA,CAAMrhB,CAAN,CACT,KAAIwhB,EAAKF,CAAA,CAAMthB,CAAN,CACT,IAAIuhB,CAAJ,GAAWC,CAAX,CAEE,MADIhS,EACG,CADE/B,KAAAC,KAAA,CAAW6T,CAAAzlB,WAAA4D,WAAX,CACF,CAAA8P,CAAAvM,QAAA,CAAWse,CAAX,CAAA,CAAiB/R,CAAAvM,QAAA,CAAWue,CAAX,CALS,CAHX,CAArB,CAJS,CAwFlB5K,QAAA,GAAkB,CAAlBA,CAAkB,CAAG,CACnBR,EAAA,CAAAA,CAAA,CACA,OAAO,EAAQf,CAAA,CAAAA,EAAR,EAA0B7Y,CAAA,CAAA6Y,EAAA7Y,OAA1B,CAFY,C,CCrevBilB,QAASA,GAAe,CAACjkB,CAAD,CAAO,CEwS7B,IAAI2K,EFvSoB3K,CEuSb+L,YAAA,EZ1RGS,EY2RV,CAAkB7B,CAAlB,CAAJ,EACEwX,EAAA,CAAAxX,CAAA,CFvSF,QADM4B,CACN,CXoCcZ,CWrCG,CAAiB3L,CAAjB,CACjB,GAAmBuM,CAAAvB,aAAnB,EAA4C,IAHf;AAM/B,IAAIkZ,GAAc,CAKhBzkB,iBIqRcA,EJrRI0kB,KAAA,CAAsB3mB,MAAtB,CALF,CAOhBgC,oBI6YcA,EJ7YO2kB,KAAA,CAAyB3mB,MAAzB,CAPL,CAAlB,CAWI4mB,GAAY,CAEd3kB,iBI6QcA,EJ/QA,CAIdD,oBIqYcA,EJzYA,CAMd,YAAAqF,QAAW,CAAC7E,CAAD,CAAO,CAChB,MEfYmJ,GFeL,CAAsB,IAAtB,CAA4BnJ,CAA5B,CADS,CANJ,CAUd,aAAAmJ,QAAY,CAACnJ,CAAD,CAAOgX,CAAP,CAAiB,CAC3B,MEnBY7N,GFmBL,CAAsB,IAAtB,CAA4BnJ,CAA5B,CAAkCgX,CAAlC,CADoB,CAVf,CAcd,YAAA3G,QAAW,CAACrQ,CAAD,CAAO,CAChB,MEkEYqQ,GFlEL,CAAqB,IAArB,CAA2BrQ,CAA3B,CADS,CAdJ,CAqBd,aAAAgC,QAAY,CAAChC,CAAD,CAAOgX,CAAP,CAAiB,CE7Bf7N,EF8BZ,CAAsB,IAAtB,CAA4BnJ,CAA5B,CAAkCgX,CAAlC,CE2DY3G,GF1DZ,CAAqB,IAArB,CAA2B2G,CAA3B,CACA,OAAOhX,EAHoB,CArBf,CA8Bd,UAAAsQ,QAAS,CAAC8J,CAAD,CAAO,CEmRhB,GAAsB,UAAtB,EFlR4Bpa,IEkRxBL,UAAJ,CACE,IAAA,EAAO4Y,CAAAjI,UAAAjG,KAAA,CFnRmBrK,IEmRnB,CFnRyBoa,CEmRzB,CADT,KAIE,IADItS,CFrR4BsS,CEqRxB7B,CAAAjI,UAAAjG,KAAA,CFrRkBrK,IEqRlB,CAAmC,CAAA,CAAnC,CFrRwBoa,CAAAA,CEsRhC,CAAU,CACJpI,CAAAA,CFvRoBhS,IEuRfkC,WACT,KAFQ,IAECM,EAAE,CAFH,CAEM6X,CAAd,CAAkB7X,CAAlB,CAAsBwP,CAAAhT,OAAtB,CAAiCwD,CAAA,EAAjC,CACE6X,CACA,CADKrI,CAAA,CAAGxP,CAAH,CAAA8N,UAAA,CAAgB,CAAA,CAAhB,CACL;AAAAxI,CAAAjD,YAAA,CAAcwV,CAAd,CAJM,CFtRV,MAAO,EADO,CA9BF,CAqCd,YAAAtO,QAAW,EAAU,CACnB,MEiLYA,GFjLL,CAAqB,IAArB,CADY,CArCP,CAyCd,SAAAmC,QAAQ,CAAClO,CAAD,CAAO,CACb,MV2CYkO,GU3CL,CAAe,IAAf,CAAqBlO,CAArB,CADM,CAzCD,CAgDd,cAAAuJ,QAAa,CAAC7L,CAAD,CAAQ,CT7DP6Q,ES8DZ,EACA,OAAOhF,EAAAA,cAAAc,KAAA,CAAmB,IAAnB,CAAyB3M,CAAzB,CAFY,CAhDP,CAyDhBiF;MAAA+T,iBAAA,CAAwB0N,EAAxB,CFiGmCC,CAEjCC,YAAa,CAIX,IAAAzhB,QAAG,EAAG,CACJ,GAAI4R,EAAJ,EAAyBA,EAAApK,KAAA,CAAuB,IAAvB,CAAzB,CACE,MAAO,CAAA,CAET,IAAI,IAAApK,SAAJ,EAAqBC,IAAAuI,uBAArB,CACE,MAAO,CAAA,CAGT,KAAMrK,EAAgB,IAAAA,cACtB,IRtFO6P,EQsFP,CACE,IAAI8H,CAAAA,SAAA1L,KAAA,CAAoBjM,CAApB,CAAmC,IAAnC,CAAJ,CACE,MAAO,CAAA,CADT,CADF,IAIO,IAAIA,CAAAwb,gBAAJ,EACL7D,CAAAA,SAAA1L,KAAA,CAAoBjM,CAAAwb,gBAApB,CAAmD,IAAnD,CADK,CAEL,MAAO,CAAA,CAIT,KADI5Z,CACJ,CADW,IACX,CAAOA,CAAP,EAAe,EAAEA,CAAF,WAAkBwQ,SAAlB,CAAf,CAAA,CACExQ,CAAA,CAAOA,CAAA1B,WAAP,GRvLQkO,CQuLmB,CAAkBxM,CAAlB,CAAA,CAAoDA,CAADuG,KAAnD,CAAiEpC,IAAAA,EAA5F,CAEF,OAAO,CAAC,EAAEnE,CAAF,EAAUA,CAAV,WAA0BwQ,SAA1B,CAtBJ,CAJK,CA4BXzN,aAAc,CAAA,CA5BH,CAFoBshB,CEjGnC,CAGA;IAAIE,GAAY,CAIVvZ,gBAAe,EAAA,CACjB,MAAOiZ,GAAA,CAAgB,IAAhB,CADU,CAJL,CAAhB,CASIO,GAAgB,CAMlB,cAAA/c,QAAa,CAACxF,CAAD,CAAW,CAOtB,MEwKY4X,GF7KC,CAAe,IAAf,CAAqB,QAAQ,CAAC/R,CAAD,CAAI,CAC5C,MVhEG+E,GAAAxC,KAAA,CUgE0BvC,CVhE1B,CUgE6B7F,CVhE7B,CU+DyC,CAAjC,CAEV,QAAQ,CAAC6F,CAAD,CAAI,CACb,MAAO,CAAA,CAAQA,CADF,CAFF,CAAAoS,CAIV,CAJUA,CAKb,EAAiB,IAPK,CANN,CAsBlB,iBAAA/X,QAAgB,CAACF,CAAD,CAAW9D,CAAX,CAAsB,CACpC,GAAIA,CAAJ,CAAe,CACPsmB,CAAAA,CAAIxU,KAAAhG,UAAAiK,MAAA7J,KAAA,CAA2BlI,CAAAA,iBAAA,CAAiB,IAAjB,CAAuBF,CAAvB,CAA3B,CACV,KAAM0I,EAAO,IAAAoB,YAAA,EACb,OAAO0Y,EAAAtU,OAAA,CAAS,QAAA,CAAA3L,CAAA,CAAK,CAAA,MAAAA,EAAAuH,YAAA,EAAA,EAAmBpB,CAAnB,CAAd,CAHM,CAKf,MEyJYkP,GFzJL,CAAe,IAAf,CAAqB,QAAQ,CAAC/R,CAAD,CAAI,CACtC,MVpFG+E,GAAAxC,KAAA,CUoF0BvC,CVpF1B,CUoF6B7F,CVpF7B,CUmFmC,CAAjC,CAN6B,CAtBpB,CATpB,CA4CIyiB,GAAY,CAKd,cAAAzZ,QAAa,CAACqR,CAAD,CAAU,CACrB,GAAuB,MAAvB,GAAI,IAAA3c,UAAJ,CAA+B,CEyKjC,IAAIgL,EFxKwBzM,IEwKjB6N,YAAA,EZ1RGS,EY2RV,CAAkB7B,CAAlB,CAAJ,EACEwX,EAAA,CAAAxX,CAAA,CFxKE,OAAO,CADD4B,CACC,CX3FGZ,CW0FO,CAAiB,IAAjB,CACV,GACH2Q,CAAA,EAAWA,CAAAnU,QAAX;AAA6BoE,CAAA1B,EAA7B,CACA0B,CAAAtB,cAFG,GAEwB,EAFxB,CAGL,EAN2B,CADV,CALT,CA5ChB,CA8DI0Z,GVxFYpX,EUwFG,CAAgB,CAKjC,aAAA3L,QAAY,CAACC,CAAD,CAAOC,CAAP,CAAc,CEgKZF,EF/JZ,CAAsB,IAAtB,CAA4BC,CAA5B,CAAkCC,CAAlC,CADwB,CALO,CAYjC,gBAAA4F,QAAe,CAAC7F,CAAD,CAAO,CEsKtB0W,CAAA7Q,gBAAA2C,KAAA,CFrK2BrK,IEqK3B,CFrKiC6B,CEqKjC,CACAwX,GAAA,CFtK2BrZ,IEsK3B,CFtKiC6B,CEsKjC,CFvKsB,CAZW,CAmBjC,aAAAiK,QAAY,CAACwQ,CAAD,CAAU,CDkVtB,GAAI,CCjVkB/V,IDiVtB,CACE,KAAM,sBAAN,CAEF,GAAI,CCpVwB+V,CDoV5B,CACE,KAAM,uBAAN,CCrVA,MDuVK,KAAI9F,EAAJ,CAAc8K,EAAd,CCvVe/a,IDuVf,CCvVqB+V,CDuVrB,CCxVe,CAnBW,CA0B7BzD,QAAO,EAAA,CACT,MAAO,KAAArV,aAAA,CAAkB,MAAlB,CADE,CA1BsB,CAiC7BqV,QAAK,CAAA/W,CAAA,CAAO,CEoIFF,EFnIZ,CAAsB,IAAtB,CAA4B,MAA5B,CAAoCE,CAApC,CADc,CAjCiB,CAwC7BkJ,gBAAe,EAAA,CACjB,MAAOiZ,GAAA,CAAgB,IAAhB,CADU,CAxCc,CAAhB,CA4ChBO,EA5CgB,CA4CDE,EA5CC,CA8CnB/hB,OAAA+T,iBAAA,CAAwBiO,EAAxB,CFyOWjP,EEzOX,CAEA;IAAIkP,GVxIYrX,EUwII,CAAgB,CAIlC,WAAAgD,QAAU,CAACvQ,CAAD,CAAOoa,CAAP,CAAa,CACrB,MEsJY7J,GFtJL,CAAoBvQ,CAApB,CAA0Boa,CAA1B,CADc,CAJW,CAWlC,eAAAvJ,QAAc,CAACgU,CAAD,CAAK,CAMjB,ME+DYhL,GFpEC,CAAe,IAAf,CAAqB,QAAQ,CAAC/R,CAAD,CAAI,CAC5C,MAAOA,EAAA+c,GAAP,EAAeA,CAD6B,CAAjC,CAEV,QAAQ,CAAC/c,CAAD,CAAI,CACb,MAAO,CAAA,CAAQA,CADF,CAFF,CAAAoS,CAIV,CAJUA,CAKb,EAAiB,IANA,CAXe,CAAhB,CAoBjBsK,EApBiB,CAsBpB7hB,OAAA+T,iBAAA,CAAwBkO,EAAxB,CAAuC,CACrC,eFiOShP,EEjOSC,cADmB,CAAvC,CAIA;IAAIiP,GAAalU,WAAA3G,UAAA8a,KAAjB,CAEIC,GVpKYzX,EUoKO,CAAgB,CAIrC,KAAAwX,QAAI,EAAG,CACL,IAAMxY,EXrLMZ,CWqLK,CAAiB,IAAjB,CAGjB,EADIsZ,CACJ,EAFIta,CAEJ,CAFW4B,CAEX,EAFuBA,CAAA5B,KAEvB,GAD2BA,CAAAkL,cAC3B,EACEoP,CAAAF,KAAA,EADF,CAGED,EAAAza,KAAA,CAAgB,IAAhB,CAPG,CAJ8B,CAAhB,CAFvB,CAkBM6a,GAAkB,CACtB,iBAAAzlB,QAAgB,CAACnC,CAAD,CAAOuf,CAAP,CAAWgB,CAAX,CAA6B,CACX,QAAhC,GAAI,MAAOA,EAAX,GACEA,CADF,CACqB,CACjBV,QAAS,CAAA,CAAQU,CADA,CADrB,CAKAA,EAAAG,EAAA,CAAiC,IACjC,KAAAzX,KAAA9G,iBAAA,CAA2BnC,CAA3B,CAAiCuf,CAAjC,CAAqCgB,CAArC,CAP2C,CADvB,CAWtB,oBAAAre,QAAmB,CAAClC,CAAD,CAAOuf,CAAP,CAAWgB,CAAX,CAA6B,CACd,QAAhC,GAAI,MAAOA,EAAX,GACEA,CADF,CACqB,CACjBV,QAAS,CAAA,CAAQU,CADA,CADrB,CAKAA,EAAAG,EAAA,CAAiC,IACjC,KAAAzX,KAAA/G,oBAAA,CAA8BlC,CAA9B,CAAoCuf,CAApC,CAAwCgB,CAAxC,CAP8C,CAX1B,CAqBtB,eAAAhN,QAAc,CAACgU,CAAD,CAAK,CAMjB,MESYhL,GFdC,CAAe,IAAf,CAAqB,QAAQ,CAAC/R,CAAD,CAAI,CAC5C,MAAOA,EAAA+c,GAAP,EAAeA,CAD6B,CAAjC,CAEV,QAAQ,CAAC/c,CAAD,CAAI,CACb,MAAO,CAAA,CAAQA,CADF,CAFF,CAAAoS,CAIV,CAJUA,CAKb,EAAiB,IANA,CArBG,CA+BxBiL;QAASA,EAAY,CAACtR,CAAD,CAAQpH,CAAR,CAAa,CAEhC,IADA,IAAI9E,EAAKhF,MAAA0K,oBAAA,CAA2BZ,CAA3B,CAAT,CACSjK,EAAE,CAAX,CAAcA,CAAd,CAAkBmF,CAAA3I,OAAlB,CAA6BwD,CAAA,EAA7B,CAAkC,CAChC,IAAIsF,EAAIH,CAAA,CAAGnF,CAAH,CAAR,CACIygB,EAAItgB,MAAAqH,yBAAA,CAAgCyC,CAAhC,CAAqC3E,CAArC,CAIJmb,EAAAnhB,MAAJ,CACE+R,CAAA,CAAM/L,CAAN,CADF,CACamb,CAAAnhB,MADb,CAGEa,MAAAC,eAAA,CAAsBiR,CAAtB,CAA6B/L,CAA7B,CAAgCmb,CAAhC,CAT8B,CAFF,C,CM3PlC,GhBnBWrX,CgBmBPM,GAAJ,CAA0B,CACxB,IAAIkZ,SAAW,CAEb,MhBtBOxZ,CgBsBEM,GAFI,CAUb,MAASmZ,QAAA,CAACrlB,CAAD,CAAU,CRsgBZ8W,EQrgBL,CAA4B9W,CAA5B,CR0fK6W,GQzfL,CAA6B7W,CAA7B,CACA,OAAOA,EAHU,CAVN,CAeb,YhBbYwM,CgBFC,CAgBb,QfhCY8B,EegBC,CAiBb,MfzBYC,EeQC,CAkBb,ShBtCO3C,CgBoBM,CAmBb,gBdwCY+D,Ec3DC,CAoBb,gBdYOV,EchCM,CAqBb,kBd4BOM,EcjDM,CAsBb,cAAiBgJ,CAtBJ,CAuBb,WTxCSpE,CSiBI,CA0Bf3W,OAAA,SAAA,CAAqB4nB,QF2brB5nB,OAAAue,MAAA,CAAegD,EACfvhB,OAAAC,YAAA,CAAqBuhB,EACrBxhB,OAAA0hB,WAAA,CAAoBD,EACpBP,GAAA,EJtMA,KAAI4G,GACD9nB,MAAA,eADC8nB,EAC2B9nB,MAAA,eAAA,kBAD3B8nB,EAEF1U,WAEFuU,EAAA,CD1QW3O,EC0QEvM,UAAb,CAAkCib,EAAlC,CACAC,EAAA,CAAa3nB,MAAA0C,KAAA+J,UAAb,CAAoCma,EAApC,CACAe,EAAA,CAAa3nB,MAAAkT,OAAAzG,UAAb,CAAsCia,EAAtC,CACAiB,EAAA,CAAa3nB,MAAA+nB,KAAAtb,UAAb,CAAoCsa,EAApC,CACAY,EAAA,CAAa3nB,MAAAwT,iBAAA/G,UAAb;AAAgDua,EAAhD,CACAW,EAAA,CAAa3nB,MAAA2M,QAAAF,UAAb,CAAuC0a,EAAvC,CACAQ,EAAA,CAAa3nB,MAAAgT,SAAAvG,UAAb,CAAwC2a,EAAxC,CACIpnB,OAAAgoB,gBAAJ,EACEL,CAAA,CAAa3nB,MAAAgoB,gBAAAvb,UAAb,CAA+Cya,EAA/C,CAEFS,EAAA,CAAaG,EAAArb,UAAb,CAA0C+a,EAA1C,CVpTSpZ,EU0TLK,EAAJ,GFuKcqK,CEtKZ,CAAe9Y,MAAA0C,KAAA+J,UAAf,CAMA,CFgKYqM,CErKZ,CAAe9Y,MAAA+nB,KAAAtb,UAAf,CAKA,CFgKYqM,CEpKZ,CAAe9Y,MAAAwT,iBAAA/G,UAAf,CAIA,CFgKYqM,CEnKZ,CAAe9Y,MAAA2M,QAAAF,UAAf,CAGA,CFgKYqM,CElKZ,CAAegP,EAAArb,UAAf,CAEA,CFgKYqM,CEjKZ,CAAe9Y,MAAAgT,SAAAvG,UAAf,CACA,CAAIzM,MAAAgoB,gBAAJ,EFgKYlP,CE/JV,CAAe9Y,MAAAgoB,gBAAAvb,UAAf,CARJ,CF8KcsM,GEnKd,EMhRA/Y,OAAAioB,WAAA,CPrBWjP,EOba,C,CC9B1B,IAAMkP,GAAkB,IAAI7W,GAAJ,CAAQ,kHAAA,MAAA,CAAA,GAAA,CAAR,CAejB8W,SAASA,GAAwB,CAAChmB,CAAD,CAAY,CAClD,IAAMimB,EAAWF,EAAAG,IAAA,CAAoBlmB,CAApB,CACXmmB,EAAAA,CAAY,kCAAAlf,KAAA,CAAwCjH,CAAxC,CAClB,OAAO,CAACimB,CAAR,EAAoBE,CAH8B,CAW7CxB,QAASA,EAAW,CAACtkB,CAAD,CAAO,CAEhC,IAAM+lB,EAAc/lB,CAAAskB,YACpB,IAAoBngB,IAAAA,EAApB,GAAI4hB,CAAJ,CACE,MAAOA,EAKT,KAAA,CAAOlL,CAAP,EAAkB,EAAEA,CAAAmL,sBAAF,EAAmCnL,CAAnC,WAAsDrK,SAAtD,CAAlB,CAAA,CACEqK,CAAA,CAAUA,CAAAvc,WAAV,GAAiCd,MAAAioB,WAAA,EAAqB5K,CAArB,WAAwC4K,WAAxC,CAAqD5K,CAAAtU,KAArD,CAAoEpC,IAAAA,EAArG,CAEF,OAAO,EAAG0W,CAAAA,CAAH,EAAe,EAAAA,CAAAmL,sBAAA,EAAiCnL,CAAjC,WAAoDrK,SAApD,CAAf,CAZyB;AAoBlCyV,QAASA,GAA4B,CAACtb,CAAD,CAAOub,CAAP,CAAc,CAEjD,IAAA,CAAOlmB,CAAP,EAAeA,CAAf,GAAwB2K,CAAxB,EAAgC,CAAC3K,CAAAoJ,YAAjC,CAAA,CACEpJ,CAAA,CAAOA,CAAA1B,WAET,OAAS0B,EAAF,EAAUA,CAAV,GAAmB2K,CAAnB,CAAkC3K,CAAAoJ,YAAlC,CAA2B,IALe;AAsB5C+c,QAASA,EAA0B,CAACxb,CAAD,CAAOhM,CAAP,CAAiBynB,CAAjB,CAA6C,CAA5BA,CAAA,CAAA,IAAA,EAAA,GAAAA,CAAA,CAAiB,IAAIvX,GAArB,CAAAuX,CAEzD,KADA,IAAIpmB,EAAO2K,CACX,CAAO3K,CAAP,CAAA,CAAa,CACX,GAAIA,CAAAC,SAAJ,GAAsBC,IAAAC,aAAtB,CAAyC,CACvC,IAAMjC,EAAkC8B,CAExCrB,EAAA,CAAST,CAAT,CAEA,KAAMyB,EAAYzB,CAAAyB,UAClB,IAAkB,MAAlB,GAAIA,CAAJ,EAA4D,QAA5D,GAA4BzB,CAAAsF,aAAA,CAAqB,KAArB,CAA5B,CAAsE,CAG9D+M,CAAAA,CAAmCrS,CAAAoL,OACzC,IAAIiH,CAAJ,WAA0BrQ,KAA1B,EAAkC,CAACkmB,CAAAP,IAAA,CAAmBtV,CAAnB,CAAnC,CAIE,IAFA6V,CAAAjX,IAAA,CAAmBoB,CAAnB,CAES0B,CAAAA,CAAAA,CAAQ1B,CAAA1Q,WAAjB,CAAwCoS,CAAxC,CAA+CA,CAA/C,CAAuDA,CAAA7I,YAAvD,CACE+c,CAAA,CAA2BlU,CAA3B,CAAkCtT,CAAlC,CAA4CynB,CAA5C,CAOJpmB,EAAA,CAAOimB,EAAA,CAA6Btb,CAA7B,CAAmCzM,CAAnC,CACP,SAjBoE,CAAtE,IAkBO,IAAkB,UAAlB,GAAIyB,CAAJ,CAA8B,CAKnCK,CAAA,CAAOimB,EAAA,CAA6Btb,CAA7B,CAAmCzM,CAAnC,CACP,SANmC,CAWrC,GADMyX,CACN,CADmBzX,CAAAmoB,gBACnB,CACE,IAASpU,CAAT,CAAiB0D,CAAA9V,WAAjB,CAAwCoS,CAAxC,CAA+CA,CAA/C,CAAuDA,CAAA7I,YAAvD,CACE+c,CAAA,CAA2BlU,CAA3B,CAAkCtT,CAAlC,CAA4CynB,CAA5C,CArCmC,CA0CzCpmB,CAAA,CAAsBA,CArDjBH,WAAA,CAqDiBG,CArDEH,WAAnB,CAAsComB,EAAA,CAqD3Btb,CArD2B,CAqDrB3K,CArDqB,CAUhC,CAFwE,CA0DhFsmB,QAASA,EAAoB,CAACC,CAAD,CAAc1kB,CAAd,CAAoBC,CAApB,CAA2B,CAC7DykB,CAAA,CAAY1kB,CAAZ,CAAA,CAAoBC,CADyC,C,CC1H7DzB,QADmBmmB,GACR,EAAG,CAEZ,IAAAC,EAAA,CAA8B,IAAIC,GAGlC,KAAAC,EAAA,CAAgC,IAAID,GAGpC,KAAAE,EAAA,CAAgB,EAGhB,KAAAC,EAAA,CAAmB,CAAA,CAXP,CAkBdC,QAAA,GAAa,CAAbA,CAAa,CAACnnB,CAAD,CAAYonB,CAAZ,CAAwB,CACnC,CAAAN,EAAA7U,IAAA,CAAgCjS,CAAhC,CAA2ConB,CAA3C,CACA,EAAAJ,EAAA/U,IAAA,CAAkCmV,CAAA1mB,YAAlC,CAA0D0mB,CAA1D,CAFmC,CAwBrCC,QAAA,GAAQ,CAARA,CAAQ,CAACC,CAAD,CAAW,CACjB,CAAAJ,EAAA,CAAmB,CAAA,CACnB,EAAAD,EAAA5Y,KAAA,CAAmBiZ,CAAnB,CAFiB,CAQnBC,QAAA,GAAS,CAATA,CAAS,CAAClnB,CAAD,CAAO,CACT,CAAA6mB,EAAL,EDaYV,CCXZ,CAAqCnmB,CAArC,CAA2C,QAAA,CAAA9B,CAAA,CAAW,CAAA,MAHxC,EAGwCmnB,EAAA,CAAWnnB,CAAX,CAAA,CAAtD,CAHc,CAShB,EAAA,UAAA,EAAA,CAAAmnB,QAAK,CAACrlB,CAAD,CAAO,CACV,GAAK,IAAA6mB,EAAL,EAEIM,CAAAnnB,CAAAmnB,aAFJ,CAEA,CACAnnB,CAAAmnB,aAAA,CAAoB,CAAA,CAEpB,KAAK,IAAI3kB,EAAI,CAAb,CAAgBA,CAAhB,CAAoB,IAAAokB,EAAA5nB,OAApB,CAA0CwD,CAAA,EAA1C,CACE,IAAAokB,EAAA,CAAcpkB,CAAd,CAAA,CAAiBxC,CAAjB,CAJF,CAHU,CAcZonB,SAAA,EAAW,CAAXA,CAAW,CAACzc,CAAD,CAAO,CAChB,IAAMsP,EAAW,EDVLkM,ECYZ,CAAqCxb,CAArC,CAA2C,QAAA,CAAAzM,CAAA,CAAW,CAAA,MAAA+b,EAAAjM,KAAA,CAAc9P,CAAd,CAAA,CAAtD,CAEA,KAASsE,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoByX,CAAAjb,OAApB,CAAqCwD,CAAA,EAArC,CAA0C,CACxC,IAAMtE,EAAU+b,CAAA,CAASzX,CAAT,CC/EZ6kB,EDgFJ,GAAInpB,CAAAopB,WAAJ,CACE,CAAAC,kBAAA,CAAuBrpB,CAAvB,CADF,CAGEspB,EAAA,CAAAA,CAAA,CAAoBtpB,CAApB,CALsC,CAL1B;AAkBlBupB,QAAA,EAAc,CAAdA,CAAc,CAAC9c,CAAD,CAAO,CACnB,IAAMsP,EAAW,ED5BLkM,EC8BZ,CAAqCxb,CAArC,CAA2C,QAAA,CAAAzM,CAAA,CAAW,CAAA,MAAA+b,EAAAjM,KAAA,CAAc9P,CAAd,CAAA,CAAtD,CAEA,KAASsE,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoByX,CAAAjb,OAApB,CAAqCwD,CAAA,EAArC,CAA0C,CACxC,IAAMtE,EAAU+b,CAAA,CAASzX,CAAT,CCjGZ6kB,EDkGJ,GAAInpB,CAAAopB,WAAJ,EACE,CAAAI,qBAAA,CAA0BxpB,CAA1B,CAHsC,CALvB;AA+ErBypB,QAAA,EAAmB,CAAnBA,CAAmB,CAAChd,CAAD,CAAO2R,CAAP,CAAqB,CAAdA,CAAA,CAAA,IAAA,EAAA,GAAAA,CAAA,CAAU,EAAV,CAAAA,CACxB,KAAM8J,EAAiB9J,CAAA8J,GAAjBA,EAA2C,IAAIvX,GAArD,CACM+Y,EAAUtL,CAAAsL,EAAVA,EAA8B,QAAA,CAAA1pB,CAAA,CAAW,CAAA,MAAAspB,GAAA,CAFTA,CAES,CAAoBtpB,CAApB,CAAA,CAD/C,CAGM+b,EAAW,ED9GLkM,ECyJZ,CAAqCxb,CAArC,CAzCuBkd,QAAA,CAAA3pB,CAAA,CAAW,CAChC,GAA0B,MAA1B,GAAIA,CAAAyB,UAAJ,EAAoE,QAApE,GAAoCzB,CAAAsF,aAAA,CAAqB,KAArB,CAApC,CAA8E,CAG5E,IAAM+M,EAAmCrS,CAAAoL,OAErCiH,EAAJ,WAA0BrQ,KAA1B,GACEqQ,CAAAyV,sBAEA,CAFmC,CAAA,CAEnC,CAAAzV,CAAAuX,iBAAA,CAA8B,CAAA,CAHhC,CAMIvX,EAAJ,EAA4C,UAA5C,GAAkBA,CAAAjR,WAAlB,CACEiR,CAAAwX,yBADF,CACwC,CAAA,CADxC,CAKE7pB,CAAAuB,iBAAA,CAAyB,MAAzB,CAAiC,QAAA,EAAM,CACrC,IAAM8Q,EAAmCrS,CAAAoL,OAEzC,IAAIye,CAAAxX,CAAAwX,yBAAJ,CAAA,CACAxX,CAAAwX,yBAAA,CAAsC,CAAA,CAOtC,KAAMC,EAAuB,IAAInZ,GAAJ,CAAQuX,CAAR,CAC7B4B,EAAAvY,OAAA,CAA4Bc,CAA5B,CAEAoX,EAAA,CArC8BA,CAqC9B,CAAyBpX,CAAzB,CAAqC,CAAC6V,GAAgB4B,CAAjB,CAAuCJ,EAAAA,CAAvC,CAArC,CAXA,CAHqC,CAAvC,CAhB0E,CAA9E,IAkCE3N,EAAAjM,KAAA,CAAc9P,CAAd,CAnC8B,CAyClC,CAA2DkoB,CAA3D,CAEA,IAAI,CAAAS,EAAJ,CACE,IAASrkB,CAAT;AAAa,CAAb,CAAgBA,CAAhB,CAAoByX,CAAAjb,OAApB,CAAqCwD,CAAA,EAArC,CACE,CAAA6iB,EAAA,CAAWpL,CAAA,CAASzX,CAAT,CAAX,CAIJ,KAASA,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoByX,CAAAjb,OAApB,CAAqCwD,CAAA,EAArC,CACEolB,CAAA,CAAQ3N,CAAA,CAASzX,CAAT,CAAR,CAxDoC;AA+DxCglB,QAAA,GAAc,CAAdA,CAAc,CAACtpB,CAAD,CAAU,CAEtB,GAAqBiG,IAAAA,EAArB,GADqBjG,CAAAopB,WACrB,CAAA,CAYA,IAAMlpB,EAAgBF,CAAAE,cACtB,IACGA,CAAA6pB,YADH,EAEI7pB,CAAA4nB,sBAFJ,EAE2C5nB,CAAA0pB,iBAF3C,CAMA,GADMf,CACN,CADmBmB,CAjOZzB,EAAA5jB,IAAA,CAiOuC3E,CAAAyB,UAjOvC,CAkOP,CAAA,CAEAonB,CAAAoB,kBAAAna,KAAA,CAAkC9P,CAAlC,CAEA,KAAMmC,EAAc0mB,CAAA1mB,YACpB,IAAI,CACF,GAAI,CAEF,GADa6Z,IAAK7Z,CAClB,GAAenC,CAAf,CACE,KAAUuU,MAAJ,CAAU,4EAAV,CAAN,CAHA,CAAJ,OAKU,CACRsU,CAAAoB,kBAAAC,IAAA,EADQ,CANR,CASF,MAAO5jB,CAAP,CAAU,CAEV,KADAtG,EAAAopB,WACM9iB,CC7QF6jB,CD6QE7jB,CAAAA,CAAN,CAFU,CAKZtG,CAAAopB,WAAA,CCjRMD,CDkRNnpB,EAAAoqB,gBAAA,CAA0BvB,CAE1B,IAAIA,CAAAwB,yBAAJ,CAEE,IADMC,CACGhmB,CADkBukB,CAAAyB,mBAClBhmB,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CAAoBgmB,CAAAxpB,OAApB,CAA+CwD,CAAA,EAA/C,CAAoD,CAClD,IAAMX,EAAO2mB,CAAA,CAAmBhmB,CAAnB,CAAb;AACMV,EAAQ5D,CAAAsF,aAAA,CAAqB3B,CAArB,CACA,KAAd,GAAIC,CAAJ,EACE,CAAAymB,yBAAA,CAA8BrqB,CAA9B,CAAuC2D,CAAvC,CAA6C,IAA7C,CAAmDC,CAAnD,CAA0D,IAA1D,CAJgD,CDhQ1CwiB,CCyQR,CAAsBpmB,CAAtB,CAAJ,EACE,CAAAqpB,kBAAA,CAAuBrpB,CAAvB,CAlCF,CAnBA,CAFsB,CA8DxB,EAAA,UAAA,kBAAA,CAAAqpB,QAAiB,CAACrpB,CAAD,CAAU,CACzB,IAAM6oB,EAAa7oB,CAAAoqB,gBACfvB,EAAAQ,kBAAJ,EACER,CAAAQ,kBAAAld,KAAA,CAAkCnM,CAAlC,CAHuB,CAU3B,GAAA,UAAA,qBAAA,CAAAwpB,QAAoB,CAACxpB,CAAD,CAAU,CAC5B,IAAM6oB,EAAa7oB,CAAAoqB,gBACfvB,EAAAW,qBAAJ,EACEX,CAAAW,qBAAArd,KAAA,CAAqCnM,CAArC,CAH0B,CAc9B;EAAA,UAAA,yBAAA,CAAAqqB,QAAwB,CAACrqB,CAAD,CAAU2D,CAAV,CAAgB4mB,CAAhB,CAA0BC,CAA1B,CAAoCC,CAApC,CAA+C,CACrE,IAAM5B,EAAa7oB,CAAAoqB,gBAEjBvB,EAAAwB,yBADF,EAEiD,EAFjD,CAEExB,CAAAyB,mBAAA/iB,QAAA,CAAsC5D,CAAtC,CAFF,EAIEklB,CAAAwB,yBAAAle,KAAA,CAAyCnM,CAAzC,CAAkD2D,CAAlD,CAAwD4mB,CAAxD,CAAkEC,CAAlE,CAA4EC,CAA5E,CANmE,C,CEhUvEtoB,QADmBuoB,GACR,CAACC,CAAD,CAAiB,CAALxqB,IAAAA,ECoD4DV,QDhDjF,KAAAmrB,EAAA,CAAkBD,CAKlB,KAAAE,EAAA,CAAiB1qB,CAKjB,KAAAgR,EAAA,CAAiBlL,IAAAA,EAKjBwjB,EAAA,CAAA,IAAAmB,EAAA,CAAoC,IAAAC,EAApC,CAEkC,UAAlC,GAAI,IAAAA,EAAAzpB,WAAJ,GACE,IAAA+P,EAMA,CANiB,IAAI3O,gBAAJ,CAAqB,IAAAsoB,EAAA7E,KAAA,CAA2B,IAA3B,CAArB,CAMjB,CAAA,IAAA9U,EAAAxO,QAAA,CAAuB,IAAAkoB,EAAvB,CAAuC,CACrChoB,UAAW,CAAA,CAD0B,CAErCC,QAAS,CAAA,CAF4B,CAAvC,CAPF,CArB0B,CAmC5B,EAAA,UAAA,WAAA,CAAAkH,QAAU,EAAG,CACP,IAAAmH,EAAJ,EACE,IAAAA,EAAAnH,WAAA,EAFS,CASb,GAAA,UAAA,EAAA,CAAA8gB,QAAgB,CAACvf,CAAD,CAAY,CAI1B,IAAMnK,EAAa,IAAAypB,EAAAzpB,WACA,cAAnB,GAAIA,CAAJ,EAAmD,UAAnD,GAAoCA,CAApC,EACE,IAAA4I,WAAA,EAGF,KAAS1F,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBiH,CAAAzK,OAApB,CAAsCwD,CAAA,EAAtC,CAEE,IADA,IAAMkH,EAAaD,CAAA,CAAUjH,CAAV,CAAAkH,WAAnB,CACSgX,EAAI,CAAb,CAAgBA,CAAhB,CAAoBhX,CAAA1K,OAApB,CAAuC0hB,CAAA,EAAvC,CAEEiH,CAAA,CAAA,IAAAmB,EAAA,CADapf,CAAA1J,CAAW0gB,CAAX1gB,CACb,CAbsB,C,CE3C5BK,QADmB4oB,GACR,EAAG,CAAA,IAAA,EAAA,IAWZ,KAAAC,EAAA,CANA,IAAAC,EAMA,CANchlB,IAAAA,EAYd,KAAAilB,EAAA,CAAgB,IAAIC,OAAJ,CAAY,QAAA,CAAAC,CAAA,CAAW,CACrC,CAAAJ,EAAA,CAAgBI,CAEZ,EAAAH,EAAJ,EACEG,CAAA,CAAQ,CAAAH,EAAR,CAJmC,CAAvB,CAjBJ,CA6BdG,QAAA,GAAO,CAAPA,CAAO,CAAQ,CACb,GAAI,CAAAH,EAAJ,CACE,KAAU1W,MAAJ,CAAU,mBAAV,CAAN,CAGF,CAAA0W,EAAA,CDoKqBhlB,IAAAA,EClKjB,EAAA+kB,EAAJ,EACE,CAAAA,EAAA,CDiKmB/kB,IAAAA,ECjKnB,CARW,C,CDpBf9D,QALmBkpB,EAKR,CAACV,CAAD,CAAY,CAKrB,IAAAW,GAAA,CAAmC,CAAA,CAMnC,KAAAV,EAAA,CAAkBD,CAMlB,KAAAY,GAAA,CAA4B,IAAI/C,GAOhC,KAAAgD,GAAA,CAAsBC,QAAA,CAAA9M,CAAA,CAAM,CAAA,MAAAA,EAAA,EAAA,CAM5B,KAAA+M,EAAA,CAAqB,CAAA,CAMrB,KAAAC,GAAA,CAA2B,EAM3B,KAAAC,GAAA,CAAqC,IDrD1BlB,ECqD0B,CAAiCC,CAAjC,CA1ChB,CAiDvB,CAAA,CA9DF,CAAAkB,UA8DEC;CAAAC,OAAA,CAAAA,QAAM,CAACtqB,CAAD,CAAYU,CAAZ,CAAyB,CAAA,IAAA,EAAA,IAC7B,IAAI,EAAEA,CAAF,WAAyB6pB,SAAzB,CAAJ,CACE,KAAM,KAAIvI,SAAJ,CAAc,gDAAd,CAAN,CAGF,GAAI,CJpDQgE,EIoDP,CAAmChmB,CAAnC,CAAL,CACE,KAAM,KAAIwqB,WAAJ,CAAgB,oBAAhB,CAAqCxqB,CAArC,CAA8C,iBAA9C,CAAN,CAGF,GAAI,IAAAmpB,EHvCGrC,EAAA5jB,IAAA,CGuCmClD,CHvCnC,CGuCP,CACE,KAAU8S,MAAJ,CAAU,8BAAV,CAAyC9S,CAAzC,CAAkD,6BAAlD,CAAN,CAGF,GAAI,IAAA6pB,GAAJ,CACE,KAAU/W,MAAJ,CAAU,4CAAV,CAAN,CAEF,IAAA+W,GAAA,CAAmC,CAAA,CAOnC,IAAI,CAOFY,IAASA,EAATA,QAAoB,CAACvoB,CAAD,CAAO,CACzB,IAAMwoB,EAAgBpgB,CAAA,CAAUpI,CAAV,CACtB,IAAsBsC,IAAAA,EAAtB,GAAIkmB,CAAJ,EAAmC,EAAEA,CAAF,WAA2BH,SAA3B,CAAnC,CACE,KAAUzX,MAAJ,CAAU,OAAV,CAAkB5Q,CAAlB,CAAsB,gCAAtB,CAAN;AAEF,MAAOwoB,EALkB,CAA3BD,CALMngB,EAAY5J,CAAA4J,UAClB,IAAI,EAAEA,CAAF,WAAuBtH,OAAvB,CAAJ,CACE,KAAM,KAAIgf,SAAJ,CAAc,8DAAd,CAAN,CAWF,IAAA4F,EAAoB6C,CAAA,CAAY,mBAAZ,CACpB,KAAA1C,EAAuB0C,CAAA,CAAY,sBAAZ,CACvB,KAAAE,EAAkBF,CAAA,CAAY,iBAAZ,CAClB,KAAA7B,EAA2B6B,CAAA,CAAY,0BAAZ,CAC3B,KAAA5B,EAAqBnoB,CAAA,mBAArBmoB,EAA0D,EAnBxD,CAoBF,MAAOhkB,CAAP,CAAU,CACV,MADU,CApBZ,OAsBU,CACR,IAAAglB,GAAA,CAAmC,CAAA,CAD3B,CAIJzC,CAAAA,CAAa,CACjBpnB,UAAAA,CADiB,CAEjBU,YAAAA,CAFiB,CAGjBknB,kBAAAA,CAHiB,CAIjBG,qBAAAA,CAJiB,CAKjB4C,gBAAAA,CALiB,CAMjB/B,yBAAAA,CANiB,CAOjBC,mBAAAA,CAPiB,CAQjBL,kBAAmB,EARF,CAWnBrB,GAAA,CAAA,IAAAgC,EAAA,CAA8BnpB,CAA9B,CAAyConB,CAAzC,CACA,KAAA8C,GAAA7b,KAAA,CAA8B+Y,CAA9B,CAIK;IAAA6C,EAAL,GACE,IAAAA,EACA,CADqB,CAAA,CACrB,CAAA,IAAAF,GAAA,CAAoB,QAAA,EAAM,CAAA,MAAAa,GAAA,CAAAA,CAAA,CAAA,CAA1B,CAFF,CAjE6B,CAuE/BP,EAAApC,EAAA,CAAAA,QAAO,CAAC1pB,CAAD,CAAU,CACfypB,CAAA,CAAA,IAAAmB,EAAA,CAAoC5qB,CAApC,CADe,CAIjBqsB,SAAA,GAAM,CAANA,CAAM,CAAG,CAIP,GAA2B,CAAA,CAA3B,GAAI,CAAAX,EAAJ,CAAA,CACA,CAAAA,EAAA,CAAqB,CAAA,CAiBrB,KAfA,IAAMY,EAAqB,CAAAX,GAA3B,CAOMY,EAAgC,EAPtC,CAcMC,EAAiC,IAAIhE,GAd3C,CAeSlkB,EAAI,CAAb,CAAgBA,CAAhB,CAAoBgoB,CAAAxrB,OAApB,CAA+CwD,CAAA,EAA/C,CACEkoB,CAAA9Y,IAAA,CAAmC4Y,CAAA,CAAmBhoB,CAAnB,CAAA7C,UAAnC,CAAoE,EAApE,CAGFgoB,EAAA,CAAA,CAAAmB,EAAA,CAAoCnrB,QAApC,CAA8C,CAC5CiqB,EAASA,QAAA,CAAA1pB,CAAA,CAAW,CAElB,GAA2BiG,IAAAA,EAA3B,GAAIjG,CAAAopB,WAAJ,CAAA,CAEA,IAAM3nB,EAAYzB,CAAAyB,UAAlB,CAIMgrB,EAAkBD,CAAA7nB,IAAA,CAAmClD,CAAnC,CACpBgrB,EAAJ,CACEA,CAAA3c,KAAA,CAAqB9P,CAArB,CADF,CApCG,CAwCQ4qB,EHjJRrC,EAAA5jB,IAAA,CGiJ8ClD,CHjJ9C,CG6IH,EAKE8qB,CAAAzc,KAAA,CAAmC9P,CAAnC,CAZF,CAFkB,CADwB,CAA9C,CAqBA,KAASsE,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBioB,CAAAzrB,OAApB,CAA0DwD,CAAA,EAA1D,CACEglB,EAAA,CAAA,CAAAsB,EAAA,CAA+B2B,CAAA,CAA8BjoB,CAA9B,CAA/B,CAIF,KAAA,CAAmC,CAAnC,CAAOgoB,CAAAxrB,OAAP,CAAA,CAAsC,CACpC,IAAM+nB,EAAayD,CAAA3c,MAAA,EACblO,EAAAA,CAAYonB,CAAApnB,UAGZirB,EAAAA,CAA4BF,CAAA7nB,IAAA,CAAmCkkB,CAAApnB,UAAnC,CAClC,KAAK,IAAI6C,EAAI,CAAb,CAAgBA,CAAhB,CAAoBooB,CAAA5rB,OAApB,CAAsDwD,CAAA,EAAtD,CACEglB,EAAA,CAAA,CAAAsB,EAAA,CAA+B8B,CAAA,CAA0BpoB,CAA1B,CAA/B,CAKF,EADMqoB,CACN,CADiB,CAAApB,GAAA5mB,IAAA,CAA8BlD,CAA9B,CACjB,GACE2pB,EAAA,CAAAuB,CAAA,CAbkC,CAhDtC,CAJO;AA0ETb,CAAAnnB,IAAA,CAAAA,QAAG,CAAClD,CAAD,CAAY,CAEb,GADMonB,CACN,CADmB,IAAA+B,EHpLZrC,EAAA5jB,IAAA,CGoLkDlD,CHpLlD,CGqLP,CACE,MAAOonB,EAAA1mB,YAHI,CAaf2pB,EAAAc,GAAA,CAAAC,QAAW,CAACprB,CAAD,CAAY,CACrB,GAAI,CJlNQgmB,EIkNP,CAAmChmB,CAAnC,CAAL,CACE,MAAO0pB,QAAA2B,OAAA,CAAe,IAAIb,WAAJ,CAAgB,GAAhB,CAAoBxqB,CAApB,CAA6B,uCAA7B,CAAf,CAGT,KAAMsrB,EAAQ,IAAAxB,GAAA5mB,IAAA,CAA8BlD,CAA9B,CACd,IAAIsrB,CAAJ,CACE,MAAOA,ECtLF7B,EDyLDyB,EAAAA,CAAW,ICvON5B,EDwOX,KAAAQ,GAAA7X,IAAA,CAA8BjS,CAA9B,CAAyCkrB,CAAzC,CAEmB,KAAA/B,EH7MZrC,EAAA5jB,IAAAkkB,CG6MkDpnB,CH7MlDonB,CGiNP,EAAkB,CAAC,IAAA8C,GAAAqB,KAAA,CAA8B,QAAA,CAAAjI,CAAA,CAAK,CAAA,MAAAA,EAAAtjB,UAAA,GAAgBA,CAAhB,CAAnC,CAAnB,EACE2pB,EAAA,CAAAuB,CAAA,CAGF,OAAOA,ECpMAzB,ED+Kc,CAwBvBY,EAAAmB,GAAA,CAAAA,QAAyB,CAACC,CAAD,CAAQ,CAC/B,IAAAtB,GAAA5hB,WAAA,EACA,KAAMmjB,EAAQ,IAAA3B,GACd,KAAAA,GAAA,CAAsBC,QAAA,CAAApb,CAAA,CAAS,CAAA,MAAA6c,EAAA,CAAM,QAAA,EAAM,CAAA,MAAAC,EAAA,CAAM9c,CAAN,CAAA,CAAZ,CAAA,CAHA,CAQnC/Q,OAAA,sBAAA,CAAkC+rB,CAClCA,EAAAtf,UAAA,OAAA,CAA4Csf,CAAAtf,UAAAggB,OAC5CV;CAAAtf,UAAA,QAAA,CAA6Csf,CAAAtf,UAAA2d,EAC7C2B,EAAAtf,UAAA,IAAA,CAAyCsf,CAAAtf,UAAApH,IACzC0mB,EAAAtf,UAAA,YAAA,CAAiDsf,CAAAtf,UAAA8gB,GACjDxB,EAAAtf,UAAA,0BAAA,CAA+Dsf,CAAAtf,UAAAkhB,G,CEpQ7DG,IAAAA,GAAwB9tB,MAAAgT,SAAAvG,UAAAxI,cAAxB6pB,CACAC,GAA0B/tB,MAAAgT,SAAAvG,UAAAuhB,gBAD1BF,CAEAG,GAAqBjuB,MAAAgT,SAAAvG,UAAAsG,WAFrB+a,CAGAI,GAAkBluB,MAAAgT,SAAAvG,UAAAyhB,QAHlBJ,CAIAK,GAAiBnuB,MAAAgT,SAAAvG,UAAA0hB,OAJjBL,CAKAM,GAA0BpuB,MAAAwT,iBAAA/G,UAAA2hB,QAL1BN,CAMAO,GAAyBruB,MAAAwT,iBAAA/G,UAAA4hB,OANzBP,CAOAQ,GAAgBtuB,MAAA0C,KAAA+J,UAAAqG,UAPhBgb,CAQAS,GAAkBvuB,MAAA0C,KAAA+J,UAAApF,YARlBymB,CASAU,GAAmBxuB,MAAA0C,KAAA+J,UAAAd,aATnBmiB,CAUAW,GAAkBzuB,MAAA0C,KAAA+J,UAAAoG,YAVlBib,CAWAY,GAAmB1uB,MAAA0C,KAAA+J,UAAAjI,aAXnBspB,CAYAa,GAAkBxpB,MAAAqH,yBAAAmiB,CAAgC3uB,MAAA0C,KAAA+J,UAAhCkiB;AAAuDA,aAAvDA,CAZlBb,CAaAc,GAAsB5uB,MAAA2M,QAAAF,UAAAmiB,aAbtBd,CAcAe,GAAmB1pB,MAAAqH,yBAAAqiB,CAAgC7uB,MAAA2M,QAAAF,UAAhCoiB,CAA0DA,WAA1DA,CAdnBf,CAeAgB,GAAsB9uB,MAAA2M,QAAAF,UAAAzG,aAftB8nB,CAgBAiB,GAAsB/uB,MAAA2M,QAAAF,UAAArI,aAhBtB0pB,CAiBAkB,GAAyBhvB,MAAA2M,QAAAF,UAAAvC,gBAjBzB4jB,CAkBAmB,GAAwBjvB,MAAA2M,QAAAF,UAAAyiB,eAlBxBpB,CAmBAqB,GAAwBnvB,MAAA2M,QAAAF,UAAA2iB,eAnBxBtB,CAoBAuB,GAA2BrvB,MAAA2M,QAAAF,UAAA6iB,kBApB3BxB,CAqBAyB,GAA+BvvB,MAAA2M,QAAAF,UAAA8iB,sBArB/BzB,CAsBA0B,GAA4BxvB,MAAA2M,QAAAF,UAAA+iB,mBAtB5B1B,CAuBA2B,GAAiBzvB,MAAA2M,QAAAF,UAAAgjB,QAvBjB3B;AAwBA4B,GAAgB1vB,MAAA2M,QAAAF,UAAAijB,OAxBhB5B,CAyBA6B,GAAgB3vB,MAAA2M,QAAAF,UAAAkjB,OAzBhB7B,CA0BA8B,GAAe5vB,MAAA2M,QAAAF,UAAAmjB,MA1Bf9B,CA2BA+B,GAAqB7vB,MAAA2M,QAAAF,UAAAojB,YA3BrB/B,CA4BAgC,GAAgB9vB,MAAA2M,QAAAF,UAAAqjB,OA5BhBhC,CA6BA1a,GAAapT,MAAAoT,YA7Bb0a,CA8BAiC,GAAuB5qB,MAAAqH,yBAAAujB,CAAgC/vB,MAAAoT,YAAA3G,UAAhCsjB,CAA8DA,WAA9DA,CA9BvBjC,CA+BAkC,GAAmChwB,MAAAoT,YAAA3G,UAAAujB,sBA/BnClC,CAgCAmC,GAAgCjwB,MAAAoT,YAAA3G,UAAAwjB,mB,CCxBlC,IAAAC,GAAe,IAFfC,QAAA,EAAA,E,CCCe,QAAA,GAAQ,EAAY,CAAX9E,IAAAA,ECoBLA,EDnBjBrrB,OAAA,YAAA,CAAyB,QAAQ,EAAG,CAIlCoT,QAASA,EAAW,EAAG,CAKrB,IAAMvQ,EAAc,IAAAA,YAApB,CAEM0mB,EAAa8B,CPoBdlC,EAAA9jB,IAAA,COpBgDxC,CPoBhD,COnBL,IAAI,CAAC0mB,CAAL,CACE,KAAUtU,MAAJ,CAAU,gFAAV,CAAN,CAGF,IAAM0V,EAAoBpB,CAAAoB,kBAE1B,IAAiC,CAAjC,GAAIA,CAAAnpB,OAAJ,CAME,MALMd,EAKCA,CALS0vB,EAAAvjB,KAAA,CAAmC1M,QAAnC,CAA6CopB,CAAApnB,UAA7C,CAKTzB,CAJPyE,MAAAkrB,eAAA,CAAsB3vB,CAAtB,CAA+BmC,CAAA4J,UAA/B,CAIO/L,CAHPA,CAAAopB,WAGOppB,CN7BLmpB,CM6BKnpB,CAFPA,CAAAoqB,gBAEOpqB,CAFmB6oB,CAEnB7oB,CADP2qB,CAAAxD,EAAA,CAAgBnnB,CAAhB,CACOA,CAAAA,CAGH4vB,EAAAA,CAAY3F,CAAAnpB,OAAZ8uB,CAAuC,CAC7C,KAAM5vB,EAAUiqB,CAAA,CAAkB2F,CAAlB,CAChB,IAAI5vB,CAAJ,GD7BSwvB,EC6BT,CACE,KAAUjb,MAAJ,CAAU,0GAAV,CAAN;AAEF0V,CAAA,CAAkB2F,CAAlB,CAAA,CDhCSJ,ECkCT/qB,OAAAkrB,eAAA,CAAsB3vB,CAAtB,CAA+BmC,CAAA4J,UAA/B,CACA4e,EAAAxD,EAAA,CAA6CnnB,CAA7C,CAEA,OAAOA,EAjCc,CAoCvB0S,CAAA3G,UAAA,CAAwB8jB,EAAA9jB,UAExB,OAAO2G,EA1C2B,CAAZ,EADS,C,CEQpB,QAAA,GAAQ,CAACiY,CAAD,CAAYtC,CAAZ,CAAyByH,CAAzB,CAAkC,CAKvDC,QAASA,EAAkB,CAACC,CAAD,CAAgB,CACzC,MAAO,SAAQ,CAAC,CAAD,CAAW,CAAV,IAAA,IAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,SAAA,OAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAKRrjB,EAAAA,CAAiB,EAQvB,KAFA,IAAMsjB,EAAoB,EAA1B,CAES3rB,EAAI,CAAb,CAAgBA,CAAhB,CAbwBwN,CAaJhR,OAApB,CAAkCwD,CAAA,EAAlC,CAAuC,CACrC,IAAMxC,EAdgBgQ,CAcT,CAAMxN,CAAN,CAETxC,EAAJ,WAAoBmK,QAApB,EVZQma,CUYuB,CAAsBtkB,CAAtB,CAA/B,EACEmuB,CAAAngB,KAAA,CAAuBhO,CAAvB,CAGF,IAAIA,CAAJ,WAAoBgR,iBAApB,CACE,IAASiB,CAAT,CAAiBjS,CAAAH,WAAjB,CAAkCoS,CAAlC,CAAyCA,CAAzC,CAAiDA,CAAA7I,YAAjD,CACEyB,CAAAmD,KAAA,CAAoBiE,CAApB,CAFJ,KAKEpH,EAAAmD,KAAA,CAAoBhO,CAApB,CAZmC,CAgBvCkuB,CAAAE,MAAA,CAAoB,IAApB,CA7BwBpe,CA6BxB,CAEA,KAASxN,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB2rB,CAAAnvB,OAApB,CAA8CwD,CAAA,EAA9C,CACEilB,CAAA,CAAAoB,CAAA,CAAyBsF,CAAA,CAAkB3rB,CAAlB,CAAzB,CAGF,IV/BU8hB,CU+BN,CAAsB,IAAtB,CAAJ,CACE,IAAS9hB,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBqI,CAAA7L,OAApB,CAA2CwD,CAAA,EAA3C,CACQxC,CACN,CADa6K,CAAA,CAAerI,CAAf,CACb,CAAIxC,CAAJ,WAAoBmK,QAApB,EACEid,CAAA,CAAAyB,CAAA,CAAsB7oB,CAAtB,CAvCkB,CADe,CA+CnBmE,IAAAA,EAAxB,GAAI6pB,CAAAK,EAAJ,GACiC9H,CV0DjC,QU3DA,CACyD0H,CAAAnsB,CAAmBksB,CAAAK,EAAnBvsB,CADzD,CAIuBqC,KAAAA,EAAvB,GAAI6pB,CAAAM,OAAJ,GACiC/H,CVsDjC,OUvDA,CACwD0H,CAAAnsB,CAAmBksB,CAAAM,OAAnBxsB,CADxD,CAxDuD,C,CCP1C,QAAA,GAAQ,EAAY,CAAX+mB,IAAAA,EFoBRA,ETiGAvC,EWpHd,CAA+B9V,QAAAvG,UAA/B,CAAmD,eAAnD,CAME,QAAQ,CAACtK,CAAD,CAAY,CAElB,GAAI,IAAAmoB,iBAAJ,CAA2B,CACzB,IAAMf,EAAa8B,CVahBpC,EAAA5jB,IAAA,CUbgDlD,CVahD,CUZH,IAAIonB,CAAJ,CACE,MAAO,KAAKA,CAAA1mB,YAHW,CAOrB6Z,CAAAA,CACH0T,EAAAvjB,KAAA,CAAmC,IAAnC,CAAyC1K,CAAzC,CACHkpB,EAAAxD,EAAA,CAAgBnL,CAAhB,CACA,OAAOA,EAZW,CANtB,CXoHcoM,EW/Fd,CAA+B9V,QAAAvG,UAA/B,CAAmD,YAAnD,CAOE,QAAQ,CAACjK,CAAD,CAAOoa,CAAP,CAAa,CACb5Y,CAAAA,CAAQ+sB,EAAAlkB,KAAA,CAAgC,IAAhC,CAAsCrK,CAAtC,CAA4Coa,CAA5C,CAET,KAAA0N,iBAAL,CAGEH,CAAA,CAAAkB,CAAA,CAA8BrnB,CAA9B,CAHF,CACE0lB,EAAA,CAAA2B,CAAA,CAAoBrnB,CAApB,CAIF,OAAOA,EARY,CAPvB,CX+Fc8kB,EW3Ed,CAA+B9V,QAAAvG,UAA/B,CAAmD,iBAAnD,CAOE,QAAQ,CAAC0e,CAAD,CAAYhpB,CAAZ,CAAuB,CAE7B,GAAI,IAAAmoB,iBAAJ,GAA4C,IAA5C,GAA8Ba,CAA9B,EAXY6F,8BAWZ,GAAoD7F,CAApD,EAA4E,CAC1E,IAAM5B,EAAa8B,CV7BhBpC,EAAA5jB,IAAA,CU6BgDlD,CV7BhD,CU8BH,IAAIonB,CAAJ,CACE,MAAO,KAAKA,CAAA1mB,YAH4D,CAOtE6Z,CAAAA,CACHuU,EAAApkB,KAAA,CAAqC,IAArC,CAA2Cse,CAA3C,CAAsDhpB,CAAtD,CACHkpB,EAAAxD,EAAA,CAAgBnL,CAAhB,CACA,OAAOA,EAZsB,CAPjC,CDnCawT;ECyDb,CAAgB7E,CAAhB,CAA2BrY,QAAAvG,UAA3B,CAA+C,CAC7CokB,EAASK,EADoC,CAE7CJ,OAAQK,EAFqC,CAA/C,CAhEiC,C,CCFpB,QAAA,GAAQ,EAAY,CAAX9F,IAAAA,EHwBZA,EGuIV+F,SAASA,EAAiB,CAACrI,CAAD,CAAcsI,CAAd,CAA8B,CACtDlsB,MAAAC,eAAA,CAAsB2jB,CAAtB,CAAmC,aAAnC,CAAkD,CAChDjc,WAAYukB,CAAAvkB,WADoC,CAEhDvH,aAAc,CAAA,CAFkC,CAGhDF,IAAKgsB,CAAAhsB,IAH2C,CAIhD+O,IAAyBA,QAAQ,CAACkd,CAAD,CAAgB,CAE/C,GAAI,IAAA7uB,SAAJ,GAAsBC,IAAAkS,UAAtB,CACEyc,CAAAjd,IAAAvH,KAAA,CAAwB,IAAxB,CAA8BykB,CAA9B,CADF,KAAA,CAKA,IAAIngB,EAAexK,IAAAA,EAGnB,IAAI,IAAAtE,WAAJ,CAAqB,CAGnB,IAAMqC,EAAa,IAAAA,WAAnB,CACM6sB,EAAmB7sB,CAAAlD,OACzB,IAAuB,CAAvB,CAAI+vB,CAAJ,EZhKMzK,CYgKsB,CAAsB,IAAtB,CAA5B,CAAyD,CAEvD3V,CAAA,CAAmBsB,KAAJ,CAAU8e,CAAV,CACf,KAAK,IAAIvsB,EAAI,CAAb,CAAgBA,CAAhB,CAAoBusB,CAApB,CAAsCvsB,CAAA,EAAtC,CACEmM,CAAA,CAAanM,CAAb,CAAA,CAAkBN,CAAA,CAAWM,CAAX,CAJmC,CALtC,CAcrBqsB,CAAAjd,IAAAvH,KAAA,CAAwB,IAAxB,CAA8BykB,CAA9B,CAEA,IAAIngB,CAAJ,CACE,IAASnM,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBmM,CAAA3P,OAApB,CAAyCwD,CAAA,EAAzC,CACEilB,CAAA,CAAAoB,CAAA,CAAyBla,CAAA,CAAanM,CAAb,CAAzB,CA1BJ,CAF+C,CAJD,CAAlD,CADsD,CZxC1C8jB,CYnHd,CAA+BpmB,IAAA+J,UAA/B,CAA+C,cAA/C,CAOE,QAAQ,CAACjK,CAAD,CAAOgb,CAAP,CAAgB,CACtB,GAAIhb,CAAJ,WAAoBgR,iBAApB,CAAsC,CACpC,IAAMge,EAAgB/e,KAAAhG,UAAAiK,MAAAka,MAAA,CAA4BpuB,CAAAkC,WAA5B,CAChB+sB;CAAAA,CAAeC,EAAA7kB,KAAA,CAA8B,IAA9B,CAAoCrK,CAApC,CAA0Cgb,CAA1C,CAKrB,IZAQsJ,CYAJ,CAAsB,IAAtB,CAAJ,CACE,IAAS9hB,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBwsB,CAAAhwB,OAApB,CAA0CwD,CAAA,EAA1C,CACE4kB,CAAA,CAAAyB,CAAA,CAAsBmG,CAAA,CAAcxsB,CAAd,CAAtB,CAIJ,OAAOysB,EAb6B,CAgBhCE,CAAAA,CZTI7K,CYSe,CAAsBtkB,CAAtB,CACnBivB,EAAAA,CAAeC,EAAA7kB,KAAA,CAA8B,IAA9B,CAAoCrK,CAApC,CAA0Cgb,CAA1C,CAEjBmU,EAAJ,EACE1H,CAAA,CAAAoB,CAAA,CAAyB7oB,CAAzB,CZbQskB,EYgBN,CAAsB,IAAtB,CAAJ,EACE8C,CAAA,CAAAyB,CAAA,CAAsB7oB,CAAtB,CAGF,OAAOivB,EA5Be,CAP1B,CZmHc3I,EY7Ed,CAA+BpmB,IAAA+J,UAA/B,CAA+C,aAA/C,CAME,QAAQ,CAACjK,CAAD,CAAO,CACb,GAAIA,CAAJ,WAAoBgR,iBAApB,CAAsC,CACpC,IAAMge,EAAgB/e,KAAAhG,UAAAiK,MAAAka,MAAA,CAA4BpuB,CAAAkC,WAA5B,CAChB+sB,EAAAA,CAAeG,EAAA/kB,KAAA,CAA6B,IAA7B,CAAmCrK,CAAnC,CAKrB,IZrCQskB,CYqCJ,CAAsB,IAAtB,CAAJ,CACE,IAAK,IAAI9hB,EAAI,CAAb,CAAgBA,CAAhB,CAAoBwsB,CAAAhwB,OAApB,CAA0CwD,CAAA,EAA1C,CACE4kB,CAAA,CAAAyB,CAAA,CAAsBmG,CAAA,CAAcxsB,CAAd,CAAtB,CAIJ,OAAOysB,EAb6B,CAgBhCE,CAAAA,CZ9CI7K,CY8Ce,CAAsBtkB,CAAtB,CACnBivB,EAAAA,CAAeG,EAAA/kB,KAAA,CAA6B,IAA7B,CAAmCrK,CAAnC,CAEjBmvB,EAAJ,EACE1H,CAAA,CAAAoB,CAAA,CAAyB7oB,CAAzB,CZlDQskB,EYqDN,CAAsB,IAAtB,CAAJ,EACE8C,CAAA,CAAAyB,CAAA,CAAsB7oB,CAAtB,CAGF,OAAOivB,EA5BM,CANjB,CZ6Ec3I,EYxCd,CAA+BpmB,IAAA+J,UAA/B,CAA+C,WAA/C,CAME,QAAQ,CAACmQ,CAAD,CAAO,CACP5Y,CAAAA,CAAQ6tB,EAAAhlB,KAAA,CAA2B,IAA3B,CAAiC+P,CAAjC,CAGT,KAAAhc,cAAA0pB,iBAAL,CAGEH,CAAA,CAAAkB,CAAA,CAA8BrnB,CAA9B,CAHF;AACE0lB,EAAA,CAAA2B,CAAA,CAAoBrnB,CAApB,CAIF,OAAOA,EATM,CANjB,CZwCc8kB,EYtBd,CAA+BpmB,IAAA+J,UAA/B,CAA+C,aAA/C,CAME,QAAQ,CAACjK,CAAD,CAAO,CACb,IAAMmvB,EZrFI7K,CYqFe,CAAsBtkB,CAAtB,CAAzB,CACMivB,EAAeK,EAAAjlB,KAAA,CAA6B,IAA7B,CAAmCrK,CAAnC,CAEjBmvB,EAAJ,EACE1H,CAAA,CAAAoB,CAAA,CAAyB7oB,CAAzB,CAGF,OAAOivB,EARM,CANjB,CZsBc3I,EYLd,CAA+BpmB,IAAA+J,UAA/B,CAA+C,cAA/C,CAOE,QAAQ,CAACslB,CAAD,CAAeC,CAAf,CAA6B,CACnC,GAAID,CAAJ,WAA4Bve,iBAA5B,CAA8C,CAC5C,IAAMge,EAAgB/e,KAAAhG,UAAAiK,MAAAka,MAAA,CAA4BmB,CAAArtB,WAA5B,CAChB+sB,EAAAA,CAAeQ,EAAAplB,KAAA,CAA8B,IAA9B,CAAoCklB,CAApC,CAAkDC,CAAlD,CAKrB,IZ9GQlL,CY8GJ,CAAsB,IAAtB,CAAJ,CAEE,IADAmD,CAAA,CAAAoB,CAAA,CAAyB2G,CAAzB,CACShtB,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CAAoBwsB,CAAAhwB,OAApB,CAA0CwD,CAAA,EAA1C,CACE4kB,CAAA,CAAAyB,CAAA,CAAsBmG,CAAA,CAAcxsB,CAAd,CAAtB,CAIJ,OAAOysB,EAdqC,CAiBxCS,CAAAA,CZxHIpL,CYwHuB,CAAsBiL,CAAtB,CACjC,KAAMN,EAAeQ,EAAAplB,KAAA,CAA8B,IAA9B,CAAoCklB,CAApC,CAAkDC,CAAlD,CAArB,CACMG,EZ1HIrL,CY0Hc,CAAsB,IAAtB,CAEpBqL,EAAJ,EACElI,CAAA,CAAAoB,CAAA,CAAyB2G,CAAzB,CAGEE,EAAJ,EACEjI,CAAA,CAAAoB,CAAA,CAAyB0G,CAAzB,CAGEI,EAAJ,EACEvI,CAAA,CAAAyB,CAAA,CAAsB0G,CAAtB,CAGF,OAAON,EAlC4B,CAPvC,CAqFIW,GAAJ,EAA+BC,EAAAhtB,IAA/B,CACE+rB,CAAA,CAAkB1uB,IAAA+J,UAAlB,CAAkC2lB,EAAlC,CADF,CAGE5I,EAAA,CAAA6B,CAAA,CAAmB,QAAQ,CAAC3qB,CAAD,CAAU,CACnC0wB,CAAA,CAAkB1wB,CAAlB,CAA2B,CACzBoM,WAAY,CAAA,CADa,CAEzBvH,aAAc,CAAA,CAFW,CAKzBF,IAAyBA,QAAQ,EAAG,CAIlC,IAFA,IAAMitB;AAAQ,EAAd,CAESttB,EAAI,CAAb,CAAgBA,CAAhB,CAAoB,IAAAN,WAAAlD,OAApB,CAA4CwD,CAAA,EAA5C,CACEstB,CAAA9hB,KAAA,CAAW,IAAA9L,WAAA,CAAgBM,CAAhB,CAAAT,YAAX,CAGF,OAAO+tB,EAAAza,KAAA,CAAW,EAAX,CAR2B,CALX,CAezBzD,IAAyBA,QAAQ,CAACkd,CAAD,CAAgB,CAC/C,IAAA,CAAO,IAAAjvB,WAAP,CAAA,CACEyvB,EAAAjlB,KAAA,CAA6B,IAA7B,CAAmC,IAAAxK,WAAnC,CAEFuvB,GAAA/kB,KAAA,CAA6B,IAA7B,CAAmC1M,QAAAgQ,eAAA,CAAwBmhB,CAAxB,CAAnC,CAJ+C,CAfxB,CAA3B,CADmC,CAArC,CA1M+B,C,CCWpB,QAAA,GAAQ,CAACjG,CAAD,CAAkC,CAAtBtC,IAAAA,ECsRPpc,OAAAF,UDjR1B8lB,SAASA,EAAgB,CAAC7B,CAAD,CAAgB,CACvC,MAAO,SAAQ,CAAC,CAAD,CAAW,CAAV,IAAA,IAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,SAAA,OAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAKRrjB,EAAAA,CAAiB,EAQvB,KAFA,IAAMsjB,EAAoB,EAA1B,CAES3rB,EAAI,CAAb,CAAgBA,CAAhB,CAbwBwN,CAaJhR,OAApB,CAAkCwD,CAAA,EAAlC,CAAuC,CACrC,IAAMxC,EAdgBgQ,CAcT,CAAMxN,CAAN,CAETxC,EAAJ,WAAoBmK,QAApB,EbdQma,CacuB,CAAsBtkB,CAAtB,CAA/B,EACEmuB,CAAAngB,KAAA,CAAuBhO,CAAvB,CAGF,IAAIA,CAAJ,WAAoBgR,iBAApB,CACE,IAASiB,CAAT,CAAiBjS,CAAAH,WAAjB,CAAkCoS,CAAlC,CAAyCA,CAAzC,CAAiDA,CAAA7I,YAAjD,CACEyB,CAAAmD,KAAA,CAAoBiE,CAApB,CAFJ,KAKEpH,EAAAmD,KAAA,CAAoBhO,CAApB,CAZmC,CAgBvCkuB,CAAAE,MAAA,CAAoB,IAApB,CA7BwBpe,CA6BxB,CAEA,KAASxN,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB2rB,CAAAnvB,OAApB,CAA8CwD,CAAA,EAA9C,CACEilB,CAAA,CAAAoB,CAAA,CAAyBsF,CAAA,CAAkB3rB,CAAlB,CAAzB,CAGF,IbjCU8hB,CaiCN,CAAsB,IAAtB,CAAJ,CACE,IAAS9hB,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBqI,CAAA7L,OAApB,CAA2CwD,CAAA,EAA3C,CACQxC,CACN,CADa6K,CAAA,CAAerI,CAAf,CACb,CAAIxC,CAAJ,WAAoBmK,QAApB,EACEid,CAAA,CAAAyB,CAAA,CAAsB7oB,CAAtB,CAvCkB,CADa,CA+ClBmE,IAAAA,EAAvB,GCmOU6rB,EDnOV,GACiCzJ,CbwDjC,OazDA,CACwDwJ,CAAAjuB,CCkO9CkuB,EDlO8CluB,CADxD,CAIuBqC,KAAAA,EAAvB,GC+NU6rB,ED/NV,GACiCzJ,CboDjC,MarDA,CACuDwJ,CAAAjuB,CC+N9CmuB,ED/N8CnuB,CADvD,CAI4BqC,KAAAA,EAA5B;AC6Ne+rB,ED7Nf,EbgDc5J,Ca/CZ,CAA+BC,CAA/B,CAA4C,aAA5C,CAIE,QAAQ,CAAC,CAAD,CAAW,CAAV,IAAA,IAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,SAAA,OAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAKD1b,EAAAA,CAAiB,EAQvB,KAFA,IAAMsjB,EAAoB,EAA1B,CAES3rB,EAAI,CAAb,CAAgBA,CAAhB,CAbiBwN,CAaGhR,OAApB,CAAkCwD,CAAA,EAAlC,CAAuC,CACrC,IAAMxC,EAdSgQ,CAcF,CAAMxN,CAAN,CAETxC,EAAJ,WAAoBmK,QAApB,EbzEMma,CayEyB,CAAsBtkB,CAAtB,CAA/B,EACEmuB,CAAAngB,KAAA,CAAuBhO,CAAvB,CAGF,IAAIA,CAAJ,WAAoBgR,iBAApB,CACE,IAASiB,CAAT,CAAiBjS,CAAAH,WAAjB,CAAkCoS,CAAlC,CAAyCA,CAAzC,CAAiDA,CAAA7I,YAAjD,CACEyB,CAAAmD,KAAA,CAAoBiE,CAApB,CAFJ,KAKEpH,EAAAmD,KAAA,CAAoBhO,CAApB,CAZmC,CAgBjCmwB,CAAAA,CbtFE7L,CasFa,CAAsB,IAAtB,CC2LZ4L,GDzLT9B,MAAA,CAA0B,IAA1B,CA/BiBpe,CA+BjB,CAEA,KAASxN,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB2rB,CAAAnvB,OAApB,CAA8CwD,CAAA,EAA9C,CACEilB,CAAA,CAAAoB,CAAA,CAAyBsF,CAAA,CAAkB3rB,CAAlB,CAAzB,CAGF,IAAI2tB,CAAJ,CAEE,IADA1I,CAAA,CAAAoB,CAAA,CAAyB,IAAzB,CACSrmB,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CAAoBqI,CAAA7L,OAApB,CAA2CwD,CAAA,EAA3C,CACQxC,CACN,CADa6K,CAAA,CAAerI,CAAf,CACb,CAAIxC,CAAJ,WAAoBmK,QAApB,EACEid,CAAA,CAAAyB,CAAA,CAAsB7oB,CAAtB,CA1CW,CAJrB,CAqDqBmE,KAAAA,EAAvB,GCwKUisB,EDxKV,EbNc9J,CaOZ,CAA+BC,CAA/B,CAA4C,QAA5C,CACE,QAAQ,EAAG,CACT,IAAM4J,Eb7GE7L,Ca6Ga,CAAsB,IAAtB,CCqKjB8L,GDnKJ/lB,KAAA,CAAoB,IAApB,CAEI8lB,EAAJ,EACE1I,CAAA,CAAAoB,CAAA,CAAyB,IAAzB,CANO,CADb,CAnHqD,C,CCP1C,QAAA,GAAQ,EAAY,CAAXA,IAAAA,ELqBTA,EKLbwH,SAASA,EAAe,CAAC9J,CAAD,CAAcsI,CAAd,CAA8B,CACpDlsB,MAAAC,eAAA,CAAsB2jB,CAAtB,CAAmC,WAAnC,CAAgD,CAC9Cjc,WAAYukB,CAAAvkB,WADkC,CAE9CvH,aAAc,CAAA,CAFgC,CAG9CF,IAAKgsB,CAAAhsB,IAHyC,CAI9C+O,IAA4BA,QAAQ,CAAC0e,CAAD,CAAa,CAAA,IAAA,EAAA,IAAA,CAS3CC,EAAkBpsB,IAAAA,EdfdmgB,EcOYA,CAAsB,IAAtBA,CASpB,GACEiM,CACA,CADkB,EAClB,CdwBMpK,CcxBN,CAAqC,IAArC,CAA2C,QAAA,CAAAjoB,CAAA,CAAW,CAChDA,CAAJ,GAAgB,CAAhB,EACEqyB,CAAAviB,KAAA,CAAqB9P,CAArB,CAFkD,CAAtD,CAFF,CASA2wB,EAAAjd,IAAAvH,KAAA,CAAwB,IAAxB,CAA8BimB,CAA9B,CAEA,IAAIC,CAAJ,CACE,IAAK,IAAI/tB,EAAI,CAAb,CAAgBA,CAAhB,CAAoB+tB,CAAAvxB,OAApB,CAA4CwD,CAAA,EAA5C,CAAiD,CAC/C,IAAMtE,EAAUqyB,CAAA,CAAgB/tB,CAAhB,CZnDlB6kB,EYoDE,GAAInpB,CAAAopB,WAAJ,EACEuB,CAAAnB,qBAAA,CAA+BxpB,CAA/B,CAH6C,CAU9C,IAAAE,cAAA0pB,iBAAL,CAGEH,CAAA,CAAAkB,CAAA,CAA8B,IAA9B,CAHF,CACE3B,EAAA,CAAA2B,CAAA,CAAoB,IAApB,CAIF,OAAOyH,EArCwC,CAJH,CAAhD,CADoD,CA2KtDE,QAASA,EAA2B,CAACjK,CAAD,CAAckK,CAAd,CAA0B,CdxEhDnK,CcyEZ,CAA+BC,CAA/B,CAA4C,uBAA5C,CAOE,QAAQ,CAACmK,CAAD,CAAWxyB,CAAX,CAAoB,CAC1B,IAAMiyB,EdrLE7L,CcqLa,CAAsBpmB,CAAtB,CACfyyB,EAAAA,CACHF,CAAApmB,KAAA,CAAgB,IAAhB,CAAsBqmB,CAAtB,CAAgCxyB,CAAhC,CAECiyB,EAAJ,EACE1I,CAAA,CAAAoB,CAAA,CAAyB3qB,CAAzB,Cd1LMomB,Ec6LJ,CAAsBqM,CAAtB,CAAJ,EACEvJ,CAAA,CAAAyB,CAAA,CAAsB3qB,CAAtB,CAEF;MAAOyyB,EAZmB,CAP9B,CAD4D,CAiC9DC,QAASA,EAAwB,CAACrK,CAAD,CAAckK,CAAd,CAA0B,CAQzDI,QAASA,EAAmB,CAAC3K,CAAD,CAAQ4K,CAAR,CAAa,CAEvC,IADA,IAAM9gB,EAAQ,EACd,CAAuBhQ,CAAvB,GAAgC8wB,CAAhC,CAAqC9wB,CAArC,CAA4CA,CAAAoJ,YAA5C,CACE4G,CAAAhC,KAAA,CAAWhO,CAAX,CAEF,KAASwC,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBwN,CAAAhR,OAApB,CAAkCwD,CAAA,EAAlC,CACEmlB,CAAA,CAAAkB,CAAA,CAA8B7Y,CAAA,CAAMxN,CAAN,CAA9B,CANqC,CdjH7B8jB,Cc2HZ,CAA+BC,CAA/B,CAA4C,oBAA5C,CAME,QAAQ,CAACmK,CAAD,CAAW/sB,CAAX,CAAiB,CACvB+sB,CAAA,CAAWA,CAAAK,YAAA,EAEX,IAAiB,aAAjB,GAAIL,CAAJ,CAAgC,CAC9B,IAAMM,EAAS,IAAA7lB,gBACfslB,EAAApmB,KAAA,CAAgB,IAAhB,CAAsBqmB,CAAtB,CAAgC/sB,CAAhC,CACAktB,EAAA,CACwBG,CADxB,EACkC,IAAA1yB,WAAAuB,WADlC,CAC+D,IAD/D,CAH8B,CAAhC,IAKO,IAAiB,YAAjB,GAAI6wB,CAAJ,CACCM,CAEN,CAFe,IAAAnxB,WAEf,CADA4wB,CAAApmB,KAAA,CAAgB,IAAhB,CAAsBqmB,CAAtB,CAAgC/sB,CAAhC,CACA,CAAAktB,CAAA,CAA0C,IAAAhxB,WAA1C,CAA4DmxB,CAA5D,CAHK,KAIA,IAAiB,WAAjB,GAAIN,CAAJ,CACCM,CAEN,CAFe,IAAA5lB,UAEf,CADAqlB,CAAApmB,KAAA,CAAgB,IAAhB,CAAsBqmB,CAAtB,CAAgC/sB,CAAhC,CACA,CAAAktB,CAAA,CAAoBG,CAApB,EAA8B,IAAAnxB,WAA9B,CAA+C,IAA/C,CAHK,KAIA,IAAiB,UAAjB,GAAI6wB,CAAJ,CACCM,CAEN,CAFe,IAAA5nB,YAEf,CADAqnB,CAAApmB,KAAA,CAAgB,IAAhB;AAAsBqmB,CAAtB,CAAgC/sB,CAAhC,CACA,CAAAktB,CAAA,CAA0C,IAAAznB,YAA1C,CAA6D4nB,CAA7D,CAHK,KAKL,MAAM,KAAI7G,WAAJ,CAAgB,sBAAhB,CAAuC8G,MAAA,CAAOP,CAAP,CAAvC,CACJ,0EADI,CAAN,CArBqB,CAN3B,CAlByD,CA3NvDQ,EAAJ,EdkHc5K,CcjHZ,CAA+Bnc,OAAAF,UAA/B,CAAkD,cAAlD,CAME,QAAQ,CAACknB,CAAD,CAAO,CAGb,MADA,KAAA9K,gBACA,CAFM1Q,CAEN,CAFmByb,EAAA/mB,KAAA,CAAiC,IAAjC,CAAuC8mB,CAAvC,CADN,CANjB,CA6DEE,GAAJ,EAAgCC,EAAAzuB,IAAhC,CACEwtB,CAAA,CAAgBlmB,OAAAF,UAAhB,CAAmConB,EAAnC,CADF,CAEWE,EAAJ,EAAoCC,EAAA3uB,IAApC,CACLwtB,CAAA,CAAgBzf,WAAA3G,UAAhB,CAAuCsnB,EAAvC,CADK,CAILvK,EAAA,CAAA6B,CAAA,CAAmB,QAAQ,CAAC3qB,CAAD,CAAU,CACnCmyB,CAAA,CAAgBnyB,CAAhB,CAAyB,CACvBoM,WAAY,CAAA,CADW,CAEvBvH,aAAc,CAAA,CAFS,CAMvBF,IAA4BA,QAAQ,EAAG,CACrC,MAAOwsB,GAAAhlB,KAAA,CAA2B,IAA3B,CAAiC,CAAA,CAAjC,CAAA9C,UAD8B,CANhB,CAYvBqK,IAA4BA,QAAQ,CAACkd,CAAD,CAAgB,CAIlD,IAAM2C,EAAiC,UAAjCA,GAAc,IAAA9xB,UAApB,CAEM0B,EAAUowB,CAAA,CACb,IAD0BpwB,QAAb;AACI,IAHpB,CAKMqwB,EAAa9D,EAAAvjB,KAAA,CAAmC1M,QAAnC,CACjB,IAAAgC,UADiB,CAInB,KAFA+xB,CAAAnqB,UAEA,CAFuBunB,CAEvB,CAAmC,CAAnC,CAAOztB,CAAAa,WAAAlD,OAAP,CAAA,CACEswB,EAAAjlB,KAAA,CAA6BhJ,CAA7B,CAAsCA,CAAAa,WAAA,CAAmB,CAAnB,CAAtC,CAGF,KADMiM,CACN,CADkBsjB,CAAA,CAAaC,CAAArwB,QAAb,CAAkCqwB,CACpD,CAAqC,CAArC,CAAOvjB,CAAAjM,WAAAlD,OAAP,CAAA,CACEowB,EAAA/kB,KAAA,CAA6BhJ,CAA7B,CAAsC8M,CAAAjM,WAAA,CAAqB,CAArB,CAAtC,CAlBgD,CAZ7B,CAAzB,CADmC,CAArC,Cd8CYokB,EcPd,CAA+Bnc,OAAAF,UAA/B,CAAkD,cAAlD,CAME,QAAQ,CAACpI,CAAD,CAAO6mB,CAAP,CAAiB,CAEvB,GZ3HIrB,CY2HJ,GAAI,IAAAC,WAAJ,CACE,MAAOqK,GAAAtnB,KAAA,CAAiC,IAAjC,CAAuCxI,CAAvC,CAA6C6mB,CAA7C,CAGT,KAAMD,EAAWmJ,EAAAvnB,KAAA,CAAiC,IAAjC,CAAuCxI,CAAvC,CACjB8vB,GAAAtnB,KAAA,CAAiC,IAAjC,CAAuCxI,CAAvC,CAA6C6mB,CAA7C,CACAA,EAAA,CAAWkJ,EAAAvnB,KAAA,CAAiC,IAAjC,CAAuCxI,CAAvC,CACXgnB,EAAAN,yBAAA,CAAmC,IAAnC,CAAyC1mB,CAAzC,CAA+C4mB,CAA/C,CAAyDC,CAAzD,CAAmE,IAAnE,CATuB,CAN3B,CdOcpC,EcWd,CAA+Bnc,OAAAF,UAA/B,CAAkD,gBAAlD,CAOE,QAAQ,CAAC0e,CAAD,CAAY9mB,CAAZ,CAAkB6mB,CAAlB,CAA4B,CAElC,GZ9IIrB,CY8IJ,GAAI,IAAAC,WAAJ,CACE,MAAOuK,GAAAxnB,KAAA,CAAmC,IAAnC,CAAyCse,CAAzC,CAAoD9mB,CAApD,CAA0D6mB,CAA1D,CAGT,KAAMD,EAAWqJ,EAAAznB,KAAA,CAAmC,IAAnC;AAAyCse,CAAzC,CAAoD9mB,CAApD,CACjBgwB,GAAAxnB,KAAA,CAAmC,IAAnC,CAAyCse,CAAzC,CAAoD9mB,CAApD,CAA0D6mB,CAA1D,CACAA,EAAA,CAAWoJ,EAAAznB,KAAA,CAAmC,IAAnC,CAAyCse,CAAzC,CAAoD9mB,CAApD,CACXgnB,EAAAN,yBAAA,CAAmC,IAAnC,CAAyC1mB,CAAzC,CAA+C4mB,CAA/C,CAAyDC,CAAzD,CAAmEC,CAAnE,CATkC,CAPtC,CdXcrC,Ec8Bd,CAA+Bnc,OAAAF,UAA/B,CAAkD,iBAAlD,CAKE,QAAQ,CAACpI,CAAD,CAAO,CAEb,GZ/JIwlB,CY+JJ,GAAI,IAAAC,WAAJ,CACE,MAAOyK,GAAA1nB,KAAA,CAAoC,IAApC,CAA0CxI,CAA1C,CAGT,KAAM4mB,EAAWmJ,EAAAvnB,KAAA,CAAiC,IAAjC,CAAuCxI,CAAvC,CACjBkwB,GAAA1nB,KAAA,CAAoC,IAApC,CAA0CxI,CAA1C,CACiB,KAAjB,GAAI4mB,CAAJ,EACEI,CAAAN,yBAAA,CAAmC,IAAnC,CAAyC1mB,CAAzC,CAA+C4mB,CAA/C,CAAyD,IAAzD,CAA+D,IAA/D,CATW,CALjB,Cd9BcnC,EcgDd,CAA+Bnc,OAAAF,UAA/B,CAAkD,mBAAlD,CAME,QAAQ,CAAC0e,CAAD,CAAY9mB,CAAZ,CAAkB,CAExB,GZlLIwlB,CYkLJ,GAAI,IAAAC,WAAJ,CACE,MAAO0K,GAAA3nB,KAAA,CAAsC,IAAtC,CAA4Cse,CAA5C,CAAuD9mB,CAAvD,CAGT,KAAM4mB,EAAWqJ,EAAAznB,KAAA,CAAmC,IAAnC,CAAyCse,CAAzC,CAAoD9mB,CAApD,CACjBmwB,GAAA3nB,KAAA,CAAsC,IAAtC,CAA4Cse,CAA5C,CAAuD9mB,CAAvD,CAIA,KAAM6mB,EAAWoJ,EAAAznB,KAAA,CAAmC,IAAnC,CAAyCse,CAAzC,CAAoD9mB,CAApD,CACb4mB,EAAJ,GAAiBC,CAAjB,EACEG,CAAAN,yBAAA,CAAmC,IAAnC,CAAyC1mB,CAAzC,CAA+C4mB,CAA/C,CAAyDC,CAAzD,CAAmEC,CAAnE,CAbsB,CAN5B,CAgDIsJ,GAAJ;AACEzB,CAAA,CAA4B5f,WAAA3G,UAA5B,CAAmDgoB,EAAnD,CADF,CAEWC,EAAJ,CACL1B,CAAA,CAA4BrmB,OAAAF,UAA5B,CAA+CioB,EAA/C,CADK,CAGL3f,OAAA8D,KAAA,CAAa,mEAAb,CAuDE8b,GAAJ,CACEvB,CAAA,CAAyBhgB,WAAA3G,UAAzB,CAAgDkoB,EAAhD,CADF,CAEWC,EAAJ,CACLxB,CAAA,CAAyBzmB,OAAAF,UAAzB,CAA4CmoB,EAA5C,CADK,CAGL7f,OAAA8D,KAAA,CAAa,gEAAb,CJ/QWqX,GImRb,CAAgB7E,CAAhB,CAA2B1e,OAAAF,UAA3B,CAA8C,CAC5CokB,EAASgE,EADmC,CAE5C/D,OAAQgE,EAFoC,CAA9C,CDjRa5E,GCsRb,CAAe7E,CAAf,CA7RiC,C,CLQnC,IAAM0J,GAAsB/0B,MAAA,eAE5B,IAAI,CAAC+0B,EAAL,EACKA,EAAA,cADL,EAE8C,UAF9C,EAEM,MAAOA,GAAA,OAFb,EAG2C,UAH3C,EAGM,MAAOA,GAAA,IAHb,CAGwD,CAEtD,IAAM1J,GAAY,IRvBLrC,EOKAkH,GCoBb,EEnBaA,GFoBb,ECbaA,GKRb,CNsBsB7E,EMtBtB,CAA2B7X,gBAAA/G,UAA3B,CAAuD,CACrDokB,EAASmE,EAD4C,CAErDlE,OAAQmE,EAF6C,CAAvD,CHDa/E,GHwBb,EKpBaA,GLqBb,EAGA/vB,SAAAmqB,iBAAA,CAA4B,CAAA,CAG5B,KAAM4K,eAAiB,IL9BVnJ,CK8BU,CAA0BV,EAA1B,CAEvBlmB,OAAAC,eAAA,CAAsBpF,MAAtB,CAA8B,gBAA9B,CAAgD,CAC9CuF,aAAc,CAAA,CADgC,CAE9CuH,WAAY,CAAA,CAFkC,CAG9CxI,MAAO4wB,cAHuC,CAAhD,CAhBsD,C;;;;;;;;;AOLtDryB,QADIsyB,GACO,EAAG,CAIZ,IAAA,IAAA,CAFA,IAAA,MAEA,CAFgB,CAQhB,KAAA,MAAA,CAFA,IAAA,OAEA,CAJA,IAAA,SAIA,CAJmB,IAQnB,KAAA,QAAA,CAFA,IAAA,cAEA,CAFwB,EAIxB,KAAA,OAAA,CAAiB,CAAA,CAEjB,KAAA,KAAA,CAAe,CAMf,KAAA,eAAA,CAFA,IAAA,SAEA,CAJA,IAAA,cAIA,CAJwB,EApBZ;AAmCTC,QAASA,GAAK,CAACjvB,CAAD,CAAO,CAC1BA,CAAA,CAAaA,CAUNG,QAAA,CAAgB+uB,EAAhB,CAA6B,EAA7B,CAAA/uB,QAAA,CAAyCgvB,EAAzC,CAAkD,EAAlD,CATAC,KAAAA,EAAAA,EAAAA,CAAapvB,EAAAA,CAAbovB,CAkBHpoB,EAAO,IAAIgoB,EACfhoB,EAAA,MAAA,CAAgB,CAChBA,EAAA,IAAA,CAAchH,CAAA3E,OAEd,KADA,IAAI8I,EAAI6C,CAAR,CACSnI,EAAI,CADb,CACgBmG,EAAIhF,CAAA3E,OAApB,CAAiCwD,CAAjC,CAAqCmG,CAArC,CAAwCnG,CAAA,EAAxC,CACE,GAuKewwB,GAvKf,GAAIrvB,CAAA,CAAKnB,CAAL,CAAJ,CAA4B,CACrBsF,CAAA,MAAL,GACEA,CAAA,MADF,CACe,EADf,CAGA,KAAI8E,EAAI9E,CAAR,CACImrB,EAAWrmB,CAAA,MAAA,CAAWA,CAAA,MAAA5N,OAAX,CAA+B,CAA/B,CAAXi0B,EAAgD,IACpDnrB,EAAA,CAAI,IAAI6qB,EACR7qB,EAAA,MAAA,CAAatF,CAAb,CAAiB,CACjBsF,EAAA,OAAA,CAAc8E,CACd9E,EAAA,SAAA,CAAgBmrB,CAChBrmB,EAAA,MAAAoB,KAAA,CAAgBlG,CAAhB,CAV0B,CAA5B,IAwKgBorB,GA7JT,GAAIvvB,CAAA,CAAKnB,CAAL,CAAJ,GACLsF,CAAA,IACA,CADWtF,CACX,CADe,CACf,CAAAsF,CAAA,CAAIA,CAAA,OAAJ,EAAmB6C,CAFd,CAlCT,OAAOooB,EAAA,CAuCApoB,CAvCA,CAAoBhH,CAApB,CAFmB;AAkD5BovB,QAASA,GAAQ,CAAC/yB,CAAD,CAAO2D,CAAP,CAAa,CAC5B,IAAIwvB,EAAIxvB,CAAAyvB,UAAA,CAAepzB,CAAA,MAAf,CAA8BA,CAAA,IAA9B,CAA4C,CAA5C,CACRA,EAAA,cAAA,CAAwBA,CAAA,QAAxB,CAA0CmzB,CAAAE,KAAA,EACtCrzB,EAAA,OAAJ,GAEEmzB,CASA,CATIxvB,CAAAyvB,UAAA,CADKpzB,CAAA,SAAAszB,CAAmBtzB,CAAA,SAAA,IAAnBszB,CAA6CtzB,CAAA,OAAA,MAClD,CAAmBA,CAAA,MAAnB,CAAmC,CAAnC,CASJ,CARAmzB,CAQA,CARII,EAAA,CAAsBJ,CAAtB,CAQJ,CAPAA,CAOA,CAPIA,CAAArvB,QAAA,CAAU0vB,EAAV,CAA6B,GAA7B,CAOJ,CAJAL,CAIA,CAJIA,CAAAC,UAAA,CAAYD,CAAAM,YAAA,CAAc,GAAd,CAAZ,CAAiC,CAAjC,CAIJ,CAHI7qB,CAGJ,CAHQ5I,CAAA,eAGR,CAHiCA,CAAA,SAGjC,CAHoDmzB,CAAAE,KAAA,EAGpD,CAFArzB,CAAA,OAEA,CAF0C,CAE1C,GAFkB4I,CAAAnD,QAAA,CAmJLiuB,GAnJK,CAElB,CAAI1zB,CAAA,OAAJ,CACiC,CAA/B,GAAI4I,CAAAnD,QAAA,CA+IUkuB,QA/IV,CAAJ,CACE3zB,CAAA,KADF,CACiB4zB,EADjB,CAEWhrB,CAAAxD,MAAA,CAAQyuB,EAAR,CAFX,GAGE7zB,CAAA,KACA,CADe8zB,EACf,CAAA9zB,CAAA,cAAA,CACEA,CAAA,SAAAsF,MAAA,CAAuBkuB,EAAvB,CAAApL,IAAA,EALJ,CADF,CAUIpoB,CAAA,KAVJ,CAS+B,CAA7B,GAAI4I,CAAAnD,QAAA,CAsIQsuB,IAtIR,CAAJ,CACiBC,EADjB,CAGiBC,EAvBrB,CA4BA,IADIC,CACJ,CADSl0B,CAAA,MACT,CACE,IADM,IACGwC,EAAI,CADP,CACUmG,EAAIurB,CAAAl1B,OADd,CACyByE,CAA/B,CACGjB,CADH,CACOmG,CADP,GACclF,CADd,CACkBywB,CAAA,CAAG1xB,CAAH,CADlB,EAC0BA,CAAA,EAD1B,CAEEuwB,EAAA,CAAStvB,CAAT;AAAYE,CAAZ,CAGJ,OAAO3D,EArCqB,CA8C9BuzB,QAASA,GAAqB,CAAC3qB,CAAD,CAAI,CAChC,MAAOA,EAAA9E,QAAA,CAAU,uBAAV,CAAmC,QAAQ,CAAA,CAAA,CAAA,CAAA,CAAG,CAC/CqwB,CAAAA,CAAO,CAEX,KADEC,CACF,CADW,CACX,CADeD,CAAAn1B,OACf,CAAOo1B,CAAA,EAAP,CAAA,CACED,CAAA,CAAO,GAAP,CAAaA,CAEf,OAAO,IAAP,CAAcA,CANqC,CAA9C,CADyB;AAkB3BE,QAASA,GAAS,CAACr0B,CAAD,CAAOs0B,CAAP,CAA2B3wB,CAA3B,CAAsC,CAAXA,CAAA,CAAA,IAAA,EAAA,GAAAA,CAAA,CAAO,EAAP,CAAAA,CAElD,KAAI4wB,EAAU,EACd,IAAIv0B,CAAA,QAAJ,EAAuBA,CAAA,MAAvB,CAAsC,CACpC,IAAIk0B,EAAKl0B,CAAA,MAAT,CACI,CAAA,IAAAk0B,CAAA,CAAAA,CAAA,CAgCFzwB,CAhCQ,CAAA+wB,CAgCJ,CAAM,CAAN,CAhCI,CAAA,CAAA,CAAA,EAiCG/wB,CAjCH,EAiCiBA,CAAA,SAjCjB,EAiCwE,CAjCxE,GAiCmCA,CAAA,SAAAgC,QAAA,CAuD/BsuB,IAvD+B,CAjCnC,CAAV,IAAI,CAAJ,CAA+B,CACpBvxB,CAAAA,CAAI,CAAb,KAD6B,IACbmG,EAAIurB,CAAAl1B,OADS,CACEyE,CAA/B,CACGjB,CADH,CACOmG,CADP,GACclF,CADd,CACkBywB,CAAA,CAAG1xB,CAAH,CADlB,EAC0BA,CAAA,EAD1B,CAEE+xB,CAAA,CAAUF,EAAA,CAAU5wB,CAAV,CAAa6wB,CAAb,CAAiCC,CAAjC,CAHiB,CAA/B,IAMYD,EAAA,CAAqB,CAArB,CAAqB,CAAA,QAArB,EACR,CAmCN,CAnCM,CAAA,QAmCN,CADAC,CACA,CADqCA,CAS9BzwB,QAAA,CACI2wB,EADJ,CACmB,EADnB,CAAA3wB,QAAA,CAEI4wB,EAFJ,CAEkB,EAFlB,CARP,CAAA,CAAA,CAA6BH,CAkBtBzwB,QAAA,CACI6wB,EADJ,CACmB,EADnB,CAAA7wB,QAAA,CAEI8wB,EAFJ,CAEiB,EAFjB,CAtDO,CAGV,EADAL,CACA,CAHUA,CAEAlB,KAAA,EACV,IACEkB,CADF,CACY,IADZ,CACmBA,CADnB,CAC6B,IAD7B,CAXkC,CAiBlCA,CAAJ,GACMv0B,CAAA,SAIJ,GAHE2D,CAGF,EAHU3D,CAAA,SAGV,CAHgD,MAGhD,EADA2D,CACA,EADQ4wB,CACR,CAAIv0B,CAAA,SAAJ,GACE2D,CADF,EACU,OADV,CALF,CASA,OAAOA,EA7BsD;AAwE7DkxB,IAAAA,GAAYA,CAAZA,CACAC,GAAgBA,CADhBD,CAEAE,GAAYA,CAFZF,CAGAG,GAAYA,GAHZH,CAWAI,GAAUA,mCAXVJ,CAYAK,GAAMA,kBAZNL,CAaAM,GAAYA,mDAbZN,CAcAO,GAAWA,4DAdXP,CAeAQ,GAAYA,yCAfZR,CAgBAS,GAAUA,2CAhBVT,CAiBAU,GAAeA,mBAjBfV,CAkBAW,GAAgBA,M,CCtPX,IAAMC,EAAe,EAAEj4B,MAAA,SAAF,EAAwBA,MAAA,SAAA,MAAxB,CAArB,CACHk4B,EAKJC,SAASA,GAAgB,CAAC/pB,CAAD,CAAW,CAEhC8pB,EAAA,CADE9pB,CAAJ,EAAgBA,CAAA,kBAAhB,CACwB,CAAA,CADxB,CASwB6pB,CATxB,EASwC,EAAS5uB,SAAAC,UAAA1B,MAAA,CAA0B,2BAA1B,CAAT,EACpCwwB,CAAAp4B,MAAAo4B,IADoC,EACtBC,CAAAD,GAAAC,SADsB,EACN,CAAAD,GAAAC,SAAA,CAAa,YAAb,CAA2B,kBAA3B,CADM,CAVN,CAehCr4B,MAAAs4B,SAAJ,EAAqD3xB,IAAAA,EAArD,GAAuB3G,MAAAs4B,SAAAC,UAAvB,CACEL,EADF,CACwBl4B,MAAAs4B,SAAAC,UADxB,CAEWv4B,MAAAs4B,SAAJ,EACLH,EAAA,CAAiBn4B,MAAAs4B,SAAjB,CAEA,CAAAt4B,MAAAs4B,SAAA,CAAkB3xB,IAAAA,EAHb,EAKLwxB,EAAA,CAAiBn4B,MAAA,cAAjB,EAA4CA,MAAA,cAAA,MAA5C,CAMK,KAAMw4B,EAA4CN,E,CCpClD,IAAMO,GAAa,yHAAnB,CACMC,GAAc,sCADpB,CAEMC,GAAe,2BAFrB,CAGMC,GAAkB,sCAHxB,CAIMC,GAAc,cAJpB,CAMMC,GAAY,Y,CCHzB,IAAMC,GAAe,IAAI1nB,G,CCSlB2nB,QAASA,GAAU,CAAChC,CAAD,CAAQ71B,CAAR,CAAkB,CAC1C,GAAI,CAAC61B,CAAL,CACE,MAAO,EAEY,SAArB,GAAI,MAAOA,EAAX,GACEA,CADF,CJ4Bc5B,EI3BJ,CAAM4B,CAAN,CADV,CAGI71B,EAAJ,EACE83B,EAAA,CAAYjC,CAAZ,CAAmB71B,CAAnB,CAEF,OJwIc01B,GIxIP,CAAUG,CAAV,CHcIwB,CGdJ,CAVmC,CAiBrCU,QAASA,GAAa,CAACC,CAAD,CAAQ,CAC/B,CAACA,CAAA,WAAL,EAA4BA,CAAA50B,YAA5B,GACE40B,CAAA,WADF,CJcc/D,EIbU,CAAM+D,CAAA50B,YAAN,CADxB,CAGA,OAAO40B,EAAA,WAAP,EAA8B,IAJK,CAc9BC,QAASA,GAAmB,CAACC,CAAD,CAAO,CACxC,MAAO,CAAA,CAAQA,CAAA,OAAf,EACAA,CAAA,OAAA,KADA,GAC2B/C,EAFa,CAWnC2C,QAASA,GAAW,CAACz2B,CAAD,CAAO82B,CAAP,CAA0BC,CAA1B,CAAiDC,CAAjD,CAAkE,CAC3F,GAAKh3B,CAAL,CAAA,CAGA,IAAIi3B,EAAY,CAAA,CAAhB,CACI35B,EAAO0C,CAAA,KACX,IAAIg3B,CAAJ,EACM15B,CADN,GACes2B,EADf,CACiC,CAC7B,IAAIsD,EAAal3B,CAAA,SAAAoF,MAAA,CF1DVixB,EE0DU,CACba,EAAJ,GAEO15B,MAAA05B,WAAA,CAAkBA,CAAA,CAAW,CAAX,CAAlB,CAAArqB,QAFP,GAGIoqB,CAHJ,CAGgB,CAAA,CAHhB,EAF6B,CAU7B35B,CAAJ,GAAa22B,EAAb,CACE6C,CAAA,CAAkB92B,CAAlB,CADF,CAEW+2B,CAAJ,EACLz5B,CADK,GACIw2B,EADJ,CAELiD,CAAA,CAAsB/2B,CAAtB,CAFK,CAGI1C,CAHJ,GAGa02B,EAHb,GAILiD,CAJK,CAIO,CAAA,CAJP,CAOP,KADI/C,CACJ,CADSl0B,CAAA,MACT,GAAU,CAACi3B,CAAX,CAAsB,CACXz0B,CAAAA,CAAE,CAAGmG,EAAAA,CAAEurB,CAAAl1B,OAAhB,KAAK,IAAsByE,CAA3B,CAA+BjB,CAA/B,CAAiCmG,CAAjC,GAAwClF,CAAxC,CAA0CywB,CAAA,CAAG1xB,CAAH,CAA1C,EAAkDA,CAAA,EAAlD,CACEi0B,EAAA,CAAYhzB,CAAZ,CAAeqzB,CAAf,CAAkCC,CAAlC,CAAyDC,CAAzD,CAFkB,CAzBtB,CAD2F;AAyCtFG,QAASA,GAAQ,CAAC5C,CAAD,CAAU6C,CAAV,CAAmBttB,CAAnB,CAA2ButB,CAA3B,CAAwC,CAY9D,IAAIV,EAAwCh5B,QAAA8D,cAAA,CAAuB,OAAvB,CAXN21B,EAYtC,EACET,CAAA/0B,aAAA,CAAmB,OAAnB,CAboCw1B,CAapC,CAEFT,EAAA50B,YAAA,CAf6BwyB,CAC7B+C,GAAA,CAeOX,CAfP,CAAkB7sB,CAAlB,CAA0ButB,CAA1B,CACA,OAcOV,EAjBuD,CAwBhE,IAAIY,EAAoB,IAuBjBD,SAASA,GAAU,CAACX,CAAD,CAAQ7sB,CAAR,CAAgButB,CAAhB,CAA6B,CACrDvtB,CAAA,CAASA,CAAT,EAAmBnM,QAAAmD,KAGnBgJ,EAAAX,aAAA,CAAoBwtB,CAApB,CAFaU,CAEb,EAF4BA,CAAAjuB,YAE5B,EADEU,CAAAjK,WACF,CACK03B,EAAL,CAIiBZ,CAAAa,wBAAA9G,CAA8B6G,CAA9B7G,CAJjB,GAKmBxwB,IAAAu3B,4BALnB,GAMIF,CANJ,CAMwBZ,CANxB,EACEY,CADF,CACsBZ,CAN+B;AAyDhDe,QAASA,GAA0B,CAACC,CAAD,CAAMh5B,CAAN,CAAgB,CAExD,IAAIunB,EAAQyR,CAAAlyB,QAAA,CAAY,MAAZ,CACZ,IAAe,EAAf,GAAIygB,CAAJ,CAEE,MAAOvnB,EAAA,CAASg5B,CAAT,CAAc,EAAd,CAAkB,EAAlB,CAAsB,EAAtB,CAvB6B,EAAA,CAAA,CACtC,IAAIC,EAAQ,CACHp1B,KAAAA,EAwBwB0jB,CAxBxB1jB,CAwBgC,CAxBzC,KAAK,IAAamG,EAwBUgvB,CAxBR34B,OAApB,CAAiCwD,CAAjC,CAAqCmG,CAArC,CAAwCnG,CAAA,EAAxC,CACE,GAAgB,GAAhB,GAuB0Bm1B,CAvBtB,CAAKn1B,CAAL,CAAJ,CACEo1B,CAAA,EADF,KAEO,IAAgB,GAAhB,GAqBmBD,CArBf,CAAKn1B,CAAL,CAAJ,EACW,CADX,GACD,EAAEo1B,CADD,CAEH,MAAA,CAIN,EAAA,CAAQ,EAX8B,CA2BlCvM,CAAAA,CAAQsM,CAAAvE,UAAA,CAAclN,CAAd,CAAsB,CAAtB,CAAyB4K,CAAzB,CACR+G,EAAAA,CAASF,CAAAvE,UAAA,CAAc,CAAd,CAAiBlN,CAAjB,CAET4R,EAAAA,CAASJ,EAAA,CAA2BC,CAAAvE,UAAA,CAActC,CAAd,CAAoB,CAApB,CAA3B,CAAmDnyB,CAAnD,CACTo5B,EAAAA,CAAQ1M,CAAA5lB,QAAA,CAAc,GAAd,CAEZ,OAAe,EAAf,GAAIsyB,CAAJ,CAESp5B,CAAA,CAASk5B,CAAT,CAAiBxM,CAAAgI,KAAA,EAAjB,CAA+B,EAA/B,CAAmCyE,CAAnC,CAFT,CAOOn5B,CAAA,CAASk5B,CAAT,CAFKxM,CAAA+H,UAAA,CAAgB,CAAhB,CAAmB2E,CAAnB,CAAA1E,KAAAvxB,EAEL,CADQupB,CAAA+H,UAAA,CAAgB2E,CAAhB,CAAwB,CAAxB,CAAA1E,KAAA2E,EACR,CAAkCF,CAAlC,CAtBiD,CA6BnDG,QAASA,GAAkB,CAAC/5B,CAAD,CAAU4D,CAAV,CAAiB,CHlOtC2zB,CGoOX,CACEv3B,CAAA0D,aAAA,CAAqB,OAArB,CAA8BE,CAA9B,CADF,CAGEtE,MAAA,SAAA,cAAA,aAAA6M,KAAA,CAAyDnM,CAAzD,CAAkE,OAAlE,CAA2E4D,CAA3E,CAL+C;AAa5Co2B,QAASA,EAAY,CAACh6B,CAAD,CAAU,CACpC,IAAIyB,EAAYzB,CAAA,UAAhB,CACai6B,EAAgB,EAKzBx4B,EAAJ,CACgC,EADhC,CACMA,CAAA8F,QAAA,CAAkB,GAAlB,CADN,GAII0yB,CACA,CADgBx4B,CAChB,CAAAy4B,CAAA,CAAMl6B,CAAAsF,aAAN,EAA8BtF,CAAAsF,aAAA,CAAqB,IAArB,CAA9B,EAA6D,EALjE,GAQE40B,CACA,CADsBl6B,CAADk6B,GACrB,CAAAD,CAAA,CAAiCj6B,CAADm6B,QATlC,CAWA,OAAO,CAACD,GAAAA,CAAD,CAAKD,EAAAA,CAAL,CAlB6B,C,CCrNtC,QAAMG,GAAN,EAAA,EAWEC,QAAA,GAAG,CAACv4B,CAAD,CAAO5C,CAAP,CAAco7B,CAAd,CAAiC,CAApCD,IAAAA,EAyTa7K,CAvTP1tB,EAAA,cAAJ,CACEA,CAAA,cADF,CAC0B,IAD1B,CAGEy4B,EAAA,CAAAA,CAAA,CAAmBz4B,CAAnB,CAAyB5C,CAAzB,EAAkC,EAAlC,CAAsCo7B,CAAtC,CALgC,CASpCC,QAAA,GAAa,CAAbA,CAAa,CAACz4B,CAAD,CAAOiC,CAAP,CAAiBu2B,CAAjB,CAAoC,CAC3Cx4B,CAAAC,SAAJ,GAAsBC,IAAAC,aAAtB,EACEjC,EAAA,CAAa8B,CAAb,CAAmBiC,CAAnB,CAA6Bu2B,CAA7B,CAKF,IAHIxmB,CAGJ,CAH6B,UAApB,GAAChS,CAAAL,UAAD,CACPuC,CAAClC,CAAAqB,QAADa,EAAiBlC,CAAA04B,GAAjBx2B,YADO,CAEPlC,CAAAsT,SAFO,EAEUtT,CAAAkC,WACnB,CACE,IAAK,IAAIM,EAAE,CAAX,CAAcA,CAAd,CAAgBwP,CAAAhT,OAAhB,CAA2BwD,CAAA,EAA3B,CACEi2B,EAAA,CAAAA,CAAA,CAAmBzmB,CAAA,CAAGxP,CAAH,CAAnB,CAA0BP,CAA1B,CAAoCu2B,CAApC,CAT2C;AAkBjDt6B,QAAA,GAAO,CAACA,CAAD,CAAUd,CAAV,CAAiBo7B,CAAjB,CAAoC,CAIzC,GAAIp7B,CAAJ,CAEE,GAAIc,CAAAy6B,UAAJ,CACMH,CAAJ,EACEt6B,CAAAy6B,UAAAC,OAAA,CAhDSC,aAgDT,CACA,CAAA36B,CAAAy6B,UAAAC,OAAA,CAAyBx7B,CAAzB,CAFF,GAIEc,CAAAy6B,UAAAxpB,IAAA,CAnDS0pB,aAmDT,CACA,CAAA36B,CAAAy6B,UAAAxpB,IAAA,CAAsB/R,CAAtB,CALF,CADF,KAQO,IAAIc,CAAAsF,aAAJ,CAA0B,CAC/B,IAAIiO,EAAIvT,CAAAsF,aAAA,CAAqBs1B,EAArB,CACJN,EAAJ,CACM/mB,CADN,GAEQiX,CACJ,CADejX,CAAA3N,QAAA,CA1DR+0B,aA0DQ,CAAsB,EAAtB,CAAA/0B,QAAA,CAAkC1G,CAAlC,CAAyC,EAAzC,CACf,CD+II66B,EC/IJ,CAA6B/5B,CAA7B,CAAsCwqB,CAAtC,CAHJ,EDkJQuP,EC3IN,CAA6B/5B,CAA7B,EADgBuT,CAAA,CAAIA,CAAJ,CAAQ,GAAR,CAAc,EAC9B,EADiD,cACjD,CADuDrU,CACvD,CAT6B,CAdM,CAkC3C27B,QAAA,GAAa,CAAC76B,CAAD,CAAU86B,CAAV,CAAsBr6B,CAAtB,CAAgC,CAA7Co6B,IAAAA,EA4ParL,CA5PbqL,CACME,EAAe/6B,CAAA,WJnGVu3B,EI2GT,EAAqC,OAArC,GAAoBwD,CAApB,CACE1E,CADF,CDjGYiC,ECkGA,CAAoBwC,CAApB,CAAgCr6B,CAAhC,CADZ,EAGM,CACJ,CDgIUu5B,CCjIgB,CAAuBh6B,CAAvB,CAC1B,CAAAq2B,CAAA,CAAU2E,EAAA,CAAAA,CAAA,CAASF,CAAT,CADL,CAAAZ,GACK,CADD,CAAAD,EACC,CAAwCx5B,CAAxC,CAAV,CAA8D,MAJhE,CAMA,OAAO41B,EAAAlB,KAAA,EAfoC;AAsB7C6F,QAAA,GAAG,CAAHA,CAAG,CAAC1E,CAAD,CAAQp3B,CAAR,CAAe+7B,CAAf,CAAoBx6B,CAApB,CAA8B,CAC/B,IAAIy6B,EAAYC,EAAA,CAAoBj8B,CAApB,CAA2B+7B,CAA3B,CAChB/7B,EAAA,CAA+BA,CAc/B,CACSk8B,EADT,CAd+Bl8B,CAc/B,CAGS,EAfT,ODlHYo5B,GCkHL,CAAoBhC,CAApB,CAA2B,QAAQ,CAAiBqC,CAAjB,CAAuB,CAC1DA,CAAA0C,EAAL,GACY1C,CAqCd,SApCI,CADUA,CAqCK2C,EApCf,CAqCFC,EAAA,CAzCSC,CAyCT,CAtCY7C,CAsCZ,CAzCS6C,CAyBeC,EAgBxB,CAtCkBv8B,CAsClB,CAtCyBg8B,CAsCzB,CArCE,CAAAvC,CAAA0C,EAAA,CAAgB,CAAA,CAFlB,CAII56B,EAAJ,EACEA,CAAA,CAASk4B,CAAT,CAAez5B,CAAf,CAAsBg8B,CAAtB,CAN6D,CAA1D,CAJwB,CAuBjCC,QAAA,GAAc,CAACj8B,CAAD,CAAQ+7B,CAAR,CAAa,CACzB,MAAOA,EAAA,CAAM,MAAN,CAAa/7B,CAAb,CAAkB,GAAlB,CAAwBA,CADN,CA8B3Bq8B,QAAA,GAAiB,CAAjBA,CAAiB,CAAC5C,CAAD,CAAO+C,CAAP,CAAoBx8B,CAApB,CAA2Bg8B,CAA3B,CAAsC,CACrD,IAAIS,EAAKhD,CAAA,SAAAvxB,MAAA,CAAuBw0B,EAAvB,CAGT,IAAI,CDxIQlD,ECwIP,CAA8BC,CAA9B,CAAL,CAA0C,CAC/Br0B,CAAAA,CAAE,CAAX,KADwC,IAC1BmG,EAAEkxB,CAAA76B,OADwB,CACb4N,CAA3B,CAA+BpK,CAA/B,CAAiCmG,CAAjC,GAAwCiE,CAAxC,CAA0CitB,CAAA,CAAGr3B,CAAH,CAA1C,EAAkDA,CAAA,EAAlD,CACEq3B,CAAA,CAAGr3B,CAAH,CAAA,CAAQo3B,CAAAvvB,KAAA,CAAiB,CAAjB,CAAuBuC,CAAvB,CAA0BxP,CAA1B,CAAiCg8B,CAAjC,CAF8B,CAK1C,MAAOS,EAAAxkB,KAAA,CAAQykB,EAAR,CAT8C,CAgBvDC,QAAA,GAAe,CAAC93B,CAAD,CAAW,CACxB,MAAOA,EAAA6B,QAAA,CAAiBk2B,EAAjB,CAAsB,QAAA,CAACr5B,CAAD,CAAIrD,CAAJ,CAAU28B,CAAV,CAAqB,CACrB,EAA3B,CAAIA,CAAAx0B,QAAA,CAAe,GAAf,CAAJ,CACEw0B,CADF,CACWA,CAAAn2B,QAAA,CAAe,KAAf,CAAsB,KAAtB,CADX,CAEoC,EAFpC,CAEWm2B,CAAAx0B,QAAA,CAAe,KAAf,CAFX,GAGEw0B,CAHF,CAGWA,CAAAn2B,QAAA,CAAe,MAAf,CAAuB,GAAvB,CAHX,CAKA,OAAO,GAAP,CAAWxG,CAAX,CAAe,GAAf,CAAmB28B,CAAnB,CAAyB,GANuB,CAA3C,CADiB;AAgB1B,EAAA,UAAA,EAAA,CAAAN,QAAyB,CAAC13B,CAAD,CAAW7E,CAAX,CAAkBg8B,CAAlB,CAA6B,CACpD,IAAIc,EAAO,CAAA,CACXj4B,EAAA,CAAWA,CAAAoxB,KAAA,EAEX,KAAI8G,EAAQH,EAAApzB,KAAA,CAAS3E,CAAT,CACRk4B,EAAJ,GACEl4B,CACA,CADWA,CAAA6B,QAAA,CAAiBk2B,EAAjB,CAAsB,QAAA,CAACr5B,CAAD,CAAIrD,CAAJ,CAAU+tB,CAAV,CAAoB,CAAA,MAAA,GAAA,CAAI/tB,CAAJ,CAAQ,GAAR,CAAY+tB,CAAAvnB,QAAA,CAAc,KAAd,CAAqB,EAArB,CAAZ,CAAoC,GAApC,CAA1C,CACX,CAAA7B,CAAA,CAAW83B,EAAA,CAAqB93B,CAArB,CAFb,CAIAA,EAAA,CAAWA,CAAA6B,QAAA,CAAiBs2B,EAAjB,CAAmCC,EAAnC,CAAuC,KAAvC,CACXp4B,EAAA,CAAWA,CAAA6B,QAAA,CAAiBw2B,EAAjB,CAAsC,QAAA,CAAC35B,CAAD,CAAI8Q,CAAJ,CAAO7I,CAAP,CAAa,CACvDsxB,CAAL,GACMK,CAGJ,CAHWC,EAAA,CAAgC5xB,CAAhC,CAAmC6I,CAAnC,CAAsCrU,CAAtC,CAA6Cg8B,CAA7C,CAGX,CAFAc,CAEA,CAFOA,CAEP,EAFeK,CAAAL,KAEf,CADAzoB,CACA,CADI8oB,CAAAE,GACJ,CAAA7xB,CAAA,CAAI2xB,CAAAz4B,MAJN,CAMA,OAAO2P,EAAP,CAAW7I,CAPiD,CAAnD,CASPuxB,EAAJ,GACEl4B,CADF,CACa83B,EAAA,CAAqB93B,CAArB,CADb,CAGA,OAAOA,EAtB6C,CAyBtDu4B;QAAA,GAA0B,CAACv4B,CAAD,CAAWw4B,CAAX,CAAuBr9B,CAAvB,CAA8Bg8B,CAA9B,CAAyC,CAEjE,IAAIsB,EAAez4B,CAAAwD,QAAA,CAAiBk1B,EAAjB,CACW,EAA9B,EAAI14B,CAAAwD,QAAA,CAAiB40B,EAAjB,CAAJ,CACEp4B,CADF,CACa24B,EAAA,CAA4B34B,CAA5B,CAAsCm3B,CAAtC,CADb,CAG4B,CAH5B,GAGWsB,CAHX,GAIEz4B,CAJF,CAIa7E,CAAA,CAAQy9B,EAAA,CAA8B54B,CAA9B,CAAwC7E,CAAxC,CAAR,CACT6E,CALJ,CASI64B,EAAAA,CAAU,CAAA,CACM,EAApB,EAAIJ,CAAJ,GACED,CACA,CADa,EACb,CAAAK,CAAA,CAAU,CAAA,CAFZ,CAMA,IAAIA,CAAJ,CAAa,CACX,IAAAZ,EAAO,CAAA,CACHY,EAAJ,GAEE74B,CAFF,CAEaA,CAAA6B,QAAA,CAAiBi3B,EAAjB,CAAgC,QAAA,CAACp6B,CAAD,CAAIq6B,CAAJ,CAAc,CAAA,MAAA,KAAA,CAAMA,CAAN,CAA9C,CAFb,CAFW,CAOb/4B,CAAA,CAAWA,CAAA6B,QAAA,CAAiBm3B,EAAjB,CAA4B,QAAA,CAACt6B,CAAD,CAAIu6B,CAAJ,CAAYC,CAAZ,CACrC,CAAA,MAAA,QAAA,CAASA,CAAT,CAAY,KAAZ,CAAkBD,CAAlB,CAAwB,IAAxB,CAA6BA,CAA7B,CAAmC,QAAnC,CAA4CC,CAA5C,CAA+C,IAA/C,CADS,CAEX,OAAO,CAACr5B,MAAOG,CAAR,CAAkBw4B,GAAAA,CAAlB,CAA8BP,KAAAA,CAA9B,CA5B0D,CA+BnEW,QAAA,GAAwB,CAAC54B,CAAD,CAAW7E,CAAX,CAAkB,CACpCy8B,CAAAA,CAAK53B,CAAAqD,MAAA,CAAe81B,EAAf,CACTvB,EAAA,CAAG,CAAH,CAAA,EAASz8B,CACT,OAAOy8B,EAAAxkB,KAAA,CAAQ+lB,EAAR,CAHiC;AAO1CR,QAAA,GAAsB,CAAC34B,CAAD,CAAWm3B,CAAX,CAAsB,CAC1C,IAAIz4B,EAAIsB,CAAAmD,MAAA,CAAei2B,EAAf,CAER,OAAA,CADIL,CACJ,CADYr6B,CACZ,EADiBA,CAAA,CAAE,CAAF,CAAA0yB,KAAA,EACjB,EADgC,EAChC,EACO2H,CAAA,CAAM,CAAN,CAAA51B,MAAA,CAAek2B,EAAf,CAAL,CAcSr5B,CAAA6B,QAAA,CAAiBu3B,EAAjB,CAA6B,QAAQ,CAAC16B,CAAD,CAAI4F,CAAJ,CAAUy0B,CAAV,CAAiB,CAC3D,MAAO5B,EAAP,CAAmB4B,CADwC,CAAtD,CAdT,CAEqBA,CAAA11B,MAAA,CAAYg2B,EAAZ,CAAAC,CAAoC,CAApCA,CAEnB,GAAqBnC,CAArB,CACS4B,CADT,CAKSQ,EAVb,CAyBSv5B,CAAA6B,QAAA,CAAiBu2B,EAAjB,CAAuBjB,CAAvB,CA5BiC,CA6C5CqC,QAAA,GAAqB,CAAC5E,CAAD,CAAO,CACtBA,CAAA,SAAJ,GAAyB6E,EAAzB,GACE7E,CAAA,SADF,CACqB,MADrB,CAD0B,CAS5B,EAAA,UAAA,EAAA,CAAA8E,QAA0B,CAAC15B,CAAD,CAAW,CACnC,MAAOA,EAAAmD,MAAA,CAAeu1B,EAAf,CAAA,CACL,IAAAhB,EAAA,CAA+B13B,CAA/B,CAAyC25B,EAAzC,CADK,CAELf,EAAA,CAA8B54B,CAAAoxB,KAAA,EAA9B,CAA+CuI,EAA/C,CAHiC,CAxSvCC,EAAA,OAAA,iBAAA,CAAA,EAAA,UAAA,CAAA,CAAA,EACM,CAAA,aAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,IAAahD,QAAA,EAAA,CACf,MAJeA,aAGA,CAAb,CADN,CAAA,CA+SA;IAAImB,GAAM,yBAAV,CACI4B,GAAqB,oBADzB,CAEI9B,GAAuB,GAF3B,CAGIQ,GAAsB,wCAH1B,CAIIgB,GAAyB,SAJ7B,CAKIjB,GAAO,OALX,CAMIqB,GAAO,OANX,CAOIf,GAAU,WAPd,CAQIP,GAAgB,IAAI0B,MAAJ,CAAW,IAAX,CAAgBnB,EAAhB,CAAuB,GAAvB,CARpB,CAYIU,GAAa,0CAZjB,CAcIN,GAAgB,gDAdpB,CAeIE,GAAY,2BAfhB,CAgBI3B,GAAmB,GAhBvB,CAiBI8B,GAAgB,GAjBpB,CAkBItC,GAAQ,OAlBZ,CAmBI0C,GAAoB,kBAnBxB,CAqBA9N,EAAe,IAAI4K,E,CC5TjBj4B,QA7BmB07B,GA6BR,CAACC,CAAD,CAAM9yB,CAAN,CAAmB+yB,CAAnB,CAAuD9D,CAAvD,CAAgF,CAEzF,IAAAa,EAAA,CAAkBgD,CAAlB,EAAyB,IAEzB,KAAA9yB,EAAA,CAAmBA,CAAnB,EAAkC,IAElC,KAAA+yB,GAAA,CAA6BA,CAA7B,EAAsD,EAEtD,KAAAC,EAAA,CAA+B,IAM/B,KAAA/D,EAAA,CAAqBA,CAArB,EAAsC,EAMtC,KAAAgE,EAAA,CAFA,IAAAC,EAEA,CAJA,IAAAC,EAIA,CAJuB,IAhBkE,CAxB3Fx5B,QAAO,EAAG,CAAC7C,CAAD,CAAO,CACf,MAAIA,EAAJ,CACSA,CAAA,YADT,CAGS,IAJM,CAYjB4R,QAAO,GAAG,CAAC5R,CAAD,CAAOs8B,CAAP,CAAkB,CAE1B,MADAt8B,EAAA,YACA,CADgBs8B,CADU,CAkC5B,EAAA,UAAA,EAAA,CAAAC,QAAc,EAAG,CACf,MAAO,KAAAvD,EADQ,CAKnB+C,GAAA9xB,UAAA,eAAA,CAAwC8xB,EAAA9xB,UAAAsyB,E,CChDhBzvB,QAAA,GAAQ,CAAC7K,CAAD,CAAW,CACzC,IAAMu6B,EAAS,IAAA3vB,QAAT2vB,EAAyB,IAAA1vB,gBAAzB0vB,EACJ,IAAAzvB,mBADIyvB,EACuB,IAAAxvB,kBADvBwvB,EAEJ,IAAAvvB,iBAFIuvB,EAEqB,IAAAtvB,sBAC3B,OAAOsvB,EAAP,EAAiBA,CAAAnyB,KAAA,CAAY,IAAZ,CAAkBpI,CAAlB,CAJwB,CAO3C,IAAMkK,GAAQtF,SAAAC,UAAA1B,MAAA,CAA0B,SAA1B,CAId,SAAMq3B,GAAN,EAAA,EAUEC,QAAA,GAAc,CAAClI,CAAD,CAAQ,CAAA,IACHmI,EAAQ,EADL,CACSC,EAAY,EADrB,CACyBC,EAAY,CHiB7CpG,GGhBZ,CAAsBjC,CAAtB,CAA6B,QAAQ,CAACqC,CAAD,CAAO,CAC1CiG,EAAA,CAAkBjG,CAAlB,CAEAA,EAAA5hB,MAAA,CAAa4nB,CAAA,EACmBtI,EAAAA,CAAAsC,CAAAkG,EAAAxI,QAwElC,KADA,IAAI5zB,CACJ,CAAQA,CAAR,CLhHSw1B,EKgHG6G,KAAA,CAAqBzI,CAArB,CAAZ,CAAA,CAA4C,CAC1C,IAAI1yB,EAAOlB,CAAA,CAAE,CAAF,CAGE,IAAb,GAAIA,CAAA,CAAE,CAAF,CAAJ,GA5E2Dg8B,CA6EzD,CAAM96B,CAAN,CADF,CACgB,CAAA,CADhB,CAJ0C,CA5EA,CAA5C,CAKGo7B,QAAwB,CAACpG,CAAD,CAAO,CAChC+F,CAAA5uB,KAAA,CAAe6oB,CAAf,CADgC,CALlC,CASArC,EAAA0I,EAAA,CAAmBN,CAEfO,EAAAA,CAAQ,EACZ,KAAK36B,IAAIA,CAAT,GAAcm6B,EAAd,CACEQ,CAAAnvB,KAAA,CAAWxL,CAAX,CAEF,OAAO26B,EAjBa;AAqBtBL,QAAA,GAAY,CAACjG,CAAD,CAAO,CACjB,GAAIkG,CAAAlG,CAAAkG,EAAJ,CAAA,CADiB,IAIbxC,EAAO,EAJM,CAIF6C,EAAa,EACRC,GAAAC,CAAuBzG,CAAvByG,CAA6BF,CAA7BE,CACpB,GACE/C,CAAA6C,EAEA,CAFkBA,CAElB,CAAAvG,CAAA,MAAA,CAAgB,IAHlB,CAKA0D,EAAAhG,QAAA,CAAmCsC,CAkCCtC,cAM7BzwB,QAAA,CLtGEwyB,EKsGF,CAA8B,EAA9B,CAAAxyB,QAAA,CL5GEmyB,EK4GF,CACmB,EADnB,CAvCPY,EAAAkG,EAAA,CAAoBxC,CAXpB,CADiB,CAiBnB8C,QAAA,GAAiB,CAACxG,CAAD,CAAOuG,CAAP,CAAmB,CAClC,IAAI7C,EAAO1D,CAAAkG,EACX,IAAIxC,CAAJ,CACE,IAAIA,CAAA6C,EAAJ,CAEE,MADAz6B,OAAA46B,OAAA,CAAcH,CAAd,CAA0B7C,CAAA6C,EAA1B,CACO,CAAA,CAAA,CAFT,CADF,IAKO,CAED7I,CAAAA,CAAUsC,CAAA,cAGd,KAFA,IAAI/0B,CAEJ,CAAQnB,CAAR,CLtFOs1B,EKsFK+G,KAAA,CAAQzI,CAAR,CAAZ,CAAA,CAA+B,CAE7BzyB,CAAA,CAAQuxB,CAAC1yB,CAAA,CAAE,CAAF,CAAD0yB,EAAS1yB,CAAA,CAAE,CAAF,CAAT0yB,MAAA,EAER,IAAc,SAAd,GAAIvxB,CAAJ,EAAqC,OAArC,GAA2BA,CAA3B,CACEs7B,CAAA,CAAWz8B,CAAA,CAAE,CAAF,CAAA0yB,KAAA,EAAX,CAAA,CAA0BvxB,CAE5B07B,EAAA,CAAM,CAAA,CAPuB,CAS/B,MAAOA,EAdF,CAP2B;AAoEpCC,QAAA,GAAgB,CAAhBA,CAAgB,CAACC,CAAD,CAAWf,CAAX,CAAkB,CAG5Be,CAAJ,GAEIA,CAFJ,CAC8B,CAA5B,EAAIA,CAAAj4B,QAAA,CAAiB,GAAjB,CAAJ,CACak4B,EAAA,CAAAA,CAAA,CAAwBD,CAAxB,CAAkCf,CAAlC,CADb,CHqDUjF,EG9BG,CAAqCgG,CAArC,CAlBF7gB,QAAQ,CAACgb,CAAD,CAAS/1B,CAAT,CAAgBk2B,CAAhB,CAA0BF,CAA1B,CAAkC,CACjD,GAAI,CAACh2B,CAAL,CACE,MAAO+1B,EAAP,CAAgBC,CAIlB,EAFI8F,CAEJ,CAFoBH,EAAA,CALX/D,CAKW,CAAsBiD,CAAA,CAAM76B,CAAN,CAAtB,CAAoC66B,CAApC,CAEpB,GAAwC,SAAxC,GAAsBiB,CAAtB,CAI6B,oBAJ7B,GAIWA,CAJX,GAQEA,CARF,CAQkB,SARlB,EAEEA,CAFF,CAEkBH,EAAA,CATT/D,CASS,CAAsBiD,CAAA,CAAM3E,CAAN,CAAtB,EAAyCA,CAAzC,CAAmD2E,CAAnD,CAFlB,EAGE3E,CAOF,OAAOH,EAAP,EAAiB+F,CAAjB,EAAkC,EAAlC,EAAwC9F,CAhBS,CAkBxC,CAxBf,CA2BA,OAAO4F,EAAP,EAAmBA,CAAArK,KAAA,EAAnB,EAAsC,EA9BN;AAkClCsK,QAAA,GAAkB,CAAlBA,CAAkB,CAACD,CAAD,CAAWf,CAAX,CAAkB,CAC9B7M,CAAAA,CAAQ4N,CAAAp4B,MAAA,CAAe,GAAf,CACZ,KAFkC,IAEzB9C,EAAE,CAFuB,CAEpBoK,CAFoB,CAEjBjM,CAAjB,CAAoB6B,CAApB,CAAsBstB,CAAA9wB,OAAtB,CAAoCwD,CAAA,EAApC,CACE,GAAKoK,CAAL,CAASkjB,CAAA,CAAMttB,CAAN,CAAT,CAAoB,CLlLb0zB,EKmLLpI,UAAA,CAA2B,CAE3B,IADAntB,CACA,CLrLKu1B,EKoLD8G,KAAA,CAAoBpwB,CAApB,CACJ,CACEA,CAAA,CAAI6wB,EAAA,CAAAA,CAAA,CAAsBd,CAAA,CAAMh8B,CAAA,CAAE,CAAF,CAAN,CAAtB,CAAmCg8B,CAAnC,CADN,KAIE,IADIkB,CACA,CADQjxB,CAAAnH,QAAA,CAAU,GAAV,CACR,CAAW,EAAX,GAAAo4B,CAAJ,CAAkB,CAChB,IAAIC,EAAKlxB,CAAAwmB,UAAA,CAAYyK,CAAZ,CACTC,EAAA,CAAKA,CAAAzK,KAAA,EACLyK,EAAA,CAAKL,EAAA,CAAAA,CAAA,CAAsBK,CAAtB,CAA0BnB,CAA1B,CAAL,EAAyCmB,CACzClxB,EAAA,CAAIA,CAAAwmB,UAAA,CAAY,CAAZ,CAAeyK,CAAf,CAAJ,CAA4BC,CAJZ,CAOpBhO,CAAA,CAAMttB,CAAN,CAAA,CAAYoK,CAAD,EAAMA,CAAA6mB,YAAA,CAAc,GAAd,CAAN,GAA6B7mB,CAAA5N,OAA7B,CAAwC,CAAxC,CAET4N,CAAAsH,MAAA,CAAQ,CAAR,CAAY,EAAZ,CAFS,CAGTtH,CAHS,EAGJ,EAjBW,CAoBtB,MAAOkjB,EAAAza,KAAA,CAAW,GAAX,CAvB2B;AAoFpC0oB,QAAA,GAAsB,CAACvJ,CAAD,CAAQt2B,CAAR,CAAiB,CAAA,IACjCy+B,EAAQ,EADyB,CAGjClY,EAAI,EHjNIgS,GGmNZ,CAAsBjC,CAAtB,CAA6B,QAAQ,CAACqC,CAAD,CAAO,CAGrCA,CAAAkG,EAAL,EACED,EAAA,CAAkBjG,CAAlB,CAKF,KAAImH,EAAkBnH,CAAA2C,EAAlBwE,EAA8CnH,CAAA,eAC9C34B,EAAJ,EAAe24B,CAAAkG,EAAAK,EAAf,EAA+CY,CAA/C,EACMlxB,EAAAzC,KAAA,CAAqBnM,CAArB,CAA8B8/B,CAA9B,CADN,GAEIX,EAAA,CAAuBxG,CAAvB,CAA6B8F,CAA7B,CAiUR,CA/TqB1nB,CA+TrB,CA/TqB4hB,CAAA5hB,MA+TrB,CAFIwP,CAEJ,CAFQwZ,QAAA,CAASn2B,CAAT,CAAa,EAAb,CAAiB,EAAjB,CAER,CA/TiC2c,CA+TjC,CAAKA,CAAL,CAAA,EA/TiCA,CA+TtB,CAAKA,CAAL,CAAX,EAAsB,CAAtB,EADQ,CACR,EADc3c,CACd,CADkB,EAlUd,CAV0C,CAA5C,CAiBG,IAjBH,CAiBS,CAAA,CAjBT,CAkBA,OAAO,CAACs1B,EAAYT,CAAb,CAAoBuB,IAAKzZ,CAAzB,CAvB8B;AAgCvC0Z,QAAA,GAAkB,CAAC/gC,CAAD,CAAQy5B,CAAR,CAAcuH,CAAd,CAAwBz/B,CAAxB,CAAkC,CAC7Ck4B,CAAAkG,EAAL,EACED,EAAA,CAAkBjG,CAAlB,CAEF,IAAKA,CAAAkG,EAAAK,EAAL,CAAA,CAGI,IAAA,EH1DQlF,CG0Dc,CAAuB96B,CAAvB,CAArB,EAAA,CAAA,CAAA,GAAI,EAAA,CAAA,CAAA,EACLg8B,EAAAA,CAAYhB,CAAA,CACdiB,EAAA,CAAgCjB,CAAhC,CAAoCD,CAApC,CADc,CAEd,MACF,KAAIkG,EAAiBxH,CAAA,eAArB,CACIyH,EAA6B,WAA7BA,GAAUD,CAAVC,EAA+D,MAA/DA,GAA4CD,CADhD,CAEIE,EAA6C,CAA7CA,GAASF,CAAA54B,QAAA,CAAuB,OAAvB,CAAT84B,EAAkD,CAACD,CAItC,QAAjB,GAAIF,CAAJ,GAEEE,CAEA,CAFSD,CAET,GAF6BjF,CAE7B,CAFyC,OAEzC,CAFmDA,CAEnD,EAFqG,EAErG,GAFiEiF,CAAA54B,QAAA,CAAuB,MAAvB,CAEjE,CAAA84B,CAAA,CAAS,CAACD,CAAV,EAA0D,CAA1D,GAAoBD,CAAA54B,QAAA,CAAuB2zB,CAAvB,CAJtB,CAMiB,SAAjB,GAAIgF,CAAJ,GACEE,CACA,CAD4B,WAC5B,GADSD,CACT,EAD8D,MAC9D,GAD2CA,CAC3C,CAAAE,CAAA,CAASA,CAAT,EAAmB,CAACD,CAFtB,CAIA,IAAKA,CAAL,EAAgBC,CAAhB,CAGIP,CAeJ,CAfsB5E,CAetB,CAdImF,CAcJ,GAZO1H,CAAA2C,EAUL,GARE3C,CAAA2C,EAQF,CAPEC,EAAA,CFwBO/L,CExBP,CACEmJ,CADF,CFwBOnJ,CEtBLiM,EAFF,CAGqCvB,CFjMzC,CACSkB,EADT,CEiMyClB,CFjMzC,CAGS,EE2LL,CAIEgB,CAJF,CAOF,EAAA4E,CAAA,CAAkBnH,CAAA2C,EAAlB,EAA8CJ,CAEhD,EAAAz6B,CAAA,CAAS,CACPsD,GAAU+7B,CADH,CAEPO,GAAQA,CAFD,CAGPD,GAAQA,CAHD,CAAT,CAzCA,CAJkD;AAwDpDE,QAAA,GAA6B,CAACphC,CAAD,CAAQo3B,CAAR,CAAe,CAAA,IACtCiK,EAAY,EAD0B,CACtBC,EAAY,EADU,CAGtCN,EAAW5J,CAAX4J,EAAoB5J,CAAA,WHzSZiC,GG0SZ,CAAsBjC,CAAtB,CAA6B,QAAQ,CAACqC,CAAD,CAAO,CAE1CsH,EAAA,CAAwB/gC,CAAxB,CAA+By5B,CAA/B,CAAqCuH,CAArC,CAA+C,QAAQ,CAAC7D,CAAD,CAAO,CAExDztB,EAAAzC,KAAA,CADUjN,CAAAuhC,EACV,EAD4BvhC,CAC5B,CAA8Bm9B,CAAAt4B,GAA9B,CAAJ,GACMs4B,CAAAgE,GAAJ,CACElB,EAAA,CAAuBxG,CAAvB,CAA6B4H,CAA7B,CADF,CAGEpB,EAAA,CAAuBxG,CAAvB,CAA6B6H,CAA7B,CAJJ,CAF4D,CAA9D,CAF0C,CAA5C,CAYG,IAZH,CAYS,CAAA,CAZT,CAaA,OAAO,CAACA,GAAWA,CAAZ,CAAuBD,GAAWA,CAAlC,CAjBmC;AAyB5CG,QAAA,GAAe,CAAfA,CAAe,CAAC1gC,CAAD,CAAUk/B,CAAV,CAAsBhB,CAAtB,CAAqC,CAE9C,IAAA,EHtIQlE,CGsIc,CAAuBh6B,CAAvB,CAAtB,CACA2gC,EAAexF,EAAA,CADd,CAAAjB,GACc,CADV,CAAAD,EACU,CADf,CAMA2G,EAAS,IAAIhD,MAAJ,CLtXUiD,eKsXV,EAHQ7gC,CAAAm6B,QAAA2G,CACnB,IADmBA,CACZH,CAAA3qB,MAAA,CAAmB,CAAnB,CAAuB,EAAvB,CADY8qB,CACgB,KADhBA,CAEnBH,CACW,ELrXUI,iBKqXV,CAETzK,EAAAA,CAAQ0K,CAAA,CAAchhC,CAAd,CAAA86B,EACZ,KAAImG,EACFC,EAAA,CAAyC5K,CAAzC,CAAgD4H,CAAhD,CACF,OAAOrD,GAAA,CAA+B76B,CAA/B,CAAwCs2B,CAAxC,CAA+C,QAAQ,CAACqC,CAAD,CAAO,CAvLrE,IAAIwI,EAAS,EAwLUxI,EAtLlBkG,EAAL,EACED,EAAA,CAqLqBjG,CArLrB,CAqLqBA,EAnLnBkG,EAAAxI,QAAJ,GACE8K,CADF,CACW1B,EAAA,CAqKAjE,CArKA,CAkLY7C,CAlLYkG,EAAAxI,QAAxB,CAkLkB6I,CAlLlB,CADX,CAmLuBvG,EAhLvB,QAAA,CAAkBwI,CAiLhB,IAAI,CNlYG5J,CMkYP,EACI,CH1VMmB,EG0VL,CAA8BC,CAA9B,CADL,EAEIA,CAAA,QAFJ,CAEqB,CA3KvB,IAAIwI,EADAC,CACAD,CA8K6BxI,CA/KrB,QAEc,KAA1B,EA6KiCA,CA7K7B0I,GAAJ,GA6KiC1I,CA3K/B0I,GAFF,CLzNSnJ,EK2NcxvB,KAAA,CAAwB04B,CAAxB,CAFvB,CAKA,IAwKiCzI,CAxK7B0I,GAAJ,CAIE,GAAqC,IAArC,EAoK+B1I,CApK3B2I,EAAJ,CAA2C,CAoKZ3I,CAnK7B2I,EAAA,CAAgC,EAChC,KAAKC,IAAIA,CAAT,GAkKmCN,EAlKnC,CACEO,CAIA,CA6JiCP,CAjKrB,CAAmBM,CAAnB,CAIZ,CAHAJ,CAGA,CAHSK,CAAA,CAAUJ,CAAV,CAGT,CAAIA,CAAJ,GAAcD,CAAd,GACEC,CACA,CADQD,CACR,CA2JyBxI,CA3JzB2I,EAAAxxB,KAAA,CAAmCyxB,CAAnC,CAFF,CAPuC,CAA3C,IAYO,CAGL,IAASj9B,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAqJ6Bq0B,CArJT2I,EAAAxgC,OAApB,CAA0D,EAAEwD,CAA5D,CACEk9B,CACA,CAmJiCP,CApJrB,CAoJetI,CApJI2I,EAAA,CAA8Bh9B,CAA9B,CAAnB,CACZ,CAAA88B,CAAA,CAAQI,CAAA,CAAUJ,CAAV,CAEVD,EAAA,CAASC,CAPJ,CAwJwBzI,CA9IjC,QAAA,CAAkBwI,CA+IMxI,EA4ExB2C,EAAA,CA5EwB3C,CA4EG2C,EAA3B,EA5EwB3C,CA4E+B,SAEnDz5B,EAAAA,CAAQ,GAARA,CA9EgDg/B,CA+EhDtM;CAAAA,CA/EoB+G,CA6ET2C,EAEHl0B,MAAA,CAAe,GAAf,CACH9C,EAAAA,CAAE,CAAX,KALkD,IAKpCmG,EAAEmnB,CAAA9wB,OALkC,CAKpB4N,CAA9B,CAAkCpK,CAAlC,CAAoCmG,CAApC,GAA2CiE,CAA3C,CAA6CkjB,CAAA,CAAMttB,CAAN,CAA7C,EAAwDA,CAAA,EAAxD,CACEstB,CAAA,CAAMttB,CAAN,CAAA,CAAWoK,CAAAxH,MAAA,CAjFiB05B,CAiFjB,CAAA,CACTlyB,CAAA9I,QAAA,CAlFkC+6B,CAkFlC,CAAwBzhC,CAAxB,CADS,CAETA,CAFS,CAED,GAFC,CAEKwP,CAnFMiqB,EAqFxB,SAAA,CAAmB/G,CAAAza,KAAA,CAAW,GAAX,CAzFI,CAJ8C,CAA9D,CAb2C,CAgCpD+pB,QAAA,GAA0B,CAAU5K,CAAV,CAAiB4H,CAAjB,CAAgC,CACpDuD,CAAAA,CAAiBnL,CAAA0I,EACrB,KAAIiC,EAAqB,EACzB,IAAI,CNtZK1J,CMsZT,EAAqBkK,CAArB,CAIE,IAJmC,IAI1Bn9B,EAAI,CAJsB,CAInB+yB,EAAgBoK,CAAA,CAAen9B,CAAf,CAAhC,CACKA,CADL,CACSm9B,CAAA3gC,OADT,CAEKu2B,CAFL,CAEqBoK,CAAA,CAAe,EAAEn9B,CAAjB,CAFrB,CAE0C,CACnB+yB,IAAAA,EAAAA,CAAAA,CAAe6G,EAAAA,CAiCxCvF,EAAA+I,EAAA,CAAuB,IAAI9D,MAAJ,CAAW,KAAX,CAAiBjF,CAAA,cAAjB,CAAsC,WAAtC,CAAmD,GAAnD,CACvBA,EAAAgJ,EAAA,CAAgChJ,CAAA,cAAhC,CAAwD,GAAxD,CAA8DiJ,CAC9DjJ,EAAA2C,EAAA,CAA2B3C,CAAA2C,EAA3B,EAAuD3C,CAAA,SACvDA,EAAA,SAAA,CAAmBA,CAAA2C,EAAA11B,QAAA,CACf+yB,CAAA,cADe,CACQA,CAAAgJ,EADR,CAnCfV,EAAA,CAAmB5J,CAAA,cAAnB,CAAA,CACIwK,EAAA,CAA+BxK,CAA/B,CAHoC,CAM5C,MAAO4J,EAfiD,CAwB1DY,QAAA,GAAyB,CAACxK,CAAD,CAAgB,CACvC,MAAO,SAAQ,CAAChB,CAAD,CAAU,CACvB,MAAOA,EAAAzwB,QAAA,CACHyxB,CAAAqK,EADG,CAEHrK,CAAAsK,EAFG,CADgB,CADc;AA4IzCG,QAAA,GAAgB,CAACrJ,CAAD,CAAQyG,CAAR,CAAoB,CAApC4C,IAAAA,EAgCatS,EAhCbsS,CACMxL,EH7hBQkC,EG6hBA,CAAwDC,CAAxD,CAEZA,EAAA50B,YAAA,CHhjBYy0B,EGgjBQ,CAAoBhC,CAApB,CAA2B,QAAQ,CAAiBqC,CAAjB,CAAuB,CAC5E,IAAIqC,EAAMrC,CAAA,QAANqC,CAAwBrC,CAAA,cACxBA,EAAAkG,EAAJ,EAAyBlG,CAAAkG,EAAAxI,QAAzB,GASE2E,CAEA,CAFuDA,CPlXtDp1B,QAAA,CACI2wB,EADJ,CACmB,EADnB,CAAA3wB,QAAA,CAEI4wB,EAFJ,CAEkB,EAFlB,COoXD,CAAAmC,CAAA,QAAA,CAAkB8G,EAAA,CAdXjE,CAcW,CAAwBR,CAAxB,CAA6BkE,CAA7B,CAXpB,CAF4E,CAA1D,CAHc,CA/hBtCvB,CAAA,OAAA,iBAAA,CAAA,EAAA,UAAA,CAAA,CAAA,EACM,CAAA,aAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,IAAcoE,QAAA,EAAA,CAChB,MAJgBA,SAGA,CAAd,CADN,CAAA,CA+jBA,KAAAvS,GAAe,IAAI+O,E,CCnlBnB,IAAIyD,GAAiB,EAArB,CAKMC,GAAK3iC,MAAA,eACX,IAAI2iC,EAAJ,EAAU,CPVG1K,COUb,CAAyB,CAIvB,IAAM2K,GAAaD,EAAA,OAUnBA,GAAA,OAAA,CAJsBE,QAAA,CAACx+B,CAAD,CAAOy+B,CAAP,CAAchkB,CAAd,CAA0B,CJyGhD,IAAIikB,EAAc5iC,QAAA6iC,cAAA,CAAuB,wBAAvB,CIxG6B3+B,CJwG7B,CACN,GADM,CAAlB,CAIIzE,EAAQO,QAAAmD,KACZ1D,EAAA+L,aAAA,CAAmBo3B,CAAnB,EAHYhJ,CAAAkJ,CACVlJ,CAAA,YADUkJ,CACyB,IAErC,GAAyCrjC,CAAAyC,WAAzC,CACA03B,EAAA,CAAoBgJ,CI9GlBL,GAAA,CAAer+B,CAAf,CAAA,CJ+GK0+B,CI9GLH,GAAA/1B,KAAA,CAAsD81B,EAAtD,CAA2Dt+B,CAA3D,CAAiEy+B,CAAjE,CAAwEhkB,CAAxE,CAF8C,CAVzB,C,CCVvBjc,QADmBqgC,GACR,EAAgB,CAEzB,IAAAC,MAAA,CAAa,EAFY,CAgB3B,EAAA,UAAA,MAAA,CAAAC,QAAK,CAACC,CAAD,CAAUzD,CAAV,CAAsB0D,CAAtB,CAAoC1E,CAApC,CAAmD,CACtD,IAAI/5B,EAAO,IAAAs+B,MAAA,CAAWE,CAAX,CAAPx+B,EAA8B,EAClCA,EAAA2L,KAAA,CAAU,CAACovB,EAAAA,CAAD,CAAa0D,aAAAA,CAAb,CAA2B1E,EAAAA,CAA3B,CAAV,CAlBoB2E,IAmBpB,CAAI1+B,CAAArD,OAAJ,EACEqD,CAAAwL,MAAA,EAEF,KAAA8yB,MAAA,CAAWE,CAAX,CAAA,CAAsBx+B,CANgC,CASxD,GAAA,UAAA,MAAA,CAAA2+B,QAAK,CAACH,CAAD,CAAUzD,CAAV,CAAsB6D,CAAtB,CAAwC,CAE3C,GADI5+B,CACJ,CADW,IAAAs+B,MAAA,CAAWE,CAAX,CACX,CAIA,IAAK,IAAIpiB,EAAMpc,CAAArD,OAANyf,CAAoB,CAA7B,CAAuC,CAAvC,EAAgCA,CAAhC,CAA0CA,CAAA,EAA1C,CAAiD,CAC/C,IAAIyiB,EAAQ7+B,CAAA,CAAKoc,CAAL,CAAZ,CACI,CA3B4C,EAAA,CAAA,CAClD,IAASA,CAAT,CAAe,CAAf,CAAkBA,CAAlB,CA0BwCwiB,CA1BhBjiC,OAAxB,CAAiDyf,CAAA,EAAjD,CAAwD,CACtD,IAAI0iB,EAyBkCF,CAzB7B,CAAiBxiB,CAAjB,CACT,IAwBmByiB,CAxBf9D,EAAA,CAAsB+D,CAAtB,CAAJ,GAwB0B/D,CAxBQ,CAAW+D,CAAX,CAAlC,CAAkD,CAChD,CAAA,CAAO,CAAA,CAAP,OAAA,CADgD,CAFI,CAMxD,CAAA,CAAO,CAAA,CAP2C,CA2BhD,GAAI,CAAJ,CACE,MAAOD,EAHsC,CANN,C,CCrB5B3yB,QAAA,GAAQ,EAAG;AAgC9B6yB,QAASA,GAAO,CAACC,CAAD,CAAO,CACrB,IAAK,IAAItoB,EAAE,CAAX,CAAcA,CAAd,CAAkBsoB,CAAAriC,OAAlB,CAA+B+Z,CAAA,EAA/B,CAAoC,CAClC,IAAIuoB,EAAMD,CAAA,CAAKtoB,CAAL,CACV,IAAIuoB,CAAAx3B,OAAJ,GAAmBnM,QAAAic,gBAAnB,EACE0nB,CAAAx3B,OADF,GACiBnM,QAAAmD,KADjB,CAIA,IAAK,IAAI0B,EAAE,CAAX,CAAcA,CAAd,CAAkB8+B,CAAA53B,WAAA1K,OAAlB,CAAyCwD,CAAA,EAAzC,CAA8C,CAC5C,IAAIsF,EAAIw5B,CAAA53B,WAAA,CAAelH,CAAf,CACR,IAAIsF,CAAA7H,SAAJ,GAAmBC,IAAAC,aAAnB,CAAA,CAIA,IAAIwK,EAAO7C,CAAAiE,YAAA,EACwBjE,KAAAA,EAAAA,CAvCvC,KAAIy5B,EAAU,EACVrjC,EAAAy6B,UAAJ,CACE4I,CADF,CACYtxB,KAAAC,KAAA,CAAWhS,CAAAy6B,UAAX,CADZ,CAEWz6B,CAFX,WAE8BV,OAAA,WAF9B,EAEsDU,CAAAsjC,aAAA,CAAqB,OAArB,CAFtD,GAGED,CAHF,CAGYrjC,CAAAsF,aAAA,CAAqB,OAArB,CAAA8B,MAAA,CAAoC,KAApC,CAHZ,CAKA,EAAA,CAAOi8B,CASH9iB,EAAAA,CAAM8iB,CAAA97B,QAAA,CLoUGioB,CKpUamL,EAAhB,CA0BN,KAzBJ,CAyBI,CAzBO,EAAX,CAAIpa,CAAJ,CACS8iB,CAAA,CAAQ9iB,CAAR,CAAc,CAAd,CADT,CAGO,EAsBH,GAAoB9T,CAApB,GAA6B7C,CAAA1J,cAA7B,CACEm6B,EAAA,CAAqBzwB,CAArB,CAAwB25B,CAAxB,CAAsC,CAAA,CAAtC,CADF,KAEO,IAAI92B,CAAA1K,SAAJ,GAAsBC,IAAAuI,uBAAtB;CAEDlC,CAFC,CAEgCoE,CAADpE,KAF/B,EAQL,GADAm7B,CACI,CNiLIxJ,CMlLG,CAAa3xB,CAAb,CAAA6xB,GACP,CAAAqJ,CAAA,GAAiBC,CAArB,CAIE,IAFIC,CAEKjhB,CAFMljB,MAAA,SAAA,cAAA,iBAAA6M,KAAA,CACbvC,CADa,CACV,QADU,CL8RV4lB,CK7RSmL,EADC,CAC0B,GAD1B,CAENnY,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CAAoBihB,CAAA3iC,OAApB,CAAqC0hB,CAAA,EAArC,CACExiB,EAAA,CAAyByjC,CAAA,CAASjhB,CAAT,CAAzB,CAAsC+gB,CAAtC,CALJ,KASIA,EAGJ,EAFElJ,EAAA,CAAqBzwB,CAArB,CAAwB25B,CAAxB,CAAsC,CAAA,CAAtC,CAEF,CAAAlJ,EAAA,CAAqBzwB,CAArB,CAAwB45B,CAAxB,CA7BF,CAF4C,CANZ,CADf;AA4CvB,GAAI,CThFSjM,CSgFb,CAAmB,CACjB,IAAIvqB,GAAW,IAAIxK,gBAAJ,CAAqB0gC,EAArB,CAAf,CACIlb,GAAQA,QAAA,CAAClmB,CAAD,CAAU,CACpBkL,EAAArK,QAAA,CAAiBb,CAAjB,CAAuB,CAACe,UAAW,CAAA,CAAZ,CAAkBC,QAAS,CAAA,CAA3B,CAAvB,CADoB,CAStB,IAN4BxD,MAAA,eAM5B,EALE,CAACA,MAAA,eAAA,0BAKH,CACE0oB,EAAA,CAAMvoB,QAAN,CADF,KAEO,CACL,IAAIikC,GAAeA,QAAA,EAAM,CACvB1b,EAAA,CAAMvoB,QAAA4B,KAAN,CADuB,CAIrB/B,OAAA,YAAJ,CACEA,MAAA,YAAA,UAAA,CAAmCokC,EAAnC,CADF,CAKEC,qBAAA,CAAsB,QAAQ,EAAG,CAC/B,GAA4B,SAA5B,GAAIlkC,QAAA2B,WAAJ,CAAuC,CACrC,IAAI2nB,EAAWA,QAAQ,EAAG,CACxB2a,EAAA,EACAjkC,SAAA6B,oBAAA,CAA6B,kBAA7B,CAAiDynB,CAAjD,CAFwB,CAI1BtpB,SAAA8B,iBAAA,CAA0B,kBAA1B,CAA8CwnB,CAA9C,CALqC,CAAvC,IAOE2a,GAAA,EAR6B,CAAjC,CAVG,CAwBPrzB,EAAA,CAAQA,QAAQ,EAAG,CACjB6yB,EAAA,CAAQl2B,EAAA6D,YAAA,EAAR,CADiB,CArCF;AA5ERR,IAAAuzB,GAAAvzB,E,CCDX,IAAMwzB,GAAc,E,CCkBpB,IAAMC,GAAU3Y,OAAAC,QAAA,EAKT2Y,SAASA,GAAU,CAACC,CAAD,CAAa,CAErC,GADI9gC,CACJ,CDxBa2gC,ECuBE,CAAYG,CAAZ,CACf,CACqB9gC,CAerB,yBAIA,CAnBqBA,CAeO,yBAI5B,EAJyD,CAIzD,CAnBqBA,CAiBrB,4BAEA,CAnBqBA,CAiBU,4BAE/B,EAF+D,CAE/D,CAnBqBA,CAmBrB,sBAAA,EAnBqBA,CAmBK,sBAA1B,EAAoD,CAApD,EAAyD,CAtBpB,CAyChC+gC,QAASA,GAAe,CAAC/gC,CAAD,CAAW,CACxC,MAAOA,EAAA,yBAAP,GAAqCA,CAAA,sBADG,CA4CnCghC,QAASA,GAAuB,CAAChhC,CAAD,CAAW,CAEhDA,CAAA,4BAAA,CAA+BA,CAAA,sBAE1BA,EAAAihC,EAAL,GACEjhC,CAAAihC,EACA,CADuB,CAAA,CACvB,CAAAL,EAAAM,KAAA,CAAa,QAAQ,EAAG,CAEtBlhC,CAAA,yBAAA,CAA4BA,CAAA,sBAC5BA,EAAAihC,EAAA,CAAuB,CAAA,CAHD,CAAxB,CAFF,CAJgD,C,CC9GlD,IAAIE,GAAe,IAAnB,CAGI7iC,GAAYlC,MAAA,YAAZkC,EAAqClC,MAAA,YAAA,UAArCkC,EAA2E,IAH/E,CAMI8iC,EAKWC,SAASA,GAAY,CAAC9jC,CAAD,CAAW,CAC7CkjC,qBAAA,CAAsB,QAAQ,EAAG,CAC3BniC,EAAJ,CACEA,EAAA,CAAUf,CAAV,CADF,EAGO4jC,EAYL,GAXEA,EACA,CADe,IAAIlZ,OAAJ,CAAY,QAAA,CAACC,CAAD,CAAa,CAACkZ,EAAA,CAAYlZ,CAAb,CAAzB,CACf,CAA4B,UAA5B,GAAI3rB,QAAA2B,WAAJ,CACEkjC,EAAA,EADF,CAGE7kC,QAAA8B,iBAAA,CAA0B,kBAA1B,CAA8C,QAAA,EAAM,CACtB,UAA5B,GAAI9B,QAAA2B,WAAJ,EACEkjC,EAAA,EAFgD,CAApD,CAOJ,EAAAD,EAAAD,KAAA,CAAkB,QAAQ,EAAE,CAAE3jC,CAAA,EAAYA,CAAA,EAAd,CAA5B,CAfF,CAD+B,CAAjC,CAD6C,C,CCM/C,IAAM+jC,GAAa,ILnBJhC,EKsBbrgC,SADmBsiC,EACR,EAAG,CAAA,IAAA,EAAA,IACZ,KAAAC,EAAA,CAAqB,EACrB,KAAAC,EAAA,CAAsBllC,QAAAic,gBACtB,KAAIoiB,EAAM,IdWNrJ,EcVJqJ,EAAA,MAAA,CAAe,EACf,KAAA8G,EAAA,CAA+BC,EAAA,CAAc,IAAAF,EAAd,CAAmC,IRrBvD9G,EQqBuD,CAAcC,CAAd,CAAnC,CAC/B,KAAAgH,EAAA,CAA4B,CAAA,CAG5B,KAAAC,EAAA,CAFA,IAAAC,EAEA,CAFkB,IDhBPT,GCmBX,CAAa,QAAA,EAAM,CACjBU,EAAA,CAAAA,CAAA,CADiB,CAAnB,CAVY,CAcd,CAAA,CArCF,CAAAC,UAqCEpZ,EAAAqZ,GAAA,CAAA90B,QAAK,EAAG,CACNuzB,EAAA,EADM,CAOR9X,EAAAsZ,GAAA,CAAAA,QAAW,CAAC3M,CAAD,CAAQ,CACjB,MVhBYD,GUgBL,CAAwBC,CAAxB,CADU,CAGnB3M,EAAAuZ,GAAA,CAAAA,QAAgB,CAACvH,CAAD,CAAM,CACpB,MVpCYxF,GUoCL,CAAoBwF,CAApB,CADa,CAoBtBhS;CAAAwZ,gBAAA,CAAAA,QAAe,CAACpiC,CAAD,CAAW8gC,CAAX,CAAwB/J,CAAxB,CAAuC,CACpD,GAAIsL,CAAAriC,CAAAqiC,EAAJ,CAAA,CAGAriC,CAAAqiC,EAAA,CAAqB,CAAA,CACrBriC,EAAAS,KAAA,CAAgBqgC,CAChB9gC,EAAAi3B,QAAA,CAAmBF,CHnER4J,GGoEX,CAAYG,CAAZ,CAAA,CAA2B9gC,CAnB3B,KAAA,EAAA,CADIu1B,CACJ,CAoBiCv1B,CArBrBC,QAAAoG,cAAA,CAA+B,OAA/B,CACZ,EAGOkvB,CAAAnzB,aAAA,CAAmB,WAAnB,CAHP,EAG0C,EAH1C,CACS,EVoNLkgC,KAAAA,EAAiB,EAEvB,KADA,IAAMC,EUjM6BviC,CAzBAC,QV0NwBc,iBAAA,CAAyB,OAAzB,CAA3D,CACSK,EAAI,CAAb,CAAgBA,CAAhB,CAAoBmhC,CAAA3kC,OAApB,CAAmCwD,CAAA,EAAnC,CAAwC,CACtC,IAAMm0B,EAAQgN,CAAA,CAAOnhC,CAAP,CACd,IAAoBm0B,CDpPf6K,aAAA,CAvBuBoC,gBAuBvB,CCoPL,CACE,IAAI,CH/QGnO,CG+QP,CAAmB,CDnQvB,IAAM9xB,ECoQqBgzB,CDpQd50B,YACRw0B,GAAA1Q,IAAA,CAAiBliB,CAAjB,CAAL,GACE4yB,EAAApnB,IAAA,CAAiBxL,CAAjB,CAEA,CADMkgC,CACN,CCgQyBlN,CDjQRrmB,UAAA,CAAgB,CAAA,CAAhB,CACjB,CAAA3S,QAAAmD,KAAA+D,YAAA,CAA0Bg/B,CAA1B,CAHF,CCoQMlN,EAAAr4B,WAAA+R,YAAA,CAA6BsmB,CAA7B,CAFiB,CAAnB,CADF,IAME+M,EAAA11B,KAAA,CAAoB2oB,CAAA50B,YAApB,CACA,CAAA40B,CAAAr4B,WAAA+R,YAAA,CAA6BsmB,CAA7B,CAToC,CAYxC,CAAA,CAAO+M,CAAAruB,KAAA,CAAoB,EAApB,CAAAge,KAAA,EU7MDkH,EAAAA,CAAO,CACTnC,GAAI8J,CADK,CAET7J,QAASF,CAFA,CAGT2L,GAAY1F,CAHH,Cb3EF3I;CagFT,EACE8C,EAAA,CAAqBn3B,CAAAC,QAArB,CAAuC6gC,CAAvC,CAGFiB,GAAA,CAAAA,IAAA,CC3CItd,EAAAA,Cb1CKqQ,Ea0CCtvB,KAAA,CD4CkB2tB,CC5ClB,CAAN1O,Eb3CKoQ,Ea2C8BrvB,KAAA,CD4CX2tB,CC5CW,Cb1C9B2B,Ga4CXpI,UAAA,CAAwB,Cb7CbmI,Ga8CXnI,UAAA,CAAuB,CD0CjBkO,EAAAA,Cd5CQpJ,Ec4CF,CAAM2B,CAAN,CCzCL1O,ED2CL,EbtDSmQ,CasDT,EAAuC,IAAAkN,EAAvC,EACE,IAAAA,EAAA,eAAA,CAAkClH,CAAlC,CAAuCkG,CAAvC,CAEF9gC,EAAA,UAAA,CAAwB46B,CACxB56B,EAAA2iC,EAAA,CAAqB3F,CAEjB6C,EAAAA,CAAmB,Eb5DdjL,Ea6DT,GACEiL,CADF,CACqBvE,EAAA,CAA+Bt7B,CAAA,UAA/B,CADrB,CAGA,IAAI,CAAC6/B,CAAAjiC,OAAL,EbhESg3B,CagET,CACarrB,CAGX,CbtGO8qB,CamGI9qB,CAAevJ,CAAAC,QAAfsJ,CAAkCA,IAG7C,CAFkBzB,CAElB,CN3ESg3B,EMyESh3B,CAAeg5B,CAAfh5B,CAElB,CAKEqrB,CALF,CAKYwE,EAAA,CAN0BwB,CAM1B,CANgCn5B,CAAAozB,UAMhC,CALZ,CAOA,CAPA,CAMED,CAAAv1B,OAAJ,CVfYm4B,EUgBH,CAAmB5C,CAAnB,CAR+BgG,CAQHnC,GAA5B,CAAqC4L,CAArC,CAAiD96B,CAAjD,CADT,CAFyD,IAAA,EAJvD,CAAA9H,CAAA6iC,GAAA,CAAkBtN,CAEpBv1B,EAAA8iC,GAAA,CAA6BjD,CAtC7B,CADoD,CA8EtDkD;QAAA,GAA2B,CAA3BA,CAA2B,CAAG,CACxBlB,CAAA,CAAAA,EAAJ,EAEWzlC,MAAAs4B,SAFX,EAE8Bt4B,MAAAs4B,SAAAsO,qBAF9B,GAGE,CAAAnB,EAGA,CAH2EzlC,MAAAs4B,SAAAsO,qBAG3E,CADA,CAAAnB,EAAA,kBACA,CADkD,QAAA,CAACtM,CAAD,CAAW,CANnC,CAMoC0N,GAAA,CAAqC1N,CAArC,CAAD,CAC7D,CAAA,CAAAsM,EAAA,iBAAA,CAAiD,QAAA,EAAM,CACrDpB,qBAAA,CAAsB,QAAA,EAAM,CAC1B,CATsB,CASlBoB,EAAA,SAAJ,EATsB,CASwBD,EAA9C,GATsB,CAUpBsB,EAAA,EAFwB,CAA5B,CADqD,CANzD,CAD4B,CAgB9BnB,QAAA,GAAO,CAAPA,CAAO,CAAG,CAvBJD,CAwBJqB,CAxBIrB,EAAJ,EAEW1lC,MAAAs4B,SAFX,EAE8Bt4B,MAAAs4B,SAAA0O,UAF9B,GAwBAD,CArBErB,EACA,CADkB1lC,MAAAs4B,SAAA0O,UAClB,CAoBFD,CApBErB,EAAA,gBAAA,CFlHUjB,EE8GZ,CAyBAkC,GAAA,CAAAA,CAAA,CAFQ;AAOVna,CAAAsa,EAAA,CAAAA,QAAiB,EAAG,CAClBnB,EAAA,CAAAA,IAAA,CACA,IAAK,IAAAF,EAAL,CAAA,CAGA,IAAIwB,EAAe,IAAAxB,EAAA,cAAA,EAEnB,IAAK,IAAAA,EAAA,SAAL,CAAA,CAGA,Gb9ISjN,Ca8IT,CAsKA,IAAK,IAAIxzB,EAAI,CAAb,CAAgBA,CAAhB,CAlKuCiiC,CAkKnBzlC,OAApB,CAAyCwD,CAAA,EAAzC,CAA8C,CAE5C,IAAIoG,EApKJ87B,IAoKQzB,EAAA,uBAAA,CApK6BwB,CAmK7BhzB,CAAajP,CAAbiP,CACA,CACR,IAAI7I,CAAJ,EbvTOotB,CauTP,EArKA0O,IAuMwBxB,EAlCxB,CAkCyC,CACzC,IAAIlH,EVjWMtF,EUiWA,CAAwBC,CAAxB,CACVwM,GAAA,CAzMAuB,IAyMA,CAzMAA,KA0MAxB,EAAA,eAAA,CAAkClH,CAAlC,CACArF,EAAA50B,YAAA,CVrXUy0B,EUqXU,CAAoBwF,CAApB,CAJqB,CArCG,CAtK9C,IA+KA,KA9KE2I,EAAA,CAAAA,IAAA,CAAuB,IAAA9B,EAAvB,CAA4C,IAAAC,EAA5C,CA8KOtgC,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CA7K0BiiC,CA6KNzlC,OAApB,CAAyCwD,CAAA,EAAzC,CAGE,CADIoG,CACJ,CAhLAg8B,IA+KQ3B,EAAA,uBAAA,CA/KgBwB,CA8KhBhzB,CAAajP,CAAbiP,CACA,CACR,GACEuuB,EAAA,CAAiCp3B,CAAjC,CAjLFg8B,IAiLsC9B,EAAAzG,EAApC,CA7KJ,KAAA4G,EAAA,SAAA,CAAyC,CAAA,CAErC,KAAAD,EAAJ,EAAiC,CbtJxBhN,CasJT,EACE,IAAA6O,cAAA,EAZF,CALA,CAFkB,CA4BpB7a;CAAA8W,aAAA,CAAAA,QAAY,CAACv6B,CAAD,CAAOu+B,CAAP,CAAsB,CAC3B,IAAA,EV4CO5M,CU5CD,CAAuB3xB,CAAvB,CAAN,GAAA,CACD+1B,EAAY4C,CAAA,CAAc34B,CAAd,CAChB,IAAK+1B,CAAAA,CAAL,CAAA,CApFI,IAAA,EV8HQpE,CU9Hc,CAqFM3xB,CArFN,CAArB,EAAA,CAAA,CAAA,GAAI,EAAA,CAAA,CAAA,EACT,KAAI2C,ENvFOg3B,EMuFO,CAAe9H,CAAf,CACdh3B,EAAAA,CH/GO2gC,EG+GI,CAAY3J,CAAZ,CAIf,IAAIh3B,CAAJ,CAAc,CACZ,IAAA46B,EAAM56B,CAAA,UACN,KAAA66B,EAAwB76B,CAAA8iC,GAFZ,CAKd,CAAA,CAAOnB,EAAA,CA0EyBx8B,CA1EzB,CACL,IRxHSw1B,EQwHT,CACEC,CADF,CAEE9yB,CAFF,CAGE+yB,CAHF,CAKE9D,CALF,CADK,CAyEP,CAIuB5xB,CAAvB,GAAKw+B,IAuDYlC,EAvDjB,GACE,IAAAG,EADF,CAC8B,CAAA,CAD9B,CAGI8B,EAAJ,GACExI,CAAAJ,EAEA,CADEI,CAAAJ,EACF,EADuC,EACvC,CAAAv5B,MAAA46B,OAAA,CAAcjB,CAAAJ,EAAd,CAAiD4I,CAAjD,CAHF,CAKA,Ib/KS9O,Ca+KT,CAKO,CACL,GAAIsG,CAAAJ,EAAJ,CAAA,CAC+BA,CAAAA,CAAAI,CAAAJ,EChNnC,KAAKtvB,IAAIA,CAAT,GAAcwwB,EAAd,CAEY,IAAV,GAAIxwB,CAAJ,CD8M2BrG,CC7MzBowB,MAAAqO,eAAA,CAA6Bp4B,CAA7B,CADF,CD8M2BrG,CC3MzBowB,MAAAsO,YAAA,CAA0Br4B,CAA1B,CAA6BwwB,CAAA,CAAWxwB,CAAX,CAA7B,CD0MA,CAKA,KAFIxL,CAEJ,CHxNS2gC,EGsNM,CAAY3J,CAAZ,CAEf,GAAoC7xB,CAApC,GAAkBw+B,IAoCHlC,EApCf,GAGIzhC,CAHJ,EAGgBA,CAAA6iC,GAHhB,EAGmC,CF5JzB9B,EE4J0B,CAA+B/gC,CAA/B,CAHpC,CAG8E,CAE5E,GFvIE+gC,EAAA,CEuIuC/gC,CFvIvC,CEuIF,EAAyCA,CFvIV,4BEuI/B,GAAyCA,CFvIuB,sBEuIhE,CACE+hC,EAAA,CAAAA,IAAA,CAGA,CAFA,IAAAD,EAEA,EAFmB,IAAAA,EAAA,eAAA,CAAkC9hC,CAAA,UAAlC,CAAyDg3B,CAAzD,CAEnB,CADAh3B,CAAA6iC,GAAAliC,YACA;AAD8Bg3B,EAAA,CAA+BxyB,CAA/B,CAAqC+1B,CAAAtD,EAArC,CAC9B,CFtHMoJ,EEsHN,CAAuChhC,CAAvC,CbrOGq0B,EawOL,GACM9qB,CADN,CACapE,CAAAoP,WADb,IAGgBhL,CAAAlD,cAAAkvB,CAAmB,OAAnBA,CACZ50B,YAJJ,CAIwBg3B,EAAA,CAA+BxyB,CAA/B,CAAqC+1B,CAAAtD,EAArC,CAJxB,CAOAsD,EAAAtD,EAAA,CAAuB53B,CAAA,UAhBqD,CATzE,CALP,IAEE,IADDujC,EAAA,CAAAA,IAAA,CAAuBp+B,CAAvB,CAA6B+1B,CAA7B,CACK,CAAAA,CAAAL,GAAA,EAAmCK,CAAAL,GAAAj9B,OAAvC,CAAA,CACmCs9B,CAAAA,CAAAA,CA+CjClE,EAAAA,CVpBQF,CUoBH,CA/CsB3xB,CA+CtB,CAAA6xB,GAGL8M,EAAAA,CAAc,CAFdC,CAEc,CAFDzC,EAAA1B,MAAA,CAAiB5I,CAAjB,CAAqBkE,CAAAD,EAArB,CAAgDC,CAAAL,GAAhD,CAEC,EAAakJ,CAAArE,aAAb,CAAuC,IACrDsE,EAAAA,CAAmB9I,CAAAF,EAEG,EAJAiJ,CAIA,CAJAA,CAIA,EAJAA,CAAAA,EAIA,IAlOtBxgB,CACJ,CAiOiD,IAlOxC+d,EAAA,CAkOwC/gC,CAlOxC,CACT,EAiOiD,IAlOZ+gC,EAAA,CAkOY/gC,CAlOZ,CACrC,EADiE,CACjE,EADsE,CACtE,CAAA,CAAA,CAiOiDA,CAjOjD,CAAc,GAAd,CAAkBgjB,CAiOQ,CAA1ByX,EAAAF,EAAA,CAA0B,CACqDA,EAAAA,CAAAE,CAAAF,EP+OjFkJ,EAAAA,CA8Fa5X,EA5FP6G,EAAAA,CAAUoC,CAAA,CAAQA,CAAA50B,YAAR,EAA6B,EAA7B,CACZ68B,EAAA,CAAAA,CAAA,COxS6Br4B,CPwS7B,COlPkD+1B,CAAAD,EPkPlD,CAA0Cp6B,CAA1C,CAEEq6B,EAAAA,CAAY4C,CAAA,CO1Se34B,CP0Sf,CAChB,KAAIqC,EAAI0zB,CAAAH,EACJvzB,EAAJ,EAAS,CNhgBA6sB,CMggBT,EAA2B7sB,CAA3B,GAAiC+tB,CAAjC,GACE/tB,CAAA,UAAA,EACA,CAAsB,CAAtB,EAAIA,CAAA,UAAJ,EAA2BA,CAAAtK,WAA3B,EACEsK,CAAAtK,WAAA+R,YAAA,CAAyBzH,CAAzB,CAHJ,CNhgBS6sB,EMwgBT,CAEM6G,CAAAH,EAAJ,EACEG,CAAAH,EAAAp6B,YACA,CADoCwyB,CACpC,CAAAoC,CAAA,CAAQ2F,CAAAH,EAFV,EAIW5H,CAJX,GAOEoC,CAPF,CH7aUQ,EGobA,CAAmB5C,CAAnB,CAA4BtyB,CAA5B,CO7TmBsE,CP6TmBoP,WAAtC,CACN2mB,CAAApzB,EADM,CAPV,CAFF,CAcOytB,CAAL,CAQYA,CAAAr4B,WARZ;CASM6N,EAKJ,EAL0C,EAK1C,CALaooB,CAAA9uB,QAAA,CAAgB,QAAhB,CAKb,GAFEkxB,CAAA50B,YAEF,CAFsBwyB,CAEtB,EHxZQ+C,EGwZR,CAAqBX,CAArB,CAA4B,IAA5B,CAAkC2F,CAAApzB,EAAlC,CAdF,EAGMqrB,CAHN,GAIIoC,CAJJ,CHzbUQ,EG6bE,CAAmB5C,CAAnB,CAA4BtyB,CAA5B,CAAsC,IAAtC,CACNq6B,CAAApzB,EADM,CAJZ,CAkBEytB,EAAJ,GACEA,CAAA,UAKA,CALqBA,CAAA,UAKrB,EAL2C,CAK3C,CAHI2F,CAAAH,EAGJ,EAH6BxF,CAG7B,EAFEA,CAAA,UAAA,EAEF,CAAA2F,CAAAH,EAAA,CAAwBxF,CAN1B,CAQA,EAAA,CAAOA,CNhjBElB,Ea2QT,GACkD2G,CPiOlD,COjOkDE,CAAAF,EPiOlD,CANImJ,CAMJ,CAPI9zB,CAOJ,COzR+BlL,CPkRvB/C,aAAA,CAAqB,OAArB,CAOR,EAPyC,EAOzC,COjO2E4hC,CPiO3E,GAJEG,CAIF,CAJM9zB,CAAA3N,QAAA,CACF,IAAIg4B,MAAJ,CAAW,iBAAX,CO9NuEsJ,CP8NvE,CAAiD,MAAjD,CAAyD,GAAzD,CADE,CAC6D,GAD7D,CAIN,EADAG,CACA,GADMA,CAAA,CAAI,GAAJ,CAAU,EAChB,EADoC,UACpC,CAD0CtjC,CAC1C,CAAIwP,CAAJ,GAAU8zB,CAAV,EH3QYtN,EG4QV,CO1R6B1xB,CP0R7B,CAAsCg/B,CAAtC,COnOF,CAGKJ,EAAL,EACEzC,EAAA9B,MAAA,CAAiBxI,CAAjB,CAAqBkE,CAAAD,EAArB,CAAgD1F,CAAhD,CAAuD2F,CAAAF,EAAvD,CA5DA,CAjB8B,CAiDlCoJ,SAAA,GAAkB,CAAlBA,CAAkB,CAACxlC,CAAD,CAAO,CAGvB,MAAA,CADIuG,CACJ,CAFWvG,CAAA+L,YAAApB,EACApE,KACX,EACM24B,CAAA,CAAc34B,CAAd,CAAJ,CACSA,CADT,CAGSi/B,EAAA,CAAAA,CAAA,CAAwBj/B,CAAxB,CAJX,CAOO,CAAAs8B,EAVgB;AAgCzB8B,QAAA,GAAiB,CAAjBA,CAAiB,CAACp+B,CAAD,CAAO+1B,CAAP,CAAkB,CAC7BmJ,CAAAA,CAAQD,EAAA,CAAAA,CAAA,CAAwBj/B,CAAxB,CACZ,KAAIm/B,EAAiBxG,CAAA,CAAcuG,CAAd,CAEjB9I,EAAAA,CAAQh6B,MAAAyN,OAAA,CADUs1B,CAAArJ,EACV,EAAiC,IAAjC,CACZ,KAAIsJ,EAAmBnH,EAAA,CAA8Cj4B,CAA9C,CAAoD+1B,CAAAtD,EAApD,CAEnB4M,EAAAA,CADe7H,EAAA8H,CAAuCH,CAAA1M,EAAvC6M,CAAkEt/B,CAAlEs/B,CACUzI,EAC7Bz6B,OAAA46B,OAAA,CACEZ,CADF,CAEEgJ,CAAAlH,GAFF,CAGEmH,CAHF,CAIED,CAAAjH,GAJF,CAMiCxC,EAAAA,CAAAI,CAAAJ,EAKjC,KAAKtvB,IAAIA,CAAT,GAAck5B,EAAd,CAIE,IAHIP,CAGJ,CAHQO,CAAA,CAAUl5B,CAAV,CAGR,GAAe,CAAf,GAAS24B,CAAT,CATwB5I,CAUtB,CAAM/vB,CAAN,CAAA,CAAW24B,CPhLjBQ,EAAAA,CA4darY,EAzdPyP,EAAAA,CAAQx6B,MAAA0K,oBAAA,COoKUsvB,CPpKV,CACZ,KAASn6B,CAAT,CAAW,CAAX,CAAiBA,CAAjB,CAAqB26B,CAAAn+B,OAArB,CAAmCwD,CAAA,EAAnC,CACEsF,CACA,CADIq1B,CAAA,CAAM36B,CAAN,CACJ,COiKoBm6B,CPjKpB,CAAM70B,CAAN,CAAA,CAAW21B,EAAA,CAAAA,CAAA,COiKSd,CPjKa,CAAM70B,CAAN,CAAtB,COiKS60B,CPjKT,COkKbL,EAAAD,EAAA,CAA4BM,CAhBK,CAiCnC3S,CAAA6a,cAAA,CAAAA,QAAa,CAACzH,CAAD,CAAa,CACxB,IAAA4I,aAAA,CAAkB,IAAAnD,EAAlB,CAAuCzF,CAAvC,CADwB,CAS1BpT;CAAAgc,aAAA,CAAAA,QAAY,CAACz/B,CAAD,CAAO62B,CAAP,CAAmB,CAC7B,IAAIzyB,EAAOpE,CAAAoP,WACX,EAAIhL,CAAJ,EAA8BpE,CAA9B,GAAYw+B,IA/DKlC,EA+DjB,GACE,IAAA/B,aAAA,CAAkBv6B,CAAlB,CAAwB62B,CAAxB,CAIF,IADI6I,CACJ,CADqBt7B,CACrB,GAD8BA,CAAA2I,SAC9B,EAD+C3I,CAAAzI,WAC/C,EACE,IAASM,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoByjC,CAAAjnC,OAApB,CAA2CwD,CAAA,EAA3C,CAEE,IAAAwjC,aAAA,CADoCC,CAAAx0B,CAAejP,CAAfiP,CACpC,CAHJ,KAQE,IADI6B,CACJ,CADe/M,CAAA+M,SACf,EADgC/M,CAAArE,WAChC,CACE,IAASM,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB8Q,CAAAtU,OAApB,CAAqCwD,CAAA,EAArC,CAEE,IAAAwjC,aAAA,CADoC1yB,CAAA7B,CAASjP,CAATiP,CACpC,CAlBuB,CA0C/BuY,EAAAqa,GAAA,CAAAA,QAA+B,CAAC1N,CAAD,CAAQ,CAAA,IAAA,EAAA,IAAA,CACjCqF,EV7UQtF,EU6UF,CAAwBC,CAAxB,CVpTEF,GUqTZ,CAAsBuF,CAAtB,CAA2B,QAAA,CAACnF,CAAD,CAAU,CACnC,Gb1WOpB,Ca0WP,CACEgG,EAAA,CAAuC5E,CAAvC,CADF,KAAA,CT3DJqP,IAAAA,EA+CaxY,CSeuBmJ,ET5DlC,SAAA,CS4DkCA,CT5Df,eACnB4E,GAAA,CS2DkC5E,CT3DlC,CS2DkCA,ET1MlC,SAAA,CS0MkCA,CT1Mf2C,EAAnB,CACEC,EAAA,CA+IF0M,CA/IE,CSyMgCtP,CTzMhC,CA+IwB,CAAA8E,EA/IxB,CA+IFv+B,IAAA,EA/IE,CA+IFg8B,IAAA,EA/IE,CSsMA,CbxUOpD,Ca6UP,GACEmN,EAAA,CAAAA,CAAA,CACA,CAAA,CAAAD,EAAA,EAAmB,CAAAA,EAAA,cAAA,CAAiCrM,CAAjC,CAFrB,CANmC,CAArC,CbvUSb,EakVT,CACEW,CAAA50B,YADF,CV1WYy0B,EU2WU,CAAoBwF,CAApB,CADtB,CAGE,IAAA8G,EAAA9J,EAAA,MAAAhrB,KAAA,CAAsDguB,CAAtD,CAhBmC,CA2BvChS;CAAAoc,sBAAA,CAAAA,QAAqB,CAACloC,CAAD,CAAUw/B,CAAV,CAAoB,CACvC,IAAI57B,CbjWKk0B,EakWT,GAGEl0B,CAHF,CAGUu6B,CADQ6C,CAAA,CAAchhC,CAAd,CACRm+B,EADkC6C,CAAA,CAAcsG,EAAA,CAAAA,IAAA,CAAwBtnC,CAAxB,CAAd,CAClCm+B,GAAA,CAA0BqB,CAA1B,CAHV,CASA,OAAO,CAHP57B,CAGO,CAHCA,CAGD,EAHUtE,MAAA6oC,iBAAA,CAAwBnoC,CAAxB,CAAAooC,iBAAA,CAAkD5I,CAAlD,CAGV,EAAQ57B,CAAAuxB,KAAA,EAAR,CAAuB,EAXS,CAgBzCrJ,EAAAuc,GAAA,CAAAA,QAAe,CAACroC,CAAD,CAAUsoC,CAAV,CAAuB,CACpC,IAAI77B,EAAOzM,CAAA6N,YAAA,EACPw1B,EAAAA,CAAUiF,CAAA,CAAcA,CAAAlhC,MAAA,CAAkB,IAAlB,CAAd,CAAwC,EAClDmhC,EAAAA,CAAY97B,CAAApE,KAAZkgC,EAAyB97B,CAAApE,KAAA5G,UAI7B,IAAI,CAAC8mC,CAAL,CAAgB,CACd,IAAIC,EAAYxoC,CAAAsF,aAAA,CAAqB,OAArB,CAChB,IAAIkjC,CAAJ,CAAe,CACTC,CAAAA,CAAKD,CAAAphC,MAAA,CAAgB,IAAhB,CACT,KAAK,IAAI9C,EAAE,CAAX,CAAcA,CAAd,CAAkBmkC,CAAA3nC,OAAlB,CAA6BwD,CAAA,EAA7B,CACE,GAAImkC,CAAA,CAAGnkC,CAAH,CAAJ,GThEKkrB,CSgESmL,EAAd,CAA2C,CACzC4N,CAAA,CAAYE,CAAA,CAAGnkC,CAAH,CAAK,CAAL,CACZ,MAFyC,CAHhC,CAFD,CAYZikC,CAAJ,EACElF,CAAAvzB,KAAA,CTxES0f,CSwEImL,EAAb,CAA0C4N,CAA1C,CbpYOzQ,EasYT,GACMsG,CADN,CACkB4C,CAAA,CAAchhC,CAAd,CADlB,GAEmBo+B,CAAAF,EAFnB,EAGImF,CAAAvzB,KAAA,CP4KO0f,EO5KMuS,EAAb,CAA0C3D,CAAAF,EAA1C,CVzMQnE,GU4MZ,CAA6B/5B,CAA7B,CAAsCqjC,CAAAlsB,KAAA,CAAa,GAAb,CAAtC,CA5BoC,CA8BtC2U,EAAA4c,GAAA,CAAAA,QAAiB,CAAC5mC,CAAD,CAAO,CACtB,MAAOk/B,EAAA,CAAcl/B,CAAd,CADe,CAM1B2iC,EAAA14B,UAAA,MAAA,CAAiC04B,CAAA14B,UAAAsE,GACjCo0B;CAAA14B,UAAA,gBAAA,CAA2C04B,CAAA14B,UAAAu5B,gBAC3Cb,EAAA14B,UAAA,aAAA,CAAwC04B,CAAA14B,UAAA62B,aACxC6B,EAAA14B,UAAA,cAAA,CAAyC04B,CAAA14B,UAAA46B,cACzClC,EAAA14B,UAAA,aAAA,CAAwC04B,CAAA14B,UAAA+7B,aACxCrD,EAAA14B,UAAA,sBAAA,CAAiD04B,CAAA14B,UAAAm8B,sBACjDzD,EAAA14B,UAAA,gBAAA,CAA2C04B,CAAA14B,UAAAs8B,GAC3C5D,EAAA14B,UAAA,kBAAA,CAA6C04B,CAAA14B,UAAA28B,GAC7CjE,EAAA14B,UAAA,gCAAA,CAA2D04B,CAAA14B,UAAAo6B,GAC3D1B,EAAA14B,UAAA,YAAA,CAAuC04B,CAAA14B,UAAAq5B,GACvCX,EAAA14B,UAAA,iBAAA,CAA4C04B,CAAA14B,UAAAs5B,GAC5CZ;CAAA14B,UAAA,kBAAA,CAA6C04B,CAAA14B,UAAAq6B,EAC7C3hC,OAAA+T,iBAAA,CAAwBisB,CAAA14B,UAAxB,CAA+C,CAC7C,aAAgB,CACd,IAAApH,QAAG,EAAG,CACJ,MbrcO4yB,EaocH,CADQ,CAD6B,CAM7C,UAAa,CACX,IAAA5yB,QAAG,EAAG,CACJ,MbxaOmzB,EauaH,CADK,CANgC,CAA/C,C,CE9bA,IAAM7b,EAAc,IFgBLwoB,CEhBf,CAEI6B,EAFJ,CAEeJ,EAEX5mC,OAAA,SAAJ,GACEgnC,EACA,CADYhnC,MAAA,SAAA,UACZ,CAAA4mC,EAAA,CAAuB5mC,MAAA,SAAA,qBAFzB,CAKAA,OAAAs4B,SAAA,CAAkB,CAChB6M,YAAaxoB,CADG,CAOhB,gBAAAqpB,QAAe,CAACpiC,CAAD,CAAW8gC,CAAX,CAAwB2E,CAAxB,CAAwC,CACrD1sB,CAAAmqB,EAAA,EACAnqB,EAAAqpB,gBAAA,CAA4BpiC,CAA5B,CAAsC8gC,CAAtC,CAAmD2E,CAAnD,CAFqD,CAPvC,CAgBhB,aAAAb,QAAY,CAAC9nC,CAAD,CAAUk/B,CAAV,CAAsB,CAChCjjB,CAAAmqB,EAAA,EACAnqB,EAAA6rB,aAAA,CAAyB9nC,CAAzB,CAAkCk/B,CAAlC,CAFgC,CAhBlB,CAwBhB,aAAA0D,QAAY,CAAC5iC,CAAD,CAAU,CACpBic,CAAAmqB,EAAA,EACAnqB,EAAA2mB,aAAA,CAAyB5iC,CAAzB,CAFoB,CAxBN,CAgChB,cAAA2mC,QAAa,CAACzH,CAAD,CAAa,CACxBjjB,CAAAmqB,EAAA,EACAnqB,EAAA0qB,cAAA,CAA0BzH,CAA1B,CAFwB,CAhCV,CA0ChB,sBAAAgJ,QAAqB,CAACloC,CAAD,CAAUw/B,CAAV,CAAoB,CACvC,MAAOvjB,EAAAisB,sBAAA,CAAkCloC,CAAlC,CAA2Cw/B,CAA3C,CADgC,CA1CzB,CA8ChB3H,UfzBWC,CerBK,CAgDhBP,af7DWA,CeaK,CAmDd+O,GAAJ,GACEhnC,MAAAs4B,SAAA0O,UADF,CAC8BA,EAD9B,CAIIJ;EAAJ,GACE5mC,MAAAs4B,SAAAsO,qBADF,CACyCA,EADzC,C;;;;;;;;;ACpEA,IAAI1R,GAAiBl1B,MAAA,eAArB,CACIgN,GAAchN,MAAA,YADlB,CAEIspC,GAAWtpC,MAAA,oBAIfA,OAAAupC,cAAA,CAAuBvpC,MAAAupC,cAAvB,EAA+C,EAE/C,IAAIrU,EAAJ,EAAsBA,EAAA,0BAAtB,CAAmE,CAGjE,IAAIsU,EAAJ,CACIC,GAAsBA,QAA4B,EAAG,CACvD,GAAID,EAAJ,CAAmB,CAEbF,EAAAI,GAAJ,EACEJ,EAAAI,GAAA,CAAmB1pC,MAAAG,SAAnB,CAEF,KAAIqR,EAAKg4B,EACTA,GAAA,CAAgB,IAChBh4B,EAAA,EACA,OAAO,CAAA,CARU,CADoC,CADzD,CAaIm4B,GAAgB38B,EAAA,UACpBkoB,GAAA,0BAAA,CAA4C,QAAQ,CAAC1jB,CAAD,CAAK,CACvDg4B,EAAA,CAAgBh4B,CAChBm4B,GAAA,CAAcF,EAAd,CAFuD,CAAzD,CAKAz8B,GAAA,UAAA,CAA2B,QAAQ,CAACwE,CAAD,CAAK,CACtCm4B,EAAA,CAAc,QAAQ,EAAG,CAInBF,EAAA,EAAJ,CACEz8B,EAAA,UAAA,CAAyBwE,CAAzB,CADF,CAGEA,CAAA,EAPqB,CAAzB,CADsC,CAtByB;AAqCnExE,EAAA,UAAA,CAAyB,QAAQ,EAAG,CAClCq3B,qBAAA,CAAsB,QAAQ,EAAG,CAC/BrkC,MAAAupC,cAAAK,MAAA,CAA6B,CAAA,CAC7BzpC,SAAA4L,cAAA,CAAuB,IAAI9L,WAAJ,CAAgB,oBAAhB,CAAsC,CAACK,QAAS,CAAA,CAAV,CAAtC,CAAvB,CAF+B,CAAjC,CADkC,CAApC,C,CCrCA,IAAI64B,GAAQh5B,QAAA8D,cAAA,CAAuB,OAAvB,CACZk1B,GAAA50B,YAAA,CAAoB,sIAQpB,KAAIjB,GAAOnD,QAAA8J,cAAA,CAAuB,MAAvB,CACX3G,GAAAqI,aAAA,CAAkBwtB,EAAlB,CAAyB71B,EAAAjB,WAAzB,C","file":"webcomponents-hi-sd-ce.js","sourcesContent":["/**\n * @license\n * Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(scope => {\n\n /********************* base setup *********************/\n const link = document.createElement('link');\n const useNative = Boolean('import' in link);\n const emptyNodeList = link.querySelectorAll('*');\n\n // Polyfill `currentScript` for browsers without it.\n let currentScript = null;\n if ('currentScript' in document === false) {\n Object.defineProperty(document, 'currentScript', {\n get() {\n return currentScript ||\n // NOTE: only works when called in synchronously executing code.\n // readyState should check if `loading` but IE10 is\n // interactive when scripts run so we cheat. This is not needed by\n // html-imports polyfill but helps generally polyfill `currentScript`.\n (document.readyState !== 'complete' ?\n document.scripts[document.scripts.length - 1] : null);\n },\n configurable: true\n });\n }\n\n /**\n * @param {Array|NodeList|NamedNodeMap} list\n * @param {!Function} callback\n * @param {boolean=} inverseOrder\n */\n const forEach = (list, callback, inverseOrder) => {\n const length = list ? list.length : 0;\n const increment = inverseOrder ? -1 : 1;\n let i = inverseOrder ? length - 1 : 0;\n for (; i < length && i >= 0; i = i + increment) {\n callback(list[i], i);\n }\n };\n\n /**\n * @param {!Node} node\n * @param {!string} selector\n * @return {!NodeList<!Element>}\n */\n const QSA = (node, selector) => {\n // IE 11 throws a SyntaxError if a node with no children is queried with\n // a selector containing the `:not([type])` syntax.\n if (!node.childNodes.length) {\n return emptyNodeList;\n }\n return node.querySelectorAll(selector);\n };\n\n /**\n * @param {!DocumentFragment} fragment\n */\n const replaceScripts = (fragment) => {\n forEach(QSA(fragment, 'template'), template => {\n forEach(QSA(template.content, scriptsSelector), script => {\n const clone = /** @type {!HTMLScriptElement} */\n (document.createElement('script'));\n forEach(script.attributes, attr => clone.setAttribute(attr.name, attr.value));\n clone.textContent = script.textContent;\n script.parentNode.replaceChild(clone, script);\n });\n replaceScripts(template.content);\n });\n };\n\n /********************* path fixup *********************/\n const CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\n const CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n const STYLESHEET_REGEXP = /(<link[^>]*)(rel=['|\"]?stylesheet['|\"]?[^>]*>)/g;\n\n // path fixup: style elements in imports must be made relative to the main\n // document. We fixup url's in url() and @import.\n const Path = {\n\n fixUrls(element, base) {\n if (element.href) {\n element.setAttribute('href',\n Path.resolveUrl(element.getAttribute('href'), base));\n }\n if (element.src) {\n element.setAttribute('src',\n Path.resolveUrl(element.getAttribute('src'), base));\n }\n if (element.localName === 'style') {\n const r = Path.replaceUrls(element.textContent, base, CSS_URL_REGEXP);\n element.textContent = Path.replaceUrls(r, base, CSS_IMPORT_REGEXP);\n }\n },\n\n replaceUrls(text, linkUrl, regexp) {\n return text.replace(regexp, (m, pre, url, post) => {\n let urlPath = url.replace(/[\"']/g, '');\n if (linkUrl) {\n urlPath = Path.resolveUrl(urlPath, linkUrl);\n }\n return pre + '\\'' + urlPath + '\\'' + post;\n });\n },\n\n resolveUrl(url, base) {\n // Lazy feature detection.\n if (Path.__workingURL === undefined) {\n Path.__workingURL = false;\n try {\n const u = new URL('b', 'http://a');\n u.pathname = 'c%20d';\n Path.__workingURL = (u.href === 'http://a/c%20d');\n } catch (e) {}\n }\n\n if (Path.__workingURL) {\n return (new URL(url, base)).href;\n }\n\n // Fallback to creating an anchor into a disconnected document.\n let doc = Path.__tempDoc;\n if (!doc) {\n doc = document.implementation.createHTMLDocument('temp');\n Path.__tempDoc = doc;\n doc.__base = doc.createElement('base');\n doc.head.appendChild(doc.__base);\n doc.__anchor = doc.createElement('a');\n }\n doc.__base.href = base;\n doc.__anchor.href = url;\n return doc.__anchor.href || url;\n }\n };\n\n /********************* Xhr processor *********************/\n const Xhr = {\n\n async: true,\n\n /**\n * @param {!string} url\n * @param {!function(!string, string=)} success\n * @param {!function(!string)} fail\n */\n load(url, success, fail) {\n if (!url) {\n fail('error: href must be specified');\n } else if (url.match(/^data:/)) {\n // Handle Data URI Scheme\n const pieces = url.split(',');\n const header = pieces[0];\n let resource = pieces[1];\n if (header.indexOf(';base64') > -1) {\n resource = atob(resource);\n } else {\n resource = decodeURIComponent(resource);\n }\n success(resource);\n } else {\n const request = new XMLHttpRequest();\n request.open('GET', url, Xhr.async);\n request.onload = () => {\n // Servers redirecting an import can add a Location header to help us\n // polyfill correctly. Handle relative and full paths.\n // Prefer responseURL which already resolves redirects\n // https://xhr.spec.whatwg.org/#the-responseurl-attribute\n let redirectedUrl = request.responseURL || request.getResponseHeader('Location');\n if (redirectedUrl && redirectedUrl.indexOf('/') === 0) {\n // In IE location.origin might not work\n // https://connect.microsoft.com/IE/feedback/details/1763802/location-origin-is-undefined-in-ie-11-on-windows-10-but-works-on-windows-7\n const origin = (location.origin || location.protocol + '//' + location.host);\n redirectedUrl = origin + redirectedUrl;\n }\n const resource = /** @type {string} */ (request.response || request.responseText);\n if (request.status === 304 || request.status === 0 ||\n request.status >= 200 && request.status < 300) {\n success(resource, redirectedUrl);\n } else {\n fail(resource);\n }\n };\n request.send();\n }\n }\n };\n\n /********************* importer *********************/\n\n const isIE = /Trident/.test(navigator.userAgent) ||\n /Edge\\/\\d./i.test(navigator.userAgent);\n\n const importSelector = 'link[rel=import]';\n\n // Used to disable loading of resources.\n const importDisableType = 'import-disable';\n\n const disabledLinkSelector = `link[rel=stylesheet][href][type=${importDisableType}]`;\n\n const scriptsSelector = `script:not([type]),script[type=\"application/javascript\"],` +\n `script[type=\"text/javascript\"]`;\n\n const importDependenciesSelector = `${importSelector},${disabledLinkSelector},` +\n `style:not([type]),link[rel=stylesheet][href]:not([type]),` + scriptsSelector;\n\n const importDependencyAttr = 'import-dependency';\n\n const rootImportSelector = `${importSelector}:not([${importDependencyAttr}])`;\n\n const pendingScriptsSelector = `script[${importDependencyAttr}]`;\n\n const pendingStylesSelector = `style[${importDependencyAttr}],` +\n `link[rel=stylesheet][${importDependencyAttr}]`;\n\n /**\n * Importer will:\n * - load any linked import documents (with deduping)\n * - whenever an import is loaded, prompt the parser to try to parse\n * - observe imported documents for new elements (these are handled via the\n * dynamic importer)\n */\n class Importer {\n constructor() {\n this.documents = {};\n // Used to keep track of pending loads, so that flattening and firing of\n // events can be done when all resources are ready.\n this.inflight = 0;\n this.dynamicImportsMO = new MutationObserver(m => this.handleMutations(m));\n // Observe changes on <head>.\n this.dynamicImportsMO.observe(document.head, {\n childList: true,\n subtree: true\n });\n // 1. Load imports contents\n // 2. Assign them to first import links on the document\n // 3. Wait for import styles & scripts to be done loading/running\n // 4. Fire load/error events\n this.loadImports(document);\n }\n\n /**\n * @param {!(HTMLDocument|DocumentFragment|Element)} doc\n */\n loadImports(doc) {\n const links = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(doc, importSelector));\n forEach(links, link => this.loadImport(link));\n }\n\n /**\n * @param {!HTMLLinkElement} link\n */\n loadImport(link) {\n const url = link.href;\n // This resource is already being handled by another import.\n if (this.documents[url] !== undefined) {\n // If import is already loaded, we can safely associate it to the link\n // and fire the load/error event.\n const imp = this.documents[url];\n if (imp && imp['__loaded']) {\n link['__import'] = imp;\n this.fireEventIfNeeded(link);\n }\n return;\n }\n this.inflight++;\n // Mark it as pending to notify others this url is being loaded.\n this.documents[url] = 'pending';\n Xhr.load(url, (resource, redirectedUrl) => {\n const doc = this.makeDocument(resource, redirectedUrl || url);\n this.documents[url] = doc;\n this.inflight--;\n // Load subtree.\n this.loadImports(doc);\n this.processImportsIfLoadingDone();\n }, () => {\n // If load fails, handle error.\n this.documents[url] = null;\n this.inflight--;\n this.processImportsIfLoadingDone();\n });\n }\n\n /**\n * Creates a new document containing resource and normalizes urls accordingly.\n * @param {string=} resource\n * @param {string=} url\n * @return {!DocumentFragment}\n */\n makeDocument(resource, url) {\n if (!resource) {\n return document.createDocumentFragment();\n }\n\n if (isIE) {\n // <link rel=stylesheet> should be appended to <head>. Not doing so\n // in IE/Edge breaks the cascading order. We disable the loading by\n // setting the type before setting innerHTML to avoid loading\n // resources twice.\n resource = resource.replace(STYLESHEET_REGEXP, (match, p1, p2) => {\n if (match.indexOf('type=') === -1) {\n return `${p1} type=${importDisableType} ${p2}`;\n }\n return match;\n });\n }\n\n let content;\n const template = /** @type {!HTMLTemplateElement} */\n (document.createElement('template'));\n template.innerHTML = resource;\n if (template.content) {\n content = template.content;\n // Clone scripts inside templates since they won't execute when the\n // hosting template is cloned.\n replaceScripts(content);\n } else {\n // <template> not supported, create fragment and move content into it.\n content = document.createDocumentFragment();\n while (template.firstChild) {\n content.appendChild(template.firstChild);\n }\n }\n\n // Support <base> in imported docs. Resolve url and remove its href.\n const baseEl = content.querySelector('base');\n if (baseEl) {\n url = Path.resolveUrl(baseEl.getAttribute('href'), url);\n baseEl.removeAttribute('href');\n }\n\n const n$ = /** @type {!NodeList<!(HTMLLinkElement|HTMLScriptElement|HTMLStyleElement)>} */\n (QSA(content, importDependenciesSelector));\n // For source map hints.\n let inlineScriptIndex = 0;\n forEach(n$, n => {\n // Listen for load/error events, then fix urls.\n whenElementLoaded(n);\n Path.fixUrls(n, url);\n // Mark for easier selectors.\n n.setAttribute(importDependencyAttr, '');\n // Generate source map hints for inline scripts.\n if (n.localName === 'script' && !n.src && n.textContent) {\n const num = inlineScriptIndex ? `-${inlineScriptIndex}` : '';\n const content = n.textContent + `\\n//# sourceURL=${url}${num}.js\\n`;\n // We use the src attribute so it triggers load/error events, and it's\n // easier to capture errors (e.g. parsing) like this.\n n.setAttribute('src', 'data:text/javascript;charset=utf-8,' + encodeURIComponent(content));\n n.textContent = '';\n inlineScriptIndex++;\n }\n });\n return content;\n }\n\n /**\n * Waits for loaded imports to finish loading scripts and styles, then fires\n * the load/error events.\n */\n processImportsIfLoadingDone() {\n // Wait until all resources are ready, then load import resources.\n if (this.inflight) return;\n\n // Stop observing, flatten & load resource, then restart observing <head>.\n this.dynamicImportsMO.disconnect();\n this.flatten(document);\n // We wait for styles to load, and at the same time we execute the scripts,\n // then fire the load/error events for imports to have faster whenReady\n // callback execution.\n // NOTE: This is different for native behavior where scripts would be\n // executed after the styles before them are loaded.\n // To achieve that, we could select pending styles and scripts in the\n // document and execute them sequentially in their dom order.\n let scriptsOk = false,\n stylesOk = false;\n const onLoadingDone = () => {\n if (stylesOk && scriptsOk) {\n // Catch any imports that might have been added while we\n // weren't looking, wait for them as well.\n this.loadImports(document);\n if (this.inflight) return;\n\n // Restart observing.\n this.dynamicImportsMO.observe(document.head, {\n childList: true,\n subtree: true\n });\n this.fireEvents();\n }\n }\n this.waitForStyles(() => {\n stylesOk = true;\n onLoadingDone();\n });\n this.runScripts(() => {\n scriptsOk = true;\n onLoadingDone();\n });\n }\n\n /**\n * @param {!HTMLDocument} doc\n */\n flatten(doc) {\n const n$ = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(doc, importSelector));\n forEach(n$, n => {\n const imp = this.documents[n.href];\n n['__import'] = /** @type {!Document} */ (imp);\n if (imp && imp.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n // We set the .import to be the link itself, and update its readyState.\n // Other links with the same href will point to this link.\n this.documents[n.href] = n;\n n.readyState = 'loading';\n n['__import'] = n;\n this.flatten(imp);\n n.appendChild(imp);\n }\n });\n }\n\n /**\n * Replaces all the imported scripts with a clone in order to execute them.\n * Updates the `currentScript`.\n * @param {!function()} callback\n */\n runScripts(callback) {\n const s$ = QSA(document, pendingScriptsSelector);\n const l = s$.length;\n const cloneScript = i => {\n if (i < l) {\n // The pending scripts have been generated through innerHTML and\n // browsers won't execute them for security reasons. We cannot use\n // s.cloneNode(true) either, the only way to run the script is manually\n // creating a new element and copying its attributes.\n const s = s$[i];\n const clone = /** @type {!HTMLScriptElement} */\n (document.createElement('script'));\n // Remove import-dependency attribute to avoid double cloning.\n s.removeAttribute(importDependencyAttr);\n forEach(s.attributes, attr => clone.setAttribute(attr.name, attr.value));\n // Update currentScript and replace original with clone script.\n currentScript = clone;\n s.parentNode.replaceChild(clone, s);\n whenElementLoaded(clone, () => {\n currentScript = null;\n cloneScript(i + 1);\n });\n } else {\n callback();\n }\n };\n cloneScript(0);\n }\n\n /**\n * Waits for all the imported stylesheets/styles to be loaded.\n * @param {!function()} callback\n */\n waitForStyles(callback) {\n const s$ = /** @type {!NodeList<!(HTMLLinkElement|HTMLStyleElement)>} */\n (QSA(document, pendingStylesSelector));\n let pending = s$.length;\n if (!pending) {\n callback();\n return;\n }\n // <link rel=stylesheet> should be appended to <head>. Not doing so\n // in IE/Edge breaks the cascading order\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/10472273/\n // If there is one <link rel=stylesheet> imported, we must move all imported\n // links and styles to <head>.\n const needsMove = isIE && !!document.querySelector(disabledLinkSelector);\n forEach(s$, s => {\n // Listen for load/error events, remove selector once is done loading.\n whenElementLoaded(s, () => {\n s.removeAttribute(importDependencyAttr);\n if (--pending === 0) {\n callback();\n }\n });\n // Check if was already moved to head, to handle the case where the element\n // has already been moved but it is still loading.\n if (needsMove && s.parentNode !== document.head) {\n // Replace the element we're about to move with a placeholder.\n const placeholder = document.createElement(s.localName);\n // Add reference of the moved element.\n placeholder['__appliedElement'] = s;\n // Disable this from appearing in document.styleSheets.\n placeholder.setAttribute('type', 'import-placeholder');\n // Append placeholder next to the sibling, and move original to <head>.\n s.parentNode.insertBefore(placeholder, s.nextSibling);\n let newSibling = importForElement(s);\n while (newSibling && importForElement(newSibling)) {\n newSibling = importForElement(newSibling);\n }\n if (newSibling.parentNode !== document.head) {\n newSibling = null;\n }\n document.head.insertBefore(s, newSibling);\n // Enable the loading of <link rel=stylesheet>.\n s.removeAttribute('type');\n }\n });\n }\n\n /**\n * Fires load/error events for imports in the right order .\n */\n fireEvents() {\n const n$ = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(document, importSelector));\n // Inverse order to have events firing bottom-up.\n forEach(n$, n => this.fireEventIfNeeded(n), true);\n }\n\n /**\n * Fires load/error event for the import if this wasn't done already.\n * @param {!HTMLLinkElement} link\n */\n fireEventIfNeeded(link) {\n // Don't fire twice same event.\n if (!link['__loaded']) {\n link['__loaded'] = true;\n // Update link's import readyState.\n link.import && (link.import.readyState = 'complete');\n const eventType = link.import ? 'load' : 'error';\n link.dispatchEvent(newCustomEvent(eventType, {\n bubbles: false,\n cancelable: false,\n detail: undefined\n }));\n }\n }\n\n /**\n * @param {Array<MutationRecord>} mutations\n */\n handleMutations(mutations) {\n forEach(mutations, m => forEach(m.addedNodes, elem => {\n if (elem && elem.nodeType === Node.ELEMENT_NODE) {\n // NOTE: added scripts are not updating currentScript in IE.\n if (isImportLink(elem)) {\n this.loadImport( /** @type {!HTMLLinkElement} */ (elem));\n } else {\n this.loadImports( /** @type {!Element} */ (elem));\n }\n }\n }));\n }\n }\n\n /**\n * @param {!Node} node\n * @return {boolean}\n */\n const isImportLink = node => {\n return node.nodeType === Node.ELEMENT_NODE && node.localName === 'link' &&\n ( /** @type {!HTMLLinkElement} */ (node).rel === 'import');\n };\n\n /**\n * Waits for an element to finish loading. If already done loading, it will\n * mark the element accordingly.\n * @param {!(HTMLLinkElement|HTMLScriptElement|HTMLStyleElement)} element\n * @param {function()=} callback\n */\n const whenElementLoaded = (element, callback) => {\n if (element['__loaded']) {\n callback && callback();\n } else if ((element.localName === 'script' && !element.src) ||\n (element.localName === 'style' && !element.firstChild)) {\n // Inline scripts and empty styles don't trigger load/error events,\n // consider them already loaded.\n element['__loaded'] = true;\n callback && callback();\n } else {\n const onLoadingDone = event => {\n element.removeEventListener(event.type, onLoadingDone);\n element['__loaded'] = true;\n callback && callback();\n };\n element.addEventListener('load', onLoadingDone);\n // NOTE: We listen only for load events in IE/Edge, because in IE/Edge\n // <style> with @import will fire error events for each failing @import,\n // and finally will trigger the load event when all @import are\n // finished (even if all fail).\n if (!isIE || element.localName !== 'style') {\n element.addEventListener('error', onLoadingDone);\n }\n }\n }\n\n /**\n * Calls the callback when all imports in the document at call time\n * (or at least document ready) have loaded. Callback is called synchronously\n * if imports are already done loading.\n * @param {function()=} callback\n */\n const whenReady = callback => {\n // 1. ensure the document is in a ready state (has dom), then\n // 2. watch for loading of imports and call callback when done\n whenDocumentReady(() => whenImportsReady(() => callback && callback()));\n }\n\n /**\n * Invokes the callback when document is in ready state. Callback is called\n * synchronously if document is already done loading.\n * @param {!function()} callback\n */\n const whenDocumentReady = callback => {\n const stateChanged = () => {\n // NOTE: Firefox can hit readystate interactive without document.body existing.\n // This is anti-spec, but we handle it here anyways by waiting for next change.\n if (document.readyState !== 'loading' && !!document.body) {\n document.removeEventListener('readystatechange', stateChanged);\n callback();\n }\n }\n document.addEventListener('readystatechange', stateChanged);\n stateChanged();\n }\n\n /**\n * Invokes the callback after all imports are loaded. Callback is called\n * synchronously if imports are already done loading.\n * @param {!function()} callback\n */\n const whenImportsReady = callback => {\n let imports = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(document, rootImportSelector));\n let pending = imports.length;\n if (!pending) {\n callback();\n return;\n }\n forEach(imports, imp => whenElementLoaded(imp, () => {\n if (--pending === 0) {\n callback();\n }\n }));\n }\n\n /**\n * Returns the import document containing the element.\n * @param {!Node} element\n * @return {HTMLLinkElement|Document|undefined}\n */\n const importForElement = element => {\n if (useNative) {\n // Return only if not in the main doc!\n return element.ownerDocument !== document ? element.ownerDocument : null;\n }\n let doc = element['__importDoc'];\n if (!doc && element.parentNode) {\n doc = /** @type {!Element} */ (element.parentNode);\n if (typeof doc.closest === 'function') {\n // Element.closest returns the element itself if it matches the selector,\n // so we search the closest import starting from the parent.\n doc = doc.closest(importSelector);\n } else {\n // Walk up the parent tree until we find an import.\n while (!isImportLink(doc) && (doc = doc.parentNode)) {}\n }\n element['__importDoc'] = doc;\n }\n return doc;\n }\n\n let importer = null;\n /**\n * Ensures imports contained in the element are imported.\n * Use this to handle dynamic imports attached to body.\n * @param {!(HTMLDocument|Element)} doc\n */\n const loadImports = (doc) => {\n if (importer) {\n importer.loadImports(doc);\n }\n };\n\n const newCustomEvent = (type, params) => {\n if (typeof window.CustomEvent === 'function') {\n return new CustomEvent(type, params);\n }\n const event = /** @type {!CustomEvent} */ (document.createEvent('CustomEvent'));\n event.initCustomEvent(type, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);\n return event;\n };\n\n if (useNative) {\n // Check for imports that might already be done loading by the time this\n // script is actually executed. Native imports are blocking, so the ones\n // available in the document by this time should already have failed\n // or have .import defined.\n const imps = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(document, importSelector));\n forEach(imps, imp => {\n if (!imp.import || imp.import.readyState !== 'loading') {\n imp['__loaded'] = true;\n }\n });\n // Listen for load/error events to capture dynamically added scripts.\n /**\n * @type {!function(!Event)}\n */\n const onLoadingDone = event => {\n const elem = /** @type {!Element} */ (event.target);\n if (isImportLink(elem)) {\n elem['__loaded'] = true;\n }\n };\n document.addEventListener('load', onLoadingDone, true /* useCapture */ );\n document.addEventListener('error', onLoadingDone, true /* useCapture */ );\n } else {\n // Override baseURI so that imported elements' baseURI can be used seemlessly\n // on native or polyfilled html-imports.\n // NOTE: a <link rel=import> will have `link.baseURI === link.href`, as the link\n // itself is used as the `import` document.\n /** @type {Object|undefined} */\n const native_baseURI = Object.getOwnPropertyDescriptor(Node.prototype, 'baseURI');\n // NOTE: if not configurable (e.g. safari9), set it on the Element prototype. \n const klass = !native_baseURI || native_baseURI.configurable ? Node : Element;\n Object.defineProperty(klass.prototype, 'baseURI', {\n get() {\n const ownerDoc = /** @type {HTMLLinkElement} */ (isImportLink(this) ? this : importForElement(this));\n if (ownerDoc) return ownerDoc.href;\n // Use native baseURI if possible.\n if (native_baseURI && native_baseURI.get) return native_baseURI.get.call(this);\n // Polyfill it if not available.\n const base = /** @type {HTMLBaseElement} */ (document.querySelector('base'));\n return (base || window.location).href;\n },\n configurable: true,\n enumerable: true\n });\n\n // Define 'import' read-only property.\n Object.defineProperty(HTMLLinkElement.prototype, 'import', {\n get() {\n return /** @type {HTMLLinkElement} */ (this)['__import'] || null;\n },\n configurable: true,\n enumerable: true\n });\n\n whenDocumentReady(() => {\n importer = new Importer()\n });\n }\n\n /**\n Add support for the `HTMLImportsLoaded` event and the `HTMLImports.whenReady`\n method. This api is necessary because unlike the native implementation,\n script elements do not force imports to resolve. Instead, users should wrap\n code in either an `HTMLImportsLoaded` handler or after load time in an\n `HTMLImports.whenReady(callback)` call.\n\n NOTE: This module also supports these apis under the native implementation.\n Therefore, if this file is loaded, the same code can be used under both\n the polyfill and native implementation.\n */\n whenReady(() => document.dispatchEvent(newCustomEvent('HTMLImportsLoaded', {\n cancelable: true,\n bubbles: true,\n detail: undefined\n })));\n\n // exports\n scope.useNative = useNative;\n scope.whenReady = whenReady;\n scope.importForElement = importForElement;\n scope.loadImports = loadImports;\n\n})(window.HTMLImports = (window.HTMLImports || {}));",null,null,null,null,null,"/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n\nexport class ShadyData {\n constructor() {\n /** @type {ShadowRoot} */\n this.root = null;\n /** @type {ShadowRoot} */\n this.publicRoot = null;\n this.dirty = false;\n this.observer = null;\n /** @type {Array<Node>} */\n this.assignedNodes = null;\n /** @type {Element} */\n this.assignedSlot = null;\n /** @type {Array<Node>} */\n this._previouslyAssignedNodes = null;\n /** @type {Element} */\n this._prevAssignedSlot = null;\n /** @type {Array<Node>} */\n this.flattenedNodes = null;\n this.ownerShadyRoot = undefined;\n /** @type {Node|undefined} */\n this.parentNode = undefined;\n /** @type {Node|undefined} */\n this.firstChild = undefined;\n /** @type {Node|undefined} */\n this.lastChild = undefined;\n /** @type {Node|undefined} */\n this.previousSibling = undefined;\n /** @type {Node|undefined} */\n this.nextSibling = undefined;\n /** @type {Array<Node>|undefined} */\n this.childNodes = undefined;\n this.__outsideAccessors = false;\n this.__insideAccessors = false;\n }\n\n toJSON() {\n return {};\n }\n}\n\nexport function ensureShadyDataForNode(node) {\n if (!node.__shady) {\n node.__shady = new ShadyData();\n }\n return node.__shady;\n}\n\nexport function shadyDataForNode(node) {\n return node && node.__shady;\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport {shadyDataForNode} from './shady-data.js';\n\nexport let settings = window['ShadyDOM'] || {};\n\nsettings.hasNativeShadowDOM = Boolean(Element.prototype.attachShadow && Node.prototype.getRootNode);\n\nlet desc = Object.getOwnPropertyDescriptor(Node.prototype, 'firstChild');\n\nsettings.hasDescriptors = Boolean(desc && desc.configurable && desc.get);\nsettings.inUse = settings['force'] || !settings.hasNativeShadowDOM;\n\n// Default to using native accessors (instead of treewalker) only for\n// IE/Edge where they are faster.\nconst IS_IE = navigator.userAgent.match('Trident');\nconst IS_EDGE = navigator.userAgent.match('Edge');\nif (settings.useNativeAccessors === undefined) {\n settings.useNativeAccessors = settings.hasDescriptors && (IS_IE || IS_EDGE);\n}\n\nexport function isTrackingLogicalChildNodes(node) {\n const nodeData = shadyDataForNode(node);\n return (nodeData && nodeData.firstChild !== undefined);\n}\n\nexport function isShadyRoot(obj) {\n return Boolean(obj._localName === 'ShadyRoot');\n}\n\nexport function ownerShadyRootForNode(node) {\n let root = node.getRootNode();\n if (isShadyRoot(root)) {\n return root;\n }\n}\n\nlet p = Element.prototype;\nlet matches = p.matches || p.matchesSelector ||\n p.mozMatchesSelector || p.msMatchesSelector ||\n p.oMatchesSelector || p.webkitMatchesSelector;\n\nexport function matchesSelector(element, selector) {\n return matches.call(element, selector);\n}\n\nfunction copyOwnProperty(name, source, target) {\n let pd = Object.getOwnPropertyDescriptor(source, name);\n if (pd) {\n Object.defineProperty(target, name, pd);\n }\n}\n\nexport function extend(target, source) {\n if (target && source) {\n let n$ = Object.getOwnPropertyNames(source);\n for (let i=0, n; (i<n$.length) && (n=n$[i]); i++) {\n copyOwnProperty(n, source, target);\n }\n }\n return target || source;\n}\n\nexport function extendAll(target, ...sources) {\n for (let i=0; i < sources.length; i++) {\n extend(target, sources[i]);\n }\n return target;\n}\n\nexport function mixin(target, source) {\n for (var i in source) {\n target[i] = source[i];\n }\n return target;\n}\n\nexport function patchPrototype(obj, mixin) {\n let proto = Object.getPrototypeOf(obj);\n if (!proto.hasOwnProperty('__patchProto')) {\n let patchProto = Object.create(proto);\n patchProto.__sourceProto = proto;\n extend(patchProto, mixin);\n proto['__patchProto'] = patchProto;\n }\n // old browsers don't have setPrototypeOf\n obj.__proto__ = proto['__patchProto'];\n}\n\n\nlet twiddle = document.createTextNode('');\nlet content = 0;\nlet queue = [];\nnew MutationObserver(() => {\n while (queue.length) {\n // catch errors in user code...\n try {\n queue.shift()();\n } catch(e) {\n // enqueue another record and throw\n twiddle.textContent = content++;\n throw(e);\n }\n }\n}).observe(twiddle, {characterData: true});\n\n// use MutationObserver to get microtask async timing.\nexport function microtask(callback) {\n queue.push(callback);\n twiddle.textContent = content++;\n}\n\nexport const hasDocumentContains = Boolean(document.contains);\n\nexport function contains(container, node) {\n while (node) {\n if (node == container) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\n\n// render enqueuer/flusher\nlet flushList = [];\nlet scheduled;\nexport function enqueue(callback) {\n if (!scheduled) {\n scheduled = true;\n utils.microtask(flush);\n }\n flushList.push(callback);\n}\n\nexport function flush() {\n scheduled = false;\n let didFlush = Boolean(flushList.length);\n while (flushList.length) {\n flushList.shift()();\n }\n return didFlush;\n}\n\nflush['list'] = flushList;\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\nimport {ensureShadyDataForNode} from './shady-data.js';\n\nclass AsyncObserver {\n\n constructor() {\n this._scheduled = false;\n this.addedNodes = [];\n this.removedNodes = [];\n this.callbacks = new Set();\n }\n\n schedule() {\n if (!this._scheduled) {\n this._scheduled = true;\n utils.microtask(() => {\n this.flush();\n });\n }\n }\n\n flush() {\n if (this._scheduled) {\n this._scheduled = false;\n let mutations = this.takeRecords();\n if (mutations.length) {\n this.callbacks.forEach(function(cb) {\n cb(mutations);\n });\n }\n }\n }\n\n takeRecords() {\n if (this.addedNodes.length || this.removedNodes.length) {\n let mutations = [{\n addedNodes: this.addedNodes,\n removedNodes: this.removedNodes\n }];\n this.addedNodes = [];\n this.removedNodes = [];\n return mutations;\n }\n return [];\n }\n\n}\n\n// TODO(sorvell): consider instead polyfilling MutationObserver\n// directly so that users do not have to fork their code.\n// Supporting the entire api may be challenging: e.g. filtering out\n// removed nodes in the wrong scope and seeing non-distributing\n// subtree child mutations.\nexport let observeChildren = function(node, callback) {\n const sd = ensureShadyDataForNode(node);\n if (!sd.observer) {\n sd.observer = new AsyncObserver();\n }\n sd.observer.callbacks.add(callback);\n let observer = sd.observer;\n return {\n _callback: callback,\n _observer: observer,\n _node: node,\n takeRecords() {\n return observer.takeRecords()\n }\n };\n}\n\nexport let unobserveChildren = function(handle) {\n let observer = handle && handle._observer;\n if (observer) {\n observer.callbacks.delete(handle._callback);\n if (!observer.callbacks.size) {\n ensureShadyDataForNode(handle._node).observer = null;\n }\n }\n}\n\nexport function filterMutations(mutations, target) {\n /** @const {Node} */\n const targetRootNode = target.getRootNode();\n return mutations.map(function(mutation) {\n /** @const {boolean} */\n const mutationInScope = (targetRootNode === mutation.target.getRootNode());\n if (mutationInScope && mutation.addedNodes) {\n let nodes = Array.from(mutation.addedNodes).filter(function(n) {\n return (targetRootNode === n.getRootNode());\n });\n if (nodes.length) {\n mutation = Object.create(mutation);\n Object.defineProperty(mutation, 'addedNodes', {\n value: nodes,\n configurable: true\n });\n return mutation;\n }\n } else if (mutationInScope) {\n return mutation;\n }\n }).filter(function(m) { return m});\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nexport let appendChild = Element.prototype.appendChild;\nexport let insertBefore = Element.prototype.insertBefore;\nexport let replaceChild = Element.prototype.replaceChild;\nexport let removeChild = Element.prototype.removeChild;\nexport let setAttribute = Element.prototype.setAttribute;\nexport let removeAttribute = Element.prototype.removeAttribute;\nexport let cloneNode = Element.prototype.cloneNode;\nexport let importNode = Document.prototype.importNode;\nexport let addEventListener = Element.prototype.addEventListener;\nexport let removeEventListener = Element.prototype.removeEventListener;\nexport let windowAddEventListener = Window.prototype.addEventListener;\nexport let windowRemoveEventListener = Window.prototype.removeEventListener;\nexport let dispatchEvent = Element.prototype.dispatchEvent;\nexport let contains = Node.prototype.contains || HTMLElement.prototype.contains;\nexport let getElementById = Document.prototype.getElementById;\nexport let elementQuerySelector = Element.prototype.querySelector;\nexport let fragmentQuerySelector = DocumentFragment.prototype.querySelector;\nexport let documentQuerySelector = Document.prototype.querySelector;\nexport let querySelector = function(selector) {\n switch (this.nodeType) {\n case Node.ELEMENT_NODE:\n return elementQuerySelector.call(this, selector);\n case Node.DOCUMENT_NODE:\n return documentQuerySelector.call(this, selector);\n default:\n return fragmentQuerySelector.call(this, selector);\n }\n};\nexport let elementQuerySelectorAll = Element.prototype.querySelectorAll;\nexport let fragmentQuerySelectorAll = DocumentFragment.prototype.querySelectorAll;\nexport let documentQuerySelectorAll = Document.prototype.querySelectorAll;\nexport let querySelectorAll = function(selector) {\n switch (this.nodeType) {\n case Node.ELEMENT_NODE:\n return elementQuerySelectorAll.call(this, selector);\n case Node.DOCUMENT_NODE:\n return documentQuerySelectorAll.call(this, selector);\n default:\n return fragmentQuerySelectorAll.call(this, selector);\n }\n};","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n// Cribbed from ShadowDOM polyfill\n// https://github.com/webcomponents/webcomponentsjs/blob/master/src/ShadowDOM/wrappers/HTMLElement.js#L28\n/////////////////////////////////////////////////////////////////////////////\n// innerHTML and outerHTML\n\n// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\nlet escapeAttrRegExp = /[&\\u00A0\"]/g;\nlet escapeDataRegExp = /[&\\u00A0<>]/g;\n\nfunction escapeReplace(c) {\n switch (c) {\n case '&':\n return '&amp;';\n case '<':\n return '&lt;';\n case '>':\n return '&gt;';\n case '\"':\n return '&quot;';\n case '\\u00A0':\n return '&nbsp;';\n }\n}\n\nfunction escapeAttr(s) {\n return s.replace(escapeAttrRegExp, escapeReplace);\n}\n\nfunction escapeData(s) {\n return s.replace(escapeDataRegExp, escapeReplace);\n}\n\nfunction makeSet(arr) {\n let set = {};\n for (let i = 0; i < arr.length; i++) {\n set[arr[i]] = true;\n }\n return set;\n}\n\n// http://www.whatwg.org/specs/web-apps/current-work/#void-elements\nlet voidElements = makeSet([\n 'area',\n 'base',\n 'br',\n 'col',\n 'command',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n]);\n\nlet plaintextParents = makeSet([\n 'style',\n 'script',\n 'xmp',\n 'iframe',\n 'noembed',\n 'noframes',\n 'plaintext',\n 'noscript'\n]);\n\n/**\n * @param {Node} node\n * @param {Node} parentNode\n * @param {Function=} callback\n */\nexport function getOuterHTML(node, parentNode, callback) {\n switch (node.nodeType) {\n case Node.ELEMENT_NODE: {\n let tagName = node.localName;\n let s = '<' + tagName;\n let attrs = node.attributes;\n for (let i = 0, attr; (attr = attrs[i]); i++) {\n s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n }\n s += '>';\n if (voidElements[tagName]) {\n return s;\n }\n return s + getInnerHTML(node, callback) + '</' + tagName + '>';\n }\n case Node.TEXT_NODE: {\n let data = /** @type {Text} */ (node).data;\n if (parentNode && plaintextParents[parentNode.localName]) {\n return data;\n }\n return escapeData(data);\n }\n case Node.COMMENT_NODE: {\n return '<!--' + /** @type {Comment} */ (node).data + '-->';\n }\n default: {\n window.console.error(node);\n throw new Error('not implemented');\n }\n }\n}\n\n/**\n * @param {Node} node\n * @param {Function=} callback\n */\nexport function getInnerHTML(node, callback) {\n if (node.localName === 'template') {\n node = /** @type {HTMLTemplateElement} */ (node).content;\n }\n let s = '';\n let c$ = callback ? callback(node) : node.childNodes;\n for (let i=0, l=c$.length, child; (i<l) && (child=c$[i]); i++) {\n s += getOuterHTML(child, node, callback);\n }\n return s;\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport {getInnerHTML} from './innerHTML.js';\n\nlet nodeWalker = document.createTreeWalker(document, NodeFilter.SHOW_ALL,\n null, false);\n\nlet elementWalker = document.createTreeWalker(document, NodeFilter.SHOW_ELEMENT,\n null, false);\n\nexport function parentNode(node) {\n nodeWalker.currentNode = node;\n return nodeWalker.parentNode();\n}\n\nexport function firstChild(node) {\n nodeWalker.currentNode = node;\n return nodeWalker.firstChild();\n}\n\nexport function lastChild(node) {\n nodeWalker.currentNode = node;\n return nodeWalker.lastChild();\n}\n\nexport function previousSibling(node) {\n nodeWalker.currentNode = node;\n return nodeWalker.previousSibling();\n}\n\nexport function nextSibling(node) {\n nodeWalker.currentNode = node;\n return nodeWalker.nextSibling();\n}\n\nexport function childNodes(node) {\n let nodes = [];\n nodeWalker.currentNode = node;\n let n = nodeWalker.firstChild();\n while (n) {\n nodes.push(n);\n n = nodeWalker.nextSibling();\n }\n return nodes;\n}\n\nexport function parentElement(node) {\n elementWalker.currentNode = node;\n return elementWalker.parentNode();\n}\n\nexport function firstElementChild(node) {\n elementWalker.currentNode = node;\n return elementWalker.firstChild();\n}\n\nexport function lastElementChild(node) {\n elementWalker.currentNode = node;\n return elementWalker.lastChild();\n}\n\nexport function previousElementSibling(node) {\n elementWalker.currentNode = node;\n return elementWalker.previousSibling();\n}\n\nexport function nextElementSibling(node) {\n elementWalker.currentNode = node;\n return elementWalker.nextSibling();\n}\n\nexport function children(node) {\n let nodes = [];\n elementWalker.currentNode = node;\n let n = elementWalker.firstChild();\n while (n) {\n nodes.push(n);\n n = elementWalker.nextSibling();\n }\n return nodes;\n}\n\nexport function innerHTML(node) {\n return getInnerHTML(node, (n) => childNodes(n));\n}\n\nexport function textContent(node) {\n /* eslint-disable no-case-declarations */\n switch (node.nodeType) {\n case Node.ELEMENT_NODE:\n case Node.DOCUMENT_FRAGMENT_NODE:\n let textWalker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT,\n null, false);\n let content = '', n;\n while ( (n = textWalker.nextNode()) ) {\n // TODO(sorvell): can't use textContent since we patch it on Node.prototype!\n // However, should probably patch it only on element.\n content += n.nodeValue;\n }\n return content;\n default:\n return node.nodeValue;\n }\n /* eslint-enable */\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport * as utils from './utils.js';\n\nconst hasDescriptors = utils.settings.hasDescriptors;\n\n// Find descriptor on the \"lowest\" native prototype. Safe as these are not\n// overridden and we call these on nodes.\nconst nativeProtos = [Node.prototype, Element.prototype, HTMLElement.prototype];\n// note, avoid Array.find for IE11 compat.\nfunction findNativeProtoWithDescriptor(name) {\n for (let i=0; i < nativeProtos.length; i++) {\n const proto = nativeProtos[i];\n if (proto.hasOwnProperty(name)) {\n return proto;\n }\n }\n}\nfunction findNodeDescriptor(name) {\n const proto = findNativeProtoWithDescriptor(name);\n if (!proto) {\n throw Error(`Could not find descriptor for ${name}`);\n }\n return Object.getOwnPropertyDescriptor(proto, name);\n}\n\nexport const nodeAccessors = hasDescriptors ? {\n parentNode: findNodeDescriptor('parentNode'),\n firstChild: findNodeDescriptor('firstChild'),\n lastChild: findNodeDescriptor('lastChild'),\n previousSibling: findNodeDescriptor('previousSibling'),\n nextSibling: findNodeDescriptor('nextSibling'),\n childNodes: findNodeDescriptor('childNodes'),\n parentElement: findNodeDescriptor('parentElement'),\n previousElementSibling: findNodeDescriptor('previousElementSibling'),\n nextElementSibling: findNodeDescriptor('nextElementSibling'),\n innerHTML: findNodeDescriptor('innerHTML'),\n textContent: findNodeDescriptor('textContent'),\n firstElementChild: findNodeDescriptor('firstElementChild'),\n lastElementChild: findNodeDescriptor('lastElementChild'),\n children: findNodeDescriptor('children'),\n} : {};\n\nexport const fragmentAccessors = hasDescriptors ? {\n firstElementChild: Object.getOwnPropertyDescriptor(\n DocumentFragment.prototype, 'firstElementChild'),\n lastElementChild: Object.getOwnPropertyDescriptor(\n DocumentFragment.prototype, 'lastElementChild'),\n children: Object.getOwnPropertyDescriptor(\n DocumentFragment.prototype, 'children')\n} : {};\n\nexport const documentAccessors = hasDescriptors ? {\n firstElementChild: Object.getOwnPropertyDescriptor(\n Document.prototype, 'firstElementChild'),\n lastElementChild: Object.getOwnPropertyDescriptor(\n Document.prototype, 'lastElementChild'),\n children: Object.getOwnPropertyDescriptor(\n Document.prototype, 'children')\n} : {};\n\nexport function parentNode(node) {\n return nodeAccessors.parentNode.get.call(node);\n}\n\nexport function firstChild(node) {\n return nodeAccessors.firstChild.get.call(node);\n}\n\nexport function lastChild(node) {\n return nodeAccessors.lastChild.get.call(node);\n}\n\nexport function previousSibling(node) {\n return nodeAccessors.previousSibling.get.call(node);\n}\n\nexport function nextSibling(node) {\n return nodeAccessors.nextSibling.get.call(node);\n}\n\nexport function childNodes(node) {\n return Array.prototype.slice.call(nodeAccessors.childNodes.get.call(node));\n}\n\nexport function parentElement(node) {\n return nodeAccessors.parentElement.get.call(node);\n}\n\nexport function previousElementSibling(node) {\n return nodeAccessors.previousElementSibling.get.call(node);\n}\n\nexport function nextElementSibling(node) {\n return nodeAccessors.nextElementSibling.get.call(node);\n}\n\nexport function innerHTML(node) {\n return nodeAccessors.innerHTML.get.call(node);\n}\n\nexport function textContent(node) {\n return nodeAccessors.textContent.get.call(node);\n}\n\nexport function children(node) {\n let children;\n switch (node.nodeType) {\n case Node.DOCUMENT_FRAGMENT_NODE:\n children = fragmentAccessors.children.get.call(node);\n break;\n case Node.DOCUMENT_NODE:\n children = documentAccessors.children.get.call(node);\n break;\n default:\n children = nodeAccessors.children.get.call(node);\n break;\n }\n return Array.prototype.slice.call(children);\n}\n\nexport function firstElementChild(node) {\n switch (node.nodeType) {\n case Node.DOCUMENT_FRAGMENT_NODE:\n return fragmentAccessors.firstElementChild.get.call(node);\n case Node.DOCUMENT_NODE:\n return documentAccessors.firstElementChild.get.call(node);\n default:\n return nodeAccessors.firstElementChild.get.call(node);\n }\n}\n\nexport function lastElementChild(node) {\n switch (node.nodeType) {\n case Node.DOCUMENT_FRAGMENT_NODE:\n return fragmentAccessors.lastElementChild.get.call(node);\n case Node.DOCUMENT_NODE:\n return documentAccessors.lastElementChild.get.call(node);\n default:\n return nodeAccessors.lastElementChild.get.call(node);\n }\n}","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as nativeTreeWalker from './native-tree-walker.js';\nimport * as nativeTreeAccessors from './native-tree-accessors.js';\nimport * as utils from './utils.js';\n\nexport const accessors = utils.settings.useNativeAccessors ?\n nativeTreeAccessors : nativeTreeWalker;","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\nimport {getInnerHTML} from './innerHTML.js';\nimport {accessors as nativeTree} from './native-tree.js';\nimport {nodeAccessors as nativeAccessors} from './native-tree-accessors.js';\nimport {contains as nativeContains} from './native-methods.js';\nimport {ensureShadyDataForNode, shadyDataForNode} from './shady-data.js';\n\nfunction clearNode(node) {\n while (node.firstChild) {\n node.removeChild(node.firstChild);\n }\n}\n\nconst hasDescriptors = utils.settings.hasDescriptors;\nconst inertDoc = document.implementation.createHTMLDocument('inert');\n\nconst nativeIsConnectedAccessors =\n/** @type {ObjectPropertyDescriptor} */(\n Object.getOwnPropertyDescriptor(Node.prototype, 'isConnected')\n);\n\nconst nativeIsConnected = nativeIsConnectedAccessors && nativeIsConnectedAccessors.get;\n\nconst nativeActiveElementDescriptor =\n /** @type {ObjectPropertyDescriptor} */(\n Object.getOwnPropertyDescriptor(Document.prototype, 'activeElement')\n );\nfunction getDocumentActiveElement() {\n if (nativeActiveElementDescriptor && nativeActiveElementDescriptor.get) {\n return nativeActiveElementDescriptor.get.call(document);\n } else if (!utils.settings.hasDescriptors) {\n return document.activeElement;\n }\n}\n\nfunction activeElementForNode(node) {\n let active = getDocumentActiveElement();\n // In IE11, activeElement might be an empty object if the document is\n // contained in an iframe.\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/10998788/\n if (!active || !active.nodeType) {\n return null;\n }\n let isShadyRoot = !!(utils.isShadyRoot(node));\n if (node !== document) {\n // If this node isn't a document or shady root, then it doesn't have\n // an active element.\n if (!isShadyRoot) {\n return null;\n }\n // If this shady root's host is the active element or the active\n // element is not a descendant of the host (in the composed tree),\n // then it doesn't have an active element.\n if (node.host === active ||\n !nativeContains.call(node.host, active)) {\n return null;\n }\n }\n // This node is either the document or a shady root of which the active\n // element is a (composed) descendant of its host; iterate upwards to\n // find the active element's most shallow host within it.\n let activeRoot = utils.ownerShadyRootForNode(active);\n while (activeRoot && activeRoot !== node) {\n active = activeRoot.host;\n activeRoot = utils.ownerShadyRootForNode(active);\n }\n if (node === document) {\n // This node is the document, so activeRoot should be null.\n return activeRoot ? null : active;\n } else {\n // This node is a non-document shady root, and it should be\n // activeRoot.\n return activeRoot === node ? active : null;\n }\n}\n\nlet OutsideAccessors = {\n\n parentElement: {\n /** @this {Node} */\n get() {\n const nodeData = shadyDataForNode(this);\n let l = nodeData && nodeData.parentNode;\n if (l && l.nodeType !== Node.ELEMENT_NODE) {\n l = null;\n }\n return l !== undefined ? l : nativeTree.parentElement(this);\n },\n configurable: true\n },\n\n parentNode: {\n /** @this {Node} */\n get() {\n const nodeData = shadyDataForNode(this);\n const l = nodeData && nodeData.parentNode;\n return l !== undefined ? l : nativeTree.parentNode(this);\n },\n configurable: true\n },\n\n nextSibling: {\n /** @this {Node} */\n get() {\n const nodeData = shadyDataForNode(this);\n const l = nodeData && nodeData.nextSibling;\n return l !== undefined ? l : nativeTree.nextSibling(this);\n },\n configurable: true\n },\n\n previousSibling: {\n /** @this {Node} */\n get() {\n const nodeData = shadyDataForNode(this);\n const l = nodeData && nodeData.previousSibling;\n return l !== undefined ? l : nativeTree.previousSibling(this);\n },\n configurable: true\n },\n\n // fragment, element, document\n nextElementSibling: {\n /**\n * @this {HTMLElement}\n */\n get() {\n const nodeData = shadyDataForNode(this);\n if (nodeData && nodeData.nextSibling !== undefined) {\n let n = this.nextSibling;\n while (n && n.nodeType !== Node.ELEMENT_NODE) {\n n = n.nextSibling;\n }\n return n;\n } else {\n return nativeTree.nextElementSibling(this);\n }\n },\n configurable: true\n },\n\n previousElementSibling: {\n /**\n * @this {HTMLElement}\n */\n get() {\n const nodeData = shadyDataForNode(this);\n if (nodeData && nodeData.previousSibling !== undefined) {\n let n = this.previousSibling;\n while (n && n.nodeType !== Node.ELEMENT_NODE) {\n n = n.previousSibling;\n }\n return n;\n } else {\n return nativeTree.previousElementSibling(this);\n }\n },\n configurable: true\n }\n\n};\n\nexport const ClassNameAccessor = {\n className: {\n /**\n * @this {HTMLElement}\n */\n get() {\n return this.getAttribute('class') || '';\n },\n /**\n * @this {HTMLElement}\n */\n set(value) {\n this.setAttribute('class', value);\n },\n configurable: true\n }\n}\n\nexport const IsConnectedAccessor = {\n\n isConnected: {\n /**\n * @this {Node}\n */\n get() {\n if (nativeIsConnected && nativeIsConnected.call(this)) {\n return true;\n }\n if (this.nodeType == Node.DOCUMENT_FRAGMENT_NODE) {\n return false;\n }\n // Fast path for distributed nodes.\n const ownerDocument = this.ownerDocument;\n if (utils.hasDocumentContains) {\n if (nativeContains.call(ownerDocument, this)) {\n return true;\n }\n } else if (ownerDocument.documentElement &&\n nativeContains.call(ownerDocument.documentElement, this)) {\n return true;\n }\n // Slow path for non-distributed nodes.\n let node = this;\n while (node && !(node instanceof Document)) {\n node = node.parentNode || (utils.isShadyRoot(node) ? /** @type {ShadowRoot} */(node).host : undefined);\n }\n return !!(node && node instanceof Document);\n },\n configurable: true\n }\n};\n\nlet InsideAccessors = {\n\n childNodes: {\n /**\n * @this {HTMLElement}\n */\n get() {\n let childNodes;\n if (utils.isTrackingLogicalChildNodes(this)) {\n const nodeData = shadyDataForNode(this);\n if (!nodeData.childNodes) {\n nodeData.childNodes = [];\n for (let n=this.firstChild; n; n=n.nextSibling) {\n nodeData.childNodes.push(n);\n }\n }\n childNodes = nodeData.childNodes;\n } else {\n childNodes = nativeTree.childNodes(this);\n }\n childNodes.item = function(index) {\n return childNodes[index];\n }\n return childNodes;\n },\n configurable: true\n },\n\n childElementCount: {\n /** @this {HTMLElement} */\n get() {\n return this.children.length;\n },\n configurable: true\n },\n\n firstChild: {\n /** @this {HTMLElement} */\n get() {\n const nodeData = shadyDataForNode(this);\n const l = nodeData && nodeData.firstChild;\n return l !== undefined ? l : nativeTree.firstChild(this);\n },\n configurable: true\n },\n\n lastChild: {\n /** @this {HTMLElement} */\n get() {\n const nodeData = shadyDataForNode(this);\n const l = nodeData && nodeData.lastChild;\n return l !== undefined ? l : nativeTree.lastChild(this);\n },\n configurable: true\n },\n\n textContent: {\n /**\n * @this {HTMLElement}\n */\n get() {\n if (utils.isTrackingLogicalChildNodes(this)) {\n let tc = [];\n for (let i = 0, cn = this.childNodes, c; (c = cn[i]); i++) {\n if (c.nodeType !== Node.COMMENT_NODE) {\n tc.push(c.textContent);\n }\n }\n return tc.join('');\n } else {\n return nativeTree.textContent(this);\n }\n },\n /**\n * @this {HTMLElement}\n * @param {string} text\n */\n set(text) {\n if (typeof text === 'undefined' || text === null) {\n text = ''\n }\n switch (this.nodeType) {\n case Node.ELEMENT_NODE:\n case Node.DOCUMENT_FRAGMENT_NODE:\n if (!utils.isTrackingLogicalChildNodes(this) && hasDescriptors) {\n // may be removing a nested slot but fast path if we know we are not.\n const firstChild = this.firstChild;\n if (firstChild != this.lastChild ||\n (firstChild && firstChild.nodeType != Node.TEXT_NODE)) {\n clearNode(this);\n }\n nativeAccessors.textContent.set.call(this, text);\n } else {\n clearNode(this);\n // Document fragments must have no childnodes if setting a blank string\n if (text.length > 0 || this.nodeType === Node.ELEMENT_NODE) {\n this.appendChild(document.createTextNode(text));\n }\n }\n break;\n default:\n // TODO(sorvell): can't do this if patch nodeValue.\n this.nodeValue = text;\n break;\n }\n },\n configurable: true\n },\n\n // fragment, element, document\n firstElementChild: {\n /**\n * @this {HTMLElement}\n */\n get() {\n const nodeData = shadyDataForNode(this);\n if (nodeData && nodeData.firstChild !== undefined) {\n let n = this.firstChild;\n while (n && n.nodeType !== Node.ELEMENT_NODE) {\n n = n.nextSibling;\n }\n return n;\n } else {\n return nativeTree.firstElementChild(this);\n }\n },\n configurable: true\n },\n\n lastElementChild: {\n /**\n * @this {HTMLElement}\n */\n get() {\n const nodeData = shadyDataForNode(this);\n if (nodeData && nodeData.lastChild !== undefined) {\n let n = this.lastChild;\n while (n && n.nodeType !== Node.ELEMENT_NODE) {\n n = n.previousSibling;\n }\n return n;\n } else {\n return nativeTree.lastElementChild(this);\n }\n },\n configurable: true\n },\n\n children: {\n /**\n * @this {HTMLElement}\n */\n get() {\n let children;\n if (utils.isTrackingLogicalChildNodes(this)) {\n children = Array.prototype.filter.call(this.childNodes, function(n) {\n return (n.nodeType === Node.ELEMENT_NODE);\n });\n } else {\n children = nativeTree.children(this);\n }\n children.item = function(index) {\n return children[index];\n }\n return children;\n },\n configurable: true\n },\n\n // element (HTMLElement on IE11)\n innerHTML: {\n /**\n * @this {HTMLElement}\n */\n get() {\n if (utils.isTrackingLogicalChildNodes(this)) {\n const content = this.localName === 'template' ?\n /** @type {HTMLTemplateElement} */(this).content : this;\n return getInnerHTML(content);\n } else {\n return nativeTree.innerHTML(this);\n }\n },\n /**\n * @this {HTMLElement}\n */\n set(text) {\n const content = this.localName === 'template' ?\n /** @type {HTMLTemplateElement} */(this).content : this;\n clearNode(content);\n let containerName = this.localName;\n // avoid creating a template so we don't have to pull nodes form `.content`\n if (!containerName || containerName === 'template') {\n containerName = 'div';\n }\n const htmlContainer = inertDoc.createElement(containerName);\n if (hasDescriptors) {\n nativeAccessors.innerHTML.set.call(htmlContainer, text);\n } else {\n htmlContainer.innerHTML = text;\n }\n while (htmlContainer.firstChild) {\n content.appendChild(htmlContainer.firstChild);\n }\n },\n configurable: true\n }\n\n};\n\n// Note: Can be patched on element prototype on all browsers.\n// Must be patched on instance on browsers that support native Shadow DOM\n// but do not have builtin accessors (old Chrome).\nexport let ShadowRootAccessor = {\n\n shadowRoot: {\n /**\n * @this {HTMLElement}\n */\n get() {\n const nodeData = shadyDataForNode(this);\n return nodeData && nodeData.publicRoot || null;\n },\n configurable: true\n }\n};\n\n// Note: Can be patched on document prototype on browsers with builtin accessors.\n// Must be patched separately on simulated ShadowRoot.\n// Must be patched as `_activeElement` on browsers without builtin accessors.\nexport let ActiveElementAccessor = {\n\n activeElement: {\n /**\n * @this {HTMLElement}\n */\n get() {\n return activeElementForNode(this);\n },\n /**\n * @this {HTMLElement}\n */\n set() {},\n configurable: true\n }\n\n};\n\n// patch a group of descriptors on an object only if it exists or if the `force`\n// argument is true.\n/**\n * @param {!Object} obj\n * @param {!Object} descriptors\n * @param {boolean=} force\n */\nfunction patchAccessorGroup(obj, descriptors, force) {\n for (let p in descriptors) {\n let objDesc = Object.getOwnPropertyDescriptor(obj, p);\n if ((objDesc && objDesc.configurable) ||\n (!objDesc && force)) {\n Object.defineProperty(obj, p, descriptors[p]);\n } else if (force) {\n console.warn('Could not define', p, 'on', obj); // eslint-disable-line no-console\n }\n }\n}\n\n// patch dom accessors on proto where they exist\nexport function patchAccessors(proto) {\n patchAccessorGroup(proto, OutsideAccessors);\n patchAccessorGroup(proto, ClassNameAccessor);\n patchAccessorGroup(proto, InsideAccessors);\n patchAccessorGroup(proto, ActiveElementAccessor);\n}\n\nexport function patchShadowRootAccessors(proto) {\n proto.__proto__ = DocumentFragment.prototype;\n // ensure element descriptors (IE/Edge don't have em)\n patchAccessorGroup(proto, OutsideAccessors, true);\n patchAccessorGroup(proto, InsideAccessors, true);\n patchAccessorGroup(proto, ActiveElementAccessor, true);\n // Ensure native properties are all safely wrapped since ShadowRoot is not an\n // actual DocumentFragment instance.\n Object.defineProperties(proto, {\n nodeType: {\n value: Node.DOCUMENT_FRAGMENT_NODE,\n configurable: true\n },\n nodeName: {\n value: '#document-fragment',\n configurable: true\n },\n nodeValue: {\n value: null,\n configurable: true\n }\n });\n // make undefined\n [\n 'localName',\n 'namespaceURI',\n 'prefix'\n ].forEach((prop) => {\n Object.defineProperty(proto, prop, {\n value: undefined,\n configurable: true\n });\n });\n // defer properties to host\n [\n 'ownerDocument',\n 'baseURI',\n 'isConnected'\n ].forEach((prop) => {\n Object.defineProperty(proto, prop, {\n get() {\n return this.host[prop];\n },\n configurable: true\n });\n });\n}\n\n// ensure an element has patched \"outside\" accessors; no-op when not needed\nexport let patchOutsideElementAccessors = utils.settings.hasDescriptors ?\n function() {} : function(element) {\n const sd = ensureShadyDataForNode(element);\n if (!sd.__outsideAccessors) {\n sd.__outsideAccessors = true;\n patchAccessorGroup(element, OutsideAccessors, true);\n patchAccessorGroup(element, ClassNameAccessor, true);\n }\n }\n\n// ensure an element has patched \"inside\" accessors; no-op when not needed\nexport let patchInsideElementAccessors = utils.settings.hasDescriptors ?\n function() {} : function(element) {\n const sd = ensureShadyDataForNode(element);\n if (!sd.__insideAccessors) {\n patchAccessorGroup(element, InsideAccessors, true);\n patchAccessorGroup(element, ShadowRootAccessor, true);\n }\n }\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport {calculateSplices} from './array-splice.js';\nimport * as utils from './utils.js';\nimport {enqueue} from './flush.js';\nimport {recordChildNodes} from './logical-tree.js';\nimport {removeChild, insertBefore, dispatchEvent} from './native-methods.js';\nimport {accessors} from './native-tree.js';\nimport {ensureShadyDataForNode, shadyDataForNode} from './shady-data.js';\n\nconst {parentNode, childNodes} = accessors;\n\n// Do not export this object. It must be passed as the first argument to the\n// ShadyRoot constructor in `attachShadow` to prevent the constructor from\n// throwing. This prevents the user from being able to manually construct a\n// ShadyRoot (i.e. `new ShadowRoot()`).\nconst ShadyRootConstructionToken = {};\n\nconst CATCHALL_NAME = '__catchall';\nconst SHADYROOT_NAME = 'ShadyRoot';\n\nconst MODE_CLOSED = 'closed';\n\nfunction ancestorList(node) {\n let ancestors = [];\n do {\n ancestors.unshift(node);\n } while ((node = node.parentNode));\n return ancestors;\n}\n\n/**\n * @constructor\n * @extends {ShadowRoot}\n */\nexport class ShadyRoot {\n\n constructor(token, host, options) {\n if (token !== ShadyRootConstructionToken) {\n throw new TypeError('Illegal constructor');\n }\n // NOTE: set a fake local name so this element can be\n // distinguished from a DocumentFragment when patching.\n // FF doesn't allow this to be `localName`\n this._localName = SHADYROOT_NAME;\n const c$ = childNodes(host);\n // root <=> host\n this.host = host;\n this._mode = options && options.mode;\n // logical dom setup\n recordChildNodes(host, c$);\n const hostData = shadyDataForNode(host);\n hostData.root = this;\n hostData.publicRoot = this._mode !== MODE_CLOSED ? this : null;\n // setup root\n const rootData = ensureShadyDataForNode(this);\n rootData.firstChild = rootData.lastChild =\n rootData.parentNode = rootData.nextSibling =\n rootData.previousSibling = null;\n rootData.childNodes = [];\n // state flags\n this._renderPending = false;\n this._hasRendered = false;\n // marsalled lazily\n this._slotList = null;\n this._slotMap = null;\n this._pendingSlots = null;\n // fast path initial render: remove existing physical dom.\n for (let i=0, l=c$.length; i < l; i++) {\n removeChild.call(host, c$[i])\n }\n }\n\n // async render\n _asyncRender() {\n if (!this._renderPending) {\n this._renderPending = true;\n enqueue(() => this._render());\n }\n }\n\n // returns the oldest renderPending ancestor root.\n _getRenderRoot() {\n let renderRoot;\n let root = this;\n while (root) {\n if (root._renderPending) {\n renderRoot = root;\n }\n root = root._rendererForHost();\n }\n return renderRoot;\n }\n\n // Returns the shadyRoot `this.host` if `this.host`\n // has children that require distribution.\n _rendererForHost() {\n let root = this.host.getRootNode();\n if (utils.isShadyRoot(root)) {\n let c$ = this.host.childNodes;\n for (let i=0, c; i < c$.length; i++) {\n c = c$[i];\n if (this._isInsertionPoint(c)) {\n return root;\n }\n }\n }\n }\n\n _render() {\n const root = this._getRenderRoot();\n if (root) {\n root['_renderRoot']();\n }\n }\n\n // NOTE: avoid renaming to ease testability.\n ['_renderRoot']() {\n this._renderPending = false;\n if (this._slotList) {\n this._distribute();\n this._compose();\n }\n this._hasRendered = true;\n }\n\n _distribute() {\n this._validateSlots();\n // capture # of previously assigned nodes to help determine if dirty.\n for (let i=0, slot; i < this._slotList.length; i++) {\n slot = this._slotList[i];\n this._clearSlotAssignedNodes(slot);\n }\n // distribute host children.\n for (let n=this.host.firstChild; n; n=n.nextSibling) {\n this._distributeNodeToSlot(n);\n }\n // fallback content, slotchange, and dirty roots\n for (let i=0; i < this._slotList.length; i++) {\n const slot = this._slotList[i];\n const slotData = shadyDataForNode(slot);\n // distribute fallback content\n if (!slotData.assignedNodes.length) {\n for (let n=slot.firstChild; n; n=n.nextSibling) {\n this._distributeNodeToSlot(n, slot);\n }\n }\n const slotParentData = shadyDataForNode(slot.parentNode);\n const slotParentRoot = slotParentData && slotParentData.root;\n if (slotParentRoot && slotParentRoot._hasInsertionPoint()) {\n slotParentRoot['_renderRoot']();\n }\n this._addAssignedToFlattenedNodes(slotData.flattenedNodes,\n slotData.assignedNodes);\n let prevAssignedNodes = slotData._previouslyAssignedNodes;\n if (prevAssignedNodes) {\n for (let i=0; i < prevAssignedNodes.length; i++) {\n shadyDataForNode(prevAssignedNodes[i])._prevAssignedSlot = null;\n }\n slotData._previouslyAssignedNodes = null;\n // dirty if previously less assigned nodes than previously assigned.\n if (prevAssignedNodes.length > slotData.assignedNodes.length) {\n slotData.dirty = true;\n }\n }\n /* Note: A slot is marked dirty whenever a node is newly assigned to it\n or a node is assigned to a different slot (done in `_distributeNodeToSlot`)\n or if the number of nodes assigned to the slot has decreased (done above);\n */\n if (slotData.dirty) {\n slotData.dirty = false;\n this._fireSlotChange(slot);\n }\n }\n }\n\n /**\n * Distributes given `node` to the appropriate slot based on its `slot`\n * attribute. If `forcedSlot` is given, then the node is distributed to the\n * `forcedSlot`.\n * Note: slot to which the node is assigned will be marked dirty for firing\n * `slotchange`.\n * @param {Node} node\n * @param {Node=} forcedSlot\n *\n */\n _distributeNodeToSlot(node, forcedSlot) {\n const nodeData = ensureShadyDataForNode(node);\n let oldSlot = nodeData._prevAssignedSlot;\n nodeData._prevAssignedSlot = null;\n let slot = forcedSlot;\n if (!slot) {\n let name = node.slot || CATCHALL_NAME;\n const list = this._slotMap[name];\n slot = list && list[0];\n }\n if (slot) {\n const slotData = ensureShadyDataForNode(slot);\n slotData.assignedNodes.push(node);\n nodeData.assignedSlot = slot;\n } else {\n nodeData.assignedSlot = undefined;\n }\n if (oldSlot !== nodeData.assignedSlot) {\n if (nodeData.assignedSlot) {\n ensureShadyDataForNode(nodeData.assignedSlot).dirty = true;\n }\n }\n }\n\n /**\n * Clears the assignedNodes tracking data for a given `slot`. Note, the current\n * assigned node data is tracked (via _previouslyAssignedNodes and\n * _prevAssignedSlot) to see if `slotchange` should fire. This data may be out\n * of date at this time because the assigned nodes may have already been\n * distributed to another root. This is ok since this data is only used to\n * track changes.\n * @param {HTMLSlotElement} slot\n */\n _clearSlotAssignedNodes(slot) {\n const slotData = shadyDataForNode(slot);\n let n$ = slotData.assignedNodes;\n slotData.assignedNodes = [];\n slotData.flattenedNodes = [];\n slotData._previouslyAssignedNodes = n$;\n if (n$) {\n for (let i=0; i < n$.length; i++) {\n let n = shadyDataForNode(n$[i]);\n n._prevAssignedSlot = n.assignedSlot;\n // only clear if it was previously set to this slot;\n // this helps ensure that if the node has otherwise been distributed\n // ignore it.\n if (n.assignedSlot === slot) {\n n.assignedSlot = null;\n }\n }\n }\n }\n\n _addAssignedToFlattenedNodes(flattened, assigned) {\n for (let i=0, n; (i<assigned.length) && (n=assigned[i]); i++) {\n if (n.localName == 'slot') {\n const nestedAssigned = shadyDataForNode(n).assignedNodes;\n if (nestedAssigned && nestedAssigned.length) {\n this._addAssignedToFlattenedNodes(flattened, nestedAssigned);\n }\n } else {\n flattened.push(assigned[i]);\n }\n }\n }\n\n _fireSlotChange(slot) {\n // NOTE: cannot bubble correctly here so not setting bubbles: true\n // Safari tech preview does not bubble but chrome does\n // Spec says it bubbles (https://dom.spec.whatwg.org/#mutation-observers)\n dispatchEvent.call(slot, new Event('slotchange'));\n const slotData = shadyDataForNode(slot);\n if (slotData.assignedSlot) {\n this._fireSlotChange(slotData.assignedSlot);\n }\n }\n\n // Reify dom such that it is at its correct rendering position\n // based on logical distribution.\n // NOTE: here we only compose parents of <slot> elements and not the\n // shadowRoot into the host. The latter is performend via a fast path\n // in the `logical-mutation`.insertBefore.\n _compose() {\n const slots = this._slotList;\n let composeList = [];\n for (let i=0; i < slots.length; i++) {\n const parent = slots[i].parentNode;\n /* compose node only if:\n (1) parent does not have a shadowRoot since shadowRoot has already\n composed into the host\n (2) we're not already composing it\n [consider (n^2) but rare better than Set]\n */\n const parentData = shadyDataForNode(parent);\n if (!(parentData && parentData.root) &&\n composeList.indexOf(parent) < 0) {\n composeList.push(parent);\n }\n }\n for (let i=0; i < composeList.length; i++) {\n const node = composeList[i];\n const targetNode = node === this ? this.host : node;\n this._updateChildNodes(targetNode, this._composeNode(node));\n }\n }\n\n // Returns the list of nodes which should be rendered inside `node`.\n _composeNode(node) {\n let children = [];\n let c$ = node.childNodes;\n for (let i = 0; i < c$.length; i++) {\n let child = c$[i];\n // Note: if we see a slot here, the nodes are guaranteed to need to be\n // composed here. This is because if there is redistribution, it has\n // already been handled by this point.\n if (this._isInsertionPoint(child)) {\n let flattenedNodes = shadyDataForNode(child).flattenedNodes;\n for (let j = 0; j < flattenedNodes.length; j++) {\n let distributedNode = flattenedNodes[j];\n children.push(distributedNode);\n }\n } else {\n children.push(child);\n }\n }\n return children;\n }\n\n _isInsertionPoint(node) {\n return node.localName == 'slot';\n }\n\n // Ensures that the rendered node list inside `container` is `children`.\n _updateChildNodes(container, children) {\n let composed = childNodes(container);\n let splices = calculateSplices(children, composed);\n // process removals\n for (let i=0, d=0, s; (i<splices.length) && (s=splices[i]); i++) {\n for (let j=0, n; (j < s.removed.length) && (n=s.removed[j]); j++) {\n // check if the node is still where we expect it is before trying\n // to remove it; this can happen if we move a node and\n // then schedule its previous host for distribution resulting in\n // the node being removed here.\n if (parentNode(n) === container) {\n removeChild.call(container, n);\n }\n // TODO(sorvell): avoid the need for splicing here.\n composed.splice(s.index + d, 1);\n }\n d -= s.addedCount;\n }\n // process adds\n for (let i=0, s, next; (i<splices.length) && (s=splices[i]); i++) { //eslint-disable-line no-redeclare\n next = composed[s.index];\n for (let j=s.index, n; j < s.index + s.addedCount; j++) {\n n = children[j];\n insertBefore.call(container, n, next);\n composed.splice(j, 0, n);\n }\n }\n }\n\n _ensureSlotData() {\n this._pendingSlots = this._pendingSlots || [];\n this._slotList = this._slotList || [];\n this._slotMap = this._slotMap || {};\n }\n\n _addSlots(slots) {\n this._ensureSlotData();\n this._pendingSlots.push(...slots);\n }\n\n _validateSlots() {\n if (this._pendingSlots && this._pendingSlots.length) {\n this._mapSlots(this._pendingSlots);\n this._pendingSlots = [];\n }\n }\n\n /**\n * Adds the given slots. Slots are maintained in an dom-ordered list.\n * In addition a map of name to slot is updated.\n */\n _mapSlots(slots) {\n let slotNamesToSort;\n for (let i=0; i < slots.length; i++) {\n let slot = slots[i];\n // ensure insertionPoints's and their parents have logical dom info.\n // save logical tree info\n // a. for shadyRoot\n // b. for insertion points (fallback)\n // c. for parents of insertion points\n recordChildNodes(slot);\n recordChildNodes(slot.parentNode);\n let name = this._nameForSlot(slot);\n if (this._slotMap[name]) {\n slotNamesToSort = slotNamesToSort || {};\n slotNamesToSort[name] = true;\n this._slotMap[name].push(slot);\n } else {\n this._slotMap[name] = [slot];\n }\n this._slotList.push(slot);\n }\n if (slotNamesToSort) {\n for (let n in slotNamesToSort) {\n this._slotMap[n] = this._sortSlots(this._slotMap[n]);\n }\n }\n }\n\n _nameForSlot(slot) {\n const name = slot['name'] || slot.getAttribute('name') || CATCHALL_NAME;\n slot.__slotName = name;\n return name;\n }\n\n /**\n * Slots are kept in an ordered list. Slots with the same name\n * are sorted here by tree order.\n */\n _sortSlots(slots) {\n // NOTE: Cannot use `compareDocumentPosition` because it's not polyfilled,\n // but the code here could be used to polyfill the preceeding/following info\n // in `compareDocumentPosition`.\n return slots.sort((a, b) => {\n let listA = ancestorList(a);\n let listB = ancestorList(b);\n for (var i=0; i < listA.length; i++) {\n let nA = listA[i];\n let nB = listB[i];\n if (nA !== nB) {\n let c$ = Array.from(nA.parentNode.childNodes);\n return c$.indexOf(nA) - c$.indexOf(nB);\n }\n }\n });\n }\n\n /**\n * Removes from tracked slot data any slots contained within `container` and\n * then updates the tracked data (_slotList and _slotMap).\n * Any removed slots also have their `assignedNodes` removed from comopsed dom.\n */\n _removeContainedSlots(container) {\n if (!this._slotList) {\n return;\n }\n this._validateSlots();\n let didRemove;\n const map = this._slotMap;\n for (let n in map) {\n let slots = map[n];\n for (let i=0; i < slots.length; i++) {\n let slot = slots[i];\n if (utils.contains(container, slot)) {\n slots.splice(i, 1);\n const x = this._slotList.indexOf(slot);\n if (x >= 0) {\n this._slotList.splice(x, 1);\n }\n i--;\n this._removeFlattenedNodes(slot);\n didRemove = true;\n }\n }\n }\n return didRemove;\n }\n\n _updateSlotName(slot) {\n if (!this._slotList) {\n return;\n }\n const oldName = slot.__slotName;\n const name = this._nameForSlot(slot);\n if (name === oldName) {\n return;\n }\n // remove from existing tracking\n let slots = this._slotMap[oldName];\n const i = slots.indexOf(slot);\n if (i >= 0) {\n slots.splice(i, 1);\n }\n // add to new location and sort if nedessary\n let list = this._slotMap[name] || (this._slotMap[name] = []);\n list.push(slot);\n if (list.length > 1) {\n this._slotMap[name] = this._sortSlots(list);\n }\n }\n\n _removeFlattenedNodes(slot) {\n const data = shadyDataForNode(slot);\n let n$ = data.flattenedNodes;\n if (n$) {\n for (let i=0; i<n$.length; i++) {\n let node = n$[i];\n let parent = parentNode(node);\n if (parent) {\n removeChild.call(parent, node);\n }\n }\n }\n data.flattenedNodes = [];\n data.assignedNodes = [];\n }\n\n _hasInsertionPoint() {\n this._validateSlots();\n return Boolean(this._slotList && this._slotList.length);\n }\n}\n\n/**\n Implements a pared down version of ShadowDOM's scoping, which is easy to\n polyfill across browsers.\n*/\nexport function attachShadow(host, options) {\n if (!host) {\n throw 'Must provide a host.';\n }\n if (!options) {\n throw 'Not enough arguments.'\n }\n return new ShadyRoot(ShadyRootConstructionToken, host, options);\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\nimport {flush} from './flush.js';\nimport {dispatchEvent, querySelectorAll} from './native-methods.js';\nimport * as mutation from './logical-mutation.js';\nimport {ActiveElementAccessor, ShadowRootAccessor, patchAccessors, patchShadowRootAccessors, IsConnectedAccessor} from './patch-accessors.js';\nimport {addEventListener, removeEventListener} from './patch-events.js';\nimport {attachShadow, ShadyRoot} from './attach-shadow.js';\nimport {shadyDataForNode} from './shady-data.js';\n\nfunction getAssignedSlot(node) {\n mutation.renderRootNode(node);\n const nodeData = shadyDataForNode(node);\n return nodeData && nodeData.assignedSlot || null;\n}\n\nlet windowMixin = {\n\n // NOTE: ensure these methods are bound to `window` so that `this` is correct\n // when called directly from global context without a receiver; e.g.\n // `addEventListener(...)`.\n addEventListener: addEventListener.bind(window),\n\n removeEventListener: removeEventListener.bind(window)\n\n};\n\nlet nodeMixin = {\n\n addEventListener: addEventListener,\n\n removeEventListener: removeEventListener,\n\n appendChild(node) {\n return mutation.insertBefore(this, node);\n },\n\n insertBefore(node, ref_node) {\n return mutation.insertBefore(this, node, ref_node);\n },\n\n removeChild(node) {\n return mutation.removeChild(this, node);\n },\n\n /**\n * @this {Node}\n */\n replaceChild(node, ref_node) {\n mutation.insertBefore(this, node, ref_node);\n mutation.removeChild(this, ref_node);\n return node;\n },\n\n /**\n * @this {Node}\n */\n cloneNode(deep) {\n return mutation.cloneNode(this, deep);\n },\n\n /**\n * @this {Node}\n */\n getRootNode(options) {\n return mutation.getRootNode(this, options);\n },\n\n contains(node) {\n return utils.contains(this, node);\n },\n\n /**\n * @this {Node}\n */\n dispatchEvent(event) {\n flush();\n return dispatchEvent.call(this, event);\n }\n\n};\n\n// NOTE: we can do this regardless of the browser supporting native accessors\n// since this is always \"new\" in that case.\nObject.defineProperties(nodeMixin, IsConnectedAccessor);\n\n// NOTE: For some reason 'Text' redefines 'assignedSlot'\nlet textMixin = {\n /**\n * @this {Text}\n */\n get assignedSlot() {\n return getAssignedSlot(this);\n }\n};\n\nlet fragmentMixin = {\n\n // TODO(sorvell): consider doing native QSA and filtering results.\n /**\n * @this {DocumentFragment}\n */\n querySelector(selector) {\n // match selector and halt on first result.\n let result = mutation.query(this, function(n) {\n return utils.matchesSelector(n, selector);\n }, function(n) {\n return Boolean(n);\n })[0];\n return result || null;\n },\n\n /**\n * @this {DocumentFragment}\n */\n // TODO(sorvell): `useNative` option relies on native querySelectorAll and\n // misses distributed nodes, see\n // https://github.com/webcomponents/shadydom/pull/210#issuecomment-361435503\n querySelectorAll(selector, useNative) {\n if (useNative) {\n const o = Array.prototype.slice.call(querySelectorAll(this, selector));\n const root = this.getRootNode();\n return o.filter(e => e.getRootNode() == root);\n }\n return mutation.query(this, function(n) {\n return utils.matchesSelector(n, selector);\n });\n }\n\n};\n\nlet slotMixin = {\n\n /**\n * @this {HTMLSlotElement}\n */\n assignedNodes(options) {\n if (this.localName === 'slot') {\n mutation.renderRootNode(this);\n const nodeData = shadyDataForNode(this);\n return nodeData ?\n ((options && options.flatten ? nodeData.flattenedNodes :\n nodeData.assignedNodes) || []) :\n [];\n }\n }\n\n};\n\nlet elementMixin = utils.extendAll({\n\n /**\n * @this {HTMLElement}\n */\n setAttribute(name, value) {\n mutation.setAttribute(this, name, value);\n },\n\n /**\n * @this {HTMLElement}\n */\n removeAttribute(name) {\n mutation.removeAttribute(this, name);\n },\n\n /**\n * @this {HTMLElement}\n */\n attachShadow(options) {\n return attachShadow(this, options);\n },\n\n /**\n * @this {HTMLElement}\n */\n get slot() {\n return this.getAttribute('slot');\n },\n\n /**\n * @this {HTMLElement}\n */\n set slot(value) {\n mutation.setAttribute(this, 'slot', value);\n },\n\n /**\n * @this {HTMLElement}\n */\n get assignedSlot() {\n return getAssignedSlot(this);\n }\n\n}, fragmentMixin, slotMixin);\n\nObject.defineProperties(elementMixin, ShadowRootAccessor);\n\nlet documentMixin = utils.extendAll({\n /**\n * @this {Document}\n */\n importNode(node, deep) {\n return mutation.importNode(node, deep);\n },\n\n /**\n * @this {Document}\n */\n getElementById(id) {\n let result = mutation.query(this, function(n) {\n return n.id == id;\n }, function(n) {\n return Boolean(n);\n })[0];\n return result || null;\n }\n\n}, fragmentMixin);\n\nObject.defineProperties(documentMixin, {\n '_activeElement': ActiveElementAccessor.activeElement\n});\n\nlet nativeBlur = HTMLElement.prototype.blur;\n\nlet htmlElementMixin = utils.extendAll({\n /**\n * @this {HTMLElement}\n */\n blur() {\n const nodeData = shadyDataForNode(this);\n let root = nodeData && nodeData.root;\n let shadowActive = root && root.activeElement;\n if (shadowActive) {\n shadowActive.blur();\n } else {\n nativeBlur.call(this);\n }\n }\n});\n\nconst shadowRootMixin = {\n addEventListener(type, fn, optionsOrCapture) {\n if (typeof optionsOrCapture !== 'object') {\n optionsOrCapture = {\n capture: Boolean(optionsOrCapture)\n }\n }\n optionsOrCapture.__shadyTarget = this;\n this.host.addEventListener(type, fn, optionsOrCapture);\n },\n\n removeEventListener(type, fn, optionsOrCapture) {\n if (typeof optionsOrCapture !== 'object') {\n optionsOrCapture = {\n capture: Boolean(optionsOrCapture)\n }\n }\n optionsOrCapture.__shadyTarget = this;\n this.host.removeEventListener(type, fn, optionsOrCapture);\n },\n\n getElementById(id) {\n let result = mutation.query(this, function(n) {\n return n.id == id;\n }, function(n) {\n return Boolean(n);\n })[0];\n return result || null;\n }\n}\n\nfunction patchBuiltin(proto, obj) {\n let n$ = Object.getOwnPropertyNames(obj);\n for (let i=0; i < n$.length; i++) {\n let n = n$[i];\n let d = Object.getOwnPropertyDescriptor(obj, n);\n // NOTE: we prefer writing directly here because some browsers\n // have descriptors that are writable but not configurable (e.g.\n // `appendChild` on older browsers)\n if (d.value) {\n proto[n] = d.value;\n } else {\n Object.defineProperty(proto, n, d);\n }\n }\n}\n\n// Apply patches to builtins (e.g. Element.prototype). Some of these patches\n// can be done unconditionally (mostly methods like\n// `Element.prototype.appendChild`) and some can only be done when the browser\n// has proper descriptors on the builtin prototype\n// (e.g. `Element.prototype.firstChild`)`. When descriptors are not available,\n// elements are individually patched when needed (see e.g.\n// `patchInside/OutsideElementAccessors` in `patch-accessors.js`).\nexport function patchBuiltins() {\n let nativeHTMLElement =\n (window['customElements'] && window['customElements']['nativeHTMLElement']) ||\n HTMLElement;\n // These patches can always be done, for all supported browsers.\n patchBuiltin(ShadyRoot.prototype, shadowRootMixin);\n patchBuiltin(window.Node.prototype, nodeMixin);\n patchBuiltin(window.Window.prototype, windowMixin);\n patchBuiltin(window.Text.prototype, textMixin);\n patchBuiltin(window.DocumentFragment.prototype, fragmentMixin);\n patchBuiltin(window.Element.prototype, elementMixin);\n patchBuiltin(window.Document.prototype, documentMixin);\n if (window.HTMLSlotElement) {\n patchBuiltin(window.HTMLSlotElement.prototype, slotMixin);\n }\n patchBuiltin(nativeHTMLElement.prototype, htmlElementMixin);\n // These patches can *only* be done\n // on browsers that have proper property descriptors on builtin prototypes.\n // This includes: IE11, Edge, Chrome >= 4?; Safari >= 10, Firefox\n // On older browsers (Chrome <= 4?, Safari 9), a per element patching\n // strategy is used for patching accessors.\n if (utils.settings.hasDescriptors) {\n patchAccessors(window.Node.prototype);\n patchAccessors(window.Text.prototype);\n patchAccessors(window.DocumentFragment.prototype);\n patchAccessors(window.Element.prototype);\n patchAccessors(nativeHTMLElement.prototype);\n patchAccessors(window.Document.prototype);\n if (window.HTMLSlotElement) {\n patchAccessors(window.HTMLSlotElement.prototype);\n }\n }\n patchShadowRootAccessors(ShadyRoot.prototype);\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport {patchInsideElementAccessors, patchOutsideElementAccessors} from './patch-accessors.js';\nimport {accessors} from './native-tree.js';\nimport {ensureShadyDataForNode, shadyDataForNode} from './shady-data.js';\n\nconst {childNodes} = accessors;\n\nexport function recordInsertBefore(node, container, ref_node) {\n patchInsideElementAccessors(container);\n const containerData = ensureShadyDataForNode(container);\n if (containerData.firstChild !== undefined) {\n containerData.childNodes = null;\n }\n // handle document fragments\n if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n let c$ = node.childNodes;\n for (let i=0; i < c$.length; i++) {\n linkNode(c$[i], container, ref_node);\n }\n // cleanup logical dom in doc fragment.\n const nodeData = ensureShadyDataForNode(node);\n let resetTo = (nodeData.firstChild !== undefined) ? null : undefined;\n nodeData.firstChild = nodeData.lastChild = resetTo;\n nodeData.childNodes = resetTo;\n } else {\n linkNode(node, container, ref_node);\n }\n}\n\nfunction linkNode(node, container, ref_node) {\n patchOutsideElementAccessors(node);\n ref_node = ref_node || null;\n const nodeData = ensureShadyDataForNode(node);\n const containerData = ensureShadyDataForNode(container);\n const ref_nodeData = ref_node ? ensureShadyDataForNode(ref_node) : null;\n // update ref_node.previousSibling <-> node\n nodeData.previousSibling = ref_node ? ref_nodeData.previousSibling :\n container.lastChild;\n let psd = shadyDataForNode(nodeData.previousSibling);\n if (psd) {\n psd.nextSibling = node;\n }\n // update node <-> ref_node\n let nsd = shadyDataForNode(nodeData.nextSibling = ref_node);\n if (nsd) {\n nsd.previousSibling = node;\n }\n // update node <-> container\n nodeData.parentNode = container;\n if (ref_node) {\n if (ref_node === containerData.firstChild) {\n containerData.firstChild = node;\n }\n } else {\n containerData.lastChild = node;\n if (!containerData.firstChild) {\n containerData.firstChild = node;\n }\n }\n // remove caching of childNodes\n containerData.childNodes = null;\n}\n\nexport function recordRemoveChild(node, container) {\n const nodeData = ensureShadyDataForNode(node);\n const containerData = ensureShadyDataForNode(container);\n if (node === containerData.firstChild) {\n containerData.firstChild = nodeData.nextSibling;\n }\n if (node === containerData.lastChild) {\n containerData.lastChild = nodeData.previousSibling;\n }\n let p = nodeData.previousSibling;\n let n = nodeData.nextSibling;\n if (p) {\n ensureShadyDataForNode(p).nextSibling = n;\n }\n if (n) {\n ensureShadyDataForNode(n).previousSibling = p;\n }\n // When an element is removed, logical data is no longer tracked.\n // Explicitly set `undefined` here to indicate this. This is disginguished\n // from `null` which is set if info is null.\n nodeData.parentNode = nodeData.previousSibling =\n nodeData.nextSibling = undefined;\n if (containerData.childNodes !== undefined) {\n // remove caching of childNodes\n containerData.childNodes = null;\n }\n}\n\nexport let recordChildNodes = function(node, nodes) {\n const nodeData = ensureShadyDataForNode(node);\n if (nodeData.firstChild === undefined) {\n const c$ = nodes || childNodes(node);\n nodeData.firstChild = c$[0] || null;\n nodeData.lastChild = c$[c$.length-1] || null;\n patchInsideElementAccessors(node);\n for (let i=0; i<c$.length; i++) {\n const n = c$[i];\n const sd = ensureShadyDataForNode(n);\n sd.parentNode = node;\n sd.nextSibling = c$[i+1] || null;\n sd.previousSibling = c$[i-1] || null;\n patchOutsideElementAccessors(n);\n }\n }\n}","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\nimport * as logicalTree from './logical-tree.js';\nimport * as nativeMethods from './native-methods.js';\nimport {accessors} from './native-tree.js';\nimport {ensureShadyDataForNode, shadyDataForNode} from './shady-data.js';\n\nconst {parentNode} = accessors;\n\n// Patched `insertBefore`. Note that all mutations that add nodes are routed\n// here. When a <slot> is added or a node is added to a host with a shadowRoot\n// with a slot, a standard dom `insert` call is aborted and `_asyncRender`\n// is called on the relevant shadowRoot. In all other cases, a standard dom\n// `insert` can be made, but the location and ref_node may need to be changed.\n/**\n * @param {Node} parent\n * @param {Node} node\n * @param {Node=} ref_node\n */\nexport function insertBefore(parent, node, ref_node) {\n if (node === parent) {\n throw Error(`Failed to execute 'appendChild' on 'Node': The new child element contains the parent.`);\n }\n if (ref_node) {\n const refData = shadyDataForNode(ref_node);\n const p = refData && refData.parentNode;\n if ((p !== undefined && p !== parent) ||\n (p === undefined && parentNode(ref_node) !== parent)) {\n throw Error(`Failed to execute 'insertBefore' on 'Node': The node ` +\n `before which the new node is to be inserted is not a child of this node.`);\n }\n }\n if (ref_node === node) {\n return node;\n }\n // remove from existing location\n if (node.parentNode) {\n // NOTE: avoid node.removeChild as this *can* trigger another patched\n // method (e.g. custom elements) and we want only the shady method to run.\n removeChild(node.parentNode, node);\n }\n // add to new parent\n let preventNativeInsert;\n let ownerRoot;\n let slotsAdded;\n if (!node['__noInsertionPoint']) {\n ownerRoot = utils.ownerShadyRootForNode(parent);\n slotsAdded = ownerRoot && findContainedSlots(node);\n if (slotsAdded) {\n ownerRoot._addSlots(slotsAdded);\n }\n }\n // if a slot is added, must render containing root.\n if (parent.localName === 'slot' || slotsAdded) {\n ownerRoot = ownerRoot || utils.ownerShadyRootForNode(parent);\n if (ownerRoot) {\n ownerRoot._asyncRender();\n }\n }\n if (utils.isTrackingLogicalChildNodes(parent)) {\n logicalTree.recordInsertBefore(node, parent, ref_node);\n // when inserting into a host with a shadowRoot with slot, use\n // `shadowRoot._asyncRender()` via `attach-shadow` module\n const parentData = shadyDataForNode(parent);\n if (hasShadowRootWithSlot(parent)) {\n parentData.root._asyncRender();\n preventNativeInsert = true;\n // when inserting into a host with shadowRoot with NO slot, do nothing\n // as the node should not be added to composed dome anywhere.\n } else if (parentData.root) {\n preventNativeInsert = true;\n }\n }\n if (!preventNativeInsert) {\n // if adding to a shadyRoot, add to host instead\n let container = utils.isShadyRoot(parent) ?\n /** @type {ShadowRoot} */(parent).host : parent;\n // if ref_node, get the ref_node that's actually in composed dom.\n if (ref_node) {\n ref_node = firstComposedNode(ref_node);\n nativeMethods.insertBefore.call(container, node, ref_node);\n } else {\n nativeMethods.appendChild.call(container, node);\n }\n }\n scheduleObserver(parent, node);\n return node;\n}\n\nfunction findContainedSlots(node) {\n let slots;\n if (node.localName === 'slot') {\n slots = [node];\n } else if (node.querySelectorAll) {\n slots = node.querySelectorAll('slot');\n }\n if (slots && slots.length) {\n return slots;\n }\n}\n\n/**\n * Patched `removeChild`. Note that all dom \"removals\" are routed here.\n * Removes the given `node` from the element's `children`.\n * This method also performs dom composition.\n * @param {Node} parent\n * @param {Node} node\n*/\nexport function removeChild(parent, node) {\n if (node.parentNode !== parent) {\n throw Error('The node to be removed is not a child of this node: ' +\n node);\n }\n let preventNativeRemove;\n let ownerRoot = utils.ownerShadyRootForNode(node);\n let removingInsertionPoint;\n const parentData = shadyDataForNode(parent);\n if (utils.isTrackingLogicalChildNodes(parent)) {\n logicalTree.recordRemoveChild(node, parent);\n if (hasShadowRootWithSlot(parent)) {\n parentData.root._asyncRender();\n preventNativeRemove = true;\n }\n }\n removeOwnerShadyRoot(node);\n // if removing slot, must render containing root\n if (ownerRoot) {\n let changeSlotContent = parent && parent.localName === 'slot';\n if (changeSlotContent) {\n preventNativeRemove = true;\n }\n removingInsertionPoint = ownerRoot._removeContainedSlots(node);\n if (removingInsertionPoint || changeSlotContent) {\n ownerRoot._asyncRender();\n }\n }\n if (!preventNativeRemove) {\n // if removing from a shadyRoot, remove form host instead\n let container = utils.isShadyRoot(parent) ?\n /** @type {ShadowRoot} */(parent).host :\n parent;\n // not guaranteed to physically be in container; e.g.\n // (1) if parent has a shadyRoot, element may or may not at distributed\n // location (could be undistributed)\n // (2) if parent is a slot, element may not ben in composed dom\n if (!(parentData.root || node.localName === 'slot') ||\n (container === parentNode(node))) {\n nativeMethods.removeChild.call(container, node);\n }\n }\n scheduleObserver(parent, null, node);\n return node;\n}\n\nfunction removeOwnerShadyRoot(node) {\n // optimization: only reset the tree if node is actually in a root\n if (hasCachedOwnerRoot(node)) {\n let c$ = node.childNodes;\n for (let i=0, l=c$.length, n; (i<l) && (n=c$[i]); i++) {\n removeOwnerShadyRoot(n);\n }\n }\n const nodeData = shadyDataForNode(node);\n if (nodeData) {\n nodeData.ownerShadyRoot = undefined;\n }\n}\n\nfunction hasCachedOwnerRoot(node) {\n const nodeData = shadyDataForNode(node);\n return Boolean(nodeData && nodeData.ownerShadyRoot !== undefined);\n}\n\n/**\n * Finds the first flattened node that is composed in the node's parent.\n * If the given node is a slot, then the first flattened node is returned\n * if it exists, otherwise advance to the node's nextSibling.\n * @param {Node} node within which to find first composed node\n * @returns {Node} first composed node\n */\nfunction firstComposedNode(node) {\n let composed = node;\n if (node && node.localName === 'slot') {\n const nodeData = shadyDataForNode(node);\n const flattened = nodeData && nodeData.flattenedNodes;\n composed = flattened && flattened.length ? flattened[0] :\n firstComposedNode(node.nextSibling);\n }\n return composed;\n}\n\nfunction hasShadowRootWithSlot(node) {\n const nodeData = shadyDataForNode(node);\n let root = nodeData && nodeData.root;\n return (root && root._hasInsertionPoint());\n}\n\n/**\n * Should be called whenever an attribute changes. If the `slot` attribute\n * changes, provokes rendering if necessary. If a `<slot>` element's `name`\n * attribute changes, updates the root's slot map and renders.\n * @param {Node} node\n * @param {string} name\n */\nfunction distributeAttributeChange(node, name) {\n if (name === 'slot') {\n const parent = node.parentNode;\n if (hasShadowRootWithSlot(parent)) {\n shadyDataForNode(parent).root._asyncRender();\n }\n } else if (node.localName === 'slot' && name === 'name') {\n let root = utils.ownerShadyRootForNode(node);\n if (root) {\n root._updateSlotName(node);\n root._asyncRender();\n }\n }\n}\n\n/**\n * @param {Node} node\n * @param {Node=} addedNode\n * @param {Node=} removedNode\n */\nfunction scheduleObserver(node, addedNode, removedNode) {\n const nodeData = shadyDataForNode(node);\n const observer = nodeData && nodeData.observer;\n if (observer) {\n if (addedNode) {\n observer.addedNodes.push(addedNode);\n }\n if (removedNode) {\n observer.removedNodes.push(removedNode);\n }\n observer.schedule();\n }\n}\n\n/**\n * @param {Node} node\n * @param {Object=} options\n */\nexport function getRootNode(node, options) { // eslint-disable-line no-unused-vars\n if (!node || !node.nodeType) {\n return;\n }\n const nodeData = ensureShadyDataForNode(node);\n let root = nodeData.ownerShadyRoot;\n if (root === undefined) {\n if (utils.isShadyRoot(node)) {\n root = node;\n nodeData.ownerShadyRoot = root;\n } else {\n let parent = node.parentNode;\n root = parent ? getRootNode(parent) : node;\n // memo-ize result for performance but only memo-ize\n // result if node is in the document. This avoids a problem where a root\n // can be cached while an element is inside a fragment.\n // If this happens and we cache the result, the value can become stale\n // because for perf we avoid processing the subtree of added fragments.\n if (nativeMethods.contains.call(document.documentElement, node)) {\n nodeData.ownerShadyRoot = root;\n }\n }\n\n }\n return root;\n}\n\n// NOTE: `query` is used primarily for ShadyDOM's querySelector impl,\n// but it's also generally useful to recurse through the element tree\n// and is used by Polymer's styling system.\n/**\n * @param {Node} node\n * @param {Function} matcher\n * @param {Function=} halter\n */\nexport function query(node, matcher, halter) {\n let list = [];\n queryElements(node.childNodes, matcher,\n halter, list);\n return list;\n}\n\nfunction queryElements(elements, matcher, halter, list) {\n for (let i=0, l=elements.length, c; (i<l) && (c=elements[i]); i++) {\n if (c.nodeType === Node.ELEMENT_NODE &&\n queryElement(c, matcher, halter, list)) {\n return true;\n }\n }\n}\n\nfunction queryElement(node, matcher, halter, list) {\n let result = matcher(node);\n if (result) {\n list.push(node);\n }\n if (halter && halter(result)) {\n return result;\n }\n queryElements(node.childNodes, matcher,\n halter, list);\n}\n\nexport function renderRootNode(element) {\n var root = element.getRootNode();\n if (utils.isShadyRoot(root)) {\n root._render();\n }\n}\n\nlet scopingShim = null;\n\nexport function setAttribute(node, attr, value) {\n if (!scopingShim) {\n scopingShim = window['ShadyCSS'] && window['ShadyCSS']['ScopingShim'];\n }\n if (scopingShim && attr === 'class') {\n scopingShim['setElementClass'](node, value);\n } else {\n nativeMethods.setAttribute.call(node, attr, value);\n distributeAttributeChange(node, attr);\n }\n}\n\nexport function removeAttribute(node, attr) {\n nativeMethods.removeAttribute.call(node, attr);\n distributeAttributeChange(node, attr);\n}\n\nexport function cloneNode(node, deep) {\n if (node.localName == 'template') {\n return nativeMethods.cloneNode.call(node, deep);\n } else {\n let n = nativeMethods.cloneNode.call(node, false);\n if (deep) {\n let c$ = node.childNodes;\n for (let i=0, nc; i < c$.length; i++) {\n nc = c$[i].cloneNode(true);\n n.appendChild(nc);\n }\n }\n return n;\n }\n}\n\n// note: Though not technically correct, we fast path `importNode`\n// when called on a node not owned by the main document.\n// This allows, for example, elements that cannot\n// contain custom elements and are therefore not likely to contain shadowRoots\n// to cloned natively. This is a fairly significant performance win.\nexport function importNode(node, deep) {\n if (node.ownerDocument !== document) {\n return nativeMethods.importNode.call(document, node, deep);\n }\n let n = nativeMethods.importNode.call(document, node, false);\n if (deep) {\n let c$ = node.childNodes;\n for (let i=0, nc; i < c$.length; i++) {\n nc = importNode(c$[i], true);\n n.appendChild(nc);\n }\n }\n return n;\n}",null,"/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\nimport * as nativeMethods from './native-methods.js';\nimport {shadyDataForNode} from './shady-data.js';\n\n/*\nMake this name unique so it is unlikely to conflict with properties on objects passed to `addEventListener`\nhttps://github.com/webcomponents/shadydom/issues/173\n*/\nconst /** string */ eventWrappersName = `__eventWrappers${Date.now()}`;\n\n// https://github.com/w3c/webcomponents/issues/513#issuecomment-224183937\nlet alwaysComposed = {\n 'blur': true,\n 'focus': true,\n 'focusin': true,\n 'focusout': true,\n 'click': true,\n 'dblclick': true,\n 'mousedown': true,\n 'mouseenter': true,\n 'mouseleave': true,\n 'mousemove': true,\n 'mouseout': true,\n 'mouseover': true,\n 'mouseup': true,\n 'wheel': true,\n 'beforeinput': true,\n 'input': true,\n 'keydown': true,\n 'keyup': true,\n 'compositionstart': true,\n 'compositionupdate': true,\n 'compositionend': true,\n 'touchstart': true,\n 'touchend': true,\n 'touchmove': true,\n 'touchcancel': true,\n 'pointerover': true,\n 'pointerenter': true,\n 'pointerdown': true,\n 'pointermove': true,\n 'pointerup': true,\n 'pointercancel': true,\n 'pointerout': true,\n 'pointerleave': true,\n 'gotpointercapture': true,\n 'lostpointercapture': true,\n 'dragstart': true,\n 'drag': true,\n 'dragenter': true,\n 'dragleave': true,\n 'dragover': true,\n 'drop': true,\n 'dragend': true,\n 'DOMActivate': true,\n 'DOMFocusIn': true,\n 'DOMFocusOut': true,\n 'keypress': true\n};\n\nfunction pathComposer(startNode, composed) {\n let composedPath = [];\n let current = startNode;\n let startRoot = startNode === window ? window : startNode.getRootNode();\n while (current) {\n composedPath.push(current);\n if (current.assignedSlot) {\n current = current.assignedSlot;\n } else if (current.nodeType === Node.DOCUMENT_FRAGMENT_NODE && current.host && (composed || current !== startRoot)) {\n current = current.host;\n } else {\n current = current.parentNode;\n }\n }\n // event composedPath includes window when startNode's ownerRoot is document\n if (composedPath[composedPath.length - 1] === document) {\n composedPath.push(window);\n }\n return composedPath;\n}\n\nfunction retarget(refNode, path) {\n if (!utils.isShadyRoot) {\n return refNode;\n }\n // If ANCESTOR's root is not a shadow root or ANCESTOR's root is BASE's\n // shadow-including inclusive ancestor, return ANCESTOR.\n let refNodePath = pathComposer(refNode, true);\n let p$ = path;\n for (let i=0, ancestor, lastRoot, root, rootIdx; i < p$.length; i++) {\n ancestor = p$[i];\n root = ancestor === window ? window : ancestor.getRootNode();\n if (root !== lastRoot) {\n rootIdx = refNodePath.indexOf(root);\n lastRoot = root;\n }\n if (!utils.isShadyRoot(root) || rootIdx > -1) {\n return ancestor;\n }\n }\n}\n\nlet eventMixin = {\n\n /**\n * @this {Event}\n */\n get composed() {\n // isTrusted may not exist in this browser, so just check if isTrusted is explicitly false\n if (this.isTrusted !== false && this.__composed === undefined) {\n this.__composed = alwaysComposed[this.type];\n }\n return this.__composed || false;\n },\n\n /**\n * @this {Event}\n */\n composedPath() {\n if (!this.__composedPath) {\n this.__composedPath = pathComposer(this['__target'], this.composed);\n }\n return this.__composedPath;\n },\n\n /**\n * @this {Event}\n */\n get target() {\n return retarget(this.currentTarget, this.composedPath());\n },\n\n // http://w3c.github.io/webcomponents/spec/shadow/#event-relatedtarget-retargeting\n /**\n * @this {Event}\n */\n get relatedTarget() {\n if (!this.__relatedTarget) {\n return null;\n }\n if (!this.__relatedTargetComposedPath) {\n this.__relatedTargetComposedPath = pathComposer(this.__relatedTarget, true);\n }\n // find the deepest node in relatedTarget composed path that is in the same root with the currentTarget\n return retarget(this.currentTarget, this.__relatedTargetComposedPath);\n },\n /**\n * @this {Event}\n */\n stopPropagation() {\n Event.prototype.stopPropagation.call(this);\n this.__propagationStopped = true;\n },\n /**\n * @this {Event}\n */\n stopImmediatePropagation() {\n Event.prototype.stopImmediatePropagation.call(this);\n this.__immediatePropagationStopped = true;\n this.__propagationStopped = true;\n }\n\n};\n\nfunction mixinComposedFlag(Base) {\n // NOTE: avoiding use of `class` here so that transpiled output does not\n // try to do `Base.call` with a dom construtor.\n let klazz = function(type, options) {\n let event = new Base(type, options);\n event.__composed = options && Boolean(options['composed']);\n return event;\n }\n // put constructor properties on subclass\n utils.mixin(klazz, Base);\n klazz.prototype = Base.prototype;\n return klazz;\n}\n\nlet nonBubblingEventsToRetarget = {\n 'focus': true,\n 'blur': true\n};\n\n\n/**\n * Check if the event has been retargeted by comparing original `target`, and calculated `target`\n * @param {Event} event\n * @return {boolean} True if the original target and calculated target are the same\n */\nfunction hasRetargeted(event) {\n return event['__target'] !== event.target || event.__relatedTarget !== event.relatedTarget;\n}\n\n/**\n *\n * @param {Event} event\n * @param {Node} node\n * @param {string} phase\n */\nfunction fireHandlers(event, node, phase) {\n let hs = node.__handlers && node.__handlers[event.type] &&\n node.__handlers[event.type][phase];\n if (hs) {\n for (let i = 0, fn; (fn = hs[i]); i++) {\n if (hasRetargeted(event) && event.target === event.relatedTarget) {\n return;\n }\n fn.call(node, event);\n if (event.__immediatePropagationStopped) {\n return;\n }\n }\n }\n}\n\nfunction retargetNonBubblingEvent(e) {\n let path = e.composedPath();\n let node;\n // override `currentTarget` to let patched `target` calculate correctly\n Object.defineProperty(e, 'currentTarget', {\n get: function() {\n return node;\n },\n configurable: true\n });\n for (let i = path.length - 1; i >= 0; i--) {\n node = path[i];\n // capture phase fires all capture handlers\n fireHandlers(e, node, 'capture');\n if (e.__propagationStopped) {\n return;\n }\n }\n\n // set the event phase to `AT_TARGET` as in spec\n Object.defineProperty(e, 'eventPhase', {get() { return Event.AT_TARGET }});\n\n // the event only needs to be fired when owner roots change when iterating the event path\n // keep track of the last seen owner root\n let lastFiredRoot;\n for (let i = 0; i < path.length; i++) {\n node = path[i];\n const nodeData = shadyDataForNode(node);\n const root = nodeData && nodeData.root;\n if (i === 0 || (root && root === lastFiredRoot)) {\n fireHandlers(e, node, 'bubble');\n // don't bother with window, it doesn't have `getRootNode` and will be last in the path anyway\n if (node !== window) {\n lastFiredRoot = node.getRootNode();\n }\n if (e.__propagationStopped) {\n return;\n }\n }\n }\n}\n\nfunction listenerSettingsEqual(savedListener, node, type, capture, once, passive) {\n let {\n node: savedNode,\n type: savedType,\n capture: savedCapture,\n once: savedOnce,\n passive: savedPassive\n } = savedListener;\n return node === savedNode &&\n type === savedType &&\n capture === savedCapture &&\n once === savedOnce &&\n passive === savedPassive;\n}\n\nexport function findListener(wrappers, node, type, capture, once, passive) {\n for (let i = 0; i < wrappers.length; i++) {\n if (listenerSettingsEqual(wrappers[i], node, type, capture, once, passive)) {\n return i;\n }\n }\n return -1;\n}\n\n/**\n * Firefox can throw on accessing eventWrappers inside of `removeEventListener` during a selenium run\n * Try/Catch accessing eventWrappers to work around\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1353074\n */\nfunction getEventWrappers(eventLike) {\n let wrappers = null;\n try {\n wrappers = eventLike[eventWrappersName];\n } catch (e) {} // eslint-disable-line no-empty\n return wrappers;\n}\n\n/**\n * @this {Event}\n */\nexport function addEventListener(type, fnOrObj, optionsOrCapture) {\n if (!fnOrObj) {\n return;\n }\n\n const handlerType = typeof fnOrObj;\n\n // bail if `fnOrObj` is not a function, not an object\n if (handlerType !== 'function' && handlerType !== 'object') {\n return;\n }\n\n // bail if `fnOrObj` is an object without a `handleEvent` method\n if (handlerType === 'object' && (!fnOrObj.handleEvent || typeof fnOrObj.handleEvent !== 'function')) {\n return;\n }\n\n // The callback `fn` might be used for multiple nodes/events. Since we generate\n // a wrapper function, we need to keep track of it when we remove the listener.\n // It's more efficient to store the node/type/options information as Array in\n // `fn` itself rather than the node (we assume that the same callback is used\n // for few nodes at most, whereas a node will likely have many event listeners).\n // NOTE(valdrin) invoking external functions is costly, inline has better perf.\n let capture, once, passive;\n if (optionsOrCapture && typeof optionsOrCapture === 'object') {\n capture = Boolean(optionsOrCapture.capture);\n once = Boolean(optionsOrCapture.once);\n passive = Boolean(optionsOrCapture.passive);\n } else {\n capture = Boolean(optionsOrCapture);\n once = false;\n passive = false;\n }\n // hack to let ShadyRoots have event listeners\n // event listener will be on host, but `currentTarget`\n // will be set to shadyroot for event listener\n let target = (optionsOrCapture && optionsOrCapture.__shadyTarget) || this;\n\n let wrappers = fnOrObj[eventWrappersName];\n if (wrappers) {\n // Stop if the wrapper function has already been created.\n if (findListener(wrappers, target, type, capture, once, passive) > -1) {\n return;\n }\n } else {\n fnOrObj[eventWrappersName] = [];\n }\n\n /**\n * @this {HTMLElement}\n * @param {Event} e\n */\n const wrapperFn = function(e) {\n // Support `once` option.\n if (once) {\n this.removeEventListener(type, fnOrObj, optionsOrCapture);\n }\n if (!e['__target']) {\n patchEvent(e);\n }\n let lastCurrentTargetDesc;\n if (target !== this) {\n // replace `currentTarget` to make `target` and `relatedTarget` correct for inside the shadowroot\n lastCurrentTargetDesc = Object.getOwnPropertyDescriptor(e, 'currentTarget');\n Object.defineProperty(e, 'currentTarget', {get() { return target }, configurable: true});\n }\n // There are two critera that should stop events from firing on this node\n // 1. the event is not composed and the current node is not in the same root as the target\n // 2. when bubbling, if after retargeting, relatedTarget and target point to the same node\n if (e.composed || e.composedPath().indexOf(target) > -1) {\n if (hasRetargeted(e) && e.target === e.relatedTarget) {\n if (e.eventPhase === Event.BUBBLING_PHASE) {\n e.stopImmediatePropagation();\n }\n return;\n }\n // prevent non-bubbling events from triggering bubbling handlers on shadowroot, but only if not in capture phase\n if (e.eventPhase !== Event.CAPTURING_PHASE && !e.bubbles && e.target !== target && !(target instanceof Window)) {\n return;\n }\n let ret = handlerType === 'function' ?\n fnOrObj.call(target, e) :\n (fnOrObj.handleEvent && fnOrObj.handleEvent(e));\n if (target !== this) {\n // replace the \"correct\" `currentTarget`\n if (lastCurrentTargetDesc) {\n Object.defineProperty(e, 'currentTarget', lastCurrentTargetDesc);\n lastCurrentTargetDesc = null;\n } else {\n delete e['currentTarget'];\n }\n }\n return ret;\n }\n };\n // Store the wrapper information.\n fnOrObj[eventWrappersName].push({\n // note: use target here which is either a shadowRoot\n // (when the host element is proxy'ing the event) or this element\n node: target,\n type: type,\n capture: capture,\n once: once,\n passive: passive,\n wrapperFn: wrapperFn\n });\n\n if (nonBubblingEventsToRetarget[type]) {\n this.__handlers = this.__handlers || {};\n this.__handlers[type] = this.__handlers[type] ||\n {'capture': [], 'bubble': []};\n this.__handlers[type][capture ? 'capture' : 'bubble'].push(wrapperFn);\n } else {\n let ael = this instanceof Window ? nativeMethods.windowAddEventListener :\n nativeMethods.addEventListener;\n ael.call(this, type, wrapperFn, optionsOrCapture);\n }\n}\n\n/**\n * @this {Event}\n */\nexport function removeEventListener(type, fnOrObj, optionsOrCapture) {\n if (!fnOrObj) {\n return;\n }\n\n // NOTE(valdrin) invoking external functions is costly, inline has better perf.\n let capture, once, passive;\n if (optionsOrCapture && typeof optionsOrCapture === 'object') {\n capture = Boolean(optionsOrCapture.capture);\n once = Boolean(optionsOrCapture.once);\n passive = Boolean(optionsOrCapture.passive);\n } else {\n capture = Boolean(optionsOrCapture);\n once = false;\n passive = false;\n }\n let target = (optionsOrCapture && optionsOrCapture.__shadyTarget) || this;\n // Search the wrapped function.\n let wrapperFn = undefined;\n let wrappers = getEventWrappers(fnOrObj);\n if (wrappers) {\n let idx = findListener(wrappers, target, type, capture, once, passive);\n if (idx > -1) {\n wrapperFn = wrappers.splice(idx, 1)[0].wrapperFn;\n // Cleanup.\n if (!wrappers.length) {\n fnOrObj[eventWrappersName] = undefined;\n }\n }\n }\n let rel = this instanceof Window ? nativeMethods.windowRemoveEventListener :\n nativeMethods.removeEventListener;\n rel.call(this, type, wrapperFn || fnOrObj, optionsOrCapture);\n if (wrapperFn && nonBubblingEventsToRetarget[type] &&\n this.__handlers && this.__handlers[type]) {\n const arr = this.__handlers[type][capture ? 'capture' : 'bubble'];\n const idx = arr.indexOf(wrapperFn);\n if (idx > -1) {\n arr.splice(idx, 1);\n }\n }\n}\n\nfunction activateFocusEventOverrides() {\n for (let ev in nonBubblingEventsToRetarget) {\n window.addEventListener(ev, function(e) {\n if (!e['__target']) {\n patchEvent(e);\n retargetNonBubblingEvent(e);\n }\n }, true);\n }\n}\n\nfunction patchEvent(event) {\n event['__target'] = event.target;\n event.__relatedTarget = event.relatedTarget;\n // patch event prototype if we can\n if (utils.settings.hasDescriptors) {\n utils.patchPrototype(event, eventMixin);\n // and fallback to patching instance\n } else {\n utils.extend(event, eventMixin);\n }\n}\n\nlet PatchedEvent = mixinComposedFlag(window.Event);\nlet PatchedCustomEvent = mixinComposedFlag(window.CustomEvent);\nlet PatchedMouseEvent = mixinComposedFlag(window.MouseEvent);\n\nexport function patchEvents() {\n window.Event = PatchedEvent;\n window.CustomEvent = PatchedCustomEvent;\n window.MouseEvent = PatchedMouseEvent;\n activateFocusEventOverrides();\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nfunction newSplice(index, removed, addedCount) {\n return {\n index: index,\n removed: removed,\n addedCount: addedCount\n };\n}\n\nconst EDIT_LEAVE = 0;\nconst EDIT_UPDATE = 1;\nconst EDIT_ADD = 2;\nconst EDIT_DELETE = 3;\n\n// Note: This function is *based* on the computation of the Levenshtein\n// \"edit\" distance. The one change is that \"updates\" are treated as two\n// edits - not one. With Array splices, an update is really a delete\n// followed by an add. By retaining this, we optimize for \"keeping\" the\n// maximum array items in the original array. For example:\n//\n// 'xxxx123' -> '123yyyy'\n//\n// With 1-edit updates, the shortest path would be just to update all seven\n// characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n// leaves the substring '123' intact.\nfunction calcEditDistances(current, currentStart, currentEnd,\n old, oldStart, oldEnd) {\n // \"Deletion\" columns\n let rowCount = oldEnd - oldStart + 1;\n let columnCount = currentEnd - currentStart + 1;\n let distances = new Array(rowCount);\n\n // \"Addition\" rows. Initialize null column.\n for (let i = 0; i < rowCount; i++) {\n distances[i] = new Array(columnCount);\n distances[i][0] = i;\n }\n\n // Initialize null row\n for (let j = 0; j < columnCount; j++)\n distances[0][j] = j;\n\n for (let i = 1; i < rowCount; i++) {\n for (let j = 1; j < columnCount; j++) {\n if (equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n distances[i][j] = distances[i - 1][j - 1];\n else {\n let north = distances[i - 1][j] + 1;\n let west = distances[i][j - 1] + 1;\n distances[i][j] = north < west ? north : west;\n }\n }\n }\n\n return distances;\n}\n\n// This starts at the final weight, and walks \"backward\" by finding\n// the minimum previous weight recursively until the origin of the weight\n// matrix.\nfunction spliceOperationsFromEditDistances(distances) {\n let i = distances.length - 1;\n let j = distances[0].length - 1;\n let current = distances[i][j];\n let edits = [];\n while (i > 0 || j > 0) {\n if (i == 0) {\n edits.push(EDIT_ADD);\n j--;\n continue;\n }\n if (j == 0) {\n edits.push(EDIT_DELETE);\n i--;\n continue;\n }\n let northWest = distances[i - 1][j - 1];\n let west = distances[i - 1][j];\n let north = distances[i][j - 1];\n\n let min;\n if (west < north)\n min = west < northWest ? west : northWest;\n else\n min = north < northWest ? north : northWest;\n\n if (min == northWest) {\n if (northWest == current) {\n edits.push(EDIT_LEAVE);\n } else {\n edits.push(EDIT_UPDATE);\n current = northWest;\n }\n i--;\n j--;\n } else if (min == west) {\n edits.push(EDIT_DELETE);\n i--;\n current = west;\n } else {\n edits.push(EDIT_ADD);\n j--;\n current = north;\n }\n }\n\n edits.reverse();\n return edits;\n}\n\n/**\n * Splice Projection functions:\n *\n * A splice map is a representation of how a previous array of items\n * was transformed into a new array of items. Conceptually it is a list of\n * tuples of\n *\n * <index, removed, addedCount>\n *\n * which are kept in ascending index order of. The tuple represents that at\n * the |index|, |removed| sequence of items were removed, and counting forward\n * from |index|, |addedCount| items were added.\n */\n\n/**\n * Lacking individual splice mutation information, the minimal set of\n * splices can be synthesized given the previous state and final state of an\n * array. The basic approach is to calculate the edit distance matrix and\n * choose the shortest path through it.\n *\n * Complexity: O(l * p)\n * l: The length of the current array\n * p: The length of the old array\n */\nfunction calcSplices(current, currentStart, currentEnd,\n old, oldStart, oldEnd) {\n let prefixCount = 0;\n let suffixCount = 0;\n let splice;\n\n let minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n if (currentStart == 0 && oldStart == 0)\n prefixCount = sharedPrefix(current, old, minLength);\n\n if (currentEnd == current.length && oldEnd == old.length)\n suffixCount = sharedSuffix(current, old, minLength - prefixCount);\n\n currentStart += prefixCount;\n oldStart += prefixCount;\n currentEnd -= suffixCount;\n oldEnd -= suffixCount;\n\n if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n return [];\n\n if (currentStart == currentEnd) {\n splice = newSplice(currentStart, [], 0);\n while (oldStart < oldEnd)\n splice.removed.push(old[oldStart++]);\n\n return [ splice ];\n } else if (oldStart == oldEnd)\n return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n let ops = spliceOperationsFromEditDistances(\n calcEditDistances(current, currentStart, currentEnd,\n old, oldStart, oldEnd));\n\n splice = undefined;\n let splices = [];\n let index = currentStart;\n let oldIndex = oldStart;\n for (let i = 0; i < ops.length; i++) {\n switch(ops[i]) {\n case EDIT_LEAVE:\n if (splice) {\n splices.push(splice);\n splice = undefined;\n }\n\n index++;\n oldIndex++;\n break;\n case EDIT_UPDATE:\n if (!splice)\n splice = newSplice(index, [], 0);\n\n splice.addedCount++;\n index++;\n\n splice.removed.push(old[oldIndex]);\n oldIndex++;\n break;\n case EDIT_ADD:\n if (!splice)\n splice = newSplice(index, [], 0);\n\n splice.addedCount++;\n index++;\n break;\n case EDIT_DELETE:\n if (!splice)\n splice = newSplice(index, [], 0);\n\n splice.removed.push(old[oldIndex]);\n oldIndex++;\n break;\n }\n }\n\n if (splice) {\n splices.push(splice);\n }\n return splices;\n}\n\nfunction sharedPrefix(current, old, searchLength) {\n for (let i = 0; i < searchLength; i++)\n if (!equals(current[i], old[i]))\n return i;\n return searchLength;\n}\n\nfunction sharedSuffix(current, old, searchLength) {\n let index1 = current.length;\n let index2 = old.length;\n let count = 0;\n while (count < searchLength && equals(current[--index1], old[--index2]))\n count++;\n\n return count;\n}\n\nfunction equals(currentValue, previousValue) {\n return currentValue === previousValue;\n}\n\nexport function calculateSplices(current, previous) {\n return calcSplices(current, 0, current.length, previous, 0,\n previous.length);\n}\n\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/**\n * Patches elements that interacts with ShadyDOM\n * such that tree traversal and mutation apis act like they would under\n * ShadowDOM.\n *\n * This import enables seemless interaction with ShadyDOM powered\n * custom elements, enabling better interoperation with 3rd party code,\n * libraries, and frameworks that use DOM tree manipulation apis.\n */\n\nimport * as utils from './utils.js';\nimport {flush, enqueue} from './flush.js';\nimport {observeChildren, unobserveChildren, filterMutations} from './observe-changes.js';\nimport * as nativeMethods from './native-methods.js';\nimport {accessors as nativeTree} from './native-tree.js';\nimport {patchBuiltins} from './patch-builtins.js';\nimport {patchInsideElementAccessors, patchOutsideElementAccessors} from './patch-accessors.js';\nimport {patchEvents} from './patch-events.js';\nimport {ShadyRoot} from './attach-shadow.js';\n\nif (utils.settings.inUse) {\n let ShadyDOM = {\n // TODO(sorvell): remove when Polymer does not depend on this.\n 'inUse': utils.settings.inUse,\n // NOTE: old browsers without prototype accessors (very old Chrome\n // and Safari) need manually patched accessors to properly set\n // `innerHTML` and `textContent` when an element is:\n // (1) inside a shadowRoot\n // (2) does not have special (slot) children itself\n // (3) and setting the property needs to provoke distribution (because\n // a nested slot is added/removed)\n 'patch': (node) => {\n patchInsideElementAccessors(node);\n patchOutsideElementAccessors(node);\n return node;\n },\n 'isShadyRoot': utils.isShadyRoot,\n 'enqueue': enqueue,\n 'flush': flush,\n 'settings': utils.settings,\n 'filterMutations': filterMutations,\n 'observeChildren': observeChildren,\n 'unobserveChildren': unobserveChildren,\n 'nativeMethods': nativeMethods,\n 'nativeTree': nativeTree\n };\n\n window['ShadyDOM'] = ShadyDOM;\n\n // Apply patches to events...\n patchEvents();\n // Apply patches to builtins (e.g. Element.prototype) where applicable.\n patchBuiltins();\n\n window.ShadowRoot = ShadyRoot;\n}","const reservedTagList = new Set([\n 'annotation-xml',\n 'color-profile',\n 'font-face',\n 'font-face-src',\n 'font-face-uri',\n 'font-face-format',\n 'font-face-name',\n 'missing-glyph',\n]);\n\n/**\n * @param {string} localName\n * @returns {boolean}\n */\nexport function isValidCustomElementName(localName) {\n const reserved = reservedTagList.has(localName);\n const validForm = /^[a-z][.0-9_a-z]*-[\\-.0-9_a-z]*$/.test(localName);\n return !reserved && validForm;\n}\n\n/**\n * @private\n * @param {!Node} node\n * @return {boolean}\n */\nexport function isConnected(node) {\n // Use `Node#isConnected`, if defined.\n const nativeValue = node.isConnected;\n if (nativeValue !== undefined) {\n return nativeValue;\n }\n\n /** @type {?Node|undefined} */\n let current = node;\n while (current && !(current.__CE_isImportDocument || current instanceof Document)) {\n current = current.parentNode || (window.ShadowRoot && current instanceof ShadowRoot ? current.host : undefined);\n }\n return !!(current && (current.__CE_isImportDocument || current instanceof Document));\n}\n\n/**\n * @param {!Node} root\n * @param {!Node} start\n * @return {?Node}\n */\nfunction nextSiblingOrAncestorSibling(root, start) {\n let node = start;\n while (node && node !== root && !node.nextSibling) {\n node = node.parentNode;\n }\n return (!node || node === root) ? null : node.nextSibling;\n}\n\n/**\n * @param {!Node} root\n * @param {!Node} start\n * @return {?Node}\n */\nfunction nextNode(root, start) {\n return start.firstChild ? start.firstChild : nextSiblingOrAncestorSibling(root, start);\n}\n\n/**\n * @param {!Node} root\n * @param {!function(!Element)} callback\n * @param {!Set<Node>=} visitedImports\n */\nexport function walkDeepDescendantElements(root, callback, visitedImports = new Set()) {\n let node = root;\n while (node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = /** @type {!Element} */(node);\n\n callback(element);\n\n const localName = element.localName;\n if (localName === 'link' && element.getAttribute('rel') === 'import') {\n // If this import (polyfilled or not) has it's root node available,\n // walk it.\n const importNode = /** @type {!Node} */ (element.import);\n if (importNode instanceof Node && !visitedImports.has(importNode)) {\n // Prevent multiple walks of the same import root.\n visitedImports.add(importNode);\n\n for (let child = importNode.firstChild; child; child = child.nextSibling) {\n walkDeepDescendantElements(child, callback, visitedImports);\n }\n }\n\n // Ignore descendants of import links to prevent attempting to walk the\n // elements created by the HTML Imports polyfill that we just walked\n // above.\n node = nextSiblingOrAncestorSibling(root, element);\n continue;\n } else if (localName === 'template') {\n // Ignore descendants of templates. There shouldn't be any descendants\n // because they will be moved into `.content` during construction in\n // browsers that support template but, in case they exist and are still\n // waiting to be moved by a polyfill, they will be ignored.\n node = nextSiblingOrAncestorSibling(root, element);\n continue;\n }\n\n // Walk shadow roots.\n const shadowRoot = element.__CE_shadowRoot;\n if (shadowRoot) {\n for (let child = shadowRoot.firstChild; child; child = child.nextSibling) {\n walkDeepDescendantElements(child, callback, visitedImports);\n }\n }\n }\n\n node = nextNode(root, node);\n }\n}\n\n/**\n * Used to suppress Closure's \"Modifying the prototype is only allowed if the\n * constructor is in the same scope\" warning without using\n * `@suppress {newCheckTypes, duplicate}` because `newCheckTypes` is too broad.\n *\n * @param {!Object} destination\n * @param {string} name\n * @param {*} value\n */\nexport function setPropertyUnchecked(destination, name, value) {\n destination[name] = value;\n}\n","import * as Utilities from './Utilities.js';\nimport CEState from './CustomElementState.js';\n\nexport default class CustomElementInternals {\n constructor() {\n /** @type {!Map<string, !CustomElementDefinition>} */\n this._localNameToDefinition = new Map();\n\n /** @type {!Map<!Function, !CustomElementDefinition>} */\n this._constructorToDefinition = new Map();\n\n /** @type {!Array<!function(!Node)>} */\n this._patches = [];\n\n /** @type {boolean} */\n this._hasPatches = false;\n }\n\n /**\n * @param {string} localName\n * @param {!CustomElementDefinition} definition\n */\n setDefinition(localName, definition) {\n this._localNameToDefinition.set(localName, definition);\n this._constructorToDefinition.set(definition.constructor, definition);\n }\n\n /**\n * @param {string} localName\n * @return {!CustomElementDefinition|undefined}\n */\n localNameToDefinition(localName) {\n return this._localNameToDefinition.get(localName);\n }\n\n /**\n * @param {!Function} constructor\n * @return {!CustomElementDefinition|undefined}\n */\n constructorToDefinition(constructor) {\n return this._constructorToDefinition.get(constructor);\n }\n\n /**\n * @param {!function(!Node)} listener\n */\n addPatch(listener) {\n this._hasPatches = true;\n this._patches.push(listener);\n }\n\n /**\n * @param {!Node} node\n */\n patchTree(node) {\n if (!this._hasPatches) return;\n\n Utilities.walkDeepDescendantElements(node, element => this.patch(element));\n }\n\n /**\n * @param {!Node} node\n */\n patch(node) {\n if (!this._hasPatches) return;\n\n if (node.__CE_patched) return;\n node.__CE_patched = true;\n\n for (let i = 0; i < this._patches.length; i++) {\n this._patches[i](node);\n }\n }\n\n /**\n * @param {!Node} root\n */\n connectTree(root) {\n const elements = [];\n\n Utilities.walkDeepDescendantElements(root, element => elements.push(element));\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n if (element.__CE_state === CEState.custom) {\n this.connectedCallback(element);\n } else {\n this.upgradeElement(element);\n }\n }\n }\n\n /**\n * @param {!Node} root\n */\n disconnectTree(root) {\n const elements = [];\n\n Utilities.walkDeepDescendantElements(root, element => elements.push(element));\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n if (element.__CE_state === CEState.custom) {\n this.disconnectedCallback(element);\n }\n }\n }\n\n /**\n * Upgrades all uncustomized custom elements at and below a root node for\n * which there is a definition. When custom element reaction callbacks are\n * assumed to be called synchronously (which, by the current DOM / HTML spec\n * definitions, they are *not*), callbacks for both elements customized\n * synchronously by the parser and elements being upgraded occur in the same\n * relative order.\n *\n * NOTE: This function, when used to simulate the construction of a tree that\n * is already created but not customized (i.e. by the parser), does *not*\n * prevent the element from reading the 'final' (true) state of the tree. For\n * example, the element, during truly synchronous parsing / construction would\n * see that it contains no children as they have not yet been inserted.\n * However, this function does not modify the tree, the element will\n * (incorrectly) have children. Additionally, self-modification restrictions\n * for custom element constructors imposed by the DOM spec are *not* enforced.\n *\n *\n * The following nested list shows the steps extending down from the HTML\n * spec's parsing section that cause elements to be synchronously created and\n * upgraded:\n *\n * The \"in body\" insertion mode:\n * https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n * - Switch on token:\n * .. other cases ..\n * -> Any other start tag\n * - [Insert an HTML element](below) for the token.\n *\n * Insert an HTML element:\n * https://html.spec.whatwg.org/multipage/syntax.html#insert-an-html-element\n * - Insert a foreign element for the token in the HTML namespace:\n * https://html.spec.whatwg.org/multipage/syntax.html#insert-a-foreign-element\n * - Create an element for a token:\n * https://html.spec.whatwg.org/multipage/syntax.html#create-an-element-for-the-token\n * - Will execute script flag is true?\n * - (Element queue pushed to the custom element reactions stack.)\n * - Create an element:\n * https://dom.spec.whatwg.org/#concept-create-element\n * - Sync CE flag is true?\n * - Constructor called.\n * - Self-modification restrictions enforced.\n * - Sync CE flag is false?\n * - (Upgrade reaction enqueued.)\n * - Attributes appended to element.\n * (`attributeChangedCallback` reactions enqueued.)\n * - Will execute script flag is true?\n * - (Element queue popped from the custom element reactions stack.\n * Reactions in the popped stack are invoked.)\n * - (Element queue pushed to the custom element reactions stack.)\n * - Insert the element:\n * https://dom.spec.whatwg.org/#concept-node-insert\n * - Shadow-including descendants are connected. During parsing\n * construction, there are no shadow-*excluding* descendants.\n * However, the constructor may have validly attached a shadow\n * tree to itself and added descendants to that shadow tree.\n * (`connectedCallback` reactions enqueued.)\n * - (Element queue popped from the custom element reactions stack.\n * Reactions in the popped stack are invoked.)\n *\n * @param {!Node} root\n * @param {{\n * visitedImports: (!Set<!Node>|undefined),\n * upgrade: (!function(!Element)|undefined),\n * }=} options\n */\n patchAndUpgradeTree(root, options = {}) {\n const visitedImports = options.visitedImports || new Set();\n const upgrade = options.upgrade || (element => this.upgradeElement(element));\n\n const elements = [];\n\n const gatherElements = element => {\n if (element.localName === 'link' && element.getAttribute('rel') === 'import') {\n // The HTML Imports polyfill sets a descendant element of the link to\n // the `import` property, specifically this is *not* a Document.\n const importNode = /** @type {?Node} */ (element.import);\n\n if (importNode instanceof Node) {\n importNode.__CE_isImportDocument = true;\n // Connected links are associated with the registry.\n importNode.__CE_hasRegistry = true;\n }\n\n if (importNode && importNode.readyState === 'complete') {\n importNode.__CE_documentLoadHandled = true;\n } else {\n // If this link's import root is not available, its contents can't be\n // walked. Wait for 'load' and walk it when it's ready.\n element.addEventListener('load', () => {\n const importNode = /** @type {!Node} */ (element.import);\n\n if (importNode.__CE_documentLoadHandled) return;\n importNode.__CE_documentLoadHandled = true;\n\n // Clone the `visitedImports` set that was populated sync during\n // the `patchAndUpgradeTree` call that caused this 'load' handler to\n // be added. Then, remove *this* link's import node so that we can\n // walk that import again, even if it was partially walked later\n // during the same `patchAndUpgradeTree` call.\n const clonedVisitedImports = new Set(visitedImports);\n clonedVisitedImports.delete(importNode);\n\n this.patchAndUpgradeTree(importNode, {visitedImports: clonedVisitedImports, upgrade});\n });\n }\n } else {\n elements.push(element);\n }\n };\n\n // `walkDeepDescendantElements` populates (and internally checks against)\n // `visitedImports` when traversing a loaded import.\n Utilities.walkDeepDescendantElements(root, gatherElements, visitedImports);\n\n if (this._hasPatches) {\n for (let i = 0; i < elements.length; i++) {\n this.patch(elements[i]);\n }\n }\n\n for (let i = 0; i < elements.length; i++) {\n upgrade(elements[i]);\n }\n }\n\n /**\n * @param {!Element} element\n */\n upgradeElement(element) {\n const currentState = element.__CE_state;\n if (currentState !== undefined) return;\n\n // Prevent elements created in documents without a browsing context from\n // upgrading.\n //\n // https://html.spec.whatwg.org/multipage/custom-elements.html#look-up-a-custom-element-definition\n // \"If document does not have a browsing context, return null.\"\n //\n // https://html.spec.whatwg.org/multipage/window-object.html#dom-document-defaultview\n // \"The defaultView IDL attribute of the Document interface, on getting,\n // must return this Document's browsing context's WindowProxy object, if\n // this Document has an associated browsing context, or null otherwise.\"\n const ownerDocument = element.ownerDocument;\n if (\n !ownerDocument.defaultView &&\n !(ownerDocument.__CE_isImportDocument && ownerDocument.__CE_hasRegistry)\n ) return;\n\n const definition = this.localNameToDefinition(element.localName);\n if (!definition) return;\n\n definition.constructionStack.push(element);\n\n const constructor = definition.constructor;\n try {\n try {\n let result = new (constructor)();\n if (result !== element) {\n throw new Error('The custom element constructor did not produce the element being upgraded.');\n }\n } finally {\n definition.constructionStack.pop();\n }\n } catch (e) {\n element.__CE_state = CEState.failed;\n throw e;\n }\n\n element.__CE_state = CEState.custom;\n element.__CE_definition = definition;\n\n if (definition.attributeChangedCallback) {\n const observedAttributes = definition.observedAttributes;\n for (let i = 0; i < observedAttributes.length; i++) {\n const name = observedAttributes[i];\n const value = element.getAttribute(name);\n if (value !== null) {\n this.attributeChangedCallback(element, name, null, value, null);\n }\n }\n }\n\n if (Utilities.isConnected(element)) {\n this.connectedCallback(element);\n }\n }\n\n /**\n * @param {!Element} element\n */\n connectedCallback(element) {\n const definition = element.__CE_definition;\n if (definition.connectedCallback) {\n definition.connectedCallback.call(element);\n }\n }\n\n /**\n * @param {!Element} element\n */\n disconnectedCallback(element) {\n const definition = element.__CE_definition;\n if (definition.disconnectedCallback) {\n definition.disconnectedCallback.call(element);\n }\n }\n\n /**\n * @param {!Element} element\n * @param {string} name\n * @param {?string} oldValue\n * @param {?string} newValue\n * @param {?string} namespace\n */\n attributeChangedCallback(element, name, oldValue, newValue, namespace) {\n const definition = element.__CE_definition;\n if (\n definition.attributeChangedCallback &&\n definition.observedAttributes.indexOf(name) > -1\n ) {\n definition.attributeChangedCallback.call(element, name, oldValue, newValue, namespace);\n }\n }\n}\n","/**\n * @enum {number}\n */\nconst CustomElementState = {\n custom: 1,\n failed: 2,\n};\n\nexport default CustomElementState;\n","import CustomElementInternals from './CustomElementInternals.js';\n\nexport default class DocumentConstructionObserver {\n constructor(internals, doc) {\n /**\n * @type {!CustomElementInternals}\n */\n this._internals = internals;\n\n /**\n * @type {!Document}\n */\n this._document = doc;\n\n /**\n * @type {MutationObserver|undefined}\n */\n this._observer = undefined;\n\n\n // Simulate tree construction for all currently accessible nodes in the\n // document.\n this._internals.patchAndUpgradeTree(this._document);\n\n if (this._document.readyState === 'loading') {\n this._observer = new MutationObserver(this._handleMutations.bind(this));\n\n // Nodes created by the parser are given to the observer *before* the next\n // task runs. Inline scripts are run in a new task. This means that the\n // observer will be able to handle the newly parsed nodes before the inline\n // script is run.\n this._observer.observe(this._document, {\n childList: true,\n subtree: true,\n });\n }\n }\n\n disconnect() {\n if (this._observer) {\n this._observer.disconnect();\n }\n }\n\n /**\n * @param {!Array<!MutationRecord>} mutations\n */\n _handleMutations(mutations) {\n // Once the document's `readyState` is 'interactive' or 'complete', all new\n // nodes created within that document will be the result of script and\n // should be handled by patching.\n const readyState = this._document.readyState;\n if (readyState === 'interactive' || readyState === 'complete') {\n this.disconnect();\n }\n\n for (let i = 0; i < mutations.length; i++) {\n const addedNodes = mutations[i].addedNodes;\n for (let j = 0; j < addedNodes.length; j++) {\n const node = addedNodes[j];\n this._internals.patchAndUpgradeTree(node);\n }\n }\n }\n}\n","import CustomElementInternals from './CustomElementInternals.js';\nimport DocumentConstructionObserver from './DocumentConstructionObserver.js';\nimport Deferred from './Deferred.js';\nimport * as Utilities from './Utilities.js';\n\n/**\n * @unrestricted\n */\nexport default class CustomElementRegistry {\n\n /**\n * @param {!CustomElementInternals} internals\n */\n constructor(internals) {\n /**\n * @private\n * @type {boolean}\n */\n this._elementDefinitionIsRunning = false;\n\n /**\n * @private\n * @type {!CustomElementInternals}\n */\n this._internals = internals;\n\n /**\n * @private\n * @type {!Map<string, !Deferred<undefined>>}\n */\n this._whenDefinedDeferred = new Map();\n\n /**\n * The default flush callback triggers the document walk synchronously.\n * @private\n * @type {!Function}\n */\n this._flushCallback = fn => fn();\n\n /**\n * @private\n * @type {boolean}\n */\n this._flushPending = false;\n\n /**\n * @private\n * @type {!Array<!CustomElementDefinition>}\n */\n this._pendingDefinitions = [];\n\n /**\n * @private\n * @type {!DocumentConstructionObserver}\n */\n this._documentConstructionObserver = new DocumentConstructionObserver(internals, document);\n }\n\n /**\n * @param {string} localName\n * @param {!Function} constructor\n */\n define(localName, constructor) {\n if (!(constructor instanceof Function)) {\n throw new TypeError('Custom element constructors must be functions.');\n }\n\n if (!Utilities.isValidCustomElementName(localName)) {\n throw new SyntaxError(`The element name '${localName}' is not valid.`);\n }\n\n if (this._internals.localNameToDefinition(localName)) {\n throw new Error(`A custom element with name '${localName}' has already been defined.`);\n }\n\n if (this._elementDefinitionIsRunning) {\n throw new Error('A custom element is already being defined.');\n }\n this._elementDefinitionIsRunning = true;\n\n let connectedCallback;\n let disconnectedCallback;\n let adoptedCallback;\n let attributeChangedCallback;\n let observedAttributes;\n try {\n /** @type {!Object} */\n const prototype = constructor.prototype;\n if (!(prototype instanceof Object)) {\n throw new TypeError('The custom element constructor\\'s prototype is not an object.');\n }\n\n function getCallback(name) {\n const callbackValue = prototype[name];\n if (callbackValue !== undefined && !(callbackValue instanceof Function)) {\n throw new Error(`The '${name}' callback must be a function.`);\n }\n return callbackValue;\n }\n\n connectedCallback = getCallback('connectedCallback');\n disconnectedCallback = getCallback('disconnectedCallback');\n adoptedCallback = getCallback('adoptedCallback');\n attributeChangedCallback = getCallback('attributeChangedCallback');\n observedAttributes = constructor['observedAttributes'] || [];\n } catch (e) {\n return;\n } finally {\n this._elementDefinitionIsRunning = false;\n }\n\n const definition = {\n localName,\n constructor,\n connectedCallback,\n disconnectedCallback,\n adoptedCallback,\n attributeChangedCallback,\n observedAttributes,\n constructionStack: [],\n };\n\n this._internals.setDefinition(localName, definition);\n this._pendingDefinitions.push(definition);\n\n // If we've already called the flush callback and it hasn't called back yet,\n // don't call it again.\n if (!this._flushPending) {\n this._flushPending = true;\n this._flushCallback(() => this._flush());\n }\n }\n\n upgrade(element) {\n this._internals.patchAndUpgradeTree(element);\n }\n\n _flush() {\n // If no new definitions were defined, don't attempt to flush. This could\n // happen if a flush callback keeps the function it is given and calls it\n // multiple times.\n if (this._flushPending === false) return;\n this._flushPending = false;\n\n const pendingDefinitions = this._pendingDefinitions;\n\n /**\n * Unupgraded elements with definitions that were defined *before* the last\n * flush, in document order.\n * @type {!Array<!Element>}\n */\n const elementsWithStableDefinitions = [];\n\n /**\n * A map from `localName`s of definitions that were defined *after* the last\n * flush to unupgraded elements matching that definition, in document order.\n * @type {!Map<string, !Array<!Element>>}\n */\n const elementsWithPendingDefinitions = new Map();\n for (let i = 0; i < pendingDefinitions.length; i++) {\n elementsWithPendingDefinitions.set(pendingDefinitions[i].localName, []);\n }\n\n this._internals.patchAndUpgradeTree(document, {\n upgrade: element => {\n // Ignore the element if it has already upgraded or failed to upgrade.\n if (element.__CE_state !== undefined) return;\n\n const localName = element.localName;\n\n // If there is an applicable pending definition for the element, add the\n // element to the list of elements to be upgraded with that definition.\n const pendingElements = elementsWithPendingDefinitions.get(localName);\n if (pendingElements) {\n pendingElements.push(element);\n // If there is *any other* applicable definition for the element, add it\n // to the list of elements with stable definitions that need to be upgraded.\n } else if (this._internals.localNameToDefinition(localName)) {\n elementsWithStableDefinitions.push(element);\n }\n },\n });\n\n // Upgrade elements with 'stable' definitions first.\n for (let i = 0; i < elementsWithStableDefinitions.length; i++) {\n this._internals.upgradeElement(elementsWithStableDefinitions[i]);\n }\n\n // Upgrade elements with 'pending' definitions in the order they were defined.\n while (pendingDefinitions.length > 0) {\n const definition = pendingDefinitions.shift();\n const localName = definition.localName;\n\n // Attempt to upgrade all applicable elements.\n const pendingUpgradableElements = elementsWithPendingDefinitions.get(definition.localName);\n for (let i = 0; i < pendingUpgradableElements.length; i++) {\n this._internals.upgradeElement(pendingUpgradableElements[i]);\n }\n\n // Resolve any promises created by `whenDefined` for the definition.\n const deferred = this._whenDefinedDeferred.get(localName);\n if (deferred) {\n deferred.resolve(undefined);\n }\n }\n }\n\n /**\n * @param {string} localName\n * @return {Function|undefined}\n */\n get(localName) {\n const definition = this._internals.localNameToDefinition(localName);\n if (definition) {\n return definition.constructor;\n }\n\n return undefined;\n }\n\n /**\n * @param {string} localName\n * @return {!Promise<undefined>}\n */\n whenDefined(localName) {\n if (!Utilities.isValidCustomElementName(localName)) {\n return Promise.reject(new SyntaxError(`'${localName}' is not a valid custom element name.`));\n }\n\n const prior = this._whenDefinedDeferred.get(localName);\n if (prior) {\n return prior.toPromise();\n }\n\n const deferred = new Deferred();\n this._whenDefinedDeferred.set(localName, deferred);\n\n const definition = this._internals.localNameToDefinition(localName);\n // Resolve immediately only if the given local name has a definition *and*\n // the full document walk to upgrade elements with that local name has\n // already happened.\n if (definition && !this._pendingDefinitions.some(d => d.localName === localName)) {\n deferred.resolve(undefined);\n }\n\n return deferred.toPromise();\n }\n\n polyfillWrapFlushCallback(outer) {\n this._documentConstructionObserver.disconnect();\n const inner = this._flushCallback;\n this._flushCallback = flush => outer(() => inner(flush));\n }\n}\n\n// Closure compiler exports.\nwindow['CustomElementRegistry'] = CustomElementRegistry;\nCustomElementRegistry.prototype['define'] = CustomElementRegistry.prototype.define;\nCustomElementRegistry.prototype['upgrade'] = CustomElementRegistry.prototype.upgrade;\nCustomElementRegistry.prototype['get'] = CustomElementRegistry.prototype.get;\nCustomElementRegistry.prototype['whenDefined'] = CustomElementRegistry.prototype.whenDefined;\nCustomElementRegistry.prototype['polyfillWrapFlushCallback'] = CustomElementRegistry.prototype.polyfillWrapFlushCallback;\n","/**\n * @template T\n */\nexport default class Deferred {\n constructor() {\n /**\n * @private\n * @type {T|undefined}\n */\n this._value = undefined;\n\n /**\n * @private\n * @type {Function|undefined}\n */\n this._resolve = undefined;\n\n /**\n * @private\n * @type {!Promise<T>}\n */\n this._promise = new Promise(resolve => {\n this._resolve = resolve;\n\n if (this._value) {\n resolve(this._value);\n }\n });\n }\n\n /**\n * @param {T} value\n */\n resolve(value) {\n if (this._value) {\n throw new Error('Already resolved.');\n }\n\n this._value = value;\n\n if (this._resolve) {\n this._resolve(value);\n }\n }\n\n /**\n * @return {!Promise<T>}\n */\n toPromise() {\n return this._promise;\n }\n}\n","export default {\n Document_createElement: window.Document.prototype.createElement,\n Document_createElementNS: window.Document.prototype.createElementNS,\n Document_importNode: window.Document.prototype.importNode,\n Document_prepend: window.Document.prototype['prepend'],\n Document_append: window.Document.prototype['append'],\n DocumentFragment_prepend: window.DocumentFragment.prototype['prepend'],\n DocumentFragment_append: window.DocumentFragment.prototype['append'],\n Node_cloneNode: window.Node.prototype.cloneNode,\n Node_appendChild: window.Node.prototype.appendChild,\n Node_insertBefore: window.Node.prototype.insertBefore,\n Node_removeChild: window.Node.prototype.removeChild,\n Node_replaceChild: window.Node.prototype.replaceChild,\n Node_textContent: Object.getOwnPropertyDescriptor(window.Node.prototype, 'textContent'),\n Element_attachShadow: window.Element.prototype['attachShadow'],\n Element_innerHTML: Object.getOwnPropertyDescriptor(window.Element.prototype, 'innerHTML'),\n Element_getAttribute: window.Element.prototype.getAttribute,\n Element_setAttribute: window.Element.prototype.setAttribute,\n Element_removeAttribute: window.Element.prototype.removeAttribute,\n Element_getAttributeNS: window.Element.prototype.getAttributeNS,\n Element_setAttributeNS: window.Element.prototype.setAttributeNS,\n Element_removeAttributeNS: window.Element.prototype.removeAttributeNS,\n Element_insertAdjacentElement: window.Element.prototype['insertAdjacentElement'],\n Element_insertAdjacentHTML: window.Element.prototype['insertAdjacentHTML'],\n Element_prepend: window.Element.prototype['prepend'],\n Element_append: window.Element.prototype['append'],\n Element_before: window.Element.prototype['before'],\n Element_after: window.Element.prototype['after'],\n Element_replaceWith: window.Element.prototype['replaceWith'],\n Element_remove: window.Element.prototype['remove'],\n HTMLElement: window.HTMLElement,\n HTMLElement_innerHTML: Object.getOwnPropertyDescriptor(window.HTMLElement.prototype, 'innerHTML'),\n HTMLElement_insertAdjacentElement: window.HTMLElement.prototype['insertAdjacentElement'],\n HTMLElement_insertAdjacentHTML: window.HTMLElement.prototype['insertAdjacentHTML'],\n};\n","/**\n * This class exists only to work around Closure's lack of a way to describe\n * singletons. It represents the 'already constructed marker' used in custom\n * element construction stacks.\n *\n * https://html.spec.whatwg.org/#concept-already-constructed-marker\n */\nclass AlreadyConstructedMarker {}\n\nexport default new AlreadyConstructedMarker();\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport CEState from '../CustomElementState.js';\nimport AlreadyConstructedMarker from '../AlreadyConstructedMarker.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n window['HTMLElement'] = (function() {\n /**\n * @type {function(new: HTMLElement): !HTMLElement}\n */\n function HTMLElement() {\n // This should really be `new.target` but `new.target` can't be emulated\n // in ES5. Assuming the user keeps the default value of the constructor's\n // prototype's `constructor` property, this is equivalent.\n /** @type {!Function} */\n const constructor = this.constructor;\n\n const definition = internals.constructorToDefinition(constructor);\n if (!definition) {\n throw new Error('The custom element being constructed was not registered with `customElements`.');\n }\n\n const constructionStack = definition.constructionStack;\n\n if (constructionStack.length === 0) {\n const element = Native.Document_createElement.call(document, definition.localName);\n Object.setPrototypeOf(element, constructor.prototype);\n element.__CE_state = CEState.custom;\n element.__CE_definition = definition;\n internals.patch(element);\n return element;\n }\n\n const lastIndex = constructionStack.length - 1;\n const element = constructionStack[lastIndex];\n if (element === AlreadyConstructedMarker) {\n throw new Error('The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.');\n }\n constructionStack[lastIndex] = AlreadyConstructedMarker;\n\n Object.setPrototypeOf(element, constructor.prototype);\n internals.patch(/** @type {!HTMLElement} */ (element));\n\n return element;\n }\n\n HTMLElement.prototype = Native.HTMLElement.prototype;\n\n return HTMLElement;\n })();\n};\n","/**\n * @license\n * Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nimport CustomElementInternals from './CustomElementInternals.js';\nimport CustomElementRegistry from './CustomElementRegistry.js';\n\nimport PatchHTMLElement from './Patch/HTMLElement.js';\nimport PatchDocument from './Patch/Document.js';\nimport PatchDocumentFragment from './Patch/DocumentFragment.js';\nimport PatchNode from './Patch/Node.js';\nimport PatchElement from './Patch/Element.js';\n\nconst priorCustomElements = window['customElements'];\n\nif (!priorCustomElements ||\n priorCustomElements['forcePolyfill'] ||\n (typeof priorCustomElements['define'] != 'function') ||\n (typeof priorCustomElements['get'] != 'function')) {\n /** @type {!CustomElementInternals} */\n const internals = new CustomElementInternals();\n\n PatchHTMLElement(internals);\n PatchDocument(internals);\n PatchDocumentFragment(internals);\n PatchNode(internals);\n PatchElement(internals);\n\n // The main document is always associated with the registry.\n document.__CE_hasRegistry = true;\n\n /** @type {!CustomElementRegistry} */\n const customElements = new CustomElementRegistry(internals);\n\n Object.defineProperty(window, 'customElements', {\n configurable: true,\n enumerable: true,\n value: customElements,\n });\n}\n","import CustomElementInternals from '../../CustomElementInternals.js';\nimport * as Utilities from '../../Utilities.js';\n\n/**\n * @typedef {{\n * prepend: !function(...(!Node|string)),\n * append: !function(...(!Node|string)),\n * }}\n */\nlet ParentNodeNativeMethods;\n\n/**\n * @param {!CustomElementInternals} internals\n * @param {!Object} destination\n * @param {!ParentNodeNativeMethods} builtIn\n */\nexport default function(internals, destination, builtIn) {\n /**\n * @param {!function(...(!Node|string))} builtInMethod\n * @return {!function(...(!Node|string))}\n */\n function appendPrependPatch(builtInMethod) {\n return function(...nodes) {\n /**\n * A copy of `nodes`, with any DocumentFragment replaced by its children.\n * @type {!Array<!Node>}\n */\n const flattenedNodes = [];\n\n /**\n * Elements in `nodes` that were connected before this call.\n * @type {!Array<!Node>}\n */\n const connectedElements = [];\n\n for (var i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if (node instanceof Element && Utilities.isConnected(node)) {\n connectedElements.push(node);\n }\n\n if (node instanceof DocumentFragment) {\n for (let child = node.firstChild; child; child = child.nextSibling) {\n flattenedNodes.push(child);\n }\n } else {\n flattenedNodes.push(node);\n }\n }\n\n builtInMethod.apply(this, nodes);\n\n for (let i = 0; i < connectedElements.length; i++) {\n internals.disconnectTree(connectedElements[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < flattenedNodes.length; i++) {\n const node = flattenedNodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n }\n\n if (builtIn.prepend !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'prepend', appendPrependPatch(builtIn.prepend));\n }\n\n if (builtIn.append !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'append', appendPrependPatch(builtIn.append));\n }\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport * as Utilities from '../Utilities.js';\n\nimport PatchParentNode from './Interface/ParentNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n Utilities.setPropertyUnchecked(Document.prototype, 'createElement',\n /**\n * @this {Document}\n * @param {string} localName\n * @return {!Element}\n */\n function(localName) {\n // Only create custom elements if this document is associated with the registry.\n if (this.__CE_hasRegistry) {\n const definition = internals.localNameToDefinition(localName);\n if (definition) {\n return new (definition.constructor)();\n }\n }\n\n const result = /** @type {!Element} */\n (Native.Document_createElement.call(this, localName));\n internals.patch(result);\n return result;\n });\n\n Utilities.setPropertyUnchecked(Document.prototype, 'importNode',\n /**\n * @this {Document}\n * @param {!Node} node\n * @param {boolean=} deep\n * @return {!Node}\n */\n function(node, deep) {\n const clone = Native.Document_importNode.call(this, node, deep);\n // Only create custom elements if this document is associated with the registry.\n if (!this.__CE_hasRegistry) {\n internals.patchTree(clone);\n } else {\n internals.patchAndUpgradeTree(clone);\n }\n return clone;\n });\n\n const NS_HTML = \"http://www.w3.org/1999/xhtml\";\n\n Utilities.setPropertyUnchecked(Document.prototype, 'createElementNS',\n /**\n * @this {Document}\n * @param {?string} namespace\n * @param {string} localName\n * @return {!Element}\n */\n function(namespace, localName) {\n // Only create custom elements if this document is associated with the registry.\n if (this.__CE_hasRegistry && (namespace === null || namespace === NS_HTML)) {\n const definition = internals.localNameToDefinition(localName);\n if (definition) {\n return new (definition.constructor)();\n }\n }\n\n const result = /** @type {!Element} */\n (Native.Document_createElementNS.call(this, namespace, localName));\n internals.patch(result);\n return result;\n });\n\n PatchParentNode(internals, Document.prototype, {\n prepend: Native.Document_prepend,\n append: Native.Document_append,\n });\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport * as Utilities from '../Utilities.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n // `Node#nodeValue` is implemented on `Attr`.\n // `Node#textContent` is implemented on `Attr`, `Element`.\n\n Utilities.setPropertyUnchecked(Node.prototype, 'insertBefore',\n /**\n * @this {Node}\n * @param {!Node} node\n * @param {?Node} refNode\n * @return {!Node}\n */\n function(node, refNode) {\n if (node instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(node.childNodes);\n const nativeResult = Native.Node_insertBefore.call(this, node, refNode);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_insertBefore.call(this, node, refNode);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n if (Utilities.isConnected(this)) {\n internals.connectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'appendChild',\n /**\n * @this {Node}\n * @param {!Node} node\n * @return {!Node}\n */\n function(node) {\n if (node instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(node.childNodes);\n const nativeResult = Native.Node_appendChild.call(this, node);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_appendChild.call(this, node);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n if (Utilities.isConnected(this)) {\n internals.connectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'cloneNode',\n /**\n * @this {Node}\n * @param {boolean=} deep\n * @return {!Node}\n */\n function(deep) {\n const clone = Native.Node_cloneNode.call(this, deep);\n // Only create custom elements if this element's owner document is\n // associated with the registry.\n if (!this.ownerDocument.__CE_hasRegistry) {\n internals.patchTree(clone);\n } else {\n internals.patchAndUpgradeTree(clone);\n }\n return clone;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'removeChild',\n /**\n * @this {Node}\n * @param {!Node} node\n * @return {!Node}\n */\n function(node) {\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_removeChild.call(this, node);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'replaceChild',\n /**\n * @this {Node}\n * @param {!Node} nodeToInsert\n * @param {!Node} nodeToRemove\n * @return {!Node}\n */\n function(nodeToInsert, nodeToRemove) {\n if (nodeToInsert instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(nodeToInsert.childNodes);\n const nativeResult = Native.Node_replaceChild.call(this, nodeToInsert, nodeToRemove);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n internals.disconnectTree(nodeToRemove);\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeToInsertWasConnected = Utilities.isConnected(nodeToInsert);\n const nativeResult = Native.Node_replaceChild.call(this, nodeToInsert, nodeToRemove);\n const thisIsConnected = Utilities.isConnected(this);\n\n if (thisIsConnected) {\n internals.disconnectTree(nodeToRemove);\n }\n\n if (nodeToInsertWasConnected) {\n internals.disconnectTree(nodeToInsert);\n }\n\n if (thisIsConnected) {\n internals.connectTree(nodeToInsert);\n }\n\n return nativeResult;\n });\n\n\n function patch_textContent(destination, baseDescriptor) {\n Object.defineProperty(destination, 'textContent', {\n enumerable: baseDescriptor.enumerable,\n configurable: true,\n get: baseDescriptor.get,\n set: /** @this {Node} */ function(assignedValue) {\n // If this is a text node then there are no nodes to disconnect.\n if (this.nodeType === Node.TEXT_NODE) {\n baseDescriptor.set.call(this, assignedValue);\n return;\n }\n\n let removedNodes = undefined;\n // Checking for `firstChild` is faster than reading `childNodes.length`\n // to compare with 0.\n if (this.firstChild) {\n // Using `childNodes` is faster than `children`, even though we only\n // care about elements.\n const childNodes = this.childNodes;\n const childNodesLength = childNodes.length;\n if (childNodesLength > 0 && Utilities.isConnected(this)) {\n // Copying an array by iterating is faster than using slice.\n removedNodes = new Array(childNodesLength);\n for (let i = 0; i < childNodesLength; i++) {\n removedNodes[i] = childNodes[i];\n }\n }\n }\n\n baseDescriptor.set.call(this, assignedValue);\n\n if (removedNodes) {\n for (let i = 0; i < removedNodes.length; i++) {\n internals.disconnectTree(removedNodes[i]);\n }\n }\n },\n });\n }\n\n if (Native.Node_textContent && Native.Node_textContent.get) {\n patch_textContent(Node.prototype, Native.Node_textContent);\n } else {\n internals.addPatch(function(element) {\n patch_textContent(element, {\n enumerable: true,\n configurable: true,\n // NOTE: This implementation of the `textContent` getter assumes that\n // text nodes' `textContent` getter will not be patched.\n get: /** @this {Node} */ function() {\n /** @type {!Array<string>} */\n const parts = [];\n\n for (let i = 0; i < this.childNodes.length; i++) {\n parts.push(this.childNodes[i].textContent);\n }\n\n return parts.join('');\n },\n set: /** @this {Node} */ function(assignedValue) {\n while (this.firstChild) {\n Native.Node_removeChild.call(this, this.firstChild);\n }\n Native.Node_appendChild.call(this, document.createTextNode(assignedValue));\n },\n });\n });\n }\n};\n","import CustomElementInternals from '../../CustomElementInternals.js';\nimport * as Utilities from '../../Utilities.js';\n\n/**\n * @typedef {{\n * before: !function(...(!Node|string)),\n * after: !function(...(!Node|string)),\n * replaceWith: !function(...(!Node|string)),\n * remove: !function(),\n * }}\n */\nlet ChildNodeNativeMethods;\n\n/**\n * @param {!CustomElementInternals} internals\n * @param {!Object} destination\n * @param {!ChildNodeNativeMethods} builtIn\n */\nexport default function(internals, destination, builtIn) {\n /**\n * @param {!function(...(!Node|string))} builtInMethod\n * @return {!function(...(!Node|string))}\n */\n function beforeAfterPatch(builtInMethod) {\n return function(...nodes) {\n /**\n * A copy of `nodes`, with any DocumentFragment replaced by its children.\n * @type {!Array<!Node>}\n */\n const flattenedNodes = [];\n\n /**\n * Elements in `nodes` that were connected before this call.\n * @type {!Array<!Node>}\n */\n const connectedElements = [];\n\n for (var i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if (node instanceof Element && Utilities.isConnected(node)) {\n connectedElements.push(node);\n }\n\n if (node instanceof DocumentFragment) {\n for (let child = node.firstChild; child; child = child.nextSibling) {\n flattenedNodes.push(child);\n }\n } else {\n flattenedNodes.push(node);\n }\n }\n\n builtInMethod.apply(this, nodes);\n\n for (let i = 0; i < connectedElements.length; i++) {\n internals.disconnectTree(connectedElements[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < flattenedNodes.length; i++) {\n const node = flattenedNodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n }\n\n if (builtIn.before !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'before', beforeAfterPatch(builtIn.before));\n }\n\n if (builtIn.before !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'after', beforeAfterPatch(builtIn.after));\n }\n\n if (builtIn.replaceWith !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'replaceWith',\n /**\n * @param {...(!Node|string)} nodes\n */\n function(...nodes) {\n /**\n * A copy of `nodes`, with any DocumentFragment replaced by its children.\n * @type {!Array<!Node>}\n */\n const flattenedNodes = [];\n\n /**\n * Elements in `nodes` that were connected before this call.\n * @type {!Array<!Node>}\n */\n const connectedElements = [];\n\n for (var i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if (node instanceof Element && Utilities.isConnected(node)) {\n connectedElements.push(node);\n }\n\n if (node instanceof DocumentFragment) {\n for (let child = node.firstChild; child; child = child.nextSibling) {\n flattenedNodes.push(child);\n }\n } else {\n flattenedNodes.push(node);\n }\n }\n\n const wasConnected = Utilities.isConnected(this);\n\n builtIn.replaceWith.apply(this, nodes);\n\n for (let i = 0; i < connectedElements.length; i++) {\n internals.disconnectTree(connectedElements[i]);\n }\n\n if (wasConnected) {\n internals.disconnectTree(this);\n for (let i = 0; i < flattenedNodes.length; i++) {\n const node = flattenedNodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n });\n }\n\n if (builtIn.remove !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'remove',\n function() {\n const wasConnected = Utilities.isConnected(this);\n\n builtIn.remove.call(this);\n\n if (wasConnected) {\n internals.disconnectTree(this);\n }\n });\n }\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport CEState from '../CustomElementState.js';\nimport * as Utilities from '../Utilities.js';\n\nimport PatchParentNode from './Interface/ParentNode.js';\nimport PatchChildNode from './Interface/ChildNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n if (Native.Element_attachShadow) {\n Utilities.setPropertyUnchecked(Element.prototype, 'attachShadow',\n /**\n * @this {Element}\n * @param {!{mode: string}} init\n * @return {ShadowRoot}\n */\n function(init) {\n const shadowRoot = Native.Element_attachShadow.call(this, init);\n this.__CE_shadowRoot = shadowRoot;\n return shadowRoot;\n });\n }\n\n\n function patch_innerHTML(destination, baseDescriptor) {\n Object.defineProperty(destination, 'innerHTML', {\n enumerable: baseDescriptor.enumerable,\n configurable: true,\n get: baseDescriptor.get,\n set: /** @this {Element} */ function(htmlString) {\n const isConnected = Utilities.isConnected(this);\n\n // NOTE: In IE11, when using the native `innerHTML` setter, all nodes\n // that were previously descendants of the context element have all of\n // their children removed as part of the set - the entire subtree is\n // 'disassembled'. This work around walks the subtree *before* using the\n // native setter.\n /** @type {!Array<!Element>|undefined} */\n let removedElements = undefined;\n if (isConnected) {\n removedElements = [];\n Utilities.walkDeepDescendantElements(this, element => {\n if (element !== this) {\n removedElements.push(element);\n }\n });\n }\n\n baseDescriptor.set.call(this, htmlString);\n\n if (removedElements) {\n for (let i = 0; i < removedElements.length; i++) {\n const element = removedElements[i];\n if (element.__CE_state === CEState.custom) {\n internals.disconnectedCallback(element);\n }\n }\n }\n\n // Only create custom elements if this element's owner document is\n // associated with the registry.\n if (!this.ownerDocument.__CE_hasRegistry) {\n internals.patchTree(this);\n } else {\n internals.patchAndUpgradeTree(this);\n }\n return htmlString;\n },\n });\n }\n\n if (Native.Element_innerHTML && Native.Element_innerHTML.get) {\n patch_innerHTML(Element.prototype, Native.Element_innerHTML);\n } else if (Native.HTMLElement_innerHTML && Native.HTMLElement_innerHTML.get) {\n patch_innerHTML(HTMLElement.prototype, Native.HTMLElement_innerHTML);\n } else {\n\n internals.addPatch(function(element) {\n patch_innerHTML(element, {\n enumerable: true,\n configurable: true,\n // Implements getting `innerHTML` by performing an unpatched `cloneNode`\n // of the element and returning the resulting element's `innerHTML`.\n // TODO: Is this too expensive?\n get: /** @this {Element} */ function() {\n return Native.Node_cloneNode.call(this, true).innerHTML;\n },\n // Implements setting `innerHTML` by creating an unpatched element,\n // setting `innerHTML` of that element and replacing the target\n // element's children with those of the unpatched element.\n set: /** @this {Element} */ function(assignedValue) {\n // NOTE: re-route to `content` for `template` elements.\n // We need to do this because `template.appendChild` does not\n // route into `template.content`.\n const isTemplate = (this.localName === 'template');\n /** @type {!Node} */\n const content = isTemplate ? (/** @type {!HTMLTemplateElement} */\n (this)).content : this;\n /** @type {!Node} */\n const rawElement = Native.Document_createElement.call(document,\n this.localName);\n rawElement.innerHTML = assignedValue;\n\n while (content.childNodes.length > 0) {\n Native.Node_removeChild.call(content, content.childNodes[0]);\n }\n const container = isTemplate ? rawElement.content : rawElement;\n while (container.childNodes.length > 0) {\n Native.Node_appendChild.call(content, container.childNodes[0]);\n }\n },\n });\n });\n }\n\n\n Utilities.setPropertyUnchecked(Element.prototype, 'setAttribute',\n /**\n * @this {Element}\n * @param {string} name\n * @param {string} newValue\n */\n function(name, newValue) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_setAttribute.call(this, name, newValue);\n }\n\n const oldValue = Native.Element_getAttribute.call(this, name);\n Native.Element_setAttribute.call(this, name, newValue);\n newValue = Native.Element_getAttribute.call(this, name);\n internals.attributeChangedCallback(this, name, oldValue, newValue, null);\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'setAttributeNS',\n /**\n * @this {Element}\n * @param {?string} namespace\n * @param {string} name\n * @param {string} newValue\n */\n function(namespace, name, newValue) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_setAttributeNS.call(this, namespace, name, newValue);\n }\n\n const oldValue = Native.Element_getAttributeNS.call(this, namespace, name);\n Native.Element_setAttributeNS.call(this, namespace, name, newValue);\n newValue = Native.Element_getAttributeNS.call(this, namespace, name);\n internals.attributeChangedCallback(this, name, oldValue, newValue, namespace);\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'removeAttribute',\n /**\n * @this {Element}\n * @param {string} name\n */\n function(name) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_removeAttribute.call(this, name);\n }\n\n const oldValue = Native.Element_getAttribute.call(this, name);\n Native.Element_removeAttribute.call(this, name);\n if (oldValue !== null) {\n internals.attributeChangedCallback(this, name, oldValue, null, null);\n }\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'removeAttributeNS',\n /**\n * @this {Element}\n * @param {?string} namespace\n * @param {string} name\n */\n function(namespace, name) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_removeAttributeNS.call(this, namespace, name);\n }\n\n const oldValue = Native.Element_getAttributeNS.call(this, namespace, name);\n Native.Element_removeAttributeNS.call(this, namespace, name);\n // In older browsers, `Element#getAttributeNS` may return the empty string\n // instead of null if the attribute does not exist. For details, see;\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttributeNS#Notes\n const newValue = Native.Element_getAttributeNS.call(this, namespace, name);\n if (oldValue !== newValue) {\n internals.attributeChangedCallback(this, name, oldValue, newValue, namespace);\n }\n });\n\n\n function patch_insertAdjacentElement(destination, baseMethod) {\n Utilities.setPropertyUnchecked(destination, 'insertAdjacentElement',\n /**\n * @this {Element}\n * @param {string} position\n * @param {!Element} element\n * @return {?Element}\n */\n function(position, element) {\n const wasConnected = Utilities.isConnected(element);\n const insertedElement = /** @type {!Element} */\n (baseMethod.call(this, position, element));\n\n if (wasConnected) {\n internals.disconnectTree(element);\n }\n\n if (Utilities.isConnected(insertedElement)) {\n internals.connectTree(element);\n }\n return insertedElement;\n });\n }\n\n if (Native.HTMLElement_insertAdjacentElement) {\n patch_insertAdjacentElement(HTMLElement.prototype, Native.HTMLElement_insertAdjacentElement);\n } else if (Native.Element_insertAdjacentElement) {\n patch_insertAdjacentElement(Element.prototype, Native.Element_insertAdjacentElement);\n } else {\n console.warn('Custom Elements: `Element#insertAdjacentElement` was not patched.');\n }\n\n\n function patch_insertAdjacentHTML(destination, baseMethod) {\n /**\n * Patches and upgrades all nodes which are siblings between `start`\n * (inclusive) and `end` (exclusive). If `end` is `null`, then all siblings\n * following `start` will be patched and upgraded.\n * @param {!Node} start\n * @param {?Node} end\n */\n function upgradeNodesInRange(start, end) {\n const nodes = [];\n for (let node = start; node !== end; node = node.nextSibling) {\n nodes.push(node);\n }\n for (let i = 0; i < nodes.length; i++) {\n internals.patchAndUpgradeTree(nodes[i]);\n }\n }\n\n Utilities.setPropertyUnchecked(destination, 'insertAdjacentHTML',\n /**\n * @this {Element}\n * @param {string} position\n * @param {string} text\n */\n function(position, text) {\n position = position.toLowerCase();\n\n if (position === \"beforebegin\") {\n const marker = this.previousSibling;\n baseMethod.call(this, position, text);\n upgradeNodesInRange(\n /** @type {!Node} */ (marker || this.parentNode.firstChild), this);\n } else if (position === \"afterbegin\") {\n const marker = this.firstChild;\n baseMethod.call(this, position, text);\n upgradeNodesInRange(/** @type {!Node} */ (this.firstChild), marker);\n } else if (position === \"beforeend\") {\n const marker = this.lastChild;\n baseMethod.call(this, position, text);\n upgradeNodesInRange(marker || this.firstChild, null);\n } else if (position === \"afterend\") {\n const marker = this.nextSibling;\n baseMethod.call(this, position, text);\n upgradeNodesInRange(/** @type {!Node} */ (this.nextSibling), marker);\n } else {\n throw new SyntaxError(`The value provided (${String(position)}) is ` +\n \"not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'.\");\n }\n });\n }\n\n if (Native.HTMLElement_insertAdjacentHTML) {\n patch_insertAdjacentHTML(HTMLElement.prototype, Native.HTMLElement_insertAdjacentHTML);\n } else if (Native.Element_insertAdjacentHTML) {\n patch_insertAdjacentHTML(Element.prototype, Native.Element_insertAdjacentHTML);\n } else {\n console.warn('Custom Elements: `Element#insertAdjacentHTML` was not patched.');\n }\n\n\n PatchParentNode(internals, Element.prototype, {\n prepend: Native.Element_prepend,\n append: Native.Element_append,\n });\n\n PatchChildNode(internals, Element.prototype, {\n before: Native.Element_before,\n after: Native.Element_after,\n replaceWith: Native.Element_replaceWith,\n remove: Native.Element_remove,\n });\n};\n","import CustomElementInternals from '../CustomElementInternals.js';\nimport Native from './Native.js';\nimport PatchParentNode from './Interface/ParentNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n PatchParentNode(internals, DocumentFragment.prototype, {\n prepend: Native.DocumentFragment_prepend,\n append: Native.DocumentFragment_append,\n });\n};\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/*\nExtremely simple css parser. Intended to be not more than what we need\nand definitely not necessarily correct =).\n*/\n\n'use strict';\n\n/** @unrestricted */\nclass StyleNode {\n constructor() {\n /** @type {number} */\n this['start'] = 0;\n /** @type {number} */\n this['end'] = 0;\n /** @type {StyleNode} */\n this['previous'] = null;\n /** @type {StyleNode} */\n this['parent'] = null;\n /** @type {Array<StyleNode>} */\n this['rules'] = null;\n /** @type {string} */\n this['parsedCssText'] = '';\n /** @type {string} */\n this['cssText'] = '';\n /** @type {boolean} */\n this['atRule'] = false;\n /** @type {number} */\n this['type'] = 0;\n /** @type {string} */\n this['keyframesName'] = '';\n /** @type {string} */\n this['selector'] = '';\n /** @type {string} */\n this['parsedSelector'] = '';\n }\n}\n\nexport {StyleNode}\n\n// given a string of css, return a simple rule tree\n/**\n * @param {string} text\n * @return {StyleNode}\n */\nexport function parse(text) {\n text = clean(text);\n return parseCss(lex(text), text);\n}\n\n// remove stuff we don't care about that may hinder parsing\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction clean(cssText) {\n return cssText.replace(RX.comments, '').replace(RX.port, '');\n}\n\n// super simple {...} lexer that returns a node tree\n/**\n * @param {string} text\n * @return {StyleNode}\n */\nfunction lex(text) {\n let root = new StyleNode();\n root['start'] = 0;\n root['end'] = text.length\n let n = root;\n for (let i = 0, l = text.length; i < l; i++) {\n if (text[i] === OPEN_BRACE) {\n if (!n['rules']) {\n n['rules'] = [];\n }\n let p = n;\n let previous = p['rules'][p['rules'].length - 1] || null;\n n = new StyleNode();\n n['start'] = i + 1;\n n['parent'] = p;\n n['previous'] = previous;\n p['rules'].push(n);\n } else if (text[i] === CLOSE_BRACE) {\n n['end'] = i + 1;\n n = n['parent'] || root;\n }\n }\n return root;\n}\n\n// add selectors/cssText to node tree\n/**\n * @param {StyleNode} node\n * @param {string} text\n * @return {StyleNode}\n */\nfunction parseCss(node, text) {\n let t = text.substring(node['start'], node['end'] - 1);\n node['parsedCssText'] = node['cssText'] = t.trim();\n if (node['parent']) {\n let ss = node['previous'] ? node['previous']['end'] : node['parent']['start'];\n t = text.substring(ss, node['start'] - 1);\n t = _expandUnicodeEscapes(t);\n t = t.replace(RX.multipleSpaces, ' ');\n // TODO(sorvell): ad hoc; make selector include only after last ;\n // helps with mixin syntax\n t = t.substring(t.lastIndexOf(';') + 1);\n let s = node['parsedSelector'] = node['selector'] = t.trim();\n node['atRule'] = (s.indexOf(AT_START) === 0);\n // note, support a subset of rule types...\n if (node['atRule']) {\n if (s.indexOf(MEDIA_START) === 0) {\n node['type'] = types.MEDIA_RULE;\n } else if (s.match(RX.keyframesRule)) {\n node['type'] = types.KEYFRAMES_RULE;\n node['keyframesName'] =\n node['selector'].split(RX.multipleSpaces).pop();\n }\n } else {\n if (s.indexOf(VAR_START) === 0) {\n node['type'] = types.MIXIN_RULE;\n } else {\n node['type'] = types.STYLE_RULE;\n }\n }\n }\n let r$ = node['rules'];\n if (r$) {\n for (let i = 0, l = r$.length, r;\n (i < l) && (r = r$[i]); i++) {\n parseCss(r, text);\n }\n }\n return node;\n}\n\n/**\n * conversion of sort unicode escapes with spaces like `\\33 ` (and longer) into\n * expanded form that doesn't require trailing space `\\000033`\n * @param {string} s\n * @return {string}\n */\nfunction _expandUnicodeEscapes(s) {\n return s.replace(/\\\\([0-9a-f]{1,6})\\s/gi, function() {\n let code = arguments[1],\n repeat = 6 - code.length;\n while (repeat--) {\n code = '0' + code;\n }\n return '\\\\' + code;\n });\n}\n\n/**\n * stringify parsed css.\n * @param {StyleNode} node\n * @param {boolean=} preserveProperties\n * @param {string=} text\n * @return {string}\n */\nexport function stringify(node, preserveProperties, text = '') {\n // calc rule cssText\n let cssText = '';\n if (node['cssText'] || node['rules']) {\n let r$ = node['rules'];\n if (r$ && !_hasMixinRules(r$)) {\n for (let i = 0, l = r$.length, r;\n (i < l) && (r = r$[i]); i++) {\n cssText = stringify(r, preserveProperties, cssText);\n }\n } else {\n cssText = preserveProperties ? node['cssText'] :\n removeCustomProps(node['cssText']);\n cssText = cssText.trim();\n if (cssText) {\n cssText = ' ' + cssText + '\\n';\n }\n }\n }\n // emit rule if there is cssText\n if (cssText) {\n if (node['selector']) {\n text += node['selector'] + ' ' + OPEN_BRACE + '\\n';\n }\n text += cssText;\n if (node['selector']) {\n text += CLOSE_BRACE + '\\n\\n';\n }\n }\n return text;\n}\n\n/**\n * @param {Array<StyleNode>} rules\n * @return {boolean}\n */\nfunction _hasMixinRules(rules) {\n let r = rules[0];\n return Boolean(r) && Boolean(r['selector']) && r['selector'].indexOf(VAR_START) === 0;\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction removeCustomProps(cssText) {\n cssText = removeCustomPropAssignment(cssText);\n return removeCustomPropApply(cssText);\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nexport function removeCustomPropAssignment(cssText) {\n return cssText\n .replace(RX.customProp, '')\n .replace(RX.mixinProp, '');\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction removeCustomPropApply(cssText) {\n return cssText\n .replace(RX.mixinApply, '')\n .replace(RX.varApply, '');\n}\n\n/** @enum {number} */\nexport const types = {\n STYLE_RULE: 1,\n KEYFRAMES_RULE: 7,\n MEDIA_RULE: 4,\n MIXIN_RULE: 1000\n}\n\nconst OPEN_BRACE = '{';\nconst CLOSE_BRACE = '}';\n\n// helper regexp's\nconst RX = {\n comments: /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n port: /@import[^;]*;/gim,\n customProp: /(?:^[^;\\-\\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\\n]|$)/gim,\n mixinProp: /(?:^[^;\\-\\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\\n]|$)?/gim,\n mixinApply: /@apply\\s*\\(?[^);]*\\)?\\s*(?:[;\\n]|$)?/gim,\n varApply: /[^;:]*?:[^;]*?var\\([^;]*\\)(?:[;\\n]|$)?/gim,\n keyframesRule: /^@[^\\s]*keyframes/,\n multipleSpaces: /\\s+/g\n}\n\nconst VAR_START = '--';\nconst MEDIA_START = '@media';\nconst AT_START = '@';\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nexport const nativeShadow = !(window['ShadyDOM'] && window['ShadyDOM']['inUse']);\nlet nativeCssVariables_;\n\n/**\n * @param {(ShadyCSSOptions | ShadyCSSInterface)=} settings\n */\nfunction calcCssVariables(settings) {\n if (settings && settings['shimcssproperties']) {\n nativeCssVariables_ = false;\n } else {\n // chrome 49 has semi-working css vars, check if box-shadow works\n // safari 9.1 has a recalc bug: https://bugs.webkit.org/show_bug.cgi?id=155782\n // However, shim css custom properties are only supported with ShadyDOM enabled,\n // so fall back on native if we do not detect ShadyDOM\n // Edge 15: custom properties used in ::before and ::after will also be used in the parent element\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12414257/\n nativeCssVariables_ = nativeShadow || Boolean(!navigator.userAgent.match(/AppleWebKit\\/601|Edge\\/15/) &&\n window.CSS && CSS.supports && CSS.supports('box-shadow', '0 0 0 var(--foo)'));\n }\n}\n\nif (window.ShadyCSS && window.ShadyCSS.nativeCss !== undefined) {\n nativeCssVariables_ = window.ShadyCSS.nativeCss;\n} else if (window.ShadyCSS) {\n calcCssVariables(window.ShadyCSS);\n // reset window variable to let ShadyCSS API take its place\n window.ShadyCSS = undefined;\n} else {\n calcCssVariables(window['WebComponents'] && window['WebComponents']['flags']);\n}\n\n// Hack for type error under new type inference which doesn't like that\n// nativeCssVariables is updated in a function and assigns the type\n// `function(): ?` instead of `boolean`.\nexport const nativeCssVariables = /** @type {boolean} */(nativeCssVariables_);\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nexport const VAR_ASSIGN = /(?:^|[;\\s{]\\s*)(--[\\w-]*?)\\s*:\\s*(?:((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^)]*?\\)|[^};{])+)|\\{([^}]*)\\}(?:(?=[;\\s}])|$))/gi;\nexport const MIXIN_MATCH = /(?:^|\\W+)@apply\\s*\\(?([^);\\n]*)\\)?/gi;\nexport const VAR_CONSUMED = /(--[\\w-]+)\\s*([:,;)]|$)/gi;\nexport const ANIMATION_MATCH = /(animation\\s*:)|(animation-name\\s*:)/;\nexport const MEDIA_MATCH = /@media\\s(.*)/;\nexport const IS_VAR = /^--/;\nexport const BRACKETED = /\\{[^}]*\\}/g;\nexport const HOST_PREFIX = '(?:^|[^.#[:])';\nexport const HOST_SUFFIX = '($|[.:[\\\\s>+~])';\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/** @type {!Set<string>} */\nconst styleTextSet = new Set();\n\nexport const scopingAttribute = 'shady-unscoped';\n\n/**\n * Add a specifically-marked style to the document directly, and only one copy of that style.\n *\n * @param {!HTMLStyleElement} style\n * @return {undefined}\n */\nexport function processUnscopedStyle(style) {\n const text = style.textContent;\n if (!styleTextSet.has(text)) {\n styleTextSet.add(text);\n const newStyle = style.cloneNode(true);\n document.head.appendChild(newStyle);\n }\n}\n\n/**\n * Check if a style is supposed to be unscoped\n * @param {!HTMLStyleElement} style\n * @return {boolean} true if the style has the unscoping attribute\n */\nexport function isUnscopedStyle(style) {\n return style.hasAttribute(scopingAttribute);\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {nativeShadow, nativeCssVariables} from './style-settings.js';\nimport {parse, stringify, types, StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\nimport {MEDIA_MATCH} from './common-regex.js';\nimport {processUnscopedStyle, isUnscopedStyle} from './unscoped-style-handler.js';\n\n/**\n * @param {string|StyleNode} rules\n * @param {function(StyleNode)=} callback\n * @return {string}\n */\nexport function toCssText (rules, callback) {\n if (!rules) {\n return '';\n }\n if (typeof rules === 'string') {\n rules = parse(rules);\n }\n if (callback) {\n forEachRule(rules, callback);\n }\n return stringify(rules, nativeCssVariables);\n}\n\n/**\n * @param {HTMLStyleElement} style\n * @return {StyleNode}\n */\nexport function rulesForStyle(style) {\n if (!style['__cssRules'] && style.textContent) {\n style['__cssRules'] = parse(style.textContent);\n }\n return style['__cssRules'] || null;\n}\n\n// Tests if a rule is a keyframes selector, which looks almost exactly\n// like a normal selector but is not (it has nothing to do with scoping\n// for example).\n/**\n * @param {StyleNode} rule\n * @return {boolean}\n */\nexport function isKeyframesSelector(rule) {\n return Boolean(rule['parent']) &&\n rule['parent']['type'] === types.KEYFRAMES_RULE;\n}\n\n/**\n * @param {StyleNode} node\n * @param {Function=} styleRuleCallback\n * @param {Function=} keyframesRuleCallback\n * @param {boolean=} onlyActiveRules\n */\nexport function forEachRule(node, styleRuleCallback, keyframesRuleCallback, onlyActiveRules) {\n if (!node) {\n return;\n }\n let skipRules = false;\n let type = node['type'];\n if (onlyActiveRules) {\n if (type === types.MEDIA_RULE) {\n let matchMedia = node['selector'].match(MEDIA_MATCH);\n if (matchMedia) {\n // if rule is a non matching @media rule, skip subrules\n if (!window.matchMedia(matchMedia[1]).matches) {\n skipRules = true;\n }\n }\n }\n }\n if (type === types.STYLE_RULE) {\n styleRuleCallback(node);\n } else if (keyframesRuleCallback &&\n type === types.KEYFRAMES_RULE) {\n keyframesRuleCallback(node);\n } else if (type === types.MIXIN_RULE) {\n skipRules = true;\n }\n let r$ = node['rules'];\n if (r$ && !skipRules) {\n for (let i=0, l=r$.length, r; (i<l) && (r=r$[i]); i++) {\n forEachRule(r, styleRuleCallback, keyframesRuleCallback, onlyActiveRules);\n }\n }\n}\n\n// add a string of cssText to the document.\n/**\n * @param {string} cssText\n * @param {string} moniker\n * @param {Node} target\n * @param {Node} contextNode\n * @return {HTMLStyleElement}\n */\nexport function applyCss(cssText, moniker, target, contextNode) {\n let style = createScopeStyle(cssText, moniker);\n applyStyle(style, target, contextNode);\n return style;\n}\n\n/**\n * @param {string} cssText\n * @param {string} moniker\n * @return {HTMLStyleElement}\n */\nexport function createScopeStyle(cssText, moniker) {\n let style = /** @type {HTMLStyleElement} */(document.createElement('style'));\n if (moniker) {\n style.setAttribute('scope', moniker);\n }\n style.textContent = cssText;\n return style;\n}\n\n/**\n * Track the position of the last added style for placing placeholders\n * @type {Node}\n */\nlet lastHeadApplyNode = null;\n\n// insert a comment node as a styling position placeholder.\n/**\n * @param {string} moniker\n * @return {!Comment}\n */\nexport function applyStylePlaceHolder(moniker) {\n let placeHolder = document.createComment(' Shady DOM styles for ' +\n moniker + ' ');\n let after = lastHeadApplyNode ?\n lastHeadApplyNode['nextSibling'] : null;\n let scope = document.head;\n scope.insertBefore(placeHolder, after || scope.firstChild);\n lastHeadApplyNode = placeHolder;\n return placeHolder;\n}\n\n/**\n * @param {HTMLStyleElement} style\n * @param {?Node} target\n * @param {?Node} contextNode\n */\nexport function applyStyle(style, target, contextNode) {\n target = target || document.head;\n let after = (contextNode && contextNode.nextSibling) ||\n target.firstChild;\n target.insertBefore(style, after);\n if (!lastHeadApplyNode) {\n lastHeadApplyNode = style;\n } else {\n // only update lastHeadApplyNode if the new style is inserted after the old lastHeadApplyNode\n let position = style.compareDocumentPosition(lastHeadApplyNode);\n if (position === Node.DOCUMENT_POSITION_PRECEDING) {\n lastHeadApplyNode = style;\n }\n }\n}\n\n/**\n * @param {string} buildType\n * @return {boolean}\n */\nexport function isTargetedBuild(buildType) {\n return nativeShadow ? buildType === 'shadow' : buildType === 'shady';\n}\n\n/**\n * @param {Element} element\n * @return {?string}\n */\nexport function getCssBuildType(element) {\n return element.getAttribute('css-build');\n}\n\n/**\n * Walk from text[start] matching parens and\n * returns position of the outer end paren\n * @param {string} text\n * @param {number} start\n * @return {number}\n */\nfunction findMatchingParen(text, start) {\n let level = 0;\n for (let i=start, l=text.length; i < l; i++) {\n if (text[i] === '(') {\n level++;\n } else if (text[i] === ')') {\n if (--level === 0) {\n return i;\n }\n }\n }\n return -1;\n}\n\n/**\n * @param {string} str\n * @param {function(string, string, string, string)} callback\n */\nexport function processVariableAndFallback(str, callback) {\n // find 'var('\n let start = str.indexOf('var(');\n if (start === -1) {\n // no var?, everything is prefix\n return callback(str, '', '', '');\n }\n //${prefix}var(${inner})${suffix}\n let end = findMatchingParen(str, start + 3);\n let inner = str.substring(start + 4, end);\n let prefix = str.substring(0, start);\n // suffix may have other variables\n let suffix = processVariableAndFallback(str.substring(end + 1), callback);\n let comma = inner.indexOf(',');\n // value and fallback args should be trimmed to match in property lookup\n if (comma === -1) {\n // variable, no fallback\n return callback(prefix, inner.trim(), '', suffix);\n }\n // var(${value},${fallback})\n let value = inner.substring(0, comma).trim();\n let fallback = inner.substring(comma + 1).trim();\n return callback(prefix, value, fallback, suffix);\n}\n\n/**\n * @param {Element} element\n * @param {string} value\n */\nexport function setElementClassRaw(element, value) {\n // use native setAttribute provided by ShadyDOM when setAttribute is patched\n if (nativeShadow) {\n element.setAttribute('class', value);\n } else {\n window['ShadyDOM']['nativeMethods']['setAttribute'].call(element, 'class', value);\n }\n}\n\n/**\n * @param {Element | {is: string, extends: string}} element\n * @return {{is: string, typeExtension: string}}\n */\nexport function getIsExtends(element) {\n let localName = element['localName'];\n let is = '', typeExtension = '';\n /*\n NOTE: technically, this can be wrong for certain svg elements\n with `-` in the name like `<font-face>`\n */\n if (localName) {\n if (localName.indexOf('-') > -1) {\n is = localName;\n } else {\n typeExtension = localName;\n is = (element.getAttribute && element.getAttribute('is')) || '';\n }\n } else {\n is = /** @type {?} */(element).is;\n typeExtension = /** @type {?} */(element).extends;\n }\n return {is, typeExtension};\n}\n\n/**\n * @param {Element|DocumentFragment} element\n * @return {string}\n */\nexport function gatherStyleText(element) {\n /** @type {!Array<string>} */\n const styleTextParts = [];\n const styles = /** @type {!NodeList<!HTMLStyleElement>} */(element.querySelectorAll('style'));\n for (let i = 0; i < styles.length; i++) {\n const style = styles[i];\n if (isUnscopedStyle(style)) {\n if (!nativeShadow) {\n processUnscopedStyle(style);\n style.parentNode.removeChild(style);\n }\n } else {\n styleTextParts.push(style.textContent);\n style.parentNode.removeChild(style);\n }\n }\n return styleTextParts.join('').trim();\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\nimport * as StyleUtil from './style-util.js';\nimport {nativeShadow} from './style-settings.js';\n\n/* Transforms ShadowDOM styling into ShadyDOM styling\n\n* scoping:\n\n * elements in scope get scoping selector class=\"x-foo-scope\"\n * selectors re-written as follows:\n\n div button -> div.x-foo-scope button.x-foo-scope\n\n* :host -> scopeName\n\n* :host(...) -> scopeName...\n\n* ::slotted(...) -> scopeName > ...\n\n* ...:dir(ltr|rtl) -> [dir=\"ltr|rtl\"] ..., ...[dir=\"ltr|rtl\"]\n\n* :host(:dir[rtl]) -> scopeName:dir(rtl) -> [dir=\"rtl\"] scopeName, scopeName[dir=\"rtl\"]\n\n*/\nconst SCOPE_NAME = 'style-scope';\n\nclass StyleTransformer {\n get SCOPE_NAME() {\n return SCOPE_NAME;\n }\n /**\n * Given a node and scope name, add a scoping class to each node\n * in the tree. This facilitates transforming css into scoped rules.\n * @param {?} node\n * @param {?} scope\n * @param {?=} shouldRemoveScope\n */\n dom(node, scope, shouldRemoveScope) {\n // one time optimization to skip scoping...\n if (node['__styleScoped']) {\n node['__styleScoped'] = null;\n } else {\n this._transformDom(node, scope || '', shouldRemoveScope);\n }\n }\n\n _transformDom(node, selector, shouldRemoveScope) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n this.element(node, selector, shouldRemoveScope);\n }\n let c$ = (node.localName === 'template') ?\n (node.content || node._content).childNodes :\n node.children || node.childNodes;\n if (c$) {\n for (let i=0; i<c$.length; i++) {\n this._transformDom(c$[i], selector, shouldRemoveScope);\n }\n }\n }\n /**\n * @param {?} element\n * @param {?} scope\n * @param {?=} shouldRemoveScope\n */\n element(element, scope, shouldRemoveScope) {\n // note: if using classes, we add both the general 'style-scope' class\n // as well as the specific scope. This enables easy filtering of all\n // `style-scope` elements\n if (scope) {\n // note: svg on IE does not have classList so fallback to class\n if (element.classList) {\n if (shouldRemoveScope) {\n element.classList.remove(SCOPE_NAME);\n element.classList.remove(scope);\n } else {\n element.classList.add(SCOPE_NAME);\n element.classList.add(scope);\n }\n } else if (element.getAttribute) {\n let c = element.getAttribute(CLASS);\n if (shouldRemoveScope) {\n if (c) {\n let newValue = c.replace(SCOPE_NAME, '').replace(scope, '');\n StyleUtil.setElementClassRaw(element, newValue);\n }\n } else {\n let newValue = (c ? c + ' ' : '') + SCOPE_NAME + ' ' + scope;\n StyleUtil.setElementClassRaw(element, newValue);\n }\n }\n }\n }\n\n /**\n * @param {?} element\n * @param {?} styleRules\n * @param {?=} callback\n */\n elementStyles(element, styleRules, callback) {\n let cssBuildType = element['__cssBuild'];\n // no need to shim selectors if settings.useNativeShadow, also\n // a shady css build will already have transformed selectors\n // NOTE: This method may be called as part of static or property shimming.\n // When there is a targeted build it will not be called for static shimming,\n // but when the property shim is used it is called and should opt out of\n // static shimming work when a proper build exists.\n let cssText = '';\n if (nativeShadow || cssBuildType === 'shady') {\n cssText = StyleUtil.toCssText(styleRules, callback);\n } else {\n let {is, typeExtension} = StyleUtil.getIsExtends(element);\n cssText = this.css(styleRules, is, typeExtension, callback) + '\\n\\n';\n }\n return cssText.trim();\n }\n\n // Given a string of cssText and a scoping string (scope), returns\n // a string of scoped css where each selector is transformed to include\n // a class created from the scope. ShadowDOM selectors are also transformed\n // (e.g. :host) to use the scoping selector.\n css(rules, scope, ext, callback) {\n let hostScope = this._calcHostScope(scope, ext);\n scope = this._calcElementScope(scope);\n let self = this;\n return StyleUtil.toCssText(rules, function(/** StyleNode */rule) {\n if (!rule.isScoped) {\n self.rule(rule, scope, hostScope);\n rule.isScoped = true;\n }\n if (callback) {\n callback(rule, scope, hostScope);\n }\n });\n }\n\n _calcElementScope(scope) {\n if (scope) {\n return CSS_CLASS_PREFIX + scope;\n } else {\n return '';\n }\n }\n\n _calcHostScope(scope, ext) {\n return ext ? `[is=${scope}]` : scope;\n }\n\n rule(rule, scope, hostScope) {\n this._transformRule(rule, this._transformComplexSelector,\n scope, hostScope);\n }\n\n /**\n * transforms a css rule to a scoped rule.\n *\n * @param {StyleNode} rule\n * @param {Function} transformer\n * @param {string=} scope\n * @param {string=} hostScope\n */\n _transformRule(rule, transformer, scope, hostScope) {\n // NOTE: save transformedSelector for subsequent matching of elements\n // against selectors (e.g. when calculating style properties)\n rule['selector'] = rule.transformedSelector =\n this._transformRuleCss(rule, transformer, scope, hostScope);\n }\n\n /**\n * @param {StyleNode} rule\n * @param {Function} transformer\n * @param {string=} scope\n * @param {string=} hostScope\n */\n _transformRuleCss(rule, transformer, scope, hostScope) {\n let p$ = rule['selector'].split(COMPLEX_SELECTOR_SEP);\n // we want to skip transformation of rules that appear in keyframes,\n // because they are keyframe selectors, not element selectors.\n if (!StyleUtil.isKeyframesSelector(rule)) {\n for (let i=0, l=p$.length, p; (i<l) && (p=p$[i]); i++) {\n p$[i] = transformer.call(this, p, scope, hostScope);\n }\n }\n return p$.join(COMPLEX_SELECTOR_SEP);\n }\n\n /**\n * @param {string} selector\n * @return {string}\n */\n _twiddleNthPlus(selector) {\n return selector.replace(NTH, (m, type, inside) => {\n if (inside.indexOf('+') > -1) {\n inside = inside.replace(/\\+/g, '___');\n } else if (inside.indexOf('___') > -1) {\n inside = inside.replace(/___/g, '+');\n }\n return `:${type}(${inside})`;\n });\n }\n\n/**\n * @param {string} selector\n * @param {string} scope\n * @param {string=} hostScope\n */\n _transformComplexSelector(selector, scope, hostScope) {\n let stop = false;\n selector = selector.trim();\n // Remove spaces inside of selectors like `:nth-of-type` because it confuses SIMPLE_SELECTOR_SEP\n let isNth = NTH.test(selector);\n if (isNth) {\n selector = selector.replace(NTH, (m, type, inner) => `:${type}(${inner.replace(/\\s/g, '')})`)\n selector = this._twiddleNthPlus(selector);\n }\n selector = selector.replace(SLOTTED_START, `${HOST} $1`);\n selector = selector.replace(SIMPLE_SELECTOR_SEP, (m, c, s) => {\n if (!stop) {\n let info = this._transformCompoundSelector(s, c, scope, hostScope);\n stop = stop || info.stop;\n c = info.combinator;\n s = info.value;\n }\n return c + s;\n });\n if (isNth) {\n selector = this._twiddleNthPlus(selector);\n }\n return selector;\n }\n\n _transformCompoundSelector(selector, combinator, scope, hostScope) {\n // replace :host with host scoping class\n let slottedIndex = selector.indexOf(SLOTTED);\n if (selector.indexOf(HOST) >= 0) {\n selector = this._transformHostSelector(selector, hostScope);\n // replace other selectors with scoping class\n } else if (slottedIndex !== 0) {\n selector = scope ? this._transformSimpleSelector(selector, scope) :\n selector;\n }\n // mark ::slotted() scope jump to replace with descendant selector + arg\n // also ignore left-side combinator\n let slotted = false;\n if (slottedIndex >= 0) {\n combinator = '';\n slotted = true;\n }\n // process scope jumping selectors up to the scope jump and then stop\n let stop;\n if (slotted) {\n stop = true;\n if (slotted) {\n // .zonk ::slotted(.foo) -> .zonk.scope > .foo\n selector = selector.replace(SLOTTED_PAREN, (m, paren) => ` > ${paren}`);\n }\n }\n selector = selector.replace(DIR_PAREN, (m, before, dir) =>\n `[dir=\"${dir}\"] ${before}, ${before}[dir=\"${dir}\"]`);\n return {value: selector, combinator, stop};\n }\n\n _transformSimpleSelector(selector, scope) {\n let p$ = selector.split(PSEUDO_PREFIX);\n p$[0] += scope;\n return p$.join(PSEUDO_PREFIX);\n }\n\n // :host(...) -> scopeName...\n _transformHostSelector(selector, hostScope) {\n let m = selector.match(HOST_PAREN);\n let paren = m && m[2].trim() || '';\n if (paren) {\n if (!paren[0].match(SIMPLE_SELECTOR_PREFIX)) {\n // paren starts with a type selector\n let typeSelector = paren.split(SIMPLE_SELECTOR_PREFIX)[0];\n // if the type selector is our hostScope then avoid pre-pending it\n if (typeSelector === hostScope) {\n return paren;\n // otherwise, this selector should not match in this scope so\n // output a bogus selector.\n } else {\n return SELECTOR_NO_MATCH;\n }\n } else {\n // make sure to do a replace here to catch selectors like:\n // `:host(.foo)::before`\n return selector.replace(HOST_PAREN, function(m, host, paren) {\n return hostScope + paren;\n });\n }\n // if no paren, do a straight :host replacement.\n // TODO(sorvell): this should not strictly be necessary but\n // it's needed to maintain support for `:host[foo]` type selectors\n // which have been improperly used under Shady DOM. This should be\n // deprecated.\n } else {\n return selector.replace(HOST, hostScope);\n }\n }\n\n /**\n * @param {StyleNode} rule\n */\n documentRule(rule) {\n // reset selector in case this is redone.\n rule['selector'] = rule['parsedSelector'];\n this.normalizeRootSelector(rule);\n this._transformRule(rule, this._transformDocumentSelector);\n }\n\n /**\n * @param {StyleNode} rule\n */\n normalizeRootSelector(rule) {\n if (rule['selector'] === ROOT) {\n rule['selector'] = 'html';\n }\n }\n\n/**\n * @param {string} selector\n */\n _transformDocumentSelector(selector) {\n return selector.match(SLOTTED) ?\n this._transformComplexSelector(selector, SCOPE_DOC_SELECTOR) :\n this._transformSimpleSelector(selector.trim(), SCOPE_DOC_SELECTOR);\n }\n}\n\nlet NTH = /:(nth[-\\w]+)\\(([^)]+)\\)/;\nlet SCOPE_DOC_SELECTOR = `:not(.${SCOPE_NAME})`;\nlet COMPLEX_SELECTOR_SEP = ',';\nlet SIMPLE_SELECTOR_SEP = /(^|[\\s>+~]+)((?:\\[.+?\\]|[^\\s>+~=[])+)/g;\nlet SIMPLE_SELECTOR_PREFIX = /[[.:#*]/;\nlet HOST = ':host';\nlet ROOT = ':root';\nlet SLOTTED = '::slotted';\nlet SLOTTED_START = new RegExp(`^(${SLOTTED})`);\n// NOTE: this supports 1 nested () pair for things like\n// :host(:not([selected]), more general support requires\n// parsing which seems like overkill\nlet HOST_PAREN = /(:host)(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))/;\n// similar to HOST_PAREN\nlet SLOTTED_PAREN = /(?:::slotted)(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))/;\nlet DIR_PAREN = /(.*):dir\\((?:(ltr|rtl))\\)/;\nlet CSS_CLASS_PREFIX = '.';\nlet PSEUDO_PREFIX = ':';\nlet CLASS = 'class';\nlet SELECTOR_NO_MATCH = 'should_not_match';\n\nexport default new StyleTransformer()\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\n\n/** @const {string} */\nconst infoKey = '__styleInfo';\n\nexport default class StyleInfo {\n /**\n * @param {Element} node\n * @return {StyleInfo}\n */\n static get(node) {\n if (node) {\n return node[infoKey];\n } else {\n return null;\n }\n }\n /**\n * @param {!Element} node\n * @param {StyleInfo} styleInfo\n * @return {StyleInfo}\n */\n static set(node, styleInfo) {\n node[infoKey] = styleInfo;\n return styleInfo;\n }\n /**\n * @param {StyleNode} ast\n * @param {Node=} placeholder\n * @param {Array<string>=} ownStylePropertyNames\n * @param {string=} elementName\n * @param {string=} typeExtension\n * @param {string=} cssBuild\n */\n constructor(ast, placeholder, ownStylePropertyNames, elementName, typeExtension, cssBuild) {\n /** @type {StyleNode} */\n this.styleRules = ast || null;\n /** @type {Node} */\n this.placeholder = placeholder || null;\n /** @type {!Array<string>} */\n this.ownStylePropertyNames = ownStylePropertyNames || [];\n /** @type {Array<Object>} */\n this.overrideStyleProperties = null;\n /** @type {string} */\n this.elementName = elementName || '';\n /** @type {string} */\n this.cssBuild = cssBuild || '';\n /** @type {string} */\n this.typeExtension = typeExtension || '';\n /** @type {Object<string, string>} */\n this.styleProperties = null;\n /** @type {?string} */\n this.scopeSelector = null;\n /** @type {HTMLStyleElement} */\n this.customStyle = null;\n }\n _getStyleRules() {\n return this.styleRules;\n }\n}\n\nStyleInfo.prototype['_getStyleRules'] = StyleInfo.prototype._getStyleRules;","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {removeCustomPropAssignment, StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\nimport {nativeShadow} from './style-settings.js';\nimport StyleTransformer from './style-transformer.js';\nimport * as StyleUtil from './style-util.js';\nimport * as RX from './common-regex.js';\nimport StyleInfo from './style-info.js';\n\n// TODO: dedupe with shady\n/**\n * @param {string} selector\n * @return {boolean}\n * @this {Element}\n */\nconst matchesSelector = function(selector) {\n const method = this.matches || this.matchesSelector ||\n this.mozMatchesSelector || this.msMatchesSelector ||\n this.oMatchesSelector || this.webkitMatchesSelector;\n return method && method.call(this, selector);\n};\n\nconst IS_IE = navigator.userAgent.match('Trident');\n\nconst XSCOPE_NAME = 'x-scope';\n\nclass StyleProperties {\n get XSCOPE_NAME() {\n return XSCOPE_NAME;\n }\n/**\n * decorates styles with rule info and returns an array of used style property names\n *\n * @param {StyleNode} rules\n * @return {Array<string>}\n */\n decorateStyles(rules) {\n let self = this, props = {}, keyframes = [], ruleIndex = 0;\n StyleUtil.forEachRule(rules, function(rule) {\n self.decorateRule(rule);\n // mark in-order position of ast rule in styles block, used for cache key\n rule.index = ruleIndex++;\n self.collectPropertiesInCssText(rule.propertyInfo.cssText, props);\n }, function onKeyframesRule(rule) {\n keyframes.push(rule);\n });\n // Cache all found keyframes rules for later reference:\n rules._keyframes = keyframes;\n // return this list of property names *consumes* in these styles.\n let names = [];\n for (let i in props) {\n names.push(i);\n }\n return names;\n }\n\n // decorate a single rule with property info\n decorateRule(rule) {\n if (rule.propertyInfo) {\n return rule.propertyInfo;\n }\n let info = {}, properties = {};\n let hasProperties = this.collectProperties(rule, properties);\n if (hasProperties) {\n info.properties = properties;\n // TODO(sorvell): workaround parser seeing mixins as additional rules\n rule['rules'] = null;\n }\n info.cssText = this.collectCssText(rule);\n rule.propertyInfo = info;\n return info;\n }\n\n // collects the custom properties from a rule's cssText\n collectProperties(rule, properties) {\n let info = rule.propertyInfo;\n if (info) {\n if (info.properties) {\n Object.assign(properties, info.properties);\n return true;\n }\n } else {\n let m, rx = RX.VAR_ASSIGN;\n let cssText = rule['parsedCssText'];\n let value;\n let any;\n while ((m = rx.exec(cssText))) {\n // note: group 2 is var, 3 is mixin\n value = (m[2] || m[3]).trim();\n // value of 'inherit' or 'unset' is equivalent to not setting the property here\n if (value !== 'inherit' || value !== 'unset') {\n properties[m[1].trim()] = value;\n }\n any = true;\n }\n return any;\n }\n\n }\n\n // returns cssText of properties that consume variables/mixins\n collectCssText(rule) {\n return this.collectConsumingCssText(rule['parsedCssText']);\n }\n\n // NOTE: we support consumption inside mixin assignment\n // but not production, so strip out {...}\n collectConsumingCssText(cssText) {\n return cssText.replace(RX.BRACKETED, '')\n .replace(RX.VAR_ASSIGN, '');\n }\n\n collectPropertiesInCssText(cssText, props) {\n let m;\n while ((m = RX.VAR_CONSUMED.exec(cssText))) {\n let name = m[1];\n // This regex catches all variable names, and following non-whitespace char\n // If next char is not ':', then variable is a consumer\n if (m[2] !== ':') {\n props[name] = true;\n }\n }\n }\n\n // turns custom properties into realized values.\n reify(props) {\n // big perf optimization here: reify only *own* properties\n // since this object has __proto__ of the element's scope properties\n let names = Object.getOwnPropertyNames(props);\n for (let i=0, n; i < names.length; i++) {\n n = names[i];\n props[n] = this.valueForProperty(props[n], props);\n }\n }\n\n // given a property value, returns the reified value\n // a property value may be:\n // (1) a literal value like: red or 5px;\n // (2) a variable value like: var(--a), var(--a, red), or var(--a, --b) or\n // var(--a, var(--b));\n // (3) a literal mixin value like { properties }. Each of these properties\n // can have values that are: (a) literal, (b) variables, (c) @apply mixins.\n valueForProperty(property, props) {\n // case (1) default\n // case (3) defines a mixin and we have to reify the internals\n if (property) {\n if (property.indexOf(';') >=0) {\n property = this.valueForProperties(property, props);\n } else {\n // case (2) variable\n let self = this;\n let fn = function(prefix, value, fallback, suffix) {\n if (!value) {\n return prefix + suffix;\n }\n let propertyValue = self.valueForProperty(props[value], props);\n // if value is \"initial\", then the variable should be treated as unset\n if (!propertyValue || propertyValue === 'initial') {\n // fallback may be --a or var(--a) or literal\n propertyValue = self.valueForProperty(props[fallback] || fallback, props) ||\n fallback;\n } else if (propertyValue === 'apply-shim-inherit') {\n // CSS build will replace `inherit` with `apply-shim-inherit`\n // for use with native css variables.\n // Since we have full control, we can use `inherit` directly.\n propertyValue = 'inherit';\n }\n return prefix + (propertyValue || '') + suffix;\n };\n property = StyleUtil.processVariableAndFallback(property, fn);\n }\n }\n return property && property.trim() || '';\n }\n\n // note: we do not yet support mixin within mixin\n valueForProperties(property, props) {\n let parts = property.split(';');\n for (let i=0, p, m; i<parts.length; i++) {\n if ((p = parts[i])) {\n RX.MIXIN_MATCH.lastIndex = 0;\n m = RX.MIXIN_MATCH.exec(p);\n if (m) {\n p = this.valueForProperty(props[m[1]], props);\n } else {\n let colon = p.indexOf(':');\n if (colon !== -1) {\n let pp = p.substring(colon);\n pp = pp.trim();\n pp = this.valueForProperty(pp, props) || pp;\n p = p.substring(0, colon) + pp;\n }\n }\n parts[i] = (p && p.lastIndexOf(';') === p.length - 1) ?\n // strip trailing ;\n p.slice(0, -1) :\n p || '';\n }\n }\n return parts.join(';');\n }\n\n applyProperties(rule, props) {\n let output = '';\n // dynamically added sheets may not be decorated so ensure they are.\n if (!rule.propertyInfo) {\n this.decorateRule(rule);\n }\n if (rule.propertyInfo.cssText) {\n output = this.valueForProperties(rule.propertyInfo.cssText, props);\n }\n rule['cssText'] = output;\n }\n\n // Apply keyframe transformations to the cssText of a given rule. The\n // keyframeTransforms object is a map of keyframe names to transformer\n // functions which take in cssText and spit out transformed cssText.\n applyKeyframeTransforms(rule, keyframeTransforms) {\n let input = rule['cssText'];\n let output = rule['cssText'];\n if (rule.hasAnimations == null) {\n // Cache whether or not the rule has any animations to begin with:\n rule.hasAnimations = RX.ANIMATION_MATCH.test(input);\n }\n // If there are no animations referenced, we can skip transforms:\n if (rule.hasAnimations) {\n let transform;\n // If we haven't transformed this rule before, we iterate over all\n // transforms:\n if (rule.keyframeNamesToTransform == null) {\n rule.keyframeNamesToTransform = [];\n for (let keyframe in keyframeTransforms) {\n transform = keyframeTransforms[keyframe];\n output = transform(input);\n // If the transform actually changed the CSS text, we cache the\n // transform name for future use:\n if (input !== output) {\n input = output;\n rule.keyframeNamesToTransform.push(keyframe);\n }\n }\n } else {\n // If we already have a list of keyframe names that apply to this\n // rule, we apply only those keyframe name transforms:\n for (let i = 0; i < rule.keyframeNamesToTransform.length; ++i) {\n transform = keyframeTransforms[rule.keyframeNamesToTransform[i]];\n input = transform(input);\n }\n output = input;\n }\n }\n rule['cssText'] = output;\n }\n\n // Test if the rules in these styles matches the given `element` and if so,\n // collect any custom properties into `props`.\n /**\n * @param {StyleNode} rules\n * @param {Element} element\n */\n propertyDataFromStyles(rules, element) {\n let props = {}, self = this;\n // generates a unique key for these matches\n let o = [];\n // note: active rules excludes non-matching @media rules\n StyleUtil.forEachRule(rules, function(rule) {\n // TODO(sorvell): we could trim the set of rules at declaration\n // time to only include ones that have properties\n if (!rule.propertyInfo) {\n self.decorateRule(rule);\n }\n // match element against transformedSelector: selector may contain\n // unwanted uniquification and parsedSelector does not directly match\n // for :host selectors.\n let selectorToMatch = rule.transformedSelector || rule['parsedSelector'];\n if (element && rule.propertyInfo.properties && selectorToMatch) {\n if (matchesSelector.call(element, selectorToMatch)) {\n self.collectProperties(rule, props);\n // produce numeric key for these matches for lookup\n addToBitMask(rule.index, o);\n }\n }\n }, null, true);\n return {properties: props, key: o};\n }\n\n /**\n * @param {Element} scope\n * @param {StyleNode} rule\n * @param {string|undefined} cssBuild\n * @param {function(Object)} callback\n */\n whenHostOrRootRule(scope, rule, cssBuild, callback) {\n if (!rule.propertyInfo) {\n this.decorateRule(rule);\n }\n if (!rule.propertyInfo.properties) {\n return;\n }\n let {is, typeExtension} = StyleUtil.getIsExtends(scope);\n let hostScope = is ?\n StyleTransformer._calcHostScope(is, typeExtension) :\n 'html';\n let parsedSelector = rule['parsedSelector'];\n let isRoot = (parsedSelector === ':host > *' || parsedSelector === 'html');\n let isHost = parsedSelector.indexOf(':host') === 0 && !isRoot;\n // build info is either in scope (when scope is an element) or in the style\n // when scope is the default scope; note: this allows default scope to have\n // mixed mode built and unbuilt styles.\n if (cssBuild === 'shady') {\n // :root -> x-foo > *.x-foo for elements and html for custom-style\n isRoot = parsedSelector === (hostScope + ' > *.' + hostScope) || parsedSelector.indexOf('html') !== -1;\n // :host -> x-foo for elements, but sub-rules have .x-foo in them\n isHost = !isRoot && parsedSelector.indexOf(hostScope) === 0;\n }\n if (cssBuild === 'shadow') {\n isRoot = parsedSelector === ':host > *' || parsedSelector === 'html';\n isHost = isHost && !isRoot;\n }\n if (!isRoot && !isHost) {\n return;\n }\n let selectorToMatch = hostScope;\n if (isHost) {\n // need to transform :host because `:host` does not work with `matches`\n if (!rule.transformedSelector) {\n // transform :host into a matchable selector\n rule.transformedSelector =\n StyleTransformer._transformRuleCss(\n rule,\n StyleTransformer._transformComplexSelector,\n StyleTransformer._calcElementScope(is),\n hostScope\n );\n }\n selectorToMatch = rule.transformedSelector || hostScope;\n }\n callback({\n selector: selectorToMatch,\n isHost: isHost,\n isRoot: isRoot\n });\n }\n/**\n * @param {Element} scope\n * @param {StyleNode} rules\n * @return {Object}\n */\n hostAndRootPropertiesForScope(scope, rules) {\n let hostProps = {}, rootProps = {}, self = this;\n // note: active rules excludes non-matching @media rules\n let cssBuild = rules && rules['__cssBuild'];\n StyleUtil.forEachRule(rules, function(rule) {\n // if scope is StyleDefaults, use _element for matchesSelector\n self.whenHostOrRootRule(scope, rule, cssBuild, function(info) {\n let element = scope._element || scope;\n if (matchesSelector.call(element, info.selector)) {\n if (info.isHost) {\n self.collectProperties(rule, hostProps);\n } else {\n self.collectProperties(rule, rootProps);\n }\n }\n });\n }, null, true);\n return {rootProps: rootProps, hostProps: hostProps};\n }\n\n /**\n * @param {Element} element\n * @param {Object} properties\n * @param {string} scopeSelector\n */\n transformStyles(element, properties, scopeSelector) {\n let self = this;\n let {is, typeExtension} = StyleUtil.getIsExtends(element);\n let hostSelector = StyleTransformer\n ._calcHostScope(is, typeExtension);\n let rxHostSelector = element.extends ?\n '\\\\' + hostSelector.slice(0, -1) + '\\\\]' :\n hostSelector;\n let hostRx = new RegExp(RX.HOST_PREFIX + rxHostSelector +\n RX.HOST_SUFFIX);\n let rules = StyleInfo.get(element).styleRules;\n let keyframeTransforms =\n this._elementKeyframeTransforms(element, rules, scopeSelector);\n return StyleTransformer.elementStyles(element, rules, function(rule) {\n self.applyProperties(rule, properties);\n if (!nativeShadow &&\n !StyleUtil.isKeyframesSelector(rule) &&\n rule['cssText']) {\n // NOTE: keyframe transforms only scope munge animation names, so it\n // is not necessary to apply them in ShadowDOM.\n self.applyKeyframeTransforms(rule, keyframeTransforms);\n self._scopeSelector(rule, hostRx, hostSelector, scopeSelector);\n }\n });\n }\n\n /**\n * @param {Element} element\n * @param {StyleNode} rules\n * @param {string} scopeSelector\n * @return {Object}\n */\n _elementKeyframeTransforms(element, rules, scopeSelector) {\n let keyframesRules = rules._keyframes;\n let keyframeTransforms = {};\n if (!nativeShadow && keyframesRules) {\n // For non-ShadowDOM, we transform all known keyframes rules in\n // advance for the current scope. This allows us to catch keyframes\n // rules that appear anywhere in the stylesheet:\n for (let i = 0, keyframesRule = keyframesRules[i];\n i < keyframesRules.length;\n keyframesRule = keyframesRules[++i]) {\n this._scopeKeyframes(keyframesRule, scopeSelector);\n keyframeTransforms[keyframesRule['keyframesName']] =\n this._keyframesRuleTransformer(keyframesRule);\n }\n }\n return keyframeTransforms;\n }\n\n // Generate a factory for transforming a chunk of CSS text to handle a\n // particular scoped keyframes rule.\n /**\n * @param {StyleNode} keyframesRule\n * @return {function(string):string}\n */\n _keyframesRuleTransformer(keyframesRule) {\n return function(cssText) {\n return cssText.replace(\n keyframesRule.keyframesNameRx,\n keyframesRule.transformedKeyframesName);\n };\n }\n\n/**\n * Transforms `@keyframes` names to be unique for the current host.\n * Example: @keyframes foo-anim -> @keyframes foo-anim-x-foo-0\n *\n * @param {StyleNode} rule\n * @param {string} scopeId\n */\n _scopeKeyframes(rule, scopeId) {\n // Animation names are of the form [\\w-], so ensure that the name regex does not partially apply\n // to similarly named keyframe names by checking for a word boundary at the beginning and\n // a non-word boundary or `-` at the end.\n rule.keyframesNameRx = new RegExp(`\\\\b${rule['keyframesName']}(?!\\\\B|-)`, 'g');\n rule.transformedKeyframesName = rule['keyframesName'] + '-' + scopeId;\n rule.transformedSelector = rule.transformedSelector || rule['selector'];\n rule['selector'] = rule.transformedSelector.replace(\n rule['keyframesName'], rule.transformedKeyframesName);\n }\n\n // Strategy: x scope shim a selector e.g. to scope `.x-foo-42` (via classes):\n // non-host selector: .a.x-foo -> .x-foo-42 .a.x-foo\n // host selector: x-foo.wide -> .x-foo-42.wide\n // note: we use only the scope class (.x-foo-42) and not the hostSelector\n // (x-foo) to scope :host rules; this helps make property host rules\n // have low specificity. They are overrideable by class selectors but,\n // unfortunately, not by type selectors (e.g. overriding via\n // `.special` is ok, but not by `x-foo`).\n /**\n * @param {StyleNode} rule\n * @param {RegExp} hostRx\n * @param {string} hostSelector\n * @param {string} scopeId\n */\n _scopeSelector(rule, hostRx, hostSelector, scopeId) {\n rule.transformedSelector = rule.transformedSelector || rule['selector'];\n let selector = rule.transformedSelector;\n let scope = '.' + scopeId;\n let parts = selector.split(',');\n for (let i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n parts[i] = p.match(hostRx) ?\n p.replace(hostSelector, scope) :\n scope + ' ' + p;\n }\n rule['selector'] = parts.join(',');\n }\n\n /**\n * @param {Element} element\n * @param {string} selector\n * @param {string} old\n */\n applyElementScopeSelector(element, selector, old) {\n let c = element.getAttribute('class') || '';\n let v = c;\n if (old) {\n v = c.replace(\n new RegExp('\\\\s*' + XSCOPE_NAME + '\\\\s*' + old + '\\\\s*', 'g'), ' ');\n }\n v += (v ? ' ' : '') + XSCOPE_NAME + ' ' + selector;\n if (c !== v) {\n StyleUtil.setElementClassRaw(element, v);\n }\n }\n\n /**\n * @param {HTMLElement} element\n * @param {Object} properties\n * @param {string} selector\n * @param {HTMLStyleElement} style\n * @return {HTMLStyleElement}\n */\n applyElementStyle(element, properties, selector, style) {\n // calculate cssText to apply\n let cssText = style ? style.textContent || '' :\n this.transformStyles(element, properties, selector);\n // if shady and we have a cached style that is not style, decrement\n let styleInfo = StyleInfo.get(element);\n let s = styleInfo.customStyle;\n if (s && !nativeShadow && (s !== style)) {\n s['_useCount']--;\n if (s['_useCount'] <= 0 && s.parentNode) {\n s.parentNode.removeChild(s);\n }\n }\n // apply styling always under native or if we generated style\n // or the cached style is not in document(!)\n if (nativeShadow) {\n // update existing style only under native\n if (styleInfo.customStyle) {\n styleInfo.customStyle.textContent = cssText;\n style = styleInfo.customStyle;\n // otherwise, if we have css to apply, do so\n } else if (cssText) {\n // apply css after the scope style of the element to help with\n // style precedence rules.\n style = StyleUtil.applyCss(cssText, selector, element.shadowRoot,\n styleInfo.placeholder);\n }\n } else {\n // shady and no cache hit\n if (!style) {\n // apply css after the scope style of the element to help with\n // style precedence rules.\n if (cssText) {\n style = StyleUtil.applyCss(cssText, selector, null,\n styleInfo.placeholder);\n }\n // shady and cache hit but not in document\n } else if (!style.parentNode) {\n if (IS_IE && cssText.indexOf('@media') > -1) {\n // @media rules may be stale in IE 10 and 11\n // refresh the text content of the style to revalidate them.\n style.textContent = cssText;\n }\n StyleUtil.applyStyle(style, null, styleInfo.placeholder);\n }\n }\n // ensure this style is our custom style and increment its use count.\n if (style) {\n style['_useCount'] = style['_useCount'] || 0;\n // increment use count if we changed styles\n if (styleInfo.customStyle != style) {\n style['_useCount']++;\n }\n styleInfo.customStyle = style;\n }\n return style;\n }\n\n /**\n * @param {Element} style\n * @param {Object} properties\n */\n applyCustomStyle(style, properties) {\n let rules = StyleUtil.rulesForStyle(/** @type {HTMLStyleElement} */(style));\n let self = this;\n style.textContent = StyleUtil.toCssText(rules, function(/** StyleNode */rule) {\n let css = rule['cssText'] = rule['parsedCssText'];\n if (rule.propertyInfo && rule.propertyInfo.cssText) {\n // remove property assignments\n // so next function isn't confused\n // NOTE: we have 3 categories of css:\n // (1) normal properties,\n // (2) custom property assignments (--foo: red;),\n // (3) custom property usage: border: var(--foo); @apply(--foo);\n // In elements, 1 and 3 are separated for efficiency; here they\n // are not and this makes this case unique.\n css = removeCustomPropAssignment(/** @type {string} */(css));\n // replace with reified properties, scenario is same as mixin\n rule['cssText'] = self.valueForProperties(css, properties);\n }\n });\n }\n}\n\n/**\n * @param {number} n\n * @param {Array<number>} bits\n */\nfunction addToBitMask(n, bits) {\n let o = parseInt(n / 32, 10);\n let v = 1 << (n % 32);\n bits[o] = (bits[o] || 0) | v;\n}\n\nexport default new StyleProperties();","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {applyStylePlaceHolder} from './style-util.js';\nimport {nativeShadow} from './style-settings.js';\n\n/** @type {Object<string, !Node>} */\nlet placeholderMap = {};\n\n/**\n * @const {CustomElementRegistry}\n */\nconst ce = window['customElements'];\nif (ce && !nativeShadow) {\n /**\n * @const {function(this:CustomElementRegistry, string,function(new:HTMLElement),{extends: string}=)}\n */\n const origDefine = ce['define'];\n /**\n * @param {string} name\n * @param {function(new:HTMLElement)} clazz\n * @param {{extends: string}=} options\n */\n const wrappedDefine = (name, clazz, options) => {\n placeholderMap[name] = applyStylePlaceHolder(name);\n origDefine.call(/** @type {!CustomElementRegistry} */(ce), name, clazz, options);\n };\n ce['define'] = wrappedDefine;\n}\n\nexport default placeholderMap;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n'use strict';\n\nexport default class StyleCache {\n constructor(typeMax = 100) {\n // map element name -> [{properties, styleElement, scopeSelector}]\n this.cache = {};\n this.typeMax = typeMax;\n }\n\n _validate(cacheEntry, properties, ownPropertyNames) {\n for (let idx = 0; idx < ownPropertyNames.length; idx++) {\n let pn = ownPropertyNames[idx];\n if (cacheEntry.properties[pn] !== properties[pn]) {\n return false;\n }\n }\n return true;\n }\n\n store(tagname, properties, styleElement, scopeSelector) {\n let list = this.cache[tagname] || [];\n list.push({properties, styleElement, scopeSelector});\n if (list.length > this.typeMax) {\n list.shift();\n }\n this.cache[tagname] = list;\n }\n\n fetch(tagname, properties, ownPropertyNames) {\n let list = this.cache[tagname];\n if (!list) {\n return;\n }\n // reverse list for most-recent lookups\n for (let idx = list.length - 1; idx >= 0; idx--) {\n let entry = list[idx];\n if (this._validate(entry, properties, ownPropertyNames)) {\n return entry;\n }\n }\n }\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {nativeShadow} from './style-settings.js';\nimport StyleTransformer from './style-transformer.js';\nimport {getIsExtends} from './style-util.js';\n\nexport let flush = function() {};\n\n/**\n * @param {HTMLElement} element\n * @return {!Array<string>}\n */\nfunction getClasses(element) {\n let classes = [];\n if (element.classList) {\n classes = Array.from(element.classList);\n } else if (element instanceof window['SVGElement'] && element.hasAttribute('class')) {\n classes = element.getAttribute('class').split(/\\s+/);\n }\n return classes;\n}\n\n/**\n * @param {HTMLElement} element\n * @return {string}\n */\nfunction getCurrentScope(element) {\n let classes = getClasses(element);\n let idx = classes.indexOf(StyleTransformer.SCOPE_NAME);\n if (idx > -1) {\n return classes[idx + 1];\n }\n return '';\n}\n\n/**\n * @param {Array<MutationRecord|null>|null} mxns\n */\nfunction handler(mxns) {\n for (let x=0; x < mxns.length; x++) {\n let mxn = mxns[x];\n if (mxn.target === document.documentElement ||\n mxn.target === document.head) {\n continue;\n }\n for (let i=0; i < mxn.addedNodes.length; i++) {\n let n = mxn.addedNodes[i];\n if (n.nodeType !== Node.ELEMENT_NODE) {\n continue;\n }\n n = /** @type {HTMLElement} */(n); // eslint-disable-line no-self-assign\n let root = n.getRootNode();\n let currentScope = getCurrentScope(n);\n // node was scoped, but now is in document\n if (currentScope && root === n.ownerDocument) {\n StyleTransformer.dom(n, currentScope, true);\n } else if (root.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n let newScope;\n let host = /** @type {ShadowRoot} */(root).host;\n // element may no longer be in a shadowroot\n if (!host) {\n continue;\n }\n newScope = getIsExtends(host).is;\n if (currentScope === newScope) {\n // make sure all the subtree elements are scoped correctly\n let unscoped = window['ShadyDOM']['nativeMethods']['querySelectorAll'].call(\n n, `:not(.${StyleTransformer.SCOPE_NAME})`);\n for (let j = 0; j < unscoped.length; j++) {\n StyleTransformer.element(unscoped[j], currentScope);\n }\n continue;\n }\n if (currentScope) {\n StyleTransformer.dom(n, currentScope, true);\n }\n StyleTransformer.dom(n, newScope);\n }\n }\n }\n}\n\nif (!nativeShadow) {\n let observer = new MutationObserver(handler);\n let start = (node) => {\n observer.observe(node, {childList: true, subtree: true});\n }\n let nativeCustomElements = (window['customElements'] &&\n !window['customElements']['polyfillWrapFlushCallback']);\n // need to start immediately with native custom elements\n // TODO(dfreedm): with polyfilled HTMLImports and native custom elements\n // excessive mutations may be observed; this can be optimized via cooperation\n // with the HTMLImports polyfill.\n if (nativeCustomElements) {\n start(document);\n } else {\n let delayedStart = () => {\n start(document.body);\n }\n // use polyfill timing if it's available\n if (window['HTMLImports']) {\n window['HTMLImports']['whenReady'](delayedStart);\n // otherwise push beyond native imports being ready\n // which requires RAF + readystate interactive.\n } else {\n requestAnimationFrame(function() {\n if (document.readyState === 'loading') {\n let listener = function() {\n delayedStart();\n document.removeEventListener('readystatechange', listener);\n }\n document.addEventListener('readystatechange', listener);\n } else {\n delayedStart();\n }\n });\n }\n }\n\n flush = function() {\n handler(observer.takeRecords());\n }\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/**\n * @const {!Object<string, !HTMLTemplateElement>}\n */\nconst templateMap = {};\nexport default templateMap;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\nimport templateMap from './template-map.js';\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\n\n/*\n * Utilities for handling invalidating apply-shim mixins for a given template.\n *\n * The invalidation strategy involves keeping track of the \"current\" version of a template's mixins, and updating that count when a mixin is invalidated.\n * The template\n */\n\n/** @const {string} */\nconst CURRENT_VERSION = '_applyShimCurrentVersion';\n\n/** @const {string} */\nconst NEXT_VERSION = '_applyShimNextVersion';\n\n/** @const {string} */\nconst VALIDATING_VERSION = '_applyShimValidatingVersion';\n\n/**\n * @const {Promise<void>}\n */\nconst promise = Promise.resolve();\n\n/**\n * @param {string} elementName\n */\nexport function invalidate(elementName){\n let template = templateMap[elementName];\n if (template) {\n invalidateTemplate(template);\n }\n}\n\n/**\n * This function can be called multiple times to mark a template invalid\n * and signal that the style inside must be regenerated.\n *\n * Use `startValidatingTemplate` to begin an asynchronous validation cycle.\n * During that cycle, call `templateIsValidating` to see if the template must\n * be revalidated\n * @param {HTMLTemplateElement} template\n */\nexport function invalidateTemplate(template) {\n // default the current version to 0\n template[CURRENT_VERSION] = template[CURRENT_VERSION] || 0;\n // ensure the \"validating for\" flag exists\n template[VALIDATING_VERSION] = template[VALIDATING_VERSION] || 0;\n // increment the next version\n template[NEXT_VERSION] = (template[NEXT_VERSION] || 0) + 1;\n}\n\n/**\n * @param {string} elementName\n * @return {boolean}\n */\nexport function isValid(elementName) {\n let template = templateMap[elementName];\n if (template) {\n return templateIsValid(template);\n }\n return true;\n}\n\n/**\n * @param {HTMLTemplateElement} template\n * @return {boolean}\n */\nexport function templateIsValid(template) {\n return template[CURRENT_VERSION] === template[NEXT_VERSION];\n}\n\n/**\n * @param {string} elementName\n * @return {boolean}\n */\nexport function isValidating(elementName) {\n let template = templateMap[elementName];\n if (template) {\n return templateIsValidating(template);\n }\n return false;\n}\n\n/**\n * Returns true if the template is currently invalid and `startValidating` has been called since the last invalidation.\n * If false, the template must be validated.\n * @param {HTMLTemplateElement} template\n * @return {boolean}\n */\nexport function templateIsValidating(template) {\n return !templateIsValid(template) && template[VALIDATING_VERSION] === template[NEXT_VERSION];\n}\n\n/**\n * the template is marked as `validating` for one microtask so that all instances\n * found in the tree crawl of `applyStyle` will update themselves,\n * but the template will only be updated once.\n * @param {string} elementName\n*/\nexport function startValidating(elementName) {\n let template = templateMap[elementName];\n startValidatingTemplate(template);\n}\n\n/**\n * Begin an asynchronous invalidation cycle.\n * This should be called after every validation of a template\n *\n * After one microtask, the template will be marked as valid until the next call to `invalidateTemplate`\n * @param {HTMLTemplateElement} template\n */\nexport function startValidatingTemplate(template) {\n // remember that the current \"next version\" is the reason for this validation cycle\n template[VALIDATING_VERSION] = template[NEXT_VERSION];\n // however, there only needs to be one async task to clear the counters\n if (!template._validating) {\n template._validating = true;\n promise.then(function() {\n // sync the current version to let future invalidations cause a refresh cycle\n template[CURRENT_VERSION] = template[NEXT_VERSION];\n template._validating = false;\n });\n }\n}\n\n/**\n * @return {boolean}\n */\nexport function elementsAreInvalid() {\n for (let elementName in templateMap) {\n let template = templateMap[elementName];\n if (!templateIsValid(template)) {\n return true;\n }\n }\n return false;\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/** @type {Promise<void>} */\nlet readyPromise = null;\n\n/** @type {?function(?function())} */\nlet whenReady = window['HTMLImports'] && window['HTMLImports']['whenReady'] || null;\n\n/** @type {function()} */\nlet resolveFn;\n\n/**\n * @param {?function()} callback\n */\nexport default function documentWait(callback) {\n requestAnimationFrame(function() {\n if (whenReady) {\n whenReady(callback)\n } else {\n if (!readyPromise) {\n readyPromise = new Promise((resolve) => {resolveFn = resolve});\n if (document.readyState === 'complete') {\n resolveFn();\n } else {\n document.addEventListener('readystatechange', () => {\n if (document.readyState === 'complete') {\n resolveFn();\n }\n });\n }\n }\n readyPromise.then(function(){ callback && callback(); });\n }\n });\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {parse, StyleNode} from './css-parse.js';\nimport {nativeShadow, nativeCssVariables} from './style-settings.js';\nimport StyleTransformer from './style-transformer.js';\nimport * as StyleUtil from './style-util.js';\nimport StyleProperties from './style-properties.js';\nimport placeholderMap from './style-placeholder.js';\nimport StyleInfo from './style-info.js';\nimport StyleCache from './style-cache.js';\nimport {flush as watcherFlush} from './document-watcher.js';\nimport templateMap from './template-map.js';\nimport * as ApplyShimUtils from './apply-shim-utils.js';\nimport documentWait from './document-wait.js';\nimport {updateNativeProperties, detectMixin} from './common-utils.js';\nimport {CustomStyleInterfaceInterface} from './custom-style-interface.js'; // eslint-disable-line no-unused-vars\n\n/**\n * @const {StyleCache}\n */\nconst styleCache = new StyleCache();\n\nexport default class ScopingShim {\n constructor() {\n this._scopeCounter = {};\n this._documentOwner = document.documentElement;\n let ast = new StyleNode();\n ast['rules'] = [];\n this._documentOwnerStyleInfo = StyleInfo.set(this._documentOwner, new StyleInfo(ast));\n this._elementsHaveApplied = false;\n this._applyShim = null;\n /** @type {?CustomStyleInterfaceInterface} */\n this._customStyleInterface = null;\n documentWait(() => {\n this._ensure();\n });\n }\n flush() {\n watcherFlush();\n }\n _generateScopeSelector(name) {\n let id = this._scopeCounter[name] = (this._scopeCounter[name] || 0) + 1;\n return `${name}-${id}`;\n }\n getStyleAst(style) {\n return StyleUtil.rulesForStyle(style);\n }\n styleAstToString(ast) {\n return StyleUtil.toCssText(ast);\n }\n _gatherStyles(template) {\n return StyleUtil.gatherStyleText(template.content);\n }\n _getCssBuild(template) {\n let style = template.content.querySelector('style');\n if (!style) {\n return '';\n }\n return style.getAttribute('css-build') || '';\n }\n /**\n * Prepare the styling and template for the given element type\n *\n * @param {HTMLTemplateElement} template\n * @param {string} elementName\n * @param {string=} typeExtension\n */\n prepareTemplate(template, elementName, typeExtension) {\n if (template._prepared) {\n return;\n }\n template._prepared = true;\n template.name = elementName;\n template.extends = typeExtension;\n templateMap[elementName] = template;\n let cssBuild = this._getCssBuild(template);\n let cssText = this._gatherStyles(template);\n let info = {\n is: elementName,\n extends: typeExtension,\n __cssBuild: cssBuild,\n };\n if (!nativeShadow) {\n StyleTransformer.dom(template.content, elementName);\n }\n // check if the styling has mixin definitions or uses\n this._ensure();\n let hasMixins = detectMixin(cssText)\n let ast = parse(cssText);\n // only run the applyshim transforms if there is a mixin involved\n if (hasMixins && nativeCssVariables && this._applyShim) {\n this._applyShim['transformRules'](ast, elementName);\n }\n template['_styleAst'] = ast;\n template._cssBuild = cssBuild;\n\n let ownPropertyNames = [];\n if (!nativeCssVariables) {\n ownPropertyNames = StyleProperties.decorateStyles(template['_styleAst']);\n }\n if (!ownPropertyNames.length || nativeCssVariables) {\n let root = nativeShadow ? template.content : null;\n let placeholder = placeholderMap[elementName];\n let style = this._generateStaticStyle(info, template['_styleAst'], root, placeholder);\n template._style = style;\n }\n template._ownPropertyNames = ownPropertyNames;\n }\n _generateStaticStyle(info, rules, shadowroot, placeholder) {\n let cssText = StyleTransformer.elementStyles(info, rules);\n if (cssText.length) {\n return StyleUtil.applyCss(cssText, info.is, shadowroot, placeholder);\n }\n }\n _prepareHost(host) {\n let {is, typeExtension} = StyleUtil.getIsExtends(host);\n let placeholder = placeholderMap[is];\n let template = templateMap[is];\n let ast;\n let ownStylePropertyNames;\n let cssBuild;\n if (template) {\n ast = template['_styleAst'];\n ownStylePropertyNames = template._ownPropertyNames;\n cssBuild = template._cssBuild;\n }\n return StyleInfo.set(host,\n new StyleInfo(\n ast,\n placeholder,\n ownStylePropertyNames,\n is,\n typeExtension,\n cssBuild\n )\n );\n }\n _ensureApplyShim() {\n if (this._applyShim) {\n return;\n } else if (window.ShadyCSS && window.ShadyCSS.ApplyShim) {\n this._applyShim = window.ShadyCSS.ApplyShim;\n this._applyShim['invalidCallback'] = ApplyShimUtils.invalidate;\n }\n }\n _ensureCustomStyleInterface() {\n if (this._customStyleInterface) {\n return;\n } else if (window.ShadyCSS && window.ShadyCSS.CustomStyleInterface) {\n this._customStyleInterface = /** @type {!CustomStyleInterfaceInterface} */(window.ShadyCSS.CustomStyleInterface);\n /** @type {function(!HTMLStyleElement)} */\n this._customStyleInterface['transformCallback'] = (style) => {this.transformCustomStyleForDocument(style)};\n this._customStyleInterface['validateCallback'] = () => {\n requestAnimationFrame(() => {\n if (this._customStyleInterface['enqueued'] || this._elementsHaveApplied) {\n this.flushCustomStyles();\n }\n })\n };\n }\n }\n _ensure() {\n this._ensureApplyShim();\n this._ensureCustomStyleInterface();\n }\n /**\n * Flush and apply custom styles to document\n */\n flushCustomStyles() {\n this._ensure();\n if (!this._customStyleInterface) {\n return;\n }\n let customStyles = this._customStyleInterface['processStyles']();\n // early return if custom-styles don't need validation\n if (!this._customStyleInterface['enqueued']) {\n return;\n }\n if (!nativeCssVariables) {\n this._updateProperties(this._documentOwner, this._documentOwnerStyleInfo);\n this._applyCustomStyles(customStyles);\n } else {\n this._revalidateCustomStyleApplyShim(customStyles);\n }\n this._customStyleInterface['enqueued'] = false;\n // if custom elements have upgraded and there are no native css variables, we must recalculate the whole tree\n if (this._elementsHaveApplied && !nativeCssVariables) {\n this.styleDocument();\n }\n }\n /**\n * Apply styles for the given element\n *\n * @param {!HTMLElement} host\n * @param {Object=} overrideProps\n */\n styleElement(host, overrideProps) {\n let {is} = StyleUtil.getIsExtends(host);\n let styleInfo = StyleInfo.get(host);\n if (!styleInfo) {\n styleInfo = this._prepareHost(host);\n }\n // Only trip the `elementsHaveApplied` flag if a node other that the root document has `applyStyle` called\n if (!this._isRootOwner(host)) {\n this._elementsHaveApplied = true;\n }\n if (overrideProps) {\n styleInfo.overrideStyleProperties =\n styleInfo.overrideStyleProperties || {};\n Object.assign(styleInfo.overrideStyleProperties, overrideProps);\n }\n if (!nativeCssVariables) {\n this._updateProperties(host, styleInfo);\n if (styleInfo.ownStylePropertyNames && styleInfo.ownStylePropertyNames.length) {\n this._applyStyleProperties(host, styleInfo);\n }\n } else {\n if (styleInfo.overrideStyleProperties) {\n updateNativeProperties(host, styleInfo.overrideStyleProperties);\n }\n let template = templateMap[is];\n // bail early if there is no shadowroot for this element\n if (!template && !this._isRootOwner(host)) {\n return;\n }\n if (template && template._style && !ApplyShimUtils.templateIsValid(template)) {\n // update template\n if (!ApplyShimUtils.templateIsValidating(template)) {\n this._ensure();\n this._applyShim && this._applyShim['transformRules'](template['_styleAst'], is);\n template._style.textContent = StyleTransformer.elementStyles(host, styleInfo.styleRules);\n ApplyShimUtils.startValidatingTemplate(template);\n }\n // update instance if native shadowdom\n if (nativeShadow) {\n let root = host.shadowRoot;\n if (root) {\n let style = root.querySelector('style');\n style.textContent = StyleTransformer.elementStyles(host, styleInfo.styleRules);\n }\n }\n styleInfo.styleRules = template['_styleAst'];\n }\n }\n }\n _styleOwnerForNode(node) {\n let root = node.getRootNode();\n let host = root.host;\n if (host) {\n if (StyleInfo.get(host)) {\n return host;\n } else {\n return this._styleOwnerForNode(host);\n }\n }\n return this._documentOwner;\n }\n _isRootOwner(node) {\n return (node === this._documentOwner);\n }\n _applyStyleProperties(host, styleInfo) {\n let is = StyleUtil.getIsExtends(host).is;\n let cacheEntry = styleCache.fetch(is, styleInfo.styleProperties, styleInfo.ownStylePropertyNames);\n let cachedScopeSelector = cacheEntry && cacheEntry.scopeSelector;\n let cachedStyle = cacheEntry ? cacheEntry.styleElement : null;\n let oldScopeSelector = styleInfo.scopeSelector;\n // only generate new scope if cached style is not found\n styleInfo.scopeSelector = cachedScopeSelector || this._generateScopeSelector(is);\n let style = StyleProperties.applyElementStyle(host, styleInfo.styleProperties, styleInfo.scopeSelector, cachedStyle);\n if (!nativeShadow) {\n StyleProperties.applyElementScopeSelector(host, styleInfo.scopeSelector, oldScopeSelector);\n }\n if (!cacheEntry) {\n styleCache.store(is, styleInfo.styleProperties, style, styleInfo.scopeSelector);\n }\n return style;\n }\n _updateProperties(host, styleInfo) {\n let owner = this._styleOwnerForNode(host);\n let ownerStyleInfo = StyleInfo.get(owner);\n let ownerProperties = ownerStyleInfo.styleProperties;\n let props = Object.create(ownerProperties || null);\n let hostAndRootProps = StyleProperties.hostAndRootPropertiesForScope(host, styleInfo.styleRules);\n let propertyData = StyleProperties.propertyDataFromStyles(ownerStyleInfo.styleRules, host);\n let propertiesMatchingHost = propertyData.properties\n Object.assign(\n props,\n hostAndRootProps.hostProps,\n propertiesMatchingHost,\n hostAndRootProps.rootProps\n );\n this._mixinOverrideStyles(props, styleInfo.overrideStyleProperties);\n StyleProperties.reify(props);\n styleInfo.styleProperties = props;\n }\n _mixinOverrideStyles(props, overrides) {\n for (let p in overrides) {\n let v = overrides[p];\n // skip override props if they are not truthy or 0\n // in order to fall back to inherited values\n if (v || v === 0) {\n props[p] = v;\n }\n }\n }\n /**\n * Update styles of the whole document\n *\n * @param {Object=} properties\n */\n styleDocument(properties) {\n this.styleSubtree(this._documentOwner, properties);\n }\n /**\n * Update styles of a subtree\n *\n * @param {!HTMLElement} host\n * @param {Object=} properties\n */\n styleSubtree(host, properties) {\n let root = host.shadowRoot;\n if (root || this._isRootOwner(host)) {\n this.styleElement(host, properties);\n }\n // process the shadowdom children of `host`\n let shadowChildren = root && (root.children || root.childNodes);\n if (shadowChildren) {\n for (let i = 0; i < shadowChildren.length; i++) {\n let c = /** @type {!HTMLElement} */(shadowChildren[i]);\n this.styleSubtree(c);\n }\n } else {\n // process the lightdom children of `host`\n let children = host.children || host.childNodes;\n if (children) {\n for (let i = 0; i < children.length; i++) {\n let c = /** @type {!HTMLElement} */(children[i]);\n this.styleSubtree(c);\n }\n }\n }\n }\n /* Custom Style operations */\n _revalidateCustomStyleApplyShim(customStyles) {\n for (let i = 0; i < customStyles.length; i++) {\n let c = customStyles[i];\n let s = this._customStyleInterface['getStyleForCustomStyle'](c);\n if (s) {\n this._revalidateApplyShim(s);\n }\n }\n }\n _applyCustomStyles(customStyles) {\n for (let i = 0; i < customStyles.length; i++) {\n let c = customStyles[i];\n let s = this._customStyleInterface['getStyleForCustomStyle'](c);\n if (s) {\n StyleProperties.applyCustomStyle(s, this._documentOwnerStyleInfo.styleProperties);\n }\n }\n }\n transformCustomStyleForDocument(style) {\n let ast = StyleUtil.rulesForStyle(style);\n StyleUtil.forEachRule(ast, (rule) => {\n if (nativeShadow) {\n StyleTransformer.normalizeRootSelector(rule);\n } else {\n StyleTransformer.documentRule(rule);\n }\n if (nativeCssVariables) {\n this._ensure();\n this._applyShim && this._applyShim['transformRule'](rule);\n }\n });\n if (nativeCssVariables) {\n style.textContent = StyleUtil.toCssText(ast);\n } else {\n this._documentOwnerStyleInfo.styleRules['rules'].push(ast);\n }\n }\n _revalidateApplyShim(style) {\n if (nativeCssVariables && this._applyShim) {\n let ast = StyleUtil.rulesForStyle(style);\n this._ensure();\n this._applyShim['transformRules'](ast);\n style.textContent = StyleUtil.toCssText(ast);\n }\n }\n getComputedStyleValue(element, property) {\n let value;\n if (!nativeCssVariables) {\n // element is either a style host, or an ancestor of a style host\n let styleInfo = StyleInfo.get(element) || StyleInfo.get(this._styleOwnerForNode(element));\n value = styleInfo.styleProperties[property];\n }\n // fall back to the property value from the computed styling\n value = value || window.getComputedStyle(element).getPropertyValue(property);\n // trim whitespace that can come after the `:` in css\n // example: padding: 2px -> \" 2px\"\n return value ? value.trim() : '';\n }\n // given an element and a classString, replaces\n // the element's class with the provided classString and adds\n // any necessary ShadyCSS static and property based scoping selectors\n setElementClass(element, classString) {\n let root = element.getRootNode();\n let classes = classString ? classString.split(/\\s/) : [];\n let scopeName = root.host && root.host.localName;\n // If no scope, try to discover scope name from existing class.\n // This can occur if, for example, a template stamped element that\n // has been scoped is manipulated when not in a root.\n if (!scopeName) {\n var classAttr = element.getAttribute('class');\n if (classAttr) {\n let k$ = classAttr.split(/\\s/);\n for (let i=0; i < k$.length; i++) {\n if (k$[i] === StyleTransformer.SCOPE_NAME) {\n scopeName = k$[i+1];\n break;\n }\n }\n }\n }\n if (scopeName) {\n classes.push(StyleTransformer.SCOPE_NAME, scopeName);\n }\n if (!nativeCssVariables) {\n let styleInfo = StyleInfo.get(element);\n if (styleInfo && styleInfo.scopeSelector) {\n classes.push(StyleProperties.XSCOPE_NAME, styleInfo.scopeSelector);\n }\n }\n StyleUtil.setElementClassRaw(element, classes.join(' '));\n }\n _styleInfoForNode(node) {\n return StyleInfo.get(node);\n }\n}\n\n/* exports */\nScopingShim.prototype['flush'] = ScopingShim.prototype.flush;\nScopingShim.prototype['prepareTemplate'] = ScopingShim.prototype.prepareTemplate;\nScopingShim.prototype['styleElement'] = ScopingShim.prototype.styleElement;\nScopingShim.prototype['styleDocument'] = ScopingShim.prototype.styleDocument;\nScopingShim.prototype['styleSubtree'] = ScopingShim.prototype.styleSubtree;\nScopingShim.prototype['getComputedStyleValue'] = ScopingShim.prototype.getComputedStyleValue;\nScopingShim.prototype['setElementClass'] = ScopingShim.prototype.setElementClass;\nScopingShim.prototype['_styleInfoForNode'] = ScopingShim.prototype._styleInfoForNode;\nScopingShim.prototype['transformCustomStyleForDocument'] = ScopingShim.prototype.transformCustomStyleForDocument;\nScopingShim.prototype['getStyleAst'] = ScopingShim.prototype.getStyleAst;\nScopingShim.prototype['styleAstToString'] = ScopingShim.prototype.styleAstToString;\nScopingShim.prototype['flushCustomStyles'] = ScopingShim.prototype.flushCustomStyles;\nObject.defineProperties(ScopingShim.prototype, {\n 'nativeShadow': {\n get() {\n return nativeShadow;\n }\n },\n 'nativeCss': {\n get() {\n return nativeCssVariables;\n }\n }\n});\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport { MIXIN_MATCH, VAR_ASSIGN } from './common-regex.js';\n\n/**\n * @param {Element} element\n * @param {Object=} properties\n */\nexport function updateNativeProperties(element, properties) {\n // remove previous properties\n for (let p in properties) {\n // NOTE: for bc with shim, don't apply null values.\n if (p === null) {\n element.style.removeProperty(p);\n } else {\n element.style.setProperty(p, properties[p]);\n }\n }\n}\n\n/**\n * @param {Element} element\n * @param {string} property\n * @return {string}\n */\nexport function getComputedStyleValue(element, property) {\n /**\n * @const {string}\n */\n const value = window.getComputedStyle(element).getPropertyValue(property);\n if (!value) {\n return '';\n } else {\n return value.trim();\n }\n}\n\n/**\n * return true if `cssText` contains a mixin definition or consumption\n * @param {string} cssText\n * @return {boolean}\n */\nexport function detectMixin(cssText) {\n const has = MIXIN_MATCH.test(cssText) || VAR_ASSIGN.test(cssText);\n // reset state of the regexes\n MIXIN_MATCH.lastIndex = 0;\n VAR_ASSIGN.lastIndex = 0;\n return has;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport ScopingShim from '../src/scoping-shim.js';\nimport {nativeCssVariables, nativeShadow} from '../src/style-settings.js';\n\n/** @const {ScopingShim} */\nconst scopingShim = new ScopingShim();\n\nlet ApplyShim, CustomStyleInterface;\n\nif (window['ShadyCSS']) {\n ApplyShim = window['ShadyCSS']['ApplyShim'];\n CustomStyleInterface = window['ShadyCSS']['CustomStyleInterface'];\n}\n\nwindow.ShadyCSS = {\n ScopingShim: scopingShim,\n /**\n * @param {!HTMLTemplateElement} template\n * @param {string} elementName\n * @param {string=} elementExtends\n */\n prepareTemplate(template, elementName, elementExtends) {\n scopingShim.flushCustomStyles();\n scopingShim.prepareTemplate(template, elementName, elementExtends)\n },\n\n /**\n * @param {!HTMLElement} element\n * @param {Object=} properties\n */\n styleSubtree(element, properties) {\n scopingShim.flushCustomStyles();\n scopingShim.styleSubtree(element, properties);\n },\n\n /**\n * @param {!HTMLElement} element\n */\n styleElement(element) {\n scopingShim.flushCustomStyles();\n scopingShim.styleElement(element);\n },\n\n /**\n * @param {Object=} properties\n */\n styleDocument(properties) {\n scopingShim.flushCustomStyles();\n scopingShim.styleDocument(properties);\n },\n\n /**\n * @param {Element} element\n * @param {string} property\n * @return {string}\n */\n getComputedStyleValue(element, property) {\n return scopingShim.getComputedStyleValue(element, property);\n },\n\n nativeCss: nativeCssVariables,\n\n nativeShadow: nativeShadow\n};\n\nif (ApplyShim) {\n window.ShadyCSS.ApplyShim = ApplyShim;\n}\n\nif (CustomStyleInterface) {\n window.ShadyCSS.CustomStyleInterface = CustomStyleInterface;\n}","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n'use strict';\n\nlet customElements = window['customElements'];\nlet HTMLImports = window['HTMLImports'];\nlet Template = window['HTMLTemplateElement'];\n\n// global for (1) existence means `WebComponentsReady` will file,\n// (2) WebComponents.ready == true means event has fired.\nwindow.WebComponents = window.WebComponents || {};\n\nif (customElements && customElements['polyfillWrapFlushCallback']) {\n // Here we ensure that the public `HTMLImports.whenReady`\n // always comes *after* custom elements have upgraded.\n let flushCallback;\n let runAndClearCallback = function runAndClearCallback() {\n if (flushCallback) {\n // make sure to run the HTMLTemplateElement polyfill before custom elements upgrade\n if (Template.bootstrap) {\n Template.bootstrap(window.document);\n }\n let cb = flushCallback;\n flushCallback = null;\n cb();\n return true;\n }\n }\n let origWhenReady = HTMLImports['whenReady'];\n customElements['polyfillWrapFlushCallback'](function(cb) {\n flushCallback = cb;\n origWhenReady(runAndClearCallback);\n });\n\n HTMLImports['whenReady'] = function(cb) {\n origWhenReady(function() {\n // custom element code may add dynamic imports\n // to match processing of native custom elements before\n // domContentLoaded, we wait for these imports to resolve first.\n if (runAndClearCallback()) {\n HTMLImports['whenReady'](cb);\n } else {\n cb();\n }\n });\n }\n\n}\n\nHTMLImports['whenReady'](function() {\n requestAnimationFrame(function() {\n window.WebComponents.ready = true;\n document.dispatchEvent(new CustomEvent('WebComponentsReady', {bubbles: true}));\n });\n});","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n'use strict';\n// It's desireable to provide a default stylesheet\n// that's convenient for styling unresolved elements, but\n// it's cumbersome to have to include this manually in every page.\n// It would make sense to put inside some HTMLImport but\n// the HTMLImports polyfill does not allow loading of stylesheets\n// that block rendering. Therefore this injection is tolerated here.\n//\n// NOTE: position: relative fixes IE's failure to inherit opacity\n// when a child is not statically positioned.\nlet style = document.createElement('style');\nstyle.textContent = ''\n + 'body {'\n + 'transition: opacity ease-in 0.2s;'\n + ' } \\n'\n + 'body[unresolved] {'\n + 'opacity: 0; display: block; overflow: hidden; position: relative;'\n + ' } \\n'\n ;\nlet head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);"]} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-sd.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-sd.js
new file mode 100644
index 00000000000..4c3862150e1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-sd.js
@@ -0,0 +1,181 @@
+/**
+@license @nocompile
+Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+(function(){/*
+
+ Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ Code distributed by Google as part of the polymer project is also
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+'use strict';var n,q="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this,ba="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)};function ca(){ca=function(){};q.Symbol||(q.Symbol=da)}var da=function(){var a=0;return function(b){return"jscomp_symbol_"+(b||"")+a++}}();
+function ea(){ca();var a=q.Symbol.iterator;a||(a=q.Symbol.iterator=q.Symbol("iterator"));"function"!=typeof Array.prototype[a]&&ba(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return fa(this)}});ea=function(){}}function fa(a){var b=0;return ha(function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}})}function ha(a){ea();a={next:a};a[q.Symbol.iterator]=function(){return this};return a}function ia(a){ea();var b=a[Symbol.iterator];return b?b.call(a):fa(a)}
+function ja(a){for(var b,c=[];!(b=a.next()).done;)c.push(b.value);return c}
+(function(a){function b(a,b){if("function"===typeof window.CustomEvent)return new CustomEvent(a,b);var c=document.createEvent("CustomEvent");c.initCustomEvent(a,!!b.bubbles,!!b.cancelable,b.detail);return c}function c(a){if(B)return a.ownerDocument!==document?a.ownerDocument:null;var b=a.__importDoc;if(!b&&a.parentNode){b=a.parentNode;if("function"===typeof b.closest)b=b.closest("link[rel=import]");else for(;!g(b)&&(b=b.parentNode););a.__importDoc=b}return b}function d(a){var b=m(document,"link[rel=import]:not([import-dependency])"),
+c=b.length;c?p(b,function(b){return h(b,function(){0===--c&&a()})}):a()}function e(a){function b(){"loading"!==document.readyState&&document.body&&(document.removeEventListener("readystatechange",b),a())}document.addEventListener("readystatechange",b);b()}function f(a){e(function(){return d(function(){return a&&a()})})}function h(a,b){if(a.__loaded)b&&b();else if("script"===a.localName&&!a.src||"style"===a.localName&&!a.firstChild)a.__loaded=!0,b&&b();else{var c=function(d){a.removeEventListener(d.type,
+c);a.__loaded=!0;b&&b()};a.addEventListener("load",c);Ca&&"style"===a.localName||a.addEventListener("error",c)}}function g(a){return a.nodeType===Node.ELEMENT_NODE&&"link"===a.localName&&"import"===a.rel}function k(){var a=this;this.a={};this.b=0;this.c=new MutationObserver(function(b){return a.Aa(b)});this.c.observe(document.head,{childList:!0,subtree:!0});this.loadImports(document)}function l(a){p(m(a,"template"),function(a){p(m(a.content,'script:not([type]),script[type="application/javascript"],script[type="text/javascript"]'),
+function(a){var b=document.createElement("script");p(a.attributes,function(a){return b.setAttribute(a.name,a.value)});b.textContent=a.textContent;a.parentNode.replaceChild(b,a)});l(a.content)})}function m(a,b){return a.childNodes.length?a.querySelectorAll(b):T}function p(a,b,c){var d=a?a.length:0,e=c?-1:1;for(c=c?d-1:0;c<d&&0<=c;c+=e)b(a[c],c)}var x=document.createElement("link"),B="import"in x,T=x.querySelectorAll("*"),Da=null;!1==="currentScript"in document&&Object.defineProperty(document,"currentScript",
+{get:function(){return Da||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null)},configurable:!0});var vd=/(url\()([^)]*)(\))/g,wd=/(@import[\s]+(?!url\())([^;]*)(;)/g,xd=/(<link[^>]*)(rel=['|"]?stylesheet['|"]?[^>]*>)/g,F={ua:function(a,b){a.href&&a.setAttribute("href",F.P(a.getAttribute("href"),b));a.src&&a.setAttribute("src",F.P(a.getAttribute("src"),b));if("style"===a.localName){var c=F.fa(a.textContent,b,vd);a.textContent=F.fa(c,b,wd)}},fa:function(a,b,c){return a.replace(c,
+function(a,c,d,e){a=d.replace(/["']/g,"");b&&(a=F.P(a,b));return c+"'"+a+"'"+e})},P:function(a,b){if(void 0===F.V){F.V=!1;try{var c=new URL("b","http://a");c.pathname="c%20d";F.V="http://a/c%20d"===c.href}catch(Ye){}}if(F.V)return(new URL(a,b)).href;c=F.la;c||(c=document.implementation.createHTMLDocument("temp"),F.la=c,c.Z=c.createElement("base"),c.head.appendChild(c.Z),c.Y=c.createElement("a"));c.Z.href=b;c.Y.href=a;return c.Y.href||a}},zb={async:!0,load:function(a,b,c){if(a)if(a.match(/^data:/)){a=
+a.split(",");var d=a[1];d=-1<a[0].indexOf(";base64")?atob(d):decodeURIComponent(d);b(d)}else{var e=new XMLHttpRequest;e.open("GET",a,zb.async);e.onload=function(){var a=e.responseURL||e.getResponseHeader("Location");a&&0===a.indexOf("/")&&(a=(location.origin||location.protocol+"//"+location.host)+a);var d=e.response||e.responseText;304===e.status||0===e.status||200<=e.status&&300>e.status?b(d,a):c(d)};e.send()}else c("error: href must be specified")}},Ca=/Trident/.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent);
+k.prototype.loadImports=function(a){var b=this;a=m(a,"link[rel=import]");p(a,function(a){return b.B(a)})};k.prototype.B=function(a){var b=this,c=a.href;if(void 0!==this.a[c]){var d=this.a[c];d&&d.__loaded&&(a.__import=d,this.i(a))}else this.b++,this.a[c]="pending",zb.load(c,function(a,d){a=b.Ba(a,d||c);b.a[c]=a;b.b--;b.loadImports(a);b.F()},function(){b.a[c]=null;b.b--;b.F()})};k.prototype.Ba=function(a,b){if(!a)return document.createDocumentFragment();Ca&&(a=a.replace(xd,function(a,b,c){return-1===
+a.indexOf("type=")?b+" type=import-disable "+c:a}));var c=document.createElement("template");c.innerHTML=a;if(c.content)a=c.content,l(a);else for(a=document.createDocumentFragment();c.firstChild;)a.appendChild(c.firstChild);if(c=a.querySelector("base"))b=F.P(c.getAttribute("href"),b),c.removeAttribute("href");c=m(a,'link[rel=import],link[rel=stylesheet][href][type=import-disable],style:not([type]),link[rel=stylesheet][href]:not([type]),script:not([type]),script[type="application/javascript"],script[type="text/javascript"]');
+var d=0;p(c,function(a){h(a);F.ua(a,b);a.setAttribute("import-dependency","");"script"===a.localName&&!a.src&&a.textContent&&(a.setAttribute("src","data:text/javascript;charset=utf-8,"+encodeURIComponent(a.textContent+("\n//# sourceURL="+b+(d?"-"+d:"")+".js\n"))),a.textContent="",d++)});return a};k.prototype.F=function(){var a=this;if(!this.b){this.c.disconnect();this.flatten(document);var b=!1,c=!1,d=function(){c&&b&&(a.loadImports(document),a.b||(a.c.observe(document.head,{childList:!0,subtree:!0}),
+a.ya()))};this.Da(function(){c=!0;d()});this.Ca(function(){b=!0;d()})}};k.prototype.flatten=function(a){var b=this;a=m(a,"link[rel=import]");p(a,function(a){var c=b.a[a.href];(a.__import=c)&&c.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&(b.a[a.href]=a,a.readyState="loading",a.__import=a,b.flatten(c),a.appendChild(c))})};k.prototype.Ca=function(a){function b(e){if(e<d){var f=c[e],g=document.createElement("script");f.removeAttribute("import-dependency");p(f.attributes,function(a){return g.setAttribute(a.name,
+a.value)});Da=g;f.parentNode.replaceChild(g,f);h(g,function(){Da=null;b(e+1)})}else a()}var c=m(document,"script[import-dependency]"),d=c.length;b(0)};k.prototype.Da=function(a){var b=m(document,"style[import-dependency],link[rel=stylesheet][import-dependency]"),d=b.length;if(d){var e=Ca&&!!document.querySelector("link[rel=stylesheet][href][type=import-disable]");p(b,function(b){h(b,function(){b.removeAttribute("import-dependency");0===--d&&a()});if(e&&b.parentNode!==document.head){var f=document.createElement(b.localName);
+f.__appliedElement=b;f.setAttribute("type","import-placeholder");b.parentNode.insertBefore(f,b.nextSibling);for(f=c(b);f&&c(f);)f=c(f);f.parentNode!==document.head&&(f=null);document.head.insertBefore(b,f);b.removeAttribute("type")}})}else a()};k.prototype.ya=function(){var a=this,b=m(document,"link[rel=import]");p(b,function(b){return a.i(b)},!0)};k.prototype.i=function(a){a.__loaded||(a.__loaded=!0,a.import&&(a.import.readyState="complete"),a.dispatchEvent(b(a.import?"load":"error",{bubbles:!1,
+cancelable:!1,detail:void 0})))};k.prototype.Aa=function(a){var b=this;p(a,function(a){return p(a.addedNodes,function(a){a&&a.nodeType===Node.ELEMENT_NODE&&(g(a)?b.B(a):b.loadImports(a))})})};var Ea=null;if(B)x=m(document,"link[rel=import]"),p(x,function(a){a.import&&"loading"===a.import.readyState||(a.__loaded=!0)}),x=function(a){a=a.target;g(a)&&(a.__loaded=!0)},document.addEventListener("load",x,!0),document.addEventListener("error",x,!0);else{var aa=Object.getOwnPropertyDescriptor(Node.prototype,
+"baseURI");Object.defineProperty((!aa||aa.configurable?Node:Element).prototype,"baseURI",{get:function(){var a=g(this)?this:c(this);return a?a.href:aa&&aa.get?aa.get.call(this):(document.querySelector("base")||window.location).href},configurable:!0,enumerable:!0});Object.defineProperty(HTMLLinkElement.prototype,"import",{get:function(){return this.__import||null},configurable:!0,enumerable:!0});e(function(){Ea=new k})}f(function(){return document.dispatchEvent(b("HTMLImportsLoaded",{cancelable:!0,
+bubbles:!0,detail:void 0}))});a.useNative=B;a.whenReady=f;a.importForElement=c;a.loadImports=function(a){Ea&&Ea.loadImports(a)}})(window.HTMLImports=window.HTMLImports||{});/*
+
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+function ka(){this.ea=this.root=null;this.N=!1;this.v=this.J=this.W=this.assignedSlot=this.assignedNodes=this.C=null;this.childNodes=this.nextSibling=this.previousSibling=this.lastChild=this.firstChild=this.parentNode=this.G=void 0;this.ja=this.$=!1}ka.prototype.toJSON=function(){return{}};function r(a){a.T||(a.T=new ka);return a.T}function t(a){return a&&a.T};var u=window.ShadyDOM||{};u.wa=!(!Element.prototype.attachShadow||!Node.prototype.getRootNode);var la=Object.getOwnPropertyDescriptor(Node.prototype,"firstChild");u.o=!!(la&&la.configurable&&la.get);u.ca=u.force||!u.wa;var ma=navigator.userAgent.match("Trident"),na=navigator.userAgent.match("Edge");void 0===u.ha&&(u.ha=u.o&&(ma||na));function v(a){return(a=t(a))&&void 0!==a.firstChild}function w(a){return"ShadyRoot"===a.na}function y(a){a=a.getRootNode();if(w(a))return a}
+var z=Element.prototype,oa=z.matches||z.matchesSelector||z.mozMatchesSelector||z.msMatchesSelector||z.oMatchesSelector||z.webkitMatchesSelector;function pa(a,b){if(a&&b)for(var c=Object.getOwnPropertyNames(b),d=0,e;d<c.length&&(e=c[d]);d++){var f=Object.getOwnPropertyDescriptor(b,e);f&&Object.defineProperty(a,e,f)}}function qa(a,b){for(var c=[],d=1;d<arguments.length;++d)c[d-1]=arguments[d];for(d=0;d<c.length;d++)pa(a,c[d]);return a}function ra(a,b){for(var c in b)a[c]=b[c]}
+var sa=document.createTextNode(""),ta=0,ua=[];(new MutationObserver(function(){for(;ua.length;)try{ua.shift()()}catch(a){throw sa.textContent=ta++,a;}})).observe(sa,{characterData:!0});function va(a){ua.push(a);sa.textContent=ta++}var wa=!!document.contains;function xa(a,b){for(;b;){if(b==a)return!0;b=b.parentNode}return!1};var ya=[],za;function Aa(a){za||(za=!0,va(Ba));ya.push(a)}function Ba(){za=!1;for(var a=!!ya.length;ya.length;)ya.shift()();return a}Ba.list=ya;function Fa(){this.a=!1;this.addedNodes=[];this.removedNodes=[];this.M=new Set}function Ga(a){a.a||(a.a=!0,va(function(){Ha(a)}))}function Ha(a){if(a.a){a.a=!1;var b=a.takeRecords();b.length&&a.M.forEach(function(a){a(b)})}}Fa.prototype.takeRecords=function(){if(this.addedNodes.length||this.removedNodes.length){var a=[{addedNodes:this.addedNodes,removedNodes:this.removedNodes}];this.addedNodes=[];this.removedNodes=[];return a}return[]};
+function Ia(a,b){var c=r(a);c.C||(c.C=new Fa);c.C.M.add(b);var d=c.C;return{ma:b,pa:d,oa:a,takeRecords:function(){return d.takeRecords()}}}function Ja(a){var b=a&&a.pa;b&&(b.M.delete(a.ma),b.M.size||(r(a.oa).C=null))}
+function Ka(a,b){var c=b.getRootNode();return a.map(function(a){var b=c===a.target.getRootNode();if(b&&a.addedNodes){if(b=Array.from(a.addedNodes).filter(function(a){return c===a.getRootNode()}),b.length)return a=Object.create(a),Object.defineProperty(a,"addedNodes",{value:b,configurable:!0}),a}else if(b)return a}).filter(function(a){return a})};var A={},La=Element.prototype.insertBefore,Ma=Element.prototype.replaceChild,Na=Element.prototype.removeChild,Oa=Element.prototype.setAttribute,Pa=Element.prototype.removeAttribute,Qa=Element.prototype.cloneNode,Ra=Document.prototype.importNode,Sa=Element.prototype.addEventListener,Ta=Element.prototype.removeEventListener,Ua=Window.prototype.addEventListener,Va=Window.prototype.removeEventListener,Wa=Element.prototype.dispatchEvent,Xa=Node.prototype.contains||HTMLElement.prototype.contains,Ya=Document.prototype.getElementById,
+Za=Element.prototype.querySelector,$a=DocumentFragment.prototype.querySelector,ab=Document.prototype.querySelector,bb=Element.prototype.querySelectorAll,cb=DocumentFragment.prototype.querySelectorAll,db=Document.prototype.querySelectorAll;A.appendChild=Element.prototype.appendChild;A.insertBefore=La;A.replaceChild=Ma;A.removeChild=Na;A.setAttribute=Oa;A.removeAttribute=Pa;A.cloneNode=Qa;A.importNode=Ra;A.addEventListener=Sa;A.removeEventListener=Ta;A.Ia=Ua;A.Ja=Va;A.dispatchEvent=Wa;A.contains=Xa;
+A.getElementById=Ya;A.Ra=Za;A.Ua=$a;A.Pa=ab;A.querySelector=function(a){switch(this.nodeType){case Node.ELEMENT_NODE:return Za.call(this,a);case Node.DOCUMENT_NODE:return ab.call(this,a);default:return $a.call(this,a)}};A.Sa=bb;A.Va=cb;A.Qa=db;A.querySelectorAll=function(a){switch(this.nodeType){case Node.ELEMENT_NODE:return bb.call(this,a);case Node.DOCUMENT_NODE:return db.call(this,a);default:return cb.call(this,a)}};var eb=/[&\u00A0"]/g,fb=/[&\u00A0<>]/g;function gb(a){switch(a){case "&":return"&amp;";case "<":return"&lt;";case ">":return"&gt;";case '"':return"&quot;";case "\u00a0":return"&nbsp;"}}function hb(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}var ib=hb("area base br col command embed hr img input keygen link meta param source track wbr".split(" ")),jb=hb("style script xmp iframe noembed noframes plaintext noscript".split(" "));
+function kb(a,b){"template"===a.localName&&(a=a.content);for(var c="",d=b?b(a):a.childNodes,e=0,f=d.length,h;e<f&&(h=d[e]);e++){a:{var g=h;var k=a;var l=b;switch(g.nodeType){case Node.ELEMENT_NODE:for(var m=g.localName,p="<"+m,x=g.attributes,B=0;k=x[B];B++)p+=" "+k.name+'="'+k.value.replace(eb,gb)+'"';p+=">";g=ib[m]?p:p+kb(g,l)+"</"+m+">";break a;case Node.TEXT_NODE:g=g.data;g=k&&jb[k.localName]?g:g.replace(fb,gb);break a;case Node.COMMENT_NODE:g="\x3c!--"+g.data+"--\x3e";break a;default:throw window.console.error(g),
+Error("not implemented");}}c+=g}return c};var C={},D=document.createTreeWalker(document,NodeFilter.SHOW_ALL,null,!1),E=document.createTreeWalker(document,NodeFilter.SHOW_ELEMENT,null,!1);function lb(a){var b=[];D.currentNode=a;for(a=D.firstChild();a;)b.push(a),a=D.nextSibling();return b}C.parentNode=function(a){D.currentNode=a;return D.parentNode()};C.firstChild=function(a){D.currentNode=a;return D.firstChild()};C.lastChild=function(a){D.currentNode=a;return D.lastChild()};C.previousSibling=function(a){D.currentNode=a;return D.previousSibling()};
+C.nextSibling=function(a){D.currentNode=a;return D.nextSibling()};C.childNodes=lb;C.parentElement=function(a){E.currentNode=a;return E.parentNode()};C.firstElementChild=function(a){E.currentNode=a;return E.firstChild()};C.lastElementChild=function(a){E.currentNode=a;return E.lastChild()};C.previousElementSibling=function(a){E.currentNode=a;return E.previousSibling()};C.nextElementSibling=function(a){E.currentNode=a;return E.nextSibling()};
+C.children=function(a){var b=[];E.currentNode=a;for(a=E.firstChild();a;)b.push(a),a=E.nextSibling();return b};C.innerHTML=function(a){return kb(a,function(a){return lb(a)})};C.textContent=function(a){switch(a.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:a=document.createTreeWalker(a,NodeFilter.SHOW_TEXT,null,!1);for(var b="",c;c=a.nextNode();)b+=c.nodeValue;return b;default:return a.nodeValue}};var G={},mb=u.o,nb=[Node.prototype,Element.prototype,HTMLElement.prototype];function H(a){var b;a:{for(b=0;b<nb.length;b++){var c=nb[b];if(c.hasOwnProperty(a)){b=c;break a}}b=void 0}if(!b)throw Error("Could not find descriptor for "+a);return Object.getOwnPropertyDescriptor(b,a)}
+var I=mb?{parentNode:H("parentNode"),firstChild:H("firstChild"),lastChild:H("lastChild"),previousSibling:H("previousSibling"),nextSibling:H("nextSibling"),childNodes:H("childNodes"),parentElement:H("parentElement"),previousElementSibling:H("previousElementSibling"),nextElementSibling:H("nextElementSibling"),innerHTML:H("innerHTML"),textContent:H("textContent"),firstElementChild:H("firstElementChild"),lastElementChild:H("lastElementChild"),children:H("children")}:{},ob=mb?{firstElementChild:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,
+"firstElementChild"),lastElementChild:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,"lastElementChild"),children:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,"children")}:{},pb=mb?{firstElementChild:Object.getOwnPropertyDescriptor(Document.prototype,"firstElementChild"),lastElementChild:Object.getOwnPropertyDescriptor(Document.prototype,"lastElementChild"),children:Object.getOwnPropertyDescriptor(Document.prototype,"children")}:{};G.da=I;G.Ta=ob;G.Oa=pb;G.parentNode=function(a){return I.parentNode.get.call(a)};
+G.firstChild=function(a){return I.firstChild.get.call(a)};G.lastChild=function(a){return I.lastChild.get.call(a)};G.previousSibling=function(a){return I.previousSibling.get.call(a)};G.nextSibling=function(a){return I.nextSibling.get.call(a)};G.childNodes=function(a){return Array.prototype.slice.call(I.childNodes.get.call(a))};G.parentElement=function(a){return I.parentElement.get.call(a)};G.previousElementSibling=function(a){return I.previousElementSibling.get.call(a)};G.nextElementSibling=function(a){return I.nextElementSibling.get.call(a)};
+G.innerHTML=function(a){return I.innerHTML.get.call(a)};G.textContent=function(a){return I.textContent.get.call(a)};G.children=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:a=ob.children.get.call(a);break;case Node.DOCUMENT_NODE:a=pb.children.get.call(a);break;default:a=I.children.get.call(a)}return Array.prototype.slice.call(a)};
+G.firstElementChild=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return ob.firstElementChild.get.call(a);case Node.DOCUMENT_NODE:return pb.firstElementChild.get.call(a);default:return I.firstElementChild.get.call(a)}};G.lastElementChild=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return ob.lastElementChild.get.call(a);case Node.DOCUMENT_NODE:return pb.lastElementChild.get.call(a);default:return I.lastElementChild.get.call(a)}};var J=u.ha?G:C;function qb(a){for(;a.firstChild;)a.removeChild(a.firstChild)}
+var rb=u.o,sb=document.implementation.createHTMLDocument("inert"),tb=Object.getOwnPropertyDescriptor(Node.prototype,"isConnected"),ub=tb&&tb.get,vb=Object.getOwnPropertyDescriptor(Document.prototype,"activeElement"),wb={parentElement:{get:function(){var a=t(this);(a=a&&a.parentNode)&&a.nodeType!==Node.ELEMENT_NODE&&(a=null);return void 0!==a?a:J.parentElement(this)},configurable:!0},parentNode:{get:function(){var a=t(this);a=a&&a.parentNode;return void 0!==a?a:J.parentNode(this)},configurable:!0},
+nextSibling:{get:function(){var a=t(this);a=a&&a.nextSibling;return void 0!==a?a:J.nextSibling(this)},configurable:!0},previousSibling:{get:function(){var a=t(this);a=a&&a.previousSibling;return void 0!==a?a:J.previousSibling(this)},configurable:!0},nextElementSibling:{get:function(){var a=t(this);if(a&&void 0!==a.nextSibling){for(a=this.nextSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}return J.nextElementSibling(this)},configurable:!0},previousElementSibling:{get:function(){var a=
+t(this);if(a&&void 0!==a.previousSibling){for(a=this.previousSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}return J.previousElementSibling(this)},configurable:!0}},xb={className:{get:function(){return this.getAttribute("class")||""},set:function(a){this.setAttribute("class",a)},configurable:!0}},yb={childNodes:{get:function(){if(v(this)){var a=t(this);if(!a.childNodes){a.childNodes=[];for(var b=this.firstChild;b;b=b.nextSibling)a.childNodes.push(b)}var c=a.childNodes}else c=
+J.childNodes(this);c.item=function(a){return c[a]};return c},configurable:!0},childElementCount:{get:function(){return this.children.length},configurable:!0},firstChild:{get:function(){var a=t(this);a=a&&a.firstChild;return void 0!==a?a:J.firstChild(this)},configurable:!0},lastChild:{get:function(){var a=t(this);a=a&&a.lastChild;return void 0!==a?a:J.lastChild(this)},configurable:!0},textContent:{get:function(){if(v(this)){for(var a=[],b=0,c=this.childNodes,d;d=c[b];b++)d.nodeType!==Node.COMMENT_NODE&&
+a.push(d.textContent);return a.join("")}return J.textContent(this)},set:function(a){if("undefined"===typeof a||null===a)a="";switch(this.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:if(!v(this)&&rb){var b=this.firstChild;(b!=this.lastChild||b&&b.nodeType!=Node.TEXT_NODE)&&qb(this);G.da.textContent.set.call(this,a)}else qb(this),(0<a.length||this.nodeType===Node.ELEMENT_NODE)&&this.appendChild(document.createTextNode(a));break;default:this.nodeValue=a}},configurable:!0},firstElementChild:{get:function(){var a=
+t(this);if(a&&void 0!==a.firstChild){for(a=this.firstChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}return J.firstElementChild(this)},configurable:!0},lastElementChild:{get:function(){var a=t(this);if(a&&void 0!==a.lastChild){for(a=this.lastChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}return J.lastElementChild(this)},configurable:!0},children:{get:function(){var a=v(this)?Array.prototype.filter.call(this.childNodes,function(a){return a.nodeType===Node.ELEMENT_NODE}):
+J.children(this);a.item=function(b){return a[b]};return a},configurable:!0},innerHTML:{get:function(){return v(this)?kb("template"===this.localName?this.content:this):J.innerHTML(this)},set:function(a){var b="template"===this.localName?this.content:this;qb(b);var c=this.localName;c&&"template"!==c||(c="div");c=sb.createElement(c);for(rb?G.da.innerHTML.set.call(c,a):c.innerHTML=a;c.firstChild;)b.appendChild(c.firstChild)},configurable:!0}},Ab={shadowRoot:{get:function(){var a=t(this);return a&&a.ea||
+null},configurable:!0}},Bb={activeElement:{get:function(){var a=vb&&vb.get?vb.get.call(document):u.o?void 0:document.activeElement;if(a&&a.nodeType){var b=!!w(this);if(this===document||b&&this.host!==a&&A.contains.call(this.host,a)){for(b=y(a);b&&b!==this;)a=b.host,b=y(a);a=this===document?b?null:a:b===this?a:null}else a=null}else a=null;return a},set:function(){},configurable:!0}};
+function K(a,b,c){for(var d in b){var e=Object.getOwnPropertyDescriptor(a,d);e&&e.configurable||!e&&c?Object.defineProperty(a,d,b[d]):c&&console.warn("Could not define",d,"on",a)}}function L(a){K(a,wb);K(a,xb);K(a,yb);K(a,Bb)}
+function Cb(){var a=Db.prototype;a.__proto__=DocumentFragment.prototype;K(a,wb,!0);K(a,yb,!0);K(a,Bb,!0);Object.defineProperties(a,{nodeType:{value:Node.DOCUMENT_FRAGMENT_NODE,configurable:!0},nodeName:{value:"#document-fragment",configurable:!0},nodeValue:{value:null,configurable:!0}});["localName","namespaceURI","prefix"].forEach(function(b){Object.defineProperty(a,b,{value:void 0,configurable:!0})});["ownerDocument","baseURI","isConnected"].forEach(function(b){Object.defineProperty(a,b,{get:function(){return this.host[b]},
+configurable:!0})})}var Eb=u.o?function(){}:function(a){var b=r(a);b.$||(b.$=!0,K(a,wb,!0),K(a,xb,!0))},Fb=u.o?function(){}:function(a){r(a).ja||(K(a,yb,!0),K(a,Ab,!0))};var Gb=J.childNodes;function Hb(a,b,c){Eb(a);c=c||null;var d=r(a),e=r(b),f=c?r(c):null;d.previousSibling=c?f.previousSibling:b.lastChild;if(f=t(d.previousSibling))f.nextSibling=a;if(f=t(d.nextSibling=c))f.previousSibling=a;d.parentNode=b;c?c===e.firstChild&&(e.firstChild=a):(e.lastChild=a,e.firstChild||(e.firstChild=a));e.childNodes=null}
+function Ib(a,b){var c=r(a);if(void 0===c.firstChild)for(b=b||Gb(a),c.firstChild=b[0]||null,c.lastChild=b[b.length-1]||null,Fb(a),c=0;c<b.length;c++){var d=b[c],e=r(d);e.parentNode=a;e.nextSibling=b[c+1]||null;e.previousSibling=b[c-1]||null;Eb(d)}};var Jb=J.parentNode;
+function Kb(a,b,c){if(b===a)throw Error("Failed to execute 'appendChild' on 'Node': The new child element contains the parent.");if(c){var d=t(c);d=d&&d.parentNode;if(void 0!==d&&d!==a||void 0===d&&Jb(c)!==a)throw Error("Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.");}if(c===b)return b;b.parentNode&&Lb(b.parentNode,b);var e,f;if(!b.__noInsertionPoint){if(f=e=y(a)){var h;"slot"===b.localName?h=[b]:b.querySelectorAll&&
+(h=b.querySelectorAll("slot"));f=h&&h.length?h:void 0}f&&(h=e,d=f,h.m=h.m||[],h.f=h.f||[],h.g=h.g||{},h.m.push.apply(h.m,[].concat(d instanceof Array?d:ja(ia(d)))))}("slot"===a.localName||f)&&(e=e||y(a))&&M(e);if(v(a)){e=c;Fb(a);f=r(a);void 0!==f.firstChild&&(f.childNodes=null);if(b.nodeType===Node.DOCUMENT_FRAGMENT_NODE){f=b.childNodes;for(h=0;h<f.length;h++)Hb(f[h],a,e);e=r(b);f=void 0!==e.firstChild?null:void 0;e.firstChild=e.lastChild=f;e.childNodes=f}else Hb(b,a,e);e=t(a);if(Mb(a)){M(e.root);
+var g=!0}else e.root&&(g=!0)}g||(g=w(a)?a.host:a,c?(c=Nb(c),A.insertBefore.call(g,b,c)):A.appendChild.call(g,b));Ob(a,b);return b}
+function Lb(a,b){if(b.parentNode!==a)throw Error("The node to be removed is not a child of this node: "+b);var c=y(b),d=t(a);if(v(a)){var e=r(b),f=r(a);b===f.firstChild&&(f.firstChild=e.nextSibling);b===f.lastChild&&(f.lastChild=e.previousSibling);var h=e.previousSibling,g=e.nextSibling;h&&(r(h).nextSibling=g);g&&(r(g).previousSibling=h);e.parentNode=e.previousSibling=e.nextSibling=void 0;void 0!==f.childNodes&&(f.childNodes=null);if(Mb(a)){M(d.root);var k=!0}}Pb(b);if(c){(e=a&&"slot"===a.localName)&&
+(k=!0);if(c.f){Qb(c);f=c.g;for(T in f)for(h=f[T],g=0;g<h.length;g++){var l=h[g];if(xa(b,l)){h.splice(g,1);var m=c.f.indexOf(l);0<=m&&c.f.splice(m,1);g--;m=t(l);if(l=m.v)for(var p=0;p<l.length;p++){var x=l[p],B=Rb(x);B&&A.removeChild.call(B,x)}m.v=[];m.assignedNodes=[];m=!0}}var T=m}else T=void 0;(T||e)&&M(c)}k||(k=w(a)?a.host:a,(!d.root&&"slot"!==b.localName||k===Jb(b))&&A.removeChild.call(k,b));Ob(a,null,b);return b}
+function Pb(a){var b=t(a);if(b&&void 0!==b.G){b=a.childNodes;for(var c=0,d=b.length,e;c<d&&(e=b[c]);c++)Pb(e)}if(a=t(a))a.G=void 0}function Nb(a){var b=a;a&&"slot"===a.localName&&(b=(b=(b=t(a))&&b.v)&&b.length?b[0]:Nb(a.nextSibling));return b}function Mb(a){return(a=(a=t(a))&&a.root)&&Sb(a)}
+function Tb(a,b){if("slot"===b)a=a.parentNode,Mb(a)&&M(t(a).root);else if("slot"===a.localName&&"name"===b&&(b=y(a))){if(b.f){var c=a.ka,d=Ub(a);if(d!==c){c=b.g[c];var e=c.indexOf(a);0<=e&&c.splice(e,1);c=b.g[d]||(b.g[d]=[]);c.push(a);1<c.length&&(b.g[d]=Vb(c))}}M(b)}}function Ob(a,b,c){if(a=(a=t(a))&&a.C)b&&a.addedNodes.push(b),c&&a.removedNodes.push(c),Ga(a)}
+function Wb(a){if(a&&a.nodeType){var b=r(a),c=b.G;void 0===c&&(w(a)?(c=a,b.G=c):(c=(c=a.parentNode)?Wb(c):a,A.contains.call(document.documentElement,a)&&(b.G=c)));return c}}function Xb(a,b,c){var d=[];Yb(a.childNodes,b,c,d);return d}function Yb(a,b,c,d){for(var e=0,f=a.length,h;e<f&&(h=a[e]);e++){var g;if(g=h.nodeType===Node.ELEMENT_NODE){g=h;var k=b,l=c,m=d,p=k(g);p&&m.push(g);l&&l(p)?g=p:(Yb(g.childNodes,k,l,m),g=void 0)}if(g)break}}var Zb=null;
+function $b(a,b,c){Zb||(Zb=window.ShadyCSS&&window.ShadyCSS.ScopingShim);Zb&&"class"===b?Zb.setElementClass(a,c):(A.setAttribute.call(a,b,c),Tb(a,b))}function ac(a,b){if(a.ownerDocument!==document)return A.importNode.call(document,a,b);var c=A.importNode.call(document,a,!1);if(b){a=a.childNodes;b=0;for(var d;b<a.length;b++)d=ac(a[b],!0),c.appendChild(d)}return c};var bc="__eventWrappers"+Date.now(),cc={blur:!0,focus:!0,focusin:!0,focusout:!0,click:!0,dblclick:!0,mousedown:!0,mouseenter:!0,mouseleave:!0,mousemove:!0,mouseout:!0,mouseover:!0,mouseup:!0,wheel:!0,beforeinput:!0,input:!0,keydown:!0,keyup:!0,compositionstart:!0,compositionupdate:!0,compositionend:!0,touchstart:!0,touchend:!0,touchmove:!0,touchcancel:!0,pointerover:!0,pointerenter:!0,pointerdown:!0,pointermove:!0,pointerup:!0,pointercancel:!0,pointerout:!0,pointerleave:!0,gotpointercapture:!0,lostpointercapture:!0,
+dragstart:!0,drag:!0,dragenter:!0,dragleave:!0,dragover:!0,drop:!0,dragend:!0,DOMActivate:!0,DOMFocusIn:!0,DOMFocusOut:!0,keypress:!0};function dc(a,b){var c=[],d=a;for(a=a===window?window:a.getRootNode();d;)c.push(d),d=d.assignedSlot?d.assignedSlot:d.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&d.host&&(b||d!==a)?d.host:d.parentNode;c[c.length-1]===document&&c.push(window);return c}
+function ec(a,b){if(!w)return a;a=dc(a,!0);for(var c=0,d,e,f,h;c<b.length;c++)if(d=b[c],f=d===window?window:d.getRootNode(),f!==e&&(h=a.indexOf(f),e=f),!w(f)||-1<h)return d}
+var fc={get composed(){!1!==this.isTrusted&&void 0===this.R&&(this.R=cc[this.type]);return this.R||!1},composedPath:function(){this.b||(this.b=dc(this.__target,this.composed));return this.b},get target(){return ec(this.currentTarget,this.composedPath())},get relatedTarget(){if(!this.S)return null;this.c||(this.c=dc(this.S,!0));return ec(this.currentTarget,this.c)},stopPropagation:function(){Event.prototype.stopPropagation.call(this);this.a=!0},stopImmediatePropagation:function(){Event.prototype.stopImmediatePropagation.call(this);
+this.a=this.i=!0}};function gc(a){function b(b,d){b=new a(b,d);b.R=d&&!!d.composed;return b}ra(b,a);b.prototype=a.prototype;return b}var hc={focus:!0,blur:!0};function ic(a){return a.__target!==a.target||a.S!==a.relatedTarget}function jc(a,b,c){if(c=b.__handlers&&b.__handlers[a.type]&&b.__handlers[a.type][c])for(var d=0,e;(e=c[d])&&(!ic(a)||a.target!==a.relatedTarget)&&(e.call(b,a),!a.i);d++);}
+function kc(a){var b=a.composedPath();Object.defineProperty(a,"currentTarget",{get:function(){return d},configurable:!0});for(var c=b.length-1;0<=c;c--){var d=b[c];jc(a,d,"capture");if(a.a)return}Object.defineProperty(a,"eventPhase",{get:function(){return Event.AT_TARGET}});var e;for(c=0;c<b.length;c++){d=b[c];var f=t(d);f=f&&f.root;if(0===c||f&&f===e)if(jc(a,d,"bubble"),d!==window&&(e=d.getRootNode()),a.a)break}}
+function lc(a,b,c,d,e,f){for(var h=0;h<a.length;h++){var g=a[h],k=g.type,l=g.capture,m=g.once,p=g.passive;if(b===g.node&&c===k&&d===l&&e===m&&f===p)return h}return-1}
+function mc(a,b,c){if(b){var d=typeof b;if("function"===d||"object"===d)if("object"!==d||b.handleEvent&&"function"===typeof b.handleEvent){if(c&&"object"===typeof c){var e=!!c.capture;var f=!!c.once;var h=!!c.passive}else e=!!c,h=f=!1;var g=c&&c.U||this,k=b[bc];if(k){if(-1<lc(k,g,a,e,f,h))return}else b[bc]=[];k=function(e){f&&this.removeEventListener(a,b,c);e.__target||nc(e);if(g!==this){var h=Object.getOwnPropertyDescriptor(e,"currentTarget");Object.defineProperty(e,"currentTarget",{get:function(){return g},
+configurable:!0})}if(e.composed||-1<e.composedPath().indexOf(g))if(ic(e)&&e.target===e.relatedTarget)e.eventPhase===Event.BUBBLING_PHASE&&e.stopImmediatePropagation();else if(e.eventPhase===Event.CAPTURING_PHASE||e.bubbles||e.target===g||g instanceof Window){var k="function"===d?b.call(g,e):b.handleEvent&&b.handleEvent(e);g!==this&&(h?(Object.defineProperty(e,"currentTarget",h),h=null):delete e.currentTarget);return k}};b[bc].push({node:g,type:a,capture:e,once:f,passive:h,Ka:k});hc[a]?(this.__handlers=
+this.__handlers||{},this.__handlers[a]=this.__handlers[a]||{capture:[],bubble:[]},this.__handlers[a][e?"capture":"bubble"].push(k)):(this instanceof Window?A.Ia:A.addEventListener).call(this,a,k,c)}}}
+function oc(a,b,c){if(b){if(c&&"object"===typeof c){var d=!!c.capture;var e=!!c.once;var f=!!c.passive}else d=!!c,f=e=!1;var h=c&&c.U||this,g=void 0;var k=null;try{k=b[bc]}catch(l){}k&&(e=lc(k,h,a,d,e,f),-1<e&&(g=k.splice(e,1)[0].Ka,k.length||(b[bc]=void 0)));(this instanceof Window?A.Ja:A.removeEventListener).call(this,a,g||b,c);g&&hc[a]&&this.__handlers&&this.__handlers[a]&&(a=this.__handlers[a][d?"capture":"bubble"],g=a.indexOf(g),-1<g&&a.splice(g,1))}}
+function pc(){for(var a in hc)window.addEventListener(a,function(a){a.__target||(nc(a),kc(a))},!0)}function nc(a){a.__target=a.target;a.S=a.relatedTarget;if(u.o){var b=Object.getPrototypeOf(a);if(!b.hasOwnProperty("__patchProto")){var c=Object.create(b);c.Ma=b;pa(c,fc);b.__patchProto=c}a.__proto__=b.__patchProto}else pa(a,fc)}var qc=gc(window.Event),rc=gc(window.CustomEvent),sc=gc(window.MouseEvent);function tc(a,b){return{index:a,H:[],L:b}}
+function uc(a,b,c,d){var e=0,f=0,h=0,g=0,k=Math.min(b-e,d-f);if(0==e&&0==f)a:{for(h=0;h<k;h++)if(a[h]!==c[h])break a;h=k}if(b==a.length&&d==c.length){g=a.length;for(var l=c.length,m=0;m<k-h&&vc(a[--g],c[--l]);)m++;g=m}e+=h;f+=h;b-=g;d-=g;if(0==b-e&&0==d-f)return[];if(e==b){for(b=tc(e,0);f<d;)b.H.push(c[f++]);return[b]}if(f==d)return[tc(e,b-e)];k=e;h=f;d=d-h+1;g=b-k+1;b=Array(d);for(l=0;l<d;l++)b[l]=Array(g),b[l][0]=l;for(l=0;l<g;l++)b[0][l]=l;for(l=1;l<d;l++)for(m=1;m<g;m++)if(a[k+m-1]===c[h+l-1])b[l][m]=
+b[l-1][m-1];else{var p=b[l-1][m]+1,x=b[l][m-1]+1;b[l][m]=p<x?p:x}k=b.length-1;h=b[0].length-1;d=b[k][h];for(a=[];0<k||0<h;)0==k?(a.push(2),h--):0==h?(a.push(3),k--):(g=b[k-1][h-1],l=b[k-1][h],m=b[k][h-1],p=l<m?l<g?l:g:m<g?m:g,p==g?(g==d?a.push(0):(a.push(1),d=g),k--,h--):p==l?(a.push(3),k--,d=l):(a.push(2),h--,d=m));a.reverse();b=void 0;k=[];for(h=0;h<a.length;h++)switch(a[h]){case 0:b&&(k.push(b),b=void 0);e++;f++;break;case 1:b||(b=tc(e,0));b.L++;e++;b.H.push(c[f]);f++;break;case 2:b||(b=tc(e,0));
+b.L++;e++;break;case 3:b||(b=tc(e,0)),b.H.push(c[f]),f++}b&&k.push(b);return k}function vc(a,b){return a===b};var Rb=J.parentNode,wc=J.childNodes,xc={};function yc(a){var b=[];do b.unshift(a);while(a=a.parentNode);return b}function Db(a,b,c){if(a!==xc)throw new TypeError("Illegal constructor");this.na="ShadyRoot";a=wc(b);this.host=b;this.a=c&&c.mode;Ib(b,a);c=t(b);c.root=this;c.ea="closed"!==this.a?this:null;c=r(this);c.firstChild=c.lastChild=c.parentNode=c.nextSibling=c.previousSibling=null;c.childNodes=[];this.K=!1;this.m=this.g=this.f=null;c=0;for(var d=a.length;c<d;c++)A.removeChild.call(b,a[c])}
+function M(a){a.K||(a.K=!0,Aa(function(){return zc(a)}))}function zc(a){for(var b;a;){a.K&&(b=a);a:{var c=a;a=c.host.getRootNode();if(w(a))for(var d=c.host.childNodes,e=0;e<d.length;e++)if(c=d[e],"slot"==c.localName)break a;a=void 0}}b&&b._renderRoot()}
+Db.prototype._renderRoot=function(){this.K=!1;if(this.f){Qb(this);for(var a=0,b;a<this.f.length;a++){b=this.f[a];var c=t(b),d=c.assignedNodes;c.assignedNodes=[];c.v=[];if(c.W=d)for(c=0;c<d.length;c++){var e=t(d[c]);e.J=e.assignedSlot;e.assignedSlot===b&&(e.assignedSlot=null)}}for(b=this.host.firstChild;b;b=b.nextSibling)Ac(this,b);for(a=0;a<this.f.length;a++){b=this.f[a];d=t(b);if(!d.assignedNodes.length)for(c=b.firstChild;c;c=c.nextSibling)Ac(this,c,b);(c=(c=t(b.parentNode))&&c.root)&&Sb(c)&&c._renderRoot();
+Bc(this,d.v,d.assignedNodes);if(c=d.W){for(e=0;e<c.length;e++)t(c[e]).J=null;d.W=null;c.length>d.assignedNodes.length&&(d.N=!0)}d.N&&(d.N=!1,Cc(this,b))}a=this.f;b=[];for(d=0;d<a.length;d++)c=a[d].parentNode,(e=t(c))&&e.root||!(0>b.indexOf(c))||b.push(c);for(a=0;a<b.length;a++){d=b[a];c=d===this?this.host:d;e=[];d=d.childNodes;for(var f=0;f<d.length;f++){var h=d[f];if("slot"==h.localName){h=t(h).v;for(var g=0;g<h.length;g++)e.push(h[g])}else e.push(h)}d=void 0;f=wc(c);h=uc(e,e.length,f,f.length);
+for(var k=g=0;g<h.length&&(d=h[g]);g++){for(var l=0,m;l<d.H.length&&(m=d.H[l]);l++)Rb(m)===c&&A.removeChild.call(c,m),f.splice(d.index+k,1);k-=d.L}for(k=0;k<h.length&&(d=h[k]);k++)for(g=f[d.index],l=d.index;l<d.index+d.L;l++)m=e[l],A.insertBefore.call(c,m,g),f.splice(l,0,m)}}};function Ac(a,b,c){var d=r(b),e=d.J;d.J=null;c||(c=(a=a.g[b.slot||"__catchall"])&&a[0]);c?(r(c).assignedNodes.push(b),d.assignedSlot=c):d.assignedSlot=void 0;e!==d.assignedSlot&&d.assignedSlot&&(r(d.assignedSlot).N=!0)}
+function Bc(a,b,c){for(var d=0,e;d<c.length&&(e=c[d]);d++)if("slot"==e.localName){var f=t(e).assignedNodes;f&&f.length&&Bc(a,b,f)}else b.push(c[d])}function Cc(a,b){A.dispatchEvent.call(b,new Event("slotchange"));b=t(b);b.assignedSlot&&Cc(a,b.assignedSlot)}function Qb(a){if(a.m&&a.m.length){for(var b=a.m,c,d=0;d<b.length;d++){var e=b[d];Ib(e);Ib(e.parentNode);var f=Ub(e);a.g[f]?(c=c||{},c[f]=!0,a.g[f].push(e)):a.g[f]=[e];a.f.push(e)}if(c)for(var h in c)a.g[h]=Vb(a.g[h]);a.m=[]}}
+function Ub(a){var b=a.name||a.getAttribute("name")||"__catchall";return a.ka=b}function Vb(a){return a.sort(function(a,c){a=yc(a);for(var b=yc(c),e=0;e<a.length;e++){c=a[e];var f=b[e];if(c!==f)return a=Array.from(c.parentNode.childNodes),a.indexOf(c)-a.indexOf(f)}})}function Sb(a){Qb(a);return!(!a.f||!a.f.length)};function Dc(a){var b=a.getRootNode();w(b)&&zc(b);return(a=t(a))&&a.assignedSlot||null}
+var Ec={addEventListener:mc.bind(window),removeEventListener:oc.bind(window)},Fc={addEventListener:mc,removeEventListener:oc,appendChild:function(a){return Kb(this,a)},insertBefore:function(a,b){return Kb(this,a,b)},removeChild:function(a){return Lb(this,a)},replaceChild:function(a,b){Kb(this,a,b);Lb(this,b);return a},cloneNode:function(a){if("template"==this.localName)var b=A.cloneNode.call(this,a);else if(b=A.cloneNode.call(this,!1),a){a=this.childNodes;for(var c=0,d;c<a.length;c++)d=a[c].cloneNode(!0),
+b.appendChild(d)}return b},getRootNode:function(){return Wb(this)},contains:function(a){return xa(this,a)},dispatchEvent:function(a){Ba();return A.dispatchEvent.call(this,a)}};
+Object.defineProperties(Fc,{isConnected:{get:function(){if(ub&&ub.call(this))return!0;if(this.nodeType==Node.DOCUMENT_FRAGMENT_NODE)return!1;var a=this.ownerDocument;if(wa){if(A.contains.call(a,this))return!0}else if(a.documentElement&&A.contains.call(a.documentElement,this))return!0;for(a=this;a&&!(a instanceof Document);)a=a.parentNode||(w(a)?a.host:void 0);return!!(a&&a instanceof Document)},configurable:!0}});
+var Gc={get assignedSlot(){return Dc(this)}},Hc={querySelector:function(a){return Xb(this,function(b){return oa.call(b,a)},function(a){return!!a})[0]||null},querySelectorAll:function(a,b){if(b){b=Array.prototype.slice.call(A.querySelectorAll(this,a));var c=this.getRootNode();return b.filter(function(a){return a.getRootNode()==c})}return Xb(this,function(b){return oa.call(b,a)})}},Ic={assignedNodes:function(a){if("slot"===this.localName){var b=this.getRootNode();w(b)&&zc(b);return(b=t(this))?(a&&a.flatten?
+b.v:b.assignedNodes)||[]:[]}}},Jc=qa({setAttribute:function(a,b){$b(this,a,b)},removeAttribute:function(a){A.removeAttribute.call(this,a);Tb(this,a)},attachShadow:function(a){if(!this)throw"Must provide a host.";if(!a)throw"Not enough arguments.";return new Db(xc,this,a)},get slot(){return this.getAttribute("slot")},set slot(a){$b(this,"slot",a)},get assignedSlot(){return Dc(this)}},Hc,Ic);Object.defineProperties(Jc,Ab);
+var Kc=qa({importNode:function(a,b){return ac(a,b)},getElementById:function(a){return Xb(this,function(b){return b.id==a},function(a){return!!a})[0]||null}},Hc);Object.defineProperties(Kc,{_activeElement:Bb.activeElement});
+var Lc=HTMLElement.prototype.blur,Mc=qa({blur:function(){var a=t(this);(a=(a=a&&a.root)&&a.activeElement)?a.blur():Lc.call(this)}}),Nc={addEventListener:function(a,b,c){"object"!==typeof c&&(c={capture:!!c});c.U=this;this.host.addEventListener(a,b,c)},removeEventListener:function(a,b,c){"object"!==typeof c&&(c={capture:!!c});c.U=this;this.host.removeEventListener(a,b,c)},getElementById:function(a){return Xb(this,function(b){return b.id==a},function(a){return!!a})[0]||null}};
+function N(a,b){for(var c=Object.getOwnPropertyNames(b),d=0;d<c.length;d++){var e=c[d],f=Object.getOwnPropertyDescriptor(b,e);f.value?a[e]=f.value:Object.defineProperty(a,e,f)}};if(u.ca){var ShadyDOM={inUse:u.ca,patch:function(a){Fb(a);Eb(a);return a},isShadyRoot:w,enqueue:Aa,flush:Ba,settings:u,filterMutations:Ka,observeChildren:Ia,unobserveChildren:Ja,nativeMethods:A,nativeTree:J};window.ShadyDOM=ShadyDOM;window.Event=qc;window.CustomEvent=rc;window.MouseEvent=sc;pc();var Oc=window.customElements&&window.customElements.nativeHTMLElement||HTMLElement;N(Db.prototype,Nc);N(window.Node.prototype,Fc);N(window.Window.prototype,Ec);N(window.Text.prototype,Gc);N(window.DocumentFragment.prototype,
+Hc);N(window.Element.prototype,Jc);N(window.Document.prototype,Kc);window.HTMLSlotElement&&N(window.HTMLSlotElement.prototype,Ic);N(Oc.prototype,Mc);u.o&&(L(window.Node.prototype),L(window.Text.prototype),L(window.DocumentFragment.prototype),L(window.Element.prototype),L(Oc.prototype),L(window.Document.prototype),window.HTMLSlotElement&&L(window.HTMLSlotElement.prototype));Cb();window.ShadowRoot=Db};/*
+
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+function Pc(){this.end=this.start=0;this.rules=this.parent=this.previous=null;this.cssText=this.parsedCssText="";this.atRule=!1;this.type=0;this.parsedSelector=this.selector=this.keyframesName=""}
+function Qc(a){a=a.replace(Rc,"").replace(Sc,"");var b=Tc,c=a,d=new Pc;d.start=0;d.end=c.length;for(var e=d,f=0,h=c.length;f<h;f++)if("{"===c[f]){e.rules||(e.rules=[]);var g=e,k=g.rules[g.rules.length-1]||null;e=new Pc;e.start=f+1;e.parent=g;e.previous=k;g.rules.push(e)}else"}"===c[f]&&(e.end=f+1,e=e.parent||d);return b(d,a)}
+function Tc(a,b){var c=b.substring(a.start,a.end-1);a.parsedCssText=a.cssText=c.trim();a.parent&&(c=b.substring(a.previous?a.previous.end:a.parent.start,a.start-1),c=Uc(c),c=c.replace(Vc," "),c=c.substring(c.lastIndexOf(";")+1),c=a.parsedSelector=a.selector=c.trim(),a.atRule=0===c.indexOf("@"),a.atRule?0===c.indexOf("@media")?a.type=Wc:c.match(Xc)&&(a.type=Yc,a.keyframesName=a.selector.split(Vc).pop()):a.type=0===c.indexOf("--")?Zc:$c);if(c=a.rules)for(var d=0,e=c.length,f;d<e&&(f=c[d]);d++)Tc(f,
+b);return a}function Uc(a){return a.replace(/\\([0-9a-f]{1,6})\s/gi,function(a,c){a=c;for(c=6-a.length;c--;)a="0"+a;return"\\"+a})}
+function ad(a,b,c){c=void 0===c?"":c;var d="";if(a.cssText||a.rules){var e=a.rules,f;if(f=e)f=e[0],f=!(f&&f.selector&&0===f.selector.indexOf("--"));if(f){f=0;for(var h=e.length,g;f<h&&(g=e[f]);f++)d=ad(g,b,d)}else b?b=a.cssText:(b=a.cssText,b=b.replace(bd,"").replace(cd,""),b=b.replace(dd,"").replace(ed,"")),(d=b.trim())&&(d=" "+d+"\n")}d&&(a.selector&&(c+=a.selector+" {\n"),c+=d,a.selector&&(c+="}\n\n"));return c}
+var $c=1,Yc=7,Wc=4,Zc=1E3,Rc=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,Sc=/@import[^;]*;/gim,bd=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,cd=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,dd=/@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,ed=/[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,Xc=/^@[^\s]*keyframes/,Vc=/\s+/g;var O=!(window.ShadyDOM&&window.ShadyDOM.inUse),fd;function gd(a){fd=a&&a.shimcssproperties?!1:O||!(navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/)||!window.CSS||!CSS.supports||!CSS.supports("box-shadow","0 0 0 var(--foo)"))}window.ShadyCSS&&void 0!==window.ShadyCSS.nativeCss?fd=window.ShadyCSS.nativeCss:window.ShadyCSS?(gd(window.ShadyCSS),window.ShadyCSS=void 0):gd(window.WebComponents&&window.WebComponents.flags);var P=fd;var hd=/(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};{])+)|\{([^}]*)\}(?:(?=[;\s}])|$))/gi,id=/(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi,jd=/(--[\w-]+)\s*([:,;)]|$)/gi,kd=/(animation\s*:)|(animation-name\s*:)/,ld=/@media\s(.*)/,md=/\{[^}]*\}/g;var nd=new Set;function Q(a,b){if(!a)return"";"string"===typeof a&&(a=Qc(a));b&&R(a,b);return ad(a,P)}function od(a){!a.__cssRules&&a.textContent&&(a.__cssRules=Qc(a.textContent));return a.__cssRules||null}function pd(a){return!!a.parent&&a.parent.type===Yc}function R(a,b,c,d){if(a){var e=!1,f=a.type;if(d&&f===Wc){var h=a.selector.match(ld);h&&(window.matchMedia(h[1]).matches||(e=!0))}f===$c?b(a):c&&f===Yc?c(a):f===Zc&&(e=!0);if((a=a.rules)&&!e){e=0;f=a.length;for(var g;e<f&&(g=a[e]);e++)R(g,b,c,d)}}}
+function qd(a,b,c,d){var e=document.createElement("style");b&&e.setAttribute("scope",b);e.textContent=a;rd(e,c,d);return e}var S=null;function rd(a,b,c){b=b||document.head;b.insertBefore(a,c&&c.nextSibling||b.firstChild);S?a.compareDocumentPosition(S)===Node.DOCUMENT_POSITION_PRECEDING&&(S=a):S=a}
+function sd(a,b){var c=a.indexOf("var(");if(-1===c)return b(a,"","","");a:{var d=0;var e=c+3;for(var f=a.length;e<f;e++)if("("===a[e])d++;else if(")"===a[e]&&0===--d)break a;e=-1}d=a.substring(c+4,e);c=a.substring(0,c);a=sd(a.substring(e+1),b);e=d.indexOf(",");return-1===e?b(c,d.trim(),"",a):b(c,d.substring(0,e).trim(),d.substring(e+1).trim(),a)}function td(a,b){O?a.setAttribute("class",b):window.ShadyDOM.nativeMethods.setAttribute.call(a,"class",b)}
+function U(a){var b=a.localName,c="";b?-1<b.indexOf("-")||(c=b,b=a.getAttribute&&a.getAttribute("is")||""):(b=a.is,c=a.extends);return{is:b,I:c}};function ud(){}function yd(a,b,c){var d=V;a.__styleScoped?a.__styleScoped=null:zd(d,a,b||"",c)}function zd(a,b,c,d){b.nodeType===Node.ELEMENT_NODE&&Ad(b,c,d);if(b="template"===b.localName?(b.content||b.Na).childNodes:b.children||b.childNodes)for(var e=0;e<b.length;e++)zd(a,b[e],c,d)}
+function Ad(a,b,c){if(b)if(a.classList)c?(a.classList.remove("style-scope"),a.classList.remove(b)):(a.classList.add("style-scope"),a.classList.add(b));else if(a.getAttribute){var d=a.getAttribute(Bd);c?d&&(b=d.replace("style-scope","").replace(b,""),td(a,b)):td(a,(d?d+" ":"")+"style-scope "+b)}}function Cd(a,b,c){var d=V,e=a.__cssBuild;O||"shady"===e?b=Q(b,c):(a=U(a),b=Dd(d,b,a.is,a.I,c)+"\n\n");return b.trim()}
+function Dd(a,b,c,d,e){var f=Ed(c,d);c=c?Fd+c:"";return Q(b,function(b){b.c||(b.selector=b.j=Gd(a,b,a.b,c,f),b.c=!0);e&&e(b,c,f)})}function Ed(a,b){return b?"[is="+a+"]":a}function Gd(a,b,c,d,e){var f=b.selector.split(Hd);if(!pd(b)){b=0;for(var h=f.length,g;b<h&&(g=f[b]);b++)f[b]=c.call(a,g,d,e)}return f.join(Hd)}function Id(a){return a.replace(Jd,function(a,c,d){-1<d.indexOf("+")?d=d.replace(/\+/g,"___"):-1<d.indexOf("___")&&(d=d.replace(/___/g,"+"));return":"+c+"("+d+")"})}
+ud.prototype.b=function(a,b,c){var d=!1;a=a.trim();var e=Jd.test(a);e&&(a=a.replace(Jd,function(a,b,c){return":"+b+"("+c.replace(/\s/g,"")+")"}),a=Id(a));a=a.replace(Kd,Ld+" $1");a=a.replace(Md,function(a,e,g){d||(a=Nd(g,e,b,c),d=d||a.stop,e=a.ta,g=a.value);return e+g});e&&(a=Id(a));return a};
+function Nd(a,b,c,d){var e=a.indexOf(Od);0<=a.indexOf(Ld)?a=Pd(a,d):0!==e&&(a=c?Qd(a,c):a);c=!1;0<=e&&(b="",c=!0);if(c){var f=!0;c&&(a=a.replace(Rd,function(a,b){return" > "+b}))}a=a.replace(Sd,function(a,b,c){return'[dir="'+c+'"] '+b+", "+b+'[dir="'+c+'"]'});return{value:a,ta:b,stop:f}}function Qd(a,b){a=a.split(Td);a[0]+=b;return a.join(Td)}
+function Pd(a,b){var c=a.match(Ud);return(c=c&&c[2].trim()||"")?c[0].match(Vd)?a.replace(Ud,function(a,c,f){return b+f}):c.split(Vd)[0]===b?c:Wd:a.replace(Ld,b)}function Xd(a){a.selector===Yd&&(a.selector="html")}ud.prototype.c=function(a){return a.match(Od)?this.b(a,Zd):Qd(a.trim(),Zd)};q.Object.defineProperties(ud.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"style-scope"}}});
+var Jd=/:(nth[-\w]+)\(([^)]+)\)/,Zd=":not(.style-scope)",Hd=",",Md=/(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=[])+)/g,Vd=/[[.:#*]/,Ld=":host",Yd=":root",Od="::slotted",Kd=new RegExp("^("+Od+")"),Ud=/(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Rd=/(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Sd=/(.*):dir\((?:(ltr|rtl))\)/,Fd=".",Td=":",Bd="class",Wd="should_not_match",V=new ud;function $d(a,b,c,d){this.u=a||null;this.b=b||null;this.X=c||[];this.D=null;this.I=d||"";this.a=this.l=this.w=null}function W(a){return a?a.__styleInfo:null}function ae(a,b){return a.__styleInfo=b}$d.prototype.c=function(){return this.u};$d.prototype._getStyleRules=$d.prototype.c;function be(a){var b=this.matches||this.matchesSelector||this.mozMatchesSelector||this.msMatchesSelector||this.oMatchesSelector||this.webkitMatchesSelector;return b&&b.call(this,a)}var ce=navigator.userAgent.match("Trident");function de(){}function ee(a){var b={},c=[],d=0;R(a,function(a){fe(a);a.index=d++;a=a.h.cssText;for(var c;c=jd.exec(a);){var e=c[1];":"!==c[2]&&(b[e]=!0)}},function(a){c.push(a)});a.b=c;a=[];for(var e in b)a.push(e);return a}
+function fe(a){if(!a.h){var b={},c={};ge(a,c)&&(b.s=c,a.rules=null);b.cssText=a.parsedCssText.replace(md,"").replace(hd,"");a.h=b}}function ge(a,b){var c=a.h;if(c){if(c.s)return Object.assign(b,c.s),!0}else{c=a.parsedCssText;for(var d;a=hd.exec(c);){d=(a[2]||a[3]).trim();if("inherit"!==d||"unset"!==d)b[a[1].trim()]=d;d=!0}return d}}
+function he(a,b,c){b&&(b=0<=b.indexOf(";")?ie(a,b,c):sd(b,function(b,e,f,h){if(!e)return b+h;(e=he(a,c[e],c))&&"initial"!==e?"apply-shim-inherit"===e&&(e="inherit"):e=he(a,c[f]||f,c)||f;return b+(e||"")+h}));return b&&b.trim()||""}
+function ie(a,b,c){b=b.split(";");for(var d=0,e,f;d<b.length;d++)if(e=b[d]){id.lastIndex=0;if(f=id.exec(e))e=he(a,c[f[1]],c);else if(f=e.indexOf(":"),-1!==f){var h=e.substring(f);h=h.trim();h=he(a,h,c)||h;e=e.substring(0,f)+h}b[d]=e&&e.lastIndexOf(";")===e.length-1?e.slice(0,-1):e||""}return b.join(";")}
+function je(a,b){var c={},d=[];R(a,function(a){a.h||fe(a);var e=a.j||a.parsedSelector;b&&a.h.s&&e&&be.call(b,e)&&(ge(a,c),a=a.index,e=parseInt(a/32,10),d[e]=(d[e]||0)|1<<a%32)},null,!0);return{s:c,key:d}}
+function ke(a,b,c,d){b.h||fe(b);if(b.h.s){var e=U(a);a=e.is;e=e.I;e=a?Ed(a,e):"html";var f=b.parsedSelector,h=":host > *"===f||"html"===f,g=0===f.indexOf(":host")&&!h;"shady"===c&&(h=f===e+" > *."+e||-1!==f.indexOf("html"),g=!h&&0===f.indexOf(e));"shadow"===c&&(h=":host > *"===f||"html"===f,g=g&&!h);if(h||g)c=e,g&&(b.j||(b.j=Gd(V,b,V.b,a?Fd+a:"",e)),c=b.j||e),d({Fa:c,za:g,Wa:h})}}
+function le(a,b){var c={},d={},e=b&&b.__cssBuild;R(b,function(b){ke(a,b,e,function(e){be.call(a.i||a,e.Fa)&&(e.za?ge(b,c):ge(b,d))})},null,!0);return{Ea:d,xa:c}}
+function me(a,b,c,d){var e=U(b),f=Ed(e.is,e.I),h=new RegExp("(?:^|[^.#[:])"+(b.extends?"\\"+f.slice(0,-1)+"\\]":f)+"($|[.:[\\s>+~])");e=W(b).u;var g=ne(e,d);return Cd(b,e,function(b){var e="";b.h||fe(b);b.h.cssText&&(e=ie(a,b.h.cssText,c));b.cssText=e;if(!O&&!pd(b)&&b.cssText){var k=e=b.cssText;null==b.ba&&(b.ba=kd.test(e));if(b.ba)if(null==b.O){b.O=[];for(var p in g)k=g[p],k=k(e),e!==k&&(e=k,b.O.push(p))}else{for(p=0;p<b.O.length;++p)k=g[b.O[p]],e=k(e);k=e}b.cssText=k;b.j=b.j||b.selector;e="."+d;
+p=b.j.split(",");k=0;for(var x=p.length,B;k<x&&(B=p[k]);k++)p[k]=B.match(h)?B.replace(f,e):e+" "+B;b.selector=p.join(",")}})}function ne(a,b){a=a.b;var c={};if(!O&&a)for(var d=0,e=a[d];d<a.length;e=a[++d]){var f=e,h=b;f.i=new RegExp("\\b"+f.keyframesName+"(?!\\B|-)","g");f.a=f.keyframesName+"-"+h;f.j=f.j||f.selector;f.selector=f.j.replace(f.keyframesName,f.a);c[e.keyframesName]=oe(e)}return c}function oe(a){return function(b){return b.replace(a.i,a.a)}}
+function pe(a,b){var c=qe,d=od(a);a.textContent=Q(d,function(a){var d=a.cssText=a.parsedCssText;a.h&&a.h.cssText&&(d=d.replace(bd,"").replace(cd,""),a.cssText=ie(c,d,b))})}q.Object.defineProperties(de.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"x-scope"}}});var qe=new de;var re={},se=window.customElements;if(se&&!O){var te=se.define;se.define=function(a,b,c){var d=document.createComment(" Shady DOM styles for "+a+" "),e=document.head;e.insertBefore(d,(S?S.nextSibling:null)||e.firstChild);S=d;re[a]=d;te.call(se,a,b,c)}};function ue(){this.cache={}}ue.prototype.store=function(a,b,c,d){var e=this.cache[a]||[];e.push({s:b,styleElement:c,l:d});100<e.length&&e.shift();this.cache[a]=e};ue.prototype.fetch=function(a,b,c){if(a=this.cache[a])for(var d=a.length-1;0<=d;d--){var e=a[d],f;a:{for(f=0;f<c.length;f++){var h=c[f];if(e.s[h]!==b[h]){f=!1;break a}}f=!0}if(f)return e}};function ve(){}
+function we(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.target!==document.documentElement&&c.target!==document.head)for(var d=0;d<c.addedNodes.length;d++){var e=c.addedNodes[d];if(e.nodeType===Node.ELEMENT_NODE){var f=e.getRootNode();var h=e;var g=[];h.classList?g=Array.from(h.classList):h instanceof window.SVGElement&&h.hasAttribute("class")&&(g=h.getAttribute("class").split(/\s+/));h=g;g=h.indexOf(V.a);if((h=-1<g?h[g+1]:"")&&f===e.ownerDocument)yd(e,h,!0);else if(f.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&
+(f=f.host))if(f=U(f).is,h===f)for(e=window.ShadyDOM.nativeMethods.querySelectorAll.call(e,":not(."+V.a+")"),f=0;f<e.length;f++)Ad(e[f],h);else h&&yd(e,h,!0),yd(e,f)}}}}
+if(!O){var xe=new MutationObserver(we),ye=function(a){xe.observe(a,{childList:!0,subtree:!0})};if(window.customElements&&!window.customElements.polyfillWrapFlushCallback)ye(document);else{var ze=function(){ye(document.body)};window.HTMLImports?window.HTMLImports.whenReady(ze):requestAnimationFrame(function(){if("loading"===document.readyState){var a=function(){ze();document.removeEventListener("readystatechange",a)};document.addEventListener("readystatechange",a)}else ze()})}ve=function(){we(xe.takeRecords())}}
+var Ae=ve;var Be={};var Ce=Promise.resolve();function De(a){if(a=Be[a])a._applyShimCurrentVersion=a._applyShimCurrentVersion||0,a._applyShimValidatingVersion=a._applyShimValidatingVersion||0,a._applyShimNextVersion=(a._applyShimNextVersion||0)+1}function Ee(a){return a._applyShimCurrentVersion===a._applyShimNextVersion}function Fe(a){a._applyShimValidatingVersion=a._applyShimNextVersion;a.a||(a.a=!0,Ce.then(function(){a._applyShimCurrentVersion=a._applyShimNextVersion;a.a=!1}))};var Ge=null,He=window.HTMLImports&&window.HTMLImports.whenReady||null,Ie;function Je(a){requestAnimationFrame(function(){He?He(a):(Ge||(Ge=new Promise(function(a){Ie=a}),"complete"===document.readyState?Ie():document.addEventListener("readystatechange",function(){"complete"===document.readyState&&Ie()})),Ge.then(function(){a&&a()}))})};var Ke=new ue;function X(){var a=this;this.F={};this.c=document.documentElement;var b=new Pc;b.rules=[];this.i=ae(this.c,new $d(b));this.B=!1;this.b=this.a=null;Je(function(){Y(a)})}n=X.prototype;n.ia=function(){Ae()};n.va=function(a){return od(a)};n.Ha=function(a){return Q(a)};
+n.prepareTemplate=function(a,b,c){if(!a.b){a.b=!0;a.name=b;a.extends=c;Be[b]=a;var d=(d=a.content.querySelector("style"))?d.getAttribute("css-build")||"":"";var e=[];for(var f=a.content.querySelectorAll("style"),h=0;h<f.length;h++){var g=f[h];if(g.hasAttribute("shady-unscoped")){if(!O){var k=g.textContent;nd.has(k)||(nd.add(k),k=g.cloneNode(!0),document.head.appendChild(k));g.parentNode.removeChild(g)}}else e.push(g.textContent),g.parentNode.removeChild(g)}e=e.join("").trim();c={is:b,extends:c,La:d};
+O||yd(a.content,b);Y(this);f=id.test(e)||hd.test(e);id.lastIndex=0;hd.lastIndex=0;e=Qc(e);f&&P&&this.a&&this.a.transformRules(e,b);a._styleAst=e;a.c=d;d=[];P||(d=ee(a._styleAst));if(!d.length||P)e=O?a.content:null,b=re[b],f=Cd(c,a._styleAst),b=f.length?qd(f,c.is,e,b):void 0,a.aa=b;a.qa=d}};
+function Le(a){!a.b&&window.ShadyCSS&&window.ShadyCSS.CustomStyleInterface&&(a.b=window.ShadyCSS.CustomStyleInterface,a.b.transformCallback=function(b){a.ga(b)},a.b.validateCallback=function(){requestAnimationFrame(function(){(a.b.enqueued||a.B)&&a.A()})})}function Y(a){!a.a&&window.ShadyCSS&&window.ShadyCSS.ApplyShim&&(a.a=window.ShadyCSS.ApplyShim,a.a.invalidCallback=De);Le(a)}
+n.A=function(){Y(this);if(this.b){var a=this.b.processStyles();if(this.b.enqueued){if(P)for(var b=0;b<a.length;b++){var c=this.b.getStyleForCustomStyle(a[b]);if(c&&P&&this.a){var d=od(c);Y(this);this.a.transformRules(d);c.textContent=Q(d)}}else for(Me(this,this.c,this.i),b=0;b<a.length;b++)(c=this.b.getStyleForCustomStyle(a[b]))&&pe(c,this.i.w);this.b.enqueued=!1;this.B&&!P&&this.styleDocument()}}};
+n.styleElement=function(a,b){var c=U(a).is,d=W(a);if(!d){var e=U(a);d=e.is;e=e.I;var f=re[d];d=Be[d];if(d){var h=d._styleAst;var g=d.qa}d=ae(a,new $d(h,f,g,e))}a!==this.c&&(this.B=!0);b&&(d.D=d.D||{},Object.assign(d.D,b));if(P){if(d.D){b=d.D;for(var k in b)null===k?a.style.removeProperty(k):a.style.setProperty(k,b[k])}if(((k=Be[c])||a===this.c)&&k&&k.aa&&!Ee(k)){if(Ee(k)||k._applyShimValidatingVersion!==k._applyShimNextVersion)Y(this),this.a&&this.a.transformRules(k._styleAst,c),k.aa.textContent=
+Cd(a,d.u),Fe(k);O&&(c=a.shadowRoot)&&(c.querySelector("style").textContent=Cd(a,d.u));d.u=k._styleAst}}else if(Me(this,a,d),d.X&&d.X.length){c=d;k=U(a).is;d=(b=Ke.fetch(k,c.w,c.X))?b.styleElement:null;h=c.l;(g=b&&b.l)||(g=this.F[k]=(this.F[k]||0)+1,g=k+"-"+g);c.l=g;g=c.l;e=qe;e=d?d.textContent||"":me(e,a,c.w,g);f=W(a);var l=f.a;l&&!O&&l!==d&&(l._useCount--,0>=l._useCount&&l.parentNode&&l.parentNode.removeChild(l));O?f.a?(f.a.textContent=e,d=f.a):e&&(d=qd(e,g,a.shadowRoot,f.b)):d?d.parentNode||(ce&&
+-1<e.indexOf("@media")&&(d.textContent=e),rd(d,null,f.b)):e&&(d=qd(e,g,null,f.b));d&&(d._useCount=d._useCount||0,f.a!=d&&d._useCount++,f.a=d);g=d;O||(d=c.l,f=e=a.getAttribute("class")||"",h&&(f=e.replace(new RegExp("\\s*x-scope\\s*"+h+"\\s*","g")," ")),f+=(f?" ":"")+"x-scope "+d,e!==f&&td(a,f));b||Ke.store(k,c.w,g,c.l)}};function Ne(a,b){return(b=b.getRootNode().host)?W(b)?b:Ne(a,b):a.c}
+function Me(a,b,c){a=Ne(a,b);var d=W(a);a=Object.create(d.w||null);var e=le(b,c.u);b=je(d.u,b).s;Object.assign(a,e.xa,b,e.Ea);b=c.D;for(var f in b)if((e=b[f])||0===e)a[f]=e;f=qe;b=Object.getOwnPropertyNames(a);for(e=0;e<b.length;e++)d=b[e],a[d]=he(f,a[d],a);c.w=a}n.styleDocument=function(a){this.styleSubtree(this.c,a)};
+n.styleSubtree=function(a,b){var c=a.shadowRoot;(c||a===this.c)&&this.styleElement(a,b);if(b=c&&(c.children||c.childNodes))for(a=0;a<b.length;a++)this.styleSubtree(b[a]);else if(a=a.children||a.childNodes)for(b=0;b<a.length;b++)this.styleSubtree(a[b])};n.ga=function(a){var b=this,c=od(a);R(c,function(a){if(O)Xd(a);else{var c=V;a.selector=a.parsedSelector;Xd(a);a.selector=a.j=Gd(c,a,c.c,void 0,void 0)}P&&(Y(b),b.a&&b.a.transformRule(a))});P?a.textContent=Q(c):this.i.u.rules.push(c)};
+n.getComputedStyleValue=function(a,b){var c;P||(c=(W(a)||W(Ne(this,a))).w[b]);return(c=c||window.getComputedStyle(a).getPropertyValue(b))?c.trim():""};n.Ga=function(a,b){var c=a.getRootNode();b=b?b.split(/\s/):[];c=c.host&&c.host.localName;if(!c){var d=a.getAttribute("class");if(d){d=d.split(/\s/);for(var e=0;e<d.length;e++)if(d[e]===V.a){c=d[e+1];break}}}c&&b.push(V.a,c);P||(c=W(a))&&c.l&&b.push(qe.a,c.l);td(a,b.join(" "))};n.ra=function(a){return W(a)};X.prototype.flush=X.prototype.ia;
+X.prototype.prepareTemplate=X.prototype.prepareTemplate;X.prototype.styleElement=X.prototype.styleElement;X.prototype.styleDocument=X.prototype.styleDocument;X.prototype.styleSubtree=X.prototype.styleSubtree;X.prototype.getComputedStyleValue=X.prototype.getComputedStyleValue;X.prototype.setElementClass=X.prototype.Ga;X.prototype._styleInfoForNode=X.prototype.ra;X.prototype.transformCustomStyleForDocument=X.prototype.ga;X.prototype.getStyleAst=X.prototype.va;X.prototype.styleAstToString=X.prototype.Ha;
+X.prototype.flushCustomStyles=X.prototype.A;Object.defineProperties(X.prototype,{nativeShadow:{get:function(){return O}},nativeCss:{get:function(){return P}}});var Z=new X,Oe,Pe;window.ShadyCSS&&(Oe=window.ShadyCSS.ApplyShim,Pe=window.ShadyCSS.CustomStyleInterface);window.ShadyCSS={ScopingShim:Z,prepareTemplate:function(a,b,c){Z.A();Z.prepareTemplate(a,b,c)},styleSubtree:function(a,b){Z.A();Z.styleSubtree(a,b)},styleElement:function(a){Z.A();Z.styleElement(a)},styleDocument:function(a){Z.A();Z.styleDocument(a)},getComputedStyleValue:function(a,b){return Z.getComputedStyleValue(a,b)},nativeCss:P,nativeShadow:O};Oe&&(window.ShadyCSS.ApplyShim=Oe);
+Pe&&(window.ShadyCSS.CustomStyleInterface=Pe);/*
+
+ Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ Code distributed by Google as part of the polymer project is also
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+var Qe=window.customElements,Re=window.HTMLImports,Se=window.HTMLTemplateElement;window.WebComponents=window.WebComponents||{};if(Qe&&Qe.polyfillWrapFlushCallback){var Te,Ue=function(){if(Te){Se.sa&&Se.sa(window.document);var a=Te;Te=null;a();return!0}},Ve=Re.whenReady;Qe.polyfillWrapFlushCallback(function(a){Te=a;Ve(Ue)});Re.whenReady=function(a){Ve(function(){Ue()?Re.whenReady(a):a()})}}
+Re.whenReady(function(){requestAnimationFrame(function(){window.WebComponents.ready=!0;document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})});var We=document.createElement("style");We.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var Xe=document.querySelector("head");Xe.insertBefore(We,Xe.firstChild);/*
+
+Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+}).call(this);
+
+//# sourceMappingURL=webcomponents-hi-sd.js.map
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-sd.js.map b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-sd.js.map
new file mode 100644
index 00000000000..baf6aff42aa
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi-sd.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["node_modules/@webcomponents/html-imports/src/html-imports.js"," [synthetic:util/global] "," [synthetic:util/defineproperty] "," [synthetic:es6/symbol] "," [synthetic:es6/util/makeiterator] "," [synthetic:es6/util/arrayfromiterator] ","node_modules/@webcomponents/shadydom/src/shady-data.js","node_modules/@webcomponents/shadydom/src/utils.js","node_modules/@webcomponents/shadydom/src/flush.js","node_modules/@webcomponents/shadydom/src/observe-changes.js","node_modules/@webcomponents/shadydom/src/native-methods.js","node_modules/@webcomponents/shadydom/src/innerHTML.js","node_modules/@webcomponents/shadydom/src/native-tree-walker.js","node_modules/@webcomponents/shadydom/src/native-tree-accessors.js","node_modules/@webcomponents/shadydom/src/native-tree.js","node_modules/@webcomponents/shadydom/src/patch-accessors.js","node_modules/@webcomponents/shadydom/src/attach-shadow.js","node_modules/@webcomponents/shadydom/src/patch-builtins.js","node_modules/@webcomponents/shadydom/src/logical-tree.js","node_modules/@webcomponents/shadydom/src/logical-mutation.js"," [synthetic:es6/util/arrayfromiterable] ","node_modules/@webcomponents/shadydom/src/patch-events.js","node_modules/@webcomponents/shadydom/src/array-splice.js","node_modules/@webcomponents/shadydom/src/shadydom.js","node_modules/@webcomponents/shadycss/src/css-parse.js","node_modules/@webcomponents/shadycss/src/style-settings.js","node_modules/@webcomponents/shadycss/src/common-regex.js","node_modules/@webcomponents/shadycss/src/unscoped-style-handler.js","node_modules/@webcomponents/shadycss/src/style-util.js","node_modules/@webcomponents/shadycss/src/style-transformer.js","node_modules/@webcomponents/shadycss/src/style-info.js","node_modules/@webcomponents/shadycss/src/style-properties.js","node_modules/@webcomponents/shadycss/src/style-placeholder.js","node_modules/@webcomponents/shadycss/src/style-cache.js","node_modules/@webcomponents/shadycss/src/document-watcher.js","node_modules/@webcomponents/shadycss/src/template-map.js","node_modules/@webcomponents/shadycss/src/apply-shim-utils.js","node_modules/@webcomponents/shadycss/src/document-wait.js","node_modules/@webcomponents/shadycss/src/scoping-shim.js","node_modules/@webcomponents/shadycss/src/common-utils.js","node_modules/@webcomponents/shadycss/entrypoints/scoping-shim.js","src/post-polyfill.js","src/unresolved.js"],"names":["$jscomp.global","$jscomp.defineProperty","$jscomp.initSymbol","$jscomp.Symbol","$jscomp.SYMBOL_PREFIX","$jscomp.arrayIterator","$jscomp.initSymbolIterator","$jscomp.iteratorPrototype","scope","newCustomEvent","type","params","window","CustomEvent","event","document","createEvent","initCustomEvent","bubbles","cancelable","detail","importForElement","element","useNative","ownerDocument","doc","parentNode","closest","importSelector","isImportLink","whenImportsReady","callback","imports","QSA","rootImportSelector","pending","length","forEach","imp","whenElementLoaded","whenDocumentReady","stateChanged","readyState","body","removeEventListener","addEventListener","whenReady","localName","src","firstChild","onLoadingDone","isIE","node","nodeType","Node","ELEMENT_NODE","rel","constructor","Importer","documents","inflight","dynamicImportsMO","MutationObserver","m","handleMutations","observe","head","childList","subtree","loadImports","replaceScripts","fragment","template","content","scriptsSelector","script","clone","createElement","attributes","attr","setAttribute","name","value","textContent","replaceChild","selector","childNodes","querySelectorAll","emptyNodeList","list","inverseOrder","increment","i","link","currentScript","Object","defineProperty","get","scripts","configurable","CSS_URL_REGEXP","CSS_IMPORT_REGEXP","STYLESHEET_REGEXP","Path","fixUrls","base","href","resolveUrl","getAttribute","r","replaceUrls","text","linkUrl","regexp","replace","pre","url","post","urlPath","undefined","__workingURL","u","URL","pathname","e","__tempDoc","implementation","createHTMLDocument","__base","appendChild","__anchor","Xhr","async","load","success","fail","match","pieces","split","resource","header","indexOf","atob","decodeURIComponent","request","XMLHttpRequest","open","onload","request.onload","redirectedUrl","responseURL","getResponseHeader","location","origin","protocol","host","response","responseText","status","send","test","navigator","userAgent","links","loadImport","fireEventIfNeeded","makeDocument","processImportsIfLoadingDone","createDocumentFragment","p1","p2","innerHTML","baseEl","querySelector","removeAttribute","n$","importDependenciesSelector","inlineScriptIndex","n","importDependencyAttr","encodeURIComponent","num","disconnect","flatten","scriptsOk","stylesOk","fireEvents","waitForStyles","runScripts","DOCUMENT_FRAGMENT_NODE","cloneScript","l","s","s$","pendingScriptsSelector","pendingStylesSelector","needsMove","disabledLinkSelector","placeholder","insertBefore","nextSibling","newSibling","import","dispatchEvent","eventType","mutations","addedNodes","elem","importer","imps","target","native_baseURI","getOwnPropertyDescriptor","prototype","klass","Element","ownerDoc","call","enumerable","HTMLLinkElement","HTMLImports","ShadyData","publicRoot","root","dirty","flattenedNodes","_prevAssignedSlot","_previouslyAssignedNodes","assignedSlot","assignedNodes","observer","previousSibling","lastChild","ownerShadyRoot","__insideAccessors","__outsideAccessors","toJSON","ensureShadyDataForNode","__shady","shadyDataForNode","settings","hasNativeShadowDOM","attachShadow","getRootNode","desc","hasDescriptors","inUse","IS_IE","IS_EDGE","useNativeAccessors","isTrackingLogicalChildNodes","nodeData","isShadyRoot","obj","_localName","ownerShadyRootForNode","p","matches","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","extend","source","getOwnPropertyNames","pd","extendAll","sources","mixin","twiddle","createTextNode","queue","shift","characterData","microtask","push","hasDocumentContains","contains","container","flushList","scheduled","enqueue","flush","didFlush","AsyncObserver","_scheduled","removedNodes","callbacks","Set","schedule","takeRecords","cb","observeChildren","sd","add","_callback","_observer","_node","unobserveChildren","handle","delete","size","filterMutations","targetRootNode","map","mutation","mutationInScope","nodes","Array","from","filter","create","removeChild","cloneNode","importNode","Document","windowAddEventListener","Window","windowRemoveEventListener","HTMLElement","getElementById","elementQuerySelector","fragmentQuerySelector","DocumentFragment","documentQuerySelector","elementQuerySelectorAll","fragmentQuerySelectorAll","documentQuerySelectorAll","DOCUMENT_NODE","escapeAttrRegExp","escapeDataRegExp","escapeReplace","c","makeSet","arr","set","voidElements","plaintextParents","getInnerHTML","c$","child","tagName","attrs","TEXT_NODE","data","COMMENT_NODE","console","error","Error","nodeWalker","createTreeWalker","NodeFilter","SHOW_ALL","elementWalker","SHOW_ELEMENT","currentNode","parentElement","firstElementChild","lastElementChild","previousElementSibling","nextElementSibling","children","textWalker","SHOW_TEXT","nextNode","nodeValue","nativeProtos","findNodeDescriptor","proto","hasOwnProperty","nodeAccessors","fragmentAccessors","documentAccessors","slice","accessors","nativeTreeAccessors","nativeTreeWalker","clearNode","inertDoc","nativeIsConnectedAccessors","nativeIsConnected","nativeActiveElementDescriptor","OutsideAccessors","ClassNameAccessor","className","InsideAccessors","item","childNodes.item","index","childElementCount","tc","cn","join","nativeAccessors","children.item","containerName","htmlContainer","ShadowRootAccessor","shadowRoot","ActiveElementAccessor","activeElement","active","nativeContains","activeRoot","patchAccessorGroup","descriptors","force","objDesc","warn","patchAccessors","patchShadowRootAccessors","ShadyRoot","__proto__","defineProperties","nodeName","prop","patchOutsideElementAccessors","patchInsideElementAccessors","linkNode","ref_node","containerData","ref_nodeData","psd","nsd","recordChildNodes","parent","refData","ownerRoot","slotsAdded","slots","_ensureSlotData","_pendingSlots","_slotList","_slotMap","$jscomp.arrayFromIterator","$jscomp.makeIterator","_asyncRender","resetTo","parentData","hasShadowRootWithSlot","preventNativeInsert","firstComposedNode","nativeMethods","scheduleObserver","preventNativeRemove","removeOwnerShadyRoot","changeSlotContent","_validateSlots","slot","splice","x","didRemove","removingInsertionPoint","composed","flattened","_hasInsertionPoint","distributeAttributeChange","oldName","__slotName","_nameForSlot","_sortSlots","addedNode","removedNode","documentElement","query","matcher","halter","queryElements","elements","result","scopingShim","deep","nc","eventWrappersName","Date","now","alwaysComposed","pathComposer","startNode","composedPath","current","startRoot","retarget","refNode","path","refNodePath","ancestor","lastRoot","rootIdx","eventMixin","isTrusted","__composed","__composedPath","currentTarget","relatedTarget","__relatedTarget","__relatedTargetComposedPath","stopPropagation","Event","__propagationStopped","stopImmediatePropagation","__immediatePropagationStopped","mixinComposedFlag","Base","klazz","options","nonBubblingEventsToRetarget","hasRetargeted","fireHandlers","phase","hs","__handlers","fn","retargetNonBubblingEvent","AT_TARGET","lastFiredRoot","findListener","wrappers","capture","once","passive","savedType","savedListener","savedCapture","savedOnce","savedPassive","savedNode","fnOrObj","optionsOrCapture","handlerType","handleEvent","__shadyTarget","wrapperFn","patchEvent","lastCurrentTargetDesc","eventPhase","BUBBLING_PHASE","CAPTURING_PHASE","ret","ael","idx","activateFocusEventOverrides","ev","getPrototypeOf","patchProto","__sourceProto","PatchedEvent","PatchedCustomEvent","PatchedMouseEvent","MouseEvent","newSplice","addedCount","removed","calcSplices","currentEnd","old","oldEnd","currentStart","oldStart","prefixCount","suffixCount","minLength","Math","min","currentValue","previousValue","index1","index2","count","equals","rowCount","columnCount","distances","j","north","west","edits","EDIT_ADD","EDIT_DELETE","northWest","EDIT_LEAVE","EDIT_UPDATE","reverse","splices","oldIndex","ShadyRootConstructionToken","ancestorList","ancestors","unshift","token","TypeError","SHADYROOT_NAME","_mode","mode","hostData","MODE_CLOSED","rootData","_renderPending","_render","renderRoot","_distribute","slotData","_distributeNodeToSlot","slotParentRoot","slotParentData","_addAssignedToFlattenedNodes","prevAssignedNodes","_fireSlotChange","_compose","composeList","targetNode","distributedNode","d","next","forcedSlot","oldSlot","CATCHALL_NAME","assigned","nestedAssigned","slotNamesToSort","_mapSlots","sort","a","b","listA","listB","nA","nB","getAssignedSlot","windowMixin","bind","nodeMixin","IsConnectedAccessor","isConnected","textMixin","fragmentMixin","o","slotMixin","elementMixin","documentMixin","id","nativeBlur","blur","htmlElementMixin","shadowActive","shadowRootMixin","patchBuiltin","ShadyDOM","patch","nativeHTMLElement","Text","HTMLSlotElement","ShadowRoot","StyleNode","parse","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.comments","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.port","parseCss","OPEN_BRACE","previous","CLOSE_BRACE","t","substring","trim","ss","_expandUnicodeEscapes","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.multipleSpaces","lastIndexOf","AT_START","MEDIA_START","types$$module$node_modules$$webcomponents$shadycss$src$css_parse.MEDIA_RULE","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.keyframesRule","types$$module$node_modules$$webcomponents$shadycss$src$css_parse.KEYFRAMES_RULE","pop","VAR_START","types$$module$node_modules$$webcomponents$shadycss$src$css_parse.MIXIN_RULE","types$$module$node_modules$$webcomponents$shadycss$src$css_parse.STYLE_RULE","r$","code","repeat","stringify","preserveProperties","cssText","rules","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.customProp","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.mixinProp","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.mixinApply","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.varApply","STYLE_RULE","KEYFRAMES_RULE","MEDIA_RULE","MIXIN_RULE","comments","port","customProp","mixinProp","mixinApply","varApply","keyframesRule","multipleSpaces","nativeShadow","nativeCssVariables_","calcCssVariables","CSS","supports","ShadyCSS","nativeCss","nativeCssVariables","VAR_ASSIGN","MIXIN_MATCH","VAR_CONSUMED","ANIMATION_MATCH","MEDIA_MATCH","BRACKETED","styleTextSet","toCssText","forEachRule","rulesForStyle","style","isKeyframesSelector","rule","styleRuleCallback","keyframesRuleCallback","onlyActiveRules","skipRules","matchMedia","applyCss","moniker","contextNode","applyStyle","lastHeadApplyNode","compareDocumentPosition","position","DOCUMENT_POSITION_PRECEDING","processVariableAndFallback","str","start","level","inner","end","prefix","suffix","comma","fallback","setElementClassRaw","getIsExtends","typeExtension","is","extends","StyleTransformer","dom","shouldRemoveScope","$jscompDefaultExport","_transformDom","_content","classList","remove","SCOPE_NAME","CLASS","newValue","elementStyles","styleRules","cssBuildType","css","ext","hostScope","_calcHostScope","CSS_CLASS_PREFIX","isScoped","transformedSelector","_transformRuleCss","self","_transformComplexSelector","transformer","p$","COMPLEX_SELECTOR_SEP","_twiddleNthPlus","NTH","inside","stop","isNth","SLOTTED_START","HOST","SIMPLE_SELECTOR_SEP","info","_transformCompoundSelector","combinator","slottedIndex","SLOTTED","_transformHostSelector","_transformSimpleSelector","slotted","SLOTTED_PAREN","paren","DIR_PAREN","before","dir","PSEUDO_PREFIX","HOST_PAREN","SIMPLE_SELECTOR_PREFIX","typeSelector","SELECTOR_NO_MATCH","normalizeRootSelector","ROOT","_transformDocumentSelector","SCOPE_DOC_SELECTOR","$jscomp.global.Object.defineProperties","RegExp","StyleInfo","ast","ownStylePropertyNames","overrideStyleProperties","customStyle","scopeSelector","styleProperties","styleInfo","_getStyleRules","method","StyleProperties","decorateStyles","props","keyframes","ruleIndex","decorateRule","propertyInfo","exec","onKeyframesRule","_keyframes","names","properties","collectProperties","hasProperties","assign","any","valueForProperty","property","valueForProperties","propertyValue","parts","lastIndex","colon","pp","propertyDataFromStyles","selectorToMatch","parseInt","key","whenHostOrRootRule","cssBuild","parsedSelector","isRoot","isHost","hostAndRootPropertiesForScope","hostProps","rootProps","_element","transformStyles","hostSelector","hostRx","HOST_PREFIX","rxHostSelector","HOST_SUFFIX","StyleInfo$$module$node_modules$$webcomponents$shadycss$src$style_info.get","keyframeTransforms","_elementKeyframeTransforms","output","input","hasAnimations","keyframeNamesToTransform","keyframe","transform","keyframesRules","keyframesNameRx","transformedKeyframesName","scopeId","_keyframesRuleTransformer","applyCustomStyle","XSCOPE_NAME","placeholderMap","ce","origDefine","wrappedDefine","clazz","placeHolder","createComment","after","StyleCache","cache","store","tagname","styleElement","typeMax","fetch","ownPropertyNames","entry","pn","handler","mxns","mxn","classes","hasAttribute","currentScope","newScope","unscoped","delayedStart","requestAnimationFrame","listener","module$node_modules$$webcomponents$shadycss$src$document_watcher.flush","templateMap","promise","Promise","resolve","invalidate","elementName","templateIsValid","startValidatingTemplate","_validating","then","readyPromise","resolveFn","documentWait","styleCache","ScopingShim","_scopeCounter","_documentOwner","_documentOwnerStyleInfo","StyleInfo$$module$node_modules$$webcomponents$shadycss$src$style_info.set","_elementsHaveApplied","_customStyleInterface","_applyShim","_ensure","ScopingShim$$module$node_modules$$webcomponents$shadycss$src$scoping_shim.prototype","?.prototype","ScopingShim$$module$node_modules$$webcomponents$shadycss$src$scoping_shim_prototype$flush","getStyleAst","styleAstToString","prepareTemplate","_prepared","styleTextParts","styles","scopingAttribute","has","newStyle","__cssBuild","_cssBuild","shadowroot","_style","_ownPropertyNames","_ensureCustomStyleInterface","CustomStyleInterface","transformCustomStyleForDocument","flushCustomStyles","_ensureApplyShim","ApplyShim","customStyles","_revalidateCustomStyleApplyShim","_updateProperties","_applyCustomStyles","styleDocument","overrideProps","_isRootOwner","removeProperty","setProperty","cachedStyle","cacheEntry","oldScopeSelector","cachedScopeSelector","applyElementStyle","v","_styleOwnerForNode","owner","ownerStyleInfo","hostAndRootProps","propertiesMatchingHost","propertyData","overrides","reify","styleSubtree","shadowChildren","documentRule","_transformRule","getComputedStyleValue","getComputedStyle","getPropertyValue","setElementClass","classString","scopeName","classAttr","k$","_styleInfoForNode","elementExtends","customElements","Template","WebComponents","flushCallback","runAndClearCallback","bootstrap","origWhenReady","ready"],"mappings":"A;;;;;;;;;;;;;;;;;;aASA,IAAA,CAAA,CCkCAA,EAb2B,WAAlB,EAAC,MAAO,OAAR,EAAiC,MAAjC,GAa0B,IAb1B,CAa0B,IAb1B,CAEe,WAAlB,EAAC,MAAO,OAAR,EAA2C,IAA3C,EAAiC,MAAjC,CAAmD,MAAnD,CAW6B,IDlCnC,CE2BAC,GAC4D,UAAxD,EAAsB,MAAO,OAAA,iBAA7B,CACA,MAAA,eADA,CAEA,QAAQ,CAAC,CAAD,CAAS,CAAT,CAAmB,CAAnB,CAA+B,CAOjC,CAAJ,EAAc,KAAA,UAAd,EAAiC,CAAjC,EAA2C,MAAA,UAA3C,GACA,CAAA,CAAO,CAAP,CADA,CACmB,CAAA,MADnB,CAPqC,CCZtB,SAAA,GAAQ,EAAG,CAE9BC,EAAA,CAAqB,QAAQ,EAAG,EAE3BF,EAAA,OAAL,GACEA,CAAA,OADF,CAC6BG,EAD7B,CAJ8B,CAehC,IAAAA,GAAuD,QAAQ,EAAG,CAChE,IAAI,EAAU,CAUd,OAJA,SAAe,CAAC,CAAD,CAAkB,CAC/B,MA9BoBC,gBA8BpB,EAC6B,CAD7B,EACgD,EADhD,EACuD,CAAA,EAFxB,CAP+B,CAAZ,EAoBzB;QAAA,GAAQ,EAAG,CACtCF,EAAA,EACA,KAAI,EAAiBF,CAAA,OAAA,SAChB,EAAL,GACE,CADF,CACmBA,CAAA,OAAA,SADnB,CAEMA,CAAA,OAAA,CAAyB,UAAzB,CAFN,CAK8C,WAA9C,EAAI,MAAO,MAAA,UAAA,CAAgB,CAAhB,CAAX,EACEC,EAAA,CACI,KAAA,UADJ,CACqB,CADrB,CACqC,CAC/B,aAAc,CAAA,CADiB,CAE/B,SAAU,CAAA,CAFqB,CAO/B,MAAO,QAAQ,EAAG,CAChB,MAAOI,GAAA,CAAsB,IAAtB,CADS,CAPa,CADrC,CAeFC,GAAA,CAA6B,QAAQ,EAAG,EAxBF,CAkChB,QAAA,GAAQ,CAAC,CAAD,CAAQ,CACtC,IAAI,EAAQ,CACZ,OAAOC,GAAA,CAA0B,QAAQ,EAAG,CAC1C,MAAI,EAAJ,CAAY,CAAA,OAAZ,CACS,CACL,KAAM,CAAA,CADD,CAEL,MAAO,CAAA,CAAM,CAAA,EAAN,CAFF,CADT,CAMS,CAAC,KAAM,CAAA,CAAP,CAPiC,CAArC,CAF+B,CA0BZ,QAAA,GAAQ,CAAC,CAAD,CAAO,CACzCD,EAAA,EAEI,EAAA,CAAW,CAAC,KAAM,CAAP,CAKf,EAAA,CAASN,CAAA,OAAA,SAAT,CAAA,CAA8C,QAAQ,EAAG,CAAE,MAAO,KAAT,CACzD,OAAyC,EATA,CC5FpB,QAAA,GAAQ,CAAC,CAAD,CAAW,CACxCM,EAAA,EAGA,KAAI,EAAqC,CAAD,CAAW,MAAA,SAAX,CACxC,OAAO,EAAA,CAAmB,CAAA,KAAA,CAAsB,CAAtB,CAAnB,CACHD,EAAA,CAA6C,CAA7C,CANoC;ACEd,QAAA,GAAQ,CAAC,CAAD,CAAW,CAG7C,IAFA,IAAI,CAAJ,CACI,EAAM,EACV,CAAO,CAAC,CAAC,CAAD,CAAK,CAAA,KAAA,EAAL,MAAR,CAAA,CACE,CAAA,KAAA,CAAS,CAAA,MAAT,CAEF,OAAO,EANsC;ALvB9C,SAAA,CAAAG,CAAA,CAAS,CAsqBeC,QAAA,EAAA,CAACC,CAAD,CAAOC,CAAP,CAAkB,CACvC,GAAkC,UAAlC,GAAI,MAAOC,OAAAC,YAAX,CACE,MAAO,KAAIA,WAAJ,CAAgBH,CAAhB,CAAsBC,CAAtB,CAET,KAAMG,EAAqCC,QAAAC,YAAA,CAAqB,aAArB,CAC3CF,EAAAG,gBAAA,CAAsBP,CAAtB,CAA4B,CAAA,CAAQC,CAAAO,QAApC,CAAqD,CAAA,CAAQP,CAAAQ,WAA7D,CAAiFR,CAAAS,OAAjF,CACA,OAAON,EANgC,CAjChBO,QAAA,EAAA,CAAAC,CAAA,CAAW,CAClC,GAAIC,CAAJ,CAEE,MAAOD,EAAAE,cAAA,GAA0BT,QAA1B,CAAqCO,CAAAE,cAArC,CAA6D,IAEtE,KAAIC,EAAMH,CAAA,YACV,IAAI,CAACG,CAAL,EAAYH,CAAAI,WAAZ,CAAgC,CAC9BD,CAAA,CAA+BH,CAAAI,WAC/B,IAA2B,UAA3B,GAAI,MAAOD,EAAAE,QAAX,CAGEF,CAAA,CAAMA,CAAAE,QAAA,CAndWC,kBAmdX,CAHR,KAME,KAAA,CAAO,CAACC,CAAA,CAAaJ,CAAb,CAAR,GAA8BA,CAA9B,CAAoCA,CAAAC,WAApC,EAAA,EAEFJ,CAAA,YAAA,CAAyBG,CAVK,CAYhC,MAAOA,EAlB2B,CApBXK,QAAA,EAAA,CAAAC,CAAA,CAAY,CACnC,IAAIC,EACDC,CAAA,CAAIlB,QAAJ,CAvasBmB,2CAuatB,CADH;AAEIC,EAAUH,CAAAI,OACTD,EAAL,CAIAE,CAAA,CAAQL,CAAR,CAAiB,QAAA,CAAAM,CAAA,CAAO,CAAA,MAAAC,EAAA,CAAkBD,CAAlB,CAAuB,QAAA,EAAM,CACjC,CAAlB,GAAI,EAAEH,CAAN,EACEJ,CAAA,EAFiD,CAA7B,CAAA,CAAxB,CAJA,CACEA,CAAA,EALiC,CAlBXS,QAAA,EAAA,CAAAT,CAAA,CAAY,CACfU,QAAA,EAAA,EAAM,CAGG,SAA5B,GAAI1B,QAAA2B,WAAJ,EAA2C3B,QAAA4B,KAA3C,GACE5B,QAAA6B,oBAAA,CAA6B,kBAA7B,CAAiDH,CAAjD,CACA,CAAAV,CAAA,EAFF,CAHyB,CAQ3BhB,QAAA8B,iBAAA,CAA0B,kBAA1B,CAA8CJ,CAA9C,CACAA,EAAA,EAVoC,CAXpBK,QAAA,EAAA,CAAAf,CAAA,CAAY,CAG5BS,CAAA,CAAkB,QAAA,EAAM,CAAA,MAAAV,EAAA,CAAiB,QAAA,EAAM,CAAA,MAAAC,EAAA,EAAYA,CAAA,EAAZ,CAAvB,CAAA,CAAxB,CAH4B,CAhCJQ,QAAA,EAAA,CAACjB,CAAD,CAAUS,CAAV,CAAuB,CAC/C,GAAIT,CAAA,SAAJ,CACES,CAAA,EAAYA,CAAA,EADd,KAEO,IAA2B,QAA3B,GAAKT,CAAAyB,UAAL,EAAuC,CAACzB,CAAA0B,IAAxC,EACkB,OADlB,GACJ1B,CAAAyB,UADI,EAC6B,CAACzB,CAAA2B,WAD9B,CAIL3B,CAAA,SACA,CADsB,CAAA,CACtB,CAAAS,CAAA,EAAYA,CAAA,EALP,KAMA,CACL,IAAMmB,EAAgBA,QAAA,CAAApC,CAAA,CAAS,CAC7BQ,CAAAsB,oBAAA,CAA4B9B,CAAAJ,KAA5B;AAAwCwC,CAAxC,CACA5B,EAAA,SAAA,CAAsB,CAAA,CACtBS,EAAA,EAAYA,CAAA,EAHiB,CAK/BT,EAAAuB,iBAAA,CAAyB,MAAzB,CAAiCK,CAAjC,CAKKC,GAAL,EAAmC,OAAnC,GAAa7B,CAAAyB,UAAb,EACEzB,CAAAuB,iBAAA,CAAyB,OAAzB,CAAkCK,CAAlC,CAZG,CATwC,CAX5BrB,QAAA,EAAA,CAAAuB,CAAA,CAAQ,CAC3B,MAAOA,EAAAC,SAAP,GAAyBC,IAAAC,aAAzB,EAAiE,MAAjE,GAA8CH,CAAAL,UAA9C,EACmD,QADnD,GACqCK,CAADI,IAFT,CA9U3BC,QADIC,EACO,EAAG,CAAA,IAAA,EAAA,IACZ,KAAAC,EAAA,CAAiB,EAGjB,KAAAC,EAAA,CAAgB,CAChB,KAAAC,EAAA,CAAwB,IAAIC,gBAAJ,CAAqB,QAAA,CAAAC,CAAA,CAAK,CAAA,MAAA,EAAAC,GAAA,CAAqBD,CAArB,CAAA,CAA1B,CAExB,KAAAF,EAAAI,QAAA,CAA8BlD,QAAAmD,KAA9B,CAA6C,CAC3CC,UAAW,CAAA,CADgC,CAE3CC,QAAS,CAAA,CAFkC,CAA7C,CAQA,KAAAC,YAAA,CAAiBtD,QAAjB,CAfY,CApKOuD,QAAA,EAAA,CAACC,CAAD,CAAc,CACnClC,CAAA,CAAQJ,CAAA,CAAIsC,CAAJ,CAAc,UAAd,CAAR,CAAmC,QAAA,CAAAC,CAAA,CAAY,CAC7CnC,CAAA,CAAQJ,CAAA,CAAIuC,CAAAC,QAAJ,CA2IYC,yFA3IZ,CAAR;AAAgD,QAAA,CAAAC,CAAA,CAAU,CACxD,IAAMC,EACH7D,QAAA8D,cAAA,CAAuB,QAAvB,CACHxC,EAAA,CAAQsC,CAAAG,WAAR,CAA2B,QAAA,CAAAC,CAAA,CAAQ,CAAA,MAAAH,EAAAI,aAAA,CAAmBD,CAAAE,KAAnB,CAA8BF,CAAAG,MAA9B,CAAA,CAAnC,CACAN,EAAAO,YAAA,CAAoBR,CAAAQ,YACpBR,EAAAjD,WAAA0D,aAAA,CAA+BR,CAA/B,CAAsCD,CAAtC,CALwD,CAA1D,CAOAL,EAAA,CAAeE,CAAAC,QAAf,CAR6C,CAA/C,CADmC,CAZzBxC,QAAA,EAAA,CAACmB,CAAD,CAAOiC,CAAP,CAAoB,CAG9B,MAAKjC,EAAAkC,WAAAlD,OAAL,CAGOgB,CAAAmC,iBAAA,CAAsBF,CAAtB,CAHP,CACSG,CAJqB,CAdhBnD,QAAA,EAAA,CAACoD,CAAD,CAAO1D,CAAP,CAAiB2D,CAAjB,CAAkC,CAChD,IAAMtD,EAASqD,CAAA,CAAOA,CAAArD,OAAP,CAAqB,CAApC,CACMuD,EAAYD,CAAA,CAAgB,EAAhB,CAAoB,CAEtC,KADIE,CACJ,CADQF,CAAA,CAAetD,CAAf,CAAwB,CAAxB,CAA4B,CACpC,CAAOwD,CAAP,CAAWxD,CAAX,EAA0B,CAA1B,EAAqBwD,CAArB,CAAiCA,CAAjC,EAAqCD,CAArC,CACE5D,CAAA,CAAS0D,CAAA,CAAKG,CAAL,CAAT,CAAkBA,CAAlB,CAL8C,CA1BlD,IAAMC,EAAO9E,QAAA8D,cAAA,CAAuB,MAAvB,CAAb,CACMtD,EAAoB,QAApBA,EAAgCsE,EADtC,CAEML,EAAgBK,CAAAN,iBAAA,CAAsB,GAAtB,CAFtB,CAKIO,GAAgB,IACgB,EAAA,CAApC,GAAI,eAAJ,EAAuB/E,SAAvB,EACEgF,MAAAC,eAAA,CAAsBjF,QAAtB,CAAgC,eAAhC;AAAiD,CAC/C,IAAAkF,QAAG,EAAG,CACJ,MAAOH,GAAP,GAK2B,UAAxB,GAAA/E,QAAA2B,WAAA,CACC3B,QAAAmF,QAAA,CAAiBnF,QAAAmF,QAAA9D,OAAjB,CAA2C,CAA3C,CADD,CACiD,IANpD,CADI,CADyC,CAU/C+D,aAAc,CAAA,CAViC,CAAjD,CA2DF,KAAMC,GAAiB,qBAAvB,CACMC,GAAoB,oCAD1B,CAEMC,GAAoB,iDAF1B,CAMMC,EAAO,CAEX,GAAAC,QAAO,CAAClF,CAAD,CAAUmF,CAAV,CAAgB,CACjBnF,CAAAoF,KAAJ,EACEpF,CAAA0D,aAAA,CAAqB,MAArB,CACEuB,CAAAI,EAAA,CAAgBrF,CAAAsF,aAAA,CAAqB,MAArB,CAAhB,CAA8CH,CAA9C,CADF,CAGEnF,EAAA0B,IAAJ,EACE1B,CAAA0D,aAAA,CAAqB,KAArB,CACEuB,CAAAI,EAAA,CAAgBrF,CAAAsF,aAAA,CAAqB,KAArB,CAAhB,CAA6CH,CAA7C,CADF,CAGF,IAA0B,OAA1B,GAAInF,CAAAyB,UAAJ,CAAmC,CACjC,IAAM8D,EAAIN,CAAAO,GAAA,CAAiBxF,CAAA6D,YAAjB,CAAsCsB,CAAtC,CAA4CL,EAA5C,CACV9E,EAAA6D,YAAA,CAAsBoB,CAAAO,GAAA,CAAiBD,CAAjB,CAAoBJ,CAApB,CAA0BJ,EAA1B,CAFW,CATd,CAFZ,CAiBX,GAAAS,QAAW,CAACC,CAAD,CAAOC,CAAP,CAAgBC,CAAhB,CAAwB,CACjC,MAAOF,EAAAG,QAAA,CAAaD,CAAb;AAAqB,QAAA,CAAClD,CAAD,CAAIoD,CAAJ,CAASC,CAAT,CAAcC,CAAd,CAAuB,CAC7CC,CAAAA,CAAUF,CAAAF,QAAA,CAAY,OAAZ,CAAqB,EAArB,CACVF,EAAJ,GACEM,CADF,CACYf,CAAAI,EAAA,CAAgBW,CAAhB,CAAyBN,CAAzB,CADZ,CAGA,OAAOG,EAAP,CAAa,GAAb,CAAoBG,CAApB,CAA8B,GAA9B,CAAqCD,CALY,CAA5C,CAD0B,CAjBxB,CA2BX,EAAAV,QAAU,CAACS,CAAD,CAAMX,CAAN,CAAY,CAEpB,GAA0Bc,IAAAA,EAA1B,GAAIhB,CAAAiB,EAAJ,CAAqC,CACnCjB,CAAAiB,EAAA,CAAoB,CAAA,CACpB,IAAI,CACF,IAAMC,EAAI,IAAIC,GAAJ,CAAQ,GAAR,CAAa,UAAb,CACVD,EAAAE,SAAA,CAAa,OACbpB,EAAAiB,EAAA,CAAgC,gBAAhC,GAAqBC,CAAAf,KAHnB,CAIF,MAAOkB,EAAP,CAAU,EANuB,CASrC,GAAIrB,CAAAiB,EAAJ,CACE,MAAOd,CAAC,IAAIgB,GAAJ,CAAQN,CAAR,CAAaX,CAAb,CAADC,MAILjF,EAAAA,CAAM8E,CAAAsB,GACLpG,EAAL,GACEA,CAIA,CAJMV,QAAA+G,eAAAC,mBAAA,CAA2C,MAA3C,CAIN,CAHAxB,CAAAsB,GAGA,CAHiBpG,CAGjB,CAFAA,CAAAuG,EAEA,CAFavG,CAAAoD,cAAA,CAAkB,MAAlB,CAEb,CADApD,CAAAyC,KAAA+D,YAAA,CAAqBxG,CAAAuG,EAArB,CACA,CAAAvG,CAAAyG,EAAA,CAAezG,CAAAoD,cAAA,CAAkB,GAAlB,CALjB,CAOApD,EAAAuG,EAAAtB,KAAA,CAAkBD,CAClBhF,EAAAyG,EAAAxB,KAAA,CAAoBU,CACpB,OAAO3F,EAAAyG,EAAAxB,KAAP,EAA4BU,CA1BR,CA3BX,CANb,CAgEMe,GAAM,CAEVC,MAAO,CAAA,CAFG,CASV,KAAAC,QAAI,CAACjB,CAAD,CAAMkB,CAAN,CAAeC,CAAf,CAAqB,CACvB,GAAKnB,CAAL,CAEO,GAAIA,CAAAoB,MAAA,CAAU,QAAV,CAAJ,CAAyB,CAExBC,CAAAA;AAASrB,CAAAsB,MAAA,CAAU,GAAV,CAEf,KAAIC,EAAWF,CAAA,CAAO,CAAP,CAEbE,EAAA,CAD+B,EAAjC,CAFeF,CAAAG,CAAO,CAAPA,CAEXC,QAAA,CAAe,SAAf,CAAJ,CACaC,IAAA,CAAKH,CAAL,CADb,CAGaI,kBAAA,CAAmBJ,CAAnB,CAEbL,EAAA,CAAQK,CAAR,CAV8B,CAAzB,IAWA,CACL,IAAMK,EAAU,IAAIC,cACpBD,EAAAE,KAAA,CAAa,KAAb,CAAoB9B,CAApB,CAAyBe,EAAAC,MAAzB,CACAY,EAAAG,OAAA,CAAiBC,QAAA,EAAM,CAKrB,IAAIC,EAAgBL,CAAAM,YAAhBD,EAAuCL,CAAAO,kBAAA,CAA0B,UAA1B,CACvCF,EAAJ,EAAoD,CAApD,GAAqBA,CAAAR,QAAA,CAAsB,GAAtB,CAArB,GAIEQ,CAJF,EAGkBG,QAAAC,OAHlB,EAGqCD,QAAAE,SAHrC,CAGyD,IAHzD,CAGgEF,QAAAG,KAHhE,EAI2BN,CAJ3B,CAMA,KAAMV,EAAkCK,CAAAY,SAAlCjB,EAAsDK,CAAAa,aACrC,IAAvB,GAAIb,CAAAc,OAAJ,EAAiD,CAAjD,GAA8Bd,CAAAc,OAA9B,EACoB,GADpB,EACEd,CAAAc,OADF,EAC4C,GAD5C,CAC2Bd,CAAAc,OAD3B,CAEExB,CAAA,CAAQK,CAAR,CAAkBU,CAAlB,CAFF,CAIEd,CAAA,CAAKI,CAAL,CAjBmB,CAoBvBK,EAAAe,KAAA,EAvBK,CAbP,IACExB,EAAA,CAAK,+BAAL,CAFqB,CATf,CAhEZ,CAqHMpF,GAAO,SAAA6G,KAAA,CAAeC,SAAAC,UAAf,CAAP/G,EACJ,YAAA6G,KAAA,CAAkBC,SAAAC,UAAlB,CAqDA;CAAA,UAAA,YAAA,CAAA7F,QAAW,CAAC5C,CAAD,CAAM,CAAA,IAAA,EAAA,IACT0I,EAAAA,CACHlI,CAAA,CAAIR,CAAJ,CArDgBG,kBAqDhB,CACHS,EAAA,CAAQ8H,CAAR,CAAe,QAAA,CAAAtE,CAAA,CAAQ,CAAA,MAAA,EAAAuE,EAAA,CAAgBvE,CAAhB,CAAA,CAAvB,CAHe,CASjB,EAAA,UAAA,EAAA,CAAAuE,QAAU,CAACvE,CAAD,CAAO,CAAA,IAAA,EAAA,IAAA,CACTuB,EAAMvB,CAAAa,KAEZ,IAA4Ba,IAAAA,EAA5B,GAAI,IAAA5D,EAAA,CAAeyD,CAAf,CAAJ,CAAuC,CAGrC,IAAM9E,EAAM,IAAAqB,EAAA,CAAeyD,CAAf,CACR9E,EAAJ,EAAWA,CAAA,SAAX,GACEuD,CAAA,SACA,CADmBvD,CACnB,CAAA,IAAA+H,EAAA,CAAuBxE,CAAvB,CAFF,CAJqC,CAAvC,IAUA,KAAAjC,EAAA,EAGA,CADA,IAAAD,EAAA,CAAeyD,CAAf,CACA,CADsB,SACtB,CAAAe,EAAAE,KAAA,CAASjB,CAAT,CAAc,QAAA,CAACuB,CAAD,CAAWU,CAAX,CAA6B,CACnC5H,CAAAA,CAAM,CAAA6I,GAAA,CAAkB3B,CAAlB,CAA4BU,CAA5B,EAA6CjC,CAA7C,CACZ,EAAAzD,EAAA,CAAeyD,CAAf,CAAA,CAAsB3F,CACtB,EAAAmC,EAAA,EAEA,EAAAS,YAAA,CAAiB5C,CAAjB,CACA,EAAA8I,EAAA,EANyC,CAA3C,CAOG,QAAA,EAAM,CAEP,CAAA5G,EAAA,CAAeyD,CAAf,CAAA,CAAsB,IACtB,EAAAxD,EAAA,EACA,EAAA2G,EAAA,EAJO,CAPT,CAhBe,CAqCjB,EAAA,UAAA,GAAA,CAAAD,QAAY,CAAC3B,CAAD,CAAWvB,CAAX,CAAgB,CAC1B,GAAI,CAACuB,CAAL,CACE,MAAO5H,SAAAyJ,uBAAA,EAGLrH,GAAJ,GAKEwF,CALF,CAKaA,CAAAzB,QAAA,CAAiBZ,EAAjB,CAAoC,QAAA,CAACkC,CAAD,CAAQiC,CAAR,CAAYC,CAAZ,CAAmB,CAChE,MAAgC,EAAhC;AAAIlC,CAAAK,QAAA,CAAc,OAAd,CAAJ,CACY4B,CADZ,CACwC,uBADxC,CAC4CC,CAD5C,CAGOlC,CAJyD,CAAvD,CALb,CAcA,KAAMhE,EACHzD,QAAA8D,cAAA,CAAuB,UAAvB,CACHL,EAAAmG,UAAA,CAAqBhC,CACrB,IAAInE,CAAAC,QAAJ,CACEA,CAGA,CAHUD,CAAAC,QAGV,CAAAH,CAAA,CAAeG,CAAf,CAJF,KAQE,KADAA,CACA,CADU1D,QAAAyJ,uBAAA,EACV,CAAOhG,CAAAvB,WAAP,CAAA,CACEwB,CAAAwD,YAAA,CAAoBzD,CAAAvB,WAApB,CAMJ,IADM2H,CACN,CADenG,CAAAoG,cAAA,CAAsB,MAAtB,CACf,CACEzD,CACA,CADMb,CAAAI,EAAA,CAAgBiE,CAAAhE,aAAA,CAAoB,MAApB,CAAhB,CAA6CQ,CAA7C,CACN,CAAAwD,CAAAE,gBAAA,CAAuB,MAAvB,CAGIC,EAAAA,CACH9I,CAAA,CAAIwC,CAAJ,CAlI4BuG,mNAkI5B,CAEH;IAAIC,EAAoB,CACxB5I,EAAA,CAAQ0I,CAAR,CAAY,QAAA,CAAAG,CAAA,CAAK,CAEf3I,CAAA,CAAkB2I,CAAlB,CACA3E,EAAAC,GAAA,CAAa0E,CAAb,CAAgB9D,CAAhB,CAEA8D,EAAAlG,aAAA,CAvIuBmG,mBAuIvB,CAAqC,EAArC,CAEoB,SAApB,GAAID,CAAAnI,UAAJ,EAAgC,CAACmI,CAAAlI,IAAjC,EAA0CkI,CAAA/F,YAA1C,GAKE+F,CAAAlG,aAAA,CAAe,KAAf,CAAsB,qCAAtB,CAA8DoG,kBAAA,CAH9CF,CAAA/F,YAG8C,EAH9B,kBAG8B,CAHXiC,CAGW,EAJlD6D,CAAAI,CAAoB,GAApBA,CAAwBJ,CAAxBI,CAA8C,EAII,EAHF,OAGE,EAA9D,CAEA,CADAH,CAAA/F,YACA,CADgB,EAChB,CAAA8F,CAAA,EAPF,CAPe,CAAjB,CAiBA,OAAOxG,EA/DmB,CAsE5B,EAAA,UAAA,EAAA,CAAA8F,QAA2B,EAAG,CAAA,IAAA,EAAA,IAE5B,IAAI3G,CAAA,IAAAA,EAAJ,CAAA,CAGA,IAAAC,EAAAyH,WAAA,EACA,KAAAC,QAAA,CAAaxK,QAAb,CAN4B,KAcxByK,EAAY,CAAA,CAdY,CAe1BC,EAAW,CAAA,CAfe,CAgBtBvI,EAAgBA,QAAA,EAAM,CACtBuI,CAAJ,EAAgBD,CAAhB,GAGE,CAAAnH,YAAA,CAAiBtD,QAAjB,CACA,CAAI,CAAA6C,EAAJ,GAGA,CAAAC,EAAAI,QAAA,CAA8BlD,QAAAmD,KAA9B,CAA6C,CAC3CC,UAAW,CAAA,CADgC,CAE3CC,QAAS,CAAA,CAFkC,CAA7C,CAIA;AAAA,CAAAsH,GAAA,EAPA,CAJF,CAD0B,CAe5B,KAAAC,GAAA,CAAmB,QAAA,EAAM,CACvBF,CAAA,CAAW,CAAA,CACXvI,EAAA,EAFuB,CAAzB,CAIA,KAAA0I,GAAA,CAAgB,QAAA,EAAM,CACpBJ,CAAA,CAAY,CAAA,CACZtI,EAAA,EAFoB,CAAtB,CAjCA,CAF4B,CA4C9B,EAAA,UAAA,QAAA,CAAAqI,QAAO,CAAC9J,CAAD,CAAM,CAAA,IAAA,EAAA,IACLsJ,EAAAA,CACH9I,CAAA,CAAIR,CAAJ,CArNgBG,kBAqNhB,CACHS,EAAA,CAAQ0I,CAAR,CAAY,QAAA,CAAAG,CAAA,CAAK,CACf,IAAM5I,EAAM,CAAAqB,EAAA,CAAeuH,CAAAxE,KAAf,CAEZ,EADAwE,CAAA,SACA,CAD0C5I,CAC1C,GAAWA,CAAAe,SAAX,GAA4BC,IAAAuI,uBAA5B,GAGE,CAAAlI,EAAA,CAAeuH,CAAAxE,KAAf,CAIA,CAJyBwE,CAIzB,CAHAA,CAAAxI,WAGA,CAHe,SAGf,CAFAwI,CAAA,SAEA,CAFgBA,CAEhB,CADA,CAAAK,QAAA,CAAajJ,CAAb,CACA,CAAA4I,CAAAjD,YAAA,CAAc3F,CAAd,CAPF,CAHe,CAAjB,CAHW,CAuBb,EAAA,UAAA,GAAA,CAAAsJ,QAAU,CAAC7J,CAAD,CAAW,CAGC+J,QAAA,EAAA,CAAAlG,CAAA,CAAK,CACvB,GAAIA,CAAJ,CAAQmG,CAAR,CAAW,CAKT,IAAMC,EAAIC,CAAA,CAAGrG,CAAH,CAAV,CACMhB,EACH7D,QAAA8D,cAAA,CAAuB,QAAvB,CAEHmH,EAAAlB,gBAAA,CA1OqBK,mBA0OrB,CACA9I,EAAA,CAAQ2J,CAAAlH,WAAR,CAAsB,QAAA,CAAAC,CAAA,CAAQ,CAAA,MAAAH,EAAAI,aAAA,CAAmBD,CAAAE,KAAnB;AAA8BF,CAAAG,MAA9B,CAAA,CAA9B,CAEAY,GAAA,CAAgBlB,CAChBoH,EAAAtK,WAAA0D,aAAA,CAA0BR,CAA1B,CAAiCoH,CAAjC,CACAzJ,EAAA,CAAkBqC,CAAlB,CAAyB,QAAA,EAAM,CAC7BkB,EAAA,CAAgB,IAChBgG,EAAA,CAAYlG,CAAZ,CAAgB,CAAhB,CAF6B,CAA/B,CAdS,CAAX,IAmBE7D,EAAA,EApBqB,CAFzB,IAAMkK,EAAKhK,CAAA,CAAIlB,QAAJ,CA1NgBmL,2BA0NhB,CAAX,CACMH,EAAIE,CAAA7J,OAwBV0J,EAAA,CAAY,CAAZ,CA1BmB,CAiCrB,EAAA,UAAA,GAAA,CAAAH,QAAa,CAAC5J,CAAD,CAAW,CACtB,IAAMkK,EACHhK,CAAA,CAAIlB,QAAJ,CA1PuBoL,kEA0PvB,CADH,CAEIhK,EAAU8J,CAAA7J,OACd,IAAKD,CAAL,CAAA,CASA,IAAMiK,EAAYjJ,EAAZiJ,EAAoB,CAAC,CAACrL,QAAA8J,cAAA,CAnRHwB,iDAmRG,CAC5BhK,EAAA,CAAQ4J,CAAR,CAAY,QAAA,CAAAD,CAAA,CAAK,CAEfzJ,CAAA,CAAkByJ,CAAlB,CAAqB,QAAA,EAAM,CACzBA,CAAAlB,gBAAA,CA/QqBK,mBA+QrB,CACkB,EAAlB,GAAI,EAAEhJ,CAAN,EACEJ,CAAA,EAHuB,CAA3B,CAQA,IAAIqK,CAAJ,EAAiBJ,CAAAtK,WAAjB,GAAkCX,QAAAmD,KAAlC,CAAiD,CAE/C,IAAMoI,EAAcvL,QAAA8D,cAAA,CAAuBmH,CAAAjJ,UAAvB,CAEpBuJ;CAAA,iBAAA,CAAkCN,CAElCM,EAAAtH,aAAA,CAAyB,MAAzB,CAAiC,oBAAjC,CAEAgH,EAAAtK,WAAA6K,aAAA,CAA0BD,CAA1B,CAAuCN,CAAAQ,YAAvC,CAEA,KADIC,CACJ,CADiBpL,CAAA,CAAiB2K,CAAjB,CACjB,CAAOS,CAAP,EAAqBpL,CAAA,CAAiBoL,CAAjB,CAArB,CAAA,CACEA,CAAA,CAAapL,CAAA,CAAiBoL,CAAjB,CAEXA,EAAA/K,WAAJ,GAA8BX,QAAAmD,KAA9B,GACEuI,CADF,CACe,IADf,CAGA1L,SAAAmD,KAAAqI,aAAA,CAA2BP,CAA3B,CAA8BS,CAA9B,CAEAT,EAAAlB,gBAAA,CAAkB,MAAlB,CAlB+C,CAVlC,CAAjB,CAVA,CAAA,IACE/I,EAAA,EALoB,CAkDxB,EAAA,UAAA,GAAA,CAAA2J,QAAU,EAAG,CAAA,IAAA,EAAA,IAAA,CACLX,EACH9I,CAAA,CAAIlB,QAAJ,CA/TgBa,kBA+ThB,CAEHS,EAAA,CAAQ0I,CAAR,CAAY,QAAA,CAAAG,CAAA,CAAK,CAAA,MAAA,EAAAb,EAAA,CAAuBa,CAAvB,CAAA,CAAjB,CAA4C,CAAA,CAA5C,CAJW,CAWb,EAAA,UAAA,EAAA,CAAAb,QAAiB,CAACxE,CAAD,CAAO,CAEjBA,CAAA,SAAL,GACEA,CAAA,SAIA,CAJmB,CAAA,CAInB,CAFAA,CAAA6G,OAEA,GAFgB7G,CAAA6G,OAAAhK,WAEhB,CAFyC,UAEzC,EAAAmD,CAAA8G,cAAA,CAAmBlM,CAAA,CADDoF,CAAA6G,OAAAE,CAAc,MAAdA,CAAuB,OACtB,CAA0B,CAC3C1L,QAAS,CAAA,CADkC;AAE3CC,WAAY,CAAA,CAF+B,CAG3CC,OAAQmG,IAAAA,EAHmC,CAA1B,CAAnB,CALF,CAFsB,CAkBxB,EAAA,UAAA,GAAA,CAAAvD,QAAe,CAAC6I,CAAD,CAAY,CAAA,IAAA,EAAA,IACzBxK,EAAA,CAAQwK,CAAR,CAAmB,QAAA,CAAA9I,CAAA,CAAK,CAAA,MAAA1B,EAAA,CAAQ0B,CAAA+I,WAAR,CAAsB,QAAA,CAAAC,CAAA,CAAQ,CAChDA,CAAJ,EAAYA,CAAA1J,SAAZ,GAA8BC,IAAAC,aAA9B,GAEM1B,CAAA,CAAakL,CAAb,CAAJ,CACE,CAAA3C,EAAA,CAAkD2C,CAAlD,CADF,CAGE,CAAA1I,YAAA,CAA2C0I,CAA3C,CALJ,CADoD,CAA9B,CAAA,CAAxB,CADyB,CAmI7B,KAAIC,GAAW,IAqBf,IAAIzL,CAAJ,CAKQ0L,CAkBN,CAjBGhL,CAAA,CAAIlB,QAAJ,CAxfkBa,kBAwflB,CAiBH,CAhBAS,CAAA,CAAQ4K,CAAR,CAAc,QAAA,CAAA3K,CAAA,CAAO,CACdA,CAAAoK,OAAL,EAA6C,SAA7C,GAAmBpK,CAAAoK,OAAAhK,WAAnB,GACEJ,CAAA,SADF,CACoB,CAAA,CADpB,CADmB,CAArB,CAgBA,CAPMY,CAON,CAPsBA,QAAA,CAAApC,CAAA,CAAS,CACvBiM,CAAAA,CAAgCjM,CAAAoM,OAClCrL,EAAA,CAAakL,CAAb,CAAJ,GACEA,CAAA,SADF,CACqB,CAAA,CADrB,CAF6B,CAO/B,CADAhM,QAAA8B,iBAAA,CAA0B,MAA1B,CAAkCK,CAAlC,CAAiD,CAAA,CAAjD,CACA,CAAAnC,QAAA8B,iBAAA,CAA0B,OAA1B,CAAmCK,CAAnC,CAAkD,CAAA,CAAlD,CAvBF,KAwBO,CAML,IAAMiK,GAAiBpH,MAAAqH,yBAAA,CAAgC9J,IAAA+J,UAAhC;AAAgD,SAAhD,CAGvBtH,OAAAC,eAAA,CAAsBqH,CADR,CAACF,EAADG,EAAmBH,EAAAhH,aAAnBmH,CAAiDhK,IAAjDgK,CAAwDC,OAChDF,WAAtB,CAAuC,SAAvC,CAAkD,CAChD,IAAApH,QAAG,EAAG,CACJ,IAAMuH,EAA2C3L,CAAA,CAAa,IAAb,CAAA,CAAqB,IAArB,CAA4BR,CAAA,CAAiB,IAAjB,CAC7E,OAAImM,EAAJ,CAAqBA,CAAA9G,KAArB,CAEIyG,EAAJ,EAAsBA,EAAAlH,IAAtB,CAAiDkH,EAAAlH,IAAAwH,KAAA,CAAwB,IAAxB,CAAjD,CAGO/G,CADsC3F,QAAA8J,cAAApE,CAAuB,MAAvBA,CACtCC,EAAS9F,MAAA4I,SAAT9C,MAPH,CAD0C,CAUhDP,aAAc,CAAA,CAVkC,CAWhDuH,WAAY,CAAA,CAXoC,CAAlD,CAeA3H,OAAAC,eAAA,CAAsB2H,eAAAN,UAAtB,CAAiD,QAAjD,CAA2D,CACzD,IAAApH,QAAG,EAAG,CACJ,MAAuC,KAAD,SAAtC,EAA4D,IADxD,CADmD,CAIzDE,aAAc,CAAA,CAJ2C,CAKzDuH,WAAY,CAAA,CAL6C,CAA3D,CAQAlL,EAAA,CAAkB,QAAA,EAAM,CACtBwK,EAAA,CAAW,IAAItJ,CADO,CAAxB,CAhCK,CAgDPZ,CAAA,CAAU,QAAA,EAAM,CAAA,MAAA/B,SAAA4L,cAAA,CAAuBlM,CAAA,CAAe,mBAAf,CAAoC,CACzEU,WAAY,CAAA,CAD6D;AAEzED,QAAS,CAAA,CAFgE,CAGzEE,OAAQmG,IAAAA,EAHiE,CAApC,CAAvB,CAAA,CAAhB,CAOA/G,EAAAe,UAAA,CAAkBA,CAClBf,EAAAsC,UAAA,CAAkBA,CAClBtC,EAAAa,iBAAA,CAAyBA,CACzBb,EAAA6D,YAAA,CAjGoBA,QAAA,CAAC5C,CAAD,CAAS,CACvBuL,EAAJ,EACEA,EAAA3I,YAAA,CAAqB5C,CAArB,CAFyB,CAhqBrB,CAAT,CAAD,CAmwBGb,MAAAgN,YAnwBH,CAmwByBhN,MAAAgN,YAnwBzB,EAmwB+C,EAnwB/C,C;;;;;;;;;AMGEnK,QADWoK,GACA,EAAG,CAIZ,IAAAC,GAAA,CAFA,IAAAC,KAEA,CAFY,IAGZ,KAAAC,EAAA,CAAa,CAAA,CAWb,KAAAC,EAAA,CAFA,IAAAC,EAEA,CAJA,IAAAC,EAIA,CANA,IAAAC,aAMA,CARA,IAAAC,cAQA,CAVA,IAAAC,EAUA,CAVgB,IAuBhB,KAAAhJ,WAAA,CAFA,IAAAkH,YAEA,CAJA,IAAA+B,gBAIA,CANA,IAAAC,UAMA,CARA,IAAAvL,WAQA,CAVA,IAAAvB,WAUA,CAZA,IAAA+M,EAYA,CAZsBlH,IAAAA,EActB,KAAAmH,GAAA,CADA,IAAAC,EACA,CAD0B,CAAA,CA9Bd,CAkCd,EAAA,UAAA,OAAA,CAAAC,QAAM,EAAG,CACP,MAAO,EADA,CAKJC,SAASA,EAAsB,CAACzL,CAAD,CAAO,CACtCA,CAAA0L,EAAL,GACE1L,CAAA0L,EADF,CACiB,IAAIjB,EADrB,CAGA,OAAOzK,EAAA0L,EAJoC,CAOtCC,QAASA,EAAgB,CAAC3L,CAAD,CAAO,CACrC,MAAOA,EAAP,EAAeA,CAAA0L,EADsB,C,CC/ChC,IAAIE,EAAWpO,MAAA,SAAXoO,EAAiC,EAE5CA,EAAAC,GAAA,CAA8B,EAAQC,CAAA3B,OAAAF,UAAA6B,aAAR,EAA0CC,CAAA7L,IAAA+J,UAAA8B,YAA1C,CAE9B,KAAIC,GAAOrJ,MAAAqH,yBAAA,CAAgC9J,IAAA+J,UAAhC,CAAgD,YAAhD,CAEX2B,EAAAK,EAAA,CAA0B,CAAA,EAAQD,EAAR,EAAgBA,EAAAjJ,aAAhB,EAAqCiJ,EAAAnJ,IAArC,CAC1B+I,EAAAM,GAAA,CAAiBN,CAAA,MAAjB,EAAsC,CAACA,CAAAC,GAIvC,KAAMM,GAAQtF,SAAAC,UAAA1B,MAAA,CAA0B,SAA1B,CAAd,CACMgH,GAAUvF,SAAAC,UAAA1B,MAAA,CAA0B,MAA1B,CACoBjB,KAAAA,EAApC,GAAIyH,CAAAS,GAAJ,GACET,CAAAS,GADF,CACgCT,CAAAK,EADhC,GAC4DE,EAD5D,EACqEC,EADrE,EAIOE,SAASA,EAA2B,CAACtM,CAAD,CAAO,CAEhD,OADMuM,CACN,CD4BcZ,CC7BG,CAAiB3L,CAAjB,CACjB,GAA4CmE,IAAAA,EAA5C,GAAoBoI,CAAA1M,WAF4B,CAK3C2M,QAASA,EAAW,CAACC,CAAD,CAAM,CAC/B,MAAkC,WAAlC,GAAeA,CAAAC,GADgB,CAI1BC,QAASA,EAAqB,CAAC3M,CAAD,CAAO,CACtC2K,CAAAA,CAAO3K,CAAA+L,YAAA,EACX,IAAIS,CAAA,CAAY7B,CAAZ,CAAJ,CACE,MAAOA,EAHiC;AAO5C,IAAIiC,EAAIzC,OAAAF,UAAR,CACI4C,GAAUD,CAAAC,QAAVA,EAAuBD,CAAAE,gBAAvBD,EACFD,CAAAG,mBADEF,EACsBD,CAAAI,kBADtBH,EAEFD,CAAAK,iBAFEJ,EAEoBD,CAAAM,sBAajBC,SAASA,GAAM,CAACrD,CAAD,CAASsD,CAAT,CAAiB,CACrC,GAAItD,CAAJ,EAAcsD,CAAd,CAEE,IADA,IAAIzF,EAAKhF,MAAA0K,oBAAA,CAA2BD,CAA3B,CAAT,CACS5K,EAAE,CADX,CACcsF,CAAd,CAAkBtF,CAAlB,CAAoBmF,CAAA3I,OAApB,GAAmC8I,CAAnC,CAAqCH,CAAA,CAAGnF,CAAH,CAArC,EAA6CA,CAAA,EAA7C,CAAkD,CATpD,IAAI8K,EAAK3K,MAAAqH,yBAAA,CAUcoD,CAVd,CAUWtF,CAVX,CACLwF,EAAJ,EACE3K,MAAAC,eAAA,CAQ6BkH,CAR7B,CAQkBhC,CARlB,CAAoCwF,CAApC,CAOkD,CAHf,CAUhCC,QAASA,GAAS,CAACzD,CAAD,CAAS,CAAT,CAAqB,CAAZ,IAAA,IAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,SAAA,OAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAChC,KAAStH,CAAT,CAAW,CAAX,CAAcA,CAAd,CAD4CgL,CAC1BxO,OAAlB,CAAkCwD,CAAA,EAAlC,CACE2K,EAAA,CAAOrD,CAAP,CAF0C0D,CAE3B,CAAQhL,CAAR,CAAf,CAEF,OAAOsH,EAJqC,CAOvC2D,QAASA,GAAK,CAAC3D,CAAD,CAASsD,CAAT,CAAiB,CACpC,IAAK5K,IAAIA,CAAT,GAAc4K,EAAd,CACEtD,CAAA,CAAOtH,CAAP,CAAA,CAAY4K,CAAA,CAAO5K,CAAP,CAFsB;AAoBtC,IAAIkL,GAAU/P,QAAAgQ,eAAA,CAAwB,EAAxB,CAAd,CACItM,GAAU,CADd,CAEIuM,GAAQ,EACZ/M,EAAA,IAAIH,gBAAJ,CAAqB,QAAA,EAAM,CACzB,IAAA,CAAOkN,EAAA5O,OAAP,CAAA,CAEE,GAAI,CACF4O,EAAAC,MAAA,EAAA,EADE,CAEF,MAAMrJ,CAAN,CAAS,CAGT,KADAkJ,GAAA3L,YACMyC,CADgBnD,EAAA,EAChBmD,CAAAA,CAAN,CAHS,CALY,CAA3B,CAAA3D,SAAA,CAWW6M,EAXX,CAWoB,CAACI,cAAe,CAAA,CAAhB,CAXpB,CAcOC,SAASA,GAAS,CAACpP,CAAD,CAAW,CAClCiP,EAAAI,KAAA,CAAWrP,CAAX,CACA+O,GAAA3L,YAAA,CAAsBV,EAAA,EAFY,CAK7B,IAAM4M,GAAsB,CAAA,CAAQtQ,QAAAuQ,SAEpCA,SAASA,GAAQ,CAACC,CAAD,CAAYnO,CAAZ,CAAkB,CACxC,IAAA,CAAOA,CAAP,CAAA,CAAa,CACX,GAAIA,CAAJ,EAAYmO,CAAZ,CACE,MAAO,CAAA,CAETnO,EAAA,CAAOA,CAAA1B,WAJI,CAMb,MAAO,CAAA,CAPiC,C,CC5G1C,IAAI8P,GAAY,EAAhB,CACIC,EACGC,SAASA,GAAO,CAAC3P,CAAD,CAAW,CAC3B0P,EAAL,GACEA,EACA,CADY,CAAA,CACZ,CDgGYN,EChGZ,CAAgBQ,EAAhB,CAFF,CAIAH,GAAAJ,KAAA,CAAerP,CAAf,CALgC,CAQ3B4P,QAASA,GAAK,EAAG,CACtBF,EAAA,CAAY,CAAA,CAEZ,KADA,IAAIG,EAAW,CAAA,CAAQJ,EAAApP,OACvB,CAAOoP,EAAApP,OAAP,CAAA,CACEoP,EAAAP,MAAA,EAAA,EAEF,OAAOW,EANe,CASxBD,EAAA,KAAA,CAAgBH,E,CCjBd/N,QAFIoO,GAEO,EAAG,CACZ,IAAAC,EAAA,CAAkB,CAAA,CAClB,KAAAhF,WAAA,CAAkB,EAClB,KAAAiF,aAAA,CAAoB,EACpB,KAAAC,EAAA,CAAiB,IAAIC,GAJT,CAOdC,QAAA,GAAQ,CAARA,CAAQ,CAAG,CACJ,CAAAJ,EAAL,GACE,CAAAA,EACA,CADkB,CAAA,CAClB,CFyFUX,EEzFV,CAAgB,QAAA,EAAM,CACpBQ,EAAA,CAJKA,CAIL,CADoB,CAAtB,CAFF,CADS,CASXA,QAAA,GAAK,CAALA,CAAK,CAAG,CACN,GAAI,CAAAG,EAAJ,CAAqB,CACnB,CAAAA,EAAA,CAAkB,CAAA,CAClB,KAAIjF,EAAY,CAAAsF,YAAA,EACZtF,EAAAzK,OAAJ,EACE,CAAA4P,EAAA3P,QAAA,CAAuB,QAAQ,CAAC+P,CAAD,CAAK,CAClCA,CAAA,CAAGvF,CAAH,CADkC,CAApC,CAJiB,CADf,CAYR,EAAA,UAAA,YAAA,CAAAsF,QAAW,EAAG,CACZ,GAAI,IAAArF,WAAA1K,OAAJ,EAA8B,IAAA2P,aAAA3P,OAA9B,CAAwD,CACtD,IAAIyK,EAAY,CAAC,CACfC,WAAY,IAAAA,WADG,CAEfiF,aAAc,IAAAA,aAFC,CAAD,CAIhB,KAAAjF,WAAA,CAAkB,EAClB,KAAAiF,aAAA,CAAoB,EACpB,OAAOlF,EAP+C,CASxD,MAAO,EAVK,CAoBawF;QAAA,GAAQ,CAACjP,CAAD,CAAOrB,CAAP,CAAiB,CACpD,IAAMuQ,EHbQzD,CGaH,CAAuBzL,CAAvB,CACNkP,EAAAhE,EAAL,GACEgE,CAAAhE,EADF,CACgB,IAAIuD,EADpB,CAGAS,EAAAhE,EAAA0D,EAAAO,IAAA,CAA0BxQ,CAA1B,CACA,KAAIuM,EAAWgE,CAAAhE,EACf,OAAO,CACLkE,GAAWzQ,CADN,CAEL0Q,GAAWnE,CAFN,CAGLoE,GAAOtP,CAHF,CAIL,YAAA+O,QAAW,EAAG,CACZ,MAAO7D,EAAA6D,YAAA,EADK,CAJT,CAP6C,CAiBvBQ,QAAA,GAAQ,CAACC,CAAD,CAAS,CAC9C,IAAItE,EAAWsE,CAAXtE,EAAqBsE,CAAAH,GACrBnE,EAAJ,GACEA,CAAA0D,EAAAa,OAAA,CAA0BD,CAAAJ,GAA1B,CACA,CAAKlE,CAAA0D,EAAAc,KAAL,GHjCYjE,CGkCV,CAAuB+D,CAAAF,GAAvB,CAAApE,EADF,CACkD,IADlD,CAFF,CAF8C;AAUzCyE,QAASA,GAAe,CAAClG,CAAD,CAAYK,CAAZ,CAAoB,CAEjD,IAAM8F,EAAiB9F,CAAAiC,YAAA,EACvB,OAAOtC,EAAAoG,IAAA,CAAc,QAAQ,CAACC,CAAD,CAAW,CAEtC,IAAMC,EAAmBH,CAAnBG,GAAsCD,CAAAhG,OAAAiC,YAAA,EAC5C,IAAIgE,CAAJ,EAAuBD,CAAApG,WAAvB,CAIE,IAHIsG,CAGAhR,CAHQiR,KAAAC,KAAA,CAAWJ,CAAApG,WAAX,CAAAyG,OAAA,CAAuC,QAAQ,CAACrI,CAAD,CAAI,CAC7D,MAAQ8H,EAAR,GAA2B9H,CAAAiE,YAAA,EADkC,CAAnD,CAGR/M,CAAAgR,CAAAhR,OAAJ,CAME,MALA8Q,EAKOA,CALInN,MAAAyN,OAAA,CAAcN,CAAd,CAKJA,CAJPnN,MAAAC,eAAA,CAAsBkN,CAAtB,CAAgC,YAAhC,CAA8C,CAC5ChO,MAAOkO,CADqC,CAE5CjN,aAAc,CAAA,CAF8B,CAA9C,CAIO+M,CAAAA,CANT,CAJF,IAYO,IAAIC,CAAJ,CACL,MAAOD,EAhB6B,CAAjC,CAAAK,OAAA,CAkBG,QAAQ,CAACxP,CAAD,CAAI,CAAE,MAAOA,EAAT,CAlBf,CAH0C,C,CChFnD,IAAA,EAAA,EAAA,CACWwI,GAAegB,OAAAF,UAAAd,aAD1B,CAEWnH,GAAemI,OAAAF,UAAAjI,aAF1B,CAGWqO,GAAclG,OAAAF,UAAAoG,YAHzB,CAIWzO,GAAeuI,OAAAF,UAAArI,aAJ1B,CAKW8F,GAAkByC,OAAAF,UAAAvC,gBAL7B,CAMW4I,GAAYnG,OAAAF,UAAAqG,UANvB,CAOWC,GAAaC,QAAAvG,UAAAsG,WAPxB,CAQW9Q,GAAmB0K,OAAAF,UAAAxK,iBAR9B,CASWD,GAAsB2K,OAAAF,UAAAzK,oBATjC,CAUWiR,GAAyBC,MAAAzG,UAAAxK,iBAVpC,CAWWkR,GAA4BD,MAAAzG,UAAAzK,oBAXvC,CAYW+J,GAAgBY,OAAAF,UAAAV,cAZ3B,CAaW2E,GAAWhO,IAAA+J,UAAAiE,SAAXA,EAAsC0C,WAAA3G,UAAAiE,SAbjD,CAcW2C,GAAiBL,QAAAvG,UAAA4G,eAd5B;AAeWC,GAAuB3G,OAAAF,UAAAxC,cAflC,CAgBWsJ,GAAwBC,gBAAA/G,UAAAxC,cAhBnC,CAiBWwJ,GAAwBT,QAAAvG,UAAAxC,cAjBnC,CA4BWyJ,GAA0B/G,OAAAF,UAAA9H,iBA5BrC,CA6BWgP,GAA2BH,gBAAA/G,UAAA9H,iBA7BtC,CA8BWiP,GAA2BZ,QAAAvG,UAAA9H,iBA9B3B0C,EAAAA,YAAAA,CAAcsF,OAAAF,UAAApF,YACdsE,EAAAA,aAAAA,CAAAA,EACAnH,EAAAA,aAAAA,CAAAA,EACAqO,EAAAA,YAAAA,CAAAA,EACAzO,EAAAA,aAAAA,CAAAA,EACA8F,EAAAA,gBAAAA,CAAAA,EACA4I,EAAAA,UAAAA,CAAAA,EACAC,EAAAA,WAAAA,CAAAA,EACA9Q,EAAAA,iBAAAA,CAAAA,EACAD,EAAAA,oBAAAA,CAAAA,EACAiR,EAAAA,GAAAA,CAAAA,EACAE,EAAAA,GAAAA,CAAAA,EACApH,EAAAA,cAAAA,CAAAA,EACA2E,EAAAA,SAAAA,CAAAA,EACA2C;CAAAA,eAAAA,CAAAA,EACAC,EAAAA,GAAAA,CAAAA,EACAC,EAAAA,GAAAA,CAAAA,EACAE,EAAAA,GAAAA,CAAAA,EACAxJ,EAAAA,cAAAA,CAAgBA,QAAQ,CAACxF,CAAD,CAAW,CAC5C,OAAQ,IAAAhC,SAAR,EACE,KAAKC,IAAAC,aAAL,CACE,MAAO2Q,GAAAzG,KAAA,CAA0B,IAA1B,CAAgCpI,CAAhC,CACT,MAAK/B,IAAAmR,cAAL,CACE,MAAOJ,GAAA5G,KAAA,CAA2B,IAA3B,CAAiCpI,CAAjC,CACT,SACE,MAAO8O,GAAA1G,KAAA,CAA2B,IAA3B,CAAiCpI,CAAjC,CANX,CAD4C,CAUnCiP,EAAAA,GAAAA,CAAAA,EACAC,EAAAA,GAAAA,CAAAA,EACAC,EAAAA,GAAAA,CAAAA,EACAjP,EAAAA,iBAAAA,CAAmBA,QAAQ,CAACF,CAAD,CAAW,CAC/C,OAAQ,IAAAhC,SAAR,EACE,KAAKC,IAAAC,aAAL,CACE,MAAO+Q,GAAA7G,KAAA,CAA6B,IAA7B,CAAmCpI,CAAnC,CACT,MAAK/B,IAAAmR,cAAL,CACE,MAAOD,GAAA/G,KAAA,CAA8B,IAA9B,CAAoCpI,CAApC,CACT,SACE,MAAOkP,GAAA9G,KAAA,CAA8B,IAA9B,CAAoCpI,CAApC,CANX,CAD+C,C,CCzBjD,IAAIqP,GAAmB,aAAvB,CACIC,GAAmB,cAEvBC,SAASA,GAAa,CAACC,CAAD,CAAI,CACxB,OAAQA,CAAR,EACE,KAAK,GAAL,CACE,MAAO,OACT,MAAK,GAAL,CACE,MAAO,MACT,MAAK,GAAL,CACE,MAAO,MACT,MAAK,GAAL,CACE,MAAO,QACT,MAAK,QAAL,CACE,MAAO,QAVX,CADwB,CAuB1BC,QAASA,GAAO,CAACC,CAAD,CAAM,CAEpB,IADA,IAAIC,EAAM,EAAV,CACSpP,EAAI,CAAb,CAAgBA,CAAhB,CAAoBmP,CAAA3S,OAApB,CAAgCwD,CAAA,EAAhC,CACEoP,CAAA,CAAID,CAAA,CAAInP,CAAJ,CAAJ,CAAA,CAAc,CAAA,CAEhB,OAAOoP,EALa,CAStB,IAAIC,GAAeH,EAAA,CAAQ,qFAAA,MAAA,CAAA,GAAA,CAAR,CAAnB,CAmBII,GAAmBJ,EAAA,CAAQ,6DAAA,MAAA,CAAA,GAAA,CAAR,CAoDhBK;QAASA,GAAY,CAAC/R,CAAD,CAAOrB,CAAP,CAAiB,CACpB,UAAvB,GAAIqB,CAAAL,UAAJ,GACEK,CADF,CAC8CA,CAADqB,QAD7C,CAKA,KAFA,IAAIuH,EAAI,EAAR,CACIoJ,EAAKrT,CAAA,CAAWA,CAAA,CAASqB,CAAT,CAAX,CAA4BA,CAAAkC,WADrC,CAESM,EAAE,CAFX,CAEcmG,EAAEqJ,CAAAhT,OAFhB,CAE2BiT,CAA3B,CAAmCzP,CAAnC,CAAqCmG,CAArC,GAA4CsJ,CAA5C,CAAkDD,CAAA,CAAGxP,CAAH,CAAlD,EAA0DA,CAAA,EAA1D,CAA+D,CA1CR,CAAA,CAAA,CA2CnCyP,IAAAA,EAAAA,CAAOjS,KAAAA,EAAAA,CAAMrB,KAAAA,EAAAA,CA1CjC,QAAQqB,CAAAC,SAAR,EACE,KAAKC,IAAAC,aAAL,CAIE,IAHA,IAAI+R,EAAUlS,CAAAL,UAAd,CACIiJ,EAAI,GAAJA,CAAUsJ,CADd,CAEIC,EAAQnS,CAAA0B,WAFZ,CAGSc,EAAI,CAAb,CAAuBb,CAAvB,CAA8BwQ,CAAA,CAAM3P,CAAN,CAA9B,CAAyCA,CAAA,EAAzC,CACEoG,CAAA,EAAK,GAAL,CAAWjH,CAAAE,KAAX,CAAuB,IAAvB,CAAyCF,CAAAG,MA1DxCgC,QAAA,CAAUwN,EAAV,CAA4BE,EAA5B,CA0DD,CAAuD,GAEzD5I,EAAA,EAAK,GACL,EAAA,CAAIiJ,EAAA,CAAaK,CAAb,CAAJ,CACStJ,CADT,CAGOA,CAHP,CAGWmJ,EAAA,CAAa/R,CAAb,CAAmBrB,CAAnB,CAHX,CAG0C,IAH1C,CAGiDuT,CAHjD,CAG2D,GAH3D,OAAA,CAKF,MAAKhS,IAAAkS,UAAL,CACMC,CAAAA,CAA4BrS,CAADqS,KAC/B,EAAA,CAAI/T,CAAJ,EAAkBwT,EAAA,CAAiBxT,CAAAqB,UAAjB,CAAlB,CACS0S,CADT,CAGkBA,CAnEfvO,QAAA,CAAUyN,EAAV,CAA4BC,EAA5B,CAgEH,OAAA,CAKF,MAAKtR,IAAAoS,aAAL,CACE,CAAA,CAAO,SAAP,CAAwCtS,CAADqS,KAAvC,CAAqD,QAArD,OAAA,CAEF,SAEE,KADA7U,OAAA+U,QAAAC,MAAA,CAAqBxS,CAArB,CACM;AAAIyS,KAAJ,CAAU,iBAAV,CAAN,CA1BJ,CADuD,CA2CrD7J,CAAA,EAAK,CADwD,CAG/D,MAAOA,EAToC,C,CChH7C,IAAA,EAAA,EAAA,CAEI8J,EAAa/U,QAAAgV,iBAAA,CAA0BhV,QAA1B,CAAoCiV,UAAAC,SAApC,CACf,IADe,CACT,CAAA,CADS,CAFjB,CAKIC,EAAgBnV,QAAAgV,iBAAA,CAA0BhV,QAA1B,CAAoCiV,UAAAG,aAApC,CAClB,IADkB,CACZ,CAAA,CADY,CA4Bb7Q,SAASA,GAAU,CAAClC,CAAD,CAAO,CAC/B,IAAIgQ,EAAQ,EACZ0C,EAAAM,YAAA,CAAyBhT,CAEzB,KADI8H,CACJ,CADQ4K,CAAA7S,WAAA,EACR,CAAOiI,CAAP,CAAA,CACEkI,CAAAhC,KAAA,CAAWlG,CAAX,CACA,CAAAA,CAAA,CAAI4K,CAAAtJ,YAAA,EAEN,OAAO4G,EARwB,CAzBjB1R,CAAAA,WAAAA,CAATA,QAAmB,CAAC0B,CAAD,CAAO,CAC/B0S,CAAAM,YAAA,CAAyBhT,CACzB,OAAO0S,EAAApU,WAAA,EAFwB,CAKjBuB,EAAAA,WAAAA,CAATA,QAAmB,CAACG,CAAD,CAAO,CAC/B0S,CAAAM,YAAA,CAAyBhT,CACzB,OAAO0S,EAAA7S,WAAA,EAFwB,CAKjBuL,EAAAA,UAAAA,CAATA,QAAkB,CAACpL,CAAD,CAAO,CAC9B0S,CAAAM,YAAA,CAAyBhT,CACzB,OAAO0S,EAAAtH,UAAA,EAFuB,CAKhBD,EAAAA,gBAAAA,CAATA,QAAwB,CAACnL,CAAD,CAAO,CACpC0S,CAAAM,YAAA,CAAyBhT,CACzB,OAAO0S,EAAAvH,gBAAA,EAF6B,CAKtB/B;CAAAA,YAAAA,CAATA,QAAoB,CAACpJ,CAAD,CAAO,CAChC0S,CAAAM,YAAA,CAAyBhT,CACzB,OAAO0S,EAAAtJ,YAAA,EAFyB,CAKlBlH,EAAAA,WAAAA,CAAAA,EAWA+Q,EAAAA,cAAAA,CAATA,QAAsB,CAACjT,CAAD,CAAO,CAClC8S,CAAAE,YAAA,CAA4BhT,CAC5B,OAAO8S,EAAAxU,WAAA,EAF2B,CAKpB4U,EAAAA,kBAAAA,CAATA,QAA0B,CAAClT,CAAD,CAAO,CACtC8S,CAAAE,YAAA,CAA4BhT,CAC5B,OAAO8S,EAAAjT,WAAA,EAF+B,CAKxBsT,EAAAA,iBAAAA,CAATA,QAAyB,CAACnT,CAAD,CAAO,CACrC8S,CAAAE,YAAA,CAA4BhT,CAC5B,OAAO8S,EAAA1H,UAAA,EAF8B,CAKvBgI,EAAAA,uBAAAA,CAATA,QAA+B,CAACpT,CAAD,CAAO,CAC3C8S,CAAAE,YAAA,CAA4BhT,CAC5B,OAAO8S,EAAA3H,gBAAA,EAFoC,CAK7BkI,EAAAA,mBAAAA,CAATA,QAA2B,CAACrT,CAAD,CAAO,CACvC8S,CAAAE,YAAA,CAA4BhT,CAC5B,OAAO8S,EAAA1J,YAAA,EAFgC,CAKzBkK;CAAAA,SAAAA,CAATA,QAAiB,CAACtT,CAAD,CAAO,CAC7B,IAAIgQ,EAAQ,EACZ8C,EAAAE,YAAA,CAA4BhT,CAE5B,KADI8H,CACJ,CADQgL,CAAAjT,WAAA,EACR,CAAOiI,CAAP,CAAA,CACEkI,CAAAhC,KAAA,CAAWlG,CAAX,CACA,CAAAA,CAAA,CAAIgL,CAAA1J,YAAA,EAEN,OAAO4G,EARsB,CAWfzI,EAAAA,UAAAA,CAATA,QAAkB,CAACvH,CAAD,CAAO,CAC9B,MD+Bc+R,GC/BP,CAAa/R,CAAb,CAAmB,QAAA,CAAC8H,CAAD,CAAO,CAAA,MAAA5F,GAAA,CAAW4F,CAAX,CAAA,CAA1B,CADuB,CAIhB/F,EAAAA,YAAAA,CAATA,QAAoB,CAAC/B,CAAD,CAAO,CAEhC,OAAQA,CAAAC,SAAR,EACE,KAAKC,IAAAC,aAAL,CACA,KAAKD,IAAAuI,uBAAL,CACM8K,CAAAA,CAAa5V,QAAAgV,iBAAA,CAA0B3S,CAA1B,CAAgC4S,UAAAY,UAAhC,CACf,IADe,CACT,CAAA,CADS,CAGjB,KAJF,IAGMnS,EAAU,EAHhB,CAGoByG,CAClB,CAASA,CAAT,CAAayL,CAAAE,SAAA,EAAb,CAAA,CAGEpS,CAAA,EAAWyG,CAAA4L,UAEb,OAAOrS,EACT,SACE,MAAOrB,EAAA0T,UAbX,CAFgC,C,CCrFlC,IAAA,EAAA,EAAA,CAEMzH,GNAKL,CMAYK,EAFvB,CAMM0H,GAAe,CAACzT,IAAA+J,UAAD,CAAiBE,OAAAF,UAAjB,CAAoC2G,WAAA3G,UAApC,CAUrB2J,SAASA,EAAkB,CAAC/R,CAAD,CAAO,CAClB,IAAA,CAT6B,EAAA,CAAA,CAC3C,IAASW,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkBmR,EAAA3U,OAAlB,CAAuCwD,CAAA,EAAvC,CAA4C,CAC1C,IAAMqR,EAAQF,EAAA,CAAanR,CAAb,CACd,IAAIqR,CAAAC,eAAA,CAMsCjS,CANtC,CAAJ,CAAgC,CAC9B,CAAA,CAAOgS,CAAP,OAAA,CAD8B,CAFU,CADD,CAAA,CAAA,IAAA,EAAA,CAU3C,GAAI,CAACA,CAAL,CACE,KAAMpB,MAAA,CAAM,gCAAN,CAAuC5Q,CAAvC,CAAN,CAEF,MAAOc,OAAAqH,yBAAA,CAAgC6J,CAAhC,CAAuChS,CAAvC,CALyB;AAQ3B,IAAMkS,EAAgB9H,EAAA,CAAiB,CAC5C3N,WAAYsV,CAAA,CAAmB,YAAnB,CADgC,CAE5C/T,WAAY+T,CAAA,CAAmB,YAAnB,CAFgC,CAG5CxI,UAAWwI,CAAA,CAAmB,WAAnB,CAHiC,CAI5CzI,gBAAiByI,CAAA,CAAmB,iBAAnB,CAJ2B,CAK5CxK,YAAawK,CAAA,CAAmB,aAAnB,CAL+B,CAM5C1R,WAAY0R,CAAA,CAAmB,YAAnB,CANgC,CAO5CX,cAAeW,CAAA,CAAmB,eAAnB,CAP6B,CAQ5CR,uBAAwBQ,CAAA,CAAmB,wBAAnB,CARoB,CAS5CP,mBAAoBO,CAAA,CAAmB,oBAAnB,CATwB,CAU5CrM,UAAWqM,CAAA,CAAmB,WAAnB,CAViC,CAW5C7R,YAAa6R,CAAA,CAAmB,aAAnB,CAX+B,CAY5CV,kBAAmBU,CAAA,CAAmB,mBAAnB,CAZyB,CAa5CT,iBAAkBS,CAAA,CAAmB,kBAAnB,CAb0B,CAc5CN,SAAUM,CAAA,CAAmB,UAAnB,CAdkC,CAAjB,CAezB,EAfG,CAiBMI,GAAoB/H,EAAA,CAAiB,CAChDiH,kBAAmBvQ,MAAAqH,yBAAA,CACjBgH,gBAAA/G,UADiB;AACW,mBADX,CAD6B,CAGhDkJ,iBAAkBxQ,MAAAqH,yBAAA,CAChBgH,gBAAA/G,UADgB,CACY,kBADZ,CAH8B,CAKhDqJ,SAAU3Q,MAAAqH,yBAAA,CACRgH,gBAAA/G,UADQ,CACoB,UADpB,CALsC,CAAjB,CAO7B,EAxBG,CA0BMgK,GAAoBhI,EAAA,CAAiB,CAChDiH,kBAAmBvQ,MAAAqH,yBAAA,CACjBwG,QAAAvG,UADiB,CACG,mBADH,CAD6B,CAGhDkJ,iBAAkBxQ,MAAAqH,yBAAA,CAChBwG,QAAAvG,UADgB,CACI,kBADJ,CAH8B,CAKhDqJ,SAAU3Q,MAAAqH,yBAAA,CACRwG,QAAAvG,UADQ,CACY,UADZ,CALsC,CAAjB,CAO7B,EAjCS8J,EAAAA,GAAAA,CAAAA,CAiBAC,EAAAA,GAAAA,CAAAA,EASAC,EAAAA,GAAAA,CAAAA,EASG3V,EAAAA,WAAAA,CAATA,QAAmB,CAAC0B,CAAD,CAAO,CAC/B,MAAO+T,EAAAzV,WAAAuE,IAAAwH,KAAA,CAAkCrK,CAAlC,CADwB,CAIjBH;CAAAA,WAAAA,CAATA,QAAmB,CAACG,CAAD,CAAO,CAC/B,MAAO+T,EAAAlU,WAAAgD,IAAAwH,KAAA,CAAkCrK,CAAlC,CADwB,CAIjBoL,EAAAA,UAAAA,CAATA,QAAkB,CAACpL,CAAD,CAAO,CAC9B,MAAO+T,EAAA3I,UAAAvI,IAAAwH,KAAA,CAAiCrK,CAAjC,CADuB,CAIhBmL,EAAAA,gBAAAA,CAATA,QAAwB,CAACnL,CAAD,CAAO,CACpC,MAAO+T,EAAA5I,gBAAAtI,IAAAwH,KAAA,CAAuCrK,CAAvC,CAD6B,CAItBoJ,EAAAA,YAAAA,CAATA,QAAoB,CAACpJ,CAAD,CAAO,CAChC,MAAO+T,EAAA3K,YAAAvG,IAAAwH,KAAA,CAAmCrK,CAAnC,CADyB,CAIlBkC,EAAAA,WAAAA,CAATA,QAAmB,CAAClC,CAAD,CAAO,CAC/B,MAAOiQ,MAAAhG,UAAAiK,MAAA7J,KAAA,CAA2B0J,CAAA7R,WAAAW,IAAAwH,KAAA,CAAkCrK,CAAlC,CAA3B,CADwB,CAIjBiT,EAAAA,cAAAA,CAATA,QAAsB,CAACjT,CAAD,CAAO,CAClC,MAAO+T,EAAAd,cAAApQ,IAAAwH,KAAA,CAAqCrK,CAArC,CAD2B,CAIpBoT,EAAAA,uBAAAA,CAATA,QAA+B,CAACpT,CAAD,CAAO,CAC3C,MAAO+T,EAAAX,uBAAAvQ,IAAAwH,KAAA,CAA8CrK,CAA9C,CADoC,CAI7BqT,EAAAA,mBAAAA,CAATA,QAA2B,CAACrT,CAAD,CAAO,CACvC,MAAO+T,EAAAV,mBAAAxQ,IAAAwH,KAAA,CAA0CrK,CAA1C,CADgC,CAIzBuH;CAAAA,UAAAA,CAATA,QAAkB,CAACvH,CAAD,CAAO,CAC9B,MAAO+T,EAAAxM,UAAA1E,IAAAwH,KAAA,CAAiCrK,CAAjC,CADuB,CAIhB+B,EAAAA,YAAAA,CAATA,QAAoB,CAAC/B,CAAD,CAAO,CAChC,MAAO+T,EAAAhS,YAAAc,IAAAwH,KAAA,CAAmCrK,CAAnC,CADyB,CAIlBsT,EAAAA,SAAAA,CAATA,QAAiB,CAACtT,CAAD,CAAO,CAE7B,OAAQA,CAAAC,SAAR,EACE,KAAKC,IAAAuI,uBAAL,CACE6K,CAAA,CAAWU,EAAAV,SAAAzQ,IAAAwH,KAAA,CAAoCrK,CAApC,CACX,MACF,MAAKE,IAAAmR,cAAL,CACEiC,CAAA,CAAWW,EAAAX,SAAAzQ,IAAAwH,KAAA,CAAoCrK,CAApC,CACX,MACF,SACEsT,CAAA,CAAWS,CAAAT,SAAAzQ,IAAAwH,KAAA,CAAgCrK,CAAhC,CARf,CAWA,MAAOiQ,MAAAhG,UAAAiK,MAAA7J,KAAA,CAA2BiJ,CAA3B,CAbsB,CAgBfJ;CAAAA,kBAAAA,CAATA,QAA0B,CAAClT,CAAD,CAAO,CACtC,OAAQA,CAAAC,SAAR,EACE,KAAKC,IAAAuI,uBAAL,CACE,MAAOuL,GAAAd,kBAAArQ,IAAAwH,KAAA,CAA6CrK,CAA7C,CACT,MAAKE,IAAAmR,cAAL,CACE,MAAO4C,GAAAf,kBAAArQ,IAAAwH,KAAA,CAA6CrK,CAA7C,CACT,SACE,MAAO+T,EAAAb,kBAAArQ,IAAAwH,KAAA,CAAyCrK,CAAzC,CANX,CADsC,CAWxBmT,EAAAA,iBAAAA,CAATA,QAAyB,CAACnT,CAAD,CAAO,CACrC,OAAQA,CAAAC,SAAR,EACE,KAAKC,IAAAuI,uBAAL,CACE,MAAOuL,GAAAb,iBAAAtQ,IAAAwH,KAAA,CAA4CrK,CAA5C,CACT,MAAKE,IAAAmR,cAAL,CACE,MAAO4C,GAAAd,iBAAAtQ,IAAAwH,KAAA,CAA4CrK,CAA5C,CACT,SACE,MAAO+T,EAAAZ,iBAAAtQ,IAAAwH,KAAA,CAAwCrK,CAAxC,CANX,CADqC,C,CC7HhC,IAAMmU,EPHFvI,COGcS,GAAA,CACrB+H,CADqB,CACCC,C,CCE1BC,QAASA,GAAS,CAACtU,CAAD,CAAO,CACvB,IAAA,CAAOA,CAAAH,WAAP,CAAA,CACEG,CAAAqQ,YAAA,CAAiBrQ,CAAAH,WAAjB,CAFqB;AAMzB,IAAMoM,GRZKL,CQYYK,EAAvB,CACMsI,GAAW5W,QAAA+G,eAAAC,mBAAA,CAA2C,OAA3C,CADjB,CAGM6P,GAEJ7R,MAAAqH,yBAAA,CAAgC9J,IAAA+J,UAAhC,CAAgD,aAAhD,CALF,CAQMwK,GAAoBD,EAApBC,EAAkDD,EAAA3R,IARxD,CAUM6R,GAEF/R,MAAAqH,yBAAA,CAAgCwG,QAAAvG,UAAhC,CAAoD,eAApD,CAZJ,CA+DI0K,GAAmB,CAErB1B,cAAe,CAEb,IAAApQ,QAAG,EAAG,CACJ,IAAM0J,ETjCIZ,CSiCO,CAAiB,IAAjB,CAEjB,EADIhD,CACJ,CADQ4D,CACR,EADoBA,CAAAjO,WACpB,GAASqK,CAAA1I,SAAT,GAAwBC,IAAAC,aAAxB,GACEwI,CADF,CACM,IADN,CAGA,OAAaxE,KAAAA,EAAN,GAAAwE,CAAA,CAAkBA,CAAlB,CDlFAwL,CCkFsBlB,cAAA,CAAyB,IAAzB,CANzB,CAFO,CAUblQ,aAAc,CAAA,CAVD,CAFM,CAerBzE,WAAY,CAEV,IAAAuE,QAAG,EAAG,CACJ,IAAM0J,ET9CIZ,CS8CO,CAAiB,IAAjB,CACXhD,EAAAA,CAAI4D,CAAJ5D,EAAgB4D,CAAAjO,WACtB,OAAa6F,KAAAA,EAAN,GAAAwE,CAAA,CAAkBA,CAAlB,CD5FAwL,CC4FsB7V,WAAA,CAAsB,IAAtB,CAHzB,CAFI,CAOVyE,aAAc,CAAA,CAPJ,CAfS;AAyBrBqG,YAAa,CAEX,IAAAvG,QAAG,EAAG,CACJ,IAAM0J,ETxDIZ,CSwDO,CAAiB,IAAjB,CACXhD,EAAAA,CAAI4D,CAAJ5D,EAAgB4D,CAAAnD,YACtB,OAAajF,KAAAA,EAAN,GAAAwE,CAAA,CAAkBA,CAAlB,CDtGAwL,CCsGsB/K,YAAA,CAAuB,IAAvB,CAHzB,CAFK,CAOXrG,aAAc,CAAA,CAPH,CAzBQ,CAmCrBoI,gBAAiB,CAEf,IAAAtI,QAAG,EAAG,CACJ,IAAM0J,ETlEIZ,CSkEO,CAAiB,IAAjB,CACXhD,EAAAA,CAAI4D,CAAJ5D,EAAgB4D,CAAApB,gBACtB,OAAahH,KAAAA,EAAN,GAAAwE,CAAA,CAAkBA,CAAlB,CDhHAwL,CCgHsBhJ,gBAAA,CAA2B,IAA3B,CAHzB,CAFS,CAOfpI,aAAc,CAAA,CAPC,CAnCI,CA8CrBsQ,mBAAoB,CAIlB,IAAAxQ,QAAG,EAAG,CACJ,IAAM0J,ET/EIZ,CS+EO,CAAiB,IAAjB,CACjB,IAAIY,CAAJ,EAAyCpI,IAAAA,EAAzC,GAAgBoI,CAAAnD,YAAhB,CAAoD,CAElD,IADItB,CACJ,CADQ,IAAAsB,YACR,CAAOtB,CAAP,EAAYA,CAAA7H,SAAZ,GAA2BC,IAAAC,aAA3B,CAAA,CACE2H,CAAA,CAAIA,CAAAsB,YAEN,OAAOtB,EAL2C,CAOlD,MDnIKqM,ECmIEd,mBAAA,CAA8B,IAA9B,CATL,CAJY,CAgBlBtQ,aAAc,CAAA,CAhBI,CA9CC,CAiErBqQ,uBAAwB,CAItB,IAAAvQ,QAAG,EAAG,CACJ,IAAM0J;ATlGIZ,CSkGO,CAAiB,IAAjB,CACjB,IAAIY,CAAJ,EAA6CpI,IAAAA,EAA7C,GAAgBoI,CAAApB,gBAAhB,CAAwD,CAEtD,IADIrD,CACJ,CADQ,IAAAqD,gBACR,CAAOrD,CAAP,EAAYA,CAAA7H,SAAZ,GAA2BC,IAAAC,aAA3B,CAAA,CACE2H,CAAA,CAAIA,CAAAqD,gBAEN,OAAOrD,EAL+C,CAOtD,MDtJKqM,ECsJEf,uBAAA,CAAkC,IAAlC,CATL,CAJgB,CAgBtBrQ,aAAc,CAAA,CAhBQ,CAjEH,CA/DvB,CAqJa6R,GAAoB,CAC/BC,UAAW,CAIT,IAAAhS,QAAG,EAAG,CACJ,MAAO,KAAAW,aAAA,CAAkB,OAAlB,CAAP,EAAqC,EADjC,CAJG,CAUT,IAAAoO,QAAG,CAAC9P,CAAD,CAAQ,CACT,IAAAF,aAAA,CAAkB,OAAlB,CAA2BE,CAA3B,CADS,CAVF,CAaTiB,aAAc,CAAA,CAbL,CADoB,CArJjC,CAyMI+R,GAAkB,CAEpB5S,WAAY,CAIV,IAAAW,QAAG,EAAG,CAEJ,GR5MUyJ,CQ4MN,CAAkC,IAAlC,CAAJ,CAA6C,CAC3C,IAAMC,ET/KEZ,CS+KS,CAAiB,IAAjB,CACjB,IAAI,CAACY,CAAArK,WAAL,CAA0B,CACxBqK,CAAArK,WAAA,CAAsB,EACtB,KAAK,IAAI4F,EAAE,IAAAjI,WAAX,CAA4BiI,CAA5B,CAA+BA,CAA/B,CAAiCA,CAAAsB,YAAjC,CACEmD,CAAArK,WAAA8L,KAAA,CAAyBlG,CAAzB,CAHsB,CAM1B,IAAA5F,EAAaqK,CAAArK,WAR8B,CAA7C,IAUEA,EAAA;ADpOKiS,CCoOQjS,WAAA,CAAsB,IAAtB,CAEfA,EAAA6S,KAAA,CAAkBC,QAAQ,CAACC,CAAD,CAAQ,CAChC,MAAO/S,EAAA,CAAW+S,CAAX,CADyB,CAGlC,OAAO/S,EAjBH,CAJI,CAuBVa,aAAc,CAAA,CAvBJ,CAFQ,CA4BpBmS,kBAAmB,CAEjB,IAAArS,QAAG,EAAG,CACJ,MAAO,KAAAyQ,SAAAtU,OADH,CAFW,CAKjB+D,aAAc,CAAA,CALG,CA5BC,CAoCpBlD,WAAY,CAEV,IAAAgD,QAAG,EAAG,CACJ,IAAM0J,ET7MIZ,CS6MO,CAAiB,IAAjB,CACXhD,EAAAA,CAAI4D,CAAJ5D,EAAgB4D,CAAA1M,WACtB,OAAasE,KAAAA,EAAN,GAAAwE,CAAA,CAAkBA,CAAlB,CD3PAwL,CC2PsBtU,WAAA,CAAsB,IAAtB,CAHzB,CAFI,CAOVkD,aAAc,CAAA,CAPJ,CApCQ,CA8CpBqI,UAAW,CAET,IAAAvI,QAAG,EAAG,CACJ,IAAM0J,ETvNIZ,CSuNO,CAAiB,IAAjB,CACXhD,EAAAA,CAAI4D,CAAJ5D,EAAgB4D,CAAAnB,UACtB,OAAajH,KAAAA,EAAN,GAAAwE,CAAA,CAAkBA,CAAlB,CDrQAwL,CCqQsB/I,UAAA,CAAqB,IAArB,CAHzB,CAFG,CAOTrI,aAAc,CAAA,CAPL,CA9CS,CAwDpBhB,YAAa,CAIX,IAAAc,QAAG,EAAG,CACJ,GRjQUyJ,CQiQN,CAAkC,IAAlC,CAAJ,CAA6C,CAE3C,IADA,IAAI6I,EAAK,EAAT,CACS3S,EAAI,CADb,CACgB4S,EAAK,IAAAlT,WADrB,CACsCuP,CAAtC,CAA0CA,CAA1C,CAA8C2D,CAAA,CAAG5S,CAAH,CAA9C,CAAsDA,CAAA,EAAtD,CACMiP,CAAAxR,SAAJ,GAAmBC,IAAAoS,aAAnB;AACE6C,CAAAnH,KAAA,CAAQyD,CAAA1P,YAAR,CAGJ,OAAOoT,EAAAE,KAAA,CAAQ,EAAR,CAPoC,CAS3C,MDxRKlB,ECwREpS,YAAA,CAAuB,IAAvB,CAVL,CAJK,CAqBX,IAAA6P,QAAG,CAACjO,CAAD,CAAO,CACR,GAAoB,WAApB,GAAI,MAAOA,EAAX,EAA4C,IAA5C,GAAmCA,CAAnC,CACEA,CAAA,CAAO,EAET,QAAQ,IAAA1D,SAAR,EACE,KAAKC,IAAAC,aAAL,CACA,KAAKD,IAAAuI,uBAAL,CACE,GAAI,CRxRE6D,CQwRD,CAAkC,IAAlC,CAAL,EAAgDL,EAAhD,CAAgE,CAE9D,IAAMpM,EAAa,IAAAA,WACnB,EAAIA,CAAJ,EAAkB,IAAAuL,UAAlB,EACGvL,CADH,EACiBA,CAAAI,SADjB,EACwCC,IAAAkS,UADxC,GAEEkC,EAAA,CAAU,IAAV,CAEFgB,EAAAA,GAAAvT,YAAA6P,IAAAvH,KAAA,CAAqC,IAArC,CAA2C1G,CAA3C,CAP8D,CAAhE,IASE2Q,GAAA,CAAU,IAAV,CAEA,EAAkB,CAAlB,CAAI3Q,CAAA3E,OAAJ,EAAuB,IAAAiB,SAAvB,GAAyCC,IAAAC,aAAzC,GACE,IAAA0E,YAAA,CAAiBlH,QAAAgQ,eAAA,CAAwBhK,CAAxB,CAAjB,CAGJ,MACF,SAEE,IAAA+P,UAAA,CAAiB/P,CArBrB,CAJQ,CArBC,CAkDXZ,aAAc,CAAA,CAlDH,CAxDO,CA8GpBmQ,kBAAmB,CAIjB,IAAArQ,QAAG,EAAG,CACJ,IAAM0J;ATzRIZ,CSyRO,CAAiB,IAAjB,CACjB,IAAIY,CAAJ,EAAwCpI,IAAAA,EAAxC,GAAgBoI,CAAA1M,WAAhB,CAAmD,CAEjD,IADIiI,CACJ,CADQ,IAAAjI,WACR,CAAOiI,CAAP,EAAYA,CAAA7H,SAAZ,GAA2BC,IAAAC,aAA3B,CAAA,CACE2H,CAAA,CAAIA,CAAAsB,YAEN,OAAOtB,EAL0C,CAOjD,MD7UKqM,EC6UEjB,kBAAA,CAA6B,IAA7B,CATL,CAJW,CAgBjBnQ,aAAc,CAAA,CAhBG,CA9GC,CAiIpBoQ,iBAAkB,CAIhB,IAAAtQ,QAAG,EAAG,CACJ,IAAM0J,ET5SIZ,CS4SO,CAAiB,IAAjB,CACjB,IAAIY,CAAJ,EAAuCpI,IAAAA,EAAvC,GAAgBoI,CAAAnB,UAAhB,CAAkD,CAEhD,IADItD,CACJ,CADQ,IAAAsD,UACR,CAAOtD,CAAP,EAAYA,CAAA7H,SAAZ,GAA2BC,IAAAC,aAA3B,CAAA,CACE2H,CAAA,CAAIA,CAAAqD,gBAEN,OAAOrD,EALyC,CAOhD,MDhWKqM,ECgWEhB,iBAAA,CAA4B,IAA5B,CATL,CAJU,CAgBhBpQ,aAAc,CAAA,CAhBE,CAjIE,CAoJpBuQ,SAAU,CAIR,IAAAzQ,QAAG,EAAG,CAGF,IAAAyQ,ER/VQhH,CQ8VN,CAAkC,IAAlC,CAAJ,CACa2D,KAAAhG,UAAAkG,OAAA9F,KAAA,CAA4B,IAAAnI,WAA5B,CAA6C,QAAQ,CAAC4F,CAAD,CAAI,CAClE,MAAQA,EAAA7H,SAAR,GAAuBC,IAAAC,aAD2C,CAAzD,CADb;AD5WOgU,CCiXMb,SAAA,CAAoB,IAApB,CAEbA,EAAAyB,KAAA,CAAgBQ,QAAQ,CAACN,CAAD,CAAQ,CAC9B,MAAO3B,EAAA,CAAS2B,CAAT,CADuB,CAGhC,OAAO3B,EAZH,CAJE,CAkBRvQ,aAAc,CAAA,CAlBN,CApJU,CA0KpBwE,UAAW,CAIT,IAAA1E,QAAG,EAAG,CACJ,MRnXUyJ,EQmXN,CAAkC,IAAlC,CAAJ,CJrRUyF,EIwRD,CAF4B,UAAnB1Q,GAAA,IAAA1B,UAAA0B,CACmB,IAADA,QADlBA,CACmC,IAC5C,CAHT,CDjYO8S,CCsYE5M,UAAA,CAAqB,IAArB,CANL,CAJG,CAgBT,IAAAqK,QAAG,CAACjO,CAAD,CAAO,CACR,IAAMtC,EAA6B,UAAnB,GAAA,IAAA1B,UAAA,CACqB,IAAD0B,QADpB,CACqC,IACrDiT,GAAA,CAAUjT,CAAV,CACA,KAAImU,EAAgB,IAAA7V,UAEf6V,EAAL,EAAwC,UAAxC,GAAsBA,CAAtB,GACEA,CADF,CACkB,KADlB,CAGMC,EAAAA,CAAgBlB,EAAA9S,cAAA,CAAuB+T,CAAvB,CAMtB,KALIvJ,EAAJ,CACEqJ,CAAAA,GAAA/N,UAAAqK,IAAAvH,KAAA,CAAmCoL,CAAnC,CAAkD9R,CAAlD,CADF,CAGE8R,CAAAlO,UAHF,CAG4B5D,CAE5B,CAAO8R,CAAA5V,WAAP,CAAA,CACEwB,CAAAwD,YAAA,CAAoB4Q,CAAA5V,WAApB,CAhBM,CAhBD,CAmCTkD,aAAc,CAAA,CAnCL,CA1KS,CAzMtB,CA8ZW2S,GAAqB,CAE9BC,WAAY,CAIV,IAAA9S,QAAG,EAAG,CACJ,IAAM0J,ETlYIZ,CSkYO,CAAiB,IAAjB,CACjB,OAAOY,EAAP,EAAmBA,CAAA7B,GAAnB;AAA0C,IAFtC,CAJI,CAQV3H,aAAc,CAAA,CARJ,CAFkB,CA9ZhC,CA+aW6S,GAAwB,CAEjCC,cAAe,CAIb,IAAAhT,QAAG,EAAG,CAraN,IAAA,EADE6R,EAAJ,EAAqCA,EAAA7R,IAArC,CACS6R,EAAA7R,IAAAwH,KAAA,CAAuC1M,QAAvC,CADT,CR3BSiO,CQ6BGK,EAAL,CAH2B,IAAA,EAG3B,CACEtO,QAAAkY,cAST,IAAKC,CAAL,EAAgBA,CAAA7V,SAAhB,CAAA,CAGA,IAAIuM,EAAc,CAAC,CRpBLA,CQoBO,CAwZWxM,IAxZX,CACrB,IAuZgCA,IAvZhC,GAAarC,QAAb,EAGO6O,CAHP,EAuZgCxM,IA9Y1BuG,KATN,GASoBuP,CATpB,EAUOC,CAAAA,SAAA1L,KAAA,CA6YyBrK,IA7YLuG,KAApB,CAA+BuP,CAA/B,CAVP,CAAA,CAkBA,IADIE,CACJ,CRnCcrJ,CQkCG,CAA4BmJ,CAA5B,CACjB,CAAOE,CAAP,EAAqBA,CAArB,GAqYgChW,IArYhC,CAAA,CACE8V,CACA,CADSE,CAAAzP,KACT,CAAAyP,CAAA,CRrCYrJ,CQqCC,CAA4BmJ,CAA5B,CAEf,EAAA,CAiYgC9V,IAjYhC,GAAarC,QAAb,CAESqY,CAAA,CAAa,IAAb,CAAoBF,CAF7B,CAMSE,CAAA,GA2XuBhW,IA3XvB,CAAsB8V,CAAtB,CAA+B,IA5BxC,CAAA,IAWI,EAAA,CAAO,IAfX,CAAA,IACE,EAAA,CAAO,IA0ZL,OAAO,EADH,CAJO,CAUb,IAAAlE,QAAG,EAAG,EAVO,CAWb7O,aAAc,CAAA,CAXD,CAFkB,CAyBnCkT;QAASA,EAAkB,CAACxJ,CAAD,CAAMyJ,CAAN,CAAmBC,CAAnB,CAA0B,CACnD,IAAKvJ,IAAIA,CAAT,GAAcsJ,EAAd,CAA2B,CACzB,IAAIE,EAAUzT,MAAAqH,yBAAA,CAAgCyC,CAAhC,CAAqCG,CAArC,CACTwJ,EAAL,EAAgBA,CAAArT,aAAhB,EACG,CAACqT,CADJ,EACeD,CADf,CAEExT,MAAAC,eAAA,CAAsB6J,CAAtB,CAA2BG,CAA3B,CAA8BsJ,CAAA,CAAYtJ,CAAZ,CAA9B,CAFF,CAGWuJ,CAHX,EAIE5D,OAAA8D,KAAA,CAAa,kBAAb,CAAiCzJ,CAAjC,CAAoC,IAApC,CAA0CH,CAA1C,CANuB,CADwB,CAa9C6J,QAASA,EAAc,CAACzC,CAAD,CAAQ,CACpCoC,CAAA,CAAmBpC,CAAnB,CAA0Bc,EAA1B,CACAsB,EAAA,CAAmBpC,CAAnB,CAA0Be,EAA1B,CACAqB,EAAA,CAAmBpC,CAAnB,CAA0BiB,EAA1B,CACAmB,EAAA,CAAmBpC,CAAnB,CAA0B+B,EAA1B,CAJoC;AAO/BW,QAASA,GAAwB,EAAQ,CAAP1C,IAAAA,ECxc5B2C,ECqScvM,UFoKzB4J,EAAA4C,UAAA,CAAkBzF,gBAAA/G,UAElBgM,EAAA,CAAmBpC,CAAnB,CAA0Bc,EAA1B,CAA4C,CAAA,CAA5C,CACAsB,EAAA,CAAmBpC,CAAnB,CAA0BiB,EAA1B,CAA2C,CAAA,CAA3C,CACAmB,EAAA,CAAmBpC,CAAnB,CAA0B+B,EAA1B,CAAiD,CAAA,CAAjD,CAGAjT,OAAA+T,iBAAA,CAAwB7C,CAAxB,CAA+B,CAC7B5T,SAAU,CACR6B,MAAO5B,IAAAuI,uBADC,CAER1F,aAAc,CAAA,CAFN,CADmB,CAK7B4T,SAAU,CACR7U,MAAO,oBADC,CAERiB,aAAc,CAAA,CAFN,CALmB,CAS7B2Q,UAAW,CACT5R,MAAO,IADE,CAETiB,aAAc,CAAA,CAFL,CATkB,CAA/B,CAeA,EACE,WADF,CAEE,cAFF,CAGE,QAHF,CAAA9D,QAAA,CAIU,QAAA,CAAC2X,CAAD,CAAU,CAClBjU,MAAAC,eAAA,CAAsBiR,CAAtB,CAA6B+C,CAA7B,CAAmC,CACjC9U,MAAOqC,IAAAA,EAD0B,CAEjCpB,aAAc,CAAA,CAFmB,CAAnC,CADkB,CAJpB,CAWA,EACE,eADF,CAEE,SAFF,CAGE,aAHF,CAAA9D,QAAA,CAIU,QAAA,CAAC2X,CAAD,CAAU,CAClBjU,MAAAC,eAAA,CAAsBiR,CAAtB,CAA6B+C,CAA7B,CAAmC,CACjC,IAAA/T,QAAG,EAAG,CACJ,MAAO,KAAA0D,KAAA,CAAUqQ,CAAV,CADH,CAD2B;AAIjC7T,aAAc,CAAA,CAJmB,CAAnC,CADkB,CAJpB,CAlC8C,CAiDzC,IAAI8T,GRzhBAjL,CQyhB+BK,EAAA,CACxC,QAAQ,EAAG,EAD6B,CACxB,QAAQ,CAAC/N,CAAD,CAAU,CAChC,IAAMgR,ETnfMzD,CSmfD,CAAuBvN,CAAvB,CACNgR,EAAA3D,EAAL,GACE2D,CAAA3D,EAEA,CAFwB,CAAA,CAExB,CADA0K,CAAA,CAAmB/X,CAAnB,CAA4ByW,EAA5B,CAA8C,CAAA,CAA9C,CACA,CAAAsB,CAAA,CAAmB/X,CAAnB,CAA4B0W,EAA5B,CAA+C,CAAA,CAA/C,CAHF,CAFgC,CAD7B,CAWIkC,GRpiBAlL,CQoiB8BK,EAAA,CACvC,QAAQ,EAAG,EAD4B,CACvB,QAAQ,CAAC/N,CAAD,CAAU,CT7fpBuN,CS8fDyD,CAAuBhR,CAAvBgR,CACN5D,GAAL,GACE2K,CAAA,CAAmB/X,CAAnB,CAA4B4W,EAA5B,CAA6C,CAAA,CAA7C,CACA,CAAAmB,CAAA,CAAmB/X,CAAnB,CAA4BwX,EAA5B,CAAgD,CAAA,CAAhD,CAFF,CAFgC,C,CGliB7B,IAAA,GJAMvB,CIAN,WAwBP4C,SAASA,GAAQ,CAAC/W,CAAD,CAAOmO,CAAP,CAAkB6I,CAAlB,CAA4B,CH8flCH,EG7fT,CAA6B7W,CAA7B,CACAgX,EAAA,CAAWA,CAAX,EAAuB,IACvB,KAAMzK,EZUQd,CYVG,CAAuBzL,CAAvB,CAAjB,CACMiX,EZSQxL,CYTQ,CAAuB0C,CAAvB,CADtB,CAEM+I,EAAeF,CAAA,CZQPvL,CYRkB,CAAuBuL,CAAvB,CAAX,CAA8C,IAEnEzK,EAAApB,gBAAA,CAA2B6L,CAAA,CAAWE,CAAA/L,gBAAX,CACzBgD,CAAA/C,UAEF,IADI+L,CACJ,CZUcxL,CYXJ,CAAiBY,CAAApB,gBAAjB,CACV,CACEgM,CAAA/N,YAAA,CAAkBpJ,CAIpB,IADIoX,CACJ,CZKczL,CYNJ,CAAiBY,CAAAnD,YAAjB,CAAwC4N,CAAxC,CACV,CACEI,CAAAjM,gBAAA,CAAsBnL,CAGxBuM,EAAAjO,WAAA,CAAsB6P,CAClB6I,EAAJ,CACMA,CADN,GACmBC,CAAApX,WADnB,GAEIoX,CAAApX,WAFJ,CAE+BG,CAF/B,GAKEiX,CAAA7L,UACA,CAD0BpL,CAC1B,CAAKiX,CAAApX,WAAL,GACEoX,CAAApX,WADF,CAC6BG,CAD7B,CANF,CAWAiX,EAAA/U,WAAA,CAA2B,IA/BgB;AA8DfmV,QAAA,GAAQ,CAACrX,CAAD,CAAOgQ,CAAP,CAAc,CAClD,IAAMzD,EZlDQd,CYkDG,CAAuBzL,CAAvB,CACjB,IAA4BmE,IAAAA,EAA5B,GAAIoI,CAAA1M,WAAJ,CAKE,IAJMmS,CAIGxP,CAJEwN,CAIFxN,EAJWN,EAAA,CAAWlC,CAAX,CAIXwC,CAHT+J,CAAA1M,WAGS2C,CAHawP,CAAA,CAAG,CAAH,CAGbxP,EAHsB,IAGtBA,CAFT+J,CAAAnB,UAES5I,CAFYwP,CAAA,CAAGA,CAAAhT,OAAH,CAAa,CAAb,CAEZwD,EAF+B,IAE/BA,CHocFsU,EGrcP,CAA4B9W,CAA5B,CACSwC,CAAAA,CAAAA,CAAE,CAAX,CAAcA,CAAd,CAAgBwP,CAAAhT,OAAhB,CAA2BwD,CAAA,EAA3B,CAAgC,CAC9B,IAAMsF,EAAIkK,CAAA,CAAGxP,CAAH,CAAV,CACM0M,EZ1DIzD,CY0DC,CAAuB3D,CAAvB,CACXoH,EAAA5Q,WAAA,CAAgB0B,CAChBkP,EAAA9F,YAAA,CAAiB4I,CAAA,CAAGxP,CAAH,CAAK,CAAL,CAAjB,EAA4B,IAC5B0M,EAAA/D,gBAAA,CAAqB6G,CAAA,CAAGxP,CAAH,CAAK,CAAL,CAArB,EAAgC,IHob3BqU,GGnbL,CAA6B/O,CAA7B,CAN8B,CAPgB,C,CCpF7C,IAAA,GLFMqM,CKEN,WAYAhL;QAASA,GAAY,CAACmO,CAAD,CAAStX,CAAT,CAAegX,CAAf,CAAyB,CACnD,GAAIhX,CAAJ,GAAasX,CAAb,CACE,KAAM7E,MAAA,CAAM,uFAAN,CAAN,CAEF,GAAIuE,CAAJ,CAAc,CACZ,IAAMO,EbyBM5L,CazBI,CAAiBqL,CAAjB,CACVpK,EAAAA,CAAI2K,CAAJ3K,EAAe2K,CAAAjZ,WACrB,IAAW6F,IAAAA,EAAX,GAAKyI,CAAL,EAAwBA,CAAxB,GAA8B0K,CAA9B,EACSnT,IAAAA,EADT,GACGyI,CADH,EACsBtO,EAAA,CAAW0Y,CAAX,CADtB,GAC+CM,CAD/C,CAEE,KAAM7E,MAAA,CAAM,+HAAN,CAAN,CALU,CASd,GAAIuE,CAAJ,GAAiBhX,CAAjB,CACE,MAAOA,EAGLA,EAAA1B,WAAJ,EAGE+R,EAAA,CAAYrQ,CAAA1B,WAAZ,CAA6B0B,CAA7B,CAGF,KACIwX,CADJ,CAEIC,CACJ,IAAI,CAACzX,CAAA,mBAAL,CAAiC,CAElB,GAAAwX,CAAA,CADbA,CACa,CZnBD7K,CYkBA,CAA4B2K,CAA5B,CACC,CAAA,CA2Cf,IAAII,CACmB,OAAvB,GA5C4B1X,CA4CxBL,UAAJ,CACE+X,CADF,CACU,CA7CkB1X,CA6ClB,CADV,CA5C4BA,CA8CjBmC,iBAFX;CAGEuV,CAHF,CA5C4B1X,CA+ClBmC,iBAAA,CAAsB,MAAtB,CAHV,CAME,EAAA,CADEuV,CAAJ,EAAaA,CAAA1Y,OAAb,CACS0Y,CADT,CAPgC,IAAA,EA1CjB,CACTD,CAAJ,GACED,CHkTF,CGlTEA,CHkTF,CGlTsBC,CHkTtB,CGlTsBA,CHkTtB,CADAE,CANAC,EAOA,CADAD,CANqBC,EAOrB,EAP2C,EAO3C,CADAD,CALAE,EAMA,CADAF,CALiBE,EAMjB,EANmC,EAMnC,CADAF,CAJAG,EAKA,CADAH,CAJgBG,EAKhB,EALiC,EAKjC,CAAA,CAAAF,EAAA5J,KAAA,MAAA,CAAA,CAAA4J,EAAA,CAAA,EAAA,OAAA,CAA2BF,CI9U7B,WAAwB,MAAxB,CJ8U6BA,CI9U7B,CAGSK,EAAA,CAA0BC,EAAA,CJ2UNN,CI3UM,CAA1B,CJ2UP,CAAA,CGnTA,CAH+B,CAQjC,CAAyB,MAAzB,GAAIJ,CAAA3X,UAAJ,EAAmC8X,CAAnC,IACED,CADF,CACcA,CADd,EZzBc7K,CY0Ba,CAA4B2K,CAA5B,CAD3B,GAGIW,CAAA,CAAAT,CAAA,CAGJ,IZxCclL,CYwCV,CAAkCgL,CAAlC,CAAJ,CAA+C,CACAN,CAAAA,CAAAA,CJ0etCF,GG9hBT,CCoDuCQ,CDpDvC,CACML,EAAAA,CZiCQxL,CYjCQ,CCmDiB6L,CDnDjB,CACWnT,KAAAA,EAAjC,GAAI8S,CAAApX,WAAJ,GACEoX,CAAA/U,WADF,CAC6B,IAD7B,CAIA,IC8CiClC,CD9C7BC,SAAJ,GAAsBC,IAAAuI,uBAAtB,CAAmD,CAC7CuJ,CAAAA,CC6C2BhS,CD7CtBkC,WACT,KAASM,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkBwP,CAAAhT,OAAlB,CAA6BwD,CAAA,EAA7B,CACEuU,EAAA,CAAS/E,CAAA,CAAGxP,CAAH,CAAT,CC2CmC8U,CD3CnC,CAA2BN,CAA3B,CAGIzK,EAAAA,CZsBMd,CYtBK,CCwCczL,CDxCd,CACbkY,EAAAA,CAAmC/T,IAAAA,EAAzB,GAACoI,CAAA1M,WAAD,CAAsC,IAAtC,CAA6CsE,IAAAA,EAC3DoI,EAAA1M,WAAA,CAAsB0M,CAAAnB,UAAtB,CAA2C8M,CAC3C3L,EAAArK,WAAA,CAAsBgW,CAT2B,CAAnD,IAWEnB,GAAA,CCmC+B/W,CDnC/B,CCmCqCsX,CDnCrC,CAA0BN,CAA1B,CCsCMmB,EAAAA,CbdMxM,CacO,CAAiB2L,CAAjB,CACnB,IAAIc,EAAA,CAAsBd,CAAtB,CAAJ,CAAmC,CACjCW,CAAA,CAAAE,CAAAxN,KAAA,CACA;IAAA0N,EAAsB,CAAA,CAFW,CAAnC,IAKWF,EAAAxN,KAAJ,GACL0N,CADK,CACiB,CAAA,CADjB,CAVsC,CAc1CA,CAAL,GAEMlK,CAGJ,CZtDY3B,CYmDI,CAAkB8K,CAAlB,CAAA,CACYA,CAAD/Q,KADX,CAC2B+Q,CAE3C,CAAIN,CAAJ,EACEA,CACA,CADWsB,EAAA,CAAkBtB,CAAlB,CACX,CAAAuB,CAAApP,aAAAkB,KAAA,CAAgC8D,CAAhC,CAA2CnO,CAA3C,CAAiDgX,CAAjD,CAFF,EAIEuB,CAAA1T,YAAAwF,KAAA,CAA+B8D,CAA/B,CAA0CnO,CAA1C,CATJ,CAYAwY,GAAA,CAAiBlB,CAAjB,CAAyBtX,CAAzB,CACA,OAAOA,EAnE4C;AAyF9CqQ,QAASA,GAAW,CAACiH,CAAD,CAAStX,CAAT,CAAe,CACxC,GAAIA,CAAA1B,WAAJ,GAAwBgZ,CAAxB,CACE,KAAM7E,MAAA,CAAM,sDAAN,CACJzS,CADI,CAAN,CAGF,IACIwX,EZtFU7K,CYsFE,CAA4B3M,CAA5B,CADhB,CAGMmY,EbnEQxM,CamEK,CAAiB2L,CAAjB,CACnB,IZlGchL,CYkGV,CAAkCgL,CAAlC,CAAJ,CAA+C,CDrD/C,IAAM/K,EZtBQd,CYsBG,CCsDezL,CDtDf,CAAjB,CACMiX,EZvBQxL,CYuBQ,CCqDgB6L,CDrDhB,CCqDUtX,EDpDhC,GAAaiX,CAAApX,WAAb,GACEoX,CAAApX,WADF,CAC6B0M,CAAAnD,YAD7B,CCoDgCpJ,EDjDhC,GAAaiX,CAAA7L,UAAb,GACE6L,CAAA7L,UADF,CAC4BmB,CAAApB,gBAD5B,CAGA,KAAIyB,EAAIL,CAAApB,gBAAR,CACIrD,EAAIyE,CAAAnD,YACJwD,EAAJ,GZhCcnB,CYiCZ,CAAuBmB,CAAvB,CAAAxD,YADF,CAC0CtB,CAD1C,CAGIA,EAAJ,GZnCc2D,CYoCZ,CAAuB3D,CAAvB,CAAAqD,gBADF,CAC8CyB,CAD9C,CAMAL,EAAAjO,WAAA,CAAsBiO,CAAApB,gBAAtB,CACAoB,CAAAnD,YADA,CACuBjF,IAAAA,EACUA,KAAAA,EAAjC,GAAI8S,CAAA/U,WAAJ,GAEE+U,CAAA/U,WAFF,CAE6B,IAF7B,CCkCE,IAAIkW,EAAA,CAAsBd,CAAtB,CAAJ,CAAmC,CACjCW,CAAA,CAAAE,CAAAxN,KAAA,CACA,KAAA8N,EAAsB,CAAA,CAFW,CAFU,CAO/CC,EAAA,CAAqB1Y,CAArB,CAEA,IAAIwX,CAAJ,CAAe,CAEb,CADImB,CACJ,CADwBrB,CACxB,EADuD,MACvD,GADkCA,CAAA3X,UAClC;CACE8Y,CADF,CACwB,CAAA,CADxB,CH+SA,IG5SyBjB,CH4SpBK,EAAL,CAAA,CAGAe,EAAA,CG/SyBpB,CH+SzB,CAEM3H,EAAAA,CGjTmB2H,CHiTbM,EACZ,KAAShQ,CAAT,GAAc+H,EAAd,CAEE,IADI6H,CACKlV,CADGqN,CAAA,CAAI/H,CAAJ,CACHtF,CAAAA,CAAAA,CAAE,CAAX,CAAcA,CAAd,CAAkBkV,CAAA1Y,OAAlB,CAAgCwD,CAAA,EAAhC,CAAqC,CACnC,IAAIqW,EAAOnB,CAAA,CAAMlV,CAAN,CACX,ITzUQ0L,ESyUJ,CGtTiDlO,CHsTjD,CAA0B6Y,CAA1B,CAAJ,CAAqC,CACnCnB,CAAAoB,OAAA,CAAatW,CAAb,CAAgB,CAAhB,CACMuW,KAAAA,EGxTavB,CHwTTK,EAAApS,QAAA,CAAuBoT,CAAvB,CACD,EAAT,EAAIE,CAAJ,EGzTmBvB,CH0TjBK,EAAAiB,OAAA,CAAsBC,CAAtB,CAAyB,CAAzB,CAEFvW,EAAA,EAiCA6P,EAAAA,CV/aM1G,CU+aC,CAhCoBkN,CAgCpB,CAEb,IADIlR,CACJ,CADS0K,CAAAxH,EACT,CACE,IAAK,IAAIrI,EAAE,CAAX,CAAcA,CAAd,CAAgBmF,CAAA3I,OAAhB,CAA2BwD,CAAA,EAA3B,CAAgC,CAC9B,IAAIxC,EAAO2H,CAAA,CAAGnF,CAAH,CAAX,CACI8U,EAAShZ,EAAA,CAAW0B,CAAX,CACTsX,EAAJ,EACEjH,CAAAA,YAAAhG,KAAA,CAAiBiN,CAAjB,CAAyBtX,CAAzB,CAJ4B,CAQlCqS,CAAAxH,EAAA,CAAsB,EACtBwH,EAAApH,cAAA,CAAqB,EA3Cf+N,EAAA,CAAY,CAAA,CARuB,CAFF,CAcvC,IAAA,EAAOA,CAtBP,CAAA,IAD+B,EAAA,CAAA,IAAA,EG1S/B,EAAIC,CAAJ,EAA8BN,CAA9B,GACEV,CAAA,CAAAT,CAAA,CAPW,CAUViB,CAAL,GAEMtK,CAOJ,CZzHY3B,CYkHI,CAAkB8K,CAAlB,CAAA,CACYA,CAAD/Q,KADX,CAEd+Q,CAKF,EAAM3M,CAAAwN,CAAAxN,KAAN,EAA4C,MAA5C,GAAyB3K,CAAAL,UAAzB,EACGwO,CADH,GACiB7P,EAAA,CAAW0B,CAAX,CADjB,GAEEuY,CAAAlI,YAAAhG,KAAA,CAA+B8D,CAA/B,CAA0CnO,CAA1C,CAXJ,CAcAwY,GAAA,CAAiBlB,CAAjB,CAAyB,IAAzB,CAA+BtX,CAA/B,CACA,OAAOA,EA3CiC;AA8C1C0Y,QAASA,GAAoB,CAAC1Y,CAAD,CAAO,CAelC,IAAMuM,EbxHQZ,CawHG,CAbM3L,CAaN,CAbjB,IAceuM,CAdf,EAcuDpI,IAAAA,EAdvD,GAc2BoI,CAAAlB,EAd3B,CAA8B,CACxB2G,CAAAA,CAAKhS,CAAAkC,WACT,KAF4B,IAEnBM,EAAE,CAFiB,CAEdmG,EAAEqJ,CAAAhT,OAFY,CAED8I,CAA3B,CAA+BtF,CAA/B,CAAiCmG,CAAjC,GAAwCb,CAAxC,CAA0CkK,CAAA,CAAGxP,CAAH,CAA1C,EAAkDA,CAAA,EAAlD,CACEkW,EAAA,CAAqB5Q,CAArB,CAH0B,CAO9B,GADMyE,CACN,CblHcZ,CaiHG,CAAiB3L,CAAjB,CACjB,CACEuM,CAAAlB,EAAA,CAA0BlH,IAAAA,EAVM,CA0BpCmU,QAASA,GAAiB,CAACtY,CAAD,CAAO,CAC/B,IAAIkZ,EAAWlZ,CACXA,EAAJ,EAA+B,MAA/B,GAAYA,CAAAL,UAAZ,GAGEuZ,CAHF,CAGa,CADLC,CACK,EAFL5M,CAEK,CbxICZ,CasIK,CAAiB3L,CAAjB,CAEN,GADmBuM,CAAA1B,EACnB,GAAasO,CAAAna,OAAb,CAAgCma,CAAA,CAAU,CAAV,CAAhC,CACTb,EAAA,CAAkBtY,CAAAoJ,YAAlB,CAJJ,CAMA,OAAO8P,EARwB,CAWjCd,QAASA,GAAqB,CAACpY,CAAD,CAAO,CAGnC,OADI2K,CACJ,EAFM4B,CAEN,CbjJcZ,Ca+IG,CAAiB3L,CAAjB,CAEjB,GADuBuM,CAAA5B,KACvB,GAAgByO,EAAA,CAAAzO,CAAA,CAHmB;AAarC0O,QAASA,GAAyB,CAACrZ,CAAD,CAAO6B,CAAP,CAAa,CAC7C,GAAa,MAAb,GAAIA,CAAJ,CACQyV,CACN,CADetX,CAAA1B,WACf,CAAI8Z,EAAA,CAAsBd,CAAtB,CAAJ,EACEW,CAAA,Cb/JUtM,Ca+JV,CAAiB2L,CAAjB,CAAA3M,KAAA,CAHJ,KAKO,IAAuB,MAAvB,GAAI3K,CAAAL,UAAJ,EAA0C,MAA1C,GAAiCkC,CAAjC,GACD8I,CADC,CZtLOgC,CYuLD,CAA4B3M,CAA5B,CADN,EAEK,CHqPV,GGpPE2K,CHoPGkN,EAAL,CAAA,CAGA,IAAMyB,EGvPiBtZ,CHuPPuZ,GAAhB,CACM1X,EAAO2X,EAAA,CGxPUxZ,CHwPV,CACb,IAAI6B,CAAJ,GAAayX,CAAb,CAAA,CAII5B,CAAAA,CG7PF/M,CH6PUmN,EAAA,CAAcwB,CAAd,CACZ,KAAM9W,EAAIkV,CAAAjS,QAAA,CG9PazF,CH8Pb,CACD,EAAT,EAAIwC,CAAJ,EACEkV,CAAAoB,OAAA,CAAatW,CAAb,CAAgB,CAAhB,CAGEH,EAAAA,CGnQFsI,CHmQSmN,EAAA,CAAcjW,CAAd,CAAPQ,GGnQFsI,CHmQiCmN,EAAA,CAAcjW,CAAd,CAA/BQ,CAAqD,EAArDA,CACJA,EAAA2L,KAAA,CGpQuBhO,CHoQvB,CACkB,EAAlB,CAAIqC,CAAArD,OAAJ,GGrQE2L,CHsQAmN,EAAA,CAAcjW,CAAd,CADF,CACwB4X,EAAA,CAAgBpX,CAAhB,CADxB,CAZA,CALA,CGnPE4V,CAAA,CAAAtN,CAAA,CAFQ,CARiC,CAoB/C6N,QAASA,GAAgB,CAACxY,CAAD,CAAO0Z,CAAP,CAAkBC,CAAlB,CAA+B,CAGtD,GADMzO,CACN,EAFMqB,CAEN,CblLcZ,CagLG,CAAiB3L,CAAjB,CAEjB,GAD6BuM,CAAArB,EAC7B,CACMwO,CAMJ,EALExO,CAAAxB,WAAAsE,KAAA,CAAyB0L,CAAzB,CAKF,CAHIC,CAGJ,EAFEzO,CAAAyD,aAAAX,KAAA,CAA2B2L,CAA3B,CAEF,CAAA7K,EAAA,CAAA5D,CAAA,CAVoD;AAkBjDa,QAASA,GAAW,CAAC/L,CAAD,CAAgB,CACzC,GAAKA,CAAL,EAAcA,CAAAC,SAAd,CAAA,CAGA,IAAMsM,Eb5MQd,Ca4MG,CAAuBzL,CAAvB,CAAjB,CACI2K,EAAO4B,CAAAlB,EACElH,KAAAA,EAAb,GAAIwG,CAAJ,GZhOc6B,CYiOR,CAAkBxM,CAAlB,CAAJ,EACE2K,CACA,CADO3K,CACP,CAAAuM,CAAAlB,EAAA,CAA0BV,CAF5B,GAKEA,CAMA,CANO,CADH2M,CACG,CADMtX,CAAA1B,WACN,EAASyN,EAAA,CAAYuL,CAAZ,CAAT,CAA+BtX,CAMtC,CAAIuY,CAAArK,SAAA7D,KAAA,CAA4B1M,QAAAic,gBAA5B,CAAsD5Z,CAAtD,CAAJ,GACEuM,CAAAlB,EADF,CAC4BV,CAD5B,CAXF,CADF,CAkBA,OAAOA,EAvBP,CADyC,CAmCpCkP,QAASA,GAAK,CAAC7Z,CAAD,CAAO8Z,CAAP,CAAgBC,CAAhB,CAAwB,CAC3C,IAAI1X,EAAO,EACX2X,GAAA,CAAcha,CAAAkC,WAAd,CAA+B4X,CAA/B,CACEC,CADF,CACU1X,CADV,CAEA,OAAOA,EAJoC,CAO7C2X,QAASA,GAAa,CAACC,CAAD,CAAWH,CAAX,CAAoBC,CAApB,CAA4B1X,CAA5B,CAAkC,CACtD,IADsD,IAC7CG,EAAE,CAD2C,CACxCmG,EAAEsR,CAAAjb,OADsC,CACrByS,CAAjC,CAAqCjP,CAArC,CAAuCmG,CAAvC,GAA8C8I,CAA9C,CAAgDwI,CAAA,CAASzX,CAAT,CAAhD,EAA8DA,CAAA,EAA9D,CAAmE,CAC7D,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,SAAA,GAAA,IAAA,aAAA,CAAA,CACA,CAAA,CAAA,CAAA,KAAA,EAAA,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,CAAA,CAOF0X,EAASJ,CAAA,CAAQ9Z,CAAR,CACTka,EAAJ,EACE7X,CAAA2L,KAAA,CAAUhO,CAAV,CAEE+Z,EAAJ,EAAcA,CAAA,CAAOG,CAAP,CAAd,CACE,CADF,CACSA,CADT,EAGAF,EAAA,CAAcha,CAAAkC,WAAd,CAA+B4X,CAA/B,CACEC,CADF,CACU1X,CADV,CARiD,CAAA,CAAA,CAAA,IAAA,EAKjD,CAZM,CAAJ,GAAI,CAAJ,CAEE,KAH+D,CADb,CA4BxD,IAAI8X,GAAc,IAEXvY;QAASA,GAAY,CAAC5B,CAAD,CAAO2B,CAAP,CAAaG,CAAb,CAAoB,CACzCqY,EAAL,GACEA,EADF,CACgB3c,MAAA,SADhB,EACsCA,MAAA,SAAA,YADtC,CAGI2c,GAAJ,EAA4B,OAA5B,GAAmBxY,CAAnB,CACEwY,EAAA,gBAAA,CAA+Bna,CAA/B,CAAqC8B,CAArC,CADF,EAGEyW,CAAA3W,aAAAyI,KAAA,CAAgCrK,CAAhC,CAAsC2B,CAAtC,CAA4CG,CAA5C,CACA,CAAAuX,EAAA,CAA0BrZ,CAA1B,CAAgC2B,CAAhC,CAJF,CAJ8C,CAsCzC4O,QAASA,GAAU,CAACvQ,CAAD,CAAOoa,CAAP,CAAa,CACrC,GAAIpa,CAAA5B,cAAJ,GAA2BT,QAA3B,CACE,MAAO4a,EAAAhI,WAAAlG,KAAA,CAA8B1M,QAA9B,CAAwCqC,CAAxC,CAA8Coa,CAA9C,CAET,KAAItS,EAAIyQ,CAAAhI,WAAAlG,KAAA,CAA8B1M,QAA9B,CAAwCqC,CAAxC,CAA8C,CAAA,CAA9C,CACR,IAAIoa,CAAJ,CAAU,CACJpI,CAAAA,CAAKhS,CAAAkC,WACAM,EAAAA,CAAE,CAAX,KAAK,IAAS6X,CAAd,CAAkB7X,CAAlB,CAAsBwP,CAAAhT,OAAtB,CAAiCwD,CAAA,EAAjC,CACE6X,CACA,CADK9J,EAAA,CAAWyB,CAAA,CAAGxP,CAAH,CAAX,CAAkB,CAAA,CAAlB,CACL,CAAAsF,CAAAjD,YAAA,CAAcwV,CAAd,CAJM,CAOV,MAAOvS,EAZ8B,C,CEvVvC,IAAoBwS,GAAoB,iBAApBA,CAAsCC,IAAAC,IAAA,EAA1D,CAGIC,GAAiB,CACnB,KAAQ,CAAA,CADW,CAEnB,MAAS,CAAA,CAFU,CAGnB,QAAW,CAAA,CAHQ,CAInB,SAAY,CAAA,CAJO,CAKnB,MAAS,CAAA,CALU,CAMnB,SAAY,CAAA,CANO,CAOnB,UAAa,CAAA,CAPM,CAQnB,WAAc,CAAA,CARK,CASnB,WAAc,CAAA,CATK,CAUnB,UAAa,CAAA,CAVM,CAWnB,SAAY,CAAA,CAXO,CAYnB,UAAa,CAAA,CAZM,CAanB,QAAW,CAAA,CAbQ,CAcnB,MAAS,CAAA,CAdU,CAenB,YAAe,CAAA,CAfI,CAgBnB,MAAS,CAAA,CAhBU,CAiBnB,QAAW,CAAA,CAjBQ,CAkBnB,MAAS,CAAA,CAlBU,CAmBnB,iBAAoB,CAAA,CAnBD,CAoBnB,kBAAqB,CAAA,CApBF,CAqBnB,eAAkB,CAAA,CArBC,CAsBnB,WAAc,CAAA,CAtBK,CAuBnB,SAAY,CAAA,CAvBO,CAwBnB,UAAa,CAAA,CAxBM,CAyBnB,YAAe,CAAA,CAzBI,CA0BnB,YAAe,CAAA,CA1BI,CA2BnB,aAAgB,CAAA,CA3BG,CA4BnB,YAAe,CAAA,CA5BI,CA6BnB,YAAe,CAAA,CA7BI,CA8BnB,UAAa,CAAA,CA9BM,CA+BnB,cAAiB,CAAA,CA/BE,CAgCnB,WAAc,CAAA,CAhCK,CAiCnB,aAAgB,CAAA,CAjCG,CAkCnB,kBAAqB,CAAA,CAlCF,CAmCnB,mBAAsB,CAAA,CAnCH;AAoCnB,UAAa,CAAA,CApCM,CAqCnB,KAAQ,CAAA,CArCW,CAsCnB,UAAa,CAAA,CAtCM,CAuCnB,UAAa,CAAA,CAvCM,CAwCnB,SAAY,CAAA,CAxCO,CAyCnB,KAAQ,CAAA,CAzCW,CA0CnB,QAAW,CAAA,CA1CQ,CA2CnB,YAAe,CAAA,CA3CI,CA4CnB,WAAc,CAAA,CA5CK,CA6CnB,YAAe,CAAA,CA7CI,CA8CnB,SAAY,CAAA,CA9CO,CAiDrBC,SAASA,GAAY,CAACC,CAAD,CAAYzB,CAAZ,CAAsB,CACzC,IAAI0B,EAAe,EAAnB,CACIC,EAAUF,CAEd,KADIG,CACJ,CADgBH,CAAA,GAAcnd,MAAd,CAAuBA,MAAvB,CAAgCmd,CAAA5O,YAAA,EAChD,CAAO8O,CAAP,CAAA,CACED,CAAA5M,KAAA,CAAkB6M,CAAlB,CAEE,CAAAA,CAAA,CADEA,CAAA7P,aAAJ,CACY6P,CAAA7P,aADZ,CAEW6P,CAAA5a,SAAJ,GAAyBC,IAAAuI,uBAAzB,EAAwDoS,CAAAtU,KAAxD,GAAyE2S,CAAzE,EAAqF2B,CAArF,GAAiGC,CAAjG,EACKD,CAAAtU,KADL,CAGKsU,CAAAvc,WAIVsc,EAAA,CAAaA,CAAA5b,OAAb,CAAmC,CAAnC,CAAJ,GAA8CrB,QAA9C,EACEid,CAAA5M,KAAA,CAAkBxQ,MAAlB,CAEF,OAAOod,EAlBkC;AAqB3CG,QAASA,GAAQ,CAACC,CAAD,CAAUC,CAAV,CAAgB,CAC/B,GAAI,Cd3DUzO,Cc2Dd,CACE,MAAOwO,EAILE,EAAAA,CAAcR,EAAA,CAAaM,CAAb,CAAsB,CAAA,CAAtB,CAElB,KAR+B,IAQtBxY,EAAE,CARoB,CAQjB2Y,CARiB,CAQPC,CARO,CAQGzQ,CARH,CAQS0Q,CAAxC,CAAiD7Y,CAAjD,CADSyY,CAC4Cjc,OAArD,CAAgEwD,CAAA,EAAhE,CAOE,GANA2Y,CAMI,CARGF,CAEI,CAAGzY,CAAH,CAMP,CALJmI,CAKI,CALGwQ,CAAA,GAAa3d,MAAb,CAAsBA,MAAtB,CAA+B2d,CAAApP,YAAA,EAKlC,CAJApB,CAIA,GAJSyQ,CAIT,GAHFC,CACA,CADUH,CAAAzV,QAAA,CAAoBkF,CAApB,CACV,CAAAyQ,CAAA,CAAWzQ,CAET,EAAA,CdzEQ6B,CcyEP,CAAkB7B,CAAlB,CAAD,EAAuC,EAAvC,CAA4B0Q,CAAhC,CACE,MAAOF,EAhBoB;AAqBjC,IAAIG,GAAa,CAKXpC,YAAW,EAAA,CAEU,CAAA,CAAvB,GAAI,IAAAqC,UAAJ,EAAoDpX,IAAAA,EAApD,GAAgC,IAAAqX,EAAhC,GACE,IAAAA,EADF,CACoBf,EAAA,CAAe,IAAAnd,KAAf,CADpB,CAGA,OAAO,KAAAke,EAAP,EAA0B,CAAA,CALb,CALA,CAgBf,aAAAZ,QAAY,EAAG,CACR,IAAAa,EAAL,GACE,IAAAA,EADF,CACwBf,EAAA,CAAa,IAAA,SAAb,CAA+B,IAAAxB,SAA/B,CADxB,CAGA,OAAO,KAAAuC,EAJM,CAhBA,CA0BX3R,UAAS,EAAA,CACX,MAAOiR,GAAA,CAAS,IAAAW,cAAT,CAA6B,IAAAd,aAAA,EAA7B,CADI,CA1BE,CAkCXe,iBAAgB,EAAA,CAClB,GAAI,CAAC,IAAAC,EAAL,CACE,MAAO,KAEJ,KAAAC,EAAL,GACE,IAAAA,EADF,CACqCnB,EAAA,CAAa,IAAAkB,EAAb,CAAmC,CAAA,CAAnC,CADrC,CAIA,OAAOb,GAAA,CAAS,IAAAW,cAAT,CAA6B,IAAAG,EAA7B,CARW,CAlCL,CA+Cf,gBAAAC,QAAe,EAAG,CAChBC,KAAA9R,UAAA6R,gBAAAzR,KAAA,CAAqC,IAArC,CACA,KAAA2R,EAAA,CAA4B,CAAA,CAFZ,CA/CH,CAsDf,yBAAAC,QAAwB,EAAG,CACzBF,KAAA9R,UAAAgS,yBAAA5R,KAAA,CAA8C,IAA9C,CAEA;IAAA2R,EAAA,CADA,IAAAE,EACA,CADqC,CAAA,CAFZ,CAtDZ,CA8DjBC,SAASA,GAAiB,CAACC,CAAD,CAAO,CAGnBC,QAAA,EAAQ,CAAC/e,CAAD,CAAOgf,CAAP,CAAgB,CAC9B5e,CAAAA,CAAQ,IAAI0e,CAAJ,CAAS9e,CAAT,CAAegf,CAAf,CACZ5e,EAAA8d,EAAA,CAAmBc,CAAnB,EAA8B,CAAA,CAAQA,CAAA,SACtC,OAAO5e,EAH2B,CdpGtB+P,Ec0Gd,CAAY4O,CAAZ,CAAmBD,CAAnB,CACAC,EAAApS,UAAA,CAAkBmS,CAAAnS,UAClB,OAAOoS,EAXwB,CAcjC,IAAIE,GAA8B,CAChC,MAAS,CAAA,CADuB,CAEhC,KAAQ,CAAA,CAFwB,CAWlCC,SAASA,GAAa,CAAC9e,CAAD,CAAQ,CAC5B,MAAOA,EAAA,SAAP,GAA6BA,CAAAoM,OAA7B,EAA6CpM,CAAAke,EAA7C,GAAuEle,CAAAie,cAD3C,CAU9Bc,QAASA,GAAY,CAAC/e,CAAD,CAAQsC,CAAR,CAAc0c,CAAd,CAAqB,CAGxC,GAFIC,CAEJ,CAFS3c,CAAA4c,WAET,EAF4B5c,CAAA4c,WAAA,CAAgBlf,CAAAJ,KAAhB,CAE5B,EADE0C,CAAA4c,WAAA,CAAgBlf,CAAAJ,KAAhB,CAAA,CAA4Bof,CAA5B,CACF,CACE,IADM,IACGla,EAAI,CADP,CACUqa,CAAhB,EAAqBA,CAArB,CAA0BF,CAAA,CAAGna,CAAH,CAA1B,IACM,CAAAga,EAAA,CAAc9e,CAAd,CADN,EAC8BA,CAAAoM,OAD9B,GAC+CpM,CAAAie,cAD/C,IAIEkB,CAAAxS,KAAA,CAAQrK,CAAR,CAActC,CAAd,CACIwe,CAAAA,CAAAxe,CAAAwe,EALN,EAAkC1Z,CAAA,EAAlC,EAJsC;AAgB1Csa,QAASA,GAAwB,CAACtY,CAAD,CAAI,CACnC,IAAIyW,EAAOzW,CAAAoW,aAAA,EAGXjY,OAAAC,eAAA,CAAsB4B,CAAtB,CAAyB,eAAzB,CAA0C,CACxC3B,IAAKA,QAAQ,EAAG,CACd,MAAO7C,EADO,CADwB,CAIxC+C,aAAc,CAAA,CAJ0B,CAA1C,CAMA,KAAK,IAAIP,EAAIyY,CAAAjc,OAAJwD,CAAkB,CAA3B,CAAmC,CAAnC,EAA8BA,CAA9B,CAAsCA,CAAA,EAAtC,CAA2C,CACzC,IAAAxC,EAAOib,CAAA,CAAKzY,CAAL,CAEPia,GAAA,CAAajY,CAAb,CAAgBxE,CAAhB,CAAsB,SAAtB,CACA,IAAIwE,CAAAwX,EAAJ,CACE,MALuC,CAU3CrZ,MAAAC,eAAA,CAAsB4B,CAAtB,CAAyB,YAAzB,CAAuC,CAAC,IAAA3B,QAAG,EAAG,CAAE,MAAOkZ,MAAAgB,UAAT,CAAP,CAAvC,CAIA,KAAIC,CACJ,KAASxa,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoByY,CAAAjc,OAApB,CAAiCwD,CAAA,EAAjC,CAAsC,CACpCxC,CAAA,CAAOib,CAAA,CAAKzY,CAAL,CACP,KAAM+J,EflMMZ,CekMK,CAAiB3L,CAAjB,CACX2K,EAAAA,CAAO4B,CAAP5B,EAAmB4B,CAAA5B,KACzB,IAAU,CAAV,GAAInI,CAAJ,EAAgBmI,CAAhB,EAAwBA,CAAxB,GAAiCqS,CAAjC,CAME,GALAP,EAAA,CAAajY,CAAb,CAAgBxE,CAAhB,CAAsB,QAAtB,CAKIgc,CAHAhc,CAGAgc,GAHSxe,MAGTwe,GAFFgB,CAEEhB,CAFchc,CAAA+L,YAAA,EAEdiQ,EAAAxX,CAAAwX,EAAJ,CACE,KAXgC,CAzBH;AAyD9BiB,QAASA,GAAY,CAACC,CAAD,CAAWld,CAAX,CAAiB1C,CAAjB,CAAuB6f,CAAvB,CAAgCC,CAAhC,CAAsCC,CAAtC,CAA+C,CACzE,IAAK,IAAI7a,EAAI,CAAb,CAAgBA,CAAhB,CAAoB0a,CAAAle,OAApB,CAAqCwD,CAAA,EAArC,CAA0C,CACd,IAAA,EAAA0a,CAAA,CAAS1a,CAAT,CAAA,CAdpB8a,EAIJC,CAJF,KAc0B,CAbjBC,EAGPD,CAHF,QAa0B,CAZpBE,EAEJF,CAFF,KAY0B,CAXjBG,EACPH,CADF,QAWA,IAAuCvd,CAAvC,GAVEud,CALFI,KAeA,EAA6CrgB,CAA7C,GARSggB,CAQT,EAAmDH,CAAnD,GAPYK,CAOZ,EAA4DJ,CAA5D,GANSK,CAMT,EAAkEJ,CAAlE,GALYK,CAKZ,CACE,MAAOlb,EAF+B,CAK1C,MAAQ,EANiE;AAyBpE/C,QAASA,GAAgB,CAACnC,CAAD,CAAOsgB,CAAP,CAAgBC,CAAhB,CAAkC,CAChE,GAAKD,CAAL,CAAA,CAIA,IAAME,EAAc,MAAOF,EAG3B,IAAoB,UAApB,GAAIE,CAAJ,EAAkD,QAAlD,GAAkCA,CAAlC,CAKA,GAAoB,QAApB,GAAIA,CAAJ,EAAkCF,CAAAG,YAAlC,EAAwF,UAAxF,GAAyD,MAAOH,EAAAG,YAAhE,CAAA,CAWA,GAAIF,CAAJ,EAAoD,QAApD,GAAwB,MAAOA,EAA/B,CAA8D,CAC5D,IAAAV,EAAU,CAAA,CAAQU,CAAAV,QAClB,KAAAC,EAAO,CAAA,CAAQS,CAAAT,KACf,KAAAC,EAAU,CAAA,CAAQQ,CAAAR,QAH0C,CAA9D,IAKEF,EAEA,CAFU,CAAA,CAAQU,CAElB,CAAAR,CAAA,CADAD,CACA,CADO,CAAA,CAMT,KAAItT,EAAU+T,CAAV/T,EAA8B+T,CAAAG,EAA9BlU,EAAiE,IAArE,CAEIoT,EAAWU,CAAA,CAAQtD,EAAR,CACf,IAAI4C,CAAJ,CAEE,IAAoE,EAApE,CAAID,EAAA,CAAaC,CAAb,CAAuBpT,CAAvB,CAA+BxM,CAA/B,CAAqC6f,CAArC,CAA8CC,CAA9C,CAAoDC,CAApD,CAAJ,CACE,MADF,CAFF,IAMEO,EAAA,CAAQtD,EAAR,CAAA,CAA6B,EAOzB2D,EAAAA,CAAYA,QAAQ,CAACzZ,CAAD,CAAI,CAExB4Y,CAAJ,EACE,IAAA5d,oBAAA,CAAyBlC,CAAzB,CAA+BsgB,CAA/B,CAAwCC,CAAxC,CAEGrZ,EAAA,SAAL,EACE0Z,EAAA,CAAW1Z,CAAX,CAGF,IAAIsF,CAAJ,GAAe,IAAf,CAAqB,CAEnB,IAAAqU,EAAwBxb,MAAAqH,yBAAA,CAAgCxF,CAAhC,CAAmC,eAAnC,CACxB7B,OAAAC,eAAA,CAAsB4B,CAAtB,CAAyB,eAAzB,CAA0C,CAAC,IAAA3B,QAAG,EAAG,CAAE,MAAOiH,EAAT,CAAP;AAA0B/G,aAAc,CAAA,CAAxC,CAA1C,CAHmB,CAQrB,GAAIyB,CAAA0U,SAAJ,EAAsD,EAAtD,CAAkB1U,CAAAoW,aAAA,EAAAnV,QAAA,CAAyBqE,CAAzB,CAAlB,CACE,GAAI0S,EAAA,CAAchY,CAAd,CAAJ,EAAwBA,CAAAsF,OAAxB,GAAqCtF,CAAAmX,cAArC,CACMnX,CAAA4Z,WAAJ,GAAqBrC,KAAAsC,eAArB,EACE7Z,CAAAyX,yBAAA,EAFJ,KAOA,IAAIzX,CAAA4Z,WAAJ,GAAqBrC,KAAAuC,gBAArB,EAA+C9Z,CAAA1G,QAA/C,EAA4D0G,CAAAsF,OAA5D,GAAyEA,CAAzE,EAAqFA,CAArF,WAAuG4G,OAAvG,CAAA,CAGA,IAAI6N,EAAsB,UAAhB,GAAAT,CAAA,CACRF,CAAAvT,KAAA,CAAaP,CAAb,CAAqBtF,CAArB,CADQ,CAEPoZ,CAAAG,YAFO,EAEgBH,CAAAG,YAAA,CAAoBvZ,CAApB,CACtBsF,EAAJ,GAAe,IAAf,GAEMqU,CAAJ,EACExb,MAAAC,eAAA,CAAsB4B,CAAtB,CAAyB,eAAzB,CAA0C2Z,CAA1C,CACA,CAAAA,CAAA,CAAwB,IAF1B,EAIE,OAAO3Z,CAAA,cANX,CASA,OAAO+Z,EAfP,CAzB0B,CA4C9BX,EAAA,CAAQtD,EAAR,CAAAtM,KAAA,CAAgC,CAG9BhO,KAAM8J,CAHwB,CAI9BxM,KAAMA,CAJwB,CAK9B6f,QAASA,CALqB,CAM9BC,KAAMA,CANwB,CAO9BC,QAASA,CAPqB,CAQ9BY,GAAWA,CARmB,CAAhC,CAWI1B,GAAA,CAA4Bjf,CAA5B,CAAJ,EACE,IAAAsf,WAGA;AAHkB,IAAAA,WAGlB,EAHqC,EAGrC,CAFA,IAAAA,WAAA,CAAgBtf,CAAhB,CAEA,CAFwB,IAAAsf,WAAA,CAAgBtf,CAAhB,CAExB,EADE,CAAC,QAAW,EAAZ,CAAgB,OAAU,EAA1B,CACF,CAAA,IAAAsf,WAAA,CAAgBtf,CAAhB,CAAA,CAAsB6f,CAAA,CAAU,SAAV,CAAsB,QAA5C,CAAAnP,KAAA,CAA2DiQ,CAA3D,CAJF,EAQE5T,CAFU,IAAAmU,WAAgB9N,OAAhB8N,CAAyBjG,CAAA9H,GAAzB+N,CACRjG,CAAA9Y,iBACF4K,MAAA,CAAS,IAAT,CAAe/M,CAAf,CAAqB2gB,CAArB,CAAgCJ,CAAhC,CAtGF,CAZA,CADgE;AA0H3Dre,QAASA,GAAmB,CAAClC,CAAD,CAAOsgB,CAAP,CAAgBC,CAAhB,CAAkC,CACnE,GAAKD,CAAL,CAAA,CAMA,GAAIC,CAAJ,EAAoD,QAApD,GAAwB,MAAOA,EAA/B,CAA8D,CAC5D,IAAAV,EAAU,CAAA,CAAQU,CAAAV,QAClB,KAAAC,EAAO,CAAA,CAAQS,CAAAT,KACf,KAAAC,EAAU,CAAA,CAAQQ,CAAAR,QAH0C,CAA9D,IAKEF,EAEA,CAFU,CAAA,CAAQU,CAElB,CAAAR,CAAA,CADAD,CACA,CADO,CAAA,CAGT,KAAItT,EAAU+T,CAAV/T,EAA8B+T,CAAAG,EAA9BlU,EAAiE,IAArE,CAEImU,EAAY9Z,IAAAA,EAtJZ+Y,KAAAA,EAAW,IACf,IAAI,CACFA,CAAA,CAqJ8BU,CArJnB,CAAUtD,EAAV,CADT,CAEF,MAAO9V,CAAP,CAAU,EAqJR0Y,CAAJ,GACMuB,CACJ,CADUxB,EAAA,CAAaC,CAAb,CAAuBpT,CAAvB,CAA+BxM,CAA/B,CAAqC6f,CAArC,CAA8CC,CAA9C,CAAoDC,CAApD,CACV,CAAW,EAAX,CAAIoB,CAAJ,GACER,CAEA,CAFYf,CAAApE,OAAA,CAAgB2F,CAAhB,CAAqB,CAArB,CAAA,CAAwB,CAAxB,CAAAR,GAEZ,CAAKf,CAAAle,OAAL,GACE4e,CAAA,CAAQtD,EAAR,CADF,CAC+BnW,IAAAA,EAD/B,CAHF,CAFF,CAYAkG,EAFU,IAAAjK,WAAgBsQ,OAAhBtQ,CAAyBmY,CAAA5H,GAAzBvQ,CACRmY,CAAA/Y,oBACF6K,MAAA,CAAS,IAAT,CAAe/M,CAAf,CAAqB2gB,CAArB,EAAkCL,CAAlC,CAA2CC,CAA3C,CACII,EAAJ,EAAiB1B,EAAA,CAA4Bjf,CAA5B,CAAjB,EACI,IAAAsf,WADJ,EACuB,IAAAA,WAAA,CAAgBtf,CAAhB,CADvB,GAEQqU,CAEN,CAFY,IAAAiL,WAAA,CAAgBtf,CAAhB,CAAA,CAAsB6f,CAAA,CAAU,SAAV,CAAsB,QAA5C,CAEZ,CADMsB,CACN,CADY9M,CAAAlM,QAAA,CAAYwY,CAAZ,CACZ,CAAW,EAAX,CAAIQ,CAAJ,EACE9M,CAAAmH,OAAA,CAAW2F,CAAX,CAAgB,CAAhB,CALJ,CAhCA,CADmE;AA2CrEC,QAASA,GAA2B,EAAG,CACrC,IAAKC,IAAIA,CAAT,GAAepC,GAAf,CACE/e,MAAAiC,iBAAA,CAAwBkf,CAAxB,CAA4B,QAAQ,CAACna,CAAD,CAAI,CACjCA,CAAA,SAAL,GACE0Z,EAAA,CAAW1Z,CAAX,CACA,CAAAsY,EAAA,CAAyBtY,CAAzB,CAFF,CADsC,CAAxC,CAKG,CAAA,CALH,CAFmC,CAWvC0Z,QAASA,GAAU,CAACxgB,CAAD,CAAQ,CACzBA,CAAA,SAAA,CAAoBA,CAAAoM,OACpBpM,EAAAke,EAAA,CAAwBle,CAAAie,cAExB,Id5dS/P,Cc4dLK,EAAJ,CAAA,CdlZA,IAAI4H,EAAQlR,MAAAic,eAAA,CcmZWlhB,CdnZX,CACZ,IAAI,CAACmW,CAAAC,eAAA,CAAqB,cAArB,CAAL,CAA2C,CACzC,IAAI+K,EAAalc,MAAAyN,OAAA,CAAcyD,CAAd,CACjBgL,EAAAC,GAAA,CAA2BjL,CAC3B1G,GAAA,CAAO0R,CAAP,Cc+Y4BvD,Ed/Y5B,CACAzH,EAAA,aAAA,CAAwBgL,CAJiB,CckZpBnhB,Cd3YvB+Y,UAAA,CAAgB5C,CAAA,ac0YhB,CAAA,Id3ac1G,Gc+aZ,CAAazP,CAAb,CAAoB4d,EAApB,CARuB,CAY3B,IAAIyD,GAAe5C,EAAA,CAAkB3e,MAAAue,MAAlB,CAAnB,CACIiD,GAAqB7C,EAAA,CAAkB3e,MAAAC,YAAlB,CADzB,CAEIwhB,GAAoB9C,EAAA,CAAkB3e,MAAA0hB,WAAlB,C,CCvexBC,QAASA,GAAS,CAAClK,CAAD,CAAiBmK,CAAjB,CAA6B,CAC7C,MAAO,CACLnK,MAAOA,CADF,CAELoK,EAwJiCA,EA1J5B,CAGLD,EAAYA,CAHP,CADsC;AAqI/CE,QAASA,GAAW,CAACzE,CAAD,CAAwB0E,CAAxB,CACEC,CADF,CACiBC,CADjB,CACyB,CADfC,IAAAA,EAwGA,CAxGAA,CACHC,EAuGgC,CAxG7BD,CAExBE,EAAc,CAFUF,CAGxBG,EAAc,CAHUH,CAMxBI,EAAYC,IAAAC,IAAA,CAAST,CAAT,CAAsBG,CAAtB,CAAoCD,CAApC,CAA6CE,CAA7C,CAChB,IAAoB,CAApB,EAAID,CAAJ,EAAqC,CAArC,EAAyBC,CAAzB,CA2EgD,CAAA,CAAA,CAChD,IAASnd,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CA3E2Csd,CA2E3C,CAAkCtd,CAAA,EAAlC,CACE,GA5E2BqY,CA4EfoF,CAAQzd,CAARyd,CAAZ,GA5EoCT,CA4EZU,CAAI1d,CAAJ0d,CAAxB,CACE,MAAA,CACJ,EAAA,CA9E2CJ,CA0EK,CAxEhD,GAAIP,CAAJ,EAAkB1E,CAAA7b,OAAlB,EAAoCygB,CAApC,EAA8CD,CAAAxgB,OAA9C,CAAA,CAgFImhB,CAAAA,CA/EyBtF,CA+EhB7b,OAGb,KAFA,IAAIohB,EAhFkCZ,CAgFzBxgB,OAAb,CACIqhB,EAAQ,CACZ,CAAOA,CAAP,CAlF2CP,CAkF3C,CAlFuDF,CAkFvD,EAA+BU,EAAA,CAlFFzF,CAkFS,CAAQ,EAAEsF,CAAV,CAAP,CAlFOX,CAkFmB,CAAI,EAAEY,CAAN,CAA1B,CAA/B,CAAA,CACEC,CAAA,EAEF,EAAA,CAAOA,CAtFP,CAGAX,CAAA,EAAgBE,CAChBD,EAAA,EAAYC,CACZL,EAAA,EAAcM,CACdJ,EAAA,EAAUI,CAEV,IAAiC,CAAjC,EAAIN,CAAJ,CAAiBG,CAAjB,EAA2D,CAA3D,EAAsCD,CAAtC,CAA+CE,CAA/C,CACE,MAAO,EAET,IAAID,CAAJ,EAAoBH,CAApB,CAAgC,CAE9B,IADAzG,CACA,CADSqG,EAAA,CAAUO,CAAV,CAA4B,CAA5B,CACT,CAAOC,CAAP,CAAkBF,CAAlB,CAAA,CACE3G,CAAAuG,EAAArR,KAAA,CAAoBwR,CAAA,CAAIG,CAAA,EAAJ,CAApB,CAEF,OAAO,CAAE7G,CAAF,CALuB,CAMzB,GAAI6G,CAAJ,EAAgBF,CAAhB,CACL,MAAO,CAAEN,EAAA,CAAUO,CAAV,CAA4BH,CAA5B,CAAyCG,CAAzC,CAAF,CAGsBA,EAAAA,CAAAA,CACCC,EAAAA,CAAAA,CA1I5BY,EAAAA,CA0IsCd,CA1ItCc,CAAoBZ,CAApBY,CAA+B,CAC/BC,EAAAA,CAwIyCjB,CAxIzCiB,CAA2Bd,CAA3Bc,CAA0C,CAC1CC,EAAAA,CAAgBxQ,KAAJ,CAAUsQ,CAAV,CAGhB,KAAS/d,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB+d,CAApB,CAA8B/d,CAAA,EAA9B,CACEie,CAAA,CAAUje,CAAV,CACA,CADmByN,KAAJ,CAAUuQ,CAAV,CACf,CAAAC,CAAA,CAAUje,CAAV,CAAA,CAAa,CAAb,CAAA,CAAkBA,CAIpB,KAASke,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBF,CAApB,CAAiCE,CAAA,EAAjC,CACED,CAAA,CAAU,CAAV,CAAA,CAAaC,CAAb,CAAA,CAAkBA,CAEpB,KAASle,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB+d,CAApB,CAA8B/d,CAAA,EAA9B,CACE,IAASke,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBF,CAApB,CAAiCE,CAAA,EAAjC,CACE,GAyHkB7F,CAzHPoF,CAAQP,CAARO,CAAuBS,CAAvBT,CAA2B,CAA3BA,CAAX,GA0HuBT,CA1HmBU,CAAIP,CAAJO,CAAe1d,CAAf0d,CAAmB,CAAnBA,CAA1C,CACEO,CAAA,CAAUje,CAAV,CAAA,CAAake,CAAb,CAAA;AAAkBD,CAAA,CAAUje,CAAV,CAAc,CAAd,CAAA,CAAiBke,CAAjB,CAAqB,CAArB,CADpB,KAEK,CACH,IAAIC,EAAQF,CAAA,CAAUje,CAAV,CAAc,CAAd,CAAA,CAAiBke,CAAjB,CAARC,CAA8B,CAAlC,CACIC,EAAOH,CAAA,CAAUje,CAAV,CAAA,CAAake,CAAb,CAAiB,CAAjB,CAAPE,CAA6B,CACjCH,EAAA,CAAUje,CAAV,CAAA,CAAake,CAAb,CAAA,CAAkBC,CAAA,CAAQC,CAAR,CAAeD,CAAf,CAAuBC,CAHtC,CAeLpe,CAAAA,CAPGie,CAOCzhB,OAAJwD,CAAuB,CACvBke,EAAAA,CARGD,CAQC,CAAU,CAAV,CAAAzhB,OAAJ0hB,CAA0B,CAC1B7F,EAAAA,CATG4F,CASO,CAAUje,CAAV,CAAA,CAAake,CAAb,CAEd,KADIG,CACJ,CADY,EACZ,CAAW,CAAX,CAAOre,CAAP,EAAoB,CAApB,CAAgBke,CAAhB,CAAA,CACW,CAAT,EAAIle,CAAJ,EACEqe,CAAA7S,KAAA,CAxDW8S,CAwDX,CACA,CAAAJ,CAAA,EAFF,EAKS,CAAT,EAAIA,CAAJ,EACEG,CAAA7S,KAAA,CA5Dc+S,CA4Dd,CACA,CAAAve,CAAA,EAFF,GAKIwe,CAUJ,CAhCKP,CAsBW,CAAUje,CAAV,CAAc,CAAd,CAAA,CAAiBke,CAAjB,CAAqB,CAArB,CAUhB,CATIE,CASJ,CAhCKH,CAuBM,CAAUje,CAAV,CAAc,CAAd,CAAA,CAAiBke,CAAjB,CASX,CARIC,CAQJ,CAhCKF,CAwBO,CAAUje,CAAV,CAAA,CAAake,CAAb,CAAiB,CAAjB,CAQZ,CAJEV,CAIF,CALIY,CAAJ,CAAWD,CAAX,CACQC,CAAA,CAAOI,CAAP,CAAmBJ,CAAnB,CAA0BI,CADlC,CAGQL,CAAA,CAAQK,CAAR,CAAoBL,CAApB,CAA4BK,CAEpC,CAAIhB,CAAJ,EAAWgB,CAAX,EACMA,CAAJ,EAAiBnG,CAAjB,CACEgG,CAAA7S,KAAA,CA/EWiT,CA+EX,CADF,EAGEJ,CAAA7S,KAAA,CAhFYkT,CAgFZ,CACA,CAAArG,CAAA,CAAUmG,CAJZ,CAOA,CADAxe,CAAA,EACA,CAAAke,CAAA,EARF,EASWV,CAAJ,EAAWY,CAAX,EACLC,CAAA7S,KAAA,CApFc+S,CAoFd,CAEA,CADAve,CAAA,EACA,CAAAqY,CAAA,CAAU+F,CAHL,GAKLC,CAAA7S,KAAA,CAzFW8S,CAyFX,CAEA,CADAJ,CAAA,EACA,CAAA7F,CAAA,CAAU8F,CAPL,CAxBP,CAmCFE,EAAAM,QAAA,EA8DArI,EAAA,CAAS3U,IAAAA,EACLid,EAAAA,CAAU,EAGd,KAAS5e,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAjEOqe,CAiEa7hB,OAApB,CAAgCwD,CAAA,EAAhC,CACE,OAlEKqe,CAkEE,CAAIre,CAAJ,CAAP,EACE,KArKaye,CAqKb,CACMnI,CAAJ,GACEsI,CAAApT,KAAA,CAAa8K,CAAb,CACA,CAAAA,CAAA,CAAS3U,IAAAA,EAFX,CAKA8Q,EAAA,EACAoM,EAAA,EACA,MACF,MA7KcH,CA6Kd,CACOpI,CAAL,GACEA,CADF,CACWqG,EAAA,CAAUlK,CAAV,CAAqB,CAArB,CADX,CAGA6D,EAAAsG,EAAA,EACAnK,EAAA,EAEA6D,EAAAuG,EAAArR,KAAA,CAAoBwR,CAAA,CAAI6B,CAAJ,CAApB,CACAA,EAAA,EACA,MACF,MAtLWP,CAsLX,CACOhI,CAAL,GACEA,CADF,CACWqG,EAAA,CAAUlK,CAAV,CAAqB,CAArB,CADX,CAGA6D;CAAAsG,EAAA,EACAnK,EAAA,EACA,MACF,MA5Lc8L,CA4Ld,CACOjI,CAIL,GAHEA,CAGF,CAHWqG,EAAA,CAAUlK,CAAV,CAAqB,CAArB,CAGX,EADA6D,CAAAuG,EAAArR,KAAA,CAAoBwR,CAAA,CAAI6B,CAAJ,CAApB,CACA,CAAAA,CAAA,EAhCJ,CAqCEvI,CAAJ,EACEsI,CAAApT,KAAA,CAAa8K,CAAb,CAEF,OAAOsI,EA9EoC,CAkG7Cd,QAASA,GAAM,CAACL,CAAD,CAAeC,CAAf,CAA8B,CAC3C,MAAOD,EAAP,GAAwBC,CADmB,C,CNhOtC,IAAA,GFJM/L,CEIN,WAAA,CAAY,GFJNA,CEIM,WAAZ,CAMDmN,GAA6B,EAOnCC,SAASA,GAAY,CAACvhB,CAAD,CAAO,CAC1B,IAAIwhB,EAAY,EAChB,GACEA,EAAAC,QAAA,CAAkBzhB,CAAlB,CADF,OAEUA,CAFV,CAEiBA,CAAA1B,WAFjB,CAGA,OAAOkjB,EALmB,CAc1BnhB,QAFWmW,GAEA,CAACkL,CAAD,CAAQnb,CAAR,CAAc+V,CAAd,CAAuB,CAChC,GAAIoF,CAAJ,GAAcJ,EAAd,CACE,KAAM,KAAIK,SAAJ,CAAc,qBAAd,CAAN,CAKF,IAAAjV,GAAA,CAzBmBkV,WA0Bb5P,EAAAA,CAAK9P,EAAA,CAAWqE,CAAX,CAEX,KAAAA,KAAA,CAAYA,CACZ,KAAAsb,EAAA,CAAavF,CAAb,EAAwBA,CAAAwF,KE4CjBzK,GF1CP,CAAiB9Q,CAAjB,CAAuByL,CAAvB,CACM+P,EAAAA,CVDMpW,CUCK,CAAiBpF,CAAjB,CACjBwb,EAAApX,KAAA,CAAgB,IAChBoX,EAAArX,GAAA,CAhCgBsX,QAgCM,GAAA,IAAAH,EAAA,CAA6B,IAA7B,CAAoC,IAEpDI,EAAAA,CVZMxW,CUYK,CAAuB,IAAvB,CACjBwW,EAAApiB,WAAA,CAAsBoiB,CAAA7W,UAAtB,CACI6W,CAAA3jB,WADJ,CAC0B2jB,CAAA7Y,YAD1B,CAEI6Y,CAAA9W,gBAFJ,CAE+B,IAC/B8W,EAAA/f,WAAA,CAAsB,EAEtB,KAAAggB,EAAA,CAAsB,CAAA,CAKtB,KAAAtK,EAAA,CADA,IAAAE,EACA,CAFA,IAAAD,EAEA,CAFiB,IAIRrV,EAAAA,CAAE,CAAX,KAAK,IAASmG,EAAEqJ,CAAAhT,OAAhB,CAA2BwD,CAA3B,CAA+BmG,CAA/B,CAAkCnG,CAAA,EAAlC,CACE6N,CAAAA,YAAAhG,KAAA,CAAiB9D,CAAjB,CAAuByL,CAAA,CAAGxP,CAAH,CAAvB,CAhC8B;AAqClCyV,QAAA,EAAY,CAAZA,CAAY,CAAG,CACR,CAAAiK,EAAL,GACE,CAAAA,EACA,CADsB,CAAA,CACtB,CRtEU5T,EQsEV,CAAQ,QAAA,EAAM,CAAA,MAAA6T,GAAA,CAHHA,CAGG,CAAA,CAAd,CAFF,CADa,CAmCfA,QAAA,GAAO,CAAPA,CAAO,CAAG,CAxBR,IAyBa,IAAA,CAzBb,CAAOxX,CAAP,CAAA,CAAa,CACPA,CAAAuX,EAAJ,GACEE,CADF,CACezX,CADf,CAUe,EAAA,CAAA,CAPRA,IAAAA,EAAAA,CAQLA,EAAAA,CAAO,CAAApE,KAAAwF,YAAA,EACX,ITzEYS,CSyER,CAAkB7B,CAAlB,CAAJ,CAEE,IADA,IAAIqH,EAAK,CAAAzL,KAAArE,WAAT,CACSM,EAAE,CAAX,CAAiBA,CAAjB,CAAqBwP,CAAAhT,OAArB,CAAgCwD,CAAA,EAAhC,CAEE,GADAiP,CAsNK,CAtNDO,CAAA,CAAGxP,CAAH,CAsNC,CAAkB,MAAlB,EArNsBiP,CAqNtB9R,UArNL,CACE,MAAA,CAPW,EAAA,CAAA,IAAA,EAAA,CAXJ,CAyBAgL,CACb,EADaA,CAEX,YAAA,EAHM;AAQV,EAAA,UAAA,YAAA,CAAA,QAAe,EAAG,CAChB,IAAAuX,EAAA,CAAsB,CAAA,CACtB,IAAI,IAAArK,EAAJ,CAAoB,CAQpBe,EAAA,CAPEyJ,IAOF,CAEA,KAHY,IAGH7f,EAAE,CAHC,CAGEqW,CAAd,CAAoBrW,CAApB,CATE6f,IASsBxK,EAAA7Y,OAAxB,CAA+CwD,CAAA,EAA/C,CAAoD,CAClDqW,CAAA,CAVAwJ,IAUOxK,EAAA,CAAerV,CAAf,CA0FT,KAAM8f,EV1KM3W,CU0KK,CAAiBkN,CAAjB,CAAjB,CACIlR,EAAK2a,CAAArX,cACTqX,EAAArX,cAAA,CAAyB,EACzBqX,EAAAzX,EAAA,CAA0B,EAE1B,IADAyX,CAAAvX,EACA,CADoCpD,CACpC,CACE,IAASnF,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkBmF,CAAA3I,OAAlB,CAA6BwD,CAAA,EAA7B,CAAkC,CAChC,IAAIsF,EVjLI6D,CUiLA,CAAiBhE,CAAA,CAAGnF,CAAH,CAAjB,CACRsF,EAAAgD,EAAA,CAAsBhD,CAAAkD,aAIlBlD,EAAAkD,aAAJ,GAAuB6N,CAAvB,GACE/Q,CAAAkD,aADF,CACmB,IADnB,CANgC,CAjGgB,CAKpD,IAASlD,CAAT,CAdEua,IAcS9b,KAAA1G,WAAX,CAAiCiI,CAAjC,CAAoCA,CAApC,CAAsCA,CAAAsB,YAAtC,CACEmZ,EAAA,CAfAF,IAeA,CAA2Bva,CAA3B,CAGF,KAAStF,CAAT,CAAW,CAAX,CAAcA,CAAd,CAlBE6f,IAkBgBxK,EAAA7Y,OAAlB,CAAyCwD,CAAA,EAAzC,CAA8C,CACtCqW,CAAN,CAnBAwJ,IAmBaxK,EAAA,CAAerV,CAAf,CACP8f,EAAAA,CV1FI3W,CU0FO,CAAiBkN,CAAjB,CAEjB,IAAI,CAACyJ,CAAArX,cAAAjM,OAAL,CACE,IAAS8I,CAAT,CAAW+Q,CAAAhZ,WAAX,CAA4BiI,CAA5B,CAA+BA,CAA/B,CAAiCA,CAAAsB,YAAjC,CACEmZ,EAAA,CAxBJF,IAwBI,CAA2Bva,CAA3B,CAA8B+Q,CAA9B,CAKJ,EADM2J,CACN,EAFMC,CAEN,CVnGU9W,CUiGa,CAAiBkN,CAAAva,WAAjB,CAEvB,GADyCmkB,CAAA9X,KACzC,GAAsByO,EAAA,CAAAoJ,CAAA,CAAtB,EACEA,CAAA,YAAA,EAEFE;EAAA,CAhCAL,IAgCA,CAAkCC,CAAAzX,EAAlC,CACEyX,CAAArX,cADF,CAGA,IADI0X,CACJ,CADwBL,CAAAvX,EACxB,CAAuB,CACrB,IAASvI,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkBmgB,CAAA3jB,OAAlB,CAA4CwD,CAAA,EAA5C,CV1GQmJ,CU2GN,CAAiBgX,CAAA,CAAkBngB,CAAlB,CAAjB,CAAAsI,EAAA,CAA2D,IAE7DwX,EAAAvX,EAAA,CAAoC,IAEhC4X,EAAA3jB,OAAJ,CAA+BsjB,CAAArX,cAAAjM,OAA/B,GACEsjB,CAAA1X,EADF,CACmB,CAAA,CADnB,CANqB,CAcnB0X,CAAA1X,EAAJ,GACE0X,CAAA1X,EACA,CADiB,CAAA,CACjB,CAAAgY,EAAA,CAnDFP,IAmDE,CAAqBxJ,CAArB,CAFF,CA/B4C,CAmIxCnB,CAAAA,CApJJmL,IAoJYhL,EACViL,EAAAA,CAAc,EAClB,KAAStgB,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkBkV,CAAA1Y,OAAlB,CAAgCwD,CAAA,EAAhC,CACQ8U,CAQN,CAReI,CAAA,CAAMlV,CAAN,CAAAlE,WAQf,EADM6Z,CACN,CVtOUxM,CUqOS,CAAiB2L,CAAjB,CACnB,GAAoBa,CAAAxN,KAApB,EACE,EAA8B,CAA9B,CAAAmY,CAAArd,QAAA,CAAoB6R,CAApB,CAAA,CADF,EAEEwL,CAAA9U,KAAA,CAAiBsJ,CAAjB,CAGJ,KAAS9U,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkBsgB,CAAA9jB,OAAlB,CAAsCwD,CAAA,EAAtC,CAA2C,CACnCxC,CAAAA,CAAO8iB,CAAA,CAAYtgB,CAAZ,CACMugB,EAAAA,CAAA/iB,CAAA+iB,GAtKnBF,IAsKmBE,CAtKnBF,IAsKmCtc,KAAhBwc,CAA4B/iB,CAO7CsT,EAAAA,CAAW,EACXtB,EAAAA,CAPmDhS,CAO9CkC,WACT,KAAK,IAAIM,EAAI,CAAb,CAAgBA,CAAhB,CAAoBwP,CAAAhT,OAApB,CAA+BwD,CAAA,EAA/B,CAAoC,CAClC,IAAIyP,EAAQD,CAAA,CAAGxP,CAAH,CAIZ,IAcyB,MAdzB,EAA2ByP,CAcpBtS,UAdP,CAAmC,CAC7BkL,CAAAA,CV5PIc,CU4Pa,CAAiBsG,CAAjB,CAAApH,EACrB,KAAK,IAAI6V,EAAI,CAAb,CAAgBA,CAAhB,CAAoB7V,CAAA7L,OAApB,CAA2C0hB,CAAA,EAA3C,CAEIpN,CAAAtF,KAAA,CADoBnD,CAAAmY,CAAetC,CAAfsC,CACpB,CAJ6B,CAAnC,IAOE1P,EAAAtF,KAAA,CAAciE,CAAd,CAZgC,CA2BjBrJ,CAAAA,CAAAA,IAAAA,EAHfsQ,EAAAA,CAAWhX,EAAA,CAAWiM,CAAX,CACXiT,EAAAA,CMlFC9B,EAAA,CNkF0BhM,CMlF1B,CNkF0BA,CMlFFtU,OAAxB,CNkFoCka,CMlFpC,CNkFoCA,CMjFnBla,OADjB,CNoFL;IAJqC,IAIvBikB,EAALzgB,CAAKygB,CAAH,CAAX,CAAuBzgB,CAAvB,CAAyB4e,CAAApiB,OAAzB,GAA6C4J,CAA7C,CAA+CwY,CAAA,CAAQ5e,CAAR,CAA/C,EAA4DA,CAAA,EAA5D,CAAiE,CAC/D,IAD+D,IACtDke,EAAE,CADoD,CACjD5Y,CAAd,CAAkB4Y,CAAlB,CAAsB9X,CAAAyW,EAAArgB,OAAtB,GAA4C8I,CAA5C,CAA8Cc,CAAAyW,EAAA,CAAUqB,CAAV,CAA9C,EAA6DA,CAAA,EAA7D,CAKMpiB,EAAA,CAAWwJ,CAAX,CAIJ,GAJsBqG,CAItB,EAHEkC,CAAAA,YAAAhG,KAAA,CAAiB8D,CAAjB,CAA4BrG,CAA5B,CAGF,CAAAoR,CAAAJ,OAAA,CAAgBlQ,CAAAqM,MAAhB,CAA0BgO,CAA1B,CAA6B,CAA7B,CAEFA,EAAA,EAAKra,CAAAwW,EAZ0D,CAejE,IAAS5c,CAAT,CAAW,CAAX,CAAwBA,CAAxB,CAA0B4e,CAAApiB,OAA1B,GAA8C4J,CAA9C,CAAgDwY,CAAA,CAAQ5e,CAAR,CAAhD,EAA6DA,CAAA,EAA7D,CAEE,IADA0gB,CACSxC,CADFxH,CAAA,CAAStQ,CAAAqM,MAAT,CACEyL,CAAAA,CAAAA,CAAE9X,CAAAqM,MAAX,CAAuByL,CAAvB,CAA2B9X,CAAAqM,MAA3B,CAAqCrM,CAAAwW,EAArC,CAAmDsB,CAAA,EAAnD,CACE5Y,CAEA,CAFIwL,CAAA,CAASoN,CAAT,CAEJ,CADAvX,CAAAA,aAAAkB,KAAA,CAAkB8D,CAAlB,CAA6BrG,CAA7B,CAAgCob,CAAhC,CACA,CAAAhK,CAAAJ,OAAA,CAAgB4H,CAAhB,CAAmB,CAAnB,CAAsB5Y,CAAtB,CA1DuC,CAtKvB,CAFJ,CAqElBya,SAAA,GAAqB,CAArBA,CAAqB,CAACviB,CAAD,CAAOmjB,CAAP,CAAmB,CACtC,IAAM5W,EVhJMd,CUgJK,CAAuBzL,CAAvB,CAAjB,CACIojB,EAAU7W,CAAAzB,EACdyB,EAAAzB,EAAA,CAA6B,IAExB+N,EAAL,GAGEA,CAHF,EAEQxW,CAFR,CAEe,CAAAyV,EAAA,CADF9X,CAAA6Y,KACE,EA/KGwK,YA+KH,CAFf,GAGiBhhB,CAAA,CAAK,CAAL,CAHjB,CAKIwW,EAAJ,EVzJYpN,CU0JO6W,CAAuBzJ,CAAvByJ,CACjBrX,cAAA+C,KAAA,CAA4BhO,CAA5B,CACA,CAAAuM,CAAAvB,aAAA,CAAwB6N,CAH1B,EAKEtM,CAAAvB,aALF,CAK0B7G,IAAAA,EAEtBif,EAAJ,GAAgB7W,CAAAvB,aAAhB,EACMuB,CAAAvB,aADN,GVhKYS,CUkKR,CAAuBc,CAAAvB,aAAvB,CAAAJ,EAFJ,CAE0D,CAAA,CAF1D,CAjBsC;AAqDxC8X,QAAA,GAA4B,CAA5BA,CAA4B,CAACvJ,CAAD,CAAYmK,CAAZ,CAAsB,CAChD,IADgD,IACvC9gB,EAAE,CADqC,CAClCsF,CAAd,CAAkBtF,CAAlB,CAAoB8gB,CAAAtkB,OAApB,GAAyC8I,CAAzC,CAA2Cwb,CAAA,CAAS9gB,CAAT,CAA3C,EAAyDA,CAAA,EAAzD,CACE,GAAmB,MAAnB,EAAIsF,CAAAnI,UAAJ,CAA2B,CACzB,IAAM4jB,EVhME5X,CUgMe,CAAiB7D,CAAjB,CAAAmD,cACnBsY,EAAJ,EAAsBA,CAAAvkB,OAAtB,EACE0jB,EAAA,CAAAA,CAAA,CAAkCvJ,CAAlC,CAA6CoK,CAA7C,CAHuB,CAA3B,IAMEpK,EAAAnL,KAAA,CAAesV,CAAA,CAAS9gB,CAAT,CAAf,CAR4C,CAalDogB,QAAA,GAAe,CAAfA,CAAe,CAAC/J,CAAD,CAAO,CAIpBtP,CAAAA,cAAAc,KAAA,CAAmBwO,CAAnB,CAAyB,IAAIkD,KAAJ,CAAU,YAAV,CAAzB,CACMuG,EAAAA,CV/MM3W,CU+MK,CAAiBkN,CAAjB,CACbyJ,EAAAtX,aAAJ,EACE4X,EAAA,CAAAA,CAAA,CAAqBN,CAAAtX,aAArB,CAPkB,CA2GtB4N,QAAA,GAAc,CAAdA,CAAc,CAAG,CACf,GAAI,CAAAhB,EAAJ,EAA0B,CAAAA,EAAA5Y,OAA1B,CAAqD,CAYrD,IAXiB4Y,IAAAA,EAAAA,CAAAA,EAAAA,CAUb4L,CAVa5L,CAWRpV,EAAE,CAAX,CAAcA,CAAd,CAAkBkV,CAAA1Y,OAAlB,CAAgCwD,CAAA,EAAhC,CAAqC,CACnC,IAAIqW,EAAOnB,CAAA,CAAMlV,CAAN,CEzRN6U,GF+RL,CAAiBwB,CAAjB,CE/RKxB,GFgSL,CAAiBwB,CAAAva,WAAjB,CACA,KAAIuD,EAAO2X,EAAA,CAAkBX,CAAlB,CApBX4K,EAqBI3L,EAAA,CAAcjW,CAAd,CAAJ,EACE2hB,CAEA,CAFkBA,CAElB,EAFqC,EAErC,CADAA,CAAA,CAAgB3hB,CAAhB,CACA,CADwB,CAAA,CACxB,CAxBF4hB,CAwBE3L,EAAA,CAAcjW,CAAd,CAAAmM,KAAA,CAAyB6K,CAAzB,CAHF,EArBA4K,CA0BE3L,EAAA,CAAcjW,CAAd,CALF,CAKwB,CAACgX,CAAD,CA1BxB4K,EA4BA5L,EAAA7J,KAAA,CAAoB6K,CAApB,CAjBmC,CAmBrC,GAAI2K,CAAJ,CACE,IAAK1b,IAAIA,CAAT,GAAc0b,EAAd,CA/BAC,CAgCE3L,EAAA,CAAchQ,CAAd,CAAA,CAAmB2R,EAAA,CAhCrBgK,CAgCqC3L,EAAA,CAAchQ,CAAd,CAAhB,CA/BrB,EAAA8P,EAAA,CAAqB,EAF8B,CADtC;AAuCjB4B,QAAA,GAAY,CAACX,CAAD,CAAO,CACjB,IAAMhX,EAAOgX,CAAA,KAAPhX,EAAuBgX,CAAArV,aAAA,CAAkB,MAAlB,CAAvB3B,EA7XYwhB,YA+XlB,OADAxK,EAAAU,GACA,CADkB1X,CAFD,CAUnB4X,QAAA,GAAU,CAAC/B,CAAD,CAAQ,CAIhB,MAAOA,EAAAgM,KAAA,CAAW,QAAA,CAACC,CAAD,CAAIC,CAAJ,CAAU,CACtBC,CAAAA,CAAQtC,EAAA,CAAaoC,CAAb,CAEZ,KADA,IAAIG,EAAQvC,EAAA,CAAaqC,CAAb,CAAZ,CACSphB,EAAE,CAAX,CAAcA,CAAd,CAAkBqhB,CAAA7kB,OAAlB,CAAgCwD,CAAA,EAAhC,CAAqC,CAC/BuhB,CAAAA,CAAKF,CAAA,CAAMrhB,CAAN,CACT,KAAIwhB,EAAKF,CAAA,CAAMthB,CAAN,CACT,IAAIuhB,CAAJ,GAAWC,CAAX,CAEE,MADIhS,EACG,CADE/B,KAAAC,KAAA,CAAW6T,CAAAzlB,WAAA4D,WAAX,CACF,CAAA8P,CAAAvM,QAAA,CAAWse,CAAX,CAAA,CAAiB/R,CAAAvM,QAAA,CAAWue,CAAX,CALS,CAHX,CAArB,CAJS,CAwFlB5K,QAAA,GAAkB,CAAlBA,CAAkB,CAAG,CACnBR,EAAA,CAAAA,CAAA,CACA,OAAO,EAAQf,CAAA,CAAAA,EAAR,EAA0B7Y,CAAA,CAAA6Y,EAAA7Y,OAA1B,CAFY,C,CCrevBilB,QAASA,GAAe,CAACjkB,CAAD,CAAO,CEwS7B,IAAI2K,EFvSoB3K,CEuSb+L,YAAA,EZ1RGS,EY2RV,CAAkB7B,CAAlB,CAAJ,EACEwX,EAAA,CAAAxX,CAAA,CFvSF,QADM4B,CACN,CXoCcZ,CWrCG,CAAiB3L,CAAjB,CACjB,GAAmBuM,CAAAvB,aAAnB,EAA4C,IAHf;AAM/B,IAAIkZ,GAAc,CAKhBzkB,iBIqRcA,EJrRI0kB,KAAA,CAAsB3mB,MAAtB,CALF,CAOhBgC,oBI6YcA,EJ7YO2kB,KAAA,CAAyB3mB,MAAzB,CAPL,CAAlB,CAWI4mB,GAAY,CAEd3kB,iBI6QcA,EJ/QA,CAIdD,oBIqYcA,EJzYA,CAMd,YAAAqF,QAAW,CAAC7E,CAAD,CAAO,CAChB,MEfYmJ,GFeL,CAAsB,IAAtB,CAA4BnJ,CAA5B,CADS,CANJ,CAUd,aAAAmJ,QAAY,CAACnJ,CAAD,CAAOgX,CAAP,CAAiB,CAC3B,MEnBY7N,GFmBL,CAAsB,IAAtB,CAA4BnJ,CAA5B,CAAkCgX,CAAlC,CADoB,CAVf,CAcd,YAAA3G,QAAW,CAACrQ,CAAD,CAAO,CAChB,MEkEYqQ,GFlEL,CAAqB,IAArB,CAA2BrQ,CAA3B,CADS,CAdJ,CAqBd,aAAAgC,QAAY,CAAChC,CAAD,CAAOgX,CAAP,CAAiB,CE7Bf7N,EF8BZ,CAAsB,IAAtB,CAA4BnJ,CAA5B,CAAkCgX,CAAlC,CE2DY3G,GF1DZ,CAAqB,IAArB,CAA2B2G,CAA3B,CACA,OAAOhX,EAHoB,CArBf,CA8Bd,UAAAsQ,QAAS,CAAC8J,CAAD,CAAO,CEmRhB,GAAsB,UAAtB,EFlR4Bpa,IEkRxBL,UAAJ,CACE,IAAA,EAAO4Y,CAAAjI,UAAAjG,KAAA,CFnRmBrK,IEmRnB,CFnRyBoa,CEmRzB,CADT,KAIE,IADItS,CFrR4BsS,CEqRxB7B,CAAAjI,UAAAjG,KAAA,CFrRkBrK,IEqRlB,CAAmC,CAAA,CAAnC,CFrRwBoa,CAAAA,CEsRhC,CAAU,CACJpI,CAAAA,CFvRoBhS,IEuRfkC,WACT,KAFQ,IAECM,EAAE,CAFH,CAEM6X,CAAd,CAAkB7X,CAAlB,CAAsBwP,CAAAhT,OAAtB,CAAiCwD,CAAA,EAAjC,CACE6X,CACA,CADKrI,CAAA,CAAGxP,CAAH,CAAA8N,UAAA,CAAgB,CAAA,CAAhB,CACL;AAAAxI,CAAAjD,YAAA,CAAcwV,CAAd,CAJM,CFtRV,MAAO,EADO,CA9BF,CAqCd,YAAAtO,QAAW,EAAU,CACnB,MEiLYA,GFjLL,CAAqB,IAArB,CADY,CArCP,CAyCd,SAAAmC,QAAQ,CAAClO,CAAD,CAAO,CACb,MV2CYkO,GU3CL,CAAe,IAAf,CAAqBlO,CAArB,CADM,CAzCD,CAgDd,cAAAuJ,QAAa,CAAC7L,CAAD,CAAQ,CT7DP6Q,ES8DZ,EACA,OAAOhF,EAAAA,cAAAc,KAAA,CAAmB,IAAnB,CAAyB3M,CAAzB,CAFY,CAhDP,CAyDhBiF;MAAA+T,iBAAA,CAAwB0N,EAAxB,CFiGmCC,CAEjCC,YAAa,CAIX,IAAAzhB,QAAG,EAAG,CACJ,GAAI4R,EAAJ,EAAyBA,EAAApK,KAAA,CAAuB,IAAvB,CAAzB,CACE,MAAO,CAAA,CAET,IAAI,IAAApK,SAAJ,EAAqBC,IAAAuI,uBAArB,CACE,MAAO,CAAA,CAGT,KAAMrK,EAAgB,IAAAA,cACtB,IRtFO6P,EQsFP,CACE,IAAI8H,CAAAA,SAAA1L,KAAA,CAAoBjM,CAApB,CAAmC,IAAnC,CAAJ,CACE,MAAO,CAAA,CADT,CADF,IAIO,IAAIA,CAAAwb,gBAAJ,EACL7D,CAAAA,SAAA1L,KAAA,CAAoBjM,CAAAwb,gBAApB,CAAmD,IAAnD,CADK,CAEL,MAAO,CAAA,CAIT,KADI5Z,CACJ,CADW,IACX,CAAOA,CAAP,EAAe,EAAEA,CAAF,WAAkBwQ,SAAlB,CAAf,CAAA,CACExQ,CAAA,CAAOA,CAAA1B,WAAP,GRvLQkO,CQuLmB,CAAkBxM,CAAlB,CAAA,CAAoDA,CAADuG,KAAnD,CAAiEpC,IAAAA,EAA5F,CAEF,OAAO,CAAC,EAAEnE,CAAF,EAAUA,CAAV,WAA0BwQ,SAA1B,CAtBJ,CAJK,CA4BXzN,aAAc,CAAA,CA5BH,CAFoBshB,CEjGnC,CAGA;IAAIE,GAAY,CAIVvZ,gBAAe,EAAA,CACjB,MAAOiZ,GAAA,CAAgB,IAAhB,CADU,CAJL,CAAhB,CASIO,GAAgB,CAMlB,cAAA/c,QAAa,CAACxF,CAAD,CAAW,CAOtB,MEwKY4X,GF7KC,CAAe,IAAf,CAAqB,QAAQ,CAAC/R,CAAD,CAAI,CAC5C,MVhEG+E,GAAAxC,KAAA,CUgE0BvC,CVhE1B,CUgE6B7F,CVhE7B,CU+DyC,CAAjC,CAEV,QAAQ,CAAC6F,CAAD,CAAI,CACb,MAAO,CAAA,CAAQA,CADF,CAFF,CAAAoS,CAIV,CAJUA,CAKb,EAAiB,IAPK,CANN,CAsBlB,iBAAA/X,QAAgB,CAACF,CAAD,CAAW9D,CAAX,CAAsB,CACpC,GAAIA,CAAJ,CAAe,CACPsmB,CAAAA,CAAIxU,KAAAhG,UAAAiK,MAAA7J,KAAA,CAA2BlI,CAAAA,iBAAA,CAAiB,IAAjB,CAAuBF,CAAvB,CAA3B,CACV,KAAM0I,EAAO,IAAAoB,YAAA,EACb,OAAO0Y,EAAAtU,OAAA,CAAS,QAAA,CAAA3L,CAAA,CAAK,CAAA,MAAAA,EAAAuH,YAAA,EAAA,EAAmBpB,CAAnB,CAAd,CAHM,CAKf,MEyJYkP,GFzJL,CAAe,IAAf,CAAqB,QAAQ,CAAC/R,CAAD,CAAI,CACtC,MVpFG+E,GAAAxC,KAAA,CUoF0BvC,CVpF1B,CUoF6B7F,CVpF7B,CUmFmC,CAAjC,CAN6B,CAtBpB,CATpB,CA4CIyiB,GAAY,CAKd,cAAAzZ,QAAa,CAACqR,CAAD,CAAU,CACrB,GAAuB,MAAvB,GAAI,IAAA3c,UAAJ,CAA+B,CEyKjC,IAAIgL,EFxKwBzM,IEwKjB6N,YAAA,EZ1RGS,EY2RV,CAAkB7B,CAAlB,CAAJ,EACEwX,EAAA,CAAAxX,CAAA,CFxKE,OAAO,CADD4B,CACC,CX3FGZ,CW0FO,CAAiB,IAAjB,CACV,GACH2Q,CAAA,EAAWA,CAAAnU,QAAX;AAA6BoE,CAAA1B,EAA7B,CACA0B,CAAAtB,cAFG,GAEwB,EAFxB,CAGL,EAN2B,CADV,CALT,CA5ChB,CA8DI0Z,GVxFYpX,EUwFG,CAAgB,CAKjC,aAAA3L,QAAY,CAACC,CAAD,CAAOC,CAAP,CAAc,CEgKZF,EF/JZ,CAAsB,IAAtB,CAA4BC,CAA5B,CAAkCC,CAAlC,CADwB,CALO,CAYjC,gBAAA4F,QAAe,CAAC7F,CAAD,CAAO,CEsKtB0W,CAAA7Q,gBAAA2C,KAAA,CFrK2BrK,IEqK3B,CFrKiC6B,CEqKjC,CACAwX,GAAA,CFtK2BrZ,IEsK3B,CFtKiC6B,CEsKjC,CFvKsB,CAZW,CAmBjC,aAAAiK,QAAY,CAACwQ,CAAD,CAAU,CDkVtB,GAAI,CCjVkB/V,IDiVtB,CACE,KAAM,sBAAN,CAEF,GAAI,CCpVwB+V,CDoV5B,CACE,KAAM,uBAAN,CCrVA,MDuVK,KAAI9F,EAAJ,CAAc8K,EAAd,CCvVe/a,IDuVf,CCvVqB+V,CDuVrB,CCxVe,CAnBW,CA0B7BzD,QAAO,EAAA,CACT,MAAO,KAAArV,aAAA,CAAkB,MAAlB,CADE,CA1BsB,CAiC7BqV,QAAK,CAAA/W,CAAA,CAAO,CEoIFF,EFnIZ,CAAsB,IAAtB,CAA4B,MAA5B,CAAoCE,CAApC,CADc,CAjCiB,CAwC7BkJ,gBAAe,EAAA,CACjB,MAAOiZ,GAAA,CAAgB,IAAhB,CADU,CAxCc,CAAhB,CA4ChBO,EA5CgB,CA4CDE,EA5CC,CA8CnB/hB,OAAA+T,iBAAA,CAAwBiO,EAAxB,CFyOWjP,EEzOX,CAEA;IAAIkP,GVxIYrX,EUwII,CAAgB,CAIlC,WAAAgD,QAAU,CAACvQ,CAAD,CAAOoa,CAAP,CAAa,CACrB,MEsJY7J,GFtJL,CAAoBvQ,CAApB,CAA0Boa,CAA1B,CADc,CAJW,CAWlC,eAAAvJ,QAAc,CAACgU,CAAD,CAAK,CAMjB,ME+DYhL,GFpEC,CAAe,IAAf,CAAqB,QAAQ,CAAC/R,CAAD,CAAI,CAC5C,MAAOA,EAAA+c,GAAP,EAAeA,CAD6B,CAAjC,CAEV,QAAQ,CAAC/c,CAAD,CAAI,CACb,MAAO,CAAA,CAAQA,CADF,CAFF,CAAAoS,CAIV,CAJUA,CAKb,EAAiB,IANA,CAXe,CAAhB,CAoBjBsK,EApBiB,CAsBpB7hB,OAAA+T,iBAAA,CAAwBkO,EAAxB,CAAuC,CACrC,eFiOShP,EEjOSC,cADmB,CAAvC,CAIA;IAAIiP,GAAalU,WAAA3G,UAAA8a,KAAjB,CAEIC,GVpKYzX,EUoKO,CAAgB,CAIrC,KAAAwX,QAAI,EAAG,CACL,IAAMxY,EXrLMZ,CWqLK,CAAiB,IAAjB,CAGjB,EADIsZ,CACJ,EAFIta,CAEJ,CAFW4B,CAEX,EAFuBA,CAAA5B,KAEvB,GAD2BA,CAAAkL,cAC3B,EACEoP,CAAAF,KAAA,EADF,CAGED,EAAAza,KAAA,CAAgB,IAAhB,CAPG,CAJ8B,CAAhB,CAFvB,CAkBM6a,GAAkB,CACtB,iBAAAzlB,QAAgB,CAACnC,CAAD,CAAOuf,CAAP,CAAWgB,CAAX,CAA6B,CACX,QAAhC,GAAI,MAAOA,EAAX,GACEA,CADF,CACqB,CACjBV,QAAS,CAAA,CAAQU,CADA,CADrB,CAKAA,EAAAG,EAAA,CAAiC,IACjC,KAAAzX,KAAA9G,iBAAA,CAA2BnC,CAA3B,CAAiCuf,CAAjC,CAAqCgB,CAArC,CAP2C,CADvB,CAWtB,oBAAAre,QAAmB,CAAClC,CAAD,CAAOuf,CAAP,CAAWgB,CAAX,CAA6B,CACd,QAAhC,GAAI,MAAOA,EAAX,GACEA,CADF,CACqB,CACjBV,QAAS,CAAA,CAAQU,CADA,CADrB,CAKAA,EAAAG,EAAA,CAAiC,IACjC,KAAAzX,KAAA/G,oBAAA,CAA8BlC,CAA9B,CAAoCuf,CAApC,CAAwCgB,CAAxC,CAP8C,CAX1B,CAqBtB,eAAAhN,QAAc,CAACgU,CAAD,CAAK,CAMjB,MESYhL,GFdC,CAAe,IAAf,CAAqB,QAAQ,CAAC/R,CAAD,CAAI,CAC5C,MAAOA,EAAA+c,GAAP,EAAeA,CAD6B,CAAjC,CAEV,QAAQ,CAAC/c,CAAD,CAAI,CACb,MAAO,CAAA,CAAQA,CADF,CAFF,CAAAoS,CAIV,CAJUA,CAKb,EAAiB,IANA,CArBG,CA+BxBiL;QAASA,EAAY,CAACtR,CAAD,CAAQpH,CAAR,CAAa,CAEhC,IADA,IAAI9E,EAAKhF,MAAA0K,oBAAA,CAA2BZ,CAA3B,CAAT,CACSjK,EAAE,CAAX,CAAcA,CAAd,CAAkBmF,CAAA3I,OAAlB,CAA6BwD,CAAA,EAA7B,CAAkC,CAChC,IAAIsF,EAAIH,CAAA,CAAGnF,CAAH,CAAR,CACIygB,EAAItgB,MAAAqH,yBAAA,CAAgCyC,CAAhC,CAAqC3E,CAArC,CAIJmb,EAAAnhB,MAAJ,CACE+R,CAAA,CAAM/L,CAAN,CADF,CACamb,CAAAnhB,MADb,CAGEa,MAAAC,eAAA,CAAsBiR,CAAtB,CAA6B/L,CAA7B,CAAgCmb,CAAhC,CAT8B,CAFF,C,CM3PlC,GhBnBWrX,CgBmBPM,GAAJ,CAA0B,CACxB,IAAIkZ,SAAW,CAEb,MhBtBOxZ,CgBsBEM,GAFI,CAUb,MAASmZ,QAAA,CAACrlB,CAAD,CAAU,CRsgBZ8W,EQrgBL,CAA4B9W,CAA5B,CR0fK6W,GQzfL,CAA6B7W,CAA7B,CACA,OAAOA,EAHU,CAVN,CAeb,YhBbYwM,CgBFC,CAgBb,QfhCY8B,EegBC,CAiBb,MfzBYC,EeQC,CAkBb,ShBtCO3C,CgBoBM,CAmBb,gBdwCY+D,Ec3DC,CAoBb,gBdYOV,EchCM,CAqBb,kBd4BOM,EcjDM,CAsBb,cAAiBgJ,CAtBJ,CAuBb,WTxCSpE,CSiBI,CA0Bf3W,OAAA,SAAA,CAAqB4nB,QF2brB5nB,OAAAue,MAAA,CAAegD,EACfvhB,OAAAC,YAAA,CAAqBuhB,EACrBxhB,OAAA0hB,WAAA,CAAoBD,EACpBP,GAAA,EJtMA,KAAI4G,GACD9nB,MAAA,eADC8nB,EAC2B9nB,MAAA,eAAA,kBAD3B8nB,EAEF1U,WAEFuU,EAAA,CD1QW3O,EC0QEvM,UAAb,CAAkCib,EAAlC,CACAC,EAAA,CAAa3nB,MAAA0C,KAAA+J,UAAb,CAAoCma,EAApC,CACAe,EAAA,CAAa3nB,MAAAkT,OAAAzG,UAAb,CAAsCia,EAAtC,CACAiB,EAAA,CAAa3nB,MAAA+nB,KAAAtb,UAAb,CAAoCsa,EAApC,CACAY,EAAA,CAAa3nB,MAAAwT,iBAAA/G,UAAb;AAAgDua,EAAhD,CACAW,EAAA,CAAa3nB,MAAA2M,QAAAF,UAAb,CAAuC0a,EAAvC,CACAQ,EAAA,CAAa3nB,MAAAgT,SAAAvG,UAAb,CAAwC2a,EAAxC,CACIpnB,OAAAgoB,gBAAJ,EACEL,CAAA,CAAa3nB,MAAAgoB,gBAAAvb,UAAb,CAA+Cya,EAA/C,CAEFS,EAAA,CAAaG,EAAArb,UAAb,CAA0C+a,EAA1C,CVpTSpZ,EU0TLK,EAAJ,GFuKcqK,CEtKZ,CAAe9Y,MAAA0C,KAAA+J,UAAf,CAMA,CFgKYqM,CErKZ,CAAe9Y,MAAA+nB,KAAAtb,UAAf,CAKA,CFgKYqM,CEpKZ,CAAe9Y,MAAAwT,iBAAA/G,UAAf,CAIA,CFgKYqM,CEnKZ,CAAe9Y,MAAA2M,QAAAF,UAAf,CAGA,CFgKYqM,CElKZ,CAAegP,EAAArb,UAAf,CAEA,CFgKYqM,CEjKZ,CAAe9Y,MAAAgT,SAAAvG,UAAf,CACA,CAAIzM,MAAAgoB,gBAAJ,EFgKYlP,CE/JV,CAAe9Y,MAAAgoB,gBAAAvb,UAAf,CARJ,CF8KcsM,GEnKd,EMhRA/Y,OAAAioB,WAAA,CPrBWjP,EOba,C;;;;;;;;;ACXxBnW,QADIqlB,GACO,EAAG,CAIZ,IAAA,IAAA,CAFA,IAAA,MAEA,CAFgB,CAQhB,KAAA,MAAA,CAFA,IAAA,OAEA,CAJA,IAAA,SAIA,CAJmB,IAQnB,KAAA,QAAA,CAFA,IAAA,cAEA,CAFwB,EAIxB,KAAA,OAAA,CAAiB,CAAA,CAEjB,KAAA,KAAA,CAAe,CAMf,KAAA,eAAA,CAFA,IAAA,SAEA,CAJA,IAAA,cAIA,CAJwB,EApBZ;AAmCTC,QAASA,GAAK,CAAChiB,CAAD,CAAO,CAC1BA,CAAA,CAAaA,CAUNG,QAAA,CAAgB8hB,EAAhB,CAA6B,EAA7B,CAAA9hB,QAAA,CAAyC+hB,EAAzC,CAAkD,EAAlD,CATAC,KAAAA,EAAAA,EAAAA,CAAaniB,EAAAA,CAAbmiB,CAkBHnb,EAAO,IAAI+a,EACf/a,EAAA,MAAA,CAAgB,CAChBA,EAAA,IAAA,CAAchH,CAAA3E,OAEd,KADA,IAAI8I,EAAI6C,CAAR,CACSnI,EAAI,CADb,CACgBmG,EAAIhF,CAAA3E,OAApB,CAAiCwD,CAAjC,CAAqCmG,CAArC,CAAwCnG,CAAA,EAAxC,CACE,GAuKeujB,GAvKf,GAAIpiB,CAAA,CAAKnB,CAAL,CAAJ,CAA4B,CACrBsF,CAAA,MAAL,GACEA,CAAA,MADF,CACe,EADf,CAGA,KAAI8E,EAAI9E,CAAR,CACIke,EAAWpZ,CAAA,MAAA,CAAWA,CAAA,MAAA5N,OAAX,CAA+B,CAA/B,CAAXgnB,EAAgD,IACpDle,EAAA,CAAI,IAAI4d,EACR5d,EAAA,MAAA,CAAatF,CAAb,CAAiB,CACjBsF,EAAA,OAAA,CAAc8E,CACd9E,EAAA,SAAA,CAAgBke,CAChBpZ,EAAA,MAAAoB,KAAA,CAAgBlG,CAAhB,CAV0B,CAA5B,IAwKgBme,GA7JT,GAAItiB,CAAA,CAAKnB,CAAL,CAAJ,GACLsF,CAAA,IACA,CADWtF,CACX,CADe,CACf,CAAAsF,CAAA,CAAIA,CAAA,OAAJ,EAAmB6C,CAFd,CAlCT,OAAOmb,EAAA,CAuCAnb,CAvCA,CAAoBhH,CAApB,CAFmB;AAkD5BmiB,QAASA,GAAQ,CAAC9lB,CAAD,CAAO2D,CAAP,CAAa,CAC5B,IAAIuiB,EAAIviB,CAAAwiB,UAAA,CAAenmB,CAAA,MAAf,CAA8BA,CAAA,IAA9B,CAA4C,CAA5C,CACRA,EAAA,cAAA,CAAwBA,CAAA,QAAxB,CAA0CkmB,CAAAE,KAAA,EACtCpmB,EAAA,OAAJ,GAEEkmB,CASA,CATIviB,CAAAwiB,UAAA,CADKnmB,CAAA,SAAAqmB,CAAmBrmB,CAAA,SAAA,IAAnBqmB,CAA6CrmB,CAAA,OAAA,MAClD,CAAmBA,CAAA,MAAnB,CAAmC,CAAnC,CASJ,CARAkmB,CAQA,CARII,EAAA,CAAsBJ,CAAtB,CAQJ,CAPAA,CAOA,CAPIA,CAAApiB,QAAA,CAAUyiB,EAAV,CAA6B,GAA7B,CAOJ,CAJAL,CAIA,CAJIA,CAAAC,UAAA,CAAYD,CAAAM,YAAA,CAAc,GAAd,CAAZ,CAAiC,CAAjC,CAIJ,CAHI5d,CAGJ,CAHQ5I,CAAA,eAGR,CAHiCA,CAAA,SAGjC,CAHoDkmB,CAAAE,KAAA,EAGpD,CAFApmB,CAAA,OAEA,CAF0C,CAE1C,GAFkB4I,CAAAnD,QAAA,CAmJLghB,GAnJK,CAElB,CAAIzmB,CAAA,OAAJ,CACiC,CAA/B,GAAI4I,CAAAnD,QAAA,CA+IUihB,QA/IV,CAAJ,CACE1mB,CAAA,KADF,CACiB2mB,EADjB,CAEW/d,CAAAxD,MAAA,CAAQwhB,EAAR,CAFX,GAGE5mB,CAAA,KACA,CADe6mB,EACf,CAAA7mB,CAAA,cAAA,CACEA,CAAA,SAAAsF,MAAA,CAAuBihB,EAAvB,CAAAO,IAAA,EALJ,CADF,CAUI9mB,CAAA,KAVJ,CAS+B,CAA7B,GAAI4I,CAAAnD,QAAA,CAsIQshB,IAtIR,CAAJ,CACiBC,EADjB,CAGiBC,EAvBrB,CA4BA,IADIC,CACJ,CADSlnB,CAAA,MACT,CACE,IADM,IACGwC,EAAI,CADP,CACUmG,EAAIue,CAAAloB,OADd,CACyByE,CAA/B,CACGjB,CADH,CACOmG,CADP,GACclF,CADd,CACkByjB,CAAA,CAAG1kB,CAAH,CADlB,EAC0BA,CAAA,EAD1B,CAEEsjB,EAAA,CAASriB,CAAT;AAAYE,CAAZ,CAGJ,OAAO3D,EArCqB,CA8C9BsmB,QAASA,GAAqB,CAAC1d,CAAD,CAAI,CAChC,MAAOA,EAAA9E,QAAA,CAAU,uBAAV,CAAmC,QAAQ,CAAA,CAAA,CAAA,CAAA,CAAG,CAC/CqjB,CAAAA,CAAO,CAEX,KADEC,CACF,CADW,CACX,CADeD,CAAAnoB,OACf,CAAOooB,CAAA,EAAP,CAAA,CACED,CAAA,CAAO,GAAP,CAAaA,CAEf,OAAO,IAAP,CAAcA,CANqC,CAA9C,CADyB;AAkB3BE,QAASA,GAAS,CAACrnB,CAAD,CAAOsnB,CAAP,CAA2B3jB,CAA3B,CAAsC,CAAXA,CAAA,CAAA,IAAA,EAAA,GAAAA,CAAA,CAAO,EAAP,CAAAA,CAElD,KAAI4jB,EAAU,EACd,IAAIvnB,CAAA,QAAJ,EAAuBA,CAAA,MAAvB,CAAsC,CACpC,IAAIknB,EAAKlnB,CAAA,MAAT,CACI,CAAA,IAAAknB,CAAA,CAAAA,CAAA,CAgCFzjB,CAhCQ,CAAA+jB,CAgCJ,CAAM,CAAN,CAhCI,CAAA,CAAA,CAAA,EAiCG/jB,CAjCH,EAiCiBA,CAAA,SAjCjB,EAiCwE,CAjCxE,GAiCmCA,CAAA,SAAAgC,QAAA,CAuD/BshB,IAvD+B,CAjCnC,CAAV,IAAI,CAAJ,CAA+B,CACpBvkB,CAAAA,CAAI,CAAb,KAD6B,IACbmG,EAAIue,CAAAloB,OADS,CACEyE,CAA/B,CACGjB,CADH,CACOmG,CADP,GACclF,CADd,CACkByjB,CAAA,CAAG1kB,CAAH,CADlB,EAC0BA,CAAA,EAD1B,CAEE+kB,CAAA,CAAUF,EAAA,CAAU5jB,CAAV,CAAa6jB,CAAb,CAAiCC,CAAjC,CAHiB,CAA/B,IAMYD,EAAA,CAAqB,CAArB,CAAqB,CAAA,QAArB,EACR,CAmCN,CAnCM,CAAA,QAmCN,CADAC,CACA,CADqCA,CAS9BzjB,QAAA,CACI2jB,EADJ,CACmB,EADnB,CAAA3jB,QAAA,CAEI4jB,EAFJ,CAEkB,EAFlB,CARP,CAAA,CAAA,CAA6BH,CAkBtBzjB,QAAA,CACI6jB,EADJ,CACmB,EADnB,CAAA7jB,QAAA,CAEI8jB,EAFJ,CAEiB,EAFjB,CAtDO,CAGV,EADAL,CACA,CAHUA,CAEAnB,KAAA,EACV,IACEmB,CADF,CACY,IADZ,CACmBA,CADnB,CAC6B,IAD7B,CAXkC,CAiBlCA,CAAJ,GACMvnB,CAAA,SAIJ,GAHE2D,CAGF,EAHU3D,CAAA,SAGV,CAHgD,MAGhD,EADA2D,CACA,EADQ4jB,CACR,CAAIvnB,CAAA,SAAJ,GACE2D,CADF,EACU,OADV,CALF,CASA,OAAOA,EA7BsD;AAwE7DkkB,IAAAA,GAAYA,CAAZA,CACAC,GAAgBA,CADhBD,CAEAE,GAAYA,CAFZF,CAGAG,GAAYA,GAHZH,CAWAI,GAAUA,mCAXVJ,CAYAK,GAAMA,kBAZNL,CAaAM,GAAYA,mDAbZN,CAcAO,GAAWA,4DAdXP,CAeAQ,GAAYA,yCAfZR,CAgBAS,GAAUA,2CAhBVT,CAiBAU,GAAeA,mBAjBfV,CAkBAW,GAAgBA,M,CCtPX,IAAMC,EAAe,EAAEjrB,MAAA,SAAF,EAAwBA,MAAA,SAAA,MAAxB,CAArB,CACHkrB,EAKJC,SAASA,GAAgB,CAAC/c,CAAD,CAAW,CAEhC8c,EAAA,CADE9c,CAAJ,EAAgBA,CAAA,kBAAhB,CACwB,CAAA,CADxB,CASwB6c,CATxB,EASwC,EAAS5hB,SAAAC,UAAA1B,MAAA,CAA0B,2BAA1B,CAAT,EACpCwjB,CAAAprB,MAAAorB,IADoC,EACtBC,CAAAD,GAAAC,SADsB,EACN,CAAAD,GAAAC,SAAA,CAAa,YAAb,CAA2B,kBAA3B,CADM,CAVN,CAehCrrB,MAAAsrB,SAAJ,EAAqD3kB,IAAAA,EAArD,GAAuB3G,MAAAsrB,SAAAC,UAAvB,CACEL,EADF,CACwBlrB,MAAAsrB,SAAAC,UADxB,CAEWvrB,MAAAsrB,SAAJ,EACLH,EAAA,CAAiBnrB,MAAAsrB,SAAjB,CAEA,CAAAtrB,MAAAsrB,SAAA,CAAkB3kB,IAAAA,EAHb,EAKLwkB,EAAA,CAAiBnrB,MAAA,cAAjB,EAA4CA,MAAA,cAAA,MAA5C,CAMK,KAAMwrB,EAA4CN,E,CCpClD,IAAMO,GAAa,yHAAnB,CACMC,GAAc,sCADpB,CAEMC,GAAe,2BAFrB,CAGMC,GAAkB,sCAHxB,CAIMC,GAAc,cAJpB,CAMMC,GAAY,Y,CCHzB,IAAMC,GAAe,IAAI1a,G,CCSlB2a,QAASA,EAAU,CAAChC,CAAD,CAAQ7oB,CAAR,CAAkB,CAC1C,GAAI,CAAC6oB,CAAL,CACE,MAAO,EAEY,SAArB,GAAI,MAAOA,EAAX,GACEA,CADF,CJ4Bc7B,EI3BJ,CAAM6B,CAAN,CADV,CAGI7oB,EAAJ,EACE8qB,CAAA,CAAYjC,CAAZ,CAAmB7oB,CAAnB,CAEF,OJwIc0oB,GIxIP,CAAUG,CAAV,CHcIwB,CGdJ,CAVmC,CAiBrCU,QAASA,GAAa,CAACC,CAAD,CAAQ,CAC/B,CAACA,CAAA,WAAL,EAA4BA,CAAA5nB,YAA5B,GACE4nB,CAAA,WADF,CJcchE,EIbU,CAAMgE,CAAA5nB,YAAN,CADxB,CAGA,OAAO4nB,EAAA,WAAP,EAA8B,IAJK,CAc9BC,QAASA,GAAmB,CAACC,CAAD,CAAO,CACxC,MAAO,CAAA,CAAQA,CAAA,OAAf,EACAA,CAAA,OAAA,KADA,GAC2BhD,EAFa,CAWnC4C,QAASA,EAAW,CAACzpB,CAAD,CAAO8pB,CAAP,CAA0BC,CAA1B,CAAiDC,CAAjD,CAAkE,CAC3F,GAAKhqB,CAAL,CAAA,CAGA,IAAIiqB,EAAY,CAAA,CAAhB,CACI3sB,EAAO0C,CAAA,KACX,IAAIgqB,CAAJ,EACM1sB,CADN,GACeqpB,EADf,CACiC,CAC7B,IAAIuD,EAAalqB,CAAA,SAAAoF,MAAA,CF1DVikB,EE0DU,CACba,EAAJ,GAEO1sB,MAAA0sB,WAAA,CAAkBA,CAAA,CAAW,CAAX,CAAlB,CAAArd,QAFP,GAGIod,CAHJ,CAGgB,CAAA,CAHhB,EAF6B,CAU7B3sB,CAAJ,GAAa2pB,EAAb,CACE6C,CAAA,CAAkB9pB,CAAlB,CADF,CAEW+pB,CAAJ,EACLzsB,CADK,GACIupB,EADJ,CAELkD,CAAA,CAAsB/pB,CAAtB,CAFK,CAGI1C,CAHJ,GAGa0pB,EAHb,GAILiD,CAJK,CAIO,CAAA,CAJP,CAOP,KADI/C,CACJ,CADSlnB,CAAA,MACT,GAAU,CAACiqB,CAAX,CAAsB,CACXznB,CAAAA,CAAE,CAAGmG,EAAAA,CAAEue,CAAAloB,OAAhB,KAAK,IAAsByE,CAA3B,CAA+BjB,CAA/B,CAAiCmG,CAAjC,GAAwClF,CAAxC,CAA0CyjB,CAAA,CAAG1kB,CAAH,CAA1C,EAAkDA,CAAA,EAAlD,CACEinB,CAAA,CAAYhmB,CAAZ,CAAeqmB,CAAf,CAAkCC,CAAlC,CAAyDC,CAAzD,CAFkB,CAzBtB,CAD2F;AAyCtFG,QAASA,GAAQ,CAAC5C,CAAD,CAAU6C,CAAV,CAAmBtgB,CAAnB,CAA2BugB,CAA3B,CAAwC,CAY9D,IAAIV,EAAwChsB,QAAA8D,cAAA,CAAuB,OAAvB,CAXN2oB,EAYtC,EACET,CAAA/nB,aAAA,CAAmB,OAAnB,CAboCwoB,CAapC,CAEFT,EAAA5nB,YAAA,CAf6BwlB,CAC7B+C,GAAA,CAeOX,CAfP,CAAkB7f,CAAlB,CAA0BugB,CAA1B,CACA,OAcOV,EAjBuD,CAwBhE,IAAIY,EAAoB,IAuBjBD,SAASA,GAAU,CAACX,CAAD,CAAQ7f,CAAR,CAAgBugB,CAAhB,CAA6B,CACrDvgB,CAAA,CAASA,CAAT,EAAmBnM,QAAAmD,KAGnBgJ,EAAAX,aAAA,CAAoBwgB,CAApB,CAFaU,CAEb,EAF4BA,CAAAjhB,YAE5B,EADEU,CAAAjK,WACF,CACK0qB,EAAL,CAIiBZ,CAAAa,wBAAAC,CAA8BF,CAA9BE,CAJjB,GAKmBvqB,IAAAwqB,4BALnB,GAMIH,CANJ,CAMwBZ,CANxB,EACEY,CADF,CACsBZ,CAN+B;AAyDhDgB,QAASA,GAA0B,CAACC,CAAD,CAAMjsB,CAAN,CAAgB,CAExD,IAAIksB,EAAQD,CAAAnlB,QAAA,CAAY,MAAZ,CACZ,IAAe,EAAf,GAAIolB,CAAJ,CAEE,MAAOlsB,EAAA,CAASisB,CAAT,CAAc,EAAd,CAAkB,EAAlB,CAAsB,EAAtB,CAvB6B,EAAA,CAAA,CACtC,IAAIE,EAAQ,CACHtoB,KAAAA,EAwBwBqoB,CAxBxBroB,CAwBgC,CAxBzC,KAAK,IAAamG,EAwBUiiB,CAxBR5rB,OAApB,CAAiCwD,CAAjC,CAAqCmG,CAArC,CAAwCnG,CAAA,EAAxC,CACE,GAAgB,GAAhB,GAuB0BooB,CAvBtB,CAAKpoB,CAAL,CAAJ,CACEsoB,CAAA,EADF,KAEO,IAAgB,GAAhB,GAqBmBF,CArBf,CAAKpoB,CAAL,CAAJ,EACW,CADX,GACD,EAAEsoB,CADD,CAEH,MAAA,CAIN,EAAA,CAAQ,EAX8B,CA2BlCC,CAAAA,CAAQH,CAAAzE,UAAA,CAAc0E,CAAd,CAAsB,CAAtB,CAAyBG,CAAzB,CACRC,EAAAA,CAASL,CAAAzE,UAAA,CAAc,CAAd,CAAiB0E,CAAjB,CAETK,EAAAA,CAASP,EAAA,CAA2BC,CAAAzE,UAAA,CAAc6E,CAAd,CAAoB,CAApB,CAA3B,CAAmDrsB,CAAnD,CACTwsB,EAAAA,CAAQJ,CAAAtlB,QAAA,CAAc,GAAd,CAEZ,OAAe,EAAf,GAAI0lB,CAAJ,CAESxsB,CAAA,CAASssB,CAAT,CAAiBF,CAAA3E,KAAA,EAAjB,CAA+B,EAA/B,CAAmC8E,CAAnC,CAFT,CAOOvsB,CAAA,CAASssB,CAAT,CAFKF,CAAA5E,UAAA,CAAgB,CAAhB,CAAmBgF,CAAnB,CAAA/E,KAAAtkB,EAEL,CADQipB,CAAA5E,UAAA,CAAgBgF,CAAhB,CAAwB,CAAxB,CAAA/E,KAAAgF,EACR,CAAkCF,CAAlC,CAtBiD,CA6BnDG,QAASA,GAAkB,CAACntB,CAAD,CAAU4D,CAAV,CAAiB,CHlOtC2mB,CGoOX,CACEvqB,CAAA0D,aAAA,CAAqB,OAArB,CAA8BE,CAA9B,CADF,CAGEtE,MAAA,SAAA,cAAA,aAAA6M,KAAA,CAAyDnM,CAAzD,CAAkE,OAAlE,CAA2E4D,CAA3E,CAL+C;AAa5CwpB,QAASA,EAAY,CAACptB,CAAD,CAAU,CACpC,IAAIyB,EAAYzB,CAAA,UAAhB,CACaqtB,EAAgB,EAKzB5rB,EAAJ,CACgC,EADhC,CACMA,CAAA8F,QAAA,CAAkB,GAAlB,CADN,GAII8lB,CACA,CADgB5rB,CAChB,CAAA6rB,CAAA,CAAMttB,CAAAsF,aAAN,EAA8BtF,CAAAsF,aAAA,CAAqB,IAArB,CAA9B,EAA6D,EALjE,GAQEgoB,CACA,CADsBttB,CAADstB,GACrB,CAAAD,CAAA,CAAiCrtB,CAADutB,QATlC,CAWA,OAAO,CAACD,GAAAA,CAAD,CAAKD,EAAAA,CAAL,CAlB6B,C,CCrNtC,QAAMG,GAAN,EAAA,EAWEC,QAAA,GAAG,CAAC3rB,CAAD,CAAO5C,CAAP,CAAcwuB,CAAd,CAAiC,CAApCD,IAAAA,EAyTaE,CAvTP7rB,EAAA,cAAJ,CACEA,CAAA,cADF,CAC0B,IAD1B,CAGE8rB,EAAA,CAAAA,CAAA,CAAmB9rB,CAAnB,CAAyB5C,CAAzB,EAAkC,EAAlC,CAAsCwuB,CAAtC,CALgC,CASpCE,QAAA,GAAa,CAAbA,CAAa,CAAC9rB,CAAD,CAAOiC,CAAP,CAAiB2pB,CAAjB,CAAoC,CAC3C5rB,CAAAC,SAAJ,GAAsBC,IAAAC,aAAtB,EACEjC,EAAA,CAAa8B,CAAb,CAAmBiC,CAAnB,CAA6B2pB,CAA7B,CAKF,IAHI5Z,CAGJ,CAH6B,UAApB,GAAChS,CAAAL,UAAD,CACPuC,CAAClC,CAAAqB,QAADa,EAAiBlC,CAAA+rB,GAAjB7pB,YADO,CAEPlC,CAAAsT,SAFO,EAEUtT,CAAAkC,WACnB,CACE,IAAK,IAAIM,EAAE,CAAX,CAAcA,CAAd,CAAgBwP,CAAAhT,OAAhB,CAA2BwD,CAAA,EAA3B,CACEspB,EAAA,CAAAA,CAAA,CAAmB9Z,CAAA,CAAGxP,CAAH,CAAnB,CAA0BP,CAA1B,CAAoC2pB,CAApC,CAT2C;AAkBjD1tB,QAAA,GAAO,CAACA,CAAD,CAAUd,CAAV,CAAiBwuB,CAAjB,CAAoC,CAIzC,GAAIxuB,CAAJ,CAEE,GAAIc,CAAA8tB,UAAJ,CACMJ,CAAJ,EACE1tB,CAAA8tB,UAAAC,OAAA,CAhDSC,aAgDT,CACA,CAAAhuB,CAAA8tB,UAAAC,OAAA,CAAyB7uB,CAAzB,CAFF,GAIEc,CAAA8tB,UAAA7c,IAAA,CAnDS+c,aAmDT,CACA,CAAAhuB,CAAA8tB,UAAA7c,IAAA,CAAsB/R,CAAtB,CALF,CADF,KAQO,IAAIc,CAAAsF,aAAJ,CAA0B,CAC/B,IAAIiO,EAAIvT,CAAAsF,aAAA,CAAqB2oB,EAArB,CACJP,EAAJ,CACMna,CADN,GAEQ2a,CACJ,CADe3a,CAAA3N,QAAA,CA1DRooB,aA0DQ,CAAsB,EAAtB,CAAApoB,QAAA,CAAkC1G,CAAlC,CAAyC,EAAzC,CACf,CD+IIiuB,EC/IJ,CAA6BntB,CAA7B,CAAsCkuB,CAAtC,CAHJ,EDkJQf,EC3IN,CAA6BntB,CAA7B,EADgBuT,CAAA,CAAIA,CAAJ,CAAQ,GAAR,CAAc,EAC9B,EADiD,cACjD,CADuDrU,CACvD,CAT6B,CAdM,CAkC3CivB,QAAA,GAAa,CAACnuB,CAAD,CAAUouB,CAAV,CAAsB3tB,CAAtB,CAAgC,CAA7C0tB,IAAAA,EA4PaR,CA5PbQ,CACME,EAAeruB,CAAA,WJnGVuqB,EI2GT,EAAqC,OAArC,GAAoB8D,CAApB,CACEhF,CADF,CDjGYiC,CCkGA,CAAoB8C,CAApB,CAAgC3tB,CAAhC,CADZ,EAGM,CACJ,CDgIU2sB,CCjIgB,CAAuBptB,CAAvB,CAC1B,CAAAqpB,CAAA,CAAUiF,EAAA,CAAAA,CAAA,CAASF,CAAT,CADL,CAAAd,GACK,CADD,CAAAD,EACC,CAAwC5sB,CAAxC,CAAV,CAA8D,MAJhE,CAMA,OAAO4oB,EAAAnB,KAAA,EAfoC;AAsB7CoG,QAAA,GAAG,CAAHA,CAAG,CAAChF,CAAD,CAAQpqB,CAAR,CAAeqvB,CAAf,CAAoB9tB,CAApB,CAA8B,CAC/B,IAAI+tB,EAAYC,EAAA,CAAoBvvB,CAApB,CAA2BqvB,CAA3B,CAChBrvB,EAAA,CAA+BA,CAc/B,CACSwvB,EADT,CAd+BxvB,CAc/B,CAGS,EAfT,ODlHYosB,ECkHL,CAAoBhC,CAApB,CAA2B,QAAQ,CAAiBqC,CAAjB,CAAuB,CAC1DA,CAAAgD,EAAL,GACYhD,CAqCd,SApCI,CADUA,CAqCKiD,EApCf,CAqCFC,EAAA,CAzCSC,CAyCT,CAtCYnD,CAsCZ,CAzCSmD,CAyBeC,EAgBxB,CAtCkB7vB,CAsClB,CAtCyBsvB,CAsCzB,CArCE,CAAA7C,CAAAgD,EAAA,CAAgB,CAAA,CAFlB,CAIIluB,EAAJ,EACEA,CAAA,CAASkrB,CAAT,CAAezsB,CAAf,CAAsBsvB,CAAtB,CAN6D,CAA1D,CAJwB,CAuBjCC,QAAA,GAAc,CAACvvB,CAAD,CAAQqvB,CAAR,CAAa,CACzB,MAAOA,EAAA,CAAM,MAAN,CAAarvB,CAAb,CAAkB,GAAlB,CAAwBA,CADN,CA8B3B2vB,QAAA,GAAiB,CAAjBA,CAAiB,CAAClD,CAAD,CAAOqD,CAAP,CAAoB9vB,CAApB,CAA2BsvB,CAA3B,CAAsC,CACrD,IAAIS,EAAKtD,CAAA,SAAAvkB,MAAA,CAAuB8nB,EAAvB,CAGT,IAAI,CDxIQxD,ECwIP,CAA8BC,CAA9B,CAAL,CAA0C,CAC/BrnB,CAAAA,CAAE,CAAX,KADwC,IAC1BmG,EAAEwkB,CAAAnuB,OADwB,CACb4N,CAA3B,CAA+BpK,CAA/B,CAAiCmG,CAAjC,GAAwCiE,CAAxC,CAA0CugB,CAAA,CAAG3qB,CAAH,CAA1C,EAAkDA,CAAA,EAAlD,CACE2qB,CAAA,CAAG3qB,CAAH,CAAA,CAAQ0qB,CAAA7iB,KAAA,CAAiB,CAAjB,CAAuBuC,CAAvB,CAA0BxP,CAA1B,CAAiCsvB,CAAjC,CAF8B,CAK1C,MAAOS,EAAA9X,KAAA,CAAQ+X,EAAR,CAT8C,CAgBvDC,QAAA,GAAe,CAACprB,CAAD,CAAW,CACxB,MAAOA,EAAA6B,QAAA,CAAiBwpB,EAAjB,CAAsB,QAAA,CAAC3sB,CAAD,CAAIrD,CAAJ,CAAUiwB,CAAV,CAAqB,CACrB,EAA3B,CAAIA,CAAA9nB,QAAA,CAAe,GAAf,CAAJ,CACE8nB,CADF,CACWA,CAAAzpB,QAAA,CAAe,KAAf,CAAsB,KAAtB,CADX,CAEoC,EAFpC,CAEWypB,CAAA9nB,QAAA,CAAe,KAAf,CAFX,GAGE8nB,CAHF,CAGWA,CAAAzpB,QAAA,CAAe,MAAf,CAAuB,GAAvB,CAHX,CAKA,OAAO,GAAP,CAAWxG,CAAX,CAAe,GAAf,CAAmBiwB,CAAnB,CAAyB,GANuB,CAA3C,CADiB;AAgB1B,EAAA,UAAA,EAAA,CAAAN,QAAyB,CAAChrB,CAAD,CAAW7E,CAAX,CAAkBsvB,CAAlB,CAA6B,CACpD,IAAIc,EAAO,CAAA,CACXvrB,EAAA,CAAWA,CAAAmkB,KAAA,EAEX,KAAIqH,EAAQH,EAAA1mB,KAAA,CAAS3E,CAAT,CACRwrB,EAAJ,GACExrB,CACA,CADWA,CAAA6B,QAAA,CAAiBwpB,EAAjB,CAAsB,QAAA,CAAC3sB,CAAD,CAAIrD,CAAJ,CAAUytB,CAAV,CAAoB,CAAA,MAAA,GAAA,CAAIztB,CAAJ,CAAQ,GAAR,CAAYytB,CAAAjnB,QAAA,CAAc,KAAd,CAAqB,EAArB,CAAZ,CAAoC,GAApC,CAA1C,CACX,CAAA7B,CAAA,CAAWorB,EAAA,CAAqBprB,CAArB,CAFb,CAIAA,EAAA,CAAWA,CAAA6B,QAAA,CAAiB4pB,EAAjB,CAAmCC,EAAnC,CAAuC,KAAvC,CACX1rB,EAAA,CAAWA,CAAA6B,QAAA,CAAiB8pB,EAAjB,CAAsC,QAAA,CAACjtB,CAAD,CAAI8Q,CAAJ,CAAO7I,CAAP,CAAa,CACvD4kB,CAAL,GACMK,CAGJ,CAHWC,EAAA,CAAgCllB,CAAhC,CAAmC6I,CAAnC,CAAsCrU,CAAtC,CAA6CsvB,CAA7C,CAGX,CAFAc,CAEA,CAFOA,CAEP,EAFeK,CAAAL,KAEf,CADA/b,CACA,CADIoc,CAAAE,GACJ,CAAAnlB,CAAA,CAAIilB,CAAA/rB,MAJN,CAMA,OAAO2P,EAAP,CAAW7I,CAPiD,CAAnD,CASP6kB,EAAJ,GACExrB,CADF,CACaorB,EAAA,CAAqBprB,CAArB,CADb,CAGA,OAAOA,EAtB6C,CAyBtD6rB;QAAA,GAA0B,CAAC7rB,CAAD,CAAW8rB,CAAX,CAAuB3wB,CAAvB,CAA8BsvB,CAA9B,CAAyC,CAEjE,IAAIsB,EAAe/rB,CAAAwD,QAAA,CAAiBwoB,EAAjB,CACW,EAA9B,EAAIhsB,CAAAwD,QAAA,CAAiBkoB,EAAjB,CAAJ,CACE1rB,CADF,CACaisB,EAAA,CAA4BjsB,CAA5B,CAAsCyqB,CAAtC,CADb,CAG4B,CAH5B,GAGWsB,CAHX,GAIE/rB,CAJF,CAIa7E,CAAA,CAAQ+wB,EAAA,CAA8BlsB,CAA9B,CAAwC7E,CAAxC,CAAR,CACT6E,CALJ,CASImsB,EAAAA,CAAU,CAAA,CACM,EAApB,EAAIJ,CAAJ,GACED,CACA,CADa,EACb,CAAAK,CAAA,CAAU,CAAA,CAFZ,CAMA,IAAIA,CAAJ,CAAa,CACX,IAAAZ,EAAO,CAAA,CACHY,EAAJ,GAEEnsB,CAFF,CAEaA,CAAA6B,QAAA,CAAiBuqB,EAAjB,CAAgC,QAAA,CAAC1tB,CAAD,CAAI2tB,CAAJ,CAAc,CAAA,MAAA,KAAA,CAAMA,CAAN,CAA9C,CAFb,CAFW,CAObrsB,CAAA,CAAWA,CAAA6B,QAAA,CAAiByqB,EAAjB,CAA4B,QAAA,CAAC5tB,CAAD,CAAI6tB,CAAJ,CAAYC,CAAZ,CACrC,CAAA,MAAA,QAAA,CAASA,CAAT,CAAY,KAAZ,CAAkBD,CAAlB,CAAwB,IAAxB,CAA6BA,CAA7B,CAAmC,QAAnC,CAA4CC,CAA5C,CAA+C,IAA/C,CADS,CAEX,OAAO,CAAC3sB,MAAOG,CAAR,CAAkB8rB,GAAAA,CAAlB,CAA8BP,KAAAA,CAA9B,CA5B0D,CA+BnEW,QAAA,GAAwB,CAAClsB,CAAD,CAAW7E,CAAX,CAAkB,CACpC+vB,CAAAA,CAAKlrB,CAAAqD,MAAA,CAAeopB,EAAf,CACTvB,EAAA,CAAG,CAAH,CAAA,EAAS/vB,CACT,OAAO+vB,EAAA9X,KAAA,CAAQqZ,EAAR,CAHiC;AAO1CR,QAAA,GAAsB,CAACjsB,CAAD,CAAWyqB,CAAX,CAAsB,CAC1C,IAAI/rB,EAAIsB,CAAAmD,MAAA,CAAeupB,EAAf,CAER,OAAA,CADIL,CACJ,CADY3tB,CACZ,EADiBA,CAAA,CAAE,CAAF,CAAAylB,KAAA,EACjB,EADgC,EAChC,EACOkI,CAAA,CAAM,CAAN,CAAAlpB,MAAA,CAAewpB,EAAf,CAAL,CAcS3sB,CAAA6B,QAAA,CAAiB6qB,EAAjB,CAA6B,QAAQ,CAAChuB,CAAD,CAAI4F,CAAJ,CAAU+nB,CAAV,CAAiB,CAC3D,MAAO5B,EAAP,CAAmB4B,CADwC,CAAtD,CAdT,CAEqBA,CAAAhpB,MAAA,CAAYspB,EAAZ,CAAAC,CAAoC,CAApCA,CAEnB,GAAqBnC,CAArB,CACS4B,CADT,CAKSQ,EAVb,CAyBS7sB,CAAA6B,QAAA,CAAiB6pB,EAAjB,CAAuBjB,CAAvB,CA5BiC,CA6C5CqC,QAAA,GAAqB,CAAClF,CAAD,CAAO,CACtBA,CAAA,SAAJ,GAAyBmF,EAAzB,GACEnF,CAAA,SADF,CACqB,MADrB,CAD0B,CAS5B,EAAA,UAAA,EAAA,CAAAoF,QAA0B,CAAChtB,CAAD,CAAW,CACnC,MAAOA,EAAAmD,MAAA,CAAe6oB,EAAf,CAAA,CACL,IAAAhB,EAAA,CAA+BhrB,CAA/B,CAAyCitB,EAAzC,CADK,CAELf,EAAA,CAA8BlsB,CAAAmkB,KAAA,EAA9B,CAA+C8I,EAA/C,CAHiC,CAxSvCC,EAAA,OAAA,iBAAA,CAAA,EAAA,UAAA,CAAA,CAAA,EACM,CAAA,aAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,IAAajD,QAAA,EAAA,CACf,MAJeA,aAGA,CAAb,CADN,CAAA,CA+SA;IAAIoB,GAAM,yBAAV,CACI4B,GAAqB,oBADzB,CAEI9B,GAAuB,GAF3B,CAGIQ,GAAsB,wCAH1B,CAIIgB,GAAyB,SAJ7B,CAKIjB,GAAO,OALX,CAMIqB,GAAO,OANX,CAOIf,GAAU,WAPd,CAQIP,GAAgB,IAAI0B,MAAJ,CAAW,IAAX,CAAgBnB,EAAhB,CAAuB,GAAvB,CARpB,CAYIU,GAAa,0CAZjB,CAcIN,GAAgB,gDAdpB,CAeIE,GAAY,2BAfhB,CAgBI3B,GAAmB,GAhBvB,CAiBI8B,GAAgB,GAjBpB,CAkBIvC,GAAQ,OAlBZ,CAmBI2C,GAAoB,kBAnBxB,CAqBAjD,EAAe,IAAIH,E,CC5TjBrrB,QA7BmBgvB,GA6BR,CAACC,CAAD,CAAMpmB,CAAN,CAAmBqmB,CAAnB,CAAuDhE,CAAvD,CAAgF,CAEzF,IAAAe,EAAA,CAAkBgD,CAAlB,EAAyB,IAEzB,KAAApmB,EAAA,CAAmBA,CAAnB,EAAkC,IAElC,KAAAqmB,EAAA,CAA6BA,CAA7B,EAAsD,EAEtD,KAAAC,EAAA,CAA+B,IAM/B,KAAAjE,EAAA,CAAqBA,CAArB,EAAsC,EAMtC,KAAAkE,EAAA,CAFA,IAAAC,EAEA,CAJA,IAAAC,EAIA,CAJuB,IAhBkE,CAxB3F9sB,QAAO,EAAG,CAAC7C,CAAD,CAAO,CACf,MAAIA,EAAJ,CACSA,CAAA,YADT,CAGS,IAJM,CAYjB4R,QAAO,GAAG,CAAC5R,CAAD,CAAO4vB,CAAP,CAAkB,CAE1B,MADA5vB,EAAA,YACA,CADgB4vB,CADU,CAkC5B,EAAA,UAAA,EAAA,CAAAC,QAAc,EAAG,CACf,MAAO,KAAAvD,EADQ,CAKnB+C,GAAAplB,UAAA,eAAA,CAAwColB,EAAAplB,UAAA4lB,E,CChDhB/iB,QAAA,GAAQ,CAAC7K,CAAD,CAAW,CACzC,IAAM6tB,EAAS,IAAAjjB,QAATijB,EAAyB,IAAAhjB,gBAAzBgjB,EACJ,IAAA/iB,mBADI+iB,EACuB,IAAA9iB,kBADvB8iB,EAEJ,IAAA7iB,iBAFI6iB,EAEqB,IAAA5iB,sBAC3B,OAAO4iB,EAAP,EAAiBA,CAAAzlB,KAAA,CAAY,IAAZ,CAAkBpI,CAAlB,CAJwB,CAO3C,IAAMkK,GAAQtF,SAAAC,UAAA1B,MAAA,CAA0B,SAA1B,CAId,SAAM2qB,GAAN,EAAA,EAUEC,QAAA,GAAc,CAACxI,CAAD,CAAQ,CAAA,IACHyI,EAAQ,EADL,CACSC,EAAY,EADrB,CACyBC,EAAY,CHiB7C1G,EGhBZ,CAAsBjC,CAAtB,CAA6B,QAAQ,CAACqC,CAAD,CAAO,CAC1CuG,EAAA,CAAkBvG,CAAlB,CAEAA,EAAA5U,MAAA,CAAakb,CAAA,EACmB5I,EAAAA,CAAAsC,CAAAwG,EAAA9I,QAwElC,KADA,IAAI5mB,CACJ,CAAQA,CAAR,CLhHSwoB,EKgHGmH,KAAA,CAAqB/I,CAArB,CAAZ,CAAA,CAA4C,CAC1C,IAAI1lB,EAAOlB,CAAA,CAAE,CAAF,CAGE,IAAb,GAAIA,CAAA,CAAE,CAAF,CAAJ,GA5E2DsvB,CA6EzD,CAAMpuB,CAAN,CADF,CACgB,CAAA,CADhB,CAJ0C,CA5EA,CAA5C,CAKG0uB,QAAwB,CAAC1G,CAAD,CAAO,CAChCqG,CAAAliB,KAAA,CAAe6b,CAAf,CADgC,CALlC,CASArC,EAAAgJ,EAAA,CAAmBN,CAEfO,EAAAA,CAAQ,EACZ,KAAKjuB,IAAIA,CAAT,GAAcytB,EAAd,CACEQ,CAAAziB,KAAA,CAAWxL,CAAX,CAEF,OAAOiuB,EAjBa;AAqBtBL,QAAA,GAAY,CAACvG,CAAD,CAAO,CACjB,GAAIwG,CAAAxG,CAAAwG,EAAJ,CAAA,CADiB,IAIbxC,EAAO,EAJM,CAIF6C,EAAa,EACRC,GAAAC,CAAuB/G,CAAvB+G,CAA6BF,CAA7BE,CACpB,GACE/C,CAAA6C,EAEA,CAFkBA,CAElB,CAAA7G,CAAA,MAAA,CAAgB,IAHlB,CAKAgE,EAAAtG,QAAA,CAAmCsC,CAkCCtC,cAM7BzjB,QAAA,CLtGEwlB,EKsGF,CAA8B,EAA9B,CAAAxlB,QAAA,CL5GEmlB,EK4GF,CACmB,EADnB,CAvCPY,EAAAwG,EAAA,CAAoBxC,CAXpB,CADiB,CAiBnB8C,QAAA,GAAiB,CAAC9G,CAAD,CAAO6G,CAAP,CAAmB,CAClC,IAAI7C,EAAOhE,CAAAwG,EACX,IAAIxC,CAAJ,CACE,IAAIA,CAAA6C,EAAJ,CAEE,MADA/tB,OAAAkuB,OAAA,CAAcH,CAAd,CAA0B7C,CAAA6C,EAA1B,CACO,CAAA,CAAA,CAFT,CADF,IAKO,CAEDnJ,CAAAA,CAAUsC,CAAA,cAGd,KAFA,IAAI/nB,CAEJ,CAAQnB,CAAR,CLtFOsoB,EKsFKqH,KAAA,CAAQ/I,CAAR,CAAZ,CAAA,CAA+B,CAE7BzlB,CAAA,CAAQskB,CAACzlB,CAAA,CAAE,CAAF,CAADylB,EAASzlB,CAAA,CAAE,CAAF,CAATylB,MAAA,EAER,IAAc,SAAd,GAAItkB,CAAJ,EAAqC,OAArC,GAA2BA,CAA3B,CACE4uB,CAAA,CAAW/vB,CAAA,CAAE,CAAF,CAAAylB,KAAA,EAAX,CAAA,CAA0BtkB,CAE5BgvB,EAAA,CAAM,CAAA,CAPuB,CAS/B,MAAOA,EAdF,CAP2B;AAoEpCC,QAAA,GAAgB,CAAhBA,CAAgB,CAACC,CAAD,CAAWf,CAAX,CAAkB,CAG5Be,CAAJ,GAEIA,CAFJ,CAC8B,CAA5B,EAAIA,CAAAvrB,QAAA,CAAiB,GAAjB,CAAJ,CACawrB,EAAA,CAAAA,CAAA,CAAwBD,CAAxB,CAAkCf,CAAlC,CADb,CHqDUtF,EG9BG,CAAqCqG,CAArC,CAlBFnU,QAAQ,CAACoO,CAAD,CAASnpB,CAAT,CAAgBspB,CAAhB,CAA0BF,CAA1B,CAAkC,CACjD,GAAI,CAACppB,CAAL,CACE,MAAOmpB,EAAP,CAAgBC,CAIlB,EAFIgG,CAEJ,CAFoBH,EAAA,CALX/D,CAKW,CAAsBiD,CAAA,CAAMnuB,CAAN,CAAtB,CAAoCmuB,CAApC,CAEpB,GAAwC,SAAxC,GAAsBiB,CAAtB,CAI6B,oBAJ7B,GAIWA,CAJX,GAQEA,CARF,CAQkB,SARlB,EAEEA,CAFF,CAEkBH,EAAA,CATT/D,CASS,CAAsBiD,CAAA,CAAM7E,CAAN,CAAtB,EAAyCA,CAAzC,CAAmD6E,CAAnD,CAFlB,EAGE7E,CAOF,OAAOH,EAAP,EAAiBiG,CAAjB,EAAkC,EAAlC,EAAwChG,CAhBS,CAkBxC,CAxBf,CA2BA,OAAO8F,EAAP,EAAmBA,CAAA5K,KAAA,EAAnB,EAAsC,EA9BN;AAkClC6K,QAAA,GAAkB,CAAlBA,CAAkB,CAACD,CAAD,CAAWf,CAAX,CAAkB,CAC9BkB,CAAAA,CAAQH,CAAA1rB,MAAA,CAAe,GAAf,CACZ,KAFkC,IAEzB9C,EAAE,CAFuB,CAEpBoK,CAFoB,CAEjBjM,CAAjB,CAAoB6B,CAApB,CAAsB2uB,CAAAnyB,OAAtB,CAAoCwD,CAAA,EAApC,CACE,GAAKoK,CAAL,CAASukB,CAAA,CAAM3uB,CAAN,CAAT,CAAoB,CLlLb0mB,EKmLLkI,UAAA,CAA2B,CAE3B,IADAzwB,CACA,CLrLKuoB,EKoLDoH,KAAA,CAAoB1jB,CAApB,CACJ,CACEA,CAAA,CAAImkB,EAAA,CAAAA,CAAA,CAAsBd,CAAA,CAAMtvB,CAAA,CAAE,CAAF,CAAN,CAAtB,CAAmCsvB,CAAnC,CADN,KAIE,IADIoB,CACA,CADQzkB,CAAAnH,QAAA,CAAU,GAAV,CACR,CAAW,EAAX,GAAA4rB,CAAJ,CAAkB,CAChB,IAAIC,EAAK1kB,CAAAuZ,UAAA,CAAYkL,CAAZ,CACTC,EAAA,CAAKA,CAAAlL,KAAA,EACLkL,EAAA,CAAKP,EAAA,CAAAA,CAAA,CAAsBO,CAAtB,CAA0BrB,CAA1B,CAAL,EAAyCqB,CACzC1kB,EAAA,CAAIA,CAAAuZ,UAAA,CAAY,CAAZ,CAAekL,CAAf,CAAJ,CAA4BC,CAJZ,CAOpBH,CAAA,CAAM3uB,CAAN,CAAA,CAAYoK,CAAD,EAAMA,CAAA4Z,YAAA,CAAc,GAAd,CAAN,GAA6B5Z,CAAA5N,OAA7B,CAAwC,CAAxC,CAET4N,CAAAsH,MAAA,CAAQ,CAAR,CAAY,EAAZ,CAFS,CAGTtH,CAHS,EAGJ,EAjBW,CAoBtB,MAAOukB,EAAA9b,KAAA,CAAW,GAAX,CAvB2B;AAoFpCkc,QAAA,GAAsB,CAAC/J,CAAD,CAAQtpB,CAAR,CAAiB,CAAA,IACjC+xB,EAAQ,EADyB,CAGjCxL,EAAI,EHjNIgF,EGmNZ,CAAsBjC,CAAtB,CAA6B,QAAQ,CAACqC,CAAD,CAAO,CAGrCA,CAAAwG,EAAL,EACED,EAAA,CAAkBvG,CAAlB,CAKF,KAAI2H,EAAkB3H,CAAAiD,EAAlB0E,EAA8C3H,CAAA,eAC9C3rB,EAAJ,EAAe2rB,CAAAwG,EAAAK,EAAf,EAA+Cc,CAA/C,EACM1kB,EAAAzC,KAAA,CAAqBnM,CAArB,CAA8BszB,CAA9B,CADN,GAEIb,EAAA,CAAuB9G,CAAvB,CAA6BoG,CAA7B,CAiUR,CA/TqBhb,CA+TrB,CA/TqB4U,CAAA5U,MA+TrB,CAFIwP,CAEJ,CAFQgN,QAAA,CAAS3pB,CAAT,CAAa,EAAb,CAAiB,EAAjB,CAER,CA/TiC2c,CA+TjC,CAAKA,CAAL,CAAA,EA/TiCA,CA+TtB,CAAKA,CAAL,CAAX,EAAsB,CAAtB,EADQ,CACR,EADc3c,CACd,CADkB,EAlUd,CAV0C,CAA5C,CAiBG,IAjBH,CAiBS,CAAA,CAjBT,CAkBA,OAAO,CAAC4oB,EAAYT,CAAb,CAAoByB,IAAKjN,CAAzB,CAvB8B;AAgCvCkN,QAAA,GAAkB,CAACv0B,CAAD,CAAQysB,CAAR,CAAc+H,CAAd,CAAwBjzB,CAAxB,CAAkC,CAC7CkrB,CAAAwG,EAAL,EACED,EAAA,CAAkBvG,CAAlB,CAEF,IAAKA,CAAAwG,EAAAK,EAAL,CAAA,CAGI,IAAA,EH1DQpF,CG0Dc,CAAuBluB,CAAvB,CAArB,EAAA,CAAA,CAAA,GAAI,EAAA,CAAA,CAAA,EACLsvB,EAAAA,CAAYlB,CAAA,CACdmB,EAAA,CAAgCnB,CAAhC,CAAoCD,CAApC,CADc,CAEd,MACF,KAAIsG,EAAiBhI,CAAA,eAArB,CACIiI,EAA6B,WAA7BA,GAAUD,CAAVC,EAA+D,MAA/DA,GAA4CD,CADhD,CAEIE,EAA6C,CAA7CA,GAASF,CAAApsB,QAAA,CAAuB,OAAvB,CAATssB,EAAkD,CAACD,CAItC,QAAjB,GAAIF,CAAJ,GAEEE,CAEA,CAFSD,CAET,GAF6BnF,CAE7B,CAFyC,OAEzC,CAFmDA,CAEnD,EAFqG,EAErG,GAFiEmF,CAAApsB,QAAA,CAAuB,MAAvB,CAEjE,CAAAssB,CAAA,CAAS,CAACD,CAAV,EAA0D,CAA1D,GAAoBD,CAAApsB,QAAA,CAAuBinB,CAAvB,CAJtB,CAMiB,SAAjB,GAAIkF,CAAJ,GACEE,CACA,CAD4B,WAC5B,GADSD,CACT,EAD8D,MAC9D,GAD2CA,CAC3C,CAAAE,CAAA,CAASA,CAAT,EAAmB,CAACD,CAFtB,CAIA,IAAKA,CAAL,EAAgBC,CAAhB,CAGIP,CAeJ,CAfsB9E,CAetB,CAdIqF,CAcJ,GAZOlI,CAAAiD,EAUL,GAREjD,CAAAiD,EAQF,CAPEC,EAAA,CFwBOlB,CExBP,CACEhC,CADF,CFwBOgC,CEtBLoB,EAFF,CAGqCzB,CFjMzC,CACSoB,EADT,CEiMyCpB,CFjMzC,CAGS,EE2LL,CAIEkB,CAJF,CAOF,EAAA8E,CAAA,CAAkB3H,CAAAiD,EAAlB,EAA8CJ,CAEhD,EAAA/tB,CAAA,CAAS,CACPsD,GAAUuvB,CADH,CAEPO,GAAQA,CAFD,CAGPD,GAAQA,CAHD,CAAT,CAzCA,CAJkD;AAwDpDE,QAAA,GAA6B,CAAC50B,CAAD,CAAQoqB,CAAR,CAAe,CAAA,IACtCyK,EAAY,EAD0B,CACtBC,EAAY,EADU,CAGtCN,EAAWpK,CAAXoK,EAAoBpK,CAAA,WHzSZiC,EG0SZ,CAAsBjC,CAAtB,CAA6B,QAAQ,CAACqC,CAAD,CAAO,CAE1C8H,EAAA,CAAwBv0B,CAAxB,CAA+BysB,CAA/B,CAAqC+H,CAArC,CAA+C,QAAQ,CAAC/D,CAAD,CAAO,CAExD/gB,EAAAzC,KAAA,CADUjN,CAAA+0B,EACV,EAD4B/0B,CAC5B,CAA8BywB,CAAA5rB,GAA9B,CAAJ,GACM4rB,CAAAkE,GAAJ,CACEpB,EAAA,CAAuB9G,CAAvB,CAA6BoI,CAA7B,CADF,CAGEtB,EAAA,CAAuB9G,CAAvB,CAA6BqI,CAA7B,CAJJ,CAF4D,CAA9D,CAF0C,CAA5C,CAYG,IAZH,CAYS,CAAA,CAZT,CAaA,OAAO,CAACA,GAAWA,CAAZ,CAAuBD,GAAWA,CAAlC,CAjBmC;AAyB5CG,QAAA,GAAe,CAAfA,CAAe,CAACl0B,CAAD,CAAUwyB,CAAV,CAAsBhB,CAAtB,CAAqC,CAE9C,IAAA,EHtIQpE,CGsIc,CAAuBptB,CAAvB,CAAtB,CACAm0B,EAAe1F,EAAA,CADd,CAAAnB,GACc,CADV,CAAAD,EACU,CADf,CAMA+G,EAAS,IAAIlD,MAAJ,CLtXUmD,eKsXV,EAHQr0B,CAAAutB,QAAA+G,CACnB,IADmBA,CACZH,CAAAne,MAAA,CAAmB,CAAnB,CAAuB,EAAvB,CADYse,CACgB,KADhBA,CAEnBH,CACW,ELrXUI,iBKqXV,CAETjL,EAAAA,CAAQkL,CAAA,CAAcx0B,CAAd,CAAAouB,EACZ,KAAIqG,EACFC,EAAA,CAAyCpL,CAAzC,CAAgDkI,CAAhD,CACF,OAAOrD,GAAA,CAA+BnuB,CAA/B,CAAwCspB,CAAxC,CAA+C,QAAQ,CAACqC,CAAD,CAAO,CAvLrE,IAAIgJ,EAAS,EAwLUhJ,EAtLlBwG,EAAL,EACED,EAAA,CAqLqBvG,CArLrB,CAqLqBA,EAnLnBwG,EAAA9I,QAAJ,GACEsL,CADF,CACW5B,EAAA,CAqKAjE,CArKA,CAkLYnD,CAlLYwG,EAAA9I,QAAxB,CAkLkBmJ,CAlLlB,CADX,CAmLuB7G,EAhLvB,QAAA,CAAkBgJ,CAiLhB,IAAI,CNlYGpK,CMkYP,EACI,CH1VMmB,EG0VL,CAA8BC,CAA9B,CADL,EAEIA,CAAA,QAFJ,CAEqB,CA3KvB,IAAIgJ,EADAC,CACAD,CA8K6BhJ,CA/KrB,QAEc,KAA1B,EA6KiCA,CA7K7BkJ,GAAJ,GA6KiClJ,CA3K/BkJ,GAFF,CLzNS3J,EK2NcxiB,KAAA,CAAwBksB,CAAxB,CAFvB,CAKA,IAwKiCjJ,CAxK7BkJ,GAAJ,CAIE,GAAqC,IAArC,EAoK+BlJ,CApK3BmJ,EAAJ,CAA2C,CAoKZnJ,CAnK7BmJ,EAAA,CAAgC,EAChC,KAAKC,IAAIA,CAAT,GAkKmCN,EAlKnC,CACEO,CAIA,CA6JiCP,CAjKrB,CAAmBM,CAAnB,CAIZ,CAHAJ,CAGA,CAHSK,CAAA,CAAUJ,CAAV,CAGT,CAAIA,CAAJ,GAAcD,CAAd,GACEC,CACA,CADQD,CACR,CA2JyBhJ,CA3JzBmJ,EAAAhlB,KAAA,CAAmCilB,CAAnC,CAFF,CAPuC,CAA3C,IAYO,CAGL,IAASzwB,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAqJ6BqnB,CArJTmJ,EAAAh0B,OAApB,CAA0D,EAAEwD,CAA5D,CACE0wB,CACA,CAmJiCP,CApJrB,CAoJe9I,CApJImJ,EAAA,CAA8BxwB,CAA9B,CAAnB,CACZ,CAAAswB,CAAA,CAAQI,CAAA,CAAUJ,CAAV,CAEVD,EAAA,CAASC,CAPJ,CAwJwBjJ,CA9IjC,QAAA,CAAkBgJ,CA+IMhJ,EA4ExBiD,EAAA,CA5EwBjD,CA4EGiD,EAA3B,EA5EwBjD,CA4E+B,SAEnDzsB,EAAAA,CAAQ,GAARA,CA9EgDsyB,CA+EhDyB;CAAAA,CA/EoBtH,CA6ETiD,EAEHxnB,MAAA,CAAe,GAAf,CACH9C,EAAAA,CAAE,CAAX,KALkD,IAKpCmG,EAAEwoB,CAAAnyB,OALkC,CAKpB4N,CAA9B,CAAkCpK,CAAlC,CAAoCmG,CAApC,GAA2CiE,CAA3C,CAA6CukB,CAAA,CAAM3uB,CAAN,CAA7C,EAAwDA,CAAA,EAAxD,CACE2uB,CAAA,CAAM3uB,CAAN,CAAA,CAAWoK,CAAAxH,MAAA,CAjFiBktB,CAiFjB,CAAA,CACT1lB,CAAA9I,QAAA,CAlFkCuuB,CAkFlC,CAAwBj1B,CAAxB,CADS,CAETA,CAFS,CAED,GAFC,CAEKwP,CAnFMid,EAqFxB,SAAA,CAAmBsH,CAAA9b,KAAA,CAAW,GAAX,CAzFI,CAJ8C,CAA9D,CAb2C,CAgCpDud,QAAA,GAA0B,CAAUpL,CAAV,CAAiBkI,CAAjB,CAAgC,CACpDyD,CAAAA,CAAiB3L,CAAAgJ,EACrB,KAAImC,EAAqB,EACzB,IAAI,CNtZKlK,CMsZT,EAAqB0K,CAArB,CAIE,IAJmC,IAI1B3wB,EAAI,CAJsB,CAInB+lB,EAAgB4K,CAAA,CAAe3wB,CAAf,CAAhC,CACKA,CADL,CACS2wB,CAAAn0B,OADT,CAEKupB,CAFL,CAEqB4K,CAAA,CAAe,EAAE3wB,CAAjB,CAFrB,CAE0C,CACnB+lB,IAAAA,EAAAA,CAAAA,CAAemH,EAAAA,CAiCxC7F,EAAAuJ,EAAA,CAAuB,IAAIhE,MAAJ,CAAW,KAAX,CAAiBvF,CAAA,cAAjB,CAAsC,WAAtC,CAAmD,GAAnD,CACvBA,EAAAwJ,EAAA,CAAgCxJ,CAAA,cAAhC,CAAwD,GAAxD,CAA8DyJ,CAC9DzJ,EAAAiD,EAAA,CAA2BjD,CAAAiD,EAA3B,EAAuDjD,CAAA,SACvDA,EAAA,SAAA,CAAmBA,CAAAiD,EAAAhpB,QAAA,CACf+lB,CAAA,cADe,CACQA,CAAAwJ,EADR,CAnCfV,EAAA,CAAmBpK,CAAA,cAAnB,CAAA,CACIgL,EAAA,CAA+BhL,CAA/B,CAHoC,CAM5C,MAAOoK,EAfiD,CAwB1DY,QAAA,GAAyB,CAAChL,CAAD,CAAgB,CACvC,MAAO,SAAQ,CAAChB,CAAD,CAAU,CACvB,MAAOA,EAAAzjB,QAAA,CACHykB,CAAA6K,EADG,CAEH7K,CAAA8K,EAFG,CADgB,CADc;AA4IzCG,QAAA,GAAgB,CAAC7J,CAAD,CAAQ+G,CAAR,CAAoB,CAApC8C,IAAAA,EAgCa3H,EAhCb2H,CACMhM,EH7hBQkC,EG6hBA,CAAwDC,CAAxD,CAEZA,EAAA5nB,YAAA,CHhjBYynB,CGgjBQ,CAAoBhC,CAApB,CAA2B,QAAQ,CAAiBqC,CAAjB,CAAuB,CAC5E,IAAI2C,EAAM3C,CAAA,QAAN2C,CAAwB3C,CAAA,cACxBA,EAAAwG,EAAJ,EAAyBxG,CAAAwG,EAAA9I,QAAzB,GASEiF,CAEA,CAFuDA,CPlXtD1oB,QAAA,CACI2jB,EADJ,CACmB,EADnB,CAAA3jB,QAAA,CAEI4jB,EAFJ,CAEkB,EAFlB,COoXD,CAAAmC,CAAA,QAAA,CAAkBoH,EAAA,CAdXjE,CAcW,CAAwBR,CAAxB,CAA6BkE,CAA7B,CAXpB,CAF4E,CAA1D,CAHc,CA/hBtCvB,CAAA,OAAA,iBAAA,CAAA,EAAA,UAAA,CAAA,CAAA,EACM,CAAA,aAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,IAAcsE,QAAA,EAAA,CAChB,MAJgBA,SAGA,CAAd,CADN,CAAA,CA+jBA,KAAA5H,GAAe,IAAIkE,E,CCnlBnB,IAAI2D,GAAiB,EAArB,CAKMC,GAAKn2B,MAAA,eACX,IAAIm2B,EAAJ,EAAU,CPVGlL,COUb,CAAyB,CAIvB,IAAMmL,GAAaD,EAAA,OAUnBA,GAAA,OAAA,CAJsBE,QAAA,CAAChyB,CAAD,CAAOiyB,CAAP,CAAcxX,CAAd,CAA0B,CJyGhD,IAAIyX,EAAcp2B,QAAAq2B,cAAA,CAAuB,wBAAvB,CIxG6BnyB,CJwG7B,CACN,GADM,CAAlB,CAIIzE,EAAQO,QAAAmD,KACZ1D,EAAA+L,aAAA,CAAmB4qB,CAAnB,EAHYxJ,CAAA0J,CACV1J,CAAA,YADU0J,CACyB,IAErC,GAAyC72B,CAAAyC,WAAzC,CACA0qB,EAAA,CAAoBwJ,CI9GlBL,GAAA,CAAe7xB,CAAf,CAAA,CJ+GKkyB,CI9GLH,GAAAvpB,KAAA,CAAsDspB,EAAtD,CAA2D9xB,CAA3D,CAAiEiyB,CAAjE,CAAwExX,CAAxE,CAF8C,CAVzB,C,CCVvBjc,QADmB6zB,GACR,EAAgB,CAEzB,IAAAC,MAAA,CAAa,EAFY,CAgB3B,EAAA,UAAA,MAAA,CAAAC,QAAK,CAACC,CAAD,CAAU3D,CAAV,CAAsB4D,CAAtB,CAAoC5E,CAApC,CAAmD,CACtD,IAAIrtB,EAAO,IAAA8xB,MAAA,CAAWE,CAAX,CAAPhyB,EAA8B,EAClCA,EAAA2L,KAAA,CAAU,CAAC0iB,EAAAA,CAAD,CAAa4D,aAAAA,CAAb,CAA2B5E,EAAAA,CAA3B,CAAV,CAlBoB6E,IAmBpB,CAAIlyB,CAAArD,OAAJ,EACEqD,CAAAwL,MAAA,EAEF,KAAAsmB,MAAA,CAAWE,CAAX,CAAA,CAAsBhyB,CANgC,CASxD,GAAA,UAAA,MAAA,CAAAmyB,QAAK,CAACH,CAAD,CAAU3D,CAAV,CAAsB+D,CAAtB,CAAwC,CAE3C,GADIpyB,CACJ,CADW,IAAA8xB,MAAA,CAAWE,CAAX,CACX,CAIA,IAAK,IAAI5V,EAAMpc,CAAArD,OAANyf,CAAoB,CAA7B,CAAuC,CAAvC,EAAgCA,CAAhC,CAA0CA,CAAA,EAA1C,CAAiD,CAC/C,IAAIiW,EAAQryB,CAAA,CAAKoc,CAAL,CAAZ,CACI,CA3B4C,EAAA,CAAA,CAClD,IAASA,CAAT,CAAe,CAAf,CAAkBA,CAAlB,CA0BwCgW,CA1BhBz1B,OAAxB,CAAiDyf,CAAA,EAAjD,CAAwD,CACtD,IAAIkW,EAyBkCF,CAzB7B,CAAiBhW,CAAjB,CACT,IAwBmBiW,CAxBfhE,EAAA,CAAsBiE,CAAtB,CAAJ,GAwB0BjE,CAxBQ,CAAWiE,CAAX,CAAlC,CAAkD,CAChD,CAAA,CAAO,CAAA,CAAP,OAAA,CADgD,CAFI,CAMxD,CAAA,CAAO,CAAA,CAP2C,CA2BhD,GAAI,CAAJ,CACE,MAAOD,EAHsC,CANN,C,CCrB5BnmB,QAAA,GAAQ,EAAG;AAgC9BqmB,QAASA,GAAO,CAACC,CAAD,CAAO,CACrB,IAAK,IAAI9b,EAAE,CAAX,CAAcA,CAAd,CAAkB8b,CAAA71B,OAAlB,CAA+B+Z,CAAA,EAA/B,CAAoC,CAClC,IAAI+b,EAAMD,CAAA,CAAK9b,CAAL,CACV,IAAI+b,CAAAhrB,OAAJ,GAAmBnM,QAAAic,gBAAnB,EACEkb,CAAAhrB,OADF,GACiBnM,QAAAmD,KADjB,CAIA,IAAK,IAAI0B,EAAE,CAAX,CAAcA,CAAd,CAAkBsyB,CAAAprB,WAAA1K,OAAlB,CAAyCwD,CAAA,EAAzC,CAA8C,CAC5C,IAAIsF,EAAIgtB,CAAAprB,WAAA,CAAelH,CAAf,CACR,IAAIsF,CAAA7H,SAAJ,GAAmBC,IAAAC,aAAnB,CAAA,CAIA,IAAIwK,EAAO7C,CAAAiE,YAAA,EACwBjE,KAAAA,EAAAA,CAvCvC,KAAIitB,EAAU,EACV72B,EAAA8tB,UAAJ,CACE+I,CADF,CACY9kB,KAAAC,KAAA,CAAWhS,CAAA8tB,UAAX,CADZ,CAEW9tB,CAFX,WAE8BV,OAAA,WAF9B,EAEsDU,CAAA82B,aAAA,CAAqB,OAArB,CAFtD,GAGED,CAHF,CAGY72B,CAAAsF,aAAA,CAAqB,OAArB,CAAA8B,MAAA,CAAoC,KAApC,CAHZ,CAKA,EAAA,CAAOyvB,CASHtW,EAAAA,CAAMsW,CAAAtvB,QAAA,CLoUGomB,CKpUaK,EAAhB,CA0BN,KAzBJ,CAyBI,CAzBO,EAAX,CAAIzN,CAAJ,CACSsW,CAAA,CAAQtW,CAAR,CAAc,CAAd,CADT,CAGO,EAsBH,GAAoB9T,CAApB,GAA6B7C,CAAA1J,cAA7B,CACEutB,EAAA,CAAqB7jB,CAArB,CAAwBmtB,CAAxB,CAAsC,CAAA,CAAtC,CADF,KAEO,IAAItqB,CAAA1K,SAAJ,GAAsBC,IAAAuI,uBAAtB;CAEDlC,CAFC,CAEgCoE,CAADpE,KAF/B,EAQL,GADA2uB,CACI,CNiLI5J,CMlLG,CAAa/kB,CAAb,CAAAilB,GACP,CAAAyJ,CAAA,GAAiBC,CAArB,CAIE,IAFIC,CAEKzU,CAFMljB,MAAA,SAAA,cAAA,iBAAA6M,KAAA,CACbvC,CADa,CACV,QADU,CL8RV+jB,CK7RSK,EADC,CAC0B,GAD1B,CAENxL,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CAAoByU,CAAAn2B,OAApB,CAAqC0hB,CAAA,EAArC,CACExiB,EAAA,CAAyBi3B,CAAA,CAASzU,CAAT,CAAzB,CAAsCuU,CAAtC,CALJ,KASIA,EAGJ,EAFEtJ,EAAA,CAAqB7jB,CAArB,CAAwBmtB,CAAxB,CAAsC,CAAA,CAAtC,CAEF,CAAAtJ,EAAA,CAAqB7jB,CAArB,CAAwBotB,CAAxB,CA7BF,CAF4C,CANZ,CADf;AA4CvB,GAAI,CThFSzM,CSgFb,CAAmB,CACjB,IAAIvd,GAAW,IAAIxK,gBAAJ,CAAqBk0B,EAArB,CAAf,CACI/J,GAAQA,QAAA,CAAC7qB,CAAD,CAAU,CACpBkL,EAAArK,QAAA,CAAiBb,CAAjB,CAAuB,CAACe,UAAW,CAAA,CAAZ,CAAkBC,QAAS,CAAA,CAA3B,CAAvB,CADoB,CAStB,IAN4BxD,MAAA,eAM5B,EALE,CAACA,MAAA,eAAA,0BAKH,CACEqtB,EAAA,CAAMltB,QAAN,CADF,KAEO,CACL,IAAIy3B,GAAeA,QAAA,EAAM,CACvBvK,EAAA,CAAMltB,QAAA4B,KAAN,CADuB,CAIrB/B,OAAA,YAAJ,CACEA,MAAA,YAAA,UAAA,CAAmC43B,EAAnC,CADF,CAKEC,qBAAA,CAAsB,QAAQ,EAAG,CAC/B,GAA4B,SAA5B,GAAI13B,QAAA2B,WAAJ,CAAuC,CACrC,IAAIg2B,EAAWA,QAAQ,EAAG,CACxBF,EAAA,EACAz3B,SAAA6B,oBAAA,CAA6B,kBAA7B,CAAiD81B,CAAjD,CAFwB,CAI1B33B,SAAA8B,iBAAA,CAA0B,kBAA1B,CAA8C61B,CAA9C,CALqC,CAAvC,IAOEF,GAAA,EAR6B,CAAjC,CAVG,CAwBP7mB,EAAA,CAAQA,QAAQ,EAAG,CACjBqmB,EAAA,CAAQ1pB,EAAA6D,YAAA,EAAR,CADiB,CArCF;AA5ERR,IAAAgnB,GAAAhnB,E,CCDX,IAAMinB,GAAc,E,CCkBpB,IAAMC,GAAUC,OAAAC,QAAA,EAKTC,SAASA,GAAU,CAACC,CAAD,CAAa,CAErC,GADIz0B,CACJ,CDxBao0B,ECuBE,CAAYK,CAAZ,CACf,CACqBz0B,CAerB,yBAIA,CAnBqBA,CAeO,yBAI5B,EAJyD,CAIzD,CAnBqBA,CAiBrB,4BAEA,CAnBqBA,CAiBU,4BAE/B,EAF+D,CAE/D,CAnBqBA,CAmBrB,sBAAA,EAnBqBA,CAmBK,sBAA1B,EAAoD,CAApD,EAAyD,CAtBpB,CAyChC00B,QAASA,GAAe,CAAC10B,CAAD,CAAW,CACxC,MAAOA,EAAA,yBAAP,GAAqCA,CAAA,sBADG,CA4CnC20B,QAASA,GAAuB,CAAC30B,CAAD,CAAW,CAEhDA,CAAA,4BAAA,CAA+BA,CAAA,sBAE1BA,EAAA40B,EAAL,GACE50B,CAAA40B,EACA,CADuB,CAAA,CACvB,CAAAP,EAAAQ,KAAA,CAAa,QAAQ,EAAG,CAEtB70B,CAAA,yBAAA,CAA4BA,CAAA,sBAC5BA,EAAA40B,EAAA,CAAuB,CAAA,CAHD,CAAxB,CAFF,CAJgD,C,CC9GlD,IAAIE,GAAe,IAAnB,CAGIx2B,GAAYlC,MAAA,YAAZkC,EAAqClC,MAAA,YAAA,UAArCkC,EAA2E,IAH/E,CAMIy2B,EAKWC,SAASA,GAAY,CAACz3B,CAAD,CAAW,CAC7C02B,qBAAA,CAAsB,QAAQ,EAAG,CAC3B31B,EAAJ,CACEA,EAAA,CAAUf,CAAV,CADF,EAGOu3B,EAYL,GAXEA,EACA,CADe,IAAIR,OAAJ,CAAY,QAAA,CAACC,CAAD,CAAa,CAACQ,EAAA,CAAYR,CAAb,CAAzB,CACf,CAA4B,UAA5B,GAAIh4B,QAAA2B,WAAJ,CACE62B,EAAA,EADF,CAGEx4B,QAAA8B,iBAAA,CAA0B,kBAA1B,CAA8C,QAAA,EAAM,CACtB,UAA5B,GAAI9B,QAAA2B,WAAJ,EACE62B,EAAA,EAFgD,CAApD,CAOJ,EAAAD,EAAAD,KAAA,CAAkB,QAAQ,EAAE,CAAEt3B,CAAA,EAAYA,CAAA,EAAd,CAA5B,CAfF,CAD+B,CAAjC,CAD6C,C,CCM/C,IAAM03B,GAAa,ILnBJnC,EKsBb7zB,SADmBi2B,EACR,EAAG,CAAA,IAAA,EAAA,IACZ,KAAAC,EAAA,CAAqB,EACrB,KAAAC,EAAA,CAAsB74B,QAAAic,gBACtB,KAAI0V,EAAM,IdWN5J,EcVJ4J,EAAA,MAAA,CAAe,EACf,KAAAmH,EAAA,CAA+BC,EAAA,CAAc,IAAAF,EAAd,CAAmC,IRrBvDnH,EQqBuD,CAAcC,CAAd,CAAnC,CAC/B,KAAAqH,EAAA,CAA4B,CAAA,CAG5B,KAAAC,EAAA,CAFA,IAAAC,EAEA,CAFkB,IDhBPT,GCmBX,CAAa,QAAA,EAAM,CACjBU,CAAA,CAAAA,CAAA,CADiB,CAAnB,CAVY,CAcd,CAAA,CArCF,CAAAC,UAqCEC,EAAAC,GAAA,CAAA1oB,QAAK,EAAG,CACNgnB,EAAA,EADM,CAORyB,EAAAE,GAAA,CAAAA,QAAW,CAACvN,CAAD,CAAQ,CACjB,MVhBYD,GUgBL,CAAwBC,CAAxB,CADU,CAGnBqN,EAAAG,GAAA,CAAAA,QAAgB,CAAC7H,CAAD,CAAM,CACpB,MVpCY9F,EUoCL,CAAoB8F,CAApB,CADa,CAoBtB0H;CAAAI,gBAAA,CAAAA,QAAe,CAACh2B,CAAD,CAAWy0B,CAAX,CAAwBtK,CAAxB,CAAuC,CACpD,GAAI8L,CAAAj2B,CAAAi2B,EAAJ,CAAA,CAGAj2B,CAAAi2B,EAAA,CAAqB,CAAA,CACrBj2B,EAAAS,KAAA,CAAgBg0B,CAChBz0B,EAAAqqB,QAAA,CAAmBF,CHnERiK,GGoEX,CAAYK,CAAZ,CAAA,CAA2Bz0B,CAnB3B,KAAA,EAAA,CADIuoB,CACJ,CAoBiCvoB,CArBrBC,QAAAoG,cAAA,CAA+B,OAA/B,CACZ,EAGOkiB,CAAAnmB,aAAA,CAAmB,WAAnB,CAHP,EAG0C,EAH1C,CACS,EVoNL8zB,KAAAA,EAAiB,EAEvB,KADA,IAAMC,EUjM6Bn2B,CAzBAC,QV0NwBc,iBAAA,CAAyB,OAAzB,CAA3D,CACSK,EAAI,CAAb,CAAgBA,CAAhB,CAAoB+0B,CAAAv4B,OAApB,CAAmCwD,CAAA,EAAnC,CAAwC,CACtC,IAAMmnB,EAAQ4N,CAAA,CAAO/0B,CAAP,CACd,IAAoBmnB,CDpPfqL,aAAA,CAvBuBwC,gBAuBvB,CCoPL,CACE,IAAI,CH/QG/O,CG+QP,CAAmB,CDnQvB,IAAM9kB,ECoQqBgmB,CDpQd5nB,YACRwnB,GAAAkO,IAAA,CAAiB9zB,CAAjB,CAAL,GACE4lB,EAAApa,IAAA,CAAiBxL,CAAjB,CAEA,CADM+zB,CACN,CCgQyB/N,CDjQRrZ,UAAA,CAAgB,CAAA,CAAhB,CACjB,CAAA3S,QAAAmD,KAAA+D,YAAA,CAA0B6yB,CAA1B,CAHF,CCoQM/N,EAAArrB,WAAA+R,YAAA,CAA6BsZ,CAA7B,CAFiB,CAAnB,CADF,IAME2N,EAAAtpB,KAAA,CAAoB2b,CAAA5nB,YAApB,CACA,CAAA4nB,CAAArrB,WAAA+R,YAAA,CAA6BsZ,CAA7B,CAToC,CAYxC,CAAA,CAAO2N,CAAAjiB,KAAA,CAAoB,EAApB,CAAA+Q,KAAA,EU7MDyH,EAAAA,CAAO,CACTrC,GAAIqK,CADK,CAETpK,QAASF,CAFA,CAGToM,GAAY/F,CAHH,Cb3EFnJ;CagFT,EACEkD,EAAA,CAAqBvqB,CAAAC,QAArB,CAAuCw0B,CAAvC,CAGFiB,EAAA,CAAAA,IAAA,CC3CIW,EAAAA,Cb1CKvO,Ea0CCtiB,KAAA,CD4CkB2gB,CC5ClB,CAANkQ,Eb3CKxO,Ea2C8BriB,KAAA,CD4CX2gB,CC5CW,Cb1C9B2B,Ga4CXkI,UAAA,CAAwB,Cb7CbnI,Ga8CXmI,UAAA,CAAuB,CD0CjB9B,EAAAA,Cd5CQ3J,Ec4CF,CAAM4B,CAAN,CCzCLkQ,ED2CL,EbtDSzO,CasDT,EAAuC,IAAA6N,EAAvC,EACE,IAAAA,EAAA,eAAA,CAAkCvH,CAAlC,CAAuCuG,CAAvC,CAEFz0B,EAAA,UAAA,CAAwBkuB,CACxBluB,EAAAw2B,EAAA,CAAqBhG,CAEjB6C,EAAAA,CAAmB,Eb5DdzL,Ea6DT,GACEyL,CADF,CACqBzE,EAAA,CAA+B5uB,CAAA,UAA/B,CADrB,CAGA,IAAI,CAACqzB,CAAAz1B,OAAL,EbhESgqB,CagET,CACare,CAGX,CbtGO8d,CamGI9d,CAAevJ,CAAAC,QAAfsJ,CAAkCA,IAG7C,CAFkBzB,CAElB,CN3ESwqB,EMyESxqB,CAAe2sB,CAAf3sB,CAElB,CAKEqe,CALF,CAKY8E,EAAA,CAN0BwB,CAM1B,CANgCzsB,CAAAomB,UAMhC,CALZ,CAOA,CAPA,CAMED,CAAAvoB,OAAJ,CVfYmrB,EUgBH,CAAmB5C,CAAnB,CAR+BsG,CAQHrC,GAA5B,CAAqCqM,CAArC,CAAiD3uB,CAAjD,CADT,CAFyD,IAAA,EAJvD,CAAA9H,CAAA02B,GAAA,CAAkBnO,CAEpBvoB,EAAA22B,GAAA,CAA6BtD,CAtC7B,CADoD,CA8EtDuD;QAAA,GAA2B,CAA3BA,CAA2B,CAAG,CACxBpB,CAAA,CAAAA,EAAJ,EAEWp5B,MAAAsrB,SAFX,EAE8BtrB,MAAAsrB,SAAAmP,qBAF9B,GAGE,CAAArB,EAGA,CAH2Ep5B,MAAAsrB,SAAAmP,qBAG3E,CADA,CAAArB,EAAA,kBACA,CADkD,QAAA,CAACjN,CAAD,CAAW,CANnC,CAMoCuO,GAAA,CAAqCvO,CAArC,CAAD,CAC7D,CAAA,CAAAiN,EAAA,iBAAA,CAAiD,QAAA,EAAM,CACrDvB,qBAAA,CAAsB,QAAA,EAAM,CAC1B,CATsB,CASlBuB,EAAA,SAAJ,EATsB,CASwBD,EAA9C,GATsB,CAUpBwB,EAAA,EAFwB,CAA5B,CADqD,CANzD,CAD4B,CAgB9BrB,QAAA,EAAO,CAAPA,CAAO,CAAG,CAvBJD,CAwBJuB,CAxBIvB,EAAJ,EAEWr5B,MAAAsrB,SAFX,EAE8BtrB,MAAAsrB,SAAAuP,UAF9B,GAwBAD,CArBEvB,EACA,CADkBr5B,MAAAsrB,SAAAuP,UAClB,CAoBFD,CApBEvB,EAAA,gBAAA,CFlHUjB,EE8GZ,CAyBAoC,GAAA,CAAAA,CAAA,CAFQ;AAOVhB,CAAAmB,EAAA,CAAAA,QAAiB,EAAG,CAClBrB,CAAA,CAAAA,IAAA,CACA,IAAK,IAAAF,EAAL,CAAA,CAGA,IAAI0B,EAAe,IAAA1B,EAAA,cAAA,EAEnB,IAAK,IAAAA,EAAA,SAAL,CAAA,CAGA,Gb9IS5N,Ca8IT,CAsKA,IAAK,IAAIxmB,EAAI,CAAb,CAAgBA,CAAhB,CAlKuC81B,CAkKnBt5B,OAApB,CAAyCwD,CAAA,EAAzC,CAA8C,CAE5C,IAAIoG,EApKJ2vB,IAoKQ3B,EAAA,uBAAA,CApK6B0B,CAmK7B7mB,CAAajP,CAAbiP,CACA,CACR,IAAI7I,CAAJ,EbvTOogB,CauTP,EArKAuP,IAuMwB1B,EAlCxB,CAkCyC,CACzC,IAAIvH,EVjWM5F,EUiWA,CAAwBC,CAAxB,CACVmN,EAAA,CAzMAyB,IAyMA,CAzMAA,KA0MA1B,EAAA,eAAA,CAAkCvH,CAAlC,CACA3F,EAAA5nB,YAAA,CVrXUynB,CUqXU,CAAoB8F,CAApB,CAJqB,CArCG,CAtK9C,IA+KA,KA9KEkJ,EAAA,CAAAA,IAAA,CAAuB,IAAAhC,EAAvB,CAA4C,IAAAC,EAA5C,CA8KOj0B,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CA7K0B81B,CA6KNt5B,OAApB,CAAyCwD,CAAA,EAAzC,CAGE,CADIoG,CACJ,CAhLA6vB,IA+KQ7B,EAAA,uBAAA,CA/KgB0B,CA8KhB7mB,CAAajP,CAAbiP,CACA,CACR,GACE+hB,EAAA,CAAiC5qB,CAAjC,CAjLF6vB,IAiLsChC,EAAA9G,EAApC,CA7KJ,KAAAiH,EAAA,SAAA,CAAyC,CAAA,CAErC,KAAAD,EAAJ,EAAiC,CbtJxB3N,CasJT,EACE,IAAA0P,cAAA,EAZF,CALA,CAFkB,CA4BpB1B;CAAA1C,aAAA,CAAAA,QAAY,CAAC/tB,CAAD,CAAOoyB,CAAP,CAAsB,CAC3B,IAAA,EV4COrN,CU5CD,CAAuB/kB,CAAvB,CAAN,GAAA,CACDqpB,EAAY8C,CAAA,CAAcnsB,CAAd,CAChB,IAAKqpB,CAAAA,CAAL,CAAA,CApFI,IAAA,EV8HQtE,CU9Hc,CAqFM/kB,CArFN,CAArB,EAAA,CAAA,CAAA,GAAI,EAAA,CAAA,CAAA,EACT,KAAI2C,ENvFOwqB,EMuFO,CAAelI,CAAf,CACdpqB,EAAAA,CH/GOo0B,EG+GI,CAAYhK,CAAZ,CAIf,IAAIpqB,CAAJ,CAAc,CACZ,IAAAkuB,EAAMluB,CAAA,UACN,KAAAmuB,EAAwBnuB,CAAA22B,GAFZ,CAKd,CAAA,CAAOrB,EAAA,CA0EyBnwB,CA1EzB,CACL,IRxHS8oB,EQwHT,CACEC,CADF,CAEEpmB,CAFF,CAGEqmB,CAHF,CAKEhE,CALF,CADK,CAyEP,CAIuBhlB,CAAvB,GAAKqyB,IAuDYpC,EAvDjB,GACE,IAAAG,EADF,CAC8B,CAAA,CAD9B,CAGIgC,EAAJ,GACE/I,CAAAJ,EAEA,CADEI,CAAAJ,EACF,EADuC,EACvC,CAAA7sB,MAAAkuB,OAAA,CAAcjB,CAAAJ,EAAd,CAAiDmJ,CAAjD,CAHF,CAKA,Ib/KS3P,Ca+KT,CAKO,CACL,GAAI4G,CAAAJ,EAAJ,CAAA,CAC+BA,CAAAA,CAAAI,CAAAJ,EChNnC,KAAK5iB,IAAIA,CAAT,GAAc8jB,EAAd,CAEY,IAAV,GAAI9jB,CAAJ,CD8M2BrG,CC7MzBojB,MAAAkP,eAAA,CAA6BjsB,CAA7B,CADF,CD8M2BrG,CC3MzBojB,MAAAmP,YAAA,CAA0BlsB,CAA1B,CAA6B8jB,CAAA,CAAW9jB,CAAX,CAA7B,CD0MA,CAKA,KAFIxL,CAEJ,CHxNSo0B,EGsNM,CAAYhK,CAAZ,CAEf,GAAoCjlB,CAApC,GAAkBqyB,IAoCHpC,EApCf,GAGIp1B,CAHJ,EAGgBA,CAAA02B,GAHhB,EAGmC,CF5JzBhC,EE4J0B,CAA+B10B,CAA/B,CAHpC,CAG8E,CAE5E,GFvIE00B,EAAA,CEuIuC10B,CFvIvC,CEuIF,EAAyCA,CFvIV,4BEuI/B,GAAyCA,CFvIuB,sBEuIhE,CACE01B,CAAA,CAAAA,IAAA,CAGA,CAFA,IAAAD,EAEA,EAFmB,IAAAA,EAAA,eAAA,CAAkCz1B,CAAA,UAAlC,CAAyDoqB,CAAzD,CAEnB,CADApqB,CAAA02B,GAAA/1B,YACA;AAD8BsqB,EAAA,CAA+B9lB,CAA/B,CAAqCqpB,CAAAtD,EAArC,CAC9B,CFtHMyJ,EEsHN,CAAuC30B,CAAvC,CbrOGqnB,EawOL,GACM9d,CADN,CACapE,CAAAoP,WADb,IAGgBhL,CAAAlD,cAAAkiB,CAAmB,OAAnBA,CACZ5nB,YAJJ,CAIwBsqB,EAAA,CAA+B9lB,CAA/B,CAAqCqpB,CAAAtD,EAArC,CAJxB,CAOAsD,EAAAtD,EAAA,CAAuBlrB,CAAA,UAhBqD,CATzE,CALP,IAEE,IADDo3B,EAAA,CAAAA,IAAA,CAAuBjyB,CAAvB,CAA6BqpB,CAA7B,CACK,CAAAA,CAAAL,EAAA,EAAmCK,CAAAL,EAAAvwB,OAAvC,CAAA,CACmC4wB,CAAAA,CAAAA,CA+CjCpE,EAAAA,CVpBQF,CUoBH,CA/CsB/kB,CA+CtB,CAAAilB,GAGLuN,EAAAA,CAAc,CAFdC,CAEc,CAFD3C,EAAA7B,MAAA,CAAiBhJ,CAAjB,CAAqBoE,CAAAD,EAArB,CAAgDC,CAAAL,EAAhD,CAEC,EAAayJ,CAAA1E,aAAb,CAAuC,IACrD2E,EAAAA,CAAmBrJ,CAAAF,EAEG,EAJAwJ,CAIA,CAJAA,CAIA,EAJAA,CAAAA,EAIA,IAlOtBrU,CACJ,CAiOiD,IAlOxC0R,EAAA,CAkOwC10B,CAlOxC,CACT,EAiOiD,IAlOZ00B,EAAA,CAkOY10B,CAlOZ,CACrC,EADiE,CACjE,EADsE,CACtE,CAAA,CAAA,CAiOiDA,CAjOjD,CAAc,GAAd,CAAkBgjB,CAiOQ,CAA1B+K,EAAAF,EAAA,CAA0B,CACqDA,EAAAA,CAAAE,CAAAF,EP+OjFyJ,EAAAA,CA8FatN,EA5FPtE,EAAAA,CAAUoC,CAAA,CAAQA,CAAA5nB,YAAR,EAA6B,EAA7B,CACZqwB,EAAA,CAAAA,CAAA,COxS6B7rB,CPwS7B,COlPkDqpB,CAAAD,EPkPlD,CAA0C1tB,CAA1C,CAEE2tB,EAAAA,CAAY8C,CAAA,CO1SensB,CP0Sf,CAChB,KAAIqC,EAAIgnB,CAAAH,EACJ7mB,EAAJ,EAAS,CNhgBA6f,CMggBT,EAA2B7f,CAA3B,GAAiC+gB,CAAjC,GACE/gB,CAAA,UAAA,EACA,CAAsB,CAAtB,EAAIA,CAAA,UAAJ,EAA2BA,CAAAtK,WAA3B,EACEsK,CAAAtK,WAAA+R,YAAA,CAAyBzH,CAAzB,CAHJ,CNhgBS6f,EMwgBT,CAEMmH,CAAAH,EAAJ,EACEG,CAAAH,EAAA1tB,YACA,CADoCwlB,CACpC,CAAAoC,CAAA,CAAQiG,CAAAH,EAFV,EAIWlI,CAJX,GAOEoC,CAPF,CH7aUQ,EGobA,CAAmB5C,CAAnB,CAA4BtlB,CAA5B,CO7TmBsE,CP6TmBoP,WAAtC,CACNia,CAAA1mB,EADM,CAPV,CAFF,CAcOygB,CAAL,CAQYA,CAAArrB,WARZ,GASM6N,EAKJ;AAL0C,EAK1C,CALaob,CAAA9hB,QAAA,CAAgB,QAAhB,CAKb,GAFEkkB,CAAA5nB,YAEF,CAFsBwlB,CAEtB,EHxZQ+C,EGwZR,CAAqBX,CAArB,CAA4B,IAA5B,CAAkCiG,CAAA1mB,EAAlC,CAdF,EAGMqe,CAHN,GAIIoC,CAJJ,CHzbUQ,EG6bE,CAAmB5C,CAAnB,CAA4BtlB,CAA5B,CAAsC,IAAtC,CACN2tB,CAAA1mB,EADM,CAJZ,CAkBEygB,EAAJ,GACEA,CAAA,UAKA,CALqBA,CAAA,UAKrB,EAL2C,CAK3C,CAHIiG,CAAAH,EAGJ,EAH6B9F,CAG7B,EAFEA,CAAA,UAAA,EAEF,CAAAiG,CAAAH,EAAA,CAAwB9F,CAN1B,CAQA,EAAA,CAAOA,CNhjBElB,Ea2QT,GACkDiH,CPiOlD,COjOkDE,CAAAF,EPiOlD,CANI0J,CAMJ,CAPI3nB,CAOJ,COzR+BlL,CPkRvB/C,aAAA,CAAqB,OAArB,CAOR,EAPyC,EAOzC,COjO2Ey1B,CPiO3E,GAJEG,CAIF,CAJM3nB,CAAA3N,QAAA,CACF,IAAIsrB,MAAJ,CAAW,iBAAX,CO9NuE6J,CP8NvE,CAAiD,MAAjD,CAAyD,GAAzD,CADE,CAC6D,GAD7D,CAIN,EADAG,CACA,GADMA,CAAA,CAAI,GAAJ,CAAU,EAChB,EADoC,UACpC,CAD0Cn3B,CAC1C,CAAIwP,CAAJ,GAAU2nB,CAAV,EH3QY/N,EG4QV,CO1R6B9kB,CP0R7B,CAAsC6yB,CAAtC,COnOF,CAGKJ,EAAL,EACE3C,EAAAjC,MAAA,CAAiB5I,CAAjB,CAAqBoE,CAAAD,EAArB,CAAgDhG,CAAhD,CAAuDiG,CAAAF,EAAvD,CA5DA,CAjB8B,CAiDlC2J,SAAA,GAAkB,CAAlBA,CAAkB,CAACr5B,CAAD,CAAO,CAGvB,MAAA,CADIuG,CACJ,CAFWvG,CAAA+L,YAAApB,EACApE,KACX,EACMmsB,CAAA,CAAcnsB,CAAd,CAAJ,CACSA,CADT,CAGS8yB,EAAA,CAAAA,CAAA,CAAwB9yB,CAAxB,CAJX,CAOO,CAAAiwB,EAVgB;AAgCzBgC,QAAA,GAAiB,CAAjBA,CAAiB,CAACjyB,CAAD,CAAOqpB,CAAP,CAAkB,CAC7B0J,CAAAA,CAAQD,EAAA,CAAAA,CAAA,CAAwB9yB,CAAxB,CACZ,KAAIgzB,EAAiB7G,CAAA,CAAc4G,CAAd,CAEjBrJ,EAAAA,CAAQttB,MAAAyN,OAAA,CADUmpB,CAAA5J,EACV,EAAiC,IAAjC,CACZ,KAAI6J,EAAmBxH,EAAA,CAA8CzrB,CAA9C,CAAoDqpB,CAAAtD,EAApD,CAEnBmN,EAAAA,CADelI,EAAAmI,CAAuCH,CAAAjN,EAAvCoN,CAAkEnzB,CAAlEmzB,CACUhJ,EAC7B/tB,OAAAkuB,OAAA,CACEZ,CADF,CAEEuJ,CAAAvH,GAFF,CAGEwH,CAHF,CAIED,CAAAtH,GAJF,CAMiC1C,EAAAA,CAAAI,CAAAJ,EAKjC,KAAK5iB,IAAIA,CAAT,GAAc+sB,EAAd,CAIE,IAHIP,CAGJ,CAHQO,CAAA,CAAU/sB,CAAV,CAGR,GAAe,CAAf,GAASwsB,CAAT,CATwBnJ,CAUtB,CAAMrjB,CAAN,CAAA,CAAWwsB,CPhLjBQ,EAAAA,CA4da/N,EAzdP4E,EAAAA,CAAQ9tB,MAAA0K,oBAAA,COoKU4iB,CPpKV,CACZ,KAASztB,CAAT,CAAW,CAAX,CAAiBA,CAAjB,CAAqBiuB,CAAAzxB,OAArB,CAAmCwD,CAAA,EAAnC,CACEsF,CACA,CADI2oB,CAAA,CAAMjuB,CAAN,CACJ,COiKoBytB,CPjKpB,CAAMnoB,CAAN,CAAA,CAAWipB,EAAA,CAAAA,CAAA,COiKSd,CPjKa,CAAMnoB,CAAN,CAAtB,COiKSmoB,CPjKT,COkKbL,EAAAD,EAAA,CAA4BM,CAhBK,CAiCnC+G,CAAA0B,cAAA,CAAAA,QAAa,CAAChI,CAAD,CAAa,CACxB,IAAAmJ,aAAA,CAAkB,IAAArD,EAAlB,CAAuC9F,CAAvC,CADwB,CAS1BsG;CAAA6C,aAAA,CAAAA,QAAY,CAACtzB,CAAD,CAAOmqB,CAAP,CAAmB,CAC7B,IAAI/lB,EAAOpE,CAAAoP,WACX,EAAIhL,CAAJ,EAA8BpE,CAA9B,GAAYqyB,IA/DKpC,EA+DjB,GACE,IAAAlC,aAAA,CAAkB/tB,CAAlB,CAAwBmqB,CAAxB,CAIF,IADIoJ,CACJ,CADqBnvB,CACrB,GAD8BA,CAAA2I,SAC9B,EAD+C3I,CAAAzI,WAC/C,EACE,IAASM,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBs3B,CAAA96B,OAApB,CAA2CwD,CAAA,EAA3C,CAEE,IAAAq3B,aAAA,CADoCC,CAAAroB,CAAejP,CAAfiP,CACpC,CAHJ,KAQE,IADI6B,CACJ,CADe/M,CAAA+M,SACf,EADgC/M,CAAArE,WAChC,CACE,IAASM,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB8Q,CAAAtU,OAApB,CAAqCwD,CAAA,EAArC,CAEE,IAAAq3B,aAAA,CADoCvmB,CAAA7B,CAASjP,CAATiP,CACpC,CAlBuB,CA0C/BulB,EAAAkB,GAAA,CAAAA,QAA+B,CAACvO,CAAD,CAAQ,CAAA,IAAA,EAAA,IAAA,CACjC2F,EV7UQ5F,EU6UF,CAAwBC,CAAxB,CVpTEF,EUqTZ,CAAsB6F,CAAtB,CAA2B,QAAA,CAACzF,CAAD,CAAU,CACnC,Gb1WOpB,Ca0WP,CACEsG,EAAA,CAAuClF,CAAvC,CADF,KAAA,CT3DJkQ,IAAAA,EA+CalO,CSeuBhC,ET5DlC,SAAA,CS4DkCA,CT5Df,eACnBkF,GAAA,CS2DkClF,CT3DlC,CS2DkCA,ET1MlC,SAAA,CS0MkCA,CT1MfiD,EAAnB,CACEC,EAAA,CA+IFiN,CA/IE,CSyMgCnQ,CTzMhC,CA+IwB,CAAAoF,EA/IxB,CA+IF7xB,IAAA,EA/IE,CA+IFsvB,IAAA,EA/IE,CSsMA,CbxUO1D,Ca6UP,GACE8N,CAAA,CAAAA,CAAA,CACA,CAAA,CAAAD,EAAA,EAAmB,CAAAA,EAAA,cAAA,CAAiChN,CAAjC,CAFrB,CANmC,CAArC,CbvUSb,EakVT,CACEW,CAAA5nB,YADF,CV1WYynB,CU2WU,CAAoB8F,CAApB,CADtB,CAGE,IAAAmH,EAAAnK,EAAA,MAAAte,KAAA,CAAsDshB,CAAtD,CAhBmC,CA2BvC0H;CAAAiD,sBAAA,CAAAA,QAAqB,CAAC/7B,CAAD,CAAU8yB,CAAV,CAAoB,CACvC,IAAIlvB,CbjWKknB,EakWT,GAGElnB,CAHF,CAGU6tB,CADQ+C,CAAA,CAAcx0B,CAAd,CACRyxB,EADkC+C,CAAA,CAAc2G,EAAA,CAAAA,IAAA,CAAwBn7B,CAAxB,CAAd,CAClCyxB,GAAA,CAA0BqB,CAA1B,CAHV,CASA,OAAO,CAHPlvB,CAGO,CAHCA,CAGD,EAHUtE,MAAA08B,iBAAA,CAAwBh8B,CAAxB,CAAAi8B,iBAAA,CAAkDnJ,CAAlD,CAGV,EAAQlvB,CAAAskB,KAAA,EAAR,CAAuB,EAXS,CAgBzC4Q,EAAAoD,GAAA,CAAAA,QAAe,CAACl8B,CAAD,CAAUm8B,CAAV,CAAuB,CACpC,IAAI1vB,EAAOzM,CAAA6N,YAAA,EACPgpB,EAAAA,CAAUsF,CAAA,CAAcA,CAAA/0B,MAAA,CAAkB,IAAlB,CAAd,CAAwC,EAClDg1B,EAAAA,CAAY3vB,CAAApE,KAAZ+zB,EAAyB3vB,CAAApE,KAAA5G,UAI7B,IAAI,CAAC26B,CAAL,CAAgB,CACd,IAAIC,EAAYr8B,CAAAsF,aAAA,CAAqB,OAArB,CAChB,IAAI+2B,CAAJ,CAAe,CACTC,CAAAA,CAAKD,CAAAj1B,MAAA,CAAgB,IAAhB,CACT,KAAK,IAAI9C,EAAE,CAAX,CAAcA,CAAd,CAAkBg4B,CAAAx7B,OAAlB,CAA6BwD,CAAA,EAA7B,CACE,GAAIg4B,CAAA,CAAGh4B,CAAH,CAAJ,GThEKqpB,CSgESK,EAAd,CAA2C,CACzCoO,CAAA,CAAYE,CAAA,CAAGh4B,CAAH,CAAK,CAAL,CACZ,MAFyC,CAHhC,CAFD,CAYZ83B,CAAJ,EACEvF,CAAA/mB,KAAA,CTxES6d,CSwEIK,EAAb,CAA0CoO,CAA1C,CbpYOtR,EasYT,GACM4G,CADN,CACkB8C,CAAA,CAAcx0B,CAAd,CADlB,GAEmB0xB,CAAAF,EAFnB,EAGIqF,CAAA/mB,KAAA,CP4KO6d,EO5KM4H,EAAb,CAA0C7D,CAAAF,EAA1C,CVzMQrE,GU4MZ,CAA6BntB,CAA7B,CAAsC62B,CAAA1f,KAAA,CAAa,GAAb,CAAtC,CA5BoC,CA8BtC2hB,EAAAyD,GAAA,CAAAA,QAAiB,CAACz6B,CAAD,CAAO,CACtB,MAAO0yB,EAAA,CAAc1yB,CAAd,CADe,CAM1Bs2B,EAAArsB,UAAA,MAAA,CAAiCqsB,CAAArsB,UAAAsE,GACjC+nB;CAAArsB,UAAA,gBAAA,CAA2CqsB,CAAArsB,UAAAmtB,gBAC3Cd,EAAArsB,UAAA,aAAA,CAAwCqsB,CAAArsB,UAAAqqB,aACxCgC,EAAArsB,UAAA,cAAA,CAAyCqsB,CAAArsB,UAAAyuB,cACzCpC,EAAArsB,UAAA,aAAA,CAAwCqsB,CAAArsB,UAAA4vB,aACxCvD,EAAArsB,UAAA,sBAAA,CAAiDqsB,CAAArsB,UAAAgwB,sBACjD3D,EAAArsB,UAAA,gBAAA,CAA2CqsB,CAAArsB,UAAAmwB,GAC3C9D,EAAArsB,UAAA,kBAAA,CAA6CqsB,CAAArsB,UAAAwwB,GAC7CnE,EAAArsB,UAAA,gCAAA,CAA2DqsB,CAAArsB,UAAAiuB,GAC3D5B,EAAArsB,UAAA,YAAA,CAAuCqsB,CAAArsB,UAAAitB,GACvCZ,EAAArsB,UAAA,iBAAA,CAA4CqsB,CAAArsB,UAAAktB,GAC5Cb;CAAArsB,UAAA,kBAAA,CAA6CqsB,CAAArsB,UAAAkuB,EAC7Cx1B,OAAA+T,iBAAA,CAAwB4f,CAAArsB,UAAxB,CAA+C,CAC7C,aAAgB,CACd,IAAApH,QAAG,EAAG,CACJ,MbrcO4lB,EaocH,CADQ,CAD6B,CAM7C,UAAa,CACX,IAAA5lB,QAAG,EAAG,CACJ,MbxaOmmB,EauaH,CADK,CANgC,CAA/C,C,CE9bA,IAAM7O,EAAc,IFgBLmc,CEhBf,CAEI+B,EAFJ,CAEeJ,EAEXz6B,OAAA,SAAJ,GACE66B,EACA,CADY76B,MAAA,SAAA,UACZ,CAAAy6B,EAAA,CAAuBz6B,MAAA,SAAA,qBAFzB,CAKAA,OAAAsrB,SAAA,CAAkB,CAChBwN,YAAanc,CADG,CAOhB,gBAAAid,QAAe,CAACh2B,CAAD,CAAWy0B,CAAX,CAAwB6E,CAAxB,CAAwC,CACrDvgB,CAAAge,EAAA,EACAhe,EAAAid,gBAAA,CAA4Bh2B,CAA5B,CAAsCy0B,CAAtC,CAAmD6E,CAAnD,CAFqD,CAPvC,CAgBhB,aAAAb,QAAY,CAAC37B,CAAD,CAAUwyB,CAAV,CAAsB,CAChCvW,CAAAge,EAAA,EACAhe,EAAA0f,aAAA,CAAyB37B,CAAzB,CAAkCwyB,CAAlC,CAFgC,CAhBlB,CAwBhB,aAAA4D,QAAY,CAACp2B,CAAD,CAAU,CACpBic,CAAAge,EAAA,EACAhe,EAAAma,aAAA,CAAyBp2B,CAAzB,CAFoB,CAxBN,CAgChB,cAAAw6B,QAAa,CAAChI,CAAD,CAAa,CACxBvW,CAAAge,EAAA,EACAhe,EAAAue,cAAA,CAA0BhI,CAA1B,CAFwB,CAhCV,CA0ChB,sBAAAuJ,QAAqB,CAAC/7B,CAAD,CAAU8yB,CAAV,CAAoB,CACvC,MAAO7W,EAAA8f,sBAAA,CAAkC/7B,CAAlC,CAA2C8yB,CAA3C,CADgC,CA1CzB,CA8ChBjI,UfzBWC,CerBK,CAgDhBP,af7DWA,CeaK,CAmDd4P,GAAJ,GACE76B,MAAAsrB,SAAAuP,UADF,CAC8BA,EAD9B,CAIIJ;EAAJ,GACEz6B,MAAAsrB,SAAAmP,qBADF,CACyCA,EADzC,C;;;;;;;;;ACpEA,IAAI0C,GAAiBn9B,MAAA,eAArB,CACIgN,GAAchN,MAAA,YADlB,CAEIo9B,GAAWp9B,MAAA,oBAIfA,OAAAq9B,cAAA,CAAuBr9B,MAAAq9B,cAAvB,EAA+C,EAE/C,IAAIF,EAAJ,EAAsBA,EAAA,0BAAtB,CAAmE,CAGjE,IAAIG,EAAJ,CACIC,GAAsBA,QAA4B,EAAG,CACvD,GAAID,EAAJ,CAAmB,CAEbF,EAAAI,GAAJ,EACEJ,EAAAI,GAAA,CAAmBx9B,MAAAG,SAAnB,CAEF,KAAIqR,EAAK8rB,EACTA,GAAA,CAAgB,IAChB9rB,EAAA,EACA,OAAO,CAAA,CARU,CADoC,CADzD,CAaIisB,GAAgBzwB,EAAA,UACpBmwB,GAAA,0BAAA,CAA4C,QAAQ,CAAC3rB,CAAD,CAAK,CACvD8rB,EAAA,CAAgB9rB,CAChBisB,GAAA,CAAcF,EAAd,CAFuD,CAAzD,CAKAvwB,GAAA,UAAA,CAA2B,QAAQ,CAACwE,CAAD,CAAK,CACtCisB,EAAA,CAAc,QAAQ,EAAG,CAInBF,EAAA,EAAJ,CACEvwB,EAAA,UAAA,CAAyBwE,CAAzB,CADF,CAGEA,CAAA,EAPqB,CAAzB,CADsC,CAtByB;AAqCnExE,EAAA,UAAA,CAAyB,QAAQ,EAAG,CAClC6qB,qBAAA,CAAsB,QAAQ,EAAG,CAC/B73B,MAAAq9B,cAAAK,MAAA,CAA6B,CAAA,CAC7Bv9B,SAAA4L,cAAA,CAAuB,IAAI9L,WAAJ,CAAgB,oBAAhB,CAAsC,CAACK,QAAS,CAAA,CAAV,CAAtC,CAAvB,CAF+B,CAAjC,CADkC,CAApC,C,CCrCA,IAAI6rB,GAAQhsB,QAAA8D,cAAA,CAAuB,OAAvB,CACZkoB,GAAA5nB,YAAA,CAAoB,sIAQpB,KAAIjB,GAAOnD,QAAA8J,cAAA,CAAuB,MAAvB,CACX3G,GAAAqI,aAAA,CAAkBwgB,EAAlB,CAAyB7oB,EAAAjB,WAAzB,C","file":"webcomponents-hi-sd.js","sourcesContent":["/**\n * @license\n * Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(scope => {\n\n /********************* base setup *********************/\n const link = document.createElement('link');\n const useNative = Boolean('import' in link);\n const emptyNodeList = link.querySelectorAll('*');\n\n // Polyfill `currentScript` for browsers without it.\n let currentScript = null;\n if ('currentScript' in document === false) {\n Object.defineProperty(document, 'currentScript', {\n get() {\n return currentScript ||\n // NOTE: only works when called in synchronously executing code.\n // readyState should check if `loading` but IE10 is\n // interactive when scripts run so we cheat. This is not needed by\n // html-imports polyfill but helps generally polyfill `currentScript`.\n (document.readyState !== 'complete' ?\n document.scripts[document.scripts.length - 1] : null);\n },\n configurable: true\n });\n }\n\n /**\n * @param {Array|NodeList|NamedNodeMap} list\n * @param {!Function} callback\n * @param {boolean=} inverseOrder\n */\n const forEach = (list, callback, inverseOrder) => {\n const length = list ? list.length : 0;\n const increment = inverseOrder ? -1 : 1;\n let i = inverseOrder ? length - 1 : 0;\n for (; i < length && i >= 0; i = i + increment) {\n callback(list[i], i);\n }\n };\n\n /**\n * @param {!Node} node\n * @param {!string} selector\n * @return {!NodeList<!Element>}\n */\n const QSA = (node, selector) => {\n // IE 11 throws a SyntaxError if a node with no children is queried with\n // a selector containing the `:not([type])` syntax.\n if (!node.childNodes.length) {\n return emptyNodeList;\n }\n return node.querySelectorAll(selector);\n };\n\n /**\n * @param {!DocumentFragment} fragment\n */\n const replaceScripts = (fragment) => {\n forEach(QSA(fragment, 'template'), template => {\n forEach(QSA(template.content, scriptsSelector), script => {\n const clone = /** @type {!HTMLScriptElement} */\n (document.createElement('script'));\n forEach(script.attributes, attr => clone.setAttribute(attr.name, attr.value));\n clone.textContent = script.textContent;\n script.parentNode.replaceChild(clone, script);\n });\n replaceScripts(template.content);\n });\n };\n\n /********************* path fixup *********************/\n const CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\n const CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n const STYLESHEET_REGEXP = /(<link[^>]*)(rel=['|\"]?stylesheet['|\"]?[^>]*>)/g;\n\n // path fixup: style elements in imports must be made relative to the main\n // document. We fixup url's in url() and @import.\n const Path = {\n\n fixUrls(element, base) {\n if (element.href) {\n element.setAttribute('href',\n Path.resolveUrl(element.getAttribute('href'), base));\n }\n if (element.src) {\n element.setAttribute('src',\n Path.resolveUrl(element.getAttribute('src'), base));\n }\n if (element.localName === 'style') {\n const r = Path.replaceUrls(element.textContent, base, CSS_URL_REGEXP);\n element.textContent = Path.replaceUrls(r, base, CSS_IMPORT_REGEXP);\n }\n },\n\n replaceUrls(text, linkUrl, regexp) {\n return text.replace(regexp, (m, pre, url, post) => {\n let urlPath = url.replace(/[\"']/g, '');\n if (linkUrl) {\n urlPath = Path.resolveUrl(urlPath, linkUrl);\n }\n return pre + '\\'' + urlPath + '\\'' + post;\n });\n },\n\n resolveUrl(url, base) {\n // Lazy feature detection.\n if (Path.__workingURL === undefined) {\n Path.__workingURL = false;\n try {\n const u = new URL('b', 'http://a');\n u.pathname = 'c%20d';\n Path.__workingURL = (u.href === 'http://a/c%20d');\n } catch (e) {}\n }\n\n if (Path.__workingURL) {\n return (new URL(url, base)).href;\n }\n\n // Fallback to creating an anchor into a disconnected document.\n let doc = Path.__tempDoc;\n if (!doc) {\n doc = document.implementation.createHTMLDocument('temp');\n Path.__tempDoc = doc;\n doc.__base = doc.createElement('base');\n doc.head.appendChild(doc.__base);\n doc.__anchor = doc.createElement('a');\n }\n doc.__base.href = base;\n doc.__anchor.href = url;\n return doc.__anchor.href || url;\n }\n };\n\n /********************* Xhr processor *********************/\n const Xhr = {\n\n async: true,\n\n /**\n * @param {!string} url\n * @param {!function(!string, string=)} success\n * @param {!function(!string)} fail\n */\n load(url, success, fail) {\n if (!url) {\n fail('error: href must be specified');\n } else if (url.match(/^data:/)) {\n // Handle Data URI Scheme\n const pieces = url.split(',');\n const header = pieces[0];\n let resource = pieces[1];\n if (header.indexOf(';base64') > -1) {\n resource = atob(resource);\n } else {\n resource = decodeURIComponent(resource);\n }\n success(resource);\n } else {\n const request = new XMLHttpRequest();\n request.open('GET', url, Xhr.async);\n request.onload = () => {\n // Servers redirecting an import can add a Location header to help us\n // polyfill correctly. Handle relative and full paths.\n // Prefer responseURL which already resolves redirects\n // https://xhr.spec.whatwg.org/#the-responseurl-attribute\n let redirectedUrl = request.responseURL || request.getResponseHeader('Location');\n if (redirectedUrl && redirectedUrl.indexOf('/') === 0) {\n // In IE location.origin might not work\n // https://connect.microsoft.com/IE/feedback/details/1763802/location-origin-is-undefined-in-ie-11-on-windows-10-but-works-on-windows-7\n const origin = (location.origin || location.protocol + '//' + location.host);\n redirectedUrl = origin + redirectedUrl;\n }\n const resource = /** @type {string} */ (request.response || request.responseText);\n if (request.status === 304 || request.status === 0 ||\n request.status >= 200 && request.status < 300) {\n success(resource, redirectedUrl);\n } else {\n fail(resource);\n }\n };\n request.send();\n }\n }\n };\n\n /********************* importer *********************/\n\n const isIE = /Trident/.test(navigator.userAgent) ||\n /Edge\\/\\d./i.test(navigator.userAgent);\n\n const importSelector = 'link[rel=import]';\n\n // Used to disable loading of resources.\n const importDisableType = 'import-disable';\n\n const disabledLinkSelector = `link[rel=stylesheet][href][type=${importDisableType}]`;\n\n const scriptsSelector = `script:not([type]),script[type=\"application/javascript\"],` +\n `script[type=\"text/javascript\"]`;\n\n const importDependenciesSelector = `${importSelector},${disabledLinkSelector},` +\n `style:not([type]),link[rel=stylesheet][href]:not([type]),` + scriptsSelector;\n\n const importDependencyAttr = 'import-dependency';\n\n const rootImportSelector = `${importSelector}:not([${importDependencyAttr}])`;\n\n const pendingScriptsSelector = `script[${importDependencyAttr}]`;\n\n const pendingStylesSelector = `style[${importDependencyAttr}],` +\n `link[rel=stylesheet][${importDependencyAttr}]`;\n\n /**\n * Importer will:\n * - load any linked import documents (with deduping)\n * - whenever an import is loaded, prompt the parser to try to parse\n * - observe imported documents for new elements (these are handled via the\n * dynamic importer)\n */\n class Importer {\n constructor() {\n this.documents = {};\n // Used to keep track of pending loads, so that flattening and firing of\n // events can be done when all resources are ready.\n this.inflight = 0;\n this.dynamicImportsMO = new MutationObserver(m => this.handleMutations(m));\n // Observe changes on <head>.\n this.dynamicImportsMO.observe(document.head, {\n childList: true,\n subtree: true\n });\n // 1. Load imports contents\n // 2. Assign them to first import links on the document\n // 3. Wait for import styles & scripts to be done loading/running\n // 4. Fire load/error events\n this.loadImports(document);\n }\n\n /**\n * @param {!(HTMLDocument|DocumentFragment|Element)} doc\n */\n loadImports(doc) {\n const links = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(doc, importSelector));\n forEach(links, link => this.loadImport(link));\n }\n\n /**\n * @param {!HTMLLinkElement} link\n */\n loadImport(link) {\n const url = link.href;\n // This resource is already being handled by another import.\n if (this.documents[url] !== undefined) {\n // If import is already loaded, we can safely associate it to the link\n // and fire the load/error event.\n const imp = this.documents[url];\n if (imp && imp['__loaded']) {\n link['__import'] = imp;\n this.fireEventIfNeeded(link);\n }\n return;\n }\n this.inflight++;\n // Mark it as pending to notify others this url is being loaded.\n this.documents[url] = 'pending';\n Xhr.load(url, (resource, redirectedUrl) => {\n const doc = this.makeDocument(resource, redirectedUrl || url);\n this.documents[url] = doc;\n this.inflight--;\n // Load subtree.\n this.loadImports(doc);\n this.processImportsIfLoadingDone();\n }, () => {\n // If load fails, handle error.\n this.documents[url] = null;\n this.inflight--;\n this.processImportsIfLoadingDone();\n });\n }\n\n /**\n * Creates a new document containing resource and normalizes urls accordingly.\n * @param {string=} resource\n * @param {string=} url\n * @return {!DocumentFragment}\n */\n makeDocument(resource, url) {\n if (!resource) {\n return document.createDocumentFragment();\n }\n\n if (isIE) {\n // <link rel=stylesheet> should be appended to <head>. Not doing so\n // in IE/Edge breaks the cascading order. We disable the loading by\n // setting the type before setting innerHTML to avoid loading\n // resources twice.\n resource = resource.replace(STYLESHEET_REGEXP, (match, p1, p2) => {\n if (match.indexOf('type=') === -1) {\n return `${p1} type=${importDisableType} ${p2}`;\n }\n return match;\n });\n }\n\n let content;\n const template = /** @type {!HTMLTemplateElement} */\n (document.createElement('template'));\n template.innerHTML = resource;\n if (template.content) {\n content = template.content;\n // Clone scripts inside templates since they won't execute when the\n // hosting template is cloned.\n replaceScripts(content);\n } else {\n // <template> not supported, create fragment and move content into it.\n content = document.createDocumentFragment();\n while (template.firstChild) {\n content.appendChild(template.firstChild);\n }\n }\n\n // Support <base> in imported docs. Resolve url and remove its href.\n const baseEl = content.querySelector('base');\n if (baseEl) {\n url = Path.resolveUrl(baseEl.getAttribute('href'), url);\n baseEl.removeAttribute('href');\n }\n\n const n$ = /** @type {!NodeList<!(HTMLLinkElement|HTMLScriptElement|HTMLStyleElement)>} */\n (QSA(content, importDependenciesSelector));\n // For source map hints.\n let inlineScriptIndex = 0;\n forEach(n$, n => {\n // Listen for load/error events, then fix urls.\n whenElementLoaded(n);\n Path.fixUrls(n, url);\n // Mark for easier selectors.\n n.setAttribute(importDependencyAttr, '');\n // Generate source map hints for inline scripts.\n if (n.localName === 'script' && !n.src && n.textContent) {\n const num = inlineScriptIndex ? `-${inlineScriptIndex}` : '';\n const content = n.textContent + `\\n//# sourceURL=${url}${num}.js\\n`;\n // We use the src attribute so it triggers load/error events, and it's\n // easier to capture errors (e.g. parsing) like this.\n n.setAttribute('src', 'data:text/javascript;charset=utf-8,' + encodeURIComponent(content));\n n.textContent = '';\n inlineScriptIndex++;\n }\n });\n return content;\n }\n\n /**\n * Waits for loaded imports to finish loading scripts and styles, then fires\n * the load/error events.\n */\n processImportsIfLoadingDone() {\n // Wait until all resources are ready, then load import resources.\n if (this.inflight) return;\n\n // Stop observing, flatten & load resource, then restart observing <head>.\n this.dynamicImportsMO.disconnect();\n this.flatten(document);\n // We wait for styles to load, and at the same time we execute the scripts,\n // then fire the load/error events for imports to have faster whenReady\n // callback execution.\n // NOTE: This is different for native behavior where scripts would be\n // executed after the styles before them are loaded.\n // To achieve that, we could select pending styles and scripts in the\n // document and execute them sequentially in their dom order.\n let scriptsOk = false,\n stylesOk = false;\n const onLoadingDone = () => {\n if (stylesOk && scriptsOk) {\n // Catch any imports that might have been added while we\n // weren't looking, wait for them as well.\n this.loadImports(document);\n if (this.inflight) return;\n\n // Restart observing.\n this.dynamicImportsMO.observe(document.head, {\n childList: true,\n subtree: true\n });\n this.fireEvents();\n }\n }\n this.waitForStyles(() => {\n stylesOk = true;\n onLoadingDone();\n });\n this.runScripts(() => {\n scriptsOk = true;\n onLoadingDone();\n });\n }\n\n /**\n * @param {!HTMLDocument} doc\n */\n flatten(doc) {\n const n$ = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(doc, importSelector));\n forEach(n$, n => {\n const imp = this.documents[n.href];\n n['__import'] = /** @type {!Document} */ (imp);\n if (imp && imp.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n // We set the .import to be the link itself, and update its readyState.\n // Other links with the same href will point to this link.\n this.documents[n.href] = n;\n n.readyState = 'loading';\n n['__import'] = n;\n this.flatten(imp);\n n.appendChild(imp);\n }\n });\n }\n\n /**\n * Replaces all the imported scripts with a clone in order to execute them.\n * Updates the `currentScript`.\n * @param {!function()} callback\n */\n runScripts(callback) {\n const s$ = QSA(document, pendingScriptsSelector);\n const l = s$.length;\n const cloneScript = i => {\n if (i < l) {\n // The pending scripts have been generated through innerHTML and\n // browsers won't execute them for security reasons. We cannot use\n // s.cloneNode(true) either, the only way to run the script is manually\n // creating a new element and copying its attributes.\n const s = s$[i];\n const clone = /** @type {!HTMLScriptElement} */\n (document.createElement('script'));\n // Remove import-dependency attribute to avoid double cloning.\n s.removeAttribute(importDependencyAttr);\n forEach(s.attributes, attr => clone.setAttribute(attr.name, attr.value));\n // Update currentScript and replace original with clone script.\n currentScript = clone;\n s.parentNode.replaceChild(clone, s);\n whenElementLoaded(clone, () => {\n currentScript = null;\n cloneScript(i + 1);\n });\n } else {\n callback();\n }\n };\n cloneScript(0);\n }\n\n /**\n * Waits for all the imported stylesheets/styles to be loaded.\n * @param {!function()} callback\n */\n waitForStyles(callback) {\n const s$ = /** @type {!NodeList<!(HTMLLinkElement|HTMLStyleElement)>} */\n (QSA(document, pendingStylesSelector));\n let pending = s$.length;\n if (!pending) {\n callback();\n return;\n }\n // <link rel=stylesheet> should be appended to <head>. Not doing so\n // in IE/Edge breaks the cascading order\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/10472273/\n // If there is one <link rel=stylesheet> imported, we must move all imported\n // links and styles to <head>.\n const needsMove = isIE && !!document.querySelector(disabledLinkSelector);\n forEach(s$, s => {\n // Listen for load/error events, remove selector once is done loading.\n whenElementLoaded(s, () => {\n s.removeAttribute(importDependencyAttr);\n if (--pending === 0) {\n callback();\n }\n });\n // Check if was already moved to head, to handle the case where the element\n // has already been moved but it is still loading.\n if (needsMove && s.parentNode !== document.head) {\n // Replace the element we're about to move with a placeholder.\n const placeholder = document.createElement(s.localName);\n // Add reference of the moved element.\n placeholder['__appliedElement'] = s;\n // Disable this from appearing in document.styleSheets.\n placeholder.setAttribute('type', 'import-placeholder');\n // Append placeholder next to the sibling, and move original to <head>.\n s.parentNode.insertBefore(placeholder, s.nextSibling);\n let newSibling = importForElement(s);\n while (newSibling && importForElement(newSibling)) {\n newSibling = importForElement(newSibling);\n }\n if (newSibling.parentNode !== document.head) {\n newSibling = null;\n }\n document.head.insertBefore(s, newSibling);\n // Enable the loading of <link rel=stylesheet>.\n s.removeAttribute('type');\n }\n });\n }\n\n /**\n * Fires load/error events for imports in the right order .\n */\n fireEvents() {\n const n$ = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(document, importSelector));\n // Inverse order to have events firing bottom-up.\n forEach(n$, n => this.fireEventIfNeeded(n), true);\n }\n\n /**\n * Fires load/error event for the import if this wasn't done already.\n * @param {!HTMLLinkElement} link\n */\n fireEventIfNeeded(link) {\n // Don't fire twice same event.\n if (!link['__loaded']) {\n link['__loaded'] = true;\n // Update link's import readyState.\n link.import && (link.import.readyState = 'complete');\n const eventType = link.import ? 'load' : 'error';\n link.dispatchEvent(newCustomEvent(eventType, {\n bubbles: false,\n cancelable: false,\n detail: undefined\n }));\n }\n }\n\n /**\n * @param {Array<MutationRecord>} mutations\n */\n handleMutations(mutations) {\n forEach(mutations, m => forEach(m.addedNodes, elem => {\n if (elem && elem.nodeType === Node.ELEMENT_NODE) {\n // NOTE: added scripts are not updating currentScript in IE.\n if (isImportLink(elem)) {\n this.loadImport( /** @type {!HTMLLinkElement} */ (elem));\n } else {\n this.loadImports( /** @type {!Element} */ (elem));\n }\n }\n }));\n }\n }\n\n /**\n * @param {!Node} node\n * @return {boolean}\n */\n const isImportLink = node => {\n return node.nodeType === Node.ELEMENT_NODE && node.localName === 'link' &&\n ( /** @type {!HTMLLinkElement} */ (node).rel === 'import');\n };\n\n /**\n * Waits for an element to finish loading. If already done loading, it will\n * mark the element accordingly.\n * @param {!(HTMLLinkElement|HTMLScriptElement|HTMLStyleElement)} element\n * @param {function()=} callback\n */\n const whenElementLoaded = (element, callback) => {\n if (element['__loaded']) {\n callback && callback();\n } else if ((element.localName === 'script' && !element.src) ||\n (element.localName === 'style' && !element.firstChild)) {\n // Inline scripts and empty styles don't trigger load/error events,\n // consider them already loaded.\n element['__loaded'] = true;\n callback && callback();\n } else {\n const onLoadingDone = event => {\n element.removeEventListener(event.type, onLoadingDone);\n element['__loaded'] = true;\n callback && callback();\n };\n element.addEventListener('load', onLoadingDone);\n // NOTE: We listen only for load events in IE/Edge, because in IE/Edge\n // <style> with @import will fire error events for each failing @import,\n // and finally will trigger the load event when all @import are\n // finished (even if all fail).\n if (!isIE || element.localName !== 'style') {\n element.addEventListener('error', onLoadingDone);\n }\n }\n }\n\n /**\n * Calls the callback when all imports in the document at call time\n * (or at least document ready) have loaded. Callback is called synchronously\n * if imports are already done loading.\n * @param {function()=} callback\n */\n const whenReady = callback => {\n // 1. ensure the document is in a ready state (has dom), then\n // 2. watch for loading of imports and call callback when done\n whenDocumentReady(() => whenImportsReady(() => callback && callback()));\n }\n\n /**\n * Invokes the callback when document is in ready state. Callback is called\n * synchronously if document is already done loading.\n * @param {!function()} callback\n */\n const whenDocumentReady = callback => {\n const stateChanged = () => {\n // NOTE: Firefox can hit readystate interactive without document.body existing.\n // This is anti-spec, but we handle it here anyways by waiting for next change.\n if (document.readyState !== 'loading' && !!document.body) {\n document.removeEventListener('readystatechange', stateChanged);\n callback();\n }\n }\n document.addEventListener('readystatechange', stateChanged);\n stateChanged();\n }\n\n /**\n * Invokes the callback after all imports are loaded. Callback is called\n * synchronously if imports are already done loading.\n * @param {!function()} callback\n */\n const whenImportsReady = callback => {\n let imports = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(document, rootImportSelector));\n let pending = imports.length;\n if (!pending) {\n callback();\n return;\n }\n forEach(imports, imp => whenElementLoaded(imp, () => {\n if (--pending === 0) {\n callback();\n }\n }));\n }\n\n /**\n * Returns the import document containing the element.\n * @param {!Node} element\n * @return {HTMLLinkElement|Document|undefined}\n */\n const importForElement = element => {\n if (useNative) {\n // Return only if not in the main doc!\n return element.ownerDocument !== document ? element.ownerDocument : null;\n }\n let doc = element['__importDoc'];\n if (!doc && element.parentNode) {\n doc = /** @type {!Element} */ (element.parentNode);\n if (typeof doc.closest === 'function') {\n // Element.closest returns the element itself if it matches the selector,\n // so we search the closest import starting from the parent.\n doc = doc.closest(importSelector);\n } else {\n // Walk up the parent tree until we find an import.\n while (!isImportLink(doc) && (doc = doc.parentNode)) {}\n }\n element['__importDoc'] = doc;\n }\n return doc;\n }\n\n let importer = null;\n /**\n * Ensures imports contained in the element are imported.\n * Use this to handle dynamic imports attached to body.\n * @param {!(HTMLDocument|Element)} doc\n */\n const loadImports = (doc) => {\n if (importer) {\n importer.loadImports(doc);\n }\n };\n\n const newCustomEvent = (type, params) => {\n if (typeof window.CustomEvent === 'function') {\n return new CustomEvent(type, params);\n }\n const event = /** @type {!CustomEvent} */ (document.createEvent('CustomEvent'));\n event.initCustomEvent(type, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);\n return event;\n };\n\n if (useNative) {\n // Check for imports that might already be done loading by the time this\n // script is actually executed. Native imports are blocking, so the ones\n // available in the document by this time should already have failed\n // or have .import defined.\n const imps = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(document, importSelector));\n forEach(imps, imp => {\n if (!imp.import || imp.import.readyState !== 'loading') {\n imp['__loaded'] = true;\n }\n });\n // Listen for load/error events to capture dynamically added scripts.\n /**\n * @type {!function(!Event)}\n */\n const onLoadingDone = event => {\n const elem = /** @type {!Element} */ (event.target);\n if (isImportLink(elem)) {\n elem['__loaded'] = true;\n }\n };\n document.addEventListener('load', onLoadingDone, true /* useCapture */ );\n document.addEventListener('error', onLoadingDone, true /* useCapture */ );\n } else {\n // Override baseURI so that imported elements' baseURI can be used seemlessly\n // on native or polyfilled html-imports.\n // NOTE: a <link rel=import> will have `link.baseURI === link.href`, as the link\n // itself is used as the `import` document.\n /** @type {Object|undefined} */\n const native_baseURI = Object.getOwnPropertyDescriptor(Node.prototype, 'baseURI');\n // NOTE: if not configurable (e.g. safari9), set it on the Element prototype. \n const klass = !native_baseURI || native_baseURI.configurable ? Node : Element;\n Object.defineProperty(klass.prototype, 'baseURI', {\n get() {\n const ownerDoc = /** @type {HTMLLinkElement} */ (isImportLink(this) ? this : importForElement(this));\n if (ownerDoc) return ownerDoc.href;\n // Use native baseURI if possible.\n if (native_baseURI && native_baseURI.get) return native_baseURI.get.call(this);\n // Polyfill it if not available.\n const base = /** @type {HTMLBaseElement} */ (document.querySelector('base'));\n return (base || window.location).href;\n },\n configurable: true,\n enumerable: true\n });\n\n // Define 'import' read-only property.\n Object.defineProperty(HTMLLinkElement.prototype, 'import', {\n get() {\n return /** @type {HTMLLinkElement} */ (this)['__import'] || null;\n },\n configurable: true,\n enumerable: true\n });\n\n whenDocumentReady(() => {\n importer = new Importer()\n });\n }\n\n /**\n Add support for the `HTMLImportsLoaded` event and the `HTMLImports.whenReady`\n method. This api is necessary because unlike the native implementation,\n script elements do not force imports to resolve. Instead, users should wrap\n code in either an `HTMLImportsLoaded` handler or after load time in an\n `HTMLImports.whenReady(callback)` call.\n\n NOTE: This module also supports these apis under the native implementation.\n Therefore, if this file is loaded, the same code can be used under both\n the polyfill and native implementation.\n */\n whenReady(() => document.dispatchEvent(newCustomEvent('HTMLImportsLoaded', {\n cancelable: true,\n bubbles: true,\n detail: undefined\n })));\n\n // exports\n scope.useNative = useNative;\n scope.whenReady = whenReady;\n scope.importForElement = importForElement;\n scope.loadImports = loadImports;\n\n})(window.HTMLImports = (window.HTMLImports || {}));",null,null,null,null,null,"/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n\nexport class ShadyData {\n constructor() {\n /** @type {ShadowRoot} */\n this.root = null;\n /** @type {ShadowRoot} */\n this.publicRoot = null;\n this.dirty = false;\n this.observer = null;\n /** @type {Array<Node>} */\n this.assignedNodes = null;\n /** @type {Element} */\n this.assignedSlot = null;\n /** @type {Array<Node>} */\n this._previouslyAssignedNodes = null;\n /** @type {Element} */\n this._prevAssignedSlot = null;\n /** @type {Array<Node>} */\n this.flattenedNodes = null;\n this.ownerShadyRoot = undefined;\n /** @type {Node|undefined} */\n this.parentNode = undefined;\n /** @type {Node|undefined} */\n this.firstChild = undefined;\n /** @type {Node|undefined} */\n this.lastChild = undefined;\n /** @type {Node|undefined} */\n this.previousSibling = undefined;\n /** @type {Node|undefined} */\n this.nextSibling = undefined;\n /** @type {Array<Node>|undefined} */\n this.childNodes = undefined;\n this.__outsideAccessors = false;\n this.__insideAccessors = false;\n }\n\n toJSON() {\n return {};\n }\n}\n\nexport function ensureShadyDataForNode(node) {\n if (!node.__shady) {\n node.__shady = new ShadyData();\n }\n return node.__shady;\n}\n\nexport function shadyDataForNode(node) {\n return node && node.__shady;\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport {shadyDataForNode} from './shady-data.js';\n\nexport let settings = window['ShadyDOM'] || {};\n\nsettings.hasNativeShadowDOM = Boolean(Element.prototype.attachShadow && Node.prototype.getRootNode);\n\nlet desc = Object.getOwnPropertyDescriptor(Node.prototype, 'firstChild');\n\nsettings.hasDescriptors = Boolean(desc && desc.configurable && desc.get);\nsettings.inUse = settings['force'] || !settings.hasNativeShadowDOM;\n\n// Default to using native accessors (instead of treewalker) only for\n// IE/Edge where they are faster.\nconst IS_IE = navigator.userAgent.match('Trident');\nconst IS_EDGE = navigator.userAgent.match('Edge');\nif (settings.useNativeAccessors === undefined) {\n settings.useNativeAccessors = settings.hasDescriptors && (IS_IE || IS_EDGE);\n}\n\nexport function isTrackingLogicalChildNodes(node) {\n const nodeData = shadyDataForNode(node);\n return (nodeData && nodeData.firstChild !== undefined);\n}\n\nexport function isShadyRoot(obj) {\n return Boolean(obj._localName === 'ShadyRoot');\n}\n\nexport function ownerShadyRootForNode(node) {\n let root = node.getRootNode();\n if (isShadyRoot(root)) {\n return root;\n }\n}\n\nlet p = Element.prototype;\nlet matches = p.matches || p.matchesSelector ||\n p.mozMatchesSelector || p.msMatchesSelector ||\n p.oMatchesSelector || p.webkitMatchesSelector;\n\nexport function matchesSelector(element, selector) {\n return matches.call(element, selector);\n}\n\nfunction copyOwnProperty(name, source, target) {\n let pd = Object.getOwnPropertyDescriptor(source, name);\n if (pd) {\n Object.defineProperty(target, name, pd);\n }\n}\n\nexport function extend(target, source) {\n if (target && source) {\n let n$ = Object.getOwnPropertyNames(source);\n for (let i=0, n; (i<n$.length) && (n=n$[i]); i++) {\n copyOwnProperty(n, source, target);\n }\n }\n return target || source;\n}\n\nexport function extendAll(target, ...sources) {\n for (let i=0; i < sources.length; i++) {\n extend(target, sources[i]);\n }\n return target;\n}\n\nexport function mixin(target, source) {\n for (var i in source) {\n target[i] = source[i];\n }\n return target;\n}\n\nexport function patchPrototype(obj, mixin) {\n let proto = Object.getPrototypeOf(obj);\n if (!proto.hasOwnProperty('__patchProto')) {\n let patchProto = Object.create(proto);\n patchProto.__sourceProto = proto;\n extend(patchProto, mixin);\n proto['__patchProto'] = patchProto;\n }\n // old browsers don't have setPrototypeOf\n obj.__proto__ = proto['__patchProto'];\n}\n\n\nlet twiddle = document.createTextNode('');\nlet content = 0;\nlet queue = [];\nnew MutationObserver(() => {\n while (queue.length) {\n // catch errors in user code...\n try {\n queue.shift()();\n } catch(e) {\n // enqueue another record and throw\n twiddle.textContent = content++;\n throw(e);\n }\n }\n}).observe(twiddle, {characterData: true});\n\n// use MutationObserver to get microtask async timing.\nexport function microtask(callback) {\n queue.push(callback);\n twiddle.textContent = content++;\n}\n\nexport const hasDocumentContains = Boolean(document.contains);\n\nexport function contains(container, node) {\n while (node) {\n if (node == container) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\n\n// render enqueuer/flusher\nlet flushList = [];\nlet scheduled;\nexport function enqueue(callback) {\n if (!scheduled) {\n scheduled = true;\n utils.microtask(flush);\n }\n flushList.push(callback);\n}\n\nexport function flush() {\n scheduled = false;\n let didFlush = Boolean(flushList.length);\n while (flushList.length) {\n flushList.shift()();\n }\n return didFlush;\n}\n\nflush['list'] = flushList;\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\nimport {ensureShadyDataForNode} from './shady-data.js';\n\nclass AsyncObserver {\n\n constructor() {\n this._scheduled = false;\n this.addedNodes = [];\n this.removedNodes = [];\n this.callbacks = new Set();\n }\n\n schedule() {\n if (!this._scheduled) {\n this._scheduled = true;\n utils.microtask(() => {\n this.flush();\n });\n }\n }\n\n flush() {\n if (this._scheduled) {\n this._scheduled = false;\n let mutations = this.takeRecords();\n if (mutations.length) {\n this.callbacks.forEach(function(cb) {\n cb(mutations);\n });\n }\n }\n }\n\n takeRecords() {\n if (this.addedNodes.length || this.removedNodes.length) {\n let mutations = [{\n addedNodes: this.addedNodes,\n removedNodes: this.removedNodes\n }];\n this.addedNodes = [];\n this.removedNodes = [];\n return mutations;\n }\n return [];\n }\n\n}\n\n// TODO(sorvell): consider instead polyfilling MutationObserver\n// directly so that users do not have to fork their code.\n// Supporting the entire api may be challenging: e.g. filtering out\n// removed nodes in the wrong scope and seeing non-distributing\n// subtree child mutations.\nexport let observeChildren = function(node, callback) {\n const sd = ensureShadyDataForNode(node);\n if (!sd.observer) {\n sd.observer = new AsyncObserver();\n }\n sd.observer.callbacks.add(callback);\n let observer = sd.observer;\n return {\n _callback: callback,\n _observer: observer,\n _node: node,\n takeRecords() {\n return observer.takeRecords()\n }\n };\n}\n\nexport let unobserveChildren = function(handle) {\n let observer = handle && handle._observer;\n if (observer) {\n observer.callbacks.delete(handle._callback);\n if (!observer.callbacks.size) {\n ensureShadyDataForNode(handle._node).observer = null;\n }\n }\n}\n\nexport function filterMutations(mutations, target) {\n /** @const {Node} */\n const targetRootNode = target.getRootNode();\n return mutations.map(function(mutation) {\n /** @const {boolean} */\n const mutationInScope = (targetRootNode === mutation.target.getRootNode());\n if (mutationInScope && mutation.addedNodes) {\n let nodes = Array.from(mutation.addedNodes).filter(function(n) {\n return (targetRootNode === n.getRootNode());\n });\n if (nodes.length) {\n mutation = Object.create(mutation);\n Object.defineProperty(mutation, 'addedNodes', {\n value: nodes,\n configurable: true\n });\n return mutation;\n }\n } else if (mutationInScope) {\n return mutation;\n }\n }).filter(function(m) { return m});\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nexport let appendChild = Element.prototype.appendChild;\nexport let insertBefore = Element.prototype.insertBefore;\nexport let replaceChild = Element.prototype.replaceChild;\nexport let removeChild = Element.prototype.removeChild;\nexport let setAttribute = Element.prototype.setAttribute;\nexport let removeAttribute = Element.prototype.removeAttribute;\nexport let cloneNode = Element.prototype.cloneNode;\nexport let importNode = Document.prototype.importNode;\nexport let addEventListener = Element.prototype.addEventListener;\nexport let removeEventListener = Element.prototype.removeEventListener;\nexport let windowAddEventListener = Window.prototype.addEventListener;\nexport let windowRemoveEventListener = Window.prototype.removeEventListener;\nexport let dispatchEvent = Element.prototype.dispatchEvent;\nexport let contains = Node.prototype.contains || HTMLElement.prototype.contains;\nexport let getElementById = Document.prototype.getElementById;\nexport let elementQuerySelector = Element.prototype.querySelector;\nexport let fragmentQuerySelector = DocumentFragment.prototype.querySelector;\nexport let documentQuerySelector = Document.prototype.querySelector;\nexport let querySelector = function(selector) {\n switch (this.nodeType) {\n case Node.ELEMENT_NODE:\n return elementQuerySelector.call(this, selector);\n case Node.DOCUMENT_NODE:\n return documentQuerySelector.call(this, selector);\n default:\n return fragmentQuerySelector.call(this, selector);\n }\n};\nexport let elementQuerySelectorAll = Element.prototype.querySelectorAll;\nexport let fragmentQuerySelectorAll = DocumentFragment.prototype.querySelectorAll;\nexport let documentQuerySelectorAll = Document.prototype.querySelectorAll;\nexport let querySelectorAll = function(selector) {\n switch (this.nodeType) {\n case Node.ELEMENT_NODE:\n return elementQuerySelectorAll.call(this, selector);\n case Node.DOCUMENT_NODE:\n return documentQuerySelectorAll.call(this, selector);\n default:\n return fragmentQuerySelectorAll.call(this, selector);\n }\n};","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n// Cribbed from ShadowDOM polyfill\n// https://github.com/webcomponents/webcomponentsjs/blob/master/src/ShadowDOM/wrappers/HTMLElement.js#L28\n/////////////////////////////////////////////////////////////////////////////\n// innerHTML and outerHTML\n\n// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\nlet escapeAttrRegExp = /[&\\u00A0\"]/g;\nlet escapeDataRegExp = /[&\\u00A0<>]/g;\n\nfunction escapeReplace(c) {\n switch (c) {\n case '&':\n return '&amp;';\n case '<':\n return '&lt;';\n case '>':\n return '&gt;';\n case '\"':\n return '&quot;';\n case '\\u00A0':\n return '&nbsp;';\n }\n}\n\nfunction escapeAttr(s) {\n return s.replace(escapeAttrRegExp, escapeReplace);\n}\n\nfunction escapeData(s) {\n return s.replace(escapeDataRegExp, escapeReplace);\n}\n\nfunction makeSet(arr) {\n let set = {};\n for (let i = 0; i < arr.length; i++) {\n set[arr[i]] = true;\n }\n return set;\n}\n\n// http://www.whatwg.org/specs/web-apps/current-work/#void-elements\nlet voidElements = makeSet([\n 'area',\n 'base',\n 'br',\n 'col',\n 'command',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n]);\n\nlet plaintextParents = makeSet([\n 'style',\n 'script',\n 'xmp',\n 'iframe',\n 'noembed',\n 'noframes',\n 'plaintext',\n 'noscript'\n]);\n\n/**\n * @param {Node} node\n * @param {Node} parentNode\n * @param {Function=} callback\n */\nexport function getOuterHTML(node, parentNode, callback) {\n switch (node.nodeType) {\n case Node.ELEMENT_NODE: {\n let tagName = node.localName;\n let s = '<' + tagName;\n let attrs = node.attributes;\n for (let i = 0, attr; (attr = attrs[i]); i++) {\n s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n }\n s += '>';\n if (voidElements[tagName]) {\n return s;\n }\n return s + getInnerHTML(node, callback) + '</' + tagName + '>';\n }\n case Node.TEXT_NODE: {\n let data = /** @type {Text} */ (node).data;\n if (parentNode && plaintextParents[parentNode.localName]) {\n return data;\n }\n return escapeData(data);\n }\n case Node.COMMENT_NODE: {\n return '<!--' + /** @type {Comment} */ (node).data + '-->';\n }\n default: {\n window.console.error(node);\n throw new Error('not implemented');\n }\n }\n}\n\n/**\n * @param {Node} node\n * @param {Function=} callback\n */\nexport function getInnerHTML(node, callback) {\n if (node.localName === 'template') {\n node = /** @type {HTMLTemplateElement} */ (node).content;\n }\n let s = '';\n let c$ = callback ? callback(node) : node.childNodes;\n for (let i=0, l=c$.length, child; (i<l) && (child=c$[i]); i++) {\n s += getOuterHTML(child, node, callback);\n }\n return s;\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport {getInnerHTML} from './innerHTML.js';\n\nlet nodeWalker = document.createTreeWalker(document, NodeFilter.SHOW_ALL,\n null, false);\n\nlet elementWalker = document.createTreeWalker(document, NodeFilter.SHOW_ELEMENT,\n null, false);\n\nexport function parentNode(node) {\n nodeWalker.currentNode = node;\n return nodeWalker.parentNode();\n}\n\nexport function firstChild(node) {\n nodeWalker.currentNode = node;\n return nodeWalker.firstChild();\n}\n\nexport function lastChild(node) {\n nodeWalker.currentNode = node;\n return nodeWalker.lastChild();\n}\n\nexport function previousSibling(node) {\n nodeWalker.currentNode = node;\n return nodeWalker.previousSibling();\n}\n\nexport function nextSibling(node) {\n nodeWalker.currentNode = node;\n return nodeWalker.nextSibling();\n}\n\nexport function childNodes(node) {\n let nodes = [];\n nodeWalker.currentNode = node;\n let n = nodeWalker.firstChild();\n while (n) {\n nodes.push(n);\n n = nodeWalker.nextSibling();\n }\n return nodes;\n}\n\nexport function parentElement(node) {\n elementWalker.currentNode = node;\n return elementWalker.parentNode();\n}\n\nexport function firstElementChild(node) {\n elementWalker.currentNode = node;\n return elementWalker.firstChild();\n}\n\nexport function lastElementChild(node) {\n elementWalker.currentNode = node;\n return elementWalker.lastChild();\n}\n\nexport function previousElementSibling(node) {\n elementWalker.currentNode = node;\n return elementWalker.previousSibling();\n}\n\nexport function nextElementSibling(node) {\n elementWalker.currentNode = node;\n return elementWalker.nextSibling();\n}\n\nexport function children(node) {\n let nodes = [];\n elementWalker.currentNode = node;\n let n = elementWalker.firstChild();\n while (n) {\n nodes.push(n);\n n = elementWalker.nextSibling();\n }\n return nodes;\n}\n\nexport function innerHTML(node) {\n return getInnerHTML(node, (n) => childNodes(n));\n}\n\nexport function textContent(node) {\n /* eslint-disable no-case-declarations */\n switch (node.nodeType) {\n case Node.ELEMENT_NODE:\n case Node.DOCUMENT_FRAGMENT_NODE:\n let textWalker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT,\n null, false);\n let content = '', n;\n while ( (n = textWalker.nextNode()) ) {\n // TODO(sorvell): can't use textContent since we patch it on Node.prototype!\n // However, should probably patch it only on element.\n content += n.nodeValue;\n }\n return content;\n default:\n return node.nodeValue;\n }\n /* eslint-enable */\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport * as utils from './utils.js';\n\nconst hasDescriptors = utils.settings.hasDescriptors;\n\n// Find descriptor on the \"lowest\" native prototype. Safe as these are not\n// overridden and we call these on nodes.\nconst nativeProtos = [Node.prototype, Element.prototype, HTMLElement.prototype];\n// note, avoid Array.find for IE11 compat.\nfunction findNativeProtoWithDescriptor(name) {\n for (let i=0; i < nativeProtos.length; i++) {\n const proto = nativeProtos[i];\n if (proto.hasOwnProperty(name)) {\n return proto;\n }\n }\n}\nfunction findNodeDescriptor(name) {\n const proto = findNativeProtoWithDescriptor(name);\n if (!proto) {\n throw Error(`Could not find descriptor for ${name}`);\n }\n return Object.getOwnPropertyDescriptor(proto, name);\n}\n\nexport const nodeAccessors = hasDescriptors ? {\n parentNode: findNodeDescriptor('parentNode'),\n firstChild: findNodeDescriptor('firstChild'),\n lastChild: findNodeDescriptor('lastChild'),\n previousSibling: findNodeDescriptor('previousSibling'),\n nextSibling: findNodeDescriptor('nextSibling'),\n childNodes: findNodeDescriptor('childNodes'),\n parentElement: findNodeDescriptor('parentElement'),\n previousElementSibling: findNodeDescriptor('previousElementSibling'),\n nextElementSibling: findNodeDescriptor('nextElementSibling'),\n innerHTML: findNodeDescriptor('innerHTML'),\n textContent: findNodeDescriptor('textContent'),\n firstElementChild: findNodeDescriptor('firstElementChild'),\n lastElementChild: findNodeDescriptor('lastElementChild'),\n children: findNodeDescriptor('children'),\n} : {};\n\nexport const fragmentAccessors = hasDescriptors ? {\n firstElementChild: Object.getOwnPropertyDescriptor(\n DocumentFragment.prototype, 'firstElementChild'),\n lastElementChild: Object.getOwnPropertyDescriptor(\n DocumentFragment.prototype, 'lastElementChild'),\n children: Object.getOwnPropertyDescriptor(\n DocumentFragment.prototype, 'children')\n} : {};\n\nexport const documentAccessors = hasDescriptors ? {\n firstElementChild: Object.getOwnPropertyDescriptor(\n Document.prototype, 'firstElementChild'),\n lastElementChild: Object.getOwnPropertyDescriptor(\n Document.prototype, 'lastElementChild'),\n children: Object.getOwnPropertyDescriptor(\n Document.prototype, 'children')\n} : {};\n\nexport function parentNode(node) {\n return nodeAccessors.parentNode.get.call(node);\n}\n\nexport function firstChild(node) {\n return nodeAccessors.firstChild.get.call(node);\n}\n\nexport function lastChild(node) {\n return nodeAccessors.lastChild.get.call(node);\n}\n\nexport function previousSibling(node) {\n return nodeAccessors.previousSibling.get.call(node);\n}\n\nexport function nextSibling(node) {\n return nodeAccessors.nextSibling.get.call(node);\n}\n\nexport function childNodes(node) {\n return Array.prototype.slice.call(nodeAccessors.childNodes.get.call(node));\n}\n\nexport function parentElement(node) {\n return nodeAccessors.parentElement.get.call(node);\n}\n\nexport function previousElementSibling(node) {\n return nodeAccessors.previousElementSibling.get.call(node);\n}\n\nexport function nextElementSibling(node) {\n return nodeAccessors.nextElementSibling.get.call(node);\n}\n\nexport function innerHTML(node) {\n return nodeAccessors.innerHTML.get.call(node);\n}\n\nexport function textContent(node) {\n return nodeAccessors.textContent.get.call(node);\n}\n\nexport function children(node) {\n let children;\n switch (node.nodeType) {\n case Node.DOCUMENT_FRAGMENT_NODE:\n children = fragmentAccessors.children.get.call(node);\n break;\n case Node.DOCUMENT_NODE:\n children = documentAccessors.children.get.call(node);\n break;\n default:\n children = nodeAccessors.children.get.call(node);\n break;\n }\n return Array.prototype.slice.call(children);\n}\n\nexport function firstElementChild(node) {\n switch (node.nodeType) {\n case Node.DOCUMENT_FRAGMENT_NODE:\n return fragmentAccessors.firstElementChild.get.call(node);\n case Node.DOCUMENT_NODE:\n return documentAccessors.firstElementChild.get.call(node);\n default:\n return nodeAccessors.firstElementChild.get.call(node);\n }\n}\n\nexport function lastElementChild(node) {\n switch (node.nodeType) {\n case Node.DOCUMENT_FRAGMENT_NODE:\n return fragmentAccessors.lastElementChild.get.call(node);\n case Node.DOCUMENT_NODE:\n return documentAccessors.lastElementChild.get.call(node);\n default:\n return nodeAccessors.lastElementChild.get.call(node);\n }\n}","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as nativeTreeWalker from './native-tree-walker.js';\nimport * as nativeTreeAccessors from './native-tree-accessors.js';\nimport * as utils from './utils.js';\n\nexport const accessors = utils.settings.useNativeAccessors ?\n nativeTreeAccessors : nativeTreeWalker;","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\nimport {getInnerHTML} from './innerHTML.js';\nimport {accessors as nativeTree} from './native-tree.js';\nimport {nodeAccessors as nativeAccessors} from './native-tree-accessors.js';\nimport {contains as nativeContains} from './native-methods.js';\nimport {ensureShadyDataForNode, shadyDataForNode} from './shady-data.js';\n\nfunction clearNode(node) {\n while (node.firstChild) {\n node.removeChild(node.firstChild);\n }\n}\n\nconst hasDescriptors = utils.settings.hasDescriptors;\nconst inertDoc = document.implementation.createHTMLDocument('inert');\n\nconst nativeIsConnectedAccessors =\n/** @type {ObjectPropertyDescriptor} */(\n Object.getOwnPropertyDescriptor(Node.prototype, 'isConnected')\n);\n\nconst nativeIsConnected = nativeIsConnectedAccessors && nativeIsConnectedAccessors.get;\n\nconst nativeActiveElementDescriptor =\n /** @type {ObjectPropertyDescriptor} */(\n Object.getOwnPropertyDescriptor(Document.prototype, 'activeElement')\n );\nfunction getDocumentActiveElement() {\n if (nativeActiveElementDescriptor && nativeActiveElementDescriptor.get) {\n return nativeActiveElementDescriptor.get.call(document);\n } else if (!utils.settings.hasDescriptors) {\n return document.activeElement;\n }\n}\n\nfunction activeElementForNode(node) {\n let active = getDocumentActiveElement();\n // In IE11, activeElement might be an empty object if the document is\n // contained in an iframe.\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/10998788/\n if (!active || !active.nodeType) {\n return null;\n }\n let isShadyRoot = !!(utils.isShadyRoot(node));\n if (node !== document) {\n // If this node isn't a document or shady root, then it doesn't have\n // an active element.\n if (!isShadyRoot) {\n return null;\n }\n // If this shady root's host is the active element or the active\n // element is not a descendant of the host (in the composed tree),\n // then it doesn't have an active element.\n if (node.host === active ||\n !nativeContains.call(node.host, active)) {\n return null;\n }\n }\n // This node is either the document or a shady root of which the active\n // element is a (composed) descendant of its host; iterate upwards to\n // find the active element's most shallow host within it.\n let activeRoot = utils.ownerShadyRootForNode(active);\n while (activeRoot && activeRoot !== node) {\n active = activeRoot.host;\n activeRoot = utils.ownerShadyRootForNode(active);\n }\n if (node === document) {\n // This node is the document, so activeRoot should be null.\n return activeRoot ? null : active;\n } else {\n // This node is a non-document shady root, and it should be\n // activeRoot.\n return activeRoot === node ? active : null;\n }\n}\n\nlet OutsideAccessors = {\n\n parentElement: {\n /** @this {Node} */\n get() {\n const nodeData = shadyDataForNode(this);\n let l = nodeData && nodeData.parentNode;\n if (l && l.nodeType !== Node.ELEMENT_NODE) {\n l = null;\n }\n return l !== undefined ? l : nativeTree.parentElement(this);\n },\n configurable: true\n },\n\n parentNode: {\n /** @this {Node} */\n get() {\n const nodeData = shadyDataForNode(this);\n const l = nodeData && nodeData.parentNode;\n return l !== undefined ? l : nativeTree.parentNode(this);\n },\n configurable: true\n },\n\n nextSibling: {\n /** @this {Node} */\n get() {\n const nodeData = shadyDataForNode(this);\n const l = nodeData && nodeData.nextSibling;\n return l !== undefined ? l : nativeTree.nextSibling(this);\n },\n configurable: true\n },\n\n previousSibling: {\n /** @this {Node} */\n get() {\n const nodeData = shadyDataForNode(this);\n const l = nodeData && nodeData.previousSibling;\n return l !== undefined ? l : nativeTree.previousSibling(this);\n },\n configurable: true\n },\n\n // fragment, element, document\n nextElementSibling: {\n /**\n * @this {HTMLElement}\n */\n get() {\n const nodeData = shadyDataForNode(this);\n if (nodeData && nodeData.nextSibling !== undefined) {\n let n = this.nextSibling;\n while (n && n.nodeType !== Node.ELEMENT_NODE) {\n n = n.nextSibling;\n }\n return n;\n } else {\n return nativeTree.nextElementSibling(this);\n }\n },\n configurable: true\n },\n\n previousElementSibling: {\n /**\n * @this {HTMLElement}\n */\n get() {\n const nodeData = shadyDataForNode(this);\n if (nodeData && nodeData.previousSibling !== undefined) {\n let n = this.previousSibling;\n while (n && n.nodeType !== Node.ELEMENT_NODE) {\n n = n.previousSibling;\n }\n return n;\n } else {\n return nativeTree.previousElementSibling(this);\n }\n },\n configurable: true\n }\n\n};\n\nexport const ClassNameAccessor = {\n className: {\n /**\n * @this {HTMLElement}\n */\n get() {\n return this.getAttribute('class') || '';\n },\n /**\n * @this {HTMLElement}\n */\n set(value) {\n this.setAttribute('class', value);\n },\n configurable: true\n }\n}\n\nexport const IsConnectedAccessor = {\n\n isConnected: {\n /**\n * @this {Node}\n */\n get() {\n if (nativeIsConnected && nativeIsConnected.call(this)) {\n return true;\n }\n if (this.nodeType == Node.DOCUMENT_FRAGMENT_NODE) {\n return false;\n }\n // Fast path for distributed nodes.\n const ownerDocument = this.ownerDocument;\n if (utils.hasDocumentContains) {\n if (nativeContains.call(ownerDocument, this)) {\n return true;\n }\n } else if (ownerDocument.documentElement &&\n nativeContains.call(ownerDocument.documentElement, this)) {\n return true;\n }\n // Slow path for non-distributed nodes.\n let node = this;\n while (node && !(node instanceof Document)) {\n node = node.parentNode || (utils.isShadyRoot(node) ? /** @type {ShadowRoot} */(node).host : undefined);\n }\n return !!(node && node instanceof Document);\n },\n configurable: true\n }\n};\n\nlet InsideAccessors = {\n\n childNodes: {\n /**\n * @this {HTMLElement}\n */\n get() {\n let childNodes;\n if (utils.isTrackingLogicalChildNodes(this)) {\n const nodeData = shadyDataForNode(this);\n if (!nodeData.childNodes) {\n nodeData.childNodes = [];\n for (let n=this.firstChild; n; n=n.nextSibling) {\n nodeData.childNodes.push(n);\n }\n }\n childNodes = nodeData.childNodes;\n } else {\n childNodes = nativeTree.childNodes(this);\n }\n childNodes.item = function(index) {\n return childNodes[index];\n }\n return childNodes;\n },\n configurable: true\n },\n\n childElementCount: {\n /** @this {HTMLElement} */\n get() {\n return this.children.length;\n },\n configurable: true\n },\n\n firstChild: {\n /** @this {HTMLElement} */\n get() {\n const nodeData = shadyDataForNode(this);\n const l = nodeData && nodeData.firstChild;\n return l !== undefined ? l : nativeTree.firstChild(this);\n },\n configurable: true\n },\n\n lastChild: {\n /** @this {HTMLElement} */\n get() {\n const nodeData = shadyDataForNode(this);\n const l = nodeData && nodeData.lastChild;\n return l !== undefined ? l : nativeTree.lastChild(this);\n },\n configurable: true\n },\n\n textContent: {\n /**\n * @this {HTMLElement}\n */\n get() {\n if (utils.isTrackingLogicalChildNodes(this)) {\n let tc = [];\n for (let i = 0, cn = this.childNodes, c; (c = cn[i]); i++) {\n if (c.nodeType !== Node.COMMENT_NODE) {\n tc.push(c.textContent);\n }\n }\n return tc.join('');\n } else {\n return nativeTree.textContent(this);\n }\n },\n /**\n * @this {HTMLElement}\n * @param {string} text\n */\n set(text) {\n if (typeof text === 'undefined' || text === null) {\n text = ''\n }\n switch (this.nodeType) {\n case Node.ELEMENT_NODE:\n case Node.DOCUMENT_FRAGMENT_NODE:\n if (!utils.isTrackingLogicalChildNodes(this) && hasDescriptors) {\n // may be removing a nested slot but fast path if we know we are not.\n const firstChild = this.firstChild;\n if (firstChild != this.lastChild ||\n (firstChild && firstChild.nodeType != Node.TEXT_NODE)) {\n clearNode(this);\n }\n nativeAccessors.textContent.set.call(this, text);\n } else {\n clearNode(this);\n // Document fragments must have no childnodes if setting a blank string\n if (text.length > 0 || this.nodeType === Node.ELEMENT_NODE) {\n this.appendChild(document.createTextNode(text));\n }\n }\n break;\n default:\n // TODO(sorvell): can't do this if patch nodeValue.\n this.nodeValue = text;\n break;\n }\n },\n configurable: true\n },\n\n // fragment, element, document\n firstElementChild: {\n /**\n * @this {HTMLElement}\n */\n get() {\n const nodeData = shadyDataForNode(this);\n if (nodeData && nodeData.firstChild !== undefined) {\n let n = this.firstChild;\n while (n && n.nodeType !== Node.ELEMENT_NODE) {\n n = n.nextSibling;\n }\n return n;\n } else {\n return nativeTree.firstElementChild(this);\n }\n },\n configurable: true\n },\n\n lastElementChild: {\n /**\n * @this {HTMLElement}\n */\n get() {\n const nodeData = shadyDataForNode(this);\n if (nodeData && nodeData.lastChild !== undefined) {\n let n = this.lastChild;\n while (n && n.nodeType !== Node.ELEMENT_NODE) {\n n = n.previousSibling;\n }\n return n;\n } else {\n return nativeTree.lastElementChild(this);\n }\n },\n configurable: true\n },\n\n children: {\n /**\n * @this {HTMLElement}\n */\n get() {\n let children;\n if (utils.isTrackingLogicalChildNodes(this)) {\n children = Array.prototype.filter.call(this.childNodes, function(n) {\n return (n.nodeType === Node.ELEMENT_NODE);\n });\n } else {\n children = nativeTree.children(this);\n }\n children.item = function(index) {\n return children[index];\n }\n return children;\n },\n configurable: true\n },\n\n // element (HTMLElement on IE11)\n innerHTML: {\n /**\n * @this {HTMLElement}\n */\n get() {\n if (utils.isTrackingLogicalChildNodes(this)) {\n const content = this.localName === 'template' ?\n /** @type {HTMLTemplateElement} */(this).content : this;\n return getInnerHTML(content);\n } else {\n return nativeTree.innerHTML(this);\n }\n },\n /**\n * @this {HTMLElement}\n */\n set(text) {\n const content = this.localName === 'template' ?\n /** @type {HTMLTemplateElement} */(this).content : this;\n clearNode(content);\n let containerName = this.localName;\n // avoid creating a template so we don't have to pull nodes form `.content`\n if (!containerName || containerName === 'template') {\n containerName = 'div';\n }\n const htmlContainer = inertDoc.createElement(containerName);\n if (hasDescriptors) {\n nativeAccessors.innerHTML.set.call(htmlContainer, text);\n } else {\n htmlContainer.innerHTML = text;\n }\n while (htmlContainer.firstChild) {\n content.appendChild(htmlContainer.firstChild);\n }\n },\n configurable: true\n }\n\n};\n\n// Note: Can be patched on element prototype on all browsers.\n// Must be patched on instance on browsers that support native Shadow DOM\n// but do not have builtin accessors (old Chrome).\nexport let ShadowRootAccessor = {\n\n shadowRoot: {\n /**\n * @this {HTMLElement}\n */\n get() {\n const nodeData = shadyDataForNode(this);\n return nodeData && nodeData.publicRoot || null;\n },\n configurable: true\n }\n};\n\n// Note: Can be patched on document prototype on browsers with builtin accessors.\n// Must be patched separately on simulated ShadowRoot.\n// Must be patched as `_activeElement` on browsers without builtin accessors.\nexport let ActiveElementAccessor = {\n\n activeElement: {\n /**\n * @this {HTMLElement}\n */\n get() {\n return activeElementForNode(this);\n },\n /**\n * @this {HTMLElement}\n */\n set() {},\n configurable: true\n }\n\n};\n\n// patch a group of descriptors on an object only if it exists or if the `force`\n// argument is true.\n/**\n * @param {!Object} obj\n * @param {!Object} descriptors\n * @param {boolean=} force\n */\nfunction patchAccessorGroup(obj, descriptors, force) {\n for (let p in descriptors) {\n let objDesc = Object.getOwnPropertyDescriptor(obj, p);\n if ((objDesc && objDesc.configurable) ||\n (!objDesc && force)) {\n Object.defineProperty(obj, p, descriptors[p]);\n } else if (force) {\n console.warn('Could not define', p, 'on', obj); // eslint-disable-line no-console\n }\n }\n}\n\n// patch dom accessors on proto where they exist\nexport function patchAccessors(proto) {\n patchAccessorGroup(proto, OutsideAccessors);\n patchAccessorGroup(proto, ClassNameAccessor);\n patchAccessorGroup(proto, InsideAccessors);\n patchAccessorGroup(proto, ActiveElementAccessor);\n}\n\nexport function patchShadowRootAccessors(proto) {\n proto.__proto__ = DocumentFragment.prototype;\n // ensure element descriptors (IE/Edge don't have em)\n patchAccessorGroup(proto, OutsideAccessors, true);\n patchAccessorGroup(proto, InsideAccessors, true);\n patchAccessorGroup(proto, ActiveElementAccessor, true);\n // Ensure native properties are all safely wrapped since ShadowRoot is not an\n // actual DocumentFragment instance.\n Object.defineProperties(proto, {\n nodeType: {\n value: Node.DOCUMENT_FRAGMENT_NODE,\n configurable: true\n },\n nodeName: {\n value: '#document-fragment',\n configurable: true\n },\n nodeValue: {\n value: null,\n configurable: true\n }\n });\n // make undefined\n [\n 'localName',\n 'namespaceURI',\n 'prefix'\n ].forEach((prop) => {\n Object.defineProperty(proto, prop, {\n value: undefined,\n configurable: true\n });\n });\n // defer properties to host\n [\n 'ownerDocument',\n 'baseURI',\n 'isConnected'\n ].forEach((prop) => {\n Object.defineProperty(proto, prop, {\n get() {\n return this.host[prop];\n },\n configurable: true\n });\n });\n}\n\n// ensure an element has patched \"outside\" accessors; no-op when not needed\nexport let patchOutsideElementAccessors = utils.settings.hasDescriptors ?\n function() {} : function(element) {\n const sd = ensureShadyDataForNode(element);\n if (!sd.__outsideAccessors) {\n sd.__outsideAccessors = true;\n patchAccessorGroup(element, OutsideAccessors, true);\n patchAccessorGroup(element, ClassNameAccessor, true);\n }\n }\n\n// ensure an element has patched \"inside\" accessors; no-op when not needed\nexport let patchInsideElementAccessors = utils.settings.hasDescriptors ?\n function() {} : function(element) {\n const sd = ensureShadyDataForNode(element);\n if (!sd.__insideAccessors) {\n patchAccessorGroup(element, InsideAccessors, true);\n patchAccessorGroup(element, ShadowRootAccessor, true);\n }\n }\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport {calculateSplices} from './array-splice.js';\nimport * as utils from './utils.js';\nimport {enqueue} from './flush.js';\nimport {recordChildNodes} from './logical-tree.js';\nimport {removeChild, insertBefore, dispatchEvent} from './native-methods.js';\nimport {accessors} from './native-tree.js';\nimport {ensureShadyDataForNode, shadyDataForNode} from './shady-data.js';\n\nconst {parentNode, childNodes} = accessors;\n\n// Do not export this object. It must be passed as the first argument to the\n// ShadyRoot constructor in `attachShadow` to prevent the constructor from\n// throwing. This prevents the user from being able to manually construct a\n// ShadyRoot (i.e. `new ShadowRoot()`).\nconst ShadyRootConstructionToken = {};\n\nconst CATCHALL_NAME = '__catchall';\nconst SHADYROOT_NAME = 'ShadyRoot';\n\nconst MODE_CLOSED = 'closed';\n\nfunction ancestorList(node) {\n let ancestors = [];\n do {\n ancestors.unshift(node);\n } while ((node = node.parentNode));\n return ancestors;\n}\n\n/**\n * @constructor\n * @extends {ShadowRoot}\n */\nexport class ShadyRoot {\n\n constructor(token, host, options) {\n if (token !== ShadyRootConstructionToken) {\n throw new TypeError('Illegal constructor');\n }\n // NOTE: set a fake local name so this element can be\n // distinguished from a DocumentFragment when patching.\n // FF doesn't allow this to be `localName`\n this._localName = SHADYROOT_NAME;\n const c$ = childNodes(host);\n // root <=> host\n this.host = host;\n this._mode = options && options.mode;\n // logical dom setup\n recordChildNodes(host, c$);\n const hostData = shadyDataForNode(host);\n hostData.root = this;\n hostData.publicRoot = this._mode !== MODE_CLOSED ? this : null;\n // setup root\n const rootData = ensureShadyDataForNode(this);\n rootData.firstChild = rootData.lastChild =\n rootData.parentNode = rootData.nextSibling =\n rootData.previousSibling = null;\n rootData.childNodes = [];\n // state flags\n this._renderPending = false;\n this._hasRendered = false;\n // marsalled lazily\n this._slotList = null;\n this._slotMap = null;\n this._pendingSlots = null;\n // fast path initial render: remove existing physical dom.\n for (let i=0, l=c$.length; i < l; i++) {\n removeChild.call(host, c$[i])\n }\n }\n\n // async render\n _asyncRender() {\n if (!this._renderPending) {\n this._renderPending = true;\n enqueue(() => this._render());\n }\n }\n\n // returns the oldest renderPending ancestor root.\n _getRenderRoot() {\n let renderRoot;\n let root = this;\n while (root) {\n if (root._renderPending) {\n renderRoot = root;\n }\n root = root._rendererForHost();\n }\n return renderRoot;\n }\n\n // Returns the shadyRoot `this.host` if `this.host`\n // has children that require distribution.\n _rendererForHost() {\n let root = this.host.getRootNode();\n if (utils.isShadyRoot(root)) {\n let c$ = this.host.childNodes;\n for (let i=0, c; i < c$.length; i++) {\n c = c$[i];\n if (this._isInsertionPoint(c)) {\n return root;\n }\n }\n }\n }\n\n _render() {\n const root = this._getRenderRoot();\n if (root) {\n root['_renderRoot']();\n }\n }\n\n // NOTE: avoid renaming to ease testability.\n ['_renderRoot']() {\n this._renderPending = false;\n if (this._slotList) {\n this._distribute();\n this._compose();\n }\n this._hasRendered = true;\n }\n\n _distribute() {\n this._validateSlots();\n // capture # of previously assigned nodes to help determine if dirty.\n for (let i=0, slot; i < this._slotList.length; i++) {\n slot = this._slotList[i];\n this._clearSlotAssignedNodes(slot);\n }\n // distribute host children.\n for (let n=this.host.firstChild; n; n=n.nextSibling) {\n this._distributeNodeToSlot(n);\n }\n // fallback content, slotchange, and dirty roots\n for (let i=0; i < this._slotList.length; i++) {\n const slot = this._slotList[i];\n const slotData = shadyDataForNode(slot);\n // distribute fallback content\n if (!slotData.assignedNodes.length) {\n for (let n=slot.firstChild; n; n=n.nextSibling) {\n this._distributeNodeToSlot(n, slot);\n }\n }\n const slotParentData = shadyDataForNode(slot.parentNode);\n const slotParentRoot = slotParentData && slotParentData.root;\n if (slotParentRoot && slotParentRoot._hasInsertionPoint()) {\n slotParentRoot['_renderRoot']();\n }\n this._addAssignedToFlattenedNodes(slotData.flattenedNodes,\n slotData.assignedNodes);\n let prevAssignedNodes = slotData._previouslyAssignedNodes;\n if (prevAssignedNodes) {\n for (let i=0; i < prevAssignedNodes.length; i++) {\n shadyDataForNode(prevAssignedNodes[i])._prevAssignedSlot = null;\n }\n slotData._previouslyAssignedNodes = null;\n // dirty if previously less assigned nodes than previously assigned.\n if (prevAssignedNodes.length > slotData.assignedNodes.length) {\n slotData.dirty = true;\n }\n }\n /* Note: A slot is marked dirty whenever a node is newly assigned to it\n or a node is assigned to a different slot (done in `_distributeNodeToSlot`)\n or if the number of nodes assigned to the slot has decreased (done above);\n */\n if (slotData.dirty) {\n slotData.dirty = false;\n this._fireSlotChange(slot);\n }\n }\n }\n\n /**\n * Distributes given `node` to the appropriate slot based on its `slot`\n * attribute. If `forcedSlot` is given, then the node is distributed to the\n * `forcedSlot`.\n * Note: slot to which the node is assigned will be marked dirty for firing\n * `slotchange`.\n * @param {Node} node\n * @param {Node=} forcedSlot\n *\n */\n _distributeNodeToSlot(node, forcedSlot) {\n const nodeData = ensureShadyDataForNode(node);\n let oldSlot = nodeData._prevAssignedSlot;\n nodeData._prevAssignedSlot = null;\n let slot = forcedSlot;\n if (!slot) {\n let name = node.slot || CATCHALL_NAME;\n const list = this._slotMap[name];\n slot = list && list[0];\n }\n if (slot) {\n const slotData = ensureShadyDataForNode(slot);\n slotData.assignedNodes.push(node);\n nodeData.assignedSlot = slot;\n } else {\n nodeData.assignedSlot = undefined;\n }\n if (oldSlot !== nodeData.assignedSlot) {\n if (nodeData.assignedSlot) {\n ensureShadyDataForNode(nodeData.assignedSlot).dirty = true;\n }\n }\n }\n\n /**\n * Clears the assignedNodes tracking data for a given `slot`. Note, the current\n * assigned node data is tracked (via _previouslyAssignedNodes and\n * _prevAssignedSlot) to see if `slotchange` should fire. This data may be out\n * of date at this time because the assigned nodes may have already been\n * distributed to another root. This is ok since this data is only used to\n * track changes.\n * @param {HTMLSlotElement} slot\n */\n _clearSlotAssignedNodes(slot) {\n const slotData = shadyDataForNode(slot);\n let n$ = slotData.assignedNodes;\n slotData.assignedNodes = [];\n slotData.flattenedNodes = [];\n slotData._previouslyAssignedNodes = n$;\n if (n$) {\n for (let i=0; i < n$.length; i++) {\n let n = shadyDataForNode(n$[i]);\n n._prevAssignedSlot = n.assignedSlot;\n // only clear if it was previously set to this slot;\n // this helps ensure that if the node has otherwise been distributed\n // ignore it.\n if (n.assignedSlot === slot) {\n n.assignedSlot = null;\n }\n }\n }\n }\n\n _addAssignedToFlattenedNodes(flattened, assigned) {\n for (let i=0, n; (i<assigned.length) && (n=assigned[i]); i++) {\n if (n.localName == 'slot') {\n const nestedAssigned = shadyDataForNode(n).assignedNodes;\n if (nestedAssigned && nestedAssigned.length) {\n this._addAssignedToFlattenedNodes(flattened, nestedAssigned);\n }\n } else {\n flattened.push(assigned[i]);\n }\n }\n }\n\n _fireSlotChange(slot) {\n // NOTE: cannot bubble correctly here so not setting bubbles: true\n // Safari tech preview does not bubble but chrome does\n // Spec says it bubbles (https://dom.spec.whatwg.org/#mutation-observers)\n dispatchEvent.call(slot, new Event('slotchange'));\n const slotData = shadyDataForNode(slot);\n if (slotData.assignedSlot) {\n this._fireSlotChange(slotData.assignedSlot);\n }\n }\n\n // Reify dom such that it is at its correct rendering position\n // based on logical distribution.\n // NOTE: here we only compose parents of <slot> elements and not the\n // shadowRoot into the host. The latter is performend via a fast path\n // in the `logical-mutation`.insertBefore.\n _compose() {\n const slots = this._slotList;\n let composeList = [];\n for (let i=0; i < slots.length; i++) {\n const parent = slots[i].parentNode;\n /* compose node only if:\n (1) parent does not have a shadowRoot since shadowRoot has already\n composed into the host\n (2) we're not already composing it\n [consider (n^2) but rare better than Set]\n */\n const parentData = shadyDataForNode(parent);\n if (!(parentData && parentData.root) &&\n composeList.indexOf(parent) < 0) {\n composeList.push(parent);\n }\n }\n for (let i=0; i < composeList.length; i++) {\n const node = composeList[i];\n const targetNode = node === this ? this.host : node;\n this._updateChildNodes(targetNode, this._composeNode(node));\n }\n }\n\n // Returns the list of nodes which should be rendered inside `node`.\n _composeNode(node) {\n let children = [];\n let c$ = node.childNodes;\n for (let i = 0; i < c$.length; i++) {\n let child = c$[i];\n // Note: if we see a slot here, the nodes are guaranteed to need to be\n // composed here. This is because if there is redistribution, it has\n // already been handled by this point.\n if (this._isInsertionPoint(child)) {\n let flattenedNodes = shadyDataForNode(child).flattenedNodes;\n for (let j = 0; j < flattenedNodes.length; j++) {\n let distributedNode = flattenedNodes[j];\n children.push(distributedNode);\n }\n } else {\n children.push(child);\n }\n }\n return children;\n }\n\n _isInsertionPoint(node) {\n return node.localName == 'slot';\n }\n\n // Ensures that the rendered node list inside `container` is `children`.\n _updateChildNodes(container, children) {\n let composed = childNodes(container);\n let splices = calculateSplices(children, composed);\n // process removals\n for (let i=0, d=0, s; (i<splices.length) && (s=splices[i]); i++) {\n for (let j=0, n; (j < s.removed.length) && (n=s.removed[j]); j++) {\n // check if the node is still where we expect it is before trying\n // to remove it; this can happen if we move a node and\n // then schedule its previous host for distribution resulting in\n // the node being removed here.\n if (parentNode(n) === container) {\n removeChild.call(container, n);\n }\n // TODO(sorvell): avoid the need for splicing here.\n composed.splice(s.index + d, 1);\n }\n d -= s.addedCount;\n }\n // process adds\n for (let i=0, s, next; (i<splices.length) && (s=splices[i]); i++) { //eslint-disable-line no-redeclare\n next = composed[s.index];\n for (let j=s.index, n; j < s.index + s.addedCount; j++) {\n n = children[j];\n insertBefore.call(container, n, next);\n composed.splice(j, 0, n);\n }\n }\n }\n\n _ensureSlotData() {\n this._pendingSlots = this._pendingSlots || [];\n this._slotList = this._slotList || [];\n this._slotMap = this._slotMap || {};\n }\n\n _addSlots(slots) {\n this._ensureSlotData();\n this._pendingSlots.push(...slots);\n }\n\n _validateSlots() {\n if (this._pendingSlots && this._pendingSlots.length) {\n this._mapSlots(this._pendingSlots);\n this._pendingSlots = [];\n }\n }\n\n /**\n * Adds the given slots. Slots are maintained in an dom-ordered list.\n * In addition a map of name to slot is updated.\n */\n _mapSlots(slots) {\n let slotNamesToSort;\n for (let i=0; i < slots.length; i++) {\n let slot = slots[i];\n // ensure insertionPoints's and their parents have logical dom info.\n // save logical tree info\n // a. for shadyRoot\n // b. for insertion points (fallback)\n // c. for parents of insertion points\n recordChildNodes(slot);\n recordChildNodes(slot.parentNode);\n let name = this._nameForSlot(slot);\n if (this._slotMap[name]) {\n slotNamesToSort = slotNamesToSort || {};\n slotNamesToSort[name] = true;\n this._slotMap[name].push(slot);\n } else {\n this._slotMap[name] = [slot];\n }\n this._slotList.push(slot);\n }\n if (slotNamesToSort) {\n for (let n in slotNamesToSort) {\n this._slotMap[n] = this._sortSlots(this._slotMap[n]);\n }\n }\n }\n\n _nameForSlot(slot) {\n const name = slot['name'] || slot.getAttribute('name') || CATCHALL_NAME;\n slot.__slotName = name;\n return name;\n }\n\n /**\n * Slots are kept in an ordered list. Slots with the same name\n * are sorted here by tree order.\n */\n _sortSlots(slots) {\n // NOTE: Cannot use `compareDocumentPosition` because it's not polyfilled,\n // but the code here could be used to polyfill the preceeding/following info\n // in `compareDocumentPosition`.\n return slots.sort((a, b) => {\n let listA = ancestorList(a);\n let listB = ancestorList(b);\n for (var i=0; i < listA.length; i++) {\n let nA = listA[i];\n let nB = listB[i];\n if (nA !== nB) {\n let c$ = Array.from(nA.parentNode.childNodes);\n return c$.indexOf(nA) - c$.indexOf(nB);\n }\n }\n });\n }\n\n /**\n * Removes from tracked slot data any slots contained within `container` and\n * then updates the tracked data (_slotList and _slotMap).\n * Any removed slots also have their `assignedNodes` removed from comopsed dom.\n */\n _removeContainedSlots(container) {\n if (!this._slotList) {\n return;\n }\n this._validateSlots();\n let didRemove;\n const map = this._slotMap;\n for (let n in map) {\n let slots = map[n];\n for (let i=0; i < slots.length; i++) {\n let slot = slots[i];\n if (utils.contains(container, slot)) {\n slots.splice(i, 1);\n const x = this._slotList.indexOf(slot);\n if (x >= 0) {\n this._slotList.splice(x, 1);\n }\n i--;\n this._removeFlattenedNodes(slot);\n didRemove = true;\n }\n }\n }\n return didRemove;\n }\n\n _updateSlotName(slot) {\n if (!this._slotList) {\n return;\n }\n const oldName = slot.__slotName;\n const name = this._nameForSlot(slot);\n if (name === oldName) {\n return;\n }\n // remove from existing tracking\n let slots = this._slotMap[oldName];\n const i = slots.indexOf(slot);\n if (i >= 0) {\n slots.splice(i, 1);\n }\n // add to new location and sort if nedessary\n let list = this._slotMap[name] || (this._slotMap[name] = []);\n list.push(slot);\n if (list.length > 1) {\n this._slotMap[name] = this._sortSlots(list);\n }\n }\n\n _removeFlattenedNodes(slot) {\n const data = shadyDataForNode(slot);\n let n$ = data.flattenedNodes;\n if (n$) {\n for (let i=0; i<n$.length; i++) {\n let node = n$[i];\n let parent = parentNode(node);\n if (parent) {\n removeChild.call(parent, node);\n }\n }\n }\n data.flattenedNodes = [];\n data.assignedNodes = [];\n }\n\n _hasInsertionPoint() {\n this._validateSlots();\n return Boolean(this._slotList && this._slotList.length);\n }\n}\n\n/**\n Implements a pared down version of ShadowDOM's scoping, which is easy to\n polyfill across browsers.\n*/\nexport function attachShadow(host, options) {\n if (!host) {\n throw 'Must provide a host.';\n }\n if (!options) {\n throw 'Not enough arguments.'\n }\n return new ShadyRoot(ShadyRootConstructionToken, host, options);\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\nimport {flush} from './flush.js';\nimport {dispatchEvent, querySelectorAll} from './native-methods.js';\nimport * as mutation from './logical-mutation.js';\nimport {ActiveElementAccessor, ShadowRootAccessor, patchAccessors, patchShadowRootAccessors, IsConnectedAccessor} from './patch-accessors.js';\nimport {addEventListener, removeEventListener} from './patch-events.js';\nimport {attachShadow, ShadyRoot} from './attach-shadow.js';\nimport {shadyDataForNode} from './shady-data.js';\n\nfunction getAssignedSlot(node) {\n mutation.renderRootNode(node);\n const nodeData = shadyDataForNode(node);\n return nodeData && nodeData.assignedSlot || null;\n}\n\nlet windowMixin = {\n\n // NOTE: ensure these methods are bound to `window` so that `this` is correct\n // when called directly from global context without a receiver; e.g.\n // `addEventListener(...)`.\n addEventListener: addEventListener.bind(window),\n\n removeEventListener: removeEventListener.bind(window)\n\n};\n\nlet nodeMixin = {\n\n addEventListener: addEventListener,\n\n removeEventListener: removeEventListener,\n\n appendChild(node) {\n return mutation.insertBefore(this, node);\n },\n\n insertBefore(node, ref_node) {\n return mutation.insertBefore(this, node, ref_node);\n },\n\n removeChild(node) {\n return mutation.removeChild(this, node);\n },\n\n /**\n * @this {Node}\n */\n replaceChild(node, ref_node) {\n mutation.insertBefore(this, node, ref_node);\n mutation.removeChild(this, ref_node);\n return node;\n },\n\n /**\n * @this {Node}\n */\n cloneNode(deep) {\n return mutation.cloneNode(this, deep);\n },\n\n /**\n * @this {Node}\n */\n getRootNode(options) {\n return mutation.getRootNode(this, options);\n },\n\n contains(node) {\n return utils.contains(this, node);\n },\n\n /**\n * @this {Node}\n */\n dispatchEvent(event) {\n flush();\n return dispatchEvent.call(this, event);\n }\n\n};\n\n// NOTE: we can do this regardless of the browser supporting native accessors\n// since this is always \"new\" in that case.\nObject.defineProperties(nodeMixin, IsConnectedAccessor);\n\n// NOTE: For some reason 'Text' redefines 'assignedSlot'\nlet textMixin = {\n /**\n * @this {Text}\n */\n get assignedSlot() {\n return getAssignedSlot(this);\n }\n};\n\nlet fragmentMixin = {\n\n // TODO(sorvell): consider doing native QSA and filtering results.\n /**\n * @this {DocumentFragment}\n */\n querySelector(selector) {\n // match selector and halt on first result.\n let result = mutation.query(this, function(n) {\n return utils.matchesSelector(n, selector);\n }, function(n) {\n return Boolean(n);\n })[0];\n return result || null;\n },\n\n /**\n * @this {DocumentFragment}\n */\n // TODO(sorvell): `useNative` option relies on native querySelectorAll and\n // misses distributed nodes, see\n // https://github.com/webcomponents/shadydom/pull/210#issuecomment-361435503\n querySelectorAll(selector, useNative) {\n if (useNative) {\n const o = Array.prototype.slice.call(querySelectorAll(this, selector));\n const root = this.getRootNode();\n return o.filter(e => e.getRootNode() == root);\n }\n return mutation.query(this, function(n) {\n return utils.matchesSelector(n, selector);\n });\n }\n\n};\n\nlet slotMixin = {\n\n /**\n * @this {HTMLSlotElement}\n */\n assignedNodes(options) {\n if (this.localName === 'slot') {\n mutation.renderRootNode(this);\n const nodeData = shadyDataForNode(this);\n return nodeData ?\n ((options && options.flatten ? nodeData.flattenedNodes :\n nodeData.assignedNodes) || []) :\n [];\n }\n }\n\n};\n\nlet elementMixin = utils.extendAll({\n\n /**\n * @this {HTMLElement}\n */\n setAttribute(name, value) {\n mutation.setAttribute(this, name, value);\n },\n\n /**\n * @this {HTMLElement}\n */\n removeAttribute(name) {\n mutation.removeAttribute(this, name);\n },\n\n /**\n * @this {HTMLElement}\n */\n attachShadow(options) {\n return attachShadow(this, options);\n },\n\n /**\n * @this {HTMLElement}\n */\n get slot() {\n return this.getAttribute('slot');\n },\n\n /**\n * @this {HTMLElement}\n */\n set slot(value) {\n mutation.setAttribute(this, 'slot', value);\n },\n\n /**\n * @this {HTMLElement}\n */\n get assignedSlot() {\n return getAssignedSlot(this);\n }\n\n}, fragmentMixin, slotMixin);\n\nObject.defineProperties(elementMixin, ShadowRootAccessor);\n\nlet documentMixin = utils.extendAll({\n /**\n * @this {Document}\n */\n importNode(node, deep) {\n return mutation.importNode(node, deep);\n },\n\n /**\n * @this {Document}\n */\n getElementById(id) {\n let result = mutation.query(this, function(n) {\n return n.id == id;\n }, function(n) {\n return Boolean(n);\n })[0];\n return result || null;\n }\n\n}, fragmentMixin);\n\nObject.defineProperties(documentMixin, {\n '_activeElement': ActiveElementAccessor.activeElement\n});\n\nlet nativeBlur = HTMLElement.prototype.blur;\n\nlet htmlElementMixin = utils.extendAll({\n /**\n * @this {HTMLElement}\n */\n blur() {\n const nodeData = shadyDataForNode(this);\n let root = nodeData && nodeData.root;\n let shadowActive = root && root.activeElement;\n if (shadowActive) {\n shadowActive.blur();\n } else {\n nativeBlur.call(this);\n }\n }\n});\n\nconst shadowRootMixin = {\n addEventListener(type, fn, optionsOrCapture) {\n if (typeof optionsOrCapture !== 'object') {\n optionsOrCapture = {\n capture: Boolean(optionsOrCapture)\n }\n }\n optionsOrCapture.__shadyTarget = this;\n this.host.addEventListener(type, fn, optionsOrCapture);\n },\n\n removeEventListener(type, fn, optionsOrCapture) {\n if (typeof optionsOrCapture !== 'object') {\n optionsOrCapture = {\n capture: Boolean(optionsOrCapture)\n }\n }\n optionsOrCapture.__shadyTarget = this;\n this.host.removeEventListener(type, fn, optionsOrCapture);\n },\n\n getElementById(id) {\n let result = mutation.query(this, function(n) {\n return n.id == id;\n }, function(n) {\n return Boolean(n);\n })[0];\n return result || null;\n }\n}\n\nfunction patchBuiltin(proto, obj) {\n let n$ = Object.getOwnPropertyNames(obj);\n for (let i=0; i < n$.length; i++) {\n let n = n$[i];\n let d = Object.getOwnPropertyDescriptor(obj, n);\n // NOTE: we prefer writing directly here because some browsers\n // have descriptors that are writable but not configurable (e.g.\n // `appendChild` on older browsers)\n if (d.value) {\n proto[n] = d.value;\n } else {\n Object.defineProperty(proto, n, d);\n }\n }\n}\n\n// Apply patches to builtins (e.g. Element.prototype). Some of these patches\n// can be done unconditionally (mostly methods like\n// `Element.prototype.appendChild`) and some can only be done when the browser\n// has proper descriptors on the builtin prototype\n// (e.g. `Element.prototype.firstChild`)`. When descriptors are not available,\n// elements are individually patched when needed (see e.g.\n// `patchInside/OutsideElementAccessors` in `patch-accessors.js`).\nexport function patchBuiltins() {\n let nativeHTMLElement =\n (window['customElements'] && window['customElements']['nativeHTMLElement']) ||\n HTMLElement;\n // These patches can always be done, for all supported browsers.\n patchBuiltin(ShadyRoot.prototype, shadowRootMixin);\n patchBuiltin(window.Node.prototype, nodeMixin);\n patchBuiltin(window.Window.prototype, windowMixin);\n patchBuiltin(window.Text.prototype, textMixin);\n patchBuiltin(window.DocumentFragment.prototype, fragmentMixin);\n patchBuiltin(window.Element.prototype, elementMixin);\n patchBuiltin(window.Document.prototype, documentMixin);\n if (window.HTMLSlotElement) {\n patchBuiltin(window.HTMLSlotElement.prototype, slotMixin);\n }\n patchBuiltin(nativeHTMLElement.prototype, htmlElementMixin);\n // These patches can *only* be done\n // on browsers that have proper property descriptors on builtin prototypes.\n // This includes: IE11, Edge, Chrome >= 4?; Safari >= 10, Firefox\n // On older browsers (Chrome <= 4?, Safari 9), a per element patching\n // strategy is used for patching accessors.\n if (utils.settings.hasDescriptors) {\n patchAccessors(window.Node.prototype);\n patchAccessors(window.Text.prototype);\n patchAccessors(window.DocumentFragment.prototype);\n patchAccessors(window.Element.prototype);\n patchAccessors(nativeHTMLElement.prototype);\n patchAccessors(window.Document.prototype);\n if (window.HTMLSlotElement) {\n patchAccessors(window.HTMLSlotElement.prototype);\n }\n }\n patchShadowRootAccessors(ShadyRoot.prototype);\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport {patchInsideElementAccessors, patchOutsideElementAccessors} from './patch-accessors.js';\nimport {accessors} from './native-tree.js';\nimport {ensureShadyDataForNode, shadyDataForNode} from './shady-data.js';\n\nconst {childNodes} = accessors;\n\nexport function recordInsertBefore(node, container, ref_node) {\n patchInsideElementAccessors(container);\n const containerData = ensureShadyDataForNode(container);\n if (containerData.firstChild !== undefined) {\n containerData.childNodes = null;\n }\n // handle document fragments\n if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n let c$ = node.childNodes;\n for (let i=0; i < c$.length; i++) {\n linkNode(c$[i], container, ref_node);\n }\n // cleanup logical dom in doc fragment.\n const nodeData = ensureShadyDataForNode(node);\n let resetTo = (nodeData.firstChild !== undefined) ? null : undefined;\n nodeData.firstChild = nodeData.lastChild = resetTo;\n nodeData.childNodes = resetTo;\n } else {\n linkNode(node, container, ref_node);\n }\n}\n\nfunction linkNode(node, container, ref_node) {\n patchOutsideElementAccessors(node);\n ref_node = ref_node || null;\n const nodeData = ensureShadyDataForNode(node);\n const containerData = ensureShadyDataForNode(container);\n const ref_nodeData = ref_node ? ensureShadyDataForNode(ref_node) : null;\n // update ref_node.previousSibling <-> node\n nodeData.previousSibling = ref_node ? ref_nodeData.previousSibling :\n container.lastChild;\n let psd = shadyDataForNode(nodeData.previousSibling);\n if (psd) {\n psd.nextSibling = node;\n }\n // update node <-> ref_node\n let nsd = shadyDataForNode(nodeData.nextSibling = ref_node);\n if (nsd) {\n nsd.previousSibling = node;\n }\n // update node <-> container\n nodeData.parentNode = container;\n if (ref_node) {\n if (ref_node === containerData.firstChild) {\n containerData.firstChild = node;\n }\n } else {\n containerData.lastChild = node;\n if (!containerData.firstChild) {\n containerData.firstChild = node;\n }\n }\n // remove caching of childNodes\n containerData.childNodes = null;\n}\n\nexport function recordRemoveChild(node, container) {\n const nodeData = ensureShadyDataForNode(node);\n const containerData = ensureShadyDataForNode(container);\n if (node === containerData.firstChild) {\n containerData.firstChild = nodeData.nextSibling;\n }\n if (node === containerData.lastChild) {\n containerData.lastChild = nodeData.previousSibling;\n }\n let p = nodeData.previousSibling;\n let n = nodeData.nextSibling;\n if (p) {\n ensureShadyDataForNode(p).nextSibling = n;\n }\n if (n) {\n ensureShadyDataForNode(n).previousSibling = p;\n }\n // When an element is removed, logical data is no longer tracked.\n // Explicitly set `undefined` here to indicate this. This is disginguished\n // from `null` which is set if info is null.\n nodeData.parentNode = nodeData.previousSibling =\n nodeData.nextSibling = undefined;\n if (containerData.childNodes !== undefined) {\n // remove caching of childNodes\n containerData.childNodes = null;\n }\n}\n\nexport let recordChildNodes = function(node, nodes) {\n const nodeData = ensureShadyDataForNode(node);\n if (nodeData.firstChild === undefined) {\n const c$ = nodes || childNodes(node);\n nodeData.firstChild = c$[0] || null;\n nodeData.lastChild = c$[c$.length-1] || null;\n patchInsideElementAccessors(node);\n for (let i=0; i<c$.length; i++) {\n const n = c$[i];\n const sd = ensureShadyDataForNode(n);\n sd.parentNode = node;\n sd.nextSibling = c$[i+1] || null;\n sd.previousSibling = c$[i-1] || null;\n patchOutsideElementAccessors(n);\n }\n }\n}","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\nimport * as logicalTree from './logical-tree.js';\nimport * as nativeMethods from './native-methods.js';\nimport {accessors} from './native-tree.js';\nimport {ensureShadyDataForNode, shadyDataForNode} from './shady-data.js';\n\nconst {parentNode} = accessors;\n\n// Patched `insertBefore`. Note that all mutations that add nodes are routed\n// here. When a <slot> is added or a node is added to a host with a shadowRoot\n// with a slot, a standard dom `insert` call is aborted and `_asyncRender`\n// is called on the relevant shadowRoot. In all other cases, a standard dom\n// `insert` can be made, but the location and ref_node may need to be changed.\n/**\n * @param {Node} parent\n * @param {Node} node\n * @param {Node=} ref_node\n */\nexport function insertBefore(parent, node, ref_node) {\n if (node === parent) {\n throw Error(`Failed to execute 'appendChild' on 'Node': The new child element contains the parent.`);\n }\n if (ref_node) {\n const refData = shadyDataForNode(ref_node);\n const p = refData && refData.parentNode;\n if ((p !== undefined && p !== parent) ||\n (p === undefined && parentNode(ref_node) !== parent)) {\n throw Error(`Failed to execute 'insertBefore' on 'Node': The node ` +\n `before which the new node is to be inserted is not a child of this node.`);\n }\n }\n if (ref_node === node) {\n return node;\n }\n // remove from existing location\n if (node.parentNode) {\n // NOTE: avoid node.removeChild as this *can* trigger another patched\n // method (e.g. custom elements) and we want only the shady method to run.\n removeChild(node.parentNode, node);\n }\n // add to new parent\n let preventNativeInsert;\n let ownerRoot;\n let slotsAdded;\n if (!node['__noInsertionPoint']) {\n ownerRoot = utils.ownerShadyRootForNode(parent);\n slotsAdded = ownerRoot && findContainedSlots(node);\n if (slotsAdded) {\n ownerRoot._addSlots(slotsAdded);\n }\n }\n // if a slot is added, must render containing root.\n if (parent.localName === 'slot' || slotsAdded) {\n ownerRoot = ownerRoot || utils.ownerShadyRootForNode(parent);\n if (ownerRoot) {\n ownerRoot._asyncRender();\n }\n }\n if (utils.isTrackingLogicalChildNodes(parent)) {\n logicalTree.recordInsertBefore(node, parent, ref_node);\n // when inserting into a host with a shadowRoot with slot, use\n // `shadowRoot._asyncRender()` via `attach-shadow` module\n const parentData = shadyDataForNode(parent);\n if (hasShadowRootWithSlot(parent)) {\n parentData.root._asyncRender();\n preventNativeInsert = true;\n // when inserting into a host with shadowRoot with NO slot, do nothing\n // as the node should not be added to composed dome anywhere.\n } else if (parentData.root) {\n preventNativeInsert = true;\n }\n }\n if (!preventNativeInsert) {\n // if adding to a shadyRoot, add to host instead\n let container = utils.isShadyRoot(parent) ?\n /** @type {ShadowRoot} */(parent).host : parent;\n // if ref_node, get the ref_node that's actually in composed dom.\n if (ref_node) {\n ref_node = firstComposedNode(ref_node);\n nativeMethods.insertBefore.call(container, node, ref_node);\n } else {\n nativeMethods.appendChild.call(container, node);\n }\n }\n scheduleObserver(parent, node);\n return node;\n}\n\nfunction findContainedSlots(node) {\n let slots;\n if (node.localName === 'slot') {\n slots = [node];\n } else if (node.querySelectorAll) {\n slots = node.querySelectorAll('slot');\n }\n if (slots && slots.length) {\n return slots;\n }\n}\n\n/**\n * Patched `removeChild`. Note that all dom \"removals\" are routed here.\n * Removes the given `node` from the element's `children`.\n * This method also performs dom composition.\n * @param {Node} parent\n * @param {Node} node\n*/\nexport function removeChild(parent, node) {\n if (node.parentNode !== parent) {\n throw Error('The node to be removed is not a child of this node: ' +\n node);\n }\n let preventNativeRemove;\n let ownerRoot = utils.ownerShadyRootForNode(node);\n let removingInsertionPoint;\n const parentData = shadyDataForNode(parent);\n if (utils.isTrackingLogicalChildNodes(parent)) {\n logicalTree.recordRemoveChild(node, parent);\n if (hasShadowRootWithSlot(parent)) {\n parentData.root._asyncRender();\n preventNativeRemove = true;\n }\n }\n removeOwnerShadyRoot(node);\n // if removing slot, must render containing root\n if (ownerRoot) {\n let changeSlotContent = parent && parent.localName === 'slot';\n if (changeSlotContent) {\n preventNativeRemove = true;\n }\n removingInsertionPoint = ownerRoot._removeContainedSlots(node);\n if (removingInsertionPoint || changeSlotContent) {\n ownerRoot._asyncRender();\n }\n }\n if (!preventNativeRemove) {\n // if removing from a shadyRoot, remove form host instead\n let container = utils.isShadyRoot(parent) ?\n /** @type {ShadowRoot} */(parent).host :\n parent;\n // not guaranteed to physically be in container; e.g.\n // (1) if parent has a shadyRoot, element may or may not at distributed\n // location (could be undistributed)\n // (2) if parent is a slot, element may not ben in composed dom\n if (!(parentData.root || node.localName === 'slot') ||\n (container === parentNode(node))) {\n nativeMethods.removeChild.call(container, node);\n }\n }\n scheduleObserver(parent, null, node);\n return node;\n}\n\nfunction removeOwnerShadyRoot(node) {\n // optimization: only reset the tree if node is actually in a root\n if (hasCachedOwnerRoot(node)) {\n let c$ = node.childNodes;\n for (let i=0, l=c$.length, n; (i<l) && (n=c$[i]); i++) {\n removeOwnerShadyRoot(n);\n }\n }\n const nodeData = shadyDataForNode(node);\n if (nodeData) {\n nodeData.ownerShadyRoot = undefined;\n }\n}\n\nfunction hasCachedOwnerRoot(node) {\n const nodeData = shadyDataForNode(node);\n return Boolean(nodeData && nodeData.ownerShadyRoot !== undefined);\n}\n\n/**\n * Finds the first flattened node that is composed in the node's parent.\n * If the given node is a slot, then the first flattened node is returned\n * if it exists, otherwise advance to the node's nextSibling.\n * @param {Node} node within which to find first composed node\n * @returns {Node} first composed node\n */\nfunction firstComposedNode(node) {\n let composed = node;\n if (node && node.localName === 'slot') {\n const nodeData = shadyDataForNode(node);\n const flattened = nodeData && nodeData.flattenedNodes;\n composed = flattened && flattened.length ? flattened[0] :\n firstComposedNode(node.nextSibling);\n }\n return composed;\n}\n\nfunction hasShadowRootWithSlot(node) {\n const nodeData = shadyDataForNode(node);\n let root = nodeData && nodeData.root;\n return (root && root._hasInsertionPoint());\n}\n\n/**\n * Should be called whenever an attribute changes. If the `slot` attribute\n * changes, provokes rendering if necessary. If a `<slot>` element's `name`\n * attribute changes, updates the root's slot map and renders.\n * @param {Node} node\n * @param {string} name\n */\nfunction distributeAttributeChange(node, name) {\n if (name === 'slot') {\n const parent = node.parentNode;\n if (hasShadowRootWithSlot(parent)) {\n shadyDataForNode(parent).root._asyncRender();\n }\n } else if (node.localName === 'slot' && name === 'name') {\n let root = utils.ownerShadyRootForNode(node);\n if (root) {\n root._updateSlotName(node);\n root._asyncRender();\n }\n }\n}\n\n/**\n * @param {Node} node\n * @param {Node=} addedNode\n * @param {Node=} removedNode\n */\nfunction scheduleObserver(node, addedNode, removedNode) {\n const nodeData = shadyDataForNode(node);\n const observer = nodeData && nodeData.observer;\n if (observer) {\n if (addedNode) {\n observer.addedNodes.push(addedNode);\n }\n if (removedNode) {\n observer.removedNodes.push(removedNode);\n }\n observer.schedule();\n }\n}\n\n/**\n * @param {Node} node\n * @param {Object=} options\n */\nexport function getRootNode(node, options) { // eslint-disable-line no-unused-vars\n if (!node || !node.nodeType) {\n return;\n }\n const nodeData = ensureShadyDataForNode(node);\n let root = nodeData.ownerShadyRoot;\n if (root === undefined) {\n if (utils.isShadyRoot(node)) {\n root = node;\n nodeData.ownerShadyRoot = root;\n } else {\n let parent = node.parentNode;\n root = parent ? getRootNode(parent) : node;\n // memo-ize result for performance but only memo-ize\n // result if node is in the document. This avoids a problem where a root\n // can be cached while an element is inside a fragment.\n // If this happens and we cache the result, the value can become stale\n // because for perf we avoid processing the subtree of added fragments.\n if (nativeMethods.contains.call(document.documentElement, node)) {\n nodeData.ownerShadyRoot = root;\n }\n }\n\n }\n return root;\n}\n\n// NOTE: `query` is used primarily for ShadyDOM's querySelector impl,\n// but it's also generally useful to recurse through the element tree\n// and is used by Polymer's styling system.\n/**\n * @param {Node} node\n * @param {Function} matcher\n * @param {Function=} halter\n */\nexport function query(node, matcher, halter) {\n let list = [];\n queryElements(node.childNodes, matcher,\n halter, list);\n return list;\n}\n\nfunction queryElements(elements, matcher, halter, list) {\n for (let i=0, l=elements.length, c; (i<l) && (c=elements[i]); i++) {\n if (c.nodeType === Node.ELEMENT_NODE &&\n queryElement(c, matcher, halter, list)) {\n return true;\n }\n }\n}\n\nfunction queryElement(node, matcher, halter, list) {\n let result = matcher(node);\n if (result) {\n list.push(node);\n }\n if (halter && halter(result)) {\n return result;\n }\n queryElements(node.childNodes, matcher,\n halter, list);\n}\n\nexport function renderRootNode(element) {\n var root = element.getRootNode();\n if (utils.isShadyRoot(root)) {\n root._render();\n }\n}\n\nlet scopingShim = null;\n\nexport function setAttribute(node, attr, value) {\n if (!scopingShim) {\n scopingShim = window['ShadyCSS'] && window['ShadyCSS']['ScopingShim'];\n }\n if (scopingShim && attr === 'class') {\n scopingShim['setElementClass'](node, value);\n } else {\n nativeMethods.setAttribute.call(node, attr, value);\n distributeAttributeChange(node, attr);\n }\n}\n\nexport function removeAttribute(node, attr) {\n nativeMethods.removeAttribute.call(node, attr);\n distributeAttributeChange(node, attr);\n}\n\nexport function cloneNode(node, deep) {\n if (node.localName == 'template') {\n return nativeMethods.cloneNode.call(node, deep);\n } else {\n let n = nativeMethods.cloneNode.call(node, false);\n if (deep) {\n let c$ = node.childNodes;\n for (let i=0, nc; i < c$.length; i++) {\n nc = c$[i].cloneNode(true);\n n.appendChild(nc);\n }\n }\n return n;\n }\n}\n\n// note: Though not technically correct, we fast path `importNode`\n// when called on a node not owned by the main document.\n// This allows, for example, elements that cannot\n// contain custom elements and are therefore not likely to contain shadowRoots\n// to cloned natively. This is a fairly significant performance win.\nexport function importNode(node, deep) {\n if (node.ownerDocument !== document) {\n return nativeMethods.importNode.call(document, node, deep);\n }\n let n = nativeMethods.importNode.call(document, node, false);\n if (deep) {\n let c$ = node.childNodes;\n for (let i=0, nc; i < c$.length; i++) {\n nc = importNode(c$[i], true);\n n.appendChild(nc);\n }\n }\n return n;\n}",null,"/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\nimport * as nativeMethods from './native-methods.js';\nimport {shadyDataForNode} from './shady-data.js';\n\n/*\nMake this name unique so it is unlikely to conflict with properties on objects passed to `addEventListener`\nhttps://github.com/webcomponents/shadydom/issues/173\n*/\nconst /** string */ eventWrappersName = `__eventWrappers${Date.now()}`;\n\n// https://github.com/w3c/webcomponents/issues/513#issuecomment-224183937\nlet alwaysComposed = {\n 'blur': true,\n 'focus': true,\n 'focusin': true,\n 'focusout': true,\n 'click': true,\n 'dblclick': true,\n 'mousedown': true,\n 'mouseenter': true,\n 'mouseleave': true,\n 'mousemove': true,\n 'mouseout': true,\n 'mouseover': true,\n 'mouseup': true,\n 'wheel': true,\n 'beforeinput': true,\n 'input': true,\n 'keydown': true,\n 'keyup': true,\n 'compositionstart': true,\n 'compositionupdate': true,\n 'compositionend': true,\n 'touchstart': true,\n 'touchend': true,\n 'touchmove': true,\n 'touchcancel': true,\n 'pointerover': true,\n 'pointerenter': true,\n 'pointerdown': true,\n 'pointermove': true,\n 'pointerup': true,\n 'pointercancel': true,\n 'pointerout': true,\n 'pointerleave': true,\n 'gotpointercapture': true,\n 'lostpointercapture': true,\n 'dragstart': true,\n 'drag': true,\n 'dragenter': true,\n 'dragleave': true,\n 'dragover': true,\n 'drop': true,\n 'dragend': true,\n 'DOMActivate': true,\n 'DOMFocusIn': true,\n 'DOMFocusOut': true,\n 'keypress': true\n};\n\nfunction pathComposer(startNode, composed) {\n let composedPath = [];\n let current = startNode;\n let startRoot = startNode === window ? window : startNode.getRootNode();\n while (current) {\n composedPath.push(current);\n if (current.assignedSlot) {\n current = current.assignedSlot;\n } else if (current.nodeType === Node.DOCUMENT_FRAGMENT_NODE && current.host && (composed || current !== startRoot)) {\n current = current.host;\n } else {\n current = current.parentNode;\n }\n }\n // event composedPath includes window when startNode's ownerRoot is document\n if (composedPath[composedPath.length - 1] === document) {\n composedPath.push(window);\n }\n return composedPath;\n}\n\nfunction retarget(refNode, path) {\n if (!utils.isShadyRoot) {\n return refNode;\n }\n // If ANCESTOR's root is not a shadow root or ANCESTOR's root is BASE's\n // shadow-including inclusive ancestor, return ANCESTOR.\n let refNodePath = pathComposer(refNode, true);\n let p$ = path;\n for (let i=0, ancestor, lastRoot, root, rootIdx; i < p$.length; i++) {\n ancestor = p$[i];\n root = ancestor === window ? window : ancestor.getRootNode();\n if (root !== lastRoot) {\n rootIdx = refNodePath.indexOf(root);\n lastRoot = root;\n }\n if (!utils.isShadyRoot(root) || rootIdx > -1) {\n return ancestor;\n }\n }\n}\n\nlet eventMixin = {\n\n /**\n * @this {Event}\n */\n get composed() {\n // isTrusted may not exist in this browser, so just check if isTrusted is explicitly false\n if (this.isTrusted !== false && this.__composed === undefined) {\n this.__composed = alwaysComposed[this.type];\n }\n return this.__composed || false;\n },\n\n /**\n * @this {Event}\n */\n composedPath() {\n if (!this.__composedPath) {\n this.__composedPath = pathComposer(this['__target'], this.composed);\n }\n return this.__composedPath;\n },\n\n /**\n * @this {Event}\n */\n get target() {\n return retarget(this.currentTarget, this.composedPath());\n },\n\n // http://w3c.github.io/webcomponents/spec/shadow/#event-relatedtarget-retargeting\n /**\n * @this {Event}\n */\n get relatedTarget() {\n if (!this.__relatedTarget) {\n return null;\n }\n if (!this.__relatedTargetComposedPath) {\n this.__relatedTargetComposedPath = pathComposer(this.__relatedTarget, true);\n }\n // find the deepest node in relatedTarget composed path that is in the same root with the currentTarget\n return retarget(this.currentTarget, this.__relatedTargetComposedPath);\n },\n /**\n * @this {Event}\n */\n stopPropagation() {\n Event.prototype.stopPropagation.call(this);\n this.__propagationStopped = true;\n },\n /**\n * @this {Event}\n */\n stopImmediatePropagation() {\n Event.prototype.stopImmediatePropagation.call(this);\n this.__immediatePropagationStopped = true;\n this.__propagationStopped = true;\n }\n\n};\n\nfunction mixinComposedFlag(Base) {\n // NOTE: avoiding use of `class` here so that transpiled output does not\n // try to do `Base.call` with a dom construtor.\n let klazz = function(type, options) {\n let event = new Base(type, options);\n event.__composed = options && Boolean(options['composed']);\n return event;\n }\n // put constructor properties on subclass\n utils.mixin(klazz, Base);\n klazz.prototype = Base.prototype;\n return klazz;\n}\n\nlet nonBubblingEventsToRetarget = {\n 'focus': true,\n 'blur': true\n};\n\n\n/**\n * Check if the event has been retargeted by comparing original `target`, and calculated `target`\n * @param {Event} event\n * @return {boolean} True if the original target and calculated target are the same\n */\nfunction hasRetargeted(event) {\n return event['__target'] !== event.target || event.__relatedTarget !== event.relatedTarget;\n}\n\n/**\n *\n * @param {Event} event\n * @param {Node} node\n * @param {string} phase\n */\nfunction fireHandlers(event, node, phase) {\n let hs = node.__handlers && node.__handlers[event.type] &&\n node.__handlers[event.type][phase];\n if (hs) {\n for (let i = 0, fn; (fn = hs[i]); i++) {\n if (hasRetargeted(event) && event.target === event.relatedTarget) {\n return;\n }\n fn.call(node, event);\n if (event.__immediatePropagationStopped) {\n return;\n }\n }\n }\n}\n\nfunction retargetNonBubblingEvent(e) {\n let path = e.composedPath();\n let node;\n // override `currentTarget` to let patched `target` calculate correctly\n Object.defineProperty(e, 'currentTarget', {\n get: function() {\n return node;\n },\n configurable: true\n });\n for (let i = path.length - 1; i >= 0; i--) {\n node = path[i];\n // capture phase fires all capture handlers\n fireHandlers(e, node, 'capture');\n if (e.__propagationStopped) {\n return;\n }\n }\n\n // set the event phase to `AT_TARGET` as in spec\n Object.defineProperty(e, 'eventPhase', {get() { return Event.AT_TARGET }});\n\n // the event only needs to be fired when owner roots change when iterating the event path\n // keep track of the last seen owner root\n let lastFiredRoot;\n for (let i = 0; i < path.length; i++) {\n node = path[i];\n const nodeData = shadyDataForNode(node);\n const root = nodeData && nodeData.root;\n if (i === 0 || (root && root === lastFiredRoot)) {\n fireHandlers(e, node, 'bubble');\n // don't bother with window, it doesn't have `getRootNode` and will be last in the path anyway\n if (node !== window) {\n lastFiredRoot = node.getRootNode();\n }\n if (e.__propagationStopped) {\n return;\n }\n }\n }\n}\n\nfunction listenerSettingsEqual(savedListener, node, type, capture, once, passive) {\n let {\n node: savedNode,\n type: savedType,\n capture: savedCapture,\n once: savedOnce,\n passive: savedPassive\n } = savedListener;\n return node === savedNode &&\n type === savedType &&\n capture === savedCapture &&\n once === savedOnce &&\n passive === savedPassive;\n}\n\nexport function findListener(wrappers, node, type, capture, once, passive) {\n for (let i = 0; i < wrappers.length; i++) {\n if (listenerSettingsEqual(wrappers[i], node, type, capture, once, passive)) {\n return i;\n }\n }\n return -1;\n}\n\n/**\n * Firefox can throw on accessing eventWrappers inside of `removeEventListener` during a selenium run\n * Try/Catch accessing eventWrappers to work around\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1353074\n */\nfunction getEventWrappers(eventLike) {\n let wrappers = null;\n try {\n wrappers = eventLike[eventWrappersName];\n } catch (e) {} // eslint-disable-line no-empty\n return wrappers;\n}\n\n/**\n * @this {Event}\n */\nexport function addEventListener(type, fnOrObj, optionsOrCapture) {\n if (!fnOrObj) {\n return;\n }\n\n const handlerType = typeof fnOrObj;\n\n // bail if `fnOrObj` is not a function, not an object\n if (handlerType !== 'function' && handlerType !== 'object') {\n return;\n }\n\n // bail if `fnOrObj` is an object without a `handleEvent` method\n if (handlerType === 'object' && (!fnOrObj.handleEvent || typeof fnOrObj.handleEvent !== 'function')) {\n return;\n }\n\n // The callback `fn` might be used for multiple nodes/events. Since we generate\n // a wrapper function, we need to keep track of it when we remove the listener.\n // It's more efficient to store the node/type/options information as Array in\n // `fn` itself rather than the node (we assume that the same callback is used\n // for few nodes at most, whereas a node will likely have many event listeners).\n // NOTE(valdrin) invoking external functions is costly, inline has better perf.\n let capture, once, passive;\n if (optionsOrCapture && typeof optionsOrCapture === 'object') {\n capture = Boolean(optionsOrCapture.capture);\n once = Boolean(optionsOrCapture.once);\n passive = Boolean(optionsOrCapture.passive);\n } else {\n capture = Boolean(optionsOrCapture);\n once = false;\n passive = false;\n }\n // hack to let ShadyRoots have event listeners\n // event listener will be on host, but `currentTarget`\n // will be set to shadyroot for event listener\n let target = (optionsOrCapture && optionsOrCapture.__shadyTarget) || this;\n\n let wrappers = fnOrObj[eventWrappersName];\n if (wrappers) {\n // Stop if the wrapper function has already been created.\n if (findListener(wrappers, target, type, capture, once, passive) > -1) {\n return;\n }\n } else {\n fnOrObj[eventWrappersName] = [];\n }\n\n /**\n * @this {HTMLElement}\n * @param {Event} e\n */\n const wrapperFn = function(e) {\n // Support `once` option.\n if (once) {\n this.removeEventListener(type, fnOrObj, optionsOrCapture);\n }\n if (!e['__target']) {\n patchEvent(e);\n }\n let lastCurrentTargetDesc;\n if (target !== this) {\n // replace `currentTarget` to make `target` and `relatedTarget` correct for inside the shadowroot\n lastCurrentTargetDesc = Object.getOwnPropertyDescriptor(e, 'currentTarget');\n Object.defineProperty(e, 'currentTarget', {get() { return target }, configurable: true});\n }\n // There are two critera that should stop events from firing on this node\n // 1. the event is not composed and the current node is not in the same root as the target\n // 2. when bubbling, if after retargeting, relatedTarget and target point to the same node\n if (e.composed || e.composedPath().indexOf(target) > -1) {\n if (hasRetargeted(e) && e.target === e.relatedTarget) {\n if (e.eventPhase === Event.BUBBLING_PHASE) {\n e.stopImmediatePropagation();\n }\n return;\n }\n // prevent non-bubbling events from triggering bubbling handlers on shadowroot, but only if not in capture phase\n if (e.eventPhase !== Event.CAPTURING_PHASE && !e.bubbles && e.target !== target && !(target instanceof Window)) {\n return;\n }\n let ret = handlerType === 'function' ?\n fnOrObj.call(target, e) :\n (fnOrObj.handleEvent && fnOrObj.handleEvent(e));\n if (target !== this) {\n // replace the \"correct\" `currentTarget`\n if (lastCurrentTargetDesc) {\n Object.defineProperty(e, 'currentTarget', lastCurrentTargetDesc);\n lastCurrentTargetDesc = null;\n } else {\n delete e['currentTarget'];\n }\n }\n return ret;\n }\n };\n // Store the wrapper information.\n fnOrObj[eventWrappersName].push({\n // note: use target here which is either a shadowRoot\n // (when the host element is proxy'ing the event) or this element\n node: target,\n type: type,\n capture: capture,\n once: once,\n passive: passive,\n wrapperFn: wrapperFn\n });\n\n if (nonBubblingEventsToRetarget[type]) {\n this.__handlers = this.__handlers || {};\n this.__handlers[type] = this.__handlers[type] ||\n {'capture': [], 'bubble': []};\n this.__handlers[type][capture ? 'capture' : 'bubble'].push(wrapperFn);\n } else {\n let ael = this instanceof Window ? nativeMethods.windowAddEventListener :\n nativeMethods.addEventListener;\n ael.call(this, type, wrapperFn, optionsOrCapture);\n }\n}\n\n/**\n * @this {Event}\n */\nexport function removeEventListener(type, fnOrObj, optionsOrCapture) {\n if (!fnOrObj) {\n return;\n }\n\n // NOTE(valdrin) invoking external functions is costly, inline has better perf.\n let capture, once, passive;\n if (optionsOrCapture && typeof optionsOrCapture === 'object') {\n capture = Boolean(optionsOrCapture.capture);\n once = Boolean(optionsOrCapture.once);\n passive = Boolean(optionsOrCapture.passive);\n } else {\n capture = Boolean(optionsOrCapture);\n once = false;\n passive = false;\n }\n let target = (optionsOrCapture && optionsOrCapture.__shadyTarget) || this;\n // Search the wrapped function.\n let wrapperFn = undefined;\n let wrappers = getEventWrappers(fnOrObj);\n if (wrappers) {\n let idx = findListener(wrappers, target, type, capture, once, passive);\n if (idx > -1) {\n wrapperFn = wrappers.splice(idx, 1)[0].wrapperFn;\n // Cleanup.\n if (!wrappers.length) {\n fnOrObj[eventWrappersName] = undefined;\n }\n }\n }\n let rel = this instanceof Window ? nativeMethods.windowRemoveEventListener :\n nativeMethods.removeEventListener;\n rel.call(this, type, wrapperFn || fnOrObj, optionsOrCapture);\n if (wrapperFn && nonBubblingEventsToRetarget[type] &&\n this.__handlers && this.__handlers[type]) {\n const arr = this.__handlers[type][capture ? 'capture' : 'bubble'];\n const idx = arr.indexOf(wrapperFn);\n if (idx > -1) {\n arr.splice(idx, 1);\n }\n }\n}\n\nfunction activateFocusEventOverrides() {\n for (let ev in nonBubblingEventsToRetarget) {\n window.addEventListener(ev, function(e) {\n if (!e['__target']) {\n patchEvent(e);\n retargetNonBubblingEvent(e);\n }\n }, true);\n }\n}\n\nfunction patchEvent(event) {\n event['__target'] = event.target;\n event.__relatedTarget = event.relatedTarget;\n // patch event prototype if we can\n if (utils.settings.hasDescriptors) {\n utils.patchPrototype(event, eventMixin);\n // and fallback to patching instance\n } else {\n utils.extend(event, eventMixin);\n }\n}\n\nlet PatchedEvent = mixinComposedFlag(window.Event);\nlet PatchedCustomEvent = mixinComposedFlag(window.CustomEvent);\nlet PatchedMouseEvent = mixinComposedFlag(window.MouseEvent);\n\nexport function patchEvents() {\n window.Event = PatchedEvent;\n window.CustomEvent = PatchedCustomEvent;\n window.MouseEvent = PatchedMouseEvent;\n activateFocusEventOverrides();\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nfunction newSplice(index, removed, addedCount) {\n return {\n index: index,\n removed: removed,\n addedCount: addedCount\n };\n}\n\nconst EDIT_LEAVE = 0;\nconst EDIT_UPDATE = 1;\nconst EDIT_ADD = 2;\nconst EDIT_DELETE = 3;\n\n// Note: This function is *based* on the computation of the Levenshtein\n// \"edit\" distance. The one change is that \"updates\" are treated as two\n// edits - not one. With Array splices, an update is really a delete\n// followed by an add. By retaining this, we optimize for \"keeping\" the\n// maximum array items in the original array. For example:\n//\n// 'xxxx123' -> '123yyyy'\n//\n// With 1-edit updates, the shortest path would be just to update all seven\n// characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n// leaves the substring '123' intact.\nfunction calcEditDistances(current, currentStart, currentEnd,\n old, oldStart, oldEnd) {\n // \"Deletion\" columns\n let rowCount = oldEnd - oldStart + 1;\n let columnCount = currentEnd - currentStart + 1;\n let distances = new Array(rowCount);\n\n // \"Addition\" rows. Initialize null column.\n for (let i = 0; i < rowCount; i++) {\n distances[i] = new Array(columnCount);\n distances[i][0] = i;\n }\n\n // Initialize null row\n for (let j = 0; j < columnCount; j++)\n distances[0][j] = j;\n\n for (let i = 1; i < rowCount; i++) {\n for (let j = 1; j < columnCount; j++) {\n if (equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n distances[i][j] = distances[i - 1][j - 1];\n else {\n let north = distances[i - 1][j] + 1;\n let west = distances[i][j - 1] + 1;\n distances[i][j] = north < west ? north : west;\n }\n }\n }\n\n return distances;\n}\n\n// This starts at the final weight, and walks \"backward\" by finding\n// the minimum previous weight recursively until the origin of the weight\n// matrix.\nfunction spliceOperationsFromEditDistances(distances) {\n let i = distances.length - 1;\n let j = distances[0].length - 1;\n let current = distances[i][j];\n let edits = [];\n while (i > 0 || j > 0) {\n if (i == 0) {\n edits.push(EDIT_ADD);\n j--;\n continue;\n }\n if (j == 0) {\n edits.push(EDIT_DELETE);\n i--;\n continue;\n }\n let northWest = distances[i - 1][j - 1];\n let west = distances[i - 1][j];\n let north = distances[i][j - 1];\n\n let min;\n if (west < north)\n min = west < northWest ? west : northWest;\n else\n min = north < northWest ? north : northWest;\n\n if (min == northWest) {\n if (northWest == current) {\n edits.push(EDIT_LEAVE);\n } else {\n edits.push(EDIT_UPDATE);\n current = northWest;\n }\n i--;\n j--;\n } else if (min == west) {\n edits.push(EDIT_DELETE);\n i--;\n current = west;\n } else {\n edits.push(EDIT_ADD);\n j--;\n current = north;\n }\n }\n\n edits.reverse();\n return edits;\n}\n\n/**\n * Splice Projection functions:\n *\n * A splice map is a representation of how a previous array of items\n * was transformed into a new array of items. Conceptually it is a list of\n * tuples of\n *\n * <index, removed, addedCount>\n *\n * which are kept in ascending index order of. The tuple represents that at\n * the |index|, |removed| sequence of items were removed, and counting forward\n * from |index|, |addedCount| items were added.\n */\n\n/**\n * Lacking individual splice mutation information, the minimal set of\n * splices can be synthesized given the previous state and final state of an\n * array. The basic approach is to calculate the edit distance matrix and\n * choose the shortest path through it.\n *\n * Complexity: O(l * p)\n * l: The length of the current array\n * p: The length of the old array\n */\nfunction calcSplices(current, currentStart, currentEnd,\n old, oldStart, oldEnd) {\n let prefixCount = 0;\n let suffixCount = 0;\n let splice;\n\n let minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n if (currentStart == 0 && oldStart == 0)\n prefixCount = sharedPrefix(current, old, minLength);\n\n if (currentEnd == current.length && oldEnd == old.length)\n suffixCount = sharedSuffix(current, old, minLength - prefixCount);\n\n currentStart += prefixCount;\n oldStart += prefixCount;\n currentEnd -= suffixCount;\n oldEnd -= suffixCount;\n\n if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n return [];\n\n if (currentStart == currentEnd) {\n splice = newSplice(currentStart, [], 0);\n while (oldStart < oldEnd)\n splice.removed.push(old[oldStart++]);\n\n return [ splice ];\n } else if (oldStart == oldEnd)\n return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n let ops = spliceOperationsFromEditDistances(\n calcEditDistances(current, currentStart, currentEnd,\n old, oldStart, oldEnd));\n\n splice = undefined;\n let splices = [];\n let index = currentStart;\n let oldIndex = oldStart;\n for (let i = 0; i < ops.length; i++) {\n switch(ops[i]) {\n case EDIT_LEAVE:\n if (splice) {\n splices.push(splice);\n splice = undefined;\n }\n\n index++;\n oldIndex++;\n break;\n case EDIT_UPDATE:\n if (!splice)\n splice = newSplice(index, [], 0);\n\n splice.addedCount++;\n index++;\n\n splice.removed.push(old[oldIndex]);\n oldIndex++;\n break;\n case EDIT_ADD:\n if (!splice)\n splice = newSplice(index, [], 0);\n\n splice.addedCount++;\n index++;\n break;\n case EDIT_DELETE:\n if (!splice)\n splice = newSplice(index, [], 0);\n\n splice.removed.push(old[oldIndex]);\n oldIndex++;\n break;\n }\n }\n\n if (splice) {\n splices.push(splice);\n }\n return splices;\n}\n\nfunction sharedPrefix(current, old, searchLength) {\n for (let i = 0; i < searchLength; i++)\n if (!equals(current[i], old[i]))\n return i;\n return searchLength;\n}\n\nfunction sharedSuffix(current, old, searchLength) {\n let index1 = current.length;\n let index2 = old.length;\n let count = 0;\n while (count < searchLength && equals(current[--index1], old[--index2]))\n count++;\n\n return count;\n}\n\nfunction equals(currentValue, previousValue) {\n return currentValue === previousValue;\n}\n\nexport function calculateSplices(current, previous) {\n return calcSplices(current, 0, current.length, previous, 0,\n previous.length);\n}\n\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/**\n * Patches elements that interacts with ShadyDOM\n * such that tree traversal and mutation apis act like they would under\n * ShadowDOM.\n *\n * This import enables seemless interaction with ShadyDOM powered\n * custom elements, enabling better interoperation with 3rd party code,\n * libraries, and frameworks that use DOM tree manipulation apis.\n */\n\nimport * as utils from './utils.js';\nimport {flush, enqueue} from './flush.js';\nimport {observeChildren, unobserveChildren, filterMutations} from './observe-changes.js';\nimport * as nativeMethods from './native-methods.js';\nimport {accessors as nativeTree} from './native-tree.js';\nimport {patchBuiltins} from './patch-builtins.js';\nimport {patchInsideElementAccessors, patchOutsideElementAccessors} from './patch-accessors.js';\nimport {patchEvents} from './patch-events.js';\nimport {ShadyRoot} from './attach-shadow.js';\n\nif (utils.settings.inUse) {\n let ShadyDOM = {\n // TODO(sorvell): remove when Polymer does not depend on this.\n 'inUse': utils.settings.inUse,\n // NOTE: old browsers without prototype accessors (very old Chrome\n // and Safari) need manually patched accessors to properly set\n // `innerHTML` and `textContent` when an element is:\n // (1) inside a shadowRoot\n // (2) does not have special (slot) children itself\n // (3) and setting the property needs to provoke distribution (because\n // a nested slot is added/removed)\n 'patch': (node) => {\n patchInsideElementAccessors(node);\n patchOutsideElementAccessors(node);\n return node;\n },\n 'isShadyRoot': utils.isShadyRoot,\n 'enqueue': enqueue,\n 'flush': flush,\n 'settings': utils.settings,\n 'filterMutations': filterMutations,\n 'observeChildren': observeChildren,\n 'unobserveChildren': unobserveChildren,\n 'nativeMethods': nativeMethods,\n 'nativeTree': nativeTree\n };\n\n window['ShadyDOM'] = ShadyDOM;\n\n // Apply patches to events...\n patchEvents();\n // Apply patches to builtins (e.g. Element.prototype) where applicable.\n patchBuiltins();\n\n window.ShadowRoot = ShadyRoot;\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/*\nExtremely simple css parser. Intended to be not more than what we need\nand definitely not necessarily correct =).\n*/\n\n'use strict';\n\n/** @unrestricted */\nclass StyleNode {\n constructor() {\n /** @type {number} */\n this['start'] = 0;\n /** @type {number} */\n this['end'] = 0;\n /** @type {StyleNode} */\n this['previous'] = null;\n /** @type {StyleNode} */\n this['parent'] = null;\n /** @type {Array<StyleNode>} */\n this['rules'] = null;\n /** @type {string} */\n this['parsedCssText'] = '';\n /** @type {string} */\n this['cssText'] = '';\n /** @type {boolean} */\n this['atRule'] = false;\n /** @type {number} */\n this['type'] = 0;\n /** @type {string} */\n this['keyframesName'] = '';\n /** @type {string} */\n this['selector'] = '';\n /** @type {string} */\n this['parsedSelector'] = '';\n }\n}\n\nexport {StyleNode}\n\n// given a string of css, return a simple rule tree\n/**\n * @param {string} text\n * @return {StyleNode}\n */\nexport function parse(text) {\n text = clean(text);\n return parseCss(lex(text), text);\n}\n\n// remove stuff we don't care about that may hinder parsing\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction clean(cssText) {\n return cssText.replace(RX.comments, '').replace(RX.port, '');\n}\n\n// super simple {...} lexer that returns a node tree\n/**\n * @param {string} text\n * @return {StyleNode}\n */\nfunction lex(text) {\n let root = new StyleNode();\n root['start'] = 0;\n root['end'] = text.length\n let n = root;\n for (let i = 0, l = text.length; i < l; i++) {\n if (text[i] === OPEN_BRACE) {\n if (!n['rules']) {\n n['rules'] = [];\n }\n let p = n;\n let previous = p['rules'][p['rules'].length - 1] || null;\n n = new StyleNode();\n n['start'] = i + 1;\n n['parent'] = p;\n n['previous'] = previous;\n p['rules'].push(n);\n } else if (text[i] === CLOSE_BRACE) {\n n['end'] = i + 1;\n n = n['parent'] || root;\n }\n }\n return root;\n}\n\n// add selectors/cssText to node tree\n/**\n * @param {StyleNode} node\n * @param {string} text\n * @return {StyleNode}\n */\nfunction parseCss(node, text) {\n let t = text.substring(node['start'], node['end'] - 1);\n node['parsedCssText'] = node['cssText'] = t.trim();\n if (node['parent']) {\n let ss = node['previous'] ? node['previous']['end'] : node['parent']['start'];\n t = text.substring(ss, node['start'] - 1);\n t = _expandUnicodeEscapes(t);\n t = t.replace(RX.multipleSpaces, ' ');\n // TODO(sorvell): ad hoc; make selector include only after last ;\n // helps with mixin syntax\n t = t.substring(t.lastIndexOf(';') + 1);\n let s = node['parsedSelector'] = node['selector'] = t.trim();\n node['atRule'] = (s.indexOf(AT_START) === 0);\n // note, support a subset of rule types...\n if (node['atRule']) {\n if (s.indexOf(MEDIA_START) === 0) {\n node['type'] = types.MEDIA_RULE;\n } else if (s.match(RX.keyframesRule)) {\n node['type'] = types.KEYFRAMES_RULE;\n node['keyframesName'] =\n node['selector'].split(RX.multipleSpaces).pop();\n }\n } else {\n if (s.indexOf(VAR_START) === 0) {\n node['type'] = types.MIXIN_RULE;\n } else {\n node['type'] = types.STYLE_RULE;\n }\n }\n }\n let r$ = node['rules'];\n if (r$) {\n for (let i = 0, l = r$.length, r;\n (i < l) && (r = r$[i]); i++) {\n parseCss(r, text);\n }\n }\n return node;\n}\n\n/**\n * conversion of sort unicode escapes with spaces like `\\33 ` (and longer) into\n * expanded form that doesn't require trailing space `\\000033`\n * @param {string} s\n * @return {string}\n */\nfunction _expandUnicodeEscapes(s) {\n return s.replace(/\\\\([0-9a-f]{1,6})\\s/gi, function() {\n let code = arguments[1],\n repeat = 6 - code.length;\n while (repeat--) {\n code = '0' + code;\n }\n return '\\\\' + code;\n });\n}\n\n/**\n * stringify parsed css.\n * @param {StyleNode} node\n * @param {boolean=} preserveProperties\n * @param {string=} text\n * @return {string}\n */\nexport function stringify(node, preserveProperties, text = '') {\n // calc rule cssText\n let cssText = '';\n if (node['cssText'] || node['rules']) {\n let r$ = node['rules'];\n if (r$ && !_hasMixinRules(r$)) {\n for (let i = 0, l = r$.length, r;\n (i < l) && (r = r$[i]); i++) {\n cssText = stringify(r, preserveProperties, cssText);\n }\n } else {\n cssText = preserveProperties ? node['cssText'] :\n removeCustomProps(node['cssText']);\n cssText = cssText.trim();\n if (cssText) {\n cssText = ' ' + cssText + '\\n';\n }\n }\n }\n // emit rule if there is cssText\n if (cssText) {\n if (node['selector']) {\n text += node['selector'] + ' ' + OPEN_BRACE + '\\n';\n }\n text += cssText;\n if (node['selector']) {\n text += CLOSE_BRACE + '\\n\\n';\n }\n }\n return text;\n}\n\n/**\n * @param {Array<StyleNode>} rules\n * @return {boolean}\n */\nfunction _hasMixinRules(rules) {\n let r = rules[0];\n return Boolean(r) && Boolean(r['selector']) && r['selector'].indexOf(VAR_START) === 0;\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction removeCustomProps(cssText) {\n cssText = removeCustomPropAssignment(cssText);\n return removeCustomPropApply(cssText);\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nexport function removeCustomPropAssignment(cssText) {\n return cssText\n .replace(RX.customProp, '')\n .replace(RX.mixinProp, '');\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction removeCustomPropApply(cssText) {\n return cssText\n .replace(RX.mixinApply, '')\n .replace(RX.varApply, '');\n}\n\n/** @enum {number} */\nexport const types = {\n STYLE_RULE: 1,\n KEYFRAMES_RULE: 7,\n MEDIA_RULE: 4,\n MIXIN_RULE: 1000\n}\n\nconst OPEN_BRACE = '{';\nconst CLOSE_BRACE = '}';\n\n// helper regexp's\nconst RX = {\n comments: /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n port: /@import[^;]*;/gim,\n customProp: /(?:^[^;\\-\\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\\n]|$)/gim,\n mixinProp: /(?:^[^;\\-\\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\\n]|$)?/gim,\n mixinApply: /@apply\\s*\\(?[^);]*\\)?\\s*(?:[;\\n]|$)?/gim,\n varApply: /[^;:]*?:[^;]*?var\\([^;]*\\)(?:[;\\n]|$)?/gim,\n keyframesRule: /^@[^\\s]*keyframes/,\n multipleSpaces: /\\s+/g\n}\n\nconst VAR_START = '--';\nconst MEDIA_START = '@media';\nconst AT_START = '@';\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nexport const nativeShadow = !(window['ShadyDOM'] && window['ShadyDOM']['inUse']);\nlet nativeCssVariables_;\n\n/**\n * @param {(ShadyCSSOptions | ShadyCSSInterface)=} settings\n */\nfunction calcCssVariables(settings) {\n if (settings && settings['shimcssproperties']) {\n nativeCssVariables_ = false;\n } else {\n // chrome 49 has semi-working css vars, check if box-shadow works\n // safari 9.1 has a recalc bug: https://bugs.webkit.org/show_bug.cgi?id=155782\n // However, shim css custom properties are only supported with ShadyDOM enabled,\n // so fall back on native if we do not detect ShadyDOM\n // Edge 15: custom properties used in ::before and ::after will also be used in the parent element\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12414257/\n nativeCssVariables_ = nativeShadow || Boolean(!navigator.userAgent.match(/AppleWebKit\\/601|Edge\\/15/) &&\n window.CSS && CSS.supports && CSS.supports('box-shadow', '0 0 0 var(--foo)'));\n }\n}\n\nif (window.ShadyCSS && window.ShadyCSS.nativeCss !== undefined) {\n nativeCssVariables_ = window.ShadyCSS.nativeCss;\n} else if (window.ShadyCSS) {\n calcCssVariables(window.ShadyCSS);\n // reset window variable to let ShadyCSS API take its place\n window.ShadyCSS = undefined;\n} else {\n calcCssVariables(window['WebComponents'] && window['WebComponents']['flags']);\n}\n\n// Hack for type error under new type inference which doesn't like that\n// nativeCssVariables is updated in a function and assigns the type\n// `function(): ?` instead of `boolean`.\nexport const nativeCssVariables = /** @type {boolean} */(nativeCssVariables_);\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nexport const VAR_ASSIGN = /(?:^|[;\\s{]\\s*)(--[\\w-]*?)\\s*:\\s*(?:((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^)]*?\\)|[^};{])+)|\\{([^}]*)\\}(?:(?=[;\\s}])|$))/gi;\nexport const MIXIN_MATCH = /(?:^|\\W+)@apply\\s*\\(?([^);\\n]*)\\)?/gi;\nexport const VAR_CONSUMED = /(--[\\w-]+)\\s*([:,;)]|$)/gi;\nexport const ANIMATION_MATCH = /(animation\\s*:)|(animation-name\\s*:)/;\nexport const MEDIA_MATCH = /@media\\s(.*)/;\nexport const IS_VAR = /^--/;\nexport const BRACKETED = /\\{[^}]*\\}/g;\nexport const HOST_PREFIX = '(?:^|[^.#[:])';\nexport const HOST_SUFFIX = '($|[.:[\\\\s>+~])';\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/** @type {!Set<string>} */\nconst styleTextSet = new Set();\n\nexport const scopingAttribute = 'shady-unscoped';\n\n/**\n * Add a specifically-marked style to the document directly, and only one copy of that style.\n *\n * @param {!HTMLStyleElement} style\n * @return {undefined}\n */\nexport function processUnscopedStyle(style) {\n const text = style.textContent;\n if (!styleTextSet.has(text)) {\n styleTextSet.add(text);\n const newStyle = style.cloneNode(true);\n document.head.appendChild(newStyle);\n }\n}\n\n/**\n * Check if a style is supposed to be unscoped\n * @param {!HTMLStyleElement} style\n * @return {boolean} true if the style has the unscoping attribute\n */\nexport function isUnscopedStyle(style) {\n return style.hasAttribute(scopingAttribute);\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {nativeShadow, nativeCssVariables} from './style-settings.js';\nimport {parse, stringify, types, StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\nimport {MEDIA_MATCH} from './common-regex.js';\nimport {processUnscopedStyle, isUnscopedStyle} from './unscoped-style-handler.js';\n\n/**\n * @param {string|StyleNode} rules\n * @param {function(StyleNode)=} callback\n * @return {string}\n */\nexport function toCssText (rules, callback) {\n if (!rules) {\n return '';\n }\n if (typeof rules === 'string') {\n rules = parse(rules);\n }\n if (callback) {\n forEachRule(rules, callback);\n }\n return stringify(rules, nativeCssVariables);\n}\n\n/**\n * @param {HTMLStyleElement} style\n * @return {StyleNode}\n */\nexport function rulesForStyle(style) {\n if (!style['__cssRules'] && style.textContent) {\n style['__cssRules'] = parse(style.textContent);\n }\n return style['__cssRules'] || null;\n}\n\n// Tests if a rule is a keyframes selector, which looks almost exactly\n// like a normal selector but is not (it has nothing to do with scoping\n// for example).\n/**\n * @param {StyleNode} rule\n * @return {boolean}\n */\nexport function isKeyframesSelector(rule) {\n return Boolean(rule['parent']) &&\n rule['parent']['type'] === types.KEYFRAMES_RULE;\n}\n\n/**\n * @param {StyleNode} node\n * @param {Function=} styleRuleCallback\n * @param {Function=} keyframesRuleCallback\n * @param {boolean=} onlyActiveRules\n */\nexport function forEachRule(node, styleRuleCallback, keyframesRuleCallback, onlyActiveRules) {\n if (!node) {\n return;\n }\n let skipRules = false;\n let type = node['type'];\n if (onlyActiveRules) {\n if (type === types.MEDIA_RULE) {\n let matchMedia = node['selector'].match(MEDIA_MATCH);\n if (matchMedia) {\n // if rule is a non matching @media rule, skip subrules\n if (!window.matchMedia(matchMedia[1]).matches) {\n skipRules = true;\n }\n }\n }\n }\n if (type === types.STYLE_RULE) {\n styleRuleCallback(node);\n } else if (keyframesRuleCallback &&\n type === types.KEYFRAMES_RULE) {\n keyframesRuleCallback(node);\n } else if (type === types.MIXIN_RULE) {\n skipRules = true;\n }\n let r$ = node['rules'];\n if (r$ && !skipRules) {\n for (let i=0, l=r$.length, r; (i<l) && (r=r$[i]); i++) {\n forEachRule(r, styleRuleCallback, keyframesRuleCallback, onlyActiveRules);\n }\n }\n}\n\n// add a string of cssText to the document.\n/**\n * @param {string} cssText\n * @param {string} moniker\n * @param {Node} target\n * @param {Node} contextNode\n * @return {HTMLStyleElement}\n */\nexport function applyCss(cssText, moniker, target, contextNode) {\n let style = createScopeStyle(cssText, moniker);\n applyStyle(style, target, contextNode);\n return style;\n}\n\n/**\n * @param {string} cssText\n * @param {string} moniker\n * @return {HTMLStyleElement}\n */\nexport function createScopeStyle(cssText, moniker) {\n let style = /** @type {HTMLStyleElement} */(document.createElement('style'));\n if (moniker) {\n style.setAttribute('scope', moniker);\n }\n style.textContent = cssText;\n return style;\n}\n\n/**\n * Track the position of the last added style for placing placeholders\n * @type {Node}\n */\nlet lastHeadApplyNode = null;\n\n// insert a comment node as a styling position placeholder.\n/**\n * @param {string} moniker\n * @return {!Comment}\n */\nexport function applyStylePlaceHolder(moniker) {\n let placeHolder = document.createComment(' Shady DOM styles for ' +\n moniker + ' ');\n let after = lastHeadApplyNode ?\n lastHeadApplyNode['nextSibling'] : null;\n let scope = document.head;\n scope.insertBefore(placeHolder, after || scope.firstChild);\n lastHeadApplyNode = placeHolder;\n return placeHolder;\n}\n\n/**\n * @param {HTMLStyleElement} style\n * @param {?Node} target\n * @param {?Node} contextNode\n */\nexport function applyStyle(style, target, contextNode) {\n target = target || document.head;\n let after = (contextNode && contextNode.nextSibling) ||\n target.firstChild;\n target.insertBefore(style, after);\n if (!lastHeadApplyNode) {\n lastHeadApplyNode = style;\n } else {\n // only update lastHeadApplyNode if the new style is inserted after the old lastHeadApplyNode\n let position = style.compareDocumentPosition(lastHeadApplyNode);\n if (position === Node.DOCUMENT_POSITION_PRECEDING) {\n lastHeadApplyNode = style;\n }\n }\n}\n\n/**\n * @param {string} buildType\n * @return {boolean}\n */\nexport function isTargetedBuild(buildType) {\n return nativeShadow ? buildType === 'shadow' : buildType === 'shady';\n}\n\n/**\n * @param {Element} element\n * @return {?string}\n */\nexport function getCssBuildType(element) {\n return element.getAttribute('css-build');\n}\n\n/**\n * Walk from text[start] matching parens and\n * returns position of the outer end paren\n * @param {string} text\n * @param {number} start\n * @return {number}\n */\nfunction findMatchingParen(text, start) {\n let level = 0;\n for (let i=start, l=text.length; i < l; i++) {\n if (text[i] === '(') {\n level++;\n } else if (text[i] === ')') {\n if (--level === 0) {\n return i;\n }\n }\n }\n return -1;\n}\n\n/**\n * @param {string} str\n * @param {function(string, string, string, string)} callback\n */\nexport function processVariableAndFallback(str, callback) {\n // find 'var('\n let start = str.indexOf('var(');\n if (start === -1) {\n // no var?, everything is prefix\n return callback(str, '', '', '');\n }\n //${prefix}var(${inner})${suffix}\n let end = findMatchingParen(str, start + 3);\n let inner = str.substring(start + 4, end);\n let prefix = str.substring(0, start);\n // suffix may have other variables\n let suffix = processVariableAndFallback(str.substring(end + 1), callback);\n let comma = inner.indexOf(',');\n // value and fallback args should be trimmed to match in property lookup\n if (comma === -1) {\n // variable, no fallback\n return callback(prefix, inner.trim(), '', suffix);\n }\n // var(${value},${fallback})\n let value = inner.substring(0, comma).trim();\n let fallback = inner.substring(comma + 1).trim();\n return callback(prefix, value, fallback, suffix);\n}\n\n/**\n * @param {Element} element\n * @param {string} value\n */\nexport function setElementClassRaw(element, value) {\n // use native setAttribute provided by ShadyDOM when setAttribute is patched\n if (nativeShadow) {\n element.setAttribute('class', value);\n } else {\n window['ShadyDOM']['nativeMethods']['setAttribute'].call(element, 'class', value);\n }\n}\n\n/**\n * @param {Element | {is: string, extends: string}} element\n * @return {{is: string, typeExtension: string}}\n */\nexport function getIsExtends(element) {\n let localName = element['localName'];\n let is = '', typeExtension = '';\n /*\n NOTE: technically, this can be wrong for certain svg elements\n with `-` in the name like `<font-face>`\n */\n if (localName) {\n if (localName.indexOf('-') > -1) {\n is = localName;\n } else {\n typeExtension = localName;\n is = (element.getAttribute && element.getAttribute('is')) || '';\n }\n } else {\n is = /** @type {?} */(element).is;\n typeExtension = /** @type {?} */(element).extends;\n }\n return {is, typeExtension};\n}\n\n/**\n * @param {Element|DocumentFragment} element\n * @return {string}\n */\nexport function gatherStyleText(element) {\n /** @type {!Array<string>} */\n const styleTextParts = [];\n const styles = /** @type {!NodeList<!HTMLStyleElement>} */(element.querySelectorAll('style'));\n for (let i = 0; i < styles.length; i++) {\n const style = styles[i];\n if (isUnscopedStyle(style)) {\n if (!nativeShadow) {\n processUnscopedStyle(style);\n style.parentNode.removeChild(style);\n }\n } else {\n styleTextParts.push(style.textContent);\n style.parentNode.removeChild(style);\n }\n }\n return styleTextParts.join('').trim();\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\nimport * as StyleUtil from './style-util.js';\nimport {nativeShadow} from './style-settings.js';\n\n/* Transforms ShadowDOM styling into ShadyDOM styling\n\n* scoping:\n\n * elements in scope get scoping selector class=\"x-foo-scope\"\n * selectors re-written as follows:\n\n div button -> div.x-foo-scope button.x-foo-scope\n\n* :host -> scopeName\n\n* :host(...) -> scopeName...\n\n* ::slotted(...) -> scopeName > ...\n\n* ...:dir(ltr|rtl) -> [dir=\"ltr|rtl\"] ..., ...[dir=\"ltr|rtl\"]\n\n* :host(:dir[rtl]) -> scopeName:dir(rtl) -> [dir=\"rtl\"] scopeName, scopeName[dir=\"rtl\"]\n\n*/\nconst SCOPE_NAME = 'style-scope';\n\nclass StyleTransformer {\n get SCOPE_NAME() {\n return SCOPE_NAME;\n }\n /**\n * Given a node and scope name, add a scoping class to each node\n * in the tree. This facilitates transforming css into scoped rules.\n * @param {?} node\n * @param {?} scope\n * @param {?=} shouldRemoveScope\n */\n dom(node, scope, shouldRemoveScope) {\n // one time optimization to skip scoping...\n if (node['__styleScoped']) {\n node['__styleScoped'] = null;\n } else {\n this._transformDom(node, scope || '', shouldRemoveScope);\n }\n }\n\n _transformDom(node, selector, shouldRemoveScope) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n this.element(node, selector, shouldRemoveScope);\n }\n let c$ = (node.localName === 'template') ?\n (node.content || node._content).childNodes :\n node.children || node.childNodes;\n if (c$) {\n for (let i=0; i<c$.length; i++) {\n this._transformDom(c$[i], selector, shouldRemoveScope);\n }\n }\n }\n /**\n * @param {?} element\n * @param {?} scope\n * @param {?=} shouldRemoveScope\n */\n element(element, scope, shouldRemoveScope) {\n // note: if using classes, we add both the general 'style-scope' class\n // as well as the specific scope. This enables easy filtering of all\n // `style-scope` elements\n if (scope) {\n // note: svg on IE does not have classList so fallback to class\n if (element.classList) {\n if (shouldRemoveScope) {\n element.classList.remove(SCOPE_NAME);\n element.classList.remove(scope);\n } else {\n element.classList.add(SCOPE_NAME);\n element.classList.add(scope);\n }\n } else if (element.getAttribute) {\n let c = element.getAttribute(CLASS);\n if (shouldRemoveScope) {\n if (c) {\n let newValue = c.replace(SCOPE_NAME, '').replace(scope, '');\n StyleUtil.setElementClassRaw(element, newValue);\n }\n } else {\n let newValue = (c ? c + ' ' : '') + SCOPE_NAME + ' ' + scope;\n StyleUtil.setElementClassRaw(element, newValue);\n }\n }\n }\n }\n\n /**\n * @param {?} element\n * @param {?} styleRules\n * @param {?=} callback\n */\n elementStyles(element, styleRules, callback) {\n let cssBuildType = element['__cssBuild'];\n // no need to shim selectors if settings.useNativeShadow, also\n // a shady css build will already have transformed selectors\n // NOTE: This method may be called as part of static or property shimming.\n // When there is a targeted build it will not be called for static shimming,\n // but when the property shim is used it is called and should opt out of\n // static shimming work when a proper build exists.\n let cssText = '';\n if (nativeShadow || cssBuildType === 'shady') {\n cssText = StyleUtil.toCssText(styleRules, callback);\n } else {\n let {is, typeExtension} = StyleUtil.getIsExtends(element);\n cssText = this.css(styleRules, is, typeExtension, callback) + '\\n\\n';\n }\n return cssText.trim();\n }\n\n // Given a string of cssText and a scoping string (scope), returns\n // a string of scoped css where each selector is transformed to include\n // a class created from the scope. ShadowDOM selectors are also transformed\n // (e.g. :host) to use the scoping selector.\n css(rules, scope, ext, callback) {\n let hostScope = this._calcHostScope(scope, ext);\n scope = this._calcElementScope(scope);\n let self = this;\n return StyleUtil.toCssText(rules, function(/** StyleNode */rule) {\n if (!rule.isScoped) {\n self.rule(rule, scope, hostScope);\n rule.isScoped = true;\n }\n if (callback) {\n callback(rule, scope, hostScope);\n }\n });\n }\n\n _calcElementScope(scope) {\n if (scope) {\n return CSS_CLASS_PREFIX + scope;\n } else {\n return '';\n }\n }\n\n _calcHostScope(scope, ext) {\n return ext ? `[is=${scope}]` : scope;\n }\n\n rule(rule, scope, hostScope) {\n this._transformRule(rule, this._transformComplexSelector,\n scope, hostScope);\n }\n\n /**\n * transforms a css rule to a scoped rule.\n *\n * @param {StyleNode} rule\n * @param {Function} transformer\n * @param {string=} scope\n * @param {string=} hostScope\n */\n _transformRule(rule, transformer, scope, hostScope) {\n // NOTE: save transformedSelector for subsequent matching of elements\n // against selectors (e.g. when calculating style properties)\n rule['selector'] = rule.transformedSelector =\n this._transformRuleCss(rule, transformer, scope, hostScope);\n }\n\n /**\n * @param {StyleNode} rule\n * @param {Function} transformer\n * @param {string=} scope\n * @param {string=} hostScope\n */\n _transformRuleCss(rule, transformer, scope, hostScope) {\n let p$ = rule['selector'].split(COMPLEX_SELECTOR_SEP);\n // we want to skip transformation of rules that appear in keyframes,\n // because they are keyframe selectors, not element selectors.\n if (!StyleUtil.isKeyframesSelector(rule)) {\n for (let i=0, l=p$.length, p; (i<l) && (p=p$[i]); i++) {\n p$[i] = transformer.call(this, p, scope, hostScope);\n }\n }\n return p$.join(COMPLEX_SELECTOR_SEP);\n }\n\n /**\n * @param {string} selector\n * @return {string}\n */\n _twiddleNthPlus(selector) {\n return selector.replace(NTH, (m, type, inside) => {\n if (inside.indexOf('+') > -1) {\n inside = inside.replace(/\\+/g, '___');\n } else if (inside.indexOf('___') > -1) {\n inside = inside.replace(/___/g, '+');\n }\n return `:${type}(${inside})`;\n });\n }\n\n/**\n * @param {string} selector\n * @param {string} scope\n * @param {string=} hostScope\n */\n _transformComplexSelector(selector, scope, hostScope) {\n let stop = false;\n selector = selector.trim();\n // Remove spaces inside of selectors like `:nth-of-type` because it confuses SIMPLE_SELECTOR_SEP\n let isNth = NTH.test(selector);\n if (isNth) {\n selector = selector.replace(NTH, (m, type, inner) => `:${type}(${inner.replace(/\\s/g, '')})`)\n selector = this._twiddleNthPlus(selector);\n }\n selector = selector.replace(SLOTTED_START, `${HOST} $1`);\n selector = selector.replace(SIMPLE_SELECTOR_SEP, (m, c, s) => {\n if (!stop) {\n let info = this._transformCompoundSelector(s, c, scope, hostScope);\n stop = stop || info.stop;\n c = info.combinator;\n s = info.value;\n }\n return c + s;\n });\n if (isNth) {\n selector = this._twiddleNthPlus(selector);\n }\n return selector;\n }\n\n _transformCompoundSelector(selector, combinator, scope, hostScope) {\n // replace :host with host scoping class\n let slottedIndex = selector.indexOf(SLOTTED);\n if (selector.indexOf(HOST) >= 0) {\n selector = this._transformHostSelector(selector, hostScope);\n // replace other selectors with scoping class\n } else if (slottedIndex !== 0) {\n selector = scope ? this._transformSimpleSelector(selector, scope) :\n selector;\n }\n // mark ::slotted() scope jump to replace with descendant selector + arg\n // also ignore left-side combinator\n let slotted = false;\n if (slottedIndex >= 0) {\n combinator = '';\n slotted = true;\n }\n // process scope jumping selectors up to the scope jump and then stop\n let stop;\n if (slotted) {\n stop = true;\n if (slotted) {\n // .zonk ::slotted(.foo) -> .zonk.scope > .foo\n selector = selector.replace(SLOTTED_PAREN, (m, paren) => ` > ${paren}`);\n }\n }\n selector = selector.replace(DIR_PAREN, (m, before, dir) =>\n `[dir=\"${dir}\"] ${before}, ${before}[dir=\"${dir}\"]`);\n return {value: selector, combinator, stop};\n }\n\n _transformSimpleSelector(selector, scope) {\n let p$ = selector.split(PSEUDO_PREFIX);\n p$[0] += scope;\n return p$.join(PSEUDO_PREFIX);\n }\n\n // :host(...) -> scopeName...\n _transformHostSelector(selector, hostScope) {\n let m = selector.match(HOST_PAREN);\n let paren = m && m[2].trim() || '';\n if (paren) {\n if (!paren[0].match(SIMPLE_SELECTOR_PREFIX)) {\n // paren starts with a type selector\n let typeSelector = paren.split(SIMPLE_SELECTOR_PREFIX)[0];\n // if the type selector is our hostScope then avoid pre-pending it\n if (typeSelector === hostScope) {\n return paren;\n // otherwise, this selector should not match in this scope so\n // output a bogus selector.\n } else {\n return SELECTOR_NO_MATCH;\n }\n } else {\n // make sure to do a replace here to catch selectors like:\n // `:host(.foo)::before`\n return selector.replace(HOST_PAREN, function(m, host, paren) {\n return hostScope + paren;\n });\n }\n // if no paren, do a straight :host replacement.\n // TODO(sorvell): this should not strictly be necessary but\n // it's needed to maintain support for `:host[foo]` type selectors\n // which have been improperly used under Shady DOM. This should be\n // deprecated.\n } else {\n return selector.replace(HOST, hostScope);\n }\n }\n\n /**\n * @param {StyleNode} rule\n */\n documentRule(rule) {\n // reset selector in case this is redone.\n rule['selector'] = rule['parsedSelector'];\n this.normalizeRootSelector(rule);\n this._transformRule(rule, this._transformDocumentSelector);\n }\n\n /**\n * @param {StyleNode} rule\n */\n normalizeRootSelector(rule) {\n if (rule['selector'] === ROOT) {\n rule['selector'] = 'html';\n }\n }\n\n/**\n * @param {string} selector\n */\n _transformDocumentSelector(selector) {\n return selector.match(SLOTTED) ?\n this._transformComplexSelector(selector, SCOPE_DOC_SELECTOR) :\n this._transformSimpleSelector(selector.trim(), SCOPE_DOC_SELECTOR);\n }\n}\n\nlet NTH = /:(nth[-\\w]+)\\(([^)]+)\\)/;\nlet SCOPE_DOC_SELECTOR = `:not(.${SCOPE_NAME})`;\nlet COMPLEX_SELECTOR_SEP = ',';\nlet SIMPLE_SELECTOR_SEP = /(^|[\\s>+~]+)((?:\\[.+?\\]|[^\\s>+~=[])+)/g;\nlet SIMPLE_SELECTOR_PREFIX = /[[.:#*]/;\nlet HOST = ':host';\nlet ROOT = ':root';\nlet SLOTTED = '::slotted';\nlet SLOTTED_START = new RegExp(`^(${SLOTTED})`);\n// NOTE: this supports 1 nested () pair for things like\n// :host(:not([selected]), more general support requires\n// parsing which seems like overkill\nlet HOST_PAREN = /(:host)(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))/;\n// similar to HOST_PAREN\nlet SLOTTED_PAREN = /(?:::slotted)(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))/;\nlet DIR_PAREN = /(.*):dir\\((?:(ltr|rtl))\\)/;\nlet CSS_CLASS_PREFIX = '.';\nlet PSEUDO_PREFIX = ':';\nlet CLASS = 'class';\nlet SELECTOR_NO_MATCH = 'should_not_match';\n\nexport default new StyleTransformer()\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\n\n/** @const {string} */\nconst infoKey = '__styleInfo';\n\nexport default class StyleInfo {\n /**\n * @param {Element} node\n * @return {StyleInfo}\n */\n static get(node) {\n if (node) {\n return node[infoKey];\n } else {\n return null;\n }\n }\n /**\n * @param {!Element} node\n * @param {StyleInfo} styleInfo\n * @return {StyleInfo}\n */\n static set(node, styleInfo) {\n node[infoKey] = styleInfo;\n return styleInfo;\n }\n /**\n * @param {StyleNode} ast\n * @param {Node=} placeholder\n * @param {Array<string>=} ownStylePropertyNames\n * @param {string=} elementName\n * @param {string=} typeExtension\n * @param {string=} cssBuild\n */\n constructor(ast, placeholder, ownStylePropertyNames, elementName, typeExtension, cssBuild) {\n /** @type {StyleNode} */\n this.styleRules = ast || null;\n /** @type {Node} */\n this.placeholder = placeholder || null;\n /** @type {!Array<string>} */\n this.ownStylePropertyNames = ownStylePropertyNames || [];\n /** @type {Array<Object>} */\n this.overrideStyleProperties = null;\n /** @type {string} */\n this.elementName = elementName || '';\n /** @type {string} */\n this.cssBuild = cssBuild || '';\n /** @type {string} */\n this.typeExtension = typeExtension || '';\n /** @type {Object<string, string>} */\n this.styleProperties = null;\n /** @type {?string} */\n this.scopeSelector = null;\n /** @type {HTMLStyleElement} */\n this.customStyle = null;\n }\n _getStyleRules() {\n return this.styleRules;\n }\n}\n\nStyleInfo.prototype['_getStyleRules'] = StyleInfo.prototype._getStyleRules;","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {removeCustomPropAssignment, StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\nimport {nativeShadow} from './style-settings.js';\nimport StyleTransformer from './style-transformer.js';\nimport * as StyleUtil from './style-util.js';\nimport * as RX from './common-regex.js';\nimport StyleInfo from './style-info.js';\n\n// TODO: dedupe with shady\n/**\n * @param {string} selector\n * @return {boolean}\n * @this {Element}\n */\nconst matchesSelector = function(selector) {\n const method = this.matches || this.matchesSelector ||\n this.mozMatchesSelector || this.msMatchesSelector ||\n this.oMatchesSelector || this.webkitMatchesSelector;\n return method && method.call(this, selector);\n};\n\nconst IS_IE = navigator.userAgent.match('Trident');\n\nconst XSCOPE_NAME = 'x-scope';\n\nclass StyleProperties {\n get XSCOPE_NAME() {\n return XSCOPE_NAME;\n }\n/**\n * decorates styles with rule info and returns an array of used style property names\n *\n * @param {StyleNode} rules\n * @return {Array<string>}\n */\n decorateStyles(rules) {\n let self = this, props = {}, keyframes = [], ruleIndex = 0;\n StyleUtil.forEachRule(rules, function(rule) {\n self.decorateRule(rule);\n // mark in-order position of ast rule in styles block, used for cache key\n rule.index = ruleIndex++;\n self.collectPropertiesInCssText(rule.propertyInfo.cssText, props);\n }, function onKeyframesRule(rule) {\n keyframes.push(rule);\n });\n // Cache all found keyframes rules for later reference:\n rules._keyframes = keyframes;\n // return this list of property names *consumes* in these styles.\n let names = [];\n for (let i in props) {\n names.push(i);\n }\n return names;\n }\n\n // decorate a single rule with property info\n decorateRule(rule) {\n if (rule.propertyInfo) {\n return rule.propertyInfo;\n }\n let info = {}, properties = {};\n let hasProperties = this.collectProperties(rule, properties);\n if (hasProperties) {\n info.properties = properties;\n // TODO(sorvell): workaround parser seeing mixins as additional rules\n rule['rules'] = null;\n }\n info.cssText = this.collectCssText(rule);\n rule.propertyInfo = info;\n return info;\n }\n\n // collects the custom properties from a rule's cssText\n collectProperties(rule, properties) {\n let info = rule.propertyInfo;\n if (info) {\n if (info.properties) {\n Object.assign(properties, info.properties);\n return true;\n }\n } else {\n let m, rx = RX.VAR_ASSIGN;\n let cssText = rule['parsedCssText'];\n let value;\n let any;\n while ((m = rx.exec(cssText))) {\n // note: group 2 is var, 3 is mixin\n value = (m[2] || m[3]).trim();\n // value of 'inherit' or 'unset' is equivalent to not setting the property here\n if (value !== 'inherit' || value !== 'unset') {\n properties[m[1].trim()] = value;\n }\n any = true;\n }\n return any;\n }\n\n }\n\n // returns cssText of properties that consume variables/mixins\n collectCssText(rule) {\n return this.collectConsumingCssText(rule['parsedCssText']);\n }\n\n // NOTE: we support consumption inside mixin assignment\n // but not production, so strip out {...}\n collectConsumingCssText(cssText) {\n return cssText.replace(RX.BRACKETED, '')\n .replace(RX.VAR_ASSIGN, '');\n }\n\n collectPropertiesInCssText(cssText, props) {\n let m;\n while ((m = RX.VAR_CONSUMED.exec(cssText))) {\n let name = m[1];\n // This regex catches all variable names, and following non-whitespace char\n // If next char is not ':', then variable is a consumer\n if (m[2] !== ':') {\n props[name] = true;\n }\n }\n }\n\n // turns custom properties into realized values.\n reify(props) {\n // big perf optimization here: reify only *own* properties\n // since this object has __proto__ of the element's scope properties\n let names = Object.getOwnPropertyNames(props);\n for (let i=0, n; i < names.length; i++) {\n n = names[i];\n props[n] = this.valueForProperty(props[n], props);\n }\n }\n\n // given a property value, returns the reified value\n // a property value may be:\n // (1) a literal value like: red or 5px;\n // (2) a variable value like: var(--a), var(--a, red), or var(--a, --b) or\n // var(--a, var(--b));\n // (3) a literal mixin value like { properties }. Each of these properties\n // can have values that are: (a) literal, (b) variables, (c) @apply mixins.\n valueForProperty(property, props) {\n // case (1) default\n // case (3) defines a mixin and we have to reify the internals\n if (property) {\n if (property.indexOf(';') >=0) {\n property = this.valueForProperties(property, props);\n } else {\n // case (2) variable\n let self = this;\n let fn = function(prefix, value, fallback, suffix) {\n if (!value) {\n return prefix + suffix;\n }\n let propertyValue = self.valueForProperty(props[value], props);\n // if value is \"initial\", then the variable should be treated as unset\n if (!propertyValue || propertyValue === 'initial') {\n // fallback may be --a or var(--a) or literal\n propertyValue = self.valueForProperty(props[fallback] || fallback, props) ||\n fallback;\n } else if (propertyValue === 'apply-shim-inherit') {\n // CSS build will replace `inherit` with `apply-shim-inherit`\n // for use with native css variables.\n // Since we have full control, we can use `inherit` directly.\n propertyValue = 'inherit';\n }\n return prefix + (propertyValue || '') + suffix;\n };\n property = StyleUtil.processVariableAndFallback(property, fn);\n }\n }\n return property && property.trim() || '';\n }\n\n // note: we do not yet support mixin within mixin\n valueForProperties(property, props) {\n let parts = property.split(';');\n for (let i=0, p, m; i<parts.length; i++) {\n if ((p = parts[i])) {\n RX.MIXIN_MATCH.lastIndex = 0;\n m = RX.MIXIN_MATCH.exec(p);\n if (m) {\n p = this.valueForProperty(props[m[1]], props);\n } else {\n let colon = p.indexOf(':');\n if (colon !== -1) {\n let pp = p.substring(colon);\n pp = pp.trim();\n pp = this.valueForProperty(pp, props) || pp;\n p = p.substring(0, colon) + pp;\n }\n }\n parts[i] = (p && p.lastIndexOf(';') === p.length - 1) ?\n // strip trailing ;\n p.slice(0, -1) :\n p || '';\n }\n }\n return parts.join(';');\n }\n\n applyProperties(rule, props) {\n let output = '';\n // dynamically added sheets may not be decorated so ensure they are.\n if (!rule.propertyInfo) {\n this.decorateRule(rule);\n }\n if (rule.propertyInfo.cssText) {\n output = this.valueForProperties(rule.propertyInfo.cssText, props);\n }\n rule['cssText'] = output;\n }\n\n // Apply keyframe transformations to the cssText of a given rule. The\n // keyframeTransforms object is a map of keyframe names to transformer\n // functions which take in cssText and spit out transformed cssText.\n applyKeyframeTransforms(rule, keyframeTransforms) {\n let input = rule['cssText'];\n let output = rule['cssText'];\n if (rule.hasAnimations == null) {\n // Cache whether or not the rule has any animations to begin with:\n rule.hasAnimations = RX.ANIMATION_MATCH.test(input);\n }\n // If there are no animations referenced, we can skip transforms:\n if (rule.hasAnimations) {\n let transform;\n // If we haven't transformed this rule before, we iterate over all\n // transforms:\n if (rule.keyframeNamesToTransform == null) {\n rule.keyframeNamesToTransform = [];\n for (let keyframe in keyframeTransforms) {\n transform = keyframeTransforms[keyframe];\n output = transform(input);\n // If the transform actually changed the CSS text, we cache the\n // transform name for future use:\n if (input !== output) {\n input = output;\n rule.keyframeNamesToTransform.push(keyframe);\n }\n }\n } else {\n // If we already have a list of keyframe names that apply to this\n // rule, we apply only those keyframe name transforms:\n for (let i = 0; i < rule.keyframeNamesToTransform.length; ++i) {\n transform = keyframeTransforms[rule.keyframeNamesToTransform[i]];\n input = transform(input);\n }\n output = input;\n }\n }\n rule['cssText'] = output;\n }\n\n // Test if the rules in these styles matches the given `element` and if so,\n // collect any custom properties into `props`.\n /**\n * @param {StyleNode} rules\n * @param {Element} element\n */\n propertyDataFromStyles(rules, element) {\n let props = {}, self = this;\n // generates a unique key for these matches\n let o = [];\n // note: active rules excludes non-matching @media rules\n StyleUtil.forEachRule(rules, function(rule) {\n // TODO(sorvell): we could trim the set of rules at declaration\n // time to only include ones that have properties\n if (!rule.propertyInfo) {\n self.decorateRule(rule);\n }\n // match element against transformedSelector: selector may contain\n // unwanted uniquification and parsedSelector does not directly match\n // for :host selectors.\n let selectorToMatch = rule.transformedSelector || rule['parsedSelector'];\n if (element && rule.propertyInfo.properties && selectorToMatch) {\n if (matchesSelector.call(element, selectorToMatch)) {\n self.collectProperties(rule, props);\n // produce numeric key for these matches for lookup\n addToBitMask(rule.index, o);\n }\n }\n }, null, true);\n return {properties: props, key: o};\n }\n\n /**\n * @param {Element} scope\n * @param {StyleNode} rule\n * @param {string|undefined} cssBuild\n * @param {function(Object)} callback\n */\n whenHostOrRootRule(scope, rule, cssBuild, callback) {\n if (!rule.propertyInfo) {\n this.decorateRule(rule);\n }\n if (!rule.propertyInfo.properties) {\n return;\n }\n let {is, typeExtension} = StyleUtil.getIsExtends(scope);\n let hostScope = is ?\n StyleTransformer._calcHostScope(is, typeExtension) :\n 'html';\n let parsedSelector = rule['parsedSelector'];\n let isRoot = (parsedSelector === ':host > *' || parsedSelector === 'html');\n let isHost = parsedSelector.indexOf(':host') === 0 && !isRoot;\n // build info is either in scope (when scope is an element) or in the style\n // when scope is the default scope; note: this allows default scope to have\n // mixed mode built and unbuilt styles.\n if (cssBuild === 'shady') {\n // :root -> x-foo > *.x-foo for elements and html for custom-style\n isRoot = parsedSelector === (hostScope + ' > *.' + hostScope) || parsedSelector.indexOf('html') !== -1;\n // :host -> x-foo for elements, but sub-rules have .x-foo in them\n isHost = !isRoot && parsedSelector.indexOf(hostScope) === 0;\n }\n if (cssBuild === 'shadow') {\n isRoot = parsedSelector === ':host > *' || parsedSelector === 'html';\n isHost = isHost && !isRoot;\n }\n if (!isRoot && !isHost) {\n return;\n }\n let selectorToMatch = hostScope;\n if (isHost) {\n // need to transform :host because `:host` does not work with `matches`\n if (!rule.transformedSelector) {\n // transform :host into a matchable selector\n rule.transformedSelector =\n StyleTransformer._transformRuleCss(\n rule,\n StyleTransformer._transformComplexSelector,\n StyleTransformer._calcElementScope(is),\n hostScope\n );\n }\n selectorToMatch = rule.transformedSelector || hostScope;\n }\n callback({\n selector: selectorToMatch,\n isHost: isHost,\n isRoot: isRoot\n });\n }\n/**\n * @param {Element} scope\n * @param {StyleNode} rules\n * @return {Object}\n */\n hostAndRootPropertiesForScope(scope, rules) {\n let hostProps = {}, rootProps = {}, self = this;\n // note: active rules excludes non-matching @media rules\n let cssBuild = rules && rules['__cssBuild'];\n StyleUtil.forEachRule(rules, function(rule) {\n // if scope is StyleDefaults, use _element for matchesSelector\n self.whenHostOrRootRule(scope, rule, cssBuild, function(info) {\n let element = scope._element || scope;\n if (matchesSelector.call(element, info.selector)) {\n if (info.isHost) {\n self.collectProperties(rule, hostProps);\n } else {\n self.collectProperties(rule, rootProps);\n }\n }\n });\n }, null, true);\n return {rootProps: rootProps, hostProps: hostProps};\n }\n\n /**\n * @param {Element} element\n * @param {Object} properties\n * @param {string} scopeSelector\n */\n transformStyles(element, properties, scopeSelector) {\n let self = this;\n let {is, typeExtension} = StyleUtil.getIsExtends(element);\n let hostSelector = StyleTransformer\n ._calcHostScope(is, typeExtension);\n let rxHostSelector = element.extends ?\n '\\\\' + hostSelector.slice(0, -1) + '\\\\]' :\n hostSelector;\n let hostRx = new RegExp(RX.HOST_PREFIX + rxHostSelector +\n RX.HOST_SUFFIX);\n let rules = StyleInfo.get(element).styleRules;\n let keyframeTransforms =\n this._elementKeyframeTransforms(element, rules, scopeSelector);\n return StyleTransformer.elementStyles(element, rules, function(rule) {\n self.applyProperties(rule, properties);\n if (!nativeShadow &&\n !StyleUtil.isKeyframesSelector(rule) &&\n rule['cssText']) {\n // NOTE: keyframe transforms only scope munge animation names, so it\n // is not necessary to apply them in ShadowDOM.\n self.applyKeyframeTransforms(rule, keyframeTransforms);\n self._scopeSelector(rule, hostRx, hostSelector, scopeSelector);\n }\n });\n }\n\n /**\n * @param {Element} element\n * @param {StyleNode} rules\n * @param {string} scopeSelector\n * @return {Object}\n */\n _elementKeyframeTransforms(element, rules, scopeSelector) {\n let keyframesRules = rules._keyframes;\n let keyframeTransforms = {};\n if (!nativeShadow && keyframesRules) {\n // For non-ShadowDOM, we transform all known keyframes rules in\n // advance for the current scope. This allows us to catch keyframes\n // rules that appear anywhere in the stylesheet:\n for (let i = 0, keyframesRule = keyframesRules[i];\n i < keyframesRules.length;\n keyframesRule = keyframesRules[++i]) {\n this._scopeKeyframes(keyframesRule, scopeSelector);\n keyframeTransforms[keyframesRule['keyframesName']] =\n this._keyframesRuleTransformer(keyframesRule);\n }\n }\n return keyframeTransforms;\n }\n\n // Generate a factory for transforming a chunk of CSS text to handle a\n // particular scoped keyframes rule.\n /**\n * @param {StyleNode} keyframesRule\n * @return {function(string):string}\n */\n _keyframesRuleTransformer(keyframesRule) {\n return function(cssText) {\n return cssText.replace(\n keyframesRule.keyframesNameRx,\n keyframesRule.transformedKeyframesName);\n };\n }\n\n/**\n * Transforms `@keyframes` names to be unique for the current host.\n * Example: @keyframes foo-anim -> @keyframes foo-anim-x-foo-0\n *\n * @param {StyleNode} rule\n * @param {string} scopeId\n */\n _scopeKeyframes(rule, scopeId) {\n // Animation names are of the form [\\w-], so ensure that the name regex does not partially apply\n // to similarly named keyframe names by checking for a word boundary at the beginning and\n // a non-word boundary or `-` at the end.\n rule.keyframesNameRx = new RegExp(`\\\\b${rule['keyframesName']}(?!\\\\B|-)`, 'g');\n rule.transformedKeyframesName = rule['keyframesName'] + '-' + scopeId;\n rule.transformedSelector = rule.transformedSelector || rule['selector'];\n rule['selector'] = rule.transformedSelector.replace(\n rule['keyframesName'], rule.transformedKeyframesName);\n }\n\n // Strategy: x scope shim a selector e.g. to scope `.x-foo-42` (via classes):\n // non-host selector: .a.x-foo -> .x-foo-42 .a.x-foo\n // host selector: x-foo.wide -> .x-foo-42.wide\n // note: we use only the scope class (.x-foo-42) and not the hostSelector\n // (x-foo) to scope :host rules; this helps make property host rules\n // have low specificity. They are overrideable by class selectors but,\n // unfortunately, not by type selectors (e.g. overriding via\n // `.special` is ok, but not by `x-foo`).\n /**\n * @param {StyleNode} rule\n * @param {RegExp} hostRx\n * @param {string} hostSelector\n * @param {string} scopeId\n */\n _scopeSelector(rule, hostRx, hostSelector, scopeId) {\n rule.transformedSelector = rule.transformedSelector || rule['selector'];\n let selector = rule.transformedSelector;\n let scope = '.' + scopeId;\n let parts = selector.split(',');\n for (let i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n parts[i] = p.match(hostRx) ?\n p.replace(hostSelector, scope) :\n scope + ' ' + p;\n }\n rule['selector'] = parts.join(',');\n }\n\n /**\n * @param {Element} element\n * @param {string} selector\n * @param {string} old\n */\n applyElementScopeSelector(element, selector, old) {\n let c = element.getAttribute('class') || '';\n let v = c;\n if (old) {\n v = c.replace(\n new RegExp('\\\\s*' + XSCOPE_NAME + '\\\\s*' + old + '\\\\s*', 'g'), ' ');\n }\n v += (v ? ' ' : '') + XSCOPE_NAME + ' ' + selector;\n if (c !== v) {\n StyleUtil.setElementClassRaw(element, v);\n }\n }\n\n /**\n * @param {HTMLElement} element\n * @param {Object} properties\n * @param {string} selector\n * @param {HTMLStyleElement} style\n * @return {HTMLStyleElement}\n */\n applyElementStyle(element, properties, selector, style) {\n // calculate cssText to apply\n let cssText = style ? style.textContent || '' :\n this.transformStyles(element, properties, selector);\n // if shady and we have a cached style that is not style, decrement\n let styleInfo = StyleInfo.get(element);\n let s = styleInfo.customStyle;\n if (s && !nativeShadow && (s !== style)) {\n s['_useCount']--;\n if (s['_useCount'] <= 0 && s.parentNode) {\n s.parentNode.removeChild(s);\n }\n }\n // apply styling always under native or if we generated style\n // or the cached style is not in document(!)\n if (nativeShadow) {\n // update existing style only under native\n if (styleInfo.customStyle) {\n styleInfo.customStyle.textContent = cssText;\n style = styleInfo.customStyle;\n // otherwise, if we have css to apply, do so\n } else if (cssText) {\n // apply css after the scope style of the element to help with\n // style precedence rules.\n style = StyleUtil.applyCss(cssText, selector, element.shadowRoot,\n styleInfo.placeholder);\n }\n } else {\n // shady and no cache hit\n if (!style) {\n // apply css after the scope style of the element to help with\n // style precedence rules.\n if (cssText) {\n style = StyleUtil.applyCss(cssText, selector, null,\n styleInfo.placeholder);\n }\n // shady and cache hit but not in document\n } else if (!style.parentNode) {\n if (IS_IE && cssText.indexOf('@media') > -1) {\n // @media rules may be stale in IE 10 and 11\n // refresh the text content of the style to revalidate them.\n style.textContent = cssText;\n }\n StyleUtil.applyStyle(style, null, styleInfo.placeholder);\n }\n }\n // ensure this style is our custom style and increment its use count.\n if (style) {\n style['_useCount'] = style['_useCount'] || 0;\n // increment use count if we changed styles\n if (styleInfo.customStyle != style) {\n style['_useCount']++;\n }\n styleInfo.customStyle = style;\n }\n return style;\n }\n\n /**\n * @param {Element} style\n * @param {Object} properties\n */\n applyCustomStyle(style, properties) {\n let rules = StyleUtil.rulesForStyle(/** @type {HTMLStyleElement} */(style));\n let self = this;\n style.textContent = StyleUtil.toCssText(rules, function(/** StyleNode */rule) {\n let css = rule['cssText'] = rule['parsedCssText'];\n if (rule.propertyInfo && rule.propertyInfo.cssText) {\n // remove property assignments\n // so next function isn't confused\n // NOTE: we have 3 categories of css:\n // (1) normal properties,\n // (2) custom property assignments (--foo: red;),\n // (3) custom property usage: border: var(--foo); @apply(--foo);\n // In elements, 1 and 3 are separated for efficiency; here they\n // are not and this makes this case unique.\n css = removeCustomPropAssignment(/** @type {string} */(css));\n // replace with reified properties, scenario is same as mixin\n rule['cssText'] = self.valueForProperties(css, properties);\n }\n });\n }\n}\n\n/**\n * @param {number} n\n * @param {Array<number>} bits\n */\nfunction addToBitMask(n, bits) {\n let o = parseInt(n / 32, 10);\n let v = 1 << (n % 32);\n bits[o] = (bits[o] || 0) | v;\n}\n\nexport default new StyleProperties();","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {applyStylePlaceHolder} from './style-util.js';\nimport {nativeShadow} from './style-settings.js';\n\n/** @type {Object<string, !Node>} */\nlet placeholderMap = {};\n\n/**\n * @const {CustomElementRegistry}\n */\nconst ce = window['customElements'];\nif (ce && !nativeShadow) {\n /**\n * @const {function(this:CustomElementRegistry, string,function(new:HTMLElement),{extends: string}=)}\n */\n const origDefine = ce['define'];\n /**\n * @param {string} name\n * @param {function(new:HTMLElement)} clazz\n * @param {{extends: string}=} options\n */\n const wrappedDefine = (name, clazz, options) => {\n placeholderMap[name] = applyStylePlaceHolder(name);\n origDefine.call(/** @type {!CustomElementRegistry} */(ce), name, clazz, options);\n };\n ce['define'] = wrappedDefine;\n}\n\nexport default placeholderMap;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n'use strict';\n\nexport default class StyleCache {\n constructor(typeMax = 100) {\n // map element name -> [{properties, styleElement, scopeSelector}]\n this.cache = {};\n this.typeMax = typeMax;\n }\n\n _validate(cacheEntry, properties, ownPropertyNames) {\n for (let idx = 0; idx < ownPropertyNames.length; idx++) {\n let pn = ownPropertyNames[idx];\n if (cacheEntry.properties[pn] !== properties[pn]) {\n return false;\n }\n }\n return true;\n }\n\n store(tagname, properties, styleElement, scopeSelector) {\n let list = this.cache[tagname] || [];\n list.push({properties, styleElement, scopeSelector});\n if (list.length > this.typeMax) {\n list.shift();\n }\n this.cache[tagname] = list;\n }\n\n fetch(tagname, properties, ownPropertyNames) {\n let list = this.cache[tagname];\n if (!list) {\n return;\n }\n // reverse list for most-recent lookups\n for (let idx = list.length - 1; idx >= 0; idx--) {\n let entry = list[idx];\n if (this._validate(entry, properties, ownPropertyNames)) {\n return entry;\n }\n }\n }\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {nativeShadow} from './style-settings.js';\nimport StyleTransformer from './style-transformer.js';\nimport {getIsExtends} from './style-util.js';\n\nexport let flush = function() {};\n\n/**\n * @param {HTMLElement} element\n * @return {!Array<string>}\n */\nfunction getClasses(element) {\n let classes = [];\n if (element.classList) {\n classes = Array.from(element.classList);\n } else if (element instanceof window['SVGElement'] && element.hasAttribute('class')) {\n classes = element.getAttribute('class').split(/\\s+/);\n }\n return classes;\n}\n\n/**\n * @param {HTMLElement} element\n * @return {string}\n */\nfunction getCurrentScope(element) {\n let classes = getClasses(element);\n let idx = classes.indexOf(StyleTransformer.SCOPE_NAME);\n if (idx > -1) {\n return classes[idx + 1];\n }\n return '';\n}\n\n/**\n * @param {Array<MutationRecord|null>|null} mxns\n */\nfunction handler(mxns) {\n for (let x=0; x < mxns.length; x++) {\n let mxn = mxns[x];\n if (mxn.target === document.documentElement ||\n mxn.target === document.head) {\n continue;\n }\n for (let i=0; i < mxn.addedNodes.length; i++) {\n let n = mxn.addedNodes[i];\n if (n.nodeType !== Node.ELEMENT_NODE) {\n continue;\n }\n n = /** @type {HTMLElement} */(n); // eslint-disable-line no-self-assign\n let root = n.getRootNode();\n let currentScope = getCurrentScope(n);\n // node was scoped, but now is in document\n if (currentScope && root === n.ownerDocument) {\n StyleTransformer.dom(n, currentScope, true);\n } else if (root.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n let newScope;\n let host = /** @type {ShadowRoot} */(root).host;\n // element may no longer be in a shadowroot\n if (!host) {\n continue;\n }\n newScope = getIsExtends(host).is;\n if (currentScope === newScope) {\n // make sure all the subtree elements are scoped correctly\n let unscoped = window['ShadyDOM']['nativeMethods']['querySelectorAll'].call(\n n, `:not(.${StyleTransformer.SCOPE_NAME})`);\n for (let j = 0; j < unscoped.length; j++) {\n StyleTransformer.element(unscoped[j], currentScope);\n }\n continue;\n }\n if (currentScope) {\n StyleTransformer.dom(n, currentScope, true);\n }\n StyleTransformer.dom(n, newScope);\n }\n }\n }\n}\n\nif (!nativeShadow) {\n let observer = new MutationObserver(handler);\n let start = (node) => {\n observer.observe(node, {childList: true, subtree: true});\n }\n let nativeCustomElements = (window['customElements'] &&\n !window['customElements']['polyfillWrapFlushCallback']);\n // need to start immediately with native custom elements\n // TODO(dfreedm): with polyfilled HTMLImports and native custom elements\n // excessive mutations may be observed; this can be optimized via cooperation\n // with the HTMLImports polyfill.\n if (nativeCustomElements) {\n start(document);\n } else {\n let delayedStart = () => {\n start(document.body);\n }\n // use polyfill timing if it's available\n if (window['HTMLImports']) {\n window['HTMLImports']['whenReady'](delayedStart);\n // otherwise push beyond native imports being ready\n // which requires RAF + readystate interactive.\n } else {\n requestAnimationFrame(function() {\n if (document.readyState === 'loading') {\n let listener = function() {\n delayedStart();\n document.removeEventListener('readystatechange', listener);\n }\n document.addEventListener('readystatechange', listener);\n } else {\n delayedStart();\n }\n });\n }\n }\n\n flush = function() {\n handler(observer.takeRecords());\n }\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/**\n * @const {!Object<string, !HTMLTemplateElement>}\n */\nconst templateMap = {};\nexport default templateMap;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\nimport templateMap from './template-map.js';\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\n\n/*\n * Utilities for handling invalidating apply-shim mixins for a given template.\n *\n * The invalidation strategy involves keeping track of the \"current\" version of a template's mixins, and updating that count when a mixin is invalidated.\n * The template\n */\n\n/** @const {string} */\nconst CURRENT_VERSION = '_applyShimCurrentVersion';\n\n/** @const {string} */\nconst NEXT_VERSION = '_applyShimNextVersion';\n\n/** @const {string} */\nconst VALIDATING_VERSION = '_applyShimValidatingVersion';\n\n/**\n * @const {Promise<void>}\n */\nconst promise = Promise.resolve();\n\n/**\n * @param {string} elementName\n */\nexport function invalidate(elementName){\n let template = templateMap[elementName];\n if (template) {\n invalidateTemplate(template);\n }\n}\n\n/**\n * This function can be called multiple times to mark a template invalid\n * and signal that the style inside must be regenerated.\n *\n * Use `startValidatingTemplate` to begin an asynchronous validation cycle.\n * During that cycle, call `templateIsValidating` to see if the template must\n * be revalidated\n * @param {HTMLTemplateElement} template\n */\nexport function invalidateTemplate(template) {\n // default the current version to 0\n template[CURRENT_VERSION] = template[CURRENT_VERSION] || 0;\n // ensure the \"validating for\" flag exists\n template[VALIDATING_VERSION] = template[VALIDATING_VERSION] || 0;\n // increment the next version\n template[NEXT_VERSION] = (template[NEXT_VERSION] || 0) + 1;\n}\n\n/**\n * @param {string} elementName\n * @return {boolean}\n */\nexport function isValid(elementName) {\n let template = templateMap[elementName];\n if (template) {\n return templateIsValid(template);\n }\n return true;\n}\n\n/**\n * @param {HTMLTemplateElement} template\n * @return {boolean}\n */\nexport function templateIsValid(template) {\n return template[CURRENT_VERSION] === template[NEXT_VERSION];\n}\n\n/**\n * @param {string} elementName\n * @return {boolean}\n */\nexport function isValidating(elementName) {\n let template = templateMap[elementName];\n if (template) {\n return templateIsValidating(template);\n }\n return false;\n}\n\n/**\n * Returns true if the template is currently invalid and `startValidating` has been called since the last invalidation.\n * If false, the template must be validated.\n * @param {HTMLTemplateElement} template\n * @return {boolean}\n */\nexport function templateIsValidating(template) {\n return !templateIsValid(template) && template[VALIDATING_VERSION] === template[NEXT_VERSION];\n}\n\n/**\n * the template is marked as `validating` for one microtask so that all instances\n * found in the tree crawl of `applyStyle` will update themselves,\n * but the template will only be updated once.\n * @param {string} elementName\n*/\nexport function startValidating(elementName) {\n let template = templateMap[elementName];\n startValidatingTemplate(template);\n}\n\n/**\n * Begin an asynchronous invalidation cycle.\n * This should be called after every validation of a template\n *\n * After one microtask, the template will be marked as valid until the next call to `invalidateTemplate`\n * @param {HTMLTemplateElement} template\n */\nexport function startValidatingTemplate(template) {\n // remember that the current \"next version\" is the reason for this validation cycle\n template[VALIDATING_VERSION] = template[NEXT_VERSION];\n // however, there only needs to be one async task to clear the counters\n if (!template._validating) {\n template._validating = true;\n promise.then(function() {\n // sync the current version to let future invalidations cause a refresh cycle\n template[CURRENT_VERSION] = template[NEXT_VERSION];\n template._validating = false;\n });\n }\n}\n\n/**\n * @return {boolean}\n */\nexport function elementsAreInvalid() {\n for (let elementName in templateMap) {\n let template = templateMap[elementName];\n if (!templateIsValid(template)) {\n return true;\n }\n }\n return false;\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/** @type {Promise<void>} */\nlet readyPromise = null;\n\n/** @type {?function(?function())} */\nlet whenReady = window['HTMLImports'] && window['HTMLImports']['whenReady'] || null;\n\n/** @type {function()} */\nlet resolveFn;\n\n/**\n * @param {?function()} callback\n */\nexport default function documentWait(callback) {\n requestAnimationFrame(function() {\n if (whenReady) {\n whenReady(callback)\n } else {\n if (!readyPromise) {\n readyPromise = new Promise((resolve) => {resolveFn = resolve});\n if (document.readyState === 'complete') {\n resolveFn();\n } else {\n document.addEventListener('readystatechange', () => {\n if (document.readyState === 'complete') {\n resolveFn();\n }\n });\n }\n }\n readyPromise.then(function(){ callback && callback(); });\n }\n });\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {parse, StyleNode} from './css-parse.js';\nimport {nativeShadow, nativeCssVariables} from './style-settings.js';\nimport StyleTransformer from './style-transformer.js';\nimport * as StyleUtil from './style-util.js';\nimport StyleProperties from './style-properties.js';\nimport placeholderMap from './style-placeholder.js';\nimport StyleInfo from './style-info.js';\nimport StyleCache from './style-cache.js';\nimport {flush as watcherFlush} from './document-watcher.js';\nimport templateMap from './template-map.js';\nimport * as ApplyShimUtils from './apply-shim-utils.js';\nimport documentWait from './document-wait.js';\nimport {updateNativeProperties, detectMixin} from './common-utils.js';\nimport {CustomStyleInterfaceInterface} from './custom-style-interface.js'; // eslint-disable-line no-unused-vars\n\n/**\n * @const {StyleCache}\n */\nconst styleCache = new StyleCache();\n\nexport default class ScopingShim {\n constructor() {\n this._scopeCounter = {};\n this._documentOwner = document.documentElement;\n let ast = new StyleNode();\n ast['rules'] = [];\n this._documentOwnerStyleInfo = StyleInfo.set(this._documentOwner, new StyleInfo(ast));\n this._elementsHaveApplied = false;\n this._applyShim = null;\n /** @type {?CustomStyleInterfaceInterface} */\n this._customStyleInterface = null;\n documentWait(() => {\n this._ensure();\n });\n }\n flush() {\n watcherFlush();\n }\n _generateScopeSelector(name) {\n let id = this._scopeCounter[name] = (this._scopeCounter[name] || 0) + 1;\n return `${name}-${id}`;\n }\n getStyleAst(style) {\n return StyleUtil.rulesForStyle(style);\n }\n styleAstToString(ast) {\n return StyleUtil.toCssText(ast);\n }\n _gatherStyles(template) {\n return StyleUtil.gatherStyleText(template.content);\n }\n _getCssBuild(template) {\n let style = template.content.querySelector('style');\n if (!style) {\n return '';\n }\n return style.getAttribute('css-build') || '';\n }\n /**\n * Prepare the styling and template for the given element type\n *\n * @param {HTMLTemplateElement} template\n * @param {string} elementName\n * @param {string=} typeExtension\n */\n prepareTemplate(template, elementName, typeExtension) {\n if (template._prepared) {\n return;\n }\n template._prepared = true;\n template.name = elementName;\n template.extends = typeExtension;\n templateMap[elementName] = template;\n let cssBuild = this._getCssBuild(template);\n let cssText = this._gatherStyles(template);\n let info = {\n is: elementName,\n extends: typeExtension,\n __cssBuild: cssBuild,\n };\n if (!nativeShadow) {\n StyleTransformer.dom(template.content, elementName);\n }\n // check if the styling has mixin definitions or uses\n this._ensure();\n let hasMixins = detectMixin(cssText)\n let ast = parse(cssText);\n // only run the applyshim transforms if there is a mixin involved\n if (hasMixins && nativeCssVariables && this._applyShim) {\n this._applyShim['transformRules'](ast, elementName);\n }\n template['_styleAst'] = ast;\n template._cssBuild = cssBuild;\n\n let ownPropertyNames = [];\n if (!nativeCssVariables) {\n ownPropertyNames = StyleProperties.decorateStyles(template['_styleAst']);\n }\n if (!ownPropertyNames.length || nativeCssVariables) {\n let root = nativeShadow ? template.content : null;\n let placeholder = placeholderMap[elementName];\n let style = this._generateStaticStyle(info, template['_styleAst'], root, placeholder);\n template._style = style;\n }\n template._ownPropertyNames = ownPropertyNames;\n }\n _generateStaticStyle(info, rules, shadowroot, placeholder) {\n let cssText = StyleTransformer.elementStyles(info, rules);\n if (cssText.length) {\n return StyleUtil.applyCss(cssText, info.is, shadowroot, placeholder);\n }\n }\n _prepareHost(host) {\n let {is, typeExtension} = StyleUtil.getIsExtends(host);\n let placeholder = placeholderMap[is];\n let template = templateMap[is];\n let ast;\n let ownStylePropertyNames;\n let cssBuild;\n if (template) {\n ast = template['_styleAst'];\n ownStylePropertyNames = template._ownPropertyNames;\n cssBuild = template._cssBuild;\n }\n return StyleInfo.set(host,\n new StyleInfo(\n ast,\n placeholder,\n ownStylePropertyNames,\n is,\n typeExtension,\n cssBuild\n )\n );\n }\n _ensureApplyShim() {\n if (this._applyShim) {\n return;\n } else if (window.ShadyCSS && window.ShadyCSS.ApplyShim) {\n this._applyShim = window.ShadyCSS.ApplyShim;\n this._applyShim['invalidCallback'] = ApplyShimUtils.invalidate;\n }\n }\n _ensureCustomStyleInterface() {\n if (this._customStyleInterface) {\n return;\n } else if (window.ShadyCSS && window.ShadyCSS.CustomStyleInterface) {\n this._customStyleInterface = /** @type {!CustomStyleInterfaceInterface} */(window.ShadyCSS.CustomStyleInterface);\n /** @type {function(!HTMLStyleElement)} */\n this._customStyleInterface['transformCallback'] = (style) => {this.transformCustomStyleForDocument(style)};\n this._customStyleInterface['validateCallback'] = () => {\n requestAnimationFrame(() => {\n if (this._customStyleInterface['enqueued'] || this._elementsHaveApplied) {\n this.flushCustomStyles();\n }\n })\n };\n }\n }\n _ensure() {\n this._ensureApplyShim();\n this._ensureCustomStyleInterface();\n }\n /**\n * Flush and apply custom styles to document\n */\n flushCustomStyles() {\n this._ensure();\n if (!this._customStyleInterface) {\n return;\n }\n let customStyles = this._customStyleInterface['processStyles']();\n // early return if custom-styles don't need validation\n if (!this._customStyleInterface['enqueued']) {\n return;\n }\n if (!nativeCssVariables) {\n this._updateProperties(this._documentOwner, this._documentOwnerStyleInfo);\n this._applyCustomStyles(customStyles);\n } else {\n this._revalidateCustomStyleApplyShim(customStyles);\n }\n this._customStyleInterface['enqueued'] = false;\n // if custom elements have upgraded and there are no native css variables, we must recalculate the whole tree\n if (this._elementsHaveApplied && !nativeCssVariables) {\n this.styleDocument();\n }\n }\n /**\n * Apply styles for the given element\n *\n * @param {!HTMLElement} host\n * @param {Object=} overrideProps\n */\n styleElement(host, overrideProps) {\n let {is} = StyleUtil.getIsExtends(host);\n let styleInfo = StyleInfo.get(host);\n if (!styleInfo) {\n styleInfo = this._prepareHost(host);\n }\n // Only trip the `elementsHaveApplied` flag if a node other that the root document has `applyStyle` called\n if (!this._isRootOwner(host)) {\n this._elementsHaveApplied = true;\n }\n if (overrideProps) {\n styleInfo.overrideStyleProperties =\n styleInfo.overrideStyleProperties || {};\n Object.assign(styleInfo.overrideStyleProperties, overrideProps);\n }\n if (!nativeCssVariables) {\n this._updateProperties(host, styleInfo);\n if (styleInfo.ownStylePropertyNames && styleInfo.ownStylePropertyNames.length) {\n this._applyStyleProperties(host, styleInfo);\n }\n } else {\n if (styleInfo.overrideStyleProperties) {\n updateNativeProperties(host, styleInfo.overrideStyleProperties);\n }\n let template = templateMap[is];\n // bail early if there is no shadowroot for this element\n if (!template && !this._isRootOwner(host)) {\n return;\n }\n if (template && template._style && !ApplyShimUtils.templateIsValid(template)) {\n // update template\n if (!ApplyShimUtils.templateIsValidating(template)) {\n this._ensure();\n this._applyShim && this._applyShim['transformRules'](template['_styleAst'], is);\n template._style.textContent = StyleTransformer.elementStyles(host, styleInfo.styleRules);\n ApplyShimUtils.startValidatingTemplate(template);\n }\n // update instance if native shadowdom\n if (nativeShadow) {\n let root = host.shadowRoot;\n if (root) {\n let style = root.querySelector('style');\n style.textContent = StyleTransformer.elementStyles(host, styleInfo.styleRules);\n }\n }\n styleInfo.styleRules = template['_styleAst'];\n }\n }\n }\n _styleOwnerForNode(node) {\n let root = node.getRootNode();\n let host = root.host;\n if (host) {\n if (StyleInfo.get(host)) {\n return host;\n } else {\n return this._styleOwnerForNode(host);\n }\n }\n return this._documentOwner;\n }\n _isRootOwner(node) {\n return (node === this._documentOwner);\n }\n _applyStyleProperties(host, styleInfo) {\n let is = StyleUtil.getIsExtends(host).is;\n let cacheEntry = styleCache.fetch(is, styleInfo.styleProperties, styleInfo.ownStylePropertyNames);\n let cachedScopeSelector = cacheEntry && cacheEntry.scopeSelector;\n let cachedStyle = cacheEntry ? cacheEntry.styleElement : null;\n let oldScopeSelector = styleInfo.scopeSelector;\n // only generate new scope if cached style is not found\n styleInfo.scopeSelector = cachedScopeSelector || this._generateScopeSelector(is);\n let style = StyleProperties.applyElementStyle(host, styleInfo.styleProperties, styleInfo.scopeSelector, cachedStyle);\n if (!nativeShadow) {\n StyleProperties.applyElementScopeSelector(host, styleInfo.scopeSelector, oldScopeSelector);\n }\n if (!cacheEntry) {\n styleCache.store(is, styleInfo.styleProperties, style, styleInfo.scopeSelector);\n }\n return style;\n }\n _updateProperties(host, styleInfo) {\n let owner = this._styleOwnerForNode(host);\n let ownerStyleInfo = StyleInfo.get(owner);\n let ownerProperties = ownerStyleInfo.styleProperties;\n let props = Object.create(ownerProperties || null);\n let hostAndRootProps = StyleProperties.hostAndRootPropertiesForScope(host, styleInfo.styleRules);\n let propertyData = StyleProperties.propertyDataFromStyles(ownerStyleInfo.styleRules, host);\n let propertiesMatchingHost = propertyData.properties\n Object.assign(\n props,\n hostAndRootProps.hostProps,\n propertiesMatchingHost,\n hostAndRootProps.rootProps\n );\n this._mixinOverrideStyles(props, styleInfo.overrideStyleProperties);\n StyleProperties.reify(props);\n styleInfo.styleProperties = props;\n }\n _mixinOverrideStyles(props, overrides) {\n for (let p in overrides) {\n let v = overrides[p];\n // skip override props if they are not truthy or 0\n // in order to fall back to inherited values\n if (v || v === 0) {\n props[p] = v;\n }\n }\n }\n /**\n * Update styles of the whole document\n *\n * @param {Object=} properties\n */\n styleDocument(properties) {\n this.styleSubtree(this._documentOwner, properties);\n }\n /**\n * Update styles of a subtree\n *\n * @param {!HTMLElement} host\n * @param {Object=} properties\n */\n styleSubtree(host, properties) {\n let root = host.shadowRoot;\n if (root || this._isRootOwner(host)) {\n this.styleElement(host, properties);\n }\n // process the shadowdom children of `host`\n let shadowChildren = root && (root.children || root.childNodes);\n if (shadowChildren) {\n for (let i = 0; i < shadowChildren.length; i++) {\n let c = /** @type {!HTMLElement} */(shadowChildren[i]);\n this.styleSubtree(c);\n }\n } else {\n // process the lightdom children of `host`\n let children = host.children || host.childNodes;\n if (children) {\n for (let i = 0; i < children.length; i++) {\n let c = /** @type {!HTMLElement} */(children[i]);\n this.styleSubtree(c);\n }\n }\n }\n }\n /* Custom Style operations */\n _revalidateCustomStyleApplyShim(customStyles) {\n for (let i = 0; i < customStyles.length; i++) {\n let c = customStyles[i];\n let s = this._customStyleInterface['getStyleForCustomStyle'](c);\n if (s) {\n this._revalidateApplyShim(s);\n }\n }\n }\n _applyCustomStyles(customStyles) {\n for (let i = 0; i < customStyles.length; i++) {\n let c = customStyles[i];\n let s = this._customStyleInterface['getStyleForCustomStyle'](c);\n if (s) {\n StyleProperties.applyCustomStyle(s, this._documentOwnerStyleInfo.styleProperties);\n }\n }\n }\n transformCustomStyleForDocument(style) {\n let ast = StyleUtil.rulesForStyle(style);\n StyleUtil.forEachRule(ast, (rule) => {\n if (nativeShadow) {\n StyleTransformer.normalizeRootSelector(rule);\n } else {\n StyleTransformer.documentRule(rule);\n }\n if (nativeCssVariables) {\n this._ensure();\n this._applyShim && this._applyShim['transformRule'](rule);\n }\n });\n if (nativeCssVariables) {\n style.textContent = StyleUtil.toCssText(ast);\n } else {\n this._documentOwnerStyleInfo.styleRules['rules'].push(ast);\n }\n }\n _revalidateApplyShim(style) {\n if (nativeCssVariables && this._applyShim) {\n let ast = StyleUtil.rulesForStyle(style);\n this._ensure();\n this._applyShim['transformRules'](ast);\n style.textContent = StyleUtil.toCssText(ast);\n }\n }\n getComputedStyleValue(element, property) {\n let value;\n if (!nativeCssVariables) {\n // element is either a style host, or an ancestor of a style host\n let styleInfo = StyleInfo.get(element) || StyleInfo.get(this._styleOwnerForNode(element));\n value = styleInfo.styleProperties[property];\n }\n // fall back to the property value from the computed styling\n value = value || window.getComputedStyle(element).getPropertyValue(property);\n // trim whitespace that can come after the `:` in css\n // example: padding: 2px -> \" 2px\"\n return value ? value.trim() : '';\n }\n // given an element and a classString, replaces\n // the element's class with the provided classString and adds\n // any necessary ShadyCSS static and property based scoping selectors\n setElementClass(element, classString) {\n let root = element.getRootNode();\n let classes = classString ? classString.split(/\\s/) : [];\n let scopeName = root.host && root.host.localName;\n // If no scope, try to discover scope name from existing class.\n // This can occur if, for example, a template stamped element that\n // has been scoped is manipulated when not in a root.\n if (!scopeName) {\n var classAttr = element.getAttribute('class');\n if (classAttr) {\n let k$ = classAttr.split(/\\s/);\n for (let i=0; i < k$.length; i++) {\n if (k$[i] === StyleTransformer.SCOPE_NAME) {\n scopeName = k$[i+1];\n break;\n }\n }\n }\n }\n if (scopeName) {\n classes.push(StyleTransformer.SCOPE_NAME, scopeName);\n }\n if (!nativeCssVariables) {\n let styleInfo = StyleInfo.get(element);\n if (styleInfo && styleInfo.scopeSelector) {\n classes.push(StyleProperties.XSCOPE_NAME, styleInfo.scopeSelector);\n }\n }\n StyleUtil.setElementClassRaw(element, classes.join(' '));\n }\n _styleInfoForNode(node) {\n return StyleInfo.get(node);\n }\n}\n\n/* exports */\nScopingShim.prototype['flush'] = ScopingShim.prototype.flush;\nScopingShim.prototype['prepareTemplate'] = ScopingShim.prototype.prepareTemplate;\nScopingShim.prototype['styleElement'] = ScopingShim.prototype.styleElement;\nScopingShim.prototype['styleDocument'] = ScopingShim.prototype.styleDocument;\nScopingShim.prototype['styleSubtree'] = ScopingShim.prototype.styleSubtree;\nScopingShim.prototype['getComputedStyleValue'] = ScopingShim.prototype.getComputedStyleValue;\nScopingShim.prototype['setElementClass'] = ScopingShim.prototype.setElementClass;\nScopingShim.prototype['_styleInfoForNode'] = ScopingShim.prototype._styleInfoForNode;\nScopingShim.prototype['transformCustomStyleForDocument'] = ScopingShim.prototype.transformCustomStyleForDocument;\nScopingShim.prototype['getStyleAst'] = ScopingShim.prototype.getStyleAst;\nScopingShim.prototype['styleAstToString'] = ScopingShim.prototype.styleAstToString;\nScopingShim.prototype['flushCustomStyles'] = ScopingShim.prototype.flushCustomStyles;\nObject.defineProperties(ScopingShim.prototype, {\n 'nativeShadow': {\n get() {\n return nativeShadow;\n }\n },\n 'nativeCss': {\n get() {\n return nativeCssVariables;\n }\n }\n});\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport { MIXIN_MATCH, VAR_ASSIGN } from './common-regex.js';\n\n/**\n * @param {Element} element\n * @param {Object=} properties\n */\nexport function updateNativeProperties(element, properties) {\n // remove previous properties\n for (let p in properties) {\n // NOTE: for bc with shim, don't apply null values.\n if (p === null) {\n element.style.removeProperty(p);\n } else {\n element.style.setProperty(p, properties[p]);\n }\n }\n}\n\n/**\n * @param {Element} element\n * @param {string} property\n * @return {string}\n */\nexport function getComputedStyleValue(element, property) {\n /**\n * @const {string}\n */\n const value = window.getComputedStyle(element).getPropertyValue(property);\n if (!value) {\n return '';\n } else {\n return value.trim();\n }\n}\n\n/**\n * return true if `cssText` contains a mixin definition or consumption\n * @param {string} cssText\n * @return {boolean}\n */\nexport function detectMixin(cssText) {\n const has = MIXIN_MATCH.test(cssText) || VAR_ASSIGN.test(cssText);\n // reset state of the regexes\n MIXIN_MATCH.lastIndex = 0;\n VAR_ASSIGN.lastIndex = 0;\n return has;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport ScopingShim from '../src/scoping-shim.js';\nimport {nativeCssVariables, nativeShadow} from '../src/style-settings.js';\n\n/** @const {ScopingShim} */\nconst scopingShim = new ScopingShim();\n\nlet ApplyShim, CustomStyleInterface;\n\nif (window['ShadyCSS']) {\n ApplyShim = window['ShadyCSS']['ApplyShim'];\n CustomStyleInterface = window['ShadyCSS']['CustomStyleInterface'];\n}\n\nwindow.ShadyCSS = {\n ScopingShim: scopingShim,\n /**\n * @param {!HTMLTemplateElement} template\n * @param {string} elementName\n * @param {string=} elementExtends\n */\n prepareTemplate(template, elementName, elementExtends) {\n scopingShim.flushCustomStyles();\n scopingShim.prepareTemplate(template, elementName, elementExtends)\n },\n\n /**\n * @param {!HTMLElement} element\n * @param {Object=} properties\n */\n styleSubtree(element, properties) {\n scopingShim.flushCustomStyles();\n scopingShim.styleSubtree(element, properties);\n },\n\n /**\n * @param {!HTMLElement} element\n */\n styleElement(element) {\n scopingShim.flushCustomStyles();\n scopingShim.styleElement(element);\n },\n\n /**\n * @param {Object=} properties\n */\n styleDocument(properties) {\n scopingShim.flushCustomStyles();\n scopingShim.styleDocument(properties);\n },\n\n /**\n * @param {Element} element\n * @param {string} property\n * @return {string}\n */\n getComputedStyleValue(element, property) {\n return scopingShim.getComputedStyleValue(element, property);\n },\n\n nativeCss: nativeCssVariables,\n\n nativeShadow: nativeShadow\n};\n\nif (ApplyShim) {\n window.ShadyCSS.ApplyShim = ApplyShim;\n}\n\nif (CustomStyleInterface) {\n window.ShadyCSS.CustomStyleInterface = CustomStyleInterface;\n}","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n'use strict';\n\nlet customElements = window['customElements'];\nlet HTMLImports = window['HTMLImports'];\nlet Template = window['HTMLTemplateElement'];\n\n// global for (1) existence means `WebComponentsReady` will file,\n// (2) WebComponents.ready == true means event has fired.\nwindow.WebComponents = window.WebComponents || {};\n\nif (customElements && customElements['polyfillWrapFlushCallback']) {\n // Here we ensure that the public `HTMLImports.whenReady`\n // always comes *after* custom elements have upgraded.\n let flushCallback;\n let runAndClearCallback = function runAndClearCallback() {\n if (flushCallback) {\n // make sure to run the HTMLTemplateElement polyfill before custom elements upgrade\n if (Template.bootstrap) {\n Template.bootstrap(window.document);\n }\n let cb = flushCallback;\n flushCallback = null;\n cb();\n return true;\n }\n }\n let origWhenReady = HTMLImports['whenReady'];\n customElements['polyfillWrapFlushCallback'](function(cb) {\n flushCallback = cb;\n origWhenReady(runAndClearCallback);\n });\n\n HTMLImports['whenReady'] = function(cb) {\n origWhenReady(function() {\n // custom element code may add dynamic imports\n // to match processing of native custom elements before\n // domContentLoaded, we wait for these imports to resolve first.\n if (runAndClearCallback()) {\n HTMLImports['whenReady'](cb);\n } else {\n cb();\n }\n });\n }\n\n}\n\nHTMLImports['whenReady'](function() {\n requestAnimationFrame(function() {\n window.WebComponents.ready = true;\n document.dispatchEvent(new CustomEvent('WebComponentsReady', {bubbles: true}));\n });\n});","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n'use strict';\n// It's desireable to provide a default stylesheet\n// that's convenient for styling unresolved elements, but\n// it's cumbersome to have to include this manually in every page.\n// It would make sense to put inside some HTMLImport but\n// the HTMLImports polyfill does not allow loading of stylesheets\n// that block rendering. Therefore this injection is tolerated here.\n//\n// NOTE: position: relative fixes IE's failure to inherit opacity\n// when a child is not statically positioned.\nlet style = document.createElement('style');\nstyle.textContent = ''\n + 'body {'\n + 'transition: opacity ease-in 0.2s;'\n + ' } \\n'\n + 'body[unresolved] {'\n + 'opacity: 0; display: block; overflow: hidden; position: relative;'\n + ' } \\n'\n ;\nlet head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);"]} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi.js
new file mode 100644
index 00000000000..2e9bfc15b7e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi.js
@@ -0,0 +1,55 @@
+/**
+@license @nocompile
+Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+(function(){/*
+
+ Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ Code distributed by Google as part of the polymer project is also
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+'use strict';(function(h){function B(a,b){if("function"===typeof window.CustomEvent)return new CustomEvent(a,b);var c=document.createEvent("CustomEvent");c.initCustomEvent(a,!!b.bubbles,!!b.cancelable,b.detail);return c}function n(a){if(w)return a.ownerDocument!==document?a.ownerDocument:null;var b=a.__importDoc;if(!b&&a.parentNode){b=a.parentNode;if("function"===typeof b.closest)b=b.closest("link[rel=import]");else for(;!r(b)&&(b=b.parentNode););a.__importDoc=b}return b}function L(a){var b=l(document,
+"link[rel=import]:not([import-dependency])"),c=b.length;c?g(b,function(b){return t(b,function(){0===--c&&a()})}):a()}function C(a){function b(){"loading"!==document.readyState&&document.body&&(document.removeEventListener("readystatechange",b),a())}document.addEventListener("readystatechange",b);b()}function D(a){C(function(){return L(function(){return a&&a()})})}function t(a,b){if(a.__loaded)b&&b();else if("script"===a.localName&&!a.src||"style"===a.localName&&!a.firstChild)a.__loaded=!0,b&&b();
+else{var c=function(d){a.removeEventListener(d.type,c);a.__loaded=!0;b&&b()};a.addEventListener("load",c);x&&"style"===a.localName||a.addEventListener("error",c)}}function r(a){return a.nodeType===Node.ELEMENT_NODE&&"link"===a.localName&&"import"===a.rel}function k(){var a=this;this.a={};this.b=0;this.g=new MutationObserver(function(b){return a.A(b)});this.g.observe(document.head,{childList:!0,subtree:!0});this.loadImports(document)}function E(a){g(l(a,"template"),function(a){g(l(a.content,'script:not([type]),script[type="application/javascript"],script[type="text/javascript"]'),
+function(a){var b=document.createElement("script");g(a.attributes,function(a){return b.setAttribute(a.name,a.value)});b.textContent=a.textContent;a.parentNode.replaceChild(b,a)});E(a.content)})}function l(a,b){return a&&a.childNodes.length?a.querySelectorAll(b):M}function g(a,b,c){var d=a?a.length:0,f=c?-1:1;for(c=c?d-1:0;c<d&&0<=c;c+=f)b(a[c],c)}var p=document.createElement("link"),w="import"in p,M=p.querySelectorAll("*"),y=null;!1==="currentScript"in document&&Object.defineProperty(document,"currentScript",
+{get:function(){return y||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null)},configurable:!0});var N=/(url\()([^)]*)(\))/g,O=/(@import[\s]+(?!url\())([^;]*)(;)/g,P=/(<link[^>]*)(rel=['|"]?stylesheet['|"]?[^>]*>)/g,e={v:function(a,b){a.href&&a.setAttribute("href",e.c(a.getAttribute("href"),b));a.src&&a.setAttribute("src",e.c(a.getAttribute("src"),b));if("style"===a.localName){var c=e.o(a.textContent,b,N);a.textContent=e.o(c,b,O)}},o:function(a,b,c){return a.replace(c,
+function(a,c,m,g){a=m.replace(/["']/g,"");b&&(a=e.c(a,b));return c+"'"+a+"'"+g})},c:function(a,b){if(void 0===e.f){e.f=!1;try{var c=new URL("b","http://a");c.pathname="c%20d";e.f="http://a/c%20d"===c.href}catch(d){}}if(e.f)return(new URL(a,b)).href;c=e.s;c||(c=document.implementation.createHTMLDocument("temp"),e.s=c,c.i=c.createElement("base"),c.head.appendChild(c.i),c.h=c.createElement("a"));c.i.href=b;c.h.href=a;return c.h.href||a}},F={async:!0,load:function(a,b,c){if(a)if(a.match(/^data:/)){a=
+a.split(",");var d=a[1];d=-1<a[0].indexOf(";base64")?atob(d):decodeURIComponent(d);b(d)}else{var f=new XMLHttpRequest;f.open("GET",a,F.async);f.onload=function(){var a=f.responseURL||f.getResponseHeader("Location");a&&0===a.indexOf("/")&&(a=(location.origin||location.protocol+"//"+location.host)+a);var d=f.response||f.responseText;304===f.status||0===f.status||200<=f.status&&300>f.status?b(d,a):c(d)};f.send()}else c("error: href must be specified")}},x=/Trident/.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent);
+k.prototype.loadImports=function(a){var b=this;g(l(a,"link[rel=import]"),function(a){return b.l(a)})};k.prototype.l=function(a){var b=this,c=a.href;if(void 0!==this.a[c]){var d=this.a[c];d&&d.__loaded&&(a.__import=d,this.j(a))}else this.b++,this.a[c]="pending",F.load(c,function(a,d){a=b.B(a,d||c);b.a[c]=a;b.b--;b.loadImports(a);b.m()},function(){b.a[c]=null;b.b--;b.m()})};k.prototype.B=function(a,b){if(!a)return document.createDocumentFragment();x&&(a=a.replace(P,function(a,b,c){return-1===a.indexOf("type=")?
+b+" type=import-disable "+c:a}));var c=document.createElement("template");c.innerHTML=a;if(c.content)a=c.content,E(a);else for(a=document.createDocumentFragment();c.firstChild;)a.appendChild(c.firstChild);if(c=a.querySelector("base"))b=e.c(c.getAttribute("href"),b),c.removeAttribute("href");var d=0;g(l(a,'link[rel=import],link[rel=stylesheet][href][type=import-disable],style:not([type]),link[rel=stylesheet][href]:not([type]),script:not([type]),script[type="application/javascript"],script[type="text/javascript"]'),
+function(a){t(a);e.v(a,b);a.setAttribute("import-dependency","");"script"===a.localName&&!a.src&&a.textContent&&(a.setAttribute("src","data:text/javascript;charset=utf-8,"+encodeURIComponent(a.textContent+("\n//# sourceURL="+b+(d?"-"+d:"")+".js\n"))),a.textContent="",d++)});return a};k.prototype.m=function(){var a=this;if(!this.b){this.g.disconnect();this.flatten(document);var b=!1,c=!1,d=function(){c&&b&&(a.loadImports(document),a.b||(a.g.observe(document.head,{childList:!0,subtree:!0}),a.w()))};
+this.D(function(){c=!0;d()});this.C(function(){b=!0;d()})}};k.prototype.flatten=function(a){var b=this;g(l(a,"link[rel=import]"),function(a){var c=b.a[a.href];(a.__import=c)&&c.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&(b.a[a.href]=a,a.readyState="loading",a.__import=a,b.flatten(c),a.appendChild(c))})};k.prototype.C=function(a){function b(f){if(f<d){var m=c[f],e=document.createElement("script");m.removeAttribute("import-dependency");g(m.attributes,function(a){return e.setAttribute(a.name,a.value)});
+y=e;m.parentNode.replaceChild(e,m);t(e,function(){y=null;b(f+1)})}else a()}var c=l(document,"script[import-dependency]"),d=c.length;b(0)};k.prototype.D=function(a){var b=l(document,"style[import-dependency],link[rel=stylesheet][import-dependency]"),c=b.length;if(c){var d=x&&!!document.querySelector("link[rel=stylesheet][href][type=import-disable]");g(b,function(b){t(b,function(){b.removeAttribute("import-dependency");0===--c&&a()});if(d&&b.parentNode!==document.head){var e=document.createElement(b.localName);
+e.__appliedElement=b;e.setAttribute("type","import-placeholder");b.parentNode.insertBefore(e,b.nextSibling);for(e=n(b);e&&n(e);)e=n(e);e.parentNode!==document.head&&(e=null);document.head.insertBefore(b,e);b.removeAttribute("type")}})}else a()};k.prototype.w=function(){var a=this;g(l(document,"link[rel=import]"),function(b){return a.j(b)},!0)};k.prototype.j=function(a){a.__loaded||(a.__loaded=!0,a.import&&(a.import.readyState="complete"),a.dispatchEvent(B(a.import?"load":"error",{bubbles:!1,cancelable:!1,
+detail:void 0})))};k.prototype.A=function(a){var b=this;g(a,function(a){return g(a.addedNodes,function(a){a&&a.nodeType===Node.ELEMENT_NODE&&(r(a)?b.l(a):b.loadImports(a))})})};var z=null;if(w)g(l(document,"link[rel=import]"),function(a){a.import&&"loading"===a.import.readyState||(a.__loaded=!0)}),p=function(a){a=a.target;r(a)&&(a.__loaded=!0)},document.addEventListener("load",p,!0),document.addEventListener("error",p,!0);else{var q=Object.getOwnPropertyDescriptor(Node.prototype,"baseURI");Object.defineProperty((!q||
+q.configurable?Node:Element).prototype,"baseURI",{get:function(){var a=r(this)?this:n(this);return a?a.href:q&&q.get?q.get.call(this):(document.querySelector("base")||window.location).href},configurable:!0,enumerable:!0});Object.defineProperty(HTMLLinkElement.prototype,"import",{get:function(){return this.__import||null},configurable:!0,enumerable:!0});C(function(){z=new k})}D(function(){return document.dispatchEvent(B("HTMLImportsLoaded",{cancelable:!0,bubbles:!0,detail:void 0}))});h.useNative=w;
+h.whenReady=D;h.importForElement=n;h.loadImports=function(a){z&&z.loadImports(a)}})(window.HTMLImports=window.HTMLImports||{});/*
+
+ Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ Code distributed by Google as part of the polymer project is also
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+var u=window.customElements,v=window.HTMLImports,A=window.HTMLTemplateElement;window.WebComponents=window.WebComponents||{};if(u&&u.polyfillWrapFlushCallback){var G,H=function(){if(G){A.u&&A.u(window.document);var h=G;G=null;h();return!0}},I=v.whenReady;u.polyfillWrapFlushCallback(function(h){G=h;I(H)});v.whenReady=function(h){I(function(){H()?v.whenReady(h):h()})}}
+v.whenReady(function(){requestAnimationFrame(function(){window.WebComponents.ready=!0;document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})});var J=document.createElement("style");J.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var K=document.querySelector("head");K.insertBefore(J,K.firstChild);/*
+
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+}).call(this);
+
+//# sourceMappingURL=webcomponents-hi.js.map
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi.js.map b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi.js.map
new file mode 100644
index 00000000000..542d76c1aca
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-hi.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["node_modules/@webcomponents/html-imports/src/html-imports.js","src/post-polyfill.js","src/unresolved.js"],"names":["scope","newCustomEvent","type","params","window","CustomEvent","event","document","createEvent","initCustomEvent","bubbles","cancelable","detail","importForElement","element","useNative","ownerDocument","doc","parentNode","closest","importSelector","isImportLink","whenImportsReady","callback","imports","QSA","rootImportSelector","pending","length","forEach","imp","whenElementLoaded","whenDocumentReady","stateChanged","readyState","body","removeEventListener","addEventListener","whenReady","localName","src","firstChild","onLoadingDone","isIE","node","nodeType","Node","ELEMENT_NODE","rel","constructor","Importer","documents","inflight","dynamicImportsMO","MutationObserver","m","handleMutations","observe","head","childList","subtree","loadImports","replaceScripts","fragment","template","content","scriptsSelector","script","clone","createElement","attributes","attr","setAttribute","name","value","textContent","replaceChild","selector","childNodes","querySelectorAll","emptyNodeList","list","inverseOrder","increment","i","link","currentScript","Object","defineProperty","get","scripts","configurable","CSS_URL_REGEXP","CSS_IMPORT_REGEXP","STYLESHEET_REGEXP","Path","fixUrls","base","href","resolveUrl","getAttribute","r","replaceUrls","text","linkUrl","regexp","replace","pre","url","post","urlPath","undefined","__workingURL","u","URL","pathname","e","__tempDoc","implementation","createHTMLDocument","__base","appendChild","__anchor","Xhr","async","load","success","fail","match","pieces","split","resource","header","indexOf","atob","decodeURIComponent","request","XMLHttpRequest","open","onload","request.onload","redirectedUrl","responseURL","getResponseHeader","location","origin","protocol","host","response","responseText","status","send","test","navigator","userAgent","links","loadImport","fireEventIfNeeded","makeDocument","processImportsIfLoadingDone","createDocumentFragment","p1","p2","innerHTML","baseEl","querySelector","removeAttribute","inlineScriptIndex","n$","importDependenciesSelector","n","importDependencyAttr","encodeURIComponent","num","disconnect","flatten","scriptsOk","stylesOk","fireEvents","waitForStyles","runScripts","DOCUMENT_FRAGMENT_NODE","cloneScript","l","s","s$","pendingScriptsSelector","pendingStylesSelector","needsMove","disabledLinkSelector","placeholder","insertBefore","nextSibling","newSibling","import","dispatchEvent","eventType","mutations","addedNodes","elem","importer","imps","target","native_baseURI","getOwnPropertyDescriptor","prototype","klass","Element","ownerDoc","call","enumerable","HTMLLinkElement","HTMLImports","customElements","Template","WebComponents","flushCallback","runAndClearCallback","bootstrap","cb","origWhenReady","requestAnimationFrame","ready","style"],"mappings":"A;;;;;;;;;;;;;;;;;;aASC,SAAA,CAAAA,CAAA,CAAS,CAsqBeC,QAAA,EAAA,CAACC,CAAD,CAAOC,CAAP,CAAkB,CACvC,GAAkC,UAAlC,GAAI,MAAOC,OAAAC,YAAX,CACE,MAAO,KAAIA,WAAJ,CAAgBH,CAAhB,CAAsBC,CAAtB,CAET,KAAMG,EAAqCC,QAAAC,YAAA,CAAqB,aAArB,CAC3CF,EAAAG,gBAAA,CAAsBP,CAAtB,CAA4B,CAAA,CAAQC,CAAAO,QAApC,CAAqD,CAAA,CAAQP,CAAAQ,WAA7D,CAAiFR,CAAAS,OAAjF,CACA,OAAON,EANgC,CAjChBO,QAAA,EAAA,CAAAC,CAAA,CAAW,CAClC,GAAIC,CAAJ,CAEE,MAAOD,EAAAE,cAAA,GAA0BT,QAA1B,CAAqCO,CAAAE,cAArC,CAA6D,IAEtE,KAAIC,EAAMH,CAAA,YACV,IAAI,CAACG,CAAL,EAAYH,CAAAI,WAAZ,CAAgC,CAC9BD,CAAA,CAA+BH,CAAAI,WAC/B,IAA2B,UAA3B,GAAI,MAAOD,EAAAE,QAAX,CAGEF,CAAA,CAAMA,CAAAE,QAAA,CAndWC,kBAmdX,CAHR,KAME,KAAA,CAAO,CAACC,CAAA,CAAaJ,CAAb,CAAR,GAA8BA,CAA9B,CAAoCA,CAAAC,WAApC,EAAA,EAEFJ,CAAA,YAAA,CAAyBG,CAVK,CAYhC,MAAOA,EAlB2B,CApBXK,QAAA,EAAA,CAAAC,CAAA,CAAY,CACnC,IAAIC,EACDC,CAAA,CAAIlB,QAAJ;AAvasBmB,2CAuatB,CADH,CAEIC,EAAUH,CAAAI,OACTD,EAAL,CAIAE,CAAA,CAAQL,CAAR,CAAiB,QAAA,CAAAM,CAAA,CAAO,CAAA,MAAAC,EAAA,CAAkBD,CAAlB,CAAuB,QAAA,EAAM,CACjC,CAAlB,GAAI,EAAEH,CAAN,EACEJ,CAAA,EAFiD,CAA7B,CAAA,CAAxB,CAJA,CACEA,CAAA,EALiC,CAlBXS,QAAA,EAAA,CAAAT,CAAA,CAAY,CACfU,QAAA,EAAA,EAAM,CAGG,SAA5B,GAAI1B,QAAA2B,WAAJ,EAA2C3B,QAAA4B,KAA3C,GACE5B,QAAA6B,oBAAA,CAA6B,kBAA7B,CAAiDH,CAAjD,CACA,CAAAV,CAAA,EAFF,CAHyB,CAQ3BhB,QAAA8B,iBAAA,CAA0B,kBAA1B,CAA8CJ,CAA9C,CACAA,EAAA,EAVoC,CAXpBK,QAAA,EAAA,CAAAf,CAAA,CAAY,CAG5BS,CAAA,CAAkB,QAAA,EAAM,CAAA,MAAAV,EAAA,CAAiB,QAAA,EAAM,CAAA,MAAAC,EAAA,EAAYA,CAAA,EAAZ,CAAvB,CAAA,CAAxB,CAH4B,CAhCJQ,QAAA,EAAA,CAACjB,CAAD,CAAUS,CAAV,CAAuB,CAC/C,GAAIT,CAAA,SAAJ,CACES,CAAA,EAAYA,CAAA,EADd,KAEO,IAA2B,QAA3B,GAAKT,CAAAyB,UAAL,EAAuC,CAACzB,CAAA0B,IAAxC,EACkB,OADlB,GACJ1B,CAAAyB,UADI,EAC6B,CAACzB,CAAA2B,WAD9B,CAIL3B,CAAA,SACA,CADsB,CAAA,CACtB,CAAAS,CAAA,EAAYA,CAAA,EALP;IAMA,CACL,IAAMmB,EAAgBA,QAAA,CAAApC,CAAA,CAAS,CAC7BQ,CAAAsB,oBAAA,CAA4B9B,CAAAJ,KAA5B,CAAwCwC,CAAxC,CACA5B,EAAA,SAAA,CAAsB,CAAA,CACtBS,EAAA,EAAYA,CAAA,EAHiB,CAK/BT,EAAAuB,iBAAA,CAAyB,MAAzB,CAAiCK,CAAjC,CAKKC,EAAL,EAAmC,OAAnC,GAAa7B,CAAAyB,UAAb,EACEzB,CAAAuB,iBAAA,CAAyB,OAAzB,CAAkCK,CAAlC,CAZG,CATwC,CAX5BrB,QAAA,EAAA,CAAAuB,CAAA,CAAQ,CAC3B,MAAOA,EAAAC,SAAP,GAAyBC,IAAAC,aAAzB,EAAiE,MAAjE,GAA8CH,CAAAL,UAA9C,EACmD,QADnD,GACqCK,CAADI,IAFT,CA9U3BC,QADIC,EACO,EAAG,CAAA,IAAA,EAAA,IACZ,KAAAC,EAAA,CAAiB,EAGjB,KAAAC,EAAA,CAAgB,CAChB,KAAAC,EAAA,CAAwB,IAAIC,gBAAJ,CAAqB,QAAA,CAAAC,CAAA,CAAK,CAAA,MAAA,EAAAC,EAAA,CAAqBD,CAArB,CAAA,CAA1B,CAExB,KAAAF,EAAAI,QAAA,CAA8BlD,QAAAmD,KAA9B,CAA6C,CAC3CC,UAAW,CAAA,CADgC,CAE3CC,QAAS,CAAA,CAFkC,CAA7C,CAQA,KAAAC,YAAA,CAAiBtD,QAAjB,CAfY,CApKOuD,QAAA,EAAA,CAACC,CAAD,CAAc,CACnClC,CAAA,CAAQJ,CAAA,CAAIsC,CAAJ,CAAc,UAAd,CAAR,CAAmC,QAAA,CAAAC,CAAA,CAAY,CAC7CnC,CAAA,CAAQJ,CAAA,CAAIuC,CAAAC,QAAJ,CA2IYC,yFA3IZ,CAAR;AAAgD,QAAA,CAAAC,CAAA,CAAU,CACxD,IAAMC,EACH7D,QAAA8D,cAAA,CAAuB,QAAvB,CACHxC,EAAA,CAAQsC,CAAAG,WAAR,CAA2B,QAAA,CAAAC,CAAA,CAAQ,CAAA,MAAAH,EAAAI,aAAA,CAAmBD,CAAAE,KAAnB,CAA8BF,CAAAG,MAA9B,CAAA,CAAnC,CACAN,EAAAO,YAAA,CAAoBR,CAAAQ,YACpBR,EAAAjD,WAAA0D,aAAA,CAA+BR,CAA/B,CAAsCD,CAAtC,CALwD,CAA1D,CAOAL,EAAA,CAAeE,CAAAC,QAAf,CAR6C,CAA/C,CADmC,CAZzBxC,QAAA,EAAA,CAACmB,CAAD,CAAOiC,CAAP,CAAoB,CAG9B,MAAKjC,EAAAkC,WAAAlD,OAAL,CAGOgB,CAAAmC,iBAAA,CAAsBF,CAAtB,CAHP,CACSG,CAJqB,CAdhBnD,QAAA,EAAA,CAACoD,CAAD,CAAO1D,CAAP,CAAiB2D,CAAjB,CAAkC,CAChD,IAAMtD,EAASqD,CAAA,CAAOA,CAAArD,OAAP,CAAqB,CAApC,CACMuD,EAAYD,CAAA,CAAgB,EAAhB,CAAoB,CAEtC,KADIE,CACJ,CADQF,CAAA,CAAetD,CAAf,CAAwB,CAAxB,CAA4B,CACpC,CAAOwD,CAAP,CAAWxD,CAAX,EAA0B,CAA1B,EAAqBwD,CAArB,CAAiCA,CAAjC,EAAqCD,CAArC,CACE5D,CAAA,CAAS0D,CAAA,CAAKG,CAAL,CAAT,CAAkBA,CAAlB,CAL8C,CA1BlD,IAAMC,EAAO9E,QAAA8D,cAAA,CAAuB,MAAvB,CAAb,CACMtD,EAAoB,QAApBA,EAAgCsE,EADtC,CAEML,EAAgBK,CAAAN,iBAAA,CAAsB,GAAtB,CAFtB,CAKIO,EAAgB,IACgB,EAAA,CAApC,GAAI,eAAJ,EAAuB/E,SAAvB,EACEgF,MAAAC,eAAA,CAAsBjF,QAAtB,CAAgC,eAAhC;AAAiD,CAC/C,IAAAkF,QAAG,EAAG,CACJ,MAAOH,EAAP,GAK2B,UAAxB,GAAA/E,QAAA2B,WAAA,CACC3B,QAAAmF,QAAA,CAAiBnF,QAAAmF,QAAA9D,OAAjB,CAA2C,CAA3C,CADD,CACiD,IANpD,CADI,CADyC,CAU/C+D,aAAc,CAAA,CAViC,CAAjD,CA2DF,KAAMC,EAAiB,qBAAvB,CACMC,EAAoB,oCAD1B,CAEMC,EAAoB,iDAF1B,CAMMC,EAAO,CAEX,EAAAC,QAAO,CAAClF,CAAD,CAAUmF,CAAV,CAAgB,CACjBnF,CAAAoF,KAAJ,EACEpF,CAAA0D,aAAA,CAAqB,MAArB,CACEuB,CAAAI,EAAA,CAAgBrF,CAAAsF,aAAA,CAAqB,MAArB,CAAhB,CAA8CH,CAA9C,CADF,CAGEnF,EAAA0B,IAAJ,EACE1B,CAAA0D,aAAA,CAAqB,KAArB,CACEuB,CAAAI,EAAA,CAAgBrF,CAAAsF,aAAA,CAAqB,KAArB,CAAhB,CAA6CH,CAA7C,CADF,CAGF,IAA0B,OAA1B,GAAInF,CAAAyB,UAAJ,CAAmC,CACjC,IAAM8D,EAAIN,CAAAO,EAAA,CAAiBxF,CAAA6D,YAAjB,CAAsCsB,CAAtC,CAA4CL,CAA5C,CACV9E,EAAA6D,YAAA,CAAsBoB,CAAAO,EAAA,CAAiBD,CAAjB,CAAoBJ,CAApB,CAA0BJ,CAA1B,CAFW,CATd,CAFZ,CAiBX,EAAAS,QAAW,CAACC,CAAD,CAAOC,CAAP,CAAgBC,CAAhB,CAAwB,CACjC,MAAOF,EAAAG,QAAA,CAAaD,CAAb;AAAqB,QAAA,CAAClD,CAAD,CAAIoD,CAAJ,CAASC,CAAT,CAAcC,CAAd,CAAuB,CAC7CC,CAAAA,CAAUF,CAAAF,QAAA,CAAY,OAAZ,CAAqB,EAArB,CACVF,EAAJ,GACEM,CADF,CACYf,CAAAI,EAAA,CAAgBW,CAAhB,CAAyBN,CAAzB,CADZ,CAGA,OAAOG,EAAP,CAAa,GAAb,CAAoBG,CAApB,CAA8B,GAA9B,CAAqCD,CALY,CAA5C,CAD0B,CAjBxB,CA2BX,EAAAV,QAAU,CAACS,CAAD,CAAMX,CAAN,CAAY,CAEpB,GAA0Bc,IAAAA,EAA1B,GAAIhB,CAAAiB,EAAJ,CAAqC,CACnCjB,CAAAiB,EAAA,CAAoB,CAAA,CACpB,IAAI,CACF,IAAMC,EAAI,IAAIC,GAAJ,CAAQ,GAAR,CAAa,UAAb,CACVD,EAAAE,SAAA,CAAa,OACbpB,EAAAiB,EAAA,CAAgC,gBAAhC,GAAqBC,CAAAf,KAHnB,CAIF,MAAOkB,CAAP,CAAU,EANuB,CASrC,GAAIrB,CAAAiB,EAAJ,CACE,MAAOd,CAAC,IAAIgB,GAAJ,CAAQN,CAAR,CAAaX,CAAb,CAADC,MAILjF,EAAAA,CAAM8E,CAAAsB,EACLpG,EAAL,GACEA,CAIA,CAJMV,QAAA+G,eAAAC,mBAAA,CAA2C,MAA3C,CAIN,CAHAxB,CAAAsB,EAGA,CAHiBpG,CAGjB,CAFAA,CAAAuG,EAEA,CAFavG,CAAAoD,cAAA,CAAkB,MAAlB,CAEb,CADApD,CAAAyC,KAAA+D,YAAA,CAAqBxG,CAAAuG,EAArB,CACA,CAAAvG,CAAAyG,EAAA,CAAezG,CAAAoD,cAAA,CAAkB,GAAlB,CALjB,CAOApD,EAAAuG,EAAAtB,KAAA,CAAkBD,CAClBhF,EAAAyG,EAAAxB,KAAA,CAAoBU,CACpB,OAAO3F,EAAAyG,EAAAxB,KAAP,EAA4BU,CA1BR,CA3BX,CANb,CAgEMe,EAAM,CAEVC,MAAO,CAAA,CAFG,CASV,KAAAC,QAAI,CAACjB,CAAD,CAAMkB,CAAN,CAAeC,CAAf,CAAqB,CACvB,GAAKnB,CAAL,CAEO,GAAIA,CAAAoB,MAAA,CAAU,QAAV,CAAJ,CAAyB,CAExBC,CAAAA;AAASrB,CAAAsB,MAAA,CAAU,GAAV,CAEf,KAAIC,EAAWF,CAAA,CAAO,CAAP,CAEbE,EAAA,CAD+B,EAAjC,CAFeF,CAAAG,CAAO,CAAPA,CAEXC,QAAA,CAAe,SAAf,CAAJ,CACaC,IAAA,CAAKH,CAAL,CADb,CAGaI,kBAAA,CAAmBJ,CAAnB,CAEbL,EAAA,CAAQK,CAAR,CAV8B,CAAzB,IAWA,CACL,IAAMK,EAAU,IAAIC,cACpBD,EAAAE,KAAA,CAAa,KAAb,CAAoB9B,CAApB,CAAyBe,CAAAC,MAAzB,CACAY,EAAAG,OAAA,CAAiBC,QAAA,EAAM,CAKrB,IAAIC,EAAgBL,CAAAM,YAAhBD,EAAuCL,CAAAO,kBAAA,CAA0B,UAA1B,CACvCF,EAAJ,EAAoD,CAApD,GAAqBA,CAAAR,QAAA,CAAsB,GAAtB,CAArB,GAIEQ,CAJF,EAGkBG,QAAAC,OAHlB,EAGqCD,QAAAE,SAHrC,CAGyD,IAHzD,CAGgEF,QAAAG,KAHhE,EAI2BN,CAJ3B,CAMA,KAAMV,EAAkCK,CAAAY,SAAlCjB,EAAsDK,CAAAa,aACrC,IAAvB,GAAIb,CAAAc,OAAJ,EAAiD,CAAjD,GAA8Bd,CAAAc,OAA9B,EACoB,GADpB,EACEd,CAAAc,OADF,EAC4C,GAD5C,CAC2Bd,CAAAc,OAD3B,CAEExB,CAAA,CAAQK,CAAR,CAAkBU,CAAlB,CAFF,CAIEd,CAAA,CAAKI,CAAL,CAjBmB,CAoBvBK,EAAAe,KAAA,EAvBK,CAbP,IACExB,EAAA,CAAK,+BAAL,CAFqB,CATf,CAhEZ,CAqHMpF,EAAO,SAAA6G,KAAA,CAAeC,SAAAC,UAAf,CAAP/G,EACJ,YAAA6G,KAAA,CAAkBC,SAAAC,UAAlB,CAqDA;CAAA,UAAA,YAAA,CAAA7F,QAAW,CAAC5C,CAAD,CAAM,CAAA,IAAA,EAAA,IAGfY,EAAA,CADGJ,CAAAkI,CAAI1I,CAAJ0I,CArDgBvI,kBAqDhBuI,CACH,CAAe,QAAA,CAAAtE,CAAA,CAAQ,CAAA,MAAA,EAAAuE,EAAA,CAAgBvE,CAAhB,CAAA,CAAvB,CAHe,CASjB,EAAA,UAAA,EAAA,CAAAuE,QAAU,CAACvE,CAAD,CAAO,CAAA,IAAA,EAAA,IAAA,CACTuB,EAAMvB,CAAAa,KAEZ,IAA4Ba,IAAAA,EAA5B,GAAI,IAAA5D,EAAA,CAAeyD,CAAf,CAAJ,CAAuC,CAGrC,IAAM9E,EAAM,IAAAqB,EAAA,CAAeyD,CAAf,CACR9E,EAAJ,EAAWA,CAAA,SAAX,GACEuD,CAAA,SACA,CADmBvD,CACnB,CAAA,IAAA+H,EAAA,CAAuBxE,CAAvB,CAFF,CAJqC,CAAvC,IAUA,KAAAjC,EAAA,EAGA,CADA,IAAAD,EAAA,CAAeyD,CAAf,CACA,CADsB,SACtB,CAAAe,CAAAE,KAAA,CAASjB,CAAT,CAAc,QAAA,CAACuB,CAAD,CAAWU,CAAX,CAA6B,CACnC5H,CAAAA,CAAM,CAAA6I,EAAA,CAAkB3B,CAAlB,CAA4BU,CAA5B,EAA6CjC,CAA7C,CACZ,EAAAzD,EAAA,CAAeyD,CAAf,CAAA,CAAsB3F,CACtB,EAAAmC,EAAA,EAEA,EAAAS,YAAA,CAAiB5C,CAAjB,CACA,EAAA8I,EAAA,EANyC,CAA3C,CAOG,QAAA,EAAM,CAEP,CAAA5G,EAAA,CAAeyD,CAAf,CAAA,CAAsB,IACtB,EAAAxD,EAAA,EACA,EAAA2G,EAAA,EAJO,CAPT,CAhBe,CAqCjB,EAAA,UAAA,EAAA,CAAAD,QAAY,CAAC3B,CAAD,CAAWvB,CAAX,CAAgB,CAC1B,GAAI,CAACuB,CAAL,CACE,MAAO5H,SAAAyJ,uBAAA,EAGLrH,EAAJ,GAKEwF,CALF,CAKaA,CAAAzB,QAAA,CAAiBZ,CAAjB,CAAoC,QAAA,CAACkC,CAAD,CAAQiC,CAAR,CAAYC,CAAZ,CAAmB,CAChE,MAAgC,EAAhC,GAAIlC,CAAAK,QAAA,CAAc,OAAd,CAAJ;AACY4B,CADZ,CACwC,uBADxC,CAC4CC,CAD5C,CAGOlC,CAJyD,CAAvD,CALb,CAcA,KAAMhE,EACHzD,QAAA8D,cAAA,CAAuB,UAAvB,CACHL,EAAAmG,UAAA,CAAqBhC,CACrB,IAAInE,CAAAC,QAAJ,CACEA,CAGA,CAHUD,CAAAC,QAGV,CAAAH,CAAA,CAAeG,CAAf,CAJF,KAQE,KADAA,CACA,CADU1D,QAAAyJ,uBAAA,EACV,CAAOhG,CAAAvB,WAAP,CAAA,CACEwB,CAAAwD,YAAA,CAAoBzD,CAAAvB,WAApB,CAMJ,IADM2H,CACN,CADenG,CAAAoG,cAAA,CAAsB,MAAtB,CACf,CACEzD,CACA,CADMb,CAAAI,EAAA,CAAgBiE,CAAAhE,aAAA,CAAoB,MAApB,CAAhB,CAA6CQ,CAA7C,CACN,CAAAwD,CAAAE,gBAAA,CAAuB,MAAvB,CAMF,KAAIC,EAAoB,CACxB1I,EAAA,CAHGJ,CAAA+I,CAAIvG,CAAJuG,CAlI4BC,mNAkI5BD,CAGH;AAAY,QAAA,CAAAE,CAAA,CAAK,CAEf3I,CAAA,CAAkB2I,CAAlB,CACA3E,EAAAC,EAAA,CAAa0E,CAAb,CAAgB9D,CAAhB,CAEA8D,EAAAlG,aAAA,CAvIuBmG,mBAuIvB,CAAqC,EAArC,CAEoB,SAApB,GAAID,CAAAnI,UAAJ,EAAgC,CAACmI,CAAAlI,IAAjC,EAA0CkI,CAAA/F,YAA1C,GAKE+F,CAAAlG,aAAA,CAAe,KAAf,CAAsB,qCAAtB,CAA8DoG,kBAAA,CAH9CF,CAAA/F,YAG8C,EAH9B,kBAG8B,CAHXiC,CAGW,EAJlD2D,CAAAM,CAAoB,GAApBA,CAAwBN,CAAxBM,CAA8C,EAII,EAHF,OAGE,EAA9D,CAEA,CADAH,CAAA/F,YACA,CADgB,EAChB,CAAA4F,CAAA,EAPF,CAPe,CAAjB,CAiBA,OAAOtG,EA/DmB,CAsE5B,EAAA,UAAA,EAAA,CAAA8F,QAA2B,EAAG,CAAA,IAAA,EAAA,IAE5B,IAAI3G,CAAA,IAAAA,EAAJ,CAAA,CAGA,IAAAC,EAAAyH,WAAA,EACA,KAAAC,QAAA,CAAaxK,QAAb,CAN4B,KAcxByK,EAAY,CAAA,CAdY,CAe1BC,EAAW,CAAA,CAfe,CAgBtBvI,EAAgBA,QAAA,EAAM,CACtBuI,CAAJ,EAAgBD,CAAhB,GAGE,CAAAnH,YAAA,CAAiBtD,QAAjB,CACA,CAAI,CAAA6C,EAAJ,GAGA,CAAAC,EAAAI,QAAA,CAA8BlD,QAAAmD,KAA9B,CAA6C,CAC3CC,UAAW,CAAA,CADgC,CAE3CC,QAAS,CAAA,CAFkC,CAA7C,CAIA,CAAA,CAAAsH,EAAA,EAPA,CAJF,CAD0B,CAe5B;IAAAC,EAAA,CAAmB,QAAA,EAAM,CACvBF,CAAA,CAAW,CAAA,CACXvI,EAAA,EAFuB,CAAzB,CAIA,KAAA0I,EAAA,CAAgB,QAAA,EAAM,CACpBJ,CAAA,CAAY,CAAA,CACZtI,EAAA,EAFoB,CAAtB,CAjCA,CAF4B,CA4C9B,EAAA,UAAA,QAAA,CAAAqI,QAAO,CAAC9J,CAAD,CAAM,CAAA,IAAA,EAAA,IAGXY,EAAA,CADGJ,CAAA+I,CAAIvJ,CAAJuJ,CArNgBpJ,kBAqNhBoJ,CACH,CAAY,QAAA,CAAAE,CAAA,CAAK,CACf,IAAM5I,EAAM,CAAAqB,EAAA,CAAeuH,CAAAxE,KAAf,CAEZ,EADAwE,CAAA,SACA,CAD0C5I,CAC1C,GAAWA,CAAAe,SAAX,GAA4BC,IAAAuI,uBAA5B,GAGE,CAAAlI,EAAA,CAAeuH,CAAAxE,KAAf,CAIA,CAJyBwE,CAIzB,CAHAA,CAAAxI,WAGA,CAHe,SAGf,CAFAwI,CAAA,SAEA,CAFgBA,CAEhB,CADA,CAAAK,QAAA,CAAajJ,CAAb,CACA,CAAA4I,CAAAjD,YAAA,CAAc3F,CAAd,CAPF,CAHe,CAAjB,CAHW,CAuBb,EAAA,UAAA,EAAA,CAAAsJ,QAAU,CAAC7J,CAAD,CAAW,CAGC+J,QAAA,EAAA,CAAAlG,CAAA,CAAK,CACvB,GAAIA,CAAJ,CAAQmG,CAAR,CAAW,CAKT,IAAMC,EAAIC,CAAA,CAAGrG,CAAH,CAAV,CACMhB,EACH7D,QAAA8D,cAAA,CAAuB,QAAvB,CAEHmH,EAAAlB,gBAAA,CA1OqBK,mBA0OrB,CACA9I,EAAA,CAAQ2J,CAAAlH,WAAR,CAAsB,QAAA,CAAAC,CAAA,CAAQ,CAAA,MAAAH,EAAAI,aAAA,CAAmBD,CAAAE,KAAnB,CAA8BF,CAAAG,MAA9B,CAAA,CAA9B,CAEAY;CAAA,CAAgBlB,CAChBoH,EAAAtK,WAAA0D,aAAA,CAA0BR,CAA1B,CAAiCoH,CAAjC,CACAzJ,EAAA,CAAkBqC,CAAlB,CAAyB,QAAA,EAAM,CAC7BkB,CAAA,CAAgB,IAChBgG,EAAA,CAAYlG,CAAZ,CAAgB,CAAhB,CAF6B,CAA/B,CAdS,CAAX,IAmBE7D,EAAA,EApBqB,CAFzB,IAAMkK,EAAKhK,CAAA,CAAIlB,QAAJ,CA1NgBmL,2BA0NhB,CAAX,CACMH,EAAIE,CAAA7J,OAwBV0J,EAAA,CAAY,CAAZ,CA1BmB,CAiCrB,EAAA,UAAA,EAAA,CAAAH,QAAa,CAAC5J,CAAD,CAAW,CACtB,IAAMkK,EACHhK,CAAA,CAAIlB,QAAJ,CA1PuBoL,kEA0PvB,CADH,CAEIhK,EAAU8J,CAAA7J,OACd,IAAKD,CAAL,CAAA,CASA,IAAMiK,EAAYjJ,CAAZiJ,EAAoB,CAAC,CAACrL,QAAA8J,cAAA,CAnRHwB,iDAmRG,CAC5BhK,EAAA,CAAQ4J,CAAR,CAAY,QAAA,CAAAD,CAAA,CAAK,CAEfzJ,CAAA,CAAkByJ,CAAlB,CAAqB,QAAA,EAAM,CACzBA,CAAAlB,gBAAA,CA/QqBK,mBA+QrB,CACkB,EAAlB,GAAI,EAAEhJ,CAAN,EACEJ,CAAA,EAHuB,CAA3B,CAQA,IAAIqK,CAAJ,EAAiBJ,CAAAtK,WAAjB,GAAkCX,QAAAmD,KAAlC,CAAiD,CAE/C,IAAMoI,EAAcvL,QAAA8D,cAAA,CAAuBmH,CAAAjJ,UAAvB,CAEpBuJ;CAAA,iBAAA,CAAkCN,CAElCM,EAAAtH,aAAA,CAAyB,MAAzB,CAAiC,oBAAjC,CAEAgH,EAAAtK,WAAA6K,aAAA,CAA0BD,CAA1B,CAAuCN,CAAAQ,YAAvC,CAEA,KADIC,CACJ,CADiBpL,CAAA,CAAiB2K,CAAjB,CACjB,CAAOS,CAAP,EAAqBpL,CAAA,CAAiBoL,CAAjB,CAArB,CAAA,CACEA,CAAA,CAAapL,CAAA,CAAiBoL,CAAjB,CAEXA,EAAA/K,WAAJ,GAA8BX,QAAAmD,KAA9B,GACEuI,CADF,CACe,IADf,CAGA1L,SAAAmD,KAAAqI,aAAA,CAA2BP,CAA3B,CAA8BS,CAA9B,CAEAT,EAAAlB,gBAAA,CAAkB,MAAlB,CAlB+C,CAVlC,CAAjB,CAVA,CAAA,IACE/I,EAAA,EALoB,CAkDxB,EAAA,UAAA,EAAA,CAAA2J,QAAU,EAAG,CAAA,IAAA,EAAA,IAIXrJ,EAAA,CAFGJ,CAAA+I,CAAIjK,QAAJiK,CA/TgBpJ,kBA+ThBoJ,CAEH,CAAY,QAAA,CAAAE,CAAA,CAAK,CAAA,MAAA,EAAAb,EAAA,CAAuBa,CAAvB,CAAA,CAAjB,CAA4C,CAAA,CAA5C,CAJW,CAWb,EAAA,UAAA,EAAA,CAAAb,QAAiB,CAACxE,CAAD,CAAO,CAEjBA,CAAA,SAAL,GACEA,CAAA,SAIA,CAJmB,CAAA,CAInB,CAFAA,CAAA6G,OAEA,GAFgB7G,CAAA6G,OAAAhK,WAEhB,CAFyC,UAEzC,EAAAmD,CAAA8G,cAAA,CAAmBlM,CAAA,CADDoF,CAAA6G,OAAAE,CAAc,MAAdA,CAAuB,OACtB,CAA0B,CAC3C1L,QAAS,CAAA,CADkC,CAE3CC,WAAY,CAAA,CAF+B;AAG3CC,OAAQmG,IAAAA,EAHmC,CAA1B,CAAnB,CALF,CAFsB,CAkBxB,EAAA,UAAA,EAAA,CAAAvD,QAAe,CAAC6I,CAAD,CAAY,CAAA,IAAA,EAAA,IACzBxK,EAAA,CAAQwK,CAAR,CAAmB,QAAA,CAAA9I,CAAA,CAAK,CAAA,MAAA1B,EAAA,CAAQ0B,CAAA+I,WAAR,CAAsB,QAAA,CAAAC,CAAA,CAAQ,CAChDA,CAAJ,EAAYA,CAAA1J,SAAZ,GAA8BC,IAAAC,aAA9B,GAEM1B,CAAA,CAAakL,CAAb,CAAJ,CACE,CAAA3C,EAAA,CAAkD2C,CAAlD,CADF,CAGE,CAAA1I,YAAA,CAA2C0I,CAA3C,CALJ,CADoD,CAA9B,CAAA,CAAxB,CADyB,CAmI7B,KAAIC,EAAW,IAqBf,IAAIzL,CAAJ,CAOEc,CAAA,CADGJ,CAAAgL,CAAIlM,QAAJkM,CAxfkBrL,kBAwflBqL,CACH,CAAc,QAAA,CAAA3K,CAAA,CAAO,CACdA,CAAAoK,OAAL,EAA6C,SAA7C,GAAmBpK,CAAAoK,OAAAhK,WAAnB,GACEJ,CAAA,SADF,CACoB,CAAA,CADpB,CADmB,CAArB,CAgBA,CAPMY,CAON,CAPsBA,QAAA,CAAApC,CAAA,CAAS,CACvBiM,CAAAA,CAAgCjM,CAAAoM,OAClCrL,EAAA,CAAakL,CAAb,CAAJ,GACEA,CAAA,SADF,CACqB,CAAA,CADrB,CAF6B,CAO/B,CADAhM,QAAA8B,iBAAA,CAA0B,MAA1B,CAAkCK,CAAlC,CAAiD,CAAA,CAAjD,CACA,CAAAnC,QAAA8B,iBAAA,CAA0B,OAA1B,CAAmCK,CAAnC,CAAkD,CAAA,CAAlD,CAvBF,KAwBO,CAML,IAAMiK,EAAiBpH,MAAAqH,yBAAA,CAAgC9J,IAAA+J,UAAhC,CAAgD,SAAhD,CAGvBtH,OAAAC,eAAA,CAAsBqH,CADR,CAACF,CAADG;AAAmBH,CAAAhH,aAAnBmH,CAAiDhK,IAAjDgK,CAAwDC,OAChDF,WAAtB,CAAuC,SAAvC,CAAkD,CAChD,IAAApH,QAAG,EAAG,CACJ,IAAMuH,EAA2C3L,CAAA,CAAa,IAAb,CAAA,CAAqB,IAArB,CAA4BR,CAAA,CAAiB,IAAjB,CAC7E,OAAImM,EAAJ,CAAqBA,CAAA9G,KAArB,CAEIyG,CAAJ,EAAsBA,CAAAlH,IAAtB,CAAiDkH,CAAAlH,IAAAwH,KAAA,CAAwB,IAAxB,CAAjD,CAGO/G,CADsC3F,QAAA8J,cAAApE,CAAuB,MAAvBA,CACtCC,EAAS9F,MAAA4I,SAAT9C,MAPH,CAD0C,CAUhDP,aAAc,CAAA,CAVkC,CAWhDuH,WAAY,CAAA,CAXoC,CAAlD,CAeA3H,OAAAC,eAAA,CAAsB2H,eAAAN,UAAtB,CAAiD,QAAjD,CAA2D,CACzD,IAAApH,QAAG,EAAG,CACJ,MAAuC,KAAD,SAAtC,EAA4D,IADxD,CADmD,CAIzDE,aAAc,CAAA,CAJ2C,CAKzDuH,WAAY,CAAA,CAL6C,CAA3D,CAQAlL,EAAA,CAAkB,QAAA,EAAM,CACtBwK,CAAA,CAAW,IAAItJ,CADO,CAAxB,CAhCK,CAgDPZ,CAAA,CAAU,QAAA,EAAM,CAAA,MAAA/B,SAAA4L,cAAA,CAAuBlM,CAAA,CAAe,mBAAf,CAAoC,CACzEU,WAAY,CAAA,CAD6D,CAEzED,QAAS,CAAA,CAFgE,CAGzEE,OAAQmG,IAAAA,EAHiE,CAApC,CAAvB,CAAA,CAAhB,CAOA/G,EAAAe,UAAA,CAAkBA,CAClBf;CAAAsC,UAAA,CAAkBA,CAClBtC,EAAAa,iBAAA,CAAyBA,CACzBb,EAAA6D,YAAA,CAjGoBA,QAAA,CAAC5C,CAAD,CAAS,CACvBuL,CAAJ,EACEA,CAAA3I,YAAA,CAAqB5C,CAArB,CAFyB,CAhqBrB,CAAT,CAAD,CAmwBGb,MAAAgN,YAnwBH,CAmwByBhN,MAAAgN,YAnwBzB,EAmwB+C,EAnwB/C,C;;;;;;;;;ACGA,IAAIC,EAAiBjN,MAAA,eAArB,CACIgN,EAAchN,MAAA,YADlB,CAEIkN,EAAWlN,MAAA,oBAIfA,OAAAmN,cAAA,CAAuBnN,MAAAmN,cAAvB,EAA+C,EAE/C,IAAIF,CAAJ,EAAsBA,CAAA,0BAAtB,CAAmE,CAGjE,IAAIG,CAAJ,CACIC,EAAsBA,QAA4B,EAAG,CACvD,GAAID,CAAJ,CAAmB,CAEbF,CAAAI,EAAJ,EACEJ,CAAAI,EAAA,CAAmBtN,MAAAG,SAAnB,CAEF,KAAIoN,EAAKH,CACTA,EAAA,CAAgB,IAChBG,EAAA,EACA,OAAO,CAAA,CARU,CADoC,CADzD,CAaIC,EAAgBR,CAAA,UACpBC,EAAA,0BAAA,CAA4C,QAAQ,CAACM,CAAD,CAAK,CACvDH,CAAA,CAAgBG,CAChBC,EAAA,CAAcH,CAAd,CAFuD,CAAzD,CAKAL,EAAA,UAAA,CAA2B,QAAQ,CAACO,CAAD,CAAK,CACtCC,CAAA,CAAc,QAAQ,EAAG,CAInBH,CAAA,EAAJ,CACEL,CAAA,UAAA,CAAyBO,CAAzB,CADF,CAGEA,CAAA,EAPqB,CAAzB,CADsC,CAtByB;AAqCnEP,CAAA,UAAA,CAAyB,QAAQ,EAAG,CAClCS,qBAAA,CAAsB,QAAQ,EAAG,CAC/BzN,MAAAmN,cAAAO,MAAA,CAA6B,CAAA,CAC7BvN,SAAA4L,cAAA,CAAuB,IAAI9L,WAAJ,CAAgB,oBAAhB,CAAsC,CAACK,QAAS,CAAA,CAAV,CAAtC,CAAvB,CAF+B,CAAjC,CADkC,CAApC,C,CCrCA,IAAIqN,EAAQxN,QAAA8D,cAAA,CAAuB,OAAvB,CACZ0J,EAAApJ,YAAA,CAAoB,sIAQpB,KAAIjB,EAAOnD,QAAA8J,cAAA,CAAuB,MAAvB,CACX3G,EAAAqI,aAAA,CAAkBgC,CAAlB,CAAyBrK,CAAAjB,WAAzB,C","file":"webcomponents-hi.js","sourcesContent":["/**\n * @license\n * Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(scope => {\n\n /********************* base setup *********************/\n const link = document.createElement('link');\n const useNative = Boolean('import' in link);\n const emptyNodeList = link.querySelectorAll('*');\n\n // Polyfill `currentScript` for browsers without it.\n let currentScript = null;\n if ('currentScript' in document === false) {\n Object.defineProperty(document, 'currentScript', {\n get() {\n return currentScript ||\n // NOTE: only works when called in synchronously executing code.\n // readyState should check if `loading` but IE10 is\n // interactive when scripts run so we cheat. This is not needed by\n // html-imports polyfill but helps generally polyfill `currentScript`.\n (document.readyState !== 'complete' ?\n document.scripts[document.scripts.length - 1] : null);\n },\n configurable: true\n });\n }\n\n /**\n * @param {Array|NodeList|NamedNodeMap} list\n * @param {!Function} callback\n * @param {boolean=} inverseOrder\n */\n const forEach = (list, callback, inverseOrder) => {\n const length = list ? list.length : 0;\n const increment = inverseOrder ? -1 : 1;\n let i = inverseOrder ? length - 1 : 0;\n for (; i < length && i >= 0; i = i + increment) {\n callback(list[i], i);\n }\n };\n\n /**\n * @param {!Node} node\n * @param {!string} selector\n * @return {!NodeList<!Element>}\n */\n const QSA = (node, selector) => {\n // IE 11 throws a SyntaxError if a node with no children is queried with\n // a selector containing the `:not([type])` syntax.\n if (!node.childNodes.length) {\n return emptyNodeList;\n }\n return node.querySelectorAll(selector);\n };\n\n /**\n * @param {!DocumentFragment} fragment\n */\n const replaceScripts = (fragment) => {\n forEach(QSA(fragment, 'template'), template => {\n forEach(QSA(template.content, scriptsSelector), script => {\n const clone = /** @type {!HTMLScriptElement} */\n (document.createElement('script'));\n forEach(script.attributes, attr => clone.setAttribute(attr.name, attr.value));\n clone.textContent = script.textContent;\n script.parentNode.replaceChild(clone, script);\n });\n replaceScripts(template.content);\n });\n };\n\n /********************* path fixup *********************/\n const CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\n const CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n const STYLESHEET_REGEXP = /(<link[^>]*)(rel=['|\"]?stylesheet['|\"]?[^>]*>)/g;\n\n // path fixup: style elements in imports must be made relative to the main\n // document. We fixup url's in url() and @import.\n const Path = {\n\n fixUrls(element, base) {\n if (element.href) {\n element.setAttribute('href',\n Path.resolveUrl(element.getAttribute('href'), base));\n }\n if (element.src) {\n element.setAttribute('src',\n Path.resolveUrl(element.getAttribute('src'), base));\n }\n if (element.localName === 'style') {\n const r = Path.replaceUrls(element.textContent, base, CSS_URL_REGEXP);\n element.textContent = Path.replaceUrls(r, base, CSS_IMPORT_REGEXP);\n }\n },\n\n replaceUrls(text, linkUrl, regexp) {\n return text.replace(regexp, (m, pre, url, post) => {\n let urlPath = url.replace(/[\"']/g, '');\n if (linkUrl) {\n urlPath = Path.resolveUrl(urlPath, linkUrl);\n }\n return pre + '\\'' + urlPath + '\\'' + post;\n });\n },\n\n resolveUrl(url, base) {\n // Lazy feature detection.\n if (Path.__workingURL === undefined) {\n Path.__workingURL = false;\n try {\n const u = new URL('b', 'http://a');\n u.pathname = 'c%20d';\n Path.__workingURL = (u.href === 'http://a/c%20d');\n } catch (e) {}\n }\n\n if (Path.__workingURL) {\n return (new URL(url, base)).href;\n }\n\n // Fallback to creating an anchor into a disconnected document.\n let doc = Path.__tempDoc;\n if (!doc) {\n doc = document.implementation.createHTMLDocument('temp');\n Path.__tempDoc = doc;\n doc.__base = doc.createElement('base');\n doc.head.appendChild(doc.__base);\n doc.__anchor = doc.createElement('a');\n }\n doc.__base.href = base;\n doc.__anchor.href = url;\n return doc.__anchor.href || url;\n }\n };\n\n /********************* Xhr processor *********************/\n const Xhr = {\n\n async: true,\n\n /**\n * @param {!string} url\n * @param {!function(!string, string=)} success\n * @param {!function(!string)} fail\n */\n load(url, success, fail) {\n if (!url) {\n fail('error: href must be specified');\n } else if (url.match(/^data:/)) {\n // Handle Data URI Scheme\n const pieces = url.split(',');\n const header = pieces[0];\n let resource = pieces[1];\n if (header.indexOf(';base64') > -1) {\n resource = atob(resource);\n } else {\n resource = decodeURIComponent(resource);\n }\n success(resource);\n } else {\n const request = new XMLHttpRequest();\n request.open('GET', url, Xhr.async);\n request.onload = () => {\n // Servers redirecting an import can add a Location header to help us\n // polyfill correctly. Handle relative and full paths.\n // Prefer responseURL which already resolves redirects\n // https://xhr.spec.whatwg.org/#the-responseurl-attribute\n let redirectedUrl = request.responseURL || request.getResponseHeader('Location');\n if (redirectedUrl && redirectedUrl.indexOf('/') === 0) {\n // In IE location.origin might not work\n // https://connect.microsoft.com/IE/feedback/details/1763802/location-origin-is-undefined-in-ie-11-on-windows-10-but-works-on-windows-7\n const origin = (location.origin || location.protocol + '//' + location.host);\n redirectedUrl = origin + redirectedUrl;\n }\n const resource = /** @type {string} */ (request.response || request.responseText);\n if (request.status === 304 || request.status === 0 ||\n request.status >= 200 && request.status < 300) {\n success(resource, redirectedUrl);\n } else {\n fail(resource);\n }\n };\n request.send();\n }\n }\n };\n\n /********************* importer *********************/\n\n const isIE = /Trident/.test(navigator.userAgent) ||\n /Edge\\/\\d./i.test(navigator.userAgent);\n\n const importSelector = 'link[rel=import]';\n\n // Used to disable loading of resources.\n const importDisableType = 'import-disable';\n\n const disabledLinkSelector = `link[rel=stylesheet][href][type=${importDisableType}]`;\n\n const scriptsSelector = `script:not([type]),script[type=\"application/javascript\"],` +\n `script[type=\"text/javascript\"]`;\n\n const importDependenciesSelector = `${importSelector},${disabledLinkSelector},` +\n `style:not([type]),link[rel=stylesheet][href]:not([type]),` + scriptsSelector;\n\n const importDependencyAttr = 'import-dependency';\n\n const rootImportSelector = `${importSelector}:not([${importDependencyAttr}])`;\n\n const pendingScriptsSelector = `script[${importDependencyAttr}]`;\n\n const pendingStylesSelector = `style[${importDependencyAttr}],` +\n `link[rel=stylesheet][${importDependencyAttr}]`;\n\n /**\n * Importer will:\n * - load any linked import documents (with deduping)\n * - whenever an import is loaded, prompt the parser to try to parse\n * - observe imported documents for new elements (these are handled via the\n * dynamic importer)\n */\n class Importer {\n constructor() {\n this.documents = {};\n // Used to keep track of pending loads, so that flattening and firing of\n // events can be done when all resources are ready.\n this.inflight = 0;\n this.dynamicImportsMO = new MutationObserver(m => this.handleMutations(m));\n // Observe changes on <head>.\n this.dynamicImportsMO.observe(document.head, {\n childList: true,\n subtree: true\n });\n // 1. Load imports contents\n // 2. Assign them to first import links on the document\n // 3. Wait for import styles & scripts to be done loading/running\n // 4. Fire load/error events\n this.loadImports(document);\n }\n\n /**\n * @param {!(HTMLDocument|DocumentFragment|Element)} doc\n */\n loadImports(doc) {\n const links = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(doc, importSelector));\n forEach(links, link => this.loadImport(link));\n }\n\n /**\n * @param {!HTMLLinkElement} link\n */\n loadImport(link) {\n const url = link.href;\n // This resource is already being handled by another import.\n if (this.documents[url] !== undefined) {\n // If import is already loaded, we can safely associate it to the link\n // and fire the load/error event.\n const imp = this.documents[url];\n if (imp && imp['__loaded']) {\n link['__import'] = imp;\n this.fireEventIfNeeded(link);\n }\n return;\n }\n this.inflight++;\n // Mark it as pending to notify others this url is being loaded.\n this.documents[url] = 'pending';\n Xhr.load(url, (resource, redirectedUrl) => {\n const doc = this.makeDocument(resource, redirectedUrl || url);\n this.documents[url] = doc;\n this.inflight--;\n // Load subtree.\n this.loadImports(doc);\n this.processImportsIfLoadingDone();\n }, () => {\n // If load fails, handle error.\n this.documents[url] = null;\n this.inflight--;\n this.processImportsIfLoadingDone();\n });\n }\n\n /**\n * Creates a new document containing resource and normalizes urls accordingly.\n * @param {string=} resource\n * @param {string=} url\n * @return {!DocumentFragment}\n */\n makeDocument(resource, url) {\n if (!resource) {\n return document.createDocumentFragment();\n }\n\n if (isIE) {\n // <link rel=stylesheet> should be appended to <head>. Not doing so\n // in IE/Edge breaks the cascading order. We disable the loading by\n // setting the type before setting innerHTML to avoid loading\n // resources twice.\n resource = resource.replace(STYLESHEET_REGEXP, (match, p1, p2) => {\n if (match.indexOf('type=') === -1) {\n return `${p1} type=${importDisableType} ${p2}`;\n }\n return match;\n });\n }\n\n let content;\n const template = /** @type {!HTMLTemplateElement} */\n (document.createElement('template'));\n template.innerHTML = resource;\n if (template.content) {\n content = template.content;\n // Clone scripts inside templates since they won't execute when the\n // hosting template is cloned.\n replaceScripts(content);\n } else {\n // <template> not supported, create fragment and move content into it.\n content = document.createDocumentFragment();\n while (template.firstChild) {\n content.appendChild(template.firstChild);\n }\n }\n\n // Support <base> in imported docs. Resolve url and remove its href.\n const baseEl = content.querySelector('base');\n if (baseEl) {\n url = Path.resolveUrl(baseEl.getAttribute('href'), url);\n baseEl.removeAttribute('href');\n }\n\n const n$ = /** @type {!NodeList<!(HTMLLinkElement|HTMLScriptElement|HTMLStyleElement)>} */\n (QSA(content, importDependenciesSelector));\n // For source map hints.\n let inlineScriptIndex = 0;\n forEach(n$, n => {\n // Listen for load/error events, then fix urls.\n whenElementLoaded(n);\n Path.fixUrls(n, url);\n // Mark for easier selectors.\n n.setAttribute(importDependencyAttr, '');\n // Generate source map hints for inline scripts.\n if (n.localName === 'script' && !n.src && n.textContent) {\n const num = inlineScriptIndex ? `-${inlineScriptIndex}` : '';\n const content = n.textContent + `\\n//# sourceURL=${url}${num}.js\\n`;\n // We use the src attribute so it triggers load/error events, and it's\n // easier to capture errors (e.g. parsing) like this.\n n.setAttribute('src', 'data:text/javascript;charset=utf-8,' + encodeURIComponent(content));\n n.textContent = '';\n inlineScriptIndex++;\n }\n });\n return content;\n }\n\n /**\n * Waits for loaded imports to finish loading scripts and styles, then fires\n * the load/error events.\n */\n processImportsIfLoadingDone() {\n // Wait until all resources are ready, then load import resources.\n if (this.inflight) return;\n\n // Stop observing, flatten & load resource, then restart observing <head>.\n this.dynamicImportsMO.disconnect();\n this.flatten(document);\n // We wait for styles to load, and at the same time we execute the scripts,\n // then fire the load/error events for imports to have faster whenReady\n // callback execution.\n // NOTE: This is different for native behavior where scripts would be\n // executed after the styles before them are loaded.\n // To achieve that, we could select pending styles and scripts in the\n // document and execute them sequentially in their dom order.\n let scriptsOk = false,\n stylesOk = false;\n const onLoadingDone = () => {\n if (stylesOk && scriptsOk) {\n // Catch any imports that might have been added while we\n // weren't looking, wait for them as well.\n this.loadImports(document);\n if (this.inflight) return;\n\n // Restart observing.\n this.dynamicImportsMO.observe(document.head, {\n childList: true,\n subtree: true\n });\n this.fireEvents();\n }\n }\n this.waitForStyles(() => {\n stylesOk = true;\n onLoadingDone();\n });\n this.runScripts(() => {\n scriptsOk = true;\n onLoadingDone();\n });\n }\n\n /**\n * @param {!HTMLDocument} doc\n */\n flatten(doc) {\n const n$ = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(doc, importSelector));\n forEach(n$, n => {\n const imp = this.documents[n.href];\n n['__import'] = /** @type {!Document} */ (imp);\n if (imp && imp.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n // We set the .import to be the link itself, and update its readyState.\n // Other links with the same href will point to this link.\n this.documents[n.href] = n;\n n.readyState = 'loading';\n n['__import'] = n;\n this.flatten(imp);\n n.appendChild(imp);\n }\n });\n }\n\n /**\n * Replaces all the imported scripts with a clone in order to execute them.\n * Updates the `currentScript`.\n * @param {!function()} callback\n */\n runScripts(callback) {\n const s$ = QSA(document, pendingScriptsSelector);\n const l = s$.length;\n const cloneScript = i => {\n if (i < l) {\n // The pending scripts have been generated through innerHTML and\n // browsers won't execute them for security reasons. We cannot use\n // s.cloneNode(true) either, the only way to run the script is manually\n // creating a new element and copying its attributes.\n const s = s$[i];\n const clone = /** @type {!HTMLScriptElement} */\n (document.createElement('script'));\n // Remove import-dependency attribute to avoid double cloning.\n s.removeAttribute(importDependencyAttr);\n forEach(s.attributes, attr => clone.setAttribute(attr.name, attr.value));\n // Update currentScript and replace original with clone script.\n currentScript = clone;\n s.parentNode.replaceChild(clone, s);\n whenElementLoaded(clone, () => {\n currentScript = null;\n cloneScript(i + 1);\n });\n } else {\n callback();\n }\n };\n cloneScript(0);\n }\n\n /**\n * Waits for all the imported stylesheets/styles to be loaded.\n * @param {!function()} callback\n */\n waitForStyles(callback) {\n const s$ = /** @type {!NodeList<!(HTMLLinkElement|HTMLStyleElement)>} */\n (QSA(document, pendingStylesSelector));\n let pending = s$.length;\n if (!pending) {\n callback();\n return;\n }\n // <link rel=stylesheet> should be appended to <head>. Not doing so\n // in IE/Edge breaks the cascading order\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/10472273/\n // If there is one <link rel=stylesheet> imported, we must move all imported\n // links and styles to <head>.\n const needsMove = isIE && !!document.querySelector(disabledLinkSelector);\n forEach(s$, s => {\n // Listen for load/error events, remove selector once is done loading.\n whenElementLoaded(s, () => {\n s.removeAttribute(importDependencyAttr);\n if (--pending === 0) {\n callback();\n }\n });\n // Check if was already moved to head, to handle the case where the element\n // has already been moved but it is still loading.\n if (needsMove && s.parentNode !== document.head) {\n // Replace the element we're about to move with a placeholder.\n const placeholder = document.createElement(s.localName);\n // Add reference of the moved element.\n placeholder['__appliedElement'] = s;\n // Disable this from appearing in document.styleSheets.\n placeholder.setAttribute('type', 'import-placeholder');\n // Append placeholder next to the sibling, and move original to <head>.\n s.parentNode.insertBefore(placeholder, s.nextSibling);\n let newSibling = importForElement(s);\n while (newSibling && importForElement(newSibling)) {\n newSibling = importForElement(newSibling);\n }\n if (newSibling.parentNode !== document.head) {\n newSibling = null;\n }\n document.head.insertBefore(s, newSibling);\n // Enable the loading of <link rel=stylesheet>.\n s.removeAttribute('type');\n }\n });\n }\n\n /**\n * Fires load/error events for imports in the right order .\n */\n fireEvents() {\n const n$ = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(document, importSelector));\n // Inverse order to have events firing bottom-up.\n forEach(n$, n => this.fireEventIfNeeded(n), true);\n }\n\n /**\n * Fires load/error event for the import if this wasn't done already.\n * @param {!HTMLLinkElement} link\n */\n fireEventIfNeeded(link) {\n // Don't fire twice same event.\n if (!link['__loaded']) {\n link['__loaded'] = true;\n // Update link's import readyState.\n link.import && (link.import.readyState = 'complete');\n const eventType = link.import ? 'load' : 'error';\n link.dispatchEvent(newCustomEvent(eventType, {\n bubbles: false,\n cancelable: false,\n detail: undefined\n }));\n }\n }\n\n /**\n * @param {Array<MutationRecord>} mutations\n */\n handleMutations(mutations) {\n forEach(mutations, m => forEach(m.addedNodes, elem => {\n if (elem && elem.nodeType === Node.ELEMENT_NODE) {\n // NOTE: added scripts are not updating currentScript in IE.\n if (isImportLink(elem)) {\n this.loadImport( /** @type {!HTMLLinkElement} */ (elem));\n } else {\n this.loadImports( /** @type {!Element} */ (elem));\n }\n }\n }));\n }\n }\n\n /**\n * @param {!Node} node\n * @return {boolean}\n */\n const isImportLink = node => {\n return node.nodeType === Node.ELEMENT_NODE && node.localName === 'link' &&\n ( /** @type {!HTMLLinkElement} */ (node).rel === 'import');\n };\n\n /**\n * Waits for an element to finish loading. If already done loading, it will\n * mark the element accordingly.\n * @param {!(HTMLLinkElement|HTMLScriptElement|HTMLStyleElement)} element\n * @param {function()=} callback\n */\n const whenElementLoaded = (element, callback) => {\n if (element['__loaded']) {\n callback && callback();\n } else if ((element.localName === 'script' && !element.src) ||\n (element.localName === 'style' && !element.firstChild)) {\n // Inline scripts and empty styles don't trigger load/error events,\n // consider them already loaded.\n element['__loaded'] = true;\n callback && callback();\n } else {\n const onLoadingDone = event => {\n element.removeEventListener(event.type, onLoadingDone);\n element['__loaded'] = true;\n callback && callback();\n };\n element.addEventListener('load', onLoadingDone);\n // NOTE: We listen only for load events in IE/Edge, because in IE/Edge\n // <style> with @import will fire error events for each failing @import,\n // and finally will trigger the load event when all @import are\n // finished (even if all fail).\n if (!isIE || element.localName !== 'style') {\n element.addEventListener('error', onLoadingDone);\n }\n }\n }\n\n /**\n * Calls the callback when all imports in the document at call time\n * (or at least document ready) have loaded. Callback is called synchronously\n * if imports are already done loading.\n * @param {function()=} callback\n */\n const whenReady = callback => {\n // 1. ensure the document is in a ready state (has dom), then\n // 2. watch for loading of imports and call callback when done\n whenDocumentReady(() => whenImportsReady(() => callback && callback()));\n }\n\n /**\n * Invokes the callback when document is in ready state. Callback is called\n * synchronously if document is already done loading.\n * @param {!function()} callback\n */\n const whenDocumentReady = callback => {\n const stateChanged = () => {\n // NOTE: Firefox can hit readystate interactive without document.body existing.\n // This is anti-spec, but we handle it here anyways by waiting for next change.\n if (document.readyState !== 'loading' && !!document.body) {\n document.removeEventListener('readystatechange', stateChanged);\n callback();\n }\n }\n document.addEventListener('readystatechange', stateChanged);\n stateChanged();\n }\n\n /**\n * Invokes the callback after all imports are loaded. Callback is called\n * synchronously if imports are already done loading.\n * @param {!function()} callback\n */\n const whenImportsReady = callback => {\n let imports = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(document, rootImportSelector));\n let pending = imports.length;\n if (!pending) {\n callback();\n return;\n }\n forEach(imports, imp => whenElementLoaded(imp, () => {\n if (--pending === 0) {\n callback();\n }\n }));\n }\n\n /**\n * Returns the import document containing the element.\n * @param {!Node} element\n * @return {HTMLLinkElement|Document|undefined}\n */\n const importForElement = element => {\n if (useNative) {\n // Return only if not in the main doc!\n return element.ownerDocument !== document ? element.ownerDocument : null;\n }\n let doc = element['__importDoc'];\n if (!doc && element.parentNode) {\n doc = /** @type {!Element} */ (element.parentNode);\n if (typeof doc.closest === 'function') {\n // Element.closest returns the element itself if it matches the selector,\n // so we search the closest import starting from the parent.\n doc = doc.closest(importSelector);\n } else {\n // Walk up the parent tree until we find an import.\n while (!isImportLink(doc) && (doc = doc.parentNode)) {}\n }\n element['__importDoc'] = doc;\n }\n return doc;\n }\n\n let importer = null;\n /**\n * Ensures imports contained in the element are imported.\n * Use this to handle dynamic imports attached to body.\n * @param {!(HTMLDocument|Element)} doc\n */\n const loadImports = (doc) => {\n if (importer) {\n importer.loadImports(doc);\n }\n };\n\n const newCustomEvent = (type, params) => {\n if (typeof window.CustomEvent === 'function') {\n return new CustomEvent(type, params);\n }\n const event = /** @type {!CustomEvent} */ (document.createEvent('CustomEvent'));\n event.initCustomEvent(type, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);\n return event;\n };\n\n if (useNative) {\n // Check for imports that might already be done loading by the time this\n // script is actually executed. Native imports are blocking, so the ones\n // available in the document by this time should already have failed\n // or have .import defined.\n const imps = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(document, importSelector));\n forEach(imps, imp => {\n if (!imp.import || imp.import.readyState !== 'loading') {\n imp['__loaded'] = true;\n }\n });\n // Listen for load/error events to capture dynamically added scripts.\n /**\n * @type {!function(!Event)}\n */\n const onLoadingDone = event => {\n const elem = /** @type {!Element} */ (event.target);\n if (isImportLink(elem)) {\n elem['__loaded'] = true;\n }\n };\n document.addEventListener('load', onLoadingDone, true /* useCapture */ );\n document.addEventListener('error', onLoadingDone, true /* useCapture */ );\n } else {\n // Override baseURI so that imported elements' baseURI can be used seemlessly\n // on native or polyfilled html-imports.\n // NOTE: a <link rel=import> will have `link.baseURI === link.href`, as the link\n // itself is used as the `import` document.\n /** @type {Object|undefined} */\n const native_baseURI = Object.getOwnPropertyDescriptor(Node.prototype, 'baseURI');\n // NOTE: if not configurable (e.g. safari9), set it on the Element prototype. \n const klass = !native_baseURI || native_baseURI.configurable ? Node : Element;\n Object.defineProperty(klass.prototype, 'baseURI', {\n get() {\n const ownerDoc = /** @type {HTMLLinkElement} */ (isImportLink(this) ? this : importForElement(this));\n if (ownerDoc) return ownerDoc.href;\n // Use native baseURI if possible.\n if (native_baseURI && native_baseURI.get) return native_baseURI.get.call(this);\n // Polyfill it if not available.\n const base = /** @type {HTMLBaseElement} */ (document.querySelector('base'));\n return (base || window.location).href;\n },\n configurable: true,\n enumerable: true\n });\n\n // Define 'import' read-only property.\n Object.defineProperty(HTMLLinkElement.prototype, 'import', {\n get() {\n return /** @type {HTMLLinkElement} */ (this)['__import'] || null;\n },\n configurable: true,\n enumerable: true\n });\n\n whenDocumentReady(() => {\n importer = new Importer()\n });\n }\n\n /**\n Add support for the `HTMLImportsLoaded` event and the `HTMLImports.whenReady`\n method. This api is necessary because unlike the native implementation,\n script elements do not force imports to resolve. Instead, users should wrap\n code in either an `HTMLImportsLoaded` handler or after load time in an\n `HTMLImports.whenReady(callback)` call.\n\n NOTE: This module also supports these apis under the native implementation.\n Therefore, if this file is loaded, the same code can be used under both\n the polyfill and native implementation.\n */\n whenReady(() => document.dispatchEvent(newCustomEvent('HTMLImportsLoaded', {\n cancelable: true,\n bubbles: true,\n detail: undefined\n })));\n\n // exports\n scope.useNative = useNative;\n scope.whenReady = whenReady;\n scope.importForElement = importForElement;\n scope.loadImports = loadImports;\n\n})(window.HTMLImports = (window.HTMLImports || {}));","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n'use strict';\n\nlet customElements = window['customElements'];\nlet HTMLImports = window['HTMLImports'];\nlet Template = window['HTMLTemplateElement'];\n\n// global for (1) existence means `WebComponentsReady` will file,\n// (2) WebComponents.ready == true means event has fired.\nwindow.WebComponents = window.WebComponents || {};\n\nif (customElements && customElements['polyfillWrapFlushCallback']) {\n // Here we ensure that the public `HTMLImports.whenReady`\n // always comes *after* custom elements have upgraded.\n let flushCallback;\n let runAndClearCallback = function runAndClearCallback() {\n if (flushCallback) {\n // make sure to run the HTMLTemplateElement polyfill before custom elements upgrade\n if (Template.bootstrap) {\n Template.bootstrap(window.document);\n }\n let cb = flushCallback;\n flushCallback = null;\n cb();\n return true;\n }\n }\n let origWhenReady = HTMLImports['whenReady'];\n customElements['polyfillWrapFlushCallback'](function(cb) {\n flushCallback = cb;\n origWhenReady(runAndClearCallback);\n });\n\n HTMLImports['whenReady'] = function(cb) {\n origWhenReady(function() {\n // custom element code may add dynamic imports\n // to match processing of native custom elements before\n // domContentLoaded, we wait for these imports to resolve first.\n if (runAndClearCallback()) {\n HTMLImports['whenReady'](cb);\n } else {\n cb();\n }\n });\n }\n\n}\n\nHTMLImports['whenReady'](function() {\n requestAnimationFrame(function() {\n window.WebComponents.ready = true;\n document.dispatchEvent(new CustomEvent('WebComponentsReady', {bubbles: true}));\n });\n});","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n'use strict';\n// It's desireable to provide a default stylesheet\n// that's convenient for styling unresolved elements, but\n// it's cumbersome to have to include this manually in every page.\n// It would make sense to put inside some HTMLImport but\n// the HTMLImports polyfill does not allow loading of stylesheets\n// that block rendering. Therefore this injection is tolerated here.\n//\n// NOTE: position: relative fixes IE's failure to inherit opacity\n// when a child is not statically positioned.\nlet style = document.createElement('style');\nstyle.textContent = ''\n + 'body {'\n + 'transition: opacity ease-in 0.2s;'\n + ' } \\n'\n + 'body[unresolved] {'\n + 'opacity: 0; display: block; overflow: hidden; position: relative;'\n + ' } \\n'\n ;\nlet head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);"]} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-lite.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-lite.js
new file mode 100644
index 00000000000..bf73f0734dd
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-lite.js
@@ -0,0 +1,221 @@
+/**
+@license @nocompile
+Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+(function(){/*
+
+ Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ Code distributed by Google as part of the polymer project is also
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+'use strict';var p,q="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this,da="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)};function ea(){ea=function(){};q.Symbol||(q.Symbol=fa)}var fa=function(){var a=0;return function(b){return"jscomp_symbol_"+(b||"")+a++}}();
+function ha(){ea();var a=q.Symbol.iterator;a||(a=q.Symbol.iterator=q.Symbol("iterator"));"function"!=typeof Array.prototype[a]&&da(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return ia(this)}});ha=function(){}}function ia(a){var b=0;return la(function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}})}function la(a){ha();a={next:a};a[q.Symbol.iterator]=function(){return this};return a}function ma(a){ha();var b=a[Symbol.iterator];return b?b.call(a):ia(a)}
+function na(a){for(var b,c=[];!(b=a.next()).done;)c.push(b.value);return c}
+(function(){if(!function(){var a=document.createEvent("Event");a.initEvent("foo",!0,!0);a.preventDefault();return a.defaultPrevented}()){var a=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(a.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var b=/Trident/.test(navigator.userAgent);if(!window.CustomEvent||b&&"function"!==typeof window.CustomEvent)window.CustomEvent=function(a,b){b=b||{};var c=document.createEvent("CustomEvent");
+c.initCustomEvent(a,!!b.bubbles,!!b.cancelable,b.detail);return c},window.CustomEvent.prototype=window.Event.prototype;if(!window.Event||b&&"function"!==typeof window.Event){var c=window.Event;window.Event=function(a,b){b=b||{};var c=document.createEvent("Event");c.initEvent(a,!!b.bubbles,!!b.cancelable);return c};if(c)for(var d in c)window.Event[d]=c[d];window.Event.prototype=c.prototype}if(!window.MouseEvent||b&&"function"!==typeof window.MouseEvent){b=window.MouseEvent;window.MouseEvent=function(a,
+b){b=b||{};var c=document.createEvent("MouseEvent");c.initMouseEvent(a,!!b.bubbles,!!b.cancelable,b.view||window,b.detail,b.screenX,b.screenY,b.clientX,b.clientY,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b.button,b.relatedTarget);return c};if(b)for(d in b)window.MouseEvent[d]=b[d];window.MouseEvent.prototype=b.prototype}Array.from||(Array.from=function(a){return[].slice.call(a)});Object.assign||(Object.assign=function(a,b){for(var c=[].slice.call(arguments,1),d=0,e;d<c.length;d++)if(e=c[d])for(var f=
+a,m=e,n=Object.getOwnPropertyNames(m),t=0;t<n.length;t++)e=n[t],f[e]=m[e];return a})})(window.WebComponents);(function(){function a(){}function b(a,b){if(!a.childNodes.length)return[];switch(a.nodeType){case Node.DOCUMENT_NODE:return t.call(a,b);case Node.DOCUMENT_FRAGMENT_NODE:return C.call(a,b);default:return n.call(a,b)}}var c="undefined"===typeof HTMLTemplateElement,d=!(document.createDocumentFragment().cloneNode()instanceof DocumentFragment),e=!1;/Trident/.test(navigator.userAgent)&&function(){function a(a,b){if(a instanceof DocumentFragment)for(var d;d=a.firstChild;)c.call(this,d,b);else c.call(this,
+a,b);return a}e=!0;var b=Node.prototype.cloneNode;Node.prototype.cloneNode=function(a){a=b.call(this,a);this instanceof DocumentFragment&&(a.__proto__=DocumentFragment.prototype);return a};DocumentFragment.prototype.querySelectorAll=HTMLElement.prototype.querySelectorAll;DocumentFragment.prototype.querySelector=HTMLElement.prototype.querySelector;Object.defineProperties(DocumentFragment.prototype,{nodeType:{get:function(){return Node.DOCUMENT_FRAGMENT_NODE},configurable:!0},localName:{get:function(){},
+configurable:!0},nodeName:{get:function(){return"#document-fragment"},configurable:!0}});var c=Node.prototype.insertBefore;Node.prototype.insertBefore=a;var d=Node.prototype.appendChild;Node.prototype.appendChild=function(b){b instanceof DocumentFragment?a.call(this,b,null):d.call(this,b);return b};var f=Node.prototype.removeChild,h=Node.prototype.replaceChild;Node.prototype.replaceChild=function(b,c){b instanceof DocumentFragment?(a.call(this,b,c),f.call(this,c)):h.call(this,b,c);return c};Document.prototype.createDocumentFragment=
+function(){var a=this.createElement("df");a.__proto__=DocumentFragment.prototype;return a};var g=Document.prototype.importNode;Document.prototype.importNode=function(a,b){b=g.call(this,a,b||!1);a instanceof DocumentFragment&&(b.__proto__=DocumentFragment.prototype);return b}}();var f=Node.prototype.cloneNode,h=Document.prototype.createElement,g=Document.prototype.importNode,k=Node.prototype.removeChild,l=Node.prototype.appendChild,m=Node.prototype.replaceChild,n=Element.prototype.querySelectorAll,
+t=Document.prototype.querySelectorAll,C=DocumentFragment.prototype.querySelectorAll,aa=function(){if(!c){var a=document.createElement("template"),b=document.createElement("template");b.content.appendChild(document.createElement("div"));a.content.appendChild(b);a=a.cloneNode(!0);return 0===a.content.childNodes.length||0===a.content.firstChild.content.childNodes.length||d}}();if(c){var P=document.implementation.createHTMLDocument("template"),Ka=!0,ba=document.createElement("style");ba.textContent="template{display:none;}";
+var La=document.head;La.insertBefore(ba,La.firstElementChild);a.prototype=Object.create(HTMLElement.prototype);var D=!document.createElement("div").hasOwnProperty("innerHTML");a.H=function(b){if(!b.content&&b.namespaceURI===document.documentElement.namespaceURI){b.content=P.createDocumentFragment();for(var c;c=b.firstChild;)l.call(b.content,c);if(D)b.__proto__=a.prototype;else if(b.cloneNode=function(b){return a.ha(this,b)},Ka)try{va(b),ja(b)}catch(rh){Ka=!1}a.M(b.content)}};var va=function(b){Object.defineProperty(b,
+"innerHTML",{get:function(){return nb(this)},set:function(b){P.body.innerHTML=b;for(a.M(P);this.content.firstChild;)k.call(this.content,this.content.firstChild);for(;P.body.firstChild;)l.call(this.content,P.body.firstChild)},configurable:!0})},ja=function(a){Object.defineProperty(a,"outerHTML",{get:function(){return"<template>"+this.innerHTML+"</template>"},set:function(a){if(this.parentNode){P.body.innerHTML=a;for(a=this.ownerDocument.createDocumentFragment();P.body.firstChild;)l.call(a,P.body.firstChild);
+m.call(this.parentNode,a,this)}else throw Error("Failed to set the 'outerHTML' property on 'Element': This element has no parent node.");},configurable:!0})};va(a.prototype);ja(a.prototype);a.M=function(c){c=b(c,"template");for(var d=0,e=c.length,f;d<e&&(f=c[d]);d++)a.H(f)};document.addEventListener("DOMContentLoaded",function(){a.M(document)});Document.prototype.createElement=function(){var b=h.apply(this,arguments);"template"===b.localName&&a.H(b);return b};var wa=/[&\u00A0"]/g,ca=/[&\u00A0<>]/g,
+ka=function(a){switch(a){case "&":return"&amp;";case "<":return"&lt;";case ">":return"&gt;";case '"':return"&quot;";case "\u00a0":return"&nbsp;"}};ba=function(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b};var hf=ba("area base br col command embed hr img input keygen link meta param source track wbr".split(" ")),xa=ba("style script xmp iframe noembed noframes plaintext noscript".split(" ")),nb=function(a,b){"template"===a.localName&&(a=a.content);for(var c="",d=b?b(a):a.childNodes,e=0,f=
+d.length,h;e<f&&(h=d[e]);e++){a:{var g=h;var k=a;var l=b;switch(g.nodeType){case Node.ELEMENT_NODE:for(var m=g.localName,n="<"+m,ya=g.attributes,Ma=0;k=ya[Ma];Ma++)n+=" "+k.name+'="'+k.value.replace(wa,ka)+'"';n+=">";g=hf[m]?n:n+nb(g,l)+"</"+m+">";break a;case Node.TEXT_NODE:g=g.data;g=k&&xa[k.localName]?g:g.replace(ca,ka);break a;case Node.COMMENT_NODE:g="\x3c!--"+g.data+"--\x3e";break a;default:throw window.console.error(g),Error("not implemented");}}c+=g}return c}}if(c||aa){a.ha=function(a,b){var c=
+f.call(a,!1);this.H&&this.H(c);b&&(l.call(c.content,f.call(a.content,!0)),ya(c.content,a.content));return c};var ya=function(c,d){if(d.querySelectorAll&&(d=b(d,"template"),0!==d.length)){c=b(c,"template");for(var e=0,f=c.length,h,g;e<f;e++)g=d[e],h=c[e],a&&a.H&&a.H(g),m.call(h.parentNode,Ma.call(g,!0),h)}},Ma=Node.prototype.cloneNode=function(b){if(!e&&d&&this instanceof DocumentFragment)if(b)var c=jf.call(this.ownerDocument,this,!0);else return this.ownerDocument.createDocumentFragment();else c=
+this.nodeType===Node.ELEMENT_NODE&&"template"===this.localName&&this.namespaceURI==document.documentElement.namespaceURI?a.ha(this,b):f.call(this,b);b&&ya(c,this);return c},jf=Document.prototype.importNode=function(c,d){d=d||!1;if("template"===c.localName)return a.ha(c,d);var e=g.call(this,c,d);if(d){ya(e,c);c=b(e,'script:not([type]),script[type="application/javascript"],script[type="text/javascript"]');for(var f,k=0;k<c.length;k++){f=c[k];d=h.call(document,"script");d.textContent=f.textContent;for(var l=
+f.attributes,ka=0,xa;ka<l.length;ka++)xa=l[ka],d.setAttribute(xa.name,xa.value);m.call(f.parentNode,d,f)}}return e}}c&&(window.HTMLTemplateElement=a)})();var oa=Array.isArray?Array.isArray:function(a){return"[object Array]"===Object.prototype.toString.call(a)};var pa=0,qa,ra="undefined"!==typeof window?window:void 0,sa=ra||{},ta=sa.MutationObserver||sa.WebKitMutationObserver,ua="undefined"!==typeof Uint8ClampedArray&&"undefined"!==typeof importScripts&&"undefined"!==typeof MessageChannel;function za(){return"undefined"!==typeof qa?function(){qa(Aa)}:Ba()}function Ca(){var a=0,b=new ta(Aa),c=document.createTextNode("");b.observe(c,{characterData:!0});return function(){c.data=a=++a%2}}
+function Da(){var a=new MessageChannel;a.port1.onmessage=Aa;return function(){return a.port2.postMessage(0)}}function Ba(){var a=setTimeout;return function(){return a(Aa,1)}}var Ea=Array(1E3);function Aa(){for(var a=0;a<pa;a+=2)(0,Ea[a])(Ea[a+1]),Ea[a]=void 0,Ea[a+1]=void 0;pa=0}var Fa,Ga;
+if("undefined"===typeof self&&"undefined"!==typeof process&&"[object process]"==={}.toString.call(process))Ga=function(){return process.ub(Aa)};else{var Ha;if(ta)Ha=Ca();else{var Ia;if(ua)Ia=Da();else{var Ja;if(void 0===ra&&"function"===typeof require)try{var Na=require("vertx");qa=Na.wb||Na.vb;Ja=za()}catch(a){Ja=Ba()}else Ja=Ba();Ia=Ja}Ha=Ia}Ga=Ha}Fa=Ga;function Oa(a,b){Ea[pa]=a;Ea[pa+1]=b;pa+=2;2===pa&&Fa()};function Pa(a,b){var c=this,d=new this.constructor(Qa);void 0===d[Ra]&&Sa(d);var e=c.h;if(e){var f=arguments[e-1];Oa(function(){return Ta(e,d,f,c.f)})}else Ua(c,d,a,b);return d};function Va(a){if(a&&"object"===typeof a&&a.constructor===this)return a;var b=new this(Qa);Wa(b,a);return b};var Ra=Math.random().toString(36).substring(16);function Qa(){}var Ya=new Xa;function Za(a){try{return a.then}catch(b){return Ya.error=b,Ya}}function $a(a,b,c,d){try{a.call(b,c,d)}catch(e){return e}}function ab(a,b,c){Oa(function(a){var d=!1,f=$a(c,b,function(c){d||(d=!0,b!==c?Wa(a,c):r(a,c))},function(b){d||(d=!0,u(a,b))});!d&&f&&(d=!0,u(a,f))},a)}function bb(a,b){1===b.h?r(a,b.f):2===b.h?u(a,b.f):Ua(b,void 0,function(b){return Wa(a,b)},function(b){return u(a,b)})}
+function cb(a,b,c){b.constructor===a.constructor&&c===Pa&&b.constructor.resolve===Va?bb(a,b):c===Ya?(u(a,Ya.error),Ya.error=null):void 0===c?r(a,b):"function"===typeof c?ab(a,b,c):r(a,b)}function Wa(a,b){if(a===b)u(a,new TypeError("You cannot resolve a promise with itself"));else{var c=typeof b;null===b||"object"!==c&&"function"!==c?r(a,b):cb(a,b,Za(b))}}function db(a){a.ra&&a.ra(a.f);eb(a)}function r(a,b){void 0===a.h&&(a.f=b,a.h=1,0!==a.L.length&&Oa(eb,a))}
+function u(a,b){void 0===a.h&&(a.h=2,a.f=b,Oa(db,a))}function Ua(a,b,c,d){var e=a.L,f=e.length;a.ra=null;e[f]=b;e[f+1]=c;e[f+2]=d;0===f&&a.h&&Oa(eb,a)}function eb(a){var b=a.L,c=a.h;if(0!==b.length){for(var d,e,f=a.f,h=0;h<b.length;h+=3)d=b[h],e=b[h+c],d?Ta(c,d,e,f):e(f);a.L.length=0}}function Xa(){this.error=null}var fb=new Xa;
+function Ta(a,b,c,d){var e="function"===typeof c;if(e){try{var f=c(d)}catch(l){fb.error=l,f=fb}if(f===fb){var h=!0;var g=f.error;f.error=null}else var k=!0;if(b===f){u(b,new TypeError("A promises callback cannot return that same promise."));return}}else f=d,k=!0;void 0===b.h&&(e&&k?Wa(b,f):h?u(b,g):1===a?r(b,f):2===a&&u(b,f))}function gb(a,b){try{b(function(b){Wa(a,b)},function(b){u(a,b)})}catch(c){u(a,c)}}var hb=0;function Sa(a){a[Ra]=hb++;a.h=void 0;a.f=void 0;a.L=[]};function ib(a,b){this.Ia=a;this.D=new a(Qa);this.D[Ra]||Sa(this.D);if(oa(b))if(this.U=this.length=b.length,this.f=Array(this.length),0===this.length)r(this.D,this.f);else{this.length=this.length||0;for(a=0;void 0===this.h&&a<b.length;a++)jb(this,b[a],a);0===this.U&&r(this.D,this.f)}else u(this.D,Error("Array Methods must be provided an Array"))}
+function jb(a,b,c){var d=a.Ia,e=d.resolve;e===Va?(e=Za(b),e===Pa&&void 0!==b.h?kb(a,b.h,c,b.f):"function"!==typeof e?(a.U--,a.f[c]=b):d===v?(d=new d(Qa),cb(d,b,e),lb(a,d,c)):lb(a,new d(function(a){return a(b)}),c)):lb(a,e(b),c)}function kb(a,b,c,d){var e=a.D;void 0===e.h&&(a.U--,2===b?u(e,d):a.f[c]=d);0===a.U&&r(e,a.f)}function lb(a,b,c){Ua(b,void 0,function(b){return kb(a,1,c,b)},function(b){return kb(a,2,c,b)})};function mb(a){return(new ib(this,a)).D};function ob(a){var b=this;return oa(a)?new b(function(c,d){for(var e=a.length,f=0;f<e;f++)b.resolve(a[f]).then(c,d)}):new b(function(a,b){return b(new TypeError("You must pass an array to race."))})};function pb(a){var b=new this(Qa);u(b,a);return b};function v(a){this[Ra]=hb++;this.f=this.h=void 0;this.L=[];if(Qa!==a){if("function"!==typeof a)throw new TypeError("You must pass a resolver function as the first argument to the promise constructor");if(this instanceof v)gb(this,a);else throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");}}v.prototype={constructor:v,then:Pa,a:function(a){return this.then(null,a)}};/*
+
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+window.Promise||(window.Promise=v,v.prototype["catch"]=v.prototype.a,v.prototype.then=v.prototype.then,v.all=mb,v.race=ob,v.resolve=Va,v.reject=pb);(function(a){function b(a,b){if("function"===typeof window.CustomEvent)return new CustomEvent(a,b);var c=document.createEvent("CustomEvent");c.initCustomEvent(a,!!b.bubbles,!!b.cancelable,b.detail);return c}function c(a){if(C)return a.ownerDocument!==document?a.ownerDocument:null;var b=a.__importDoc;if(!b&&a.parentNode){b=a.parentNode;if("function"===typeof b.closest)b=b.closest("link[rel=import]");else for(;!g(b)&&(b=b.parentNode););a.__importDoc=b}return b}function d(a){var b=m(document,"link[rel=import]:not([import-dependency])"),
+c=b.length;c?n(b,function(b){return h(b,function(){0===--c&&a()})}):a()}function e(a){function b(){"loading"!==document.readyState&&document.body&&(document.removeEventListener("readystatechange",b),a())}document.addEventListener("readystatechange",b);b()}function f(a){e(function(){return d(function(){return a&&a()})})}function h(a,b){if(a.__loaded)b&&b();else if("script"===a.localName&&!a.src||"style"===a.localName&&!a.firstChild)a.__loaded=!0,b&&b();else{var c=function(d){a.removeEventListener(d.type,
+c);a.__loaded=!0;b&&b()};a.addEventListener("load",c);ja&&"style"===a.localName||a.addEventListener("error",c)}}function g(a){return a.nodeType===Node.ELEMENT_NODE&&"link"===a.localName&&"import"===a.rel}function k(){var a=this;this.a={};this.b=0;this.c=new MutationObserver(function(b){return a.Va(b)});this.c.observe(document.head,{childList:!0,subtree:!0});this.loadImports(document)}function l(a){n(m(a,"template"),function(a){n(m(a.content,'script:not([type]),script[type="application/javascript"],script[type="text/javascript"]'),
+function(a){var b=document.createElement("script");n(a.attributes,function(a){return b.setAttribute(a.name,a.value)});b.textContent=a.textContent;a.parentNode.replaceChild(b,a)});l(a.content)})}function m(a,b){return a.childNodes.length?a.querySelectorAll(b):aa}function n(a,b,c){var d=a?a.length:0,e=c?-1:1;for(c=c?d-1:0;c<d&&0<=c;c+=e)b(a[c],c)}var t=document.createElement("link"),C="import"in t,aa=t.querySelectorAll("*"),P=null;!1==="currentScript"in document&&Object.defineProperty(document,"currentScript",
+{get:function(){return P||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null)},configurable:!0});var Ka=/(url\()([^)]*)(\))/g,ba=/(@import[\s]+(?!url\())([^;]*)(;)/g,La=/(<link[^>]*)(rel=['|"]?stylesheet['|"]?[^>]*>)/g,D={Pa:function(a,b){a.href&&a.setAttribute("href",D.aa(a.getAttribute("href"),b));a.src&&a.setAttribute("src",D.aa(a.getAttribute("src"),b));if("style"===a.localName){var c=D.ya(a.textContent,b,Ka);a.textContent=D.ya(c,b,ba)}},ya:function(a,b,c){return a.replace(c,
+function(a,c,d,e){a=d.replace(/["']/g,"");b&&(a=D.aa(a,b));return c+"'"+a+"'"+e})},aa:function(a,b){if(void 0===D.ga){D.ga=!1;try{var c=new URL("b","http://a");c.pathname="c%20d";D.ga="http://a/c%20d"===c.href}catch(nb){}}if(D.ga)return(new URL(a,b)).href;c=D.Fa;c||(c=document.implementation.createHTMLDocument("temp"),D.Fa=c,c.pa=c.createElement("base"),c.head.appendChild(c.pa),c.oa=c.createElement("a"));c.pa.href=b;c.oa.href=a;return c.oa.href||a}},va={async:!0,load:function(a,b,c){if(a)if(a.match(/^data:/)){a=
+a.split(",");var d=a[1];d=-1<a[0].indexOf(";base64")?atob(d):decodeURIComponent(d);b(d)}else{var e=new XMLHttpRequest;e.open("GET",a,va.async);e.onload=function(){var a=e.responseURL||e.getResponseHeader("Location");a&&0===a.indexOf("/")&&(a=(location.origin||location.protocol+"//"+location.host)+a);var d=e.response||e.responseText;304===e.status||0===e.status||200<=e.status&&300>e.status?b(d,a):c(d)};e.send()}else c("error: href must be specified")}},ja=/Trident/.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent);
+k.prototype.loadImports=function(a){var b=this;a=m(a,"link[rel=import]");n(a,function(a){return b.s(a)})};k.prototype.s=function(a){var b=this,c=a.href;if(void 0!==this.a[c]){var d=this.a[c];d&&d.__loaded&&(a.__import=d,this.i(a))}else this.b++,this.a[c]="pending",va.load(c,function(a,d){a=b.Wa(a,d||c);b.a[c]=a;b.b--;b.loadImports(a);b.N()},function(){b.a[c]=null;b.b--;b.N()})};k.prototype.Wa=function(a,b){if(!a)return document.createDocumentFragment();ja&&(a=a.replace(La,function(a,b,c){return-1===
+a.indexOf("type=")?b+" type=import-disable "+c:a}));var c=document.createElement("template");c.innerHTML=a;if(c.content)a=c.content,l(a);else for(a=document.createDocumentFragment();c.firstChild;)a.appendChild(c.firstChild);if(c=a.querySelector("base"))b=D.aa(c.getAttribute("href"),b),c.removeAttribute("href");c=m(a,'link[rel=import],link[rel=stylesheet][href][type=import-disable],style:not([type]),link[rel=stylesheet][href]:not([type]),script:not([type]),script[type="application/javascript"],script[type="text/javascript"]');
+var d=0;n(c,function(a){h(a);D.Pa(a,b);a.setAttribute("import-dependency","");"script"===a.localName&&!a.src&&a.textContent&&(a.setAttribute("src","data:text/javascript;charset=utf-8,"+encodeURIComponent(a.textContent+("\n//# sourceURL="+b+(d?"-"+d:"")+".js\n"))),a.textContent="",d++)});return a};k.prototype.N=function(){var a=this;if(!this.b){this.c.disconnect();this.flatten(document);var b=!1,c=!1,d=function(){c&&b&&(a.loadImports(document),a.b||(a.c.observe(document.head,{childList:!0,subtree:!0}),
+a.Ta()))};this.Ya(function(){c=!0;d()});this.Xa(function(){b=!0;d()})}};k.prototype.flatten=function(a){var b=this;a=m(a,"link[rel=import]");n(a,function(a){var c=b.a[a.href];(a.__import=c)&&c.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&(b.a[a.href]=a,a.readyState="loading",a.__import=a,b.flatten(c),a.appendChild(c))})};k.prototype.Xa=function(a){function b(e){if(e<d){var f=c[e],g=document.createElement("script");f.removeAttribute("import-dependency");n(f.attributes,function(a){return g.setAttribute(a.name,
+a.value)});P=g;f.parentNode.replaceChild(g,f);h(g,function(){P=null;b(e+1)})}else a()}var c=m(document,"script[import-dependency]"),d=c.length;b(0)};k.prototype.Ya=function(a){var b=m(document,"style[import-dependency],link[rel=stylesheet][import-dependency]"),d=b.length;if(d){var e=ja&&!!document.querySelector("link[rel=stylesheet][href][type=import-disable]");n(b,function(b){h(b,function(){b.removeAttribute("import-dependency");0===--d&&a()});if(e&&b.parentNode!==document.head){var f=document.createElement(b.localName);
+f.__appliedElement=b;f.setAttribute("type","import-placeholder");b.parentNode.insertBefore(f,b.nextSibling);for(f=c(b);f&&c(f);)f=c(f);f.parentNode!==document.head&&(f=null);document.head.insertBefore(b,f);b.removeAttribute("type")}})}else a()};k.prototype.Ta=function(){var a=this,b=m(document,"link[rel=import]");n(b,function(b){return a.i(b)},!0)};k.prototype.i=function(a){a.__loaded||(a.__loaded=!0,a.import&&(a.import.readyState="complete"),a.dispatchEvent(b(a.import?"load":"error",{bubbles:!1,
+cancelable:!1,detail:void 0})))};k.prototype.Va=function(a){var b=this;n(a,function(a){return n(a.addedNodes,function(a){a&&a.nodeType===Node.ELEMENT_NODE&&(g(a)?b.s(a):b.loadImports(a))})})};var wa=null;if(C)t=m(document,"link[rel=import]"),n(t,function(a){a.import&&"loading"===a.import.readyState||(a.__loaded=!0)}),t=function(a){a=a.target;g(a)&&(a.__loaded=!0)},document.addEventListener("load",t,!0),document.addEventListener("error",t,!0);else{var ca=Object.getOwnPropertyDescriptor(Node.prototype,
+"baseURI");Object.defineProperty((!ca||ca.configurable?Node:Element).prototype,"baseURI",{get:function(){var a=g(this)?this:c(this);return a?a.href:ca&&ca.get?ca.get.call(this):(document.querySelector("base")||window.location).href},configurable:!0,enumerable:!0});Object.defineProperty(HTMLLinkElement.prototype,"import",{get:function(){return this.__import||null},configurable:!0,enumerable:!0});e(function(){wa=new k})}f(function(){return document.dispatchEvent(b("HTMLImportsLoaded",{cancelable:!0,
+bubbles:!0,detail:void 0}))});a.useNative=C;a.whenReady=f;a.importForElement=c;a.loadImports=function(a){wa&&wa.loadImports(a)}})(window.HTMLImports=window.HTMLImports||{});/*
+
+ Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ Code distributed by Google as part of the polymer project is also
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+window.WebComponents=window.WebComponents||{flags:{}};var qb=document.querySelector('script[src*="webcomponents-lite.js"]'),rb=/wc-(.+)/,w={};if(!w.noOpts){location.search.slice(1).split("&").forEach(function(a){a=a.split("=");var b;a[0]&&(b=a[0].match(rb))&&(w[b[1]]=a[1]||!0)});if(qb)for(var sb=0,tb;tb=qb.attributes[sb];sb++)"src"!==tb.name&&(w[tb.name]=tb.value||!0);if(w.log&&w.log.split){var ub=w.log.split(",");w.log={};ub.forEach(function(a){w.log[a]=!0})}else w.log={}}
+window.WebComponents.flags=w;var vb=w.shadydom;vb&&(window.ShadyDOM=window.ShadyDOM||{},window.ShadyDOM.force=vb);var wb=w.register||w.ce;wb&&window.customElements&&(window.customElements.forcePolyfill=wb);/*
+
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+function xb(){this.xa=this.root=null;this.Y=!1;this.C=this.T=this.la=this.assignedSlot=this.assignedNodes=this.J=null;this.childNodes=this.nextSibling=this.previousSibling=this.lastChild=this.firstChild=this.parentNode=this.O=void 0;this.Da=this.qa=!1}xb.prototype.toJSON=function(){return{}};function x(a){a.ea||(a.ea=new xb);return a.ea}function y(a){return a&&a.ea};var z=window.ShadyDOM||{};z.Ra=!(!Element.prototype.attachShadow||!Node.prototype.getRootNode);var yb=Object.getOwnPropertyDescriptor(Node.prototype,"firstChild");z.w=!!(yb&&yb.configurable&&yb.get);z.va=z.force||!z.Ra;var zb=navigator.userAgent.match("Trident"),Ab=navigator.userAgent.match("Edge");void 0===z.Aa&&(z.Aa=z.w&&(zb||Ab));function Bb(a){return(a=y(a))&&void 0!==a.firstChild}function A(a){return"ShadyRoot"===a.Ja}function Cb(a){a=a.getRootNode();if(A(a))return a}
+var Db=Element.prototype,Eb=Db.matches||Db.matchesSelector||Db.mozMatchesSelector||Db.msMatchesSelector||Db.oMatchesSelector||Db.webkitMatchesSelector;function Fb(a,b){if(a&&b)for(var c=Object.getOwnPropertyNames(b),d=0,e;d<c.length&&(e=c[d]);d++){var f=Object.getOwnPropertyDescriptor(b,e);f&&Object.defineProperty(a,e,f)}}function Gb(a,b){for(var c=[],d=1;d<arguments.length;++d)c[d-1]=arguments[d];for(d=0;d<c.length;d++)Fb(a,c[d]);return a}function Hb(a,b){for(var c in b)a[c]=b[c]}
+var Ib=document.createTextNode(""),Jb=0,Kb=[];(new MutationObserver(function(){for(;Kb.length;)try{Kb.shift()()}catch(a){throw Ib.textContent=Jb++,a;}})).observe(Ib,{characterData:!0});function Lb(a){Kb.push(a);Ib.textContent=Jb++}var Mb=!!document.contains;function Nb(a,b){for(;b;){if(b==a)return!0;b=b.parentNode}return!1};var Ob=[],Pb;function Qb(a){Pb||(Pb=!0,Lb(Rb));Ob.push(a)}function Rb(){Pb=!1;for(var a=!!Ob.length;Ob.length;)Ob.shift()();return a}Rb.list=Ob;function Sb(){this.a=!1;this.addedNodes=[];this.removedNodes=[];this.X=new Set}function Tb(a){a.a||(a.a=!0,Lb(function(){Ub(a)}))}function Ub(a){if(a.a){a.a=!1;var b=a.takeRecords();b.length&&a.X.forEach(function(a){a(b)})}}Sb.prototype.takeRecords=function(){if(this.addedNodes.length||this.removedNodes.length){var a=[{addedNodes:this.addedNodes,removedNodes:this.removedNodes}];this.addedNodes=[];this.removedNodes=[];return a}return[]};
+function Vb(a,b){var c=x(a);c.J||(c.J=new Sb);c.J.X.add(b);var d=c.J;return{Ga:b,G:d,Ka:a,takeRecords:function(){return d.takeRecords()}}}function Wb(a){var b=a&&a.G;b&&(b.X.delete(a.Ga),b.X.size||(x(a.Ka).J=null))}
+function Xb(a,b){var c=b.getRootNode();return a.map(function(a){var b=c===a.target.getRootNode();if(b&&a.addedNodes){if(b=Array.from(a.addedNodes).filter(function(a){return c===a.getRootNode()}),b.length)return a=Object.create(a),Object.defineProperty(a,"addedNodes",{value:b,configurable:!0}),a}else if(b)return a}).filter(function(a){return a})};var B={},Yb=Element.prototype.insertBefore,Zb=Element.prototype.replaceChild,$b=Element.prototype.removeChild,ac=Element.prototype.setAttribute,bc=Element.prototype.removeAttribute,cc=Element.prototype.cloneNode,dc=Document.prototype.importNode,ec=Element.prototype.addEventListener,fc=Element.prototype.removeEventListener,gc=Window.prototype.addEventListener,hc=Window.prototype.removeEventListener,ic=Element.prototype.dispatchEvent,jc=Node.prototype.contains||HTMLElement.prototype.contains,kc=Document.prototype.getElementById,
+lc=Element.prototype.querySelector,mc=DocumentFragment.prototype.querySelector,nc=Document.prototype.querySelector,oc=Element.prototype.querySelectorAll,pc=DocumentFragment.prototype.querySelectorAll,qc=Document.prototype.querySelectorAll;B.appendChild=Element.prototype.appendChild;B.insertBefore=Yb;B.replaceChild=Zb;B.removeChild=$b;B.setAttribute=ac;B.removeAttribute=bc;B.cloneNode=cc;B.importNode=dc;B.addEventListener=ec;B.removeEventListener=fc;B.fb=gc;B.gb=hc;B.dispatchEvent=ic;B.contains=jc;
+B.getElementById=kc;B.ob=lc;B.rb=mc;B.mb=nc;B.querySelector=function(a){switch(this.nodeType){case Node.ELEMENT_NODE:return lc.call(this,a);case Node.DOCUMENT_NODE:return nc.call(this,a);default:return mc.call(this,a)}};B.pb=oc;B.sb=pc;B.nb=qc;B.querySelectorAll=function(a){switch(this.nodeType){case Node.ELEMENT_NODE:return oc.call(this,a);case Node.DOCUMENT_NODE:return qc.call(this,a);default:return pc.call(this,a)}};var rc=/[&\u00A0"]/g,sc=/[&\u00A0<>]/g;function tc(a){switch(a){case "&":return"&amp;";case "<":return"&lt;";case ">":return"&gt;";case '"':return"&quot;";case "\u00a0":return"&nbsp;"}}function uc(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}var vc=uc("area base br col command embed hr img input keygen link meta param source track wbr".split(" ")),wc=uc("style script xmp iframe noembed noframes plaintext noscript".split(" "));
+function xc(a,b){"template"===a.localName&&(a=a.content);for(var c="",d=b?b(a):a.childNodes,e=0,f=d.length,h;e<f&&(h=d[e]);e++){a:{var g=h;var k=a;var l=b;switch(g.nodeType){case Node.ELEMENT_NODE:for(var m=g.localName,n="<"+m,t=g.attributes,C=0;k=t[C];C++)n+=" "+k.name+'="'+k.value.replace(rc,tc)+'"';n+=">";g=vc[m]?n:n+xc(g,l)+"</"+m+">";break a;case Node.TEXT_NODE:g=g.data;g=k&&wc[k.localName]?g:g.replace(sc,tc);break a;case Node.COMMENT_NODE:g="\x3c!--"+g.data+"--\x3e";break a;default:throw window.console.error(g),
+Error("not implemented");}}c+=g}return c};var E={},F=document.createTreeWalker(document,NodeFilter.SHOW_ALL,null,!1),G=document.createTreeWalker(document,NodeFilter.SHOW_ELEMENT,null,!1);function yc(a){var b=[];F.currentNode=a;for(a=F.firstChild();a;)b.push(a),a=F.nextSibling();return b}E.parentNode=function(a){F.currentNode=a;return F.parentNode()};E.firstChild=function(a){F.currentNode=a;return F.firstChild()};E.lastChild=function(a){F.currentNode=a;return F.lastChild()};E.previousSibling=function(a){F.currentNode=a;return F.previousSibling()};
+E.nextSibling=function(a){F.currentNode=a;return F.nextSibling()};E.childNodes=yc;E.parentElement=function(a){G.currentNode=a;return G.parentNode()};E.firstElementChild=function(a){G.currentNode=a;return G.firstChild()};E.lastElementChild=function(a){G.currentNode=a;return G.lastChild()};E.previousElementSibling=function(a){G.currentNode=a;return G.previousSibling()};E.nextElementSibling=function(a){G.currentNode=a;return G.nextSibling()};
+E.children=function(a){var b=[];G.currentNode=a;for(a=G.firstChild();a;)b.push(a),a=G.nextSibling();return b};E.innerHTML=function(a){return xc(a,function(a){return yc(a)})};E.textContent=function(a){switch(a.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:a=document.createTreeWalker(a,NodeFilter.SHOW_TEXT,null,!1);for(var b="",c;c=a.nextNode();)b+=c.nodeValue;return b;default:return a.nodeValue}};var H={},zc=z.w,Ac=[Node.prototype,Element.prototype,HTMLElement.prototype];function I(a){var b;a:{for(b=0;b<Ac.length;b++){var c=Ac[b];if(c.hasOwnProperty(a)){b=c;break a}}b=void 0}if(!b)throw Error("Could not find descriptor for "+a);return Object.getOwnPropertyDescriptor(b,a)}
+var J=zc?{parentNode:I("parentNode"),firstChild:I("firstChild"),lastChild:I("lastChild"),previousSibling:I("previousSibling"),nextSibling:I("nextSibling"),childNodes:I("childNodes"),parentElement:I("parentElement"),previousElementSibling:I("previousElementSibling"),nextElementSibling:I("nextElementSibling"),innerHTML:I("innerHTML"),textContent:I("textContent"),firstElementChild:I("firstElementChild"),lastElementChild:I("lastElementChild"),children:I("children")}:{},Bc=zc?{firstElementChild:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,
+"firstElementChild"),lastElementChild:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,"lastElementChild"),children:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,"children")}:{},Cc=zc?{firstElementChild:Object.getOwnPropertyDescriptor(Document.prototype,"firstElementChild"),lastElementChild:Object.getOwnPropertyDescriptor(Document.prototype,"lastElementChild"),children:Object.getOwnPropertyDescriptor(Document.prototype,"children")}:{};H.wa=J;H.qb=Bc;H.lb=Cc;H.parentNode=function(a){return J.parentNode.get.call(a)};
+H.firstChild=function(a){return J.firstChild.get.call(a)};H.lastChild=function(a){return J.lastChild.get.call(a)};H.previousSibling=function(a){return J.previousSibling.get.call(a)};H.nextSibling=function(a){return J.nextSibling.get.call(a)};H.childNodes=function(a){return Array.prototype.slice.call(J.childNodes.get.call(a))};H.parentElement=function(a){return J.parentElement.get.call(a)};H.previousElementSibling=function(a){return J.previousElementSibling.get.call(a)};H.nextElementSibling=function(a){return J.nextElementSibling.get.call(a)};
+H.innerHTML=function(a){return J.innerHTML.get.call(a)};H.textContent=function(a){return J.textContent.get.call(a)};H.children=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:a=Bc.children.get.call(a);break;case Node.DOCUMENT_NODE:a=Cc.children.get.call(a);break;default:a=J.children.get.call(a)}return Array.prototype.slice.call(a)};
+H.firstElementChild=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return Bc.firstElementChild.get.call(a);case Node.DOCUMENT_NODE:return Cc.firstElementChild.get.call(a);default:return J.firstElementChild.get.call(a)}};H.lastElementChild=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return Bc.lastElementChild.get.call(a);case Node.DOCUMENT_NODE:return Cc.lastElementChild.get.call(a);default:return J.lastElementChild.get.call(a)}};var K=z.Aa?H:E;function Dc(a){for(;a.firstChild;)a.removeChild(a.firstChild)}
+var Ec=z.w,Fc=document.implementation.createHTMLDocument("inert"),Gc=Object.getOwnPropertyDescriptor(Node.prototype,"isConnected"),Hc=Gc&&Gc.get,Ic=Object.getOwnPropertyDescriptor(Document.prototype,"activeElement"),Jc={parentElement:{get:function(){var a=y(this);(a=a&&a.parentNode)&&a.nodeType!==Node.ELEMENT_NODE&&(a=null);return void 0!==a?a:K.parentElement(this)},configurable:!0},parentNode:{get:function(){var a=y(this);a=a&&a.parentNode;return void 0!==a?a:K.parentNode(this)},configurable:!0},
+nextSibling:{get:function(){var a=y(this);a=a&&a.nextSibling;return void 0!==a?a:K.nextSibling(this)},configurable:!0},previousSibling:{get:function(){var a=y(this);a=a&&a.previousSibling;return void 0!==a?a:K.previousSibling(this)},configurable:!0},nextElementSibling:{get:function(){var a=y(this);if(a&&void 0!==a.nextSibling){for(a=this.nextSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}return K.nextElementSibling(this)},configurable:!0},previousElementSibling:{get:function(){var a=
+y(this);if(a&&void 0!==a.previousSibling){for(a=this.previousSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}return K.previousElementSibling(this)},configurable:!0}},Kc={className:{get:function(){return this.getAttribute("class")||""},set:function(a){this.setAttribute("class",a)},configurable:!0}},Lc={childNodes:{get:function(){if(Bb(this)){var a=y(this);if(!a.childNodes){a.childNodes=[];for(var b=this.firstChild;b;b=b.nextSibling)a.childNodes.push(b)}var c=a.childNodes}else c=
+K.childNodes(this);c.item=function(a){return c[a]};return c},configurable:!0},childElementCount:{get:function(){return this.children.length},configurable:!0},firstChild:{get:function(){var a=y(this);a=a&&a.firstChild;return void 0!==a?a:K.firstChild(this)},configurable:!0},lastChild:{get:function(){var a=y(this);a=a&&a.lastChild;return void 0!==a?a:K.lastChild(this)},configurable:!0},textContent:{get:function(){if(Bb(this)){for(var a=[],b=0,c=this.childNodes,d;d=c[b];b++)d.nodeType!==Node.COMMENT_NODE&&
+a.push(d.textContent);return a.join("")}return K.textContent(this)},set:function(a){if("undefined"===typeof a||null===a)a="";switch(this.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:if(!Bb(this)&&Ec){var b=this.firstChild;(b!=this.lastChild||b&&b.nodeType!=Node.TEXT_NODE)&&Dc(this);H.wa.textContent.set.call(this,a)}else Dc(this),(0<a.length||this.nodeType===Node.ELEMENT_NODE)&&this.appendChild(document.createTextNode(a));break;default:this.nodeValue=a}},configurable:!0},firstElementChild:{get:function(){var a=
+y(this);if(a&&void 0!==a.firstChild){for(a=this.firstChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}return K.firstElementChild(this)},configurable:!0},lastElementChild:{get:function(){var a=y(this);if(a&&void 0!==a.lastChild){for(a=this.lastChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}return K.lastElementChild(this)},configurable:!0},children:{get:function(){var a=Bb(this)?Array.prototype.filter.call(this.childNodes,function(a){return a.nodeType===Node.ELEMENT_NODE}):
+K.children(this);a.item=function(b){return a[b]};return a},configurable:!0},innerHTML:{get:function(){return Bb(this)?xc("template"===this.localName?this.content:this):K.innerHTML(this)},set:function(a){var b="template"===this.localName?this.content:this;Dc(b);var c=this.localName;c&&"template"!==c||(c="div");c=Fc.createElement(c);for(Ec?H.wa.innerHTML.set.call(c,a):c.innerHTML=a;c.firstChild;)b.appendChild(c.firstChild)},configurable:!0}},Mc={shadowRoot:{get:function(){var a=y(this);return a&&a.xa||
+null},configurable:!0}},Nc={activeElement:{get:function(){var a=Ic&&Ic.get?Ic.get.call(document):z.w?void 0:document.activeElement;if(a&&a.nodeType){var b=!!A(this);if(this===document||b&&this.host!==a&&B.contains.call(this.host,a)){for(b=Cb(a);b&&b!==this;)a=b.host,b=Cb(a);a=this===document?b?null:a:b===this?a:null}else a=null}else a=null;return a},set:function(){},configurable:!0}};
+function L(a,b,c){for(var d in b){var e=Object.getOwnPropertyDescriptor(a,d);e&&e.configurable||!e&&c?Object.defineProperty(a,d,b[d]):c&&console.warn("Could not define",d,"on",a)}}function Oc(a){L(a,Jc);L(a,Kc);L(a,Lc);L(a,Nc)}
+function Pc(){var a=Qc.prototype;a.__proto__=DocumentFragment.prototype;L(a,Jc,!0);L(a,Lc,!0);L(a,Nc,!0);Object.defineProperties(a,{nodeType:{value:Node.DOCUMENT_FRAGMENT_NODE,configurable:!0},nodeName:{value:"#document-fragment",configurable:!0},nodeValue:{value:null,configurable:!0}});["localName","namespaceURI","prefix"].forEach(function(b){Object.defineProperty(a,b,{value:void 0,configurable:!0})});["ownerDocument","baseURI","isConnected"].forEach(function(b){Object.defineProperty(a,b,{get:function(){return this.host[b]},
+configurable:!0})})}var Rc=z.w?function(){}:function(a){var b=x(a);b.qa||(b.qa=!0,L(a,Jc,!0),L(a,Kc,!0))},Sc=z.w?function(){}:function(a){x(a).Da||(L(a,Lc,!0),L(a,Mc,!0))};var Tc=K.childNodes;function Uc(a,b,c){Rc(a);c=c||null;var d=x(a),e=x(b),f=c?x(c):null;d.previousSibling=c?f.previousSibling:b.lastChild;if(f=y(d.previousSibling))f.nextSibling=a;if(f=y(d.nextSibling=c))f.previousSibling=a;d.parentNode=b;c?c===e.firstChild&&(e.firstChild=a):(e.lastChild=a,e.firstChild||(e.firstChild=a));e.childNodes=null}
+function Vc(a,b){var c=x(a);if(void 0===c.firstChild)for(b=b||Tc(a),c.firstChild=b[0]||null,c.lastChild=b[b.length-1]||null,Sc(a),c=0;c<b.length;c++){var d=b[c],e=x(d);e.parentNode=a;e.nextSibling=b[c+1]||null;e.previousSibling=b[c-1]||null;Rc(d)}};var Wc=K.parentNode;
+function Xc(a,b,c){if(b===a)throw Error("Failed to execute 'appendChild' on 'Node': The new child element contains the parent.");if(c){var d=y(c);d=d&&d.parentNode;if(void 0!==d&&d!==a||void 0===d&&Wc(c)!==a)throw Error("Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.");}if(c===b)return b;b.parentNode&&Yc(b.parentNode,b);var e,f;if(!b.__noInsertionPoint){if(f=e=Cb(a)){var h;"slot"===b.localName?h=[b]:b.querySelectorAll&&
+(h=b.querySelectorAll("slot"));f=h&&h.length?h:void 0}f&&(h=e,d=f,h.v=h.v||[],h.g=h.g||[],h.j=h.j||{},h.v.push.apply(h.v,[].concat(d instanceof Array?d:na(ma(d)))))}("slot"===a.localName||f)&&(e=e||Cb(a))&&Zc(e);if(Bb(a)){e=c;Sc(a);f=x(a);void 0!==f.firstChild&&(f.childNodes=null);if(b.nodeType===Node.DOCUMENT_FRAGMENT_NODE){f=b.childNodes;for(h=0;h<f.length;h++)Uc(f[h],a,e);e=x(b);f=void 0!==e.firstChild?null:void 0;e.firstChild=e.lastChild=f;e.childNodes=f}else Uc(b,a,e);e=y(a);if($c(a)){Zc(e.root);
+var g=!0}else e.root&&(g=!0)}g||(g=A(a)?a.host:a,c?(c=ad(c),B.insertBefore.call(g,b,c)):B.appendChild.call(g,b));bd(a,b);return b}
+function Yc(a,b){if(b.parentNode!==a)throw Error("The node to be removed is not a child of this node: "+b);var c=Cb(b),d=y(a);if(Bb(a)){var e=x(b),f=x(a);b===f.firstChild&&(f.firstChild=e.nextSibling);b===f.lastChild&&(f.lastChild=e.previousSibling);var h=e.previousSibling,g=e.nextSibling;h&&(x(h).nextSibling=g);g&&(x(g).previousSibling=h);e.parentNode=e.previousSibling=e.nextSibling=void 0;void 0!==f.childNodes&&(f.childNodes=null);if($c(a)){Zc(d.root);var k=!0}}cd(b);if(c){(e=a&&"slot"===a.localName)&&
+(k=!0);if(c.g){dd(c);f=c.j;for(aa in f)for(h=f[aa],g=0;g<h.length;g++){var l=h[g];if(Nb(b,l)){h.splice(g,1);var m=c.g.indexOf(l);0<=m&&c.g.splice(m,1);g--;m=y(l);if(l=m.C)for(var n=0;n<l.length;n++){var t=l[n],C=ed(t);C&&B.removeChild.call(C,t)}m.C=[];m.assignedNodes=[];m=!0}}var aa=m}else aa=void 0;(aa||e)&&Zc(c)}k||(k=A(a)?a.host:a,(!d.root&&"slot"!==b.localName||k===Wc(b))&&B.removeChild.call(k,b));bd(a,null,b);return b}
+function cd(a){var b=y(a);if(b&&void 0!==b.O){b=a.childNodes;for(var c=0,d=b.length,e;c<d&&(e=b[c]);c++)cd(e)}if(a=y(a))a.O=void 0}function ad(a){var b=a;a&&"slot"===a.localName&&(b=(b=(b=y(a))&&b.C)&&b.length?b[0]:ad(a.nextSibling));return b}function $c(a){return(a=(a=y(a))&&a.root)&&fd(a)}
+function gd(a,b){if("slot"===b)a=a.parentNode,$c(a)&&Zc(y(a).root);else if("slot"===a.localName&&"name"===b&&(b=Cb(a))){if(b.g){var c=a.Ea,d=hd(a);if(d!==c){c=b.j[c];var e=c.indexOf(a);0<=e&&c.splice(e,1);c=b.j[d]||(b.j[d]=[]);c.push(a);1<c.length&&(b.j[d]=id(c))}}Zc(b)}}function bd(a,b,c){if(a=(a=y(a))&&a.J)b&&a.addedNodes.push(b),c&&a.removedNodes.push(c),Tb(a)}
+function jd(a){if(a&&a.nodeType){var b=x(a),c=b.O;void 0===c&&(A(a)?(c=a,b.O=c):(c=(c=a.parentNode)?jd(c):a,B.contains.call(document.documentElement,a)&&(b.O=c)));return c}}function kd(a,b,c){var d=[];ld(a.childNodes,b,c,d);return d}function ld(a,b,c,d){for(var e=0,f=a.length,h;e<f&&(h=a[e]);e++){var g;if(g=h.nodeType===Node.ELEMENT_NODE){g=h;var k=b,l=c,m=d,n=k(g);n&&m.push(g);l&&l(n)?g=n:(ld(g.childNodes,k,l,m),g=void 0)}if(g)break}}var md=null;
+function nd(a,b,c){md||(md=window.ShadyCSS&&window.ShadyCSS.ScopingShim);md&&"class"===b?md.setElementClass(a,c):(B.setAttribute.call(a,b,c),gd(a,b))}function od(a,b){if(a.ownerDocument!==document)return B.importNode.call(document,a,b);var c=B.importNode.call(document,a,!1);if(b){a=a.childNodes;b=0;for(var d;b<a.length;b++)d=od(a[b],!0),c.appendChild(d)}return c};var pd="__eventWrappers"+Date.now(),qd={blur:!0,focus:!0,focusin:!0,focusout:!0,click:!0,dblclick:!0,mousedown:!0,mouseenter:!0,mouseleave:!0,mousemove:!0,mouseout:!0,mouseover:!0,mouseup:!0,wheel:!0,beforeinput:!0,input:!0,keydown:!0,keyup:!0,compositionstart:!0,compositionupdate:!0,compositionend:!0,touchstart:!0,touchend:!0,touchmove:!0,touchcancel:!0,pointerover:!0,pointerenter:!0,pointerdown:!0,pointermove:!0,pointerup:!0,pointercancel:!0,pointerout:!0,pointerleave:!0,gotpointercapture:!0,lostpointercapture:!0,
+dragstart:!0,drag:!0,dragenter:!0,dragleave:!0,dragover:!0,drop:!0,dragend:!0,DOMActivate:!0,DOMFocusIn:!0,DOMFocusOut:!0,keypress:!0};function rd(a,b){var c=[],d=a;for(a=a===window?window:a.getRootNode();d;)c.push(d),d=d.assignedSlot?d.assignedSlot:d.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&d.host&&(b||d!==a)?d.host:d.parentNode;c[c.length-1]===document&&c.push(window);return c}
+function sd(a,b){if(!A)return a;a=rd(a,!0);for(var c=0,d,e,f,h;c<b.length;c++)if(d=b[c],f=d===window?window:d.getRootNode(),f!==e&&(h=a.indexOf(f),e=f),!A(f)||-1<h)return d}
+var td={get composed(){!1!==this.isTrusted&&void 0===this.ca&&(this.ca=qd[this.type]);return this.ca||!1},composedPath:function(){this.b||(this.b=rd(this.__target,this.composed));return this.b},get target(){return sd(this.currentTarget,this.composedPath())},get relatedTarget(){if(!this.da)return null;this.c||(this.c=rd(this.da,!0));return sd(this.currentTarget,this.c)},stopPropagation:function(){Event.prototype.stopPropagation.call(this);this.a=!0},stopImmediatePropagation:function(){Event.prototype.stopImmediatePropagation.call(this);
+this.a=this.i=!0}};function ud(a){function b(b,d){b=new a(b,d);b.ca=d&&!!d.composed;return b}Hb(b,a);b.prototype=a.prototype;return b}var vd={focus:!0,blur:!0};function wd(a){return a.__target!==a.target||a.da!==a.relatedTarget}function xd(a,b,c){if(c=b.__handlers&&b.__handlers[a.type]&&b.__handlers[a.type][c])for(var d=0,e;(e=c[d])&&(!wd(a)||a.target!==a.relatedTarget)&&(e.call(b,a),!a.i);d++);}
+function yd(a){var b=a.composedPath();Object.defineProperty(a,"currentTarget",{get:function(){return d},configurable:!0});for(var c=b.length-1;0<=c;c--){var d=b[c];xd(a,d,"capture");if(a.a)return}Object.defineProperty(a,"eventPhase",{get:function(){return Event.AT_TARGET}});var e;for(c=0;c<b.length;c++){d=b[c];var f=y(d);f=f&&f.root;if(0===c||f&&f===e)if(xd(a,d,"bubble"),d!==window&&(e=d.getRootNode()),a.a)break}}
+function zd(a,b,c,d,e,f){for(var h=0;h<a.length;h++){var g=a[h],k=g.type,l=g.capture,m=g.once,n=g.passive;if(b===g.node&&c===k&&d===l&&e===m&&f===n)return h}return-1}
+function Ad(a,b,c){if(b){var d=typeof b;if("function"===d||"object"===d)if("object"!==d||b.handleEvent&&"function"===typeof b.handleEvent){if(c&&"object"===typeof c){var e=!!c.capture;var f=!!c.once;var h=!!c.passive}else e=!!c,h=f=!1;var g=c&&c.fa||this,k=b[pd];if(k){if(-1<zd(k,g,a,e,f,h))return}else b[pd]=[];k=function(e){f&&this.removeEventListener(a,b,c);e.__target||Bd(e);if(g!==this){var h=Object.getOwnPropertyDescriptor(e,"currentTarget");Object.defineProperty(e,"currentTarget",{get:function(){return g},
+configurable:!0})}if(e.composed||-1<e.composedPath().indexOf(g))if(wd(e)&&e.target===e.relatedTarget)e.eventPhase===Event.BUBBLING_PHASE&&e.stopImmediatePropagation();else if(e.eventPhase===Event.CAPTURING_PHASE||e.bubbles||e.target===g||g instanceof Window){var k="function"===d?b.call(g,e):b.handleEvent&&b.handleEvent(e);g!==this&&(h?(Object.defineProperty(e,"currentTarget",h),h=null):delete e.currentTarget);return k}};b[pd].push({node:g,type:a,capture:e,once:f,passive:h,hb:k});vd[a]?(this.__handlers=
+this.__handlers||{},this.__handlers[a]=this.__handlers[a]||{capture:[],bubble:[]},this.__handlers[a][e?"capture":"bubble"].push(k)):(this instanceof Window?B.fb:B.addEventListener).call(this,a,k,c)}}}
+function Cd(a,b,c){if(b){if(c&&"object"===typeof c){var d=!!c.capture;var e=!!c.once;var f=!!c.passive}else d=!!c,f=e=!1;var h=c&&c.fa||this,g=void 0;var k=null;try{k=b[pd]}catch(l){}k&&(e=zd(k,h,a,d,e,f),-1<e&&(g=k.splice(e,1)[0].hb,k.length||(b[pd]=void 0)));(this instanceof Window?B.gb:B.removeEventListener).call(this,a,g||b,c);g&&vd[a]&&this.__handlers&&this.__handlers[a]&&(a=this.__handlers[a][d?"capture":"bubble"],g=a.indexOf(g),-1<g&&a.splice(g,1))}}
+function Dd(){for(var a in vd)window.addEventListener(a,function(a){a.__target||(Bd(a),yd(a))},!0)}function Bd(a){a.__target=a.target;a.da=a.relatedTarget;if(z.w){var b=Object.getPrototypeOf(a);if(!b.hasOwnProperty("__patchProto")){var c=Object.create(b);c.jb=b;Fb(c,td);b.__patchProto=c}a.__proto__=b.__patchProto}else Fb(a,td)}var Ed=ud(window.Event),Fd=ud(window.CustomEvent),Gd=ud(window.MouseEvent);function Hd(a,b){return{index:a,P:[],W:b}}
+function Id(a,b,c,d){var e=0,f=0,h=0,g=0,k=Math.min(b-e,d-f);if(0==e&&0==f)a:{for(h=0;h<k;h++)if(a[h]!==c[h])break a;h=k}if(b==a.length&&d==c.length){g=a.length;for(var l=c.length,m=0;m<k-h&&Jd(a[--g],c[--l]);)m++;g=m}e+=h;f+=h;b-=g;d-=g;if(0==b-e&&0==d-f)return[];if(e==b){for(b=Hd(e,0);f<d;)b.P.push(c[f++]);return[b]}if(f==d)return[Hd(e,b-e)];k=e;h=f;d=d-h+1;g=b-k+1;b=Array(d);for(l=0;l<d;l++)b[l]=Array(g),b[l][0]=l;for(l=0;l<g;l++)b[0][l]=l;for(l=1;l<d;l++)for(m=1;m<g;m++)if(a[k+m-1]===c[h+l-1])b[l][m]=
+b[l-1][m-1];else{var n=b[l-1][m]+1,t=b[l][m-1]+1;b[l][m]=n<t?n:t}k=b.length-1;h=b[0].length-1;d=b[k][h];for(a=[];0<k||0<h;)0==k?(a.push(2),h--):0==h?(a.push(3),k--):(g=b[k-1][h-1],l=b[k-1][h],m=b[k][h-1],n=l<m?l<g?l:g:m<g?m:g,n==g?(g==d?a.push(0):(a.push(1),d=g),k--,h--):n==l?(a.push(3),k--,d=l):(a.push(2),h--,d=m));a.reverse();b=void 0;k=[];for(h=0;h<a.length;h++)switch(a[h]){case 0:b&&(k.push(b),b=void 0);e++;f++;break;case 1:b||(b=Hd(e,0));b.W++;e++;b.P.push(c[f]);f++;break;case 2:b||(b=Hd(e,0));
+b.W++;e++;break;case 3:b||(b=Hd(e,0)),b.P.push(c[f]),f++}b&&k.push(b);return k}function Jd(a,b){return a===b};var ed=K.parentNode,Kd=K.childNodes,Ld={};function Md(a){var b=[];do b.unshift(a);while(a=a.parentNode);return b}function Qc(a,b,c){if(a!==Ld)throw new TypeError("Illegal constructor");this.Ja="ShadyRoot";a=Kd(b);this.host=b;this.a=c&&c.mode;Vc(b,a);c=y(b);c.root=this;c.xa="closed"!==this.a?this:null;c=x(this);c.firstChild=c.lastChild=c.parentNode=c.nextSibling=c.previousSibling=null;c.childNodes=[];this.V=!1;this.v=this.j=this.g=null;c=0;for(var d=a.length;c<d;c++)B.removeChild.call(b,a[c])}
+function Zc(a){a.V||(a.V=!0,Qb(function(){return Nd(a)}))}function Nd(a){for(var b;a;){a.V&&(b=a);a:{var c=a;a=c.host.getRootNode();if(A(a))for(var d=c.host.childNodes,e=0;e<d.length;e++)if(c=d[e],"slot"==c.localName)break a;a=void 0}}b&&b._renderRoot()}
+Qc.prototype._renderRoot=function(){this.V=!1;if(this.g){dd(this);for(var a=0,b;a<this.g.length;a++){b=this.g[a];var c=y(b),d=c.assignedNodes;c.assignedNodes=[];c.C=[];if(c.la=d)for(c=0;c<d.length;c++){var e=y(d[c]);e.T=e.assignedSlot;e.assignedSlot===b&&(e.assignedSlot=null)}}for(b=this.host.firstChild;b;b=b.nextSibling)Od(this,b);for(a=0;a<this.g.length;a++){b=this.g[a];d=y(b);if(!d.assignedNodes.length)for(c=b.firstChild;c;c=c.nextSibling)Od(this,c,b);(c=(c=y(b.parentNode))&&c.root)&&fd(c)&&c._renderRoot();
+Pd(this,d.C,d.assignedNodes);if(c=d.la){for(e=0;e<c.length;e++)y(c[e]).T=null;d.la=null;c.length>d.assignedNodes.length&&(d.Y=!0)}d.Y&&(d.Y=!1,Qd(this,b))}a=this.g;b=[];for(d=0;d<a.length;d++)c=a[d].parentNode,(e=y(c))&&e.root||!(0>b.indexOf(c))||b.push(c);for(a=0;a<b.length;a++){d=b[a];c=d===this?this.host:d;e=[];d=d.childNodes;for(var f=0;f<d.length;f++){var h=d[f];if("slot"==h.localName){h=y(h).C;for(var g=0;g<h.length;g++)e.push(h[g])}else e.push(h)}d=void 0;f=Kd(c);h=Id(e,e.length,f,f.length);
+for(var k=g=0;g<h.length&&(d=h[g]);g++){for(var l=0,m;l<d.P.length&&(m=d.P[l]);l++)ed(m)===c&&B.removeChild.call(c,m),f.splice(d.index+k,1);k-=d.W}for(k=0;k<h.length&&(d=h[k]);k++)for(g=f[d.index],l=d.index;l<d.index+d.W;l++)m=e[l],B.insertBefore.call(c,m,g),f.splice(l,0,m)}}};function Od(a,b,c){var d=x(b),e=d.T;d.T=null;c||(c=(a=a.j[b.slot||"__catchall"])&&a[0]);c?(x(c).assignedNodes.push(b),d.assignedSlot=c):d.assignedSlot=void 0;e!==d.assignedSlot&&d.assignedSlot&&(x(d.assignedSlot).Y=!0)}
+function Pd(a,b,c){for(var d=0,e;d<c.length&&(e=c[d]);d++)if("slot"==e.localName){var f=y(e).assignedNodes;f&&f.length&&Pd(a,b,f)}else b.push(c[d])}function Qd(a,b){B.dispatchEvent.call(b,new Event("slotchange"));b=y(b);b.assignedSlot&&Qd(a,b.assignedSlot)}function dd(a){if(a.v&&a.v.length){for(var b=a.v,c,d=0;d<b.length;d++){var e=b[d];Vc(e);Vc(e.parentNode);var f=hd(e);a.j[f]?(c=c||{},c[f]=!0,a.j[f].push(e)):a.j[f]=[e];a.g.push(e)}if(c)for(var h in c)a.j[h]=id(a.j[h]);a.v=[]}}
+function hd(a){var b=a.name||a.getAttribute("name")||"__catchall";return a.Ea=b}function id(a){return a.sort(function(a,c){a=Md(a);for(var b=Md(c),e=0;e<a.length;e++){c=a[e];var f=b[e];if(c!==f)return a=Array.from(c.parentNode.childNodes),a.indexOf(c)-a.indexOf(f)}})}function fd(a){dd(a);return!(!a.g||!a.g.length)};function Rd(a){var b=a.getRootNode();A(b)&&Nd(b);return(a=y(a))&&a.assignedSlot||null}
+var Sd={addEventListener:Ad.bind(window),removeEventListener:Cd.bind(window)},Td={addEventListener:Ad,removeEventListener:Cd,appendChild:function(a){return Xc(this,a)},insertBefore:function(a,b){return Xc(this,a,b)},removeChild:function(a){return Yc(this,a)},replaceChild:function(a,b){Xc(this,a,b);Yc(this,b);return a},cloneNode:function(a){if("template"==this.localName)var b=B.cloneNode.call(this,a);else if(b=B.cloneNode.call(this,!1),a){a=this.childNodes;for(var c=0,d;c<a.length;c++)d=a[c].cloneNode(!0),
+b.appendChild(d)}return b},getRootNode:function(){return jd(this)},contains:function(a){return Nb(this,a)},dispatchEvent:function(a){Rb();return B.dispatchEvent.call(this,a)}};
+Object.defineProperties(Td,{isConnected:{get:function(){if(Hc&&Hc.call(this))return!0;if(this.nodeType==Node.DOCUMENT_FRAGMENT_NODE)return!1;var a=this.ownerDocument;if(Mb){if(B.contains.call(a,this))return!0}else if(a.documentElement&&B.contains.call(a.documentElement,this))return!0;for(a=this;a&&!(a instanceof Document);)a=a.parentNode||(A(a)?a.host:void 0);return!!(a&&a instanceof Document)},configurable:!0}});
+var Ud={get assignedSlot(){return Rd(this)}},Vd={querySelector:function(a){return kd(this,function(b){return Eb.call(b,a)},function(a){return!!a})[0]||null},querySelectorAll:function(a,b){if(b){b=Array.prototype.slice.call(B.querySelectorAll(this,a));var c=this.getRootNode();return b.filter(function(a){return a.getRootNode()==c})}return kd(this,function(b){return Eb.call(b,a)})}},Wd={assignedNodes:function(a){if("slot"===this.localName){var b=this.getRootNode();A(b)&&Nd(b);return(b=y(this))?(a&&a.flatten?
+b.C:b.assignedNodes)||[]:[]}}},Xd=Gb({setAttribute:function(a,b){nd(this,a,b)},removeAttribute:function(a){B.removeAttribute.call(this,a);gd(this,a)},attachShadow:function(a){if(!this)throw"Must provide a host.";if(!a)throw"Not enough arguments.";return new Qc(Ld,this,a)},get slot(){return this.getAttribute("slot")},set slot(a){nd(this,"slot",a)},get assignedSlot(){return Rd(this)}},Vd,Wd);Object.defineProperties(Xd,Mc);
+var Yd=Gb({importNode:function(a,b){return od(a,b)},getElementById:function(a){return kd(this,function(b){return b.id==a},function(a){return!!a})[0]||null}},Vd);Object.defineProperties(Yd,{_activeElement:Nc.activeElement});
+var Zd=HTMLElement.prototype.blur,$d=Gb({blur:function(){var a=y(this);(a=(a=a&&a.root)&&a.activeElement)?a.blur():Zd.call(this)}}),ae={addEventListener:function(a,b,c){"object"!==typeof c&&(c={capture:!!c});c.fa=this;this.host.addEventListener(a,b,c)},removeEventListener:function(a,b,c){"object"!==typeof c&&(c={capture:!!c});c.fa=this;this.host.removeEventListener(a,b,c)},getElementById:function(a){return kd(this,function(b){return b.id==a},function(a){return!!a})[0]||null}};
+function M(a,b){for(var c=Object.getOwnPropertyNames(b),d=0;d<c.length;d++){var e=c[d],f=Object.getOwnPropertyDescriptor(b,e);f.value?a[e]=f.value:Object.defineProperty(a,e,f)}};if(z.va){var ShadyDOM={inUse:z.va,patch:function(a){Sc(a);Rc(a);return a},isShadyRoot:A,enqueue:Qb,flush:Rb,settings:z,filterMutations:Xb,observeChildren:Vb,unobserveChildren:Wb,nativeMethods:B,nativeTree:K};window.ShadyDOM=ShadyDOM;window.Event=Ed;window.CustomEvent=Fd;window.MouseEvent=Gd;Dd();var be=window.customElements&&window.customElements.nativeHTMLElement||HTMLElement;M(Qc.prototype,ae);M(window.Node.prototype,Td);M(window.Window.prototype,Sd);M(window.Text.prototype,Ud);M(window.DocumentFragment.prototype,
+Vd);M(window.Element.prototype,Xd);M(window.Document.prototype,Yd);window.HTMLSlotElement&&M(window.HTMLSlotElement.prototype,Wd);M(be.prototype,$d);z.w&&(Oc(window.Node.prototype),Oc(window.Text.prototype),Oc(window.DocumentFragment.prototype),Oc(window.Element.prototype),Oc(be.prototype),Oc(window.Document.prototype),window.HTMLSlotElement&&Oc(window.HTMLSlotElement.prototype));Pc();window.ShadowRoot=Qc};var ce=new Set("annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph".split(" "));function de(a){var b=ce.has(a);a=/^[a-z][.0-9_a-z]*-[\-.0-9_a-z]*$/.test(a);return!b&&a}function N(a){var b=a.isConnected;if(void 0!==b)return b;for(;a&&!(a.__CE_isImportDocument||a instanceof Document);)a=a.parentNode||(window.ShadowRoot&&a instanceof ShadowRoot?a.host:void 0);return!(!a||!(a.__CE_isImportDocument||a instanceof Document))}
+function ee(a,b){for(;b&&b!==a&&!b.nextSibling;)b=b.parentNode;return b&&b!==a?b.nextSibling:null}
+function fe(a,b,c){c=void 0===c?new Set:c;for(var d=a;d;){if(d.nodeType===Node.ELEMENT_NODE){var e=d;b(e);var f=e.localName;if("link"===f&&"import"===e.getAttribute("rel")){d=e.import;if(d instanceof Node&&!c.has(d))for(c.add(d),d=d.firstChild;d;d=d.nextSibling)fe(d,b,c);d=ee(a,e);continue}else if("template"===f){d=ee(a,e);continue}if(e=e.__CE_shadowRoot)for(e=e.firstChild;e;e=e.nextSibling)fe(e,b,c)}d=d.firstChild?d.firstChild:ee(a,d)}}function O(a,b,c){a[b]=c};function ge(){this.a=new Map;this.s=new Map;this.i=[];this.c=!1}function he(a,b,c){a.a.set(b,c);a.s.set(c.constructor,c)}function ie(a,b){a.c=!0;a.i.push(b)}function je(a,b){a.c&&fe(b,function(b){return a.b(b)})}ge.prototype.b=function(a){if(this.c&&!a.__CE_patched){a.__CE_patched=!0;for(var b=0;b<this.i.length;b++)this.i[b](a)}};function Q(a,b){var c=[];fe(b,function(a){return c.push(a)});for(b=0;b<c.length;b++){var d=c[b];1===d.__CE_state?a.connectedCallback(d):ke(a,d)}}
+function R(a,b){var c=[];fe(b,function(a){return c.push(a)});for(b=0;b<c.length;b++){var d=c[b];1===d.__CE_state&&a.disconnectedCallback(d)}}
+function S(a,b,c){c=void 0===c?{}:c;var d=c.eb||new Set,e=c.ba||function(b){return ke(a,b)},f=[];fe(b,function(b){if("link"===b.localName&&"import"===b.getAttribute("rel")){var c=b.import;c instanceof Node&&(c.__CE_isImportDocument=!0,c.__CE_hasRegistry=!0);c&&"complete"===c.readyState?c.__CE_documentLoadHandled=!0:b.addEventListener("load",function(){var c=b.import;if(!c.__CE_documentLoadHandled){c.__CE_documentLoadHandled=!0;var f=new Set(d);f.delete(c);S(a,c,{eb:f,ba:e})}})}else f.push(b)},d);
+if(a.c)for(b=0;b<f.length;b++)a.b(f[b]);for(b=0;b<f.length;b++)e(f[b])}
+function ke(a,b){if(void 0===b.__CE_state){var c=b.ownerDocument;if(c.defaultView||c.__CE_isImportDocument&&c.__CE_hasRegistry)if(c=a.a.get(b.localName)){c.constructionStack.push(b);var d=c.constructor;try{try{if(new d!==b)throw Error("The custom element constructor did not produce the element being upgraded.");}finally{c.constructionStack.pop()}}catch(h){throw b.__CE_state=2,h;}b.__CE_state=1;b.__CE_definition=c;if(c.attributeChangedCallback)for(c=c.observedAttributes,d=0;d<c.length;d++){var e=c[d],
+f=b.getAttribute(e);null!==f&&a.attributeChangedCallback(b,e,null,f,null)}N(b)&&a.connectedCallback(b)}}}ge.prototype.connectedCallback=function(a){var b=a.__CE_definition;b.connectedCallback&&b.connectedCallback.call(a)};ge.prototype.disconnectedCallback=function(a){var b=a.__CE_definition;b.disconnectedCallback&&b.disconnectedCallback.call(a)};
+ge.prototype.attributeChangedCallback=function(a,b,c,d,e){var f=a.__CE_definition;f.attributeChangedCallback&&-1<f.observedAttributes.indexOf(b)&&f.attributeChangedCallback.call(a,b,c,d,e)};function le(a){var b=document;this.l=a;this.a=b;this.G=void 0;S(this.l,this.a);"loading"===this.a.readyState&&(this.G=new MutationObserver(this.b.bind(this)),this.G.observe(this.a,{childList:!0,subtree:!0}))}le.prototype.disconnect=function(){this.G&&this.G.disconnect()};le.prototype.b=function(a){var b=this.a.readyState;"interactive"!==b&&"complete"!==b||this.disconnect();for(b=0;b<a.length;b++)for(var c=a[b].addedNodes,d=0;d<c.length;d++)S(this.l,c[d])};function me(){var a=this;this.b=this.a=void 0;this.c=new Promise(function(b){a.b=b;a.a&&b(a.a)})}me.prototype.resolve=function(a){if(this.a)throw Error("Already resolved.");this.a=a;this.b&&this.b(a)};function T(a){this.ia=!1;this.l=a;this.ma=new Map;this.ja=function(a){return a()};this.S=!1;this.ka=[];this.Ha=new le(a)}p=T.prototype;
+p.define=function(a,b){var c=this;if(!(b instanceof Function))throw new TypeError("Custom element constructors must be functions.");if(!de(a))throw new SyntaxError("The element name '"+a+"' is not valid.");if(this.l.a.get(a))throw Error("A custom element with name '"+a+"' has already been defined.");if(this.ia)throw Error("A custom element is already being defined.");this.ia=!0;try{var d=function(a){var b=e[a];if(void 0!==b&&!(b instanceof Function))throw Error("The '"+a+"' callback must be a function.");
+return b},e=b.prototype;if(!(e instanceof Object))throw new TypeError("The custom element constructor's prototype is not an object.");var f=d("connectedCallback");var h=d("disconnectedCallback");var g=d("adoptedCallback");var k=d("attributeChangedCallback");var l=b.observedAttributes||[]}catch(m){return}finally{this.ia=!1}b={localName:a,constructor:b,connectedCallback:f,disconnectedCallback:h,adoptedCallback:g,attributeChangedCallback:k,observedAttributes:l,constructionStack:[]};he(this.l,a,b);this.ka.push(b);
+this.S||(this.S=!0,this.ja(function(){return ne(c)}))};p.ba=function(a){S(this.l,a)};
+function ne(a){if(!1!==a.S){a.S=!1;for(var b=a.ka,c=[],d=new Map,e=0;e<b.length;e++)d.set(b[e].localName,[]);S(a.l,document,{ba:function(b){if(void 0===b.__CE_state){var e=b.localName,f=d.get(e);f?f.push(b):a.l.a.get(e)&&c.push(b)}}});for(e=0;e<c.length;e++)ke(a.l,c[e]);for(;0<b.length;){var f=b.shift();e=f.localName;f=d.get(f.localName);for(var h=0;h<f.length;h++)ke(a.l,f[h]);(e=a.ma.get(e))&&e.resolve(void 0)}}}p.get=function(a){if(a=this.l.a.get(a))return a.constructor};
+p.Ba=function(a){if(!de(a))return Promise.reject(new SyntaxError("'"+a+"' is not a valid custom element name."));var b=this.ma.get(a);if(b)return b.c;b=new me;this.ma.set(a,b);this.l.a.get(a)&&!this.ka.some(function(b){return b.localName===a})&&b.resolve(void 0);return b.c};p.Za=function(a){this.Ha.disconnect();var b=this.ja;this.ja=function(c){return a(function(){return b(c)})}};window.CustomElementRegistry=T;T.prototype.define=T.prototype.define;T.prototype.upgrade=T.prototype.ba;
+T.prototype.get=T.prototype.get;T.prototype.whenDefined=T.prototype.Ba;T.prototype.polyfillWrapFlushCallback=T.prototype.Za;var oe=window.Document.prototype.createElement,pe=window.Document.prototype.createElementNS,qe=window.Document.prototype.importNode,re=window.Document.prototype.prepend,se=window.Document.prototype.append,te=window.DocumentFragment.prototype.prepend,ue=window.DocumentFragment.prototype.append,ve=window.Node.prototype.cloneNode,we=window.Node.prototype.appendChild,xe=window.Node.prototype.insertBefore,ye=window.Node.prototype.removeChild,ze=window.Node.prototype.replaceChild,Ae=Object.getOwnPropertyDescriptor(window.Node.prototype,
+"textContent"),Be=window.Element.prototype.attachShadow,Ce=Object.getOwnPropertyDescriptor(window.Element.prototype,"innerHTML"),De=window.Element.prototype.getAttribute,Ee=window.Element.prototype.setAttribute,Fe=window.Element.prototype.removeAttribute,Ge=window.Element.prototype.getAttributeNS,He=window.Element.prototype.setAttributeNS,Ie=window.Element.prototype.removeAttributeNS,Je=window.Element.prototype.insertAdjacentElement,Ke=window.Element.prototype.insertAdjacentHTML,Le=window.Element.prototype.prepend,
+Me=window.Element.prototype.append,Ne=window.Element.prototype.before,Oe=window.Element.prototype.after,Pe=window.Element.prototype.replaceWith,Qe=window.Element.prototype.remove,Re=window.HTMLElement,Se=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML"),Te=window.HTMLElement.prototype.insertAdjacentElement,Ue=window.HTMLElement.prototype.insertAdjacentHTML;var Ve=new function(){};function We(){var a=Xe;window.HTMLElement=function(){function b(){var b=this.constructor,d=a.s.get(b);if(!d)throw Error("The custom element being constructed was not registered with `customElements`.");var e=d.constructionStack;if(0===e.length)return e=oe.call(document,d.localName),Object.setPrototypeOf(e,b.prototype),e.__CE_state=1,e.__CE_definition=d,a.b(e),e;d=e.length-1;var f=e[d];if(f===Ve)throw Error("The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.");
+e[d]=Ve;Object.setPrototypeOf(f,b.prototype);a.b(f);return f}b.prototype=Re.prototype;return b}()};function Ye(a,b,c){function d(b){return function(c){for(var d=[],e=0;e<arguments.length;++e)d[e-0]=arguments[e];e=[];for(var f=[],l=0;l<d.length;l++){var m=d[l];m instanceof Element&&N(m)&&f.push(m);if(m instanceof DocumentFragment)for(m=m.firstChild;m;m=m.nextSibling)e.push(m);else e.push(m)}b.apply(this,d);for(d=0;d<f.length;d++)R(a,f[d]);if(N(this))for(d=0;d<e.length;d++)f=e[d],f instanceof Element&&Q(a,f)}}void 0!==c.$&&(b.prepend=d(c.$));void 0!==c.append&&(b.append=d(c.append))};function Ze(){var a=Xe;O(Document.prototype,"createElement",function(b){if(this.__CE_hasRegistry){var c=a.a.get(b);if(c)return new c.constructor}b=oe.call(this,b);a.b(b);return b});O(Document.prototype,"importNode",function(b,c){b=qe.call(this,b,c);this.__CE_hasRegistry?S(a,b):je(a,b);return b});O(Document.prototype,"createElementNS",function(b,c){if(this.__CE_hasRegistry&&(null===b||"http://www.w3.org/1999/xhtml"===b)){var d=a.a.get(c);if(d)return new d.constructor}b=pe.call(this,b,c);a.b(b);return b});
+Ye(a,Document.prototype,{$:re,append:se})};function $e(){var a=Xe;function b(b,d){Object.defineProperty(b,"textContent",{enumerable:d.enumerable,configurable:!0,get:d.get,set:function(b){if(this.nodeType===Node.TEXT_NODE)d.set.call(this,b);else{var c=void 0;if(this.firstChild){var e=this.childNodes,g=e.length;if(0<g&&N(this)){c=Array(g);for(var k=0;k<g;k++)c[k]=e[k]}}d.set.call(this,b);if(c)for(b=0;b<c.length;b++)R(a,c[b])}}})}O(Node.prototype,"insertBefore",function(b,d){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);
+b=xe.call(this,b,d);if(N(this))for(d=0;d<c.length;d++)Q(a,c[d]);return b}c=N(b);d=xe.call(this,b,d);c&&R(a,b);N(this)&&Q(a,b);return d});O(Node.prototype,"appendChild",function(b){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);b=we.call(this,b);if(N(this))for(var e=0;e<c.length;e++)Q(a,c[e]);return b}c=N(b);e=we.call(this,b);c&&R(a,b);N(this)&&Q(a,b);return e});O(Node.prototype,"cloneNode",function(b){b=ve.call(this,b);this.ownerDocument.__CE_hasRegistry?S(a,b):
+je(a,b);return b});O(Node.prototype,"removeChild",function(b){var c=N(b),e=ye.call(this,b);c&&R(a,b);return e});O(Node.prototype,"replaceChild",function(b,d){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);b=ze.call(this,b,d);if(N(this))for(R(a,d),d=0;d<c.length;d++)Q(a,c[d]);return b}c=N(b);var f=ze.call(this,b,d),h=N(this);h&&R(a,d);c&&R(a,b);h&&Q(a,b);return f});Ae&&Ae.get?b(Node.prototype,Ae):ie(a,function(a){b(a,{enumerable:!0,configurable:!0,get:function(){for(var a=
+[],b=0;b<this.childNodes.length;b++)a.push(this.childNodes[b].textContent);return a.join("")},set:function(a){for(;this.firstChild;)ye.call(this,this.firstChild);we.call(this,document.createTextNode(a))}})})};function af(a){var b=Element.prototype;function c(b){return function(c){for(var d=[],e=0;e<arguments.length;++e)d[e-0]=arguments[e];e=[];for(var g=[],k=0;k<d.length;k++){var l=d[k];l instanceof Element&&N(l)&&g.push(l);if(l instanceof DocumentFragment)for(l=l.firstChild;l;l=l.nextSibling)e.push(l);else e.push(l)}b.apply(this,d);for(d=0;d<g.length;d++)R(a,g[d]);if(N(this))for(d=0;d<e.length;d++)g=e[d],g instanceof Element&&Q(a,g)}}void 0!==Ne&&(b.before=c(Ne));void 0!==Ne&&(b.after=c(Oe));void 0!==
+Pe&&O(b,"replaceWith",function(b){for(var c=[],d=0;d<arguments.length;++d)c[d-0]=arguments[d];d=[];for(var h=[],g=0;g<c.length;g++){var k=c[g];k instanceof Element&&N(k)&&h.push(k);if(k instanceof DocumentFragment)for(k=k.firstChild;k;k=k.nextSibling)d.push(k);else d.push(k)}g=N(this);Pe.apply(this,c);for(c=0;c<h.length;c++)R(a,h[c]);if(g)for(R(a,this),c=0;c<d.length;c++)h=d[c],h instanceof Element&&Q(a,h)});void 0!==Qe&&O(b,"remove",function(){var b=N(this);Qe.call(this);b&&R(a,this)})};function bf(){var a=Xe;function b(b,c){Object.defineProperty(b,"innerHTML",{enumerable:c.enumerable,configurable:!0,get:c.get,set:function(b){var d=this,e=void 0;N(this)&&(e=[],fe(this,function(a){a!==d&&e.push(a)}));c.set.call(this,b);if(e)for(var f=0;f<e.length;f++){var h=e[f];1===h.__CE_state&&a.disconnectedCallback(h)}this.ownerDocument.__CE_hasRegistry?S(a,this):je(a,this);return b}})}function c(b,c){O(b,"insertAdjacentElement",function(b,d){var e=N(d);b=c.call(this,b,d);e&&R(a,d);N(b)&&Q(a,
+d);return b})}function d(b,c){function d(b,c){for(var d=[];b!==c;b=b.nextSibling)d.push(b);for(c=0;c<d.length;c++)S(a,d[c])}O(b,"insertAdjacentHTML",function(a,b){a=a.toLowerCase();if("beforebegin"===a){var e=this.previousSibling;c.call(this,a,b);d(e||this.parentNode.firstChild,this)}else if("afterbegin"===a)e=this.firstChild,c.call(this,a,b),d(this.firstChild,e);else if("beforeend"===a)e=this.lastChild,c.call(this,a,b),d(e||this.firstChild,null);else if("afterend"===a)e=this.nextSibling,c.call(this,
+a,b),d(this.nextSibling,e);else throw new SyntaxError("The value provided ("+String(a)+") is not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'.");})}Be&&O(Element.prototype,"attachShadow",function(a){return this.__CE_shadowRoot=a=Be.call(this,a)});Ce&&Ce.get?b(Element.prototype,Ce):Se&&Se.get?b(HTMLElement.prototype,Se):ie(a,function(a){b(a,{enumerable:!0,configurable:!0,get:function(){return ve.call(this,!0).innerHTML},set:function(a){var b="template"===this.localName,c=b?this.content:
+this,d=oe.call(document,this.localName);for(d.innerHTML=a;0<c.childNodes.length;)ye.call(c,c.childNodes[0]);for(a=b?d.content:d;0<a.childNodes.length;)we.call(c,a.childNodes[0])}})});O(Element.prototype,"setAttribute",function(b,c){if(1!==this.__CE_state)return Ee.call(this,b,c);var d=De.call(this,b);Ee.call(this,b,c);c=De.call(this,b);a.attributeChangedCallback(this,b,d,c,null)});O(Element.prototype,"setAttributeNS",function(b,c,d){if(1!==this.__CE_state)return He.call(this,b,c,d);var e=Ge.call(this,
+b,c);He.call(this,b,c,d);d=Ge.call(this,b,c);a.attributeChangedCallback(this,c,e,d,b)});O(Element.prototype,"removeAttribute",function(b){if(1!==this.__CE_state)return Fe.call(this,b);var c=De.call(this,b);Fe.call(this,b);null!==c&&a.attributeChangedCallback(this,b,c,null,null)});O(Element.prototype,"removeAttributeNS",function(b,c){if(1!==this.__CE_state)return Ie.call(this,b,c);var d=Ge.call(this,b,c);Ie.call(this,b,c);var e=Ge.call(this,b,c);d!==e&&a.attributeChangedCallback(this,c,d,e,b)});Te?
+c(HTMLElement.prototype,Te):Je?c(Element.prototype,Je):console.warn("Custom Elements: `Element#insertAdjacentElement` was not patched.");Ue?d(HTMLElement.prototype,Ue):Ke?d(Element.prototype,Ke):console.warn("Custom Elements: `Element#insertAdjacentHTML` was not patched.");Ye(a,Element.prototype,{$:Le,append:Me});af(a)};var cf=window.customElements;if(!cf||cf.forcePolyfill||"function"!=typeof cf.define||"function"!=typeof cf.get){var Xe=new ge;We();Ze();Ye(Xe,DocumentFragment.prototype,{$:te,append:ue});$e();bf();document.__CE_hasRegistry=!0;var customElements=new T(Xe);Object.defineProperty(window,"customElements",{configurable:!0,enumerable:!0,value:customElements})};function df(){this.end=this.start=0;this.rules=this.parent=this.previous=null;this.cssText=this.parsedCssText="";this.atRule=!1;this.type=0;this.parsedSelector=this.selector=this.keyframesName=""}
+function ef(a){a=a.replace(ff,"").replace(gf,"");var b=kf,c=a,d=new df;d.start=0;d.end=c.length;for(var e=d,f=0,h=c.length;f<h;f++)if("{"===c[f]){e.rules||(e.rules=[]);var g=e,k=g.rules[g.rules.length-1]||null;e=new df;e.start=f+1;e.parent=g;e.previous=k;g.rules.push(e)}else"}"===c[f]&&(e.end=f+1,e=e.parent||d);return b(d,a)}
+function kf(a,b){var c=b.substring(a.start,a.end-1);a.parsedCssText=a.cssText=c.trim();a.parent&&(c=b.substring(a.previous?a.previous.end:a.parent.start,a.start-1),c=lf(c),c=c.replace(mf," "),c=c.substring(c.lastIndexOf(";")+1),c=a.parsedSelector=a.selector=c.trim(),a.atRule=0===c.indexOf("@"),a.atRule?0===c.indexOf("@media")?a.type=nf:c.match(of)&&(a.type=pf,a.keyframesName=a.selector.split(mf).pop()):a.type=0===c.indexOf("--")?qf:rf);if(c=a.rules)for(var d=0,e=c.length,f;d<e&&(f=c[d]);d++)kf(f,
+b);return a}function lf(a){return a.replace(/\\([0-9a-f]{1,6})\s/gi,function(a,c){a=c;for(c=6-a.length;c--;)a="0"+a;return"\\"+a})}
+function sf(a,b,c){c=void 0===c?"":c;var d="";if(a.cssText||a.rules){var e=a.rules,f;if(f=e)f=e[0],f=!(f&&f.selector&&0===f.selector.indexOf("--"));if(f){f=0;for(var h=e.length,g;f<h&&(g=e[f]);f++)d=sf(g,b,d)}else b?b=a.cssText:(b=a.cssText,b=b.replace(tf,"").replace(uf,""),b=b.replace(vf,"").replace(wf,"")),(d=b.trim())&&(d=" "+d+"\n")}d&&(a.selector&&(c+=a.selector+" {\n"),c+=d,a.selector&&(c+="}\n\n"));return c}
+var rf=1,pf=7,nf=4,qf=1E3,ff=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,gf=/@import[^;]*;/gim,tf=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,uf=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,vf=/@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,wf=/[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,of=/^@[^\s]*keyframes/,mf=/\s+/g;var U=!(window.ShadyDOM&&window.ShadyDOM.inUse),xf;function yf(a){xf=a&&a.shimcssproperties?!1:U||!(navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/)||!window.CSS||!CSS.supports||!CSS.supports("box-shadow","0 0 0 var(--foo)"))}window.ShadyCSS&&void 0!==window.ShadyCSS.nativeCss?xf=window.ShadyCSS.nativeCss:window.ShadyCSS?(yf(window.ShadyCSS),window.ShadyCSS=void 0):yf(window.WebComponents&&window.WebComponents.flags);var V=xf;var zf=/(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};{])+)|\{([^}]*)\}(?:(?=[;\s}])|$))/gi,Af=/(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi,Bf=/(--[\w-]+)\s*([:,;)]|$)/gi,Cf=/(animation\s*:)|(animation-name\s*:)/,Df=/@media\s(.*)/,Ef=/\{[^}]*\}/g;var Ff=new Set;function Gf(a,b){if(!a)return"";"string"===typeof a&&(a=ef(a));b&&Hf(a,b);return sf(a,V)}function If(a){!a.__cssRules&&a.textContent&&(a.__cssRules=ef(a.textContent));return a.__cssRules||null}function Jf(a){return!!a.parent&&a.parent.type===pf}function Hf(a,b,c,d){if(a){var e=!1,f=a.type;if(d&&f===nf){var h=a.selector.match(Df);h&&(window.matchMedia(h[1]).matches||(e=!0))}f===rf?b(a):c&&f===pf?c(a):f===qf&&(e=!0);if((a=a.rules)&&!e){e=0;f=a.length;for(var g;e<f&&(g=a[e]);e++)Hf(g,b,c,d)}}}
+function Kf(a,b,c,d){var e=document.createElement("style");b&&e.setAttribute("scope",b);e.textContent=a;Lf(e,c,d);return e}var Mf=null;function Lf(a,b,c){b=b||document.head;b.insertBefore(a,c&&c.nextSibling||b.firstChild);Mf?a.compareDocumentPosition(Mf)===Node.DOCUMENT_POSITION_PRECEDING&&(Mf=a):Mf=a}
+function Nf(a,b){var c=a.indexOf("var(");if(-1===c)return b(a,"","","");a:{var d=0;var e=c+3;for(var f=a.length;e<f;e++)if("("===a[e])d++;else if(")"===a[e]&&0===--d)break a;e=-1}d=a.substring(c+4,e);c=a.substring(0,c);a=Nf(a.substring(e+1),b);e=d.indexOf(",");return-1===e?b(c,d.trim(),"",a):b(c,d.substring(0,e).trim(),d.substring(e+1).trim(),a)}function Of(a,b){U?a.setAttribute("class",b):window.ShadyDOM.nativeMethods.setAttribute.call(a,"class",b)}
+function Pf(a){var b=a.localName,c="";b?-1<b.indexOf("-")||(c=b,b=a.getAttribute&&a.getAttribute("is")||""):(b=a.is,c=a.extends);return{is:b,R:c}};function Qf(){}function Rf(a,b,c){var d=W;a.__styleScoped?a.__styleScoped=null:Sf(d,a,b||"",c)}function Sf(a,b,c,d){b.nodeType===Node.ELEMENT_NODE&&Tf(b,c,d);if(b="template"===b.localName?(b.content||b.kb).childNodes:b.children||b.childNodes)for(var e=0;e<b.length;e++)Sf(a,b[e],c,d)}
+function Tf(a,b,c){if(b)if(a.classList)c?(a.classList.remove("style-scope"),a.classList.remove(b)):(a.classList.add("style-scope"),a.classList.add(b));else if(a.getAttribute){var d=a.getAttribute(Uf);c?d&&(b=d.replace("style-scope","").replace(b,""),Of(a,b)):Of(a,(d?d+" ":"")+"style-scope "+b)}}function Vf(a,b,c){var d=W,e=a.__cssBuild;U||"shady"===e?b=Gf(b,c):(a=Pf(a),b=Wf(d,b,a.is,a.R,c)+"\n\n");return b.trim()}
+function Wf(a,b,c,d,e){var f=Xf(c,d);c=c?Yf+c:"";return Gf(b,function(b){b.c||(b.selector=b.o=Zf(a,b,a.b,c,f),b.c=!0);e&&e(b,c,f)})}function Xf(a,b){return b?"[is="+a+"]":a}function Zf(a,b,c,d,e){var f=b.selector.split($f);if(!Jf(b)){b=0;for(var h=f.length,g;b<h&&(g=f[b]);b++)f[b]=c.call(a,g,d,e)}return f.join($f)}function ag(a){return a.replace(bg,function(a,c,d){-1<d.indexOf("+")?d=d.replace(/\+/g,"___"):-1<d.indexOf("___")&&(d=d.replace(/___/g,"+"));return":"+c+"("+d+")"})}
+Qf.prototype.b=function(a,b,c){var d=!1;a=a.trim();var e=bg.test(a);e&&(a=a.replace(bg,function(a,b,c){return":"+b+"("+c.replace(/\s/g,"")+")"}),a=ag(a));a=a.replace(cg,dg+" $1");a=a.replace(eg,function(a,e,g){d||(a=fg(g,e,b,c),d=d||a.stop,e=a.Oa,g=a.value);return e+g});e&&(a=ag(a));return a};
+function fg(a,b,c,d){var e=a.indexOf(gg);0<=a.indexOf(dg)?a=hg(a,d):0!==e&&(a=c?ig(a,c):a);c=!1;0<=e&&(b="",c=!0);if(c){var f=!0;c&&(a=a.replace(jg,function(a,b){return" > "+b}))}a=a.replace(kg,function(a,b,c){return'[dir="'+c+'"] '+b+", "+b+'[dir="'+c+'"]'});return{value:a,Oa:b,stop:f}}function ig(a,b){a=a.split(lg);a[0]+=b;return a.join(lg)}
+function hg(a,b){var c=a.match(mg);return(c=c&&c[2].trim()||"")?c[0].match(ng)?a.replace(mg,function(a,c,f){return b+f}):c.split(ng)[0]===b?c:og:a.replace(dg,b)}function pg(a){a.selector===qg&&(a.selector="html")}Qf.prototype.c=function(a){return a.match(gg)?this.b(a,rg):ig(a.trim(),rg)};q.Object.defineProperties(Qf.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"style-scope"}}});
+var bg=/:(nth[-\w]+)\(([^)]+)\)/,rg=":not(.style-scope)",$f=",",eg=/(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=[])+)/g,ng=/[[.:#*]/,dg=":host",qg=":root",gg="::slotted",cg=new RegExp("^("+gg+")"),mg=/(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,jg=/(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,kg=/(.*):dir\((?:(ltr|rtl))\)/,Yf=".",lg=":",Uf="class",og="should_not_match",W=new Qf;function sg(a,b,c,d){this.B=a||null;this.b=b||null;this.na=c||[];this.K=null;this.R=d||"";this.a=this.u=this.F=null}function X(a){return a?a.__styleInfo:null}function tg(a,b){return a.__styleInfo=b}sg.prototype.c=function(){return this.B};sg.prototype._getStyleRules=sg.prototype.c;function ug(a){var b=this.matches||this.matchesSelector||this.mozMatchesSelector||this.msMatchesSelector||this.oMatchesSelector||this.webkitMatchesSelector;return b&&b.call(this,a)}var vg=navigator.userAgent.match("Trident");function wg(){}function xg(a){var b={},c=[],d=0;Hf(a,function(a){yg(a);a.index=d++;a=a.m.cssText;for(var c;c=Bf.exec(a);){var e=c[1];":"!==c[2]&&(b[e]=!0)}},function(a){c.push(a)});a.b=c;a=[];for(var e in b)a.push(e);return a}
+function yg(a){if(!a.m){var b={},c={};zg(a,c)&&(b.A=c,a.rules=null);b.cssText=a.parsedCssText.replace(Ef,"").replace(zf,"");a.m=b}}function zg(a,b){var c=a.m;if(c){if(c.A)return Object.assign(b,c.A),!0}else{c=a.parsedCssText;for(var d;a=zf.exec(c);){d=(a[2]||a[3]).trim();if("inherit"!==d||"unset"!==d)b[a[1].trim()]=d;d=!0}return d}}
+function Ag(a,b,c){b&&(b=0<=b.indexOf(";")?Bg(a,b,c):Nf(b,function(b,e,f,h){if(!e)return b+h;(e=Ag(a,c[e],c))&&"initial"!==e?"apply-shim-inherit"===e&&(e="inherit"):e=Ag(a,c[f]||f,c)||f;return b+(e||"")+h}));return b&&b.trim()||""}
+function Bg(a,b,c){b=b.split(";");for(var d=0,e,f;d<b.length;d++)if(e=b[d]){Af.lastIndex=0;if(f=Af.exec(e))e=Ag(a,c[f[1]],c);else if(f=e.indexOf(":"),-1!==f){var h=e.substring(f);h=h.trim();h=Ag(a,h,c)||h;e=e.substring(0,f)+h}b[d]=e&&e.lastIndexOf(";")===e.length-1?e.slice(0,-1):e||""}return b.join(";")}
+function Cg(a,b){var c={},d=[];Hf(a,function(a){a.m||yg(a);var e=a.o||a.parsedSelector;b&&a.m.A&&e&&ug.call(b,e)&&(zg(a,c),a=a.index,e=parseInt(a/32,10),d[e]=(d[e]||0)|1<<a%32)},null,!0);return{A:c,key:d}}
+function Dg(a,b,c,d){b.m||yg(b);if(b.m.A){var e=Pf(a);a=e.is;e=e.R;e=a?Xf(a,e):"html";var f=b.parsedSelector,h=":host > *"===f||"html"===f,g=0===f.indexOf(":host")&&!h;"shady"===c&&(h=f===e+" > *."+e||-1!==f.indexOf("html"),g=!h&&0===f.indexOf(e));"shadow"===c&&(h=":host > *"===f||"html"===f,g=g&&!h);if(h||g)c=e,g&&(b.o||(b.o=Zf(W,b,W.b,a?Yf+a:"",e)),c=b.o||e),d({ab:c,Ua:g,tb:h})}}
+function Eg(a,b){var c={},d={},e=b&&b.__cssBuild;Hf(b,function(b){Dg(a,b,e,function(e){ug.call(a.b||a,e.ab)&&(e.Ua?zg(b,c):zg(b,d))})},null,!0);return{$a:d,Sa:c}}
+function Fg(a,b,c,d){var e=Pf(b),f=Xf(e.is,e.R),h=new RegExp("(?:^|[^.#[:])"+(b.extends?"\\"+f.slice(0,-1)+"\\]":f)+"($|[.:[\\s>+~])");e=X(b).B;var g=Gg(e,d);return Vf(b,e,function(b){var e="";b.m||yg(b);b.m.cssText&&(e=Bg(a,b.m.cssText,c));b.cssText=e;if(!U&&!Jf(b)&&b.cssText){var k=e=b.cssText;null==b.ua&&(b.ua=Cf.test(e));if(b.ua)if(null==b.Z){b.Z=[];for(var n in g)k=g[n],k=k(e),e!==k&&(e=k,b.Z.push(n))}else{for(n=0;n<b.Z.length;++n)k=g[b.Z[n]],e=k(e);k=e}b.cssText=k;b.o=b.o||b.selector;e="."+
+d;n=b.o.split(",");k=0;for(var t=n.length,C;k<t&&(C=n[k]);k++)n[k]=C.match(h)?C.replace(f,e):e+" "+C;b.selector=n.join(",")}})}function Gg(a,b){a=a.b;var c={};if(!U&&a)for(var d=0,e=a[d];d<a.length;e=a[++d]){var f=e,h=b;f.i=new RegExp("\\b"+f.keyframesName+"(?!\\B|-)","g");f.a=f.keyframesName+"-"+h;f.o=f.o||f.selector;f.selector=f.o.replace(f.keyframesName,f.a);c[e.keyframesName]=Hg(e)}return c}function Hg(a){return function(b){return b.replace(a.i,a.a)}}
+function Ig(a,b){var c=Jg,d=If(a);a.textContent=Gf(d,function(a){var d=a.cssText=a.parsedCssText;a.m&&a.m.cssText&&(d=d.replace(tf,"").replace(uf,""),a.cssText=Bg(c,d,b))})}q.Object.defineProperties(wg.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"x-scope"}}});var Jg=new wg;var Kg={},Lg=window.customElements;if(Lg&&!U){var Mg=Lg.define;Lg.define=function(a,b,c){var d=document.createComment(" Shady DOM styles for "+a+" "),e=document.head;e.insertBefore(d,(Mf?Mf.nextSibling:null)||e.firstChild);Mf=d;Kg[a]=d;Mg.call(Lg,a,b,c)}};function Ng(){this.cache={}}Ng.prototype.store=function(a,b,c,d){var e=this.cache[a]||[];e.push({A:b,styleElement:c,u:d});100<e.length&&e.shift();this.cache[a]=e};Ng.prototype.fetch=function(a,b,c){if(a=this.cache[a])for(var d=a.length-1;0<=d;d--){var e=a[d],f;a:{for(f=0;f<c.length;f++){var h=c[f];if(e.A[h]!==b[h]){f=!1;break a}}f=!0}if(f)return e}};function Og(){}
+function Pg(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.target!==document.documentElement&&c.target!==document.head)for(var d=0;d<c.addedNodes.length;d++){var e=c.addedNodes[d];if(e.nodeType===Node.ELEMENT_NODE){var f=e.getRootNode();var h=e;var g=[];h.classList?g=Array.from(h.classList):h instanceof window.SVGElement&&h.hasAttribute("class")&&(g=h.getAttribute("class").split(/\s+/));h=g;g=h.indexOf(W.a);if((h=-1<g?h[g+1]:"")&&f===e.ownerDocument)Rf(e,h,!0);else if(f.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&
+(f=f.host))if(f=Pf(f).is,h===f)for(e=window.ShadyDOM.nativeMethods.querySelectorAll.call(e,":not(."+W.a+")"),f=0;f<e.length;f++)Tf(e[f],h);else h&&Rf(e,h,!0),Rf(e,f)}}}}
+if(!U){var Qg=new MutationObserver(Pg),Rg=function(a){Qg.observe(a,{childList:!0,subtree:!0})};if(window.customElements&&!window.customElements.polyfillWrapFlushCallback)Rg(document);else{var Sg=function(){Rg(document.body)};window.HTMLImports?window.HTMLImports.whenReady(Sg):requestAnimationFrame(function(){if("loading"===document.readyState){var a=function(){Sg();document.removeEventListener("readystatechange",a)};document.addEventListener("readystatechange",a)}else Sg()})}Og=function(){Pg(Qg.takeRecords())}}
+var Tg=Og;var Ug={};var Vg=Promise.resolve();function Wg(a){if(a=Ug[a])a._applyShimCurrentVersion=a._applyShimCurrentVersion||0,a._applyShimValidatingVersion=a._applyShimValidatingVersion||0,a._applyShimNextVersion=(a._applyShimNextVersion||0)+1}function Xg(a){return a._applyShimCurrentVersion===a._applyShimNextVersion}function Yg(a){a._applyShimValidatingVersion=a._applyShimNextVersion;a.ta||(a.ta=!0,Vg.then(function(){a._applyShimCurrentVersion=a._applyShimNextVersion;a.ta=!1}))};var Zg=null,$g=window.HTMLImports&&window.HTMLImports.whenReady||null,ah;function bh(a){requestAnimationFrame(function(){$g?$g(a):(Zg||(Zg=new Promise(function(a){ah=a}),"complete"===document.readyState?ah():document.addEventListener("readystatechange",function(){"complete"===document.readyState&&ah()})),Zg.then(function(){a&&a()}))})};var ch=new Ng;function Y(){var a=this;this.N={};this.c=document.documentElement;var b=new df;b.rules=[];this.i=tg(this.c,new sg(b));this.s=!1;this.b=this.a=null;bh(function(){dh(a)})}p=Y.prototype;p.Ca=function(){Tg()};p.Qa=function(a){return If(a)};p.cb=function(a){return Gf(a)};
+p.prepareTemplate=function(a,b,c){if(!a.Ma){a.Ma=!0;a.name=b;a.extends=c;Ug[b]=a;var d=(d=a.content.querySelector("style"))?d.getAttribute("css-build")||"":"";var e=[];for(var f=a.content.querySelectorAll("style"),h=0;h<f.length;h++){var g=f[h];if(g.hasAttribute("shady-unscoped")){if(!U){var k=g.textContent;Ff.has(k)||(Ff.add(k),k=g.cloneNode(!0),document.head.appendChild(k));g.parentNode.removeChild(g)}}else e.push(g.textContent),g.parentNode.removeChild(g)}e=e.join("").trim();c={is:b,extends:c,
+ib:d};U||Rf(a.content,b);dh(this);f=Af.test(e)||zf.test(e);Af.lastIndex=0;zf.lastIndex=0;e=ef(e);f&&V&&this.a&&this.a.transformRules(e,b);a._styleAst=e;a.a=d;d=[];V||(d=xg(a._styleAst));if(!d.length||V)e=U?a.content:null,b=Kg[b],f=Vf(c,a._styleAst),b=f.length?Kf(f,c.is,e,b):void 0,a.sa=b;a.La=d}};
+function eh(a){!a.b&&window.ShadyCSS&&window.ShadyCSS.CustomStyleInterface&&(a.b=window.ShadyCSS.CustomStyleInterface,a.b.transformCallback=function(b){a.za(b)},a.b.validateCallback=function(){requestAnimationFrame(function(){(a.b.enqueued||a.s)&&a.I()})})}function dh(a){!a.a&&window.ShadyCSS&&window.ShadyCSS.ApplyShim&&(a.a=window.ShadyCSS.ApplyShim,a.a.invalidCallback=Wg);eh(a)}
+p.I=function(){dh(this);if(this.b){var a=this.b.processStyles();if(this.b.enqueued){if(V)for(var b=0;b<a.length;b++){var c=this.b.getStyleForCustomStyle(a[b]);if(c&&V&&this.a){var d=If(c);dh(this);this.a.transformRules(d);c.textContent=Gf(d)}}else for(fh(this,this.c,this.i),b=0;b<a.length;b++)(c=this.b.getStyleForCustomStyle(a[b]))&&Ig(c,this.i.F);this.b.enqueued=!1;this.s&&!V&&this.styleDocument()}}};
+p.styleElement=function(a,b){var c=Pf(a).is,d=X(a);if(!d){var e=Pf(a);d=e.is;e=e.R;var f=Kg[d];d=Ug[d];if(d){var h=d._styleAst;var g=d.La}d=tg(a,new sg(h,f,g,e))}a!==this.c&&(this.s=!0);b&&(d.K=d.K||{},Object.assign(d.K,b));if(V){if(d.K){b=d.K;for(var k in b)null===k?a.style.removeProperty(k):a.style.setProperty(k,b[k])}if(((k=Ug[c])||a===this.c)&&k&&k.sa&&!Xg(k)){if(Xg(k)||k._applyShimValidatingVersion!==k._applyShimNextVersion)dh(this),this.a&&this.a.transformRules(k._styleAst,c),k.sa.textContent=
+Vf(a,d.B),Yg(k);U&&(c=a.shadowRoot)&&(c.querySelector("style").textContent=Vf(a,d.B));d.B=k._styleAst}}else if(fh(this,a,d),d.na&&d.na.length){c=d;k=Pf(a).is;d=(b=ch.fetch(k,c.F,c.na))?b.styleElement:null;h=c.u;(g=b&&b.u)||(g=this.N[k]=(this.N[k]||0)+1,g=k+"-"+g);c.u=g;g=c.u;e=Jg;e=d?d.textContent||"":Fg(e,a,c.F,g);f=X(a);var l=f.a;l&&!U&&l!==d&&(l._useCount--,0>=l._useCount&&l.parentNode&&l.parentNode.removeChild(l));U?f.a?(f.a.textContent=e,d=f.a):e&&(d=Kf(e,g,a.shadowRoot,f.b)):d?d.parentNode||
+(vg&&-1<e.indexOf("@media")&&(d.textContent=e),Lf(d,null,f.b)):e&&(d=Kf(e,g,null,f.b));d&&(d._useCount=d._useCount||0,f.a!=d&&d._useCount++,f.a=d);g=d;U||(d=c.u,f=e=a.getAttribute("class")||"",h&&(f=e.replace(new RegExp("\\s*x-scope\\s*"+h+"\\s*","g")," ")),f+=(f?" ":"")+"x-scope "+d,e!==f&&Of(a,f));b||ch.store(k,c.F,g,c.u)}};function gh(a,b){return(b=b.getRootNode().host)?X(b)?b:gh(a,b):a.c}
+function fh(a,b,c){a=gh(a,b);var d=X(a);a=Object.create(d.F||null);var e=Eg(b,c.B);b=Cg(d.B,b).A;Object.assign(a,e.Sa,b,e.$a);b=c.K;for(var f in b)if((e=b[f])||0===e)a[f]=e;f=Jg;b=Object.getOwnPropertyNames(a);for(e=0;e<b.length;e++)d=b[e],a[d]=Ag(f,a[d],a);c.F=a}p.styleDocument=function(a){this.styleSubtree(this.c,a)};
+p.styleSubtree=function(a,b){var c=a.shadowRoot;(c||a===this.c)&&this.styleElement(a,b);if(b=c&&(c.children||c.childNodes))for(a=0;a<b.length;a++)this.styleSubtree(b[a]);else if(a=a.children||a.childNodes)for(b=0;b<a.length;b++)this.styleSubtree(a[b])};p.za=function(a){var b=this,c=If(a);Hf(c,function(a){if(U)pg(a);else{var c=W;a.selector=a.parsedSelector;pg(a);a.selector=a.o=Zf(c,a,c.c,void 0,void 0)}V&&(dh(b),b.a&&b.a.transformRule(a))});V?a.textContent=Gf(c):this.i.B.rules.push(c)};
+p.getComputedStyleValue=function(a,b){var c;V||(c=(X(a)||X(gh(this,a))).F[b]);return(c=c||window.getComputedStyle(a).getPropertyValue(b))?c.trim():""};p.bb=function(a,b){var c=a.getRootNode();b=b?b.split(/\s/):[];c=c.host&&c.host.localName;if(!c){var d=a.getAttribute("class");if(d){d=d.split(/\s/);for(var e=0;e<d.length;e++)if(d[e]===W.a){c=d[e+1];break}}}c&&b.push(W.a,c);V||(c=X(a))&&c.u&&b.push(Jg.a,c.u);Of(a,b.join(" "))};p.Na=function(a){return X(a)};Y.prototype.flush=Y.prototype.Ca;
+Y.prototype.prepareTemplate=Y.prototype.prepareTemplate;Y.prototype.styleElement=Y.prototype.styleElement;Y.prototype.styleDocument=Y.prototype.styleDocument;Y.prototype.styleSubtree=Y.prototype.styleSubtree;Y.prototype.getComputedStyleValue=Y.prototype.getComputedStyleValue;Y.prototype.setElementClass=Y.prototype.bb;Y.prototype._styleInfoForNode=Y.prototype.Na;Y.prototype.transformCustomStyleForDocument=Y.prototype.za;Y.prototype.getStyleAst=Y.prototype.Qa;Y.prototype.styleAstToString=Y.prototype.cb;
+Y.prototype.flushCustomStyles=Y.prototype.I;Object.defineProperties(Y.prototype,{nativeShadow:{get:function(){return U}},nativeCss:{get:function(){return V}}});var Z=new Y,hh,ih;window.ShadyCSS&&(hh=window.ShadyCSS.ApplyShim,ih=window.ShadyCSS.CustomStyleInterface);window.ShadyCSS={ScopingShim:Z,prepareTemplate:function(a,b,c){Z.I();Z.prepareTemplate(a,b,c)},styleSubtree:function(a,b){Z.I();Z.styleSubtree(a,b)},styleElement:function(a){Z.I();Z.styleElement(a)},styleDocument:function(a){Z.I();Z.styleDocument(a)},getComputedStyleValue:function(a,b){return Z.getComputedStyleValue(a,b)},nativeCss:V,nativeShadow:U};hh&&(window.ShadyCSS.ApplyShim=hh);
+ih&&(window.ShadyCSS.CustomStyleInterface=ih);var jh=window.customElements,kh=window.HTMLImports,lh=window.HTMLTemplateElement;window.WebComponents=window.WebComponents||{};if(jh&&jh.polyfillWrapFlushCallback){var mh,nh=function(){if(mh){lh.M&&lh.M(window.document);var a=mh;mh=null;a();return!0}},oh=kh.whenReady;jh.polyfillWrapFlushCallback(function(a){mh=a;oh(nh)});kh.whenReady=function(a){oh(function(){nh()?kh.whenReady(a):a()})}}
+kh.whenReady(function(){requestAnimationFrame(function(){window.WebComponents.ready=!0;document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})});var ph=document.createElement("style");ph.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var qh=document.querySelector("head");qh.insertBefore(ph,qh.firstChild);}).call(this);
+
+//# sourceMappingURL=webcomponents-lite.js.map
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-lite.js.map b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-lite.js.map
new file mode 100644
index 00000000000..6bdb99712f6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-lite.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"," [synthetic:util/global] "," [synthetic:util/defineproperty] "," [synthetic:es6/symbol] "," [synthetic:es6/util/makeiterator] "," [synthetic:es6/util/arrayfromiterator] ","node_modules/@webcomponents/template/template.js","node_modules/es6-promise/lib/es6-promise/utils.js","node_modules/es6-promise/lib/es6-promise/asap.js","node_modules/es6-promise/lib/es6-promise/then.js","node_modules/es6-promise/lib/es6-promise/-internal.js","node_modules/es6-promise/lib/es6-promise/promise/resolve.js","node_modules/es6-promise/lib/es6-promise/enumerator.js","node_modules/es6-promise/lib/es6-promise/promise.js","node_modules/es6-promise/lib/es6-promise/promise/all.js","node_modules/es6-promise/lib/es6-promise/promise/race.js","node_modules/es6-promise/lib/es6-promise/promise/reject.js","src/promise.js","node_modules/@webcomponents/html-imports/src/html-imports.js","src/pre-polyfill.js","node_modules/@webcomponents/shadydom/src/shady-data.js","node_modules/@webcomponents/shadydom/src/utils.js","node_modules/@webcomponents/shadydom/src/flush.js","node_modules/@webcomponents/shadydom/src/observe-changes.js","node_modules/@webcomponents/shadydom/src/native-methods.js","node_modules/@webcomponents/shadydom/src/innerHTML.js","node_modules/@webcomponents/shadydom/src/native-tree-walker.js","node_modules/@webcomponents/shadydom/src/native-tree-accessors.js","node_modules/@webcomponents/shadydom/src/native-tree.js","node_modules/@webcomponents/shadydom/src/patch-accessors.js","node_modules/@webcomponents/shadydom/src/attach-shadow.js","node_modules/@webcomponents/shadydom/src/patch-builtins.js","node_modules/@webcomponents/shadydom/src/logical-tree.js","node_modules/@webcomponents/shadydom/src/logical-mutation.js"," [synthetic:es6/util/arrayfromiterable] ","node_modules/@webcomponents/shadydom/src/patch-events.js","node_modules/@webcomponents/shadydom/src/array-splice.js","node_modules/@webcomponents/shadydom/src/shadydom.js","node_modules/@webcomponents/custom-elements/src/Utilities.js","node_modules/@webcomponents/custom-elements/src/CustomElementInternals.js","node_modules/@webcomponents/custom-elements/src/CustomElementState.js","node_modules/@webcomponents/custom-elements/src/DocumentConstructionObserver.js","node_modules/@webcomponents/custom-elements/src/CustomElementRegistry.js","node_modules/@webcomponents/custom-elements/src/Deferred.js","node_modules/@webcomponents/custom-elements/src/Patch/Native.js","node_modules/@webcomponents/custom-elements/src/AlreadyConstructedMarker.js","node_modules/@webcomponents/custom-elements/src/Patch/HTMLElement.js","node_modules/@webcomponents/custom-elements/src/custom-elements.js","node_modules/@webcomponents/custom-elements/src/Patch/Interface/ParentNode.js","node_modules/@webcomponents/custom-elements/src/Patch/Document.js","node_modules/@webcomponents/custom-elements/src/Patch/Node.js","node_modules/@webcomponents/custom-elements/src/Patch/Interface/ChildNode.js","node_modules/@webcomponents/custom-elements/src/Patch/Element.js","node_modules/@webcomponents/custom-elements/src/Patch/DocumentFragment.js","node_modules/@webcomponents/shadycss/src/css-parse.js","node_modules/@webcomponents/shadycss/src/style-settings.js","node_modules/@webcomponents/shadycss/src/common-regex.js","node_modules/@webcomponents/shadycss/src/unscoped-style-handler.js","node_modules/@webcomponents/shadycss/src/style-util.js","node_modules/@webcomponents/shadycss/src/style-transformer.js","node_modules/@webcomponents/shadycss/src/style-info.js","node_modules/@webcomponents/shadycss/src/style-properties.js","node_modules/@webcomponents/shadycss/src/style-placeholder.js","node_modules/@webcomponents/shadycss/src/style-cache.js","node_modules/@webcomponents/shadycss/src/document-watcher.js","node_modules/@webcomponents/shadycss/src/template-map.js","node_modules/@webcomponents/shadycss/src/apply-shim-utils.js","node_modules/@webcomponents/shadycss/src/document-wait.js","node_modules/@webcomponents/shadycss/src/scoping-shim.js","node_modules/@webcomponents/shadycss/src/common-utils.js","node_modules/@webcomponents/shadycss/entrypoints/scoping-shim.js","src/post-polyfill.js","src/unresolved.js"],"names":["$jscomp.global","$jscomp.defineProperty","$jscomp.initSymbol","$jscomp.Symbol","$jscomp.SYMBOL_PREFIX","$jscomp.arrayIterator","$jscomp.initSymbolIterator","$jscomp.iteratorPrototype","e","document","createEvent","initEvent","preventDefault","defaultPrevented","workingDefaultPrevented","origPreventDefault","Event","prototype","Event.prototype.preventDefault","cancelable","call","Object","defineProperty","get","configurable","isIE","test","navigator","userAgent","window","CustomEvent","window.CustomEvent","inType","params","initCustomEvent","bubbles","detail","origEvent","window.Event","i","MouseEvent","origMouseEvent","window.MouseEvent","initMouseEvent","view","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","Array","from","Array.from","object","slice","assign","Object.assign","target","sources","args","arguments","s","length","n$","getOwnPropertyNames","source","p","WebComponents","PolyfilledHTMLTemplateElement","QSA","node","selector","childNodes","nodeType","Node","DOCUMENT_NODE","docQuerySelectorAll","DOCUMENT_FRAGMENT_NODE","fragQuerySelectorAll","elementQuerySelectorAll","needsTemplate","HTMLTemplateElement","brokenDocFragment","createDocumentFragment","cloneNode","DocumentFragment","needsDocFrag","insertBefore","newNode","refNode","child","firstChild","origInsertBefore","origCloneNode","Node.prototype.cloneNode","deep","newDom","__proto__","querySelectorAll","HTMLElement","querySelector","defineProperties","origAppendChild","appendChild","Node.prototype.appendChild","origRemoveChild","removeChild","origReplaceChild","replaceChild","Node.prototype.replaceChild","newChild","oldChild","Document","Document.prototype.createDocumentFragment","frag","createElement","origImportNode","importNode","Document.prototype.importNode","impNode","capturedCloneNode","capturedCreateElement","capturedImportNode","capturedRemoveChild","capturedAppendChild","capturedReplaceChild","Element","needsCloning","t","t2","content","clone","contentDoc","implementation","createHTMLDocument","canDecorate","templateStyle","textContent","head","firstElementChild","create","canProtoPatch","hasOwnProperty","decorate","PolyfilledHTMLTemplateElement.decorate","template","namespaceURI","documentElement","template.cloneNode","_cloneNode","defineInnerHTML","defineOuterHTML","err","bootstrap","obj","getInnerHTML","set","text","body","innerHTML","parentNode","docFrag","ownerDocument","Error","PolyfilledHTMLTemplateElement.bootstrap","doc","templates","TEMPLATE_TAG","l","addEventListener","Document.prototype.createElement","el","apply","localName","escapeAttrRegExp","escapeDataRegExp","escapeReplace","c","makeSet","arr","voidElements","plaintextParents","callback","c$","ELEMENT_NODE","tagName","attrs","attributes","attr","name","value","replace","TEXT_NODE","data","COMMENT_NODE","console","error","PolyfilledHTMLTemplateElement._cloneNode","fixClonedDom","s$","t$","dom","element","scripts","scriptSelector","ns","ai","a","setAttribute","isArray","_isArray","x","toString","len","vertxNext","browserWindow","undefined","browserGlobal","BrowserMutationObserver","MutationObserver","WebKitMutationObserver","isWorker","Uint8ClampedArray","importScripts","MessageChannel","useVertxTimer","flush","useSetTimeout","useMutationObserver","iterations","observer","createTextNode","observe","characterData","useMessageChannel","channel","port1","onmessage","port2","postMessage","globalSetTimeout","setTimeout","queue","arg","scheduleFlush","self","process","nextTick","vertx","require","runOnLoop","runOnContext","asap","then","onFulfillment","onRejection","parent","constructor","noop","PROMISE_ID","makePromise","_state","module$node_modules$es6_promise$lib$es6_promise$asap.asap","invokeCallback","_result","subscribe","resolve","Constructor","promise","Math","random","substring","GET_THEN_ERROR","ErrorObject","getThen","tryThen","fulfillmentHandler","rejectionHandler","handleForeignThenable","thenable","sealed","fulfill","reason","reject","handleOwnThenable","FULFILLED","REJECTED","handleMaybeThenable","maybeThenable","TypeError","type","publishRejection","_onerror","publish","PENDING","_subscribers","subscribers","settled","TRY_CATCH_ERROR","hasCallback","failed","succeeded","initializePromise","resolver","resolvePromise","rejectPromise","id","Enumerator","input","_instanceConstructor","_remaining","_enumerate","_eachEntry","Enumerator.prototype._eachEntry","entry","_settledAt","Promise","_willSettleAt","Enumerator.prototype._settledAt","state","Enumerator.prototype._willSettleAt","enumerator","all","entries","race","_","catch","scope","newCustomEvent","event","importForElement","useNative","closest","importSelector","isImportLink","whenImportsReady","imports","rootImportSelector","pending","forEach","imp","whenElementLoaded","whenDocumentReady","stateChanged","readyState","removeEventListener","whenReady","src","onLoadingDone","rel","Importer","documents","inflight","dynamicImportsMO","m","handleMutations","childList","subtree","loadImports","replaceScripts","fragment","scriptsSelector","script","emptyNodeList","list","inverseOrder","increment","link","currentScript","CSS_URL_REGEXP","CSS_IMPORT_REGEXP","STYLESHEET_REGEXP","Path","fixUrls","base","href","resolveUrl","getAttribute","r","replaceUrls","linkUrl","regexp","pre","url","post","urlPath","__workingURL","u","URL","pathname","__tempDoc","__base","__anchor","Xhr","async","load","success","fail","match","pieces","split","resource","header","indexOf","atob","decodeURIComponent","request","XMLHttpRequest","open","onload","request.onload","redirectedUrl","responseURL","getResponseHeader","location","origin","protocol","host","response","responseText","status","send","links","loadImport","fireEventIfNeeded","makeDocument","processImportsIfLoadingDone","p1","p2","baseEl","removeAttribute","importDependenciesSelector","inlineScriptIndex","n","importDependencyAttr","encodeURIComponent","num","disconnect","flatten","scriptsOk","stylesOk","fireEvents","waitForStyles","runScripts","cloneScript","pendingScriptsSelector","pendingStylesSelector","needsMove","disabledLinkSelector","placeholder","nextSibling","newSibling","import","dispatchEvent","eventType","mutations","addedNodes","elem","importer","imps","native_baseURI","getOwnPropertyDescriptor","klass","ownerDoc","enumerable","HTMLLinkElement","HTMLImports","flagMatcher","flags","search","option","parts","f","forceShady","forceCE","ShadyData","publicRoot","root","dirty","flattenedNodes","_prevAssignedSlot","_previouslyAssignedNodes","assignedSlot","assignedNodes","previousSibling","lastChild","ownerShadyRoot","__insideAccessors","__outsideAccessors","toJSON","ensureShadyDataForNode","__shady","shadyDataForNode","settings","hasNativeShadowDOM","attachShadow","getRootNode","desc","hasDescriptors","inUse","IS_IE","IS_EDGE","useNativeAccessors","isTrackingLogicalChildNodes","nodeData","isShadyRoot","_localName","ownerShadyRootForNode","matches","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","extend","pd","extendAll","mixin","twiddle","shift","microtask","push","hasDocumentContains","contains","container","flushList","scheduled","enqueue","didFlush","AsyncObserver","_scheduled","removedNodes","callbacks","Set","schedule","takeRecords","cb","observeChildren","sd","add","_callback","_observer","_node","unobserveChildren","handle","delete","size","filterMutations","targetRootNode","map","mutation","mutationInScope","nodes","filter","windowAddEventListener","Window","windowRemoveEventListener","getElementById","elementQuerySelector","fragmentQuerySelector","documentQuerySelector","fragmentQuerySelectorAll","documentQuerySelectorAll","nodeWalker","createTreeWalker","NodeFilter","SHOW_ALL","elementWalker","SHOW_ELEMENT","currentNode","parentElement","lastElementChild","previousElementSibling","nextElementSibling","children","textWalker","SHOW_TEXT","nextNode","nodeValue","nativeProtos","findNodeDescriptor","proto","nodeAccessors","fragmentAccessors","documentAccessors","accessors","nativeTreeAccessors","nativeTreeWalker","clearNode","inertDoc","nativeIsConnectedAccessors","nativeIsConnected","nativeActiveElementDescriptor","OutsideAccessors","ClassNameAccessor","className","InsideAccessors","item","childNodes.item","index","childElementCount","tc","cn","join","nativeAccessors","children.item","containerName","htmlContainer","ShadowRootAccessor","shadowRoot","ActiveElementAccessor","activeElement","active","nativeContains","activeRoot","patchAccessorGroup","descriptors","force","objDesc","warn","patchAccessors","patchShadowRootAccessors","ShadyRoot","nodeName","prop","patchOutsideElementAccessors","patchInsideElementAccessors","linkNode","ref_node","containerData","ref_nodeData","psd","nsd","recordChildNodes","refData","ownerRoot","slotsAdded","slots","_ensureSlotData","_pendingSlots","_slotList","_slotMap","$jscomp.arrayFromIterator","$jscomp.makeIterator","_asyncRender","resetTo","parentData","hasShadowRootWithSlot","preventNativeInsert","firstComposedNode","nativeMethods","scheduleObserver","preventNativeRemove","removeOwnerShadyRoot","changeSlotContent","_validateSlots","slot","splice","didRemove","removingInsertionPoint","composed","flattened","_hasInsertionPoint","distributeAttributeChange","oldName","__slotName","_nameForSlot","_sortSlots","addedNode","removedNode","query","matcher","halter","queryElements","elements","result","scopingShim","nc","eventWrappersName","Date","now","alwaysComposed","pathComposer","startNode","composedPath","current","startRoot","retarget","path","refNodePath","ancestor","lastRoot","rootIdx","eventMixin","isTrusted","__composed","__composedPath","currentTarget","__relatedTarget","__relatedTargetComposedPath","stopPropagation","__propagationStopped","stopImmediatePropagation","__immediatePropagationStopped","mixinComposedFlag","Base","klazz","options","nonBubblingEventsToRetarget","hasRetargeted","fireHandlers","phase","hs","__handlers","fn","retargetNonBubblingEvent","AT_TARGET","lastFiredRoot","findListener","wrappers","capture","once","passive","savedType","savedListener","savedCapture","savedOnce","savedPassive","savedNode","fnOrObj","optionsOrCapture","handlerType","handleEvent","__shadyTarget","wrapperFn","patchEvent","lastCurrentTargetDesc","eventPhase","BUBBLING_PHASE","CAPTURING_PHASE","ret","ael","idx","activateFocusEventOverrides","ev","getPrototypeOf","patchProto","__sourceProto","PatchedEvent","PatchedCustomEvent","PatchedMouseEvent","newSplice","addedCount","removed","calcSplices","currentEnd","old","oldEnd","currentStart","oldStart","prefixCount","suffixCount","minLength","min","currentValue","previousValue","index1","index2","count","equals","rowCount","columnCount","distances","j","north","west","edits","EDIT_ADD","EDIT_DELETE","northWest","EDIT_LEAVE","EDIT_UPDATE","reverse","splices","oldIndex","ShadyRootConstructionToken","ancestorList","ancestors","unshift","token","SHADYROOT_NAME","_mode","mode","hostData","MODE_CLOSED","rootData","_renderPending","_render","renderRoot","_distribute","slotData","_distributeNodeToSlot","slotParentRoot","slotParentData","_addAssignedToFlattenedNodes","prevAssignedNodes","_fireSlotChange","_compose","composeList","targetNode","distributedNode","d","next","forcedSlot","oldSlot","CATCHALL_NAME","assigned","nestedAssigned","slotNamesToSort","_mapSlots","sort","b","listA","listB","nA","nB","getAssignedSlot","windowMixin","bind","nodeMixin","IsConnectedAccessor","isConnected","textMixin","fragmentMixin","o","slotMixin","elementMixin","documentMixin","nativeBlur","blur","htmlElementMixin","shadowActive","shadowRootMixin","patchBuiltin","ShadyDOM","patch","nativeHTMLElement","Text","HTMLSlotElement","ShadowRoot","reservedTagList","isValidCustomElementName","reserved","has","validForm","nativeValue","__CE_isImportDocument","nextSiblingOrAncestorSibling","start","walkDeepDescendantElements","visitedImports","__CE_shadowRoot","setPropertyUnchecked","destination","CustomElementInternals","_localNameToDefinition","Map","_constructorToDefinition","_patches","_hasPatches","setDefinition","definition","addPatch","listener","patchTree","__CE_patched","connectTree","custom","__CE_state","connectedCallback","upgradeElement","disconnectTree","disconnectedCallback","patchAndUpgradeTree","upgrade","gatherElements","__CE_hasRegistry","__CE_documentLoadHandled","clonedVisitedImports","defaultView","localNameToDefinition","constructionStack","pop","__CE_definition","attributeChangedCallback","observedAttributes","oldValue","newValue","namespace","DocumentConstructionObserver","internals","_internals","_document","_handleMutations","Deferred","_resolve","_value","_promise","CustomElementRegistry","_elementDefinitionIsRunning","_whenDefinedDeferred","_flushCallback","this._flushCallback","_flushPending","_pendingDefinitions","_documentConstructionObserver","CustomElementRegistry$$module$node_modules$$webcomponents$custom_elements$src$CustomElementRegistry.prototype","?.prototype","define","Function","SyntaxError","getCallback","callbackValue","adoptedCallback","_flush","pendingDefinitions","elementsWithStableDefinitions","elementsWithPendingDefinitions","pendingElements","pendingUpgradableElements","deferred","CustomElementRegistry$$module$node_modules$$webcomponents$custom_elements$src$CustomElementRegistry_prototype$whenDefined","whenDefined","prior","some","polyfillWrapFlushCallback","outer","inner","Document_createElement","Document_createElementNS","createElementNS","Document_importNode","Document_prepend","Document_append","DocumentFragment_prepend","DocumentFragment_append","Node_cloneNode","Node_appendChild","Node_insertBefore","Node_removeChild","Node_replaceChild","Node_textContent","Element_attachShadow","Element_innerHTML","Element_getAttribute","Element_setAttribute","Element_removeAttribute","Element_getAttributeNS","getAttributeNS","Element_setAttributeNS","setAttributeNS","Element_removeAttributeNS","removeAttributeNS","Element_insertAdjacentElement","Element_insertAdjacentHTML","Element_prepend","Element_append","Element_before","Element_after","Element_replaceWith","Element_remove","HTMLElement_innerHTML","HTMLElement_insertAdjacentElement","HTMLElement_insertAdjacentHTML","$jscompDefaultExport","AlreadyConstructedMarker","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Document_createElement.call","setPrototypeOf","lastIndex","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.HTMLElement","builtIn","appendPrependPatch","builtInMethod","connectedElements","prepend","append","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Document_importNode.call","NS_HTML","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Document_createElementNS.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Document_prepend","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Document_append","patch_textContent","baseDescriptor","assignedValue","childNodesLength","insertedNodes","nativeResult","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_insertBefore.call","nodeWasConnected","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_appendChild.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_cloneNode.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_removeChild.call","nodeToInsert","nodeToRemove","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_replaceChild.call","nodeToInsertWasConnected","thisIsConnected","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_textContent","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_textContent.get","beforeAfterPatch","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_before","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_after","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_replaceWith","wasConnected","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_remove","patch_innerHTML","htmlString","removedElements","patch_insertAdjacentElement","baseMethod","position","insertedElement","patch_insertAdjacentHTML","upgradeNodesInRange","end","toLowerCase","marker","String","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_attachShadow","init","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_attachShadow.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_innerHTML","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_innerHTML.get","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.HTMLElement_innerHTML","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.HTMLElement_innerHTML.get","isTemplate","rawElement","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_setAttribute.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_getAttribute.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_setAttributeNS.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_getAttributeNS.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_removeAttribute.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_removeAttributeNS.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.HTMLElement_insertAdjacentElement","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_insertAdjacentElement","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.HTMLElement_insertAdjacentHTML","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_insertAdjacentHTML","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_prepend","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_append","priorCustomElements","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.DocumentFragment_prepend","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.DocumentFragment_append","customElements","StyleNode","parse","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.comments","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.port","parseCss","OPEN_BRACE","previous","CLOSE_BRACE","trim","ss","_expandUnicodeEscapes","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.multipleSpaces","lastIndexOf","AT_START","MEDIA_START","types$$module$node_modules$$webcomponents$shadycss$src$css_parse.MEDIA_RULE","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.keyframesRule","types$$module$node_modules$$webcomponents$shadycss$src$css_parse.KEYFRAMES_RULE","VAR_START","types$$module$node_modules$$webcomponents$shadycss$src$css_parse.MIXIN_RULE","types$$module$node_modules$$webcomponents$shadycss$src$css_parse.STYLE_RULE","r$","code","repeat","stringify","preserveProperties","cssText","rules","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.customProp","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.mixinProp","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.mixinApply","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.varApply","STYLE_RULE","KEYFRAMES_RULE","MEDIA_RULE","MIXIN_RULE","comments","port","customProp","mixinProp","mixinApply","varApply","keyframesRule","multipleSpaces","nativeShadow","nativeCssVariables_","calcCssVariables","CSS","supports","ShadyCSS","nativeCss","nativeCssVariables","VAR_ASSIGN","MIXIN_MATCH","VAR_CONSUMED","ANIMATION_MATCH","MEDIA_MATCH","BRACKETED","styleTextSet","toCssText","forEachRule","rulesForStyle","style","isKeyframesSelector","rule","styleRuleCallback","keyframesRuleCallback","onlyActiveRules","skipRules","matchMedia","applyCss","moniker","contextNode","applyStyle","lastHeadApplyNode","compareDocumentPosition","DOCUMENT_POSITION_PRECEDING","processVariableAndFallback","str","level","prefix","suffix","comma","fallback","setElementClassRaw","getIsExtends","typeExtension","is","extends","StyleTransformer","shouldRemoveScope","_transformDom","_content","classList","remove","SCOPE_NAME","CLASS","elementStyles","styleRules","cssBuildType","css","ext","hostScope","_calcHostScope","CSS_CLASS_PREFIX","isScoped","transformedSelector","_transformRuleCss","_transformComplexSelector","transformer","p$","COMPLEX_SELECTOR_SEP","_twiddleNthPlus","NTH","inside","stop","isNth","SLOTTED_START","HOST","SIMPLE_SELECTOR_SEP","info","_transformCompoundSelector","combinator","slottedIndex","SLOTTED","_transformHostSelector","_transformSimpleSelector","slotted","SLOTTED_PAREN","paren","DIR_PAREN","before","dir","PSEUDO_PREFIX","HOST_PAREN","SIMPLE_SELECTOR_PREFIX","typeSelector","SELECTOR_NO_MATCH","normalizeRootSelector","ROOT","_transformDocumentSelector","SCOPE_DOC_SELECTOR","$jscomp.global.Object.defineProperties","RegExp","StyleInfo","ast","ownStylePropertyNames","overrideStyleProperties","customStyle","scopeSelector","styleProperties","styleInfo","_getStyleRules","method","StyleProperties","decorateStyles","props","keyframes","ruleIndex","decorateRule","propertyInfo","exec","onKeyframesRule","_keyframes","names","properties","collectProperties","hasProperties","any","valueForProperty","property","valueForProperties","propertyValue","colon","pp","propertyDataFromStyles","selectorToMatch","parseInt","key","whenHostOrRootRule","cssBuild","parsedSelector","isRoot","isHost","hostAndRootPropertiesForScope","hostProps","rootProps","_element","transformStyles","hostSelector","hostRx","HOST_PREFIX","rxHostSelector","HOST_SUFFIX","StyleInfo$$module$node_modules$$webcomponents$shadycss$src$style_info.get","keyframeTransforms","_elementKeyframeTransforms","output","hasAnimations","keyframeNamesToTransform","keyframe","transform","keyframesRules","keyframesNameRx","transformedKeyframesName","scopeId","_keyframesRuleTransformer","applyCustomStyle","XSCOPE_NAME","placeholderMap","ce","origDefine","wrappedDefine","clazz","placeHolder","createComment","after","StyleCache","cache","store","tagname","styleElement","typeMax","fetch","ownPropertyNames","pn","handler","mxns","mxn","classes","hasAttribute","currentScope","newScope","unscoped","delayedStart","requestAnimationFrame","module$node_modules$$webcomponents$shadycss$src$document_watcher.flush","templateMap","invalidate","elementName","templateIsValid","startValidatingTemplate","_validating","readyPromise","resolveFn","documentWait","styleCache","ScopingShim","_scopeCounter","_documentOwner","_documentOwnerStyleInfo","StyleInfo$$module$node_modules$$webcomponents$shadycss$src$style_info.set","_elementsHaveApplied","_customStyleInterface","_applyShim","_ensure","ScopingShim$$module$node_modules$$webcomponents$shadycss$src$scoping_shim.prototype","ScopingShim$$module$node_modules$$webcomponents$shadycss$src$scoping_shim_prototype$flush","getStyleAst","styleAstToString","prepareTemplate","_prepared","styleTextParts","styles","scopingAttribute","newStyle","__cssBuild","_cssBuild","shadowroot","_style","_ownPropertyNames","_ensureCustomStyleInterface","CustomStyleInterface","transformCustomStyleForDocument","flushCustomStyles","_ensureApplyShim","ApplyShim","customStyles","_revalidateCustomStyleApplyShim","_updateProperties","_applyCustomStyles","styleDocument","overrideProps","_isRootOwner","removeProperty","setProperty","cachedStyle","cacheEntry","oldScopeSelector","cachedScopeSelector","applyElementStyle","v","_styleOwnerForNode","owner","ownerStyleInfo","hostAndRootProps","propertiesMatchingHost","propertyData","overrides","reify","styleSubtree","shadowChildren","documentRule","_transformRule","getComputedStyleValue","getComputedStyle","getPropertyValue","setElementClass","classString","scopeName","classAttr","k$","_styleInfoForNode","elementExtends","Template","flushCallback","runAndClearCallback","origWhenReady","ready"],"mappings":"A;;;;;;;;;;;;;;;;;;aAUA,IAAA,CAAA,CCiCAA,EAb2B,WAAlB,EAAC,MAAO,OAAR,EAAiC,MAAjC,GAa0B,IAb1B,CAa0B,IAb1B,CAEe,WAAlB,EAAC,MAAO,OAAR,EAA2C,IAA3C,EAAiC,MAAjC,CAAmD,MAAnD,CAW6B,IDjCnC,CE0BAC,GAC4D,UAAxD,EAAsB,MAAO,OAAA,iBAA7B,CACA,MAAA,eADA,CAEA,QAAQ,CAAC,CAAD,CAAS,CAAT,CAAmB,CAAnB,CAA+B,CAOjC,CAAJ,EAAc,KAAA,UAAd,EAAiC,CAAjC,EAA2C,MAAA,UAA3C,GACA,CAAA,CAAO,CAAP,CADA,CACmB,CAAA,MADnB,CAPqC,CCZtB,SAAA,GAAQ,EAAG,CAE9BC,EAAA,CAAqB,QAAQ,EAAG,EAE3BF,EAAA,OAAL,GACEA,CAAA,OADF,CAC6BG,EAD7B,CAJ8B,CAehC,IAAAA,GAAuD,QAAQ,EAAG,CAChE,IAAI,EAAU,CAUd,OAJA,SAAe,CAAC,CAAD,CAAkB,CAC/B,MA9BoBC,gBA8BpB,EAC6B,CAD7B,EACgD,EADhD,EACuD,CAAA,EAFxB,CAP+B,CAAZ,EAoBzB;QAAA,GAAQ,EAAG,CACtCF,EAAA,EACA,KAAI,EAAiBF,CAAA,OAAA,SAChB,EAAL,GACE,CADF,CACmBA,CAAA,OAAA,SADnB,CAEMA,CAAA,OAAA,CAAyB,UAAzB,CAFN,CAK8C,WAA9C,EAAI,MAAO,MAAA,UAAA,CAAgB,CAAhB,CAAX,EACEC,EAAA,CACI,KAAA,UADJ,CACqB,CADrB,CACqC,CAC/B,aAAc,CAAA,CADiB,CAE/B,SAAU,CAAA,CAFqB,CAO/B,MAAO,QAAQ,EAAG,CAChB,MAAOI,GAAA,CAAsB,IAAtB,CADS,CAPa,CADrC,CAeFC,GAAA,CAA6B,QAAQ,EAAG,EAxBF,CAkChB,QAAA,GAAQ,CAAC,CAAD,CAAQ,CACtC,IAAI,EAAQ,CACZ,OAAOC,GAAA,CAA0B,QAAQ,EAAG,CAC1C,MAAI,EAAJ,CAAY,CAAA,OAAZ,CACS,CACL,KAAM,CAAA,CADD,CAEL,MAAO,CAAA,CAAM,CAAA,EAAN,CAFF,CADT,CAMS,CAAC,KAAM,CAAA,CAAP,CAPiC,CAArC,CAF+B,CA0BZ,QAAA,GAAQ,CAAC,CAAD,CAAO,CACzCD,EAAA,EAEI,EAAA,CAAW,CAAC,KAAM,CAAP,CAKf,EAAA,CAASN,CAAA,OAAA,SAAT,CAAA,CAA8C,QAAQ,EAAG,CAAE,MAAO,KAAT,CACzD,OAAyC,EATA,CC5FpB,QAAA,GAAQ,CAAC,CAAD,CAAW,CACxCM,EAAA,EAGA,KAAI,EAAqC,CAAD,CAAW,MAAA,SAAX,CACxC,OAAO,EAAA,CAAmB,CAAA,KAAA,CAAsB,CAAtB,CAAnB,CACHD,EAAA,CAA6C,CAA7C,CANoC;ACEd,QAAA,GAAQ,CAAC,CAAD,CAAW,CAG7C,IAFA,IAAI,CAAJ,CACI,EAAM,EACV,CAAO,CAAC,CAAC,CAAD,CAAK,CAAA,KAAA,EAAL,MAAR,CAAA,CACE,CAAA,KAAA,CAAS,CAAA,MAAT,CAEF,OAAO,EANsC;ALtB9C,SAAQ,EAAQ,CAaf,GAAI,CAP2B,QAAQ,EAAG,CACxC,IAAIG,EAAIC,QAAAC,YAAA,CAAqB,OAArB,CACRF,EAAAG,UAAA,CAAY,KAAZ,CAAmB,CAAA,CAAnB,CAAyB,CAAA,CAAzB,CACAH,EAAAI,eAAA,EACA,OAAOJ,EAAAK,iBAJiC,CAAZC,EAO9B,CAA8B,CAC5B,IAAIC,EAAqBC,KAAAC,UAAAL,eACzBI,MAAAC,UAAAL,eAAA,CAAiCM,QAAQ,EAAG,CACrC,IAAAC,WAAL,GAIAJ,CAAAK,KAAA,CAAwB,IAAxB,CAEA,CAAAC,MAAAC,eAAA,CAAsB,IAAtB,CAA4B,kBAA5B,CAAgD,CAC9CC,IAAKA,QAAQ,EAAG,CACd,MAAO,CAAA,CADO,CAD8B,CAI9CC,aAAc,CAAA,CAJgC,CAAhD,CANA,CAD0C,CAFhB,CAkB9B,IAAIC,EAAO,SAAAC,KAAA,CAAeC,SAAAC,UAAf,CAGX,IAAI,CAACC,MAAAC,YAAL,EAA2BL,CAA3B,EAAkE,UAAlE,GAAoC,MAAOI,OAAAC,YAA3C,CACED,MAAAC,YAMA,CANqBC,QAAQ,CAACC,CAAD,CAASC,CAAT,CAAiB,CAC5CA,CAAA,CAASA,CAAT,EAAmB,EACnB,KAAIzB,EAAIC,QAAAC,YAAA,CAAqB,aAArB,CACRF;CAAA0B,gBAAA,CAAkBF,CAAlB,CAA0B,CAAA,CAAQC,CAAAE,QAAlC,CAAmD,CAAA,CAAQF,CAAAd,WAA3D,CAA+Ec,CAAAG,OAA/E,CACA,OAAO5B,EAJqC,CAM9C,CAAAqB,MAAAC,YAAAb,UAAA,CAA+BY,MAAAb,MAAAC,UAIjC,IAAI,CAACY,MAAAb,MAAL,EAAqBS,CAArB,EAAsD,UAAtD,GAA8B,MAAOI,OAAAb,MAArC,CAAmE,CACjE,IAAIqB,EAAYR,MAAAb,MAChBa,OAAAb,MAAA,CAAesB,QAAQ,CAACN,CAAD,CAASC,CAAT,CAAiB,CACtCA,CAAA,CAASA,CAAT,EAAmB,EACnB,KAAIzB,EAAIC,QAAAC,YAAA,CAAqB,OAArB,CACRF,EAAAG,UAAA,CAAYqB,CAAZ,CAAoB,CAAA,CAAQC,CAAAE,QAA5B,CAA6C,CAAA,CAAQF,CAAAd,WAArD,CACA,OAAOX,EAJ+B,CAMxC,IAAI6B,CAAJ,CACE,IAAKE,IAAIA,CAAT,GAAcF,EAAd,CACER,MAAAb,MAAA,CAAauB,CAAb,CAAA,CAAkBF,CAAA,CAAUE,CAAV,CAGtBV,OAAAb,MAAAC,UAAA,CAAyBoB,CAAApB,UAbwC,CAgBnE,GAAI,CAACY,MAAAW,WAAL,EAA0Bf,CAA1B,EAAgE,UAAhE,GAAmC,MAAOI,OAAAW,WAA1C,CAA6E,CACvEC,CAAAA,CAAiBZ,MAAAW,WACrBX,OAAAW,WAAA,CAAoBE,QAAQ,CAACV,CAAD;AAASC,CAAT,CAAiB,CAC3CA,CAAA,CAASA,CAAT,EAAmB,EACnB,KAAIzB,EAAIC,QAAAC,YAAA,CAAqB,YAArB,CACRF,EAAAmC,eAAA,CAAiBX,CAAjB,CACE,CAAA,CAAQC,CAAAE,QADV,CAC2B,CAAA,CAAQF,CAAAd,WADnC,CAEEc,CAAAW,KAFF,EAEiBf,MAFjB,CAEyBI,CAAAG,OAFzB,CAGEH,CAAAY,QAHF,CAGkBZ,CAAAa,QAHlB,CAGkCb,CAAAc,QAHlC,CAGkDd,CAAAe,QAHlD,CAIEf,CAAAgB,QAJF,CAIkBhB,CAAAiB,OAJlB,CAIiCjB,CAAAkB,SAJjC,CAIkDlB,CAAAmB,QAJlD,CAKEnB,CAAAoB,OALF,CAKiBpB,CAAAqB,cALjB,CAMA,OAAO9C,EAToC,CAW7C,IAAIiC,CAAJ,CACE,IAASF,CAAT,GAAcE,EAAd,CACEZ,MAAAW,WAAA,CAAkBD,CAAlB,CAAA,CAAuBE,CAAA,CAAeF,CAAf,CAG3BV,OAAAW,WAAAvB,UAAA,CAA8BwB,CAAAxB,UAlB6C,CAsBxEsC,KAAAC,KAAL,GACED,KAAAC,KADF,CACeC,QAAS,CAACC,CAAD,CAAS,CAC7B,MAAO,EAAAC,MAAAvC,KAAA,CAAcsC,CAAd,CADsB,CADjC,CAMKrC,OAAAuC,OAAL,GASEvC,MAAAuC,OATF,CASkBC,QAAQ,CAACC,CAAD,CAASC,CAAT,CAAkB,CAExC,IADA,IAAIC,EAAO,EAAAL,MAAAvC,KAAA,CAAc6C,SAAd,CAAyB,CAAzB,CAAX,CACS1B,EAAE,CADX,CACc2B,CAAd,CAAiB3B,CAAjB,CAAqByB,CAAAG,OAArB,CAAkC5B,CAAA,EAAlC,CAEE,GADA2B,CACA,CADIF,CAAA,CAAKzB,CAAL,CACJ,CAVF,IAWWuB,IAAAA;AAAAA,CAAAA,CAAQI,EAAAA,CAARJ,CAZPM,EAAK/C,MAAAgD,oBAAA,CAA2BC,CAA3B,CAYER,CAXFvB,EAAE,CAAX,CAAiBA,CAAjB,CAAqB6B,CAAAD,OAArB,CAAgC5B,CAAA,EAAhC,CACEgC,CACA,CADIH,CAAA,CAAG7B,CAAH,CACJ,CAAAuB,CAAA,CAAOS,CAAP,CAAA,CAAYD,CAAA,CAAOC,CAAP,CAYd,OAAOT,EARiC,CAT5C,CAzFe,CAAhB,CAAD,CA8GGjC,MAAA2C,cA9GH,C,CMCC,SAAQ,EAAG,CA2J0BC,QAAA,EAAQ,EAAG,EA/B/CC,QAASA,EAAG,CAACC,CAAD,CAAOC,CAAP,CAAiB,CAE3B,GAAI,CAACD,CAAAE,WAAAV,OAAL,CACE,MAAO,EAET,QAAQQ,CAAAG,SAAR,EACE,KAAKC,IAAAC,cAAL,CACE,MAAOC,EAAA7D,KAAA,CAAyBuD,CAAzB,CAA+BC,CAA/B,CACT,MAAKG,IAAAG,uBAAL,CACE,MAAOC,EAAA/D,KAAA,CAA0BuD,CAA1B,CAAgCC,CAAhC,CACT,SACE,MAAOQ,EAAAhE,KAAA,CAA6BuD,CAA7B,CAAmCC,CAAnC,CANX,CAL2B,CAzH7B,IAAIS,EAAgD,WAAhDA,GAAiB,MAAOC,oBAA5B,CACIC,EAAoB,EAAE9E,QAAA+E,uBAAA,EAAAC,UAAA,EAAF,UAA2DC,iBAA3D,CADxB,CAEIC,EAAe,CAAA,CAMf,UAAAjE,KAAA,CAAeC,SAAAC,UAAf,CAAJ,EACG,QAAQ,EAAG,CA0CVgE,QAASA,EAAY,CAACC,CAAD,CAAUC,CAAV,CAAmB,CACtC,GAAID,CAAJ,WAAuBH,iBAAvB,CAEE,IADA,IAAIK,CACJ,CAAQA,CAAR,CAAgBF,CAAAG,WAAhB,CAAA,CACEC,CAAA7E,KAAA,CAAsB,IAAtB,CAA4B2E,CAA5B,CAAmCD,CAAnC,CAHJ,KAMEG,EAAA7E,KAAA,CAAsB,IAAtB;AAA4ByE,CAA5B,CAAqCC,CAArC,CAEF,OAAOD,EAT+B,CAxCxCF,CAAA,CAAe,CAAA,CAEf,KAAIO,EAAgBnB,IAAA9D,UAAAwE,UACpBV,KAAA9D,UAAAwE,UAAA,CAA2BU,QAAkB,CAACC,CAAD,CAAO,CAC9CC,CAAAA,CAASH,CAAA9E,KAAA,CAAmB,IAAnB,CAAyBgF,CAAzB,CACT,KAAJ,WAAoBV,iBAApB,GACEW,CAAAC,UADF,CACqBZ,gBAAAzE,UADrB,CAGA,OAAOoF,EAL2C,CAUpDX,iBAAAzE,UAAAsF,iBAAA,CAA8CC,WAAAvF,UAAAsF,iBAC9Cb,iBAAAzE,UAAAwF,cAAA,CAA2CD,WAAAvF,UAAAwF,cAE3CpF,OAAAqF,iBAAA,CAAwBhB,gBAAAzE,UAAxB,CAAoD,CAClD,SAAY,CACVM,IAAKA,QAAS,EAAG,CACf,MAAOwD,KAAAG,uBADQ,CADP,CAIV1D,aAAc,CAAA,CAJJ,CADsC,CAQlD,UAAa,CACXD,IAAKA,QAAS,EAAG,EADN;AAIXC,aAAc,CAAA,CAJH,CARqC,CAelD,SAAY,CACVD,IAAKA,QAAS,EAAG,CACf,MAAO,oBADQ,CADP,CAIVC,aAAc,CAAA,CAJJ,CAfsC,CAApD,CAuBA,KAAIyE,EAAmBlB,IAAA9D,UAAA2E,aAYvBb,KAAA9D,UAAA2E,aAAA,CAA8BA,CAE9B,KAAIe,EAAkB5B,IAAA9D,UAAA2F,YACtB7B,KAAA9D,UAAA2F,YAAA,CAA6BC,QAAoB,CAACd,CAAD,CAAQ,CACnDA,CAAJ,WAAqBL,iBAArB,CACEE,CAAAxE,KAAA,CAAkB,IAAlB,CAAwB2E,CAAxB,CAA+B,IAA/B,CADF,CAGEY,CAAAvF,KAAA,CAAqB,IAArB,CAA2B2E,CAA3B,CAEF,OAAOA,EANgD,CASzD,KAAIe,EAAkB/B,IAAA9D,UAAA8F,YAAtB,CACIC,EAAmBjC,IAAA9D,UAAAgG,aACvBlC,KAAA9D,UAAAgG,aAAA,CAA8BC,QAAqB,CAACC,CAAD,CAAWC,CAAX,CAAqB,CAClED,CAAJ,WAAwBzB,iBAAxB,EACEE,CAAAxE,KAAA,CAAkB,IAAlB,CAAwB+F,CAAxB,CAAkCC,CAAlC,CACA,CAAAN,CAAA1F,KAAA,CAAqB,IAArB,CAA2BgG,CAA3B,CAFF,EAIEJ,CAAA5F,KAAA,CAAsB,IAAtB,CAA4B+F,CAA5B,CAAsCC,CAAtC,CAEF,OAAOA,EAP+D,CAUxEC,SAAApG,UAAAuE,uBAAA;AAA4C8B,QAA+B,EAAG,CAC5E,IAAIC,EAAO,IAAAC,cAAA,CAAmB,IAAnB,CACXD,EAAAjB,UAAA,CAAiBZ,gBAAAzE,UACjB,OAAOsG,EAHqE,CAM9E,KAAIE,EAAiBJ,QAAApG,UAAAyG,WACrBL,SAAApG,UAAAyG,WAAA,CAAgCC,QAAmB,CAACC,CAAD,CAAUxB,CAAV,CAAgB,CAE7DP,CAAAA,CAAU4B,CAAArG,KAAA,CAAoB,IAApB,CAA0BwG,CAA1B,CADPxB,CACO,EADC,CAAA,CACD,CACVwB,EAAJ,WAAuBlC,iBAAvB,GACEG,CAAAS,UADF,CACsBZ,gBAAAzE,UADtB,CAGA,OAAO4E,EAN0D,CApFzD,CAAZ,EAmGF,KAAIgC,EAAoB9C,IAAA9D,UAAAwE,UAAxB,CACIqC,EAAwBT,QAAApG,UAAAuG,cAD5B,CAEIO,EAAqBV,QAAApG,UAAAyG,WAFzB,CAGIM,EAAsBjD,IAAA9D,UAAA8F,YAH1B,CAIIkB,EAAsBlD,IAAA9D,UAAA2F,YAJ1B,CAKIsB,EAAuBnD,IAAA9D,UAAAgG,aAL3B,CAOI7B,EAA0B+C,OAAAlH,UAAAsF,iBAP9B;AAQItB,EAAsBoC,QAAApG,UAAAsF,iBAR1B,CASIpB,EAAuBO,gBAAAzE,UAAAsF,iBAT3B,CA+BI6B,GAAgB,QAAQ,EAAG,CAC7B,GAAI,CAAC/C,CAAL,CAAoB,CAClB,IAAIgD,EAAI5H,QAAA+G,cAAA,CAAuB,UAAvB,CAAR,CACIc,EAAK7H,QAAA+G,cAAA,CAAuB,UAAvB,CACTc,EAAAC,QAAA3B,YAAA,CAAuBnG,QAAA+G,cAAA,CAAuB,KAAvB,CAAvB,CACAa,EAAAE,QAAA3B,YAAA,CAAsB0B,CAAtB,CACIE,EAAAA,CAAQH,CAAA5C,UAAA,CAAY,CAAA,CAAZ,CACZ,OAA4C,EAA5C,GAAQ+C,CAAAD,QAAA1D,WAAAV,OAAR,EAAwG,CAAxG,GAAiDqE,CAAAD,QAAAvC,WAAAuC,QAAA1D,WAAAV,OAAjD,EACKoB,CAPa,CADS,CAAZ,EAenB,IAAIF,CAAJ,CAAmB,CAEjB,IAAIoD,EAAahI,QAAAiI,eAAAC,mBAAA,CAA2C,UAA3C,CAAjB,CACIC,GAAc,CAAA,CADlB,CAGIC,GAAgBpI,QAAA+G,cAAA,CAAuB,OAAvB,CACpBqB,GAAAC,YAAA,CAA4B,yBAE5B;IAAIC,GAAOtI,QAAAsI,KACXA,GAAAnD,aAAA,CAAkBiD,EAAlB,CAAiCE,EAAAC,kBAAjC,CAKAvE,EAAAxD,UAAA,CAA0CI,MAAA4H,OAAA,CAAczC,WAAAvF,UAAd,CAK1C,KAAIiI,EACF,CAAEzI,QAAA+G,cAAA,CAAuB,KAAvB,CAAA2B,eAAA,CAA6C,WAA7C,CAMJ1E,EAAA2E,EAAA,CAAyCC,QAAQ,CAACC,CAAD,CAAW,CAE1D,GAAIf,CAAAe,CAAAf,QAAJ,EACIe,CAAAC,aADJ,GAC8B9I,QAAA+I,gBAAAD,aAD9B,CAAA,CAIAD,CAAAf,QAAA,CAAmBE,CAAAjD,uBAAA,EAEnB,KADA,IAAIO,CACJ,CAAQA,CAAR,CAAgBuD,CAAAtD,WAAhB,CAAA,CACEiC,CAAA7G,KAAA,CAAyBkI,CAAAf,QAAzB,CAA2CxC,CAA3C,CAKF,IAAImD,CAAJ,CACEI,CAAAhD,UAAA,CAAqB7B,CAAAxD,UADvB,KAQE,IALAqI,CAAA7D,UAKImD,CALiBa,QAAQ,CAACrD,CAAD,CAAO,CAClC,MAAO3B,EAAAiF,GAAA,CAAyC,IAAzC,CAA+CtD,CAA/C,CAD2B,CAKhCwC,CAAAA,EAAJ,CACE,GAAI,CACFe,EAAA,CAAgBL,CAAhB,CACA,CAAAM,EAAA,CAAgBN,CAAhB,CAFE,CAGF,MAAOO,EAAP,CAAY,CACZjB,EAAA,CAAc,CAAA,CADF,CAMlBnE,CAAAqF,EAAA,CAAwCR,CAAAf,QAAxC,CA9BA,CAF0D,CAmC5D,KAAIoB,GAAkBA,QAAwB,CAACI,CAAD,CAAM,CAClD1I,MAAAC,eAAA,CAAsByI,CAAtB;AAA2B,WAA3B,CAAwC,CACtCxI,IAAKA,QAAQ,EAAG,CACd,MAAOyI,GAAA,CAAa,IAAb,CADO,CADsB,CAItCC,IAAKA,QAAQ,CAACC,CAAD,CAAO,CAClBzB,CAAA0B,KAAAC,UAAA,CAA4BF,CAE5B,KADAzF,CAAAqF,EAAA,CAAwCrB,CAAxC,CACA,CAAO,IAAAF,QAAAvC,WAAP,CAAA,CACEgC,CAAA5G,KAAA,CAAyB,IAAAmH,QAAzB,CAAuC,IAAAA,QAAAvC,WAAvC,CAEF,KAAA,CAAOyC,CAAA0B,KAAAnE,WAAP,CAAA,CACEiC,CAAA7G,KAAA,CAAyB,IAAAmH,QAAzB,CAAuCE,CAAA0B,KAAAnE,WAAvC,CAPgB,CAJkB,CActCxE,aAAc,CAAA,CAdwB,CAAxC,CADkD,CAApD,CAmBIoI,GAAkBA,QAAwB,CAACG,CAAD,CAAM,CAClD1I,MAAAC,eAAA,CAAsByI,CAAtB,CAA2B,WAA3B,CAAwC,CACtCxI,IAAKA,QAAQ,EAAG,CACd,MAAO,YAAP,CAAkC,IAAA6I,UAAlC,CAAyE,aAD3D,CADsB,CAItCH,IAAKA,QAAQ,CAACG,CAAD,CAAY,CACvB,GAAI,IAAAC,WAAJ,CAAqB,CACnB5B,CAAA0B,KAAAC,UAAA,CAA4BA,CAE5B,KADIE,CACJ,CADc,IAAAC,cAAA/E,uBAAA,EACd,CAAOiD,CAAA0B,KAAAnE,WAAP,CAAA,CACEiC,CAAA7G,KAAA,CAAyBkJ,CAAzB,CAAkC7B,CAAA0B,KAAAnE,WAAlC,CAEFkC;CAAA9G,KAAA,CAA0B,IAAAiJ,WAA1B,CAA2CC,CAA3C,CAAoD,IAApD,CANmB,CAArB,IAQE,MAAUE,MAAJ,CAAU,uFAAV,CAAN,CATqB,CAJa,CAgBtChJ,aAAc,CAAA,CAhBwB,CAAxC,CADkD,CAqBpDmI,GAAA,CAAgBlF,CAAAxD,UAAhB,CACA2I,GAAA,CAAgBnF,CAAAxD,UAAhB,CAMAwD,EAAAqF,EAAA,CAA0CW,QAAkB,CAACC,CAAD,CAAM,CAC5DC,CAAAA,CAAYjG,CAAA,CAAIgG,CAAJ,CAhHDE,UAgHC,CAChB,KAFgE,IAEvDrI,EAAE,CAFqD,CAElDsI,EAAEF,CAAAxG,OAFgD,CAE9BkE,CAAlC,CAAsC9F,CAAtC,CAAwCsI,CAAxC,GAA+CxC,CAA/C,CAAiDsC,CAAA,CAAUpI,CAAV,CAAjD,EAAgEA,CAAA,EAAhE,CACEkC,CAAA2E,EAAA,CAAuCf,CAAvC,CAH8D,CAQlE5H,SAAAqK,iBAAA,CAA0B,kBAA1B,CAA8C,QAAQ,EAAG,CACvDrG,CAAAqF,EAAA,CAAwCrJ,QAAxC,CADuD,CAAzD,CAKA4G,SAAApG,UAAAuG,cAAA,CAAmCuD,QAAsB,EAAG,CAC1D,IAAIC,EAAKlD,CAAAmD,MAAA,CAA4B,IAA5B,CAAkChH,SAAlC,CACY,WAArB,GAAI+G,CAAAE,UAAJ,EACEzG,CAAA2E,EAAA,CAAuC4B,CAAvC,CAEF,OAAOA,EALmD,CAS5D,KAAIG,GAAmB,aAAvB,CACIC,GAAmB,cADvB;AAGIC,GAAgBA,QAAQ,CAACC,CAAD,CAAI,CAC9B,OAAQA,CAAR,EACE,KAAK,GAAL,CACE,MAAO,OACT,MAAK,GAAL,CACE,MAAO,MACT,MAAK,GAAL,CACE,MAAO,MACT,MAAK,GAAL,CACE,MAAO,QACT,MAAK,QAAL,CACE,MAAO,QAVX,CAD8B,CAuB5BC,GAAAA,CAAUA,QAAQ,CAACC,CAAD,CAAM,CAE1B,IADA,IAAIvB,EAAM,EAAV,CACS1H,EAAI,CAAb,CAAgBA,CAAhB,CAAoBiJ,CAAArH,OAApB,CAAgC5B,CAAA,EAAhC,CACE0H,CAAA,CAAIuB,CAAA,CAAIjJ,CAAJ,CAAJ,CAAA,CAAc,CAAA,CAEhB,OAAO0H,EALmB,CAS5B,KAAIwB,GAAeF,EAAA,CAAQ,qFAAA,MAAA,CAAA,GAAA,CAAR,CAAnB,CAmBIG,GAAmBH,EAAA,CAAQ,6DAAA,MAAA,CAAA,GAAA,CAAR,CAnBvB,CAuEIvB,GAAeA,QAAQ,CAACrF,CAAD,CAAOgH,CAAP,CAAiB,CACnB,UAAvB,GAAIhH,CAAAuG,UAAJ,GACEvG,CADF,CAC8CA,CAAD4D,QAD7C,CAKA,KAFA,IAAIrE,EAAI,EAAR,CACI0H,EAAKD,CAAA,CAAWA,CAAA,CAAShH,CAAT,CAAX,CAA4BA,CAAAE,WADrC,CAEStC,EAAE,CAFX,CAEcsI;AAAEe,CAAAzH,OAFhB,CAE2B4B,CAA3B,CAAmCxD,CAAnC,CAAqCsI,CAArC,GAA4C9E,CAA5C,CAAkD6F,CAAA,CAAGrJ,CAAH,CAAlD,EAA0DA,CAAA,EAA1D,CAA+D,CA1CT,CAAA,CAAA,CA2ClCwD,IAAAA,EAAAA,CAAOpB,KAAAA,EAAAA,CAAMgH,KAAAA,EAAAA,CA1CjC,QAAQhH,CAAAG,SAAR,EACE,KAAKC,IAAA8G,aAAL,CAIE,IAHA,IAAIC,EAAUnH,CAAAuG,UAAd,CACIhH,EAAI,GAAJA,CAAU4H,CADd,CAEIC,GAAQpH,CAAAqH,WAFZ,CAGSzJ,GAAI,CAAb,CAAuB0J,CAAvB,CAA8BF,EAAA,CAAMxJ,EAAN,CAA9B,CAAyCA,EAAA,EAAzC,CACE2B,CAAA,EAAK,GAAL,CAAW+H,CAAAC,KAAX,CAAuB,IAAvB,CAAyCD,CAAAE,MA1DxCC,QAAA,CAAUjB,EAAV,CAA4BE,EAA5B,CA0DD,CAAuD,GAEzDnH,EAAA,EAAK,GACL,EAAA,CAAIuH,EAAA,CAAaK,CAAb,CAAJ,CACS5H,CADT,CAGOA,CAHP,CAGW8F,EAAA,CAAarF,CAAb,CAAmBgH,CAAnB,CAHX,CAG0C,IAH1C,CAGiDG,CAHjD,CAG2D,GAH3D,OAAA,CAKF,MAAK/G,IAAAsH,UAAL,CACMC,CAAAA,CAA4B3H,CAAD2H,KAC/B,EAAA,CAAIjC,CAAJ,EAAkBqB,EAAA,CAAiBrB,CAAAa,UAAjB,CAAlB,CACSoB,CADT,CAGkBA,CAnEfF,QAAA,CAAUhB,EAAV,CAA4BC,EAA5B,CAgEH,OAAA,CAKF,MAAKtG,IAAAwH,aAAL,CACE,CAAA,CAAO,SAAP,CAAwC5H,CAAD2H,KAAvC,CAAqD,QAArD,OAAA,CAEF,SAEE,KADAzK,OAAA2K,QAAAC,MAAA,CAAqB9H,CAArB,CACM,CAAI6F,KAAJ,CAAU,iBAAV,CAAN,CA1BJ,CADsD,CA2CpDtG,CAAA,EAAK,CADwD,CAG/D,MAAOA,EATmC,CA5O3B,CA2PnB,GAAImB,CAAJ,EAAqB+C,EAArB,CAAmC,CAEjC3D,CAAAiF,GAAA,CAA2CgD,QAAmB,CAACpD,CAAD,CAAWlD,CAAX,CAAiB,CAC7E,IAAIoC;AAAQX,CAAAzG,KAAA,CAAuBkI,CAAvB,CAAiC,CAAA,CAAjC,CAGR,KAAAF,EAAJ,EACE,IAAAA,EAAA,CAAcZ,CAAd,CAEEpC,EAAJ,GAGE6B,CAAA7G,KAAA,CAAyBoH,CAAAD,QAAzB,CAAwCV,CAAAzG,KAAA,CAAuBkI,CAAAf,QAAvB,CAAyC,CAAA,CAAzC,CAAxC,CAEA,CAAAoE,EAAA,CAAanE,CAAAD,QAAb,CAA4Be,CAAAf,QAA5B,CALF,CAOA,OAAOC,EAdsE,CAoB/E,KAAImE,GAAeA,QAAqB,CAACnE,CAAD,CAAQlE,CAAR,CAAgB,CAEtD,GAAKA,CAAAiC,iBAAL,GAEIqG,CACA,CADKlI,CAAA,CAAIJ,CAAJ,CAxRMsG,UAwRN,CACL,CAAc,CAAd,GAAAgC,CAAAzI,OAHJ,EAGA,CAGI0I,CAAAA,CAAKnI,CAAA,CAAI8D,CAAJ,CA5RMoC,UA4RN,CACT,KATsD,IAS7CrI,EAAE,CAT2C,CASxCsI,EAAEgC,CAAA1I,OATsC,CAS3BkE,CAT2B,CASxBnE,CAA9B,CAAiC3B,CAAjC,CAAmCsI,CAAnC,CAAsCtI,CAAA,EAAtC,CACE2B,CAKA,CALI0I,CAAA,CAAGrK,CAAH,CAKJ,CAJA8F,CAIA,CAJIwE,CAAA,CAAGtK,CAAH,CAIJ,CAHIkC,CAGJ,EAHqCA,CAAA2E,EAGrC,EAFE3E,CAAA2E,EAAA,CAAuClF,CAAvC,CAEF,CAAAgE,CAAA9G,KAAA,CAA0BiH,CAAAgC,WAA1B,CAAwC5E,EAAArE,KAAA,CAAe8C,CAAf,CAAkB,CAAA,CAAlB,CAAxC,CAAiEmE,CAAjE,CAVF,CALsD,CAAxD,CAqCI5C,GAAYV,IAAA9D,UAAAwE,UAAZA,CAAuCU,QAAkB,CAACC,CAAD,CAAO,CAIlE,GAAI,CAACT,CAAL,EAAqBJ,CAArB,EAA0C,IAA1C,WAA0DG,iBAA1D,CACE,GAAKU,CAAL,CAGE,IAAA0G,EAAMpF,EAAAtG,KAAA,CAAgB,IAAAmJ,cAAhB,CAAoC,IAApC,CAA0C,CAAA,CAA1C,CAHR,KACE,OAAO,KAAAA,cAAA/E,uBAAA,EAFX,KASEsH,EAAA;AAHS,IAAAhI,SAAJ,GAAsBC,IAAA8G,aAAtB,EAnUQjB,UAmUR,GACI,IAAAM,UADJ,EAEI,IAAA3B,aAFJ,EAEyB9I,QAAA+I,gBAAAD,aAFzB,CAGC9E,CAAAiF,GAAA,CAAyC,IAAzC,CAA+CtD,CAA/C,CAHD,CAKCyB,CAAAzG,KAAA,CAAuB,IAAvB,CAA6BgF,CAA7B,CAGJA,EAAJ,EACEuG,EAAA,CAAaG,CAAb,CAAkB,IAAlB,CAEF,OAAOA,EArB2D,CArCpE,CAkEIpF,GAAaL,QAAApG,UAAAyG,WAAbA,CAA6CC,QAAmB,CAACoF,CAAD,CAAU3G,CAAV,CAAgB,CAClFA,CAAA,CAAOA,CAAP,EAAe,CAAA,CACf,IAxVewE,UAwVf,GAAImC,CAAA7B,UAAJ,CACE,MAAOzG,EAAAiF,GAAA,CAAyCqD,CAAzC,CAAkD3G,CAAlD,CAEP,KAAI0G,EAAM/E,CAAA3G,KAAA,CAAwB,IAAxB,CAA8B2L,CAA9B,CAAuC3G,CAAvC,CACV,IAAIA,CAAJ,CAAU,CACRuG,EAAA,CAAaG,CAAb,CAAkBC,CAAlB,CApDAC,EAAAA,CAAUtI,CAAA,CAqDOoI,CArDP,CAzUGG,yFAyUH,CACd,KAFyD,IAE5C/I,CAF4C,CAEzC3B,EAAI,CAApB,CAAuBA,CAAvB,CAA2ByK,CAAA7I,OAA3B,CAA2C5B,CAAA,EAA3C,CAAgD,CAC9C2B,CAAA,CAAI8I,CAAA,CAAQzK,CAAR,CACJ2K,EAAA,CAAKpF,CAAA1G,KAAA,CAA2BX,QAA3B,CAAqC,QAArC,CACLyM,EAAApE,YAAA,CAAiB5E,CAAA4E,YAEjB,KADA,IAAIiD;AAAQ7H,CAAA8H,WAAZ,CACSmB,GAAK,CADd,CACiBC,EAAjB,CAAoBD,EAApB,CAAyBpB,CAAA5H,OAAzB,CAAuCgJ,EAAA,EAAvC,CACEC,EACA,CADIrB,CAAA,CAAMoB,EAAN,CACJ,CAAAD,CAAAG,aAAA,CAAgBD,EAAAlB,KAAhB,CAAwBkB,EAAAjB,MAAxB,CAEFjE,EAAA9G,KAAA,CAA0B8C,CAAAmG,WAA1B,CAAwC6C,CAAxC,CAA4ChJ,CAA5C,CAT8C,CAkDpC,CAIV,MAAO4I,EAVyE,CAxFnD,CAuG/BzH,CAAJ,GACExD,MAAAyD,oBADF,CAC+Bb,CAD/B,CA/fU,CAAX,CAAD,E,CCSO,IAAM6I,GANT/J,KAAA+J,QAAJC,CACahK,KAAA+J,QADbC,CAGaA,QAAA,CAAAC,CAAA,CAAK,CAAA,MAAsC,gBAAtC,GAAAnM,MAAAJ,UAAAwM,SAAArM,KAAA,CAA+BoM,CAA/B,CAAA,C,CCjBlB,IAAIE,GAAM,CAAV,CACIC,EADJ,CA4BMC,GAAmC,WAAnB,GAAC,MAAO/L,OAAR,CAAkCA,MAAlC,CAA2CgM,IAAAA,EA5BjE,CA6BMC,GAAgBF,EAAhBE,EAAiC,EA7BvC,CA8BMC,GAA0BD,EAAAE,iBAA1BD,EAA4DD,EAAAG,uBA9BlE,CAkCMC,GAAwC,WAAxCA,GAAW,MAAOC,kBAAlBD,EACqB,WADrBA,GACJ,MAAOE,cADHF,EAEsB,WAFtBA,GAEJ,MAAOG,eAUTC,SAASA,GAAa,EAAG,CACvB,MAAyB,WAAzB,GAAI,MAAOX,GAAX,CACS,QAAQ,EAAG,CAChBA,EAAA,CAAUY,EAAV,CADgB,CADpB,CAMOC,EAAA,EAPgB,CAUzBC,QAASA,GAAmB,EAAG,CAC7B,IAAIC,EAAa,CAAjB,CACMC,EAAW,IAAIZ,EAAJ,CAA4BQ,EAA5B,CADjB,CAEM5J,EAAOlE,QAAAmO,eAAA,CAAwB,EAAxB,CACbD,EAAAE,QAAA,CAAiBlK,CAAjB,CAAuB,CAAEmK,cAAe,CAAA,CAAjB,CAAvB,CAEA,OAAO,SAAA,EAAM,CACXnK,CAAA2H,KAAA,CAAaoC,CAAb,CAA0B,EAAEA,CAA5B,CAAyC,CAD9B,CANgB;AAY/BK,QAASA,GAAiB,EAAG,CAC3B,IAAMC,EAAU,IAAIX,cACpBW,EAAAC,MAAAC,UAAA,CAA0BX,EAC1B,OAAO,SAAA,EAAM,CAAA,MAAAS,EAAAG,MAAAC,YAAA,CAA0B,CAA1B,CAAA,CAHc,CAM7BZ,QAASA,GAAa,EAAG,CAGvB,IAAMa,EAAmBC,UACzB,OAAO,SAAA,EAAM,CAAA,MAAAD,EAAA,CAAiBd,EAAjB,CAAwB,CAAxB,CAAA,CAJU,CAOzB,IAAMgB,GAAYhM,KAAJ,CAAU,GAAV,CACdgL,SAASA,GAAK,EAAG,CACf,IAAK,IAAIhM,EAAI,CAAb,CAAgBA,CAAhB,CAAoBmL,EAApB,CAAyBnL,CAAzB,EAA4B,CAA5B,CAIE,GAHegN,EAAA5D,CAAMpJ,CAANoJ,CAGf,EAFU4D,EAAAC,CAAMjN,CAANiN,CAAQ,CAARA,CAEV,CAGA,CADAD,EAAA,CAAMhN,CAAN,CACA,CADWsL,IAAAA,EACX,CAAA0B,EAAA,CAAMhN,CAAN,CAAQ,CAAR,CAAA,CAAasL,IAAAA,EAGfH,GAAA,CAAM,CAXS,CAyBjB,IAAI+B,EAAJ,CAEA,EAAA;GA9E+B,WA8E/B,GA9Ee,MAAOC,KA8EtB,EA9EiE,WA8EjE,GA9E8C,MAAOC,QA8ErD,EA9E8G,kBA8E9G,GA9EgF,EAAAlC,SAAArM,KAAA,CAAiBuO,OAAjB,CA8EhF,CACkB,EAAA,CApET,QAAA,EAAM,CAAA,MAAAA,QAAAC,GAAA,CAAiBrB,EAAjB,CAAA,CAmEf,KAAA,CAEO,IAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,KAAA,CAAA,IAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,KAAA,CAAA,IAAA,EAAA,IAAA,IAAA,EAAA,GAAA,EAAA,EAAA,UAAA,GAAA,MAAA,QAAA,CAdL,GAAI,CAEF,IAAMsB,GADIC,OACI,CAAE,OAAF,CACdnC,GAAA,CAAYkC,EAAAE,GAAZ,EAA+BF,EAAAG,GAC/B,GAAA,CAAO1B,EAAA,EAJL,CAKF,MAAM9N,CAAN,CAAS,CACT,EAAA,CAAOgO,EAAA,EADE,CASN,IAAA,GAAA,CAAA,EAAA,EAAA,GAAA,CAAA,EAAA,CAAA,EAAA,CAAA,EAAA,CAAA,EAAA,CAAA,EAFP,CACEiB,EAAA,CADF,EAzGkBQ,SAASA,GAAI,CAACtE,CAAD,CAAW6D,CAAX,CAAgB,CAC7CD,EAAA,CAAM7B,EAAN,CAAA,CAAa/B,CACb4D,GAAA,CAAM7B,EAAN,CAAY,CAAZ,CAAA,CAAiB8B,CACjB9B,GAAA,EAAO,CACK,EAAZ,GAAIA,EAAJ,EAOI+B,EAAA,EAXyC,C,CCQhCS,QAASA,GAAI,CAACC,CAAD,CAAgBC,CAAhB,CAA6B,CACvD,IAAMC,EAAS,IAAf,CAEMtK,EAAQ,IAAI,IAAAuK,YAAJ,CCkPdC,EDlPc,CAEY1C,KAAAA,EAA1B,GAAI9H,CAAA,CCLOyK,EDKP,CAAJ,EC8OAC,ED7OE,CAAY1K,CAAZ,CAGM,KAAA,EAAWsK,CAAX,EAER,IAAIK,CAAJ,CAAY,CACV,IAAM/E,EAAW1H,SAAA,CAAUyM,CAAV,CAAmB,CAAnB,CACjBC,GAAA,CAAK,QAAA,EAAM,CAAA,MCgPbC,GDhPa,CAAeF,CAAf,CAAuB3K,CAAvB,CAA8B4F,CAA9B,CAAwC0E,CAAAQ,EAAxC,CAAA,CAAX,CAFU,CAAZ,IC8OAC,GD1OE,CAAUT,CAAV,CAAkBtK,CAAlB,CAAyBoK,CAAzB,CAAwCC,CAAxC,CAGF,OAAOrK,EAlBgD,C,CEwB1CgL,QAASA,GAAO,CAACrN,CAAD,CAAS,CAItC,GAAIA,CAAJ,EAAgC,QAAhC,GAAc,MAAOA,EAArB,EAA4CA,CAAA4M,YAA5C,GAFkBU,IAElB,CACE,MAAOtN,EAGT,KAAIuN,EAAU,IANID,IAMJ,CDqNdT,ECrNc,CDsNdQ,GCrNA,CAASE,CAAT,CAAkBvN,CAAlB,CACA,OAAOuN,EAV+B,C,CDxBjC,IAAMT,GAAaU,IAAAC,OAAA,EAAA1D,SAAA,CAAuB,EAAvB,CAAA2D,UAAA,CAAqC,EAArC,CAE1Bb,SAASA,GAAI,EAAG,EAMhB,IAAMc,GAAiB,IAAIC,EAU3BC,SAASA,GAAO,CAACN,CAAD,CAAU,CACxB,GAAI,CACF,MAAOA,EAAAf,KADL,CAEF,MAAMzD,CAAN,CAAa,CAEb,MADA4E,GAAA5E,MACO4E,CADgB5E,CAChB4E,CAAAA,EAFM,CAHS,CAS1BG,QAASA,GAAO,CAACtB,CAAD,CAAO/D,CAAP,CAAcsF,CAAd,CAAkCC,CAAlC,CAAoD,CAClE,GAAI,CACFxB,CAAA9O,KAAA,CAAU+K,CAAV,CAAiBsF,CAAjB,CAAqCC,CAArC,CADE,CAEF,MAAMlR,CAAN,CAAS,CACT,MAAOA,EADE,CAHuD,CAQpEmR,QAASA,GAAqB,CAACV,CAAD,CAAUW,CAAV,CAAoB1B,CAApB,CAA0B,CACrDS,EAAA,CAAK,QAAA,CAAAM,CAAA,CAAW,CACf,IAAIY,EAAS,CAAA,CAAb,CACIpF,EAAQ+E,EAAA,CAAQtB,CAAR,CAAc0B,CAAd,CAAwB,QAAA,CAAAzF,CAAA,CAAS,CACvC0F,CAAJ,GACAA,CACA,CADS,CAAA,CACT,CAAID,CAAJ,GAAiBzF,CAAjB,CACE4E,EAAA,CAAQE,CAAR,CAAiB9E,CAAjB,CADF,CAGE2F,CAAA,CAAQb,CAAR,CAAiB9E,CAAjB,CALF,CAD2C,CAAjC,CAQT,QAAA,CAAA4F,CAAA,CAAU,CACPF,CAAJ,GACAA,CAEA,CAFS,CAAA,CAET,CAAAG,CAAA,CAAOf,CAAP,CAAgBc,CAAhB,CAHA,CADW,CARD,CAeR,EAACF,CAAL,EAAepF,CAAf,GACEoF,CACA,CADS,CAAA,CACT,CAAAG,CAAA,CAAOf,CAAP,CAAgBxE,CAAhB,CAFF,CAjBe,CAAhB,CAqBEwE,CArBF,CADqD,CAyBxDgB,QAASA,GAAiB,CAAChB,CAAD,CAAUW,CAAV,CAAoB,CAvD5BM,CAwDhB,GAAIN,CAAAlB,EAAJ,CACEoB,CAAA,CAAQb,CAAR,CAAiBW,CAAAf,EAAjB,CADF,CAvDgBsB,CAyDT,GAAIP,CAAAlB,EAAJ,CACLsB,CAAA,CAAOf,CAAP,CAAgBW,CAAAf,EAAhB,CADK,CAGLC,EAAA,CAAUc,CAAV,CAAoB/D,IAAAA,EAApB,CAA+B,QAAA,CAAA1B,CAAA,CAAU,CAAA,MAAA4E,GAAA,CAAQE,CAAR,CAAiB9E,CAAjB,CAAA,CAAzC,CAC+B,QAAA,CAAA4F,CAAA,CAAU,CAAA,MAAAC,EAAA,CAAOf,CAAP,CAAgBc,CAAhB,CAAA,CADzC,CAN0C;AAW9CK,QAASA,GAAmB,CAACnB,CAAD,CAAUoB,CAAV,CAAyBnC,CAAzB,CAA+B,CACrDmC,CAAA/B,YAAJ,GAAkCW,CAAAX,YAAlC,EACIJ,CADJ,GDxEaA,ECwEb,EAEImC,CAAA/B,YAAAS,QAFJ,GChDaA,EDgDb,CAGEkB,EAAA,CAAkBhB,CAAlB,CAA2BoB,CAA3B,CAHF,CAKMnC,CAAJ,GAAamB,EAAb,EACEW,CAAA,CAAOf,CAAP,CAAgBI,EAAA5E,MAAhB,CACA,CAAA4E,EAAA5E,MAAA,CAAuB,IAFzB,EAGoBoB,IAAAA,EAAb,GAAIqC,CAAJ,CACL4B,CAAA,CAAQb,CAAR,CAAiBoB,CAAjB,CADK,CHtFW,UGwFX,GHxFF,MGwFiBnC,EAAf,CACLyB,EAAA,CAAsBV,CAAtB,CAA+BoB,CAA/B,CAA8CnC,CAA9C,CADK,CAGL4B,CAAA,CAAQb,CAAR,CAAiBoB,CAAjB,CAdqD,CAmB3DtB,QAASA,GAAO,CAACE,CAAD,CAAU9E,CAAV,CAAiB,CAC/B,GAAI8E,CAAJ,GAAgB9E,CAAhB,CACE6F,CAAA,CAAOf,CAAP,CAjFK,IAAIqB,SAAJ,CAAc,0CAAd,CAiFL,CADF,KAAA,CHtGA,IAAIC,EAAO,MGwGiBpG,EHvGf,KGuGN,GAAqBA,CAArB,EHvGwB,QGuGxB,GHvGeoG,CGuGf,EHvG6C,UGuG7C,GHvGoCA,CGuGpC,CAGLT,CAAA,CAAQb,CAAR,CAAiB9E,CAAjB,CAHK,CACLiG,EAAA,CAAoBnB,CAApB,CAA6B9E,CAA7B,CAAoCoF,EAAA,CAAQpF,CAAR,CAApC,CAHF,CAD+B,CAUjCqG,QAASA,GAAgB,CAACvB,CAAD,CAAU,CAC7BA,CAAAwB,GAAJ,EACExB,CAAAwB,GAAA,CAAiBxB,CAAAJ,EAAjB,CAGF6B,GAAA,CAAQzB,CAAR,CALiC,CAQnCa,QAASA,EAAO,CAACb,CAAD,CAAU9E,CAAV,CAAiB,CAxGfwG,IAAK,EAyGrB,GAAI1B,CAAAP,EAAJ,GAEAO,CAAAJ,EAGA,CAHkB1E,CAGlB,CAFA8E,CAAAP,EAEA,CA7GgBwB,CA6GhB,CAAoC,CAApC,GAAIjB,CAAA2B,EAAAzO,OAAJ,EACEwM,EAAA,CAAK+B,EAAL,CAAczB,CAAd,CANF,CAD+B;AAWjCe,QAASA,EAAM,CAACf,CAAD,CAAUc,CAAV,CAAkB,CAnHfY,IAAK,EAoHrB,GAAI1B,CAAAP,EAAJ,GACAO,CAAAP,EAGA,CAtHgByB,CAsHhB,CAFAlB,CAAAJ,EAEA,CAFkBkB,CAElB,CAAApB,EAAA,CAAK6B,EAAL,CAAuBvB,CAAvB,CAJA,CAD+B,CAQjCH,QAASA,GAAS,CAACT,CAAD,CAAStK,CAAT,CAAgBoK,CAAhB,CAA+BC,CAA/B,CAA4C,CACtD,IAAA,EAAiBC,CAAjB,EAAA,CACA,EAAWuC,CAAX,OAENvC,EAAAoC,GAAA,CAAkB,IAElBG,EAAA,CAAazO,CAAb,CAAA,CAAuB4B,CACvB6M,EAAA,CAAazO,CAAb,CAjIgB+N,CAiIhB,CAAA,CAAmC/B,CACnCyC,EAAA,CAAazO,CAAb,CAjIgBgO,CAiIhB,CAAA,CAAmC/B,CAEpB,EAAf,GAAIjM,CAAJ,EAAoBkM,CAAAK,EAApB,EACEC,EAAA,CAAK+B,EAAL,CAAcrC,CAAd,CAX0D,CAe9DqC,QAASA,GAAO,CAACzB,CAAD,CAAU,CACxB,IAAI4B,EAAc5B,CAAA2B,EAAlB,CACIE,EAAU7B,CAAAP,EAEd,IAA2B,CAA3B,GAAImC,CAAA1O,OAAJ,CAAA,CAIA,IARwB,IAMpB4B,CANoB,CAMb4F,CANa,CAMHvJ,EAAS6O,CAAAJ,EANN,CAQftO,EAAI,CAAb,CAAgBA,CAAhB,CAAoBsQ,CAAA1O,OAApB,CAAwC5B,CAAxC,EAA6C,CAA7C,CACEwD,CAGA,CAHQ8M,CAAA,CAAYtQ,CAAZ,CAGR,CAFAoJ,CAEA,CAFWkH,CAAA,CAAYtQ,CAAZ,CAAgBuQ,CAAhB,CAEX,CAAI/M,CAAJ,CACE6K,EAAA,CAAekC,CAAf,CAAwB/M,CAAxB,CAA+B4F,CAA/B,CAAyCvJ,CAAzC,CADF,CAGEuJ,CAAA,CAASvJ,CAAT,CAIJ6O,EAAA2B,EAAAzO,OAAA,CAA8B,CAf9B,CAJwB,CAsB1BmN,QAASA,GAAW,EAAG,CACrB,IAAA7E,MAAA,CAAa,IADQ,CAIvB,IAAMsG,GAAkB,IAAIzB,EAW5BV;QAASA,GAAc,CAACkC,CAAD,CAAU7B,CAAV,CAAmBtF,CAAnB,CAA6BvJ,CAA7B,CAAqC,CAAA,IACtD4Q,EH1LgB,UG0LhBA,GH1LG,MG0LsBrH,EAG7B,IAAIqH,CAAJ,CAAiB,CAZjB,GAAI,CACF,IAAA,EAYiBrH,CAZV,CAYoBvJ,CAZpB,CADL,CAEF,MAAM5B,CAAN,CAAS,CACTuS,EAAAtG,MACA,CADwBjM,CACxB,CAAA,CAAA,CAAOuS,EAFE,CAaT,GAAI5G,CAAJ,GAAc4G,EAAd,CAA+B,CAC7B,IAAAE,EAAS,CAAA,CACT,KAAAxG,EAAQN,CAAAM,MACRN,EAAAM,MAAA,CAAc,IAHe,CAA/B,IAKE,KAAAyG,EAAY,CAAA,CAGd,IAAIjC,CAAJ,GAAgB9E,CAAhB,CAAuB,CACrB6F,CAAA,CAAOf,CAAP,CApLG,IAAIqB,SAAJ,CAAc,sDAAd,CAoLH,CACA,OAFqB,CAXR,CAAjB,IAiBEnG,EACA,CADQ/J,CACR,CAAA8Q,CAAA,CAAY,CAAA,CArMEP,KAAK,EAwMrB,GAAI1B,CAAAP,EAAJ,GAEWsC,CAAJ,EAAmBE,CAAnB,CACLnC,EAAA,CAAQE,CAAR,CAAiB9E,CAAjB,CADK,CAEI8G,CAAJ,CACLjB,CAAA,CAAOf,CAAP,CAAgBxE,CAAhB,CADK,CA3MSyF,CA6MT,GAAIY,CAAJ,CACLhB,CAAA,CAAQb,CAAR,CAAiB9E,CAAjB,CADK,CA5MSgG,CA4MT,GAEIW,CAFJ,EAGLd,CAAA,CAAOf,CAAP,CAAgB9E,CAAhB,CATF,CAzB0D,CAsC5DgH,QAASA,GAAiB,CAAClC,CAAD,CAAUmC,CAAV,CAAoB,CAC5C,GAAI,CACFA,CAAA,CAASC,QAAuB,CAAClH,CAAD,CAAO,CACrC4E,EAAA,CAAQE,CAAR,CAAiB9E,CAAjB,CADqC,CAAvC,CAEGmH,QAAsB,CAACvB,CAAD,CAAS,CAChCC,CAAA,CAAOf,CAAP,CAAgBc,CAAhB,CADgC,CAFlC,CADE,CAMF,MAAMvR,CAAN,CAAS,CACTwR,CAAA,CAAOf,CAAP,CAAgBzQ,CAAhB,CADS,CAPiC,CAY9C,IAAI+S,GAAK,CAKT9C,SAASA,GAAW,CAACQ,CAAD,CAAU,CAC5BA,CAAA,CAAQT,EAAR,CAAA,CAAsB+C,EAAA,EACtBtC,EAAAP,EAAA,CAAiB7C,IAAAA,EACjBoD,EAAAJ,EAAA,CAAkBhD,IAAAA,EAClBoD,EAAA2B,EAAA,CAAuB,EAJK,C,CE9N9BY,QAASA,GAAU,CAACxC,CAAD,CAAcyC,CAAd,CAAqB,CACtC,IAAAC,GAAA,CAA4B1C,CAC5B,KAAAC,EAAA,CAAe,IAAID,CAAJ,CFuOfT,EEvOe,CAEV,KAAAU,EAAA,CFhBMT,EEgBN,CAAL,EFmOAC,EElOE,CAAY,IAAAQ,EAAZ,CAGF,ILZW3D,EKYP,CAAQmG,CAAR,CAAJ,CAME,GAJA,IAAAE,EAII,CALJ,IAAAxP,OAKI,CALcsP,CAAAtP,OAKd,CAFJ,IAAA0M,EAEI,CAFetN,KAAJ,CAAU,IAAAY,OAAV,CAEX,CAAgB,CAAhB,GAAA,IAAAA,OAAJ,CF8NF2N,CE7NI,CAAQ,IAAAb,EAAR,CAAsB,IAAAJ,EAAtB,CADF,KAEO,CACL,IAAA1M,OAAA,CAAc,IAAAA,OAAd,EAA6B,CAgBjC,KAAS5B,CAAT,CAAa,CAAb,CFzCgBoQ,IAAK,EEyCrB,GAfIiB,IAeYlD,EAAhB,EAA2CnO,CAA3C,CAfoBkR,CAe2BtP,OAA/C,CAA6D5B,CAAA,EAA7D,CACEsR,EAAA,CAhBED,IAgBF,CAhBkBH,CAgBF,CAAMlR,CAAN,CAAhB,CAA0BA,CAA1B,CAf0B,EAAxB,GAAI,IAAAoR,EAAJ,EFyNJ7B,CExNM,CAAQ,IAAAb,EAAR,CAAsB,IAAAJ,EAAtB,CAJG,CART,IFmOAmB,EEnNE,CAAO,IAAAf,EAAP,CAKSzG,KAAJ,CAAU,yCAAV,CALL,CAxBoC;AAsCNsJ,QAAA,GAAQ,CAARA,CAAQ,CAACC,CAAD,CAAQxR,CAAR,CAAW,CACnD,IAAI+I,EAAI,CAAAoI,GAAR,CACM,EAAYpI,CAAZ,QAEFyF,EAAJ,GD9BaA,EC8Bb,EACMb,CAEJ,CF2LFqB,EE7La,CAAQwC,CAAR,CAEX,CAAI7D,CAAJ,GHzDWA,EGyDX,EFrDcyC,IAAK,EEqDnB,GACIoB,CAAArD,EADJ,CAEEsD,EAAA,CAAAA,CAAA,CAAgBD,CAAArD,EAAhB,CAA8BnO,CAA9B,CAAiCwR,CAAAlD,EAAjC,CAFF,CAG2B,UAApB,GAAI,MAAOX,EAAX,EACL,CAAAyD,EAAA,EACA,CAAA,CAAA9C,EAAA,CAAatO,CAAb,CAAA,CAAkBwR,CAFb,EAGIzI,CAAJ,GC4DI2I,CD5DJ,EACDhD,CAEJ,CAFc,IAAI3F,CAAJ,CFqLlBiF,EErLkB,CAEd,CF+LJ6B,EEhMI,CAAoBnB,CAApB,CAA6B8C,CAA7B,CAAoC7D,CAApC,CACA,CAAAgE,EAAA,CAAAA,CAAA,CAAmBjD,CAAnB,CAA4B1O,CAA5B,CAHK,EAKL2R,EAAA,CAAAA,CAAA,CAAmB,IAAI5I,CAAJ,CAAM,QAAA,CAAAyF,CAAA,CAAW,CAAA,MAAAA,EAAA,CAAQgD,CAAR,CAAA,CAAjB,CAAnB,CAAqDxR,CAArD,CAdJ,EAiBE2R,EAAA,CAAAA,CAAA,CAAmBnD,CAAA,CAAQgD,CAAR,CAAnB,CAAmCxR,CAAnC,CArBiD,CAyBnB4R,QAAA,GAAQ,CAARA,CAAQ,CAACC,CAAD,CAAQ7R,CAAR,CAAW4J,CAAX,CAAkB,CACpD,IAAA,EAAY,CAAZ,EFxEUwG,KAAK,EE0ErB,GAAI1B,CAAAP,EAAJ,GACE,CAAAiD,EAAA,EAEA,CF3EcxB,CE2Ed,GAAIiC,CAAJ,CFsKFpC,CErKI,CAAOf,CAAP,CAAgB9E,CAAhB,CADF,CAGE,CAAA0E,EAAA,CAAatO,CAAb,CAHF,CAGoB4J,CANtB,CAUwB,EAAxB,GAAI,CAAAwH,EAAJ,EFgKA7B,CE/JE,CAAQb,CAAR,CAAiB,CAAAJ,EAAjB,CAdwD,CAkBvBwD,QAAA,GAAQ,CAARA,CAAQ,CAACpD,CAAD,CAAU1O,CAAV,CAAa,CF4JxDuO,EEzJA,CAAUG,CAAV,CAAmBpD,IAAAA,EAAnB,CAA8B,QAAA,CAAA1B,CAAA,CAAS,CAAA,MAAA6H,GAAA,CAFtBM,CAEsB,CF3FvBpC,CE2FuB,CAAiC3P,CAAjC,CAAoC4J,CAApC,CAAA,CAAvC,CAC6B,QAAA,CAAA4F,CAAA,CAAU,CAAA,MAAAiC,GAAA,CAHtBM,CAGsB,CF3FvBnC,CE2FuB,CAAgC5P,CAAhC,CAAmCwP,CAAnC,CAAA,CADvC,CAHwD,C,CExD3CwC,QAASA,GAAG,CAACC,CAAD,CAAU,CACnC,MAAOvD,CAAA,IF3BMuC,EE2BN,CAAe,IAAf,CAAqBgB,CAArB,CAAAvD,GAD4B,C,CCoBtBwD,QAASA,GAAI,CAACD,CAAD,CAAU,CAEpC,IAAIxD,EAAc,IAElB,ORrDW1D,GQqDN,CAAQkH,CAAR,CAAL,CAGS,IAAIxD,CAAJ,CAAgB,QAAA,CAACD,CAAD,CAAUiB,CAAV,CAAqB,CAE1C,IADA,IAAI7N,EAASqQ,CAAArQ,OAAb,CACS5B,EAAI,CAAb,CAAgBA,CAAhB,CAAoB4B,CAApB,CAA4B5B,CAAA,EAA5B,CACEyO,CAAAD,QAAA,CAAoByD,CAAA,CAAQjS,CAAR,CAApB,CAAA2N,KAAA,CAAqCa,CAArC,CAA8CiB,CAA9C,CAHwC,CAArC,CAHT,CACS,IAAIhB,CAAJ,CAAgB,QAAA,CAAC0D,CAAD,CAAI1C,CAAJ,CAAe,CAAA,MAAAA,EAAA,CAAO,IAAIM,SAAJ,CAAc,iCAAd,CAAP,CAAA,CAA/B,CAL2B,C,CC9BvBN,QAASA,GAAM,CAACD,CAAD,CAAS,CAGrC,IAAId,EAAU,IADID,IACJ,CNuNdT,EMvNc,CNyNdyB,EMxNA,CAAQf,CAAR,CAAiBc,CAAjB,CACA,OAAOd,EAL8B,C,CHgGxBgD,QAASA,EAAO,CAACb,CAAD,CAAW,CACxC,IAAA,CH5HW5C,EG4HX,CAAA,CH2GO+C,EAAA,EG1GP,KAAA1C,EAAA,CAAe,IAAAH,EAAf,CAA6B7C,IAAAA,EAC7B,KAAA+E,EAAA,CAAoB,EAEpB,IHqHArC,EGrHA,GAAa6C,CAAb,CAAuB,CACrB,GAAoB,UAApB,GAAA,MAAOA,EAAP,CApHF,KAAM,KAAId,SAAJ,CAAc,oFAAd,CAAN,CAqHE,GAAA,IAAA,WAAgB2B,EAAhB,CH0HFd,EG1H4B,CAAkB,IAAlB,CAAwBC,CAAxB,CAA1B,KAjHF,MAAM,KAAId,SAAJ,CAAc,uHAAd,CAAN,CA+GuB,CALiB,CAmB1C2B,CAAAhT,UAAA,CAAoB,CAClBqP,YAAa2D,CADK,CAoMlB/D,KJlVaA,EI8IK,CAiOlB,EAAAyE,QAAK,CAACvE,CAAD,CAAc,CACjB,MAAO,KAAAF,KAAA,CAAU,IAAV,CAAgBE,CAAhB,CADU,CAjOD,C;;;;;;;;;AI1IfvO,MAAAoS,QAAL,GACEpS,MAAAoS,QAOA,CJ+GaA,CI/Gb,CJ+GaA,CIpHbhT,UAAA,CAAqB,OAArB,CAKA,CJ+GagT,CIpHmBhT,UAAA0T,EAKhC,CJ+GaV,CInHbhT,UAAA,KAIA,CJ+GagT,CInHkBhT,UAAAiP,KAI/B,CJ+Ga+D,CIlHb,IAGA,CHyBaM,EGzBb,CJ+GaN,CIjHb,KAEA,CF6CaQ,EE7Cb,CJ+GaR,CIhHb,QACA,CNYalD,EMZb,CJ+GakD,CI/Gb,OAAA,CDeajC,ECvBf,C,CCPC,SAAA,CAAA4C,CAAA,CAAS,CAsqBeC,QAAA,EAAA,CAACtC,CAAD,CAAOtQ,CAAP,CAAkB,CACvC,GAAkC,UAAlC,GAAI,MAAOJ,OAAAC,YAAX,CACE,MAAO,KAAIA,WAAJ,CAAgByQ,CAAhB,CAAsBtQ,CAAtB,CAET,KAAM6S,EAAqCrU,QAAAC,YAAA,CAAqB,aAArB,CAC3CoU,EAAA5S,gBAAA,CAAsBqQ,CAAtB,CAA4B,CAAA,CAAQtQ,CAAAE,QAApC,CAAqD,CAAA,CAAQF,CAAAd,WAA7D,CAAiFc,CAAAG,OAAjF,CACA,OAAO0S,EANgC,CAjChBC,QAAA,EAAA,CAAAhI,CAAA,CAAW,CAClC,GAAIiI,CAAJ,CAEE,MAAOjI,EAAAxC,cAAA,GAA0B9J,QAA1B,CAAqCsM,CAAAxC,cAArC,CAA6D,IAEtE,KAAIG,EAAMqC,CAAA,YACV,IAAI,CAACrC,CAAL,EAAYqC,CAAA1C,WAAZ,CAAgC,CAC9BK,CAAA,CAA+BqC,CAAA1C,WAC/B,IAA2B,UAA3B,GAAI,MAAOK,EAAAuK,QAAX,CAGEvK,CAAA,CAAMA,CAAAuK,QAAA,CAndWC,kBAmdX,CAHR,KAME,KAAA,CAAO,CAACC,CAAA,CAAazK,CAAb,CAAR,GAA8BA,CAA9B,CAAoCA,CAAAL,WAApC,EAAA,EAEF0C,CAAA,YAAA,CAAyBrC,CAVK,CAYhC,MAAOA,EAlB2B,CApBX0K,QAAA,EAAA,CAAAzJ,CAAA,CAAY,CACnC,IAAI0J,EACD3Q,CAAA,CAAIjE,QAAJ,CAvasB6U,2CAuatB,CADH;AAEIC,EAAUF,CAAAlR,OACToR,EAAL,CAIAC,CAAA,CAAQH,CAAR,CAAiB,QAAA,CAAAI,CAAA,CAAO,CAAA,MAAAC,EAAA,CAAkBD,CAAlB,CAAuB,QAAA,EAAM,CACjC,CAAlB,GAAI,EAAEF,CAAN,EACE5J,CAAA,EAFiD,CAA7B,CAAA,CAAxB,CAJA,CACEA,CAAA,EALiC,CAlBXgK,QAAA,EAAA,CAAAhK,CAAA,CAAY,CACfiK,QAAA,EAAA,EAAM,CAGG,SAA5B,GAAInV,QAAAoV,WAAJ,EAA2CpV,QAAA0J,KAA3C,GACE1J,QAAAqV,oBAAA,CAA6B,kBAA7B,CAAiDF,CAAjD,CACA,CAAAjK,CAAA,EAFF,CAHyB,CAQ3BlL,QAAAqK,iBAAA,CAA0B,kBAA1B,CAA8C8K,CAA9C,CACAA,EAAA,EAVoC,CAXpBG,QAAA,EAAA,CAAApK,CAAA,CAAY,CAG5BgK,CAAA,CAAkB,QAAA,EAAM,CAAA,MAAAP,EAAA,CAAiB,QAAA,EAAM,CAAA,MAAAzJ,EAAA,EAAYA,CAAA,EAAZ,CAAvB,CAAA,CAAxB,CAH4B,CAhCJ+J,QAAA,EAAA,CAAC3I,CAAD,CAAUpB,CAAV,CAAuB,CAC/C,GAAIoB,CAAA,SAAJ,CACEpB,CAAA,EAAYA,CAAA,EADd,KAEO,IAA2B,QAA3B,GAAKoB,CAAA7B,UAAL,EAAuC,CAAC6B,CAAAiJ,IAAxC,EACkB,OADlB,GACJjJ,CAAA7B,UADI,EAC6B,CAAC6B,CAAA/G,WAD9B,CAIL+G,CAAA,SACA,CADsB,CAAA,CACtB,CAAApB,CAAA,EAAYA,CAAA,EALP,KAMA,CACL,IAAMsK,EAAgBA,QAAA,CAAAnB,CAAA,CAAS,CAC7B/H,CAAA+I,oBAAA,CAA4BhB,CAAAvC,KAA5B;AAAwC0D,CAAxC,CACAlJ,EAAA,SAAA,CAAsB,CAAA,CACtBpB,EAAA,EAAYA,CAAA,EAHiB,CAK/BoB,EAAAjC,iBAAA,CAAyB,MAAzB,CAAiCmL,CAAjC,CAKKxU,GAAL,EAAmC,OAAnC,GAAasL,CAAA7B,UAAb,EACE6B,CAAAjC,iBAAA,CAAyB,OAAzB,CAAkCmL,CAAlC,CAZG,CATwC,CAX5Bd,QAAA,EAAA,CAAAxQ,CAAA,CAAQ,CAC3B,MAAOA,EAAAG,SAAP,GAAyBC,IAAA8G,aAAzB,EAAiE,MAAjE,GAA8ClH,CAAAuG,UAA9C,EACmD,QADnD,GACqCvG,CAADuR,IAFT,CA9U3B5F,QADI6F,EACO,EAAG,CAAA,IAAA,EAAA,IACZ,KAAAC,EAAA,CAAiB,EAGjB,KAAAC,EAAA,CAAgB,CAChB,KAAAC,EAAA,CAAwB,IAAItI,gBAAJ,CAAqB,QAAA,CAAAuI,CAAA,CAAK,CAAA,MAAA,EAAAC,GAAA,CAAqBD,CAArB,CAAA,CAA1B,CAExB,KAAAD,EAAAzH,QAAA,CAA8BpO,QAAAsI,KAA9B,CAA6C,CAC3C0N,UAAW,CAAA,CADgC,CAE3CC,QAAS,CAAA,CAFkC,CAA7C,CAQA,KAAAC,YAAA,CAAiBlW,QAAjB,CAfY,CApKOmW,QAAA,EAAA,CAACC,CAAD,CAAc,CACnCrB,CAAA,CAAQ9Q,CAAA,CAAImS,CAAJ,CAAc,UAAd,CAAR,CAAmC,QAAA,CAAAvN,CAAA,CAAY,CAC7CkM,CAAA,CAAQ9Q,CAAA,CAAI4E,CAAAf,QAAJ,CA2IYuO,yFA3IZ,CAAR;AAAgD,QAAA,CAAAC,CAAA,CAAU,CACxD,IAAMvO,EACH/H,QAAA+G,cAAA,CAAuB,QAAvB,CACHgO,EAAA,CAAQuB,CAAA/K,WAAR,CAA2B,QAAA,CAAAC,CAAA,CAAQ,CAAA,MAAAzD,EAAA6E,aAAA,CAAmBpB,CAAAC,KAAnB,CAA8BD,CAAAE,MAA9B,CAAA,CAAnC,CACA3D,EAAAM,YAAA,CAAoBiO,CAAAjO,YACpBiO,EAAA1M,WAAApD,aAAA,CAA+BuB,CAA/B,CAAsCuO,CAAtC,CALwD,CAA1D,CAOAH,EAAA,CAAetN,CAAAf,QAAf,CAR6C,CAA/C,CADmC,CAZzB7D,QAAA,EAAA,CAACC,CAAD,CAAOC,CAAP,CAAoB,CAG9B,MAAKD,EAAAE,WAAAV,OAAL,CAGOQ,CAAA4B,iBAAA,CAAsB3B,CAAtB,CAHP,CACSoS,EAJqB,CAdhBxB,QAAA,EAAA,CAACyB,CAAD,CAAOtL,CAAP,CAAiBuL,CAAjB,CAAkC,CAChD,IAAM/S,EAAS8S,CAAA,CAAOA,CAAA9S,OAAP,CAAqB,CAApC,CACMgT,EAAYD,CAAA,CAAgB,EAAhB,CAAoB,CAEtC,KADI3U,CACJ,CADQ2U,CAAA,CAAe/S,CAAf,CAAwB,CAAxB,CAA4B,CACpC,CAAO5B,CAAP,CAAW4B,CAAX,EAA0B,CAA1B,EAAqB5B,CAArB,CAAiCA,CAAjC,EAAqC4U,CAArC,CACExL,CAAA,CAASsL,CAAA,CAAK1U,CAAL,CAAT,CAAkBA,CAAlB,CAL8C,CA1BlD,IAAM6U,EAAO3W,QAAA+G,cAAA,CAAuB,MAAvB,CAAb,CACMwN,EAAoB,QAApBA,EAAgCoC,EADtC,CAEMJ,GAAgBI,CAAA7Q,iBAAA,CAAsB,GAAtB,CAFtB,CAKI8Q,EAAgB,IACgB,EAAA,CAApC,GAAI,eAAJ,EAAuB5W,SAAvB,EACEY,MAAAC,eAAA,CAAsBb,QAAtB,CAAgC,eAAhC;AAAiD,CAC/C,IAAAc,QAAG,EAAG,CACJ,MAAO8V,EAAP,GAK2B,UAAxB,GAAA5W,QAAAoV,WAAA,CACCpV,QAAAuM,QAAA,CAAiBvM,QAAAuM,QAAA7I,OAAjB,CAA2C,CAA3C,CADD,CACiD,IANpD,CADI,CADyC,CAU/C3C,aAAc,CAAA,CAViC,CAAjD,CA2DF,KAAM8V,GAAiB,qBAAvB,CACMC,GAAoB,oCAD1B,CAEMC,GAAoB,iDAF1B,CAMMC,EAAO,CAEX,GAAAC,QAAO,CAAC3K,CAAD,CAAU4K,CAAV,CAAgB,CACjB5K,CAAA6K,KAAJ,EACE7K,CAAAM,aAAA,CAAqB,MAArB,CACEoK,CAAAI,GAAA,CAAgB9K,CAAA+K,aAAA,CAAqB,MAArB,CAAhB,CAA8CH,CAA9C,CADF,CAGE5K,EAAAiJ,IAAJ,EACEjJ,CAAAM,aAAA,CAAqB,KAArB,CACEoK,CAAAI,GAAA,CAAgB9K,CAAA+K,aAAA,CAAqB,KAArB,CAAhB,CAA6CH,CAA7C,CADF,CAGF,IAA0B,OAA1B,GAAI5K,CAAA7B,UAAJ,CAAmC,CACjC,IAAM6M,EAAIN,CAAAO,GAAA,CAAiBjL,CAAAjE,YAAjB,CAAsC6O,CAAtC,CAA4CL,EAA5C,CACVvK,EAAAjE,YAAA,CAAsB2O,CAAAO,GAAA,CAAiBD,CAAjB,CAAoBJ,CAApB,CAA0BJ,EAA1B,CAFW,CATd,CAFZ,CAiBX,GAAAS,QAAW,CAAC9N,CAAD,CAAO+N,CAAP,CAAgBC,CAAhB,CAAwB,CACjC,MAAOhO,EAAAkC,QAAA,CAAa8L,CAAb;AAAqB,QAAA,CAAC3B,CAAD,CAAI4B,CAAJ,CAASC,CAAT,CAAcC,CAAd,CAAuB,CAC7CC,CAAAA,CAAUF,CAAAhM,QAAA,CAAY,OAAZ,CAAqB,EAArB,CACV6L,EAAJ,GACEK,CADF,CACYb,CAAAI,GAAA,CAAgBS,CAAhB,CAAyBL,CAAzB,CADZ,CAGA,OAAOE,EAAP,CAAa,GAAb,CAAoBG,CAApB,CAA8B,GAA9B,CAAqCD,CALY,CAA5C,CAD0B,CAjBxB,CA2BX,GAAAR,QAAU,CAACO,CAAD,CAAMT,CAAN,CAAY,CAEpB,GAA0B9J,IAAAA,EAA1B,GAAI4J,CAAAc,GAAJ,CAAqC,CACnCd,CAAAc,GAAA,CAAoB,CAAA,CACpB,IAAI,CACF,IAAMC,EAAI,IAAIC,GAAJ,CAAQ,GAAR,CAAa,UAAb,CACVD,EAAAE,SAAA,CAAa,OACbjB,EAAAc,GAAA,CAAgC,gBAAhC,GAAqBC,CAAAZ,KAHnB,CAIF,MAAOpX,EAAP,CAAU,EANuB,CASrC,GAAIiX,CAAAc,GAAJ,CACE,MAAOX,CAAC,IAAIa,GAAJ,CAAQL,CAAR,CAAaT,CAAb,CAADC,MAILlN,EAAAA,CAAM+M,CAAAkB,GACLjO,EAAL,GACEA,CAIA,CAJMjK,QAAAiI,eAAAC,mBAAA,CAA2C,MAA3C,CAIN,CAHA8O,CAAAkB,GAGA,CAHiBjO,CAGjB,CAFAA,CAAAkO,GAEA,CAFalO,CAAAlD,cAAA,CAAkB,MAAlB,CAEb,CADAkD,CAAA3B,KAAAnC,YAAA,CAAqB8D,CAAAkO,GAArB,CACA,CAAAlO,CAAAmO,GAAA,CAAenO,CAAAlD,cAAA,CAAkB,GAAlB,CALjB,CAOAkD,EAAAkO,GAAAhB,KAAA,CAAkBD,CAClBjN,EAAAmO,GAAAjB,KAAA,CAAoBQ,CACpB,OAAO1N,EAAAmO,GAAAjB,KAAP,EAA4BQ,CA1BR,CA3BX,CANb,CAgEMU,GAAM,CAEVC,MAAO,CAAA,CAFG,CASV,KAAAC,QAAI,CAACZ,CAAD,CAAMa,CAAN,CAAeC,CAAf,CAAqB,CACvB,GAAKd,CAAL,CAEO,GAAIA,CAAAe,MAAA,CAAU,QAAV,CAAJ,CAAyB,CAExBC,CAAAA;AAAShB,CAAAiB,MAAA,CAAU,GAAV,CAEf,KAAIC,EAAWF,CAAA,CAAO,CAAP,CAEbE,EAAA,CAD+B,EAAjC,CAFeF,CAAAG,CAAO,CAAPA,CAEXC,QAAA,CAAe,SAAf,CAAJ,CACaC,IAAA,CAAKH,CAAL,CADb,CAGaI,kBAAA,CAAmBJ,CAAnB,CAEbL,EAAA,CAAQK,CAAR,CAV8B,CAAzB,IAWA,CACL,IAAMK,EAAU,IAAIC,cACpBD,EAAAE,KAAA,CAAa,KAAb,CAAoBzB,CAApB,CAAyBU,EAAAC,MAAzB,CACAY,EAAAG,OAAA,CAAiBC,QAAA,EAAM,CAKrB,IAAIC,EAAgBL,CAAAM,YAAhBD,EAAuCL,CAAAO,kBAAA,CAA0B,UAA1B,CACvCF,EAAJ,EAAoD,CAApD,GAAqBA,CAAAR,QAAA,CAAsB,GAAtB,CAArB,GAIEQ,CAJF,EAGkBG,QAAAC,OAHlB,EAGqCD,QAAAE,SAHrC,CAGyD,IAHzD,CAGgEF,QAAAG,KAHhE,EAI2BN,CAJ3B,CAMA,KAAMV,EAAkCK,CAAAY,SAAlCjB,EAAsDK,CAAAa,aACrC,IAAvB,GAAIb,CAAAc,OAAJ,EAAiD,CAAjD,GAA8Bd,CAAAc,OAA9B,EACoB,GADpB,EACEd,CAAAc,OADF,EAC4C,GAD5C,CAC2Bd,CAAAc,OAD3B,CAEExB,CAAA,CAAQK,CAAR,CAAkBU,CAAlB,CAFF,CAIEd,CAAA,CAAKI,CAAL,CAjBmB,CAoBvBK,EAAAe,KAAA,EAvBK,CAbP,IACExB,EAAA,CAAK,+BAAL,CAFqB,CATf,CAhEZ,CAqHMzX,GAAO,SAAAC,KAAA,CAAeC,SAAAC,UAAf,CAAPH,EACJ,YAAAC,KAAA,CAAkBC,SAAAC,UAAlB,CAqDA;CAAA,UAAA,YAAA,CAAA+U,QAAW,CAACjM,CAAD,CAAM,CAAA,IAAA,EAAA,IACTiQ,EAAAA,CACHjW,CAAA,CAAIgG,CAAJ,CArDgBwK,kBAqDhB,CACHM,EAAA,CAAQmF,CAAR,CAAe,QAAA,CAAAvD,CAAA,CAAQ,CAAA,MAAA,EAAAwD,EAAA,CAAgBxD,CAAhB,CAAA,CAAvB,CAHe,CASjB,EAAA,UAAA,EAAA,CAAAwD,QAAU,CAACxD,CAAD,CAAO,CAAA,IAAA,EAAA,IAAA,CACTgB,EAAMhB,CAAAQ,KAEZ,IAA4B/J,IAAAA,EAA5B,GAAI,IAAAuI,EAAA,CAAegC,CAAf,CAAJ,CAAuC,CAGrC,IAAM3C,EAAM,IAAAW,EAAA,CAAegC,CAAf,CACR3C,EAAJ,EAAWA,CAAA,SAAX,GACE2B,CAAA,SACA,CADmB3B,CACnB,CAAA,IAAAoF,EAAA,CAAuBzD,CAAvB,CAFF,CAJqC,CAAvC,IAUA,KAAAf,EAAA,EAGA,CADA,IAAAD,EAAA,CAAegC,CAAf,CACA,CADsB,SACtB,CAAAU,EAAAE,KAAA,CAASZ,CAAT,CAAc,QAAA,CAACkB,CAAD,CAAWU,CAAX,CAA6B,CACnCtP,CAAAA,CAAM,CAAAoQ,GAAA,CAAkBxB,CAAlB,CAA4BU,CAA5B,EAA6C5B,CAA7C,CACZ,EAAAhC,EAAA,CAAegC,CAAf,CAAA,CAAsB1N,CACtB,EAAA2L,EAAA,EAEA,EAAAM,YAAA,CAAiBjM,CAAjB,CACA,EAAAqQ,EAAA,EANyC,CAA3C,CAOG,QAAA,EAAM,CAEP,CAAA3E,EAAA,CAAegC,CAAf,CAAA,CAAsB,IACtB,EAAA/B,EAAA,EACA,EAAA0E,EAAA,EAJO,CAPT,CAhBe,CAqCjB,EAAA,UAAA,GAAA,CAAAD,QAAY,CAACxB,CAAD,CAAWlB,CAAX,CAAgB,CAC1B,GAAI,CAACkB,CAAL,CACE,MAAO7Y,SAAA+E,uBAAA,EAGL/D,GAAJ,GAKE6X,CALF,CAKaA,CAAAlN,QAAA,CAAiBoL,EAAjB,CAAoC,QAAA,CAAC2B,CAAD,CAAQ6B,CAAR,CAAYC,CAAZ,CAAmB,CAChE,MAAgC,EAAhC;AAAI9B,CAAAK,QAAA,CAAc,OAAd,CAAJ,CACYwB,CADZ,CACwC,uBADxC,CAC4CC,CAD5C,CAGO9B,CAJyD,CAAvD,CALb,CAcA,KAAM7P,EACH7I,QAAA+G,cAAA,CAAuB,UAAvB,CACH8B,EAAAc,UAAA,CAAqBkP,CACrB,IAAIhQ,CAAAf,QAAJ,CACEA,CAGA,CAHUe,CAAAf,QAGV,CAAAqO,CAAA,CAAerO,CAAf,CAJF,KAQE,KADAA,CACA,CADU9H,QAAA+E,uBAAA,EACV,CAAO8D,CAAAtD,WAAP,CAAA,CACEuC,CAAA3B,YAAA,CAAoB0C,CAAAtD,WAApB,CAMJ,IADMkV,CACN,CADe3S,CAAA9B,cAAA,CAAsB,MAAtB,CACf,CACE2R,CACA,CADMX,CAAAI,GAAA,CAAgBqD,CAAApD,aAAA,CAAoB,MAApB,CAAhB,CAA6CM,CAA7C,CACN,CAAA8C,CAAAC,gBAAA,CAAuB,MAAvB,CAGI/W,EAAAA,CACHM,CAAA,CAAI6D,CAAJ,CAlI4B6S,mNAkI5B,CAEH;IAAIC,EAAoB,CACxB7F,EAAA,CAAQpR,CAAR,CAAY,QAAA,CAAAkX,CAAA,CAAK,CAEf5F,CAAA,CAAkB4F,CAAlB,CACA7D,EAAAC,GAAA,CAAa4D,CAAb,CAAgBlD,CAAhB,CAEAkD,EAAAjO,aAAA,CAvIuBkO,mBAuIvB,CAAqC,EAArC,CAEoB,SAApB,GAAID,CAAApQ,UAAJ,EAAgC,CAACoQ,CAAAtF,IAAjC,EAA0CsF,CAAAxS,YAA1C,GAKEwS,CAAAjO,aAAA,CAAe,KAAf,CAAsB,qCAAtB,CAA8DmO,kBAAA,CAH9CF,CAAAxS,YAG8C,EAH9B,kBAG8B,CAHXsP,CAGW,EAJlDiD,CAAAI,CAAoB,GAApBA,CAAwBJ,CAAxBI,CAA8C,EAII,EAHF,OAGE,EAA9D,CAEA,CADAH,CAAAxS,YACA,CADgB,EAChB,CAAAuS,CAAA,EAPF,CAPe,CAAjB,CAiBA,OAAO9S,EA/DmB,CAsE5B,EAAA,UAAA,EAAA,CAAAwS,QAA2B,EAAG,CAAA,IAAA,EAAA,IAE5B,IAAI1E,CAAA,IAAAA,EAAJ,CAAA,CAGA,IAAAC,EAAAoF,WAAA,EACA,KAAAC,QAAA,CAAalb,QAAb,CAN4B,KAcxBmb,EAAY,CAAA,CAdY,CAe1BC,EAAW,CAAA,CAfe,CAgBtB5F,EAAgBA,QAAA,EAAM,CACtB4F,CAAJ,EAAgBD,CAAhB,GAGE,CAAAjF,YAAA,CAAiBlW,QAAjB,CACA,CAAI,CAAA4V,EAAJ,GAGA,CAAAC,EAAAzH,QAAA,CAA8BpO,QAAAsI,KAA9B,CAA6C,CAC3C0N,UAAW,CAAA,CADgC,CAE3CC,QAAS,CAAA,CAFkC,CAA7C,CAIA;AAAA,CAAAoF,GAAA,EAPA,CAJF,CAD0B,CAe5B,KAAAC,GAAA,CAAmB,QAAA,EAAM,CACvBF,CAAA,CAAW,CAAA,CACX5F,EAAA,EAFuB,CAAzB,CAIA,KAAA+F,GAAA,CAAgB,QAAA,EAAM,CACpBJ,CAAA,CAAY,CAAA,CACZ3F,EAAA,EAFoB,CAAtB,CAjCA,CAF4B,CA4C9B,EAAA,UAAA,QAAA,CAAA0F,QAAO,CAACjR,CAAD,CAAM,CAAA,IAAA,EAAA,IACLtG,EAAAA,CACHM,CAAA,CAAIgG,CAAJ,CArNgBwK,kBAqNhB,CACHM,EAAA,CAAQpR,CAAR,CAAY,QAAA,CAAAkX,CAAA,CAAK,CACf,IAAM7F,EAAM,CAAAW,EAAA,CAAekF,CAAA1D,KAAf,CAEZ,EADA0D,CAAA,SACA,CAD0C7F,CAC1C,GAAWA,CAAA3Q,SAAX,GAA4BC,IAAAG,uBAA5B,GAGE,CAAAkR,EAAA,CAAekF,CAAA1D,KAAf,CAIA,CAJyB0D,CAIzB,CAHAA,CAAAzF,WAGA,CAHe,SAGf,CAFAyF,CAAA,SAEA,CAFgBA,CAEhB,CADA,CAAAK,QAAA,CAAalG,CAAb,CACA,CAAA6F,CAAA1U,YAAA,CAAc6O,CAAd,CAPF,CAHe,CAAjB,CAHW,CAuBb,EAAA,UAAA,GAAA,CAAAuG,QAAU,CAACrQ,CAAD,CAAW,CAGCsQ,QAAA,EAAA,CAAA1Z,CAAA,CAAK,CACvB,GAAIA,CAAJ,CAAQsI,CAAR,CAAW,CAKT,IAAM3G,EAAI0I,CAAA,CAAGrK,CAAH,CAAV,CACMiG,EACH/H,QAAA+G,cAAA,CAAuB,QAAvB,CAEHtD,EAAAiX,gBAAA,CA1OqBI,mBA0OrB,CACA/F,EAAA,CAAQtR,CAAA8H,WAAR,CAAsB,QAAA,CAAAC,CAAA,CAAQ,CAAA,MAAAzD,EAAA6E,aAAA,CAAmBpB,CAAAC,KAAnB;AAA8BD,CAAAE,MAA9B,CAAA,CAA9B,CAEAkL,EAAA,CAAgB7O,CAChBtE,EAAAmG,WAAApD,aAAA,CAA0BuB,CAA1B,CAAiCtE,CAAjC,CACAwR,EAAA,CAAkBlN,CAAlB,CAAyB,QAAA,EAAM,CAC7B6O,CAAA,CAAgB,IAChB4E,EAAA,CAAY1Z,CAAZ,CAAgB,CAAhB,CAF6B,CAA/B,CAdS,CAAX,IAmBEoJ,EAAA,EApBqB,CAFzB,IAAMiB,EAAKlI,CAAA,CAAIjE,QAAJ,CA1NgByb,2BA0NhB,CAAX,CACMrR,EAAI+B,CAAAzI,OAwBV8X,EAAA,CAAY,CAAZ,CA1BmB,CAiCrB,EAAA,UAAA,GAAA,CAAAF,QAAa,CAACpQ,CAAD,CAAW,CACtB,IAAMiB,EACHlI,CAAA,CAAIjE,QAAJ,CA1PuB0b,kEA0PvB,CADH,CAEI5G,EAAU3I,CAAAzI,OACd,IAAKoR,CAAL,CAAA,CASA,IAAM6G,EAAY3a,EAAZ2a,EAAoB,CAAC,CAAC3b,QAAAgG,cAAA,CAnRH4V,iDAmRG,CAC5B7G,EAAA,CAAQ5I,CAAR,CAAY,QAAA,CAAA1I,CAAA,CAAK,CAEfwR,CAAA,CAAkBxR,CAAlB,CAAqB,QAAA,EAAM,CACzBA,CAAAiX,gBAAA,CA/QqBI,mBA+QrB,CACkB,EAAlB,GAAI,EAAEhG,CAAN,EACE5J,CAAA,EAHuB,CAA3B,CAQA,IAAIyQ,CAAJ,EAAiBlY,CAAAmG,WAAjB,GAAkC5J,QAAAsI,KAAlC,CAAiD,CAE/C,IAAMuT,EAAc7b,QAAA+G,cAAA,CAAuBtD,CAAAgH,UAAvB,CAEpBoR;CAAA,iBAAA,CAAkCpY,CAElCoY,EAAAjP,aAAA,CAAyB,MAAzB,CAAiC,oBAAjC,CAEAnJ,EAAAmG,WAAAzE,aAAA,CAA0B0W,CAA1B,CAAuCpY,CAAAqY,YAAvC,CAEA,KADIC,CACJ,CADiBzH,CAAA,CAAiB7Q,CAAjB,CACjB,CAAOsY,CAAP,EAAqBzH,CAAA,CAAiByH,CAAjB,CAArB,CAAA,CACEA,CAAA,CAAazH,CAAA,CAAiByH,CAAjB,CAEXA,EAAAnS,WAAJ,GAA8B5J,QAAAsI,KAA9B,GACEyT,CADF,CACe,IADf,CAGA/b,SAAAsI,KAAAnD,aAAA,CAA2B1B,CAA3B,CAA8BsY,CAA9B,CAEAtY,EAAAiX,gBAAA,CAAkB,MAAlB,CAlB+C,CAVlC,CAAjB,CAVA,CAAA,IACExP,EAAA,EALoB,CAkDxB,EAAA,UAAA,GAAA,CAAAmQ,QAAU,EAAG,CAAA,IAAA,EAAA,IAAA,CACL1X,EACHM,CAAA,CAAIjE,QAAJ,CA/TgByU,kBA+ThB,CAEHM,EAAA,CAAQpR,CAAR,CAAY,QAAA,CAAAkX,CAAA,CAAK,CAAA,MAAA,EAAAT,EAAA,CAAuBS,CAAvB,CAAA,CAAjB,CAA4C,CAAA,CAA5C,CAJW,CAWb,EAAA,UAAA,EAAA,CAAAT,QAAiB,CAACzD,CAAD,CAAO,CAEjBA,CAAA,SAAL,GACEA,CAAA,SAIA,CAJmB,CAAA,CAInB,CAFAA,CAAAqF,OAEA,GAFgBrF,CAAAqF,OAAA5G,WAEhB,CAFyC,UAEzC,EAAAuB,CAAAsF,cAAA,CAAmB7H,CAAA,CADDuC,CAAAqF,OAAAE,CAAc,MAAdA,CAAuB,OACtB,CAA0B,CAC3Cxa,QAAS,CAAA,CADkC;AAE3ChB,WAAY,CAAA,CAF+B,CAG3CiB,OAAQyL,IAAAA,EAHmC,CAA1B,CAAnB,CALF,CAFsB,CAkBxB,EAAA,UAAA,GAAA,CAAA2I,QAAe,CAACoG,CAAD,CAAY,CAAA,IAAA,EAAA,IACzBpH,EAAA,CAAQoH,CAAR,CAAmB,QAAA,CAAArG,CAAA,CAAK,CAAA,MAAAf,EAAA,CAAQe,CAAAsG,WAAR,CAAsB,QAAA,CAAAC,CAAA,CAAQ,CAChDA,CAAJ,EAAYA,CAAAhY,SAAZ,GAA8BC,IAAA8G,aAA9B,GAEMsJ,CAAA,CAAa2H,CAAb,CAAJ,CACE,CAAAlC,EAAA,CAAkDkC,CAAlD,CADF,CAGE,CAAAnG,YAAA,CAA2CmG,CAA3C,CALJ,CADoD,CAA9B,CAAA,CAAxB,CADyB,CAmI7B,KAAIC,GAAW,IAqBf,IAAI/H,CAAJ,CAKQgI,CAkBN,CAjBGtY,CAAA,CAAIjE,QAAJ,CAxfkByU,kBAwflB,CAiBH,CAhBAM,CAAA,CAAQwH,CAAR,CAAc,QAAA,CAAAvH,CAAA,CAAO,CACdA,CAAAgH,OAAL,EAA6C,SAA7C,GAAmBhH,CAAAgH,OAAA5G,WAAnB,GACEJ,CAAA,SADF,CACoB,CAAA,CADpB,CADmB,CAArB,CAgBA,CAPMQ,CAON,CAPsBA,QAAA,CAAAnB,CAAA,CAAS,CACvBgI,CAAAA,CAAgChI,CAAAhR,OAClCqR,EAAA,CAAa2H,CAAb,CAAJ,GACEA,CAAA,SADF,CACqB,CAAA,CADrB,CAF6B,CAO/B,CADArc,QAAAqK,iBAAA,CAA0B,MAA1B,CAAkCmL,CAAlC,CAAiD,CAAA,CAAjD,CACA,CAAAxV,QAAAqK,iBAAA,CAA0B,OAA1B,CAAmCmL,CAAnC,CAAkD,CAAA,CAAlD,CAvBF,KAwBO,CAML,IAAMgH,GAAiB5b,MAAA6b,yBAAA,CAAgCnY,IAAA9D,UAAhC;AAAgD,SAAhD,CAGvBI,OAAAC,eAAA,CAAsBL,CADR,CAACgc,EAADE,EAAmBF,EAAAzb,aAAnB2b,CAAiDpY,IAAjDoY,CAAwDhV,OAChDlH,WAAtB,CAAuC,SAAvC,CAAkD,CAChD,IAAAM,QAAG,EAAG,CACJ,IAAM6b,EAA2CjI,CAAA,CAAa,IAAb,CAAA,CAAqB,IAArB,CAA4BJ,CAAA,CAAiB,IAAjB,CAC7E,OAAIqI,EAAJ,CAAqBA,CAAAxF,KAArB,CAEIqF,EAAJ,EAAsBA,EAAA1b,IAAtB,CAAiD0b,EAAA1b,IAAAH,KAAA,CAAwB,IAAxB,CAAjD,CAGOwW,CADsCnX,QAAAgG,cAAAkR,CAAuB,MAAvBA,CACtCC,EAAS/V,MAAAsY,SAATvC,MAPH,CAD0C,CAUhDpW,aAAc,CAAA,CAVkC,CAWhD6b,WAAY,CAAA,CAXoC,CAAlD,CAeAhc,OAAAC,eAAA,CAAsBgc,eAAArc,UAAtB,CAAiD,QAAjD,CAA2D,CACzD,IAAAM,QAAG,EAAG,CACJ,MAAuC,KAAD,SAAtC,EAA4D,IADxD,CADmD,CAIzDC,aAAc,CAAA,CAJ2C,CAKzD6b,WAAY,CAAA,CAL6C,CAA3D,CAQA1H,EAAA,CAAkB,QAAA,EAAM,CACtBoH,EAAA,CAAW,IAAI5G,CADO,CAAxB,CAhCK,CAgDPJ,CAAA,CAAU,QAAA,EAAM,CAAA,MAAAtV,SAAAic,cAAA,CAAuB7H,CAAA,CAAe,mBAAf,CAAoC,CACzE1T,WAAY,CAAA,CAD6D;AAEzEgB,QAAS,CAAA,CAFgE,CAGzEC,OAAQyL,IAAAA,EAHiE,CAApC,CAAvB,CAAA,CAAhB,CAOA+G,EAAAI,UAAA,CAAkBA,CAClBJ,EAAAmB,UAAA,CAAkBA,CAClBnB,EAAAG,iBAAA,CAAyBA,CACzBH,EAAA+B,YAAA,CAjGoBA,QAAA,CAACjM,CAAD,CAAS,CACvBqS,EAAJ,EACEA,EAAApG,YAAA,CAAqBjM,CAArB,CAFyB,CAhqBrB,CAAT,CAAD,CAmwBG7I,MAAA0b,YAnwBH,CAmwByB1b,MAAA0b,YAnwBzB,EAmwB+C,EAnwB/C,C;;;;;;;;;ACIA1b,MAAA,cAAA,CAA0BA,MAAA,cAA1B,EAAqD,CAAC,MAAQ,EAAT,CAIrD,KAAIkV,GAAStW,QAAAgG,cAAA,CAAuB,sCAAvB,CAAb,CACI+W,GAAc,SADlB,CAIIC,EAAQ,EACZ,IAAI,CAACA,CAAA,OAAL,CAAsB,CAEpBtD,QAAAuD,OAAA/Z,MAAA,CAAsB,CAAtB,CAAA0V,MAAA,CAA+B,GAA/B,CAAA7D,QAAA,CAA4C,QAAQ,CAACmI,CAAD,CAAS,CACvDC,CAAAA,CAAQD,CAAAtE,MAAA,CAAa,GAAb,CACZ,KAAIF,CACAyE,EAAA,CAAM,CAAN,CAAJ,GAAiBzE,CAAjB,CAAyByE,CAAA,CAAM,CAAN,CAAAzE,MAAA,CAAeqE,EAAf,CAAzB,IACEC,CAAA,CAAMtE,CAAA,CAAM,CAAN,CAAN,CADF,CACoByE,CAAA,CAAM,CAAN,CADpB,EACgC,CAAA,CADhC,CAH2D,CAA7D,CAQA,IAAI7G,EAAJ,CACE,IADU,IACDxU,GAAE,CADD,CACI6K,EAAd,CAAkBA,EAAlB,CAAoB2J,EAAA/K,WAAA,CAAkBzJ,EAAlB,CAApB,CAA2CA,EAAA,EAA3C,CACiB,KAAf,GAAI6K,EAAAlB,KAAJ,GACEuR,CAAA,CAAMrQ,EAAAlB,KAAN,CADF,CACkBkB,EAAAjB,MADlB,EAC6B,CAAA,CAD7B,CAMJ,IAAIsR,CAAA,IAAJ,EAAoBA,CAAA,IAAA,MAApB,CAA2C,CACzC,IAAIG,GAAQH,CAAA,IAAApE,MAAA,CAAmB,GAAnB,CACZoE,EAAA,IAAA,CAAe,EACfG,GAAApI,QAAA,CAAc,QAAQ,CAACqI,CAAD,CAAI,CACxBJ,CAAA,IAAA,CAAaI,CAAb,CAAA,CAAkB,CAAA,CADM,CAA1B,CAHyC,CAA3C,IAOEJ,EAAA,IAAA,CAAe,EAzBG;AA8BtB5b,MAAA,cAAA,MAAA,CAAmC4b,CACnC,KAAIK,GAAaL,CAAA,SACbK,GAAJ,GACEjc,MAAA,SACA,CADqBA,MAAA,SACrB,EAD2C,EAC3C,CAAAA,MAAA,SAAA,MAAA,CAA8Bic,EAFhC,CAKA,KAAIC,GAAUN,CAAA,SAAVM,EAA+BN,CAAA,GAC/BM,GAAJ,EAAelc,MAAA,eAAf,GACEA,MAAA,eAAA,cADF,CAC8Ckc,EAD9C,C;;;;;;;;;AChDEzN,QADW0N,GACA,EAAG,CAIZ,IAAAC,GAAA,CAFA,IAAAC,KAEA,CAFY,IAGZ,KAAAC,EAAA,CAAa,CAAA,CAWb,KAAAC,EAAA,CAFA,IAAAC,EAEA,CAJA,IAAAC,GAIA,CANA,IAAAC,aAMA,CARA,IAAAC,cAQA,CAVA,IAAA7P,EAUA,CAVgB,IAuBhB,KAAA9J,WAAA,CAFA,IAAA0X,YAEA,CAJA,IAAAkC,gBAIA,CANA,IAAAC,UAMA,CARA,IAAA1Y,WAQA,CAVA,IAAAqE,WAUA,CAZA,IAAAsU,EAYA,CAZsB9Q,IAAAA,EActB,KAAA+Q,GAAA,CADA,IAAAC,GACA,CAD0B,CAAA,CA9Bd,CAkCd,EAAA,UAAA,OAAA,CAAAC,QAAM,EAAG,CACP,MAAO,EADA,CAKJC,SAASA,EAAsB,CAACpa,CAAD,CAAO,CACtCA,CAAAqa,GAAL,GACEra,CAAAqa,GADF,CACiB,IAAIhB,EADrB,CAGA,OAAOrZ,EAAAqa,GAJoC,CAOtCC,QAASA,EAAgB,CAACta,CAAD,CAAO,CACrC,MAAOA,EAAP,EAAeA,CAAAqa,GADsB,C,CC/ChC,IAAIE,EAAWrd,MAAA,SAAXqd,EAAiC,EAE5CA,EAAAC,GAAA,CAA8B,EAAQC,CAAAjX,OAAAlH,UAAAme,aAAR,EAA0CC,CAAAta,IAAA9D,UAAAoe,YAA1C,CAE9B,KAAIC,GAAOje,MAAA6b,yBAAA,CAAgCnY,IAAA9D,UAAhC,CAAgD,YAAhD,CAEXie,EAAAK,EAAA,CAA0B,CAAA,EAAQD,EAAR,EAAgBA,EAAA9d,aAAhB,EAAqC8d,EAAA/d,IAArC,CAC1B2d,EAAAM,GAAA,CAAiBN,CAAA,MAAjB,EAAsC,CAACA,CAAAC,GAIvC,KAAMM,GAAQ9d,SAAAC,UAAAuX,MAAA,CAA0B,SAA1B,CAAd,CACMuG,GAAU/d,SAAAC,UAAAuX,MAAA,CAA0B,MAA1B,CACoBtL,KAAAA,EAApC,GAAIqR,CAAAS,GAAJ,GACET,CAAAS,GADF,CACgCT,CAAAK,EADhC,GAC4DE,EAD5D,EACqEC,EADrE,EAIOE,SAASA,GAA2B,CAACjb,CAAD,CAAO,CAEhD,OADMkb,CACN,CD4BcZ,CC7BG,CAAiBta,CAAjB,CACjB,GAA4CkJ,IAAAA,EAA5C,GAAoBgS,CAAA7Z,WAF4B,CAK3C8Z,QAASA,EAAW,CAAC/V,CAAD,CAAM,CAC/B,MAAkC,WAAlC,GAAeA,CAAAgW,GADgB,CAI1BC,QAASA,GAAqB,CAACrb,CAAD,CAAO,CACtCuZ,CAAAA,CAAOvZ,CAAA0a,YAAA,EACX,IAAIS,CAAA,CAAY5B,CAAZ,CAAJ,CACE,MAAOA,EAHiC;AAO5C,IAAI3Z,GAAI4D,OAAAlH,UAAR,CACIgf,GAAU1b,EAAA0b,QAAVA,EAAuB1b,EAAA2b,gBAAvBD,EACF1b,EAAA4b,mBADEF,EACsB1b,EAAA6b,kBADtBH,EAEF1b,EAAA8b,iBAFEJ,EAEoB1b,EAAA+b,sBAajBC,SAASA,GAAM,CAACzc,CAAD,CAASQ,CAAT,CAAiB,CACrC,GAAIR,CAAJ,EAAcQ,CAAd,CAEE,IADA,IAAIF,EAAK/C,MAAAgD,oBAAA,CAA2BC,CAA3B,CAAT,CACS/B,EAAE,CADX,CACc+Y,CAAd,CAAkB/Y,CAAlB,CAAoB6B,CAAAD,OAApB,GAAmCmX,CAAnC,CAAqClX,CAAA,CAAG7B,CAAH,CAArC,EAA6CA,CAAA,EAA7C,CAAkD,CATpD,IAAIie,EAAKnf,MAAA6b,yBAAA,CAUc5Y,CAVd,CAUWgX,CAVX,CACLkF,EAAJ,EACEnf,MAAAC,eAAA,CAQ6BwC,CAR7B,CAQkBwX,CARlB,CAAoCkF,CAApC,CAOkD,CAHf,CAUhCC,QAASA,GAAS,CAAC3c,CAAD,CAAS,CAAT,CAAqB,CAAZ,IAAA,IAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,SAAA,OAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAChC,KAASvB,CAAT,CAAW,CAAX,CAAcA,CAAd,CAD4CwB,CAC1BI,OAAlB,CAAkC5B,CAAA,EAAlC,CACEge,EAAA,CAAOzc,CAAP,CAF0CC,CAE3B,CAAQxB,CAAR,CAAf,CAEF,OAAOuB,EAJqC,CAOvC4c,QAASA,GAAK,CAAC5c,CAAD,CAASQ,CAAT,CAAiB,CACpC,IAAK/B,IAAIA,CAAT,GAAc+B,EAAd,CACER,CAAA,CAAOvB,CAAP,CAAA,CAAY+B,CAAA,CAAO/B,CAAP,CAFsB;AAoBtC,IAAIoe,GAAUlgB,QAAAmO,eAAA,CAAwB,EAAxB,CAAd,CACIrG,GAAU,CADd,CAEIgH,GAAQ,EACZV,EAAA,IAAIb,gBAAJ,CAAqB,QAAA,EAAM,CACzB,IAAA,CAAOuB,EAAApL,OAAP,CAAA,CAEE,GAAI,CACFoL,EAAAqR,MAAA,EAAA,EADE,CAEF,MAAMpgB,CAAN,CAAS,CAGT,KADAmgB,GAAA7X,YACMtI,CADgB+H,EAAA,EAChB/H,CAAAA,CAAN,CAHS,CALY,CAA3B,CAAAqO,SAAA,CAWW8R,EAXX,CAWoB,CAAC7R,cAAe,CAAA,CAAhB,CAXpB,CAcO+R,SAASA,GAAS,CAAClV,CAAD,CAAW,CAClC4D,EAAAuR,KAAA,CAAWnV,CAAX,CACAgV,GAAA7X,YAAA,CAAsBP,EAAA,EAFY,CAK7B,IAAMwY,GAAsB,CAAA,CAAQtgB,QAAAugB,SAEpCA,SAASA,GAAQ,CAACC,CAAD,CAAYtc,CAAZ,CAAkB,CACxC,IAAA,CAAOA,CAAP,CAAA,CAAa,CACX,GAAIA,CAAJ,EAAYsc,CAAZ,CACE,MAAO,CAAA,CAETtc,EAAA,CAAOA,CAAA0F,WAJI,CAMb,MAAO,CAAA,CAPiC,C,CC5G1C,IAAI6W,GAAY,EAAhB,CACIC,EACGC,SAASA,GAAO,CAACzV,CAAD,CAAW,CAC3BwV,EAAL,GACEA,EACA,CADY,CAAA,CACZ,CDgGYN,EChGZ,CAAgBtS,EAAhB,CAFF,CAIA2S,GAAAJ,KAAA,CAAenV,CAAf,CALgC,CAQ3B4C,QAASA,GAAK,EAAG,CACtB4S,EAAA,CAAY,CAAA,CAEZ,KADA,IAAIE,EAAW,CAAA,CAAQH,EAAA/c,OACvB,CAAO+c,EAAA/c,OAAP,CAAA,CACE+c,EAAAN,MAAA,EAAA,EAEF,OAAOS,EANe,CASxB9S,EAAA,KAAA,CAAgB2S,E,CCjBd5Q,QAFIgR,GAEO,EAAG,CACZ,IAAAC,EAAA,CAAkB,CAAA,CAClB,KAAA1E,WAAA,CAAkB,EAClB,KAAA2E,aAAA,CAAoB,EACpB,KAAAC,EAAA,CAAiB,IAAIC,GAJT,CAOdC,QAAA,GAAQ,CAARA,CAAQ,CAAG,CACJ,CAAAJ,EAAL,GACE,CAAAA,EACA,CADkB,CAAA,CAClB,CFyFUV,EEzFV,CAAgB,QAAA,EAAM,CACpBtS,EAAA,CAJKA,CAIL,CADoB,CAAtB,CAFF,CADS,CASXA,QAAA,GAAK,CAALA,CAAK,CAAG,CACN,GAAI,CAAAgT,EAAJ,CAAqB,CACnB,CAAAA,EAAA,CAAkB,CAAA,CAClB,KAAI3E,EAAY,CAAAgF,YAAA,EACZhF,EAAAzY,OAAJ,EACE,CAAAsd,EAAAjM,QAAA,CAAuB,QAAQ,CAACqM,CAAD,CAAK,CAClCA,CAAA,CAAGjF,CAAH,CADkC,CAApC,CAJiB,CADf,CAYR,EAAA,UAAA,YAAA,CAAAgF,QAAW,EAAG,CACZ,GAAI,IAAA/E,WAAA1Y,OAAJ,EAA8B,IAAAqd,aAAArd,OAA9B,CAAwD,CACtD,IAAIyY,EAAY,CAAC,CACfC,WAAY,IAAAA,WADG,CAEf2E,aAAc,IAAAA,aAFC,CAAD,CAIhB,KAAA3E,WAAA,CAAkB,EAClB,KAAA2E,aAAA,CAAoB,EACpB,OAAO5E,EAP+C,CASxD,MAAO,EAVK,CAoBakF;QAAA,GAAQ,CAACnd,CAAD,CAAOgH,CAAP,CAAiB,CACpD,IAAMoW,EHbQhD,CGaH,CAAuBpa,CAAvB,CACNod,EAAApT,EAAL,GACEoT,CAAApT,EADF,CACgB,IAAI2S,EADpB,CAGAS,EAAApT,EAAA8S,EAAAO,IAAA,CAA0BrW,CAA1B,CACA,KAAIgD,EAAWoT,CAAApT,EACf,OAAO,CACLsT,GAAWtW,CADN,CAELuW,EAAWvT,CAFN,CAGLwT,GAAOxd,CAHF,CAIL,YAAAid,QAAW,EAAG,CACZ,MAAOjT,EAAAiT,YAAA,EADK,CAJT,CAP6C,CAiBvBQ,QAAA,GAAQ,CAACC,CAAD,CAAS,CAC9C,IAAI1T,EAAW0T,CAAX1T,EAAqB0T,CAAAH,EACrBvT,EAAJ,GACEA,CAAA8S,EAAAa,OAAA,CAA0BD,CAAAJ,GAA1B,CACA,CAAKtT,CAAA8S,EAAAc,KAAL,GHjCYxD,CGkCV,CAAuBsD,CAAAF,GAAvB,CAAAxT,EADF,CACkD,IADlD,CAFF,CAF8C;AAUzC6T,QAASA,GAAe,CAAC5F,CAAD,CAAY9Y,CAAZ,CAAoB,CAEjD,IAAM2e,EAAiB3e,CAAAub,YAAA,EACvB,OAAOzC,EAAA8F,IAAA,CAAc,QAAQ,CAACC,CAAD,CAAW,CAEtC,IAAMC,EAAmBH,CAAnBG,GAAsCD,CAAA7e,OAAAub,YAAA,EAC5C,IAAIuD,CAAJ,EAAuBD,CAAA9F,WAAvB,CAIE,IAHIgG,CAGA1e,CAHQZ,KAAAC,KAAA,CAAWmf,CAAA9F,WAAX,CAAAiG,OAAA,CAAuC,QAAQ,CAACxH,CAAD,CAAI,CAC7D,MAAQmH,EAAR,GAA2BnH,CAAA+D,YAAA,EADkC,CAAnD,CAGRlb,CAAA0e,CAAA1e,OAAJ,CAME,MALAwe,EAKOA,CALIthB,MAAA4H,OAAA,CAAc0Z,CAAd,CAKJA,CAJPthB,MAAAC,eAAA,CAAsBqhB,CAAtB,CAAgC,YAAhC,CAA8C,CAC5CxW,MAAO0W,CADqC,CAE5CrhB,aAAc,CAAA,CAF8B,CAA9C,CAIOmhB,CAAAA,CANT,CAJF,IAYO,IAAIC,CAAJ,CACL,MAAOD,EAhB6B,CAAjC,CAAAG,OAAA,CAkBG,QAAQ,CAACvM,CAAD,CAAI,CAAE,MAAOA,EAAT,CAlBf,CAH0C,C,CChFnD,IAAA,EAAA,EAAA,CACW3Q,GAAeuC,OAAAlH,UAAA2E,aAD1B,CAEWqB,GAAekB,OAAAlH,UAAAgG,aAF1B,CAGWF,GAAcoB,OAAAlH,UAAA8F,YAHzB,CAIWsG,GAAelF,OAAAlH,UAAAoM,aAJ1B,CAKW8N,GAAkBhT,OAAAlH,UAAAka,gBAL7B,CAMW1V,GAAY0C,OAAAlH,UAAAwE,UANvB,CAOWiC,GAAaL,QAAApG,UAAAyG,WAPxB,CAQWoD,GAAmB3C,OAAAlH,UAAA6J,iBAR9B,CASWgL,GAAsB3N,OAAAlH,UAAA6U,oBATjC,CAUWiN,GAAyBC,MAAA/hB,UAAA6J,iBAVpC,CAWWmY,GAA4BD,MAAA/hB,UAAA6U,oBAXvC,CAYW4G,GAAgBvU,OAAAlH,UAAAyb,cAZ3B,CAaWsE,GAAWjc,IAAA9D,UAAA+f,SAAXA,EAAsCxa,WAAAvF,UAAA+f,SAbjD,CAcWkC,GAAiB7b,QAAApG,UAAAiiB,eAd5B;AAeWC,GAAuBhb,OAAAlH,UAAAwF,cAflC,CAgBW2c,GAAwB1d,gBAAAzE,UAAAwF,cAhBnC,CAiBW4c,GAAwBhc,QAAApG,UAAAwF,cAjBnC,CA4BWrB,GAA0B+C,OAAAlH,UAAAsF,iBA5BrC,CA6BW+c,GAA2B5d,gBAAAzE,UAAAsF,iBA7BtC,CA8BWgd,GAA2Blc,QAAApG,UAAAsF,iBA9B3BK,EAAAA,YAAAA,CAAcuB,OAAAlH,UAAA2F,YACdhB,EAAAA,aAAAA,CAAAA,EACAqB,EAAAA,aAAAA,CAAAA,EACAF,EAAAA,YAAAA,CAAAA,EACAsG,EAAAA,aAAAA,CAAAA,EACA8N,EAAAA,gBAAAA,CAAAA,EACA1V,EAAAA,UAAAA,CAAAA,EACAiC,EAAAA,WAAAA,CAAAA,EACAoD,EAAAA,iBAAAA,CAAAA,EACAgL,EAAAA,oBAAAA,CAAAA,EACAiN,EAAAA,GAAAA,CAAAA,EACAE,EAAAA,GAAAA,CAAAA,EACAvG,EAAAA,cAAAA,CAAAA,EACAsE,EAAAA,SAAAA,CAAAA,EACAkC;CAAAA,eAAAA,CAAAA,EACAC,EAAAA,GAAAA,CAAAA,EACAC,EAAAA,GAAAA,CAAAA,EACAC,EAAAA,GAAAA,CAAAA,EACA5c,EAAAA,cAAAA,CAAgBA,QAAQ,CAAC7B,CAAD,CAAW,CAC5C,OAAQ,IAAAE,SAAR,EACE,KAAKC,IAAA8G,aAAL,CACE,MAAOsX,GAAA/hB,KAAA,CAA0B,IAA1B,CAAgCwD,CAAhC,CACT,MAAKG,IAAAC,cAAL,CACE,MAAOqe,GAAAjiB,KAAA,CAA2B,IAA3B,CAAiCwD,CAAjC,CACT,SACE,MAAOwe,GAAAhiB,KAAA,CAA2B,IAA3B,CAAiCwD,CAAjC,CANX,CAD4C,CAUnCQ,EAAAA,GAAAA,CAAAA,EACAke,EAAAA,GAAAA,CAAAA,EACAC,EAAAA,GAAAA,CAAAA,EACAhd,EAAAA,iBAAAA,CAAmBA,QAAQ,CAAC3B,CAAD,CAAW,CAC/C,OAAQ,IAAAE,SAAR,EACE,KAAKC,IAAA8G,aAAL,CACE,MAAOzG,GAAAhE,KAAA,CAA6B,IAA7B,CAAmCwD,CAAnC,CACT,MAAKG,IAAAC,cAAL,CACE,MAAOue,GAAAniB,KAAA,CAA8B,IAA9B,CAAoCwD,CAApC,CACT,SACE,MAAO0e,GAAAliB,KAAA,CAA8B,IAA9B,CAAoCwD,CAApC,CANX,CAD+C,C,CCzBjD,IAAIuG,GAAmB,aAAvB,CACIC,GAAmB,cAEvBC,SAASA,GAAa,CAACC,CAAD,CAAI,CACxB,OAAQA,CAAR,EACE,KAAK,GAAL,CACE,MAAO,OACT,MAAK,GAAL,CACE,MAAO,MACT,MAAK,GAAL,CACE,MAAO,MACT,MAAK,GAAL,CACE,MAAO,QACT,MAAK,QAAL,CACE,MAAO,QAVX,CADwB,CAuB1BC,QAASA,GAAO,CAACC,CAAD,CAAM,CAEpB,IADA,IAAIvB,EAAM,EAAV,CACS1H,EAAI,CAAb,CAAgBA,CAAhB,CAAoBiJ,CAAArH,OAApB,CAAgC5B,CAAA,EAAhC,CACE0H,CAAA,CAAIuB,CAAA,CAAIjJ,CAAJ,CAAJ,CAAA,CAAc,CAAA,CAEhB,OAAO0H,EALa,CAStB,IAAIwB,GAAeF,EAAA,CAAQ,qFAAA,MAAA,CAAA,GAAA,CAAR,CAAnB,CAmBIG,GAAmBH,EAAA,CAAQ,6DAAA,MAAA,CAAA,GAAA,CAAR,CAoDhBvB;QAASA,GAAY,CAACrF,CAAD,CAAOgH,CAAP,CAAiB,CACpB,UAAvB,GAAIhH,CAAAuG,UAAJ,GACEvG,CADF,CAC8CA,CAAD4D,QAD7C,CAKA,KAFA,IAAIrE,EAAI,EAAR,CACI0H,EAAKD,CAAA,CAAWA,CAAA,CAAShH,CAAT,CAAX,CAA4BA,CAAAE,WADrC,CAEStC,EAAE,CAFX,CAEcsI,EAAEe,CAAAzH,OAFhB,CAE2B4B,CAA3B,CAAmCxD,CAAnC,CAAqCsI,CAArC,GAA4C9E,CAA5C,CAAkD6F,CAAA,CAAGrJ,CAAH,CAAlD,EAA0DA,CAAA,EAA1D,CAA+D,CA1CR,CAAA,CAAA,CA2CnCwD,IAAAA,EAAAA,CAAOpB,KAAAA,EAAAA,CAAMgH,KAAAA,EAAAA,CA1CjC,QAAQhH,CAAAG,SAAR,EACE,KAAKC,IAAA8G,aAAL,CAIE,IAHA,IAAIC,EAAUnH,CAAAuG,UAAd,CACIhH,EAAI,GAAJA,CAAU4H,CADd,CAEIC,EAAQpH,CAAAqH,WAFZ,CAGSzJ,EAAI,CAAb,CAAuB0J,CAAvB,CAA8BF,CAAA,CAAMxJ,CAAN,CAA9B,CAAyCA,CAAA,EAAzC,CACE2B,CAAA,EAAK,GAAL,CAAW+H,CAAAC,KAAX,CAAuB,IAAvB,CAAyCD,CAAAE,MA1DxCC,QAAA,CAAUjB,EAAV,CAA4BE,EAA5B,CA0DD,CAAuD,GAEzDnH,EAAA,EAAK,GACL,EAAA,CAAIuH,EAAA,CAAaK,CAAb,CAAJ,CACS5H,CADT,CAGOA,CAHP,CAGW8F,EAAA,CAAarF,CAAb,CAAmBgH,CAAnB,CAHX,CAG0C,IAH1C,CAGiDG,CAHjD,CAG2D,GAH3D,OAAA,CAKF,MAAK/G,IAAAsH,UAAL,CACMC,CAAAA,CAA4B3H,CAAD2H,KAC/B,EAAA,CAAIjC,CAAJ,EAAkBqB,EAAA,CAAiBrB,CAAAa,UAAjB,CAAlB,CACSoB,CADT,CAGkBA,CAnEfF,QAAA,CAAUhB,EAAV,CAA4BC,EAA5B,CAgEH,OAAA,CAKF,MAAKtG,IAAAwH,aAAL,CACE,CAAA,CAAO,SAAP,CAAwC5H,CAAD2H,KAAvC,CAAqD,QAArD,OAAA,CAEF,SAEE,KADAzK,OAAA2K,QAAAC,MAAA,CAAqB9H,CAArB,CACM;AAAI6F,KAAJ,CAAU,iBAAV,CAAN,CA1BJ,CADuD,CA2CrDtG,CAAA,EAAK,CADwD,CAG/D,MAAOA,EAToC,C,CChH7C,IAAA,EAAA,EAAA,CAEIsf,EAAa/iB,QAAAgjB,iBAAA,CAA0BhjB,QAA1B,CAAoCijB,UAAAC,SAApC,CACf,IADe,CACT,CAAA,CADS,CAFjB,CAKIC,EAAgBnjB,QAAAgjB,iBAAA,CAA0BhjB,QAA1B,CAAoCijB,UAAAG,aAApC,CAClB,IADkB,CACZ,CAAA,CADY,CA4Bbhf,SAASA,GAAU,CAACF,CAAD,CAAO,CAC/B,IAAIke,EAAQ,EACZW,EAAAM,YAAA,CAAyBnf,CAEzB,KADI2W,CACJ,CADQkI,CAAAxd,WAAA,EACR,CAAOsV,CAAP,CAAA,CACEuH,CAAA/B,KAAA,CAAWxF,CAAX,CACA,CAAAA,CAAA,CAAIkI,CAAAjH,YAAA,EAEN,OAAOsG,EARwB,CAzBjBxY,CAAAA,WAAAA,CAATA,QAAmB,CAAC1F,CAAD,CAAO,CAC/B6e,CAAAM,YAAA,CAAyBnf,CACzB,OAAO6e,EAAAnZ,WAAA,EAFwB,CAKjBrE,EAAAA,WAAAA,CAATA,QAAmB,CAACrB,CAAD,CAAO,CAC/B6e,CAAAM,YAAA,CAAyBnf,CACzB,OAAO6e,EAAAxd,WAAA,EAFwB,CAKjB0Y,EAAAA,UAAAA,CAATA,QAAkB,CAAC/Z,CAAD,CAAO,CAC9B6e,CAAAM,YAAA,CAAyBnf,CACzB,OAAO6e,EAAA9E,UAAA,EAFuB,CAKhBD,EAAAA,gBAAAA,CAATA,QAAwB,CAAC9Z,CAAD,CAAO,CACpC6e,CAAAM,YAAA,CAAyBnf,CACzB,OAAO6e,EAAA/E,gBAAA,EAF6B,CAKtBlC;CAAAA,YAAAA,CAATA,QAAoB,CAAC5X,CAAD,CAAO,CAChC6e,CAAAM,YAAA,CAAyBnf,CACzB,OAAO6e,EAAAjH,YAAA,EAFyB,CAKlB1X,EAAAA,WAAAA,CAAAA,EAWAkf,EAAAA,cAAAA,CAATA,QAAsB,CAACpf,CAAD,CAAO,CAClCif,CAAAE,YAAA,CAA4Bnf,CAC5B,OAAOif,EAAAvZ,WAAA,EAF2B,CAKpBrB,EAAAA,kBAAAA,CAATA,QAA0B,CAACrE,CAAD,CAAO,CACtCif,CAAAE,YAAA,CAA4Bnf,CAC5B,OAAOif,EAAA5d,WAAA,EAF+B,CAKxBge,EAAAA,iBAAAA,CAATA,QAAyB,CAACrf,CAAD,CAAO,CACrCif,CAAAE,YAAA,CAA4Bnf,CAC5B,OAAOif,EAAAlF,UAAA,EAF8B,CAKvBuF,EAAAA,uBAAAA,CAATA,QAA+B,CAACtf,CAAD,CAAO,CAC3Cif,CAAAE,YAAA,CAA4Bnf,CAC5B,OAAOif,EAAAnF,gBAAA,EAFoC,CAK7ByF,EAAAA,mBAAAA,CAATA,QAA2B,CAACvf,CAAD,CAAO,CACvCif,CAAAE,YAAA,CAA4Bnf,CAC5B,OAAOif,EAAArH,YAAA,EAFgC,CAKzB4H;CAAAA,SAAAA,CAATA,QAAiB,CAACxf,CAAD,CAAO,CAC7B,IAAIke,EAAQ,EACZe,EAAAE,YAAA,CAA4Bnf,CAE5B,KADI2W,CACJ,CADQsI,CAAA5d,WAAA,EACR,CAAOsV,CAAP,CAAA,CACEuH,CAAA/B,KAAA,CAAWxF,CAAX,CACA,CAAAA,CAAA,CAAIsI,CAAArH,YAAA,EAEN,OAAOsG,EARsB,CAWfzY,EAAAA,UAAAA,CAATA,QAAkB,CAACzF,CAAD,CAAO,CAC9B,MD+BcqF,GC/BP,CAAarF,CAAb,CAAmB,QAAA,CAAC2W,CAAD,CAAO,CAAA,MAAAzW,GAAA,CAAWyW,CAAX,CAAA,CAA1B,CADuB,CAIhBxS,EAAAA,YAAAA,CAATA,QAAoB,CAACnE,CAAD,CAAO,CAEhC,OAAQA,CAAAG,SAAR,EACE,KAAKC,IAAA8G,aAAL,CACA,KAAK9G,IAAAG,uBAAL,CACMkf,CAAAA,CAAa3jB,QAAAgjB,iBAAA,CAA0B9e,CAA1B,CAAgC+e,UAAAW,UAAhC,CACf,IADe,CACT,CAAA,CADS,CAGjB,KAJF,IAGM9b,EAAU,EAHhB,CAGoB+S,CAClB,CAASA,CAAT,CAAa8I,CAAAE,SAAA,EAAb,CAAA,CAGE/b,CAAA,EAAW+S,CAAAiJ,UAEb,OAAOhc,EACT,SACE,MAAO5D,EAAA4f,UAbX,CAFgC,C,CCrFlC,IAAA,EAAA,EAAA,CAEMhF,GNAKL,CMAYK,EAFvB,CAMMiF,GAAe,CAACzf,IAAA9D,UAAD,CAAiBkH,OAAAlH,UAAjB,CAAoCuF,WAAAvF,UAApC,CAUrBwjB,SAASA,EAAkB,CAACvY,CAAD,CAAO,CAClB,IAAA,CAT6B,EAAA,CAAA,CAC3C,IAAS3J,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkBiiB,EAAArgB,OAAlB,CAAuC5B,CAAA,EAAvC,CAA4C,CAC1C,IAAMmiB,EAAQF,EAAA,CAAajiB,CAAb,CACd,IAAImiB,CAAAvb,eAAA,CAMsC+C,CANtC,CAAJ,CAAgC,CAC9B,CAAA,CAAOwY,CAAP,OAAA,CAD8B,CAFU,CADD,CAAA,CAAA,IAAA,EAAA,CAU3C,GAAI,CAACA,CAAL,CACE,KAAMla,MAAA,CAAM,gCAAN,CAAuC0B,CAAvC,CAAN,CAEF,MAAO7K,OAAA6b,yBAAA,CAAgCwH,CAAhC,CAAuCxY,CAAvC,CALyB;AAQ3B,IAAMyY,EAAgBpF,EAAA,CAAiB,CAC5ClV,WAAYoa,CAAA,CAAmB,YAAnB,CADgC,CAE5Cze,WAAYye,CAAA,CAAmB,YAAnB,CAFgC,CAG5C/F,UAAW+F,CAAA,CAAmB,WAAnB,CAHiC,CAI5ChG,gBAAiBgG,CAAA,CAAmB,iBAAnB,CAJ2B,CAK5ClI,YAAakI,CAAA,CAAmB,aAAnB,CAL+B,CAM5C5f,WAAY4f,CAAA,CAAmB,YAAnB,CANgC,CAO5CV,cAAeU,CAAA,CAAmB,eAAnB,CAP6B,CAQ5CR,uBAAwBQ,CAAA,CAAmB,wBAAnB,CARoB,CAS5CP,mBAAoBO,CAAA,CAAmB,oBAAnB,CATwB,CAU5Cra,UAAWqa,CAAA,CAAmB,WAAnB,CAViC,CAW5C3b,YAAa2b,CAAA,CAAmB,aAAnB,CAX+B,CAY5Czb,kBAAmByb,CAAA,CAAmB,mBAAnB,CAZyB,CAa5CT,iBAAkBS,CAAA,CAAmB,kBAAnB,CAb0B,CAc5CN,SAAUM,CAAA,CAAmB,UAAnB,CAdkC,CAAjB,CAezB,EAfG,CAiBMG,GAAoBrF,EAAA,CAAiB,CAChDvW,kBAAmB3H,MAAA6b,yBAAA,CACjBxX,gBAAAzE,UADiB;AACW,mBADX,CAD6B,CAGhD+iB,iBAAkB3iB,MAAA6b,yBAAA,CAChBxX,gBAAAzE,UADgB,CACY,kBADZ,CAH8B,CAKhDkjB,SAAU9iB,MAAA6b,yBAAA,CACRxX,gBAAAzE,UADQ,CACoB,UADpB,CALsC,CAAjB,CAO7B,EAxBG,CA0BM4jB,GAAoBtF,EAAA,CAAiB,CAChDvW,kBAAmB3H,MAAA6b,yBAAA,CACjB7V,QAAApG,UADiB,CACG,mBADH,CAD6B,CAGhD+iB,iBAAkB3iB,MAAA6b,yBAAA,CAChB7V,QAAApG,UADgB,CACI,kBADJ,CAH8B,CAKhDkjB,SAAU9iB,MAAA6b,yBAAA,CACR7V,QAAApG,UADQ,CACY,UADZ,CALsC,CAAjB,CAO7B,EAjCS0jB,EAAAA,GAAAA,CAAAA,CAiBAC,EAAAA,GAAAA,CAAAA,EASAC,EAAAA,GAAAA,CAAAA,EASGxa,EAAAA,WAAAA,CAATA,QAAmB,CAAC1F,CAAD,CAAO,CAC/B,MAAOggB,EAAAta,WAAA9I,IAAAH,KAAA,CAAkCuD,CAAlC,CADwB,CAIjBqB;CAAAA,WAAAA,CAATA,QAAmB,CAACrB,CAAD,CAAO,CAC/B,MAAOggB,EAAA3e,WAAAzE,IAAAH,KAAA,CAAkCuD,CAAlC,CADwB,CAIjB+Z,EAAAA,UAAAA,CAATA,QAAkB,CAAC/Z,CAAD,CAAO,CAC9B,MAAOggB,EAAAjG,UAAAnd,IAAAH,KAAA,CAAiCuD,CAAjC,CADuB,CAIhB8Z,EAAAA,gBAAAA,CAATA,QAAwB,CAAC9Z,CAAD,CAAO,CACpC,MAAOggB,EAAAlG,gBAAAld,IAAAH,KAAA,CAAuCuD,CAAvC,CAD6B,CAItB4X,EAAAA,YAAAA,CAATA,QAAoB,CAAC5X,CAAD,CAAO,CAChC,MAAOggB,EAAApI,YAAAhb,IAAAH,KAAA,CAAmCuD,CAAnC,CADyB,CAIlBE,EAAAA,WAAAA,CAATA,QAAmB,CAACF,CAAD,CAAO,CAC/B,MAAOpB,MAAAtC,UAAA0C,MAAAvC,KAAA,CAA2BujB,CAAA9f,WAAAtD,IAAAH,KAAA,CAAkCuD,CAAlC,CAA3B,CADwB,CAIjBof,EAAAA,cAAAA,CAATA,QAAsB,CAACpf,CAAD,CAAO,CAClC,MAAOggB,EAAAZ,cAAAxiB,IAAAH,KAAA,CAAqCuD,CAArC,CAD2B,CAIpBsf,EAAAA,uBAAAA,CAATA,QAA+B,CAACtf,CAAD,CAAO,CAC3C,MAAOggB,EAAAV,uBAAA1iB,IAAAH,KAAA,CAA8CuD,CAA9C,CADoC,CAI7Buf,EAAAA,mBAAAA,CAATA,QAA2B,CAACvf,CAAD,CAAO,CACvC,MAAOggB,EAAAT,mBAAA3iB,IAAAH,KAAA,CAA0CuD,CAA1C,CADgC,CAIzByF;CAAAA,UAAAA,CAATA,QAAkB,CAACzF,CAAD,CAAO,CAC9B,MAAOggB,EAAAva,UAAA7I,IAAAH,KAAA,CAAiCuD,CAAjC,CADuB,CAIhBmE,EAAAA,YAAAA,CAATA,QAAoB,CAACnE,CAAD,CAAO,CAChC,MAAOggB,EAAA7b,YAAAvH,IAAAH,KAAA,CAAmCuD,CAAnC,CADyB,CAIlBwf,EAAAA,SAAAA,CAATA,QAAiB,CAACxf,CAAD,CAAO,CAE7B,OAAQA,CAAAG,SAAR,EACE,KAAKC,IAAAG,uBAAL,CACEif,CAAA,CAAWS,EAAAT,SAAA5iB,IAAAH,KAAA,CAAoCuD,CAApC,CACX,MACF,MAAKI,IAAAC,cAAL,CACEmf,CAAA,CAAWU,EAAAV,SAAA5iB,IAAAH,KAAA,CAAoCuD,CAApC,CACX,MACF,SACEwf,CAAA,CAAWQ,CAAAR,SAAA5iB,IAAAH,KAAA,CAAgCuD,CAAhC,CARf,CAWA,MAAOpB,MAAAtC,UAAA0C,MAAAvC,KAAA,CAA2B+iB,CAA3B,CAbsB,CAgBfnb;CAAAA,kBAAAA,CAATA,QAA0B,CAACrE,CAAD,CAAO,CACtC,OAAQA,CAAAG,SAAR,EACE,KAAKC,IAAAG,uBAAL,CACE,MAAO0f,GAAA5b,kBAAAzH,IAAAH,KAAA,CAA6CuD,CAA7C,CACT,MAAKI,IAAAC,cAAL,CACE,MAAO6f,GAAA7b,kBAAAzH,IAAAH,KAAA,CAA6CuD,CAA7C,CACT,SACE,MAAOggB,EAAA3b,kBAAAzH,IAAAH,KAAA,CAAyCuD,CAAzC,CANX,CADsC,CAWxBqf,EAAAA,iBAAAA,CAATA,QAAyB,CAACrf,CAAD,CAAO,CACrC,OAAQA,CAAAG,SAAR,EACE,KAAKC,IAAAG,uBAAL,CACE,MAAO0f,GAAAZ,iBAAAziB,IAAAH,KAAA,CAA4CuD,CAA5C,CACT,MAAKI,IAAAC,cAAL,CACE,MAAO6f,GAAAb,iBAAAziB,IAAAH,KAAA,CAA4CuD,CAA5C,CACT,SACE,MAAOggB,EAAAX,iBAAAziB,IAAAH,KAAA,CAAwCuD,CAAxC,CANX,CADqC,C,CC7HhC,IAAMmgB,EPHF5F,COGcS,GAAA,CACrBoF,CADqB,CACCC,C,CCE1BC,QAASA,GAAS,CAACtgB,CAAD,CAAO,CACvB,IAAA,CAAOA,CAAAqB,WAAP,CAAA,CACErB,CAAAoC,YAAA,CAAiBpC,CAAAqB,WAAjB,CAFqB;AAMzB,IAAMuZ,GRZKL,CQYYK,EAAvB,CACM2F,GAAWzkB,QAAAiI,eAAAC,mBAAA,CAA2C,OAA3C,CADjB,CAGMwc,GAEJ9jB,MAAA6b,yBAAA,CAAgCnY,IAAA9D,UAAhC,CAAgD,aAAhD,CALF,CAQMmkB,GAAoBD,EAApBC,EAAkDD,EAAA5jB,IARxD,CAUM8jB,GAEFhkB,MAAA6b,yBAAA,CAAgC7V,QAAApG,UAAhC,CAAoD,eAApD,CAZJ,CA+DIqkB,GAAmB,CAErBvB,cAAe,CAEb,IAAAxiB,QAAG,EAAG,CACJ,IAAMse,ETjCIZ,CSiCO,CAAiB,IAAjB,CAEjB,EADIpU,CACJ,CADQgV,CACR,EADoBA,CAAAxV,WACpB,GAASQ,CAAA/F,SAAT,GAAwBC,IAAA8G,aAAxB,GACEhB,CADF,CACM,IADN,CAGA,OAAagD,KAAAA,EAAN,GAAAhD,CAAA,CAAkBA,CAAlB,CDlFAia,CCkFsBf,cAAA,CAAyB,IAAzB,CANzB,CAFO,CAUbviB,aAAc,CAAA,CAVD,CAFM,CAerB6I,WAAY,CAEV,IAAA9I,QAAG,EAAG,CACJ,IAAMse,ET9CIZ,CS8CO,CAAiB,IAAjB,CACXpU,EAAAA,CAAIgV,CAAJhV,EAAgBgV,CAAAxV,WACtB,OAAawD,KAAAA,EAAN,GAAAhD,CAAA,CAAkBA,CAAlB,CD5FAia,CC4FsBza,WAAA,CAAsB,IAAtB,CAHzB,CAFI,CAOV7I,aAAc,CAAA,CAPJ,CAfS;AAyBrB+a,YAAa,CAEX,IAAAhb,QAAG,EAAG,CACJ,IAAMse,ETxDIZ,CSwDO,CAAiB,IAAjB,CACXpU,EAAAA,CAAIgV,CAAJhV,EAAgBgV,CAAAtD,YACtB,OAAa1O,KAAAA,EAAN,GAAAhD,CAAA,CAAkBA,CAAlB,CDtGAia,CCsGsBvI,YAAA,CAAuB,IAAvB,CAHzB,CAFK,CAOX/a,aAAc,CAAA,CAPH,CAzBQ,CAmCrBid,gBAAiB,CAEf,IAAAld,QAAG,EAAG,CACJ,IAAMse,ETlEIZ,CSkEO,CAAiB,IAAjB,CACXpU,EAAAA,CAAIgV,CAAJhV,EAAgBgV,CAAApB,gBACtB,OAAa5Q,KAAAA,EAAN,GAAAhD,CAAA,CAAkBA,CAAlB,CDhHAia,CCgHsBrG,gBAAA,CAA2B,IAA3B,CAHzB,CAFS,CAOfjd,aAAc,CAAA,CAPC,CAnCI,CA8CrB0iB,mBAAoB,CAIlB,IAAA3iB,QAAG,EAAG,CACJ,IAAMse,ET/EIZ,CS+EO,CAAiB,IAAjB,CACjB,IAAIY,CAAJ,EAAyChS,IAAAA,EAAzC,GAAgBgS,CAAAtD,YAAhB,CAAoD,CAElD,IADIjB,CACJ,CADQ,IAAAiB,YACR,CAAOjB,CAAP,EAAYA,CAAAxW,SAAZ,GAA2BC,IAAA8G,aAA3B,CAAA,CACEyP,CAAA,CAAIA,CAAAiB,YAEN,OAAOjB,EAL2C,CAOlD,MDnIKwJ,ECmIEZ,mBAAA,CAA8B,IAA9B,CATL,CAJY,CAgBlB1iB,aAAc,CAAA,CAhBI,CA9CC,CAiErByiB,uBAAwB,CAItB,IAAA1iB,QAAG,EAAG,CACJ,IAAMse;ATlGIZ,CSkGO,CAAiB,IAAjB,CACjB,IAAIY,CAAJ,EAA6ChS,IAAAA,EAA7C,GAAgBgS,CAAApB,gBAAhB,CAAwD,CAEtD,IADInD,CACJ,CADQ,IAAAmD,gBACR,CAAOnD,CAAP,EAAYA,CAAAxW,SAAZ,GAA2BC,IAAA8G,aAA3B,CAAA,CACEyP,CAAA,CAAIA,CAAAmD,gBAEN,OAAOnD,EAL+C,CAOtD,MDtJKwJ,ECsJEb,uBAAA,CAAkC,IAAlC,CATL,CAJgB,CAgBtBziB,aAAc,CAAA,CAhBQ,CAjEH,CA/DvB,CAqJa+jB,GAAoB,CAC/BC,UAAW,CAIT,IAAAjkB,QAAG,EAAG,CACJ,MAAO,KAAAuW,aAAA,CAAkB,OAAlB,CAAP,EAAqC,EADjC,CAJG,CAUT,IAAA7N,QAAG,CAACkC,CAAD,CAAQ,CACT,IAAAkB,aAAA,CAAkB,OAAlB,CAA2BlB,CAA3B,CADS,CAVF,CAaT3K,aAAc,CAAA,CAbL,CADoB,CArJjC,CAyMIikB,GAAkB,CAEpB5gB,WAAY,CAIV,IAAAtD,QAAG,EAAG,CAEJ,GR5MUqe,EQ4MN,CAAkC,IAAlC,CAAJ,CAA6C,CAC3C,IAAMC,ET/KEZ,CS+KS,CAAiB,IAAjB,CACjB,IAAI,CAACY,CAAAhb,WAAL,CAA0B,CACxBgb,CAAAhb,WAAA,CAAsB,EACtB,KAAK,IAAIyW,EAAE,IAAAtV,WAAX,CAA4BsV,CAA5B,CAA+BA,CAA/B,CAAiCA,CAAAiB,YAAjC,CACEsD,CAAAhb,WAAAic,KAAA,CAAyBxF,CAAzB,CAHsB,CAM1B,IAAAzW,EAAagb,CAAAhb,WAR8B,CAA7C,IAUEA,EAAA;ADpOKigB,CCoOQjgB,WAAA,CAAsB,IAAtB,CAEfA,EAAA6gB,KAAA,CAAkBC,QAAQ,CAACC,CAAD,CAAQ,CAChC,MAAO/gB,EAAA,CAAW+gB,CAAX,CADyB,CAGlC,OAAO/gB,EAjBH,CAJI,CAuBVrD,aAAc,CAAA,CAvBJ,CAFQ,CA4BpBqkB,kBAAmB,CAEjB,IAAAtkB,QAAG,EAAG,CACJ,MAAO,KAAA4iB,SAAAhgB,OADH,CAFW,CAKjB3C,aAAc,CAAA,CALG,CA5BC,CAoCpBwE,WAAY,CAEV,IAAAzE,QAAG,EAAG,CACJ,IAAMse,ET7MIZ,CS6MO,CAAiB,IAAjB,CACXpU,EAAAA,CAAIgV,CAAJhV,EAAgBgV,CAAA7Z,WACtB,OAAa6H,KAAAA,EAAN,GAAAhD,CAAA,CAAkBA,CAAlB,CD3PAia,CC2PsB9e,WAAA,CAAsB,IAAtB,CAHzB,CAFI,CAOVxE,aAAc,CAAA,CAPJ,CApCQ,CA8CpBkd,UAAW,CAET,IAAAnd,QAAG,EAAG,CACJ,IAAMse,ETvNIZ,CSuNO,CAAiB,IAAjB,CACXpU,EAAAA,CAAIgV,CAAJhV,EAAgBgV,CAAAnB,UACtB,OAAa7Q,KAAAA,EAAN,GAAAhD,CAAA,CAAkBA,CAAlB,CDrQAia,CCqQsBpG,UAAA,CAAqB,IAArB,CAHzB,CAFG,CAOTld,aAAc,CAAA,CAPL,CA9CS,CAwDpBsH,YAAa,CAIX,IAAAvH,QAAG,EAAG,CACJ,GRjQUqe,EQiQN,CAAkC,IAAlC,CAAJ,CAA6C,CAE3C,IADA,IAAIkG,EAAK,EAAT,CACSvjB,EAAI,CADb,CACgBwjB,EAAK,IAAAlhB,WADrB,CACsCyG,CAAtC,CAA0CA,CAA1C,CAA8Cya,CAAA,CAAGxjB,CAAH,CAA9C,CAAsDA,CAAA,EAAtD,CACM+I,CAAAxG,SAAJ,GAAmBC,IAAAwH,aAAnB;AACEuZ,CAAAhF,KAAA,CAAQxV,CAAAxC,YAAR,CAGJ,OAAOgd,EAAAE,KAAA,CAAQ,EAAR,CAPoC,CAS3C,MDxRKlB,ECwREhc,YAAA,CAAuB,IAAvB,CAVL,CAJK,CAqBX,IAAAmB,QAAG,CAACC,CAAD,CAAO,CACR,GAAoB,WAApB,GAAI,MAAOA,EAAX,EAA4C,IAA5C,GAAmCA,CAAnC,CACEA,CAAA,CAAO,EAET,QAAQ,IAAApF,SAAR,EACE,KAAKC,IAAA8G,aAAL,CACA,KAAK9G,IAAAG,uBAAL,CACE,GAAI,CRxRE0a,EQwRD,CAAkC,IAAlC,CAAL,EAAgDL,EAAhD,CAAgE,CAE9D,IAAMvZ,EAAa,IAAAA,WACnB,EAAIA,CAAJ,EAAkB,IAAA0Y,UAAlB,EACG1Y,CADH,EACiBA,CAAAlB,SADjB,EACwCC,IAAAsH,UADxC,GAEE4Y,EAAA,CAAU,IAAV,CAEFgB,EAAAA,GAAAnd,YAAAmB,IAAA7I,KAAA,CAAqC,IAArC,CAA2C8I,CAA3C,CAP8D,CAAhE,IASE+a,GAAA,CAAU,IAAV,CAEA,EAAkB,CAAlB,CAAI/a,CAAA/F,OAAJ,EAAuB,IAAAW,SAAvB,GAAyCC,IAAA8G,aAAzC,GACE,IAAAjF,YAAA,CAAiBnG,QAAAmO,eAAA,CAAwB1E,CAAxB,CAAjB,CAGJ,MACF,SAEE,IAAAqa,UAAA,CAAiBra,CArBrB,CAJQ,CArBC,CAkDX1I,aAAc,CAAA,CAlDH,CAxDO,CA8GpBwH,kBAAmB,CAIjB,IAAAzH,QAAG,EAAG,CACJ,IAAMse;ATzRIZ,CSyRO,CAAiB,IAAjB,CACjB,IAAIY,CAAJ,EAAwChS,IAAAA,EAAxC,GAAgBgS,CAAA7Z,WAAhB,CAAmD,CAEjD,IADIsV,CACJ,CADQ,IAAAtV,WACR,CAAOsV,CAAP,EAAYA,CAAAxW,SAAZ,GAA2BC,IAAA8G,aAA3B,CAAA,CACEyP,CAAA,CAAIA,CAAAiB,YAEN,OAAOjB,EAL0C,CAOjD,MD7UKwJ,EC6UE9b,kBAAA,CAA6B,IAA7B,CATL,CAJW,CAgBjBxH,aAAc,CAAA,CAhBG,CA9GC,CAiIpBwiB,iBAAkB,CAIhB,IAAAziB,QAAG,EAAG,CACJ,IAAMse,ET5SIZ,CS4SO,CAAiB,IAAjB,CACjB,IAAIY,CAAJ,EAAuChS,IAAAA,EAAvC,GAAgBgS,CAAAnB,UAAhB,CAAkD,CAEhD,IADIpD,CACJ,CADQ,IAAAoD,UACR,CAAOpD,CAAP,EAAYA,CAAAxW,SAAZ,GAA2BC,IAAA8G,aAA3B,CAAA,CACEyP,CAAA,CAAIA,CAAAmD,gBAEN,OAAOnD,EALyC,CAOhD,MDhWKwJ,ECgWEd,iBAAA,CAA4B,IAA5B,CATL,CAJU,CAgBhBxiB,aAAc,CAAA,CAhBE,CAjIE,CAoJpB2iB,SAAU,CAIR,IAAA5iB,QAAG,EAAG,CAGF,IAAA4iB,ER/VQvE,EQ8VN,CAAkC,IAAlC,CAAJ,CACarc,KAAAtC,UAAA6hB,OAAA1hB,KAAA,CAA4B,IAAAyD,WAA5B,CAA6C,QAAQ,CAACyW,CAAD,CAAI,CAClE,MAAQA,EAAAxW,SAAR,GAAuBC,IAAA8G,aAD2C,CAAzD,CADb;AD5WOiZ,CCiXMX,SAAA,CAAoB,IAApB,CAEbA,EAAAuB,KAAA,CAAgBQ,QAAQ,CAACN,CAAD,CAAQ,CAC9B,MAAOzB,EAAA,CAASyB,CAAT,CADuB,CAGhC,OAAOzB,EAZH,CAJE,CAkBR3iB,aAAc,CAAA,CAlBN,CApJU,CA0KpB4I,UAAW,CAIT,IAAA7I,QAAG,EAAG,CACJ,MRnXUqe,GQmXN,CAAkC,IAAlC,CAAJ,CJrRU5V,EIwRD,CAF4B,UAAnBzB,GAAA,IAAA2C,UAAA3C,CACmB,IAADA,QADlBA,CACmC,IAC5C,CAHT,CDjYOuc,CCsYE1a,UAAA,CAAqB,IAArB,CANL,CAJG,CAgBT,IAAAH,QAAG,CAACC,CAAD,CAAO,CACR,IAAM3B,EAA6B,UAAnB,GAAA,IAAA2C,UAAA,CACqB,IAAD3C,QADpB,CACqC,IACrD0c,GAAA,CAAU1c,CAAV,CACA,KAAI4d,EAAgB,IAAAjb,UAEfib,EAAL,EAAwC,UAAxC,GAAsBA,CAAtB,GACEA,CADF,CACkB,KADlB,CAGMC,EAAAA,CAAgBlB,EAAA1d,cAAA,CAAuB2e,CAAvB,CAMtB,KALI5G,EAAJ,CACE0G,CAAAA,GAAA7b,UAAAH,IAAA7I,KAAA,CAAmCglB,CAAnC,CAAkDlc,CAAlD,CADF,CAGEkc,CAAAhc,UAHF,CAG4BF,CAE5B,CAAOkc,CAAApgB,WAAP,CAAA,CACEuC,CAAA3B,YAAA,CAAoBwf,CAAApgB,WAApB,CAhBM,CAhBD,CAmCTxE,aAAc,CAAA,CAnCL,CA1KS,CAzMtB,CA8ZW6kB,GAAqB,CAE9BC,WAAY,CAIV,IAAA/kB,QAAG,EAAG,CACJ,IAAMse,ETlYIZ,CSkYO,CAAiB,IAAjB,CACjB,OAAOY,EAAP,EAAmBA,CAAA5B,GAAnB;AAA0C,IAFtC,CAJI,CAQVzc,aAAc,CAAA,CARJ,CAFkB,CA9ZhC,CA+aW+kB,GAAwB,CAEjCC,cAAe,CAIb,IAAAjlB,QAAG,EAAG,CAraN,IAAA,EADE8jB,EAAJ,EAAqCA,EAAA9jB,IAArC,CACS8jB,EAAA9jB,IAAAH,KAAA,CAAuCX,QAAvC,CADT,CR3BSye,CQ6BGK,EAAL,CAH2B,IAAA,EAG3B,CACE9e,QAAA+lB,cAST,IAAKC,CAAL,EAAgBA,CAAA3hB,SAAhB,CAAA,CAGA,IAAIgb,EAAc,CAAC,CRpBLA,CQoBO,CAwZWnb,IAxZX,CACrB,IAuZgCA,IAvZhC,GAAalE,QAAb,EAGOqf,CAHP,EAuZgCnb,IA9Y1B2V,KATN,GASoBmM,CATpB,EAUOC,CAAAA,SAAAtlB,KAAA,CA6YyBuD,IA7YL2V,KAApB,CAA+BmM,CAA/B,CAVP,CAAA,CAkBA,IADIE,CACJ,CRnCc3G,EQkCG,CAA4ByG,CAA5B,CACjB,CAAOE,CAAP,EAAqBA,CAArB,GAqYgChiB,IArYhC,CAAA,CACE8hB,CACA,CADSE,CAAArM,KACT,CAAAqM,CAAA,CRrCY3G,EQqCC,CAA4ByG,CAA5B,CAEf,EAAA,CAiYgC9hB,IAjYhC,GAAalE,QAAb,CAESkmB,CAAA,CAAa,IAAb,CAAoBF,CAF7B,CAMSE,CAAA,GA2XuBhiB,IA3XvB,CAAsB8hB,CAAtB,CAA+B,IA5BxC,CAAA,IAWI,EAAA,CAAO,IAfX,CAAA,IACE,EAAA,CAAO,IA0ZL,OAAO,EADH,CAJO,CAUb,IAAAxc,QAAG,EAAG,EAVO,CAWbzI,aAAc,CAAA,CAXD,CAFkB,CAyBnColB;QAASA,EAAkB,CAAC7c,CAAD,CAAM8c,CAAN,CAAmBC,CAAnB,CAA0B,CACnD,IAAKviB,IAAIA,CAAT,GAAcsiB,EAAd,CAA2B,CACzB,IAAIE,EAAU1lB,MAAA6b,yBAAA,CAAgCnT,CAAhC,CAAqCxF,CAArC,CACTwiB,EAAL,EAAgBA,CAAAvlB,aAAhB,EACG,CAACulB,CADJ,EACeD,CADf,CAEEzlB,MAAAC,eAAA,CAAsByI,CAAtB,CAA2BxF,CAA3B,CAA8BsiB,CAAA,CAAYtiB,CAAZ,CAA9B,CAFF,CAGWuiB,CAHX,EAIEta,OAAAwa,KAAA,CAAa,kBAAb,CAAiCziB,CAAjC,CAAoC,IAApC,CAA0CwF,CAA1C,CANuB,CADwB,CAa9Ckd,QAASA,GAAc,CAACvC,CAAD,CAAQ,CACpCkC,CAAA,CAAmBlC,CAAnB,CAA0BY,EAA1B,CACAsB,EAAA,CAAmBlC,CAAnB,CAA0Ba,EAA1B,CACAqB,EAAA,CAAmBlC,CAAnB,CAA0Be,EAA1B,CACAmB,EAAA,CAAmBlC,CAAnB,CAA0B6B,EAA1B,CAJoC;AAO/BW,QAASA,GAAwB,EAAQ,CAAPxC,IAAAA,ECxc5ByC,ECqSclmB,UFoKzByjB,EAAApe,UAAA,CAAkBZ,gBAAAzE,UAElB2lB,EAAA,CAAmBlC,CAAnB,CAA0BY,EAA1B,CAA4C,CAAA,CAA5C,CACAsB,EAAA,CAAmBlC,CAAnB,CAA0Be,EAA1B,CAA2C,CAAA,CAA3C,CACAmB,EAAA,CAAmBlC,CAAnB,CAA0B6B,EAA1B,CAAiD,CAAA,CAAjD,CAGAllB,OAAAqF,iBAAA,CAAwBge,CAAxB,CAA+B,CAC7B5f,SAAU,CACRqH,MAAOpH,IAAAG,uBADC,CAER1D,aAAc,CAAA,CAFN,CADmB,CAK7B4lB,SAAU,CACRjb,MAAO,oBADC,CAER3K,aAAc,CAAA,CAFN,CALmB,CAS7B+iB,UAAW,CACTpY,MAAO,IADE,CAET3K,aAAc,CAAA,CAFL,CATkB,CAA/B,CAeA,EACE,WADF,CAEE,cAFF,CAGE,QAHF,CAAAgU,QAAA,CAIU,QAAA,CAAC6R,CAAD,CAAU,CAClBhmB,MAAAC,eAAA,CAAsBojB,CAAtB,CAA6B2C,CAA7B,CAAmC,CACjClb,MAAO0B,IAAAA,EAD0B,CAEjCrM,aAAc,CAAA,CAFmB,CAAnC,CADkB,CAJpB,CAWA,EACE,eADF,CAEE,SAFF,CAGE,aAHF,CAAAgU,QAAA,CAIU,QAAA,CAAC6R,CAAD,CAAU,CAClBhmB,MAAAC,eAAA,CAAsBojB,CAAtB,CAA6B2C,CAA7B,CAAmC,CACjC,IAAA9lB,QAAG,EAAG,CACJ,MAAO,KAAA+Y,KAAA,CAAU+M,CAAV,CADH,CAD2B;AAIjC7lB,aAAc,CAAA,CAJmB,CAAnC,CADkB,CAJpB,CAlC8C,CAiDzC,IAAI8lB,GRzhBApI,CQyhB+BK,EAAA,CACxC,QAAQ,EAAG,EAD6B,CACxB,QAAQ,CAACxS,CAAD,CAAU,CAChC,IAAMgV,ETnfMhD,CSmfD,CAAuBhS,CAAvB,CACNgV,EAAAlD,GAAL,GACEkD,CAAAlD,GAEA,CAFwB,CAAA,CAExB,CADA+H,CAAA,CAAmB7Z,CAAnB,CAA4BuY,EAA5B,CAA8C,CAAA,CAA9C,CACA,CAAAsB,CAAA,CAAmB7Z,CAAnB,CAA4BwY,EAA5B,CAA+C,CAAA,CAA/C,CAHF,CAFgC,CAD7B,CAWIgC,GRpiBArI,CQoiB8BK,EAAA,CACvC,QAAQ,EAAG,EAD4B,CACvB,QAAQ,CAACxS,CAAD,CAAU,CT7fpBgS,CS8fDgD,CAAuBhV,CAAvBgV,CACNnD,GAAL,GACEgI,CAAA,CAAmB7Z,CAAnB,CAA4B0Y,EAA5B,CAA6C,CAAA,CAA7C,CACA,CAAAmB,CAAA,CAAmB7Z,CAAnB,CAA4BsZ,EAA5B,CAAgD,CAAA,CAAhD,CAFF,CAFgC,C,CGliB7B,IAAA,GJAMvB,CIAN,WAwBP0C,SAASA,GAAQ,CAAC7iB,CAAD,CAAOsc,CAAP,CAAkBwG,CAAlB,CAA4B,CH8flCH,EG7fT,CAA6B3iB,CAA7B,CACA8iB,EAAA,CAAWA,CAAX,EAAuB,IACvB,KAAM5H,EZUQd,CYVG,CAAuBpa,CAAvB,CAAjB,CACM+iB,EZSQ3I,CYTQ,CAAuBkC,CAAvB,CADtB,CAEM0G,EAAeF,CAAA,CZQP1I,CYRkB,CAAuB0I,CAAvB,CAAX,CAA8C,IAEnE5H,EAAApB,gBAAA,CAA2BgJ,CAAA,CAAWE,CAAAlJ,gBAAX,CACzBwC,CAAAvC,UAEF,IADIkJ,CACJ,CZUc3I,CYXJ,CAAiBY,CAAApB,gBAAjB,CACV,CACEmJ,CAAArL,YAAA,CAAkB5X,CAIpB,IADIkjB,CACJ,CZKc5I,CYNJ,CAAiBY,CAAAtD,YAAjB,CAAwCkL,CAAxC,CACV,CACEI,CAAApJ,gBAAA,CAAsB9Z,CAGxBkb,EAAAxV,WAAA,CAAsB4W,CAClBwG,EAAJ,CACMA,CADN,GACmBC,CAAA1hB,WADnB,GAEI0hB,CAAA1hB,WAFJ,CAE+BrB,CAF/B,GAKE+iB,CAAAhJ,UACA,CAD0B/Z,CAC1B,CAAK+iB,CAAA1hB,WAAL,GACE0hB,CAAA1hB,WADF,CAC6BrB,CAD7B,CANF,CAWA+iB,EAAA7iB,WAAA,CAA2B,IA/BgB;AA8DfijB,QAAA,GAAQ,CAACnjB,CAAD,CAAOke,CAAP,CAAc,CAClD,IAAMhD,EZlDQd,CYkDG,CAAuBpa,CAAvB,CACjB,IAA4BkJ,IAAAA,EAA5B,GAAIgS,CAAA7Z,WAAJ,CAKE,IAJM4F,CAIGrJ,CAJEsgB,CAIFtgB,EAJWsC,EAAA,CAAWF,CAAX,CAIXpC,CAHTsd,CAAA7Z,WAGSzD,CAHaqJ,CAAA,CAAG,CAAH,CAGbrJ,EAHsB,IAGtBA,CAFTsd,CAAAnB,UAESnc,CAFYqJ,CAAA,CAAGA,CAAAzH,OAAH,CAAa,CAAb,CAEZ5B,EAF+B,IAE/BA,CHocFglB,EGrcP,CAA4B5iB,CAA5B,CACSpC,CAAAA,CAAAA,CAAE,CAAX,CAAcA,CAAd,CAAgBqJ,CAAAzH,OAAhB,CAA2B5B,CAAA,EAA3B,CAAgC,CAC9B,IAAM+Y,EAAI1P,CAAA,CAAGrJ,CAAH,CAAV,CACMwf,EZ1DIhD,CY0DC,CAAuBzD,CAAvB,CACXyG,EAAA1X,WAAA,CAAgB1F,CAChBod,EAAAxF,YAAA,CAAiB3Q,CAAA,CAAGrJ,CAAH,CAAK,CAAL,CAAjB,EAA4B,IAC5Bwf,EAAAtD,gBAAA,CAAqB7S,CAAA,CAAGrJ,CAAH,CAAK,CAAL,CAArB,EAAgC,IHob3B+kB,GGnbL,CAA6BhM,CAA7B,CAN8B,CAPgB,C,CCpF7C,IAAA,GLFMwJ,CKEN,WAYAlf;QAASA,GAAY,CAACyK,CAAD,CAAS1L,CAAT,CAAe8iB,CAAf,CAAyB,CACnD,GAAI9iB,CAAJ,GAAa0L,CAAb,CACE,KAAM7F,MAAA,CAAM,uFAAN,CAAN,CAEF,GAAIid,CAAJ,CAAc,CACZ,IAAMM,EbyBM9I,CazBI,CAAiBwI,CAAjB,CACVljB,EAAAA,CAAIwjB,CAAJxjB,EAAewjB,CAAA1d,WACrB,IAAWwD,IAAAA,EAAX,GAAKtJ,CAAL,EAAwBA,CAAxB,GAA8B8L,CAA9B,EACSxC,IAAAA,EADT,GACGtJ,CADH,EACsB8F,EAAA,CAAWod,CAAX,CADtB,GAC+CpX,CAD/C,CAEE,KAAM7F,MAAA,CAAM,+HAAN,CAAN,CALU,CASd,GAAIid,CAAJ,GAAiB9iB,CAAjB,CACE,MAAOA,EAGLA,EAAA0F,WAAJ,EAGEtD,EAAA,CAAYpC,CAAA0F,WAAZ,CAA6B1F,CAA7B,CAGF,KACIqjB,CADJ,CAEIC,CACJ,IAAI,CAACtjB,CAAA,mBAAL,CAAiC,CAElB,GAAAqjB,CAAA,CADbA,CACa,CZnBDhI,EYkBA,CAA4B3P,CAA5B,CACC,CAAA,CA2Cf,IAAI6X,CACmB,OAAvB,GA5C4BvjB,CA4CxBuG,UAAJ,CACEgd,CADF,CACU,CA7CkBvjB,CA6ClB,CADV,CA5C4BA,CA8CjB4B,iBAFX;CAGE2hB,CAHF,CA5C4BvjB,CA+ClB4B,iBAAA,CAAsB,MAAtB,CAHV,CAME,EAAA,CADE2hB,CAAJ,EAAaA,CAAA/jB,OAAb,CACS+jB,CADT,CAPgC,IAAA,EA1CjB,CACTD,CAAJ,GACED,CHkTF,CGlTEA,CHkTF,CGlTsBC,CHkTtB,CGlTsBA,CHkTtB,CADAE,CANAC,EAOA,CADAD,CANqBC,EAOrB,EAP2C,EAO3C,CADAD,CALAE,EAMA,CADAF,CALiBE,EAMjB,EANmC,EAMnC,CADAF,CAJAG,EAKA,CADAH,CAJgBG,EAKhB,EALiC,EAKjC,CAAA,CAAAF,EAAAtH,KAAA,MAAA,CAAA,CAAAsH,EAAA,CAAA,EAAA,OAAA,CAA2BF,CI9U7B,WAAwB,MAAxB,CJ8U6BA,CI9U7B,CAGSK,EAAA,CAA0BC,EAAA,CJ2UNN,CI3UM,CAA1B,CJ2UP,CAAA,CGnTA,CAH+B,CAQjC,CAAyB,MAAzB,GAAI7X,CAAAnF,UAAJ,EAAmC+c,CAAnC,IACED,CADF,CACcA,CADd,EZzBchI,EY0Ba,CAA4B3P,CAA5B,CAD3B,GAGIoY,EAAA,CAAAT,CAAA,CAGJ,IZxCcpI,EYwCV,CAAkCvP,CAAlC,CAAJ,CAA+C,CACAoX,CAAAA,CAAAA,CJ0etCF,GG9hBT,CCoDuClX,CDpDvC,CACMqX,EAAAA,CZiCQ3I,CYjCQ,CCmDiB1O,CDnDjB,CACWxC,KAAAA,EAAjC,GAAI6Z,CAAA1hB,WAAJ,GACE0hB,CAAA7iB,WADF,CAC6B,IAD7B,CAIA,IC8CiCF,CD9C7BG,SAAJ,GAAsBC,IAAAG,uBAAtB,CAAmD,CAC7C0G,CAAAA,CC6C2BjH,CD7CtBE,WACT,KAAStC,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkBqJ,CAAAzH,OAAlB,CAA6B5B,CAAA,EAA7B,CACEilB,EAAA,CAAS5b,CAAA,CAAGrJ,CAAH,CAAT,CC2CmC8N,CD3CnC,CAA2BoX,CAA3B,CAGI5H,EAAAA,CZsBMd,CYtBK,CCwCcpa,CDxCd,CACb+jB,EAAAA,CAAmC7a,IAAAA,EAAzB,GAACgS,CAAA7Z,WAAD,CAAsC,IAAtC,CAA6C6H,IAAAA,EAC3DgS,EAAA7Z,WAAA,CAAsB6Z,CAAAnB,UAAtB,CAA2CgK,CAC3C7I,EAAAhb,WAAA,CAAsB6jB,CAT2B,CAAnD,IAWElB,GAAA,CCmC+B7iB,CDnC/B,CCmCqC0L,CDnCrC,CAA0BoX,CAA1B,CCsCMkB,EAAAA,CbdM1J,CacO,CAAiB5O,CAAjB,CACnB,IAAIuY,EAAA,CAAsBvY,CAAtB,CAAJ,CAAmC,CACjCoY,EAAA,CAAAE,CAAAzK,KAAA,CACA;IAAA2K,EAAsB,CAAA,CAFW,CAAnC,IAKWF,EAAAzK,KAAJ,GACL2K,CADK,CACiB,CAAA,CADjB,CAVsC,CAc1CA,CAAL,GAEM5H,CAGJ,CZtDYnB,CYmDI,CAAkBzP,CAAlB,CAAA,CACYA,CAADiK,KADX,CAC2BjK,CAE3C,CAAIoX,CAAJ,EACEA,CACA,CADWqB,EAAA,CAAkBrB,CAAlB,CACX,CAAAsB,CAAAnjB,aAAAxE,KAAA,CAAgC6f,CAAhC,CAA2Ctc,CAA3C,CAAiD8iB,CAAjD,CAFF,EAIEsB,CAAAniB,YAAAxF,KAAA,CAA+B6f,CAA/B,CAA0Ctc,CAA1C,CATJ,CAYAqkB,GAAA,CAAiB3Y,CAAjB,CAAyB1L,CAAzB,CACA,OAAOA,EAnE4C;AAyF9CoC,QAASA,GAAW,CAACsJ,CAAD,CAAS1L,CAAT,CAAe,CACxC,GAAIA,CAAA0F,WAAJ,GAAwBgG,CAAxB,CACE,KAAM7F,MAAA,CAAM,sDAAN,CACJ7F,CADI,CAAN,CAGF,IACIqjB,EZtFUhI,EYsFE,CAA4Brb,CAA5B,CADhB,CAGMgkB,EbnEQ1J,CamEK,CAAiB5O,CAAjB,CACnB,IZlGcuP,EYkGV,CAAkCvP,CAAlC,CAAJ,CAA+C,CDrD/C,IAAMwP,EZtBQd,CYsBG,CCsDepa,CDtDf,CAAjB,CACM+iB,EZvBQ3I,CYuBQ,CCqDgB1O,CDrDhB,CCqDU1L,EDpDhC,GAAa+iB,CAAA1hB,WAAb,GACE0hB,CAAA1hB,WADF,CAC6B6Z,CAAAtD,YAD7B,CCoDgC5X,EDjDhC,GAAa+iB,CAAAhJ,UAAb,GACEgJ,CAAAhJ,UADF,CAC4BmB,CAAApB,gBAD5B,CAGA,KAAIla,EAAIsb,CAAApB,gBAAR,CACInD,EAAIuE,CAAAtD,YACJhY,EAAJ,GZhCcwa,CYiCZ,CAAuBxa,CAAvB,CAAAgY,YADF,CAC0CjB,CAD1C,CAGIA,EAAJ,GZnCcyD,CYoCZ,CAAuBzD,CAAvB,CAAAmD,gBADF,CAC8Cla,CAD9C,CAMAsb,EAAAxV,WAAA,CAAsBwV,CAAApB,gBAAtB,CACAoB,CAAAtD,YADA,CACuB1O,IAAAA,EACUA,KAAAA,EAAjC,GAAI6Z,CAAA7iB,WAAJ,GAEE6iB,CAAA7iB,WAFF,CAE6B,IAF7B,CCkCE,IAAI+jB,EAAA,CAAsBvY,CAAtB,CAAJ,CAAmC,CACjCoY,EAAA,CAAAE,CAAAzK,KAAA,CACA,KAAA+K,EAAsB,CAAA,CAFW,CAFU,CAO/CC,EAAA,CAAqBvkB,CAArB,CAEA,IAAIqjB,CAAJ,CAAe,CAEb,CADImB,CACJ,CADwB9Y,CACxB,EADuD,MACvD,GADkCA,CAAAnF,UAClC;CACE+d,CADF,CACwB,CAAA,CADxB,CH+SA,IG5SyBjB,CH4SpBK,EAAL,CAAA,CAGAe,EAAA,CG/SyBpB,CH+SzB,CAEMtF,EAAAA,CGjTmBsF,CHiTbM,EACZ,KAAShN,EAAT,GAAcoH,EAAd,CAEE,IADIwF,CACK3lB,CADGmgB,CAAA,CAAIpH,EAAJ,CACH/Y,CAAAA,CAAAA,CAAE,CAAX,CAAcA,CAAd,CAAkB2lB,CAAA/jB,OAAlB,CAAgC5B,CAAA,EAAhC,CAAqC,CACnC,IAAI8mB,EAAOnB,CAAA,CAAM3lB,CAAN,CACX,ITzUQye,ESyUJ,CGtTiDrc,CHsTjD,CAA0B0kB,CAA1B,CAAJ,CAAqC,CACnCnB,CAAAoB,OAAA,CAAa/mB,CAAb,CAAgB,CAAhB,CACMiL,KAAAA,EGxTawa,CHwTTK,EAAA7O,QAAA,CAAuB6P,CAAvB,CACD,EAAT,EAAI7b,CAAJ,EGzTmBwa,CH0TjBK,EAAAiB,OAAA,CAAsB9b,CAAtB,CAAyB,CAAzB,CAEFjL,EAAA,EAiCA+J,EAAAA,CV/aM2S,CU+aC,CAhCoBoK,CAgCpB,CAEb,IADIjlB,CACJ,CADSkI,CAAA8R,EACT,CACE,IAAK,IAAI7b,EAAE,CAAX,CAAcA,CAAd,CAAgB6B,CAAAD,OAAhB,CAA2B5B,CAAA,EAA3B,CAAgC,CAC9B,IAAIoC,EAAOP,CAAA,CAAG7B,CAAH,CAAX,CACI8N,EAAShG,EAAA,CAAW1F,CAAX,CACT0L,EAAJ,EACEtJ,CAAAA,YAAA3F,KAAA,CAAiBiP,CAAjB,CAAyB1L,CAAzB,CAJ4B,CAQlC2H,CAAA8R,EAAA,CAAsB,EACtB9R,EAAAkS,cAAA,CAAqB,EA3Cf+K,EAAA,CAAY,CAAA,CARuB,CAFF,CAcvC,IAAA,GAAOA,CAtBP,CAAA,IAD+B,GAAA,CAAA,IAAA,EG1S/B,EAAIC,EAAJ,EAA8BL,CAA9B,GACEV,EAAA,CAAAT,CAAA,CAPW,CAUViB,CAAL,GAEMhI,CAOJ,CZzHYnB,CYkHI,CAAkBzP,CAAlB,CAAA,CACYA,CAADiK,KADX,CAEdjK,CAKF,EAAM6N,CAAAyK,CAAAzK,KAAN,EAA4C,MAA5C,GAAyBvZ,CAAAuG,UAAzB,EACG+V,CADH,GACiB5W,EAAA,CAAW1F,CAAX,CADjB,GAEEokB,CAAAhiB,YAAA3F,KAAA,CAA+B6f,CAA/B,CAA0Ctc,CAA1C,CAXJ,CAcAqkB,GAAA,CAAiB3Y,CAAjB,CAAyB,IAAzB,CAA+B1L,CAA/B,CACA,OAAOA,EA3CiC;AA8C1CukB,QAASA,GAAoB,CAACvkB,CAAD,CAAO,CAelC,IAAMkb,EbxHQZ,CawHG,CAbMta,CAaN,CAbjB,IAcekb,CAdf,EAcuDhS,IAAAA,EAdvD,GAc2BgS,CAAAlB,EAd3B,CAA8B,CACxB/S,CAAAA,CAAKjH,CAAAE,WACT,KAF4B,IAEnBtC,EAAE,CAFiB,CAEdsI,EAAEe,CAAAzH,OAFY,CAEDmX,CAA3B,CAA+B/Y,CAA/B,CAAiCsI,CAAjC,GAAwCyQ,CAAxC,CAA0C1P,CAAA,CAAGrJ,CAAH,CAA1C,EAAkDA,CAAA,EAAlD,CACE2mB,EAAA,CAAqB5N,CAArB,CAH0B,CAO9B,GADMuE,CACN,CblHcZ,CaiHG,CAAiBta,CAAjB,CACjB,CACEkb,CAAAlB,EAAA,CAA0B9Q,IAAAA,EAVM,CA0BpCib,QAASA,GAAiB,CAACnkB,CAAD,CAAO,CAC/B,IAAI8kB,EAAW9kB,CACXA,EAAJ,EAA+B,MAA/B,GAAYA,CAAAuG,UAAZ,GAGEue,CAHF,CAGa,CADLC,CACK,EAFL7J,CAEK,CbxICZ,CasIK,CAAiBta,CAAjB,CAEN,GADmBkb,CAAAzB,EACnB,GAAasL,CAAAvlB,OAAb,CAAgCulB,CAAA,CAAU,CAAV,CAAhC,CACTZ,EAAA,CAAkBnkB,CAAA4X,YAAlB,CAJJ,CAMA,OAAOkN,EARwB,CAWjCb,QAASA,GAAqB,CAACjkB,CAAD,CAAO,CAGnC,OADIuZ,CACJ,EAFM2B,CAEN,CbjJcZ,Ca+IG,CAAiBta,CAAjB,CAEjB,GADuBkb,CAAA3B,KACvB,GAAgByL,EAAA,CAAAzL,CAAA,CAHmB;AAarC0L,QAASA,GAAyB,CAACjlB,CAAD,CAAOuH,CAAP,CAAa,CAC7C,GAAa,MAAb,GAAIA,CAAJ,CACQmE,CACN,CADe1L,CAAA0F,WACf,CAAIue,EAAA,CAAsBvY,CAAtB,CAAJ,EACEoY,EAAA,Cb/JUxJ,Ca+JV,CAAiB5O,CAAjB,CAAA6N,KAAA,CAHJ,KAKO,IAAuB,MAAvB,GAAIvZ,CAAAuG,UAAJ,EAA0C,MAA1C,GAAiCgB,CAAjC,GACDgS,CADC,CZtLO8B,EYuLD,CAA4Brb,CAA5B,CADN,EAEK,CHqPV,GGpPEuZ,CHoPGmK,EAAL,CAAA,CAGA,IAAMwB,EGvPiBllB,CHuPPmlB,GAAhB,CACM5d,EAAO6d,EAAA,CGxPUplB,CHwPV,CACb,IAAIuH,CAAJ,GAAa2d,CAAb,CAAA,CAII3B,CAAAA,CG7PFhK,CH6PUoK,EAAA,CAAcuB,CAAd,CACZ,KAAMtnB,EAAI2lB,CAAA1O,QAAA,CG9Pa7U,CH8Pb,CACD,EAAT,EAAIpC,CAAJ,EACE2lB,CAAAoB,OAAA,CAAa/mB,CAAb,CAAgB,CAAhB,CAGE0U,EAAAA,CGnQFiH,CHmQSoK,EAAA,CAAcpc,CAAd,CAAP+K,GGnQFiH,CHmQiCoK,EAAA,CAAcpc,CAAd,CAA/B+K,CAAqD,EAArDA,CACJA,EAAA6J,KAAA,CGpQuBnc,CHoQvB,CACkB,EAAlB,CAAIsS,CAAA9S,OAAJ,GGrQE+Z,CHsQAoK,EAAA,CAAcpc,CAAd,CADF,CACwB8d,EAAA,CAAgB/S,CAAhB,CADxB,CAZA,CALA,CGnPEwR,EAAA,CAAAvK,CAAA,CAFQ,CARiC,CAoB/C8K,QAASA,GAAgB,CAACrkB,CAAD,CAAOslB,CAAP,CAAkBC,CAAlB,CAA+B,CAGtD,GADMvb,CACN,EAFMkR,CAEN,CblLcZ,CagLG,CAAiBta,CAAjB,CAEjB,GAD6Bkb,CAAAlR,EAC7B,CACMsb,CAMJ,EALEtb,CAAAkO,WAAAiE,KAAA,CAAyBmJ,CAAzB,CAKF,CAHIC,CAGJ,EAFEvb,CAAA6S,aAAAV,KAAA,CAA2BoJ,CAA3B,CAEF,CAAAvI,EAAA,CAAAhT,CAAA,CAVoD;AAkBjD0Q,QAASA,GAAW,CAAC1a,CAAD,CAAgB,CACzC,GAAKA,CAAL,EAAcA,CAAAG,SAAd,CAAA,CAGA,IAAM+a,Eb5MQd,Ca4MG,CAAuBpa,CAAvB,CAAjB,CACIuZ,EAAO2B,CAAAlB,EACE9Q,KAAAA,EAAb,GAAIqQ,CAAJ,GZhOc4B,CYiOR,CAAkBnb,CAAlB,CAAJ,EACEuZ,CACA,CADOvZ,CACP,CAAAkb,CAAAlB,EAAA,CAA0BT,CAF5B,GAKEA,CAMA,CANO,CADH7N,CACG,CADM1L,CAAA0F,WACN,EAASgV,EAAA,CAAYhP,CAAZ,CAAT,CAA+B1L,CAMtC,CAAIokB,CAAA/H,SAAA5f,KAAA,CAA4BX,QAAA+I,gBAA5B,CAAsD7E,CAAtD,CAAJ,GACEkb,CAAAlB,EADF,CAC4BT,CAD5B,CAXF,CADF,CAkBA,OAAOA,EAvBP,CADyC,CAmCpCiM,QAASA,GAAK,CAACxlB,CAAD,CAAOylB,CAAP,CAAgBC,CAAhB,CAAwB,CAC3C,IAAIpT,EAAO,EACXqT,GAAA,CAAc3lB,CAAAE,WAAd,CAA+BulB,CAA/B,CACEC,CADF,CACUpT,CADV,CAEA,OAAOA,EAJoC,CAO7CqT,QAASA,GAAa,CAACC,CAAD,CAAWH,CAAX,CAAoBC,CAApB,CAA4BpT,CAA5B,CAAkC,CACtD,IADsD,IAC7C1U,EAAE,CAD2C,CACxCsI,EAAE0f,CAAApmB,OADsC,CACrBmH,CAAjC,CAAqC/I,CAArC,CAAuCsI,CAAvC,GAA8CS,CAA9C,CAAgDif,CAAA,CAAShoB,CAAT,CAAhD,EAA8DA,CAAA,EAA9D,CAAmE,CAC7D,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,SAAA,GAAA,IAAA,aAAA,CAAA,CACA,CAAA,CAAA,CAAA,KAAA,EAAA,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,CAAA,CAOFioB,EAASJ,CAAA,CAAQzlB,CAAR,CACT6lB,EAAJ,EACEvT,CAAA6J,KAAA,CAAUnc,CAAV,CAEE0lB,EAAJ,EAAcA,CAAA,CAAOG,CAAP,CAAd,CACE,CADF,CACSA,CADT,EAGAF,EAAA,CAAc3lB,CAAAE,WAAd,CAA+BulB,CAA/B,CACEC,CADF,CACUpT,CADV,CARiD,CAAA,CAAA,CAAA,IAAA,EAKjD,CAZM,CAAJ,GAAI,CAAJ,CAEE,KAH+D,CADb,CA4BxD,IAAIwT,GAAc,IAEXpd;QAASA,GAAY,CAAC1I,CAAD,CAAOsH,CAAP,CAAaE,CAAb,CAAoB,CACzCse,EAAL,GACEA,EADF,CACgB5oB,MAAA,SADhB,EACsCA,MAAA,SAAA,YADtC,CAGI4oB,GAAJ,EAA4B,OAA5B,GAAmBxe,CAAnB,CACEwe,EAAA,gBAAA,CAA+B9lB,CAA/B,CAAqCwH,CAArC,CADF,EAGE4c,CAAA1b,aAAAjM,KAAA,CAAgCuD,CAAhC,CAAsCsH,CAAtC,CAA4CE,CAA5C,CACA,CAAAyd,EAAA,CAA0BjlB,CAA1B,CAAgCsH,CAAhC,CAJF,CAJ8C,CAsCzCvE,QAASA,GAAU,CAAC/C,CAAD,CAAOyB,CAAP,CAAa,CACrC,GAAIzB,CAAA4F,cAAJ,GAA2B9J,QAA3B,CACE,MAAOsoB,EAAArhB,WAAAtG,KAAA,CAA8BX,QAA9B,CAAwCkE,CAAxC,CAA8CyB,CAA9C,CAET,KAAIkV,EAAIyN,CAAArhB,WAAAtG,KAAA,CAA8BX,QAA9B,CAAwCkE,CAAxC,CAA8C,CAAA,CAA9C,CACR,IAAIyB,CAAJ,CAAU,CACJwF,CAAAA,CAAKjH,CAAAE,WACAtC,EAAAA,CAAE,CAAX,KAAK,IAASmoB,CAAd,CAAkBnoB,CAAlB,CAAsBqJ,CAAAzH,OAAtB,CAAiC5B,CAAA,EAAjC,CACEmoB,CACA,CADKhjB,EAAA,CAAWkE,CAAA,CAAGrJ,CAAH,CAAX,CAAkB,CAAA,CAAlB,CACL,CAAA+Y,CAAA1U,YAAA,CAAc8jB,CAAd,CAJM,CAOV,MAAOpP,EAZ8B,C,CEvVvC,IAAoBqP,GAAoB,iBAApBA,CAAsCC,IAAAC,IAAA,EAA1D,CAGIC,GAAiB,CACnB,KAAQ,CAAA,CADW,CAEnB,MAAS,CAAA,CAFU,CAGnB,QAAW,CAAA,CAHQ,CAInB,SAAY,CAAA,CAJO,CAKnB,MAAS,CAAA,CALU,CAMnB,SAAY,CAAA,CANO,CAOnB,UAAa,CAAA,CAPM,CAQnB,WAAc,CAAA,CARK,CASnB,WAAc,CAAA,CATK,CAUnB,UAAa,CAAA,CAVM,CAWnB,SAAY,CAAA,CAXO,CAYnB,UAAa,CAAA,CAZM,CAanB,QAAW,CAAA,CAbQ,CAcnB,MAAS,CAAA,CAdU,CAenB,YAAe,CAAA,CAfI,CAgBnB,MAAS,CAAA,CAhBU,CAiBnB,QAAW,CAAA,CAjBQ,CAkBnB,MAAS,CAAA,CAlBU,CAmBnB,iBAAoB,CAAA,CAnBD,CAoBnB,kBAAqB,CAAA,CApBF,CAqBnB,eAAkB,CAAA,CArBC,CAsBnB,WAAc,CAAA,CAtBK,CAuBnB,SAAY,CAAA,CAvBO,CAwBnB,UAAa,CAAA,CAxBM,CAyBnB,YAAe,CAAA,CAzBI,CA0BnB,YAAe,CAAA,CA1BI,CA2BnB,aAAgB,CAAA,CA3BG,CA4BnB,YAAe,CAAA,CA5BI,CA6BnB,YAAe,CAAA,CA7BI,CA8BnB,UAAa,CAAA,CA9BM,CA+BnB,cAAiB,CAAA,CA/BE,CAgCnB,WAAc,CAAA,CAhCK,CAiCnB,aAAgB,CAAA,CAjCG,CAkCnB,kBAAqB,CAAA,CAlCF,CAmCnB,mBAAsB,CAAA,CAnCH;AAoCnB,UAAa,CAAA,CApCM,CAqCnB,KAAQ,CAAA,CArCW,CAsCnB,UAAa,CAAA,CAtCM,CAuCnB,UAAa,CAAA,CAvCM,CAwCnB,SAAY,CAAA,CAxCO,CAyCnB,KAAQ,CAAA,CAzCW,CA0CnB,QAAW,CAAA,CA1CQ,CA2CnB,YAAe,CAAA,CA3CI,CA4CnB,WAAc,CAAA,CA5CK,CA6CnB,YAAe,CAAA,CA7CI,CA8CnB,SAAY,CAAA,CA9CO,CAiDrBC,SAASA,GAAY,CAACC,CAAD,CAAYvB,CAAZ,CAAsB,CACzC,IAAIwB,EAAe,EAAnB,CACIC,EAAUF,CAEd,KADIG,CACJ,CADgBH,CAAA,GAAcnpB,MAAd,CAAuBA,MAAvB,CAAgCmpB,CAAA3L,YAAA,EAChD,CAAO6L,CAAP,CAAA,CACED,CAAAnK,KAAA,CAAkBoK,CAAlB,CAEE,CAAAA,CAAA,CADEA,CAAA3M,aAAJ,CACY2M,CAAA3M,aADZ,CAEW2M,CAAApmB,SAAJ,GAAyBC,IAAAG,uBAAzB,EAAwDgmB,CAAA5Q,KAAxD,GAAyEmP,CAAzE,EAAqFyB,CAArF,GAAiGC,CAAjG,EACKD,CAAA5Q,KADL,CAGK4Q,CAAA7gB,WAIV4gB,EAAA,CAAaA,CAAA9mB,OAAb,CAAmC,CAAnC,CAAJ,GAA8C1D,QAA9C,EACEwqB,CAAAnK,KAAA,CAAkBjf,MAAlB,CAEF,OAAOopB,EAlBkC;AAqB3CG,QAASA,GAAQ,CAACtlB,CAAD,CAAUulB,CAAV,CAAgB,CAC/B,GAAI,Cd3DUvL,Cc2Dd,CACE,MAAOha,EAILwlB,EAAAA,CAAcP,EAAA,CAAajlB,CAAb,CAAsB,CAAA,CAAtB,CAElB,KAR+B,IAQtBvD,EAAE,CARoB,CAQjBgpB,CARiB,CAQPC,CARO,CAQGtN,CARH,CAQSuN,CAAxC,CAAiDlpB,CAAjD,CADS8oB,CAC4ClnB,OAArD,CAAgE5B,CAAA,EAAhE,CAOE,GANAgpB,CAMI,CARGF,CAEI,CAAG9oB,CAAH,CAMP,CALJ2b,CAKI,CALGqN,CAAA,GAAa1pB,MAAb,CAAsBA,MAAtB,CAA+B0pB,CAAAlM,YAAA,EAKlC,CAJAnB,CAIA,GAJSsN,CAIT,GAHFC,CACA,CADUH,CAAA9R,QAAA,CAAoB0E,CAApB,CACV,CAAAsN,CAAA,CAAWtN,CAET,EAAA,CdzEQ4B,CcyEP,CAAkB5B,CAAlB,CAAD,EAAuC,EAAvC,CAA4BuN,CAAhC,CACE,MAAOF,EAhBoB;AAqBjC,IAAIG,GAAa,CAKXjC,YAAW,EAAA,CAEU,CAAA,CAAvB,GAAI,IAAAkC,UAAJ,EAAoD9d,IAAAA,EAApD,GAAgC,IAAA+d,GAAhC,GACE,IAAAA,GADF,CACoBd,EAAA,CAAe,IAAAvY,KAAf,CADpB,CAGA,OAAO,KAAAqZ,GAAP,EAA0B,CAAA,CALb,CALA,CAgBf,aAAAX,QAAY,EAAG,CACR,IAAAY,EAAL,GACE,IAAAA,EADF,CACwBd,EAAA,CAAa,IAAA,SAAb,CAA+B,IAAAtB,SAA/B,CADxB,CAGA,OAAO,KAAAoC,EAJM,CAhBA,CA0BX/nB,UAAS,EAAA,CACX,MAAOsnB,GAAA,CAAS,IAAAU,cAAT,CAA6B,IAAAb,aAAA,EAA7B,CADI,CA1BE,CAkCX3nB,iBAAgB,EAAA,CAClB,GAAI,CAAC,IAAAyoB,GAAL,CACE,MAAO,KAEJ,KAAAC,EAAL,GACE,IAAAA,EADF,CACqCjB,EAAA,CAAa,IAAAgB,GAAb,CAAmC,CAAA,CAAnC,CADrC,CAIA,OAAOX,GAAA,CAAS,IAAAU,cAAT,CAA6B,IAAAE,EAA7B,CARW,CAlCL,CA+Cf,gBAAAC,QAAe,EAAG,CAChBjrB,KAAAC,UAAAgrB,gBAAA7qB,KAAA,CAAqC,IAArC,CACA,KAAA8qB,EAAA,CAA4B,CAAA,CAFZ,CA/CH,CAsDf,yBAAAC,QAAwB,EAAG,CACzBnrB,KAAAC,UAAAkrB,yBAAA/qB,KAAA,CAA8C,IAA9C,CAEA;IAAA8qB,EAAA,CADA,IAAAE,EACA,CADqC,CAAA,CAFZ,CAtDZ,CA8DjBC,SAASA,GAAiB,CAACC,CAAD,CAAO,CAGnBC,QAAA,EAAQ,CAACha,CAAD,CAAOia,CAAP,CAAgB,CAC9B1X,CAAAA,CAAQ,IAAIwX,CAAJ,CAAS/Z,CAAT,CAAeia,CAAf,CACZ1X,EAAA8W,GAAA,CAAmBY,CAAnB,EAA8B,CAAA,CAAQA,CAAA,SACtC,OAAO1X,EAH2B,CdpGtB4L,Ec0Gd,CAAY6L,CAAZ,CAAmBD,CAAnB,CACAC,EAAAtrB,UAAA,CAAkBqrB,CAAArrB,UAClB,OAAOsrB,EAXwB,CAcjC,IAAIE,GAA8B,CAChC,MAAS,CAAA,CADuB,CAEhC,KAAQ,CAAA,CAFwB,CAWlCC,SAASA,GAAa,CAAC5X,CAAD,CAAQ,CAC5B,MAAOA,EAAA,SAAP,GAA6BA,CAAAhR,OAA7B,EAA6CgR,CAAAiX,GAA7C,GAAuEjX,CAAAxR,cAD3C,CAU9BqpB,QAASA,GAAY,CAAC7X,CAAD,CAAQnQ,CAAR,CAAcioB,CAAd,CAAqB,CAGxC,GAFIC,CAEJ,CAFSloB,CAAAmoB,WAET,EAF4BnoB,CAAAmoB,WAAA,CAAgBhY,CAAAvC,KAAhB,CAE5B,EADE5N,CAAAmoB,WAAA,CAAgBhY,CAAAvC,KAAhB,CAAA,CAA4Bqa,CAA5B,CACF,CACE,IADM,IACGrqB,EAAI,CADP,CACUwqB,CAAhB,EAAqBA,CAArB,CAA0BF,CAAA,CAAGtqB,CAAH,CAA1B,IACM,CAAAmqB,EAAA,CAAc5X,CAAd,CADN,EAC8BA,CAAAhR,OAD9B,GAC+CgR,CAAAxR,cAD/C,IAIEypB,CAAA3rB,KAAA,CAAQuD,CAAR,CAAcmQ,CAAd,CACIsX,CAAAA,CAAAtX,CAAAsX,EALN,EAAkC7pB,CAAA,EAAlC,EAJsC;AAgB1CyqB,QAASA,GAAwB,CAACxsB,CAAD,CAAI,CACnC,IAAI6qB,EAAO7qB,CAAAyqB,aAAA,EAGX5pB,OAAAC,eAAA,CAAsBd,CAAtB,CAAyB,eAAzB,CAA0C,CACxCe,IAAKA,QAAQ,EAAG,CACd,MAAOoD,EADO,CADwB,CAIxCnD,aAAc,CAAA,CAJ0B,CAA1C,CAMA,KAAK,IAAIe,EAAI8oB,CAAAlnB,OAAJ5B,CAAkB,CAA3B,CAAmC,CAAnC,EAA8BA,CAA9B,CAAsCA,CAAA,EAAtC,CAA2C,CACzC,IAAAoC,EAAO0mB,CAAA,CAAK9oB,CAAL,CAEPoqB,GAAA,CAAansB,CAAb,CAAgBmE,CAAhB,CAAsB,SAAtB,CACA,IAAInE,CAAA0rB,EAAJ,CACE,MALuC,CAU3C7qB,MAAAC,eAAA,CAAsBd,CAAtB,CAAyB,YAAzB,CAAuC,CAAC,IAAAe,QAAG,EAAG,CAAE,MAAOP,MAAAisB,UAAT,CAAP,CAAvC,CAIA,KAAIC,CACJ,KAAS3qB,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB8oB,CAAAlnB,OAApB,CAAiC5B,CAAA,EAAjC,CAAsC,CACpCoC,CAAA,CAAO0mB,CAAA,CAAK9oB,CAAL,CACP,KAAMsd,EflMMZ,CekMK,CAAiBta,CAAjB,CACXuZ,EAAAA,CAAO2B,CAAP3B,EAAmB2B,CAAA3B,KACzB,IAAU,CAAV,GAAI3b,CAAJ,EAAgB2b,CAAhB,EAAwBA,CAAxB,GAAiCgP,CAAjC,CAME,GALAP,EAAA,CAAansB,CAAb,CAAgBmE,CAAhB,CAAsB,QAAtB,CAKIunB,CAHAvnB,CAGAunB,GAHSrqB,MAGTqqB,GAFFgB,CAEEhB,CAFcvnB,CAAA0a,YAAA,EAEd6M,EAAA1rB,CAAA0rB,EAAJ,CACE,KAXgC,CAzBH;AAyD9BiB,QAASA,GAAY,CAACC,CAAD,CAAWzoB,CAAX,CAAiB4N,CAAjB,CAAuB8a,CAAvB,CAAgCC,CAAhC,CAAsCC,CAAtC,CAA+C,CACzE,IAAK,IAAIhrB,EAAI,CAAb,CAAgBA,CAAhB,CAAoB6qB,CAAAjpB,OAApB,CAAqC5B,CAAA,EAArC,CAA0C,CACd,IAAA,EAAA6qB,CAAA,CAAS7qB,CAAT,CAAA,CAdpBirB,EAIJC,CAJF,KAc0B,CAbjBC,EAGPD,CAHF,QAa0B,CAZpBE,EAEJF,CAFF,KAY0B,CAXjBG,EACPH,CADF,QAWA,IAAuC9oB,CAAvC,GAVE8oB,CALFI,KAeA,EAA6Ctb,CAA7C,GARSib,CAQT,EAAmDH,CAAnD,GAPYK,CAOZ,EAA4DJ,CAA5D,GANSK,CAMT,EAAkEJ,CAAlE,GALYK,CAKZ,CACE,MAAOrrB,EAF+B,CAK1C,MAAQ,EANiE;AAyBpEuI,QAASA,GAAgB,CAACyH,CAAD,CAAOub,CAAP,CAAgBC,CAAhB,CAAkC,CAChE,GAAKD,CAAL,CAAA,CAIA,IAAME,EAAc,MAAOF,EAG3B,IAAoB,UAApB,GAAIE,CAAJ,EAAkD,QAAlD,GAAkCA,CAAlC,CAKA,GAAoB,QAApB,GAAIA,CAAJ,EAAkCF,CAAAG,YAAlC,EAAwF,UAAxF,GAAyD,MAAOH,EAAAG,YAAhE,CAAA,CAWA,GAAIF,CAAJ,EAAoD,QAApD,GAAwB,MAAOA,EAA/B,CAA8D,CAC5D,IAAAV,EAAU,CAAA,CAAQU,CAAAV,QAClB,KAAAC,EAAO,CAAA,CAAQS,CAAAT,KACf,KAAAC,EAAU,CAAA,CAAQQ,CAAAR,QAH0C,CAA9D,IAKEF,EAEA,CAFU,CAAA,CAAQU,CAElB,CAAAR,CAAA,CADAD,CACA,CADO,CAAA,CAMT,KAAIxpB,EAAUiqB,CAAVjqB,EAA8BiqB,CAAAG,GAA9BpqB,EAAiE,IAArE,CAEIspB,EAAWU,CAAA,CAAQnD,EAAR,CACf,IAAIyC,CAAJ,CAEE,IAAoE,EAApE,CAAID,EAAA,CAAaC,CAAb,CAAuBtpB,CAAvB,CAA+ByO,CAA/B,CAAqC8a,CAArC,CAA8CC,CAA9C,CAAoDC,CAApD,CAAJ,CACE,MADF,CAFF,IAMEO,EAAA,CAAQnD,EAAR,CAAA,CAA6B,EAOzBwD,EAAAA,CAAYA,QAAQ,CAAC3tB,CAAD,CAAI,CAExB8sB,CAAJ,EACE,IAAAxX,oBAAA,CAAyBvD,CAAzB,CAA+Bub,CAA/B,CAAwCC,CAAxC,CAEGvtB,EAAA,SAAL,EACE4tB,EAAA,CAAW5tB,CAAX,CAGF,IAAIsD,CAAJ,GAAe,IAAf,CAAqB,CAEnB,IAAAuqB,EAAwBhtB,MAAA6b,yBAAA,CAAgC1c,CAAhC,CAAmC,eAAnC,CACxBa,OAAAC,eAAA,CAAsBd,CAAtB,CAAyB,eAAzB,CAA0C,CAAC,IAAAe,QAAG,EAAG,CAAE,MAAOuC,EAAT,CAAP;AAA0BtC,aAAc,CAAA,CAAxC,CAA1C,CAHmB,CAQrB,GAAIhB,CAAAipB,SAAJ,EAAsD,EAAtD,CAAkBjpB,CAAAyqB,aAAA,EAAAzR,QAAA,CAAyB1V,CAAzB,CAAlB,CACE,GAAI4oB,EAAA,CAAclsB,CAAd,CAAJ,EAAwBA,CAAAsD,OAAxB,GAAqCtD,CAAA8C,cAArC,CACM9C,CAAA8tB,WAAJ,GAAqBttB,KAAAutB,eAArB,EACE/tB,CAAA2rB,yBAAA,EAFJ,KAOA,IAAI3rB,CAAA8tB,WAAJ,GAAqBttB,KAAAwtB,gBAArB,EAA+ChuB,CAAA2B,QAA/C,EAA4D3B,CAAAsD,OAA5D,GAAyEA,CAAzE,EAAqFA,CAArF,WAAuGkf,OAAvG,CAAA,CAGA,IAAIyL,EAAsB,UAAhB,GAAAT,CAAA,CACRF,CAAA1sB,KAAA,CAAa0C,CAAb,CAAqBtD,CAArB,CADQ,CAEPstB,CAAAG,YAFO,EAEgBH,CAAAG,YAAA,CAAoBztB,CAApB,CACtBsD,EAAJ,GAAe,IAAf,GAEMuqB,CAAJ,EACEhtB,MAAAC,eAAA,CAAsBd,CAAtB,CAAyB,eAAzB,CAA0C6tB,CAA1C,CACA,CAAAA,CAAA,CAAwB,IAF1B,EAIE,OAAO7tB,CAAA,cANX,CASA,OAAOiuB,EAfP,CAzB0B,CA4C9BX,EAAA,CAAQnD,EAAR,CAAA7J,KAAA,CAAgC,CAG9Bnc,KAAMb,CAHwB,CAI9ByO,KAAMA,CAJwB,CAK9B8a,QAASA,CALqB,CAM9BC,KAAMA,CANwB,CAO9BC,QAASA,CAPqB,CAQ9BY,GAAWA,CARmB,CAAhC,CAWI1B,GAAA,CAA4Bla,CAA5B,CAAJ,EACE,IAAAua,WAGA;AAHkB,IAAAA,WAGlB,EAHqC,EAGrC,CAFA,IAAAA,WAAA,CAAgBva,CAAhB,CAEA,CAFwB,IAAAua,WAAA,CAAgBva,CAAhB,CAExB,EADE,CAAC,QAAW,EAAZ,CAAgB,OAAU,EAA1B,CACF,CAAA,IAAAua,WAAA,CAAgBva,CAAhB,CAAA,CAAsB8a,CAAA,CAAU,SAAV,CAAsB,QAA5C,CAAAvM,KAAA,CAA2DqN,CAA3D,CAJF,EAQE/sB,CAFU,IAAAstB,WAAgB1L,OAAhB0L,CAAyB3F,CAAAhG,GAAzB2L,CACR3F,CAAAje,iBACF1J,MAAA,CAAS,IAAT,CAAemR,CAAf,CAAqB4b,CAArB,CAAgCJ,CAAhC,CAtGF,CAZA,CADgE;AA0H3DjY,QAASA,GAAmB,CAACvD,CAAD,CAAOub,CAAP,CAAgBC,CAAhB,CAAkC,CACnE,GAAKD,CAAL,CAAA,CAMA,GAAIC,CAAJ,EAAoD,QAApD,GAAwB,MAAOA,EAA/B,CAA8D,CAC5D,IAAAV,EAAU,CAAA,CAAQU,CAAAV,QAClB,KAAAC,EAAO,CAAA,CAAQS,CAAAT,KACf,KAAAC,EAAU,CAAA,CAAQQ,CAAAR,QAH0C,CAA9D,IAKEF,EAEA,CAFU,CAAA,CAAQU,CAElB,CAAAR,CAAA,CADAD,CACA,CADO,CAAA,CAGT,KAAIxpB,EAAUiqB,CAAVjqB,EAA8BiqB,CAAAG,GAA9BpqB,EAAiE,IAArE,CAEIqqB,EAAYtgB,IAAAA,EAtJZuf,KAAAA,EAAW,IACf,IAAI,CACFA,CAAA,CAqJ8BU,CArJnB,CAAUnD,EAAV,CADT,CAEF,MAAOnqB,CAAP,CAAU,EAqJR4sB,CAAJ,GACMuB,CACJ,CADUxB,EAAA,CAAaC,CAAb,CAAuBtpB,CAAvB,CAA+ByO,CAA/B,CAAqC8a,CAArC,CAA8CC,CAA9C,CAAoDC,CAApD,CACV,CAAW,EAAX,CAAIoB,CAAJ,GACER,CAEA,CAFYf,CAAA9D,OAAA,CAAgBqF,CAAhB,CAAqB,CAArB,CAAA,CAAwB,CAAxB,CAAAR,GAEZ,CAAKf,CAAAjpB,OAAL,GACE2pB,CAAA,CAAQnD,EAAR,CADF,CAC+B9c,IAAAA,EAD/B,CAHF,CAFF,CAYAzM,EAFU,IAAA8U,WAAgB8M,OAAhB9M,CAAyB6S,CAAA9F,GAAzB/M,CACR6S,CAAAjT,oBACF1U,MAAA,CAAS,IAAT,CAAemR,CAAf,CAAqB4b,CAArB,EAAkCL,CAAlC,CAA2CC,CAA3C,CACII,EAAJ,EAAiB1B,EAAA,CAA4Bla,CAA5B,CAAjB,EACI,IAAAua,WADJ,EACuB,IAAAA,WAAA,CAAgBva,CAAhB,CADvB,GAEQ/G,CAEN,CAFY,IAAAshB,WAAA,CAAgBva,CAAhB,CAAA,CAAsB8a,CAAA,CAAU,SAAV,CAAsB,QAA5C,CAEZ,CADMsB,CACN,CADYnjB,CAAAgO,QAAA,CAAY2U,CAAZ,CACZ,CAAW,EAAX,CAAIQ,CAAJ,EACEnjB,CAAA8d,OAAA,CAAWqF,CAAX,CAAgB,CAAhB,CALJ,CAhCA,CADmE;AA2CrEC,QAASA,GAA2B,EAAG,CACrC,IAAKC,IAAIA,CAAT,GAAepC,GAAf,CACE5qB,MAAAiJ,iBAAA,CAAwB+jB,CAAxB,CAA4B,QAAQ,CAACruB,CAAD,CAAI,CACjCA,CAAA,SAAL,GACE4tB,EAAA,CAAW5tB,CAAX,CACA,CAAAwsB,EAAA,CAAyBxsB,CAAzB,CAFF,CADsC,CAAxC,CAKG,CAAA,CALH,CAFmC,CAWvC4tB,QAASA,GAAU,CAACtZ,CAAD,CAAQ,CACzBA,CAAA,SAAA,CAAoBA,CAAAhR,OACpBgR,EAAAiX,GAAA,CAAwBjX,CAAAxR,cAExB,Id5dS4b,Cc4dLK,EAAJ,CAAA,CdlZA,IAAImF,EAAQrjB,MAAAytB,eAAA,CcmZWha,CdnZX,CACZ,IAAI,CAAC4P,CAAAvb,eAAA,CAAqB,cAArB,CAAL,CAA2C,CACzC,IAAI4lB,EAAa1tB,MAAA4H,OAAA,CAAcyb,CAAd,CACjBqK,EAAAC,GAAA,CAA2BtK,CAC3BnE,GAAA,CAAOwO,CAAP,Cc+Y4BrD,Ed/Y5B,CACAhH,EAAA,aAAA,CAAwBqK,CAJiB,CckZpBja,Cd3YvBxO,UAAA,CAAgBoe,CAAA,ac0YhB,CAAA,Id3acnE,Gc+aZ,CAAazL,CAAb,CAAoB4W,EAApB,CARuB,CAY3B,IAAIuD,GAAe5C,EAAA,CAAkBxqB,MAAAb,MAAlB,CAAnB,CACIkuB,GAAqB7C,EAAA,CAAkBxqB,MAAAC,YAAlB,CADzB,CAEIqtB,GAAoB9C,EAAA,CAAkBxqB,MAAAW,WAAlB,C,CCvexB4sB,QAASA,GAAS,CAACxJ,CAAD,CAAiByJ,CAAjB,CAA6B,CAC7C,MAAO,CACLzJ,MAAOA,CADF,CAEL0J,EAwJiCA,EA1J5B,CAGLD,EAAYA,CAHP,CADsC;AAqI/CE,QAASA,GAAW,CAACrE,CAAD,CAAwBsE,CAAxB,CACEC,CADF,CACiBC,CADjB,CACyB,CADfC,IAAAA,EAwGA,CAxGAA,CACHC,EAuGgC,CAxG7BD,CAExBE,EAAc,CAFUF,CAGxBG,EAAc,CAHUH,CAMxBI,EAAY7e,IAAA8e,IAAA,CAASR,CAAT,CAAsBG,CAAtB,CAAoCD,CAApC,CAA6CE,CAA7C,CAChB,IAAoB,CAApB,EAAID,CAAJ,EAAqC,CAArC,EAAyBC,CAAzB,CA2EgD,CAAA,CAAA,CAChD,IAASrtB,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CA3E2CwtB,CA2E3C,CAAkCxtB,CAAA,EAAlC,CACE,GA5E2B2oB,CA4Ef+E,CAAQ1tB,CAAR0tB,CAAZ,GA5EoCR,CA4EZS,CAAI3tB,CAAJ2tB,CAAxB,CACE,MAAA,CACJ,EAAA,CA9E2CH,CA0EK,CAxEhD,GAAIP,CAAJ,EAAkBtE,CAAA/mB,OAAlB,EAAoCurB,CAApC,EAA8CD,CAAAtrB,OAA9C,CAAA,CAgFIgsB,CAAAA,CA/EyBjF,CA+EhB/mB,OAGb,KAFA,IAAIisB,EAhFkCX,CAgFzBtrB,OAAb,CACIksB,EAAQ,CACZ,CAAOA,CAAP,CAlF2CN,CAkF3C,CAlFuDF,CAkFvD,EAA+BS,EAAA,CAlFFpF,CAkFS,CAAQ,EAAEiF,CAAV,CAAP,CAlFOV,CAkFmB,CAAI,EAAEW,CAAN,CAA1B,CAA/B,CAAA,CACEC,CAAA,EAEF,EAAA,CAAOA,CAtFP,CAGAV,CAAA,EAAgBE,CAChBD,EAAA,EAAYC,CACZL,EAAA,EAAcM,CACdJ,EAAA,EAAUI,CAEV,IAAiC,CAAjC,EAAIN,CAAJ,CAAiBG,CAAjB,EAA2D,CAA3D,EAAsCD,CAAtC,CAA+CE,CAA/C,CACE,MAAO,EAET,IAAID,CAAJ,EAAoBH,CAApB,CAAgC,CAE9B,IADAlG,CACA,CADS8F,EAAA,CAAUO,CAAV,CAA4B,CAA5B,CACT,CAAOC,CAAP,CAAkBF,CAAlB,CAAA,CACEpG,CAAAgG,EAAAxO,KAAA,CAAoB2O,CAAA,CAAIG,CAAA,EAAJ,CAApB,CAEF,OAAO,CAAEtG,CAAF,CALuB,CAMzB,GAAIsG,CAAJ,EAAgBF,CAAhB,CACL,MAAO,CAAEN,EAAA,CAAUO,CAAV,CAA4BH,CAA5B,CAAyCG,CAAzC,CAAF,CAGsBA,EAAAA,CAAAA,CACCC,EAAAA,CAAAA,CA1I5BW,EAAAA,CA0IsCb,CA1ItCa,CAAoBX,CAApBW,CAA+B,CAC/BC,EAAAA,CAwIyChB,CAxIzCgB,CAA2Bb,CAA3Ba,CAA0C,CAC1CC,EAAAA,CAAgBltB,KAAJ,CAAUgtB,CAAV,CAGhB,KAAShuB,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBguB,CAApB,CAA8BhuB,CAAA,EAA9B,CACEkuB,CAAA,CAAUluB,CAAV,CACA,CADmBgB,KAAJ,CAAUitB,CAAV,CACf,CAAAC,CAAA,CAAUluB,CAAV,CAAA,CAAa,CAAb,CAAA,CAAkBA,CAIpB,KAASmuB,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBF,CAApB,CAAiCE,CAAA,EAAjC,CACED,CAAA,CAAU,CAAV,CAAA,CAAaC,CAAb,CAAA,CAAkBA,CAEpB,KAASnuB,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBguB,CAApB,CAA8BhuB,CAAA,EAA9B,CACE,IAASmuB,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBF,CAApB,CAAiCE,CAAA,EAAjC,CACE,GAyHkBxF,CAzHP+E,CAAQN,CAARM,CAAuBS,CAAvBT,CAA2B,CAA3BA,CAAX,GA0HuBR,CA1HmBS,CAAIN,CAAJM,CAAe3tB,CAAf2tB,CAAmB,CAAnBA,CAA1C,CACEO,CAAA,CAAUluB,CAAV,CAAA,CAAamuB,CAAb,CAAA;AAAkBD,CAAA,CAAUluB,CAAV,CAAc,CAAd,CAAA,CAAiBmuB,CAAjB,CAAqB,CAArB,CADpB,KAEK,CACH,IAAIC,EAAQF,CAAA,CAAUluB,CAAV,CAAc,CAAd,CAAA,CAAiBmuB,CAAjB,CAARC,CAA8B,CAAlC,CACIC,EAAOH,CAAA,CAAUluB,CAAV,CAAA,CAAamuB,CAAb,CAAiB,CAAjB,CAAPE,CAA6B,CACjCH,EAAA,CAAUluB,CAAV,CAAA,CAAamuB,CAAb,CAAA,CAAkBC,CAAA,CAAQC,CAAR,CAAeD,CAAf,CAAuBC,CAHtC,CAeLruB,CAAAA,CAPGkuB,CAOCtsB,OAAJ5B,CAAuB,CACvBmuB,EAAAA,CARGD,CAQC,CAAU,CAAV,CAAAtsB,OAAJusB,CAA0B,CAC1BxF,EAAAA,CATGuF,CASO,CAAUluB,CAAV,CAAA,CAAamuB,CAAb,CAEd,KADIG,CACJ,CADY,EACZ,CAAW,CAAX,CAAOtuB,CAAP,EAAoB,CAApB,CAAgBmuB,CAAhB,CAAA,CACW,CAAT,EAAInuB,CAAJ,EACEsuB,CAAA/P,KAAA,CAxDWgQ,CAwDX,CACA,CAAAJ,CAAA,EAFF,EAKS,CAAT,EAAIA,CAAJ,EACEG,CAAA/P,KAAA,CA5DciQ,CA4Dd,CACA,CAAAxuB,CAAA,EAFF,GAKIyuB,CAUJ,CAhCKP,CAsBW,CAAUluB,CAAV,CAAc,CAAd,CAAA,CAAiBmuB,CAAjB,CAAqB,CAArB,CAUhB,CATIE,CASJ,CAhCKH,CAuBM,CAAUluB,CAAV,CAAc,CAAd,CAAA,CAAiBmuB,CAAjB,CASX,CARIC,CAQJ,CAhCKF,CAwBO,CAAUluB,CAAV,CAAA,CAAamuB,CAAb,CAAiB,CAAjB,CAQZ,CAJEV,CAIF,CALIY,CAAJ,CAAWD,CAAX,CACQC,CAAA,CAAOI,CAAP,CAAmBJ,CAAnB,CAA0BI,CADlC,CAGQL,CAAA,CAAQK,CAAR,CAAoBL,CAApB,CAA4BK,CAEpC,CAAIhB,CAAJ,EAAWgB,CAAX,EACMA,CAAJ,EAAiB9F,CAAjB,CACE2F,CAAA/P,KAAA,CA/EWmQ,CA+EX,CADF,EAGEJ,CAAA/P,KAAA,CAhFYoQ,CAgFZ,CACA,CAAAhG,CAAA,CAAU8F,CAJZ,CAOA,CADAzuB,CAAA,EACA,CAAAmuB,CAAA,EARF,EASWV,CAAJ,EAAWY,CAAX,EACLC,CAAA/P,KAAA,CApFciQ,CAoFd,CAEA,CADAxuB,CAAA,EACA,CAAA2oB,CAAA,CAAU0F,CAHL,GAKLC,CAAA/P,KAAA,CAzFWgQ,CAyFX,CAEA,CADAJ,CAAA,EACA,CAAAxF,CAAA,CAAUyF,CAPL,CAxBP,CAmCFE,EAAAM,QAAA,EA8DA7H,EAAA,CAASzb,IAAAA,EACLujB,EAAAA,CAAU,EAGd,KAAS7uB,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAjEOsuB,CAiEa1sB,OAApB,CAAgC5B,CAAA,EAAhC,CACE,OAlEKsuB,CAkEE,CAAItuB,CAAJ,CAAP,EACE,KArKa0uB,CAqKb,CACM3H,CAAJ,GACE8H,CAAAtQ,KAAA,CAAawI,CAAb,CACA,CAAAA,CAAA,CAASzb,IAAAA,EAFX,CAKA+X,EAAA,EACAyL,EAAA,EACA,MACF,MA7KcH,CA6Kd,CACO5H,CAAL,GACEA,CADF,CACW8F,EAAA,CAAUxJ,CAAV,CAAqB,CAArB,CADX,CAGA0D,EAAA+F,EAAA,EACAzJ,EAAA,EAEA0D,EAAAgG,EAAAxO,KAAA,CAAoB2O,CAAA,CAAI4B,CAAJ,CAApB,CACAA,EAAA,EACA,MACF,MAtLWP,CAsLX,CACOxH,CAAL,GACEA,CADF,CACW8F,EAAA,CAAUxJ,CAAV,CAAqB,CAArB,CADX,CAGA0D;CAAA+F,EAAA,EACAzJ,EAAA,EACA,MACF,MA5LcmL,CA4Ld,CACOzH,CAIL,GAHEA,CAGF,CAHW8F,EAAA,CAAUxJ,CAAV,CAAqB,CAArB,CAGX,EADA0D,CAAAgG,EAAAxO,KAAA,CAAoB2O,CAAA,CAAI4B,CAAJ,CAApB,CACA,CAAAA,CAAA,EAhCJ,CAqCE/H,CAAJ,EACE8H,CAAAtQ,KAAA,CAAawI,CAAb,CAEF,OAAO8H,EA9EoC,CAkG7Cd,QAASA,GAAM,CAACL,CAAD,CAAeC,CAAf,CAA8B,CAC3C,MAAOD,EAAP,GAAwBC,CADmB,C,CNhOtC,IAAA,GFJMpL,CEIN,WAAA,CAAY,GFJNA,CEIM,WAAZ,CAMDwM,GAA6B,EAOnCC,SAASA,GAAY,CAAC5sB,CAAD,CAAO,CAC1B,IAAI6sB,EAAY,EAChB,GACEA,EAAAC,QAAA,CAAkB9sB,CAAlB,CADF,OAEUA,CAFV,CAEiBA,CAAA0F,WAFjB,CAGA,OAAOmnB,EALmB,CAc1BlhB,QAFW6W,GAEA,CAACuK,CAAD,CAAQpX,CAAR,CAAckS,CAAd,CAAuB,CAChC,GAAIkF,CAAJ,GAAcJ,EAAd,CACE,KAAM,KAAIhf,SAAJ,CAAc,qBAAd,CAAN,CAKF,IAAAyN,GAAA,CAzBmB4R,WA0Bb/lB,EAAAA,CAAK/G,EAAA,CAAWyV,CAAX,CAEX,KAAAA,KAAA,CAAYA,CACZ,KAAAsX,EAAA,CAAapF,CAAb,EAAwBA,CAAAqF,KE4CjB/J,GF1CP,CAAiBxN,CAAjB,CAAuB1O,CAAvB,CACMkmB,EAAAA,CVDM7S,CUCK,CAAiB3E,CAAjB,CACjBwX,EAAA5T,KAAA,CAAgB,IAChB4T,EAAA7T,GAAA,CAhCgB8T,QAgCM,GAAA,IAAAH,EAAA,CAA6B,IAA7B,CAAoC,IAEpDI,EAAAA,CVZMjT,CUYK,CAAuB,IAAvB,CACjBiT,EAAAhsB,WAAA,CAAsBgsB,CAAAtT,UAAtB,CACIsT,CAAA3nB,WADJ,CAC0B2nB,CAAAzV,YAD1B,CAEIyV,CAAAvT,gBAFJ,CAE+B,IAC/BuT,EAAAntB,WAAA,CAAsB,EAEtB,KAAAotB,EAAA,CAAsB,CAAA,CAKtB,KAAA7J,EAAA,CADA,IAAAE,EACA,CAFA,IAAAD,EAEA,CAFiB,IAIR9lB,EAAAA,CAAE,CAAX,KAAK,IAASsI,EAAEe,CAAAzH,OAAhB,CAA2B5B,CAA3B,CAA+BsI,CAA/B,CAAkCtI,CAAA,EAAlC,CACEwE,CAAAA,YAAA3F,KAAA,CAAiBkZ,CAAjB,CAAuB1O,CAAA,CAAGrJ,CAAH,CAAvB,CAhC8B;AAqClCkmB,QAAA,GAAY,CAAZA,CAAY,CAAG,CACR,CAAAwJ,EAAL,GACE,CAAAA,EACA,CADsB,CAAA,CACtB,CRtEU7Q,EQsEV,CAAQ,QAAA,EAAM,CAAA,MAAA8Q,GAAA,CAHHA,CAGG,CAAA,CAAd,CAFF,CADa,CAmCfA,QAAA,GAAO,CAAPA,CAAO,CAAG,CAxBR,IAyBa,IAAA,CAzBb,CAAOhU,CAAP,CAAA,CAAa,CACPA,CAAA+T,EAAJ,GACEE,CADF,CACejU,CADf,CAUe,EAAA,CAAA,CAPRA,IAAAA,EAAAA,CAQLA,EAAAA,CAAO,CAAA5D,KAAA+E,YAAA,EACX,ITzEYS,CSyER,CAAkB5B,CAAlB,CAAJ,CAEE,IADA,IAAItS,EAAK,CAAA0O,KAAAzV,WAAT,CACStC,EAAE,CAAX,CAAiBA,CAAjB,CAAqBqJ,CAAAzH,OAArB,CAAgC5B,CAAA,EAAhC,CAEE,GADA+I,CAsNK,CAtNDM,CAAA,CAAGrJ,CAAH,CAsNC,CAAkB,MAAlB,EArNsB+I,CAqNtBJ,UArNL,CACE,MAAA,CAPW,EAAA,CAAA,IAAA,EAAA,CAXJ,CAyBAgT,CACb,EADaA,CAEX,YAAA,EAHM;AAQV,EAAA,UAAA,YAAA,CAAA,QAAe,EAAG,CAChB,IAAA+T,EAAA,CAAsB,CAAA,CACtB,IAAI,IAAA5J,EAAJ,CAAoB,CAQpBe,EAAA,CAPEgJ,IAOF,CAEA,KAHY,IAGH7vB,EAAE,CAHC,CAGE8mB,CAAd,CAAoB9mB,CAApB,CATE6vB,IASsB/J,EAAAlkB,OAAxB,CAA+C5B,CAAA,EAA/C,CAAoD,CAClD8mB,CAAA,CAVA+I,IAUO/J,EAAA,CAAe9lB,CAAf,CA0FT,KAAM8vB,EV1KMpT,CU0KK,CAAiBoK,CAAjB,CAAjB,CACIjlB,EAAKiuB,CAAA7T,cACT6T,EAAA7T,cAAA,CAAyB,EACzB6T,EAAAjU,EAAA,CAA0B,EAE1B,IADAiU,CAAA/T,GACA,CADoCla,CACpC,CACE,IAAS7B,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkB6B,CAAAD,OAAlB,CAA6B5B,CAAA,EAA7B,CAAkC,CAChC,IAAI+Y,EVjLI2D,CUiLA,CAAiB7a,CAAA,CAAG7B,CAAH,CAAjB,CACR+Y,EAAA+C,EAAA,CAAsB/C,CAAAiD,aAIlBjD,EAAAiD,aAAJ,GAAuB8K,CAAvB,GACE/N,CAAAiD,aADF,CACmB,IADnB,CANgC,CAjGgB,CAKpD,IAASjD,CAAT,CAdE8W,IAcS9X,KAAAtU,WAAX,CAAiCsV,CAAjC,CAAoCA,CAApC,CAAsCA,CAAAiB,YAAtC,CACE+V,EAAA,CAfAF,IAeA,CAA2B9W,CAA3B,CAGF,KAAS/Y,CAAT,CAAW,CAAX,CAAcA,CAAd,CAlBE6vB,IAkBgB/J,EAAAlkB,OAAlB,CAAyC5B,CAAA,EAAzC,CAA8C,CACtC8mB,CAAN,CAnBA+I,IAmBa/J,EAAA,CAAe9lB,CAAf,CACP8vB,EAAAA,CV1FIpT,CU0FO,CAAiBoK,CAAjB,CAEjB,IAAI,CAACgJ,CAAA7T,cAAAra,OAAL,CACE,IAASmX,CAAT,CAAW+N,CAAArjB,WAAX,CAA4BsV,CAA5B,CAA+BA,CAA/B,CAAiCA,CAAAiB,YAAjC,CACE+V,EAAA,CAxBJF,IAwBI,CAA2B9W,CAA3B,CAA8B+N,CAA9B,CAKJ,EADMkJ,CACN,EAFMC,CAEN,CVnGUvT,CUiGa,CAAiBoK,CAAAhf,WAAjB,CAEvB,GADyCmoB,CAAAtU,KACzC,GAAsByL,EAAA,CAAA4I,CAAA,CAAtB,EACEA,CAAA,YAAA,EAEFE;EAAA,CAhCAL,IAgCA,CAAkCC,CAAAjU,EAAlC,CACEiU,CAAA7T,cADF,CAGA,IADIkU,CACJ,CADwBL,CAAA/T,GACxB,CAAuB,CACrB,IAAS/b,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkBmwB,CAAAvuB,OAAlB,CAA4C5B,CAAA,EAA5C,CV1GQ0c,CU2GN,CAAiByT,CAAA,CAAkBnwB,CAAlB,CAAjB,CAAA8b,EAAA,CAA2D,IAE7DgU,EAAA/T,GAAA,CAAoC,IAEhCoU,EAAAvuB,OAAJ,CAA+BkuB,CAAA7T,cAAAra,OAA/B,GACEkuB,CAAAlU,EADF,CACmB,CAAA,CADnB,CANqB,CAcnBkU,CAAAlU,EAAJ,GACEkU,CAAAlU,EACA,CADiB,CAAA,CACjB,CAAAwU,EAAA,CAnDFP,IAmDE,CAAqB/I,CAArB,CAFF,CA/B4C,CAmIxCnB,CAAAA,CApJJ0K,IAoJYvK,EACVwK,EAAAA,CAAc,EAClB,KAAStwB,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkB2lB,CAAA/jB,OAAlB,CAAgC5B,CAAA,EAAhC,CACQ8N,CAQN,CARe6X,CAAA,CAAM3lB,CAAN,CAAA8H,WAQf,EADMse,CACN,CVtOU1J,CUqOS,CAAiB5O,CAAjB,CACnB,GAAoBsY,CAAAzK,KAApB,EACE,EAA8B,CAA9B,CAAA2U,CAAArZ,QAAA,CAAoBnJ,CAApB,CAAA,CADF,EAEEwiB,CAAA/R,KAAA,CAAiBzQ,CAAjB,CAGJ,KAAS9N,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkBswB,CAAA1uB,OAAlB,CAAsC5B,CAAA,EAAtC,CAA2C,CACnCoC,CAAAA,CAAOkuB,CAAA,CAAYtwB,CAAZ,CACMuwB,EAAAA,CAAAnuB,CAAAmuB,GAtKnBF,IAsKmBE,CAtKnBF,IAsKmCtY,KAAhBwY,CAA4BnuB,CAO7Cwf,EAAAA,CAAW,EACXvY,EAAAA,CAPmDjH,CAO9CE,WACT,KAAK,IAAItC,EAAI,CAAb,CAAgBA,CAAhB,CAAoBqJ,CAAAzH,OAApB,CAA+B5B,CAAA,EAA/B,CAAoC,CAClC,IAAIwD,EAAQ6F,CAAA,CAAGrJ,CAAH,CAIZ,IAcyB,MAdzB,EAA2BwD,CAcpBmF,UAdP,CAAmC,CAC7BkT,CAAAA,CV5PIa,CU4Pa,CAAiBlZ,CAAjB,CAAAqY,EACrB,KAAK,IAAIsS,EAAI,CAAb,CAAgBA,CAAhB,CAAoBtS,CAAAja,OAApB,CAA2CusB,CAAA,EAA3C,CAEIvM,CAAArD,KAAA,CADoB1C,CAAA2U,CAAerC,CAAfqC,CACpB,CAJ6B,CAAnC,IAOE5O,EAAArD,KAAA,CAAc/a,CAAd,CAZgC,CA2BjB7B,CAAAA,CAAAA,IAAAA,EAHfulB,EAAAA,CAAW5kB,EAAA,CAAWoc,CAAX,CACXmQ,EAAAA,CMlFC7B,EAAA,CNkF0BpL,CMlF1B,CNkF0BA,CMlFFhgB,OAAxB,CNkFoCslB,CMlFpC,CNkFoCA,CMjFnBtlB,OADjB,CNoFL;IAJqC,IAIvB6uB,EAALzwB,CAAKywB,CAAH,CAAX,CAAuBzwB,CAAvB,CAAyB6uB,CAAAjtB,OAAzB,GAA6CD,CAA7C,CAA+CktB,CAAA,CAAQ7uB,CAAR,CAA/C,EAA4DA,CAAA,EAA5D,CAAiE,CAC/D,IAD+D,IACtDmuB,EAAE,CADoD,CACjDpV,CAAd,CAAkBoV,CAAlB,CAAsBxsB,CAAAorB,EAAAnrB,OAAtB,GAA4CmX,CAA5C,CAA8CpX,CAAAorB,EAAA,CAAUoB,CAAV,CAA9C,EAA6DA,CAAA,EAA7D,CAKMrmB,EAAA,CAAWiR,CAAX,CAIJ,GAJsB2F,CAItB,EAHEla,CAAAA,YAAA3F,KAAA,CAAiB6f,CAAjB,CAA4B3F,CAA5B,CAGF,CAAAmO,CAAAH,OAAA,CAAgBplB,CAAA0hB,MAAhB,CAA0BoN,CAA1B,CAA6B,CAA7B,CAEFA,EAAA,EAAK9uB,CAAAmrB,EAZ0D,CAejE,IAAS9sB,CAAT,CAAW,CAAX,CAAwBA,CAAxB,CAA0B6uB,CAAAjtB,OAA1B,GAA8CD,CAA9C,CAAgDktB,CAAA,CAAQ7uB,CAAR,CAAhD,EAA6DA,CAAA,EAA7D,CAEE,IADA0wB,CACSvC,CADFjH,CAAA,CAASvlB,CAAA0hB,MAAT,CACE8K,CAAAA,CAAAA,CAAExsB,CAAA0hB,MAAX,CAAuB8K,CAAvB,CAA2BxsB,CAAA0hB,MAA3B,CAAqC1hB,CAAAmrB,EAArC,CAAmDqB,CAAA,EAAnD,CACEpV,CAEA,CAFI6I,CAAA,CAASuM,CAAT,CAEJ,CADA9qB,CAAAA,aAAAxE,KAAA,CAAkB6f,CAAlB,CAA6B3F,CAA7B,CAAgC2X,CAAhC,CACA,CAAAxJ,CAAAH,OAAA,CAAgBoH,CAAhB,CAAmB,CAAnB,CAAsBpV,CAAtB,CA1DuC,CAtKvB,CAFJ,CAqElBgX,SAAA,GAAqB,CAArBA,CAAqB,CAAC3tB,CAAD,CAAOuuB,CAAP,CAAmB,CACtC,IAAMrT,EVhJMd,CUgJK,CAAuBpa,CAAvB,CAAjB,CACIwuB,EAAUtT,CAAAxB,EACdwB,EAAAxB,EAAA,CAA6B,IAExBgL,EAAL,GAGEA,CAHF,EAEQpS,CAFR,CAEe,CAAAqR,EAAA,CADF3jB,CAAA0kB,KACE,EA/KG+J,YA+KH,CAFf,GAGiBnc,CAAA,CAAK,CAAL,CAHjB,CAKIoS,EAAJ,EVzJYtK,CU0JOsT,CAAuBhJ,CAAvBgJ,CACjB7T,cAAAsC,KAAA,CAA4Bnc,CAA5B,CACA,CAAAkb,CAAAtB,aAAA,CAAwB8K,CAH1B,EAKExJ,CAAAtB,aALF,CAK0B1Q,IAAAA,EAEtBslB,EAAJ,GAAgBtT,CAAAtB,aAAhB,EACMsB,CAAAtB,aADN,GVhKYQ,CUkKR,CAAuBc,CAAAtB,aAAvB,CAAAJ,EAFJ,CAE0D,CAAA,CAF1D,CAjBsC;AAqDxCsU,QAAA,GAA4B,CAA5BA,CAA4B,CAAC/I,CAAD,CAAY2J,CAAZ,CAAsB,CAChD,IADgD,IACvC9wB,EAAE,CADqC,CAClC+Y,CAAd,CAAkB/Y,CAAlB,CAAoB8wB,CAAAlvB,OAApB,GAAyCmX,CAAzC,CAA2C+X,CAAA,CAAS9wB,CAAT,CAA3C,EAAyDA,CAAA,EAAzD,CACE,GAAmB,MAAnB,EAAI+Y,CAAApQ,UAAJ,CAA2B,CACzB,IAAMooB,EVhMErU,CUgMe,CAAiB3D,CAAjB,CAAAkD,cACnB8U,EAAJ,EAAsBA,CAAAnvB,OAAtB,EACEsuB,EAAA,CAAAA,CAAA,CAAkC/I,CAAlC,CAA6C4J,CAA7C,CAHuB,CAA3B,IAME5J,EAAA5I,KAAA,CAAeuS,CAAA,CAAS9wB,CAAT,CAAf,CAR4C,CAalDowB,QAAA,GAAe,CAAfA,CAAe,CAACtJ,CAAD,CAAO,CAIpB3M,CAAAA,cAAAtb,KAAA,CAAmBioB,CAAnB,CAAyB,IAAIroB,KAAJ,CAAU,YAAV,CAAzB,CACMqxB,EAAAA,CV/MMpT,CU+MK,CAAiBoK,CAAjB,CACbgJ,EAAA9T,aAAJ,EACEoU,EAAA,CAAAA,CAAA,CAAqBN,CAAA9T,aAArB,CAPkB,CA2GtB6K,QAAA,GAAc,CAAdA,CAAc,CAAG,CACf,GAAI,CAAAhB,EAAJ,EAA0B,CAAAA,EAAAjkB,OAA1B,CAAqD,CAYrD,IAXiBikB,IAAAA,EAAAA,CAAAA,EAAAA,CAUbmL,CAVanL,CAWR7lB,EAAE,CAAX,CAAcA,CAAd,CAAkB2lB,CAAA/jB,OAAlB,CAAgC5B,CAAA,EAAhC,CAAqC,CACnC,IAAI8mB,EAAOnB,CAAA,CAAM3lB,CAAN,CEzRNulB,GF+RL,CAAiBuB,CAAjB,CE/RKvB,GFgSL,CAAiBuB,CAAAhf,WAAjB,CACA,KAAI6B,EAAO6d,EAAA,CAAkBV,CAAlB,CApBXmK,EAqBIlL,EAAA,CAAcpc,CAAd,CAAJ,EACEqnB,CAEA,CAFkBA,CAElB,EAFqC,EAErC,CADAA,CAAA,CAAgBrnB,CAAhB,CACA,CADwB,CAAA,CACxB,CAxBFsnB,CAwBElL,EAAA,CAAcpc,CAAd,CAAA4U,KAAA,CAAyBuI,CAAzB,CAHF,EArBAmK,CA0BElL,EAAA,CAAcpc,CAAd,CALF,CAKwB,CAACmd,CAAD,CA1BxBmK,EA4BAnL,EAAAvH,KAAA,CAAoBuI,CAApB,CAjBmC,CAmBrC,GAAIkK,CAAJ,CACE,IAAKjY,IAAIA,CAAT,GAAciY,EAAd,CA/BAC,CAgCElL,EAAA,CAAchN,CAAd,CAAA,CAAmB0O,EAAA,CAhCrBwJ,CAgCqClL,EAAA,CAAchN,CAAd,CAAhB,CA/BrB,EAAA8M,EAAA,CAAqB,EAF8B,CADtC;AAuCjB2B,QAAA,GAAY,CAACV,CAAD,CAAO,CACjB,IAAMnd,EAAOmd,CAAA,KAAPnd,EAAuBmd,CAAAvR,aAAA,CAAkB,MAAlB,CAAvB5L,EA7XYknB,YA+XlB,OADA/J,EAAAS,GACA,CADkB5d,CAFD,CAUnB8d,QAAA,GAAU,CAAC9B,CAAD,CAAQ,CAIhB,MAAOA,EAAAuL,KAAA,CAAW,QAAA,CAACrmB,CAAD,CAAIsmB,CAAJ,CAAU,CACtBC,CAAAA,CAAQpC,EAAA,CAAankB,CAAb,CAEZ,KADA,IAAIwmB,EAAQrC,EAAA,CAAamC,CAAb,CAAZ,CACSnxB,EAAE,CAAX,CAAcA,CAAd,CAAkBoxB,CAAAxvB,OAAlB,CAAgC5B,CAAA,EAAhC,CAAqC,CAC/BsxB,CAAAA,CAAKF,CAAA,CAAMpxB,CAAN,CACT,KAAIuxB,EAAKF,CAAA,CAAMrxB,CAAN,CACT,IAAIsxB,CAAJ,GAAWC,CAAX,CAEE,MADIloB,EACG,CADErI,KAAAC,KAAA,CAAWqwB,CAAAxpB,WAAAxF,WAAX,CACF,CAAA+G,CAAA4N,QAAA,CAAWqa,CAAX,CAAA,CAAiBjoB,CAAA4N,QAAA,CAAWsa,CAAX,CALS,CAHX,CAArB,CAJS,CAwFlBnK,QAAA,GAAkB,CAAlBA,CAAkB,CAAG,CACnBP,EAAA,CAAAA,CAAA,CACA,OAAO,EAAQf,CAAA,CAAAA,EAAR,EAA0BlkB,CAAA,CAAAkkB,EAAAlkB,OAA1B,CAFY,C,CCrevB4vB,QAASA,GAAe,CAACpvB,CAAD,CAAO,CEwS7B,IAAIuZ,EFvSoBvZ,CEuSb0a,YAAA,EZ1RGS,EY2RV,CAAkB5B,CAAlB,CAAJ,EACEgU,EAAA,CAAAhU,CAAA,CFvSF,QADM2B,CACN,CXoCcZ,CWrCG,CAAiBta,CAAjB,CACjB,GAAmBkb,CAAAtB,aAAnB,EAA4C,IAHf;AAM/B,IAAIyV,GAAc,CAKhBlpB,iBIqRcA,EJrRImpB,KAAA,CAAsBpyB,MAAtB,CALF,CAOhBiU,oBI6YcA,EJ7YOme,KAAA,CAAyBpyB,MAAzB,CAPL,CAAlB,CAWIqyB,GAAY,CAEdppB,iBI6QcA,EJ/QA,CAIdgL,oBIqYcA,EJzYA,CAMd,YAAAlP,QAAW,CAACjC,CAAD,CAAO,CAChB,MEfYiB,GFeL,CAAsB,IAAtB,CAA4BjB,CAA5B,CADS,CANJ,CAUd,aAAAiB,QAAY,CAACjB,CAAD,CAAO8iB,CAAP,CAAiB,CAC3B,MEnBY7hB,GFmBL,CAAsB,IAAtB,CAA4BjB,CAA5B,CAAkC8iB,CAAlC,CADoB,CAVf,CAcd,YAAA1gB,QAAW,CAACpC,CAAD,CAAO,CAChB,MEkEYoC,GFlEL,CAAqB,IAArB,CAA2BpC,CAA3B,CADS,CAdJ,CAqBd,aAAAsC,QAAY,CAACtC,CAAD,CAAO8iB,CAAP,CAAiB,CE7Bf7hB,EF8BZ,CAAsB,IAAtB,CAA4BjB,CAA5B,CAAkC8iB,CAAlC,CE2DY1gB,GF1DZ,CAAqB,IAArB,CAA2B0gB,CAA3B,CACA,OAAO9iB,EAHoB,CArBf,CA8Bd,UAAAc,QAAS,CAACW,CAAD,CAAO,CEmRhB,GAAsB,UAAtB,EFlR4BzB,IEkRxBuG,UAAJ,CACE,IAAA,EAAO6d,CAAAtjB,UAAArE,KAAA,CFnRmBuD,IEmRnB,CFnRyByB,CEmRzB,CADT,KAIE,IADIkV,CFrR4BlV,CEqRxB2iB,CAAAtjB,UAAArE,KAAA,CFrRkBuD,IEqRlB,CAAmC,CAAA,CAAnC,CFrRwByB,CAAAA,CEsRhC,CAAU,CACJwF,CAAAA,CFvRoBjH,IEuRfE,WACT,KAFQ,IAECtC,EAAE,CAFH,CAEMmoB,CAAd,CAAkBnoB,CAAlB,CAAsBqJ,CAAAzH,OAAtB,CAAiC5B,CAAA,EAAjC,CACEmoB,CACA,CADK9e,CAAA,CAAGrJ,CAAH,CAAAkD,UAAA,CAAgB,CAAA,CAAhB,CACL;AAAA6V,CAAA1U,YAAA,CAAc8jB,CAAd,CAJM,CFtRV,MAAO,EADO,CA9BF,CAqCd,YAAArL,QAAW,EAAU,CACnB,MEiLYA,GFjLL,CAAqB,IAArB,CADY,CArCP,CAyCd,SAAA2B,QAAQ,CAACrc,CAAD,CAAO,CACb,MV2CYqc,GU3CL,CAAe,IAAf,CAAqBrc,CAArB,CADM,CAzCD,CAgDd,cAAA+X,QAAa,CAAC5H,CAAD,CAAQ,CT7DPvG,ES8DZ,EACA,OAAOmO,EAAAA,cAAAtb,KAAA,CAAmB,IAAnB,CAAyB0T,CAAzB,CAFY,CAhDP,CAyDhBzT;MAAAqF,iBAAA,CAAwBwtB,EAAxB,CFiGmCC,CAEjCC,YAAa,CAIX,IAAA7yB,QAAG,EAAG,CACJ,GAAI6jB,EAAJ,EAAyBA,EAAAhkB,KAAA,CAAuB,IAAvB,CAAzB,CACE,MAAO,CAAA,CAET,IAAI,IAAA0D,SAAJ,EAAqBC,IAAAG,uBAArB,CACE,MAAO,CAAA,CAGT,KAAMqF,EAAgB,IAAAA,cACtB,IRtFOwW,EQsFP,CACE,IAAI2F,CAAAA,SAAAtlB,KAAA,CAAoBmJ,CAApB,CAAmC,IAAnC,CAAJ,CACE,MAAO,CAAA,CADT,CADF,IAIO,IAAIA,CAAAf,gBAAJ,EACLkd,CAAAA,SAAAtlB,KAAA,CAAoBmJ,CAAAf,gBAApB,CAAmD,IAAnD,CADK,CAEL,MAAO,CAAA,CAIT,KADI7E,CACJ,CADW,IACX,CAAOA,CAAP,EAAe,EAAEA,CAAF,WAAkB0C,SAAlB,CAAf,CAAA,CACE1C,CAAA,CAAOA,CAAA0F,WAAP,GRvLQyV,CQuLmB,CAAkBnb,CAAlB,CAAA,CAAoDA,CAAD2V,KAAnD,CAAiEzM,IAAAA,EAA5F,CAEF,OAAO,CAAC,EAAElJ,CAAF,EAAUA,CAAV,WAA0B0C,SAA1B,CAtBJ,CAJK,CA4BX7F,aAAc,CAAA,CA5BH,CAFoB2yB,CEjGnC,CAGA;IAAIE,GAAY,CAIV9V,gBAAe,EAAA,CACjB,MAAOwV,GAAA,CAAgB,IAAhB,CADU,CAJL,CAAhB,CASIO,GAAgB,CAMlB,cAAA7tB,QAAa,CAAC7B,CAAD,CAAW,CAOtB,MEwKYulB,GF7KC,CAAe,IAAf,CAAqB,QAAQ,CAAC7O,CAAD,CAAI,CAC5C,MVhEG2E,GAAA7e,KAAA,CUgE0Bka,CVhE1B,CUgE6B1W,CVhE7B,CU+DyC,CAAjC,CAEV,QAAQ,CAAC0W,CAAD,CAAI,CACb,MAAO,CAAA,CAAQA,CADF,CAFF,CAAAkP,CAIV,CAJUA,CAKb,EAAiB,IAPK,CANN,CAsBlB,iBAAAjkB,QAAgB,CAAC3B,CAAD,CAAWoQ,CAAX,CAAsB,CACpC,GAAIA,CAAJ,CAAe,CACPuf,CAAAA,CAAIhxB,KAAAtC,UAAA0C,MAAAvC,KAAA,CAA2BmF,CAAAA,iBAAA,CAAiB,IAAjB,CAAuB3B,CAAvB,CAA3B,CACV,KAAMsZ,EAAO,IAAAmB,YAAA,EACb,OAAOkV,EAAAzR,OAAA,CAAS,QAAA,CAAAtiB,CAAA,CAAK,CAAA,MAAAA,EAAA6e,YAAA,EAAA,EAAmBnB,CAAnB,CAAd,CAHM,CAKf,MEyJYiM,GFzJL,CAAe,IAAf,CAAqB,QAAQ,CAAC7O,CAAD,CAAI,CACtC,MVpFG2E,GAAA7e,KAAA,CUoF0Bka,CVpF1B,CUoF6B1W,CVpF7B,CUmFmC,CAAjC,CAN6B,CAtBpB,CATpB,CA4CI4vB,GAAY,CAKd,cAAAhW,QAAa,CAACgO,CAAD,CAAU,CACrB,GAAuB,MAAvB,GAAI,IAAAthB,UAAJ,CAA+B,CEyKjC,IAAIgT,EFxKwBnR,IEwKjBsS,YAAA,EZ1RGS,EY2RV,CAAkB5B,CAAlB,CAAJ,EACEgU,EAAA,CAAAhU,CAAA,CFxKE,OAAO,CADD2B,CACC,CX3FGZ,CW0FO,CAAiB,IAAjB,CACV,GACHuN,CAAA,EAAWA,CAAA7Q,QAAX;AAA6BkE,CAAAzB,EAA7B,CACAyB,CAAArB,cAFG,GAEwB,EAFxB,CAGL,EAN2B,CADV,CALT,CA5ChB,CA8DIiW,GVxFYhU,EUwFG,CAAgB,CAKjC,aAAApT,QAAY,CAACnB,CAAD,CAAOC,CAAP,CAAc,CEgKZkB,EF/JZ,CAAsB,IAAtB,CAA4BnB,CAA5B,CAAkCC,CAAlC,CADwB,CALO,CAYjC,gBAAAgP,QAAe,CAACjP,CAAD,CAAO,CEsKtB6c,CAAA5N,gBAAA/Z,KAAA,CFrK2BuD,IEqK3B,CFrKiCuH,CEqKjC,CACA0d,GAAA,CFtK2BjlB,IEsK3B,CFtKiCuH,CEsKjC,CFvKsB,CAZW,CAmBjC,aAAAkT,QAAY,CAACoN,CAAD,CAAU,CDkVtB,GAAI,CCjVkBlS,IDiVtB,CACE,KAAM,sBAAN,CAEF,GAAI,CCpVwBkS,CDoV5B,CACE,KAAM,uBAAN,CCrVA,MDuVK,KAAIrF,EAAJ,CAAcmK,EAAd,CCvVehX,IDuVf,CCvVqBkS,CDuVrB,CCxVe,CAnBW,CA0B7BnD,QAAO,EAAA,CACT,MAAO,KAAAvR,aAAA,CAAkB,MAAlB,CADE,CA1BsB,CAiC7BuR,QAAK,CAAAld,CAAA,CAAO,CEoIFkB,EFnIZ,CAAsB,IAAtB,CAA4B,MAA5B,CAAoClB,CAApC,CADc,CAjCiB,CAwC7BoS,gBAAe,EAAA,CACjB,MAAOwV,GAAA,CAAgB,IAAhB,CADU,CAxCc,CAAhB,CA4ChBO,EA5CgB,CA4CDE,EA5CC,CA8CnBnzB,OAAAqF,iBAAA,CAAwB+tB,EAAxB,CFyOWpO,EEzOX,CAEA;IAAIqO,GVxIYjU,EUwII,CAAgB,CAIlC,WAAA/Y,QAAU,CAAC/C,CAAD,CAAOyB,CAAP,CAAa,CACrB,MEsJYsB,GFtJL,CAAoB/C,CAApB,CAA0ByB,CAA1B,CADc,CAJW,CAWlC,eAAA8c,QAAc,CAAC3P,CAAD,CAAK,CAMjB,ME+DY4W,GFpEC,CAAe,IAAf,CAAqB,QAAQ,CAAC7O,CAAD,CAAI,CAC5C,MAAOA,EAAA/H,GAAP,EAAeA,CAD6B,CAAjC,CAEV,QAAQ,CAAC+H,CAAD,CAAI,CACb,MAAO,CAAA,CAAQA,CADF,CAFF,CAAAkP,CAIV,CAJUA,CAKb,EAAiB,IANA,CAXe,CAAhB,CAoBjB8J,EApBiB,CAsBpBjzB,OAAAqF,iBAAA,CAAwBguB,EAAxB,CAAuC,CACrC,eFiOSnO,EEjOSC,cADmB,CAAvC,CAIA;IAAImO,GAAanuB,WAAAvF,UAAA2zB,KAAjB,CAEIC,GVpKYpU,EUoKO,CAAgB,CAIrC,KAAAmU,QAAI,EAAG,CACL,IAAM/U,EXrLMZ,CWqLK,CAAiB,IAAjB,CAGjB,EADI6V,CACJ,EAFI5W,CAEJ,CAFW2B,CAEX,EAFuBA,CAAA3B,KAEvB,GAD2BA,CAAAsI,cAC3B,EACEsO,CAAAF,KAAA,EADF,CAGED,EAAAvzB,KAAA,CAAgB,IAAhB,CAPG,CAJ8B,CAAhB,CAFvB,CAkBM2zB,GAAkB,CACtB,iBAAAjqB,QAAgB,CAACyH,CAAD,CAAOwa,CAAP,CAAWgB,CAAX,CAA6B,CACX,QAAhC,GAAI,MAAOA,EAAX,GACEA,CADF,CACqB,CACjBV,QAAS,CAAA,CAAQU,CADA,CADrB,CAKAA,EAAAG,GAAA,CAAiC,IACjC,KAAA5T,KAAAxP,iBAAA,CAA2ByH,CAA3B,CAAiCwa,CAAjC,CAAqCgB,CAArC,CAP2C,CADvB,CAWtB,oBAAAjY,QAAmB,CAACvD,CAAD,CAAOwa,CAAP,CAAWgB,CAAX,CAA6B,CACd,QAAhC,GAAI,MAAOA,EAAX,GACEA,CADF,CACqB,CACjBV,QAAS,CAAA,CAAQU,CADA,CADrB,CAKAA,EAAAG,GAAA,CAAiC,IACjC,KAAA5T,KAAAxE,oBAAA,CAA8BvD,CAA9B,CAAoCwa,CAApC,CAAwCgB,CAAxC,CAP8C,CAX1B,CAqBtB,eAAA7K,QAAc,CAAC3P,CAAD,CAAK,CAMjB,MESY4W,GFdC,CAAe,IAAf,CAAqB,QAAQ,CAAC7O,CAAD,CAAI,CAC5C,MAAOA,EAAA/H,GAAP,EAAeA,CAD6B,CAAjC,CAEV,QAAQ,CAAC+H,CAAD,CAAI,CACb,MAAO,CAAA,CAAQA,CADF,CAFF,CAAAkP,CAIV,CAJUA,CAKb,EAAiB,IANA,CArBG,CA+BxBwK;QAASA,EAAY,CAACtQ,CAAD,CAAQ3a,CAAR,CAAa,CAEhC,IADA,IAAI3F,EAAK/C,MAAAgD,oBAAA,CAA2B0F,CAA3B,CAAT,CACSxH,EAAE,CAAX,CAAcA,CAAd,CAAkB6B,CAAAD,OAAlB,CAA6B5B,CAAA,EAA7B,CAAkC,CAChC,IAAI+Y,EAAIlX,CAAA,CAAG7B,CAAH,CAAR,CACIywB,EAAI3xB,MAAA6b,yBAAA,CAAgCnT,CAAhC,CAAqCuR,CAArC,CAIJ0X,EAAA7mB,MAAJ,CACEuY,CAAA,CAAMpJ,CAAN,CADF,CACa0X,CAAA7mB,MADb,CAGE9K,MAAAC,eAAA,CAAsBojB,CAAtB,CAA6BpJ,CAA7B,CAAgC0X,CAAhC,CAT8B,CAFF,C,CM3PlC,GhBnBW9T,CgBmBPM,GAAJ,CAA0B,CACxB,IAAIyV,SAAW,CAEb,MhBtBO/V,CgBsBEM,GAFI,CAUb,MAAS0V,QAAA,CAACvwB,CAAD,CAAU,CRsgBZ4iB,EQrgBL,CAA4B5iB,CAA5B,CR0fK2iB,GQzfL,CAA6B3iB,CAA7B,CACA,OAAOA,EAHU,CAVN,CAeb,YhBbYmb,CgBFC,CAgBb,QfhCYsB,EegBC,CAiBb,MfzBY7S,EeQC,CAkBb,ShBtCO2Q,CgBoBM,CAmBb,gBdwCYsD,Ec3DC,CAoBb,gBdYOV,EchCM,CAqBb,kBd4BOM,EcjDM,CAsBb,cAAiB2G,CAtBJ,CAuBb,WTxCSjE,CSiBI,CA0BfjjB,OAAA,SAAA,CAAqBozB,QF2brBpzB,OAAAb,MAAA,CAAeiuB,EACfptB,OAAAC,YAAA,CAAqBotB,EACrBrtB,OAAAW,WAAA,CAAoB2sB,EACpBP,GAAA,EJtMA,KAAIuG,GACDtzB,MAAA,eADCszB,EAC2BtzB,MAAA,eAAA,kBAD3BszB,EAEF3uB,WAEFwuB,EAAA,CD1QW7N,EC0QElmB,UAAb,CAAkC8zB,EAAlC,CACAC,EAAA,CAAanzB,MAAAkD,KAAA9D,UAAb,CAAoCizB,EAApC,CACAc,EAAA,CAAanzB,MAAAmhB,OAAA/hB,UAAb,CAAsC+yB,EAAtC,CACAgB,EAAA,CAAanzB,MAAAuzB,KAAAn0B,UAAb,CAAoCozB,EAApC,CACAW,EAAA,CAAanzB,MAAA6D,iBAAAzE,UAAb;AAAgDqzB,EAAhD,CACAU,EAAA,CAAanzB,MAAAsG,QAAAlH,UAAb,CAAuCwzB,EAAvC,CACAO,EAAA,CAAanzB,MAAAwF,SAAApG,UAAb,CAAwCyzB,EAAxC,CACI7yB,OAAAwzB,gBAAJ,EACEL,CAAA,CAAanzB,MAAAwzB,gBAAAp0B,UAAb,CAA+CuzB,EAA/C,CAEFQ,EAAA,CAAaG,EAAAl0B,UAAb,CAA0C4zB,EAA1C,CVpTS3V,EU0TLK,EAAJ,GFuKc0H,EEtKZ,CAAeplB,MAAAkD,KAAA9D,UAAf,CAMA,CFgKYgmB,EErKZ,CAAeplB,MAAAuzB,KAAAn0B,UAAf,CAKA,CFgKYgmB,EEpKZ,CAAeplB,MAAA6D,iBAAAzE,UAAf,CAIA,CFgKYgmB,EEnKZ,CAAeplB,MAAAsG,QAAAlH,UAAf,CAGA,CFgKYgmB,EElKZ,CAAekO,EAAAl0B,UAAf,CAEA,CFgKYgmB,EEjKZ,CAAeplB,MAAAwF,SAAApG,UAAf,CACA,CAAIY,MAAAwzB,gBAAJ,EFgKYpO,EE/JV,CAAeplB,MAAAwzB,gBAAAp0B,UAAf,CARJ,CF8KcimB,GEnKd,EMhRArlB,OAAAyzB,WAAA,CPrBWnO,EOba,C,CC9B1B,IAAMoO,GAAkB,IAAI7T,GAAJ,CAAQ,kHAAA,MAAA,CAAA,GAAA,CAAR,CAejB8T,SAASA,GAAwB,CAACtqB,CAAD,CAAY,CAClD,IAAMuqB,EAAWF,EAAAG,IAAA,CAAoBxqB,CAApB,CACXyqB,EAAAA,CAAY,kCAAAj0B,KAAA,CAAwCwJ,CAAxC,CAClB,OAAO,CAACuqB,CAAR,EAAoBE,CAH8B,CAW7CvB,QAASA,EAAW,CAACzvB,CAAD,CAAO,CAEhC,IAAMixB,EAAcjxB,CAAAyvB,YACpB,IAAoBvmB,IAAAA,EAApB,GAAI+nB,CAAJ,CACE,MAAOA,EAKT,KAAA,CAAO1K,CAAP,EAAkB,EAAEA,CAAA2K,sBAAF,EAAmC3K,CAAnC,WAAsD7jB,SAAtD,CAAlB,CAAA,CACE6jB,CAAA,CAAUA,CAAA7gB,WAAV,GAAiCxI,MAAAyzB,WAAA,EAAqBpK,CAArB,WAAwCoK,WAAxC,CAAqDpK,CAAA5Q,KAArD,CAAoEzM,IAAAA,EAArG,CAEF,OAAO,EAAGqd,CAAAA,CAAH,EAAe,EAAAA,CAAA2K,sBAAA,EAAiC3K,CAAjC,WAAoD7jB,SAApD,CAAf,CAZyB;AAoBlCyuB,QAASA,GAA4B,CAAC5X,CAAD,CAAO6X,CAAP,CAAc,CAEjD,IAAA,CAAOpxB,CAAP,EAAeA,CAAf,GAAwBuZ,CAAxB,EAAgC,CAACvZ,CAAA4X,YAAjC,CAAA,CACE5X,CAAA,CAAOA,CAAA0F,WAET,OAAS1F,EAAF,EAAUA,CAAV,GAAmBuZ,CAAnB,CAAkCvZ,CAAA4X,YAAlC,CAA2B,IALe;AAsB5CyZ,QAASA,GAA0B,CAAC9X,CAAD,CAAOvS,CAAP,CAAiBsqB,CAAjB,CAA6C,CAA5BA,CAAA,CAAA,IAAA,EAAA,GAAAA,CAAA,CAAiB,IAAIvU,GAArB,CAAAuU,CAEzD,KADA,IAAItxB,EAAOuZ,CACX,CAAOvZ,CAAP,CAAA,CAAa,CACX,GAAIA,CAAAG,SAAJ,GAAsBC,IAAA8G,aAAtB,CAAyC,CACvC,IAAMkB,EAAkCpI,CAExCgH,EAAA,CAASoB,CAAT,CAEA,KAAM7B,EAAY6B,CAAA7B,UAClB,IAAkB,MAAlB,GAAIA,CAAJ,EAA4D,QAA5D,GAA4B6B,CAAA+K,aAAA,CAAqB,KAArB,CAA5B,CAAsE,CAG9DpQ,CAAAA,CAAmCqF,CAAA0P,OACzC,IAAI/U,CAAJ,WAA0B3C,KAA1B,EAAkC,CAACkxB,CAAAP,IAAA,CAAmBhuB,CAAnB,CAAnC,CAIE,IAFAuuB,CAAAjU,IAAA,CAAmBta,CAAnB,CAES3B,CAAAA,CAAAA,CAAQ2B,CAAA1B,WAAjB,CAAwCD,CAAxC,CAA+CA,CAA/C,CAAuDA,CAAAwW,YAAvD,CACEyZ,EAAA,CAA2BjwB,CAA3B,CAAkC4F,CAAlC,CAA4CsqB,CAA5C,CAOJtxB,EAAA,CAAOmxB,EAAA,CAA6B5X,CAA7B,CAAmCnR,CAAnC,CACP,SAjBoE,CAAtE,IAkBO,IAAkB,UAAlB,GAAI7B,CAAJ,CAA8B,CAKnCvG,CAAA,CAAOmxB,EAAA,CAA6B5X,CAA7B,CAAmCnR,CAAnC,CACP,SANmC,CAWrC,GADMuZ,CACN,CADmBvZ,CAAAmpB,gBACnB,CACE,IAASnwB,CAAT,CAAiBugB,CAAAtgB,WAAjB,CAAwCD,CAAxC,CAA+CA,CAA/C,CAAuDA,CAAAwW,YAAvD,CACEyZ,EAAA,CAA2BjwB,CAA3B,CAAkC4F,CAAlC,CAA4CsqB,CAA5C,CArCmC,CA0CzCtxB,CAAA,CAAsBA,CArDjBqB,WAAA,CAqDiBrB,CArDEqB,WAAnB,CAAsC8vB,EAAA,CAqD3B5X,CArD2B,CAqDrBvZ,CArDqB,CAUhC,CAFwE,CA0DhFwxB,QAASA,EAAoB,CAACC,CAAD,CAAclqB,CAAd,CAAoBC,CAApB,CAA2B,CAC7DiqB,CAAA,CAAYlqB,CAAZ,CAAA,CAAoBC,CADyC,C,CC1H7DmE,QADmB+lB,GACR,EAAG,CAEZ,IAAAC,EAAA,CAA8B,IAAIC,GAGlC,KAAAC,EAAA,CAAgC,IAAID,GAGpC,KAAAE,EAAA,CAAgB,EAGhB,KAAAC,EAAA,CAAmB,CAAA,CAXP,CAkBdC,QAAA,GAAa,CAAbA,CAAa,CAACzrB,CAAD,CAAY0rB,CAAZ,CAAwB,CACnC,CAAAN,EAAArsB,IAAA,CAAgCiB,CAAhC,CAA2C0rB,CAA3C,CACA,EAAAJ,EAAAvsB,IAAA,CAAkC2sB,CAAAtmB,YAAlC,CAA0DsmB,CAA1D,CAFmC,CAwBrCC,QAAA,GAAQ,CAARA,CAAQ,CAACC,CAAD,CAAW,CACjB,CAAAJ,EAAA,CAAmB,CAAA,CACnB,EAAAD,EAAA3V,KAAA,CAAmBgW,CAAnB,CAFiB,CAQnBC,QAAA,GAAS,CAATA,CAAS,CAACpyB,CAAD,CAAO,CACT,CAAA+xB,EAAL,EDaYV,ECXZ,CAAqCrxB,CAArC,CAA2C,QAAA,CAAAoI,CAAA,CAAW,CAAA,MAHxC,EAGwCmoB,EAAA,CAAWnoB,CAAX,CAAA,CAAtD,CAHc,CAShB,EAAA,UAAA,EAAA,CAAAmoB,QAAK,CAACvwB,CAAD,CAAO,CACV,GAAK,IAAA+xB,EAAL,EAEIM,CAAAryB,CAAAqyB,aAFJ,CAEA,CACAryB,CAAAqyB,aAAA,CAAoB,CAAA,CAEpB,KAAK,IAAIz0B,EAAI,CAAb,CAAgBA,CAAhB,CAAoB,IAAAk0B,EAAAtyB,OAApB,CAA0C5B,CAAA,EAA1C,CACE,IAAAk0B,EAAA,CAAcl0B,CAAd,CAAA,CAAiBoC,CAAjB,CAJF,CAHU,CAcZsyB,SAAA,EAAW,CAAXA,CAAW,CAAC/Y,CAAD,CAAO,CAChB,IAAMqM,EAAW,EDVLyL,GCYZ,CAAqC9X,CAArC,CAA2C,QAAA,CAAAnR,CAAA,CAAW,CAAA,MAAAwd,EAAAzJ,KAAA,CAAc/T,CAAd,CAAA,CAAtD,CAEA,KAASxK,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBgoB,CAAApmB,OAApB,CAAqC5B,CAAA,EAArC,CAA0C,CACxC,IAAMwK,EAAUwd,CAAA,CAAShoB,CAAT,CC/EZ20B,EDgFJ,GAAInqB,CAAAoqB,WAAJ,CACE,CAAAC,kBAAA,CAAuBrqB,CAAvB,CADF,CAGEsqB,EAAA,CAAAA,CAAA,CAAoBtqB,CAApB,CALsC,CAL1B;AAkBlBuqB,QAAA,EAAc,CAAdA,CAAc,CAACpZ,CAAD,CAAO,CACnB,IAAMqM,EAAW,ED5BLyL,GC8BZ,CAAqC9X,CAArC,CAA2C,QAAA,CAAAnR,CAAA,CAAW,CAAA,MAAAwd,EAAAzJ,KAAA,CAAc/T,CAAd,CAAA,CAAtD,CAEA,KAASxK,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBgoB,CAAApmB,OAApB,CAAqC5B,CAAA,EAArC,CAA0C,CACxC,IAAMwK,EAAUwd,CAAA,CAAShoB,CAAT,CCjGZ20B,EDkGJ,GAAInqB,CAAAoqB,WAAJ,EACE,CAAAI,qBAAA,CAA0BxqB,CAA1B,CAHsC,CALvB;AA+ErByqB,QAAA,EAAmB,CAAnBA,CAAmB,CAACtZ,CAAD,CAAOsO,CAAP,CAAqB,CAAdA,CAAA,CAAA,IAAA,EAAA,GAAAA,CAAA,CAAU,EAAV,CAAAA,CACxB,KAAMyJ,EAAiBzJ,CAAAyJ,GAAjBA,EAA2C,IAAIvU,GAArD,CACM+V,EAAUjL,CAAAiL,GAAVA,EAA8B,QAAA,CAAA1qB,CAAA,CAAW,CAAA,MAAAsqB,GAAA,CAFTA,CAES,CAAoBtqB,CAApB,CAAA,CAD/C,CAGMwd,EAAW,ED9GLyL,GCyJZ,CAAqC9X,CAArC,CAzCuBwZ,QAAA,CAAA3qB,CAAA,CAAW,CAChC,GAA0B,MAA1B,GAAIA,CAAA7B,UAAJ,EAAoE,QAApE,GAAoC6B,CAAA+K,aAAA,CAAqB,KAArB,CAApC,CAA8E,CAG5E,IAAMpQ,EAAmCqF,CAAA0P,OAErC/U,EAAJ,WAA0B3C,KAA1B,GACE2C,CAAAmuB,sBAEA,CAFmC,CAAA,CAEnC,CAAAnuB,CAAAiwB,iBAAA,CAA8B,CAAA,CAHhC,CAMIjwB,EAAJ,EAA4C,UAA5C,GAAkBA,CAAAmO,WAAlB,CACEnO,CAAAkwB,yBADF,CACwC,CAAA,CADxC,CAKE7qB,CAAAjC,iBAAA,CAAyB,MAAzB,CAAiC,QAAA,EAAM,CACrC,IAAMpD,EAAmCqF,CAAA0P,OAEzC,IAAImb,CAAAlwB,CAAAkwB,yBAAJ,CAAA,CACAlwB,CAAAkwB,yBAAA,CAAsC,CAAA,CAOtC,KAAMC,EAAuB,IAAInW,GAAJ,CAAQuU,CAAR,CAC7B4B,EAAAvV,OAAA,CAA4B5a,CAA5B,CAEA8vB,EAAA,CArC8BA,CAqC9B,CAAyB9vB,CAAzB,CAAqC,CAACuuB,GAAgB4B,CAAjB,CAAuCJ,GAAAA,CAAvC,CAArC,CAXA,CAHqC,CAAvC,CAhB0E,CAA9E,IAkCElN,EAAAzJ,KAAA,CAAc/T,CAAd,CAnC8B,CAyClC,CAA2DkpB,CAA3D,CAEA;GAAI,CAAAS,EAAJ,CACE,IAASn0B,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBgoB,CAAApmB,OAApB,CAAqC5B,CAAA,EAArC,CACE,CAAA2yB,EAAA,CAAW3K,CAAA,CAAShoB,CAAT,CAAX,CAIJ,KAASA,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBgoB,CAAApmB,OAApB,CAAqC5B,CAAA,EAArC,CACEk1B,CAAA,CAAQlN,CAAA,CAAShoB,CAAT,CAAR,CAxDoC;AA+DxC80B,QAAA,GAAc,CAAdA,CAAc,CAACtqB,CAAD,CAAU,CAEtB,GAAqBc,IAAAA,EAArB,GADqBd,CAAAoqB,WACrB,CAAA,CAYA,IAAM5sB,EAAgBwC,CAAAxC,cACtB,IACGA,CAAAutB,YADH,EAEIvtB,CAAAsrB,sBAFJ,EAE2CtrB,CAAAotB,iBAF3C,CAMA,GADMf,CACN,CADmBmB,CAjOZzB,EAAA/0B,IAAA,CAiOuCwL,CAAA7B,UAjOvC,CAkOP,CAAA,CAEA0rB,CAAAoB,kBAAAlX,KAAA,CAAkC/T,CAAlC,CAEA,KAAMuD,EAAcsmB,CAAAtmB,YACpB,IAAI,CACF,GAAI,CAEF,GADaka,IAAKla,CAClB,GAAevD,CAAf,CACE,KAAUvC,MAAJ,CAAU,4EAAV,CAAN,CAHA,CAAJ,OAKU,CACRosB,CAAAoB,kBAAAC,IAAA,EADQ,CANR,CASF,MAAOz3B,CAAP,CAAU,CAEV,KADAuM,EAAAoqB,WACM32B,CC7QFyS,CD6QEzS,CAAAA,CAAN,CAFU,CAKZuM,CAAAoqB,WAAA,CCjRMD,CDkRNnqB,EAAAmrB,gBAAA,CAA0BtB,CAE1B,IAAIA,CAAAuB,yBAAJ,CAEE,IADMC,CACG71B,CADkBq0B,CAAAwB,mBAClB71B,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CAAoB61B,CAAAj0B,OAApB,CAA+C5B,CAAA,EAA/C,CAAoD,CAClD,IAAM2J,EAAOksB,CAAA,CAAmB71B,CAAnB,CAAb;AACM4J,EAAQY,CAAA+K,aAAA,CAAqB5L,CAArB,CACA,KAAd,GAAIC,CAAJ,EACE,CAAAgsB,yBAAA,CAA8BprB,CAA9B,CAAuCb,CAAvC,CAA6C,IAA7C,CAAmDC,CAAnD,CAA0D,IAA1D,CAJgD,CDhQ1CioB,CCyQR,CAAsBrnB,CAAtB,CAAJ,EACE,CAAAqqB,kBAAA,CAAuBrqB,CAAvB,CAlCF,CAnBA,CAFsB,CA8DxB,EAAA,UAAA,kBAAA,CAAAqqB,QAAiB,CAACrqB,CAAD,CAAU,CACzB,IAAM6pB,EAAa7pB,CAAAmrB,gBACftB,EAAAQ,kBAAJ,EACER,CAAAQ,kBAAAh2B,KAAA,CAAkC2L,CAAlC,CAHuB,CAU3B,GAAA,UAAA,qBAAA,CAAAwqB,QAAoB,CAACxqB,CAAD,CAAU,CAC5B,IAAM6pB,EAAa7pB,CAAAmrB,gBACftB,EAAAW,qBAAJ,EACEX,CAAAW,qBAAAn2B,KAAA,CAAqC2L,CAArC,CAH0B,CAc9B;EAAA,UAAA,yBAAA,CAAAorB,QAAwB,CAACprB,CAAD,CAAUb,CAAV,CAAgBmsB,CAAhB,CAA0BC,CAA1B,CAAoCC,CAApC,CAA+C,CACrE,IAAM3B,EAAa7pB,CAAAmrB,gBAEjBtB,EAAAuB,yBADF,EAEiD,EAFjD,CAEEvB,CAAAwB,mBAAA5e,QAAA,CAAsCtN,CAAtC,CAFF,EAIE0qB,CAAAuB,yBAAA/2B,KAAA,CAAyC2L,CAAzC,CAAkDb,CAAlD,CAAwDmsB,CAAxD,CAAkEC,CAAlE,CAA4EC,CAA5E,CANmE,C,CEhUvEjoB,QADmBkoB,GACR,CAACC,CAAD,CAAiB,CAAL/tB,IAAAA,ECoD4DjK,QDhDjF,KAAAi4B,EAAA,CAAkBD,CAKlB,KAAAE,EAAA,CAAiBjuB,CAKjB,KAAAwX,EAAA,CAAiBrU,IAAAA,EAKjB2pB,EAAA,CAAA,IAAAkB,EAAA,CAAoC,IAAAC,EAApC,CAEkC,UAAlC,GAAI,IAAAA,EAAA9iB,WAAJ,GACE,IAAAqM,EAMA,CANiB,IAAIlU,gBAAJ,CAAqB,IAAA4qB,EAAA3E,KAAA,CAA2B,IAA3B,CAArB,CAMjB,CAAA,IAAA/R,EAAArT,QAAA,CAAuB,IAAA8pB,EAAvB,CAAuC,CACrCliB,UAAW,CAAA,CAD0B,CAErCC,QAAS,CAAA,CAF4B,CAAvC,CAPF,CArB0B,CAmC5B,EAAA,UAAA,WAAA,CAAAgF,QAAU,EAAG,CACP,IAAAwG,EAAJ,EACE,IAAAA,EAAAxG,WAAA,EAFS,CASb,GAAA,UAAA,EAAA,CAAAkd,QAAgB,CAAChc,CAAD,CAAY,CAI1B,IAAM/G,EAAa,IAAA8iB,EAAA9iB,WACA,cAAnB,GAAIA,CAAJ,EAAmD,UAAnD,GAAoCA,CAApC,EACE,IAAA6F,WAAA,EAGF,KAASnZ,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBqa,CAAAzY,OAApB,CAAsC5B,CAAA,EAAtC,CAEE,IADA,IAAMsa,EAAaD,CAAA,CAAUra,CAAV,CAAAsa,WAAnB,CACS6T,EAAI,CAAb,CAAgBA,CAAhB,CAAoB7T,CAAA1Y,OAApB,CAAuCusB,CAAA,EAAvC,CAEE8G,CAAA,CAAA,IAAAkB,EAAA,CADa7b,CAAAlY,CAAW+rB,CAAX/rB,CACb,CAbsB,C,CE3C5B2L,QADmBuoB,GACR,EAAG,CAAA,IAAA,EAAA,IAWZ,KAAAC,EAAA,CANA,IAAAC,EAMA,CANclrB,IAAAA,EAYd,KAAAmrB,EAAA,CAAgB,IAAI/kB,OAAJ,CAAY,QAAA,CAAAlD,CAAA,CAAW,CACrC,CAAA+nB,EAAA,CAAgB/nB,CAEZ,EAAAgoB,EAAJ,EACEhoB,CAAA,CAAQ,CAAAgoB,EAAR,CAJmC,CAAvB,CAjBJ,CA6Bd,EAAA,UAAA,QAAA,CAAAhoB,QAAO,CAAC5E,CAAD,CAAQ,CACb,GAAI,IAAA4sB,EAAJ,CACE,KAAUvuB,MAAJ,CAAU,mBAAV,CAAN,CAGF,IAAAuuB,EAAA,CAAc5sB,CAEV,KAAA2sB,EAAJ,EACE,IAAAA,EAAA,CAAc3sB,CAAd,CARW,C,CDpBfmE,QALmB2oB,EAKR,CAACR,CAAD,CAAY,CAKrB,IAAAS,GAAA,CAAmC,CAAA,CAMnC,KAAAR,EAAA,CAAkBD,CAMlB,KAAAU,GAAA,CAA4B,IAAI5C,GAOhC,KAAA6C,GAAA,CAAsBC,QAAA,CAAAtM,CAAA,CAAM,CAAA,MAAAA,EAAA,EAAA,CAM5B,KAAAuM,EAAA,CAAqB,CAAA,CAMrB,KAAAC,GAAA,CAA2B,EAM3B,KAAAC,GAAA,CAAqC,IDrD1BhB,ECqD0B,CAAiCC,CAAjC,CA1ChB,CAiDvB,CAAA,CA9DF,CAAAgB,UA8DEC;CAAAC,OAAA,CAAAA,QAAM,CAACzuB,CAAD,CAAYoF,CAAZ,CAAyB,CAAA,IAAA,EAAA,IAC7B,IAAI,EAAEA,CAAF,WAAyBspB,SAAzB,CAAJ,CACE,KAAM,KAAItnB,SAAJ,CAAc,gDAAd,CAAN,CAGF,GAAI,CJpDQkjB,EIoDP,CAAmCtqB,CAAnC,CAAL,CACE,KAAM,KAAI2uB,WAAJ,CAAgB,oBAAhB,CAAqC3uB,CAArC,CAA8C,iBAA9C,CAAN,CAGF,GAAI,IAAAwtB,EHvCGpC,EAAA/0B,IAAA,CGuCmC2J,CHvCnC,CGuCP,CACE,KAAUV,MAAJ,CAAU,8BAAV,CAAyCU,CAAzC,CAAkD,6BAAlD,CAAN,CAGF,GAAI,IAAAguB,GAAJ,CACE,KAAU1uB,MAAJ,CAAU,4CAAV,CAAN,CAEF,IAAA0uB,GAAA,CAAmC,CAAA,CAOnC,IAAI,CAOFY,IAASA,EAATA,QAAoB,CAAC5tB,CAAD,CAAO,CACzB,IAAM6tB,EAAgB94B,CAAA,CAAUiL,CAAV,CACtB,IAAsB2B,IAAAA,EAAtB,GAAIksB,CAAJ,EAAmC,EAAEA,CAAF,WAA2BH,SAA3B,CAAnC,CACE,KAAUpvB,MAAJ,CAAU,OAAV,CAAkB0B,CAAlB,CAAsB,gCAAtB,CAAN;AAEF,MAAO6tB,EALkB,CAA3BD,CALM74B,EAAYqP,CAAArP,UAClB,IAAI,EAAEA,CAAF,WAAuBI,OAAvB,CAAJ,CACE,KAAM,KAAIiR,SAAJ,CAAc,8DAAd,CAAN,CAWF,IAAA8kB,EAAoB0C,CAAA,CAAY,mBAAZ,CACpB,KAAAvC,EAAuBuC,CAAA,CAAY,sBAAZ,CACvB,KAAAE,EAAkBF,CAAA,CAAY,iBAAZ,CAClB,KAAA3B,EAA2B2B,CAAA,CAAY,0BAAZ,CAC3B,KAAA1B,EAAqB9nB,CAAA,mBAArB8nB,EAA0D,EAnBxD,CAoBF,MAAO53B,CAAP,CAAU,CACV,MADU,CApBZ,OAsBU,CACR,IAAA04B,GAAA,CAAmC,CAAA,CAD3B,CAIJtC,CAAAA,CAAa,CACjB1rB,UAAAA,CADiB,CAEjBoF,YAAAA,CAFiB,CAGjB8mB,kBAAAA,CAHiB,CAIjBG,qBAAAA,CAJiB,CAKjByC,gBAAAA,CALiB,CAMjB7B,yBAAAA,CANiB,CAOjBC,mBAAAA,CAPiB,CAQjBJ,kBAAmB,EARF,CAWnBrB,GAAA,CAAA,IAAA+B,EAAA,CAA8BxtB,CAA9B,CAAyC0rB,CAAzC,CACA,KAAA2C,GAAAzY,KAAA,CAA8B8V,CAA9B,CAIK;IAAA0C,EAAL,GACE,IAAAA,EACA,CADqB,CAAA,CACrB,CAAA,IAAAF,GAAA,CAAoB,QAAA,EAAM,CAAA,MAAAa,GAAA,CAAAA,CAAA,CAAA,CAA1B,CAFF,CAjE6B,CAuE/BP,EAAAjC,GAAA,CAAAA,QAAO,CAAC1qB,CAAD,CAAU,CACfyqB,CAAA,CAAA,IAAAkB,EAAA,CAAoC3rB,CAApC,CADe,CAIjBktB;QAAA,GAAM,CAANA,CAAM,CAAG,CAIP,GAA2B,CAAA,CAA3B,GAAI,CAAAX,EAAJ,CAAA,CACA,CAAAA,EAAA,CAAqB,CAAA,CAiBrB,KAfA,IAAMY,EAAqB,CAAAX,GAA3B,CAOMY,EAAgC,EAPtC,CAcMC,EAAiC,IAAI7D,GAd3C,CAeSh0B,EAAI,CAAb,CAAgBA,CAAhB,CAAoB23B,CAAA/1B,OAApB,CAA+C5B,CAAA,EAA/C,CACE63B,CAAAnwB,IAAA,CAAmCiwB,CAAA,CAAmB33B,CAAnB,CAAA2I,UAAnC,CAAoE,EAApE,CAGFssB,EAAA,CAAA,CAAAkB,EAAA,CAAoCj4B,QAApC,CAA8C,CAC5Cg3B,GAASA,QAAA,CAAA1qB,CAAA,CAAW,CAElB,GAA2Bc,IAAAA,EAA3B,GAAId,CAAAoqB,WAAJ,CAAA,CAEA,IAAMjsB,EAAY6B,CAAA7B,UAAlB,CAIMmvB,EAAkBD,CAAA74B,IAAA,CAAmC2J,CAAnC,CACpBmvB,EAAJ,CACEA,CAAAvZ,KAAA,CAAqB/T,CAArB,CADF,CApCG,CAwCQ2rB,EHjJRpC,EAAA/0B,IAAA,CGiJ8C2J,CHjJ9C,CG6IH,EAKEivB,CAAArZ,KAAA,CAAmC/T,CAAnC,CAZF,CAFkB,CADwB,CAA9C,CAqBA,KAASxK,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB43B,CAAAh2B,OAApB,CAA0D5B,CAAA,EAA1D,CACE80B,EAAA,CAAA,CAAAqB,EAAA,CAA+ByB,CAAA,CAA8B53B,CAA9B,CAA/B,CAIF,KAAA,CAAmC,CAAnC,CAAO23B,CAAA/1B,OAAP,CAAA,CAAsC,CACpC,IAAMyyB,EAAasD,CAAAtZ,MAAA,EACb1V,EAAAA,CAAY0rB,CAAA1rB,UAGZovB,EAAAA,CAA4BF,CAAA74B,IAAA,CAAmCq1B,CAAA1rB,UAAnC,CAClC,KAAK,IAAI3I,EAAI,CAAb,CAAgBA,CAAhB,CAAoB+3B,CAAAn2B,OAApB,CAAsD5B,CAAA,EAAtD,CACE80B,EAAA,CAAA,CAAAqB,EAAA,CAA+B4B,CAAA,CAA0B/3B,CAA1B,CAA/B,CAKF,EADMg4B,CACN,CADiB,CAAApB,GAAA53B,IAAA,CAA8B2J,CAA9B,CACjB,GACEqvB,CAAAxpB,QAAA,CAAiBlD,IAAAA,EAAjB,CAbkC,CAhDtC,CAJO,CA0ET6rB,CAAAn4B,IAAA,CAAAA,QAAG,CAAC2J,CAAD,CAAY,CAEb,GADM0rB,CACN,CADmB,IAAA8B,EHpLZpC,EAAA/0B,IAAA,CGoLkD2J,CHpLlD,CGqLP,CACE,MAAO0rB,EAAAtmB,YAHI,CAafopB;CAAAc,GAAA,CAAAC,QAAW,CAACvvB,CAAD,CAAY,CACrB,GAAI,CJlNQsqB,EIkNP,CAAmCtqB,CAAnC,CAAL,CACE,MAAO+I,QAAAjC,OAAA,CAAe,IAAI6nB,WAAJ,CAAgB,GAAhB,CAAoB3uB,CAApB,CAA6B,uCAA7B,CAAf,CAGT,KAAMwvB,EAAQ,IAAAvB,GAAA53B,IAAA,CAA8B2J,CAA9B,CACd,IAAIwvB,CAAJ,CACE,MAAOA,ECtLF1B,EDyLDuB,EAAAA,CAAW,ICvON1B,EDwOX,KAAAM,GAAAlvB,IAAA,CAA8BiB,CAA9B,CAAyCqvB,CAAzC,CAEmB,KAAA7B,EH7MZpC,EAAA/0B,IAAAq1B,CG6MkD1rB,CH7MlD0rB,CGiNP,EAAkB,CAAC,IAAA2C,GAAAoB,KAAA,CAA8B,QAAA,CAAA3H,CAAA,CAAK,CAAA,MAAAA,EAAA9nB,UAAA,GAAgBA,CAAhB,CAAnC,CAAnB,EACEqvB,CAAAxpB,QAAA,CAAiBlD,IAAAA,EAAjB,CAGF,OAAO0sB,ECpMAvB,ED+Kc,CAwBvBU,EAAAkB,GAAA,CAAAA,QAAyB,CAACC,CAAD,CAAQ,CAC/B,IAAArB,GAAA9d,WAAA,EACA,KAAMof,EAAQ,IAAA1B,GACd,KAAAA,GAAA,CAAsBC,QAAA,CAAA9qB,CAAA,CAAS,CAAA,MAAAssB,EAAA,CAAM,QAAA,EAAM,CAAA,MAAAC,EAAA,CAAMvsB,CAAN,CAAA,CAAZ,CAAA,CAHA,CAQnC1M,OAAA,sBAAA,CAAkCo3B,CAClCA,EAAAh4B,UAAA,OAAA,CAA4Cg4B,CAAAh4B,UAAA04B,OAC5CV,EAAAh4B,UAAA,QAAA,CAA6Cg4B,CAAAh4B,UAAAw2B,GAC7CwB;CAAAh4B,UAAA,IAAA,CAAyCg4B,CAAAh4B,UAAAM,IACzC03B,EAAAh4B,UAAA,YAAA,CAAiDg4B,CAAAh4B,UAAAw5B,GACjDxB,EAAAh4B,UAAA,0BAAA,CAA+Dg4B,CAAAh4B,UAAA25B,G,CEpQ7DG,IAAAA,GAAwBl5B,MAAAwF,SAAApG,UAAAuG,cAAxBuzB,CACAC,GAA0Bn5B,MAAAwF,SAAApG,UAAAg6B,gBAD1BF,CAEAG,GAAqBr5B,MAAAwF,SAAApG,UAAAyG,WAFrBqzB,CAGAI,GAAkBt5B,MAAAwF,SAAApG,UAAAk6B,QAHlBJ,CAIAK,GAAiBv5B,MAAAwF,SAAApG,UAAAm6B,OAJjBL,CAKAM,GAA0Bx5B,MAAA6D,iBAAAzE,UAAAo6B,QAL1BN,CAMAO,GAAyBz5B,MAAA6D,iBAAAzE,UAAAq6B,OANzBP,CAOAQ,GAAgB15B,MAAAkD,KAAA9D,UAAAwE,UAPhBs1B,CAQAS,GAAkB35B,MAAAkD,KAAA9D,UAAA2F,YARlBm0B,CASAU,GAAmB55B,MAAAkD,KAAA9D,UAAA2E,aATnBm1B,CAUAW,GAAkB75B,MAAAkD,KAAA9D,UAAA8F,YAVlBg0B,CAWAY,GAAmB95B,MAAAkD,KAAA9D,UAAAgG,aAXnB8zB,CAYAa,GAAkBv6B,MAAA6b,yBAAA0e,CAAgC/5B,MAAAkD,KAAA9D,UAAhC26B;AAAuDA,aAAvDA,CAZlBb,CAaAc,GAAsBh6B,MAAAsG,QAAAlH,UAAA46B,aAbtBd,CAcAe,GAAmBz6B,MAAA6b,yBAAA4e,CAAgCj6B,MAAAsG,QAAAlH,UAAhC66B,CAA0DA,WAA1DA,CAdnBf,CAeAgB,GAAsBl6B,MAAAsG,QAAAlH,UAAA6W,aAftBijB,CAgBAiB,GAAsBn6B,MAAAsG,QAAAlH,UAAAoM,aAhBtB0tB,CAiBAkB,GAAyBp6B,MAAAsG,QAAAlH,UAAAka,gBAjBzB4f,CAkBAmB,GAAwBr6B,MAAAsG,QAAAlH,UAAAk7B,eAlBxBpB,CAmBAqB,GAAwBv6B,MAAAsG,QAAAlH,UAAAo7B,eAnBxBtB,CAoBAuB,GAA2Bz6B,MAAAsG,QAAAlH,UAAAs7B,kBApB3BxB,CAqBAyB,GAA+B36B,MAAAsG,QAAAlH,UAAAu7B,sBArB/BzB,CAsBA0B,GAA4B56B,MAAAsG,QAAAlH,UAAAw7B,mBAtB5B1B,CAuBA2B,GAAiB76B,MAAAsG,QAAAlH,UAAAy7B,QAvBjB3B;AAwBA4B,GAAgB96B,MAAAsG,QAAAlH,UAAA07B,OAxBhB5B,CAyBA6B,GAAgB/6B,MAAAsG,QAAAlH,UAAA27B,OAzBhB7B,CA0BA8B,GAAeh7B,MAAAsG,QAAAlH,UAAA47B,MA1Bf9B,CA2BA+B,GAAqBj7B,MAAAsG,QAAAlH,UAAA67B,YA3BrB/B,CA4BAgC,GAAgBl7B,MAAAsG,QAAAlH,UAAA87B,OA5BhBhC,CA6BAv0B,GAAa3E,MAAA2E,YA7Bbu0B,CA8BAiC,GAAuB37B,MAAA6b,yBAAA8f,CAAgCn7B,MAAA2E,YAAAvF,UAAhC+7B,CAA8DA,WAA9DA,CA9BvBjC,CA+BAkC,GAAmCp7B,MAAA2E,YAAAvF,UAAAg8B,sBA/BnClC,CAgCAmC,GAAgCr7B,MAAA2E,YAAAvF,UAAAi8B,mB,CCxBlC,IAAAC,GAAe,IAFfC,QAAA,EAAA,E,CCCe,QAAA,GAAQ,EAAY,CAAX3E,IAAAA,ECoBLA,EDnBjB52B,OAAA,YAAA,CAAyB,QAAQ,EAAG,CAIlC2E,QAASA,EAAW,EAAG,CAKrB,IAAM8J,EAAc,IAAAA,YAApB,CAEMsmB,EAAa6B,CPoBdjC,EAAAj1B,IAAA,COpBgD+O,CPoBhD,COnBL,IAAI,CAACsmB,CAAL,CACE,KAAUpsB,MAAJ,CAAU,gFAAV,CAAN,CAGF,IAAMwtB,EAAoBpB,CAAAoB,kBAE1B,IAAiC,CAAjC,GAAIA,CAAA7zB,OAAJ,CAME,MALM4I,EAKCA,CALSswB,EAAAj8B,KAAA,CAAmCX,QAAnC,CAA6Cm2B,CAAA1rB,UAA7C,CAKT6B,CAJP1L,MAAAi8B,eAAA,CAAsBvwB,CAAtB,CAA+BuD,CAAArP,UAA/B,CAIO8L,CAHPA,CAAAoqB,WAGOpqB,CN7BLmqB,CM6BKnqB,CAFPA,CAAAmrB,gBAEOnrB,CAFmB6pB,CAEnB7pB,CADP0rB,CAAAvD,EAAA,CAAgBnoB,CAAhB,CACOA,CAAAA,CAGHwwB,EAAAA,CAAYvF,CAAA7zB,OAAZo5B,CAAuC,CAC7C,KAAMxwB,EAAUirB,CAAA,CAAkBuF,CAAlB,CAChB,IAAIxwB,CAAJ,GD7BSowB,EC6BT,CACE,KAAU3yB,MAAJ,CAAU,0GAAV,CAAN;AAEFwtB,CAAA,CAAkBuF,CAAlB,CAAA,CDhCSJ,ECkCT97B,OAAAi8B,eAAA,CAAsBvwB,CAAtB,CAA+BuD,CAAArP,UAA/B,CACAw3B,EAAAvD,EAAA,CAA6CnoB,CAA7C,CAEA,OAAOA,EAjCc,CAoCvBvG,CAAAvF,UAAA,CAAwBu8B,EAAAv8B,UAExB,OAAOuF,EA1C2B,CAAZ,EADS,C,CEQpB,QAAA,GAAQ,CAACiyB,CAAD,CAAYrC,CAAZ,CAAyBqH,CAAzB,CAAkC,CAKvDC,QAASA,EAAkB,CAACC,CAAD,CAAgB,CACzC,MAAO,SAAQ,CAAC,CAAD,CAAW,CAAV,IAAA,IAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,SAAA,OAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAKRvf,EAAAA,CAAiB,EAQvB,KAFA,IAAMwf,EAAoB,EAA1B,CAESr7B,EAAI,CAAb,CAAgBA,CAAhB,CAbwBsgB,CAaJ1e,OAApB,CAAkC5B,CAAA,EAAlC,CAAuC,CACrC,IAAMoC,EAdgBke,CAcT,CAAMtgB,CAAN,CAEToC,EAAJ,WAAoBwD,QAApB,EVZQisB,CUYuB,CAAsBzvB,CAAtB,CAA/B,EACEi5B,CAAA9c,KAAA,CAAuBnc,CAAvB,CAGF,IAAIA,CAAJ,WAAoBe,iBAApB,CACE,IAASK,CAAT,CAAiBpB,CAAAqB,WAAjB,CAAkCD,CAAlC,CAAyCA,CAAzC,CAAiDA,CAAAwW,YAAjD,CACE6B,CAAA0C,KAAA,CAAoB/a,CAApB,CAFJ,KAKEqY,EAAA0C,KAAA,CAAoBnc,CAApB,CAZmC,CAgBvCg5B,CAAA1yB,MAAA,CAAoB,IAApB,CA7BwB4X,CA6BxB,CAEA,KAAStgB,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBq7B,CAAAz5B,OAApB,CAA8C5B,CAAA,EAA9C,CACE+0B,CAAA,CAAAmB,CAAA,CAAyBmF,CAAA,CAAkBr7B,CAAlB,CAAzB,CAGF,IV/BU6xB,CU+BN,CAAsB,IAAtB,CAAJ,CACE,IAAS7xB,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB6b,CAAAja,OAApB,CAA2C5B,CAAA,EAA3C,CACQoC,CACN,CADayZ,CAAA,CAAe7b,CAAf,CACb,CAAIoC,CAAJ,WAAoBwD,QAApB,EACE8uB,CAAA,CAAAwB,CAAA,CAAsB9zB,CAAtB,CAvCkB,CADe,CA+CnBkJ,IAAAA,EAAxB,GAAI4vB,CAAAI,EAAJ,GACiCzH,CV0DjC,QU3DA,CACyDsH,CAAAvxB,CAAmBsxB,CAAAI,EAAnB1xB,CADzD,CAIuB0B,KAAAA,EAAvB,GAAI4vB,CAAAK,OAAJ,GACiC1H,CVsDjC,OUvDA,CACwDsH,CAAAvxB,CAAmBsxB,CAAAK,OAAnB3xB,CADxD,CAxDuD,C,CCP1C,QAAA,GAAQ,EAAY,CAAXssB,IAAAA,EFoBRA,ETiGAtC,EWpHd,CAA+B9uB,QAAApG,UAA/B,CAAmD,eAAnD,CAME,QAAQ,CAACiK,CAAD,CAAY,CAElB,GAAI,IAAAysB,iBAAJ,CAA2B,CACzB,IAAMf,EAAa6B,CVahBnC,EAAA/0B,IAAA,CUbgD2J,CVahD,CUZH,IAAI0rB,CAAJ,CACE,MAAO,KAAKA,CAAAtmB,YAHW,CAOrBka,CAAAA,CACH6S,EAAAj8B,KAAA,CAAmC,IAAnC,CAAyC8J,CAAzC,CACHutB,EAAAvD,EAAA,CAAgB1K,CAAhB,CACA,OAAOA,EAZW,CANtB,CXoHc2L,EW/Fd,CAA+B9uB,QAAApG,UAA/B,CAAmD,YAAnD,CAOE,QAAQ,CAAC0D,CAAD,CAAOyB,CAAP,CAAa,CACboC,CAAAA,CAAQu1B,EAAA38B,KAAA,CAAgC,IAAhC,CAAsCuD,CAAtC,CAA4CyB,CAA5C,CAET,KAAAuxB,iBAAL,CAGEH,CAAA,CAAAiB,CAAA,CAA8BjwB,CAA9B,CAHF,CACEuuB,EAAA,CAAA0B,CAAA,CAAoBjwB,CAApB,CAIF,OAAOA,EARY,CAPvB,CX+Fc2tB,EW3Ed,CAA+B9uB,QAAApG,UAA/B,CAAmD,iBAAnD,CAOE,QAAQ,CAACs3B,CAAD,CAAYrtB,CAAZ,CAAuB,CAE7B,GAAI,IAAAysB,iBAAJ,GAA4C,IAA5C,GAA8BY,CAA9B,EAXYyF,8BAWZ,GAAoDzF,CAApD,EAA4E,CAC1E,IAAM3B,EAAa6B,CV7BhBnC,EAAA/0B,IAAA,CU6BgD2J,CV7BhD,CU8BH,IAAI0rB,CAAJ,CACE,MAAO,KAAKA,CAAAtmB,YAH4D,CAOtEka,CAAAA,CACHyT,EAAA78B,KAAA,CAAqC,IAArC,CAA2Cm3B,CAA3C,CAAsDrtB,CAAtD,CACHutB,EAAAvD,EAAA,CAAgB1K,CAAhB,CACA,OAAOA,EAZsB,CAPjC,CDnCa2S;ECyDb,CAAgB1E,CAAhB,CAA2BpxB,QAAApG,UAA3B,CAA+C,CAC7C48B,EAASK,EADoC,CAE7CJ,OAAQK,EAFqC,CAA/C,CAhEiC,C,CCFpB,QAAA,GAAQ,EAAY,CAAX1F,IAAAA,EHwBZA,EGuIV2F,SAASA,EAAiB,CAAChI,CAAD,CAAciI,CAAd,CAA8B,CACtDh9B,MAAAC,eAAA,CAAsB80B,CAAtB,CAAmC,aAAnC,CAAkD,CAChD/Y,WAAYghB,CAAAhhB,WADoC,CAEhD7b,aAAc,CAAA,CAFkC,CAGhDD,IAAK88B,CAAA98B,IAH2C,CAIhD0I,IAAyBA,QAAQ,CAACq0B,CAAD,CAAgB,CAE/C,GAAI,IAAAx5B,SAAJ,GAAsBC,IAAAsH,UAAtB,CACEgyB,CAAAp0B,IAAA7I,KAAA,CAAwB,IAAxB,CAA8Bk9B,CAA9B,CADF,KAAA,CAKA,IAAI9c,EAAe3T,IAAAA,EAGnB,IAAI,IAAA7H,WAAJ,CAAqB,CAGnB,IAAMnB,EAAa,IAAAA,WAAnB,CACM05B,EAAmB15B,CAAAV,OACzB,IAAuB,CAAvB,CAAIo6B,CAAJ,EZhKMnK,CYgKsB,CAAsB,IAAtB,CAA5B,CAAyD,CAEvD5S,CAAA,CAAmBje,KAAJ,CAAUg7B,CAAV,CACf,KAAK,IAAIh8B,EAAI,CAAb,CAAgBA,CAAhB,CAAoBg8B,CAApB,CAAsCh8B,CAAA,EAAtC,CACEif,CAAA,CAAajf,CAAb,CAAA,CAAkBsC,CAAA,CAAWtC,CAAX,CAJmC,CALtC,CAcrB87B,CAAAp0B,IAAA7I,KAAA,CAAwB,IAAxB,CAA8Bk9B,CAA9B,CAEA,IAAI9c,CAAJ,CACE,IAASjf,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBif,CAAArd,OAApB,CAAyC5B,CAAA,EAAzC,CACE+0B,CAAA,CAAAmB,CAAA,CAAyBjX,CAAA,CAAajf,CAAb,CAAzB,CA1BJ,CAF+C,CAJD,CAAlD,CADsD,CZxC1C4zB,CYnHd,CAA+BpxB,IAAA9D,UAA/B,CAA+C,cAA/C,CAOE,QAAQ,CAAC0D,CAAD,CAAOmB,CAAP,CAAgB,CACtB,GAAInB,CAAJ,WAAoBe,iBAApB,CAAsC,CACpC,IAAM84B,EAAgBj7B,KAAAtC,UAAA0C,MAAAsH,MAAA,CAA4BtG,CAAAE,WAA5B,CAChB45B;CAAAA,CAAeC,EAAAt9B,KAAA,CAA8B,IAA9B,CAAoCuD,CAApC,CAA0CmB,CAA1C,CAKrB,IZAQsuB,CYAJ,CAAsB,IAAtB,CAAJ,CACE,IAAS7xB,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBi8B,CAAAr6B,OAApB,CAA0C5B,CAAA,EAA1C,CACE00B,CAAA,CAAAwB,CAAA,CAAsB+F,CAAA,CAAcj8B,CAAd,CAAtB,CAIJ,OAAOk8B,EAb6B,CAgBhCE,CAAAA,CZTIvK,CYSe,CAAsBzvB,CAAtB,CACnB85B,EAAAA,CAAeC,EAAAt9B,KAAA,CAA8B,IAA9B,CAAoCuD,CAApC,CAA0CmB,CAA1C,CAEjB64B,EAAJ,EACErH,CAAA,CAAAmB,CAAA,CAAyB9zB,CAAzB,CZbQyvB,EYgBN,CAAsB,IAAtB,CAAJ,EACE6C,CAAA,CAAAwB,CAAA,CAAsB9zB,CAAtB,CAGF,OAAO85B,EA5Be,CAP1B,CZmHctI,EY7Ed,CAA+BpxB,IAAA9D,UAA/B,CAA+C,aAA/C,CAME,QAAQ,CAAC0D,CAAD,CAAO,CACb,GAAIA,CAAJ,WAAoBe,iBAApB,CAAsC,CACpC,IAAM84B,EAAgBj7B,KAAAtC,UAAA0C,MAAAsH,MAAA,CAA4BtG,CAAAE,WAA5B,CAChB45B,EAAAA,CAAeG,EAAAx9B,KAAA,CAA6B,IAA7B,CAAmCuD,CAAnC,CAKrB,IZrCQyvB,CYqCJ,CAAsB,IAAtB,CAAJ,CACE,IAAK,IAAI7xB,EAAI,CAAb,CAAgBA,CAAhB,CAAoBi8B,CAAAr6B,OAApB,CAA0C5B,CAAA,EAA1C,CACE00B,CAAA,CAAAwB,CAAA,CAAsB+F,CAAA,CAAcj8B,CAAd,CAAtB,CAIJ,OAAOk8B,EAb6B,CAgBhCE,CAAAA,CZ9CIvK,CY8Ce,CAAsBzvB,CAAtB,CACnB85B,EAAAA,CAAeG,EAAAx9B,KAAA,CAA6B,IAA7B,CAAmCuD,CAAnC,CAEjBg6B,EAAJ,EACErH,CAAA,CAAAmB,CAAA,CAAyB9zB,CAAzB,CZlDQyvB,EYqDN,CAAsB,IAAtB,CAAJ,EACE6C,CAAA,CAAAwB,CAAA,CAAsB9zB,CAAtB,CAGF,OAAO85B,EA5BM,CANjB,CZ6EctI,EYxCd,CAA+BpxB,IAAA9D,UAA/B,CAA+C,WAA/C,CAME,QAAQ,CAACmF,CAAD,CAAO,CACPoC,CAAAA,CAAQq2B,EAAAz9B,KAAA,CAA2B,IAA3B,CAAiCgF,CAAjC,CAGT,KAAAmE,cAAAotB,iBAAL,CAGEH,CAAA,CAAAiB,CAAA,CAA8BjwB,CAA9B,CAHF;AACEuuB,EAAA,CAAA0B,CAAA,CAAoBjwB,CAApB,CAIF,OAAOA,EATM,CANjB,CZwCc2tB,EYtBd,CAA+BpxB,IAAA9D,UAA/B,CAA+C,aAA/C,CAME,QAAQ,CAAC0D,CAAD,CAAO,CACb,IAAMg6B,EZrFIvK,CYqFe,CAAsBzvB,CAAtB,CAAzB,CACM85B,EAAeK,EAAA19B,KAAA,CAA6B,IAA7B,CAAmCuD,CAAnC,CAEjBg6B,EAAJ,EACErH,CAAA,CAAAmB,CAAA,CAAyB9zB,CAAzB,CAGF,OAAO85B,EARM,CANjB,CZsBctI,EYLd,CAA+BpxB,IAAA9D,UAA/B,CAA+C,cAA/C,CAOE,QAAQ,CAAC89B,CAAD,CAAeC,CAAf,CAA6B,CACnC,GAAID,CAAJ,WAA4Br5B,iBAA5B,CAA8C,CAC5C,IAAM84B,EAAgBj7B,KAAAtC,UAAA0C,MAAAsH,MAAA,CAA4B8zB,CAAAl6B,WAA5B,CAChB45B,EAAAA,CAAeQ,EAAA79B,KAAA,CAA8B,IAA9B,CAAoC29B,CAApC,CAAkDC,CAAlD,CAKrB,IZ9GQ5K,CY8GJ,CAAsB,IAAtB,CAAJ,CAEE,IADAkD,CAAA,CAAAmB,CAAA,CAAyBuG,CAAzB,CACSz8B,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CAAoBi8B,CAAAr6B,OAApB,CAA0C5B,CAAA,EAA1C,CACE00B,CAAA,CAAAwB,CAAA,CAAsB+F,CAAA,CAAcj8B,CAAd,CAAtB,CAIJ,OAAOk8B,EAdqC,CAiBxCS,CAAAA,CZxHI9K,CYwHuB,CAAsB2K,CAAtB,CACjC,KAAMN,EAAeQ,EAAA79B,KAAA,CAA8B,IAA9B,CAAoC29B,CAApC,CAAkDC,CAAlD,CAArB,CACMG,EZ1HI/K,CY0Hc,CAAsB,IAAtB,CAEpB+K,EAAJ,EACE7H,CAAA,CAAAmB,CAAA,CAAyBuG,CAAzB,CAGEE,EAAJ,EACE5H,CAAA,CAAAmB,CAAA,CAAyBsG,CAAzB,CAGEI,EAAJ,EACElI,CAAA,CAAAwB,CAAA,CAAsBsG,CAAtB,CAGF,OAAON,EAlC4B,CAPvC,CAqFIW,GAAJ,EAA+BC,EAAA99B,IAA/B,CACE68B,CAAA,CAAkBr5B,IAAA9D,UAAlB,CAAkCm+B,EAAlC,CADF,CAGEvI,EAAA,CAAA4B,CAAA,CAAmB,QAAQ,CAAC1rB,CAAD,CAAU,CACnCqxB,CAAA,CAAkBrxB,CAAlB,CAA2B,CACzBsQ,WAAY,CAAA,CADa,CAEzB7b,aAAc,CAAA,CAFW,CAKzBD,IAAyBA,QAAQ,EAAG,CAIlC,IAFA,IAAMqc;AAAQ,EAAd,CAESrb,EAAI,CAAb,CAAgBA,CAAhB,CAAoB,IAAAsC,WAAAV,OAApB,CAA4C5B,CAAA,EAA5C,CACEqb,CAAAkD,KAAA,CAAW,IAAAjc,WAAA,CAAgBtC,CAAhB,CAAAuG,YAAX,CAGF,OAAO8U,EAAAoI,KAAA,CAAW,EAAX,CAR2B,CALX,CAezB/b,IAAyBA,QAAQ,CAACq0B,CAAD,CAAgB,CAC/C,IAAA,CAAO,IAAAt4B,WAAP,CAAA,CACE84B,EAAA19B,KAAA,CAA6B,IAA7B,CAAmC,IAAA4E,WAAnC,CAEF44B,GAAAx9B,KAAA,CAA6B,IAA7B,CAAmCX,QAAAmO,eAAA,CAAwB0vB,CAAxB,CAAnC,CAJ+C,CAfxB,CAA3B,CADmC,CAArC,CA1M+B,C,CCWpB,QAAA,GAAQ,CAAC7F,CAAD,CAAkC,CAAtBrC,IAAAA,ECsRPjuB,OAAAlH,UDjR1Bq+B,SAASA,EAAgB,CAAC3B,CAAD,CAAgB,CACvC,MAAO,SAAQ,CAAC,CAAD,CAAW,CAAV,IAAA,IAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,SAAA,OAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAKRvf,EAAAA,CAAiB,EAQvB,KAFA,IAAMwf,EAAoB,EAA1B,CAESr7B,EAAI,CAAb,CAAgBA,CAAhB,CAbwBsgB,CAaJ1e,OAApB,CAAkC5B,CAAA,EAAlC,CAAuC,CACrC,IAAMoC,EAdgBke,CAcT,CAAMtgB,CAAN,CAEToC,EAAJ,WAAoBwD,QAApB,EbdQisB,CacuB,CAAsBzvB,CAAtB,CAA/B,EACEi5B,CAAA9c,KAAA,CAAuBnc,CAAvB,CAGF,IAAIA,CAAJ,WAAoBe,iBAApB,CACE,IAASK,CAAT,CAAiBpB,CAAAqB,WAAjB,CAAkCD,CAAlC,CAAyCA,CAAzC,CAAiDA,CAAAwW,YAAjD,CACE6B,CAAA0C,KAAA,CAAoB/a,CAApB,CAFJ,KAKEqY,EAAA0C,KAAA,CAAoBnc,CAApB,CAZmC,CAgBvCg5B,CAAA1yB,MAAA,CAAoB,IAApB,CA7BwB4X,CA6BxB,CAEA,KAAStgB,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBq7B,CAAAz5B,OAApB,CAA8C5B,CAAA,EAA9C,CACE+0B,CAAA,CAAAmB,CAAA,CAAyBmF,CAAA,CAAkBr7B,CAAlB,CAAzB,CAGF,IbjCU6xB,CaiCN,CAAsB,IAAtB,CAAJ,CACE,IAAS7xB,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB6b,CAAAja,OAApB,CAA2C5B,CAAA,EAA3C,CACQoC,CACN,CADayZ,CAAA,CAAe7b,CAAf,CACb,CAAIoC,CAAJ,WAAoBwD,QAApB,EACE8uB,CAAA,CAAAwB,CAAA,CAAsB9zB,CAAtB,CAvCkB,CADa,CA+ClBkJ,IAAAA,EAAvB,GCmOU0xB,EDnOV,GACiCnJ,CbwDjC,OazDA,CACwDkJ,CAAAnzB,CCkO9CozB,EDlO8CpzB,CADxD,CAIuB0B,KAAAA,EAAvB,GC+NU0xB,ED/NV,GACiCnJ,CboDjC,MarDA,CACuDkJ,CAAAnzB,CC+N9CqzB,ED/N8CrzB,CADvD,CAI4B0B,KAAAA,EAA5B;AC6Ne4xB,ED7Nf,EbgDctJ,Ca/CZ,CAA+BC,CAA/B,CAA4C,aAA5C,CAIE,QAAQ,CAAC,CAAD,CAAW,CAAV,IAAA,IAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,SAAA,OAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAKDhY,EAAAA,CAAiB,EAQvB,KAFA,IAAMwf,EAAoB,EAA1B,CAESr7B,EAAI,CAAb,CAAgBA,CAAhB,CAbiBsgB,CAaG1e,OAApB,CAAkC5B,CAAA,EAAlC,CAAuC,CACrC,IAAMoC,EAdSke,CAcF,CAAMtgB,CAAN,CAEToC,EAAJ,WAAoBwD,QAApB,EbzEMisB,CayEyB,CAAsBzvB,CAAtB,CAA/B,EACEi5B,CAAA9c,KAAA,CAAuBnc,CAAvB,CAGF,IAAIA,CAAJ,WAAoBe,iBAApB,CACE,IAASK,CAAT,CAAiBpB,CAAAqB,WAAjB,CAAkCD,CAAlC,CAAyCA,CAAzC,CAAiDA,CAAAwW,YAAjD,CACE6B,CAAA0C,KAAA,CAAoB/a,CAApB,CAFJ,KAKEqY,EAAA0C,KAAA,CAAoBnc,CAApB,CAZmC,CAgBjC+6B,CAAAA,CbtFEtL,CasFa,CAAsB,IAAtB,CC2LZqL,GDzLTx0B,MAAA,CAA0B,IAA1B,CA/BiB4X,CA+BjB,CAEA,KAAStgB,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBq7B,CAAAz5B,OAApB,CAA8C5B,CAAA,EAA9C,CACE+0B,CAAA,CAAAmB,CAAA,CAAyBmF,CAAA,CAAkBr7B,CAAlB,CAAzB,CAGF,IAAIm9B,CAAJ,CAEE,IADApI,CAAA,CAAAmB,CAAA,CAAyB,IAAzB,CACSl2B,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CAAoB6b,CAAAja,OAApB,CAA2C5B,CAAA,EAA3C,CACQoC,CACN,CADayZ,CAAA,CAAe7b,CAAf,CACb,CAAIoC,CAAJ,WAAoBwD,QAApB,EACE8uB,CAAA,CAAAwB,CAAA,CAAsB9zB,CAAtB,CA1CW,CAJrB,CAqDqBkJ,KAAAA,EAAvB,GCwKU8xB,EDxKV,EbNcxJ,CaOZ,CAA+BC,CAA/B,CAA4C,QAA5C,CACE,QAAQ,EAAG,CACT,IAAMsJ,Eb7GEtL,Ca6Ga,CAAsB,IAAtB,CCqKjBuL,GDnKJv+B,KAAA,CAAoB,IAApB,CAEIs+B,EAAJ,EACEpI,CAAA,CAAAmB,CAAA,CAAyB,IAAzB,CANO,CADb,CAnHqD,C,CCP1C,QAAA,GAAQ,EAAY,CAAXA,IAAAA,ELqBTA,EKLbmH,SAASA,EAAe,CAACxJ,CAAD,CAAciI,CAAd,CAA8B,CACpDh9B,MAAAC,eAAA,CAAsB80B,CAAtB,CAAmC,WAAnC,CAAgD,CAC9C/Y,WAAYghB,CAAAhhB,WADkC,CAE9C7b,aAAc,CAAA,CAFgC,CAG9CD,IAAK88B,CAAA98B,IAHyC,CAI9C0I,IAA4BA,QAAQ,CAAC41B,CAAD,CAAa,CAAA,IAAA,EAAA,IAAA,CAS3CC,EAAkBjyB,IAAAA,EdfdumB,EcOYA,CAAsB,IAAtBA,CASpB,GACE0L,CACA,CADkB,EAClB,CdwBM9J,EcxBN,CAAqC,IAArC,CAA2C,QAAA,CAAAjpB,CAAA,CAAW,CAChDA,CAAJ,GAAgB,CAAhB,EACE+yB,CAAAhf,KAAA,CAAqB/T,CAArB,CAFkD,CAAtD,CAFF,CASAsxB,EAAAp0B,IAAA7I,KAAA,CAAwB,IAAxB,CAA8By+B,CAA9B,CAEA,IAAIC,CAAJ,CACE,IAAK,IAAIv9B,EAAI,CAAb,CAAgBA,CAAhB,CAAoBu9B,CAAA37B,OAApB,CAA4C5B,CAAA,EAA5C,CAAiD,CAC/C,IAAMwK,EAAU+yB,CAAA,CAAgBv9B,CAAhB,CZnDlB20B,EYoDE,GAAInqB,CAAAoqB,WAAJ,EACEsB,CAAAlB,qBAAA,CAA+BxqB,CAA/B,CAH6C,CAU9C,IAAAxC,cAAAotB,iBAAL,CAGEH,CAAA,CAAAiB,CAAA,CAA8B,IAA9B,CAHF,CACE1B,EAAA,CAAA0B,CAAA,CAAoB,IAApB,CAIF,OAAOoH,EArCwC,CAJH,CAAhD,CADoD,CA2KtDE,QAASA,EAA2B,CAAC3J,CAAD,CAAc4J,CAAd,CAA0B,CdxEhD7J,CcyEZ,CAA+BC,CAA/B,CAA4C,uBAA5C,CAOE,QAAQ,CAAC6J,CAAD,CAAWlzB,CAAX,CAAoB,CAC1B,IAAM2yB,EdrLEtL,CcqLa,CAAsBrnB,CAAtB,CACfmzB,EAAAA,CACHF,CAAA5+B,KAAA,CAAgB,IAAhB,CAAsB6+B,CAAtB,CAAgClzB,CAAhC,CAEC2yB,EAAJ,EACEpI,CAAA,CAAAmB,CAAA,CAAyB1rB,CAAzB,Cd1LMqnB,Ec6LJ,CAAsB8L,CAAtB,CAAJ,EACEjJ,CAAA,CAAAwB,CAAA;AAAsB1rB,CAAtB,CAEF,OAAOmzB,EAZmB,CAP9B,CAD4D,CAiC9DC,QAASA,EAAwB,CAAC/J,CAAD,CAAc4J,CAAd,CAA0B,CAQzDI,QAASA,EAAmB,CAACrK,CAAD,CAAQsK,CAAR,CAAa,CAEvC,IADA,IAAMxd,EAAQ,EACd,CAAuBle,CAAvB,GAAgC07B,CAAhC,CAAqC17B,CAArC,CAA4CA,CAAA4X,YAA5C,CACEsG,CAAA/B,KAAA,CAAWnc,CAAX,CAEF,KAASpC,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBsgB,CAAA1e,OAApB,CAAkC5B,CAAA,EAAlC,CACEi1B,CAAA,CAAAiB,CAAA,CAA8B5V,CAAA,CAAMtgB,CAAN,CAA9B,CANqC,CdjH7B4zB,Cc2HZ,CAA+BC,CAA/B,CAA4C,oBAA5C,CAME,QAAQ,CAAC6J,CAAD,CAAW/1B,CAAX,CAAiB,CACvB+1B,CAAA,CAAWA,CAAAK,YAAA,EAEX,IAAiB,aAAjB,GAAIL,CAAJ,CAAgC,CAC9B,IAAMM,EAAS,IAAA9hB,gBACfuhB,EAAA5+B,KAAA,CAAgB,IAAhB,CAAsB6+B,CAAtB,CAAgC/1B,CAAhC,CACAk2B,EAAA,CACwBG,CADxB,EACkC,IAAAl2B,WAAArE,WADlC,CAC+D,IAD/D,CAH8B,CAAhC,IAKO,IAAiB,YAAjB,GAAIi6B,CAAJ,CACCM,CAEN,CAFe,IAAAv6B,WAEf,CADAg6B,CAAA5+B,KAAA,CAAgB,IAAhB,CAAsB6+B,CAAtB,CAAgC/1B,CAAhC,CACA,CAAAk2B,CAAA,CAA0C,IAAAp6B,WAA1C,CAA4Du6B,CAA5D,CAHK,KAIA,IAAiB,WAAjB,GAAIN,CAAJ,CACCM,CAEN,CAFe,IAAA7hB,UAEf,CADAshB,CAAA5+B,KAAA,CAAgB,IAAhB,CAAsB6+B,CAAtB,CAAgC/1B,CAAhC,CACA,CAAAk2B,CAAA,CAAoBG,CAApB,EAA8B,IAAAv6B,WAA9B,CAA+C,IAA/C,CAHK,KAIA,IAAiB,UAAjB,GAAIi6B,CAAJ,CACCM,CAEN,CAFe,IAAAhkB,YAEf,CADAyjB,CAAA5+B,KAAA,CAAgB,IAAhB;AAAsB6+B,CAAtB,CAAgC/1B,CAAhC,CACA,CAAAk2B,CAAA,CAA0C,IAAA7jB,YAA1C,CAA6DgkB,CAA7D,CAHK,KAKL,MAAM,KAAI1G,WAAJ,CAAgB,sBAAhB,CAAuC2G,MAAA,CAAOP,CAAP,CAAvC,CACJ,0EADI,CAAN,CArBqB,CAN3B,CAlByD,CA3NvDQ,EAAJ,EdkHctK,CcjHZ,CAA+BhuB,OAAAlH,UAA/B,CAAkD,cAAlD,CAME,QAAQ,CAACy/B,CAAD,CAAO,CAGb,MADA,KAAAxK,gBACA,CAFM5P,CAEN,CAFmBqa,EAAAv/B,KAAA,CAAiC,IAAjC,CAAuCs/B,CAAvC,CADN,CANjB,CA6DEE,GAAJ,EAAgCC,EAAAt/B,IAAhC,CACEq+B,CAAA,CAAgBz3B,OAAAlH,UAAhB,CAAmC2/B,EAAnC,CADF,CAEWE,EAAJ,EAAoCC,EAAAx/B,IAApC,CACLq+B,CAAA,CAAgBp5B,WAAAvF,UAAhB,CAAuC6/B,EAAvC,CADK,CAILjK,EAAA,CAAA4B,CAAA,CAAmB,QAAQ,CAAC1rB,CAAD,CAAU,CACnC6yB,CAAA,CAAgB7yB,CAAhB,CAAyB,CACvBsQ,WAAY,CAAA,CADW,CAEvB7b,aAAc,CAAA,CAFS,CAMvBD,IAA4BA,QAAQ,EAAG,CACrC,MAAOs9B,GAAAz9B,KAAA,CAA2B,IAA3B,CAAiC,CAAA,CAAjC,CAAAgJ,UAD8B,CANhB,CAYvBH,IAA4BA,QAAQ,CAACq0B,CAAD,CAAgB,CAIlD,IAAM0C,EAAiC,UAAjCA,GAAc,IAAA91B,UAApB,CAEM3C,EAAUy4B,CAAA,CACb,IAD0Bz4B,QAAb;AACI,IAHpB,CAKM04B,EAAa5D,EAAAj8B,KAAA,CAAmCX,QAAnC,CACjB,IAAAyK,UADiB,CAInB,KAFA+1B,CAAA72B,UAEA,CAFuBk0B,CAEvB,CAAmC,CAAnC,CAAO/1B,CAAA1D,WAAAV,OAAP,CAAA,CACE26B,EAAA19B,KAAA,CAA6BmH,CAA7B,CAAsCA,CAAA1D,WAAA,CAAmB,CAAnB,CAAtC,CAGF,KADMoc,CACN,CADkB+f,CAAA,CAAaC,CAAA14B,QAAb,CAAkC04B,CACpD,CAAqC,CAArC,CAAOhgB,CAAApc,WAAAV,OAAP,CAAA,CACEy6B,EAAAx9B,KAAA,CAA6BmH,CAA7B,CAAsC0Y,CAAApc,WAAA,CAAqB,CAArB,CAAtC,CAlBgD,CAZ7B,CAAzB,CADmC,CAArC,Cd8CYsxB,EcPd,CAA+BhuB,OAAAlH,UAA/B,CAAkD,cAAlD,CAME,QAAQ,CAACiL,CAAD,CAAOosB,CAAP,CAAiB,CAEvB,GZ3HIpB,CY2HJ,GAAI,IAAAC,WAAJ,CACE,MAAO+J,GAAA9/B,KAAA,CAAiC,IAAjC,CAAuC8K,CAAvC,CAA6CosB,CAA7C,CAGT,KAAMD,EAAW8I,EAAA//B,KAAA,CAAiC,IAAjC,CAAuC8K,CAAvC,CACjBg1B,GAAA9/B,KAAA,CAAiC,IAAjC,CAAuC8K,CAAvC,CAA6CosB,CAA7C,CACAA,EAAA,CAAW6I,EAAA//B,KAAA,CAAiC,IAAjC,CAAuC8K,CAAvC,CACXusB,EAAAN,yBAAA,CAAmC,IAAnC,CAAyCjsB,CAAzC,CAA+CmsB,CAA/C,CAAyDC,CAAzD,CAAmE,IAAnE,CATuB,CAN3B,CdOcnC,EcWd,CAA+BhuB,OAAAlH,UAA/B,CAAkD,gBAAlD,CAOE,QAAQ,CAACs3B,CAAD,CAAYrsB,CAAZ,CAAkBosB,CAAlB,CAA4B,CAElC,GZ9IIpB,CY8IJ,GAAI,IAAAC,WAAJ,CACE,MAAOiK,GAAAhgC,KAAA,CAAmC,IAAnC,CAAyCm3B,CAAzC,CAAoDrsB,CAApD,CAA0DosB,CAA1D,CAGT,KAAMD,EAAWgJ,EAAAjgC,KAAA,CAAmC,IAAnC;AAAyCm3B,CAAzC,CAAoDrsB,CAApD,CACjBk1B,GAAAhgC,KAAA,CAAmC,IAAnC,CAAyCm3B,CAAzC,CAAoDrsB,CAApD,CAA0DosB,CAA1D,CACAA,EAAA,CAAW+I,EAAAjgC,KAAA,CAAmC,IAAnC,CAAyCm3B,CAAzC,CAAoDrsB,CAApD,CACXusB,EAAAN,yBAAA,CAAmC,IAAnC,CAAyCjsB,CAAzC,CAA+CmsB,CAA/C,CAAyDC,CAAzD,CAAmEC,CAAnE,CATkC,CAPtC,CdXcpC,Ec8Bd,CAA+BhuB,OAAAlH,UAA/B,CAAkD,iBAAlD,CAKE,QAAQ,CAACiL,CAAD,CAAO,CAEb,GZ/JIgrB,CY+JJ,GAAI,IAAAC,WAAJ,CACE,MAAOmK,GAAAlgC,KAAA,CAAoC,IAApC,CAA0C8K,CAA1C,CAGT,KAAMmsB,EAAW8I,EAAA//B,KAAA,CAAiC,IAAjC,CAAuC8K,CAAvC,CACjBo1B,GAAAlgC,KAAA,CAAoC,IAApC,CAA0C8K,CAA1C,CACiB,KAAjB,GAAImsB,CAAJ,EACEI,CAAAN,yBAAA,CAAmC,IAAnC,CAAyCjsB,CAAzC,CAA+CmsB,CAA/C,CAAyD,IAAzD,CAA+D,IAA/D,CATW,CALjB,Cd9BclC,EcgDd,CAA+BhuB,OAAAlH,UAA/B,CAAkD,mBAAlD,CAME,QAAQ,CAACs3B,CAAD,CAAYrsB,CAAZ,CAAkB,CAExB,GZlLIgrB,CYkLJ,GAAI,IAAAC,WAAJ,CACE,MAAOoK,GAAAngC,KAAA,CAAsC,IAAtC,CAA4Cm3B,CAA5C,CAAuDrsB,CAAvD,CAGT,KAAMmsB,EAAWgJ,EAAAjgC,KAAA,CAAmC,IAAnC,CAAyCm3B,CAAzC,CAAoDrsB,CAApD,CACjBq1B,GAAAngC,KAAA,CAAsC,IAAtC,CAA4Cm3B,CAA5C,CAAuDrsB,CAAvD,CAIA,KAAMosB,EAAW+I,EAAAjgC,KAAA,CAAmC,IAAnC,CAAyCm3B,CAAzC,CAAoDrsB,CAApD,CACbmsB,EAAJ,GAAiBC,CAAjB,EACEG,CAAAN,yBAAA,CAAmC,IAAnC,CAAyCjsB,CAAzC,CAA+CmsB,CAA/C,CAAyDC,CAAzD,CAAmEC,CAAnE,CAbsB,CAN5B,CAgDIiJ,GAAJ;AACEzB,CAAA,CAA4Bv5B,WAAAvF,UAA5B,CAAmDugC,EAAnD,CADF,CAEWC,EAAJ,CACL1B,CAAA,CAA4B53B,OAAAlH,UAA5B,CAA+CwgC,EAA/C,CADK,CAGLj1B,OAAAwa,KAAA,CAAa,mEAAb,CAuDE0a,GAAJ,CACEvB,CAAA,CAAyB35B,WAAAvF,UAAzB,CAAgDygC,EAAhD,CADF,CAEWC,EAAJ,CACLxB,CAAA,CAAyBh4B,OAAAlH,UAAzB,CAA4C0gC,EAA5C,CADK,CAGLn1B,OAAAwa,KAAA,CAAa,gEAAb,CJ/QWmW,GImRb,CAAgB1E,CAAhB,CAA2BtwB,OAAAlH,UAA3B,CAA8C,CAC5C48B,EAAS+D,EADmC,CAE5C9D,OAAQ+D,EAFoC,CAA9C,CDjRa1E,GCsRb,CAAe1E,CAAf,CA7RiC,C,CLQnC,IAAMqJ,GAAsBjgC,MAAA,eAE5B,IAAI,CAACigC,EAAL,EACKA,EAAA,cADL,EAE8C,UAF9C,EAEM,MAAOA,GAAA,OAFb,EAG2C,UAH3C,EAGM,MAAOA,GAAA,IAHb,CAGwD,CAEtD,IAAMrJ,GAAY,IRvBLpC,EOKA8G,GCoBb,EEnBaA,GFoBb,ECbaA,GKRb,CNsBsB1E,EMtBtB,CAA2B/yB,gBAAAzE,UAA3B,CAAuD,CACrD48B,EAASkE,EAD4C,CAErDjE,OAAQkE,EAF6C,CAAvD,CHDa7E,GHwBb,EKpBaA,GLqBb,EAGA18B,SAAAk3B,iBAAA,CAA4B,CAAA,CAG5B,KAAMsK,eAAiB,IL9BVhJ,CK8BU,CAA0BR,EAA1B,CAEvBp3B,OAAAC,eAAA,CAAsBO,MAAtB,CAA8B,gBAA9B,CAAgD,CAC9CL,aAAc,CAAA,CADgC,CAE9C6b,WAAY,CAAA,CAFkC,CAG9ClR,MAAO81B,cAHuC,CAAhD,CAhBsD,C,COLtD3xB,QADI4xB,GACO,EAAG,CAIZ,IAAA,IAAA,CAFA,IAAA,MAEA,CAFgB,CAQhB,KAAA,MAAA,CAFA,IAAA,OAEA,CAJA,IAAA,SAIA,CAJmB,IAQnB,KAAA,QAAA,CAFA,IAAA,cAEA,CAFwB,EAIxB,KAAA,OAAA,CAAiB,CAAA,CAEjB,KAAA,KAAA,CAAe,CAMf,KAAA,eAAA,CAFA,IAAA,SAEA,CAJA,IAAA,cAIA,CAJwB,EApBZ;AAmCTC,QAASA,GAAK,CAACj4B,CAAD,CAAO,CAC1BA,CAAA,CAAaA,CAUNkC,QAAA,CAAgBg2B,EAAhB,CAA6B,EAA7B,CAAAh2B,QAAA,CAAyCi2B,EAAzC,CAAkD,EAAlD,CATAC,KAAAA,EAAAA,EAAAA,CAAap4B,EAAAA,CAAbo4B,CAkBHpkB,EAAO,IAAIgkB,EACfhkB,EAAA,MAAA,CAAgB,CAChBA,EAAA,IAAA,CAAchU,CAAA/F,OAEd,KADA,IAAImX,EAAI4C,CAAR,CACS3b,EAAI,CADb,CACgBsI,EAAIX,CAAA/F,OAApB,CAAiC5B,CAAjC,CAAqCsI,CAArC,CAAwCtI,CAAA,EAAxC,CACE,GAuKeggC,GAvKf,GAAIr4B,CAAA,CAAK3H,CAAL,CAAJ,CAA4B,CACrB+Y,CAAA,MAAL,GACEA,CAAA,MADF,CACe,EADf,CAGA,KAAI/W,EAAI+W,CAAR,CACIknB,EAAWj+B,CAAA,MAAA,CAAWA,CAAA,MAAAJ,OAAX,CAA+B,CAA/B,CAAXq+B,EAAgD,IACpDlnB,EAAA,CAAI,IAAI4mB,EACR5mB,EAAA,MAAA,CAAa/Y,CAAb,CAAiB,CACjB+Y,EAAA,OAAA,CAAc/W,CACd+W,EAAA,SAAA,CAAgBknB,CAChBj+B,EAAA,MAAAuc,KAAA,CAAgBxF,CAAhB,CAV0B,CAA5B,IAwKgBmnB,GA7JT,GAAIv4B,CAAA,CAAK3H,CAAL,CAAJ,GACL+Y,CAAA,IACA,CADW/Y,CACX,CADe,CACf,CAAA+Y,CAAA,CAAIA,CAAA,OAAJ,EAAmB4C,CAFd,CAlCT,OAAOokB,EAAA,CAuCApkB,CAvCA,CAAoBhU,CAApB,CAFmB;AAkD5Bo4B,QAASA,GAAQ,CAAC39B,CAAD,CAAOuF,CAAP,CAAa,CAC5B,IAAI7B,EAAI6B,CAAAkH,UAAA,CAAezM,CAAA,MAAf,CAA8BA,CAAA,IAA9B,CAA4C,CAA5C,CACRA,EAAA,cAAA,CAAwBA,CAAA,QAAxB,CAA0C0D,CAAAq6B,KAAA,EACtC/9B,EAAA,OAAJ,GAEE0D,CASA,CATI6B,CAAAkH,UAAA,CADKzM,CAAA,SAAAg+B,CAAmBh+B,CAAA,SAAA,IAAnBg+B,CAA6Ch+B,CAAA,OAAA,MAClD,CAAmBA,CAAA,MAAnB,CAAmC,CAAnC,CASJ,CARA0D,CAQA,CARIu6B,EAAA,CAAsBv6B,CAAtB,CAQJ,CAPAA,CAOA,CAPIA,CAAA+D,QAAA,CAAUy2B,EAAV,CAA6B,GAA7B,CAOJ,CAJAx6B,CAIA,CAJIA,CAAA+I,UAAA,CAAY/I,CAAAy6B,YAAA,CAAc,GAAd,CAAZ,CAAiC,CAAjC,CAIJ,CAHI5+B,CAGJ,CAHQS,CAAA,eAGR,CAHiCA,CAAA,SAGjC,CAHoD0D,CAAAq6B,KAAA,EAGpD,CAFA/9B,CAAA,OAEA,CAF0C,CAE1C,GAFkBT,CAAAsV,QAAA,CAmJLupB,GAnJK,CAElB,CAAIp+B,CAAA,OAAJ,CACiC,CAA/B,GAAIT,CAAAsV,QAAA,CA+IUwpB,QA/IV,CAAJ,CACEr+B,CAAA,KADF,CACiBs+B,EADjB,CAEW/+B,CAAAiV,MAAA,CAAQ+pB,EAAR,CAFX,GAGEv+B,CAAA,KACA,CADew+B,EACf,CAAAx+B,CAAA,cAAA,CACEA,CAAA,SAAA0U,MAAA,CAAuBwpB,EAAvB,CAAA5K,IAAA,EALJ,CADF,CAUItzB,CAAA,KAVJ,CAS+B,CAA7B,GAAIT,CAAAsV,QAAA,CAsIQ4pB,IAtIR,CAAJ,CACiBC,EADjB,CAGiBC,EAvBrB,CA4BA,IADIC,CACJ,CADS5+B,CAAA,MACT,CACE,IADM,IACGpC,EAAI,CADP,CACUsI,EAAI04B,CAAAp/B,OADd,CACyB4T,CAA/B,CACGxV,CADH,CACOsI,CADP,GACckN,CADd,CACkBwrB,CAAA,CAAGhhC,CAAH,CADlB,EAC0BA,CAAA,EAD1B,CAEE+/B,EAAA,CAASvqB,CAAT;AAAY7N,CAAZ,CAGJ,OAAOvF,EArCqB,CA8C9Bi+B,QAASA,GAAqB,CAAC1+B,CAAD,CAAI,CAChC,MAAOA,EAAAkI,QAAA,CAAU,uBAAV,CAAmC,QAAQ,CAAA,CAAA,CAAA,CAAA,CAAG,CAC/Co3B,CAAAA,CAAO,CAEX,KADEC,CACF,CADW,CACX,CADeD,CAAAr/B,OACf,CAAOs/B,CAAA,EAAP,CAAA,CACED,CAAA,CAAO,GAAP,CAAaA,CAEf,OAAO,IAAP,CAAcA,CANqC,CAA9C,CADyB;AAkB3BE,QAASA,GAAS,CAAC/+B,CAAD,CAAOg/B,CAAP,CAA2Bz5B,CAA3B,CAAsC,CAAXA,CAAA,CAAA,IAAA,EAAA,GAAAA,CAAA,CAAO,EAAP,CAAAA,CAElD,KAAI05B,EAAU,EACd,IAAIj/B,CAAA,QAAJ,EAAuBA,CAAA,MAAvB,CAAsC,CACpC,IAAI4+B,EAAK5+B,CAAA,MAAT,CACI,CAAA,IAAA4+B,CAAA,CAAAA,CAAA,CAgCFxrB,CAhCQ,CAAA8rB,CAgCJ,CAAM,CAAN,CAhCI,CAAA,CAAA,CAAA,EAiCG9rB,CAjCH,EAiCiBA,CAAA,SAjCjB,EAiCwE,CAjCxE,GAiCmCA,CAAA,SAAAyB,QAAA,CAuD/B4pB,IAvD+B,CAjCnC,CAAV,IAAI,CAAJ,CAA+B,CACpB7gC,CAAAA,CAAI,CAAb,KAD6B,IACbsI,EAAI04B,CAAAp/B,OADS,CACE4T,CAA/B,CACGxV,CADH,CACOsI,CADP,GACckN,CADd,CACkBwrB,CAAA,CAAGhhC,CAAH,CADlB,EAC0BA,CAAA,EAD1B,CAEEqhC,CAAA,CAAUF,EAAA,CAAU3rB,CAAV,CAAa4rB,CAAb,CAAiCC,CAAjC,CAHiB,CAA/B,IAMYD,EAAA,CAAqB,CAArB,CAAqB,CAAA,QAArB,EACR,CAmCN,CAnCM,CAAA,QAmCN,CADAC,CACA,CADqCA,CAS9Bx3B,QAAA,CACI03B,EADJ,CACmB,EADnB,CAAA13B,QAAA,CAEI23B,EAFJ,CAEkB,EAFlB,CARP,CAAA,CAAA,CAA6BH,CAkBtBx3B,QAAA,CACI43B,EADJ,CACmB,EADnB,CAAA53B,QAAA,CAEI63B,EAFJ,CAEiB,EAFjB,CAtDO,CAGV,EADAL,CACA,CAHUA,CAEAlB,KAAA,EACV,IACEkB,CADF,CACY,IADZ,CACmBA,CADnB,CAC6B,IAD7B,CAXkC,CAiBlCA,CAAJ,GACMj/B,CAAA,SAIJ,GAHEuF,CAGF,EAHUvF,CAAA,SAGV,CAHgD,MAGhD,EADAuF,CACA,EADQ05B,CACR,CAAIj/B,CAAA,SAAJ,GACEuF,CADF,EACU,OADV,CALF,CASA,OAAOA,EA7BsD;AAwE7Dg6B,IAAAA,GAAYA,CAAZA,CACAC,GAAgBA,CADhBD,CAEAE,GAAYA,CAFZF,CAGAG,GAAYA,GAHZH,CAWAI,GAAUA,mCAXVJ,CAYAK,GAAMA,kBAZNL,CAaAM,GAAYA,mDAbZN,CAcAO,GAAWA,4DAdXP,CAeAQ,GAAYA,yCAfZR,CAgBAS,GAAUA,2CAhBVT,CAiBAU,GAAeA,mBAjBfV,CAkBAW,GAAgBA,M,CCtPX,IAAMC,EAAe,EAAEjjC,MAAA,SAAF,EAAwBA,MAAA,SAAA,MAAxB,CAArB,CACHkjC,EAKJC,SAASA,GAAgB,CAAC9lB,CAAD,CAAW,CAEhC6lB,EAAA,CADE7lB,CAAJ,EAAgBA,CAAA,kBAAhB,CACwB,CAAA,CADxB,CASwB4lB,CATxB,EASwC,EAASnjC,SAAAC,UAAAuX,MAAA,CAA0B,2BAA1B,CAAT,EACpC8rB,CAAApjC,MAAAojC,IADoC,EACtBC,CAAAD,GAAAC,SADsB,EACN,CAAAD,GAAAC,SAAA,CAAa,YAAb,CAA2B,kBAA3B,CADM,CAVN,CAehCrjC,MAAAsjC,SAAJ,EAAqDt3B,IAAAA,EAArD,GAAuBhM,MAAAsjC,SAAAC,UAAvB,CACEL,EADF,CACwBljC,MAAAsjC,SAAAC,UADxB,CAEWvjC,MAAAsjC,SAAJ,EACLH,EAAA,CAAiBnjC,MAAAsjC,SAAjB,CAEA,CAAAtjC,MAAAsjC,SAAA,CAAkBt3B,IAAAA,EAHb,EAKLm3B,EAAA,CAAiBnjC,MAAA,cAAjB,EAA4CA,MAAA,cAAA,MAA5C,CAMK,KAAMwjC,EAA4CN,E,CCpClD,IAAMO,GAAa,yHAAnB,CACMC,GAAc,sCADpB,CAEMC,GAAe,2BAFrB,CAGMC,GAAkB,sCAHxB,CAIMC,GAAc,cAJpB,CAMMC,GAAY,Y,CCHzB,IAAMC,GAAe,IAAIlkB,G,CCSlBmkB,QAASA,GAAU,CAAChC,CAAD,CAAQl4B,CAAR,CAAkB,CAC1C,GAAI,CAACk4B,CAAL,CACE,MAAO,EAEY,SAArB,GAAI,MAAOA,EAAX,GACEA,CADF,CJ4Bc1B,EI3BJ,CAAM0B,CAAN,CADV,CAGIl4B,EAAJ,EACEm6B,EAAA,CAAYjC,CAAZ,CAAmBl4B,CAAnB,CAEF,OJwIc+3B,GIxIP,CAAUG,CAAV,CHcIwB,CGdJ,CAVmC,CAiBrCU,QAASA,GAAa,CAACC,CAAD,CAAQ,CAC/B,CAACA,CAAA,WAAL,EAA4BA,CAAAl9B,YAA5B,GACEk9B,CAAA,WADF,CJcc7D,EIbU,CAAM6D,CAAAl9B,YAAN,CADxB,CAGA,OAAOk9B,EAAA,WAAP,EAA8B,IAJK,CAc9BC,QAASA,GAAmB,CAACC,CAAD,CAAO,CACxC,MAAO,CAAA,CAAQA,CAAA,OAAf,EACAA,CAAA,OAAA,KADA,GAC2B/C,EAFa,CAWnC2C,QAASA,GAAW,CAACnhC,CAAD,CAAOwhC,CAAP,CAA0BC,CAA1B,CAAiDC,CAAjD,CAAkE,CAC3F,GAAK1hC,CAAL,CAAA,CAGA,IAAI2hC,EAAY,CAAA,CAAhB,CACI/zB,EAAO5N,CAAA,KACX,IAAI0hC,CAAJ,EACM9zB,CADN,GACe0wB,EADf,CACiC,CAC7B,IAAIsD,EAAa5hC,CAAA,SAAAwU,MAAA,CF1DVusB,EE0DU,CACba,EAAJ,GAEO1kC,MAAA0kC,WAAA,CAAkBA,CAAA,CAAW,CAAX,CAAlB,CAAAtmB,QAFP,GAGIqmB,CAHJ,CAGgB,CAAA,CAHhB,EAF6B,CAU7B/zB,CAAJ,GAAa+wB,EAAb,CACE6C,CAAA,CAAkBxhC,CAAlB,CADF,CAEWyhC,CAAJ,EACL7zB,CADK,GACI4wB,EADJ,CAELiD,CAAA,CAAsBzhC,CAAtB,CAFK,CAGI4N,CAHJ,GAGa8wB,EAHb,GAILiD,CAJK,CAIO,CAAA,CAJP,CAOP,KADI/C,CACJ,CADS5+B,CAAA,MACT,GAAU,CAAC2hC,CAAX,CAAsB,CACX/jC,CAAAA,CAAE,CAAGsI,EAAAA,CAAE04B,CAAAp/B,OAAhB,KAAK,IAAsB4T,CAA3B,CAA+BxV,CAA/B,CAAiCsI,CAAjC,GAAwCkN,CAAxC,CAA0CwrB,CAAA,CAAGhhC,CAAH,CAA1C,EAAkDA,CAAA,EAAlD,CACEujC,EAAA,CAAY/tB,CAAZ,CAAeouB,CAAf,CAAkCC,CAAlC,CAAyDC,CAAzD,CAFkB,CAzBtB,CAD2F;AAyCtFG,QAASA,GAAQ,CAAC5C,CAAD,CAAU6C,CAAV,CAAmB3iC,CAAnB,CAA2B4iC,CAA3B,CAAwC,CAY9D,IAAIV,EAAwCvlC,QAAA+G,cAAA,CAAuB,OAAvB,CAXNi/B,EAYtC,EACET,CAAA34B,aAAA,CAAmB,OAAnB,CAboCo5B,CAapC,CAEFT,EAAAl9B,YAAA,CAf6B86B,CAC7B+C,GAAA,CAeOX,CAfP,CAAkBliC,CAAlB,CAA0B4iC,CAA1B,CACA,OAcOV,EAjBuD,CAwBhE,IAAIY,GAAoB,IAuBjBD,SAASA,GAAU,CAACX,CAAD,CAAQliC,CAAR,CAAgB4iC,CAAhB,CAA6B,CACrD5iC,CAAA,CAASA,CAAT,EAAmBrD,QAAAsI,KAGnBjF,EAAA8B,aAAA,CAAoBogC,CAApB,CAFaU,CAEb,EAF4BA,CAAAnqB,YAE5B,EADEzY,CAAAkC,WACF,CACK4gC,GAAL,CAIiBZ,CAAAa,wBAAA5G,CAA8B2G,EAA9B3G,CAJjB,GAKmBl7B,IAAA+hC,4BALnB,GAMIF,EANJ,CAMwBZ,CANxB,EACEY,EADF,CACsBZ,CAN+B;AAyDhDe,QAASA,GAA0B,CAACC,CAAD,CAAMr7B,CAAN,CAAgB,CAExD,IAAIoqB,EAAQiR,CAAAxtB,QAAA,CAAY,MAAZ,CACZ,IAAe,EAAf,GAAIuc,CAAJ,CAEE,MAAOpqB,EAAA,CAASq7B,CAAT,CAAc,EAAd,CAAkB,EAAlB,CAAsB,EAAtB,CAvB6B,EAAA,CAAA,CACtC,IAAIC,EAAQ,CACH1kC,KAAAA,EAwBwBwzB,CAxBxBxzB,CAwBgC,CAxBzC,KAAK,IAAasI,EAwBUm8B,CAxBR7iC,OAApB,CAAiC5B,CAAjC,CAAqCsI,CAArC,CAAwCtI,CAAA,EAAxC,CACE,GAAgB,GAAhB,GAuB0BykC,CAvBtB,CAAKzkC,CAAL,CAAJ,CACE0kC,CAAA,EADF,KAEO,IAAgB,GAAhB,GAqBmBD,CArBf,CAAKzkC,CAAL,CAAJ,EACW,CADX,GACD,EAAE0kC,CADD,CAEH,MAAA,CAIN,EAAA,CAAQ,EAX8B,CA2BlCnM,CAAAA,CAAQkM,CAAA51B,UAAA,CAAc2kB,CAAd,CAAsB,CAAtB,CAAyBsK,CAAzB,CACR6G,EAAAA,CAASF,CAAA51B,UAAA,CAAc,CAAd,CAAiB2kB,CAAjB,CAEToR,EAAAA,CAASJ,EAAA,CAA2BC,CAAA51B,UAAA,CAAcivB,CAAd,CAAoB,CAApB,CAA3B,CAAmD10B,CAAnD,CACTy7B,EAAAA,CAAQtM,CAAAthB,QAAA,CAAc,GAAd,CAEZ,OAAe,EAAf,GAAI4tB,CAAJ,CAESz7B,CAAA,CAASu7B,CAAT,CAAiBpM,CAAA4H,KAAA,EAAjB,CAA+B,EAA/B,CAAmCyE,CAAnC,CAFT,CAOOx7B,CAAA,CAASu7B,CAAT,CAFKpM,CAAA1pB,UAAA,CAAgB,CAAhB,CAAmBg2B,CAAnB,CAAA1E,KAAAv2B,EAEL,CADQ2uB,CAAA1pB,UAAA,CAAgBg2B,CAAhB,CAAwB,CAAxB,CAAA1E,KAAA2E,EACR,CAAkCF,CAAlC,CAtBiD,CA6BnDG,QAASA,GAAkB,CAACv6B,CAAD,CAAUZ,CAAV,CAAiB,CHlOtC24B,CGoOX,CACE/3B,CAAAM,aAAA,CAAqB,OAArB,CAA8BlB,CAA9B,CADF,CAGEtK,MAAA,SAAA,cAAA,aAAAT,KAAA,CAAyD2L,CAAzD,CAAkE,OAAlE,CAA2EZ,CAA3E,CAL+C;AAa5Co7B,QAASA,GAAY,CAACx6B,CAAD,CAAU,CACpC,IAAI7B,EAAY6B,CAAA,UAAhB,CACay6B,EAAgB,EAKzBt8B,EAAJ,CACgC,EADhC,CACMA,CAAAsO,QAAA,CAAkB,GAAlB,CADN,GAIIguB,CACA,CADgBt8B,CAChB,CAAAu8B,CAAA,CAAM16B,CAAA+K,aAAN,EAA8B/K,CAAA+K,aAAA,CAAqB,IAArB,CAA9B,EAA6D,EALjE,GAQE2vB,CACA,CADsB16B,CAAD06B,GACrB,CAAAD,CAAA,CAAiCz6B,CAAD26B,QATlC,CAWA,OAAO,CAACD,GAAAA,CAAD,CAAKD,EAAAA,CAAL,CAlB6B,C,CCrNtC,QAAMG,GAAN,EAAA,EAWE76B,QAAA,GAAG,CAACnI,CAAD,CAAOiQ,CAAP,CAAcgzB,CAAd,CAAiC,CAApC96B,IAAAA,EAyTaqwB,CAvTPx4B,EAAA,cAAJ,CACEA,CAAA,cADF,CAC0B,IAD1B,CAGEkjC,EAAA,CAAAA,CAAA,CAAmBljC,CAAnB,CAAyBiQ,CAAzB,EAAkC,EAAlC,CAAsCgzB,CAAtC,CALgC,CASpCC,QAAA,GAAa,CAAbA,CAAa,CAACljC,CAAD,CAAOC,CAAP,CAAiBgjC,CAAjB,CAAoC,CAC3CjjC,CAAAG,SAAJ,GAAsBC,IAAA8G,aAAtB,EACEkB,EAAA,CAAapI,CAAb,CAAmBC,CAAnB,CAA6BgjC,CAA7B,CAKF,IAHIh8B,CAGJ,CAH6B,UAApB,GAACjH,CAAAuG,UAAD,CACPrG,CAACF,CAAA4D,QAAD1D,EAAiBF,CAAAmjC,GAAjBjjC,YADO,CAEPF,CAAAwf,SAFO,EAEUxf,CAAAE,WACnB,CACE,IAAK,IAAItC,EAAE,CAAX,CAAcA,CAAd,CAAgBqJ,CAAAzH,OAAhB,CAA2B5B,CAAA,EAA3B,CACEslC,EAAA,CAAAA,CAAA,CAAmBj8B,CAAA,CAAGrJ,CAAH,CAAnB,CAA0BqC,CAA1B,CAAoCgjC,CAApC,CAT2C;AAkBjD76B,QAAA,GAAO,CAACA,CAAD,CAAU6H,CAAV,CAAiBgzB,CAAjB,CAAoC,CAIzC,GAAIhzB,CAAJ,CAEE,GAAI7H,CAAAg7B,UAAJ,CACMH,CAAJ,EACE76B,CAAAg7B,UAAAC,OAAA,CAhDSC,aAgDT,CACA,CAAAl7B,CAAAg7B,UAAAC,OAAA,CAAyBpzB,CAAzB,CAFF,GAIE7H,CAAAg7B,UAAA/lB,IAAA,CAnDSimB,aAmDT,CACA,CAAAl7B,CAAAg7B,UAAA/lB,IAAA,CAAsBpN,CAAtB,CALF,CADF,KAQO,IAAI7H,CAAA+K,aAAJ,CAA0B,CAC/B,IAAIxM,EAAIyB,CAAA+K,aAAA,CAAqBowB,EAArB,CACJN,EAAJ,CACMt8B,CADN,GAEQgtB,CACJ,CADehtB,CAAAc,QAAA,CA1DR67B,aA0DQ,CAAsB,EAAtB,CAAA77B,QAAA,CAAkCwI,CAAlC,CAAyC,EAAzC,CACf,CD+II0yB,EC/IJ,CAA6Bv6B,CAA7B,CAAsCurB,CAAtC,CAHJ,EDkJQgP,EC3IN,CAA6Bv6B,CAA7B,EADgBzB,CAAA,CAAIA,CAAJ,CAAQ,GAAR,CAAc,EAC9B,EADiD,cACjD,CADuDsJ,CACvD,CAT6B,CAdM,CAkC3CuzB,QAAA,GAAa,CAACp7B,CAAD,CAAUq7B,CAAV,CAAsBz8B,CAAtB,CAAgC,CAA7Cw8B,IAAAA,EA4PahL,CA5PbgL,CACME,EAAet7B,CAAA,WJnGV+3B,EI2GT,EAAqC,OAArC,GAAoBuD,CAApB,CACEzE,CADF,CDjGYiC,ECkGA,CAAoBuC,CAApB,CAAgCz8B,CAAhC,CADZ,EAGM,CACJ,CDgIU47B,ECjIgB,CAAuBx6B,CAAvB,CAC1B,CAAA62B,CAAA,CAAU0E,EAAA,CAAAA,CAAA,CAASF,CAAT,CADL,CAAAX,GACK,CADD,CAAAD,EACC,CAAwC77B,CAAxC,CAAV,CAA8D,MAJhE,CAMA,OAAOi4B,EAAAlB,KAAA,EAfoC;AAsB7C4F,QAAA,GAAG,CAAHA,CAAG,CAACzE,CAAD,CAAQjvB,CAAR,CAAe2zB,CAAf,CAAoB58B,CAApB,CAA8B,CAC/B,IAAI68B,EAAYC,EAAA,CAAoB7zB,CAApB,CAA2B2zB,CAA3B,CAChB3zB,EAAA,CAA+BA,CAc/B,CACS8zB,EADT,CAd+B9zB,CAc/B,CAGS,EAfT,ODlHYixB,GCkHL,CAAoBhC,CAApB,CAA2B,QAAQ,CAAiBqC,CAAjB,CAAuB,CAC1DA,CAAAyC,EAAL,GACYzC,CAqCd,SApCI,CADUA,CAqCK0C,EApCf,CAqCFC,EAAA,CAzCSn5B,CAyCT,CAtCYw2B,CAsCZ,CAzCSx2B,CAyBeo5B,EAgBxB,CAtCkBl0B,CAsClB,CAtCyB4zB,CAsCzB,CArCE,CAAAtC,CAAAyC,EAAA,CAAgB,CAAA,CAFlB,CAIIh9B,EAAJ,EACEA,CAAA,CAASu6B,CAAT,CAAetxB,CAAf,CAAsB4zB,CAAtB,CAN6D,CAA1D,CAJwB,CAuBjCC,QAAA,GAAc,CAAC7zB,CAAD,CAAQ2zB,CAAR,CAAa,CACzB,MAAOA,EAAA,CAAM,MAAN,CAAa3zB,CAAb,CAAkB,GAAlB,CAAwBA,CADN,CA8B3Bi0B,QAAA,GAAiB,CAAjBA,CAAiB,CAAC3C,CAAD,CAAO6C,CAAP,CAAoBn0B,CAApB,CAA2B4zB,CAA3B,CAAsC,CACrD,IAAIQ,EAAK9C,CAAA,SAAA7sB,MAAA,CAAuB4vB,EAAvB,CAGT,IAAI,CDxIQhD,ECwIP,CAA8BC,CAA9B,CAAL,CAA0C,CAC/B3jC,CAAAA,CAAE,CAAX,KADwC,IAC1BsI,EAAEm+B,CAAA7kC,OADwB,CACbI,CAA3B,CAA+BhC,CAA/B,CAAiCsI,CAAjC,GAAwCtG,CAAxC,CAA0CykC,CAAA,CAAGzmC,CAAH,CAA1C,EAAkDA,CAAA,EAAlD,CACEymC,CAAA,CAAGzmC,CAAH,CAAA,CAAQwmC,CAAA3nC,KAAA,CAAiB,CAAjB,CAAuBmD,CAAvB,CAA0BqQ,CAA1B,CAAiC4zB,CAAjC,CAF8B,CAK1C,MAAOQ,EAAAhjB,KAAA,CAAQijB,EAAR,CAT8C,CAgBvDC,QAAA,GAAe,CAACtkC,CAAD,CAAW,CACxB,MAAOA,EAAAwH,QAAA,CAAiB+8B,EAAjB,CAAsB,QAAA,CAAC5yB,CAAD,CAAIhE,CAAJ,CAAU62B,CAAV,CAAqB,CACrB,EAA3B,CAAIA,CAAA5vB,QAAA,CAAe,GAAf,CAAJ,CACE4vB,CADF,CACWA,CAAAh9B,QAAA,CAAe,KAAf,CAAsB,KAAtB,CADX,CAEoC,EAFpC,CAEWg9B,CAAA5vB,QAAA,CAAe,KAAf,CAFX,GAGE4vB,CAHF,CAGWA,CAAAh9B,QAAA,CAAe,MAAf,CAAuB,GAAvB,CAHX,CAKA,OAAO,GAAP,CAAWmG,CAAX,CAAe,GAAf,CAAmB62B,CAAnB,CAAyB,GANuB,CAA3C,CADiB;AAgB1B,EAAA,UAAA,EAAA,CAAAN,QAAyB,CAAClkC,CAAD,CAAWgQ,CAAX,CAAkB4zB,CAAlB,CAA6B,CACpD,IAAIa,EAAO,CAAA,CACXzkC,EAAA,CAAWA,CAAA89B,KAAA,EAEX,KAAI4G,EAAQH,EAAAznC,KAAA,CAASkD,CAAT,CACR0kC,EAAJ,GACE1kC,CACA,CADWA,CAAAwH,QAAA,CAAiB+8B,EAAjB,CAAsB,QAAA,CAAC5yB,CAAD,CAAIhE,CAAJ,CAAUuoB,CAAV,CAAoB,CAAA,MAAA,GAAA,CAAIvoB,CAAJ,CAAQ,GAAR,CAAYuoB,CAAA1uB,QAAA,CAAc,KAAd,CAAqB,EAArB,CAAZ,CAAoC,GAApC,CAA1C,CACX,CAAAxH,CAAA,CAAWskC,EAAA,CAAqBtkC,CAArB,CAFb,CAIAA,EAAA,CAAWA,CAAAwH,QAAA,CAAiBm9B,EAAjB,CAAmCC,EAAnC,CAAuC,KAAvC,CACX5kC,EAAA,CAAWA,CAAAwH,QAAA,CAAiBq9B,EAAjB,CAAsC,QAAA,CAAClzB,CAAD,CAAIjL,CAAJ,CAAOpH,CAAP,CAAa,CACvDmlC,CAAL,GACMK,CAGJ,CAHWC,EAAA,CAAgCzlC,CAAhC,CAAmCoH,CAAnC,CAAsCsJ,CAAtC,CAA6C4zB,CAA7C,CAGX,CAFAa,CAEA,CAFOA,CAEP,EAFeK,CAAAL,KAEf,CADA/9B,CACA,CADIo+B,CAAAE,GACJ,CAAA1lC,CAAA,CAAIwlC,CAAAv9B,MAJN,CAMA,OAAOb,EAAP,CAAWpH,CAPiD,CAAnD,CASPolC,EAAJ,GACE1kC,CADF,CACaskC,EAAA,CAAqBtkC,CAArB,CADb,CAGA,OAAOA,EAtB6C,CAyBtD+kC;QAAA,GAA0B,CAAC/kC,CAAD,CAAWglC,CAAX,CAAuBh1B,CAAvB,CAA8B4zB,CAA9B,CAAyC,CAEjE,IAAIqB,EAAejlC,CAAA4U,QAAA,CAAiBswB,EAAjB,CACW,EAA9B,EAAIllC,CAAA4U,QAAA,CAAiBgwB,EAAjB,CAAJ,CACE5kC,CADF,CACamlC,EAAA,CAA4BnlC,CAA5B,CAAsC4jC,CAAtC,CADb,CAG4B,CAH5B,GAGWqB,CAHX,GAIEjlC,CAJF,CAIagQ,CAAA,CAAQo1B,EAAA,CAA8BplC,CAA9B,CAAwCgQ,CAAxC,CAAR,CACThQ,CALJ,CASIqlC,EAAAA,CAAU,CAAA,CACM,EAApB,EAAIJ,CAAJ,GACED,CACA,CADa,EACb,CAAAK,CAAA,CAAU,CAAA,CAFZ,CAMA,IAAIA,CAAJ,CAAa,CACX,IAAAZ,EAAO,CAAA,CACHY,EAAJ,GAEErlC,CAFF,CAEaA,CAAAwH,QAAA,CAAiB89B,EAAjB,CAAgC,QAAA,CAAC3zB,CAAD,CAAI4zB,CAAJ,CAAc,CAAA,MAAA,KAAA,CAAMA,CAAN,CAA9C,CAFb,CAFW,CAObvlC,CAAA,CAAWA,CAAAwH,QAAA,CAAiBg+B,EAAjB,CAA4B,QAAA,CAAC7zB,CAAD,CAAI8zB,CAAJ,CAAYC,CAAZ,CACrC,CAAA,MAAA,QAAA,CAASA,CAAT,CAAY,KAAZ,CAAkBD,CAAlB,CAAwB,IAAxB,CAA6BA,CAA7B,CAAmC,QAAnC,CAA4CC,CAA5C,CAA+C,IAA/C,CADS,CAEX,OAAO,CAACn+B,MAAOvH,CAAR,CAAkBglC,GAAAA,CAAlB,CAA8BP,KAAAA,CAA9B,CA5B0D,CA+BnEW,QAAA,GAAwB,CAACplC,CAAD,CAAWgQ,CAAX,CAAkB,CACpCo0B,CAAAA,CAAKpkC,CAAAyU,MAAA,CAAekxB,EAAf,CACTvB,EAAA,CAAG,CAAH,CAAA,EAASp0B,CACT,OAAOo0B,EAAAhjB,KAAA,CAAQukB,EAAR,CAHiC;AAO1CR,QAAA,GAAsB,CAACnlC,CAAD,CAAW4jC,CAAX,CAAsB,CAC1C,IAAIjyB,EAAI3R,CAAAuU,MAAA,CAAeqxB,EAAf,CAER,OAAA,CADIL,CACJ,CADY5zB,CACZ,EADiBA,CAAA,CAAE,CAAF,CAAAmsB,KAAA,EACjB,EADgC,EAChC,EACOyH,CAAA,CAAM,CAAN,CAAAhxB,MAAA,CAAesxB,EAAf,CAAL,CAcS7lC,CAAAwH,QAAA,CAAiBo+B,EAAjB,CAA6B,QAAQ,CAACj0B,CAAD,CAAI+D,CAAJ,CAAU6vB,CAAV,CAAiB,CAC3D,MAAO3B,EAAP,CAAmB2B,CADwC,CAAtD,CAdT,CAEqBA,CAAA9wB,MAAA,CAAYoxB,EAAZ,CAAAC,CAAoC,CAApCA,CAEnB,GAAqBlC,CAArB,CACS2B,CADT,CAKSQ,EAVb,CAyBS/lC,CAAAwH,QAAA,CAAiBo9B,EAAjB,CAAuBhB,CAAvB,CA5BiC,CA6C5CoC,QAAA,GAAqB,CAAC1E,CAAD,CAAO,CACtBA,CAAA,SAAJ,GAAyB2E,EAAzB,GACE3E,CAAA,SADF,CACqB,MADrB,CAD0B,CAS5B,EAAA,UAAA,EAAA,CAAA4E,QAA0B,CAAClmC,CAAD,CAAW,CACnC,MAAOA,EAAAuU,MAAA,CAAe2wB,EAAf,CAAA,CACL,IAAAhB,EAAA,CAA+BlkC,CAA/B,CAAyCmmC,EAAzC,CADK,CAELf,EAAA,CAA8BplC,CAAA89B,KAAA,EAA9B,CAA+CqI,EAA/C,CAHiC,CAxSvCC,EAAA,OAAA,iBAAA,CAAA,EAAA,UAAA,CAAA,CAAA,EACM,CAAA,aAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,IAAa/C,QAAA,EAAA,CACf,MAJeA,aAGA,CAAb,CADN,CAAA,CA+SA;IAAIkB,GAAM,yBAAV,CACI4B,GAAqB,oBADzB,CAEI9B,GAAuB,GAF3B,CAGIQ,GAAsB,wCAH1B,CAIIgB,GAAyB,SAJ7B,CAKIjB,GAAO,OALX,CAMIqB,GAAO,OANX,CAOIf,GAAU,WAPd,CAQIP,GAAgB,IAAI0B,MAAJ,CAAW,IAAX,CAAgBnB,EAAhB,CAAuB,GAAvB,CARpB,CAYIU,GAAa,0CAZjB,CAcIN,GAAgB,gDAdpB,CAeIE,GAAY,2BAfhB,CAgBI1B,GAAmB,GAhBvB,CAiBI6B,GAAgB,GAjBpB,CAkBIrC,GAAQ,OAlBZ,CAmBIyC,GAAoB,kBAnBxB,CAqBAxN,EAAe,IAAIwK,E,CC5TjBr3B,QA7BmB46B,GA6BR,CAACC,CAAD,CAAM7uB,CAAN,CAAmB8uB,CAAnB,CAAuD5D,CAAvD,CAAgF,CAEzF,IAAAY,EAAA,CAAkB+C,CAAlB,EAAyB,IAEzB,KAAA7uB,EAAA,CAAmBA,CAAnB,EAAkC,IAElC,KAAA8uB,GAAA,CAA6BA,CAA7B,EAAsD,EAEtD,KAAAC,EAAA,CAA+B,IAM/B,KAAA7D,EAAA,CAAqBA,CAArB,EAAsC,EAMtC,KAAA8D,EAAA,CAFA,IAAAC,EAEA,CAJA,IAAAC,EAIA,CAJuB,IAhBkE,CAxB3FjqC,QAAO,EAAG,CAACoD,CAAD,CAAO,CACf,MAAIA,EAAJ,CACSA,CAAA,YADT,CAGS,IAJM,CAYjBsF,QAAO,GAAG,CAACtF,CAAD,CAAO8mC,CAAP,CAAkB,CAE1B,MADA9mC,EAAA,YACA,CADgB8mC,CADU,CAkC5B,EAAA,UAAA,EAAA,CAAAC,QAAc,EAAG,CACf,MAAO,KAAAtD,EADQ,CAKnB8C,GAAAjqC,UAAA,eAAA,CAAwCiqC,EAAAjqC,UAAAyqC,E,CChDhBxrB,QAAA,GAAQ,CAACtb,CAAD,CAAW,CACzC,IAAM+mC,EAAS,IAAA1rB,QAAT0rB,EAAyB,IAAAzrB,gBAAzByrB,EACJ,IAAAxrB,mBADIwrB,EACuB,IAAAvrB,kBADvBurB,EAEJ,IAAAtrB,iBAFIsrB,EAEqB,IAAArrB,sBAC3B,OAAOqrB,EAAP,EAAiBA,CAAAvqC,KAAA,CAAY,IAAZ,CAAkBwD,CAAlB,CAJwB,CAO3C,IAAM6a,GAAQ9d,SAAAC,UAAAuX,MAAA,CAA0B,SAA1B,CAId,SAAMyyB,GAAN,EAAA,EAUEC,QAAA,GAAc,CAAChI,CAAD,CAAQ,CAAA,IACHiI,EAAQ,EADL,CACSC,EAAY,EADrB,CACyBC,EAAY,CHiB7ClG,GGhBZ,CAAsBjC,CAAtB,CAA6B,QAAQ,CAACqC,CAAD,CAAO,CAC1C+F,EAAA,CAAkB/F,CAAlB,CAEAA,EAAAtgB,MAAA,CAAaomB,CAAA,EACmBpI,EAAAA,CAAAsC,CAAAgG,EAAAtI,QAwElC,KADA,IAAIrtB,CACJ,CAAQA,CAAR,CLhHSivB,EKgHG2G,KAAA,CAAqBvI,CAArB,CAAZ,CAAA,CAA4C,CAC1C,IAAI13B,EAAOqK,CAAA,CAAE,CAAF,CAGE,IAAb,GAAIA,CAAA,CAAE,CAAF,CAAJ,GA5E2Du1B,CA6EzD,CAAM5/B,CAAN,CADF,CACgB,CAAA,CADhB,CAJ0C,CA5EA,CAA5C,CAKGkgC,QAAwB,CAAClG,CAAD,CAAO,CAChC6F,CAAAjrB,KAAA,CAAeolB,CAAf,CADgC,CALlC,CASArC,EAAAwI,EAAA,CAAmBN,CAEfO,EAAAA,CAAQ,EACZ,KAAK/pC,IAAIA,CAAT,GAAcupC,EAAd,CACEQ,CAAAxrB,KAAA,CAAWve,CAAX,CAEF,OAAO+pC,EAjBa;AAqBtBL,QAAA,GAAY,CAAC/F,CAAD,CAAO,CACjB,GAAIgG,CAAAhG,CAAAgG,EAAJ,CAAA,CADiB,IAIbxC,EAAO,EAJM,CAIF6C,EAAa,EACRC,GAAAC,CAAuBvG,CAAvBuG,CAA6BF,CAA7BE,CACpB,GACE/C,CAAA6C,EAEA,CAFkBA,CAElB,CAAArG,CAAA,MAAA,CAAgB,IAHlB,CAKAwD,EAAA9F,QAAA,CAAmCsC,CAkCCtC,cAM7Bx3B,QAAA,CLtGEu5B,EKsGF,CAA8B,EAA9B,CAAAv5B,QAAA,CL5GEk5B,EK4GF,CACmB,EADnB,CAvCPY,EAAAgG,EAAA,CAAoBxC,CAXpB,CADiB,CAiBnB8C,QAAA,GAAiB,CAACtG,CAAD,CAAOqG,CAAP,CAAmB,CAClC,IAAI7C,EAAOxD,CAAAgG,EACX,IAAIxC,CAAJ,CACE,IAAIA,CAAA6C,EAAJ,CAEE,MADAlrC,OAAAuC,OAAA,CAAc2oC,CAAd,CAA0B7C,CAAA6C,EAA1B,CACO,CAAA,CAAA,CAFT,CADF,IAKO,CAED3I,CAAAA,CAAUsC,CAAA,cAGd,KAFA,IAAI/5B,CAEJ,CAAQoK,CAAR,CLtFO+uB,EKsFK6G,KAAA,CAAQvI,CAAR,CAAZ,CAAA,CAA+B,CAE7Bz3B,CAAA,CAAQu2B,CAACnsB,CAAA,CAAE,CAAF,CAADmsB,EAASnsB,CAAA,CAAE,CAAF,CAATmsB,MAAA,EAER,IAAc,SAAd,GAAIv2B,CAAJ,EAAqC,OAArC,GAA2BA,CAA3B,CACEogC,CAAA,CAAWh2B,CAAA,CAAE,CAAF,CAAAmsB,KAAA,EAAX,CAAA,CAA0Bv2B,CAE5BugC,EAAA,CAAM,CAAA,CAPuB,CAS/B,MAAOA,EAdF,CAP2B;AAoEpCC,QAAA,GAAgB,CAAhBA,CAAgB,CAACC,CAAD,CAAWd,CAAX,CAAkB,CAG5Bc,CAAJ,GAEIA,CAFJ,CAC8B,CAA5B,EAAIA,CAAApzB,QAAA,CAAiB,GAAjB,CAAJ,CACaqzB,EAAA,CAAAA,CAAA,CAAwBD,CAAxB,CAAkCd,CAAlC,CADb,CHqDU/E,EG9BG,CAAqC6F,CAArC,CAlBF7f,QAAQ,CAACma,CAAD,CAAS/6B,CAAT,CAAgBk7B,CAAhB,CAA0BF,CAA1B,CAAkC,CACjD,GAAI,CAACh7B,CAAL,CACE,MAAO+6B,EAAP,CAAgBC,CAIlB,EAFI2F,CAEJ,CAFoBH,EAAA,CALXj9B,CAKW,CAAsBo8B,CAAA,CAAM3/B,CAAN,CAAtB,CAAoC2/B,CAApC,CAEpB,GAAwC,SAAxC,GAAsBgB,CAAtB,CAI6B,oBAJ7B,GAIWA,CAJX,GAQEA,CARF,CAQkB,SARlB,EAEEA,CAFF,CAEkBH,EAAA,CATTj9B,CASS,CAAsBo8B,CAAA,CAAMzE,CAAN,CAAtB,EAAyCA,CAAzC,CAAmDyE,CAAnD,CAFlB,EAGEzE,CAOF,OAAOH,EAAP,EAAiB4F,CAAjB,EAAkC,EAAlC,EAAwC3F,CAhBS,CAkBxC,CAxBf,CA2BA,OAAOyF,EAAP,EAAmBA,CAAAlK,KAAA,EAAnB,EAAsC,EA9BN;AAkClCmK,QAAA,GAAkB,CAAlBA,CAAkB,CAACD,CAAD,CAAWd,CAAX,CAAkB,CAC9BluB,CAAAA,CAAQgvB,CAAAvzB,MAAA,CAAe,GAAf,CACZ,KAFkC,IAEzB9W,EAAE,CAFuB,CAEpBgC,CAFoB,CAEjBgS,CAAjB,CAAoBhU,CAApB,CAAsBqb,CAAAzZ,OAAtB,CAAoC5B,CAAA,EAApC,CACE,GAAKgC,CAAL,CAASqZ,CAAA,CAAMrb,CAAN,CAAT,CAAoB,CLlLbgjC,EKmLLhI,UAAA,CAA2B,CAE3B,IADAhnB,CACA,CLrLKgvB,EKoLD4G,KAAA,CAAoB5nC,CAApB,CACJ,CACEA,CAAA,CAAIooC,EAAA,CAAAA,CAAA,CAAsBb,CAAA,CAAMv1B,CAAA,CAAE,CAAF,CAAN,CAAtB,CAAmCu1B,CAAnC,CADN,KAIE,IADIiB,CACA,CADQxoC,CAAAiV,QAAA,CAAU,GAAV,CACR,CAAW,EAAX,GAAAuzB,CAAJ,CAAkB,CAChB,IAAIC,EAAKzoC,CAAA6M,UAAA,CAAY27B,CAAZ,CACTC,EAAA,CAAKA,CAAAtK,KAAA,EACLsK,EAAA,CAAKL,EAAA,CAAAA,CAAA,CAAsBK,CAAtB,CAA0BlB,CAA1B,CAAL,EAAyCkB,CACzCzoC,EAAA,CAAIA,CAAA6M,UAAA,CAAY,CAAZ,CAAe27B,CAAf,CAAJ,CAA4BC,CAJZ,CAOpBpvB,CAAA,CAAMrb,CAAN,CAAA,CAAYgC,CAAD,EAAMA,CAAAu+B,YAAA,CAAc,GAAd,CAAN,GAA6Bv+B,CAAAJ,OAA7B,CAAwC,CAAxC,CAETI,CAAAZ,MAAA,CAAQ,CAAR,CAAY,EAAZ,CAFS,CAGTY,CAHS,EAGJ,EAjBW,CAoBtB,MAAOqZ,EAAAoI,KAAA,CAAW,GAAX,CAvB2B;AAoFpCinB,QAAA,GAAsB,CAACpJ,CAAD,CAAQ92B,CAAR,CAAiB,CAAA,IACjC++B,EAAQ,EADyB,CAGjCvX,EAAI,EHjNIuR,GGmNZ,CAAsBjC,CAAtB,CAA6B,QAAQ,CAACqC,CAAD,CAAO,CAGrCA,CAAAgG,EAAL,EACED,EAAA,CAAkB/F,CAAlB,CAKF,KAAIgH,EAAkBhH,CAAA0C,EAAlBsE,EAA8ChH,CAAA,eAC9Cn5B,EAAJ,EAAem5B,CAAAgG,EAAAK,EAAf,EAA+CW,CAA/C,EACMhtB,EAAA9e,KAAA,CAAqB2L,CAArB,CAA8BmgC,CAA9B,CADN,GAEIV,EAAA,CAAuBtG,CAAvB,CAA6B4F,CAA7B,CAiUR,CA/TqBlmB,CA+TrB,CA/TqBsgB,CAAAtgB,MA+TrB,CAFI2O,CAEJ,CAFQ4Y,QAAA,CAAS7xB,CAAT,CAAa,EAAb,CAAiB,EAAjB,CAER,CA/TiCiZ,CA+TjC,CAAKA,CAAL,CAAA,EA/TiCA,CA+TtB,CAAKA,CAAL,CAAX,EAAsB,CAAtB,EADQ,CACR,EADcjZ,CACd,CADkB,EAlUd,CAV0C,CAA5C,CAiBG,IAjBH,CAiBS,CAAA,CAjBT,CAkBA,OAAO,CAACixB,EAAYT,CAAb,CAAoBsB,IAAK7Y,CAAzB,CAvB8B;AAgCvC8Y,QAAA,GAAkB,CAACz4B,CAAD,CAAQsxB,CAAR,CAAcoH,CAAd,CAAwB3hC,CAAxB,CAAkC,CAC7Cu6B,CAAAgG,EAAL,EACED,EAAA,CAAkB/F,CAAlB,CAEF,IAAKA,CAAAgG,EAAAK,EAAL,CAAA,CAGI,IAAA,EH1DQhF,EG0Dc,CAAuB3yB,CAAvB,CAArB,EAAA,CAAA,CAAA,GAAI,EAAA,CAAA,CAAA,EACL4zB,EAAAA,CAAYf,CAAA,CACdgB,EAAA,CAAgChB,CAAhC,CAAoCD,CAApC,CADc,CAEd,MACF,KAAI+F,EAAiBrH,CAAA,eAArB,CACIsH,EAA6B,WAA7BA,GAAUD,CAAVC,EAA+D,MAA/DA,GAA4CD,CADhD,CAEIE,EAA6C,CAA7CA,GAASF,CAAA/zB,QAAA,CAAuB,OAAvB,CAATi0B,EAAkD,CAACD,CAItC,QAAjB,GAAIF,CAAJ,GAEEE,CAEA,CAFSD,CAET,GAF6B/E,CAE7B,CAFyC,OAEzC,CAFmDA,CAEnD,EAFqG,EAErG,GAFiE+E,CAAA/zB,QAAA,CAAuB,MAAvB,CAEjE,CAAAi0B,CAAA,CAAS,CAACD,CAAV,EAA0D,CAA1D,GAAoBD,CAAA/zB,QAAA,CAAuBgvB,CAAvB,CAJtB,CAMiB,SAAjB,GAAI8E,CAAJ,GACEE,CACA,CAD4B,WAC5B,GADSD,CACT,EAD8D,MAC9D,GAD2CA,CAC3C,CAAAE,CAAA,CAASA,CAAT,EAAmB,CAACD,CAFtB,CAIA,IAAKA,CAAL,EAAgBC,CAAhB,CAGIP,CAeJ,CAfsB1E,CAetB,CAdIiF,CAcJ,GAZOvH,CAAA0C,EAUL,GARE1C,CAAA0C,EAQF,CAPEC,EAAA,CFwBO1L,CExBP,CACE+I,CADF,CFwBO/I,CEtBL2L,EAFF,CAGqCrB,CFjMzC,CACSiB,EADT,CEiMyCjB,CFjMzC,CAGS,EE2LL,CAIEe,CAJF,CAOF,EAAA0E,CAAA,CAAkBhH,CAAA0C,EAAlB,EAA8CJ,CAEhD,EAAA78B,CAAA,CAAS,CACP/G,GAAUsoC,CADH,CAEPO,GAAQA,CAFD,CAGPD,GAAQA,CAHD,CAAT,CAzCA,CAJkD;AAwDpDE,QAAA,GAA6B,CAAC94B,CAAD,CAAQivB,CAAR,CAAe,CAAA,IACtC8J,EAAY,EAD0B,CACtBC,EAAY,EADU,CAGtCN,EAAWzJ,CAAXyJ,EAAoBzJ,CAAA,WHzSZiC,GG0SZ,CAAsBjC,CAAtB,CAA6B,QAAQ,CAACqC,CAAD,CAAO,CAE1CmH,EAAA,CAAwBz4B,CAAxB,CAA+BsxB,CAA/B,CAAqCoH,CAArC,CAA+C,QAAQ,CAAC5D,CAAD,CAAO,CAExDxpB,EAAA9e,KAAA,CADUwT,CAAAi5B,EACV,EAD4Bj5B,CAC5B,CAA8B80B,CAAA9kC,GAA9B,CAAJ,GACM8kC,CAAA+D,GAAJ,CACEjB,EAAA,CAAuBtG,CAAvB,CAA6ByH,CAA7B,CADF,CAGEnB,EAAA,CAAuBtG,CAAvB,CAA6B0H,CAA7B,CAJJ,CAF4D,CAA9D,CAF0C,CAA5C,CAYG,IAZH,CAYS,CAAA,CAZT,CAaA,OAAO,CAACA,GAAWA,CAAZ,CAAuBD,GAAWA,CAAlC,CAjBmC;AAyB5CG,QAAA,GAAe,CAAfA,CAAe,CAAC/gC,CAAD,CAAUw/B,CAAV,CAAsBhB,CAAtB,CAAqC,CAE9C,IAAA,EHtIQhE,EGsIc,CAAuBx6B,CAAvB,CAAtB,CACAghC,EAAetF,EAAA,CADd,CAAAhB,GACc,CADV,CAAAD,EACU,CADf,CAMAwG,EAAS,IAAI/C,MAAJ,CLtXUgD,eKsXV,EAHQlhC,CAAA26B,QAAAwG,CACnB,IADmBA,CACZH,CAAApqC,MAAA,CAAmB,CAAnB,CAAuB,EAAvB,CADYuqC,CACgB,KADhBA,CAEnBH,CACW,ELrXUI,iBKqXV,CAETtK,EAAAA,CAAQuK,CAAA,CAAcrhC,CAAd,CAAAq7B,EACZ,KAAIiG,EACFC,EAAA,CAAyCzK,CAAzC,CAAgD0H,CAAhD,CACF,OAAOpD,GAAA,CAA+Bp7B,CAA/B,CAAwC82B,CAAxC,CAA+C,QAAQ,CAACqC,CAAD,CAAO,CAvLrE,IAAIqI,EAAS,EAwLUrI,EAtLlBgG,EAAL,EACED,EAAA,CAqLqB/F,CArLrB,CAqLqBA,EAnLnBgG,EAAAtI,QAAJ,GACE2K,CADF,CACW1B,EAAA,CAqKAn9B,CArKA,CAkLYw2B,CAlLYgG,EAAAtI,QAAxB,CAkLkB2I,CAlLlB,CADX,CAmLuBrG,EAhLvB,QAAA,CAAkBqI,CAiLhB,IAAI,CNlYGzJ,CMkYP,EACI,CH1VMmB,EG0VL,CAA8BC,CAA9B,CADL,EAEIA,CAAA,QAFJ,CAEqB,CA3KvB,IAAIqI,EADA96B,CACA86B,CA8K6BrI,CA/KrB,QAEc,KAA1B,EA6KiCA,CA7K7BsI,GAAJ,GA6KiCtI,CA3K/BsI,GAFF,CLzNS/I,EK2Nc/jC,KAAA,CAAwB+R,CAAxB,CAFvB,CAKA,IAwKiCyyB,CAxK7BsI,GAAJ,CAIE,GAAqC,IAArC,EAoK+BtI,CApK3BuI,EAAJ,CAA2C,CAoKZvI,CAnK7BuI,EAAA,CAAgC,EAChC,KAAKC,IAAIA,CAAT,GAkKmCL,EAlKnC,CACEM,CAIA,CA6JiCN,CAjKrB,CAAmBK,CAAnB,CAIZ,CAHAH,CAGA,CAHSI,CAAA,CAAUl7B,CAAV,CAGT,CAAIA,CAAJ,GAAc86B,CAAd,GACE96B,CACA,CADQ86B,CACR,CA2JyBrI,CA3JzBuI,EAAA3tB,KAAA,CAAmC4tB,CAAnC,CAFF,CAPuC,CAA3C,IAYO,CAGL,IAASnsC,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAqJ6B2jC,CArJTuI,EAAAtqC,OAApB,CAA0D,EAAE5B,CAA5D,CACEosC,CACA,CAmJiCN,CApJrB,CAoJenI,CApJIuI,EAAA,CAA8BlsC,CAA9B,CAAnB,CACZ,CAAAkR,CAAA,CAAQk7B,CAAA,CAAUl7B,CAAV,CAEV86B,EAAA,CAAS96B,CAPJ,CAwJwByyB,CA9IjC,QAAA,CAAkBqI,CA+IMrI,EA4ExB0C,EAAA,CA5EwB1C,CA4EG0C,EAA3B,EA5EwB1C,CA4E+B,SAEnDtxB,EAAAA,CAAQ,GAARA;AA9EgD22B,CA+EhD3tB,EAAAA,CA/EoBsoB,CA6ET0C,EAEHvvB,MAAA,CAAe,GAAf,CACH9W,EAAAA,CAAE,CAAX,KALkD,IAKpCsI,EAAE+S,CAAAzZ,OALkC,CAKpBI,CAA9B,CAAkChC,CAAlC,CAAoCsI,CAApC,GAA2CtG,CAA3C,CAA6CqZ,CAAA,CAAMrb,CAAN,CAA7C,EAAwDA,CAAA,EAAxD,CACEqb,CAAA,CAAMrb,CAAN,CAAA,CAAWgC,CAAA4U,MAAA,CAjFiB60B,CAiFjB,CAAA,CACTzpC,CAAA6H,QAAA,CAlFkC2hC,CAkFlC,CAAwBn5B,CAAxB,CADS,CAETA,CAFS,CAED,GAFC,CAEKrQ,CAnFM2hC,EAqFxB,SAAA,CAAmBtoB,CAAAoI,KAAA,CAAW,GAAX,CAzFI,CAJ8C,CAA9D,CAb2C,CAgCpDsoB,QAAA,GAA0B,CAAUzK,CAAV,CAAiB0H,CAAjB,CAAgC,CACpDqD,CAAAA,CAAiB/K,CAAAwI,EACrB,KAAIgC,EAAqB,EACzB,IAAI,CNtZKvJ,CMsZT,EAAqB8J,CAArB,CAIE,IAJmC,IAI1BrsC,EAAI,CAJsB,CAInBqiC,EAAgBgK,CAAA,CAAersC,CAAf,CAAhC,CACKA,CADL,CACSqsC,CAAAzqC,OADT,CAEKygC,CAFL,CAEqBgK,CAAA,CAAe,EAAErsC,CAAjB,CAFrB,CAE0C,CACnBqiC,IAAAA,EAAAA,CAAAA,CAAe2G,EAAAA,CAiCxCrF,EAAA2I,EAAA,CAAuB,IAAI5D,MAAJ,CAAW,KAAX,CAAiB/E,CAAA,cAAjB,CAAsC,WAAtC,CAAmD,GAAnD,CACvBA,EAAA4I,EAAA,CAAgC5I,CAAA,cAAhC,CAAwD,GAAxD,CAA8D6I,CAC9D7I,EAAA0C,EAAA,CAA2B1C,CAAA0C,EAA3B,EAAuD1C,CAAA,SACvDA,EAAA,SAAA,CAAmBA,CAAA0C,EAAAx8B,QAAA,CACf85B,CAAA,cADe,CACQA,CAAA4I,EADR,CAnCfT,EAAA,CAAmBzJ,CAAA,cAAnB,CAAA,CACIoK,EAAA,CAA+BpK,CAA/B,CAHoC,CAM5C,MAAOyJ,EAfiD,CAwB1DW,QAAA,GAAyB,CAACpK,CAAD,CAAgB,CACvC,MAAO,SAAQ,CAAChB,CAAD,CAAU,CACvB,MAAOA,EAAAx3B,QAAA,CACHw4B,CAAAiK,EADG,CAEHjK,CAAAkK,EAFG,CADgB,CADc;AA4IzCG,QAAA,GAAgB,CAACjJ,CAAD,CAAQuG,CAAR,CAAoB,CAApC0C,IAAAA,EAgCa9R,EAhCb8R,CACMpL,EH7hBQkC,EG6hBA,CAAwDC,CAAxD,CAEZA,EAAAl9B,YAAA,CHhjBY+8B,EGgjBQ,CAAoBhC,CAApB,CAA2B,QAAQ,CAAiBqC,CAAjB,CAAuB,CAC5E,IAAIoC,EAAMpC,CAAA,QAANoC,CAAwBpC,CAAA,cACxBA,EAAAgG,EAAJ,EAAyBhG,CAAAgG,EAAAtI,QAAzB,GASE0E,CAEA,CAFuDA,CPlXtDl8B,QAAA,CACI03B,EADJ,CACmB,EADnB,CAAA13B,QAAA,CAEI23B,EAFJ,CAEkB,EAFlB,COoXD,CAAAmC,CAAA,QAAA,CAAkB2G,EAAA,CAdXn9B,CAcW,CAAwB44B,CAAxB,CAA6BiE,CAA7B,CAXpB,CAF4E,CAA1D,CAHc,CA/hBtCvB,CAAA,OAAA,iBAAA,CAAA,EAAA,UAAA,CAAA,CAAA,EACM,CAAA,aAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,IAAckE,QAAA,EAAA,CAChB,MAJgBA,SAGA,CAAd,CADN,CAAA,CA+jBA,KAAA/R,GAAe,IAAIyO,E,CCnlBnB,IAAIuD,GAAiB,EAArB,CAKMC,GAAKvtC,MAAA,eACX,IAAIutC,EAAJ,EAAU,CPVGtK,COUb,CAAyB,CAIvB,IAAMuK,GAAaD,EAAA,OAUnBA,GAAA,OAAA,CAJsBE,QAAA,CAACpjC,CAAD,CAAOqjC,CAAP,CAAc/iB,CAAd,CAA0B,CJyGhD,IAAIgjB,EAAc/uC,QAAAgvC,cAAA,CAAuB,wBAAvB,CIxG6BvjC,CJwG7B,CACN,GADM,CAAlB,CAII0I,EAAQnU,QAAAsI,KACZ6L,EAAAhP,aAAA,CAAmB4pC,CAAnB,EAHY5I,EAAA8I,CACV9I,EAAA,YADU8I,CACyB,IAErC,GAAyC96B,CAAA5O,WAAzC,CACA4gC,GAAA,CAAoB4I,CI9GlBL,GAAA,CAAejjC,CAAf,CAAA,CJ+GKsjC,CI9GLH,GAAAjuC,KAAA,CAAsDguC,EAAtD,CAA2DljC,CAA3D,CAAiEqjC,CAAjE,CAAwE/iB,CAAxE,CAF8C,CAVzB,C,CCVvBlc,QADmBq/B,GACR,EAAgB,CAEzB,IAAAC,MAAA,CAAa,EAFY,CAgB3B,EAAA,UAAA,MAAA,CAAAC,QAAK,CAACC,CAAD,CAAUvD,CAAV,CAAsBwD,CAAtB,CAAoCxE,CAApC,CAAmD,CACtD,IAAIt0B,EAAO,IAAA24B,MAAA,CAAWE,CAAX,CAAP74B,EAA8B,EAClCA,EAAA6J,KAAA,CAAU,CAACyrB,EAAAA,CAAD,CAAawD,aAAAA,CAAb,CAA2BxE,EAAAA,CAA3B,CAAV,CAlBoByE,IAmBpB,CAAI/4B,CAAA9S,OAAJ,EACE8S,CAAA2J,MAAA,EAEF,KAAAgvB,MAAA,CAAWE,CAAX,CAAA,CAAsB74B,CANgC,CASxD,GAAA,UAAA,MAAA,CAAAg5B,QAAK,CAACH,CAAD,CAAUvD,CAAV,CAAsB2D,CAAtB,CAAwC,CAE3C,GADIj5B,CACJ,CADW,IAAA24B,MAAA,CAAWE,CAAX,CACX,CAIA,IAAK,IAAInhB,EAAM1X,CAAA9S,OAANwqB,CAAoB,CAA7B,CAAuC,CAAvC,EAAgCA,CAAhC,CAA0CA,CAAA,EAA1C,CAAiD,CAC/C,IAAI5a,EAAQkD,CAAA,CAAK0X,CAAL,CAAZ,CACI,CA3B4C,EAAA,CAAA,CAClD,IAASA,CAAT,CAAe,CAAf,CAAkBA,CAAlB,CA0BwCuhB,CA1BhB/rC,OAAxB,CAAiDwqB,CAAA,EAAjD,CAAwD,CACtD,IAAIwhB,EAyBkCD,CAzB7B,CAAiBvhB,CAAjB,CACT,IAwBmB5a,CAxBfw4B,EAAA,CAAsB4D,CAAtB,CAAJ,GAwB0B5D,CAxBQ,CAAW4D,CAAX,CAAlC,CAAkD,CAChD,CAAA,CAAO,CAAA,CAAP,OAAA,CADgD,CAFI,CAMxD,CAAA,CAAO,CAAA,CAP2C,CA2BhD,GAAI,CAAJ,CACE,MAAOp8B,EAHsC,CANN,C,CCrB5BxF,QAAA,GAAQ,EAAG;AAgC9B6hC,QAASA,GAAO,CAACC,CAAD,CAAO,CACrB,IAAK,IAAI7iC,EAAE,CAAX,CAAcA,CAAd,CAAkB6iC,CAAAlsC,OAAlB,CAA+BqJ,CAAA,EAA/B,CAAoC,CAClC,IAAI8iC,EAAMD,CAAA,CAAK7iC,CAAL,CACV,IAAI8iC,CAAAxsC,OAAJ,GAAmBrD,QAAA+I,gBAAnB,EACE8mC,CAAAxsC,OADF,GACiBrD,QAAAsI,KADjB,CAIA,IAAK,IAAIxG,EAAE,CAAX,CAAcA,CAAd,CAAkB+tC,CAAAzzB,WAAA1Y,OAAlB,CAAyC5B,CAAA,EAAzC,CAA8C,CAC5C,IAAI+Y,EAAIg1B,CAAAzzB,WAAA,CAAeta,CAAf,CACR,IAAI+Y,CAAAxW,SAAJ,GAAmBC,IAAA8G,aAAnB,CAAA,CAIA,IAAIqS,EAAO5C,CAAA+D,YAAA,EACwB/D,KAAAA,EAAAA,CAvCvC,KAAIi1B,EAAU,EACVxjC,EAAAg7B,UAAJ,CACEwI,CADF,CACYhtC,KAAAC,KAAA,CAAWuJ,CAAAg7B,UAAX,CADZ,CAEWh7B,CAFX,WAE8BlL,OAAA,WAF9B,EAEsDkL,CAAAyjC,aAAA,CAAqB,OAArB,CAFtD,GAGED,CAHF,CAGYxjC,CAAA+K,aAAA,CAAqB,OAArB,CAAAuB,MAAA,CAAoC,KAApC,CAHZ,CAKA,EAAA,CAAOk3B,CASH5hB,EAAAA,CAAM4hB,CAAA/2B,QAAA,CLoUG2jB,CKpUa8K,EAAhB,CA0BN,KAzBJ,CAyBI,CAzBO,EAAX,CAAItZ,CAAJ,CACS4hB,CAAA,CAAQ5hB,CAAR,CAAc,CAAd,CADT,CAGO,EAsBH,GAAoBzQ,CAApB,GAA6B5C,CAAA/Q,cAA7B,CACEuC,EAAA,CAAqBwO,CAArB,CAAwBm1B,CAAxB,CAAsC,CAAA,CAAtC,CADF,KAEO,IAAIvyB,CAAApZ,SAAJ,GAAsBC,IAAAG,uBAAtB;CAEDoV,CAFC,CAEgC4D,CAAD5D,KAF/B,EAQL,GADAo2B,CACI,CNiLInJ,EMlLG,CAAajtB,CAAb,CAAAmtB,GACP,CAAAgJ,CAAA,GAAiBC,CAArB,CAIE,IAFIC,CAEKjgB,CAFM7uB,MAAA,SAAA,cAAA,iBAAAT,KAAA,CACbka,CADa,CACV,QADU,CL8RV6hB,CK7RS8K,EADC,CAC0B,GAD1B,CAENvX,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CAAoBigB,CAAAxsC,OAApB,CAAqCusB,CAAA,EAArC,CACE3jB,EAAA,CAAyB4jC,CAAA,CAASjgB,CAAT,CAAzB,CAAsC+f,CAAtC,CALJ,KASIA,EAGJ,EAFE3jC,EAAA,CAAqBwO,CAArB,CAAwBm1B,CAAxB,CAAsC,CAAA,CAAtC,CAEF,CAAA3jC,EAAA,CAAqBwO,CAArB,CAAwBo1B,CAAxB,CA7BF,CAF4C,CANZ,CADf;AA4CvB,GAAI,CThFS5L,CSgFb,CAAmB,CACjB,IAAIn2B,GAAW,IAAIX,gBAAJ,CAAqBoiC,EAArB,CAAf,CACIra,GAAQA,QAAA,CAACpxB,CAAD,CAAU,CACpBgK,EAAAE,QAAA,CAAiBlK,CAAjB,CAAuB,CAAC8R,UAAW,CAAA,CAAZ,CAAkBC,QAAS,CAAA,CAA3B,CAAvB,CADoB,CAStB,IAN4B7U,MAAA,eAM5B,EALE,CAACA,MAAA,eAAA,0BAKH,CACEk0B,EAAA,CAAMt1B,QAAN,CADF,KAEO,CACL,IAAImwC,GAAeA,QAAA,EAAM,CACvB7a,EAAA,CAAMt1B,QAAA0J,KAAN,CADuB,CAIrBtI,OAAA,YAAJ,CACEA,MAAA,YAAA,UAAA,CAAmC+uC,EAAnC,CADF,CAKEC,qBAAA,CAAsB,QAAQ,EAAG,CAC/B,GAA4B,SAA5B,GAAIpwC,QAAAoV,WAAJ,CAAuC,CACrC,IAAIihB,EAAWA,QAAQ,EAAG,CACxB8Z,EAAA,EACAnwC,SAAAqV,oBAAA,CAA6B,kBAA7B,CAAiDghB,CAAjD,CAFwB,CAI1Br2B,SAAAqK,iBAAA,CAA0B,kBAA1B,CAA8CgsB,CAA9C,CALqC,CAAvC,IAOE8Z,GAAA,EAR6B,CAAjC,CAVG,CAwBPriC,EAAA,CAAQA,QAAQ,EAAG,CACjB6hC,EAAA,CAAQzhC,EAAAiT,YAAA,EAAR,CADiB,CArCF;AA5ERrT,IAAAuiC,GAAAviC,E,CCDX,IAAMwiC,GAAc,E,CCkBpB,IAAM9/B,GAAUgD,OAAAlD,QAAA,EAKTigC,SAASA,GAAU,CAACC,CAAD,CAAa,CAErC,GADI3nC,CACJ,CDxBaynC,ECuBE,CAAYE,CAAZ,CACf,CACqB3nC,CAerB,yBAIA,CAnBqBA,CAeO,yBAI5B,EAJyD,CAIzD,CAnBqBA,CAiBrB,4BAEA,CAnBqBA,CAiBU,4BAE/B,EAF+D,CAE/D,CAnBqBA,CAmBrB,sBAAA,EAnBqBA,CAmBK,sBAA1B,EAAoD,CAApD,EAAyD,CAtBpB,CAyChC4nC,QAASA,GAAe,CAAC5nC,CAAD,CAAW,CACxC,MAAOA,EAAA,yBAAP,GAAqCA,CAAA,sBADG,CA4CnC6nC,QAASA,GAAuB,CAAC7nC,CAAD,CAAW,CAEhDA,CAAA,4BAAA,CAA+BA,CAAA,sBAE1BA,EAAA8nC,GAAL,GACE9nC,CAAA8nC,GACA,CADuB,CAAA,CACvB,CAAAngC,EAAAf,KAAA,CAAa,QAAQ,EAAG,CAEtB5G,CAAA,yBAAA,CAA4BA,CAAA,sBAC5BA,EAAA8nC,GAAA,CAAuB,CAAA,CAHD,CAAxB,CAFF,CAJgD,C,CC9GlD,IAAIC,GAAe,IAAnB,CAGIt7B,GAAYlU,MAAA,YAAZkU,EAAqClU,MAAA,YAAA,UAArCkU,EAA2E,IAH/E,CAMIu7B,EAKWC,SAASA,GAAY,CAAC5lC,CAAD,CAAW,CAC7CklC,qBAAA,CAAsB,QAAQ,EAAG,CAC3B96B,EAAJ,CACEA,EAAA,CAAUpK,CAAV,CADF,EAGO0lC,EAYL,GAXEA,EACA,CADe,IAAIp9B,OAAJ,CAAY,QAAA,CAAClD,CAAD,CAAa,CAACugC,EAAA,CAAYvgC,CAAb,CAAzB,CACf,CAA4B,UAA5B,GAAItQ,QAAAoV,WAAJ,CACEy7B,EAAA,EADF,CAGE7wC,QAAAqK,iBAAA,CAA0B,kBAA1B,CAA8C,QAAA,EAAM,CACtB,UAA5B,GAAIrK,QAAAoV,WAAJ,EACEy7B,EAAA,EAFgD,CAApD,CAOJ,EAAAD,EAAAnhC,KAAA,CAAkB,QAAQ,EAAE,CAAEvE,CAAA,EAAYA,CAAA,EAAd,CAA5B,CAfF,CAD+B,CAAjC,CAD6C,C,CCM/C,IAAM6lC,GAAa,ILnBJ7B,EKsBbr/B,SADmBmhC,EACR,EAAG,CAAA,IAAA,EAAA,IACZ,KAAAC,EAAA,CAAqB,EACrB,KAAAC,EAAA,CAAsBlxC,QAAA+I,gBACtB,KAAI2hC,EAAM,IdWNjJ,EcVJiJ,EAAA,MAAA,CAAe,EACf,KAAAyG,EAAA,CAA+BC,EAAA,CAAc,IAAAF,EAAd,CAAmC,IRrBvDzG,EQqBuD,CAAcC,CAAd,CAAnC,CAC/B,KAAA2G,EAAA,CAA4B,CAAA,CAG5B,KAAAC,EAAA,CAFA,IAAAC,EAEA,CAFkB,IDhBPT,GCmBX,CAAa,QAAA,EAAM,CACjBU,EAAA,CAAAA,CAAA,CADiB,CAAnB,CAVY,CAcd,CAAA,CArCF,CAAAC,UAqCExY,EAAAyY,GAAA,CAAA5jC,QAAK,EAAG,CACNuiC,EAAA,EADM,CAORpX,EAAA0Y,GAAA,CAAAA,QAAW,CAACpM,CAAD,CAAQ,CACjB,MVhBYD,GUgBL,CAAwBC,CAAxB,CADU,CAGnBtM,EAAA2Y,GAAA,CAAAA,QAAgB,CAAClH,CAAD,CAAM,CACpB,MVpCYtF,GUoCL,CAAoBsF,CAApB,CADa,CAoBtBzR;CAAA4Y,gBAAA,CAAAA,QAAe,CAAChpC,CAAD,CAAW2nC,CAAX,CAAwBzJ,CAAxB,CAAuC,CACpD,GAAI+K,CAAAjpC,CAAAipC,GAAJ,CAAA,CAGAjpC,CAAAipC,GAAA,CAAqB,CAAA,CACrBjpC,EAAA4C,KAAA,CAAgB+kC,CAChB3nC,EAAAo+B,QAAA,CAAmBF,CHnERuJ,GGoEX,CAAYE,CAAZ,CAAA,CAA2B3nC,CAnB3B,KAAA,EAAA,CADI08B,CACJ,CAoBiC18B,CArBrBf,QAAA9B,cAAA,CAA+B,OAA/B,CACZ,EAGOu/B,CAAAluB,aAAA,CAAmB,WAAnB,CAHP,EAG0C,EAH1C,CACS,EVoNL06B,KAAAA,EAAiB,EAEvB,KADA,IAAMC,EUjM6BnpC,CAzBAf,QV0NwBhC,iBAAA,CAAyB,OAAzB,CAA3D,CACShE,EAAI,CAAb,CAAgBA,CAAhB,CAAoBkwC,CAAAtuC,OAApB,CAAmC5B,CAAA,EAAnC,CAAwC,CACtC,IAAMyjC,EAAQyM,CAAA,CAAOlwC,CAAP,CACd,IAAoByjC,CDpPfwK,aAAA,CAvBuBkC,gBAuBvB,CCoPL,CACE,IAAI,CH/QG5N,CG+QP,CAAmB,CDnQvB,IAAM56B,ECoQqB87B,CDpQdl9B,YACR88B,GAAAlQ,IAAA,CAAiBxrB,CAAjB,CAAL,GACE07B,EAAA5jB,IAAA,CAAiB9X,CAAjB,CAEA,CADMyoC,CACN,CCgQyB3M,CDjQRvgC,UAAA,CAAgB,CAAA,CAAhB,CACjB,CAAAhF,QAAAsI,KAAAnC,YAAA,CAA0B+rC,CAA1B,CAHF,CCoQM3M,EAAA37B,WAAAtD,YAAA,CAA6Bi/B,CAA7B,CAFiB,CAAnB,CADF,IAMEwM,EAAA1xB,KAAA,CAAoBklB,CAAAl9B,YAApB,CACA,CAAAk9B,CAAA37B,WAAAtD,YAAA,CAA6Bi/B,CAA7B,CAToC,CAYxC,CAAA,CAAOwM,CAAAxsB,KAAA,CAAoB,EAApB,CAAA0c,KAAA,EU7MDgH,EAAAA,CAAO,CACTjC,GAAIwJ,CADK,CAETvJ,QAASF,CAFA;AAGToL,GAAYtF,CAHH,Cb3EFxI,EagFT,EACEh4B,EAAA,CAAqBxD,CAAAf,QAArB,CAAuC0oC,CAAvC,CAGFgB,GAAA,CAAAA,IAAA,CC3CIvc,EAAAA,Cb1CK6P,Ea0CC7jC,KAAA,CD4CkBkiC,CC5ClB,CAANlO,Eb3CK4P,Ea2C8B5jC,KAAA,CD4CXkiC,CC5CW,Cb1C9B2B,Ga4CXhI,UAAA,CAAwB,Cb7Cb+H,Ga8CX/H,UAAA,CAAuB,CD0CjB4N,EAAAA,Cd5CQhJ,Ec4CF,CAAMyB,CAAN,CCzCLlO,ED2CL,EbtDS2P,CasDT,EAAuC,IAAA2M,EAAvC,EACE,IAAAA,EAAA,eAAA,CAAkC7G,CAAlC,CAAuC8F,CAAvC,CAEF3nC,EAAA,UAAA,CAAwB6hC,CACxB7hC,EAAAupC,EAAA,CAAqBvF,CAEjB4C,EAAAA,CAAmB,Eb5Dd7K,Ea6DT,GACE6K,CADF,CACqBrE,EAAA,CAA+BviC,CAAA,UAA/B,CADrB,CAGA,IAAI,CAAC4mC,CAAA/rC,OAAL,EbhESkhC,CagET,CACannB,CAGX,CbtGO4mB,CamGI5mB,CAAe5U,CAAAf,QAAf2V,CAAkCA,IAG7C,CAFkB5B,CAElB,CN3ES6yB,EMyES7yB,CAAe20B,CAAf30B,CAElB,CAKEsnB,CALF,CAKYuE,EAAA,CAN0BuB,CAM1B,CANgCpgC,CAAAu6B,UAMhC,CALZ,CAOA,CAPA,CAMED,CAAAz/B,OAAJ,CVfYqiC,EUgBH,CAAmB5C,CAAnB,CAR+B8F,CAQHjC,GAA5B,CAAqCqL,CAArC,CAAiDx2B,CAAjD,CADT,CAFyD,IAAA,EAJvD,CAAAhT,CAAAypC,GAAA,CAAkB/M,CAEpB18B,EAAA0pC,GAAA,CAA6B9C,CAtC7B,CADoD,CA8EtD+C;QAAA,GAA2B,CAA3BA,CAA2B,CAAG,CACxBlB,CAAA,CAAAA,EAAJ,EAEWlwC,MAAAsjC,SAFX,EAE8BtjC,MAAAsjC,SAAA+N,qBAF9B,GAGE,CAAAnB,EAGA,CAH2ElwC,MAAAsjC,SAAA+N,qBAG3E,CADA,CAAAnB,EAAA,kBACA,CADkD,QAAA,CAAC/L,CAAD,CAAW,CANnC,CAMoCmN,GAAA,CAAqCnN,CAArC,CAAD,CAC7D,CAAA,CAAA+L,EAAA,iBAAA,CAAiD,QAAA,EAAM,CACrDlB,qBAAA,CAAsB,QAAA,EAAM,CAC1B,CATsB,CASlBkB,EAAA,SAAJ,EATsB,CASwBD,EAA9C,GATsB,CAUpBsB,EAAA,EAFwB,CAA5B,CADqD,CANzD,CAD4B,CAgB9BnB,QAAA,GAAO,CAAPA,CAAO,CAAG,CAvBJD,CAwBJqB,CAxBIrB,EAAJ,EAEWnwC,MAAAsjC,SAFX,EAE8BtjC,MAAAsjC,SAAAmO,UAF9B,GAwBAD,CArBErB,EACA,CADkBnwC,MAAAsjC,SAAAmO,UAClB,CAoBFD,CApBErB,EAAA,gBAAA,CFlHUhB,EE8GZ,CAyBAiC,GAAA,CAAAA,CAAA,CAFQ;AAOVvZ,CAAA0Z,EAAA,CAAAA,QAAiB,EAAG,CAClBnB,EAAA,CAAAA,IAAA,CACA,IAAK,IAAAF,EAAL,CAAA,CAGA,IAAIwB,EAAe,IAAAxB,EAAA,cAAA,EAEnB,IAAK,IAAAA,EAAA,SAAL,CAAA,CAGA,Gb9IS1M,Ca8IT,CAsKA,IAAK,IAAI9iC,EAAI,CAAb,CAAgBA,CAAhB,CAlKuCgxC,CAkKnBpvC,OAApB,CAAyC5B,CAAA,EAAzC,CAA8C,CAE5C,IAAI2B,EApKJsvC,IAoKQzB,EAAA,uBAAA,CApK6BwB,CAmK7BjoC,CAAa/I,CAAb+I,CACA,CACR,IAAIpH,CAAJ,EbvTOmhC,CauTP,EArKAmO,IAuMwBxB,EAlCxB,CAkCyC,CACzC,IAAI7G,EVjWMpF,EUiWA,CAAwBC,CAAxB,CACViM,GAAA,CAzMAuB,IAyMA,CAzMAA,KA0MAxB,EAAA,eAAA,CAAkC7G,CAAlC,CACAnF,EAAAl9B,YAAA,CVrXU+8B,EUqXU,CAAoBsF,CAApB,CAJqB,CArCG,CAtK9C,IA+KA,KA9KEsI,EAAA,CAAAA,IAAA,CAAuB,IAAA9B,EAAvB,CAA4C,IAAAC,EAA5C,CA8KOrvC,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CA7K0BgxC,CA6KNpvC,OAApB,CAAyC5B,CAAA,EAAzC,CAGE,CADI2B,CACJ,CAhLAwvC,IA+KQ3B,EAAA,uBAAA,CA/KgBwB,CA8KhBjoC,CAAa/I,CAAb+I,CACA,CACR,GACE2jC,EAAA,CAAiC/qC,CAAjC,CAjLFwvC,IAiLsC9B,EAAApG,EAApC,CA7KJ,KAAAuG,EAAA,SAAA,CAAyC,CAAA,CAErC,KAAAD,EAAJ,EAAiC,CbtJxBzM,CasJT,EACE,IAAAsO,cAAA,EAZF,CALA,CAFkB,CA4BpBja;CAAAqW,aAAA,CAAAA,QAAY,CAACz1B,CAAD,CAAOs5B,CAAP,CAAsB,CAC3B,IAAA,EV4COrM,EU5CD,CAAuBjtB,CAAvB,CAAN,GAAA,CACDmxB,EAAY2C,CAAA,CAAc9zB,CAAd,CAChB,IAAKmxB,CAAAA,CAAL,CAAA,CApFI,IAAA,EV8HQlE,EU9Hc,CAqFMjtB,CArFN,CAArB,EAAA,CAAA,CAAA,GAAI,EAAA,CAAA,CAAA,EACT,KAAIgC,ENvFO6yB,EMuFO,CAAe1H,CAAf,CACdn+B,EAAAA,CH/GOynC,EG+GI,CAAYtJ,CAAZ,CAIf,IAAIn+B,CAAJ,CAAc,CACZ,IAAA6hC,EAAM7hC,CAAA,UACN,KAAA8hC,EAAwB9hC,CAAA0pC,GAFZ,CAKd,CAAA,CAAOnB,EAAA,CA0EyBv3B,CA1EzB,CACL,IRxHS4wB,EQwHT,CACEC,CADF,CAEE7uB,CAFF,CAGE8uB,CAHF,CAKE5D,CALF,CADK,CAyEP,CAIuBltB,CAAvB,GAAKu5B,IAuDYlC,EAvDjB,GACE,IAAAG,EADF,CAC8B,CAAA,CAD9B,CAGI8B,EAAJ,GACEnI,CAAAJ,EAEA,CADEI,CAAAJ,EACF,EADuC,EACvC,CAAAhqC,MAAAuC,OAAA,CAAc6nC,CAAAJ,EAAd,CAAiDuI,CAAjD,CAHF,CAKA,Ib/KSvO,Ca+KT,CAKO,CACL,GAAIoG,CAAAJ,EAAJ,CAAA,CAC+BA,CAAAA,CAAAI,CAAAJ,EChNnC,KAAK9mC,IAAIA,CAAT,GAAcgoC,EAAd,CAEY,IAAV,GAAIhoC,CAAJ,CD8M2B+V,CC7MzB0rB,MAAA8N,eAAA,CAA6BvvC,CAA7B,CADF,CD8M2B+V,CC3MzB0rB,MAAA+N,YAAA,CAA0BxvC,CAA1B,CAA6BgoC,CAAA,CAAWhoC,CAAX,CAA7B,CD0MA,CAKA,KAFI+E,CAEJ,CHxNSynC,EGsNM,CAAYtJ,CAAZ,CAEf,GAAoCntB,CAApC,GAAkBu5B,IAoCHlC,EApCf,GAGIroC,CAHJ,EAGgBA,CAAAypC,GAHhB,EAGmC,CF5JzB7B,EE4J0B,CAA+B5nC,CAA/B,CAHpC,CAG8E,CAE5E,GFvIE4nC,EAAA,CEuIuC5nC,CFvIvC,CEuIF,EAAyCA,CFvIV,4BEuI/B,GAAyCA,CFvIuB,sBEuIhE,CACE2oC,EAAA,CAAAA,IAAA,CAGA,CAFA,IAAAD,EAEA,EAFmB,IAAAA,EAAA,eAAA,CAAkC1oC,CAAA,UAAlC,CAAyDm+B,CAAzD,CAEnB,CADAn+B,CAAAypC,GAAAjqC,YACA;AAD8Bq/B,EAAA,CAA+B7tB,CAA/B,CAAqCmxB,CAAArD,EAArC,CAC9B,CFtHM+I,EEsHN,CAAuC7nC,CAAvC,CbrOGw7B,EawOL,GACM5mB,CADN,CACa5D,CAAAgM,WADb,IAGgBpI,CAAAzX,cAAAu/B,CAAmB,OAAnBA,CACZl9B,YAJJ,CAIwBq/B,EAAA,CAA+B7tB,CAA/B,CAAqCmxB,CAAArD,EAArC,CAJxB,CAOAqD,EAAArD,EAAA,CAAuB9+B,CAAA,UAhBqD,CATzE,CALP,IAEE,IADDmqC,EAAA,CAAAA,IAAA,CAAuBn5B,CAAvB,CAA6BmxB,CAA7B,CACK,CAAAA,CAAAL,GAAA,EAAmCK,CAAAL,GAAAjnC,OAAvC,CAAA,CACmCsnC,CAAAA,CAAAA,CA+CjChE,EAAAA,CVpBQF,EUoBH,CA/CsBjtB,CA+CtB,CAAAmtB,GAGLuM,EAAAA,CAAc,CAFdC,CAEc,CAFDzC,EAAAvB,MAAA,CAAiBxI,CAAjB,CAAqBgE,CAAAD,EAArB,CAAgDC,CAAAL,GAAhD,CAEC,EAAa6I,CAAAlE,aAAb,CAAuC,IACrDmE,EAAAA,CAAmBzI,CAAAF,EAEG,EAJA4I,CAIA,CAJAA,CAIA,EAJAA,CAAAA,EAIA,IAlOtB5gC,CACJ,CAiOiD,IAlOxCm+B,EAAA,CAkOwCxlC,CAlOxC,CACT,EAiOiD,IAlOZwlC,EAAA,CAkOYxlC,CAlOZ,CACrC,EADiE,CACjE,EADsE,CACtE,CAAA,CAAA,CAiOiDA,CAjOjD,CAAc,GAAd,CAAkBqH,CAiOQ,CAA1Bk4B,EAAAF,EAAA,CAA0B,CACqDA,EAAAA,CAAAE,CAAAF,EP+OjF6I,EAAAA,CA8FajX,EA5FPyG,EAAAA,CAAUoC,CAAA,CAAQA,CAAAl9B,YAAR,EAA6B,EAA7B,CACZglC,EAAA,CAAAA,CAAA,COxS6BxzB,CPwS7B,COlPkDmxB,CAAAD,EPkPlD,CAA0C5mC,CAA1C,CAEE6mC,EAAAA,CAAY2C,CAAA,CO1Se9zB,CP0Sf,CAChB,KAAIpW,EAAIunC,CAAAH,EACJpnC,EAAJ,EAAS,CNhgBA4gC,CMggBT,EAA2B5gC,CAA3B,GAAiC8hC,CAAjC,GACE9hC,CAAA,UAAA,EACA,CAAsB,CAAtB,EAAIA,CAAA,UAAJ,EAA2BA,CAAAmG,WAA3B,EACEnG,CAAAmG,WAAAtD,YAAA,CAAyB7C,CAAzB,CAHJ,CNhgBS4gC,EMwgBT,CAEM2G,CAAAH,EAAJ,EACEG,CAAAH,EAAAxiC,YACA,CADoC86B,CACpC,CAAAoC,CAAA,CAAQyF,CAAAH,EAFV,EAIW1H,CAJX,GAOEoC,CAPF,CH7aUQ,EGobA,CAAmB5C,CAAnB,CAA4Bh/B,CAA5B,CO7TmB0V,CP6TmBgM,WAAtC,CACNmlB,CAAAnvB,EADM,CAPV,CAFF,CAcO0pB,CAAL,CAQYA,CAAA37B,WARZ;CASMoV,EAKJ,EAL0C,EAK1C,CALamkB,CAAApqB,QAAA,CAAgB,QAAhB,CAKb,GAFEwsB,CAAAl9B,YAEF,CAFsB86B,CAEtB,EHxZQ+C,EGwZR,CAAqBX,CAArB,CAA4B,IAA5B,CAAkCyF,CAAAnvB,EAAlC,CAdF,EAGMsnB,CAHN,GAIIoC,CAJJ,CHzbUQ,EG6bE,CAAmB5C,CAAnB,CAA4Bh/B,CAA5B,CAAsC,IAAtC,CACN6mC,CAAAnvB,EADM,CAJZ,CAkBE0pB,EAAJ,GACEA,CAAA,UAKA,CALqBA,CAAA,UAKrB,EAL2C,CAK3C,CAHIyF,CAAAH,EAGJ,EAH6BtF,CAG7B,EAFEA,CAAA,UAAA,EAEF,CAAAyF,CAAAH,EAAA,CAAwBtF,CAN1B,CAQA,EAAA,CAAOA,CNhjBElB,Ea2QT,GACkDyG,CPiOlD,COjOkDE,CAAAF,EPiOlD,CANI8I,CAMJ,CAPI/oC,CAOJ,COzR+BgP,CPkRvBxC,aAAA,CAAqB,OAArB,CAOR,EAPyC,EAOzC,COjO2Eo8B,CPiO3E,GAJEG,CAIF,CAJM/oC,CAAAc,QAAA,CACF,IAAI6+B,MAAJ,CAAW,iBAAX,CO9NuEiJ,CP8NvE,CAAiD,MAAjD,CAAyD,GAAzD,CADE,CAC6D,GAD7D,CAIN,EADAG,CACA,GADMA,CAAA,CAAI,GAAJ,CAAU,EAChB,EADoC,UACpC,CAD0CzvC,CAC1C,CAAI0G,CAAJ,GAAU+oC,CAAV,EH3QY/M,EG4QV,CO1R6BhtB,CP0R7B,CAAsC+5B,CAAtC,COnOF,CAGKJ,EAAL,EACEzC,EAAA3B,MAAA,CAAiBpI,CAAjB,CAAqBgE,CAAAD,EAArB,CAAgDxF,CAAhD,CAAuDyF,CAAAF,EAAvD,CA5DA,CAjB8B,CAiDlC+I,SAAA,GAAkB,CAAlBA,CAAkB,CAAC3vC,CAAD,CAAO,CAGvB,MAAA,CADI2V,CACJ,CAFW3V,CAAA0a,YAAAnB,EACA5D,KACX,EACM8zB,CAAA,CAAc9zB,CAAd,CAAJ,CACSA,CADT,CAGSg6B,EAAA,CAAAA,CAAA,CAAwBh6B,CAAxB,CAJX,CAOO,CAAAq3B,EAVgB;AAgCzB8B,QAAA,GAAiB,CAAjBA,CAAiB,CAACn5B,CAAD,CAAOmxB,CAAP,CAAkB,CAC7B8I,CAAAA,CAAQD,EAAA,CAAAA,CAAA,CAAwBh6B,CAAxB,CACZ,KAAIk6B,EAAiBpG,CAAA,CAAcmG,CAAd,CAEjBzI,EAAAA,CAAQzqC,MAAA4H,OAAA,CADUurC,CAAAhJ,EACV,EAAiC,IAAjC,CACZ,KAAIiJ,EAAmB/G,EAAA,CAA8CpzB,CAA9C,CAAoDmxB,CAAArD,EAApD,CAEnBsM,EAAAA,CADezH,EAAA0H,CAAuCH,CAAApM,EAAvCuM,CAAkEr6B,CAAlEq6B,CACUpI,EAC7BlrC,OAAAuC,OAAA,CACEkoC,CADF,CAEE2I,CAAA9G,GAFF,CAGE+G,CAHF,CAIED,CAAA7G,GAJF,CAMiCvC,EAAAA,CAAAI,CAAAJ,EAKjC,KAAK9mC,IAAIA,CAAT,GAAcqwC,EAAd,CAIE,IAHIP,CAGJ,CAHQO,CAAA,CAAUrwC,CAAV,CAGR,GAAe,CAAf,GAAS8vC,CAAT,CATwBvI,CAUtB,CAAMvnC,CAAN,CAAA,CAAW8vC,CPhLjBQ,EAAAA,CA4da1X,EAzdPmP,EAAAA,CAAQjrC,MAAAgD,oBAAA,COoKUynC,CPpKV,CACZ,KAASvpC,CAAT,CAAW,CAAX,CAAiBA,CAAjB,CAAqB+pC,CAAAnoC,OAArB,CAAmC5B,CAAA,EAAnC,CACE+Y,CACA,CADIgxB,CAAA,CAAM/pC,CAAN,CACJ,COiKoBupC,CPjKpB,CAAMxwB,CAAN,CAAA,CAAWqxB,EAAA,CAAAA,CAAA,COiKSb,CPjKa,CAAMxwB,CAAN,CAAtB,COiKSwwB,CPjKT,COkKbL,EAAAD,EAAA,CAA4BM,CAhBK,CAiCnCpS,CAAAia,cAAA,CAAAA,QAAa,CAACpH,CAAD,CAAa,CACxB,IAAAuI,aAAA,CAAkB,IAAAnD,EAAlB,CAAuCpF,CAAvC,CADwB,CAS1B7S;CAAAob,aAAA,CAAAA,QAAY,CAACx6B,CAAD,CAAOiyB,CAAP,CAAmB,CAC7B,IAAIruB,EAAO5D,CAAAgM,WACX,EAAIpI,CAAJ,EAA8B5D,CAA9B,GAAYu5B,IA/DKlC,EA+DjB,GACE,IAAA5B,aAAA,CAAkBz1B,CAAlB,CAAwBiyB,CAAxB,CAIF,IADIwI,CACJ,CADqB72B,CACrB,GAD8BA,CAAAiG,SAC9B,EAD+CjG,CAAArZ,WAC/C,EACE,IAAStC,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBwyC,CAAA5wC,OAApB,CAA2C5B,CAAA,EAA3C,CAEE,IAAAuyC,aAAA,CADoCC,CAAAzpC,CAAe/I,CAAf+I,CACpC,CAHJ,KAQE,IADI6Y,CACJ,CADe7J,CAAA6J,SACf,EADgC7J,CAAAzV,WAChC,CACE,IAAStC,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB4hB,CAAAhgB,OAApB,CAAqC5B,CAAA,EAArC,CAEE,IAAAuyC,aAAA,CADoC3wB,CAAA7Y,CAAS/I,CAAT+I,CACpC,CAlBuB,CA0C/BouB,EAAAyZ,GAAA,CAAAA,QAA+B,CAACnN,CAAD,CAAQ,CAAA,IAAA,EAAA,IAAA,CACjCmF,EV7UQpF,EU6UF,CAAwBC,CAAxB,CVpTEF,GUqTZ,CAAsBqF,CAAtB,CAA2B,QAAA,CAACjF,CAAD,CAAU,CACnC,Gb1WOpB,Ca0WP,CACE8F,EAAA,CAAuC1E,CAAvC,CADF,KAAA,CT3DJ8O,IAAAA,EA+Ca7X,CSeuB+I,ET5DlC,SAAA,CS4DkCA,CT5Df,eACnB0E,GAAA,CS2DkC1E,CT3DlC,CS2DkCA,ET1MlC,SAAA,CS0MkCA,CT1Mf0C,EAAnB,CACEC,EAAA,CA+IFoM,CA/IE,CSyMgC/O,CTzMhC,CA+IwB,CAAA4E,EA/IxB,CA+IFl2B,IAAA,EA/IE,CA+IF4zB,IAAA,EA/IE,CSsMA,CbxUOnD,Ca6UP,GACE4M,EAAA,CAAAA,CAAA,CACA,CAAA,CAAAD,EAAA,EAAmB,CAAAA,EAAA,cAAA,CAAiC9L,CAAjC,CAFrB,CANmC,CAArC,CbvUSb,EakVT,CACEW,CAAAl9B,YADF,CV1WY+8B,EU2WU,CAAoBsF,CAApB,CADtB,CAGE,IAAAyG,EAAAxJ,EAAA,MAAAtnB,KAAA,CAAsDqqB,CAAtD,CAhBmC,CA2BvCzR;CAAAwb,sBAAA,CAAAA,QAAqB,CAACnoC,CAAD,CAAU6/B,CAAV,CAAoB,CACvC,IAAIzgC,CbjWKk5B,EakWT,GAGEl5B,CAHF,CAGUq/B,CADQ4C,CAAA,CAAcrhC,CAAd,CACRy+B,EADkC4C,CAAA,CAAckG,EAAA,CAAAA,IAAA,CAAwBvnC,CAAxB,CAAd,CAClCy+B,GAAA,CAA0BoB,CAA1B,CAHV,CASA,OAAO,CAHPzgC,CAGO,CAHCA,CAGD,EAHUtK,MAAAszC,iBAAA,CAAwBpoC,CAAxB,CAAAqoC,iBAAA,CAAkDxI,CAAlD,CAGV,EAAQzgC,CAAAu2B,KAAA,EAAR,CAAuB,EAXS,CAgBzChJ,EAAA2b,GAAA,CAAAA,QAAe,CAACtoC,CAAD,CAAUuoC,CAAV,CAAuB,CACpC,IAAIp3B,EAAOnR,CAAAsS,YAAA,EACPkxB,EAAAA,CAAU+E,CAAA,CAAcA,CAAAj8B,MAAA,CAAkB,IAAlB,CAAd,CAAwC,EAClDk8B,EAAAA,CAAYr3B,CAAA5D,KAAZi7B,EAAyBr3B,CAAA5D,KAAApP,UAI7B,IAAI,CAACqqC,CAAL,CAAgB,CACd,IAAIC,EAAYzoC,CAAA+K,aAAA,CAAqB,OAArB,CAChB,IAAI09B,CAAJ,CAAe,CACTC,CAAAA,CAAKD,CAAAn8B,MAAA,CAAgB,IAAhB,CACT,KAAK,IAAI9W,EAAE,CAAX,CAAcA,CAAd,CAAkBkzC,CAAAtxC,OAAlB,CAA6B5B,CAAA,EAA7B,CACE,GAAIkzC,CAAA,CAAGlzC,CAAH,CAAJ,GThEK46B,CSgES8K,EAAd,CAA2C,CACzCsN,CAAA,CAAYE,CAAA,CAAGlzC,CAAH,CAAK,CAAL,CACZ,MAFyC,CAHhC,CAFD,CAYZgzC,CAAJ,EACEhF,CAAAzvB,KAAA,CTxESqc,CSwEI8K,EAAb,CAA0CsN,CAA1C,CbpYOlQ,EasYT,GACMoG,CADN,CACkB2C,CAAA,CAAcrhC,CAAd,CADlB,GAEmB0+B,CAAAF,EAFnB,EAGIgF,CAAAzvB,KAAA,CP4KOqc,EO5KM+R,EAAb,CAA0CzD,CAAAF,EAA1C,CVzMQjE,GU4MZ,CAA6Bv6B,CAA7B,CAAsCwjC,CAAAvqB,KAAA,CAAa,GAAb,CAAtC,CA5BoC,CA8BtC0T,EAAAgc,GAAA,CAAAA,QAAiB,CAAC/wC,CAAD,CAAO,CACtB,MAAOypC,EAAA,CAAczpC,CAAd,CADe,CAM1B8sC,EAAAxwC,UAAA,MAAA,CAAiCwwC,CAAAxwC,UAAAsN,GACjCkjC;CAAAxwC,UAAA,gBAAA,CAA2CwwC,CAAAxwC,UAAAqxC,gBAC3Cb,EAAAxwC,UAAA,aAAA,CAAwCwwC,CAAAxwC,UAAA8uC,aACxC0B,EAAAxwC,UAAA,cAAA,CAAyCwwC,CAAAxwC,UAAA0yC,cACzClC,EAAAxwC,UAAA,aAAA,CAAwCwwC,CAAAxwC,UAAA6zC,aACxCrD,EAAAxwC,UAAA,sBAAA,CAAiDwwC,CAAAxwC,UAAAi0C,sBACjDzD,EAAAxwC,UAAA,gBAAA,CAA2CwwC,CAAAxwC,UAAAo0C,GAC3C5D,EAAAxwC,UAAA,kBAAA,CAA6CwwC,CAAAxwC,UAAAy0C,GAC7CjE,EAAAxwC,UAAA,gCAAA,CAA2DwwC,CAAAxwC,UAAAkyC,GAC3D1B,EAAAxwC,UAAA,YAAA,CAAuCwwC,CAAAxwC,UAAAmxC,GACvCX,EAAAxwC,UAAA,iBAAA,CAA4CwwC,CAAAxwC,UAAAoxC,GAC5CZ;CAAAxwC,UAAA,kBAAA,CAA6CwwC,CAAAxwC,UAAAmyC,EAC7C/xC,OAAAqF,iBAAA,CAAwB+qC,CAAAxwC,UAAxB,CAA+C,CAC7C,aAAgB,CACd,IAAAM,QAAG,EAAG,CACJ,MbrcOujC,EaocH,CADQ,CAD6B,CAM7C,UAAa,CACX,IAAAvjC,QAAG,EAAG,CACJ,MbxaO8jC,EauaH,CADK,CANgC,CAA/C,C,CE9bA,IAAM5a,EAAc,IFgBLgnB,CEhBf,CAEI6B,EAFJ,CAEeJ,EAEXrxC,OAAA,SAAJ,GACEyxC,EACA,CADYzxC,MAAA,SAAA,UACZ,CAAAqxC,EAAA,CAAuBrxC,MAAA,SAAA,qBAFzB,CAKAA,OAAAsjC,SAAA,CAAkB,CAChBsM,YAAahnB,CADG,CAOhB,gBAAA6nB,QAAe,CAAChpC,CAAD,CAAW2nC,CAAX,CAAwB0E,CAAxB,CAAwC,CACrDlrB,CAAA2oB,EAAA,EACA3oB,EAAA6nB,gBAAA,CAA4BhpC,CAA5B,CAAsC2nC,CAAtC,CAAmD0E,CAAnD,CAFqD,CAPvC,CAgBhB,aAAAb,QAAY,CAAC/nC,CAAD,CAAUw/B,CAAV,CAAsB,CAChC9hB,CAAA2oB,EAAA,EACA3oB,EAAAqqB,aAAA,CAAyB/nC,CAAzB,CAAkCw/B,CAAlC,CAFgC,CAhBlB,CAwBhB,aAAAwD,QAAY,CAAChjC,CAAD,CAAU,CACpB0d,CAAA2oB,EAAA,EACA3oB,EAAAslB,aAAA,CAAyBhjC,CAAzB,CAFoB,CAxBN,CAgChB,cAAA4mC,QAAa,CAACpH,CAAD,CAAa,CACxB9hB,CAAA2oB,EAAA,EACA3oB,EAAAkpB,cAAA,CAA0BpH,CAA1B,CAFwB,CAhCV,CA0ChB,sBAAA2I,QAAqB,CAACnoC,CAAD,CAAU6/B,CAAV,CAAoB,CACvC,MAAOniB,EAAAyqB,sBAAA,CAAkCnoC,CAAlC,CAA2C6/B,CAA3C,CADgC,CA1CzB,CA8ChBxH,UfzBWC,CerBK,CAgDhBP,af7DWA,CeaK,CAmDdwO,GAAJ,GACEzxC,MAAAsjC,SAAAmO,UADF,CAC8BA,EAD9B,CAIIJ;EAAJ,GACErxC,MAAAsjC,SAAA+N,qBADF,CACyCA,EADzC,C,CCpEA,IAAIjR,GAAiBpgC,MAAA,eAArB,CACI0b,GAAc1b,MAAA,YADlB,CAEI+zC,GAAW/zC,MAAA,oBAIfA,OAAA2C,cAAA,CAAuB3C,MAAA2C,cAAvB,EAA+C,EAE/C,IAAIy9B,EAAJ,EAAsBA,EAAA,0BAAtB,CAAmE,CAGjE,IAAI4T,EAAJ,CACIC,GAAsBA,QAA4B,EAAG,CACvD,GAAID,EAAJ,CAAmB,CAEbD,EAAA9rC,EAAJ,EACE8rC,EAAA9rC,EAAA,CAAmBjI,MAAApB,SAAnB,CAEF,KAAIohB,EAAKg0B,EACTA,GAAA,CAAgB,IAChBh0B,EAAA,EACA,OAAO,CAAA,CARU,CADoC,CADzD,CAaIk0B,GAAgBx4B,EAAA,UACpB0kB,GAAA,0BAAA,CAA4C,QAAQ,CAACpgB,CAAD,CAAK,CACvDg0B,EAAA,CAAgBh0B,CAChBk0B,GAAA,CAAcD,EAAd,CAFuD,CAAzD,CAKAv4B,GAAA,UAAA,CAA2B,QAAQ,CAACsE,CAAD,CAAK,CACtCk0B,EAAA,CAAc,QAAQ,EAAG,CAInBD,EAAA,EAAJ,CACEv4B,EAAA,UAAA,CAAyBsE,CAAzB,CADF,CAGEA,CAAA,EAPqB,CAAzB,CADsC,CAtByB;AAqCnEtE,EAAA,UAAA,CAAyB,QAAQ,EAAG,CAClCszB,qBAAA,CAAsB,QAAQ,EAAG,CAC/BhvC,MAAA2C,cAAAwxC,MAAA,CAA6B,CAAA,CAC7Bv1C,SAAAic,cAAA,CAAuB,IAAI5a,WAAJ,CAAgB,oBAAhB,CAAsC,CAACK,QAAS,CAAA,CAAV,CAAtC,CAAvB,CAF+B,CAAjC,CADkC,CAApC,C,CCrCA,IAAI6jC,GAAQvlC,QAAA+G,cAAA,CAAuB,OAAvB,CACZw+B,GAAAl9B,YAAA,CAAoB,sIAQpB,KAAIC,GAAOtI,QAAAgG,cAAA,CAAuB,MAAvB,CACXsC,GAAAnD,aAAA,CAAkBogC,EAAlB,CAAyBj9B,EAAA/C,WAAzB,C","file":"webcomponents-lite.js","sourcesContent":["/**\n * @license\n * Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n 'use strict';\n\n // defaultPrevented is broken in IE.\n // https://connect.microsoft.com/IE/feedback/details/790389/event-defaultprevented-returns-false-after-preventdefault-was-called\n var workingDefaultPrevented = (function() {\n var e = document.createEvent('Event');\n e.initEvent('foo', true, true);\n e.preventDefault();\n return e.defaultPrevented;\n })();\n\n if (!workingDefaultPrevented) {\n var origPreventDefault = Event.prototype.preventDefault;\n Event.prototype.preventDefault = function() {\n if (!this.cancelable) {\n return;\n }\n\n origPreventDefault.call(this);\n\n Object.defineProperty(this, 'defaultPrevented', {\n get: function() {\n return true;\n },\n configurable: true\n });\n };\n }\n\n var isIE = /Trident/.test(navigator.userAgent);\n\n // CustomEvent constructor shim\n if (!window.CustomEvent || isIE && (typeof window.CustomEvent !== 'function')) {\n window.CustomEvent = function(inType, params) {\n params = params || {};\n var e = document.createEvent('CustomEvent');\n e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);\n return e;\n };\n window.CustomEvent.prototype = window.Event.prototype;\n }\n\n // Event constructor shim\n if (!window.Event || isIE && (typeof window.Event !== 'function')) {\n var origEvent = window.Event;\n window.Event = function(inType, params) {\n params = params || {};\n var e = document.createEvent('Event');\n e.initEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable));\n return e;\n };\n if (origEvent) {\n for (var i in origEvent) {\n window.Event[i] = origEvent[i];\n }\n }\n window.Event.prototype = origEvent.prototype;\n }\n\n if (!window.MouseEvent || isIE && (typeof window.MouseEvent !== 'function')) {\n var origMouseEvent = window.MouseEvent;\n window.MouseEvent = function(inType, params) {\n params = params || {};\n var e = document.createEvent('MouseEvent');\n e.initMouseEvent(inType,\n Boolean(params.bubbles), Boolean(params.cancelable),\n params.view || window, params.detail,\n params.screenX, params.screenY, params.clientX, params.clientY,\n params.ctrlKey, params.altKey, params.shiftKey, params.metaKey,\n params.button, params.relatedTarget);\n return e;\n };\n if (origMouseEvent) {\n for (var i in origMouseEvent) {\n window.MouseEvent[i] = origMouseEvent[i];\n }\n }\n window.MouseEvent.prototype = origMouseEvent.prototype;\n }\n\n // ES6 stuff\n if (!Array.from) {\n Array.from = function (object) {\n return [].slice.call(object);\n };\n }\n\n if (!Object.assign) {\n var assign = function(target, source) {\n var n$ = Object.getOwnPropertyNames(source);\n for (var i=0, p; i < n$.length; i++) {\n p = n$[i];\n target[p] = source[p];\n }\n }\n\n Object.assign = function(target, sources) {\n var args = [].slice.call(arguments, 1);\n for (var i=0, s; i < args.length; i++) {\n s = args[i];\n if (s) {\n assign(target, s);\n }\n }\n return target;\n }\n }\n\n})(window.WebComponents);\n",null,null,null,null,null,"/**\n * @license\n * Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// minimal template polyfill\n(function() {\n 'use strict';\n\n var needsTemplate = (typeof HTMLTemplateElement === 'undefined');\n var brokenDocFragment = !(document.createDocumentFragment().cloneNode() instanceof DocumentFragment);\n var needsDocFrag = false;\n\n // NOTE: Replace DocumentFragment to work around IE11 bug that\n // causes children of a document fragment modified while\n // there is a mutation observer to not have a parentNode, or\n // have a broken parentNode (!?!)\n if (/Trident/.test(navigator.userAgent)) {\n (function() {\n\n needsDocFrag = true;\n\n var origCloneNode = Node.prototype.cloneNode;\n Node.prototype.cloneNode = function cloneNode(deep) {\n var newDom = origCloneNode.call(this, deep);\n if (this instanceof DocumentFragment) {\n newDom.__proto__ = DocumentFragment.prototype;\n }\n return newDom;\n };\n\n // IE's DocumentFragment querySelector code doesn't work when\n // called on an element instance\n DocumentFragment.prototype.querySelectorAll = HTMLElement.prototype.querySelectorAll;\n DocumentFragment.prototype.querySelector = HTMLElement.prototype.querySelector;\n\n Object.defineProperties(DocumentFragment.prototype, {\n 'nodeType': {\n get: function () {\n return Node.DOCUMENT_FRAGMENT_NODE;\n },\n configurable: true\n },\n\n 'localName': {\n get: function () {\n return undefined;\n },\n configurable: true\n },\n\n 'nodeName': {\n get: function () {\n return '#document-fragment';\n },\n configurable: true\n }\n });\n\n var origInsertBefore = Node.prototype.insertBefore;\n function insertBefore(newNode, refNode) {\n if (newNode instanceof DocumentFragment) {\n var child;\n while ((child = newNode.firstChild)) {\n origInsertBefore.call(this, child, refNode);\n }\n } else {\n origInsertBefore.call(this, newNode, refNode);\n }\n return newNode;\n }\n Node.prototype.insertBefore = insertBefore;\n\n var origAppendChild = Node.prototype.appendChild;\n Node.prototype.appendChild = function appendChild(child) {\n if (child instanceof DocumentFragment) {\n insertBefore.call(this, child, null);\n } else {\n origAppendChild.call(this, child);\n }\n return child;\n };\n\n var origRemoveChild = Node.prototype.removeChild;\n var origReplaceChild = Node.prototype.replaceChild;\n Node.prototype.replaceChild = function replaceChild(newChild, oldChild) {\n if (newChild instanceof DocumentFragment) {\n insertBefore.call(this, newChild, oldChild);\n origRemoveChild.call(this, oldChild);\n } else {\n origReplaceChild.call(this, newChild, oldChild);\n }\n return oldChild;\n };\n\n Document.prototype.createDocumentFragment = function createDocumentFragment() {\n var frag = this.createElement('df');\n frag.__proto__ = DocumentFragment.prototype;\n return frag;\n };\n\n var origImportNode = Document.prototype.importNode;\n Document.prototype.importNode = function importNode(impNode, deep) {\n deep = deep || false;\n var newNode = origImportNode.call(this, impNode, deep);\n if (impNode instanceof DocumentFragment) {\n newNode.__proto__ = DocumentFragment.prototype;\n }\n return newNode;\n };\n })();\n }\n\n // NOTE: we rely on this cloneNode not causing element upgrade.\n // This means this polyfill must load before the CE polyfill and\n // this would need to be re-worked if a browser supports native CE\n // but not <template>.\n var capturedCloneNode = Node.prototype.cloneNode;\n var capturedCreateElement = Document.prototype.createElement;\n var capturedImportNode = Document.prototype.importNode;\n var capturedRemoveChild = Node.prototype.removeChild;\n var capturedAppendChild = Node.prototype.appendChild;\n var capturedReplaceChild = Node.prototype.replaceChild;\n\n var elementQuerySelectorAll = Element.prototype.querySelectorAll;\n var docQuerySelectorAll = Document.prototype.querySelectorAll;\n var fragQuerySelectorAll = DocumentFragment.prototype.querySelectorAll;\n\n var scriptSelector = 'script:not([type]),script[type=\"application/javascript\"],script[type=\"text/javascript\"]';\n\n function QSA(node, selector) {\n // IE 11 throws a SyntaxError with `scriptSelector` if the node has no children due to the `:not([type])` syntax\n if (!node.childNodes.length) {\n return [];\n }\n switch (node.nodeType) {\n case Node.DOCUMENT_NODE:\n return docQuerySelectorAll.call(node, selector);\n case Node.DOCUMENT_FRAGMENT_NODE:\n return fragQuerySelectorAll.call(node, selector);\n default:\n return elementQuerySelectorAll.call(node, selector);\n }\n }\n\n // returns true if nested templates cannot be cloned (they cannot be on\n // some impl's like Safari 8 and Edge)\n // OR if cloning a document fragment does not result in a document fragment\n var needsCloning = (function() {\n if (!needsTemplate) {\n var t = document.createElement('template');\n var t2 = document.createElement('template');\n t2.content.appendChild(document.createElement('div'));\n t.content.appendChild(t2);\n var clone = t.cloneNode(true);\n return (clone.content.childNodes.length === 0 || clone.content.firstChild.content.childNodes.length === 0\n || brokenDocFragment);\n }\n })();\n\n var TEMPLATE_TAG = 'template';\n var PolyfilledHTMLTemplateElement = function() {};\n\n if (needsTemplate) {\n\n var contentDoc = document.implementation.createHTMLDocument('template');\n var canDecorate = true;\n\n var templateStyle = document.createElement('style');\n templateStyle.textContent = TEMPLATE_TAG + '{display:none;}';\n\n var head = document.head;\n head.insertBefore(templateStyle, head.firstElementChild);\n\n /**\n Provides a minimal shim for the <template> element.\n */\n PolyfilledHTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n\n\n // if elements do not have `innerHTML` on instances, then\n // templates can be patched by swizzling their prototypes.\n var canProtoPatch =\n !(document.createElement('div').hasOwnProperty('innerHTML'));\n\n /**\n The `decorate` method moves element children to the template's `content`.\n NOTE: there is no support for dynamically adding elements to templates.\n */\n PolyfilledHTMLTemplateElement.decorate = function(template) {\n // if the template is decorated or not in HTML namespace, return fast\n if (template.content || \n template.namespaceURI !== document.documentElement.namespaceURI) {\n return;\n }\n template.content = contentDoc.createDocumentFragment();\n var child;\n while ((child = template.firstChild)) {\n capturedAppendChild.call(template.content, child);\n }\n // NOTE: prefer prototype patching for performance and\n // because on some browsers (IE11), re-defining `innerHTML`\n // can result in intermittent errors.\n if (canProtoPatch) {\n template.__proto__ = PolyfilledHTMLTemplateElement.prototype;\n } else {\n template.cloneNode = function(deep) {\n return PolyfilledHTMLTemplateElement._cloneNode(this, deep);\n };\n // add innerHTML to template, if possible\n // Note: this throws on Safari 7\n if (canDecorate) {\n try {\n defineInnerHTML(template);\n defineOuterHTML(template);\n } catch (err) {\n canDecorate = false;\n }\n }\n }\n // bootstrap recursively\n PolyfilledHTMLTemplateElement.bootstrap(template.content);\n };\n\n var defineInnerHTML = function defineInnerHTML(obj) {\n Object.defineProperty(obj, 'innerHTML', {\n get: function() {\n return getInnerHTML(this);\n },\n set: function(text) {\n contentDoc.body.innerHTML = text;\n PolyfilledHTMLTemplateElement.bootstrap(contentDoc);\n while (this.content.firstChild) {\n capturedRemoveChild.call(this.content, this.content.firstChild);\n }\n while (contentDoc.body.firstChild) {\n capturedAppendChild.call(this.content, contentDoc.body.firstChild);\n }\n },\n configurable: true\n });\n };\n\n var defineOuterHTML = function defineOuterHTML(obj) {\n Object.defineProperty(obj, 'outerHTML', {\n get: function() {\n return '<' + TEMPLATE_TAG + '>' + this.innerHTML + '</' + TEMPLATE_TAG + '>';\n },\n set: function(innerHTML) {\n if (this.parentNode) {\n contentDoc.body.innerHTML = innerHTML;\n var docFrag = this.ownerDocument.createDocumentFragment();\n while (contentDoc.body.firstChild) {\n capturedAppendChild.call(docFrag, contentDoc.body.firstChild);\n }\n capturedReplaceChild.call(this.parentNode, docFrag, this);\n } else {\n throw new Error(\"Failed to set the 'outerHTML' property on 'Element': This element has no parent node.\");\n }\n },\n configurable: true\n });\n };\n\n defineInnerHTML(PolyfilledHTMLTemplateElement.prototype);\n defineOuterHTML(PolyfilledHTMLTemplateElement.prototype);\n\n /**\n The `bootstrap` method is called automatically and \"fixes\" all\n <template> elements in the document referenced by the `doc` argument.\n */\n PolyfilledHTMLTemplateElement.bootstrap = function bootstrap(doc) {\n var templates = QSA(doc, TEMPLATE_TAG);\n for (var i=0, l=templates.length, t; (i<l) && (t=templates[i]); i++) {\n PolyfilledHTMLTemplateElement.decorate(t);\n }\n };\n\n // auto-bootstrapping for main document\n document.addEventListener('DOMContentLoaded', function() {\n PolyfilledHTMLTemplateElement.bootstrap(document);\n });\n\n // Patch document.createElement to ensure newly created templates have content\n Document.prototype.createElement = function createElement() {\n var el = capturedCreateElement.apply(this, arguments);\n if (el.localName === 'template') {\n PolyfilledHTMLTemplateElement.decorate(el);\n }\n return el;\n };\n\n // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n var escapeAttrRegExp = /[&\\u00A0\"]/g;\n var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n var escapeReplace = function(c) {\n switch (c) {\n case '&':\n return '&amp;';\n case '<':\n return '&lt;';\n case '>':\n return '&gt;';\n case '\"':\n return '&quot;';\n case '\\u00A0':\n return '&nbsp;';\n }\n };\n\n var escapeAttr = function(s) {\n return s.replace(escapeAttrRegExp, escapeReplace);\n };\n\n var escapeData = function(s) {\n return s.replace(escapeDataRegExp, escapeReplace);\n };\n\n var makeSet = function(arr) {\n var set = {};\n for (var i = 0; i < arr.length; i++) {\n set[arr[i]] = true;\n }\n return set;\n };\n\n // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n var voidElements = makeSet([\n 'area',\n 'base',\n 'br',\n 'col',\n 'command',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n ]);\n\n var plaintextParents = makeSet([\n 'style',\n 'script',\n 'xmp',\n 'iframe',\n 'noembed',\n 'noframes',\n 'plaintext',\n 'noscript'\n ]);\n\n /**\n * @param {Node} node\n * @param {Node} parentNode\n * @param {Function=} callback\n */\n var getOuterHTML = function(node, parentNode, callback) {\n switch (node.nodeType) {\n case Node.ELEMENT_NODE: {\n var tagName = node.localName;\n var s = '<' + tagName;\n var attrs = node.attributes;\n for (var i = 0, attr; (attr = attrs[i]); i++) {\n s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n }\n s += '>';\n if (voidElements[tagName]) {\n return s;\n }\n return s + getInnerHTML(node, callback) + '</' + tagName + '>';\n }\n case Node.TEXT_NODE: {\n var data = /** @type {Text} */ (node).data;\n if (parentNode && plaintextParents[parentNode.localName]) {\n return data;\n }\n return escapeData(data);\n }\n case Node.COMMENT_NODE: {\n return '<!--' + /** @type {Comment} */ (node).data + '-->';\n }\n default: {\n window.console.error(node);\n throw new Error('not implemented');\n }\n }\n };\n\n /**\n * @param {Node} node\n * @param {Function=} callback\n */\n var getInnerHTML = function(node, callback) {\n if (node.localName === 'template') {\n node = /** @type {HTMLTemplateElement} */ (node).content;\n }\n var s = '';\n var c$ = callback ? callback(node) : node.childNodes;\n for (var i=0, l=c$.length, child; (i<l) && (child=c$[i]); i++) {\n s += getOuterHTML(child, node, callback);\n }\n return s;\n };\n\n }\n\n // make cloning/importing work!\n if (needsTemplate || needsCloning) {\n\n PolyfilledHTMLTemplateElement._cloneNode = function _cloneNode(template, deep) {\n var clone = capturedCloneNode.call(template, false);\n // NOTE: decorate doesn't auto-fix children because they are already\n // decorated so they need special clone fixup.\n if (this.decorate) {\n this.decorate(clone);\n }\n if (deep) {\n // NOTE: use native clone node to make sure CE's wrapped\n // cloneNode does not cause elements to upgrade.\n capturedAppendChild.call(clone.content, capturedCloneNode.call(template.content, true));\n // now ensure nested templates are cloned correctly.\n fixClonedDom(clone.content, template.content);\n }\n return clone;\n };\n\n // Given a source and cloned subtree, find <template>'s in the cloned\n // subtree and replace them with cloned <template>'s from source.\n // We must do this because only the source templates have proper .content.\n var fixClonedDom = function fixClonedDom(clone, source) {\n // do nothing if cloned node is not an element\n if (!source.querySelectorAll) return;\n // these two lists should be coincident\n var s$ = QSA(source, TEMPLATE_TAG);\n if (s$.length === 0) {\n return;\n }\n var t$ = QSA(clone, TEMPLATE_TAG);\n for (var i=0, l=t$.length, t, s; i<l; i++) {\n s = s$[i];\n t = t$[i];\n if (PolyfilledHTMLTemplateElement && PolyfilledHTMLTemplateElement.decorate) {\n PolyfilledHTMLTemplateElement.decorate(s);\n }\n capturedReplaceChild.call(t.parentNode, cloneNode.call(s, true), t);\n }\n };\n\n // make sure scripts inside of a cloned template are executable\n var fixClonedScripts = function fixClonedScripts(fragment) {\n var scripts = QSA(fragment, scriptSelector);\n for (var ns, s, i = 0; i < scripts.length; i++) {\n s = scripts[i];\n ns = capturedCreateElement.call(document, 'script');\n ns.textContent = s.textContent;\n var attrs = s.attributes;\n for (var ai = 0, a; ai < attrs.length; ai++) {\n a = attrs[ai];\n ns.setAttribute(a.name, a.value);\n }\n capturedReplaceChild.call(s.parentNode, ns, s);\n }\n };\n\n // override all cloning to fix the cloned subtree to contain properly\n // cloned templates.\n var cloneNode = Node.prototype.cloneNode = function cloneNode(deep) {\n var dom;\n // workaround for Edge bug cloning documentFragments\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8619646/\n if (!needsDocFrag && brokenDocFragment && this instanceof DocumentFragment) {\n if (!deep) {\n return this.ownerDocument.createDocumentFragment();\n } else {\n dom = importNode.call(this.ownerDocument, this, true);\n }\n } else if (this.nodeType === Node.ELEMENT_NODE && \n this.localName === TEMPLATE_TAG &&\n this.namespaceURI == document.documentElement.namespaceURI) {\n dom = PolyfilledHTMLTemplateElement._cloneNode(this, deep);\n } else {\n dom = capturedCloneNode.call(this, deep);\n }\n // template.content is cloned iff `deep`.\n if (deep) {\n fixClonedDom(dom, this);\n }\n return dom;\n };\n\n // NOTE: we are cloning instead of importing <template>'s.\n // However, the ownerDocument of the cloned template will be correct!\n // This is because the native import node creates the right document owned\n // subtree and `fixClonedDom` inserts cloned templates into this subtree,\n // thus updating the owner doc.\n var importNode = Document.prototype.importNode = function importNode(element, deep) {\n deep = deep || false;\n if (element.localName === TEMPLATE_TAG) {\n return PolyfilledHTMLTemplateElement._cloneNode(element, deep);\n } else {\n var dom = capturedImportNode.call(this, element, deep);\n if (deep) {\n fixClonedDom(dom, element);\n fixClonedScripts(dom);\n }\n return dom;\n }\n };\n }\n\n if (needsTemplate) {\n window.HTMLTemplateElement = PolyfilledHTMLTemplateElement;\n }\n\n})();\n","export function objectOrFunction(x) {\n let type = typeof x;\n return x !== null && (type === 'object' || type === 'function');\n}\n\nexport function isFunction(x) {\n return typeof x === 'function';\n}\n\nexport function isMaybeThenable(x) {\n return x !== null && typeof x === 'object';\n}\n\nlet _isArray;\nif (Array.isArray) {\n _isArray = Array.isArray;\n} else {\n _isArray = x => Object.prototype.toString.call(x) === '[object Array]';\n}\n\nexport const isArray = _isArray;\n","let len = 0;\nlet vertxNext;\nlet customSchedulerFn;\n\nexport var asap = function asap(callback, arg) {\n queue[len] = callback;\n queue[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 2, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n if (customSchedulerFn) {\n customSchedulerFn(flush);\n } else {\n scheduleFlush();\n }\n }\n}\n\nexport function setScheduler(scheduleFn) {\n customSchedulerFn = scheduleFn;\n}\n\nexport function setAsap(asapFn) {\n asap = asapFn;\n}\n\nconst browserWindow = (typeof window !== 'undefined') ? window : undefined;\nconst browserGlobal = browserWindow || {};\nconst BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nconst isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nconst isWorker = typeof Uint8ClampedArray !== 'undefined' &&\n typeof importScripts !== 'undefined' &&\n typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // see https://github.com/cujojs/when/issues/410 for details\n return () => process.nextTick(flush);\n}\n\n// vertx\nfunction useVertxTimer() {\n if (typeof vertxNext !== 'undefined') {\n return function() {\n vertxNext(flush);\n };\n }\n\n return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n let iterations = 0;\n const observer = new BrowserMutationObserver(flush);\n const node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return () => {\n node.data = (iterations = ++iterations % 2);\n };\n}\n\n// web worker\nfunction useMessageChannel() {\n const channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return () => channel.port2.postMessage(0);\n}\n\nfunction useSetTimeout() {\n // Store setTimeout reference so es6-promise will be unaffected by\n // other code modifying setTimeout (like sinon.useFakeTimers())\n const globalSetTimeout = setTimeout;\n return () => globalSetTimeout(flush, 1);\n}\n\nconst queue = new Array(1000);\nfunction flush() {\n for (let i = 0; i < len; i+=2) {\n let callback = queue[i];\n let arg = queue[i+1];\n\n callback(arg);\n\n queue[i] = undefined;\n queue[i+1] = undefined;\n }\n\n len = 0;\n}\n\nfunction attemptVertx() {\n try {\n const r = require;\n const vertx = r('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch(e) {\n return useSetTimeout();\n }\n}\n\nlet scheduleFlush;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n scheduleFlush = attemptVertx();\n} else {\n scheduleFlush = useSetTimeout();\n}\n","import {\n invokeCallback,\n subscribe,\n FULFILLED,\n REJECTED,\n noop,\n makePromise,\n PROMISE_ID\n} from './-internal';\n\nimport { asap } from './asap';\n\nexport default function then(onFulfillment, onRejection) {\n const parent = this;\n\n const child = new this.constructor(noop);\n\n if (child[PROMISE_ID] === undefined) {\n makePromise(child);\n }\n\n const { _state } = parent;\n\n if (_state) {\n const callback = arguments[_state - 1];\n asap(() => invokeCallback(_state, child, callback, parent._result));\n } else {\n subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n}\n","import {\n objectOrFunction,\n isFunction\n} from './utils';\n\nimport {\n asap\n} from './asap';\n\nimport originalThen from './then';\nimport originalResolve from './promise/resolve';\n\nexport const PROMISE_ID = Math.random().toString(36).substring(16);\n\nfunction noop() {}\n\nconst PENDING = void 0;\nconst FULFILLED = 1;\nconst REJECTED = 2;\n\nconst GET_THEN_ERROR = new ErrorObject();\n\nfunction selfFulfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction getThen(promise) {\n try {\n return promise.then;\n } catch(error) {\n GET_THEN_ERROR.error = error;\n return GET_THEN_ERROR;\n }\n}\n\nfunction tryThen(then, value, fulfillmentHandler, rejectionHandler) {\n try {\n then.call(value, fulfillmentHandler, rejectionHandler);\n } catch(e) {\n return e;\n }\n}\n\nfunction handleForeignThenable(promise, thenable, then) {\n asap(promise => {\n var sealed = false;\n var error = tryThen(then, thenable, value => {\n if (sealed) { return; }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value);\n } else {\n fulfill(promise, value);\n }\n }, reason => {\n if (sealed) { return; }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, value => resolve(promise, value),\n reason => reject(promise, reason))\n }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then) {\n if (maybeThenable.constructor === promise.constructor &&\n then === originalThen &&\n maybeThenable.constructor.resolve === originalResolve) {\n handleOwnThenable(promise, maybeThenable);\n } else {\n if (then === GET_THEN_ERROR) {\n reject(promise, GET_THEN_ERROR.error);\n GET_THEN_ERROR.error = null;\n } else if (then === undefined) {\n fulfill(promise, maybeThenable);\n } else if (isFunction(then)) {\n handleForeignThenable(promise, maybeThenable, then);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n}\n\nfunction resolve(promise, value) {\n if (promise === value) {\n reject(promise, selfFulfillment());\n } else if (objectOrFunction(value)) {\n handleMaybeThenable(promise, value, getThen(value));\n } else {\n fulfill(promise, value);\n }\n}\n\nfunction publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n publish(promise);\n}\n\nfunction fulfill(promise, value) {\n if (promise._state !== PENDING) { return; }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n asap(publish, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state !== PENDING) { return; }\n promise._state = REJECTED;\n promise._result = reason;\n\n asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n let { _subscribers } = parent;\n let { length } = _subscribers;\n\n parent._onerror = null;\n\n _subscribers[length] = child;\n _subscribers[length + FULFILLED] = onFulfillment;\n _subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n asap(publish, parent);\n }\n}\n\nfunction publish(promise) {\n let subscribers = promise._subscribers;\n let settled = promise._state;\n\n if (subscribers.length === 0) { return; }\n\n let child, callback, detail = promise._result;\n\n for (let i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n}\n\nfunction ErrorObject() {\n this.error = null;\n}\n\nconst TRY_CATCH_ERROR = new ErrorObject();\n\nfunction tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch(e) {\n TRY_CATCH_ERROR.error = e;\n return TRY_CATCH_ERROR;\n }\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n let hasCallback = isFunction(callback),\n value, error, succeeded, failed;\n\n if (hasCallback) {\n value = tryCatch(callback, detail);\n\n if (value === TRY_CATCH_ERROR) {\n failed = true;\n error = value.error;\n value.error = null;\n } else {\n succeeded = true;\n }\n\n if (promise === value) {\n reject(promise, cannotReturnOwn());\n return;\n }\n\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (failed) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n fulfill(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n}\n\nfunction initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value){\n resolve(promise, value);\n }, function rejectPromise(reason) {\n reject(promise, reason);\n });\n } catch(e) {\n reject(promise, e);\n }\n}\n\nlet id = 0;\nfunction nextId() {\n return id++;\n}\n\nfunction makePromise(promise) {\n promise[PROMISE_ID] = id++;\n promise._state = undefined;\n promise._result = undefined;\n promise._subscribers = [];\n}\n\nexport {\n nextId,\n makePromise,\n getThen,\n noop,\n resolve,\n reject,\n fulfill,\n subscribe,\n publish,\n publishRejection,\n initializePromise,\n invokeCallback,\n FULFILLED,\n REJECTED,\n PENDING,\n handleMaybeThenable\n};\n","import {\n noop,\n resolve as _resolve\n} from '../-internal';\n\n/**\n `Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n resolve(1);\n });\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.resolve(1);\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n @method resolve\n @static\n @param {Any} value value that the returned promise will be resolved with\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nexport default function resolve(object) {\n /*jshint validthis:true */\n let Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n let promise = new Constructor(noop);\n _resolve(promise, object);\n return promise;\n}\n","import {\n isArray,\n isMaybeThenable\n} from './utils';\n\nimport {\n noop,\n reject,\n fulfill,\n subscribe,\n FULFILLED,\n REJECTED,\n PENDING,\n getThen,\n handleMaybeThenable\n} from './-internal';\n\nimport then from './then';\nimport Promise from './promise';\nimport originalResolve from './promise/resolve';\nimport originalThen from './then';\nimport { makePromise, PROMISE_ID } from './-internal';\n\nexport default Enumerator;\nfunction Enumerator(Constructor, input) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop);\n\n if (!this.promise[PROMISE_ID]) {\n makePromise(this.promise);\n }\n\n if (isArray(input)) {\n this.length = input.length;\n this._remaining = input.length;\n\n this._result = new Array(this.length);\n\n if (this.length === 0) {\n fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate(input);\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n }\n } else {\n reject(this.promise, validationError());\n }\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n};\n\nEnumerator.prototype._enumerate = function(input) {\n for (let i = 0; this._state === PENDING && i < input.length; i++) {\n this._eachEntry(input[i], i);\n }\n};\n\nEnumerator.prototype._eachEntry = function(entry, i) {\n let c = this._instanceConstructor;\n let { resolve } = c;\n\n if (resolve === originalResolve) {\n let then = getThen(entry);\n\n if (then === originalThen &&\n entry._state !== PENDING) {\n this._settledAt(entry._state, i, entry._result);\n } else if (typeof then !== 'function') {\n this._remaining--;\n this._result[i] = entry;\n } else if (c === Promise) {\n let promise = new c(noop);\n handleMaybeThenable(promise, entry, then);\n this._willSettleAt(promise, i);\n } else {\n this._willSettleAt(new c(resolve => resolve(entry)), i);\n }\n } else {\n this._willSettleAt(resolve(entry), i);\n }\n};\n\nEnumerator.prototype._settledAt = function(state, i, value) {\n let { promise } = this;\n\n if (promise._state === PENDING) {\n this._remaining--;\n\n if (state === REJECTED) {\n reject(promise, value);\n } else {\n this._result[i] = value;\n }\n }\n\n if (this._remaining === 0) {\n fulfill(promise, this._result);\n }\n};\n\nEnumerator.prototype._willSettleAt = function(promise, i) {\n let enumerator = this;\n\n subscribe(promise, undefined, value => enumerator._settledAt(FULFILLED, i, value),\n reason => enumerator._settledAt(REJECTED, i, reason));\n};\n","import {\n isFunction\n} from './utils';\n\nimport {\n noop,\n nextId,\n PROMISE_ID,\n initializePromise\n} from './-internal';\n\nimport {\n asap,\n setAsap,\n setScheduler\n} from './asap';\n\nimport all from './promise/all';\nimport race from './promise/race';\nimport Resolve from './promise/resolve';\nimport Reject from './promise/reject';\nimport then from './then';\n\n\nfunction needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\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/**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise's eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n let promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n let xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {function} resolver\n Useful for tooling.\n @constructor\n*/\nexport default function Promise(resolver) {\n this[PROMISE_ID] = nextId();\n this._result = this._state = undefined;\n this._subscribers = [];\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n}\n\nPromise.all = all;\nPromise.race = race;\nPromise.resolve = Resolve;\nPromise.reject = Reject;\nPromise._setScheduler = setScheduler;\nPromise._setAsap = setAsap;\nPromise._asap = asap;\n\nPromise.prototype = {\n constructor: Promise,\n\n/**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n\n Chaining\n --------\n\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n\n Assimilation\n ------------\n\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n\n If the assimliated promise rejects, then the downstream promise will also reject.\n\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n\n Simple Example\n --------------\n\n Synchronous Example\n\n ```javascript\n let result;\n\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n\n Errback Example\n\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n\n Promise Example;\n\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n\n Advanced Example\n --------------\n\n Synchronous Example\n\n ```javascript\n let author, books;\n\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n\n Errback Example\n\n ```js\n\n function foundBooks(books) {\n\n }\n\n function failure(reason) {\n\n }\n\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n\n Promise Example;\n\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n*/\n then: then,\n\n/**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n\n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n*/\n catch(onRejection) {\n return this.then(null, onRejection);\n }\n};\n","import Enumerator from '../enumerator';\n\n/**\n `Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = resolve(2);\n let promise3 = resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n\n If any of the `promises` given to `all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = reject(new Error(\"2\"));\n let promise3 = reject(new Error(\"3\"));\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n\n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n*/\nexport default function all(entries) {\n return new Enumerator(this, entries).promise;\n}\n","import {\n isArray\n} from \"../utils\";\n\n/**\n `Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n\n Example:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n\n `Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n\n An example real-world use case is implementing timeouts:\n\n ```javascript\n Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n\n @method race\n @static\n @param {Array} promises array of promises to observe\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n*/\nexport default function race(entries) {\n /*jshint validthis:true */\n let Constructor = this;\n\n if (!isArray(entries)) {\n return new Constructor((_, reject) => reject(new TypeError('You must pass an array to race.')));\n } else {\n return new Constructor((resolve, reject) => {\n let length = entries.length;\n for (let i = 0; i < length; i++) {\n Constructor.resolve(entries[i]).then(resolve, reject);\n }\n });\n }\n}\n","import {\n noop,\n reject as _reject\n} from '../-internal';\n\n/**\n `Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.reject(new Error('WHOOPS'));\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n @method reject\n @static\n @param {Any} reason value that the returned promise will be rejected with.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nexport default function reject(reason) {\n /*jshint validthis:true */\n let Constructor = this;\n let promise = new Constructor(noop);\n _reject(promise, reason);\n return promise;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n'use strict';\nimport ES6Promise from '../node_modules/es6-promise/lib/es6-promise/promise.js';\n\n/*\nAssign the ES6 promise polyfill to window ourselves instead of using the \"auto\" polyfill\nto work around https://github.com/webcomponents/webcomponentsjs/issues/837\n*/\nif (!window.Promise) {\n window.Promise = ES6Promise;\n // save Promise API\n ES6Promise.prototype['catch'] = ES6Promise.prototype.catch;\n ES6Promise.prototype['then'] = ES6Promise.prototype.then;\n ES6Promise['all'] = ES6Promise.all;\n ES6Promise['race'] = ES6Promise.race;\n ES6Promise['resolve'] = ES6Promise.resolve;\n ES6Promise['reject'] = ES6Promise.reject;\n}","/**\n * @license\n * Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(scope => {\n\n /********************* base setup *********************/\n const link = document.createElement('link');\n const useNative = Boolean('import' in link);\n const emptyNodeList = link.querySelectorAll('*');\n\n // Polyfill `currentScript` for browsers without it.\n let currentScript = null;\n if ('currentScript' in document === false) {\n Object.defineProperty(document, 'currentScript', {\n get() {\n return currentScript ||\n // NOTE: only works when called in synchronously executing code.\n // readyState should check if `loading` but IE10 is\n // interactive when scripts run so we cheat. This is not needed by\n // html-imports polyfill but helps generally polyfill `currentScript`.\n (document.readyState !== 'complete' ?\n document.scripts[document.scripts.length - 1] : null);\n },\n configurable: true\n });\n }\n\n /**\n * @param {Array|NodeList|NamedNodeMap} list\n * @param {!Function} callback\n * @param {boolean=} inverseOrder\n */\n const forEach = (list, callback, inverseOrder) => {\n const length = list ? list.length : 0;\n const increment = inverseOrder ? -1 : 1;\n let i = inverseOrder ? length - 1 : 0;\n for (; i < length && i >= 0; i = i + increment) {\n callback(list[i], i);\n }\n };\n\n /**\n * @param {!Node} node\n * @param {!string} selector\n * @return {!NodeList<!Element>}\n */\n const QSA = (node, selector) => {\n // IE 11 throws a SyntaxError if a node with no children is queried with\n // a selector containing the `:not([type])` syntax.\n if (!node.childNodes.length) {\n return emptyNodeList;\n }\n return node.querySelectorAll(selector);\n };\n\n /**\n * @param {!DocumentFragment} fragment\n */\n const replaceScripts = (fragment) => {\n forEach(QSA(fragment, 'template'), template => {\n forEach(QSA(template.content, scriptsSelector), script => {\n const clone = /** @type {!HTMLScriptElement} */\n (document.createElement('script'));\n forEach(script.attributes, attr => clone.setAttribute(attr.name, attr.value));\n clone.textContent = script.textContent;\n script.parentNode.replaceChild(clone, script);\n });\n replaceScripts(template.content);\n });\n };\n\n /********************* path fixup *********************/\n const CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\n const CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n const STYLESHEET_REGEXP = /(<link[^>]*)(rel=['|\"]?stylesheet['|\"]?[^>]*>)/g;\n\n // path fixup: style elements in imports must be made relative to the main\n // document. We fixup url's in url() and @import.\n const Path = {\n\n fixUrls(element, base) {\n if (element.href) {\n element.setAttribute('href',\n Path.resolveUrl(element.getAttribute('href'), base));\n }\n if (element.src) {\n element.setAttribute('src',\n Path.resolveUrl(element.getAttribute('src'), base));\n }\n if (element.localName === 'style') {\n const r = Path.replaceUrls(element.textContent, base, CSS_URL_REGEXP);\n element.textContent = Path.replaceUrls(r, base, CSS_IMPORT_REGEXP);\n }\n },\n\n replaceUrls(text, linkUrl, regexp) {\n return text.replace(regexp, (m, pre, url, post) => {\n let urlPath = url.replace(/[\"']/g, '');\n if (linkUrl) {\n urlPath = Path.resolveUrl(urlPath, linkUrl);\n }\n return pre + '\\'' + urlPath + '\\'' + post;\n });\n },\n\n resolveUrl(url, base) {\n // Lazy feature detection.\n if (Path.__workingURL === undefined) {\n Path.__workingURL = false;\n try {\n const u = new URL('b', 'http://a');\n u.pathname = 'c%20d';\n Path.__workingURL = (u.href === 'http://a/c%20d');\n } catch (e) {}\n }\n\n if (Path.__workingURL) {\n return (new URL(url, base)).href;\n }\n\n // Fallback to creating an anchor into a disconnected document.\n let doc = Path.__tempDoc;\n if (!doc) {\n doc = document.implementation.createHTMLDocument('temp');\n Path.__tempDoc = doc;\n doc.__base = doc.createElement('base');\n doc.head.appendChild(doc.__base);\n doc.__anchor = doc.createElement('a');\n }\n doc.__base.href = base;\n doc.__anchor.href = url;\n return doc.__anchor.href || url;\n }\n };\n\n /********************* Xhr processor *********************/\n const Xhr = {\n\n async: true,\n\n /**\n * @param {!string} url\n * @param {!function(!string, string=)} success\n * @param {!function(!string)} fail\n */\n load(url, success, fail) {\n if (!url) {\n fail('error: href must be specified');\n } else if (url.match(/^data:/)) {\n // Handle Data URI Scheme\n const pieces = url.split(',');\n const header = pieces[0];\n let resource = pieces[1];\n if (header.indexOf(';base64') > -1) {\n resource = atob(resource);\n } else {\n resource = decodeURIComponent(resource);\n }\n success(resource);\n } else {\n const request = new XMLHttpRequest();\n request.open('GET', url, Xhr.async);\n request.onload = () => {\n // Servers redirecting an import can add a Location header to help us\n // polyfill correctly. Handle relative and full paths.\n // Prefer responseURL which already resolves redirects\n // https://xhr.spec.whatwg.org/#the-responseurl-attribute\n let redirectedUrl = request.responseURL || request.getResponseHeader('Location');\n if (redirectedUrl && redirectedUrl.indexOf('/') === 0) {\n // In IE location.origin might not work\n // https://connect.microsoft.com/IE/feedback/details/1763802/location-origin-is-undefined-in-ie-11-on-windows-10-but-works-on-windows-7\n const origin = (location.origin || location.protocol + '//' + location.host);\n redirectedUrl = origin + redirectedUrl;\n }\n const resource = /** @type {string} */ (request.response || request.responseText);\n if (request.status === 304 || request.status === 0 ||\n request.status >= 200 && request.status < 300) {\n success(resource, redirectedUrl);\n } else {\n fail(resource);\n }\n };\n request.send();\n }\n }\n };\n\n /********************* importer *********************/\n\n const isIE = /Trident/.test(navigator.userAgent) ||\n /Edge\\/\\d./i.test(navigator.userAgent);\n\n const importSelector = 'link[rel=import]';\n\n // Used to disable loading of resources.\n const importDisableType = 'import-disable';\n\n const disabledLinkSelector = `link[rel=stylesheet][href][type=${importDisableType}]`;\n\n const scriptsSelector = `script:not([type]),script[type=\"application/javascript\"],` +\n `script[type=\"text/javascript\"]`;\n\n const importDependenciesSelector = `${importSelector},${disabledLinkSelector},` +\n `style:not([type]),link[rel=stylesheet][href]:not([type]),` + scriptsSelector;\n\n const importDependencyAttr = 'import-dependency';\n\n const rootImportSelector = `${importSelector}:not([${importDependencyAttr}])`;\n\n const pendingScriptsSelector = `script[${importDependencyAttr}]`;\n\n const pendingStylesSelector = `style[${importDependencyAttr}],` +\n `link[rel=stylesheet][${importDependencyAttr}]`;\n\n /**\n * Importer will:\n * - load any linked import documents (with deduping)\n * - whenever an import is loaded, prompt the parser to try to parse\n * - observe imported documents for new elements (these are handled via the\n * dynamic importer)\n */\n class Importer {\n constructor() {\n this.documents = {};\n // Used to keep track of pending loads, so that flattening and firing of\n // events can be done when all resources are ready.\n this.inflight = 0;\n this.dynamicImportsMO = new MutationObserver(m => this.handleMutations(m));\n // Observe changes on <head>.\n this.dynamicImportsMO.observe(document.head, {\n childList: true,\n subtree: true\n });\n // 1. Load imports contents\n // 2. Assign them to first import links on the document\n // 3. Wait for import styles & scripts to be done loading/running\n // 4. Fire load/error events\n this.loadImports(document);\n }\n\n /**\n * @param {!(HTMLDocument|DocumentFragment|Element)} doc\n */\n loadImports(doc) {\n const links = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(doc, importSelector));\n forEach(links, link => this.loadImport(link));\n }\n\n /**\n * @param {!HTMLLinkElement} link\n */\n loadImport(link) {\n const url = link.href;\n // This resource is already being handled by another import.\n if (this.documents[url] !== undefined) {\n // If import is already loaded, we can safely associate it to the link\n // and fire the load/error event.\n const imp = this.documents[url];\n if (imp && imp['__loaded']) {\n link['__import'] = imp;\n this.fireEventIfNeeded(link);\n }\n return;\n }\n this.inflight++;\n // Mark it as pending to notify others this url is being loaded.\n this.documents[url] = 'pending';\n Xhr.load(url, (resource, redirectedUrl) => {\n const doc = this.makeDocument(resource, redirectedUrl || url);\n this.documents[url] = doc;\n this.inflight--;\n // Load subtree.\n this.loadImports(doc);\n this.processImportsIfLoadingDone();\n }, () => {\n // If load fails, handle error.\n this.documents[url] = null;\n this.inflight--;\n this.processImportsIfLoadingDone();\n });\n }\n\n /**\n * Creates a new document containing resource and normalizes urls accordingly.\n * @param {string=} resource\n * @param {string=} url\n * @return {!DocumentFragment}\n */\n makeDocument(resource, url) {\n if (!resource) {\n return document.createDocumentFragment();\n }\n\n if (isIE) {\n // <link rel=stylesheet> should be appended to <head>. Not doing so\n // in IE/Edge breaks the cascading order. We disable the loading by\n // setting the type before setting innerHTML to avoid loading\n // resources twice.\n resource = resource.replace(STYLESHEET_REGEXP, (match, p1, p2) => {\n if (match.indexOf('type=') === -1) {\n return `${p1} type=${importDisableType} ${p2}`;\n }\n return match;\n });\n }\n\n let content;\n const template = /** @type {!HTMLTemplateElement} */\n (document.createElement('template'));\n template.innerHTML = resource;\n if (template.content) {\n content = template.content;\n // Clone scripts inside templates since they won't execute when the\n // hosting template is cloned.\n replaceScripts(content);\n } else {\n // <template> not supported, create fragment and move content into it.\n content = document.createDocumentFragment();\n while (template.firstChild) {\n content.appendChild(template.firstChild);\n }\n }\n\n // Support <base> in imported docs. Resolve url and remove its href.\n const baseEl = content.querySelector('base');\n if (baseEl) {\n url = Path.resolveUrl(baseEl.getAttribute('href'), url);\n baseEl.removeAttribute('href');\n }\n\n const n$ = /** @type {!NodeList<!(HTMLLinkElement|HTMLScriptElement|HTMLStyleElement)>} */\n (QSA(content, importDependenciesSelector));\n // For source map hints.\n let inlineScriptIndex = 0;\n forEach(n$, n => {\n // Listen for load/error events, then fix urls.\n whenElementLoaded(n);\n Path.fixUrls(n, url);\n // Mark for easier selectors.\n n.setAttribute(importDependencyAttr, '');\n // Generate source map hints for inline scripts.\n if (n.localName === 'script' && !n.src && n.textContent) {\n const num = inlineScriptIndex ? `-${inlineScriptIndex}` : '';\n const content = n.textContent + `\\n//# sourceURL=${url}${num}.js\\n`;\n // We use the src attribute so it triggers load/error events, and it's\n // easier to capture errors (e.g. parsing) like this.\n n.setAttribute('src', 'data:text/javascript;charset=utf-8,' + encodeURIComponent(content));\n n.textContent = '';\n inlineScriptIndex++;\n }\n });\n return content;\n }\n\n /**\n * Waits for loaded imports to finish loading scripts and styles, then fires\n * the load/error events.\n */\n processImportsIfLoadingDone() {\n // Wait until all resources are ready, then load import resources.\n if (this.inflight) return;\n\n // Stop observing, flatten & load resource, then restart observing <head>.\n this.dynamicImportsMO.disconnect();\n this.flatten(document);\n // We wait for styles to load, and at the same time we execute the scripts,\n // then fire the load/error events for imports to have faster whenReady\n // callback execution.\n // NOTE: This is different for native behavior where scripts would be\n // executed after the styles before them are loaded.\n // To achieve that, we could select pending styles and scripts in the\n // document and execute them sequentially in their dom order.\n let scriptsOk = false,\n stylesOk = false;\n const onLoadingDone = () => {\n if (stylesOk && scriptsOk) {\n // Catch any imports that might have been added while we\n // weren't looking, wait for them as well.\n this.loadImports(document);\n if (this.inflight) return;\n\n // Restart observing.\n this.dynamicImportsMO.observe(document.head, {\n childList: true,\n subtree: true\n });\n this.fireEvents();\n }\n }\n this.waitForStyles(() => {\n stylesOk = true;\n onLoadingDone();\n });\n this.runScripts(() => {\n scriptsOk = true;\n onLoadingDone();\n });\n }\n\n /**\n * @param {!HTMLDocument} doc\n */\n flatten(doc) {\n const n$ = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(doc, importSelector));\n forEach(n$, n => {\n const imp = this.documents[n.href];\n n['__import'] = /** @type {!Document} */ (imp);\n if (imp && imp.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n // We set the .import to be the link itself, and update its readyState.\n // Other links with the same href will point to this link.\n this.documents[n.href] = n;\n n.readyState = 'loading';\n n['__import'] = n;\n this.flatten(imp);\n n.appendChild(imp);\n }\n });\n }\n\n /**\n * Replaces all the imported scripts with a clone in order to execute them.\n * Updates the `currentScript`.\n * @param {!function()} callback\n */\n runScripts(callback) {\n const s$ = QSA(document, pendingScriptsSelector);\n const l = s$.length;\n const cloneScript = i => {\n if (i < l) {\n // The pending scripts have been generated through innerHTML and\n // browsers won't execute them for security reasons. We cannot use\n // s.cloneNode(true) either, the only way to run the script is manually\n // creating a new element and copying its attributes.\n const s = s$[i];\n const clone = /** @type {!HTMLScriptElement} */\n (document.createElement('script'));\n // Remove import-dependency attribute to avoid double cloning.\n s.removeAttribute(importDependencyAttr);\n forEach(s.attributes, attr => clone.setAttribute(attr.name, attr.value));\n // Update currentScript and replace original with clone script.\n currentScript = clone;\n s.parentNode.replaceChild(clone, s);\n whenElementLoaded(clone, () => {\n currentScript = null;\n cloneScript(i + 1);\n });\n } else {\n callback();\n }\n };\n cloneScript(0);\n }\n\n /**\n * Waits for all the imported stylesheets/styles to be loaded.\n * @param {!function()} callback\n */\n waitForStyles(callback) {\n const s$ = /** @type {!NodeList<!(HTMLLinkElement|HTMLStyleElement)>} */\n (QSA(document, pendingStylesSelector));\n let pending = s$.length;\n if (!pending) {\n callback();\n return;\n }\n // <link rel=stylesheet> should be appended to <head>. Not doing so\n // in IE/Edge breaks the cascading order\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/10472273/\n // If there is one <link rel=stylesheet> imported, we must move all imported\n // links and styles to <head>.\n const needsMove = isIE && !!document.querySelector(disabledLinkSelector);\n forEach(s$, s => {\n // Listen for load/error events, remove selector once is done loading.\n whenElementLoaded(s, () => {\n s.removeAttribute(importDependencyAttr);\n if (--pending === 0) {\n callback();\n }\n });\n // Check if was already moved to head, to handle the case where the element\n // has already been moved but it is still loading.\n if (needsMove && s.parentNode !== document.head) {\n // Replace the element we're about to move with a placeholder.\n const placeholder = document.createElement(s.localName);\n // Add reference of the moved element.\n placeholder['__appliedElement'] = s;\n // Disable this from appearing in document.styleSheets.\n placeholder.setAttribute('type', 'import-placeholder');\n // Append placeholder next to the sibling, and move original to <head>.\n s.parentNode.insertBefore(placeholder, s.nextSibling);\n let newSibling = importForElement(s);\n while (newSibling && importForElement(newSibling)) {\n newSibling = importForElement(newSibling);\n }\n if (newSibling.parentNode !== document.head) {\n newSibling = null;\n }\n document.head.insertBefore(s, newSibling);\n // Enable the loading of <link rel=stylesheet>.\n s.removeAttribute('type');\n }\n });\n }\n\n /**\n * Fires load/error events for imports in the right order .\n */\n fireEvents() {\n const n$ = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(document, importSelector));\n // Inverse order to have events firing bottom-up.\n forEach(n$, n => this.fireEventIfNeeded(n), true);\n }\n\n /**\n * Fires load/error event for the import if this wasn't done already.\n * @param {!HTMLLinkElement} link\n */\n fireEventIfNeeded(link) {\n // Don't fire twice same event.\n if (!link['__loaded']) {\n link['__loaded'] = true;\n // Update link's import readyState.\n link.import && (link.import.readyState = 'complete');\n const eventType = link.import ? 'load' : 'error';\n link.dispatchEvent(newCustomEvent(eventType, {\n bubbles: false,\n cancelable: false,\n detail: undefined\n }));\n }\n }\n\n /**\n * @param {Array<MutationRecord>} mutations\n */\n handleMutations(mutations) {\n forEach(mutations, m => forEach(m.addedNodes, elem => {\n if (elem && elem.nodeType === Node.ELEMENT_NODE) {\n // NOTE: added scripts are not updating currentScript in IE.\n if (isImportLink(elem)) {\n this.loadImport( /** @type {!HTMLLinkElement} */ (elem));\n } else {\n this.loadImports( /** @type {!Element} */ (elem));\n }\n }\n }));\n }\n }\n\n /**\n * @param {!Node} node\n * @return {boolean}\n */\n const isImportLink = node => {\n return node.nodeType === Node.ELEMENT_NODE && node.localName === 'link' &&\n ( /** @type {!HTMLLinkElement} */ (node).rel === 'import');\n };\n\n /**\n * Waits for an element to finish loading. If already done loading, it will\n * mark the element accordingly.\n * @param {!(HTMLLinkElement|HTMLScriptElement|HTMLStyleElement)} element\n * @param {function()=} callback\n */\n const whenElementLoaded = (element, callback) => {\n if (element['__loaded']) {\n callback && callback();\n } else if ((element.localName === 'script' && !element.src) ||\n (element.localName === 'style' && !element.firstChild)) {\n // Inline scripts and empty styles don't trigger load/error events,\n // consider them already loaded.\n element['__loaded'] = true;\n callback && callback();\n } else {\n const onLoadingDone = event => {\n element.removeEventListener(event.type, onLoadingDone);\n element['__loaded'] = true;\n callback && callback();\n };\n element.addEventListener('load', onLoadingDone);\n // NOTE: We listen only for load events in IE/Edge, because in IE/Edge\n // <style> with @import will fire error events for each failing @import,\n // and finally will trigger the load event when all @import are\n // finished (even if all fail).\n if (!isIE || element.localName !== 'style') {\n element.addEventListener('error', onLoadingDone);\n }\n }\n }\n\n /**\n * Calls the callback when all imports in the document at call time\n * (or at least document ready) have loaded. Callback is called synchronously\n * if imports are already done loading.\n * @param {function()=} callback\n */\n const whenReady = callback => {\n // 1. ensure the document is in a ready state (has dom), then\n // 2. watch for loading of imports and call callback when done\n whenDocumentReady(() => whenImportsReady(() => callback && callback()));\n }\n\n /**\n * Invokes the callback when document is in ready state. Callback is called\n * synchronously if document is already done loading.\n * @param {!function()} callback\n */\n const whenDocumentReady = callback => {\n const stateChanged = () => {\n // NOTE: Firefox can hit readystate interactive without document.body existing.\n // This is anti-spec, but we handle it here anyways by waiting for next change.\n if (document.readyState !== 'loading' && !!document.body) {\n document.removeEventListener('readystatechange', stateChanged);\n callback();\n }\n }\n document.addEventListener('readystatechange', stateChanged);\n stateChanged();\n }\n\n /**\n * Invokes the callback after all imports are loaded. Callback is called\n * synchronously if imports are already done loading.\n * @param {!function()} callback\n */\n const whenImportsReady = callback => {\n let imports = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(document, rootImportSelector));\n let pending = imports.length;\n if (!pending) {\n callback();\n return;\n }\n forEach(imports, imp => whenElementLoaded(imp, () => {\n if (--pending === 0) {\n callback();\n }\n }));\n }\n\n /**\n * Returns the import document containing the element.\n * @param {!Node} element\n * @return {HTMLLinkElement|Document|undefined}\n */\n const importForElement = element => {\n if (useNative) {\n // Return only if not in the main doc!\n return element.ownerDocument !== document ? element.ownerDocument : null;\n }\n let doc = element['__importDoc'];\n if (!doc && element.parentNode) {\n doc = /** @type {!Element} */ (element.parentNode);\n if (typeof doc.closest === 'function') {\n // Element.closest returns the element itself if it matches the selector,\n // so we search the closest import starting from the parent.\n doc = doc.closest(importSelector);\n } else {\n // Walk up the parent tree until we find an import.\n while (!isImportLink(doc) && (doc = doc.parentNode)) {}\n }\n element['__importDoc'] = doc;\n }\n return doc;\n }\n\n let importer = null;\n /**\n * Ensures imports contained in the element are imported.\n * Use this to handle dynamic imports attached to body.\n * @param {!(HTMLDocument|Element)} doc\n */\n const loadImports = (doc) => {\n if (importer) {\n importer.loadImports(doc);\n }\n };\n\n const newCustomEvent = (type, params) => {\n if (typeof window.CustomEvent === 'function') {\n return new CustomEvent(type, params);\n }\n const event = /** @type {!CustomEvent} */ (document.createEvent('CustomEvent'));\n event.initCustomEvent(type, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);\n return event;\n };\n\n if (useNative) {\n // Check for imports that might already be done loading by the time this\n // script is actually executed. Native imports are blocking, so the ones\n // available in the document by this time should already have failed\n // or have .import defined.\n const imps = /** @type {!NodeList<!HTMLLinkElement>} */\n (QSA(document, importSelector));\n forEach(imps, imp => {\n if (!imp.import || imp.import.readyState !== 'loading') {\n imp['__loaded'] = true;\n }\n });\n // Listen for load/error events to capture dynamically added scripts.\n /**\n * @type {!function(!Event)}\n */\n const onLoadingDone = event => {\n const elem = /** @type {!Element} */ (event.target);\n if (isImportLink(elem)) {\n elem['__loaded'] = true;\n }\n };\n document.addEventListener('load', onLoadingDone, true /* useCapture */ );\n document.addEventListener('error', onLoadingDone, true /* useCapture */ );\n } else {\n // Override baseURI so that imported elements' baseURI can be used seemlessly\n // on native or polyfilled html-imports.\n // NOTE: a <link rel=import> will have `link.baseURI === link.href`, as the link\n // itself is used as the `import` document.\n /** @type {Object|undefined} */\n const native_baseURI = Object.getOwnPropertyDescriptor(Node.prototype, 'baseURI');\n // NOTE: if not configurable (e.g. safari9), set it on the Element prototype. \n const klass = !native_baseURI || native_baseURI.configurable ? Node : Element;\n Object.defineProperty(klass.prototype, 'baseURI', {\n get() {\n const ownerDoc = /** @type {HTMLLinkElement} */ (isImportLink(this) ? this : importForElement(this));\n if (ownerDoc) return ownerDoc.href;\n // Use native baseURI if possible.\n if (native_baseURI && native_baseURI.get) return native_baseURI.get.call(this);\n // Polyfill it if not available.\n const base = /** @type {HTMLBaseElement} */ (document.querySelector('base'));\n return (base || window.location).href;\n },\n configurable: true,\n enumerable: true\n });\n\n // Define 'import' read-only property.\n Object.defineProperty(HTMLLinkElement.prototype, 'import', {\n get() {\n return /** @type {HTMLLinkElement} */ (this)['__import'] || null;\n },\n configurable: true,\n enumerable: true\n });\n\n whenDocumentReady(() => {\n importer = new Importer()\n });\n }\n\n /**\n Add support for the `HTMLImportsLoaded` event and the `HTMLImports.whenReady`\n method. This api is necessary because unlike the native implementation,\n script elements do not force imports to resolve. Instead, users should wrap\n code in either an `HTMLImportsLoaded` handler or after load time in an\n `HTMLImports.whenReady(callback)` call.\n\n NOTE: This module also supports these apis under the native implementation.\n Therefore, if this file is loaded, the same code can be used under both\n the polyfill and native implementation.\n */\n whenReady(() => document.dispatchEvent(newCustomEvent('HTMLImportsLoaded', {\n cancelable: true,\n bubbles: true,\n detail: undefined\n })));\n\n // exports\n scope.useNative = useNative;\n scope.whenReady = whenReady;\n scope.importForElement = importForElement;\n scope.loadImports = loadImports;\n\n})(window.HTMLImports = (window.HTMLImports || {}));","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n'use strict';\n\n// Establish scope.\nwindow['WebComponents'] = window['WebComponents'] || {'flags':{}};\n\n// loading script\nlet file = 'webcomponents-lite.js';\nlet script = document.querySelector('script[src*=\"' + file + '\"]');\nlet flagMatcher = /wc-(.+)/;\n\n// Flags. Convert url arguments to flags\nlet flags = {};\nif (!flags['noOpts']) {\n // from url\n location.search.slice(1).split('&').forEach(function(option) {\n let parts = option.split('=');\n let match;\n if (parts[0] && (match = parts[0].match(flagMatcher))) {\n flags[match[1]] = parts[1] || true;\n }\n });\n // from script\n if (script) {\n for (let i=0, a; (a=script.attributes[i]); i++) {\n if (a.name !== 'src') {\n flags[a.name] = a.value || true;\n }\n }\n }\n // log flags\n if (flags['log'] && flags['log']['split']) {\n let parts = flags['log'].split(',');\n flags['log'] = {};\n parts.forEach(function(f) {\n flags['log'][f] = true;\n });\n } else {\n flags['log'] = {};\n }\n}\n\n// exports\nwindow['WebComponents']['flags'] = flags;\nlet forceShady = flags['shadydom'];\nif (forceShady) {\n window['ShadyDOM'] = window['ShadyDOM'] || {};\n window['ShadyDOM']['force'] = forceShady;\n}\n\nlet forceCE = flags['register'] || flags['ce'];\nif (forceCE && window['customElements']) {\n window['customElements']['forcePolyfill'] = forceCE;\n}","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n\nexport class ShadyData {\n constructor() {\n /** @type {ShadowRoot} */\n this.root = null;\n /** @type {ShadowRoot} */\n this.publicRoot = null;\n this.dirty = false;\n this.observer = null;\n /** @type {Array<Node>} */\n this.assignedNodes = null;\n /** @type {Element} */\n this.assignedSlot = null;\n /** @type {Array<Node>} */\n this._previouslyAssignedNodes = null;\n /** @type {Element} */\n this._prevAssignedSlot = null;\n /** @type {Array<Node>} */\n this.flattenedNodes = null;\n this.ownerShadyRoot = undefined;\n /** @type {Node|undefined} */\n this.parentNode = undefined;\n /** @type {Node|undefined} */\n this.firstChild = undefined;\n /** @type {Node|undefined} */\n this.lastChild = undefined;\n /** @type {Node|undefined} */\n this.previousSibling = undefined;\n /** @type {Node|undefined} */\n this.nextSibling = undefined;\n /** @type {Array<Node>|undefined} */\n this.childNodes = undefined;\n this.__outsideAccessors = false;\n this.__insideAccessors = false;\n }\n\n toJSON() {\n return {};\n }\n}\n\nexport function ensureShadyDataForNode(node) {\n if (!node.__shady) {\n node.__shady = new ShadyData();\n }\n return node.__shady;\n}\n\nexport function shadyDataForNode(node) {\n return node && node.__shady;\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport {shadyDataForNode} from './shady-data.js';\n\nexport let settings = window['ShadyDOM'] || {};\n\nsettings.hasNativeShadowDOM = Boolean(Element.prototype.attachShadow && Node.prototype.getRootNode);\n\nlet desc = Object.getOwnPropertyDescriptor(Node.prototype, 'firstChild');\n\nsettings.hasDescriptors = Boolean(desc && desc.configurable && desc.get);\nsettings.inUse = settings['force'] || !settings.hasNativeShadowDOM;\n\n// Default to using native accessors (instead of treewalker) only for\n// IE/Edge where they are faster.\nconst IS_IE = navigator.userAgent.match('Trident');\nconst IS_EDGE = navigator.userAgent.match('Edge');\nif (settings.useNativeAccessors === undefined) {\n settings.useNativeAccessors = settings.hasDescriptors && (IS_IE || IS_EDGE);\n}\n\nexport function isTrackingLogicalChildNodes(node) {\n const nodeData = shadyDataForNode(node);\n return (nodeData && nodeData.firstChild !== undefined);\n}\n\nexport function isShadyRoot(obj) {\n return Boolean(obj._localName === 'ShadyRoot');\n}\n\nexport function ownerShadyRootForNode(node) {\n let root = node.getRootNode();\n if (isShadyRoot(root)) {\n return root;\n }\n}\n\nlet p = Element.prototype;\nlet matches = p.matches || p.matchesSelector ||\n p.mozMatchesSelector || p.msMatchesSelector ||\n p.oMatchesSelector || p.webkitMatchesSelector;\n\nexport function matchesSelector(element, selector) {\n return matches.call(element, selector);\n}\n\nfunction copyOwnProperty(name, source, target) {\n let pd = Object.getOwnPropertyDescriptor(source, name);\n if (pd) {\n Object.defineProperty(target, name, pd);\n }\n}\n\nexport function extend(target, source) {\n if (target && source) {\n let n$ = Object.getOwnPropertyNames(source);\n for (let i=0, n; (i<n$.length) && (n=n$[i]); i++) {\n copyOwnProperty(n, source, target);\n }\n }\n return target || source;\n}\n\nexport function extendAll(target, ...sources) {\n for (let i=0; i < sources.length; i++) {\n extend(target, sources[i]);\n }\n return target;\n}\n\nexport function mixin(target, source) {\n for (var i in source) {\n target[i] = source[i];\n }\n return target;\n}\n\nexport function patchPrototype(obj, mixin) {\n let proto = Object.getPrototypeOf(obj);\n if (!proto.hasOwnProperty('__patchProto')) {\n let patchProto = Object.create(proto);\n patchProto.__sourceProto = proto;\n extend(patchProto, mixin);\n proto['__patchProto'] = patchProto;\n }\n // old browsers don't have setPrototypeOf\n obj.__proto__ = proto['__patchProto'];\n}\n\n\nlet twiddle = document.createTextNode('');\nlet content = 0;\nlet queue = [];\nnew MutationObserver(() => {\n while (queue.length) {\n // catch errors in user code...\n try {\n queue.shift()();\n } catch(e) {\n // enqueue another record and throw\n twiddle.textContent = content++;\n throw(e);\n }\n }\n}).observe(twiddle, {characterData: true});\n\n// use MutationObserver to get microtask async timing.\nexport function microtask(callback) {\n queue.push(callback);\n twiddle.textContent = content++;\n}\n\nexport const hasDocumentContains = Boolean(document.contains);\n\nexport function contains(container, node) {\n while (node) {\n if (node == container) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\n\n// render enqueuer/flusher\nlet flushList = [];\nlet scheduled;\nexport function enqueue(callback) {\n if (!scheduled) {\n scheduled = true;\n utils.microtask(flush);\n }\n flushList.push(callback);\n}\n\nexport function flush() {\n scheduled = false;\n let didFlush = Boolean(flushList.length);\n while (flushList.length) {\n flushList.shift()();\n }\n return didFlush;\n}\n\nflush['list'] = flushList;\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\nimport {ensureShadyDataForNode} from './shady-data.js';\n\nclass AsyncObserver {\n\n constructor() {\n this._scheduled = false;\n this.addedNodes = [];\n this.removedNodes = [];\n this.callbacks = new Set();\n }\n\n schedule() {\n if (!this._scheduled) {\n this._scheduled = true;\n utils.microtask(() => {\n this.flush();\n });\n }\n }\n\n flush() {\n if (this._scheduled) {\n this._scheduled = false;\n let mutations = this.takeRecords();\n if (mutations.length) {\n this.callbacks.forEach(function(cb) {\n cb(mutations);\n });\n }\n }\n }\n\n takeRecords() {\n if (this.addedNodes.length || this.removedNodes.length) {\n let mutations = [{\n addedNodes: this.addedNodes,\n removedNodes: this.removedNodes\n }];\n this.addedNodes = [];\n this.removedNodes = [];\n return mutations;\n }\n return [];\n }\n\n}\n\n// TODO(sorvell): consider instead polyfilling MutationObserver\n// directly so that users do not have to fork their code.\n// Supporting the entire api may be challenging: e.g. filtering out\n// removed nodes in the wrong scope and seeing non-distributing\n// subtree child mutations.\nexport let observeChildren = function(node, callback) {\n const sd = ensureShadyDataForNode(node);\n if (!sd.observer) {\n sd.observer = new AsyncObserver();\n }\n sd.observer.callbacks.add(callback);\n let observer = sd.observer;\n return {\n _callback: callback,\n _observer: observer,\n _node: node,\n takeRecords() {\n return observer.takeRecords()\n }\n };\n}\n\nexport let unobserveChildren = function(handle) {\n let observer = handle && handle._observer;\n if (observer) {\n observer.callbacks.delete(handle._callback);\n if (!observer.callbacks.size) {\n ensureShadyDataForNode(handle._node).observer = null;\n }\n }\n}\n\nexport function filterMutations(mutations, target) {\n /** @const {Node} */\n const targetRootNode = target.getRootNode();\n return mutations.map(function(mutation) {\n /** @const {boolean} */\n const mutationInScope = (targetRootNode === mutation.target.getRootNode());\n if (mutationInScope && mutation.addedNodes) {\n let nodes = Array.from(mutation.addedNodes).filter(function(n) {\n return (targetRootNode === n.getRootNode());\n });\n if (nodes.length) {\n mutation = Object.create(mutation);\n Object.defineProperty(mutation, 'addedNodes', {\n value: nodes,\n configurable: true\n });\n return mutation;\n }\n } else if (mutationInScope) {\n return mutation;\n }\n }).filter(function(m) { return m});\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nexport let appendChild = Element.prototype.appendChild;\nexport let insertBefore = Element.prototype.insertBefore;\nexport let replaceChild = Element.prototype.replaceChild;\nexport let removeChild = Element.prototype.removeChild;\nexport let setAttribute = Element.prototype.setAttribute;\nexport let removeAttribute = Element.prototype.removeAttribute;\nexport let cloneNode = Element.prototype.cloneNode;\nexport let importNode = Document.prototype.importNode;\nexport let addEventListener = Element.prototype.addEventListener;\nexport let removeEventListener = Element.prototype.removeEventListener;\nexport let windowAddEventListener = Window.prototype.addEventListener;\nexport let windowRemoveEventListener = Window.prototype.removeEventListener;\nexport let dispatchEvent = Element.prototype.dispatchEvent;\nexport let contains = Node.prototype.contains || HTMLElement.prototype.contains;\nexport let getElementById = Document.prototype.getElementById;\nexport let elementQuerySelector = Element.prototype.querySelector;\nexport let fragmentQuerySelector = DocumentFragment.prototype.querySelector;\nexport let documentQuerySelector = Document.prototype.querySelector;\nexport let querySelector = function(selector) {\n switch (this.nodeType) {\n case Node.ELEMENT_NODE:\n return elementQuerySelector.call(this, selector);\n case Node.DOCUMENT_NODE:\n return documentQuerySelector.call(this, selector);\n default:\n return fragmentQuerySelector.call(this, selector);\n }\n};\nexport let elementQuerySelectorAll = Element.prototype.querySelectorAll;\nexport let fragmentQuerySelectorAll = DocumentFragment.prototype.querySelectorAll;\nexport let documentQuerySelectorAll = Document.prototype.querySelectorAll;\nexport let querySelectorAll = function(selector) {\n switch (this.nodeType) {\n case Node.ELEMENT_NODE:\n return elementQuerySelectorAll.call(this, selector);\n case Node.DOCUMENT_NODE:\n return documentQuerySelectorAll.call(this, selector);\n default:\n return fragmentQuerySelectorAll.call(this, selector);\n }\n};","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n// Cribbed from ShadowDOM polyfill\n// https://github.com/webcomponents/webcomponentsjs/blob/master/src/ShadowDOM/wrappers/HTMLElement.js#L28\n/////////////////////////////////////////////////////////////////////////////\n// innerHTML and outerHTML\n\n// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\nlet escapeAttrRegExp = /[&\\u00A0\"]/g;\nlet escapeDataRegExp = /[&\\u00A0<>]/g;\n\nfunction escapeReplace(c) {\n switch (c) {\n case '&':\n return '&amp;';\n case '<':\n return '&lt;';\n case '>':\n return '&gt;';\n case '\"':\n return '&quot;';\n case '\\u00A0':\n return '&nbsp;';\n }\n}\n\nfunction escapeAttr(s) {\n return s.replace(escapeAttrRegExp, escapeReplace);\n}\n\nfunction escapeData(s) {\n return s.replace(escapeDataRegExp, escapeReplace);\n}\n\nfunction makeSet(arr) {\n let set = {};\n for (let i = 0; i < arr.length; i++) {\n set[arr[i]] = true;\n }\n return set;\n}\n\n// http://www.whatwg.org/specs/web-apps/current-work/#void-elements\nlet voidElements = makeSet([\n 'area',\n 'base',\n 'br',\n 'col',\n 'command',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n]);\n\nlet plaintextParents = makeSet([\n 'style',\n 'script',\n 'xmp',\n 'iframe',\n 'noembed',\n 'noframes',\n 'plaintext',\n 'noscript'\n]);\n\n/**\n * @param {Node} node\n * @param {Node} parentNode\n * @param {Function=} callback\n */\nexport function getOuterHTML(node, parentNode, callback) {\n switch (node.nodeType) {\n case Node.ELEMENT_NODE: {\n let tagName = node.localName;\n let s = '<' + tagName;\n let attrs = node.attributes;\n for (let i = 0, attr; (attr = attrs[i]); i++) {\n s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n }\n s += '>';\n if (voidElements[tagName]) {\n return s;\n }\n return s + getInnerHTML(node, callback) + '</' + tagName + '>';\n }\n case Node.TEXT_NODE: {\n let data = /** @type {Text} */ (node).data;\n if (parentNode && plaintextParents[parentNode.localName]) {\n return data;\n }\n return escapeData(data);\n }\n case Node.COMMENT_NODE: {\n return '<!--' + /** @type {Comment} */ (node).data + '-->';\n }\n default: {\n window.console.error(node);\n throw new Error('not implemented');\n }\n }\n}\n\n/**\n * @param {Node} node\n * @param {Function=} callback\n */\nexport function getInnerHTML(node, callback) {\n if (node.localName === 'template') {\n node = /** @type {HTMLTemplateElement} */ (node).content;\n }\n let s = '';\n let c$ = callback ? callback(node) : node.childNodes;\n for (let i=0, l=c$.length, child; (i<l) && (child=c$[i]); i++) {\n s += getOuterHTML(child, node, callback);\n }\n return s;\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport {getInnerHTML} from './innerHTML.js';\n\nlet nodeWalker = document.createTreeWalker(document, NodeFilter.SHOW_ALL,\n null, false);\n\nlet elementWalker = document.createTreeWalker(document, NodeFilter.SHOW_ELEMENT,\n null, false);\n\nexport function parentNode(node) {\n nodeWalker.currentNode = node;\n return nodeWalker.parentNode();\n}\n\nexport function firstChild(node) {\n nodeWalker.currentNode = node;\n return nodeWalker.firstChild();\n}\n\nexport function lastChild(node) {\n nodeWalker.currentNode = node;\n return nodeWalker.lastChild();\n}\n\nexport function previousSibling(node) {\n nodeWalker.currentNode = node;\n return nodeWalker.previousSibling();\n}\n\nexport function nextSibling(node) {\n nodeWalker.currentNode = node;\n return nodeWalker.nextSibling();\n}\n\nexport function childNodes(node) {\n let nodes = [];\n nodeWalker.currentNode = node;\n let n = nodeWalker.firstChild();\n while (n) {\n nodes.push(n);\n n = nodeWalker.nextSibling();\n }\n return nodes;\n}\n\nexport function parentElement(node) {\n elementWalker.currentNode = node;\n return elementWalker.parentNode();\n}\n\nexport function firstElementChild(node) {\n elementWalker.currentNode = node;\n return elementWalker.firstChild();\n}\n\nexport function lastElementChild(node) {\n elementWalker.currentNode = node;\n return elementWalker.lastChild();\n}\n\nexport function previousElementSibling(node) {\n elementWalker.currentNode = node;\n return elementWalker.previousSibling();\n}\n\nexport function nextElementSibling(node) {\n elementWalker.currentNode = node;\n return elementWalker.nextSibling();\n}\n\nexport function children(node) {\n let nodes = [];\n elementWalker.currentNode = node;\n let n = elementWalker.firstChild();\n while (n) {\n nodes.push(n);\n n = elementWalker.nextSibling();\n }\n return nodes;\n}\n\nexport function innerHTML(node) {\n return getInnerHTML(node, (n) => childNodes(n));\n}\n\nexport function textContent(node) {\n /* eslint-disable no-case-declarations */\n switch (node.nodeType) {\n case Node.ELEMENT_NODE:\n case Node.DOCUMENT_FRAGMENT_NODE:\n let textWalker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT,\n null, false);\n let content = '', n;\n while ( (n = textWalker.nextNode()) ) {\n // TODO(sorvell): can't use textContent since we patch it on Node.prototype!\n // However, should probably patch it only on element.\n content += n.nodeValue;\n }\n return content;\n default:\n return node.nodeValue;\n }\n /* eslint-enable */\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport * as utils from './utils.js';\n\nconst hasDescriptors = utils.settings.hasDescriptors;\n\n// Find descriptor on the \"lowest\" native prototype. Safe as these are not\n// overridden and we call these on nodes.\nconst nativeProtos = [Node.prototype, Element.prototype, HTMLElement.prototype];\n// note, avoid Array.find for IE11 compat.\nfunction findNativeProtoWithDescriptor(name) {\n for (let i=0; i < nativeProtos.length; i++) {\n const proto = nativeProtos[i];\n if (proto.hasOwnProperty(name)) {\n return proto;\n }\n }\n}\nfunction findNodeDescriptor(name) {\n const proto = findNativeProtoWithDescriptor(name);\n if (!proto) {\n throw Error(`Could not find descriptor for ${name}`);\n }\n return Object.getOwnPropertyDescriptor(proto, name);\n}\n\nexport const nodeAccessors = hasDescriptors ? {\n parentNode: findNodeDescriptor('parentNode'),\n firstChild: findNodeDescriptor('firstChild'),\n lastChild: findNodeDescriptor('lastChild'),\n previousSibling: findNodeDescriptor('previousSibling'),\n nextSibling: findNodeDescriptor('nextSibling'),\n childNodes: findNodeDescriptor('childNodes'),\n parentElement: findNodeDescriptor('parentElement'),\n previousElementSibling: findNodeDescriptor('previousElementSibling'),\n nextElementSibling: findNodeDescriptor('nextElementSibling'),\n innerHTML: findNodeDescriptor('innerHTML'),\n textContent: findNodeDescriptor('textContent'),\n firstElementChild: findNodeDescriptor('firstElementChild'),\n lastElementChild: findNodeDescriptor('lastElementChild'),\n children: findNodeDescriptor('children'),\n} : {};\n\nexport const fragmentAccessors = hasDescriptors ? {\n firstElementChild: Object.getOwnPropertyDescriptor(\n DocumentFragment.prototype, 'firstElementChild'),\n lastElementChild: Object.getOwnPropertyDescriptor(\n DocumentFragment.prototype, 'lastElementChild'),\n children: Object.getOwnPropertyDescriptor(\n DocumentFragment.prototype, 'children')\n} : {};\n\nexport const documentAccessors = hasDescriptors ? {\n firstElementChild: Object.getOwnPropertyDescriptor(\n Document.prototype, 'firstElementChild'),\n lastElementChild: Object.getOwnPropertyDescriptor(\n Document.prototype, 'lastElementChild'),\n children: Object.getOwnPropertyDescriptor(\n Document.prototype, 'children')\n} : {};\n\nexport function parentNode(node) {\n return nodeAccessors.parentNode.get.call(node);\n}\n\nexport function firstChild(node) {\n return nodeAccessors.firstChild.get.call(node);\n}\n\nexport function lastChild(node) {\n return nodeAccessors.lastChild.get.call(node);\n}\n\nexport function previousSibling(node) {\n return nodeAccessors.previousSibling.get.call(node);\n}\n\nexport function nextSibling(node) {\n return nodeAccessors.nextSibling.get.call(node);\n}\n\nexport function childNodes(node) {\n return Array.prototype.slice.call(nodeAccessors.childNodes.get.call(node));\n}\n\nexport function parentElement(node) {\n return nodeAccessors.parentElement.get.call(node);\n}\n\nexport function previousElementSibling(node) {\n return nodeAccessors.previousElementSibling.get.call(node);\n}\n\nexport function nextElementSibling(node) {\n return nodeAccessors.nextElementSibling.get.call(node);\n}\n\nexport function innerHTML(node) {\n return nodeAccessors.innerHTML.get.call(node);\n}\n\nexport function textContent(node) {\n return nodeAccessors.textContent.get.call(node);\n}\n\nexport function children(node) {\n let children;\n switch (node.nodeType) {\n case Node.DOCUMENT_FRAGMENT_NODE:\n children = fragmentAccessors.children.get.call(node);\n break;\n case Node.DOCUMENT_NODE:\n children = documentAccessors.children.get.call(node);\n break;\n default:\n children = nodeAccessors.children.get.call(node);\n break;\n }\n return Array.prototype.slice.call(children);\n}\n\nexport function firstElementChild(node) {\n switch (node.nodeType) {\n case Node.DOCUMENT_FRAGMENT_NODE:\n return fragmentAccessors.firstElementChild.get.call(node);\n case Node.DOCUMENT_NODE:\n return documentAccessors.firstElementChild.get.call(node);\n default:\n return nodeAccessors.firstElementChild.get.call(node);\n }\n}\n\nexport function lastElementChild(node) {\n switch (node.nodeType) {\n case Node.DOCUMENT_FRAGMENT_NODE:\n return fragmentAccessors.lastElementChild.get.call(node);\n case Node.DOCUMENT_NODE:\n return documentAccessors.lastElementChild.get.call(node);\n default:\n return nodeAccessors.lastElementChild.get.call(node);\n }\n}","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as nativeTreeWalker from './native-tree-walker.js';\nimport * as nativeTreeAccessors from './native-tree-accessors.js';\nimport * as utils from './utils.js';\n\nexport const accessors = utils.settings.useNativeAccessors ?\n nativeTreeAccessors : nativeTreeWalker;","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\nimport {getInnerHTML} from './innerHTML.js';\nimport {accessors as nativeTree} from './native-tree.js';\nimport {nodeAccessors as nativeAccessors} from './native-tree-accessors.js';\nimport {contains as nativeContains} from './native-methods.js';\nimport {ensureShadyDataForNode, shadyDataForNode} from './shady-data.js';\n\nfunction clearNode(node) {\n while (node.firstChild) {\n node.removeChild(node.firstChild);\n }\n}\n\nconst hasDescriptors = utils.settings.hasDescriptors;\nconst inertDoc = document.implementation.createHTMLDocument('inert');\n\nconst nativeIsConnectedAccessors =\n/** @type {ObjectPropertyDescriptor} */(\n Object.getOwnPropertyDescriptor(Node.prototype, 'isConnected')\n);\n\nconst nativeIsConnected = nativeIsConnectedAccessors && nativeIsConnectedAccessors.get;\n\nconst nativeActiveElementDescriptor =\n /** @type {ObjectPropertyDescriptor} */(\n Object.getOwnPropertyDescriptor(Document.prototype, 'activeElement')\n );\nfunction getDocumentActiveElement() {\n if (nativeActiveElementDescriptor && nativeActiveElementDescriptor.get) {\n return nativeActiveElementDescriptor.get.call(document);\n } else if (!utils.settings.hasDescriptors) {\n return document.activeElement;\n }\n}\n\nfunction activeElementForNode(node) {\n let active = getDocumentActiveElement();\n // In IE11, activeElement might be an empty object if the document is\n // contained in an iframe.\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/10998788/\n if (!active || !active.nodeType) {\n return null;\n }\n let isShadyRoot = !!(utils.isShadyRoot(node));\n if (node !== document) {\n // If this node isn't a document or shady root, then it doesn't have\n // an active element.\n if (!isShadyRoot) {\n return null;\n }\n // If this shady root's host is the active element or the active\n // element is not a descendant of the host (in the composed tree),\n // then it doesn't have an active element.\n if (node.host === active ||\n !nativeContains.call(node.host, active)) {\n return null;\n }\n }\n // This node is either the document or a shady root of which the active\n // element is a (composed) descendant of its host; iterate upwards to\n // find the active element's most shallow host within it.\n let activeRoot = utils.ownerShadyRootForNode(active);\n while (activeRoot && activeRoot !== node) {\n active = activeRoot.host;\n activeRoot = utils.ownerShadyRootForNode(active);\n }\n if (node === document) {\n // This node is the document, so activeRoot should be null.\n return activeRoot ? null : active;\n } else {\n // This node is a non-document shady root, and it should be\n // activeRoot.\n return activeRoot === node ? active : null;\n }\n}\n\nlet OutsideAccessors = {\n\n parentElement: {\n /** @this {Node} */\n get() {\n const nodeData = shadyDataForNode(this);\n let l = nodeData && nodeData.parentNode;\n if (l && l.nodeType !== Node.ELEMENT_NODE) {\n l = null;\n }\n return l !== undefined ? l : nativeTree.parentElement(this);\n },\n configurable: true\n },\n\n parentNode: {\n /** @this {Node} */\n get() {\n const nodeData = shadyDataForNode(this);\n const l = nodeData && nodeData.parentNode;\n return l !== undefined ? l : nativeTree.parentNode(this);\n },\n configurable: true\n },\n\n nextSibling: {\n /** @this {Node} */\n get() {\n const nodeData = shadyDataForNode(this);\n const l = nodeData && nodeData.nextSibling;\n return l !== undefined ? l : nativeTree.nextSibling(this);\n },\n configurable: true\n },\n\n previousSibling: {\n /** @this {Node} */\n get() {\n const nodeData = shadyDataForNode(this);\n const l = nodeData && nodeData.previousSibling;\n return l !== undefined ? l : nativeTree.previousSibling(this);\n },\n configurable: true\n },\n\n // fragment, element, document\n nextElementSibling: {\n /**\n * @this {HTMLElement}\n */\n get() {\n const nodeData = shadyDataForNode(this);\n if (nodeData && nodeData.nextSibling !== undefined) {\n let n = this.nextSibling;\n while (n && n.nodeType !== Node.ELEMENT_NODE) {\n n = n.nextSibling;\n }\n return n;\n } else {\n return nativeTree.nextElementSibling(this);\n }\n },\n configurable: true\n },\n\n previousElementSibling: {\n /**\n * @this {HTMLElement}\n */\n get() {\n const nodeData = shadyDataForNode(this);\n if (nodeData && nodeData.previousSibling !== undefined) {\n let n = this.previousSibling;\n while (n && n.nodeType !== Node.ELEMENT_NODE) {\n n = n.previousSibling;\n }\n return n;\n } else {\n return nativeTree.previousElementSibling(this);\n }\n },\n configurable: true\n }\n\n};\n\nexport const ClassNameAccessor = {\n className: {\n /**\n * @this {HTMLElement}\n */\n get() {\n return this.getAttribute('class') || '';\n },\n /**\n * @this {HTMLElement}\n */\n set(value) {\n this.setAttribute('class', value);\n },\n configurable: true\n }\n}\n\nexport const IsConnectedAccessor = {\n\n isConnected: {\n /**\n * @this {Node}\n */\n get() {\n if (nativeIsConnected && nativeIsConnected.call(this)) {\n return true;\n }\n if (this.nodeType == Node.DOCUMENT_FRAGMENT_NODE) {\n return false;\n }\n // Fast path for distributed nodes.\n const ownerDocument = this.ownerDocument;\n if (utils.hasDocumentContains) {\n if (nativeContains.call(ownerDocument, this)) {\n return true;\n }\n } else if (ownerDocument.documentElement &&\n nativeContains.call(ownerDocument.documentElement, this)) {\n return true;\n }\n // Slow path for non-distributed nodes.\n let node = this;\n while (node && !(node instanceof Document)) {\n node = node.parentNode || (utils.isShadyRoot(node) ? /** @type {ShadowRoot} */(node).host : undefined);\n }\n return !!(node && node instanceof Document);\n },\n configurable: true\n }\n};\n\nlet InsideAccessors = {\n\n childNodes: {\n /**\n * @this {HTMLElement}\n */\n get() {\n let childNodes;\n if (utils.isTrackingLogicalChildNodes(this)) {\n const nodeData = shadyDataForNode(this);\n if (!nodeData.childNodes) {\n nodeData.childNodes = [];\n for (let n=this.firstChild; n; n=n.nextSibling) {\n nodeData.childNodes.push(n);\n }\n }\n childNodes = nodeData.childNodes;\n } else {\n childNodes = nativeTree.childNodes(this);\n }\n childNodes.item = function(index) {\n return childNodes[index];\n }\n return childNodes;\n },\n configurable: true\n },\n\n childElementCount: {\n /** @this {HTMLElement} */\n get() {\n return this.children.length;\n },\n configurable: true\n },\n\n firstChild: {\n /** @this {HTMLElement} */\n get() {\n const nodeData = shadyDataForNode(this);\n const l = nodeData && nodeData.firstChild;\n return l !== undefined ? l : nativeTree.firstChild(this);\n },\n configurable: true\n },\n\n lastChild: {\n /** @this {HTMLElement} */\n get() {\n const nodeData = shadyDataForNode(this);\n const l = nodeData && nodeData.lastChild;\n return l !== undefined ? l : nativeTree.lastChild(this);\n },\n configurable: true\n },\n\n textContent: {\n /**\n * @this {HTMLElement}\n */\n get() {\n if (utils.isTrackingLogicalChildNodes(this)) {\n let tc = [];\n for (let i = 0, cn = this.childNodes, c; (c = cn[i]); i++) {\n if (c.nodeType !== Node.COMMENT_NODE) {\n tc.push(c.textContent);\n }\n }\n return tc.join('');\n } else {\n return nativeTree.textContent(this);\n }\n },\n /**\n * @this {HTMLElement}\n * @param {string} text\n */\n set(text) {\n if (typeof text === 'undefined' || text === null) {\n text = ''\n }\n switch (this.nodeType) {\n case Node.ELEMENT_NODE:\n case Node.DOCUMENT_FRAGMENT_NODE:\n if (!utils.isTrackingLogicalChildNodes(this) && hasDescriptors) {\n // may be removing a nested slot but fast path if we know we are not.\n const firstChild = this.firstChild;\n if (firstChild != this.lastChild ||\n (firstChild && firstChild.nodeType != Node.TEXT_NODE)) {\n clearNode(this);\n }\n nativeAccessors.textContent.set.call(this, text);\n } else {\n clearNode(this);\n // Document fragments must have no childnodes if setting a blank string\n if (text.length > 0 || this.nodeType === Node.ELEMENT_NODE) {\n this.appendChild(document.createTextNode(text));\n }\n }\n break;\n default:\n // TODO(sorvell): can't do this if patch nodeValue.\n this.nodeValue = text;\n break;\n }\n },\n configurable: true\n },\n\n // fragment, element, document\n firstElementChild: {\n /**\n * @this {HTMLElement}\n */\n get() {\n const nodeData = shadyDataForNode(this);\n if (nodeData && nodeData.firstChild !== undefined) {\n let n = this.firstChild;\n while (n && n.nodeType !== Node.ELEMENT_NODE) {\n n = n.nextSibling;\n }\n return n;\n } else {\n return nativeTree.firstElementChild(this);\n }\n },\n configurable: true\n },\n\n lastElementChild: {\n /**\n * @this {HTMLElement}\n */\n get() {\n const nodeData = shadyDataForNode(this);\n if (nodeData && nodeData.lastChild !== undefined) {\n let n = this.lastChild;\n while (n && n.nodeType !== Node.ELEMENT_NODE) {\n n = n.previousSibling;\n }\n return n;\n } else {\n return nativeTree.lastElementChild(this);\n }\n },\n configurable: true\n },\n\n children: {\n /**\n * @this {HTMLElement}\n */\n get() {\n let children;\n if (utils.isTrackingLogicalChildNodes(this)) {\n children = Array.prototype.filter.call(this.childNodes, function(n) {\n return (n.nodeType === Node.ELEMENT_NODE);\n });\n } else {\n children = nativeTree.children(this);\n }\n children.item = function(index) {\n return children[index];\n }\n return children;\n },\n configurable: true\n },\n\n // element (HTMLElement on IE11)\n innerHTML: {\n /**\n * @this {HTMLElement}\n */\n get() {\n if (utils.isTrackingLogicalChildNodes(this)) {\n const content = this.localName === 'template' ?\n /** @type {HTMLTemplateElement} */(this).content : this;\n return getInnerHTML(content);\n } else {\n return nativeTree.innerHTML(this);\n }\n },\n /**\n * @this {HTMLElement}\n */\n set(text) {\n const content = this.localName === 'template' ?\n /** @type {HTMLTemplateElement} */(this).content : this;\n clearNode(content);\n let containerName = this.localName;\n // avoid creating a template so we don't have to pull nodes form `.content`\n if (!containerName || containerName === 'template') {\n containerName = 'div';\n }\n const htmlContainer = inertDoc.createElement(containerName);\n if (hasDescriptors) {\n nativeAccessors.innerHTML.set.call(htmlContainer, text);\n } else {\n htmlContainer.innerHTML = text;\n }\n while (htmlContainer.firstChild) {\n content.appendChild(htmlContainer.firstChild);\n }\n },\n configurable: true\n }\n\n};\n\n// Note: Can be patched on element prototype on all browsers.\n// Must be patched on instance on browsers that support native Shadow DOM\n// but do not have builtin accessors (old Chrome).\nexport let ShadowRootAccessor = {\n\n shadowRoot: {\n /**\n * @this {HTMLElement}\n */\n get() {\n const nodeData = shadyDataForNode(this);\n return nodeData && nodeData.publicRoot || null;\n },\n configurable: true\n }\n};\n\n// Note: Can be patched on document prototype on browsers with builtin accessors.\n// Must be patched separately on simulated ShadowRoot.\n// Must be patched as `_activeElement` on browsers without builtin accessors.\nexport let ActiveElementAccessor = {\n\n activeElement: {\n /**\n * @this {HTMLElement}\n */\n get() {\n return activeElementForNode(this);\n },\n /**\n * @this {HTMLElement}\n */\n set() {},\n configurable: true\n }\n\n};\n\n// patch a group of descriptors on an object only if it exists or if the `force`\n// argument is true.\n/**\n * @param {!Object} obj\n * @param {!Object} descriptors\n * @param {boolean=} force\n */\nfunction patchAccessorGroup(obj, descriptors, force) {\n for (let p in descriptors) {\n let objDesc = Object.getOwnPropertyDescriptor(obj, p);\n if ((objDesc && objDesc.configurable) ||\n (!objDesc && force)) {\n Object.defineProperty(obj, p, descriptors[p]);\n } else if (force) {\n console.warn('Could not define', p, 'on', obj); // eslint-disable-line no-console\n }\n }\n}\n\n// patch dom accessors on proto where they exist\nexport function patchAccessors(proto) {\n patchAccessorGroup(proto, OutsideAccessors);\n patchAccessorGroup(proto, ClassNameAccessor);\n patchAccessorGroup(proto, InsideAccessors);\n patchAccessorGroup(proto, ActiveElementAccessor);\n}\n\nexport function patchShadowRootAccessors(proto) {\n proto.__proto__ = DocumentFragment.prototype;\n // ensure element descriptors (IE/Edge don't have em)\n patchAccessorGroup(proto, OutsideAccessors, true);\n patchAccessorGroup(proto, InsideAccessors, true);\n patchAccessorGroup(proto, ActiveElementAccessor, true);\n // Ensure native properties are all safely wrapped since ShadowRoot is not an\n // actual DocumentFragment instance.\n Object.defineProperties(proto, {\n nodeType: {\n value: Node.DOCUMENT_FRAGMENT_NODE,\n configurable: true\n },\n nodeName: {\n value: '#document-fragment',\n configurable: true\n },\n nodeValue: {\n value: null,\n configurable: true\n }\n });\n // make undefined\n [\n 'localName',\n 'namespaceURI',\n 'prefix'\n ].forEach((prop) => {\n Object.defineProperty(proto, prop, {\n value: undefined,\n configurable: true\n });\n });\n // defer properties to host\n [\n 'ownerDocument',\n 'baseURI',\n 'isConnected'\n ].forEach((prop) => {\n Object.defineProperty(proto, prop, {\n get() {\n return this.host[prop];\n },\n configurable: true\n });\n });\n}\n\n// ensure an element has patched \"outside\" accessors; no-op when not needed\nexport let patchOutsideElementAccessors = utils.settings.hasDescriptors ?\n function() {} : function(element) {\n const sd = ensureShadyDataForNode(element);\n if (!sd.__outsideAccessors) {\n sd.__outsideAccessors = true;\n patchAccessorGroup(element, OutsideAccessors, true);\n patchAccessorGroup(element, ClassNameAccessor, true);\n }\n }\n\n// ensure an element has patched \"inside\" accessors; no-op when not needed\nexport let patchInsideElementAccessors = utils.settings.hasDescriptors ?\n function() {} : function(element) {\n const sd = ensureShadyDataForNode(element);\n if (!sd.__insideAccessors) {\n patchAccessorGroup(element, InsideAccessors, true);\n patchAccessorGroup(element, ShadowRootAccessor, true);\n }\n }\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport {calculateSplices} from './array-splice.js';\nimport * as utils from './utils.js';\nimport {enqueue} from './flush.js';\nimport {recordChildNodes} from './logical-tree.js';\nimport {removeChild, insertBefore, dispatchEvent} from './native-methods.js';\nimport {accessors} from './native-tree.js';\nimport {ensureShadyDataForNode, shadyDataForNode} from './shady-data.js';\n\nconst {parentNode, childNodes} = accessors;\n\n// Do not export this object. It must be passed as the first argument to the\n// ShadyRoot constructor in `attachShadow` to prevent the constructor from\n// throwing. This prevents the user from being able to manually construct a\n// ShadyRoot (i.e. `new ShadowRoot()`).\nconst ShadyRootConstructionToken = {};\n\nconst CATCHALL_NAME = '__catchall';\nconst SHADYROOT_NAME = 'ShadyRoot';\n\nconst MODE_CLOSED = 'closed';\n\nfunction ancestorList(node) {\n let ancestors = [];\n do {\n ancestors.unshift(node);\n } while ((node = node.parentNode));\n return ancestors;\n}\n\n/**\n * @constructor\n * @extends {ShadowRoot}\n */\nexport class ShadyRoot {\n\n constructor(token, host, options) {\n if (token !== ShadyRootConstructionToken) {\n throw new TypeError('Illegal constructor');\n }\n // NOTE: set a fake local name so this element can be\n // distinguished from a DocumentFragment when patching.\n // FF doesn't allow this to be `localName`\n this._localName = SHADYROOT_NAME;\n const c$ = childNodes(host);\n // root <=> host\n this.host = host;\n this._mode = options && options.mode;\n // logical dom setup\n recordChildNodes(host, c$);\n const hostData = shadyDataForNode(host);\n hostData.root = this;\n hostData.publicRoot = this._mode !== MODE_CLOSED ? this : null;\n // setup root\n const rootData = ensureShadyDataForNode(this);\n rootData.firstChild = rootData.lastChild =\n rootData.parentNode = rootData.nextSibling =\n rootData.previousSibling = null;\n rootData.childNodes = [];\n // state flags\n this._renderPending = false;\n this._hasRendered = false;\n // marsalled lazily\n this._slotList = null;\n this._slotMap = null;\n this._pendingSlots = null;\n // fast path initial render: remove existing physical dom.\n for (let i=0, l=c$.length; i < l; i++) {\n removeChild.call(host, c$[i])\n }\n }\n\n // async render\n _asyncRender() {\n if (!this._renderPending) {\n this._renderPending = true;\n enqueue(() => this._render());\n }\n }\n\n // returns the oldest renderPending ancestor root.\n _getRenderRoot() {\n let renderRoot;\n let root = this;\n while (root) {\n if (root._renderPending) {\n renderRoot = root;\n }\n root = root._rendererForHost();\n }\n return renderRoot;\n }\n\n // Returns the shadyRoot `this.host` if `this.host`\n // has children that require distribution.\n _rendererForHost() {\n let root = this.host.getRootNode();\n if (utils.isShadyRoot(root)) {\n let c$ = this.host.childNodes;\n for (let i=0, c; i < c$.length; i++) {\n c = c$[i];\n if (this._isInsertionPoint(c)) {\n return root;\n }\n }\n }\n }\n\n _render() {\n const root = this._getRenderRoot();\n if (root) {\n root['_renderRoot']();\n }\n }\n\n // NOTE: avoid renaming to ease testability.\n ['_renderRoot']() {\n this._renderPending = false;\n if (this._slotList) {\n this._distribute();\n this._compose();\n }\n this._hasRendered = true;\n }\n\n _distribute() {\n this._validateSlots();\n // capture # of previously assigned nodes to help determine if dirty.\n for (let i=0, slot; i < this._slotList.length; i++) {\n slot = this._slotList[i];\n this._clearSlotAssignedNodes(slot);\n }\n // distribute host children.\n for (let n=this.host.firstChild; n; n=n.nextSibling) {\n this._distributeNodeToSlot(n);\n }\n // fallback content, slotchange, and dirty roots\n for (let i=0; i < this._slotList.length; i++) {\n const slot = this._slotList[i];\n const slotData = shadyDataForNode(slot);\n // distribute fallback content\n if (!slotData.assignedNodes.length) {\n for (let n=slot.firstChild; n; n=n.nextSibling) {\n this._distributeNodeToSlot(n, slot);\n }\n }\n const slotParentData = shadyDataForNode(slot.parentNode);\n const slotParentRoot = slotParentData && slotParentData.root;\n if (slotParentRoot && slotParentRoot._hasInsertionPoint()) {\n slotParentRoot['_renderRoot']();\n }\n this._addAssignedToFlattenedNodes(slotData.flattenedNodes,\n slotData.assignedNodes);\n let prevAssignedNodes = slotData._previouslyAssignedNodes;\n if (prevAssignedNodes) {\n for (let i=0; i < prevAssignedNodes.length; i++) {\n shadyDataForNode(prevAssignedNodes[i])._prevAssignedSlot = null;\n }\n slotData._previouslyAssignedNodes = null;\n // dirty if previously less assigned nodes than previously assigned.\n if (prevAssignedNodes.length > slotData.assignedNodes.length) {\n slotData.dirty = true;\n }\n }\n /* Note: A slot is marked dirty whenever a node is newly assigned to it\n or a node is assigned to a different slot (done in `_distributeNodeToSlot`)\n or if the number of nodes assigned to the slot has decreased (done above);\n */\n if (slotData.dirty) {\n slotData.dirty = false;\n this._fireSlotChange(slot);\n }\n }\n }\n\n /**\n * Distributes given `node` to the appropriate slot based on its `slot`\n * attribute. If `forcedSlot` is given, then the node is distributed to the\n * `forcedSlot`.\n * Note: slot to which the node is assigned will be marked dirty for firing\n * `slotchange`.\n * @param {Node} node\n * @param {Node=} forcedSlot\n *\n */\n _distributeNodeToSlot(node, forcedSlot) {\n const nodeData = ensureShadyDataForNode(node);\n let oldSlot = nodeData._prevAssignedSlot;\n nodeData._prevAssignedSlot = null;\n let slot = forcedSlot;\n if (!slot) {\n let name = node.slot || CATCHALL_NAME;\n const list = this._slotMap[name];\n slot = list && list[0];\n }\n if (slot) {\n const slotData = ensureShadyDataForNode(slot);\n slotData.assignedNodes.push(node);\n nodeData.assignedSlot = slot;\n } else {\n nodeData.assignedSlot = undefined;\n }\n if (oldSlot !== nodeData.assignedSlot) {\n if (nodeData.assignedSlot) {\n ensureShadyDataForNode(nodeData.assignedSlot).dirty = true;\n }\n }\n }\n\n /**\n * Clears the assignedNodes tracking data for a given `slot`. Note, the current\n * assigned node data is tracked (via _previouslyAssignedNodes and\n * _prevAssignedSlot) to see if `slotchange` should fire. This data may be out\n * of date at this time because the assigned nodes may have already been\n * distributed to another root. This is ok since this data is only used to\n * track changes.\n * @param {HTMLSlotElement} slot\n */\n _clearSlotAssignedNodes(slot) {\n const slotData = shadyDataForNode(slot);\n let n$ = slotData.assignedNodes;\n slotData.assignedNodes = [];\n slotData.flattenedNodes = [];\n slotData._previouslyAssignedNodes = n$;\n if (n$) {\n for (let i=0; i < n$.length; i++) {\n let n = shadyDataForNode(n$[i]);\n n._prevAssignedSlot = n.assignedSlot;\n // only clear if it was previously set to this slot;\n // this helps ensure that if the node has otherwise been distributed\n // ignore it.\n if (n.assignedSlot === slot) {\n n.assignedSlot = null;\n }\n }\n }\n }\n\n _addAssignedToFlattenedNodes(flattened, assigned) {\n for (let i=0, n; (i<assigned.length) && (n=assigned[i]); i++) {\n if (n.localName == 'slot') {\n const nestedAssigned = shadyDataForNode(n).assignedNodes;\n if (nestedAssigned && nestedAssigned.length) {\n this._addAssignedToFlattenedNodes(flattened, nestedAssigned);\n }\n } else {\n flattened.push(assigned[i]);\n }\n }\n }\n\n _fireSlotChange(slot) {\n // NOTE: cannot bubble correctly here so not setting bubbles: true\n // Safari tech preview does not bubble but chrome does\n // Spec says it bubbles (https://dom.spec.whatwg.org/#mutation-observers)\n dispatchEvent.call(slot, new Event('slotchange'));\n const slotData = shadyDataForNode(slot);\n if (slotData.assignedSlot) {\n this._fireSlotChange(slotData.assignedSlot);\n }\n }\n\n // Reify dom such that it is at its correct rendering position\n // based on logical distribution.\n // NOTE: here we only compose parents of <slot> elements and not the\n // shadowRoot into the host. The latter is performend via a fast path\n // in the `logical-mutation`.insertBefore.\n _compose() {\n const slots = this._slotList;\n let composeList = [];\n for (let i=0; i < slots.length; i++) {\n const parent = slots[i].parentNode;\n /* compose node only if:\n (1) parent does not have a shadowRoot since shadowRoot has already\n composed into the host\n (2) we're not already composing it\n [consider (n^2) but rare better than Set]\n */\n const parentData = shadyDataForNode(parent);\n if (!(parentData && parentData.root) &&\n composeList.indexOf(parent) < 0) {\n composeList.push(parent);\n }\n }\n for (let i=0; i < composeList.length; i++) {\n const node = composeList[i];\n const targetNode = node === this ? this.host : node;\n this._updateChildNodes(targetNode, this._composeNode(node));\n }\n }\n\n // Returns the list of nodes which should be rendered inside `node`.\n _composeNode(node) {\n let children = [];\n let c$ = node.childNodes;\n for (let i = 0; i < c$.length; i++) {\n let child = c$[i];\n // Note: if we see a slot here, the nodes are guaranteed to need to be\n // composed here. This is because if there is redistribution, it has\n // already been handled by this point.\n if (this._isInsertionPoint(child)) {\n let flattenedNodes = shadyDataForNode(child).flattenedNodes;\n for (let j = 0; j < flattenedNodes.length; j++) {\n let distributedNode = flattenedNodes[j];\n children.push(distributedNode);\n }\n } else {\n children.push(child);\n }\n }\n return children;\n }\n\n _isInsertionPoint(node) {\n return node.localName == 'slot';\n }\n\n // Ensures that the rendered node list inside `container` is `children`.\n _updateChildNodes(container, children) {\n let composed = childNodes(container);\n let splices = calculateSplices(children, composed);\n // process removals\n for (let i=0, d=0, s; (i<splices.length) && (s=splices[i]); i++) {\n for (let j=0, n; (j < s.removed.length) && (n=s.removed[j]); j++) {\n // check if the node is still where we expect it is before trying\n // to remove it; this can happen if we move a node and\n // then schedule its previous host for distribution resulting in\n // the node being removed here.\n if (parentNode(n) === container) {\n removeChild.call(container, n);\n }\n // TODO(sorvell): avoid the need for splicing here.\n composed.splice(s.index + d, 1);\n }\n d -= s.addedCount;\n }\n // process adds\n for (let i=0, s, next; (i<splices.length) && (s=splices[i]); i++) { //eslint-disable-line no-redeclare\n next = composed[s.index];\n for (let j=s.index, n; j < s.index + s.addedCount; j++) {\n n = children[j];\n insertBefore.call(container, n, next);\n composed.splice(j, 0, n);\n }\n }\n }\n\n _ensureSlotData() {\n this._pendingSlots = this._pendingSlots || [];\n this._slotList = this._slotList || [];\n this._slotMap = this._slotMap || {};\n }\n\n _addSlots(slots) {\n this._ensureSlotData();\n this._pendingSlots.push(...slots);\n }\n\n _validateSlots() {\n if (this._pendingSlots && this._pendingSlots.length) {\n this._mapSlots(this._pendingSlots);\n this._pendingSlots = [];\n }\n }\n\n /**\n * Adds the given slots. Slots are maintained in an dom-ordered list.\n * In addition a map of name to slot is updated.\n */\n _mapSlots(slots) {\n let slotNamesToSort;\n for (let i=0; i < slots.length; i++) {\n let slot = slots[i];\n // ensure insertionPoints's and their parents have logical dom info.\n // save logical tree info\n // a. for shadyRoot\n // b. for insertion points (fallback)\n // c. for parents of insertion points\n recordChildNodes(slot);\n recordChildNodes(slot.parentNode);\n let name = this._nameForSlot(slot);\n if (this._slotMap[name]) {\n slotNamesToSort = slotNamesToSort || {};\n slotNamesToSort[name] = true;\n this._slotMap[name].push(slot);\n } else {\n this._slotMap[name] = [slot];\n }\n this._slotList.push(slot);\n }\n if (slotNamesToSort) {\n for (let n in slotNamesToSort) {\n this._slotMap[n] = this._sortSlots(this._slotMap[n]);\n }\n }\n }\n\n _nameForSlot(slot) {\n const name = slot['name'] || slot.getAttribute('name') || CATCHALL_NAME;\n slot.__slotName = name;\n return name;\n }\n\n /**\n * Slots are kept in an ordered list. Slots with the same name\n * are sorted here by tree order.\n */\n _sortSlots(slots) {\n // NOTE: Cannot use `compareDocumentPosition` because it's not polyfilled,\n // but the code here could be used to polyfill the preceeding/following info\n // in `compareDocumentPosition`.\n return slots.sort((a, b) => {\n let listA = ancestorList(a);\n let listB = ancestorList(b);\n for (var i=0; i < listA.length; i++) {\n let nA = listA[i];\n let nB = listB[i];\n if (nA !== nB) {\n let c$ = Array.from(nA.parentNode.childNodes);\n return c$.indexOf(nA) - c$.indexOf(nB);\n }\n }\n });\n }\n\n /**\n * Removes from tracked slot data any slots contained within `container` and\n * then updates the tracked data (_slotList and _slotMap).\n * Any removed slots also have their `assignedNodes` removed from comopsed dom.\n */\n _removeContainedSlots(container) {\n if (!this._slotList) {\n return;\n }\n this._validateSlots();\n let didRemove;\n const map = this._slotMap;\n for (let n in map) {\n let slots = map[n];\n for (let i=0; i < slots.length; i++) {\n let slot = slots[i];\n if (utils.contains(container, slot)) {\n slots.splice(i, 1);\n const x = this._slotList.indexOf(slot);\n if (x >= 0) {\n this._slotList.splice(x, 1);\n }\n i--;\n this._removeFlattenedNodes(slot);\n didRemove = true;\n }\n }\n }\n return didRemove;\n }\n\n _updateSlotName(slot) {\n if (!this._slotList) {\n return;\n }\n const oldName = slot.__slotName;\n const name = this._nameForSlot(slot);\n if (name === oldName) {\n return;\n }\n // remove from existing tracking\n let slots = this._slotMap[oldName];\n const i = slots.indexOf(slot);\n if (i >= 0) {\n slots.splice(i, 1);\n }\n // add to new location and sort if nedessary\n let list = this._slotMap[name] || (this._slotMap[name] = []);\n list.push(slot);\n if (list.length > 1) {\n this._slotMap[name] = this._sortSlots(list);\n }\n }\n\n _removeFlattenedNodes(slot) {\n const data = shadyDataForNode(slot);\n let n$ = data.flattenedNodes;\n if (n$) {\n for (let i=0; i<n$.length; i++) {\n let node = n$[i];\n let parent = parentNode(node);\n if (parent) {\n removeChild.call(parent, node);\n }\n }\n }\n data.flattenedNodes = [];\n data.assignedNodes = [];\n }\n\n _hasInsertionPoint() {\n this._validateSlots();\n return Boolean(this._slotList && this._slotList.length);\n }\n}\n\n/**\n Implements a pared down version of ShadowDOM's scoping, which is easy to\n polyfill across browsers.\n*/\nexport function attachShadow(host, options) {\n if (!host) {\n throw 'Must provide a host.';\n }\n if (!options) {\n throw 'Not enough arguments.'\n }\n return new ShadyRoot(ShadyRootConstructionToken, host, options);\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\nimport {flush} from './flush.js';\nimport {dispatchEvent, querySelectorAll} from './native-methods.js';\nimport * as mutation from './logical-mutation.js';\nimport {ActiveElementAccessor, ShadowRootAccessor, patchAccessors, patchShadowRootAccessors, IsConnectedAccessor} from './patch-accessors.js';\nimport {addEventListener, removeEventListener} from './patch-events.js';\nimport {attachShadow, ShadyRoot} from './attach-shadow.js';\nimport {shadyDataForNode} from './shady-data.js';\n\nfunction getAssignedSlot(node) {\n mutation.renderRootNode(node);\n const nodeData = shadyDataForNode(node);\n return nodeData && nodeData.assignedSlot || null;\n}\n\nlet windowMixin = {\n\n // NOTE: ensure these methods are bound to `window` so that `this` is correct\n // when called directly from global context without a receiver; e.g.\n // `addEventListener(...)`.\n addEventListener: addEventListener.bind(window),\n\n removeEventListener: removeEventListener.bind(window)\n\n};\n\nlet nodeMixin = {\n\n addEventListener: addEventListener,\n\n removeEventListener: removeEventListener,\n\n appendChild(node) {\n return mutation.insertBefore(this, node);\n },\n\n insertBefore(node, ref_node) {\n return mutation.insertBefore(this, node, ref_node);\n },\n\n removeChild(node) {\n return mutation.removeChild(this, node);\n },\n\n /**\n * @this {Node}\n */\n replaceChild(node, ref_node) {\n mutation.insertBefore(this, node, ref_node);\n mutation.removeChild(this, ref_node);\n return node;\n },\n\n /**\n * @this {Node}\n */\n cloneNode(deep) {\n return mutation.cloneNode(this, deep);\n },\n\n /**\n * @this {Node}\n */\n getRootNode(options) {\n return mutation.getRootNode(this, options);\n },\n\n contains(node) {\n return utils.contains(this, node);\n },\n\n /**\n * @this {Node}\n */\n dispatchEvent(event) {\n flush();\n return dispatchEvent.call(this, event);\n }\n\n};\n\n// NOTE: we can do this regardless of the browser supporting native accessors\n// since this is always \"new\" in that case.\nObject.defineProperties(nodeMixin, IsConnectedAccessor);\n\n// NOTE: For some reason 'Text' redefines 'assignedSlot'\nlet textMixin = {\n /**\n * @this {Text}\n */\n get assignedSlot() {\n return getAssignedSlot(this);\n }\n};\n\nlet fragmentMixin = {\n\n // TODO(sorvell): consider doing native QSA and filtering results.\n /**\n * @this {DocumentFragment}\n */\n querySelector(selector) {\n // match selector and halt on first result.\n let result = mutation.query(this, function(n) {\n return utils.matchesSelector(n, selector);\n }, function(n) {\n return Boolean(n);\n })[0];\n return result || null;\n },\n\n /**\n * @this {DocumentFragment}\n */\n // TODO(sorvell): `useNative` option relies on native querySelectorAll and\n // misses distributed nodes, see\n // https://github.com/webcomponents/shadydom/pull/210#issuecomment-361435503\n querySelectorAll(selector, useNative) {\n if (useNative) {\n const o = Array.prototype.slice.call(querySelectorAll(this, selector));\n const root = this.getRootNode();\n return o.filter(e => e.getRootNode() == root);\n }\n return mutation.query(this, function(n) {\n return utils.matchesSelector(n, selector);\n });\n }\n\n};\n\nlet slotMixin = {\n\n /**\n * @this {HTMLSlotElement}\n */\n assignedNodes(options) {\n if (this.localName === 'slot') {\n mutation.renderRootNode(this);\n const nodeData = shadyDataForNode(this);\n return nodeData ?\n ((options && options.flatten ? nodeData.flattenedNodes :\n nodeData.assignedNodes) || []) :\n [];\n }\n }\n\n};\n\nlet elementMixin = utils.extendAll({\n\n /**\n * @this {HTMLElement}\n */\n setAttribute(name, value) {\n mutation.setAttribute(this, name, value);\n },\n\n /**\n * @this {HTMLElement}\n */\n removeAttribute(name) {\n mutation.removeAttribute(this, name);\n },\n\n /**\n * @this {HTMLElement}\n */\n attachShadow(options) {\n return attachShadow(this, options);\n },\n\n /**\n * @this {HTMLElement}\n */\n get slot() {\n return this.getAttribute('slot');\n },\n\n /**\n * @this {HTMLElement}\n */\n set slot(value) {\n mutation.setAttribute(this, 'slot', value);\n },\n\n /**\n * @this {HTMLElement}\n */\n get assignedSlot() {\n return getAssignedSlot(this);\n }\n\n}, fragmentMixin, slotMixin);\n\nObject.defineProperties(elementMixin, ShadowRootAccessor);\n\nlet documentMixin = utils.extendAll({\n /**\n * @this {Document}\n */\n importNode(node, deep) {\n return mutation.importNode(node, deep);\n },\n\n /**\n * @this {Document}\n */\n getElementById(id) {\n let result = mutation.query(this, function(n) {\n return n.id == id;\n }, function(n) {\n return Boolean(n);\n })[0];\n return result || null;\n }\n\n}, fragmentMixin);\n\nObject.defineProperties(documentMixin, {\n '_activeElement': ActiveElementAccessor.activeElement\n});\n\nlet nativeBlur = HTMLElement.prototype.blur;\n\nlet htmlElementMixin = utils.extendAll({\n /**\n * @this {HTMLElement}\n */\n blur() {\n const nodeData = shadyDataForNode(this);\n let root = nodeData && nodeData.root;\n let shadowActive = root && root.activeElement;\n if (shadowActive) {\n shadowActive.blur();\n } else {\n nativeBlur.call(this);\n }\n }\n});\n\nconst shadowRootMixin = {\n addEventListener(type, fn, optionsOrCapture) {\n if (typeof optionsOrCapture !== 'object') {\n optionsOrCapture = {\n capture: Boolean(optionsOrCapture)\n }\n }\n optionsOrCapture.__shadyTarget = this;\n this.host.addEventListener(type, fn, optionsOrCapture);\n },\n\n removeEventListener(type, fn, optionsOrCapture) {\n if (typeof optionsOrCapture !== 'object') {\n optionsOrCapture = {\n capture: Boolean(optionsOrCapture)\n }\n }\n optionsOrCapture.__shadyTarget = this;\n this.host.removeEventListener(type, fn, optionsOrCapture);\n },\n\n getElementById(id) {\n let result = mutation.query(this, function(n) {\n return n.id == id;\n }, function(n) {\n return Boolean(n);\n })[0];\n return result || null;\n }\n}\n\nfunction patchBuiltin(proto, obj) {\n let n$ = Object.getOwnPropertyNames(obj);\n for (let i=0; i < n$.length; i++) {\n let n = n$[i];\n let d = Object.getOwnPropertyDescriptor(obj, n);\n // NOTE: we prefer writing directly here because some browsers\n // have descriptors that are writable but not configurable (e.g.\n // `appendChild` on older browsers)\n if (d.value) {\n proto[n] = d.value;\n } else {\n Object.defineProperty(proto, n, d);\n }\n }\n}\n\n// Apply patches to builtins (e.g. Element.prototype). Some of these patches\n// can be done unconditionally (mostly methods like\n// `Element.prototype.appendChild`) and some can only be done when the browser\n// has proper descriptors on the builtin prototype\n// (e.g. `Element.prototype.firstChild`)`. When descriptors are not available,\n// elements are individually patched when needed (see e.g.\n// `patchInside/OutsideElementAccessors` in `patch-accessors.js`).\nexport function patchBuiltins() {\n let nativeHTMLElement =\n (window['customElements'] && window['customElements']['nativeHTMLElement']) ||\n HTMLElement;\n // These patches can always be done, for all supported browsers.\n patchBuiltin(ShadyRoot.prototype, shadowRootMixin);\n patchBuiltin(window.Node.prototype, nodeMixin);\n patchBuiltin(window.Window.prototype, windowMixin);\n patchBuiltin(window.Text.prototype, textMixin);\n patchBuiltin(window.DocumentFragment.prototype, fragmentMixin);\n patchBuiltin(window.Element.prototype, elementMixin);\n patchBuiltin(window.Document.prototype, documentMixin);\n if (window.HTMLSlotElement) {\n patchBuiltin(window.HTMLSlotElement.prototype, slotMixin);\n }\n patchBuiltin(nativeHTMLElement.prototype, htmlElementMixin);\n // These patches can *only* be done\n // on browsers that have proper property descriptors on builtin prototypes.\n // This includes: IE11, Edge, Chrome >= 4?; Safari >= 10, Firefox\n // On older browsers (Chrome <= 4?, Safari 9), a per element patching\n // strategy is used for patching accessors.\n if (utils.settings.hasDescriptors) {\n patchAccessors(window.Node.prototype);\n patchAccessors(window.Text.prototype);\n patchAccessors(window.DocumentFragment.prototype);\n patchAccessors(window.Element.prototype);\n patchAccessors(nativeHTMLElement.prototype);\n patchAccessors(window.Document.prototype);\n if (window.HTMLSlotElement) {\n patchAccessors(window.HTMLSlotElement.prototype);\n }\n }\n patchShadowRootAccessors(ShadyRoot.prototype);\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport {patchInsideElementAccessors, patchOutsideElementAccessors} from './patch-accessors.js';\nimport {accessors} from './native-tree.js';\nimport {ensureShadyDataForNode, shadyDataForNode} from './shady-data.js';\n\nconst {childNodes} = accessors;\n\nexport function recordInsertBefore(node, container, ref_node) {\n patchInsideElementAccessors(container);\n const containerData = ensureShadyDataForNode(container);\n if (containerData.firstChild !== undefined) {\n containerData.childNodes = null;\n }\n // handle document fragments\n if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n let c$ = node.childNodes;\n for (let i=0; i < c$.length; i++) {\n linkNode(c$[i], container, ref_node);\n }\n // cleanup logical dom in doc fragment.\n const nodeData = ensureShadyDataForNode(node);\n let resetTo = (nodeData.firstChild !== undefined) ? null : undefined;\n nodeData.firstChild = nodeData.lastChild = resetTo;\n nodeData.childNodes = resetTo;\n } else {\n linkNode(node, container, ref_node);\n }\n}\n\nfunction linkNode(node, container, ref_node) {\n patchOutsideElementAccessors(node);\n ref_node = ref_node || null;\n const nodeData = ensureShadyDataForNode(node);\n const containerData = ensureShadyDataForNode(container);\n const ref_nodeData = ref_node ? ensureShadyDataForNode(ref_node) : null;\n // update ref_node.previousSibling <-> node\n nodeData.previousSibling = ref_node ? ref_nodeData.previousSibling :\n container.lastChild;\n let psd = shadyDataForNode(nodeData.previousSibling);\n if (psd) {\n psd.nextSibling = node;\n }\n // update node <-> ref_node\n let nsd = shadyDataForNode(nodeData.nextSibling = ref_node);\n if (nsd) {\n nsd.previousSibling = node;\n }\n // update node <-> container\n nodeData.parentNode = container;\n if (ref_node) {\n if (ref_node === containerData.firstChild) {\n containerData.firstChild = node;\n }\n } else {\n containerData.lastChild = node;\n if (!containerData.firstChild) {\n containerData.firstChild = node;\n }\n }\n // remove caching of childNodes\n containerData.childNodes = null;\n}\n\nexport function recordRemoveChild(node, container) {\n const nodeData = ensureShadyDataForNode(node);\n const containerData = ensureShadyDataForNode(container);\n if (node === containerData.firstChild) {\n containerData.firstChild = nodeData.nextSibling;\n }\n if (node === containerData.lastChild) {\n containerData.lastChild = nodeData.previousSibling;\n }\n let p = nodeData.previousSibling;\n let n = nodeData.nextSibling;\n if (p) {\n ensureShadyDataForNode(p).nextSibling = n;\n }\n if (n) {\n ensureShadyDataForNode(n).previousSibling = p;\n }\n // When an element is removed, logical data is no longer tracked.\n // Explicitly set `undefined` here to indicate this. This is disginguished\n // from `null` which is set if info is null.\n nodeData.parentNode = nodeData.previousSibling =\n nodeData.nextSibling = undefined;\n if (containerData.childNodes !== undefined) {\n // remove caching of childNodes\n containerData.childNodes = null;\n }\n}\n\nexport let recordChildNodes = function(node, nodes) {\n const nodeData = ensureShadyDataForNode(node);\n if (nodeData.firstChild === undefined) {\n const c$ = nodes || childNodes(node);\n nodeData.firstChild = c$[0] || null;\n nodeData.lastChild = c$[c$.length-1] || null;\n patchInsideElementAccessors(node);\n for (let i=0; i<c$.length; i++) {\n const n = c$[i];\n const sd = ensureShadyDataForNode(n);\n sd.parentNode = node;\n sd.nextSibling = c$[i+1] || null;\n sd.previousSibling = c$[i-1] || null;\n patchOutsideElementAccessors(n);\n }\n }\n}","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\nimport * as logicalTree from './logical-tree.js';\nimport * as nativeMethods from './native-methods.js';\nimport {accessors} from './native-tree.js';\nimport {ensureShadyDataForNode, shadyDataForNode} from './shady-data.js';\n\nconst {parentNode} = accessors;\n\n// Patched `insertBefore`. Note that all mutations that add nodes are routed\n// here. When a <slot> is added or a node is added to a host with a shadowRoot\n// with a slot, a standard dom `insert` call is aborted and `_asyncRender`\n// is called on the relevant shadowRoot. In all other cases, a standard dom\n// `insert` can be made, but the location and ref_node may need to be changed.\n/**\n * @param {Node} parent\n * @param {Node} node\n * @param {Node=} ref_node\n */\nexport function insertBefore(parent, node, ref_node) {\n if (node === parent) {\n throw Error(`Failed to execute 'appendChild' on 'Node': The new child element contains the parent.`);\n }\n if (ref_node) {\n const refData = shadyDataForNode(ref_node);\n const p = refData && refData.parentNode;\n if ((p !== undefined && p !== parent) ||\n (p === undefined && parentNode(ref_node) !== parent)) {\n throw Error(`Failed to execute 'insertBefore' on 'Node': The node ` +\n `before which the new node is to be inserted is not a child of this node.`);\n }\n }\n if (ref_node === node) {\n return node;\n }\n // remove from existing location\n if (node.parentNode) {\n // NOTE: avoid node.removeChild as this *can* trigger another patched\n // method (e.g. custom elements) and we want only the shady method to run.\n removeChild(node.parentNode, node);\n }\n // add to new parent\n let preventNativeInsert;\n let ownerRoot;\n let slotsAdded;\n if (!node['__noInsertionPoint']) {\n ownerRoot = utils.ownerShadyRootForNode(parent);\n slotsAdded = ownerRoot && findContainedSlots(node);\n if (slotsAdded) {\n ownerRoot._addSlots(slotsAdded);\n }\n }\n // if a slot is added, must render containing root.\n if (parent.localName === 'slot' || slotsAdded) {\n ownerRoot = ownerRoot || utils.ownerShadyRootForNode(parent);\n if (ownerRoot) {\n ownerRoot._asyncRender();\n }\n }\n if (utils.isTrackingLogicalChildNodes(parent)) {\n logicalTree.recordInsertBefore(node, parent, ref_node);\n // when inserting into a host with a shadowRoot with slot, use\n // `shadowRoot._asyncRender()` via `attach-shadow` module\n const parentData = shadyDataForNode(parent);\n if (hasShadowRootWithSlot(parent)) {\n parentData.root._asyncRender();\n preventNativeInsert = true;\n // when inserting into a host with shadowRoot with NO slot, do nothing\n // as the node should not be added to composed dome anywhere.\n } else if (parentData.root) {\n preventNativeInsert = true;\n }\n }\n if (!preventNativeInsert) {\n // if adding to a shadyRoot, add to host instead\n let container = utils.isShadyRoot(parent) ?\n /** @type {ShadowRoot} */(parent).host : parent;\n // if ref_node, get the ref_node that's actually in composed dom.\n if (ref_node) {\n ref_node = firstComposedNode(ref_node);\n nativeMethods.insertBefore.call(container, node, ref_node);\n } else {\n nativeMethods.appendChild.call(container, node);\n }\n }\n scheduleObserver(parent, node);\n return node;\n}\n\nfunction findContainedSlots(node) {\n let slots;\n if (node.localName === 'slot') {\n slots = [node];\n } else if (node.querySelectorAll) {\n slots = node.querySelectorAll('slot');\n }\n if (slots && slots.length) {\n return slots;\n }\n}\n\n/**\n * Patched `removeChild`. Note that all dom \"removals\" are routed here.\n * Removes the given `node` from the element's `children`.\n * This method also performs dom composition.\n * @param {Node} parent\n * @param {Node} node\n*/\nexport function removeChild(parent, node) {\n if (node.parentNode !== parent) {\n throw Error('The node to be removed is not a child of this node: ' +\n node);\n }\n let preventNativeRemove;\n let ownerRoot = utils.ownerShadyRootForNode(node);\n let removingInsertionPoint;\n const parentData = shadyDataForNode(parent);\n if (utils.isTrackingLogicalChildNodes(parent)) {\n logicalTree.recordRemoveChild(node, parent);\n if (hasShadowRootWithSlot(parent)) {\n parentData.root._asyncRender();\n preventNativeRemove = true;\n }\n }\n removeOwnerShadyRoot(node);\n // if removing slot, must render containing root\n if (ownerRoot) {\n let changeSlotContent = parent && parent.localName === 'slot';\n if (changeSlotContent) {\n preventNativeRemove = true;\n }\n removingInsertionPoint = ownerRoot._removeContainedSlots(node);\n if (removingInsertionPoint || changeSlotContent) {\n ownerRoot._asyncRender();\n }\n }\n if (!preventNativeRemove) {\n // if removing from a shadyRoot, remove form host instead\n let container = utils.isShadyRoot(parent) ?\n /** @type {ShadowRoot} */(parent).host :\n parent;\n // not guaranteed to physically be in container; e.g.\n // (1) if parent has a shadyRoot, element may or may not at distributed\n // location (could be undistributed)\n // (2) if parent is a slot, element may not ben in composed dom\n if (!(parentData.root || node.localName === 'slot') ||\n (container === parentNode(node))) {\n nativeMethods.removeChild.call(container, node);\n }\n }\n scheduleObserver(parent, null, node);\n return node;\n}\n\nfunction removeOwnerShadyRoot(node) {\n // optimization: only reset the tree if node is actually in a root\n if (hasCachedOwnerRoot(node)) {\n let c$ = node.childNodes;\n for (let i=0, l=c$.length, n; (i<l) && (n=c$[i]); i++) {\n removeOwnerShadyRoot(n);\n }\n }\n const nodeData = shadyDataForNode(node);\n if (nodeData) {\n nodeData.ownerShadyRoot = undefined;\n }\n}\n\nfunction hasCachedOwnerRoot(node) {\n const nodeData = shadyDataForNode(node);\n return Boolean(nodeData && nodeData.ownerShadyRoot !== undefined);\n}\n\n/**\n * Finds the first flattened node that is composed in the node's parent.\n * If the given node is a slot, then the first flattened node is returned\n * if it exists, otherwise advance to the node's nextSibling.\n * @param {Node} node within which to find first composed node\n * @returns {Node} first composed node\n */\nfunction firstComposedNode(node) {\n let composed = node;\n if (node && node.localName === 'slot') {\n const nodeData = shadyDataForNode(node);\n const flattened = nodeData && nodeData.flattenedNodes;\n composed = flattened && flattened.length ? flattened[0] :\n firstComposedNode(node.nextSibling);\n }\n return composed;\n}\n\nfunction hasShadowRootWithSlot(node) {\n const nodeData = shadyDataForNode(node);\n let root = nodeData && nodeData.root;\n return (root && root._hasInsertionPoint());\n}\n\n/**\n * Should be called whenever an attribute changes. If the `slot` attribute\n * changes, provokes rendering if necessary. If a `<slot>` element's `name`\n * attribute changes, updates the root's slot map and renders.\n * @param {Node} node\n * @param {string} name\n */\nfunction distributeAttributeChange(node, name) {\n if (name === 'slot') {\n const parent = node.parentNode;\n if (hasShadowRootWithSlot(parent)) {\n shadyDataForNode(parent).root._asyncRender();\n }\n } else if (node.localName === 'slot' && name === 'name') {\n let root = utils.ownerShadyRootForNode(node);\n if (root) {\n root._updateSlotName(node);\n root._asyncRender();\n }\n }\n}\n\n/**\n * @param {Node} node\n * @param {Node=} addedNode\n * @param {Node=} removedNode\n */\nfunction scheduleObserver(node, addedNode, removedNode) {\n const nodeData = shadyDataForNode(node);\n const observer = nodeData && nodeData.observer;\n if (observer) {\n if (addedNode) {\n observer.addedNodes.push(addedNode);\n }\n if (removedNode) {\n observer.removedNodes.push(removedNode);\n }\n observer.schedule();\n }\n}\n\n/**\n * @param {Node} node\n * @param {Object=} options\n */\nexport function getRootNode(node, options) { // eslint-disable-line no-unused-vars\n if (!node || !node.nodeType) {\n return;\n }\n const nodeData = ensureShadyDataForNode(node);\n let root = nodeData.ownerShadyRoot;\n if (root === undefined) {\n if (utils.isShadyRoot(node)) {\n root = node;\n nodeData.ownerShadyRoot = root;\n } else {\n let parent = node.parentNode;\n root = parent ? getRootNode(parent) : node;\n // memo-ize result for performance but only memo-ize\n // result if node is in the document. This avoids a problem where a root\n // can be cached while an element is inside a fragment.\n // If this happens and we cache the result, the value can become stale\n // because for perf we avoid processing the subtree of added fragments.\n if (nativeMethods.contains.call(document.documentElement, node)) {\n nodeData.ownerShadyRoot = root;\n }\n }\n\n }\n return root;\n}\n\n// NOTE: `query` is used primarily for ShadyDOM's querySelector impl,\n// but it's also generally useful to recurse through the element tree\n// and is used by Polymer's styling system.\n/**\n * @param {Node} node\n * @param {Function} matcher\n * @param {Function=} halter\n */\nexport function query(node, matcher, halter) {\n let list = [];\n queryElements(node.childNodes, matcher,\n halter, list);\n return list;\n}\n\nfunction queryElements(elements, matcher, halter, list) {\n for (let i=0, l=elements.length, c; (i<l) && (c=elements[i]); i++) {\n if (c.nodeType === Node.ELEMENT_NODE &&\n queryElement(c, matcher, halter, list)) {\n return true;\n }\n }\n}\n\nfunction queryElement(node, matcher, halter, list) {\n let result = matcher(node);\n if (result) {\n list.push(node);\n }\n if (halter && halter(result)) {\n return result;\n }\n queryElements(node.childNodes, matcher,\n halter, list);\n}\n\nexport function renderRootNode(element) {\n var root = element.getRootNode();\n if (utils.isShadyRoot(root)) {\n root._render();\n }\n}\n\nlet scopingShim = null;\n\nexport function setAttribute(node, attr, value) {\n if (!scopingShim) {\n scopingShim = window['ShadyCSS'] && window['ShadyCSS']['ScopingShim'];\n }\n if (scopingShim && attr === 'class') {\n scopingShim['setElementClass'](node, value);\n } else {\n nativeMethods.setAttribute.call(node, attr, value);\n distributeAttributeChange(node, attr);\n }\n}\n\nexport function removeAttribute(node, attr) {\n nativeMethods.removeAttribute.call(node, attr);\n distributeAttributeChange(node, attr);\n}\n\nexport function cloneNode(node, deep) {\n if (node.localName == 'template') {\n return nativeMethods.cloneNode.call(node, deep);\n } else {\n let n = nativeMethods.cloneNode.call(node, false);\n if (deep) {\n let c$ = node.childNodes;\n for (let i=0, nc; i < c$.length; i++) {\n nc = c$[i].cloneNode(true);\n n.appendChild(nc);\n }\n }\n return n;\n }\n}\n\n// note: Though not technically correct, we fast path `importNode`\n// when called on a node not owned by the main document.\n// This allows, for example, elements that cannot\n// contain custom elements and are therefore not likely to contain shadowRoots\n// to cloned natively. This is a fairly significant performance win.\nexport function importNode(node, deep) {\n if (node.ownerDocument !== document) {\n return nativeMethods.importNode.call(document, node, deep);\n }\n let n = nativeMethods.importNode.call(document, node, false);\n if (deep) {\n let c$ = node.childNodes;\n for (let i=0, nc; i < c$.length; i++) {\n nc = importNode(c$[i], true);\n n.appendChild(nc);\n }\n }\n return n;\n}",null,"/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\nimport * as nativeMethods from './native-methods.js';\nimport {shadyDataForNode} from './shady-data.js';\n\n/*\nMake this name unique so it is unlikely to conflict with properties on objects passed to `addEventListener`\nhttps://github.com/webcomponents/shadydom/issues/173\n*/\nconst /** string */ eventWrappersName = `__eventWrappers${Date.now()}`;\n\n// https://github.com/w3c/webcomponents/issues/513#issuecomment-224183937\nlet alwaysComposed = {\n 'blur': true,\n 'focus': true,\n 'focusin': true,\n 'focusout': true,\n 'click': true,\n 'dblclick': true,\n 'mousedown': true,\n 'mouseenter': true,\n 'mouseleave': true,\n 'mousemove': true,\n 'mouseout': true,\n 'mouseover': true,\n 'mouseup': true,\n 'wheel': true,\n 'beforeinput': true,\n 'input': true,\n 'keydown': true,\n 'keyup': true,\n 'compositionstart': true,\n 'compositionupdate': true,\n 'compositionend': true,\n 'touchstart': true,\n 'touchend': true,\n 'touchmove': true,\n 'touchcancel': true,\n 'pointerover': true,\n 'pointerenter': true,\n 'pointerdown': true,\n 'pointermove': true,\n 'pointerup': true,\n 'pointercancel': true,\n 'pointerout': true,\n 'pointerleave': true,\n 'gotpointercapture': true,\n 'lostpointercapture': true,\n 'dragstart': true,\n 'drag': true,\n 'dragenter': true,\n 'dragleave': true,\n 'dragover': true,\n 'drop': true,\n 'dragend': true,\n 'DOMActivate': true,\n 'DOMFocusIn': true,\n 'DOMFocusOut': true,\n 'keypress': true\n};\n\nfunction pathComposer(startNode, composed) {\n let composedPath = [];\n let current = startNode;\n let startRoot = startNode === window ? window : startNode.getRootNode();\n while (current) {\n composedPath.push(current);\n if (current.assignedSlot) {\n current = current.assignedSlot;\n } else if (current.nodeType === Node.DOCUMENT_FRAGMENT_NODE && current.host && (composed || current !== startRoot)) {\n current = current.host;\n } else {\n current = current.parentNode;\n }\n }\n // event composedPath includes window when startNode's ownerRoot is document\n if (composedPath[composedPath.length - 1] === document) {\n composedPath.push(window);\n }\n return composedPath;\n}\n\nfunction retarget(refNode, path) {\n if (!utils.isShadyRoot) {\n return refNode;\n }\n // If ANCESTOR's root is not a shadow root or ANCESTOR's root is BASE's\n // shadow-including inclusive ancestor, return ANCESTOR.\n let refNodePath = pathComposer(refNode, true);\n let p$ = path;\n for (let i=0, ancestor, lastRoot, root, rootIdx; i < p$.length; i++) {\n ancestor = p$[i];\n root = ancestor === window ? window : ancestor.getRootNode();\n if (root !== lastRoot) {\n rootIdx = refNodePath.indexOf(root);\n lastRoot = root;\n }\n if (!utils.isShadyRoot(root) || rootIdx > -1) {\n return ancestor;\n }\n }\n}\n\nlet eventMixin = {\n\n /**\n * @this {Event}\n */\n get composed() {\n // isTrusted may not exist in this browser, so just check if isTrusted is explicitly false\n if (this.isTrusted !== false && this.__composed === undefined) {\n this.__composed = alwaysComposed[this.type];\n }\n return this.__composed || false;\n },\n\n /**\n * @this {Event}\n */\n composedPath() {\n if (!this.__composedPath) {\n this.__composedPath = pathComposer(this['__target'], this.composed);\n }\n return this.__composedPath;\n },\n\n /**\n * @this {Event}\n */\n get target() {\n return retarget(this.currentTarget, this.composedPath());\n },\n\n // http://w3c.github.io/webcomponents/spec/shadow/#event-relatedtarget-retargeting\n /**\n * @this {Event}\n */\n get relatedTarget() {\n if (!this.__relatedTarget) {\n return null;\n }\n if (!this.__relatedTargetComposedPath) {\n this.__relatedTargetComposedPath = pathComposer(this.__relatedTarget, true);\n }\n // find the deepest node in relatedTarget composed path that is in the same root with the currentTarget\n return retarget(this.currentTarget, this.__relatedTargetComposedPath);\n },\n /**\n * @this {Event}\n */\n stopPropagation() {\n Event.prototype.stopPropagation.call(this);\n this.__propagationStopped = true;\n },\n /**\n * @this {Event}\n */\n stopImmediatePropagation() {\n Event.prototype.stopImmediatePropagation.call(this);\n this.__immediatePropagationStopped = true;\n this.__propagationStopped = true;\n }\n\n};\n\nfunction mixinComposedFlag(Base) {\n // NOTE: avoiding use of `class` here so that transpiled output does not\n // try to do `Base.call` with a dom construtor.\n let klazz = function(type, options) {\n let event = new Base(type, options);\n event.__composed = options && Boolean(options['composed']);\n return event;\n }\n // put constructor properties on subclass\n utils.mixin(klazz, Base);\n klazz.prototype = Base.prototype;\n return klazz;\n}\n\nlet nonBubblingEventsToRetarget = {\n 'focus': true,\n 'blur': true\n};\n\n\n/**\n * Check if the event has been retargeted by comparing original `target`, and calculated `target`\n * @param {Event} event\n * @return {boolean} True if the original target and calculated target are the same\n */\nfunction hasRetargeted(event) {\n return event['__target'] !== event.target || event.__relatedTarget !== event.relatedTarget;\n}\n\n/**\n *\n * @param {Event} event\n * @param {Node} node\n * @param {string} phase\n */\nfunction fireHandlers(event, node, phase) {\n let hs = node.__handlers && node.__handlers[event.type] &&\n node.__handlers[event.type][phase];\n if (hs) {\n for (let i = 0, fn; (fn = hs[i]); i++) {\n if (hasRetargeted(event) && event.target === event.relatedTarget) {\n return;\n }\n fn.call(node, event);\n if (event.__immediatePropagationStopped) {\n return;\n }\n }\n }\n}\n\nfunction retargetNonBubblingEvent(e) {\n let path = e.composedPath();\n let node;\n // override `currentTarget` to let patched `target` calculate correctly\n Object.defineProperty(e, 'currentTarget', {\n get: function() {\n return node;\n },\n configurable: true\n });\n for (let i = path.length - 1; i >= 0; i--) {\n node = path[i];\n // capture phase fires all capture handlers\n fireHandlers(e, node, 'capture');\n if (e.__propagationStopped) {\n return;\n }\n }\n\n // set the event phase to `AT_TARGET` as in spec\n Object.defineProperty(e, 'eventPhase', {get() { return Event.AT_TARGET }});\n\n // the event only needs to be fired when owner roots change when iterating the event path\n // keep track of the last seen owner root\n let lastFiredRoot;\n for (let i = 0; i < path.length; i++) {\n node = path[i];\n const nodeData = shadyDataForNode(node);\n const root = nodeData && nodeData.root;\n if (i === 0 || (root && root === lastFiredRoot)) {\n fireHandlers(e, node, 'bubble');\n // don't bother with window, it doesn't have `getRootNode` and will be last in the path anyway\n if (node !== window) {\n lastFiredRoot = node.getRootNode();\n }\n if (e.__propagationStopped) {\n return;\n }\n }\n }\n}\n\nfunction listenerSettingsEqual(savedListener, node, type, capture, once, passive) {\n let {\n node: savedNode,\n type: savedType,\n capture: savedCapture,\n once: savedOnce,\n passive: savedPassive\n } = savedListener;\n return node === savedNode &&\n type === savedType &&\n capture === savedCapture &&\n once === savedOnce &&\n passive === savedPassive;\n}\n\nexport function findListener(wrappers, node, type, capture, once, passive) {\n for (let i = 0; i < wrappers.length; i++) {\n if (listenerSettingsEqual(wrappers[i], node, type, capture, once, passive)) {\n return i;\n }\n }\n return -1;\n}\n\n/**\n * Firefox can throw on accessing eventWrappers inside of `removeEventListener` during a selenium run\n * Try/Catch accessing eventWrappers to work around\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1353074\n */\nfunction getEventWrappers(eventLike) {\n let wrappers = null;\n try {\n wrappers = eventLike[eventWrappersName];\n } catch (e) {} // eslint-disable-line no-empty\n return wrappers;\n}\n\n/**\n * @this {Event}\n */\nexport function addEventListener(type, fnOrObj, optionsOrCapture) {\n if (!fnOrObj) {\n return;\n }\n\n const handlerType = typeof fnOrObj;\n\n // bail if `fnOrObj` is not a function, not an object\n if (handlerType !== 'function' && handlerType !== 'object') {\n return;\n }\n\n // bail if `fnOrObj` is an object without a `handleEvent` method\n if (handlerType === 'object' && (!fnOrObj.handleEvent || typeof fnOrObj.handleEvent !== 'function')) {\n return;\n }\n\n // The callback `fn` might be used for multiple nodes/events. Since we generate\n // a wrapper function, we need to keep track of it when we remove the listener.\n // It's more efficient to store the node/type/options information as Array in\n // `fn` itself rather than the node (we assume that the same callback is used\n // for few nodes at most, whereas a node will likely have many event listeners).\n // NOTE(valdrin) invoking external functions is costly, inline has better perf.\n let capture, once, passive;\n if (optionsOrCapture && typeof optionsOrCapture === 'object') {\n capture = Boolean(optionsOrCapture.capture);\n once = Boolean(optionsOrCapture.once);\n passive = Boolean(optionsOrCapture.passive);\n } else {\n capture = Boolean(optionsOrCapture);\n once = false;\n passive = false;\n }\n // hack to let ShadyRoots have event listeners\n // event listener will be on host, but `currentTarget`\n // will be set to shadyroot for event listener\n let target = (optionsOrCapture && optionsOrCapture.__shadyTarget) || this;\n\n let wrappers = fnOrObj[eventWrappersName];\n if (wrappers) {\n // Stop if the wrapper function has already been created.\n if (findListener(wrappers, target, type, capture, once, passive) > -1) {\n return;\n }\n } else {\n fnOrObj[eventWrappersName] = [];\n }\n\n /**\n * @this {HTMLElement}\n * @param {Event} e\n */\n const wrapperFn = function(e) {\n // Support `once` option.\n if (once) {\n this.removeEventListener(type, fnOrObj, optionsOrCapture);\n }\n if (!e['__target']) {\n patchEvent(e);\n }\n let lastCurrentTargetDesc;\n if (target !== this) {\n // replace `currentTarget` to make `target` and `relatedTarget` correct for inside the shadowroot\n lastCurrentTargetDesc = Object.getOwnPropertyDescriptor(e, 'currentTarget');\n Object.defineProperty(e, 'currentTarget', {get() { return target }, configurable: true});\n }\n // There are two critera that should stop events from firing on this node\n // 1. the event is not composed and the current node is not in the same root as the target\n // 2. when bubbling, if after retargeting, relatedTarget and target point to the same node\n if (e.composed || e.composedPath().indexOf(target) > -1) {\n if (hasRetargeted(e) && e.target === e.relatedTarget) {\n if (e.eventPhase === Event.BUBBLING_PHASE) {\n e.stopImmediatePropagation();\n }\n return;\n }\n // prevent non-bubbling events from triggering bubbling handlers on shadowroot, but only if not in capture phase\n if (e.eventPhase !== Event.CAPTURING_PHASE && !e.bubbles && e.target !== target && !(target instanceof Window)) {\n return;\n }\n let ret = handlerType === 'function' ?\n fnOrObj.call(target, e) :\n (fnOrObj.handleEvent && fnOrObj.handleEvent(e));\n if (target !== this) {\n // replace the \"correct\" `currentTarget`\n if (lastCurrentTargetDesc) {\n Object.defineProperty(e, 'currentTarget', lastCurrentTargetDesc);\n lastCurrentTargetDesc = null;\n } else {\n delete e['currentTarget'];\n }\n }\n return ret;\n }\n };\n // Store the wrapper information.\n fnOrObj[eventWrappersName].push({\n // note: use target here which is either a shadowRoot\n // (when the host element is proxy'ing the event) or this element\n node: target,\n type: type,\n capture: capture,\n once: once,\n passive: passive,\n wrapperFn: wrapperFn\n });\n\n if (nonBubblingEventsToRetarget[type]) {\n this.__handlers = this.__handlers || {};\n this.__handlers[type] = this.__handlers[type] ||\n {'capture': [], 'bubble': []};\n this.__handlers[type][capture ? 'capture' : 'bubble'].push(wrapperFn);\n } else {\n let ael = this instanceof Window ? nativeMethods.windowAddEventListener :\n nativeMethods.addEventListener;\n ael.call(this, type, wrapperFn, optionsOrCapture);\n }\n}\n\n/**\n * @this {Event}\n */\nexport function removeEventListener(type, fnOrObj, optionsOrCapture) {\n if (!fnOrObj) {\n return;\n }\n\n // NOTE(valdrin) invoking external functions is costly, inline has better perf.\n let capture, once, passive;\n if (optionsOrCapture && typeof optionsOrCapture === 'object') {\n capture = Boolean(optionsOrCapture.capture);\n once = Boolean(optionsOrCapture.once);\n passive = Boolean(optionsOrCapture.passive);\n } else {\n capture = Boolean(optionsOrCapture);\n once = false;\n passive = false;\n }\n let target = (optionsOrCapture && optionsOrCapture.__shadyTarget) || this;\n // Search the wrapped function.\n let wrapperFn = undefined;\n let wrappers = getEventWrappers(fnOrObj);\n if (wrappers) {\n let idx = findListener(wrappers, target, type, capture, once, passive);\n if (idx > -1) {\n wrapperFn = wrappers.splice(idx, 1)[0].wrapperFn;\n // Cleanup.\n if (!wrappers.length) {\n fnOrObj[eventWrappersName] = undefined;\n }\n }\n }\n let rel = this instanceof Window ? nativeMethods.windowRemoveEventListener :\n nativeMethods.removeEventListener;\n rel.call(this, type, wrapperFn || fnOrObj, optionsOrCapture);\n if (wrapperFn && nonBubblingEventsToRetarget[type] &&\n this.__handlers && this.__handlers[type]) {\n const arr = this.__handlers[type][capture ? 'capture' : 'bubble'];\n const idx = arr.indexOf(wrapperFn);\n if (idx > -1) {\n arr.splice(idx, 1);\n }\n }\n}\n\nfunction activateFocusEventOverrides() {\n for (let ev in nonBubblingEventsToRetarget) {\n window.addEventListener(ev, function(e) {\n if (!e['__target']) {\n patchEvent(e);\n retargetNonBubblingEvent(e);\n }\n }, true);\n }\n}\n\nfunction patchEvent(event) {\n event['__target'] = event.target;\n event.__relatedTarget = event.relatedTarget;\n // patch event prototype if we can\n if (utils.settings.hasDescriptors) {\n utils.patchPrototype(event, eventMixin);\n // and fallback to patching instance\n } else {\n utils.extend(event, eventMixin);\n }\n}\n\nlet PatchedEvent = mixinComposedFlag(window.Event);\nlet PatchedCustomEvent = mixinComposedFlag(window.CustomEvent);\nlet PatchedMouseEvent = mixinComposedFlag(window.MouseEvent);\n\nexport function patchEvents() {\n window.Event = PatchedEvent;\n window.CustomEvent = PatchedCustomEvent;\n window.MouseEvent = PatchedMouseEvent;\n activateFocusEventOverrides();\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nfunction newSplice(index, removed, addedCount) {\n return {\n index: index,\n removed: removed,\n addedCount: addedCount\n };\n}\n\nconst EDIT_LEAVE = 0;\nconst EDIT_UPDATE = 1;\nconst EDIT_ADD = 2;\nconst EDIT_DELETE = 3;\n\n// Note: This function is *based* on the computation of the Levenshtein\n// \"edit\" distance. The one change is that \"updates\" are treated as two\n// edits - not one. With Array splices, an update is really a delete\n// followed by an add. By retaining this, we optimize for \"keeping\" the\n// maximum array items in the original array. For example:\n//\n// 'xxxx123' -> '123yyyy'\n//\n// With 1-edit updates, the shortest path would be just to update all seven\n// characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n// leaves the substring '123' intact.\nfunction calcEditDistances(current, currentStart, currentEnd,\n old, oldStart, oldEnd) {\n // \"Deletion\" columns\n let rowCount = oldEnd - oldStart + 1;\n let columnCount = currentEnd - currentStart + 1;\n let distances = new Array(rowCount);\n\n // \"Addition\" rows. Initialize null column.\n for (let i = 0; i < rowCount; i++) {\n distances[i] = new Array(columnCount);\n distances[i][0] = i;\n }\n\n // Initialize null row\n for (let j = 0; j < columnCount; j++)\n distances[0][j] = j;\n\n for (let i = 1; i < rowCount; i++) {\n for (let j = 1; j < columnCount; j++) {\n if (equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n distances[i][j] = distances[i - 1][j - 1];\n else {\n let north = distances[i - 1][j] + 1;\n let west = distances[i][j - 1] + 1;\n distances[i][j] = north < west ? north : west;\n }\n }\n }\n\n return distances;\n}\n\n// This starts at the final weight, and walks \"backward\" by finding\n// the minimum previous weight recursively until the origin of the weight\n// matrix.\nfunction spliceOperationsFromEditDistances(distances) {\n let i = distances.length - 1;\n let j = distances[0].length - 1;\n let current = distances[i][j];\n let edits = [];\n while (i > 0 || j > 0) {\n if (i == 0) {\n edits.push(EDIT_ADD);\n j--;\n continue;\n }\n if (j == 0) {\n edits.push(EDIT_DELETE);\n i--;\n continue;\n }\n let northWest = distances[i - 1][j - 1];\n let west = distances[i - 1][j];\n let north = distances[i][j - 1];\n\n let min;\n if (west < north)\n min = west < northWest ? west : northWest;\n else\n min = north < northWest ? north : northWest;\n\n if (min == northWest) {\n if (northWest == current) {\n edits.push(EDIT_LEAVE);\n } else {\n edits.push(EDIT_UPDATE);\n current = northWest;\n }\n i--;\n j--;\n } else if (min == west) {\n edits.push(EDIT_DELETE);\n i--;\n current = west;\n } else {\n edits.push(EDIT_ADD);\n j--;\n current = north;\n }\n }\n\n edits.reverse();\n return edits;\n}\n\n/**\n * Splice Projection functions:\n *\n * A splice map is a representation of how a previous array of items\n * was transformed into a new array of items. Conceptually it is a list of\n * tuples of\n *\n * <index, removed, addedCount>\n *\n * which are kept in ascending index order of. The tuple represents that at\n * the |index|, |removed| sequence of items were removed, and counting forward\n * from |index|, |addedCount| items were added.\n */\n\n/**\n * Lacking individual splice mutation information, the minimal set of\n * splices can be synthesized given the previous state and final state of an\n * array. The basic approach is to calculate the edit distance matrix and\n * choose the shortest path through it.\n *\n * Complexity: O(l * p)\n * l: The length of the current array\n * p: The length of the old array\n */\nfunction calcSplices(current, currentStart, currentEnd,\n old, oldStart, oldEnd) {\n let prefixCount = 0;\n let suffixCount = 0;\n let splice;\n\n let minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n if (currentStart == 0 && oldStart == 0)\n prefixCount = sharedPrefix(current, old, minLength);\n\n if (currentEnd == current.length && oldEnd == old.length)\n suffixCount = sharedSuffix(current, old, minLength - prefixCount);\n\n currentStart += prefixCount;\n oldStart += prefixCount;\n currentEnd -= suffixCount;\n oldEnd -= suffixCount;\n\n if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n return [];\n\n if (currentStart == currentEnd) {\n splice = newSplice(currentStart, [], 0);\n while (oldStart < oldEnd)\n splice.removed.push(old[oldStart++]);\n\n return [ splice ];\n } else if (oldStart == oldEnd)\n return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n let ops = spliceOperationsFromEditDistances(\n calcEditDistances(current, currentStart, currentEnd,\n old, oldStart, oldEnd));\n\n splice = undefined;\n let splices = [];\n let index = currentStart;\n let oldIndex = oldStart;\n for (let i = 0; i < ops.length; i++) {\n switch(ops[i]) {\n case EDIT_LEAVE:\n if (splice) {\n splices.push(splice);\n splice = undefined;\n }\n\n index++;\n oldIndex++;\n break;\n case EDIT_UPDATE:\n if (!splice)\n splice = newSplice(index, [], 0);\n\n splice.addedCount++;\n index++;\n\n splice.removed.push(old[oldIndex]);\n oldIndex++;\n break;\n case EDIT_ADD:\n if (!splice)\n splice = newSplice(index, [], 0);\n\n splice.addedCount++;\n index++;\n break;\n case EDIT_DELETE:\n if (!splice)\n splice = newSplice(index, [], 0);\n\n splice.removed.push(old[oldIndex]);\n oldIndex++;\n break;\n }\n }\n\n if (splice) {\n splices.push(splice);\n }\n return splices;\n}\n\nfunction sharedPrefix(current, old, searchLength) {\n for (let i = 0; i < searchLength; i++)\n if (!equals(current[i], old[i]))\n return i;\n return searchLength;\n}\n\nfunction sharedSuffix(current, old, searchLength) {\n let index1 = current.length;\n let index2 = old.length;\n let count = 0;\n while (count < searchLength && equals(current[--index1], old[--index2]))\n count++;\n\n return count;\n}\n\nfunction equals(currentValue, previousValue) {\n return currentValue === previousValue;\n}\n\nexport function calculateSplices(current, previous) {\n return calcSplices(current, 0, current.length, previous, 0,\n previous.length);\n}\n\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/**\n * Patches elements that interacts with ShadyDOM\n * such that tree traversal and mutation apis act like they would under\n * ShadowDOM.\n *\n * This import enables seemless interaction with ShadyDOM powered\n * custom elements, enabling better interoperation with 3rd party code,\n * libraries, and frameworks that use DOM tree manipulation apis.\n */\n\nimport * as utils from './utils.js';\nimport {flush, enqueue} from './flush.js';\nimport {observeChildren, unobserveChildren, filterMutations} from './observe-changes.js';\nimport * as nativeMethods from './native-methods.js';\nimport {accessors as nativeTree} from './native-tree.js';\nimport {patchBuiltins} from './patch-builtins.js';\nimport {patchInsideElementAccessors, patchOutsideElementAccessors} from './patch-accessors.js';\nimport {patchEvents} from './patch-events.js';\nimport {ShadyRoot} from './attach-shadow.js';\n\nif (utils.settings.inUse) {\n let ShadyDOM = {\n // TODO(sorvell): remove when Polymer does not depend on this.\n 'inUse': utils.settings.inUse,\n // NOTE: old browsers without prototype accessors (very old Chrome\n // and Safari) need manually patched accessors to properly set\n // `innerHTML` and `textContent` when an element is:\n // (1) inside a shadowRoot\n // (2) does not have special (slot) children itself\n // (3) and setting the property needs to provoke distribution (because\n // a nested slot is added/removed)\n 'patch': (node) => {\n patchInsideElementAccessors(node);\n patchOutsideElementAccessors(node);\n return node;\n },\n 'isShadyRoot': utils.isShadyRoot,\n 'enqueue': enqueue,\n 'flush': flush,\n 'settings': utils.settings,\n 'filterMutations': filterMutations,\n 'observeChildren': observeChildren,\n 'unobserveChildren': unobserveChildren,\n 'nativeMethods': nativeMethods,\n 'nativeTree': nativeTree\n };\n\n window['ShadyDOM'] = ShadyDOM;\n\n // Apply patches to events...\n patchEvents();\n // Apply patches to builtins (e.g. Element.prototype) where applicable.\n patchBuiltins();\n\n window.ShadowRoot = ShadyRoot;\n}","const reservedTagList = new Set([\n 'annotation-xml',\n 'color-profile',\n 'font-face',\n 'font-face-src',\n 'font-face-uri',\n 'font-face-format',\n 'font-face-name',\n 'missing-glyph',\n]);\n\n/**\n * @param {string} localName\n * @returns {boolean}\n */\nexport function isValidCustomElementName(localName) {\n const reserved = reservedTagList.has(localName);\n const validForm = /^[a-z][.0-9_a-z]*-[\\-.0-9_a-z]*$/.test(localName);\n return !reserved && validForm;\n}\n\n/**\n * @private\n * @param {!Node} node\n * @return {boolean}\n */\nexport function isConnected(node) {\n // Use `Node#isConnected`, if defined.\n const nativeValue = node.isConnected;\n if (nativeValue !== undefined) {\n return nativeValue;\n }\n\n /** @type {?Node|undefined} */\n let current = node;\n while (current && !(current.__CE_isImportDocument || current instanceof Document)) {\n current = current.parentNode || (window.ShadowRoot && current instanceof ShadowRoot ? current.host : undefined);\n }\n return !!(current && (current.__CE_isImportDocument || current instanceof Document));\n}\n\n/**\n * @param {!Node} root\n * @param {!Node} start\n * @return {?Node}\n */\nfunction nextSiblingOrAncestorSibling(root, start) {\n let node = start;\n while (node && node !== root && !node.nextSibling) {\n node = node.parentNode;\n }\n return (!node || node === root) ? null : node.nextSibling;\n}\n\n/**\n * @param {!Node} root\n * @param {!Node} start\n * @return {?Node}\n */\nfunction nextNode(root, start) {\n return start.firstChild ? start.firstChild : nextSiblingOrAncestorSibling(root, start);\n}\n\n/**\n * @param {!Node} root\n * @param {!function(!Element)} callback\n * @param {!Set<Node>=} visitedImports\n */\nexport function walkDeepDescendantElements(root, callback, visitedImports = new Set()) {\n let node = root;\n while (node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = /** @type {!Element} */(node);\n\n callback(element);\n\n const localName = element.localName;\n if (localName === 'link' && element.getAttribute('rel') === 'import') {\n // If this import (polyfilled or not) has it's root node available,\n // walk it.\n const importNode = /** @type {!Node} */ (element.import);\n if (importNode instanceof Node && !visitedImports.has(importNode)) {\n // Prevent multiple walks of the same import root.\n visitedImports.add(importNode);\n\n for (let child = importNode.firstChild; child; child = child.nextSibling) {\n walkDeepDescendantElements(child, callback, visitedImports);\n }\n }\n\n // Ignore descendants of import links to prevent attempting to walk the\n // elements created by the HTML Imports polyfill that we just walked\n // above.\n node = nextSiblingOrAncestorSibling(root, element);\n continue;\n } else if (localName === 'template') {\n // Ignore descendants of templates. There shouldn't be any descendants\n // because they will be moved into `.content` during construction in\n // browsers that support template but, in case they exist and are still\n // waiting to be moved by a polyfill, they will be ignored.\n node = nextSiblingOrAncestorSibling(root, element);\n continue;\n }\n\n // Walk shadow roots.\n const shadowRoot = element.__CE_shadowRoot;\n if (shadowRoot) {\n for (let child = shadowRoot.firstChild; child; child = child.nextSibling) {\n walkDeepDescendantElements(child, callback, visitedImports);\n }\n }\n }\n\n node = nextNode(root, node);\n }\n}\n\n/**\n * Used to suppress Closure's \"Modifying the prototype is only allowed if the\n * constructor is in the same scope\" warning without using\n * `@suppress {newCheckTypes, duplicate}` because `newCheckTypes` is too broad.\n *\n * @param {!Object} destination\n * @param {string} name\n * @param {*} value\n */\nexport function setPropertyUnchecked(destination, name, value) {\n destination[name] = value;\n}\n","import * as Utilities from './Utilities.js';\nimport CEState from './CustomElementState.js';\n\nexport default class CustomElementInternals {\n constructor() {\n /** @type {!Map<string, !CustomElementDefinition>} */\n this._localNameToDefinition = new Map();\n\n /** @type {!Map<!Function, !CustomElementDefinition>} */\n this._constructorToDefinition = new Map();\n\n /** @type {!Array<!function(!Node)>} */\n this._patches = [];\n\n /** @type {boolean} */\n this._hasPatches = false;\n }\n\n /**\n * @param {string} localName\n * @param {!CustomElementDefinition} definition\n */\n setDefinition(localName, definition) {\n this._localNameToDefinition.set(localName, definition);\n this._constructorToDefinition.set(definition.constructor, definition);\n }\n\n /**\n * @param {string} localName\n * @return {!CustomElementDefinition|undefined}\n */\n localNameToDefinition(localName) {\n return this._localNameToDefinition.get(localName);\n }\n\n /**\n * @param {!Function} constructor\n * @return {!CustomElementDefinition|undefined}\n */\n constructorToDefinition(constructor) {\n return this._constructorToDefinition.get(constructor);\n }\n\n /**\n * @param {!function(!Node)} listener\n */\n addPatch(listener) {\n this._hasPatches = true;\n this._patches.push(listener);\n }\n\n /**\n * @param {!Node} node\n */\n patchTree(node) {\n if (!this._hasPatches) return;\n\n Utilities.walkDeepDescendantElements(node, element => this.patch(element));\n }\n\n /**\n * @param {!Node} node\n */\n patch(node) {\n if (!this._hasPatches) return;\n\n if (node.__CE_patched) return;\n node.__CE_patched = true;\n\n for (let i = 0; i < this._patches.length; i++) {\n this._patches[i](node);\n }\n }\n\n /**\n * @param {!Node} root\n */\n connectTree(root) {\n const elements = [];\n\n Utilities.walkDeepDescendantElements(root, element => elements.push(element));\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n if (element.__CE_state === CEState.custom) {\n this.connectedCallback(element);\n } else {\n this.upgradeElement(element);\n }\n }\n }\n\n /**\n * @param {!Node} root\n */\n disconnectTree(root) {\n const elements = [];\n\n Utilities.walkDeepDescendantElements(root, element => elements.push(element));\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n if (element.__CE_state === CEState.custom) {\n this.disconnectedCallback(element);\n }\n }\n }\n\n /**\n * Upgrades all uncustomized custom elements at and below a root node for\n * which there is a definition. When custom element reaction callbacks are\n * assumed to be called synchronously (which, by the current DOM / HTML spec\n * definitions, they are *not*), callbacks for both elements customized\n * synchronously by the parser and elements being upgraded occur in the same\n * relative order.\n *\n * NOTE: This function, when used to simulate the construction of a tree that\n * is already created but not customized (i.e. by the parser), does *not*\n * prevent the element from reading the 'final' (true) state of the tree. For\n * example, the element, during truly synchronous parsing / construction would\n * see that it contains no children as they have not yet been inserted.\n * However, this function does not modify the tree, the element will\n * (incorrectly) have children. Additionally, self-modification restrictions\n * for custom element constructors imposed by the DOM spec are *not* enforced.\n *\n *\n * The following nested list shows the steps extending down from the HTML\n * spec's parsing section that cause elements to be synchronously created and\n * upgraded:\n *\n * The \"in body\" insertion mode:\n * https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n * - Switch on token:\n * .. other cases ..\n * -> Any other start tag\n * - [Insert an HTML element](below) for the token.\n *\n * Insert an HTML element:\n * https://html.spec.whatwg.org/multipage/syntax.html#insert-an-html-element\n * - Insert a foreign element for the token in the HTML namespace:\n * https://html.spec.whatwg.org/multipage/syntax.html#insert-a-foreign-element\n * - Create an element for a token:\n * https://html.spec.whatwg.org/multipage/syntax.html#create-an-element-for-the-token\n * - Will execute script flag is true?\n * - (Element queue pushed to the custom element reactions stack.)\n * - Create an element:\n * https://dom.spec.whatwg.org/#concept-create-element\n * - Sync CE flag is true?\n * - Constructor called.\n * - Self-modification restrictions enforced.\n * - Sync CE flag is false?\n * - (Upgrade reaction enqueued.)\n * - Attributes appended to element.\n * (`attributeChangedCallback` reactions enqueued.)\n * - Will execute script flag is true?\n * - (Element queue popped from the custom element reactions stack.\n * Reactions in the popped stack are invoked.)\n * - (Element queue pushed to the custom element reactions stack.)\n * - Insert the element:\n * https://dom.spec.whatwg.org/#concept-node-insert\n * - Shadow-including descendants are connected. During parsing\n * construction, there are no shadow-*excluding* descendants.\n * However, the constructor may have validly attached a shadow\n * tree to itself and added descendants to that shadow tree.\n * (`connectedCallback` reactions enqueued.)\n * - (Element queue popped from the custom element reactions stack.\n * Reactions in the popped stack are invoked.)\n *\n * @param {!Node} root\n * @param {{\n * visitedImports: (!Set<!Node>|undefined),\n * upgrade: (!function(!Element)|undefined),\n * }=} options\n */\n patchAndUpgradeTree(root, options = {}) {\n const visitedImports = options.visitedImports || new Set();\n const upgrade = options.upgrade || (element => this.upgradeElement(element));\n\n const elements = [];\n\n const gatherElements = element => {\n if (element.localName === 'link' && element.getAttribute('rel') === 'import') {\n // The HTML Imports polyfill sets a descendant element of the link to\n // the `import` property, specifically this is *not* a Document.\n const importNode = /** @type {?Node} */ (element.import);\n\n if (importNode instanceof Node) {\n importNode.__CE_isImportDocument = true;\n // Connected links are associated with the registry.\n importNode.__CE_hasRegistry = true;\n }\n\n if (importNode && importNode.readyState === 'complete') {\n importNode.__CE_documentLoadHandled = true;\n } else {\n // If this link's import root is not available, its contents can't be\n // walked. Wait for 'load' and walk it when it's ready.\n element.addEventListener('load', () => {\n const importNode = /** @type {!Node} */ (element.import);\n\n if (importNode.__CE_documentLoadHandled) return;\n importNode.__CE_documentLoadHandled = true;\n\n // Clone the `visitedImports` set that was populated sync during\n // the `patchAndUpgradeTree` call that caused this 'load' handler to\n // be added. Then, remove *this* link's import node so that we can\n // walk that import again, even if it was partially walked later\n // during the same `patchAndUpgradeTree` call.\n const clonedVisitedImports = new Set(visitedImports);\n clonedVisitedImports.delete(importNode);\n\n this.patchAndUpgradeTree(importNode, {visitedImports: clonedVisitedImports, upgrade});\n });\n }\n } else {\n elements.push(element);\n }\n };\n\n // `walkDeepDescendantElements` populates (and internally checks against)\n // `visitedImports` when traversing a loaded import.\n Utilities.walkDeepDescendantElements(root, gatherElements, visitedImports);\n\n if (this._hasPatches) {\n for (let i = 0; i < elements.length; i++) {\n this.patch(elements[i]);\n }\n }\n\n for (let i = 0; i < elements.length; i++) {\n upgrade(elements[i]);\n }\n }\n\n /**\n * @param {!Element} element\n */\n upgradeElement(element) {\n const currentState = element.__CE_state;\n if (currentState !== undefined) return;\n\n // Prevent elements created in documents without a browsing context from\n // upgrading.\n //\n // https://html.spec.whatwg.org/multipage/custom-elements.html#look-up-a-custom-element-definition\n // \"If document does not have a browsing context, return null.\"\n //\n // https://html.spec.whatwg.org/multipage/window-object.html#dom-document-defaultview\n // \"The defaultView IDL attribute of the Document interface, on getting,\n // must return this Document's browsing context's WindowProxy object, if\n // this Document has an associated browsing context, or null otherwise.\"\n const ownerDocument = element.ownerDocument;\n if (\n !ownerDocument.defaultView &&\n !(ownerDocument.__CE_isImportDocument && ownerDocument.__CE_hasRegistry)\n ) return;\n\n const definition = this.localNameToDefinition(element.localName);\n if (!definition) return;\n\n definition.constructionStack.push(element);\n\n const constructor = definition.constructor;\n try {\n try {\n let result = new (constructor)();\n if (result !== element) {\n throw new Error('The custom element constructor did not produce the element being upgraded.');\n }\n } finally {\n definition.constructionStack.pop();\n }\n } catch (e) {\n element.__CE_state = CEState.failed;\n throw e;\n }\n\n element.__CE_state = CEState.custom;\n element.__CE_definition = definition;\n\n if (definition.attributeChangedCallback) {\n const observedAttributes = definition.observedAttributes;\n for (let i = 0; i < observedAttributes.length; i++) {\n const name = observedAttributes[i];\n const value = element.getAttribute(name);\n if (value !== null) {\n this.attributeChangedCallback(element, name, null, value, null);\n }\n }\n }\n\n if (Utilities.isConnected(element)) {\n this.connectedCallback(element);\n }\n }\n\n /**\n * @param {!Element} element\n */\n connectedCallback(element) {\n const definition = element.__CE_definition;\n if (definition.connectedCallback) {\n definition.connectedCallback.call(element);\n }\n }\n\n /**\n * @param {!Element} element\n */\n disconnectedCallback(element) {\n const definition = element.__CE_definition;\n if (definition.disconnectedCallback) {\n definition.disconnectedCallback.call(element);\n }\n }\n\n /**\n * @param {!Element} element\n * @param {string} name\n * @param {?string} oldValue\n * @param {?string} newValue\n * @param {?string} namespace\n */\n attributeChangedCallback(element, name, oldValue, newValue, namespace) {\n const definition = element.__CE_definition;\n if (\n definition.attributeChangedCallback &&\n definition.observedAttributes.indexOf(name) > -1\n ) {\n definition.attributeChangedCallback.call(element, name, oldValue, newValue, namespace);\n }\n }\n}\n","/**\n * @enum {number}\n */\nconst CustomElementState = {\n custom: 1,\n failed: 2,\n};\n\nexport default CustomElementState;\n","import CustomElementInternals from './CustomElementInternals.js';\n\nexport default class DocumentConstructionObserver {\n constructor(internals, doc) {\n /**\n * @type {!CustomElementInternals}\n */\n this._internals = internals;\n\n /**\n * @type {!Document}\n */\n this._document = doc;\n\n /**\n * @type {MutationObserver|undefined}\n */\n this._observer = undefined;\n\n\n // Simulate tree construction for all currently accessible nodes in the\n // document.\n this._internals.patchAndUpgradeTree(this._document);\n\n if (this._document.readyState === 'loading') {\n this._observer = new MutationObserver(this._handleMutations.bind(this));\n\n // Nodes created by the parser are given to the observer *before* the next\n // task runs. Inline scripts are run in a new task. This means that the\n // observer will be able to handle the newly parsed nodes before the inline\n // script is run.\n this._observer.observe(this._document, {\n childList: true,\n subtree: true,\n });\n }\n }\n\n disconnect() {\n if (this._observer) {\n this._observer.disconnect();\n }\n }\n\n /**\n * @param {!Array<!MutationRecord>} mutations\n */\n _handleMutations(mutations) {\n // Once the document's `readyState` is 'interactive' or 'complete', all new\n // nodes created within that document will be the result of script and\n // should be handled by patching.\n const readyState = this._document.readyState;\n if (readyState === 'interactive' || readyState === 'complete') {\n this.disconnect();\n }\n\n for (let i = 0; i < mutations.length; i++) {\n const addedNodes = mutations[i].addedNodes;\n for (let j = 0; j < addedNodes.length; j++) {\n const node = addedNodes[j];\n this._internals.patchAndUpgradeTree(node);\n }\n }\n }\n}\n","import CustomElementInternals from './CustomElementInternals.js';\nimport DocumentConstructionObserver from './DocumentConstructionObserver.js';\nimport Deferred from './Deferred.js';\nimport * as Utilities from './Utilities.js';\n\n/**\n * @unrestricted\n */\nexport default class CustomElementRegistry {\n\n /**\n * @param {!CustomElementInternals} internals\n */\n constructor(internals) {\n /**\n * @private\n * @type {boolean}\n */\n this._elementDefinitionIsRunning = false;\n\n /**\n * @private\n * @type {!CustomElementInternals}\n */\n this._internals = internals;\n\n /**\n * @private\n * @type {!Map<string, !Deferred<undefined>>}\n */\n this._whenDefinedDeferred = new Map();\n\n /**\n * The default flush callback triggers the document walk synchronously.\n * @private\n * @type {!Function}\n */\n this._flushCallback = fn => fn();\n\n /**\n * @private\n * @type {boolean}\n */\n this._flushPending = false;\n\n /**\n * @private\n * @type {!Array<!CustomElementDefinition>}\n */\n this._pendingDefinitions = [];\n\n /**\n * @private\n * @type {!DocumentConstructionObserver}\n */\n this._documentConstructionObserver = new DocumentConstructionObserver(internals, document);\n }\n\n /**\n * @param {string} localName\n * @param {!Function} constructor\n */\n define(localName, constructor) {\n if (!(constructor instanceof Function)) {\n throw new TypeError('Custom element constructors must be functions.');\n }\n\n if (!Utilities.isValidCustomElementName(localName)) {\n throw new SyntaxError(`The element name '${localName}' is not valid.`);\n }\n\n if (this._internals.localNameToDefinition(localName)) {\n throw new Error(`A custom element with name '${localName}' has already been defined.`);\n }\n\n if (this._elementDefinitionIsRunning) {\n throw new Error('A custom element is already being defined.');\n }\n this._elementDefinitionIsRunning = true;\n\n let connectedCallback;\n let disconnectedCallback;\n let adoptedCallback;\n let attributeChangedCallback;\n let observedAttributes;\n try {\n /** @type {!Object} */\n const prototype = constructor.prototype;\n if (!(prototype instanceof Object)) {\n throw new TypeError('The custom element constructor\\'s prototype is not an object.');\n }\n\n function getCallback(name) {\n const callbackValue = prototype[name];\n if (callbackValue !== undefined && !(callbackValue instanceof Function)) {\n throw new Error(`The '${name}' callback must be a function.`);\n }\n return callbackValue;\n }\n\n connectedCallback = getCallback('connectedCallback');\n disconnectedCallback = getCallback('disconnectedCallback');\n adoptedCallback = getCallback('adoptedCallback');\n attributeChangedCallback = getCallback('attributeChangedCallback');\n observedAttributes = constructor['observedAttributes'] || [];\n } catch (e) {\n return;\n } finally {\n this._elementDefinitionIsRunning = false;\n }\n\n const definition = {\n localName,\n constructor,\n connectedCallback,\n disconnectedCallback,\n adoptedCallback,\n attributeChangedCallback,\n observedAttributes,\n constructionStack: [],\n };\n\n this._internals.setDefinition(localName, definition);\n this._pendingDefinitions.push(definition);\n\n // If we've already called the flush callback and it hasn't called back yet,\n // don't call it again.\n if (!this._flushPending) {\n this._flushPending = true;\n this._flushCallback(() => this._flush());\n }\n }\n\n upgrade(element) {\n this._internals.patchAndUpgradeTree(element);\n }\n\n _flush() {\n // If no new definitions were defined, don't attempt to flush. This could\n // happen if a flush callback keeps the function it is given and calls it\n // multiple times.\n if (this._flushPending === false) return;\n this._flushPending = false;\n\n const pendingDefinitions = this._pendingDefinitions;\n\n /**\n * Unupgraded elements with definitions that were defined *before* the last\n * flush, in document order.\n * @type {!Array<!Element>}\n */\n const elementsWithStableDefinitions = [];\n\n /**\n * A map from `localName`s of definitions that were defined *after* the last\n * flush to unupgraded elements matching that definition, in document order.\n * @type {!Map<string, !Array<!Element>>}\n */\n const elementsWithPendingDefinitions = new Map();\n for (let i = 0; i < pendingDefinitions.length; i++) {\n elementsWithPendingDefinitions.set(pendingDefinitions[i].localName, []);\n }\n\n this._internals.patchAndUpgradeTree(document, {\n upgrade: element => {\n // Ignore the element if it has already upgraded or failed to upgrade.\n if (element.__CE_state !== undefined) return;\n\n const localName = element.localName;\n\n // If there is an applicable pending definition for the element, add the\n // element to the list of elements to be upgraded with that definition.\n const pendingElements = elementsWithPendingDefinitions.get(localName);\n if (pendingElements) {\n pendingElements.push(element);\n // If there is *any other* applicable definition for the element, add it\n // to the list of elements with stable definitions that need to be upgraded.\n } else if (this._internals.localNameToDefinition(localName)) {\n elementsWithStableDefinitions.push(element);\n }\n },\n });\n\n // Upgrade elements with 'stable' definitions first.\n for (let i = 0; i < elementsWithStableDefinitions.length; i++) {\n this._internals.upgradeElement(elementsWithStableDefinitions[i]);\n }\n\n // Upgrade elements with 'pending' definitions in the order they were defined.\n while (pendingDefinitions.length > 0) {\n const definition = pendingDefinitions.shift();\n const localName = definition.localName;\n\n // Attempt to upgrade all applicable elements.\n const pendingUpgradableElements = elementsWithPendingDefinitions.get(definition.localName);\n for (let i = 0; i < pendingUpgradableElements.length; i++) {\n this._internals.upgradeElement(pendingUpgradableElements[i]);\n }\n\n // Resolve any promises created by `whenDefined` for the definition.\n const deferred = this._whenDefinedDeferred.get(localName);\n if (deferred) {\n deferred.resolve(undefined);\n }\n }\n }\n\n /**\n * @param {string} localName\n * @return {Function|undefined}\n */\n get(localName) {\n const definition = this._internals.localNameToDefinition(localName);\n if (definition) {\n return definition.constructor;\n }\n\n return undefined;\n }\n\n /**\n * @param {string} localName\n * @return {!Promise<undefined>}\n */\n whenDefined(localName) {\n if (!Utilities.isValidCustomElementName(localName)) {\n return Promise.reject(new SyntaxError(`'${localName}' is not a valid custom element name.`));\n }\n\n const prior = this._whenDefinedDeferred.get(localName);\n if (prior) {\n return prior.toPromise();\n }\n\n const deferred = new Deferred();\n this._whenDefinedDeferred.set(localName, deferred);\n\n const definition = this._internals.localNameToDefinition(localName);\n // Resolve immediately only if the given local name has a definition *and*\n // the full document walk to upgrade elements with that local name has\n // already happened.\n if (definition && !this._pendingDefinitions.some(d => d.localName === localName)) {\n deferred.resolve(undefined);\n }\n\n return deferred.toPromise();\n }\n\n polyfillWrapFlushCallback(outer) {\n this._documentConstructionObserver.disconnect();\n const inner = this._flushCallback;\n this._flushCallback = flush => outer(() => inner(flush));\n }\n}\n\n// Closure compiler exports.\nwindow['CustomElementRegistry'] = CustomElementRegistry;\nCustomElementRegistry.prototype['define'] = CustomElementRegistry.prototype.define;\nCustomElementRegistry.prototype['upgrade'] = CustomElementRegistry.prototype.upgrade;\nCustomElementRegistry.prototype['get'] = CustomElementRegistry.prototype.get;\nCustomElementRegistry.prototype['whenDefined'] = CustomElementRegistry.prototype.whenDefined;\nCustomElementRegistry.prototype['polyfillWrapFlushCallback'] = CustomElementRegistry.prototype.polyfillWrapFlushCallback;\n","/**\n * @template T\n */\nexport default class Deferred {\n constructor() {\n /**\n * @private\n * @type {T|undefined}\n */\n this._value = undefined;\n\n /**\n * @private\n * @type {Function|undefined}\n */\n this._resolve = undefined;\n\n /**\n * @private\n * @type {!Promise<T>}\n */\n this._promise = new Promise(resolve => {\n this._resolve = resolve;\n\n if (this._value) {\n resolve(this._value);\n }\n });\n }\n\n /**\n * @param {T} value\n */\n resolve(value) {\n if (this._value) {\n throw new Error('Already resolved.');\n }\n\n this._value = value;\n\n if (this._resolve) {\n this._resolve(value);\n }\n }\n\n /**\n * @return {!Promise<T>}\n */\n toPromise() {\n return this._promise;\n }\n}\n","export default {\n Document_createElement: window.Document.prototype.createElement,\n Document_createElementNS: window.Document.prototype.createElementNS,\n Document_importNode: window.Document.prototype.importNode,\n Document_prepend: window.Document.prototype['prepend'],\n Document_append: window.Document.prototype['append'],\n DocumentFragment_prepend: window.DocumentFragment.prototype['prepend'],\n DocumentFragment_append: window.DocumentFragment.prototype['append'],\n Node_cloneNode: window.Node.prototype.cloneNode,\n Node_appendChild: window.Node.prototype.appendChild,\n Node_insertBefore: window.Node.prototype.insertBefore,\n Node_removeChild: window.Node.prototype.removeChild,\n Node_replaceChild: window.Node.prototype.replaceChild,\n Node_textContent: Object.getOwnPropertyDescriptor(window.Node.prototype, 'textContent'),\n Element_attachShadow: window.Element.prototype['attachShadow'],\n Element_innerHTML: Object.getOwnPropertyDescriptor(window.Element.prototype, 'innerHTML'),\n Element_getAttribute: window.Element.prototype.getAttribute,\n Element_setAttribute: window.Element.prototype.setAttribute,\n Element_removeAttribute: window.Element.prototype.removeAttribute,\n Element_getAttributeNS: window.Element.prototype.getAttributeNS,\n Element_setAttributeNS: window.Element.prototype.setAttributeNS,\n Element_removeAttributeNS: window.Element.prototype.removeAttributeNS,\n Element_insertAdjacentElement: window.Element.prototype['insertAdjacentElement'],\n Element_insertAdjacentHTML: window.Element.prototype['insertAdjacentHTML'],\n Element_prepend: window.Element.prototype['prepend'],\n Element_append: window.Element.prototype['append'],\n Element_before: window.Element.prototype['before'],\n Element_after: window.Element.prototype['after'],\n Element_replaceWith: window.Element.prototype['replaceWith'],\n Element_remove: window.Element.prototype['remove'],\n HTMLElement: window.HTMLElement,\n HTMLElement_innerHTML: Object.getOwnPropertyDescriptor(window.HTMLElement.prototype, 'innerHTML'),\n HTMLElement_insertAdjacentElement: window.HTMLElement.prototype['insertAdjacentElement'],\n HTMLElement_insertAdjacentHTML: window.HTMLElement.prototype['insertAdjacentHTML'],\n};\n","/**\n * This class exists only to work around Closure's lack of a way to describe\n * singletons. It represents the 'already constructed marker' used in custom\n * element construction stacks.\n *\n * https://html.spec.whatwg.org/#concept-already-constructed-marker\n */\nclass AlreadyConstructedMarker {}\n\nexport default new AlreadyConstructedMarker();\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport CEState from '../CustomElementState.js';\nimport AlreadyConstructedMarker from '../AlreadyConstructedMarker.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n window['HTMLElement'] = (function() {\n /**\n * @type {function(new: HTMLElement): !HTMLElement}\n */\n function HTMLElement() {\n // This should really be `new.target` but `new.target` can't be emulated\n // in ES5. Assuming the user keeps the default value of the constructor's\n // prototype's `constructor` property, this is equivalent.\n /** @type {!Function} */\n const constructor = this.constructor;\n\n const definition = internals.constructorToDefinition(constructor);\n if (!definition) {\n throw new Error('The custom element being constructed was not registered with `customElements`.');\n }\n\n const constructionStack = definition.constructionStack;\n\n if (constructionStack.length === 0) {\n const element = Native.Document_createElement.call(document, definition.localName);\n Object.setPrototypeOf(element, constructor.prototype);\n element.__CE_state = CEState.custom;\n element.__CE_definition = definition;\n internals.patch(element);\n return element;\n }\n\n const lastIndex = constructionStack.length - 1;\n const element = constructionStack[lastIndex];\n if (element === AlreadyConstructedMarker) {\n throw new Error('The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.');\n }\n constructionStack[lastIndex] = AlreadyConstructedMarker;\n\n Object.setPrototypeOf(element, constructor.prototype);\n internals.patch(/** @type {!HTMLElement} */ (element));\n\n return element;\n }\n\n HTMLElement.prototype = Native.HTMLElement.prototype;\n\n return HTMLElement;\n })();\n};\n","/**\n * @license\n * Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nimport CustomElementInternals from './CustomElementInternals.js';\nimport CustomElementRegistry from './CustomElementRegistry.js';\n\nimport PatchHTMLElement from './Patch/HTMLElement.js';\nimport PatchDocument from './Patch/Document.js';\nimport PatchDocumentFragment from './Patch/DocumentFragment.js';\nimport PatchNode from './Patch/Node.js';\nimport PatchElement from './Patch/Element.js';\n\nconst priorCustomElements = window['customElements'];\n\nif (!priorCustomElements ||\n priorCustomElements['forcePolyfill'] ||\n (typeof priorCustomElements['define'] != 'function') ||\n (typeof priorCustomElements['get'] != 'function')) {\n /** @type {!CustomElementInternals} */\n const internals = new CustomElementInternals();\n\n PatchHTMLElement(internals);\n PatchDocument(internals);\n PatchDocumentFragment(internals);\n PatchNode(internals);\n PatchElement(internals);\n\n // The main document is always associated with the registry.\n document.__CE_hasRegistry = true;\n\n /** @type {!CustomElementRegistry} */\n const customElements = new CustomElementRegistry(internals);\n\n Object.defineProperty(window, 'customElements', {\n configurable: true,\n enumerable: true,\n value: customElements,\n });\n}\n","import CustomElementInternals from '../../CustomElementInternals.js';\nimport * as Utilities from '../../Utilities.js';\n\n/**\n * @typedef {{\n * prepend: !function(...(!Node|string)),\n * append: !function(...(!Node|string)),\n * }}\n */\nlet ParentNodeNativeMethods;\n\n/**\n * @param {!CustomElementInternals} internals\n * @param {!Object} destination\n * @param {!ParentNodeNativeMethods} builtIn\n */\nexport default function(internals, destination, builtIn) {\n /**\n * @param {!function(...(!Node|string))} builtInMethod\n * @return {!function(...(!Node|string))}\n */\n function appendPrependPatch(builtInMethod) {\n return function(...nodes) {\n /**\n * A copy of `nodes`, with any DocumentFragment replaced by its children.\n * @type {!Array<!Node>}\n */\n const flattenedNodes = [];\n\n /**\n * Elements in `nodes` that were connected before this call.\n * @type {!Array<!Node>}\n */\n const connectedElements = [];\n\n for (var i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if (node instanceof Element && Utilities.isConnected(node)) {\n connectedElements.push(node);\n }\n\n if (node instanceof DocumentFragment) {\n for (let child = node.firstChild; child; child = child.nextSibling) {\n flattenedNodes.push(child);\n }\n } else {\n flattenedNodes.push(node);\n }\n }\n\n builtInMethod.apply(this, nodes);\n\n for (let i = 0; i < connectedElements.length; i++) {\n internals.disconnectTree(connectedElements[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < flattenedNodes.length; i++) {\n const node = flattenedNodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n }\n\n if (builtIn.prepend !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'prepend', appendPrependPatch(builtIn.prepend));\n }\n\n if (builtIn.append !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'append', appendPrependPatch(builtIn.append));\n }\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport * as Utilities from '../Utilities.js';\n\nimport PatchParentNode from './Interface/ParentNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n Utilities.setPropertyUnchecked(Document.prototype, 'createElement',\n /**\n * @this {Document}\n * @param {string} localName\n * @return {!Element}\n */\n function(localName) {\n // Only create custom elements if this document is associated with the registry.\n if (this.__CE_hasRegistry) {\n const definition = internals.localNameToDefinition(localName);\n if (definition) {\n return new (definition.constructor)();\n }\n }\n\n const result = /** @type {!Element} */\n (Native.Document_createElement.call(this, localName));\n internals.patch(result);\n return result;\n });\n\n Utilities.setPropertyUnchecked(Document.prototype, 'importNode',\n /**\n * @this {Document}\n * @param {!Node} node\n * @param {boolean=} deep\n * @return {!Node}\n */\n function(node, deep) {\n const clone = Native.Document_importNode.call(this, node, deep);\n // Only create custom elements if this document is associated with the registry.\n if (!this.__CE_hasRegistry) {\n internals.patchTree(clone);\n } else {\n internals.patchAndUpgradeTree(clone);\n }\n return clone;\n });\n\n const NS_HTML = \"http://www.w3.org/1999/xhtml\";\n\n Utilities.setPropertyUnchecked(Document.prototype, 'createElementNS',\n /**\n * @this {Document}\n * @param {?string} namespace\n * @param {string} localName\n * @return {!Element}\n */\n function(namespace, localName) {\n // Only create custom elements if this document is associated with the registry.\n if (this.__CE_hasRegistry && (namespace === null || namespace === NS_HTML)) {\n const definition = internals.localNameToDefinition(localName);\n if (definition) {\n return new (definition.constructor)();\n }\n }\n\n const result = /** @type {!Element} */\n (Native.Document_createElementNS.call(this, namespace, localName));\n internals.patch(result);\n return result;\n });\n\n PatchParentNode(internals, Document.prototype, {\n prepend: Native.Document_prepend,\n append: Native.Document_append,\n });\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport * as Utilities from '../Utilities.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n // `Node#nodeValue` is implemented on `Attr`.\n // `Node#textContent` is implemented on `Attr`, `Element`.\n\n Utilities.setPropertyUnchecked(Node.prototype, 'insertBefore',\n /**\n * @this {Node}\n * @param {!Node} node\n * @param {?Node} refNode\n * @return {!Node}\n */\n function(node, refNode) {\n if (node instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(node.childNodes);\n const nativeResult = Native.Node_insertBefore.call(this, node, refNode);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_insertBefore.call(this, node, refNode);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n if (Utilities.isConnected(this)) {\n internals.connectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'appendChild',\n /**\n * @this {Node}\n * @param {!Node} node\n * @return {!Node}\n */\n function(node) {\n if (node instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(node.childNodes);\n const nativeResult = Native.Node_appendChild.call(this, node);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_appendChild.call(this, node);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n if (Utilities.isConnected(this)) {\n internals.connectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'cloneNode',\n /**\n * @this {Node}\n * @param {boolean=} deep\n * @return {!Node}\n */\n function(deep) {\n const clone = Native.Node_cloneNode.call(this, deep);\n // Only create custom elements if this element's owner document is\n // associated with the registry.\n if (!this.ownerDocument.__CE_hasRegistry) {\n internals.patchTree(clone);\n } else {\n internals.patchAndUpgradeTree(clone);\n }\n return clone;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'removeChild',\n /**\n * @this {Node}\n * @param {!Node} node\n * @return {!Node}\n */\n function(node) {\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_removeChild.call(this, node);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'replaceChild',\n /**\n * @this {Node}\n * @param {!Node} nodeToInsert\n * @param {!Node} nodeToRemove\n * @return {!Node}\n */\n function(nodeToInsert, nodeToRemove) {\n if (nodeToInsert instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(nodeToInsert.childNodes);\n const nativeResult = Native.Node_replaceChild.call(this, nodeToInsert, nodeToRemove);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n internals.disconnectTree(nodeToRemove);\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeToInsertWasConnected = Utilities.isConnected(nodeToInsert);\n const nativeResult = Native.Node_replaceChild.call(this, nodeToInsert, nodeToRemove);\n const thisIsConnected = Utilities.isConnected(this);\n\n if (thisIsConnected) {\n internals.disconnectTree(nodeToRemove);\n }\n\n if (nodeToInsertWasConnected) {\n internals.disconnectTree(nodeToInsert);\n }\n\n if (thisIsConnected) {\n internals.connectTree(nodeToInsert);\n }\n\n return nativeResult;\n });\n\n\n function patch_textContent(destination, baseDescriptor) {\n Object.defineProperty(destination, 'textContent', {\n enumerable: baseDescriptor.enumerable,\n configurable: true,\n get: baseDescriptor.get,\n set: /** @this {Node} */ function(assignedValue) {\n // If this is a text node then there are no nodes to disconnect.\n if (this.nodeType === Node.TEXT_NODE) {\n baseDescriptor.set.call(this, assignedValue);\n return;\n }\n\n let removedNodes = undefined;\n // Checking for `firstChild` is faster than reading `childNodes.length`\n // to compare with 0.\n if (this.firstChild) {\n // Using `childNodes` is faster than `children`, even though we only\n // care about elements.\n const childNodes = this.childNodes;\n const childNodesLength = childNodes.length;\n if (childNodesLength > 0 && Utilities.isConnected(this)) {\n // Copying an array by iterating is faster than using slice.\n removedNodes = new Array(childNodesLength);\n for (let i = 0; i < childNodesLength; i++) {\n removedNodes[i] = childNodes[i];\n }\n }\n }\n\n baseDescriptor.set.call(this, assignedValue);\n\n if (removedNodes) {\n for (let i = 0; i < removedNodes.length; i++) {\n internals.disconnectTree(removedNodes[i]);\n }\n }\n },\n });\n }\n\n if (Native.Node_textContent && Native.Node_textContent.get) {\n patch_textContent(Node.prototype, Native.Node_textContent);\n } else {\n internals.addPatch(function(element) {\n patch_textContent(element, {\n enumerable: true,\n configurable: true,\n // NOTE: This implementation of the `textContent` getter assumes that\n // text nodes' `textContent` getter will not be patched.\n get: /** @this {Node} */ function() {\n /** @type {!Array<string>} */\n const parts = [];\n\n for (let i = 0; i < this.childNodes.length; i++) {\n parts.push(this.childNodes[i].textContent);\n }\n\n return parts.join('');\n },\n set: /** @this {Node} */ function(assignedValue) {\n while (this.firstChild) {\n Native.Node_removeChild.call(this, this.firstChild);\n }\n Native.Node_appendChild.call(this, document.createTextNode(assignedValue));\n },\n });\n });\n }\n};\n","import CustomElementInternals from '../../CustomElementInternals.js';\nimport * as Utilities from '../../Utilities.js';\n\n/**\n * @typedef {{\n * before: !function(...(!Node|string)),\n * after: !function(...(!Node|string)),\n * replaceWith: !function(...(!Node|string)),\n * remove: !function(),\n * }}\n */\nlet ChildNodeNativeMethods;\n\n/**\n * @param {!CustomElementInternals} internals\n * @param {!Object} destination\n * @param {!ChildNodeNativeMethods} builtIn\n */\nexport default function(internals, destination, builtIn) {\n /**\n * @param {!function(...(!Node|string))} builtInMethod\n * @return {!function(...(!Node|string))}\n */\n function beforeAfterPatch(builtInMethod) {\n return function(...nodes) {\n /**\n * A copy of `nodes`, with any DocumentFragment replaced by its children.\n * @type {!Array<!Node>}\n */\n const flattenedNodes = [];\n\n /**\n * Elements in `nodes` that were connected before this call.\n * @type {!Array<!Node>}\n */\n const connectedElements = [];\n\n for (var i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if (node instanceof Element && Utilities.isConnected(node)) {\n connectedElements.push(node);\n }\n\n if (node instanceof DocumentFragment) {\n for (let child = node.firstChild; child; child = child.nextSibling) {\n flattenedNodes.push(child);\n }\n } else {\n flattenedNodes.push(node);\n }\n }\n\n builtInMethod.apply(this, nodes);\n\n for (let i = 0; i < connectedElements.length; i++) {\n internals.disconnectTree(connectedElements[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < flattenedNodes.length; i++) {\n const node = flattenedNodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n }\n\n if (builtIn.before !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'before', beforeAfterPatch(builtIn.before));\n }\n\n if (builtIn.before !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'after', beforeAfterPatch(builtIn.after));\n }\n\n if (builtIn.replaceWith !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'replaceWith',\n /**\n * @param {...(!Node|string)} nodes\n */\n function(...nodes) {\n /**\n * A copy of `nodes`, with any DocumentFragment replaced by its children.\n * @type {!Array<!Node>}\n */\n const flattenedNodes = [];\n\n /**\n * Elements in `nodes` that were connected before this call.\n * @type {!Array<!Node>}\n */\n const connectedElements = [];\n\n for (var i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if (node instanceof Element && Utilities.isConnected(node)) {\n connectedElements.push(node);\n }\n\n if (node instanceof DocumentFragment) {\n for (let child = node.firstChild; child; child = child.nextSibling) {\n flattenedNodes.push(child);\n }\n } else {\n flattenedNodes.push(node);\n }\n }\n\n const wasConnected = Utilities.isConnected(this);\n\n builtIn.replaceWith.apply(this, nodes);\n\n for (let i = 0; i < connectedElements.length; i++) {\n internals.disconnectTree(connectedElements[i]);\n }\n\n if (wasConnected) {\n internals.disconnectTree(this);\n for (let i = 0; i < flattenedNodes.length; i++) {\n const node = flattenedNodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n });\n }\n\n if (builtIn.remove !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'remove',\n function() {\n const wasConnected = Utilities.isConnected(this);\n\n builtIn.remove.call(this);\n\n if (wasConnected) {\n internals.disconnectTree(this);\n }\n });\n }\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport CEState from '../CustomElementState.js';\nimport * as Utilities from '../Utilities.js';\n\nimport PatchParentNode from './Interface/ParentNode.js';\nimport PatchChildNode from './Interface/ChildNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n if (Native.Element_attachShadow) {\n Utilities.setPropertyUnchecked(Element.prototype, 'attachShadow',\n /**\n * @this {Element}\n * @param {!{mode: string}} init\n * @return {ShadowRoot}\n */\n function(init) {\n const shadowRoot = Native.Element_attachShadow.call(this, init);\n this.__CE_shadowRoot = shadowRoot;\n return shadowRoot;\n });\n }\n\n\n function patch_innerHTML(destination, baseDescriptor) {\n Object.defineProperty(destination, 'innerHTML', {\n enumerable: baseDescriptor.enumerable,\n configurable: true,\n get: baseDescriptor.get,\n set: /** @this {Element} */ function(htmlString) {\n const isConnected = Utilities.isConnected(this);\n\n // NOTE: In IE11, when using the native `innerHTML` setter, all nodes\n // that were previously descendants of the context element have all of\n // their children removed as part of the set - the entire subtree is\n // 'disassembled'. This work around walks the subtree *before* using the\n // native setter.\n /** @type {!Array<!Element>|undefined} */\n let removedElements = undefined;\n if (isConnected) {\n removedElements = [];\n Utilities.walkDeepDescendantElements(this, element => {\n if (element !== this) {\n removedElements.push(element);\n }\n });\n }\n\n baseDescriptor.set.call(this, htmlString);\n\n if (removedElements) {\n for (let i = 0; i < removedElements.length; i++) {\n const element = removedElements[i];\n if (element.__CE_state === CEState.custom) {\n internals.disconnectedCallback(element);\n }\n }\n }\n\n // Only create custom elements if this element's owner document is\n // associated with the registry.\n if (!this.ownerDocument.__CE_hasRegistry) {\n internals.patchTree(this);\n } else {\n internals.patchAndUpgradeTree(this);\n }\n return htmlString;\n },\n });\n }\n\n if (Native.Element_innerHTML && Native.Element_innerHTML.get) {\n patch_innerHTML(Element.prototype, Native.Element_innerHTML);\n } else if (Native.HTMLElement_innerHTML && Native.HTMLElement_innerHTML.get) {\n patch_innerHTML(HTMLElement.prototype, Native.HTMLElement_innerHTML);\n } else {\n\n internals.addPatch(function(element) {\n patch_innerHTML(element, {\n enumerable: true,\n configurable: true,\n // Implements getting `innerHTML` by performing an unpatched `cloneNode`\n // of the element and returning the resulting element's `innerHTML`.\n // TODO: Is this too expensive?\n get: /** @this {Element} */ function() {\n return Native.Node_cloneNode.call(this, true).innerHTML;\n },\n // Implements setting `innerHTML` by creating an unpatched element,\n // setting `innerHTML` of that element and replacing the target\n // element's children with those of the unpatched element.\n set: /** @this {Element} */ function(assignedValue) {\n // NOTE: re-route to `content` for `template` elements.\n // We need to do this because `template.appendChild` does not\n // route into `template.content`.\n const isTemplate = (this.localName === 'template');\n /** @type {!Node} */\n const content = isTemplate ? (/** @type {!HTMLTemplateElement} */\n (this)).content : this;\n /** @type {!Node} */\n const rawElement = Native.Document_createElement.call(document,\n this.localName);\n rawElement.innerHTML = assignedValue;\n\n while (content.childNodes.length > 0) {\n Native.Node_removeChild.call(content, content.childNodes[0]);\n }\n const container = isTemplate ? rawElement.content : rawElement;\n while (container.childNodes.length > 0) {\n Native.Node_appendChild.call(content, container.childNodes[0]);\n }\n },\n });\n });\n }\n\n\n Utilities.setPropertyUnchecked(Element.prototype, 'setAttribute',\n /**\n * @this {Element}\n * @param {string} name\n * @param {string} newValue\n */\n function(name, newValue) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_setAttribute.call(this, name, newValue);\n }\n\n const oldValue = Native.Element_getAttribute.call(this, name);\n Native.Element_setAttribute.call(this, name, newValue);\n newValue = Native.Element_getAttribute.call(this, name);\n internals.attributeChangedCallback(this, name, oldValue, newValue, null);\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'setAttributeNS',\n /**\n * @this {Element}\n * @param {?string} namespace\n * @param {string} name\n * @param {string} newValue\n */\n function(namespace, name, newValue) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_setAttributeNS.call(this, namespace, name, newValue);\n }\n\n const oldValue = Native.Element_getAttributeNS.call(this, namespace, name);\n Native.Element_setAttributeNS.call(this, namespace, name, newValue);\n newValue = Native.Element_getAttributeNS.call(this, namespace, name);\n internals.attributeChangedCallback(this, name, oldValue, newValue, namespace);\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'removeAttribute',\n /**\n * @this {Element}\n * @param {string} name\n */\n function(name) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_removeAttribute.call(this, name);\n }\n\n const oldValue = Native.Element_getAttribute.call(this, name);\n Native.Element_removeAttribute.call(this, name);\n if (oldValue !== null) {\n internals.attributeChangedCallback(this, name, oldValue, null, null);\n }\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'removeAttributeNS',\n /**\n * @this {Element}\n * @param {?string} namespace\n * @param {string} name\n */\n function(namespace, name) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_removeAttributeNS.call(this, namespace, name);\n }\n\n const oldValue = Native.Element_getAttributeNS.call(this, namespace, name);\n Native.Element_removeAttributeNS.call(this, namespace, name);\n // In older browsers, `Element#getAttributeNS` may return the empty string\n // instead of null if the attribute does not exist. For details, see;\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttributeNS#Notes\n const newValue = Native.Element_getAttributeNS.call(this, namespace, name);\n if (oldValue !== newValue) {\n internals.attributeChangedCallback(this, name, oldValue, newValue, namespace);\n }\n });\n\n\n function patch_insertAdjacentElement(destination, baseMethod) {\n Utilities.setPropertyUnchecked(destination, 'insertAdjacentElement',\n /**\n * @this {Element}\n * @param {string} position\n * @param {!Element} element\n * @return {?Element}\n */\n function(position, element) {\n const wasConnected = Utilities.isConnected(element);\n const insertedElement = /** @type {!Element} */\n (baseMethod.call(this, position, element));\n\n if (wasConnected) {\n internals.disconnectTree(element);\n }\n\n if (Utilities.isConnected(insertedElement)) {\n internals.connectTree(element);\n }\n return insertedElement;\n });\n }\n\n if (Native.HTMLElement_insertAdjacentElement) {\n patch_insertAdjacentElement(HTMLElement.prototype, Native.HTMLElement_insertAdjacentElement);\n } else if (Native.Element_insertAdjacentElement) {\n patch_insertAdjacentElement(Element.prototype, Native.Element_insertAdjacentElement);\n } else {\n console.warn('Custom Elements: `Element#insertAdjacentElement` was not patched.');\n }\n\n\n function patch_insertAdjacentHTML(destination, baseMethod) {\n /**\n * Patches and upgrades all nodes which are siblings between `start`\n * (inclusive) and `end` (exclusive). If `end` is `null`, then all siblings\n * following `start` will be patched and upgraded.\n * @param {!Node} start\n * @param {?Node} end\n */\n function upgradeNodesInRange(start, end) {\n const nodes = [];\n for (let node = start; node !== end; node = node.nextSibling) {\n nodes.push(node);\n }\n for (let i = 0; i < nodes.length; i++) {\n internals.patchAndUpgradeTree(nodes[i]);\n }\n }\n\n Utilities.setPropertyUnchecked(destination, 'insertAdjacentHTML',\n /**\n * @this {Element}\n * @param {string} position\n * @param {string} text\n */\n function(position, text) {\n position = position.toLowerCase();\n\n if (position === \"beforebegin\") {\n const marker = this.previousSibling;\n baseMethod.call(this, position, text);\n upgradeNodesInRange(\n /** @type {!Node} */ (marker || this.parentNode.firstChild), this);\n } else if (position === \"afterbegin\") {\n const marker = this.firstChild;\n baseMethod.call(this, position, text);\n upgradeNodesInRange(/** @type {!Node} */ (this.firstChild), marker);\n } else if (position === \"beforeend\") {\n const marker = this.lastChild;\n baseMethod.call(this, position, text);\n upgradeNodesInRange(marker || this.firstChild, null);\n } else if (position === \"afterend\") {\n const marker = this.nextSibling;\n baseMethod.call(this, position, text);\n upgradeNodesInRange(/** @type {!Node} */ (this.nextSibling), marker);\n } else {\n throw new SyntaxError(`The value provided (${String(position)}) is ` +\n \"not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'.\");\n }\n });\n }\n\n if (Native.HTMLElement_insertAdjacentHTML) {\n patch_insertAdjacentHTML(HTMLElement.prototype, Native.HTMLElement_insertAdjacentHTML);\n } else if (Native.Element_insertAdjacentHTML) {\n patch_insertAdjacentHTML(Element.prototype, Native.Element_insertAdjacentHTML);\n } else {\n console.warn('Custom Elements: `Element#insertAdjacentHTML` was not patched.');\n }\n\n\n PatchParentNode(internals, Element.prototype, {\n prepend: Native.Element_prepend,\n append: Native.Element_append,\n });\n\n PatchChildNode(internals, Element.prototype, {\n before: Native.Element_before,\n after: Native.Element_after,\n replaceWith: Native.Element_replaceWith,\n remove: Native.Element_remove,\n });\n};\n","import CustomElementInternals from '../CustomElementInternals.js';\nimport Native from './Native.js';\nimport PatchParentNode from './Interface/ParentNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n PatchParentNode(internals, DocumentFragment.prototype, {\n prepend: Native.DocumentFragment_prepend,\n append: Native.DocumentFragment_append,\n });\n};\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/*\nExtremely simple css parser. Intended to be not more than what we need\nand definitely not necessarily correct =).\n*/\n\n'use strict';\n\n/** @unrestricted */\nclass StyleNode {\n constructor() {\n /** @type {number} */\n this['start'] = 0;\n /** @type {number} */\n this['end'] = 0;\n /** @type {StyleNode} */\n this['previous'] = null;\n /** @type {StyleNode} */\n this['parent'] = null;\n /** @type {Array<StyleNode>} */\n this['rules'] = null;\n /** @type {string} */\n this['parsedCssText'] = '';\n /** @type {string} */\n this['cssText'] = '';\n /** @type {boolean} */\n this['atRule'] = false;\n /** @type {number} */\n this['type'] = 0;\n /** @type {string} */\n this['keyframesName'] = '';\n /** @type {string} */\n this['selector'] = '';\n /** @type {string} */\n this['parsedSelector'] = '';\n }\n}\n\nexport {StyleNode}\n\n// given a string of css, return a simple rule tree\n/**\n * @param {string} text\n * @return {StyleNode}\n */\nexport function parse(text) {\n text = clean(text);\n return parseCss(lex(text), text);\n}\n\n// remove stuff we don't care about that may hinder parsing\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction clean(cssText) {\n return cssText.replace(RX.comments, '').replace(RX.port, '');\n}\n\n// super simple {...} lexer that returns a node tree\n/**\n * @param {string} text\n * @return {StyleNode}\n */\nfunction lex(text) {\n let root = new StyleNode();\n root['start'] = 0;\n root['end'] = text.length\n let n = root;\n for (let i = 0, l = text.length; i < l; i++) {\n if (text[i] === OPEN_BRACE) {\n if (!n['rules']) {\n n['rules'] = [];\n }\n let p = n;\n let previous = p['rules'][p['rules'].length - 1] || null;\n n = new StyleNode();\n n['start'] = i + 1;\n n['parent'] = p;\n n['previous'] = previous;\n p['rules'].push(n);\n } else if (text[i] === CLOSE_BRACE) {\n n['end'] = i + 1;\n n = n['parent'] || root;\n }\n }\n return root;\n}\n\n// add selectors/cssText to node tree\n/**\n * @param {StyleNode} node\n * @param {string} text\n * @return {StyleNode}\n */\nfunction parseCss(node, text) {\n let t = text.substring(node['start'], node['end'] - 1);\n node['parsedCssText'] = node['cssText'] = t.trim();\n if (node['parent']) {\n let ss = node['previous'] ? node['previous']['end'] : node['parent']['start'];\n t = text.substring(ss, node['start'] - 1);\n t = _expandUnicodeEscapes(t);\n t = t.replace(RX.multipleSpaces, ' ');\n // TODO(sorvell): ad hoc; make selector include only after last ;\n // helps with mixin syntax\n t = t.substring(t.lastIndexOf(';') + 1);\n let s = node['parsedSelector'] = node['selector'] = t.trim();\n node['atRule'] = (s.indexOf(AT_START) === 0);\n // note, support a subset of rule types...\n if (node['atRule']) {\n if (s.indexOf(MEDIA_START) === 0) {\n node['type'] = types.MEDIA_RULE;\n } else if (s.match(RX.keyframesRule)) {\n node['type'] = types.KEYFRAMES_RULE;\n node['keyframesName'] =\n node['selector'].split(RX.multipleSpaces).pop();\n }\n } else {\n if (s.indexOf(VAR_START) === 0) {\n node['type'] = types.MIXIN_RULE;\n } else {\n node['type'] = types.STYLE_RULE;\n }\n }\n }\n let r$ = node['rules'];\n if (r$) {\n for (let i = 0, l = r$.length, r;\n (i < l) && (r = r$[i]); i++) {\n parseCss(r, text);\n }\n }\n return node;\n}\n\n/**\n * conversion of sort unicode escapes with spaces like `\\33 ` (and longer) into\n * expanded form that doesn't require trailing space `\\000033`\n * @param {string} s\n * @return {string}\n */\nfunction _expandUnicodeEscapes(s) {\n return s.replace(/\\\\([0-9a-f]{1,6})\\s/gi, function() {\n let code = arguments[1],\n repeat = 6 - code.length;\n while (repeat--) {\n code = '0' + code;\n }\n return '\\\\' + code;\n });\n}\n\n/**\n * stringify parsed css.\n * @param {StyleNode} node\n * @param {boolean=} preserveProperties\n * @param {string=} text\n * @return {string}\n */\nexport function stringify(node, preserveProperties, text = '') {\n // calc rule cssText\n let cssText = '';\n if (node['cssText'] || node['rules']) {\n let r$ = node['rules'];\n if (r$ && !_hasMixinRules(r$)) {\n for (let i = 0, l = r$.length, r;\n (i < l) && (r = r$[i]); i++) {\n cssText = stringify(r, preserveProperties, cssText);\n }\n } else {\n cssText = preserveProperties ? node['cssText'] :\n removeCustomProps(node['cssText']);\n cssText = cssText.trim();\n if (cssText) {\n cssText = ' ' + cssText + '\\n';\n }\n }\n }\n // emit rule if there is cssText\n if (cssText) {\n if (node['selector']) {\n text += node['selector'] + ' ' + OPEN_BRACE + '\\n';\n }\n text += cssText;\n if (node['selector']) {\n text += CLOSE_BRACE + '\\n\\n';\n }\n }\n return text;\n}\n\n/**\n * @param {Array<StyleNode>} rules\n * @return {boolean}\n */\nfunction _hasMixinRules(rules) {\n let r = rules[0];\n return Boolean(r) && Boolean(r['selector']) && r['selector'].indexOf(VAR_START) === 0;\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction removeCustomProps(cssText) {\n cssText = removeCustomPropAssignment(cssText);\n return removeCustomPropApply(cssText);\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nexport function removeCustomPropAssignment(cssText) {\n return cssText\n .replace(RX.customProp, '')\n .replace(RX.mixinProp, '');\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction removeCustomPropApply(cssText) {\n return cssText\n .replace(RX.mixinApply, '')\n .replace(RX.varApply, '');\n}\n\n/** @enum {number} */\nexport const types = {\n STYLE_RULE: 1,\n KEYFRAMES_RULE: 7,\n MEDIA_RULE: 4,\n MIXIN_RULE: 1000\n}\n\nconst OPEN_BRACE = '{';\nconst CLOSE_BRACE = '}';\n\n// helper regexp's\nconst RX = {\n comments: /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n port: /@import[^;]*;/gim,\n customProp: /(?:^[^;\\-\\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\\n]|$)/gim,\n mixinProp: /(?:^[^;\\-\\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\\n]|$)?/gim,\n mixinApply: /@apply\\s*\\(?[^);]*\\)?\\s*(?:[;\\n]|$)?/gim,\n varApply: /[^;:]*?:[^;]*?var\\([^;]*\\)(?:[;\\n]|$)?/gim,\n keyframesRule: /^@[^\\s]*keyframes/,\n multipleSpaces: /\\s+/g\n}\n\nconst VAR_START = '--';\nconst MEDIA_START = '@media';\nconst AT_START = '@';\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nexport const nativeShadow = !(window['ShadyDOM'] && window['ShadyDOM']['inUse']);\nlet nativeCssVariables_;\n\n/**\n * @param {(ShadyCSSOptions | ShadyCSSInterface)=} settings\n */\nfunction calcCssVariables(settings) {\n if (settings && settings['shimcssproperties']) {\n nativeCssVariables_ = false;\n } else {\n // chrome 49 has semi-working css vars, check if box-shadow works\n // safari 9.1 has a recalc bug: https://bugs.webkit.org/show_bug.cgi?id=155782\n // However, shim css custom properties are only supported with ShadyDOM enabled,\n // so fall back on native if we do not detect ShadyDOM\n // Edge 15: custom properties used in ::before and ::after will also be used in the parent element\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12414257/\n nativeCssVariables_ = nativeShadow || Boolean(!navigator.userAgent.match(/AppleWebKit\\/601|Edge\\/15/) &&\n window.CSS && CSS.supports && CSS.supports('box-shadow', '0 0 0 var(--foo)'));\n }\n}\n\nif (window.ShadyCSS && window.ShadyCSS.nativeCss !== undefined) {\n nativeCssVariables_ = window.ShadyCSS.nativeCss;\n} else if (window.ShadyCSS) {\n calcCssVariables(window.ShadyCSS);\n // reset window variable to let ShadyCSS API take its place\n window.ShadyCSS = undefined;\n} else {\n calcCssVariables(window['WebComponents'] && window['WebComponents']['flags']);\n}\n\n// Hack for type error under new type inference which doesn't like that\n// nativeCssVariables is updated in a function and assigns the type\n// `function(): ?` instead of `boolean`.\nexport const nativeCssVariables = /** @type {boolean} */(nativeCssVariables_);\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nexport const VAR_ASSIGN = /(?:^|[;\\s{]\\s*)(--[\\w-]*?)\\s*:\\s*(?:((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^)]*?\\)|[^};{])+)|\\{([^}]*)\\}(?:(?=[;\\s}])|$))/gi;\nexport const MIXIN_MATCH = /(?:^|\\W+)@apply\\s*\\(?([^);\\n]*)\\)?/gi;\nexport const VAR_CONSUMED = /(--[\\w-]+)\\s*([:,;)]|$)/gi;\nexport const ANIMATION_MATCH = /(animation\\s*:)|(animation-name\\s*:)/;\nexport const MEDIA_MATCH = /@media\\s(.*)/;\nexport const IS_VAR = /^--/;\nexport const BRACKETED = /\\{[^}]*\\}/g;\nexport const HOST_PREFIX = '(?:^|[^.#[:])';\nexport const HOST_SUFFIX = '($|[.:[\\\\s>+~])';\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/** @type {!Set<string>} */\nconst styleTextSet = new Set();\n\nexport const scopingAttribute = 'shady-unscoped';\n\n/**\n * Add a specifically-marked style to the document directly, and only one copy of that style.\n *\n * @param {!HTMLStyleElement} style\n * @return {undefined}\n */\nexport function processUnscopedStyle(style) {\n const text = style.textContent;\n if (!styleTextSet.has(text)) {\n styleTextSet.add(text);\n const newStyle = style.cloneNode(true);\n document.head.appendChild(newStyle);\n }\n}\n\n/**\n * Check if a style is supposed to be unscoped\n * @param {!HTMLStyleElement} style\n * @return {boolean} true if the style has the unscoping attribute\n */\nexport function isUnscopedStyle(style) {\n return style.hasAttribute(scopingAttribute);\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {nativeShadow, nativeCssVariables} from './style-settings.js';\nimport {parse, stringify, types, StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\nimport {MEDIA_MATCH} from './common-regex.js';\nimport {processUnscopedStyle, isUnscopedStyle} from './unscoped-style-handler.js';\n\n/**\n * @param {string|StyleNode} rules\n * @param {function(StyleNode)=} callback\n * @return {string}\n */\nexport function toCssText (rules, callback) {\n if (!rules) {\n return '';\n }\n if (typeof rules === 'string') {\n rules = parse(rules);\n }\n if (callback) {\n forEachRule(rules, callback);\n }\n return stringify(rules, nativeCssVariables);\n}\n\n/**\n * @param {HTMLStyleElement} style\n * @return {StyleNode}\n */\nexport function rulesForStyle(style) {\n if (!style['__cssRules'] && style.textContent) {\n style['__cssRules'] = parse(style.textContent);\n }\n return style['__cssRules'] || null;\n}\n\n// Tests if a rule is a keyframes selector, which looks almost exactly\n// like a normal selector but is not (it has nothing to do with scoping\n// for example).\n/**\n * @param {StyleNode} rule\n * @return {boolean}\n */\nexport function isKeyframesSelector(rule) {\n return Boolean(rule['parent']) &&\n rule['parent']['type'] === types.KEYFRAMES_RULE;\n}\n\n/**\n * @param {StyleNode} node\n * @param {Function=} styleRuleCallback\n * @param {Function=} keyframesRuleCallback\n * @param {boolean=} onlyActiveRules\n */\nexport function forEachRule(node, styleRuleCallback, keyframesRuleCallback, onlyActiveRules) {\n if (!node) {\n return;\n }\n let skipRules = false;\n let type = node['type'];\n if (onlyActiveRules) {\n if (type === types.MEDIA_RULE) {\n let matchMedia = node['selector'].match(MEDIA_MATCH);\n if (matchMedia) {\n // if rule is a non matching @media rule, skip subrules\n if (!window.matchMedia(matchMedia[1]).matches) {\n skipRules = true;\n }\n }\n }\n }\n if (type === types.STYLE_RULE) {\n styleRuleCallback(node);\n } else if (keyframesRuleCallback &&\n type === types.KEYFRAMES_RULE) {\n keyframesRuleCallback(node);\n } else if (type === types.MIXIN_RULE) {\n skipRules = true;\n }\n let r$ = node['rules'];\n if (r$ && !skipRules) {\n for (let i=0, l=r$.length, r; (i<l) && (r=r$[i]); i++) {\n forEachRule(r, styleRuleCallback, keyframesRuleCallback, onlyActiveRules);\n }\n }\n}\n\n// add a string of cssText to the document.\n/**\n * @param {string} cssText\n * @param {string} moniker\n * @param {Node} target\n * @param {Node} contextNode\n * @return {HTMLStyleElement}\n */\nexport function applyCss(cssText, moniker, target, contextNode) {\n let style = createScopeStyle(cssText, moniker);\n applyStyle(style, target, contextNode);\n return style;\n}\n\n/**\n * @param {string} cssText\n * @param {string} moniker\n * @return {HTMLStyleElement}\n */\nexport function createScopeStyle(cssText, moniker) {\n let style = /** @type {HTMLStyleElement} */(document.createElement('style'));\n if (moniker) {\n style.setAttribute('scope', moniker);\n }\n style.textContent = cssText;\n return style;\n}\n\n/**\n * Track the position of the last added style for placing placeholders\n * @type {Node}\n */\nlet lastHeadApplyNode = null;\n\n// insert a comment node as a styling position placeholder.\n/**\n * @param {string} moniker\n * @return {!Comment}\n */\nexport function applyStylePlaceHolder(moniker) {\n let placeHolder = document.createComment(' Shady DOM styles for ' +\n moniker + ' ');\n let after = lastHeadApplyNode ?\n lastHeadApplyNode['nextSibling'] : null;\n let scope = document.head;\n scope.insertBefore(placeHolder, after || scope.firstChild);\n lastHeadApplyNode = placeHolder;\n return placeHolder;\n}\n\n/**\n * @param {HTMLStyleElement} style\n * @param {?Node} target\n * @param {?Node} contextNode\n */\nexport function applyStyle(style, target, contextNode) {\n target = target || document.head;\n let after = (contextNode && contextNode.nextSibling) ||\n target.firstChild;\n target.insertBefore(style, after);\n if (!lastHeadApplyNode) {\n lastHeadApplyNode = style;\n } else {\n // only update lastHeadApplyNode if the new style is inserted after the old lastHeadApplyNode\n let position = style.compareDocumentPosition(lastHeadApplyNode);\n if (position === Node.DOCUMENT_POSITION_PRECEDING) {\n lastHeadApplyNode = style;\n }\n }\n}\n\n/**\n * @param {string} buildType\n * @return {boolean}\n */\nexport function isTargetedBuild(buildType) {\n return nativeShadow ? buildType === 'shadow' : buildType === 'shady';\n}\n\n/**\n * @param {Element} element\n * @return {?string}\n */\nexport function getCssBuildType(element) {\n return element.getAttribute('css-build');\n}\n\n/**\n * Walk from text[start] matching parens and\n * returns position of the outer end paren\n * @param {string} text\n * @param {number} start\n * @return {number}\n */\nfunction findMatchingParen(text, start) {\n let level = 0;\n for (let i=start, l=text.length; i < l; i++) {\n if (text[i] === '(') {\n level++;\n } else if (text[i] === ')') {\n if (--level === 0) {\n return i;\n }\n }\n }\n return -1;\n}\n\n/**\n * @param {string} str\n * @param {function(string, string, string, string)} callback\n */\nexport function processVariableAndFallback(str, callback) {\n // find 'var('\n let start = str.indexOf('var(');\n if (start === -1) {\n // no var?, everything is prefix\n return callback(str, '', '', '');\n }\n //${prefix}var(${inner})${suffix}\n let end = findMatchingParen(str, start + 3);\n let inner = str.substring(start + 4, end);\n let prefix = str.substring(0, start);\n // suffix may have other variables\n let suffix = processVariableAndFallback(str.substring(end + 1), callback);\n let comma = inner.indexOf(',');\n // value and fallback args should be trimmed to match in property lookup\n if (comma === -1) {\n // variable, no fallback\n return callback(prefix, inner.trim(), '', suffix);\n }\n // var(${value},${fallback})\n let value = inner.substring(0, comma).trim();\n let fallback = inner.substring(comma + 1).trim();\n return callback(prefix, value, fallback, suffix);\n}\n\n/**\n * @param {Element} element\n * @param {string} value\n */\nexport function setElementClassRaw(element, value) {\n // use native setAttribute provided by ShadyDOM when setAttribute is patched\n if (nativeShadow) {\n element.setAttribute('class', value);\n } else {\n window['ShadyDOM']['nativeMethods']['setAttribute'].call(element, 'class', value);\n }\n}\n\n/**\n * @param {Element | {is: string, extends: string}} element\n * @return {{is: string, typeExtension: string}}\n */\nexport function getIsExtends(element) {\n let localName = element['localName'];\n let is = '', typeExtension = '';\n /*\n NOTE: technically, this can be wrong for certain svg elements\n with `-` in the name like `<font-face>`\n */\n if (localName) {\n if (localName.indexOf('-') > -1) {\n is = localName;\n } else {\n typeExtension = localName;\n is = (element.getAttribute && element.getAttribute('is')) || '';\n }\n } else {\n is = /** @type {?} */(element).is;\n typeExtension = /** @type {?} */(element).extends;\n }\n return {is, typeExtension};\n}\n\n/**\n * @param {Element|DocumentFragment} element\n * @return {string}\n */\nexport function gatherStyleText(element) {\n /** @type {!Array<string>} */\n const styleTextParts = [];\n const styles = /** @type {!NodeList<!HTMLStyleElement>} */(element.querySelectorAll('style'));\n for (let i = 0; i < styles.length; i++) {\n const style = styles[i];\n if (isUnscopedStyle(style)) {\n if (!nativeShadow) {\n processUnscopedStyle(style);\n style.parentNode.removeChild(style);\n }\n } else {\n styleTextParts.push(style.textContent);\n style.parentNode.removeChild(style);\n }\n }\n return styleTextParts.join('').trim();\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\nimport * as StyleUtil from './style-util.js';\nimport {nativeShadow} from './style-settings.js';\n\n/* Transforms ShadowDOM styling into ShadyDOM styling\n\n* scoping:\n\n * elements in scope get scoping selector class=\"x-foo-scope\"\n * selectors re-written as follows:\n\n div button -> div.x-foo-scope button.x-foo-scope\n\n* :host -> scopeName\n\n* :host(...) -> scopeName...\n\n* ::slotted(...) -> scopeName > ...\n\n* ...:dir(ltr|rtl) -> [dir=\"ltr|rtl\"] ..., ...[dir=\"ltr|rtl\"]\n\n* :host(:dir[rtl]) -> scopeName:dir(rtl) -> [dir=\"rtl\"] scopeName, scopeName[dir=\"rtl\"]\n\n*/\nconst SCOPE_NAME = 'style-scope';\n\nclass StyleTransformer {\n get SCOPE_NAME() {\n return SCOPE_NAME;\n }\n /**\n * Given a node and scope name, add a scoping class to each node\n * in the tree. This facilitates transforming css into scoped rules.\n * @param {?} node\n * @param {?} scope\n * @param {?=} shouldRemoveScope\n */\n dom(node, scope, shouldRemoveScope) {\n // one time optimization to skip scoping...\n if (node['__styleScoped']) {\n node['__styleScoped'] = null;\n } else {\n this._transformDom(node, scope || '', shouldRemoveScope);\n }\n }\n\n _transformDom(node, selector, shouldRemoveScope) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n this.element(node, selector, shouldRemoveScope);\n }\n let c$ = (node.localName === 'template') ?\n (node.content || node._content).childNodes :\n node.children || node.childNodes;\n if (c$) {\n for (let i=0; i<c$.length; i++) {\n this._transformDom(c$[i], selector, shouldRemoveScope);\n }\n }\n }\n /**\n * @param {?} element\n * @param {?} scope\n * @param {?=} shouldRemoveScope\n */\n element(element, scope, shouldRemoveScope) {\n // note: if using classes, we add both the general 'style-scope' class\n // as well as the specific scope. This enables easy filtering of all\n // `style-scope` elements\n if (scope) {\n // note: svg on IE does not have classList so fallback to class\n if (element.classList) {\n if (shouldRemoveScope) {\n element.classList.remove(SCOPE_NAME);\n element.classList.remove(scope);\n } else {\n element.classList.add(SCOPE_NAME);\n element.classList.add(scope);\n }\n } else if (element.getAttribute) {\n let c = element.getAttribute(CLASS);\n if (shouldRemoveScope) {\n if (c) {\n let newValue = c.replace(SCOPE_NAME, '').replace(scope, '');\n StyleUtil.setElementClassRaw(element, newValue);\n }\n } else {\n let newValue = (c ? c + ' ' : '') + SCOPE_NAME + ' ' + scope;\n StyleUtil.setElementClassRaw(element, newValue);\n }\n }\n }\n }\n\n /**\n * @param {?} element\n * @param {?} styleRules\n * @param {?=} callback\n */\n elementStyles(element, styleRules, callback) {\n let cssBuildType = element['__cssBuild'];\n // no need to shim selectors if settings.useNativeShadow, also\n // a shady css build will already have transformed selectors\n // NOTE: This method may be called as part of static or property shimming.\n // When there is a targeted build it will not be called for static shimming,\n // but when the property shim is used it is called and should opt out of\n // static shimming work when a proper build exists.\n let cssText = '';\n if (nativeShadow || cssBuildType === 'shady') {\n cssText = StyleUtil.toCssText(styleRules, callback);\n } else {\n let {is, typeExtension} = StyleUtil.getIsExtends(element);\n cssText = this.css(styleRules, is, typeExtension, callback) + '\\n\\n';\n }\n return cssText.trim();\n }\n\n // Given a string of cssText and a scoping string (scope), returns\n // a string of scoped css where each selector is transformed to include\n // a class created from the scope. ShadowDOM selectors are also transformed\n // (e.g. :host) to use the scoping selector.\n css(rules, scope, ext, callback) {\n let hostScope = this._calcHostScope(scope, ext);\n scope = this._calcElementScope(scope);\n let self = this;\n return StyleUtil.toCssText(rules, function(/** StyleNode */rule) {\n if (!rule.isScoped) {\n self.rule(rule, scope, hostScope);\n rule.isScoped = true;\n }\n if (callback) {\n callback(rule, scope, hostScope);\n }\n });\n }\n\n _calcElementScope(scope) {\n if (scope) {\n return CSS_CLASS_PREFIX + scope;\n } else {\n return '';\n }\n }\n\n _calcHostScope(scope, ext) {\n return ext ? `[is=${scope}]` : scope;\n }\n\n rule(rule, scope, hostScope) {\n this._transformRule(rule, this._transformComplexSelector,\n scope, hostScope);\n }\n\n /**\n * transforms a css rule to a scoped rule.\n *\n * @param {StyleNode} rule\n * @param {Function} transformer\n * @param {string=} scope\n * @param {string=} hostScope\n */\n _transformRule(rule, transformer, scope, hostScope) {\n // NOTE: save transformedSelector for subsequent matching of elements\n // against selectors (e.g. when calculating style properties)\n rule['selector'] = rule.transformedSelector =\n this._transformRuleCss(rule, transformer, scope, hostScope);\n }\n\n /**\n * @param {StyleNode} rule\n * @param {Function} transformer\n * @param {string=} scope\n * @param {string=} hostScope\n */\n _transformRuleCss(rule, transformer, scope, hostScope) {\n let p$ = rule['selector'].split(COMPLEX_SELECTOR_SEP);\n // we want to skip transformation of rules that appear in keyframes,\n // because they are keyframe selectors, not element selectors.\n if (!StyleUtil.isKeyframesSelector(rule)) {\n for (let i=0, l=p$.length, p; (i<l) && (p=p$[i]); i++) {\n p$[i] = transformer.call(this, p, scope, hostScope);\n }\n }\n return p$.join(COMPLEX_SELECTOR_SEP);\n }\n\n /**\n * @param {string} selector\n * @return {string}\n */\n _twiddleNthPlus(selector) {\n return selector.replace(NTH, (m, type, inside) => {\n if (inside.indexOf('+') > -1) {\n inside = inside.replace(/\\+/g, '___');\n } else if (inside.indexOf('___') > -1) {\n inside = inside.replace(/___/g, '+');\n }\n return `:${type}(${inside})`;\n });\n }\n\n/**\n * @param {string} selector\n * @param {string} scope\n * @param {string=} hostScope\n */\n _transformComplexSelector(selector, scope, hostScope) {\n let stop = false;\n selector = selector.trim();\n // Remove spaces inside of selectors like `:nth-of-type` because it confuses SIMPLE_SELECTOR_SEP\n let isNth = NTH.test(selector);\n if (isNth) {\n selector = selector.replace(NTH, (m, type, inner) => `:${type}(${inner.replace(/\\s/g, '')})`)\n selector = this._twiddleNthPlus(selector);\n }\n selector = selector.replace(SLOTTED_START, `${HOST} $1`);\n selector = selector.replace(SIMPLE_SELECTOR_SEP, (m, c, s) => {\n if (!stop) {\n let info = this._transformCompoundSelector(s, c, scope, hostScope);\n stop = stop || info.stop;\n c = info.combinator;\n s = info.value;\n }\n return c + s;\n });\n if (isNth) {\n selector = this._twiddleNthPlus(selector);\n }\n return selector;\n }\n\n _transformCompoundSelector(selector, combinator, scope, hostScope) {\n // replace :host with host scoping class\n let slottedIndex = selector.indexOf(SLOTTED);\n if (selector.indexOf(HOST) >= 0) {\n selector = this._transformHostSelector(selector, hostScope);\n // replace other selectors with scoping class\n } else if (slottedIndex !== 0) {\n selector = scope ? this._transformSimpleSelector(selector, scope) :\n selector;\n }\n // mark ::slotted() scope jump to replace with descendant selector + arg\n // also ignore left-side combinator\n let slotted = false;\n if (slottedIndex >= 0) {\n combinator = '';\n slotted = true;\n }\n // process scope jumping selectors up to the scope jump and then stop\n let stop;\n if (slotted) {\n stop = true;\n if (slotted) {\n // .zonk ::slotted(.foo) -> .zonk.scope > .foo\n selector = selector.replace(SLOTTED_PAREN, (m, paren) => ` > ${paren}`);\n }\n }\n selector = selector.replace(DIR_PAREN, (m, before, dir) =>\n `[dir=\"${dir}\"] ${before}, ${before}[dir=\"${dir}\"]`);\n return {value: selector, combinator, stop};\n }\n\n _transformSimpleSelector(selector, scope) {\n let p$ = selector.split(PSEUDO_PREFIX);\n p$[0] += scope;\n return p$.join(PSEUDO_PREFIX);\n }\n\n // :host(...) -> scopeName...\n _transformHostSelector(selector, hostScope) {\n let m = selector.match(HOST_PAREN);\n let paren = m && m[2].trim() || '';\n if (paren) {\n if (!paren[0].match(SIMPLE_SELECTOR_PREFIX)) {\n // paren starts with a type selector\n let typeSelector = paren.split(SIMPLE_SELECTOR_PREFIX)[0];\n // if the type selector is our hostScope then avoid pre-pending it\n if (typeSelector === hostScope) {\n return paren;\n // otherwise, this selector should not match in this scope so\n // output a bogus selector.\n } else {\n return SELECTOR_NO_MATCH;\n }\n } else {\n // make sure to do a replace here to catch selectors like:\n // `:host(.foo)::before`\n return selector.replace(HOST_PAREN, function(m, host, paren) {\n return hostScope + paren;\n });\n }\n // if no paren, do a straight :host replacement.\n // TODO(sorvell): this should not strictly be necessary but\n // it's needed to maintain support for `:host[foo]` type selectors\n // which have been improperly used under Shady DOM. This should be\n // deprecated.\n } else {\n return selector.replace(HOST, hostScope);\n }\n }\n\n /**\n * @param {StyleNode} rule\n */\n documentRule(rule) {\n // reset selector in case this is redone.\n rule['selector'] = rule['parsedSelector'];\n this.normalizeRootSelector(rule);\n this._transformRule(rule, this._transformDocumentSelector);\n }\n\n /**\n * @param {StyleNode} rule\n */\n normalizeRootSelector(rule) {\n if (rule['selector'] === ROOT) {\n rule['selector'] = 'html';\n }\n }\n\n/**\n * @param {string} selector\n */\n _transformDocumentSelector(selector) {\n return selector.match(SLOTTED) ?\n this._transformComplexSelector(selector, SCOPE_DOC_SELECTOR) :\n this._transformSimpleSelector(selector.trim(), SCOPE_DOC_SELECTOR);\n }\n}\n\nlet NTH = /:(nth[-\\w]+)\\(([^)]+)\\)/;\nlet SCOPE_DOC_SELECTOR = `:not(.${SCOPE_NAME})`;\nlet COMPLEX_SELECTOR_SEP = ',';\nlet SIMPLE_SELECTOR_SEP = /(^|[\\s>+~]+)((?:\\[.+?\\]|[^\\s>+~=[])+)/g;\nlet SIMPLE_SELECTOR_PREFIX = /[[.:#*]/;\nlet HOST = ':host';\nlet ROOT = ':root';\nlet SLOTTED = '::slotted';\nlet SLOTTED_START = new RegExp(`^(${SLOTTED})`);\n// NOTE: this supports 1 nested () pair for things like\n// :host(:not([selected]), more general support requires\n// parsing which seems like overkill\nlet HOST_PAREN = /(:host)(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))/;\n// similar to HOST_PAREN\nlet SLOTTED_PAREN = /(?:::slotted)(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))/;\nlet DIR_PAREN = /(.*):dir\\((?:(ltr|rtl))\\)/;\nlet CSS_CLASS_PREFIX = '.';\nlet PSEUDO_PREFIX = ':';\nlet CLASS = 'class';\nlet SELECTOR_NO_MATCH = 'should_not_match';\n\nexport default new StyleTransformer()\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\n\n/** @const {string} */\nconst infoKey = '__styleInfo';\n\nexport default class StyleInfo {\n /**\n * @param {Element} node\n * @return {StyleInfo}\n */\n static get(node) {\n if (node) {\n return node[infoKey];\n } else {\n return null;\n }\n }\n /**\n * @param {!Element} node\n * @param {StyleInfo} styleInfo\n * @return {StyleInfo}\n */\n static set(node, styleInfo) {\n node[infoKey] = styleInfo;\n return styleInfo;\n }\n /**\n * @param {StyleNode} ast\n * @param {Node=} placeholder\n * @param {Array<string>=} ownStylePropertyNames\n * @param {string=} elementName\n * @param {string=} typeExtension\n * @param {string=} cssBuild\n */\n constructor(ast, placeholder, ownStylePropertyNames, elementName, typeExtension, cssBuild) {\n /** @type {StyleNode} */\n this.styleRules = ast || null;\n /** @type {Node} */\n this.placeholder = placeholder || null;\n /** @type {!Array<string>} */\n this.ownStylePropertyNames = ownStylePropertyNames || [];\n /** @type {Array<Object>} */\n this.overrideStyleProperties = null;\n /** @type {string} */\n this.elementName = elementName || '';\n /** @type {string} */\n this.cssBuild = cssBuild || '';\n /** @type {string} */\n this.typeExtension = typeExtension || '';\n /** @type {Object<string, string>} */\n this.styleProperties = null;\n /** @type {?string} */\n this.scopeSelector = null;\n /** @type {HTMLStyleElement} */\n this.customStyle = null;\n }\n _getStyleRules() {\n return this.styleRules;\n }\n}\n\nStyleInfo.prototype['_getStyleRules'] = StyleInfo.prototype._getStyleRules;","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {removeCustomPropAssignment, StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\nimport {nativeShadow} from './style-settings.js';\nimport StyleTransformer from './style-transformer.js';\nimport * as StyleUtil from './style-util.js';\nimport * as RX from './common-regex.js';\nimport StyleInfo from './style-info.js';\n\n// TODO: dedupe with shady\n/**\n * @param {string} selector\n * @return {boolean}\n * @this {Element}\n */\nconst matchesSelector = function(selector) {\n const method = this.matches || this.matchesSelector ||\n this.mozMatchesSelector || this.msMatchesSelector ||\n this.oMatchesSelector || this.webkitMatchesSelector;\n return method && method.call(this, selector);\n};\n\nconst IS_IE = navigator.userAgent.match('Trident');\n\nconst XSCOPE_NAME = 'x-scope';\n\nclass StyleProperties {\n get XSCOPE_NAME() {\n return XSCOPE_NAME;\n }\n/**\n * decorates styles with rule info and returns an array of used style property names\n *\n * @param {StyleNode} rules\n * @return {Array<string>}\n */\n decorateStyles(rules) {\n let self = this, props = {}, keyframes = [], ruleIndex = 0;\n StyleUtil.forEachRule(rules, function(rule) {\n self.decorateRule(rule);\n // mark in-order position of ast rule in styles block, used for cache key\n rule.index = ruleIndex++;\n self.collectPropertiesInCssText(rule.propertyInfo.cssText, props);\n }, function onKeyframesRule(rule) {\n keyframes.push(rule);\n });\n // Cache all found keyframes rules for later reference:\n rules._keyframes = keyframes;\n // return this list of property names *consumes* in these styles.\n let names = [];\n for (let i in props) {\n names.push(i);\n }\n return names;\n }\n\n // decorate a single rule with property info\n decorateRule(rule) {\n if (rule.propertyInfo) {\n return rule.propertyInfo;\n }\n let info = {}, properties = {};\n let hasProperties = this.collectProperties(rule, properties);\n if (hasProperties) {\n info.properties = properties;\n // TODO(sorvell): workaround parser seeing mixins as additional rules\n rule['rules'] = null;\n }\n info.cssText = this.collectCssText(rule);\n rule.propertyInfo = info;\n return info;\n }\n\n // collects the custom properties from a rule's cssText\n collectProperties(rule, properties) {\n let info = rule.propertyInfo;\n if (info) {\n if (info.properties) {\n Object.assign(properties, info.properties);\n return true;\n }\n } else {\n let m, rx = RX.VAR_ASSIGN;\n let cssText = rule['parsedCssText'];\n let value;\n let any;\n while ((m = rx.exec(cssText))) {\n // note: group 2 is var, 3 is mixin\n value = (m[2] || m[3]).trim();\n // value of 'inherit' or 'unset' is equivalent to not setting the property here\n if (value !== 'inherit' || value !== 'unset') {\n properties[m[1].trim()] = value;\n }\n any = true;\n }\n return any;\n }\n\n }\n\n // returns cssText of properties that consume variables/mixins\n collectCssText(rule) {\n return this.collectConsumingCssText(rule['parsedCssText']);\n }\n\n // NOTE: we support consumption inside mixin assignment\n // but not production, so strip out {...}\n collectConsumingCssText(cssText) {\n return cssText.replace(RX.BRACKETED, '')\n .replace(RX.VAR_ASSIGN, '');\n }\n\n collectPropertiesInCssText(cssText, props) {\n let m;\n while ((m = RX.VAR_CONSUMED.exec(cssText))) {\n let name = m[1];\n // This regex catches all variable names, and following non-whitespace char\n // If next char is not ':', then variable is a consumer\n if (m[2] !== ':') {\n props[name] = true;\n }\n }\n }\n\n // turns custom properties into realized values.\n reify(props) {\n // big perf optimization here: reify only *own* properties\n // since this object has __proto__ of the element's scope properties\n let names = Object.getOwnPropertyNames(props);\n for (let i=0, n; i < names.length; i++) {\n n = names[i];\n props[n] = this.valueForProperty(props[n], props);\n }\n }\n\n // given a property value, returns the reified value\n // a property value may be:\n // (1) a literal value like: red or 5px;\n // (2) a variable value like: var(--a), var(--a, red), or var(--a, --b) or\n // var(--a, var(--b));\n // (3) a literal mixin value like { properties }. Each of these properties\n // can have values that are: (a) literal, (b) variables, (c) @apply mixins.\n valueForProperty(property, props) {\n // case (1) default\n // case (3) defines a mixin and we have to reify the internals\n if (property) {\n if (property.indexOf(';') >=0) {\n property = this.valueForProperties(property, props);\n } else {\n // case (2) variable\n let self = this;\n let fn = function(prefix, value, fallback, suffix) {\n if (!value) {\n return prefix + suffix;\n }\n let propertyValue = self.valueForProperty(props[value], props);\n // if value is \"initial\", then the variable should be treated as unset\n if (!propertyValue || propertyValue === 'initial') {\n // fallback may be --a or var(--a) or literal\n propertyValue = self.valueForProperty(props[fallback] || fallback, props) ||\n fallback;\n } else if (propertyValue === 'apply-shim-inherit') {\n // CSS build will replace `inherit` with `apply-shim-inherit`\n // for use with native css variables.\n // Since we have full control, we can use `inherit` directly.\n propertyValue = 'inherit';\n }\n return prefix + (propertyValue || '') + suffix;\n };\n property = StyleUtil.processVariableAndFallback(property, fn);\n }\n }\n return property && property.trim() || '';\n }\n\n // note: we do not yet support mixin within mixin\n valueForProperties(property, props) {\n let parts = property.split(';');\n for (let i=0, p, m; i<parts.length; i++) {\n if ((p = parts[i])) {\n RX.MIXIN_MATCH.lastIndex = 0;\n m = RX.MIXIN_MATCH.exec(p);\n if (m) {\n p = this.valueForProperty(props[m[1]], props);\n } else {\n let colon = p.indexOf(':');\n if (colon !== -1) {\n let pp = p.substring(colon);\n pp = pp.trim();\n pp = this.valueForProperty(pp, props) || pp;\n p = p.substring(0, colon) + pp;\n }\n }\n parts[i] = (p && p.lastIndexOf(';') === p.length - 1) ?\n // strip trailing ;\n p.slice(0, -1) :\n p || '';\n }\n }\n return parts.join(';');\n }\n\n applyProperties(rule, props) {\n let output = '';\n // dynamically added sheets may not be decorated so ensure they are.\n if (!rule.propertyInfo) {\n this.decorateRule(rule);\n }\n if (rule.propertyInfo.cssText) {\n output = this.valueForProperties(rule.propertyInfo.cssText, props);\n }\n rule['cssText'] = output;\n }\n\n // Apply keyframe transformations to the cssText of a given rule. The\n // keyframeTransforms object is a map of keyframe names to transformer\n // functions which take in cssText and spit out transformed cssText.\n applyKeyframeTransforms(rule, keyframeTransforms) {\n let input = rule['cssText'];\n let output = rule['cssText'];\n if (rule.hasAnimations == null) {\n // Cache whether or not the rule has any animations to begin with:\n rule.hasAnimations = RX.ANIMATION_MATCH.test(input);\n }\n // If there are no animations referenced, we can skip transforms:\n if (rule.hasAnimations) {\n let transform;\n // If we haven't transformed this rule before, we iterate over all\n // transforms:\n if (rule.keyframeNamesToTransform == null) {\n rule.keyframeNamesToTransform = [];\n for (let keyframe in keyframeTransforms) {\n transform = keyframeTransforms[keyframe];\n output = transform(input);\n // If the transform actually changed the CSS text, we cache the\n // transform name for future use:\n if (input !== output) {\n input = output;\n rule.keyframeNamesToTransform.push(keyframe);\n }\n }\n } else {\n // If we already have a list of keyframe names that apply to this\n // rule, we apply only those keyframe name transforms:\n for (let i = 0; i < rule.keyframeNamesToTransform.length; ++i) {\n transform = keyframeTransforms[rule.keyframeNamesToTransform[i]];\n input = transform(input);\n }\n output = input;\n }\n }\n rule['cssText'] = output;\n }\n\n // Test if the rules in these styles matches the given `element` and if so,\n // collect any custom properties into `props`.\n /**\n * @param {StyleNode} rules\n * @param {Element} element\n */\n propertyDataFromStyles(rules, element) {\n let props = {}, self = this;\n // generates a unique key for these matches\n let o = [];\n // note: active rules excludes non-matching @media rules\n StyleUtil.forEachRule(rules, function(rule) {\n // TODO(sorvell): we could trim the set of rules at declaration\n // time to only include ones that have properties\n if (!rule.propertyInfo) {\n self.decorateRule(rule);\n }\n // match element against transformedSelector: selector may contain\n // unwanted uniquification and parsedSelector does not directly match\n // for :host selectors.\n let selectorToMatch = rule.transformedSelector || rule['parsedSelector'];\n if (element && rule.propertyInfo.properties && selectorToMatch) {\n if (matchesSelector.call(element, selectorToMatch)) {\n self.collectProperties(rule, props);\n // produce numeric key for these matches for lookup\n addToBitMask(rule.index, o);\n }\n }\n }, null, true);\n return {properties: props, key: o};\n }\n\n /**\n * @param {Element} scope\n * @param {StyleNode} rule\n * @param {string|undefined} cssBuild\n * @param {function(Object)} callback\n */\n whenHostOrRootRule(scope, rule, cssBuild, callback) {\n if (!rule.propertyInfo) {\n this.decorateRule(rule);\n }\n if (!rule.propertyInfo.properties) {\n return;\n }\n let {is, typeExtension} = StyleUtil.getIsExtends(scope);\n let hostScope = is ?\n StyleTransformer._calcHostScope(is, typeExtension) :\n 'html';\n let parsedSelector = rule['parsedSelector'];\n let isRoot = (parsedSelector === ':host > *' || parsedSelector === 'html');\n let isHost = parsedSelector.indexOf(':host') === 0 && !isRoot;\n // build info is either in scope (when scope is an element) or in the style\n // when scope is the default scope; note: this allows default scope to have\n // mixed mode built and unbuilt styles.\n if (cssBuild === 'shady') {\n // :root -> x-foo > *.x-foo for elements and html for custom-style\n isRoot = parsedSelector === (hostScope + ' > *.' + hostScope) || parsedSelector.indexOf('html') !== -1;\n // :host -> x-foo for elements, but sub-rules have .x-foo in them\n isHost = !isRoot && parsedSelector.indexOf(hostScope) === 0;\n }\n if (cssBuild === 'shadow') {\n isRoot = parsedSelector === ':host > *' || parsedSelector === 'html';\n isHost = isHost && !isRoot;\n }\n if (!isRoot && !isHost) {\n return;\n }\n let selectorToMatch = hostScope;\n if (isHost) {\n // need to transform :host because `:host` does not work with `matches`\n if (!rule.transformedSelector) {\n // transform :host into a matchable selector\n rule.transformedSelector =\n StyleTransformer._transformRuleCss(\n rule,\n StyleTransformer._transformComplexSelector,\n StyleTransformer._calcElementScope(is),\n hostScope\n );\n }\n selectorToMatch = rule.transformedSelector || hostScope;\n }\n callback({\n selector: selectorToMatch,\n isHost: isHost,\n isRoot: isRoot\n });\n }\n/**\n * @param {Element} scope\n * @param {StyleNode} rules\n * @return {Object}\n */\n hostAndRootPropertiesForScope(scope, rules) {\n let hostProps = {}, rootProps = {}, self = this;\n // note: active rules excludes non-matching @media rules\n let cssBuild = rules && rules['__cssBuild'];\n StyleUtil.forEachRule(rules, function(rule) {\n // if scope is StyleDefaults, use _element for matchesSelector\n self.whenHostOrRootRule(scope, rule, cssBuild, function(info) {\n let element = scope._element || scope;\n if (matchesSelector.call(element, info.selector)) {\n if (info.isHost) {\n self.collectProperties(rule, hostProps);\n } else {\n self.collectProperties(rule, rootProps);\n }\n }\n });\n }, null, true);\n return {rootProps: rootProps, hostProps: hostProps};\n }\n\n /**\n * @param {Element} element\n * @param {Object} properties\n * @param {string} scopeSelector\n */\n transformStyles(element, properties, scopeSelector) {\n let self = this;\n let {is, typeExtension} = StyleUtil.getIsExtends(element);\n let hostSelector = StyleTransformer\n ._calcHostScope(is, typeExtension);\n let rxHostSelector = element.extends ?\n '\\\\' + hostSelector.slice(0, -1) + '\\\\]' :\n hostSelector;\n let hostRx = new RegExp(RX.HOST_PREFIX + rxHostSelector +\n RX.HOST_SUFFIX);\n let rules = StyleInfo.get(element).styleRules;\n let keyframeTransforms =\n this._elementKeyframeTransforms(element, rules, scopeSelector);\n return StyleTransformer.elementStyles(element, rules, function(rule) {\n self.applyProperties(rule, properties);\n if (!nativeShadow &&\n !StyleUtil.isKeyframesSelector(rule) &&\n rule['cssText']) {\n // NOTE: keyframe transforms only scope munge animation names, so it\n // is not necessary to apply them in ShadowDOM.\n self.applyKeyframeTransforms(rule, keyframeTransforms);\n self._scopeSelector(rule, hostRx, hostSelector, scopeSelector);\n }\n });\n }\n\n /**\n * @param {Element} element\n * @param {StyleNode} rules\n * @param {string} scopeSelector\n * @return {Object}\n */\n _elementKeyframeTransforms(element, rules, scopeSelector) {\n let keyframesRules = rules._keyframes;\n let keyframeTransforms = {};\n if (!nativeShadow && keyframesRules) {\n // For non-ShadowDOM, we transform all known keyframes rules in\n // advance for the current scope. This allows us to catch keyframes\n // rules that appear anywhere in the stylesheet:\n for (let i = 0, keyframesRule = keyframesRules[i];\n i < keyframesRules.length;\n keyframesRule = keyframesRules[++i]) {\n this._scopeKeyframes(keyframesRule, scopeSelector);\n keyframeTransforms[keyframesRule['keyframesName']] =\n this._keyframesRuleTransformer(keyframesRule);\n }\n }\n return keyframeTransforms;\n }\n\n // Generate a factory for transforming a chunk of CSS text to handle a\n // particular scoped keyframes rule.\n /**\n * @param {StyleNode} keyframesRule\n * @return {function(string):string}\n */\n _keyframesRuleTransformer(keyframesRule) {\n return function(cssText) {\n return cssText.replace(\n keyframesRule.keyframesNameRx,\n keyframesRule.transformedKeyframesName);\n };\n }\n\n/**\n * Transforms `@keyframes` names to be unique for the current host.\n * Example: @keyframes foo-anim -> @keyframes foo-anim-x-foo-0\n *\n * @param {StyleNode} rule\n * @param {string} scopeId\n */\n _scopeKeyframes(rule, scopeId) {\n // Animation names are of the form [\\w-], so ensure that the name regex does not partially apply\n // to similarly named keyframe names by checking for a word boundary at the beginning and\n // a non-word boundary or `-` at the end.\n rule.keyframesNameRx = new RegExp(`\\\\b${rule['keyframesName']}(?!\\\\B|-)`, 'g');\n rule.transformedKeyframesName = rule['keyframesName'] + '-' + scopeId;\n rule.transformedSelector = rule.transformedSelector || rule['selector'];\n rule['selector'] = rule.transformedSelector.replace(\n rule['keyframesName'], rule.transformedKeyframesName);\n }\n\n // Strategy: x scope shim a selector e.g. to scope `.x-foo-42` (via classes):\n // non-host selector: .a.x-foo -> .x-foo-42 .a.x-foo\n // host selector: x-foo.wide -> .x-foo-42.wide\n // note: we use only the scope class (.x-foo-42) and not the hostSelector\n // (x-foo) to scope :host rules; this helps make property host rules\n // have low specificity. They are overrideable by class selectors but,\n // unfortunately, not by type selectors (e.g. overriding via\n // `.special` is ok, but not by `x-foo`).\n /**\n * @param {StyleNode} rule\n * @param {RegExp} hostRx\n * @param {string} hostSelector\n * @param {string} scopeId\n */\n _scopeSelector(rule, hostRx, hostSelector, scopeId) {\n rule.transformedSelector = rule.transformedSelector || rule['selector'];\n let selector = rule.transformedSelector;\n let scope = '.' + scopeId;\n let parts = selector.split(',');\n for (let i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n parts[i] = p.match(hostRx) ?\n p.replace(hostSelector, scope) :\n scope + ' ' + p;\n }\n rule['selector'] = parts.join(',');\n }\n\n /**\n * @param {Element} element\n * @param {string} selector\n * @param {string} old\n */\n applyElementScopeSelector(element, selector, old) {\n let c = element.getAttribute('class') || '';\n let v = c;\n if (old) {\n v = c.replace(\n new RegExp('\\\\s*' + XSCOPE_NAME + '\\\\s*' + old + '\\\\s*', 'g'), ' ');\n }\n v += (v ? ' ' : '') + XSCOPE_NAME + ' ' + selector;\n if (c !== v) {\n StyleUtil.setElementClassRaw(element, v);\n }\n }\n\n /**\n * @param {HTMLElement} element\n * @param {Object} properties\n * @param {string} selector\n * @param {HTMLStyleElement} style\n * @return {HTMLStyleElement}\n */\n applyElementStyle(element, properties, selector, style) {\n // calculate cssText to apply\n let cssText = style ? style.textContent || '' :\n this.transformStyles(element, properties, selector);\n // if shady and we have a cached style that is not style, decrement\n let styleInfo = StyleInfo.get(element);\n let s = styleInfo.customStyle;\n if (s && !nativeShadow && (s !== style)) {\n s['_useCount']--;\n if (s['_useCount'] <= 0 && s.parentNode) {\n s.parentNode.removeChild(s);\n }\n }\n // apply styling always under native or if we generated style\n // or the cached style is not in document(!)\n if (nativeShadow) {\n // update existing style only under native\n if (styleInfo.customStyle) {\n styleInfo.customStyle.textContent = cssText;\n style = styleInfo.customStyle;\n // otherwise, if we have css to apply, do so\n } else if (cssText) {\n // apply css after the scope style of the element to help with\n // style precedence rules.\n style = StyleUtil.applyCss(cssText, selector, element.shadowRoot,\n styleInfo.placeholder);\n }\n } else {\n // shady and no cache hit\n if (!style) {\n // apply css after the scope style of the element to help with\n // style precedence rules.\n if (cssText) {\n style = StyleUtil.applyCss(cssText, selector, null,\n styleInfo.placeholder);\n }\n // shady and cache hit but not in document\n } else if (!style.parentNode) {\n if (IS_IE && cssText.indexOf('@media') > -1) {\n // @media rules may be stale in IE 10 and 11\n // refresh the text content of the style to revalidate them.\n style.textContent = cssText;\n }\n StyleUtil.applyStyle(style, null, styleInfo.placeholder);\n }\n }\n // ensure this style is our custom style and increment its use count.\n if (style) {\n style['_useCount'] = style['_useCount'] || 0;\n // increment use count if we changed styles\n if (styleInfo.customStyle != style) {\n style['_useCount']++;\n }\n styleInfo.customStyle = style;\n }\n return style;\n }\n\n /**\n * @param {Element} style\n * @param {Object} properties\n */\n applyCustomStyle(style, properties) {\n let rules = StyleUtil.rulesForStyle(/** @type {HTMLStyleElement} */(style));\n let self = this;\n style.textContent = StyleUtil.toCssText(rules, function(/** StyleNode */rule) {\n let css = rule['cssText'] = rule['parsedCssText'];\n if (rule.propertyInfo && rule.propertyInfo.cssText) {\n // remove property assignments\n // so next function isn't confused\n // NOTE: we have 3 categories of css:\n // (1) normal properties,\n // (2) custom property assignments (--foo: red;),\n // (3) custom property usage: border: var(--foo); @apply(--foo);\n // In elements, 1 and 3 are separated for efficiency; here they\n // are not and this makes this case unique.\n css = removeCustomPropAssignment(/** @type {string} */(css));\n // replace with reified properties, scenario is same as mixin\n rule['cssText'] = self.valueForProperties(css, properties);\n }\n });\n }\n}\n\n/**\n * @param {number} n\n * @param {Array<number>} bits\n */\nfunction addToBitMask(n, bits) {\n let o = parseInt(n / 32, 10);\n let v = 1 << (n % 32);\n bits[o] = (bits[o] || 0) | v;\n}\n\nexport default new StyleProperties();","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {applyStylePlaceHolder} from './style-util.js';\nimport {nativeShadow} from './style-settings.js';\n\n/** @type {Object<string, !Node>} */\nlet placeholderMap = {};\n\n/**\n * @const {CustomElementRegistry}\n */\nconst ce = window['customElements'];\nif (ce && !nativeShadow) {\n /**\n * @const {function(this:CustomElementRegistry, string,function(new:HTMLElement),{extends: string}=)}\n */\n const origDefine = ce['define'];\n /**\n * @param {string} name\n * @param {function(new:HTMLElement)} clazz\n * @param {{extends: string}=} options\n */\n const wrappedDefine = (name, clazz, options) => {\n placeholderMap[name] = applyStylePlaceHolder(name);\n origDefine.call(/** @type {!CustomElementRegistry} */(ce), name, clazz, options);\n };\n ce['define'] = wrappedDefine;\n}\n\nexport default placeholderMap;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n'use strict';\n\nexport default class StyleCache {\n constructor(typeMax = 100) {\n // map element name -> [{properties, styleElement, scopeSelector}]\n this.cache = {};\n this.typeMax = typeMax;\n }\n\n _validate(cacheEntry, properties, ownPropertyNames) {\n for (let idx = 0; idx < ownPropertyNames.length; idx++) {\n let pn = ownPropertyNames[idx];\n if (cacheEntry.properties[pn] !== properties[pn]) {\n return false;\n }\n }\n return true;\n }\n\n store(tagname, properties, styleElement, scopeSelector) {\n let list = this.cache[tagname] || [];\n list.push({properties, styleElement, scopeSelector});\n if (list.length > this.typeMax) {\n list.shift();\n }\n this.cache[tagname] = list;\n }\n\n fetch(tagname, properties, ownPropertyNames) {\n let list = this.cache[tagname];\n if (!list) {\n return;\n }\n // reverse list for most-recent lookups\n for (let idx = list.length - 1; idx >= 0; idx--) {\n let entry = list[idx];\n if (this._validate(entry, properties, ownPropertyNames)) {\n return entry;\n }\n }\n }\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {nativeShadow} from './style-settings.js';\nimport StyleTransformer from './style-transformer.js';\nimport {getIsExtends} from './style-util.js';\n\nexport let flush = function() {};\n\n/**\n * @param {HTMLElement} element\n * @return {!Array<string>}\n */\nfunction getClasses(element) {\n let classes = [];\n if (element.classList) {\n classes = Array.from(element.classList);\n } else if (element instanceof window['SVGElement'] && element.hasAttribute('class')) {\n classes = element.getAttribute('class').split(/\\s+/);\n }\n return classes;\n}\n\n/**\n * @param {HTMLElement} element\n * @return {string}\n */\nfunction getCurrentScope(element) {\n let classes = getClasses(element);\n let idx = classes.indexOf(StyleTransformer.SCOPE_NAME);\n if (idx > -1) {\n return classes[idx + 1];\n }\n return '';\n}\n\n/**\n * @param {Array<MutationRecord|null>|null} mxns\n */\nfunction handler(mxns) {\n for (let x=0; x < mxns.length; x++) {\n let mxn = mxns[x];\n if (mxn.target === document.documentElement ||\n mxn.target === document.head) {\n continue;\n }\n for (let i=0; i < mxn.addedNodes.length; i++) {\n let n = mxn.addedNodes[i];\n if (n.nodeType !== Node.ELEMENT_NODE) {\n continue;\n }\n n = /** @type {HTMLElement} */(n); // eslint-disable-line no-self-assign\n let root = n.getRootNode();\n let currentScope = getCurrentScope(n);\n // node was scoped, but now is in document\n if (currentScope && root === n.ownerDocument) {\n StyleTransformer.dom(n, currentScope, true);\n } else if (root.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n let newScope;\n let host = /** @type {ShadowRoot} */(root).host;\n // element may no longer be in a shadowroot\n if (!host) {\n continue;\n }\n newScope = getIsExtends(host).is;\n if (currentScope === newScope) {\n // make sure all the subtree elements are scoped correctly\n let unscoped = window['ShadyDOM']['nativeMethods']['querySelectorAll'].call(\n n, `:not(.${StyleTransformer.SCOPE_NAME})`);\n for (let j = 0; j < unscoped.length; j++) {\n StyleTransformer.element(unscoped[j], currentScope);\n }\n continue;\n }\n if (currentScope) {\n StyleTransformer.dom(n, currentScope, true);\n }\n StyleTransformer.dom(n, newScope);\n }\n }\n }\n}\n\nif (!nativeShadow) {\n let observer = new MutationObserver(handler);\n let start = (node) => {\n observer.observe(node, {childList: true, subtree: true});\n }\n let nativeCustomElements = (window['customElements'] &&\n !window['customElements']['polyfillWrapFlushCallback']);\n // need to start immediately with native custom elements\n // TODO(dfreedm): with polyfilled HTMLImports and native custom elements\n // excessive mutations may be observed; this can be optimized via cooperation\n // with the HTMLImports polyfill.\n if (nativeCustomElements) {\n start(document);\n } else {\n let delayedStart = () => {\n start(document.body);\n }\n // use polyfill timing if it's available\n if (window['HTMLImports']) {\n window['HTMLImports']['whenReady'](delayedStart);\n // otherwise push beyond native imports being ready\n // which requires RAF + readystate interactive.\n } else {\n requestAnimationFrame(function() {\n if (document.readyState === 'loading') {\n let listener = function() {\n delayedStart();\n document.removeEventListener('readystatechange', listener);\n }\n document.addEventListener('readystatechange', listener);\n } else {\n delayedStart();\n }\n });\n }\n }\n\n flush = function() {\n handler(observer.takeRecords());\n }\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/**\n * @const {!Object<string, !HTMLTemplateElement>}\n */\nconst templateMap = {};\nexport default templateMap;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\nimport templateMap from './template-map.js';\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\n\n/*\n * Utilities for handling invalidating apply-shim mixins for a given template.\n *\n * The invalidation strategy involves keeping track of the \"current\" version of a template's mixins, and updating that count when a mixin is invalidated.\n * The template\n */\n\n/** @const {string} */\nconst CURRENT_VERSION = '_applyShimCurrentVersion';\n\n/** @const {string} */\nconst NEXT_VERSION = '_applyShimNextVersion';\n\n/** @const {string} */\nconst VALIDATING_VERSION = '_applyShimValidatingVersion';\n\n/**\n * @const {Promise<void>}\n */\nconst promise = Promise.resolve();\n\n/**\n * @param {string} elementName\n */\nexport function invalidate(elementName){\n let template = templateMap[elementName];\n if (template) {\n invalidateTemplate(template);\n }\n}\n\n/**\n * This function can be called multiple times to mark a template invalid\n * and signal that the style inside must be regenerated.\n *\n * Use `startValidatingTemplate` to begin an asynchronous validation cycle.\n * During that cycle, call `templateIsValidating` to see if the template must\n * be revalidated\n * @param {HTMLTemplateElement} template\n */\nexport function invalidateTemplate(template) {\n // default the current version to 0\n template[CURRENT_VERSION] = template[CURRENT_VERSION] || 0;\n // ensure the \"validating for\" flag exists\n template[VALIDATING_VERSION] = template[VALIDATING_VERSION] || 0;\n // increment the next version\n template[NEXT_VERSION] = (template[NEXT_VERSION] || 0) + 1;\n}\n\n/**\n * @param {string} elementName\n * @return {boolean}\n */\nexport function isValid(elementName) {\n let template = templateMap[elementName];\n if (template) {\n return templateIsValid(template);\n }\n return true;\n}\n\n/**\n * @param {HTMLTemplateElement} template\n * @return {boolean}\n */\nexport function templateIsValid(template) {\n return template[CURRENT_VERSION] === template[NEXT_VERSION];\n}\n\n/**\n * @param {string} elementName\n * @return {boolean}\n */\nexport function isValidating(elementName) {\n let template = templateMap[elementName];\n if (template) {\n return templateIsValidating(template);\n }\n return false;\n}\n\n/**\n * Returns true if the template is currently invalid and `startValidating` has been called since the last invalidation.\n * If false, the template must be validated.\n * @param {HTMLTemplateElement} template\n * @return {boolean}\n */\nexport function templateIsValidating(template) {\n return !templateIsValid(template) && template[VALIDATING_VERSION] === template[NEXT_VERSION];\n}\n\n/**\n * the template is marked as `validating` for one microtask so that all instances\n * found in the tree crawl of `applyStyle` will update themselves,\n * but the template will only be updated once.\n * @param {string} elementName\n*/\nexport function startValidating(elementName) {\n let template = templateMap[elementName];\n startValidatingTemplate(template);\n}\n\n/**\n * Begin an asynchronous invalidation cycle.\n * This should be called after every validation of a template\n *\n * After one microtask, the template will be marked as valid until the next call to `invalidateTemplate`\n * @param {HTMLTemplateElement} template\n */\nexport function startValidatingTemplate(template) {\n // remember that the current \"next version\" is the reason for this validation cycle\n template[VALIDATING_VERSION] = template[NEXT_VERSION];\n // however, there only needs to be one async task to clear the counters\n if (!template._validating) {\n template._validating = true;\n promise.then(function() {\n // sync the current version to let future invalidations cause a refresh cycle\n template[CURRENT_VERSION] = template[NEXT_VERSION];\n template._validating = false;\n });\n }\n}\n\n/**\n * @return {boolean}\n */\nexport function elementsAreInvalid() {\n for (let elementName in templateMap) {\n let template = templateMap[elementName];\n if (!templateIsValid(template)) {\n return true;\n }\n }\n return false;\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/** @type {Promise<void>} */\nlet readyPromise = null;\n\n/** @type {?function(?function())} */\nlet whenReady = window['HTMLImports'] && window['HTMLImports']['whenReady'] || null;\n\n/** @type {function()} */\nlet resolveFn;\n\n/**\n * @param {?function()} callback\n */\nexport default function documentWait(callback) {\n requestAnimationFrame(function() {\n if (whenReady) {\n whenReady(callback)\n } else {\n if (!readyPromise) {\n readyPromise = new Promise((resolve) => {resolveFn = resolve});\n if (document.readyState === 'complete') {\n resolveFn();\n } else {\n document.addEventListener('readystatechange', () => {\n if (document.readyState === 'complete') {\n resolveFn();\n }\n });\n }\n }\n readyPromise.then(function(){ callback && callback(); });\n }\n });\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {parse, StyleNode} from './css-parse.js';\nimport {nativeShadow, nativeCssVariables} from './style-settings.js';\nimport StyleTransformer from './style-transformer.js';\nimport * as StyleUtil from './style-util.js';\nimport StyleProperties from './style-properties.js';\nimport placeholderMap from './style-placeholder.js';\nimport StyleInfo from './style-info.js';\nimport StyleCache from './style-cache.js';\nimport {flush as watcherFlush} from './document-watcher.js';\nimport templateMap from './template-map.js';\nimport * as ApplyShimUtils from './apply-shim-utils.js';\nimport documentWait from './document-wait.js';\nimport {updateNativeProperties, detectMixin} from './common-utils.js';\nimport {CustomStyleInterfaceInterface} from './custom-style-interface.js'; // eslint-disable-line no-unused-vars\n\n/**\n * @const {StyleCache}\n */\nconst styleCache = new StyleCache();\n\nexport default class ScopingShim {\n constructor() {\n this._scopeCounter = {};\n this._documentOwner = document.documentElement;\n let ast = new StyleNode();\n ast['rules'] = [];\n this._documentOwnerStyleInfo = StyleInfo.set(this._documentOwner, new StyleInfo(ast));\n this._elementsHaveApplied = false;\n this._applyShim = null;\n /** @type {?CustomStyleInterfaceInterface} */\n this._customStyleInterface = null;\n documentWait(() => {\n this._ensure();\n });\n }\n flush() {\n watcherFlush();\n }\n _generateScopeSelector(name) {\n let id = this._scopeCounter[name] = (this._scopeCounter[name] || 0) + 1;\n return `${name}-${id}`;\n }\n getStyleAst(style) {\n return StyleUtil.rulesForStyle(style);\n }\n styleAstToString(ast) {\n return StyleUtil.toCssText(ast);\n }\n _gatherStyles(template) {\n return StyleUtil.gatherStyleText(template.content);\n }\n _getCssBuild(template) {\n let style = template.content.querySelector('style');\n if (!style) {\n return '';\n }\n return style.getAttribute('css-build') || '';\n }\n /**\n * Prepare the styling and template for the given element type\n *\n * @param {HTMLTemplateElement} template\n * @param {string} elementName\n * @param {string=} typeExtension\n */\n prepareTemplate(template, elementName, typeExtension) {\n if (template._prepared) {\n return;\n }\n template._prepared = true;\n template.name = elementName;\n template.extends = typeExtension;\n templateMap[elementName] = template;\n let cssBuild = this._getCssBuild(template);\n let cssText = this._gatherStyles(template);\n let info = {\n is: elementName,\n extends: typeExtension,\n __cssBuild: cssBuild,\n };\n if (!nativeShadow) {\n StyleTransformer.dom(template.content, elementName);\n }\n // check if the styling has mixin definitions or uses\n this._ensure();\n let hasMixins = detectMixin(cssText)\n let ast = parse(cssText);\n // only run the applyshim transforms if there is a mixin involved\n if (hasMixins && nativeCssVariables && this._applyShim) {\n this._applyShim['transformRules'](ast, elementName);\n }\n template['_styleAst'] = ast;\n template._cssBuild = cssBuild;\n\n let ownPropertyNames = [];\n if (!nativeCssVariables) {\n ownPropertyNames = StyleProperties.decorateStyles(template['_styleAst']);\n }\n if (!ownPropertyNames.length || nativeCssVariables) {\n let root = nativeShadow ? template.content : null;\n let placeholder = placeholderMap[elementName];\n let style = this._generateStaticStyle(info, template['_styleAst'], root, placeholder);\n template._style = style;\n }\n template._ownPropertyNames = ownPropertyNames;\n }\n _generateStaticStyle(info, rules, shadowroot, placeholder) {\n let cssText = StyleTransformer.elementStyles(info, rules);\n if (cssText.length) {\n return StyleUtil.applyCss(cssText, info.is, shadowroot, placeholder);\n }\n }\n _prepareHost(host) {\n let {is, typeExtension} = StyleUtil.getIsExtends(host);\n let placeholder = placeholderMap[is];\n let template = templateMap[is];\n let ast;\n let ownStylePropertyNames;\n let cssBuild;\n if (template) {\n ast = template['_styleAst'];\n ownStylePropertyNames = template._ownPropertyNames;\n cssBuild = template._cssBuild;\n }\n return StyleInfo.set(host,\n new StyleInfo(\n ast,\n placeholder,\n ownStylePropertyNames,\n is,\n typeExtension,\n cssBuild\n )\n );\n }\n _ensureApplyShim() {\n if (this._applyShim) {\n return;\n } else if (window.ShadyCSS && window.ShadyCSS.ApplyShim) {\n this._applyShim = window.ShadyCSS.ApplyShim;\n this._applyShim['invalidCallback'] = ApplyShimUtils.invalidate;\n }\n }\n _ensureCustomStyleInterface() {\n if (this._customStyleInterface) {\n return;\n } else if (window.ShadyCSS && window.ShadyCSS.CustomStyleInterface) {\n this._customStyleInterface = /** @type {!CustomStyleInterfaceInterface} */(window.ShadyCSS.CustomStyleInterface);\n /** @type {function(!HTMLStyleElement)} */\n this._customStyleInterface['transformCallback'] = (style) => {this.transformCustomStyleForDocument(style)};\n this._customStyleInterface['validateCallback'] = () => {\n requestAnimationFrame(() => {\n if (this._customStyleInterface['enqueued'] || this._elementsHaveApplied) {\n this.flushCustomStyles();\n }\n })\n };\n }\n }\n _ensure() {\n this._ensureApplyShim();\n this._ensureCustomStyleInterface();\n }\n /**\n * Flush and apply custom styles to document\n */\n flushCustomStyles() {\n this._ensure();\n if (!this._customStyleInterface) {\n return;\n }\n let customStyles = this._customStyleInterface['processStyles']();\n // early return if custom-styles don't need validation\n if (!this._customStyleInterface['enqueued']) {\n return;\n }\n if (!nativeCssVariables) {\n this._updateProperties(this._documentOwner, this._documentOwnerStyleInfo);\n this._applyCustomStyles(customStyles);\n } else {\n this._revalidateCustomStyleApplyShim(customStyles);\n }\n this._customStyleInterface['enqueued'] = false;\n // if custom elements have upgraded and there are no native css variables, we must recalculate the whole tree\n if (this._elementsHaveApplied && !nativeCssVariables) {\n this.styleDocument();\n }\n }\n /**\n * Apply styles for the given element\n *\n * @param {!HTMLElement} host\n * @param {Object=} overrideProps\n */\n styleElement(host, overrideProps) {\n let {is} = StyleUtil.getIsExtends(host);\n let styleInfo = StyleInfo.get(host);\n if (!styleInfo) {\n styleInfo = this._prepareHost(host);\n }\n // Only trip the `elementsHaveApplied` flag if a node other that the root document has `applyStyle` called\n if (!this._isRootOwner(host)) {\n this._elementsHaveApplied = true;\n }\n if (overrideProps) {\n styleInfo.overrideStyleProperties =\n styleInfo.overrideStyleProperties || {};\n Object.assign(styleInfo.overrideStyleProperties, overrideProps);\n }\n if (!nativeCssVariables) {\n this._updateProperties(host, styleInfo);\n if (styleInfo.ownStylePropertyNames && styleInfo.ownStylePropertyNames.length) {\n this._applyStyleProperties(host, styleInfo);\n }\n } else {\n if (styleInfo.overrideStyleProperties) {\n updateNativeProperties(host, styleInfo.overrideStyleProperties);\n }\n let template = templateMap[is];\n // bail early if there is no shadowroot for this element\n if (!template && !this._isRootOwner(host)) {\n return;\n }\n if (template && template._style && !ApplyShimUtils.templateIsValid(template)) {\n // update template\n if (!ApplyShimUtils.templateIsValidating(template)) {\n this._ensure();\n this._applyShim && this._applyShim['transformRules'](template['_styleAst'], is);\n template._style.textContent = StyleTransformer.elementStyles(host, styleInfo.styleRules);\n ApplyShimUtils.startValidatingTemplate(template);\n }\n // update instance if native shadowdom\n if (nativeShadow) {\n let root = host.shadowRoot;\n if (root) {\n let style = root.querySelector('style');\n style.textContent = StyleTransformer.elementStyles(host, styleInfo.styleRules);\n }\n }\n styleInfo.styleRules = template['_styleAst'];\n }\n }\n }\n _styleOwnerForNode(node) {\n let root = node.getRootNode();\n let host = root.host;\n if (host) {\n if (StyleInfo.get(host)) {\n return host;\n } else {\n return this._styleOwnerForNode(host);\n }\n }\n return this._documentOwner;\n }\n _isRootOwner(node) {\n return (node === this._documentOwner);\n }\n _applyStyleProperties(host, styleInfo) {\n let is = StyleUtil.getIsExtends(host).is;\n let cacheEntry = styleCache.fetch(is, styleInfo.styleProperties, styleInfo.ownStylePropertyNames);\n let cachedScopeSelector = cacheEntry && cacheEntry.scopeSelector;\n let cachedStyle = cacheEntry ? cacheEntry.styleElement : null;\n let oldScopeSelector = styleInfo.scopeSelector;\n // only generate new scope if cached style is not found\n styleInfo.scopeSelector = cachedScopeSelector || this._generateScopeSelector(is);\n let style = StyleProperties.applyElementStyle(host, styleInfo.styleProperties, styleInfo.scopeSelector, cachedStyle);\n if (!nativeShadow) {\n StyleProperties.applyElementScopeSelector(host, styleInfo.scopeSelector, oldScopeSelector);\n }\n if (!cacheEntry) {\n styleCache.store(is, styleInfo.styleProperties, style, styleInfo.scopeSelector);\n }\n return style;\n }\n _updateProperties(host, styleInfo) {\n let owner = this._styleOwnerForNode(host);\n let ownerStyleInfo = StyleInfo.get(owner);\n let ownerProperties = ownerStyleInfo.styleProperties;\n let props = Object.create(ownerProperties || null);\n let hostAndRootProps = StyleProperties.hostAndRootPropertiesForScope(host, styleInfo.styleRules);\n let propertyData = StyleProperties.propertyDataFromStyles(ownerStyleInfo.styleRules, host);\n let propertiesMatchingHost = propertyData.properties\n Object.assign(\n props,\n hostAndRootProps.hostProps,\n propertiesMatchingHost,\n hostAndRootProps.rootProps\n );\n this._mixinOverrideStyles(props, styleInfo.overrideStyleProperties);\n StyleProperties.reify(props);\n styleInfo.styleProperties = props;\n }\n _mixinOverrideStyles(props, overrides) {\n for (let p in overrides) {\n let v = overrides[p];\n // skip override props if they are not truthy or 0\n // in order to fall back to inherited values\n if (v || v === 0) {\n props[p] = v;\n }\n }\n }\n /**\n * Update styles of the whole document\n *\n * @param {Object=} properties\n */\n styleDocument(properties) {\n this.styleSubtree(this._documentOwner, properties);\n }\n /**\n * Update styles of a subtree\n *\n * @param {!HTMLElement} host\n * @param {Object=} properties\n */\n styleSubtree(host, properties) {\n let root = host.shadowRoot;\n if (root || this._isRootOwner(host)) {\n this.styleElement(host, properties);\n }\n // process the shadowdom children of `host`\n let shadowChildren = root && (root.children || root.childNodes);\n if (shadowChildren) {\n for (let i = 0; i < shadowChildren.length; i++) {\n let c = /** @type {!HTMLElement} */(shadowChildren[i]);\n this.styleSubtree(c);\n }\n } else {\n // process the lightdom children of `host`\n let children = host.children || host.childNodes;\n if (children) {\n for (let i = 0; i < children.length; i++) {\n let c = /** @type {!HTMLElement} */(children[i]);\n this.styleSubtree(c);\n }\n }\n }\n }\n /* Custom Style operations */\n _revalidateCustomStyleApplyShim(customStyles) {\n for (let i = 0; i < customStyles.length; i++) {\n let c = customStyles[i];\n let s = this._customStyleInterface['getStyleForCustomStyle'](c);\n if (s) {\n this._revalidateApplyShim(s);\n }\n }\n }\n _applyCustomStyles(customStyles) {\n for (let i = 0; i < customStyles.length; i++) {\n let c = customStyles[i];\n let s = this._customStyleInterface['getStyleForCustomStyle'](c);\n if (s) {\n StyleProperties.applyCustomStyle(s, this._documentOwnerStyleInfo.styleProperties);\n }\n }\n }\n transformCustomStyleForDocument(style) {\n let ast = StyleUtil.rulesForStyle(style);\n StyleUtil.forEachRule(ast, (rule) => {\n if (nativeShadow) {\n StyleTransformer.normalizeRootSelector(rule);\n } else {\n StyleTransformer.documentRule(rule);\n }\n if (nativeCssVariables) {\n this._ensure();\n this._applyShim && this._applyShim['transformRule'](rule);\n }\n });\n if (nativeCssVariables) {\n style.textContent = StyleUtil.toCssText(ast);\n } else {\n this._documentOwnerStyleInfo.styleRules['rules'].push(ast);\n }\n }\n _revalidateApplyShim(style) {\n if (nativeCssVariables && this._applyShim) {\n let ast = StyleUtil.rulesForStyle(style);\n this._ensure();\n this._applyShim['transformRules'](ast);\n style.textContent = StyleUtil.toCssText(ast);\n }\n }\n getComputedStyleValue(element, property) {\n let value;\n if (!nativeCssVariables) {\n // element is either a style host, or an ancestor of a style host\n let styleInfo = StyleInfo.get(element) || StyleInfo.get(this._styleOwnerForNode(element));\n value = styleInfo.styleProperties[property];\n }\n // fall back to the property value from the computed styling\n value = value || window.getComputedStyle(element).getPropertyValue(property);\n // trim whitespace that can come after the `:` in css\n // example: padding: 2px -> \" 2px\"\n return value ? value.trim() : '';\n }\n // given an element and a classString, replaces\n // the element's class with the provided classString and adds\n // any necessary ShadyCSS static and property based scoping selectors\n setElementClass(element, classString) {\n let root = element.getRootNode();\n let classes = classString ? classString.split(/\\s/) : [];\n let scopeName = root.host && root.host.localName;\n // If no scope, try to discover scope name from existing class.\n // This can occur if, for example, a template stamped element that\n // has been scoped is manipulated when not in a root.\n if (!scopeName) {\n var classAttr = element.getAttribute('class');\n if (classAttr) {\n let k$ = classAttr.split(/\\s/);\n for (let i=0; i < k$.length; i++) {\n if (k$[i] === StyleTransformer.SCOPE_NAME) {\n scopeName = k$[i+1];\n break;\n }\n }\n }\n }\n if (scopeName) {\n classes.push(StyleTransformer.SCOPE_NAME, scopeName);\n }\n if (!nativeCssVariables) {\n let styleInfo = StyleInfo.get(element);\n if (styleInfo && styleInfo.scopeSelector) {\n classes.push(StyleProperties.XSCOPE_NAME, styleInfo.scopeSelector);\n }\n }\n StyleUtil.setElementClassRaw(element, classes.join(' '));\n }\n _styleInfoForNode(node) {\n return StyleInfo.get(node);\n }\n}\n\n/* exports */\nScopingShim.prototype['flush'] = ScopingShim.prototype.flush;\nScopingShim.prototype['prepareTemplate'] = ScopingShim.prototype.prepareTemplate;\nScopingShim.prototype['styleElement'] = ScopingShim.prototype.styleElement;\nScopingShim.prototype['styleDocument'] = ScopingShim.prototype.styleDocument;\nScopingShim.prototype['styleSubtree'] = ScopingShim.prototype.styleSubtree;\nScopingShim.prototype['getComputedStyleValue'] = ScopingShim.prototype.getComputedStyleValue;\nScopingShim.prototype['setElementClass'] = ScopingShim.prototype.setElementClass;\nScopingShim.prototype['_styleInfoForNode'] = ScopingShim.prototype._styleInfoForNode;\nScopingShim.prototype['transformCustomStyleForDocument'] = ScopingShim.prototype.transformCustomStyleForDocument;\nScopingShim.prototype['getStyleAst'] = ScopingShim.prototype.getStyleAst;\nScopingShim.prototype['styleAstToString'] = ScopingShim.prototype.styleAstToString;\nScopingShim.prototype['flushCustomStyles'] = ScopingShim.prototype.flushCustomStyles;\nObject.defineProperties(ScopingShim.prototype, {\n 'nativeShadow': {\n get() {\n return nativeShadow;\n }\n },\n 'nativeCss': {\n get() {\n return nativeCssVariables;\n }\n }\n});\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport { MIXIN_MATCH, VAR_ASSIGN } from './common-regex.js';\n\n/**\n * @param {Element} element\n * @param {Object=} properties\n */\nexport function updateNativeProperties(element, properties) {\n // remove previous properties\n for (let p in properties) {\n // NOTE: for bc with shim, don't apply null values.\n if (p === null) {\n element.style.removeProperty(p);\n } else {\n element.style.setProperty(p, properties[p]);\n }\n }\n}\n\n/**\n * @param {Element} element\n * @param {string} property\n * @return {string}\n */\nexport function getComputedStyleValue(element, property) {\n /**\n * @const {string}\n */\n const value = window.getComputedStyle(element).getPropertyValue(property);\n if (!value) {\n return '';\n } else {\n return value.trim();\n }\n}\n\n/**\n * return true if `cssText` contains a mixin definition or consumption\n * @param {string} cssText\n * @return {boolean}\n */\nexport function detectMixin(cssText) {\n const has = MIXIN_MATCH.test(cssText) || VAR_ASSIGN.test(cssText);\n // reset state of the regexes\n MIXIN_MATCH.lastIndex = 0;\n VAR_ASSIGN.lastIndex = 0;\n return has;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport ScopingShim from '../src/scoping-shim.js';\nimport {nativeCssVariables, nativeShadow} from '../src/style-settings.js';\n\n/** @const {ScopingShim} */\nconst scopingShim = new ScopingShim();\n\nlet ApplyShim, CustomStyleInterface;\n\nif (window['ShadyCSS']) {\n ApplyShim = window['ShadyCSS']['ApplyShim'];\n CustomStyleInterface = window['ShadyCSS']['CustomStyleInterface'];\n}\n\nwindow.ShadyCSS = {\n ScopingShim: scopingShim,\n /**\n * @param {!HTMLTemplateElement} template\n * @param {string} elementName\n * @param {string=} elementExtends\n */\n prepareTemplate(template, elementName, elementExtends) {\n scopingShim.flushCustomStyles();\n scopingShim.prepareTemplate(template, elementName, elementExtends)\n },\n\n /**\n * @param {!HTMLElement} element\n * @param {Object=} properties\n */\n styleSubtree(element, properties) {\n scopingShim.flushCustomStyles();\n scopingShim.styleSubtree(element, properties);\n },\n\n /**\n * @param {!HTMLElement} element\n */\n styleElement(element) {\n scopingShim.flushCustomStyles();\n scopingShim.styleElement(element);\n },\n\n /**\n * @param {Object=} properties\n */\n styleDocument(properties) {\n scopingShim.flushCustomStyles();\n scopingShim.styleDocument(properties);\n },\n\n /**\n * @param {Element} element\n * @param {string} property\n * @return {string}\n */\n getComputedStyleValue(element, property) {\n return scopingShim.getComputedStyleValue(element, property);\n },\n\n nativeCss: nativeCssVariables,\n\n nativeShadow: nativeShadow\n};\n\nif (ApplyShim) {\n window.ShadyCSS.ApplyShim = ApplyShim;\n}\n\nif (CustomStyleInterface) {\n window.ShadyCSS.CustomStyleInterface = CustomStyleInterface;\n}","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n'use strict';\n\nlet customElements = window['customElements'];\nlet HTMLImports = window['HTMLImports'];\nlet Template = window['HTMLTemplateElement'];\n\n// global for (1) existence means `WebComponentsReady` will file,\n// (2) WebComponents.ready == true means event has fired.\nwindow.WebComponents = window.WebComponents || {};\n\nif (customElements && customElements['polyfillWrapFlushCallback']) {\n // Here we ensure that the public `HTMLImports.whenReady`\n // always comes *after* custom elements have upgraded.\n let flushCallback;\n let runAndClearCallback = function runAndClearCallback() {\n if (flushCallback) {\n // make sure to run the HTMLTemplateElement polyfill before custom elements upgrade\n if (Template.bootstrap) {\n Template.bootstrap(window.document);\n }\n let cb = flushCallback;\n flushCallback = null;\n cb();\n return true;\n }\n }\n let origWhenReady = HTMLImports['whenReady'];\n customElements['polyfillWrapFlushCallback'](function(cb) {\n flushCallback = cb;\n origWhenReady(runAndClearCallback);\n });\n\n HTMLImports['whenReady'] = function(cb) {\n origWhenReady(function() {\n // custom element code may add dynamic imports\n // to match processing of native custom elements before\n // domContentLoaded, we wait for these imports to resolve first.\n if (runAndClearCallback()) {\n HTMLImports['whenReady'](cb);\n } else {\n cb();\n }\n });\n }\n\n}\n\nHTMLImports['whenReady'](function() {\n requestAnimationFrame(function() {\n window.WebComponents.ready = true;\n document.dispatchEvent(new CustomEvent('WebComponentsReady', {bubbles: true}));\n });\n});","/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n'use strict';\n// It's desireable to provide a default stylesheet\n// that's convenient for styling unresolved elements, but\n// it's cumbersome to have to include this manually in every page.\n// It would make sense to put inside some HTMLImport but\n// the HTMLImports polyfill does not allow loading of stylesheets\n// that block rendering. Therefore this injection is tolerated here.\n//\n// NOTE: position: relative fixes IE's failure to inherit opacity\n// when a child is not statically positioned.\nlet style = document.createElement('style');\nstyle.textContent = ''\n + 'body {'\n + 'transition: opacity ease-in 0.2s;'\n + ' } \\n'\n + 'body[unresolved] {'\n + 'opacity: 0; display: block; overflow: hidden; position: relative;'\n + ' } \\n'\n ;\nlet head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);"]} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-loader.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-loader.js
new file mode 100644
index 00000000000..661285e861f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-loader.js
@@ -0,0 +1,74 @@
+/**
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+(function() {
+ 'use strict';
+ // global for (1) existence means `WebComponentsReady` will fire,
+ // (2) WebComponents.ready == true means event has fired.
+ window.WebComponents = window.WebComponents || {};
+ var name = 'webcomponents-loader.js';
+ // Feature detect which polyfill needs to be imported.
+ var polyfills = [];
+ if (!('import' in document.createElement('link'))) {
+ polyfills.push('hi');
+ }
+ if (!('attachShadow' in Element.prototype && 'getRootNode' in Element.prototype) ||
+ (window.ShadyDOM && window.ShadyDOM.force)) {
+ polyfills.push('sd');
+ }
+ if (!window.customElements || window.customElements.forcePolyfill) {
+ polyfills.push('ce');
+ }
+ // NOTE: any browser that does not have template or ES6 features
+ // must load the full suite (called `lite` for legacy reasons) of polyfills.
+ if (!('content' in document.createElement('template')) || !window.Promise || !Array.from ||
+ // Edge has broken fragment cloning which means you cannot clone template.content
+ !(document.createDocumentFragment().cloneNode() instanceof DocumentFragment)) {
+ polyfills = ['lite'];
+ }
+
+ if (polyfills.length) {
+ var script = document.querySelector('script[src*="' + name +'"]');
+ var newScript = document.createElement('script');
+ // Load it from the right place.
+ var replacement = 'webcomponents-' + polyfills.join('-') + '.js';
+ var url = script.src.replace(name, replacement);
+ newScript.src = url;
+ // NOTE: this is required to ensure the polyfills are loaded before
+ // *native* html imports load on older Chrome versions. This *is* CSP
+ // compliant since CSP rules must have allowed this script to run.
+ // In all other cases, this can be async.
+ if (document.readyState === 'loading' && ('import' in document.createElement('link'))) {
+ document.write(newScript.outerHTML);
+ } else {
+ document.head.appendChild(newScript);
+ }
+ } else {
+ // Ensure `WebComponentsReady` is fired also when there are no polyfills loaded.
+ // however, we have to wait for the document to be in 'interactive' state,
+ // otherwise a rAF may fire before scripts in <body>
+
+ var fire = function() {
+ requestAnimationFrame(function() {
+ window.WebComponents.ready = true;
+ document.dispatchEvent(new CustomEvent('WebComponentsReady', {bubbles: true}));
+ });
+ };
+
+ if (document.readyState !== 'loading') {
+ fire();
+ } else {
+ document.addEventListener('readystatechange', function wait() {
+ fire();
+ document.removeEventListener('readystatechange', wait);
+ });
+ }
+ }
+})();
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-sd-ce.js b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-sd-ce.js
new file mode 100644
index 00000000000..6227827a0dc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-sd-ce.js
@@ -0,0 +1,172 @@
+/**
+@license @nocompile
+Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+(function(){/*
+
+Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+'use strict';var n,p="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this,aa="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)};function ba(){ba=function(){};p.Symbol||(p.Symbol=ca)}var ca=function(){var a=0;return function(b){return"jscomp_symbol_"+(b||"")+a++}}();
+function da(){ba();var a=p.Symbol.iterator;a||(a=p.Symbol.iterator=p.Symbol("iterator"));"function"!=typeof Array.prototype[a]&&aa(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return ea(this)}});da=function(){}}function ea(a){var b=0;return fa(function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}})}function fa(a){da();a={next:a};a[p.Symbol.iterator]=function(){return this};return a}function ha(a){da();var b=a[Symbol.iterator];return b?b.call(a):ea(a)}
+function ia(a){for(var b,c=[];!(b=a.next()).done;)c.push(b.value);return c}function ja(){this.ja=this.root=null;this.P=!1;this.w=this.L=this.aa=this.assignedSlot=this.assignedNodes=this.F=null;this.childNodes=this.nextSibling=this.previousSibling=this.lastChild=this.firstChild=this.parentNode=this.H=void 0;this.oa=this.da=!1}ja.prototype.toJSON=function(){return{}};function r(a){a.W||(a.W=new ja);return a.W}function t(a){return a&&a.W};var u=window.ShadyDOM||{};u.ya=!(!Element.prototype.attachShadow||!Node.prototype.getRootNode);var ka=Object.getOwnPropertyDescriptor(Node.prototype,"firstChild");u.s=!!(ka&&ka.configurable&&ka.get);u.ha=u.force||!u.ya;var la=navigator.userAgent.match("Trident"),ma=navigator.userAgent.match("Edge");void 0===u.la&&(u.la=u.s&&(la||ma));function v(a){return(a=t(a))&&void 0!==a.firstChild}function w(a){return"ShadyRoot"===a.sa}function x(a){a=a.getRootNode();if(w(a))return a}
+var na=Element.prototype,oa=na.matches||na.matchesSelector||na.mozMatchesSelector||na.msMatchesSelector||na.oMatchesSelector||na.webkitMatchesSelector;function pa(a,b){if(a&&b)for(var c=Object.getOwnPropertyNames(b),d=0,e;d<c.length&&(e=c[d]);d++){var f=Object.getOwnPropertyDescriptor(b,e);f&&Object.defineProperty(a,e,f)}}function qa(a,b){for(var c=[],d=1;d<arguments.length;++d)c[d-1]=arguments[d];for(d=0;d<c.length;d++)pa(a,c[d]);return a}function sa(a,b){for(var c in b)a[c]=b[c]}
+var ta=document.createTextNode(""),ua=0,va=[];(new MutationObserver(function(){for(;va.length;)try{va.shift()()}catch(a){throw ta.textContent=ua++,a;}})).observe(ta,{characterData:!0});function wa(a){va.push(a);ta.textContent=ua++}var xa=!!document.contains;function ya(a,b){for(;b;){if(b==a)return!0;b=b.parentNode}return!1};var za=[],Aa;function Ba(a){Aa||(Aa=!0,wa(Ca));za.push(a)}function Ca(){Aa=!1;for(var a=!!za.length;za.length;)za.shift()();return a}Ca.list=za;function Da(){this.a=!1;this.addedNodes=[];this.removedNodes=[];this.O=new Set}function Ea(a){a.a||(a.a=!0,wa(function(){Fa(a)}))}function Fa(a){if(a.a){a.a=!1;var b=a.takeRecords();b.length&&a.O.forEach(function(a){a(b)})}}Da.prototype.takeRecords=function(){if(this.addedNodes.length||this.removedNodes.length){var a=[{addedNodes:this.addedNodes,removedNodes:this.removedNodes}];this.addedNodes=[];this.removedNodes=[];return a}return[]};
+function Ga(a,b){var c=r(a);c.F||(c.F=new Da);c.F.O.add(b);var d=c.F;return{qa:b,B:d,ta:a,takeRecords:function(){return d.takeRecords()}}}function Ha(a){var b=a&&a.B;b&&(b.O.delete(a.qa),b.O.size||(r(a.ta).F=null))}
+function Ia(a,b){var c=b.getRootNode();return a.map(function(a){var b=c===a.target.getRootNode();if(b&&a.addedNodes){if(b=Array.from(a.addedNodes).filter(function(a){return c===a.getRootNode()}),b.length)return a=Object.create(a),Object.defineProperty(a,"addedNodes",{value:b,configurable:!0}),a}else if(b)return a}).filter(function(a){return a})};var y={},Ja=Element.prototype.insertBefore,Ka=Element.prototype.replaceChild,La=Element.prototype.removeChild,Ma=Element.prototype.setAttribute,Na=Element.prototype.removeAttribute,Oa=Element.prototype.cloneNode,Pa=Document.prototype.importNode,Qa=Element.prototype.addEventListener,Ra=Element.prototype.removeEventListener,Sa=Window.prototype.addEventListener,Ta=Window.prototype.removeEventListener,Ua=Element.prototype.dispatchEvent,Va=Node.prototype.contains||HTMLElement.prototype.contains,Wa=Document.prototype.getElementById,
+Xa=Element.prototype.querySelector,Ya=DocumentFragment.prototype.querySelector,Za=Document.prototype.querySelector,$a=Element.prototype.querySelectorAll,ab=DocumentFragment.prototype.querySelectorAll,bb=Document.prototype.querySelectorAll;y.appendChild=Element.prototype.appendChild;y.insertBefore=Ja;y.replaceChild=Ka;y.removeChild=La;y.setAttribute=Ma;y.removeAttribute=Na;y.cloneNode=Oa;y.importNode=Pa;y.addEventListener=Qa;y.removeEventListener=Ra;y.Ha=Sa;y.Ia=Ta;y.dispatchEvent=Ua;y.contains=Va;
+y.getElementById=Wa;y.Qa=Xa;y.Ta=Ya;y.Oa=Za;y.querySelector=function(a){switch(this.nodeType){case Node.ELEMENT_NODE:return Xa.call(this,a);case Node.DOCUMENT_NODE:return Za.call(this,a);default:return Ya.call(this,a)}};y.Ra=$a;y.Ua=ab;y.Pa=bb;y.querySelectorAll=function(a){switch(this.nodeType){case Node.ELEMENT_NODE:return $a.call(this,a);case Node.DOCUMENT_NODE:return bb.call(this,a);default:return ab.call(this,a)}};var cb=/[&\u00A0"]/g,db=/[&\u00A0<>]/g;function eb(a){switch(a){case "&":return"&amp;";case "<":return"&lt;";case ">":return"&gt;";case '"':return"&quot;";case "\u00a0":return"&nbsp;"}}function fb(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}var gb=fb("area base br col command embed hr img input keygen link meta param source track wbr".split(" ")),hb=fb("style script xmp iframe noembed noframes plaintext noscript".split(" "));
+function ib(a,b){"template"===a.localName&&(a=a.content);for(var c="",d=b?b(a):a.childNodes,e=0,f=d.length,g;e<f&&(g=d[e]);e++){a:{var h=g;var k=a;var l=b;switch(h.nodeType){case Node.ELEMENT_NODE:for(var m=h.localName,q="<"+m,O=h.attributes,L=0;k=O[L];L++)q+=" "+k.name+'="'+k.value.replace(cb,eb)+'"';q+=">";h=gb[m]?q:q+ib(h,l)+"</"+m+">";break a;case Node.TEXT_NODE:h=h.data;h=k&&hb[k.localName]?h:h.replace(db,eb);break a;case Node.COMMENT_NODE:h="\x3c!--"+h.data+"--\x3e";break a;default:throw window.console.error(h),
+Error("not implemented");}}c+=h}return c};var z={},A=document.createTreeWalker(document,NodeFilter.SHOW_ALL,null,!1),B=document.createTreeWalker(document,NodeFilter.SHOW_ELEMENT,null,!1);function jb(a){var b=[];A.currentNode=a;for(a=A.firstChild();a;)b.push(a),a=A.nextSibling();return b}z.parentNode=function(a){A.currentNode=a;return A.parentNode()};z.firstChild=function(a){A.currentNode=a;return A.firstChild()};z.lastChild=function(a){A.currentNode=a;return A.lastChild()};z.previousSibling=function(a){A.currentNode=a;return A.previousSibling()};
+z.nextSibling=function(a){A.currentNode=a;return A.nextSibling()};z.childNodes=jb;z.parentElement=function(a){B.currentNode=a;return B.parentNode()};z.firstElementChild=function(a){B.currentNode=a;return B.firstChild()};z.lastElementChild=function(a){B.currentNode=a;return B.lastChild()};z.previousElementSibling=function(a){B.currentNode=a;return B.previousSibling()};z.nextElementSibling=function(a){B.currentNode=a;return B.nextSibling()};
+z.children=function(a){var b=[];B.currentNode=a;for(a=B.firstChild();a;)b.push(a),a=B.nextSibling();return b};z.innerHTML=function(a){return ib(a,function(a){return jb(a)})};z.textContent=function(a){switch(a.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:a=document.createTreeWalker(a,NodeFilter.SHOW_TEXT,null,!1);for(var b="",c;c=a.nextNode();)b+=c.nodeValue;return b;default:return a.nodeValue}};var C={},kb=u.s,lb=[Node.prototype,Element.prototype,HTMLElement.prototype];function D(a){var b;a:{for(b=0;b<lb.length;b++){var c=lb[b];if(c.hasOwnProperty(a)){b=c;break a}}b=void 0}if(!b)throw Error("Could not find descriptor for "+a);return Object.getOwnPropertyDescriptor(b,a)}
+var E=kb?{parentNode:D("parentNode"),firstChild:D("firstChild"),lastChild:D("lastChild"),previousSibling:D("previousSibling"),nextSibling:D("nextSibling"),childNodes:D("childNodes"),parentElement:D("parentElement"),previousElementSibling:D("previousElementSibling"),nextElementSibling:D("nextElementSibling"),innerHTML:D("innerHTML"),textContent:D("textContent"),firstElementChild:D("firstElementChild"),lastElementChild:D("lastElementChild"),children:D("children")}:{},mb=kb?{firstElementChild:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,
+"firstElementChild"),lastElementChild:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,"lastElementChild"),children:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,"children")}:{},nb=kb?{firstElementChild:Object.getOwnPropertyDescriptor(Document.prototype,"firstElementChild"),lastElementChild:Object.getOwnPropertyDescriptor(Document.prototype,"lastElementChild"),children:Object.getOwnPropertyDescriptor(Document.prototype,"children")}:{};C.ia=E;C.Sa=mb;C.Na=nb;C.parentNode=function(a){return E.parentNode.get.call(a)};
+C.firstChild=function(a){return E.firstChild.get.call(a)};C.lastChild=function(a){return E.lastChild.get.call(a)};C.previousSibling=function(a){return E.previousSibling.get.call(a)};C.nextSibling=function(a){return E.nextSibling.get.call(a)};C.childNodes=function(a){return Array.prototype.slice.call(E.childNodes.get.call(a))};C.parentElement=function(a){return E.parentElement.get.call(a)};C.previousElementSibling=function(a){return E.previousElementSibling.get.call(a)};C.nextElementSibling=function(a){return E.nextElementSibling.get.call(a)};
+C.innerHTML=function(a){return E.innerHTML.get.call(a)};C.textContent=function(a){return E.textContent.get.call(a)};C.children=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:a=mb.children.get.call(a);break;case Node.DOCUMENT_NODE:a=nb.children.get.call(a);break;default:a=E.children.get.call(a)}return Array.prototype.slice.call(a)};
+C.firstElementChild=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return mb.firstElementChild.get.call(a);case Node.DOCUMENT_NODE:return nb.firstElementChild.get.call(a);default:return E.firstElementChild.get.call(a)}};C.lastElementChild=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return mb.lastElementChild.get.call(a);case Node.DOCUMENT_NODE:return nb.lastElementChild.get.call(a);default:return E.lastElementChild.get.call(a)}};var F=u.la?C:z;function ob(a){for(;a.firstChild;)a.removeChild(a.firstChild)}
+var pb=u.s,qb=document.implementation.createHTMLDocument("inert"),rb=Object.getOwnPropertyDescriptor(Node.prototype,"isConnected"),sb=rb&&rb.get,tb=Object.getOwnPropertyDescriptor(Document.prototype,"activeElement"),ub={parentElement:{get:function(){var a=t(this);(a=a&&a.parentNode)&&a.nodeType!==Node.ELEMENT_NODE&&(a=null);return void 0!==a?a:F.parentElement(this)},configurable:!0},parentNode:{get:function(){var a=t(this);a=a&&a.parentNode;return void 0!==a?a:F.parentNode(this)},configurable:!0},
+nextSibling:{get:function(){var a=t(this);a=a&&a.nextSibling;return void 0!==a?a:F.nextSibling(this)},configurable:!0},previousSibling:{get:function(){var a=t(this);a=a&&a.previousSibling;return void 0!==a?a:F.previousSibling(this)},configurable:!0},nextElementSibling:{get:function(){var a=t(this);if(a&&void 0!==a.nextSibling){for(a=this.nextSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}return F.nextElementSibling(this)},configurable:!0},previousElementSibling:{get:function(){var a=
+t(this);if(a&&void 0!==a.previousSibling){for(a=this.previousSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}return F.previousElementSibling(this)},configurable:!0}},vb={className:{get:function(){return this.getAttribute("class")||""},set:function(a){this.setAttribute("class",a)},configurable:!0}},wb={childNodes:{get:function(){if(v(this)){var a=t(this);if(!a.childNodes){a.childNodes=[];for(var b=this.firstChild;b;b=b.nextSibling)a.childNodes.push(b)}var c=a.childNodes}else c=
+F.childNodes(this);c.item=function(a){return c[a]};return c},configurable:!0},childElementCount:{get:function(){return this.children.length},configurable:!0},firstChild:{get:function(){var a=t(this);a=a&&a.firstChild;return void 0!==a?a:F.firstChild(this)},configurable:!0},lastChild:{get:function(){var a=t(this);a=a&&a.lastChild;return void 0!==a?a:F.lastChild(this)},configurable:!0},textContent:{get:function(){if(v(this)){for(var a=[],b=0,c=this.childNodes,d;d=c[b];b++)d.nodeType!==Node.COMMENT_NODE&&
+a.push(d.textContent);return a.join("")}return F.textContent(this)},set:function(a){if("undefined"===typeof a||null===a)a="";switch(this.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:if(!v(this)&&pb){var b=this.firstChild;(b!=this.lastChild||b&&b.nodeType!=Node.TEXT_NODE)&&ob(this);C.ia.textContent.set.call(this,a)}else ob(this),(0<a.length||this.nodeType===Node.ELEMENT_NODE)&&this.appendChild(document.createTextNode(a));break;default:this.nodeValue=a}},configurable:!0},firstElementChild:{get:function(){var a=
+t(this);if(a&&void 0!==a.firstChild){for(a=this.firstChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}return F.firstElementChild(this)},configurable:!0},lastElementChild:{get:function(){var a=t(this);if(a&&void 0!==a.lastChild){for(a=this.lastChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}return F.lastElementChild(this)},configurable:!0},children:{get:function(){var a=v(this)?Array.prototype.filter.call(this.childNodes,function(a){return a.nodeType===Node.ELEMENT_NODE}):
+F.children(this);a.item=function(b){return a[b]};return a},configurable:!0},innerHTML:{get:function(){return v(this)?ib("template"===this.localName?this.content:this):F.innerHTML(this)},set:function(a){var b="template"===this.localName?this.content:this;ob(b);var c=this.localName;c&&"template"!==c||(c="div");c=qb.createElement(c);for(pb?C.ia.innerHTML.set.call(c,a):c.innerHTML=a;c.firstChild;)b.appendChild(c.firstChild)},configurable:!0}},xb={shadowRoot:{get:function(){var a=t(this);return a&&a.ja||
+null},configurable:!0}},yb={activeElement:{get:function(){var a=tb&&tb.get?tb.get.call(document):u.s?void 0:document.activeElement;if(a&&a.nodeType){var b=!!w(this);if(this===document||b&&this.host!==a&&y.contains.call(this.host,a)){for(b=x(a);b&&b!==this;)a=b.host,b=x(a);a=this===document?b?null:a:b===this?a:null}else a=null}else a=null;return a},set:function(){},configurable:!0}};
+function G(a,b,c){for(var d in b){var e=Object.getOwnPropertyDescriptor(a,d);e&&e.configurable||!e&&c?Object.defineProperty(a,d,b[d]):c&&console.warn("Could not define",d,"on",a)}}function H(a){G(a,ub);G(a,vb);G(a,wb);G(a,yb)}
+function zb(){var a=Ab.prototype;a.__proto__=DocumentFragment.prototype;G(a,ub,!0);G(a,wb,!0);G(a,yb,!0);Object.defineProperties(a,{nodeType:{value:Node.DOCUMENT_FRAGMENT_NODE,configurable:!0},nodeName:{value:"#document-fragment",configurable:!0},nodeValue:{value:null,configurable:!0}});["localName","namespaceURI","prefix"].forEach(function(b){Object.defineProperty(a,b,{value:void 0,configurable:!0})});["ownerDocument","baseURI","isConnected"].forEach(function(b){Object.defineProperty(a,b,{get:function(){return this.host[b]},
+configurable:!0})})}var Bb=u.s?function(){}:function(a){var b=r(a);b.da||(b.da=!0,G(a,ub,!0),G(a,vb,!0))},Cb=u.s?function(){}:function(a){r(a).oa||(G(a,wb,!0),G(a,xb,!0))};var Db=F.childNodes;function Eb(a,b,c){Bb(a);c=c||null;var d=r(a),e=r(b),f=c?r(c):null;d.previousSibling=c?f.previousSibling:b.lastChild;if(f=t(d.previousSibling))f.nextSibling=a;if(f=t(d.nextSibling=c))f.previousSibling=a;d.parentNode=b;c?c===e.firstChild&&(e.firstChild=a):(e.lastChild=a,e.firstChild||(e.firstChild=a));e.childNodes=null}
+function Fb(a,b){var c=r(a);if(void 0===c.firstChild)for(b=b||Db(a),c.firstChild=b[0]||null,c.lastChild=b[b.length-1]||null,Cb(a),c=0;c<b.length;c++){var d=b[c],e=r(d);e.parentNode=a;e.nextSibling=b[c+1]||null;e.previousSibling=b[c-1]||null;Bb(d)}};var Gb=F.parentNode;
+function Hb(a,b,c){if(b===a)throw Error("Failed to execute 'appendChild' on 'Node': The new child element contains the parent.");if(c){var d=t(c);d=d&&d.parentNode;if(void 0!==d&&d!==a||void 0===d&&Gb(c)!==a)throw Error("Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.");}if(c===b)return b;b.parentNode&&Ib(b.parentNode,b);var e,f;if(!b.__noInsertionPoint){if(f=e=x(a)){var g;"slot"===b.localName?g=[b]:b.querySelectorAll&&
+(g=b.querySelectorAll("slot"));f=g&&g.length?g:void 0}f&&(g=e,d=f,g.o=g.o||[],g.f=g.f||[],g.g=g.g||{},g.o.push.apply(g.o,[].concat(d instanceof Array?d:ia(ha(d)))))}("slot"===a.localName||f)&&(e=e||x(a))&&Jb(e);if(v(a)){e=c;Cb(a);f=r(a);void 0!==f.firstChild&&(f.childNodes=null);if(b.nodeType===Node.DOCUMENT_FRAGMENT_NODE){f=b.childNodes;for(g=0;g<f.length;g++)Eb(f[g],a,e);e=r(b);f=void 0!==e.firstChild?null:void 0;e.firstChild=e.lastChild=f;e.childNodes=f}else Eb(b,a,e);e=t(a);if(Kb(a)){Jb(e.root);
+var h=!0}else e.root&&(h=!0)}h||(h=w(a)?a.host:a,c?(c=Lb(c),y.insertBefore.call(h,b,c)):y.appendChild.call(h,b));Mb(a,b);return b}
+function Ib(a,b){if(b.parentNode!==a)throw Error("The node to be removed is not a child of this node: "+b);var c=x(b),d=t(a);if(v(a)){var e=r(b),f=r(a);b===f.firstChild&&(f.firstChild=e.nextSibling);b===f.lastChild&&(f.lastChild=e.previousSibling);var g=e.previousSibling,h=e.nextSibling;g&&(r(g).nextSibling=h);h&&(r(h).previousSibling=g);e.parentNode=e.previousSibling=e.nextSibling=void 0;void 0!==f.childNodes&&(f.childNodes=null);if(Kb(a)){Jb(d.root);var k=!0}}Nb(b);if(c){(e=a&&"slot"===a.localName)&&
+(k=!0);if(c.f){Ob(c);f=c.g;for(ra in f)for(g=f[ra],h=0;h<g.length;h++){var l=g[h];if(ya(b,l)){g.splice(h,1);var m=c.f.indexOf(l);0<=m&&c.f.splice(m,1);h--;m=t(l);if(l=m.w)for(var q=0;q<l.length;q++){var O=l[q],L=Pb(O);L&&y.removeChild.call(L,O)}m.w=[];m.assignedNodes=[];m=!0}}var ra=m}else ra=void 0;(ra||e)&&Jb(c)}k||(k=w(a)?a.host:a,(!d.root&&"slot"!==b.localName||k===Gb(b))&&y.removeChild.call(k,b));Mb(a,null,b);return b}
+function Nb(a){var b=t(a);if(b&&void 0!==b.H){b=a.childNodes;for(var c=0,d=b.length,e;c<d&&(e=b[c]);c++)Nb(e)}if(a=t(a))a.H=void 0}function Lb(a){var b=a;a&&"slot"===a.localName&&(b=(b=(b=t(a))&&b.w)&&b.length?b[0]:Lb(a.nextSibling));return b}function Kb(a){return(a=(a=t(a))&&a.root)&&Qb(a)}
+function Rb(a,b){if("slot"===b)a=a.parentNode,Kb(a)&&Jb(t(a).root);else if("slot"===a.localName&&"name"===b&&(b=x(a))){if(b.f){var c=a.pa,d=Sb(a);if(d!==c){c=b.g[c];var e=c.indexOf(a);0<=e&&c.splice(e,1);c=b.g[d]||(b.g[d]=[]);c.push(a);1<c.length&&(b.g[d]=Tb(c))}}Jb(b)}}function Mb(a,b,c){if(a=(a=t(a))&&a.F)b&&a.addedNodes.push(b),c&&a.removedNodes.push(c),Ea(a)}
+function Ub(a){if(a&&a.nodeType){var b=r(a),c=b.H;void 0===c&&(w(a)?(c=a,b.H=c):(c=(c=a.parentNode)?Ub(c):a,y.contains.call(document.documentElement,a)&&(b.H=c)));return c}}function Vb(a,b,c){var d=[];Wb(a.childNodes,b,c,d);return d}function Wb(a,b,c,d){for(var e=0,f=a.length,g;e<f&&(g=a[e]);e++){var h;if(h=g.nodeType===Node.ELEMENT_NODE){h=g;var k=b,l=c,m=d,q=k(h);q&&m.push(h);l&&l(q)?h=q:(Wb(h.childNodes,k,l,m),h=void 0)}if(h)break}}var Xb=null;
+function Yb(a,b,c){Xb||(Xb=window.ShadyCSS&&window.ShadyCSS.ScopingShim);Xb&&"class"===b?Xb.setElementClass(a,c):(y.setAttribute.call(a,b,c),Rb(a,b))}function Zb(a,b){if(a.ownerDocument!==document)return y.importNode.call(document,a,b);var c=y.importNode.call(document,a,!1);if(b){a=a.childNodes;b=0;for(var d;b<a.length;b++)d=Zb(a[b],!0),c.appendChild(d)}return c};var $b="__eventWrappers"+Date.now(),ac={blur:!0,focus:!0,focusin:!0,focusout:!0,click:!0,dblclick:!0,mousedown:!0,mouseenter:!0,mouseleave:!0,mousemove:!0,mouseout:!0,mouseover:!0,mouseup:!0,wheel:!0,beforeinput:!0,input:!0,keydown:!0,keyup:!0,compositionstart:!0,compositionupdate:!0,compositionend:!0,touchstart:!0,touchend:!0,touchmove:!0,touchcancel:!0,pointerover:!0,pointerenter:!0,pointerdown:!0,pointermove:!0,pointerup:!0,pointercancel:!0,pointerout:!0,pointerleave:!0,gotpointercapture:!0,lostpointercapture:!0,
+dragstart:!0,drag:!0,dragenter:!0,dragleave:!0,dragover:!0,drop:!0,dragend:!0,DOMActivate:!0,DOMFocusIn:!0,DOMFocusOut:!0,keypress:!0};function bc(a,b){var c=[],d=a;for(a=a===window?window:a.getRootNode();d;)c.push(d),d=d.assignedSlot?d.assignedSlot:d.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&d.host&&(b||d!==a)?d.host:d.parentNode;c[c.length-1]===document&&c.push(window);return c}
+function cc(a,b){if(!w)return a;a=bc(a,!0);for(var c=0,d,e,f,g;c<b.length;c++)if(d=b[c],f=d===window?window:d.getRootNode(),f!==e&&(g=a.indexOf(f),e=f),!w(f)||-1<g)return d}
+var dc={get composed(){!1!==this.isTrusted&&void 0===this.U&&(this.U=ac[this.type]);return this.U||!1},composedPath:function(){this.b||(this.b=bc(this.__target,this.composed));return this.b},get target(){return cc(this.currentTarget,this.composedPath())},get relatedTarget(){if(!this.V)return null;this.c||(this.c=bc(this.V,!0));return cc(this.currentTarget,this.c)},stopPropagation:function(){Event.prototype.stopPropagation.call(this);this.a=!0},stopImmediatePropagation:function(){Event.prototype.stopImmediatePropagation.call(this);
+this.a=this.i=!0}};function ec(a){function b(b,d){b=new a(b,d);b.U=d&&!!d.composed;return b}sa(b,a);b.prototype=a.prototype;return b}var fc={focus:!0,blur:!0};function gc(a){return a.__target!==a.target||a.V!==a.relatedTarget}function hc(a,b,c){if(c=b.__handlers&&b.__handlers[a.type]&&b.__handlers[a.type][c])for(var d=0,e;(e=c[d])&&(!gc(a)||a.target!==a.relatedTarget)&&(e.call(b,a),!a.i);d++);}
+function ic(a){var b=a.composedPath();Object.defineProperty(a,"currentTarget",{get:function(){return d},configurable:!0});for(var c=b.length-1;0<=c;c--){var d=b[c];hc(a,d,"capture");if(a.a)return}Object.defineProperty(a,"eventPhase",{get:function(){return Event.AT_TARGET}});var e;for(c=0;c<b.length;c++){d=b[c];var f=t(d);f=f&&f.root;if(0===c||f&&f===e)if(hc(a,d,"bubble"),d!==window&&(e=d.getRootNode()),a.a)break}}
+function jc(a,b,c,d,e,f){for(var g=0;g<a.length;g++){var h=a[g],k=h.type,l=h.capture,m=h.once,q=h.passive;if(b===h.node&&c===k&&d===l&&e===m&&f===q)return g}return-1}
+function kc(a,b,c){if(b){var d=typeof b;if("function"===d||"object"===d)if("object"!==d||b.handleEvent&&"function"===typeof b.handleEvent){if(c&&"object"===typeof c){var e=!!c.capture;var f=!!c.once;var g=!!c.passive}else e=!!c,g=f=!1;var h=c&&c.X||this,k=b[$b];if(k){if(-1<jc(k,h,a,e,f,g))return}else b[$b]=[];k=function(e){f&&this.removeEventListener(a,b,c);e.__target||lc(e);if(h!==this){var g=Object.getOwnPropertyDescriptor(e,"currentTarget");Object.defineProperty(e,"currentTarget",{get:function(){return h},
+configurable:!0})}if(e.composed||-1<e.composedPath().indexOf(h))if(gc(e)&&e.target===e.relatedTarget)e.eventPhase===Event.BUBBLING_PHASE&&e.stopImmediatePropagation();else if(e.eventPhase===Event.CAPTURING_PHASE||e.bubbles||e.target===h||h instanceof Window){var k="function"===d?b.call(h,e):b.handleEvent&&b.handleEvent(e);h!==this&&(g?(Object.defineProperty(e,"currentTarget",g),g=null):delete e.currentTarget);return k}};b[$b].push({node:h,type:a,capture:e,once:f,passive:g,Ja:k});fc[a]?(this.__handlers=
+this.__handlers||{},this.__handlers[a]=this.__handlers[a]||{capture:[],bubble:[]},this.__handlers[a][e?"capture":"bubble"].push(k)):(this instanceof Window?y.Ha:y.addEventListener).call(this,a,k,c)}}}
+function mc(a,b,c){if(b){if(c&&"object"===typeof c){var d=!!c.capture;var e=!!c.once;var f=!!c.passive}else d=!!c,f=e=!1;var g=c&&c.X||this,h=void 0;var k=null;try{k=b[$b]}catch(l){}k&&(e=jc(k,g,a,d,e,f),-1<e&&(h=k.splice(e,1)[0].Ja,k.length||(b[$b]=void 0)));(this instanceof Window?y.Ia:y.removeEventListener).call(this,a,h||b,c);h&&fc[a]&&this.__handlers&&this.__handlers[a]&&(a=this.__handlers[a][d?"capture":"bubble"],h=a.indexOf(h),-1<h&&a.splice(h,1))}}
+function nc(){for(var a in fc)window.addEventListener(a,function(a){a.__target||(lc(a),ic(a))},!0)}function lc(a){a.__target=a.target;a.V=a.relatedTarget;if(u.s){var b=Object.getPrototypeOf(a);if(!b.hasOwnProperty("__patchProto")){var c=Object.create(b);c.La=b;pa(c,dc);b.__patchProto=c}a.__proto__=b.__patchProto}else pa(a,dc)}var oc=ec(window.Event),pc=ec(window.CustomEvent),qc=ec(window.MouseEvent);function rc(a,b){return{index:a,I:[],N:b}}
+function sc(a,b,c,d){var e=0,f=0,g=0,h=0,k=Math.min(b-e,d-f);if(0==e&&0==f)a:{for(g=0;g<k;g++)if(a[g]!==c[g])break a;g=k}if(b==a.length&&d==c.length){h=a.length;for(var l=c.length,m=0;m<k-g&&tc(a[--h],c[--l]);)m++;h=m}e+=g;f+=g;b-=h;d-=h;if(0==b-e&&0==d-f)return[];if(e==b){for(b=rc(e,0);f<d;)b.I.push(c[f++]);return[b]}if(f==d)return[rc(e,b-e)];k=e;g=f;d=d-g+1;h=b-k+1;b=Array(d);for(l=0;l<d;l++)b[l]=Array(h),b[l][0]=l;for(l=0;l<h;l++)b[0][l]=l;for(l=1;l<d;l++)for(m=1;m<h;m++)if(a[k+m-1]===c[g+l-1])b[l][m]=
+b[l-1][m-1];else{var q=b[l-1][m]+1,O=b[l][m-1]+1;b[l][m]=q<O?q:O}k=b.length-1;g=b[0].length-1;d=b[k][g];for(a=[];0<k||0<g;)0==k?(a.push(2),g--):0==g?(a.push(3),k--):(h=b[k-1][g-1],l=b[k-1][g],m=b[k][g-1],q=l<m?l<h?l:h:m<h?m:h,q==h?(h==d?a.push(0):(a.push(1),d=h),k--,g--):q==l?(a.push(3),k--,d=l):(a.push(2),g--,d=m));a.reverse();b=void 0;k=[];for(g=0;g<a.length;g++)switch(a[g]){case 0:b&&(k.push(b),b=void 0);e++;f++;break;case 1:b||(b=rc(e,0));b.N++;e++;b.I.push(c[f]);f++;break;case 2:b||(b=rc(e,0));
+b.N++;e++;break;case 3:b||(b=rc(e,0)),b.I.push(c[f]),f++}b&&k.push(b);return k}function tc(a,b){return a===b};var Pb=F.parentNode,uc=F.childNodes,vc={};function wc(a){var b=[];do b.unshift(a);while(a=a.parentNode);return b}function Ab(a,b,c){if(a!==vc)throw new TypeError("Illegal constructor");this.sa="ShadyRoot";a=uc(b);this.host=b;this.a=c&&c.mode;Fb(b,a);c=t(b);c.root=this;c.ja="closed"!==this.a?this:null;c=r(this);c.firstChild=c.lastChild=c.parentNode=c.nextSibling=c.previousSibling=null;c.childNodes=[];this.M=!1;this.o=this.g=this.f=null;c=0;for(var d=a.length;c<d;c++)y.removeChild.call(b,a[c])}
+function Jb(a){a.M||(a.M=!0,Ba(function(){return xc(a)}))}function xc(a){for(var b;a;){a.M&&(b=a);a:{var c=a;a=c.host.getRootNode();if(w(a))for(var d=c.host.childNodes,e=0;e<d.length;e++)if(c=d[e],"slot"==c.localName)break a;a=void 0}}b&&b._renderRoot()}
+Ab.prototype._renderRoot=function(){this.M=!1;if(this.f){Ob(this);for(var a=0,b;a<this.f.length;a++){b=this.f[a];var c=t(b),d=c.assignedNodes;c.assignedNodes=[];c.w=[];if(c.aa=d)for(c=0;c<d.length;c++){var e=t(d[c]);e.L=e.assignedSlot;e.assignedSlot===b&&(e.assignedSlot=null)}}for(b=this.host.firstChild;b;b=b.nextSibling)yc(this,b);for(a=0;a<this.f.length;a++){b=this.f[a];d=t(b);if(!d.assignedNodes.length)for(c=b.firstChild;c;c=c.nextSibling)yc(this,c,b);(c=(c=t(b.parentNode))&&c.root)&&Qb(c)&&c._renderRoot();
+zc(this,d.w,d.assignedNodes);if(c=d.aa){for(e=0;e<c.length;e++)t(c[e]).L=null;d.aa=null;c.length>d.assignedNodes.length&&(d.P=!0)}d.P&&(d.P=!1,Ac(this,b))}a=this.f;b=[];for(d=0;d<a.length;d++)c=a[d].parentNode,(e=t(c))&&e.root||!(0>b.indexOf(c))||b.push(c);for(a=0;a<b.length;a++){d=b[a];c=d===this?this.host:d;e=[];d=d.childNodes;for(var f=0;f<d.length;f++){var g=d[f];if("slot"==g.localName){g=t(g).w;for(var h=0;h<g.length;h++)e.push(g[h])}else e.push(g)}d=void 0;f=uc(c);g=sc(e,e.length,f,f.length);
+for(var k=h=0;h<g.length&&(d=g[h]);h++){for(var l=0,m;l<d.I.length&&(m=d.I[l]);l++)Pb(m)===c&&y.removeChild.call(c,m),f.splice(d.index+k,1);k-=d.N}for(k=0;k<g.length&&(d=g[k]);k++)for(h=f[d.index],l=d.index;l<d.index+d.N;l++)m=e[l],y.insertBefore.call(c,m,h),f.splice(l,0,m)}}};function yc(a,b,c){var d=r(b),e=d.L;d.L=null;c||(c=(a=a.g[b.slot||"__catchall"])&&a[0]);c?(r(c).assignedNodes.push(b),d.assignedSlot=c):d.assignedSlot=void 0;e!==d.assignedSlot&&d.assignedSlot&&(r(d.assignedSlot).P=!0)}
+function zc(a,b,c){for(var d=0,e;d<c.length&&(e=c[d]);d++)if("slot"==e.localName){var f=t(e).assignedNodes;f&&f.length&&zc(a,b,f)}else b.push(c[d])}function Ac(a,b){y.dispatchEvent.call(b,new Event("slotchange"));b=t(b);b.assignedSlot&&Ac(a,b.assignedSlot)}function Ob(a){if(a.o&&a.o.length){for(var b=a.o,c,d=0;d<b.length;d++){var e=b[d];Fb(e);Fb(e.parentNode);var f=Sb(e);a.g[f]?(c=c||{},c[f]=!0,a.g[f].push(e)):a.g[f]=[e];a.f.push(e)}if(c)for(var g in c)a.g[g]=Tb(a.g[g]);a.o=[]}}
+function Sb(a){var b=a.name||a.getAttribute("name")||"__catchall";return a.pa=b}function Tb(a){return a.sort(function(a,c){a=wc(a);for(var b=wc(c),e=0;e<a.length;e++){c=a[e];var f=b[e];if(c!==f)return a=Array.from(c.parentNode.childNodes),a.indexOf(c)-a.indexOf(f)}})}function Qb(a){Ob(a);return!(!a.f||!a.f.length)};function Bc(a){var b=a.getRootNode();w(b)&&xc(b);return(a=t(a))&&a.assignedSlot||null}
+var Cc={addEventListener:kc.bind(window),removeEventListener:mc.bind(window)},Dc={addEventListener:kc,removeEventListener:mc,appendChild:function(a){return Hb(this,a)},insertBefore:function(a,b){return Hb(this,a,b)},removeChild:function(a){return Ib(this,a)},replaceChild:function(a,b){Hb(this,a,b);Ib(this,b);return a},cloneNode:function(a){if("template"==this.localName)var b=y.cloneNode.call(this,a);else if(b=y.cloneNode.call(this,!1),a){a=this.childNodes;for(var c=0,d;c<a.length;c++)d=a[c].cloneNode(!0),
+b.appendChild(d)}return b},getRootNode:function(){return Ub(this)},contains:function(a){return ya(this,a)},dispatchEvent:function(a){Ca();return y.dispatchEvent.call(this,a)}};
+Object.defineProperties(Dc,{isConnected:{get:function(){if(sb&&sb.call(this))return!0;if(this.nodeType==Node.DOCUMENT_FRAGMENT_NODE)return!1;var a=this.ownerDocument;if(xa){if(y.contains.call(a,this))return!0}else if(a.documentElement&&y.contains.call(a.documentElement,this))return!0;for(a=this;a&&!(a instanceof Document);)a=a.parentNode||(w(a)?a.host:void 0);return!!(a&&a instanceof Document)},configurable:!0}});
+var Ec={get assignedSlot(){return Bc(this)}},Fc={querySelector:function(a){return Vb(this,function(b){return oa.call(b,a)},function(a){return!!a})[0]||null},querySelectorAll:function(a,b){if(b){b=Array.prototype.slice.call(y.querySelectorAll(this,a));var c=this.getRootNode();return b.filter(function(a){return a.getRootNode()==c})}return Vb(this,function(b){return oa.call(b,a)})}},Gc={assignedNodes:function(a){if("slot"===this.localName){var b=this.getRootNode();w(b)&&xc(b);return(b=t(this))?(a&&a.flatten?
+b.w:b.assignedNodes)||[]:[]}}},Hc=qa({setAttribute:function(a,b){Yb(this,a,b)},removeAttribute:function(a){y.removeAttribute.call(this,a);Rb(this,a)},attachShadow:function(a){if(!this)throw"Must provide a host.";if(!a)throw"Not enough arguments.";return new Ab(vc,this,a)},get slot(){return this.getAttribute("slot")},set slot(a){Yb(this,"slot",a)},get assignedSlot(){return Bc(this)}},Fc,Gc);Object.defineProperties(Hc,xb);
+var Ic=qa({importNode:function(a,b){return Zb(a,b)},getElementById:function(a){return Vb(this,function(b){return b.id==a},function(a){return!!a})[0]||null}},Fc);Object.defineProperties(Ic,{_activeElement:yb.activeElement});
+var Jc=HTMLElement.prototype.blur,Kc=qa({blur:function(){var a=t(this);(a=(a=a&&a.root)&&a.activeElement)?a.blur():Jc.call(this)}}),Lc={addEventListener:function(a,b,c){"object"!==typeof c&&(c={capture:!!c});c.X=this;this.host.addEventListener(a,b,c)},removeEventListener:function(a,b,c){"object"!==typeof c&&(c={capture:!!c});c.X=this;this.host.removeEventListener(a,b,c)},getElementById:function(a){return Vb(this,function(b){return b.id==a},function(a){return!!a})[0]||null}};
+function I(a,b){for(var c=Object.getOwnPropertyNames(b),d=0;d<c.length;d++){var e=c[d],f=Object.getOwnPropertyDescriptor(b,e);f.value?a[e]=f.value:Object.defineProperty(a,e,f)}};if(u.ha){var ShadyDOM={inUse:u.ha,patch:function(a){Cb(a);Bb(a);return a},isShadyRoot:w,enqueue:Ba,flush:Ca,settings:u,filterMutations:Ia,observeChildren:Ga,unobserveChildren:Ha,nativeMethods:y,nativeTree:F};window.ShadyDOM=ShadyDOM;window.Event=oc;window.CustomEvent=pc;window.MouseEvent=qc;nc();var Mc=window.customElements&&window.customElements.nativeHTMLElement||HTMLElement;I(Ab.prototype,Lc);I(window.Node.prototype,Dc);I(window.Window.prototype,Cc);I(window.Text.prototype,Ec);I(window.DocumentFragment.prototype,
+Fc);I(window.Element.prototype,Hc);I(window.Document.prototype,Ic);window.HTMLSlotElement&&I(window.HTMLSlotElement.prototype,Gc);I(Mc.prototype,Kc);u.s&&(H(window.Node.prototype),H(window.Text.prototype),H(window.DocumentFragment.prototype),H(window.Element.prototype),H(Mc.prototype),H(window.Document.prototype),window.HTMLSlotElement&&H(window.HTMLSlotElement.prototype));zb();window.ShadowRoot=Ab};var Nc=new Set("annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph".split(" "));function Oc(a){var b=Nc.has(a);a=/^[a-z][.0-9_a-z]*-[\-.0-9_a-z]*$/.test(a);return!b&&a}function J(a){var b=a.isConnected;if(void 0!==b)return b;for(;a&&!(a.__CE_isImportDocument||a instanceof Document);)a=a.parentNode||(window.ShadowRoot&&a instanceof ShadowRoot?a.host:void 0);return!(!a||!(a.__CE_isImportDocument||a instanceof Document))}
+function Pc(a,b){for(;b&&b!==a&&!b.nextSibling;)b=b.parentNode;return b&&b!==a?b.nextSibling:null}
+function K(a,b,c){c=void 0===c?new Set:c;for(var d=a;d;){if(d.nodeType===Node.ELEMENT_NODE){var e=d;b(e);var f=e.localName;if("link"===f&&"import"===e.getAttribute("rel")){d=e.import;if(d instanceof Node&&!c.has(d))for(c.add(d),d=d.firstChild;d;d=d.nextSibling)K(d,b,c);d=Pc(a,e);continue}else if("template"===f){d=Pc(a,e);continue}if(e=e.__CE_shadowRoot)for(e=e.firstChild;e;e=e.nextSibling)K(e,b,c)}d=d.firstChild?d.firstChild:Pc(a,d)}}function M(a,b,c){a[b]=c};function Qc(){this.a=new Map;this.D=new Map;this.i=[];this.c=!1}function Rc(a,b,c){a.a.set(b,c);a.D.set(c.constructor,c)}function Sc(a,b){a.c=!0;a.i.push(b)}function Tc(a,b){a.c&&K(b,function(b){return a.b(b)})}Qc.prototype.b=function(a){if(this.c&&!a.__CE_patched){a.__CE_patched=!0;for(var b=0;b<this.i.length;b++)this.i[b](a)}};function N(a,b){var c=[];K(b,function(a){return c.push(a)});for(b=0;b<c.length;b++){var d=c[b];1===d.__CE_state?a.connectedCallback(d):Uc(a,d)}}
+function P(a,b){var c=[];K(b,function(a){return c.push(a)});for(b=0;b<c.length;b++){var d=c[b];1===d.__CE_state&&a.disconnectedCallback(d)}}
+function Q(a,b,c){c=void 0===c?{}:c;var d=c.Ga||new Set,e=c.T||function(b){return Uc(a,b)},f=[];K(b,function(b){if("link"===b.localName&&"import"===b.getAttribute("rel")){var c=b.import;c instanceof Node&&(c.__CE_isImportDocument=!0,c.__CE_hasRegistry=!0);c&&"complete"===c.readyState?c.__CE_documentLoadHandled=!0:b.addEventListener("load",function(){var c=b.import;if(!c.__CE_documentLoadHandled){c.__CE_documentLoadHandled=!0;var f=new Set(d);f.delete(c);Q(a,c,{Ga:f,T:e})}})}else f.push(b)},d);if(a.c)for(b=
+0;b<f.length;b++)a.b(f[b]);for(b=0;b<f.length;b++)e(f[b])}
+function Uc(a,b){if(void 0===b.__CE_state){var c=b.ownerDocument;if(c.defaultView||c.__CE_isImportDocument&&c.__CE_hasRegistry)if(c=a.a.get(b.localName)){c.constructionStack.push(b);var d=c.constructor;try{try{if(new d!==b)throw Error("The custom element constructor did not produce the element being upgraded.");}finally{c.constructionStack.pop()}}catch(g){throw b.__CE_state=2,g;}b.__CE_state=1;b.__CE_definition=c;if(c.attributeChangedCallback)for(c=c.observedAttributes,d=0;d<c.length;d++){var e=c[d],
+f=b.getAttribute(e);null!==f&&a.attributeChangedCallback(b,e,null,f,null)}J(b)&&a.connectedCallback(b)}}}Qc.prototype.connectedCallback=function(a){var b=a.__CE_definition;b.connectedCallback&&b.connectedCallback.call(a)};Qc.prototype.disconnectedCallback=function(a){var b=a.__CE_definition;b.disconnectedCallback&&b.disconnectedCallback.call(a)};
+Qc.prototype.attributeChangedCallback=function(a,b,c,d,e){var f=a.__CE_definition;f.attributeChangedCallback&&-1<f.observedAttributes.indexOf(b)&&f.attributeChangedCallback.call(a,b,c,d,e)};function Vc(a){var b=document;this.h=a;this.a=b;this.B=void 0;Q(this.h,this.a);"loading"===this.a.readyState&&(this.B=new MutationObserver(this.b.bind(this)),this.B.observe(this.a,{childList:!0,subtree:!0}))}function Wc(a){a.B&&a.B.disconnect()}Vc.prototype.b=function(a){var b=this.a.readyState;"interactive"!==b&&"complete"!==b||Wc(this);for(b=0;b<a.length;b++)for(var c=a[b].addedNodes,d=0;d<c.length;d++)Q(this.h,c[d])};function Xc(){var a=this;this.b=this.a=void 0;this.c=new Promise(function(b){a.b=b;a.a&&b(a.a)})}function Yc(a){if(a.a)throw Error("Already resolved.");a.a=void 0;a.b&&a.b(void 0)};function R(a){this.Y=!1;this.h=a;this.ba=new Map;this.Z=function(a){return a()};this.K=!1;this.$=[];this.ra=new Vc(a)}n=R.prototype;
+n.define=function(a,b){var c=this;if(!(b instanceof Function))throw new TypeError("Custom element constructors must be functions.");if(!Oc(a))throw new SyntaxError("The element name '"+a+"' is not valid.");if(this.h.a.get(a))throw Error("A custom element with name '"+a+"' has already been defined.");if(this.Y)throw Error("A custom element is already being defined.");this.Y=!0;try{var d=function(a){var b=e[a];if(void 0!==b&&!(b instanceof Function))throw Error("The '"+a+"' callback must be a function.");
+return b},e=b.prototype;if(!(e instanceof Object))throw new TypeError("The custom element constructor's prototype is not an object.");var f=d("connectedCallback");var g=d("disconnectedCallback");var h=d("adoptedCallback");var k=d("attributeChangedCallback");var l=b.observedAttributes||[]}catch(m){return}finally{this.Y=!1}b={localName:a,constructor:b,connectedCallback:f,disconnectedCallback:g,adoptedCallback:h,attributeChangedCallback:k,observedAttributes:l,constructionStack:[]};Rc(this.h,a,b);this.$.push(b);
+this.K||(this.K=!0,this.Z(function(){return Zc(c)}))};n.T=function(a){Q(this.h,a)};function Zc(a){if(!1!==a.K){a.K=!1;for(var b=a.$,c=[],d=new Map,e=0;e<b.length;e++)d.set(b[e].localName,[]);Q(a.h,document,{T:function(b){if(void 0===b.__CE_state){var e=b.localName,f=d.get(e);f?f.push(b):a.h.a.get(e)&&c.push(b)}}});for(e=0;e<c.length;e++)Uc(a.h,c[e]);for(;0<b.length;){var f=b.shift();e=f.localName;f=d.get(f.localName);for(var g=0;g<f.length;g++)Uc(a.h,f[g]);(e=a.ba.get(e))&&Yc(e)}}}
+n.get=function(a){if(a=this.h.a.get(a))return a.constructor};n.ma=function(a){if(!Oc(a))return Promise.reject(new SyntaxError("'"+a+"' is not a valid custom element name."));var b=this.ba.get(a);if(b)return b.c;b=new Xc;this.ba.set(a,b);this.h.a.get(a)&&!this.$.some(function(b){return b.localName===a})&&Yc(b);return b.c};n.Ba=function(a){Wc(this.ra);var b=this.Z;this.Z=function(c){return a(function(){return b(c)})}};window.CustomElementRegistry=R;R.prototype.define=R.prototype.define;
+R.prototype.upgrade=R.prototype.T;R.prototype.get=R.prototype.get;R.prototype.whenDefined=R.prototype.ma;R.prototype.polyfillWrapFlushCallback=R.prototype.Ba;var $c=window.Document.prototype.createElement,ad=window.Document.prototype.createElementNS,bd=window.Document.prototype.importNode,cd=window.Document.prototype.prepend,dd=window.Document.prototype.append,ed=window.DocumentFragment.prototype.prepend,fd=window.DocumentFragment.prototype.append,gd=window.Node.prototype.cloneNode,hd=window.Node.prototype.appendChild,id=window.Node.prototype.insertBefore,jd=window.Node.prototype.removeChild,kd=window.Node.prototype.replaceChild,ld=Object.getOwnPropertyDescriptor(window.Node.prototype,
+"textContent"),md=window.Element.prototype.attachShadow,nd=Object.getOwnPropertyDescriptor(window.Element.prototype,"innerHTML"),od=window.Element.prototype.getAttribute,pd=window.Element.prototype.setAttribute,qd=window.Element.prototype.removeAttribute,rd=window.Element.prototype.getAttributeNS,sd=window.Element.prototype.setAttributeNS,td=window.Element.prototype.removeAttributeNS,ud=window.Element.prototype.insertAdjacentElement,vd=window.Element.prototype.insertAdjacentHTML,wd=window.Element.prototype.prepend,
+xd=window.Element.prototype.append,yd=window.Element.prototype.before,zd=window.Element.prototype.after,Ad=window.Element.prototype.replaceWith,Bd=window.Element.prototype.remove,Cd=window.HTMLElement,Dd=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML"),Ed=window.HTMLElement.prototype.insertAdjacentElement,Fd=window.HTMLElement.prototype.insertAdjacentHTML;var Gd=new function(){};function Hd(){var a=Id;window.HTMLElement=function(){function b(){var b=this.constructor,d=a.D.get(b);if(!d)throw Error("The custom element being constructed was not registered with `customElements`.");var e=d.constructionStack;if(0===e.length)return e=$c.call(document,d.localName),Object.setPrototypeOf(e,b.prototype),e.__CE_state=1,e.__CE_definition=d,a.b(e),e;d=e.length-1;var f=e[d];if(f===Gd)throw Error("The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.");
+e[d]=Gd;Object.setPrototypeOf(f,b.prototype);a.b(f);return f}b.prototype=Cd.prototype;return b}()};function Jd(a,b,c){function d(b){return function(c){for(var e=[],d=0;d<arguments.length;++d)e[d-0]=arguments[d];d=[];for(var f=[],l=0;l<e.length;l++){var m=e[l];m instanceof Element&&J(m)&&f.push(m);if(m instanceof DocumentFragment)for(m=m.firstChild;m;m=m.nextSibling)d.push(m);else d.push(m)}b.apply(this,e);for(e=0;e<f.length;e++)P(a,f[e]);if(J(this))for(e=0;e<d.length;e++)f=d[e],f instanceof Element&&N(a,f)}}void 0!==c.S&&(b.prepend=d(c.S));void 0!==c.append&&(b.append=d(c.append))};function Kd(){var a=Id;M(Document.prototype,"createElement",function(b){if(this.__CE_hasRegistry){var c=a.a.get(b);if(c)return new c.constructor}b=$c.call(this,b);a.b(b);return b});M(Document.prototype,"importNode",function(b,c){b=bd.call(this,b,c);this.__CE_hasRegistry?Q(a,b):Tc(a,b);return b});M(Document.prototype,"createElementNS",function(b,c){if(this.__CE_hasRegistry&&(null===b||"http://www.w3.org/1999/xhtml"===b)){var d=a.a.get(c);if(d)return new d.constructor}b=ad.call(this,b,c);a.b(b);return b});
+Jd(a,Document.prototype,{S:cd,append:dd})};function Ld(){var a=Id;function b(b,d){Object.defineProperty(b,"textContent",{enumerable:d.enumerable,configurable:!0,get:d.get,set:function(b){if(this.nodeType===Node.TEXT_NODE)d.set.call(this,b);else{var c=void 0;if(this.firstChild){var e=this.childNodes,h=e.length;if(0<h&&J(this)){c=Array(h);for(var k=0;k<h;k++)c[k]=e[k]}}d.set.call(this,b);if(c)for(b=0;b<c.length;b++)P(a,c[b])}}})}M(Node.prototype,"insertBefore",function(b,d){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);
+b=id.call(this,b,d);if(J(this))for(d=0;d<c.length;d++)N(a,c[d]);return b}c=J(b);d=id.call(this,b,d);c&&P(a,b);J(this)&&N(a,b);return d});M(Node.prototype,"appendChild",function(b){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);b=hd.call(this,b);if(J(this))for(var e=0;e<c.length;e++)N(a,c[e]);return b}c=J(b);e=hd.call(this,b);c&&P(a,b);J(this)&&N(a,b);return e});M(Node.prototype,"cloneNode",function(b){b=gd.call(this,b);this.ownerDocument.__CE_hasRegistry?Q(a,b):
+Tc(a,b);return b});M(Node.prototype,"removeChild",function(b){var c=J(b),e=jd.call(this,b);c&&P(a,b);return e});M(Node.prototype,"replaceChild",function(b,d){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);b=kd.call(this,b,d);if(J(this))for(P(a,d),d=0;d<c.length;d++)N(a,c[d]);return b}c=J(b);var f=kd.call(this,b,d),g=J(this);g&&P(a,d);c&&P(a,b);g&&N(a,b);return f});ld&&ld.get?b(Node.prototype,ld):Sc(a,function(a){b(a,{enumerable:!0,configurable:!0,get:function(){for(var a=
+[],b=0;b<this.childNodes.length;b++)a.push(this.childNodes[b].textContent);return a.join("")},set:function(a){for(;this.firstChild;)jd.call(this,this.firstChild);hd.call(this,document.createTextNode(a))}})})};function Md(a){var b=Element.prototype;function c(b){return function(c){for(var d=[],e=0;e<arguments.length;++e)d[e-0]=arguments[e];e=[];for(var h=[],k=0;k<d.length;k++){var l=d[k];l instanceof Element&&J(l)&&h.push(l);if(l instanceof DocumentFragment)for(l=l.firstChild;l;l=l.nextSibling)e.push(l);else e.push(l)}b.apply(this,d);for(d=0;d<h.length;d++)P(a,h[d]);if(J(this))for(d=0;d<e.length;d++)h=e[d],h instanceof Element&&N(a,h)}}void 0!==yd&&(b.before=c(yd));void 0!==yd&&(b.after=c(zd));void 0!==
+Ad&&M(b,"replaceWith",function(b){for(var c=[],d=0;d<arguments.length;++d)c[d-0]=arguments[d];d=[];for(var g=[],h=0;h<c.length;h++){var k=c[h];k instanceof Element&&J(k)&&g.push(k);if(k instanceof DocumentFragment)for(k=k.firstChild;k;k=k.nextSibling)d.push(k);else d.push(k)}h=J(this);Ad.apply(this,c);for(c=0;c<g.length;c++)P(a,g[c]);if(h)for(P(a,this),c=0;c<d.length;c++)g=d[c],g instanceof Element&&N(a,g)});void 0!==Bd&&M(b,"remove",function(){var b=J(this);Bd.call(this);b&&P(a,this)})};function Nd(){var a=Id;function b(b,c){Object.defineProperty(b,"innerHTML",{enumerable:c.enumerable,configurable:!0,get:c.get,set:function(b){var d=this,e=void 0;J(this)&&(e=[],K(this,function(a){a!==d&&e.push(a)}));c.set.call(this,b);if(e)for(var f=0;f<e.length;f++){var g=e[f];1===g.__CE_state&&a.disconnectedCallback(g)}this.ownerDocument.__CE_hasRegistry?Q(a,this):Tc(a,this);return b}})}function c(b,c){M(b,"insertAdjacentElement",function(b,d){var e=J(d);b=c.call(this,b,d);e&&P(a,d);J(b)&&N(a,d);
+return b})}function d(b,c){function d(b,c){for(var d=[];b!==c;b=b.nextSibling)d.push(b);for(c=0;c<d.length;c++)Q(a,d[c])}M(b,"insertAdjacentHTML",function(a,b){a=a.toLowerCase();if("beforebegin"===a){var e=this.previousSibling;c.call(this,a,b);d(e||this.parentNode.firstChild,this)}else if("afterbegin"===a)e=this.firstChild,c.call(this,a,b),d(this.firstChild,e);else if("beforeend"===a)e=this.lastChild,c.call(this,a,b),d(e||this.firstChild,null);else if("afterend"===a)e=this.nextSibling,c.call(this,
+a,b),d(this.nextSibling,e);else throw new SyntaxError("The value provided ("+String(a)+") is not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'.");})}md&&M(Element.prototype,"attachShadow",function(a){return this.__CE_shadowRoot=a=md.call(this,a)});nd&&nd.get?b(Element.prototype,nd):Dd&&Dd.get?b(HTMLElement.prototype,Dd):Sc(a,function(a){b(a,{enumerable:!0,configurable:!0,get:function(){return gd.call(this,!0).innerHTML},set:function(a){var b="template"===this.localName,c=b?this.content:
+this,d=$c.call(document,this.localName);for(d.innerHTML=a;0<c.childNodes.length;)jd.call(c,c.childNodes[0]);for(a=b?d.content:d;0<a.childNodes.length;)hd.call(c,a.childNodes[0])}})});M(Element.prototype,"setAttribute",function(b,c){if(1!==this.__CE_state)return pd.call(this,b,c);var d=od.call(this,b);pd.call(this,b,c);c=od.call(this,b);a.attributeChangedCallback(this,b,d,c,null)});M(Element.prototype,"setAttributeNS",function(b,c,d){if(1!==this.__CE_state)return sd.call(this,b,c,d);var e=rd.call(this,
+b,c);sd.call(this,b,c,d);d=rd.call(this,b,c);a.attributeChangedCallback(this,c,e,d,b)});M(Element.prototype,"removeAttribute",function(b){if(1!==this.__CE_state)return qd.call(this,b);var c=od.call(this,b);qd.call(this,b);null!==c&&a.attributeChangedCallback(this,b,c,null,null)});M(Element.prototype,"removeAttributeNS",function(b,c){if(1!==this.__CE_state)return td.call(this,b,c);var d=rd.call(this,b,c);td.call(this,b,c);var e=rd.call(this,b,c);d!==e&&a.attributeChangedCallback(this,c,d,e,b)});Ed?
+c(HTMLElement.prototype,Ed):ud?c(Element.prototype,ud):console.warn("Custom Elements: `Element#insertAdjacentElement` was not patched.");Fd?d(HTMLElement.prototype,Fd):vd?d(Element.prototype,vd):console.warn("Custom Elements: `Element#insertAdjacentHTML` was not patched.");Jd(a,Element.prototype,{S:wd,append:xd});Md(a)};/*
+
+ Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ Code distributed by Google as part of the polymer project is also
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+var Od=window.customElements;if(!Od||Od.forcePolyfill||"function"!=typeof Od.define||"function"!=typeof Od.get){var Id=new Qc;Hd();Kd();Jd(Id,DocumentFragment.prototype,{S:ed,append:fd});Ld();Nd();document.__CE_hasRegistry=!0;var customElements=new R(Id);Object.defineProperty(window,"customElements",{configurable:!0,enumerable:!0,value:customElements})};/*
+
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+function Pd(){this.end=this.start=0;this.rules=this.parent=this.previous=null;this.cssText=this.parsedCssText="";this.atRule=!1;this.type=0;this.parsedSelector=this.selector=this.keyframesName=""}
+function Qd(a){a=a.replace(Rd,"").replace(Sd,"");var b=Td,c=a,d=new Pd;d.start=0;d.end=c.length;for(var e=d,f=0,g=c.length;f<g;f++)if("{"===c[f]){e.rules||(e.rules=[]);var h=e,k=h.rules[h.rules.length-1]||null;e=new Pd;e.start=f+1;e.parent=h;e.previous=k;h.rules.push(e)}else"}"===c[f]&&(e.end=f+1,e=e.parent||d);return b(d,a)}
+function Td(a,b){var c=b.substring(a.start,a.end-1);a.parsedCssText=a.cssText=c.trim();a.parent&&(c=b.substring(a.previous?a.previous.end:a.parent.start,a.start-1),c=Ud(c),c=c.replace(Vd," "),c=c.substring(c.lastIndexOf(";")+1),c=a.parsedSelector=a.selector=c.trim(),a.atRule=0===c.indexOf("@"),a.atRule?0===c.indexOf("@media")?a.type=Wd:c.match(Xd)&&(a.type=Yd,a.keyframesName=a.selector.split(Vd).pop()):a.type=0===c.indexOf("--")?Zd:$d);if(c=a.rules)for(var d=0,e=c.length,f;d<e&&(f=c[d]);d++)Td(f,
+b);return a}function Ud(a){return a.replace(/\\([0-9a-f]{1,6})\s/gi,function(a,c){a=c;for(c=6-a.length;c--;)a="0"+a;return"\\"+a})}
+function ae(a,b,c){c=void 0===c?"":c;var d="";if(a.cssText||a.rules){var e=a.rules,f;if(f=e)f=e[0],f=!(f&&f.selector&&0===f.selector.indexOf("--"));if(f){f=0;for(var g=e.length,h;f<g&&(h=e[f]);f++)d=ae(h,b,d)}else b?b=a.cssText:(b=a.cssText,b=b.replace(be,"").replace(ce,""),b=b.replace(de,"").replace(ee,"")),(d=b.trim())&&(d=" "+d+"\n")}d&&(a.selector&&(c+=a.selector+" {\n"),c+=d,a.selector&&(c+="}\n\n"));return c}
+var $d=1,Yd=7,Wd=4,Zd=1E3,Rd=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,Sd=/@import[^;]*;/gim,be=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,ce=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,de=/@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,ee=/[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,Xd=/^@[^\s]*keyframes/,Vd=/\s+/g;var S=!(window.ShadyDOM&&window.ShadyDOM.inUse),fe;function ge(a){fe=a&&a.shimcssproperties?!1:S||!(navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/)||!window.CSS||!CSS.supports||!CSS.supports("box-shadow","0 0 0 var(--foo)"))}window.ShadyCSS&&void 0!==window.ShadyCSS.nativeCss?fe=window.ShadyCSS.nativeCss:window.ShadyCSS?(ge(window.ShadyCSS),window.ShadyCSS=void 0):ge(window.WebComponents&&window.WebComponents.flags);var T=fe;var he=/(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};{])+)|\{([^}]*)\}(?:(?=[;\s}])|$))/gi,ie=/(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi,je=/(--[\w-]+)\s*([:,;)]|$)/gi,ke=/(animation\s*:)|(animation-name\s*:)/,le=/@media\s(.*)/,me=/\{[^}]*\}/g;var ne=new Set;function oe(a,b){if(!a)return"";"string"===typeof a&&(a=Qd(a));b&&pe(a,b);return ae(a,T)}function qe(a){!a.__cssRules&&a.textContent&&(a.__cssRules=Qd(a.textContent));return a.__cssRules||null}function re(a){return!!a.parent&&a.parent.type===Yd}function pe(a,b,c,d){if(a){var e=!1,f=a.type;if(d&&f===Wd){var g=a.selector.match(le);g&&(window.matchMedia(g[1]).matches||(e=!0))}f===$d?b(a):c&&f===Yd?c(a):f===Zd&&(e=!0);if((a=a.rules)&&!e){e=0;f=a.length;for(var h;e<f&&(h=a[e]);e++)pe(h,b,c,d)}}}
+function se(a,b,c,d){var e=document.createElement("style");b&&e.setAttribute("scope",b);e.textContent=a;te(e,c,d);return e}var U=null;function te(a,b,c){b=b||document.head;b.insertBefore(a,c&&c.nextSibling||b.firstChild);U?a.compareDocumentPosition(U)===Node.DOCUMENT_POSITION_PRECEDING&&(U=a):U=a}
+function ue(a,b){var c=a.indexOf("var(");if(-1===c)return b(a,"","","");a:{var d=0;var e=c+3;for(var f=a.length;e<f;e++)if("("===a[e])d++;else if(")"===a[e]&&0===--d)break a;e=-1}d=a.substring(c+4,e);c=a.substring(0,c);a=ue(a.substring(e+1),b);e=d.indexOf(",");return-1===e?b(c,d.trim(),"",a):b(c,d.substring(0,e).trim(),d.substring(e+1).trim(),a)}function ve(a,b){S?a.setAttribute("class",b):window.ShadyDOM.nativeMethods.setAttribute.call(a,"class",b)}
+function V(a){var b=a.localName,c="";b?-1<b.indexOf("-")||(c=b,b=a.getAttribute&&a.getAttribute("is")||""):(b=a.is,c=a.extends);return{is:b,J:c}};function we(){}function xe(a,b,c){var d=W;a.__styleScoped?a.__styleScoped=null:ye(d,a,b||"",c)}function ye(a,b,c,d){b.nodeType===Node.ELEMENT_NODE&&ze(b,c,d);if(b="template"===b.localName?(b.content||b.Ma).childNodes:b.children||b.childNodes)for(var e=0;e<b.length;e++)ye(a,b[e],c,d)}
+function ze(a,b,c){if(b)if(a.classList)c?(a.classList.remove("style-scope"),a.classList.remove(b)):(a.classList.add("style-scope"),a.classList.add(b));else if(a.getAttribute){var d=a.getAttribute(Ae);c?d&&(b=d.replace("style-scope","").replace(b,""),ve(a,b)):ve(a,(d?d+" ":"")+"style-scope "+b)}}function Be(a,b,c){var d=W,e=a.__cssBuild;S||"shady"===e?b=oe(b,c):(a=V(a),b=Ce(d,b,a.is,a.J,c)+"\n\n");return b.trim()}
+function Ce(a,b,c,d,e){var f=De(c,d);c=c?Ee+c:"";return oe(b,function(b){b.c||(b.selector=b.l=Fe(a,b,a.b,c,f),b.c=!0);e&&e(b,c,f)})}function De(a,b){return b?"[is="+a+"]":a}function Fe(a,b,c,d,e){var f=b.selector.split(Ge);if(!re(b)){b=0;for(var g=f.length,h;b<g&&(h=f[b]);b++)f[b]=c.call(a,h,d,e)}return f.join(Ge)}function He(a){return a.replace(Ie,function(a,c,d){-1<d.indexOf("+")?d=d.replace(/\+/g,"___"):-1<d.indexOf("___")&&(d=d.replace(/___/g,"+"));return":"+c+"("+d+")"})}
+we.prototype.b=function(a,b,c){var d=!1;a=a.trim();var e=Ie.test(a);e&&(a=a.replace(Ie,function(a,b,c){return":"+b+"("+c.replace(/\s/g,"")+")"}),a=He(a));a=a.replace(Je,Ke+" $1");a=a.replace(Le,function(a,e,h){d||(a=Me(h,e,b,c),d=d||a.stop,e=a.wa,h=a.value);return e+h});e&&(a=He(a));return a};
+function Me(a,b,c,d){var e=a.indexOf(Ne);0<=a.indexOf(Ke)?a=Oe(a,d):0!==e&&(a=c?Pe(a,c):a);c=!1;0<=e&&(b="",c=!0);if(c){var f=!0;c&&(a=a.replace(Qe,function(a,b){return" > "+b}))}a=a.replace(Re,function(a,b,c){return'[dir="'+c+'"] '+b+", "+b+'[dir="'+c+'"]'});return{value:a,wa:b,stop:f}}function Pe(a,b){a=a.split(Se);a[0]+=b;return a.join(Se)}
+function Oe(a,b){var c=a.match(Te);return(c=c&&c[2].trim()||"")?c[0].match(Ue)?a.replace(Te,function(a,c,f){return b+f}):c.split(Ue)[0]===b?c:Ve:a.replace(Ke,b)}function We(a){a.selector===Xe&&(a.selector="html")}we.prototype.c=function(a){return a.match(Ne)?this.b(a,Ye):Pe(a.trim(),Ye)};p.Object.defineProperties(we.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"style-scope"}}});
+var Ie=/:(nth[-\w]+)\(([^)]+)\)/,Ye=":not(.style-scope)",Ge=",",Le=/(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=[])+)/g,Ue=/[[.:#*]/,Ke=":host",Xe=":root",Ne="::slotted",Je=new RegExp("^("+Ne+")"),Te=/(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Qe=/(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Re=/(.*):dir\((?:(ltr|rtl))\)/,Ee=".",Se=":",Ae="class",Ve="should_not_match",W=new we;function Ze(a,b,c,d){this.v=a||null;this.b=b||null;this.ca=c||[];this.G=null;this.J=d||"";this.a=this.m=this.A=null}function X(a){return a?a.__styleInfo:null}function $e(a,b){return a.__styleInfo=b}Ze.prototype.c=function(){return this.v};Ze.prototype._getStyleRules=Ze.prototype.c;function af(a){var b=this.matches||this.matchesSelector||this.mozMatchesSelector||this.msMatchesSelector||this.oMatchesSelector||this.webkitMatchesSelector;return b&&b.call(this,a)}var bf=navigator.userAgent.match("Trident");function cf(){}function df(a){var b={},c=[],d=0;pe(a,function(a){ef(a);a.index=d++;a=a.j.cssText;for(var c;c=je.exec(a);){var e=c[1];":"!==c[2]&&(b[e]=!0)}},function(a){c.push(a)});a.b=c;a=[];for(var e in b)a.push(e);return a}
+function ef(a){if(!a.j){var b={},c={};ff(a,c)&&(b.u=c,a.rules=null);b.cssText=a.parsedCssText.replace(me,"").replace(he,"");a.j=b}}function ff(a,b){var c=a.j;if(c){if(c.u)return Object.assign(b,c.u),!0}else{c=a.parsedCssText;for(var d;a=he.exec(c);){d=(a[2]||a[3]).trim();if("inherit"!==d||"unset"!==d)b[a[1].trim()]=d;d=!0}return d}}
+function gf(a,b,c){b&&(b=0<=b.indexOf(";")?hf(a,b,c):ue(b,function(b,e,f,g){if(!e)return b+g;(e=gf(a,c[e],c))&&"initial"!==e?"apply-shim-inherit"===e&&(e="inherit"):e=gf(a,c[f]||f,c)||f;return b+(e||"")+g}));return b&&b.trim()||""}
+function hf(a,b,c){b=b.split(";");for(var d=0,e,f;d<b.length;d++)if(e=b[d]){ie.lastIndex=0;if(f=ie.exec(e))e=gf(a,c[f[1]],c);else if(f=e.indexOf(":"),-1!==f){var g=e.substring(f);g=g.trim();g=gf(a,g,c)||g;e=e.substring(0,f)+g}b[d]=e&&e.lastIndexOf(";")===e.length-1?e.slice(0,-1):e||""}return b.join(";")}
+function jf(a,b){var c={},d=[];pe(a,function(a){a.j||ef(a);var e=a.l||a.parsedSelector;b&&a.j.u&&e&&af.call(b,e)&&(ff(a,c),a=a.index,e=parseInt(a/32,10),d[e]=(d[e]||0)|1<<a%32)},null,!0);return{u:c,key:d}}
+function kf(a,b,c,d){b.j||ef(b);if(b.j.u){var e=V(a);a=e.is;e=e.J;e=a?De(a,e):"html";var f=b.parsedSelector,g=":host > *"===f||"html"===f,h=0===f.indexOf(":host")&&!g;"shady"===c&&(g=f===e+" > *."+e||-1!==f.indexOf("html"),h=!g&&0===f.indexOf(e));"shadow"===c&&(g=":host > *"===f||"html"===f,h=h&&!g);if(g||h)c=e,h&&(b.l||(b.l=Fe(W,b,W.b,a?Ee+a:"",e)),c=b.l||e),d({Da:c,Aa:h,Va:g})}}
+function lf(a,b){var c={},d={},e=b&&b.__cssBuild;pe(b,function(b){kf(a,b,e,function(e){af.call(a.i||a,e.Da)&&(e.Aa?ff(b,c):ff(b,d))})},null,!0);return{Ca:d,za:c}}
+function mf(a,b,c,d){var e=V(b),f=De(e.is,e.J),g=new RegExp("(?:^|[^.#[:])"+(b.extends?"\\"+f.slice(0,-1)+"\\]":f)+"($|[.:[\\s>+~])");e=X(b).v;var h=nf(e,d);return Be(b,e,function(b){var e="";b.j||ef(b);b.j.cssText&&(e=hf(a,b.j.cssText,c));b.cssText=e;if(!S&&!re(b)&&b.cssText){var k=e=b.cssText;null==b.ga&&(b.ga=ke.test(e));if(b.ga)if(null==b.R){b.R=[];for(var q in h)k=h[q],k=k(e),e!==k&&(e=k,b.R.push(q))}else{for(q=0;q<b.R.length;++q)k=h[b.R[q]],e=k(e);k=e}b.cssText=k;b.l=b.l||b.selector;e="."+d;
+q=b.l.split(",");k=0;for(var O=q.length,L;k<O&&(L=q[k]);k++)q[k]=L.match(g)?L.replace(f,e):e+" "+L;b.selector=q.join(",")}})}function nf(a,b){a=a.b;var c={};if(!S&&a)for(var d=0,e=a[d];d<a.length;e=a[++d]){var f=e,g=b;f.i=new RegExp("\\b"+f.keyframesName+"(?!\\B|-)","g");f.a=f.keyframesName+"-"+g;f.l=f.l||f.selector;f.selector=f.l.replace(f.keyframesName,f.a);c[e.keyframesName]=of(e)}return c}function of(a){return function(b){return b.replace(a.i,a.a)}}
+function pf(a,b){var c=qf,d=qe(a);a.textContent=oe(d,function(a){var d=a.cssText=a.parsedCssText;a.j&&a.j.cssText&&(d=d.replace(be,"").replace(ce,""),a.cssText=hf(c,d,b))})}p.Object.defineProperties(cf.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"x-scope"}}});var qf=new cf;var rf={},sf=window.customElements;if(sf&&!S){var tf=sf.define;sf.define=function(a,b,c){var d=document.createComment(" Shady DOM styles for "+a+" "),e=document.head;e.insertBefore(d,(U?U.nextSibling:null)||e.firstChild);U=d;rf[a]=d;tf.call(sf,a,b,c)}};function uf(){this.cache={}}uf.prototype.store=function(a,b,c,d){var e=this.cache[a]||[];e.push({u:b,styleElement:c,m:d});100<e.length&&e.shift();this.cache[a]=e};uf.prototype.fetch=function(a,b,c){if(a=this.cache[a])for(var d=a.length-1;0<=d;d--){var e=a[d],f;a:{for(f=0;f<c.length;f++){var g=c[f];if(e.u[g]!==b[g]){f=!1;break a}}f=!0}if(f)return e}};function vf(){}
+function wf(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.target!==document.documentElement&&c.target!==document.head)for(var d=0;d<c.addedNodes.length;d++){var e=c.addedNodes[d];if(e.nodeType===Node.ELEMENT_NODE){var f=e.getRootNode();var g=e;var h=[];g.classList?h=Array.from(g.classList):g instanceof window.SVGElement&&g.hasAttribute("class")&&(h=g.getAttribute("class").split(/\s+/));g=h;h=g.indexOf(W.a);if((g=-1<h?g[h+1]:"")&&f===e.ownerDocument)xe(e,g,!0);else if(f.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&
+(f=f.host))if(f=V(f).is,g===f)for(e=window.ShadyDOM.nativeMethods.querySelectorAll.call(e,":not(."+W.a+")"),f=0;f<e.length;f++)ze(e[f],g);else g&&xe(e,g,!0),xe(e,f)}}}}
+if(!S){var xf=new MutationObserver(wf),yf=function(a){xf.observe(a,{childList:!0,subtree:!0})};if(window.customElements&&!window.customElements.polyfillWrapFlushCallback)yf(document);else{var zf=function(){yf(document.body)};window.HTMLImports?window.HTMLImports.whenReady(zf):requestAnimationFrame(function(){if("loading"===document.readyState){var a=function(){zf();document.removeEventListener("readystatechange",a)};document.addEventListener("readystatechange",a)}else zf()})}vf=function(){wf(xf.takeRecords())}}
+var Af=vf;var Bf={};var Cf=Promise.resolve();function Df(a){if(a=Bf[a])a._applyShimCurrentVersion=a._applyShimCurrentVersion||0,a._applyShimValidatingVersion=a._applyShimValidatingVersion||0,a._applyShimNextVersion=(a._applyShimNextVersion||0)+1}function Ef(a){return a._applyShimCurrentVersion===a._applyShimNextVersion}function Ff(a){a._applyShimValidatingVersion=a._applyShimNextVersion;a.a||(a.a=!0,Cf.then(function(){a._applyShimCurrentVersion=a._applyShimNextVersion;a.a=!1}))};var Gf=null,Hf=window.HTMLImports&&window.HTMLImports.whenReady||null,If;function Jf(a){requestAnimationFrame(function(){Hf?Hf(a):(Gf||(Gf=new Promise(function(a){If=a}),"complete"===document.readyState?If():document.addEventListener("readystatechange",function(){"complete"===document.readyState&&If()})),Gf.then(function(){a&&a()}))})};var Kf=new uf;function Y(){var a=this;this.fa={};this.c=document.documentElement;var b=new Pd;b.rules=[];this.i=$e(this.c,new Ze(b));this.D=!1;this.b=this.a=null;Jf(function(){Lf(a)})}n=Y.prototype;n.na=function(){Af()};n.xa=function(a){return qe(a)};n.Fa=function(a){return oe(a)};
+n.prepareTemplate=function(a,b,c){if(!a.b){a.b=!0;a.name=b;a.extends=c;Bf[b]=a;var d=(d=a.content.querySelector("style"))?d.getAttribute("css-build")||"":"";var e=[];for(var f=a.content.querySelectorAll("style"),g=0;g<f.length;g++){var h=f[g];if(h.hasAttribute("shady-unscoped")){if(!S){var k=h.textContent;ne.has(k)||(ne.add(k),k=h.cloneNode(!0),document.head.appendChild(k));h.parentNode.removeChild(h)}}else e.push(h.textContent),h.parentNode.removeChild(h)}e=e.join("").trim();c={is:b,extends:c,Ka:d};
+S||xe(a.content,b);Lf(this);f=ie.test(e)||he.test(e);ie.lastIndex=0;he.lastIndex=0;e=Qd(e);f&&T&&this.a&&this.a.transformRules(e,b);a._styleAst=e;a.c=d;d=[];T||(d=df(a._styleAst));if(!d.length||T)e=S?a.content:null,b=rf[b],f=Be(c,a._styleAst),b=f.length?se(f,c.is,e,b):void 0,a.ea=b;a.ua=d}};
+function Mf(a){!a.b&&window.ShadyCSS&&window.ShadyCSS.CustomStyleInterface&&(a.b=window.ShadyCSS.CustomStyleInterface,a.b.transformCallback=function(b){a.ka(b)},a.b.validateCallback=function(){requestAnimationFrame(function(){(a.b.enqueued||a.D)&&a.C()})})}function Lf(a){!a.a&&window.ShadyCSS&&window.ShadyCSS.ApplyShim&&(a.a=window.ShadyCSS.ApplyShim,a.a.invalidCallback=Df);Mf(a)}
+n.C=function(){Lf(this);if(this.b){var a=this.b.processStyles();if(this.b.enqueued){if(T)for(var b=0;b<a.length;b++){var c=this.b.getStyleForCustomStyle(a[b]);if(c&&T&&this.a){var d=qe(c);Lf(this);this.a.transformRules(d);c.textContent=oe(d)}}else for(Nf(this,this.c,this.i),b=0;b<a.length;b++)(c=this.b.getStyleForCustomStyle(a[b]))&&pf(c,this.i.A);this.b.enqueued=!1;this.D&&!T&&this.styleDocument()}}};
+n.styleElement=function(a,b){var c=V(a).is,d=X(a);if(!d){var e=V(a);d=e.is;e=e.J;var f=rf[d];d=Bf[d];if(d){var g=d._styleAst;var h=d.ua}d=$e(a,new Ze(g,f,h,e))}a!==this.c&&(this.D=!0);b&&(d.G=d.G||{},Object.assign(d.G,b));if(T){if(d.G){b=d.G;for(var k in b)null===k?a.style.removeProperty(k):a.style.setProperty(k,b[k])}if(((k=Bf[c])||a===this.c)&&k&&k.ea&&!Ef(k)){if(Ef(k)||k._applyShimValidatingVersion!==k._applyShimNextVersion)Lf(this),this.a&&this.a.transformRules(k._styleAst,c),k.ea.textContent=
+Be(a,d.v),Ff(k);S&&(c=a.shadowRoot)&&(c.querySelector("style").textContent=Be(a,d.v));d.v=k._styleAst}}else if(Nf(this,a,d),d.ca&&d.ca.length){c=d;k=V(a).is;d=(b=Kf.fetch(k,c.A,c.ca))?b.styleElement:null;g=c.m;(h=b&&b.m)||(h=this.fa[k]=(this.fa[k]||0)+1,h=k+"-"+h);c.m=h;h=c.m;e=qf;e=d?d.textContent||"":mf(e,a,c.A,h);f=X(a);var l=f.a;l&&!S&&l!==d&&(l._useCount--,0>=l._useCount&&l.parentNode&&l.parentNode.removeChild(l));S?f.a?(f.a.textContent=e,d=f.a):e&&(d=se(e,h,a.shadowRoot,f.b)):d?d.parentNode||
+(bf&&-1<e.indexOf("@media")&&(d.textContent=e),te(d,null,f.b)):e&&(d=se(e,h,null,f.b));d&&(d._useCount=d._useCount||0,f.a!=d&&d._useCount++,f.a=d);h=d;S||(d=c.m,f=e=a.getAttribute("class")||"",g&&(f=e.replace(new RegExp("\\s*x-scope\\s*"+g+"\\s*","g")," ")),f+=(f?" ":"")+"x-scope "+d,e!==f&&ve(a,f));b||Kf.store(k,c.A,h,c.m)}};function Of(a,b){return(b=b.getRootNode().host)?X(b)?b:Of(a,b):a.c}
+function Nf(a,b,c){a=Of(a,b);var d=X(a);a=Object.create(d.A||null);var e=lf(b,c.v);b=jf(d.v,b).u;Object.assign(a,e.za,b,e.Ca);b=c.G;for(var f in b)if((e=b[f])||0===e)a[f]=e;f=qf;b=Object.getOwnPropertyNames(a);for(e=0;e<b.length;e++)d=b[e],a[d]=gf(f,a[d],a);c.A=a}n.styleDocument=function(a){this.styleSubtree(this.c,a)};
+n.styleSubtree=function(a,b){var c=a.shadowRoot;(c||a===this.c)&&this.styleElement(a,b);if(b=c&&(c.children||c.childNodes))for(a=0;a<b.length;a++)this.styleSubtree(b[a]);else if(a=a.children||a.childNodes)for(b=0;b<a.length;b++)this.styleSubtree(a[b])};n.ka=function(a){var b=this,c=qe(a);pe(c,function(a){if(S)We(a);else{var c=W;a.selector=a.parsedSelector;We(a);a.selector=a.l=Fe(c,a,c.c,void 0,void 0)}T&&(Lf(b),b.a&&b.a.transformRule(a))});T?a.textContent=oe(c):this.i.v.rules.push(c)};
+n.getComputedStyleValue=function(a,b){var c;T||(c=(X(a)||X(Of(this,a))).A[b]);return(c=c||window.getComputedStyle(a).getPropertyValue(b))?c.trim():""};n.Ea=function(a,b){var c=a.getRootNode();b=b?b.split(/\s/):[];c=c.host&&c.host.localName;if(!c){var d=a.getAttribute("class");if(d){d=d.split(/\s/);for(var e=0;e<d.length;e++)if(d[e]===W.a){c=d[e+1];break}}}c&&b.push(W.a,c);T||(c=X(a))&&c.m&&b.push(qf.a,c.m);ve(a,b.join(" "))};n.va=function(a){return X(a)};Y.prototype.flush=Y.prototype.na;
+Y.prototype.prepareTemplate=Y.prototype.prepareTemplate;Y.prototype.styleElement=Y.prototype.styleElement;Y.prototype.styleDocument=Y.prototype.styleDocument;Y.prototype.styleSubtree=Y.prototype.styleSubtree;Y.prototype.getComputedStyleValue=Y.prototype.getComputedStyleValue;Y.prototype.setElementClass=Y.prototype.Ea;Y.prototype._styleInfoForNode=Y.prototype.va;Y.prototype.transformCustomStyleForDocument=Y.prototype.ka;Y.prototype.getStyleAst=Y.prototype.xa;Y.prototype.styleAstToString=Y.prototype.Fa;
+Y.prototype.flushCustomStyles=Y.prototype.C;Object.defineProperties(Y.prototype,{nativeShadow:{get:function(){return S}},nativeCss:{get:function(){return T}}});var Z=new Y,Pf,Qf;window.ShadyCSS&&(Pf=window.ShadyCSS.ApplyShim,Qf=window.ShadyCSS.CustomStyleInterface);window.ShadyCSS={ScopingShim:Z,prepareTemplate:function(a,b,c){Z.C();Z.prepareTemplate(a,b,c)},styleSubtree:function(a,b){Z.C();Z.styleSubtree(a,b)},styleElement:function(a){Z.C();Z.styleElement(a)},styleDocument:function(a){Z.C();Z.styleDocument(a)},getComputedStyleValue:function(a,b){return Z.getComputedStyleValue(a,b)},nativeCss:T,nativeShadow:S};Pf&&(window.ShadyCSS.ApplyShim=Pf);
+Qf&&(window.ShadyCSS.CustomStyleInterface=Qf);var Rf=window.document;window.WebComponents=window.WebComponents||{};function Sf(){requestAnimationFrame(function(){window.WebComponents.ready=!0;window.document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})}function Tf(){Sf();Rf.removeEventListener("readystatechange",Tf)}"loading"!==Rf.readyState?Sf():Rf.addEventListener("readystatechange",Tf);}).call(this);
+
+//# sourceMappingURL=webcomponents-sd-ce.js.map
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-sd-ce.js.map b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-sd-ce.js.map
new file mode 100644
index 00000000000..f65350827a5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/webcomponentsjs/webcomponents-sd-ce.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["node_modules/@webcomponents/shadydom/src/shady-data.js"," [synthetic:util/global] "," [synthetic:util/defineproperty] "," [synthetic:es6/symbol] "," [synthetic:es6/util/makeiterator] "," [synthetic:es6/util/arrayfromiterator] ","node_modules/@webcomponents/shadydom/src/utils.js","node_modules/@webcomponents/shadydom/src/flush.js","node_modules/@webcomponents/shadydom/src/observe-changes.js","node_modules/@webcomponents/shadydom/src/native-methods.js","node_modules/@webcomponents/shadydom/src/innerHTML.js","node_modules/@webcomponents/shadydom/src/native-tree-walker.js","node_modules/@webcomponents/shadydom/src/native-tree-accessors.js","node_modules/@webcomponents/shadydom/src/native-tree.js","node_modules/@webcomponents/shadydom/src/patch-accessors.js","node_modules/@webcomponents/shadydom/src/attach-shadow.js","node_modules/@webcomponents/shadydom/src/patch-builtins.js","node_modules/@webcomponents/shadydom/src/logical-tree.js","node_modules/@webcomponents/shadydom/src/logical-mutation.js"," [synthetic:es6/util/arrayfromiterable] ","node_modules/@webcomponents/shadydom/src/patch-events.js","node_modules/@webcomponents/shadydom/src/array-splice.js","node_modules/@webcomponents/shadydom/src/shadydom.js","node_modules/@webcomponents/custom-elements/src/Utilities.js","node_modules/@webcomponents/custom-elements/src/CustomElementInternals.js","node_modules/@webcomponents/custom-elements/src/CustomElementState.js","node_modules/@webcomponents/custom-elements/src/DocumentConstructionObserver.js","node_modules/@webcomponents/custom-elements/src/CustomElementRegistry.js","node_modules/@webcomponents/custom-elements/src/Deferred.js","node_modules/@webcomponents/custom-elements/src/Patch/Native.js","node_modules/@webcomponents/custom-elements/src/AlreadyConstructedMarker.js","node_modules/@webcomponents/custom-elements/src/Patch/HTMLElement.js","node_modules/@webcomponents/custom-elements/src/custom-elements.js","node_modules/@webcomponents/custom-elements/src/Patch/Interface/ParentNode.js","node_modules/@webcomponents/custom-elements/src/Patch/Document.js","node_modules/@webcomponents/custom-elements/src/Patch/Node.js","node_modules/@webcomponents/custom-elements/src/Patch/Interface/ChildNode.js","node_modules/@webcomponents/custom-elements/src/Patch/Element.js","node_modules/@webcomponents/custom-elements/src/Patch/DocumentFragment.js","node_modules/@webcomponents/shadycss/src/css-parse.js","node_modules/@webcomponents/shadycss/src/style-settings.js","node_modules/@webcomponents/shadycss/src/common-regex.js","node_modules/@webcomponents/shadycss/src/unscoped-style-handler.js","node_modules/@webcomponents/shadycss/src/style-util.js","node_modules/@webcomponents/shadycss/src/style-transformer.js","node_modules/@webcomponents/shadycss/src/style-info.js","node_modules/@webcomponents/shadycss/src/style-properties.js","node_modules/@webcomponents/shadycss/src/style-placeholder.js","node_modules/@webcomponents/shadycss/src/style-cache.js","node_modules/@webcomponents/shadycss/src/document-watcher.js","node_modules/@webcomponents/shadycss/src/template-map.js","node_modules/@webcomponents/shadycss/src/apply-shim-utils.js","node_modules/@webcomponents/shadycss/src/document-wait.js","node_modules/@webcomponents/shadycss/src/scoping-shim.js","node_modules/@webcomponents/shadycss/src/common-utils.js","node_modules/@webcomponents/shadycss/entrypoints/scoping-shim.js","entrypoints/webcomponents-sd-ce-index.js"],"names":["$jscomp.global","$jscomp.defineProperty","$jscomp.initSymbol","$jscomp.Symbol","$jscomp.SYMBOL_PREFIX","$jscomp.arrayIterator","$jscomp.initSymbolIterator","$jscomp.iteratorPrototype","constructor","ShadyData","publicRoot","root","dirty","flattenedNodes","_prevAssignedSlot","_previouslyAssignedNodes","assignedSlot","assignedNodes","observer","childNodes","nextSibling","previousSibling","lastChild","firstChild","parentNode","ownerShadyRoot","undefined","__insideAccessors","__outsideAccessors","toJSON","ensureShadyDataForNode","node","__shady","shadyDataForNode","settings","window","hasNativeShadowDOM","attachShadow","Element","prototype","getRootNode","Node","desc","Object","getOwnPropertyDescriptor","hasDescriptors","configurable","get","inUse","IS_IE","navigator","userAgent","match","IS_EDGE","useNativeAccessors","isTrackingLogicalChildNodes","nodeData","isShadyRoot","obj","_localName","ownerShadyRootForNode","p","matches","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","extend","target","source","n$","getOwnPropertyNames","i","n","length","pd","defineProperty","extendAll","sources","mixin","twiddle","document","createTextNode","content","queue","observe","MutationObserver","shift","e","textContent","characterData","microtask","callback","push","hasDocumentContains","contains","container","flushList","scheduled","enqueue","flush","didFlush","AsyncObserver","_scheduled","addedNodes","removedNodes","callbacks","Set","schedule","mutations","takeRecords","forEach","cb","observeChildren","sd","add","_callback","_observer","_node","unobserveChildren","handle","delete","size","filterMutations","targetRootNode","map","mutation","mutationInScope","nodes","Array","from","filter","create","value","m","insertBefore","replaceChild","removeChild","setAttribute","removeAttribute","cloneNode","importNode","Document","addEventListener","removeEventListener","windowAddEventListener","Window","windowRemoveEventListener","dispatchEvent","HTMLElement","getElementById","elementQuerySelector","querySelector","fragmentQuerySelector","DocumentFragment","documentQuerySelector","elementQuerySelectorAll","querySelectorAll","fragmentQuerySelectorAll","documentQuerySelectorAll","appendChild","selector","nodeType","ELEMENT_NODE","call","DOCUMENT_NODE","escapeAttrRegExp","escapeDataRegExp","escapeReplace","c","makeSet","arr","set","voidElements","plaintextParents","getInnerHTML","localName","s","c$","l","child","tagName","attrs","attributes","attr","name","replace","TEXT_NODE","data","COMMENT_NODE","console","error","Error","nodeWalker","createTreeWalker","NodeFilter","SHOW_ALL","elementWalker","SHOW_ELEMENT","currentNode","parentElement","firstElementChild","lastElementChild","previousElementSibling","nextElementSibling","children","innerHTML","DOCUMENT_FRAGMENT_NODE","textWalker","SHOW_TEXT","nextNode","nodeValue","nativeProtos","findNodeDescriptor","proto","hasOwnProperty","nodeAccessors","fragmentAccessors","documentAccessors","slice","accessors","nativeTreeAccessors","nativeTreeWalker","clearNode","inertDoc","implementation","createHTMLDocument","nativeIsConnectedAccessors","nativeIsConnected","nativeActiveElementDescriptor","OutsideAccessors","ClassNameAccessor","className","getAttribute","InsideAccessors","item","childNodes.item","index","childElementCount","tc","cn","join","text","nativeAccessors","children.item","containerName","htmlContainer","createElement","ShadowRootAccessor","shadowRoot","ActiveElementAccessor","activeElement","active","host","nativeContains","activeRoot","patchAccessorGroup","descriptors","force","objDesc","warn","patchAccessors","patchShadowRootAccessors","ShadyRoot","__proto__","defineProperties","nodeName","prop","patchOutsideElementAccessors","element","patchInsideElementAccessors","linkNode","ref_node","containerData","ref_nodeData","psd","nsd","recordChildNodes","parent","refData","ownerRoot","slotsAdded","slots","_ensureSlotData","_pendingSlots","_slotList","_slotMap","$jscomp.arrayFromIterator","$jscomp.makeIterator","_asyncRender","resetTo","parentData","hasShadowRootWithSlot","preventNativeInsert","firstComposedNode","nativeMethods","scheduleObserver","preventNativeRemove","removeOwnerShadyRoot","changeSlotContent","_validateSlots","slot","splice","x","indexOf","didRemove","removingInsertionPoint","composed","flattened","_hasInsertionPoint","distributeAttributeChange","oldName","__slotName","_nameForSlot","list","_sortSlots","addedNode","removedNode","documentElement","query","matcher","halter","queryElements","elements","result","scopingShim","deep","ownerDocument","nc","eventWrappersName","Date","now","alwaysComposed","pathComposer","startNode","composedPath","current","startRoot","retarget","refNode","path","refNodePath","ancestor","lastRoot","rootIdx","eventMixin","isTrusted","__composed","type","__composedPath","currentTarget","relatedTarget","__relatedTarget","__relatedTargetComposedPath","stopPropagation","Event","__propagationStopped","stopImmediatePropagation","__immediatePropagationStopped","mixinComposedFlag","Base","klazz","options","event","nonBubblingEventsToRetarget","hasRetargeted","fireHandlers","phase","hs","__handlers","fn","retargetNonBubblingEvent","AT_TARGET","lastFiredRoot","findListener","wrappers","capture","once","passive","savedType","savedListener","savedCapture","savedOnce","savedPassive","savedNode","fnOrObj","optionsOrCapture","handlerType","handleEvent","__shadyTarget","wrapperFn","patchEvent","lastCurrentTargetDesc","eventPhase","BUBBLING_PHASE","CAPTURING_PHASE","bubbles","ret","ael","idx","rel","activateFocusEventOverrides","ev","getPrototypeOf","patchProto","__sourceProto","PatchedEvent","PatchedCustomEvent","CustomEvent","PatchedMouseEvent","MouseEvent","newSplice","addedCount","removed","calcSplices","currentEnd","old","oldEnd","currentStart","oldStart","prefixCount","suffixCount","minLength","Math","min","currentValue","previousValue","index1","index2","count","equals","rowCount","columnCount","distances","j","north","west","edits","EDIT_ADD","EDIT_DELETE","northWest","EDIT_LEAVE","EDIT_UPDATE","reverse","splices","oldIndex","ShadyRootConstructionToken","ancestorList","ancestors","unshift","token","TypeError","SHADYROOT_NAME","_mode","mode","hostData","MODE_CLOSED","rootData","_renderPending","_render","renderRoot","_distribute","slotData","_distributeNodeToSlot","slotParentRoot","slotParentData","_addAssignedToFlattenedNodes","prevAssignedNodes","_fireSlotChange","_compose","composeList","targetNode","distributedNode","d","next","forcedSlot","oldSlot","CATCHALL_NAME","assigned","nestedAssigned","slotNamesToSort","_mapSlots","sort","a","b","listA","listB","nA","nB","getAssignedSlot","windowMixin","bind","nodeMixin","IsConnectedAccessor","isConnected","textMixin","fragmentMixin","useNative","o","slotMixin","flatten","elementMixin","documentMixin","id","nativeBlur","blur","htmlElementMixin","shadowActive","shadowRootMixin","patchBuiltin","ShadyDOM","patch","nativeHTMLElement","Text","HTMLSlotElement","ShadowRoot","reservedTagList","isValidCustomElementName","reserved","has","validForm","test","nativeValue","__CE_isImportDocument","nextSiblingOrAncestorSibling","start","walkDeepDescendantElements","visitedImports","import","__CE_shadowRoot","setPropertyUnchecked","destination","CustomElementInternals","_localNameToDefinition","Map","_constructorToDefinition","_patches","_hasPatches","setDefinition","definition","addPatch","listener","patchTree","__CE_patched","connectTree","custom","__CE_state","connectedCallback","upgradeElement","disconnectTree","disconnectedCallback","patchAndUpgradeTree","upgrade","gatherElements","__CE_hasRegistry","readyState","__CE_documentLoadHandled","clonedVisitedImports","defaultView","localNameToDefinition","constructionStack","pop","failed","__CE_definition","attributeChangedCallback","observedAttributes","oldValue","newValue","namespace","DocumentConstructionObserver","internals","doc","_internals","_document","_handleMutations","childList","subtree","disconnect","Deferred","_resolve","_value","_promise","Promise","resolve","CustomElementRegistry","_elementDefinitionIsRunning","_whenDefinedDeferred","_flushCallback","this._flushCallback","_flushPending","_pendingDefinitions","_documentConstructionObserver","CustomElementRegistry$$module$node_modules$$webcomponents$custom_elements$src$CustomElementRegistry.prototype","?.prototype","define","Function","SyntaxError","getCallback","callbackValue","adoptedCallback","_flush","pendingDefinitions","elementsWithStableDefinitions","elementsWithPendingDefinitions","pendingElements","pendingUpgradableElements","deferred","CustomElementRegistry$$module$node_modules$$webcomponents$custom_elements$src$CustomElementRegistry_prototype$whenDefined","whenDefined","reject","prior","some","polyfillWrapFlushCallback","outer","inner","Document_createElement","Document_createElementNS","createElementNS","Document_importNode","Document_prepend","Document_append","DocumentFragment_prepend","DocumentFragment_append","Node_cloneNode","Node_appendChild","Node_insertBefore","Node_removeChild","Node_replaceChild","Node_textContent","Element_attachShadow","Element_innerHTML","Element_getAttribute","Element_setAttribute","Element_removeAttribute","Element_getAttributeNS","getAttributeNS","Element_setAttributeNS","setAttributeNS","Element_removeAttributeNS","removeAttributeNS","Element_insertAdjacentElement","Element_insertAdjacentHTML","Element_prepend","Element_append","Element_before","Element_after","Element_replaceWith","Element_remove","HTMLElement_innerHTML","HTMLElement_insertAdjacentElement","HTMLElement_insertAdjacentHTML","$jscompDefaultExport","AlreadyConstructedMarker","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Document_createElement.call","setPrototypeOf","lastIndex","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.HTMLElement","builtIn","appendPrependPatch","builtInMethod","connectedElements","apply","prepend","append","clone","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Document_importNode.call","NS_HTML","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Document_createElementNS.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Document_prepend","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Document_append","patch_textContent","baseDescriptor","enumerable","assignedValue","childNodesLength","insertedNodes","nativeResult","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_insertBefore.call","nodeWasConnected","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_appendChild.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_cloneNode.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_removeChild.call","nodeToInsert","nodeToRemove","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_replaceChild.call","nodeToInsertWasConnected","thisIsConnected","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_textContent","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Node_textContent.get","parts","beforeAfterPatch","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_before","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_after","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_replaceWith","wasConnected","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_remove","patch_innerHTML","htmlString","removedElements","patch_insertAdjacentElement","baseMethod","position","insertedElement","patch_insertAdjacentHTML","upgradeNodesInRange","end","toLowerCase","marker","String","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_attachShadow","init","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_attachShadow.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_innerHTML","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_innerHTML.get","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.HTMLElement_innerHTML","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.HTMLElement_innerHTML.get","isTemplate","rawElement","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_setAttribute.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_getAttribute.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_setAttributeNS.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_getAttributeNS.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_removeAttribute.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_removeAttributeNS.call","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.HTMLElement_insertAdjacentElement","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_insertAdjacentElement","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.HTMLElement_insertAdjacentHTML","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_insertAdjacentHTML","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_prepend","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.Element_append","priorCustomElements","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.DocumentFragment_prepend","$jscompDefaultExport$$module$node_modules$$webcomponents$custom_elements$src$Patch$Native.DocumentFragment_append","customElements","StyleNode","parse","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.comments","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.port","parseCss","OPEN_BRACE","previous","CLOSE_BRACE","t","substring","trim","ss","_expandUnicodeEscapes","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.multipleSpaces","lastIndexOf","AT_START","MEDIA_START","types$$module$node_modules$$webcomponents$shadycss$src$css_parse.MEDIA_RULE","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.keyframesRule","types$$module$node_modules$$webcomponents$shadycss$src$css_parse.KEYFRAMES_RULE","split","VAR_START","types$$module$node_modules$$webcomponents$shadycss$src$css_parse.MIXIN_RULE","types$$module$node_modules$$webcomponents$shadycss$src$css_parse.STYLE_RULE","r$","r","code","repeat","stringify","preserveProperties","cssText","rules","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.customProp","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.mixinProp","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.mixinApply","RX$$module$node_modules$$webcomponents$shadycss$src$css_parse.varApply","STYLE_RULE","KEYFRAMES_RULE","MEDIA_RULE","MIXIN_RULE","comments","port","customProp","mixinProp","mixinApply","varApply","keyframesRule","multipleSpaces","nativeShadow","nativeCssVariables_","calcCssVariables","CSS","supports","ShadyCSS","nativeCss","nativeCssVariables","VAR_ASSIGN","MIXIN_MATCH","VAR_CONSUMED","ANIMATION_MATCH","MEDIA_MATCH","BRACKETED","styleTextSet","toCssText","forEachRule","rulesForStyle","style","isKeyframesSelector","rule","styleRuleCallback","keyframesRuleCallback","onlyActiveRules","skipRules","matchMedia","applyCss","moniker","contextNode","applyStyle","lastHeadApplyNode","head","compareDocumentPosition","DOCUMENT_POSITION_PRECEDING","processVariableAndFallback","str","level","prefix","suffix","comma","fallback","setElementClassRaw","getIsExtends","typeExtension","is","extends","StyleTransformer","dom","scope","shouldRemoveScope","_transformDom","_content","classList","remove","SCOPE_NAME","CLASS","elementStyles","styleRules","cssBuildType","css","ext","hostScope","_calcHostScope","CSS_CLASS_PREFIX","isScoped","transformedSelector","_transformRuleCss","self","_transformComplexSelector","transformer","p$","COMPLEX_SELECTOR_SEP","_twiddleNthPlus","NTH","inside","stop","isNth","SLOTTED_START","HOST","SIMPLE_SELECTOR_SEP","info","_transformCompoundSelector","combinator","slottedIndex","SLOTTED","_transformHostSelector","_transformSimpleSelector","slotted","SLOTTED_PAREN","paren","DIR_PAREN","before","dir","PSEUDO_PREFIX","HOST_PAREN","SIMPLE_SELECTOR_PREFIX","typeSelector","SELECTOR_NO_MATCH","normalizeRootSelector","ROOT","_transformDocumentSelector","SCOPE_DOC_SELECTOR","$jscomp.global.Object.defineProperties","RegExp","StyleInfo","ast","placeholder","ownStylePropertyNames","overrideStyleProperties","customStyle","scopeSelector","styleProperties","styleInfo","_getStyleRules","method","StyleProperties","decorateStyles","props","keyframes","ruleIndex","decorateRule","propertyInfo","exec","onKeyframesRule","_keyframes","names","properties","collectProperties","hasProperties","assign","any","valueForProperty","property","valueForProperties","propertyValue","colon","pp","propertyDataFromStyles","selectorToMatch","parseInt","key","whenHostOrRootRule","cssBuild","parsedSelector","isRoot","isHost","hostAndRootPropertiesForScope","hostProps","rootProps","_element","transformStyles","hostSelector","hostRx","HOST_PREFIX","rxHostSelector","HOST_SUFFIX","StyleInfo$$module$node_modules$$webcomponents$shadycss$src$style_info.get","keyframeTransforms","_elementKeyframeTransforms","output","input","hasAnimations","keyframeNamesToTransform","keyframe","transform","keyframesRules","keyframesNameRx","transformedKeyframesName","scopeId","_keyframesRuleTransformer","applyCustomStyle","XSCOPE_NAME","placeholderMap","ce","origDefine","wrappedDefine","clazz","placeHolder","createComment","after","StyleCache","cache","store","tagname","styleElement","typeMax","fetch","ownPropertyNames","entry","pn","handler","mxns","mxn","classes","hasAttribute","currentScope","newScope","unscoped","delayedStart","body","requestAnimationFrame","module$node_modules$$webcomponents$shadycss$src$document_watcher.flush","templateMap","promise","invalidate","elementName","template","templateIsValid","startValidatingTemplate","_validating","then","readyPromise","whenReady","resolveFn","documentWait","styleCache","ScopingShim","_scopeCounter","_documentOwner","_documentOwnerStyleInfo","StyleInfo$$module$node_modules$$webcomponents$shadycss$src$style_info.set","_elementsHaveApplied","_customStyleInterface","_applyShim","_ensure","ScopingShim$$module$node_modules$$webcomponents$shadycss$src$scoping_shim.prototype","ScopingShim$$module$node_modules$$webcomponents$shadycss$src$scoping_shim_prototype$flush","getStyleAst","styleAstToString","prepareTemplate","_prepared","styleTextParts","styles","scopingAttribute","newStyle","__cssBuild","_cssBuild","shadowroot","_style","_ownPropertyNames","_ensureCustomStyleInterface","CustomStyleInterface","transformCustomStyleForDocument","flushCustomStyles","_ensureApplyShim","ApplyShim","customStyles","_revalidateCustomStyleApplyShim","_updateProperties","_applyCustomStyles","styleDocument","overrideProps","_isRootOwner","removeProperty","setProperty","cachedStyle","cacheEntry","oldScopeSelector","cachedScopeSelector","applyElementStyle","v","_styleOwnerForNode","owner","ownerStyleInfo","hostAndRootProps","propertiesMatchingHost","propertyData","overrides","reify","styleSubtree","shadowChildren","documentRule","_transformRule","getComputedStyleValue","getComputedStyle","getPropertyValue","setElementClass","classString","scopeName","classAttr","k$","_styleInfoForNode","elementExtends","WebComponents","fire","ready","wait"],"mappings":"A;;;;;;;;;;;;;;;;;;aAWA,IAAA,CAAA,CCgCAA,EAb2B,WAAlB,EAAC,MAAO,OAAR,EAAiC,MAAjC,GAa0B,IAb1B,CAa0B,IAb1B,CAEe,WAAlB,EAAC,MAAO,OAAR,EAA2C,IAA3C,EAAiC,MAAjC,CAAmD,MAAnD,CAW6B,IDhCnC,CEyBAC,GAC4D,UAAxD,EAAsB,MAAO,OAAA,iBAA7B,CACA,MAAA,eADA,CAEA,QAAQ,CAAC,CAAD,CAAS,CAAT,CAAmB,CAAnB,CAA+B,CAOjC,CAAJ,EAAc,KAAA,UAAd,EAAiC,CAAjC,EAA2C,MAAA,UAA3C,GACA,CAAA,CAAO,CAAP,CADA,CACmB,CAAA,MADnB,CAPqC,CCZtB,SAAA,GAAQ,EAAG,CAE9BC,EAAA,CAAqB,QAAQ,EAAG,EAE3BF,EAAA,OAAL,GACEA,CAAA,OADF,CAC6BG,EAD7B,CAJ8B,CAehC,IAAAA,GAAuD,QAAQ,EAAG,CAChE,IAAI,EAAU,CAUd,OAJA,SAAe,CAAC,CAAD,CAAkB,CAC/B,MA9BoBC,gBA8BpB,EAC6B,CAD7B,EACgD,EADhD,EACuD,CAAA,EAFxB,CAP+B,CAAZ,EAoBzB;QAAA,GAAQ,EAAG,CACtCF,EAAA,EACA,KAAI,EAAiBF,CAAA,OAAA,SAChB,EAAL,GACE,CADF,CACmBA,CAAA,OAAA,SADnB,CAEMA,CAAA,OAAA,CAAyB,UAAzB,CAFN,CAK8C,WAA9C,EAAI,MAAO,MAAA,UAAA,CAAgB,CAAhB,CAAX,EACEC,EAAA,CACI,KAAA,UADJ,CACqB,CADrB,CACqC,CAC/B,aAAc,CAAA,CADiB,CAE/B,SAAU,CAAA,CAFqB,CAO/B,MAAO,QAAQ,EAAG,CAChB,MAAOI,GAAA,CAAsB,IAAtB,CADS,CAPa,CADrC,CAeFC,GAAA,CAA6B,QAAQ,EAAG,EAxBF,CAkChB,QAAA,GAAQ,CAAC,CAAD,CAAQ,CACtC,IAAI,EAAQ,CACZ,OAAOC,GAAA,CAA0B,QAAQ,EAAG,CAC1C,MAAI,EAAJ,CAAY,CAAA,OAAZ,CACS,CACL,KAAM,CAAA,CADD,CAEL,MAAO,CAAA,CAAM,CAAA,EAAN,CAFF,CADT,CAMS,CAAC,KAAM,CAAA,CAAP,CAPiC,CAArC,CAF+B,CA0BZ,QAAA,GAAQ,CAAC,CAAD,CAAO,CACzCD,EAAA,EAEI,EAAA,CAAW,CAAC,KAAM,CAAP,CAKf,EAAA,CAASN,CAAA,OAAA,SAAT,CAAA,CAA8C,QAAQ,EAAG,CAAE,MAAO,KAAT,CACzD,OAAyC,EATA,CC5FpB,QAAA,GAAQ,CAAC,CAAD,CAAW,CACxCM,EAAA,EAGA,KAAI,EAAqC,CAAD,CAAW,MAAA,SAAX,CACxC,OAAO,EAAA,CAAmB,CAAA,KAAA,CAAsB,CAAtB,CAAnB,CACHD,EAAA,CAA6C,CAA7C,CANoC;ACEd,QAAA,GAAQ,CAAC,CAAD,CAAW,CAG7C,IAFA,IAAI,CAAJ,CACI,EAAM,EACV,CAAO,CAAC,CAAC,CAAD,CAAK,CAAA,KAAA,EAAL,MAAR,CAAA,CACE,CAAA,KAAA,CAAS,CAAA,MAAT,CAEF,OAAO,EANsC,CLpB7CG,QADWC,GACA,EAAG,CAIZ,IAAAC,GAAA,CAFA,IAAAC,KAEA,CAFY,IAGZ,KAAAC,EAAA,CAAa,CAAA,CAWb,KAAAC,EAAA,CAFA,IAAAC,EAEA,CAJA,IAAAC,GAIA,CANA,IAAAC,aAMA,CARA,IAAAC,cAQA,CAVA,IAAAC,EAUA,CAVgB,IAuBhB,KAAAC,WAAA,CAFA,IAAAC,YAEA,CAJA,IAAAC,gBAIA,CANA,IAAAC,UAMA,CARA,IAAAC,WAQA,CAVA,IAAAC,WAUA,CAZA,IAAAC,EAYA,CAZsBC,IAAAA,EActB,KAAAC,GAAA,CADA,IAAAC,GACA,CAD0B,CAAA,CA9Bd,CAkCd,EAAA,UAAA,OAAA,CAAAC,QAAM,EAAG,CACP,MAAO,EADA,CAKJC,SAASA,EAAsB,CAACC,CAAD,CAAO,CACtCA,CAAAC,EAAL,GACED,CAAAC,EADF,CACiB,IAAIvB,EADrB,CAGA,OAAOsB,EAAAC,EAJoC,CAOtCC,QAASA,EAAgB,CAACF,CAAD,CAAO,CACrC,MAAOA,EAAP,EAAeA,CAAAC,EADsB,C,CM/ChC,IAAIE,EAAWC,MAAA,SAAXD,EAAiC,EAE5CA,EAAAE,GAAA,CAA8B,EAAQC,CAAAC,OAAAC,UAAAF,aAAR,EAA0CG,CAAAC,IAAAF,UAAAC,YAA1C,CAE9B,KAAIE,GAAOC,MAAAC,yBAAA,CAAgCH,IAAAF,UAAhC,CAAgD,YAAhD,CAEXL,EAAAW,EAAA,CAA0B,CAAA,EAAQH,EAAR,EAAgBA,EAAAI,aAAhB,EAAqCJ,EAAAK,IAArC,CAC1Bb,EAAAc,GAAA,CAAiBd,CAAA,MAAjB,EAAsC,CAACA,CAAAE,GAIvC,KAAMa,GAAQC,SAAAC,UAAAC,MAAA,CAA0B,SAA1B,CAAd,CACMC,GAAUH,SAAAC,UAAAC,MAAA,CAA0B,MAA1B,CACoB1B,KAAAA,EAApC,GAAIQ,CAAAoB,GAAJ,GACEpB,CAAAoB,GADF,CACgCpB,CAAAW,EADhC,GAC4DI,EAD5D,EACqEI,EADrE,EAIOE,SAASA,EAA2B,CAACxB,CAAD,CAAO,CAEhD,OADMyB,CACN,CN4BcvB,CM7BG,CAAiBF,CAAjB,CACjB,GAA4CL,IAAAA,EAA5C,GAAoB8B,CAAAjC,WAF4B,CAK3CkC,QAASA,EAAW,CAACC,CAAD,CAAM,CAC/B,MAAkC,WAAlC,GAAeA,CAAAC,GADgB,CAI1BC,QAASA,EAAqB,CAAC7B,CAAD,CAAO,CACtCpB,CAAAA,CAAOoB,CAAAS,YAAA,EACX,IAAIiB,CAAA,CAAY9C,CAAZ,CAAJ,CACE,MAAOA,EAHiC;AAO5C,IAAIkD,GAAIvB,OAAAC,UAAR,CACIuB,GAAUD,EAAAC,QAAVA,EAAuBD,EAAAE,gBAAvBD,EACFD,EAAAG,mBADEF,EACsBD,EAAAI,kBADtBH,EAEFD,EAAAK,iBAFEJ,EAEoBD,EAAAM,sBAajBC,SAASA,GAAM,CAACC,CAAD,CAASC,CAAT,CAAiB,CACrC,GAAID,CAAJ,EAAcC,CAAd,CAEE,IADA,IAAIC,EAAK5B,MAAA6B,oBAAA,CAA2BF,CAA3B,CAAT,CACSG,EAAE,CADX,CACcC,CAAd,CAAkBD,CAAlB,CAAoBF,CAAAI,OAApB,GAAmCD,CAAnC,CAAqCH,CAAA,CAAGE,CAAH,CAArC,EAA6CA,CAAA,EAA7C,CAAkD,CATpD,IAAIG,EAAKjC,MAAAC,yBAAA,CAUc0B,CAVd,CAUWI,CAVX,CACLE,EAAJ,EACEjC,MAAAkC,eAAA,CAQ6BR,CAR7B,CAQkBK,CARlB,CAAoCE,CAApC,CAOkD,CAHf,CAUhCE,QAASA,GAAS,CAACT,CAAD,CAAS,CAAT,CAAqB,CAAZ,IAAA,IAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,SAAA,OAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAChC,KAASI,CAAT,CAAW,CAAX,CAAcA,CAAd,CAD4CM,CAC1BJ,OAAlB,CAAkCF,CAAA,EAAlC,CACEL,EAAA,CAAOC,CAAP,CAF0CU,CAE3B,CAAQN,CAAR,CAAf,CAEF,OAAOJ,EAJqC,CAOvCW,QAASA,GAAK,CAACX,CAAD,CAASC,CAAT,CAAiB,CACpC,IAAKG,IAAIA,CAAT,GAAcH,EAAd,CACED,CAAA,CAAOI,CAAP,CAAA,CAAYH,CAAA,CAAOG,CAAP,CAFsB;AAoBtC,IAAIQ,GAAUC,QAAAC,eAAA,CAAwB,EAAxB,CAAd,CACIC,GAAU,CADd,CAEIC,GAAQ,EACZC,EAAA,IAAIC,gBAAJ,CAAqB,QAAA,EAAM,CACzB,IAAA,CAAOF,EAAAV,OAAP,CAAA,CAEE,GAAI,CACFU,EAAAG,MAAA,EAAA,EADE,CAEF,MAAMC,CAAN,CAAS,CAGT,KADAR,GAAAS,YACMD,CADgBL,EAAA,EAChBK,CAAAA,CAAN,CAHS,CALY,CAA3B,CAAAH,SAAA,CAWWL,EAXX,CAWoB,CAACU,cAAe,CAAA,CAAhB,CAXpB,CAcOC,SAASA,GAAS,CAACC,CAAD,CAAW,CAClCR,EAAAS,KAAA,CAAWD,CAAX,CACAZ,GAAAS,YAAA,CAAsBN,EAAA,EAFY,CAK7B,IAAMW,GAAsB,CAAA,CAAQb,QAAAc,SAEpCA,SAASA,GAAQ,CAACC,CAAD,CAAYlE,CAAZ,CAAkB,CACxC,IAAA,CAAOA,CAAP,CAAA,CAAa,CACX,GAAIA,CAAJ,EAAYkE,CAAZ,CACE,MAAO,CAAA,CAETlE,EAAA,CAAOA,CAAAP,WAJI,CAMb,MAAO,CAAA,CAPiC,C,CC5G1C,IAAI0E,GAAY,EAAhB,CACIC,EACGC,SAASA,GAAO,CAACP,CAAD,CAAW,CAC3BM,EAAL,GACEA,EACA,CADY,CAAA,CACZ,CDgGYP,EChGZ,CAAgBS,EAAhB,CAFF,CAIAH,GAAAJ,KAAA,CAAeD,CAAf,CALgC,CAQ3BQ,QAASA,GAAK,EAAG,CACtBF,EAAA,CAAY,CAAA,CAEZ,KADA,IAAIG,EAAW,CAAA,CAAQJ,EAAAvB,OACvB,CAAOuB,EAAAvB,OAAP,CAAA,CACEuB,EAAAV,MAAA,EAAA,EAEF,OAAOc,EANe,CASxBD,EAAA,KAAA,CAAgBH,E,CCjBd1F,QAFI+F,GAEO,EAAG,CACZ,IAAAC,EAAA,CAAkB,CAAA,CAClB,KAAAC,WAAA,CAAkB,EAClB,KAAAC,aAAA,CAAoB,EACpB,KAAAC,EAAA,CAAiB,IAAIC,GAJT,CAOdC,QAAA,GAAQ,CAARA,CAAQ,CAAG,CACJ,CAAAL,EAAL,GACE,CAAAA,EACA,CADkB,CAAA,CAClB,CFyFUZ,EEzFV,CAAgB,QAAA,EAAM,CACpBS,EAAA,CAJKA,CAIL,CADoB,CAAtB,CAFF,CADS,CASXA,QAAA,GAAK,CAALA,CAAK,CAAG,CACN,GAAI,CAAAG,EAAJ,CAAqB,CACnB,CAAAA,EAAA,CAAkB,CAAA,CAClB,KAAIM,EAAY,CAAAC,YAAA,EACZD,EAAAnC,OAAJ,EACE,CAAAgC,EAAAK,QAAA,CAAuB,QAAQ,CAACC,CAAD,CAAK,CAClCA,CAAA,CAAGH,CAAH,CADkC,CAApC,CAJiB,CADf,CAYR,EAAA,UAAA,YAAA,CAAAC,QAAW,EAAG,CACZ,GAAI,IAAAN,WAAA9B,OAAJ,EAA8B,IAAA+B,aAAA/B,OAA9B,CAAwD,CACtD,IAAImC,EAAY,CAAC,CACfL,WAAY,IAAAA,WADG,CAEfC,aAAc,IAAAA,aAFC,CAAD,CAIhB,KAAAD,WAAA,CAAkB,EAClB,KAAAC,aAAA,CAAoB,EACpB,OAAOI,EAP+C,CASxD,MAAO,EAVK,CAoBaI;QAAA,GAAQ,CAACnF,CAAD,CAAO8D,CAAP,CAAiB,CACpD,IAAMsB,ERbQrF,CQaH,CAAuBC,CAAvB,CACNoF,EAAAjG,EAAL,GACEiG,CAAAjG,EADF,CACgB,IAAIqF,EADpB,CAGAY,EAAAjG,EAAAyF,EAAAS,IAAA,CAA0BvB,CAA1B,CACA,KAAI3E,EAAWiG,CAAAjG,EACf,OAAO,CACLmG,GAAWxB,CADN,CAELyB,EAAWpG,CAFN,CAGLqG,GAAOxF,CAHF,CAIL,YAAAgF,QAAW,EAAG,CACZ,MAAO7F,EAAA6F,YAAA,EADK,CAJT,CAP6C,CAiBvBS,QAAA,GAAQ,CAACC,CAAD,CAAS,CAC9C,IAAIvG,EAAWuG,CAAXvG,EAAqBuG,CAAAH,EACrBpG,EAAJ,GACEA,CAAAyF,EAAAe,OAAA,CAA0BD,CAAAJ,GAA1B,CACA,CAAKnG,CAAAyF,EAAAgB,KAAL,GRjCY7F,CQkCV,CAAuB2F,CAAAF,GAAvB,CAAArG,EADF,CACkD,IADlD,CAFF,CAF8C;AAUzC0G,QAASA,GAAe,CAACd,CAAD,CAAYzC,CAAZ,CAAoB,CAEjD,IAAMwD,EAAiBxD,CAAA7B,YAAA,EACvB,OAAOsE,EAAAgB,IAAA,CAAc,QAAQ,CAACC,CAAD,CAAW,CAEtC,IAAMC,EAAmBH,CAAnBG,GAAsCD,CAAA1D,OAAA7B,YAAA,EAC5C,IAAIwF,CAAJ,EAAuBD,CAAAtB,WAAvB,CAIE,IAHIwB,CAGAtD,CAHQuD,KAAAC,KAAA,CAAWJ,CAAAtB,WAAX,CAAA2B,OAAA,CAAuC,QAAQ,CAAC1D,CAAD,CAAI,CAC7D,MAAQmD,EAAR,GAA2BnD,CAAAlC,YAAA,EADkC,CAAnD,CAGRmC,CAAAsD,CAAAtD,OAAJ,CAME,MALAoD,EAKOA,CALIpF,MAAA0F,OAAA,CAAcN,CAAd,CAKJA,CAJPpF,MAAAkC,eAAA,CAAsBkD,CAAtB,CAAgC,YAAhC,CAA8C,CAC5CO,MAAOL,CADqC,CAE5CnF,aAAc,CAAA,CAF8B,CAA9C,CAIOiF,CAAAA,CANT,CAJF,IAYO,IAAIC,CAAJ,CACL,MAAOD,EAhB6B,CAAjC,CAAAK,OAAA,CAkBG,QAAQ,CAACG,CAAD,CAAI,CAAE,MAAOA,EAAT,CAlBf,CAH0C,C,CChFnD,IAAA,EAAA,EAAA,CACWC,GAAelG,OAAAC,UAAAiG,aAD1B,CAEWC,GAAenG,OAAAC,UAAAkG,aAF1B,CAGWC,GAAcpG,OAAAC,UAAAmG,YAHzB,CAIWC,GAAerG,OAAAC,UAAAoG,aAJ1B,CAKWC,GAAkBtG,OAAAC,UAAAqG,gBAL7B,CAMWC,GAAYvG,OAAAC,UAAAsG,UANvB,CAOWC,GAAaC,QAAAxG,UAAAuG,WAPxB,CAQWE,GAAmB1G,OAAAC,UAAAyG,iBAR9B,CASWC,GAAsB3G,OAAAC,UAAA0G,oBATjC,CAUWC,GAAyBC,MAAA5G,UAAAyG,iBAVpC,CAWWI,GAA4BD,MAAA5G,UAAA0G,oBAXvC,CAYWI,GAAgB/G,OAAAC,UAAA8G,cAZ3B,CAaWrD,GAAWvD,IAAAF,UAAAyD,SAAXA,EAAsCsD,WAAA/G,UAAAyD,SAbjD,CAcWuD,GAAiBR,QAAAxG,UAAAgH,eAd5B;AAeWC,GAAuBlH,OAAAC,UAAAkH,cAflC,CAgBWC,GAAwBC,gBAAApH,UAAAkH,cAhBnC,CAiBWG,GAAwBb,QAAAxG,UAAAkH,cAjBnC,CA4BWI,GAA0BvH,OAAAC,UAAAuH,iBA5BrC,CA6BWC,GAA2BJ,gBAAApH,UAAAuH,iBA7BtC,CA8BWE,GAA2BjB,QAAAxG,UAAAuH,iBA9B3BG,EAAAA,YAAAA,CAAc3H,OAAAC,UAAA0H,YACdzB,EAAAA,aAAAA,CAAAA,EACAC,EAAAA,aAAAA,CAAAA,EACAC,EAAAA,YAAAA,CAAAA,EACAC,EAAAA,aAAAA,CAAAA,EACAC,EAAAA,gBAAAA,CAAAA,EACAC,EAAAA,UAAAA,CAAAA,EACAC,EAAAA,WAAAA,CAAAA,EACAE,EAAAA,iBAAAA,CAAAA,EACAC,EAAAA,oBAAAA,CAAAA,EACAC,EAAAA,GAAAA,CAAAA,EACAE,EAAAA,GAAAA,CAAAA,EACAC,EAAAA,cAAAA,CAAAA,EACArD,EAAAA,SAAAA,CAAAA,EACAuD;CAAAA,eAAAA,CAAAA,EACAC,EAAAA,GAAAA,CAAAA,EACAE,EAAAA,GAAAA,CAAAA,EACAE,EAAAA,GAAAA,CAAAA,EACAH,EAAAA,cAAAA,CAAgBA,QAAQ,CAACS,CAAD,CAAW,CAC5C,OAAQ,IAAAC,SAAR,EACE,KAAK1H,IAAA2H,aAAL,CACE,MAAOZ,GAAAa,KAAA,CAA0B,IAA1B,CAAgCH,CAAhC,CACT,MAAKzH,IAAA6H,cAAL,CACE,MAAOV,GAAAS,KAAA,CAA2B,IAA3B,CAAiCH,CAAjC,CACT,SACE,MAAOR,GAAAW,KAAA,CAA2B,IAA3B,CAAiCH,CAAjC,CANX,CAD4C,CAUnCL,EAAAA,GAAAA,CAAAA,EACAE,EAAAA,GAAAA,CAAAA,EACAC,EAAAA,GAAAA,CAAAA,EACAF,EAAAA,iBAAAA,CAAmBA,QAAQ,CAACI,CAAD,CAAW,CAC/C,OAAQ,IAAAC,SAAR,EACE,KAAK1H,IAAA2H,aAAL,CACE,MAAOP,GAAAQ,KAAA,CAA6B,IAA7B,CAAmCH,CAAnC,CACT,MAAKzH,IAAA6H,cAAL,CACE,MAAON,GAAAK,KAAA,CAA8B,IAA9B,CAAoCH,CAApC,CACT,SACE,MAAOH,GAAAM,KAAA,CAA8B,IAA9B,CAAoCH,CAApC,CANX,CAD+C,C,CCzBjD,IAAIK,GAAmB,aAAvB,CACIC,GAAmB,cAEvBC,SAASA,GAAa,CAACC,CAAD,CAAI,CACxB,OAAQA,CAAR,EACE,KAAK,GAAL,CACE,MAAO,OACT,MAAK,GAAL,CACE,MAAO,MACT,MAAK,GAAL,CACE,MAAO,MACT,MAAK,GAAL,CACE,MAAO,QACT,MAAK,QAAL,CACE,MAAO,QAVX,CADwB,CAuB1BC,QAASA,GAAO,CAACC,CAAD,CAAM,CAEpB,IADA,IAAIC,EAAM,EAAV,CACSpG,EAAI,CAAb,CAAgBA,CAAhB,CAAoBmG,CAAAjG,OAApB,CAAgCF,CAAA,EAAhC,CACEoG,CAAA,CAAID,CAAA,CAAInG,CAAJ,CAAJ,CAAA,CAAc,CAAA,CAEhB,OAAOoG,EALa,CAStB,IAAIC,GAAeH,EAAA,CAAQ,qFAAA,MAAA,CAAA,GAAA,CAAR,CAAnB,CAmBII,GAAmBJ,EAAA,CAAQ,6DAAA,MAAA,CAAA,GAAA,CAAR,CAoDhBK;QAASA,GAAY,CAACjJ,CAAD,CAAO8D,CAAP,CAAiB,CACpB,UAAvB,GAAI9D,CAAAkJ,UAAJ,GACElJ,CADF,CAC8CA,CAADqD,QAD7C,CAKA,KAFA,IAAI8F,EAAI,EAAR,CACIC,EAAKtF,CAAA,CAAWA,CAAA,CAAS9D,CAAT,CAAX,CAA4BA,CAAAZ,WADrC,CAESsD,EAAE,CAFX,CAEc2G,EAAED,CAAAxG,OAFhB,CAE2B0G,CAA3B,CAAmC5G,CAAnC,CAAqC2G,CAArC,GAA4CC,CAA5C,CAAkDF,CAAA,CAAG1G,CAAH,CAAlD,EAA0DA,CAAA,EAA1D,CAA+D,CA1CR,CAAA,CAAA,CA2CnC4G,IAAAA,EAAAA,CAAOtJ,KAAAA,EAAAA,CAAM8D,KAAAA,EAAAA,CA1CjC,QAAQ9D,CAAAoI,SAAR,EACE,KAAK1H,IAAA2H,aAAL,CAIE,IAHA,IAAIkB,EAAUvJ,CAAAkJ,UAAd,CACIC,EAAI,GAAJA,CAAUI,CADd,CAEIC,EAAQxJ,CAAAyJ,WAFZ,CAGS/G,EAAI,CAAb,CAAuBgH,CAAvB,CAA8BF,CAAA,CAAM9G,CAAN,CAA9B,CAAyCA,CAAA,EAAzC,CACEyG,CAAA,EAAK,GAAL,CAAWO,CAAAC,KAAX,CAAuB,IAAvB,CAAyCD,CAAAnD,MA1DxCqD,QAAA,CAAUpB,EAAV,CAA4BE,EAA5B,CA0DD,CAAuD,GAEzDS,EAAA,EAAK,GACL,EAAA,CAAIJ,EAAA,CAAaQ,CAAb,CAAJ,CACSJ,CADT,CAGOA,CAHP,CAGWF,EAAA,CAAajJ,CAAb,CAAmB8D,CAAnB,CAHX,CAG0C,IAH1C,CAGiDyF,CAHjD,CAG2D,GAH3D,OAAA,CAKF,MAAK7I,IAAAmJ,UAAL,CACMC,CAAAA,CAA4B9J,CAAD8J,KAC/B,EAAA,CAAIrK,CAAJ,EAAkBuJ,EAAA,CAAiBvJ,CAAAyJ,UAAjB,CAAlB,CACSY,CADT,CAGkBA,CAnEfF,QAAA,CAAUnB,EAAV,CAA4BC,EAA5B,CAgEH,OAAA,CAKF,MAAKhI,IAAAqJ,aAAL,CACE,CAAA,CAAO,SAAP,CAAwC/J,CAAD8J,KAAvC,CAAqD,QAArD,OAAA,CAEF,SAEE,KADA1J,OAAA4J,QAAAC,MAAA,CAAqBjK,CAArB,CACM;AAAIkK,KAAJ,CAAU,iBAAV,CAAN,CA1BJ,CADuD,CA2CrDf,CAAA,EAAK,CADwD,CAG/D,MAAOA,EAToC,C,CChH7C,IAAA,EAAA,EAAA,CAEIgB,EAAahH,QAAAiH,iBAAA,CAA0BjH,QAA1B,CAAoCkH,UAAAC,SAApC,CACf,IADe,CACT,CAAA,CADS,CAFjB,CAKIC,EAAgBpH,QAAAiH,iBAAA,CAA0BjH,QAA1B,CAAoCkH,UAAAG,aAApC,CAClB,IADkB,CACZ,CAAA,CADY,CA4BbpL,SAASA,GAAU,CAACY,CAAD,CAAO,CAC/B,IAAIkG,EAAQ,EACZiE,EAAAM,YAAA,CAAyBzK,CAEzB,KADI2C,CACJ,CADQwH,CAAA3K,WAAA,EACR,CAAOmD,CAAP,CAAA,CACEuD,CAAAnC,KAAA,CAAWpB,CAAX,CACA,CAAAA,CAAA,CAAIwH,CAAA9K,YAAA,EAEN,OAAO6G,EARwB,CAzBjBzG,CAAAA,WAAAA,CAATA,QAAmB,CAACO,CAAD,CAAO,CAC/BmK,CAAAM,YAAA,CAAyBzK,CACzB,OAAOmK,EAAA1K,WAAA,EAFwB,CAKjBD,EAAAA,WAAAA,CAATA,QAAmB,CAACQ,CAAD,CAAO,CAC/BmK,CAAAM,YAAA,CAAyBzK,CACzB,OAAOmK,EAAA3K,WAAA,EAFwB,CAKjBD,EAAAA,UAAAA,CAATA,QAAkB,CAACS,CAAD,CAAO,CAC9BmK,CAAAM,YAAA,CAAyBzK,CACzB,OAAOmK,EAAA5K,UAAA,EAFuB,CAKhBD,EAAAA,gBAAAA,CAATA,QAAwB,CAACU,CAAD,CAAO,CACpCmK,CAAAM,YAAA,CAAyBzK,CACzB,OAAOmK,EAAA7K,gBAAA,EAF6B,CAKtBD;CAAAA,YAAAA,CAATA,QAAoB,CAACW,CAAD,CAAO,CAChCmK,CAAAM,YAAA,CAAyBzK,CACzB,OAAOmK,EAAA9K,YAAA,EAFyB,CAKlBD,EAAAA,WAAAA,CAAAA,EAWAsL,EAAAA,cAAAA,CAATA,QAAsB,CAAC1K,CAAD,CAAO,CAClCuK,CAAAE,YAAA,CAA4BzK,CAC5B,OAAOuK,EAAA9K,WAAA,EAF2B,CAKpBkL,EAAAA,kBAAAA,CAATA,QAA0B,CAAC3K,CAAD,CAAO,CACtCuK,CAAAE,YAAA,CAA4BzK,CAC5B,OAAOuK,EAAA/K,WAAA,EAF+B,CAKxBoL,EAAAA,iBAAAA,CAATA,QAAyB,CAAC5K,CAAD,CAAO,CACrCuK,CAAAE,YAAA,CAA4BzK,CAC5B,OAAOuK,EAAAhL,UAAA,EAF8B,CAKvBsL,EAAAA,uBAAAA,CAATA,QAA+B,CAAC7K,CAAD,CAAO,CAC3CuK,CAAAE,YAAA,CAA4BzK,CAC5B,OAAOuK,EAAAjL,gBAAA,EAFoC,CAK7BwL,EAAAA,mBAAAA,CAATA,QAA2B,CAAC9K,CAAD,CAAO,CACvCuK,CAAAE,YAAA,CAA4BzK,CAC5B,OAAOuK,EAAAlL,YAAA,EAFgC,CAKzB0L;CAAAA,SAAAA,CAATA,QAAiB,CAAC/K,CAAD,CAAO,CAC7B,IAAIkG,EAAQ,EACZqE,EAAAE,YAAA,CAA4BzK,CAE5B,KADI2C,CACJ,CADQ4H,CAAA/K,WAAA,EACR,CAAOmD,CAAP,CAAA,CACEuD,CAAAnC,KAAA,CAAWpB,CAAX,CACA,CAAAA,CAAA,CAAI4H,CAAAlL,YAAA,EAEN,OAAO6G,EARsB,CAWf8E,EAAAA,UAAAA,CAATA,QAAkB,CAAChL,CAAD,CAAO,CAC9B,MD+BciJ,GC/BP,CAAajJ,CAAb,CAAmB,QAAA,CAAC2C,CAAD,CAAO,CAAA,MAAAvD,GAAA,CAAWuD,CAAX,CAAA,CAA1B,CADuB,CAIhBgB,EAAAA,YAAAA,CAATA,QAAoB,CAAC3D,CAAD,CAAO,CAEhC,OAAQA,CAAAoI,SAAR,EACE,KAAK1H,IAAA2H,aAAL,CACA,KAAK3H,IAAAuK,uBAAL,CACMC,CAAAA,CAAa/H,QAAAiH,iBAAA,CAA0BpK,CAA1B,CAAgCqK,UAAAc,UAAhC,CACf,IADe,CACT,CAAA,CADS,CAGjB,KAJF,IAGM9H,EAAU,EAHhB,CAGoBV,CAClB,CAASA,CAAT,CAAauI,CAAAE,SAAA,EAAb,CAAA,CAGE/H,CAAA,EAAWV,CAAA0I,UAEb,OAAOhI,EACT,SACE,MAAOrD,EAAAqL,UAbX,CAFgC,C,CCrFlC,IAAA,EAAA,EAAA,CAEMvK,GNAKX,CMAYW,EAFvB,CAMMwK,GAAe,CAAC5K,IAAAF,UAAD,CAAiBD,OAAAC,UAAjB,CAAoC+G,WAAA/G,UAApC,CAUrB+K,SAASA,EAAkB,CAAC5B,CAAD,CAAO,CAClB,IAAA,CAT6B,EAAA,CAAA,CAC3C,IAASjH,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkB4I,EAAA1I,OAAlB,CAAuCF,CAAA,EAAvC,CAA4C,CAC1C,IAAM8I,EAAQF,EAAA,CAAa5I,CAAb,CACd,IAAI8I,CAAAC,eAAA,CAMsC9B,CANtC,CAAJ,CAAgC,CAC9B,CAAA,CAAO6B,CAAP,OAAA,CAD8B,CAFU,CADD,CAAA,CAAA,IAAA,EAAA,CAU3C,GAAI,CAACA,CAAL,CACE,KAAMtB,MAAA,CAAM,gCAAN,CAAuCP,CAAvC,CAAN,CAEF,MAAO/I,OAAAC,yBAAA,CAAgC2K,CAAhC,CAAuC7B,CAAvC,CALyB;AAQ3B,IAAM+B,EAAgB5K,EAAA,CAAiB,CAC5CrB,WAAY8L,CAAA,CAAmB,YAAnB,CADgC,CAE5C/L,WAAY+L,CAAA,CAAmB,YAAnB,CAFgC,CAG5ChM,UAAWgM,CAAA,CAAmB,WAAnB,CAHiC,CAI5CjM,gBAAiBiM,CAAA,CAAmB,iBAAnB,CAJ2B,CAK5ClM,YAAakM,CAAA,CAAmB,aAAnB,CAL+B,CAM5CnM,WAAYmM,CAAA,CAAmB,YAAnB,CANgC,CAO5Cb,cAAea,CAAA,CAAmB,eAAnB,CAP6B,CAQ5CV,uBAAwBU,CAAA,CAAmB,wBAAnB,CARoB,CAS5CT,mBAAoBS,CAAA,CAAmB,oBAAnB,CATwB,CAU5CP,UAAWO,CAAA,CAAmB,WAAnB,CAViC,CAW5C5H,YAAa4H,CAAA,CAAmB,aAAnB,CAX+B,CAY5CZ,kBAAmBY,CAAA,CAAmB,mBAAnB,CAZyB,CAa5CX,iBAAkBW,CAAA,CAAmB,kBAAnB,CAb0B,CAc5CR,SAAUQ,CAAA,CAAmB,UAAnB,CAdkC,CAAjB,CAezB,EAfG,CAiBMI,GAAoB7K,EAAA,CAAiB,CAChD6J,kBAAmB/J,MAAAC,yBAAA,CACjB+G,gBAAApH,UADiB;AACW,mBADX,CAD6B,CAGhDoK,iBAAkBhK,MAAAC,yBAAA,CAChB+G,gBAAApH,UADgB,CACY,kBADZ,CAH8B,CAKhDuK,SAAUnK,MAAAC,yBAAA,CACR+G,gBAAApH,UADQ,CACoB,UADpB,CALsC,CAAjB,CAO7B,EAxBG,CA0BMoL,GAAoB9K,EAAA,CAAiB,CAChD6J,kBAAmB/J,MAAAC,yBAAA,CACjBmG,QAAAxG,UADiB,CACG,mBADH,CAD6B,CAGhDoK,iBAAkBhK,MAAAC,yBAAA,CAChBmG,QAAAxG,UADgB,CACI,kBADJ,CAH8B,CAKhDuK,SAAUnK,MAAAC,yBAAA,CACRmG,QAAAxG,UADQ,CACY,UADZ,CALsC,CAAjB,CAO7B,EAjCSkL,EAAAA,GAAAA,CAAAA,CAiBAC,EAAAA,GAAAA,CAAAA,EASAC,EAAAA,GAAAA,CAAAA,EASGnM,EAAAA,WAAAA,CAATA,QAAmB,CAACO,CAAD,CAAO,CAC/B,MAAO0L,EAAAjM,WAAAuB,IAAAsH,KAAA,CAAkCtI,CAAlC,CADwB,CAIjBR;CAAAA,WAAAA,CAATA,QAAmB,CAACQ,CAAD,CAAO,CAC/B,MAAO0L,EAAAlM,WAAAwB,IAAAsH,KAAA,CAAkCtI,CAAlC,CADwB,CAIjBT,EAAAA,UAAAA,CAATA,QAAkB,CAACS,CAAD,CAAO,CAC9B,MAAO0L,EAAAnM,UAAAyB,IAAAsH,KAAA,CAAiCtI,CAAjC,CADuB,CAIhBV,EAAAA,gBAAAA,CAATA,QAAwB,CAACU,CAAD,CAAO,CACpC,MAAO0L,EAAApM,gBAAA0B,IAAAsH,KAAA,CAAuCtI,CAAvC,CAD6B,CAItBX,EAAAA,YAAAA,CAATA,QAAoB,CAACW,CAAD,CAAO,CAChC,MAAO0L,EAAArM,YAAA2B,IAAAsH,KAAA,CAAmCtI,CAAnC,CADyB,CAIlBZ,EAAAA,WAAAA,CAATA,QAAmB,CAACY,CAAD,CAAO,CAC/B,MAAOmG,MAAA3F,UAAAqL,MAAAvD,KAAA,CAA2BoD,CAAAtM,WAAA4B,IAAAsH,KAAA,CAAkCtI,CAAlC,CAA3B,CADwB,CAIjB0K,EAAAA,cAAAA,CAATA,QAAsB,CAAC1K,CAAD,CAAO,CAClC,MAAO0L,EAAAhB,cAAA1J,IAAAsH,KAAA,CAAqCtI,CAArC,CAD2B,CAIpB6K,EAAAA,uBAAAA,CAATA,QAA+B,CAAC7K,CAAD,CAAO,CAC3C,MAAO0L,EAAAb,uBAAA7J,IAAAsH,KAAA,CAA8CtI,CAA9C,CADoC,CAI7B8K,EAAAA,mBAAAA,CAATA,QAA2B,CAAC9K,CAAD,CAAO,CACvC,MAAO0L,EAAAZ,mBAAA9J,IAAAsH,KAAA,CAA0CtI,CAA1C,CADgC,CAIzBgL;CAAAA,UAAAA,CAATA,QAAkB,CAAChL,CAAD,CAAO,CAC9B,MAAO0L,EAAAV,UAAAhK,IAAAsH,KAAA,CAAiCtI,CAAjC,CADuB,CAIhB2D,EAAAA,YAAAA,CAATA,QAAoB,CAAC3D,CAAD,CAAO,CAChC,MAAO0L,EAAA/H,YAAA3C,IAAAsH,KAAA,CAAmCtI,CAAnC,CADyB,CAIlB+K,EAAAA,SAAAA,CAATA,QAAiB,CAAC/K,CAAD,CAAO,CAE7B,OAAQA,CAAAoI,SAAR,EACE,KAAK1H,IAAAuK,uBAAL,CACEF,CAAA,CAAWY,EAAAZ,SAAA/J,IAAAsH,KAAA,CAAoCtI,CAApC,CACX,MACF,MAAKU,IAAA6H,cAAL,CACEwC,CAAA,CAAWa,EAAAb,SAAA/J,IAAAsH,KAAA,CAAoCtI,CAApC,CACX,MACF,SACE+K,CAAA,CAAWW,CAAAX,SAAA/J,IAAAsH,KAAA,CAAgCtI,CAAhC,CARf,CAWA,MAAOmG,MAAA3F,UAAAqL,MAAAvD,KAAA,CAA2ByC,CAA3B,CAbsB,CAgBfJ;CAAAA,kBAAAA,CAATA,QAA0B,CAAC3K,CAAD,CAAO,CACtC,OAAQA,CAAAoI,SAAR,EACE,KAAK1H,IAAAuK,uBAAL,CACE,MAAOU,GAAAhB,kBAAA3J,IAAAsH,KAAA,CAA6CtI,CAA7C,CACT,MAAKU,IAAA6H,cAAL,CACE,MAAOqD,GAAAjB,kBAAA3J,IAAAsH,KAAA,CAA6CtI,CAA7C,CACT,SACE,MAAO0L,EAAAf,kBAAA3J,IAAAsH,KAAA,CAAyCtI,CAAzC,CANX,CADsC,CAWxB4K,EAAAA,iBAAAA,CAATA,QAAyB,CAAC5K,CAAD,CAAO,CACrC,OAAQA,CAAAoI,SAAR,EACE,KAAK1H,IAAAuK,uBAAL,CACE,MAAOU,GAAAf,iBAAA5J,IAAAsH,KAAA,CAA4CtI,CAA5C,CACT,MAAKU,IAAA6H,cAAL,CACE,MAAOqD,GAAAhB,iBAAA5J,IAAAsH,KAAA,CAA4CtI,CAA5C,CACT,SACE,MAAO0L,EAAAd,iBAAA5J,IAAAsH,KAAA,CAAwCtI,CAAxC,CANX,CADqC,C,CC7HhC,IAAM8L,EPHF3L,COGcoB,GAAA,CACrBwK,CADqB,CACCC,C,CCE1BC,QAASA,GAAS,CAACjM,CAAD,CAAO,CACvB,IAAA,CAAOA,CAAAR,WAAP,CAAA,CACEQ,CAAA2G,YAAA,CAAiB3G,CAAAR,WAAjB,CAFqB;AAMzB,IAAMsB,GRZKX,CQYYW,EAAvB,CACMoL,GAAW/I,QAAAgJ,eAAAC,mBAAA,CAA2C,OAA3C,CADjB,CAGMC,GAEJzL,MAAAC,yBAAA,CAAgCH,IAAAF,UAAhC,CAAgD,aAAhD,CALF,CAQM8L,GAAoBD,EAApBC,EAAkDD,EAAArL,IARxD,CAUMuL,GAEF3L,MAAAC,yBAAA,CAAgCmG,QAAAxG,UAAhC,CAAoD,eAApD,CAZJ,CA+DIgM,GAAmB,CAErB9B,cAAe,CAEb,IAAA1J,QAAG,EAAG,CACJ,IAAMS,EdjCIvB,CciCO,CAAiB,IAAjB,CAEjB,EADImJ,CACJ,CADQ5H,CACR,EADoBA,CAAAhC,WACpB,GAAS4J,CAAAjB,SAAT,GAAwB1H,IAAA2H,aAAxB,GACEgB,CADF,CACM,IADN,CAGA,OAAa1J,KAAAA,EAAN,GAAA0J,CAAA,CAAkBA,CAAlB,CDlFAyC,CCkFsBpB,cAAA,CAAyB,IAAzB,CANzB,CAFO,CAUb3J,aAAc,CAAA,CAVD,CAFM,CAerBtB,WAAY,CAEV,IAAAuB,QAAG,EAAG,CACJ,IAAMS,Ed9CIvB,Cc8CO,CAAiB,IAAjB,CACXmJ,EAAAA,CAAI5H,CAAJ4H,EAAgB5H,CAAAhC,WACtB,OAAaE,KAAAA,EAAN,GAAA0J,CAAA,CAAkBA,CAAlB,CD5FAyC,CC4FsBrM,WAAA,CAAsB,IAAtB,CAHzB,CAFI,CAOVsB,aAAc,CAAA,CAPJ,CAfS;AAyBrB1B,YAAa,CAEX,IAAA2B,QAAG,EAAG,CACJ,IAAMS,EdxDIvB,CcwDO,CAAiB,IAAjB,CACXmJ,EAAAA,CAAI5H,CAAJ4H,EAAgB5H,CAAApC,YACtB,OAAaM,KAAAA,EAAN,GAAA0J,CAAA,CAAkBA,CAAlB,CDtGAyC,CCsGsBzM,YAAA,CAAuB,IAAvB,CAHzB,CAFK,CAOX0B,aAAc,CAAA,CAPH,CAzBQ,CAmCrBzB,gBAAiB,CAEf,IAAA0B,QAAG,EAAG,CACJ,IAAMS,EdlEIvB,CckEO,CAAiB,IAAjB,CACXmJ,EAAAA,CAAI5H,CAAJ4H,EAAgB5H,CAAAnC,gBACtB,OAAaK,KAAAA,EAAN,GAAA0J,CAAA,CAAkBA,CAAlB,CDhHAyC,CCgHsBxM,gBAAA,CAA2B,IAA3B,CAHzB,CAFS,CAOfyB,aAAc,CAAA,CAPC,CAnCI,CA8CrB+J,mBAAoB,CAIlB,IAAA9J,QAAG,EAAG,CACJ,IAAMS,Ed/EIvB,Cc+EO,CAAiB,IAAjB,CACjB,IAAIuB,CAAJ,EAAyC9B,IAAAA,EAAzC,GAAgB8B,CAAApC,YAAhB,CAAoD,CAElD,IADIsD,CACJ,CADQ,IAAAtD,YACR,CAAOsD,CAAP,EAAYA,CAAAyF,SAAZ,GAA2B1H,IAAA2H,aAA3B,CAAA,CACE1F,CAAA,CAAIA,CAAAtD,YAEN,OAAOsD,EAL2C,CAOlD,MDnIKmJ,ECmIEhB,mBAAA,CAA8B,IAA9B,CATL,CAJY,CAgBlB/J,aAAc,CAAA,CAhBI,CA9CC,CAiErB8J,uBAAwB,CAItB,IAAA7J,QAAG,EAAG,CACJ,IAAMS;AdlGIvB,CckGO,CAAiB,IAAjB,CACjB,IAAIuB,CAAJ,EAA6C9B,IAAAA,EAA7C,GAAgB8B,CAAAnC,gBAAhB,CAAwD,CAEtD,IADIqD,CACJ,CADQ,IAAArD,gBACR,CAAOqD,CAAP,EAAYA,CAAAyF,SAAZ,GAA2B1H,IAAA2H,aAA3B,CAAA,CACE1F,CAAA,CAAIA,CAAArD,gBAEN,OAAOqD,EAL+C,CAOtD,MDtJKmJ,ECsJEjB,uBAAA,CAAkC,IAAlC,CATL,CAJgB,CAgBtB9J,aAAc,CAAA,CAhBQ,CAjEH,CA/DvB,CAqJa0L,GAAoB,CAC/BC,UAAW,CAIT,IAAA1L,QAAG,EAAG,CACJ,MAAO,KAAA2L,aAAA,CAAkB,OAAlB,CAAP,EAAqC,EADjC,CAJG,CAUT,IAAA7D,QAAG,CAACvC,CAAD,CAAQ,CACT,IAAAK,aAAA,CAAkB,OAAlB,CAA2BL,CAA3B,CADS,CAVF,CAaTxF,aAAc,CAAA,CAbL,CADoB,CArJjC,CAyMI6L,GAAkB,CAEpBxN,WAAY,CAIV,IAAA4B,QAAG,EAAG,CAEJ,GR5MUQ,CQ4MN,CAAkC,IAAlC,CAAJ,CAA6C,CAC3C,IAAMC,Ed/KEvB,Cc+KS,CAAiB,IAAjB,CACjB,IAAI,CAACuB,CAAArC,WAAL,CAA0B,CACxBqC,CAAArC,WAAA,CAAsB,EACtB,KAAK,IAAIuD,EAAE,IAAAnD,WAAX,CAA4BmD,CAA5B,CAA+BA,CAA/B,CAAiCA,CAAAtD,YAAjC,CACEoC,CAAArC,WAAA2E,KAAA,CAAyBpB,CAAzB,CAHsB,CAM1B,IAAAvD,EAAaqC,CAAArC,WAR8B,CAA7C,IAUEA,EAAA;ADpOK0M,CCoOQ1M,WAAA,CAAsB,IAAtB,CAEfA,EAAAyN,KAAA,CAAkBC,QAAQ,CAACC,CAAD,CAAQ,CAChC,MAAO3N,EAAA,CAAW2N,CAAX,CADyB,CAGlC,OAAO3N,EAjBH,CAJI,CAuBV2B,aAAc,CAAA,CAvBJ,CAFQ,CA4BpBiM,kBAAmB,CAEjB,IAAAhM,QAAG,EAAG,CACJ,MAAO,KAAA+J,SAAAnI,OADH,CAFW,CAKjB7B,aAAc,CAAA,CALG,CA5BC,CAoCpBvB,WAAY,CAEV,IAAAwB,QAAG,EAAG,CACJ,IAAMS,Ed7MIvB,Cc6MO,CAAiB,IAAjB,CACXmJ,EAAAA,CAAI5H,CAAJ4H,EAAgB5H,CAAAjC,WACtB,OAAaG,KAAAA,EAAN,GAAA0J,CAAA,CAAkBA,CAAlB,CD3PAyC,CC2PsBtM,WAAA,CAAsB,IAAtB,CAHzB,CAFI,CAOVuB,aAAc,CAAA,CAPJ,CApCQ,CA8CpBxB,UAAW,CAET,IAAAyB,QAAG,EAAG,CACJ,IAAMS,EdvNIvB,CcuNO,CAAiB,IAAjB,CACXmJ,EAAAA,CAAI5H,CAAJ4H,EAAgB5H,CAAAlC,UACtB,OAAaI,KAAAA,EAAN,GAAA0J,CAAA,CAAkBA,CAAlB,CDrQAyC,CCqQsBvM,UAAA,CAAqB,IAArB,CAHzB,CAFG,CAOTwB,aAAc,CAAA,CAPL,CA9CS,CAwDpB4C,YAAa,CAIX,IAAA3C,QAAG,EAAG,CACJ,GRjQUQ,CQiQN,CAAkC,IAAlC,CAAJ,CAA6C,CAE3C,IADA,IAAIyL,EAAK,EAAT,CACSvK,EAAI,CADb,CACgBwK,EAAK,IAAA9N,WADrB,CACsCuJ,CAAtC,CAA0CA,CAA1C,CAA8CuE,CAAA,CAAGxK,CAAH,CAA9C,CAAsDA,CAAA,EAAtD,CACMiG,CAAAP,SAAJ,GAAmB1H,IAAAqJ,aAAnB;AACEkD,CAAAlJ,KAAA,CAAQ4E,CAAAhF,YAAR,CAGJ,OAAOsJ,EAAAE,KAAA,CAAQ,EAAR,CAPoC,CAS3C,MDxRKrB,ECwREnI,YAAA,CAAuB,IAAvB,CAVL,CAJK,CAqBX,IAAAmF,QAAG,CAACsE,CAAD,CAAO,CACR,GAAoB,WAApB,GAAI,MAAOA,EAAX,EAA4C,IAA5C,GAAmCA,CAAnC,CACEA,CAAA,CAAO,EAET,QAAQ,IAAAhF,SAAR,EACE,KAAK1H,IAAA2H,aAAL,CACA,KAAK3H,IAAAuK,uBAAL,CACE,GAAI,CRxREzJ,CQwRD,CAAkC,IAAlC,CAAL,EAAgDV,EAAhD,CAAgE,CAE9D,IAAMtB,EAAa,IAAAA,WACnB,EAAIA,CAAJ,EAAkB,IAAAD,UAAlB,EACGC,CADH,EACiBA,CAAA4I,SADjB,EACwC1H,IAAAmJ,UADxC,GAEEoC,EAAA,CAAU,IAAV,CAEFoB,EAAAA,GAAA1J,YAAAmF,IAAAR,KAAA,CAAqC,IAArC,CAA2C8E,CAA3C,CAP8D,CAAhE,IASEnB,GAAA,CAAU,IAAV,CAEA,EAAkB,CAAlB,CAAImB,CAAAxK,OAAJ,EAAuB,IAAAwF,SAAvB,GAAyC1H,IAAA2H,aAAzC,GACE,IAAAH,YAAA,CAAiB/E,QAAAC,eAAA,CAAwBgK,CAAxB,CAAjB,CAGJ,MACF,SAEE,IAAA/B,UAAA,CAAiB+B,CArBrB,CAJQ,CArBC,CAkDXrM,aAAc,CAAA,CAlDH,CAxDO,CA8GpB4J,kBAAmB,CAIjB,IAAA3J,QAAG,EAAG,CACJ,IAAMS;AdzRIvB,CcyRO,CAAiB,IAAjB,CACjB,IAAIuB,CAAJ,EAAwC9B,IAAAA,EAAxC,GAAgB8B,CAAAjC,WAAhB,CAAmD,CAEjD,IADImD,CACJ,CADQ,IAAAnD,WACR,CAAOmD,CAAP,EAAYA,CAAAyF,SAAZ,GAA2B1H,IAAA2H,aAA3B,CAAA,CACE1F,CAAA,CAAIA,CAAAtD,YAEN,OAAOsD,EAL0C,CAOjD,MD7UKmJ,EC6UEnB,kBAAA,CAA6B,IAA7B,CATL,CAJW,CAgBjB5J,aAAc,CAAA,CAhBG,CA9GC,CAiIpB6J,iBAAkB,CAIhB,IAAA5J,QAAG,EAAG,CACJ,IAAMS,Ed5SIvB,Cc4SO,CAAiB,IAAjB,CACjB,IAAIuB,CAAJ,EAAuC9B,IAAAA,EAAvC,GAAgB8B,CAAAlC,UAAhB,CAAkD,CAEhD,IADIoD,CACJ,CADQ,IAAApD,UACR,CAAOoD,CAAP,EAAYA,CAAAyF,SAAZ,GAA2B1H,IAAA2H,aAA3B,CAAA,CACE1F,CAAA,CAAIA,CAAArD,gBAEN,OAAOqD,EALyC,CAOhD,MDhWKmJ,ECgWElB,iBAAA,CAA4B,IAA5B,CATL,CAJU,CAgBhB7J,aAAc,CAAA,CAhBE,CAjIE,CAoJpBgK,SAAU,CAIR,IAAA/J,QAAG,EAAG,CAGF,IAAA+J,ER/VQvJ,CQ8VN,CAAkC,IAAlC,CAAJ,CACa2E,KAAA3F,UAAA6F,OAAAiC,KAAA,CAA4B,IAAAlJ,WAA5B,CAA6C,QAAQ,CAACuD,CAAD,CAAI,CAClE,MAAQA,EAAAyF,SAAR,GAAuB1H,IAAA2H,aAD2C,CAAzD,CADb;AD5WOyD,CCiXMf,SAAA,CAAoB,IAApB,CAEbA,EAAA8B,KAAA,CAAgBS,QAAQ,CAACP,CAAD,CAAQ,CAC9B,MAAOhC,EAAA,CAASgC,CAAT,CADuB,CAGhC,OAAOhC,EAZH,CAJE,CAkBRhK,aAAc,CAAA,CAlBN,CApJU,CA0KpBiK,UAAW,CAIT,IAAAhK,QAAG,EAAG,CACJ,MRnXUQ,EQmXN,CAAkC,IAAlC,CAAJ,CJrRUyH,EIwRD,CAF4B,UAAnB5F,GAAA,IAAA6F,UAAA7F,CACmB,IAADA,QADlBA,CACmC,IAC5C,CAHT,CDjYOyI,CCsYEd,UAAA,CAAqB,IAArB,CANL,CAJG,CAgBT,IAAAlC,QAAG,CAACsE,CAAD,CAAO,CACR,IAAM/J,EAA6B,UAAnB,GAAA,IAAA6F,UAAA,CACqB,IAAD7F,QADpB,CACqC,IACrD4I,GAAA,CAAU5I,CAAV,CACA,KAAIkK,EAAgB,IAAArE,UAEfqE,EAAL,EAAwC,UAAxC,GAAsBA,CAAtB,GACEA,CADF,CACkB,KADlB,CAGMC,EAAAA,CAAgBtB,EAAAuB,cAAA,CAAuBF,CAAvB,CAMtB,KALIzM,EAAJ,CACEuM,CAAAA,GAAArC,UAAAlC,IAAAR,KAAA,CAAmCkF,CAAnC,CAAkDJ,CAAlD,CADF,CAGEI,CAAAxC,UAHF,CAG4BoC,CAE5B,CAAOI,CAAAhO,WAAP,CAAA,CACE6D,CAAA6E,YAAA,CAAoBsF,CAAAhO,WAApB,CAhBM,CAhBD,CAmCTuB,aAAc,CAAA,CAnCL,CA1KS,CAzMtB,CA8ZW2M,GAAqB,CAE9BC,WAAY,CAIV,IAAA3M,QAAG,EAAG,CACJ,IAAMS,EdlYIvB,CckYO,CAAiB,IAAjB,CACjB,OAAOuB,EAAP,EAAmBA,CAAA9C,GAAnB;AAA0C,IAFtC,CAJI,CAQVoC,aAAc,CAAA,CARJ,CAFkB,CA9ZhC,CA+aW6M,GAAwB,CAEjCC,cAAe,CAIb,IAAA7M,QAAG,EAAG,CAraN,IAAA,EADEuL,EAAJ,EAAqCA,EAAAvL,IAArC,CACSuL,EAAAvL,IAAAsH,KAAA,CAAuCnF,QAAvC,CADT,CR3BShD,CQ6BGW,EAAL,CAH2B,IAAA,EAG3B,CACEqC,QAAA0K,cAST,IAAKC,CAAL,EAAgBA,CAAA1F,SAAhB,CAAA,CAGA,IAAI1G,EAAc,CAAC,CRpBLA,CQoBO,CAwZW1B,IAxZX,CACrB,IAuZgCA,IAvZhC,GAAamD,QAAb,EAGOzB,CAHP,EAuZgC1B,IA9Y1B+N,KATN,GASoBD,CATpB,EAUOE,CAAAA,SAAA1F,KAAA,CA6YyBtI,IA7YL+N,KAApB,CAA+BD,CAA/B,CAVP,CAAA,CAkBA,IADIG,CACJ,CRnCcpM,CQkCG,CAA4BiM,CAA5B,CACjB,CAAOG,CAAP,EAAqBA,CAArB,GAqYgCjO,IArYhC,CAAA,CACE8N,CACA,CADSG,CAAAF,KACT,CAAAE,CAAA,CRrCYpM,CQqCC,CAA4BiM,CAA5B,CAEf,EAAA,CAiYgC9N,IAjYhC,GAAamD,QAAb,CAES8K,CAAA,CAAa,IAAb,CAAoBH,CAF7B,CAMSG,CAAA,GA2XuBjO,IA3XvB,CAAsB8N,CAAtB,CAA+B,IA5BxC,CAAA,IAWI,EAAA,CAAO,IAfX,CAAA,IACE,EAAA,CAAO,IA0ZL,OAAO,EADH,CAJO,CAUb,IAAAhF,QAAG,EAAG,EAVO,CAWb/H,aAAc,CAAA,CAXD,CAFkB,CAyBnCmN;QAASA,EAAkB,CAACvM,CAAD,CAAMwM,CAAN,CAAmBC,CAAnB,CAA0B,CACnD,IAAKtM,IAAIA,CAAT,GAAcqM,EAAd,CAA2B,CACzB,IAAIE,EAAUzN,MAAAC,yBAAA,CAAgCc,CAAhC,CAAqCG,CAArC,CACTuM,EAAL,EAAgBA,CAAAtN,aAAhB,EACG,CAACsN,CADJ,EACeD,CADf,CAEExN,MAAAkC,eAAA,CAAsBnB,CAAtB,CAA2BG,CAA3B,CAA8BqM,CAAA,CAAYrM,CAAZ,CAA9B,CAFF,CAGWsM,CAHX,EAIEpE,OAAAsE,KAAA,CAAa,kBAAb,CAAiCxM,CAAjC,CAAoC,IAApC,CAA0CH,CAA1C,CANuB,CADwB,CAa9C4M,QAASA,EAAc,CAAC/C,CAAD,CAAQ,CACpC0C,CAAA,CAAmB1C,CAAnB,CAA0BgB,EAA1B,CACA0B,EAAA,CAAmB1C,CAAnB,CAA0BiB,EAA1B,CACAyB,EAAA,CAAmB1C,CAAnB,CAA0BoB,EAA1B,CACAsB,EAAA,CAAmB1C,CAAnB,CAA0BoC,EAA1B,CAJoC;AAO/BY,QAASA,GAAwB,EAAQ,CAAPhD,IAAAA,ECxc5BiD,ECqScjO,UFoKzBgL,EAAAkD,UAAA,CAAkB9G,gBAAApH,UAElB0N,EAAA,CAAmB1C,CAAnB,CAA0BgB,EAA1B,CAA4C,CAAA,CAA5C,CACA0B,EAAA,CAAmB1C,CAAnB,CAA0BoB,EAA1B,CAA2C,CAAA,CAA3C,CACAsB,EAAA,CAAmB1C,CAAnB,CAA0BoC,EAA1B,CAAiD,CAAA,CAAjD,CAGAhN,OAAA+N,iBAAA,CAAwBnD,CAAxB,CAA+B,CAC7BpD,SAAU,CACR7B,MAAO7F,IAAAuK,uBADC,CAERlK,aAAc,CAAA,CAFN,CADmB,CAK7B6N,SAAU,CACRrI,MAAO,oBADC,CAERxF,aAAc,CAAA,CAFN,CALmB,CAS7BsK,UAAW,CACT9E,MAAO,IADE,CAETxF,aAAc,CAAA,CAFL,CATkB,CAA/B,CAeA,EACE,WADF,CAEE,cAFF,CAGE,QAHF,CAAAkE,QAAA,CAIU,QAAA,CAAC4J,CAAD,CAAU,CAClBjO,MAAAkC,eAAA,CAAsB0I,CAAtB,CAA6BqD,CAA7B,CAAmC,CACjCtI,MAAO5G,IAAAA,EAD0B,CAEjCoB,aAAc,CAAA,CAFmB,CAAnC,CADkB,CAJpB,CAWA,EACE,eADF,CAEE,SAFF,CAGE,aAHF,CAAAkE,QAAA,CAIU,QAAA,CAAC4J,CAAD,CAAU,CAClBjO,MAAAkC,eAAA,CAAsB0I,CAAtB,CAA6BqD,CAA7B,CAAmC,CACjC,IAAA7N,QAAG,EAAG,CACJ,MAAO,KAAA+M,KAAA,CAAUc,CAAV,CADH,CAD2B;AAIjC9N,aAAc,CAAA,CAJmB,CAAnC,CADkB,CAJpB,CAlC8C,CAiDzC,IAAI+N,GRzhBA3O,CQyhB+BW,EAAA,CACxC,QAAQ,EAAG,EAD6B,CACxB,QAAQ,CAACiO,CAAD,CAAU,CAChC,IAAM3J,EdnfMrF,CcmfD,CAAuBgP,CAAvB,CACN3J,EAAAvF,GAAL,GACEuF,CAAAvF,GAEA,CAFwB,CAAA,CAExB,CADAqO,CAAA,CAAmBa,CAAnB,CAA4BvC,EAA5B,CAA8C,CAAA,CAA9C,CACA,CAAA0B,CAAA,CAAmBa,CAAnB,CAA4BtC,EAA5B,CAA+C,CAAA,CAA/C,CAHF,CAFgC,CAD7B,CAWIuC,GRpiBA7O,CQoiB8BW,EAAA,CACvC,QAAQ,EAAG,EAD4B,CACvB,QAAQ,CAACiO,CAAD,CAAU,Cd7fpBhP,Cc8fDqF,CAAuB2J,CAAvB3J,CACNxF,GAAL,GACEsO,CAAA,CAAmBa,CAAnB,CAA4BnC,EAA5B,CAA6C,CAAA,CAA7C,CACA,CAAAsB,CAAA,CAAmBa,CAAnB,CAA4BrB,EAA5B,CAAgD,CAAA,CAAhD,CAFF,CAFgC,C,CGliB7B,IAAA,GJAM5B,CIAN,WAwBPmD,SAASA,GAAQ,CAACjP,CAAD,CAAOkE,CAAP,CAAkBgL,CAAlB,CAA4B,CH8flCJ,EG7fT,CAA6B9O,CAA7B,CACAkP,EAAA,CAAWA,CAAX,EAAuB,IACvB,KAAMzN,EjBUQ1B,CiBVG,CAAuBC,CAAvB,CAAjB,CACMmP,EjBSQpP,CiBTQ,CAAuBmE,CAAvB,CADtB,CAEMkL,EAAeF,CAAA,CjBQPnP,CiBRkB,CAAuBmP,CAAvB,CAAX,CAA8C,IAEnEzN,EAAAnC,gBAAA,CAA2B4P,CAAA,CAAWE,CAAA9P,gBAAX,CACzB4E,CAAA3E,UAEF,IADI8P,CACJ,CjBUcnP,CiBXJ,CAAiBuB,CAAAnC,gBAAjB,CACV,CACE+P,CAAAhQ,YAAA,CAAkBW,CAIpB,IADIsP,CACJ,CjBKcpP,CiBNJ,CAAiBuB,CAAApC,YAAjB,CAAwC6P,CAAxC,CACV,CACEI,CAAAhQ,gBAAA,CAAsBU,CAGxByB,EAAAhC,WAAA,CAAsByE,CAClBgL,EAAJ,CACMA,CADN,GACmBC,CAAA3P,WADnB,GAEI2P,CAAA3P,WAFJ,CAE+BQ,CAF/B,GAKEmP,CAAA5P,UACA,CAD0BS,CAC1B,CAAKmP,CAAA3P,WAAL,GACE2P,CAAA3P,WADF,CAC6BQ,CAD7B,CANF,CAWAmP,EAAA/P,WAAA,CAA2B,IA/BgB;AA8DfmQ,QAAA,GAAQ,CAACvP,CAAD,CAAOkG,CAAP,CAAc,CAClD,IAAMzE,EjBlDQ1B,CiBkDG,CAAuBC,CAAvB,CACjB,IAA4BL,IAAAA,EAA5B,GAAI8B,CAAAjC,WAAJ,CAKE,IAJM4J,CAIG1G,CAJEwD,CAIFxD,EAJWtD,EAAA,CAAWY,CAAX,CAIX0C,CAHTjB,CAAAjC,WAGSkD,CAHa0G,CAAA,CAAG,CAAH,CAGb1G,EAHsB,IAGtBA,CAFTjB,CAAAlC,UAESmD,CAFY0G,CAAA,CAAGA,CAAAxG,OAAH,CAAa,CAAb,CAEZF,EAF+B,IAE/BA,CHocFsM,EGrcP,CAA4BhP,CAA5B,CACS0C,CAAAA,CAAAA,CAAE,CAAX,CAAcA,CAAd,CAAgB0G,CAAAxG,OAAhB,CAA2BF,CAAA,EAA3B,CAAgC,CAC9B,IAAMC,EAAIyG,CAAA,CAAG1G,CAAH,CAAV,CACM0C,EjB1DIrF,CiB0DC,CAAuB4C,CAAvB,CACXyC,EAAA3F,WAAA,CAAgBO,CAChBoF,EAAA/F,YAAA,CAAiB+J,CAAA,CAAG1G,CAAH,CAAK,CAAL,CAAjB,EAA4B,IAC5B0C,EAAA9F,gBAAA,CAAqB8J,CAAA,CAAG1G,CAAH,CAAK,CAAL,CAArB,EAAgC,IHob3BoM,GGnbL,CAA6BnM,CAA7B,CAN8B,CAPgB,C,CCpF7C,IAAA,GLFMmJ,CKEN,WAYArF;QAASA,GAAY,CAAC+I,CAAD,CAASxP,CAAT,CAAekP,CAAf,CAAyB,CACnD,GAAIlP,CAAJ,GAAawP,CAAb,CACE,KAAMtF,MAAA,CAAM,uFAAN,CAAN,CAEF,GAAIgF,CAAJ,CAAc,CACZ,IAAMO,ElByBMvP,CkBzBI,CAAiBgP,CAAjB,CACVpN,EAAAA,CAAI2N,CAAJ3N,EAAe2N,CAAAhQ,WACrB,IAAWE,IAAAA,EAAX,GAAKmC,CAAL,EAAwBA,CAAxB,GAA8B0N,CAA9B,EACS7P,IAAAA,EADT,GACGmC,CADH,EACsBrC,EAAA,CAAWyP,CAAX,CADtB,GAC+CM,CAD/C,CAEE,KAAMtF,MAAA,CAAM,+HAAN,CAAN,CALU,CASd,GAAIgF,CAAJ,GAAiBlP,CAAjB,CACE,MAAOA,EAGLA,EAAAP,WAAJ,EAGEkH,EAAA,CAAY3G,CAAAP,WAAZ,CAA6BO,CAA7B,CAGF,KACI0P,CADJ,CAEIC,CACJ,IAAI,CAAC3P,CAAA,mBAAL,CAAiC,CAElB,GAAA0P,CAAA,CADbA,CACa,CZnBD7N,CYkBA,CAA4B2N,CAA5B,CACC,CAAA,CA2Cf,IAAII,CACmB,OAAvB,GA5C4B5P,CA4CxBkJ,UAAJ,CACE0G,CADF,CACU,CA7CkB5P,CA6ClB,CADV,CA5C4BA,CA8CjB+H,iBAFX;CAGE6H,CAHF,CA5C4B5P,CA+ClB+H,iBAAA,CAAsB,MAAtB,CAHV,CAME,EAAA,CADE6H,CAAJ,EAAaA,CAAAhN,OAAb,CACSgN,CADT,CAPgC,IAAA,EA1CjB,CACTD,CAAJ,GACED,CHkTF,CGlTEA,CHkTF,CGlTsBC,CHkTtB,CGlTsBA,CHkTtB,CADAE,CANAC,EAOA,CADAD,CANqBC,EAOrB,EAP2C,EAO3C,CADAD,CALAE,EAMA,CADAF,CALiBE,EAMjB,EANmC,EAMnC,CADAF,CAJAG,EAKA,CADAH,CAJgBG,EAKhB,EALiC,EAKjC,CAAA,CAAAF,EAAA/L,KAAA,MAAA,CAAA,CAAA+L,EAAA,CAAA,EAAA,OAAA,CAA2BF,CI9U7B,WAAwB,MAAxB,CJ8U6BA,CI9U7B,CAGSK,EAAA,CAA0BC,EAAA,CJ2UNN,CI3UM,CAA1B,CJ2UP,CAAA,CGnTA,CAH+B,CAQjC,CAAyB,MAAzB,GAAIJ,CAAAtG,UAAJ,EAAmCyG,CAAnC,IACED,CADF,CACcA,CADd,EZzBc7N,CY0Ba,CAA4B2N,CAA5B,CAD3B,GAGIW,EAAA,CAAAT,CAAA,CAGJ,IZxCclO,CYwCV,CAAkCgO,CAAlC,CAAJ,CAA+C,CACAN,CAAAA,CAAAA,CJ0etCF,GG9hBT,CCoDuCQ,CDpDvC,CACML,EAAAA,CjBiCQpP,CiBjCQ,CCmDiByP,CDnDjB,CACW7P,KAAAA,EAAjC,GAAIwP,CAAA3P,WAAJ,GACE2P,CAAA/P,WADF,CAC6B,IAD7B,CAIA,IC8CiCY,CD9C7BoI,SAAJ,GAAsB1H,IAAAuK,uBAAtB,CAAmD,CAC7C7B,CAAAA,CC6C2BpJ,CD7CtBZ,WACT,KAASsD,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkB0G,CAAAxG,OAAlB,CAA6BF,CAAA,EAA7B,CACEuM,EAAA,CAAS7F,CAAA,CAAG1G,CAAH,CAAT,CC2CmC8M,CD3CnC,CAA2BN,CAA3B,CAGIzN,EAAAA,CjBsBM1B,CiBtBK,CCwCcC,CDxCd,CACboQ,EAAAA,CAAmCzQ,IAAAA,EAAzB,GAAC8B,CAAAjC,WAAD,CAAsC,IAAtC,CAA6CG,IAAAA,EAC3D8B,EAAAjC,WAAA,CAAsBiC,CAAAlC,UAAtB,CAA2C6Q,CAC3C3O,EAAArC,WAAA,CAAsBgR,CAT2B,CAAnD,IAWEnB,GAAA,CCmC+BjP,CDnC/B,CCmCqCwP,CDnCrC,CAA0BN,CAA1B,CCsCMmB,EAAAA,ClBdMnQ,CkBcO,CAAiBsP,CAAjB,CACnB,IAAIc,EAAA,CAAsBd,CAAtB,CAAJ,CAAmC,CACjCW,EAAA,CAAAE,CAAAzR,KAAA,CACA;IAAA2R,EAAsB,CAAA,CAFW,CAAnC,IAKWF,EAAAzR,KAAJ,GACL2R,CADK,CACiB,CAAA,CADjB,CAVsC,CAc1CA,CAAL,GAEMrM,CAGJ,CZtDYxC,CYmDI,CAAkB8N,CAAlB,CAAA,CACYA,CAADzB,KADX,CAC2ByB,CAE3C,CAAIN,CAAJ,EACEA,CACA,CADWsB,EAAA,CAAkBtB,CAAlB,CACX,CAAAuB,CAAAhK,aAAA6B,KAAA,CAAgCpE,CAAhC,CAA2ClE,CAA3C,CAAiDkP,CAAjD,CAFF,EAIEuB,CAAAvI,YAAAI,KAAA,CAA+BpE,CAA/B,CAA0ClE,CAA1C,CATJ,CAYA0Q,GAAA,CAAiBlB,CAAjB,CAAyBxP,CAAzB,CACA,OAAOA,EAnE4C;AAyF9C2G,QAASA,GAAW,CAAC6I,CAAD,CAASxP,CAAT,CAAe,CACxC,GAAIA,CAAAP,WAAJ,GAAwB+P,CAAxB,CACE,KAAMtF,MAAA,CAAM,sDAAN,CACJlK,CADI,CAAN,CAGF,IACI0P,EZtFU7N,CYsFE,CAA4B7B,CAA5B,CADhB,CAGMqQ,ElBnEQnQ,CkBmEK,CAAiBsP,CAAjB,CACnB,IZlGchO,CYkGV,CAAkCgO,CAAlC,CAAJ,CAA+C,CDrD/C,IAAM/N,EjBtBQ1B,CiBsBG,CCsDeC,CDtDf,CAAjB,CACMmP,EjBvBQpP,CiBuBQ,CCqDgByP,CDrDhB,CCqDUxP,EDpDhC,GAAamP,CAAA3P,WAAb,GACE2P,CAAA3P,WADF,CAC6BiC,CAAApC,YAD7B,CCoDgCW,EDjDhC,GAAamP,CAAA5P,UAAb,GACE4P,CAAA5P,UADF,CAC4BkC,CAAAnC,gBAD5B,CAGA,KAAIwC,EAAIL,CAAAnC,gBAAR,CACIqD,EAAIlB,CAAApC,YACJyC,EAAJ,GjBhCc/B,CiBiCZ,CAAuB+B,CAAvB,CAAAzC,YADF,CAC0CsD,CAD1C,CAGIA,EAAJ,GjBnCc5C,CiBoCZ,CAAuB4C,CAAvB,CAAArD,gBADF,CAC8CwC,CAD9C,CAMAL,EAAAhC,WAAA,CAAsBgC,CAAAnC,gBAAtB,CACAmC,CAAApC,YADA,CACuBM,IAAAA,EACUA,KAAAA,EAAjC,GAAIwP,CAAA/P,WAAJ,GAEE+P,CAAA/P,WAFF,CAE6B,IAF7B,CCkCE,IAAIkR,EAAA,CAAsBd,CAAtB,CAAJ,CAAmC,CACjCW,EAAA,CAAAE,CAAAzR,KAAA,CACA,KAAA+R,EAAsB,CAAA,CAFW,CAFU,CAO/CC,EAAA,CAAqB5Q,CAArB,CAEA,IAAI0P,CAAJ,CAAe,CAEb,CADImB,CACJ,CADwBrB,CACxB,EADuD,MACvD,GADkCA,CAAAtG,UAClC;CACEyH,CADF,CACwB,CAAA,CADxB,CH+SA,IG5SyBjB,CH4SpBK,EAAL,CAAA,CAGAe,EAAA,CG/SyBpB,CH+SzB,CAEM3J,EAAAA,CGjTmB2J,CHiTbM,EACZ,KAASrN,EAAT,GAAcoD,EAAd,CAEE,IADI6J,CACKlN,CADGqD,CAAA,CAAIpD,EAAJ,CACHD,CAAAA,CAAAA,CAAE,CAAX,CAAcA,CAAd,CAAkBkN,CAAAhN,OAAlB,CAAgCF,CAAA,EAAhC,CAAqC,CACnC,IAAIqO,EAAOnB,CAAA,CAAMlN,CAAN,CACX,ITzUQuB,ESyUJ,CGtTiDjE,CHsTjD,CAA0B+Q,CAA1B,CAAJ,CAAqC,CACnCnB,CAAAoB,OAAA,CAAatO,CAAb,CAAgB,CAAhB,CACMuO,KAAAA,EGxTavB,CHwTTK,EAAAmB,QAAA,CAAuBH,CAAvB,CACD,EAAT,EAAIE,CAAJ,EGzTmBvB,CH0TjBK,EAAAiB,OAAA,CAAsBC,CAAtB,CAAyB,CAAzB,CAEFvO,EAAA,EAiCAoH,EAAAA,Cf/aM5J,Ce+aC,CAhCoB6Q,CAgCpB,CAEb,IADIvO,CACJ,CADSsH,CAAAhL,EACT,CACE,IAAK,IAAI4D,EAAE,CAAX,CAAcA,CAAd,CAAgBF,CAAAI,OAAhB,CAA2BF,CAAA,EAA3B,CAAgC,CAC9B,IAAI1C,EAAOwC,CAAA,CAAGE,CAAH,CAAX,CACI8M,EAAS/P,EAAA,CAAWO,CAAX,CACTwP,EAAJ,EACE7I,CAAAA,YAAA2B,KAAA,CAAiBkH,CAAjB,CAAyBxP,CAAzB,CAJ4B,CAQlC8J,CAAAhL,EAAA,CAAsB,EACtBgL,EAAA5K,cAAA,CAAqB,EA3CfiS,EAAA,CAAY,CAAA,CARuB,CAFF,CAcvC,IAAA,GAAOA,CAtBP,CAAA,IAD+B,GAAA,CAAA,IAAA,EG1S/B,EAAIC,EAAJ,EAA8BP,CAA9B,GACEV,EAAA,CAAAT,CAAA,CAPW,CAUViB,CAAL,GAEMzM,CAOJ,CZzHYxC,CYkHI,CAAkB8N,CAAlB,CAAA,CACYA,CAADzB,KADX,CAEdyB,CAKF,EAAM5Q,CAAAyR,CAAAzR,KAAN,EAA4C,MAA5C,GAAyBoB,CAAAkJ,UAAzB,EACGhF,CADH,GACiBzE,EAAA,CAAWO,CAAX,CADjB,GAEEyQ,CAAA9J,YAAA2B,KAAA,CAA+BpE,CAA/B,CAA0ClE,CAA1C,CAXJ,CAcA0Q,GAAA,CAAiBlB,CAAjB,CAAyB,IAAzB,CAA+BxP,CAA/B,CACA,OAAOA,EA3CiC;AA8C1C4Q,QAASA,GAAoB,CAAC5Q,CAAD,CAAO,CAelC,IAAMyB,ElBxHQvB,CkBwHG,CAbMF,CAaN,CAbjB,IAceyB,CAdf,EAcuD9B,IAAAA,EAdvD,GAc2B8B,CAAA/B,EAd3B,CAA8B,CACxB0J,CAAAA,CAAKpJ,CAAAZ,WACT,KAF4B,IAEnBsD,EAAE,CAFiB,CAEd2G,EAAED,CAAAxG,OAFY,CAEDD,CAA3B,CAA+BD,CAA/B,CAAiC2G,CAAjC,GAAwC1G,CAAxC,CAA0CyG,CAAA,CAAG1G,CAAH,CAA1C,EAAkDA,CAAA,EAAlD,CACEkO,EAAA,CAAqBjO,CAArB,CAH0B,CAO9B,GADMlB,CACN,ClBlHcvB,CkBiHG,CAAiBF,CAAjB,CACjB,CACEyB,CAAA/B,EAAA,CAA0BC,IAAAA,EAVM,CA0BpC6Q,QAASA,GAAiB,CAACxQ,CAAD,CAAO,CAC/B,IAAIqR,EAAWrR,CACXA,EAAJ,EAA+B,MAA/B,GAAYA,CAAAkJ,UAAZ,GAGEmI,CAHF,CAGa,CADLC,CACK,EAFL7P,CAEK,ClBxICvB,CkBsIK,CAAiBF,CAAjB,CAEN,GADmByB,CAAA3C,EACnB,GAAawS,CAAA1O,OAAb,CAAgC0O,CAAA,CAAU,CAAV,CAAhC,CACTd,EAAA,CAAkBxQ,CAAAX,YAAlB,CAJJ,CAMA,OAAOgS,EARwB,CAWjCf,QAASA,GAAqB,CAACtQ,CAAD,CAAO,CAGnC,OADIpB,CACJ,EAFM6C,CAEN,ClBjJcvB,CkB+IG,CAAiBF,CAAjB,CAEjB,GADuByB,CAAA7C,KACvB,GAAgB2S,EAAA,CAAA3S,CAAA,CAHmB;AAarC4S,QAASA,GAAyB,CAACxR,CAAD,CAAO2J,CAAP,CAAa,CAC7C,GAAa,MAAb,GAAIA,CAAJ,CACQ6F,CACN,CADexP,CAAAP,WACf,CAAI6Q,EAAA,CAAsBd,CAAtB,CAAJ,EACEW,EAAA,ClB/JUjQ,CkB+JV,CAAiBsP,CAAjB,CAAA5Q,KAAA,CAHJ,KAKO,IAAuB,MAAvB,GAAIoB,CAAAkJ,UAAJ,EAA0C,MAA1C,GAAiCS,CAAjC,GACD/K,CADC,CZtLOiD,CYuLD,CAA4B7B,CAA5B,CADN,EAEK,CHqPV,GGpPEpB,CHoPGmR,EAAL,CAAA,CAGA,IAAM0B,EGvPiBzR,CHuPP0R,GAAhB,CACM/H,EAAOgI,EAAA,CGxPU3R,CHwPV,CACb,IAAI2J,CAAJ,GAAa8H,CAAb,CAAA,CAII7B,CAAAA,CG7PFhR,CH6PUoR,EAAA,CAAcyB,CAAd,CACZ,KAAM/O,EAAIkN,CAAAsB,QAAA,CG9PalR,CH8Pb,CACD,EAAT,EAAI0C,CAAJ,EACEkN,CAAAoB,OAAA,CAAatO,CAAb,CAAgB,CAAhB,CAGEkP,EAAAA,CGnQFhT,CHmQSoR,EAAA,CAAcrG,CAAd,CAAPiI,GGnQFhT,CHmQiCoR,EAAA,CAAcrG,CAAd,CAA/BiI,CAAqD,EAArDA,CACJA,EAAA7N,KAAA,CGpQuB/D,CHoQvB,CACkB,EAAlB,CAAI4R,CAAAhP,OAAJ,GGrQEhE,CHsQAoR,EAAA,CAAcrG,CAAd,CADF,CACwBkI,EAAA,CAAgBD,CAAhB,CADxB,CAZA,CALA,CGnPEzB,EAAA,CAAAvR,CAAA,CAFQ,CARiC,CAoB/C8R,QAASA,GAAgB,CAAC1Q,CAAD,CAAO8R,CAAP,CAAkBC,CAAlB,CAA+B,CAGtD,GADM5S,CACN,EAFMsC,CAEN,ClBlLcvB,CkBgLG,CAAiBF,CAAjB,CAEjB,GAD6ByB,CAAAtC,EAC7B,CACM2S,CAMJ,EALE3S,CAAAuF,WAAAX,KAAA,CAAyB+N,CAAzB,CAKF,CAHIC,CAGJ,EAFE5S,CAAAwF,aAAAZ,KAAA,CAA2BgO,CAA3B,CAEF,CAAAjN,EAAA,CAAA3F,CAAA,CAVoD;AAkBjDsB,QAASA,GAAW,CAACT,CAAD,CAAgB,CACzC,GAAKA,CAAL,EAAcA,CAAAoI,SAAd,CAAA,CAGA,IAAM3G,ElB5MQ1B,CkB4MG,CAAuBC,CAAvB,CAAjB,CACIpB,EAAO6C,CAAA/B,EACEC,KAAAA,EAAb,GAAIf,CAAJ,GZhOc8C,CYiOR,CAAkB1B,CAAlB,CAAJ,EACEpB,CACA,CADOoB,CACP,CAAAyB,CAAA/B,EAAA,CAA0Bd,CAF5B,GAKEA,CAMA,CANO,CADH4Q,CACG,CADMxP,CAAAP,WACN,EAASgB,EAAA,CAAY+O,CAAZ,CAAT,CAA+BxP,CAMtC,CAAIyQ,CAAAxM,SAAAqE,KAAA,CAA4BnF,QAAA6O,gBAA5B,CAAsDhS,CAAtD,CAAJ,GACEyB,CAAA/B,EADF,CAC4Bd,CAD5B,CAXF,CADF,CAkBA,OAAOA,EAvBP,CADyC,CAmCpCqT,QAASA,GAAK,CAACjS,CAAD,CAAOkS,CAAP,CAAgBC,CAAhB,CAAwB,CAC3C,IAAIP,EAAO,EACXQ,GAAA,CAAcpS,CAAAZ,WAAd,CAA+B8S,CAA/B,CACEC,CADF,CACUP,CADV,CAEA,OAAOA,EAJoC,CAO7CQ,QAASA,GAAa,CAACC,CAAD,CAAWH,CAAX,CAAoBC,CAApB,CAA4BP,CAA5B,CAAkC,CACtD,IADsD,IAC7ClP,EAAE,CAD2C,CACxC2G,EAAEgJ,CAAAzP,OADsC,CACrB+F,CAAjC,CAAqCjG,CAArC,CAAuC2G,CAAvC,GAA8CV,CAA9C,CAAgD0J,CAAA,CAAS3P,CAAT,CAAhD,EAA8DA,CAAA,EAA9D,CAAmE,CAC7D,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,SAAA,GAAA,IAAA,aAAA,CAAA,CACA,CAAA,CAAA,CAAA,KAAA,EAAA,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,CAAA,CAOF4P,EAASJ,CAAA,CAAQlS,CAAR,CACTsS,EAAJ,EACEV,CAAA7N,KAAA,CAAU/D,CAAV,CAEEmS,EAAJ,EAAcA,CAAA,CAAOG,CAAP,CAAd,CACE,CADF,CACSA,CADT,EAGAF,EAAA,CAAcpS,CAAAZ,WAAd,CAA+B8S,CAA/B,CACEC,CADF,CACUP,CADV,CARiD,CAAA,CAAA,CAAA,IAAA,EAKjD,CAZM,CAAJ,GAAI,CAAJ,CAEE,KAH+D,CADb,CA4BxD,IAAIW,GAAc,IAEX3L;QAASA,GAAY,CAAC5G,CAAD,CAAO0J,CAAP,CAAanD,CAAb,CAAoB,CACzCgM,EAAL,GACEA,EADF,CACgBnS,MAAA,SADhB,EACsCA,MAAA,SAAA,YADtC,CAGImS,GAAJ,EAA4B,OAA5B,GAAmB7I,CAAnB,CACE6I,EAAA,gBAAA,CAA+BvS,CAA/B,CAAqCuG,CAArC,CADF,EAGEkK,CAAA7J,aAAA0B,KAAA,CAAgCtI,CAAhC,CAAsC0J,CAAtC,CAA4CnD,CAA5C,CACA,CAAAiL,EAAA,CAA0BxR,CAA1B,CAAgC0J,CAAhC,CAJF,CAJ8C,CAsCzC3C,QAASA,GAAU,CAAC/G,CAAD,CAAOwS,CAAP,CAAa,CACrC,GAAIxS,CAAAyS,cAAJ,GAA2BtP,QAA3B,CACE,MAAOsN,EAAA1J,WAAAuB,KAAA,CAA8BnF,QAA9B,CAAwCnD,CAAxC,CAA8CwS,CAA9C,CAET,KAAI7P,EAAI8N,CAAA1J,WAAAuB,KAAA,CAA8BnF,QAA9B,CAAwCnD,CAAxC,CAA8C,CAAA,CAA9C,CACR,IAAIwS,CAAJ,CAAU,CACJpJ,CAAAA,CAAKpJ,CAAAZ,WACAsD,EAAAA,CAAE,CAAX,KAAK,IAASgQ,CAAd,CAAkBhQ,CAAlB,CAAsB0G,CAAAxG,OAAtB,CAAiCF,CAAA,EAAjC,CACEgQ,CACA,CADK3L,EAAA,CAAWqC,CAAA,CAAG1G,CAAH,CAAX,CAAkB,CAAA,CAAlB,CACL,CAAAC,CAAAuF,YAAA,CAAcwK,CAAd,CAJM,CAOV,MAAO/P,EAZ8B,C,CEvVvC,IAAoBgQ,GAAoB,iBAApBA,CAAsCC,IAAAC,IAAA,EAA1D,CAGIC,GAAiB,CACnB,KAAQ,CAAA,CADW,CAEnB,MAAS,CAAA,CAFU,CAGnB,QAAW,CAAA,CAHQ,CAInB,SAAY,CAAA,CAJO,CAKnB,MAAS,CAAA,CALU,CAMnB,SAAY,CAAA,CANO,CAOnB,UAAa,CAAA,CAPM,CAQnB,WAAc,CAAA,CARK,CASnB,WAAc,CAAA,CATK,CAUnB,UAAa,CAAA,CAVM,CAWnB,SAAY,CAAA,CAXO,CAYnB,UAAa,CAAA,CAZM,CAanB,QAAW,CAAA,CAbQ,CAcnB,MAAS,CAAA,CAdU,CAenB,YAAe,CAAA,CAfI,CAgBnB,MAAS,CAAA,CAhBU,CAiBnB,QAAW,CAAA,CAjBQ,CAkBnB,MAAS,CAAA,CAlBU,CAmBnB,iBAAoB,CAAA,CAnBD,CAoBnB,kBAAqB,CAAA,CApBF,CAqBnB,eAAkB,CAAA,CArBC,CAsBnB,WAAc,CAAA,CAtBK,CAuBnB,SAAY,CAAA,CAvBO,CAwBnB,UAAa,CAAA,CAxBM,CAyBnB,YAAe,CAAA,CAzBI,CA0BnB,YAAe,CAAA,CA1BI,CA2BnB,aAAgB,CAAA,CA3BG,CA4BnB,YAAe,CAAA,CA5BI,CA6BnB,YAAe,CAAA,CA7BI,CA8BnB,UAAa,CAAA,CA9BM,CA+BnB,cAAiB,CAAA,CA/BE,CAgCnB,WAAc,CAAA,CAhCK,CAiCnB,aAAgB,CAAA,CAjCG,CAkCnB,kBAAqB,CAAA,CAlCF,CAmCnB,mBAAsB,CAAA,CAnCH;AAoCnB,UAAa,CAAA,CApCM,CAqCnB,KAAQ,CAAA,CArCW,CAsCnB,UAAa,CAAA,CAtCM,CAuCnB,UAAa,CAAA,CAvCM,CAwCnB,SAAY,CAAA,CAxCO,CAyCnB,KAAQ,CAAA,CAzCW,CA0CnB,QAAW,CAAA,CA1CQ,CA2CnB,YAAe,CAAA,CA3CI,CA4CnB,WAAc,CAAA,CA5CK,CA6CnB,YAAe,CAAA,CA7CI,CA8CnB,SAAY,CAAA,CA9CO,CAiDrBC,SAASA,GAAY,CAACC,CAAD,CAAY3B,CAAZ,CAAsB,CACzC,IAAI4B,EAAe,EAAnB,CACIC,EAAUF,CAEd,KADIG,CACJ,CADgBH,CAAA,GAAc5S,MAAd,CAAuBA,MAAvB,CAAgC4S,CAAAvS,YAAA,EAChD,CAAOyS,CAAP,CAAA,CACED,CAAAlP,KAAA,CAAkBmP,CAAlB,CAEE,CAAAA,CAAA,CADEA,CAAAjU,aAAJ,CACYiU,CAAAjU,aADZ,CAEWiU,CAAA9K,SAAJ,GAAyB1H,IAAAuK,uBAAzB,EAAwDiI,CAAAnF,KAAxD,GAAyEsD,CAAzE,EAAqF6B,CAArF,GAAiGC,CAAjG,EACKD,CAAAnF,KADL,CAGKmF,CAAAzT,WAIVwT,EAAA,CAAaA,CAAArQ,OAAb,CAAmC,CAAnC,CAAJ,GAA8CO,QAA9C,EACE8P,CAAAlP,KAAA,CAAkB3D,MAAlB,CAEF,OAAO6S,EAlBkC;AAqB3CG,QAASA,GAAQ,CAACC,CAAD,CAAUC,CAAV,CAAgB,CAC/B,GAAI,Cd3DU5R,Cc2Dd,CACE,MAAO2R,EAILE,EAAAA,CAAcR,EAAA,CAAaM,CAAb,CAAsB,CAAA,CAAtB,CAElB,KAR+B,IAQtB3Q,EAAE,CARoB,CAQjB8Q,CARiB,CAQPC,CARO,CAQG7U,CARH,CAQS8U,CAAxC,CAAiDhR,CAAjD,CADS4Q,CAC4C1Q,OAArD,CAAgEF,CAAA,EAAhE,CAOE,GANA8Q,CAMI,CARGF,CAEI,CAAG5Q,CAAH,CAMP,CALJ9D,CAKI,CALG4U,CAAA,GAAapT,MAAb,CAAsBA,MAAtB,CAA+BoT,CAAA/S,YAAA,EAKlC,CAJA7B,CAIA,GAJS6U,CAIT,GAHFC,CACA,CADUH,CAAArC,QAAA,CAAoBtS,CAApB,CACV,CAAA6U,CAAA,CAAW7U,CAET,EAAA,CdzEQ8C,CcyEP,CAAkB9C,CAAlB,CAAD,EAAuC,EAAvC,CAA4B8U,CAAhC,CACE,MAAOF,EAhBoB;AAqBjC,IAAIG,GAAa,CAKXtC,YAAW,EAAA,CAEU,CAAA,CAAvB,GAAI,IAAAuC,UAAJ,EAAoDjU,IAAAA,EAApD,GAAgC,IAAAkU,EAAhC,GACE,IAAAA,EADF,CACoBf,EAAA,CAAe,IAAAgB,KAAf,CADpB,CAGA,OAAO,KAAAD,EAAP,EAA0B,CAAA,CALb,CALA,CAgBf,aAAAZ,QAAY,EAAG,CACR,IAAAc,EAAL,GACE,IAAAA,EADF,CACwBhB,EAAA,CAAa,IAAA,SAAb,CAA+B,IAAA1B,SAA/B,CADxB,CAGA,OAAO,KAAA0C,EAJM,CAhBA,CA0BXzR,UAAS,EAAA,CACX,MAAO8Q,GAAA,CAAS,IAAAY,cAAT,CAA6B,IAAAf,aAAA,EAA7B,CADI,CA1BE,CAkCXgB,iBAAgB,EAAA,CAClB,GAAI,CAAC,IAAAC,EAAL,CACE,MAAO,KAEJ,KAAAC,EAAL,GACE,IAAAA,EADF,CACqCpB,EAAA,CAAa,IAAAmB,EAAb,CAAmC,CAAA,CAAnC,CADrC,CAIA,OAAOd,GAAA,CAAS,IAAAY,cAAT,CAA6B,IAAAG,EAA7B,CARW,CAlCL,CA+Cf,gBAAAC,QAAe,EAAG,CAChBC,KAAA7T,UAAA4T,gBAAA9L,KAAA,CAAqC,IAArC,CACA,KAAAgM,EAAA,CAA4B,CAAA,CAFZ,CA/CH,CAsDf,yBAAAC,QAAwB,EAAG,CACzBF,KAAA7T,UAAA+T,yBAAAjM,KAAA,CAA8C,IAA9C,CAEA;IAAAgM,EAAA,CADA,IAAAE,EACA,CADqC,CAAA,CAFZ,CAtDZ,CA8DjBC,SAASA,GAAiB,CAACC,CAAD,CAAO,CAGnBC,QAAA,EAAQ,CAACb,CAAD,CAAOc,CAAP,CAAgB,CAC9BC,CAAAA,CAAQ,IAAIH,CAAJ,CAASZ,CAAT,CAAec,CAAf,CACZC,EAAAhB,EAAA,CAAmBe,CAAnB,EAA8B,CAAA,CAAQA,CAAA,SACtC,OAAOC,EAH2B,CdpGtB5R,Ec0Gd,CAAY0R,CAAZ,CAAmBD,CAAnB,CACAC,EAAAnU,UAAA,CAAkBkU,CAAAlU,UAClB,OAAOmU,EAXwB,CAcjC,IAAIG,GAA8B,CAChC,MAAS,CAAA,CADuB,CAEhC,KAAQ,CAAA,CAFwB,CAWlCC,SAASA,GAAa,CAACF,CAAD,CAAQ,CAC5B,MAAOA,EAAA,SAAP,GAA6BA,CAAAvS,OAA7B,EAA6CuS,CAAAX,EAA7C,GAAuEW,CAAAZ,cAD3C,CAU9Be,QAASA,GAAY,CAACH,CAAD,CAAQ7U,CAAR,CAAciV,CAAd,CAAqB,CAGxC,GAFIC,CAEJ,CAFSlV,CAAAmV,WAET,EAF4BnV,CAAAmV,WAAA,CAAgBN,CAAAf,KAAhB,CAE5B,EADE9T,CAAAmV,WAAA,CAAgBN,CAAAf,KAAhB,CAAA,CAA4BmB,CAA5B,CACF,CACE,IADM,IACGvS,EAAI,CADP,CACU0S,CAAhB,EAAqBA,CAArB,CAA0BF,CAAA,CAAGxS,CAAH,CAA1B,IACM,CAAAqS,EAAA,CAAcF,CAAd,CADN,EAC8BA,CAAAvS,OAD9B,GAC+CuS,CAAAZ,cAD/C,IAIEmB,CAAA9M,KAAA,CAAQtI,CAAR,CAAc6U,CAAd,CACIL,CAAAA,CAAAK,CAAAL,EALN,EAAkC9R,CAAA,EAAlC,EAJsC;AAgB1C2S,QAASA,GAAwB,CAAC3R,CAAD,CAAI,CACnC,IAAI4P,EAAO5P,CAAAuP,aAAA,EAGXrS,OAAAkC,eAAA,CAAsBY,CAAtB,CAAyB,eAAzB,CAA0C,CACxC1C,IAAKA,QAAQ,EAAG,CACd,MAAOhB,EADO,CADwB,CAIxCe,aAAc,CAAA,CAJ0B,CAA1C,CAMA,KAAK,IAAI2B,EAAI4Q,CAAA1Q,OAAJF,CAAkB,CAA3B,CAAmC,CAAnC,EAA8BA,CAA9B,CAAsCA,CAAA,EAAtC,CAA2C,CACzC,IAAA1C,EAAOsT,CAAA,CAAK5Q,CAAL,CAEPsS,GAAA,CAAatR,CAAb,CAAgB1D,CAAhB,CAAsB,SAAtB,CACA,IAAI0D,CAAA4Q,EAAJ,CACE,MALuC,CAU3C1T,MAAAkC,eAAA,CAAsBY,CAAtB,CAAyB,YAAzB,CAAuC,CAAC,IAAA1C,QAAG,EAAG,CAAE,MAAOqT,MAAAiB,UAAT,CAAP,CAAvC,CAIA,KAAIC,CACJ,KAAS7S,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB4Q,CAAA1Q,OAApB,CAAiCF,CAAA,EAAjC,CAAsC,CACpC1C,CAAA,CAAOsT,CAAA,CAAK5Q,CAAL,CACP,KAAMjB,EpBlMMvB,CoBkMK,CAAiBF,CAAjB,CACXpB,EAAAA,CAAO6C,CAAP7C,EAAmB6C,CAAA7C,KACzB,IAAU,CAAV,GAAI8D,CAAJ,EAAgB9D,CAAhB,EAAwBA,CAAxB,GAAiC2W,CAAjC,CAME,GALAP,EAAA,CAAatR,CAAb,CAAgB1D,CAAhB,CAAsB,QAAtB,CAKIsU,CAHAtU,CAGAsU,GAHSlU,MAGTkU,GAFFiB,CAEEjB,CAFctU,CAAAS,YAAA,EAEd6T,EAAA5Q,CAAA4Q,EAAJ,CACE,KAXgC,CAzBH;AAyD9BkB,QAASA,GAAY,CAACC,CAAD,CAAWzV,CAAX,CAAiB8T,CAAjB,CAAuB4B,CAAvB,CAAgCC,CAAhC,CAAsCC,CAAtC,CAA+C,CACzE,IAAK,IAAIlT,EAAI,CAAb,CAAgBA,CAAhB,CAAoB+S,CAAA7S,OAApB,CAAqCF,CAAA,EAArC,CAA0C,CACd,IAAA,EAAA+S,CAAA,CAAS/S,CAAT,CAAA,CAdpBmT,EAIJC,CAJF,KAc0B,CAbjBC,EAGPD,CAHF,QAa0B,CAZpBE,EAEJF,CAFF,KAY0B,CAXjBG,EACPH,CADF,QAWA,IAAuC9V,CAAvC,GAVE8V,CALFI,KAeA,EAA6CpC,CAA7C,GARS+B,CAQT,EAAmDH,CAAnD,GAPYK,CAOZ,EAA4DJ,CAA5D,GANSK,CAMT,EAAkEJ,CAAlE,GALYK,CAKZ,CACE,MAAOvT,EAF+B,CAK1C,MAAQ,EANiE;AAyBpEuE,QAASA,GAAgB,CAAC6M,CAAD,CAAOqC,CAAP,CAAgBC,CAAhB,CAAkC,CAChE,GAAKD,CAAL,CAAA,CAIA,IAAME,EAAc,MAAOF,EAG3B,IAAoB,UAApB,GAAIE,CAAJ,EAAkD,QAAlD,GAAkCA,CAAlC,CAKA,GAAoB,QAApB,GAAIA,CAAJ,EAAkCF,CAAAG,YAAlC,EAAwF,UAAxF,GAAyD,MAAOH,EAAAG,YAAhE,CAAA,CAWA,GAAIF,CAAJ,EAAoD,QAApD,GAAwB,MAAOA,EAA/B,CAA8D,CAC5D,IAAAV,EAAU,CAAA,CAAQU,CAAAV,QAClB,KAAAC,EAAO,CAAA,CAAQS,CAAAT,KACf,KAAAC,EAAU,CAAA,CAAQQ,CAAAR,QAH0C,CAA9D,IAKEF,EAEA,CAFU,CAAA,CAAQU,CAElB,CAAAR,CAAA,CADAD,CACA,CADO,CAAA,CAMT,KAAIrT,EAAU8T,CAAV9T,EAA8B8T,CAAAG,EAA9BjU,EAAiE,IAArE,CAEImT,EAAWU,CAAA,CAAQxD,EAAR,CACf,IAAI8C,CAAJ,CAEE,IAAoE,EAApE,CAAID,EAAA,CAAaC,CAAb,CAAuBnT,CAAvB,CAA+BwR,CAA/B,CAAqC4B,CAArC,CAA8CC,CAA9C,CAAoDC,CAApD,CAAJ,CACE,MADF,CAFF,IAMEO,EAAA,CAAQxD,EAAR,CAAA,CAA6B,EAOzB6D,EAAAA,CAAYA,QAAQ,CAAC9S,CAAD,CAAI,CAExBiS,CAAJ,EACE,IAAAzO,oBAAA,CAAyB4M,CAAzB,CAA+BqC,CAA/B,CAAwCC,CAAxC,CAEG1S,EAAA,SAAL,EACE+S,EAAA,CAAW/S,CAAX,CAGF,IAAIpB,CAAJ,GAAe,IAAf,CAAqB,CAEnB,IAAAoU,EAAwB9V,MAAAC,yBAAA,CAAgC6C,CAAhC,CAAmC,eAAnC,CACxB9C,OAAAkC,eAAA,CAAsBY,CAAtB,CAAyB,eAAzB,CAA0C,CAAC,IAAA1C,QAAG,EAAG,CAAE,MAAOsB,EAAT,CAAP;AAA0BvB,aAAc,CAAA,CAAxC,CAA1C,CAHmB,CAQrB,GAAI2C,CAAA2N,SAAJ,EAAsD,EAAtD,CAAkB3N,CAAAuP,aAAA,EAAA/B,QAAA,CAAyB5O,CAAzB,CAAlB,CACE,GAAIyS,EAAA,CAAcrR,CAAd,CAAJ,EAAwBA,CAAApB,OAAxB,GAAqCoB,CAAAuQ,cAArC,CACMvQ,CAAAiT,WAAJ,GAAqBtC,KAAAuC,eAArB,EACElT,CAAA6Q,yBAAA,EAFJ,KAOA,IAAI7Q,CAAAiT,WAAJ,GAAqBtC,KAAAwC,gBAArB,EAA+CnT,CAAAoT,QAA/C,EAA4DpT,CAAApB,OAA5D,GAAyEA,CAAzE,EAAqFA,CAArF,WAAuG8E,OAAvG,CAAA,CAGA,IAAI2P,EAAsB,UAAhB,GAAAV,CAAA,CACRF,CAAA7N,KAAA,CAAahG,CAAb,CAAqBoB,CAArB,CADQ,CAEPyS,CAAAG,YAFO,EAEgBH,CAAAG,YAAA,CAAoB5S,CAApB,CACtBpB,EAAJ,GAAe,IAAf,GAEMoU,CAAJ,EACE9V,MAAAkC,eAAA,CAAsBY,CAAtB,CAAyB,eAAzB,CAA0CgT,CAA1C,CACA,CAAAA,CAAA,CAAwB,IAF1B,EAIE,OAAOhT,CAAA,cANX,CASA,OAAOqT,EAfP,CAzB0B,CA4C9BZ,EAAA,CAAQxD,EAAR,CAAA5O,KAAA,CAAgC,CAG9B/D,KAAMsC,CAHwB,CAI9BwR,KAAMA,CAJwB,CAK9B4B,QAASA,CALqB,CAM9BC,KAAMA,CANwB,CAO9BC,QAASA,CAPqB,CAQ9BY,GAAWA,CARmB,CAAhC,CAWI1B,GAAA,CAA4BhB,CAA5B,CAAJ,EACE,IAAAqB,WAGA;AAHkB,IAAAA,WAGlB,EAHqC,EAGrC,CAFA,IAAAA,WAAA,CAAgBrB,CAAhB,CAEA,CAFwB,IAAAqB,WAAA,CAAgBrB,CAAhB,CAExB,EADE,CAAC,QAAW,EAAZ,CAAgB,OAAU,EAA1B,CACF,CAAA,IAAAqB,WAAA,CAAgBrB,CAAhB,CAAA,CAAsB4B,CAAA,CAAU,SAAV,CAAsB,QAA5C,CAAA3R,KAAA,CAA2DyS,CAA3D,CAJF,EAQElO,CAFU,IAAA0O,WAAgB5P,OAAhB4P,CAAyBvG,CAAAtJ,GAAzB6P,CACRvG,CAAAxJ,iBACFqB,MAAA,CAAS,IAAT,CAAewL,CAAf,CAAqB0C,CAArB,CAAgCJ,CAAhC,CAtGF,CAZA,CADgE;AA0H3DlP,QAASA,GAAmB,CAAC4M,CAAD,CAAOqC,CAAP,CAAgBC,CAAhB,CAAkC,CACnE,GAAKD,CAAL,CAAA,CAMA,GAAIC,CAAJ,EAAoD,QAApD,GAAwB,MAAOA,EAA/B,CAA8D,CAC5D,IAAAV,EAAU,CAAA,CAAQU,CAAAV,QAClB,KAAAC,EAAO,CAAA,CAAQS,CAAAT,KACf,KAAAC,EAAU,CAAA,CAAQQ,CAAAR,QAH0C,CAA9D,IAKEF,EAEA,CAFU,CAAA,CAAQU,CAElB,CAAAR,CAAA,CADAD,CACA,CADO,CAAA,CAGT,KAAIrT,EAAU8T,CAAV9T,EAA8B8T,CAAAG,EAA9BjU,EAAiE,IAArE,CAEIkU,EAAY7W,IAAAA,EAtJZ8V,KAAAA,EAAW,IACf,IAAI,CACFA,CAAA,CAqJ8BU,CArJnB,CAAUxD,EAAV,CADT,CAEF,MAAOjP,CAAP,CAAU,EAqJR+R,CAAJ,GACMwB,CACJ,CADUzB,EAAA,CAAaC,CAAb,CAAuBnT,CAAvB,CAA+BwR,CAA/B,CAAqC4B,CAArC,CAA8CC,CAA9C,CAAoDC,CAApD,CACV,CAAW,EAAX,CAAIqB,CAAJ,GACET,CAEA,CAFYf,CAAAzE,OAAA,CAAgBiG,CAAhB,CAAqB,CAArB,CAAA,CAAwB,CAAxB,CAAAT,GAEZ,CAAKf,CAAA7S,OAAL,GACEuT,CAAA,CAAQxD,EAAR,CADF,CAC+BhT,IAAAA,EAD/B,CAHF,CAFF,CAYA2I,EAFU,IAAA4O,WAAgB9P,OAAhB8P,CAAyBzG,CAAApJ,GAAzB6P,CACRzG,CAAAvJ,oBACFoB,MAAA,CAAS,IAAT,CAAewL,CAAf,CAAqB0C,CAArB,EAAkCL,CAAlC,CAA2CC,CAA3C,CACII,EAAJ,EAAiB1B,EAAA,CAA4BhB,CAA5B,CAAjB,EACI,IAAAqB,WADJ,EACuB,IAAAA,WAAA,CAAgBrB,CAAhB,CADvB,GAEQjL,CAEN,CAFY,IAAAsM,WAAA,CAAgBrB,CAAhB,CAAA,CAAsB4B,CAAA,CAAU,SAAV,CAAsB,QAA5C,CAEZ,CADMuB,CACN,CADYpO,CAAAqI,QAAA,CAAYsF,CAAZ,CACZ,CAAW,EAAX,CAAIS,CAAJ,EACEpO,CAAAmI,OAAA,CAAWiG,CAAX,CAAgB,CAAhB,CALJ,CAhCA,CADmE;AA2CrEE,QAASA,GAA2B,EAAG,CACrC,IAAKC,IAAIA,CAAT,GAAetC,GAAf,CACE1U,MAAA6G,iBAAA,CAAwBmQ,CAAxB,CAA4B,QAAQ,CAAC1T,CAAD,CAAI,CACjCA,CAAA,SAAL,GACE+S,EAAA,CAAW/S,CAAX,CACA,CAAA2R,EAAA,CAAyB3R,CAAzB,CAFF,CADsC,CAAxC,CAKG,CAAA,CALH,CAFmC,CAWvC+S,QAASA,GAAU,CAAC5B,CAAD,CAAQ,CACzBA,CAAA,SAAA,CAAoBA,CAAAvS,OACpBuS,EAAAX,EAAA,CAAwBW,CAAAZ,cAExB,Id5dS9T,Cc4dLW,EAAJ,CAAA,CdlZA,IAAI0K,EAAQ5K,MAAAyW,eAAA,CcmZWxC,CdnZX,CACZ,IAAI,CAACrJ,CAAAC,eAAA,CAAqB,cAArB,CAAL,CAA2C,CACzC,IAAI6L,EAAa1W,MAAA0F,OAAA,CAAckF,CAAd,CACjB8L,EAAAC,GAAA,CAA2B/L,CAC3BnJ,GAAA,CAAOiV,CAAP,Cc+Y4B3D,Ed/Y5B,CACAnI,EAAA,aAAA,CAAwB8L,CAJiB,CckZpBzC,Cd3YvBnG,UAAA,CAAgBlD,CAAA,ac0YhB,CAAA,Id3acnJ,Gc+aZ,CAAawS,CAAb,CAAoBlB,EAApB,CARuB,CAY3B,IAAI6D,GAAe/C,EAAA,CAAkBrU,MAAAiU,MAAlB,CAAnB,CACIoD,GAAqBhD,EAAA,CAAkBrU,MAAAsX,YAAlB,CADzB,CAEIC,GAAoBlD,EAAA,CAAkBrU,MAAAwX,WAAlB,C,CCvexBC,QAASA,GAAS,CAAC9K,CAAD,CAAiB+K,CAAjB,CAA6B,CAC7C,MAAO,CACL/K,MAAOA,CADF,CAELgL,EAwJiCA,EA1J5B,CAGLD,EAAYA,CAHP,CADsC;AAqI/CE,QAASA,GAAW,CAAC9E,CAAD,CAAwB+E,CAAxB,CACEC,CADF,CACiBC,CADjB,CACyB,CADfC,IAAAA,EAwGA,CAxGAA,CACHC,EAuGgC,CAxG7BD,CAExBE,EAAc,CAFUF,CAGxBG,EAAc,CAHUH,CAMxBI,EAAYC,IAAAC,IAAA,CAAST,CAAT,CAAsBG,CAAtB,CAAoCD,CAApC,CAA6CE,CAA7C,CAChB,IAAoB,CAApB,EAAID,CAAJ,EAAqC,CAArC,EAAyBC,CAAzB,CA2EgD,CAAA,CAAA,CAChD,IAAS3V,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CA3E2C8V,CA2E3C,CAAkC9V,CAAA,EAAlC,CACE,GA5E2BwQ,CA4EfyF,CAAQjW,CAARiW,CAAZ,GA5EoCT,CA4EZU,CAAIlW,CAAJkW,CAAxB,CACE,MAAA,CACJ,EAAA,CA9E2CJ,CA0EK,CAxEhD,GAAIP,CAAJ,EAAkB/E,CAAAtQ,OAAlB,EAAoCuV,CAApC,EAA8CD,CAAAtV,OAA9C,CAAA,CAgFIiW,CAAAA,CA/EyB3F,CA+EhBtQ,OAGb,KAFA,IAAIkW,EAhFkCZ,CAgFzBtV,OAAb,CACImW,EAAQ,CACZ,CAAOA,CAAP,CAlF2CP,CAkF3C,CAlFuDF,CAkFvD,EAA+BU,EAAA,CAlFF9F,CAkFS,CAAQ,EAAE2F,CAAV,CAAP,CAlFOX,CAkFmB,CAAI,EAAEY,CAAN,CAA1B,CAA/B,CAAA,CACEC,CAAA,EAEF,EAAA,CAAOA,CAtFP,CAGAX,CAAA,EAAgBE,CAChBD,EAAA,EAAYC,CACZL,EAAA,EAAcM,CACdJ,EAAA,EAAUI,CAEV,IAAiC,CAAjC,EAAIN,CAAJ,CAAiBG,CAAjB,EAA2D,CAA3D,EAAsCD,CAAtC,CAA+CE,CAA/C,CACE,MAAO,EAET,IAAID,CAAJ,EAAoBH,CAApB,CAAgC,CAE9B,IADAjH,CACA,CADS6G,EAAA,CAAUO,CAAV,CAA4B,CAA5B,CACT,CAAOC,CAAP,CAAkBF,CAAlB,CAAA,CACEnH,CAAA+G,EAAAhU,KAAA,CAAoBmU,CAAA,CAAIG,CAAA,EAAJ,CAApB,CAEF,OAAO,CAAErH,CAAF,CALuB,CAMzB,GAAIqH,CAAJ,EAAgBF,CAAhB,CACL,MAAO,CAAEN,EAAA,CAAUO,CAAV,CAA4BH,CAA5B,CAAyCG,CAAzC,CAAF,CAGsBA,EAAAA,CAAAA,CACCC,EAAAA,CAAAA,CA1I5BY,EAAAA,CA0IsCd,CA1ItCc,CAAoBZ,CAApBY,CAA+B,CAC/BC,EAAAA,CAwIyCjB,CAxIzCiB,CAA2Bd,CAA3Bc,CAA0C,CAC1CC,EAAAA,CAAgBhT,KAAJ,CAAU8S,CAAV,CAGhB,KAASvW,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBuW,CAApB,CAA8BvW,CAAA,EAA9B,CACEyW,CAAA,CAAUzW,CAAV,CACA,CADmByD,KAAJ,CAAU+S,CAAV,CACf,CAAAC,CAAA,CAAUzW,CAAV,CAAA,CAAa,CAAb,CAAA,CAAkBA,CAIpB,KAAS0W,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBF,CAApB,CAAiCE,CAAA,EAAjC,CACED,CAAA,CAAU,CAAV,CAAA,CAAaC,CAAb,CAAA,CAAkBA,CAEpB,KAAS1W,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBuW,CAApB,CAA8BvW,CAAA,EAA9B,CACE,IAAS0W,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBF,CAApB,CAAiCE,CAAA,EAAjC,CACE,GAyHkBlG,CAzHPyF,CAAQP,CAARO,CAAuBS,CAAvBT,CAA2B,CAA3BA,CAAX,GA0HuBT,CA1HmBU,CAAIP,CAAJO,CAAelW,CAAfkW,CAAmB,CAAnBA,CAA1C,CACEO,CAAA,CAAUzW,CAAV,CAAA,CAAa0W,CAAb,CAAA;AAAkBD,CAAA,CAAUzW,CAAV,CAAc,CAAd,CAAA,CAAiB0W,CAAjB,CAAqB,CAArB,CADpB,KAEK,CACH,IAAIC,EAAQF,CAAA,CAAUzW,CAAV,CAAc,CAAd,CAAA,CAAiB0W,CAAjB,CAARC,CAA8B,CAAlC,CACIC,EAAOH,CAAA,CAAUzW,CAAV,CAAA,CAAa0W,CAAb,CAAiB,CAAjB,CAAPE,CAA6B,CACjCH,EAAA,CAAUzW,CAAV,CAAA,CAAa0W,CAAb,CAAA,CAAkBC,CAAA,CAAQC,CAAR,CAAeD,CAAf,CAAuBC,CAHtC,CAeL5W,CAAAA,CAPGyW,CAOCvW,OAAJF,CAAuB,CACvB0W,EAAAA,CARGD,CAQC,CAAU,CAAV,CAAAvW,OAAJwW,CAA0B,CAC1BlG,EAAAA,CATGiG,CASO,CAAUzW,CAAV,CAAA,CAAa0W,CAAb,CAEd,KADIG,CACJ,CADY,EACZ,CAAW,CAAX,CAAO7W,CAAP,EAAoB,CAApB,CAAgB0W,CAAhB,CAAA,CACW,CAAT,EAAI1W,CAAJ,EACE6W,CAAAxV,KAAA,CAxDWyV,CAwDX,CACA,CAAAJ,CAAA,EAFF,EAKS,CAAT,EAAIA,CAAJ,EACEG,CAAAxV,KAAA,CA5Dc0V,CA4Dd,CACA,CAAA/W,CAAA,EAFF,GAKIgX,CAUJ,CAhCKP,CAsBW,CAAUzW,CAAV,CAAc,CAAd,CAAA,CAAiB0W,CAAjB,CAAqB,CAArB,CAUhB,CATIE,CASJ,CAhCKH,CAuBM,CAAUzW,CAAV,CAAc,CAAd,CAAA,CAAiB0W,CAAjB,CASX,CARIC,CAQJ,CAhCKF,CAwBO,CAAUzW,CAAV,CAAA,CAAa0W,CAAb,CAAiB,CAAjB,CAQZ,CAJEV,CAIF,CALIY,CAAJ,CAAWD,CAAX,CACQC,CAAA,CAAOI,CAAP,CAAmBJ,CAAnB,CAA0BI,CADlC,CAGQL,CAAA,CAAQK,CAAR,CAAoBL,CAApB,CAA4BK,CAEpC,CAAIhB,CAAJ,EAAWgB,CAAX,EACMA,CAAJ,EAAiBxG,CAAjB,CACEqG,CAAAxV,KAAA,CA/EW4V,CA+EX,CADF,EAGEJ,CAAAxV,KAAA,CAhFY6V,CAgFZ,CACA,CAAA1G,CAAA,CAAUwG,CAJZ,CAOA,CADAhX,CAAA,EACA,CAAA0W,CAAA,EARF,EASWV,CAAJ,EAAWY,CAAX,EACLC,CAAAxV,KAAA,CApFc0V,CAoFd,CAEA,CADA/W,CAAA,EACA,CAAAwQ,CAAA,CAAUoG,CAHL,GAKLC,CAAAxV,KAAA,CAzFWyV,CAyFX,CAEA,CADAJ,CAAA,EACA,CAAAlG,CAAA,CAAUmG,CAPL,CAxBP,CAmCFE,EAAAM,QAAA,EA8DA7I,EAAA,CAASrR,IAAAA,EACLma,EAAAA,CAAU,EAGd,KAASpX,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAjEO6W,CAiEa3W,OAApB,CAAgCF,CAAA,EAAhC,CACE,OAlEK6W,CAkEE,CAAI7W,CAAJ,CAAP,EACE,KArKaiX,CAqKb,CACM3I,CAAJ,GACE8I,CAAA/V,KAAA,CAAaiN,CAAb,CACA,CAAAA,CAAA,CAASrR,IAAAA,EAFX,CAKAoN,EAAA,EACAgN,EAAA,EACA,MACF,MA7KcH,CA6Kd,CACO5I,CAAL,GACEA,CADF,CACW6G,EAAA,CAAU9K,CAAV,CAAqB,CAArB,CADX,CAGAiE,EAAA8G,EAAA,EACA/K,EAAA,EAEAiE,EAAA+G,EAAAhU,KAAA,CAAoBmU,CAAA,CAAI6B,CAAJ,CAApB,CACAA,EAAA,EACA,MACF,MAtLWP,CAsLX,CACOxI,CAAL,GACEA,CADF,CACW6G,EAAA,CAAU9K,CAAV,CAAqB,CAArB,CADX,CAGAiE;CAAA8G,EAAA,EACA/K,EAAA,EACA,MACF,MA5Lc0M,CA4Ld,CACOzI,CAIL,GAHEA,CAGF,CAHW6G,EAAA,CAAU9K,CAAV,CAAqB,CAArB,CAGX,EADAiE,CAAA+G,EAAAhU,KAAA,CAAoBmU,CAAA,CAAI6B,CAAJ,CAApB,CACA,CAAAA,CAAA,EAhCJ,CAqCE/I,CAAJ,EACE8I,CAAA/V,KAAA,CAAaiN,CAAb,CAEF,OAAO8I,EA9EoC,CAkG7Cd,QAASA,GAAM,CAACL,CAAD,CAAeC,CAAf,CAA8B,CAC3C,MAAOD,EAAP,GAAwBC,CADmB,C,CNhOtC,IAAA,GFJM9M,CEIN,WAAA,CAAY,GFJNA,CEIM,WAAZ,CAMDkO,GAA6B,EAOnCC,SAASA,GAAY,CAACja,CAAD,CAAO,CAC1B,IAAIka,EAAY,EAChB,GACEA,EAAAC,QAAA,CAAkBna,CAAlB,CADF,OAEUA,CAFV,CAEiBA,CAAAP,WAFjB,CAGA,OAAOya,EALmB,CAc1Bzb,QAFWgQ,GAEA,CAAC2L,CAAD,CAAQrM,CAAR,CAAc6G,CAAd,CAAuB,CAChC,GAAIwF,CAAJ,GAAcJ,EAAd,CACE,KAAM,KAAIK,SAAJ,CAAc,qBAAd,CAAN,CAKF,IAAAzY,GAAA,CAzBmB0Y,WA0BblR,EAAAA,CAAKhK,EAAA,CAAW2O,CAAX,CAEX,KAAAA,KAAA,CAAYA,CACZ,KAAAwM,EAAA,CAAa3F,CAAb,EAAwBA,CAAA4F,KE4CjBjL,GF1CP,CAAiBxB,CAAjB,CAAuB3E,CAAvB,CACMqR,EAAAA,CfDMva,CeCK,CAAiB6N,CAAjB,CACjB0M,EAAA7b,KAAA,CAAgB,IAChB6b,EAAA9b,GAAA,CAhCgB+b,QAgCM,GAAA,IAAAH,EAAA,CAA6B,IAA7B,CAAoC,IAEpDI,EAAAA,CfZM5a,CeYK,CAAuB,IAAvB,CACjB4a,EAAAnb,WAAA,CAAsBmb,CAAApb,UAAtB,CACIob,CAAAlb,WADJ,CAC0Bkb,CAAAtb,YAD1B,CAEIsb,CAAArb,gBAFJ,CAE+B,IAC/Bqb,EAAAvb,WAAA,CAAsB,EAEtB,KAAAwb,EAAA,CAAsB,CAAA,CAKtB,KAAA9K,EAAA,CADA,IAAAE,EACA,CAFA,IAAAD,EAEA,CAFiB,IAIRrN,EAAAA,CAAE,CAAX,KAAK,IAAS2G,EAAED,CAAAxG,OAAhB,CAA2BF,CAA3B,CAA+B2G,CAA/B,CAAkC3G,CAAA,EAAlC,CACEiE,CAAAA,YAAA2B,KAAA,CAAiByF,CAAjB,CAAuB3E,CAAA,CAAG1G,CAAH,CAAvB,CAhC8B;AAqClCyN,QAAA,GAAY,CAAZA,CAAY,CAAG,CACR,CAAAyK,EAAL,GACE,CAAAA,EACA,CADsB,CAAA,CACtB,CRtEUvW,EQsEV,CAAQ,QAAA,EAAM,CAAA,MAAAwW,GAAA,CAHHA,CAGG,CAAA,CAAd,CAFF,CADa,CAmCfA,QAAA,GAAO,CAAPA,CAAO,CAAG,CAxBR,IAyBa,IAAA,CAzBb,CAAOjc,CAAP,CAAA,CAAa,CACPA,CAAAgc,EAAJ,GACEE,CADF,CACelc,CADf,CAUe,EAAA,CAAA,CAPRA,IAAAA,EAAAA,CAQLA,EAAAA,CAAO,CAAAmP,KAAAtN,YAAA,EACX,ITzEYiB,CSyER,CAAkB9C,CAAlB,CAAJ,CAEE,IADA,IAAIwK,EAAK,CAAA2E,KAAA3O,WAAT,CACSsD,EAAE,CAAX,CAAiBA,CAAjB,CAAqB0G,CAAAxG,OAArB,CAAgCF,CAAA,EAAhC,CAEE,GADAiG,CAsNK,CAtNDS,CAAA,CAAG1G,CAAH,CAsNC,CAAkB,MAAlB,EArNsBiG,CAqNtBO,UArNL,CACE,MAAA,CAPW,EAAA,CAAA,IAAA,EAAA,CAXJ,CAyBAtK,CACb,EADaA,CAEX,YAAA,EAHM;AAQV,EAAA,UAAA,YAAA,CAAA,QAAe,EAAG,CAChB,IAAAgc,EAAA,CAAsB,CAAA,CACtB,IAAI,IAAA7K,EAAJ,CAAoB,CAQpBe,EAAA,CAPEiK,IAOF,CAEA,KAHY,IAGHrY,EAAE,CAHC,CAGEqO,CAAd,CAAoBrO,CAApB,CATEqY,IASsBhL,EAAAnN,OAAxB,CAA+CF,CAAA,EAA/C,CAAoD,CAClDqO,CAAA,CAVAgK,IAUOhL,EAAA,CAAerN,CAAf,CA0FT,KAAMsY,Ef1KM9a,Ce0KK,CAAiB6Q,CAAjB,CAAjB,CACIvO,EAAKwY,CAAA9b,cACT8b,EAAA9b,cAAA,CAAyB,EACzB8b,EAAAlc,EAAA,CAA0B,EAE1B,IADAkc,CAAAhc,GACA,CADoCwD,CACpC,CACE,IAASE,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkBF,CAAAI,OAAlB,CAA6BF,CAAA,EAA7B,CAAkC,CAChC,IAAIC,EfjLIzC,CeiLA,CAAiBsC,CAAA,CAAGE,CAAH,CAAjB,CACRC,EAAA5D,EAAA,CAAsB4D,CAAA1D,aAIlB0D,EAAA1D,aAAJ,GAAuB8R,CAAvB,GACEpO,CAAA1D,aADF,CACmB,IADnB,CANgC,CAjGgB,CAKpD,IAAS0D,CAAT,CAdEoY,IAcShN,KAAAvO,WAAX,CAAiCmD,CAAjC,CAAoCA,CAApC,CAAsCA,CAAAtD,YAAtC,CACE4b,EAAA,CAfAF,IAeA,CAA2BpY,CAA3B,CAGF,KAASD,CAAT,CAAW,CAAX,CAAcA,CAAd,CAlBEqY,IAkBgBhL,EAAAnN,OAAlB,CAAyCF,CAAA,EAAzC,CAA8C,CACtCqO,CAAN,CAnBAgK,IAmBahL,EAAA,CAAerN,CAAf,CACPsY,EAAAA,Cf1FI9a,Ce0FO,CAAiB6Q,CAAjB,CAEjB,IAAI,CAACiK,CAAA9b,cAAA0D,OAAL,CACE,IAASD,CAAT,CAAWoO,CAAAvR,WAAX,CAA4BmD,CAA5B,CAA+BA,CAA/B,CAAiCA,CAAAtD,YAAjC,CACE4b,EAAA,CAxBJF,IAwBI,CAA2BpY,CAA3B,CAA8BoO,CAA9B,CAKJ,EADMmK,CACN,EAFMC,CAEN,CfnGUjb,CeiGa,CAAiB6Q,CAAAtR,WAAjB,CAEvB,GADyC0b,CAAAvc,KACzC,GAAsB2S,EAAA,CAAA2J,CAAA,CAAtB,EACEA,CAAA,YAAA,EAEFE;EAAA,CAhCAL,IAgCA,CAAkCC,CAAAlc,EAAlC,CACEkc,CAAA9b,cADF,CAGA,IADImc,CACJ,CADwBL,CAAAhc,GACxB,CAAuB,CACrB,IAAS0D,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkB2Y,CAAAzY,OAAlB,CAA4CF,CAAA,EAA5C,Cf1GQxC,Ce2GN,CAAiBmb,CAAA,CAAkB3Y,CAAlB,CAAjB,CAAA3D,EAAA,CAA2D,IAE7Dic,EAAAhc,GAAA,CAAoC,IAEhCqc,EAAAzY,OAAJ,CAA+BoY,CAAA9b,cAAA0D,OAA/B,GACEoY,CAAAnc,EADF,CACmB,CAAA,CADnB,CANqB,CAcnBmc,CAAAnc,EAAJ,GACEmc,CAAAnc,EACA,CADiB,CAAA,CACjB,CAAAyc,EAAA,CAnDFP,IAmDE,CAAqBhK,CAArB,CAFF,CA/B4C,CAmIxCnB,CAAAA,CApJJ2L,IAoJYxL,EACVyL,EAAAA,CAAc,EAClB,KAAS9Y,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkBkN,CAAAhN,OAAlB,CAAgCF,CAAA,EAAhC,CACQ8M,CAQN,CAReI,CAAA,CAAMlN,CAAN,CAAAjD,WAQf,EADM4Q,CACN,CftOUnQ,CeqOS,CAAiBsP,CAAjB,CACnB,GAAoBa,CAAAzR,KAApB,EACE,EAA8B,CAA9B,CAAA4c,CAAAtK,QAAA,CAAoB1B,CAApB,CAAA,CADF,EAEEgM,CAAAzX,KAAA,CAAiByL,CAAjB,CAGJ,KAAS9M,CAAT,CAAW,CAAX,CAAcA,CAAd,CAAkB8Y,CAAA5Y,OAAlB,CAAsCF,CAAA,EAAtC,CAA2C,CACnC1C,CAAAA,CAAOwb,CAAA,CAAY9Y,CAAZ,CACM+Y,EAAAA,CAAAzb,CAAAyb,GAtKnBF,IAsKmBE,CAtKnBF,IAsKmCxN,KAAhB0N,CAA4Bzb,CAO7C+K,EAAAA,CAAW,EACX3B,EAAAA,CAPmDpJ,CAO9CZ,WACT,KAAK,IAAIsD,EAAI,CAAb,CAAgBA,CAAhB,CAAoB0G,CAAAxG,OAApB,CAA+BF,CAAA,EAA/B,CAAoC,CAClC,IAAI4G,EAAQF,CAAA,CAAG1G,CAAH,CAIZ,IAcyB,MAdzB,EAA2B4G,CAcpBJ,UAdP,CAAmC,CAC7BpK,CAAAA,Cf5PIoB,Ce4Pa,CAAiBoJ,CAAjB,CAAAxK,EACrB,KAAK,IAAIsa,EAAI,CAAb,CAAgBA,CAAhB,CAAoBta,CAAA8D,OAApB,CAA2CwW,CAAA,EAA3C,CAEIrO,CAAAhH,KAAA,CADoBjF,CAAA4c,CAAetC,CAAfsC,CACpB,CAJ6B,CAAnC,IAOE3Q,EAAAhH,KAAA,CAAcuF,CAAd,CAZgC,CA2BjBH,CAAAA,CAAAA,IAAAA,EAHfkI,EAAAA,CAAWjS,EAAA,CAAW8E,CAAX,CACX4V,EAAAA,CMlFC9B,EAAA,CNkF0BjN,CMlF1B,CNkF0BA,CMlFFnI,OAAxB,CNkFoCyO,CMlFpC,CNkFoCA,CMjFnBzO,OADjB,CNoFL;IAJqC,IAIvB+Y,EAALjZ,CAAKiZ,CAAH,CAAX,CAAuBjZ,CAAvB,CAAyBoX,CAAAlX,OAAzB,GAA6CuG,CAA7C,CAA+C2Q,CAAA,CAAQpX,CAAR,CAA/C,EAA4DA,CAAA,EAA5D,CAAiE,CAC/D,IAD+D,IACtD0W,EAAE,CADoD,CACjDzW,CAAd,CAAkByW,CAAlB,CAAsBjQ,CAAA4O,EAAAnV,OAAtB,GAA4CD,CAA5C,CAA8CwG,CAAA4O,EAAA,CAAUqB,CAAV,CAA9C,EAA6DA,CAAA,EAA7D,CAKM3Z,EAAA,CAAWkD,CAAX,CAIJ,GAJsBuB,CAItB,EAHEyC,CAAAA,YAAA2B,KAAA,CAAiBpE,CAAjB,CAA4BvB,CAA5B,CAGF,CAAA0O,CAAAL,OAAA,CAAgB7H,CAAA4D,MAAhB,CAA0B4O,CAA1B,CAA6B,CAA7B,CAEFA,EAAA,EAAKxS,CAAA2O,EAZ0D,CAejE,IAASpV,CAAT,CAAW,CAAX,CAAwBA,CAAxB,CAA0BoX,CAAAlX,OAA1B,GAA8CuG,CAA9C,CAAgD2Q,CAAA,CAAQpX,CAAR,CAAhD,EAA6DA,CAAA,EAA7D,CAEE,IADAkZ,CACSxC,CADF/H,CAAA,CAASlI,CAAA4D,MAAT,CACEqM,CAAAA,CAAAA,CAAEjQ,CAAA4D,MAAX,CAAuBqM,CAAvB,CAA2BjQ,CAAA4D,MAA3B,CAAqC5D,CAAA2O,EAArC,CAAmDsB,CAAA,EAAnD,CACEzW,CAEA,CAFIoI,CAAA,CAASqO,CAAT,CAEJ,CADA3S,CAAAA,aAAA6B,KAAA,CAAkBpE,CAAlB,CAA6BvB,CAA7B,CAAgCiZ,CAAhC,CACA,CAAAvK,CAAAL,OAAA,CAAgBoI,CAAhB,CAAmB,CAAnB,CAAsBzW,CAAtB,CA1DuC,CAtKvB,CAFJ,CAqElBsY,SAAA,GAAqB,CAArBA,CAAqB,CAACjb,CAAD,CAAO6b,CAAP,CAAmB,CACtC,IAAMpa,EfhJM1B,CegJK,CAAuBC,CAAvB,CAAjB,CACI8b,EAAUra,CAAA1C,EACd0C,EAAA1C,EAAA,CAA6B,IAExBgS,EAAL,GAGEA,CAHF,EAEQa,CAFR,CAEe,CAAA5B,EAAA,CADFhQ,CAAA+Q,KACE,EA/KGgL,YA+KH,CAFf,GAGiBnK,CAAA,CAAK,CAAL,CAHjB,CAKIb,EAAJ,EfzJYhR,Ce0JOib,CAAuBjK,CAAvBiK,CACjB9b,cAAA6E,KAAA,CAA4B/D,CAA5B,CACA,CAAAyB,CAAAxC,aAAA,CAAwB8R,CAH1B,EAKEtP,CAAAxC,aALF,CAK0BU,IAAAA,EAEtBmc,EAAJ,GAAgBra,CAAAxC,aAAhB,EACMwC,CAAAxC,aADN,GfhKYc,CekKR,CAAuB0B,CAAAxC,aAAvB,CAAAJ,EAFJ,CAE0D,CAAA,CAF1D,CAjBsC;AAqDxCuc,QAAA,GAA4B,CAA5BA,CAA4B,CAAC9J,CAAD,CAAY0K,CAAZ,CAAsB,CAChD,IADgD,IACvCtZ,EAAE,CADqC,CAClCC,CAAd,CAAkBD,CAAlB,CAAoBsZ,CAAApZ,OAApB,GAAyCD,CAAzC,CAA2CqZ,CAAA,CAAStZ,CAAT,CAA3C,EAAyDA,CAAA,EAAzD,CACE,GAAmB,MAAnB,EAAIC,CAAAuG,UAAJ,CAA2B,CACzB,IAAM+S,EfhME/b,CegMe,CAAiByC,CAAjB,CAAAzD,cACnB+c,EAAJ,EAAsBA,CAAArZ,OAAtB,EACEwY,EAAA,CAAAA,CAAA,CAAkC9J,CAAlC,CAA6C2K,CAA7C,CAHuB,CAA3B,IAME3K,EAAAvN,KAAA,CAAeiY,CAAA,CAAStZ,CAAT,CAAf,CAR4C,CAalD4Y,QAAA,GAAe,CAAfA,CAAe,CAACvK,CAAD,CAAO,CAIpBzJ,CAAAA,cAAAgB,KAAA,CAAmByI,CAAnB,CAAyB,IAAIsD,KAAJ,CAAU,YAAV,CAAzB,CACM2G,EAAAA,Cf/MM9a,Ce+MK,CAAiB6Q,CAAjB,CACbiK,EAAA/b,aAAJ,EACEqc,EAAA,CAAAA,CAAA,CAAqBN,CAAA/b,aAArB,CAPkB,CA2GtB6R,QAAA,GAAc,CAAdA,CAAc,CAAG,CACf,GAAI,CAAAhB,EAAJ,EAA0B,CAAAA,EAAAlN,OAA1B,CAAqD,CAYrD,IAXiBkN,IAAAA,EAAAA,CAAAA,EAAAA,CAUboM,CAVapM,CAWRpN,EAAE,CAAX,CAAcA,CAAd,CAAkBkN,CAAAhN,OAAlB,CAAgCF,CAAA,EAAhC,CAAqC,CACnC,IAAIqO,EAAOnB,CAAA,CAAMlN,CAAN,CEzRN6M,GF+RL,CAAiBwB,CAAjB,CE/RKxB,GFgSL,CAAiBwB,CAAAtR,WAAjB,CACA,KAAIkK,EAAOgI,EAAA,CAAkBZ,CAAlB,CApBXoL,EAqBInM,EAAA,CAAcrG,CAAd,CAAJ,EACEuS,CAEA,CAFkBA,CAElB,EAFqC,EAErC,CADAA,CAAA,CAAgBvS,CAAhB,CACA,CADwB,CAAA,CACxB,CAxBFwS,CAwBEnM,EAAA,CAAcrG,CAAd,CAAA5F,KAAA,CAAyBgN,CAAzB,CAHF,EArBAoL,CA0BEnM,EAAA,CAAcrG,CAAd,CALF,CAKwB,CAACoH,CAAD,CA1BxBoL,EA4BApM,EAAAhM,KAAA,CAAoBgN,CAApB,CAjBmC,CAmBrC,GAAImL,CAAJ,CACE,IAAKvZ,IAAIA,CAAT,GAAcuZ,EAAd,CA/BAC,CAgCEnM,EAAA,CAAcrN,CAAd,CAAA,CAAmBkP,EAAA,CAhCrBsK,CAgCqCnM,EAAA,CAAcrN,CAAd,CAAhB,CA/BrB,EAAAmN,EAAA,CAAqB,EAF8B,CADtC;AAuCjB6B,QAAA,GAAY,CAACZ,CAAD,CAAO,CACjB,IAAMpH,EAAOoH,CAAA,KAAPpH,EAAuBoH,CAAApE,aAAA,CAAkB,MAAlB,CAAvBhD,EA7XYoS,YA+XlB,OADAhL,EAAAW,GACA,CADkB/H,CAFD,CAUnBkI,QAAA,GAAU,CAACjC,CAAD,CAAQ,CAIhB,MAAOA,EAAAwM,KAAA,CAAW,QAAA,CAACC,CAAD,CAAIC,CAAJ,CAAU,CACtBC,CAAAA,CAAQtC,EAAA,CAAaoC,CAAb,CAEZ,KADA,IAAIG,EAAQvC,EAAA,CAAaqC,CAAb,CAAZ,CACS5Z,EAAE,CAAX,CAAcA,CAAd,CAAkB6Z,CAAA3Z,OAAlB,CAAgCF,CAAA,EAAhC,CAAqC,CAC/B+Z,CAAAA,CAAKF,CAAA,CAAM7Z,CAAN,CACT,KAAIga,EAAKF,CAAA,CAAM9Z,CAAN,CACT,IAAI+Z,CAAJ,GAAWC,CAAX,CAEE,MADItT,EACG,CADEjD,KAAAC,KAAA,CAAWqW,CAAAhd,WAAAL,WAAX,CACF,CAAAgK,CAAA8H,QAAA,CAAWuL,CAAX,CAAA,CAAiBrT,CAAA8H,QAAA,CAAWwL,CAAX,CALS,CAHX,CAArB,CAJS,CAwFlBnL,QAAA,GAAkB,CAAlBA,CAAkB,CAAG,CACnBT,EAAA,CAAAA,CAAA,CACA,OAAO,EAAQf,CAAA,CAAAA,EAAR,EAA0BnN,CAAA,CAAAmN,EAAAnN,OAA1B,CAFY,C,CCrevB+Z,QAASA,GAAe,CAAC3c,CAAD,CAAO,CEwS7B,IAAIpB,EFvSoBoB,CEuSbS,YAAA,EZ1RGiB,EY2RV,CAAkB9C,CAAlB,CAAJ,EACEic,EAAA,CAAAjc,CAAA,CFvSF,QADM6C,CACN,ChBoCcvB,CgBrCG,CAAiBF,CAAjB,CACjB,GAAmByB,CAAAxC,aAAnB,EAA4C,IAHf;AAM/B,IAAI2d,GAAc,CAKhB3V,iBIqRcA,EJrRI4V,KAAA,CAAsBzc,MAAtB,CALF,CAOhB8G,oBI6YcA,EJ7YO2V,KAAA,CAAyBzc,MAAzB,CAPL,CAAlB,CAWI0c,GAAY,CAEd7V,iBI6QcA,EJ/QA,CAIdC,oBIqYcA,EJzYA,CAMd,YAAAgB,QAAW,CAAClI,CAAD,CAAO,CAChB,MEfYyG,GFeL,CAAsB,IAAtB,CAA4BzG,CAA5B,CADS,CANJ,CAUd,aAAAyG,QAAY,CAACzG,CAAD,CAAOkP,CAAP,CAAiB,CAC3B,MEnBYzI,GFmBL,CAAsB,IAAtB,CAA4BzG,CAA5B,CAAkCkP,CAAlC,CADoB,CAVf,CAcd,YAAAvI,QAAW,CAAC3G,CAAD,CAAO,CAChB,MEkEY2G,GFlEL,CAAqB,IAArB,CAA2B3G,CAA3B,CADS,CAdJ,CAqBd,aAAA0G,QAAY,CAAC1G,CAAD,CAAOkP,CAAP,CAAiB,CE7BfzI,EF8BZ,CAAsB,IAAtB,CAA4BzG,CAA5B,CAAkCkP,CAAlC,CE2DYvI,GF1DZ,CAAqB,IAArB,CAA2BuI,CAA3B,CACA,OAAOlP,EAHoB,CArBf,CA8Bd,UAAA8G,QAAS,CAAC0L,CAAD,CAAO,CEmRhB,GAAsB,UAAtB,EFlR4BxS,IEkRxBkJ,UAAJ,CACE,IAAA,EAAOuH,CAAA3J,UAAAwB,KAAA,CFnRmBtI,IEmRnB,CFnRyBwS,CEmRzB,CADT,KAIE,IADI7P,CFrR4B6P,CEqRxB/B,CAAA3J,UAAAwB,KAAA,CFrRkBtI,IEqRlB,CAAmC,CAAA,CAAnC,CFrRwBwS,CAAAA,CEsRhC,CAAU,CACJpJ,CAAAA,CFvRoBpJ,IEuRfZ,WACT,KAFQ,IAECsD,EAAE,CAFH,CAEMgQ,CAAd,CAAkBhQ,CAAlB,CAAsB0G,CAAAxG,OAAtB,CAAiCF,CAAA,EAAjC,CACEgQ,CACA,CADKtJ,CAAA,CAAG1G,CAAH,CAAAoE,UAAA,CAAgB,CAAA,CAAhB,CACL;AAAAnE,CAAAuF,YAAA,CAAcwK,CAAd,CAJM,CFtRV,MAAO,EADO,CA9BF,CAqCd,YAAAjS,QAAW,EAAU,CACnB,MEiLYA,GFjLL,CAAqB,IAArB,CADY,CArCP,CAyCd,SAAAwD,QAAQ,CAACjE,CAAD,CAAO,CACb,MV2CYiE,GU3CL,CAAe,IAAf,CAAqBjE,CAArB,CADM,CAzCD,CAgDd,cAAAsH,QAAa,CAACuN,CAAD,CAAQ,CT7DPvQ,ES8DZ,EACA,OAAOgD,EAAAA,cAAAgB,KAAA,CAAmB,IAAnB,CAAyBuM,CAAzB,CAFY,CAhDP,CAyDhBjU;MAAA+N,iBAAA,CAAwBmO,EAAxB,CFiGmCC,CAEjCC,YAAa,CAIX,IAAAhc,QAAG,EAAG,CACJ,GAAIsL,EAAJ,EAAyBA,EAAAhE,KAAA,CAAuB,IAAvB,CAAzB,CACE,MAAO,CAAA,CAET,IAAI,IAAAF,SAAJ,EAAqB1H,IAAAuK,uBAArB,CACE,MAAO,CAAA,CAGT,KAAMwH,EAAgB,IAAAA,cACtB,IRtFOzO,EQsFP,CACE,IAAIgK,CAAAA,SAAA1F,KAAA,CAAoBmK,CAApB,CAAmC,IAAnC,CAAJ,CACE,MAAO,CAAA,CADT,CADF,IAIO,IAAIA,CAAAT,gBAAJ,EACLhE,CAAAA,SAAA1F,KAAA,CAAoBmK,CAAAT,gBAApB,CAAmD,IAAnD,CADK,CAEL,MAAO,CAAA,CAIT,KADIhS,CACJ,CADW,IACX,CAAOA,CAAP,EAAe,EAAEA,CAAF,WAAkBgH,SAAlB,CAAf,CAAA,CACEhH,CAAA,CAAOA,CAAAP,WAAP,GRvLQiC,CQuLmB,CAAkB1B,CAAlB,CAAA,CAAoDA,CAAD+N,KAAnD,CAAiEpO,IAAAA,EAA5F,CAEF,OAAO,CAAC,EAAEK,CAAF,EAAUA,CAAV,WAA0BgH,SAA1B,CAtBJ,CAJK,CA4BXjG,aAAc,CAAA,CA5BH,CAFoBgc,CEjGnC,CAGA;IAAIE,GAAY,CAIVhe,gBAAe,EAAA,CACjB,MAAO0d,GAAA,CAAgB,IAAhB,CADU,CAJL,CAAhB,CASIO,GAAgB,CAMlB,cAAAxV,QAAa,CAACS,CAAD,CAAW,CAOtB,MEwKY8J,GF7KC,CAAe,IAAf,CAAqB,QAAQ,CAACtP,CAAD,CAAI,CAC5C,MVhEGZ,GAAAuG,KAAA,CUgE0B3F,CVhE1B,CUgE6BwF,CVhE7B,CU+DyC,CAAjC,CAEV,QAAQ,CAACxF,CAAD,CAAI,CACb,MAAO,CAAA,CAAQA,CADF,CAFF,CAAA2P,CAIV,CAJUA,CAKb,EAAiB,IAPK,CANN,CAsBlB,iBAAAvK,QAAgB,CAACI,CAAD,CAAWgV,CAAX,CAAsB,CACpC,GAAIA,CAAJ,CAAe,CACPC,CAAAA,CAAIjX,KAAA3F,UAAAqL,MAAAvD,KAAA,CAA2BP,CAAAA,iBAAA,CAAiB,IAAjB,CAAuBI,CAAvB,CAA3B,CACV,KAAMvJ,EAAO,IAAA6B,YAAA,EACb,OAAO2c,EAAA/W,OAAA,CAAS,QAAA,CAAA3C,CAAA,CAAK,CAAA,MAAAA,EAAAjD,YAAA,EAAA,EAAmB7B,CAAnB,CAAd,CAHM,CAKf,MEyJYqT,GFzJL,CAAe,IAAf,CAAqB,QAAQ,CAACtP,CAAD,CAAI,CACtC,MVpFGZ,GAAAuG,KAAA,CUoF0B3F,CVpF1B,CUoF6BwF,CVpF7B,CUmFmC,CAAjC,CAN6B,CAtBpB,CATpB,CA4CIkV,GAAY,CAKd,cAAAne,QAAa,CAAC0V,CAAD,CAAU,CACrB,GAAuB,MAAvB,GAAI,IAAA1L,UAAJ,CAA+B,CEyKjC,IAAItK,EFxKwBmQ,IEwKjBtO,YAAA,EZ1RGiB,EY2RV,CAAkB9C,CAAlB,CAAJ,EACEic,EAAA,CAAAjc,CAAA,CFxKE,OAAO,CADD6C,CACC,ChB3FGvB,CgB0FO,CAAiB,IAAjB,CACV,GACH0U,CAAA,EAAWA,CAAA0I,QAAX;AAA6B7b,CAAA3C,EAA7B,CACA2C,CAAAvC,cAFG,GAEwB,EAFxB,CAGL,EAN2B,CADV,CALT,CA5ChB,CA8DIqe,GVxFYxa,EUwFG,CAAgB,CAKjC,aAAA6D,QAAY,CAAC+C,CAAD,CAAOpD,CAAP,CAAc,CEgKZK,EF/JZ,CAAsB,IAAtB,CAA4B+C,CAA5B,CAAkCpD,CAAlC,CADwB,CALO,CAYjC,gBAAAM,QAAe,CAAC8C,CAAD,CAAO,CEsKtB8G,CAAA5J,gBAAAyB,KAAA,CFrK2BtI,IEqK3B,CFrKiC2J,CEqKjC,CACA6H,GAAA,CFtK2BxR,IEsK3B,CFtKiC2J,CEsKjC,CFvKsB,CAZW,CAmBjC,aAAArJ,QAAY,CAACsU,CAAD,CAAU,CDkVtB,GAAI,CCjVkB7G,IDiVtB,CACE,KAAM,sBAAN,CAEF,GAAI,CCpVwB6G,CDoV5B,CACE,KAAM,uBAAN,CCrVA,MDuVK,KAAInG,EAAJ,CAAcuL,EAAd,CCvVejM,IDuVf,CCvVqB6G,CDuVrB,CCxVe,CAnBW,CA0B7B7D,QAAO,EAAA,CACT,MAAO,KAAApE,aAAA,CAAkB,MAAlB,CADE,CA1BsB,CAiC7BoE,QAAK,CAAAxK,CAAA,CAAO,CEoIFK,EFnIZ,CAAsB,IAAtB,CAA4B,MAA5B,CAAoCL,CAApC,CADc,CAjCiB,CAwC7BtH,gBAAe,EAAA,CACjB,MAAO0d,GAAA,CAAgB,IAAhB,CADU,CAxCc,CAAhB,CA4ChBO,EA5CgB,CA4CDG,EA5CC,CA8CnBzc,OAAA+N,iBAAA,CAAwB4O,EAAxB,CFyOW7P,EEzOX,CAEA;IAAI8P,GVxIYza,EUwII,CAAgB,CAIlC,WAAAgE,QAAU,CAAC/G,CAAD,CAAOwS,CAAP,CAAa,CACrB,MEsJYzL,GFtJL,CAAoB/G,CAApB,CAA0BwS,CAA1B,CADc,CAJW,CAWlC,eAAAhL,QAAc,CAACiW,CAAD,CAAK,CAMjB,ME+DYxL,GFpEC,CAAe,IAAf,CAAqB,QAAQ,CAACtP,CAAD,CAAI,CAC5C,MAAOA,EAAA8a,GAAP,EAAeA,CAD6B,CAAjC,CAEV,QAAQ,CAAC9a,CAAD,CAAI,CACb,MAAO,CAAA,CAAQA,CADF,CAFF,CAAA2P,CAIV,CAJUA,CAKb,EAAiB,IANA,CAXe,CAAhB,CAoBjB4K,EApBiB,CAsBpBtc,OAAA+N,iBAAA,CAAwB6O,EAAxB,CAAuC,CACrC,eFiOS5P,EEjOSC,cADmB,CAAvC,CAIA;IAAI6P,GAAanW,WAAA/G,UAAAmd,KAAjB,CAEIC,GVpKY7a,EUoKO,CAAgB,CAIrC,KAAA4a,QAAI,EAAG,CACL,IAAMlc,EhBrLMvB,CgBqLK,CAAiB,IAAjB,CAGjB,EADI2d,CACJ,EAFIjf,CAEJ,CAFW6C,CAEX,EAFuBA,CAAA7C,KAEvB,GAD2BA,CAAAiP,cAC3B,EACEgQ,CAAAF,KAAA,EADF,CAGED,EAAApV,KAAA,CAAgB,IAAhB,CAPG,CAJ8B,CAAhB,CAFvB,CAkBMwV,GAAkB,CACtB,iBAAA7W,QAAgB,CAAC6M,CAAD,CAAOsB,CAAP,CAAWgB,CAAX,CAA6B,CACX,QAAhC,GAAI,MAAOA,EAAX,GACEA,CADF,CACqB,CACjBV,QAAS,CAAA,CAAQU,CADA,CADrB,CAKAA,EAAAG,EAAA,CAAiC,IACjC,KAAAxI,KAAA9G,iBAAA,CAA2B6M,CAA3B,CAAiCsB,CAAjC,CAAqCgB,CAArC,CAP2C,CADvB,CAWtB,oBAAAlP,QAAmB,CAAC4M,CAAD,CAAOsB,CAAP,CAAWgB,CAAX,CAA6B,CACd,QAAhC,GAAI,MAAOA,EAAX,GACEA,CADF,CACqB,CACjBV,QAAS,CAAA,CAAQU,CADA,CADrB,CAKAA,EAAAG,EAAA,CAAiC,IACjC,KAAAxI,KAAA7G,oBAAA,CAA8B4M,CAA9B,CAAoCsB,CAApC,CAAwCgB,CAAxC,CAP8C,CAX1B,CAqBtB,eAAA5O,QAAc,CAACiW,CAAD,CAAK,CAMjB,MESYxL,GFdC,CAAe,IAAf,CAAqB,QAAQ,CAACtP,CAAD,CAAI,CAC5C,MAAOA,EAAA8a,GAAP,EAAeA,CAD6B,CAAjC,CAEV,QAAQ,CAAC9a,CAAD,CAAI,CACb,MAAO,CAAA,CAAQA,CADF,CAFF,CAAA2P,CAIV,CAJUA,CAKb,EAAiB,IANA,CArBG,CA+BxByL;QAASA,EAAY,CAACvS,CAAD,CAAQ7J,CAAR,CAAa,CAEhC,IADA,IAAIa,EAAK5B,MAAA6B,oBAAA,CAA2Bd,CAA3B,CAAT,CACSe,EAAE,CAAX,CAAcA,CAAd,CAAkBF,CAAAI,OAAlB,CAA6BF,CAAA,EAA7B,CAAkC,CAChC,IAAIC,EAAIH,CAAA,CAAGE,CAAH,CAAR,CACIiZ,EAAI/a,MAAAC,yBAAA,CAAgCc,CAAhC,CAAqCgB,CAArC,CAIJgZ,EAAApV,MAAJ,CACEiF,CAAA,CAAM7I,CAAN,CADF,CACagZ,CAAApV,MADb,CAGE3F,MAAAkC,eAAA,CAAsB0I,CAAtB,CAA6B7I,CAA7B,CAAgCgZ,CAAhC,CAT8B,CAFF,C,CM3PlC,GhBnBWxb,CgBmBPc,GAAJ,CAA0B,CACxB,IAAI+c,SAAW,CAEb,MhBtBO7d,CgBsBEc,GAFI,CAUb,MAASgd,QAAA,CAACje,CAAD,CAAU,CRsgBZgP,EQrgBL,CAA4BhP,CAA5B,CR0fK8O,GQzfL,CAA6B9O,CAA7B,CACA,OAAOA,EAHU,CAVN,CAeb,YhBbY0B,CgBFC,CAgBb,QfhCY2C,EegBC,CAiBb,MfzBYC,EeQC,CAkBb,ShBtCOnE,CgBoBM,CAmBb,gBdwCY0F,Ec3DC,CAoBb,gBdYOV,EchCM,CAqBb,kBd4BOM,EcjDM,CAsBb,cAAiBgL,CAtBJ,CAuBb,WTxCS3E,CSiBI,CA0Bf1L,OAAA,SAAA,CAAqB4d,QF2brB5d,OAAAiU,MAAA,CAAemD,EACfpX,OAAAsX,YAAA,CAAqBD,EACrBrX,OAAAwX,WAAA,CAAoBD,EACpBR,GAAA,EJtMA,KAAI+G,GACD9d,MAAA,eADC8d,EAC2B9d,MAAA,eAAA,kBAD3B8d,EAEF3W,WAEFwW,EAAA,CD1QWtP,EC0QEjO,UAAb,CAAkCsd,EAAlC,CACAC,EAAA,CAAa3d,MAAAM,KAAAF,UAAb,CAAoCsc,EAApC,CACAiB,EAAA,CAAa3d,MAAAgH,OAAA5G,UAAb,CAAsCoc,EAAtC,CACAmB,EAAA,CAAa3d,MAAA+d,KAAA3d,UAAb,CAAoCyc,EAApC,CACAc,EAAA,CAAa3d,MAAAwH,iBAAApH,UAAb;AAAgD0c,EAAhD,CACAa,EAAA,CAAa3d,MAAAG,QAAAC,UAAb,CAAuC+c,EAAvC,CACAQ,EAAA,CAAa3d,MAAA4G,SAAAxG,UAAb,CAAwCgd,EAAxC,CACIpd,OAAAge,gBAAJ,EACEL,CAAA,CAAa3d,MAAAge,gBAAA5d,UAAb,CAA+C6c,EAA/C,CAEFU,EAAA,CAAaG,EAAA1d,UAAb,CAA0Cod,EAA1C,CVpTSzd,EU0TLW,EAAJ,GFuKcyN,CEtKZ,CAAenO,MAAAM,KAAAF,UAAf,CAMA,CFgKY+N,CErKZ,CAAenO,MAAA+d,KAAA3d,UAAf,CAKA,CFgKY+N,CEpKZ,CAAenO,MAAAwH,iBAAApH,UAAf,CAIA,CFgKY+N,CEnKZ,CAAenO,MAAAG,QAAAC,UAAf,CAGA,CFgKY+N,CElKZ,CAAe2P,EAAA1d,UAAf,CAEA,CFgKY+N,CEjKZ,CAAenO,MAAA4G,SAAAxG,UAAf,CACA,CAAIJ,MAAAge,gBAAJ,EFgKY7P,CE/JV,CAAenO,MAAAge,gBAAA5d,UAAf,CARJ,CF8KcgO,GEnKd,EMhRApO,OAAAie,WAAA,CPrBW5P,EOba,C,CC9B1B,IAAM6P,GAAkB,IAAIzZ,GAAJ,CAAQ,kHAAA,MAAA,CAAA,GAAA,CAAR,CAejB0Z,SAASA,GAAwB,CAACrV,CAAD,CAAY,CAClD,IAAMsV,EAAWF,EAAAG,IAAA,CAAoBvV,CAApB,CACXwV,EAAAA,CAAY,kCAAAC,KAAA,CAAwCzV,CAAxC,CAClB,OAAO,CAACsV,CAAR,EAAoBE,CAH8B,CAW7C1B,QAASA,EAAW,CAAChd,CAAD,CAAO,CAEhC,IAAM4e,EAAc5e,CAAAgd,YACpB,IAAoBrd,IAAAA,EAApB,GAAIif,CAAJ,CACE,MAAOA,EAKT,KAAA,CAAO1L,CAAP,EAAkB,EAAEA,CAAA2L,sBAAF,EAAmC3L,CAAnC,WAAsDlM,SAAtD,CAAlB,CAAA,CACEkM,CAAA,CAAUA,CAAAzT,WAAV,GAAiCW,MAAAie,WAAA,EAAqBnL,CAArB,WAAwCmL,WAAxC,CAAqDnL,CAAAnF,KAArD,CAAoEpO,IAAAA,EAArG,CAEF,OAAO,EAAGuT,CAAAA,CAAH,EAAe,EAAAA,CAAA2L,sBAAA,EAAiC3L,CAAjC,WAAoDlM,SAApD,CAAf,CAZyB;AAoBlC8X,QAASA,GAA4B,CAAClgB,CAAD,CAAOmgB,CAAP,CAAc,CAEjD,IAAA,CAAO/e,CAAP,EAAeA,CAAf,GAAwBpB,CAAxB,EAAgC,CAACoB,CAAAX,YAAjC,CAAA,CACEW,CAAA,CAAOA,CAAAP,WAET,OAASO,EAAF,EAAUA,CAAV,GAAmBpB,CAAnB,CAAkCoB,CAAAX,YAAlC,CAA2B,IALe;AAsB5C2f,QAASA,EAA0B,CAACpgB,CAAD,CAAOkF,CAAP,CAAiBmb,CAAjB,CAA6C,CAA5BA,CAAA,CAAA,IAAA,EAAA,GAAAA,CAAA,CAAiB,IAAIpa,GAArB,CAAAoa,CAEzD,KADA,IAAIjf,EAAOpB,CACX,CAAOoB,CAAP,CAAA,CAAa,CACX,GAAIA,CAAAoI,SAAJ,GAAsB1H,IAAA2H,aAAtB,CAAyC,CACvC,IAAM0G,EAAkC/O,CAExC8D,EAAA,CAASiL,CAAT,CAEA,KAAM7F,EAAY6F,CAAA7F,UAClB,IAAkB,MAAlB,GAAIA,CAAJ,EAA4D,QAA5D,GAA4B6F,CAAApC,aAAA,CAAqB,KAArB,CAA5B,CAAsE,CAG9D5F,CAAAA,CAAmCgI,CAAAmQ,OACzC,IAAInY,CAAJ,WAA0BrG,KAA1B,EAAkC,CAACue,CAAAR,IAAA,CAAmB1X,CAAnB,CAAnC,CAIE,IAFAkY,CAAA5Z,IAAA,CAAmB0B,CAAnB,CAESuC,CAAAA,CAAAA,CAAQvC,CAAAvH,WAAjB,CAAwC8J,CAAxC,CAA+CA,CAA/C,CAAuDA,CAAAjK,YAAvD,CACE2f,CAAA,CAA2B1V,CAA3B,CAAkCxF,CAAlC,CAA4Cmb,CAA5C,CAOJjf,EAAA,CAAO8e,EAAA,CAA6BlgB,CAA7B,CAAmCmQ,CAAnC,CACP,SAjBoE,CAAtE,IAkBO,IAAkB,UAAlB,GAAI7F,CAAJ,CAA8B,CAKnClJ,CAAA,CAAO8e,EAAA,CAA6BlgB,CAA7B,CAAmCmQ,CAAnC,CACP,SANmC,CAWrC,GADMpB,CACN,CADmBoB,CAAAoQ,gBACnB,CACE,IAAS7V,CAAT,CAAiBqE,CAAAnO,WAAjB,CAAwC8J,CAAxC,CAA+CA,CAA/C,CAAuDA,CAAAjK,YAAvD,CACE2f,CAAA,CAA2B1V,CAA3B,CAAkCxF,CAAlC,CAA4Cmb,CAA5C,CArCmC,CA0CzCjf,CAAA,CAAsBA,CArDjBR,WAAA,CAqDiBQ,CArDER,WAAnB,CAAsCsf,EAAA,CAqD3BlgB,CArD2B,CAqDrBoB,CArDqB,CAUhC,CAFwE,CA0DhFof,QAASA,EAAoB,CAACC,CAAD,CAAc1V,CAAd,CAAoBpD,CAApB,CAA2B,CAC7D8Y,CAAA,CAAY1V,CAAZ,CAAA,CAAoBpD,CADyC,C,CC1H7D9H,QADmB6gB,GACR,EAAG,CAEZ,IAAAC,EAAA,CAA8B,IAAIC,GAGlC,KAAAC,EAAA,CAAgC,IAAID,GAGpC,KAAAE,EAAA,CAAgB,EAGhB,KAAAC,EAAA,CAAmB,CAAA,CAXP,CAkBdC,QAAA,GAAa,CAAbA,CAAa,CAAC1W,CAAD,CAAY2W,CAAZ,CAAwB,CACnC,CAAAN,EAAAzW,IAAA,CAAgCI,CAAhC,CAA2C2W,CAA3C,CACA,EAAAJ,EAAA3W,IAAA,CAAkC+W,CAAAphB,YAAlC,CAA0DohB,CAA1D,CAFmC,CAwBrCC,QAAA,GAAQ,CAARA,CAAQ,CAACC,CAAD,CAAW,CACjB,CAAAJ,EAAA,CAAmB,CAAA,CACnB,EAAAD,EAAA3b,KAAA,CAAmBgc,CAAnB,CAFiB,CAQnBC,QAAA,GAAS,CAATA,CAAS,CAAChgB,CAAD,CAAO,CACT,CAAA2f,EAAL,EDaYX,CCXZ,CAAqChf,CAArC,CAA2C,QAAA,CAAA+O,CAAA,CAAW,CAAA,MAHxC,EAGwCkP,EAAA,CAAWlP,CAAX,CAAA,CAAtD,CAHc,CAShB,EAAA,UAAA,EAAA,CAAAkP,QAAK,CAACje,CAAD,CAAO,CACV,GAAK,IAAA2f,EAAL,EAEIM,CAAAjgB,CAAAigB,aAFJ,CAEA,CACAjgB,CAAAigB,aAAA,CAAoB,CAAA,CAEpB,KAAK,IAAIvd,EAAI,CAAb,CAAgBA,CAAhB,CAAoB,IAAAgd,EAAA9c,OAApB,CAA0CF,CAAA,EAA1C,CACE,IAAAgd,EAAA,CAAchd,CAAd,CAAA,CAAiB1C,CAAjB,CAJF,CAHU,CAcZkgB,SAAA,EAAW,CAAXA,CAAW,CAACthB,CAAD,CAAO,CAChB,IAAMyT,EAAW,EDVL2M,ECYZ,CAAqCpgB,CAArC,CAA2C,QAAA,CAAAmQ,CAAA,CAAW,CAAA,MAAAsD,EAAAtO,KAAA,CAAcgL,CAAd,CAAA,CAAtD,CAEA,KAASrM,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB2P,CAAAzP,OAApB,CAAqCF,CAAA,EAArC,CAA0C,CACxC,IAAMqM,EAAUsD,CAAA,CAAS3P,CAAT,CC/EZyd,EDgFJ,GAAIpR,CAAAqR,WAAJ,CACE,CAAAC,kBAAA,CAAuBtR,CAAvB,CADF,CAGEuR,EAAA,CAAAA,CAAA,CAAoBvR,CAApB,CALsC,CAL1B;AAkBlBwR,QAAA,EAAc,CAAdA,CAAc,CAAC3hB,CAAD,CAAO,CACnB,IAAMyT,EAAW,ED5BL2M,EC8BZ,CAAqCpgB,CAArC,CAA2C,QAAA,CAAAmQ,CAAA,CAAW,CAAA,MAAAsD,EAAAtO,KAAA,CAAcgL,CAAd,CAAA,CAAtD,CAEA,KAASrM,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB2P,CAAAzP,OAApB,CAAqCF,CAAA,EAArC,CAA0C,CACxC,IAAMqM,EAAUsD,CAAA,CAAS3P,CAAT,CCjGZyd,EDkGJ,GAAIpR,CAAAqR,WAAJ,EACE,CAAAI,qBAAA,CAA0BzR,CAA1B,CAHsC,CALvB;AA+ErB0R,QAAA,EAAmB,CAAnBA,CAAmB,CAAC7hB,CAAD,CAAOgW,CAAP,CAAqB,CAAdA,CAAA,CAAA,IAAA,EAAA,GAAAA,CAAA,CAAU,EAAV,CAAAA,CACxB,KAAMqK,EAAiBrK,CAAAqK,GAAjBA,EAA2C,IAAIpa,GAArD,CACM6b,EAAU9L,CAAA8L,EAAVA,EAA8B,QAAA,CAAA3R,CAAA,CAAW,CAAA,MAAAuR,GAAA,CAFTA,CAES,CAAoBvR,CAApB,CAAA,CAD/C,CAGMsD,EAAW,ED9GL2M,ECyJZ,CAAqCpgB,CAArC,CAzCuB+hB,QAAA,CAAA5R,CAAA,CAAW,CAChC,GAA0B,MAA1B,GAAIA,CAAA7F,UAAJ,EAAoE,QAApE,GAAoC6F,CAAApC,aAAA,CAAqB,KAArB,CAApC,CAA8E,CAG5E,IAAM5F,EAAmCgI,CAAAmQ,OAErCnY,EAAJ,WAA0BrG,KAA1B,GACEqG,CAAA8X,sBAEA,CAFmC,CAAA,CAEnC,CAAA9X,CAAA6Z,iBAAA,CAA8B,CAAA,CAHhC,CAMI7Z,EAAJ,EAA4C,UAA5C,GAAkBA,CAAA8Z,WAAlB,CACE9Z,CAAA+Z,yBADF,CACwC,CAAA,CADxC,CAKE/R,CAAA9H,iBAAA,CAAyB,MAAzB,CAAiC,QAAA,EAAM,CACrC,IAAMF,EAAmCgI,CAAAmQ,OAEzC,IAAI4B,CAAA/Z,CAAA+Z,yBAAJ,CAAA,CACA/Z,CAAA+Z,yBAAA,CAAsC,CAAA,CAOtC,KAAMC,EAAuB,IAAIlc,GAAJ,CAAQoa,CAAR,CAC7B8B,EAAApb,OAAA,CAA4BoB,CAA5B,CAEA0Z,EAAA,CArC8BA,CAqC9B,CAAyB1Z,CAAzB,CAAqC,CAACkY,GAAgB8B,CAAjB,CAAuCL,EAAAA,CAAvC,CAArC,CAXA,CAHqC,CAAvC,CAhB0E,CAA9E,IAkCErO,EAAAtO,KAAA,CAAcgL,CAAd,CAnC8B,CAyClC,CAA2DkQ,CAA3D,CAEA,IAAI,CAAAU,EAAJ,CACE,IAASjd,CAAT;AAAa,CAAb,CAAgBA,CAAhB,CAAoB2P,CAAAzP,OAApB,CAAqCF,CAAA,EAArC,CACE,CAAAub,EAAA,CAAW5L,CAAA,CAAS3P,CAAT,CAAX,CAIJ,KAASA,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB2P,CAAAzP,OAApB,CAAqCF,CAAA,EAArC,CACEge,CAAA,CAAQrO,CAAA,CAAS3P,CAAT,CAAR,CAxDoC;AA+DxC4d,QAAA,GAAc,CAAdA,CAAc,CAACvR,CAAD,CAAU,CAEtB,GAAqBpP,IAAAA,EAArB,GADqBoP,CAAAqR,WACrB,CAAA,CAYA,IAAM3N,EAAgB1D,CAAA0D,cACtB,IACGA,CAAAuO,YADH,EAEIvO,CAAAoM,sBAFJ,EAE2CpM,CAAAmO,iBAF3C,CAMA,GADMf,CACN,CADmBoB,CAjOZ1B,EAAAve,IAAA,CAiOuC+N,CAAA7F,UAjOvC,CAkOP,CAAA,CAEA2W,CAAAqB,kBAAAnd,KAAA,CAAkCgL,CAAlC,CAEA,KAAMtQ,EAAcohB,CAAAphB,YACpB,IAAI,CACF,GAAI,CAEF,GADa6T,IAAK7T,CAClB,GAAesQ,CAAf,CACE,KAAU7E,MAAJ,CAAU,4EAAV,CAAN,CAHA,CAAJ,OAKU,CACR2V,CAAAqB,kBAAAC,IAAA,EADQ,CANR,CASF,MAAOzd,CAAP,CAAU,CAEV,KADAqL,EAAAqR,WACM1c,CC7QF0d,CD6QE1d,CAAAA,CAAN,CAFU,CAKZqL,CAAAqR,WAAA,CCjRMD,CDkRNpR,EAAAsS,gBAAA,CAA0BxB,CAE1B,IAAIA,CAAAyB,yBAAJ,CAEE,IADMC,CACG7e,CADkBmd,CAAA0B,mBAClB7e,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CAAoB6e,CAAA3e,OAApB,CAA+CF,CAAA,EAA/C,CAAoD,CAClD,IAAMiH,EAAO4X,CAAA,CAAmB7e,CAAnB,CAAb;AACM6D,EAAQwI,CAAApC,aAAA,CAAqBhD,CAArB,CACA,KAAd,GAAIpD,CAAJ,EACE,CAAA+a,yBAAA,CAA8BvS,CAA9B,CAAuCpF,CAAvC,CAA6C,IAA7C,CAAmDpD,CAAnD,CAA0D,IAA1D,CAJgD,CDhQ1CyW,CCyQR,CAAsBjO,CAAtB,CAAJ,EACE,CAAAsR,kBAAA,CAAuBtR,CAAvB,CAlCF,CAnBA,CAFsB,CA8DxB,EAAA,UAAA,kBAAA,CAAAsR,QAAiB,CAACtR,CAAD,CAAU,CACzB,IAAM8Q,EAAa9Q,CAAAsS,gBACfxB,EAAAQ,kBAAJ,EACER,CAAAQ,kBAAA/X,KAAA,CAAkCyG,CAAlC,CAHuB,CAU3B,GAAA,UAAA,qBAAA,CAAAyR,QAAoB,CAACzR,CAAD,CAAU,CAC5B,IAAM8Q,EAAa9Q,CAAAsS,gBACfxB,EAAAW,qBAAJ,EACEX,CAAAW,qBAAAlY,KAAA,CAAqCyG,CAArC,CAH0B,CAc9B;EAAA,UAAA,yBAAA,CAAAuS,QAAwB,CAACvS,CAAD,CAAUpF,CAAV,CAAgB6X,CAAhB,CAA0BC,CAA1B,CAAoCC,CAApC,CAA+C,CACrE,IAAM7B,EAAa9Q,CAAAsS,gBAEjBxB,EAAAyB,yBADF,EAEiD,EAFjD,CAEEzB,CAAA0B,mBAAArQ,QAAA,CAAsCvH,CAAtC,CAFF,EAIEkW,CAAAyB,yBAAAhZ,KAAA,CAAyCyG,CAAzC,CAAkDpF,CAAlD,CAAwD6X,CAAxD,CAAkEC,CAAlE,CAA4EC,CAA5E,CANmE,C,CEhUvEjjB,QADmBkjB,GACR,CAACC,CAAD,CAAiB,CAALC,IAAAA,ECoD4D1e,QDhDjF,KAAA2e,EAAA,CAAkBF,CAKlB,KAAAG,EAAA,CAAiBF,CAKjB,KAAAtc,EAAA,CAAiB5F,IAAAA,EAKjB8gB,EAAA,CAAA,IAAAqB,EAAA,CAAoC,IAAAC,EAApC,CAEkC,UAAlC,GAAI,IAAAA,EAAAlB,WAAJ,GACE,IAAAtb,EAMA,CANiB,IAAI/B,gBAAJ,CAAqB,IAAAwe,EAAAnF,KAAA,CAA2B,IAA3B,CAArB,CAMjB,CAAA,IAAAtX,EAAAhC,QAAA,CAAuB,IAAAwe,EAAvB,CAAuC,CACrCE,UAAW,CAAA,CAD0B,CAErCC,QAAS,CAAA,CAF4B,CAAvC,CAPF,CArB0B,CAmC5BC,QAAA,GAAU,CAAVA,CAAU,CAAG,CACP,CAAA5c,EAAJ,EACE,CAAAA,EAAA4c,WAAA,EAFS,CASb,EAAA,UAAA,EAAA,CAAAH,QAAgB,CAACjd,CAAD,CAAY,CAI1B,IAAM8b,EAAa,IAAAkB,EAAAlB,WACA,cAAnB,GAAIA,CAAJ,EAAmD,UAAnD,GAAoCA,CAApC,EACEsB,EAAA,CAAAA,IAAA,CAGF,KAASzf,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBqC,CAAAnC,OAApB,CAAsCF,CAAA,EAAtC,CAEE,IADA,IAAMgC,EAAaK,CAAA,CAAUrC,CAAV,CAAAgC,WAAnB,CACS0U,EAAI,CAAb,CAAgBA,CAAhB,CAAoB1U,CAAA9B,OAApB,CAAuCwW,CAAA,EAAvC,CAEEqH,CAAA,CAAA,IAAAqB,EAAA,CADapd,CAAA1E,CAAWoZ,CAAXpZ,CACb,CAbsB,C,CE3C5BvB,QADmB2jB,GACR,EAAG,CAAA,IAAA,EAAA,IAWZ,KAAAC,EAAA,CANA,IAAAC,EAMA,CANc3iB,IAAAA,EAYd,KAAA4iB,EAAA,CAAgB,IAAIC,OAAJ,CAAY,QAAA,CAAAC,CAAA,CAAW,CACrC,CAAAJ,EAAA,CAAgBI,CAEZ,EAAAH,EAAJ,EACEG,CAAA,CAAQ,CAAAH,EAAR,CAJmC,CAAvB,CAjBJ,CA6BdG,QAAA,GAAO,CAAPA,CAAO,CAAQ,CACb,GAAI,CAAAH,EAAJ,CACE,KAAUpY,MAAJ,CAAU,mBAAV,CAAN,CAGF,CAAAoY,EAAA,CDoKqB3iB,IAAAA,EClKjB,EAAA0iB,EAAJ,EACE,CAAAA,EAAA,CDiKmB1iB,IAAAA,ECjKnB,CARW,C,CDpBflB,QALmBikB,EAKR,CAACd,CAAD,CAAY,CAKrB,IAAAe,EAAA,CAAmC,CAAA,CAMnC,KAAAb,EAAA,CAAkBF,CAMlB,KAAAgB,GAAA,CAA4B,IAAIpD,GAOhC,KAAAqD,EAAA,CAAsBC,QAAA,CAAA1N,CAAA,CAAM,CAAA,MAAAA,EAAA,EAAA,CAM5B,KAAA2N,EAAA,CAAqB,CAAA,CAMrB,KAAAC,EAAA,CAA2B,EAM3B,KAAAC,GAAA,CAAqC,IDrD1BtB,ECqD0B,CAAiCC,CAAjC,CA1ChB,CAiDvB,CAAA,CA9DF,CAAAsB,UA8DEC;CAAAC,OAAA,CAAAA,QAAM,CAACla,CAAD,CAAYzK,CAAZ,CAAyB,CAAA,IAAA,EAAA,IAC7B,IAAI,EAAEA,CAAF,WAAyB4kB,SAAzB,CAAJ,CACE,KAAM,KAAIhJ,SAAJ,CAAc,gDAAd,CAAN,CAGF,GAAI,CJpDQkE,EIoDP,CAAmCrV,CAAnC,CAAL,CACE,KAAM,KAAIoa,WAAJ,CAAgB,oBAAhB,CAAqCpa,CAArC,CAA8C,iBAA9C,CAAN,CAGF,GAAI,IAAA4Y,EHvCGvC,EAAAve,IAAA,CGuCmCkI,CHvCnC,CGuCP,CACE,KAAUgB,MAAJ,CAAU,8BAAV,CAAyChB,CAAzC,CAAkD,6BAAlD,CAAN,CAGF,GAAI,IAAAyZ,EAAJ,CACE,KAAUzY,MAAJ,CAAU,4CAAV,CAAN,CAEF,IAAAyY,EAAA,CAAmC,CAAA,CAOnC,IAAI,CAOFY,IAASA,EAATA,QAAoB,CAAC5Z,CAAD,CAAO,CACzB,IAAM6Z,EAAgBhjB,CAAA,CAAUmJ,CAAV,CACtB,IAAsBhK,IAAAA,EAAtB,GAAI6jB,CAAJ,EAAmC,EAAEA,CAAF,WAA2BH,SAA3B,CAAnC,CACE,KAAUnZ,MAAJ,CAAU,OAAV,CAAkBP,CAAlB,CAAsB,gCAAtB,CAAN;AAEF,MAAO6Z,EALkB,CAA3BD,CALM/iB,EAAY/B,CAAA+B,UAClB,IAAI,EAAEA,CAAF,WAAuBI,OAAvB,CAAJ,CACE,KAAM,KAAIyZ,SAAJ,CAAc,8DAAd,CAAN,CAWF,IAAAgG,EAAoBkD,CAAA,CAAY,mBAAZ,CACpB,KAAA/C,EAAuB+C,CAAA,CAAY,sBAAZ,CACvB,KAAAE,EAAkBF,CAAA,CAAY,iBAAZ,CAClB,KAAAjC,EAA2BiC,CAAA,CAAY,0BAAZ,CAC3B,KAAAhC,EAAqB9iB,CAAA,mBAArB8iB,EAA0D,EAnBxD,CAoBF,MAAO7d,CAAP,CAAU,CACV,MADU,CApBZ,OAsBU,CACR,IAAAif,EAAA,CAAmC,CAAA,CAD3B,CAIJ9C,CAAAA,CAAa,CACjB3W,UAAAA,CADiB,CAEjBzK,YAAAA,CAFiB,CAGjB4hB,kBAAAA,CAHiB,CAIjBG,qBAAAA,CAJiB,CAKjBiD,gBAAAA,CALiB,CAMjBnC,yBAAAA,CANiB,CAOjBC,mBAAAA,CAPiB,CAQjBL,kBAAmB,EARF,CAWnBtB,GAAA,CAAA,IAAAkC,EAAA,CAA8B5Y,CAA9B,CAAyC2W,CAAzC,CACA,KAAAmD,EAAAjf,KAAA,CAA8B8b,CAA9B,CAIK;IAAAkD,EAAL,GACE,IAAAA,EACA,CADqB,CAAA,CACrB,CAAA,IAAAF,EAAA,CAAoB,QAAA,EAAM,CAAA,MAAAa,GAAA,CAAAA,CAAA,CAAA,CAA1B,CAFF,CAjE6B,CAuE/BP,EAAAzC,EAAA,CAAAA,QAAO,CAAC3R,CAAD,CAAU,CACf0R,CAAA,CAAA,IAAAqB,EAAA,CAAoC/S,CAApC,CADe,CAIjB2U,SAAA,GAAM,CAANA,CAAM,CAAG,CAIP,GAA2B,CAAA,CAA3B,GAAI,CAAAX,EAAJ,CAAA,CACA,CAAAA,EAAA,CAAqB,CAAA,CAiBrB,KAfA,IAAMY,EAAqB,CAAAX,EAA3B,CAOMY,EAAgC,EAPtC,CAcMC,EAAiC,IAAIrE,GAd3C,CAeS9c,EAAI,CAAb,CAAgBA,CAAhB,CAAoBihB,CAAA/gB,OAApB,CAA+CF,CAAA,EAA/C,CACEmhB,CAAA/a,IAAA,CAAmC6a,CAAA,CAAmBjhB,CAAnB,CAAAwG,UAAnC,CAAoE,EAApE,CAGFuX,EAAA,CAAA,CAAAqB,EAAA,CAAoC3e,QAApC,CAA8C,CAC5Cud,EAASA,QAAA,CAAA3R,CAAA,CAAW,CAElB,GAA2BpP,IAAAA,EAA3B,GAAIoP,CAAAqR,WAAJ,CAAA,CAEA,IAAMlX,EAAY6F,CAAA7F,UAAlB,CAIM4a,EAAkBD,CAAA7iB,IAAA,CAAmCkI,CAAnC,CACpB4a,EAAJ,CACEA,CAAA/f,KAAA,CAAqBgL,CAArB,CADF,CApCG,CAwCQ+S,EHjJRvC,EAAAve,IAAA,CGiJ8CkI,CHjJ9C,CG6IH,EAKE0a,CAAA7f,KAAA,CAAmCgL,CAAnC,CAZF,CAFkB,CADwB,CAA9C,CAqBA,KAASrM,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBkhB,CAAAhhB,OAApB,CAA0DF,CAAA,EAA1D,CACE4d,EAAA,CAAA,CAAAwB,EAAA,CAA+B8B,CAAA,CAA8BlhB,CAA9B,CAA/B,CAIF,KAAA,CAAmC,CAAnC,CAAOihB,CAAA/gB,OAAP,CAAA,CAAsC,CACpC,IAAMid,EAAa8D,CAAAlgB,MAAA,EACbyF,EAAAA,CAAY2W,CAAA3W,UAGZ6a,EAAAA,CAA4BF,CAAA7iB,IAAA,CAAmC6e,CAAA3W,UAAnC,CAClC,KAAK,IAAIxG,EAAI,CAAb,CAAgBA,CAAhB,CAAoBqhB,CAAAnhB,OAApB,CAAsDF,CAAA,EAAtD,CACE4d,EAAA,CAAA,CAAAwB,EAAA,CAA+BiC,CAAA,CAA0BrhB,CAA1B,CAA/B,CAKF,EADMshB,CACN,CADiB,CAAApB,GAAA5hB,IAAA,CAA8BkI,CAA9B,CACjB,GACEuZ,EAAA,CAAAuB,CAAA,CAbkC,CAhDtC,CAJO;AA0ETb,CAAAniB,IAAA,CAAAA,QAAG,CAACkI,CAAD,CAAY,CAEb,GADM2W,CACN,CADmB,IAAAiC,EHpLZvC,EAAAve,IAAA,CGoLkDkI,CHpLlD,CGqLP,CACE,MAAO2W,EAAAphB,YAHI,CAaf0kB,EAAAc,GAAA,CAAAC,QAAW,CAAChb,CAAD,CAAY,CACrB,GAAI,CJlNQqV,EIkNP,CAAmCrV,CAAnC,CAAL,CACE,MAAOsZ,QAAA2B,OAAA,CAAe,IAAIb,WAAJ,CAAgB,GAAhB,CAAoBpa,CAApB,CAA6B,uCAA7B,CAAf,CAGT,KAAMkb,EAAQ,IAAAxB,GAAA5hB,IAAA,CAA8BkI,CAA9B,CACd,IAAIkb,CAAJ,CACE,MAAOA,ECtLF7B,EDyLDyB,EAAAA,CAAW,ICvON5B,EDwOX,KAAAQ,GAAA9Z,IAAA,CAA8BI,CAA9B,CAAyC8a,CAAzC,CAEmB,KAAAlC,EH7MZvC,EAAAve,IAAA6e,CG6MkD3W,CH7MlD2W,CGiNP,EAAkB,CAAC,IAAAmD,EAAAqB,KAAA,CAA8B,QAAA,CAAA1I,CAAA,CAAK,CAAA,MAAAA,EAAAzS,UAAA,GAAgBA,CAAhB,CAAnC,CAAnB,EACEuZ,EAAA,CAAAuB,CAAA,CAGF,OAAOA,ECpMAzB,ED+Kc,CAwBvBY,EAAAmB,GAAA,CAAAA,QAAyB,CAACC,CAAD,CAAQ,CAC/BpC,EAAA,CAAA,IAAAc,GAAA,CACA,KAAMuB,EAAQ,IAAA3B,EACd,KAAAA,EAAA,CAAsBC,QAAA,CAAAxe,CAAA,CAAS,CAAA,MAAAigB,EAAA,CAAM,QAAA,EAAM,CAAA,MAAAC,EAAA,CAAMlgB,CAAN,CAAA,CAAZ,CAAA,CAHA,CAQnClE,OAAA,sBAAA,CAAkCsiB,CAClCA,EAAAliB,UAAA,OAAA,CAA4CkiB,CAAAliB,UAAA4iB,OAC5CV;CAAAliB,UAAA,QAAA,CAA6CkiB,CAAAliB,UAAAkgB,EAC7CgC,EAAAliB,UAAA,IAAA,CAAyCkiB,CAAAliB,UAAAQ,IACzC0hB,EAAAliB,UAAA,YAAA,CAAiDkiB,CAAAliB,UAAA0jB,GACjDxB,EAAAliB,UAAA,0BAAA,CAA+DkiB,CAAAliB,UAAA8jB,G,CEpQ7DG,IAAAA,GAAwBrkB,MAAA4G,SAAAxG,UAAAiN,cAAxBgX,CACAC,GAA0BtkB,MAAA4G,SAAAxG,UAAAmkB,gBAD1BF,CAEAG,GAAqBxkB,MAAA4G,SAAAxG,UAAAuG,WAFrB0d,CAGAI,GAAkBzkB,MAAA4G,SAAAxG,UAAAqkB,QAHlBJ,CAIAK,GAAiB1kB,MAAA4G,SAAAxG,UAAAskB,OAJjBL,CAKAM,GAA0B3kB,MAAAwH,iBAAApH,UAAAukB,QAL1BN,CAMAO,GAAyB5kB,MAAAwH,iBAAApH,UAAAwkB,OANzBP,CAOAQ,GAAgB7kB,MAAAM,KAAAF,UAAAsG,UAPhB2d,CAQAS,GAAkB9kB,MAAAM,KAAAF,UAAA0H,YARlBuc,CASAU,GAAmB/kB,MAAAM,KAAAF,UAAAiG,aATnBge,CAUAW,GAAkBhlB,MAAAM,KAAAF,UAAAmG,YAVlB8d,CAWAY,GAAmBjlB,MAAAM,KAAAF,UAAAkG,aAXnB+d,CAYAa,GAAkB1kB,MAAAC,yBAAAykB,CAAgCllB,MAAAM,KAAAF,UAAhC8kB;AAAuDA,aAAvDA,CAZlBb,CAaAc,GAAsBnlB,MAAAG,QAAAC,UAAA+kB,aAbtBd,CAcAe,GAAmB5kB,MAAAC,yBAAA2kB,CAAgCplB,MAAAG,QAAAC,UAAhCglB,CAA0DA,WAA1DA,CAdnBf,CAeAgB,GAAsBrlB,MAAAG,QAAAC,UAAAmM,aAftB8X,CAgBAiB,GAAsBtlB,MAAAG,QAAAC,UAAAoG,aAhBtB6d,CAiBAkB,GAAyBvlB,MAAAG,QAAAC,UAAAqG,gBAjBzB4d,CAkBAmB,GAAwBxlB,MAAAG,QAAAC,UAAAqlB,eAlBxBpB,CAmBAqB,GAAwB1lB,MAAAG,QAAAC,UAAAulB,eAnBxBtB,CAoBAuB,GAA2B5lB,MAAAG,QAAAC,UAAAylB,kBApB3BxB,CAqBAyB,GAA+B9lB,MAAAG,QAAAC,UAAA0lB,sBArB/BzB,CAsBA0B,GAA4B/lB,MAAAG,QAAAC,UAAA2lB,mBAtB5B1B,CAuBA2B,GAAiBhmB,MAAAG,QAAAC,UAAA4lB,QAvBjB3B;AAwBA4B,GAAgBjmB,MAAAG,QAAAC,UAAA6lB,OAxBhB5B,CAyBA6B,GAAgBlmB,MAAAG,QAAAC,UAAA8lB,OAzBhB7B,CA0BA8B,GAAenmB,MAAAG,QAAAC,UAAA+lB,MA1Bf9B,CA2BA+B,GAAqBpmB,MAAAG,QAAAC,UAAAgmB,YA3BrB/B,CA4BAgC,GAAgBrmB,MAAAG,QAAAC,UAAAimB,OA5BhBhC,CA6BAld,GAAanH,MAAAmH,YA7Bbkd,CA8BAiC,GAAuB9lB,MAAAC,yBAAA6lB,CAAgCtmB,MAAAmH,YAAA/G,UAAhCkmB,CAA8DA,WAA9DA,CA9BvBjC,CA+BAkC,GAAmCvmB,MAAAmH,YAAA/G,UAAAmmB,sBA/BnClC,CAgCAmC,GAAgCxmB,MAAAmH,YAAA/G,UAAAomB,mB,CCxBlC,IAAAC,GAAe,IAFfC,QAAA,EAAA,E,CCCe,QAAA,GAAQ,EAAY,CAAXlF,IAAAA,ECoBLA,EDnBjBxhB,OAAA,YAAA,CAAyB,QAAQ,EAAG,CAIlCmH,QAASA,EAAW,EAAG,CAKrB,IAAM9I,EAAc,IAAAA,YAApB,CAEMohB,EAAa+B,CPoBdnC,EAAAze,IAAA,COpBgDvC,CPoBhD,COnBL,IAAI,CAACohB,CAAL,CACE,KAAU3V,MAAJ,CAAU,gFAAV,CAAN,CAGF,IAAMgX,EAAoBrB,CAAAqB,kBAE1B,IAAiC,CAAjC,GAAIA,CAAAte,OAAJ,CAME,MALMmM,EAKCA,CALSgY,EAAAze,KAAA,CAAmCnF,QAAnC,CAA6C0c,CAAA3W,UAA7C,CAKT6F,CAJPnO,MAAAomB,eAAA,CAAsBjY,CAAtB,CAA+BtQ,CAAA+B,UAA/B,CAIOuO,CAHPA,CAAAqR,WAGOrR,CN7BLoR,CM6BKpR,CAFPA,CAAAsS,gBAEOtS,CAFmB8Q,CAEnB9Q,CADP6S,CAAA3D,EAAA,CAAgBlP,CAAhB,CACOA,CAAAA,CAGHkY,EAAAA,CAAY/F,CAAAte,OAAZqkB,CAAuC,CAC7C,KAAMlY,EAAUmS,CAAA,CAAkB+F,CAAlB,CAChB,IAAIlY,CAAJ,GD7BS8X,EC6BT,CACE,KAAU3c,MAAJ,CAAU,0GAAV,CAAN;AAEFgX,CAAA,CAAkB+F,CAAlB,CAAA,CDhCSJ,ECkCTjmB,OAAAomB,eAAA,CAAsBjY,CAAtB,CAA+BtQ,CAAA+B,UAA/B,CACAohB,EAAA3D,EAAA,CAA6ClP,CAA7C,CAEA,OAAOA,EAjCc,CAoCvBxH,CAAA/G,UAAA,CAAwB0mB,EAAA1mB,UAExB,OAAO+G,EA1C2B,CAAZ,EADS,C,CEQpB,QAAA,GAAQ,CAACqa,CAAD,CAAYvC,CAAZ,CAAyB8H,CAAzB,CAAkC,CAKvDC,QAASA,EAAkB,CAACC,CAAD,CAAgB,CACzC,MAAO,SAAQ,CAAC,CAAD,CAAW,CAAV,IAAA,IAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,SAAA,OAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAKRvoB,EAAAA,CAAiB,EAQvB,KAFA,IAAMwoB,EAAoB,EAA1B,CAES5kB,EAAI,CAAb,CAAgBA,CAAhB,CAbwBwD,CAaJtD,OAApB,CAAkCF,CAAA,EAAlC,CAAuC,CACrC,IAAM1C,EAdgBkG,CAcT,CAAMxD,CAAN,CAET1C,EAAJ,WAAoBO,QAApB,EVZQyc,CUYuB,CAAsBhd,CAAtB,CAA/B,EACEsnB,CAAAvjB,KAAA,CAAuB/D,CAAvB,CAGF,IAAIA,CAAJ,WAAoB4H,iBAApB,CACE,IAAS0B,CAAT,CAAiBtJ,CAAAR,WAAjB,CAAkC8J,CAAlC,CAAyCA,CAAzC,CAAiDA,CAAAjK,YAAjD,CACEP,CAAAiF,KAAA,CAAoBuF,CAApB,CAFJ,KAKExK,EAAAiF,KAAA,CAAoB/D,CAApB,CAZmC,CAgBvCqnB,CAAAE,MAAA,CAAoB,IAApB,CA7BwBrhB,CA6BxB,CAEA,KAASxD,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB4kB,CAAA1kB,OAApB,CAA8CF,CAAA,EAA9C,CACE6d,CAAA,CAAAqB,CAAA,CAAyB0F,CAAA,CAAkB5kB,CAAlB,CAAzB,CAGF,IV/BUsa,CU+BN,CAAsB,IAAtB,CAAJ,CACE,IAASta,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB5D,CAAA8D,OAApB,CAA2CF,CAAA,EAA3C,CACQ1C,CACN,CADalB,CAAA,CAAe4D,CAAf,CACb,CAAI1C,CAAJ,WAAoBO,QAApB,EACE2f,CAAA,CAAA0B,CAAA,CAAsB5hB,CAAtB,CAvCkB,CADe,CA+CnBL,IAAAA,EAAxB,GAAIwnB,CAAAK,EAAJ,GACiCnI,CV0DjC,QU3DA,CACyD+H,CAAA7gB,CAAmB4gB,CAAAK,EAAnBjhB,CADzD,CAIuB5G,KAAAA,EAAvB,GAAIwnB,CAAAM,OAAJ,GACiCpI,CVsDjC,OUvDA,CACwD+H,CAAA7gB,CAAmB4gB,CAAAM,OAAnBlhB,CADxD,CAxDuD,C,CCP1C,QAAA,GAAQ,EAAY,CAAXqb,IAAAA,EFoBRA,ETiGAxC,EWpHd,CAA+BpY,QAAAxG,UAA/B,CAAmD,eAAnD,CAME,QAAQ,CAAC0I,CAAD,CAAY,CAElB,GAAI,IAAA0X,iBAAJ,CAA2B,CACzB,IAAMf,EAAa+B,CVahBrC,EAAAve,IAAA,CUbgDkI,CVahD,CUZH,IAAI2W,CAAJ,CACE,MAAO,KAAKA,CAAAphB,YAHW,CAOrB6T,CAAAA,CACHyU,EAAAze,KAAA,CAAmC,IAAnC,CAAyCY,CAAzC,CACH0Y,EAAA3D,EAAA,CAAgB3L,CAAhB,CACA,OAAOA,EAZW,CANtB,CXoHc8M,EW/Fd,CAA+BpY,QAAAxG,UAA/B,CAAmD,YAAnD,CAOE,QAAQ,CAACR,CAAD,CAAOwS,CAAP,CAAa,CACbkV,CAAAA,CAAQC,EAAArf,KAAA,CAAgC,IAAhC,CAAsCtI,CAAtC,CAA4CwS,CAA5C,CAET,KAAAoO,iBAAL,CAGEH,CAAA,CAAAmB,CAAA,CAA8B8F,CAA9B,CAHF,CACE1H,EAAA,CAAA4B,CAAA,CAAoB8F,CAApB,CAIF,OAAOA,EARY,CAPvB,CX+FctI,EW3Ed,CAA+BpY,QAAAxG,UAA/B,CAAmD,iBAAnD,CAOE,QAAQ,CAACkhB,CAAD,CAAYxY,CAAZ,CAAuB,CAE7B,GAAI,IAAA0X,iBAAJ,GAA4C,IAA5C,GAA8Bc,CAA9B,EAXYkG,8BAWZ,GAAoDlG,CAApD,EAA4E,CAC1E,IAAM7B,EAAa+B,CV7BhBrC,EAAAve,IAAA,CU6BgDkI,CV7BhD,CU8BH,IAAI2W,CAAJ,CACE,MAAO,KAAKA,CAAAphB,YAH4D,CAOtE6T,CAAAA,CACHuV,EAAAvf,KAAA,CAAqC,IAArC,CAA2CoZ,CAA3C,CAAsDxY,CAAtD,CACH0Y,EAAA3D,EAAA,CAAgB3L,CAAhB,CACA,OAAOA,EAZsB,CAPjC,CDnCauU;ECyDb,CAAgBjF,CAAhB,CAA2B5a,QAAAxG,UAA3B,CAA+C,CAC7CgnB,EAASM,EADoC,CAE7CL,OAAQM,EAFqC,CAA/C,CAhEiC,C,CCFpB,QAAA,GAAQ,EAAY,CAAXnG,IAAAA,EHwBZA,EGuIVoG,SAASA,EAAiB,CAAC3I,CAAD,CAAc4I,CAAd,CAA8B,CACtDrnB,MAAAkC,eAAA,CAAsBuc,CAAtB,CAAmC,aAAnC,CAAkD,CAChD6I,WAAYD,CAAAC,WADoC,CAEhDnnB,aAAc,CAAA,CAFkC,CAGhDC,IAAKinB,CAAAjnB,IAH2C,CAIhD8H,IAAyBA,QAAQ,CAACqf,CAAD,CAAgB,CAE/C,GAAI,IAAA/f,SAAJ,GAAsB1H,IAAAmJ,UAAtB,CACEoe,CAAAnf,IAAAR,KAAA,CAAwB,IAAxB,CAA8B6f,CAA9B,CADF,KAAA,CAKA,IAAIxjB,EAAehF,IAAAA,EAGnB,IAAI,IAAAH,WAAJ,CAAqB,CAGnB,IAAMJ,EAAa,IAAAA,WAAnB,CACMgpB,EAAmBhpB,CAAAwD,OACzB,IAAuB,CAAvB,CAAIwlB,CAAJ,EZhKMpL,CYgKsB,CAAsB,IAAtB,CAA5B,CAAyD,CAEvDrY,CAAA,CAAmBwB,KAAJ,CAAUiiB,CAAV,CACf,KAAK,IAAI1lB,EAAI,CAAb,CAAgBA,CAAhB,CAAoB0lB,CAApB,CAAsC1lB,CAAA,EAAtC,CACEiC,CAAA,CAAajC,CAAb,CAAA,CAAkBtD,CAAA,CAAWsD,CAAX,CAJmC,CALtC,CAcrBulB,CAAAnf,IAAAR,KAAA,CAAwB,IAAxB,CAA8B6f,CAA9B,CAEA,IAAIxjB,CAAJ,CACE,IAASjC,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBiC,CAAA/B,OAApB,CAAyCF,CAAA,EAAzC,CACE6d,CAAA,CAAAqB,CAAA,CAAyBjd,CAAA,CAAajC,CAAb,CAAzB,CA1BJ,CAF+C,CAJD,CAAlD,CADsD,CZxC1C0c,CYnHd,CAA+B1e,IAAAF,UAA/B,CAA+C,cAA/C,CAOE,QAAQ,CAACR,CAAD,CAAOqT,CAAP,CAAgB,CACtB,GAAIrT,CAAJ,WAAoB4H,iBAApB,CAAsC,CACpC,IAAMygB,EAAgBliB,KAAA3F,UAAAqL,MAAA0b,MAAA,CAA4BvnB,CAAAZ,WAA5B,CAChBkpB;CAAAA,CAAeC,EAAAjgB,KAAA,CAA8B,IAA9B,CAAoCtI,CAApC,CAA0CqT,CAA1C,CAKrB,IZAQ2J,CYAJ,CAAsB,IAAtB,CAAJ,CACE,IAASta,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB2lB,CAAAzlB,OAApB,CAA0CF,CAAA,EAA1C,CACEwd,CAAA,CAAA0B,CAAA,CAAsByG,CAAA,CAAc3lB,CAAd,CAAtB,CAIJ,OAAO4lB,EAb6B,CAgBhCE,CAAAA,CZTIxL,CYSe,CAAsBhd,CAAtB,CACnBsoB,EAAAA,CAAeC,EAAAjgB,KAAA,CAA8B,IAA9B,CAAoCtI,CAApC,CAA0CqT,CAA1C,CAEjBmV,EAAJ,EACEjI,CAAA,CAAAqB,CAAA,CAAyB5hB,CAAzB,CZbQgd,EYgBN,CAAsB,IAAtB,CAAJ,EACEkD,CAAA,CAAA0B,CAAA,CAAsB5hB,CAAtB,CAGF,OAAOsoB,EA5Be,CAP1B,CZmHclJ,EY7Ed,CAA+B1e,IAAAF,UAA/B,CAA+C,aAA/C,CAME,QAAQ,CAACR,CAAD,CAAO,CACb,GAAIA,CAAJ,WAAoB4H,iBAApB,CAAsC,CACpC,IAAMygB,EAAgBliB,KAAA3F,UAAAqL,MAAA0b,MAAA,CAA4BvnB,CAAAZ,WAA5B,CAChBkpB,EAAAA,CAAeG,EAAAngB,KAAA,CAA6B,IAA7B,CAAmCtI,CAAnC,CAKrB,IZrCQgd,CYqCJ,CAAsB,IAAtB,CAAJ,CACE,IAAK,IAAIta,EAAI,CAAb,CAAgBA,CAAhB,CAAoB2lB,CAAAzlB,OAApB,CAA0CF,CAAA,EAA1C,CACEwd,CAAA,CAAA0B,CAAA,CAAsByG,CAAA,CAAc3lB,CAAd,CAAtB,CAIJ,OAAO4lB,EAb6B,CAgBhCE,CAAAA,CZ9CIxL,CY8Ce,CAAsBhd,CAAtB,CACnBsoB,EAAAA,CAAeG,EAAAngB,KAAA,CAA6B,IAA7B,CAAmCtI,CAAnC,CAEjBwoB,EAAJ,EACEjI,CAAA,CAAAqB,CAAA,CAAyB5hB,CAAzB,CZlDQgd,EYqDN,CAAsB,IAAtB,CAAJ,EACEkD,CAAA,CAAA0B,CAAA,CAAsB5hB,CAAtB,CAGF,OAAOsoB,EA5BM,CANjB,CZ6EclJ,EYxCd,CAA+B1e,IAAAF,UAA/B,CAA+C,WAA/C,CAME,QAAQ,CAACgS,CAAD,CAAO,CACPkV,CAAAA,CAAQgB,EAAApgB,KAAA,CAA2B,IAA3B,CAAiCkK,CAAjC,CAGT,KAAAC,cAAAmO,iBAAL,CAGEH,CAAA,CAAAmB,CAAA,CAA8B8F,CAA9B,CAHF;AACE1H,EAAA,CAAA4B,CAAA,CAAoB8F,CAApB,CAIF,OAAOA,EATM,CANjB,CZwCctI,EYtBd,CAA+B1e,IAAAF,UAA/B,CAA+C,aAA/C,CAME,QAAQ,CAACR,CAAD,CAAO,CACb,IAAMwoB,EZrFIxL,CYqFe,CAAsBhd,CAAtB,CAAzB,CACMsoB,EAAeK,EAAArgB,KAAA,CAA6B,IAA7B,CAAmCtI,CAAnC,CAEjBwoB,EAAJ,EACEjI,CAAA,CAAAqB,CAAA,CAAyB5hB,CAAzB,CAGF,OAAOsoB,EARM,CANjB,CZsBclJ,EYLd,CAA+B1e,IAAAF,UAA/B,CAA+C,cAA/C,CAOE,QAAQ,CAACooB,CAAD,CAAeC,CAAf,CAA6B,CACnC,GAAID,CAAJ,WAA4BhhB,iBAA5B,CAA8C,CAC5C,IAAMygB,EAAgBliB,KAAA3F,UAAAqL,MAAA0b,MAAA,CAA4BqB,CAAAxpB,WAA5B,CAChBkpB,EAAAA,CAAeQ,EAAAxgB,KAAA,CAA8B,IAA9B,CAAoCsgB,CAApC,CAAkDC,CAAlD,CAKrB,IZ9GQ7L,CY8GJ,CAAsB,IAAtB,CAAJ,CAEE,IADAuD,CAAA,CAAAqB,CAAA,CAAyBiH,CAAzB,CACSnmB,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CAAoB2lB,CAAAzlB,OAApB,CAA0CF,CAAA,EAA1C,CACEwd,CAAA,CAAA0B,CAAA,CAAsByG,CAAA,CAAc3lB,CAAd,CAAtB,CAIJ,OAAO4lB,EAdqC,CAiBxCS,CAAAA,CZxHI/L,CYwHuB,CAAsB4L,CAAtB,CACjC,KAAMN,EAAeQ,EAAAxgB,KAAA,CAA8B,IAA9B,CAAoCsgB,CAApC,CAAkDC,CAAlD,CAArB,CACMG,EZ1HIhM,CY0Hc,CAAsB,IAAtB,CAEpBgM,EAAJ,EACEzI,CAAA,CAAAqB,CAAA,CAAyBiH,CAAzB,CAGEE,EAAJ,EACExI,CAAA,CAAAqB,CAAA,CAAyBgH,CAAzB,CAGEI,EAAJ,EACE9I,CAAA,CAAA0B,CAAA,CAAsBgH,CAAtB,CAGF,OAAON,EAlC4B,CAPvC,CAqFIW,GAAJ,EAA+BC,EAAAloB,IAA/B,CACEgnB,CAAA,CAAkBtnB,IAAAF,UAAlB,CAAkCyoB,EAAlC,CADF,CAGEnJ,EAAA,CAAA8B,CAAA,CAAmB,QAAQ,CAAC7S,CAAD,CAAU,CACnCiZ,CAAA,CAAkBjZ,CAAlB,CAA2B,CACzBmZ,WAAY,CAAA,CADa,CAEzBnnB,aAAc,CAAA,CAFW,CAKzBC,IAAyBA,QAAQ,EAAG,CAIlC,IAFA,IAAMmoB;AAAQ,EAAd,CAESzmB,EAAI,CAAb,CAAgBA,CAAhB,CAAoB,IAAAtD,WAAAwD,OAApB,CAA4CF,CAAA,EAA5C,CACEymB,CAAAplB,KAAA,CAAW,IAAA3E,WAAA,CAAgBsD,CAAhB,CAAAiB,YAAX,CAGF,OAAOwlB,EAAAhc,KAAA,CAAW,EAAX,CAR2B,CALX,CAezBrE,IAAyBA,QAAQ,CAACqf,CAAD,CAAgB,CAC/C,IAAA,CAAO,IAAA3oB,WAAP,CAAA,CACEmpB,EAAArgB,KAAA,CAA6B,IAA7B,CAAmC,IAAA9I,WAAnC,CAEFipB,GAAAngB,KAAA,CAA6B,IAA7B,CAAmCnF,QAAAC,eAAA,CAAwB+kB,CAAxB,CAAnC,CAJ+C,CAfxB,CAA3B,CADmC,CAArC,CA1M+B,C,CCWpB,QAAA,GAAQ,CAACvG,CAAD,CAAkC,CAAtBvC,IAAAA,ECsRP9e,OAAAC,UDjR1B4oB,SAASA,EAAgB,CAAC/B,CAAD,CAAgB,CACvC,MAAO,SAAQ,CAAC,CAAD,CAAW,CAAV,IAAA,IAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,SAAA,OAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAKRvoB,EAAAA,CAAiB,EAQvB,KAFA,IAAMwoB,EAAoB,EAA1B,CAES5kB,EAAI,CAAb,CAAgBA,CAAhB,CAbwBwD,CAaJtD,OAApB,CAAkCF,CAAA,EAAlC,CAAuC,CACrC,IAAM1C,EAdgBkG,CAcT,CAAMxD,CAAN,CAET1C,EAAJ,WAAoBO,QAApB,EbdQyc,CacuB,CAAsBhd,CAAtB,CAA/B,EACEsnB,CAAAvjB,KAAA,CAAuB/D,CAAvB,CAGF,IAAIA,CAAJ,WAAoB4H,iBAApB,CACE,IAAS0B,CAAT,CAAiBtJ,CAAAR,WAAjB,CAAkC8J,CAAlC,CAAyCA,CAAzC,CAAiDA,CAAAjK,YAAjD,CACEP,CAAAiF,KAAA,CAAoBuF,CAApB,CAFJ,KAKExK,EAAAiF,KAAA,CAAoB/D,CAApB,CAZmC,CAgBvCqnB,CAAAE,MAAA,CAAoB,IAApB,CA7BwBrhB,CA6BxB,CAEA,KAASxD,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB4kB,CAAA1kB,OAApB,CAA8CF,CAAA,EAA9C,CACE6d,CAAA,CAAAqB,CAAA,CAAyB0F,CAAA,CAAkB5kB,CAAlB,CAAzB,CAGF,IbjCUsa,CaiCN,CAAsB,IAAtB,CAAJ,CACE,IAASta,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB5D,CAAA8D,OAApB,CAA2CF,CAAA,EAA3C,CACQ1C,CACN,CADalB,CAAA,CAAe4D,CAAf,CACb,CAAI1C,CAAJ,WAAoBO,QAApB,EACE2f,CAAA,CAAA0B,CAAA,CAAsB5hB,CAAtB,CAvCkB,CADa,CA+ClBL,IAAAA,EAAvB,GCmOU0pB,EDnOV,GACiChK,CbwDjC,OazDA,CACwD+J,CAAA7iB,CCkO9C8iB,EDlO8C9iB,CADxD,CAIuB5G,KAAAA,EAAvB,GC+NU0pB,ED/NV,GACiChK,CboDjC,MarDA,CACuD+J,CAAA7iB,CC+N9C+iB,ED/N8C/iB,CADvD,CAI4B5G,KAAAA,EAA5B;AC6Ne4pB,ED7Nf,EbgDcnK,Ca/CZ,CAA+BC,CAA/B,CAA4C,aAA5C,CAIE,QAAQ,CAAC,CAAD,CAAW,CAAV,IAAA,IAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,SAAA,OAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAKDvgB,EAAAA,CAAiB,EAQvB,KAFA,IAAMwoB,EAAoB,EAA1B,CAES5kB,EAAI,CAAb,CAAgBA,CAAhB,CAbiBwD,CAaGtD,OAApB,CAAkCF,CAAA,EAAlC,CAAuC,CACrC,IAAM1C,EAdSkG,CAcF,CAAMxD,CAAN,CAET1C,EAAJ,WAAoBO,QAApB,EbzEMyc,CayEyB,CAAsBhd,CAAtB,CAA/B,EACEsnB,CAAAvjB,KAAA,CAAuB/D,CAAvB,CAGF,IAAIA,CAAJ,WAAoB4H,iBAApB,CACE,IAAS0B,CAAT,CAAiBtJ,CAAAR,WAAjB,CAAkC8J,CAAlC,CAAyCA,CAAzC,CAAiDA,CAAAjK,YAAjD,CACEP,CAAAiF,KAAA,CAAoBuF,CAApB,CAFJ,KAKExK,EAAAiF,KAAA,CAAoB/D,CAApB,CAZmC,CAgBjCwpB,CAAAA,CbtFExM,CasFa,CAAsB,IAAtB,CC2LZuM,GDzLThC,MAAA,CAA0B,IAA1B,CA/BiBrhB,CA+BjB,CAEA,KAASxD,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB4kB,CAAA1kB,OAApB,CAA8CF,CAAA,EAA9C,CACE6d,CAAA,CAAAqB,CAAA,CAAyB0F,CAAA,CAAkB5kB,CAAlB,CAAzB,CAGF,IAAI8mB,CAAJ,CAEE,IADAjJ,CAAA,CAAAqB,CAAA,CAAyB,IAAzB,CACSlf,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CAAoB5D,CAAA8D,OAApB,CAA2CF,CAAA,EAA3C,CACQ1C,CACN,CADalB,CAAA,CAAe4D,CAAf,CACb,CAAI1C,CAAJ,WAAoBO,QAApB,EACE2f,CAAA,CAAA0B,CAAA,CAAsB5hB,CAAtB,CA1CW,CAJrB,CAqDqBL,KAAAA,EAAvB,GCwKU8pB,EDxKV,EbNcrK,CaOZ,CAA+BC,CAA/B,CAA4C,QAA5C,CACE,QAAQ,EAAG,CACT,IAAMmK,Eb7GExM,Ca6Ga,CAAsB,IAAtB,CCqKjByM,GDnKJnhB,KAAA,CAAoB,IAApB,CAEIkhB,EAAJ,EACEjJ,CAAA,CAAAqB,CAAA,CAAyB,IAAzB,CANO,CADb,CAnHqD,C,CCP1C,QAAA,GAAQ,EAAY,CAAXA,IAAAA,ELqBTA,EKLb8H,SAASA,EAAe,CAACrK,CAAD,CAAc4I,CAAd,CAA8B,CACpDrnB,MAAAkC,eAAA,CAAsBuc,CAAtB,CAAmC,WAAnC,CAAgD,CAC9C6I,WAAYD,CAAAC,WADkC,CAE9CnnB,aAAc,CAAA,CAFgC,CAG9CC,IAAKinB,CAAAjnB,IAHyC,CAI9C8H,IAA4BA,QAAQ,CAAC6gB,CAAD,CAAa,CAAA,IAAA,EAAA,IAAA,CAS3CC,EAAkBjqB,IAAAA,Edfdqd,EcOYA,CAAsB,IAAtBA,CASpB,GACE4M,CACA,CADkB,EAClB,CdwBM5K,CcxBN,CAAqC,IAArC,CAA2C,QAAA,CAAAjQ,CAAA,CAAW,CAChDA,CAAJ,GAAgB,CAAhB,EACE6a,CAAA7lB,KAAA,CAAqBgL,CAArB,CAFkD,CAAtD,CAFF,CASAkZ,EAAAnf,IAAAR,KAAA,CAAwB,IAAxB,CAA8BqhB,CAA9B,CAEA,IAAIC,CAAJ,CACE,IAAK,IAAIlnB,EAAI,CAAb,CAAgBA,CAAhB,CAAoBknB,CAAAhnB,OAApB,CAA4CF,CAAA,EAA5C,CAAiD,CAC/C,IAAMqM,EAAU6a,CAAA,CAAgBlnB,CAAhB,CZnDlByd,EYoDE,GAAIpR,CAAAqR,WAAJ,EACEwB,CAAApB,qBAAA,CAA+BzR,CAA/B,CAH6C,CAU9C,IAAA0D,cAAAmO,iBAAL,CAGEH,CAAA,CAAAmB,CAAA,CAA8B,IAA9B,CAHF,CACE5B,EAAA,CAAA4B,CAAA,CAAoB,IAApB,CAIF,OAAO+H,EArCwC,CAJH,CAAhD,CADoD,CA2KtDE,QAASA,EAA2B,CAACxK,CAAD,CAAcyK,CAAd,CAA0B,CdxEhD1K,CcyEZ,CAA+BC,CAA/B,CAA4C,uBAA5C,CAOE,QAAQ,CAAC0K,CAAD,CAAWhb,CAAX,CAAoB,CAC1B,IAAMya,EdrLExM,CcqLa,CAAsBjO,CAAtB,CACfib,EAAAA,CACHF,CAAAxhB,KAAA,CAAgB,IAAhB,CAAsByhB,CAAtB,CAAgChb,CAAhC,CAECya,EAAJ,EACEjJ,CAAA,CAAAqB,CAAA,CAAyB7S,CAAzB,Cd1LMiO,Ec6LJ,CAAsBgN,CAAtB,CAAJ,EACE9J,CAAA,CAAA0B,CAAA,CAAsB7S,CAAtB,CAEF;MAAOib,EAZmB,CAP9B,CAD4D,CAiC9DC,QAASA,EAAwB,CAAC5K,CAAD,CAAcyK,CAAd,CAA0B,CAQzDI,QAASA,EAAmB,CAACnL,CAAD,CAAQoL,CAAR,CAAa,CAEvC,IADA,IAAMjkB,EAAQ,EACd,CAAuBlG,CAAvB,GAAgCmqB,CAAhC,CAAqCnqB,CAArC,CAA4CA,CAAAX,YAA5C,CACE6G,CAAAnC,KAAA,CAAW/D,CAAX,CAEF,KAAS0C,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBwD,CAAAtD,OAApB,CAAkCF,CAAA,EAAlC,CACE+d,CAAA,CAAAmB,CAAA,CAA8B1b,CAAA,CAAMxD,CAAN,CAA9B,CANqC,CdjH7B0c,Cc2HZ,CAA+BC,CAA/B,CAA4C,oBAA5C,CAME,QAAQ,CAAC0K,CAAD,CAAW3c,CAAX,CAAiB,CACvB2c,CAAA,CAAWA,CAAAK,YAAA,EAEX,IAAiB,aAAjB,GAAIL,CAAJ,CAAgC,CAC9B,IAAMM,EAAS,IAAA/qB,gBACfwqB,EAAAxhB,KAAA,CAAgB,IAAhB,CAAsByhB,CAAtB,CAAgC3c,CAAhC,CACA8c,EAAA,CACwBG,CADxB,EACkC,IAAA5qB,WAAAD,WADlC,CAC+D,IAD/D,CAH8B,CAAhC,IAKO,IAAiB,YAAjB,GAAIuqB,CAAJ,CACCM,CAEN,CAFe,IAAA7qB,WAEf,CADAsqB,CAAAxhB,KAAA,CAAgB,IAAhB,CAAsByhB,CAAtB,CAAgC3c,CAAhC,CACA,CAAA8c,CAAA,CAA0C,IAAA1qB,WAA1C,CAA4D6qB,CAA5D,CAHK,KAIA,IAAiB,WAAjB,GAAIN,CAAJ,CACCM,CAEN,CAFe,IAAA9qB,UAEf,CADAuqB,CAAAxhB,KAAA,CAAgB,IAAhB,CAAsByhB,CAAtB,CAAgC3c,CAAhC,CACA,CAAA8c,CAAA,CAAoBG,CAApB,EAA8B,IAAA7qB,WAA9B,CAA+C,IAA/C,CAHK,KAIA,IAAiB,UAAjB,GAAIuqB,CAAJ,CACCM,CAEN,CAFe,IAAAhrB,YAEf,CADAyqB,CAAAxhB,KAAA,CAAgB,IAAhB;AAAsByhB,CAAtB,CAAgC3c,CAAhC,CACA,CAAA8c,CAAA,CAA0C,IAAA7qB,YAA1C,CAA6DgrB,CAA7D,CAHK,KAKL,MAAM,KAAI/G,WAAJ,CAAgB,sBAAhB,CAAuCgH,MAAA,CAAOP,CAAP,CAAvC,CACJ,0EADI,CAAN,CArBqB,CAN3B,CAlByD,CA3NvDQ,EAAJ,EdkHcnL,CcjHZ,CAA+B7e,OAAAC,UAA/B,CAAkD,cAAlD,CAME,QAAQ,CAACgqB,CAAD,CAAO,CAGb,MADA,KAAArL,gBACA,CAFMxR,CAEN,CAFmB8c,EAAAniB,KAAA,CAAiC,IAAjC,CAAuCkiB,CAAvC,CADN,CANjB,CA6DEE,GAAJ,EAAgCC,EAAA3pB,IAAhC,CACE0oB,CAAA,CAAgBnpB,OAAAC,UAAhB,CAAmCkqB,EAAnC,CADF,CAEWE,EAAJ,EAAoCC,EAAA7pB,IAApC,CACL0oB,CAAA,CAAgBniB,WAAA/G,UAAhB,CAAuCoqB,EAAvC,CADK,CAIL9K,EAAA,CAAA8B,CAAA,CAAmB,QAAQ,CAAC7S,CAAD,CAAU,CACnC2a,CAAA,CAAgB3a,CAAhB,CAAyB,CACvBmZ,WAAY,CAAA,CADW,CAEvBnnB,aAAc,CAAA,CAFS,CAMvBC,IAA4BA,QAAQ,EAAG,CACrC,MAAO0nB,GAAApgB,KAAA,CAA2B,IAA3B,CAAiC,CAAA,CAAjC,CAAA0C,UAD8B,CANhB,CAYvBlC,IAA4BA,QAAQ,CAACqf,CAAD,CAAgB,CAIlD,IAAM2C,EAAiC,UAAjCA,GAAc,IAAA5hB,UAApB,CAEM7F,EAAUynB,CAAA,CACb,IAD0BznB,QAAb;AACI,IAHpB,CAKM0nB,EAAahE,EAAAze,KAAA,CAAmCnF,QAAnC,CACjB,IAAA+F,UADiB,CAInB,KAFA6hB,CAAA/f,UAEA,CAFuBmd,CAEvB,CAAmC,CAAnC,CAAO9kB,CAAAjE,WAAAwD,OAAP,CAAA,CACE+lB,EAAArgB,KAAA,CAA6BjF,CAA7B,CAAsCA,CAAAjE,WAAA,CAAmB,CAAnB,CAAtC,CAGF,KADM8E,CACN,CADkB4mB,CAAA,CAAaC,CAAA1nB,QAAb,CAAkC0nB,CACpD,CAAqC,CAArC,CAAO7mB,CAAA9E,WAAAwD,OAAP,CAAA,CACE6lB,EAAAngB,KAAA,CAA6BjF,CAA7B,CAAsCa,CAAA9E,WAAA,CAAqB,CAArB,CAAtC,CAlBgD,CAZ7B,CAAzB,CADmC,CAArC,Cd8CYggB,EcPd,CAA+B7e,OAAAC,UAA/B,CAAkD,cAAlD,CAME,QAAQ,CAACmJ,CAAD,CAAO8X,CAAP,CAAiB,CAEvB,GZ3HItB,CY2HJ,GAAI,IAAAC,WAAJ,CACE,MAAO4K,GAAA1iB,KAAA,CAAiC,IAAjC,CAAuCqB,CAAvC,CAA6C8X,CAA7C,CAGT,KAAMD,EAAWyJ,EAAA3iB,KAAA,CAAiC,IAAjC,CAAuCqB,CAAvC,CACjBqhB,GAAA1iB,KAAA,CAAiC,IAAjC,CAAuCqB,CAAvC,CAA6C8X,CAA7C,CACAA,EAAA,CAAWwJ,EAAA3iB,KAAA,CAAiC,IAAjC,CAAuCqB,CAAvC,CACXiY,EAAAN,yBAAA,CAAmC,IAAnC,CAAyC3X,CAAzC,CAA+C6X,CAA/C,CAAyDC,CAAzD,CAAmE,IAAnE,CATuB,CAN3B,CdOcrC,EcWd,CAA+B7e,OAAAC,UAA/B,CAAkD,gBAAlD,CAOE,QAAQ,CAACkhB,CAAD,CAAY/X,CAAZ,CAAkB8X,CAAlB,CAA4B,CAElC,GZ9IItB,CY8IJ,GAAI,IAAAC,WAAJ,CACE,MAAO8K,GAAA5iB,KAAA,CAAmC,IAAnC,CAAyCoZ,CAAzC,CAAoD/X,CAApD,CAA0D8X,CAA1D,CAGT,KAAMD,EAAW2J,EAAA7iB,KAAA,CAAmC,IAAnC;AAAyCoZ,CAAzC,CAAoD/X,CAApD,CACjBuhB,GAAA5iB,KAAA,CAAmC,IAAnC,CAAyCoZ,CAAzC,CAAoD/X,CAApD,CAA0D8X,CAA1D,CACAA,EAAA,CAAW0J,EAAA7iB,KAAA,CAAmC,IAAnC,CAAyCoZ,CAAzC,CAAoD/X,CAApD,CACXiY,EAAAN,yBAAA,CAAmC,IAAnC,CAAyC3X,CAAzC,CAA+C6X,CAA/C,CAAyDC,CAAzD,CAAmEC,CAAnE,CATkC,CAPtC,CdXctC,Ec8Bd,CAA+B7e,OAAAC,UAA/B,CAAkD,iBAAlD,CAKE,QAAQ,CAACmJ,CAAD,CAAO,CAEb,GZ/JIwW,CY+JJ,GAAI,IAAAC,WAAJ,CACE,MAAOgL,GAAA9iB,KAAA,CAAoC,IAApC,CAA0CqB,CAA1C,CAGT,KAAM6X,EAAWyJ,EAAA3iB,KAAA,CAAiC,IAAjC,CAAuCqB,CAAvC,CACjByhB,GAAA9iB,KAAA,CAAoC,IAApC,CAA0CqB,CAA1C,CACiB,KAAjB,GAAI6X,CAAJ,EACEI,CAAAN,yBAAA,CAAmC,IAAnC,CAAyC3X,CAAzC,CAA+C6X,CAA/C,CAAyD,IAAzD,CAA+D,IAA/D,CATW,CALjB,Cd9BcpC,EcgDd,CAA+B7e,OAAAC,UAA/B,CAAkD,mBAAlD,CAME,QAAQ,CAACkhB,CAAD,CAAY/X,CAAZ,CAAkB,CAExB,GZlLIwW,CYkLJ,GAAI,IAAAC,WAAJ,CACE,MAAOiL,GAAA/iB,KAAA,CAAsC,IAAtC,CAA4CoZ,CAA5C,CAAuD/X,CAAvD,CAGT,KAAM6X,EAAW2J,EAAA7iB,KAAA,CAAmC,IAAnC,CAAyCoZ,CAAzC,CAAoD/X,CAApD,CACjB0hB,GAAA/iB,KAAA,CAAsC,IAAtC,CAA4CoZ,CAA5C,CAAuD/X,CAAvD,CAIA,KAAM8X,EAAW0J,EAAA7iB,KAAA,CAAmC,IAAnC,CAAyCoZ,CAAzC,CAAoD/X,CAApD,CACb6X,EAAJ,GAAiBC,CAAjB,EACEG,CAAAN,yBAAA,CAAmC,IAAnC,CAAyC3X,CAAzC,CAA+C6X,CAA/C,CAAyDC,CAAzD,CAAmEC,CAAnE,CAbsB,CAN5B,CAgDI4J,GAAJ;AACEzB,CAAA,CAA4BtiB,WAAA/G,UAA5B,CAAmD8qB,EAAnD,CADF,CAEWC,EAAJ,CACL1B,CAAA,CAA4BtpB,OAAAC,UAA5B,CAA+C+qB,EAA/C,CADK,CAGLvhB,OAAAsE,KAAA,CAAa,mEAAb,CAuDEkd,GAAJ,CACEvB,CAAA,CAAyB1iB,WAAA/G,UAAzB,CAAgDgrB,EAAhD,CADF,CAEWC,EAAJ,CACLxB,CAAA,CAAyB1pB,OAAAC,UAAzB,CAA4CirB,EAA5C,CADK,CAGLzhB,OAAAsE,KAAA,CAAa,gEAAb,CJ/QWuY,GImRb,CAAgBjF,CAAhB,CAA2BrhB,OAAAC,UAA3B,CAA8C,CAC5CgnB,EAASkE,EADmC,CAE5CjE,OAAQkE,EAFoC,CAA9C,CDjRa9E,GCsRb,CAAejF,CAAf,CA7RiC,C;;;;;;;;;ALQnC,IAAMgK,GAAsBxrB,MAAA,eAE5B,IAAI,CAACwrB,EAAL,EACKA,EAAA,cADL,EAE8C,UAF9C,EAEM,MAAOA,GAAA,OAFb,EAG2C,UAH3C,EAGM,MAAOA,GAAA,IAHb,CAGwD,CAEtD,IAAMhK,GAAY,IRvBLtC,EOKAuH,GCoBb,EEnBaA,GFoBb,ECbaA,GKRb,CNsBsBjF,EMtBtB,CAA2Bha,gBAAApH,UAA3B,CAAuD,CACrDgnB,EAASqE,EAD4C,CAErDpE,OAAQqE,EAF6C,CAAvD,CHDajF,GHwBb,EKpBaA,GLqBb,EAGA1jB,SAAAyd,iBAAA,CAA4B,CAAA,CAG5B,KAAMmL,eAAiB,IL9BVrJ,CK8BU,CAA0Bd,EAA1B,CAEvBhhB,OAAAkC,eAAA,CAAsB1C,MAAtB,CAA8B,gBAA9B,CAAgD,CAC9CW,aAAc,CAAA,CADgC,CAE9CmnB,WAAY,CAAA,CAFkC,CAG9C3hB,MAAOwlB,cAHuC,CAAhD,CAhBsD,C;;;;;;;;;AOLtDttB,QADIutB,GACO,EAAG,CAIZ,IAAA,IAAA,CAFA,IAAA,MAEA,CAFgB,CAQhB,KAAA,MAAA,CAFA,IAAA,OAEA,CAJA,IAAA,SAIA,CAJmB,IAQnB,KAAA,QAAA,CAFA,IAAA,cAEA,CAFwB,EAIxB,KAAA,OAAA,CAAiB,CAAA,CAEjB,KAAA,KAAA,CAAe,CAMf,KAAA,eAAA,CAFA,IAAA,SAEA,CAJA,IAAA,cAIA,CAJwB,EApBZ;AAmCTC,QAASA,GAAK,CAAC7e,CAAD,CAAO,CAC1BA,CAAA,CAAaA,CAUNxD,QAAA,CAAgBsiB,EAAhB,CAA6B,EAA7B,CAAAtiB,QAAA,CAAyCuiB,EAAzC,CAAkD,EAAlD,CATAC,KAAAA,EAAAA,EAAAA,CAAahf,EAAAA,CAAbgf,CAkBHxtB,EAAO,IAAIotB,EACfptB,EAAA,MAAA,CAAgB,CAChBA,EAAA,IAAA,CAAcwO,CAAAxK,OAEd,KADA,IAAID,EAAI/D,CAAR,CACS8D,EAAI,CADb,CACgB2G,EAAI+D,CAAAxK,OAApB,CAAiCF,CAAjC,CAAqC2G,CAArC,CAAwC3G,CAAA,EAAxC,CACE,GAuKe2pB,GAvKf,GAAIjf,CAAA,CAAK1K,CAAL,CAAJ,CAA4B,CACrBC,CAAA,MAAL,GACEA,CAAA,MADF,CACe,EADf,CAGA,KAAIb,EAAIa,CAAR,CACI2pB,EAAWxqB,CAAA,MAAA,CAAWA,CAAA,MAAAc,OAAX,CAA+B,CAA/B,CAAX0pB,EAAgD,IACpD3pB,EAAA,CAAI,IAAIqpB,EACRrpB,EAAA,MAAA,CAAaD,CAAb,CAAiB,CACjBC,EAAA,OAAA,CAAcb,CACda,EAAA,SAAA,CAAgB2pB,CAChBxqB,EAAA,MAAAiC,KAAA,CAAgBpB,CAAhB,CAV0B,CAA5B,IAwKgB4pB,GA7JT,GAAInf,CAAA,CAAK1K,CAAL,CAAJ,GACLC,CAAA,IACA,CADWD,CACX,CADe,CACf,CAAAC,CAAA,CAAIA,CAAA,OAAJ,EAAmB/D,CAFd,CAlCT,OAAOwtB,EAAA,CAuCAxtB,CAvCA,CAAoBwO,CAApB,CAFmB;AAkD5Bgf,QAASA,GAAQ,CAACpsB,CAAD,CAAOoN,CAAP,CAAa,CAC5B,IAAIof,EAAIpf,CAAAqf,UAAA,CAAezsB,CAAA,MAAf,CAA8BA,CAAA,IAA9B,CAA4C,CAA5C,CACRA,EAAA,cAAA,CAAwBA,CAAA,QAAxB,CAA0CwsB,CAAAE,KAAA,EACtC1sB,EAAA,OAAJ,GAEEwsB,CASA,CATIpf,CAAAqf,UAAA,CADKzsB,CAAA,SAAA2sB,CAAmB3sB,CAAA,SAAA,IAAnB2sB,CAA6C3sB,CAAA,OAAA,MAClD,CAAmBA,CAAA,MAAnB,CAAmC,CAAnC,CASJ,CARAwsB,CAQA,CARII,EAAA,CAAsBJ,CAAtB,CAQJ,CAPAA,CAOA,CAPIA,CAAA5iB,QAAA,CAAUijB,EAAV,CAA6B,GAA7B,CAOJ,CAJAL,CAIA,CAJIA,CAAAC,UAAA,CAAYD,CAAAM,YAAA,CAAc,GAAd,CAAZ,CAAiC,CAAjC,CAIJ,CAHI3jB,CAGJ,CAHQnJ,CAAA,eAGR,CAHiCA,CAAA,SAGjC,CAHoDwsB,CAAAE,KAAA,EAGpD,CAFA1sB,CAAA,OAEA,CAF0C,CAE1C,GAFkBmJ,CAAA+H,QAAA,CAmJL6b,GAnJK,CAElB,CAAI/sB,CAAA,OAAJ,CACiC,CAA/B,GAAImJ,CAAA+H,QAAA,CA+IU8b,QA/IV,CAAJ,CACEhtB,CAAA,KADF,CACiBitB,EADjB,CAEW9jB,CAAA9H,MAAA,CAAQ6rB,EAAR,CAFX,GAGEltB,CAAA,KACA,CADemtB,EACf,CAAAntB,CAAA,cAAA,CACEA,CAAA,SAAAotB,MAAA,CAAuBP,EAAvB,CAAA1L,IAAA,EALJ,CADF,CAUInhB,CAAA,KAVJ,CAS+B,CAA7B,GAAImJ,CAAA+H,QAAA,CAsIQmc,IAtIR,CAAJ,CACiBC,EADjB,CAGiBC,EAvBrB,CA4BA,IADIC,CACJ,CADSxtB,CAAA,MACT,CACE,IADM,IACG0C,EAAI,CADP,CACU2G,EAAImkB,CAAA5qB,OADd,CACyB6qB,CAA/B,CACG/qB,CADH,CACO2G,CADP,GACcokB,CADd,CACkBD,CAAA,CAAG9qB,CAAH,CADlB,EAC0BA,CAAA,EAD1B,CAEE0pB,EAAA,CAASqB,CAAT;AAAYrgB,CAAZ,CAGJ,OAAOpN,EArCqB,CA8C9B4sB,QAASA,GAAqB,CAACzjB,CAAD,CAAI,CAChC,MAAOA,EAAAS,QAAA,CAAU,uBAAV,CAAmC,QAAQ,CAAA,CAAA,CAAA,CAAA,CAAG,CAC/C8jB,CAAAA,CAAO,CAEX,KADEC,CACF,CADW,CACX,CADeD,CAAA9qB,OACf,CAAO+qB,CAAA,EAAP,CAAA,CACED,CAAA,CAAO,GAAP,CAAaA,CAEf,OAAO,IAAP,CAAcA,CANqC,CAA9C,CADyB;AAkB3BE,QAASA,GAAS,CAAC5tB,CAAD,CAAO6tB,CAAP,CAA2BzgB,CAA3B,CAAsC,CAAXA,CAAA,CAAA,IAAA,EAAA,GAAAA,CAAA,CAAO,EAAP,CAAAA,CAElD,KAAI0gB,EAAU,EACd,IAAI9tB,CAAA,QAAJ,EAAuBA,CAAA,MAAvB,CAAsC,CACpC,IAAIwtB,EAAKxtB,CAAA,MAAT,CACI,CAAA,IAAAwtB,CAAA,CAAAA,CAAA,CAgCFC,CAhCQ,CAAAM,CAgCJ,CAAM,CAAN,CAhCI,CAAA,CAAA,CAAA,EAiCGN,CAjCH,EAiCiBA,CAAA,SAjCjB,EAiCwE,CAjCxE,GAiCmCA,CAAA,SAAAvc,QAAA,CAuD/Bmc,IAvD+B,CAjCnC,CAAV,IAAI,CAAJ,CAA+B,CACpB3qB,CAAAA,CAAI,CAAb,KAD6B,IACb2G,EAAImkB,CAAA5qB,OADS,CACE6qB,CAA/B,CACG/qB,CADH,CACO2G,CADP,GACcokB,CADd,CACkBD,CAAA,CAAG9qB,CAAH,CADlB,EAC0BA,CAAA,EAD1B,CAEEorB,CAAA,CAAUF,EAAA,CAAUH,CAAV,CAAaI,CAAb,CAAiCC,CAAjC,CAHiB,CAA/B,IAMYD,EAAA,CAAqB,CAArB,CAAqB,CAAA,QAArB,EACR,CAmCN,CAnCM,CAAA,QAmCN,CADAC,CACA,CADqCA,CAS9BlkB,QAAA,CACIokB,EADJ,CACmB,EADnB,CAAApkB,QAAA,CAEIqkB,EAFJ,CAEkB,EAFlB,CARP,CAAA,CAAA,CAA6BH,CAkBtBlkB,QAAA,CACIskB,EADJ,CACmB,EADnB,CAAAtkB,QAAA,CAEIukB,EAFJ,CAEiB,EAFjB,CAtDO,CAGV,EADAL,CACA,CAHUA,CAEApB,KAAA,EACV,IACEoB,CADF,CACY,IADZ,CACmBA,CADnB,CAC6B,IAD7B,CAXkC,CAiBlCA,CAAJ,GACM9tB,CAAA,SAIJ,GAHEoN,CAGF,EAHUpN,CAAA,SAGV,CAHgD,MAGhD,EADAoN,CACA,EADQ0gB,CACR,CAAI9tB,CAAA,SAAJ,GACEoN,CADF,EACU,OADV,CALF,CASA,OAAOA,EA7BsD;AAwE7DghB,IAAAA,GAAYA,CAAZA,CACAC,GAAgBA,CADhBD,CAEAE,GAAYA,CAFZF,CAGAG,GAAYA,GAHZH,CAWAI,GAAUA,mCAXVJ,CAYAK,GAAMA,kBAZNL,CAaAM,GAAYA,mDAbZN,CAcAO,GAAWA,4DAdXP,CAeAQ,GAAYA,yCAfZR,CAgBAS,GAAUA,2CAhBVT,CAiBAU,GAAeA,mBAjBfV,CAkBAW,GAAgBA,M,CCtPX,IAAMC,EAAe,EAAE5uB,MAAA,SAAF,EAAwBA,MAAA,SAAA,MAAxB,CAArB,CACH6uB,EAKJC,SAASA,GAAgB,CAAC/uB,CAAD,CAAW,CAEhC8uB,EAAA,CADE9uB,CAAJ,EAAgBA,CAAA,kBAAhB,CACwB,CAAA,CADxB,CASwB6uB,CATxB,EASwC,EAAS7tB,SAAAC,UAAAC,MAAA,CAA0B,2BAA1B,CAAT,EACpC8tB,CAAA/uB,MAAA+uB,IADoC,EACtBC,CAAAD,GAAAC,SADsB,EACN,CAAAD,GAAAC,SAAA,CAAa,YAAb,CAA2B,kBAA3B,CADM,CAVN,CAehChvB,MAAAivB,SAAJ,EAAqD1vB,IAAAA,EAArD,GAAuBS,MAAAivB,SAAAC,UAAvB,CACEL,EADF,CACwB7uB,MAAAivB,SAAAC,UADxB,CAEWlvB,MAAAivB,SAAJ,EACLH,EAAA,CAAiB9uB,MAAAivB,SAAjB,CAEA,CAAAjvB,MAAAivB,SAAA,CAAkB1vB,IAAAA,EAHb,EAKLuvB,EAAA,CAAiB9uB,MAAA,cAAjB,EAA4CA,MAAA,cAAA,MAA5C,CAMK,KAAMmvB,EAA4CN,E,CCpClD,IAAMO,GAAa,yHAAnB,CACMC,GAAc,sCADpB,CAEMC,GAAe,2BAFrB,CAGMC,GAAkB,sCAHxB,CAIMC,GAAc,cAJpB,CAMMC,GAAY,Y,CCHzB,IAAMC,GAAe,IAAIjrB,G,CCSlBkrB,QAASA,GAAU,CAAChC,CAAD,CAAQjqB,CAAR,CAAkB,CAC1C,GAAI,CAACiqB,CAAL,CACE,MAAO,EAEY,SAArB,GAAI,MAAOA,EAAX,GACEA,CADF,CJ4Bc9B,EI3BJ,CAAM8B,CAAN,CADV,CAGIjqB,EAAJ,EACEksB,EAAA,CAAYjC,CAAZ,CAAmBjqB,CAAnB,CAEF,OJwIc8pB,GIxIP,CAAUG,CAAV,CHcIwB,CGdJ,CAVmC,CAiBrCU,QAASA,GAAa,CAACC,CAAD,CAAQ,CAC/B,CAACA,CAAA,WAAL,EAA4BA,CAAAvsB,YAA5B,GACEusB,CAAA,WADF,CJccjE,EIbU,CAAMiE,CAAAvsB,YAAN,CADxB,CAGA,OAAOusB,EAAA,WAAP,EAA8B,IAJK,CAc9BC,QAASA,GAAmB,CAACC,CAAD,CAAO,CACxC,MAAO,CAAA,CAAQA,CAAA,OAAf,EACAA,CAAA,OAAA,KADA,GAC2BjD,EAFa,CAWnC6C,QAASA,GAAW,CAAChwB,CAAD,CAAOqwB,CAAP,CAA0BC,CAA1B,CAAiDC,CAAjD,CAAkE,CAC3F,GAAKvwB,CAAL,CAAA,CAGA,IAAIwwB,EAAY,CAAA,CAAhB,CACI1c,EAAO9T,CAAA,KACX,IAAIuwB,CAAJ,EACMzc,CADN,GACemZ,EADf,CACiC,CAC7B,IAAIwD,EAAazwB,CAAA,SAAAqB,MAAA,CF1DVuuB,EE0DU,CACba,EAAJ,GAEOrwB,MAAAqwB,WAAA,CAAkBA,CAAA,CAAW,CAAX,CAAlB,CAAA1uB,QAFP,GAGIyuB,CAHJ,CAGgB,CAAA,CAHhB,EAF6B,CAU7B1c,CAAJ,GAAayZ,EAAb,CACE8C,CAAA,CAAkBrwB,CAAlB,CADF,CAEWswB,CAAJ,EACLxc,CADK,GACIqZ,EADJ,CAELmD,CAAA,CAAsBtwB,CAAtB,CAFK,CAGI8T,CAHJ,GAGawZ,EAHb,GAILkD,CAJK,CAIO,CAAA,CAJP,CAOP,KADIhD,CACJ,CADSxtB,CAAA,MACT,GAAU,CAACwwB,CAAX,CAAsB,CACX9tB,CAAAA,CAAE,CAAG2G,EAAAA,CAAEmkB,CAAA5qB,OAAhB,KAAK,IAAsB6qB,CAA3B,CAA+B/qB,CAA/B,CAAiC2G,CAAjC,GAAwCokB,CAAxC,CAA0CD,CAAA,CAAG9qB,CAAH,CAA1C,EAAkDA,CAAA,EAAlD,CACEstB,EAAA,CAAYvC,CAAZ,CAAe4C,CAAf,CAAkCC,CAAlC,CAAyDC,CAAzD,CAFkB,CAzBtB,CAD2F;AAyCtFG,QAASA,GAAQ,CAAC5C,CAAD,CAAU6C,CAAV,CAAmBruB,CAAnB,CAA2BsuB,CAA3B,CAAwC,CAY9D,IAAIV,EAAwC/sB,QAAAsK,cAAA,CAAuB,OAAvB,CAXNkjB,EAYtC,EACET,CAAAtpB,aAAA,CAAmB,OAAnB,CAboC+pB,CAapC,CAEFT,EAAAvsB,YAAA,CAf6BmqB,CAC7B+C,GAAA,CAeOX,CAfP,CAAkB5tB,CAAlB,CAA0BsuB,CAA1B,CACA,OAcOV,EAjBuD,CAwBhE,IAAIY,EAAoB,IAuBjBD,SAASA,GAAU,CAACX,CAAD,CAAQ5tB,CAAR,CAAgBsuB,CAAhB,CAA6B,CACrDtuB,CAAA,CAASA,CAAT,EAAmBa,QAAA4tB,KAGnBzuB,EAAAmE,aAAA,CAAoBypB,CAApB,CAFaU,CAEb,EAF4BA,CAAAvxB,YAE5B,EADEiD,CAAA9C,WACF,CACKsxB,EAAL,CAIiBZ,CAAAc,wBAAAjH,CAA8B+G,CAA9B/G,CAJjB,GAKmBrpB,IAAAuwB,4BALnB,GAMIH,CANJ,CAMwBZ,CANxB,EACEY,CADF,CACsBZ,CAN+B;AAyDhDgB,QAASA,GAA0B,CAACC,CAAD,CAAMrtB,CAAN,CAAgB,CAExD,IAAIib,EAAQoS,CAAAjgB,QAAA,CAAY,MAAZ,CACZ,IAAe,EAAf,GAAI6N,CAAJ,CAEE,MAAOjb,EAAA,CAASqtB,CAAT,CAAc,EAAd,CAAkB,EAAlB,CAAsB,EAAtB,CAvB6B,EAAA,CAAA,CACtC,IAAIC,EAAQ,CACH1uB,KAAAA,EAwBwBqc,CAxBxBrc,CAwBgC,CAxBzC,KAAK,IAAa2G,EAwBU8nB,CAxBRvuB,OAApB,CAAiCF,CAAjC,CAAqC2G,CAArC,CAAwC3G,CAAA,EAAxC,CACE,GAAgB,GAAhB,GAuB0ByuB,CAvBtB,CAAKzuB,CAAL,CAAJ,CACE0uB,CAAA,EADF,KAEO,IAAgB,GAAhB,GAqBmBD,CArBf,CAAKzuB,CAAL,CAAJ,EACW,CADX,GACD,EAAE0uB,CADD,CAEH,MAAA,CAIN,EAAA,CAAQ,EAX8B,CA2BlC5M,CAAAA,CAAQ2M,CAAA1E,UAAA,CAAc1N,CAAd,CAAsB,CAAtB,CAAyBoL,CAAzB,CACRkH,EAAAA,CAASF,CAAA1E,UAAA,CAAc,CAAd,CAAiB1N,CAAjB,CAETuS,EAAAA,CAASJ,EAAA,CAA2BC,CAAA1E,UAAA,CAActC,CAAd,CAAoB,CAApB,CAA3B,CAAmDrmB,CAAnD,CACTytB,EAAAA,CAAQ/M,CAAAtT,QAAA,CAAc,GAAd,CAEZ,OAAe,EAAf,GAAIqgB,CAAJ,CAESztB,CAAA,CAASutB,CAAT,CAAiB7M,CAAAkI,KAAA,EAAjB,CAA+B,EAA/B,CAAmC4E,CAAnC,CAFT,CAOOxtB,CAAA,CAASutB,CAAT,CAFK7M,CAAAiI,UAAA,CAAgB,CAAhB,CAAmB8E,CAAnB,CAAA7E,KAAAnmB,EAEL,CADQie,CAAAiI,UAAA,CAAgB8E,CAAhB,CAAwB,CAAxB,CAAA7E,KAAA8E,EACR,CAAkCF,CAAlC,CAtBiD,CA6BnDG,QAASA,GAAkB,CAAC1iB,CAAD,CAAUxI,CAAV,CAAiB,CHlOtCyoB,CGoOX,CACEjgB,CAAAnI,aAAA,CAAqB,OAArB,CAA8BL,CAA9B,CADF,CAGEnG,MAAA,SAAA,cAAA,aAAAkI,KAAA,CAAyDyG,CAAzD,CAAkE,OAAlE,CAA2ExI,CAA3E,CAL+C;AAa5CmrB,QAASA,EAAY,CAAC3iB,CAAD,CAAU,CACpC,IAAI7F,EAAY6F,CAAA,UAAhB,CACa4iB,EAAgB,EAKzBzoB,EAAJ,CACgC,EADhC,CACMA,CAAAgI,QAAA,CAAkB,GAAlB,CADN,GAIIygB,CACA,CADgBzoB,CAChB,CAAA0oB,CAAA,CAAM7iB,CAAApC,aAAN,EAA8BoC,CAAApC,aAAA,CAAqB,IAArB,CAA9B,EAA6D,EALjE,GAQEilB,CACA,CADsB7iB,CAAD6iB,GACrB,CAAAD,CAAA,CAAiC5iB,CAAD8iB,QATlC,CAWA,OAAO,CAACD,GAAAA,CAAD,CAAKD,EAAAA,CAAL,CAlB6B,C,CCrNtC,QAAMG,GAAN,EAAA,EAWEC,QAAA,GAAG,CAAC/xB,CAAD,CAAOgyB,CAAP,CAAcC,CAAd,CAAiC,CAApCF,IAAAA,EAyTalL,CAvTP7mB,EAAA,cAAJ,CACEA,CAAA,cADF,CAC0B,IAD1B,CAGEkyB,EAAA,CAAAA,CAAA,CAAmBlyB,CAAnB,CAAyBgyB,CAAzB,EAAkC,EAAlC,CAAsCC,CAAtC,CALgC,CASpCC,QAAA,GAAa,CAAbA,CAAa,CAAClyB,CAAD,CAAOmI,CAAP,CAAiB8pB,CAAjB,CAAoC,CAC3CjyB,CAAAoI,SAAJ,GAAsB1H,IAAA2H,aAAtB,EACE0G,EAAA,CAAa/O,CAAb,CAAmBmI,CAAnB,CAA6B8pB,CAA7B,CAKF,IAHI7oB,CAGJ,CAH6B,UAApB,GAACpJ,CAAAkJ,UAAD,CACP9J,CAACY,CAAAqD,QAADjE,EAAiBY,CAAAmyB,GAAjB/yB,YADO,CAEPY,CAAA+K,SAFO,EAEU/K,CAAAZ,WACnB,CACE,IAAK,IAAIsD,EAAE,CAAX,CAAcA,CAAd,CAAgB0G,CAAAxG,OAAhB,CAA2BF,CAAA,EAA3B,CACEwvB,EAAA,CAAAA,CAAA,CAAmB9oB,CAAA,CAAG1G,CAAH,CAAnB,CAA0ByF,CAA1B,CAAoC8pB,CAApC,CAT2C;AAkBjDljB,QAAA,GAAO,CAACA,CAAD,CAAUijB,CAAV,CAAiBC,CAAjB,CAAoC,CAIzC,GAAID,CAAJ,CAEE,GAAIjjB,CAAAqjB,UAAJ,CACMH,CAAJ,EACEljB,CAAAqjB,UAAAC,OAAA,CAhDSC,aAgDT,CACA,CAAAvjB,CAAAqjB,UAAAC,OAAA,CAAyBL,CAAzB,CAFF,GAIEjjB,CAAAqjB,UAAA/sB,IAAA,CAnDSitB,aAmDT,CACA,CAAAvjB,CAAAqjB,UAAA/sB,IAAA,CAAsB2sB,CAAtB,CALF,CADF,KAQO,IAAIjjB,CAAApC,aAAJ,CAA0B,CAC/B,IAAIhE,EAAIoG,CAAApC,aAAA,CAAqB4lB,EAArB,CACJN,EAAJ,CACMtpB,CADN,GAEQ8Y,CACJ,CADe9Y,CAAAiB,QAAA,CA1DR0oB,aA0DQ,CAAsB,EAAtB,CAAA1oB,QAAA,CAAkCooB,CAAlC,CAAyC,EAAzC,CACf,CD+IIP,EC/IJ,CAA6B1iB,CAA7B,CAAsC0S,CAAtC,CAHJ,EDkJQgQ,EC3IN,CAA6B1iB,CAA7B,EADgBpG,CAAA,CAAIA,CAAJ,CAAQ,GAAR,CAAc,EAC9B,EADiD,cACjD,CADuDqpB,CACvD,CAT6B,CAdM,CAkC3CQ,QAAA,GAAa,CAACzjB,CAAD,CAAU0jB,CAAV,CAAsB3uB,CAAtB,CAAgC,CAA7C0uB,IAAAA,EA4Pa3L,CA5Pb2L,CACME,EAAe3jB,CAAA,WJnGVigB,EI2GT,EAAqC,OAArC,GAAoB0D,CAApB,CACE5E,CADF,CDjGYiC,ECkGA,CAAoB0C,CAApB,CAAgC3uB,CAAhC,CADZ,EAGM,CACJ,CDgIU4tB,CCjIgB,CAAuB3iB,CAAvB,CAC1B,CAAA+e,CAAA,CAAU6E,EAAA,CAAAA,CAAA,CAASF,CAAT,CADL,CAAAb,GACK,CADD,CAAAD,EACC,CAAwC7tB,CAAxC,CAAV,CAA8D,MAJhE,CAMA,OAAOgqB,EAAApB,KAAA,EAfoC;AAsB7CiG,QAAA,GAAG,CAAHA,CAAG,CAAC5E,CAAD,CAAQiE,CAAR,CAAeY,CAAf,CAAoB9uB,CAApB,CAA8B,CAC/B,IAAI+uB,EAAYC,EAAA,CAAoBd,CAApB,CAA2BY,CAA3B,CAChBZ,EAAA,CAA+BA,CAc/B,CACSe,EADT,CAd+Bf,CAc/B,CAGS,EAfT,ODlHYjC,GCkHL,CAAoBhC,CAApB,CAA2B,QAAQ,CAAiBqC,CAAjB,CAAuB,CAC1DA,CAAA4C,EAAL,GACY5C,CAqCd,SApCI,CADUA,CAqCK6C,EApCf,CAqCFC,EAAA,CAzCSC,CAyCT,CAtCY/C,CAsCZ,CAzCS+C,CAyBeC,EAgBxB,CAtCkBpB,CAsClB,CAtCyBa,CAsCzB,CArCE,CAAAzC,CAAA4C,EAAA,CAAgB,CAAA,CAFlB,CAIIlvB,EAAJ,EACEA,CAAA,CAASssB,CAAT,CAAe4B,CAAf,CAAsBa,CAAtB,CAN6D,CAA1D,CAJwB,CAuBjCC,QAAA,GAAc,CAACd,CAAD,CAAQY,CAAR,CAAa,CACzB,MAAOA,EAAA,CAAM,MAAN,CAAaZ,CAAb,CAAkB,GAAlB,CAAwBA,CADN,CA8B3BkB,QAAA,GAAiB,CAAjBA,CAAiB,CAAC9C,CAAD,CAAOiD,CAAP,CAAoBrB,CAApB,CAA2Ba,CAA3B,CAAsC,CACrD,IAAIS,EAAKlD,CAAA,SAAAhD,MAAA,CAAuBmG,EAAvB,CAGT,IAAI,CDxIQpD,ECwIP,CAA8BC,CAA9B,CAAL,CAA0C,CAC/B1tB,CAAAA,CAAE,CAAX,KADwC,IAC1B2G,EAAEiqB,CAAA1wB,OADwB,CACbd,CAA3B,CAA+BY,CAA/B,CAAiC2G,CAAjC,GAAwCvH,CAAxC,CAA0CwxB,CAAA,CAAG5wB,CAAH,CAA1C,EAAkDA,CAAA,EAAlD,CACE4wB,CAAA,CAAG5wB,CAAH,CAAA,CAAQ2wB,CAAA/qB,KAAA,CAAiB,CAAjB,CAAuBxG,CAAvB,CAA0BkwB,CAA1B,CAAiCa,CAAjC,CAF8B,CAK1C,MAAOS,EAAAnmB,KAAA,CAAQomB,EAAR,CAT8C,CAgBvDC,QAAA,GAAe,CAACrrB,CAAD,CAAW,CACxB,MAAOA,EAAAyB,QAAA,CAAiB6pB,EAAjB,CAAsB,QAAA,CAACjtB,CAAD,CAAIsN,CAAJ,CAAU4f,CAAV,CAAqB,CACrB,EAA3B,CAAIA,CAAAxiB,QAAA,CAAe,GAAf,CAAJ,CACEwiB,CADF,CACWA,CAAA9pB,QAAA,CAAe,KAAf,CAAsB,KAAtB,CADX,CAEoC,EAFpC,CAEW8pB,CAAAxiB,QAAA,CAAe,KAAf,CAFX,GAGEwiB,CAHF,CAGWA,CAAA9pB,QAAA,CAAe,MAAf,CAAuB,GAAvB,CAHX,CAKA,OAAO,GAAP,CAAWkK,CAAX,CAAe,GAAf,CAAmB4f,CAAnB,CAAyB,GANuB,CAA3C,CADiB;AAgB1B,EAAA,UAAA,EAAA,CAAAN,QAAyB,CAACjrB,CAAD,CAAW6pB,CAAX,CAAkBa,CAAlB,CAA6B,CACpD,IAAIc,EAAO,CAAA,CACXxrB,EAAA,CAAWA,CAAAukB,KAAA,EAEX,KAAIkH,EAAQH,EAAA9U,KAAA,CAASxW,CAAT,CACRyrB,EAAJ,GACEzrB,CACA,CADWA,CAAAyB,QAAA,CAAiB6pB,EAAjB,CAAsB,QAAA,CAACjtB,CAAD,CAAIsN,CAAJ,CAAU0Q,CAAV,CAAoB,CAAA,MAAA,GAAA,CAAI1Q,CAAJ,CAAQ,GAAR,CAAY0Q,CAAA5a,QAAA,CAAc,KAAd,CAAqB,EAArB,CAAZ,CAAoC,GAApC,CAA1C,CACX,CAAAzB,CAAA,CAAWqrB,EAAA,CAAqBrrB,CAArB,CAFb,CAIAA,EAAA,CAAWA,CAAAyB,QAAA,CAAiBiqB,EAAjB,CAAmCC,EAAnC,CAAuC,KAAvC,CACX3rB,EAAA,CAAWA,CAAAyB,QAAA,CAAiBmqB,EAAjB,CAAsC,QAAA,CAACvtB,CAAD,CAAImC,CAAJ,CAAOQ,CAAP,CAAa,CACvDwqB,CAAL,GACMK,CAGJ,CAHWC,EAAA,CAAgC9qB,CAAhC,CAAmCR,CAAnC,CAAsCqpB,CAAtC,CAA6Ca,CAA7C,CAGX,CAFAc,CAEA,CAFOA,CAEP,EAFeK,CAAAL,KAEf,CADAhrB,CACA,CADIqrB,CAAAE,GACJ,CAAA/qB,CAAA,CAAI6qB,CAAAztB,MAJN,CAMA,OAAOoC,EAAP,CAAWQ,CAPiD,CAAnD,CASPyqB,EAAJ,GACEzrB,CADF,CACaqrB,EAAA,CAAqBrrB,CAArB,CADb,CAGA,OAAOA,EAtB6C,CAyBtD8rB;QAAA,GAA0B,CAAC9rB,CAAD,CAAW+rB,CAAX,CAAuBlC,CAAvB,CAA8Ba,CAA9B,CAAyC,CAEjE,IAAIsB,EAAehsB,CAAA+I,QAAA,CAAiBkjB,EAAjB,CACW,EAA9B,EAAIjsB,CAAA+I,QAAA,CAAiB4iB,EAAjB,CAAJ,CACE3rB,CADF,CACaksB,EAAA,CAA4BlsB,CAA5B,CAAsC0qB,CAAtC,CADb,CAG4B,CAH5B,GAGWsB,CAHX,GAIEhsB,CAJF,CAIa6pB,CAAA,CAAQsC,EAAA,CAA8BnsB,CAA9B,CAAwC6pB,CAAxC,CAAR,CACT7pB,CALJ,CASIosB,EAAAA,CAAU,CAAA,CACM,EAApB,EAAIJ,CAAJ,GACED,CACA,CADa,EACb,CAAAK,CAAA,CAAU,CAAA,CAFZ,CAMA,IAAIA,CAAJ,CAAa,CACX,IAAAZ,EAAO,CAAA,CACHY,EAAJ,GAEEpsB,CAFF,CAEaA,CAAAyB,QAAA,CAAiB4qB,EAAjB,CAAgC,QAAA,CAAChuB,CAAD,CAAIiuB,CAAJ,CAAc,CAAA,MAAA,KAAA,CAAMA,CAAN,CAA9C,CAFb,CAFW,CAObtsB,CAAA,CAAWA,CAAAyB,QAAA,CAAiB8qB,EAAjB,CAA4B,QAAA,CAACluB,CAAD,CAAImuB,CAAJ,CAAYC,CAAZ,CACrC,CAAA,MAAA,QAAA,CAASA,CAAT,CAAY,KAAZ,CAAkBD,CAAlB,CAAwB,IAAxB,CAA6BA,CAA7B,CAAmC,QAAnC,CAA4CC,CAA5C,CAA+C,IAA/C,CADS,CAEX,OAAO,CAACruB,MAAO4B,CAAR,CAAkB+rB,GAAAA,CAAlB,CAA8BP,KAAAA,CAA9B,CA5B0D,CA+BnEW,QAAA,GAAwB,CAACnsB,CAAD,CAAW6pB,CAAX,CAAkB,CACpCsB,CAAAA,CAAKnrB,CAAAilB,MAAA,CAAeyH,EAAf,CACTvB,EAAA,CAAG,CAAH,CAAA,EAAStB,CACT,OAAOsB,EAAAnmB,KAAA,CAAQ0nB,EAAR,CAHiC;AAO1CR,QAAA,GAAsB,CAAClsB,CAAD,CAAW0qB,CAAX,CAAsB,CAC1C,IAAIrsB,EAAI2B,CAAA9G,MAAA,CAAeyzB,EAAf,CAER,OAAA,CADIL,CACJ,CADYjuB,CACZ,EADiBA,CAAA,CAAE,CAAF,CAAAkmB,KAAA,EACjB,EADgC,EAChC,EACO+H,CAAA,CAAM,CAAN,CAAApzB,MAAA,CAAe0zB,EAAf,CAAL,CAcS5sB,CAAAyB,QAAA,CAAiBkrB,EAAjB,CAA6B,QAAQ,CAACtuB,CAAD,CAAIuH,CAAJ,CAAU0mB,CAAV,CAAiB,CAC3D,MAAO5B,EAAP,CAAmB4B,CADwC,CAAtD,CAdT,CAEqBA,CAAArH,MAAA,CAAY2H,EAAZ,CAAAC,CAAoC,CAApCA,CAEnB,GAAqBnC,CAArB,CACS4B,CADT,CAKSQ,EAVb,CAyBS9sB,CAAAyB,QAAA,CAAiBkqB,EAAjB,CAAuBjB,CAAvB,CA5BiC,CA6C5CqC,QAAA,GAAqB,CAAC9E,CAAD,CAAO,CACtBA,CAAA,SAAJ,GAAyB+E,EAAzB,GACE/E,CAAA,SADF,CACqB,MADrB,CAD0B,CAS5B,EAAA,UAAA,EAAA,CAAAgF,QAA0B,CAACjtB,CAAD,CAAW,CACnC,MAAOA,EAAA9G,MAAA,CAAe+yB,EAAf,CAAA,CACL,IAAAhB,EAAA,CAA+BjrB,CAA/B,CAAyCktB,EAAzC,CADK,CAELf,EAAA,CAA8BnsB,CAAAukB,KAAA,EAA9B,CAA+C2I,EAA/C,CAHiC,CAxSvCC,EAAA,OAAA,iBAAA,CAAA,EAAA,UAAA,CAAA,CAAA,EACM,CAAA,aAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,IAAahD,QAAA,EAAA,CACf,MAJeA,aAGA,CAAb,CADN,CAAA,CA+SA;IAAImB,GAAM,yBAAV,CACI4B,GAAqB,oBADzB,CAEI9B,GAAuB,GAF3B,CAGIQ,GAAsB,wCAH1B,CAIIgB,GAAyB,SAJ7B,CAKIjB,GAAO,OALX,CAMIqB,GAAO,OANX,CAOIf,GAAU,WAPd,CAQIP,GAAgB,IAAI0B,MAAJ,CAAW,IAAX,CAAgBnB,EAAhB,CAAuB,GAAvB,CARpB,CAYIU,GAAa,0CAZjB,CAcIN,GAAgB,gDAdpB,CAeIE,GAAY,2BAfhB,CAgBI3B,GAAmB,GAhBvB,CAiBI8B,GAAgB,GAjBpB,CAkBItC,GAAQ,OAlBZ,CAmBI0C,GAAoB,kBAnBxB,CAqBApO,EAAe,IAAIiL,E,CC5TjBrzB,QA7BmB+2B,GA6BR,CAACC,CAAD,CAAMC,CAAN,CAAmBC,CAAnB,CAAuDhE,CAAvD,CAAgF,CAEzF,IAAAc,EAAA,CAAkBgD,CAAlB,EAAyB,IAEzB,KAAAC,EAAA,CAAmBA,CAAnB,EAAkC,IAElC,KAAAC,GAAA,CAA6BA,CAA7B,EAAsD,EAEtD,KAAAC,EAAA,CAA+B,IAM/B,KAAAjE,EAAA,CAAqBA,CAArB,EAAsC,EAMtC,KAAAkE,EAAA,CAFA,IAAAC,EAEA,CAJA,IAAAC,EAIA,CAJuB,IAhBkE,CAxB3F/0B,QAAO,EAAG,CAAChB,CAAD,CAAO,CACf,MAAIA,EAAJ,CACSA,CAAA,YADT,CAGS,IAJM,CAYjB8I,QAAO,GAAG,CAAC9I,CAAD,CAAOg2B,CAAP,CAAkB,CAE1B,MADAh2B,EAAA,YACA,CADgBg2B,CADU,CAkC5B,EAAA,UAAA,EAAA,CAAAC,QAAc,EAAG,CACf,MAAO,KAAAxD,EADQ,CAKnB+C,GAAAh1B,UAAA,eAAA,CAAwCg1B,EAAAh1B,UAAAy1B,E,CChDhBj0B,QAAA,GAAQ,CAACmG,CAAD,CAAW,CACzC,IAAM+tB,EAAS,IAAAn0B,QAATm0B,EAAyB,IAAAl0B,gBAAzBk0B,EACJ,IAAAj0B,mBADIi0B,EACuB,IAAAh0B,kBADvBg0B,EAEJ,IAAA/zB,iBAFI+zB,EAEqB,IAAA9zB,sBAC3B,OAAO8zB,EAAP,EAAiBA,CAAA5tB,KAAA,CAAY,IAAZ,CAAkBH,CAAlB,CAJwB,CAO3C,IAAMjH,GAAQC,SAAAC,UAAAC,MAAA,CAA0B,SAA1B,CAId,SAAM80B,GAAN,EAAA,EAUEC,QAAA,GAAc,CAACrI,CAAD,CAAQ,CAAA,IACHsI,EAAQ,EADL,CACSC,EAAY,EADrB,CACyBC,EAAY,CHiB7CvG,GGhBZ,CAAsBjC,CAAtB,CAA6B,QAAQ,CAACqC,CAAD,CAAO,CAC1CoG,EAAA,CAAkBpG,CAAlB,CAEAA,EAAArjB,MAAA,CAAawpB,CAAA,EACmBzI,EAAAA,CAAAsC,CAAAqG,EAAA3I,QAwElC,KADA,IAAItnB,CACJ,CAAQA,CAAR,CLhHSkpB,EKgHGgH,KAAA,CAAqB5I,CAArB,CAAZ,CAAA,CAA4C,CAC1C,IAAInkB,EAAOnD,CAAA,CAAE,CAAF,CAGE,IAAb,GAAIA,CAAA,CAAE,CAAF,CAAJ,GA5E2D6vB,CA6EzD,CAAM1sB,CAAN,CADF,CACgB,CAAA,CADhB,CAJ0C,CA5EA,CAA5C,CAKGgtB,QAAwB,CAACvG,CAAD,CAAO,CAChCkG,CAAAvyB,KAAA,CAAeqsB,CAAf,CADgC,CALlC,CASArC,EAAA6I,EAAA,CAAmBN,CAEfO,EAAAA,CAAQ,EACZ,KAAKn0B,IAAIA,CAAT,GAAc2zB,EAAd,CACEQ,CAAA9yB,KAAA,CAAWrB,CAAX,CAEF,OAAOm0B,EAjBa;AAqBtBL,QAAA,GAAY,CAACpG,CAAD,CAAO,CACjB,GAAIqG,CAAArG,CAAAqG,EAAJ,CAAA,CADiB,IAIbzC,EAAO,EAJM,CAIF8C,EAAa,EACRC,GAAAC,CAAuB5G,CAAvB4G,CAA6BF,CAA7BE,CACpB,GACEhD,CAAA8C,EAEA,CAFkBA,CAElB,CAAA1G,CAAA,MAAA,CAAgB,IAHlB,CAKA4D,EAAAlG,QAAA,CAAmCsC,CAkCCtC,cAM7BlkB,QAAA,CLtGEimB,EKsGF,CAA8B,EAA9B,CAAAjmB,QAAA,CL5GE4lB,EK4GF,CACmB,EADnB,CAvCPY,EAAAqG,EAAA,CAAoBzC,CAXpB,CADiB,CAiBnB+C,QAAA,GAAiB,CAAC3G,CAAD,CAAO0G,CAAP,CAAmB,CAClC,IAAI9C,EAAO5D,CAAAqG,EACX,IAAIzC,CAAJ,CACE,IAAIA,CAAA8C,EAAJ,CAEE,MADAl2B,OAAAq2B,OAAA,CAAcH,CAAd,CAA0B9C,CAAA8C,EAA1B,CACO,CAAA,CAAA,CAFT,CADF,IAKO,CAEDhJ,CAAAA,CAAUsC,CAAA,cAGd,KAFA,IAAI7pB,CAEJ,CAAQC,CAAR,CLtFOgpB,EKsFKkH,KAAA,CAAQ5I,CAAR,CAAZ,CAAA,CAA+B,CAE7BvnB,CAAA,CAAQmmB,CAAClmB,CAAA,CAAE,CAAF,CAADkmB,EAASlmB,CAAA,CAAE,CAAF,CAATkmB,MAAA,EAER,IAAc,SAAd,GAAInmB,CAAJ,EAAqC,OAArC,GAA2BA,CAA3B,CACEuwB,CAAA,CAAWtwB,CAAA,CAAE,CAAF,CAAAkmB,KAAA,EAAX,CAAA,CAA0BnmB,CAE5B2wB,EAAA,CAAM,CAAA,CAPuB,CAS/B,MAAOA,EAdF,CAP2B;AAoEpCC,QAAA,GAAgB,CAAhBA,CAAgB,CAACC,CAAD,CAAWf,CAAX,CAAkB,CAG5Be,CAAJ,GAEIA,CAFJ,CAC8B,CAA5B,EAAIA,CAAAlmB,QAAA,CAAiB,GAAjB,CAAJ,CACammB,EAAA,CAAAA,CAAA,CAAwBD,CAAxB,CAAkCf,CAAlC,CADb,CHqDUnF,EG9BG,CAAqCkG,CAArC,CAlBFhiB,QAAQ,CAACic,CAAD,CAAS9qB,CAAT,CAAgBirB,CAAhB,CAA0BF,CAA1B,CAAkC,CACjD,GAAI,CAAC/qB,CAAL,CACE,MAAO8qB,EAAP,CAAgBC,CAIlB,EAFIgG,CAEJ,CAFoBH,EAAA,CALXhE,CAKW,CAAsBkD,CAAA,CAAM9vB,CAAN,CAAtB,CAAoC8vB,CAApC,CAEpB,GAAwC,SAAxC,GAAsBiB,CAAtB,CAI6B,oBAJ7B,GAIWA,CAJX,GAQEA,CARF,CAQkB,SARlB,EAEEA,CAFF,CAEkBH,EAAA,CATThE,CASS,CAAsBkD,CAAA,CAAM7E,CAAN,CAAtB,EAAyCA,CAAzC,CAAmD6E,CAAnD,CAFlB,EAGE7E,CAOF,OAAOH,EAAP,EAAiBiG,CAAjB,EAAkC,EAAlC,EAAwChG,CAhBS,CAkBxC,CAxBf,CA2BA,OAAO8F,EAAP,EAAmBA,CAAA1K,KAAA,EAAnB,EAAsC,EA9BN;AAkClC2K,QAAA,GAAkB,CAAlBA,CAAkB,CAACD,CAAD,CAAWf,CAAX,CAAkB,CAC9BlN,CAAAA,CAAQiO,CAAAhK,MAAA,CAAe,GAAf,CACZ,KAFkC,IAEzB1qB,EAAE,CAFuB,CAEpBZ,CAFoB,CAEjB0E,CAAjB,CAAoB9D,CAApB,CAAsBymB,CAAAvmB,OAAtB,CAAoCF,CAAA,EAApC,CACE,GAAKZ,CAAL,CAASqnB,CAAA,CAAMzmB,CAAN,CAAT,CAAoB,CLlLb+sB,EKmLLxI,UAAA,CAA2B,CAE3B,IADAzgB,CACA,CLrLKipB,EKoLDiH,KAAA,CAAoB50B,CAApB,CACJ,CACEA,CAAA,CAAIq1B,EAAA,CAAAA,CAAA,CAAsBd,CAAA,CAAM7vB,CAAA,CAAE,CAAF,CAAN,CAAtB,CAAmC6vB,CAAnC,CADN,KAIE,IADIkB,CACA,CADQz1B,CAAAoP,QAAA,CAAU,GAAV,CACR,CAAW,EAAX,GAAAqmB,CAAJ,CAAkB,CAChB,IAAIC,EAAK11B,CAAA2qB,UAAA,CAAY8K,CAAZ,CACTC,EAAA,CAAKA,CAAA9K,KAAA,EACL8K,EAAA,CAAKL,EAAA,CAAAA,CAAA,CAAsBK,CAAtB,CAA0BnB,CAA1B,CAAL,EAAyCmB,CACzC11B,EAAA,CAAIA,CAAA2qB,UAAA,CAAY,CAAZ,CAAe8K,CAAf,CAAJ,CAA4BC,CAJZ,CAOpBrO,CAAA,CAAMzmB,CAAN,CAAA,CAAYZ,CAAD,EAAMA,CAAAgrB,YAAA,CAAc,GAAd,CAAN,GAA6BhrB,CAAAc,OAA7B,CAAwC,CAAxC,CAETd,CAAA+J,MAAA,CAAQ,CAAR,CAAY,EAAZ,CAFS,CAGT/J,CAHS,EAGJ,EAjBW,CAoBtB,MAAOqnB,EAAAhc,KAAA,CAAW,GAAX,CAvB2B;AAoFpCsqB,QAAA,GAAsB,CAAC1J,CAAD,CAAQhf,CAAR,CAAiB,CAAA,IACjCsnB,EAAQ,EADyB,CAGjCjZ,EAAI,EHjNI4S,GGmNZ,CAAsBjC,CAAtB,CAA6B,QAAQ,CAACqC,CAAD,CAAO,CAGrCA,CAAAqG,EAAL,EACED,EAAA,CAAkBpG,CAAlB,CAKF,KAAIsH,EAAkBtH,CAAA6C,EAAlByE,EAA8CtH,CAAA,eAC9CrhB,EAAJ,EAAeqhB,CAAAqG,EAAAK,EAAf,EAA+CY,CAA/C,EACM11B,EAAAsG,KAAA,CAAqByG,CAArB,CAA8B2oB,CAA9B,CADN,GAEIX,EAAA,CAAuB3G,CAAvB,CAA6BiG,CAA7B,CAiUR,CA/TqBtpB,CA+TrB,CA/TqBqjB,CAAArjB,MA+TrB,CAFIqQ,CAEJ,CAFQua,QAAA,CAASh1B,CAAT,CAAa,EAAb,CAAiB,EAAjB,CAER,CA/TiCya,CA+TjC,CAAKA,CAAL,CAAA,EA/TiCA,CA+TtB,CAAKA,CAAL,CAAX,EAAsB,CAAtB,EADQ,CACR,EADcza,CACd,CADkB,EAlUd,CAV0C,CAA5C,CAiBG,IAjBH,CAiBS,CAAA,CAjBT,CAkBA,OAAO,CAACm0B,EAAYT,CAAb,CAAoBuB,IAAKxa,CAAzB,CAvB8B;AAgCvCya,QAAA,GAAkB,CAAC7F,CAAD,CAAQ5B,CAAR,CAAc0H,CAAd,CAAwBh0B,CAAxB,CAAkC,CAC7CssB,CAAAqG,EAAL,EACED,EAAA,CAAkBpG,CAAlB,CAEF,IAAKA,CAAAqG,EAAAK,EAAL,CAAA,CAGI,IAAA,EH1DQpF,CG0Dc,CAAuBM,CAAvB,CAArB,EAAA,CAAA,CAAA,GAAI,EAAA,CAAA,CAAA,EACLa,EAAAA,CAAYjB,CAAA,CACdkB,EAAA,CAAgClB,CAAhC,CAAoCD,CAApC,CADc,CAEd,MACF,KAAIoG,EAAiB3H,CAAA,eAArB,CACI4H,EAA6B,WAA7BA,GAAUD,CAAVC,EAA+D,MAA/DA,GAA4CD,CADhD,CAEIE,EAA6C,CAA7CA,GAASF,CAAA7mB,QAAA,CAAuB,OAAvB,CAAT+mB,EAAkD,CAACD,CAItC,QAAjB,GAAIF,CAAJ,GAEEE,CAEA,CAFSD,CAET,GAF6BlF,CAE7B,CAFyC,OAEzC,CAFmDA,CAEnD,EAFqG,EAErG,GAFiEkF,CAAA7mB,QAAA,CAAuB,MAAvB,CAEjE,CAAA+mB,CAAA,CAAS,CAACD,CAAV,EAA0D,CAA1D,GAAoBD,CAAA7mB,QAAA,CAAuB2hB,CAAvB,CAJtB,CAMiB,SAAjB,GAAIiF,CAAJ,GACEE,CACA,CAD4B,WAC5B,GADSD,CACT,EAD8D,MAC9D,GAD2CA,CAC3C,CAAAE,CAAA,CAASA,CAAT,EAAmB,CAACD,CAFtB,CAIA,IAAKA,CAAL,EAAgBC,CAAhB,CAGIP,CAeJ,CAfsB7E,CAetB,CAdIoF,CAcJ,GAZO7H,CAAA6C,EAUL,GARE7C,CAAA6C,EAQF,CAPEC,EAAA,CFwBOrM,CExBP,CACEuJ,CADF,CFwBOvJ,CEtBLuM,EAFF,CAGqCxB,CFjMzC,CACSmB,EADT,CEiMyCnB,CFjMzC,CAGS,EE2LL,CAIEiB,CAJF,CAOF,EAAA6E,CAAA,CAAkBtH,CAAA6C,EAAlB,EAA8CJ,CAEhD,EAAA/uB,CAAA,CAAS,CACPqE,GAAUuvB,CADH,CAEPO,GAAQA,CAFD,CAGPD,GAAQA,CAHD,CAAT,CAzCA,CAJkD;AAwDpDE,QAAA,GAA6B,CAAClG,CAAD,CAAQjE,CAAR,CAAe,CAAA,IACtCoK,EAAY,EAD0B,CACtBC,EAAY,EADU,CAGtCN,EAAW/J,CAAX+J,EAAoB/J,CAAA,WHzSZiC,GG0SZ,CAAsBjC,CAAtB,CAA6B,QAAQ,CAACqC,CAAD,CAAO,CAE1CyH,EAAA,CAAwB7F,CAAxB,CAA+B5B,CAA/B,CAAqC0H,CAArC,CAA+C,QAAQ,CAAC9D,CAAD,CAAO,CAExDhyB,EAAAsG,KAAA,CADU0pB,CAAAqG,EACV,EAD4BrG,CAC5B,CAA8BgC,CAAA7rB,GAA9B,CAAJ,GACM6rB,CAAAiE,GAAJ,CACElB,EAAA,CAAuB3G,CAAvB,CAA6B+H,CAA7B,CADF,CAGEpB,EAAA,CAAuB3G,CAAvB,CAA6BgI,CAA7B,CAJJ,CAF4D,CAA9D,CAF0C,CAA5C,CAYG,IAZH,CAYS,CAAA,CAZT,CAaA,OAAO,CAACA,GAAWA,CAAZ,CAAuBD,GAAWA,CAAlC,CAjBmC;AAyB5CG,QAAA,GAAe,CAAfA,CAAe,CAACvpB,CAAD,CAAU+nB,CAAV,CAAsBhB,CAAtB,CAAqC,CAE9C,IAAA,EHtIQpE,CGsIc,CAAuB3iB,CAAvB,CAAtB,CACAwpB,EAAezF,EAAA,CADd,CAAAlB,GACc,CADV,CAAAD,EACU,CADf,CAMA6G,EAAS,IAAIjD,MAAJ,CLtXUkD,eKsXV,EAHQ1pB,CAAA8iB,QAAA6G,CACnB,IADmBA,CACZH,CAAA1sB,MAAA,CAAmB,CAAnB,CAAuB,EAAvB,CADY6sB,CACgB,KADhBA,CAEnBH,CACW,ELrXUI,iBKqXV,CAET5K,EAAAA,CAAQ6K,CAAA,CAAc7pB,CAAd,CAAA0jB,EACZ,KAAIoG,EACFC,EAAA,CAAyC/K,CAAzC,CAAgD+H,CAAhD,CACF,OAAOtD,GAAA,CAA+BzjB,CAA/B,CAAwCgf,CAAxC,CAA+C,QAAQ,CAACqC,CAAD,CAAO,CAvLrE,IAAI2I,EAAS,EAwLU3I,EAtLlBqG,EAAL,EACED,EAAA,CAqLqBpG,CArLrB,CAqLqBA,EAnLnBqG,EAAA3I,QAAJ,GACEiL,CADF,CACW1B,EAAA,CAqKAlE,CArKA,CAkLY/C,CAlLYqG,EAAA3I,QAAxB,CAkLkBgJ,CAlLlB,CADX,CAmLuB1G,EAhLvB,QAAA,CAAkB2I,CAiLhB,IAAI,CNlYG/J,CMkYP,EACI,CH1VMmB,EG0VL,CAA8BC,CAA9B,CADL,EAEIA,CAAA,QAFJ,CAEqB,CA3KvB,IAAI2I,EADAC,CACAD,CA8K6B3I,CA/KrB,QAEc,KAA1B,EA6KiCA,CA7K7B6I,GAAJ,GA6KiC7I,CA3K/B6I,GAFF,CLzNStJ,EK2NchR,KAAA,CAAwBqa,CAAxB,CAFvB,CAKA,IAwKiC5I,CAxK7B6I,GAAJ,CAIE,GAAqC,IAArC,EAoK+B7I,CApK3B8I,EAAJ,CAA2C,CAoKZ9I,CAnK7B8I,EAAA,CAAgC,EAChC,KAAKC,IAAIA,CAAT,GAkKmCN,EAlKnC,CACEO,CAIA,CA6JiCP,CAjKrB,CAAmBM,CAAnB,CAIZ,CAHAJ,CAGA,CAHSK,CAAA,CAAUJ,CAAV,CAGT,CAAIA,CAAJ,GAAcD,CAAd,GACEC,CACA,CADQD,CACR,CA2JyB3I,CA3JzB8I,EAAAn1B,KAAA,CAAmCo1B,CAAnC,CAFF,CAPuC,CAA3C,IAYO,CAGL,IAASz2B,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAqJ6B0tB,CArJT8I,EAAAt2B,OAApB,CAA0D,EAAEF,CAA5D,CACE02B,CACA,CAmJiCP,CApJrB,CAoJezI,CApJI8I,EAAA,CAA8Bx2B,CAA9B,CAAnB,CACZ,CAAAs2B,CAAA,CAAQI,CAAA,CAAUJ,CAAV,CAEVD,EAAA,CAASC,CAPJ,CAwJwB5I,CA9IjC,QAAA,CAAkB2I,CA+IM3I,EA4ExB6C,EAAA,CA5EwB7C,CA4EG6C,EAA3B,EA5EwB7C,CA4E+B,SAEnD4B,EAAAA,CAAQ,GAARA,CA9EgD8D,CA+EhD3M;CAAAA,CA/EoBiH,CA6ET6C,EAEH7F,MAAA,CAAe,GAAf,CACH1qB,EAAAA,CAAE,CAAX,KALkD,IAKpC2G,EAAE8f,CAAAvmB,OALkC,CAKpBd,CAA9B,CAAkCY,CAAlC,CAAoC2G,CAApC,GAA2CvH,CAA3C,CAA6CqnB,CAAA,CAAMzmB,CAAN,CAA7C,EAAwDA,CAAA,EAAxD,CACEymB,CAAA,CAAMzmB,CAAN,CAAA,CAAWZ,CAAAT,MAAA,CAjFiBm3B,CAiFjB,CAAA,CACT12B,CAAA8H,QAAA,CAlFkC2uB,CAkFlC,CAAwBvG,CAAxB,CADS,CAETA,CAFS,CAED,GAFC,CAEKlwB,CAnFMsuB,EAqFxB,SAAA,CAAmBjH,CAAAhc,KAAA,CAAW,GAAX,CAzFI,CAJ8C,CAA9D,CAb2C,CAgCpD2rB,QAAA,GAA0B,CAAU/K,CAAV,CAAiB+H,CAAjB,CAAgC,CACpDuD,CAAAA,CAAiBtL,CAAA6I,EACrB,KAAIiC,EAAqB,EACzB,IAAI,CNtZK7J,CMsZT,EAAqBqK,CAArB,CAIE,IAJmC,IAI1B32B,EAAI,CAJsB,CAInBosB,EAAgBuK,CAAA,CAAe32B,CAAf,CAAhC,CACKA,CADL,CACS22B,CAAAz2B,OADT,CAEKksB,CAFL,CAEqBuK,CAAA,CAAe,EAAE32B,CAAjB,CAFrB,CAE0C,CACnBosB,IAAAA,EAAAA,CAAAA,CAAegH,EAAAA,CAiCxC1F,EAAAkJ,EAAA,CAAuB,IAAI/D,MAAJ,CAAW,KAAX,CAAiBnF,CAAA,cAAjB,CAAsC,WAAtC,CAAmD,GAAnD,CACvBA,EAAAmJ,EAAA,CAAgCnJ,CAAA,cAAhC,CAAwD,GAAxD,CAA8DoJ,CAC9DpJ,EAAA6C,EAAA,CAA2B7C,CAAA6C,EAA3B,EAAuD7C,CAAA,SACvDA,EAAA,SAAA,CAAmBA,CAAA6C,EAAArpB,QAAA,CACfwmB,CAAA,cADe,CACQA,CAAAmJ,EADR,CAnCfV,EAAA,CAAmB/J,CAAA,cAAnB,CAAA,CACI2K,EAAA,CAA+B3K,CAA/B,CAHoC,CAM5C,MAAO+J,EAfiD,CAwB1DY,QAAA,GAAyB,CAAC3K,CAAD,CAAgB,CACvC,MAAO,SAAQ,CAAChB,CAAD,CAAU,CACvB,MAAOA,EAAAlkB,QAAA,CACHklB,CAAAwK,EADG,CAEHxK,CAAAyK,EAFG,CADgB,CADc;AA4IzCG,QAAA,GAAgB,CAACxJ,CAAD,CAAQ4G,CAAR,CAAoB,CAApC4C,IAAAA,EAgCa7S,EAhCb6S,CACM3L,EH7hBQkC,EG6hBA,CAAwDC,CAAxD,CAEZA,EAAAvsB,YAAA,CHhjBYosB,EGgjBQ,CAAoBhC,CAApB,CAA2B,QAAQ,CAAiBqC,CAAjB,CAAuB,CAC5E,IAAIuC,EAAMvC,CAAA,QAANuC,CAAwBvC,CAAA,cACxBA,EAAAqG,EAAJ,EAAyBrG,CAAAqG,EAAA3I,QAAzB,GASE6E,CAEA,CAFuDA,CPlXtD/oB,QAAA,CACIokB,EADJ,CACmB,EADnB,CAAApkB,QAAA,CAEIqkB,EAFJ,CAEkB,EAFlB,COoXD,CAAAmC,CAAA,QAAA,CAAkBiH,EAAA,CAdXlE,CAcW,CAAwBR,CAAxB,CAA6BmE,CAA7B,CAXpB,CAF4E,CAA1D,CAHc,CA/hBtCxB,CAAA,OAAA,iBAAA,CAAA,EAAA,UAAA,CAAA,CAAA,EACM,CAAA,aAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,IAAcqE,QAAA,EAAA,CAChB,MAJgBA,SAGA,CAAd,CADN,CAAA,CA+jBA,KAAA9S,GAAe,IAAIsP,E,CCnlBnB,IAAIyD,GAAiB,EAArB,CAKMC,GAAKz5B,MAAA,eACX,IAAIy5B,EAAJ,EAAU,CPVG7K,COUb,CAAyB,CAIvB,IAAM8K,GAAaD,EAAA,OAUnBA,GAAA,OAAA,CAJsBE,QAAA,CAACpwB,CAAD,CAAOqwB,CAAP,CAAcplB,CAAd,CAA0B,CJyGhD,IAAIqlB,EAAc92B,QAAA+2B,cAAA,CAAuB,wBAAvB,CIxG6BvwB,CJwG7B,CACN,GADM,CAAlB,CAIIqoB,EAAQ7uB,QAAA4tB,KACZiB,EAAAvrB,aAAA,CAAmBwzB,CAAnB,EAHYnJ,CAAAqJ,CACVrJ,CAAA,YADUqJ,CACyB,IAErC,GAAyCnI,CAAAxyB,WAAzC,CACAsxB,EAAA,CAAoBmJ,CI9GlBL,GAAA,CAAejwB,CAAf,CAAA,CJ+GKswB,CI9GLH,GAAAxxB,KAAA,CAAsDuxB,EAAtD,CAA2DlwB,CAA3D,CAAiEqwB,CAAjE,CAAwEplB,CAAxE,CAF8C,CAVzB,C,CCVvBnW,QADmB27B,GACR,EAAgB,CAEzB,IAAAC,MAAA,CAAa,EAFY,CAgB3B,EAAA,UAAA,MAAA,CAAAC,QAAK,CAACC,CAAD,CAAUzD,CAAV,CAAsB0D,CAAtB,CAAoC1E,CAApC,CAAmD,CACtD,IAAIlkB,EAAO,IAAAyoB,MAAA,CAAWE,CAAX,CAAP3oB,EAA8B,EAClCA,EAAA7N,KAAA,CAAU,CAAC+yB,EAAAA,CAAD,CAAa0D,aAAAA,CAAb,CAA2B1E,EAAAA,CAA3B,CAAV,CAlBoB2E,IAmBpB,CAAI7oB,CAAAhP,OAAJ,EACEgP,CAAAnO,MAAA,EAEF,KAAA42B,MAAA,CAAWE,CAAX,CAAA,CAAsB3oB,CANgC,CASxD,GAAA,UAAA,MAAA,CAAA8oB,QAAK,CAACH,CAAD,CAAUzD,CAAV,CAAsB6D,CAAtB,CAAwC,CAE3C,GADI/oB,CACJ,CADW,IAAAyoB,MAAA,CAAWE,CAAX,CACX,CAIA,IAAK,IAAItjB,EAAMrF,CAAAhP,OAANqU,CAAoB,CAA7B,CAAuC,CAAvC,EAAgCA,CAAhC,CAA0CA,CAAA,EAA1C,CAAiD,CAC/C,IAAI2jB,EAAQhpB,CAAA,CAAKqF,CAAL,CAAZ,CACI,CA3B4C,EAAA,CAAA,CAClD,IAASA,CAAT,CAAe,CAAf,CAAkBA,CAAlB,CA0BwC0jB,CA1BhB/3B,OAAxB,CAAiDqU,CAAA,EAAjD,CAAwD,CACtD,IAAI4jB,EAyBkCF,CAzB7B,CAAiB1jB,CAAjB,CACT,IAwBmB2jB,CAxBf9D,EAAA,CAAsB+D,CAAtB,CAAJ,GAwB0B/D,CAxBQ,CAAW+D,CAAX,CAAlC,CAAkD,CAChD,CAAA,CAAO,CAAA,CAAP,OAAA,CADgD,CAFI,CAMxD,CAAA,CAAO,CAAA,CAP2C,CA2BhD,GAAI,CAAJ,CACE,MAAOD,EAHsC,CANN,C,CCrB5Bt2B,QAAA,GAAQ,EAAG;AAgC9Bw2B,QAASA,GAAO,CAACC,CAAD,CAAO,CACrB,IAAK,IAAI9pB,EAAE,CAAX,CAAcA,CAAd,CAAkB8pB,CAAAn4B,OAAlB,CAA+BqO,CAAA,EAA/B,CAAoC,CAClC,IAAI+pB,EAAMD,CAAA,CAAK9pB,CAAL,CACV,IAAI+pB,CAAA14B,OAAJ,GAAmBa,QAAA6O,gBAAnB,EACEgpB,CAAA14B,OADF,GACiBa,QAAA4tB,KADjB,CAIA,IAAK,IAAIruB,EAAE,CAAX,CAAcA,CAAd,CAAkBs4B,CAAAt2B,WAAA9B,OAAlB,CAAyCF,CAAA,EAAzC,CAA8C,CAC5C,IAAIC,EAAIq4B,CAAAt2B,WAAA,CAAehC,CAAf,CACR,IAAIC,CAAAyF,SAAJ,GAAmB1H,IAAA2H,aAAnB,CAAA,CAIA,IAAIzJ,EAAO+D,CAAAlC,YAAA,EACwBkC,KAAAA,EAAAA,CAvCvC,KAAIs4B,EAAU,EACVlsB,EAAAqjB,UAAJ,CACE6I,CADF,CACY90B,KAAAC,KAAA,CAAW2I,CAAAqjB,UAAX,CADZ,CAEWrjB,CAFX,WAE8B3O,OAAA,WAF9B,EAEsD2O,CAAAmsB,aAAA,CAAqB,OAArB,CAFtD,GAGED,CAHF,CAGYlsB,CAAApC,aAAA,CAAqB,OAArB,CAAAygB,MAAA,CAAoC,KAApC,CAHZ,CAKA,EAAA,CAAO6N,CASHhkB,EAAAA,CAAMgkB,CAAA/pB,QAAA,CLoUG2V,CKpUayL,EAAhB,CA0BN,KAzBJ,CAyBI,CAzBO,EAAX,CAAIrb,CAAJ,CACSgkB,CAAA,CAAQhkB,CAAR,CAAc,CAAd,CADT,CAGO,EAsBH,GAAoBrY,CAApB,GAA6B+D,CAAA8P,cAA7B,CACEsf,EAAA,CAAqBpvB,CAArB,CAAwBw4B,CAAxB,CAAsC,CAAA,CAAtC,CADF,KAEO,IAAIv8B,CAAAwJ,SAAJ,GAAsB1H,IAAAuK,uBAAtB;CAED8C,CAFC,CAEgCnP,CAADmP,KAF/B,EAQL,GADAqtB,CACI,CNiLI1J,CMlLG,CAAa3jB,CAAb,CAAA6jB,GACP,CAAAuJ,CAAA,GAAiBC,CAArB,CAIE,IAFIC,CAEKjiB,CAFMhZ,MAAA,SAAA,cAAA,iBAAAkI,KAAA,CACb3F,CADa,CACV,QADU,CL8RVkkB,CK7RSyL,EADC,CAC0B,GAD1B,CAENlZ,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CAAoBiiB,CAAAz4B,OAApB,CAAqCwW,CAAA,EAArC,CACErK,EAAA,CAAyBssB,CAAA,CAASjiB,CAAT,CAAzB,CAAsC+hB,CAAtC,CALJ,KASIA,EAGJ,EAFEpJ,EAAA,CAAqBpvB,CAArB,CAAwBw4B,CAAxB,CAAsC,CAAA,CAAtC,CAEF,CAAApJ,EAAA,CAAqBpvB,CAArB,CAAwBy4B,CAAxB,CA7BF,CAF4C,CANZ,CADf;AA4CvB,GAAI,CThFSpM,CSgFb,CAAmB,CACjB,IAAI7vB,GAAW,IAAIqE,gBAAJ,CAAqBs3B,EAArB,CAAf,CACI/b,GAAQA,QAAA,CAAC/e,CAAD,CAAU,CACpBb,EAAAoE,QAAA,CAAiBvD,CAAjB,CAAuB,CAACiiB,UAAW,CAAA,CAAZ,CAAkBC,QAAS,CAAA,CAA3B,CAAvB,CADoB,CAStB,IAN4B9hB,MAAA,eAM5B,EALE,CAACA,MAAA,eAAA,0BAKH,CACE2e,EAAA,CAAM5b,QAAN,CADF,KAEO,CACL,IAAIm4B,GAAeA,QAAA,EAAM,CACvBvc,EAAA,CAAM5b,QAAAo4B,KAAN,CADuB,CAIrBn7B,OAAA,YAAJ,CACEA,MAAA,YAAA,UAAA,CAAmCk7B,EAAnC,CADF,CAKEE,qBAAA,CAAsB,QAAQ,EAAG,CAC/B,GAA4B,SAA5B,GAAIr4B,QAAA0d,WAAJ,CAAuC,CACrC,IAAId,EAAWA,QAAQ,EAAG,CACxBub,EAAA,EACAn4B,SAAA+D,oBAAA,CAA6B,kBAA7B,CAAiD6Y,CAAjD,CAFwB,CAI1B5c,SAAA8D,iBAAA,CAA0B,kBAA1B,CAA8C8Y,CAA9C,CALqC,CAAvC,IAOEub,GAAA,EAR6B,CAAjC,CAVG,CAwBPh3B,EAAA,CAAQA,QAAQ,EAAG,CACjBw2B,EAAA,CAAQ37B,EAAA6F,YAAA,EAAR,CADiB,CArCF;AA5ERV,IAAAm3B,GAAAn3B,E,CCDX,IAAMo3B,GAAc,E,CCkBpB,IAAMC,GAAUnZ,OAAAC,QAAA,EAKTmZ,SAASA,GAAU,CAACC,CAAD,CAAa,CAErC,GADIC,CACJ,CDxBaJ,ECuBE,CAAYG,CAAZ,CACf,CACqBC,CAerB,yBAIA,CAnBqBA,CAeO,yBAI5B,EAJyD,CAIzD,CAnBqBA,CAiBrB,4BAEA,CAnBqBA,CAiBU,4BAE/B,EAF+D,CAE/D,CAnBqBA,CAmBrB,sBAAA,EAnBqBA,CAmBK,sBAA1B,EAAoD,CAApD,EAAyD,CAtBpB,CAyChCC,QAASA,GAAe,CAACD,CAAD,CAAW,CACxC,MAAOA,EAAA,yBAAP,GAAqCA,CAAA,sBADG,CA4CnCE,QAASA,GAAuB,CAACF,CAAD,CAAW,CAEhDA,CAAA,4BAAA,CAA+BA,CAAA,sBAE1BA,EAAAG,EAAL,GACEH,CAAAG,EACA,CADuB,CAAA,CACvB,CAAAN,EAAAO,KAAA,CAAa,QAAQ,EAAG,CAEtBJ,CAAA,yBAAA,CAA4BA,CAAA,sBAC5BA,EAAAG,EAAA,CAAuB,CAAA,CAHD,CAAxB,CAFF,CAJgD,C,CC9GlD,IAAIE,GAAe,IAAnB,CAGIC,GAAYh8B,MAAA,YAAZg8B,EAAqCh8B,MAAA,YAAA,UAArCg8B,EAA2E,IAH/E,CAMIC,EAKWC,SAASA,GAAY,CAACx4B,CAAD,CAAW,CAC7C03B,qBAAA,CAAsB,QAAQ,EAAG,CAC3BY,EAAJ,CACEA,EAAA,CAAUt4B,CAAV,CADF,EAGOq4B,EAYL,GAXEA,EACA,CADe,IAAI3Z,OAAJ,CAAY,QAAA,CAACC,CAAD,CAAa,CAAC4Z,EAAA,CAAY5Z,CAAb,CAAzB,CACf,CAA4B,UAA5B,GAAItf,QAAA0d,WAAJ,CACEwb,EAAA,EADF,CAGEl5B,QAAA8D,iBAAA,CAA0B,kBAA1B,CAA8C,QAAA,EAAM,CACtB,UAA5B,GAAI9D,QAAA0d,WAAJ,EACEwb,EAAA,EAFgD,CAApD,CAOJ,EAAAF,EAAAD,KAAA,CAAkB,QAAQ,EAAE,CAAEp4B,CAAA,EAAYA,CAAA,EAAd,CAA5B,CAfF,CAD+B,CAAjC,CAD6C,C,CCM/C,IAAMy4B,GAAa,ILnBJnC,EKsBb37B,SADmB+9B,EACR,EAAG,CAAA,IAAA,EAAA,IACZ,KAAAC,GAAA,CAAqB,EACrB,KAAAC,EAAA,CAAsBv5B,QAAA6O,gBACtB,KAAIyjB,EAAM,IdWNzJ,EcVJyJ,EAAA,MAAA,CAAe,EACf,KAAAkH,EAAA,CAA+BC,EAAA,CAAc,IAAAF,EAAd,CAAmC,IRrBvDlH,EQqBuD,CAAcC,CAAd,CAAnC,CAC/B,KAAAoH,EAAA,CAA4B,CAAA,CAG5B,KAAAC,EAAA,CAFA,IAAAC,EAEA,CAFkB,IDhBPT,GCmBX,CAAa,QAAA,EAAM,CACjBU,EAAA,CAAAA,CAAA,CADiB,CAAnB,CAVY,CAcd,CAAA,CArCF,CAAAC,UAqCE9Z,EAAA+Z,GAAA,CAAA54B,QAAK,EAAG,CACNm3B,EAAA,EADM,CAORtY,EAAAga,GAAA,CAAAA,QAAW,CAACjN,CAAD,CAAQ,CACjB,MVhBYD,GUgBL,CAAwBC,CAAxB,CADU,CAGnB/M,EAAAia,GAAA,CAAAA,QAAgB,CAAC3H,CAAD,CAAM,CACpB,MVpCY1F,GUoCL,CAAoB0F,CAApB,CADa,CAoBtBtS;CAAAka,gBAAA,CAAAA,QAAe,CAACvB,CAAD,CAAWD,CAAX,CAAwBlK,CAAxB,CAAuC,CACpD,GAAI2L,CAAAxB,CAAAwB,EAAJ,CAAA,CAGAxB,CAAAwB,EAAA,CAAqB,CAAA,CACrBxB,EAAAnyB,KAAA,CAAgBkyB,CAChBC,EAAAjK,QAAA,CAAmBF,CHnER+J,GGoEX,CAAYG,CAAZ,CAAA,CAA2BC,CAnB3B,KAAA,EAAA,CADI5L,CACJ,CAoBiC4L,CArBrBz4B,QAAAqE,cAAA,CAA+B,OAA/B,CACZ,EAGOwoB,CAAAvjB,aAAA,CAAmB,WAAnB,CAHP,EAG0C,EAH1C,CACS,EVoNL4wB,KAAAA,EAAiB,EAEvB,KADA,IAAMC,EUjM6B1B,CAzBAz4B,QV0NwB0E,iBAAA,CAAyB,OAAzB,CAA3D,CACSrF,EAAI,CAAb,CAAgBA,CAAhB,CAAoB86B,CAAA56B,OAApB,CAAmCF,CAAA,EAAnC,CAAwC,CACtC,IAAMwtB,EAAQsN,CAAA,CAAO96B,CAAP,CACd,IAAoBwtB,CDpPfgL,aAAA,CAvBuBuC,gBAuBvB,CCoPL,CACE,IAAI,CH/QGzO,CG+QP,CAAmB,CDnQvB,IAAM5hB,ECoQqB8iB,CDpQdvsB,YACRmsB,GAAArR,IAAA,CAAiBrR,CAAjB,CAAL,GACE0iB,EAAAzqB,IAAA,CAAiB+H,CAAjB,CAEA,CADMswB,CACN,CCgQyBxN,CDjQRppB,UAAA,CAAgB,CAAA,CAAhB,CACjB,CAAA3D,QAAA4tB,KAAA7oB,YAAA,CAA0Bw1B,CAA1B,CAHF,CCoQMxN,EAAAzwB,WAAAkH,YAAA,CAA6BupB,CAA7B,CAFiB,CAAnB,CADF,IAMEqN,EAAAx5B,KAAA,CAAoBmsB,CAAAvsB,YAApB,CACA,CAAAusB,CAAAzwB,WAAAkH,YAAA,CAA6BupB,CAA7B,CAToC,CAYxC,CAAA,CAAOqN,CAAApwB,KAAA,CAAoB,EAApB,CAAAuf,KAAA,EU7MDsH,EAAAA,CAAO,CACTpC,GAAIiK,CADK,CAEThK,QAASF,CAFA,CAGTgM,GAAY7F,CAHH,Cb3EF9I;CagFT,EACE+C,EAAA,CAAqB+J,CAAAz4B,QAArB,CAAuCw4B,CAAvC,CAGFmB,GAAA,CAAAA,IAAA,CC3CIve,EAAAA,Cb1CKgR,Ea0CC9Q,KAAA,CD4CkBmP,CC5ClB,CAANrP,Eb3CK+Q,Ea2C8B7Q,KAAA,CD4CXmP,CC5CW,Cb1C9B2B,Ga4CXxI,UAAA,CAAwB,Cb7CbuI,Ga8CXvI,UAAA,CAAuB,CD0CjBwO,EAAAA,Cd5CQxJ,Ec4CF,CAAM6B,CAAN,CCzCLrP,ED2CL,EbtDS8Q,CasDT,EAAuC,IAAAwN,EAAvC,EACE,IAAAA,EAAA,eAAA,CAAkCtH,CAAlC,CAAuCoG,CAAvC,CAEFC,EAAA,UAAA,CAAwBrG,CACxBqG,EAAA8B,EAAA,CAAqB9F,CAEjB6C,EAAAA,CAAmB,Eb5DdpL,Ea6DT,GACEoL,CADF,CACqBvE,EAAA,CAA+B0F,CAAA,UAA/B,CADrB,CAGA,IAAI,CAACnB,CAAA/3B,OAAL,EbhES2sB,CagET,CACa3wB,CAGX,CbtGOowB,CamGIpwB,CAAek9B,CAAAz4B,QAAfzE,CAAkCA,IAG7C,CAFkB82B,CAElB,CN3ESkE,EMyESlE,CAAemG,CAAfnG,CAElB,CAKE5H,CALF,CAKY0E,EAAA,CAN0BwB,CAM1B,CANgC8H,CAAA/N,UAMhC,CALZ,CAOA,CAPA,CAMED,CAAAlrB,OAAJ,CVfY8tB,EUgBH,CAAmB5C,CAAnB,CAR+BkG,CAQHpC,GAA5B,CAAqCiM,CAArC,CAAiDnI,CAAjD,CADT,CAFyD,IAAA,EAJvD,CAAAoG,CAAAgC,GAAA,CAAkB5N,CAEpB4L,EAAAiC,GAAA,CAA6BpD,CAtC7B,CADoD,CA8EtDqD;QAAA,GAA2B,CAA3BA,CAA2B,CAAG,CACxBlB,CAAA,CAAAA,EAAJ,EAEW18B,MAAAivB,SAFX,EAE8BjvB,MAAAivB,SAAA4O,qBAF9B,GAGE,CAAAnB,EAGA,CAH2E18B,MAAAivB,SAAA4O,qBAG3E,CADA,CAAAnB,EAAA,kBACA,CADkD,QAAA,CAAC5M,CAAD,CAAW,CANnC,CAMoCgO,GAAA,CAAqChO,CAArC,CAAD,CAC7D,CAAA,CAAA4M,EAAA,iBAAA,CAAiD,QAAA,EAAM,CACrDtB,qBAAA,CAAsB,QAAA,EAAM,CAC1B,CATsB,CASlBsB,EAAA,SAAJ,EATsB,CASwBD,EAA9C,GATsB,CAUpBsB,EAAA,EAFwB,CAA5B,CADqD,CANzD,CAD4B,CAgB9BnB,QAAA,GAAO,CAAPA,CAAO,CAAG,CAvBJD,CAwBJqB,CAxBIrB,EAAJ,EAEW38B,MAAAivB,SAFX,EAE8BjvB,MAAAivB,SAAAgP,UAF9B,GAwBAD,CArBErB,EACA,CADkB38B,MAAAivB,SAAAgP,UAClB,CAoBFD,CApBErB,EAAA,gBAAA,CFlHUnB,EE8GZ,CAyBAoC,GAAA,CAAAA,CAAA,CAFQ;AAOV7a,CAAAgb,EAAA,CAAAA,QAAiB,EAAG,CAClBnB,EAAA,CAAAA,IAAA,CACA,IAAK,IAAAF,EAAL,CAAA,CAGA,IAAIwB,EAAe,IAAAxB,EAAA,cAAA,EAEnB,IAAK,IAAAA,EAAA,SAAL,CAAA,CAGA,Gb9ISvN,Ca8IT,CAsKA,IAAK,IAAI7sB,EAAI,CAAb,CAAgBA,CAAhB,CAlKuC47B,CAkKnB17B,OAApB,CAAyCF,CAAA,EAAzC,CAA8C,CAE5C,IAAIyG,EApKJo1B,IAoKQzB,EAAA,uBAAA,CApK6BwB,CAmK7B31B,CAAajG,CAAbiG,CACA,CACR,IAAIQ,CAAJ,EbvTOomB,CauTP,EArKAgP,IAuMwBxB,EAlCxB,CAkCyC,CACzC,IAAItH,EVjWMxF,EUiWA,CAAwBC,CAAxB,CACV8M,GAAA,CAzMAuB,IAyMA,CAzMAA,KA0MAxB,EAAA,eAAA,CAAkCtH,CAAlC,CACAvF,EAAAvsB,YAAA,CVrXUosB,EUqXU,CAAoB0F,CAApB,CAJqB,CArCG,CAtK9C,IA+KA,KA9KE+I,EAAA,CAAAA,IAAA,CAAuB,IAAA9B,EAAvB,CAA4C,IAAAC,EAA5C,CA8KOj6B,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CA7K0B47B,CA6KN17B,OAApB,CAAyCF,CAAA,EAAzC,CAGE,CADIyG,CACJ,CAhLAs1B,IA+KQ3B,EAAA,uBAAA,CA/KgBwB,CA8KhB31B,CAAajG,CAAbiG,CACA,CACR,GACE+wB,EAAA,CAAiCvwB,CAAjC,CAjLFs1B,IAiLsC9B,EAAA5G,EAApC,CA7KJ,KAAA+G,EAAA,SAAA,CAAyC,CAAA,CAErC,KAAAD,EAAJ,EAAiC,CbtJxBtN,CasJT,EACE,IAAAmP,cAAA,EAZF,CALA,CAFkB,CA4BpBvb;CAAAqX,aAAA,CAAAA,QAAY,CAACzsB,CAAD,CAAO4wB,CAAP,CAAsB,CAC3B,IAAA,EV4COjN,CU5CD,CAAuB3jB,CAAvB,CAAN,GAAA,CACDioB,EAAY4C,CAAA,CAAc7qB,CAAd,CAChB,IAAKioB,CAAAA,CAAL,CAAA,CApFI,IAAA,EV8HQtE,CU9Hc,CAqFM3jB,CArFN,CAArB,EAAA,CAAA,CAAA,GAAI,EAAA,CAAA,CAAA,EACT,KAAI2nB,ENvFOkE,EMuFO,CAAehI,CAAf,CACdkK,EAAAA,CH/GOJ,EG+GI,CAAY9J,CAAZ,CAIf,IAAIkK,CAAJ,CAAc,CACZ,IAAArG,EAAMqG,CAAA,UACN,KAAAnG,EAAwBmG,CAAAiC,GAFZ,CAKd,CAAA,CAAOnB,EAAA,CA0EyB7uB,CA1EzB,CACL,IRxHSynB,EQwHT,CACEC,CADF,CAEEC,CAFF,CAGEC,CAHF,CAKEhE,CALF,CADK,CAyEP,CAIuB5jB,CAAvB,GAAK6wB,IAuDYlC,EAvDjB,GACE,IAAAG,EADF,CAC8B,CAAA,CAD9B,CAGI8B,EAAJ,GACE3I,CAAAJ,EAEA,CADEI,CAAAJ,EACF,EADuC,EACvC,CAAAh1B,MAAAq2B,OAAA,CAAcjB,CAAAJ,EAAd,CAAiD+I,CAAjD,CAHF,CAKA,Ib/KSpP,Ca+KT,CAKO,CACL,GAAIyG,CAAAJ,EAAJ,CAAA,CAC+BA,CAAAA,CAAAI,CAAAJ,EChNnC,KAAK9zB,IAAIA,CAAT,GAAcg1B,EAAd,CAEY,IAAV,GAAIh1B,CAAJ,CD8M2BiM,CC7MzBmiB,MAAA2O,eAAA,CAA6B/8B,CAA7B,CADF,CD8M2BiM,CC3MzBmiB,MAAA4O,YAAA,CAA0Bh9B,CAA1B,CAA6Bg1B,CAAA,CAAWh1B,CAAX,CAA7B,CD0MA,CAKA,KAFIg6B,CAEJ,CHxNSJ,EGsNM,CAAY9J,CAAZ,CAEf,GAAoC7jB,CAApC,GAAkB6wB,IAoCHlC,EApCf,GAGIZ,CAHJ,EAGgBA,CAAAgC,GAHhB,EAGmC,CF5JzB/B,EE4J0B,CAA+BD,CAA/B,CAHpC,CAG8E,CAE5E,GFvIEC,EAAA,CEuIuCD,CFvIvC,CEuIF,EAAyCA,CFvIV,4BEuI/B,GAAyCA,CFvIuB,sBEuIhE,CACEkB,EAAA,CAAAA,IAAA,CAGA,CAFA,IAAAD,EAEA,EAFmB,IAAAA,EAAA,eAAA,CAAkCjB,CAAA,UAAlC,CAAyDlK,CAAzD,CAEnB,CADAkK,CAAAgC,GAAAn6B,YACA;AAD8B6uB,EAAA,CAA+BzkB,CAA/B,CAAqCioB,CAAAvD,EAArC,CAC9B,CFtHMuJ,EEsHN,CAAuCF,CAAvC,CbrOG9M,EawOL,GACMpwB,CADN,CACamP,CAAAJ,WADb,IAGgB/O,CAAA8I,cAAAwoB,CAAmB,OAAnBA,CACZvsB,YAJJ,CAIwB6uB,EAAA,CAA+BzkB,CAA/B,CAAqCioB,CAAAvD,EAArC,CAJxB,CAOAuD,EAAAvD,EAAA,CAAuBqJ,CAAA,UAhBqD,CATzE,CALP,IAEE,IADD0C,EAAA,CAAAA,IAAA,CAAuBzwB,CAAvB,CAA6BioB,CAA7B,CACK,CAAAA,CAAAL,GAAA,EAAmCK,CAAAL,GAAA/yB,OAAvC,CAAA,CACmCozB,CAAAA,CAAAA,CA+CjCpE,EAAAA,CVpBQF,CUoBH,CA/CsB3jB,CA+CtB,CAAA6jB,GAGLmN,EAAAA,CAAc,CAFdC,CAEc,CAFDzC,EAAA7B,MAAA,CAAiB9I,CAAjB,CAAqBoE,CAAAD,EAArB,CAAgDC,CAAAL,GAAhD,CAEC,EAAaqJ,CAAAxE,aAAb,CAAuC,IACrDyE,EAAAA,CAAmBjJ,CAAAF,EAEG,EAJAoJ,CAIA,CAJAA,CAIA,EAJAA,CAAAA,EAIA,IAlOtBzhB,CACJ,CAiOiD,IAlOxCgf,GAAA,CAkOwC9yB,CAlOxC,CACT,EAiOiD,IAlOZ8yB,GAAA,CAkOY9yB,CAlOZ,CACrC,EADiE,CACjE,EADsE,CACtE,CAAA,CAAA,CAiOiDA,CAjOjD,CAAc,GAAd,CAAkB8T,CAiOQ,CAA1BuY,EAAAF,EAAA,CAA0B,CACqDA,EAAAA,CAAAE,CAAAF,EP+OjFqJ,EAAAA,CA8FatY,EA5FPiH,EAAAA,CAAUoC,CAAA,CAAQA,CAAAvsB,YAAR,EAA6B,EAA7B,CACZ20B,EAAA,CAAAA,CAAA,COxS6BvqB,CPwS7B,COlPkDioB,CAAAD,EPkPlD,CAA0C5tB,CAA1C,CAEE6tB,EAAAA,CAAY4C,CAAA,CO1Se7qB,CP0Sf,CAChB,KAAI5E,EAAI6sB,CAAAH,EACJ1sB,EAAJ,EAAS,CNhgBA6lB,CMggBT,EAA2B7lB,CAA3B,GAAiC+mB,CAAjC,GACE/mB,CAAA,UAAA,EACA,CAAsB,CAAtB,EAAIA,CAAA,UAAJ,EAA2BA,CAAA1J,WAA3B,EACE0J,CAAA1J,WAAAkH,YAAA,CAAyBwC,CAAzB,CAHJ,CNhgBS6lB,EMwgBT,CAEMgH,CAAAH,EAAJ,EACEG,CAAAH,EAAAlyB,YACA,CADoCmqB,CACpC,CAAAoC,CAAA,CAAQ8F,CAAAH,EAFV,EAIW/H,CAJX,GAOEoC,CAPF,CH7aUQ,EGobA,CAAmB5C,CAAnB,CAA4B3lB,CAA5B,CO7TmB4F,CP6TmBJ,WAAtC,CACNqoB,CAAAN,EADM,CAPV,CAFF,CAcOxF,CAAL,CAQYA,CAAAzwB,WARZ;CASMyB,EAKJ,EAL0C,EAK1C,CALa4sB,CAAA5c,QAAA,CAAgB,QAAhB,CAKb,GAFEgf,CAAAvsB,YAEF,CAFsBmqB,CAEtB,EHxZQ+C,EGwZR,CAAqBX,CAArB,CAA4B,IAA5B,CAAkC8F,CAAAN,EAAlC,CAdF,EAGM5H,CAHN,GAIIoC,CAJJ,CHzbUQ,EG6bE,CAAmB5C,CAAnB,CAA4B3lB,CAA5B,CAAsC,IAAtC,CACN6tB,CAAAN,EADM,CAJZ,CAkBExF,EAAJ,GACEA,CAAA,UAKA,CALqBA,CAAA,UAKrB,EAL2C,CAK3C,CAHI8F,CAAAH,EAGJ,EAH6B3F,CAG7B,EAFEA,CAAA,UAAA,EAEF,CAAA8F,CAAAH,EAAA,CAAwB3F,CAN1B,CAQA,EAAA,CAAOA,CNhjBElB,Ea2QT,GACkD8G,CPiOlD,COjOkDE,CAAAF,EPiOlD,CANIsJ,CAMJ,CAPIz2B,CAOJ,COzR+BoF,CPkRvBpB,aAAA,CAAqB,OAArB,CAOR,EAPyC,EAOzC,COjO2EsyB,CPiO3E,GAJEG,CAIF,CAJMz2B,CAAAiB,QAAA,CACF,IAAI2rB,MAAJ,CAAW,iBAAX,CO9NuE0J,CP8NvE,CAAiD,MAAjD,CAAyD,GAAzD,CADE,CAC6D,GAD7D,CAIN,EADAG,CACA,GADMA,CAAA,CAAI,GAAJ,CAAU,EAChB,EADoC,UACpC,CAD0Cj3B,CAC1C,CAAIQ,CAAJ,GAAUy2B,CAAV,EH3QY3N,EG4QV,CO1R6B1jB,CP0R7B,CAAsCqxB,CAAtC,COnOF,CAGKJ,EAAL,EACEzC,EAAAjC,MAAA,CAAiB1I,CAAjB,CAAqBoE,CAAAD,EAArB,CAAgD7F,CAAhD,CAAuD8F,CAAAF,EAAvD,CA5DA,CAjB8B,CAiDlCuJ,SAAA,GAAkB,CAAlBA,CAAkB,CAACr/B,CAAD,CAAO,CAGvB,MAAA,CADI+N,CACJ,CAFW/N,CAAAS,YAAA7B,EACAmP,KACX,EACM6qB,CAAA,CAAc7qB,CAAd,CAAJ,CACSA,CADT,CAGSsxB,EAAA,CAAAA,CAAA,CAAwBtxB,CAAxB,CAJX,CAOO,CAAA2uB,EAVgB;AAgCzB8B,QAAA,GAAiB,CAAjBA,CAAiB,CAACzwB,CAAD,CAAOioB,CAAP,CAAkB,CAC7BsJ,CAAAA,CAAQD,EAAA,CAAAA,CAAA,CAAwBtxB,CAAxB,CACZ,KAAIwxB,EAAiB3G,CAAA,CAAc0G,CAAd,CAEjBjJ,EAAAA,CAAQz1B,MAAA0F,OAAA,CADUi5B,CAAAxJ,EACV,EAAiC,IAAjC,CACZ,KAAIyJ,EAAmBtH,EAAA,CAA8CnqB,CAA9C,CAAoDioB,CAAAvD,EAApD,CAEnBgN,EAAAA,CADehI,EAAAiI,CAAuCH,CAAA9M,EAAvCiN,CAAkE3xB,CAAlE2xB,CACU5I,EAC7Bl2B,OAAAq2B,OAAA,CACEZ,CADF,CAEEmJ,CAAArH,GAFF,CAGEsH,CAHF,CAIED,CAAApH,GAJF,CAMiCxC,EAAAA,CAAAI,CAAAJ,EAKjC,KAAK9zB,IAAIA,CAAT,GAAc69B,EAAd,CAIE,IAHIP,CAGJ,CAHQO,CAAA,CAAU79B,CAAV,CAGR,GAAe,CAAf,GAASs9B,CAAT,CATwB/I,CAUtB,CAAMv0B,CAAN,CAAA,CAAWs9B,CPhLjBQ,EAAAA,CA4da/Y,EAzdPgQ,EAAAA,CAAQj2B,MAAA6B,oBAAA,COoKU4zB,CPpKV,CACZ,KAAS3zB,CAAT,CAAW,CAAX,CAAiBA,CAAjB,CAAqBm0B,CAAAj0B,OAArB,CAAmCF,CAAA,EAAnC,CACEC,CACA,CADIk0B,CAAA,CAAMn0B,CAAN,CACJ,COiKoB2zB,CPjKpB,CAAM1zB,CAAN,CAAA,CAAWw0B,EAAA,CAAAA,CAAA,COiKSd,CPjKa,CAAM1zB,CAAN,CAAtB,COiKS0zB,CPjKT,COkKbL,EAAAD,EAAA,CAA4BM,CAhBK,CAiCnClT,CAAAub,cAAA,CAAAA,QAAa,CAAC5H,CAAD,CAAa,CACxB,IAAA+I,aAAA,CAAkB,IAAAnD,EAAlB,CAAuC5F,CAAvC,CADwB,CAS1B3T;CAAA0c,aAAA,CAAAA,QAAY,CAAC9xB,CAAD,CAAO+oB,CAAP,CAAmB,CAC7B,IAAIl4B,EAAOmP,CAAAJ,WACX,EAAI/O,CAAJ,EAA8BmP,CAA9B,GAAY6wB,IA/DKlC,EA+DjB,GACE,IAAAlC,aAAA,CAAkBzsB,CAAlB,CAAwB+oB,CAAxB,CAIF,IADIgJ,CACJ,CADqBlhC,CACrB,GAD8BA,CAAAmM,SAC9B,EAD+CnM,CAAAQ,WAC/C,EACE,IAASsD,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBo9B,CAAAl9B,OAApB,CAA2CF,CAAA,EAA3C,CAEE,IAAAm9B,aAAA,CADoCC,CAAAn3B,CAAejG,CAAfiG,CACpC,CAHJ,KAQE,IADIoC,CACJ,CADegD,CAAAhD,SACf,EADgCgD,CAAA3O,WAChC,CACE,IAASsD,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBqI,CAAAnI,OAApB,CAAqCF,CAAA,EAArC,CAEE,IAAAm9B,aAAA,CADoC90B,CAAApC,CAASjG,CAATiG,CACpC,CAlBuB,CA0C/Bwa,EAAA+a,GAAA,CAAAA,QAA+B,CAAChO,CAAD,CAAQ,CAAA,IAAA,EAAA,IAAA,CACjCuF,EV7UQxF,EU6UF,CAAwBC,CAAxB,CVpTEF,GUqTZ,CAAsByF,CAAtB,CAA2B,QAAA,CAACrF,CAAD,CAAU,CACnC,Gb1WOpB,Ca0WP,CACEkG,EAAA,CAAuC9E,CAAvC,CADF,KAAA,CT3DJ2P,IAAAA,EA+CalZ,CSeuBuJ,ET5DlC,SAAA,CS4DkCA,CT5Df,eACnB8E,GAAA,CS2DkC9E,CT3DlC,CS2DkCA,ET1MlC,SAAA,CS0MkCA,CT1Mf6C,EAAnB,CACEC,EAAA,CA+IF8M,CA/IE,CSyMgC5P,CTzMhC,CA+IwB,CAAAgF,EA/IxB,CA+IFpD,IAAA,EA/IE,CA+IFa,IAAA,EA/IE,CSsMA,CbxUOtD,Ca6UP,GACEyN,EAAA,CAAAA,CAAA,CACA,CAAA,CAAAD,EAAA,EAAmB,CAAAA,EAAA,cAAA,CAAiC3M,CAAjC,CAFrB,CANmC,CAArC,CbvUSb,EakVT,CACEW,CAAAvsB,YADF,CV1WYosB,EU2WU,CAAoB0F,CAApB,CADtB,CAGE,IAAAkH,EAAAlK,EAAA,MAAA1uB,KAAA,CAAsD0xB,CAAtD,CAhBmC,CA2BvCtS;CAAA8c,sBAAA,CAAAA,QAAqB,CAAClxB,CAAD,CAAUqoB,CAAV,CAAoB,CACvC,IAAI7wB,CbjWKgpB,EakWT,GAGEhpB,CAHF,CAGUwvB,CADQ6C,CAAA,CAAc7pB,CAAd,CACRgnB,EADkC6C,CAAA,CAAcyG,EAAA,CAAAA,IAAA,CAAwBtwB,CAAxB,CAAd,CAClCgnB,GAAA,CAA0BqB,CAA1B,CAHV,CASA,OAAO,CAHP7wB,CAGO,CAHCA,CAGD,EAHUnG,MAAA8/B,iBAAA,CAAwBnxB,CAAxB,CAAAoxB,iBAAA,CAAkD/I,CAAlD,CAGV,EAAQ7wB,CAAAmmB,KAAA,EAAR,CAAuB,EAXS,CAgBzCvJ,EAAAid,GAAA,CAAAA,QAAe,CAACrxB,CAAD,CAAUsxB,CAAV,CAAuB,CACpC,IAAIzhC,EAAOmQ,CAAAtO,YAAA,EACPw6B,EAAAA,CAAUoF,CAAA,CAAcA,CAAAjT,MAAA,CAAkB,IAAlB,CAAd,CAAwC,EAClDkT,EAAAA,CAAY1hC,CAAAmP,KAAZuyB,EAAyB1hC,CAAAmP,KAAA7E,UAI7B,IAAI,CAACo3B,CAAL,CAAgB,CACd,IAAIC,EAAYxxB,CAAApC,aAAA,CAAqB,OAArB,CAChB,IAAI4zB,CAAJ,CAAe,CACTC,CAAAA,CAAKD,CAAAnT,MAAA,CAAgB,IAAhB,CACT,KAAK,IAAI1qB,EAAE,CAAX,CAAcA,CAAd,CAAkB89B,CAAA59B,OAAlB,CAA6BF,CAAA,EAA7B,CACE,GAAI89B,CAAA,CAAG99B,CAAH,CAAJ,GThEKmkB,CSgESyL,EAAd,CAA2C,CACzCgO,CAAA,CAAYE,CAAA,CAAG99B,CAAH,CAAK,CAAL,CACZ,MAFyC,CAHhC,CAFD,CAYZ49B,CAAJ,EACErF,CAAAl3B,KAAA,CTxES8iB,CSwEIyL,EAAb,CAA0CgO,CAA1C,CbpYO/Q,EasYT,GACMyG,CADN,CACkB4C,CAAA,CAAc7pB,CAAd,CADlB,GAEmBinB,CAAAF,EAFnB,EAGImF,CAAAl3B,KAAA,CP4KO8iB,EO5KM8S,EAAb,CAA0C3D,CAAAF,EAA1C,CVzMQrE,GU4MZ,CAA6B1iB,CAA7B,CAAsCksB,CAAA9tB,KAAA,CAAa,GAAb,CAAtC,CA5BoC,CA8BtCgW,EAAAsd,GAAA,CAAAA,QAAiB,CAACzgC,CAAD,CAAO,CACtB,MAAO44B,EAAA,CAAc54B,CAAd,CADe,CAM1Bw8B,EAAAh8B,UAAA,MAAA,CAAiCg8B,CAAAh8B,UAAA8D,GACjCk4B;CAAAh8B,UAAA,gBAAA,CAA2Cg8B,CAAAh8B,UAAA68B,gBAC3Cb,EAAAh8B,UAAA,aAAA,CAAwCg8B,CAAAh8B,UAAAg6B,aACxCgC,EAAAh8B,UAAA,cAAA,CAAyCg8B,CAAAh8B,UAAAk+B,cACzClC,EAAAh8B,UAAA,aAAA,CAAwCg8B,CAAAh8B,UAAAq/B,aACxCrD,EAAAh8B,UAAA,sBAAA,CAAiDg8B,CAAAh8B,UAAAy/B,sBACjDzD,EAAAh8B,UAAA,gBAAA,CAA2Cg8B,CAAAh8B,UAAA4/B,GAC3C5D,EAAAh8B,UAAA,kBAAA,CAA6Cg8B,CAAAh8B,UAAAigC,GAC7CjE,EAAAh8B,UAAA,gCAAA,CAA2Dg8B,CAAAh8B,UAAA09B,GAC3D1B,EAAAh8B,UAAA,YAAA,CAAuCg8B,CAAAh8B,UAAA28B,GACvCX,EAAAh8B,UAAA,iBAAA,CAA4Cg8B,CAAAh8B,UAAA48B,GAC5CZ;CAAAh8B,UAAA,kBAAA,CAA6Cg8B,CAAAh8B,UAAA29B,EAC7Cv9B,OAAA+N,iBAAA,CAAwB6tB,CAAAh8B,UAAxB,CAA+C,CAC7C,aAAgB,CACd,IAAAQ,QAAG,EAAG,CACJ,MbrcOguB,EaocH,CADQ,CAD6B,CAM7C,UAAa,CACX,IAAAhuB,QAAG,EAAG,CACJ,MbxaOuuB,EauaH,CADK,CANgC,CAA/C,C,CE9bA,IAAMhd,EAAc,IFgBLiqB,CEhBf,CAEI6B,EAFJ,CAEeJ,EAEX79B,OAAA,SAAJ,GACEi+B,EACA,CADYj+B,MAAA,SAAA,UACZ,CAAA69B,EAAA,CAAuB79B,MAAA,SAAA,qBAFzB,CAKAA,OAAAivB,SAAA,CAAkB,CAChBmN,YAAajqB,CADG,CAOhB,gBAAA8qB,QAAe,CAACvB,CAAD,CAAWD,CAAX,CAAwB6E,CAAxB,CAAwC,CACrDnuB,CAAA4rB,EAAA,EACA5rB,EAAA8qB,gBAAA,CAA4BvB,CAA5B,CAAsCD,CAAtC,CAAmD6E,CAAnD,CAFqD,CAPvC,CAgBhB,aAAAb,QAAY,CAAC9wB,CAAD,CAAU+nB,CAAV,CAAsB,CAChCvkB,CAAA4rB,EAAA,EACA5rB,EAAAstB,aAAA,CAAyB9wB,CAAzB,CAAkC+nB,CAAlC,CAFgC,CAhBlB,CAwBhB,aAAA0D,QAAY,CAACzrB,CAAD,CAAU,CACpBwD,CAAA4rB,EAAA,EACA5rB,EAAAioB,aAAA,CAAyBzrB,CAAzB,CAFoB,CAxBN,CAgChB,cAAA2vB,QAAa,CAAC5H,CAAD,CAAa,CACxBvkB,CAAA4rB,EAAA,EACA5rB,EAAAmsB,cAAA,CAA0B5H,CAA1B,CAFwB,CAhCV,CA0ChB,sBAAAmJ,QAAqB,CAAClxB,CAAD,CAAUqoB,CAAV,CAAoB,CACvC,MAAO7kB,EAAA0tB,sBAAA,CAAkClxB,CAAlC,CAA2CqoB,CAA3C,CADgC,CA1CzB,CA8ChB9H,UfzBWC,CerBK,CAgDhBP,af7DWA,CeaK,CAmDdqP,GAAJ,GACEj+B,MAAAivB,SAAAgP,UADF,CAC8BA,EAD9B,CAIIJ;EAAJ,GACE79B,MAAAivB,SAAA4O,qBADF,CACyCA,EADzC,C,CC5DA,IAAI96B,GAAW/C,MAAA+C,SAGf/C,OAAAugC,cAAA,CAAuBvgC,MAAAugC,cAAvB,EAA+C,EAE/CC,SAASA,GAAI,EAAG,CACdpF,qBAAA,CAAsB,QAAA,EAAM,CAC1Bp7B,MAAAugC,cAAAE,MAAA,CAA6B,CAAA,CAC7BzgC,OAAA+C,SAAAmE,cAAA,CAA8B,IAAIoQ,WAAJ,CAAgB,oBAAhB,CAAsC,CAAEZ,QAAS,CAAA,CAAX,CAAtC,CAA9B,CAF0B,CAA5B,CADc,CAOhBgqB,QAASA,GAAI,EAAG,CACdF,EAAA,EACAz9B,GAAA+D,oBAAA,CAA6B,kBAA7B,CAAiD45B,EAAjD,CAFc,CAKY,SAA5B,GAAI39B,EAAA0d,WAAJ,CACE+f,EAAA,EADF,CAGEz9B,EAAA8D,iBAAA,CAA0B,kBAA1B,CAA8C65B,EAA9C","file":"webcomponents-sd-ce.js","sourcesContent":["/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n\nexport class ShadyData {\n constructor() {\n /** @type {ShadowRoot} */\n this.root = null;\n /** @type {ShadowRoot} */\n this.publicRoot = null;\n this.dirty = false;\n this.observer = null;\n /** @type {Array<Node>} */\n this.assignedNodes = null;\n /** @type {Element} */\n this.assignedSlot = null;\n /** @type {Array<Node>} */\n this._previouslyAssignedNodes = null;\n /** @type {Element} */\n this._prevAssignedSlot = null;\n /** @type {Array<Node>} */\n this.flattenedNodes = null;\n this.ownerShadyRoot = undefined;\n /** @type {Node|undefined} */\n this.parentNode = undefined;\n /** @type {Node|undefined} */\n this.firstChild = undefined;\n /** @type {Node|undefined} */\n this.lastChild = undefined;\n /** @type {Node|undefined} */\n this.previousSibling = undefined;\n /** @type {Node|undefined} */\n this.nextSibling = undefined;\n /** @type {Array<Node>|undefined} */\n this.childNodes = undefined;\n this.__outsideAccessors = false;\n this.__insideAccessors = false;\n }\n\n toJSON() {\n return {};\n }\n}\n\nexport function ensureShadyDataForNode(node) {\n if (!node.__shady) {\n node.__shady = new ShadyData();\n }\n return node.__shady;\n}\n\nexport function shadyDataForNode(node) {\n return node && node.__shady;\n}\n",null,null,null,null,null,"/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport {shadyDataForNode} from './shady-data.js';\n\nexport let settings = window['ShadyDOM'] || {};\n\nsettings.hasNativeShadowDOM = Boolean(Element.prototype.attachShadow && Node.prototype.getRootNode);\n\nlet desc = Object.getOwnPropertyDescriptor(Node.prototype, 'firstChild');\n\nsettings.hasDescriptors = Boolean(desc && desc.configurable && desc.get);\nsettings.inUse = settings['force'] || !settings.hasNativeShadowDOM;\n\n// Default to using native accessors (instead of treewalker) only for\n// IE/Edge where they are faster.\nconst IS_IE = navigator.userAgent.match('Trident');\nconst IS_EDGE = navigator.userAgent.match('Edge');\nif (settings.useNativeAccessors === undefined) {\n settings.useNativeAccessors = settings.hasDescriptors && (IS_IE || IS_EDGE);\n}\n\nexport function isTrackingLogicalChildNodes(node) {\n const nodeData = shadyDataForNode(node);\n return (nodeData && nodeData.firstChild !== undefined);\n}\n\nexport function isShadyRoot(obj) {\n return Boolean(obj._localName === 'ShadyRoot');\n}\n\nexport function ownerShadyRootForNode(node) {\n let root = node.getRootNode();\n if (isShadyRoot(root)) {\n return root;\n }\n}\n\nlet p = Element.prototype;\nlet matches = p.matches || p.matchesSelector ||\n p.mozMatchesSelector || p.msMatchesSelector ||\n p.oMatchesSelector || p.webkitMatchesSelector;\n\nexport function matchesSelector(element, selector) {\n return matches.call(element, selector);\n}\n\nfunction copyOwnProperty(name, source, target) {\n let pd = Object.getOwnPropertyDescriptor(source, name);\n if (pd) {\n Object.defineProperty(target, name, pd);\n }\n}\n\nexport function extend(target, source) {\n if (target && source) {\n let n$ = Object.getOwnPropertyNames(source);\n for (let i=0, n; (i<n$.length) && (n=n$[i]); i++) {\n copyOwnProperty(n, source, target);\n }\n }\n return target || source;\n}\n\nexport function extendAll(target, ...sources) {\n for (let i=0; i < sources.length; i++) {\n extend(target, sources[i]);\n }\n return target;\n}\n\nexport function mixin(target, source) {\n for (var i in source) {\n target[i] = source[i];\n }\n return target;\n}\n\nexport function patchPrototype(obj, mixin) {\n let proto = Object.getPrototypeOf(obj);\n if (!proto.hasOwnProperty('__patchProto')) {\n let patchProto = Object.create(proto);\n patchProto.__sourceProto = proto;\n extend(patchProto, mixin);\n proto['__patchProto'] = patchProto;\n }\n // old browsers don't have setPrototypeOf\n obj.__proto__ = proto['__patchProto'];\n}\n\n\nlet twiddle = document.createTextNode('');\nlet content = 0;\nlet queue = [];\nnew MutationObserver(() => {\n while (queue.length) {\n // catch errors in user code...\n try {\n queue.shift()();\n } catch(e) {\n // enqueue another record and throw\n twiddle.textContent = content++;\n throw(e);\n }\n }\n}).observe(twiddle, {characterData: true});\n\n// use MutationObserver to get microtask async timing.\nexport function microtask(callback) {\n queue.push(callback);\n twiddle.textContent = content++;\n}\n\nexport const hasDocumentContains = Boolean(document.contains);\n\nexport function contains(container, node) {\n while (node) {\n if (node == container) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\n\n// render enqueuer/flusher\nlet flushList = [];\nlet scheduled;\nexport function enqueue(callback) {\n if (!scheduled) {\n scheduled = true;\n utils.microtask(flush);\n }\n flushList.push(callback);\n}\n\nexport function flush() {\n scheduled = false;\n let didFlush = Boolean(flushList.length);\n while (flushList.length) {\n flushList.shift()();\n }\n return didFlush;\n}\n\nflush['list'] = flushList;\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\nimport {ensureShadyDataForNode} from './shady-data.js';\n\nclass AsyncObserver {\n\n constructor() {\n this._scheduled = false;\n this.addedNodes = [];\n this.removedNodes = [];\n this.callbacks = new Set();\n }\n\n schedule() {\n if (!this._scheduled) {\n this._scheduled = true;\n utils.microtask(() => {\n this.flush();\n });\n }\n }\n\n flush() {\n if (this._scheduled) {\n this._scheduled = false;\n let mutations = this.takeRecords();\n if (mutations.length) {\n this.callbacks.forEach(function(cb) {\n cb(mutations);\n });\n }\n }\n }\n\n takeRecords() {\n if (this.addedNodes.length || this.removedNodes.length) {\n let mutations = [{\n addedNodes: this.addedNodes,\n removedNodes: this.removedNodes\n }];\n this.addedNodes = [];\n this.removedNodes = [];\n return mutations;\n }\n return [];\n }\n\n}\n\n// TODO(sorvell): consider instead polyfilling MutationObserver\n// directly so that users do not have to fork their code.\n// Supporting the entire api may be challenging: e.g. filtering out\n// removed nodes in the wrong scope and seeing non-distributing\n// subtree child mutations.\nexport let observeChildren = function(node, callback) {\n const sd = ensureShadyDataForNode(node);\n if (!sd.observer) {\n sd.observer = new AsyncObserver();\n }\n sd.observer.callbacks.add(callback);\n let observer = sd.observer;\n return {\n _callback: callback,\n _observer: observer,\n _node: node,\n takeRecords() {\n return observer.takeRecords()\n }\n };\n}\n\nexport let unobserveChildren = function(handle) {\n let observer = handle && handle._observer;\n if (observer) {\n observer.callbacks.delete(handle._callback);\n if (!observer.callbacks.size) {\n ensureShadyDataForNode(handle._node).observer = null;\n }\n }\n}\n\nexport function filterMutations(mutations, target) {\n /** @const {Node} */\n const targetRootNode = target.getRootNode();\n return mutations.map(function(mutation) {\n /** @const {boolean} */\n const mutationInScope = (targetRootNode === mutation.target.getRootNode());\n if (mutationInScope && mutation.addedNodes) {\n let nodes = Array.from(mutation.addedNodes).filter(function(n) {\n return (targetRootNode === n.getRootNode());\n });\n if (nodes.length) {\n mutation = Object.create(mutation);\n Object.defineProperty(mutation, 'addedNodes', {\n value: nodes,\n configurable: true\n });\n return mutation;\n }\n } else if (mutationInScope) {\n return mutation;\n }\n }).filter(function(m) { return m});\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nexport let appendChild = Element.prototype.appendChild;\nexport let insertBefore = Element.prototype.insertBefore;\nexport let replaceChild = Element.prototype.replaceChild;\nexport let removeChild = Element.prototype.removeChild;\nexport let setAttribute = Element.prototype.setAttribute;\nexport let removeAttribute = Element.prototype.removeAttribute;\nexport let cloneNode = Element.prototype.cloneNode;\nexport let importNode = Document.prototype.importNode;\nexport let addEventListener = Element.prototype.addEventListener;\nexport let removeEventListener = Element.prototype.removeEventListener;\nexport let windowAddEventListener = Window.prototype.addEventListener;\nexport let windowRemoveEventListener = Window.prototype.removeEventListener;\nexport let dispatchEvent = Element.prototype.dispatchEvent;\nexport let contains = Node.prototype.contains || HTMLElement.prototype.contains;\nexport let getElementById = Document.prototype.getElementById;\nexport let elementQuerySelector = Element.prototype.querySelector;\nexport let fragmentQuerySelector = DocumentFragment.prototype.querySelector;\nexport let documentQuerySelector = Document.prototype.querySelector;\nexport let querySelector = function(selector) {\n switch (this.nodeType) {\n case Node.ELEMENT_NODE:\n return elementQuerySelector.call(this, selector);\n case Node.DOCUMENT_NODE:\n return documentQuerySelector.call(this, selector);\n default:\n return fragmentQuerySelector.call(this, selector);\n }\n};\nexport let elementQuerySelectorAll = Element.prototype.querySelectorAll;\nexport let fragmentQuerySelectorAll = DocumentFragment.prototype.querySelectorAll;\nexport let documentQuerySelectorAll = Document.prototype.querySelectorAll;\nexport let querySelectorAll = function(selector) {\n switch (this.nodeType) {\n case Node.ELEMENT_NODE:\n return elementQuerySelectorAll.call(this, selector);\n case Node.DOCUMENT_NODE:\n return documentQuerySelectorAll.call(this, selector);\n default:\n return fragmentQuerySelectorAll.call(this, selector);\n }\n};","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n// Cribbed from ShadowDOM polyfill\n// https://github.com/webcomponents/webcomponentsjs/blob/master/src/ShadowDOM/wrappers/HTMLElement.js#L28\n/////////////////////////////////////////////////////////////////////////////\n// innerHTML and outerHTML\n\n// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\nlet escapeAttrRegExp = /[&\\u00A0\"]/g;\nlet escapeDataRegExp = /[&\\u00A0<>]/g;\n\nfunction escapeReplace(c) {\n switch (c) {\n case '&':\n return '&amp;';\n case '<':\n return '&lt;';\n case '>':\n return '&gt;';\n case '\"':\n return '&quot;';\n case '\\u00A0':\n return '&nbsp;';\n }\n}\n\nfunction escapeAttr(s) {\n return s.replace(escapeAttrRegExp, escapeReplace);\n}\n\nfunction escapeData(s) {\n return s.replace(escapeDataRegExp, escapeReplace);\n}\n\nfunction makeSet(arr) {\n let set = {};\n for (let i = 0; i < arr.length; i++) {\n set[arr[i]] = true;\n }\n return set;\n}\n\n// http://www.whatwg.org/specs/web-apps/current-work/#void-elements\nlet voidElements = makeSet([\n 'area',\n 'base',\n 'br',\n 'col',\n 'command',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n]);\n\nlet plaintextParents = makeSet([\n 'style',\n 'script',\n 'xmp',\n 'iframe',\n 'noembed',\n 'noframes',\n 'plaintext',\n 'noscript'\n]);\n\n/**\n * @param {Node} node\n * @param {Node} parentNode\n * @param {Function=} callback\n */\nexport function getOuterHTML(node, parentNode, callback) {\n switch (node.nodeType) {\n case Node.ELEMENT_NODE: {\n let tagName = node.localName;\n let s = '<' + tagName;\n let attrs = node.attributes;\n for (let i = 0, attr; (attr = attrs[i]); i++) {\n s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n }\n s += '>';\n if (voidElements[tagName]) {\n return s;\n }\n return s + getInnerHTML(node, callback) + '</' + tagName + '>';\n }\n case Node.TEXT_NODE: {\n let data = /** @type {Text} */ (node).data;\n if (parentNode && plaintextParents[parentNode.localName]) {\n return data;\n }\n return escapeData(data);\n }\n case Node.COMMENT_NODE: {\n return '<!--' + /** @type {Comment} */ (node).data + '-->';\n }\n default: {\n window.console.error(node);\n throw new Error('not implemented');\n }\n }\n}\n\n/**\n * @param {Node} node\n * @param {Function=} callback\n */\nexport function getInnerHTML(node, callback) {\n if (node.localName === 'template') {\n node = /** @type {HTMLTemplateElement} */ (node).content;\n }\n let s = '';\n let c$ = callback ? callback(node) : node.childNodes;\n for (let i=0, l=c$.length, child; (i<l) && (child=c$[i]); i++) {\n s += getOuterHTML(child, node, callback);\n }\n return s;\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport {getInnerHTML} from './innerHTML.js';\n\nlet nodeWalker = document.createTreeWalker(document, NodeFilter.SHOW_ALL,\n null, false);\n\nlet elementWalker = document.createTreeWalker(document, NodeFilter.SHOW_ELEMENT,\n null, false);\n\nexport function parentNode(node) {\n nodeWalker.currentNode = node;\n return nodeWalker.parentNode();\n}\n\nexport function firstChild(node) {\n nodeWalker.currentNode = node;\n return nodeWalker.firstChild();\n}\n\nexport function lastChild(node) {\n nodeWalker.currentNode = node;\n return nodeWalker.lastChild();\n}\n\nexport function previousSibling(node) {\n nodeWalker.currentNode = node;\n return nodeWalker.previousSibling();\n}\n\nexport function nextSibling(node) {\n nodeWalker.currentNode = node;\n return nodeWalker.nextSibling();\n}\n\nexport function childNodes(node) {\n let nodes = [];\n nodeWalker.currentNode = node;\n let n = nodeWalker.firstChild();\n while (n) {\n nodes.push(n);\n n = nodeWalker.nextSibling();\n }\n return nodes;\n}\n\nexport function parentElement(node) {\n elementWalker.currentNode = node;\n return elementWalker.parentNode();\n}\n\nexport function firstElementChild(node) {\n elementWalker.currentNode = node;\n return elementWalker.firstChild();\n}\n\nexport function lastElementChild(node) {\n elementWalker.currentNode = node;\n return elementWalker.lastChild();\n}\n\nexport function previousElementSibling(node) {\n elementWalker.currentNode = node;\n return elementWalker.previousSibling();\n}\n\nexport function nextElementSibling(node) {\n elementWalker.currentNode = node;\n return elementWalker.nextSibling();\n}\n\nexport function children(node) {\n let nodes = [];\n elementWalker.currentNode = node;\n let n = elementWalker.firstChild();\n while (n) {\n nodes.push(n);\n n = elementWalker.nextSibling();\n }\n return nodes;\n}\n\nexport function innerHTML(node) {\n return getInnerHTML(node, (n) => childNodes(n));\n}\n\nexport function textContent(node) {\n /* eslint-disable no-case-declarations */\n switch (node.nodeType) {\n case Node.ELEMENT_NODE:\n case Node.DOCUMENT_FRAGMENT_NODE:\n let textWalker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT,\n null, false);\n let content = '', n;\n while ( (n = textWalker.nextNode()) ) {\n // TODO(sorvell): can't use textContent since we patch it on Node.prototype!\n // However, should probably patch it only on element.\n content += n.nodeValue;\n }\n return content;\n default:\n return node.nodeValue;\n }\n /* eslint-enable */\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport * as utils from './utils.js';\n\nconst hasDescriptors = utils.settings.hasDescriptors;\n\n// Find descriptor on the \"lowest\" native prototype. Safe as these are not\n// overridden and we call these on nodes.\nconst nativeProtos = [Node.prototype, Element.prototype, HTMLElement.prototype];\n// note, avoid Array.find for IE11 compat.\nfunction findNativeProtoWithDescriptor(name) {\n for (let i=0; i < nativeProtos.length; i++) {\n const proto = nativeProtos[i];\n if (proto.hasOwnProperty(name)) {\n return proto;\n }\n }\n}\nfunction findNodeDescriptor(name) {\n const proto = findNativeProtoWithDescriptor(name);\n if (!proto) {\n throw Error(`Could not find descriptor for ${name}`);\n }\n return Object.getOwnPropertyDescriptor(proto, name);\n}\n\nexport const nodeAccessors = hasDescriptors ? {\n parentNode: findNodeDescriptor('parentNode'),\n firstChild: findNodeDescriptor('firstChild'),\n lastChild: findNodeDescriptor('lastChild'),\n previousSibling: findNodeDescriptor('previousSibling'),\n nextSibling: findNodeDescriptor('nextSibling'),\n childNodes: findNodeDescriptor('childNodes'),\n parentElement: findNodeDescriptor('parentElement'),\n previousElementSibling: findNodeDescriptor('previousElementSibling'),\n nextElementSibling: findNodeDescriptor('nextElementSibling'),\n innerHTML: findNodeDescriptor('innerHTML'),\n textContent: findNodeDescriptor('textContent'),\n firstElementChild: findNodeDescriptor('firstElementChild'),\n lastElementChild: findNodeDescriptor('lastElementChild'),\n children: findNodeDescriptor('children'),\n} : {};\n\nexport const fragmentAccessors = hasDescriptors ? {\n firstElementChild: Object.getOwnPropertyDescriptor(\n DocumentFragment.prototype, 'firstElementChild'),\n lastElementChild: Object.getOwnPropertyDescriptor(\n DocumentFragment.prototype, 'lastElementChild'),\n children: Object.getOwnPropertyDescriptor(\n DocumentFragment.prototype, 'children')\n} : {};\n\nexport const documentAccessors = hasDescriptors ? {\n firstElementChild: Object.getOwnPropertyDescriptor(\n Document.prototype, 'firstElementChild'),\n lastElementChild: Object.getOwnPropertyDescriptor(\n Document.prototype, 'lastElementChild'),\n children: Object.getOwnPropertyDescriptor(\n Document.prototype, 'children')\n} : {};\n\nexport function parentNode(node) {\n return nodeAccessors.parentNode.get.call(node);\n}\n\nexport function firstChild(node) {\n return nodeAccessors.firstChild.get.call(node);\n}\n\nexport function lastChild(node) {\n return nodeAccessors.lastChild.get.call(node);\n}\n\nexport function previousSibling(node) {\n return nodeAccessors.previousSibling.get.call(node);\n}\n\nexport function nextSibling(node) {\n return nodeAccessors.nextSibling.get.call(node);\n}\n\nexport function childNodes(node) {\n return Array.prototype.slice.call(nodeAccessors.childNodes.get.call(node));\n}\n\nexport function parentElement(node) {\n return nodeAccessors.parentElement.get.call(node);\n}\n\nexport function previousElementSibling(node) {\n return nodeAccessors.previousElementSibling.get.call(node);\n}\n\nexport function nextElementSibling(node) {\n return nodeAccessors.nextElementSibling.get.call(node);\n}\n\nexport function innerHTML(node) {\n return nodeAccessors.innerHTML.get.call(node);\n}\n\nexport function textContent(node) {\n return nodeAccessors.textContent.get.call(node);\n}\n\nexport function children(node) {\n let children;\n switch (node.nodeType) {\n case Node.DOCUMENT_FRAGMENT_NODE:\n children = fragmentAccessors.children.get.call(node);\n break;\n case Node.DOCUMENT_NODE:\n children = documentAccessors.children.get.call(node);\n break;\n default:\n children = nodeAccessors.children.get.call(node);\n break;\n }\n return Array.prototype.slice.call(children);\n}\n\nexport function firstElementChild(node) {\n switch (node.nodeType) {\n case Node.DOCUMENT_FRAGMENT_NODE:\n return fragmentAccessors.firstElementChild.get.call(node);\n case Node.DOCUMENT_NODE:\n return documentAccessors.firstElementChild.get.call(node);\n default:\n return nodeAccessors.firstElementChild.get.call(node);\n }\n}\n\nexport function lastElementChild(node) {\n switch (node.nodeType) {\n case Node.DOCUMENT_FRAGMENT_NODE:\n return fragmentAccessors.lastElementChild.get.call(node);\n case Node.DOCUMENT_NODE:\n return documentAccessors.lastElementChild.get.call(node);\n default:\n return nodeAccessors.lastElementChild.get.call(node);\n }\n}","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as nativeTreeWalker from './native-tree-walker.js';\nimport * as nativeTreeAccessors from './native-tree-accessors.js';\nimport * as utils from './utils.js';\n\nexport const accessors = utils.settings.useNativeAccessors ?\n nativeTreeAccessors : nativeTreeWalker;","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\nimport {getInnerHTML} from './innerHTML.js';\nimport {accessors as nativeTree} from './native-tree.js';\nimport {nodeAccessors as nativeAccessors} from './native-tree-accessors.js';\nimport {contains as nativeContains} from './native-methods.js';\nimport {ensureShadyDataForNode, shadyDataForNode} from './shady-data.js';\n\nfunction clearNode(node) {\n while (node.firstChild) {\n node.removeChild(node.firstChild);\n }\n}\n\nconst hasDescriptors = utils.settings.hasDescriptors;\nconst inertDoc = document.implementation.createHTMLDocument('inert');\n\nconst nativeIsConnectedAccessors =\n/** @type {ObjectPropertyDescriptor} */(\n Object.getOwnPropertyDescriptor(Node.prototype, 'isConnected')\n);\n\nconst nativeIsConnected = nativeIsConnectedAccessors && nativeIsConnectedAccessors.get;\n\nconst nativeActiveElementDescriptor =\n /** @type {ObjectPropertyDescriptor} */(\n Object.getOwnPropertyDescriptor(Document.prototype, 'activeElement')\n );\nfunction getDocumentActiveElement() {\n if (nativeActiveElementDescriptor && nativeActiveElementDescriptor.get) {\n return nativeActiveElementDescriptor.get.call(document);\n } else if (!utils.settings.hasDescriptors) {\n return document.activeElement;\n }\n}\n\nfunction activeElementForNode(node) {\n let active = getDocumentActiveElement();\n // In IE11, activeElement might be an empty object if the document is\n // contained in an iframe.\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/10998788/\n if (!active || !active.nodeType) {\n return null;\n }\n let isShadyRoot = !!(utils.isShadyRoot(node));\n if (node !== document) {\n // If this node isn't a document or shady root, then it doesn't have\n // an active element.\n if (!isShadyRoot) {\n return null;\n }\n // If this shady root's host is the active element or the active\n // element is not a descendant of the host (in the composed tree),\n // then it doesn't have an active element.\n if (node.host === active ||\n !nativeContains.call(node.host, active)) {\n return null;\n }\n }\n // This node is either the document or a shady root of which the active\n // element is a (composed) descendant of its host; iterate upwards to\n // find the active element's most shallow host within it.\n let activeRoot = utils.ownerShadyRootForNode(active);\n while (activeRoot && activeRoot !== node) {\n active = activeRoot.host;\n activeRoot = utils.ownerShadyRootForNode(active);\n }\n if (node === document) {\n // This node is the document, so activeRoot should be null.\n return activeRoot ? null : active;\n } else {\n // This node is a non-document shady root, and it should be\n // activeRoot.\n return activeRoot === node ? active : null;\n }\n}\n\nlet OutsideAccessors = {\n\n parentElement: {\n /** @this {Node} */\n get() {\n const nodeData = shadyDataForNode(this);\n let l = nodeData && nodeData.parentNode;\n if (l && l.nodeType !== Node.ELEMENT_NODE) {\n l = null;\n }\n return l !== undefined ? l : nativeTree.parentElement(this);\n },\n configurable: true\n },\n\n parentNode: {\n /** @this {Node} */\n get() {\n const nodeData = shadyDataForNode(this);\n const l = nodeData && nodeData.parentNode;\n return l !== undefined ? l : nativeTree.parentNode(this);\n },\n configurable: true\n },\n\n nextSibling: {\n /** @this {Node} */\n get() {\n const nodeData = shadyDataForNode(this);\n const l = nodeData && nodeData.nextSibling;\n return l !== undefined ? l : nativeTree.nextSibling(this);\n },\n configurable: true\n },\n\n previousSibling: {\n /** @this {Node} */\n get() {\n const nodeData = shadyDataForNode(this);\n const l = nodeData && nodeData.previousSibling;\n return l !== undefined ? l : nativeTree.previousSibling(this);\n },\n configurable: true\n },\n\n // fragment, element, document\n nextElementSibling: {\n /**\n * @this {HTMLElement}\n */\n get() {\n const nodeData = shadyDataForNode(this);\n if (nodeData && nodeData.nextSibling !== undefined) {\n let n = this.nextSibling;\n while (n && n.nodeType !== Node.ELEMENT_NODE) {\n n = n.nextSibling;\n }\n return n;\n } else {\n return nativeTree.nextElementSibling(this);\n }\n },\n configurable: true\n },\n\n previousElementSibling: {\n /**\n * @this {HTMLElement}\n */\n get() {\n const nodeData = shadyDataForNode(this);\n if (nodeData && nodeData.previousSibling !== undefined) {\n let n = this.previousSibling;\n while (n && n.nodeType !== Node.ELEMENT_NODE) {\n n = n.previousSibling;\n }\n return n;\n } else {\n return nativeTree.previousElementSibling(this);\n }\n },\n configurable: true\n }\n\n};\n\nexport const ClassNameAccessor = {\n className: {\n /**\n * @this {HTMLElement}\n */\n get() {\n return this.getAttribute('class') || '';\n },\n /**\n * @this {HTMLElement}\n */\n set(value) {\n this.setAttribute('class', value);\n },\n configurable: true\n }\n}\n\nexport const IsConnectedAccessor = {\n\n isConnected: {\n /**\n * @this {Node}\n */\n get() {\n if (nativeIsConnected && nativeIsConnected.call(this)) {\n return true;\n }\n if (this.nodeType == Node.DOCUMENT_FRAGMENT_NODE) {\n return false;\n }\n // Fast path for distributed nodes.\n const ownerDocument = this.ownerDocument;\n if (utils.hasDocumentContains) {\n if (nativeContains.call(ownerDocument, this)) {\n return true;\n }\n } else if (ownerDocument.documentElement &&\n nativeContains.call(ownerDocument.documentElement, this)) {\n return true;\n }\n // Slow path for non-distributed nodes.\n let node = this;\n while (node && !(node instanceof Document)) {\n node = node.parentNode || (utils.isShadyRoot(node) ? /** @type {ShadowRoot} */(node).host : undefined);\n }\n return !!(node && node instanceof Document);\n },\n configurable: true\n }\n};\n\nlet InsideAccessors = {\n\n childNodes: {\n /**\n * @this {HTMLElement}\n */\n get() {\n let childNodes;\n if (utils.isTrackingLogicalChildNodes(this)) {\n const nodeData = shadyDataForNode(this);\n if (!nodeData.childNodes) {\n nodeData.childNodes = [];\n for (let n=this.firstChild; n; n=n.nextSibling) {\n nodeData.childNodes.push(n);\n }\n }\n childNodes = nodeData.childNodes;\n } else {\n childNodes = nativeTree.childNodes(this);\n }\n childNodes.item = function(index) {\n return childNodes[index];\n }\n return childNodes;\n },\n configurable: true\n },\n\n childElementCount: {\n /** @this {HTMLElement} */\n get() {\n return this.children.length;\n },\n configurable: true\n },\n\n firstChild: {\n /** @this {HTMLElement} */\n get() {\n const nodeData = shadyDataForNode(this);\n const l = nodeData && nodeData.firstChild;\n return l !== undefined ? l : nativeTree.firstChild(this);\n },\n configurable: true\n },\n\n lastChild: {\n /** @this {HTMLElement} */\n get() {\n const nodeData = shadyDataForNode(this);\n const l = nodeData && nodeData.lastChild;\n return l !== undefined ? l : nativeTree.lastChild(this);\n },\n configurable: true\n },\n\n textContent: {\n /**\n * @this {HTMLElement}\n */\n get() {\n if (utils.isTrackingLogicalChildNodes(this)) {\n let tc = [];\n for (let i = 0, cn = this.childNodes, c; (c = cn[i]); i++) {\n if (c.nodeType !== Node.COMMENT_NODE) {\n tc.push(c.textContent);\n }\n }\n return tc.join('');\n } else {\n return nativeTree.textContent(this);\n }\n },\n /**\n * @this {HTMLElement}\n * @param {string} text\n */\n set(text) {\n if (typeof text === 'undefined' || text === null) {\n text = ''\n }\n switch (this.nodeType) {\n case Node.ELEMENT_NODE:\n case Node.DOCUMENT_FRAGMENT_NODE:\n if (!utils.isTrackingLogicalChildNodes(this) && hasDescriptors) {\n // may be removing a nested slot but fast path if we know we are not.\n const firstChild = this.firstChild;\n if (firstChild != this.lastChild ||\n (firstChild && firstChild.nodeType != Node.TEXT_NODE)) {\n clearNode(this);\n }\n nativeAccessors.textContent.set.call(this, text);\n } else {\n clearNode(this);\n // Document fragments must have no childnodes if setting a blank string\n if (text.length > 0 || this.nodeType === Node.ELEMENT_NODE) {\n this.appendChild(document.createTextNode(text));\n }\n }\n break;\n default:\n // TODO(sorvell): can't do this if patch nodeValue.\n this.nodeValue = text;\n break;\n }\n },\n configurable: true\n },\n\n // fragment, element, document\n firstElementChild: {\n /**\n * @this {HTMLElement}\n */\n get() {\n const nodeData = shadyDataForNode(this);\n if (nodeData && nodeData.firstChild !== undefined) {\n let n = this.firstChild;\n while (n && n.nodeType !== Node.ELEMENT_NODE) {\n n = n.nextSibling;\n }\n return n;\n } else {\n return nativeTree.firstElementChild(this);\n }\n },\n configurable: true\n },\n\n lastElementChild: {\n /**\n * @this {HTMLElement}\n */\n get() {\n const nodeData = shadyDataForNode(this);\n if (nodeData && nodeData.lastChild !== undefined) {\n let n = this.lastChild;\n while (n && n.nodeType !== Node.ELEMENT_NODE) {\n n = n.previousSibling;\n }\n return n;\n } else {\n return nativeTree.lastElementChild(this);\n }\n },\n configurable: true\n },\n\n children: {\n /**\n * @this {HTMLElement}\n */\n get() {\n let children;\n if (utils.isTrackingLogicalChildNodes(this)) {\n children = Array.prototype.filter.call(this.childNodes, function(n) {\n return (n.nodeType === Node.ELEMENT_NODE);\n });\n } else {\n children = nativeTree.children(this);\n }\n children.item = function(index) {\n return children[index];\n }\n return children;\n },\n configurable: true\n },\n\n // element (HTMLElement on IE11)\n innerHTML: {\n /**\n * @this {HTMLElement}\n */\n get() {\n if (utils.isTrackingLogicalChildNodes(this)) {\n const content = this.localName === 'template' ?\n /** @type {HTMLTemplateElement} */(this).content : this;\n return getInnerHTML(content);\n } else {\n return nativeTree.innerHTML(this);\n }\n },\n /**\n * @this {HTMLElement}\n */\n set(text) {\n const content = this.localName === 'template' ?\n /** @type {HTMLTemplateElement} */(this).content : this;\n clearNode(content);\n let containerName = this.localName;\n // avoid creating a template so we don't have to pull nodes form `.content`\n if (!containerName || containerName === 'template') {\n containerName = 'div';\n }\n const htmlContainer = inertDoc.createElement(containerName);\n if (hasDescriptors) {\n nativeAccessors.innerHTML.set.call(htmlContainer, text);\n } else {\n htmlContainer.innerHTML = text;\n }\n while (htmlContainer.firstChild) {\n content.appendChild(htmlContainer.firstChild);\n }\n },\n configurable: true\n }\n\n};\n\n// Note: Can be patched on element prototype on all browsers.\n// Must be patched on instance on browsers that support native Shadow DOM\n// but do not have builtin accessors (old Chrome).\nexport let ShadowRootAccessor = {\n\n shadowRoot: {\n /**\n * @this {HTMLElement}\n */\n get() {\n const nodeData = shadyDataForNode(this);\n return nodeData && nodeData.publicRoot || null;\n },\n configurable: true\n }\n};\n\n// Note: Can be patched on document prototype on browsers with builtin accessors.\n// Must be patched separately on simulated ShadowRoot.\n// Must be patched as `_activeElement` on browsers without builtin accessors.\nexport let ActiveElementAccessor = {\n\n activeElement: {\n /**\n * @this {HTMLElement}\n */\n get() {\n return activeElementForNode(this);\n },\n /**\n * @this {HTMLElement}\n */\n set() {},\n configurable: true\n }\n\n};\n\n// patch a group of descriptors on an object only if it exists or if the `force`\n// argument is true.\n/**\n * @param {!Object} obj\n * @param {!Object} descriptors\n * @param {boolean=} force\n */\nfunction patchAccessorGroup(obj, descriptors, force) {\n for (let p in descriptors) {\n let objDesc = Object.getOwnPropertyDescriptor(obj, p);\n if ((objDesc && objDesc.configurable) ||\n (!objDesc && force)) {\n Object.defineProperty(obj, p, descriptors[p]);\n } else if (force) {\n console.warn('Could not define', p, 'on', obj); // eslint-disable-line no-console\n }\n }\n}\n\n// patch dom accessors on proto where they exist\nexport function patchAccessors(proto) {\n patchAccessorGroup(proto, OutsideAccessors);\n patchAccessorGroup(proto, ClassNameAccessor);\n patchAccessorGroup(proto, InsideAccessors);\n patchAccessorGroup(proto, ActiveElementAccessor);\n}\n\nexport function patchShadowRootAccessors(proto) {\n proto.__proto__ = DocumentFragment.prototype;\n // ensure element descriptors (IE/Edge don't have em)\n patchAccessorGroup(proto, OutsideAccessors, true);\n patchAccessorGroup(proto, InsideAccessors, true);\n patchAccessorGroup(proto, ActiveElementAccessor, true);\n // Ensure native properties are all safely wrapped since ShadowRoot is not an\n // actual DocumentFragment instance.\n Object.defineProperties(proto, {\n nodeType: {\n value: Node.DOCUMENT_FRAGMENT_NODE,\n configurable: true\n },\n nodeName: {\n value: '#document-fragment',\n configurable: true\n },\n nodeValue: {\n value: null,\n configurable: true\n }\n });\n // make undefined\n [\n 'localName',\n 'namespaceURI',\n 'prefix'\n ].forEach((prop) => {\n Object.defineProperty(proto, prop, {\n value: undefined,\n configurable: true\n });\n });\n // defer properties to host\n [\n 'ownerDocument',\n 'baseURI',\n 'isConnected'\n ].forEach((prop) => {\n Object.defineProperty(proto, prop, {\n get() {\n return this.host[prop];\n },\n configurable: true\n });\n });\n}\n\n// ensure an element has patched \"outside\" accessors; no-op when not needed\nexport let patchOutsideElementAccessors = utils.settings.hasDescriptors ?\n function() {} : function(element) {\n const sd = ensureShadyDataForNode(element);\n if (!sd.__outsideAccessors) {\n sd.__outsideAccessors = true;\n patchAccessorGroup(element, OutsideAccessors, true);\n patchAccessorGroup(element, ClassNameAccessor, true);\n }\n }\n\n// ensure an element has patched \"inside\" accessors; no-op when not needed\nexport let patchInsideElementAccessors = utils.settings.hasDescriptors ?\n function() {} : function(element) {\n const sd = ensureShadyDataForNode(element);\n if (!sd.__insideAccessors) {\n patchAccessorGroup(element, InsideAccessors, true);\n patchAccessorGroup(element, ShadowRootAccessor, true);\n }\n }\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport {calculateSplices} from './array-splice.js';\nimport * as utils from './utils.js';\nimport {enqueue} from './flush.js';\nimport {recordChildNodes} from './logical-tree.js';\nimport {removeChild, insertBefore, dispatchEvent} from './native-methods.js';\nimport {accessors} from './native-tree.js';\nimport {ensureShadyDataForNode, shadyDataForNode} from './shady-data.js';\n\nconst {parentNode, childNodes} = accessors;\n\n// Do not export this object. It must be passed as the first argument to the\n// ShadyRoot constructor in `attachShadow` to prevent the constructor from\n// throwing. This prevents the user from being able to manually construct a\n// ShadyRoot (i.e. `new ShadowRoot()`).\nconst ShadyRootConstructionToken = {};\n\nconst CATCHALL_NAME = '__catchall';\nconst SHADYROOT_NAME = 'ShadyRoot';\n\nconst MODE_CLOSED = 'closed';\n\nfunction ancestorList(node) {\n let ancestors = [];\n do {\n ancestors.unshift(node);\n } while ((node = node.parentNode));\n return ancestors;\n}\n\n/**\n * @constructor\n * @extends {ShadowRoot}\n */\nexport class ShadyRoot {\n\n constructor(token, host, options) {\n if (token !== ShadyRootConstructionToken) {\n throw new TypeError('Illegal constructor');\n }\n // NOTE: set a fake local name so this element can be\n // distinguished from a DocumentFragment when patching.\n // FF doesn't allow this to be `localName`\n this._localName = SHADYROOT_NAME;\n const c$ = childNodes(host);\n // root <=> host\n this.host = host;\n this._mode = options && options.mode;\n // logical dom setup\n recordChildNodes(host, c$);\n const hostData = shadyDataForNode(host);\n hostData.root = this;\n hostData.publicRoot = this._mode !== MODE_CLOSED ? this : null;\n // setup root\n const rootData = ensureShadyDataForNode(this);\n rootData.firstChild = rootData.lastChild =\n rootData.parentNode = rootData.nextSibling =\n rootData.previousSibling = null;\n rootData.childNodes = [];\n // state flags\n this._renderPending = false;\n this._hasRendered = false;\n // marsalled lazily\n this._slotList = null;\n this._slotMap = null;\n this._pendingSlots = null;\n // fast path initial render: remove existing physical dom.\n for (let i=0, l=c$.length; i < l; i++) {\n removeChild.call(host, c$[i])\n }\n }\n\n // async render\n _asyncRender() {\n if (!this._renderPending) {\n this._renderPending = true;\n enqueue(() => this._render());\n }\n }\n\n // returns the oldest renderPending ancestor root.\n _getRenderRoot() {\n let renderRoot;\n let root = this;\n while (root) {\n if (root._renderPending) {\n renderRoot = root;\n }\n root = root._rendererForHost();\n }\n return renderRoot;\n }\n\n // Returns the shadyRoot `this.host` if `this.host`\n // has children that require distribution.\n _rendererForHost() {\n let root = this.host.getRootNode();\n if (utils.isShadyRoot(root)) {\n let c$ = this.host.childNodes;\n for (let i=0, c; i < c$.length; i++) {\n c = c$[i];\n if (this._isInsertionPoint(c)) {\n return root;\n }\n }\n }\n }\n\n _render() {\n const root = this._getRenderRoot();\n if (root) {\n root['_renderRoot']();\n }\n }\n\n // NOTE: avoid renaming to ease testability.\n ['_renderRoot']() {\n this._renderPending = false;\n if (this._slotList) {\n this._distribute();\n this._compose();\n }\n this._hasRendered = true;\n }\n\n _distribute() {\n this._validateSlots();\n // capture # of previously assigned nodes to help determine if dirty.\n for (let i=0, slot; i < this._slotList.length; i++) {\n slot = this._slotList[i];\n this._clearSlotAssignedNodes(slot);\n }\n // distribute host children.\n for (let n=this.host.firstChild; n; n=n.nextSibling) {\n this._distributeNodeToSlot(n);\n }\n // fallback content, slotchange, and dirty roots\n for (let i=0; i < this._slotList.length; i++) {\n const slot = this._slotList[i];\n const slotData = shadyDataForNode(slot);\n // distribute fallback content\n if (!slotData.assignedNodes.length) {\n for (let n=slot.firstChild; n; n=n.nextSibling) {\n this._distributeNodeToSlot(n, slot);\n }\n }\n const slotParentData = shadyDataForNode(slot.parentNode);\n const slotParentRoot = slotParentData && slotParentData.root;\n if (slotParentRoot && slotParentRoot._hasInsertionPoint()) {\n slotParentRoot['_renderRoot']();\n }\n this._addAssignedToFlattenedNodes(slotData.flattenedNodes,\n slotData.assignedNodes);\n let prevAssignedNodes = slotData._previouslyAssignedNodes;\n if (prevAssignedNodes) {\n for (let i=0; i < prevAssignedNodes.length; i++) {\n shadyDataForNode(prevAssignedNodes[i])._prevAssignedSlot = null;\n }\n slotData._previouslyAssignedNodes = null;\n // dirty if previously less assigned nodes than previously assigned.\n if (prevAssignedNodes.length > slotData.assignedNodes.length) {\n slotData.dirty = true;\n }\n }\n /* Note: A slot is marked dirty whenever a node is newly assigned to it\n or a node is assigned to a different slot (done in `_distributeNodeToSlot`)\n or if the number of nodes assigned to the slot has decreased (done above);\n */\n if (slotData.dirty) {\n slotData.dirty = false;\n this._fireSlotChange(slot);\n }\n }\n }\n\n /**\n * Distributes given `node` to the appropriate slot based on its `slot`\n * attribute. If `forcedSlot` is given, then the node is distributed to the\n * `forcedSlot`.\n * Note: slot to which the node is assigned will be marked dirty for firing\n * `slotchange`.\n * @param {Node} node\n * @param {Node=} forcedSlot\n *\n */\n _distributeNodeToSlot(node, forcedSlot) {\n const nodeData = ensureShadyDataForNode(node);\n let oldSlot = nodeData._prevAssignedSlot;\n nodeData._prevAssignedSlot = null;\n let slot = forcedSlot;\n if (!slot) {\n let name = node.slot || CATCHALL_NAME;\n const list = this._slotMap[name];\n slot = list && list[0];\n }\n if (slot) {\n const slotData = ensureShadyDataForNode(slot);\n slotData.assignedNodes.push(node);\n nodeData.assignedSlot = slot;\n } else {\n nodeData.assignedSlot = undefined;\n }\n if (oldSlot !== nodeData.assignedSlot) {\n if (nodeData.assignedSlot) {\n ensureShadyDataForNode(nodeData.assignedSlot).dirty = true;\n }\n }\n }\n\n /**\n * Clears the assignedNodes tracking data for a given `slot`. Note, the current\n * assigned node data is tracked (via _previouslyAssignedNodes and\n * _prevAssignedSlot) to see if `slotchange` should fire. This data may be out\n * of date at this time because the assigned nodes may have already been\n * distributed to another root. This is ok since this data is only used to\n * track changes.\n * @param {HTMLSlotElement} slot\n */\n _clearSlotAssignedNodes(slot) {\n const slotData = shadyDataForNode(slot);\n let n$ = slotData.assignedNodes;\n slotData.assignedNodes = [];\n slotData.flattenedNodes = [];\n slotData._previouslyAssignedNodes = n$;\n if (n$) {\n for (let i=0; i < n$.length; i++) {\n let n = shadyDataForNode(n$[i]);\n n._prevAssignedSlot = n.assignedSlot;\n // only clear if it was previously set to this slot;\n // this helps ensure that if the node has otherwise been distributed\n // ignore it.\n if (n.assignedSlot === slot) {\n n.assignedSlot = null;\n }\n }\n }\n }\n\n _addAssignedToFlattenedNodes(flattened, assigned) {\n for (let i=0, n; (i<assigned.length) && (n=assigned[i]); i++) {\n if (n.localName == 'slot') {\n const nestedAssigned = shadyDataForNode(n).assignedNodes;\n if (nestedAssigned && nestedAssigned.length) {\n this._addAssignedToFlattenedNodes(flattened, nestedAssigned);\n }\n } else {\n flattened.push(assigned[i]);\n }\n }\n }\n\n _fireSlotChange(slot) {\n // NOTE: cannot bubble correctly here so not setting bubbles: true\n // Safari tech preview does not bubble but chrome does\n // Spec says it bubbles (https://dom.spec.whatwg.org/#mutation-observers)\n dispatchEvent.call(slot, new Event('slotchange'));\n const slotData = shadyDataForNode(slot);\n if (slotData.assignedSlot) {\n this._fireSlotChange(slotData.assignedSlot);\n }\n }\n\n // Reify dom such that it is at its correct rendering position\n // based on logical distribution.\n // NOTE: here we only compose parents of <slot> elements and not the\n // shadowRoot into the host. The latter is performend via a fast path\n // in the `logical-mutation`.insertBefore.\n _compose() {\n const slots = this._slotList;\n let composeList = [];\n for (let i=0; i < slots.length; i++) {\n const parent = slots[i].parentNode;\n /* compose node only if:\n (1) parent does not have a shadowRoot since shadowRoot has already\n composed into the host\n (2) we're not already composing it\n [consider (n^2) but rare better than Set]\n */\n const parentData = shadyDataForNode(parent);\n if (!(parentData && parentData.root) &&\n composeList.indexOf(parent) < 0) {\n composeList.push(parent);\n }\n }\n for (let i=0; i < composeList.length; i++) {\n const node = composeList[i];\n const targetNode = node === this ? this.host : node;\n this._updateChildNodes(targetNode, this._composeNode(node));\n }\n }\n\n // Returns the list of nodes which should be rendered inside `node`.\n _composeNode(node) {\n let children = [];\n let c$ = node.childNodes;\n for (let i = 0; i < c$.length; i++) {\n let child = c$[i];\n // Note: if we see a slot here, the nodes are guaranteed to need to be\n // composed here. This is because if there is redistribution, it has\n // already been handled by this point.\n if (this._isInsertionPoint(child)) {\n let flattenedNodes = shadyDataForNode(child).flattenedNodes;\n for (let j = 0; j < flattenedNodes.length; j++) {\n let distributedNode = flattenedNodes[j];\n children.push(distributedNode);\n }\n } else {\n children.push(child);\n }\n }\n return children;\n }\n\n _isInsertionPoint(node) {\n return node.localName == 'slot';\n }\n\n // Ensures that the rendered node list inside `container` is `children`.\n _updateChildNodes(container, children) {\n let composed = childNodes(container);\n let splices = calculateSplices(children, composed);\n // process removals\n for (let i=0, d=0, s; (i<splices.length) && (s=splices[i]); i++) {\n for (let j=0, n; (j < s.removed.length) && (n=s.removed[j]); j++) {\n // check if the node is still where we expect it is before trying\n // to remove it; this can happen if we move a node and\n // then schedule its previous host for distribution resulting in\n // the node being removed here.\n if (parentNode(n) === container) {\n removeChild.call(container, n);\n }\n // TODO(sorvell): avoid the need for splicing here.\n composed.splice(s.index + d, 1);\n }\n d -= s.addedCount;\n }\n // process adds\n for (let i=0, s, next; (i<splices.length) && (s=splices[i]); i++) { //eslint-disable-line no-redeclare\n next = composed[s.index];\n for (let j=s.index, n; j < s.index + s.addedCount; j++) {\n n = children[j];\n insertBefore.call(container, n, next);\n composed.splice(j, 0, n);\n }\n }\n }\n\n _ensureSlotData() {\n this._pendingSlots = this._pendingSlots || [];\n this._slotList = this._slotList || [];\n this._slotMap = this._slotMap || {};\n }\n\n _addSlots(slots) {\n this._ensureSlotData();\n this._pendingSlots.push(...slots);\n }\n\n _validateSlots() {\n if (this._pendingSlots && this._pendingSlots.length) {\n this._mapSlots(this._pendingSlots);\n this._pendingSlots = [];\n }\n }\n\n /**\n * Adds the given slots. Slots are maintained in an dom-ordered list.\n * In addition a map of name to slot is updated.\n */\n _mapSlots(slots) {\n let slotNamesToSort;\n for (let i=0; i < slots.length; i++) {\n let slot = slots[i];\n // ensure insertionPoints's and their parents have logical dom info.\n // save logical tree info\n // a. for shadyRoot\n // b. for insertion points (fallback)\n // c. for parents of insertion points\n recordChildNodes(slot);\n recordChildNodes(slot.parentNode);\n let name = this._nameForSlot(slot);\n if (this._slotMap[name]) {\n slotNamesToSort = slotNamesToSort || {};\n slotNamesToSort[name] = true;\n this._slotMap[name].push(slot);\n } else {\n this._slotMap[name] = [slot];\n }\n this._slotList.push(slot);\n }\n if (slotNamesToSort) {\n for (let n in slotNamesToSort) {\n this._slotMap[n] = this._sortSlots(this._slotMap[n]);\n }\n }\n }\n\n _nameForSlot(slot) {\n const name = slot['name'] || slot.getAttribute('name') || CATCHALL_NAME;\n slot.__slotName = name;\n return name;\n }\n\n /**\n * Slots are kept in an ordered list. Slots with the same name\n * are sorted here by tree order.\n */\n _sortSlots(slots) {\n // NOTE: Cannot use `compareDocumentPosition` because it's not polyfilled,\n // but the code here could be used to polyfill the preceeding/following info\n // in `compareDocumentPosition`.\n return slots.sort((a, b) => {\n let listA = ancestorList(a);\n let listB = ancestorList(b);\n for (var i=0; i < listA.length; i++) {\n let nA = listA[i];\n let nB = listB[i];\n if (nA !== nB) {\n let c$ = Array.from(nA.parentNode.childNodes);\n return c$.indexOf(nA) - c$.indexOf(nB);\n }\n }\n });\n }\n\n /**\n * Removes from tracked slot data any slots contained within `container` and\n * then updates the tracked data (_slotList and _slotMap).\n * Any removed slots also have their `assignedNodes` removed from comopsed dom.\n */\n _removeContainedSlots(container) {\n if (!this._slotList) {\n return;\n }\n this._validateSlots();\n let didRemove;\n const map = this._slotMap;\n for (let n in map) {\n let slots = map[n];\n for (let i=0; i < slots.length; i++) {\n let slot = slots[i];\n if (utils.contains(container, slot)) {\n slots.splice(i, 1);\n const x = this._slotList.indexOf(slot);\n if (x >= 0) {\n this._slotList.splice(x, 1);\n }\n i--;\n this._removeFlattenedNodes(slot);\n didRemove = true;\n }\n }\n }\n return didRemove;\n }\n\n _updateSlotName(slot) {\n if (!this._slotList) {\n return;\n }\n const oldName = slot.__slotName;\n const name = this._nameForSlot(slot);\n if (name === oldName) {\n return;\n }\n // remove from existing tracking\n let slots = this._slotMap[oldName];\n const i = slots.indexOf(slot);\n if (i >= 0) {\n slots.splice(i, 1);\n }\n // add to new location and sort if nedessary\n let list = this._slotMap[name] || (this._slotMap[name] = []);\n list.push(slot);\n if (list.length > 1) {\n this._slotMap[name] = this._sortSlots(list);\n }\n }\n\n _removeFlattenedNodes(slot) {\n const data = shadyDataForNode(slot);\n let n$ = data.flattenedNodes;\n if (n$) {\n for (let i=0; i<n$.length; i++) {\n let node = n$[i];\n let parent = parentNode(node);\n if (parent) {\n removeChild.call(parent, node);\n }\n }\n }\n data.flattenedNodes = [];\n data.assignedNodes = [];\n }\n\n _hasInsertionPoint() {\n this._validateSlots();\n return Boolean(this._slotList && this._slotList.length);\n }\n}\n\n/**\n Implements a pared down version of ShadowDOM's scoping, which is easy to\n polyfill across browsers.\n*/\nexport function attachShadow(host, options) {\n if (!host) {\n throw 'Must provide a host.';\n }\n if (!options) {\n throw 'Not enough arguments.'\n }\n return new ShadyRoot(ShadyRootConstructionToken, host, options);\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\nimport {flush} from './flush.js';\nimport {dispatchEvent, querySelectorAll} from './native-methods.js';\nimport * as mutation from './logical-mutation.js';\nimport {ActiveElementAccessor, ShadowRootAccessor, patchAccessors, patchShadowRootAccessors, IsConnectedAccessor} from './patch-accessors.js';\nimport {addEventListener, removeEventListener} from './patch-events.js';\nimport {attachShadow, ShadyRoot} from './attach-shadow.js';\nimport {shadyDataForNode} from './shady-data.js';\n\nfunction getAssignedSlot(node) {\n mutation.renderRootNode(node);\n const nodeData = shadyDataForNode(node);\n return nodeData && nodeData.assignedSlot || null;\n}\n\nlet windowMixin = {\n\n // NOTE: ensure these methods are bound to `window` so that `this` is correct\n // when called directly from global context without a receiver; e.g.\n // `addEventListener(...)`.\n addEventListener: addEventListener.bind(window),\n\n removeEventListener: removeEventListener.bind(window)\n\n};\n\nlet nodeMixin = {\n\n addEventListener: addEventListener,\n\n removeEventListener: removeEventListener,\n\n appendChild(node) {\n return mutation.insertBefore(this, node);\n },\n\n insertBefore(node, ref_node) {\n return mutation.insertBefore(this, node, ref_node);\n },\n\n removeChild(node) {\n return mutation.removeChild(this, node);\n },\n\n /**\n * @this {Node}\n */\n replaceChild(node, ref_node) {\n mutation.insertBefore(this, node, ref_node);\n mutation.removeChild(this, ref_node);\n return node;\n },\n\n /**\n * @this {Node}\n */\n cloneNode(deep) {\n return mutation.cloneNode(this, deep);\n },\n\n /**\n * @this {Node}\n */\n getRootNode(options) {\n return mutation.getRootNode(this, options);\n },\n\n contains(node) {\n return utils.contains(this, node);\n },\n\n /**\n * @this {Node}\n */\n dispatchEvent(event) {\n flush();\n return dispatchEvent.call(this, event);\n }\n\n};\n\n// NOTE: we can do this regardless of the browser supporting native accessors\n// since this is always \"new\" in that case.\nObject.defineProperties(nodeMixin, IsConnectedAccessor);\n\n// NOTE: For some reason 'Text' redefines 'assignedSlot'\nlet textMixin = {\n /**\n * @this {Text}\n */\n get assignedSlot() {\n return getAssignedSlot(this);\n }\n};\n\nlet fragmentMixin = {\n\n // TODO(sorvell): consider doing native QSA and filtering results.\n /**\n * @this {DocumentFragment}\n */\n querySelector(selector) {\n // match selector and halt on first result.\n let result = mutation.query(this, function(n) {\n return utils.matchesSelector(n, selector);\n }, function(n) {\n return Boolean(n);\n })[0];\n return result || null;\n },\n\n /**\n * @this {DocumentFragment}\n */\n // TODO(sorvell): `useNative` option relies on native querySelectorAll and\n // misses distributed nodes, see\n // https://github.com/webcomponents/shadydom/pull/210#issuecomment-361435503\n querySelectorAll(selector, useNative) {\n if (useNative) {\n const o = Array.prototype.slice.call(querySelectorAll(this, selector));\n const root = this.getRootNode();\n return o.filter(e => e.getRootNode() == root);\n }\n return mutation.query(this, function(n) {\n return utils.matchesSelector(n, selector);\n });\n }\n\n};\n\nlet slotMixin = {\n\n /**\n * @this {HTMLSlotElement}\n */\n assignedNodes(options) {\n if (this.localName === 'slot') {\n mutation.renderRootNode(this);\n const nodeData = shadyDataForNode(this);\n return nodeData ?\n ((options && options.flatten ? nodeData.flattenedNodes :\n nodeData.assignedNodes) || []) :\n [];\n }\n }\n\n};\n\nlet elementMixin = utils.extendAll({\n\n /**\n * @this {HTMLElement}\n */\n setAttribute(name, value) {\n mutation.setAttribute(this, name, value);\n },\n\n /**\n * @this {HTMLElement}\n */\n removeAttribute(name) {\n mutation.removeAttribute(this, name);\n },\n\n /**\n * @this {HTMLElement}\n */\n attachShadow(options) {\n return attachShadow(this, options);\n },\n\n /**\n * @this {HTMLElement}\n */\n get slot() {\n return this.getAttribute('slot');\n },\n\n /**\n * @this {HTMLElement}\n */\n set slot(value) {\n mutation.setAttribute(this, 'slot', value);\n },\n\n /**\n * @this {HTMLElement}\n */\n get assignedSlot() {\n return getAssignedSlot(this);\n }\n\n}, fragmentMixin, slotMixin);\n\nObject.defineProperties(elementMixin, ShadowRootAccessor);\n\nlet documentMixin = utils.extendAll({\n /**\n * @this {Document}\n */\n importNode(node, deep) {\n return mutation.importNode(node, deep);\n },\n\n /**\n * @this {Document}\n */\n getElementById(id) {\n let result = mutation.query(this, function(n) {\n return n.id == id;\n }, function(n) {\n return Boolean(n);\n })[0];\n return result || null;\n }\n\n}, fragmentMixin);\n\nObject.defineProperties(documentMixin, {\n '_activeElement': ActiveElementAccessor.activeElement\n});\n\nlet nativeBlur = HTMLElement.prototype.blur;\n\nlet htmlElementMixin = utils.extendAll({\n /**\n * @this {HTMLElement}\n */\n blur() {\n const nodeData = shadyDataForNode(this);\n let root = nodeData && nodeData.root;\n let shadowActive = root && root.activeElement;\n if (shadowActive) {\n shadowActive.blur();\n } else {\n nativeBlur.call(this);\n }\n }\n});\n\nconst shadowRootMixin = {\n addEventListener(type, fn, optionsOrCapture) {\n if (typeof optionsOrCapture !== 'object') {\n optionsOrCapture = {\n capture: Boolean(optionsOrCapture)\n }\n }\n optionsOrCapture.__shadyTarget = this;\n this.host.addEventListener(type, fn, optionsOrCapture);\n },\n\n removeEventListener(type, fn, optionsOrCapture) {\n if (typeof optionsOrCapture !== 'object') {\n optionsOrCapture = {\n capture: Boolean(optionsOrCapture)\n }\n }\n optionsOrCapture.__shadyTarget = this;\n this.host.removeEventListener(type, fn, optionsOrCapture);\n },\n\n getElementById(id) {\n let result = mutation.query(this, function(n) {\n return n.id == id;\n }, function(n) {\n return Boolean(n);\n })[0];\n return result || null;\n }\n}\n\nfunction patchBuiltin(proto, obj) {\n let n$ = Object.getOwnPropertyNames(obj);\n for (let i=0; i < n$.length; i++) {\n let n = n$[i];\n let d = Object.getOwnPropertyDescriptor(obj, n);\n // NOTE: we prefer writing directly here because some browsers\n // have descriptors that are writable but not configurable (e.g.\n // `appendChild` on older browsers)\n if (d.value) {\n proto[n] = d.value;\n } else {\n Object.defineProperty(proto, n, d);\n }\n }\n}\n\n// Apply patches to builtins (e.g. Element.prototype). Some of these patches\n// can be done unconditionally (mostly methods like\n// `Element.prototype.appendChild`) and some can only be done when the browser\n// has proper descriptors on the builtin prototype\n// (e.g. `Element.prototype.firstChild`)`. When descriptors are not available,\n// elements are individually patched when needed (see e.g.\n// `patchInside/OutsideElementAccessors` in `patch-accessors.js`).\nexport function patchBuiltins() {\n let nativeHTMLElement =\n (window['customElements'] && window['customElements']['nativeHTMLElement']) ||\n HTMLElement;\n // These patches can always be done, for all supported browsers.\n patchBuiltin(ShadyRoot.prototype, shadowRootMixin);\n patchBuiltin(window.Node.prototype, nodeMixin);\n patchBuiltin(window.Window.prototype, windowMixin);\n patchBuiltin(window.Text.prototype, textMixin);\n patchBuiltin(window.DocumentFragment.prototype, fragmentMixin);\n patchBuiltin(window.Element.prototype, elementMixin);\n patchBuiltin(window.Document.prototype, documentMixin);\n if (window.HTMLSlotElement) {\n patchBuiltin(window.HTMLSlotElement.prototype, slotMixin);\n }\n patchBuiltin(nativeHTMLElement.prototype, htmlElementMixin);\n // These patches can *only* be done\n // on browsers that have proper property descriptors on builtin prototypes.\n // This includes: IE11, Edge, Chrome >= 4?; Safari >= 10, Firefox\n // On older browsers (Chrome <= 4?, Safari 9), a per element patching\n // strategy is used for patching accessors.\n if (utils.settings.hasDescriptors) {\n patchAccessors(window.Node.prototype);\n patchAccessors(window.Text.prototype);\n patchAccessors(window.DocumentFragment.prototype);\n patchAccessors(window.Element.prototype);\n patchAccessors(nativeHTMLElement.prototype);\n patchAccessors(window.Document.prototype);\n if (window.HTMLSlotElement) {\n patchAccessors(window.HTMLSlotElement.prototype);\n }\n }\n patchShadowRootAccessors(ShadyRoot.prototype);\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport {patchInsideElementAccessors, patchOutsideElementAccessors} from './patch-accessors.js';\nimport {accessors} from './native-tree.js';\nimport {ensureShadyDataForNode, shadyDataForNode} from './shady-data.js';\n\nconst {childNodes} = accessors;\n\nexport function recordInsertBefore(node, container, ref_node) {\n patchInsideElementAccessors(container);\n const containerData = ensureShadyDataForNode(container);\n if (containerData.firstChild !== undefined) {\n containerData.childNodes = null;\n }\n // handle document fragments\n if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n let c$ = node.childNodes;\n for (let i=0; i < c$.length; i++) {\n linkNode(c$[i], container, ref_node);\n }\n // cleanup logical dom in doc fragment.\n const nodeData = ensureShadyDataForNode(node);\n let resetTo = (nodeData.firstChild !== undefined) ? null : undefined;\n nodeData.firstChild = nodeData.lastChild = resetTo;\n nodeData.childNodes = resetTo;\n } else {\n linkNode(node, container, ref_node);\n }\n}\n\nfunction linkNode(node, container, ref_node) {\n patchOutsideElementAccessors(node);\n ref_node = ref_node || null;\n const nodeData = ensureShadyDataForNode(node);\n const containerData = ensureShadyDataForNode(container);\n const ref_nodeData = ref_node ? ensureShadyDataForNode(ref_node) : null;\n // update ref_node.previousSibling <-> node\n nodeData.previousSibling = ref_node ? ref_nodeData.previousSibling :\n container.lastChild;\n let psd = shadyDataForNode(nodeData.previousSibling);\n if (psd) {\n psd.nextSibling = node;\n }\n // update node <-> ref_node\n let nsd = shadyDataForNode(nodeData.nextSibling = ref_node);\n if (nsd) {\n nsd.previousSibling = node;\n }\n // update node <-> container\n nodeData.parentNode = container;\n if (ref_node) {\n if (ref_node === containerData.firstChild) {\n containerData.firstChild = node;\n }\n } else {\n containerData.lastChild = node;\n if (!containerData.firstChild) {\n containerData.firstChild = node;\n }\n }\n // remove caching of childNodes\n containerData.childNodes = null;\n}\n\nexport function recordRemoveChild(node, container) {\n const nodeData = ensureShadyDataForNode(node);\n const containerData = ensureShadyDataForNode(container);\n if (node === containerData.firstChild) {\n containerData.firstChild = nodeData.nextSibling;\n }\n if (node === containerData.lastChild) {\n containerData.lastChild = nodeData.previousSibling;\n }\n let p = nodeData.previousSibling;\n let n = nodeData.nextSibling;\n if (p) {\n ensureShadyDataForNode(p).nextSibling = n;\n }\n if (n) {\n ensureShadyDataForNode(n).previousSibling = p;\n }\n // When an element is removed, logical data is no longer tracked.\n // Explicitly set `undefined` here to indicate this. This is disginguished\n // from `null` which is set if info is null.\n nodeData.parentNode = nodeData.previousSibling =\n nodeData.nextSibling = undefined;\n if (containerData.childNodes !== undefined) {\n // remove caching of childNodes\n containerData.childNodes = null;\n }\n}\n\nexport let recordChildNodes = function(node, nodes) {\n const nodeData = ensureShadyDataForNode(node);\n if (nodeData.firstChild === undefined) {\n const c$ = nodes || childNodes(node);\n nodeData.firstChild = c$[0] || null;\n nodeData.lastChild = c$[c$.length-1] || null;\n patchInsideElementAccessors(node);\n for (let i=0; i<c$.length; i++) {\n const n = c$[i];\n const sd = ensureShadyDataForNode(n);\n sd.parentNode = node;\n sd.nextSibling = c$[i+1] || null;\n sd.previousSibling = c$[i-1] || null;\n patchOutsideElementAccessors(n);\n }\n }\n}","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\nimport * as logicalTree from './logical-tree.js';\nimport * as nativeMethods from './native-methods.js';\nimport {accessors} from './native-tree.js';\nimport {ensureShadyDataForNode, shadyDataForNode} from './shady-data.js';\n\nconst {parentNode} = accessors;\n\n// Patched `insertBefore`. Note that all mutations that add nodes are routed\n// here. When a <slot> is added or a node is added to a host with a shadowRoot\n// with a slot, a standard dom `insert` call is aborted and `_asyncRender`\n// is called on the relevant shadowRoot. In all other cases, a standard dom\n// `insert` can be made, but the location and ref_node may need to be changed.\n/**\n * @param {Node} parent\n * @param {Node} node\n * @param {Node=} ref_node\n */\nexport function insertBefore(parent, node, ref_node) {\n if (node === parent) {\n throw Error(`Failed to execute 'appendChild' on 'Node': The new child element contains the parent.`);\n }\n if (ref_node) {\n const refData = shadyDataForNode(ref_node);\n const p = refData && refData.parentNode;\n if ((p !== undefined && p !== parent) ||\n (p === undefined && parentNode(ref_node) !== parent)) {\n throw Error(`Failed to execute 'insertBefore' on 'Node': The node ` +\n `before which the new node is to be inserted is not a child of this node.`);\n }\n }\n if (ref_node === node) {\n return node;\n }\n // remove from existing location\n if (node.parentNode) {\n // NOTE: avoid node.removeChild as this *can* trigger another patched\n // method (e.g. custom elements) and we want only the shady method to run.\n removeChild(node.parentNode, node);\n }\n // add to new parent\n let preventNativeInsert;\n let ownerRoot;\n let slotsAdded;\n if (!node['__noInsertionPoint']) {\n ownerRoot = utils.ownerShadyRootForNode(parent);\n slotsAdded = ownerRoot && findContainedSlots(node);\n if (slotsAdded) {\n ownerRoot._addSlots(slotsAdded);\n }\n }\n // if a slot is added, must render containing root.\n if (parent.localName === 'slot' || slotsAdded) {\n ownerRoot = ownerRoot || utils.ownerShadyRootForNode(parent);\n if (ownerRoot) {\n ownerRoot._asyncRender();\n }\n }\n if (utils.isTrackingLogicalChildNodes(parent)) {\n logicalTree.recordInsertBefore(node, parent, ref_node);\n // when inserting into a host with a shadowRoot with slot, use\n // `shadowRoot._asyncRender()` via `attach-shadow` module\n const parentData = shadyDataForNode(parent);\n if (hasShadowRootWithSlot(parent)) {\n parentData.root._asyncRender();\n preventNativeInsert = true;\n // when inserting into a host with shadowRoot with NO slot, do nothing\n // as the node should not be added to composed dome anywhere.\n } else if (parentData.root) {\n preventNativeInsert = true;\n }\n }\n if (!preventNativeInsert) {\n // if adding to a shadyRoot, add to host instead\n let container = utils.isShadyRoot(parent) ?\n /** @type {ShadowRoot} */(parent).host : parent;\n // if ref_node, get the ref_node that's actually in composed dom.\n if (ref_node) {\n ref_node = firstComposedNode(ref_node);\n nativeMethods.insertBefore.call(container, node, ref_node);\n } else {\n nativeMethods.appendChild.call(container, node);\n }\n }\n scheduleObserver(parent, node);\n return node;\n}\n\nfunction findContainedSlots(node) {\n let slots;\n if (node.localName === 'slot') {\n slots = [node];\n } else if (node.querySelectorAll) {\n slots = node.querySelectorAll('slot');\n }\n if (slots && slots.length) {\n return slots;\n }\n}\n\n/**\n * Patched `removeChild`. Note that all dom \"removals\" are routed here.\n * Removes the given `node` from the element's `children`.\n * This method also performs dom composition.\n * @param {Node} parent\n * @param {Node} node\n*/\nexport function removeChild(parent, node) {\n if (node.parentNode !== parent) {\n throw Error('The node to be removed is not a child of this node: ' +\n node);\n }\n let preventNativeRemove;\n let ownerRoot = utils.ownerShadyRootForNode(node);\n let removingInsertionPoint;\n const parentData = shadyDataForNode(parent);\n if (utils.isTrackingLogicalChildNodes(parent)) {\n logicalTree.recordRemoveChild(node, parent);\n if (hasShadowRootWithSlot(parent)) {\n parentData.root._asyncRender();\n preventNativeRemove = true;\n }\n }\n removeOwnerShadyRoot(node);\n // if removing slot, must render containing root\n if (ownerRoot) {\n let changeSlotContent = parent && parent.localName === 'slot';\n if (changeSlotContent) {\n preventNativeRemove = true;\n }\n removingInsertionPoint = ownerRoot._removeContainedSlots(node);\n if (removingInsertionPoint || changeSlotContent) {\n ownerRoot._asyncRender();\n }\n }\n if (!preventNativeRemove) {\n // if removing from a shadyRoot, remove form host instead\n let container = utils.isShadyRoot(parent) ?\n /** @type {ShadowRoot} */(parent).host :\n parent;\n // not guaranteed to physically be in container; e.g.\n // (1) if parent has a shadyRoot, element may or may not at distributed\n // location (could be undistributed)\n // (2) if parent is a slot, element may not ben in composed dom\n if (!(parentData.root || node.localName === 'slot') ||\n (container === parentNode(node))) {\n nativeMethods.removeChild.call(container, node);\n }\n }\n scheduleObserver(parent, null, node);\n return node;\n}\n\nfunction removeOwnerShadyRoot(node) {\n // optimization: only reset the tree if node is actually in a root\n if (hasCachedOwnerRoot(node)) {\n let c$ = node.childNodes;\n for (let i=0, l=c$.length, n; (i<l) && (n=c$[i]); i++) {\n removeOwnerShadyRoot(n);\n }\n }\n const nodeData = shadyDataForNode(node);\n if (nodeData) {\n nodeData.ownerShadyRoot = undefined;\n }\n}\n\nfunction hasCachedOwnerRoot(node) {\n const nodeData = shadyDataForNode(node);\n return Boolean(nodeData && nodeData.ownerShadyRoot !== undefined);\n}\n\n/**\n * Finds the first flattened node that is composed in the node's parent.\n * If the given node is a slot, then the first flattened node is returned\n * if it exists, otherwise advance to the node's nextSibling.\n * @param {Node} node within which to find first composed node\n * @returns {Node} first composed node\n */\nfunction firstComposedNode(node) {\n let composed = node;\n if (node && node.localName === 'slot') {\n const nodeData = shadyDataForNode(node);\n const flattened = nodeData && nodeData.flattenedNodes;\n composed = flattened && flattened.length ? flattened[0] :\n firstComposedNode(node.nextSibling);\n }\n return composed;\n}\n\nfunction hasShadowRootWithSlot(node) {\n const nodeData = shadyDataForNode(node);\n let root = nodeData && nodeData.root;\n return (root && root._hasInsertionPoint());\n}\n\n/**\n * Should be called whenever an attribute changes. If the `slot` attribute\n * changes, provokes rendering if necessary. If a `<slot>` element's `name`\n * attribute changes, updates the root's slot map and renders.\n * @param {Node} node\n * @param {string} name\n */\nfunction distributeAttributeChange(node, name) {\n if (name === 'slot') {\n const parent = node.parentNode;\n if (hasShadowRootWithSlot(parent)) {\n shadyDataForNode(parent).root._asyncRender();\n }\n } else if (node.localName === 'slot' && name === 'name') {\n let root = utils.ownerShadyRootForNode(node);\n if (root) {\n root._updateSlotName(node);\n root._asyncRender();\n }\n }\n}\n\n/**\n * @param {Node} node\n * @param {Node=} addedNode\n * @param {Node=} removedNode\n */\nfunction scheduleObserver(node, addedNode, removedNode) {\n const nodeData = shadyDataForNode(node);\n const observer = nodeData && nodeData.observer;\n if (observer) {\n if (addedNode) {\n observer.addedNodes.push(addedNode);\n }\n if (removedNode) {\n observer.removedNodes.push(removedNode);\n }\n observer.schedule();\n }\n}\n\n/**\n * @param {Node} node\n * @param {Object=} options\n */\nexport function getRootNode(node, options) { // eslint-disable-line no-unused-vars\n if (!node || !node.nodeType) {\n return;\n }\n const nodeData = ensureShadyDataForNode(node);\n let root = nodeData.ownerShadyRoot;\n if (root === undefined) {\n if (utils.isShadyRoot(node)) {\n root = node;\n nodeData.ownerShadyRoot = root;\n } else {\n let parent = node.parentNode;\n root = parent ? getRootNode(parent) : node;\n // memo-ize result for performance but only memo-ize\n // result if node is in the document. This avoids a problem where a root\n // can be cached while an element is inside a fragment.\n // If this happens and we cache the result, the value can become stale\n // because for perf we avoid processing the subtree of added fragments.\n if (nativeMethods.contains.call(document.documentElement, node)) {\n nodeData.ownerShadyRoot = root;\n }\n }\n\n }\n return root;\n}\n\n// NOTE: `query` is used primarily for ShadyDOM's querySelector impl,\n// but it's also generally useful to recurse through the element tree\n// and is used by Polymer's styling system.\n/**\n * @param {Node} node\n * @param {Function} matcher\n * @param {Function=} halter\n */\nexport function query(node, matcher, halter) {\n let list = [];\n queryElements(node.childNodes, matcher,\n halter, list);\n return list;\n}\n\nfunction queryElements(elements, matcher, halter, list) {\n for (let i=0, l=elements.length, c; (i<l) && (c=elements[i]); i++) {\n if (c.nodeType === Node.ELEMENT_NODE &&\n queryElement(c, matcher, halter, list)) {\n return true;\n }\n }\n}\n\nfunction queryElement(node, matcher, halter, list) {\n let result = matcher(node);\n if (result) {\n list.push(node);\n }\n if (halter && halter(result)) {\n return result;\n }\n queryElements(node.childNodes, matcher,\n halter, list);\n}\n\nexport function renderRootNode(element) {\n var root = element.getRootNode();\n if (utils.isShadyRoot(root)) {\n root._render();\n }\n}\n\nlet scopingShim = null;\n\nexport function setAttribute(node, attr, value) {\n if (!scopingShim) {\n scopingShim = window['ShadyCSS'] && window['ShadyCSS']['ScopingShim'];\n }\n if (scopingShim && attr === 'class') {\n scopingShim['setElementClass'](node, value);\n } else {\n nativeMethods.setAttribute.call(node, attr, value);\n distributeAttributeChange(node, attr);\n }\n}\n\nexport function removeAttribute(node, attr) {\n nativeMethods.removeAttribute.call(node, attr);\n distributeAttributeChange(node, attr);\n}\n\nexport function cloneNode(node, deep) {\n if (node.localName == 'template') {\n return nativeMethods.cloneNode.call(node, deep);\n } else {\n let n = nativeMethods.cloneNode.call(node, false);\n if (deep) {\n let c$ = node.childNodes;\n for (let i=0, nc; i < c$.length; i++) {\n nc = c$[i].cloneNode(true);\n n.appendChild(nc);\n }\n }\n return n;\n }\n}\n\n// note: Though not technically correct, we fast path `importNode`\n// when called on a node not owned by the main document.\n// This allows, for example, elements that cannot\n// contain custom elements and are therefore not likely to contain shadowRoots\n// to cloned natively. This is a fairly significant performance win.\nexport function importNode(node, deep) {\n if (node.ownerDocument !== document) {\n return nativeMethods.importNode.call(document, node, deep);\n }\n let n = nativeMethods.importNode.call(document, node, false);\n if (deep) {\n let c$ = node.childNodes;\n for (let i=0, nc; i < c$.length; i++) {\n nc = importNode(c$[i], true);\n n.appendChild(nc);\n }\n }\n return n;\n}",null,"/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport * as utils from './utils.js';\nimport * as nativeMethods from './native-methods.js';\nimport {shadyDataForNode} from './shady-data.js';\n\n/*\nMake this name unique so it is unlikely to conflict with properties on objects passed to `addEventListener`\nhttps://github.com/webcomponents/shadydom/issues/173\n*/\nconst /** string */ eventWrappersName = `__eventWrappers${Date.now()}`;\n\n// https://github.com/w3c/webcomponents/issues/513#issuecomment-224183937\nlet alwaysComposed = {\n 'blur': true,\n 'focus': true,\n 'focusin': true,\n 'focusout': true,\n 'click': true,\n 'dblclick': true,\n 'mousedown': true,\n 'mouseenter': true,\n 'mouseleave': true,\n 'mousemove': true,\n 'mouseout': true,\n 'mouseover': true,\n 'mouseup': true,\n 'wheel': true,\n 'beforeinput': true,\n 'input': true,\n 'keydown': true,\n 'keyup': true,\n 'compositionstart': true,\n 'compositionupdate': true,\n 'compositionend': true,\n 'touchstart': true,\n 'touchend': true,\n 'touchmove': true,\n 'touchcancel': true,\n 'pointerover': true,\n 'pointerenter': true,\n 'pointerdown': true,\n 'pointermove': true,\n 'pointerup': true,\n 'pointercancel': true,\n 'pointerout': true,\n 'pointerleave': true,\n 'gotpointercapture': true,\n 'lostpointercapture': true,\n 'dragstart': true,\n 'drag': true,\n 'dragenter': true,\n 'dragleave': true,\n 'dragover': true,\n 'drop': true,\n 'dragend': true,\n 'DOMActivate': true,\n 'DOMFocusIn': true,\n 'DOMFocusOut': true,\n 'keypress': true\n};\n\nfunction pathComposer(startNode, composed) {\n let composedPath = [];\n let current = startNode;\n let startRoot = startNode === window ? window : startNode.getRootNode();\n while (current) {\n composedPath.push(current);\n if (current.assignedSlot) {\n current = current.assignedSlot;\n } else if (current.nodeType === Node.DOCUMENT_FRAGMENT_NODE && current.host && (composed || current !== startRoot)) {\n current = current.host;\n } else {\n current = current.parentNode;\n }\n }\n // event composedPath includes window when startNode's ownerRoot is document\n if (composedPath[composedPath.length - 1] === document) {\n composedPath.push(window);\n }\n return composedPath;\n}\n\nfunction retarget(refNode, path) {\n if (!utils.isShadyRoot) {\n return refNode;\n }\n // If ANCESTOR's root is not a shadow root or ANCESTOR's root is BASE's\n // shadow-including inclusive ancestor, return ANCESTOR.\n let refNodePath = pathComposer(refNode, true);\n let p$ = path;\n for (let i=0, ancestor, lastRoot, root, rootIdx; i < p$.length; i++) {\n ancestor = p$[i];\n root = ancestor === window ? window : ancestor.getRootNode();\n if (root !== lastRoot) {\n rootIdx = refNodePath.indexOf(root);\n lastRoot = root;\n }\n if (!utils.isShadyRoot(root) || rootIdx > -1) {\n return ancestor;\n }\n }\n}\n\nlet eventMixin = {\n\n /**\n * @this {Event}\n */\n get composed() {\n // isTrusted may not exist in this browser, so just check if isTrusted is explicitly false\n if (this.isTrusted !== false && this.__composed === undefined) {\n this.__composed = alwaysComposed[this.type];\n }\n return this.__composed || false;\n },\n\n /**\n * @this {Event}\n */\n composedPath() {\n if (!this.__composedPath) {\n this.__composedPath = pathComposer(this['__target'], this.composed);\n }\n return this.__composedPath;\n },\n\n /**\n * @this {Event}\n */\n get target() {\n return retarget(this.currentTarget, this.composedPath());\n },\n\n // http://w3c.github.io/webcomponents/spec/shadow/#event-relatedtarget-retargeting\n /**\n * @this {Event}\n */\n get relatedTarget() {\n if (!this.__relatedTarget) {\n return null;\n }\n if (!this.__relatedTargetComposedPath) {\n this.__relatedTargetComposedPath = pathComposer(this.__relatedTarget, true);\n }\n // find the deepest node in relatedTarget composed path that is in the same root with the currentTarget\n return retarget(this.currentTarget, this.__relatedTargetComposedPath);\n },\n /**\n * @this {Event}\n */\n stopPropagation() {\n Event.prototype.stopPropagation.call(this);\n this.__propagationStopped = true;\n },\n /**\n * @this {Event}\n */\n stopImmediatePropagation() {\n Event.prototype.stopImmediatePropagation.call(this);\n this.__immediatePropagationStopped = true;\n this.__propagationStopped = true;\n }\n\n};\n\nfunction mixinComposedFlag(Base) {\n // NOTE: avoiding use of `class` here so that transpiled output does not\n // try to do `Base.call` with a dom construtor.\n let klazz = function(type, options) {\n let event = new Base(type, options);\n event.__composed = options && Boolean(options['composed']);\n return event;\n }\n // put constructor properties on subclass\n utils.mixin(klazz, Base);\n klazz.prototype = Base.prototype;\n return klazz;\n}\n\nlet nonBubblingEventsToRetarget = {\n 'focus': true,\n 'blur': true\n};\n\n\n/**\n * Check if the event has been retargeted by comparing original `target`, and calculated `target`\n * @param {Event} event\n * @return {boolean} True if the original target and calculated target are the same\n */\nfunction hasRetargeted(event) {\n return event['__target'] !== event.target || event.__relatedTarget !== event.relatedTarget;\n}\n\n/**\n *\n * @param {Event} event\n * @param {Node} node\n * @param {string} phase\n */\nfunction fireHandlers(event, node, phase) {\n let hs = node.__handlers && node.__handlers[event.type] &&\n node.__handlers[event.type][phase];\n if (hs) {\n for (let i = 0, fn; (fn = hs[i]); i++) {\n if (hasRetargeted(event) && event.target === event.relatedTarget) {\n return;\n }\n fn.call(node, event);\n if (event.__immediatePropagationStopped) {\n return;\n }\n }\n }\n}\n\nfunction retargetNonBubblingEvent(e) {\n let path = e.composedPath();\n let node;\n // override `currentTarget` to let patched `target` calculate correctly\n Object.defineProperty(e, 'currentTarget', {\n get: function() {\n return node;\n },\n configurable: true\n });\n for (let i = path.length - 1; i >= 0; i--) {\n node = path[i];\n // capture phase fires all capture handlers\n fireHandlers(e, node, 'capture');\n if (e.__propagationStopped) {\n return;\n }\n }\n\n // set the event phase to `AT_TARGET` as in spec\n Object.defineProperty(e, 'eventPhase', {get() { return Event.AT_TARGET }});\n\n // the event only needs to be fired when owner roots change when iterating the event path\n // keep track of the last seen owner root\n let lastFiredRoot;\n for (let i = 0; i < path.length; i++) {\n node = path[i];\n const nodeData = shadyDataForNode(node);\n const root = nodeData && nodeData.root;\n if (i === 0 || (root && root === lastFiredRoot)) {\n fireHandlers(e, node, 'bubble');\n // don't bother with window, it doesn't have `getRootNode` and will be last in the path anyway\n if (node !== window) {\n lastFiredRoot = node.getRootNode();\n }\n if (e.__propagationStopped) {\n return;\n }\n }\n }\n}\n\nfunction listenerSettingsEqual(savedListener, node, type, capture, once, passive) {\n let {\n node: savedNode,\n type: savedType,\n capture: savedCapture,\n once: savedOnce,\n passive: savedPassive\n } = savedListener;\n return node === savedNode &&\n type === savedType &&\n capture === savedCapture &&\n once === savedOnce &&\n passive === savedPassive;\n}\n\nexport function findListener(wrappers, node, type, capture, once, passive) {\n for (let i = 0; i < wrappers.length; i++) {\n if (listenerSettingsEqual(wrappers[i], node, type, capture, once, passive)) {\n return i;\n }\n }\n return -1;\n}\n\n/**\n * Firefox can throw on accessing eventWrappers inside of `removeEventListener` during a selenium run\n * Try/Catch accessing eventWrappers to work around\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1353074\n */\nfunction getEventWrappers(eventLike) {\n let wrappers = null;\n try {\n wrappers = eventLike[eventWrappersName];\n } catch (e) {} // eslint-disable-line no-empty\n return wrappers;\n}\n\n/**\n * @this {Event}\n */\nexport function addEventListener(type, fnOrObj, optionsOrCapture) {\n if (!fnOrObj) {\n return;\n }\n\n const handlerType = typeof fnOrObj;\n\n // bail if `fnOrObj` is not a function, not an object\n if (handlerType !== 'function' && handlerType !== 'object') {\n return;\n }\n\n // bail if `fnOrObj` is an object without a `handleEvent` method\n if (handlerType === 'object' && (!fnOrObj.handleEvent || typeof fnOrObj.handleEvent !== 'function')) {\n return;\n }\n\n // The callback `fn` might be used for multiple nodes/events. Since we generate\n // a wrapper function, we need to keep track of it when we remove the listener.\n // It's more efficient to store the node/type/options information as Array in\n // `fn` itself rather than the node (we assume that the same callback is used\n // for few nodes at most, whereas a node will likely have many event listeners).\n // NOTE(valdrin) invoking external functions is costly, inline has better perf.\n let capture, once, passive;\n if (optionsOrCapture && typeof optionsOrCapture === 'object') {\n capture = Boolean(optionsOrCapture.capture);\n once = Boolean(optionsOrCapture.once);\n passive = Boolean(optionsOrCapture.passive);\n } else {\n capture = Boolean(optionsOrCapture);\n once = false;\n passive = false;\n }\n // hack to let ShadyRoots have event listeners\n // event listener will be on host, but `currentTarget`\n // will be set to shadyroot for event listener\n let target = (optionsOrCapture && optionsOrCapture.__shadyTarget) || this;\n\n let wrappers = fnOrObj[eventWrappersName];\n if (wrappers) {\n // Stop if the wrapper function has already been created.\n if (findListener(wrappers, target, type, capture, once, passive) > -1) {\n return;\n }\n } else {\n fnOrObj[eventWrappersName] = [];\n }\n\n /**\n * @this {HTMLElement}\n * @param {Event} e\n */\n const wrapperFn = function(e) {\n // Support `once` option.\n if (once) {\n this.removeEventListener(type, fnOrObj, optionsOrCapture);\n }\n if (!e['__target']) {\n patchEvent(e);\n }\n let lastCurrentTargetDesc;\n if (target !== this) {\n // replace `currentTarget` to make `target` and `relatedTarget` correct for inside the shadowroot\n lastCurrentTargetDesc = Object.getOwnPropertyDescriptor(e, 'currentTarget');\n Object.defineProperty(e, 'currentTarget', {get() { return target }, configurable: true});\n }\n // There are two critera that should stop events from firing on this node\n // 1. the event is not composed and the current node is not in the same root as the target\n // 2. when bubbling, if after retargeting, relatedTarget and target point to the same node\n if (e.composed || e.composedPath().indexOf(target) > -1) {\n if (hasRetargeted(e) && e.target === e.relatedTarget) {\n if (e.eventPhase === Event.BUBBLING_PHASE) {\n e.stopImmediatePropagation();\n }\n return;\n }\n // prevent non-bubbling events from triggering bubbling handlers on shadowroot, but only if not in capture phase\n if (e.eventPhase !== Event.CAPTURING_PHASE && !e.bubbles && e.target !== target && !(target instanceof Window)) {\n return;\n }\n let ret = handlerType === 'function' ?\n fnOrObj.call(target, e) :\n (fnOrObj.handleEvent && fnOrObj.handleEvent(e));\n if (target !== this) {\n // replace the \"correct\" `currentTarget`\n if (lastCurrentTargetDesc) {\n Object.defineProperty(e, 'currentTarget', lastCurrentTargetDesc);\n lastCurrentTargetDesc = null;\n } else {\n delete e['currentTarget'];\n }\n }\n return ret;\n }\n };\n // Store the wrapper information.\n fnOrObj[eventWrappersName].push({\n // note: use target here which is either a shadowRoot\n // (when the host element is proxy'ing the event) or this element\n node: target,\n type: type,\n capture: capture,\n once: once,\n passive: passive,\n wrapperFn: wrapperFn\n });\n\n if (nonBubblingEventsToRetarget[type]) {\n this.__handlers = this.__handlers || {};\n this.__handlers[type] = this.__handlers[type] ||\n {'capture': [], 'bubble': []};\n this.__handlers[type][capture ? 'capture' : 'bubble'].push(wrapperFn);\n } else {\n let ael = this instanceof Window ? nativeMethods.windowAddEventListener :\n nativeMethods.addEventListener;\n ael.call(this, type, wrapperFn, optionsOrCapture);\n }\n}\n\n/**\n * @this {Event}\n */\nexport function removeEventListener(type, fnOrObj, optionsOrCapture) {\n if (!fnOrObj) {\n return;\n }\n\n // NOTE(valdrin) invoking external functions is costly, inline has better perf.\n let capture, once, passive;\n if (optionsOrCapture && typeof optionsOrCapture === 'object') {\n capture = Boolean(optionsOrCapture.capture);\n once = Boolean(optionsOrCapture.once);\n passive = Boolean(optionsOrCapture.passive);\n } else {\n capture = Boolean(optionsOrCapture);\n once = false;\n passive = false;\n }\n let target = (optionsOrCapture && optionsOrCapture.__shadyTarget) || this;\n // Search the wrapped function.\n let wrapperFn = undefined;\n let wrappers = getEventWrappers(fnOrObj);\n if (wrappers) {\n let idx = findListener(wrappers, target, type, capture, once, passive);\n if (idx > -1) {\n wrapperFn = wrappers.splice(idx, 1)[0].wrapperFn;\n // Cleanup.\n if (!wrappers.length) {\n fnOrObj[eventWrappersName] = undefined;\n }\n }\n }\n let rel = this instanceof Window ? nativeMethods.windowRemoveEventListener :\n nativeMethods.removeEventListener;\n rel.call(this, type, wrapperFn || fnOrObj, optionsOrCapture);\n if (wrapperFn && nonBubblingEventsToRetarget[type] &&\n this.__handlers && this.__handlers[type]) {\n const arr = this.__handlers[type][capture ? 'capture' : 'bubble'];\n const idx = arr.indexOf(wrapperFn);\n if (idx > -1) {\n arr.splice(idx, 1);\n }\n }\n}\n\nfunction activateFocusEventOverrides() {\n for (let ev in nonBubblingEventsToRetarget) {\n window.addEventListener(ev, function(e) {\n if (!e['__target']) {\n patchEvent(e);\n retargetNonBubblingEvent(e);\n }\n }, true);\n }\n}\n\nfunction patchEvent(event) {\n event['__target'] = event.target;\n event.__relatedTarget = event.relatedTarget;\n // patch event prototype if we can\n if (utils.settings.hasDescriptors) {\n utils.patchPrototype(event, eventMixin);\n // and fallback to patching instance\n } else {\n utils.extend(event, eventMixin);\n }\n}\n\nlet PatchedEvent = mixinComposedFlag(window.Event);\nlet PatchedCustomEvent = mixinComposedFlag(window.CustomEvent);\nlet PatchedMouseEvent = mixinComposedFlag(window.MouseEvent);\n\nexport function patchEvents() {\n window.Event = PatchedEvent;\n window.CustomEvent = PatchedCustomEvent;\n window.MouseEvent = PatchedMouseEvent;\n activateFocusEventOverrides();\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nfunction newSplice(index, removed, addedCount) {\n return {\n index: index,\n removed: removed,\n addedCount: addedCount\n };\n}\n\nconst EDIT_LEAVE = 0;\nconst EDIT_UPDATE = 1;\nconst EDIT_ADD = 2;\nconst EDIT_DELETE = 3;\n\n// Note: This function is *based* on the computation of the Levenshtein\n// \"edit\" distance. The one change is that \"updates\" are treated as two\n// edits - not one. With Array splices, an update is really a delete\n// followed by an add. By retaining this, we optimize for \"keeping\" the\n// maximum array items in the original array. For example:\n//\n// 'xxxx123' -> '123yyyy'\n//\n// With 1-edit updates, the shortest path would be just to update all seven\n// characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n// leaves the substring '123' intact.\nfunction calcEditDistances(current, currentStart, currentEnd,\n old, oldStart, oldEnd) {\n // \"Deletion\" columns\n let rowCount = oldEnd - oldStart + 1;\n let columnCount = currentEnd - currentStart + 1;\n let distances = new Array(rowCount);\n\n // \"Addition\" rows. Initialize null column.\n for (let i = 0; i < rowCount; i++) {\n distances[i] = new Array(columnCount);\n distances[i][0] = i;\n }\n\n // Initialize null row\n for (let j = 0; j < columnCount; j++)\n distances[0][j] = j;\n\n for (let i = 1; i < rowCount; i++) {\n for (let j = 1; j < columnCount; j++) {\n if (equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n distances[i][j] = distances[i - 1][j - 1];\n else {\n let north = distances[i - 1][j] + 1;\n let west = distances[i][j - 1] + 1;\n distances[i][j] = north < west ? north : west;\n }\n }\n }\n\n return distances;\n}\n\n// This starts at the final weight, and walks \"backward\" by finding\n// the minimum previous weight recursively until the origin of the weight\n// matrix.\nfunction spliceOperationsFromEditDistances(distances) {\n let i = distances.length - 1;\n let j = distances[0].length - 1;\n let current = distances[i][j];\n let edits = [];\n while (i > 0 || j > 0) {\n if (i == 0) {\n edits.push(EDIT_ADD);\n j--;\n continue;\n }\n if (j == 0) {\n edits.push(EDIT_DELETE);\n i--;\n continue;\n }\n let northWest = distances[i - 1][j - 1];\n let west = distances[i - 1][j];\n let north = distances[i][j - 1];\n\n let min;\n if (west < north)\n min = west < northWest ? west : northWest;\n else\n min = north < northWest ? north : northWest;\n\n if (min == northWest) {\n if (northWest == current) {\n edits.push(EDIT_LEAVE);\n } else {\n edits.push(EDIT_UPDATE);\n current = northWest;\n }\n i--;\n j--;\n } else if (min == west) {\n edits.push(EDIT_DELETE);\n i--;\n current = west;\n } else {\n edits.push(EDIT_ADD);\n j--;\n current = north;\n }\n }\n\n edits.reverse();\n return edits;\n}\n\n/**\n * Splice Projection functions:\n *\n * A splice map is a representation of how a previous array of items\n * was transformed into a new array of items. Conceptually it is a list of\n * tuples of\n *\n * <index, removed, addedCount>\n *\n * which are kept in ascending index order of. The tuple represents that at\n * the |index|, |removed| sequence of items were removed, and counting forward\n * from |index|, |addedCount| items were added.\n */\n\n/**\n * Lacking individual splice mutation information, the minimal set of\n * splices can be synthesized given the previous state and final state of an\n * array. The basic approach is to calculate the edit distance matrix and\n * choose the shortest path through it.\n *\n * Complexity: O(l * p)\n * l: The length of the current array\n * p: The length of the old array\n */\nfunction calcSplices(current, currentStart, currentEnd,\n old, oldStart, oldEnd) {\n let prefixCount = 0;\n let suffixCount = 0;\n let splice;\n\n let minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n if (currentStart == 0 && oldStart == 0)\n prefixCount = sharedPrefix(current, old, minLength);\n\n if (currentEnd == current.length && oldEnd == old.length)\n suffixCount = sharedSuffix(current, old, minLength - prefixCount);\n\n currentStart += prefixCount;\n oldStart += prefixCount;\n currentEnd -= suffixCount;\n oldEnd -= suffixCount;\n\n if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n return [];\n\n if (currentStart == currentEnd) {\n splice = newSplice(currentStart, [], 0);\n while (oldStart < oldEnd)\n splice.removed.push(old[oldStart++]);\n\n return [ splice ];\n } else if (oldStart == oldEnd)\n return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n let ops = spliceOperationsFromEditDistances(\n calcEditDistances(current, currentStart, currentEnd,\n old, oldStart, oldEnd));\n\n splice = undefined;\n let splices = [];\n let index = currentStart;\n let oldIndex = oldStart;\n for (let i = 0; i < ops.length; i++) {\n switch(ops[i]) {\n case EDIT_LEAVE:\n if (splice) {\n splices.push(splice);\n splice = undefined;\n }\n\n index++;\n oldIndex++;\n break;\n case EDIT_UPDATE:\n if (!splice)\n splice = newSplice(index, [], 0);\n\n splice.addedCount++;\n index++;\n\n splice.removed.push(old[oldIndex]);\n oldIndex++;\n break;\n case EDIT_ADD:\n if (!splice)\n splice = newSplice(index, [], 0);\n\n splice.addedCount++;\n index++;\n break;\n case EDIT_DELETE:\n if (!splice)\n splice = newSplice(index, [], 0);\n\n splice.removed.push(old[oldIndex]);\n oldIndex++;\n break;\n }\n }\n\n if (splice) {\n splices.push(splice);\n }\n return splices;\n}\n\nfunction sharedPrefix(current, old, searchLength) {\n for (let i = 0; i < searchLength; i++)\n if (!equals(current[i], old[i]))\n return i;\n return searchLength;\n}\n\nfunction sharedSuffix(current, old, searchLength) {\n let index1 = current.length;\n let index2 = old.length;\n let count = 0;\n while (count < searchLength && equals(current[--index1], old[--index2]))\n count++;\n\n return count;\n}\n\nfunction equals(currentValue, previousValue) {\n return currentValue === previousValue;\n}\n\nexport function calculateSplices(current, previous) {\n return calcSplices(current, 0, current.length, previous, 0,\n previous.length);\n}\n\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/**\n * Patches elements that interacts with ShadyDOM\n * such that tree traversal and mutation apis act like they would under\n * ShadowDOM.\n *\n * This import enables seemless interaction with ShadyDOM powered\n * custom elements, enabling better interoperation with 3rd party code,\n * libraries, and frameworks that use DOM tree manipulation apis.\n */\n\nimport * as utils from './utils.js';\nimport {flush, enqueue} from './flush.js';\nimport {observeChildren, unobserveChildren, filterMutations} from './observe-changes.js';\nimport * as nativeMethods from './native-methods.js';\nimport {accessors as nativeTree} from './native-tree.js';\nimport {patchBuiltins} from './patch-builtins.js';\nimport {patchInsideElementAccessors, patchOutsideElementAccessors} from './patch-accessors.js';\nimport {patchEvents} from './patch-events.js';\nimport {ShadyRoot} from './attach-shadow.js';\n\nif (utils.settings.inUse) {\n let ShadyDOM = {\n // TODO(sorvell): remove when Polymer does not depend on this.\n 'inUse': utils.settings.inUse,\n // NOTE: old browsers without prototype accessors (very old Chrome\n // and Safari) need manually patched accessors to properly set\n // `innerHTML` and `textContent` when an element is:\n // (1) inside a shadowRoot\n // (2) does not have special (slot) children itself\n // (3) and setting the property needs to provoke distribution (because\n // a nested slot is added/removed)\n 'patch': (node) => {\n patchInsideElementAccessors(node);\n patchOutsideElementAccessors(node);\n return node;\n },\n 'isShadyRoot': utils.isShadyRoot,\n 'enqueue': enqueue,\n 'flush': flush,\n 'settings': utils.settings,\n 'filterMutations': filterMutations,\n 'observeChildren': observeChildren,\n 'unobserveChildren': unobserveChildren,\n 'nativeMethods': nativeMethods,\n 'nativeTree': nativeTree\n };\n\n window['ShadyDOM'] = ShadyDOM;\n\n // Apply patches to events...\n patchEvents();\n // Apply patches to builtins (e.g. Element.prototype) where applicable.\n patchBuiltins();\n\n window.ShadowRoot = ShadyRoot;\n}","const reservedTagList = new Set([\n 'annotation-xml',\n 'color-profile',\n 'font-face',\n 'font-face-src',\n 'font-face-uri',\n 'font-face-format',\n 'font-face-name',\n 'missing-glyph',\n]);\n\n/**\n * @param {string} localName\n * @returns {boolean}\n */\nexport function isValidCustomElementName(localName) {\n const reserved = reservedTagList.has(localName);\n const validForm = /^[a-z][.0-9_a-z]*-[\\-.0-9_a-z]*$/.test(localName);\n return !reserved && validForm;\n}\n\n/**\n * @private\n * @param {!Node} node\n * @return {boolean}\n */\nexport function isConnected(node) {\n // Use `Node#isConnected`, if defined.\n const nativeValue = node.isConnected;\n if (nativeValue !== undefined) {\n return nativeValue;\n }\n\n /** @type {?Node|undefined} */\n let current = node;\n while (current && !(current.__CE_isImportDocument || current instanceof Document)) {\n current = current.parentNode || (window.ShadowRoot && current instanceof ShadowRoot ? current.host : undefined);\n }\n return !!(current && (current.__CE_isImportDocument || current instanceof Document));\n}\n\n/**\n * @param {!Node} root\n * @param {!Node} start\n * @return {?Node}\n */\nfunction nextSiblingOrAncestorSibling(root, start) {\n let node = start;\n while (node && node !== root && !node.nextSibling) {\n node = node.parentNode;\n }\n return (!node || node === root) ? null : node.nextSibling;\n}\n\n/**\n * @param {!Node} root\n * @param {!Node} start\n * @return {?Node}\n */\nfunction nextNode(root, start) {\n return start.firstChild ? start.firstChild : nextSiblingOrAncestorSibling(root, start);\n}\n\n/**\n * @param {!Node} root\n * @param {!function(!Element)} callback\n * @param {!Set<Node>=} visitedImports\n */\nexport function walkDeepDescendantElements(root, callback, visitedImports = new Set()) {\n let node = root;\n while (node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = /** @type {!Element} */(node);\n\n callback(element);\n\n const localName = element.localName;\n if (localName === 'link' && element.getAttribute('rel') === 'import') {\n // If this import (polyfilled or not) has it's root node available,\n // walk it.\n const importNode = /** @type {!Node} */ (element.import);\n if (importNode instanceof Node && !visitedImports.has(importNode)) {\n // Prevent multiple walks of the same import root.\n visitedImports.add(importNode);\n\n for (let child = importNode.firstChild; child; child = child.nextSibling) {\n walkDeepDescendantElements(child, callback, visitedImports);\n }\n }\n\n // Ignore descendants of import links to prevent attempting to walk the\n // elements created by the HTML Imports polyfill that we just walked\n // above.\n node = nextSiblingOrAncestorSibling(root, element);\n continue;\n } else if (localName === 'template') {\n // Ignore descendants of templates. There shouldn't be any descendants\n // because they will be moved into `.content` during construction in\n // browsers that support template but, in case they exist and are still\n // waiting to be moved by a polyfill, they will be ignored.\n node = nextSiblingOrAncestorSibling(root, element);\n continue;\n }\n\n // Walk shadow roots.\n const shadowRoot = element.__CE_shadowRoot;\n if (shadowRoot) {\n for (let child = shadowRoot.firstChild; child; child = child.nextSibling) {\n walkDeepDescendantElements(child, callback, visitedImports);\n }\n }\n }\n\n node = nextNode(root, node);\n }\n}\n\n/**\n * Used to suppress Closure's \"Modifying the prototype is only allowed if the\n * constructor is in the same scope\" warning without using\n * `@suppress {newCheckTypes, duplicate}` because `newCheckTypes` is too broad.\n *\n * @param {!Object} destination\n * @param {string} name\n * @param {*} value\n */\nexport function setPropertyUnchecked(destination, name, value) {\n destination[name] = value;\n}\n","import * as Utilities from './Utilities.js';\nimport CEState from './CustomElementState.js';\n\nexport default class CustomElementInternals {\n constructor() {\n /** @type {!Map<string, !CustomElementDefinition>} */\n this._localNameToDefinition = new Map();\n\n /** @type {!Map<!Function, !CustomElementDefinition>} */\n this._constructorToDefinition = new Map();\n\n /** @type {!Array<!function(!Node)>} */\n this._patches = [];\n\n /** @type {boolean} */\n this._hasPatches = false;\n }\n\n /**\n * @param {string} localName\n * @param {!CustomElementDefinition} definition\n */\n setDefinition(localName, definition) {\n this._localNameToDefinition.set(localName, definition);\n this._constructorToDefinition.set(definition.constructor, definition);\n }\n\n /**\n * @param {string} localName\n * @return {!CustomElementDefinition|undefined}\n */\n localNameToDefinition(localName) {\n return this._localNameToDefinition.get(localName);\n }\n\n /**\n * @param {!Function} constructor\n * @return {!CustomElementDefinition|undefined}\n */\n constructorToDefinition(constructor) {\n return this._constructorToDefinition.get(constructor);\n }\n\n /**\n * @param {!function(!Node)} listener\n */\n addPatch(listener) {\n this._hasPatches = true;\n this._patches.push(listener);\n }\n\n /**\n * @param {!Node} node\n */\n patchTree(node) {\n if (!this._hasPatches) return;\n\n Utilities.walkDeepDescendantElements(node, element => this.patch(element));\n }\n\n /**\n * @param {!Node} node\n */\n patch(node) {\n if (!this._hasPatches) return;\n\n if (node.__CE_patched) return;\n node.__CE_patched = true;\n\n for (let i = 0; i < this._patches.length; i++) {\n this._patches[i](node);\n }\n }\n\n /**\n * @param {!Node} root\n */\n connectTree(root) {\n const elements = [];\n\n Utilities.walkDeepDescendantElements(root, element => elements.push(element));\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n if (element.__CE_state === CEState.custom) {\n this.connectedCallback(element);\n } else {\n this.upgradeElement(element);\n }\n }\n }\n\n /**\n * @param {!Node} root\n */\n disconnectTree(root) {\n const elements = [];\n\n Utilities.walkDeepDescendantElements(root, element => elements.push(element));\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n if (element.__CE_state === CEState.custom) {\n this.disconnectedCallback(element);\n }\n }\n }\n\n /**\n * Upgrades all uncustomized custom elements at and below a root node for\n * which there is a definition. When custom element reaction callbacks are\n * assumed to be called synchronously (which, by the current DOM / HTML spec\n * definitions, they are *not*), callbacks for both elements customized\n * synchronously by the parser and elements being upgraded occur in the same\n * relative order.\n *\n * NOTE: This function, when used to simulate the construction of a tree that\n * is already created but not customized (i.e. by the parser), does *not*\n * prevent the element from reading the 'final' (true) state of the tree. For\n * example, the element, during truly synchronous parsing / construction would\n * see that it contains no children as they have not yet been inserted.\n * However, this function does not modify the tree, the element will\n * (incorrectly) have children. Additionally, self-modification restrictions\n * for custom element constructors imposed by the DOM spec are *not* enforced.\n *\n *\n * The following nested list shows the steps extending down from the HTML\n * spec's parsing section that cause elements to be synchronously created and\n * upgraded:\n *\n * The \"in body\" insertion mode:\n * https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n * - Switch on token:\n * .. other cases ..\n * -> Any other start tag\n * - [Insert an HTML element](below) for the token.\n *\n * Insert an HTML element:\n * https://html.spec.whatwg.org/multipage/syntax.html#insert-an-html-element\n * - Insert a foreign element for the token in the HTML namespace:\n * https://html.spec.whatwg.org/multipage/syntax.html#insert-a-foreign-element\n * - Create an element for a token:\n * https://html.spec.whatwg.org/multipage/syntax.html#create-an-element-for-the-token\n * - Will execute script flag is true?\n * - (Element queue pushed to the custom element reactions stack.)\n * - Create an element:\n * https://dom.spec.whatwg.org/#concept-create-element\n * - Sync CE flag is true?\n * - Constructor called.\n * - Self-modification restrictions enforced.\n * - Sync CE flag is false?\n * - (Upgrade reaction enqueued.)\n * - Attributes appended to element.\n * (`attributeChangedCallback` reactions enqueued.)\n * - Will execute script flag is true?\n * - (Element queue popped from the custom element reactions stack.\n * Reactions in the popped stack are invoked.)\n * - (Element queue pushed to the custom element reactions stack.)\n * - Insert the element:\n * https://dom.spec.whatwg.org/#concept-node-insert\n * - Shadow-including descendants are connected. During parsing\n * construction, there are no shadow-*excluding* descendants.\n * However, the constructor may have validly attached a shadow\n * tree to itself and added descendants to that shadow tree.\n * (`connectedCallback` reactions enqueued.)\n * - (Element queue popped from the custom element reactions stack.\n * Reactions in the popped stack are invoked.)\n *\n * @param {!Node} root\n * @param {{\n * visitedImports: (!Set<!Node>|undefined),\n * upgrade: (!function(!Element)|undefined),\n * }=} options\n */\n patchAndUpgradeTree(root, options = {}) {\n const visitedImports = options.visitedImports || new Set();\n const upgrade = options.upgrade || (element => this.upgradeElement(element));\n\n const elements = [];\n\n const gatherElements = element => {\n if (element.localName === 'link' && element.getAttribute('rel') === 'import') {\n // The HTML Imports polyfill sets a descendant element of the link to\n // the `import` property, specifically this is *not* a Document.\n const importNode = /** @type {?Node} */ (element.import);\n\n if (importNode instanceof Node) {\n importNode.__CE_isImportDocument = true;\n // Connected links are associated with the registry.\n importNode.__CE_hasRegistry = true;\n }\n\n if (importNode && importNode.readyState === 'complete') {\n importNode.__CE_documentLoadHandled = true;\n } else {\n // If this link's import root is not available, its contents can't be\n // walked. Wait for 'load' and walk it when it's ready.\n element.addEventListener('load', () => {\n const importNode = /** @type {!Node} */ (element.import);\n\n if (importNode.__CE_documentLoadHandled) return;\n importNode.__CE_documentLoadHandled = true;\n\n // Clone the `visitedImports` set that was populated sync during\n // the `patchAndUpgradeTree` call that caused this 'load' handler to\n // be added. Then, remove *this* link's import node so that we can\n // walk that import again, even if it was partially walked later\n // during the same `patchAndUpgradeTree` call.\n const clonedVisitedImports = new Set(visitedImports);\n clonedVisitedImports.delete(importNode);\n\n this.patchAndUpgradeTree(importNode, {visitedImports: clonedVisitedImports, upgrade});\n });\n }\n } else {\n elements.push(element);\n }\n };\n\n // `walkDeepDescendantElements` populates (and internally checks against)\n // `visitedImports` when traversing a loaded import.\n Utilities.walkDeepDescendantElements(root, gatherElements, visitedImports);\n\n if (this._hasPatches) {\n for (let i = 0; i < elements.length; i++) {\n this.patch(elements[i]);\n }\n }\n\n for (let i = 0; i < elements.length; i++) {\n upgrade(elements[i]);\n }\n }\n\n /**\n * @param {!Element} element\n */\n upgradeElement(element) {\n const currentState = element.__CE_state;\n if (currentState !== undefined) return;\n\n // Prevent elements created in documents without a browsing context from\n // upgrading.\n //\n // https://html.spec.whatwg.org/multipage/custom-elements.html#look-up-a-custom-element-definition\n // \"If document does not have a browsing context, return null.\"\n //\n // https://html.spec.whatwg.org/multipage/window-object.html#dom-document-defaultview\n // \"The defaultView IDL attribute of the Document interface, on getting,\n // must return this Document's browsing context's WindowProxy object, if\n // this Document has an associated browsing context, or null otherwise.\"\n const ownerDocument = element.ownerDocument;\n if (\n !ownerDocument.defaultView &&\n !(ownerDocument.__CE_isImportDocument && ownerDocument.__CE_hasRegistry)\n ) return;\n\n const definition = this.localNameToDefinition(element.localName);\n if (!definition) return;\n\n definition.constructionStack.push(element);\n\n const constructor = definition.constructor;\n try {\n try {\n let result = new (constructor)();\n if (result !== element) {\n throw new Error('The custom element constructor did not produce the element being upgraded.');\n }\n } finally {\n definition.constructionStack.pop();\n }\n } catch (e) {\n element.__CE_state = CEState.failed;\n throw e;\n }\n\n element.__CE_state = CEState.custom;\n element.__CE_definition = definition;\n\n if (definition.attributeChangedCallback) {\n const observedAttributes = definition.observedAttributes;\n for (let i = 0; i < observedAttributes.length; i++) {\n const name = observedAttributes[i];\n const value = element.getAttribute(name);\n if (value !== null) {\n this.attributeChangedCallback(element, name, null, value, null);\n }\n }\n }\n\n if (Utilities.isConnected(element)) {\n this.connectedCallback(element);\n }\n }\n\n /**\n * @param {!Element} element\n */\n connectedCallback(element) {\n const definition = element.__CE_definition;\n if (definition.connectedCallback) {\n definition.connectedCallback.call(element);\n }\n }\n\n /**\n * @param {!Element} element\n */\n disconnectedCallback(element) {\n const definition = element.__CE_definition;\n if (definition.disconnectedCallback) {\n definition.disconnectedCallback.call(element);\n }\n }\n\n /**\n * @param {!Element} element\n * @param {string} name\n * @param {?string} oldValue\n * @param {?string} newValue\n * @param {?string} namespace\n */\n attributeChangedCallback(element, name, oldValue, newValue, namespace) {\n const definition = element.__CE_definition;\n if (\n definition.attributeChangedCallback &&\n definition.observedAttributes.indexOf(name) > -1\n ) {\n definition.attributeChangedCallback.call(element, name, oldValue, newValue, namespace);\n }\n }\n}\n","/**\n * @enum {number}\n */\nconst CustomElementState = {\n custom: 1,\n failed: 2,\n};\n\nexport default CustomElementState;\n","import CustomElementInternals from './CustomElementInternals.js';\n\nexport default class DocumentConstructionObserver {\n constructor(internals, doc) {\n /**\n * @type {!CustomElementInternals}\n */\n this._internals = internals;\n\n /**\n * @type {!Document}\n */\n this._document = doc;\n\n /**\n * @type {MutationObserver|undefined}\n */\n this._observer = undefined;\n\n\n // Simulate tree construction for all currently accessible nodes in the\n // document.\n this._internals.patchAndUpgradeTree(this._document);\n\n if (this._document.readyState === 'loading') {\n this._observer = new MutationObserver(this._handleMutations.bind(this));\n\n // Nodes created by the parser are given to the observer *before* the next\n // task runs. Inline scripts are run in a new task. This means that the\n // observer will be able to handle the newly parsed nodes before the inline\n // script is run.\n this._observer.observe(this._document, {\n childList: true,\n subtree: true,\n });\n }\n }\n\n disconnect() {\n if (this._observer) {\n this._observer.disconnect();\n }\n }\n\n /**\n * @param {!Array<!MutationRecord>} mutations\n */\n _handleMutations(mutations) {\n // Once the document's `readyState` is 'interactive' or 'complete', all new\n // nodes created within that document will be the result of script and\n // should be handled by patching.\n const readyState = this._document.readyState;\n if (readyState === 'interactive' || readyState === 'complete') {\n this.disconnect();\n }\n\n for (let i = 0; i < mutations.length; i++) {\n const addedNodes = mutations[i].addedNodes;\n for (let j = 0; j < addedNodes.length; j++) {\n const node = addedNodes[j];\n this._internals.patchAndUpgradeTree(node);\n }\n }\n }\n}\n","import CustomElementInternals from './CustomElementInternals.js';\nimport DocumentConstructionObserver from './DocumentConstructionObserver.js';\nimport Deferred from './Deferred.js';\nimport * as Utilities from './Utilities.js';\n\n/**\n * @unrestricted\n */\nexport default class CustomElementRegistry {\n\n /**\n * @param {!CustomElementInternals} internals\n */\n constructor(internals) {\n /**\n * @private\n * @type {boolean}\n */\n this._elementDefinitionIsRunning = false;\n\n /**\n * @private\n * @type {!CustomElementInternals}\n */\n this._internals = internals;\n\n /**\n * @private\n * @type {!Map<string, !Deferred<undefined>>}\n */\n this._whenDefinedDeferred = new Map();\n\n /**\n * The default flush callback triggers the document walk synchronously.\n * @private\n * @type {!Function}\n */\n this._flushCallback = fn => fn();\n\n /**\n * @private\n * @type {boolean}\n */\n this._flushPending = false;\n\n /**\n * @private\n * @type {!Array<!CustomElementDefinition>}\n */\n this._pendingDefinitions = [];\n\n /**\n * @private\n * @type {!DocumentConstructionObserver}\n */\n this._documentConstructionObserver = new DocumentConstructionObserver(internals, document);\n }\n\n /**\n * @param {string} localName\n * @param {!Function} constructor\n */\n define(localName, constructor) {\n if (!(constructor instanceof Function)) {\n throw new TypeError('Custom element constructors must be functions.');\n }\n\n if (!Utilities.isValidCustomElementName(localName)) {\n throw new SyntaxError(`The element name '${localName}' is not valid.`);\n }\n\n if (this._internals.localNameToDefinition(localName)) {\n throw new Error(`A custom element with name '${localName}' has already been defined.`);\n }\n\n if (this._elementDefinitionIsRunning) {\n throw new Error('A custom element is already being defined.');\n }\n this._elementDefinitionIsRunning = true;\n\n let connectedCallback;\n let disconnectedCallback;\n let adoptedCallback;\n let attributeChangedCallback;\n let observedAttributes;\n try {\n /** @type {!Object} */\n const prototype = constructor.prototype;\n if (!(prototype instanceof Object)) {\n throw new TypeError('The custom element constructor\\'s prototype is not an object.');\n }\n\n function getCallback(name) {\n const callbackValue = prototype[name];\n if (callbackValue !== undefined && !(callbackValue instanceof Function)) {\n throw new Error(`The '${name}' callback must be a function.`);\n }\n return callbackValue;\n }\n\n connectedCallback = getCallback('connectedCallback');\n disconnectedCallback = getCallback('disconnectedCallback');\n adoptedCallback = getCallback('adoptedCallback');\n attributeChangedCallback = getCallback('attributeChangedCallback');\n observedAttributes = constructor['observedAttributes'] || [];\n } catch (e) {\n return;\n } finally {\n this._elementDefinitionIsRunning = false;\n }\n\n const definition = {\n localName,\n constructor,\n connectedCallback,\n disconnectedCallback,\n adoptedCallback,\n attributeChangedCallback,\n observedAttributes,\n constructionStack: [],\n };\n\n this._internals.setDefinition(localName, definition);\n this._pendingDefinitions.push(definition);\n\n // If we've already called the flush callback and it hasn't called back yet,\n // don't call it again.\n if (!this._flushPending) {\n this._flushPending = true;\n this._flushCallback(() => this._flush());\n }\n }\n\n upgrade(element) {\n this._internals.patchAndUpgradeTree(element);\n }\n\n _flush() {\n // If no new definitions were defined, don't attempt to flush. This could\n // happen if a flush callback keeps the function it is given and calls it\n // multiple times.\n if (this._flushPending === false) return;\n this._flushPending = false;\n\n const pendingDefinitions = this._pendingDefinitions;\n\n /**\n * Unupgraded elements with definitions that were defined *before* the last\n * flush, in document order.\n * @type {!Array<!Element>}\n */\n const elementsWithStableDefinitions = [];\n\n /**\n * A map from `localName`s of definitions that were defined *after* the last\n * flush to unupgraded elements matching that definition, in document order.\n * @type {!Map<string, !Array<!Element>>}\n */\n const elementsWithPendingDefinitions = new Map();\n for (let i = 0; i < pendingDefinitions.length; i++) {\n elementsWithPendingDefinitions.set(pendingDefinitions[i].localName, []);\n }\n\n this._internals.patchAndUpgradeTree(document, {\n upgrade: element => {\n // Ignore the element if it has already upgraded or failed to upgrade.\n if (element.__CE_state !== undefined) return;\n\n const localName = element.localName;\n\n // If there is an applicable pending definition for the element, add the\n // element to the list of elements to be upgraded with that definition.\n const pendingElements = elementsWithPendingDefinitions.get(localName);\n if (pendingElements) {\n pendingElements.push(element);\n // If there is *any other* applicable definition for the element, add it\n // to the list of elements with stable definitions that need to be upgraded.\n } else if (this._internals.localNameToDefinition(localName)) {\n elementsWithStableDefinitions.push(element);\n }\n },\n });\n\n // Upgrade elements with 'stable' definitions first.\n for (let i = 0; i < elementsWithStableDefinitions.length; i++) {\n this._internals.upgradeElement(elementsWithStableDefinitions[i]);\n }\n\n // Upgrade elements with 'pending' definitions in the order they were defined.\n while (pendingDefinitions.length > 0) {\n const definition = pendingDefinitions.shift();\n const localName = definition.localName;\n\n // Attempt to upgrade all applicable elements.\n const pendingUpgradableElements = elementsWithPendingDefinitions.get(definition.localName);\n for (let i = 0; i < pendingUpgradableElements.length; i++) {\n this._internals.upgradeElement(pendingUpgradableElements[i]);\n }\n\n // Resolve any promises created by `whenDefined` for the definition.\n const deferred = this._whenDefinedDeferred.get(localName);\n if (deferred) {\n deferred.resolve(undefined);\n }\n }\n }\n\n /**\n * @param {string} localName\n * @return {Function|undefined}\n */\n get(localName) {\n const definition = this._internals.localNameToDefinition(localName);\n if (definition) {\n return definition.constructor;\n }\n\n return undefined;\n }\n\n /**\n * @param {string} localName\n * @return {!Promise<undefined>}\n */\n whenDefined(localName) {\n if (!Utilities.isValidCustomElementName(localName)) {\n return Promise.reject(new SyntaxError(`'${localName}' is not a valid custom element name.`));\n }\n\n const prior = this._whenDefinedDeferred.get(localName);\n if (prior) {\n return prior.toPromise();\n }\n\n const deferred = new Deferred();\n this._whenDefinedDeferred.set(localName, deferred);\n\n const definition = this._internals.localNameToDefinition(localName);\n // Resolve immediately only if the given local name has a definition *and*\n // the full document walk to upgrade elements with that local name has\n // already happened.\n if (definition && !this._pendingDefinitions.some(d => d.localName === localName)) {\n deferred.resolve(undefined);\n }\n\n return deferred.toPromise();\n }\n\n polyfillWrapFlushCallback(outer) {\n this._documentConstructionObserver.disconnect();\n const inner = this._flushCallback;\n this._flushCallback = flush => outer(() => inner(flush));\n }\n}\n\n// Closure compiler exports.\nwindow['CustomElementRegistry'] = CustomElementRegistry;\nCustomElementRegistry.prototype['define'] = CustomElementRegistry.prototype.define;\nCustomElementRegistry.prototype['upgrade'] = CustomElementRegistry.prototype.upgrade;\nCustomElementRegistry.prototype['get'] = CustomElementRegistry.prototype.get;\nCustomElementRegistry.prototype['whenDefined'] = CustomElementRegistry.prototype.whenDefined;\nCustomElementRegistry.prototype['polyfillWrapFlushCallback'] = CustomElementRegistry.prototype.polyfillWrapFlushCallback;\n","/**\n * @template T\n */\nexport default class Deferred {\n constructor() {\n /**\n * @private\n * @type {T|undefined}\n */\n this._value = undefined;\n\n /**\n * @private\n * @type {Function|undefined}\n */\n this._resolve = undefined;\n\n /**\n * @private\n * @type {!Promise<T>}\n */\n this._promise = new Promise(resolve => {\n this._resolve = resolve;\n\n if (this._value) {\n resolve(this._value);\n }\n });\n }\n\n /**\n * @param {T} value\n */\n resolve(value) {\n if (this._value) {\n throw new Error('Already resolved.');\n }\n\n this._value = value;\n\n if (this._resolve) {\n this._resolve(value);\n }\n }\n\n /**\n * @return {!Promise<T>}\n */\n toPromise() {\n return this._promise;\n }\n}\n","export default {\n Document_createElement: window.Document.prototype.createElement,\n Document_createElementNS: window.Document.prototype.createElementNS,\n Document_importNode: window.Document.prototype.importNode,\n Document_prepend: window.Document.prototype['prepend'],\n Document_append: window.Document.prototype['append'],\n DocumentFragment_prepend: window.DocumentFragment.prototype['prepend'],\n DocumentFragment_append: window.DocumentFragment.prototype['append'],\n Node_cloneNode: window.Node.prototype.cloneNode,\n Node_appendChild: window.Node.prototype.appendChild,\n Node_insertBefore: window.Node.prototype.insertBefore,\n Node_removeChild: window.Node.prototype.removeChild,\n Node_replaceChild: window.Node.prototype.replaceChild,\n Node_textContent: Object.getOwnPropertyDescriptor(window.Node.prototype, 'textContent'),\n Element_attachShadow: window.Element.prototype['attachShadow'],\n Element_innerHTML: Object.getOwnPropertyDescriptor(window.Element.prototype, 'innerHTML'),\n Element_getAttribute: window.Element.prototype.getAttribute,\n Element_setAttribute: window.Element.prototype.setAttribute,\n Element_removeAttribute: window.Element.prototype.removeAttribute,\n Element_getAttributeNS: window.Element.prototype.getAttributeNS,\n Element_setAttributeNS: window.Element.prototype.setAttributeNS,\n Element_removeAttributeNS: window.Element.prototype.removeAttributeNS,\n Element_insertAdjacentElement: window.Element.prototype['insertAdjacentElement'],\n Element_insertAdjacentHTML: window.Element.prototype['insertAdjacentHTML'],\n Element_prepend: window.Element.prototype['prepend'],\n Element_append: window.Element.prototype['append'],\n Element_before: window.Element.prototype['before'],\n Element_after: window.Element.prototype['after'],\n Element_replaceWith: window.Element.prototype['replaceWith'],\n Element_remove: window.Element.prototype['remove'],\n HTMLElement: window.HTMLElement,\n HTMLElement_innerHTML: Object.getOwnPropertyDescriptor(window.HTMLElement.prototype, 'innerHTML'),\n HTMLElement_insertAdjacentElement: window.HTMLElement.prototype['insertAdjacentElement'],\n HTMLElement_insertAdjacentHTML: window.HTMLElement.prototype['insertAdjacentHTML'],\n};\n","/**\n * This class exists only to work around Closure's lack of a way to describe\n * singletons. It represents the 'already constructed marker' used in custom\n * element construction stacks.\n *\n * https://html.spec.whatwg.org/#concept-already-constructed-marker\n */\nclass AlreadyConstructedMarker {}\n\nexport default new AlreadyConstructedMarker();\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport CEState from '../CustomElementState.js';\nimport AlreadyConstructedMarker from '../AlreadyConstructedMarker.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n window['HTMLElement'] = (function() {\n /**\n * @type {function(new: HTMLElement): !HTMLElement}\n */\n function HTMLElement() {\n // This should really be `new.target` but `new.target` can't be emulated\n // in ES5. Assuming the user keeps the default value of the constructor's\n // prototype's `constructor` property, this is equivalent.\n /** @type {!Function} */\n const constructor = this.constructor;\n\n const definition = internals.constructorToDefinition(constructor);\n if (!definition) {\n throw new Error('The custom element being constructed was not registered with `customElements`.');\n }\n\n const constructionStack = definition.constructionStack;\n\n if (constructionStack.length === 0) {\n const element = Native.Document_createElement.call(document, definition.localName);\n Object.setPrototypeOf(element, constructor.prototype);\n element.__CE_state = CEState.custom;\n element.__CE_definition = definition;\n internals.patch(element);\n return element;\n }\n\n const lastIndex = constructionStack.length - 1;\n const element = constructionStack[lastIndex];\n if (element === AlreadyConstructedMarker) {\n throw new Error('The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.');\n }\n constructionStack[lastIndex] = AlreadyConstructedMarker;\n\n Object.setPrototypeOf(element, constructor.prototype);\n internals.patch(/** @type {!HTMLElement} */ (element));\n\n return element;\n }\n\n HTMLElement.prototype = Native.HTMLElement.prototype;\n\n return HTMLElement;\n })();\n};\n","/**\n * @license\n * Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nimport CustomElementInternals from './CustomElementInternals.js';\nimport CustomElementRegistry from './CustomElementRegistry.js';\n\nimport PatchHTMLElement from './Patch/HTMLElement.js';\nimport PatchDocument from './Patch/Document.js';\nimport PatchDocumentFragment from './Patch/DocumentFragment.js';\nimport PatchNode from './Patch/Node.js';\nimport PatchElement from './Patch/Element.js';\n\nconst priorCustomElements = window['customElements'];\n\nif (!priorCustomElements ||\n priorCustomElements['forcePolyfill'] ||\n (typeof priorCustomElements['define'] != 'function') ||\n (typeof priorCustomElements['get'] != 'function')) {\n /** @type {!CustomElementInternals} */\n const internals = new CustomElementInternals();\n\n PatchHTMLElement(internals);\n PatchDocument(internals);\n PatchDocumentFragment(internals);\n PatchNode(internals);\n PatchElement(internals);\n\n // The main document is always associated with the registry.\n document.__CE_hasRegistry = true;\n\n /** @type {!CustomElementRegistry} */\n const customElements = new CustomElementRegistry(internals);\n\n Object.defineProperty(window, 'customElements', {\n configurable: true,\n enumerable: true,\n value: customElements,\n });\n}\n","import CustomElementInternals from '../../CustomElementInternals.js';\nimport * as Utilities from '../../Utilities.js';\n\n/**\n * @typedef {{\n * prepend: !function(...(!Node|string)),\n * append: !function(...(!Node|string)),\n * }}\n */\nlet ParentNodeNativeMethods;\n\n/**\n * @param {!CustomElementInternals} internals\n * @param {!Object} destination\n * @param {!ParentNodeNativeMethods} builtIn\n */\nexport default function(internals, destination, builtIn) {\n /**\n * @param {!function(...(!Node|string))} builtInMethod\n * @return {!function(...(!Node|string))}\n */\n function appendPrependPatch(builtInMethod) {\n return function(...nodes) {\n /**\n * A copy of `nodes`, with any DocumentFragment replaced by its children.\n * @type {!Array<!Node>}\n */\n const flattenedNodes = [];\n\n /**\n * Elements in `nodes` that were connected before this call.\n * @type {!Array<!Node>}\n */\n const connectedElements = [];\n\n for (var i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if (node instanceof Element && Utilities.isConnected(node)) {\n connectedElements.push(node);\n }\n\n if (node instanceof DocumentFragment) {\n for (let child = node.firstChild; child; child = child.nextSibling) {\n flattenedNodes.push(child);\n }\n } else {\n flattenedNodes.push(node);\n }\n }\n\n builtInMethod.apply(this, nodes);\n\n for (let i = 0; i < connectedElements.length; i++) {\n internals.disconnectTree(connectedElements[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < flattenedNodes.length; i++) {\n const node = flattenedNodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n }\n\n if (builtIn.prepend !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'prepend', appendPrependPatch(builtIn.prepend));\n }\n\n if (builtIn.append !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'append', appendPrependPatch(builtIn.append));\n }\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport * as Utilities from '../Utilities.js';\n\nimport PatchParentNode from './Interface/ParentNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n Utilities.setPropertyUnchecked(Document.prototype, 'createElement',\n /**\n * @this {Document}\n * @param {string} localName\n * @return {!Element}\n */\n function(localName) {\n // Only create custom elements if this document is associated with the registry.\n if (this.__CE_hasRegistry) {\n const definition = internals.localNameToDefinition(localName);\n if (definition) {\n return new (definition.constructor)();\n }\n }\n\n const result = /** @type {!Element} */\n (Native.Document_createElement.call(this, localName));\n internals.patch(result);\n return result;\n });\n\n Utilities.setPropertyUnchecked(Document.prototype, 'importNode',\n /**\n * @this {Document}\n * @param {!Node} node\n * @param {boolean=} deep\n * @return {!Node}\n */\n function(node, deep) {\n const clone = Native.Document_importNode.call(this, node, deep);\n // Only create custom elements if this document is associated with the registry.\n if (!this.__CE_hasRegistry) {\n internals.patchTree(clone);\n } else {\n internals.patchAndUpgradeTree(clone);\n }\n return clone;\n });\n\n const NS_HTML = \"http://www.w3.org/1999/xhtml\";\n\n Utilities.setPropertyUnchecked(Document.prototype, 'createElementNS',\n /**\n * @this {Document}\n * @param {?string} namespace\n * @param {string} localName\n * @return {!Element}\n */\n function(namespace, localName) {\n // Only create custom elements if this document is associated with the registry.\n if (this.__CE_hasRegistry && (namespace === null || namespace === NS_HTML)) {\n const definition = internals.localNameToDefinition(localName);\n if (definition) {\n return new (definition.constructor)();\n }\n }\n\n const result = /** @type {!Element} */\n (Native.Document_createElementNS.call(this, namespace, localName));\n internals.patch(result);\n return result;\n });\n\n PatchParentNode(internals, Document.prototype, {\n prepend: Native.Document_prepend,\n append: Native.Document_append,\n });\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport * as Utilities from '../Utilities.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n // `Node#nodeValue` is implemented on `Attr`.\n // `Node#textContent` is implemented on `Attr`, `Element`.\n\n Utilities.setPropertyUnchecked(Node.prototype, 'insertBefore',\n /**\n * @this {Node}\n * @param {!Node} node\n * @param {?Node} refNode\n * @return {!Node}\n */\n function(node, refNode) {\n if (node instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(node.childNodes);\n const nativeResult = Native.Node_insertBefore.call(this, node, refNode);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_insertBefore.call(this, node, refNode);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n if (Utilities.isConnected(this)) {\n internals.connectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'appendChild',\n /**\n * @this {Node}\n * @param {!Node} node\n * @return {!Node}\n */\n function(node) {\n if (node instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(node.childNodes);\n const nativeResult = Native.Node_appendChild.call(this, node);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_appendChild.call(this, node);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n if (Utilities.isConnected(this)) {\n internals.connectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'cloneNode',\n /**\n * @this {Node}\n * @param {boolean=} deep\n * @return {!Node}\n */\n function(deep) {\n const clone = Native.Node_cloneNode.call(this, deep);\n // Only create custom elements if this element's owner document is\n // associated with the registry.\n if (!this.ownerDocument.__CE_hasRegistry) {\n internals.patchTree(clone);\n } else {\n internals.patchAndUpgradeTree(clone);\n }\n return clone;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'removeChild',\n /**\n * @this {Node}\n * @param {!Node} node\n * @return {!Node}\n */\n function(node) {\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_removeChild.call(this, node);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'replaceChild',\n /**\n * @this {Node}\n * @param {!Node} nodeToInsert\n * @param {!Node} nodeToRemove\n * @return {!Node}\n */\n function(nodeToInsert, nodeToRemove) {\n if (nodeToInsert instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(nodeToInsert.childNodes);\n const nativeResult = Native.Node_replaceChild.call(this, nodeToInsert, nodeToRemove);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n internals.disconnectTree(nodeToRemove);\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeToInsertWasConnected = Utilities.isConnected(nodeToInsert);\n const nativeResult = Native.Node_replaceChild.call(this, nodeToInsert, nodeToRemove);\n const thisIsConnected = Utilities.isConnected(this);\n\n if (thisIsConnected) {\n internals.disconnectTree(nodeToRemove);\n }\n\n if (nodeToInsertWasConnected) {\n internals.disconnectTree(nodeToInsert);\n }\n\n if (thisIsConnected) {\n internals.connectTree(nodeToInsert);\n }\n\n return nativeResult;\n });\n\n\n function patch_textContent(destination, baseDescriptor) {\n Object.defineProperty(destination, 'textContent', {\n enumerable: baseDescriptor.enumerable,\n configurable: true,\n get: baseDescriptor.get,\n set: /** @this {Node} */ function(assignedValue) {\n // If this is a text node then there are no nodes to disconnect.\n if (this.nodeType === Node.TEXT_NODE) {\n baseDescriptor.set.call(this, assignedValue);\n return;\n }\n\n let removedNodes = undefined;\n // Checking for `firstChild` is faster than reading `childNodes.length`\n // to compare with 0.\n if (this.firstChild) {\n // Using `childNodes` is faster than `children`, even though we only\n // care about elements.\n const childNodes = this.childNodes;\n const childNodesLength = childNodes.length;\n if (childNodesLength > 0 && Utilities.isConnected(this)) {\n // Copying an array by iterating is faster than using slice.\n removedNodes = new Array(childNodesLength);\n for (let i = 0; i < childNodesLength; i++) {\n removedNodes[i] = childNodes[i];\n }\n }\n }\n\n baseDescriptor.set.call(this, assignedValue);\n\n if (removedNodes) {\n for (let i = 0; i < removedNodes.length; i++) {\n internals.disconnectTree(removedNodes[i]);\n }\n }\n },\n });\n }\n\n if (Native.Node_textContent && Native.Node_textContent.get) {\n patch_textContent(Node.prototype, Native.Node_textContent);\n } else {\n internals.addPatch(function(element) {\n patch_textContent(element, {\n enumerable: true,\n configurable: true,\n // NOTE: This implementation of the `textContent` getter assumes that\n // text nodes' `textContent` getter will not be patched.\n get: /** @this {Node} */ function() {\n /** @type {!Array<string>} */\n const parts = [];\n\n for (let i = 0; i < this.childNodes.length; i++) {\n parts.push(this.childNodes[i].textContent);\n }\n\n return parts.join('');\n },\n set: /** @this {Node} */ function(assignedValue) {\n while (this.firstChild) {\n Native.Node_removeChild.call(this, this.firstChild);\n }\n Native.Node_appendChild.call(this, document.createTextNode(assignedValue));\n },\n });\n });\n }\n};\n","import CustomElementInternals from '../../CustomElementInternals.js';\nimport * as Utilities from '../../Utilities.js';\n\n/**\n * @typedef {{\n * before: !function(...(!Node|string)),\n * after: !function(...(!Node|string)),\n * replaceWith: !function(...(!Node|string)),\n * remove: !function(),\n * }}\n */\nlet ChildNodeNativeMethods;\n\n/**\n * @param {!CustomElementInternals} internals\n * @param {!Object} destination\n * @param {!ChildNodeNativeMethods} builtIn\n */\nexport default function(internals, destination, builtIn) {\n /**\n * @param {!function(...(!Node|string))} builtInMethod\n * @return {!function(...(!Node|string))}\n */\n function beforeAfterPatch(builtInMethod) {\n return function(...nodes) {\n /**\n * A copy of `nodes`, with any DocumentFragment replaced by its children.\n * @type {!Array<!Node>}\n */\n const flattenedNodes = [];\n\n /**\n * Elements in `nodes` that were connected before this call.\n * @type {!Array<!Node>}\n */\n const connectedElements = [];\n\n for (var i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if (node instanceof Element && Utilities.isConnected(node)) {\n connectedElements.push(node);\n }\n\n if (node instanceof DocumentFragment) {\n for (let child = node.firstChild; child; child = child.nextSibling) {\n flattenedNodes.push(child);\n }\n } else {\n flattenedNodes.push(node);\n }\n }\n\n builtInMethod.apply(this, nodes);\n\n for (let i = 0; i < connectedElements.length; i++) {\n internals.disconnectTree(connectedElements[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < flattenedNodes.length; i++) {\n const node = flattenedNodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n }\n\n if (builtIn.before !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'before', beforeAfterPatch(builtIn.before));\n }\n\n if (builtIn.before !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'after', beforeAfterPatch(builtIn.after));\n }\n\n if (builtIn.replaceWith !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'replaceWith',\n /**\n * @param {...(!Node|string)} nodes\n */\n function(...nodes) {\n /**\n * A copy of `nodes`, with any DocumentFragment replaced by its children.\n * @type {!Array<!Node>}\n */\n const flattenedNodes = [];\n\n /**\n * Elements in `nodes` that were connected before this call.\n * @type {!Array<!Node>}\n */\n const connectedElements = [];\n\n for (var i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if (node instanceof Element && Utilities.isConnected(node)) {\n connectedElements.push(node);\n }\n\n if (node instanceof DocumentFragment) {\n for (let child = node.firstChild; child; child = child.nextSibling) {\n flattenedNodes.push(child);\n }\n } else {\n flattenedNodes.push(node);\n }\n }\n\n const wasConnected = Utilities.isConnected(this);\n\n builtIn.replaceWith.apply(this, nodes);\n\n for (let i = 0; i < connectedElements.length; i++) {\n internals.disconnectTree(connectedElements[i]);\n }\n\n if (wasConnected) {\n internals.disconnectTree(this);\n for (let i = 0; i < flattenedNodes.length; i++) {\n const node = flattenedNodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n });\n }\n\n if (builtIn.remove !== undefined) {\n Utilities.setPropertyUnchecked(destination, 'remove',\n function() {\n const wasConnected = Utilities.isConnected(this);\n\n builtIn.remove.call(this);\n\n if (wasConnected) {\n internals.disconnectTree(this);\n }\n });\n }\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport CEState from '../CustomElementState.js';\nimport * as Utilities from '../Utilities.js';\n\nimport PatchParentNode from './Interface/ParentNode.js';\nimport PatchChildNode from './Interface/ChildNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n if (Native.Element_attachShadow) {\n Utilities.setPropertyUnchecked(Element.prototype, 'attachShadow',\n /**\n * @this {Element}\n * @param {!{mode: string}} init\n * @return {ShadowRoot}\n */\n function(init) {\n const shadowRoot = Native.Element_attachShadow.call(this, init);\n this.__CE_shadowRoot = shadowRoot;\n return shadowRoot;\n });\n }\n\n\n function patch_innerHTML(destination, baseDescriptor) {\n Object.defineProperty(destination, 'innerHTML', {\n enumerable: baseDescriptor.enumerable,\n configurable: true,\n get: baseDescriptor.get,\n set: /** @this {Element} */ function(htmlString) {\n const isConnected = Utilities.isConnected(this);\n\n // NOTE: In IE11, when using the native `innerHTML` setter, all nodes\n // that were previously descendants of the context element have all of\n // their children removed as part of the set - the entire subtree is\n // 'disassembled'. This work around walks the subtree *before* using the\n // native setter.\n /** @type {!Array<!Element>|undefined} */\n let removedElements = undefined;\n if (isConnected) {\n removedElements = [];\n Utilities.walkDeepDescendantElements(this, element => {\n if (element !== this) {\n removedElements.push(element);\n }\n });\n }\n\n baseDescriptor.set.call(this, htmlString);\n\n if (removedElements) {\n for (let i = 0; i < removedElements.length; i++) {\n const element = removedElements[i];\n if (element.__CE_state === CEState.custom) {\n internals.disconnectedCallback(element);\n }\n }\n }\n\n // Only create custom elements if this element's owner document is\n // associated with the registry.\n if (!this.ownerDocument.__CE_hasRegistry) {\n internals.patchTree(this);\n } else {\n internals.patchAndUpgradeTree(this);\n }\n return htmlString;\n },\n });\n }\n\n if (Native.Element_innerHTML && Native.Element_innerHTML.get) {\n patch_innerHTML(Element.prototype, Native.Element_innerHTML);\n } else if (Native.HTMLElement_innerHTML && Native.HTMLElement_innerHTML.get) {\n patch_innerHTML(HTMLElement.prototype, Native.HTMLElement_innerHTML);\n } else {\n\n internals.addPatch(function(element) {\n patch_innerHTML(element, {\n enumerable: true,\n configurable: true,\n // Implements getting `innerHTML` by performing an unpatched `cloneNode`\n // of the element and returning the resulting element's `innerHTML`.\n // TODO: Is this too expensive?\n get: /** @this {Element} */ function() {\n return Native.Node_cloneNode.call(this, true).innerHTML;\n },\n // Implements setting `innerHTML` by creating an unpatched element,\n // setting `innerHTML` of that element and replacing the target\n // element's children with those of the unpatched element.\n set: /** @this {Element} */ function(assignedValue) {\n // NOTE: re-route to `content` for `template` elements.\n // We need to do this because `template.appendChild` does not\n // route into `template.content`.\n const isTemplate = (this.localName === 'template');\n /** @type {!Node} */\n const content = isTemplate ? (/** @type {!HTMLTemplateElement} */\n (this)).content : this;\n /** @type {!Node} */\n const rawElement = Native.Document_createElement.call(document,\n this.localName);\n rawElement.innerHTML = assignedValue;\n\n while (content.childNodes.length > 0) {\n Native.Node_removeChild.call(content, content.childNodes[0]);\n }\n const container = isTemplate ? rawElement.content : rawElement;\n while (container.childNodes.length > 0) {\n Native.Node_appendChild.call(content, container.childNodes[0]);\n }\n },\n });\n });\n }\n\n\n Utilities.setPropertyUnchecked(Element.prototype, 'setAttribute',\n /**\n * @this {Element}\n * @param {string} name\n * @param {string} newValue\n */\n function(name, newValue) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_setAttribute.call(this, name, newValue);\n }\n\n const oldValue = Native.Element_getAttribute.call(this, name);\n Native.Element_setAttribute.call(this, name, newValue);\n newValue = Native.Element_getAttribute.call(this, name);\n internals.attributeChangedCallback(this, name, oldValue, newValue, null);\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'setAttributeNS',\n /**\n * @this {Element}\n * @param {?string} namespace\n * @param {string} name\n * @param {string} newValue\n */\n function(namespace, name, newValue) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_setAttributeNS.call(this, namespace, name, newValue);\n }\n\n const oldValue = Native.Element_getAttributeNS.call(this, namespace, name);\n Native.Element_setAttributeNS.call(this, namespace, name, newValue);\n newValue = Native.Element_getAttributeNS.call(this, namespace, name);\n internals.attributeChangedCallback(this, name, oldValue, newValue, namespace);\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'removeAttribute',\n /**\n * @this {Element}\n * @param {string} name\n */\n function(name) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_removeAttribute.call(this, name);\n }\n\n const oldValue = Native.Element_getAttribute.call(this, name);\n Native.Element_removeAttribute.call(this, name);\n if (oldValue !== null) {\n internals.attributeChangedCallback(this, name, oldValue, null, null);\n }\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'removeAttributeNS',\n /**\n * @this {Element}\n * @param {?string} namespace\n * @param {string} name\n */\n function(namespace, name) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_removeAttributeNS.call(this, namespace, name);\n }\n\n const oldValue = Native.Element_getAttributeNS.call(this, namespace, name);\n Native.Element_removeAttributeNS.call(this, namespace, name);\n // In older browsers, `Element#getAttributeNS` may return the empty string\n // instead of null if the attribute does not exist. For details, see;\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttributeNS#Notes\n const newValue = Native.Element_getAttributeNS.call(this, namespace, name);\n if (oldValue !== newValue) {\n internals.attributeChangedCallback(this, name, oldValue, newValue, namespace);\n }\n });\n\n\n function patch_insertAdjacentElement(destination, baseMethod) {\n Utilities.setPropertyUnchecked(destination, 'insertAdjacentElement',\n /**\n * @this {Element}\n * @param {string} position\n * @param {!Element} element\n * @return {?Element}\n */\n function(position, element) {\n const wasConnected = Utilities.isConnected(element);\n const insertedElement = /** @type {!Element} */\n (baseMethod.call(this, position, element));\n\n if (wasConnected) {\n internals.disconnectTree(element);\n }\n\n if (Utilities.isConnected(insertedElement)) {\n internals.connectTree(element);\n }\n return insertedElement;\n });\n }\n\n if (Native.HTMLElement_insertAdjacentElement) {\n patch_insertAdjacentElement(HTMLElement.prototype, Native.HTMLElement_insertAdjacentElement);\n } else if (Native.Element_insertAdjacentElement) {\n patch_insertAdjacentElement(Element.prototype, Native.Element_insertAdjacentElement);\n } else {\n console.warn('Custom Elements: `Element#insertAdjacentElement` was not patched.');\n }\n\n\n function patch_insertAdjacentHTML(destination, baseMethod) {\n /**\n * Patches and upgrades all nodes which are siblings between `start`\n * (inclusive) and `end` (exclusive). If `end` is `null`, then all siblings\n * following `start` will be patched and upgraded.\n * @param {!Node} start\n * @param {?Node} end\n */\n function upgradeNodesInRange(start, end) {\n const nodes = [];\n for (let node = start; node !== end; node = node.nextSibling) {\n nodes.push(node);\n }\n for (let i = 0; i < nodes.length; i++) {\n internals.patchAndUpgradeTree(nodes[i]);\n }\n }\n\n Utilities.setPropertyUnchecked(destination, 'insertAdjacentHTML',\n /**\n * @this {Element}\n * @param {string} position\n * @param {string} text\n */\n function(position, text) {\n position = position.toLowerCase();\n\n if (position === \"beforebegin\") {\n const marker = this.previousSibling;\n baseMethod.call(this, position, text);\n upgradeNodesInRange(\n /** @type {!Node} */ (marker || this.parentNode.firstChild), this);\n } else if (position === \"afterbegin\") {\n const marker = this.firstChild;\n baseMethod.call(this, position, text);\n upgradeNodesInRange(/** @type {!Node} */ (this.firstChild), marker);\n } else if (position === \"beforeend\") {\n const marker = this.lastChild;\n baseMethod.call(this, position, text);\n upgradeNodesInRange(marker || this.firstChild, null);\n } else if (position === \"afterend\") {\n const marker = this.nextSibling;\n baseMethod.call(this, position, text);\n upgradeNodesInRange(/** @type {!Node} */ (this.nextSibling), marker);\n } else {\n throw new SyntaxError(`The value provided (${String(position)}) is ` +\n \"not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'.\");\n }\n });\n }\n\n if (Native.HTMLElement_insertAdjacentHTML) {\n patch_insertAdjacentHTML(HTMLElement.prototype, Native.HTMLElement_insertAdjacentHTML);\n } else if (Native.Element_insertAdjacentHTML) {\n patch_insertAdjacentHTML(Element.prototype, Native.Element_insertAdjacentHTML);\n } else {\n console.warn('Custom Elements: `Element#insertAdjacentHTML` was not patched.');\n }\n\n\n PatchParentNode(internals, Element.prototype, {\n prepend: Native.Element_prepend,\n append: Native.Element_append,\n });\n\n PatchChildNode(internals, Element.prototype, {\n before: Native.Element_before,\n after: Native.Element_after,\n replaceWith: Native.Element_replaceWith,\n remove: Native.Element_remove,\n });\n};\n","import CustomElementInternals from '../CustomElementInternals.js';\nimport Native from './Native.js';\nimport PatchParentNode from './Interface/ParentNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n PatchParentNode(internals, DocumentFragment.prototype, {\n prepend: Native.DocumentFragment_prepend,\n append: Native.DocumentFragment_append,\n });\n};\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/*\nExtremely simple css parser. Intended to be not more than what we need\nand definitely not necessarily correct =).\n*/\n\n'use strict';\n\n/** @unrestricted */\nclass StyleNode {\n constructor() {\n /** @type {number} */\n this['start'] = 0;\n /** @type {number} */\n this['end'] = 0;\n /** @type {StyleNode} */\n this['previous'] = null;\n /** @type {StyleNode} */\n this['parent'] = null;\n /** @type {Array<StyleNode>} */\n this['rules'] = null;\n /** @type {string} */\n this['parsedCssText'] = '';\n /** @type {string} */\n this['cssText'] = '';\n /** @type {boolean} */\n this['atRule'] = false;\n /** @type {number} */\n this['type'] = 0;\n /** @type {string} */\n this['keyframesName'] = '';\n /** @type {string} */\n this['selector'] = '';\n /** @type {string} */\n this['parsedSelector'] = '';\n }\n}\n\nexport {StyleNode}\n\n// given a string of css, return a simple rule tree\n/**\n * @param {string} text\n * @return {StyleNode}\n */\nexport function parse(text) {\n text = clean(text);\n return parseCss(lex(text), text);\n}\n\n// remove stuff we don't care about that may hinder parsing\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction clean(cssText) {\n return cssText.replace(RX.comments, '').replace(RX.port, '');\n}\n\n// super simple {...} lexer that returns a node tree\n/**\n * @param {string} text\n * @return {StyleNode}\n */\nfunction lex(text) {\n let root = new StyleNode();\n root['start'] = 0;\n root['end'] = text.length\n let n = root;\n for (let i = 0, l = text.length; i < l; i++) {\n if (text[i] === OPEN_BRACE) {\n if (!n['rules']) {\n n['rules'] = [];\n }\n let p = n;\n let previous = p['rules'][p['rules'].length - 1] || null;\n n = new StyleNode();\n n['start'] = i + 1;\n n['parent'] = p;\n n['previous'] = previous;\n p['rules'].push(n);\n } else if (text[i] === CLOSE_BRACE) {\n n['end'] = i + 1;\n n = n['parent'] || root;\n }\n }\n return root;\n}\n\n// add selectors/cssText to node tree\n/**\n * @param {StyleNode} node\n * @param {string} text\n * @return {StyleNode}\n */\nfunction parseCss(node, text) {\n let t = text.substring(node['start'], node['end'] - 1);\n node['parsedCssText'] = node['cssText'] = t.trim();\n if (node['parent']) {\n let ss = node['previous'] ? node['previous']['end'] : node['parent']['start'];\n t = text.substring(ss, node['start'] - 1);\n t = _expandUnicodeEscapes(t);\n t = t.replace(RX.multipleSpaces, ' ');\n // TODO(sorvell): ad hoc; make selector include only after last ;\n // helps with mixin syntax\n t = t.substring(t.lastIndexOf(';') + 1);\n let s = node['parsedSelector'] = node['selector'] = t.trim();\n node['atRule'] = (s.indexOf(AT_START) === 0);\n // note, support a subset of rule types...\n if (node['atRule']) {\n if (s.indexOf(MEDIA_START) === 0) {\n node['type'] = types.MEDIA_RULE;\n } else if (s.match(RX.keyframesRule)) {\n node['type'] = types.KEYFRAMES_RULE;\n node['keyframesName'] =\n node['selector'].split(RX.multipleSpaces).pop();\n }\n } else {\n if (s.indexOf(VAR_START) === 0) {\n node['type'] = types.MIXIN_RULE;\n } else {\n node['type'] = types.STYLE_RULE;\n }\n }\n }\n let r$ = node['rules'];\n if (r$) {\n for (let i = 0, l = r$.length, r;\n (i < l) && (r = r$[i]); i++) {\n parseCss(r, text);\n }\n }\n return node;\n}\n\n/**\n * conversion of sort unicode escapes with spaces like `\\33 ` (and longer) into\n * expanded form that doesn't require trailing space `\\000033`\n * @param {string} s\n * @return {string}\n */\nfunction _expandUnicodeEscapes(s) {\n return s.replace(/\\\\([0-9a-f]{1,6})\\s/gi, function() {\n let code = arguments[1],\n repeat = 6 - code.length;\n while (repeat--) {\n code = '0' + code;\n }\n return '\\\\' + code;\n });\n}\n\n/**\n * stringify parsed css.\n * @param {StyleNode} node\n * @param {boolean=} preserveProperties\n * @param {string=} text\n * @return {string}\n */\nexport function stringify(node, preserveProperties, text = '') {\n // calc rule cssText\n let cssText = '';\n if (node['cssText'] || node['rules']) {\n let r$ = node['rules'];\n if (r$ && !_hasMixinRules(r$)) {\n for (let i = 0, l = r$.length, r;\n (i < l) && (r = r$[i]); i++) {\n cssText = stringify(r, preserveProperties, cssText);\n }\n } else {\n cssText = preserveProperties ? node['cssText'] :\n removeCustomProps(node['cssText']);\n cssText = cssText.trim();\n if (cssText) {\n cssText = ' ' + cssText + '\\n';\n }\n }\n }\n // emit rule if there is cssText\n if (cssText) {\n if (node['selector']) {\n text += node['selector'] + ' ' + OPEN_BRACE + '\\n';\n }\n text += cssText;\n if (node['selector']) {\n text += CLOSE_BRACE + '\\n\\n';\n }\n }\n return text;\n}\n\n/**\n * @param {Array<StyleNode>} rules\n * @return {boolean}\n */\nfunction _hasMixinRules(rules) {\n let r = rules[0];\n return Boolean(r) && Boolean(r['selector']) && r['selector'].indexOf(VAR_START) === 0;\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction removeCustomProps(cssText) {\n cssText = removeCustomPropAssignment(cssText);\n return removeCustomPropApply(cssText);\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nexport function removeCustomPropAssignment(cssText) {\n return cssText\n .replace(RX.customProp, '')\n .replace(RX.mixinProp, '');\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction removeCustomPropApply(cssText) {\n return cssText\n .replace(RX.mixinApply, '')\n .replace(RX.varApply, '');\n}\n\n/** @enum {number} */\nexport const types = {\n STYLE_RULE: 1,\n KEYFRAMES_RULE: 7,\n MEDIA_RULE: 4,\n MIXIN_RULE: 1000\n}\n\nconst OPEN_BRACE = '{';\nconst CLOSE_BRACE = '}';\n\n// helper regexp's\nconst RX = {\n comments: /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n port: /@import[^;]*;/gim,\n customProp: /(?:^[^;\\-\\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\\n]|$)/gim,\n mixinProp: /(?:^[^;\\-\\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\\n]|$)?/gim,\n mixinApply: /@apply\\s*\\(?[^);]*\\)?\\s*(?:[;\\n]|$)?/gim,\n varApply: /[^;:]*?:[^;]*?var\\([^;]*\\)(?:[;\\n]|$)?/gim,\n keyframesRule: /^@[^\\s]*keyframes/,\n multipleSpaces: /\\s+/g\n}\n\nconst VAR_START = '--';\nconst MEDIA_START = '@media';\nconst AT_START = '@';\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nexport const nativeShadow = !(window['ShadyDOM'] && window['ShadyDOM']['inUse']);\nlet nativeCssVariables_;\n\n/**\n * @param {(ShadyCSSOptions | ShadyCSSInterface)=} settings\n */\nfunction calcCssVariables(settings) {\n if (settings && settings['shimcssproperties']) {\n nativeCssVariables_ = false;\n } else {\n // chrome 49 has semi-working css vars, check if box-shadow works\n // safari 9.1 has a recalc bug: https://bugs.webkit.org/show_bug.cgi?id=155782\n // However, shim css custom properties are only supported with ShadyDOM enabled,\n // so fall back on native if we do not detect ShadyDOM\n // Edge 15: custom properties used in ::before and ::after will also be used in the parent element\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12414257/\n nativeCssVariables_ = nativeShadow || Boolean(!navigator.userAgent.match(/AppleWebKit\\/601|Edge\\/15/) &&\n window.CSS && CSS.supports && CSS.supports('box-shadow', '0 0 0 var(--foo)'));\n }\n}\n\nif (window.ShadyCSS && window.ShadyCSS.nativeCss !== undefined) {\n nativeCssVariables_ = window.ShadyCSS.nativeCss;\n} else if (window.ShadyCSS) {\n calcCssVariables(window.ShadyCSS);\n // reset window variable to let ShadyCSS API take its place\n window.ShadyCSS = undefined;\n} else {\n calcCssVariables(window['WebComponents'] && window['WebComponents']['flags']);\n}\n\n// Hack for type error under new type inference which doesn't like that\n// nativeCssVariables is updated in a function and assigns the type\n// `function(): ?` instead of `boolean`.\nexport const nativeCssVariables = /** @type {boolean} */(nativeCssVariables_);\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nexport const VAR_ASSIGN = /(?:^|[;\\s{]\\s*)(--[\\w-]*?)\\s*:\\s*(?:((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^)]*?\\)|[^};{])+)|\\{([^}]*)\\}(?:(?=[;\\s}])|$))/gi;\nexport const MIXIN_MATCH = /(?:^|\\W+)@apply\\s*\\(?([^);\\n]*)\\)?/gi;\nexport const VAR_CONSUMED = /(--[\\w-]+)\\s*([:,;)]|$)/gi;\nexport const ANIMATION_MATCH = /(animation\\s*:)|(animation-name\\s*:)/;\nexport const MEDIA_MATCH = /@media\\s(.*)/;\nexport const IS_VAR = /^--/;\nexport const BRACKETED = /\\{[^}]*\\}/g;\nexport const HOST_PREFIX = '(?:^|[^.#[:])';\nexport const HOST_SUFFIX = '($|[.:[\\\\s>+~])';\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/** @type {!Set<string>} */\nconst styleTextSet = new Set();\n\nexport const scopingAttribute = 'shady-unscoped';\n\n/**\n * Add a specifically-marked style to the document directly, and only one copy of that style.\n *\n * @param {!HTMLStyleElement} style\n * @return {undefined}\n */\nexport function processUnscopedStyle(style) {\n const text = style.textContent;\n if (!styleTextSet.has(text)) {\n styleTextSet.add(text);\n const newStyle = style.cloneNode(true);\n document.head.appendChild(newStyle);\n }\n}\n\n/**\n * Check if a style is supposed to be unscoped\n * @param {!HTMLStyleElement} style\n * @return {boolean} true if the style has the unscoping attribute\n */\nexport function isUnscopedStyle(style) {\n return style.hasAttribute(scopingAttribute);\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {nativeShadow, nativeCssVariables} from './style-settings.js';\nimport {parse, stringify, types, StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\nimport {MEDIA_MATCH} from './common-regex.js';\nimport {processUnscopedStyle, isUnscopedStyle} from './unscoped-style-handler.js';\n\n/**\n * @param {string|StyleNode} rules\n * @param {function(StyleNode)=} callback\n * @return {string}\n */\nexport function toCssText (rules, callback) {\n if (!rules) {\n return '';\n }\n if (typeof rules === 'string') {\n rules = parse(rules);\n }\n if (callback) {\n forEachRule(rules, callback);\n }\n return stringify(rules, nativeCssVariables);\n}\n\n/**\n * @param {HTMLStyleElement} style\n * @return {StyleNode}\n */\nexport function rulesForStyle(style) {\n if (!style['__cssRules'] && style.textContent) {\n style['__cssRules'] = parse(style.textContent);\n }\n return style['__cssRules'] || null;\n}\n\n// Tests if a rule is a keyframes selector, which looks almost exactly\n// like a normal selector but is not (it has nothing to do with scoping\n// for example).\n/**\n * @param {StyleNode} rule\n * @return {boolean}\n */\nexport function isKeyframesSelector(rule) {\n return Boolean(rule['parent']) &&\n rule['parent']['type'] === types.KEYFRAMES_RULE;\n}\n\n/**\n * @param {StyleNode} node\n * @param {Function=} styleRuleCallback\n * @param {Function=} keyframesRuleCallback\n * @param {boolean=} onlyActiveRules\n */\nexport function forEachRule(node, styleRuleCallback, keyframesRuleCallback, onlyActiveRules) {\n if (!node) {\n return;\n }\n let skipRules = false;\n let type = node['type'];\n if (onlyActiveRules) {\n if (type === types.MEDIA_RULE) {\n let matchMedia = node['selector'].match(MEDIA_MATCH);\n if (matchMedia) {\n // if rule is a non matching @media rule, skip subrules\n if (!window.matchMedia(matchMedia[1]).matches) {\n skipRules = true;\n }\n }\n }\n }\n if (type === types.STYLE_RULE) {\n styleRuleCallback(node);\n } else if (keyframesRuleCallback &&\n type === types.KEYFRAMES_RULE) {\n keyframesRuleCallback(node);\n } else if (type === types.MIXIN_RULE) {\n skipRules = true;\n }\n let r$ = node['rules'];\n if (r$ && !skipRules) {\n for (let i=0, l=r$.length, r; (i<l) && (r=r$[i]); i++) {\n forEachRule(r, styleRuleCallback, keyframesRuleCallback, onlyActiveRules);\n }\n }\n}\n\n// add a string of cssText to the document.\n/**\n * @param {string} cssText\n * @param {string} moniker\n * @param {Node} target\n * @param {Node} contextNode\n * @return {HTMLStyleElement}\n */\nexport function applyCss(cssText, moniker, target, contextNode) {\n let style = createScopeStyle(cssText, moniker);\n applyStyle(style, target, contextNode);\n return style;\n}\n\n/**\n * @param {string} cssText\n * @param {string} moniker\n * @return {HTMLStyleElement}\n */\nexport function createScopeStyle(cssText, moniker) {\n let style = /** @type {HTMLStyleElement} */(document.createElement('style'));\n if (moniker) {\n style.setAttribute('scope', moniker);\n }\n style.textContent = cssText;\n return style;\n}\n\n/**\n * Track the position of the last added style for placing placeholders\n * @type {Node}\n */\nlet lastHeadApplyNode = null;\n\n// insert a comment node as a styling position placeholder.\n/**\n * @param {string} moniker\n * @return {!Comment}\n */\nexport function applyStylePlaceHolder(moniker) {\n let placeHolder = document.createComment(' Shady DOM styles for ' +\n moniker + ' ');\n let after = lastHeadApplyNode ?\n lastHeadApplyNode['nextSibling'] : null;\n let scope = document.head;\n scope.insertBefore(placeHolder, after || scope.firstChild);\n lastHeadApplyNode = placeHolder;\n return placeHolder;\n}\n\n/**\n * @param {HTMLStyleElement} style\n * @param {?Node} target\n * @param {?Node} contextNode\n */\nexport function applyStyle(style, target, contextNode) {\n target = target || document.head;\n let after = (contextNode && contextNode.nextSibling) ||\n target.firstChild;\n target.insertBefore(style, after);\n if (!lastHeadApplyNode) {\n lastHeadApplyNode = style;\n } else {\n // only update lastHeadApplyNode if the new style is inserted after the old lastHeadApplyNode\n let position = style.compareDocumentPosition(lastHeadApplyNode);\n if (position === Node.DOCUMENT_POSITION_PRECEDING) {\n lastHeadApplyNode = style;\n }\n }\n}\n\n/**\n * @param {string} buildType\n * @return {boolean}\n */\nexport function isTargetedBuild(buildType) {\n return nativeShadow ? buildType === 'shadow' : buildType === 'shady';\n}\n\n/**\n * @param {Element} element\n * @return {?string}\n */\nexport function getCssBuildType(element) {\n return element.getAttribute('css-build');\n}\n\n/**\n * Walk from text[start] matching parens and\n * returns position of the outer end paren\n * @param {string} text\n * @param {number} start\n * @return {number}\n */\nfunction findMatchingParen(text, start) {\n let level = 0;\n for (let i=start, l=text.length; i < l; i++) {\n if (text[i] === '(') {\n level++;\n } else if (text[i] === ')') {\n if (--level === 0) {\n return i;\n }\n }\n }\n return -1;\n}\n\n/**\n * @param {string} str\n * @param {function(string, string, string, string)} callback\n */\nexport function processVariableAndFallback(str, callback) {\n // find 'var('\n let start = str.indexOf('var(');\n if (start === -1) {\n // no var?, everything is prefix\n return callback(str, '', '', '');\n }\n //${prefix}var(${inner})${suffix}\n let end = findMatchingParen(str, start + 3);\n let inner = str.substring(start + 4, end);\n let prefix = str.substring(0, start);\n // suffix may have other variables\n let suffix = processVariableAndFallback(str.substring(end + 1), callback);\n let comma = inner.indexOf(',');\n // value and fallback args should be trimmed to match in property lookup\n if (comma === -1) {\n // variable, no fallback\n return callback(prefix, inner.trim(), '', suffix);\n }\n // var(${value},${fallback})\n let value = inner.substring(0, comma).trim();\n let fallback = inner.substring(comma + 1).trim();\n return callback(prefix, value, fallback, suffix);\n}\n\n/**\n * @param {Element} element\n * @param {string} value\n */\nexport function setElementClassRaw(element, value) {\n // use native setAttribute provided by ShadyDOM when setAttribute is patched\n if (nativeShadow) {\n element.setAttribute('class', value);\n } else {\n window['ShadyDOM']['nativeMethods']['setAttribute'].call(element, 'class', value);\n }\n}\n\n/**\n * @param {Element | {is: string, extends: string}} element\n * @return {{is: string, typeExtension: string}}\n */\nexport function getIsExtends(element) {\n let localName = element['localName'];\n let is = '', typeExtension = '';\n /*\n NOTE: technically, this can be wrong for certain svg elements\n with `-` in the name like `<font-face>`\n */\n if (localName) {\n if (localName.indexOf('-') > -1) {\n is = localName;\n } else {\n typeExtension = localName;\n is = (element.getAttribute && element.getAttribute('is')) || '';\n }\n } else {\n is = /** @type {?} */(element).is;\n typeExtension = /** @type {?} */(element).extends;\n }\n return {is, typeExtension};\n}\n\n/**\n * @param {Element|DocumentFragment} element\n * @return {string}\n */\nexport function gatherStyleText(element) {\n /** @type {!Array<string>} */\n const styleTextParts = [];\n const styles = /** @type {!NodeList<!HTMLStyleElement>} */(element.querySelectorAll('style'));\n for (let i = 0; i < styles.length; i++) {\n const style = styles[i];\n if (isUnscopedStyle(style)) {\n if (!nativeShadow) {\n processUnscopedStyle(style);\n style.parentNode.removeChild(style);\n }\n } else {\n styleTextParts.push(style.textContent);\n style.parentNode.removeChild(style);\n }\n }\n return styleTextParts.join('').trim();\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\nimport * as StyleUtil from './style-util.js';\nimport {nativeShadow} from './style-settings.js';\n\n/* Transforms ShadowDOM styling into ShadyDOM styling\n\n* scoping:\n\n * elements in scope get scoping selector class=\"x-foo-scope\"\n * selectors re-written as follows:\n\n div button -> div.x-foo-scope button.x-foo-scope\n\n* :host -> scopeName\n\n* :host(...) -> scopeName...\n\n* ::slotted(...) -> scopeName > ...\n\n* ...:dir(ltr|rtl) -> [dir=\"ltr|rtl\"] ..., ...[dir=\"ltr|rtl\"]\n\n* :host(:dir[rtl]) -> scopeName:dir(rtl) -> [dir=\"rtl\"] scopeName, scopeName[dir=\"rtl\"]\n\n*/\nconst SCOPE_NAME = 'style-scope';\n\nclass StyleTransformer {\n get SCOPE_NAME() {\n return SCOPE_NAME;\n }\n /**\n * Given a node and scope name, add a scoping class to each node\n * in the tree. This facilitates transforming css into scoped rules.\n * @param {?} node\n * @param {?} scope\n * @param {?=} shouldRemoveScope\n */\n dom(node, scope, shouldRemoveScope) {\n // one time optimization to skip scoping...\n if (node['__styleScoped']) {\n node['__styleScoped'] = null;\n } else {\n this._transformDom(node, scope || '', shouldRemoveScope);\n }\n }\n\n _transformDom(node, selector, shouldRemoveScope) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n this.element(node, selector, shouldRemoveScope);\n }\n let c$ = (node.localName === 'template') ?\n (node.content || node._content).childNodes :\n node.children || node.childNodes;\n if (c$) {\n for (let i=0; i<c$.length; i++) {\n this._transformDom(c$[i], selector, shouldRemoveScope);\n }\n }\n }\n /**\n * @param {?} element\n * @param {?} scope\n * @param {?=} shouldRemoveScope\n */\n element(element, scope, shouldRemoveScope) {\n // note: if using classes, we add both the general 'style-scope' class\n // as well as the specific scope. This enables easy filtering of all\n // `style-scope` elements\n if (scope) {\n // note: svg on IE does not have classList so fallback to class\n if (element.classList) {\n if (shouldRemoveScope) {\n element.classList.remove(SCOPE_NAME);\n element.classList.remove(scope);\n } else {\n element.classList.add(SCOPE_NAME);\n element.classList.add(scope);\n }\n } else if (element.getAttribute) {\n let c = element.getAttribute(CLASS);\n if (shouldRemoveScope) {\n if (c) {\n let newValue = c.replace(SCOPE_NAME, '').replace(scope, '');\n StyleUtil.setElementClassRaw(element, newValue);\n }\n } else {\n let newValue = (c ? c + ' ' : '') + SCOPE_NAME + ' ' + scope;\n StyleUtil.setElementClassRaw(element, newValue);\n }\n }\n }\n }\n\n /**\n * @param {?} element\n * @param {?} styleRules\n * @param {?=} callback\n */\n elementStyles(element, styleRules, callback) {\n let cssBuildType = element['__cssBuild'];\n // no need to shim selectors if settings.useNativeShadow, also\n // a shady css build will already have transformed selectors\n // NOTE: This method may be called as part of static or property shimming.\n // When there is a targeted build it will not be called for static shimming,\n // but when the property shim is used it is called and should opt out of\n // static shimming work when a proper build exists.\n let cssText = '';\n if (nativeShadow || cssBuildType === 'shady') {\n cssText = StyleUtil.toCssText(styleRules, callback);\n } else {\n let {is, typeExtension} = StyleUtil.getIsExtends(element);\n cssText = this.css(styleRules, is, typeExtension, callback) + '\\n\\n';\n }\n return cssText.trim();\n }\n\n // Given a string of cssText and a scoping string (scope), returns\n // a string of scoped css where each selector is transformed to include\n // a class created from the scope. ShadowDOM selectors are also transformed\n // (e.g. :host) to use the scoping selector.\n css(rules, scope, ext, callback) {\n let hostScope = this._calcHostScope(scope, ext);\n scope = this._calcElementScope(scope);\n let self = this;\n return StyleUtil.toCssText(rules, function(/** StyleNode */rule) {\n if (!rule.isScoped) {\n self.rule(rule, scope, hostScope);\n rule.isScoped = true;\n }\n if (callback) {\n callback(rule, scope, hostScope);\n }\n });\n }\n\n _calcElementScope(scope) {\n if (scope) {\n return CSS_CLASS_PREFIX + scope;\n } else {\n return '';\n }\n }\n\n _calcHostScope(scope, ext) {\n return ext ? `[is=${scope}]` : scope;\n }\n\n rule(rule, scope, hostScope) {\n this._transformRule(rule, this._transformComplexSelector,\n scope, hostScope);\n }\n\n /**\n * transforms a css rule to a scoped rule.\n *\n * @param {StyleNode} rule\n * @param {Function} transformer\n * @param {string=} scope\n * @param {string=} hostScope\n */\n _transformRule(rule, transformer, scope, hostScope) {\n // NOTE: save transformedSelector for subsequent matching of elements\n // against selectors (e.g. when calculating style properties)\n rule['selector'] = rule.transformedSelector =\n this._transformRuleCss(rule, transformer, scope, hostScope);\n }\n\n /**\n * @param {StyleNode} rule\n * @param {Function} transformer\n * @param {string=} scope\n * @param {string=} hostScope\n */\n _transformRuleCss(rule, transformer, scope, hostScope) {\n let p$ = rule['selector'].split(COMPLEX_SELECTOR_SEP);\n // we want to skip transformation of rules that appear in keyframes,\n // because they are keyframe selectors, not element selectors.\n if (!StyleUtil.isKeyframesSelector(rule)) {\n for (let i=0, l=p$.length, p; (i<l) && (p=p$[i]); i++) {\n p$[i] = transformer.call(this, p, scope, hostScope);\n }\n }\n return p$.join(COMPLEX_SELECTOR_SEP);\n }\n\n /**\n * @param {string} selector\n * @return {string}\n */\n _twiddleNthPlus(selector) {\n return selector.replace(NTH, (m, type, inside) => {\n if (inside.indexOf('+') > -1) {\n inside = inside.replace(/\\+/g, '___');\n } else if (inside.indexOf('___') > -1) {\n inside = inside.replace(/___/g, '+');\n }\n return `:${type}(${inside})`;\n });\n }\n\n/**\n * @param {string} selector\n * @param {string} scope\n * @param {string=} hostScope\n */\n _transformComplexSelector(selector, scope, hostScope) {\n let stop = false;\n selector = selector.trim();\n // Remove spaces inside of selectors like `:nth-of-type` because it confuses SIMPLE_SELECTOR_SEP\n let isNth = NTH.test(selector);\n if (isNth) {\n selector = selector.replace(NTH, (m, type, inner) => `:${type}(${inner.replace(/\\s/g, '')})`)\n selector = this._twiddleNthPlus(selector);\n }\n selector = selector.replace(SLOTTED_START, `${HOST} $1`);\n selector = selector.replace(SIMPLE_SELECTOR_SEP, (m, c, s) => {\n if (!stop) {\n let info = this._transformCompoundSelector(s, c, scope, hostScope);\n stop = stop || info.stop;\n c = info.combinator;\n s = info.value;\n }\n return c + s;\n });\n if (isNth) {\n selector = this._twiddleNthPlus(selector);\n }\n return selector;\n }\n\n _transformCompoundSelector(selector, combinator, scope, hostScope) {\n // replace :host with host scoping class\n let slottedIndex = selector.indexOf(SLOTTED);\n if (selector.indexOf(HOST) >= 0) {\n selector = this._transformHostSelector(selector, hostScope);\n // replace other selectors with scoping class\n } else if (slottedIndex !== 0) {\n selector = scope ? this._transformSimpleSelector(selector, scope) :\n selector;\n }\n // mark ::slotted() scope jump to replace with descendant selector + arg\n // also ignore left-side combinator\n let slotted = false;\n if (slottedIndex >= 0) {\n combinator = '';\n slotted = true;\n }\n // process scope jumping selectors up to the scope jump and then stop\n let stop;\n if (slotted) {\n stop = true;\n if (slotted) {\n // .zonk ::slotted(.foo) -> .zonk.scope > .foo\n selector = selector.replace(SLOTTED_PAREN, (m, paren) => ` > ${paren}`);\n }\n }\n selector = selector.replace(DIR_PAREN, (m, before, dir) =>\n `[dir=\"${dir}\"] ${before}, ${before}[dir=\"${dir}\"]`);\n return {value: selector, combinator, stop};\n }\n\n _transformSimpleSelector(selector, scope) {\n let p$ = selector.split(PSEUDO_PREFIX);\n p$[0] += scope;\n return p$.join(PSEUDO_PREFIX);\n }\n\n // :host(...) -> scopeName...\n _transformHostSelector(selector, hostScope) {\n let m = selector.match(HOST_PAREN);\n let paren = m && m[2].trim() || '';\n if (paren) {\n if (!paren[0].match(SIMPLE_SELECTOR_PREFIX)) {\n // paren starts with a type selector\n let typeSelector = paren.split(SIMPLE_SELECTOR_PREFIX)[0];\n // if the type selector is our hostScope then avoid pre-pending it\n if (typeSelector === hostScope) {\n return paren;\n // otherwise, this selector should not match in this scope so\n // output a bogus selector.\n } else {\n return SELECTOR_NO_MATCH;\n }\n } else {\n // make sure to do a replace here to catch selectors like:\n // `:host(.foo)::before`\n return selector.replace(HOST_PAREN, function(m, host, paren) {\n return hostScope + paren;\n });\n }\n // if no paren, do a straight :host replacement.\n // TODO(sorvell): this should not strictly be necessary but\n // it's needed to maintain support for `:host[foo]` type selectors\n // which have been improperly used under Shady DOM. This should be\n // deprecated.\n } else {\n return selector.replace(HOST, hostScope);\n }\n }\n\n /**\n * @param {StyleNode} rule\n */\n documentRule(rule) {\n // reset selector in case this is redone.\n rule['selector'] = rule['parsedSelector'];\n this.normalizeRootSelector(rule);\n this._transformRule(rule, this._transformDocumentSelector);\n }\n\n /**\n * @param {StyleNode} rule\n */\n normalizeRootSelector(rule) {\n if (rule['selector'] === ROOT) {\n rule['selector'] = 'html';\n }\n }\n\n/**\n * @param {string} selector\n */\n _transformDocumentSelector(selector) {\n return selector.match(SLOTTED) ?\n this._transformComplexSelector(selector, SCOPE_DOC_SELECTOR) :\n this._transformSimpleSelector(selector.trim(), SCOPE_DOC_SELECTOR);\n }\n}\n\nlet NTH = /:(nth[-\\w]+)\\(([^)]+)\\)/;\nlet SCOPE_DOC_SELECTOR = `:not(.${SCOPE_NAME})`;\nlet COMPLEX_SELECTOR_SEP = ',';\nlet SIMPLE_SELECTOR_SEP = /(^|[\\s>+~]+)((?:\\[.+?\\]|[^\\s>+~=[])+)/g;\nlet SIMPLE_SELECTOR_PREFIX = /[[.:#*]/;\nlet HOST = ':host';\nlet ROOT = ':root';\nlet SLOTTED = '::slotted';\nlet SLOTTED_START = new RegExp(`^(${SLOTTED})`);\n// NOTE: this supports 1 nested () pair for things like\n// :host(:not([selected]), more general support requires\n// parsing which seems like overkill\nlet HOST_PAREN = /(:host)(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))/;\n// similar to HOST_PAREN\nlet SLOTTED_PAREN = /(?:::slotted)(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))/;\nlet DIR_PAREN = /(.*):dir\\((?:(ltr|rtl))\\)/;\nlet CSS_CLASS_PREFIX = '.';\nlet PSEUDO_PREFIX = ':';\nlet CLASS = 'class';\nlet SELECTOR_NO_MATCH = 'should_not_match';\n\nexport default new StyleTransformer()\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\n\n/** @const {string} */\nconst infoKey = '__styleInfo';\n\nexport default class StyleInfo {\n /**\n * @param {Element} node\n * @return {StyleInfo}\n */\n static get(node) {\n if (node) {\n return node[infoKey];\n } else {\n return null;\n }\n }\n /**\n * @param {!Element} node\n * @param {StyleInfo} styleInfo\n * @return {StyleInfo}\n */\n static set(node, styleInfo) {\n node[infoKey] = styleInfo;\n return styleInfo;\n }\n /**\n * @param {StyleNode} ast\n * @param {Node=} placeholder\n * @param {Array<string>=} ownStylePropertyNames\n * @param {string=} elementName\n * @param {string=} typeExtension\n * @param {string=} cssBuild\n */\n constructor(ast, placeholder, ownStylePropertyNames, elementName, typeExtension, cssBuild) {\n /** @type {StyleNode} */\n this.styleRules = ast || null;\n /** @type {Node} */\n this.placeholder = placeholder || null;\n /** @type {!Array<string>} */\n this.ownStylePropertyNames = ownStylePropertyNames || [];\n /** @type {Array<Object>} */\n this.overrideStyleProperties = null;\n /** @type {string} */\n this.elementName = elementName || '';\n /** @type {string} */\n this.cssBuild = cssBuild || '';\n /** @type {string} */\n this.typeExtension = typeExtension || '';\n /** @type {Object<string, string>} */\n this.styleProperties = null;\n /** @type {?string} */\n this.scopeSelector = null;\n /** @type {HTMLStyleElement} */\n this.customStyle = null;\n }\n _getStyleRules() {\n return this.styleRules;\n }\n}\n\nStyleInfo.prototype['_getStyleRules'] = StyleInfo.prototype._getStyleRules;","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {removeCustomPropAssignment, StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\nimport {nativeShadow} from './style-settings.js';\nimport StyleTransformer from './style-transformer.js';\nimport * as StyleUtil from './style-util.js';\nimport * as RX from './common-regex.js';\nimport StyleInfo from './style-info.js';\n\n// TODO: dedupe with shady\n/**\n * @param {string} selector\n * @return {boolean}\n * @this {Element}\n */\nconst matchesSelector = function(selector) {\n const method = this.matches || this.matchesSelector ||\n this.mozMatchesSelector || this.msMatchesSelector ||\n this.oMatchesSelector || this.webkitMatchesSelector;\n return method && method.call(this, selector);\n};\n\nconst IS_IE = navigator.userAgent.match('Trident');\n\nconst XSCOPE_NAME = 'x-scope';\n\nclass StyleProperties {\n get XSCOPE_NAME() {\n return XSCOPE_NAME;\n }\n/**\n * decorates styles with rule info and returns an array of used style property names\n *\n * @param {StyleNode} rules\n * @return {Array<string>}\n */\n decorateStyles(rules) {\n let self = this, props = {}, keyframes = [], ruleIndex = 0;\n StyleUtil.forEachRule(rules, function(rule) {\n self.decorateRule(rule);\n // mark in-order position of ast rule in styles block, used for cache key\n rule.index = ruleIndex++;\n self.collectPropertiesInCssText(rule.propertyInfo.cssText, props);\n }, function onKeyframesRule(rule) {\n keyframes.push(rule);\n });\n // Cache all found keyframes rules for later reference:\n rules._keyframes = keyframes;\n // return this list of property names *consumes* in these styles.\n let names = [];\n for (let i in props) {\n names.push(i);\n }\n return names;\n }\n\n // decorate a single rule with property info\n decorateRule(rule) {\n if (rule.propertyInfo) {\n return rule.propertyInfo;\n }\n let info = {}, properties = {};\n let hasProperties = this.collectProperties(rule, properties);\n if (hasProperties) {\n info.properties = properties;\n // TODO(sorvell): workaround parser seeing mixins as additional rules\n rule['rules'] = null;\n }\n info.cssText = this.collectCssText(rule);\n rule.propertyInfo = info;\n return info;\n }\n\n // collects the custom properties from a rule's cssText\n collectProperties(rule, properties) {\n let info = rule.propertyInfo;\n if (info) {\n if (info.properties) {\n Object.assign(properties, info.properties);\n return true;\n }\n } else {\n let m, rx = RX.VAR_ASSIGN;\n let cssText = rule['parsedCssText'];\n let value;\n let any;\n while ((m = rx.exec(cssText))) {\n // note: group 2 is var, 3 is mixin\n value = (m[2] || m[3]).trim();\n // value of 'inherit' or 'unset' is equivalent to not setting the property here\n if (value !== 'inherit' || value !== 'unset') {\n properties[m[1].trim()] = value;\n }\n any = true;\n }\n return any;\n }\n\n }\n\n // returns cssText of properties that consume variables/mixins\n collectCssText(rule) {\n return this.collectConsumingCssText(rule['parsedCssText']);\n }\n\n // NOTE: we support consumption inside mixin assignment\n // but not production, so strip out {...}\n collectConsumingCssText(cssText) {\n return cssText.replace(RX.BRACKETED, '')\n .replace(RX.VAR_ASSIGN, '');\n }\n\n collectPropertiesInCssText(cssText, props) {\n let m;\n while ((m = RX.VAR_CONSUMED.exec(cssText))) {\n let name = m[1];\n // This regex catches all variable names, and following non-whitespace char\n // If next char is not ':', then variable is a consumer\n if (m[2] !== ':') {\n props[name] = true;\n }\n }\n }\n\n // turns custom properties into realized values.\n reify(props) {\n // big perf optimization here: reify only *own* properties\n // since this object has __proto__ of the element's scope properties\n let names = Object.getOwnPropertyNames(props);\n for (let i=0, n; i < names.length; i++) {\n n = names[i];\n props[n] = this.valueForProperty(props[n], props);\n }\n }\n\n // given a property value, returns the reified value\n // a property value may be:\n // (1) a literal value like: red or 5px;\n // (2) a variable value like: var(--a), var(--a, red), or var(--a, --b) or\n // var(--a, var(--b));\n // (3) a literal mixin value like { properties }. Each of these properties\n // can have values that are: (a) literal, (b) variables, (c) @apply mixins.\n valueForProperty(property, props) {\n // case (1) default\n // case (3) defines a mixin and we have to reify the internals\n if (property) {\n if (property.indexOf(';') >=0) {\n property = this.valueForProperties(property, props);\n } else {\n // case (2) variable\n let self = this;\n let fn = function(prefix, value, fallback, suffix) {\n if (!value) {\n return prefix + suffix;\n }\n let propertyValue = self.valueForProperty(props[value], props);\n // if value is \"initial\", then the variable should be treated as unset\n if (!propertyValue || propertyValue === 'initial') {\n // fallback may be --a or var(--a) or literal\n propertyValue = self.valueForProperty(props[fallback] || fallback, props) ||\n fallback;\n } else if (propertyValue === 'apply-shim-inherit') {\n // CSS build will replace `inherit` with `apply-shim-inherit`\n // for use with native css variables.\n // Since we have full control, we can use `inherit` directly.\n propertyValue = 'inherit';\n }\n return prefix + (propertyValue || '') + suffix;\n };\n property = StyleUtil.processVariableAndFallback(property, fn);\n }\n }\n return property && property.trim() || '';\n }\n\n // note: we do not yet support mixin within mixin\n valueForProperties(property, props) {\n let parts = property.split(';');\n for (let i=0, p, m; i<parts.length; i++) {\n if ((p = parts[i])) {\n RX.MIXIN_MATCH.lastIndex = 0;\n m = RX.MIXIN_MATCH.exec(p);\n if (m) {\n p = this.valueForProperty(props[m[1]], props);\n } else {\n let colon = p.indexOf(':');\n if (colon !== -1) {\n let pp = p.substring(colon);\n pp = pp.trim();\n pp = this.valueForProperty(pp, props) || pp;\n p = p.substring(0, colon) + pp;\n }\n }\n parts[i] = (p && p.lastIndexOf(';') === p.length - 1) ?\n // strip trailing ;\n p.slice(0, -1) :\n p || '';\n }\n }\n return parts.join(';');\n }\n\n applyProperties(rule, props) {\n let output = '';\n // dynamically added sheets may not be decorated so ensure they are.\n if (!rule.propertyInfo) {\n this.decorateRule(rule);\n }\n if (rule.propertyInfo.cssText) {\n output = this.valueForProperties(rule.propertyInfo.cssText, props);\n }\n rule['cssText'] = output;\n }\n\n // Apply keyframe transformations to the cssText of a given rule. The\n // keyframeTransforms object is a map of keyframe names to transformer\n // functions which take in cssText and spit out transformed cssText.\n applyKeyframeTransforms(rule, keyframeTransforms) {\n let input = rule['cssText'];\n let output = rule['cssText'];\n if (rule.hasAnimations == null) {\n // Cache whether or not the rule has any animations to begin with:\n rule.hasAnimations = RX.ANIMATION_MATCH.test(input);\n }\n // If there are no animations referenced, we can skip transforms:\n if (rule.hasAnimations) {\n let transform;\n // If we haven't transformed this rule before, we iterate over all\n // transforms:\n if (rule.keyframeNamesToTransform == null) {\n rule.keyframeNamesToTransform = [];\n for (let keyframe in keyframeTransforms) {\n transform = keyframeTransforms[keyframe];\n output = transform(input);\n // If the transform actually changed the CSS text, we cache the\n // transform name for future use:\n if (input !== output) {\n input = output;\n rule.keyframeNamesToTransform.push(keyframe);\n }\n }\n } else {\n // If we already have a list of keyframe names that apply to this\n // rule, we apply only those keyframe name transforms:\n for (let i = 0; i < rule.keyframeNamesToTransform.length; ++i) {\n transform = keyframeTransforms[rule.keyframeNamesToTransform[i]];\n input = transform(input);\n }\n output = input;\n }\n }\n rule['cssText'] = output;\n }\n\n // Test if the rules in these styles matches the given `element` and if so,\n // collect any custom properties into `props`.\n /**\n * @param {StyleNode} rules\n * @param {Element} element\n */\n propertyDataFromStyles(rules, element) {\n let props = {}, self = this;\n // generates a unique key for these matches\n let o = [];\n // note: active rules excludes non-matching @media rules\n StyleUtil.forEachRule(rules, function(rule) {\n // TODO(sorvell): we could trim the set of rules at declaration\n // time to only include ones that have properties\n if (!rule.propertyInfo) {\n self.decorateRule(rule);\n }\n // match element against transformedSelector: selector may contain\n // unwanted uniquification and parsedSelector does not directly match\n // for :host selectors.\n let selectorToMatch = rule.transformedSelector || rule['parsedSelector'];\n if (element && rule.propertyInfo.properties && selectorToMatch) {\n if (matchesSelector.call(element, selectorToMatch)) {\n self.collectProperties(rule, props);\n // produce numeric key for these matches for lookup\n addToBitMask(rule.index, o);\n }\n }\n }, null, true);\n return {properties: props, key: o};\n }\n\n /**\n * @param {Element} scope\n * @param {StyleNode} rule\n * @param {string|undefined} cssBuild\n * @param {function(Object)} callback\n */\n whenHostOrRootRule(scope, rule, cssBuild, callback) {\n if (!rule.propertyInfo) {\n this.decorateRule(rule);\n }\n if (!rule.propertyInfo.properties) {\n return;\n }\n let {is, typeExtension} = StyleUtil.getIsExtends(scope);\n let hostScope = is ?\n StyleTransformer._calcHostScope(is, typeExtension) :\n 'html';\n let parsedSelector = rule['parsedSelector'];\n let isRoot = (parsedSelector === ':host > *' || parsedSelector === 'html');\n let isHost = parsedSelector.indexOf(':host') === 0 && !isRoot;\n // build info is either in scope (when scope is an element) or in the style\n // when scope is the default scope; note: this allows default scope to have\n // mixed mode built and unbuilt styles.\n if (cssBuild === 'shady') {\n // :root -> x-foo > *.x-foo for elements and html for custom-style\n isRoot = parsedSelector === (hostScope + ' > *.' + hostScope) || parsedSelector.indexOf('html') !== -1;\n // :host -> x-foo for elements, but sub-rules have .x-foo in them\n isHost = !isRoot && parsedSelector.indexOf(hostScope) === 0;\n }\n if (cssBuild === 'shadow') {\n isRoot = parsedSelector === ':host > *' || parsedSelector === 'html';\n isHost = isHost && !isRoot;\n }\n if (!isRoot && !isHost) {\n return;\n }\n let selectorToMatch = hostScope;\n if (isHost) {\n // need to transform :host because `:host` does not work with `matches`\n if (!rule.transformedSelector) {\n // transform :host into a matchable selector\n rule.transformedSelector =\n StyleTransformer._transformRuleCss(\n rule,\n StyleTransformer._transformComplexSelector,\n StyleTransformer._calcElementScope(is),\n hostScope\n );\n }\n selectorToMatch = rule.transformedSelector || hostScope;\n }\n callback({\n selector: selectorToMatch,\n isHost: isHost,\n isRoot: isRoot\n });\n }\n/**\n * @param {Element} scope\n * @param {StyleNode} rules\n * @return {Object}\n */\n hostAndRootPropertiesForScope(scope, rules) {\n let hostProps = {}, rootProps = {}, self = this;\n // note: active rules excludes non-matching @media rules\n let cssBuild = rules && rules['__cssBuild'];\n StyleUtil.forEachRule(rules, function(rule) {\n // if scope is StyleDefaults, use _element for matchesSelector\n self.whenHostOrRootRule(scope, rule, cssBuild, function(info) {\n let element = scope._element || scope;\n if (matchesSelector.call(element, info.selector)) {\n if (info.isHost) {\n self.collectProperties(rule, hostProps);\n } else {\n self.collectProperties(rule, rootProps);\n }\n }\n });\n }, null, true);\n return {rootProps: rootProps, hostProps: hostProps};\n }\n\n /**\n * @param {Element} element\n * @param {Object} properties\n * @param {string} scopeSelector\n */\n transformStyles(element, properties, scopeSelector) {\n let self = this;\n let {is, typeExtension} = StyleUtil.getIsExtends(element);\n let hostSelector = StyleTransformer\n ._calcHostScope(is, typeExtension);\n let rxHostSelector = element.extends ?\n '\\\\' + hostSelector.slice(0, -1) + '\\\\]' :\n hostSelector;\n let hostRx = new RegExp(RX.HOST_PREFIX + rxHostSelector +\n RX.HOST_SUFFIX);\n let rules = StyleInfo.get(element).styleRules;\n let keyframeTransforms =\n this._elementKeyframeTransforms(element, rules, scopeSelector);\n return StyleTransformer.elementStyles(element, rules, function(rule) {\n self.applyProperties(rule, properties);\n if (!nativeShadow &&\n !StyleUtil.isKeyframesSelector(rule) &&\n rule['cssText']) {\n // NOTE: keyframe transforms only scope munge animation names, so it\n // is not necessary to apply them in ShadowDOM.\n self.applyKeyframeTransforms(rule, keyframeTransforms);\n self._scopeSelector(rule, hostRx, hostSelector, scopeSelector);\n }\n });\n }\n\n /**\n * @param {Element} element\n * @param {StyleNode} rules\n * @param {string} scopeSelector\n * @return {Object}\n */\n _elementKeyframeTransforms(element, rules, scopeSelector) {\n let keyframesRules = rules._keyframes;\n let keyframeTransforms = {};\n if (!nativeShadow && keyframesRules) {\n // For non-ShadowDOM, we transform all known keyframes rules in\n // advance for the current scope. This allows us to catch keyframes\n // rules that appear anywhere in the stylesheet:\n for (let i = 0, keyframesRule = keyframesRules[i];\n i < keyframesRules.length;\n keyframesRule = keyframesRules[++i]) {\n this._scopeKeyframes(keyframesRule, scopeSelector);\n keyframeTransforms[keyframesRule['keyframesName']] =\n this._keyframesRuleTransformer(keyframesRule);\n }\n }\n return keyframeTransforms;\n }\n\n // Generate a factory for transforming a chunk of CSS text to handle a\n // particular scoped keyframes rule.\n /**\n * @param {StyleNode} keyframesRule\n * @return {function(string):string}\n */\n _keyframesRuleTransformer(keyframesRule) {\n return function(cssText) {\n return cssText.replace(\n keyframesRule.keyframesNameRx,\n keyframesRule.transformedKeyframesName);\n };\n }\n\n/**\n * Transforms `@keyframes` names to be unique for the current host.\n * Example: @keyframes foo-anim -> @keyframes foo-anim-x-foo-0\n *\n * @param {StyleNode} rule\n * @param {string} scopeId\n */\n _scopeKeyframes(rule, scopeId) {\n // Animation names are of the form [\\w-], so ensure that the name regex does not partially apply\n // to similarly named keyframe names by checking for a word boundary at the beginning and\n // a non-word boundary or `-` at the end.\n rule.keyframesNameRx = new RegExp(`\\\\b${rule['keyframesName']}(?!\\\\B|-)`, 'g');\n rule.transformedKeyframesName = rule['keyframesName'] + '-' + scopeId;\n rule.transformedSelector = rule.transformedSelector || rule['selector'];\n rule['selector'] = rule.transformedSelector.replace(\n rule['keyframesName'], rule.transformedKeyframesName);\n }\n\n // Strategy: x scope shim a selector e.g. to scope `.x-foo-42` (via classes):\n // non-host selector: .a.x-foo -> .x-foo-42 .a.x-foo\n // host selector: x-foo.wide -> .x-foo-42.wide\n // note: we use only the scope class (.x-foo-42) and not the hostSelector\n // (x-foo) to scope :host rules; this helps make property host rules\n // have low specificity. They are overrideable by class selectors but,\n // unfortunately, not by type selectors (e.g. overriding via\n // `.special` is ok, but not by `x-foo`).\n /**\n * @param {StyleNode} rule\n * @param {RegExp} hostRx\n * @param {string} hostSelector\n * @param {string} scopeId\n */\n _scopeSelector(rule, hostRx, hostSelector, scopeId) {\n rule.transformedSelector = rule.transformedSelector || rule['selector'];\n let selector = rule.transformedSelector;\n let scope = '.' + scopeId;\n let parts = selector.split(',');\n for (let i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n parts[i] = p.match(hostRx) ?\n p.replace(hostSelector, scope) :\n scope + ' ' + p;\n }\n rule['selector'] = parts.join(',');\n }\n\n /**\n * @param {Element} element\n * @param {string} selector\n * @param {string} old\n */\n applyElementScopeSelector(element, selector, old) {\n let c = element.getAttribute('class') || '';\n let v = c;\n if (old) {\n v = c.replace(\n new RegExp('\\\\s*' + XSCOPE_NAME + '\\\\s*' + old + '\\\\s*', 'g'), ' ');\n }\n v += (v ? ' ' : '') + XSCOPE_NAME + ' ' + selector;\n if (c !== v) {\n StyleUtil.setElementClassRaw(element, v);\n }\n }\n\n /**\n * @param {HTMLElement} element\n * @param {Object} properties\n * @param {string} selector\n * @param {HTMLStyleElement} style\n * @return {HTMLStyleElement}\n */\n applyElementStyle(element, properties, selector, style) {\n // calculate cssText to apply\n let cssText = style ? style.textContent || '' :\n this.transformStyles(element, properties, selector);\n // if shady and we have a cached style that is not style, decrement\n let styleInfo = StyleInfo.get(element);\n let s = styleInfo.customStyle;\n if (s && !nativeShadow && (s !== style)) {\n s['_useCount']--;\n if (s['_useCount'] <= 0 && s.parentNode) {\n s.parentNode.removeChild(s);\n }\n }\n // apply styling always under native or if we generated style\n // or the cached style is not in document(!)\n if (nativeShadow) {\n // update existing style only under native\n if (styleInfo.customStyle) {\n styleInfo.customStyle.textContent = cssText;\n style = styleInfo.customStyle;\n // otherwise, if we have css to apply, do so\n } else if (cssText) {\n // apply css after the scope style of the element to help with\n // style precedence rules.\n style = StyleUtil.applyCss(cssText, selector, element.shadowRoot,\n styleInfo.placeholder);\n }\n } else {\n // shady and no cache hit\n if (!style) {\n // apply css after the scope style of the element to help with\n // style precedence rules.\n if (cssText) {\n style = StyleUtil.applyCss(cssText, selector, null,\n styleInfo.placeholder);\n }\n // shady and cache hit but not in document\n } else if (!style.parentNode) {\n if (IS_IE && cssText.indexOf('@media') > -1) {\n // @media rules may be stale in IE 10 and 11\n // refresh the text content of the style to revalidate them.\n style.textContent = cssText;\n }\n StyleUtil.applyStyle(style, null, styleInfo.placeholder);\n }\n }\n // ensure this style is our custom style and increment its use count.\n if (style) {\n style['_useCount'] = style['_useCount'] || 0;\n // increment use count if we changed styles\n if (styleInfo.customStyle != style) {\n style['_useCount']++;\n }\n styleInfo.customStyle = style;\n }\n return style;\n }\n\n /**\n * @param {Element} style\n * @param {Object} properties\n */\n applyCustomStyle(style, properties) {\n let rules = StyleUtil.rulesForStyle(/** @type {HTMLStyleElement} */(style));\n let self = this;\n style.textContent = StyleUtil.toCssText(rules, function(/** StyleNode */rule) {\n let css = rule['cssText'] = rule['parsedCssText'];\n if (rule.propertyInfo && rule.propertyInfo.cssText) {\n // remove property assignments\n // so next function isn't confused\n // NOTE: we have 3 categories of css:\n // (1) normal properties,\n // (2) custom property assignments (--foo: red;),\n // (3) custom property usage: border: var(--foo); @apply(--foo);\n // In elements, 1 and 3 are separated for efficiency; here they\n // are not and this makes this case unique.\n css = removeCustomPropAssignment(/** @type {string} */(css));\n // replace with reified properties, scenario is same as mixin\n rule['cssText'] = self.valueForProperties(css, properties);\n }\n });\n }\n}\n\n/**\n * @param {number} n\n * @param {Array<number>} bits\n */\nfunction addToBitMask(n, bits) {\n let o = parseInt(n / 32, 10);\n let v = 1 << (n % 32);\n bits[o] = (bits[o] || 0) | v;\n}\n\nexport default new StyleProperties();","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {applyStylePlaceHolder} from './style-util.js';\nimport {nativeShadow} from './style-settings.js';\n\n/** @type {Object<string, !Node>} */\nlet placeholderMap = {};\n\n/**\n * @const {CustomElementRegistry}\n */\nconst ce = window['customElements'];\nif (ce && !nativeShadow) {\n /**\n * @const {function(this:CustomElementRegistry, string,function(new:HTMLElement),{extends: string}=)}\n */\n const origDefine = ce['define'];\n /**\n * @param {string} name\n * @param {function(new:HTMLElement)} clazz\n * @param {{extends: string}=} options\n */\n const wrappedDefine = (name, clazz, options) => {\n placeholderMap[name] = applyStylePlaceHolder(name);\n origDefine.call(/** @type {!CustomElementRegistry} */(ce), name, clazz, options);\n };\n ce['define'] = wrappedDefine;\n}\n\nexport default placeholderMap;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n'use strict';\n\nexport default class StyleCache {\n constructor(typeMax = 100) {\n // map element name -> [{properties, styleElement, scopeSelector}]\n this.cache = {};\n this.typeMax = typeMax;\n }\n\n _validate(cacheEntry, properties, ownPropertyNames) {\n for (let idx = 0; idx < ownPropertyNames.length; idx++) {\n let pn = ownPropertyNames[idx];\n if (cacheEntry.properties[pn] !== properties[pn]) {\n return false;\n }\n }\n return true;\n }\n\n store(tagname, properties, styleElement, scopeSelector) {\n let list = this.cache[tagname] || [];\n list.push({properties, styleElement, scopeSelector});\n if (list.length > this.typeMax) {\n list.shift();\n }\n this.cache[tagname] = list;\n }\n\n fetch(tagname, properties, ownPropertyNames) {\n let list = this.cache[tagname];\n if (!list) {\n return;\n }\n // reverse list for most-recent lookups\n for (let idx = list.length - 1; idx >= 0; idx--) {\n let entry = list[idx];\n if (this._validate(entry, properties, ownPropertyNames)) {\n return entry;\n }\n }\n }\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {nativeShadow} from './style-settings.js';\nimport StyleTransformer from './style-transformer.js';\nimport {getIsExtends} from './style-util.js';\n\nexport let flush = function() {};\n\n/**\n * @param {HTMLElement} element\n * @return {!Array<string>}\n */\nfunction getClasses(element) {\n let classes = [];\n if (element.classList) {\n classes = Array.from(element.classList);\n } else if (element instanceof window['SVGElement'] && element.hasAttribute('class')) {\n classes = element.getAttribute('class').split(/\\s+/);\n }\n return classes;\n}\n\n/**\n * @param {HTMLElement} element\n * @return {string}\n */\nfunction getCurrentScope(element) {\n let classes = getClasses(element);\n let idx = classes.indexOf(StyleTransformer.SCOPE_NAME);\n if (idx > -1) {\n return classes[idx + 1];\n }\n return '';\n}\n\n/**\n * @param {Array<MutationRecord|null>|null} mxns\n */\nfunction handler(mxns) {\n for (let x=0; x < mxns.length; x++) {\n let mxn = mxns[x];\n if (mxn.target === document.documentElement ||\n mxn.target === document.head) {\n continue;\n }\n for (let i=0; i < mxn.addedNodes.length; i++) {\n let n = mxn.addedNodes[i];\n if (n.nodeType !== Node.ELEMENT_NODE) {\n continue;\n }\n n = /** @type {HTMLElement} */(n); // eslint-disable-line no-self-assign\n let root = n.getRootNode();\n let currentScope = getCurrentScope(n);\n // node was scoped, but now is in document\n if (currentScope && root === n.ownerDocument) {\n StyleTransformer.dom(n, currentScope, true);\n } else if (root.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n let newScope;\n let host = /** @type {ShadowRoot} */(root).host;\n // element may no longer be in a shadowroot\n if (!host) {\n continue;\n }\n newScope = getIsExtends(host).is;\n if (currentScope === newScope) {\n // make sure all the subtree elements are scoped correctly\n let unscoped = window['ShadyDOM']['nativeMethods']['querySelectorAll'].call(\n n, `:not(.${StyleTransformer.SCOPE_NAME})`);\n for (let j = 0; j < unscoped.length; j++) {\n StyleTransformer.element(unscoped[j], currentScope);\n }\n continue;\n }\n if (currentScope) {\n StyleTransformer.dom(n, currentScope, true);\n }\n StyleTransformer.dom(n, newScope);\n }\n }\n }\n}\n\nif (!nativeShadow) {\n let observer = new MutationObserver(handler);\n let start = (node) => {\n observer.observe(node, {childList: true, subtree: true});\n }\n let nativeCustomElements = (window['customElements'] &&\n !window['customElements']['polyfillWrapFlushCallback']);\n // need to start immediately with native custom elements\n // TODO(dfreedm): with polyfilled HTMLImports and native custom elements\n // excessive mutations may be observed; this can be optimized via cooperation\n // with the HTMLImports polyfill.\n if (nativeCustomElements) {\n start(document);\n } else {\n let delayedStart = () => {\n start(document.body);\n }\n // use polyfill timing if it's available\n if (window['HTMLImports']) {\n window['HTMLImports']['whenReady'](delayedStart);\n // otherwise push beyond native imports being ready\n // which requires RAF + readystate interactive.\n } else {\n requestAnimationFrame(function() {\n if (document.readyState === 'loading') {\n let listener = function() {\n delayedStart();\n document.removeEventListener('readystatechange', listener);\n }\n document.addEventListener('readystatechange', listener);\n } else {\n delayedStart();\n }\n });\n }\n }\n\n flush = function() {\n handler(observer.takeRecords());\n }\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/**\n * @const {!Object<string, !HTMLTemplateElement>}\n */\nconst templateMap = {};\nexport default templateMap;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\nimport templateMap from './template-map.js';\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\n\n/*\n * Utilities for handling invalidating apply-shim mixins for a given template.\n *\n * The invalidation strategy involves keeping track of the \"current\" version of a template's mixins, and updating that count when a mixin is invalidated.\n * The template\n */\n\n/** @const {string} */\nconst CURRENT_VERSION = '_applyShimCurrentVersion';\n\n/** @const {string} */\nconst NEXT_VERSION = '_applyShimNextVersion';\n\n/** @const {string} */\nconst VALIDATING_VERSION = '_applyShimValidatingVersion';\n\n/**\n * @const {Promise<void>}\n */\nconst promise = Promise.resolve();\n\n/**\n * @param {string} elementName\n */\nexport function invalidate(elementName){\n let template = templateMap[elementName];\n if (template) {\n invalidateTemplate(template);\n }\n}\n\n/**\n * This function can be called multiple times to mark a template invalid\n * and signal that the style inside must be regenerated.\n *\n * Use `startValidatingTemplate` to begin an asynchronous validation cycle.\n * During that cycle, call `templateIsValidating` to see if the template must\n * be revalidated\n * @param {HTMLTemplateElement} template\n */\nexport function invalidateTemplate(template) {\n // default the current version to 0\n template[CURRENT_VERSION] = template[CURRENT_VERSION] || 0;\n // ensure the \"validating for\" flag exists\n template[VALIDATING_VERSION] = template[VALIDATING_VERSION] || 0;\n // increment the next version\n template[NEXT_VERSION] = (template[NEXT_VERSION] || 0) + 1;\n}\n\n/**\n * @param {string} elementName\n * @return {boolean}\n */\nexport function isValid(elementName) {\n let template = templateMap[elementName];\n if (template) {\n return templateIsValid(template);\n }\n return true;\n}\n\n/**\n * @param {HTMLTemplateElement} template\n * @return {boolean}\n */\nexport function templateIsValid(template) {\n return template[CURRENT_VERSION] === template[NEXT_VERSION];\n}\n\n/**\n * @param {string} elementName\n * @return {boolean}\n */\nexport function isValidating(elementName) {\n let template = templateMap[elementName];\n if (template) {\n return templateIsValidating(template);\n }\n return false;\n}\n\n/**\n * Returns true if the template is currently invalid and `startValidating` has been called since the last invalidation.\n * If false, the template must be validated.\n * @param {HTMLTemplateElement} template\n * @return {boolean}\n */\nexport function templateIsValidating(template) {\n return !templateIsValid(template) && template[VALIDATING_VERSION] === template[NEXT_VERSION];\n}\n\n/**\n * the template is marked as `validating` for one microtask so that all instances\n * found in the tree crawl of `applyStyle` will update themselves,\n * but the template will only be updated once.\n * @param {string} elementName\n*/\nexport function startValidating(elementName) {\n let template = templateMap[elementName];\n startValidatingTemplate(template);\n}\n\n/**\n * Begin an asynchronous invalidation cycle.\n * This should be called after every validation of a template\n *\n * After one microtask, the template will be marked as valid until the next call to `invalidateTemplate`\n * @param {HTMLTemplateElement} template\n */\nexport function startValidatingTemplate(template) {\n // remember that the current \"next version\" is the reason for this validation cycle\n template[VALIDATING_VERSION] = template[NEXT_VERSION];\n // however, there only needs to be one async task to clear the counters\n if (!template._validating) {\n template._validating = true;\n promise.then(function() {\n // sync the current version to let future invalidations cause a refresh cycle\n template[CURRENT_VERSION] = template[NEXT_VERSION];\n template._validating = false;\n });\n }\n}\n\n/**\n * @return {boolean}\n */\nexport function elementsAreInvalid() {\n for (let elementName in templateMap) {\n let template = templateMap[elementName];\n if (!templateIsValid(template)) {\n return true;\n }\n }\n return false;\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/** @type {Promise<void>} */\nlet readyPromise = null;\n\n/** @type {?function(?function())} */\nlet whenReady = window['HTMLImports'] && window['HTMLImports']['whenReady'] || null;\n\n/** @type {function()} */\nlet resolveFn;\n\n/**\n * @param {?function()} callback\n */\nexport default function documentWait(callback) {\n requestAnimationFrame(function() {\n if (whenReady) {\n whenReady(callback)\n } else {\n if (!readyPromise) {\n readyPromise = new Promise((resolve) => {resolveFn = resolve});\n if (document.readyState === 'complete') {\n resolveFn();\n } else {\n document.addEventListener('readystatechange', () => {\n if (document.readyState === 'complete') {\n resolveFn();\n }\n });\n }\n }\n readyPromise.then(function(){ callback && callback(); });\n }\n });\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {parse, StyleNode} from './css-parse.js';\nimport {nativeShadow, nativeCssVariables} from './style-settings.js';\nimport StyleTransformer from './style-transformer.js';\nimport * as StyleUtil from './style-util.js';\nimport StyleProperties from './style-properties.js';\nimport placeholderMap from './style-placeholder.js';\nimport StyleInfo from './style-info.js';\nimport StyleCache from './style-cache.js';\nimport {flush as watcherFlush} from './document-watcher.js';\nimport templateMap from './template-map.js';\nimport * as ApplyShimUtils from './apply-shim-utils.js';\nimport documentWait from './document-wait.js';\nimport {updateNativeProperties, detectMixin} from './common-utils.js';\nimport {CustomStyleInterfaceInterface} from './custom-style-interface.js'; // eslint-disable-line no-unused-vars\n\n/**\n * @const {StyleCache}\n */\nconst styleCache = new StyleCache();\n\nexport default class ScopingShim {\n constructor() {\n this._scopeCounter = {};\n this._documentOwner = document.documentElement;\n let ast = new StyleNode();\n ast['rules'] = [];\n this._documentOwnerStyleInfo = StyleInfo.set(this._documentOwner, new StyleInfo(ast));\n this._elementsHaveApplied = false;\n this._applyShim = null;\n /** @type {?CustomStyleInterfaceInterface} */\n this._customStyleInterface = null;\n documentWait(() => {\n this._ensure();\n });\n }\n flush() {\n watcherFlush();\n }\n _generateScopeSelector(name) {\n let id = this._scopeCounter[name] = (this._scopeCounter[name] || 0) + 1;\n return `${name}-${id}`;\n }\n getStyleAst(style) {\n return StyleUtil.rulesForStyle(style);\n }\n styleAstToString(ast) {\n return StyleUtil.toCssText(ast);\n }\n _gatherStyles(template) {\n return StyleUtil.gatherStyleText(template.content);\n }\n _getCssBuild(template) {\n let style = template.content.querySelector('style');\n if (!style) {\n return '';\n }\n return style.getAttribute('css-build') || '';\n }\n /**\n * Prepare the styling and template for the given element type\n *\n * @param {HTMLTemplateElement} template\n * @param {string} elementName\n * @param {string=} typeExtension\n */\n prepareTemplate(template, elementName, typeExtension) {\n if (template._prepared) {\n return;\n }\n template._prepared = true;\n template.name = elementName;\n template.extends = typeExtension;\n templateMap[elementName] = template;\n let cssBuild = this._getCssBuild(template);\n let cssText = this._gatherStyles(template);\n let info = {\n is: elementName,\n extends: typeExtension,\n __cssBuild: cssBuild,\n };\n if (!nativeShadow) {\n StyleTransformer.dom(template.content, elementName);\n }\n // check if the styling has mixin definitions or uses\n this._ensure();\n let hasMixins = detectMixin(cssText)\n let ast = parse(cssText);\n // only run the applyshim transforms if there is a mixin involved\n if (hasMixins && nativeCssVariables && this._applyShim) {\n this._applyShim['transformRules'](ast, elementName);\n }\n template['_styleAst'] = ast;\n template._cssBuild = cssBuild;\n\n let ownPropertyNames = [];\n if (!nativeCssVariables) {\n ownPropertyNames = StyleProperties.decorateStyles(template['_styleAst']);\n }\n if (!ownPropertyNames.length || nativeCssVariables) {\n let root = nativeShadow ? template.content : null;\n let placeholder = placeholderMap[elementName];\n let style = this._generateStaticStyle(info, template['_styleAst'], root, placeholder);\n template._style = style;\n }\n template._ownPropertyNames = ownPropertyNames;\n }\n _generateStaticStyle(info, rules, shadowroot, placeholder) {\n let cssText = StyleTransformer.elementStyles(info, rules);\n if (cssText.length) {\n return StyleUtil.applyCss(cssText, info.is, shadowroot, placeholder);\n }\n }\n _prepareHost(host) {\n let {is, typeExtension} = StyleUtil.getIsExtends(host);\n let placeholder = placeholderMap[is];\n let template = templateMap[is];\n let ast;\n let ownStylePropertyNames;\n let cssBuild;\n if (template) {\n ast = template['_styleAst'];\n ownStylePropertyNames = template._ownPropertyNames;\n cssBuild = template._cssBuild;\n }\n return StyleInfo.set(host,\n new StyleInfo(\n ast,\n placeholder,\n ownStylePropertyNames,\n is,\n typeExtension,\n cssBuild\n )\n );\n }\n _ensureApplyShim() {\n if (this._applyShim) {\n return;\n } else if (window.ShadyCSS && window.ShadyCSS.ApplyShim) {\n this._applyShim = window.ShadyCSS.ApplyShim;\n this._applyShim['invalidCallback'] = ApplyShimUtils.invalidate;\n }\n }\n _ensureCustomStyleInterface() {\n if (this._customStyleInterface) {\n return;\n } else if (window.ShadyCSS && window.ShadyCSS.CustomStyleInterface) {\n this._customStyleInterface = /** @type {!CustomStyleInterfaceInterface} */(window.ShadyCSS.CustomStyleInterface);\n /** @type {function(!HTMLStyleElement)} */\n this._customStyleInterface['transformCallback'] = (style) => {this.transformCustomStyleForDocument(style)};\n this._customStyleInterface['validateCallback'] = () => {\n requestAnimationFrame(() => {\n if (this._customStyleInterface['enqueued'] || this._elementsHaveApplied) {\n this.flushCustomStyles();\n }\n })\n };\n }\n }\n _ensure() {\n this._ensureApplyShim();\n this._ensureCustomStyleInterface();\n }\n /**\n * Flush and apply custom styles to document\n */\n flushCustomStyles() {\n this._ensure();\n if (!this._customStyleInterface) {\n return;\n }\n let customStyles = this._customStyleInterface['processStyles']();\n // early return if custom-styles don't need validation\n if (!this._customStyleInterface['enqueued']) {\n return;\n }\n if (!nativeCssVariables) {\n this._updateProperties(this._documentOwner, this._documentOwnerStyleInfo);\n this._applyCustomStyles(customStyles);\n } else {\n this._revalidateCustomStyleApplyShim(customStyles);\n }\n this._customStyleInterface['enqueued'] = false;\n // if custom elements have upgraded and there are no native css variables, we must recalculate the whole tree\n if (this._elementsHaveApplied && !nativeCssVariables) {\n this.styleDocument();\n }\n }\n /**\n * Apply styles for the given element\n *\n * @param {!HTMLElement} host\n * @param {Object=} overrideProps\n */\n styleElement(host, overrideProps) {\n let {is} = StyleUtil.getIsExtends(host);\n let styleInfo = StyleInfo.get(host);\n if (!styleInfo) {\n styleInfo = this._prepareHost(host);\n }\n // Only trip the `elementsHaveApplied` flag if a node other that the root document has `applyStyle` called\n if (!this._isRootOwner(host)) {\n this._elementsHaveApplied = true;\n }\n if (overrideProps) {\n styleInfo.overrideStyleProperties =\n styleInfo.overrideStyleProperties || {};\n Object.assign(styleInfo.overrideStyleProperties, overrideProps);\n }\n if (!nativeCssVariables) {\n this._updateProperties(host, styleInfo);\n if (styleInfo.ownStylePropertyNames && styleInfo.ownStylePropertyNames.length) {\n this._applyStyleProperties(host, styleInfo);\n }\n } else {\n if (styleInfo.overrideStyleProperties) {\n updateNativeProperties(host, styleInfo.overrideStyleProperties);\n }\n let template = templateMap[is];\n // bail early if there is no shadowroot for this element\n if (!template && !this._isRootOwner(host)) {\n return;\n }\n if (template && template._style && !ApplyShimUtils.templateIsValid(template)) {\n // update template\n if (!ApplyShimUtils.templateIsValidating(template)) {\n this._ensure();\n this._applyShim && this._applyShim['transformRules'](template['_styleAst'], is);\n template._style.textContent = StyleTransformer.elementStyles(host, styleInfo.styleRules);\n ApplyShimUtils.startValidatingTemplate(template);\n }\n // update instance if native shadowdom\n if (nativeShadow) {\n let root = host.shadowRoot;\n if (root) {\n let style = root.querySelector('style');\n style.textContent = StyleTransformer.elementStyles(host, styleInfo.styleRules);\n }\n }\n styleInfo.styleRules = template['_styleAst'];\n }\n }\n }\n _styleOwnerForNode(node) {\n let root = node.getRootNode();\n let host = root.host;\n if (host) {\n if (StyleInfo.get(host)) {\n return host;\n } else {\n return this._styleOwnerForNode(host);\n }\n }\n return this._documentOwner;\n }\n _isRootOwner(node) {\n return (node === this._documentOwner);\n }\n _applyStyleProperties(host, styleInfo) {\n let is = StyleUtil.getIsExtends(host).is;\n let cacheEntry = styleCache.fetch(is, styleInfo.styleProperties, styleInfo.ownStylePropertyNames);\n let cachedScopeSelector = cacheEntry && cacheEntry.scopeSelector;\n let cachedStyle = cacheEntry ? cacheEntry.styleElement : null;\n let oldScopeSelector = styleInfo.scopeSelector;\n // only generate new scope if cached style is not found\n styleInfo.scopeSelector = cachedScopeSelector || this._generateScopeSelector(is);\n let style = StyleProperties.applyElementStyle(host, styleInfo.styleProperties, styleInfo.scopeSelector, cachedStyle);\n if (!nativeShadow) {\n StyleProperties.applyElementScopeSelector(host, styleInfo.scopeSelector, oldScopeSelector);\n }\n if (!cacheEntry) {\n styleCache.store(is, styleInfo.styleProperties, style, styleInfo.scopeSelector);\n }\n return style;\n }\n _updateProperties(host, styleInfo) {\n let owner = this._styleOwnerForNode(host);\n let ownerStyleInfo = StyleInfo.get(owner);\n let ownerProperties = ownerStyleInfo.styleProperties;\n let props = Object.create(ownerProperties || null);\n let hostAndRootProps = StyleProperties.hostAndRootPropertiesForScope(host, styleInfo.styleRules);\n let propertyData = StyleProperties.propertyDataFromStyles(ownerStyleInfo.styleRules, host);\n let propertiesMatchingHost = propertyData.properties\n Object.assign(\n props,\n hostAndRootProps.hostProps,\n propertiesMatchingHost,\n hostAndRootProps.rootProps\n );\n this._mixinOverrideStyles(props, styleInfo.overrideStyleProperties);\n StyleProperties.reify(props);\n styleInfo.styleProperties = props;\n }\n _mixinOverrideStyles(props, overrides) {\n for (let p in overrides) {\n let v = overrides[p];\n // skip override props if they are not truthy or 0\n // in order to fall back to inherited values\n if (v || v === 0) {\n props[p] = v;\n }\n }\n }\n /**\n * Update styles of the whole document\n *\n * @param {Object=} properties\n */\n styleDocument(properties) {\n this.styleSubtree(this._documentOwner, properties);\n }\n /**\n * Update styles of a subtree\n *\n * @param {!HTMLElement} host\n * @param {Object=} properties\n */\n styleSubtree(host, properties) {\n let root = host.shadowRoot;\n if (root || this._isRootOwner(host)) {\n this.styleElement(host, properties);\n }\n // process the shadowdom children of `host`\n let shadowChildren = root && (root.children || root.childNodes);\n if (shadowChildren) {\n for (let i = 0; i < shadowChildren.length; i++) {\n let c = /** @type {!HTMLElement} */(shadowChildren[i]);\n this.styleSubtree(c);\n }\n } else {\n // process the lightdom children of `host`\n let children = host.children || host.childNodes;\n if (children) {\n for (let i = 0; i < children.length; i++) {\n let c = /** @type {!HTMLElement} */(children[i]);\n this.styleSubtree(c);\n }\n }\n }\n }\n /* Custom Style operations */\n _revalidateCustomStyleApplyShim(customStyles) {\n for (let i = 0; i < customStyles.length; i++) {\n let c = customStyles[i];\n let s = this._customStyleInterface['getStyleForCustomStyle'](c);\n if (s) {\n this._revalidateApplyShim(s);\n }\n }\n }\n _applyCustomStyles(customStyles) {\n for (let i = 0; i < customStyles.length; i++) {\n let c = customStyles[i];\n let s = this._customStyleInterface['getStyleForCustomStyle'](c);\n if (s) {\n StyleProperties.applyCustomStyle(s, this._documentOwnerStyleInfo.styleProperties);\n }\n }\n }\n transformCustomStyleForDocument(style) {\n let ast = StyleUtil.rulesForStyle(style);\n StyleUtil.forEachRule(ast, (rule) => {\n if (nativeShadow) {\n StyleTransformer.normalizeRootSelector(rule);\n } else {\n StyleTransformer.documentRule(rule);\n }\n if (nativeCssVariables) {\n this._ensure();\n this._applyShim && this._applyShim['transformRule'](rule);\n }\n });\n if (nativeCssVariables) {\n style.textContent = StyleUtil.toCssText(ast);\n } else {\n this._documentOwnerStyleInfo.styleRules['rules'].push(ast);\n }\n }\n _revalidateApplyShim(style) {\n if (nativeCssVariables && this._applyShim) {\n let ast = StyleUtil.rulesForStyle(style);\n this._ensure();\n this._applyShim['transformRules'](ast);\n style.textContent = StyleUtil.toCssText(ast);\n }\n }\n getComputedStyleValue(element, property) {\n let value;\n if (!nativeCssVariables) {\n // element is either a style host, or an ancestor of a style host\n let styleInfo = StyleInfo.get(element) || StyleInfo.get(this._styleOwnerForNode(element));\n value = styleInfo.styleProperties[property];\n }\n // fall back to the property value from the computed styling\n value = value || window.getComputedStyle(element).getPropertyValue(property);\n // trim whitespace that can come after the `:` in css\n // example: padding: 2px -> \" 2px\"\n return value ? value.trim() : '';\n }\n // given an element and a classString, replaces\n // the element's class with the provided classString and adds\n // any necessary ShadyCSS static and property based scoping selectors\n setElementClass(element, classString) {\n let root = element.getRootNode();\n let classes = classString ? classString.split(/\\s/) : [];\n let scopeName = root.host && root.host.localName;\n // If no scope, try to discover scope name from existing class.\n // This can occur if, for example, a template stamped element that\n // has been scoped is manipulated when not in a root.\n if (!scopeName) {\n var classAttr = element.getAttribute('class');\n if (classAttr) {\n let k$ = classAttr.split(/\\s/);\n for (let i=0; i < k$.length; i++) {\n if (k$[i] === StyleTransformer.SCOPE_NAME) {\n scopeName = k$[i+1];\n break;\n }\n }\n }\n }\n if (scopeName) {\n classes.push(StyleTransformer.SCOPE_NAME, scopeName);\n }\n if (!nativeCssVariables) {\n let styleInfo = StyleInfo.get(element);\n if (styleInfo && styleInfo.scopeSelector) {\n classes.push(StyleProperties.XSCOPE_NAME, styleInfo.scopeSelector);\n }\n }\n StyleUtil.setElementClassRaw(element, classes.join(' '));\n }\n _styleInfoForNode(node) {\n return StyleInfo.get(node);\n }\n}\n\n/* exports */\nScopingShim.prototype['flush'] = ScopingShim.prototype.flush;\nScopingShim.prototype['prepareTemplate'] = ScopingShim.prototype.prepareTemplate;\nScopingShim.prototype['styleElement'] = ScopingShim.prototype.styleElement;\nScopingShim.prototype['styleDocument'] = ScopingShim.prototype.styleDocument;\nScopingShim.prototype['styleSubtree'] = ScopingShim.prototype.styleSubtree;\nScopingShim.prototype['getComputedStyleValue'] = ScopingShim.prototype.getComputedStyleValue;\nScopingShim.prototype['setElementClass'] = ScopingShim.prototype.setElementClass;\nScopingShim.prototype['_styleInfoForNode'] = ScopingShim.prototype._styleInfoForNode;\nScopingShim.prototype['transformCustomStyleForDocument'] = ScopingShim.prototype.transformCustomStyleForDocument;\nScopingShim.prototype['getStyleAst'] = ScopingShim.prototype.getStyleAst;\nScopingShim.prototype['styleAstToString'] = ScopingShim.prototype.styleAstToString;\nScopingShim.prototype['flushCustomStyles'] = ScopingShim.prototype.flushCustomStyles;\nObject.defineProperties(ScopingShim.prototype, {\n 'nativeShadow': {\n get() {\n return nativeShadow;\n }\n },\n 'nativeCss': {\n get() {\n return nativeCssVariables;\n }\n }\n});\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport { MIXIN_MATCH, VAR_ASSIGN } from './common-regex.js';\n\n/**\n * @param {Element} element\n * @param {Object=} properties\n */\nexport function updateNativeProperties(element, properties) {\n // remove previous properties\n for (let p in properties) {\n // NOTE: for bc with shim, don't apply null values.\n if (p === null) {\n element.style.removeProperty(p);\n } else {\n element.style.setProperty(p, properties[p]);\n }\n }\n}\n\n/**\n * @param {Element} element\n * @param {string} property\n * @return {string}\n */\nexport function getComputedStyleValue(element, property) {\n /**\n * @const {string}\n */\n const value = window.getComputedStyle(element).getPropertyValue(property);\n if (!value) {\n return '';\n } else {\n return value.trim();\n }\n}\n\n/**\n * return true if `cssText` contains a mixin definition or consumption\n * @param {string} cssText\n * @return {boolean}\n */\nexport function detectMixin(cssText) {\n const has = MIXIN_MATCH.test(cssText) || VAR_ASSIGN.test(cssText);\n // reset state of the regexes\n MIXIN_MATCH.lastIndex = 0;\n VAR_ASSIGN.lastIndex = 0;\n return has;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport ScopingShim from '../src/scoping-shim.js';\nimport {nativeCssVariables, nativeShadow} from '../src/style-settings.js';\n\n/** @const {ScopingShim} */\nconst scopingShim = new ScopingShim();\n\nlet ApplyShim, CustomStyleInterface;\n\nif (window['ShadyCSS']) {\n ApplyShim = window['ShadyCSS']['ApplyShim'];\n CustomStyleInterface = window['ShadyCSS']['CustomStyleInterface'];\n}\n\nwindow.ShadyCSS = {\n ScopingShim: scopingShim,\n /**\n * @param {!HTMLTemplateElement} template\n * @param {string} elementName\n * @param {string=} elementExtends\n */\n prepareTemplate(template, elementName, elementExtends) {\n scopingShim.flushCustomStyles();\n scopingShim.prepareTemplate(template, elementName, elementExtends)\n },\n\n /**\n * @param {!HTMLElement} element\n * @param {Object=} properties\n */\n styleSubtree(element, properties) {\n scopingShim.flushCustomStyles();\n scopingShim.styleSubtree(element, properties);\n },\n\n /**\n * @param {!HTMLElement} element\n */\n styleElement(element) {\n scopingShim.flushCustomStyles();\n scopingShim.styleElement(element);\n },\n\n /**\n * @param {Object=} properties\n */\n styleDocument(properties) {\n scopingShim.flushCustomStyles();\n scopingShim.styleDocument(properties);\n },\n\n /**\n * @param {Element} element\n * @param {string} property\n * @return {string}\n */\n getComputedStyleValue(element, property) {\n return scopingShim.getComputedStyleValue(element, property);\n },\n\n nativeCss: nativeCssVariables,\n\n nativeShadow: nativeShadow\n};\n\nif (ApplyShim) {\n window.ShadyCSS.ApplyShim = ApplyShim;\n}\n\nif (CustomStyleInterface) {\n window.ShadyCSS.CustomStyleInterface = CustomStyleInterface;\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n'use strict';\n\n/*\n * Polyfills loaded: Custom Elements, Shady DOM/Shady CSS\n * Used in: Safari 9, Firefox, Edge\n */\n\nimport '../node_modules/@webcomponents/shadydom/src/shadydom.js';\nimport '../node_modules/@webcomponents/custom-elements/src/custom-elements.js';\nimport '../node_modules/@webcomponents/shadycss/entrypoints/scoping-shim.js';\n\nlet document = window.document;\n// global for (1) existence means `WebComponentsReady` will file,\n// (2) WebComponents.ready == true means event has fired.\nwindow.WebComponents = window.WebComponents || {};\n\nfunction fire() {\n requestAnimationFrame(() => {\n window.WebComponents.ready = true;\n window.document.dispatchEvent(new CustomEvent('WebComponentsReady', { bubbles: true }));\n })\n}\n\nfunction wait() {\n fire();\n document.removeEventListener('readystatechange', wait);\n}\n\nif (document.readyState !== 'loading') {\n fire();\n} else {\n document.addEventListener('readystatechange', wait);\n}"]} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer3/LICENSE.polymer b/chromium/third_party/catapult/third_party/polymer3/LICENSE.polymer
new file mode 100644
index 00000000000..87c683b8e83
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/LICENSE.polymer
@@ -0,0 +1,27 @@
+// Copyright (c) 2017 The Polymer Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/chromium/third_party/catapult/third_party/polymer3/README.chromium b/chromium/third_party/catapult/third_party/polymer3/README.chromium
new file mode 100644
index 00000000000..9e9897b0fdc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/README.chromium
@@ -0,0 +1,24 @@
+Name: Polymer
+Short Name: polymer
+URL: http://www.polymer-project.org
+Version: 3.0.0
+Revision: (Run `bower install` and see bower_components/polymer/.bower.json)
+License: BSD
+License File: LICENSE.polymer
+Security Critical: no
+
+Description:
+This directory contains a subset of the components provided by the
+Polymer project. See bower.json for a full list of components.
+
+The license can be found in bower_components/polymer/LICENSE.txt.
+
+The source git repositories can be found at:
+https://github.com/Polymer/<component>
+
+Note on Bower:
+Install bower using `npm install -g bower`.
+Install new bower components using `bower install --save $COMPONENT_NAME`.
+
+Local Modifications:
+None
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower.json b/chromium/third_party/catapult/third_party/polymer3/bower.json
new file mode 100644
index 00000000000..b69a892b78d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower.json
@@ -0,0 +1,7 @@
+{
+ "name": "catapult",
+ "private": true,
+ "dependencies": {
+ "polymer": "Polymer/polymer#^3.0.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.bower.json b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.bower.json
new file mode 100644
index 00000000000..739fc88e705
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.bower.json
@@ -0,0 +1,14 @@
+{
+ "name": "polymer",
+ "homepage": "https://github.com/Polymer/polymer",
+ "version": "3.0.2",
+ "_release": "3.0.2",
+ "_resolution": {
+ "type": "version",
+ "tag": "v3.0.2",
+ "commit": "1476ce71c3edae89274f7d2db72a0f0551b28cdd"
+ },
+ "_source": "https://github.com/Polymer/polymer.git",
+ "_target": "^3.0.0",
+ "_originalSource": "Polymer/polymer"
+} \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.eslintrc.json b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.eslintrc.json
new file mode 100644
index 00000000000..77b19fd82bd
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.eslintrc.json
@@ -0,0 +1,45 @@
+{
+ "extends": "eslint:recommended",
+ "parser": "babel-eslint",
+ "parserOptions": {
+ "ecmaVersion": 6,
+ "sourceType": "module"
+ },
+ "rules": {
+ "no-console": "off",
+ "no-var": "error",
+ "semi": "error",
+ "strict": "error",
+ "valid-jsdoc": ["error", {
+ "requireReturn": false,
+ "prefer": {
+ "arg": "param",
+ "argument": "param",
+ "returns": "return"
+ },
+ "preferType": {
+ "Boolean": "boolean",
+ "Number": "number",
+ "String": "string",
+ "object": "Object",
+ "array": "Array"
+ }
+ }],
+ "no-useless-escape": "off"
+ },
+ "env": {
+ "browser": true,
+ "es6": true
+ },
+ "plugins": [
+ "html"
+ ],
+ "globals": {
+ "customElements": true,
+ "HTMLImports": true,
+ "Polymer": true,
+ "ShadyDOM": true,
+ "ShadyCSS": true,
+ "JSCompiler_renameProperty": true
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.github/CODEOWNERS b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.github/CODEOWNERS
new file mode 100644
index 00000000000..4046195b53c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+# Code owners for Polymer
+* @sorvell @kevinpschaaf @TimvdLippe @azakus \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.github/ISSUE_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..ffe1bc46552
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,50 @@
+<!--
+If you are asking a question rather than filing a bug, try one of these instead:
+- StackOverflow (https://stackoverflow.com/questions/tagged/polymer)
+- Polymer Slack Channel (https://bit.ly/polymerslack)
+- Mailing List (https://groups.google.com/forum/#!forum/polymer-dev)
+-->
+<!-- Instructions For Filing a Bug: https://github.com/Polymer/polymer/blob/master/CONTRIBUTING.md#filing-bugs -->
+### Description
+<!-- Example: Error thrown when calling `appendChild` on Polymer element -->
+
+#### Live Demo
+<!-- jsBin starting point (fork and edit) -->
+https://jsbin.com/luhaxab/edit
+<!-- glitch.me starting point (remix and edit -- must be logged in to persist!) -->
+https://glitch.com/edit/#!/polymer-repro?path=my-element.html:2:0
+<!-- ...or provide your own repro URL -->
+
+#### Steps to Reproduce
+<!--
+Example:
+
+1. Create `my-element`
+2. Append `my-element` to document.body
+3. Create `div`.
+4. Append `div` to `my-element`
+-->
+
+
+#### Expected Results
+<!-- Example: No error is throw -->
+
+#### Actual Results
+<!-- Example: Error is thrown -->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Edge
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] IE 11
+
+### Versions
+<!--
+`Polymer.version` will show the version for Polymer
+`bower ls` or `npm ls` will show the version of webcomponents.js or webcomponents-lite.js
+-->
+- Polymer: vX.X.X
+- webcomponents: vX.X.X
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.github/PULL_REQUEST_TEMPLATE.md b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 00000000000..94d43316a1c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,3 @@
+<!-- Instructions: https://github.com/Polymer/polymer/blob/master/CONTRIBUTING.md#contributing-pull-requests -->
+### Reference Issue
+<!-- Example: Fixes #1234 -->
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.npmignore b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.npmignore
new file mode 100644
index 00000000000..2f38c9a6198
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.npmignore
@@ -0,0 +1,4 @@
+test/
+util/
+img/
+\..*
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.travis.yml b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.travis.yml
new file mode 100644
index 00000000000..7c7acc8f4a2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/.travis.yml
@@ -0,0 +1,26 @@
+language: node_js
+sudo: false
+dist: trusty
+node_js: '9'
+addons:
+ firefox: latest
+ chrome: stable
+cache:
+ directories:
+ - node_modules
+before_script:
+- npm install -g gulp-cli@1
+- gulp lint-eslint
+# TODO(dfreedm): re-enable after making update-types work
+#- >-
+# npm run update-types && git diff --exit-code || (echo -e
+# '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+# update-types".' && false)
+script:
+- node ./node_modules/.bin/polymer test --npm --module-resolution=node -l chrome
+- node ./node_modules/.bin/polymer test --npm --module-resolution=node -l firefox
+- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then travis_wait 30 ./util/travis-sauce-test.sh; fi
+env:
+ global:
+ - secure: bfF/o1ewpOxDNqTzWfvlwgRgGfP8OXhSQLLdEwZ6izO9tckMJuSNghk3qBXCEQJwTcUEyXP6EqfzIrRAvDXPa0H3OoinbrooDyV2wIDaVRK++WR2iZIqzqo3hGOdzm4tdrGJZe5av5Rk661Hls8aPfLbjdzcGuYXi8B4wZq2xMI=
+ - secure: jBrKtQBdoL2dsXi9BQpw5tMkYZOsQAy2iSB+0xPOxhPI8EbXKnm8OhWQDEJ5TdduLWUxLLc12IJwjBy9ocLlC1ZvzgOXNfqOUkLD03qSPnyT/LomTXeP4XuojUAemc/w1MHd61nFz4YJaO8cQ+yfy6GOX2susabW+Y80mnIeGJk=
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/CHANGELOG.md b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/CHANGELOG.md
new file mode 100644
index 00000000000..fb53b5aaa3a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/CHANGELOG.md
@@ -0,0 +1,5894 @@
+# Change Log
+
+## [v3.0.1](https://github.com/Polymer/polymer/tree/v3.0.1) (2018-05-09)
+- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/3a4b8b89))
+
+- Remove importHref from 3.0 ([commit](https://github.com/Polymer/polymer/commit/fd416a21))
+
+## [v3.0.0](https://github.com/Polymer/polymer/tree/v3.0.0) (2018-05-08)
+- use released versions of shadycss and webcomponentsjs ([commit](https://github.com/Polymer/polymer/commit/8f79ec40))
+
+- Bump dependencies ([commit](https://github.com/Polymer/polymer/commit/8894e22b))
+
+- Run Chrome & FF serially to try and help flakiness ([commit](https://github.com/Polymer/polymer/commit/95740463))
+
+- Fix lint warning ([commit](https://github.com/Polymer/polymer/commit/ecf36f8a))
+
+- Bump to cli 1.7.0 ([commit](https://github.com/Polymer/polymer/commit/ccb29d27))
+
+- Removing support for returning strings from template getter. (Per previous documented deprecation: https://www.polymer-project.org/2.0/docs/devguide/dom-template#templateobject) ([commit](https://github.com/Polymer/polymer/commit/ba4491d5))
+
+- Fix typos and nits ([commit](https://github.com/Polymer/polymer/commit/c54ff70a))
+
+- Update to Gulp 4 ([commit](https://github.com/Polymer/polymer/commit/4e31768c))
+
+- Add serve command to package.json and update package-lock.json ([commit](https://github.com/Polymer/polymer/commit/eb72d5aa))
+
+- Fix for browsers that don't have input.labels. ([commit](https://github.com/Polymer/polymer/commit/036e4f66))
+
+- Tweak introductory note, fix webpack capitalization ([commit](https://github.com/Polymer/polymer/commit/b823620e))
+
+- gestures: Avoid spreading non-iterable in older browsers ([commit](https://github.com/Polymer/polymer/commit/2ce4f700))
+
+- wip ([commit](https://github.com/Polymer/polymer/commit/f4534c6a))
+
+- Readme: very small tweaks ([commit](https://github.com/Polymer/polymer/commit/d896cdd0))
+
+- Tweak wording. ([commit](https://github.com/Polymer/polymer/commit/fb7630c3))
+
+- Fix link ([commit](https://github.com/Polymer/polymer/commit/fc0ce189))
+
+- Re-order sections ([commit](https://github.com/Polymer/polymer/commit/ee6a67ee))
+
+- Fix LitElement typo ([commit](https://github.com/Polymer/polymer/commit/928c47fc))
+
+- Depend on polymer-cli rather than wct ([commit](https://github.com/Polymer/polymer/commit/503f5631))
+
+- Minor tweaks ([commit](https://github.com/Polymer/polymer/commit/e924ba86))
+
+- Update README for 3.x ([commit](https://github.com/Polymer/polymer/commit/956bba73))
+
+- Update Edge testing versions. ([commit](https://github.com/Polymer/polymer/commit/445c979b))
+
+- Exclude all Edge versions from keyframe/font tests. ([commit](https://github.com/Polymer/polymer/commit/85278860))
+
+- Update wcjs version. ([commit](https://github.com/Polymer/polymer/commit/4805e31f))
+
+- Add .npmignore file (#5215) ([commit](https://github.com/Polymer/polymer/commit/b3c36df7))
+
+- Use node 9 ([commit](https://github.com/Polymer/polymer/commit/0bb5d7c5))
+
+- Use module flags for wct ([commit](https://github.com/Polymer/polymer/commit/8abf2ec9))
+
+- Use babel parser for aslant for dynamic import. ([commit](https://github.com/Polymer/polymer/commit/bddeff4a))
+
+- Fix lint errors. ([commit](https://github.com/Polymer/polymer/commit/dea23515))
+
+- 3.0.0-pre.13 ([commit](https://github.com/Polymer/polymer/commit/da2d66dc))
+
+- [package.json] Remove version script ([commit](https://github.com/Polymer/polymer/commit/e88c1eef))
+
+- Update dependencies ([commit](https://github.com/Polymer/polymer/commit/1ed2b310))
+
+- Fix test typo on Chrome ([commit](https://github.com/Polymer/polymer/commit/a11febe7))
+
+- Fixes IE11 test issues ([commit](https://github.com/Polymer/polymer/commit/8b5803c2))
+
+- Fixes styling tests related to using HTML Imports ([commit](https://github.com/Polymer/polymer/commit/26747422))
+
+- Remove crufty global (fixes globals.html test) ([commit](https://github.com/Polymer/polymer/commit/676f5f3d))
+
+- Update to webcomponents 2.0.0 and webcomponents-bundle.js ([commit](https://github.com/Polymer/polymer/commit/a4d80d09))
+
+- Fix meaningful whitespace in test assertion ([commit](https://github.com/Polymer/polymer/commit/bff03b2d))
+
+- Fix latent mistake using old SD API ([commit](https://github.com/Polymer/polymer/commit/3f24f71d))
+
+- Add global for wct callback when amd compiling ([commit](https://github.com/Polymer/polymer/commit/7f9de46c))
+
+- Eliminate pre-module code from resolveUrl tests ([commit](https://github.com/Polymer/polymer/commit/a93f81f1))
+
+- Improve documentation and legibility. ([commit](https://github.com/Polymer/polymer/commit/ab103dc1))
+
+- Add some global whitelists ([commit](https://github.com/Polymer/polymer/commit/d6821e45))
+
+- Fix references to js files instead of html files ([commit](https://github.com/Polymer/polymer/commit/dfcaadb2))
+
+- Fix glob patterns for eslint ([commit](https://github.com/Polymer/polymer/commit/206cf724))
+
+- Fix ESLint warnings ([commit](https://github.com/Polymer/polymer/commit/6d240138))
+
+- Eliminate more canonical path usage ([commit](https://github.com/Polymer/polymer/commit/1761c79b))
+
+- Eliminate canonical path to wcjs ([commit](https://github.com/Polymer/polymer/commit/4b7cd869))
+
+- Remove extra polymer-legacy.js imports ([commit](https://github.com/Polymer/polymer/commit/f39aaa8c))
+
+- Clean up Polymer fn import ([commit](https://github.com/Polymer/polymer/commit/8069dff4))
+
+- Add WCT config used by all tests ([commit](https://github.com/Polymer/polymer/commit/f1266845))
+
+- Clean up exports ([commit](https://github.com/Polymer/polymer/commit/0b75920f))
+
+- Allow Polymer fn's call to Class to be overridden. ([commit](https://github.com/Polymer/polymer/commit/65d73f17))
+
+- add sill-relevant, deleted tests back in ([commit](https://github.com/Polymer/polymer/commit/180a92ff))
+
+- manually change inter-package dep imports from paths to names ([commit](https://github.com/Polymer/polymer/commit/d913614d))
+
+- manually add assetpath (import.meta.url) for tests that require it ([commit](https://github.com/Polymer/polymer/commit/0c850659))
+
+- move behavior definition to before usage ([commit](https://github.com/Polymer/polymer/commit/09b11fa4))
+
+- define omitted class declaration ([commit](https://github.com/Polymer/polymer/commit/ec36165e))
+
+- remove &lt; and replace with < for innerHTML ([commit](https://github.com/Polymer/polymer/commit/5ce0d24d))
+
+- fixed typo causing test to fail ([commit](https://github.com/Polymer/polymer/commit/0caa7dab))
+
+- fix missing dom-module in modulization ([commit](https://github.com/Polymer/polymer/commit/6c7c770c))
+
+- revert module wait ([commit](https://github.com/Polymer/polymer/commit/12a650b1))
+
+- wait for elements in other modules to be defined ([commit](https://github.com/Polymer/polymer/commit/f0376406))
+
+- no more undefined.hasShadow ([commit](https://github.com/Polymer/polymer/commit/0985652e))
+
+- removed link rel import type css tests ([commit](https://github.com/Polymer/polymer/commit/57d4190c))
+
+- delete debugger ([commit](https://github.com/Polymer/polymer/commit/6905dd10))
+
+- skip link rel import type css tests on native imports ([commit](https://github.com/Polymer/polymer/commit/811ee301))
+
+- add missing css html import ([commit](https://github.com/Polymer/polymer/commit/a52148a3))
+
+- remove importHref tests ([commit](https://github.com/Polymer/polymer/commit/a84ad782))
+
+- Import Polymer function in tests from legacy/polymer-fn.js ([commit](https://github.com/Polymer/polymer/commit/232b0042))
+
+- Export Polymer function from polymer-legacy.js ([commit](https://github.com/Polymer/polymer/commit/69f488b2))
+
+- Add new wct deps. ([commit](https://github.com/Polymer/polymer/commit/a4bedbfd))
+
+- Fixup a few places where comments were misplaced. ([commit](https://github.com/Polymer/polymer/commit/ac2fa81f))
+
+- Fixup license comments. ([commit](https://github.com/Polymer/polymer/commit/f664f251))
+
+- Update package.json from modulizer's output, set polymer-element.js as main. ([commit](https://github.com/Polymer/polymer/commit/5abf4728))
+
+- Replace sources with modulizer output. ([commit](https://github.com/Polymer/polymer/commit/cf3b7215))
+
+- Rename HTML files to .js files to trick git's rename detection. ([commit](https://github.com/Polymer/polymer/commit/527d2cdd))
+
+- Delete typings for now. ([commit](https://github.com/Polymer/polymer/commit/03d85982))
+
+- Add reasoning for suppress missingProperties ([commit](https://github.com/Polymer/polymer/commit/61ca60e4))
+
+- Don't rely on dom-module synchronously until WCR. ([commit](https://github.com/Polymer/polymer/commit/e64bd0ba))
+
+- Avoid closure warnings. ([commit](https://github.com/Polymer/polymer/commit/412bb1e0))
+
+- Add ability to define importMeta on legacy elements. Fixes #5163 ([commit](https://github.com/Polymer/polymer/commit/616f6662))
+
+- Allow legacy element property definitions with only a type. Fixes #5173 ([commit](https://github.com/Polymer/polymer/commit/d321c6c9))
+
+- Update docs. ([commit](https://github.com/Polymer/polymer/commit/c8c9e24d))
+
+- Use Polymer.ResolveUrl.pathFromUrl ([commit](https://github.com/Polymer/polymer/commit/d9d3e439))
+
+- Fix test under shadydom. Slight logic refactor. ([commit](https://github.com/Polymer/polymer/commit/2128ebe2))
+
+- Fix lint warning ([commit](https://github.com/Polymer/polymer/commit/fb741ee3))
+
+- Add importMeta getter to derive importPath from modules. Fixes #5163 ([commit](https://github.com/Polymer/polymer/commit/f7672da9))
+
+- Reference dependencies as siblings in tests. ([commit](https://github.com/Polymer/polymer/commit/2561d868))
+
+- Update types ([commit](https://github.com/Polymer/polymer/commit/23ba7dee))
+
+- Add note about performance vs correctness ([commit](https://github.com/Polymer/polymer/commit/89ab7385))
+
+- Update types. ([commit](https://github.com/Polymer/polymer/commit/5357d64a))
+
+- Lint clean. ([commit](https://github.com/Polymer/polymer/commit/f78b0518))
+
+- Pass through fourth namespace param on attributeChangedCallback. ([commit](https://github.com/Polymer/polymer/commit/91d4aeba))
+
+- Add a @const annotation to help the Closure Compiler understand that Polymer.Debouncer is the name of a type. ([commit](https://github.com/Polymer/polymer/commit/e5a5725d))
+
+- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/92d282a9))
+
+- Update docs and types ([commit](https://github.com/Polymer/polymer/commit/211c223f))
+
+- Update perf test to use strict-binding-parser ([commit](https://github.com/Polymer/polymer/commit/f53e9e8a))
+
+- Correct import paths ([commit](https://github.com/Polymer/polymer/commit/ab93ab08))
+
+- Only store method once for dynamic functions ([commit](https://github.com/Polymer/polymer/commit/0f0ccdad))
+
+- Move strict-binding-parser to lib/mixins ([commit](https://github.com/Polymer/polymer/commit/a4d4eb9a))
+
+- Rename to StrictBindingParser ([commit](https://github.com/Polymer/polymer/commit/19d4b8cb))
+
+- Fix linter errors ([commit](https://github.com/Polymer/polymer/commit/d8cf449e))
+
+- Extract to a mixin ([commit](https://github.com/Polymer/polymer/commit/57a14236))
+
+- Add missing dependency to bower.json ([commit](https://github.com/Polymer/polymer/commit/333a4664))
+
+- Fix linter warning ([commit](https://github.com/Polymer/polymer/commit/14fac019))
+
+- Add documentation ([commit](https://github.com/Polymer/polymer/commit/df0ee354))
+
+- Add performance test for binding-expressions ([commit](https://github.com/Polymer/polymer/commit/42f7d785))
+
+- Rewrite parser to use switch-case instead of functions ([commit](https://github.com/Polymer/polymer/commit/423074d1))
+
+- Remove escaping from bindings ([commit](https://github.com/Polymer/polymer/commit/8cd49479))
+
+- Fix linter warning ([commit](https://github.com/Polymer/polymer/commit/8a5525b0))
+
+- Refactor to be functional and add more tests ([commit](https://github.com/Polymer/polymer/commit/7eb1a627))
+
+- Fix linter warnings ([commit](https://github.com/Polymer/polymer/commit/79d05b8a))
+
+- Rewrite expression parser to state machine ([commit](https://github.com/Polymer/polymer/commit/13b834df))
+
+## [v2.6.0](https://github.com/Polymer/polymer/tree/v2.6.0) (2018-03-22)
+- Use function instead of Set ([commit](https://github.com/Polymer/polymer/commit/33d2e1a8))
+
+- [ci skip] Fix typo ([commit](https://github.com/Polymer/polymer/commit/0d1b1c2e))
+
+- Fix test in shady DOM ([commit](https://github.com/Polymer/polymer/commit/a586b72c))
+
+- Deduplicate style includes ([commit](https://github.com/Polymer/polymer/commit/acfef71d))
+
+- use a clearer test for shadowRoot ([commit](https://github.com/Polymer/polymer/commit/b2fb1cfd))
+
+- Returning null in template should nullify parent template ([commit](https://github.com/Polymer/polymer/commit/2a6c0a2a))
+
+- [ci skip] Add clarifying comment ([commit](https://github.com/Polymer/polymer/commit/0573d483))
+
+- Correct the JSBin version ([commit](https://github.com/Polymer/polymer/commit/cb1ae7d3))
+
+- Put attribute capitalization fix in property-effects ([commit](https://github.com/Polymer/polymer/commit/d45dd575))
+
+- Add note about pre v3 releases ([commit](https://github.com/Polymer/polymer/commit/f9391618))
+
+- Add note for npm package ([commit](https://github.com/Polymer/polymer/commit/8f2cc0d5))
+
+- Add iron-component-page dev-dependency ([commit](https://github.com/Polymer/polymer/commit/d93dd1ce))
+
+- Update several gulp dependencies ([commit](https://github.com/Polymer/polymer/commit/ca57a1f3))
+
+- Update dom5 to 3.0.0 ([commit](https://github.com/Polymer/polymer/commit/d4a0914e))
+
+- Update Google Closure Compiler version and fix cast ([commit](https://github.com/Polymer/polymer/commit/4004c9c4))
+
+- Update types ([commit](https://github.com/Polymer/polymer/commit/bb61a20d))
+
+- Fix several issues in the documentation of dom-* elements ([commit](https://github.com/Polymer/polymer/commit/8e1b3f45))
+
+- Handle `disabled` attribute correctly for tap gesture ([commit](https://github.com/Polymer/polymer/commit/5c0f3e6a))
+
+- add test case for nested label ([commit](https://github.com/Polymer/polymer/commit/c11c99b2))
+
+- Add docs and cleanup matchingLabels ([commit](https://github.com/Polymer/polymer/commit/e1df1662))
+
+- Add tests ([commit](https://github.com/Polymer/polymer/commit/70edf1f8))
+
+- update types ([commit](https://github.com/Polymer/polymer/commit/2d674e75))
+
+- fix tests and add dependency import ([commit](https://github.com/Polymer/polymer/commit/a37ba7e2))
+
+- fix typings ([commit](https://github.com/Polymer/polymer/commit/8f8135b2))
+
+- Ensure DisableUpgradeMixin extends PropertiesMixin ([commit](https://github.com/Polymer/polymer/commit/7e74e363))
+
+- Format comment and remove deduping mixin ([commit](https://github.com/Polymer/polymer/commit/b8c66ded))
+
+- update types ([commit](https://github.com/Polymer/polymer/commit/1fd5f9cf))
+
+- update types ([commit](https://github.com/Polymer/polymer/commit/5bc45ce3))
+
+- Add mixin to automatically detect capitalized HTML attributes ([commit](https://github.com/Polymer/polymer/commit/37fd5ffe))
+
+- Add instructions for locally viewing the source documentation ([commit](https://github.com/Polymer/polymer/commit/206d3610))
+
+- Simplify condition checking in stylesFromModule function ([commit](https://github.com/Polymer/polymer/commit/e6903821))
+
+- Bump type generator and generate new typings. (#5119) ([commit](https://github.com/Polymer/polymer/commit/5c027309))
+
+- dispatchEvent returns boolean (#5117) ([commit](https://github.com/Polymer/polymer/commit/9d86135c))
+
+- Update types ([commit](https://github.com/Polymer/polymer/commit/63e7bbc7))
+
+- Fix license links ([commit](https://github.com/Polymer/polymer/commit/f3939875))
+
+- Fix issue with not genering the Templatizer docs ([commit](https://github.com/Polymer/polymer/commit/55708acf))
+
+- Bump TS type generator to pick up transitive mixin handling. ([commit](https://github.com/Polymer/polymer/commit/c3dad540))
+
+- Remove unnecessary mutableData property from MutableData mixin ([commit](https://github.com/Polymer/polymer/commit/92b83249))
+
+- Update types ([commit](https://github.com/Polymer/polymer/commit/868fba7c))
+
+- Add note to updateStyles regarding updates to CSS mixins ([commit](https://github.com/Polymer/polymer/commit/d458bab3))
+
+- Avoid timing issues with polyfilled Promise ([commit](https://github.com/Polymer/polymer/commit/6b3e007e))
+
+- Revert use of async/await due to lack of build/serve support. ([commit](https://github.com/Polymer/polymer/commit/d4a7a45b))
+
+- Revert types. ([commit](https://github.com/Polymer/polymer/commit/dea90802))
+
+- Update eslint parserOptions to es2017 for async/await support. ([commit](https://github.com/Polymer/polymer/commit/ef579e29))
+
+- Use stronger check for PropertyEffects clients. Fixes #5017 ([commit](https://github.com/Polymer/polymer/commit/e6d558ec))
+
+- Remove unneeded file ([commit](https://github.com/Polymer/polymer/commit/a5393b6d))
+
+- [PropertiesChanged]: allow old data to be gc'd after `_propertiesChanged` ([commit](https://github.com/Polymer/polymer/commit/74907b9a))
+
+- Update package-lock.json ([commit](https://github.com/Polymer/polymer/commit/c58f3e0d))
+
+- Make Travis update-types failure style the same as the elements. ([commit](https://github.com/Polymer/polymer/commit/8189382d))
+
+- Bump TypeScript generator version. ([commit](https://github.com/Polymer/polymer/commit/3e432190))
+
+- Make EventApi.path EventTarget type non-nullable. ([commit](https://github.com/Polymer/polymer/commit/3ede9b51))
+
+- Lint and type fixes ([commit](https://github.com/Polymer/polymer/commit/5607a2d8))
+
+- [PropertiesChanged]: adds _shouldPropertiesChange ([commit](https://github.com/Polymer/polymer/commit/c1885a6a))
+
+- Update docs: templatize() cannot be called multiple times ([commit](https://github.com/Polymer/polymer/commit/27fc21c5))
+
+- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/65b4df86))
+
+- Update types. ([commit](https://github.com/Polymer/polymer/commit/c3b6236a))
+
+- Fix JSDoc example formatting ([commit](https://github.com/Polymer/polymer/commit/699cd87f))
+
+- Use latest webcomponents polyfill bundle ([commit](https://github.com/Polymer/polymer/commit/8fef6776))
+
+- Fix label tap by checking matched label pairs ([commit](https://github.com/Polymer/polymer/commit/a77d64e5))
+
+- Defer creation related work via `disable-upgrade` ([commit](https://github.com/Polymer/polymer/commit/a7eb9754))
+
+- lint fixes ([commit](https://github.com/Polymer/polymer/commit/de0ac5a2))
+
+- Adds `Polymer.DisableUpgradeMixin` ([commit](https://github.com/Polymer/polymer/commit/62ce3148))
+
+## [v2.5.0](https://github.com/Polymer/polymer/tree/v2.5.0) (2018-02-02)
+- Update types ([commit](https://github.com/Polymer/polymer/commit/5fa059fa))
+
+- Update JSDocs to use <dom-repeat> tags ([commit](https://github.com/Polymer/polymer/commit/636abae0))
+
+- Fix type declarations inadvertedtly referencing Polymer.Element. (#5084) ([commit](https://github.com/Polymer/polymer/commit/82cd3dad))
+
+- Use class syntax in <dom-repeat> documentation (#5077) ([commit](https://github.com/Polymer/polymer/commit/97837c7c))
+
+- Add hash/abs URL resolution tests. ([commit](https://github.com/Polymer/polymer/commit/d97373dd))
+
+- Update types. ([commit](https://github.com/Polymer/polymer/commit/892df3f3))
+
+- Add comments about resolveUrl idiosyncrasies. ([commit](https://github.com/Polymer/polymer/commit/a829cbce))
+
+- Revert "Move absolute url logic to element-mixin" ([commit](https://github.com/Polymer/polymer/commit/127bc866))
+
+- Added Polymer.version to polymer-externs (#5079) ([commit](https://github.com/Polymer/polymer/commit/b52ab81d))
+
+- Avoid tracking parentNode since it's unncessary ([commit](https://github.com/Polymer/polymer/commit/1463e3b2))
+
+- Update types. ([commit](https://github.com/Polymer/polymer/commit/2253e0db))
+
+- Fix nit. ([commit](https://github.com/Polymer/polymer/commit/c9208fd6))
+
+- Avoid comment constructor for IE support. ([commit](https://github.com/Polymer/polymer/commit/a39cfd11))
+
+- Disallow non-templates as interpolations in Polymer.html (#5023) ([commit](https://github.com/Polymer/polymer/commit/eeb71600))
+
+- Exclude index.html from type generation. (#5076) ([commit](https://github.com/Polymer/polymer/commit/6fc285c4))
+
+- update types ([commit](https://github.com/Polymer/polymer/commit/5521e43e))
+
+- [element-mixin] Do not create property accessors unless a property effect exists ([commit](https://github.com/Polymer/polymer/commit/4177d9ce))
+
+- Use containers for testing again (#5070) ([commit](https://github.com/Polymer/polymer/commit/5e2990e3))
+
+- Invoke JS compiler rename for properties ([commit](https://github.com/Polymer/polymer/commit/74a4626a))
+
+- Add package-lock.json back ([commit](https://github.com/Polymer/polymer/commit/c90eeb67))
+
+- fix test. ([commit](https://github.com/Polymer/polymer/commit/1c74ecde))
+
+- Enhance robustness by replacing slot with a comment ([commit](https://github.com/Polymer/polymer/commit/b76d81ee))
+
+- Avoid use of element accessors on doc frag to fix IE/Edge. ([commit](https://github.com/Polymer/polymer/commit/ecb1005e))
+
+- Fix linter errors ([commit](https://github.com/Polymer/polymer/commit/5e0bee77))
+
+- Fix issue with observers being called twice ([commit](https://github.com/Polymer/polymer/commit/291e4f56))
+
+- Revert package-lock change ([commit](https://github.com/Polymer/polymer/commit/86ecd982))
+
+- [ci-skip] Update changelog (2.4.0) ([commit](https://github.com/Polymer/polymer/commit/cb88252d))
+
+- Add package-lock.json to .gitignore ([commit](https://github.com/Polymer/polymer/commit/e53db30f))
+
+- Update types ([commit](https://github.com/Polymer/polymer/commit/7a52cda2))
+
+- Add comments re: instanceProps ([commit](https://github.com/Polymer/polymer/commit/cf5f818e))
+
+- Change if-condition to check for arguments.length ([commit](https://github.com/Polymer/polymer/commit/27750109))
+
+- Delete package-lock.json ([commit](https://github.com/Polymer/polymer/commit/e77149e2))
+
+- [ci skip] Fix test case name ([commit](https://github.com/Polymer/polymer/commit/eee609d4))
+
+- Fix issue where el.splice could not clear full array ([commit](https://github.com/Polymer/polymer/commit/a51de9e3))
+
+- Make owner optional as well. ([commit](https://github.com/Polymer/polymer/commit/b52c315e))
+
+- Update package-lock.json ([commit](https://github.com/Polymer/polymer/commit/38c0e443))
+
+- Update typescript types again, after fixing jsdoc. ([commit](https://github.com/Polymer/polymer/commit/3045e4b7))
+
+- Fix lint warnings. ([commit](https://github.com/Polymer/polymer/commit/715cde47))
+
+- Update typescript types. ([commit](https://github.com/Polymer/polymer/commit/c218ae62))
+
+- Ensure path notifications from templatized instances don't throw. Fixes #3422 ([commit](https://github.com/Polymer/polymer/commit/a9f71bd1))
+
+- Allow templatizer to be used without owner or host prop forwarding. Fixes #4458 ([commit](https://github.com/Polymer/polymer/commit/bde5898e))
+
+- Templatize: remove slots when hiding children ([commit](https://github.com/Polymer/polymer/commit/ea0abb95))
+
+- Clarify API docs for PropertyAccessors mixin ([commit](https://github.com/Polymer/polymer/commit/ae58e88b))
+
+## [v2.4.0](https://github.com/Polymer/polymer/tree/v2.4.0) (2018-01-26)
+- Simplify code for <dom-repeat>'s `sort` and `filter` properties ([commit](https://github.com/Polymer/polymer/commit/88cca860))
+
+- fix test for normal escaping ([commit](https://github.com/Polymer/polymer/commit/5fa02aa2))
+
+- Use javascript string escaping in Polymer.html ([commit](https://github.com/Polymer/polymer/commit/4c662141))
+
+- [ci skip] Add CODEOWNERS file (#5061) ([commit](https://github.com/Polymer/polymer/commit/90199f3b))
+
+- Fix incorrect path modification in dom-repeat __handleObservedPaths() (#4983) (#5048) ([commit](https://github.com/Polymer/polymer/commit/4b58f54b))
+
+- Skip certain tests in Edge 16 ([commit](https://github.com/Polymer/polymer/commit/09897d18))
+
+- add Edge 16 testing ([commit](https://github.com/Polymer/polymer/commit/36fa08ae))
+
+- Fix tests (#5050) ([commit](https://github.com/Polymer/polymer/commit/ecd1ba3a))
+
+- Update to latest wct. ([commit](https://github.com/Polymer/polymer/commit/a85ff3fc))
+
+- HTTPS, please ([commit](https://github.com/Polymer/polymer/commit/c868575c))
+
+- Remove unnecessary limit check ([commit](https://github.com/Polymer/polymer/commit/5fb9c559))
+
+- Fix documentation in typescript ([commit](https://github.com/Polymer/polymer/commit/bc95c5ad))
+
+- test(logging): improve _log with single parameter with sinon.spy ([commit](https://github.com/Polymer/polymer/commit/9891f31a))
+
+- Add article "a" ([commit](https://github.com/Polymer/polymer/commit/cefdaa93))
+
+- Update mixinBehaviors annotation. Behaviors don't satisfy PolymerInit. (#5036) ([commit](https://github.com/Polymer/polymer/commit/d7ea2464))
+
+- add correct return type for `querySelectorAll` (#5034) ([commit](https://github.com/Polymer/polymer/commit/6ab5c4a4))
+
+- Gestures: fall back to event.target when composedPath is empty. (#5029) ([commit](https://github.com/Polymer/polymer/commit/98b5aadc))
+
+- add void return type annotations (#5000) ([commit](https://github.com/Polymer/polymer/commit/589684a5))
+
+- Easy script to update closure and typescript typings (#5026) ([commit](https://github.com/Polymer/polymer/commit/60e7121d))
+
+- Prefer jsBin since glitch.me requires signin to not be gc'ed. ([commit](https://github.com/Polymer/polymer/commit/e7722243))
+
+- Note that glitch editing environment is not IE11 friendly. ([commit](https://github.com/Polymer/polymer/commit/06ca708b))
+
+- Add links to glitch.me template using polyserve. Fixes #5016 ([commit](https://github.com/Polymer/polymer/commit/9f2ec5f6))
+
+- Update .travis.yml ([commit](https://github.com/Polymer/polymer/commit/9715ab8f))
+
+- [ci skip] Add comment to aid archeology ([commit](https://github.com/Polymer/polymer/commit/e76a2b90))
+
+- Move absolute url logic to element-mixin ([commit](https://github.com/Polymer/polymer/commit/9c189ac9))
+
+- Use double tabs ([commit](https://github.com/Polymer/polymer/commit/6f7b8608))
+
+- indentation fix ([commit](https://github.com/Polymer/polymer/commit/5dca5cd0))
+
+- Remove trailing spaces and extra lines in CONTRIBUTING.md ([commit](https://github.com/Polymer/polymer/commit/8ed376e6))
+
+- test(logging.html): #5007 make sure _logger called one time ([commit](https://github.com/Polymer/polymer/commit/fe48dfa4))
+
+- _loggertest(logging.html): make seperate test suite for _logger ([commit](https://github.com/Polymer/polymer/commit/bd5821b6))
+
+- test(logging.html): missing semicolon ([commit](https://github.com/Polymer/polymer/commit/df3c3c02))
+
+- test(logging): _log with single parameter #5007 ([commit](https://github.com/Polymer/polymer/commit/818c537d))
+
+- fix(legacy-element-mixin): syntax error in _logger ([commit](https://github.com/Polymer/polymer/commit/e0affe3f))
+
+- fix(legacy-element-mixin): _log with single parameter #5006 ([commit](https://github.com/Polymer/polymer/commit/f4ecbae5))
+
+- Fix settings so that its properly picked up by both gen-ts and modulizer ([commit](https://github.com/Polymer/polymer/commit/0356b2df))
+
+- Unbreak the build by changing back the type ([commit](https://github.com/Polymer/polymer/commit/d5dc2a21))
+
+- Enable gulp generate-typescript on Travis ([commit](https://github.com/Polymer/polymer/commit/764146cd))
+
+- Make sure that Travis fails when there are non-updated generated files ([commit](https://github.com/Polymer/polymer/commit/b2cd4370))
+
+- run `gulp generate-typescript` ([commit](https://github.com/Polymer/polymer/commit/541d1f89))
+
+- fix ArraySplice types to more closely match code ([commit](https://github.com/Polymer/polymer/commit/f6182b34))
+
+- [ProperitesChanged] Fix deserialization (#4996) ([commit](https://github.com/Polymer/polymer/commit/2719a9d6))
+
+- fix(FlattenedNodesObserver): do not fail on node without children ([commit](https://github.com/Polymer/polymer/commit/09bb6cd8))
+
+- Address latest round of comments. ([commit](https://github.com/Polymer/polymer/commit/7b581de9))
+
+- Update PropertyEffects interface name in remap config. ([commit](https://github.com/Polymer/polymer/commit/0ebfc24d))
+
+- Tighten more types for TypeScript and Closure (#4998) ([commit](https://github.com/Polymer/polymer/commit/e8729822))
+
+- Add renameTypes config. ([commit](https://github.com/Polymer/polymer/commit/73666c39))
+
+- New typings. ([commit](https://github.com/Polymer/polymer/commit/a1f33174))
+
+- Bump gen-typescript version. ([commit](https://github.com/Polymer/polymer/commit/266d599a))
+
+- Tighten Closure type annotations. (#4997) ([commit](https://github.com/Polymer/polymer/commit/ee4445f8))
+
+- Mark some FlattenedNodesObserver things private. ([commit](https://github.com/Polymer/polymer/commit/5190a89c))
+
+- Add TypeScript equivalent to Closure ITemplateArray. ([commit](https://github.com/Polymer/polymer/commit/a77310af))
+
+- Fix compilation errors. ([commit](https://github.com/Polymer/polymer/commit/f0e31f2d))
+
+- Use glob patterns instead of RegExps to exclude files. ([commit](https://github.com/Polymer/polymer/commit/8f8e54ca))
+
+- Bump version of gen-typescript-declarations. ([commit](https://github.com/Polymer/polymer/commit/cf11a826))
+
+- Handle case where there are no elements in the template ([commit](https://github.com/Polymer/polymer/commit/2d6b4684))
+
+- Update various Polymer annotations to constrain generated types. ([commit](https://github.com/Polymer/polymer/commit/ffc35e48))
+
+- Fix typo in comment ([commit](https://github.com/Polymer/polymer/commit/ade5e796))
+
+- Fix regression with imported css ([commit](https://github.com/Polymer/polymer/commit/706e6021))
+
+- Bring in latest gen-typescript-declarations updates. ([commit](https://github.com/Polymer/polymer/commit/6a0d214d))
+
+- Apply `listeners` in constructor rather than `ready` ([commit](https://github.com/Polymer/polymer/commit/35e3c54b))
+
+- Replace `disconnectedCallback` stub since this change is breaking. ([commit](https://github.com/Polymer/polymer/commit/c8acc183))
+
+- Minor fixes ([commit](https://github.com/Polymer/polymer/commit/1b514b4f))
+
+- Fix html-tag import path. ([commit](https://github.com/Polymer/polymer/commit/c9be530d))
+
+- Update CHANGELOG. ([commit](https://github.com/Polymer/polymer/commit/3ffb895e))
+
+- Fix import path for html-tag. ([commit](https://github.com/Polymer/polymer/commit/eb309934))
+
+- Add generated TypeScript declarations. ([commit](https://github.com/Polymer/polymer/commit/60450bf4))
+
+- Add script to generate TypeScript declarations. ([commit](https://github.com/Polymer/polymer/commit/1f9be786))
+
+- Annotate klass class as @private. Annotate that dedupingMixin returns T. ([commit](https://github.com/Polymer/polymer/commit/b02c4583))
+
+- fix eslint error for unused var in _setPendingProperty ([commit](https://github.com/Polymer/polymer/commit/a89c9ba0))
+
+- fix closure typing with Polymer.html function ([commit](https://github.com/Polymer/polymer/commit/c519796f))
+
+- re-add AsyncInterface definition, fix comment ([commit](https://github.com/Polymer/polymer/commit/986fb3e9))
+
+- Avoid _setPendingProperty warning due to types not understanding deduping mixin. ([commit](https://github.com/Polymer/polymer/commit/40d47f24))
+
+- [ci skip] Update changelog ([commit](https://github.com/Polymer/polymer/commit/f6cc61bd))
+
+- add test for legacy Polymer({}) elements ([commit](https://github.com/Polymer/polymer/commit/8a1c76cd))
+
+- Rename html-fn to html-tag ([commit](https://github.com/Polymer/polymer/commit/02c06aa3))
+
+- Fix most closure warnings. ([commit](https://github.com/Polymer/polymer/commit/a12934c5))
+
+- Add back disconnectedCallback. ([commit](https://github.com/Polymer/polymer/commit/fa40f205))
+
+- Merge with master ([commit](https://github.com/Polymer/polymer/commit/b158e082))
+
+- Move function out of closure. Add comments. ([commit](https://github.com/Polymer/polymer/commit/ad539fe7))
+
+- [ci skip] TODO for link to docs and comment spellcheck ([commit](https://github.com/Polymer/polymer/commit/5c919850))
+
+- Use values.reduce instead of a temporary array ([commit](https://github.com/Polymer/polymer/commit/be9d6210))
+
+- Add deprecation notice for class.template returning a string ([commit](https://github.com/Polymer/polymer/commit/530a68b4))
+
+- [skip-ci] update comment for Polymer.html ([commit](https://github.com/Polymer/polymer/commit/bdfa5fcb))
+
+- remove null/undefined to empty string ([commit](https://github.com/Polymer/polymer/commit/75d873a0))
+
+- Address feedback ([commit](https://github.com/Polymer/polymer/commit/d5070bbe))
+
+- `html` tag function for generating templates ([commit](https://github.com/Polymer/polymer/commit/1bba3abb))
+
+- Add example for flattened-nodes-observer ([commit](https://github.com/Polymer/polymer/commit/08ad6e37))
+
+- Minor updates based on review. ([commit](https://github.com/Polymer/polymer/commit/ed1454d6))
+
+- Use correct assertation. ([commit](https://github.com/Polymer/polymer/commit/4692510f))
+
+- Add tests for non-JSON literals on object props. ([commit](https://github.com/Polymer/polymer/commit/7d49e803))
+
+- Remove PropertiesElement in favor of PropertiesMixin. ([commit](https://github.com/Polymer/polymer/commit/40f02ea1))
+
+- FIx typo ([commit](https://github.com/Polymer/polymer/commit/8af14800))
+
+- Skip test in old browsers. ([commit](https://github.com/Polymer/polymer/commit/a1bd9a4f))
+
+- Remove `propertyNameForAttribute` since it's never needed. ([commit](https://github.com/Polymer/polymer/commit/8d57a6e9))
+
+- Fix subclassing and simplify. ([commit](https://github.com/Polymer/polymer/commit/e09285db))
+
+- Move property<->attribute case mapping to PropertiesChanged. ([commit](https://github.com/Polymer/polymer/commit/603123e1))
+
+- Allow non-JSON literals when property type is "Object". ([commit](https://github.com/Polymer/polymer/commit/77b17b43))
+
+- Update tests ([commit](https://github.com/Polymer/polymer/commit/82cf96bb))
+
+- [PropertiesMixin] Fix mapping property names from attributes ([commit](https://github.com/Polymer/polymer/commit/feac9328))
+
+- Add test for observing id attribute. ([commit](https://github.com/Polymer/polymer/commit/c56f74f9))
+
+- Cleanup based on review. ([commit](https://github.com/Polymer/polymer/commit/4b9170ab))
+
+- Fix deserializing dates. ([commit](https://github.com/Polymer/polymer/commit/8d24c212))
+
+- Factoring improvements around attribute serialize/deserialize ([commit](https://github.com/Polymer/polymer/commit/a7b46b15))
+
+- Remove crufty comment. ([commit](https://github.com/Polymer/polymer/commit/fb0f90bc))
+
+- Lint fix ([commit](https://github.com/Polymer/polymer/commit/e8c27671))
+
+- Add tests for setting custom `attribute` name ([commit](https://github.com/Polymer/polymer/commit/1e903a94))
+
+- Expose less protected data. ([commit](https://github.com/Polymer/polymer/commit/74fb5151))
+
+- ElementMixin uses PropertiesMixin for ([commit](https://github.com/Polymer/polymer/commit/0fe9434f))
+
+- PropertiesMixin ([commit](https://github.com/Polymer/polymer/commit/3c50f44a))
+
+- PropertyAccessors ([commit](https://github.com/Polymer/polymer/commit/5846d582))
+
+- PropertiesChanged ([commit](https://github.com/Polymer/polymer/commit/05cb5d2c))
+
+- Force literal true` to be set as an attribute with a value of empty string. ([commit](https://github.com/Polymer/polymer/commit/1b501944))
+
+- Better attribute suppport ([commit](https://github.com/Polymer/polymer/commit/c91b9d19))
+
+- fix some formatting and closure linting ([commit](https://github.com/Polymer/polymer/commit/5ae21a08))
+
+- Lint fixes. ([commit](https://github.com/Polymer/polymer/commit/946aad5c))
+
+- Renamed basic element to properties element ([commit](https://github.com/Polymer/polymer/commit/e3e128ba))
+
+- Implement `basic-element` with `properties-changed` ([commit](https://github.com/Polymer/polymer/commit/d26955b4))
+
+- Fix lint issues ([commit](https://github.com/Polymer/polymer/commit/b8fd241a))
+
+- Improve docs and add test for case conversion. ([commit](https://github.com/Polymer/polymer/commit/152f896f))
+
+- Add test to runner. ([commit](https://github.com/Polymer/polymer/commit/dcdb750b))
+
+- Adds `Polymer.BasicElement` ([commit](https://github.com/Polymer/polymer/commit/717a4f41))
+
+- Factor PropertiesChanged out of PropertyAccessors ([commit](https://github.com/Polymer/polymer/commit/aa4f186e))
+
+- Add `accessor` property to properties object ([commit](https://github.com/Polymer/polymer/commit/c7b43f78))
+
+- Factor to treeshake better ([commit](https://github.com/Polymer/polymer/commit/e91b6a75))
+
+## [v2.3.1](https://github.com/Polymer/polymer/tree/v2.3.1) (2017-12-07)
+- Add test that would fail with the "last style" behavior in master ([commit](https://github.com/Polymer/polymer/commit/913dfce6))
+
+- Use padding-top to get correct computed style on older safari ([commit](https://github.com/Polymer/polymer/commit/b7c56173))
+
+- Handle styles that are not direct children of templates correctly ([commit](https://github.com/Polymer/polymer/commit/0b1cd70a))
+
+- [ci skip] update changelog again ([commit](https://github.com/Polymer/polymer/commit/2d739c75))
+
+## [v2.3.0](https://github.com/Polymer/polymer/tree/v2.3.0) (2017-12-05)
+- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/c727d35d))
+
+## [v2.2.1](https://github.com/Polymer/polymer/tree/v2.2.1) (2017-12-05)
+- [ci skip] commit new version in lib/utils/boot.html when using npm version ([commit](https://github.com/Polymer/polymer/commit/71fbf6ef))
+
+- change PolymerElement extern to var ([commit](https://github.com/Polymer/polymer/commit/5c3d58aa))
+
+- update node devDependencies ([commit](https://github.com/Polymer/polymer/commit/a39f3f41))
+
+- fix lint error ([commit](https://github.com/Polymer/polymer/commit/f242e197))
+
+- Fix :dir selectors with nested custom elements ([commit](https://github.com/Polymer/polymer/commit/3b76e86f))
+
+- Update test to be more descriptive ([commit](https://github.com/Polymer/polymer/commit/86a64b6c))
+
+- Annotate Polymer function with @global. (#4967) ([commit](https://github.com/Polymer/polymer/commit/b124b707))
+
+- make PASSIVE_TOUCH take an argument ([commit](https://github.com/Polymer/polymer/commit/c5407a8b))
+
+- Do not set touchend listeners to passive ([commit](https://github.com/Polymer/polymer/commit/84fa3bf3))
+
+- Add some @function annotations to APIs that are defined by assignment. ([commit](https://github.com/Polymer/polymer/commit/29f2a0e7))
+
+- add return jsdoc to void functions ([commit](https://github.com/Polymer/polymer/commit/a8105e55))
+
+- Update CONTRIBUTING.md ([commit](https://github.com/Polymer/polymer/commit/14fd53c3))
+
+- Fix typo. ([commit](https://github.com/Polymer/polymer/commit/581483f2))
+
+- Comment reworded based on feedback. ([commit](https://github.com/Polymer/polymer/commit/80a7f1e5))
+
+- Semantic issue (proposal) plus minor fixes ([commit](https://github.com/Polymer/polymer/commit/42ec14bf))
+
+- Depend on webcomponents and shadycss with shady-unscoped support ([commit](https://github.com/Polymer/polymer/commit/8241b887))
+
+- Also clarify `delay` units. Fixes #4707 ([commit](https://github.com/Polymer/polymer/commit/348ed92c))
+
+- Ensure re-sort/filter always happens after array item set. Fixes #3626 ([commit](https://github.com/Polymer/polymer/commit/f6d4771c))
+
+- Clarify docs on target-framerate. Fixes #4897 ([commit](https://github.com/Polymer/polymer/commit/c18a5349))
+
+- move test after ([commit](https://github.com/Polymer/polymer/commit/45598302))
+
+- test more permutations ([commit](https://github.com/Polymer/polymer/commit/f03e8d1b))
+
+- Fix missing comma in `Path.translate` JSDoc ([commit](https://github.com/Polymer/polymer/commit/41616c6f))
+
+- fix(bower): standardized version tagging (#4921) ([commit](https://github.com/Polymer/polymer/commit/6e3ae2e5))
+
+- Minor fixes (update URLs) ([commit](https://github.com/Polymer/polymer/commit/8e7024e6))
+
+- add license headers ([commit](https://github.com/Polymer/polymer/commit/518b4699))
+
+- Prep for processing of `shady-unscoped` moving to ShadyCSS ([commit](https://github.com/Polymer/polymer/commit/08c3a02e))
+
+- Implement type change in Polymer.ElementMixin ([commit](https://github.com/Polymer/polymer/commit/cda62d5f))
+
+- instance.$.foo should only give Elements ([commit](https://github.com/Polymer/polymer/commit/4837e4a8))
+
+- Annotate DomApi with @memberof Polymer ([commit](https://github.com/Polymer/polymer/commit/7308d8b6))
+
+- Clarify all elements between changes must apply mixing. Fixes #4914 ([commit](https://github.com/Polymer/polymer/commit/7360f42a))
+
+- add safari 11 to sauce testing ([commit](https://github.com/Polymer/polymer/commit/428ad8c2))
+
+- Fix tests on Firefox. ([commit](https://github.com/Polymer/polymer/commit/9a468335))
+
+- Update externs again. ([commit](https://github.com/Polymer/polymer/commit/1c5b731f))
+
+- Update externs. ([commit](https://github.com/Polymer/polymer/commit/8683b27c))
+
+- Lint fixes ([commit](https://github.com/Polymer/polymer/commit/092b210f))
+
+- Allow style elements to be separate in the element template. ([commit](https://github.com/Polymer/polymer/commit/819652eb))
+
+- Lint fix. ([commit](https://github.com/Polymer/polymer/commit/982d28c6))
+
+- Add support for styles with a `shady-unscoped` attribute ([commit](https://github.com/Polymer/polymer/commit/d77e073e))
+
+- [ci skip] Update CHANGELOG ([commit](https://github.com/Polymer/polymer/commit/314bada5))
+
+- [ci skip] version script did not work as expected ([commit](https://github.com/Polymer/polymer/commit/4265cba1))
+
+- adding test case for 4696 4706 ([commit](https://github.com/Polymer/polymer/commit/939ce63c))
+
+- Support property observers which are direct function references in addition to strings. Provides better static analysis and refactoring support in multiple tools. Alleviates the need for property reflection with Closure-compiler renaming. ([commit](https://github.com/Polymer/polymer/commit/4bae2b62))
+
+- removing package-lock.json from PR ([commit](https://github.com/Polymer/polymer/commit/0da00a1d))
+
+- implementing the code review suggestions ([commit](https://github.com/Polymer/polymer/commit/1b51f601))
+
+- Updating deserialize function (use of ternary operation). Fixes #4696 ([commit](https://github.com/Polymer/polymer/commit/ca139ed0))
+
+- Updating deserialize function. Fixes #4696 ([commit](https://github.com/Polymer/polymer/commit/277ca89a))
+
+## [v2.2.0](https://github.com/Polymer/polymer/tree/v2.2.0) (2017-10-18)
+- [ci skip] Autoupdate version when releasing ([commit](https://github.com/Polymer/polymer/commit/d893d6ae))
+
+- add edge 15, use chrome stable ([commit](https://github.com/Polymer/polymer/commit/c6f2d817))
+
+- super it and put back takeRecords ([commit](https://github.com/Polymer/polymer/commit/02e2f148))
+
+- more feedback ([commit](https://github.com/Polymer/polymer/commit/15cbdff5))
+
+- Address feedback ([commit](https://github.com/Polymer/polymer/commit/e71b84a8))
+
+- add some description of the dir mixin ([commit](https://github.com/Polymer/polymer/commit/f98ad117))
+
+- Fix linting ([commit](https://github.com/Polymer/polymer/commit/624189a3))
+
+- Always do the :dir transform ([commit](https://github.com/Polymer/polymer/commit/31c0ebc7))
+
+- Clean up closure externs ([commit](https://github.com/Polymer/polymer/commit/1e5ea942))
+
+- remove bogus semicolon ([commit](https://github.com/Polymer/polymer/commit/7d044b49))
+
+- Declare Polymer.Templatizer directly, for Closure. (#4870) ([commit](https://github.com/Polymer/polymer/commit/3b155173))
+
+- First draft of a `:dir` aware element mixin ([commit](https://github.com/Polymer/polymer/commit/2ef65aa6))
+
+- [ci-skip] Update CHANGELOG ([commit](https://github.com/Polymer/polymer/commit/28e60271))
+
+## [v2.1.1](https://github.com/Polymer/polymer/tree/v2.1.1) (2017-09-28)
+- Prepare for release 2.1.1 ([commit](https://github.com/Polymer/polymer/commit/f049dd91))
+
+- Move @externs before @license because Closure likes that. ([commit](https://github.com/Polymer/polymer/commit/c3f31455))
+
+- just move the style instead ([commit](https://github.com/Polymer/polymer/commit/61b2c8a5))
+
+- Copy <custom-style> styles to main document ([commit](https://github.com/Polymer/polymer/commit/155ab8a2))
+
+- Fix typos and jsdoc (#4846) ([commit](https://github.com/Polymer/polymer/commit/b19e180a))
+
+- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/44fd1eaa))
+
+- Fix shady dom style querySelector ([commit](https://github.com/Polymer/polymer/commit/d5b6bad3))
+
+- Fix linter error ([commit](https://github.com/Polymer/polymer/commit/2da30c33))
+
+- Exclude script and style tags for parsing bindings ([commit](https://github.com/Polymer/polymer/commit/41fa90b3))
+
+- Special-case undefined textarea.value same as input. Fixes #4630 ([commit](https://github.com/Polymer/polymer/commit/8aa201b9))
+
+## [v2.1.0](https://github.com/Polymer/polymer/tree/v2.1.0) (2017-09-19)
+- [ci skip] bump version to 2.1.0 ([commit](https://github.com/Polymer/polymer/commit/64788aad))
+
+- Port #3844 to 2.x ([commit](https://github.com/Polymer/polymer/commit/00bc76e4))
+
+- Provide a `Polymer.setPassiveTouchGestures()` function ([commit](https://github.com/Polymer/polymer/commit/3547fd37))
+
+- Make sure closure types have braces ([commit](https://github.com/Polymer/polymer/commit/fb8039e0))
+
+- a few more comments in return ([commit](https://github.com/Polymer/polymer/commit/f6f0a3b7))
+
+- Fix setting, add smoke test ([commit](https://github.com/Polymer/polymer/commit/6312da57))
+
+- Optional passive touch listeners for gestures ([commit](https://github.com/Polymer/polymer/commit/5f7597f7))
+
+- Don't have `return /** comment */` lines ([commit](https://github.com/Polymer/polymer/commit/c802b8b2))
+
+- [ci skip] disable closure lint for now (travis java errors) ([commit](https://github.com/Polymer/polymer/commit/e45e5bba))
+
+- try to avoid introducing spelling errors in changelogs ([commit](https://github.com/Polymer/polymer/commit/7616e3c9))
+
+- spelling: webcomponents ([commit](https://github.com/Polymer/polymer/commit/70504627))
+
+- spelling: veiling ([commit](https://github.com/Polymer/polymer/commit/43f6b971))
+
+- spelling: unnecessary ([commit](https://github.com/Polymer/polymer/commit/dc0573f8))
+
+- spelling: toolkit ([commit](https://github.com/Polymer/polymer/commit/42edf634))
+
+- spelling: together ([commit](https://github.com/Polymer/polymer/commit/7d6e4351))
+
+- spelling: there-when ([commit](https://github.com/Polymer/polymer/commit/240701ec))
+
+- spelling: theming ([commit](https://github.com/Polymer/polymer/commit/d991cce1))
+
+- spelling: supported ([commit](https://github.com/Polymer/polymer/commit/4a2e7750))
+
+- spelling: stylesheet ([commit](https://github.com/Polymer/polymer/commit/d138df3c))
+
+- spelling: static ([commit](https://github.com/Polymer/polymer/commit/4354e710))
+
+- spelling: sometimes ([commit](https://github.com/Polymer/polymer/commit/802817dc))
+
+- spelling: shuffling ([commit](https://github.com/Polymer/polymer/commit/93a18c58))
+
+- spelling: returns ([commit](https://github.com/Polymer/polymer/commit/3f744c3c))
+
+- spelling: restart ([commit](https://github.com/Polymer/polymer/commit/58111054))
+
+- spelling: responsive ([commit](https://github.com/Polymer/polymer/commit/d1da7314))
+
+- spelling: resilient ([commit](https://github.com/Polymer/polymer/commit/d45855d9))
+
+- spelling: resetting ([commit](https://github.com/Polymer/polymer/commit/8fb47431))
+
+- spelling: reentrancy ([commit](https://github.com/Polymer/polymer/commit/5ea03d60))
+
+- spelling: readonly ([commit](https://github.com/Polymer/polymer/commit/ff294a90))
+
+- spelling: prototype ([commit](https://github.com/Polymer/polymer/commit/bbe54cc2))
+
+- spelling: protocols ([commit](https://github.com/Polymer/polymer/commit/83df6dad))
+
+- spelling: properties ([commit](https://github.com/Polymer/polymer/commit/bb74d2da))
+
+- spelling: preferring ([commit](https://github.com/Polymer/polymer/commit/00e0567e))
+
+- spelling: polyfill ([commit](https://github.com/Polymer/polymer/commit/ce0ca630))
+
+- spelling: parameterize ([commit](https://github.com/Polymer/polymer/commit/141cefe3))
+
+- spelling: omit ([commit](https://github.com/Polymer/polymer/commit/e3b04e51))
+
+- spelling: offset ([commit](https://github.com/Polymer/polymer/commit/ea0acb0d))
+
+- spelling: notification ([commit](https://github.com/Polymer/polymer/commit/ee741143))
+
+- spelling: name ([commit](https://github.com/Polymer/polymer/commit/159803a7))
+
+- spelling: multiple ([commit](https://github.com/Polymer/polymer/commit/602ee780))
+
+- spelling: loaded ([commit](https://github.com/Polymer/polymer/commit/f4529864))
+
+- spelling: jquery ([commit](https://github.com/Polymer/polymer/commit/88ce972d))
+
+- spelling: javascript ([commit](https://github.com/Polymer/polymer/commit/f1f7f669))
+
+- spelling: instead ([commit](https://github.com/Polymer/polymer/commit/c4be7f60))
+
+- spelling: initial ([commit](https://github.com/Polymer/polymer/commit/3862ce0a))
+
+- spelling: increments ([commit](https://github.com/Polymer/polymer/commit/8bda7f93))
+
+- spelling: identify ([commit](https://github.com/Polymer/polymer/commit/17678e1a))
+
+- spelling: github ([commit](https://github.com/Polymer/polymer/commit/0781b322))
+
+- spelling: getting ([commit](https://github.com/Polymer/polymer/commit/c1d7c3e8))
+
+- spelling: function ([commit](https://github.com/Polymer/polymer/commit/b9b22854))
+
+- spelling: falsy ([commit](https://github.com/Polymer/polymer/commit/d472919a))
+
+- spelling: enqueuing ([commit](https://github.com/Polymer/polymer/commit/96c8ed81))
+
+- spelling: element ([commit](https://github.com/Polymer/polymer/commit/d4e54c72))
+
+- spelling: effective ([commit](https://github.com/Polymer/polymer/commit/139edd00))
+
+- spelling: doesn't ([commit](https://github.com/Polymer/polymer/commit/aa35d779))
+
+- spelling: does ([commit](https://github.com/Polymer/polymer/commit/01f943d9))
+
+- spelling: disappearing ([commit](https://github.com/Polymer/polymer/commit/508c005a))
+
+- spelling: deserialized ([commit](https://github.com/Polymer/polymer/commit/2acbf5df))
+
+- spelling: customize ([commit](https://github.com/Polymer/polymer/commit/0a0ac248))
+
+- spelling: containing ([commit](https://github.com/Polymer/polymer/commit/2b09e75c))
+
+- spelling: components ([commit](https://github.com/Polymer/polymer/commit/e11d4d6b))
+
+- spelling: collection ([commit](https://github.com/Polymer/polymer/commit/38645c08))
+
+- spelling: children ([commit](https://github.com/Polymer/polymer/commit/c30c5d03))
+
+- spelling: changed ([commit](https://github.com/Polymer/polymer/commit/1579bf36))
+
+- spelling: behavior ([commit](https://github.com/Polymer/polymer/commit/65f27655))
+
+- spelling: attribute ([commit](https://github.com/Polymer/polymer/commit/d8f3f57d))
+
+- spelling: attached ([commit](https://github.com/Polymer/polymer/commit/adc4f0e1))
+
+- spelling: asynchronous ([commit](https://github.com/Polymer/polymer/commit/6c59f53b))
+
+- Explicitly set display none on dom-* elements (#4821) ([commit](https://github.com/Polymer/polymer/commit/65859b1c))
+
+- Publish DomBind in Polymer. scope ([commit](https://github.com/Polymer/polymer/commit/60054350))
+
+- Fix missing semi-colons in test folder ([commit](https://github.com/Polymer/polymer/commit/72a59f77))
+
+- Enable ESLint 'semi' rule ([commit](https://github.com/Polymer/polymer/commit/75c6fff7))
+
+- [ci skip] update package-lock ([commit](https://github.com/Polymer/polymer/commit/ca1ce196))
+
+- [ci skip] Add license headers to externs ([commit](https://github.com/Polymer/polymer/commit/f4a9e06e))
+
+- Polymer.Path.get accepts both a string path or an Array path, so functions that call this should allow for either as well. Already changed for Polymer.prototype.push here: ([commit](https://github.com/Polymer/polymer/commit/42ce5a88))
+
+- lint with closure as well ([commit](https://github.com/Polymer/polymer/commit/cc649e97))
+
+- Update closure compiler to support polymer pass v2 ([commit](https://github.com/Polymer/polymer/commit/a4591abc))
+
+- Revert "Adds `restamp` mode to dom-repeat." ([commit](https://github.com/Polymer/polymer/commit/d439960a))
+
+- Add test to verify that importHref can be called twice ([commit](https://github.com/Polymer/polymer/commit/6ce904b3))
+
+- Fix compiling with Polymer({}) calls ([commit](https://github.com/Polymer/polymer/commit/d937d5fe))
+
+- Remove double space ([commit](https://github.com/Polymer/polymer/commit/bbf0e7c8))
+
+- Add development workflow-related files to gitignore (#4612) ([commit](https://github.com/Polymer/polymer/commit/d5c2629f))
+
+- Allow arbitrary whitespace in CSS imports ([commit](https://github.com/Polymer/polymer/commit/5c250d44))
+
+- Fix dom-module API docs with static `import` function ([commit](https://github.com/Polymer/polymer/commit/9f7df4cf))
+
+- [ci skip] update externs more from #4776 ([commit](https://github.com/Polymer/polymer/commit/c20b6574))
+
+- imported css modules should always be before element's styles ([commit](https://github.com/Polymer/polymer/commit/679a49e4))
+
+- Update closure annotation for Polymer.prototype.push ([commit](https://github.com/Polymer/polymer/commit/eb170cbb))
+
+- Fixed formatting. ([commit](https://github.com/Polymer/polymer/commit/48fac922))
+
+- Fix formatting of code in API docs (#4771) ([commit](https://github.com/Polymer/polymer/commit/eb406c71))
+
+- Lint clean. ([commit](https://github.com/Polymer/polymer/commit/4095e12d))
+
+- Separate scripts that modify configuration properties, as their ordering constraints are unusual. ([commit](https://github.com/Polymer/polymer/commit/49dbacb6))
+
+- test: convert XNestedRepeat to use an inlined string template. ([commit](https://github.com/Polymer/polymer/commit/c89155ba))
+
+- Don't rely on implicitly creating a global, does not. ([commit](https://github.com/Polymer/polymer/commit/28ed27e0))
+
+- Refer to Gestures.recognizers consistently. ([commit](https://github.com/Polymer/polymer/commit/3555b458))
+
+- Make test work in strict mode. ([commit](https://github.com/Polymer/polymer/commit/328ce594))
+
+- In tests, explicitly write to window when creating a new global for clarity. ([commit](https://github.com/Polymer/polymer/commit/674d4685))
+
+- [ci skip] remove duplicate definition for __dataHost in externs ([commit](https://github.com/Polymer/polymer/commit/5ab9032c))
+
+- [ci skip] update polymer-build and run-sequence ([commit](https://github.com/Polymer/polymer/commit/0c6aa882))
+
+- Fix tests in non-Chrome browsers ([commit](https://github.com/Polymer/polymer/commit/5a54c32b))
+
+- Better distinguish param name from namespaced name ([commit](https://github.com/Polymer/polymer/commit/a3d6e56b))
+
+- use wct 6 npm package ([commit](https://github.com/Polymer/polymer/commit/fbe8dcc4))
+
+- add mixin class instance properties to externs ([commit](https://github.com/Polymer/polymer/commit/34d22acd))
+
+- Add sanitizeDOMValue to settings.html ([commit](https://github.com/Polymer/polymer/commit/4d730e16))
+
+- Remove reference to Polymer._toOverride, it seems like an incomplete feature/part of the test. ([commit](https://github.com/Polymer/polymer/commit/981a7600))
+
+- Update custom-style API doc ([commit](https://github.com/Polymer/polymer/commit/52a7328e))
+
+- Use customElements.get rather than referring to the global for Polymer.DomModule ([commit](https://github.com/Polymer/polymer/commit/bb202378))
+
+- Add import of dom-module to file that uses it. ([commit](https://github.com/Polymer/polymer/commit/dbedcfc0))
+
+- Do not assign to a readonly property on window ([commit](https://github.com/Polymer/polymer/commit/b64e4862))
+
+- [ci skip] Fix documentation in PropertyAccessors ([commit](https://github.com/Polymer/polymer/commit/0f695d90))
+
+- [ci skip] fix closure warning ([commit](https://github.com/Polymer/polymer/commit/2e7dc00b))
+
+- Fix event path for tap event on touch ([commit](https://github.com/Polymer/polymer/commit/50bf45c3))
+
+- [ci skip] Update changelog ([commit](https://github.com/Polymer/polymer/commit/466624ae))
+
+- Update web-component-tester to stable version ([commit](https://github.com/Polymer/polymer/commit/ae78564c))
+
+- Disable closure linting until the count is driven down to a reasonable level ([commit](https://github.com/Polymer/polymer/commit/6335b24f))
+
+- Adds `restamp` mode to dom-repeat. ([commit](https://github.com/Polymer/polymer/commit/6cebeace))
+
+## [v2.0.2](https://github.com/Polymer/polymer/tree/v2.0.2) (2017-07-14)
+- remove broken npm script ([commit](https://github.com/Polymer/polymer/commit/27c67125))
+
+- depend on webcomponentsjs 1.0.2 ([commit](https://github.com/Polymer/polymer/commit/d522de0f))
+
+- cleanup and update npm dependencies ([commit](https://github.com/Polymer/polymer/commit/4176c6c2))
+
+- Update LegacyElementMixin.distributeContent ([commit](https://github.com/Polymer/polymer/commit/2daf9de2))
+
+- Remove crufty test ([commit](https://github.com/Polymer/polymer/commit/c96350b4))
+
+- [ci skip] remove one new closure warning for updating closure ([commit](https://github.com/Polymer/polymer/commit/0cb560a4))
+
+- Meaningful closure fixes from @ChadKillingsworth ([commit](https://github.com/Polymer/polymer/commit/88043077))
+
+- [ci skip] clean up mixin fn and regen externs ([commit](https://github.com/Polymer/polymer/commit/72022f27))
+
+- address some concerns from kschaaf ([commit](https://github.com/Polymer/polymer/commit/44653813))
+
+- zero warnings left ([commit](https://github.com/Polymer/polymer/commit/3e14a1d8))
+
+- [ci skip] Fix link closing quotes. ([commit](https://github.com/Polymer/polymer/commit/d1ad0c33))
+
+- Remove @suppress {missingProperties} ([commit](https://github.com/Polymer/polymer/commit/2efccb95))
+
+- Annotate Debouncer summary. (#4691) ([commit](https://github.com/Polymer/polymer/commit/806119ae))
+
+- Fix typo in templatize.html ([commit](https://github.com/Polymer/polymer/commit/de181d6e))
+
+- Move Debouncer memberof annotation to right place, and add a summary. (#4690) ([commit](https://github.com/Polymer/polymer/commit/77f06712))
+
+- remove PolymerPropertyEffects type, inline DataTrigger and DataEffect types ([commit](https://github.com/Polymer/polymer/commit/7612df67))
+
+- remove polymer-element dependency introduced by a merge conflict ([commit](https://github.com/Polymer/polymer/commit/3b7eedb8))
+
+- update closure log ([commit](https://github.com/Polymer/polymer/commit/344ebb4c))
+
+- remove dommodule imports ([commit](https://github.com/Polymer/polymer/commit/fc886306))
+
+- Create style-gather.html ([commit](https://github.com/Polymer/polymer/commit/73fbbb45))
+
+- README: fix typo ([commit](https://github.com/Polymer/polymer/commit/5355252a))
+
+- Remove unused `__needFullRefresh` ([commit](https://github.com/Polymer/polymer/commit/bdbbfa19))
+
+- Fixes #4650: if an observed path changes, the repeat should render but in addition, the path should be notified. This is necessary since “mutableData” is optional. ([commit](https://github.com/Polymer/polymer/commit/22d27aa0))
+
+- last two stragglers ([commit](https://github.com/Polymer/polymer/commit/9bd89203))
+
+- fix eslint warnings ([commit](https://github.com/Polymer/polymer/commit/ba720124))
+
+- Down to 30ish warnings, need PolymerPass v2 ([commit](https://github.com/Polymer/polymer/commit/de87c585))
+
+- Add lib/utils/settings.html to hold legacy settings and rootPath ([commit](https://github.com/Polymer/polymer/commit/3183e3f7))
+
+- Fix typo in dom-repeat.html ([commit](https://github.com/Polymer/polymer/commit/d6941a34))
+
+- guard all dommodule references ([commit](https://github.com/Polymer/polymer/commit/c3866a59))
+
+- add more missing imports ([commit](https://github.com/Polymer/polymer/commit/8c71456d))
+
+- Add mixin.html import to gesture-event-listeners.html ([commit](https://github.com/Polymer/polymer/commit/352dc33a))
+
+- more fixes ([commit](https://github.com/Polymer/polymer/commit/872e1c27))
+
+- rebaseline warnings with NTI specific warnings disabled, for now ([commit](https://github.com/Polymer/polymer/commit/abc229e5))
+
+- Fix parsing for argument whitespace. Fixes #4643. ([commit](https://github.com/Polymer/polymer/commit/a29d8876))
+
+- Upgrade babel-preset-babili to include RegExp fix from https://github.com/babel/babili/pull/490 ([commit](https://github.com/Polymer/polymer/commit/308cae6e))
+
+- Not an RC anymore ([commit](https://github.com/Polymer/polymer/commit/8290002b))
+
+- Just ensure content frag from _contentForTemplate is inert. Edge does not seem to always use the exact same owner document for templates. ([commit](https://github.com/Polymer/polymer/commit/b73caea0))
+
+- Fix typo in prop of FlattenedNodesObserver ([commit](https://github.com/Polymer/polymer/commit/57fe7dca))
+
+- [ci skip] Update Changelog ([commit](https://github.com/Polymer/polymer/commit/e03b2cce))
+
+- Fix some ElementMixin warnings. ([commit](https://github.com/Polymer/polymer/commit/c0a816f6))
+
+- Fix template.assetpath with typedef ([commit](https://github.com/Polymer/polymer/commit/ec3e948d))
+
+- fix dom-module related errors ([commit](https://github.com/Polymer/polymer/commit/07443645))
+
+- Fix fn binding error ([commit](https://github.com/Polymer/polymer/commit/bc504f64))
+
+- Reduce closure warnings in PropertyAccessors ([commit](https://github.com/Polymer/polymer/commit/3591be8b))
+
+- reduce closure warnings in TemplateStamp ([commit](https://github.com/Polymer/polymer/commit/c34ef0b2))
+
+- [ci skip] parameterize entries for closure task ([commit](https://github.com/Polymer/polymer/commit/3a80ad8f))
+
+- [ci skip] generating externs should be explicit ([commit](https://github.com/Polymer/polymer/commit/a8a57bf5))
+
+- Avoid firstElementChild on DocFrag for IE11 ([commit](https://github.com/Polymer/polymer/commit/02e31d78))
+
+- update externs for merge, update dependencies ([commit](https://github.com/Polymer/polymer/commit/e927bc9a))
+
+- Fix impl of _contentForTemplate. Add template-stamp tests. Fixes #4597 ([commit](https://github.com/Polymer/polymer/commit/06190c9d))
+
+- ensure latest closure, stay on polymer-build 1.1 until warnings can be ignored ([commit](https://github.com/Polymer/polymer/commit/7abd7037))
+
+- @mixes -> @appliesMixin ([commit](https://github.com/Polymer/polymer/commit/1f21ab1a))
+
+- @polymerMixin/@polymerMixinClass -> @mixinFunction/@mixinClass ([commit](https://github.com/Polymer/polymer/commit/f7e8021e))
+
+- @polymerElement -> @customElement/@polymer ([commit](https://github.com/Polymer/polymer/commit/231b21c0))
+
+- fix lint error ([commit](https://github.com/Polymer/polymer/commit/e5de1782))
+
+- remove all "global this" warnings ([commit](https://github.com/Polymer/polymer/commit/c0ddc60b))
+
+- remove `TemplateStamp`’s implicit dependency on `_initializeProperties` ([commit](https://github.com/Polymer/polymer/commit/f821e46a))
+
+- fix typing for Polymer.Element ([commit](https://github.com/Polymer/polymer/commit/0b152938))
+
+- inline cachingMixin into deduplicatingMixin ([commit](https://github.com/Polymer/polymer/commit/c3da5073))
+
+- initialize properties in `_initializeProperties` rather than `constructor` (allows work to be done before `_initializeProperties` and is needed for proto/instance property initialization . ([commit](https://github.com/Polymer/polymer/commit/f15e4ee6))
+
+- LegacyElementMixin to `@unrestricted` ([commit](https://github.com/Polymer/polymer/commit/c1eda7af))
+
+- set `isAttached` constructor (for closure) but set to undefined so not picked up as proto property (avoids initial binding value) ([commit](https://github.com/Polymer/polymer/commit/6a995a23))
+
+- Fix dedupingMixin ([commit](https://github.com/Polymer/polymer/commit/2c9ffac3))
+
+- Fix more closure warnings ([commit](https://github.com/Polymer/polymer/commit/f04d6311))
+
+- Fix more closure warnings ([commit](https://github.com/Polymer/polymer/commit/d0f78122))
+
+- Fix more closure warnings. ([commit](https://github.com/Polymer/polymer/commit/0c3e3c5f))
+
+- Fix more closure warnings. ([commit](https://github.com/Polymer/polymer/commit/b686cd77))
+
+- Fix more closure warnings. ([commit](https://github.com/Polymer/polymer/commit/0b22959f))
+
+- Fix more closure warnings. ([commit](https://github.com/Polymer/polymer/commit/2627e63a))
+
+- slighly better typing for mixin function ([commit](https://github.com/Polymer/polymer/commit/b3dfd38e))
+
+- gesture fixes ([commit](https://github.com/Polymer/polymer/commit/346e2d57))
+
+- Fix more closure warnings. ([commit](https://github.com/Polymer/polymer/commit/fa9823f7))
+
+- Fix some closure warnings. ([commit](https://github.com/Polymer/polymer/commit/f1a14982))
+
+- Fix some closure warnings. ([commit](https://github.com/Polymer/polymer/commit/51855541))
+
+- automate generating closure externs ([commit](https://github.com/Polymer/polymer/commit/89b12301))
+
+- Fix some closure warnings. ([commit](https://github.com/Polymer/polymer/commit/37abc4e3))
+
+- fix some closure warnings. ([commit](https://github.com/Polymer/polymer/commit/80f54421))
+
+## [v2.0.1](https://github.com/Polymer/polymer/tree/v2.0.1) (2017-05-25)
+- [ci skip] Prepare 2.0.1 ([commit](https://github.com/Polymer/polymer/commit/061b1048))
+
+- Improve comment more ([commit](https://github.com/Polymer/polymer/commit/39877086))
+
+- Improve comment ([commit](https://github.com/Polymer/polymer/commit/fa1469a9))
+
+- Add comment. ([commit](https://github.com/Polymer/polymer/commit/250067b3))
+
+- * Improve clarity: change `__dataInitialized` to `__dataReady` * When `_flushClients` is called, ensure that clients are always enabled or flushed as appropriate. This ensures that (1) clients that are enabled before the host is enabled flush properly, and (2) clients that are stamped but not enabled properly enable when the host flushes. ([commit](https://github.com/Polymer/polymer/commit/8e8692f7))
+
+- Fix typo in runBindingEffect documentation ([commit](https://github.com/Polymer/polymer/commit/6bd8dcfa))
+
+- Fixes #4601. Client elements can be readied that have already enabled properties. This can happen when templatize is used to create instances with no properties. In this case, in order for properties to flush properly to clients, clients must be flushed. ([commit](https://github.com/Polymer/polymer/commit/06df53d9))
+
+- [ci skip] Update Changelog ([commit](https://github.com/Polymer/polymer/commit/c4e516f6))
+
+## [v2.0.0](https://github.com/Polymer/polymer/tree/v2.0.0) (2017-05-15)
+- [ci skip] bump version to 2.0.0 ([commit](https://github.com/Polymer/polymer/commit/712230fc))
+
+- [ci skip] Update Changelog ([commit](https://github.com/Polymer/polymer/commit/21ee3b4d))
+
+## [v2.0.0-rc.9](https://github.com/Polymer/polymer/tree/v2.0.0-rc.9) (2017-05-12)
+- [ci skip] Add alacarte usage smoke tests. ([commit](https://github.com/Polymer/polymer/commit/e54bc5f8))
+
+- [skip ci] doc fixes ([commit](https://github.com/Polymer/polymer/commit/b943aa0d))
+
+- Docs and slight renaming. ([commit](https://github.com/Polymer/polymer/commit/4eb252fe))
+
+- Add tests. ([commit](https://github.com/Polymer/polymer/commit/1f83fd7c))
+
+- Move hostStack to property-effects and make readyClients explicit ([commit](https://github.com/Polymer/polymer/commit/c7a81ea8))
+
+- Turn on accessors (via __dataInitialized) only after clients have completely flushed. ([commit](https://github.com/Polymer/polymer/commit/2f1e964c))
+
+- Adds `_enableProperties` as a new entry point that must be called to turn on properties. Prevents a bug where `_readyClients` can be called twice. ([commit](https://github.com/Polymer/polymer/commit/c6f9b315))
+
+- [ci skip] Fix doc createPropertyEffect -> addPropertyEffect ([commit](https://github.com/Polymer/polymer/commit/90e8cd95))
+
+- [ci skip] Update Changelog ([commit](https://github.com/Polymer/polymer/commit/448149d2))
+
+## [v2.0.0-rc.8](https://github.com/Polymer/polymer/tree/v2.0.0-rc.8) (2017-05-11)
+- Add test for boolean dynamicFn ([commit](https://github.com/Polymer/polymer/commit/03d21ce8))
+
+- Accept boolean or object map for dynamicFns ([commit](https://github.com/Polymer/polymer/commit/f197ce24))
+
+- update dependencies for v1 polyfills ([commit](https://github.com/Polymer/polymer/commit/d9b5b8f9))
+
+- Null the links when unbinding. ([commit](https://github.com/Polymer/polymer/commit/42230437))
+
+- Dedupe API docs. ([commit](https://github.com/Polymer/polymer/commit/e97a6eb7))
+
+- Move setup to suiteSetup ([commit](https://github.com/Polymer/polymer/commit/d5b282fa))
+
+- Uncomment previous tests ([commit](https://github.com/Polymer/polymer/commit/55b2d160))
+
+- Add tests ([commit](https://github.com/Polymer/polymer/commit/0f4ebf62))
+
+- [ci skip] port gen-changelog from 1.x ([commit](https://github.com/Polymer/polymer/commit/24dd897d))
+
+- Add static API for creating property fx and minor code refactoring. ([commit](https://github.com/Polymer/polymer/commit/7497065a))
+
+- [ci skip] remove bower.json version, add npm devDependencies & np publish config ([commit](https://github.com/Polymer/polymer/commit/6b6092e0))
+
+- Fix comment. ([commit](https://github.com/Polymer/polymer/commit/6f1dde76))
+
+- Fixes #4585. Data notifications do not flush host if host has not initialized clients. This preserves the Polymer 1.x guarantee that client dom is fully “readied” when data observers run. ([commit](https://github.com/Polymer/polymer/commit/3b6981d4))
+
+- Ensure no warnings for dynamic fns. Fixes #4575 ([commit](https://github.com/Polymer/polymer/commit/d72baf9d))
+
+- Corrected minor Method comments ([commit](https://github.com/Polymer/polymer/commit/8a2aeb65))
+
+- Removes the `disable-upgrade` feature from Polymer 2.0. Due to #4550, the feature has a flaw for native ES6 classes and would be better implemented as either a mixin or patch to `customElements.define`. ([commit](https://github.com/Polymer/polymer/commit/972b2bab))
+
+- Fix jsBin link. ([commit](https://github.com/Polymer/polymer/commit/811c334e))
+
+- Ensure tags in markdown are backtracked. Short-term stopgap to ensure they are not rendered in HTML. ([commit](https://github.com/Polymer/polymer/commit/e90ef30d))
+
+- Clean up gulpfile ([commit](https://github.com/Polymer/polymer/commit/764448c9))
+
+- bump wct version ([commit](https://github.com/Polymer/polymer/commit/bafa1ecd))
+
+- Disabling `lint-closure` until the error count is driven to 0 ([commit](https://github.com/Polymer/polymer/commit/c98e3799))
+
+- fix test failures on safari 9 and chrome 41 w/focus event ([commit](https://github.com/Polymer/polymer/commit/0b00f2d9))
+
+- update debounce example. ([commit](https://github.com/Polymer/polymer/commit/5be7ec99))
+
+- Fixes #4553, #4554 ([commit](https://github.com/Polymer/polymer/commit/36792f94))
+
+- save closure warnings to "closure.log" file ([commit](https://github.com/Polymer/polymer/commit/25cfc882))
+
+- use shadycss externs directly, now only 498 warnings ([commit](https://github.com/Polymer/polymer/commit/c21a63db))
+
+- add gulp task to lint for closure warnings ([commit](https://github.com/Polymer/polymer/commit/4e782741))
+
+## [v2.0.0-rc.7](https://github.com/Polymer/polymer/tree/v2.0.0-rc.7) (2017-04-19)
+- Add more tests. ([commit](https://github.com/Polymer/polymer/commit/73df8c5b))
+
+- Update jsBin template for 2.0 ([commit](https://github.com/Polymer/polymer/commit/4a2db9ca))
+
+- [ci skip] Update link to jsBin template for 2.0. ([commit](https://github.com/Polymer/polymer/commit/0aeb3170))
+
+- Move computeLinkedPaths out of hot path and into sync setter. ([commit](https://github.com/Polymer/polymer/commit/d722cb9c))
+
+- [ci skip] Add note re: purpose of test ([commit](https://github.com/Polymer/polymer/commit/7ecbf258))
+
+- Fix test for fallback \_readyClients. Fixes #4547 ([commit](https://github.com/Polymer/polymer/commit/85184e8b))
+
+- Process paths regardless of accessor, & loop on computeLinkedPaths. Fixes #4542 ([commit](https://github.com/Polymer/polymer/commit/e2d17020))
+
+## [v2.0.0-rc.6](https://github.com/Polymer/polymer/tree/v2.0.0-rc.6) (2017-04-17)
+- [ci skip] Fix API docs ([commit](https://github.com/Polymer/polymer/commit/5a4427bf))
+
+- Guard against overwriting bound values with hasOwnProperty. Fixes #4540 ([commit](https://github.com/Polymer/polymer/commit/4c023740))
+
+- [ci skip] reduce warnings ([commit](https://github.com/Polymer/polymer/commit/00f9e3eb))
+
+- fix globals for goog.reflect.objectProperty -> JSCompiler_renameProperty swap ([commit](https://github.com/Polymer/polymer/commit/8867fde5))
+
+- [ci skip] remove outdated externs file ([commit](https://github.com/Polymer/polymer/commit/626a085d))
+
+- lint and compile successfully ([commit](https://github.com/Polymer/polymer/commit/a2fa1005))
+
+- update dependencies ([commit](https://github.com/Polymer/polymer/commit/36603bc4))
+
+- Rename `setPrivate` -> `setReadOnly` ([commit](https://github.com/Polymer/polymer/commit/521ed3de))
+
+- Add `setPrivate` arg to `setProperties` ([commit](https://github.com/Polymer/polymer/commit/e6e4803f))
+
+- Never accidental test change ([commit](https://github.com/Polymer/polymer/commit/28c15caa))
+
+- Remove unused @method ([commit](https://github.com/Polymer/polymer/commit/6d636138))
+
+- Standardize @return, @param, type case. ([commit](https://github.com/Polymer/polymer/commit/8cab18b1))
+
+- Fix jsdoc warnings. ([commit](https://github.com/Polymer/polymer/commit/dab794b2))
+
+- jsdoc fixes. ([commit](https://github.com/Polymer/polymer/commit/38a13f66))
+
+- Fix jsdoc issues. ([commit](https://github.com/Polymer/polymer/commit/86d2eebc))
+
+- Fix jsdoc issues. ([commit](https://github.com/Polymer/polymer/commit/8a11c8c3))
+
+- Enable error on jsdoc mistake. ([commit](https://github.com/Polymer/polymer/commit/72a454e9))
+
+- fix @license comments & shadycss imports. Remove custom style from externs ([commit](https://github.com/Polymer/polymer/commit/59350ad4))
+
+- closure advanced compilation ([commit](https://github.com/Polymer/polymer/commit/eea1ca23))
+
+## [v2.0.0-rc.5](https://github.com/Polymer/polymer/tree/v2.0.0-rc.5) (2017-04-13)
+- Eliminate rest args for better perf on stable chrome. ([commit](https://github.com/Polymer/polymer/commit/fa67457c))
+
+- Fix perf regressions. ([commit](https://github.com/Polymer/polymer/commit/86e35e3a))
+
+- Move second tap test to the correct spot. ([commit](https://github.com/Polymer/polymer/commit/6e4b87c1))
+
+- Add GestureEventListeners to dom-bind. ([commit](https://github.com/Polymer/polymer/commit/4f628fd9))
+
+- Add more comments ([commit](https://github.com/Polymer/polymer/commit/d0bd96d4))
+
+- [ci skip] Fix comment. ([commit](https://github.com/Polymer/polymer/commit/becd1d3b))
+
+- alias another way ([commit](https://github.com/Polymer/polymer/commit/d297047e))
+
+- use chrome beta ([commit](https://github.com/Polymer/polymer/commit/0724f187))
+
+- Add more HTMLImports.whenReady ([commit](https://github.com/Polymer/polymer/commit/bc713187))
+
+- Address feedback from review: * Refactor `_bindTemplate` to remove problematic `hasCreatedAccessors` * Remove vestigial `dom` from `_bindTemplate` call * Rename `_unstampTemplate` to `_removeBoundDom` * Add `infoIndex` to `nodeInfo` (and renamed parent & index) * Add test to ensure runtime accessors created for new props in runtime stamped template * Changed custom binding test to use different prop names * Added test for #first count after removing bound dom ([commit](https://github.com/Polymer/polymer/commit/b9fafb7e))
+
+- Fix lint error. ([commit](https://github.com/Polymer/polymer/commit/dff5f2bc))
+
+- Ensure prototype wasn't affected by runtime effects. ([commit](https://github.com/Polymer/polymer/commit/bf2dbe0a))
+
+- Add tests for adding/removing runtime property effects. ([commit](https://github.com/Polymer/polymer/commit/14711067))
+
+- Added tests for custom parsing, effects, and binding. ([commit](https://github.com/Polymer/polymer/commit/1cf955b9))
+
+- Add initial runtime stamping tests. ([commit](https://github.com/Polymer/polymer/commit/eb6ab63e))
+
+- Fix changelog generation ([commit](https://github.com/Polymer/polymer/commit/8c103d98))
+
+- Address feedback based on review. * PropertyAccessors must call `_flushProperties` to enable * Avoid tearing off oldProps (unnecessary) * Add `addBinding` docs * Merge notifyListeners into `setupBindings` * Add comment re: path-bindings not being overridable * Remove `dom` argument from `_bindTemplate` * Rename `_stampBoundTemplate` back to `_stampTemplate` ([commit](https://github.com/Polymer/polymer/commit/6af84c45))
+
+- Put $ on dom, and assign to element as needed. Eliminate _templateInfo reference. ([commit](https://github.com/Polymer/polymer/commit/03bed19d))
+
+- Fix _hasAccessor for readOnly. Collapse addBinding & addBindingEffects ([commit](https://github.com/Polymer/polymer/commit/396c102c))
+
+- Improvements to binding API: - Adds override points for _parseBindings and _evaluateBinding - Adds support for runtime template binding - Moves ready(), _hasAccessor tracking, and instance property swizzle at ready time to PropertyAccessors ([commit](https://github.com/Polymer/polymer/commit/ea4e7d97))
+
+## [v2.0.0-rc.4](https://github.com/Polymer/polymer/tree/v2.0.0-rc.4) (2017-04-12)
+- fix lint error ([commit](https://github.com/Polymer/polymer/commit/e397c434))
+
+- Only style elements with templates ([commit](https://github.com/Polymer/polymer/commit/2356f7b8))
+
+- [ci skip] note safari bugs ([commit](https://github.com/Polymer/polymer/commit/ef90168b))
+
+- Various Safari 10.1 fixes ([commit](https://github.com/Polymer/polymer/commit/dea052a2))
+
+- Add `@memberof` annotation for Polymer.Debouncer ([commit](https://github.com/Polymer/polymer/commit/352878d5))
+
+- Import mutable-data.html in dom-bind ([commit](https://github.com/Polymer/polymer/commit/bbc0373c))
+
+- Correct changelog version title ([commit](https://github.com/Polymer/polymer/commit/9555ca34))
+
+- Fix readme. ([commit](https://github.com/Polymer/polymer/commit/bbfea905))
+
+- tighten up custom-style-late test ([commit](https://github.com/Polymer/polymer/commit/2106f656))
+
+- Fixes #4478 by adding a better warning for attributes that cannot deserialize from JSON. ([commit](https://github.com/Polymer/polymer/commit/dba28c06))
+
+- Adds back the `beforeRegister` method. Users can no longer set the `is` property in this method; however, dynamic property effects can still be installed here. ([commit](https://github.com/Polymer/polymer/commit/7639cf81))
+
+- Fixes #4447. Re-introduce the `hostStack` in order to maintain “client before host” ordering when `_flushProperties` is called before `connectedCallback` (e.g. as Templatize does). ([commit](https://github.com/Polymer/polymer/commit/8467a696))
+
+- Fix custom-style-late tests ([commit](https://github.com/Polymer/polymer/commit/caafef79))
+
+- Add test for ensuring complicated mixin ordering is correct ([commit](https://github.com/Polymer/polymer/commit/6d663354))
+
+- move lazy-upgrade out to separate mixins repo ([commit](https://github.com/Polymer/polymer/commit/deb5a9a5))
+
+- Only check bounding client rect on clicks that target elements ([commit](https://github.com/Polymer/polymer/commit/af37d04c))
+
+- Adds tests from https://github.com/Polymer/polymer/pull/4099. The other changes from the PR are no longer needed. ([commit](https://github.com/Polymer/polymer/commit/c5710666))
+
+- clean up code, factor processing lazy candidates, better docs ([commit](https://github.com/Polymer/polymer/commit/189a2083))
+
+- Update templatize.html ([commit](https://github.com/Polymer/polymer/commit/2abfe09e))
+
+- Doc fix (correct callback name) ([commit](https://github.com/Polymer/polymer/commit/57d22f4c))
+
+- Fixed templatize typo ([commit](https://github.com/Polymer/polymer/commit/b6b43f36))
+
+- Work around IE/Edge bug with :not([attr]) selectors ([commit](https://github.com/Polymer/polymer/commit/c3036232))
+
+- Remove support for lazy-upgrade inside dom-if and dom-repeat ([commit](https://github.com/Polymer/polymer/commit/1b4a9781))
+
+- Fix image in README ([commit](https://github.com/Polymer/polymer/commit/b860594a))
+
+- Remove useless id check on mixins ([commit](https://github.com/Polymer/polymer/commit/8c1a5765))
+
+- move dom-change listener for lazy-upgrade before `super.ready()` ([commit](https://github.com/Polymer/polymer/commit/ba60b820))
+
+- [ci skip] Update doc ([commit](https://github.com/Polymer/polymer/commit/f87790d6))
+
+- [ci skip] Update doc ([commit](https://github.com/Polymer/polymer/commit/b9774801))
+
+- Add API docs. ([commit](https://github.com/Polymer/polymer/commit/1eb0df49))
+
+- nodeInfo -> nodeInfoList ([commit](https://github.com/Polymer/polymer/commit/eed67504))
+
+- Updates based on PR feedback. API docs in progress. ([commit](https://github.com/Polymer/polymer/commit/627352db))
+
+- * ensure element cannot return to “disabled” state after upgrading. * ensure nested `beforeNextRender` calls always go before the next render * ensure nested `afterNextRender` are called after additional renders ([commit](https://github.com/Polymer/polymer/commit/e9c58add))
+
+- Fixes #4437. Ensure `_registered` is called 1x for each element class using `LegacyElementMixin`. Ensure that a behaviors’s `registered` method is called for any extending class. ([commit](https://github.com/Polymer/polymer/commit/de09d730))
+
+- Separate binding-specific code from template stamp. Expose override points. ([commit](https://github.com/Polymer/polymer/commit/e95afeb1))
+
+- Use webcomponents-lite for test ([commit](https://github.com/Polymer/polymer/commit/50ae3bb7))
+
+- add lazy-upgrade tests ([commit](https://github.com/Polymer/polymer/commit/71b70aaa))
+
+- make a mixin for lazy upgrading ([commit](https://github.com/Polymer/polymer/commit/9891e484))
+
+- implements `disable-upgrade` attribute which prevents readying an element until the attribute is removed. ([commit](https://github.com/Polymer/polymer/commit/a222078e))
+
+## [v2.0.0-rc.3](https://github.com/Polymer/polymer/tree/v2.0.0-rc.3) (2017-03-15)
+- add properties, behaviors, observers, hostAttributes, listeners on prototype ([commit](https://github.com/Polymer/polymer/commit/93cf3246))
+
+- [skip ci] update test comments ([commit](https://github.com/Polymer/polymer/commit/bb52071b))
+
+- better comment ([commit](https://github.com/Polymer/polymer/commit/a081e669))
+
+- get behaviors only from prototypes ([commit](https://github.com/Polymer/polymer/commit/8bac5c60))
+
+- behaviors ONLY on the prototype ([commit](https://github.com/Polymer/polymer/commit/444c043c))
+
+- add instance behaviors ([commit](https://github.com/Polymer/polymer/commit/4bf7bdd7))
+
+- [ci skip] minor doc edits. ([commit](https://github.com/Polymer/polymer/commit/4ae65ba2))
+
+- [ci skip] expand range of dependencies to all rcs ([commit](https://github.com/Polymer/polymer/commit/46c10465))
+
+## [v2.0.0-rc.2](https://github.com/Polymer/polymer/tree/v2.0.0-rc.2) (2017-03-07)
+- another test fix. ([commit](https://github.com/Polymer/polymer/commit/d9418e1a))
+
+- fix behavior warn test. ([commit](https://github.com/Polymer/polymer/commit/4439436f))
+
+- update to latest webcomponents rc. ([commit](https://github.com/Polymer/polymer/commit/46219a39))
+
+- move mutable data mixin to be loaded by polymer.html ([commit](https://github.com/Polymer/polymer/commit/7cebe120))
+
+- Fix 4387. Ensure `dom-change` fired with `composed: true`. ([commit](https://github.com/Polymer/polymer/commit/3e683297))
+
+- Allow hybrid elements (like iron-list) to make template instances with mutable data ([commit](https://github.com/Polymer/polymer/commit/ea392e3f))
+
+- Don't override the goog namespace if it already exists ([commit](https://github.com/Polymer/polymer/commit/b30deb22))
+
+- Use correct version ([commit](https://github.com/Polymer/polymer/commit/3b7d4484))
+
+- Fix spelling error ([commit](https://github.com/Polymer/polymer/commit/c14ea57f))
+
+- [ci skip] Fix note re: transpilation ([commit](https://github.com/Polymer/polymer/commit/8fd1b212))
+
+- [ci skip] Remove obsolete note re: pre-upgrade attribute vs. property priority ([commit](https://github.com/Polymer/polymer/commit/3dd776fe))
+
+- [ci skip] Fix note re: attached ([commit](https://github.com/Polymer/polymer/commit/b67736ec))
+
+- [ci skip] Add back intro README content from 1.x, updated to 2.x syntax. ([commit](https://github.com/Polymer/polymer/commit/1235f449))
+
+## [v2.0.0-rc.1](https://github.com/Polymer/polymer/tree/v2.0.0-rc.1) (2017-03-06)
+
+<!-- the changelog tool broke, so this is ported from https://www.polymer-project.org/2.0/docs/release-notes#v-2-0-0-rc.1 -->
+The following notable changes have been made since the 2.0 Preview announcement.
+
+- The `config` getter on element classes has been replaced by individual `properties` and
+ `observers` getters, more closely resembling the 1.x syntax.
+
+ ```js
+ static get properties() {
+ return {
+ aProp: String,
+ bProp: Number
+ }
+ }
+ static get observers() {
+ return [
+ '_observeStuff(aProp,bProp)'
+ ]
+ }
+ ```
+
+- 1.x-style dirty checking has been reinstated for better performance. An optional mixin is
+ available for elements to skip dirty checking of objects and arrays, which may be more easy to
+ integrate with some state management systems. For details, see
+ [Using the MutableData mixin](devguide/data-system#mutable-data) in Data system concepts.
+
+- Support for dynamically-created `custom-style` elements has been added.
+
+- Support for the external style sheet syntax, `<link rel="import" type="css">` has
+ been added. This was deprecated in 1.x, but will be retained until an alternate solution is
+ available for importing unprocessed CSS.
+
+- New properties `rootPath` and `basePath` were added to `Polymer.Element` to allow authors
+ to configure how URLs are rewritten inside templates. For details, see the
+ [Update URLs in templates](./upgrade#urls-in-templates) in the Upgrade guide.
+
+
+## [v1.9.1-dev](https://github.com/Polymer/polymer/tree/v1.9.1-dev) (2017-04-17)
+- Remove use of ES6 API. ([commit](https://github.com/Polymer/polymer/commit/96010657))
+
+- Remove use of ES6 API. ([commit](https://github.com/Polymer/polymer/commit/646dce69))
+
+- Ensure optimization uses hybrid parentNode ([commit](https://github.com/Polymer/polymer/commit/b7f00992))
+
+- Use local `parentNode` ([commit](https://github.com/Polymer/polymer/commit/2e4290f8))
+
+- Capture hybridDomRepeat. ([commit](https://github.com/Polymer/polymer/commit/ee3b9a69))
+
+- Fix dom-if detachment ([commit](https://github.com/Polymer/polymer/commit/2722532b))
+
+- Add dom-if test for add/remove. ([commit](https://github.com/Polymer/polymer/commit/a2825650))
+
+- Add test for add & remove ([commit](https://github.com/Polymer/polymer/commit/4c87e1d9))
+
+- Add 2.x hybrid affordances for stamping template content. Fixes #4536 ([commit](https://github.com/Polymer/polymer/commit/53053eb4))
+
+- Fix lint ([commit](https://github.com/Polymer/polymer/commit/f29104f2))
+
+- Make tests more strict. ([commit](https://github.com/Polymer/polymer/commit/ea65a6d0))
+
+- Use `_importPath` in `resolveUrl` so it available early. Fixes #4532 ([commit](https://github.com/Polymer/polymer/commit/1a7d3b11))
+
+- [ci skip] update Changelog ([commit](https://github.com/Polymer/polymer/commit/3ce4e176))
+
+## [v1.9.0-dev](https://github.com/Polymer/polymer/tree/v1.9.0-dev) (2017-04-13)
+- [ci skip] skip looking in build log, again ([commit](https://github.com/Polymer/polymer/commit/1d282c7f))
+
+- [ci skip] backport changelog fixes ([commit](https://github.com/Polymer/polymer/commit/d6a7ac71))
+
+- * allow setting `rootPath` * disallow setting `importPath` (this is supported in 2.x but not 1.x) ([commit](https://github.com/Polymer/polymer/commit/ac067652))
+
+- Add `importPath` and `rootPath` to support 2.x hybrid compatible elements. ([commit](https://github.com/Polymer/polymer/commit/daaf460a))
+
+- [ci skip] Update Changelog ([commit](https://github.com/Polymer/polymer/commit/80c899f4))
+
+- Add missing semicolon after variable assignment ([commit](https://github.com/Polymer/polymer/commit/afb21c8f))
+
+- Update PRIMER.md ([commit](https://github.com/Polymer/polymer/commit/4d66a353))
+
+## [v1.8.1-dev](https://github.com/Polymer/polymer/tree/v1.8.1-dev) (2017-02-27)
+- Exclude SD polyfill tests for Edge due to lack of workarounds for Edge DocFrag bugs. ([commit](https://github.com/Polymer/polymer/commit/de45ba02))
+
+- [ci skip] Update comment to include reference to problem browser. ([commit](https://github.com/Polymer/polymer/commit/72f21fe6))
+
+- Check documentElement instead of body to guarantee it's there. ([commit](https://github.com/Polymer/polymer/commit/a0ad3bbe))
+
+- add tests ([commit](https://github.com/Polymer/polymer/commit/20de9287))
+
+- Adds a setting `preserveStyleIncludes` which, when used with a shadow dom targeted css build and native custom properties, will copy styles into the Shadow DOM template rather than collapsing them into a single style. This will (1) allow the browser to optimize parsing of shared styles because they remain intact, (2) reduce the size of the css build resources when shared styles are used since they are not pre-collapsed. This option does perform registration runtime work to add included styles to element templates. ([commit](https://github.com/Polymer/polymer/commit/2315547e))
+
+- Fix test failures by feature detecting instance `properties` accessors. Can't rely on `__proto__` on IE10, but that browser doesn't need to avoid `properties`. ([commit](https://github.com/Polymer/polymer/commit/f2a12cb1))
+
+- Read properties off of proto during configuration. ([commit](https://github.com/Polymer/polymer/commit/a68c0b3e))
+
+- remove cruft. ([commit](https://github.com/Polymer/polymer/commit/632f0e47))
+
+- Ensure disable-upgrade elements are not "configured". Fixes #4302 ([commit](https://github.com/Polymer/polymer/commit/b36915f6))
+
+- change lastresponse to last-response in dom-bind example ([commit](https://github.com/Polymer/polymer/commit/4427b0b6))
+
+- [ci skip] Update Changelog ([commit](https://github.com/Polymer/polymer/commit/2d804a28))
+
+## [v1.8.0-dev](https://github.com/Polymer/polymer/tree/v1.8.0-dev) (2017-02-06)
+- Add comment. ([commit](https://github.com/Polymer/polymer/commit/a42cb209))
+
+- Only keep `disable-upgrade` attribute if it is an attribute binding. ([commit](https://github.com/Polymer/polymer/commit/62e9b84b))
+
+- spacing. ([commit](https://github.com/Polymer/polymer/commit/5030c1b9))
+
+- Update webcomponentsjs dependency ([commit](https://github.com/Polymer/polymer/commit/ca7dbb84))
+
+- Change `isInert` to `disable-upgrade` and feature is now supported only via the `disable-upgrade` attribute. ([commit](https://github.com/Polymer/polymer/commit/f8f903cf))
+
+- Add tests for `is-inert` ([commit](https://github.com/Polymer/polymer/commit/e1561f65))
+
+- Prevent annotator from removing the `is-inert` attribute. ([commit](https://github.com/Polymer/polymer/commit/91925148))
+
+- fixes for users of Polymer.Class ([commit](https://github.com/Polymer/polymer/commit/0f53bef4))
+
+- Add support for `isInert` to allow elements to boot up in an inert state. e.g. `<x-foo is-inert></x-foo>`. Setting `xFoo.isInert = false` causes the element to boot up. ([commit](https://github.com/Polymer/polymer/commit/ca3f59d3))
+
+- Small typos updated ([commit](https://github.com/Polymer/polymer/commit/bc023648))
+
+- work around older firefox handling of the "properties" property on HTMLElement prototype ([commit](https://github.com/Polymer/polymer/commit/13f36c7f))
+
+- improve comments ([commit](https://github.com/Polymer/polymer/commit/c76ba5b9))
+
+- Add comments. Behavior fast copy flag changed to `_noAccessors`. ([commit](https://github.com/Polymer/polymer/commit/52ea6002))
+
+- Fix tests on IE10 and simplify constructor shortcut. ([commit](https://github.com/Polymer/polymer/commit/e588f1f5))
+
+- Make dom-module work on older Safari. ([commit](https://github.com/Polymer/polymer/commit/73b62a63))
+
+- micro-optimizations: (1) favor mixin over extends where possible, (2) unroll behavior lifecycle calls, (3) avoid creating a custom constructor when not used, (4) provide `_skipDefineProperty` setting on behaviors which copies properties via assignment rather than `copyOwnProperty` ([commit](https://github.com/Polymer/polymer/commit/a1c1285d))
+
+- Ensure done. ([commit](https://github.com/Polymer/polymer/commit/08753237))
+
+- Test positive case of suppressBindingNotifications ([commit](https://github.com/Polymer/polymer/commit/1b19b784))
+
+- Add notifyDomBind to dom-bind. ([commit](https://github.com/Polymer/polymer/commit/ad7f91d6))
+
+- Test Polymer.Settings inside test. ([commit](https://github.com/Polymer/polymer/commit/4b286f19))
+
+- Revert unnecessary change. ([commit](https://github.com/Polymer/polymer/commit/dcde6d4c))
+
+- Fix test lint issue. ([commit](https://github.com/Polymer/polymer/commit/26c669ce))
+
+- Add global flags to suppress unnecessary notification events. Fixes #4262. * `Polymer.Settings.suppressTemplateNotifications `- disables `dom-change` and `rendered-item-count` events from `dom-if`, `dom-repeat`, and `don-bind`. Users can opt back into `dom-change` events by setting the `notify-dom-change` attribute (`notifyDomChange: true` property) to `dom-if`/`don-repeat` instances. * `Polymer.Settings.suppressBindingNotifications` - disables notify effects when propagating data downward via bindings. Generally these are never useful unless users are explicitly doing something like `<my-el foo="{{foo}} on-foo-changed="{{handleFoo}}">` or calling `addEventListener('foo-changed', ...)` on an element where `foo` is bound (we attempted to make this the default some time back but needed to revert it when we found via https://github.com/Polymer/polymer/issues/3077 that users were indeed doing this). Users that avoid these patterns can enjoy the potentially significant benefit of suppressing unnecessary events during downward data flow by opting into this flag. ([commit](https://github.com/Polymer/polymer/commit/83e14c43))
+
+- Fix `strip-whitespace` for nested templates. ([commit](https://github.com/Polymer/polymer/commit/a3b75eb3))
+
+- [ci skip] update changelog v1.7.1 ([commit](https://github.com/Polymer/polymer/commit/03e22a1c))
+
+- Close backtick in ISSUE_TEMPLATE.md ([commit](https://github.com/Polymer/polymer/commit/b0dea8bc))
+
+## [v1.7.1-dev](https://github.com/Polymer/polymer/tree/v1.7.1-dev) (2016-12-14)
+- Remove dependency on WebComponents for IE detection ([commit](https://github.com/Polymer/polymer/commit/650c16a9))
+
+- Make sure text nodes are distributed when translating slot to content ([commit](https://github.com/Polymer/polymer/commit/87e312f1))
+
+- always use the document listener ([commit](https://github.com/Polymer/polymer/commit/5ddcb8d1))
+
+- Add tests for no-gesture interop ([commit](https://github.com/Polymer/polymer/commit/4be7e9f6))
+
+- fix lint error ([commit](https://github.com/Polymer/polymer/commit/9c8eaa9d))
+
+- Use document-wide passive touch listener to update ghostclick blocker target ([commit](https://github.com/Polymer/polymer/commit/947172f8))
+
+- only need to recalc if styleProperties missing ([commit](https://github.com/Polymer/polymer/commit/5bfe2792))
+
+- simpler implementation, only recompute when using shim variables ([commit](https://github.com/Polymer/polymer/commit/5231d87f))
+
+- [ci skip] update travis.yml from 2.0 ([commit](https://github.com/Polymer/polymer/commit/1a9c5c8c))
+
+- Always update style properties when calling getComputedStyleValue ([commit](https://github.com/Polymer/polymer/commit/fb8575c6))
+
+- Add tests ([commit](https://github.com/Polymer/polymer/commit/29de0055))
+
+- Fix #4123: Memory leak when using `importHref` ([commit](https://github.com/Polymer/polymer/commit/132010ea))
+
+- Prevent _showHideChildren from being called on placeholders. ([commit](https://github.com/Polymer/polymer/commit/0468c60a))
+
+- fix broken link to Google JavaScript syle guide in documentation ([commit](https://github.com/Polymer/polymer/commit/376d146f))
+
+- Better explanation thanks to @kevinpschaaf ([commit](https://github.com/Polymer/polymer/commit/0dae8f0d))
+
+- [ci skip] fix changelog title ([commit](https://github.com/Polymer/polymer/commit/16712cb6))
+
+- [ci skip] Update Changelog for 1.7.0 ([commit](https://github.com/Polymer/polymer/commit/d6af21b5))
+
+- Resolving issue #1745 with Polymer docs ([commit](https://github.com/Polymer/polymer/commit/bb875275))
+
+- fixed broken tests/missing web components ([commit](https://github.com/Polymer/polymer/commit/f2b01e34))
+
+- 3430 - ie memory leak fixes - disable event caching, fixed resolver url adding to root doc, and weak map ie issues ([commit](https://github.com/Polymer/polymer/commit/a6e66f92))
+
+- Briefly explain how to split element definition ([commit](https://github.com/Polymer/polymer/commit/c6462286))
+
+- Fix copy&pasted comment ([commit](https://github.com/Polymer/polymer/commit/d595c0cc))
+
+## [v1.7.0](https://github.com/Polymer/polymer/tree/v1.7.0) (2016-09-28)
+- Fix IE style cache performance ([commit](https://github.com/Polymer/polymer/commit/d08b694))
+
+- no need for :root to be first in the selector ([commit](https://github.com/Polymer/polymer/commit/63433c8))
+
+- fix tests on !chrome browsers ([commit](https://github.com/Polymer/polymer/commit/7ce981b))
+
+- Translate `:root` to `:host > *` for element styles ([commit](https://github.com/Polymer/polymer/commit/fea64b9))
+
+- Define checkRoot only once ([commit](https://github.com/Polymer/polymer/commit/a49b366))
+
+- Fix normalizeRootSelector ([commit](https://github.com/Polymer/polymer/commit/c2278a0))
+
+- Comment on using the ast walker to replace selector ([commit](https://github.com/Polymer/polymer/commit/9658665))
+
+- update travis config ([commit](https://github.com/Polymer/polymer/commit/c00687a))
+
+- Transform ::slotted() to ::content ([commit](https://github.com/Polymer/polymer/commit/541fdfb))
+
+- Test on native shadow DOM also. ([commit](https://github.com/Polymer/polymer/commit/11afc1f))
+
+- Reorder. ([commit](https://github.com/Polymer/polymer/commit/cbae058))
+
+- Remove unused. ([commit](https://github.com/Polymer/polymer/commit/92d1d8a))
+
+- Add fallback support/test. ([commit](https://github.com/Polymer/polymer/commit/037abdd))
+
+- A little more dry. ([commit](https://github.com/Polymer/polymer/commit/6fd0e1f))
+
+- Use name. ([commit](https://github.com/Polymer/polymer/commit/4aa8da2))
+
+- Support default slot semantics. ([commit](https://github.com/Polymer/polymer/commit/d458dd3))
+
+- Remove opt-in. Exclude content from copy. ([commit](https://github.com/Polymer/polymer/commit/41e5dc0))
+
+- Make sure click events can always trigger tap, even on touch only devices ([commit](https://github.com/Polymer/polymer/commit/02441ca))
+
+- Add support for slot->content transformation. Need to bikeshed opt-in attribute (currently "auto-content") ([commit](https://github.com/Polymer/polymer/commit/ebf31ca))
+
+- Support more expressive `:root` and `html` selectors ([commit](https://github.com/Polymer/polymer/commit/2a8f21a))
+
+- Fix typo ([commit](https://github.com/Polymer/polymer/commit/192eb56))
+
+- test for mixins in custom-style ordering ([commit](https://github.com/Polymer/polymer/commit/37646f7))
+
+- Do not insert semicolon when fixing var() syntax ([commit](https://github.com/Polymer/polymer/commit/0a338a7))
+
+- Make sure mixins are applied no matter the ordering of definition ([commit](https://github.com/Polymer/polymer/commit/9daea3d))
+
+- Update gulp-eslint to 3.x ([commit](https://github.com/Polymer/polymer/commit/8b89f02))
+
+- Fixes #3676: retain `<style>` in `<template preserve-content/>` ([commit](https://github.com/Polymer/polymer/commit/8a4c00c))
+
+- [ci skip] Update Changelog for v1.6.1 ([commit](https://github.com/Polymer/polymer/commit/ec04461))
+
+- Apply to _marshalArgs. ([commit](https://github.com/Polymer/polymer/commit/b2cd932))
+
+- Rename Path.head() to Path.root(). ([commit](https://github.com/Polymer/polymer/commit/77808d9))
+
+- Use head in templatizer ([commit](https://github.com/Polymer/polymer/commit/478978d))
+
+- Modify _annotationPathEffect ([commit](https://github.com/Polymer/polymer/commit/852aba0))
+
+- Use isDescendant ([commit](https://github.com/Polymer/polymer/commit/b9944fe))
+
+- Use isDeep ([commit](https://github.com/Polymer/polymer/commit/5627a55))
+
+- Replace _fixPath. ([commit](https://github.com/Polymer/polymer/commit/6d1dd88))
+
+- Replace _modelForPath. ([commit](https://github.com/Polymer/polymer/commit/b02eda0))
+
+- Replace _patchMatchesEffect. ([commit](https://github.com/Polymer/polymer/commit/6ad9295))
+
+- Add path library. ([commit](https://github.com/Polymer/polymer/commit/0320763))
+
+- Revert "Fix _patchMatchesEffect. (#3631)" ([commit](https://github.com/Polymer/polymer/commit/a64f227))
+
+## [v1.6.1](https://github.com/Polymer/polymer/tree/v1.6.1) (2016-08-01)
+- Property Shim needs to handle build output from apply shim ([commit](https://github.com/Polymer/polymer/commit/d726a51))
+
+- Do not resolve urls with leading slash and other protocols ([commit](https://github.com/Polymer/polymer/commit/94f95ec))
+
+- Mark that non-inheritable properties being set to `inherit` is not supported ([commit](https://github.com/Polymer/polymer/commit/0a2b31e))
+
+- Put `getInitialValueForProperty` on ApplyShim ([commit](https://github.com/Polymer/polymer/commit/0489ccf))
+
+- Skip `initial` and `inherit` on IE 10 and 11 ([commit](https://github.com/Polymer/polymer/commit/63c3bfb))
+
+- Handle mixins with property values of inherit and initial ([commit](https://github.com/Polymer/polymer/commit/c7571e5))
+
+- Split tests for use-before-create and reusing mixin names for variables ([commit](https://github.com/Polymer/polymer/commit/8de1bec))
+
+- Make sure we don't populate the mixin map for every variable ([commit](https://github.com/Polymer/polymer/commit/6265ade))
+
+- [apply shim] Track dependencies for mixins before creation ([commit](https://github.com/Polymer/polymer/commit/2cab461))
+
+- [property shim] Make sure "initial" and "inherit" behave as they would natively ([commit](https://github.com/Polymer/polymer/commit/0887dba))
+
+- fix lint issue. ([commit](https://github.com/Polymer/polymer/commit/95eadbd))
+
+- Fixes #3801. Ensure style host calculates custom properties before element. This ensures the scope's styles are prepared to be inspected by the element for matching rules. ([commit](https://github.com/Polymer/polymer/commit/5967f2d))
+
+- Clean up custom-style use of apply shim ([commit](https://github.com/Polymer/polymer/commit/0859803))
+
+- gate comparing css text on using native css properties ([commit](https://github.com/Polymer/polymer/commit/8fcb5f6))
+
+- Only invalidate mixin if it defines new properties ([commit](https://github.com/Polymer/polymer/commit/b27f842))
+
+- Make __currentElementProto optional for build tool ([commit](https://github.com/Polymer/polymer/commit/64d41e6))
+
+- Rerun Apply Shim when mixins with consumers are redefined ([commit](https://github.com/Polymer/polymer/commit/498e23f))
+
+- updateNativeStyles should only remove styles set by updateNativeStyles ([commit](https://github.com/Polymer/polymer/commit/831be4f))
+
+- [ci skip] add smoke test for scope caching with custom-style ([commit](https://github.com/Polymer/polymer/commit/43955ea))
+
+- Remove unused arg. ([commit](https://github.com/Polymer/polymer/commit/95cd415))
+
+- Remove dirty check for custom events; unnecessary after #3678. Fixes #3677. ([commit](https://github.com/Polymer/polymer/commit/92a9398))
+
+- Use _configValue to avoid setting readOnly. Add tests. ([commit](https://github.com/Polymer/polymer/commit/36467fa))
+
+- Missing piece to fixing #3094 ([commit](https://github.com/Polymer/polymer/commit/694b35e))
+
+- Opt in to "even lazier" behavior by setting `lazyRegister` to "max". This was done to preserve compatibility with the existing feature. Specifically, when "max" is used, setting `is` in `beforeRegister` and defining `factoryImpl` may only be done on an element's prototype and not its behaviors. In addition, the element's `beforeRegister` is called *before* its behaviors' `beforeRegisters` rather than *after* as in the normal case. ([commit](https://github.com/Polymer/polymer/commit/b271a88))
+
+- Replace 'iff' with 'if and only if' ([commit](https://github.com/Polymer/polymer/commit/f7659eb))
+
+- Fix test in IE10. ([commit](https://github.com/Polymer/polymer/commit/fb95dc8))
+
+- cleanup check for sourceCapabilities ([commit](https://github.com/Polymer/polymer/commit/4c44fb7))
+
+- Fix #3786 by adding a `noUrlSettings` flag to Polymer.Settings ([commit](https://github.com/Polymer/polymer/commit/8a26759))
+
+- Fix mouse input delay on systems with a touchscreen ([commit](https://github.com/Polymer/polymer/commit/ed4c18a))
+
+- Ensure properties override attributes at upgrade time. Fixes #3779. ([commit](https://github.com/Polymer/polymer/commit/f2938ec))
+
+- Refresh cache'd styles contents in IE 10 and 11 ([commit](https://github.com/Polymer/polymer/commit/80be0df))
+
+- change travis config ([commit](https://github.com/Polymer/polymer/commit/1256301))
+
+- Fix css shady build mistakenly matching root rules as host rules ([commit](https://github.com/Polymer/polymer/commit/5dfb9c9))
+
+- [ci skip] update changelog for v1.6.0 ([commit](https://github.com/Polymer/polymer/commit/d8bab9c))
+
+- Make lazyRegister have 'even lazier' behavior such that behaviors are not mixed in until first-instance time. ([commit](https://github.com/Polymer/polymer/commit/9676d6d))
+
+- need takeRecords in complex var example ([commit](https://github.com/Polymer/polymer/commit/b40561b))
+
+- add reduced test case ([commit](https://github.com/Polymer/polymer/commit/26fe9b9))
+
+- Replace VAR_MATCH regex with a simple state machine / callback ([commit](https://github.com/Polymer/polymer/commit/4ebec15))
+
+- Expose an `lazierRegister` flag to defer additional work until first create time. This change requires that a behavior not implement a custom constructor or set the element's `is` property. ([commit](https://github.com/Polymer/polymer/commit/5c5b18e))
+
+- Improve type signatures: `Polymer.Base.extend` and `Polymer.Base.mixin` ([commit](https://github.com/Polymer/polymer/commit/8382aa7))
+
+- Fix for changing property to the same value ([commit](https://github.com/Polymer/polymer/commit/66e6e22))
+
+- Include iron-component-page in devDependencies ([commit](https://github.com/Polymer/polymer/commit/639d5d8))
+
+- Ensure fromAbove in _forwardParentProp. ([commit](https://github.com/Polymer/polymer/commit/072dcff))
+
+## [v1.6.0](https://github.com/Polymer/polymer/tree/v1.6.0) (2016-06-29)
+- Fix test to account for pseudo element differences x-browser. ([commit](https://github.com/Polymer/polymer/commit/54a462d))
+
+- Restore functionality of selectors like `:host(.foo)::after`. ([commit](https://github.com/Polymer/polymer/commit/ff88e17))
+
+- add comment. ([commit](https://github.com/Polymer/polymer/commit/e770343))
+
+- re-support selectors like `:host[inline]` since this was previously supported under shady-dom. ([commit](https://github.com/Polymer/polymer/commit/4e51ef6))
+
+- fix linting ([commit](https://github.com/Polymer/polymer/commit/4817d61))
+
+- Add test for not matching `x-foox-bar` given `:host(x-bar)` used inside `x-foo` ([commit](https://github.com/Polymer/polymer/commit/4e08fa1))
+
+- fix test in IE/FF. ([commit](https://github.com/Polymer/polymer/commit/ec111f1))
+
+- simplify :host fixup ([commit](https://github.com/Polymer/polymer/commit/c3355fd))
+
+- Fixes #3739: correctly shim `:host(.element-name)` as `element-name.element-name`. ([commit](https://github.com/Polymer/polymer/commit/997240a))
+
+- Fixes #3734: address HI/CE timing issue in importHref. Fixes upgrade time dependencies of scripts on previous elements in async imports. ([commit](https://github.com/Polymer/polymer/commit/84662b9))
+
+- Ensure element scope selectors are updated correctly when updateStyles is called when element is not in dom. ([commit](https://github.com/Polymer/polymer/commit/6d90480))
+
+- add comment. ([commit](https://github.com/Polymer/polymer/commit/620e59f))
+
+- remove unneeded flag. ([commit](https://github.com/Polymer/polymer/commit/b5b8a2a))
+
+- Fixes #3730 and inspired by (https://github.com/Polymer/polymer/pull/3585) ([commit](https://github.com/Polymer/polymer/commit/ab431ed))
+
+- custom-style triggers updateStyles if root scope (StyleDefaults) has style properties when the custom-style is created. ([commit](https://github.com/Polymer/polymer/commit/4852f6c))
+
+- Fix _patchMatchesEffect. (#3631) ([commit](https://github.com/Polymer/polymer/commit/b78e5af))
+
+- Fixes #3555. Ensure selectors including `::content` without a prefix … (#3721) ([commit](https://github.com/Polymer/polymer/commit/1058896))
+
+- Fixes #3530. When `updateStyles` is called and an element is not attached, invalidate its styling so that when it is attached, its custom properties will be updated. ([commit](https://github.com/Polymer/polymer/commit/ae4a07e))
+
+- Make sure effect functions receive latest values ([commit](https://github.com/Polymer/polymer/commit/34b2c79))
+
+- [ci skip] data binding edge case smoke test ([commit](https://github.com/Polymer/polymer/commit/a54c1f2))
+
+- Use `whenReady` to apply custom styles. ([commit](https://github.com/Polymer/polymer/commit/129488b))
+
+- Use firefox 46 for testing ([commit](https://github.com/Polymer/polymer/commit/fbe5b0f))
+
+- Need to wait until render to test. ([commit](https://github.com/Polymer/polymer/commit/92293f9))
+
+- address feedback ([commit](https://github.com/Polymer/polymer/commit/4dc780a))
+
+- Fix lint, use query params instead of duplicate file. ([commit](https://github.com/Polymer/polymer/commit/e4880d9))
+
+- Ensure custom styles updated after adding custom-style async. Fixes #3705. ([commit](https://github.com/Polymer/polymer/commit/f770438))
+
+- Store cacheablility on the scope ([commit](https://github.com/Polymer/polymer/commit/bc9519e))
+
+- fix decorateStyles with custom-style ([commit](https://github.com/Polymer/polymer/commit/57a6769))
+
+- Do not scope cache elements with media rules, :host(), or :host-context() selectors ([commit](https://github.com/Polymer/polymer/commit/5c3b917))
+
+- Support preventDefault() on touch (#3693) ([commit](https://github.com/Polymer/polymer/commit/b9c874e))
+
+- Shim CSS Mixins in terms of CSS Custom Properties (#3587) ([commit](https://github.com/Polymer/polymer/commit/6c0acef))
+
+- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/adef722))
+
+## [v1.5.0](https://github.com/Polymer/polymer/tree/v1.5.0) (2016-05-31)
+- Fix test in Firefox that was hacked to work in Canary (instead filed https://bugs.chromium.org/p/chromium/issues/detail?id=614198). ([commit](https://github.com/Polymer/polymer/commit/1e2aed5))
+
+- remove unneeded argument ([commit](https://github.com/Polymer/polymer/commit/4a99b83))
+
+- slight optimization, avoid work if no cssText is set. ([commit](https://github.com/Polymer/polymer/commit/ce0bf86))
+
+- More efficient fix for #3661. Re-uses cached style element that needs to be replaced in the document rather than creating a new one. ([commit](https://github.com/Polymer/polymer/commit/63f91ae))
+
+- Fixes #3661: ensure that cached style points to the applied style for Shady DOM styling. This ensures that the cache can be used to determine if a style needs to be applied to the document and prevents extra unnecessary styles from being added. This could happen when a property cascaded to a nested element and updateStyles was called after properties have changed. ([commit](https://github.com/Polymer/polymer/commit/717fc3a))
+
+- Fix flakey attached/detached timing test. ([commit](https://github.com/Polymer/polymer/commit/04da868))
+
+- remove HTML comment ([commit](https://github.com/Polymer/polymer/commit/d339b28))
+
+- add more style[include] doc ([commit](https://github.com/Polymer/polymer/commit/b8fd12d))
+
+- Update the package.json name to match the actual npm published package. (#3570) ([commit](https://github.com/Polymer/polymer/commit/e57eb49))
+
+- Remove unused event cache store (#3591) ([commit](https://github.com/Polymer/polymer/commit/364ede9))
+
+- [ci skip] sudo should be "required" ([commit](https://github.com/Polymer/polymer/commit/c0e0a73))
+
+- transition to travis trusty images ([commit](https://github.com/Polymer/polymer/commit/b7c0b1f))
+
+- fine, console.dir then ([commit](https://github.com/Polymer/polymer/commit/c8cb3be))
+
+- fix ie missing console.table for stubbing ([commit](https://github.com/Polymer/polymer/commit/6d39644))
+
+- Support the devtools console.log api (multiple strings) for polymer logging ([commit](https://github.com/Polymer/polymer/commit/909ee82))
+
+- Compute and use correct annotation value during config ([commit](https://github.com/Polymer/polymer/commit/1b02e96))
+
+- Set propertyName on parent props for config phase. ([commit](https://github.com/Polymer/polymer/commit/d9c03a4))
+
+- Refactorings around how computational expressions get their arguments ([commit](https://github.com/Polymer/polymer/commit/677f10c))
+
+- Fix safari 7 again ([commit](https://github.com/Polymer/polymer/commit/b30f962))
+
+- Expose public API to reset mouse cancelling for testing touch ([commit](https://github.com/Polymer/polymer/commit/18bf9d4))
+
+- Delay detached callback with the same strategy as attached callback ([commit](https://github.com/Polymer/polymer/commit/7a244fa))
+
+- [ci skip] Add missing dom5 devDependency ([commit](https://github.com/Polymer/polymer/commit/5e2050a))
+
+- Don't use `translate` as a method for testing ([commit](https://github.com/Polymer/polymer/commit/f80346f))
+
+- Only fix prototype when registering at first create time. ([commit](https://github.com/Polymer/polymer/commit/7ad2bff))
+
+- Fixes #3525: Makes lazy registration compatible with platforms (like IE10) on which a custom element's prototype must be simulated. ([commit](https://github.com/Polymer/polymer/commit/4834651))
+
+- make sure gulp-cli 1 is used ([commit](https://github.com/Polymer/polymer/commit/29067ca))
+
+- Ensure Annotator recognizes dynamic fn as dependency for parent props. ([commit](https://github.com/Polymer/polymer/commit/15ff463))
+
+- [ci skip] Update CHANGELOG ([commit](https://github.com/Polymer/polymer/commit/223aa34))
+
+- Enabling caching of node_modules on Travis ([commit](https://github.com/Polymer/polymer/commit/6b6ec5d))
+
+- Fix undefined class attribute in undefined template scope ([commit](https://github.com/Polymer/polymer/commit/e21c59e))
+
+- Use a parser based html minification ([commit](https://github.com/Polymer/polymer/commit/0536e35))
+
+- Call _notifyPath instead of notifyPath in templatizer ([commit](https://github.com/Polymer/polymer/commit/067b7ed))
+
+- Keep it real for notifyPath. ([commit](https://github.com/Polymer/polymer/commit/40a1f79))
+
+- Null debounced callback to set for GC. ([commit](https://github.com/Polymer/polymer/commit/f366c1c))
+
+## [v1.4.0](https://github.com/Polymer/polymer/tree/v1.4.0) (2016-03-18)
+- Fast check in createdCallback to see if registration has finished. ([commit](https://github.com/Polymer/polymer/commit/a3fce19))
+
+- even more lazy: defer template lookup and style collection until finish register time. ([commit](https://github.com/Polymer/polymer/commit/103f790))
+
+- fix lint errors. ([commit](https://github.com/Polymer/polymer/commit/d7a2baa))
+
+- * turn on lazy registration via `Polymer.Settings.lazyRegister` * ensure registration finished by calling `Element.prototype.ensureRegisterFinished()` ([commit](https://github.com/Polymer/polymer/commit/31c785d))
+
+- remove crufty smoke test. ([commit](https://github.com/Polymer/polymer/commit/3dd1b61))
+
+- fix lint issues ([commit](https://github.com/Polymer/polymer/commit/0447228))
+
+- Change `forceRegister` to `eagerRegister` and add `Polymer.Settings.eagerRegister` flag. ([commit](https://github.com/Polymer/polymer/commit/f6597ec))
+
+- Add `forceRegister` flag to force an element to fully register when `Polymer` is called. Normally, some work is deferred until the first element instance is created. ([commit](https://github.com/Polymer/polymer/commit/d53323d))
+
+- Call registered no prototype. ([commit](https://github.com/Polymer/polymer/commit/812db6a))
+
+- Lazy register features we can be deferred until first instance. This is an optimization which can speed up page load time when elements are registered but not needed at time of first paint/interaction ([commit](https://github.com/Polymer/polymer/commit/31702ff))
+
+- Do not reflect uppercase properties ([commit](https://github.com/Polymer/polymer/commit/72d35e0))
+
+- Make sure event.path is an array ([commit](https://github.com/Polymer/polymer/commit/2dfdd7b))
+
+- fix testing failures on assert.notInclude of null ([commit](https://github.com/Polymer/polymer/commit/8066919))
+
+- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/58e6713))
+
+## [v1.3.1](https://github.com/Polymer/polymer/tree/v1.3.1) (2016-03-02)
+- Fix lint errors. ([commit](https://github.com/Polymer/polymer/commit/44d06f1))
+
+- Add test. ([commit](https://github.com/Polymer/polymer/commit/02660c1))
+
+- Fix lint error. ([commit](https://github.com/Polymer/polymer/commit/e2c5f9e))
+
+- Ensure that dom-bind always waits until DOMContentLoaded to render. This ensures a script can install api on the dom-bind prior to it rendering. Previously dom-bind waited for first render, but an early parser yield can make this occur unexpectedly early. ([commit](https://github.com/Polymer/polymer/commit/cc0e9df))
+
+- Refine fix for #3461 so that the decision to apply a static or property stylesheet relies on the same info. ([commit](https://github.com/Polymer/polymer/commit/ff96f9e))
+
+- Clean the .eslintignore ([commit](https://github.com/Polymer/polymer/commit/04d06a5))
+
+- [ci skip] Add header for those asking questions ([commit](https://github.com/Polymer/polymer/commit/9d6111c))
+
+- Fixes #3461: Only avoid creating a statically scoped stylesheet when properties are consumed in an element, properly excluding properties produced as a result of consumption. ([commit](https://github.com/Polymer/polymer/commit/e26a806))
+
+- tweaks to new README ([commit](https://github.com/Polymer/polymer/commit/809352d))
+
+- [ci skip] Update Changelog ([commit](https://github.com/Polymer/polymer/commit/4f3f463))
+
+- Updated the README.md for a non-technical user to understand ([commit](https://github.com/Polymer/polymer/commit/0729cef))
+
+## [v1.3.0](https://github.com/Polymer/polymer/tree/v1.3.0) (2016-02-22)
+- [ci skip] Add instructions to pull request template ([commit](https://github.com/Polymer/polymer/commit/933c920))
+
+- [ci skip] markdown fail ([commit](https://github.com/Polymer/polymer/commit/a8e01e2))
+
+- [ci skip] Add instructions to issue template ([commit](https://github.com/Polymer/polymer/commit/ace0f72))
+
+- Make sure to configure properties on polymer elements that do not have property effects. ([commit](https://github.com/Polymer/polymer/commit/f93c3e5))
+
+- Fix lint errors. ([commit](https://github.com/Polymer/polymer/commit/5ac5ee7))
+
+- Add comment. Ensure Date deserializes to String for correctness. ([commit](https://github.com/Polymer/polymer/commit/69c7087))
+
+- Serialize before deserialize when configuring attrs. Fixes #3433. ([commit](https://github.com/Polymer/polymer/commit/ec85582))
+
+- Restrict early property set to properties that have accessors. This allows users to set properties in `created` which are listed in `properties` but which have no accessor. ([commit](https://github.com/Polymer/polymer/commit/4cfb245))
+
+- fix crlf once and for all ([commit](https://github.com/Polymer/polymer/commit/6c5afe5))
+
+- fix test linting from #3350 ([commit](https://github.com/Polymer/polymer/commit/37f7157))
+
+- Use the new .github folder for issue and pull request templates ([commit](https://github.com/Polymer/polymer/commit/58529c2))
+
+- [ci skip] Use https for jsbin ([commit](https://github.com/Polymer/polymer/commit/3e33fd4))
+
+- [ci skip] Add issue and pr template ([commit](https://github.com/Polymer/polymer/commit/cc1ef9a))
+
+- Update to gulp-eslint v2 ([commit](https://github.com/Polymer/polymer/commit/dca0dda))
+
+- fix lint errors ([commit](https://github.com/Polymer/polymer/commit/7da9a38))
+
+- Minor fixes based on review. ([commit](https://github.com/Polymer/polymer/commit/f2c1d4a))
+
+- Undo fix on IE10 where the custom elements polyfill's mixin strategy makes this unfeasible. ([commit](https://github.com/Polymer/polymer/commit/ef629f4))
+
+- Update comments. ([commit](https://github.com/Polymer/polymer/commit/b870fe0))
+
+- Add test that late resolved functions don't warn ([commit](https://github.com/Polymer/polymer/commit/0037c53))
+
+- Add support for properties defined in a behavior. ([commit](https://github.com/Polymer/polymer/commit/b6abf26))
+
+- Generalized approach supporting compute and observers ([commit](https://github.com/Polymer/polymer/commit/f4486a2))
+
+- Proper implementation ([commit](https://github.com/Polymer/polymer/commit/3c12178))
+
+- Support dynamic functions for computed annotations. ([commit](https://github.com/Polymer/polymer/commit/3f1bc4e))
+
+- ordering issue for when assert is defined in native html imports ([commit](https://github.com/Polymer/polymer/commit/d81f6bc))
+
+- Lint the tests ([commit](https://github.com/Polymer/polymer/commit/e5063ca))
+
+- Add support for one-of attribute selector while not breaking support for general sibling combinator. Fixes #3023. Fix taken from #3067. ([commit](https://github.com/Polymer/polymer/commit/5a493d8))
+
+- Fix bindings with special characters ([commit](https://github.com/Polymer/polymer/commit/d385873))
+
+- [ci skip] move linting into before_script stage ([commit](https://github.com/Polymer/polymer/commit/1b5fc9a))
+
+- Fix lint error and uncomment test. ([commit](https://github.com/Polymer/polymer/commit/c00c47f))
+
+- Add test for overriding property based :host selector from outside. ([commit](https://github.com/Polymer/polymer/commit/71c41ed))
+
+- Add comment and fix typo ([commit](https://github.com/Polymer/polymer/commit/b0e16f0))
+
+- Ensure _propertySetter is installed first. Fixes #3063 ([commit](https://github.com/Polymer/polymer/commit/6362f60))
+
+- Disable tap gesture when track gesture is firing for ancestor node ([commit](https://github.com/Polymer/polymer/commit/6f2c1fc))
+
+- Fix parsing of parenthesis in default of variable declaration ([commit](https://github.com/Polymer/polymer/commit/926d0e5))
+
+- Rename _mapRule to _mapRuleOntoParent ([commit](https://github.com/Polymer/polymer/commit/cd42595))
+
+- Test with ESLint enabled ([commit](https://github.com/Polymer/polymer/commit/acdfc1e))
+
+- Make behaviors array unique ([commit](https://github.com/Polymer/polymer/commit/4cde38a))
+
+- Use deserialize from the node. ([commit](https://github.com/Polymer/polymer/commit/a3641e2))
+
+- Actually execute case-map ([commit](https://github.com/Polymer/polymer/commit/d84d75b))
+
+- [ci skip] .eslintrc is deprecated, add .json suffix ([commit](https://github.com/Polymer/polymer/commit/c7554d9))
+
+- Make the test more look like a spec ([commit](https://github.com/Polymer/polymer/commit/db7c324))
+
+- Configure attr's with property effects. More robust fix for #3288. ([commit](https://github.com/Polymer/polymer/commit/0f55d1d))
+
+- Use ESLint for Polymer ([commit](https://github.com/Polymer/polymer/commit/f3c4bb1))
+
+- Add test suite for effects order ([commit](https://github.com/Polymer/polymer/commit/56df8f7))
+
+- Fix negation when a negated binding is changed ([commit](https://github.com/Polymer/polymer/commit/21383a3))
+
+- Add unit test suite for CaseMap ([commit](https://github.com/Polymer/polymer/commit/ee9a600))
+
+- Fixes for IE style ordering issue. ([commit](https://github.com/Polymer/polymer/commit/162f81e))
+
+- Fixes #3326. Changes inspired by #3276 and #3344 ([commit](https://github.com/Polymer/polymer/commit/b5ba9a8))
+
+- Fix for getters/setters for property become inaccessible when property set on element before it is ready ([commit](https://github.com/Polymer/polymer/commit/ecd9b09))
+
+- Non-destructive `@keyframes` rule transformation. ([commit](https://github.com/Polymer/polymer/commit/b9f2482))
+
+- Fix test regression from PR 3289 ([commit](https://github.com/Polymer/polymer/commit/5205d6a))
+
+- Move test and add to runner. ([commit](https://github.com/Polymer/polymer/commit/aeb44de))
+
+- make isDebouncerActive actually return a bool ([commit](https://github.com/Polymer/polymer/commit/dee9b98))
+
+- Lint the javascript code with eslint ([commit](https://github.com/Polymer/polymer/commit/f7d2bdf))
+
+- i suck at git ([commit](https://github.com/Polymer/polymer/commit/b40f639))
+
+- Fix for scoping when class is not specified on element (null was prepended instead of empty string) ([commit](https://github.com/Polymer/polymer/commit/24e9fc7))
+
+- Using constant rather than plain `:host` and `::content`, also create regexp object only once ([commit](https://github.com/Polymer/polymer/commit/c6c28f5))
+
+- Eliminate the need to write `:host ::content` instead of just `::content`, while keeping the same processing under the hood ([commit](https://github.com/Polymer/polymer/commit/d9f3dda))
+
+- Fix: There is no effect of kind 'computedAnnotation' ([commit](https://github.com/Polymer/polymer/commit/06cd560))
+
+- fix test case in 5d17efc ([commit](https://github.com/Polymer/polymer/commit/4a9ef8e))
+
+- add test for 3326 ([commit](https://github.com/Polymer/polymer/commit/854fdbf))
+
+- [ci skip] update CHANGELOG ([commit](https://github.com/Polymer/polymer/commit/3d2cb71))
+
+- Exclude attribute bindings from configuration. Fixes #3288. ([commit](https://github.com/Polymer/polymer/commit/246ea72))
+
+- Doubled `Polymer.CaseMap.dashToCamelCase` performance with simplified and once compiled RegExp. 5 times faster `Polymer.CaseMap.camelToDashCase` using simplified replace part, simplified and once compiled RegExp. ([commit](https://github.com/Polymer/polymer/commit/90938e3))
+
+- Update PRIMER.md ([commit](https://github.com/Polymer/polymer/commit/bb4d558))
+
+- Unit tests ([commit](https://github.com/Polymer/polymer/commit/de371bb))
+
+- Allow newlines in computed binding argument list ([commit](https://github.com/Polymer/polymer/commit/b745f45))
+
+- Remove redundant assign to window.Polymer ([commit](https://github.com/Polymer/polymer/commit/b2f8e8f))
+
+- parentProps should not override argument based props ([commit](https://github.com/Polymer/polymer/commit/898fe89))
+
+## [v1.2.4](https://github.com/Polymer/polymer/tree/v1.2.4) (2016-01-27)
+- Fixes #3337. When a doc fragment is added, only update the invalidation state of the insertion point list of the shadyRoot IFF it is not already invalid. This fixes an issue that was detected when an a doc fragment that did not include an insertion point was added after one that did but before distribution. ([commit](https://github.com/Polymer/polymer/commit/d26b003))
+
+- fix build output with new vulcanize ([commit](https://github.com/Polymer/polymer/commit/c317711))
+
+- Revert style properties change from fd5778470551f677c2aa5827398681abb1994a88 ([commit](https://github.com/Polymer/polymer/commit/0a0b580))
+
+- Fix shadow dom test. ([commit](https://github.com/Polymer/polymer/commit/6b83911))
+
+- Add shadow root support. (tests broken) ([commit](https://github.com/Polymer/polymer/commit/4b7da35))
+
+- Ensure dom-if moved into doc fragment is torn down. Fixes #3324 ([commit](https://github.com/Polymer/polymer/commit/6c4f5d5))
+
+- improve test. ([commit](https://github.com/Polymer/polymer/commit/d70c40a))
+
+- Update comment. ([commit](https://github.com/Polymer/polymer/commit/aa14687))
+
+- In addition to fragments, also handle non-distributed elements more completely. ([commit](https://github.com/Polymer/polymer/commit/fe2699e))
+
+- Simplify fix for fragment children management. ([commit](https://github.com/Polymer/polymer/commit/713377e))
+
+- Fix test under polyfill. ([commit](https://github.com/Polymer/polymer/commit/25da63d))
+
+- Ensure fragments added via Polymer.dom always have elements removed, even when distribution does not select those elements. ([commit](https://github.com/Polymer/polymer/commit/101eb3d))
+
+- Fixes #3321. Only let dom-repeat insert elements in attached if it has been previously detached; correctly avoid re-adding children in document fragments to an element's logical linked list if they are already there. ([commit](https://github.com/Polymer/polymer/commit/9f2464d))
+
+- Ugh ([commit](https://github.com/Polymer/polymer/commit/172d93c))
+
+- Fixes #3308. Use an explicit undefined check to test if logical tree information exists. ([commit](https://github.com/Polymer/polymer/commit/9106398))
+
+- add test ([commit](https://github.com/Polymer/polymer/commit/b1ea014))
+
+- use class attribute in applyElementScopeSelector ([commit](https://github.com/Polymer/polymer/commit/07d8c06))
+
+- Remove reference to _composedChildren ([commit](https://github.com/Polymer/polymer/commit/9f85acd))
+
+- Fix typo in documentation for set() ([commit](https://github.com/Polymer/polymer/commit/aa47515))
+
+- Fix typo in dom-tree-api ([commit](https://github.com/Polymer/polymer/commit/ae98a7c))
+
+- Correct use of document.contains to document.documentElement.contains on IE. ([commit](https://github.com/Polymer/polymer/commit/0e74810))
+
+- Ensure querySelector always returns `null` when a node is not found. Also optimize querySelector such that the matcher halts on the first result. ([commit](https://github.com/Polymer/polymer/commit/b9e5cce))
+
+- Fixes #3295. Only cache a false-y result for an element's owner shady root iff the element is currently in the document. ([commit](https://github.com/Polymer/polymer/commit/6e16619))
+
+- Use local references to wrapper functions; add test element tree to native shadow tests; reorder test elements. ([commit](https://github.com/Polymer/polymer/commit/47ee2ca))
+
+- Remove leftover garbage line ([commit](https://github.com/Polymer/polymer/commit/d7567b7))
+
+- Removes the case where activeElement could be in the light DOM of a ShadowRoot. ([commit](https://github.com/Polymer/polymer/commit/e848af8))
+
+- DOM API implementation of `activeElement`. ([commit](https://github.com/Polymer/polymer/commit/2984576))
+
+- Remove call to `wrap` in deepContains ([commit](https://github.com/Polymer/polymer/commit/4cbdef7))
+
+- Fixes #3270. ([commit](https://github.com/Polymer/polymer/commit/7d0485b))
+
+- Include more styling tests under ShadowDOM. Fix custom-style media query test to work under both shadow/shady. ([commit](https://github.com/Polymer/polymer/commit/33a24bb))
+
+- Remove duplicate code related to dom traversal in Polymer.dom. ([commit](https://github.com/Polymer/polymer/commit/555252b))
+
+- Fix parsing of minimized css output also for mixins ([commit](https://github.com/Polymer/polymer/commit/87d02e0))
+
+- Set position to relative to make Safari to succeed top/bottom tests ([commit](https://github.com/Polymer/polymer/commit/94f505a))
+
+- Fix parsing of minimized css output ([commit](https://github.com/Polymer/polymer/commit/f92f9ff))
+
+- Fix for `Polymer.dom(...)._query()` method doesn't exist which causes `Polymer.updateStyles()` to fail ([commit](https://github.com/Polymer/polymer/commit/0eea7a6))
+
+- Minor factoring of dom patching. ([commit](https://github.com/Polymer/polymer/commit/8c95014))
+
+- use destination insertion points when calculating the path ([commit](https://github.com/Polymer/polymer/commit/3f8b6ee))
+
+- Store all dom tree data in `__dom` private storage; implement composed patching via a linked list. ([commit](https://github.com/Polymer/polymer/commit/9a3bead))
+
+- Modernize the build ([commit](https://github.com/Polymer/polymer/commit/2b69bb1))
+
+- Add more globals to whitelist for safari ([commit](https://github.com/Polymer/polymer/commit/82b2443))
+
+- Shady patching: patch element accessors in composed tree; fixes HTMLImports polyfill support. ([commit](https://github.com/Polymer/polymer/commit/d135fef))
+
+- remove unused code; minor changes based on review. ([commit](https://github.com/Polymer/polymer/commit/c3fbd10))
+
+- added polymer-mini and polymer-micro to main ([commit](https://github.com/Polymer/polymer/commit/da5d781))
+
+- Updates the patch-don experiment to work with recent changes. ([commit](https://github.com/Polymer/polymer/commit/b9e6859))
+
+- Fixes #3113 ([commit](https://github.com/Polymer/polymer/commit/fadd455))
+
+- Polymer.dom: when adding a node, only remove the node from its existing location if it's not a fragment and has a parent. ([commit](https://github.com/Polymer/polymer/commit/9915627))
+
+- Consistently use TreeApi.Composed api for composed dom manipulation; use TreeApi.Logical methods to get node leaves. Avoid making a Polymer.dom when TreeApi.Logical can provide the needed info. ([commit](https://github.com/Polymer/polymer/commit/5033fdb))
+
+- Produce nicer error on malformed observer ([commit](https://github.com/Polymer/polymer/commit/0e248f5))
+
+- Deduplicate setup and verifying in notify-path test suite ([commit](https://github.com/Polymer/polymer/commit/68707ad))
+
+- more explicit tests for debouncer wait and no-wait behavior ([commit](https://github.com/Polymer/polymer/commit/8ef7bac))
+
+- speed up microtask testing ([commit](https://github.com/Polymer/polymer/commit/9bef4c0))
+
+- ensure isDebouncerActive returns a Boolean ([commit](https://github.com/Polymer/polymer/commit/3916493))
+
+- add more debouncer tests ([commit](https://github.com/Polymer/polymer/commit/0206852))
+
+- remove dead debounce test assertion ([commit](https://github.com/Polymer/polymer/commit/9b898c2))
+
+- Factoring of distribution logic in both add and remove cases. ([commit](https://github.com/Polymer/polymer/commit/8272d5e))
+
+- Minor typo in docs: call the debounce callback ([commit](https://github.com/Polymer/polymer/commit/02c5c79))
+
+- Correct test to avoid using `firstElementChild` on a documentFragment since it is not universally supported. ([commit](https://github.com/Polymer/polymer/commit/dfa6a44))
+
+- Remove all TODOs ([commit](https://github.com/Polymer/polymer/commit/6467ae1))
+
+- Revert "Add .gitattributes to solve line endings cross-OS (merge after other PRs)" ([commit](https://github.com/Polymer/polymer/commit/b6b8293))
+
+- Make renderedItemCount readOnly & add tests. ([commit](https://github.com/Polymer/polymer/commit/e39d5ba))
+
+- Revert "Fix parsing of minimized css output" ([commit](https://github.com/Polymer/polymer/commit/d3145e8))
+
+- Custom setProperty for bindings to hidden textNodes. Fixes #3157. ([commit](https://github.com/Polymer/polymer/commit/c6be10d))
+
+- Ensure dom-if in host does not restamp when host detaches. Fixes #3125. ([commit](https://github.com/Polymer/polymer/commit/bb85e2b))
+
+- Avoid making a copy of childNodes when a dom fragment is inserted in the logical tree. ([commit](https://github.com/Polymer/polymer/commit/dcbafbf))
+
+- Slightly faster `findAnnotatedNodes` ([commit](https://github.com/Polymer/polymer/commit/43fc853))
+
+- Add .gitattributes to solve line endings cross-OS ([commit](https://github.com/Polymer/polymer/commit/94c2bc2))
+
+- Ensure literals are excluded from parent props. Fixes #3128. Fixes #3121. ([commit](https://github.com/Polymer/polymer/commit/526fa3c))
+
+- Fix parsing of minimized css output ([commit](https://github.com/Polymer/polymer/commit/d458690))
+
+- Disable chunked dom-repeat tests on IE due to CI rAF flakiness. ([commit](https://github.com/Polymer/polymer/commit/7fe5e2b))
+
+- Add comment. ([commit](https://github.com/Polymer/polymer/commit/d8ecd45))
+
+- Make Polymer.dom.flush reentrant-safe. Fixes #3115. ([commit](https://github.com/Polymer/polymer/commit/644105a))
+
+- Fixes #3108. Moves `debounce` functionality from polymer-micro to polymer-mini. The functionality belongs at the mini tier and was never actually functional in micro. ([commit](https://github.com/Polymer/polymer/commit/3df4ef2))
+
+- Clarify this is for IE. ([commit](https://github.com/Polymer/polymer/commit/63782fa))
+
+- Patch rAF to setTimeout to reduce flakiness on CI. ([commit](https://github.com/Polymer/polymer/commit/35abadc))
+
+- added missing semicolons, removed some unused variables ([commit](https://github.com/Polymer/polymer/commit/00ed797))
+
+- ?Node ([commit](https://github.com/Polymer/polymer/commit/9385891))
+
+- Remove closures holding element references after mouseup/touchend ([commit](https://github.com/Polymer/polymer/commit/811f766))
+
+- set class attribute instead of using classname ([commit](https://github.com/Polymer/polymer/commit/690838a))
+
+- Include wildcard character in identifier. Fixes #3084. ([commit](https://github.com/Polymer/polymer/commit/c36d6c1))
+
+- Revert fromAbove in applyEffectValue. Add test. Fixes #3077. ([commit](https://github.com/Polymer/polymer/commit/156122c))
+
+- loosen isLightDescendant's @param type to Node ([commit](https://github.com/Polymer/polymer/commit/c635797))
+
+- Put beforeRegister in the behaviorProperties. ([commit](https://github.com/Polymer/polymer/commit/445b6cd))
+
+- ES5 strict doesn't like function declarations inside inner blocks. ([commit](https://github.com/Polymer/polymer/commit/51d3fa6))
+
+- Fixes #3065: Add dom-repeat.renderedItemCount property ([commit](https://github.com/Polymer/polymer/commit/b589f70))
+
+- Minor factoring; ensure base properties set on instance. ([commit](https://github.com/Polymer/polymer/commit/da15ff0))
+
+- Fix typos. ([commit](https://github.com/Polymer/polymer/commit/c12d3ed))
+
+- Simplify more. ([commit](https://github.com/Polymer/polymer/commit/186e053))
+
+- Improvements to regex. ([commit](https://github.com/Polymer/polymer/commit/a3d17d5))
+
+- Give dom-repeat#_targetFrameTime a type ([commit](https://github.com/Polymer/polymer/commit/adad9ce))
+
+- [skip ci] update travis config to firefox latest ([commit](https://github.com/Polymer/polymer/commit/608ce9f))
+
+- Add a couple of tests. ([commit](https://github.com/Polymer/polymer/commit/108b7f9))
+
+- Suppress warnings and expected errors in test suite ([commit](https://github.com/Polymer/polymer/commit/92d6fcb))
+
+- Use linked-list for element tree traversal. Factor Polymer.DomApi into shadow/shady modules. ([commit](https://github.com/Polymer/polymer/commit/306cc81))
+
+- Avoid throwing with invalid keys/paths. Fixes #3018. ([commit](https://github.com/Polymer/polymer/commit/5076ee0))
+
+- Use stricter binding parsing for efficiency and correctness. Fixes #2705. ([commit](https://github.com/Polymer/polymer/commit/04cd184))
+
+- Simpler travis config ([commit](https://github.com/Polymer/polymer/commit/68b457d))
+
+- [ci skip] Update Changelog ([commit](https://github.com/Polymer/polymer/commit/7e7600a))
+
+- Fix for incorrect CSS selectors specificity as reported in #2531 Fix for overriding mixin properties, fixes #1873 Added awareness from `@apply()` position among other rules so that it is preserved after CSS variables/mixing substitution. `Polymer.StyleUtil.clearStyleRules()` method removed as it is not used anywhere. Some unused variables removed. Typos, unused variables and unnecessary escaping in regexps corrected. Tests added. ([commit](https://github.com/Polymer/polymer/commit/fd57784))
+
+- Fix for method parsing in computed binding ([commit](https://github.com/Polymer/polymer/commit/c2e43d3))
+
+- Fix doc typo. ([commit](https://github.com/Polymer/polymer/commit/8886c2c))
+
+- Filtering causes unexpected issues ([commit](https://github.com/Polymer/polymer/commit/df22564))
+
+- Fix using value$ on input element ([commit](https://github.com/Polymer/polymer/commit/05a1e95))
+
+- added missing semicolons, removed some unused variables ([commit](https://github.com/Polymer/polymer/commit/338574d))
+
+## [v1.2.3](https://github.com/Polymer/polymer/tree/v1.2.3) (2015-11-16)
+- Call decorate instead of bootstrap for template prepping ([commit](https://github.com/Polymer/polymer/commit/e2a2cfd))
+
+- Fix global leak test. Necessary due to changes to test harness. ([commit](https://github.com/Polymer/polymer/commit/134766f))
+
+- Defer property application only when a custom-style is first created. ([commit](https://github.com/Polymer/polymer/commit/4bf0e13))
+
+- Update comment. ([commit](https://github.com/Polymer/polymer/commit/27e1dcd))
+
+- Simplify custom-style property deferment. ([commit](https://github.com/Polymer/polymer/commit/a970493))
+
+- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/98acb3a))
+
+- Fixes #2692. Ensures that custom-style properties are applied async but before next render so that all properties are defined before any are consumed by custom-styles. Also refines dom-module's early upgrade code so that it does not affect other elements (corrects for example, custom-styles upgrading before expected). ([commit](https://github.com/Polymer/polymer/commit/b829f2a))
+
+- Remove undesired full-stop from outputs ([commit](https://github.com/Polymer/polymer/commit/68d5c55))
+
+- Fix Formatting ([commit](https://github.com/Polymer/polymer/commit/724e1bc))
+
+## [v1.2.2](https://github.com/Polymer/polymer/tree/v1.2.2) (2015-11-12)
+- use local reference for wrap. ([commit](https://github.com/Polymer/polymer/commit/b15e5b9))
+
+- Add Polymer.DomApi.wrap ([commit](https://github.com/Polymer/polymer/commit/6cf974a))
+
+- For correctness, bind listeners must use a property's current value rather than its passed value. ([commit](https://github.com/Polymer/polymer/commit/aca404f))
+
+- Explicitly making an element's `_template` falsy is now considered an allowable setting. This means the element stamps no content, doesn't collect any styles, and avoids looking up a dom-module. This helps address #2708 and the 5 elements Polymer registers that have no template have been set with `_template: null`. ([commit](https://github.com/Polymer/polymer/commit/b905a37))
+
+- Make test work under native Shadow DOM. ([commit](https://github.com/Polymer/polymer/commit/4f9c2bd))
+
+- In `_notifyListener`, only use `e.detail` if the event has a detail. This is necessary for `::eventName` compatibility where `eventName` is a native event like `change`. ([commit](https://github.com/Polymer/polymer/commit/3ece552))
+
+- Fix TOC re: host event listeners. ([commit](https://github.com/Polymer/polymer/commit/ce32459))
+
+- Fix compound bindings with braces in literals ([commit](https://github.com/Polymer/polymer/commit/561b28b))
+
+- Re-enable listeners of the form 'a.b' (todo: make this more efficient). ([commit](https://github.com/Polymer/polymer/commit/139257b))
+
+- Avoid stomping on property objects when mixing behaviors. ([commit](https://github.com/Polymer/polymer/commit/ec4d313))
+
+- Update test to avoid template polyfill issues. ([commit](https://github.com/Polymer/polymer/commit/fa96ff3))
+
+- Ensure parent node exists when stamping. Fixes #2685. ([commit](https://github.com/Polymer/polymer/commit/62f2d2a))
+
+- Add global leak test to runner. ([commit](https://github.com/Polymer/polymer/commit/dc2255c))
+
+- Add global leak test. ([commit](https://github.com/Polymer/polymer/commit/7f71b4c))
+
+- Fix typo that prevented correct functioning of Polymer.dom under Shadow DOM and add tests to catch. ([commit](https://github.com/Polymer/polymer/commit/cdc9fde))
+
+- maintain compatibility with older `_notifyChange` arguments. ([commit](https://github.com/Polymer/polymer/commit/f5aec30))
+
+- Weird assignment fix ([commit](https://github.com/Polymer/polymer/commit/9e6f77a))
+
+- add comment. ([commit](https://github.com/Polymer/polymer/commit/f2d5f44))
+
+- For efficiency, use cached events in data system, for property and path changes. ([commit](https://github.com/Polymer/polymer/commit/da71dfe))
+
+- Fixes #2690 ([commit](https://github.com/Polymer/polymer/commit/d8b78d4))
+
+- change after render method to `Polymer.RenderStatus.afterNextRender` ([commit](https://github.com/Polymer/polymer/commit/8949c04))
+
+- When effect values are applied via bindings, use fromAbove gambit to avoid unnecessary wheel spinning. (This is now possible since we have fast lookup for readOnly where we want to avoid doing the set at all). ([commit](https://github.com/Polymer/polymer/commit/c520907))
+
+- do readOnly check for configured properties where they are handed down, rather than when they are consumed. ([commit](https://github.com/Polymer/polymer/commit/24bcedb))
+
+- Minor cleanup. ([commit](https://github.com/Polymer/polymer/commit/0b21506))
+
+- Avoid creating unnecessary placeholders for full refresh. ([commit](https://github.com/Polymer/polymer/commit/996289a))
+
+- Simplify ([commit](https://github.com/Polymer/polymer/commit/c5e1135))
+
+- Fix typo. ([commit](https://github.com/Polymer/polymer/commit/680c56d))
+
+- Update docs. ([commit](https://github.com/Polymer/polymer/commit/352ccbe))
+
+- _removeInstance -> _detachAndRemoveInstance ([commit](https://github.com/Polymer/polymer/commit/ba7a16f))
+
+- Remove limit & chunkCount API. Refactor insert/remove. ([commit](https://github.com/Polymer/polymer/commit/f447c0e))
+
+- add back deepContains (got removed incorrectly in merge). ([commit](https://github.com/Polymer/polymer/commit/d53ab57))
+
+- fix line endings. ([commit](https://github.com/Polymer/polymer/commit/0233d6d))
+
+- revert host attributes ordering change optimization as it was not worth the trouble (barely measurable and more cumbersome impl). ([commit](https://github.com/Polymer/polymer/commit/f9894a0))
+
+- rename host functions fix typos afterFirstRender is now raf+setTimeout dom-repeat: remove cruft ([commit](https://github.com/Polymer/polymer/commit/d82840b))
+
+- Fix Gestures when using SD polyfill ([commit](https://github.com/Polymer/polymer/commit/96e4bfa))
+
+- Fix for multiple consequent spaces present in CSS selectors, fixes #2670 ([commit](https://github.com/Polymer/polymer/commit/ecddb56))
+
+- avoid configuration work when unnecessary ([commit](https://github.com/Polymer/polymer/commit/e0fbfbe))
+
+- lazily create effect objects so we can more easily abort processing. avoid forEach ([commit](https://github.com/Polymer/polymer/commit/66df196))
+
+- provides support for memoizing pathFn on effect; only process effects/listeners if they exist. ([commit](https://github.com/Polymer/polymer/commit/a2376b6))
+
+- memoize pathFn on effect (note: notifyPath change made in previous commit); avoid forEach. ([commit](https://github.com/Polymer/polymer/commit/d93340a))
+
+- Avoid using .slice and .forEach ([commit](https://github.com/Polymer/polymer/commit/d2c02a9))
+
+- Added support for short unicode escape sequences, fixes #2650 ([commit](https://github.com/Polymer/polymer/commit/2c87145))
+
+- Fix for BEM-like CSS selectors under media queries, fixes #2639. Small optimization for produced CSS (empty rules produced semicolon before, now empty string). ([commit](https://github.com/Polymer/polymer/commit/35c89f1))
+
+- Fix parsing of custom properties with 'var' in value ([commit](https://github.com/Polymer/polymer/commit/61abfbd))
+
+- Clean up cruft. ([commit](https://github.com/Polymer/polymer/commit/59c27fa))
+
+- Add tests and fix issues. ([commit](https://github.com/Polymer/polymer/commit/e99e5fa))
+
+- dom-repeat chunked/throttled render API ([commit](https://github.com/Polymer/polymer/commit/e9aebd7))
+
+- Fix formatting. ([commit](https://github.com/Polymer/polymer/commit/56734a7))
+
+- Add notes on running unit tests. ([commit](https://github.com/Polymer/polymer/commit/492f310))
+
+- Corrected method name. Fixes #2649. ([commit](https://github.com/Polymer/polymer/commit/5168604))
+
+- Fix typos in more efficient array copying. ([commit](https://github.com/Polymer/polymer/commit/53f3a7d))
+
+- Adds `Polymer.RenderStatus.afterFirstRender` method. Call to perform tasks after an element first renders. ([commit](https://github.com/Polymer/polymer/commit/71b5c2a))
+
+- More efficient array management in Polymer.DomApi. ([commit](https://github.com/Polymer/polymer/commit/320d5c7))
+
+- Fixes #2652 ([commit](https://github.com/Polymer/polymer/commit/e35c4e9))
+
+- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/0dc69df))
+
+- Fix whitespace around bindings. ([commit](https://github.com/Polymer/polymer/commit/d7d0ed6))
+
+- Add support for `strip-whitespace`. Should fix #2511. ([commit](https://github.com/Polymer/polymer/commit/35a1b94))
+
+- Improve efficiency of attribute configuration. ([commit](https://github.com/Polymer/polymer/commit/f7d86e9))
+
+- Remove use of Function.bind ([commit](https://github.com/Polymer/polymer/commit/25aab8b))
+
+- fix typos. ([commit](https://github.com/Polymer/polymer/commit/5fb20da))
+
+- Re-use data change events. Remove unused/undocumented listener object specific node listening feature. ([commit](https://github.com/Polymer/polymer/commit/8bdedf3))
+
+- Add flattened properties to dom-bind, templatizer, optimize by 'liming properties that are protected/private and not readOnly from list. ([commit](https://github.com/Polymer/polymer/commit/2ba08ec))
+
+- Use flattened list of properties for fast access during configuration and attribute->property ([commit](https://github.com/Polymer/polymer/commit/acdd242))
+
+- Assemble effect strings at prototype time. ([commit](https://github.com/Polymer/polymer/commit/4745e8f))
+
+- Fallback to string lookup to fix support for extra effects. ([commit](https://github.com/Polymer/polymer/commit/d3c4611))
+
+- Fix typo. ([commit](https://github.com/Polymer/polymer/commit/ead9adb))
+
+- Correct NodeList copying. ([commit](https://github.com/Polymer/polymer/commit/1d29e19))
+
+- Avoid Polymer.dom.setAttribute when unneeded. ([commit](https://github.com/Polymer/polymer/commit/9c5a404))
+
+- More efficient iteration. ([commit](https://github.com/Polymer/polymer/commit/23a9a06))
+
+- Avoid forEach ([commit](https://github.com/Polymer/polymer/commit/ebeaf80))
+
+- Copy dom NodeList faster than slice. ([commit](https://github.com/Polymer/polymer/commit/8cad475))
+
+- Avoid function lookup by string. ([commit](https://github.com/Polymer/polymer/commit/e2674bc))
+
+- Add test for parsing multi-line css comments ([commit](https://github.com/Polymer/polymer/commit/6f21ae6))
+
+## [v1.2.1](https://github.com/Polymer/polymer/tree/v1.2.1) (2015-10-29)
+- Fix test for SD polyfill ([commit](https://github.com/Polymer/polymer/commit/dd8b3e9))
+
+- Add pre-condition check for completeness. ([commit](https://github.com/Polymer/polymer/commit/89304dc))
+
+- Find non distributed children with deepContains ([commit](https://github.com/Polymer/polymer/commit/8e6f55a))
+
+- Ensure outer paths aren't forwarded to instance props. Fixes #2556. ([commit](https://github.com/Polymer/polymer/commit/01273e9))
+
+- Add `Polymer.dom.deepContains` ([commit](https://github.com/Polymer/polymer/commit/279bf63))
+
+- [ci skip] Update CHANGELOG ([commit](https://github.com/Polymer/polymer/commit/e1f83d2))
+
+- isLightDescendant should return false for self ([commit](https://github.com/Polymer/polymer/commit/a0debf4))
+
+- Fix for mixins declaration with space before colon. Allow any space character or even `{` and `}` (before and after capturing pattern correspondingly) as pattern boundaries instead of new lines only. In minified sources there might be no space, semicolon or line start, so we need to account that as well. ([commit](https://github.com/Polymer/polymer/commit/883aa5c))
+
+## [v1.2.0](https://github.com/Polymer/polymer/tree/v1.2.0) (2015-10-22)
+- A simpler travis config ([commit](https://github.com/Polymer/polymer/commit/3338b67))
+
+- Fix #2587: When Polymer.dom(el).appendChild(node) is called, cleanup work must be performed on the existing parent of node. This change fixes a missing case in this cleanup work: if the existing parent has a observer via `Polymer.dom(parent).observeNodes`, it needs to be notified that node is being removed even if the node does not have specific logical info. For example, if an observed node has no Shady DOM and has a child that is removed. A test for this case was added. ([commit](https://github.com/Polymer/polymer/commit/0d4f418))
+
+- add fancy travis status badge to the readme ([commit](https://github.com/Polymer/polymer/commit/e29fca8))
+
+- Do not configure compound property/attribute binding if literal if empty. Fixes #2583. ([commit](https://github.com/Polymer/polymer/commit/ca4724a))
+
+- Update .travis.yml ([commit](https://github.com/Polymer/polymer/commit/ef366c5))
+
+- Remove web-component-tester cache. ([commit](https://github.com/Polymer/polymer/commit/4ae23ce))
+
+- Fix IE10 regressions. Fixes #2582 * Copy attribute list before modifying it * Fall back to document for current document if no currentScript ([commit](https://github.com/Polymer/polymer/commit/ee65e68))
+
+- Allow _atEndOfMicrotask to be patchable. ([commit](https://github.com/Polymer/polymer/commit/e2d8446))
+
+- contributing copy fixup ([commit](https://github.com/Polymer/polymer/commit/ed22c50))
+
+- Update CONTRIBUTING.md ([commit](https://github.com/Polymer/polymer/commit/0c21efc))
+
+- Add travis config ([commit](https://github.com/Polymer/polymer/commit/6fb7684))
+
+- Factor into functions. ([commit](https://github.com/Polymer/polymer/commit/b2117dc))
+
+- Fix deepEqual on Safari 9 due to Safari enumeration bug. ([commit](https://github.com/Polymer/polymer/commit/445d603))
+
+- ensure distribution observers see all changes that can come from attributes under native Shadow DOM; +minor factoring ([commit](https://github.com/Polymer/polymer/commit/344f5cc))
+
+- Add <content>.getDistributedNodes observation. Refactor flush. ([commit](https://github.com/Polymer/polymer/commit/8b1face))
+
+- Add docs ([commit](https://github.com/Polymer/polymer/commit/0ede79a))
+
+- Make shadow attribute tracking automatic based on detecting a <content select> that depends on attributes; add tests. ([commit](https://github.com/Polymer/polymer/commit/54911a7))
+
+- Add comments. ([commit](https://github.com/Polymer/polymer/commit/758c483))
+
+- Fix typo. ([commit](https://github.com/Polymer/polymer/commit/74a87a0))
+
+- Replace _compoundInitializationEffect with statically-initialized literals in the template for attributes & textContent, and by configuring literal values of properties in _configureAnnotationReferences. ([commit](https://github.com/Polymer/polymer/commit/2f1bd31))
+
+- Simplify change tracking by always dirty checking at the observer level. Under Shadow DOM, use a deep MO to watch for attributes. ([commit](https://github.com/Polymer/polymer/commit/669acaa))
+
+- Fix URL to component.kitchen ([commit](https://github.com/Polymer/polymer/commit/d9af504))
+
+- Update the Google+ community link ([commit](https://github.com/Polymer/polymer/commit/c6684e5))
+
+- Fixes from review. ([commit](https://github.com/Polymer/polymer/commit/a300862))
+
+- Remove compound binding limitation from primer. ([commit](https://github.com/Polymer/polymer/commit/b1c1b35))
+
+- Exclude compound bindings from configure; revisit later. ([commit](https://github.com/Polymer/polymer/commit/1035e2d))
+
+- Apply effect value from compound parts. ([commit](https://github.com/Polymer/polymer/commit/c30ac10))
+
+- Store binding parts in notes. ([commit](https://github.com/Polymer/polymer/commit/1026498))
+
+- Fix missing var ([commit](https://github.com/Polymer/polymer/commit/68edb83))
+
+- Add radix for correctness. ([commit](https://github.com/Polymer/polymer/commit/a79f012))
+
+- Separate public & private get, flip conditions, add notifyPath API. ([commit](https://github.com/Polymer/polymer/commit/97503ec))
+
+- Fix typo in comments. ([commit](https://github.com/Polymer/polymer/commit/e59dbef))
+
+- Improvements to path API. Fixes #2509. * Allows `set` to take paths with array #keys * Allows `notifyPath` to take paths with array indices * Exposes public notifySplices API ([commit](https://github.com/Polymer/polymer/commit/10021cc))
+
+- Fix merge issue. ([commit](https://github.com/Polymer/polymer/commit/85c23e1))
+
+- Denote keys with # to disambiguate from index. Fixes #2007. ([commit](https://github.com/Polymer/polymer/commit/85d8a3a))
+
+- update CHANGELOG to 1.1.5 ([commit](https://github.com/Polymer/polymer/commit/b2b23c4))
+
+- make tests work on polyfill. ([commit](https://github.com/Polymer/polymer/commit/9ff2ee4))
+
+- add `observeNodes` tests. ([commit](https://github.com/Polymer/polymer/commit/bd90b57))
+
+- Add optional attribute tracking to support better distributed node notifications under shadow dom. ([commit](https://github.com/Polymer/polymer/commit/8242a98))
+
+- Add `Polymer.dom().notifyObservers` method to 'kick' observers, for example, when attributes change under Shadow DOM. ([commit](https://github.com/Polymer/polymer/commit/07261e4))
+
+- Add mutation tracking for distributedNodes. ([commit](https://github.com/Polymer/polymer/commit/b11f86b))
+
+- Factor dom-api's into separate helpers. ([commit](https://github.com/Polymer/polymer/commit/effedcb))
+
+- Adds `Polymer.dom(element).observeChildren(callback)` api ([commit](https://github.com/Polymer/polymer/commit/6499e83))
+
+- Adds `getEffectiveChildNodes`, `getEffectiveChildren`, `getEffectiveTextContent` ([commit](https://github.com/Polymer/polymer/commit/f34fb45))
+
+## [v1.1.5](https://github.com/Polymer/polymer/tree/v1.1.5) (2015-10-08)
+- Simplify ([commit](https://github.com/Polymer/polymer/commit/79dfe1f))
+
+- Clean up templatizer _pathEffectorImpl. ([commit](https://github.com/Polymer/polymer/commit/1a89bcf))
+
+- Add issue link. ([commit](https://github.com/Polymer/polymer/commit/e4c2433))
+
+- Missing var keyword ([commit](https://github.com/Polymer/polymer/commit/45fcbcf))
+
+- Make sure we only actually call _listen once ([commit](https://github.com/Polymer/polymer/commit/837e9b8))
+
+- Add templatizer tests. Fix issues from tests. ([commit](https://github.com/Polymer/polymer/commit/2d97cd7))
+
+- Use 'value' in place of 'object' when referring to detail. ([commit](https://github.com/Polymer/polymer/commit/f17be35))
+
+- Allow any type, not just objects, as the detail for fire. ([commit](https://github.com/Polymer/polymer/commit/ec59f57))
+
+- Make model param of stamp method optional. ([commit](https://github.com/Polymer/polymer/commit/a2e1e64))
+
+- add test to ensure unlisten events do not fire ([commit](https://github.com/Polymer/polymer/commit/bf2f694))
+
+- add tests ([commit](https://github.com/Polymer/polymer/commit/900d82b))
+
+- Only one real listener per `listen` call ([commit](https://github.com/Polymer/polymer/commit/8bd380a))
+
+- add util method for shadow children ([commit](https://github.com/Polymer/polymer/commit/1e9110a))
+
+- Add notify-path API to templatized template. Fixes #2505. ([commit](https://github.com/Polymer/polymer/commit/2e086fe))
+
+- Parent property values should come from template. Fixes #2504. ([commit](https://github.com/Polymer/polymer/commit/23c883b))
+
+- Added note about including a clear repro case. ([commit](https://github.com/Polymer/polymer/commit/e18f009))
+
+- added request to submit an issue before sending a PR ([commit](https://github.com/Polymer/polymer/commit/6ed836f))
+
+- update CHANGELOG to 1.1.4 ([commit](https://github.com/Polymer/polymer/commit/c2b7c31))
+
+## [v1.1.4](https://github.com/Polymer/polymer/tree/v1.1.4) (2015-09-25)
+- :memo: Update description ([commit](https://github.com/Polymer/polymer/commit/6afb8be))
+
+- :art: Use npm command bin lookup ([commit](https://github.com/Polymer/polymer/commit/84258d4))
+
+- :grapes: Add missing test dependency ([commit](https://github.com/Polymer/polymer/commit/5726b8e))
+
+- Reset handlers queue after finished replaying events ([commit](https://github.com/Polymer/polymer/commit/76a5f17))
+
+- Update the README.md to Polymer 1.1 ([commit](https://github.com/Polymer/polymer/commit/40c455a))
+
+- Add note on arrayDelete with array vs. path ([commit](https://github.com/Polymer/polymer/commit/d2b71a5))
+
+- Add unlinkPath tests. ([commit](https://github.com/Polymer/polymer/commit/bee110b))
+
+- Update changelog ([commit](https://github.com/Polymer/polymer/commit/573ca29))
+
+- Remove dead code; add tests. ([commit](https://github.com/Polymer/polymer/commit/ab85884))
+
+- Allow multiple paths to be linked using linkPath. Fixes #2048 ([commit](https://github.com/Polymer/polymer/commit/b221dbe))
+
+- Fix docs for stamp method ([commit](https://github.com/Polymer/polymer/commit/8adbe60))
+
+- http to https for jsbin ([commit](https://github.com/Polymer/polymer/commit/d842435))
+
+- Typo ([commit](https://github.com/Polymer/polymer/commit/d558c0d))
+
+- Fix typos in PRIMER.md ([commit](https://github.com/Polymer/polymer/commit/cf793f4))
+
+## [v1.1.3](https://github.com/Polymer/polymer/tree/v1.1.3) (2015-09-04)
+- Fixes #2403 ([commit](https://github.com/Polymer/polymer/commit/a6694b7))
+
+- Only try to decrement gesture dependency counter if dependency exists ([commit](https://github.com/Polymer/polymer/commit/8886e8c))
+
+- update changelog with v1.1.2 ([commit](https://github.com/Polymer/polymer/commit/d3a7c93))
+
+- prepare v1.1.2 ([commit](https://github.com/Polymer/polymer/commit/e78be4f))
+
+## [v1.1.2](https://github.com/Polymer/polymer/tree/v1.1.2) (2015-08-28)
+- Improve composed parent tracking. ([commit](https://github.com/Polymer/polymer/commit/4d15789))
+
+- move the mixing-in of behaviors so that it happens before `register` behaviors are invoked ([commit](https://github.com/Polymer/polymer/commit/637367c))
+
+- Fixes #2378 ([commit](https://github.com/Polymer/polymer/commit/a9f081b))
+
+- Fixes #2356: issue a warning and don't throw an exception when a style include cannot be found. Fixes #2357: include data now comes before any textContent in a style element. ([commit](https://github.com/Polymer/polymer/commit/a16ada1))
+
+- remove unneeded protection code for extends. ([commit](https://github.com/Polymer/polymer/commit/8eada87))
+
+- Add test ([commit](https://github.com/Polymer/polymer/commit/47ff0e8))
+
+- add test for `registered` behavior affecting a value then used by features ([commit](https://github.com/Polymer/polymer/commit/230528c))
+
+- add tests for new Polymer() argument support (and make Base tests aware of new abstract method `_desugarBehaviors`) ([commit](https://github.com/Polymer/polymer/commit/9734a3a))
+
+- invoke `registration` behavior before registering features, so behaviors can alter features, this requires calling behavior flattening as part of prototype desugaring instead of as part of behavior prep, so the flattened list is available early ([commit](https://github.com/Polymer/polymer/commit/6224dc3))
+
+- do `registered` behaviors before invoking `registerFeatures` so `registered` can affect properties used by features (ref #2329) ([commit](https://github.com/Polymer/polymer/commit/61d611c))
+
+- specifically create `Polymer` object on `window` to satisfy strict mode (fixes #2363) ([commit](https://github.com/Polymer/polymer/commit/a75133d))
+
+- Remove forceUpgraded check in dom-module.import ([commit](https://github.com/Polymer/polymer/commit/b85b641))
+
+- Fixes #2341: branch Polymer.dom to use native dom methods under Shadow DOM for: appendChild, insertBefore, removeChild, replaceChild, cloneNode. ([commit](https://github.com/Polymer/polymer/commit/9b1f706))
+
+- Fixes #2334: when composing nodes in shady dom, check if a node is where we expect it to be before removing it from its distributed position. We do this because the node may have been moved by Polymer.dom in a way that triggered distribution of its previous location. The node is already where it needs to be so removing it from its parent when it's no longer distributed is destructive. ([commit](https://github.com/Polymer/polymer/commit/4ea69c2))
+
+- use cached template annotations when possible ([commit](https://github.com/Polymer/polymer/commit/b0733d3))
+
+- fix comment typos ([commit](https://github.com/Polymer/polymer/commit/a0a3e0c))
+
+- Update changelog with v1.1.1 release ([commit](https://github.com/Polymer/polymer/commit/12fa867))
+
+## [v1.1.1](https://github.com/Polymer/polymer/tree/v1.1.1) (2015-08-20)
+- Fixes #2263: ensure custom-style can parse variable definitions in supported selectors (e.g. /deep/) without exception due to unknown css. ([commit](https://github.com/Polymer/polymer/commit/894492b))
+
+- Fixes #2311, #2323: when elements are removed from their previous position when they are added elsewhere, make sure to remove them from composed, not logical parent. ([commit](https://github.com/Polymer/polymer/commit/3d93116))
+
+- Update Changelog ([commit](https://github.com/Polymer/polymer/commit/039ef93))
+
+- Add selectedItem property ([commit](https://github.com/Polymer/polymer/commit/d65acd0))
+
+- Add test for large splice ([commit](https://github.com/Polymer/polymer/commit/c967583))
+
+- Use numeric sort when removing dom-repeat instances ([commit](https://github.com/Polymer/polymer/commit/fccbd8a))
+
+- Fixes #2267: properly find dom-module for mixed case elements ([commit](https://github.com/Polymer/polymer/commit/76c58b8))
+
+- Fixes #2304: avoid trying to read style data from imports that did not load. ([commit](https://github.com/Polymer/polymer/commit/0d1f206))
+
+- Avoid saving logical info on parent when a content is added inside a fragment + slight factoring. ([commit](https://github.com/Polymer/polymer/commit/36072be))
+
+- Fixes #2276: avoid losing logical information and simplify logical tree handling ([commit](https://github.com/Polymer/polymer/commit/ee61627))
+
+- Moved check earlier. Added test for negative literal. ([commit](https://github.com/Polymer/polymer/commit/1a87ab4))
+
+- Fixes #2253: refine logical tree check and populate parents of insertion points with logical info only if necessary. Fixes #2283: when a node is removed, we need to potentially distribute not only its host but also its parent. ([commit](https://github.com/Polymer/polymer/commit/6619f6c))
+
+- Support for negative numbers in computed bindings ([commit](https://github.com/Polymer/polymer/commit/fc53f50))
+
+## [v1.1.0](https://github.com/Polymer/polymer/tree/v1.1.0) (2015-08-13)
+- Add comment. ([commit](https://github.com/Polymer/polymer/commit/337b54a))
+
+- Add tests for key splice fix. ([commit](https://github.com/Polymer/polymer/commit/4bc055b))
+
+- Fixes #2251: resolve imported stylesheets against correct document. ([commit](https://github.com/Polymer/polymer/commit/68af666))
+
+- Reduce keySplices to minimum change set before notifying. Fixes #2261 ([commit](https://github.com/Polymer/polymer/commit/f74d072))
+
+- Make `clearSelection` public. ([commit](https://github.com/Polymer/polymer/commit/7497729))
+
+- Add logical info iff an element being added is an insertion point; do not add logical info for any element in a shady root. ([commit](https://github.com/Polymer/polymer/commit/45cb150))
+
+- Make `clearSelection` public. ([commit](https://github.com/Polymer/polymer/commit/d55be7d))
+
+- Fixes #2235. Manages logical information in shady distribution more directly by capturing it explicitly when needed and not whenever distribution is run. ([commit](https://github.com/Polymer/polymer/commit/21500fb))
+
+- ensure path fixup is applied correctly to styles in templates. ([commit](https://github.com/Polymer/polymer/commit/b22f3cd))
+
+- Based on feedback, change `module` to `include` in custom-style and dom-module style marshaling. ([commit](https://github.com/Polymer/polymer/commit/f469129))
+
+- Document custom-style module property. ([commit](https://github.com/Polymer/polymer/commit/398d9f7))
+
+- Add comment. ([commit](https://github.com/Polymer/polymer/commit/4e640c7))
+
+- Add tests and require `module` to be on `style` elements. ([commit](https://github.com/Polymer/polymer/commit/58d3c3b))
+
+- `custom-style` supports `module` property that accepts a `dom-module` containing style data. `don-module` style data may be specified inside `<template>` elements and style elements also support module attribute for referencing additional modules containing style data. ([commit](https://github.com/Polymer/polymer/commit/3734c4d))
+
+- don-module no longer needs to eagerly upgrade custom elements since the web components polyfills do this automatically. ([commit](https://github.com/Polymer/polymer/commit/051e1bf))
+
+## [v1.0.9](https://github.com/Polymer/polymer/tree/v1.0.9) (2015-08-07)
+- Remove undocumented return value. ([commit](https://github.com/Polymer/polymer/commit/1764d0c))
+
+- Add default, update docs. ([commit](https://github.com/Polymer/polymer/commit/ca267a5))
+
+- Add tests for isSelected. ([commit](https://github.com/Polymer/polymer/commit/15d63ef))
+
+- Default selected to empty array. Add isSelected API. ([commit](https://github.com/Polymer/polymer/commit/d4e7140))
+
+- Fixes #2218: match style properties against scope transformed selector (not property unique selector) ([commit](https://github.com/Polymer/polymer/commit/c9e9062))
+
+- Remove notify for items (unnecessary). ([commit](https://github.com/Polymer/polymer/commit/a370860))
+
+- Uncomment line. ([commit](https://github.com/Polymer/polymer/commit/b25330b))
+
+- Give toggle a default. ([commit](https://github.com/Polymer/polymer/commit/db9bda5))
+
+- Use multi-prop observer; default selected to null. ([commit](https://github.com/Polymer/polymer/commit/ba4bf38))
+
+- Add tests. Reset selection on items/multi change. Remove async. ([commit](https://github.com/Polymer/polymer/commit/5bca55b))
+
+- Property matching must check non-transformed rule selector. ([commit](https://github.com/Polymer/polymer/commit/5b9a5ce))
+
+- Make _itemsChanged depend on multi. ([commit](https://github.com/Polymer/polymer/commit/1b21397))
+
+- Make sure mouse position is not a factor for .click() in IE 10 ([commit](https://github.com/Polymer/polymer/commit/1a2fb4d))
+
+- Always trigger tap for synthetic click events ([commit](https://github.com/Polymer/polymer/commit/1eef1a7))
+
+- Fixes #2193: Implements workaround for https://code.google.com/p/chromium/issues/detail?id=516550 by adding Polymer.RenderStatus.whenReady and using it to defer `attached` ([commit](https://github.com/Polymer/polymer/commit/2bffc4c))
+
+- Fix polyfill templates ([commit](https://github.com/Polymer/polymer/commit/d78c934))
+
+- Use `_clientsReadied` to avoid missing attribute->property sets in ready. ([commit](https://github.com/Polymer/polymer/commit/165f716))
+
+- Make propagation of attribute changes at configure time more efficient ([commit](https://github.com/Polymer/polymer/commit/b269c1d))
+
+- add offsetParent smoke tests ([commit](https://github.com/Polymer/polymer/commit/0b2cfae))
+
+- Fixes #1673: ensure instance effects exist before marshaling attributes. ([commit](https://github.com/Polymer/polymer/commit/7c83df5))
+
+- Fix typo. ([commit](https://github.com/Polymer/polymer/commit/97944e4))
+
+- Clarify `fire` option defaults. Fixes #2180 ([commit](https://github.com/Polymer/polymer/commit/7c3e516))
+
+- Add cross-reference for API docs. Fixes #2180 ([commit](https://github.com/Polymer/polymer/commit/9bdcc3b))
+
+- Updated utils & removed fn signatures; defer to API docs. Fixes #2180 ([commit](https://github.com/Polymer/polymer/commit/b9b86d5))
+
+- Update core- to iron-ajax in PRIMER.md as in Polymer/docs#1276, Polymer/docs#1275 ([commit](https://github.com/Polymer/polymer/commit/e99358a))
+
+- Update core- to iron-ajax in jsdoc for dom-bind as in Polymer/docs#1276, Polymer/docs#1275 ([commit](https://github.com/Polymer/polymer/commit/07327c0))
+
+- Make properties replacement robust against properties which start with a leading `;` ([commit](https://github.com/Polymer/polymer/commit/3ea0333))
+
+- Fixes #2154: ensure Polymer.dom always sees wrapped nodes when ShadowDOM polyfill is in use. ([commit](https://github.com/Polymer/polymer/commit/fc90aa0))
+
+- Use css parser's property stripping code in custom-style. ([commit](https://github.com/Polymer/polymer/commit/756ef1b))
+
+- Deduplicate track/untrack document event listener logic ([commit](https://github.com/Polymer/polymer/commit/53037d4))
+
+- Automatically filter mouseevents without the left mouse button ([commit](https://github.com/Polymer/polymer/commit/bbc3b57))
+
+- Fixes #2113: ensures custom-style rules that use @apply combined with defining properties apply correctly. ([commit](https://github.com/Polymer/polymer/commit/69a4aa5))
+
+- Correct & simplify per spec. ([commit](https://github.com/Polymer/polymer/commit/7b8b7fd))
+
+- Clean up logic. ([commit](https://github.com/Polymer/polymer/commit/d4deb5d))
+
+- More loosely match expression function names ([commit](https://github.com/Polymer/polymer/commit/6cfa759))
+
+- Fix link to direct to Cross-scope styling ([commit](https://github.com/Polymer/polymer/commit/f9c58bc))
+
+- Update behaviors order. Fixes #2144. ([commit](https://github.com/Polymer/polymer/commit/2a51661))
+
+- Cache style.display & textContent and re-apply on true. Fixes #2037 ([commit](https://github.com/Polymer/polymer/commit/2611285))
+
+- Fixes #2118: force element `is` to be lowercase: mixing case causes confusion and breaks style shimming for type extensions. ([commit](https://github.com/Polymer/polymer/commit/c8905f9))
+
+- Allow array API's accept string & negative args. Fixes #2062. Brings the API more in line with native splice, etc. ([commit](https://github.com/Polymer/polymer/commit/7e2ceeb))
+
+- Fix #2107: improve binding expression parser to match valid javascript property names. ([commit](https://github.com/Polymer/polymer/commit/7560130))
+
+## [v1.0.8](https://github.com/Polymer/polymer/tree/v1.0.8) (2015-07-23)
+- Disable tracking if scrolling ([commit](https://github.com/Polymer/polymer/commit/ee5177d))
+
+- Fixes #2125: adds a register method to dom-module to support imperative creation. ([commit](https://github.com/Polymer/polymer/commit/861f4aa))
+
+- Move recognizer reset into start of event flow ([commit](https://github.com/Polymer/polymer/commit/a7495f7))
+
+- Fixed small typo on PRIMER.md ([commit](https://github.com/Polymer/polymer/commit/bc40821))
+
+- remove alternate calculation for _rootDataHost ([commit](https://github.com/Polymer/polymer/commit/26663cd))
+
+- Don't call `dom-change` when detached. ([commit](https://github.com/Polymer/polymer/commit/bdb8fa3))
+
+- Fix typo. ([commit](https://github.com/Polymer/polymer/commit/65911bd))
+
+- Improve code formatting. ([commit](https://github.com/Polymer/polymer/commit/3968c84))
+
+- Up flush MAX to 100 and add overflow warning. ([commit](https://github.com/Polymer/polymer/commit/8bcc416))
+
+- Fixes #1998: add api doc for `customStyle` property ([commit](https://github.com/Polymer/polymer/commit/91577c9))
+
+- Handle commentnodes correctly for textContent and innerHTML ([commit](https://github.com/Polymer/polymer/commit/6d56d2b))
+
+- Fixes #2098: don't accept undefined values as initial config ([commit](https://github.com/Polymer/polymer/commit/1a5c391))
+
+- Remove key check; int check should guarantee key. ([commit](https://github.com/Polymer/polymer/commit/dbf833e))
+
+- Add unit tests. ([commit](https://github.com/Polymer/polymer/commit/bc4b142))
+
+- Allow setting non-index array properties. Fixes #2096. ([commit](https://github.com/Polymer/polymer/commit/f8cad94))
+
+- update tests. ([commit](https://github.com/Polymer/polymer/commit/8922323))
+
+- added `render` method to dom-bind which can be called when async imports are used; documented template render functions ([commit](https://github.com/Polymer/polymer/commit/348896a))
+
+- Fixes #2039: Polymer.dom.flush now triggers Custom Elements polyfill mutations and includes an api (`Polymer.dom.addDebouncer(debouncer)`) for adding debouncers which should run at flush time. Template rendering debouncers are placed in the flush list. ([commit](https://github.com/Polymer/polymer/commit/89a767c))
+
+- Fixes #2010, fixes #1818: Shady dom mutations which trigger additional mutations are now successfully enqueued. ([commit](https://github.com/Polymer/polymer/commit/a26247b))
+
+- debounce returns debouncer. ([commit](https://github.com/Polymer/polymer/commit/fb52120))
+
+- Update index.html ([commit](https://github.com/Polymer/polymer/commit/119df98))
+
+## [v1.0.7](https://github.com/Polymer/polymer/tree/v1.0.7) (2015-07-16)
+- Replace placeholders backwards to simplify. ([commit](https://github.com/Polymer/polymer/commit/5eda235))
+
+- Remove unnecessary keys bookkeeping. ([commit](https://github.com/Polymer/polymer/commit/3e02bfd))
+
+- Minor tweaks to comments, internal API consistency. ([commit](https://github.com/Polymer/polymer/commit/82958d4))
+
+- Always use placeholders; fix insertion reference bug. ([commit](https://github.com/Polymer/polymer/commit/4a45d4f))
+
+- Simplify. ([commit](https://github.com/Polymer/polymer/commit/4eda393))
+
+- Rename variables for clarity. ([commit](https://github.com/Polymer/polymer/commit/15c1241))
+
+- Fix reuse logic to handle multiple mutations in same turn. Fixes #2009. ([commit](https://github.com/Polymer/polymer/commit/1bf5f6d))
+
+- Be more explicit. ([commit](https://github.com/Polymer/polymer/commit/a6bd5a5))
+
+- Add Polymer.instanceof & isInstance. Fixes #2083. ([commit](https://github.com/Polymer/polymer/commit/7954f93))
+
+- Fixes #2081: make Polymer.dom(element).getDistributedNodes and Polymer.dom(element).getDestinationInsertionPoints() always return at least an empty array (was generating exception under Shadow DOM); make element.getContentChildNodes and element.getContentChildren always return at least an empty array when a selector is passed that does not find a <content> (was generating exception under Shadow DOM) ([commit](https://github.com/Polymer/polymer/commit/f966381))
+
+- Fixes #2077: workaround IE text node splitting issue that can make text bindings fail. ([commit](https://github.com/Polymer/polymer/commit/312d11f))
+
+- Fixes #2078: when computing custom style properties, make sure the styling scope is valid when the element is attached to a shadowRoot whose host is not a Polymer element. ([commit](https://github.com/Polymer/polymer/commit/fab2ed7))
+
+- update CHANGELOG for 1.0.6 ([commit](https://github.com/Polymer/polymer/commit/c46ec11))
+
+\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/GitHub-Changelog-Generator) below*
+## [v1.0.6](https://github.com/Polymer/polymer/tree/v1.0.6) (2015-07-09)
+
+**Fixed issues:**
+
+- Basic support for host-context [\#1895](https://github.com/Polymer/polymer/issues/1895)
+
+- custom property resolver tripping over some selectors? [\#1938](https://github.com/Polymer/polymer/issues/1938)
+
+- Parsing compressed CSS does not work [\#1927](https://github.com/Polymer/polymer/issues/1927)
+
+- Support Polymer.dom().classList.contains [\#1907](https://github.com/Polymer/polymer/issues/1907)
+
+- Add support for :host-context [\#1900](https://github.com/Polymer/polymer/issues/1900)
+
+- Grey overlay in mobile Safari [\#1970](https://github.com/Polymer/polymer/issues/1970)
+
+- `node.unlisten` removes native event listeners too often [\#1988](https://github.com/Polymer/polymer/issues/1988)
+
+- `notifyPath` doesn't return as its documentation says [\#1966](https://github.com/Polymer/polymer/issues/1966)
+
+- "TypeError: Cannot set property 'display' of undefined" when HTML comment is present inside a dom-if template that evaluates to truthy [\#1786](https://github.com/Polymer/polymer/issues/1786)
+
+- `dom-repeat` in a falsy `dom-if` should hide newly stamped children [\#1751](https://github.com/Polymer/polymer/issues/1751)
+
+- Typo in Polymer.mixin API documentation [\#2001](https://github.com/Polymer/polymer/issues/2001)
+
+- Low-level changes for `iron-list` integration (`fire` & `modelForElement`) [\#2003](https://github.com/Polymer/polymer/issues/2003)
+
+- Normalized event difference with ShadowDOM and Shady [\#1921](https://github.com/Polymer/polymer/issues/1921)
+
+- DOM API innerHTML adds only first element [\#1972](https://github.com/Polymer/polymer/issues/1972)
+
+- with Polymer\#1.05-update, style-sheets and custom-style-elements are not parsed in my project anymore [\#1974](https://github.com/Polymer/polymer/issues/1974)
+
+- Expected behavior for importNode,cloneNode [\#1888](https://github.com/Polymer/polymer/issues/1888)
+
+- \#1.0.5 computed property function name limitations? [\#2016](https://github.com/Polymer/polymer/issues/2016)
+
+## [v1.0.5](https://github.com/Polymer/polymer/tree/v1.0.5) (2015-06-25)
+
+**Fixed issues:**
+
+- Bindings to concrete types not propagating correctly from template to collection [\#1839](https://github.com/Polymer/polymer/issues/1839)
+
+- Setting individual array elements not working [\#1854](https://github.com/Polymer/polymer/issues/1854)
+
+- `CustomStyle` change has no effect [\#1851](https://github.com/Polymer/polymer/issues/1851)
+
+- With Shady DOM, `<content>` doesn't get passed to another element inside `dom-if` [\#1902](https://github.com/Polymer/polymer/issues/1902)
+
+- Provide a convenience method for setting `customStyle` and calling `updateStyles` [\#1915](https://github.com/Polymer/polymer/issues/1915)
+
+- If an `async` callback throws an error, it's never removed from the callback list [\#1759](https://github.com/Polymer/polymer/issues/1759)
+
+- `dom-if`: undefined is considered falsy only once [\#1742](https://github.com/Polymer/polymer/issues/1742)
+
+- Setting `readOnly` AND `computed` on properties [\#1925](https://github.com/Polymer/polymer/issues/1925)
+
+- `Uncaught TypeError: this.mixin is not a function` [\#1911](https://github.com/Polymer/polymer/issues/1911)
+
+- `Polymer.Base.async` "infinite loop" condition [\#1933](https://github.com/Polymer/polymer/issues/1933)
+
+- Custom property resolver tripping over some selectors? [\#1938](https://github.com/Polymer/polymer/issues/1938)
+
+- Annotated attribute binding issues [\#1874](https://github.com/Polymer/polymer/issues/1874)
+
+- Parsing compressed CSS does not work [\#1927](https://github.com/Polymer/polymer/issues/1927)
+
+## [v1.0.4](https://github.com/Polymer/polymer/tree/v1.0.4) (2015-06-17)
+
+**Closed issues:**
+
+- Error when i put a paper-input inside a paper-drawer-panel [\#1893](https://github.com/Polymer/polymer/issues/1893)
+
+- Open the website country restrictions [\#1885](https://github.com/Polymer/polymer/issues/1885)
+
+- Observers executed twice if defined in both the properties and the observers array [\#1884](https://github.com/Polymer/polymer/issues/1884)
+
+- If I set element property before component registered I cannot change it anymore [\#1882](https://github.com/Polymer/polymer/issues/1882)
+
+- Polymer icon set not scaling with size [\#1881](https://github.com/Polymer/polymer/issues/1881)
+
+- How binding a JSON in Polymer 1.0 [\#1878](https://github.com/Polymer/polymer/issues/1878)
+
+- Annotated attribute binding issues [\#1874](https://github.com/Polymer/polymer/issues/1874)
+
+- Paper Elements don't appear on site [\#1868](https://github.com/Polymer/polymer/issues/1868)
+
+- \[1.0\] Inserted content not toggled when inside dom-if [\#1862](https://github.com/Polymer/polymer/issues/1862)
+
+- Polymer Catalog -- link-related usability issue [\#1860](https://github.com/Polymer/polymer/issues/1860)
+
+- Issues with catalog on Chromium 37.0.2062.120, 41.0.2272.76, and Firefox 38.0 [\#1859](https://github.com/Polymer/polymer/issues/1859)
+
+- documentation bug; search elements [\#1858](https://github.com/Polymer/polymer/issues/1858)
+
+- can I two way binding a properties type of 'Number' to attribute? [\#1856](https://github.com/Polymer/polymer/issues/1856)
+
+- 'this' points to Window rather than custom element when called through setTimeOut\(\) [\#1853](https://github.com/Polymer/polymer/issues/1853)
+
+- Cannot define an element in the main document \(Firefox and Internet explorer\) [\#1850](https://github.com/Polymer/polymer/issues/1850)
+
+- Feature: array variable accessor [\#1849](https://github.com/Polymer/polymer/issues/1849)
+
+- Support for expressions and filters [\#1847](https://github.com/Polymer/polymer/issues/1847)
+
+- key/value iteration support for template dom-repeat [\#1846](https://github.com/Polymer/polymer/issues/1846)
+
+- Styling local DOM [\#1842](https://github.com/Polymer/polymer/issues/1842)
+
+- Polymer bouded property not updating - or getting reset \(sometimes\) [\#1840](https://github.com/Polymer/polymer/issues/1840)
+
+- insertRule\('body /deep/ myclass' + ' {' + cssText + '}', index\); throws error in ff and ie [\#1836](https://github.com/Polymer/polymer/issues/1836)
+
+- this.insertRule\("body /deep/ someclass", index\); error [\#1835](https://github.com/Polymer/polymer/issues/1835)
+
+- \<core-scaffold\> 0.5 toolbar background coloring broken [\#1834](https://github.com/Polymer/polymer/issues/1834)
+
+- Radio buttons break when using border-box [\#1832](https://github.com/Polymer/polymer/issues/1832)
+
+- polymer 1.0 how to use dom-if ? [\#1828](https://github.com/Polymer/polymer/issues/1828)
+
+- Remove the undocumented "find nearest template" feature when registering [\#1827](https://github.com/Polymer/polymer/issues/1827)
+
+- Remove `preventDefault` from track [\#1824](https://github.com/Polymer/polymer/issues/1824)
+
+- Need a way to cancel track and tap from down [\#1823](https://github.com/Polymer/polymer/issues/1823)
+
+- Computed bindings are not updated when using polymer's this.push to add elements [\#1822](https://github.com/Polymer/polymer/issues/1822)
+
+- Two-way bindings to array members not updating when data edited in dom-repeat template \(bug or feature?\) [\#1821](https://github.com/Polymer/polymer/issues/1821)
+
+- Binding undefined does not work as expected [\#1813](https://github.com/Polymer/polymer/issues/1813)
+
+- Can't declare Boolean attributes with default of true? [\#1812](https://github.com/Polymer/polymer/issues/1812)
+
+- array-selector doesn't work with `multi` unless `toggle` is specified [\#1810](https://github.com/Polymer/polymer/issues/1810)
+
+- Style shim only converts a single ::shadow or /deep/ in a selector [\#1809](https://github.com/Polymer/polymer/issues/1809)
+
+- Incorrect style for custom CSS properties when extending a native element [\#1807](https://github.com/Polymer/polymer/issues/1807)
+
+- Document compatibility with browser [\#1805](https://github.com/Polymer/polymer/issues/1805)
+
+- Unwrapped dom-if causes DOMException [\#1804](https://github.com/Polymer/polymer/issues/1804)
+
+- \<template is=dom-if\> fails to add rows to a table if they contain \<content\> [\#1800](https://github.com/Polymer/polymer/issues/1800)
+
+- Data binding causes infinite loop if value is NaN [\#1799](https://github.com/Polymer/polymer/issues/1799)
+
+- Issues with polymer 1.0 dom-repeat templates using paper-radio-group and the selected property [\#1792](https://github.com/Polymer/polymer/issues/1792)
+
+- bind attribute replacement [\#1790](https://github.com/Polymer/polymer/issues/1790)
+
+- The Shadows sucks [\#1788](https://github.com/Polymer/polymer/issues/1788)
+
+- Is there a list of Polymer 1.0 elements in the documentations? as it used to be 0.5! [\#1782](https://github.com/Polymer/polymer/issues/1782)
+
+- Custom style variables for elements added outside of polymer [\#1781](https://github.com/Polymer/polymer/issues/1781)
+
+- Can I recover the contaminated DOM? [\#1779](https://github.com/Polymer/polymer/issues/1779)
+
+- \[1.0\] Data-binding: Is there any way to do this imperatively? [\#1778](https://github.com/Polymer/polymer/issues/1778)
+
+- DATA-BINDING [\#1772](https://github.com/Polymer/polymer/issues/1772)
+
+- \[1.0\] polymer attribute used in a string behaving differently from 0.5 [\#1770](https://github.com/Polymer/polymer/issues/1770)
+
+- \[1.0.2\] Setting property treated as idempotent, but isn't [\#1768](https://github.com/Polymer/polymer/issues/1768)
+
+- official element-table bower package [\#1767](https://github.com/Polymer/polymer/issues/1767)
+
+- Shopping card polymer element [\#1766](https://github.com/Polymer/polymer/issues/1766)
+
+- How to create a polymer element from iron-ajax element response [\#1764](https://github.com/Polymer/polymer/issues/1764)
+
+- iron-collapse is focusable \(by clicking or tabbing into it\), which produces a focus outline in browsers [\#1760](https://github.com/Polymer/polymer/issues/1760)
+
+- dom-repeat data binding: not working as expected [\#1758](https://github.com/Polymer/polymer/issues/1758)
+
+- \[1.0.3\] Do not resolve hash-only urls used for routing [\#1757](https://github.com/Polymer/polymer/issues/1757)
+
+- \[1.0.3\]Cannot start up after upgrade [\#1754](https://github.com/Polymer/polymer/issues/1754)
+
+- Content nodes in `dom-if` template do not distribute correctly [\#1753](https://github.com/Polymer/polymer/issues/1753)
+
+- overriding the custom css variables only works for the first dom element on the page [\#1752](https://github.com/Polymer/polymer/issues/1752)
+
+- paper-checkbox should have an indeterminate state [\#1749](https://github.com/Polymer/polymer/issues/1749)
+
+- nested dom-repeat with sort attribute shows duplicate entries when adding new items. [\#1744](https://github.com/Polymer/polymer/issues/1744)
+
+- `attached` handler executed in wrong order in chrome browser. [\#1743](https://github.com/Polymer/polymer/issues/1743)
+
+- \[1.0.2\] '$' is undefined when 'created' is being called [\#1728](https://github.com/Polymer/polymer/issues/1728)
+
+- \[1.0\] ::before / ::after psudo selectors in a custom-style [\#1668](https://github.com/Polymer/polymer/issues/1668)
+
+- Need Polymer.Base.unlisten to remove the event listener [\#1639](https://github.com/Polymer/polymer/issues/1639)
+
+- custom-style sometimes does not apply variables [\#1637](https://github.com/Polymer/polymer/issues/1637)
+
+- \[0.9.4\] Dom-if template doesn't stamp when its content contains a wrapped insertion point [\#1631](https://github.com/Polymer/polymer/issues/1631)
+
+- With \<template if=\> missing how can I have several different styles applied? [\#1419](https://github.com/Polymer/polymer/issues/1419)
+
+**Merged pull requests:**
+
+- Includes element defaults in the list of own properties by which elements are styled. [\#1891](https://github.com/Polymer/polymer/pull/1891) ([sorvell](https://github.com/sorvell))
+
+- Style shimming fixes [\#1857](https://github.com/Polymer/polymer/pull/1857) ([sorvell](https://github.com/sorvell))
+
+- Clear composedNodes when an element upgrades without an insertion point [\#1845](https://github.com/Polymer/polymer/pull/1845) ([sorvell](https://github.com/sorvell))
+
+- Allow user prevention of `tap` and `track` gestures from `down` [\#1843](https://github.com/Polymer/polymer/pull/1843) ([azakus](https://github.com/azakus))
+
+- Fix incorrect test for `toggle`. Fixes \#1810. [\#1841](https://github.com/Polymer/polymer/pull/1841) ([arthurevans](https://github.com/arthurevans))
+
+- Use var keyword when declaring local variable so it doesn't leak to global scope. [\#1838](https://github.com/Polymer/polymer/pull/1838) ([trevordixon](https://github.com/trevordixon))
+
+- No implicit template \(fixes \#1827\) [\#1837](https://github.com/Polymer/polymer/pull/1837) ([sjmiles](https://github.com/sjmiles))
+
+- Fix jsdoc for splice [\#1820](https://github.com/Polymer/polymer/pull/1820) ([jscissr](https://github.com/jscissr))
+
+- Fix dynamic insertion of wrapped or redistributing content. [\#1816](https://github.com/Polymer/polymer/pull/1816) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Handle NaN correctly in bindings [\#1811](https://github.com/Polymer/polymer/pull/1811) ([azakus](https://github.com/azakus))
+
+- Fix 1752 [\#1797](https://github.com/Polymer/polymer/pull/1797) ([sorvell](https://github.com/sorvell))
+
+- Do not apply/notify keySplices if array has not been Collectionified. Fixes \#1744 [\#1795](https://github.com/Polymer/polymer/pull/1795) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Use gulp-vulcanize concurrently for faster builds [\#1793](https://github.com/Polymer/polymer/pull/1793) ([azakus](https://github.com/azakus))
+
+- Fixes \#1757, do not resolve hash-only urls used for routing [\#1780](https://github.com/Polymer/polymer/pull/1780) ([nippur72](https://github.com/nippur72))
+
+- Add `unlisten` function [\#1740](https://github.com/Polymer/polymer/pull/1740) ([azakus](https://github.com/azakus))
+
+- Custom style fix [\#1638](https://github.com/Polymer/polymer/pull/1638) ([sorvell](https://github.com/sorvell))
+
+## [v1.0.3](https://github.com/Polymer/polymer/tree/v1.0.3) (2015-06-05)
+
+**Closed issues:**
+
+- paper-toolbar \[title\] conflicts with HTML \[title\] [\#1745](https://github.com/Polymer/polymer/issues/1745)
+
+- Bound data-\* attributes being stripped from template children [\#1737](https://github.com/Polymer/polymer/issues/1737)
+
+- Polymer.Base.splice and dom-repeat [\#1733](https://github.com/Polymer/polymer/issues/1733)
+
+- \[1.0.0\] Light DOM being replaced by shady DOM on ready [\#1732](https://github.com/Polymer/polymer/issues/1732)
+
+- \[1.0.2\] Databinding and nested objects [\#1731](https://github.com/Polymer/polymer/issues/1731)
+
+- Paper-tabs in Flexbox [\#1730](https://github.com/Polymer/polymer/issues/1730)
+
+- When not including `webcomponentsjs`, a script in `\<head\>` after imports will break `unresolved` attribute [\#1723](https://github.com/Polymer/polymer/issues/1723)
+
+- Create 1.0.x Release [\#1721](https://github.com/Polymer/polymer/issues/1721)
+
+- RENAME listeners TO events [\#1719](https://github.com/Polymer/polymer/issues/1719)
+
+- Uncaught TypeError When splicing an array into emptiness [\#1714](https://github.com/Polymer/polymer/issues/1714)
+
+- Paper-Button references \<core-icon\> [\#1709](https://github.com/Polymer/polymer/issues/1709)
+
+- Events for paper-menu or paper-item [\#1708](https://github.com/Polymer/polymer/issues/1708)
+
+- Why is there no javascript file? [\#1707](https://github.com/Polymer/polymer/issues/1707)
+
+- Evergreen browser incompatibility [\#1706](https://github.com/Polymer/polymer/issues/1706)
+
+- \[1.0\] shady dom inserts '\<content\>' more than once [\#1704](https://github.com/Polymer/polymer/issues/1704)
+
+- Issue running Polymer Started Kit 1.0.0 [\#1703](https://github.com/Polymer/polymer/issues/1703)
+
+- iron-form body data malformed [\#1702](https://github.com/Polymer/polymer/issues/1702)
+
+- \[1.0\] Attached callback is differently resolved on chrome and ff [\#1699](https://github.com/Polymer/polymer/issues/1699)
+
+- Polymer 1.0 and WebComponents.js [\#1698](https://github.com/Polymer/polymer/issues/1698)
+
+- \[dom-if\] is not as inert as \<template\> should be [\#1695](https://github.com/Polymer/polymer/issues/1695)
+
+- can't use flex inside neon-animated-pages [\#1694](https://github.com/Polymer/polymer/issues/1694)
+
+- Polymer::Attributes: couldn`t decode Array as JSON [\#1693](https://github.com/Polymer/polymer/issues/1693)
+
+- Mobile links off homepage dont work [\#1692](https://github.com/Polymer/polymer/issues/1692)
+
+- Computed property doesn't work in dom-repeat [\#1691](https://github.com/Polymer/polymer/issues/1691)
+
+- core-animated-pages any plans? [\#1689](https://github.com/Polymer/polymer/issues/1689)
+
+- Where's paper-dropdown-menu 1.0? [\#1684](https://github.com/Polymer/polymer/issues/1684)
+
+- \[1.0\] dom-repeat observe non-array values [\#1683](https://github.com/Polymer/polymer/issues/1683)
+
+- Element catalog, google-analytics, docs missing [\#1681](https://github.com/Polymer/polymer/issues/1681)
+
+- Binding not working for open text [\#1677](https://github.com/Polymer/polymer/issues/1677)
+
+- Blog link in README.md and CONTRIBUTING.md is wrong [\#1676](https://github.com/Polymer/polymer/issues/1676)
+
+- Strange lines on polymer site menu [\#1675](https://github.com/Polymer/polymer/issues/1675)
+
+- Need to parameterize path to fonts [\#1674](https://github.com/Polymer/polymer/issues/1674)
+
+- How to add dynamic classes in dom-repeat 1.0 [\#1671](https://github.com/Polymer/polymer/issues/1671)
+
+- Array mutation without using helper methods [\#1666](https://github.com/Polymer/polymer/issues/1666)
+
+- Wrapping non interpolated strings with span in 1.0 [\#1664](https://github.com/Polymer/polymer/issues/1664)
+
+- dom-if template got rendered once even if the condition is false [\#1663](https://github.com/Polymer/polymer/issues/1663)
+
+- Cannot read property 'slice' of undefined on firebase update [\#1661](https://github.com/Polymer/polymer/issues/1661)
+
+- \[1.0.2\] Global leak found in \_marshalArgs [\#1660](https://github.com/Polymer/polymer/issues/1660)
+
+- \[1.0\] Changes in appendChild from 0.9 to 1.0? [\#1657](https://github.com/Polymer/polymer/issues/1657)
+
+- Using scroll header panel together with dialog will cause backdrop to cover up dialog [\#1656](https://github.com/Polymer/polymer/issues/1656)
+
+- Color Extraction [\#1654](https://github.com/Polymer/polymer/issues/1654)
+
+- using AngularJS with paper elements [\#1649](https://github.com/Polymer/polymer/issues/1649)
+
+- Gestures event issue - No offsets management [\#1646](https://github.com/Polymer/polymer/issues/1646)
+
+- \[0.9\] event on-blur does not work on paper-input [\#1634](https://github.com/Polymer/polymer/issues/1634)
+
+- \[0.9.4\] Nested dom-if templates show invalid content [\#1632](https://github.com/Polymer/polymer/issues/1632)
+
+- paper-slider input box overflow. [\#1611](https://github.com/Polymer/polymer/issues/1611)
+
+- \[0.9\] Documentation issue \(unbind & dispose\) [\#1607](https://github.com/Polymer/polymer/issues/1607)
+
+- Better dependency management [\#1592](https://github.com/Polymer/polymer/issues/1592)
+
+**Merged pull requests:**
+
+- Make \_\_styleScoped a one-time optimization. Fixes \#1733 [\#1739](https://github.com/Polymer/polymer/pull/1739) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Move non-webcomponents script unresolved case to `load` instead of synchronous [\#1724](https://github.com/Polymer/polymer/pull/1724) ([azakus](https://github.com/azakus))
+
+- Fix for IE. [\#1717](https://github.com/Polymer/polymer/pull/1717) ([achimnol](https://github.com/achimnol))
+
+- Fix broken link [\#1688](https://github.com/Polymer/polymer/pull/1688) ([weiland](https://github.com/weiland))
+
+- Fix syntax highlighting [\#1687](https://github.com/Polymer/polymer/pull/1687) ([weiland](https://github.com/weiland))
+
+- Fixes link license [\#1685](https://github.com/Polymer/polymer/pull/1685) ([mateusortiz](https://github.com/mateusortiz))
+
+- fixed a little typo [\#1682](https://github.com/Polymer/polymer/pull/1682) ([fredpedro](https://github.com/fredpedro))
+
+- fix html comment in README.md [\#1680](https://github.com/Polymer/polymer/pull/1680) ([campersau](https://github.com/campersau))
+
+- Changed to https like other links [\#1653](https://github.com/Polymer/polymer/pull/1653) ([henricavalcante](https://github.com/henricavalcante))
+
+- dom-if hidden state is \(this.\_hideTemplateChildren || !this.if\). [\#1635](https://github.com/Polymer/polymer/pull/1635) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Re-insert rows when re-attaching. Fixes \#1498. Fixes \#1714. [\#1629](https://github.com/Polymer/polymer/pull/1629) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+## [v1.0.2](https://github.com/Polymer/polymer/tree/v1.0.2) (2015-05-29)
+
+## [v1.0.1](https://github.com/Polymer/polymer/tree/v1.0.1) (2015-05-29)
+
+**Implemented enhancements:**
+
+- using javascript core functions [\#1641](https://github.com/Polymer/polymer/issues/1641)
+
+**Fixed bugs:**
+
+- \[1.0\] Tap gesture does not trigger when calling `this.click` in IE10 [\#1640](https://github.com/Polymer/polymer/issues/1640)
+
+**Closed issues:**
+
+- Logic for tap distance should be "both axes within TAP\_DISTANCE" [\#1652](https://github.com/Polymer/polymer/issues/1652)
+
+- Site is not looking good in Mac Chrome Versión 43.0.2357.81 \(64-bit\) [\#1650](https://github.com/Polymer/polymer/issues/1650)
+
+- Different result is shown. [\#1647](https://github.com/Polymer/polymer/issues/1647)
+
+- Wrong end tag name in README.md [\#1645](https://github.com/Polymer/polymer/issues/1645)
+
+- on-tap doesn't trigger on checkbox 0.5 [\#1586](https://github.com/Polymer/polymer/issues/1586)
+
+**Merged pull requests:**
+
+- I want to put a space before Jim. [\#1648](https://github.com/Polymer/polymer/pull/1648) ([yutori](https://github.com/yutori))
+
+- Fixes link url [\#1643](https://github.com/Polymer/polymer/pull/1643) ([zenorocha](https://github.com/zenorocha))
+
+- Fixes typo [\#1642](https://github.com/Polymer/polymer/pull/1642) ([zenorocha](https://github.com/zenorocha))
+
+- updated readme and added contributing file [\#1628](https://github.com/Polymer/polymer/pull/1628) ([tjsavage](https://github.com/tjsavage))
+
+## [v1.0.0](https://github.com/Polymer/polymer/tree/v1.0.0) (2015-05-27)
+
+**Closed issues:**
+
+- \[0.9.4\] Data binding works only for "id" attribute? [\#1633](https://github.com/Polymer/polymer/issues/1633)
+
+- \[0.9\] when I move a dom-repeat element from one parent to another, the items will gone [\#1498](https://github.com/Polymer/polymer/issues/1498)
+
+## [v0.9.4](https://github.com/Polymer/polymer/tree/v0.9.4) (2015-05-27)
+
+**Closed issues:**
+
+- Polymer.version undefined in 0.9 [\#1625](https://github.com/Polymer/polymer/issues/1625)
+
+**Merged pull requests:**
+
+- Add back Polymer.version string [\#1626](https://github.com/Polymer/polymer/pull/1626) ([azakus](https://github.com/azakus))
+
+## [v0.9.3](https://github.com/Polymer/polymer/tree/v0.9.3) (2015-05-26)
+
+**Closed issues:**
+
+- Property values that contain a `:` inside a mixin. [\#1623](https://github.com/Polymer/polymer/issues/1623)
+
+- \[0.9.2\] dom-repeat issues in 0.9.2 [\#1615](https://github.com/Polymer/polymer/issues/1615)
+
+- \[0.9.1, 0.9.2\] Polymer.dom\(\).appendChild\(\) no longer working [\#1612](https://github.com/Polymer/polymer/issues/1612)
+
+- \[0.9\] "dom-if" not binding to an object's boolean property [\#1606](https://github.com/Polymer/polymer/issues/1606)
+
+- \[0.9\] Custom attributes on elements not working \(original: iron-icon styling troubles\) [\#1604](https://github.com/Polymer/polymer/issues/1604)
+
+- Blog down https://blog.polymer-project.org/ [\#1603](https://github.com/Polymer/polymer/issues/1603)
+
+- Improve error message if observer is missing [\#1538](https://github.com/Polymer/polymer/issues/1538)
+
+- \[0.9\] New gulp build hangs until enter key is pressed [\#1519](https://github.com/Polymer/polymer/issues/1519)
+
+- \[0.8\] better error when bound change handler is missing [\#1206](https://github.com/Polymer/polymer/issues/1206)
+
+**Merged pull requests:**
+
+- Fixes url's in style mixins. [\#1624](https://github.com/Polymer/polymer/pull/1624) ([sorvell](https://github.com/sorvell))
+
+- Initialize \_config with values set before creating accessors. [\#1618](https://github.com/Polymer/polymer/pull/1618) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Update docs. Add warnings. [\#1614](https://github.com/Polymer/polymer/pull/1614) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Refactor build process [\#1613](https://github.com/Polymer/polymer/pull/1613) ([azakus](https://github.com/azakus))
+
+## [v0.9.2](https://github.com/Polymer/polymer/tree/v0.9.2) (2015-05-25)
+
+**Fixed bugs:**
+
+- Default values for custom variables [\#1543](https://github.com/Polymer/polymer/issues/1543)
+
+**Closed issues:**
+
+- \[0.9.1\] Regression in styling with custom css mixins [\#1601](https://github.com/Polymer/polymer/issues/1601)
+
+- Dynamic distribution fails when using SD polyfill and host is nested in another host and has filtering insertion points [\#1595](https://github.com/Polymer/polymer/issues/1595)
+
+- Custom properties defined on `:host` shouldn't override document styles. [\#1555](https://github.com/Polymer/polymer/issues/1555)
+
+**Merged pull requests:**
+
+- Native xstyle fix [\#1605](https://github.com/Polymer/polymer/pull/1605) ([sorvell](https://github.com/sorvell))
+
+- Xstyle 1555 [\#1602](https://github.com/Polymer/polymer/pull/1602) ([sorvell](https://github.com/sorvell))
+
+## [v0.9.1](https://github.com/Polymer/polymer/tree/v0.9.1) (2015-05-23)
+
+**Implemented enhancements:**
+
+- Array helpers don't notify length change [\#1573](https://github.com/Polymer/polymer/issues/1573)
+
+- \[0.9.0-rc.1\] Method expression without arguments is not invoked [\#1516](https://github.com/Polymer/polymer/issues/1516)
+
+- \[0.8\] Polymer.dom\(\) should expose innerHTML and textContent [\#1429](https://github.com/Polymer/polymer/issues/1429)
+
+- How do you cancel job1 completely before its timeout value occur? [\#1374](https://github.com/Polymer/polymer/issues/1374)
+
+- \[0.8\] Feature request: computed properties in x-repeat [\#1337](https://github.com/Polymer/polymer/issues/1337)
+
+**Fixed bugs:**
+
+- Computed properties with no dependencies generate a syntax error [\#1348](https://github.com/Polymer/polymer/issues/1348)
+
+- \[0.8\] host-context improperly shimmed [\#1346](https://github.com/Polymer/polymer/issues/1346)
+
+**Closed issues:**
+
+- Tap event not firing the first time after tracking another element [\#1590](https://github.com/Polymer/polymer/issues/1590)
+
+- domReady [\#1587](https://github.com/Polymer/polymer/issues/1587)
+
+- Content tag does not work inside dom-if template [\#1584](https://github.com/Polymer/polymer/issues/1584)
+
+- /deep/ css selector not work in chrome browser [\#1583](https://github.com/Polymer/polymer/issues/1583)
+
+- Under native ShadowDOM "dom-if" doesn't stamp out the content even when "if" property is true [\#1582](https://github.com/Polymer/polymer/issues/1582)
+
+- Iron-Input hint not turning into label on ChromeBook apps [\#1581](https://github.com/Polymer/polymer/issues/1581)
+
+- Binding text remains in \<input value="{{value::input}}"\> on IE10 [\#1578](https://github.com/Polymer/polymer/issues/1578)
+
+- \[0.9\] Extends delays/breaks polymer element setup [\#1575](https://github.com/Polymer/polymer/issues/1575)
+
+- \[0.9\] Gesture event throws exception when dragged outside document [\#1574](https://github.com/Polymer/polymer/issues/1574)
+
+- dom-repeat filter/sort needs to be able to observe parent scope [\#1572](https://github.com/Polymer/polymer/issues/1572)
+
+- Logical Operators doesn't work anymore in 0.9 [\#1568](https://github.com/Polymer/polymer/issues/1568)
+
+- Reposted from Angular Issue \#1723: Unable to define correct CSS @Rules when CSS shimming is enabled [\#1566](https://github.com/Polymer/polymer/issues/1566)
+
+- \[0.9.0\] Problem putting a dom-if template in a light DOM when the component's \<content\> itself is wrapped in a dom-if [\#1565](https://github.com/Polymer/polymer/issues/1565)
+
+- hypergrid is a polymer custom component [\#1561](https://github.com/Polymer/polymer/issues/1561)
+
+- serializeValueToAttribute returns undefined [\#1559](https://github.com/Polymer/polymer/issues/1559)
+
+- Offsetting core drawer panel [\#1557](https://github.com/Polymer/polymer/issues/1557)
+
+- \[0.9\] How to dynamically import elements? [\#1554](https://github.com/Polymer/polymer/issues/1554)
+
+- Release process should have change log [\#1553](https://github.com/Polymer/polymer/issues/1553)
+
+- \[0.9\] on-click="kickAction\(\)" [\#1552](https://github.com/Polymer/polymer/issues/1552)
+
+- Layout functionality in 0.9 [\#1551](https://github.com/Polymer/polymer/issues/1551)
+
+- \[0.9\] hostAttributes: Noooooooo! [\#1549](https://github.com/Polymer/polymer/issues/1549)
+
+- \[0.9\] hidden$="{{isHidden}}" vs hidden=$"{{isHidden}}" [\#1548](https://github.com/Polymer/polymer/issues/1548)
+
+- seems that case sensitive properties doesn't work [\#1547](https://github.com/Polymer/polymer/issues/1547)
+
+- webcomponents loading order [\#1544](https://github.com/Polymer/polymer/issues/1544)
+
+- Data-binding to native DOM element inside of auto-binding template invokes style scoping [\#1542](https://github.com/Polymer/polymer/issues/1542)
+
+- 0.9 zip file nearly empty [\#1541](https://github.com/Polymer/polymer/issues/1541)
+
+- Polymer.dom\(parent\).querySelector polyfill is broken in 0.8 [\#1540](https://github.com/Polymer/polymer/issues/1540)
+
+- Imported resource from origin 'file://' has been blocked from loading by Cross-Origin Resource Sharing policy: Received an invalid response. Origin 'null' is therefore not allowed access. [\#1535](https://github.com/Polymer/polymer/issues/1535)
+
+- \[0.9.0-rc.1\] Cannot set property 'touchAction' of undefinedGestures.setTouchAction [\#1533](https://github.com/Polymer/polymer/issues/1533)
+
+- Could I disable the two-way binding? [\#1529](https://github.com/Polymer/polymer/issues/1529)
+
+- \[0.9\] Can't override the css property if the property is already set on the host via custom property [\#1525](https://github.com/Polymer/polymer/issues/1525)
+
+- \[0.5.6\] Hang in loading polymer [\#1524](https://github.com/Polymer/polymer/issues/1524)
+
+- \[0.0.9-rc.1\] Array changes event is not delivered [\#1523](https://github.com/Polymer/polymer/issues/1523)
+
+- \[0.9\] dom-bind not working with document.createElement [\#1515](https://github.com/Polymer/polymer/issues/1515)
+
+- Please, more info about new releases [\#1507](https://github.com/Polymer/polymer/issues/1507)
+
+- \[0.9\] Annotated computed properties don't work on autobinding template [\#1500](https://github.com/Polymer/polymer/issues/1500)
+
+- Upgrade from polymer 0.5 to 0.8 [\#1492](https://github.com/Polymer/polymer/issues/1492)
+
+- \[0.8\] Binding a property with value 'undefined' to an input value on IE11 shows the raw binding [\#1491](https://github.com/Polymer/polymer/issues/1491)
+
+- \[0.8\] SVG elements fail on IE11 due to missing classList [\#1490](https://github.com/Polymer/polymer/issues/1490)
+
+- Cross domain HTML import [\#1489](https://github.com/Polymer/polymer/issues/1489)
+
+- Using Polymer with NW.js [\#1481](https://github.com/Polymer/polymer/issues/1481)
+
+- 0.9: String literals as parameters of computed properties [\#1475](https://github.com/Polymer/polymer/issues/1475)
+
+- Inheritance of CSS Variables [\#1470](https://github.com/Polymer/polymer/issues/1470)
+
+- support data binding with ES6 module? [\#1465](https://github.com/Polymer/polymer/issues/1465)
+
+- \[0.8\] IE9 styles broken [\#1464](https://github.com/Polymer/polymer/issues/1464)
+
+- how to get polymer and requirejs working together? [\#1463](https://github.com/Polymer/polymer/issues/1463)
+
+- .8 domReady never being called [\#1460](https://github.com/Polymer/polymer/issues/1460)
+
+- TODO in polymer.js references fixed bug [\#1457](https://github.com/Polymer/polymer/issues/1457)
+
+- \[0.8\] Self-closing p tag breaks template [\#1455](https://github.com/Polymer/polymer/issues/1455)
+
+- \[0.8\] x-repeat failing to stamp instances on safari [\#1443](https://github.com/Polymer/polymer/issues/1443)
+
+- \[0.8\] `\<content select=".class"\>` and `hostAttributes` don't work together [\#1431](https://github.com/Polymer/polymer/issues/1431)
+
+- \[0.8\] Binding to "id" is not working [\#1426](https://github.com/Polymer/polymer/issues/1426)
+
+- Event handlers within x-repeat always target the first instance of an element [\#1425](https://github.com/Polymer/polymer/issues/1425)
+
+- \[0.8\] host, port, etc are reserved for anchor elements; let's avoid them [\#1417](https://github.com/Polymer/polymer/issues/1417)
+
+- \[0.8\] IE11 displays and then hides Custom Elements [\#1412](https://github.com/Polymer/polymer/issues/1412)
+
+- \[0.8\] x-repeat objectizes arrays of strings [\#1411](https://github.com/Polymer/polymer/issues/1411)
+
+- \[0.8\] style scope missing [\#1410](https://github.com/Polymer/polymer/issues/1410)
+
+- Polymer 0.8 cant bind to array item. [\#1409](https://github.com/Polymer/polymer/issues/1409)
+
+- \[0.8\]\[styling\] Want to define custom variables in the same scope as their references [\#1406](https://github.com/Polymer/polymer/issues/1406)
+
+- \[0.8\]\[styling\] Should be able to mixin sibling properties [\#1399](https://github.com/Polymer/polymer/issues/1399)
+
+- \[0.8\] Properties deserialized from native inputs lose their type [\#1396](https://github.com/Polymer/polymer/issues/1396)
+
+- Shady DOM doesn't correctly parse custom property rules. [\#1389](https://github.com/Polymer/polymer/issues/1389)
+
+- Shady DOM custom properties don't inherit. [\#1388](https://github.com/Polymer/polymer/issues/1388)
+
+- \[0.8\] dom-module nice but not perfect [\#1380](https://github.com/Polymer/polymer/issues/1380)
+
+- \[0.8\] notify: true Bad idea unless it has a huge performance gain [\#1379](https://github.com/Polymer/polymer/issues/1379)
+
+- Style mixin syntax is incompatible with Sass [\#1373](https://github.com/Polymer/polymer/issues/1373)
+
+- \[x-repeat\] can't bind to childNodes under Shadow DOM [\#1367](https://github.com/Polymer/polymer/issues/1367)
+
+- \[0.8\] - default property values are not set by the time observers are called [\#1364](https://github.com/Polymer/polymer/issues/1364)
+
+- \[0.8\]: observer callbacks changed parameter ordering [\#1363](https://github.com/Polymer/polymer/issues/1363)
+
+- \[0.8\] HTMLAnchor has a `host` property, breaks the intended behavior of `Polymer.Base.\_queryHost` [\#1359](https://github.com/Polymer/polymer/issues/1359)
+
+- \[0.8\] Style scoped immediate descendant selector no longer matches projected content [\#1312](https://github.com/Polymer/polymer/issues/1312)
+
+- Spaces in binding causes SyntaxError: Unexpected identifier. [\#1311](https://github.com/Polymer/polymer/issues/1311)
+
+- Tracking issue: Supporting CSP in 0.8+ [\#1306](https://github.com/Polymer/polymer/issues/1306)
+
+- \[0.8\] `readOnly` property without `notify` will not be `readOnly` [\#1294](https://github.com/Polymer/polymer/issues/1294)
+
+- Shady styling increases selector specificity [\#1279](https://github.com/Polymer/polymer/issues/1279)
+
+- \[0.8\] body unresolved broken [\#1271](https://github.com/Polymer/polymer/issues/1271)
+
+- \[0.8\] accidental shared state in configure value? [\#1269](https://github.com/Polymer/polymer/issues/1269)
+
+- \[0.8\] Properties observers registered too early [\#1258](https://github.com/Polymer/polymer/issues/1258)
+
+- \[0.8\] Polymer.import missing [\#1248](https://github.com/Polymer/polymer/issues/1248)
+
+- \[0.8\] Consider always assigning to native properties [\#1226](https://github.com/Polymer/polymer/issues/1226)
+
+**Merged pull requests:**
+
+- Notify array.length changes. Fixes \#1573. [\#1600](https://github.com/Polymer/polymer/pull/1600) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Make `dom-bind` not scope element classes. Fixes \#1542 [\#1599](https://github.com/Polymer/polymer/pull/1599) ([sorvell](https://github.com/sorvell))
+
+- 1565,1582,1584 fix [\#1597](https://github.com/Polymer/polymer/pull/1597) ([sorvell](https://github.com/sorvell))
+
+- Wait until imports resolve to stamp. Fixes \#1500 [\#1594](https://github.com/Polymer/polymer/pull/1594) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Perform dom-bind work in attached/detached. Add tests. [\#1591](https://github.com/Polymer/polymer/pull/1591) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Clear input.value attribute before removing for IE. Fixes \#1491. Fixe… [\#1589](https://github.com/Polymer/polymer/pull/1589) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- iterate behavior mixins in reverse order as the `hasOwnProperty` chec… [\#1588](https://github.com/Polymer/polymer/pull/1588) ([sjmiles](https://github.com/sjmiles))
+
+- serializeValueToAttribute always provokes distribute if necessary [\#1580](https://github.com/Polymer/polymer/pull/1580) ([sorvell](https://github.com/sorvell))
+
+- Use more resilient shadowroot checking [\#1579](https://github.com/Polymer/polymer/pull/1579) ([azakus](https://github.com/azakus))
+
+- Literal args comma fix [\#1577](https://github.com/Polymer/polymer/pull/1577) ([sjmiles](https://github.com/sjmiles))
+
+- allow behavior arrays to contain nested behavior arrays [\#1576](https://github.com/Polymer/polymer/pull/1576) ([sjmiles](https://github.com/sjmiles))
+
+- X style fixes [\#1570](https://github.com/Polymer/polymer/pull/1570) ([sorvell](https://github.com/sorvell))
+
+- Fix typo in PRIMER.md [\#1569](https://github.com/Polymer/polymer/pull/1569) ([ragingwind](https://github.com/ragingwind))
+
+- Remove unused keyCodes enum [\#1564](https://github.com/Polymer/polymer/pull/1564) ([jklein24](https://github.com/jklein24))
+
+- Xstyle [\#1556](https://github.com/Polymer/polymer/pull/1556) ([sorvell](https://github.com/sorvell))
+
+## [v0.9.0](https://github.com/Polymer/polymer/tree/v0.9.0) (2015-05-14)
+
+**Implemented enhancements:**
+
+- Expose dom-repeat.\_instanceForElement [\#1501](https://github.com/Polymer/polymer/issues/1501)
+
+**Closed issues:**
+
+- Change color of main panel [\#1536](https://github.com/Polymer/polymer/issues/1536)
+
+- \[0.8.0-rc.5\] observers as an array [\#1527](https://github.com/Polymer/polymer/issues/1527)
+
+- \[0.9\] Touch scroll gesture, setScrollDirection doesn't work any longer [\#1520](https://github.com/Polymer/polymer/issues/1520)
+
+- \[0.9\] Data binding? [\#1517](https://github.com/Polymer/polymer/issues/1517)
+
+- `this.$.\*` isn't set if an element \* is inside a `dom-if` block and the condition evaluates to true [\#1513](https://github.com/Polymer/polymer/issues/1513)
+
+- Paper-action-dialog with backdrop disables window [\#1509](https://github.com/Polymer/polymer/issues/1509)
+
+- How to pass data from polymer element [\#1503](https://github.com/Polymer/polymer/issues/1503)
+
+- \[0.9\] auto-binding, x-repeat template not working [\#1502](https://github.com/Polymer/polymer/issues/1502)
+
+- \[0.9\] if="{{ 1 \< 2 }}" not supported?! [\#1499](https://github.com/Polymer/polymer/issues/1499)
+
+- \[0.9\] touch track fails on iPhone, .touchIdentifier vs .identifier [\#1496](https://github.com/Polymer/polymer/issues/1496)
+
+- Internet Explorer 11 "Failed to open data:text/javascript;charset=utf-8," [\#1485](https://github.com/Polymer/polymer/issues/1485)
+
+- \[0.5.5\] Function calling is not working in custom element [\#1484](https://github.com/Polymer/polymer/issues/1484)
+
+- \[0.8\] Nested insertion points lose elements after distributeContent [\#1480](https://github.com/Polymer/polymer/issues/1480)
+
+- \[0.8\] Binding the value of an input box with {{value::input}} loses caret index [\#1471](https://github.com/Polymer/polymer/issues/1471)
+
+- \[0.8\] Nested property binding not working on Firefox/IE [\#1391](https://github.com/Polymer/polymer/issues/1391)
+
+- Memory Leak when using Data Bindings [\#1116](https://github.com/Polymer/polymer/issues/1116)
+
+**Merged pull requests:**
+
+- Update to wcjs 0.7.0. [\#1532](https://github.com/Polymer/polymer/pull/1532) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- 0.8 negate annotated computation [\#1528](https://github.com/Polymer/polymer/pull/1528) ([sjmiles](https://github.com/sjmiles))
+
+- Add commands to test build [\#1522](https://github.com/Polymer/polymer/pull/1522) ([azakus](https://github.com/azakus))
+
+- Implement a minimum track distance [\#1518](https://github.com/Polymer/polymer/pull/1518) ([azakus](https://github.com/azakus))
+
+- Process nested templates in base, parse method args for parentProps. [\#1514](https://github.com/Polymer/polymer/pull/1514) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- trasnacted -\> transacted in PRIMER.md [\#1512](https://github.com/Polymer/polymer/pull/1512) ([Shrugs](https://github.com/Shrugs))
+
+- Add missing comma in code example [\#1510](https://github.com/Polymer/polymer/pull/1510) ([fredj](https://github.com/fredj))
+
+- 0.8 shady api [\#1508](https://github.com/Polymer/polymer/pull/1508) ([sorvell](https://github.com/sorvell))
+
+- Fix dom-module closing tag [\#1497](https://github.com/Polymer/polymer/pull/1497) ([fredj](https://github.com/fredj))
+
+- Add more docs for Gestures [\#1495](https://github.com/Polymer/polymer/pull/1495) ([azakus](https://github.com/azakus))
+
+- Fix nits from \#1486 [\#1494](https://github.com/Polymer/polymer/pull/1494) ([azakus](https://github.com/azakus))
+
+- Change x-style to custom-style in comments [\#1493](https://github.com/Polymer/polymer/pull/1493) ([chuckh](https://github.com/chuckh))
+
+## [v0.9.0-rc.1](https://github.com/Polymer/polymer/tree/v0.9.0-rc.1) (2015-05-06)
+
+**Merged pull requests:**
+
+- Rename x-\* elements. [\#1488](https://github.com/Polymer/polymer/pull/1488) ([sorvell](https://github.com/sorvell))
+
+- 0.8 lexical template scope [\#1487](https://github.com/Polymer/polymer/pull/1487) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- 0.8 gestures in core [\#1486](https://github.com/Polymer/polymer/pull/1486) ([sjmiles](https://github.com/sjmiles))
+
+## [0.5.6](https://github.com/Polymer/polymer/tree/0.5.6) (2015-05-05)
+
+**Implemented enhancements:**
+
+- \[0.8\] `hostAttributes` should respect user-provided defaults [\#1458](https://github.com/Polymer/polymer/issues/1458)
+
+**Closed issues:**
+
+- Unable to connect to github.com... [\#1468](https://github.com/Polymer/polymer/issues/1468)
+
+- error using mixins as computed property or in template methods in 0.8.0-rc.7 [\#1456](https://github.com/Polymer/polymer/issues/1456)
+
+- \[0.8\] observers as an object. [\#1452](https://github.com/Polymer/polymer/issues/1452)
+
+- \[0.8\] getDistributedNodes\(\) does not update when distributed content changes [\#1449](https://github.com/Polymer/polymer/issues/1449)
+
+- \[0.8\] behaviors override properties on elements [\#1444](https://github.com/Polymer/polymer/issues/1444)
+
+- \[0.8\] bower.json license does not follow specification [\#1435](https://github.com/Polymer/polymer/issues/1435)
+
+- Error in 0.8 RC6 - not present in RC4 [\#1428](https://github.com/Polymer/polymer/issues/1428)
+
+- \[0.8\] Support :root in x-style [\#1415](https://github.com/Polymer/polymer/issues/1415)
+
+- \[0.8\] 'style-scope undefined' when combined with hostAttributes and x-if template [\#1400](https://github.com/Polymer/polymer/issues/1400)
+
+- \[0.8\] `\<link rel="import" type="css"\>` styles are shimmed out of order [\#1349](https://github.com/Polymer/polymer/issues/1349)
+
+- Polymer 0.5.2 release have version 0.5.1 [\#1033](https://github.com/Polymer/polymer/issues/1033)
+
+**Merged pull requests:**
+
+- 0.8 x style [\#1482](https://github.com/Polymer/polymer/pull/1482) ([sorvell](https://github.com/sorvell))
+
+- Fix translate3d call after transform refactor [\#1478](https://github.com/Polymer/polymer/pull/1478) ([azakus](https://github.com/azakus))
+
+- 0.8 array notification [\#1477](https://github.com/Polymer/polymer/pull/1477) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- don't trap `id` for marshalling if it's a binding directive + test [\#1474](https://github.com/Polymer/polymer/pull/1474) ([sjmiles](https://github.com/sjmiles))
+
+- use `hasOwnProperty` to avoid overwriting prototype methods when mixing in behaviors \(+test\) [\#1473](https://github.com/Polymer/polymer/pull/1473) ([sjmiles](https://github.com/sjmiles))
+
+- 0.8 fix xif polyfill [\#1469](https://github.com/Polymer/polymer/pull/1469) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- 0.8 patching [\#1462](https://github.com/Polymer/polymer/pull/1462) ([sorvell](https://github.com/sorvell))
+
+- 0.8 api scrub [\#1440](https://github.com/Polymer/polymer/pull/1440) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- typo in PRIMER.md [\#1430](https://github.com/Polymer/polymer/pull/1430) ([batista](https://github.com/batista))
+
+- Build polymer 0.8. [\#1402](https://github.com/Polymer/polymer/pull/1402) ([garlicnation](https://github.com/garlicnation))
+
+## [v0.8.0-rc.7](https://github.com/Polymer/polymer/tree/v0.8.0-rc.7) (2015-04-22)
+
+**Closed issues:**
+
+- \[0.8\] `readOnly` properties do not receive the initial value specified by `value` [\#1393](https://github.com/Polymer/polymer/issues/1393)
+
+**Merged pull requests:**
+
+- Fixes style scoping when elements are stamped inside repeats. [\#1439](https://github.com/Polymer/polymer/pull/1439) ([sorvell](https://github.com/sorvell))
+
+- 0.8 repeat fixes [\#1438](https://github.com/Polymer/polymer/pull/1438) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Change user `constructor` to `factoryImpl` as an aid to compilation tool... [\#1437](https://github.com/Polymer/polymer/pull/1437) ([sorvell](https://github.com/sorvell))
+
+- No more circular dependencies, because bower. [\#1436](https://github.com/Polymer/polymer/pull/1436) ([nevir](https://github.com/nevir))
+
+- 0.8 behaviors [\#1433](https://github.com/Polymer/polymer/pull/1433) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- defeated -\> disabled [\#1423](https://github.com/Polymer/polymer/pull/1423) ([MetaMemoryT](https://github.com/MetaMemoryT))
+
+## [v0.8.0-rc.6](https://github.com/Polymer/polymer/tree/v0.8.0-rc.6) (2015-04-20)
+
+## [v0.8.0-rc.5](https://github.com/Polymer/polymer/tree/v0.8.0-rc.5) (2015-04-20)
+
+**Closed issues:**
+
+- \[0.8\] Global settings overwritten by webcomponents [\#1404](https://github.com/Polymer/polymer/issues/1404)
+
+- \[0.8\] distributeContent loses light children [\#1394](https://github.com/Polymer/polymer/issues/1394)
+
+- \[ShadyDOM\] Exception when removing non-distributed nodes [\#1366](https://github.com/Polymer/polymer/issues/1366)
+
+**Merged pull requests:**
+
+- 0.8 path effects [\#1422](https://github.com/Polymer/polymer/pull/1422) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- 0.8 nested template [\#1398](https://github.com/Polymer/polymer/pull/1398) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- 0.8 shim class [\#1397](https://github.com/Polymer/polymer/pull/1397) ([sorvell](https://github.com/sorvell))
+
+- \<iron-doc-viewer\> based index for local dev [\#1395](https://github.com/Polymer/polymer/pull/1395) ([nevir](https://github.com/nevir))
+
+- Add license to css-parse.html [\#1378](https://github.com/Polymer/polymer/pull/1378) ([garlicnation](https://github.com/garlicnation))
+
+## [v0.8.0-rc.4](https://github.com/Polymer/polymer/tree/v0.8.0-rc.4) (2015-04-10)
+
+## [v0.8.0-rc.3](https://github.com/Polymer/polymer/tree/v0.8.0-rc.3) (2015-04-09)
+
+**Closed issues:**
+
+- Polymer-micro.html broken? [\#1390](https://github.com/Polymer/polymer/issues/1390)
+
+- listener for DOMContentLoaded and window resize [\#1384](https://github.com/Polymer/polymer/issues/1384)
+
+- \[0.8\] Opting into native Shadow DOM isn't documented [\#1382](https://github.com/Polymer/polymer/issues/1382)
+
+- Polymer in 10 Minutes - 3. Create an app [\#1371](https://github.com/Polymer/polymer/issues/1371)
+
+- Polymer in 10 Minutes - Reusing other elements [\#1370](https://github.com/Polymer/polymer/issues/1370)
+
+- \[0.5.5\] Event fire error on safari [\#1362](https://github.com/Polymer/polymer/issues/1362)
+
+- \[0.8\] importHref fails in IE/FF [\#1343](https://github.com/Polymer/polymer/issues/1343)
+
+- Attribute Value of "selected" in the tutorial [\#1228](https://github.com/Polymer/polymer/issues/1228)
+
+**Merged pull requests:**
+
+- 0.8 machined [\#1386](https://github.com/Polymer/polymer/pull/1386) ([sorvell](https://github.com/sorvell))
+
+- Clarify concept of host to mean dom host. Related: [\#1372](https://github.com/Polymer/polymer/pull/1372) ([sorvell](https://github.com/sorvell))
+
+## [v0.8.0-rc.2](https://github.com/Polymer/polymer/tree/v0.8.0-rc.2) (2015-04-02)
+
+**Closed issues:**
+
+- \[0.8\] Using one-way binding to propagate upward [\#1360](https://github.com/Polymer/polymer/issues/1360)
+
+## [v0.8.0](https://github.com/Polymer/polymer/tree/v0.8.0) (2015-04-02)
+
+**Implemented enhancements:**
+
+- \[Shadow DOM\] Make Shadow DOM optional [\#1042](https://github.com/Polymer/polymer/issues/1042)
+
+**Closed issues:**
+
+- \[0.8\] extended my-input element isn't shown [\#1350](https://github.com/Polymer/polymer/issues/1350)
+
+- Polymer function not accessible in firefox/safari [\#1316](https://github.com/Polymer/polymer/issues/1316)
+
+**Merged pull requests:**
+
+- Fix undeclared variable exception in \_distributeInsertionPoint. [\#1351](https://github.com/Polymer/polymer/pull/1351) ([icetraxx](https://github.com/icetraxx))
+
+- 0.8 custom notify event [\#1335](https://github.com/Polymer/polymer/pull/1335) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+## [v0.8.0-rc.1](https://github.com/Polymer/polymer/tree/v0.8.0-rc.1) (2015-03-26)
+
+**Fixed bugs:**
+
+- \[0.8-preview\] Throws exception if left-hand-side of a property binding contains a dash [\#1161](https://github.com/Polymer/polymer/issues/1161)
+
+- Bindings in \<style\> no longer work under polyfill [\#270](https://github.com/Polymer/polymer/issues/270)
+
+**Closed issues:**
+
+- core-list needs your attention [\#1333](https://github.com/Polymer/polymer/issues/1333)
+
+- Icons oversized on Firefox on polymer-project.org [\#1328](https://github.com/Polymer/polymer/issues/1328)
+
+- \[0.8\] Unable to observe property 'hidden' [\#1322](https://github.com/Polymer/polymer/issues/1322)
+
+- \[0.8\] Unexpected token \] [\#1298](https://github.com/Polymer/polymer/issues/1298)
+
+- \[0.8\] Text bindings break if parenthesis are used [\#1297](https://github.com/Polymer/polymer/issues/1297)
+
+- \[0.8\] Shady style processor doesn't drop operator for ::content [\#1293](https://github.com/Polymer/polymer/issues/1293)
+
+- Polymer layout collision with another frameworks like Angular Material [\#1289](https://github.com/Polymer/polymer/issues/1289)
+
+- Polymer Project Site - Broken Link [\#1288](https://github.com/Polymer/polymer/issues/1288)
+
+- core-ajax [\#1287](https://github.com/Polymer/polymer/issues/1287)
+
+- demo portions of documentation are missing/404 [\#1286](https://github.com/Polymer/polymer/issues/1286)
+
+- \[0.8\] `attached` is called at different points in lifecycle for ShadeyDOM vs ShadowDOM [\#1285](https://github.com/Polymer/polymer/issues/1285)
+
+- \[0.8\] Listening to events on an element produces different results under ShadowDOM v. ShadyDOM [\#1284](https://github.com/Polymer/polymer/issues/1284)
+
+- Attribute selectors incorrectly scoped [\#1282](https://github.com/Polymer/polymer/issues/1282)
+
+- \[0.8-preview\] Shadey styles have incorrect order of precedence [\#1277](https://github.com/Polymer/polymer/issues/1277)
+
+- \[0.8\] Styling scoping not working with type extension elements [\#1275](https://github.com/Polymer/polymer/issues/1275)
+
+- Typo on website [\#1273](https://github.com/Polymer/polymer/issues/1273)
+
+- \[0.8-preview\] All properties are available for data binding [\#1262](https://github.com/Polymer/polymer/issues/1262)
+
+- \[0.8\] camel-case attributes do not deserialize to properties correctly. [\#1257](https://github.com/Polymer/polymer/issues/1257)
+
+- paper-autogrow-textarea bug [\#1255](https://github.com/Polymer/polymer/issues/1255)
+
+- \<paper-input-decorator label=“birthday”\> [\#1251](https://github.com/Polymer/polymer/issues/1251)
+
+- How addEventListener in nested template? [\#1250](https://github.com/Polymer/polymer/issues/1250)
+
+- \<paper-input-decorator label="test" autoValidate?="{{autoValidate}}"\> [\#1249](https://github.com/Polymer/polymer/issues/1249)
+
+- Installing with Bower not working [\#1246](https://github.com/Polymer/polymer/issues/1246)
+
+- Bower package not found [\#1245](https://github.com/Polymer/polymer/issues/1245)
+
+- \[0.8\] template x-repeat throws error under native ShadowDOM [\#1244](https://github.com/Polymer/polymer/issues/1244)
+
+- \[0.8\] Multiple computed properties call same method [\#1242](https://github.com/Polymer/polymer/issues/1242)
+
+- \[0.8\] value binding not working in samples.html [\#1241](https://github.com/Polymer/polymer/issues/1241)
+
+- \[0.8\] encapsulate and class binding not working well together [\#1240](https://github.com/Polymer/polymer/issues/1240)
+
+- Links in SPA tutorial are broken [\#1239](https://github.com/Polymer/polymer/issues/1239)
+
+- What is the complete Polymer Public API? [\#1233](https://github.com/Polymer/polymer/issues/1233)
+
+- content does not get wrapped on mobile devices [\#1221](https://github.com/Polymer/polymer/issues/1221)
+
+- BUG: web-component-tester, sauce-connect-launcher dependency [\#1214](https://github.com/Polymer/polymer/issues/1214)
+
+- Why calling polymer.js instead of polymer.min.js? [\#1213](https://github.com/Polymer/polymer/issues/1213)
+
+- Imperatively declared element's custom fired event does not bubble up. [\#1212](https://github.com/Polymer/polymer/issues/1212)
+
+- \[0.8\] Attribute deserialization possibly busted? [\#1208](https://github.com/Polymer/polymer/issues/1208)
+
+- \[0.8\] Undefined method in constructor [\#1207](https://github.com/Polymer/polymer/issues/1207)
+
+- Typo [\#1205](https://github.com/Polymer/polymer/issues/1205)
+
+- \[0.8\] x-template should provide bound values to elements' configure [\#1200](https://github.com/Polymer/polymer/issues/1200)
+
+- Dynamically publishing attributes [\#1198](https://github.com/Polymer/polymer/issues/1198)
+
+- Template's script doesn't execute when imported from another document \(polyfill\) [\#1197](https://github.com/Polymer/polymer/issues/1197)
+
+- \[0.8-preview\] x-repeat standalone issue [\#1192](https://github.com/Polymer/polymer/issues/1192)
+
+- Polymer.Import - handle 404's [\#1184](https://github.com/Polymer/polymer/issues/1184)
+
+- Get Started Tutorial [\#1181](https://github.com/Polymer/polymer/issues/1181)
+
+- Initialization might fail when surrounded by p-element [\#1180](https://github.com/Polymer/polymer/issues/1180)
+
+- Why no paper-label? [\#1174](https://github.com/Polymer/polymer/issues/1174)
+
+- Polymer \(inline styling\) inconsistent between Chrome and Firefox [\#1172](https://github.com/Polymer/polymer/issues/1172)
+
+- \[0.8-preview\] Bespoke element constructors [\#1151](https://github.com/Polymer/polymer/issues/1151)
+
+- \[0.8-preview\] detached not getting called when the element being removed is in the localDom of another element. [\#1145](https://github.com/Polymer/polymer/issues/1145)
+
+- \[0.8-preview\] Boolean attribute change handlers are called before `localDom` or `lightDom` are available. [\#1131](https://github.com/Polymer/polymer/issues/1131)
+
+- Reference to `HTMLLinkElement` in `Polymer.import` callback [\#1127](https://github.com/Polymer/polymer/issues/1127)
+
+- 0.8-preview: multiple arguments to computed method [\#1092](https://github.com/Polymer/polymer/issues/1092)
+
+- 0.8-preview: handle case-sensitivity problems around attributes [\#1080](https://github.com/Polymer/polymer/issues/1080)
+
+- 0.8-preview: "ready" fires before "created"? [\#1079](https://github.com/Polymer/polymer/issues/1079)
+
+- Wrong Bindings types documentation [\#980](https://github.com/Polymer/polymer/issues/980)
+
+**Merged pull requests:**
+
+- update webcomponents dependency [\#1339](https://github.com/Polymer/polymer/pull/1339) ([garlicnation](https://github.com/garlicnation))
+
+- Update bower.json to point to wcjs at 0.6.0 instead of master. [\#1338](https://github.com/Polymer/polymer/pull/1338) ([garlicnation](https://github.com/garlicnation))
+
+- Fix typo an -\> and [\#1330](https://github.com/Polymer/polymer/pull/1330) ([ragingwind](https://github.com/ragingwind))
+
+- Update PRIMER.md [\#1327](https://github.com/Polymer/polymer/pull/1327) ([mohanaravind](https://github.com/mohanaravind))
+
+- Move notify event target check to \_notifyListener. [\#1323](https://github.com/Polymer/polymer/pull/1323) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Shady DOM optimizations: \(1\) fast path distribution when no insertion po... [\#1320](https://github.com/Polymer/polymer/pull/1320) ([sorvell](https://github.com/sorvell))
+
+- \[0.8\] Minor doc typo [\#1313](https://github.com/Polymer/polymer/pull/1313) ([fredj](https://github.com/fredj))
+
+- \[0.8\] Bye bye bowerrc [\#1310](https://github.com/Polymer/polymer/pull/1310) ([nevir](https://github.com/nevir))
+
+- 0.8 gestures [\#1309](https://github.com/Polymer/polymer/pull/1309) ([frankiefu](https://github.com/frankiefu))
+
+- Make webcomponentsjs a bower dependency [\#1307](https://github.com/Polymer/polymer/pull/1307) ([robdodson](https://github.com/robdodson))
+
+- Walk attributes backward to avoid IE veto on removeAttribute. [\#1302](https://github.com/Polymer/polymer/pull/1302) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Update PRIMER.md [\#1301](https://github.com/Polymer/polymer/pull/1301) ([mohanaravind](https://github.com/mohanaravind))
+
+- Separate attributes function from annotations [\#1300](https://github.com/Polymer/polymer/pull/1300) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Bugfix: ReferenceError: c is not defined [\#1295](https://github.com/Polymer/polymer/pull/1295) ([atotic](https://github.com/atotic))
+
+- Minor text edits on DOM API description [\#1281](https://github.com/Polymer/polymer/pull/1281) ([arthurevans](https://github.com/arthurevans))
+
+- Fixes typo and broken link in PRIMER. [\#1274](https://github.com/Polymer/polymer/pull/1274) ([batista](https://github.com/batista))
+
+- 0.8 demodulate [\#1264](https://github.com/Polymer/polymer/pull/1264) ([sjmiles](https://github.com/sjmiles))
+
+- 0.8 property config [\#1256](https://github.com/Polymer/polymer/pull/1256) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Fixed insertion of numbers and booleans in the weakmap in 0.8-preview [\#1253](https://github.com/Polymer/polymer/pull/1253) ([cedric-marcone](https://github.com/cedric-marcone))
+
+- Unique comp props [\#1243](https://github.com/Polymer/polymer/pull/1243) ([ssorallen](https://github.com/ssorallen))
+
+- Standardize indentation across examples in Primer [\#1235](https://github.com/Polymer/polymer/pull/1235) ([ssorallen](https://github.com/ssorallen))
+
+- Use correct `Dom` capitalization in Primer doc [\#1222](https://github.com/Polymer/polymer/pull/1222) ([ssorallen](https://github.com/ssorallen))
+
+- Collection repeat [\#1215](https://github.com/Polymer/polymer/pull/1215) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Fix typo in PRIMER.md [\#1204](https://github.com/Polymer/polymer/pull/1204) ([fredj](https://github.com/fredj))
+
+## [0.5.5](https://github.com/Polymer/polymer/tree/0.5.5) (2015-02-18)
+
+**Closed issues:**
+
+- Need a Polymer Core \(team member\) representative asap? [\#1194](https://github.com/Polymer/polymer/issues/1194)
+
+**Merged pull requests:**
+
+- possible fix for \[0.8-preview\] \#1192 [\#1202](https://github.com/Polymer/polymer/pull/1202) ([sjmiles](https://github.com/sjmiles))
+
+- Basic test for x-template stamping [\#1199](https://github.com/Polymer/polymer/pull/1199) ([nevir](https://github.com/nevir))
+
+## [0.5.5-rc1](https://github.com/Polymer/polymer/tree/0.5.5-rc1) (2015-02-13)
+
+**Closed issues:**
+
+- How Polymer handle elements' model communication? [\#1187](https://github.com/Polymer/polymer/issues/1187)
+
+- Polymer is failing silently without any console error [\#1171](https://github.com/Polymer/polymer/issues/1171)
+
+- Elements created at runtime, can't know when ready [\#1158](https://github.com/Polymer/polymer/issues/1158)
+
+- core-dropdown-menu is ugly magugly [\#1146](https://github.com/Polymer/polymer/issues/1146)
+
+- polymer element not compatible with IE [\#1143](https://github.com/Polymer/polymer/issues/1143)
+
+- polymer element not compatible with IE [\#1142](https://github.com/Polymer/polymer/issues/1142)
+
+- Please improve home site's colors [\#1141](https://github.com/Polymer/polymer/issues/1141)
+
+- polymer element not compatible with IE [\#1140](https://github.com/Polymer/polymer/issues/1140)
+
+- polymer element not compatible with IE [\#1139](https://github.com/Polymer/polymer/issues/1139)
+
+- polymer element not compatible with IE [\#1138](https://github.com/Polymer/polymer/issues/1138)
+
+- Element with id="exports" results in uncaught "Observer is not defined" exception [\#1134](https://github.com/Polymer/polymer/issues/1134)
+
+- Data-binding in \<template\> on objects attributes have strange behaviour \[bug?\] [\#1129](https://github.com/Polymer/polymer/issues/1129)
+
+- tipAttribute is not working properly [\#1126](https://github.com/Polymer/polymer/issues/1126)
+
+- IE 10+11 + data binding in inline style not working in Polymer v0.5.4 [\#1124](https://github.com/Polymer/polymer/issues/1124)
+
+- webcomponents.min.js:11 Uncaught TypeError: undefined is not a function [\#1122](https://github.com/Polymer/polymer/issues/1122)
+
+- TypeError: Attempting to configurable attribute of unconfigurable property. [\#1119](https://github.com/Polymer/polymer/issues/1119)
+
+- Template with svg style url\(\#id\) is shimmed with file name [\#751](https://github.com/Polymer/polymer/issues/751)
+
+**Merged pull requests:**
+
+- 0.8 dash case [\#1191](https://github.com/Polymer/polymer/pull/1191) ([sjmiles](https://github.com/sjmiles))
+
+- Add externs. [\#1165](https://github.com/Polymer/polymer/pull/1165) ([garlicnation](https://github.com/garlicnation))
+
+- primer: fix module syntax [\#1162](https://github.com/Polymer/polymer/pull/1162) ([morethanreal](https://github.com/morethanreal))
+
+- nit: fix typo in PRIMER.md [\#1147](https://github.com/Polymer/polymer/pull/1147) ([rictic](https://github.com/rictic))
+
+- Add build script for autoclave [\#1132](https://github.com/Polymer/polymer/pull/1132) ([azakus](https://github.com/azakus))
+
+## [0.5.4](https://github.com/Polymer/polymer/tree/0.5.4) (2015-01-24)
+
+**Closed issues:**
+
+- Dropdown Menu [\#1118](https://github.com/Polymer/polymer/issues/1118)
+
+- Extracting an unknown archive [\#1103](https://github.com/Polymer/polymer/issues/1103)
+
+## [0.5.3](https://github.com/Polymer/polymer/tree/0.5.3) (2015-01-21)
+
+## [0.5.3-rc2](https://github.com/Polymer/polymer/tree/0.5.3-rc2) (2015-01-21)
+
+**Closed issues:**
+
+- problems trying 0.5.3-rc [\#1117](https://github.com/Polymer/polymer/issues/1117)
+
+- Missing e in function - Tutorial [\#1110](https://github.com/Polymer/polymer/issues/1110)
+
+- Cannot find function or filter [\#1102](https://github.com/Polymer/polymer/issues/1102)
+
+- core-icons:work bug [\#1100](https://github.com/Polymer/polymer/issues/1100)
+
+- https://www.polymer-project.org/components/all-of-them/all-of-them.html [\#1096](https://github.com/Polymer/polymer/issues/1096)
+
+- Safari is not opening the demo page of polymer [\#1088](https://github.com/Polymer/polymer/issues/1088)
+
+- 0.8-preview: newline confuses findAnnotatedNode [\#1078](https://github.com/Polymer/polymer/issues/1078)
+
+**Merged pull requests:**
+
+- \[0.8\] name -\> is [\#1112](https://github.com/Polymer/polymer/pull/1112) ([nevir](https://github.com/nevir))
+
+- \[0.8\] Fix small typos in PRIMER.md [\#1098](https://github.com/Polymer/polymer/pull/1098) ([peterwmwong](https://github.com/peterwmwong))
+
+## [0.5.3-rc](https://github.com/Polymer/polymer/tree/0.5.3-rc) (2015-01-15)
+
+**Fixed bugs:**
+
+- Need consistent path behavior [\#651](https://github.com/Polymer/polymer/issues/651)
+
+**Closed issues:**
+
+- Missing scrollbars, and mouse wheel not working [\#1089](https://github.com/Polymer/polymer/issues/1089)
+
+- Very noticeable sluggishness when scrolling [\#1084](https://github.com/Polymer/polymer/issues/1084)
+
+- Can't build 0.8-preview and there is no build information at all [\#1075](https://github.com/Polymer/polymer/issues/1075)
+
+- paper-toggle-button and paper-checkbox events incorrectly documented [\#1074](https://github.com/Polymer/polymer/issues/1074)
+
+- Failed to assign list scroller to scroller of headerPanel [\#1072](https://github.com/Polymer/polymer/issues/1072)
+
+- this.$ gets polluted with shadow dom of other components [\#1069](https://github.com/Polymer/polymer/issues/1069)
+
+- Documentation Wrong and no worked Data binding on IE11 [\#1067](https://github.com/Polymer/polymer/issues/1067)
+
+- How to replace tag name depend on attribute? [\#1064](https://github.com/Polymer/polymer/issues/1064)
+
+- DataBinding not full work in IE \(polymer-0.5.2\) [\#1063](https://github.com/Polymer/polymer/issues/1063)
+
+- Template references in SVG not working [\#1061](https://github.com/Polymer/polymer/issues/1061)
+
+- Docs examples missing custom element name [\#1058](https://github.com/Polymer/polymer/issues/1058)
+
+- :host styles not rendering [\#1057](https://github.com/Polymer/polymer/issues/1057)
+
+- Redraw menu list [\#1054](https://github.com/Polymer/polymer/issues/1054)
+
+- fire message to other element [\#1045](https://github.com/Polymer/polymer/issues/1045)
+
+- img width 100% event [\#1044](https://github.com/Polymer/polymer/issues/1044)
+
+- Typo [\#1041](https://github.com/Polymer/polymer/issues/1041)
+
+- Please hire a competent technical writer [\#1036](https://github.com/Polymer/polymer/issues/1036)
+
+- Chrome: Faulty responsiveness if window size is instantly changed [\#1034](https://github.com/Polymer/polymer/issues/1034)
+
+- Polymer in 10 minutes - horizontal scroll bar doesn't work in chrome [\#1030](https://github.com/Polymer/polymer/issues/1030)
+
+- Arguments in the function expressions are not watched - binding fails [\#1021](https://github.com/Polymer/polymer/issues/1021)
+
+- core-selector doesn't work on FF/linux for core\_elements \>= 5.0 [\#1015](https://github.com/Polymer/polymer/issues/1015)
+
+- Missing web-animations-next-lite.min.js [\#1014](https://github.com/Polymer/polymer/issues/1014)
+
+- webcomponents.js doesn't work [\#1013](https://github.com/Polymer/polymer/issues/1013)
+
+- The main page and demos doesn't work on Firefox!!!! [\#1007](https://github.com/Polymer/polymer/issues/1007)
+
+- Remember scroll position of selected page and prevent auto scrolling when selecting a other page. [\#1000](https://github.com/Polymer/polymer/issues/1000)
+
+- No field view on iOS 8 [\#986](https://github.com/Polymer/polymer/issues/986)
+
+- \<meta name="layout" content="polymer or some other layout2"\> [\#959](https://github.com/Polymer/polymer/issues/959)
+
+- Stoped to render on firefox after .35 update \(trying to fix jquery conflict\) [\#697](https://github.com/Polymer/polymer/issues/697)
+
+- on-click doesn't work with bootstrap and jQuery [\#625](https://github.com/Polymer/polymer/issues/625)
+
+**Merged pull requests:**
+
+- Adjust to the new unit test layout [\#1093](https://github.com/Polymer/polymer/pull/1093) ([nevir](https://github.com/nevir))
+
+- Make `ready` independent of attached state and make distribution go top-down logically and composition unwind bottom-up [\#1039](https://github.com/Polymer/polymer/pull/1039) ([sorvell](https://github.com/sorvell))
+
+- 0.8 simplex [\#1028](https://github.com/Polymer/polymer/pull/1028) ([sorvell](https://github.com/sorvell))
+
+- Expands the `\<content\>` element to remember logical DOM [\#1017](https://github.com/Polymer/polymer/pull/1017) ([jmesserly](https://github.com/jmesserly))
+
+## [0.5.2](https://github.com/Polymer/polymer/tree/0.5.2) (2014-12-11)
+
+**Closed issues:**
+
+- Best\(?\) practice for loading & saving relational data [\#1008](https://github.com/Polymer/polymer/issues/1008)
+
+- the demos don't work in Chrome and Opera [\#1006](https://github.com/Polymer/polymer/issues/1006)
+
+- one click triggers two popup of paper-dropdown-menu [\#1004](https://github.com/Polymer/polymer/issues/1004)
+
+- polymer-project.org bad link [\#1003](https://github.com/Polymer/polymer/issues/1003)
+
+- \[Firefox\] \[Regression 0.4.2 -\> 0.5.0\] `on-tap` event not catched [\#997](https://github.com/Polymer/polymer/issues/997)
+
+- In Q&A, answer about hosting for tests is misleading [\#994](https://github.com/Polymer/polymer/issues/994)
+
+- core-overlay not working on firefox 34 [\#993](https://github.com/Polymer/polymer/issues/993)
+
+- Circular dependency between core-iconset and core-icon bower modules [\#992](https://github.com/Polymer/polymer/issues/992)
+
+- www.polymer-project.org unusable in firefox [\#991](https://github.com/Polymer/polymer/issues/991)
+
+- \<core-tooltip\> and paper-fab don't like each other. [\#988](https://github.com/Polymer/polymer/issues/988)
+
+- Weird bug in Firefox and Safari [\#984](https://github.com/Polymer/polymer/issues/984)
+
+- Polymer 0.5.0 for iOS 8 Console reports ReferenceError: Can't find variable: logFlags [\#981](https://github.com/Polymer/polymer/issues/981)
+
+- 404 Documentation Link [\#977](https://github.com/Polymer/polymer/issues/977)
+
+- scrolling over a paper-input-decorator using a touch device selects that input making it nearly impossible to scroll over paper-input fields on a mobile device [\#973](https://github.com/Polymer/polymer/issues/973)
+
+- core-item ignores clicks on polymer-project.org in Firefox [\#968](https://github.com/Polymer/polymer/issues/968)
+
+- https://www.polymer-project.org/platform/custom-elements.html has a 404 for the "Shadow dom" button [\#967](https://github.com/Polymer/polymer/issues/967)
+
+- ZIP download missing minified webcomponents.js [\#965](https://github.com/Polymer/polymer/issues/965)
+
+- Unable to get on-core-select to fire in paper-dropdown-menu [\#957](https://github.com/Polymer/polymer/issues/957)
+
+- 0.5.1 Element Name could not be inferred | Safari && Mobile Safari [\#956](https://github.com/Polymer/polymer/issues/956)
+
+- url relative path ../ not works for cross domain link import [\#955](https://github.com/Polymer/polymer/issues/955)
+
+- url relative path ../ not works for cross domain link import [\#954](https://github.com/Polymer/polymer/issues/954)
+
+- Can't get a \<core-menu-button\> component in \<core-toolbar\> to show child nodes [\#951](https://github.com/Polymer/polymer/issues/951)
+
+- paper-autogrow text not in bower update [\#949](https://github.com/Polymer/polymer/issues/949)
+
+- Need info how to test polymer elements using Selenium. [\#948](https://github.com/Polymer/polymer/issues/948)
+
+- "horizontal layout wrap" broken in fireFox [\#945](https://github.com/Polymer/polymer/issues/945)
+
+- Zip file is empty upon download [\#943](https://github.com/Polymer/polymer/issues/943)
+
+- on-tap not working on Firefox [\#941](https://github.com/Polymer/polymer/issues/941)
+
+- \[Question\] Using Polymer for progressive enhancement [\#940](https://github.com/Polymer/polymer/issues/940)
+
+- Buttons not working after vulcanize [\#935](https://github.com/Polymer/polymer/issues/935)
+
+- Dropdown Resizing [\#930](https://github.com/Polymer/polymer/issues/930)
+
+- demo content [\#929](https://github.com/Polymer/polymer/issues/929)
+
+- https://www.polymer-project.org/components/web-component-tester/browser.js not found [\#928](https://github.com/Polymer/polymer/issues/928)
+
+- web-animations.html missing from web-animations-next - \(Polymer 0.5.1\) [\#923](https://github.com/Polymer/polymer/issues/923)
+
+- Paper Menu button page on Polymer website shows example for paper dropdown menu not paper menu button [\#922](https://github.com/Polymer/polymer/issues/922)
+
+- Click handlers don't work anymore on iOS with 0.5.0 [\#918](https://github.com/Polymer/polymer/issues/918)
+
+- paper-dropdown-menu not working correctly or documentation needs update. [\#911](https://github.com/Polymer/polymer/issues/911)
+
+- Add API for communicating hide/show/resize from parents to interested children [\#849](https://github.com/Polymer/polymer/issues/849)
+
+- bower install on yosemite [\#808](https://github.com/Polymer/polymer/issues/808)
+
+- Two finger touch events - not working [\#802](https://github.com/Polymer/polymer/issues/802)
+
+- Create a core-label, associate a label with a child focusable control [\#793](https://github.com/Polymer/polymer/issues/793)
+
+- Not possible to stay on older version \(0.3.5\) [\#758](https://github.com/Polymer/polymer/issues/758)
+
+**Merged pull requests:**
+
+- 0.8 miceplay [\#1012](https://github.com/Polymer/polymer/pull/1012) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Spelling correction. [\#996](https://github.com/Polymer/polymer/pull/996) ([germ13](https://github.com/germ13))
+
+- Use possessive "its" [\#970](https://github.com/Polymer/polymer/pull/970) ([BrianGeppert](https://github.com/BrianGeppert))
+
+- README update [\#927](https://github.com/Polymer/polymer/pull/927) ([rottina](https://github.com/rottina))
+
+## [0.5.1](https://github.com/Polymer/polymer/tree/0.5.1) (2014-11-12)
+
+**Closed issues:**
+
+- Bug on site [\#920](https://github.com/Polymer/polymer/issues/920)
+
+- href in my element not working on iOS [\#919](https://github.com/Polymer/polymer/issues/919)
+
+- \[Polymer\#0.5.0\]\[Safari\] TypeError: undefined is not an object \(evaluating 'HTMLImports.path.resolveUrlsInStyle'\) \(url.js line 199\) [\#915](https://github.com/Polymer/polymer/issues/915)
+
+- \[Polymer\#0.5.0\]\[Firefox\] TypeError: HTMLImports.path is undefined \(platform.js line 14\) [\#914](https://github.com/Polymer/polymer/issues/914)
+
+- \[Polymer\#0.5.0\]\[Chrome\] Uncaught TypeError: Cannot read property 'parse' of undefined \(boot.js line 14\) [\#913](https://github.com/Polymer/polymer/issues/913)
+
+- web-animations-next/web-animations.html file missing [\#909](https://github.com/Polymer/polymer/issues/909)
+
+- No release notes for 0.5.0 [\#908](https://github.com/Polymer/polymer/issues/908)
+
+- Back button navigation sometimes broken on polymer-project website [\#907](https://github.com/Polymer/polymer/issues/907)
+
+- Designer Tool page appears blank [\#906](https://github.com/Polymer/polymer/issues/906)
+
+- Polymer is undefined in IE11 [\#905](https://github.com/Polymer/polymer/issues/905)
+
+- Using polymer with Jinja2 server side templating [\#904](https://github.com/Polymer/polymer/issues/904)
+
+- ERR\_CONNECTION\_CLOSED trying to visit blog.polymer-project.org [\#894](https://github.com/Polymer/polymer/issues/894)
+
+- Consider not dirty check polling when the tab is not visible [\#892](https://github.com/Polymer/polymer/issues/892)
+
+## [0.5.0](https://github.com/Polymer/polymer/tree/0.5.0) (2014-11-10)
+
+**Fixed bugs:**
+
+- Links to "\#" get rewritten to just "" which causes a refresh if clicked [\#672](https://github.com/Polymer/polymer/issues/672)
+
+**Closed issues:**
+
+- Incorrect behaviour for disabled fields with Polymer paper-input-decorator [\#901](https://github.com/Polymer/polymer/issues/901)
+
+- Ajax responseChanged return logged twice [\#900](https://github.com/Polymer/polymer/issues/900)
+
+- behavior difference between \<my-component/\> and \<my-component\>\</my-component\> [\#899](https://github.com/Polymer/polymer/issues/899)
+
+- on-tap does not cause paper-input value to be committed [\#890](https://github.com/Polymer/polymer/issues/890)
+
+- \<paper-item\> has 'iconSrc' attribute, should be 'src' like \<paper-fab\>, \<paper-icon-button\> and \<paper-menu-button\> [\#889](https://github.com/Polymer/polymer/issues/889)
+
+- paper-input documentation lacks details on field validation [\#888](https://github.com/Polymer/polymer/issues/888)
+
+- paper-input documentation inconsistently suggests theming via JS properties [\#887](https://github.com/Polymer/polymer/issues/887)
+
+- paper-input documentation suggests html /deep/ selectors, inconsistent with other elements [\#886](https://github.com/Polymer/polymer/issues/886)
+
+- paper-input cursor doesn't seem to support theming [\#885](https://github.com/Polymer/polymer/issues/885)
+
+- paper-input styling instructions lack the ::shadow pseudo-element [\#884](https://github.com/Polymer/polymer/issues/884)
+
+- paper-dropdown-menu: selectedProperty doesn't seem to work [\#881](https://github.com/Polymer/polymer/issues/881)
+
+- Add support for native ES6 class Symbol [\#880](https://github.com/Polymer/polymer/issues/880)
+
+- demo page fails https://www.polymer-project.org/components/core-ajax/demo.html [\#838](https://github.com/Polymer/polymer/issues/838)
+
+- core-icon-button does but paper-icon-button does not load core-iconset-svg [\#834](https://github.com/Polymer/polymer/issues/834)
+
+- paper-fab button href bad [\#830](https://github.com/Polymer/polymer/issues/830)
+
+- Documentation error on core-animation [\#828](https://github.com/Polymer/polymer/issues/828)
+
+- Data-binding within component inside template style [\#827](https://github.com/Polymer/polymer/issues/827)
+
+- Can't scroll using mouse or keyboard [\#817](https://github.com/Polymer/polymer/issues/817)
+
+- On-tap sends event twice on touch device [\#814](https://github.com/Polymer/polymer/issues/814)
+
+- paper-button raised attribute does not work properly when set programmatically [\#812](https://github.com/Polymer/polymer/issues/812)
+
+- Trying to import core-ajax I get an appendChild on \#document error [\#810](https://github.com/Polymer/polymer/issues/810)
+
+- core-ajax demo not working [\#807](https://github.com/Polymer/polymer/issues/807)
+
+- Disabled on Switch is not working [\#806](https://github.com/Polymer/polymer/issues/806)
+
+- core-dropdown 0.4.2 not working [\#804](https://github.com/Polymer/polymer/issues/804)
+
+- paper-button has wrong documentation [\#801](https://github.com/Polymer/polymer/issues/801)
+
+- Importing Polymer fails, cannot find WebComponents [\#797](https://github.com/Polymer/polymer/issues/797)
+
+- Link Tooling information is down [\#792](https://github.com/Polymer/polymer/issues/792)
+
+- Can't set the background color of paper-progress from javascript [\#787](https://github.com/Polymer/polymer/issues/787)
+
+- Element stops working if taken off the DOM and put back in [\#782](https://github.com/Polymer/polymer/issues/782)
+
+- paper drop down list showing in middle of screen first time. [\#776](https://github.com/Polymer/polymer/issues/776)
+
+- Template repeat index value is evaluated only after loop end [\#774](https://github.com/Polymer/polymer/issues/774)
+
+- Polymer + Cordova + PhoneGap + iOS = Very Laggy / Slow? [\#773](https://github.com/Polymer/polymer/issues/773)
+
+- Repository error [\#767](https://github.com/Polymer/polymer/issues/767)
+
+- problem accessing polymer properties from content script [\#753](https://github.com/Polymer/polymer/issues/753)
+
+- Polymer as UI only [\#752](https://github.com/Polymer/polymer/issues/752)
+
+**Merged pull requests:**
+
+- add space between "go" and "to" [\#778](https://github.com/Polymer/polymer/pull/778) ([jodytate](https://github.com/jodytate))
+
+- Create a basic jsdoc externs file for Polymer [\#769](https://github.com/Polymer/polymer/pull/769) ([rictic](https://github.com/rictic))
+
+## [0.4.2](https://github.com/Polymer/polymer/tree/0.4.2) (2014-10-02)
+
+**Closed issues:**
+
+- 'Flexible children' example doesn't work. [\#772](https://github.com/Polymer/polymer/issues/772)
+
+- Google Drive Element Error in IE [\#771](https://github.com/Polymer/polymer/issues/771)
+
+- doesn't work in a zip file [\#766](https://github.com/Polymer/polymer/issues/766)
+
+- Paper-Dialog on page load doesnt work in firefox. [\#761](https://github.com/Polymer/polymer/issues/761)
+
+- Extending input not working in Chromium 37.0.2062.94 Ubuntu 14.10 \(290621\) \(64-bit\) [\#754](https://github.com/Polymer/polymer/issues/754)
+
+- core-list scroll [\#748](https://github.com/Polymer/polymer/issues/748)
+
+- Topeka responsiveness [\#708](https://github.com/Polymer/polymer/issues/708)
+
+- Chrome - animation glitch [\#593](https://github.com/Polymer/polymer/issues/593)
+
+## [0.3.6](https://github.com/Polymer/polymer/tree/0.3.6) (2014-09-18)
+
+## [0.4.1](https://github.com/Polymer/polymer/tree/0.4.1) (2014-09-18)
+
+**Implemented enhancements:**
+
+- Feature request: testing whether a custom element extends a certain type [\#380](https://github.com/Polymer/polymer/issues/380)
+
+**Fixed bugs:**
+
+- Elements failing `instanceof` after WebComponentsReady [\#402](https://github.com/Polymer/polymer/issues/402)
+
+**Closed issues:**
+
+- OSX Yosemite [\#750](https://github.com/Polymer/polymer/issues/750)
+
+- File structure not the same, when using bower [\#747](https://github.com/Polymer/polymer/issues/747)
+
+- Closing the overlay resets the position to center of window [\#746](https://github.com/Polymer/polymer/issues/746)
+
+- noscript breaks inheritance [\#740](https://github.com/Polymer/polymer/issues/740)
+
+- In age-slider example, using space in name results in truncated name [\#739](https://github.com/Polymer/polymer/issues/739)
+
+- Improve documentation for core-icon when using custom icon sets [\#738](https://github.com/Polymer/polymer/issues/738)
+
+- Broken Link in Docs/CreatingElements/AddPropertiesAndMethods [\#737](https://github.com/Polymer/polymer/issues/737)
+
+- Miss placing script element inside a polymer element lead to miss leading error message [\#736](https://github.com/Polymer/polymer/issues/736)
+
+- Not a BUG - FYI: Update tutorial - core-icon-button [\#730](https://github.com/Polymer/polymer/issues/730)
+
+- FormData wrapper breaks XMLHttpRequest\#send\(FormData\) in Firefox [\#725](https://github.com/Polymer/polymer/issues/725)
+
+- Tap event does not fire for SVG elements anymore [\#722](https://github.com/Polymer/polymer/issues/722)
+
+- Computed property can't be data-bound from outside [\#638](https://github.com/Polymer/polymer/issues/638)
+
+- IE issues [\#592](https://github.com/Polymer/polymer/issues/592)
+
+- ShadowDOM renderer invalidated after insertion-point distribution [\#512](https://github.com/Polymer/polymer/issues/512)
+
+- Content inside `\<template\>` breaks extending `\<body\>` element. [\#421](https://github.com/Polymer/polymer/issues/421)
+
+## [0.4.0](https://github.com/Polymer/polymer/tree/0.4.0) (2014-08-28)
+
+**Implemented enhancements:**
+
+- Use the John Resig inheritance to define the component prototype [\#647](https://github.com/Polymer/polymer/issues/647)
+
+- on-\* expression support [\#446](https://github.com/Polymer/polymer/issues/446)
+
+- add component-laid-out lifecycle callback [\#434](https://github.com/Polymer/polymer/issues/434)
+
+- Allow creating \<polymer-element\>s without Shadow DOM [\#222](https://github.com/Polymer/polymer/issues/222)
+
+- Consider adding support for loading user selectable css resources per element [\#219](https://github.com/Polymer/polymer/issues/219)
+
+- Provide a provide a way to instantiate the template directly into the element [\#157](https://github.com/Polymer/polymer/issues/157)
+
+- Consider deserializing to Date from attributes, if property is Date-valued [\#119](https://github.com/Polymer/polymer/issues/119)
+
+**Fixed bugs:**
+
+- polymer-body double fire `ready`/`created`/`attached` [\#447](https://github.com/Polymer/polymer/issues/447)
+
+- Polymer's controller-styles system doesn't work well with ShadowDOMPolyfill [\#224](https://github.com/Polymer/polymer/issues/224)
+
+- Globals clobbering other globals [\#185](https://github.com/Polymer/polymer/issues/185)
+
+- `bind` boilerplate base is inflexible [\#179](https://github.com/Polymer/polymer/issues/179)
+
+**Closed issues:**
+
+- Possible shared state on core elements. [\#731](https://github.com/Polymer/polymer/issues/731)
+
+- paper-input element doesn't show keyboard on Firefox OS 2.0 [\#727](https://github.com/Polymer/polymer/issues/727)
+
+- designerr on polymer page lacks demo'd functioniality from youtube quickstart. [\#726](https://github.com/Polymer/polymer/issues/726)
+
+- PhantomJS Support [\#724](https://github.com/Polymer/polymer/issues/724)
+
+- http://www.polymer-project.org/platform/web-animations.html [\#721](https://github.com/Polymer/polymer/issues/721)
+
+- Polymer site appears broken on Safari 8 [\#719](https://github.com/Polymer/polymer/issues/719)
+
+- Non ASCII strings set in JavaScript show up as ? in Firefox [\#717](https://github.com/Polymer/polymer/issues/717)
+
+- Materials page in Polymer is not rendering correctly [\#716](https://github.com/Polymer/polymer/issues/716)
+
+- Polymer elements not rendering in Android 4.1.2 and 4.2.1. Works on 4.4.2 [\#714](https://github.com/Polymer/polymer/issues/714)
+
+- Bower private packages & stats [\#711](https://github.com/Polymer/polymer/issues/711)
+
+- Step-4 of tutorial code for post-card Polymer prototype does not use element name [\#710](https://github.com/Polymer/polymer/issues/710)
+
+- Polymer does absolutely nothing if you have an "undeclared" element [\#709](https://github.com/Polymer/polymer/issues/709)
+
+- Syntax error in example bower.json [\#707](https://github.com/Polymer/polymer/issues/707)
+
+- Semver not being followed correctly [\#704](https://github.com/Polymer/polymer/issues/704)
+
+- Safari bug when rendering a table using nested loops [\#700](https://github.com/Polymer/polymer/issues/700)
+
+- Clicking on Paper Tab execute twice [\#696](https://github.com/Polymer/polymer/issues/696)
+
+- div with tool attribute does not allow flex for div within [\#695](https://github.com/Polymer/polymer/issues/695)
+
+- it keeps resetting [\#694](https://github.com/Polymer/polymer/issues/694)
+
+- Handlers disappearing when you hide the template [\#690](https://github.com/Polymer/polymer/issues/690)
+
+- on-change event triggered twice [\#687](https://github.com/Polymer/polymer/issues/687)
+
+- Consider making core-component-page a devDependency [\#683](https://github.com/Polymer/polymer/issues/683)
+
+- custom nodes within svg aren't created [\#681](https://github.com/Polymer/polymer/issues/681)
+
+- App not rendering on IE and Firefox [\#668](https://github.com/Polymer/polymer/issues/668)
+
+- Clarification on the modularity of Polymer within external web component scripts: Is Polymer designed in a way to export it as a \(commonjs\) module? [\#666](https://github.com/Polymer/polymer/issues/666)
+
+- Future Support for Installing Polymer through Chocolatey package manager [\#657](https://github.com/Polymer/polymer/issues/657)
+
+- RangeError: Maximum call stack size exceeded. On Safari 7.0.5 [\#656](https://github.com/Polymer/polymer/issues/656)
+
+- transform-style: preserve-3d causing odd stutter on hover of custom element [\#652](https://github.com/Polymer/polymer/issues/652)
+
+- fire should only check for null and undefined. [\#646](https://github.com/Polymer/polymer/issues/646)
+
+- 'target' field in 'event' argument passed into callback function for click/pointer events refers to first element instantiated [\#641](https://github.com/Polymer/polymer/issues/641)
+
+- document.querySelectorAll sluggish on Firefox \(v30\) for large DOM [\#629](https://github.com/Polymer/polymer/issues/629)
+
+- TemplateBinding should warn/console log about using bind with references. [\#615](https://github.com/Polymer/polymer/issues/615)
+
+- platform fails to load [\#606](https://github.com/Polymer/polymer/issues/606)
+
+- Can't keyboard nav around a custom element in a div that has contenteditable="true" [\#601](https://github.com/Polymer/polymer/issues/601)
+
+- Polymer doesn't appear to work at all under iOS 8 beta 2 [\#591](https://github.com/Polymer/polymer/issues/591)
+
+- Resources not loading in http://www.polymer-project.org/tools/designer/ [\#585](https://github.com/Polymer/polymer/issues/585)
+
+- Unable to extend iframe [\#580](https://github.com/Polymer/polymer/issues/580)
+
+- Custom element that performs dynamic HTML Import gets corrupted offsetWidth when used inside \<template\> [\#554](https://github.com/Polymer/polymer/issues/554)
+
+- Wrap as UMD - Do not force window global [\#534](https://github.com/Polymer/polymer/issues/534)
+
+- Difference in inherited styles between Chrome & other browsers [\#531](https://github.com/Polymer/polymer/issues/531)
+
+- Problem during bower install [\#529](https://github.com/Polymer/polymer/issues/529)
+
+- Adding method `childrenChanged` crashes Firefox/Safari [\#528](https://github.com/Polymer/polymer/issues/528)
+
+- fire and asyncFire need return values [\#527](https://github.com/Polymer/polymer/issues/527)
+
+- Errors in Safari 7 with Polymer 0.3.1 [\#523](https://github.com/Polymer/polymer/issues/523)
+
+- Polymer not working in elementary OS [\#520](https://github.com/Polymer/polymer/issues/520)
+
+- Two way binding with Html attribute [\#519](https://github.com/Polymer/polymer/issues/519)
+
+- Polyfills crashing jsbin [\#517](https://github.com/Polymer/polymer/issues/517)
+
+- Polymer breaks dependency resolution with query strings [\#513](https://github.com/Polymer/polymer/issues/513)
+
+- binding to a builtin name fails cryptically [\#510](https://github.com/Polymer/polymer/issues/510)
+
+- Content of nested template is empty [\#500](https://github.com/Polymer/polymer/issues/500)
+
+- Extending Vanilla JS Custom Element with polymer-element [\#496](https://github.com/Polymer/polymer/issues/496)
+
+- Trouble in latest Canary reading styles in attached handler of imported element [\#493](https://github.com/Polymer/polymer/issues/493)
+
+- Keyboard Support [\#473](https://github.com/Polymer/polymer/issues/473)
+
+- HTML Imports polyfill is missing the .import property [\#471](https://github.com/Polymer/polymer/issues/471)
+
+- Pseudo-classes in \<content\> select attribute [\#470](https://github.com/Polymer/polymer/issues/470)
+
+- Using a keyword in attribute name causes error in IE11 [\#466](https://github.com/Polymer/polymer/issues/466)
+
+- Error - Uncaught Possible attempt to load Polymer twice [\#464](https://github.com/Polymer/polymer/issues/464)
+
+- Get full list of polymer-elements. [\#460](https://github.com/Polymer/polymer/issues/460)
+
+- document.registerElement raises error "Options missing required prototype property" [\#455](https://github.com/Polymer/polymer/issues/455)
+
+- Exception when updating inner child element attributes from an object property in a repeat [\#454](https://github.com/Polymer/polymer/issues/454)
+
+- Double quotes don't work in polyfill-next-selector content [\#453](https://github.com/Polymer/polymer/issues/453)
+
+- title attribute cause issue in firefox [\#451](https://github.com/Polymer/polymer/issues/451)
+
+- template bind="x as y" doesn't work on safari [\#450](https://github.com/Polymer/polymer/issues/450)
+
+- Generating an observe block in created or ready doesn't bind [\#448](https://github.com/Polymer/polymer/issues/448)
+
+- \<polymer-ui-accordion\> doesn't always work with Shadow DOM polyfill [\#444](https://github.com/Polymer/polymer/issues/444)
+
+- Polymer breaks `instanceof` for native elements. [\#424](https://github.com/Polymer/polymer/issues/424)
+
+- Add @license tag [\#413](https://github.com/Polymer/polymer/issues/413)
+
+- Can't turn body into custom element via is="..." [\#409](https://github.com/Polymer/polymer/issues/409)
+
+- bindProperties logger call refers to nonexistent variables [\#406](https://github.com/Polymer/polymer/issues/406)
+
+- Polymer fails to render elements when query string contains a slash [\#401](https://github.com/Polymer/polymer/issues/401)
+
+- Using native CustomElements and ShadowDOM polyfill together may cause unwanted attached/detached callbacks being called [\#399](https://github.com/Polymer/polymer/issues/399)
+
+- Variable picked by `constructor` attribute is set after upgrade events. [\#398](https://github.com/Polymer/polymer/issues/398)
+
+- Exception when invoking super from ready when the node is created by \<template repeat\> [\#397](https://github.com/Polymer/polymer/issues/397)
+
+- automatic node finding within a template-if [\#387](https://github.com/Polymer/polymer/issues/387)
+
+- Challenges of building a menu system in Polymer [\#382](https://github.com/Polymer/polymer/issues/382)
+
+- XSS Vulnerability [\#375](https://github.com/Polymer/polymer/issues/375)
+
+- Publishing an attribute named 'disabled' generates exception in IE10 [\#372](https://github.com/Polymer/polymer/issues/372)
+
+- template if expression, trailing blanks should be ignored [\#370](https://github.com/Polymer/polymer/issues/370)
+
+- processing bindings in a specific order [\#368](https://github.com/Polymer/polymer/issues/368)
+
+- AngularJS incompatibility: need to unwrap elements when jqLite.data\(\) is used [\#363](https://github.com/Polymer/polymer/issues/363)
+
+- Polymer makes getScreenCTM\(\) crash [\#351](https://github.com/Polymer/polymer/issues/351)
+
+- Sorting an array can result in an \*Changed method firing [\#350](https://github.com/Polymer/polymer/issues/350)
+
+- Reentrancy question: reflectPropertyToAttribute can trigger unwanted attributedChanged effects [\#349](https://github.com/Polymer/polymer/issues/349)
+
+- ShadowDOMPolyfill is way, way too intrusive! [\#346](https://github.com/Polymer/polymer/issues/346)
+
+- Separate out platform.js from polymer core [\#344](https://github.com/Polymer/polymer/issues/344)
+
+- Attribute values should be copied to property values before `created` [\#342](https://github.com/Polymer/polymer/issues/342)
+
+- custom event handler matching is case sensitive [\#340](https://github.com/Polymer/polymer/issues/340)
+
+- Fragments in links get rewritten to point to directory of import [\#339](https://github.com/Polymer/polymer/issues/339)
+
+- Address polymer-elements that take child elements [\#337](https://github.com/Polymer/polymer/issues/337)
+
+- Declarative event discovery on custom elements [\#336](https://github.com/Polymer/polymer/issues/336)
+
+- test-button element class with extends="button" can't be instantiated with \<test-button\> syntax [\#334](https://github.com/Polymer/polymer/issues/334)
+
+- Page rendering issue - navigation [\#333](https://github.com/Polymer/polymer/issues/333)
+
+- Cannot modify a template's contents while it is stamping [\#330](https://github.com/Polymer/polymer/issues/330)
+
+- Publish sub-projects on npm, add them to package.json. [\#326](https://github.com/Polymer/polymer/issues/326)
+
+- stack: "TypeError: Object \#\<Object\> has no method 'getAttr [\#325](https://github.com/Polymer/polymer/issues/325)
+
+- Support angular/django style filters [\#323](https://github.com/Polymer/polymer/issues/323)
+
+- createElement-wrapped \<img\> throws TypeError on \<canvas\> drawImage [\#316](https://github.com/Polymer/polymer/issues/316)
+
+- Databinding breaks after removing and reattaching an element to the DOM [\#311](https://github.com/Polymer/polymer/issues/311)
+
+- Ensure {{}} are removed after binding [\#304](https://github.com/Polymer/polymer/issues/304)
+
+- Getting started instructions incomplete: no polymer.min.js [\#300](https://github.com/Polymer/polymer/issues/300)
+
+- Site is not showing properly in IE11 [\#299](https://github.com/Polymer/polymer/issues/299)
+
+- Prevent event bubbling in polyfill [\#296](https://github.com/Polymer/polymer/issues/296)
+
+- Prevent duplicate ID's in polyfill [\#295](https://github.com/Polymer/polymer/issues/295)
+
+- remove use of deprecated cancelBubble? [\#292](https://github.com/Polymer/polymer/issues/292)
+
+- Polymer throws error in Canary when registering an element via import [\#290](https://github.com/Polymer/polymer/issues/290)
+
+- Type Convert Error when work with canvas [\#288](https://github.com/Polymer/polymer/issues/288)
+
+- DOM Spec Input - Virtual MutationRecords [\#281](https://github.com/Polymer/polymer/issues/281)
+
+- polymer animation not support ios [\#279](https://github.com/Polymer/polymer/issues/279)
+
+- Event.cancelBubble cannot be used for stopping event propagation in Polymer [\#275](https://github.com/Polymer/polymer/issues/275)
+
+- Consider removing controllerStyles and requiring explicitly adding stylesheets [\#272](https://github.com/Polymer/polymer/issues/272)
+
+- Write up suggestions on dealing with performance [\#269](https://github.com/Polymer/polymer/issues/269)
+
+- improve on-\* delegation by introducing control for Polymer-bubbling \(as distinct from DOM bubbling\) [\#259](https://github.com/Polymer/polymer/issues/259)
+
+- Consider issuing a warning when a polymer-element's shadowRoot contains un-upgraded custom elements [\#258](https://github.com/Polymer/polymer/issues/258)
+
+- on-tap doesn't fire all the time that on-click does [\#255](https://github.com/Polymer/polymer/issues/255)
+
+- Chrome Packaged App: including the UI elements is not convenient [\#248](https://github.com/Polymer/polymer/issues/248)
+
+- Polymer doesn't work on Iceweasel web browser [\#247](https://github.com/Polymer/polymer/issues/247)
+
+- It's confusing that you need to nest a \<template repeat\> inside an outermost \<template\>. [\#245](https://github.com/Polymer/polymer/issues/245)
+
+- http://www.polymer-project.org/tooling-strategy.html is a bit spare [\#244](https://github.com/Polymer/polymer/issues/244)
+
+- documentation for attributeChanged is wrong [\#242](https://github.com/Polymer/polymer/issues/242)
+
+- Using scoped models impacts 2-way property binding [\#220](https://github.com/Polymer/polymer/issues/220)
+
+- loader seems to fail at random, but frequently when serving from localhost [\#218](https://github.com/Polymer/polymer/issues/218)
+
+- Cloned attributes should not override user attributes in markup [\#190](https://github.com/Polymer/polymer/issues/190)
+
+- Sugaring dynamics in ShadowDOM [\#176](https://github.com/Polymer/polymer/issues/176)
+
+- Asynchronous attribute declaration [\#160](https://github.com/Polymer/polymer/issues/160)
+
+- Consider adding broadcast [\#145](https://github.com/Polymer/polymer/issues/145)
+
+- explore performance impact of import-order of components [\#108](https://github.com/Polymer/polymer/issues/108)
+
+- title attribute [\#97](https://github.com/Polymer/polymer/issues/97)
+
+- Write doc about attributes and type inference when applying to properties [\#93](https://github.com/Polymer/polymer/issues/93)
+
+- Confusing cancelBubble [\#74](https://github.com/Polymer/polymer/issues/74)
+
+## [0.3.5](https://github.com/Polymer/polymer/tree/0.3.5) (2014-08-08)
+
+**Closed issues:**
+
+- Internet explorer is not binding inside \<select\> tag [\#692](https://github.com/Polymer/polymer/issues/692)
+
+- \<core-collapse\> syntax issue. [\#689](https://github.com/Polymer/polymer/issues/689)
+
+- TemplateBinding.js Uncaught HierarchyRequestError [\#688](https://github.com/Polymer/polymer/issues/688)
+
+- TypeError: Argument 1 of Window.getDefaultComputedStyle does not implement interface Element [\#686](https://github.com/Polymer/polymer/issues/686)
+
+- Not working in Safari - Window [\#682](https://github.com/Polymer/polymer/issues/682)
+
+- Polymer should respect XHTML syntax [\#680](https://github.com/Polymer/polymer/issues/680)
+
+- polymer design tool issue [\#679](https://github.com/Polymer/polymer/issues/679)
+
+- Incomplete zip files. [\#676](https://github.com/Polymer/polymer/issues/676)
+
+- Polymer Designer always deletes everything [\#674](https://github.com/Polymer/polymer/issues/674)
+
+- Wrong import path on Designer Preview when importing polymer.html [\#670](https://github.com/Polymer/polymer/issues/670)
+
+- error 404 on core-transition demo page [\#669](https://github.com/Polymer/polymer/issues/669)
+
+- Polymer site is not reachable. [\#667](https://github.com/Polymer/polymer/issues/667)
+
+- TypeError and NetworkError when starting the designer tool from the url [\#665](https://github.com/Polymer/polymer/issues/665)
+
+- Scroll disappearing on Polymer Website [\#661](https://github.com/Polymer/polymer/issues/661)
+
+- paper-menu-button is not responsive [\#660](https://github.com/Polymer/polymer/issues/660)
+
+- Core-drawer-panel hardcoded drawer width [\#659](https://github.com/Polymer/polymer/issues/659)
+
+- the BSD license link at the bottom of http://www.polymer-project.org/ is a 404 [\#655](https://github.com/Polymer/polymer/issues/655)
+
+- Polymer breaks URL [\#653](https://github.com/Polymer/polymer/issues/653)
+
+- Cannot install polymer 0.3.4 [\#643](https://github.com/Polymer/polymer/issues/643)
+
+- Polymer breaks KnockoutJS outside of Chrome [\#640](https://github.com/Polymer/polymer/issues/640)
+
+- Paper button keeps flashing [\#639](https://github.com/Polymer/polymer/issues/639)
+
+- \<core-style\> should use an element that parses in plain text mode [\#637](https://github.com/Polymer/polymer/issues/637)
+
+- "Assertion Failed" unwrapping event [\#636](https://github.com/Polymer/polymer/issues/636)
+
+- Rating Slider Knob goes outside boundaries [\#635](https://github.com/Polymer/polymer/issues/635)
+
+- typo on http://www.polymer-project.org/docs/elements/paper-elements.html\#paper-menu-button [\#632](https://github.com/Polymer/polymer/issues/632)
+
+- core-list is inefficient in data initialization [\#631](https://github.com/Polymer/polymer/issues/631)
+
+- Closing tags with /\> leads to ignored shadow DOM content [\#628](https://github.com/Polymer/polymer/issues/628)
+
+- Paper Elements use inline scripts =\> violate Chrome packaged app CSP rules [\#613](https://github.com/Polymer/polymer/issues/613)
+
+- paper-tab::shadow \#ink glitches when click is held [\#611](https://github.com/Polymer/polymer/issues/611)
+
+- Core-toolbar breaking material design speck [\#605](https://github.com/Polymer/polymer/issues/605)
+
+- \<input list="x"\>\<datalist id="x"\> as a component used within another component [\#600](https://github.com/Polymer/polymer/issues/600)
+
+- core-scroll-header-panel won't hide navigation bar on Android \(stable and beta\) [\#569](https://github.com/Polymer/polymer/issues/569)
+
+- Scroll Header Panel flowing over panel scroll bar [\#555](https://github.com/Polymer/polymer/issues/555)
+
+- Drawer Panel is not working. [\#550](https://github.com/Polymer/polymer/issues/550)
+
+- Polymer 0.2.2 polymer-animation-group.js logs error to console [\#463](https://github.com/Polymer/polymer/issues/463)
+
+- polymer-ui-scaffold and polymer-ui-nav-arrow [\#343](https://github.com/Polymer/polymer/issues/343)
+
+- Better error when creating an element without a hyphenated name [\#303](https://github.com/Polymer/polymer/issues/303)
+
+- polymer-ajax fails silently when json is not valid json [\#257](https://github.com/Polymer/polymer/issues/257)
+
+## [0.3.4](https://github.com/Polymer/polymer/tree/0.3.4) (2014-07-11)
+
+**Fixed bugs:**
+
+- FormData.constructor fails when passed HTMLFormElement in Firefox [\#587](https://github.com/Polymer/polymer/issues/587)
+
+**Closed issues:**
+
+- Paper component focusable demo missing [\#624](https://github.com/Polymer/polymer/issues/624)
+
+- Step 1 of Tutorial incomplete [\#623](https://github.com/Polymer/polymer/issues/623)
+
+- Step-1 of tutorial instructions are missing vital CSS [\#622](https://github.com/Polymer/polymer/issues/622)
+
+- Link on paper-tabs for paper-tab is broken [\#621](https://github.com/Polymer/polymer/issues/621)
+
+- Wrong example in polymer tutorial [\#618](https://github.com/Polymer/polymer/issues/618)
+
+- Please improve the Core Elements / Scaffold example [\#617](https://github.com/Polymer/polymer/issues/617)
+
+- Polymer demos are not working in android stock browser and polymer is not working in cordova apps in JellyBean and prior versions. It is throwing "Window is not defined error in platform.js file at line number 15". [\#616](https://github.com/Polymer/polymer/issues/616)
+
+- Chrome Packaged App: Refused to evaluate a string as JavaScript because 'unsafe-eval' [\#612](https://github.com/Polymer/polymer/issues/612)
+
+- Broken doc in 'using core icons [\#610](https://github.com/Polymer/polymer/issues/610)
+
+- Navigation menu error [\#609](https://github.com/Polymer/polymer/issues/609)
+
+- IE 11 issues [\#608](https://github.com/Polymer/polymer/issues/608)
+
+- deadlink in polymer site [\#604](https://github.com/Polymer/polymer/issues/604)
+
+- extjs and polymerjs [\#603](https://github.com/Polymer/polymer/issues/603)
+
+- Mistake on proto-element.html [\#602](https://github.com/Polymer/polymer/issues/602)
+
+- paper-slider does not work properly in Safari and FireFox [\#599](https://github.com/Polymer/polymer/issues/599)
+
+- Polymer designer color-picker has no specific color palette [\#598](https://github.com/Polymer/polymer/issues/598)
+
+- Paper Elements Input does not work on iOS [\#596](https://github.com/Polymer/polymer/issues/596)
+
+- Core-Transition Demo [\#594](https://github.com/Polymer/polymer/issues/594)
+
+- Starting a webserver in Python [\#590](https://github.com/Polymer/polymer/issues/590)
+
+- simple style attribute bindings and styleObject filter not working in IE11 \(maybe other versions as well\) [\#589](https://github.com/Polymer/polymer/issues/589)
+
+- Images not rendering in the demp app tutorial [\#588](https://github.com/Polymer/polymer/issues/588)
+
+- Core-transition demo link returns 404 [\#586](https://github.com/Polymer/polymer/issues/586)
+
+- Paper-Checkbox Animation Fix [\#584](https://github.com/Polymer/polymer/issues/584)
+
+- Designer will not save [\#583](https://github.com/Polymer/polymer/issues/583)
+
+- ::content polyfill for VanillaJS Templates and Custom Elements [\#582](https://github.com/Polymer/polymer/issues/582)
+
+- core-transition-css Error: Not Found [\#581](https://github.com/Polymer/polymer/issues/581)
+
+- Polymer Tutorial step 1 multiple core-select events [\#578](https://github.com/Polymer/polymer/issues/578)
+
+- Material design link is broken [\#577](https://github.com/Polymer/polymer/issues/577)
+
+- core-scroll-header-panel background missing? [\#576](https://github.com/Polymer/polymer/issues/576)
+
+- Can't get any of the demos work?? [\#575](https://github.com/Polymer/polymer/issues/575)
+
+- paper-elements.html not found [\#574](https://github.com/Polymer/polymer/issues/574)
+
+- Tutorial Typo [\#572](https://github.com/Polymer/polymer/issues/572)
+
+- tutorial step-2: missing slash on closing div tag [\#571](https://github.com/Polymer/polymer/issues/571)
+
+- Minor Duplication: unnecessary core-icon-button declaration block to style the fill color of the favorite icon [\#570](https://github.com/Polymer/polymer/issues/570)
+
+- Layout Messed [\#568](https://github.com/Polymer/polymer/issues/568)
+
+- Chromebook [\#565](https://github.com/Polymer/polymer/issues/565)
+
+- \[Docs\] The "Learn" page on polymer-project.org crashes Safari Mobile [\#563](https://github.com/Polymer/polymer/issues/563)
+
+- core-scroll-header-panel won't hide nav bar on Chrome for Android [\#562](https://github.com/Polymer/polymer/issues/562)
+
+- Polymer flat design phonegap [\#560](https://github.com/Polymer/polymer/issues/560)
+
+- Input examples do not work in iPad iOS 7.1.1 [\#558](https://github.com/Polymer/polymer/issues/558)
+
+- Demo & Edit on GitHub links not working on component page [\#557](https://github.com/Polymer/polymer/issues/557)
+
+- Download link for checkboxes is broken [\#556](https://github.com/Polymer/polymer/issues/556)
+
+- core-slide demo not found [\#553](https://github.com/Polymer/polymer/issues/553)
+
+- Polymer website side panel menus overlaps url: http://www.polymer-project.org/docs/start/tutorial/intro.html [\#552](https://github.com/Polymer/polymer/issues/552)
+
+- document.querySelector containing ::shadow fails in Firefox 30 [\#551](https://github.com/Polymer/polymer/issues/551)
+
+- docs-menu polymer-ui-menu { position: fixed; } - Mozilla Firefox 30.0 [\#549](https://github.com/Polymer/polymer/issues/549)
+
+- Invalid Zip File [\#547](https://github.com/Polymer/polymer/issues/547)
+
+- http://www.polymer-project.org/docs/elements/core-elements.html\#core-overlay-layer links to 404 page not found [\#546](https://github.com/Polymer/polymer/issues/546)
+
+- Polymer docs gives wrong information [\#545](https://github.com/Polymer/polymer/issues/545)
+
+- Can't open .zip files.. [\#544](https://github.com/Polymer/polymer/issues/544)
+
+- \[docs tutorial\] step 3 code sample post-service closing tag [\#543](https://github.com/Polymer/polymer/issues/543)
+
+- All of the top menu functionalities are not working [\#542](https://github.com/Polymer/polymer/issues/542)
+
+- Sidebar menu elements are overlaid [\#541](https://github.com/Polymer/polymer/issues/541)
+
+- Edit on GitHub Link returning 404 error [\#540](https://github.com/Polymer/polymer/issues/540)
+
+- rendering problems with new website in FF on osx [\#539](https://github.com/Polymer/polymer/issues/539)
+
+- \[Docs\] polymer-ui-menu on docs page doesn't seem to be displaying correctly, Chromium and Firefox [\#538](https://github.com/Polymer/polymer/issues/538)
+
+- I think I found a mistake in the tutorial, not sure where to put it... [\#536](https://github.com/Polymer/polymer/issues/536)
+
+- \[In Docs\] Wrong link in "Demo" button [\#535](https://github.com/Polymer/polymer/issues/535)
+
+- I think seed-element shouldn't advise ignoring .bowerrc [\#533](https://github.com/Polymer/polymer/issues/533)
+
+- The trouble with the now-deprecated applyAuthorStyles in Polymer Elements [\#532](https://github.com/Polymer/polymer/issues/532)
+
+- Polymer does not display cyrillic characters correctly [\#498](https://github.com/Polymer/polymer/issues/498)
+
+## [0.3.3](https://github.com/Polymer/polymer/tree/0.3.3) (2014-06-20)
+
+**Closed issues:**
+
+- `stopPropagation\(\)` does not work for polymer events [\#530](https://github.com/Polymer/polymer/issues/530)
+
+- bower.json missing "main" and "moduleType" [\#525](https://github.com/Polymer/polymer/issues/525)
+
+- Published property with default value not reflected [\#509](https://github.com/Polymer/polymer/issues/509)
+
+## [0.3.2](https://github.com/Polymer/polymer/tree/0.3.2) (2014-06-09)
+
+**Closed issues:**
+
+- Since 0.3.0 binding array elements doesn't work [\#526](https://github.com/Polymer/polymer/issues/526)
+
+- minor documentation content issue [\#522](https://github.com/Polymer/polymer/issues/522)
+
+- `\<content select=".test"\>` is not observing condition updates of child elements? [\#505](https://github.com/Polymer/polymer/issues/505)
+
+## [0.3.1](https://github.com/Polymer/polymer/tree/0.3.1) (2014-05-30)
+
+**Closed issues:**
+
+- Bind to `value` on `\<input type="color"\>` [\#521](https://github.com/Polymer/polymer/issues/521)
+
+- classList not working anymore [\#518](https://github.com/Polymer/polymer/issues/518)
+
+## [0.3.0](https://github.com/Polymer/polymer/tree/0.3.0) (2014-05-27)
+
+**Implemented enhancements:**
+
+- Add Polymer.version [\#227](https://github.com/Polymer/polymer/issues/227)
+
+**Closed issues:**
+
+- Source Code Sandbox - Web Components en action - Google I / O 2013 [\#516](https://github.com/Polymer/polymer/issues/516)
+
+- Adding an event handler in an event handler can lead to infinite looping [\#511](https://github.com/Polymer/polymer/issues/511)
+
+- Polymer alters the results of scoped queries in querySelectorAll [\#508](https://github.com/Polymer/polymer/issues/508)
+
+- A non-body element marked "unresolved" still gets shown during boot [\#507](https://github.com/Polymer/polymer/issues/507)
+
+- When running Parse.FacebookUtils.init Polymer raises InvalidCharacterError exception. [\#506](https://github.com/Polymer/polymer/issues/506)
+
+- Content incorrectly rendered inside table. [\#503](https://github.com/Polymer/polymer/issues/503)
+
+- 404 on polymer-project.org/docs/start/customelements\#elementtypes [\#499](https://github.com/Polymer/polymer/issues/499)
+
+- Chrome Packaged App: Refused to evaluate a string as JavaScript because 'unsafe-eval' .... [\#252](https://github.com/Polymer/polymer/issues/252)
+
+- on-\* event delegation \(other than on host node\) does not work with non-bubbling events [\#208](https://github.com/Polymer/polymer/issues/208)
+
+## [0.2.4](https://github.com/Polymer/polymer/tree/0.2.4) (2014-05-12)
+
+**Closed issues:**
+
+- Mongolian vowel separator causing exceptions. [\#495](https://github.com/Polymer/polymer/issues/495)
+
+- Problem with root-relative URLs and the History API [\#494](https://github.com/Polymer/polymer/issues/494)
+
+- Standalone template binding docs missing? [\#491](https://github.com/Polymer/polymer/issues/491)
+
+- unable to use Polymer's dom mutation observer polyfill with mutation summary library [\#490](https://github.com/Polymer/polymer/issues/490)
+
+- I guess there is a mistake in polymer documentation [\#489](https://github.com/Polymer/polymer/issues/489)
+
+- Unclear how to bind complex data objects to new instances of polymer-element as a passed-in attribute [\#488](https://github.com/Polymer/polymer/issues/488)
+
+- Update expressions doc to clarify what's observed [\#486](https://github.com/Polymer/polymer/issues/486)
+
+- on-change doesn't get triggered when change happens programmatically [\#484](https://github.com/Polymer/polymer/issues/484)
+
+- style="color:{{person.nameColor}}" does not work in IE11 [\#483](https://github.com/Polymer/polymer/issues/483)
+
+- Publish a property by listing it in the `attributes` fails [\#482](https://github.com/Polymer/polymer/issues/482)
+
+- Can't get polymer 0.2.3 via bower \(now\) [\#481](https://github.com/Polymer/polymer/issues/481)
+
+- bower out of date? [\#480](https://github.com/Polymer/polymer/issues/480)
+
+- Crash when Polymer/Platform loaded twice [\#478](https://github.com/Polymer/polymer/issues/478)
+
+- Can't dynamically import an element definition in Canary [\#477](https://github.com/Polymer/polymer/issues/477)
+
+- Middle clicking results in navigation not new tab [\#472](https://github.com/Polymer/polymer/issues/472)
+
+## [0.2.3](https://github.com/Polymer/polymer/tree/0.2.3) (2014-04-18)
+
+**Fixed bugs:**
+
+- Including platform.js breaks YouTube's iframe API [\#468](https://github.com/Polymer/polymer/issues/468)
+
+**Closed issues:**
+
+- Custom pseudo-elements cannot be targeted outside shadow dom [\#475](https://github.com/Polymer/polymer/issues/475)
+
+- document.registerElement\('foo', {extends: undefined}\) fails [\#462](https://github.com/Polymer/polymer/issues/462)
+
+- onBeforeUnload Event broken [\#461](https://github.com/Polymer/polymer/issues/461)
+
+## [0.2.2](https://github.com/Polymer/polymer/tree/0.2.2) (2014-03-31)
+
+**Implemented enhancements:**
+
+- Consider inferring polymer-element tag name for registration [\#195](https://github.com/Polymer/polymer/issues/195)
+
+**Closed issues:**
+
+- Reusing css libraries through out Polymer elements [\#459](https://github.com/Polymer/polymer/issues/459)
+
+- Meta: Shadow DOM styling renames [\#458](https://github.com/Polymer/polymer/issues/458)
+
+- Compatibility with Angular JS - manual bootstrap fails on document.body and document.documentElement when using Platform.js [\#457](https://github.com/Polymer/polymer/issues/457)
+
+- Problem with data binding and custom attributes in Firefox 27, 29. [\#456](https://github.com/Polymer/polymer/issues/456)
+
+- addEventListener beforeunload not working [\#445](https://github.com/Polymer/polymer/issues/445)
+
+- Having any \<link rel="stylesheet"\> makes entire app fail to initialize [\#441](https://github.com/Polymer/polymer/issues/441)
+
+- Issues with platform version resolution with Bower and 0.2.1 [\#440](https://github.com/Polymer/polymer/issues/440)
+
+- Polymer event bindings don't pass Firefox Marketplace CSP checks [\#439](https://github.com/Polymer/polymer/issues/439)
+
+- Iterating over a member object [\#436](https://github.com/Polymer/polymer/issues/436)
+
+- \<template if\> evaluating all expressions twice [\#433](https://github.com/Polymer/polymer/issues/433)
+
+- Remove support for applyAuthorStyles/resetStyleInheritance [\#425](https://github.com/Polymer/polymer/issues/425)
+
+- Conflicts with Revealjs style sheets [\#410](https://github.com/Polymer/polymer/issues/410)
+
+- Bower install broken for latest and \#0.1.3 [\#407](https://github.com/Polymer/polymer/issues/407)
+
+- Add organization logo [\#361](https://github.com/Polymer/polymer/issues/361)
+
+- Add a declarative way to set applyAuthorStyles on a element's shadowRoot [\#106](https://github.com/Polymer/polymer/issues/106)
+
+## [0.2.1](https://github.com/Polymer/polymer/tree/0.2.1) (2014-03-07)
+
+**Closed issues:**
+
+- attributeChanged is not called under some circumstances [\#438](https://github.com/Polymer/polymer/issues/438)
+
+- Add polyfill support for new Shadow DOM CSS cominbators [\#435](https://github.com/Polymer/polymer/issues/435)
+
+- Problem with special characters and HTML entities [\#432](https://github.com/Polymer/polymer/issues/432)
+
+- FOUC body\[unresolved\] should be \[unresolved\] [\#431](https://github.com/Polymer/polymer/issues/431)
+
+- polymer-project.org menu scroll behaviour is distracting [\#430](https://github.com/Polymer/polymer/issues/430)
+
+- polymer-list is broken in \#0.2.0 [\#427](https://github.com/Polymer/polymer/issues/427)
+
+- polymer-project.org is slow [\#426](https://github.com/Polymer/polymer/issues/426)
+
+- Polymer setup Instructions resulted in blank screen [\#423](https://github.com/Polymer/polymer/issues/423)
+
+- Custom Elements and canvas/ctx functionality on iOS [\#422](https://github.com/Polymer/polymer/issues/422)
+
+- External styles fails to load [\#420](https://github.com/Polymer/polymer/issues/420)
+
+- Cannot access content \(childNodes\) in nested Polymer Element [\#414](https://github.com/Polymer/polymer/issues/414)
+
+**Merged pull requests:**
+
+- Update README.md [\#428](https://github.com/Polymer/polymer/pull/428) ([kentaromiura](https://github.com/kentaromiura))
+
+## [0.2.0](https://github.com/Polymer/polymer/tree/0.2.0) (2014-02-15)
+
+**Closed issues:**
+
+- HTMLImports.Loader maybe callback twice [\#418](https://github.com/Polymer/polymer/issues/418)
+
+- Binding to input type=range does not work in IE 11 [\#416](https://github.com/Polymer/polymer/issues/416)
+
+- Serveral issues on Opera browser [\#411](https://github.com/Polymer/polymer/issues/411)
+
+- Adding Polymer to a page causes Typekit fonts to break [\#408](https://github.com/Polymer/polymer/issues/408)
+
+- Polymer bind method -- should take oneTime flag? [\#405](https://github.com/Polymer/polymer/issues/405)
+
+- how to use part style in polymer? [\#376](https://github.com/Polymer/polymer/issues/376)
+
+- polymer declarative event doesn't work in lightdom mode [\#331](https://github.com/Polymer/polymer/issues/331)
+
+- Expose a way to get shadowRoots by name of creating declaration, e.g. getShadowRoot\('x-foo'\) [\#310](https://github.com/Polymer/polymer/issues/310)
+
+**Merged pull requests:**
+
+- update copyright year [\#412](https://github.com/Polymer/polymer/pull/412) ([gdi2290](https://github.com/gdi2290))
+
+## [0.1.4](https://github.com/Polymer/polymer/tree/0.1.4) (2014-01-27)
+
+**Closed issues:**
+
+- polymer-localstorage-load only fires if the value has previously been set [\#404](https://github.com/Polymer/polymer/issues/404)
+
+- CSS generated content without space goes missing \(Safari\) [\#403](https://github.com/Polymer/polymer/issues/403)
+
+- \(docs\): Core API reference page doesn't load [\#400](https://github.com/Polymer/polymer/issues/400)
+
+- Repeating a template from "content" does not work with repeat="d in data" [\#396](https://github.com/Polymer/polymer/issues/396)
+
+## [0.1.3](https://github.com/Polymer/polymer/tree/0.1.3) (2014-01-17)
+
+**Closed issues:**
+
+- polymer-ajax is missing the "body" attribute in the \<polymer-element\> declaration [\#395](https://github.com/Polymer/polymer/issues/395)
+
+- this year is 2014 [\#394](https://github.com/Polymer/polymer/issues/394)
+
+- Can't separate attributes in element's definition with vertical whitespace [\#393](https://github.com/Polymer/polymer/issues/393)
+
+- "deliverDeclarations Platform is not a function" error loading polymer.js [\#391](https://github.com/Polymer/polymer/issues/391)
+
+- Assertion Error thrown [\#388](https://github.com/Polymer/polymer/issues/388)
+
+## [0.1.2](https://github.com/Polymer/polymer/tree/0.1.2) (2014-01-10)
+
+**Closed issues:**
+
+- Polymer UI Sidebar Menu doesn't work in JSBin [\#389](https://github.com/Polymer/polymer/issues/389)
+
+- Pointer Event Example links currently 404 Not Found [\#385](https://github.com/Polymer/polymer/issues/385)
+
+- Getting started examples are all broken for tk-\* [\#383](https://github.com/Polymer/polymer/issues/383)
+
+- function strings for declarative event handlers appear in the markup [\#378](https://github.com/Polymer/polymer/issues/378)
+
+- binding to multiple mustaches \(e.g. foo="{{bar}} {{zot}}"\) causes exception [\#377](https://github.com/Polymer/polymer/issues/377)
+
+- Attribute value not correctly propagated to elements [\#374](https://github.com/Polymer/polymer/issues/374)
+
+- Calling this.super can refer to the wrong method [\#373](https://github.com/Polymer/polymer/issues/373)
+
+- "Getting the code" instructions are out of date/broken [\#369](https://github.com/Polymer/polymer/issues/369)
+
+- polymer-ui-menu-item does not show the icon [\#365](https://github.com/Polymer/polymer/issues/365)
+
+- polymer-selected class is not applied to Polymer UI elements [\#364](https://github.com/Polymer/polymer/issues/364)
+
+- InvalidCharacterError on document.register if $ exists in constructor function name [\#362](https://github.com/Polymer/polymer/issues/362)
+
+- Exception when running on Canary without Experimental Web Platform Features [\#360](https://github.com/Polymer/polymer/issues/360)
+
+- Page navigation issue [\#353](https://github.com/Polymer/polymer/issues/353)
+
+- in polymer 0.0.20131025 element id attribute not allowed [\#332](https://github.com/Polymer/polymer/issues/332)
+
+- FAQ entry on scoped animations is not accurate [\#141](https://github.com/Polymer/polymer/issues/141)
+
+## [0.1.1](https://github.com/Polymer/polymer/tree/0.1.1) (2013-12-12)
+
+**Closed issues:**
+
+- Polyfill support for reprojecting content in shadow nodes [\#367](https://github.com/Polymer/polymer/issues/367)
+
+- bower instructions don't work [\#366](https://github.com/Polymer/polymer/issues/366)
+
+- Broken Links [\#359](https://github.com/Polymer/polymer/issues/359)
+
+- Failing to import polymer.html can cause an infinite loop [\#356](https://github.com/Polymer/polymer/issues/356)
+
+- The bower pkg looks broken [\#355](https://github.com/Polymer/polymer/issues/355)
+
+- Documentation display issue [\#352](https://github.com/Polymer/polymer/issues/352)
+
+## [0.1.0](https://github.com/Polymer/polymer/tree/0.1.0) (2013-11-27)
+
+**Closed issues:**
+
+- shim styling: need to support ^ and ^^ when they are defined outside of \<polymer-element\> [\#354](https://github.com/Polymer/polymer/issues/354)
+
+- Extensions to type extension custom elements must specify an extends property when registering [\#347](https://github.com/Polymer/polymer/issues/347)
+
+- ShadowDOM polyfill breaks CSS `content: attr\(foo\)` [\#345](https://github.com/Polymer/polymer/issues/345)
+
+## [v0.0.20131107](https://github.com/Polymer/polymer/tree/v0.0.20131107) (2013-11-07)
+
+**Closed issues:**
+
+- `ready` and `created` are listed in the wrong order [\#338](https://github.com/Polymer/polymer/issues/338)
+
+- CSS: pseudo-classes don't work with :host under the polyfill [\#335](https://github.com/Polymer/polymer/issues/335)
+
+- Allow bindings to wire events to functions [\#324](https://github.com/Polymer/polymer/issues/324)
+
+## [v0.0.20131025](https://github.com/Polymer/polymer/tree/v0.0.20131025) (2013-10-25)
+
+**Implemented enhancements:**
+
+- Consider providing a mechanism to easily observe a set of property paths [\#194](https://github.com/Polymer/polymer/issues/194)
+
+**Closed issues:**
+
+- binding style attribute in IE doesn't work [\#327](https://github.com/Polymer/polymer/issues/327)
+
+- CSS: only add \[is=..\] selector if element is type-extension [\#320](https://github.com/Polymer/polymer/issues/320)
+
+- Clarification on use of template repeat for \<tr\> & \<select\> [\#318](https://github.com/Polymer/polymer/issues/318)
+
+- Autofocus doesn't work with polymer-veiling. [\#317](https://github.com/Polymer/polymer/issues/317)
+
+- Polyfill: @polyfill @host rules are broken in an extended element [\#315](https://github.com/Polymer/polymer/issues/315)
+
+- Polyfill: Parent styles are not inherited if there's no \<template\> in an extended class [\#314](https://github.com/Polymer/polymer/issues/314)
+
+**Merged pull requests:**
+
+- Event bindings [\#328](https://github.com/Polymer/polymer/pull/328) ([azakus](https://github.com/azakus))
+
+- Remove SideTable dependency [\#322](https://github.com/Polymer/polymer/pull/322) ([azakus](https://github.com/azakus))
+
+- fix Node.bind to pass the property name to reflectPropertyToAttribute [\#319](https://github.com/Polymer/polymer/pull/319) ([jmesserly](https://github.com/jmesserly))
+
+## [v0.0.20131010](https://github.com/Polymer/polymer/tree/v0.0.20131010) (2013-10-10)
+
+**Closed issues:**
+
+- trailing space in polymer attributes causes exception in IE10 [\#313](https://github.com/Polymer/polymer/issues/313)
+
+- Calling cancelUnbindAll is cumbersome under the CustomElements polyfill [\#312](https://github.com/Polymer/polymer/issues/312)
+
+- Calling methods on proxies returned when querying nodes can yield different results than calling directly on impl even without shadow dom use [\#309](https://github.com/Polymer/polymer/issues/309)
+
+- Using this.$.\[id\] syntax yields different results in Canary than when using Polyfill [\#308](https://github.com/Polymer/polymer/issues/308)
+
+- Debugging polymer apps: stack trace is wacko [\#307](https://github.com/Polymer/polymer/issues/307)
+
+- Need Object.observe-enabled builders in waterfall [\#306](https://github.com/Polymer/polymer/issues/306)
+
+- FR: Error on failed import [\#189](https://github.com/Polymer/polymer/issues/189)
+
+## [v0.0.20131003](https://github.com/Polymer/polymer/tree/v0.0.20131003) (2013-10-03)
+
+**Implemented enhancements:**
+
+- Allow hooking into the template instantiation process [\#156](https://github.com/Polymer/polymer/issues/156)
+
+- Support stylesheets in element templates [\#146](https://github.com/Polymer/polymer/issues/146)
+
+- System for automatic setting of component instance attributes [\#92](https://github.com/Polymer/polymer/issues/92)
+
+**Closed issues:**
+
+- Polymer tests failing with Object.observe enabled [\#302](https://github.com/Polymer/polymer/issues/302)
+
+- FAQ bug: polymer fails CSP because of inline script tags not XHR. [\#301](https://github.com/Polymer/polymer/issues/301)
+
+- \<propertyName\>Changed may get called twice for a single property value change [\#298](https://github.com/Polymer/polymer/issues/298)
+
+- Two-way Binding doesn't work in canary [\#297](https://github.com/Polymer/polymer/issues/297)
+
+- please create gh-pages [\#294](https://github.com/Polymer/polymer/issues/294)
+
+- Conditional attributes are not properly bound [\#293](https://github.com/Polymer/polymer/issues/293)
+
+- Bound boolean isn't set from true to false when radio button is unchecked [\#291](https://github.com/Polymer/polymer/issues/291)
+
+- Bindings in nested templates with named scopes fail to update correctly after initial population [\#285](https://github.com/Polymer/polymer/issues/285)
+
+- \<content\> not being displayed if too deep. [\#283](https://github.com/Polymer/polymer/issues/283)
+
+- polymer-element who to fire properties change? [\#282](https://github.com/Polymer/polymer/issues/282)
+
+- how to get inner element [\#280](https://github.com/Polymer/polymer/issues/280)
+
+- how to bind tap event on children node [\#278](https://github.com/Polymer/polymer/issues/278)
+
+- Provide finer control over unresolved element styling [\#276](https://github.com/Polymer/polymer/issues/276)
+
+- Question regarding your usage of a getter [\#274](https://github.com/Polymer/polymer/issues/274)
+
+- Consider removing "tools" submodule [\#271](https://github.com/Polymer/polymer/issues/271)
+
+- Community registry in the wild [\#268](https://github.com/Polymer/polymer/issues/268)
+
+- HTMLImports fails on IE9 [\#229](https://github.com/Polymer/polymer/issues/229)
+
+- External element scripts not loading [\#216](https://github.com/Polymer/polymer/issues/216)
+
+- polymer-element script tag are ignored when using innerHTML to inject polymer-element\(s\) into the page [\#205](https://github.com/Polymer/polymer/issues/205)
+
+- Galaxy Nexus Stock-Browser [\#202](https://github.com/Polymer/polymer/issues/202)
+
+- Allow body FOUC prevention to be optional [\#197](https://github.com/Polymer/polymer/issues/197)
+
+- Consider converting attributes with dashes into to camelCased properties [\#193](https://github.com/Polymer/polymer/issues/193)
+
+- \(IE only\) Last element created by \<template repeat\> is unbound [\#187](https://github.com/Polymer/polymer/issues/187)
+
+- Can't bind to the value of a custom element that extends \<input\> [\#186](https://github.com/Polymer/polymer/issues/186)
+
+- Calling offsetWidth in a style-modifying forEach is slow [\#180](https://github.com/Polymer/polymer/issues/180)
+
+- Explicitly fire ready\(\) [\#178](https://github.com/Polymer/polymer/issues/178)
+
+- Consider deserializing to Number only if property is already Number-valued [\#120](https://github.com/Polymer/polymer/issues/120)
+
+- Cannot load Google's jsapi inside of a component [\#115](https://github.com/Polymer/polymer/issues/115)
+
+- Document toolkit styling helpers [\#101](https://github.com/Polymer/polymer/issues/101)
+
+- Make sure properties are not doc'd as attributes [\#96](https://github.com/Polymer/polymer/issues/96)
+
+- Document that attributes and properties are not dynamically converted [\#94](https://github.com/Polymer/polymer/issues/94)
+
+**Merged pull requests:**
+
+- Removes unnecessary px declarations in coordinate attributes. [\#289](https://github.com/Polymer/polymer/pull/289) ([mrmrs](https://github.com/mrmrs))
+
+- remove extra argument to unbindProperty that was ignored [\#286](https://github.com/Polymer/polymer/pull/286) ([jmesserly](https://github.com/jmesserly))
+
+- small fix to bubbles parameter of utils.fire [\#284](https://github.com/Polymer/polymer/pull/284) ([jmesserly](https://github.com/jmesserly))
+
+## [v0.0.20130912](https://github.com/Polymer/polymer/tree/v0.0.20130912) (2013-09-12)
+
+**Fixed bugs:**
+
+- Updated use of PathObservers to match new API [\#267](https://github.com/Polymer/polymer/issues/267)
+
+**Closed issues:**
+
+- Point each repo's CONTRIBUTING file to Polymer's [\#273](https://github.com/Polymer/polymer/issues/273)
+
+- Nested templates throwing exceptions with reference to observe.js [\#264](https://github.com/Polymer/polymer/issues/264)
+
+- Perf regression in polyfill - 20130808 release [\#236](https://github.com/Polymer/polymer/issues/236)
+
+- Auto-registration of polymer-elements broken? [\#221](https://github.com/Polymer/polymer/issues/221)
+
+## [v0.0.20130905](https://github.com/Polymer/polymer/tree/v0.0.20130905) (2013-09-05)
+
+**Closed issues:**
+
+- SD polyfill in latest release breaks chromestatus.com [\#263](https://github.com/Polymer/polymer/issues/263)
+
+- On latest Chrome Canary, using vulcanized version won't show the style of elements [\#262](https://github.com/Polymer/polymer/issues/262)
+
+- grunt will fail using the latest commit of polymer-all [\#261](https://github.com/Polymer/polymer/issues/261)
+
+- Need a way to get the activeElement inside a Polymer element [\#253](https://github.com/Polymer/polymer/issues/253)
+
+- When using minified version on polymer, images of the button don't show in the ui-toolbar example [\#251](https://github.com/Polymer/polymer/issues/251)
+
+- Make sure boolean properties are reflected as boolean attributes [\#240](https://github.com/Polymer/polymer/issues/240)
+
+- Attributes are not reflected at bind time [\#239](https://github.com/Polymer/polymer/issues/239)
+
+- HTML imports fail when url params contain '/' characters [\#238](https://github.com/Polymer/polymer/issues/238)
+
+- Unable to use the Sandbox on Chrome \<= 28 [\#138](https://github.com/Polymer/polymer/issues/138)
+
+## [v0.0.20130829](https://github.com/Polymer/polymer/tree/v0.0.20130829) (2013-08-28)
+
+**Closed issues:**
+
+- loading a local file \(file:///\) using polymer will fail to load properly [\#260](https://github.com/Polymer/polymer/issues/260)
+
+- uppercase signals do not work [\#256](https://github.com/Polymer/polymer/issues/256)
+
+- Chrome Packaged App: including UI elements in an application will show some errors [\#249](https://github.com/Polymer/polymer/issues/249)
+
+- Changing a DOM attribute doesn't change the model [\#246](https://github.com/Polymer/polymer/issues/246)
+
+- Latest build broken w/ jQuery \(chrome 28\) [\#243](https://github.com/Polymer/polymer/issues/243)
+
+- window.Loader name colliding with ES6 window.Loader \(modules\) [\#237](https://github.com/Polymer/polymer/issues/237)
+
+**Merged pull requests:**
+
+- Recursive build for polymer [\#250](https://github.com/Polymer/polymer/pull/250) ([azakus](https://github.com/azakus))
+
+## [v0.0.20130815](https://github.com/Polymer/polymer/tree/v0.0.20130815) (2013-08-15)
+
+## [v0.0.20130816](https://github.com/Polymer/polymer/tree/v0.0.20130816) (2013-08-15)
+
+**Fixed bugs:**
+
+- FF broken in latest release w/ dom.webcomponents.enabled: true [\#235](https://github.com/Polymer/polymer/issues/235)
+
+**Closed issues:**
+
+- HTMLImports fails silently on Chrome 28.0.1500.95 \(Debian , 64bit\) [\#234](https://github.com/Polymer/polymer/issues/234)
+
+- ss [\#233](https://github.com/Polymer/polymer/issues/233)
+
+- Internet Explorer - not working at all [\#217](https://github.com/Polymer/polymer/issues/217)
+
+**Merged pull requests:**
+
+- 8/15 master -\> stable [\#241](https://github.com/Polymer/polymer/pull/241) ([azakus](https://github.com/azakus))
+
+- Fixes for some of the workbench samples [\#232](https://github.com/Polymer/polymer/pull/232) ([chrisbu](https://github.com/chrisbu))
+
+## [v0.0.20130808](https://github.com/Polymer/polymer/tree/v0.0.20130808) (2013-08-08)
+
+**Implemented enhancements:**
+
+- Add @version string to build files [\#226](https://github.com/Polymer/polymer/issues/226)
+
+**Closed issues:**
+
+- Events on distributed nodes aren't bubbled to parent nodes in shadow DOM under polyfill [\#230](https://github.com/Polymer/polymer/issues/230)
+
+- `ReferenceError: PathObserver is not defined` when loading in node-webkit [\#228](https://github.com/Polymer/polymer/issues/228)
+
+**Merged pull requests:**
+
+- 8/8 master -\> stable [\#231](https://github.com/Polymer/polymer/pull/231) ([azakus](https://github.com/azakus))
+
+## [v0.0.20130801](https://github.com/Polymer/polymer/tree/v0.0.20130801) (2013-08-01)
+
+**Implemented enhancements:**
+
+- It's awkward to make a property with an object default value [\#215](https://github.com/Polymer/polymer/issues/215)
+
+- Throw a more useful error if Polymer.register is used [\#210](https://github.com/Polymer/polymer/issues/210)
+
+- Consider if/when/how to reflect bound property values to attributes [\#188](https://github.com/Polymer/polymer/issues/188)
+
+- Make platform and toolkit builds available as simple downloads and/or from CDN [\#87](https://github.com/Polymer/polymer/issues/87)
+
+**Closed issues:**
+
+- If `Polymer\(\)` is not called almost immediately, the element is not initialised. [\#214](https://github.com/Polymer/polymer/issues/214)
+
+- Input value is not initialised. [\#213](https://github.com/Polymer/polymer/issues/213)
+
+- Fail more gracefully on unsupported browsers [\#207](https://github.com/Polymer/polymer/issues/207)
+
+- Binding and xxxChanged function break if element is moved to a different shadow [\#203](https://github.com/Polymer/polymer/issues/203)
+
+- table element problems on firefox [\#196](https://github.com/Polymer/polymer/issues/196)
+
+- Bindings on a range input not working well in google chrome [\#182](https://github.com/Polymer/polymer/issues/182)
+
+- Add support for creating Polymer elements imperatively [\#163](https://github.com/Polymer/polymer/issues/163)
+
+- Issue with scrolling using the flot library [\#162](https://github.com/Polymer/polymer/issues/162)
+
+- \[Feature Request\] Using Bower instead of submodules [\#147](https://github.com/Polymer/polymer/issues/147)
+
+- minor documentation typo [\#139](https://github.com/Polymer/polymer/issues/139)
+
+**Merged pull requests:**
+
+- 8/1 master -\> stable [\#223](https://github.com/Polymer/polymer/pull/223) ([azakus](https://github.com/azakus))
+
+## [v0.0.20130711](https://github.com/Polymer/polymer/tree/v0.0.20130711) (2013-07-11)
+
+**Implemented enhancements:**
+
+- Support resetStyleInheritance on prototype [\#199](https://github.com/Polymer/polymer/issues/199)
+
+- Add styling polyfill support for pseudos [\#152](https://github.com/Polymer/polymer/issues/152)
+
+**Fixed bugs:**
+
+- template/element polyfill styling need !important [\#191](https://github.com/Polymer/polymer/issues/191)
+
+- Type extension elements lose styling under polyfill [\#171](https://github.com/Polymer/polymer/issues/171)
+
+- When polymer-scope="global" is used to pull a stylesheet to the document, it appears multiple times [\#155](https://github.com/Polymer/polymer/issues/155)
+
+- PathObservers in observeProperties.js must be created at insertedCallback and removed at removeCallback [\#121](https://github.com/Polymer/polymer/issues/121)
+
+- shimStyling: styles defined within shadowDOM are not prefixed with the scope name in Firefox [\#107](https://github.com/Polymer/polymer/issues/107)
+
+- Event target is incorrect after certain DOM changes in ShadowDOM Polyfill [\#102](https://github.com/Polymer/polymer/issues/102)
+
+- Bindings in icon-button fail under ShadowDOMPolyfill [\#83](https://github.com/Polymer/polymer/issues/83)
+
+- \[dev\] Uncaught ReferenceError: SideTable is not defined [\#80](https://github.com/Polymer/polymer/issues/80)
+
+- \[dev\] template iterate doesn't work inside component [\#79](https://github.com/Polymer/polymer/issues/79)
+
+- Toolkit Components fail if they have a property named "node" [\#78](https://github.com/Polymer/polymer/issues/78)
+
+- Support component upgrade using "is" style declaration [\#71](https://github.com/Polymer/polymer/issues/71)
+
+- Styles declared in a component's shadowRoot should not leak out of the component [\#70](https://github.com/Polymer/polymer/issues/70)
+
+- this.node.webkitShadowRoot needs to return ShadowRoot [\#68](https://github.com/Polymer/polymer/issues/68)
+
+- Commented @host rule style gets applied [\#67](https://github.com/Polymer/polymer/issues/67)
+
+- data: URLs are being rewritten to relative URLs in \<style\> [\#66](https://github.com/Polymer/polymer/issues/66)
+
+- Custom Element shim incorrectly handles @host rule [\#65](https://github.com/Polymer/polymer/issues/65)
+
+- path.js needs to handle absolute url paths [\#62](https://github.com/Polymer/polymer/issues/62)
+
+- imperative instantiation is broken [\#56](https://github.com/Polymer/polymer/issues/56)
+
+- nodes inside a component's shadowDOM have incorrect model when using shadowDOM shim [\#43](https://github.com/Polymer/polymer/issues/43)
+
+- g-component custom events can be handled in wrong scope [\#30](https://github.com/Polymer/polymer/issues/30)
+
+**Closed issues:**
+
+- Consider optimizing propertyForAttribute [\#181](https://github.com/Polymer/polymer/issues/181)
+
+- nameInThis\(\) in oop.js is slow [\#177](https://github.com/Polymer/polymer/issues/177)
+
+- Internationalization of Web Components [\#175](https://github.com/Polymer/polymer/issues/175)
+
+- polymer-scope="controller" should not install the same stylesheet multiple times [\#173](https://github.com/Polymer/polymer/issues/173)
+
+- Add polyfill styling support for @host :scope [\#170](https://github.com/Polymer/polymer/issues/170)
+
+- Error loading polymer if window.location.hash is not null [\#167](https://github.com/Polymer/polymer/issues/167)
+
+- Unexpected result upgraded plain DOM to custom element instance [\#166](https://github.com/Polymer/polymer/issues/166)
+
+- Alias this.webkitShadowRoot -\> this.shadowRoot [\#165](https://github.com/Polymer/polymer/issues/165)
+
+- Simplest way to "Fire up a web server" to run examples [\#161](https://github.com/Polymer/polymer/issues/161)
+
+- Custom elements seem to cache data after being deleted and re-added [\#159](https://github.com/Polymer/polymer/issues/159)
+
+- Prevent memory leaking under MDV polyfill [\#154](https://github.com/Polymer/polymer/issues/154)
+
+- Element templates are stamped into shadowRoot with unbound values [\#153](https://github.com/Polymer/polymer/issues/153)
+
+- Styles should not be shimmed asynchronously under ShadowDOMPolyfill [\#151](https://github.com/Polymer/polymer/issues/151)
+
+- Polymer.js fails to load with "ReferenceError: Can't find variable: Window" on Windows 7 Safari browser and iPad 1 iOS 5.1.1 [\#149](https://github.com/Polymer/polymer/issues/149)
+
+- Stylesheets in \<element\> elements are emitted in incorrect order [\#148](https://github.com/Polymer/polymer/issues/148)
+
+- Web animations is not loaded by Polymer [\#140](https://github.com/Polymer/polymer/issues/140)
+
+- Polymer components should be called monomers. [\#137](https://github.com/Polymer/polymer/issues/137)
+
+- Small error in "Getting Started" tutorial [\#136](https://github.com/Polymer/polymer/issues/136)
+
+- add doc-comments to 'base.js' [\#133](https://github.com/Polymer/polymer/issues/133)
+
+- Attribute-based styles not always updated [\#132](https://github.com/Polymer/polymer/issues/132)
+
+- attributeChanged event on "sub-component" not fired in Canary but works in Chrome [\#131](https://github.com/Polymer/polymer/issues/131)
+
+- Stylesheets throw exception if toolkit-scope is defined and the element definition is inline [\#127](https://github.com/Polymer/polymer/issues/127)
+
+- Consider deserializing to Array from attributes, if property is Array-valued [\#124](https://github.com/Polymer/polymer/issues/124)
+
+- Modify attrs.js to accept Date strings in custom element attribute values [\#118](https://github.com/Polymer/polymer/issues/118)
+
+- Attribute value that's a comma delineated list of numbers is converted to a property incorrectly [\#117](https://github.com/Polymer/polymer/issues/117)
+
+- Including toolkit.js on a page moves all \<style\>s to the \<head\>. [\#114](https://github.com/Polymer/polymer/issues/114)
+
+- PointerEvents registration fails in the presence of ShadowDOMPolyfill in some cases [\#111](https://github.com/Polymer/polymer/issues/111)
+
+- Distributing template content to a shadowDOM can fail under shadowDOM polyfill [\#110](https://github.com/Polymer/polymer/issues/110)
+
+- Cursor moves to end of input after typing [\#109](https://github.com/Polymer/polymer/issues/109)
+
+- toolkitchen.github.io code samples not showing up in ff [\#105](https://github.com/Polymer/polymer/issues/105)
+
+- Document Browser support and test coverage using Testing CI and Travis CI [\#104](https://github.com/Polymer/polymer/issues/104)
+
+- clean up commented code in events.js [\#100](https://github.com/Polymer/polymer/issues/100)
+
+- rename `base.send` to `base.fire` or `base.bubble` [\#98](https://github.com/Polymer/polymer/issues/98)
+
+- toolkit.min.js missing method shimStyling [\#91](https://github.com/Polymer/polymer/issues/91)
+
+- Git repo url incorrect [\#89](https://github.com/Polymer/polymer/issues/89)
+
+- Menu-button workbench file hangs chrome under ShadowDOM Polyfill [\#86](https://github.com/Polymer/polymer/issues/86)
+
+- can't make bindings to objects on elements instantiated by mdv [\#81](https://github.com/Polymer/polymer/issues/81)
+
+- Don't name things \_, \_\_ and $ [\#73](https://github.com/Polymer/polymer/issues/73)
+
+- @host styles aren't processed for base elements [\#72](https://github.com/Polymer/polymer/issues/72)
+
+- "export" flag attribute documented in platform.js is actually "exportas" [\#64](https://github.com/Polymer/polymer/issues/64)
+
+- handlers="..." declarative events listen on the host element and therefore see no event target info for events generated in shadowDom [\#41](https://github.com/Polymer/polymer/issues/41)
+
+- MutationObserver code for custom event \(on-\*\) binding is inefficient [\#24](https://github.com/Polymer/polymer/issues/24)
+
+- g-component published properties don't inherit [\#18](https://github.com/Polymer/polymer/issues/18)
+
+- g-component property automation is inefficient [\#15](https://github.com/Polymer/polymer/issues/15)
+
+- Add unit tests for g-overlay, g-selector, g-selection [\#11](https://github.com/Polymer/polymer/issues/11)
+
+- Document public api [\#10](https://github.com/Polymer/polymer/issues/10)
+
+- have some good defaults for g-overlay [\#7](https://github.com/Polymer/polymer/issues/7)
+
+**Merged pull requests:**
+
+- 7/11 master -\> stable [\#204](https://github.com/Polymer/polymer/pull/204) ([azakus](https://github.com/azakus))
+
+- Correct test to check global div [\#201](https://github.com/Polymer/polymer/pull/201) ([ebidel](https://github.com/ebidel))
+
+- Fixes issue \#199 - adds support for resetStyleInheritance on prototype [\#200](https://github.com/Polymer/polymer/pull/200) ([ebidel](https://github.com/ebidel))
+
+- Switch to \<polymer-element\> [\#192](https://github.com/Polymer/polymer/pull/192) ([azakus](https://github.com/azakus))
+
+- 6/17 master -\> stable [\#184](https://github.com/Polymer/polymer/pull/184) ([azakus](https://github.com/azakus))
+
+- Fix a typo in contributing.md [\#183](https://github.com/Polymer/polymer/pull/183) ([alexhancock](https://github.com/alexhancock))
+
+- Flatten repos [\#174](https://github.com/Polymer/polymer/pull/174) ([azakus](https://github.com/azakus))
+
+- 6/5 master -\> stable [\#172](https://github.com/Polymer/polymer/pull/172) ([azakus](https://github.com/azakus))
+
+- Merge mdv-syntax branch [\#168](https://github.com/Polymer/polymer/pull/168) ([sjmiles](https://github.com/sjmiles))
+
+- added array & obj support to attrs.js \(plus refactor\) [\#158](https://github.com/Polymer/polymer/pull/158) ([bsatrom](https://github.com/bsatrom))
+
+- Fix link in CONTRIBUTING.md [\#144](https://github.com/Polymer/polymer/pull/144) ([markhealey](https://github.com/markhealey))
+
+- 5/15 master -\> stable [\#135](https://github.com/Polymer/polymer/pull/135) ([azakus](https://github.com/azakus))
+
+- 5/14 master -\> stable [\#134](https://github.com/Polymer/polymer/pull/134) ([azakus](https://github.com/azakus))
+
+- Add custom date parsing module [\#130](https://github.com/Polymer/polymer/pull/130) ([bsatrom](https://github.com/bsatrom))
+
+- 5/9 master -\> stable [\#125](https://github.com/Polymer/polymer/pull/125) ([azakus](https://github.com/azakus))
+
+- added deserialization of Date attributes for custom elements [\#122](https://github.com/Polymer/polymer/pull/122) ([bsatrom](https://github.com/bsatrom))
+
+- merge Observer branch [\#113](https://github.com/Polymer/polymer/pull/113) ([sjmiles](https://github.com/sjmiles))
+
+- 4/17 master -\> stable [\#99](https://github.com/Polymer/polymer/pull/99) ([azakus](https://github.com/azakus))
+
+- Bring experimental test harness in from alt-test branch [\#85](https://github.com/Polymer/polymer/pull/85) ([sjmiles](https://github.com/sjmiles))
+
+- Wrap grunt test in xvfb for virtual display. [\#84](https://github.com/Polymer/polymer/pull/84) ([agable-chromium](https://github.com/agable-chromium))
+
+- Add step-generator script to toolkit [\#82](https://github.com/Polymer/polymer/pull/82) ([agable-chromium](https://github.com/agable-chromium))
+
+- Stop using \_\_{lookup,define}{G,S}etter\_\_ [\#76](https://github.com/Polymer/polymer/pull/76) ([arv](https://github.com/arv))
+
+- Use XMLHttpRequest directly [\#75](https://github.com/Polymer/polymer/pull/75) ([arv](https://github.com/arv))
+
+- Updating meta tag [\#61](https://github.com/Polymer/polymer/pull/61) ([ebidel](https://github.com/ebidel))
+
+- Adding Contributors guide [\#60](https://github.com/Polymer/polymer/pull/60) ([ebidel](https://github.com/ebidel))
+
+- Tweaks to README. [\#58](https://github.com/Polymer/polymer/pull/58) ([ebidel](https://github.com/ebidel))
+
+- latest event handling scheme [\#55](https://github.com/Polymer/polymer/pull/55) ([sjmiles](https://github.com/sjmiles))
+
+- g-panels updates [\#54](https://github.com/Polymer/polymer/pull/54) ([sorvell](https://github.com/sorvell))
+
+- g-component tweaks to improve data-binding [\#53](https://github.com/Polymer/polymer/pull/53) ([sjmiles](https://github.com/sjmiles))
+
+- updated components for the new changes in g-component [\#52](https://github.com/Polymer/polymer/pull/52) ([frankiefu](https://github.com/frankiefu))
+
+- Merge polybinding branch into master [\#51](https://github.com/Polymer/polymer/pull/51) ([sjmiles](https://github.com/sjmiles))
+
+- minor fixes to support app development [\#49](https://github.com/Polymer/polymer/pull/49) ([sorvell](https://github.com/sorvell))
+
+- added g-menu-button and g-toolbar [\#48](https://github.com/Polymer/polymer/pull/48) ([frankiefu](https://github.com/frankiefu))
+
+- g-overlay: simplify styling. [\#47](https://github.com/Polymer/polymer/pull/47) ([sorvell](https://github.com/sorvell))
+
+- g-overlay update: simplify and add basic management for focus and z-index. [\#46](https://github.com/Polymer/polymer/pull/46) ([sorvell](https://github.com/sorvell))
+
+- add unit tests to cover more components and the latest sugaring in g-components [\#45](https://github.com/Polymer/polymer/pull/45) ([frankiefu](https://github.com/frankiefu))
+
+- fixes issue \#30: allow findController to step out of lightDOM [\#44](https://github.com/Polymer/polymer/pull/44) ([sjmiles](https://github.com/sjmiles))
+
+- update g-ajax and minor g-panels and g-page fixes [\#42](https://github.com/Polymer/polymer/pull/42) ([sorvell](https://github.com/sorvell))
+
+- update to use the new g-component sugar [\#40](https://github.com/Polymer/polymer/pull/40) ([frankiefu](https://github.com/frankiefu))
+
+- g-component minor fixup; updates for g-page and g-panels [\#39](https://github.com/Polymer/polymer/pull/39) ([sorvell](https://github.com/sorvell))
+
+- implement new 'protected' syntax [\#38](https://github.com/Polymer/polymer/pull/38) ([sjmiles](https://github.com/sjmiles))
+
+- g-component and g-panels minor changes [\#37](https://github.com/Polymer/polymer/pull/37) ([sorvell](https://github.com/sorvell))
+
+- filter mustaches in takeAttributes, other minor tweaks [\#36](https://github.com/Polymer/polymer/pull/36) ([sjmiles](https://github.com/sjmiles))
+
+- g-page: use external stylesheet [\#35](https://github.com/Polymer/polymer/pull/35) ([sorvell](https://github.com/sorvell))
+
+- added g-page component [\#34](https://github.com/Polymer/polymer/pull/34) ([sorvell](https://github.com/sorvell))
+
+- g-component attribute parsing fix; g-panels & g-overlay & g-ajax minor fixes [\#33](https://github.com/Polymer/polymer/pull/33) ([sorvell](https://github.com/sorvell))
+
+- bug fixes, more indirection around 'conventions' [\#32](https://github.com/Polymer/polymer/pull/32) ([sjmiles](https://github.com/sjmiles))
+
+- minor updates/fixes to g-component, selector and menu [\#31](https://github.com/Polymer/polymer/pull/31) ([frankiefu](https://github.com/frankiefu))
+
+- g-panels minor bug fixes [\#29](https://github.com/Polymer/polymer/pull/29) ([sorvell](https://github.com/sorvell))
+
+- add g-panels [\#28](https://github.com/Polymer/polymer/pull/28) ([sorvell](https://github.com/sorvell))
+
+- g-overlay: refactor/simplify [\#27](https://github.com/Polymer/polymer/pull/27) ([sorvell](https://github.com/sorvell))
+
+- g-component: fix typo [\#26](https://github.com/Polymer/polymer/pull/26) ([sorvell](https://github.com/sorvell))
+
+- update components based on changes in g-component [\#25](https://github.com/Polymer/polymer/pull/25) ([frankiefu](https://github.com/frankiefu))
+
+- MDV sugaring [\#23](https://github.com/Polymer/polymer/pull/23) ([sjmiles](https://github.com/sjmiles))
+
+- menu component and basic component unit tests [\#22](https://github.com/Polymer/polymer/pull/22) ([frankiefu](https://github.com/frankiefu))
+
+- "DOMTokenList.enable" was renamed to "toggle" at platform, update polyfill [\#21](https://github.com/Polymer/polymer/pull/21) ([sjmiles](https://github.com/sjmiles))
+
+- use MutationObserver to maintain custom event bindings, bug fixes [\#20](https://github.com/Polymer/polymer/pull/20) ([sjmiles](https://github.com/sjmiles))
+
+- tabs component, simplify togglebutton and more unit tests [\#19](https://github.com/Polymer/polymer/pull/19) ([frankiefu](https://github.com/frankiefu))
+
+- unit test harness [\#17](https://github.com/Polymer/polymer/pull/17) ([frankiefu](https://github.com/frankiefu))
+
+- use shadow="shim" instead of shimShadow for compatibility with URL override [\#16](https://github.com/Polymer/polymer/pull/16) ([sjmiles](https://github.com/sjmiles))
+
+- change property automation to be property-first instead of attribute-first [\#14](https://github.com/Polymer/polymer/pull/14) ([sjmiles](https://github.com/sjmiles))
+
+- call shadowRootCreated in the right scope and add g-ratings component [\#13](https://github.com/Polymer/polymer/pull/13) ([frankiefu](https://github.com/frankiefu))
+
+- update for names changes in polyfill [\#12](https://github.com/Polymer/polymer/pull/12) ([frankiefu](https://github.com/frankiefu))
+
+- add g-selection and g-selector components [\#9](https://github.com/Polymer/polymer/pull/9) ([sjmiles](https://github.com/sjmiles))
+
+- add ajax and togglebutton components [\#8](https://github.com/Polymer/polymer/pull/8) ([frankiefu](https://github.com/frankiefu))
+
+- various changes to enable g-overlay [\#6](https://github.com/Polymer/polymer/pull/6) ([sjmiles](https://github.com/sjmiles))
+
+- add g-icon-button [\#4](https://github.com/Polymer/polymer/pull/4) ([sjmiles](https://github.com/sjmiles))
+
+- fix path [\#3](https://github.com/Polymer/polymer/pull/3) ([sjmiles](https://github.com/sjmiles))
+
+- make workBench live with toolkit [\#2](https://github.com/Polymer/polymer/pull/2) ([sjmiles](https://github.com/sjmiles))
+
+- Initial Components [\#1](https://github.com/Polymer/polymer/pull/1) ([sjmiles](https://github.com/sjmiles))
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/CONTRIBUTING.md b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/CONTRIBUTING.md
new file mode 100644
index 00000000000..8342c0d248d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/CONTRIBUTING.md
@@ -0,0 +1,162 @@
+# Contributing to Polymer
+
+There are many ways to contribute to the Polymer project! We welcome and truly appreciate contribution in all forms - issues and pull requests to the [main library](https://github.com/polymer/polymer), issues and pull requests to the [elements the Polymer team maintains](https://github.com/polymerelements), issues and pull requests to one of our many [Polymer-related tools](https://github.com/polymer), and of course we love to hear about any Polymer elements that you build to share with the community!
+
+## Logistics
+
+### Communicating with the Polymer team
+
+Beyond GitHub, we try to have a variety of different lines of communication open:
+
+* [Blog](https://blog.polymer-project.org/)
+* [Twitter](https://twitter.com/polymer)
+* [Google+ Community](https://plus.sandbox.google.com/u/0/communities/115626364525706131031?cfem=1)
+* [Mailing list](https://groups.google.com/forum/#!forum/polymer-dev)
+* [Slack channel](https://bit.ly/polymerslack)
+
+### The Polymer Repositories
+
+Because of the component-based nature of the Polymer project, we tend to have lots of different repositories. Our main repository for the Polymer library itself is at [github.com/Polymer/polymer](https://github.com/polymer/polymer). File any issues or pull requests that have to do with the core library on that repository, and we'll take a look ASAP.
+
+We keep all of the element "product lines" that the Polymer team maintains and distributes in the [PolymerElements](https://github.com/polymerelements) organization. For any element-specific issues or pull requests, file directly on the element's repository, such as the `paper-button` repository at [github.com/polymerelements/paper-button](https://github.com/polymerelements/paper-button). Of course, the elements built by the Polymer team are just a tiny fraction of all the Polymer-based elements out there - catalogs of other web components include [https://www.webcomponents.org/](https://github.com/webcomponents/webcomponents.org) and [component.kitchen](https://component.kitchen).
+
+The GoogleWebComponents element product line is maintained by teams all across Google, and so is kept in a separate organization: the [GoogleWebComponents](https://github.com/googlewebcomponents) org. Feel free to file issues and PR's on those elements directly in that organization.
+
+We also track each element product line overall in "meta-repos", named as `$PRODUCTLINE-elements`. These include [paper-elements](https://github.com/polymerelements/paper-elements), [iron-elements](https://github.com/polymerelements/iron-elements), [gold-elements](https://github.com/polymerelements/gold-elements), and more. Feel free to file issues for element requests on those meta-repos, and the README in each repo tracks a roadmap for the product line.
+
+### Contributor License Agreement
+
+You might notice our friendly CLA-bot commenting on a pull request you open if you haven't yet signed our CLA. We use the same CLA for all open-source Google projects, so you only have to sign it once. Once you complete the CLA, all your pull-requests will automatically get the `cla: yes` tag.
+
+If you've already signed a CLA but are still getting bothered by the awfully insistent CLA bot, it's possible we don't have your GitHub username or you're using a different email address. Check the [information on your CLA](https://cla.developers.google.com/clas) or see this help article on [setting the email on your git commits](https://help.github.com/articles/setting-your-email-in-git/).
+
+[Complete the CLA](https://cla.developers.google.com/clas)
+
+## Contributing
+
+### Filing bugs
+
+The Polymer team heavily uses (and loves!) GitHub for all of our software management. We use GitHub issues to track all bugs and features.
+
+If you find an issue, please do file it on the repository. The [Polymer/polymer issues](https://github.com/polymer/polymer/issues) should be used only for issues on the Polymer library itself - bugs somewhere in the core codebase.
+
+For issues with elements the team maintains, please file directly on the element's repository. If you're not sure if a bug stems from the element or the library, air toward filing it on the element and we'll move the issue if necessary.
+
+Please file issues using the issue template provided, filling out as many fields as possible. We love examples for addressing issues - issues with a jsBin, Plunkr, jsFiddle, or glitch.me repro will be much easier for us to work on quickly. You can start with [this jsbin](http://jsbin.com/luhaxab/edit) which sets up the basics to demonstrate a Polymer element. If you need your repro to run in IE11, you can start from [this glitch](https://glitch.com/edit/#!/polymer-repro?path=my-element.html:2:0), which serves the source via polyserve for automatic transpilation, although you must sign up for a glitch.me account to ensure your code persists for more than 5 days (note the glitch.me _editing environment_ is not compatible with IE11, however the "live" view link of the running code should work).
+
+Occasionally we'll close issues if they appear stale or are too vague - please don't take this personally! Please feel free to re-open issues we've closed if there's something we've missed and they still need to be addressed.
+
+### Contributing Pull Requests
+
+PR's are even better than issues. We gladly accept community pull requests. In general across the core library and all of the elements, there are a few necessary steps before we can accept a pull request:
+
+- Open an issue describing the problem that you are looking to solve in your PR (if one is not already open), and your approach to solving it. This makes it easier to have a conversation around the best general approach for solving your problem, outside of the code itself.
+- Sign the [CLA](https://cla.developers.google.com/clas), as described above.
+- Fork the repo you're making the fix on to your own GitHub account.
+- Code!
+- Ideally, squash your commits into a single commit with a clear message of what the PR does. If it absolutely makes sense to keep multiple commits, that's OK - or perhaps consider making two separate PR's.
+- **Include tests that test the range of behavior that changes with your PR.** If you PR fixes a bug, make sure your tests capture that bug. If your PR adds new behavior, make sure that behavior is fully tested. Every PR *must* include associated tests. (See [Unit tests](#unit-tests) for more.)
+- Submit your PR, making sure it references the issue you created.
+- If your PR fixes a bug, make sure the issue includes clear steps to reproduce the bug so we can test your fix.
+
+If you've completed all of these steps the core team will do its best to respond to the PR as soon as possible.
+
+#### Contributing Code to Elements
+
+Though the aim of the Polymer library is to allow lots of flexibility and not get in your way, we work to standardize our elements to make them as toolable and easy to maintain as possible.
+
+All elements should follow the [Polymer element style guide](http://polymerelements.github.io/style-guide/), which defines how to specify properties, documentation, and more. It's a great guide to follow when building your own elements as well, for maximum standardization and toolability. For instance, structuring elements following the style guide will ensure that they work with the [`iron-component-page`](https://github.com/polymerelements/iron-component-page) element, an incredibly easy way to turn any raw element directly into a documentation page.
+
+#### Contributing Code to the Polymer library
+
+We follow the most common javascript and HTML style guidelines for how we structure our code - in general, look at the code and you'll know how to contribute! If you'd like a bit more structure, the [Google JavaScript Styleguide](https://google.github.io/styleguide/javascriptguide.xml) is a good place to start.
+
+Polymer also participates in Google's [Patch Rewards Program](https://www.google.com/about/appsecurity/patch-rewards/), where you can earn cold, hard cash for qualifying security patches to the Polymer library. Visit the [patch rewards page](https://www.google.com/about/appsecurity/patch-rewards/) to find out more.
+
+## Unit tests
+
+All Polymer projects use [`web-component-tester`](https://github.com/Polymer/web-component-tester) for unit tests.
+The [`polyserve`](https://github.com/PolymerLabs/polyserve) utility is helpful for running tests in the browser.
+
+For maximum flexibility, install `web-component-tester` and `polyserve` locally:
+
+ npm install -g polyserve web-component-tester
+
+### Running the Polymer library unit tests
+
+To run the Polymer library unit tests:
+
+1. Clone the [Polymer repo](https://github.com/polymer/polymer).
+
+2. Install the dependencies:
+
+ npm install && bower install
+
+3. Run the tests:
+
+ npm test
+
+ Or if you have `web-component-tester` installed locally:
+
+ wct
+
+To run individual test suites:
+
+<code>npm test <var>path/to/suite</var></code>
+
+Or:
+
+<code>wct <var>path/to/suite</var></code>
+
+For example:
+
+ npm test test/unit/template.html
+
+You can also run tests in the browser:
+
+ polyserve
+
+Navigate to:
+
+[`http://localhost:8080/components/polymer/test/runner.html`](http://localhost:8080/components/polymer/test/runner.html)
+
+### Running Polymer element unit tests
+
+To run the element unit tests, you need a global install of `web-component-tester` or `polyserve` (or both).
+
+1. Clone the element repo.
+
+1. Install the dependencies.
+
+ bower install
+
+1. Run the tests:
+
+ wct
+
+ Or run the tests in a browser:
+
+ polyserve
+
+ Navigate to:
+
+ <code>http://localhost:8080/components/<var>element-name</var>/test/runner.html</code>
+
+### Configuring `web-component-tester`
+
+By default, `web-component-tester` runs tests on all installed browsers. You can configure it
+to run tests on a subset of available browsers, or to run tests remotely using Sauce Labs.
+
+See the [`web-component-tester` README](https://github.com/Polymer/web-component-tester) for
+information on configuring the tool.
+
+### Viewing the source documentation locally
+
+You can view the updates you make to the source documentation locally with the following steps.
+Make sure to rerun step 1 after every change you make.
+
+1. Run `polymer analyze > analysis.json`
+
+1. Run `polymer serve`
+
+1. Open `http://127.0.0.1:PORT/components/polymer/` to view the documentation
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/LICENSE.txt b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/LICENSE.txt
new file mode 100644
index 00000000000..87c683b8e83
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/LICENSE.txt
@@ -0,0 +1,27 @@
+// Copyright (c) 2017 The Polymer Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/README.md b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/README.md
new file mode 100644
index 00000000000..38d9123efde
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/README.md
@@ -0,0 +1,142 @@
+# Polymer
+
+[![Build Status](https://travis-ci.org/Polymer/polymer.svg?branch=master)](https://travis-ci.org/Polymer/polymer)
+
+> ℹ️ Note: This is the current stable version of the Polymer library. At Google I/O 2018 we announced a new Web Component base class, [`LitElement`](https://github.com/PolymerLabs/lit-element), as a successor to the `PolymerElement` base class in this library.
+>
+> If you're starting a new project, we recommend that you consider using LitElement instead.
+>
+> If you have a project you've built with an earlier version of the Polymer library, we recommend that you [migrate](#about-polymer-30) to 3.0 for best compatibility with the JavaScript ecosystem. Thanks to the interoperability of Web Components, elements built with Polymer 3.0 and LitElement can be mixed and matched in the same app, so once you have updated your project to Polymer 3.0, you can migrate to LitElement incrementally, one element at a time. See our blog post on the [Polymer Project roadmap](https://www.polymer-project.org/blog/2018-05-02-roadmap-update.html) for more information.
+
+Polymer lets you build encapsulated, reusable [Web Components](https://www.webcomponents.org/introduction) that work just like standard HTML elements, to use in building web applications. Using a Web Commponent built with Polymer is as simple as importing its definition then using it like any other HTML element:
+
+```html
+<!-- Import a component -->
+<script src="https://unpkg.com/@polymer/paper-checkbox@next/paper-checkbox.js?module" type="module" ></script>
+
+<!-- Use it like any other HTML element -->
+<paper-checkbox>Web Components!</paper-checkbox>
+```
+
+Web Components are now implemented natively on Safari and Chrome (~70% of installed browsers), and run well on Firefox, Edge, and IE11 using [polyfills](https://github.com/webcomponents/webcomponentsjs). Read more [below](#overview).
+
+## Getting started
+
+ * The easiest way to try out Polymer is to use one of these online tools:
+
+ * Runs in all [supported](#supported-browsers) browsers: [StackBlitz](https://stackblitz.com/edit/polymer-element-example?file=index.js), [Glitch](https://glitch.com/edit/#!/polymer-element-example?path=index.html)
+
+ * Runs in browsers with [JavaScript Modules](https://caniuse.com/#search=modules): [JSBin](https://jsbin.com/wuxejiz/edit?html,output),
+ [CodePen](https://codepen.io/kevinpschaaf/pen/BxdErp?editors=1000).
+
+ * You can also save [this HTML file](https://gist.githubusercontent.com/kevinpschaaf/8a5acbea7b25d2bb5e82eeea2b105669/raw/c3a86872f07603e2d0ddae736687e52a5c8c499f/index.html) to a local file and run it in any browser that supports [JavaScript Modules]((https://caniuse.com/#search=modules)).
+
+ * When you're ready to use Polymer in a project, install it via [npm](https://www.npmjs.com/). To run the project in the browser,
+ a module-compatible toolchain is required. We recommend installing the [Polymer CLI](https://github.com/Polymer/polymer-cli) to and using its development server as follows.
+
+ 1. Add Polymer to your project:
+
+ ```npm i @polymer/polymer```
+
+ 1. Create an element by extending PolymerElement and calling `customElements.define` with your class (see the examples below).
+
+ 1. Install the Polymer CLI:
+
+ ```npm i -g polymer-cli@next```
+
+ 1. Run the development server and open a browser pointing to its URL:
+
+ ```polymer serve```
+
+ > Polymer 3.0 is published on [npm](https://www.npmjs.com/package/@polymer/polymer) using JavaScript Modules.
+ This means it can take advantage of the standard native JavaScript module loader available in all current major browsers.
+ >
+ > However, since Polymer uses npm conventions to reference dependencies by name, a light transform to rewrite specifiers to URLs is required to run in the browser. The polymer-cli's development server `polymer serve`, as well as `polymer build` (for building an optimized app for deployment) automatically handles this transform.
+
+ Tools like [webpack](https://webpack.js.org/) and [Rollup](https://rollupjs.org/) can also be used to serve and/or bundle Polymer elements.
+
+
+## Minimal Example
+
+ 1. Create a class that extends `PolymerElement`.
+ 1. Implement a static `properties` getter that describes the element's public property/attribute API
+ (these automatically become observed attributes).
+ 1. Then implement a `template` getter that returns an `HTMLTemplateElement` describing the element's rendering, including encapsulated styling and any property bindings.
+
+```html
+ <script src="node_modules/@webcomponents/webcomponents-loader.js"></script>
+ <script type="module">
+ import {PolymerElement, html} from '@polymer/polymer';
+
+ class MyElement extends PolymerElement {
+ static get properties() { return { mood: String }}
+ static get template() {
+ return html`
+ <style> .mood { color: green; } </style>
+ Web Components are <span class="mood">[[mood]]</span>!
+ `;
+ }
+ }
+
+ customElements.define('my-element', MyElement);
+ </script>
+
+ <my-element mood="happy"></my-element>
+```
+
+## Overview
+
+Web components are an incredibly powerful new set of primitives baked into the web platform, and open up a whole new world of possibility when it comes to componentizing front-end code and easily creating powerful, immersive, app-like experiences on the web.
+
+Polymer is a lightweight library built on top of the web standards-based [Web Components](http://webcomponents.org/introduction) APIs, and makes it easier to build your very own custom HTML elements. Creating reusable custom elements - and using elements built by others - can make building complex web applications easier and more efficient.
+
+By being based on the Web Components APIs built in the browser (or [polyfilled](https://github.com/webcomponents/webcomponentsjs) where needed), elements built with Polymer are:
+
+* Built from the platform up
+* Self-contained
+* Re-usable
+* Interoperable across frameworks
+
+Among many ways to leverage custom elements, they can be particularly useful for building reusable UI components. Instead of continually re-building a specific navigation bar or button in different frameworks and for different projects, you can define this element once using Polymer, and then reuse it throughout your project or in any future project.
+
+Polymer provides a declarative syntax to easily create your own custom elements, using all standard web technologies - define the structure of the element with HTML, style it with CSS, and add interactions to the element with JavaScript.
+
+Polymer also provides optional two-way data-binding, meaning:
+
+1. When properties in the model for an element get updated, the element can update itself in response.
+2. When the element is updated internally, the changes can be propagated back to the model.
+
+Polymer is designed to be flexible, lightweight, and close to the web platform - the library doesn't invent complex new abstractions and magic, but uses the best features of the web platform in straightforward ways to simply sugar the creation of custom elements.
+
+## About Polymer 3.0
+
+Polymer 3.0 is now released to stable, and introduces a major change to how Polymer is distributed: from HTML Imports on Bower, to JS modules on npm. Otherwise, the API is almost entirely backward compatible with Polymer 2.0 (the only changes are removing APIs related to HTML Imports like `importHref`, and converting Polymer's API to be module-based rather than globals-based).
+
+Migrating to Polymer 3.0 by hand is mostly mechanical:
+* Components should be defined in JS modules instead of in HTML
+* Templates should be encoded in JS modules using a `static get template()` getter on PolymerElement subclasses using the `html` tagged template literal function (which parses `HTMLTemplateElement`s out of strings in JS) rather than using `<template>` elements in a `<dom-module>`
+* All dependencies should be imported JS module imports rather than HTML Imports.
+
+However, the [`polymer-modulizer`](https://github.com/Polymer/polymer-modulizer) tool automates the vast majority of this migration work. Please see details on that repo for automated conversion of Polymer 2.0 apps and elements to Polymer 3.0.
+
+👀 **Looking for Polymer v2.x?** Please see the [the v2 branch](https://github.com/Polymer/polymer/tree/2.x).
+
+👀 **Looking for Polymer v1.x?** Please see the [the v1 branch](https://github.com/Polymer/polymer/tree/1.x).
+
+## Contributing
+
+The Polymer team loves contributions from the community! Take a look at our [contributing guide](CONTRIBUTING.md) for more information on how to contribute. Please file issues on the Polymer issue tracker following the issue template and contributing guide [issues](https://github.com/Polymer/polymer/issues/new).
+
+## Communicating with the Polymer team
+
+Beyond GitHub, we try to have a variety of different lines of communication available:
+
+* [Blog](https://blog.polymer-project.org/)
+* [Twitter](https://twitter.com/polymer)
+* [Google+ community](https://plus.google.com/communities/115626364525706131031)
+* [Mailing list](https://groups.google.com/forum/#!forum/polymer-dev)
+* [Slack channel](https://bit.ly/polymerslack)
+
+# License
+
+The Polymer library uses a BSD-like license that is available [here](./LICENSE.txt)
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/externs/closure-types.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/externs/closure-types.js
new file mode 100644
index 00000000000..8e7f3dd19ac
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/externs/closure-types.js
@@ -0,0 +1,1415 @@
+/**
+ * @fileoverview Generated typings for Polymer mixins
+ * @externs
+ *
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+/* eslint-disable */
+/**
+* @interface
+*/
+function Polymer_PropertiesChanged(){}
+/**
+* @param {string} property Name of the property
+* @param {boolean=} readOnly When true, no setter is created; the
+ protected `_setProperty` function must be used to set the property
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._createPropertyAccessor = function(property, readOnly){};
+/**
+* @param {string} property Name of the property
+*/
+Polymer_PropertiesChanged.prototype._addPropertyToAttributeMap = function(property){};
+/**
+* @param {string} property Name of the property
+* @param {boolean=} readOnly When true, no setter is created
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._definePropertyAccessor = function(property, readOnly){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype.ready = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._initializeProperties = function(){};
+/**
+* @param {Object} props Bag of property values that were overwritten
+ when creating property accessors.
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._initializeInstanceProperties = function(props){};
+/**
+* @param {string} property Name of the property
+* @param {*} value Value to set
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._setProperty = function(property, value){};
+/**
+* @param {string} property Name of property
+* @return {*}
+*/
+Polymer_PropertiesChanged.prototype._getProperty = function(property){};
+/**
+* @param {string} property Name of the property
+* @param {*} value Value to set
+* @param {boolean=} ext Not used here; affordance for closure
+* @return {boolean}
+*/
+Polymer_PropertiesChanged.prototype._setPendingProperty = function(property, value, ext){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._invalidateProperties = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._enableProperties = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._flushProperties = function(){};
+/**
+* @param {!Object} currentProps Bag of all current accessor values
+* @param {!Object} changedProps Bag of properties changed since the last
+ call to `_propertiesChanged`
+* @param {!Object} oldProps Bag of previous values for each property
+ in `changedProps`
+* @return {boolean}
+*/
+Polymer_PropertiesChanged.prototype._shouldPropertiesChange = function(currentProps, changedProps, oldProps){};
+/**
+* @param {!Object} currentProps Bag of all current accessor values
+* @param {!Object} changedProps Bag of properties changed since the last
+ call to `_propertiesChanged`
+* @param {!Object} oldProps Bag of previous values for each property
+ in `changedProps`
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._propertiesChanged = function(currentProps, changedProps, oldProps){};
+/**
+* @param {string} property Property name
+* @param {*} value New property value
+* @param {*} old Previous property value
+* @return {boolean}
+*/
+Polymer_PropertiesChanged.prototype._shouldPropertyChange = function(property, value, old){};
+/**
+* @param {string} name Name of attribute that changed
+* @param {?string} old Old attribute value
+* @param {?string} value New attribute value
+* @param {?string} namespace Attribute namespace.
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype.attributeChangedCallback = function(name, old, value, namespace){};
+/**
+* @param {string} attribute Name of attribute to deserialize.
+* @param {?string} value of the attribute.
+* @param {*=} type type to deserialize to, defaults to the value
+returned from `typeForProperty`
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._attributeToProperty = function(attribute, value, type){};
+/**
+* @param {string} property Property name to reflect.
+* @param {string=} attribute Attribute name to reflect to.
+* @param {*=} value Property value to refect.
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._propertyToAttribute = function(property, attribute, value){};
+/**
+* @param {Element} node Element to set attribute to.
+* @param {*} value Value to serialize.
+* @param {string} attribute Attribute name to serialize to.
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._valueToNodeAttribute = function(node, value, attribute){};
+/**
+* @param {*} value Property value to serialize.
+* @return {(string | undefined)}
+*/
+Polymer_PropertiesChanged.prototype._serializeValue = function(value){};
+/**
+* @param {?string} value Value to deserialize.
+* @param {*=} type Type to deserialize the string to.
+* @return {*}
+*/
+Polymer_PropertiesChanged.prototype._deserializeValue = function(value, type){};
+/**
+* @param {!Object} props Object whose keys are names of accessors.
+* @return {void}
+*/
+Polymer_PropertiesChanged.createProperties = function(props){};
+/**
+* @param {string} property Property to convert
+* @return {string}
+*/
+Polymer_PropertiesChanged.attributeNameForProperty = function(property){};
+/**
+* @param {string} name Name of property
+*/
+Polymer_PropertiesChanged.typeForProperty = function(name){};
+/**
+* @interface
+* @extends {Polymer_PropertiesChanged}
+*/
+function Polymer_PropertyAccessors(){}
+/**
+* @param {string} property Name of the property
+* @param {boolean=} readOnly When true, no setter is created
+
+When calling on a prototype, any overwritten values are saved in
+`__dataProto`, and it is up to the subclasser to decide how/when
+to set those properties back into the accessor. When calling on an
+instance, the overwritten value is set via `_setPendingProperty`,
+and the user should call `_invalidateProperties` or `_flushProperties`
+for the values to take effect.
+* @return {void}
+*/
+Polymer_PropertyAccessors.prototype._definePropertyAccessor = function(property, readOnly){};
+/**
+* @return {void}
+*/
+Polymer_PropertyAccessors.prototype._initializeProperties = function(){};
+/**
+* @param {*} value Property value to serialize.
+* @return {(string | undefined)}
+*/
+Polymer_PropertyAccessors.prototype._serializeValue = function(value){};
+/**
+* @param {?string} value Attribute value to deserialize.
+* @param {*=} type Type to deserialize the string to.
+* @return {*}
+*/
+Polymer_PropertyAccessors.prototype._deserializeValue = function(value, type){};
+/**
+* @param {Object} props Bag of property values that were overwritten
+ when creating property accessors.
+* @return {void}
+*/
+Polymer_PropertyAccessors.prototype._initializeProtoProperties = function(props){};
+/**
+* @param {string} attribute Name of attribute to ensure is set.
+* @param {string} value of the attribute.
+* @return {void}
+*/
+Polymer_PropertyAccessors.prototype._ensureAttribute = function(attribute, value){};
+/**
+* @param {string} property Property name
+* @return {boolean}
+*/
+Polymer_PropertyAccessors.prototype._hasAccessor = function(property){};
+/**
+* @param {string} prop Property name
+* @return {boolean}
+*/
+Polymer_PropertyAccessors.prototype._isPropertyPending = function(prop){};
+/**
+* @param {string} property Property to convert
+* @return {string}
+*/
+Polymer_PropertyAccessors.attributeNameForProperty = function(property){};
+/**
+* @return {void}
+*/
+Polymer_PropertyAccessors.createPropertiesForAttributes = function(){};
+/**
+* @interface
+*/
+function Polymer_TemplateStamp(){}
+/**
+* @param {!HTMLTemplateElement} template Template to stamp
+* @return {!StampedTemplate}
+*/
+Polymer_TemplateStamp.prototype._stampTemplate = function(template){};
+/**
+* @param {!Node} node Node to add listener on
+* @param {string} eventName Name of event
+* @param {string} methodName Name of method
+* @param {*=} context Context the method will be called on (defaults
+ to `node`)
+* @return {Function}
+*/
+Polymer_TemplateStamp.prototype._addMethodEventListenerToNode = function(node, eventName, methodName, context){};
+/**
+* @param {!Node} node Node to add event listener to
+* @param {string} eventName Name of event
+* @param {function (!Event): void} handler Listener function to add
+* @return {void}
+*/
+Polymer_TemplateStamp.prototype._addEventListenerToNode = function(node, eventName, handler){};
+/**
+* @param {Node} node Node to remove event listener from
+* @param {string} eventName Name of event
+* @param {function (!Event): void} handler Listener function to remove
+* @return {void}
+*/
+Polymer_TemplateStamp.prototype._removeEventListenerFromNode = function(node, eventName, handler){};
+/**
+* @param {!HTMLTemplateElement} template Template to parse
+* @param {TemplateInfo=} outerTemplateInfo Template metadata from the outer
+ template, for parsing nested templates
+* @return {!TemplateInfo}
+*/
+Polymer_TemplateStamp._parseTemplate = function(template, outerTemplateInfo){};
+/**
+* @param {*} template
+* @param {*} templateInfo
+* @param {*} nodeInfo
+*/
+Polymer_TemplateStamp._parseTemplateContent = function(template, templateInfo, nodeInfo){};
+/**
+* @param {Node} node Node to parse
+* @param {!TemplateInfo} templateInfo Template metadata for current template
+* @param {!NodeInfo} nodeInfo Node metadata for current template.
+* @return {boolean}
+*/
+Polymer_TemplateStamp._parseTemplateNode = function(node, templateInfo, nodeInfo){};
+/**
+* @param {Node} root Root node whose `childNodes` will be parsed
+* @param {!TemplateInfo} templateInfo Template metadata for current template
+* @param {!NodeInfo} nodeInfo Node metadata for current template.
+* @return {void}
+*/
+Polymer_TemplateStamp._parseTemplateChildNodes = function(root, templateInfo, nodeInfo){};
+/**
+* @param {HTMLTemplateElement} node Node to parse (a <template>)
+* @param {TemplateInfo} outerTemplateInfo Template metadata for current template
+ that includes the template `node`
+* @param {!NodeInfo} nodeInfo Node metadata for current template.
+* @return {boolean}
+*/
+Polymer_TemplateStamp._parseTemplateNestedTemplate = function(node, outerTemplateInfo, nodeInfo){};
+/**
+* @param {Element} node Node to parse
+* @param {TemplateInfo} templateInfo Template metadata for current template
+* @param {NodeInfo} nodeInfo Node metadata for current template.
+* @return {boolean}
+*/
+Polymer_TemplateStamp._parseTemplateNodeAttributes = function(node, templateInfo, nodeInfo){};
+/**
+* @param {Element} node Node to parse
+* @param {!TemplateInfo} templateInfo Template metadata for current template
+* @param {!NodeInfo} nodeInfo Node metadata for current template.
+* @param {string} name Attribute name
+* @param {string} value Attribute value
+* @return {boolean}
+*/
+Polymer_TemplateStamp._parseTemplateNodeAttribute = function(node, templateInfo, nodeInfo, name, value){};
+/**
+* @param {HTMLTemplateElement} template Template to retrieve `content` for
+* @return {DocumentFragment}
+*/
+Polymer_TemplateStamp._contentForTemplate = function(template){};
+/**
+* @interface
+* @extends {Polymer_TemplateStamp}
+* @extends {Polymer_PropertyAccessors}
+*/
+function Polymer_PropertyEffects(){}
+/** @type {boolean} */
+Polymer_PropertyEffects.prototype.__dataClientsReady;
+
+/** @type {Array} */
+Polymer_PropertyEffects.prototype.__dataPendingClients;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__dataToNotify;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__dataLinkedPaths;
+
+/** @type {boolean} */
+Polymer_PropertyEffects.prototype.__dataHasPaths;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__dataCompoundStorage;
+
+/** @type {Polymer_PropertyEffects} */
+Polymer_PropertyEffects.prototype.__dataHost;
+
+/** @type {!Object} */
+Polymer_PropertyEffects.prototype.__dataTemp;
+
+/** @type {boolean} */
+Polymer_PropertyEffects.prototype.__dataClientsInitialized;
+
+/** @type {!Object} */
+Polymer_PropertyEffects.prototype.__data;
+
+/** @type {!Object} */
+Polymer_PropertyEffects.prototype.__dataPending;
+
+/** @type {!Object} */
+Polymer_PropertyEffects.prototype.__dataOld;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__computeEffects;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__reflectEffects;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__notifyEffects;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__propagateEffects;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__observeEffects;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__readOnly;
+
+/** @type {!TemplateInfo} */
+Polymer_PropertyEffects.prototype.__templateInfo;
+
+/**
+* @override
+* @param {!HTMLTemplateElement} template Template to stamp
+* @return {!StampedTemplate}
+*/
+Polymer_PropertyEffects.prototype._stampTemplate = function(template){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.ready = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._initializeProperties = function(){};
+/**
+* @override
+* @param {Object} props Properties to initialize on the instance
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._initializeInstanceProperties = function(props){};
+/**
+* @override
+* @param {string} property Name of the property
+* @param {*} value Value to set
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._setProperty = function(property, value){};
+/**
+* @override
+* @param {string} property Name of the property
+* @param {*} value Value to set
+* @param {boolean=} shouldNotify True if property should fire notification
+ event (applies only for `notify: true` properties)
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._setPendingProperty = function(property, value, shouldNotify){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._invalidateProperties = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._flushProperties = function(){};
+/**
+* @param {!Object} currentProps Bag of all current accessor values
+* @param {!Object} changedProps Bag of properties changed since the last
+ call to `_propertiesChanged`
+* @param {!Object} oldProps Bag of previous values for each property
+ in `changedProps`
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._propertiesChanged = function(currentProps, changedProps, oldProps){};
+/**
+* @override
+* @param {Object} props Properties to initialize on the prototype
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._initializeProtoProperties = function(props){};
+/**
+* @param {string} property Property that should trigger the effect
+* @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES
+* @param {Object=} effect Effect metadata object
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._addPropertyEffect = function(property, type, effect){};
+/**
+* @param {string} property Property the effect was associated with
+* @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES
+* @param {Object=} effect Effect metadata object to remove
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._removePropertyEffect = function(property, type, effect){};
+/**
+* @param {string} property Property name
+* @param {string=} type Effect type, from this.PROPERTY_EFFECT_TYPES
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._hasPropertyEffect = function(property, type){};
+/**
+* @param {string} property Property name
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._hasReadOnlyEffect = function(property){};
+/**
+* @param {string} property Property name
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._hasNotifyEffect = function(property){};
+/**
+* @param {string} property Property name
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._hasReflectEffect = function(property){};
+/**
+* @param {string} property Property name
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._hasComputedEffect = function(property){};
+/**
+* @param {(string | !Array.<(number | string)>)} path Path to set
+* @param {*} value Value to set
+* @param {boolean=} shouldNotify Set to true if this change should
+ cause a property notification event dispatch
+* @param {boolean=} isPathNotification If the path being set is a path
+ notification of an already changed value, as opposed to a request
+ to set and notify the change. In the latter `false` case, a dirty
+ check is performed and then the value is set to the path before
+ enqueuing the pending property change.
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._setPendingPropertyOrPath = function(path, value, shouldNotify, isPathNotification){};
+/**
+* @param {!Node} node The node to set a property on
+* @param {string} prop The property to set
+* @param {*} value The value to set
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._setUnmanagedPropertyToNode = function(node, prop, value){};
+/**
+* @param {Object} client PropertyEffects client to enqueue
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._enqueueClient = function(client){};
+/**
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._flushClients = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._readyClients = function(){};
+/**
+* @param {Object} props Bag of one or more key-value pairs whose key is
+ a property and value is the new value to set for that property.
+* @param {boolean=} setReadOnly When true, any private values set in
+ `props` will be set. By default, `setProperties` will not set
+ `readOnly: true` root properties.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.setProperties = function(props, setReadOnly){};
+/**
+* @param {Object} changedProps Bag of changed properties
+* @param {Object} oldProps Bag of previous values for changed properties
+* @param {boolean} hasPaths True with `props` contains one or more paths
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._propagatePropertyChanges = function(changedProps, oldProps, hasPaths){};
+/**
+* @param {(string | !Array.<(string | number)>)} to Target path to link.
+* @param {(string | !Array.<(string | number)>)} from Source path to link.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.linkPaths = function(to, from){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Target path to unlink.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.unlinkPaths = function(path){};
+/**
+* @param {string} path Path that should be notified.
+* @param {Array} splices Array of splice records indicating ordered
+ changes that occurred to the array. Each record should have the
+ following fields:
+ * index: index at which the change occurred
+ * removed: array of items that were removed from this index
+ * addedCount: number of new items added at this index
+ * object: a reference to the array in question
+ * type: the string literal 'splice'
+
+ Note that splice records _must_ be normalized such that they are
+ reported in index order (raw results from `Object.observe` are not
+ ordered and must be normalized/merged before notifying).
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.notifySplices = function(path, splices){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to the value
+ to read. The path may be specified as a string (e.g. `foo.bar.baz`)
+ or an array of path parts (e.g. `['foo.bar', 'baz']`). Note that
+ bracketed expressions are not supported; string-based path parts
+ *must* be separated by dots. Note that when dereferencing array
+ indices, the index may be used as a dotted part directly
+ (e.g. `users.12.name` or `['users', 12, 'name']`).
+* @param {Object=} root Root object from which the path is evaluated.
+* @return {*}
+*/
+Polymer_PropertyEffects.prototype.get = function(path, root){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to the value
+ to write. The path may be specified as a string (e.g. `'foo.bar.baz'`)
+ or an array of path parts (e.g. `['foo.bar', 'baz']`). Note that
+ bracketed expressions are not supported; string-based path parts
+ *must* be separated by dots. Note that when dereferencing array
+ indices, the index may be used as a dotted part directly
+ (e.g. `'users.12.name'` or `['users', 12, 'name']`).
+* @param {*} value Value to set at the specified path.
+* @param {Object=} root Root object from which the path is evaluated.
+ When specified, no notification will occur.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.set = function(path, value, root){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to array.
+* @param {...*} items Items to push onto array
+* @return {number}
+*/
+Polymer_PropertyEffects.prototype.push = function(path, items){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to array.
+* @return {*}
+*/
+Polymer_PropertyEffects.prototype.pop = function(path){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to array.
+* @param {number} start Index from which to start removing/inserting.
+* @param {number} deleteCount Number of items to remove.
+* @param {...*} items Items to insert into array.
+* @return {Array}
+*/
+Polymer_PropertyEffects.prototype.splice = function(path, start, deleteCount, items){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to array.
+* @return {*}
+*/
+Polymer_PropertyEffects.prototype.shift = function(path){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to array.
+* @param {...*} items Items to insert info array
+* @return {number}
+*/
+Polymer_PropertyEffects.prototype.unshift = function(path, items){};
+/**
+* @param {string} path Path that should be notified.
+* @param {*=} value Value at the path (optional).
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.notifyPath = function(path, value){};
+/**
+* @param {string} property Property name
+* @param {boolean=} protectedSetter Creates a custom protected setter
+ when `true`.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._createReadOnlyProperty = function(property, protectedSetter){};
+/**
+* @param {string} property Property name
+* @param {(string | function (*, *))} method Function or name of observer method to call
+* @param {boolean=} dynamicFn Whether the method name should be included as
+ a dependency to the effect.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._createPropertyObserver = function(property, method, dynamicFn){};
+/**
+* @param {string} expression Method expression
+* @param {(boolean | Object)=} dynamicFn Boolean or object map indicating
+ whether method names should be included as a dependency to the effect.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._createMethodObserver = function(expression, dynamicFn){};
+/**
+* @param {string} property Property name
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._createNotifyingProperty = function(property){};
+/**
+* @param {string} property Property name
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._createReflectedProperty = function(property){};
+/**
+* @param {string} property Name of computed property to set
+* @param {string} expression Method expression
+* @param {(boolean | Object)=} dynamicFn Boolean or object map indicating
+ whether method names should be included as a dependency to the effect.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._createComputedProperty = function(property, expression, dynamicFn){};
+/**
+* @param {!HTMLTemplateElement} template Template containing binding
+ bindings
+* @param {boolean=} instanceBinding When false (default), performs
+ "prototypical" binding of the template and overwrites any previously
+ bound template for the class. When true (as passed from
+ `_stampTemplate`), the template info is instanced and linked into
+ the list of bound templates.
+* @return {!TemplateInfo}
+*/
+Polymer_PropertyEffects.prototype._bindTemplate = function(template, instanceBinding){};
+/**
+* @param {!StampedTemplate} dom DocumentFragment previously returned
+ from `_stampTemplate` associated with the nodes to be removed
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._removeBoundDom = function(dom){};
+/**
+* @override
+* @param {Node} node Node to parse
+* @param {TemplateInfo} templateInfo Template metadata for current template
+* @param {NodeInfo} nodeInfo Node metadata for current template node
+* @return {boolean}
+*/
+Polymer_PropertyEffects._parseTemplateNode = function(node, templateInfo, nodeInfo){};
+/**
+* @override
+* @param {Node} node Node to parse
+* @param {TemplateInfo} templateInfo Template metadata for current template
+* @param {NodeInfo} nodeInfo Node metadata for current template node
+* @return {boolean}
+*/
+Polymer_PropertyEffects._parseTemplateNestedTemplate = function(node, templateInfo, nodeInfo){};
+/**
+* @override
+* @param {Element} node Node to parse
+* @param {TemplateInfo} templateInfo Template metadata for current template
+* @param {NodeInfo} nodeInfo Node metadata for current template node
+* @param {string} name Attribute name
+* @param {string} value Attribute value
+* @return {boolean}
+*/
+Polymer_PropertyEffects._parseTemplateNodeAttribute = function(node, templateInfo, nodeInfo, name, value){};
+/**
+* @param {string} property Property that should trigger the effect
+* @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES
+* @param {Object=} effect Effect metadata object
+* @return {void}
+*/
+Polymer_PropertyEffects.addPropertyEffect = function(property, type, effect){};
+/**
+* @param {string} property Property name
+* @param {(string | function (*, *))} method Function or name of observer method to call
+* @param {boolean=} dynamicFn Whether the method name should be included as
+ a dependency to the effect.
+* @return {void}
+*/
+Polymer_PropertyEffects.createPropertyObserver = function(property, method, dynamicFn){};
+/**
+* @param {string} expression Method expression
+* @param {(boolean | Object)=} dynamicFn Boolean or object map indicating
+* @return {void}
+*/
+Polymer_PropertyEffects.createMethodObserver = function(expression, dynamicFn){};
+/**
+* @param {string} property Property name
+* @return {void}
+*/
+Polymer_PropertyEffects.createNotifyingProperty = function(property){};
+/**
+* @param {string} property Property name
+* @param {boolean=} protectedSetter Creates a custom protected setter
+ when `true`.
+* @return {void}
+*/
+Polymer_PropertyEffects.createReadOnlyProperty = function(property, protectedSetter){};
+/**
+* @param {string} property Property name
+* @return {void}
+*/
+Polymer_PropertyEffects.createReflectedProperty = function(property){};
+/**
+* @param {string} property Name of computed property to set
+* @param {string} expression Method expression
+* @param {(boolean | Object)=} dynamicFn Boolean or object map indicating whether
+ method names should be included as a dependency to the effect.
+* @return {void}
+*/
+Polymer_PropertyEffects.createComputedProperty = function(property, expression, dynamicFn){};
+/**
+* @param {!HTMLTemplateElement} template Template containing binding
+ bindings
+* @return {!TemplateInfo}
+*/
+Polymer_PropertyEffects.bindTemplate = function(template){};
+/**
+* @param {Object} templateInfo Template metadata to add effect to
+* @param {string} prop Property that should trigger the effect
+* @param {Object=} effect Effect metadata object
+* @return {void}
+*/
+Polymer_PropertyEffects._addTemplatePropertyEffect = function(templateInfo, prop, effect){};
+/**
+* @param {string} text Text to parse from attribute or textContent
+* @param {Object} templateInfo Current template metadata
+* @return {Array.<!BindingPart>}
+*/
+Polymer_PropertyEffects._parseBindings = function(text, templateInfo){};
+/**
+* @param {this} inst Element that should be used as scope for
+ binding dependencies
+* @param {BindingPart} part Binding part metadata
+* @param {string} path Property/path that triggered this effect
+* @param {Object} props Bag of current property changes
+* @param {Object} oldProps Bag of previous values for changed properties
+* @param {boolean} hasPaths True with `props` contains one or more paths
+* @return {*}
+*/
+Polymer_PropertyEffects._evaluateBinding = function(inst, part, path, props, oldProps, hasPaths){};
+/**
+* @interface
+* @extends {Polymer_PropertiesChanged}
+*/
+function Polymer_PropertiesMixin(){}
+/**
+* @override
+* @return {void}
+*/
+Polymer_PropertiesMixin.prototype._initializeProperties = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesMixin.prototype.connectedCallback = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesMixin.prototype.disconnectedCallback = function(){};
+/**
+* @param {string} name Name of property
+* @return {*}
+*/
+Polymer_PropertiesMixin.typeForProperty = function(name){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesMixin.finalize = function(){};
+/**
+* @return {undefined}
+*/
+Polymer_PropertiesMixin._finalizeClass = function(){};
+/**
+* @interface
+* @extends {Polymer_PropertyEffects}
+* @extends {Polymer_PropertiesMixin}
+*/
+function Polymer_ElementMixin(){}
+/** @type {HTMLTemplateElement} */
+Polymer_ElementMixin.prototype._template;
+
+/** @type {string} */
+Polymer_ElementMixin.prototype._importPath;
+
+/** @type {string} */
+Polymer_ElementMixin.prototype.rootPath;
+
+/** @type {string} */
+Polymer_ElementMixin.prototype.importPath;
+
+/** @type {(StampedTemplate | HTMLElement | ShadowRoot)} */
+Polymer_ElementMixin.prototype.root;
+
+/** @type {!Object.<string, !Element>} */
+Polymer_ElementMixin.prototype.$;
+
+/**
+* @override
+* @return {void}
+*/
+Polymer_ElementMixin.prototype.ready = function(){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_ElementMixin.prototype._initializeProperties = function(){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_ElementMixin.prototype._readyClients = function(){};
+/**
+* @return {void}
+*/
+Polymer_ElementMixin.prototype.connectedCallback = function(){};
+/**
+* @param {StampedTemplate} dom to attach to the element.
+* @return {ShadowRoot}
+*/
+Polymer_ElementMixin.prototype._attachDom = function(dom){};
+/**
+* @param {Object=} properties Bag of custom property key/values to
+ apply to this element.
+* @return {void}
+*/
+Polymer_ElementMixin.prototype.updateStyles = function(properties){};
+/**
+* @param {string} url URL to resolve.
+* @param {string=} base Optional base URL to resolve against, defaults
+to the element's `importPath`
+* @return {string}
+*/
+Polymer_ElementMixin.prototype.resolveUrl = function(url, base){};
+/**
+* @override
+*/
+Polymer_ElementMixin._parseTemplateContent = function(template, templateInfo, nodeInfo){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_ElementMixin.createProperties = function(props){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_ElementMixin._finalizeClass = function(){};
+/**
+* @param {Object} observers Array of observer descriptors for
+ this class
+* @param {Object} dynamicFns Object containing keys for any properties
+ that are functions and should trigger the effect when the function
+ reference is changed
+* @return {void}
+*/
+Polymer_ElementMixin.createObservers = function(observers, dynamicFns){};
+/**
+* @param {string} cssText Text containing styling to process
+* @param {string} baseURI Base URI to rebase CSS paths against
+* @return {string}
+*/
+Polymer_ElementMixin._processStyleText = function(cssText, baseURI){};
+/**
+* @param {string} is Tag name (or type extension name) for this element
+* @return {void}
+*/
+Polymer_ElementMixin._finalizeTemplate = function(is){};
+/**
+* @interface
+*/
+function Polymer_GestureEventListeners(){}
+/**
+* @param {!Node} node Node to add event listener to
+* @param {string} eventName Name of event
+* @param {function (!Event): void} handler Listener function to add
+* @return {void}
+*/
+Polymer_GestureEventListeners.prototype._addEventListenerToNode = function(node, eventName, handler){};
+/**
+* @param {!Node} node Node to remove event listener from
+* @param {string} eventName Name of event
+* @param {function (!Event): void} handler Listener function to remove
+* @return {void}
+*/
+Polymer_GestureEventListeners.prototype._removeEventListenerFromNode = function(node, eventName, handler){};
+/**
+* @interface
+* @extends {Polymer_PropertyAccessors}
+*/
+function Polymer_DirMixin(){}
+/** @type {boolean} */
+Polymer_DirMixin.prototype.__autoDirOptOut;
+
+/**
+* @return {void}
+*/
+Polymer_DirMixin.prototype.ready = function(){};
+/**
+* @return {void}
+*/
+Polymer_DirMixin.prototype.connectedCallback = function(){};
+/**
+* @return {void}
+*/
+Polymer_DirMixin.prototype.disconnectedCallback = function(){};
+/**
+* @override
+*/
+Polymer_DirMixin._processStyleText = function(cssText, baseURI){};
+/**
+* @param {string} text CSS text to replace DIR
+* @return {string}
+*/
+Polymer_DirMixin._replaceDirInCssText = function(text){};
+/**
+* @interface
+* @extends {Polymer_ElementMixin}
+* @extends {Polymer_GestureEventListeners}
+*/
+function Polymer_LegacyElementMixin(){}
+/** @type {boolean} */
+Polymer_LegacyElementMixin.prototype.isAttached;
+
+/** @type {WeakMap.<!Element, !Object.<string, !Function>>} */
+Polymer_LegacyElementMixin.prototype.__boundListeners;
+
+/** @type {Object.<string, Function>} */
+Polymer_LegacyElementMixin.prototype._debouncers;
+
+/**
+* @override
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.ready = function(){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._initializeProperties = function(){};
+/**
+* @override
+* @param {string} name Name of attribute.
+* @param {?string} old Old value of attribute.
+* @param {?string} value Current value of attribute.
+* @param {?string} namespace Attribute namespace.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.attributeChangedCallback = function(name, old, value, namespace){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.connectedCallback = function(){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.disconnectedCallback = function(){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.created = function(){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.attached = function(){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.detached = function(){};
+/**
+* @param {string} name Name of attribute.
+* @param {?string} old Old value of attribute.
+* @param {?string} value Current value of attribute.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.attributeChanged = function(name, old, value){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._registered = function(){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._ensureAttributes = function(){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._applyListeners = function(){};
+/**
+* @param {*} value Value to deserialize
+* @return {(string | undefined)}
+*/
+Polymer_LegacyElementMixin.prototype.serialize = function(value){};
+/**
+* @param {string} value String to deserialize
+* @param {*} type Type to deserialize the string to
+* @return {*}
+*/
+Polymer_LegacyElementMixin.prototype.deserialize = function(value, type){};
+/**
+* @param {string} property Property name to reflect.
+* @param {string=} attribute Attribute name to reflect.
+* @param {*=} value Property value to reflect.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.reflectPropertyToAttribute = function(property, attribute, value){};
+/**
+* @param {*} value Value to serialize.
+* @param {string} attribute Attribute name to serialize to.
+* @param {Element} node Element to set attribute to.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.serializeValueToAttribute = function(value, attribute, node){};
+/**
+* @param {Object} prototype Target object to copy properties to.
+* @param {Object} api Source object to copy properties from.
+* @return {Object}
+*/
+Polymer_LegacyElementMixin.prototype.extend = function(prototype, api){};
+/**
+* @param {!Object} target Target object to copy properties to.
+* @param {!Object} source Source object to copy properties from.
+* @return {!Object}
+*/
+Polymer_LegacyElementMixin.prototype.mixin = function(target, source){};
+/**
+* @param {Object} object The object on which to set the prototype.
+* @param {Object} prototype The prototype that will be set on the given
+`object`.
+* @return {Object}
+*/
+Polymer_LegacyElementMixin.prototype.chainObject = function(object, prototype){};
+/**
+* @param {HTMLTemplateElement} template HTML template element to instance.
+* @return {!DocumentFragment}
+*/
+Polymer_LegacyElementMixin.prototype.instanceTemplate = function(template){};
+/**
+* @param {string} type Name of event type.
+* @param {*=} detail Detail value containing event-specific
+ payload.
+* @param {{bubbles: (boolean | undefined), cancelable: (boolean | undefined), composed: (boolean | undefined)}=} options Object specifying options. These may include:
+ `bubbles` (boolean, defaults to `true`),
+ `cancelable` (boolean, defaults to false), and
+ `node` on which to fire the event (HTMLElement, defaults to `this`).
+* @return {!Event}
+*/
+Polymer_LegacyElementMixin.prototype.fire = function(type, detail, options){};
+/**
+* @param {Element} node Element to add event listener to.
+* @param {string} eventName Name of event to listen for.
+* @param {string} methodName Name of handler method on `this` to call.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.listen = function(node, eventName, methodName){};
+/**
+* @param {Element} node Element to remove event listener from.
+* @param {string} eventName Name of event to stop listening to.
+* @param {string} methodName Name of handler method on `this` to not call
+ anymore.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.unlisten = function(node, eventName, methodName){};
+/**
+* @param {string=} direction Direction to allow scrolling
+Defaults to `all`.
+* @param {Element=} node Element to apply scroll direction setting.
+Defaults to `this`.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.setScrollDirection = function(direction, node){};
+/**
+* @param {string} slctr Selector to run on this local DOM scope
+* @return {Element}
+*/
+Polymer_LegacyElementMixin.prototype.$$ = function(slctr){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.distributeContent = function(){};
+/**
+* @return {!Array.<!Node>}
+*/
+Polymer_LegacyElementMixin.prototype.getEffectiveChildNodes = function(){};
+/**
+* @param {string} selector Selector to run.
+* @return {!Array.<!Node>}
+*/
+Polymer_LegacyElementMixin.prototype.queryDistributedElements = function(selector){};
+/**
+* @return {!Array.<!Node>}
+*/
+Polymer_LegacyElementMixin.prototype.getEffectiveChildren = function(){};
+/**
+* @return {string}
+*/
+Polymer_LegacyElementMixin.prototype.getEffectiveTextContent = function(){};
+/**
+* @param {string} selector Selector to run.
+* @return {Node}
+*/
+Polymer_LegacyElementMixin.prototype.queryEffectiveChildren = function(selector){};
+/**
+* @param {string} selector Selector to run.
+* @return {!Array.<!Node>}
+*/
+Polymer_LegacyElementMixin.prototype.queryAllEffectiveChildren = function(selector){};
+/**
+* @param {string=} slctr CSS selector to choose the desired
+ `<slot>`. Defaults to `content`.
+* @return {!Array.<!Node>}
+*/
+Polymer_LegacyElementMixin.prototype.getContentChildNodes = function(slctr){};
+/**
+* @param {string=} slctr CSS selector to choose the desired
+ `<content>`. Defaults to `content`.
+* @return {!Array.<!HTMLElement>}
+*/
+Polymer_LegacyElementMixin.prototype.getContentChildren = function(slctr){};
+/**
+* @param {?Node} node The element to be checked.
+* @return {boolean}
+*/
+Polymer_LegacyElementMixin.prototype.isLightDescendant = function(node){};
+/**
+* @param {!Element} node The element to be checked.
+* @return {boolean}
+*/
+Polymer_LegacyElementMixin.prototype.isLocalDescendant = function(node){};
+/**
+* @param {*} container Unused
+* @param {*} shouldObserve Unused
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.scopeSubtree = function(container, shouldObserve){};
+/**
+* @param {string} property The css property name.
+* @return {string}
+*/
+Polymer_LegacyElementMixin.prototype.getComputedStyleValue = function(property){};
+/**
+* @param {string} jobName String to identify the debounce job.
+* @param {function (): void} callback Function that is called (with `this`
+ context) when the wait time elapses.
+* @param {number} wait Optional wait time in milliseconds (ms) after the
+ last signal that must elapse before invoking `callback`
+* @return {!Object}
+*/
+Polymer_LegacyElementMixin.prototype.debounce = function(jobName, callback, wait){};
+/**
+* @param {string} jobName The name of the debouncer started with `debounce`
+* @return {boolean}
+*/
+Polymer_LegacyElementMixin.prototype.isDebouncerActive = function(jobName){};
+/**
+* @param {string} jobName The name of the debouncer started with `debounce`
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.flushDebouncer = function(jobName){};
+/**
+* @param {string} jobName The name of the debouncer started with `debounce`
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.cancelDebouncer = function(jobName){};
+/**
+* @param {!Function} callback The callback function to run, bound to `this`.
+* @param {number=} waitTime Time to wait before calling the
+ `callback`. If unspecified or 0, the callback will be run at microtask
+ timing (before paint).
+* @return {number}
+*/
+Polymer_LegacyElementMixin.prototype.async = function(callback, waitTime){};
+/**
+* @param {number} handle Handle returned from original `async` call to
+ cancel.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.cancelAsync = function(handle){};
+/**
+* @param {string} tag HTML element tag to create.
+* @param {Object=} props Object of properties to configure on the
+ instance.
+* @return {!Element}
+*/
+Polymer_LegacyElementMixin.prototype.create = function(tag, props){};
+/**
+* @param {string} href URL to document to load.
+* @param {?function (!Event): void=} onload Callback to notify when an import successfully
+ loaded.
+* @param {?function (!ErrorEvent): void=} onerror Callback to notify when an import
+ unsuccessfully loaded.
+* @param {boolean=} optAsync True if the import should be loaded `async`.
+ Defaults to `false`.
+* @return {!HTMLLinkElement}
+*/
+Polymer_LegacyElementMixin.prototype.importHref = function(href, onload, onerror, optAsync){};
+/**
+* @param {string} selector Selector to test.
+* @param {!Element=} node Element to test the selector against.
+* @return {boolean}
+*/
+Polymer_LegacyElementMixin.prototype.elementMatches = function(selector, node){};
+/**
+* @param {string} name HTML attribute name
+* @param {boolean=} bool Boolean to force the attribute on or off.
+ When unspecified, the state of the attribute will be reversed.
+* @param {Element=} node Node to target. Defaults to `this`.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.toggleAttribute = function(name, bool, node){};
+/**
+* @param {string} name CSS class name
+* @param {boolean=} bool Boolean to force the class on or off.
+ When unspecified, the state of the class will be reversed.
+* @param {Element=} node Node to target. Defaults to `this`.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.toggleClass = function(name, bool, node){};
+/**
+* @param {string} transformText Transform setting.
+* @param {Element=} node Element to apply the transform to.
+Defaults to `this`
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.transform = function(transformText, node){};
+/**
+* @param {number} x X offset.
+* @param {number} y Y offset.
+* @param {number} z Z offset.
+* @param {Element=} node Element to apply the transform to.
+Defaults to `this`.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.translate3d = function(x, y, z, node){};
+/**
+* @param {(string | !Array.<(number | string)>)} arrayOrPath Path to array from which to remove the item
+ (or the array itself).
+* @param {*} item Item to remove.
+* @return {Array}
+*/
+Polymer_LegacyElementMixin.prototype.arrayDelete = function(arrayOrPath, item){};
+/**
+* @param {string} level One of 'log', 'warn', 'error'
+* @param {Array} args Array of strings or objects to log
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._logger = function(level, args){};
+/**
+* @param {...*} args Array of strings or objects to log
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._log = function(args){};
+/**
+* @param {...*} args Array of strings or objects to log
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._warn = function(args){};
+/**
+* @param {...*} args Array of strings or objects to log
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._error = function(args){};
+/**
+* @param {string} methodName Method name to associate with message
+* @param {...*} args Array of strings or objects to log
+* @return {Array}
+*/
+Polymer_LegacyElementMixin.prototype._logf = function(methodName, args){};
+/**
+* @interface
+*/
+function Polymer_MutableData(){}
+/**
+* @param {string} property Property name
+* @param {*} value New property value
+* @param {*} old Previous property value
+* @return {boolean}
+*/
+Polymer_MutableData.prototype._shouldPropertyChange = function(property, value, old){};
+/**
+* @interface
+*/
+function Polymer_OptionalMutableData(){}
+/** @type {boolean} */
+Polymer_OptionalMutableData.prototype.mutableData;
+
+/**
+* @param {string} property Property name
+* @param {*} value New property value
+* @param {*} old Previous property value
+* @return {boolean}
+*/
+Polymer_OptionalMutableData.prototype._shouldPropertyChange = function(property, value, old){};
+/**
+* @interface
+* @extends {Polymer_ElementMixin}
+*/
+function Polymer_ArraySelectorMixin(){}
+/** @type {Array} */
+Polymer_ArraySelectorMixin.prototype.items;
+
+/** @type {boolean} */
+Polymer_ArraySelectorMixin.prototype.multi;
+
+/** @type {?(Object | Array.<!Object>)} */
+Polymer_ArraySelectorMixin.prototype.selected;
+
+/** @type {?Object} */
+Polymer_ArraySelectorMixin.prototype.selectedItem;
+
+/** @type {boolean} */
+Polymer_ArraySelectorMixin.prototype.toggle;
+
+/**
+* @return {void}
+*/
+Polymer_ArraySelectorMixin.prototype.clearSelection = function(){};
+/**
+* @param {*} item Item from `items` array to test
+* @return {boolean}
+*/
+Polymer_ArraySelectorMixin.prototype.isSelected = function(item){};
+/**
+* @param {number} idx Index from `items` array to test
+* @return {boolean}
+*/
+Polymer_ArraySelectorMixin.prototype.isIndexSelected = function(idx){};
+/**
+* @param {*} item Item from `items` array to deselect
+* @return {void}
+*/
+Polymer_ArraySelectorMixin.prototype.deselect = function(item){};
+/**
+* @param {number} idx Index from `items` array to deselect
+* @return {void}
+*/
+Polymer_ArraySelectorMixin.prototype.deselectIndex = function(idx){};
+/**
+* @param {*} item Item from `items` array to select
+* @return {void}
+*/
+Polymer_ArraySelectorMixin.prototype.select = function(item){};
+/**
+* @param {number} idx Index from `items` array to select
+* @return {void}
+*/
+Polymer_ArraySelectorMixin.prototype.selectIndex = function(idx){};
+/**
+* @interface
+* @extends {Polymer_PropertyEffects}
+*/
+function Polymer_StrictBindingParser(){}
+/**
+* @param {string} text Text to parse from attribute or textContent
+* @param {Object} templateInfo Current template metadata
+* @return {Array.<!BindingPart>}
+*/
+Polymer_StrictBindingParser._parseBindings = function(text, templateInfo){};
+/**
+* @interface
+* @extends {Polymer_ElementMixin}
+*/
+function Polymer_DisableUpgradeMixin(){}
+/**
+* @override
+*/
+Polymer_DisableUpgradeMixin.prototype._initializeProperties = function(){};
+/**
+* @override
+*/
+Polymer_DisableUpgradeMixin.prototype._enableProperties = function(){};
+/**
+* @override
+*/
+Polymer_DisableUpgradeMixin.prototype.attributeChangedCallback = function(name, old, value, namespace){};
+/**
+* @override
+*/
+Polymer_DisableUpgradeMixin.prototype.connectedCallback = function(){};
+/**
+* @override
+*/
+Polymer_DisableUpgradeMixin.prototype.disconnectedCallback = function(){}; \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/externs/polymer-externs.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/externs/polymer-externs.js
new file mode 100644
index 00000000000..0a86620b691
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/externs/polymer-externs.js
@@ -0,0 +1,112 @@
+/**
+ * @fileoverview Externs for Polymer Pass and external Polymer API
+ * @externs
+ *
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+/* eslint-disable */
+
+/**
+ * @typedef {{
+ * type: !Function,
+ * value: *,
+ * readOnly: (boolean | undefined),
+ * computed: (string | undefined),
+ * reflectToAttribute: (boolean | undefined),
+ * notify: (boolean | undefined),
+ * observer: (string | function(*,*) | undefined)
+ * }}
+ */
+let PolymerElementPropertiesMeta;
+
+/**
+ * @typedef {Object<string, !PolymerElementPropertiesMeta>}
+ */
+let PolymerElementProperties;
+
+let PolymerInit = function(){};
+/** @type {string} */
+PolymerInit.prototype.is;
+/** @type {(string | undefined)} */
+PolymerInit.prototype.extends;
+/** @type {(!PolymerElementProperties | undefined)} */
+PolymerInit.prototype.properties;
+/** @type {(!Array<string> | undefined)} */
+PolymerInit.prototype.observers;
+/** @type {(!HTMLTemplateElement | string | undefined)} */
+PolymerInit.prototype.template;
+/** @type {(!Object<string, *> | undefined)} */
+PolymerInit.prototype.hostAttributes;
+/** @type {(!Object<string, string> | undefined)} */
+PolymerInit.prototype.listeners;
+
+let PolymerElementConstructor = function (){};
+/** @type {(string | undefined)} */
+PolymerElementConstructor.is;
+/** @type {(string | undefined)} */
+PolymerElementConstructor.extends;
+/** @type {(!PolymerElementProperties | undefined)} */
+PolymerElementConstructor.properties;
+/** @type {(!Array<string> | undefined)} */
+PolymerElementConstructor.observers;
+/** @type {(!HTMLTemplateElement | string | undefined)} */
+PolymerElementConstructor.template;
+
+let PropertiesMixinConstructor = function (){};
+/** @type {(!PolymerElementProperties | undefined)} */
+PropertiesMixinConstructor.properties;
+
+/**
+ * @param {!PolymerInit} init
+ * @return {!function(new:HTMLElement)}
+ */
+function Polymer(init){}
+
+/** @type {PolymerElementProperties} */
+Polymer.ElementProperties;
+
+/**
+ * @type {(function(*,string,string,Node):*)|undefined}
+ */
+Polymer.sanitizeDOMValue;
+
+/**
+ * @param {string} string
+ * @param {Object} obj
+ * @return {string}
+ */
+function JSCompiler_renameProperty(string, obj) {}
+
+/** @record */
+function PolymerTelemetry(){}
+/** @type {number} */
+PolymerTelemetry.instanceCount;
+/** @type {Array<HTMLElement>} */
+PolymerTelemetry.registrations;
+/** @type {function(HTMLElement)} */
+PolymerTelemetry._regLog;
+/** @type {function(HTMLElement)} */
+PolymerTelemetry.register;
+/** @type {function(HTMLElement)} */
+PolymerTelemetry.dumpRegistrations;;
+
+/** @type {PolymerTelemetry} */
+Polymer.telemetry;
+
+/** @type {string} */
+Polymer.version;
+
+// nb. This is explicitly 'var', as Closure Compiler checks that this is the case.
+/**
+ * @constructor
+ * @extends {HTMLElement}
+ * @implements {Polymer_LegacyElementMixin}
+ */
+var PolymerElement = Polymer.LegacyElementMixin();
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/externs/polymer-internal-shared-types.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/externs/polymer-internal-shared-types.js
new file mode 100644
index 00000000000..274f60351d1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/externs/polymer-internal-shared-types.js
@@ -0,0 +1,165 @@
+/**
+ * @fileoverview Internal shared types for Polymer
+ *
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+/* eslint-disable no-unused-vars, strict, valid-jsdoc */
+
+/**
+ * @constructor
+ * @extends {DocumentFragment}
+ */
+function StampedTemplate() { }
+/** @type {boolean} */
+StampedTemplate.prototype.__noInsertionPoint;
+/** @type {!Array<!Node>} */
+StampedTemplate.prototype.nodeList;
+/** @type {!Object<string, !Element>} */
+StampedTemplate.prototype.$;
+/** @type {!TemplateInfo | undefined} */
+StampedTemplate.prototype.templateInfo;
+
+/** @interface */
+function NodeInfo() { }
+/** @type {string} */
+NodeInfo.prototype.id;
+/** @type {!Array<{name: string, value: string}>}*/
+NodeInfo.prototype.events;
+/** @type {boolean} */
+NodeInfo.prototype.hasInsertionPoint;
+/** @type {!TemplateInfo} */
+NodeInfo.prototype.templateInfo;
+/** @type {!NodeInfo} */
+NodeInfo.prototype.parentInfo;
+/** @type {number} */
+NodeInfo.prototype.parentIndex;
+/** @type {number} */
+NodeInfo.prototype.infoIndex;
+/** @type {!Array<!Binding>} */
+NodeInfo.prototype.bindings;
+
+/** @interface */
+function TemplateInfo() { }
+/** @type {!Array<!NodeInfo>} */
+TemplateInfo.prototype.nodeInfoList;
+/** @type {!Array<!Node>} */
+TemplateInfo.prototype.nodeList;
+/** @type {boolean} */
+TemplateInfo.prototype.stripWhitespace;
+/** @type {boolean | undefined} */
+TemplateInfo.prototype.hasInsertionPoint;
+/** @type {!Object} */
+TemplateInfo.prototype.hostProps;
+/** @type {!Object} */
+TemplateInfo.prototype.propertyEffects;
+/** @type {TemplateInfo | undefined} */
+TemplateInfo.prototype.nextTemplateInfo;
+/** @type {TemplateInfo | undefined} */
+TemplateInfo.prototype.previousTemplateInfo;
+/** @type {!Array<!Node>} */
+TemplateInfo.prototype.childNodes;
+/** @type {boolean} */
+TemplateInfo.prototype.wasPreBound;
+
+/**
+ * type for HTMLTemplateElement with `_templateInfo`
+ *
+ * @constructor
+ * @extends {HTMLTemplateElement}
+ */
+function HTMLTemplateElementWithInfo() { }
+/** @type {TemplateInfo} */
+HTMLTemplateElementWithInfo.prototype._templateInfo;
+
+/**
+ * @typedef {{
+ * literal: string,
+ * compoundIndex: (number | undefined)
+ * }}
+ */
+let LiteralBindingPart;
+
+/**
+ * @typedef {{
+ * literal: boolean,
+ * name: string,
+ * value: (string | number),
+ * rootProperty: (string | undefined),
+ * structured: (boolean | undefined),
+ * wildcard: (boolean | undefined)
+ * }}
+ */
+let MethodArg;
+
+/**
+ * @typedef {{
+ * methodName: string,
+ * static: boolean,
+ * args: !Array<!MethodArg>,
+ * dynamicFn: (boolean | undefined),
+ * }}
+ */
+let MethodSignature;
+
+/**
+ * @typedef {{
+ * mode: string,
+ * negate: boolean,
+ * source: string,
+ * dependencies: !Array<(!MethodArg|string)>,
+ * customEvent: boolean,
+ * signature: Object,
+ * event: string
+ * }}
+ */
+let ExpressionBindingPart;
+
+/**
+ * @typedef {LiteralBindingPart | ExpressionBindingPart}
+ */
+let BindingPart;
+
+/**
+ * @typedef {{
+ * kind: string,
+ * target: string,
+ * parts: Array<!BindingPart>,
+ * literal: (string | undefined),
+ * isCompound: boolean,
+ * listenerEvent: (string | undefined),
+ * listenerNegate: (boolean | undefined)
+ * }}
+ */
+let Binding;
+
+/**
+ * @typedef {{
+ * path: string
+ * }}
+ */
+let PathInfo;
+
+/**
+ * @typedef {{
+ * forwardHostProp: (function(string, *) | undefined),
+ * instanceProps: (Object | undefined),
+ * mutableData: (boolean | undefined),
+ * notifyInstanceProp: (function(*, string, *) | undefined),
+ * parentModel: (boolean | undefined)
+ * }}
+ */
+let TemplatizeOptions;
+
+/** @record */
+function AsyncInterface(){}
+/** @type {function(!Function, number=): number} */
+AsyncInterface.prototype.run;
+/** @type {function(number): void} */
+AsyncInterface.prototype.cancel;
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/externs/polymer-internal-types.html b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/externs/polymer-internal-types.html
new file mode 100644
index 00000000000..bc7abad6366
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/externs/polymer-internal-types.html
@@ -0,0 +1,11 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<!-- internal shared types for closure pass -->
+<script src="polymer-internal-shared-types.js"></script> \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/externs/webcomponents-externs.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/externs/webcomponents-externs.js
new file mode 100644
index 00000000000..8bcf4cede57
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/externs/webcomponents-externs.js
@@ -0,0 +1,64 @@
+/**
+ * @fileoverview Externs for webcomponents polyfills
+ * @externs
+ *
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+/* eslint-disable */
+
+let HTMLImports = {
+ /**
+ * @param {function()} callback
+ */
+ whenReady(callback){},
+ /**
+ * @param {Element} element
+ * @returns {Document} document
+ */
+ importForElement(element){}
+};
+
+window.HTMLImports = HTMLImports;
+
+let ShadyDOM = {
+ inUse: false,
+ flush(){},
+ /**
+ * @param {!Node} target
+ * @param {function(Array<MutationRecord>, MutationObserver)} callback
+ * @return {MutationObserver}
+ */
+ observeChildren(target, callback){},
+ /**
+ * @param {MutationObserver} observer
+ */
+ unobserveChildren(observer){},
+ /**
+ * @param {Node} node
+ */
+ patch(node){}
+};
+
+window.ShadyDOM = ShadyDOM;
+
+let WebComponents = {};
+window.WebComponents = WebComponents;
+
+/** @type {Element} */
+HTMLElement.prototype._activeElement;
+
+/**
+ * @param {HTMLTemplateElement} template
+ */
+HTMLTemplateElement.decorate = function(template){};
+
+/**
+ * @param {function(function())} cb callback
+ */
+CustomElementRegistry.prototype.polyfillWrapFlushCallback = function(cb){};
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/gen-tsd.json b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/gen-tsd.json
new file mode 100644
index 00000000000..3d3a5e71348
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/gen-tsd.json
@@ -0,0 +1,23 @@
+{
+ "excludeFiles": [
+ "dist/**",
+ "externs/**",
+ "gulpfile.js",
+ "test/**",
+ "util/**",
+ "index.html"
+ ],
+ "removeReferences": [
+ "../shadycss/apply-shim.d.ts",
+ "../shadycss/custom-style-interface.d.ts"
+ ],
+ "addReferences": {
+ "lib/utils/boot.d.ts": [
+ "extra-types.d.ts"
+ ]
+ },
+ "renameTypes": {
+ "Polymer_PropertyEffects": "Polymer.PropertyEffects",
+ "Element": "_Element"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/gulpfile.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/gulpfile.js
new file mode 100644
index 00000000000..dfc982e9684
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/gulpfile.js
@@ -0,0 +1,287 @@
+/**
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+/* eslint-env node */
+'use strict';
+
+const gulp = require('gulp');
+const gulpif = require('gulp-if');
+const runseq = require('run-sequence');
+const del = require('del');
+const eslint = require('gulp-eslint');
+const fs = require('fs-extra');
+const path = require('path');
+const mergeStream = require('merge-stream');
+const babel = require('gulp-babel');
+const size = require('gulp-size');
+const lazypipe = require('lazypipe');
+const closure = require('google-closure-compiler').gulp();
+const minimalDocument = require('./util/minimalDocument.js');
+const dom5 = require('dom5/lib/index-next');
+const parse5 = require('parse5');
+const replace = require('gulp-replace');
+
+const DIST_DIR = 'dist';
+const BUNDLED_DIR = path.join(DIST_DIR, 'bundled');
+const COMPILED_DIR = path.join(DIST_DIR, 'compiled');
+const POLYMER_LEGACY = 'polymer.html';
+const POLYMER_ELEMENT = 'polymer-element.html';
+
+const {PolymerProject, HtmlSplitter} = require('polymer-build');
+
+const {Transform} = require('stream');
+
+class BackfillStream extends Transform {
+ constructor(fileList) {
+ super({objectMode: true});
+ this.fileList = fileList;
+ }
+ _transform(file, enc, cb) {
+ if (this.fileList) {
+ const origFile = this.fileList.shift();
+ // console.log(`rename ${file.path} -> ${origFile.path}`)
+ file.path = origFile.path;
+ }
+ cb(null, file);
+ }
+ _flush(cb) {
+ if (this.fileList && this.fileList.length > 0) {
+ this.fileList.forEach((oldFile) => {
+ // console.log(`pumping fake file ${oldFile.path}`)
+ let newFile = oldFile.clone({deep: true, contents: false});
+ newFile.contents = new Buffer('');
+ this.push(newFile);
+ });
+ }
+ cb();
+ }
+}
+
+let CLOSURE_LINT_ONLY = false;
+
+let firstImportFinder = dom5.predicates.AND(
+ dom5.predicates.hasTagName('link'), dom5.predicates.hasAttrValue('rel', 'import')
+);
+
+const header =
+`/**
+ * @fileoverview Generated typings for Polymer mixins
+ * @externs
+ *
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+/* eslint-disable */
+`;
+
+class AddClosureTypeImport extends Transform {
+ constructor(entryFileName, typeFileName) {
+ super({objectMode: true});
+ this.target = path.resolve(entryFileName);
+ this.importPath = path.resolve(typeFileName);
+ }
+ _transform(file, enc, cb) {
+ if (file.path === this.target) {
+ let contents = file.contents.toString();
+ let html = parse5.parse(contents, {locationInfo: true});
+ let firstImport = dom5.query(html, firstImportFinder);
+ if (firstImport) {
+ let importPath = path.relative(path.dirname(this.target), this.importPath);
+ let importLink = dom5.constructors.element('link');
+ dom5.setAttribute(importLink, 'rel', 'import');
+ dom5.setAttribute(importLink, 'href', importPath);
+ dom5.insertBefore(firstImport.parentNode, firstImport, importLink);
+ dom5.removeFakeRootElements(html);
+ file.contents = Buffer(parse5.serialize(html));
+ }
+ }
+ cb(null, file);
+ }
+}
+
+gulp.task('clean', () => del([DIST_DIR, 'closure.log']));
+
+gulp.task('generate-externs', gulp.series('clean', async () => {
+ let genClosure = require('@polymer/gen-closure-declarations').generateDeclarations;
+ const declarations = await genClosure();
+ await fs.writeFile('externs/closure-types.js', `${header}${declarations}`);
+}));
+
+gulp.task('generate-typescript', async () => {
+ let genTs = require('@polymer/gen-typescript-declarations').generateDeclarations;
+ await del(['types/**/*.d.ts', '!types/extra-types.d.ts']);
+ const config = await fs.readJson('gen-tsd.json');
+ const files = await genTs('.', config);
+ for (const [filePath, contents] of files) {
+ await fs.outputFile(path.join('types', filePath), contents);
+ }
+});
+
+gulp.task('closure', gulp.series('generate-externs', () => {
+
+ let entry, splitRx, joinRx, addClosureTypes;
+
+ function config(path) {
+ entry = path;
+ joinRx = new RegExp(path.split('/').join('\\/'));
+ splitRx = new RegExp(joinRx.source + '_script_\\d+\\.js$');
+ addClosureTypes = new AddClosureTypeImport(entry, 'externs/polymer-internal-types.html');
+ }
+
+ config('polymer-legacy.js');
+
+ const project = new PolymerProject({
+ shell: `./${entry}`,
+ fragments: [
+ 'node_modules/@webcomponents/shadycss/entrypoints/apply-shim.js',
+ 'node_modules/@webcomponents/shadycss/entrypoints/custom-style-interface.js'
+ ],
+ extraDependencies: [
+ addClosureTypes.importPath,
+ 'externs/polymer-internal-shared-types.js',
+ ]
+ });
+
+ function closureLintLogger(log) {
+ let chalk = require('chalk');
+ // write out log to use with diffing tools later
+ fs.writeFileSync('closure.log', chalk.stripColor(log));
+ console.error(log);
+ process.exit(-1);
+ }
+
+ let closurePluginOptions;
+
+ if (CLOSURE_LINT_ONLY) {
+ closurePluginOptions = {
+ logger: closureLintLogger
+ };
+ }
+
+ const closureStream = closure({
+ compilation_level: 'ADVANCED',
+ language_in: 'ES6_STRICT',
+ language_out: 'ES5_STRICT',
+ warning_level: 'VERBOSE',
+ isolation_mode: 'IIFE',
+ assume_function_wrapper: true,
+ rewrite_polyfills: false,
+ new_type_inf: true,
+ checks_only: CLOSURE_LINT_ONLY,
+ polymer_version: 2,
+ externs: [
+ 'bower_components/shadycss/externs/shadycss-externs.js',
+ 'externs/webcomponents-externs.js',
+ 'externs/closure-types.js',
+ 'externs/polymer-externs.js',
+ ],
+ extra_annotation_name: [
+ 'appliesMixin',
+ 'mixinClass',
+ 'mixinFunction',
+ 'polymer',
+ 'customElement'
+ ]
+ }, closurePluginOptions);
+
+ const closurePipeline = lazypipe()
+ .pipe(() => closureStream)
+ .pipe(() => new BackfillStream(closureStream.fileList_));
+
+ // process source files in the project
+ const sources = project.sources();
+
+ // process dependencies
+ const dependencies = project.dependencies();
+
+ // merge the source and dependencies streams to we can analyze the project
+ const mergedFiles = mergeStream(sources, dependencies);
+
+ const splitter = new HtmlSplitter();
+ return mergedFiles
+ .pipe(addClosureTypes)
+ .pipe(project.bundler())
+ .pipe(splitter.split())
+ .pipe(gulpif(splitRx, closurePipeline()))
+ .pipe(splitter.rejoin())
+ .pipe(gulpif(joinRx, minimalDocument()))
+ .pipe(gulpif(joinRx, size({title: 'closure size', gzip: true, showTotal: false, showFiles: true})))
+ .pipe(gulp.dest(COMPILED_DIR));
+}));
+
+gulp.task('lint-closure', (done) => {
+ CLOSURE_LINT_ONLY = true;
+ runseq('closure', done);
+});
+
+gulp.task('estimate-size', gulp.series('clean', () => {
+
+ const babelPresets = {
+ presets: [['minify', {regexpConstructors: false, simplifyComparisons: false}]]
+ };
+
+ const project = new PolymerProject({
+ shell: POLYMER_LEGACY,
+ fragments: [
+ 'node_modules/@webcomponents/shadycss/entrypoints/apply-shim.js',
+ 'node_modules/@webcomponents/shadycss/entrypoints/custom-style-interface.js'
+ ]
+ });
+
+ // process source files in the project
+ const sources = project.sources();
+
+ // process dependencies
+ const dependencies = project.dependencies();
+
+ // merge the source and dependencies streams to we can analyze the project
+ const mergedFiles = mergeStream(sources, dependencies);
+
+ const bundledSplitter = new HtmlSplitter();
+
+ const bundlePipe = lazypipe()
+ .pipe(() => bundledSplitter.split())
+ .pipe(() => gulpif(/\.js$/, babel(babelPresets)))
+ .pipe(() => bundledSplitter.rejoin())
+ .pipe(minimalDocument);
+
+ return mergedFiles
+ .pipe(project.bundler())
+ .pipe(gulpif(/polymer\.html$/, bundlePipe()))
+ .pipe(gulpif(/polymer\.html$/, size({ title: 'bundled size', gzip: true, showTotal: false, showFiles: true })))
+ // write to the bundled folder
+ .pipe(gulp.dest(BUNDLED_DIR));
+}));
+
+gulp.task('lint-eslint', function() {
+ return gulp.src(['lib/**/*.js', 'test/unit/*.{html,js}', 'util/*.js'])
+ .pipe(eslint())
+ .pipe(eslint.format())
+ .pipe(eslint.failAfterError());
+});
+
+gulp.task('lint', (done) => {
+ runseq('lint-eslint', 'lint-closure', done);
+});
+
+gulp.task('update-types', (done) => {
+ runseq('generate-externs', 'generate-typescript', done);
+});
+
+gulp.task('update-version', () => {
+ return gulp.src('lib/utils/boot.js')
+ .pipe(replace(/(window.Polymer.version = )'\d+\.\d+\.\d+'/, `$1'${require('./package.json').version}'`))
+ .pipe(gulp.dest('lib/utils'));
+});
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/img/migration.png b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/img/migration.png
new file mode 100644
index 00000000000..b410b1c266b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/img/migration.png
Binary files differ
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/index.html b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/index.html
new file mode 100644
index 00000000000..bffaf2da893
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/index.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<!--
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../../@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
+ <script type="module" src="../../@polymer/iron-component-page/iron-component-page.js"></script>
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/array-selector.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/array-selector.js
new file mode 100644
index 00000000000..c4926f52b99
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/array-selector.js
@@ -0,0 +1,429 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { PolymerElement } from '../../polymer-element.js';
+
+import { dedupingMixin } from '../utils/mixin.js';
+import { calculateSplices } from '../utils/array-splice.js';
+import { ElementMixin } from '../mixins/element-mixin.js';
+
+/**
+ * Element mixin for recording dynamic associations between item paths in a
+ * master `items` array and a `selected` array such that path changes to the
+ * master array (at the host) element or elsewhere via data-binding) are
+ * correctly propagated to items in the selected array and vice-versa.
+ *
+ * The `items` property accepts an array of user data, and via the
+ * `select(item)` and `deselect(item)` API, updates the `selected` property
+ * which may be bound to other parts of the application, and any changes to
+ * sub-fields of `selected` item(s) will be kept in sync with items in the
+ * `items` array. When `multi` is false, `selected` is a property
+ * representing the last selected item. When `multi` is true, `selected`
+ * is an array of multiply selected items.
+ *
+ * @polymer
+ * @mixinFunction
+ * @appliesMixin ElementMixin
+ * @summary Element mixin for recording dynamic associations between item paths in a
+ * master `items` array and a `selected` array
+ */
+let ArraySelectorMixin = dedupingMixin(superClass => {
+
+ /**
+ * @constructor
+ * @extends {superClass}
+ * @implements {Polymer_ElementMixin}
+ */
+ let elementBase = ElementMixin(superClass);
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_ArraySelectorMixin}
+ * @unrestricted
+ */
+ class ArraySelectorMixin extends elementBase {
+
+ static get properties() {
+
+ return {
+
+ /**
+ * An array containing items from which selection will be made.
+ */
+ items: {
+ type: Array,
+ },
+
+ /**
+ * When `true`, multiple items may be selected at once (in this case,
+ * `selected` is an array of currently selected items). When `false`,
+ * only one item may be selected at a time.
+ */
+ multi: {
+ type: Boolean,
+ value: false,
+ },
+
+ /**
+ * When `multi` is true, this is an array that contains any selected.
+ * When `multi` is false, this is the currently selected item, or `null`
+ * if no item is selected.
+ * @type {?(Object|Array<!Object>)}
+ */
+ selected: {
+ type: Object,
+ notify: true
+ },
+
+ /**
+ * When `multi` is false, this is the currently selected item, or `null`
+ * if no item is selected.
+ * @type {?Object}
+ */
+ selectedItem: {
+ type: Object,
+ notify: true
+ },
+
+ /**
+ * When `true`, calling `select` on an item that is already selected
+ * will deselect the item.
+ */
+ toggle: {
+ type: Boolean,
+ value: false
+ }
+
+ };
+ }
+
+ static get observers() {
+ return ['__updateSelection(multi, items.*)'];
+ }
+
+ constructor() {
+ super();
+ this.__lastItems = null;
+ this.__lastMulti = null;
+ this.__selectedMap = null;
+ }
+
+ __updateSelection(multi, itemsInfo) {
+ let path = itemsInfo.path;
+ if (path == 'items') {
+ // Case 1 - items array changed, so diff against previous array and
+ // deselect any removed items and adjust selected indices
+ let newItems = itemsInfo.base || [];
+ let lastItems = this.__lastItems;
+ let lastMulti = this.__lastMulti;
+ if (multi !== lastMulti) {
+ this.clearSelection();
+ }
+ if (lastItems) {
+ let splices = calculateSplices(newItems, lastItems);
+ this.__applySplices(splices);
+ }
+ this.__lastItems = newItems;
+ this.__lastMulti = multi;
+ } else if (itemsInfo.path == 'items.splices') {
+ // Case 2 - got specific splice information describing the array mutation:
+ // deselect any removed items and adjust selected indices
+ this.__applySplices(itemsInfo.value.indexSplices);
+ } else {
+ // Case 3 - an array element was changed, so deselect the previous
+ // item for that index if it was previously selected
+ let part = path.slice('items.'.length);
+ let idx = parseInt(part, 10);
+ if ((part.indexOf('.') < 0) && part == idx) {
+ this.__deselectChangedIdx(idx);
+ }
+ }
+ }
+
+ __applySplices(splices) {
+ let selected = this.__selectedMap;
+ // Adjust selected indices and mark removals
+ for (let i=0; i<splices.length; i++) {
+ let s = splices[i];
+ selected.forEach((idx, item) => {
+ if (idx < s.index) {
+ // no change
+ } else if (idx >= s.index + s.removed.length) {
+ // adjust index
+ selected.set(item, idx + s.addedCount - s.removed.length);
+ } else {
+ // remove index
+ selected.set(item, -1);
+ }
+ });
+ for (let j=0; j<s.addedCount; j++) {
+ let idx = s.index + j;
+ if (selected.has(this.items[idx])) {
+ selected.set(this.items[idx], idx);
+ }
+ }
+ }
+ // Update linked paths
+ this.__updateLinks();
+ // Remove selected items that were removed from the items array
+ let sidx = 0;
+ selected.forEach((idx, item) => {
+ if (idx < 0) {
+ if (this.multi) {
+ this.splice('selected', sidx, 1);
+ } else {
+ this.selected = this.selectedItem = null;
+ }
+ selected.delete(item);
+ } else {
+ sidx++;
+ }
+ });
+ }
+
+ __updateLinks() {
+ this.__dataLinkedPaths = {};
+ if (this.multi) {
+ let sidx = 0;
+ this.__selectedMap.forEach(idx => {
+ if (idx >= 0) {
+ this.linkPaths('items.' + idx, 'selected.' + sidx++);
+ }
+ });
+ } else {
+ this.__selectedMap.forEach(idx => {
+ this.linkPaths('selected', 'items.' + idx);
+ this.linkPaths('selectedItem', 'items.' + idx);
+ });
+ }
+ }
+
+ /**
+ * Clears the selection state.
+ * @return {void}
+ */
+ clearSelection() {
+ // Unbind previous selection
+ this.__dataLinkedPaths = {};
+ // The selected map stores 3 pieces of information:
+ // key: items array object
+ // value: items array index
+ // order: selected array index
+ this.__selectedMap = new Map();
+ // Initialize selection
+ this.selected = this.multi ? [] : null;
+ this.selectedItem = null;
+ }
+
+ /**
+ * Returns whether the item is currently selected.
+ *
+ * @param {*} item Item from `items` array to test
+ * @return {boolean} Whether the item is selected
+ */
+ isSelected(item) {
+ return this.__selectedMap.has(item);
+ }
+
+ /**
+ * Returns whether the item is currently selected.
+ *
+ * @param {number} idx Index from `items` array to test
+ * @return {boolean} Whether the item is selected
+ */
+ isIndexSelected(idx) {
+ return this.isSelected(this.items[idx]);
+ }
+
+ __deselectChangedIdx(idx) {
+ let sidx = this.__selectedIndexForItemIndex(idx);
+ if (sidx >= 0) {
+ let i = 0;
+ this.__selectedMap.forEach((idx, item) => {
+ if (sidx == i++) {
+ this.deselect(item);
+ }
+ });
+ }
+ }
+
+ __selectedIndexForItemIndex(idx) {
+ let selected = this.__dataLinkedPaths['items.' + idx];
+ if (selected) {
+ return parseInt(selected.slice('selected.'.length), 10);
+ }
+ }
+
+ /**
+ * Deselects the given item if it is already selected.
+ *
+ * @param {*} item Item from `items` array to deselect
+ * @return {void}
+ */
+ deselect(item) {
+ let idx = this.__selectedMap.get(item);
+ if (idx >= 0) {
+ this.__selectedMap.delete(item);
+ let sidx;
+ if (this.multi) {
+ sidx = this.__selectedIndexForItemIndex(idx);
+ }
+ this.__updateLinks();
+ if (this.multi) {
+ this.splice('selected', sidx, 1);
+ } else {
+ this.selected = this.selectedItem = null;
+ }
+ }
+ }
+
+ /**
+ * Deselects the given index if it is already selected.
+ *
+ * @param {number} idx Index from `items` array to deselect
+ * @return {void}
+ */
+ deselectIndex(idx) {
+ this.deselect(this.items[idx]);
+ }
+
+ /**
+ * Selects the given item. When `toggle` is true, this will automatically
+ * deselect the item if already selected.
+ *
+ * @param {*} item Item from `items` array to select
+ * @return {void}
+ */
+ select(item) {
+ this.selectIndex(this.items.indexOf(item));
+ }
+
+ /**
+ * Selects the given index. When `toggle` is true, this will automatically
+ * deselect the item if already selected.
+ *
+ * @param {number} idx Index from `items` array to select
+ * @return {void}
+ */
+ selectIndex(idx) {
+ let item = this.items[idx];
+ if (!this.isSelected(item)) {
+ if (!this.multi) {
+ this.__selectedMap.clear();
+ }
+ this.__selectedMap.set(item, idx);
+ this.__updateLinks();
+ if (this.multi) {
+ this.push('selected', item);
+ } else {
+ this.selected = this.selectedItem = item;
+ }
+ } else if (this.toggle) {
+ this.deselectIndex(idx);
+ }
+ }
+
+ }
+
+ return ArraySelectorMixin;
+
+});
+
+// export mixin
+export { ArraySelectorMixin };
+
+/**
+ * @constructor
+ * @extends {PolymerElement}
+ * @implements {Polymer_ArraySelectorMixin}
+ */
+let baseArraySelector = ArraySelectorMixin(PolymerElement);
+
+/**
+ * Element implementing the `ArraySelector` mixin, which records
+ * dynamic associations between item paths in a master `items` array and a
+ * `selected` array such that path changes to the master array (at the host)
+ * element or elsewhere via data-binding) are correctly propagated to items
+ * in the selected array and vice-versa.
+ *
+ * The `items` property accepts an array of user data, and via the
+ * `select(item)` and `deselect(item)` API, updates the `selected` property
+ * which may be bound to other parts of the application, and any changes to
+ * sub-fields of `selected` item(s) will be kept in sync with items in the
+ * `items` array. When `multi` is false, `selected` is a property
+ * representing the last selected item. When `multi` is true, `selected`
+ * is an array of multiply selected items.
+ *
+ * Example:
+ *
+ * ```js
+ * import {PolymerElement} from '@polymer/polymer';
+ * import '@polymer/polymer/lib/elements/array-selector.js';
+ *
+ * class EmployeeList extends PolymerElement {
+ * static get _template() {
+ * return html`
+ * <div> Employee list: </div>
+ * <dom-repeat id="employeeList" items="{{employees}}">
+ * <template>
+ * <div>First name: <span>{{item.first}}</span></div>
+ * <div>Last name: <span>{{item.last}}</span></div>
+ * <button on-click="toggleSelection">Select</button>
+ * </template>
+ * </dom-repeat>
+ *
+ * <array-selector id="selector"
+ * items="{{employees}}"
+ * selected="{{selected}}"
+ * multi toggle></array-selector>
+ *
+ * <div> Selected employees: </div>
+ * <dom-repeat items="{{selected}}">
+ * <template>
+ * <div>First name: <span>{{item.first}}</span></div>
+ * <div>Last name: <span>{{item.last}}</span></div>
+ * </template>
+ * </dom-repeat>`;
+ * }
+ * static get is() { return 'employee-list'; }
+ * static get properties() {
+ * return {
+ * employees: {
+ * value() {
+ * return [
+ * {first: 'Bob', last: 'Smith'},
+ * {first: 'Sally', last: 'Johnson'},
+ * ...
+ * ];
+ * }
+ * }
+ * };
+ * }
+ * toggleSelection(e) {
+ * const item = this.$.employeeList.itemForElement(e.target);
+ * this.$.selector.select(item);
+ * }
+ * }
+ * ```
+ *
+ * @polymer
+ * @customElement
+ * @extends {baseArraySelector}
+ * @appliesMixin ArraySelectorMixin
+ * @summary Custom element that links paths between an input `items` array and
+ * an output `selected` item or array based on calls to its selection API.
+ */
+class ArraySelector extends baseArraySelector {
+ // Not needed to find template; can be removed once the analyzer
+ // can find the tag name from customElements.define call
+ static get is() { return 'array-selector'; }
+}
+customElements.define(ArraySelector.is, ArraySelector);
+export { ArraySelector };
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/custom-style.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/custom-style.js
new file mode 100644
index 00000000000..c0961eef87c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/custom-style.js
@@ -0,0 +1,108 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '@webcomponents/shadycss/entrypoints/custom-style-interface.js';
+
+import { cssFromModules } from '../utils/style-gather.js';
+
+const attr = 'include';
+
+const CustomStyleInterface = window.ShadyCSS.CustomStyleInterface;
+
+/**
+ * Custom element for defining styles in the main document that can take
+ * advantage of [shady DOM](https://github.com/webcomponents/shadycss) shims
+ * for style encapsulation, custom properties, and custom mixins.
+ *
+ * - Document styles defined in a `<custom-style>` are shimmed to ensure they
+ * do not leak into local DOM when running on browsers without native
+ * Shadow DOM.
+ * - Custom properties can be defined in a `<custom-style>`. Use the `html` selector
+ * to define custom properties that apply to all custom elements.
+ * - Custom mixins can be defined in a `<custom-style>`, if you import the optional
+ * [apply shim](https://github.com/webcomponents/shadycss#about-applyshim)
+ * (`shadycss/apply-shim.html`).
+ *
+ * To use:
+ *
+ * - Import `custom-style.html`.
+ * - Place a `<custom-style>` element in the main document, wrapping an inline `<style>` tag that
+ * contains the CSS rules you want to shim.
+ *
+ * For example:
+ *
+ * ```html
+ * <!-- import apply shim--only required if using mixins -->
+ * <link rel="import" href="bower_components/shadycss/apply-shim.html">
+ * <!-- import custom-style element -->
+ * <link rel="import" href="bower_components/polymer/lib/elements/custom-style.html">
+ *
+ * <custom-style>
+ * <style>
+ * html {
+ * --custom-color: blue;
+ * --custom-mixin: {
+ * font-weight: bold;
+ * color: red;
+ * };
+ * }
+ * </style>
+ * </custom-style>
+ * ```
+ *
+ * @customElement
+ * @extends HTMLElement
+ * @summary Custom element for defining styles in the main document that can
+ * take advantage of Polymer's style scoping and custom properties shims.
+ */
+export class CustomStyle extends HTMLElement {
+ constructor() {
+ super();
+ this._style = null;
+ CustomStyleInterface.addCustomStyle(this);
+ }
+ /**
+ * Returns the light-DOM `<style>` child this element wraps. Upon first
+ * call any style modules referenced via the `include` attribute will be
+ * concatenated to this element's `<style>`.
+ *
+ * @return {HTMLStyleElement} This element's light-DOM `<style>`
+ */
+ getStyle() {
+ if (this._style) {
+ return this._style;
+ }
+ const style = /** @type {HTMLStyleElement} */(this.querySelector('style'));
+ if (!style) {
+ return null;
+ }
+ this._style = style;
+ const include = style.getAttribute(attr);
+ if (include) {
+ style.removeAttribute(attr);
+ style.textContent = cssFromModules(include) + style.textContent;
+ }
+ /*
+ HTML Imports styling the main document are deprecated in Chrome
+ https://crbug.com/523952
+
+ If this element is not in the main document, then it must be in an HTML Import document.
+ In that case, move the custom style to the main document.
+
+ The ordering of `<custom-style>` should stay the same as when loaded by HTML Imports, but there may be odd
+ cases of ordering w.r.t the main document styles.
+ */
+ if (this.ownerDocument !== window.document) {
+ window.document.head.appendChild(this);
+ }
+ return this._style;
+ }
+}
+
+window.customElements.define('custom-style', CustomStyle);
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-bind.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-bind.js
new file mode 100644
index 00000000000..512e01c9733
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-bind.js
@@ -0,0 +1,127 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../utils/boot.js';
+
+import { PropertyEffects } from '../mixins/property-effects.js';
+import { OptionalMutableData } from '../mixins/mutable-data.js';
+import { GestureEventListeners } from '../mixins/gesture-event-listeners.js';
+
+/**
+ * @constructor
+ * @extends {HTMLElement}
+ * @implements {Polymer_PropertyEffects}
+ * @implements {Polymer_OptionalMutableData}
+ * @implements {Polymer_GestureEventListeners}
+ */
+const domBindBase =
+ GestureEventListeners(
+ OptionalMutableData(
+ PropertyEffects(HTMLElement)));
+
+/**
+ * Custom element to allow using Polymer's template features (data binding,
+ * declarative event listeners, etc.) in the main document without defining
+ * a new custom element.
+ *
+ * `<template>` tags utilizing bindings may be wrapped with the `<dom-bind>`
+ * element, which will immediately stamp the wrapped template into the main
+ * document and bind elements to the `dom-bind` element itself as the
+ * binding scope.
+ *
+ * @polymer
+ * @customElement
+ * @appliesMixin PropertyEffects
+ * @appliesMixin OptionalMutableData
+ * @appliesMixin GestureEventListeners
+ * @extends {domBindBase}
+ * @summary Custom element to allow using Polymer's template features (data
+ * binding, declarative event listeners, etc.) in the main document.
+ */
+export class DomBind extends domBindBase {
+
+ static get observedAttributes() { return ['mutable-data']; }
+
+ constructor() {
+ super();
+ this.root = null;
+ this.$ = null;
+ this.__children = null;
+ }
+
+ /** @return {void} */
+ attributeChangedCallback() {
+ // assumes only one observed attribute
+ this.mutableData = true;
+ }
+
+ /** @return {void} */
+ connectedCallback() {
+ this.style.display = 'none';
+ this.render();
+ }
+
+ /** @return {void} */
+ disconnectedCallback() {
+ this.__removeChildren();
+ }
+
+ __insertChildren() {
+ this.parentNode.insertBefore(this.root, this);
+ }
+
+ __removeChildren() {
+ if (this.__children) {
+ for (let i=0; i<this.__children.length; i++) {
+ this.root.appendChild(this.__children[i]);
+ }
+ }
+ }
+
+ /**
+ * Forces the element to render its content. This is typically only
+ * necessary to call if HTMLImports with the async attribute are used.
+ * @return {void}
+ */
+ render() {
+ let template;
+ if (!this.__children) {
+ template = /** @type {HTMLTemplateElement} */(template || this.querySelector('template'));
+ if (!template) {
+ // Wait until childList changes and template should be there by then
+ let observer = new MutationObserver(() => {
+ template = /** @type {HTMLTemplateElement} */(this.querySelector('template'));
+ if (template) {
+ observer.disconnect();
+ this.render();
+ } else {
+ throw new Error('dom-bind requires a <template> child');
+ }
+ });
+ observer.observe(this, {childList: true});
+ return;
+ }
+ this.root = this._stampTemplate(template);
+ this.$ = this.root.$;
+ this.__children = [];
+ for (let n=this.root.firstChild; n; n=n.nextSibling) {
+ this.__children[this.__children.length] = n;
+ }
+ this._enableProperties();
+ }
+ this.__insertChildren();
+ this.dispatchEvent(new CustomEvent('dom-change', {
+ bubbles: true,
+ composed: true
+ }));
+ }
+
+}
+
+customElements.define('dom-bind', DomBind);
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-if.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-if.js
new file mode 100644
index 00000000000..0b95ac568e2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-if.js
@@ -0,0 +1,279 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { PolymerElement } from '../../polymer-element.js';
+
+import { templatize } from '../utils/templatize.js';
+import { Debouncer } from '../utils/debounce.js';
+import { enqueueDebouncer, flush } from '../utils/flush.js';
+import { microTask } from '../utils/async.js';
+import { root as root$0 } from '../utils/path.js';
+
+/**
+ * The `<dom-if>` element will stamp a light-dom `<template>` child when
+ * the `if` property becomes truthy, and the template can use Polymer
+ * data-binding and declarative event features when used in the context of
+ * a Polymer element's template.
+ *
+ * When `if` becomes falsy, the stamped content is hidden but not
+ * removed from dom. When `if` subsequently becomes truthy again, the content
+ * is simply re-shown. This approach is used due to its favorable performance
+ * characteristics: the expense of creating template content is paid only
+ * once and lazily.
+ *
+ * Set the `restamp` property to true to force the stamped content to be
+ * created / destroyed when the `if` condition changes.
+ *
+ * @customElement
+ * @polymer
+ * @extends PolymerElement
+ * @summary Custom element that conditionally stamps and hides or removes
+ * template content based on a boolean flag.
+ */
+export class DomIf extends PolymerElement {
+
+ // Not needed to find template; can be removed once the analyzer
+ // can find the tag name from customElements.define call
+ static get is() { return 'dom-if'; }
+
+ static get template() { return null; }
+
+ static get properties() {
+
+ return {
+
+ /**
+ * Fired whenever DOM is added or removed/hidden by this template (by
+ * default, rendering occurs lazily). To force immediate rendering, call
+ * `render`.
+ *
+ * @event dom-change
+ */
+
+ /**
+ * A boolean indicating whether this template should stamp.
+ */
+ if: {
+ type: Boolean,
+ observer: '__debounceRender'
+ },
+
+ /**
+ * When true, elements will be removed from DOM and discarded when `if`
+ * becomes false and re-created and added back to the DOM when `if`
+ * becomes true. By default, stamped elements will be hidden but left
+ * in the DOM when `if` becomes false, which is generally results
+ * in better performance.
+ */
+ restamp: {
+ type: Boolean,
+ observer: '__debounceRender'
+ }
+
+ };
+
+ }
+
+ constructor() {
+ super();
+ this.__renderDebouncer = null;
+ this.__invalidProps = null;
+ this.__instance = null;
+ this._lastIf = false;
+ this.__ctor = null;
+ }
+
+ __debounceRender() {
+ // Render is async for 2 reasons:
+ // 1. To eliminate dom creation trashing if user code thrashes `if` in the
+ // same turn. This was more common in 1.x where a compound computed
+ // property could result in the result changing multiple times, but is
+ // mitigated to a large extent by batched property processing in 2.x.
+ // 2. To avoid double object propagation when a bag including values bound
+ // to the `if` property as well as one or more hostProps could enqueue
+ // the <dom-if> to flush before the <template>'s host property
+ // forwarding. In that scenario creating an instance would result in
+ // the host props being set once, and then the enqueued changes on the
+ // template would set properties a second time, potentially causing an
+ // object to be set to an instance more than once. Creating the
+ // instance async from flushing data ensures this doesn't happen. If
+ // we wanted a sync option in the future, simply having <dom-if> flush
+ // (or clear) its template's pending host properties before creating
+ // the instance would also avoid the problem.
+ this.__renderDebouncer = Debouncer.debounce(
+ this.__renderDebouncer
+ , microTask
+ , () => this.__render());
+ enqueueDebouncer(this.__renderDebouncer);
+ }
+
+ /**
+ * @return {void}
+ */
+ disconnectedCallback() {
+ super.disconnectedCallback();
+ if (!this.parentNode ||
+ (this.parentNode.nodeType == Node.DOCUMENT_FRAGMENT_NODE &&
+ !this.parentNode.host)) {
+ this.__teardownInstance();
+ }
+ }
+
+ /**
+ * @return {void}
+ */
+ connectedCallback() {
+ super.connectedCallback();
+ this.style.display = 'none';
+ if (this.if) {
+ this.__debounceRender();
+ }
+ }
+
+ /**
+ * Forces the element to render its content. Normally rendering is
+ * asynchronous to a provoking change. This is done for efficiency so
+ * that multiple changes trigger only a single render. The render method
+ * should be called if, for example, template rendering is required to
+ * validate application state.
+ * @return {void}
+ */
+ render() {
+ flush();
+ }
+
+ __render() {
+ if (this.if) {
+ if (!this.__ensureInstance()) {
+ // No template found yet
+ return;
+ }
+ this._showHideChildren();
+ } else if (this.restamp) {
+ this.__teardownInstance();
+ }
+ if (!this.restamp && this.__instance) {
+ this._showHideChildren();
+ }
+ if (this.if != this._lastIf) {
+ this.dispatchEvent(new CustomEvent('dom-change', {
+ bubbles: true,
+ composed: true
+ }));
+ this._lastIf = this.if;
+ }
+ }
+
+ __ensureInstance() {
+ let parentNode = this.parentNode;
+ // Guard against element being detached while render was queued
+ if (parentNode) {
+ if (!this.__ctor) {
+ let template = /** @type {HTMLTemplateElement} */(this.querySelector('template'));
+ if (!template) {
+ // Wait until childList changes and template should be there by then
+ let observer = new MutationObserver(() => {
+ if (this.querySelector('template')) {
+ observer.disconnect();
+ this.__render();
+ } else {
+ throw new Error('dom-if requires a <template> child');
+ }
+ });
+ observer.observe(this, {childList: true});
+ return false;
+ }
+ this.__ctor = templatize(template, this, {
+ // dom-if templatizer instances require `mutable: true`, as
+ // `__syncHostProperties` relies on that behavior to sync objects
+ mutableData: true,
+ /**
+ * @param {string} prop Property to forward
+ * @param {*} value Value of property
+ * @this {this}
+ */
+ forwardHostProp: function(prop, value) {
+ if (this.__instance) {
+ if (this.if) {
+ this.__instance.forwardHostProp(prop, value);
+ } else {
+ // If we have an instance but are squelching host property
+ // forwarding due to if being false, note the invalidated
+ // properties so `__syncHostProperties` can sync them the next
+ // time `if` becomes true
+ this.__invalidProps = this.__invalidProps || Object.create(null);
+ this.__invalidProps[root$0(prop)] = true;
+ }
+ }
+ }
+ });
+ }
+ if (!this.__instance) {
+ this.__instance = new this.__ctor();
+ parentNode.insertBefore(this.__instance.root, this);
+ } else {
+ this.__syncHostProperties();
+ let c$ = this.__instance.children;
+ if (c$ && c$.length) {
+ // Detect case where dom-if was re-attached in new position
+ let lastChild = this.previousSibling;
+ if (lastChild !== c$[c$.length-1]) {
+ for (let i=0, n; (i<c$.length) && (n=c$[i]); i++) {
+ parentNode.insertBefore(n, this);
+ }
+ }
+ }
+ }
+ }
+ return true;
+ }
+
+ __syncHostProperties() {
+ let props = this.__invalidProps;
+ if (props) {
+ for (let prop in props) {
+ this.__instance._setPendingProperty(prop, this.__dataHost[prop]);
+ }
+ this.__invalidProps = null;
+ this.__instance._flushProperties();
+ }
+ }
+
+ __teardownInstance() {
+ if (this.__instance) {
+ let c$ = this.__instance.children;
+ if (c$ && c$.length) {
+ // use first child parent, for case when dom-if may have been detached
+ let parent = c$[0].parentNode;
+ for (let i=0, n; (i<c$.length) && (n=c$[i]); i++) {
+ parent.removeChild(n);
+ }
+ }
+ this.__instance = null;
+ this.__invalidProps = null;
+ }
+ }
+
+ /**
+ * Shows or hides the template instance top level child elements. For
+ * text nodes, `textContent` is removed while "hidden" and replaced when
+ * "shown."
+ * @return {void}
+ * @protected
+ */
+ _showHideChildren() {
+ let hidden = this.__hideTemplateChildren__ || !this.if;
+ if (this.__instance) {
+ this.__instance._showHideChildren(hidden);
+ }
+ }
+
+}
+
+customElements.define(DomIf.is, DomIf);
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-module.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-module.js
new file mode 100644
index 00000000000..ae35fe99bb0
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-module.js
@@ -0,0 +1,137 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../utils/boot.js';
+
+import { resolveUrl, pathFromUrl } from '../utils/resolve-url.js';
+
+let modules = {};
+let lcModules = {};
+function findModule(id) {
+ return modules[id] || lcModules[id.toLowerCase()];
+}
+
+function styleOutsideTemplateCheck(inst) {
+ if (inst.querySelector('style')) {
+ console.warn('dom-module %s has style outside template', inst.id);
+ }
+}
+
+/**
+ * The `dom-module` element registers the dom it contains to the name given
+ * by the module's id attribute. It provides a unified database of dom
+ * accessible via its static `import` API.
+ *
+ * A key use case of `dom-module` is for providing custom element `<template>`s
+ * via HTML imports that are parsed by the native HTML parser, that can be
+ * relocated during a bundling pass and still looked up by `id`.
+ *
+ * Example:
+ *
+ * <dom-module id="foo">
+ * <img src="stuff.png">
+ * </dom-module>
+ *
+ * Then in code in some other location that cannot access the dom-module above
+ *
+ * let img = customElements.get('dom-module').import('foo', 'img');
+ *
+ * @customElement
+ * @extends HTMLElement
+ * @summary Custom element that provides a registry of relocatable DOM content
+ * by `id` that is agnostic to bundling.
+ * @unrestricted
+ */
+export class DomModule extends HTMLElement {
+
+ static get observedAttributes() { return ['id']; }
+
+ /**
+ * Retrieves the element specified by the css `selector` in the module
+ * registered by `id`. For example, this.import('foo', 'img');
+ * @param {string} id The id of the dom-module in which to search.
+ * @param {string=} selector The css selector by which to find the element.
+ * @return {Element} Returns the element which matches `selector` in the
+ * module registered at the specified `id`.
+ */
+ static import(id, selector) {
+ if (id) {
+ let m = findModule(id);
+ if (m && selector) {
+ return m.querySelector(selector);
+ }
+ return m;
+ }
+ return null;
+ }
+
+ /* eslint-disable no-unused-vars */
+ /**
+ * @param {string} name Name of attribute.
+ * @param {?string} old Old value of attribute.
+ * @param {?string} value Current value of attribute.
+ * @param {?string} namespace Attribute namespace.
+ * @return {void}
+ */
+ attributeChangedCallback(name, old, value, namespace) {
+ if (old !== value) {
+ this.register();
+ }
+ }
+ /* eslint-enable no-unused-args */
+
+ /**
+ * The absolute URL of the original location of this `dom-module`.
+ *
+ * This value will differ from this element's `ownerDocument` in the
+ * following ways:
+ * - Takes into account any `assetpath` attribute added during bundling
+ * to indicate the original location relative to the bundled location
+ * - Uses the HTMLImports polyfill's `importForElement` API to ensure
+ * the path is relative to the import document's location since
+ * `ownerDocument` is not currently polyfilled
+ */
+ get assetpath() {
+ // Don't override existing assetpath.
+ if (!this.__assetpath) {
+ // note: assetpath set via an attribute must be relative to this
+ // element's location; accomodate polyfilled HTMLImports
+ const owner = window.HTMLImports && HTMLImports.importForElement ?
+ HTMLImports.importForElement(this) || document : this.ownerDocument;
+ const url = resolveUrl(
+ this.getAttribute('assetpath') || '', owner.baseURI);
+ this.__assetpath = pathFromUrl(url);
+ }
+ return this.__assetpath;
+ }
+
+ /**
+ * Registers the dom-module at a given id. This method should only be called
+ * when a dom-module is imperatively created. For
+ * example, `document.createElement('dom-module').register('foo')`.
+ * @param {string=} id The id at which to register the dom-module.
+ * @return {void}
+ */
+ register(id) {
+ id = id || this.id;
+ if (id) {
+ this.id = id;
+ // store id separate from lowercased id so that
+ // in all cases mixedCase id will stored distinctly
+ // and lowercase version is a fallback
+ modules[id] = this;
+ lcModules[id.toLowerCase()] = this;
+ styleOutsideTemplateCheck(this);
+ }
+ }
+}
+
+DomModule.prototype['modules'] = modules;
+
+customElements.define('dom-module', DomModule);
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-repeat.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-repeat.js
new file mode 100644
index 00000000000..1aa95cc1015
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-repeat.js
@@ -0,0 +1,728 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { PolymerElement } from '../../polymer-element.js';
+
+import { TemplateInstanceBase as TemplateInstanceBase$0, templatize, modelForElement as modelForElement$0 } from '../utils/templatize.js';
+import { Debouncer } from '../utils/debounce.js';
+import { enqueueDebouncer, flush } from '../utils/flush.js';
+import { OptionalMutableData } from '../mixins/mutable-data.js';
+import { matches, translate } from '../utils/path.js';
+import { timeOut, microTask } from '../utils/async.js';
+
+let TemplateInstanceBase = TemplateInstanceBase$0; // eslint-disable-line
+
+/**
+ * @constructor
+ * @implements {Polymer_OptionalMutableData}
+ * @extends {PolymerElement}
+ */
+const domRepeatBase = OptionalMutableData(PolymerElement);
+
+/**
+ * The `<dom-repeat>` element will automatically stamp and binds one instance
+ * of template content to each object in a user-provided array.
+ * `dom-repeat` accepts an `items` property, and one instance of the template
+ * is stamped for each item into the DOM at the location of the `dom-repeat`
+ * element. The `item` property will be set on each instance's binding
+ * scope, thus templates should bind to sub-properties of `item`.
+ *
+ * Example:
+ *
+ * ```html
+ * <dom-module id="employee-list">
+ *
+ * <template>
+ *
+ * <div> Employee list: </div>
+ * <dom-repeat items="{{employees}}">
+ * <template>
+ * <div>First name: <span>{{item.first}}</span></div>
+ * <div>Last name: <span>{{item.last}}</span></div>
+ * </template>
+ * </dom-repeat>
+ *
+ * </template>
+ *
+ * </dom-module>
+ * ```
+ *
+ * With the following custom element definition:
+ *
+ * ```js
+ * class EmployeeList extends PolymerElement {
+ * static get is() { return 'employee-list'; }
+ * static get properties() {
+ * return {
+ * employees: {
+ * value() {
+ * return [
+ * {first: 'Bob', last: 'Smith'},
+ * {first: 'Sally', last: 'Johnson'},
+ * ...
+ * ];
+ * }
+ * }
+ * };
+ * }
+ * }
+ * ```
+ *
+ * Notifications for changes to items sub-properties will be forwarded to template
+ * instances, which will update via the normal structured data notification system.
+ *
+ * Mutations to the `items` array itself should be made using the Array
+ * mutation API's on the PropertyEffects mixin (`push`, `pop`, `splice`,
+ * `shift`, `unshift`), and template instances will be kept in sync with the
+ * data in the array.
+ *
+ * Events caught by event handlers within the `dom-repeat` template will be
+ * decorated with a `model` property, which represents the binding scope for
+ * each template instance. The model should be used to manipulate data on the
+ * instance, for example `event.model.set('item.checked', true);`.
+ *
+ * Alternatively, the model for a template instance for an element stamped by
+ * a `dom-repeat` can be obtained using the `modelForElement` API on the
+ * `dom-repeat` that stamped it, for example
+ * `this.$.domRepeat.modelForElement(event.target).set('item.checked', true);`.
+ * This may be useful for manipulating instance data of event targets obtained
+ * by event handlers on parents of the `dom-repeat` (event delegation).
+ *
+ * A view-specific filter/sort may be applied to each `dom-repeat` by supplying a
+ * `filter` and/or `sort` property. This may be a string that names a function on
+ * the host, or a function may be assigned to the property directly. The functions
+ * should implemented following the standard `Array` filter/sort API.
+ *
+ * In order to re-run the filter or sort functions based on changes to sub-fields
+ * of `items`, the `observe` property may be set as a space-separated list of
+ * `item` sub-fields that should cause a re-filter/sort when modified. If
+ * the filter or sort function depends on properties not contained in `items`,
+ * the user should observe changes to those properties and call `render` to update
+ * the view based on the dependency change.
+ *
+ * For example, for an `dom-repeat` with a filter of the following:
+ *
+ * ```js
+ * isEngineer(item) {
+ * return item.type == 'engineer' || item.manager.type == 'engineer';
+ * }
+ * ```
+ *
+ * Then the `observe` property should be configured as follows:
+ *
+ * ```html
+ * <dom-repeat items="{{employees}}" filter="isEngineer" observe="type manager.type">
+ * ```
+ *
+ * @customElement
+ * @polymer
+ * @extends {domRepeatBase}
+ * @appliesMixin OptionalMutableData
+ * @summary Custom element for stamping instance of a template bound to
+ * items in an array.
+ */
+export class DomRepeat extends domRepeatBase {
+
+ // Not needed to find template; can be removed once the analyzer
+ // can find the tag name from customElements.define call
+ static get is() { return 'dom-repeat'; }
+
+ static get template() { return null; }
+
+ static get properties() {
+
+ /**
+ * Fired whenever DOM is added or removed by this template (by
+ * default, rendering occurs lazily). To force immediate rendering, call
+ * `render`.
+ *
+ * @event dom-change
+ */
+ return {
+
+ /**
+ * An array containing items determining how many instances of the template
+ * to stamp and that that each template instance should bind to.
+ */
+ items: {
+ type: Array
+ },
+
+ /**
+ * The name of the variable to add to the binding scope for the array
+ * element associated with a given template instance.
+ */
+ as: {
+ type: String,
+ value: 'item'
+ },
+
+ /**
+ * The name of the variable to add to the binding scope with the index
+ * of the instance in the sorted and filtered list of rendered items.
+ * Note, for the index in the `this.items` array, use the value of the
+ * `itemsIndexAs` property.
+ */
+ indexAs: {
+ type: String,
+ value: 'index'
+ },
+
+ /**
+ * The name of the variable to add to the binding scope with the index
+ * of the instance in the `this.items` array. Note, for the index of
+ * this instance in the sorted and filtered list of rendered items,
+ * use the value of the `indexAs` property.
+ */
+ itemsIndexAs: {
+ type: String,
+ value: 'itemsIndex'
+ },
+
+ /**
+ * A function that should determine the sort order of the items. This
+ * property should either be provided as a string, indicating a method
+ * name on the element's host, or else be an actual function. The
+ * function should match the sort function passed to `Array.sort`.
+ * Using a sort function has no effect on the underlying `items` array.
+ */
+ sort: {
+ type: Function,
+ observer: '__sortChanged'
+ },
+
+ /**
+ * A function that can be used to filter items out of the view. This
+ * property should either be provided as a string, indicating a method
+ * name on the element's host, or else be an actual function. The
+ * function should match the sort function passed to `Array.filter`.
+ * Using a filter function has no effect on the underlying `items` array.
+ */
+ filter: {
+ type: Function,
+ observer: '__filterChanged'
+ },
+
+ /**
+ * When using a `filter` or `sort` function, the `observe` property
+ * should be set to a space-separated list of the names of item
+ * sub-fields that should trigger a re-sort or re-filter when changed.
+ * These should generally be fields of `item` that the sort or filter
+ * function depends on.
+ */
+ observe: {
+ type: String,
+ observer: '__observeChanged'
+ },
+
+ /**
+ * When using a `filter` or `sort` function, the `delay` property
+ * determines a debounce time in ms after a change to observed item
+ * properties that must pass before the filter or sort is re-run.
+ * This is useful in rate-limiting shuffling of the view when
+ * item changes may be frequent.
+ */
+ delay: Number,
+
+ /**
+ * Count of currently rendered items after `filter` (if any) has been applied.
+ * If "chunking mode" is enabled, `renderedItemCount` is updated each time a
+ * set of template instances is rendered.
+ *
+ */
+ renderedItemCount: {
+ type: Number,
+ notify: true,
+ readOnly: true
+ },
+
+ /**
+ * Defines an initial count of template instances to render after setting
+ * the `items` array, before the next paint, and puts the `dom-repeat`
+ * into "chunking mode". The remaining items will be created and rendered
+ * incrementally at each animation frame therof until all instances have
+ * been rendered.
+ */
+ initialCount: {
+ type: Number,
+ observer: '__initializeChunking'
+ },
+
+ /**
+ * When `initialCount` is used, this property defines a frame rate (in
+ * fps) to target by throttling the number of instances rendered each
+ * frame to not exceed the budget for the target frame rate. The
+ * framerate is effectively the number of `requestAnimationFrame`s that
+ * it tries to allow to actually fire in a given second. It does this
+ * by measuring the time between `rAF`s and continuously adjusting the
+ * number of items created each `rAF` to maintain the target framerate.
+ * Setting this to a higher number allows lower latency and higher
+ * throughput for event handlers and other tasks, but results in a
+ * longer time for the remaining items to complete rendering.
+ */
+ targetFramerate: {
+ type: Number,
+ value: 20
+ },
+
+ _targetFrameTime: {
+ type: Number,
+ computed: '__computeFrameTime(targetFramerate)'
+ }
+
+ };
+
+ }
+
+ static get observers() {
+ return [ '__itemsChanged(items.*)' ];
+ }
+
+ constructor() {
+ super();
+ this.__instances = [];
+ this.__limit = Infinity;
+ this.__pool = [];
+ this.__renderDebouncer = null;
+ this.__itemsIdxToInstIdx = {};
+ this.__chunkCount = null;
+ this.__lastChunkTime = null;
+ this.__sortFn = null;
+ this.__filterFn = null;
+ this.__observePaths = null;
+ this.__ctor = null;
+ this.__isDetached = true;
+ this.template = null;
+ }
+
+ /**
+ * @return {void}
+ */
+ disconnectedCallback() {
+ super.disconnectedCallback();
+ this.__isDetached = true;
+ for (let i=0; i<this.__instances.length; i++) {
+ this.__detachInstance(i);
+ }
+ }
+
+ /**
+ * @return {void}
+ */
+ connectedCallback() {
+ super.connectedCallback();
+ this.style.display = 'none';
+ // only perform attachment if the element was previously detached.
+ if (this.__isDetached) {
+ this.__isDetached = false;
+ let parent = this.parentNode;
+ for (let i=0; i<this.__instances.length; i++) {
+ this.__attachInstance(i, parent);
+ }
+ }
+ }
+
+ __ensureTemplatized() {
+ // Templatizing (generating the instance constructor) needs to wait
+ // until ready, since won't have its template content handed back to
+ // it until then
+ if (!this.__ctor) {
+ let template = this.template = /** @type {HTMLTemplateElement} */(this.querySelector('template'));
+ if (!template) {
+ // // Wait until childList changes and template should be there by then
+ let observer = new MutationObserver(() => {
+ if (this.querySelector('template')) {
+ observer.disconnect();
+ this.__render();
+ } else {
+ throw new Error('dom-repeat requires a <template> child');
+ }
+ });
+ observer.observe(this, {childList: true});
+ return false;
+ }
+ // Template instance props that should be excluded from forwarding
+ let instanceProps = {};
+ instanceProps[this.as] = true;
+ instanceProps[this.indexAs] = true;
+ instanceProps[this.itemsIndexAs] = true;
+ this.__ctor = templatize(template, this, {
+ mutableData: this.mutableData,
+ parentModel: true,
+ instanceProps: instanceProps,
+ /**
+ * @this {this}
+ * @param {string} prop Property to set
+ * @param {*} value Value to set property to
+ */
+ forwardHostProp: function(prop, value) {
+ let i$ = this.__instances;
+ for (let i=0, inst; (i<i$.length) && (inst=i$[i]); i++) {
+ inst.forwardHostProp(prop, value);
+ }
+ },
+ /**
+ * @this {this}
+ * @param {Object} inst Instance to notify
+ * @param {string} prop Property to notify
+ * @param {*} value Value to notify
+ */
+ notifyInstanceProp: function(inst, prop, value) {
+ if (matches(this.as, prop)) {
+ let idx = inst[this.itemsIndexAs];
+ if (prop == this.as) {
+ this.items[idx] = value;
+ }
+ let path = translate(this.as, 'items.' + idx, prop);
+ this.notifyPath(path, value);
+ }
+ }
+ });
+ }
+ return true;
+ }
+
+ __getMethodHost() {
+ // Technically this should be the owner of the outermost template.
+ // In shadow dom, this is always getRootNode().host, but we can
+ // approximate this via cooperation with our dataHost always setting
+ // `_methodHost` as long as there were bindings (or id's) on this
+ // instance causing it to get a dataHost.
+ return this.__dataHost._methodHost || this.__dataHost;
+ }
+
+ __functionFromPropertyValue(functionOrMethodName) {
+ if (typeof functionOrMethodName === 'string') {
+ let methodName = functionOrMethodName;
+ let obj = this.__getMethodHost();
+ return function() { return obj[methodName].apply(obj, arguments); };
+ }
+
+ return functionOrMethodName;
+ }
+
+ __sortChanged(sort) {
+ this.__sortFn = this.__functionFromPropertyValue(sort);
+ if (this.items) { this.__debounceRender(this.__render); }
+ }
+
+ __filterChanged(filter) {
+ this.__filterFn = this.__functionFromPropertyValue(filter);
+ if (this.items) { this.__debounceRender(this.__render); }
+ }
+
+ __computeFrameTime(rate) {
+ return Math.ceil(1000/rate);
+ }
+
+ __initializeChunking() {
+ if (this.initialCount) {
+ this.__limit = this.initialCount;
+ this.__chunkCount = this.initialCount;
+ this.__lastChunkTime = performance.now();
+ }
+ }
+
+ __tryRenderChunk() {
+ // Debounced so that multiple calls through `_render` between animation
+ // frames only queue one new rAF (e.g. array mutation & chunked render)
+ if (this.items && this.__limit < this.items.length) {
+ this.__debounceRender(this.__requestRenderChunk);
+ }
+ }
+
+ __requestRenderChunk() {
+ requestAnimationFrame(()=>this.__renderChunk());
+ }
+
+ __renderChunk() {
+ // Simple auto chunkSize throttling algorithm based on feedback loop:
+ // measure actual time between frames and scale chunk count by ratio
+ // of target/actual frame time
+ let currChunkTime = performance.now();
+ let ratio = this._targetFrameTime / (currChunkTime - this.__lastChunkTime);
+ this.__chunkCount = Math.round(this.__chunkCount * ratio) || 1;
+ this.__limit += this.__chunkCount;
+ this.__lastChunkTime = currChunkTime;
+ this.__debounceRender(this.__render);
+ }
+
+ __observeChanged() {
+ this.__observePaths = this.observe &&
+ this.observe.replace('.*', '.').split(' ');
+ }
+
+ __itemsChanged(change) {
+ if (this.items && !Array.isArray(this.items)) {
+ console.warn('dom-repeat expected array for `items`, found', this.items);
+ }
+ // If path was to an item (e.g. 'items.3' or 'items.3.foo'), forward the
+ // path to that instance synchronously (returns false for non-item paths)
+ if (!this.__handleItemPath(change.path, change.value)) {
+ // Otherwise, the array was reset ('items') or spliced ('items.splices'),
+ // so queue a full refresh
+ this.__initializeChunking();
+ this.__debounceRender(this.__render);
+ }
+ }
+
+ __handleObservedPaths(path) {
+ // Handle cases where path changes should cause a re-sort/filter
+ if (this.__sortFn || this.__filterFn) {
+ if (!path) {
+ // Always re-render if the item itself changed
+ this.__debounceRender(this.__render, this.delay);
+ } else if (this.__observePaths) {
+ // Otherwise, re-render if the path changed matches an observed path
+ let paths = this.__observePaths;
+ for (let i=0; i<paths.length; i++) {
+ if (path.indexOf(paths[i]) === 0) {
+ this.__debounceRender(this.__render, this.delay);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * @param {function(this:DomRepeat)} fn Function to debounce.
+ * @param {number=} delay Delay in ms to debounce by.
+ */
+ __debounceRender(fn, delay = 0) {
+ this.__renderDebouncer = Debouncer.debounce(
+ this.__renderDebouncer
+ , delay > 0 ? timeOut.after(delay) : microTask
+ , fn.bind(this));
+ enqueueDebouncer(this.__renderDebouncer);
+ }
+
+ /**
+ * Forces the element to render its content. Normally rendering is
+ * asynchronous to a provoking change. This is done for efficiency so
+ * that multiple changes trigger only a single render. The render method
+ * should be called if, for example, template rendering is required to
+ * validate application state.
+ * @return {void}
+ */
+ render() {
+ // Queue this repeater, then flush all in order
+ this.__debounceRender(this.__render);
+ flush();
+ }
+
+ __render() {
+ if (!this.__ensureTemplatized()) {
+ // No template found yet
+ return;
+ }
+ this.__applyFullRefresh();
+ // Reset the pool
+ // TODO(kschaaf): Reuse pool across turns and nested templates
+ // Now that objects/arrays are re-evaluated when set, we can safely
+ // reuse pooled instances across turns, however we still need to decide
+ // semantics regarding how long to hold, how many to hold, etc.
+ this.__pool.length = 0;
+ // Set rendered item count
+ this._setRenderedItemCount(this.__instances.length);
+ // Notify users
+ this.dispatchEvent(new CustomEvent('dom-change', {
+ bubbles: true,
+ composed: true
+ }));
+ // Check to see if we need to render more items
+ this.__tryRenderChunk();
+ }
+
+ __applyFullRefresh() {
+ let items = this.items || [];
+ let isntIdxToItemsIdx = new Array(items.length);
+ for (let i=0; i<items.length; i++) {
+ isntIdxToItemsIdx[i] = i;
+ }
+ // Apply user filter
+ if (this.__filterFn) {
+ isntIdxToItemsIdx = isntIdxToItemsIdx.filter((i, idx, array) =>
+ this.__filterFn(items[i], idx, array));
+ }
+ // Apply user sort
+ if (this.__sortFn) {
+ isntIdxToItemsIdx.sort((a, b) => this.__sortFn(items[a], items[b]));
+ }
+ // items->inst map kept for item path forwarding
+ const itemsIdxToInstIdx = this.__itemsIdxToInstIdx = {};
+ let instIdx = 0;
+ // Generate instances and assign items
+ const limit = Math.min(isntIdxToItemsIdx.length, this.__limit);
+ for (; instIdx<limit; instIdx++) {
+ let inst = this.__instances[instIdx];
+ let itemIdx = isntIdxToItemsIdx[instIdx];
+ let item = items[itemIdx];
+ itemsIdxToInstIdx[itemIdx] = instIdx;
+ if (inst) {
+ inst._setPendingProperty(this.as, item);
+ inst._setPendingProperty(this.indexAs, instIdx);
+ inst._setPendingProperty(this.itemsIndexAs, itemIdx);
+ inst._flushProperties();
+ } else {
+ this.__insertInstance(item, instIdx, itemIdx);
+ }
+ }
+ // Remove any extra instances from previous state
+ for (let i=this.__instances.length-1; i>=instIdx; i--) {
+ this.__detachAndRemoveInstance(i);
+ }
+ }
+
+ __detachInstance(idx) {
+ let inst = this.__instances[idx];
+ for (let i=0; i<inst.children.length; i++) {
+ let el = inst.children[i];
+ inst.root.appendChild(el);
+ }
+ return inst;
+ }
+
+ __attachInstance(idx, parent) {
+ let inst = this.__instances[idx];
+ parent.insertBefore(inst.root, this);
+ }
+
+ __detachAndRemoveInstance(idx) {
+ let inst = this.__detachInstance(idx);
+ if (inst) {
+ this.__pool.push(inst);
+ }
+ this.__instances.splice(idx, 1);
+ }
+
+ __stampInstance(item, instIdx, itemIdx) {
+ let model = {};
+ model[this.as] = item;
+ model[this.indexAs] = instIdx;
+ model[this.itemsIndexAs] = itemIdx;
+ return new this.__ctor(model);
+ }
+
+ __insertInstance(item, instIdx, itemIdx) {
+ let inst = this.__pool.pop();
+ if (inst) {
+ // TODO(kschaaf): If the pool is shared across turns, hostProps
+ // need to be re-set to reused instances in addition to item
+ inst._setPendingProperty(this.as, item);
+ inst._setPendingProperty(this.indexAs, instIdx);
+ inst._setPendingProperty(this.itemsIndexAs, itemIdx);
+ inst._flushProperties();
+ } else {
+ inst = this.__stampInstance(item, instIdx, itemIdx);
+ }
+ let beforeRow = this.__instances[instIdx + 1];
+ let beforeNode = beforeRow ? beforeRow.children[0] : this;
+ this.parentNode.insertBefore(inst.root, beforeNode);
+ this.__instances[instIdx] = inst;
+ return inst;
+ }
+
+ // Implements extension point from Templatize mixin
+ /**
+ * Shows or hides the template instance top level child elements. For
+ * text nodes, `textContent` is removed while "hidden" and replaced when
+ * "shown."
+ * @param {boolean} hidden Set to true to hide the children;
+ * set to false to show them.
+ * @return {void}
+ * @protected
+ */
+ _showHideChildren(hidden) {
+ for (let i=0; i<this.__instances.length; i++) {
+ this.__instances[i]._showHideChildren(hidden);
+ }
+ }
+
+ // Called as a side effect of a host items.<key>.<path> path change,
+ // responsible for notifying item.<path> changes to inst for key
+ __handleItemPath(path, value) {
+ let itemsPath = path.slice(6); // 'items.'.length == 6
+ let dot = itemsPath.indexOf('.');
+ let itemsIdx = dot < 0 ? itemsPath : itemsPath.substring(0, dot);
+ // If path was index into array...
+ if (itemsIdx == parseInt(itemsIdx, 10)) {
+ let itemSubPath = dot < 0 ? '' : itemsPath.substring(dot+1);
+ // If the path is observed, it will trigger a full refresh
+ this.__handleObservedPaths(itemSubPath);
+ // Note, even if a rull refresh is triggered, always do the path
+ // notification because unless mutableData is used for dom-repeat
+ // and all elements in the instance subtree, a full refresh may
+ // not trigger the proper update.
+ let instIdx = this.__itemsIdxToInstIdx[itemsIdx];
+ let inst = this.__instances[instIdx];
+ if (inst) {
+ let itemPath = this.as + (itemSubPath ? '.' + itemSubPath : '');
+ // This is effectively `notifyPath`, but avoids some of the overhead
+ // of the public API
+ inst._setPendingPropertyOrPath(itemPath, value, false, true);
+ inst._flushProperties();
+ }
+ return true;
+ }
+ }
+
+ /**
+ * Returns the item associated with a given element stamped by
+ * this `dom-repeat`.
+ *
+ * Note, to modify sub-properties of the item,
+ * `modelForElement(el).set('item.<sub-prop>', value)`
+ * should be used.
+ *
+ * @param {!HTMLElement} el Element for which to return the item.
+ * @return {*} Item associated with the element.
+ */
+ itemForElement(el) {
+ let instance = this.modelForElement(el);
+ return instance && instance[this.as];
+ }
+
+ /**
+ * Returns the inst index for a given element stamped by this `dom-repeat`.
+ * If `sort` is provided, the index will reflect the sorted order (rather
+ * than the original array order).
+ *
+ * @param {!HTMLElement} el Element for which to return the index.
+ * @return {?number} Row index associated with the element (note this may
+ * not correspond to the array index if a user `sort` is applied).
+ */
+ indexForElement(el) {
+ let instance = this.modelForElement(el);
+ return instance && instance[this.indexAs];
+ }
+
+ /**
+ * Returns the template "model" associated with a given element, which
+ * serves as the binding scope for the template instance the element is
+ * contained in. A template model
+ * should be used to manipulate data associated with this template instance.
+ *
+ * Example:
+ *
+ * let model = modelForElement(el);
+ * if (model.index < 10) {
+ * model.set('item.checked', true);
+ * }
+ *
+ * @param {!HTMLElement} el Element for which to return a template model.
+ * @return {TemplateInstanceBase} Model representing the binding scope for
+ * the element.
+ */
+ modelForElement(el) {
+ return modelForElement$0(this.template, el);
+ }
+
+}
+
+customElements.define(DomRepeat.is, DomRepeat);
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/class.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/class.js
new file mode 100644
index 00000000000..e9ebc474d2a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/class.js
@@ -0,0 +1,366 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { LegacyElementMixin } from './legacy-element-mixin.js';
+
+import { DomModule } from '../elements/dom-module.js';
+
+let metaProps = {
+ attached: true,
+ detached: true,
+ ready: true,
+ created: true,
+ beforeRegister: true,
+ registered: true,
+ attributeChanged: true,
+ // meta objects
+ behaviors: true
+};
+
+/**
+ * Applies a "legacy" behavior or array of behaviors to the provided class.
+ *
+ * Note: this method will automatically also apply the `LegacyElementMixin`
+ * to ensure that any legacy behaviors can rely on legacy Polymer API on
+ * the underlying element.
+ *
+ * @function
+ * @template T
+ * @param {!Object|!Array<!Object>} behaviors Behavior object or array of behaviors.
+ * @param {function(new:T)} klass Element class.
+ * @return {function(new:T)} Returns a new Element class extended by the
+ * passed in `behaviors` and also by `LegacyElementMixin`.
+ * @suppress {invalidCasts, checkTypes}
+ */
+export function mixinBehaviors(behaviors, klass) {
+ if (!behaviors) {
+ klass = /** @type {HTMLElement} */(klass); // eslint-disable-line no-self-assign
+ return klass;
+ }
+ // NOTE: ensure the behavior is extending a class with
+ // legacy element api. This is necessary since behaviors expect to be able
+ // to access 1.x legacy api.
+ klass = LegacyElementMixin(klass);
+ if (!Array.isArray(behaviors)) {
+ behaviors = [behaviors];
+ }
+ let superBehaviors = klass.prototype.behaviors;
+ // get flattened, deduped list of behaviors *not* already on super class
+ behaviors = flattenBehaviors(behaviors, null, superBehaviors);
+ // mixin new behaviors
+ klass = _mixinBehaviors(behaviors, klass);
+ if (superBehaviors) {
+ behaviors = superBehaviors.concat(behaviors);
+ }
+ // Set behaviors on prototype for BC...
+ klass.prototype.behaviors = behaviors;
+ return klass;
+}
+
+// NOTE:
+// 1.x
+// Behaviors were mixed in *in reverse order* and de-duped on the fly.
+// The rule was that behavior properties were copied onto the element
+// prototype if and only if the property did not already exist.
+// Given: Polymer{ behaviors: [A, B, C, A, B]}, property copy order was:
+// (1), B, (2), A, (3) C. This means prototype properties win over
+// B properties win over A win over C. This mirrors what would happen
+// with inheritance if element extended B extended A extended C.
+//
+// Again given, Polymer{ behaviors: [A, B, C, A, B]}, the resulting
+// `behaviors` array was [C, A, B].
+// Behavior lifecycle methods were called in behavior array order
+// followed by the element, e.g. (1) C.created, (2) A.created,
+// (3) B.created, (4) element.created. There was no support for
+// super, and "super-behavior" methods were callable only by name).
+//
+// 2.x
+// Behaviors are made into proper mixins which live in the
+// element's prototype chain. Behaviors are placed in the element prototype
+// eldest to youngest and de-duped youngest to oldest:
+// So, first [A, B, C, A, B] becomes [C, A, B] then,
+// the element prototype becomes (oldest) (1) PolymerElement, (2) class(C),
+// (3) class(A), (4) class(B), (5) class(Polymer({...})).
+// Result:
+// This means element properties win over B properties win over A win
+// over C. (same as 1.x)
+// If lifecycle is called (super then me), order is
+// (1) C.created, (2) A.created, (3) B.created, (4) element.created
+// (again same as 1.x)
+function _mixinBehaviors(behaviors, klass) {
+ for (let i=0; i<behaviors.length; i++) {
+ let b = behaviors[i];
+ if (b) {
+ klass = Array.isArray(b) ? _mixinBehaviors(b, klass) :
+ GenerateClassFromInfo(b, klass);
+ }
+ }
+ return klass;
+}
+
+/**
+ * @param {Array} behaviors List of behaviors to flatten.
+ * @param {Array=} list Target list to flatten behaviors into.
+ * @param {Array=} exclude List of behaviors to exclude from the list.
+ * @return {!Array} Returns the list of flattened behaviors.
+ */
+function flattenBehaviors(behaviors, list, exclude) {
+ list = list || [];
+ for (let i=behaviors.length-1; i >= 0; i--) {
+ let b = behaviors[i];
+ if (b) {
+ if (Array.isArray(b)) {
+ flattenBehaviors(b, list);
+ } else {
+ // dedup
+ if (list.indexOf(b) < 0 && (!exclude || exclude.indexOf(b) < 0)) {
+ list.unshift(b);
+ }
+ }
+ } else {
+ console.warn('behavior is null, check for missing or 404 import');
+ }
+ }
+ return list;
+}
+
+/**
+ * @param {!PolymerInit} info Polymer info object
+ * @param {function(new:HTMLElement)} Base base class to extend with info object
+ * @return {function(new:HTMLElement)} Generated class
+ * @suppress {checkTypes}
+ * @private
+ */
+function GenerateClassFromInfo(info, Base) {
+
+ class PolymerGenerated extends Base {
+
+ static get properties() {
+ return info.properties;
+ }
+
+ static get observers() {
+ return info.observers;
+ }
+
+ /**
+ * @return {HTMLTemplateElement} template for this class
+ */
+ static get template() {
+ // get template first from any imperative set in `info._template`
+ return info._template ||
+ // next look in dom-module associated with this element's is.
+ DomModule && DomModule.import(this.is, 'template') ||
+ // next look for superclass template (note: use superclass symbol
+ // to ensure correct `this.is`)
+ Base.template ||
+ // finally fall back to `_template` in element's prototype.
+ this.prototype._template ||
+ null;
+ }
+
+ /**
+ * @return {void}
+ */
+ created() {
+ super.created();
+ if (info.created) {
+ info.created.call(this);
+ }
+ }
+
+ /**
+ * @return {void}
+ */
+ _registered() {
+ super._registered();
+ /* NOTE: `beforeRegister` is called here for bc, but the behavior
+ is different than in 1.x. In 1.0, the method was called *after*
+ mixing prototypes together but *before* processing of meta-objects.
+ However, dynamic effects can still be set here and can be done either
+ in `beforeRegister` or `registered`. It is no longer possible to set
+ `is` in `beforeRegister` as you could in 1.x.
+ */
+ if (info.beforeRegister) {
+ info.beforeRegister.call(Object.getPrototypeOf(this));
+ }
+ if (info.registered) {
+ info.registered.call(Object.getPrototypeOf(this));
+ }
+ }
+
+ /**
+ * @return {void}
+ */
+ _applyListeners() {
+ super._applyListeners();
+ if (info.listeners) {
+ for (let l in info.listeners) {
+ this._addMethodEventListenerToNode(this, l, info.listeners[l]);
+ }
+ }
+ }
+
+ // note: exception to "super then me" rule;
+ // do work before calling super so that super attributes
+ // only apply if not already set.
+ /**
+ * @return {void}
+ */
+ _ensureAttributes() {
+ if (info.hostAttributes) {
+ for (let a in info.hostAttributes) {
+ this._ensureAttribute(a, info.hostAttributes[a]);
+ }
+ }
+ super._ensureAttributes();
+ }
+
+ /**
+ * @return {void}
+ */
+ ready() {
+ super.ready();
+ if (info.ready) {
+ info.ready.call(this);
+ }
+ }
+
+ /**
+ * @return {void}
+ */
+ attached() {
+ super.attached();
+ if (info.attached) {
+ info.attached.call(this);
+ }
+ }
+
+ /**
+ * @return {void}
+ */
+ detached() {
+ super.detached();
+ if (info.detached) {
+ info.detached.call(this);
+ }
+ }
+
+ /**
+ * Implements native Custom Elements `attributeChangedCallback` to
+ * set an attribute value to a property via `_attributeToProperty`.
+ *
+ * @param {string} name Name of attribute that changed
+ * @param {?string} old Old attribute value
+ * @param {?string} value New attribute value
+ * @return {void}
+ */
+ attributeChanged(name, old, value) {
+ super.attributeChanged(name, old, value);
+ if (info.attributeChanged) {
+ info.attributeChanged.call(this, name, old, value);
+ }
+ }
+ }
+
+ PolymerGenerated.generatedFrom = info;
+
+ for (let p in info) {
+ // NOTE: cannot copy `metaProps` methods onto prototype at least because
+ // `super.ready` must be called and is not included in the user fn.
+ if (!(p in metaProps)) {
+ let pd = Object.getOwnPropertyDescriptor(info, p);
+ if (pd) {
+ Object.defineProperty(PolymerGenerated.prototype, p, pd);
+ }
+ }
+ }
+
+ return PolymerGenerated;
+}
+
+/**
+ * Generates a class that extends `LegacyElement` based on the
+ * provided info object. Metadata objects on the `info` object
+ * (`properties`, `observers`, `listeners`, `behaviors`, `is`) are used
+ * for Polymer's meta-programming systems, and any functions are copied
+ * to the generated class.
+ *
+ * Valid "metadata" values are as follows:
+ *
+ * `is`: String providing the tag name to register the element under. In
+ * addition, if a `dom-module` with the same id exists, the first template
+ * in that `dom-module` will be stamped into the shadow root of this element,
+ * with support for declarative event listeners (`on-...`), Polymer data
+ * bindings (`[[...]]` and `{{...}}`), and id-based node finding into
+ * `this.$`.
+ *
+ * `properties`: Object describing property-related metadata used by Polymer
+ * features (key: property names, value: object containing property metadata).
+ * Valid keys in per-property metadata include:
+ * - `type` (String|Number|Object|Array|...): Used by
+ * `attributeChangedCallback` to determine how string-based attributes
+ * are deserialized to JavaScript property values.
+ * - `notify` (boolean): Causes a change in the property to fire a
+ * non-bubbling event called `<property>-changed`. Elements that have
+ * enabled two-way binding to the property use this event to observe changes.
+ * - `readOnly` (boolean): Creates a getter for the property, but no setter.
+ * To set a read-only property, use the private setter method
+ * `_setProperty(property, value)`.
+ * - `observer` (string): Observer method name that will be called when
+ * the property changes. The arguments of the method are
+ * `(value, previousValue)`.
+ * - `computed` (string): String describing method and dependent properties
+ * for computing the value of this property (e.g. `'computeFoo(bar, zot)'`).
+ * Computed properties are read-only by default and can only be changed
+ * via the return value of the computing method.
+ *
+ * `observers`: Array of strings describing multi-property observer methods
+ * and their dependent properties (e.g. `'observeABC(a, b, c)'`).
+ *
+ * `listeners`: Object describing event listeners to be added to each
+ * instance of this element (key: event name, value: method name).
+ *
+ * `behaviors`: Array of additional `info` objects containing metadata
+ * and callbacks in the same format as the `info` object here which are
+ * merged into this element.
+ *
+ * `hostAttributes`: Object listing attributes to be applied to the host
+ * once created (key: attribute name, value: attribute value). Values
+ * are serialized based on the type of the value. Host attributes should
+ * generally be limited to attributes such as `tabIndex` and `aria-...`.
+ * Attributes in `hostAttributes` are only applied if a user-supplied
+ * attribute is not already present (attributes in markup override
+ * `hostAttributes`).
+ *
+ * In addition, the following Polymer-specific callbacks may be provided:
+ * - `registered`: called after first instance of this element,
+ * - `created`: called during `constructor`
+ * - `attached`: called during `connectedCallback`
+ * - `detached`: called during `disconnectedCallback`
+ * - `ready`: called before first `attached`, after all properties of
+ * this element have been propagated to its template and all observers
+ * have run
+ *
+ * @param {!PolymerInit} info Object containing Polymer metadata and functions
+ * to become class methods.
+ * @return {function(new:HTMLElement)} Generated class
+ */
+export const Class = function(info) {
+ if (!info) {
+ console.warn(`Polymer's Class function requires \`info\` argument`);
+ }
+ let klass = GenerateClassFromInfo(info, info.behaviors ?
+ // note: mixinBehaviors ensures `LegacyElementMixin`.
+ mixinBehaviors(info.behaviors, HTMLElement) :
+ LegacyElementMixin(HTMLElement));
+ // decorate klass with registration info
+ klass.is = info.is;
+ return klass;
+};
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/legacy-element-mixin.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/legacy-element-mixin.js
new file mode 100644
index 00000000000..152508799c5
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/legacy-element-mixin.js
@@ -0,0 +1,987 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '@webcomponents/shadycss/entrypoints/apply-shim.js';
+
+import { ElementMixin } from '../mixins/element-mixin.js';
+import { GestureEventListeners } from '../mixins/gesture-event-listeners.js';
+import { DirMixin } from '../mixins/dir-mixin.js';
+import { dedupingMixin } from '../utils/mixin.js';
+import '../utils/render-status.js';
+import '../utils/unresolved.js';
+import { dom as dom$0, matchesSelector } from './polymer.dom.js';
+import { setTouchAction } from '../utils/gestures.js';
+import { Debouncer } from '../utils/debounce.js';
+import { timeOut, microTask } from '../utils/async.js';
+import { get as get$0 } from '../utils/path.js';
+
+let styleInterface = window.ShadyCSS;
+
+/**
+ * Element class mixin that provides Polymer's "legacy" API intended to be
+ * backward-compatible to the greatest extent possible with the API
+ * found on the Polymer 1.x `Polymer.Base` prototype applied to all elements
+ * defined using the `Polymer({...})` function.
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin Polymer.ElementMixin
+ * @appliesMixin Polymer.GestureEventListeners
+ * @property isAttached {boolean} Set to `true` in this element's
+ * `connectedCallback` and `false` in `disconnectedCallback`
+ * @summary Element class mixin that provides Polymer's "legacy" API
+ */
+export const LegacyElementMixin = dedupingMixin((base) => {
+
+ /**
+ * @constructor
+ * @extends {base}
+ * @implements {Polymer_ElementMixin}
+ * @implements {Polymer_GestureEventListeners}
+ * @implements {Polymer_DirMixin}
+ */
+ const legacyElementBase = DirMixin(GestureEventListeners(ElementMixin(base)));
+
+ /**
+ * Map of simple names to touch action names
+ * @dict
+ */
+ const DIRECTION_MAP = {
+ 'x': 'pan-x',
+ 'y': 'pan-y',
+ 'none': 'none',
+ 'all': 'auto'
+ };
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @extends {legacyElementBase}
+ * @implements {Polymer_LegacyElementMixin}
+ * @unrestricted
+ */
+ class LegacyElement extends legacyElementBase {
+
+ constructor() {
+ super();
+ /** @type {boolean} */
+ this.isAttached;
+ /** @type {WeakMap<!Element, !Object<string, !Function>>} */
+ this.__boundListeners;
+ /** @type {Object<string, Function>} */
+ this._debouncers;
+ // Ensure listeners are applied immediately so that they are
+ // added before declarative event listeners. This allows an element to
+ // decorate itself via an event prior to any declarative listeners
+ // seeing the event. Note, this ensures compatibility with 1.x ordering.
+ this._applyListeners();
+ }
+
+ /**
+ * Forwards `importMeta` from the prototype (i.e. from the info object
+ * passed to `Polymer({...})`) to the static API.
+ *
+ * @return {!Object} The `import.meta` object set on the prototype
+ * @suppress {missingProperties} `this` is always in the instance in
+ * closure for some reason even in a static method, rather than the class
+ */
+ static get importMeta() {
+ return this.prototype.importMeta;
+ }
+
+ /**
+ * Legacy callback called during the `constructor`, for overriding
+ * by the user.
+ * @return {void}
+ */
+ created() {}
+
+ /**
+ * Provides an implementation of `connectedCallback`
+ * which adds Polymer legacy API's `attached` method.
+ * @return {void}
+ * @override
+ */
+ connectedCallback() {
+ super.connectedCallback();
+ this.isAttached = true;
+ this.attached();
+ }
+
+ /**
+ * Legacy callback called during `connectedCallback`, for overriding
+ * by the user.
+ * @return {void}
+ */
+ attached() {}
+
+ /**
+ * Provides an implementation of `disconnectedCallback`
+ * which adds Polymer legacy API's `detached` method.
+ * @return {void}
+ * @override
+ */
+ disconnectedCallback() {
+ super.disconnectedCallback();
+ this.isAttached = false;
+ this.detached();
+ }
+
+ /**
+ * Legacy callback called during `disconnectedCallback`, for overriding
+ * by the user.
+ * @return {void}
+ */
+ detached() {}
+
+ /**
+ * Provides an override implementation of `attributeChangedCallback`
+ * which adds the Polymer legacy API's `attributeChanged` method.
+ * @param {string} name Name of attribute.
+ * @param {?string} old Old value of attribute.
+ * @param {?string} value Current value of attribute.
+ * @param {?string} namespace Attribute namespace.
+ * @return {void}
+ * @override
+ */
+ attributeChangedCallback(name, old, value, namespace) {
+ if (old !== value) {
+ super.attributeChangedCallback(name, old, value, namespace);
+ this.attributeChanged(name, old, value);
+ }
+ }
+
+ /**
+ * Legacy callback called during `attributeChangedChallback`, for overriding
+ * by the user.
+ * @param {string} name Name of attribute.
+ * @param {?string} old Old value of attribute.
+ * @param {?string} value Current value of attribute.
+ * @return {void}
+ */
+ attributeChanged(name, old, value) {} // eslint-disable-line no-unused-vars
+
+ /**
+ * Overrides the default `Polymer.PropertyEffects` implementation to
+ * add support for class initialization via the `_registered` callback.
+ * This is called only when the first instance of the element is created.
+ *
+ * @return {void}
+ * @override
+ * @suppress {invalidCasts}
+ */
+ _initializeProperties() {
+ let proto = Object.getPrototypeOf(this);
+ if (!proto.hasOwnProperty('__hasRegisterFinished')) {
+ proto.__hasRegisterFinished = true;
+ this._registered();
+ }
+ super._initializeProperties();
+ this.root = /** @type {HTMLElement} */(this);
+ this.created();
+ }
+
+ /**
+ * Called automatically when an element is initializing.
+ * Users may override this method to perform class registration time
+ * work. The implementation should ensure the work is performed
+ * only once for the class.
+ * @protected
+ * @return {void}
+ */
+ _registered() {}
+
+ /**
+ * Overrides the default `Polymer.PropertyEffects` implementation to
+ * add support for installing `hostAttributes` and `listeners`.
+ *
+ * @return {void}
+ * @override
+ */
+ ready() {
+ this._ensureAttributes();
+ super.ready();
+ }
+
+ /**
+ * Ensures an element has required attributes. Called when the element
+ * is being readied via `ready`. Users should override to set the
+ * element's required attributes. The implementation should be sure
+ * to check and not override existing attributes added by
+ * the user of the element. Typically, setting attributes should be left
+ * to the element user and not done here; reasonable exceptions include
+ * setting aria roles and focusability.
+ * @protected
+ * @return {void}
+ */
+ _ensureAttributes() {}
+
+ /**
+ * Adds element event listeners. Called when the element
+ * is being readied via `ready`. Users should override to
+ * add any required element event listeners.
+ * In performance critical elements, the work done here should be kept
+ * to a minimum since it is done before the element is rendered. In
+ * these elements, consider adding listeners asynchronously so as not to
+ * block render.
+ * @protected
+ * @return {void}
+ */
+ _applyListeners() {}
+
+ /**
+ * Converts a typed JavaScript value to a string.
+ *
+ * Note this method is provided as backward-compatible legacy API
+ * only. It is not directly called by any Polymer features. To customize
+ * how properties are serialized to attributes for attribute bindings and
+ * `reflectToAttribute: true` properties as well as this method, override
+ * the `_serializeValue` method provided by `Polymer.PropertyAccessors`.
+ *
+ * @param {*} value Value to deserialize
+ * @return {string | undefined} Serialized value
+ */
+ serialize(value) {
+ return this._serializeValue(value);
+ }
+
+ /**
+ * Converts a string to a typed JavaScript value.
+ *
+ * Note this method is provided as backward-compatible legacy API
+ * only. It is not directly called by any Polymer features. To customize
+ * how attributes are deserialized to properties for in
+ * `attributeChangedCallback`, override `_deserializeValue` method
+ * provided by `Polymer.PropertyAccessors`.
+ *
+ * @param {string} value String to deserialize
+ * @param {*} type Type to deserialize the string to
+ * @return {*} Returns the deserialized value in the `type` given.
+ */
+ deserialize(value, type) {
+ return this._deserializeValue(value, type);
+ }
+
+ /**
+ * Serializes a property to its associated attribute.
+ *
+ * Note this method is provided as backward-compatible legacy API
+ * only. It is not directly called by any Polymer features.
+ *
+ * @param {string} property Property name to reflect.
+ * @param {string=} attribute Attribute name to reflect.
+ * @param {*=} value Property value to reflect.
+ * @return {void}
+ */
+ reflectPropertyToAttribute(property, attribute, value) {
+ this._propertyToAttribute(property, attribute, value);
+ }
+
+ /**
+ * Sets a typed value to an HTML attribute on a node.
+ *
+ * Note this method is provided as backward-compatible legacy API
+ * only. It is not directly called by any Polymer features.
+ *
+ * @param {*} value Value to serialize.
+ * @param {string} attribute Attribute name to serialize to.
+ * @param {Element} node Element to set attribute to.
+ * @return {void}
+ */
+ serializeValueToAttribute(value, attribute, node) {
+ this._valueToNodeAttribute(/** @type {Element} */ (node || this), value, attribute);
+ }
+
+ /**
+ * Copies own properties (including accessor descriptors) from a source
+ * object to a target object.
+ *
+ * @param {Object} prototype Target object to copy properties to.
+ * @param {Object} api Source object to copy properties from.
+ * @return {Object} prototype object that was passed as first argument.
+ */
+ extend(prototype, api) {
+ if (!(prototype && api)) {
+ return prototype || api;
+ }
+ let n$ = Object.getOwnPropertyNames(api);
+ for (let i=0, n; (i<n$.length) && (n=n$[i]); i++) {
+ let pd = Object.getOwnPropertyDescriptor(api, n);
+ if (pd) {
+ Object.defineProperty(prototype, n, pd);
+ }
+ }
+ return prototype;
+ }
+
+ /**
+ * Copies props from a source object to a target object.
+ *
+ * Note, this method uses a simple `for...in` strategy for enumerating
+ * properties. To ensure only `ownProperties` are copied from source
+ * to target and that accessor implementations are copied, use `extend`.
+ *
+ * @param {!Object} target Target object to copy properties to.
+ * @param {!Object} source Source object to copy properties from.
+ * @return {!Object} Target object that was passed as first argument.
+ */
+ mixin(target, source) {
+ for (let i in source) {
+ target[i] = source[i];
+ }
+ return target;
+ }
+
+ /**
+ * Sets the prototype of an object.
+ *
+ * Note this method is provided as backward-compatible legacy API
+ * only. It is not directly called by any Polymer features.
+ * @param {Object} object The object on which to set the prototype.
+ * @param {Object} prototype The prototype that will be set on the given
+ * `object`.
+ * @return {Object} Returns the given `object` with its prototype set
+ * to the given `prototype` object.
+ */
+ chainObject(object, prototype) {
+ if (object && prototype && object !== prototype) {
+ object.__proto__ = prototype;
+ }
+ return object;
+ }
+
+ /* **** Begin Template **** */
+
+ /**
+ * Calls `importNode` on the `content` of the `template` specified and
+ * returns a document fragment containing the imported content.
+ *
+ * @param {HTMLTemplateElement} template HTML template element to instance.
+ * @return {!DocumentFragment} Document fragment containing the imported
+ * template content.
+ */
+ instanceTemplate(template) {
+ let content = this.constructor._contentForTemplate(template);
+ let dom = /** @type {!DocumentFragment} */
+ (document.importNode(content, true));
+ return dom;
+ }
+
+ /* **** Begin Events **** */
+
+
+
+ /**
+ * Dispatches a custom event with an optional detail value.
+ *
+ * @param {string} type Name of event type.
+ * @param {*=} detail Detail value containing event-specific
+ * payload.
+ * @param {{ bubbles: (boolean|undefined), cancelable: (boolean|undefined), composed: (boolean|undefined) }=}
+ * options Object specifying options. These may include:
+ * `bubbles` (boolean, defaults to `true`),
+ * `cancelable` (boolean, defaults to false), and
+ * `node` on which to fire the event (HTMLElement, defaults to `this`).
+ * @return {!Event} The new event that was fired.
+ */
+ fire(type, detail, options) {
+ options = options || {};
+ detail = (detail === null || detail === undefined) ? {} : detail;
+ let event = new Event(type, {
+ bubbles: options.bubbles === undefined ? true : options.bubbles,
+ cancelable: Boolean(options.cancelable),
+ composed: options.composed === undefined ? true: options.composed
+ });
+ event.detail = detail;
+ let node = options.node || this;
+ node.dispatchEvent(event);
+ return event;
+ }
+
+ /**
+ * Convenience method to add an event listener on a given element,
+ * late bound to a named method on this element.
+ *
+ * @param {Element} node Element to add event listener to.
+ * @param {string} eventName Name of event to listen for.
+ * @param {string} methodName Name of handler method on `this` to call.
+ * @return {void}
+ */
+ listen(node, eventName, methodName) {
+ node = /** @type {!Element} */ (node || this);
+ let hbl = this.__boundListeners ||
+ (this.__boundListeners = new WeakMap());
+ let bl = hbl.get(node);
+ if (!bl) {
+ bl = {};
+ hbl.set(node, bl);
+ }
+ let key = eventName + methodName;
+ if (!bl[key]) {
+ bl[key] = this._addMethodEventListenerToNode(
+ node, eventName, methodName, this);
+ }
+ }
+
+ /**
+ * Convenience method to remove an event listener from a given element,
+ * late bound to a named method on this element.
+ *
+ * @param {Element} node Element to remove event listener from.
+ * @param {string} eventName Name of event to stop listening to.
+ * @param {string} methodName Name of handler method on `this` to not call
+ anymore.
+ * @return {void}
+ */
+ unlisten(node, eventName, methodName) {
+ node = /** @type {!Element} */ (node || this);
+ let bl = this.__boundListeners && this.__boundListeners.get(node);
+ let key = eventName + methodName;
+ let handler = bl && bl[key];
+ if (handler) {
+ this._removeEventListenerFromNode(node, eventName, handler);
+ bl[key] = null;
+ }
+ }
+
+ /**
+ * Override scrolling behavior to all direction, one direction, or none.
+ *
+ * Valid scroll directions:
+ * - 'all': scroll in any direction
+ * - 'x': scroll only in the 'x' direction
+ * - 'y': scroll only in the 'y' direction
+ * - 'none': disable scrolling for this node
+ *
+ * @param {string=} direction Direction to allow scrolling
+ * Defaults to `all`.
+ * @param {Element=} node Element to apply scroll direction setting.
+ * Defaults to `this`.
+ * @return {void}
+ */
+ setScrollDirection(direction, node) {
+ setTouchAction( (node || this), DIRECTION_MAP[direction] || 'auto');
+ }
+ /* **** End Events **** */
+
+ /**
+ * Convenience method to run `querySelector` on this local DOM scope.
+ *
+ * This function calls `Polymer.dom(this.root).querySelector(slctr)`.
+ *
+ * @param {string} slctr Selector to run on this local DOM scope
+ * @return {Element} Element found by the selector, or null if not found.
+ */
+ $$(slctr) {
+ return this.root.querySelector(slctr);
+ }
+
+ /**
+ * Return the element whose local dom within which this element
+ * is contained. This is a shorthand for
+ * `this.getRootNode().host`.
+ * @this {Element}
+ */
+ get domHost() {
+ let root = this.getRootNode();
+ return (root instanceof DocumentFragment) ? /** @type {ShadowRoot} */ (root).host : root;
+ }
+
+ /**
+ * Force this element to distribute its children to its local dom.
+ * This should not be necessary as of Polymer 2.0.2 and is provided only
+ * for backwards compatibility.
+ * @return {void}
+ */
+ distributeContent() {
+ if (window.ShadyDOM && this.shadowRoot) {
+ ShadyDOM.flush();
+ }
+ }
+
+ /**
+ * Returns a list of nodes that are the effective childNodes. The effective
+ * childNodes list is the same as the element's childNodes except that
+ * any `<content>` elements are replaced with the list of nodes distributed
+ * to the `<content>`, the result of its `getDistributedNodes` method.
+ * @return {!Array<!Node>} List of effective child nodes.
+ * @suppress {invalidCasts} LegacyElementMixin must be applied to an HTMLElement
+ */
+ getEffectiveChildNodes() {
+ const thisEl = /** @type {Element} */ (this);
+ const domApi = /** @type {Polymer.DomApi} */(dom$0(thisEl));
+ return domApi.getEffectiveChildNodes();
+ }
+
+ /**
+ * Returns a list of nodes distributed within this element that match
+ * `selector`. These can be dom children or elements distributed to
+ * children that are insertion points.
+ * @param {string} selector Selector to run.
+ * @return {!Array<!Node>} List of distributed elements that match selector.
+ * @suppress {invalidCasts} LegacyElementMixin must be applied to an HTMLElement
+ */
+ queryDistributedElements(selector) {
+ const thisEl = /** @type {Element} */ (this);
+ const domApi = /** @type {Polymer.DomApi} */(dom$0(thisEl));
+ return domApi.queryDistributedElements(selector);
+ }
+
+ /**
+ * Returns a list of elements that are the effective children. The effective
+ * children list is the same as the element's children except that
+ * any `<content>` elements are replaced with the list of elements
+ * distributed to the `<content>`.
+ *
+ * @return {!Array<!Node>} List of effective children.
+ */
+ getEffectiveChildren() {
+ let list = this.getEffectiveChildNodes();
+ return list.filter(function(/** @type {!Node} */ n) {
+ return (n.nodeType === Node.ELEMENT_NODE);
+ });
+ }
+
+ /**
+ * Returns a string of text content that is the concatenation of the
+ * text content's of the element's effective childNodes (the elements
+ * returned by <a href="#getEffectiveChildNodes>getEffectiveChildNodes</a>.
+ *
+ * @return {string} List of effective children.
+ */
+ getEffectiveTextContent() {
+ let cn = this.getEffectiveChildNodes();
+ let tc = [];
+ for (let i=0, c; (c = cn[i]); i++) {
+ if (c.nodeType !== Node.COMMENT_NODE) {
+ tc.push(c.textContent);
+ }
+ }
+ return tc.join('');
+ }
+
+ /**
+ * Returns the first effective childNode within this element that
+ * match `selector`. These can be dom child nodes or elements distributed
+ * to children that are insertion points.
+ * @param {string} selector Selector to run.
+ * @return {Node} First effective child node that matches selector.
+ */
+ queryEffectiveChildren(selector) {
+ let e$ = this.queryDistributedElements(selector);
+ return e$ && e$[0];
+ }
+
+ /**
+ * Returns a list of effective childNodes within this element that
+ * match `selector`. These can be dom child nodes or elements distributed
+ * to children that are insertion points.
+ * @param {string} selector Selector to run.
+ * @return {!Array<!Node>} List of effective child nodes that match selector.
+ */
+ queryAllEffectiveChildren(selector) {
+ return this.queryDistributedElements(selector);
+ }
+
+ /**
+ * Returns a list of nodes distributed to this element's `<slot>`.
+ *
+ * If this element contains more than one `<slot>` in its local DOM,
+ * an optional selector may be passed to choose the desired content.
+ *
+ * @param {string=} slctr CSS selector to choose the desired
+ * `<slot>`. Defaults to `content`.
+ * @return {!Array<!Node>} List of distributed nodes for the `<slot>`.
+ */
+ getContentChildNodes(slctr) {
+ let content = this.root.querySelector(slctr || 'slot');
+ return content ? /** @type {Polymer.DomApi} */(dom$0(content)).getDistributedNodes() : [];
+ }
+
+ /**
+ * Returns a list of element children distributed to this element's
+ * `<slot>`.
+ *
+ * If this element contains more than one `<slot>` in its
+ * local DOM, an optional selector may be passed to choose the desired
+ * content. This method differs from `getContentChildNodes` in that only
+ * elements are returned.
+ *
+ * @param {string=} slctr CSS selector to choose the desired
+ * `<content>`. Defaults to `content`.
+ * @return {!Array<!HTMLElement>} List of distributed nodes for the
+ * `<slot>`.
+ * @suppress {invalidCasts}
+ */
+ getContentChildren(slctr) {
+ let children = /** @type {!Array<!HTMLElement>} */(this.getContentChildNodes(slctr).filter(function(n) {
+ return (n.nodeType === Node.ELEMENT_NODE);
+ }));
+ return children;
+ }
+
+ /**
+ * Checks whether an element is in this element's light DOM tree.
+ *
+ * @param {?Node} node The element to be checked.
+ * @return {boolean} true if node is in this element's light DOM tree.
+ * @suppress {invalidCasts} LegacyElementMixin must be applied to an HTMLElement
+ */
+ isLightDescendant(node) {
+ const thisNode = /** @type {Node} */ (this);
+ return thisNode !== node && thisNode.contains(node) &&
+ thisNode.getRootNode() === node.getRootNode();
+ }
+
+ /**
+ * Checks whether an element is in this element's local DOM tree.
+ *
+ * @param {!Element} node The element to be checked.
+ * @return {boolean} true if node is in this element's local DOM tree.
+ */
+ isLocalDescendant(node) {
+ return this.root === node.getRootNode();
+ }
+
+ /**
+ * No-op for backwards compatibility. This should now be handled by
+ * ShadyCss library.
+ * @param {*} container Unused
+ * @param {*} shouldObserve Unused
+ * @return {void}
+ */
+ scopeSubtree(container, shouldObserve) { // eslint-disable-line no-unused-vars
+ }
+
+ /**
+ * Returns the computed style value for the given property.
+ * @param {string} property The css property name.
+ * @return {string} Returns the computed css property value for the given
+ * `property`.
+ * @suppress {invalidCasts} LegacyElementMixin must be applied to an HTMLElement
+ */
+ getComputedStyleValue(property) {
+ return styleInterface.getComputedStyleValue(/** @type {!Element} */(this), property);
+ }
+
+ // debounce
+
+ /**
+ * Call `debounce` to collapse multiple requests for a named task into
+ * one invocation which is made after the wait time has elapsed with
+ * no new request. If no wait time is given, the callback will be called
+ * at microtask timing (guaranteed before paint).
+ *
+ * debouncedClickAction(e) {
+ * // will not call `processClick` more than once per 100ms
+ * this.debounce('click', function() {
+ * this.processClick();
+ * } 100);
+ * }
+ *
+ * @param {string} jobName String to identify the debounce job.
+ * @param {function():void} callback Function that is called (with `this`
+ * context) when the wait time elapses.
+ * @param {number} wait Optional wait time in milliseconds (ms) after the
+ * last signal that must elapse before invoking `callback`
+ * @return {!Object} Returns a debouncer object on which exists the
+ * following methods: `isActive()` returns true if the debouncer is
+ * active; `cancel()` cancels the debouncer if it is active;
+ * `flush()` immediately invokes the debounced callback if the debouncer
+ * is active.
+ */
+ debounce(jobName, callback, wait) {
+ this._debouncers = this._debouncers || {};
+ return this._debouncers[jobName] = Debouncer.debounce(
+ this._debouncers[jobName]
+ , wait > 0 ? timeOut.after(wait) : microTask
+ , callback.bind(this));
+ }
+
+ /**
+ * Returns whether a named debouncer is active.
+ *
+ * @param {string} jobName The name of the debouncer started with `debounce`
+ * @return {boolean} Whether the debouncer is active (has not yet fired).
+ */
+ isDebouncerActive(jobName) {
+ this._debouncers = this._debouncers || {};
+ let debouncer = this._debouncers[jobName];
+ return !!(debouncer && debouncer.isActive());
+ }
+
+ /**
+ * Immediately calls the debouncer `callback` and inactivates it.
+ *
+ * @param {string} jobName The name of the debouncer started with `debounce`
+ * @return {void}
+ */
+ flushDebouncer(jobName) {
+ this._debouncers = this._debouncers || {};
+ let debouncer = this._debouncers[jobName];
+ if (debouncer) {
+ debouncer.flush();
+ }
+ }
+
+ /**
+ * Cancels an active debouncer. The `callback` will not be called.
+ *
+ * @param {string} jobName The name of the debouncer started with `debounce`
+ * @return {void}
+ */
+ cancelDebouncer(jobName) {
+ this._debouncers = this._debouncers || {};
+ let debouncer = this._debouncers[jobName];
+ if (debouncer) {
+ debouncer.cancel();
+ }
+ }
+
+ /**
+ * Runs a callback function asynchronously.
+ *
+ * By default (if no waitTime is specified), async callbacks are run at
+ * microtask timing, which will occur before paint.
+ *
+ * @param {!Function} callback The callback function to run, bound to `this`.
+ * @param {number=} waitTime Time to wait before calling the
+ * `callback`. If unspecified or 0, the callback will be run at microtask
+ * timing (before paint).
+ * @return {number} Handle that may be used to cancel the async job.
+ */
+ async(callback, waitTime) {
+ return waitTime > 0 ? timeOut.run(callback.bind(this), waitTime) :
+ ~microTask.run(callback.bind(this));
+ }
+
+ /**
+ * Cancels an async operation started with `async`.
+ *
+ * @param {number} handle Handle returned from original `async` call to
+ * cancel.
+ * @return {void}
+ */
+ cancelAsync(handle) {
+ handle < 0 ? microTask.cancel(~handle) :
+ timeOut.cancel(handle);
+ }
+
+ // other
+
+ /**
+ * Convenience method for creating an element and configuring it.
+ *
+ * @param {string} tag HTML element tag to create.
+ * @param {Object=} props Object of properties to configure on the
+ * instance.
+ * @return {!Element} Newly created and configured element.
+ */
+ create(tag, props) {
+ let elt = document.createElement(tag);
+ if (props) {
+ if (elt.setProperties) {
+ elt.setProperties(props);
+ } else {
+ for (let n in props) {
+ elt[n] = props[n];
+ }
+ }
+ }
+ return elt;
+ }
+
+ /**
+ * Polyfill for Element.prototype.matches, which is sometimes still
+ * prefixed.
+ *
+ * @param {string} selector Selector to test.
+ * @param {!Element=} node Element to test the selector against.
+ * @return {boolean} Whether the element matches the selector.
+ */
+ elementMatches(selector, node) {
+ return matchesSelector( (node || this), selector);
+ }
+
+ /**
+ * Toggles an HTML attribute on or off.
+ *
+ * @param {string} name HTML attribute name
+ * @param {boolean=} bool Boolean to force the attribute on or off.
+ * When unspecified, the state of the attribute will be reversed.
+ * @param {Element=} node Node to target. Defaults to `this`.
+ * @return {void}
+ */
+ toggleAttribute(name, bool, node) {
+ node = /** @type {Element} */ (node || this);
+ if (arguments.length == 1) {
+ bool = !node.hasAttribute(name);
+ }
+ if (bool) {
+ node.setAttribute(name, '');
+ } else {
+ node.removeAttribute(name);
+ }
+ }
+
+
+ /**
+ * Toggles a CSS class on or off.
+ *
+ * @param {string} name CSS class name
+ * @param {boolean=} bool Boolean to force the class on or off.
+ * When unspecified, the state of the class will be reversed.
+ * @param {Element=} node Node to target. Defaults to `this`.
+ * @return {void}
+ */
+ toggleClass(name, bool, node) {
+ node = /** @type {Element} */ (node || this);
+ if (arguments.length == 1) {
+ bool = !node.classList.contains(name);
+ }
+ if (bool) {
+ node.classList.add(name);
+ } else {
+ node.classList.remove(name);
+ }
+ }
+
+ /**
+ * Cross-platform helper for setting an element's CSS `transform` property.
+ *
+ * @param {string} transformText Transform setting.
+ * @param {Element=} node Element to apply the transform to.
+ * Defaults to `this`
+ * @return {void}
+ */
+ transform(transformText, node) {
+ node = /** @type {Element} */ (node || this);
+ node.style.webkitTransform = transformText;
+ node.style.transform = transformText;
+ }
+
+ /**
+ * Cross-platform helper for setting an element's CSS `translate3d`
+ * property.
+ *
+ * @param {number} x X offset.
+ * @param {number} y Y offset.
+ * @param {number} z Z offset.
+ * @param {Element=} node Element to apply the transform to.
+ * Defaults to `this`.
+ * @return {void}
+ */
+ translate3d(x, y, z, node) {
+ node = /** @type {Element} */ (node || this);
+ this.transform('translate3d(' + x + ',' + y + ',' + z + ')', node);
+ }
+
+ /**
+ * Removes an item from an array, if it exists.
+ *
+ * If the array is specified by path, a change notification is
+ * generated, so that observers, data bindings and computed
+ * properties watching that path can update.
+ *
+ * If the array is passed directly, **no change
+ * notification is generated**.
+ *
+ * @param {string | !Array<number|string>} arrayOrPath Path to array from which to remove the item
+ * (or the array itself).
+ * @param {*} item Item to remove.
+ * @return {Array} Array containing item removed.
+ */
+ arrayDelete(arrayOrPath, item) {
+ let index;
+ if (Array.isArray(arrayOrPath)) {
+ index = arrayOrPath.indexOf(item);
+ if (index >= 0) {
+ return arrayOrPath.splice(index, 1);
+ }
+ } else {
+ let arr = get$0(this, arrayOrPath);
+ index = arr.indexOf(item);
+ if (index >= 0) {
+ return this.splice(arrayOrPath, index, 1);
+ }
+ }
+ return null;
+ }
+
+ // logging
+
+ /**
+ * Facades `console.log`/`warn`/`error` as override point.
+ *
+ * @param {string} level One of 'log', 'warn', 'error'
+ * @param {Array} args Array of strings or objects to log
+ * @return {void}
+ */
+ _logger(level, args) {
+ // accept ['foo', 'bar'] and [['foo', 'bar']]
+ if (Array.isArray(args) && args.length === 1 && Array.isArray(args[0])) {
+ args = args[0];
+ }
+ switch(level) {
+ case 'log':
+ case 'warn':
+ case 'error':
+ console[level](...args);
+ }
+ }
+
+ /**
+ * Facades `console.log` as an override point.
+ *
+ * @param {...*} args Array of strings or objects to log
+ * @return {void}
+ */
+ _log(...args) {
+ this._logger('log', args);
+ }
+
+ /**
+ * Facades `console.warn` as an override point.
+ *
+ * @param {...*} args Array of strings or objects to log
+ * @return {void}
+ */
+ _warn(...args) {
+ this._logger('warn', args);
+ }
+
+ /**
+ * Facades `console.error` as an override point.
+ *
+ * @param {...*} args Array of strings or objects to log
+ * @return {void}
+ */
+ _error(...args) {
+ this._logger('error', args);
+ }
+
+ /**
+ * Formats a message using the element type an a method name.
+ *
+ * @param {string} methodName Method name to associate with message
+ * @param {...*} args Array of strings or objects to log
+ * @return {Array} Array with formatting information for `console`
+ * logging.
+ */
+ _logf(methodName, ...args) {
+ return ['[%s::%s]', this.is, methodName, ...args];
+ }
+
+ }
+
+ LegacyElement.prototype.is = '';
+
+ return LegacyElement;
+
+});
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/mutable-data-behavior.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/mutable-data-behavior.js
new file mode 100644
index 00000000000..ee236668b7a
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/mutable-data-behavior.js
@@ -0,0 +1,150 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { MutableData } from '../mixins/mutable-data.js';
+
+let mutablePropertyChange;
+/** @suppress {missingProperties} */
+(() => {
+ mutablePropertyChange = MutableData._mutablePropertyChange;
+})();
+
+/**
+ * Legacy element behavior to skip strict dirty-checking for objects and arrays,
+ * (always consider them to be "dirty") for use on legacy API Polymer elements.
+ *
+ * By default, `Polymer.PropertyEffects` performs strict dirty checking on
+ * objects, which means that any deep modifications to an object or array will
+ * not be propagated unless "immutable" data patterns are used (i.e. all object
+ * references from the root to the mutation were changed).
+ *
+ * Polymer also provides a proprietary data mutation and path notification API
+ * (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient
+ * mutation and notification of deep changes in an object graph to all elements
+ * bound to the same object graph.
+ *
+ * In cases where neither immutable patterns nor the data mutation API can be
+ * used, applying this mixin will cause Polymer to skip dirty checking for
+ * objects and arrays (always consider them to be "dirty"). This allows a
+ * user to make a deep modification to a bound object graph, and then either
+ * simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath`
+ * (e.g. `this.notifyPath('items')`) to update the tree. Note that all
+ * elements that wish to be updated based on deep mutations must apply this
+ * mixin or otherwise skip strict dirty checking for objects/arrays.
+ * Specifically, any elements in the binding tree between the source of a
+ * mutation and the consumption of it must apply this behavior or enable the
+ * `Polymer.OptionalMutableDataBehavior`.
+ *
+ * In order to make the dirty check strategy configurable, see
+ * `Polymer.OptionalMutableDataBehavior`.
+ *
+ * Note, the performance characteristics of propagating large object graphs
+ * will be worse as opposed to using strict dirty checking with immutable
+ * patterns or Polymer's path notification API.
+ *
+ * @polymerBehavior
+ * @summary Behavior to skip strict dirty-checking for objects and
+ * arrays
+ */
+export const MutableDataBehavior = {
+
+ /**
+ * Overrides `Polymer.PropertyEffects` to provide option for skipping
+ * strict equality checking for Objects and Arrays.
+ *
+ * This method pulls the value to dirty check against from the `__dataTemp`
+ * cache (rather than the normal `__data` cache) for Objects. Since the temp
+ * cache is cleared at the end of a turn, this implementation allows
+ * side-effects of deep object changes to be processed by re-setting the
+ * same object (using the temp cache as an in-turn backstop to prevent
+ * cycles due to 2-way notification).
+ *
+ * @param {string} property Property name
+ * @param {*} value New property value
+ * @param {*} old Previous property value
+ * @return {boolean} Whether the property should be considered a change
+ * @protected
+ */
+ _shouldPropertyChange(property, value, old) {
+ return mutablePropertyChange(this, property, value, old, true);
+ }
+};
+
+/**
+ * Legacy element behavior to add the optional ability to skip strict
+ * dirty-checking for objects and arrays (always consider them to be
+ * "dirty") by setting a `mutable-data` attribute on an element instance.
+ *
+ * By default, `Polymer.PropertyEffects` performs strict dirty checking on
+ * objects, which means that any deep modifications to an object or array will
+ * not be propagated unless "immutable" data patterns are used (i.e. all object
+ * references from the root to the mutation were changed).
+ *
+ * Polymer also provides a proprietary data mutation and path notification API
+ * (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient
+ * mutation and notification of deep changes in an object graph to all elements
+ * bound to the same object graph.
+ *
+ * In cases where neither immutable patterns nor the data mutation API can be
+ * used, applying this mixin will allow Polymer to skip dirty checking for
+ * objects and arrays (always consider them to be "dirty"). This allows a
+ * user to make a deep modification to a bound object graph, and then either
+ * simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath`
+ * (e.g. `this.notifyPath('items')`) to update the tree. Note that all
+ * elements that wish to be updated based on deep mutations must apply this
+ * mixin or otherwise skip strict dirty checking for objects/arrays.
+ * Specifically, any elements in the binding tree between the source of a
+ * mutation and the consumption of it must enable this behavior or apply the
+ * `Polymer.OptionalMutableDataBehavior`.
+ *
+ * While this behavior adds the ability to forgo Object/Array dirty checking,
+ * the `mutableData` flag defaults to false and must be set on the instance.
+ *
+ * Note, the performance characteristics of propagating large object graphs
+ * will be worse by relying on `mutableData: true` as opposed to using
+ * strict dirty checking with immutable patterns or Polymer's path notification
+ * API.
+ *
+ * @polymerBehavior
+ * @summary Behavior to optionally skip strict dirty-checking for objects and
+ * arrays
+ */
+export const OptionalMutableDataBehavior = {
+
+ properties: {
+ /**
+ * Instance-level flag for configuring the dirty-checking strategy
+ * for this element. When true, Objects and Arrays will skip dirty
+ * checking, otherwise strict equality checking will be used.
+ */
+ mutableData: Boolean
+ },
+
+ /**
+ * Overrides `Polymer.PropertyEffects` to skip strict equality checking
+ * for Objects and Arrays.
+ *
+ * Pulls the value to dirty check against from the `__dataTemp` cache
+ * (rather than the normal `__data` cache) for Objects. Since the temp
+ * cache is cleared at the end of a turn, this implementation allows
+ * side-effects of deep object changes to be processed by re-setting the
+ * same object (using the temp cache as an in-turn backstop to prevent
+ * cycles due to 2-way notification).
+ *
+ * @param {string} property Property name
+ * @param {*} value New property value
+ * @param {*} old Previous property value
+ * @return {boolean} Whether the property should be considered a change
+ * @this {this}
+ * @protected
+ */
+ _shouldPropertyChange(property, value, old) {
+ return mutablePropertyChange(this, property, value, old, this.mutableData);
+ }
+};
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/polymer-fn.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/polymer-fn.js
new file mode 100644
index 00000000000..de019be6a9e
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/polymer-fn.js
@@ -0,0 +1,48 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { Class } from './class.js';
+
+import '../utils/boot.js';
+
+/**
+ * Legacy class factory and registration helper for defining Polymer
+ * elements.
+ *
+ * This method is equivalent to
+ *
+ * import {Class} from '@polymer/polymer/lib/legacy/class.js';
+ * customElements.define(info.is, Class(info));
+ *
+ * See `Class` for details on valid legacy metadata format for `info`.
+ *
+ * @global
+ * @override
+ * @function
+ * @param {!PolymerInit} info Object containing Polymer metadata and functions
+ * to become class methods.
+ * @return {function(new: HTMLElement)} Generated class
+ * @suppress {duplicate, invalidCasts, checkTypes}
+ */
+const Polymer = function(info) {
+ // if input is a `class` (aka a function with a prototype), use the prototype
+ // remember that the `constructor` will never be called
+ let klass;
+ if (typeof info === 'function') {
+ klass = info;
+ } else {
+ klass = Polymer.Class(info);
+ }
+ customElements.define(klass.is, /** @type {!HTMLElement} */(klass));
+ return klass;
+};
+
+Polymer.Class = Class;
+
+export { Polymer }; \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/polymer.dom.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/polymer.dom.js
new file mode 100644
index 00000000000..2d817e050cf
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/polymer.dom.js
@@ -0,0 +1,391 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../utils/boot.js';
+
+import '../utils/settings.js';
+import { FlattenedNodesObserver } from '../utils/flattened-nodes-observer.js';
+import { flush as flush$0, enqueueDebouncer } from '../utils/flush.js';
+
+const p = Element.prototype;
+/**
+ * @const {function(this:Node, string): boolean}
+ */
+const normalizedMatchesSelector = p.matches || p.matchesSelector ||
+ p.mozMatchesSelector || p.msMatchesSelector ||
+ p.oMatchesSelector || p.webkitMatchesSelector;
+
+/**
+ * Cross-platform `element.matches` shim.
+ *
+ * @function matchesSelector
+ * @param {!Node} node Node to check selector against
+ * @param {string} selector Selector to match
+ * @return {boolean} True if node matched selector
+ */
+export const matchesSelector = function(node, selector) {
+ return normalizedMatchesSelector.call(node, selector);
+};
+
+/**
+ * Node API wrapper class returned from `Polymer.dom.(target)` when
+ * `target` is a `Node`.
+ *
+ */
+export class DomApi {
+
+ /**
+ * @param {Node} node Node for which to create a Polymer.dom helper object.
+ */
+ constructor(node) {
+ this.node = node;
+ }
+
+ /**
+ * Returns an instance of `Polymer.FlattenedNodesObserver` that
+ * listens for node changes on this element.
+ *
+ * @param {function(!Element, { target: !Element, addedNodes: !Array<!Element>, removedNodes: !Array<!Element> }):void} callback Called when direct or distributed children
+ * of this element changes
+ * @return {!Polymer.FlattenedNodesObserver} Observer instance
+ */
+ observeNodes(callback) {
+ return new FlattenedNodesObserver(this.node, callback);
+ }
+
+ /**
+ * Disconnects an observer previously created via `observeNodes`
+ *
+ * @param {!Polymer.FlattenedNodesObserver} observerHandle Observer instance
+ * to disconnect.
+ * @return {void}
+ */
+ unobserveNodes(observerHandle) {
+ observerHandle.disconnect();
+ }
+
+ /**
+ * Provided as a backwards-compatible API only. This method does nothing.
+ * @return {void}
+ */
+ notifyObserver() {}
+
+ /**
+ * Returns true if the provided node is contained with this element's
+ * light-DOM children or shadow root, including any nested shadow roots
+ * of children therein.
+ *
+ * @param {Node} node Node to test
+ * @return {boolean} Returns true if the given `node` is contained within
+ * this element's light or shadow DOM.
+ */
+ deepContains(node) {
+ if (this.node.contains(node)) {
+ return true;
+ }
+ let n = node;
+ let doc = node.ownerDocument;
+ // walk from node to `this` or `document`
+ while (n && n !== doc && n !== this.node) {
+ // use logical parentnode, or native ShadowRoot host
+ n = n.parentNode || n.host;
+ }
+ return n === this.node;
+ }
+
+ /**
+ * Returns the root node of this node. Equivalent to `getRoodNode()`.
+ *
+ * @return {Node} Top most element in the dom tree in which the node
+ * exists. If the node is connected to a document this is either a
+ * shadowRoot or the document; otherwise, it may be the node
+ * itself or a node or document fragment containing it.
+ */
+ getOwnerRoot() {
+ return this.node.getRootNode();
+ }
+
+ /**
+ * For slot elements, returns the nodes assigned to the slot; otherwise
+ * an empty array. It is equivalent to `<slot>.addignedNodes({flatten:true})`.
+ *
+ * @return {!Array<!Node>} Array of assigned nodes
+ */
+ getDistributedNodes() {
+ return (this.node.localName === 'slot') ?
+ this.node.assignedNodes({flatten: true}) :
+ [];
+ }
+
+ /**
+ * Returns an array of all slots this element was distributed to.
+ *
+ * @return {!Array<!HTMLSlotElement>} Description
+ */
+ getDestinationInsertionPoints() {
+ let ip$ = [];
+ let n = this.node.assignedSlot;
+ while (n) {
+ ip$.push(n);
+ n = n.assignedSlot;
+ }
+ return ip$;
+ }
+
+ /**
+ * Calls `importNode` on the `ownerDocument` for this node.
+ *
+ * @param {!Node} node Node to import
+ * @param {boolean} deep True if the node should be cloned deeply during
+ * import
+ * @return {Node} Clone of given node imported to this owner document
+ */
+ importNode(node, deep) {
+ let doc = this.node instanceof Document ? this.node :
+ this.node.ownerDocument;
+ return doc.importNode(node, deep);
+ }
+
+ /**
+ * @return {!Array<!Node>} Returns a flattened list of all child nodes and
+ * nodes assigned to child slots.
+ */
+ getEffectiveChildNodes() {
+ return FlattenedNodesObserver.getFlattenedNodes(this.node);
+ }
+
+ /**
+ * Returns a filtered list of flattened child elements for this element based
+ * on the given selector.
+ *
+ * @param {string} selector Selector to filter nodes against
+ * @return {!Array<!HTMLElement>} List of flattened child elements
+ */
+ queryDistributedElements(selector) {
+ let c$ = this.getEffectiveChildNodes();
+ let list = [];
+ for (let i=0, l=c$.length, c; (i<l) && (c=c$[i]); i++) {
+ if ((c.nodeType === Node.ELEMENT_NODE) &&
+ matchesSelector(c, selector)) {
+ list.push(c);
+ }
+ }
+ return list;
+ }
+
+ /**
+ * For shadow roots, returns the currently focused element within this
+ * shadow root.
+ *
+ * @return {Node|undefined} Currently focused element
+ */
+ get activeElement() {
+ let node = this.node;
+ return node._activeElement !== undefined ? node._activeElement : node.activeElement;
+ }
+}
+
+function forwardMethods(proto, methods) {
+ for (let i=0; i < methods.length; i++) {
+ let method = methods[i];
+ /* eslint-disable valid-jsdoc */
+ proto[method] = /** @this {DomApi} */ function() {
+ return this.node[method].apply(this.node, arguments);
+ };
+ /* eslint-enable */
+ }
+}
+
+function forwardReadOnlyProperties(proto, properties) {
+ for (let i=0; i < properties.length; i++) {
+ let name = properties[i];
+ Object.defineProperty(proto, name, {
+ get: function() {
+ const domApi = /** @type {DomApi} */(this);
+ return domApi.node[name];
+ },
+ configurable: true
+ });
+ }
+}
+
+function forwardProperties(proto, properties) {
+ for (let i=0; i < properties.length; i++) {
+ let name = properties[i];
+ Object.defineProperty(proto, name, {
+ get: function() {
+ const domApi = /** @type {DomApi} */(this);
+ return domApi.node[name];
+ },
+ set: function(value) {
+ /** @type {DomApi} */ (this).node[name] = value;
+ },
+ configurable: true
+ });
+ }
+}
+
+forwardMethods(DomApi.prototype, [
+ 'cloneNode', 'appendChild', 'insertBefore', 'removeChild',
+ 'replaceChild', 'setAttribute', 'removeAttribute',
+ 'querySelector', 'querySelectorAll'
+]);
+
+forwardReadOnlyProperties(DomApi.prototype, [
+ 'parentNode', 'firstChild', 'lastChild',
+ 'nextSibling', 'previousSibling', 'firstElementChild',
+ 'lastElementChild', 'nextElementSibling', 'previousElementSibling',
+ 'childNodes', 'children', 'classList'
+]);
+
+forwardProperties(DomApi.prototype, [
+ 'textContent', 'innerHTML'
+]);
+
+
+/**
+ * Event API wrapper class returned from `Polymer.dom.(target)` when
+ * `target` is an `Event`.
+ */
+class EventApi {
+ constructor(event) {
+ this.event = event;
+ }
+
+ /**
+ * Returns the first node on the `composedPath` of this event.
+ *
+ * @return {!EventTarget} The node this event was dispatched to
+ */
+ get rootTarget() {
+ return this.event.composedPath()[0];
+ }
+
+ /**
+ * Returns the local (re-targeted) target for this event.
+ *
+ * @return {!EventTarget} The local (re-targeted) target for this event.
+ */
+ get localTarget() {
+ return this.event.target;
+ }
+
+ /**
+ * Returns the `composedPath` for this event.
+ * @return {!Array<!EventTarget>} The nodes this event propagated through
+ */
+ get path() {
+ return this.event.composedPath();
+ }
+}
+
+/**
+ * @function
+ * @param {boolean=} deep
+ * @return {!Node}
+ */
+DomApi.prototype.cloneNode;
+/**
+ * @function
+ * @param {!Node} node
+ * @return {!Node}
+ */
+DomApi.prototype.appendChild;
+/**
+ * @function
+ * @param {!Node} newChild
+ * @param {Node} refChild
+ * @return {!Node}
+ */
+DomApi.prototype.insertBefore;
+/**
+ * @function
+ * @param {!Node} node
+ * @return {!Node}
+ */
+DomApi.prototype.removeChild;
+/**
+ * @function
+ * @param {!Node} oldChild
+ * @param {!Node} newChild
+ * @return {!Node}
+ */
+DomApi.prototype.replaceChild;
+/**
+ * @function
+ * @param {string} name
+ * @param {string} value
+ * @return {void}
+ */
+DomApi.prototype.setAttribute;
+/**
+ * @function
+ * @param {string} name
+ * @return {void}
+ */
+DomApi.prototype.removeAttribute;
+/**
+ * @function
+ * @param {string} selector
+ * @return {?Element}
+ */
+DomApi.prototype.querySelector;
+/**
+ * @function
+ * @param {string} selector
+ * @return {!NodeList<!Element>}
+ */
+DomApi.prototype.querySelectorAll;
+
+/**
+ * Legacy DOM and Event manipulation API wrapper factory used to abstract
+ * differences between native Shadow DOM and "Shady DOM" when polyfilling on
+ * older browsers.
+ *
+ * Note that in Polymer 2.x use of `Polymer.dom` is no longer required and
+ * in the majority of cases simply facades directly to the standard native
+ * API.
+ *
+ * @summary Legacy DOM and Event manipulation API wrapper factory used to
+ * abstract differences between native Shadow DOM and "Shady DOM."
+ * @param {(Node|Event)=} obj Node or event to operate on
+ * @return {!DomApi|!EventApi} Wrapper providing either node API or event API
+ */
+export const dom = function(obj) {
+ obj = obj || document;
+ if (!obj.__domApi) {
+ let helper;
+ if (obj instanceof Event) {
+ helper = new EventApi(obj);
+ } else {
+ helper = new DomApi(obj);
+ }
+ obj.__domApi = helper;
+ }
+ return obj.__domApi;
+};
+
+/**
+ * Forces several classes of asynchronously queued tasks to flush:
+ * - Debouncers added via `Polymer.enqueueDebouncer`
+ * - ShadyDOM distribution
+ *
+ * This method facades to `Polymer.flush`.
+ *
+ */
+export { flush$0 as flush };
+
+/**
+ * Adds a `Polymer.Debouncer` to a list of globally flushable tasks.
+ *
+ * This method facades to `Polymer.enqueueDebouncer`.
+ *
+ * @param {!Polymer.Debouncer} debouncer Debouncer to enqueue
+ */
+export { enqueueDebouncer as addDebouncer };
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/templatizer-behavior.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/templatizer-behavior.js
new file mode 100644
index 00000000000..f1b8f7fd2f6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/legacy/templatizer-behavior.js
@@ -0,0 +1,144 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { TemplateInstanceBase as TemplateInstanceBase$0, templatize as templatize$0, modelForElement as modelForElement$0 } from '../utils/templatize.js';
+
+let TemplateInstanceBase = TemplateInstanceBase$0; // eslint-disable-line
+
+/**
+ * @typedef {{
+ * _templatizerTemplate: HTMLTemplateElement,
+ * _parentModel: boolean,
+ * _instanceProps: Object,
+ * _forwardHostPropV2: Function,
+ * _notifyInstancePropV2: Function,
+ * ctor: TemplateInstanceBase
+ * }}
+ */
+let TemplatizerUser; // eslint-disable-line
+
+/**
+ * The `Templatizer` behavior adds methods to generate instances of
+ * templates that are each managed by an anonymous `PropertyEffects`
+ * instance where data-bindings in the stamped template content are bound to
+ * accessors on itself.
+ *
+ * This behavior is provided in Polymer 2.x-3.x as a hybrid-element convenience
+ * only. For non-hybrid usage, the `Templatize` library
+ * should be used instead.
+ *
+ * Example:
+ *
+ * import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';
+ * // Get a template from somewhere, e.g. light DOM
+ * let template = this.querySelector('template');
+ * // Prepare the template
+ * this.templatize(template);
+ * // Instance the template with an initial data model
+ * let instance = this.stamp({myProp: 'initial'});
+ * // Insert the instance's DOM somewhere, e.g. light DOM
+ * dom(this).appendChild(instance.root);
+ * // Changing a property on the instance will propagate to bindings
+ * // in the template
+ * instance.myProp = 'new value';
+ *
+ * Users of `Templatizer` may need to implement the following abstract
+ * API's to determine how properties and paths from the host should be
+ * forwarded into to instances:
+ *
+ * _forwardHostPropV2: function(prop, value)
+ *
+ * Likewise, users may implement these additional abstract API's to determine
+ * how instance-specific properties that change on the instance should be
+ * forwarded out to the host, if necessary.
+ *
+ * _notifyInstancePropV2: function(inst, prop, value)
+ *
+ * In order to determine which properties are instance-specific and require
+ * custom notification via `_notifyInstanceProp`, define an `_instanceProps`
+ * object containing keys for each instance prop, for example:
+ *
+ * _instanceProps: {
+ * item: true,
+ * index: true
+ * }
+ *
+ * Any properties used in the template that are not defined in _instanceProp
+ * will be forwarded out to the Templatize `owner` automatically.
+ *
+ * Users may also implement the following abstract function to show or
+ * hide any DOM generated using `stamp`:
+ *
+ * _showHideChildren: function(shouldHide)
+ *
+ * Note that some callbacks are suffixed with `V2` in the Polymer 2.x behavior
+ * as the implementations will need to differ from the callbacks required
+ * by the 1.x Templatizer API due to changes in the `TemplateInstance` API
+ * between versions 1.x and 2.x.
+ *
+ * @polymerBehavior
+ */
+export const Templatizer = {
+
+ /**
+ * Generates an anonymous `TemplateInstance` class (stored as `this.ctor`)
+ * for the provided template. This method should be called once per
+ * template to prepare an element for stamping the template, followed
+ * by `stamp` to create new instances of the template.
+ *
+ * @param {!HTMLTemplateElement} template Template to prepare
+ * @param {boolean=} mutableData When `true`, the generated class will skip
+ * strict dirty-checking for objects and arrays (always consider them to
+ * be "dirty"). Defaults to false.
+ * @return {void}
+ * @this {TemplatizerUser}
+ */
+ templatize(template, mutableData) {
+ this._templatizerTemplate = template;
+ this.ctor = templatize$0(template, this, {
+ mutableData: Boolean(mutableData),
+ parentModel: this._parentModel,
+ instanceProps: this._instanceProps,
+ forwardHostProp: this._forwardHostPropV2,
+ notifyInstanceProp: this._notifyInstancePropV2
+ });
+ },
+
+ /**
+ * Creates an instance of the template prepared by `templatize`. The object
+ * returned is an instance of the anonymous class generated by `templatize`
+ * whose `root` property is a document fragment containing newly cloned
+ * template content, and which has property accessors corresponding to
+ * properties referenced in template bindings.
+ *
+ * @param {Object=} model Object containing initial property values to
+ * populate into the template bindings.
+ * @return {TemplateInstanceBase} Returns the created instance of
+ * the template prepared by `templatize`.
+ * @this {TemplatizerUser}
+ */
+ stamp(model) {
+ return new this.ctor(model);
+ },
+
+ /**
+ * Returns the template "model" (`TemplateInstance`) associated with
+ * a given element, which serves as the binding scope for the template
+ * instance the element is contained in. A template model should be used
+ * to manipulate data associated with this template instance.
+ *
+ * @param {HTMLElement} el Element for which to return a template model.
+ * @return {TemplateInstanceBase} Model representing the binding scope for
+ * the element.
+ * @this {TemplatizerUser}
+ */
+ modelForElement(el) {
+ return modelForElement$0(this._templatizerTemplate, el);
+ }
+};
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/dir-mixin.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/dir-mixin.js
new file mode 100644
index 00000000000..0e6d31e34fe
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/dir-mixin.js
@@ -0,0 +1,179 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { PropertyAccessors } from './property-accessors.js';
+
+import { dedupingMixin } from '../utils/mixin.js';
+
+const HOST_DIR = /:host\(:dir\((ltr|rtl)\)\)/g;
+const HOST_DIR_REPLACMENT = ':host([dir="$1"])';
+
+const EL_DIR = /([\s\w-#\.\[\]\*]*):dir\((ltr|rtl)\)/g;
+const EL_DIR_REPLACMENT = ':host([dir="$2"]) $1';
+
+/**
+ * @type {!Array<!Polymer_DirMixin>}
+ */
+const DIR_INSTANCES = [];
+
+/** @type {MutationObserver} */
+let observer = null;
+
+let DOCUMENT_DIR = '';
+
+function getRTL() {
+ DOCUMENT_DIR = document.documentElement.getAttribute('dir');
+}
+
+/**
+ * @param {!Polymer_DirMixin} instance Instance to set RTL status on
+ */
+function setRTL(instance) {
+ if (!instance.__autoDirOptOut) {
+ const el = /** @type {!HTMLElement} */(instance);
+ el.setAttribute('dir', DOCUMENT_DIR);
+ }
+}
+
+function updateDirection() {
+ getRTL();
+ DOCUMENT_DIR = document.documentElement.getAttribute('dir');
+ for (let i = 0; i < DIR_INSTANCES.length; i++) {
+ setRTL(DIR_INSTANCES[i]);
+ }
+}
+
+function takeRecords() {
+ if (observer && observer.takeRecords().length) {
+ updateDirection();
+ }
+}
+
+/**
+ * Element class mixin that allows elements to use the `:dir` CSS Selector to
+ * have text direction specific styling.
+ *
+ * With this mixin, any stylesheet provided in the template will transform
+ * `:dir` into `:host([dir])` and sync direction with the page via the
+ * element's `dir` attribute.
+ *
+ * Elements can opt out of the global page text direction by setting the `dir`
+ * attribute directly in `ready()` or in HTML.
+ *
+ * Caveats:
+ * - Applications must set `<html dir="ltr">` or `<html dir="rtl">` to sync
+ * direction
+ * - Automatic left-to-right or right-to-left styling is sync'd with the
+ * `<html>` element only.
+ * - Changing `dir` at runtime is supported.
+ * - Opting out of the global direction styling is permanent
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin PropertyAccessors
+ */
+export const DirMixin = dedupingMixin((base) => {
+
+ if (!observer) {
+ getRTL();
+ observer = new MutationObserver(updateDirection);
+ observer.observe(document.documentElement, {attributes: true, attributeFilter: ['dir']});
+ }
+
+ /**
+ * @constructor
+ * @extends {base}
+ * @implements {Polymer_PropertyAccessors}
+ */
+ const elementBase = PropertyAccessors(base);
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_DirMixin}
+ */
+ class Dir extends elementBase {
+
+ /**
+ * @override
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static _processStyleText(cssText, baseURI) {
+ cssText = super._processStyleText(cssText, baseURI);
+ cssText = this._replaceDirInCssText(cssText);
+ return cssText;
+ }
+
+ /**
+ * Replace `:dir` in the given CSS text
+ *
+ * @param {string} text CSS text to replace DIR
+ * @return {string} Modified CSS
+ */
+ static _replaceDirInCssText(text) {
+ let replacedText = text;
+ replacedText = replacedText.replace(HOST_DIR, HOST_DIR_REPLACMENT);
+ replacedText = replacedText.replace(EL_DIR, EL_DIR_REPLACMENT);
+ if (text !== replacedText) {
+ this.__activateDir = true;
+ }
+ return replacedText;
+ }
+
+ constructor() {
+ super();
+ /** @type {boolean} */
+ this.__autoDirOptOut = false;
+ }
+
+ /**
+ * @suppress {invalidCasts} Closure doesn't understand that `this` is an HTMLElement
+ * @return {void}
+ */
+ ready() {
+ super.ready();
+ this.__autoDirOptOut = /** @type {!HTMLElement} */(this).hasAttribute('dir');
+ }
+
+ /**
+ * @suppress {missingProperties} If it exists on elementBase, it can be super'd
+ * @return {void}
+ */
+ connectedCallback() {
+ if (elementBase.prototype.connectedCallback) {
+ super.connectedCallback();
+ }
+ if (this.constructor.__activateDir) {
+ takeRecords();
+ DIR_INSTANCES.push(this);
+ setRTL(this);
+ }
+ }
+
+ /**
+ * @suppress {missingProperties} If it exists on elementBase, it can be super'd
+ * @return {void}
+ */
+ disconnectedCallback() {
+ if (elementBase.prototype.disconnectedCallback) {
+ super.disconnectedCallback();
+ }
+ if (this.constructor.__activateDir) {
+ const idx = DIR_INSTANCES.indexOf(this);
+ if (idx > -1) {
+ DIR_INSTANCES.splice(idx, 1);
+ }
+ }
+ }
+ }
+
+ Dir.__activateDir = false;
+
+ return Dir;
+});
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/disable-upgrade-mixin.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/disable-upgrade-mixin.js
new file mode 100644
index 00000000000..3d008e836ca
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/disable-upgrade-mixin.js
@@ -0,0 +1,110 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { ElementMixin } from './element-mixin.js';
+
+import { dedupingMixin } from '../utils/mixin.js';
+
+const DISABLED_ATTR = 'disable-upgrade';
+
+/**
+ * Element class mixin that allows the element to boot up in a non-enabled
+ * state when the `disable-upgrade` attribute is present. This mixin is
+ * designed to be used with element classes like PolymerElement that perform
+ * initial startup work when they are first connected. When the
+ * `disable-upgrade` attribute is removed, if the element is connected, it
+ * boots up and "enables" as it otherwise would; if it is not connected, the
+ * element boots up when it is next connected.
+ *
+ * Using `disable-upgrade` with PolymerElement prevents any data propagation
+ * to the element, any element DOM from stamping, or any work done in
+ * connected/disconnctedCallback from occuring, but it does not prevent work
+ * done in the element constructor.
+ *
+ * Note, this mixin must be applied on top of any element class that
+ * itself implements a `connectedCallback` so that it can control the work
+ * done in `connectedCallback`. For example,
+ *
+ * MyClass = DisableUpgradeMixin(class extends BaseClass {...});
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin ElementMixin
+ */
+export const DisableUpgradeMixin = dedupingMixin((base) => {
+
+ /**
+ * @constructor
+ * @extends {base}
+ * @implements {Polymer_ElementMixin}
+ */
+ const superClass = ElementMixin(base);
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_DisableUpgradeMixin}
+ */
+ class DisableUpgradeClass extends superClass {
+
+ /** @override */
+ static get observedAttributes() {
+ return super.observedAttributes.concat(DISABLED_ATTR);
+ }
+
+ /** @override */
+ attributeChangedCallback(name, old, value, namespace) {
+ if (name == DISABLED_ATTR) {
+ if (!this.__dataEnabled && value == null && this.isConnected) {
+ super.connectedCallback();
+ }
+ } else {
+ super.attributeChangedCallback(name, old, value, namespace);
+ }
+ }
+
+ /*
+ NOTE: cannot gate on attribute because this is called before
+ attributes are delivered. Therefore, we stub this out and
+ call `super._initializeProperties()` manually.
+ */
+ /** @override */
+ _initializeProperties() {}
+
+ // prevent user code in connected from running
+ /** @override */
+ connectedCallback() {
+ if (this.__dataEnabled || !this.hasAttribute(DISABLED_ATTR)) {
+ super.connectedCallback();
+ }
+ }
+
+ // prevent element from turning on properties
+ /** @override */
+ _enableProperties() {
+ if (!this.hasAttribute(DISABLED_ATTR)) {
+ if (!this.__dataEnabled) {
+ super._initializeProperties();
+ }
+ super._enableProperties();
+ }
+ }
+
+ // only go if "enabled"
+ /** @override */
+ disconnectedCallback() {
+ if (this.__dataEnabled) {
+ super.disconnectedCallback();
+ }
+ }
+
+ }
+
+ return DisableUpgradeClass;
+
+});
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/element-mixin.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/element-mixin.js
new file mode 100644
index 00000000000..a445edaf975
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/element-mixin.js
@@ -0,0 +1,747 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../utils/boot.js';
+
+import { rootPath as rootPath$0 } from '../utils/settings.js';
+import { dedupingMixin } from '../utils/mixin.js';
+import { stylesFromTemplate, stylesFromModuleImports } from '../utils/style-gather.js';
+import { pathFromUrl, resolveCss, resolveUrl as resolveUrl$0 } from '../utils/resolve-url.js';
+import { DomModule } from '../elements/dom-module.js';
+import { PropertyEffects } from './property-effects.js';
+import { PropertiesMixin } from './properties-mixin.js';
+
+/**
+ * Element class mixin that provides the core API for Polymer's meta-programming
+ * features including template stamping, data-binding, attribute deserialization,
+ * and property change observation.
+ *
+ * Subclassers may provide the following static getters to return metadata
+ * used to configure Polymer's features for the class:
+ *
+ * - `static get is()`: When the template is provided via a `dom-module`,
+ * users should return the `dom-module` id from a static `is` getter. If
+ * no template is needed or the template is provided directly via the
+ * `template` getter, there is no need to define `is` for the element.
+ *
+ * - `static get template()`: Users may provide the template directly (as
+ * opposed to via `dom-module`) by implementing a static `template` getter.
+ * The getter may return an `HTMLTemplateElement` or a string, which will
+ * automatically be parsed into a template.
+ *
+ * - `static get properties()`: Should return an object describing
+ * property-related metadata used by Polymer features (key: property name
+ * value: object containing property metadata). Valid keys in per-property
+ * metadata include:
+ * - `type` (String|Number|Object|Array|...): Used by
+ * `attributeChangedCallback` to determine how string-based attributes
+ * are deserialized to JavaScript property values.
+ * - `notify` (boolean): Causes a change in the property to fire a
+ * non-bubbling event called `<property>-changed`. Elements that have
+ * enabled two-way binding to the property use this event to observe changes.
+ * - `readOnly` (boolean): Creates a getter for the property, but no setter.
+ * To set a read-only property, use the private setter method
+ * `_setProperty(property, value)`.
+ * - `observer` (string): Observer method name that will be called when
+ * the property changes. The arguments of the method are
+ * `(value, previousValue)`.
+ * - `computed` (string): String describing method and dependent properties
+ * for computing the value of this property (e.g. `'computeFoo(bar, zot)'`).
+ * Computed properties are read-only by default and can only be changed
+ * via the return value of the computing method.
+ *
+ * - `static get observers()`: Array of strings describing multi-property
+ * observer methods and their dependent properties (e.g.
+ * `'observeABC(a, b, c)'`).
+ *
+ * The base class provides default implementations for the following standard
+ * custom element lifecycle callbacks; users may override these, but should
+ * call the super method to ensure
+ * - `constructor`: Run when the element is created or upgraded
+ * - `connectedCallback`: Run each time the element is connected to the
+ * document
+ * - `disconnectedCallback`: Run each time the element is disconnected from
+ * the document
+ * - `attributeChangedCallback`: Run each time an attribute in
+ * `observedAttributes` is set or removed (note: this element's default
+ * `observedAttributes` implementation will automatically return an array
+ * of dash-cased attributes based on `properties`)
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin PropertyEffects
+ * @appliesMixin PropertiesMixin
+ * @property rootPath {string} Set to the value of `rootPath`,
+ * which defaults to the main document path
+ * @property importPath {string} Set to the value of the class's static
+ * `importPath` property, which defaults to the path of this element's
+ * `dom-module` (when `is` is used), but can be overridden for other
+ * import strategies.
+ * @summary Element class mixin that provides the core API for Polymer's
+ * meta-programming features.
+ */
+export const ElementMixin = dedupingMixin(base => {
+
+ /**
+ * @constructor
+ * @extends {base}
+ * @implements {Polymer_PropertyEffects}
+ * @implements {Polymer_PropertiesMixin}
+ */
+ const polymerElementBase = PropertiesMixin(PropertyEffects(base));
+
+ /**
+ * Returns a list of properties with default values.
+ * This list is created as an optimization since it is a subset of
+ * the list returned from `_properties`.
+ * This list is used in `_initializeProperties` to set property defaults.
+ *
+ * @param {PolymerElementConstructor} constructor Element class
+ * @return {PolymerElementProperties} Flattened properties for this class
+ * that have default values
+ * @private
+ */
+ function propertyDefaults(constructor) {
+ if (!constructor.hasOwnProperty(
+ JSCompiler_renameProperty('__propertyDefaults', constructor))) {
+ constructor.__propertyDefaults = null;
+ let props = constructor._properties;
+ for (let p in props) {
+ let info = props[p];
+ if ('value' in info) {
+ constructor.__propertyDefaults = constructor.__propertyDefaults || {};
+ constructor.__propertyDefaults[p] = info;
+ }
+ }
+ }
+ return constructor.__propertyDefaults;
+ }
+
+ /**
+ * Returns a memoized version of the the `observers` array.
+ * @param {PolymerElementConstructor} constructor Element class
+ * @return {Array} Array containing own observers for the given class
+ * @protected
+ */
+ function ownObservers(constructor) {
+ if (!constructor.hasOwnProperty(
+ JSCompiler_renameProperty('__ownObservers', constructor))) {
+ constructor.__ownObservers =
+ constructor.hasOwnProperty(JSCompiler_renameProperty('observers', constructor)) ?
+ /** @type {PolymerElementConstructor} */ (constructor).observers : null;
+ }
+ return constructor.__ownObservers;
+ }
+
+ /**
+ * Creates effects for a property.
+ *
+ * Note, once a property has been set to
+ * `readOnly`, `computed`, `reflectToAttribute`, or `notify`
+ * these values may not be changed. For example, a subclass cannot
+ * alter these settings. However, additional `observers` may be added
+ * by subclasses.
+ *
+ * The info object should may contain property metadata as follows:
+ *
+ * * `type`: {function} type to which an attribute matching the property
+ * is deserialized. Note the property is camel-cased from a dash-cased
+ * attribute. For example, 'foo-bar' attribute is deserialized to a
+ * property named 'fooBar'.
+ *
+ * * `readOnly`: {boolean} creates a readOnly property and
+ * makes a private setter for the private of the form '_setFoo' for a
+ * property 'foo',
+ *
+ * * `computed`: {string} creates a computed property. A computed property
+ * also automatically is set to `readOnly: true`. The value is calculated
+ * by running a method and arguments parsed from the given string. For
+ * example 'compute(foo)' will compute a given property when the
+ * 'foo' property changes by executing the 'compute' method. This method
+ * must return the computed value.
+ *
+ * * `reflectToAttribute`: {boolean} If true, the property value is reflected
+ * to an attribute of the same name. Note, the attribute is dash-cased
+ * so a property named 'fooBar' is reflected as 'foo-bar'.
+ *
+ * * `notify`: {boolean} sends a non-bubbling notification event when
+ * the property changes. For example, a property named 'foo' sends an
+ * event named 'foo-changed' with `event.detail` set to the value of
+ * the property.
+ *
+ * * observer: {string} name of a method that runs when the property
+ * changes. The arguments of the method are (value, previousValue).
+ *
+ * Note: Users may want control over modifying property
+ * effects via subclassing. For example, a user might want to make a
+ * reflectToAttribute property not do so in a subclass. We've chosen to
+ * disable this because it leads to additional complication.
+ * For example, a readOnly effect generates a special setter. If a subclass
+ * disables the effect, the setter would fail unexpectedly.
+ * Based on feedback, we may want to try to make effects more malleable
+ * and/or provide an advanced api for manipulating them.
+ * Also consider adding warnings when an effect cannot be changed.
+ *
+ * @param {!PolymerElement} proto Element class prototype to add accessors
+ * and effects to
+ * @param {string} name Name of the property.
+ * @param {Object} info Info object from which to create property effects.
+ * Supported keys:
+ * @param {Object} allProps Flattened map of all properties defined in this
+ * element (including inherited properties)
+ * @return {void}
+ * @private
+ */
+ function createPropertyFromConfig(proto, name, info, allProps) {
+ // computed forces readOnly...
+ if (info.computed) {
+ info.readOnly = true;
+ }
+ // Note, since all computed properties are readOnly, this prevents
+ // adding additional computed property effects (which leads to a confusing
+ // setup where multiple triggers for setting a property)
+ // While we do have `hasComputedEffect` this is set on the property's
+ // dependencies rather than itself.
+ if (info.computed && !proto._hasReadOnlyEffect(name)) {
+ proto._createComputedProperty(name, info.computed, allProps);
+ }
+ if (info.readOnly && !proto._hasReadOnlyEffect(name)) {
+ proto._createReadOnlyProperty(name, !info.computed);
+ }
+ if (info.reflectToAttribute && !proto._hasReflectEffect(name)) {
+ proto._createReflectedProperty(name);
+ }
+ if (info.notify && !proto._hasNotifyEffect(name)) {
+ proto._createNotifyingProperty(name);
+ }
+ // always add observer
+ if (info.observer) {
+ proto._createPropertyObserver(name, info.observer, allProps[info.observer]);
+ }
+ // always create the mapping from attribute back to property for deserialization.
+ proto._addPropertyToAttributeMap(name);
+ }
+
+ /**
+ * Process all style elements in the element template. Styles with the
+ * `include` attribute are processed such that any styles in
+ * the associated "style modules" are included in the element template.
+ * @param {PolymerElementConstructor} klass Element class
+ * @param {!HTMLTemplateElement} template Template to process
+ * @param {string} is Name of element
+ * @param {string} baseURI Base URI for element
+ * @private
+ */
+ function processElementStyles(klass, template, is, baseURI) {
+ const templateStyles = template.content.querySelectorAll('style');
+ const stylesWithImports = stylesFromTemplate(template);
+ // insert styles from <link rel="import" type="css"> at the top of the template
+ const linkedStyles = stylesFromModuleImports(is);
+ const firstTemplateChild = template.content.firstElementChild;
+ for (let idx = 0; idx < linkedStyles.length; idx++) {
+ let s = linkedStyles[idx];
+ s.textContent = klass._processStyleText(s.textContent, baseURI);
+ template.content.insertBefore(s, firstTemplateChild);
+ }
+ // keep track of the last "concrete" style in the template we have encountered
+ let templateStyleIndex = 0;
+ // ensure all gathered styles are actually in this template.
+ for (let i = 0; i < stylesWithImports.length; i++) {
+ let s = stylesWithImports[i];
+ let templateStyle = templateStyles[templateStyleIndex];
+ // if the style is not in this template, it's been "included" and
+ // we put a clone of it in the template before the style that included it
+ if (templateStyle !== s) {
+ s = s.cloneNode(true);
+ templateStyle.parentNode.insertBefore(s, templateStyle);
+ } else {
+ templateStyleIndex++;
+ }
+ s.textContent = klass._processStyleText(s.textContent, baseURI);
+ }
+ if (window.ShadyCSS) {
+ window.ShadyCSS.prepareTemplate(template, is);
+ }
+ }
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @unrestricted
+ * @implements {Polymer_ElementMixin}
+ */
+ class PolymerElement extends polymerElementBase {
+
+ /**
+ * Override of PropertiesMixin _finalizeClass to create observers and
+ * find the template.
+ * @return {void}
+ * @protected
+ * @override
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static _finalizeClass() {
+ super._finalizeClass();
+ if (this.hasOwnProperty(
+ JSCompiler_renameProperty('is', this)) && this.is) {
+ register(this.prototype);
+ }
+ const observers = ownObservers(this);
+ if (observers) {
+ this.createObservers(observers, this._properties);
+ }
+ // note: create "working" template that is finalized at instance time
+ let template = /** @type {PolymerElementConstructor} */ (this).template;
+ if (template) {
+ if (typeof template === 'string') {
+ console.error('template getter must return HTMLTemplateElement');
+ template = null;
+ } else {
+ template = template.cloneNode(true);
+ }
+ }
+
+ this.prototype._template = template;
+ }
+
+ /**
+ * Override of PropertiesChanged createProperties to create accessors
+ * and property effects for all of the properties.
+ * @return {void}
+ * @protected
+ * @override
+ */
+ static createProperties(props) {
+ for (let p in props) {
+ createPropertyFromConfig(this.prototype, p, props[p], props);
+ }
+ }
+
+ /**
+ * Creates observers for the given `observers` array.
+ * Leverages `PropertyEffects` to create observers.
+ * @param {Object} observers Array of observer descriptors for
+ * this class
+ * @param {Object} dynamicFns Object containing keys for any properties
+ * that are functions and should trigger the effect when the function
+ * reference is changed
+ * @return {void}
+ * @protected
+ */
+ static createObservers(observers, dynamicFns) {
+ const proto = this.prototype;
+ for (let i=0; i < observers.length; i++) {
+ proto._createMethodObserver(observers[i], dynamicFns);
+ }
+ }
+
+ /**
+ * Returns the template that will be stamped into this element's shadow root.
+ *
+ * If a `static get is()` getter is defined, the default implementation
+ * will return the first `<template>` in a `dom-module` whose `id`
+ * matches this element's `is`.
+ *
+ * Users may override this getter to return an arbitrary template
+ * (in which case the `is` getter is unnecessary). The template returned
+ * may be either an `HTMLTemplateElement` or a string that will be
+ * automatically parsed into a template.
+ *
+ * Note that when subclassing, if the super class overrode the default
+ * implementation and the subclass would like to provide an alternate
+ * template via a `dom-module`, it should override this getter and
+ * return `DomModule.import(this.is, 'template')`.
+ *
+ * If a subclass would like to modify the super class template, it should
+ * clone it rather than modify it in place. If the getter does expensive
+ * work such as cloning/modifying a template, it should memoize the
+ * template for maximum performance:
+ *
+ * let memoizedTemplate;
+ * class MySubClass extends MySuperClass {
+ * static get template() {
+ * if (!memoizedTemplate) {
+ * memoizedTemplate = super.template.cloneNode(true);
+ * let subContent = document.createElement('div');
+ * subContent.textContent = 'This came from MySubClass';
+ * memoizedTemplate.content.appendChild(subContent);
+ * }
+ * return memoizedTemplate;
+ * }
+ * }
+ *
+ * @return {HTMLTemplateElement|string} Template to be stamped
+ */
+ static get template() {
+ if (!this.hasOwnProperty(JSCompiler_renameProperty('_template', this))) {
+ this._template = DomModule && DomModule.import(
+ /** @type {PolymerElementConstructor}*/ (this).is, 'template') ||
+ // note: implemented so a subclass can retrieve the super
+ // template; call the super impl this way so that `this` points
+ // to the superclass.
+ Object.getPrototypeOf(/** @type {PolymerElementConstructor}*/ (this).prototype).constructor.template;
+ }
+ return this._template;
+ }
+
+ /**
+ * Path matching the url from which the element was imported.
+ *
+ * This path is used to resolve url's in template style cssText.
+ * The `importPath` property is also set on element instances and can be
+ * used to create bindings relative to the import path.
+ *
+ * For elements defined in ES modules, users should implement
+ * `static get importMeta() { return import.meta; }`, and the default
+ * implementation of `importPath` will return `import.meta.url`'s path.
+ * For elements defined in HTML imports, this getter will return the path
+ * to the document containing a `dom-module` element matching this
+ * element's static `is` property.
+ *
+ * Note, this path should contain a trailing `/`.
+ *
+ * @return {string} The import path for this element class
+ * @suppress {missingProperties}
+ */
+ static get importPath() {
+ if (!this.hasOwnProperty(JSCompiler_renameProperty('_importPath', this))) {
+ const meta = this.importMeta;
+ if (meta) {
+ this._importPath = pathFromUrl(meta.url);
+ } else {
+ const module = DomModule && DomModule.import(/** @type {PolymerElementConstructor} */ (this).is);
+ this._importPath = (module && module.assetpath) ||
+ Object.getPrototypeOf(/** @type {PolymerElementConstructor}*/ (this).prototype).constructor.importPath;
+ }
+ }
+ return this._importPath;
+ }
+
+ constructor() {
+ super();
+ /** @type {HTMLTemplateElement} */
+ this._template;
+ /** @type {string} */
+ this._importPath;
+ /** @type {string} */
+ this.rootPath;
+ /** @type {string} */
+ this.importPath;
+ /** @type {StampedTemplate | HTMLElement | ShadowRoot} */
+ this.root;
+ /** @type {!Object<string, !Element>} */
+ this.$;
+ }
+
+ /**
+ * Overrides the default `PropertyAccessors` to ensure class
+ * metaprogramming related to property accessors and effects has
+ * completed (calls `finalize`).
+ *
+ * It also initializes any property defaults provided via `value` in
+ * `properties` metadata.
+ *
+ * @return {void}
+ * @override
+ * @suppress {invalidCasts}
+ */
+ _initializeProperties() {
+ instanceCount++;
+ this.constructor.finalize();
+ // note: finalize template when we have access to `localName` to
+ // avoid dependence on `is` for polyfilling styling.
+ this.constructor._finalizeTemplate(/** @type {!HTMLElement} */(this).localName);
+ super._initializeProperties();
+ // set path defaults
+ this.rootPath = rootPath$0;
+ this.importPath = this.constructor.importPath;
+ // apply property defaults...
+ let p$ = propertyDefaults(this.constructor);
+ if (!p$) {
+ return;
+ }
+ for (let p in p$) {
+ let info = p$[p];
+ // Don't set default value if there is already an own property, which
+ // happens when a `properties` property with default but no effects had
+ // a property set (e.g. bound) by its host before upgrade
+ if (!this.hasOwnProperty(p)) {
+ let value = typeof info.value == 'function' ?
+ info.value.call(this) :
+ info.value;
+ // Set via `_setProperty` if there is an accessor, to enable
+ // initializing readOnly property defaults
+ if (this._hasAccessor(p)) {
+ this._setPendingProperty(p, value, true);
+ } else {
+ this[p] = value;
+ }
+ }
+ }
+ }
+
+ /**
+ * Gather style text for a style element in the template.
+ *
+ * @param {string} cssText Text containing styling to process
+ * @param {string} baseURI Base URI to rebase CSS paths against
+ * @return {string} The processed CSS text
+ * @protected
+ */
+ static _processStyleText(cssText, baseURI) {
+ return resolveCss(cssText, baseURI);
+ }
+
+ /**
+ * Configures an element `proto` to function with a given `template`.
+ * The element name `is` and extends `ext` must be specified for ShadyCSS
+ * style scoping.
+ *
+ * @param {string} is Tag name (or type extension name) for this element
+ * @return {void}
+ * @protected
+ */
+ static _finalizeTemplate(is) {
+ /** @const {HTMLTemplateElement} */
+ const template = this.prototype._template;
+ if (template && !template.__polymerFinalized) {
+ template.__polymerFinalized = true;
+ const importPath = this.importPath;
+ const baseURI = importPath ? resolveUrl$0(importPath) : '';
+ // e.g. support `include="module-name"`, and ShadyCSS
+ processElementStyles(this, template, is, baseURI);
+ this.prototype._bindTemplate(template);
+ }
+ }
+
+ /**
+ * Provides a default implementation of the standard Custom Elements
+ * `connectedCallback`.
+ *
+ * The default implementation enables the property effects system and
+ * flushes any pending properties, and updates shimmed CSS properties
+ * when using the ShadyCSS scoping/custom properties polyfill.
+ *
+ * @suppress {missingProperties, invalidCasts} Super may or may not implement the callback
+ * @return {void}
+ */
+ connectedCallback() {
+ if (window.ShadyCSS && this._template) {
+ window.ShadyCSS.styleElement(/** @type {!HTMLElement} */(this));
+ }
+ super.connectedCallback();
+ }
+
+ /**
+ * Stamps the element template.
+ *
+ * @return {void}
+ * @override
+ */
+ ready() {
+ if (this._template) {
+ this.root = this._stampTemplate(this._template);
+ this.$ = this.root.$;
+ }
+ super.ready();
+ }
+
+ /**
+ * Implements `PropertyEffects`'s `_readyClients` call. Attaches
+ * element dom by calling `_attachDom` with the dom stamped from the
+ * element's template via `_stampTemplate`. Note that this allows
+ * client dom to be attached to the element prior to any observers
+ * running.
+ *
+ * @return {void}
+ * @override
+ */
+ _readyClients() {
+ if (this._template) {
+ this.root = this._attachDom(/** @type {StampedTemplate} */(this.root));
+ }
+ // The super._readyClients here sets the clients initialized flag.
+ // We must wait to do this until after client dom is created/attached
+ // so that this flag can be checked to prevent notifications fired
+ // during this process from being handled before clients are ready.
+ super._readyClients();
+ }
+
+
+ /**
+ * Attaches an element's stamped dom to itself. By default,
+ * this method creates a `shadowRoot` and adds the dom to it.
+ * However, this method may be overridden to allow an element
+ * to put its dom in another location.
+ *
+ * @throws {Error}
+ * @suppress {missingReturn}
+ * @param {StampedTemplate} dom to attach to the element.
+ * @return {ShadowRoot} node to which the dom has been attached.
+ */
+ _attachDom(dom) {
+ if (this.attachShadow) {
+ if (dom) {
+ if (!this.shadowRoot) {
+ this.attachShadow({mode: 'open'});
+ }
+ this.shadowRoot.appendChild(dom);
+ return this.shadowRoot;
+ }
+ return null;
+ } else {
+ throw new Error('ShadowDOM not available. ' +
+ // TODO(sorvell): move to compile-time conditional when supported
+ 'PolymerElement can create dom as children instead of in ' +
+ 'ShadowDOM by setting `this.root = this;\` before \`ready\`.');
+ }
+ }
+
+ /**
+ * When using the ShadyCSS scoping and custom property shim, causes all
+ * shimmed styles in this element (and its subtree) to be updated
+ * based on current custom property values.
+ *
+ * The optional parameter overrides inline custom property styles with an
+ * object of properties where the keys are CSS properties, and the values
+ * are strings.
+ *
+ * Example: `this.updateStyles({'--color': 'blue'})`
+ *
+ * These properties are retained unless a value of `null` is set.
+ *
+ * Note: This function does not support updating CSS mixins.
+ * You can not dynamically change the value of an `@apply`.
+ *
+ * @param {Object=} properties Bag of custom property key/values to
+ * apply to this element.
+ * @return {void}
+ * @suppress {invalidCasts}
+ */
+ updateStyles(properties) {
+ if (window.ShadyCSS) {
+ window.ShadyCSS.styleSubtree(/** @type {!HTMLElement} */(this), properties);
+ }
+ }
+
+ /**
+ * Rewrites a given URL relative to a base URL. The base URL defaults to
+ * the original location of the document containing the `dom-module` for
+ * this element. This method will return the same URL before and after
+ * bundling.
+ *
+ * Note that this function performs no resolution for URLs that start
+ * with `/` (absolute URLs) or `#` (hash identifiers). For general purpose
+ * URL resolution, use `window.URL`.
+ *
+ * @param {string} url URL to resolve.
+ * @param {string=} base Optional base URL to resolve against, defaults
+ * to the element's `importPath`
+ * @return {string} Rewritten URL relative to base
+ */
+ resolveUrl(url, base) {
+ if (!base && this.importPath) {
+ base = resolveUrl$0(this.importPath);
+ }
+ return resolveUrl$0(url, base);
+ }
+
+ /**
+ * Overrides `PropertyAccessors` to add map of dynamic functions on
+ * template info, for consumption by `PropertyEffects` template binding
+ * code. This map determines which method templates should have accessors
+ * created for them.
+ *
+ * @override
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static _parseTemplateContent(template, templateInfo, nodeInfo) {
+ templateInfo.dynamicFns = templateInfo.dynamicFns || this._properties;
+ return super._parseTemplateContent(template, templateInfo, nodeInfo);
+ }
+
+ }
+
+ return PolymerElement;
+});
+
+/**
+ * Provides basic tracking of element definitions (registrations) and
+ * instance counts.
+ *
+ * @summary Provides basic tracking of element definitions (registrations) and
+ * instance counts.
+ */
+`TODO(modulizer): A namespace named Polymer.telemetry was
+declared here. The surrounding comments should be reviewed,
+and this string can then be deleted`;
+
+/**
+ * Total number of Polymer element instances created.
+ * @type {number}
+ */
+export let instanceCount = 0;
+
+/**
+ * Array of Polymer element classes that have been finalized.
+ * @type {Array<PolymerElement>}
+ */
+export const registrations = [];
+
+/**
+ * @param {!PolymerElementConstructor} prototype Element prototype to log
+ * @this {this}
+ * @private
+ */
+function _regLog(prototype) {
+ console.log('[' + prototype.is + ']: registered');
+}
+
+/**
+ * Registers a class prototype for telemetry purposes.
+ * @param {HTMLElement} prototype Element prototype to register
+ * @this {this}
+ * @protected
+ */
+export function register(prototype) {
+ registrations.push(prototype);
+ undefined && _regLog(prototype);
+}
+
+/**
+ * Logs all elements registered with an `is` to the console.
+ * @public
+ * @this {this}
+ */
+export function dumpRegistrations() {
+ registrations.forEach(_regLog);
+}
+
+/**
+ * When using the ShadyCSS scoping and custom property shim, causes all
+ * shimmed `styles` (via `custom-style`) in the document (and its subtree)
+ * to be updated based on current custom property values.
+ *
+ * The optional parameter overrides inline custom property styles with an
+ * object of properties where the keys are CSS properties, and the values
+ * are strings.
+ *
+ * Example: `updateStyles({'--color': 'blue'})`
+ *
+ * These properties are retained unless a value of `null` is set.
+ *
+ * @param {Object=} props Bag of custom property key/values to
+ * apply to the document.
+ * @return {void}
+ */
+export const updateStyles = function(props) {
+ if (window.ShadyCSS) {
+ window.ShadyCSS.styleDocument(props);
+ }
+};
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/gesture-event-listeners.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/gesture-event-listeners.js
new file mode 100644
index 00000000000..af1bd0dde91
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/gesture-event-listeners.js
@@ -0,0 +1,73 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../utils/boot.js';
+
+import { dedupingMixin } from '../utils/mixin.js';
+import * as gestures$0 from '../utils/gestures.js';
+
+const gestures = gestures$0;
+
+/**
+ * Element class mixin that provides API for adding Polymer's cross-platform
+ * gesture events to nodes.
+ *
+ * The API is designed to be compatible with override points implemented
+ * in `TemplateStamp` such that declarative event listeners in
+ * templates will support gesture events when this mixin is applied along with
+ * `TemplateStamp`.
+ *
+ * @mixinFunction
+ * @polymer
+ * @summary Element class mixin that provides API for adding Polymer's
+ * cross-platform
+ * gesture events to nodes
+ */
+export const GestureEventListeners = dedupingMixin(superClass => {
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_GestureEventListeners}
+ */
+ class GestureEventListeners extends superClass {
+
+ /**
+ * Add the event listener to the node if it is a gestures event.
+ *
+ * @param {!Node} node Node to add event listener to
+ * @param {string} eventName Name of event
+ * @param {function(!Event):void} handler Listener function to add
+ * @return {void}
+ */
+ _addEventListenerToNode(node, eventName, handler) {
+ if (!gestures.addListener(node, eventName, handler)) {
+ super._addEventListenerToNode(node, eventName, handler);
+ }
+ }
+
+ /**
+ * Remove the event listener to the node if it is a gestures event.
+ *
+ * @param {!Node} node Node to remove event listener from
+ * @param {string} eventName Name of event
+ * @param {function(!Event):void} handler Listener function to remove
+ * @return {void}
+ */
+ _removeEventListenerFromNode(node, eventName, handler) {
+ if (!gestures.removeListener(node, eventName, handler)) {
+ super._removeEventListenerFromNode(node, eventName, handler);
+ }
+ }
+
+ }
+
+ return GestureEventListeners;
+
+});
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/mutable-data.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/mutable-data.js
new file mode 100644
index 00000000000..3c937b94e81
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/mutable-data.js
@@ -0,0 +1,194 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { dedupingMixin } from '../utils/mixin.js';
+
+// Common implementation for mixin & behavior
+function mutablePropertyChange(inst, property, value, old, mutableData) {
+ let isObject;
+ if (mutableData) {
+ isObject = (typeof value === 'object' && value !== null);
+ // Pull `old` for Objects from temp cache, but treat `null` as a primitive
+ if (isObject) {
+ old = inst.__dataTemp[property];
+ }
+ }
+ // Strict equality check, but return false for NaN===NaN
+ let shouldChange = (old !== value && (old === old || value === value));
+ // Objects are stored in temporary cache (cleared at end of
+ // turn), which is used for dirty-checking
+ if (isObject && shouldChange) {
+ inst.__dataTemp[property] = value;
+ }
+ return shouldChange;
+}
+
+/**
+ * Element class mixin to skip strict dirty-checking for objects and arrays
+ * (always consider them to be "dirty"), for use on elements utilizing
+ * `PropertyEffects`
+ *
+ * By default, `PropertyEffects` performs strict dirty checking on
+ * objects, which means that any deep modifications to an object or array will
+ * not be propagated unless "immutable" data patterns are used (i.e. all object
+ * references from the root to the mutation were changed).
+ *
+ * Polymer also provides a proprietary data mutation and path notification API
+ * (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient
+ * mutation and notification of deep changes in an object graph to all elements
+ * bound to the same object graph.
+ *
+ * In cases where neither immutable patterns nor the data mutation API can be
+ * used, applying this mixin will cause Polymer to skip dirty checking for
+ * objects and arrays (always consider them to be "dirty"). This allows a
+ * user to make a deep modification to a bound object graph, and then either
+ * simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath`
+ * (e.g. `this.notifyPath('items')`) to update the tree. Note that all
+ * elements that wish to be updated based on deep mutations must apply this
+ * mixin or otherwise skip strict dirty checking for objects/arrays.
+ * Specifically, any elements in the binding tree between the source of a
+ * mutation and the consumption of it must apply this mixin or enable the
+ * `OptionalMutableData` mixin.
+ *
+ * In order to make the dirty check strategy configurable, see
+ * `OptionalMutableData`.
+ *
+ * Note, the performance characteristics of propagating large object graphs
+ * will be worse as opposed to using strict dirty checking with immutable
+ * patterns or Polymer's path notification API.
+ *
+ * @mixinFunction
+ * @polymer
+ * @summary Element class mixin to skip strict dirty-checking for objects
+ * and arrays
+ */
+export const MutableData = dedupingMixin(superClass => {
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_MutableData}
+ */
+ class MutableData extends superClass {
+ /**
+ * Overrides `PropertyEffects` to provide option for skipping
+ * strict equality checking for Objects and Arrays.
+ *
+ * This method pulls the value to dirty check against from the `__dataTemp`
+ * cache (rather than the normal `__data` cache) for Objects. Since the temp
+ * cache is cleared at the end of a turn, this implementation allows
+ * side-effects of deep object changes to be processed by re-setting the
+ * same object (using the temp cache as an in-turn backstop to prevent
+ * cycles due to 2-way notification).
+ *
+ * @param {string} property Property name
+ * @param {*} value New property value
+ * @param {*} old Previous property value
+ * @return {boolean} Whether the property should be considered a change
+ * @protected
+ */
+ _shouldPropertyChange(property, value, old) {
+ return mutablePropertyChange(this, property, value, old, true);
+ }
+
+ }
+
+ return MutableData;
+
+});
+
+/**
+ * Element class mixin to add the optional ability to skip strict
+ * dirty-checking for objects and arrays (always consider them to be
+ * "dirty") by setting a `mutable-data` attribute on an element instance.
+ *
+ * By default, `PropertyEffects` performs strict dirty checking on
+ * objects, which means that any deep modifications to an object or array will
+ * not be propagated unless "immutable" data patterns are used (i.e. all object
+ * references from the root to the mutation were changed).
+ *
+ * Polymer also provides a proprietary data mutation and path notification API
+ * (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient
+ * mutation and notification of deep changes in an object graph to all elements
+ * bound to the same object graph.
+ *
+ * In cases where neither immutable patterns nor the data mutation API can be
+ * used, applying this mixin will allow Polymer to skip dirty checking for
+ * objects and arrays (always consider them to be "dirty"). This allows a
+ * user to make a deep modification to a bound object graph, and then either
+ * simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath`
+ * (e.g. `this.notifyPath('items')`) to update the tree. Note that all
+ * elements that wish to be updated based on deep mutations must apply this
+ * mixin or otherwise skip strict dirty checking for objects/arrays.
+ * Specifically, any elements in the binding tree between the source of a
+ * mutation and the consumption of it must enable this mixin or apply the
+ * `MutableData` mixin.
+ *
+ * While this mixin adds the ability to forgo Object/Array dirty checking,
+ * the `mutableData` flag defaults to false and must be set on the instance.
+ *
+ * Note, the performance characteristics of propagating large object graphs
+ * will be worse by relying on `mutableData: true` as opposed to using
+ * strict dirty checking with immutable patterns or Polymer's path notification
+ * API.
+ *
+ * @mixinFunction
+ * @polymer
+ * @summary Element class mixin to optionally skip strict dirty-checking
+ * for objects and arrays
+ */
+export const OptionalMutableData = dedupingMixin(superClass => {
+
+ /**
+ * @mixinClass
+ * @polymer
+ * @implements {Polymer_OptionalMutableData}
+ */
+ class OptionalMutableData extends superClass {
+
+ static get properties() {
+ return {
+ /**
+ * Instance-level flag for configuring the dirty-checking strategy
+ * for this element. When true, Objects and Arrays will skip dirty
+ * checking, otherwise strict equality checking will be used.
+ */
+ mutableData: Boolean
+ };
+ }
+
+ /**
+ * Overrides `PropertyEffects` to provide option for skipping
+ * strict equality checking for Objects and Arrays.
+ *
+ * When `this.mutableData` is true on this instance, this method
+ * pulls the value to dirty check against from the `__dataTemp` cache
+ * (rather than the normal `__data` cache) for Objects. Since the temp
+ * cache is cleared at the end of a turn, this implementation allows
+ * side-effects of deep object changes to be processed by re-setting the
+ * same object (using the temp cache as an in-turn backstop to prevent
+ * cycles due to 2-way notification).
+ *
+ * @param {string} property Property name
+ * @param {*} value New property value
+ * @param {*} old Previous property value
+ * @return {boolean} Whether the property should be considered a change
+ * @protected
+ */
+ _shouldPropertyChange(property, value, old) {
+ return mutablePropertyChange(this, property, value, old, this.mutableData);
+ }
+ }
+
+ return OptionalMutableData;
+
+});
+
+// Export for use by legacy behavior
+MutableData._mutablePropertyChange = mutablePropertyChange;
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/properties-changed.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/properties-changed.js
new file mode 100644
index 00000000000..7922bcf233b
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/properties-changed.js
@@ -0,0 +1,524 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../utils/boot.js';
+
+import { dedupingMixin } from '../utils/mixin.js';
+import { microTask } from '../utils/async.js';
+
+/** @const {!AsyncInterface} */
+const microtask = microTask;
+
+/**
+ * Element class mixin that provides basic meta-programming for creating one
+ * or more property accessors (getter/setter pair) that enqueue an async
+ * (batched) `_propertiesChanged` callback.
+ *
+ * For basic usage of this mixin, call `MyClass.createProperties(props)`
+ * once at class definition time to create property accessors for properties
+ * named in props, implement `_propertiesChanged` to react as desired to
+ * property changes, and implement `static get observedAttributes()` and
+ * include lowercase versions of any property names that should be set from
+ * attributes. Last, call `this._enableProperties()` in the element's
+ * `connectedCallback` to enable the accessors.
+ *
+ * @mixinFunction
+ * @polymer
+ * @summary Element class mixin for reacting to property changes from
+ * generated property accessors.
+ */
+export const PropertiesChanged = dedupingMixin(superClass => {
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @extends {superClass}
+ * @implements {Polymer_PropertiesChanged}
+ * @unrestricted
+ */
+ class PropertiesChanged extends superClass {
+
+ /**
+ * Creates property accessors for the given property names.
+ * @param {!Object} props Object whose keys are names of accessors.
+ * @return {void}
+ * @protected
+ */
+ static createProperties(props) {
+ const proto = this.prototype;
+ for (let prop in props) {
+ // don't stomp an existing accessor
+ if (!(prop in proto)) {
+ proto._createPropertyAccessor(prop);
+ }
+ }
+ }
+
+ /**
+ * Returns an attribute name that corresponds to the given property.
+ * The attribute name is the lowercased property name. Override to
+ * customize this mapping.
+ * @param {string} property Property to convert
+ * @return {string} Attribute name corresponding to the given property.
+ *
+ * @protected
+ */
+ static attributeNameForProperty(property) {
+ return property.toLowerCase();
+ }
+
+ /**
+ * Override point to provide a type to which to deserialize a value to
+ * a given property.
+ * @param {string} name Name of property
+ *
+ * @protected
+ */
+ static typeForProperty(name) { } //eslint-disable-line no-unused-vars
+
+ /**
+ * Creates a setter/getter pair for the named property with its own
+ * local storage. The getter returns the value in the local storage,
+ * and the setter calls `_setProperty`, which updates the local storage
+ * for the property and enqueues a `_propertiesChanged` callback.
+ *
+ * This method may be called on a prototype or an instance. Calling
+ * this method may overwrite a property value that already exists on
+ * the prototype/instance by creating the accessor.
+ *
+ * @param {string} property Name of the property
+ * @param {boolean=} readOnly When true, no setter is created; the
+ * protected `_setProperty` function must be used to set the property
+ * @return {void}
+ * @protected
+ */
+ _createPropertyAccessor(property, readOnly) {
+ this._addPropertyToAttributeMap(property);
+ if (!this.hasOwnProperty('__dataHasAccessor')) {
+ this.__dataHasAccessor = Object.assign({}, this.__dataHasAccessor);
+ }
+ if (!this.__dataHasAccessor[property]) {
+ this.__dataHasAccessor[property] = true;
+ this._definePropertyAccessor(property, readOnly);
+ }
+ }
+
+ /**
+ * Adds the given `property` to a map matching attribute names
+ * to property names, using `attributeNameForProperty`. This map is
+ * used when deserializing attribute values to properties.
+ *
+ * @param {string} property Name of the property
+ */
+ _addPropertyToAttributeMap(property) {
+ if (!this.hasOwnProperty('__dataAttributes')) {
+ this.__dataAttributes = Object.assign({}, this.__dataAttributes);
+ }
+ if (!this.__dataAttributes[property]) {
+ const attr = this.constructor.attributeNameForProperty(property);
+ this.__dataAttributes[attr] = property;
+ }
+ }
+
+ /**
+ * Defines a property accessor for the given property.
+ * @param {string} property Name of the property
+ * @param {boolean=} readOnly When true, no setter is created
+ * @return {void}
+ */
+ _definePropertyAccessor(property, readOnly) {
+ Object.defineProperty(this, property, {
+ /* eslint-disable valid-jsdoc */
+ /** @this {PropertiesChanged} */
+ get() {
+ return this._getProperty(property);
+ },
+ /** @this {PropertiesChanged} */
+ set: readOnly ? function () {} : function (value) {
+ this._setProperty(property, value);
+ }
+ /* eslint-enable */
+ });
+ }
+
+ constructor() {
+ super();
+ this.__dataEnabled = false;
+ this.__dataReady = false;
+ this.__dataInvalid = false;
+ this.__data = {};
+ this.__dataPending = null;
+ this.__dataOld = null;
+ this.__dataInstanceProps = null;
+ this.__serializing = false;
+ this._initializeProperties();
+ }
+
+ /**
+ * Lifecycle callback called when properties are enabled via
+ * `_enableProperties`.
+ *
+ * Users may override this function to implement behavior that is
+ * dependent on the element having its property data initialized, e.g.
+ * from defaults (initialized from `constructor`, `_initializeProperties`),
+ * `attributeChangedCallback`, or values propagated from host e.g. via
+ * bindings. `super.ready()` must be called to ensure the data system
+ * becomes enabled.
+ *
+ * @return {void}
+ * @public
+ */
+ ready() {
+ this.__dataReady = true;
+ this._flushProperties();
+ }
+
+ /**
+ * Initializes the local storage for property accessors.
+ *
+ * Provided as an override point for performing any setup work prior
+ * to initializing the property accessor system.
+ *
+ * @return {void}
+ * @protected
+ */
+ _initializeProperties() {
+ // Capture instance properties; these will be set into accessors
+ // during first flush. Don't set them here, since we want
+ // these to overwrite defaults/constructor assignments
+ for (let p in this.__dataHasAccessor) {
+ if (this.hasOwnProperty(p)) {
+ this.__dataInstanceProps = this.__dataInstanceProps || {};
+ this.__dataInstanceProps[p] = this[p];
+ delete this[p];
+ }
+ }
+ }
+
+ /**
+ * Called at ready time with bag of instance properties that overwrote
+ * accessors when the element upgraded.
+ *
+ * The default implementation sets these properties back into the
+ * setter at ready time. This method is provided as an override
+ * point for customizing or providing more efficient initialization.
+ *
+ * @param {Object} props Bag of property values that were overwritten
+ * when creating property accessors.
+ * @return {void}
+ * @protected
+ */
+ _initializeInstanceProperties(props) {
+ Object.assign(this, props);
+ }
+
+ /**
+ * Updates the local storage for a property (via `_setPendingProperty`)
+ * and enqueues a `_proeprtiesChanged` callback.
+ *
+ * @param {string} property Name of the property
+ * @param {*} value Value to set
+ * @return {void}
+ * @protected
+ */
+ _setProperty(property, value) {
+ if (this._setPendingProperty(property, value)) {
+ this._invalidateProperties();
+ }
+ }
+
+ /**
+ * Returns the value for the given property.
+ * @param {string} property Name of property
+ * @return {*} Value for the given property
+ * @protected
+ */
+ _getProperty(property) {
+ return this.__data[property];
+ }
+
+ /* eslint-disable no-unused-vars */
+ /**
+ * Updates the local storage for a property, records the previous value,
+ * and adds it to the set of "pending changes" that will be passed to the
+ * `_propertiesChanged` callback. This method does not enqueue the
+ * `_propertiesChanged` callback.
+ *
+ * @param {string} property Name of the property
+ * @param {*} value Value to set
+ * @param {boolean=} ext Not used here; affordance for closure
+ * @return {boolean} Returns true if the property changed
+ * @protected
+ */
+ _setPendingProperty(property, value, ext) {
+ let old = this.__data[property];
+ let changed = this._shouldPropertyChange(property, value, old);
+ if (changed) {
+ if (!this.__dataPending) {
+ this.__dataPending = {};
+ this.__dataOld = {};
+ }
+ // Ensure old is captured from the last turn
+ if (this.__dataOld && !(property in this.__dataOld)) {
+ this.__dataOld[property] = old;
+ }
+ this.__data[property] = value;
+ this.__dataPending[property] = value;
+ }
+ return changed;
+ }
+ /* eslint-enable */
+
+ /**
+ * Marks the properties as invalid, and enqueues an async
+ * `_propertiesChanged` callback.
+ *
+ * @return {void}
+ * @protected
+ */
+ _invalidateProperties() {
+ if (!this.__dataInvalid && this.__dataReady) {
+ this.__dataInvalid = true;
+ microtask.run(() => {
+ if (this.__dataInvalid) {
+ this.__dataInvalid = false;
+ this._flushProperties();
+ }
+ });
+ }
+ }
+
+ /**
+ * Call to enable property accessor processing. Before this method is
+ * called accessor values will be set but side effects are
+ * queued. When called, any pending side effects occur immediately.
+ * For elements, generally `connectedCallback` is a normal spot to do so.
+ * It is safe to call this method multiple times as it only turns on
+ * property accessors once.
+ *
+ * @return {void}
+ * @protected
+ */
+ _enableProperties() {
+ if (!this.__dataEnabled) {
+ this.__dataEnabled = true;
+ if (this.__dataInstanceProps) {
+ this._initializeInstanceProperties(this.__dataInstanceProps);
+ this.__dataInstanceProps = null;
+ }
+ this.ready();
+ }
+ }
+
+ /**
+ * Calls the `_propertiesChanged` callback with the current set of
+ * pending changes (and old values recorded when pending changes were
+ * set), and resets the pending set of changes. Generally, this method
+ * should not be called in user code.
+ *
+ * @return {void}
+ * @protected
+ */
+ _flushProperties() {
+ const props = this.__data;
+ const changedProps = this.__dataPending;
+ const old = this.__dataOld;
+ if (this._shouldPropertiesChange(props, changedProps, old)) {
+ this.__dataPending = null;
+ this.__dataOld = null;
+ this._propertiesChanged(props, changedProps, old);
+ }
+ }
+
+ /**
+ * Called in `_flushProperties` to determine if `_propertiesChanged`
+ * should be called. The default implementation returns true if
+ * properties are pending. Override to customize when
+ * `_propertiesChanged` is called.
+ * @param {!Object} currentProps Bag of all current accessor values
+ * @param {!Object} changedProps Bag of properties changed since the last
+ * call to `_propertiesChanged`
+ * @param {!Object} oldProps Bag of previous values for each property
+ * in `changedProps`
+ * @return {boolean} true if changedProps is truthy
+ */
+ _shouldPropertiesChange(currentProps, changedProps, oldProps) { // eslint-disable-line no-unused-vars
+ return Boolean(changedProps);
+ }
+
+ /**
+ * Callback called when any properties with accessors created via
+ * `_createPropertyAccessor` have been set.
+ *
+ * @param {!Object} currentProps Bag of all current accessor values
+ * @param {!Object} changedProps Bag of properties changed since the last
+ * call to `_propertiesChanged`
+ * @param {!Object} oldProps Bag of previous values for each property
+ * in `changedProps`
+ * @return {void}
+ * @protected
+ */
+ _propertiesChanged(currentProps, changedProps, oldProps) { // eslint-disable-line no-unused-vars
+ }
+
+ /**
+ * Method called to determine whether a property value should be
+ * considered as a change and cause the `_propertiesChanged` callback
+ * to be enqueued.
+ *
+ * The default implementation returns `true` if a strict equality
+ * check fails. The method always returns false for `NaN`.
+ *
+ * Override this method to e.g. provide stricter checking for
+ * Objects/Arrays when using immutable patterns.
+ *
+ * @param {string} property Property name
+ * @param {*} value New property value
+ * @param {*} old Previous property value
+ * @return {boolean} Whether the property should be considered a change
+ * and enqueue a `_proeprtiesChanged` callback
+ * @protected
+ */
+ _shouldPropertyChange(property, value, old) {
+ return (
+ // Strict equality check
+ (old !== value &&
+ // This ensures (old==NaN, value==NaN) always returns false
+ (old === old || value === value))
+ );
+ }
+
+ /**
+ * Implements native Custom Elements `attributeChangedCallback` to
+ * set an attribute value to a property via `_attributeToProperty`.
+ *
+ * @param {string} name Name of attribute that changed
+ * @param {?string} old Old attribute value
+ * @param {?string} value New attribute value
+ * @param {?string} namespace Attribute namespace.
+ * @return {void}
+ * @suppress {missingProperties} Super may or may not implement the callback
+ */
+ attributeChangedCallback(name, old, value, namespace) {
+ if (old !== value) {
+ this._attributeToProperty(name, value);
+ }
+ if (super.attributeChangedCallback) {
+ super.attributeChangedCallback(name, old, value, namespace);
+ }
+ }
+
+ /**
+ * Deserializes an attribute to its associated property.
+ *
+ * This method calls the `_deserializeValue` method to convert the string to
+ * a typed value.
+ *
+ * @param {string} attribute Name of attribute to deserialize.
+ * @param {?string} value of the attribute.
+ * @param {*=} type type to deserialize to, defaults to the value
+ * returned from `typeForProperty`
+ * @return {void}
+ */
+ _attributeToProperty(attribute, value, type) {
+ if (!this.__serializing) {
+ const map = this.__dataAttributes;
+ const property = map && map[attribute] || attribute;
+ this[property] = this._deserializeValue(value, type ||
+ this.constructor.typeForProperty(property));
+ }
+ }
+
+ /**
+ * Serializes a property to its associated attribute.
+ *
+ * @suppress {invalidCasts} Closure can't figure out `this` is an element.
+ *
+ * @param {string} property Property name to reflect.
+ * @param {string=} attribute Attribute name to reflect to.
+ * @param {*=} value Property value to refect.
+ * @return {void}
+ */
+ _propertyToAttribute(property, attribute, value) {
+ this.__serializing = true;
+ value = (arguments.length < 3) ? this[property] : value;
+ this._valueToNodeAttribute(/** @type {!HTMLElement} */(this), value,
+ attribute || this.constructor.attributeNameForProperty(property));
+ this.__serializing = false;
+ }
+
+ /**
+ * Sets a typed value to an HTML attribute on a node.
+ *
+ * This method calls the `_serializeValue` method to convert the typed
+ * value to a string. If the `_serializeValue` method returns `undefined`,
+ * the attribute will be removed (this is the default for boolean
+ * type `false`).
+ *
+ * @param {Element} node Element to set attribute to.
+ * @param {*} value Value to serialize.
+ * @param {string} attribute Attribute name to serialize to.
+ * @return {void}
+ */
+ _valueToNodeAttribute(node, value, attribute) {
+ const str = this._serializeValue(value);
+ if (str === undefined) {
+ node.removeAttribute(attribute);
+ } else {
+ node.setAttribute(attribute, str);
+ }
+ }
+
+ /**
+ * Converts a typed JavaScript value to a string.
+ *
+ * This method is called when setting JS property values to
+ * HTML attributes. Users may override this method to provide
+ * serialization for custom types.
+ *
+ * @param {*} value Property value to serialize.
+ * @return {string | undefined} String serialized from the provided
+ * property value.
+ */
+ _serializeValue(value) {
+ switch (typeof value) {
+ case 'boolean':
+ return value ? '' : undefined;
+ default:
+ return value != null ? value.toString() : undefined;
+ }
+ }
+
+ /**
+ * Converts a string to a typed JavaScript value.
+ *
+ * This method is called when reading HTML attribute values to
+ * JS properties. Users may override this method to provide
+ * deserialization for custom `type`s. Types for `Boolean`, `String`,
+ * and `Number` convert attributes to the expected types.
+ *
+ * @param {?string} value Value to deserialize.
+ * @param {*=} type Type to deserialize the string to.
+ * @return {*} Typed value deserialized from the provided string.
+ */
+ _deserializeValue(value, type) {
+ switch (type) {
+ case Boolean:
+ return (value !== null);
+ case Number:
+ return Number(value);
+ default:
+ return value;
+ }
+ }
+
+ }
+
+ return PropertiesChanged;
+});
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/properties-mixin.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/properties-mixin.js
new file mode 100644
index 00000000000..8a18d0d4748
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/properties-mixin.js
@@ -0,0 +1,221 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../utils/boot.js';
+
+import { dedupingMixin } from '../utils/mixin.js';
+import { PropertiesChanged } from './properties-changed.js';
+
+/**
+ * Creates a copy of `props` with each property normalized such that
+ * upgraded it is an object with at least a type property { type: Type}.
+ *
+ * @param {Object} props Properties to normalize
+ * @return {Object} Copy of input `props` with normalized properties that
+ * are in the form {type: Type}
+ * @private
+ */
+function normalizeProperties(props) {
+ const output = {};
+ for (let p in props) {
+ const o = props[p];
+ output[p] = (typeof o === 'function') ? {type: o} : o;
+ }
+ return output;
+}
+
+/**
+ * Mixin that provides a minimal starting point to using the PropertiesChanged
+ * mixin by providing a mechanism to declare properties in a static
+ * getter (e.g. static get properties() { return { foo: String } }). Changes
+ * are reported via the `_propertiesChanged` method.
+ *
+ * This mixin provides no specific support for rendering. Users are expected
+ * to create a ShadowRoot and put content into it and update it in whatever
+ * way makes sense. This can be done in reaction to properties changing by
+ * implementing `_propertiesChanged`.
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin PropertiesChanged
+ * @summary Mixin that provides a minimal starting point for using
+ * the PropertiesChanged mixin by providing a declarative `properties` object.
+ */
+export const PropertiesMixin = dedupingMixin(superClass => {
+
+ /**
+ * @constructor
+ * @extends {superClass}
+ * @implements {Polymer_PropertiesChanged}
+ */
+ const base = PropertiesChanged(superClass);
+
+ /**
+ * Returns the super class constructor for the given class, if it is an
+ * instance of the PropertiesMixin.
+ *
+ * @param {!PropertiesMixinConstructor} constructor PropertiesMixin constructor
+ * @return {PropertiesMixinConstructor} Super class constructor
+ */
+ function superPropertiesClass(constructor) {
+ const superCtor = Object.getPrototypeOf(constructor);
+
+ // Note, the `PropertiesMixin` class below only refers to the class
+ // generated by this call to the mixin; the instanceof test only works
+ // because the mixin is deduped and guaranteed only to apply once, hence
+ // all constructors in a proto chain will see the same `PropertiesMixin`
+ return (superCtor.prototype instanceof PropertiesMixin) ?
+ /** @type {PropertiesMixinConstructor} */ (superCtor) : null;
+ }
+
+ /**
+ * Returns a memoized version of the `properties` object for the
+ * given class. Properties not in object format are converted to at
+ * least {type}.
+ *
+ * @param {PropertiesMixinConstructor} constructor PropertiesMixin constructor
+ * @return {Object} Memoized properties object
+ */
+ function ownProperties(constructor) {
+ if (!constructor.hasOwnProperty(JSCompiler_renameProperty('__ownProperties', constructor))) {
+ let props = null;
+
+ if (constructor.hasOwnProperty(JSCompiler_renameProperty('properties', constructor)) && constructor.properties) {
+ props = normalizeProperties(constructor.properties);
+ }
+
+ constructor.__ownProperties = props;
+ }
+ return constructor.__ownProperties;
+ }
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @extends {base}
+ * @implements {Polymer_PropertiesMixin}
+ * @unrestricted
+ */
+ class PropertiesMixin extends base {
+
+ /**
+ * Implements standard custom elements getter to observes the attributes
+ * listed in `properties`.
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static get observedAttributes() {
+ const props = this._properties;
+ return props ? Object.keys(props).map(p => this.attributeNameForProperty(p)) : [];
+ }
+
+ /**
+ * Finalizes an element definition, including ensuring any super classes
+ * are also finalized. This includes ensuring property
+ * accessors exist on the element prototype. This method calls
+ * `_finalizeClass` to finalize each constructor in the prototype chain.
+ * @return {void}
+ */
+ static finalize() {
+ if (!this.hasOwnProperty(JSCompiler_renameProperty('__finalized', this))) {
+ const superCtor = superPropertiesClass(/** @type {PropertiesMixinConstructor} */(this));
+ if (superCtor) {
+ superCtor.finalize();
+ }
+ this.__finalized = true;
+ this._finalizeClass();
+ }
+ }
+
+ /**
+ * Finalize an element class. This includes ensuring property
+ * accessors exist on the element prototype. This method is called by
+ * `finalize` and finalizes the class constructor.
+ *
+ * @protected
+ */
+ static _finalizeClass() {
+ const props = ownProperties(/** @type {PropertiesMixinConstructor} */(this));
+ if (props) {
+ this.createProperties(props);
+ }
+ }
+
+ /**
+ * Returns a memoized version of all properties, including those inherited
+ * from super classes. Properties not in object format are converted to
+ * at least {type}.
+ *
+ * @return {Object} Object containing properties for this class
+ * @protected
+ */
+ static get _properties() {
+ if (!this.hasOwnProperty(
+ JSCompiler_renameProperty('__properties', this))) {
+ const superCtor = superPropertiesClass(/** @type {PropertiesMixinConstructor} */(this));
+ this.__properties = Object.assign({},
+ superCtor && superCtor._properties,
+ ownProperties(/** @type {PropertiesMixinConstructor} */(this)));
+ }
+ return this.__properties;
+ }
+
+ /**
+ * Overrides `PropertiesChanged` method to return type specified in the
+ * static `properties` object for the given property.
+ * @param {string} name Name of property
+ * @return {*} Type to which to deserialize attribute
+ *
+ * @protected
+ */
+ static typeForProperty(name) {
+ const info = this._properties[name];
+ return info && info.type;
+ }
+
+ /**
+ * Overrides `PropertiesChanged` method and adds a call to
+ * `finalize` which lazily configures the element's property accessors.
+ * @override
+ * @return {void}
+ */
+ _initializeProperties() {
+ this.constructor.finalize();
+ super._initializeProperties();
+ }
+
+ /**
+ * Called when the element is added to a document.
+ * Calls `_enableProperties` to turn on property system from
+ * `PropertiesChanged`.
+ * @suppress {missingProperties} Super may or may not implement the callback
+ * @return {void}
+ */
+ connectedCallback() {
+ if (super.connectedCallback) {
+ super.connectedCallback();
+ }
+ this._enableProperties();
+ }
+
+ /**
+ * Called when the element is removed from a document
+ * @suppress {missingProperties} Super may or may not implement the callback
+ * @return {void}
+ */
+ disconnectedCallback() {
+ if (super.disconnectedCallback) {
+ super.disconnectedCallback();
+ }
+ }
+
+ }
+
+ return PropertiesMixin;
+
+});
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/property-accessors.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/property-accessors.js
new file mode 100644
index 00000000000..c00e1b4f76f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/property-accessors.js
@@ -0,0 +1,313 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../utils/boot.js';
+
+import { dedupingMixin } from '../utils/mixin.js';
+import * as caseMap$0 from '../utils/case-map.js';
+import { PropertiesChanged } from './properties-changed.js';
+
+let caseMap = caseMap$0;
+
+// Save map of native properties; this forms a blacklist or properties
+// that won't have their values "saved" by `saveAccessorValue`, since
+// reading from an HTMLElement accessor from the context of a prototype throws
+const nativeProperties = {};
+let proto = HTMLElement.prototype;
+while (proto) {
+ let props = Object.getOwnPropertyNames(proto);
+ for (let i=0; i<props.length; i++) {
+ nativeProperties[props[i]] = true;
+ }
+ proto = Object.getPrototypeOf(proto);
+}
+
+/**
+ * Used to save the value of a property that will be overridden with
+ * an accessor. If the `model` is a prototype, the values will be saved
+ * in `__dataProto`, and it's up to the user (or downstream mixin) to
+ * decide how/when to set these values back into the accessors.
+ * If `model` is already an instance (it has a `__data` property), then
+ * the value will be set as a pending property, meaning the user should
+ * call `_invalidateProperties` or `_flushProperties` to take effect
+ *
+ * @param {Object} model Prototype or instance
+ * @param {string} property Name of property
+ * @return {void}
+ * @private
+ */
+function saveAccessorValue(model, property) {
+ // Don't read/store value for any native properties since they could throw
+ if (!nativeProperties[property]) {
+ let value = model[property];
+ if (value !== undefined) {
+ if (model.__data) {
+ // Adding accessor to instance; update the property
+ // It is the user's responsibility to call _flushProperties
+ model._setPendingProperty(property, value);
+ } else {
+ // Adding accessor to proto; save proto's value for instance-time use
+ if (!model.__dataProto) {
+ model.__dataProto = {};
+ } else if (!model.hasOwnProperty(JSCompiler_renameProperty('__dataProto', model))) {
+ model.__dataProto = Object.create(model.__dataProto);
+ }
+ model.__dataProto[property] = value;
+ }
+ }
+ }
+}
+
+/**
+ * Element class mixin that provides basic meta-programming for creating one
+ * or more property accessors (getter/setter pair) that enqueue an async
+ * (batched) `_propertiesChanged` callback.
+ *
+ * For basic usage of this mixin:
+ *
+ * - Declare attributes to observe via the standard `static get observedAttributes()`. Use
+ * `dash-case` attribute names to represent `camelCase` property names.
+ * - Implement the `_propertiesChanged` callback on the class.
+ * - Call `MyClass.createPropertiesForAttributes()` **once** on the class to generate
+ * property accessors for each observed attribute. This must be called before the first
+ * instance is created, for example, by calling it before calling `customElements.define`.
+ * It can also be called lazily from the element's `constructor`, as long as it's guarded so
+ * that the call is only made once, when the first instance is created.
+ * - Call `this._enableProperties()` in the element's `connectedCallback` to enable
+ * the accessors.
+ *
+ * Any `observedAttributes` will automatically be
+ * deserialized via `attributeChangedCallback` and set to the associated
+ * property using `dash-case`-to-`camelCase` convention.
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin PropertiesChanged
+ * @summary Element class mixin for reacting to property changes from
+ * generated property accessors.
+ */
+export const PropertyAccessors = dedupingMixin(superClass => {
+
+ /**
+ * @constructor
+ * @extends {superClass}
+ * @implements {Polymer_PropertiesChanged}
+ * @unrestricted
+ */
+ const base = PropertiesChanged(superClass);
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_PropertyAccessors}
+ * @extends {base}
+ * @unrestricted
+ */
+ class PropertyAccessors extends base {
+
+ /**
+ * Generates property accessors for all attributes in the standard
+ * static `observedAttributes` array.
+ *
+ * Attribute names are mapped to property names using the `dash-case` to
+ * `camelCase` convention
+ *
+ * @return {void}
+ */
+ static createPropertiesForAttributes() {
+ let a$ = this.observedAttributes;
+ for (let i=0; i < a$.length; i++) {
+ this.prototype._createPropertyAccessor(caseMap.dashToCamelCase(a$[i]));
+ }
+ }
+
+ /**
+ * Returns an attribute name that corresponds to the given property.
+ * By default, converts camel to dash case, e.g. `fooBar` to `foo-bar`.
+ * @param {string} property Property to convert
+ * @return {string} Attribute name corresponding to the given property.
+ *
+ * @protected
+ */
+ static attributeNameForProperty(property) {
+ return caseMap.camelToDashCase(property);
+ }
+
+ /**
+ * Overrides PropertiesChanged implementation to initialize values for
+ * accessors created for values that already existed on the element
+ * prototype.
+ *
+ * @return {void}
+ * @protected
+ */
+ _initializeProperties() {
+ if (this.__dataProto) {
+ this._initializeProtoProperties(this.__dataProto);
+ this.__dataProto = null;
+ }
+ super._initializeProperties();
+ }
+
+ /**
+ * Called at instance time with bag of properties that were overwritten
+ * by accessors on the prototype when accessors were created.
+ *
+ * The default implementation sets these properties back into the
+ * setter at instance time. This method is provided as an override
+ * point for customizing or providing more efficient initialization.
+ *
+ * @param {Object} props Bag of property values that were overwritten
+ * when creating property accessors.
+ * @return {void}
+ * @protected
+ */
+ _initializeProtoProperties(props) {
+ for (let p in props) {
+ this._setProperty(p, props[p]);
+ }
+ }
+
+ /**
+ * Ensures the element has the given attribute. If it does not,
+ * assigns the given value to the attribute.
+ *
+ * @suppress {invalidCasts} Closure can't figure out `this` is infact an element
+ *
+ * @param {string} attribute Name of attribute to ensure is set.
+ * @param {string} value of the attribute.
+ * @return {void}
+ */
+ _ensureAttribute(attribute, value) {
+ const el = /** @type {!HTMLElement} */(this);
+ if (!el.hasAttribute(attribute)) {
+ this._valueToNodeAttribute(el, value, attribute);
+ }
+ }
+
+ /**
+ * Overrides PropertiesChanged implemention to serialize objects as JSON.
+ *
+ * @param {*} value Property value to serialize.
+ * @return {string | undefined} String serialized from the provided property value.
+ */
+ _serializeValue(value) {
+ /* eslint-disable no-fallthrough */
+ switch (typeof value) {
+ case 'object':
+ if (value instanceof Date) {
+ return value.toString();
+ } else if (value) {
+ try {
+ return JSON.stringify(value);
+ } catch(x) {
+ return '';
+ }
+ }
+
+ default:
+ return super._serializeValue(value);
+ }
+ }
+
+ /**
+ * Converts a string to a typed JavaScript value.
+ *
+ * This method is called by Polymer when reading HTML attribute values to
+ * JS properties. Users may override this method on Polymer element
+ * prototypes to provide deserialization for custom `type`s. Note,
+ * the `type` argument is the value of the `type` field provided in the
+ * `properties` configuration object for a given property, and is
+ * by convention the constructor for the type to deserialize.
+ *
+ *
+ * @param {?string} value Attribute value to deserialize.
+ * @param {*=} type Type to deserialize the string to.
+ * @return {*} Typed value deserialized from the provided string.
+ */
+ _deserializeValue(value, type) {
+ /**
+ * @type {*}
+ */
+ let outValue;
+ switch (type) {
+ case Object:
+ try {
+ outValue = JSON.parse(/** @type {string} */(value));
+ } catch(x) {
+ // allow non-JSON literals like Strings and Numbers
+ outValue = value;
+ }
+ break;
+ case Array:
+ try {
+ outValue = JSON.parse(/** @type {string} */(value));
+ } catch(x) {
+ outValue = null;
+ console.warn(`Polymer::Attributes: couldn't decode Array as JSON: ${value}`);
+ }
+ break;
+ case Date:
+ outValue = isNaN(value) ? String(value) : Number(value);
+ outValue = new Date(outValue);
+ break;
+ default:
+ outValue = super._deserializeValue(value, type);
+ break;
+ }
+ return outValue;
+ }
+ /* eslint-enable no-fallthrough */
+
+ /**
+ * Overrides PropertiesChanged implementation to save existing prototype
+ * property value so that it can be reset.
+ * @param {string} property Name of the property
+ * @param {boolean=} readOnly When true, no setter is created
+ *
+ * When calling on a prototype, any overwritten values are saved in
+ * `__dataProto`, and it is up to the subclasser to decide how/when
+ * to set those properties back into the accessor. When calling on an
+ * instance, the overwritten value is set via `_setPendingProperty`,
+ * and the user should call `_invalidateProperties` or `_flushProperties`
+ * for the values to take effect.
+ * @protected
+ * @return {void}
+ */
+ _definePropertyAccessor(property, readOnly) {
+ saveAccessorValue(this, property);
+ super._definePropertyAccessor(property, readOnly);
+ }
+
+ /**
+ * Returns true if this library created an accessor for the given property.
+ *
+ * @param {string} property Property name
+ * @return {boolean} True if an accessor was created
+ */
+ _hasAccessor(property) {
+ return this.__dataHasAccessor && this.__dataHasAccessor[property];
+ }
+
+ /**
+ * Returns true if the specified property has a pending change.
+ *
+ * @param {string} prop Property name
+ * @return {boolean} True if property has a pending change
+ * @protected
+ */
+ _isPropertyPending(prop) {
+ return Boolean(this.__dataPending && (prop in this.__dataPending));
+ }
+
+ }
+
+ return PropertyAccessors;
+
+});
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/property-effects.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/property-effects.js
new file mode 100644
index 00000000000..91b5d120948
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/property-effects.js
@@ -0,0 +1,2812 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+import '../utils/boot.js';
+
+import { dedupingMixin } from '../utils/mixin.js';
+import { root as root$0, isAncestor, isDescendant, get as get$0, translate, isPath as isPath$0, set as set$0, normalize } from '../utils/path.js';
+/* for notify, reflect */
+import * as caseMap from '../utils/case-map.js';
+import { camelToDashCase as camelToDashCase$0, dashToCamelCase } from '../utils/case-map.js';
+import { PropertyAccessors } from './property-accessors.js';
+/* for annotated effects */
+import { TemplateStamp } from './template-stamp.js';
+import { sanitizeDOMValue } from '../utils/settings.js';
+
+/** @const {Object} */
+const CaseMap = caseMap;
+
+// Monotonically increasing unique ID used for de-duping effects triggered
+// from multiple properties in the same turn
+let dedupeId = 0;
+
+/**
+ * Property effect types; effects are stored on the prototype using these keys
+ * @enum {string}
+ */
+const TYPES = {
+ COMPUTE: '__computeEffects',
+ REFLECT: '__reflectEffects',
+ NOTIFY: '__notifyEffects',
+ PROPAGATE: '__propagateEffects',
+ OBSERVE: '__observeEffects',
+ READ_ONLY: '__readOnly'
+};
+
+/** @const {RegExp} */
+const capitalAttributeRegex = /[A-Z]/;
+
+/**
+ * @typedef {{
+ * name: (string | undefined),
+ * structured: (boolean | undefined),
+ * wildcard: (boolean | undefined)
+ * }}
+ */
+let DataTrigger; //eslint-disable-line no-unused-vars
+
+/**
+ * @typedef {{
+ * info: ?,
+ * trigger: (!DataTrigger | undefined),
+ * fn: (!Function | undefined)
+ * }}
+ */
+let DataEffect; //eslint-disable-line no-unused-vars
+
+let PropertyEffectsType; //eslint-disable-line no-unused-vars
+
+/**
+ * Ensures that the model has an own-property map of effects for the given type.
+ * The model may be a prototype or an instance.
+ *
+ * Property effects are stored as arrays of effects by property in a map,
+ * by named type on the model. e.g.
+ *
+ * __computeEffects: {
+ * foo: [ ... ],
+ * bar: [ ... ]
+ * }
+ *
+ * If the model does not yet have an effect map for the type, one is created
+ * and returned. If it does, but it is not an own property (i.e. the
+ * prototype had effects), the the map is deeply cloned and the copy is
+ * set on the model and returned, ready for new effects to be added.
+ *
+ * @param {Object} model Prototype or instance
+ * @param {string} type Property effect type
+ * @return {Object} The own-property map of effects for the given type
+ * @private
+ */
+function ensureOwnEffectMap(model, type) {
+ let effects = model[type];
+ if (!effects) {
+ effects = model[type] = {};
+ } else if (!model.hasOwnProperty(type)) {
+ effects = model[type] = Object.create(model[type]);
+ for (let p in effects) {
+ let protoFx = effects[p];
+ let instFx = effects[p] = Array(protoFx.length);
+ for (let i=0; i<protoFx.length; i++) {
+ instFx[i] = protoFx[i];
+ }
+ }
+ }
+ return effects;
+}
+
+// -- effects ----------------------------------------------
+
+/**
+ * Runs all effects of a given type for the given set of property changes
+ * on an instance.
+ *
+ * @param {!PropertyEffectsType} inst The instance with effects to run
+ * @param {Object} effects Object map of property-to-Array of effects
+ * @param {Object} props Bag of current property changes
+ * @param {Object=} oldProps Bag of previous values for changed properties
+ * @param {boolean=} hasPaths True with `props` contains one or more paths
+ * @param {*=} extraArgs Additional metadata to pass to effect function
+ * @return {boolean} True if an effect ran for this property
+ * @private
+ */
+function runEffects(inst, effects, props, oldProps, hasPaths, extraArgs) {
+ if (effects) {
+ let ran = false;
+ let id = dedupeId++;
+ for (let prop in props) {
+ if (runEffectsForProperty(inst, effects, id, prop, props, oldProps, hasPaths, extraArgs)) {
+ ran = true;
+ }
+ }
+ return ran;
+ }
+ return false;
+}
+
+/**
+ * Runs a list of effects for a given property.
+ *
+ * @param {!PropertyEffectsType} inst The instance with effects to run
+ * @param {Object} effects Object map of property-to-Array of effects
+ * @param {number} dedupeId Counter used for de-duping effects
+ * @param {string} prop Name of changed property
+ * @param {*} props Changed properties
+ * @param {*} oldProps Old properties
+ * @param {boolean=} hasPaths True with `props` contains one or more paths
+ * @param {*=} extraArgs Additional metadata to pass to effect function
+ * @return {boolean} True if an effect ran for this property
+ * @private
+ */
+function runEffectsForProperty(inst, effects, dedupeId, prop, props, oldProps, hasPaths, extraArgs) {
+ let ran = false;
+ let rootProperty = hasPaths ? root$0(prop) : prop;
+ let fxs = effects[rootProperty];
+ if (fxs) {
+ for (let i=0, l=fxs.length, fx; (i<l) && (fx=fxs[i]); i++) {
+ if ((!fx.info || fx.info.lastRun !== dedupeId) &&
+ (!hasPaths || pathMatchesTrigger(prop, fx.trigger))) {
+ if (fx.info) {
+ fx.info.lastRun = dedupeId;
+ }
+ fx.fn(inst, prop, props, oldProps, fx.info, hasPaths, extraArgs);
+ ran = true;
+ }
+ }
+ }
+ return ran;
+}
+
+/**
+ * Determines whether a property/path that has changed matches the trigger
+ * criteria for an effect. A trigger is a descriptor with the following
+ * structure, which matches the descriptors returned from `parseArg`.
+ * e.g. for `foo.bar.*`:
+ * ```
+ * trigger: {
+ * name: 'a.b',
+ * structured: true,
+ * wildcard: true
+ * }
+ * ```
+ * If no trigger is given, the path is deemed to match.
+ *
+ * @param {string} path Path or property that changed
+ * @param {DataTrigger} trigger Descriptor
+ * @return {boolean} Whether the path matched the trigger
+ */
+function pathMatchesTrigger(path, trigger) {
+ if (trigger) {
+ let triggerPath = trigger.name;
+ return (triggerPath == path) ||
+ (trigger.structured && isAncestor(triggerPath, path)) ||
+ (trigger.wildcard && isDescendant(triggerPath, path));
+ } else {
+ return true;
+ }
+}
+
+/**
+ * Implements the "observer" effect.
+ *
+ * Calls the method with `info.methodName` on the instance, passing the
+ * new and old values.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {string} property Name of property
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {?} info Effect metadata
+ * @return {void}
+ * @private
+ */
+function runObserverEffect(inst, property, props, oldProps, info) {
+ let fn = typeof info.method === "string" ? inst[info.method] : info.method;
+ let changedProp = info.property;
+ if (fn) {
+ fn.call(inst, inst.__data[changedProp], oldProps[changedProp]);
+ } else if (!info.dynamicFn) {
+ console.warn('observer method `' + info.method + '` not defined');
+ }
+}
+
+/**
+ * Runs "notify" effects for a set of changed properties.
+ *
+ * This method differs from the generic `runEffects` method in that it
+ * will dispatch path notification events in the case that the property
+ * changed was a path and the root property for that path didn't have a
+ * "notify" effect. This is to maintain 1.0 behavior that did not require
+ * `notify: true` to ensure object sub-property notifications were
+ * sent.
+ *
+ * @param {!PropertyEffectsType} inst The instance with effects to run
+ * @param {Object} notifyProps Bag of properties to notify
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {boolean} hasPaths True with `props` contains one or more paths
+ * @return {void}
+ * @private
+ */
+function runNotifyEffects(inst, notifyProps, props, oldProps, hasPaths) {
+ // Notify
+ let fxs = inst[TYPES.NOTIFY];
+ let notified;
+ let id = dedupeId++;
+ // Try normal notify effects; if none, fall back to try path notification
+ for (let prop in notifyProps) {
+ if (notifyProps[prop]) {
+ if (fxs && runEffectsForProperty(inst, fxs, id, prop, props, oldProps, hasPaths)) {
+ notified = true;
+ } else if (hasPaths && notifyPath(inst, prop, props)) {
+ notified = true;
+ }
+ }
+ }
+ // Flush host if we actually notified and host was batching
+ // And the host has already initialized clients; this prevents
+ // an issue with a host observing data changes before clients are ready.
+ let host;
+ if (notified && (host = inst.__dataHost) && host._invalidateProperties) {
+ host._invalidateProperties();
+ }
+}
+
+/**
+ * Dispatches {property}-changed events with path information in the detail
+ * object to indicate a sub-path of the property was changed.
+ *
+ * @param {!PropertyEffectsType} inst The element from which to fire the event
+ * @param {string} path The path that was changed
+ * @param {Object} props Bag of current property changes
+ * @return {boolean} Returns true if the path was notified
+ * @private
+ */
+function notifyPath(inst, path, props) {
+ let rootProperty = root$0(path);
+ if (rootProperty !== path) {
+ let eventName = camelToDashCase$0(rootProperty) + '-changed';
+ dispatchNotifyEvent(inst, eventName, props[path], path);
+ return true;
+ }
+ return false;
+}
+
+/**
+ * Dispatches {property}-changed events to indicate a property (or path)
+ * changed.
+ *
+ * @param {!PropertyEffectsType} inst The element from which to fire the event
+ * @param {string} eventName The name of the event to send ('{property}-changed')
+ * @param {*} value The value of the changed property
+ * @param {string | null | undefined} path If a sub-path of this property changed, the path
+ * that changed (optional).
+ * @return {void}
+ * @private
+ * @suppress {invalidCasts}
+ */
+function dispatchNotifyEvent(inst, eventName, value, path) {
+ let detail = {
+ value: value,
+ queueProperty: true
+ };
+ if (path) {
+ detail.path = path;
+ }
+ /** @type {!HTMLElement} */(inst).dispatchEvent(new CustomEvent(eventName, { detail }));
+}
+
+/**
+ * Implements the "notify" effect.
+ *
+ * Dispatches a non-bubbling event named `info.eventName` on the instance
+ * with a detail object containing the new `value`.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {string} property Name of property
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {?} info Effect metadata
+ * @param {boolean} hasPaths True with `props` contains one or more paths
+ * @return {void}
+ * @private
+ */
+function runNotifyEffect(inst, property, props, oldProps, info, hasPaths) {
+ let rootProperty = hasPaths ? root$0(property) : property;
+ let path = rootProperty != property ? property : null;
+ let value = path ? get$0(inst, path) : inst.__data[property];
+ if (path && value === undefined) {
+ value = props[property]; // specifically for .splices
+ }
+ dispatchNotifyEvent(inst, info.eventName, value, path);
+}
+
+/**
+ * Handler function for 2-way notification events. Receives context
+ * information captured in the `addNotifyListener` closure from the
+ * `__notifyListeners` metadata.
+ *
+ * Sets the value of the notified property to the host property or path. If
+ * the event contained path information, translate that path to the host
+ * scope's name for that path first.
+ *
+ * @param {CustomEvent} event Notification event (e.g. '<property>-changed')
+ * @param {!PropertyEffectsType} inst Host element instance handling the notification event
+ * @param {string} fromProp Child element property that was bound
+ * @param {string} toPath Host property/path that was bound
+ * @param {boolean} negate Whether the binding was negated
+ * @return {void}
+ * @private
+ */
+function handleNotification(event, inst, fromProp, toPath, negate) {
+ let value;
+ let detail = /** @type {Object} */(event.detail);
+ let fromPath = detail && detail.path;
+ if (fromPath) {
+ toPath = translate(fromProp, toPath, fromPath);
+ value = detail && detail.value;
+ } else {
+ value = event.target[fromProp];
+ }
+ value = negate ? !value : value;
+ if (!inst[TYPES.READ_ONLY] || !inst[TYPES.READ_ONLY][toPath]) {
+ if (inst._setPendingPropertyOrPath(toPath, value, true, Boolean(fromPath))
+ && (!detail || !detail.queueProperty)) {
+ inst._invalidateProperties();
+ }
+ }
+}
+
+/**
+ * Implements the "reflect" effect.
+ *
+ * Sets the attribute named `info.attrName` to the given property value.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {string} property Name of property
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {?} info Effect metadata
+ * @return {void}
+ * @private
+ */
+function runReflectEffect(inst, property, props, oldProps, info) {
+ let value = inst.__data[property];
+ if (sanitizeDOMValue) {
+ value = sanitizeDOMValue(value, info.attrName, 'attribute', /** @type {Node} */(inst));
+ }
+ inst._propertyToAttribute(property, info.attrName, value);
+}
+
+/**
+ * Runs "computed" effects for a set of changed properties.
+ *
+ * This method differs from the generic `runEffects` method in that it
+ * continues to run computed effects based on the output of each pass until
+ * there are no more newly computed properties. This ensures that all
+ * properties that will be computed by the initial set of changes are
+ * computed before other effects (binding propagation, observers, and notify)
+ * run.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {!Object} changedProps Bag of changed properties
+ * @param {!Object} oldProps Bag of previous values for changed properties
+ * @param {boolean} hasPaths True with `props` contains one or more paths
+ * @return {void}
+ * @private
+ */
+function runComputedEffects(inst, changedProps, oldProps, hasPaths) {
+ let computeEffects = inst[TYPES.COMPUTE];
+ if (computeEffects) {
+ let inputProps = changedProps;
+ while (runEffects(inst, computeEffects, inputProps, oldProps, hasPaths)) {
+ Object.assign(oldProps, inst.__dataOld);
+ Object.assign(changedProps, inst.__dataPending);
+ inputProps = inst.__dataPending;
+ inst.__dataPending = null;
+ }
+ }
+}
+
+/**
+ * Implements the "computed property" effect by running the method with the
+ * values of the arguments specified in the `info` object and setting the
+ * return value to the computed property specified.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {string} property Name of property
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {?} info Effect metadata
+ * @return {void}
+ * @private
+ */
+function runComputedEffect(inst, property, props, oldProps, info) {
+ let result = runMethodEffect(inst, property, props, oldProps, info);
+ let computedProp = info.methodInfo;
+ if (inst.__dataHasAccessor && inst.__dataHasAccessor[computedProp]) {
+ inst._setPendingProperty(computedProp, result, true);
+ } else {
+ inst[computedProp] = result;
+ }
+}
+
+/**
+ * Computes path changes based on path links set up using the `linkPaths`
+ * API.
+ *
+ * @param {!PropertyEffectsType} inst The instance whose props are changing
+ * @param {string | !Array<(string|number)>} path Path that has changed
+ * @param {*} value Value of changed path
+ * @return {void}
+ * @private
+ */
+function computeLinkedPaths(inst, path, value) {
+ let links = inst.__dataLinkedPaths;
+ if (links) {
+ let link;
+ for (let a in links) {
+ let b = links[a];
+ if (isDescendant(a, path)) {
+ link = translate(a, b, path);
+ inst._setPendingPropertyOrPath(link, value, true, true);
+ } else if (isDescendant(b, path)) {
+ link = translate(b, a, path);
+ inst._setPendingPropertyOrPath(link, value, true, true);
+ }
+ }
+ }
+}
+
+// -- bindings ----------------------------------------------
+
+/**
+ * Adds binding metadata to the current `nodeInfo`, and binding effects
+ * for all part dependencies to `templateInfo`.
+ *
+ * @param {Function} constructor Class that `_parseTemplate` is currently
+ * running on
+ * @param {TemplateInfo} templateInfo Template metadata for current template
+ * @param {NodeInfo} nodeInfo Node metadata for current template node
+ * @param {string} kind Binding kind, either 'property', 'attribute', or 'text'
+ * @param {string} target Target property name
+ * @param {!Array<!BindingPart>} parts Array of binding part metadata
+ * @param {string=} literal Literal text surrounding binding parts (specified
+ * only for 'property' bindings, since these must be initialized as part
+ * of boot-up)
+ * @return {void}
+ * @private
+ */
+function addBinding(constructor, templateInfo, nodeInfo, kind, target, parts, literal) {
+ // Create binding metadata and add to nodeInfo
+ nodeInfo.bindings = nodeInfo.bindings || [];
+ let /** Binding */ binding = { kind, target, parts, literal, isCompound: (parts.length !== 1) };
+ nodeInfo.bindings.push(binding);
+ // Add listener info to binding metadata
+ if (shouldAddListener(binding)) {
+ let {event, negate} = binding.parts[0];
+ binding.listenerEvent = event || (CaseMap.camelToDashCase(target) + '-changed');
+ binding.listenerNegate = negate;
+ }
+ // Add "propagate" property effects to templateInfo
+ let index = templateInfo.nodeInfoList.length;
+ for (let i=0; i<binding.parts.length; i++) {
+ let part = binding.parts[i];
+ part.compoundIndex = i;
+ addEffectForBindingPart(constructor, templateInfo, binding, part, index);
+ }
+}
+
+/**
+ * Adds property effects to the given `templateInfo` for the given binding
+ * part.
+ *
+ * @param {Function} constructor Class that `_parseTemplate` is currently
+ * running on
+ * @param {TemplateInfo} templateInfo Template metadata for current template
+ * @param {!Binding} binding Binding metadata
+ * @param {!BindingPart} part Binding part metadata
+ * @param {number} index Index into `nodeInfoList` for this node
+ * @return {void}
+ */
+function addEffectForBindingPart(constructor, templateInfo, binding, part, index) {
+ if (!part.literal) {
+ if (binding.kind === 'attribute' && binding.target[0] === '-') {
+ console.warn('Cannot set attribute ' + binding.target +
+ ' because "-" is not a valid attribute starting character');
+ } else {
+ let dependencies = part.dependencies;
+ let info = { index, binding, part, evaluator: constructor };
+ for (let j=0; j<dependencies.length; j++) {
+ let trigger = dependencies[j];
+ if (typeof trigger == 'string') {
+ trigger = parseArg(trigger);
+ trigger.wildcard = true;
+ }
+ constructor._addTemplatePropertyEffect(templateInfo, trigger.rootProperty, {
+ fn: runBindingEffect,
+ info, trigger
+ });
+ }
+ }
+ }
+}
+
+/**
+ * Implements the "binding" (property/path binding) effect.
+ *
+ * Note that binding syntax is overridable via `_parseBindings` and
+ * `_evaluateBinding`. This method will call `_evaluateBinding` for any
+ * non-literal parts returned from `_parseBindings`. However,
+ * there is no support for _path_ bindings via custom binding parts,
+ * as this is specific to Polymer's path binding syntax.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {string} path Name of property
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {?} info Effect metadata
+ * @param {boolean} hasPaths True with `props` contains one or more paths
+ * @param {Array} nodeList List of nodes associated with `nodeInfoList` template
+ * metadata
+ * @return {void}
+ * @private
+ */
+function runBindingEffect(inst, path, props, oldProps, info, hasPaths, nodeList) {
+ let node = nodeList[info.index];
+ let binding = info.binding;
+ let part = info.part;
+ // Subpath notification: transform path and set to client
+ // e.g.: foo="{{obj.sub}}", path: 'obj.sub.prop', set 'foo.prop'=obj.sub.prop
+ if (hasPaths && part.source && (path.length > part.source.length) &&
+ (binding.kind == 'property') && !binding.isCompound &&
+ node.__isPropertyEffectsClient &&
+ node.__dataHasAccessor && node.__dataHasAccessor[binding.target]) {
+ let value = props[path];
+ path = translate(part.source, binding.target, path);
+ if (node._setPendingPropertyOrPath(path, value, false, true)) {
+ inst._enqueueClient(node);
+ }
+ } else {
+ let value = info.evaluator._evaluateBinding(inst, part, path, props, oldProps, hasPaths);
+ // Propagate value to child
+ applyBindingValue(inst, node, binding, part, value);
+ }
+}
+
+/**
+ * Sets the value for an "binding" (binding) effect to a node,
+ * either as a property or attribute.
+ *
+ * @param {!PropertyEffectsType} inst The instance owning the binding effect
+ * @param {Node} node Target node for binding
+ * @param {!Binding} binding Binding metadata
+ * @param {!BindingPart} part Binding part metadata
+ * @param {*} value Value to set
+ * @return {void}
+ * @private
+ */
+function applyBindingValue(inst, node, binding, part, value) {
+ value = computeBindingValue(node, value, binding, part);
+ if (sanitizeDOMValue) {
+ value = sanitizeDOMValue(value, binding.target, binding.kind, node);
+ }
+ if (binding.kind == 'attribute') {
+ // Attribute binding
+ inst._valueToNodeAttribute(/** @type {Element} */(node), value, binding.target);
+ } else {
+ // Property binding
+ let prop = binding.target;
+ if (node.__isPropertyEffectsClient &&
+ node.__dataHasAccessor && node.__dataHasAccessor[prop]) {
+ if (!node[TYPES.READ_ONLY] || !node[TYPES.READ_ONLY][prop]) {
+ if (node._setPendingProperty(prop, value)) {
+ inst._enqueueClient(node);
+ }
+ }
+ } else {
+ inst._setUnmanagedPropertyToNode(node, prop, value);
+ }
+ }
+}
+
+/**
+ * Transforms an "binding" effect value based on compound & negation
+ * effect metadata, as well as handling for special-case properties
+ *
+ * @param {Node} node Node the value will be set to
+ * @param {*} value Value to set
+ * @param {!Binding} binding Binding metadata
+ * @param {!BindingPart} part Binding part metadata
+ * @return {*} Transformed value to set
+ * @private
+ */
+function computeBindingValue(node, value, binding, part) {
+ if (binding.isCompound) {
+ let storage = node.__dataCompoundStorage[binding.target];
+ storage[part.compoundIndex] = value;
+ value = storage.join('');
+ }
+ if (binding.kind !== 'attribute') {
+ // Some browsers serialize `undefined` to `"undefined"`
+ if (binding.target === 'textContent' ||
+ (binding.target === 'value' &&
+ (node.localName === 'input' || node.localName === 'textarea'))) {
+ value = value == undefined ? '' : value;
+ }
+ }
+ return value;
+}
+
+/**
+ * Returns true if a binding's metadata meets all the requirements to allow
+ * 2-way binding, and therefore a `<property>-changed` event listener should be
+ * added:
+ * - used curly braces
+ * - is a property (not attribute) binding
+ * - is not a textContent binding
+ * - is not compound
+ *
+ * @param {!Binding} binding Binding metadata
+ * @return {boolean} True if 2-way listener should be added
+ * @private
+ */
+function shouldAddListener(binding) {
+ return Boolean(binding.target) &&
+ binding.kind != 'attribute' &&
+ binding.kind != 'text' &&
+ !binding.isCompound &&
+ binding.parts[0].mode === '{';
+}
+
+/**
+ * Setup compound binding storage structures, notify listeners, and dataHost
+ * references onto the bound nodeList.
+ *
+ * @param {!PropertyEffectsType} inst Instance that bas been previously bound
+ * @param {TemplateInfo} templateInfo Template metadata
+ * @return {void}
+ * @private
+ */
+function setupBindings(inst, templateInfo) {
+ // Setup compound storage, dataHost, and notify listeners
+ let {nodeList, nodeInfoList} = templateInfo;
+ if (nodeInfoList.length) {
+ for (let i=0; i < nodeInfoList.length; i++) {
+ let info = nodeInfoList[i];
+ let node = nodeList[i];
+ let bindings = info.bindings;
+ if (bindings) {
+ for (let i=0; i<bindings.length; i++) {
+ let binding = bindings[i];
+ setupCompoundStorage(node, binding);
+ addNotifyListener(node, inst, binding);
+ }
+ }
+ node.__dataHost = inst;
+ }
+ }
+}
+
+/**
+ * Initializes `__dataCompoundStorage` local storage on a bound node with
+ * initial literal data for compound bindings, and sets the joined
+ * literal parts to the bound property.
+ *
+ * When changes to compound parts occur, they are first set into the compound
+ * storage array for that property, and then the array is joined to result in
+ * the final value set to the property/attribute.
+ *
+ * @param {Node} node Bound node to initialize
+ * @param {Binding} binding Binding metadata
+ * @return {void}
+ * @private
+ */
+function setupCompoundStorage(node, binding) {
+ if (binding.isCompound) {
+ // Create compound storage map
+ let storage = node.__dataCompoundStorage ||
+ (node.__dataCompoundStorage = {});
+ let parts = binding.parts;
+ // Copy literals from parts into storage for this binding
+ let literals = new Array(parts.length);
+ for (let j=0; j<parts.length; j++) {
+ literals[j] = parts[j].literal;
+ }
+ let target = binding.target;
+ storage[target] = literals;
+ // Configure properties with their literal parts
+ if (binding.literal && binding.kind == 'property') {
+ node[target] = binding.literal;
+ }
+ }
+}
+
+/**
+ * Adds a 2-way binding notification event listener to the node specified
+ *
+ * @param {Object} node Child element to add listener to
+ * @param {!PropertyEffectsType} inst Host element instance to handle notification event
+ * @param {Binding} binding Binding metadata
+ * @return {void}
+ * @private
+ */
+function addNotifyListener(node, inst, binding) {
+ if (binding.listenerEvent) {
+ let part = binding.parts[0];
+ node.addEventListener(binding.listenerEvent, function(e) {
+ handleNotification(e, inst, binding.target, part.source, part.negate);
+ });
+ }
+}
+
+// -- for method-based effects (complexObserver & computed) --------------
+
+/**
+ * Adds property effects for each argument in the method signature (and
+ * optionally, for the method name if `dynamic` is true) that calls the
+ * provided effect function.
+ *
+ * @param {Element | Object} model Prototype or instance
+ * @param {!MethodSignature} sig Method signature metadata
+ * @param {string} type Type of property effect to add
+ * @param {Function} effectFn Function to run when arguments change
+ * @param {*=} methodInfo Effect-specific information to be included in
+ * method effect metadata
+ * @param {boolean|Object=} dynamicFn Boolean or object map indicating whether
+ * method names should be included as a dependency to the effect. Note,
+ * defaults to true if the signature is static (sig.static is true).
+ * @return {void}
+ * @private
+ */
+function createMethodEffect(model, sig, type, effectFn, methodInfo, dynamicFn) {
+ dynamicFn = sig.static || (dynamicFn &&
+ (typeof dynamicFn !== 'object' || dynamicFn[sig.methodName]));
+ let info = {
+ methodName: sig.methodName,
+ args: sig.args,
+ methodInfo,
+ dynamicFn
+ };
+ for (let i=0, arg; (i<sig.args.length) && (arg=sig.args[i]); i++) {
+ if (!arg.literal) {
+ model._addPropertyEffect(arg.rootProperty, type, {
+ fn: effectFn, info: info, trigger: arg
+ });
+ }
+ }
+ if (dynamicFn) {
+ model._addPropertyEffect(sig.methodName, type, {
+ fn: effectFn, info: info
+ });
+ }
+}
+
+/**
+ * Calls a method with arguments marshaled from properties on the instance
+ * based on the method signature contained in the effect metadata.
+ *
+ * Multi-property observers, computed properties, and inline computing
+ * functions call this function to invoke the method, then use the return
+ * value accordingly.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {string} property Name of property
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {?} info Effect metadata
+ * @return {*} Returns the return value from the method invocation
+ * @private
+ */
+function runMethodEffect(inst, property, props, oldProps, info) {
+ // Instances can optionally have a _methodHost which allows redirecting where
+ // to find methods. Currently used by `templatize`.
+ let context = inst._methodHost || inst;
+ let fn = context[info.methodName];
+ if (fn) {
+ let args = marshalArgs(inst.__data, info.args, property, props);
+ return fn.apply(context, args);
+ } else if (!info.dynamicFn) {
+ console.warn('method `' + info.methodName + '` not defined');
+ }
+}
+
+const emptyArray = [];
+
+// Regular expressions used for binding
+const IDENT = '(?:' + '[a-zA-Z_$][\\w.:$\\-*]*' + ')';
+const NUMBER = '(?:' + '[-+]?[0-9]*\\.?[0-9]+(?:[eE][-+]?[0-9]+)?' + ')';
+const SQUOTE_STRING = '(?:' + '\'(?:[^\'\\\\]|\\\\.)*\'' + ')';
+const DQUOTE_STRING = '(?:' + '"(?:[^"\\\\]|\\\\.)*"' + ')';
+const STRING = '(?:' + SQUOTE_STRING + '|' + DQUOTE_STRING + ')';
+const ARGUMENT = '(?:(' + IDENT + '|' + NUMBER + '|' + STRING + ')\\s*' + ')';
+const ARGUMENTS = '(?:' + ARGUMENT + '(?:,\\s*' + ARGUMENT + ')*' + ')';
+const ARGUMENT_LIST = '(?:' + '\\(\\s*' +
+ '(?:' + ARGUMENTS + '?' + ')' +
+ '\\)\\s*' + ')';
+const BINDING = '(' + IDENT + '\\s*' + ARGUMENT_LIST + '?' + ')'; // Group 3
+const OPEN_BRACKET = '(\\[\\[|{{)' + '\\s*';
+const CLOSE_BRACKET = '(?:]]|}})';
+const NEGATE = '(?:(!)\\s*)?'; // Group 2
+const EXPRESSION = OPEN_BRACKET + NEGATE + BINDING + CLOSE_BRACKET;
+const bindingRegex = new RegExp(EXPRESSION, "g");
+
+/**
+ * Create a string from binding parts of all the literal parts
+ *
+ * @param {!Array<BindingPart>} parts All parts to stringify
+ * @return {string} String made from the literal parts
+ */
+function literalFromParts(parts) {
+ let s = '';
+ for (let i=0; i<parts.length; i++) {
+ let literal = parts[i].literal;
+ s += literal || '';
+ }
+ return s;
+}
+
+/**
+ * Parses an expression string for a method signature, and returns a metadata
+ * describing the method in terms of `methodName`, `static` (whether all the
+ * arguments are literals), and an array of `args`
+ *
+ * @param {string} expression The expression to parse
+ * @return {?MethodSignature} The method metadata object if a method expression was
+ * found, otherwise `undefined`
+ * @private
+ */
+function parseMethod(expression) {
+ // tries to match valid javascript property names
+ let m = expression.match(/([^\s]+?)\(([\s\S]*)\)/);
+ if (m) {
+ let methodName = m[1];
+ let sig = { methodName, static: true, args: emptyArray };
+ if (m[2].trim()) {
+ // replace escaped commas with comma entity, split on un-escaped commas
+ let args = m[2].replace(/\\,/g, '&comma;').split(',');
+ return parseArgs(args, sig);
+ } else {
+ return sig;
+ }
+ }
+ return null;
+}
+
+/**
+ * Parses an array of arguments and sets the `args` property of the supplied
+ * signature metadata object. Sets the `static` property to false if any
+ * argument is a non-literal.
+ *
+ * @param {!Array<string>} argList Array of argument names
+ * @param {!MethodSignature} sig Method signature metadata object
+ * @return {!MethodSignature} The updated signature metadata object
+ * @private
+ */
+function parseArgs(argList, sig) {
+ sig.args = argList.map(function(rawArg) {
+ let arg = parseArg(rawArg);
+ if (!arg.literal) {
+ sig.static = false;
+ }
+ return arg;
+ }, this);
+ return sig;
+}
+
+/**
+ * Parses an individual argument, and returns an argument metadata object
+ * with the following fields:
+ *
+ * {
+ * value: 'prop', // property/path or literal value
+ * literal: false, // whether argument is a literal
+ * structured: false, // whether the property is a path
+ * rootProperty: 'prop', // the root property of the path
+ * wildcard: false // whether the argument was a wildcard '.*' path
+ * }
+ *
+ * @param {string} rawArg The string value of the argument
+ * @return {!MethodArg} Argument metadata object
+ * @private
+ */
+function parseArg(rawArg) {
+ // clean up whitespace
+ let arg = rawArg.trim()
+ // replace comma entity with comma
+ .replace(/&comma;/g, ',')
+ // repair extra escape sequences; note only commas strictly need
+ // escaping, but we allow any other char to be escaped since its
+ // likely users will do this
+ .replace(/\\(.)/g, '\$1')
+ ;
+ // basic argument descriptor
+ let a = {
+ name: arg,
+ value: '',
+ literal: false
+ };
+ // detect literal value (must be String or Number)
+ let fc = arg[0];
+ if (fc === '-') {
+ fc = arg[1];
+ }
+ if (fc >= '0' && fc <= '9') {
+ fc = '#';
+ }
+ switch(fc) {
+ case "'":
+ case '"':
+ a.value = arg.slice(1, -1);
+ a.literal = true;
+ break;
+ case '#':
+ a.value = Number(arg);
+ a.literal = true;
+ break;
+ }
+ // if not literal, look for structured path
+ if (!a.literal) {
+ a.rootProperty = root$0(arg);
+ // detect structured path (has dots)
+ a.structured = isPath$0(arg);
+ if (a.structured) {
+ a.wildcard = (arg.slice(-2) == '.*');
+ if (a.wildcard) {
+ a.name = arg.slice(0, -2);
+ }
+ }
+ }
+ return a;
+}
+
+/**
+ * Gather the argument values for a method specified in the provided array
+ * of argument metadata.
+ *
+ * The `path` and `value` arguments are used to fill in wildcard descriptor
+ * when the method is being called as a result of a path notification.
+ *
+ * @param {Object} data Instance data storage object to read properties from
+ * @param {!Array<!MethodArg>} args Array of argument metadata
+ * @param {string} path Property/path name that triggered the method effect
+ * @param {Object} props Bag of current property changes
+ * @return {Array<*>} Array of argument values
+ * @private
+ */
+function marshalArgs(data, args, path, props) {
+ let values = [];
+ for (let i=0, l=args.length; i<l; i++) {
+ let arg = args[i];
+ let name = arg.name;
+ let v;
+ if (arg.literal) {
+ v = arg.value;
+ } else {
+ if (arg.structured) {
+ v = get$0(data, name);
+ // when data is not stored e.g. `splices`
+ if (v === undefined) {
+ v = props[name];
+ }
+ } else {
+ v = data[name];
+ }
+ }
+ if (arg.wildcard) {
+ // Only send the actual path changed info if the change that
+ // caused the observer to run matched the wildcard
+ let baseChanged = (name.indexOf(path + '.') === 0);
+ let matches = (path.indexOf(name) === 0 && !baseChanged);
+ values[i] = {
+ path: matches ? path : name,
+ value: matches ? props[path] : v,
+ base: v
+ };
+ } else {
+ values[i] = v;
+ }
+ }
+ return values;
+}
+
+// data api
+
+/**
+ * Sends array splice notifications (`.splices` and `.length`)
+ *
+ * Note: this implementation only accepts normalized paths
+ *
+ * @param {!PropertyEffectsType} inst Instance to send notifications to
+ * @param {Array} array The array the mutations occurred on
+ * @param {string} path The path to the array that was mutated
+ * @param {Array} splices Array of splice records
+ * @return {void}
+ * @private
+ */
+function notifySplices(inst, array, path, splices) {
+ let splicesPath = path + '.splices';
+ inst.notifyPath(splicesPath, { indexSplices: splices });
+ inst.notifyPath(path + '.length', array.length);
+ // Null here to allow potentially large splice records to be GC'ed.
+ inst.__data[splicesPath] = {indexSplices: null};
+}
+
+/**
+ * Creates a splice record and sends an array splice notification for
+ * the described mutation
+ *
+ * Note: this implementation only accepts normalized paths
+ *
+ * @param {!PropertyEffectsType} inst Instance to send notifications to
+ * @param {Array} array The array the mutations occurred on
+ * @param {string} path The path to the array that was mutated
+ * @param {number} index Index at which the array mutation occurred
+ * @param {number} addedCount Number of added items
+ * @param {Array} removed Array of removed items
+ * @return {void}
+ * @private
+ */
+function notifySplice(inst, array, path, index, addedCount, removed) {
+ notifySplices(inst, array, path, [{
+ index: index,
+ addedCount: addedCount,
+ removed: removed,
+ object: array,
+ type: 'splice'
+ }]);
+}
+
+/**
+ * Returns an upper-cased version of the string.
+ *
+ * @param {string} name String to uppercase
+ * @return {string} Uppercased string
+ * @private
+ */
+function upper(name) {
+ return name[0].toUpperCase() + name.substring(1);
+}
+
+/**
+ * Element class mixin that provides meta-programming for Polymer's template
+ * binding and data observation (collectively, "property effects") system.
+ *
+ * This mixin uses provides the following key static methods for adding
+ * property effects to an element class:
+ * - `addPropertyEffect`
+ * - `createPropertyObserver`
+ * - `createMethodObserver`
+ * - `createNotifyingProperty`
+ * - `createReadOnlyProperty`
+ * - `createReflectedProperty`
+ * - `createComputedProperty`
+ * - `bindTemplate`
+ *
+ * Each method creates one or more property accessors, along with metadata
+ * used by this mixin's implementation of `_propertiesChanged` to perform
+ * the property effects.
+ *
+ * Underscored versions of the above methods also exist on the element
+ * prototype for adding property effects on instances at runtime.
+ *
+ * Note that this mixin overrides several `PropertyAccessors` methods, in
+ * many cases to maintain guarantees provided by the Polymer 1.x features;
+ * notably it changes property accessors to be synchronous by default
+ * whereas the default when using `PropertyAccessors` standalone is to be
+ * async by default.
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin TemplateStamp
+ * @appliesMixin PropertyAccessors
+ * @summary Element class mixin that provides meta-programming for Polymer's
+ * template binding and data observation system.
+ */
+export const PropertyEffects = dedupingMixin(superClass => {
+
+ /**
+ * @constructor
+ * @extends {superClass}
+ * @implements {Polymer_PropertyAccessors}
+ * @implements {Polymer_TemplateStamp}
+ * @unrestricted
+ */
+ const propertyEffectsBase = TemplateStamp(PropertyAccessors(superClass));
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_PropertyEffects}
+ * @extends {propertyEffectsBase}
+ * @unrestricted
+ */
+ class PropertyEffects extends propertyEffectsBase {
+
+ constructor() {
+ super();
+ /** @type {boolean} */
+ // Used to identify users of this mixin, ala instanceof
+ this.__isPropertyEffectsClient = true;
+ /** @type {number} */
+ // NOTE: used to track re-entrant calls to `_flushProperties`
+ // path changes dirty check against `__dataTemp` only during one "turn"
+ // and are cleared when `__dataCounter` returns to 0.
+ this.__dataCounter = 0;
+ /** @type {boolean} */
+ this.__dataClientsReady;
+ /** @type {Array} */
+ this.__dataPendingClients;
+ /** @type {Object} */
+ this.__dataToNotify;
+ /** @type {Object} */
+ this.__dataLinkedPaths;
+ /** @type {boolean} */
+ this.__dataHasPaths;
+ /** @type {Object} */
+ this.__dataCompoundStorage;
+ /** @type {Polymer_PropertyEffects} */
+ this.__dataHost;
+ /** @type {!Object} */
+ this.__dataTemp;
+ /** @type {boolean} */
+ this.__dataClientsInitialized;
+ /** @type {!Object} */
+ this.__data;
+ /** @type {!Object} */
+ this.__dataPending;
+ /** @type {!Object} */
+ this.__dataOld;
+ /** @type {Object} */
+ this.__computeEffects;
+ /** @type {Object} */
+ this.__reflectEffects;
+ /** @type {Object} */
+ this.__notifyEffects;
+ /** @type {Object} */
+ this.__propagateEffects;
+ /** @type {Object} */
+ this.__observeEffects;
+ /** @type {Object} */
+ this.__readOnly;
+ /** @type {!TemplateInfo} */
+ this.__templateInfo;
+ }
+
+ get PROPERTY_EFFECT_TYPES() {
+ return TYPES;
+ }
+
+ /**
+ * @return {void}
+ */
+ _initializeProperties() {
+ super._initializeProperties();
+ hostStack.registerHost(this);
+ this.__dataClientsReady = false;
+ this.__dataPendingClients = null;
+ this.__dataToNotify = null;
+ this.__dataLinkedPaths = null;
+ this.__dataHasPaths = false;
+ // May be set on instance prior to upgrade
+ this.__dataCompoundStorage = this.__dataCompoundStorage || null;
+ this.__dataHost = this.__dataHost || null;
+ this.__dataTemp = {};
+ this.__dataClientsInitialized = false;
+ }
+
+ /**
+ * Overrides `PropertyAccessors` implementation to provide a
+ * more efficient implementation of initializing properties from
+ * the prototype on the instance.
+ *
+ * @override
+ * @param {Object} props Properties to initialize on the prototype
+ * @return {void}
+ */
+ _initializeProtoProperties(props) {
+ this.__data = Object.create(props);
+ this.__dataPending = Object.create(props);
+ this.__dataOld = {};
+ }
+
+ /**
+ * Overrides `PropertyAccessors` implementation to avoid setting
+ * `_setProperty`'s `shouldNotify: true`.
+ *
+ * @override
+ * @param {Object} props Properties to initialize on the instance
+ * @return {void}
+ */
+ _initializeInstanceProperties(props) {
+ let readOnly = this[TYPES.READ_ONLY];
+ for (let prop in props) {
+ if (!readOnly || !readOnly[prop]) {
+ this.__dataPending = this.__dataPending || {};
+ this.__dataOld = this.__dataOld || {};
+ this.__data[prop] = this.__dataPending[prop] = props[prop];
+ }
+ }
+ }
+
+ // Prototype setup ----------------------------------------
+
+ /**
+ * Equivalent to static `addPropertyEffect` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} property Property that should trigger the effect
+ * @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES
+ * @param {Object=} effect Effect metadata object
+ * @return {void}
+ * @protected
+ */
+ _addPropertyEffect(property, type, effect) {
+ this._createPropertyAccessor(property, type == TYPES.READ_ONLY);
+ // effects are accumulated into arrays per property based on type
+ let effects = ensureOwnEffectMap(this, type)[property];
+ if (!effects) {
+ effects = this[type][property] = [];
+ }
+ effects.push(effect);
+ }
+
+ /**
+ * Removes the given property effect.
+ *
+ * @param {string} property Property the effect was associated with
+ * @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES
+ * @param {Object=} effect Effect metadata object to remove
+ * @return {void}
+ */
+ _removePropertyEffect(property, type, effect) {
+ let effects = ensureOwnEffectMap(this, type)[property];
+ let idx = effects.indexOf(effect);
+ if (idx >= 0) {
+ effects.splice(idx, 1);
+ }
+ }
+
+ /**
+ * Returns whether the current prototype/instance has a property effect
+ * of a certain type.
+ *
+ * @param {string} property Property name
+ * @param {string=} type Effect type, from this.PROPERTY_EFFECT_TYPES
+ * @return {boolean} True if the prototype/instance has an effect of this type
+ * @protected
+ */
+ _hasPropertyEffect(property, type) {
+ let effects = this[type];
+ return Boolean(effects && effects[property]);
+ }
+
+ /**
+ * Returns whether the current prototype/instance has a "read only"
+ * accessor for the given property.
+ *
+ * @param {string} property Property name
+ * @return {boolean} True if the prototype/instance has an effect of this type
+ * @protected
+ */
+ _hasReadOnlyEffect(property) {
+ return this._hasPropertyEffect(property, TYPES.READ_ONLY);
+ }
+
+ /**
+ * Returns whether the current prototype/instance has a "notify"
+ * property effect for the given property.
+ *
+ * @param {string} property Property name
+ * @return {boolean} True if the prototype/instance has an effect of this type
+ * @protected
+ */
+ _hasNotifyEffect(property) {
+ return this._hasPropertyEffect(property, TYPES.NOTIFY);
+ }
+
+ /**
+ * Returns whether the current prototype/instance has a "reflect to attribute"
+ * property effect for the given property.
+ *
+ * @param {string} property Property name
+ * @return {boolean} True if the prototype/instance has an effect of this type
+ * @protected
+ */
+ _hasReflectEffect(property) {
+ return this._hasPropertyEffect(property, TYPES.REFLECT);
+ }
+
+ /**
+ * Returns whether the current prototype/instance has a "computed"
+ * property effect for the given property.
+ *
+ * @param {string} property Property name
+ * @return {boolean} True if the prototype/instance has an effect of this type
+ * @protected
+ */
+ _hasComputedEffect(property) {
+ return this._hasPropertyEffect(property, TYPES.COMPUTE);
+ }
+
+ // Runtime ----------------------------------------
+
+ /**
+ * Sets a pending property or path. If the root property of the path in
+ * question had no accessor, the path is set, otherwise it is enqueued
+ * via `_setPendingProperty`.
+ *
+ * This function isolates relatively expensive functionality necessary
+ * for the public API (`set`, `setProperties`, `notifyPath`, and property
+ * change listeners via {{...}} bindings), such that it is only done
+ * when paths enter the system, and not at every propagation step. It
+ * also sets a `__dataHasPaths` flag on the instance which is used to
+ * fast-path slower path-matching code in the property effects host paths.
+ *
+ * `path` can be a path string or array of path parts as accepted by the
+ * public API.
+ *
+ * @param {string | !Array<number|string>} path Path to set
+ * @param {*} value Value to set
+ * @param {boolean=} shouldNotify Set to true if this change should
+ * cause a property notification event dispatch
+ * @param {boolean=} isPathNotification If the path being set is a path
+ * notification of an already changed value, as opposed to a request
+ * to set and notify the change. In the latter `false` case, a dirty
+ * check is performed and then the value is set to the path before
+ * enqueuing the pending property change.
+ * @return {boolean} Returns true if the property/path was enqueued in
+ * the pending changes bag.
+ * @protected
+ */
+ _setPendingPropertyOrPath(path, value, shouldNotify, isPathNotification) {
+ if (isPathNotification ||
+ root$0(Array.isArray(path) ? path[0] : path) !== path) {
+ // Dirty check changes being set to a path against the actual object,
+ // since this is the entry point for paths into the system; from here
+ // the only dirty checks are against the `__dataTemp` cache to prevent
+ // duplicate work in the same turn only. Note, if this was a notification
+ // of a change already set to a path (isPathNotification: true),
+ // we always let the change through and skip the `set` since it was
+ // already dirty checked at the point of entry and the underlying
+ // object has already been updated
+ if (!isPathNotification) {
+ let old = get$0(this, path);
+ path = /** @type {string} */ (set$0(this, path, value));
+ // Use property-accessor's simpler dirty check
+ if (!path || !super._shouldPropertyChange(path, value, old)) {
+ return false;
+ }
+ }
+ this.__dataHasPaths = true;
+ if (this._setPendingProperty(/**@type{string}*/(path), value, shouldNotify)) {
+ computeLinkedPaths(this, path, value);
+ return true;
+ }
+ } else {
+ if (this.__dataHasAccessor && this.__dataHasAccessor[path]) {
+ return this._setPendingProperty(/**@type{string}*/(path), value, shouldNotify);
+ } else {
+ this[path] = value;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Applies a value to a non-Polymer element/node's property.
+ *
+ * The implementation makes a best-effort at binding interop:
+ * Some native element properties have side-effects when
+ * re-setting the same value (e.g. setting `<input>.value` resets the
+ * cursor position), so we do a dirty-check before setting the value.
+ * However, for better interop with non-Polymer custom elements that
+ * accept objects, we explicitly re-set object changes coming from the
+ * Polymer world (which may include deep object changes without the
+ * top reference changing), erring on the side of providing more
+ * information.
+ *
+ * Users may override this method to provide alternate approaches.
+ *
+ * @param {!Node} node The node to set a property on
+ * @param {string} prop The property to set
+ * @param {*} value The value to set
+ * @return {void}
+ * @protected
+ */
+ _setUnmanagedPropertyToNode(node, prop, value) {
+ // It is a judgment call that resetting primitives is
+ // "bad" and resettings objects is also "good"; alternatively we could
+ // implement a whitelist of tag & property values that should never
+ // be reset (e.g. <input>.value && <select>.value)
+ if (value !== node[prop] || typeof value == 'object') {
+ node[prop] = value;
+ }
+ }
+
+ /**
+ * Overrides the `PropertiesChanged` implementation to introduce special
+ * dirty check logic depending on the property & value being set:
+ *
+ * 1. Any value set to a path (e.g. 'obj.prop': 42 or 'obj.prop': {...})
+ * Stored in `__dataTemp`, dirty checked against `__dataTemp`
+ * 2. Object set to simple property (e.g. 'prop': {...})
+ * Stored in `__dataTemp` and `__data`, dirty checked against
+ * `__dataTemp` by default implementation of `_shouldPropertyChange`
+ * 3. Primitive value set to simple property (e.g. 'prop': 42)
+ * Stored in `__data`, dirty checked against `__data`
+ *
+ * The dirty-check is important to prevent cycles due to two-way
+ * notification, but paths and objects are only dirty checked against any
+ * previous value set during this turn via a "temporary cache" that is
+ * cleared when the last `_propertiesChanged` exits. This is so:
+ * a. any cached array paths (e.g. 'array.3.prop') may be invalidated
+ * due to array mutations like shift/unshift/splice; this is fine
+ * since path changes are dirty-checked at user entry points like `set`
+ * b. dirty-checking for objects only lasts one turn to allow the user
+ * to mutate the object in-place and re-set it with the same identity
+ * and have all sub-properties re-propagated in a subsequent turn.
+ *
+ * The temp cache is not necessarily sufficient to prevent invalid array
+ * paths, since a splice can happen during the same turn (with pathological
+ * user code); we could introduce a "fixup" for temporarily cached array
+ * paths if needed: https://github.com/Polymer/polymer/issues/4227
+ *
+ * @override
+ * @param {string} property Name of the property
+ * @param {*} value Value to set
+ * @param {boolean=} shouldNotify True if property should fire notification
+ * event (applies only for `notify: true` properties)
+ * @return {boolean} Returns true if the property changed
+ */
+ _setPendingProperty(property, value, shouldNotify) {
+ let isPath = this.__dataHasPaths && isPath$0(property);
+ let prevProps = isPath ? this.__dataTemp : this.__data;
+ if (this._shouldPropertyChange(property, value, prevProps[property])) {
+ if (!this.__dataPending) {
+ this.__dataPending = {};
+ this.__dataOld = {};
+ }
+ // Ensure old is captured from the last turn
+ if (!(property in this.__dataOld)) {
+ this.__dataOld[property] = this.__data[property];
+ }
+ // Paths are stored in temporary cache (cleared at end of turn),
+ // which is used for dirty-checking, all others stored in __data
+ if (isPath) {
+ this.__dataTemp[property] = value;
+ } else {
+ this.__data[property] = value;
+ }
+ // All changes go into pending property bag, passed to _propertiesChanged
+ this.__dataPending[property] = value;
+ // Track properties that should notify separately
+ if (isPath || (this[TYPES.NOTIFY] && this[TYPES.NOTIFY][property])) {
+ this.__dataToNotify = this.__dataToNotify || {};
+ this.__dataToNotify[property] = shouldNotify;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Overrides base implementation to ensure all accessors set `shouldNotify`
+ * to true, for per-property notification tracking.
+ *
+ * @override
+ * @param {string} property Name of the property
+ * @param {*} value Value to set
+ * @return {void}
+ */
+ _setProperty(property, value) {
+ if (this._setPendingProperty(property, value, true)) {
+ this._invalidateProperties();
+ }
+ }
+
+ /**
+ * Overrides `PropertyAccessor`'s default async queuing of
+ * `_propertiesChanged`: if `__dataReady` is false (has not yet been
+ * manually flushed), the function no-ops; otherwise flushes
+ * `_propertiesChanged` synchronously.
+ *
+ * @override
+ * @return {void}
+ */
+ _invalidateProperties() {
+ if (this.__dataReady) {
+ this._flushProperties();
+ }
+ }
+
+ /**
+ * Enqueues the given client on a list of pending clients, whose
+ * pending property changes can later be flushed via a call to
+ * `_flushClients`.
+ *
+ * @param {Object} client PropertyEffects client to enqueue
+ * @return {void}
+ * @protected
+ */
+ _enqueueClient(client) {
+ this.__dataPendingClients = this.__dataPendingClients || [];
+ if (client !== this) {
+ this.__dataPendingClients.push(client);
+ }
+ }
+
+ /**
+ * Overrides superclass implementation.
+ *
+ * @return {void}
+ * @protected
+ */
+ _flushProperties() {
+ this.__dataCounter++;
+ super._flushProperties();
+ this.__dataCounter--;
+ }
+
+ /**
+ * Flushes any clients previously enqueued via `_enqueueClient`, causing
+ * their `_flushProperties` method to run.
+ *
+ * @return {void}
+ * @protected
+ */
+ _flushClients() {
+ if (!this.__dataClientsReady) {
+ this.__dataClientsReady = true;
+ this._readyClients();
+ // Override point where accessors are turned on; importantly,
+ // this is after clients have fully readied, providing a guarantee
+ // that any property effects occur only after all clients are ready.
+ this.__dataReady = true;
+ } else {
+ this.__enableOrFlushClients();
+ }
+ }
+
+ // NOTE: We ensure clients either enable or flush as appropriate. This
+ // handles two corner cases:
+ // (1) clients flush properly when connected/enabled before the host
+ // enables; e.g.
+ // (a) Templatize stamps with no properties and does not flush and
+ // (b) the instance is inserted into dom and
+ // (c) then the instance flushes.
+ // (2) clients enable properly when not connected/enabled when the host
+ // flushes; e.g.
+ // (a) a template is runtime stamped and not yet connected/enabled
+ // (b) a host sets a property, causing stamped dom to flush
+ // (c) the stamped dom enables.
+ __enableOrFlushClients() {
+ let clients = this.__dataPendingClients;
+ if (clients) {
+ this.__dataPendingClients = null;
+ for (let i=0; i < clients.length; i++) {
+ let client = clients[i];
+ if (!client.__dataEnabled) {
+ client._enableProperties();
+ } else if (client.__dataPending) {
+ client._flushProperties();
+ }
+ }
+ }
+ }
+
+ /**
+ * Perform any initial setup on client dom. Called before the first
+ * `_flushProperties` call on client dom and before any element
+ * observers are called.
+ *
+ * @return {void}
+ * @protected
+ */
+ _readyClients() {
+ this.__enableOrFlushClients();
+ }
+
+ /**
+ * Sets a bag of property changes to this instance, and
+ * synchronously processes all effects of the properties as a batch.
+ *
+ * Property names must be simple properties, not paths. Batched
+ * path propagation is not supported.
+ *
+ * @param {Object} props Bag of one or more key-value pairs whose key is
+ * a property and value is the new value to set for that property.
+ * @param {boolean=} setReadOnly When true, any private values set in
+ * `props` will be set. By default, `setProperties` will not set
+ * `readOnly: true` root properties.
+ * @return {void}
+ * @public
+ */
+ setProperties(props, setReadOnly) {
+ for (let path in props) {
+ if (setReadOnly || !this[TYPES.READ_ONLY] || !this[TYPES.READ_ONLY][path]) {
+ //TODO(kschaaf): explicitly disallow paths in setProperty?
+ // wildcard observers currently only pass the first changed path
+ // in the `info` object, and you could do some odd things batching
+ // paths, e.g. {'foo.bar': {...}, 'foo': null}
+ this._setPendingPropertyOrPath(path, props[path], true);
+ }
+ }
+ this._invalidateProperties();
+ }
+
+ /**
+ * Overrides `PropertyAccessors` so that property accessor
+ * side effects are not enabled until after client dom is fully ready.
+ * Also calls `_flushClients` callback to ensure client dom is enabled
+ * that was not enabled as a result of flushing properties.
+ *
+ * @override
+ * @return {void}
+ */
+ ready() {
+ // It is important that `super.ready()` is not called here as it
+ // immediately turns on accessors. Instead, we wait until `readyClients`
+ // to enable accessors to provide a guarantee that clients are ready
+ // before processing any accessors side effects.
+ this._flushProperties();
+ // If no data was pending, `_flushProperties` will not `flushClients`
+ // so ensure this is done.
+ if (!this.__dataClientsReady) {
+ this._flushClients();
+ }
+ // Before ready, client notifications do not trigger _flushProperties.
+ // Therefore a flush is necessary here if data has been set.
+ if (this.__dataPending) {
+ this._flushProperties();
+ }
+ }
+
+ /**
+ * Implements `PropertyAccessors`'s properties changed callback.
+ *
+ * Runs each class of effects for the batch of changed properties in
+ * a specific order (compute, propagate, reflect, observe, notify).
+ *
+ * @param {!Object} currentProps Bag of all current accessor values
+ * @param {!Object} changedProps Bag of properties changed since the last
+ * call to `_propertiesChanged`
+ * @param {!Object} oldProps Bag of previous values for each property
+ * in `changedProps`
+ * @return {void}
+ */
+ _propertiesChanged(currentProps, changedProps, oldProps) {
+ // ----------------------------
+ // let c = Object.getOwnPropertyNames(changedProps || {});
+ // window.debug && console.group(this.localName + '#' + this.id + ': ' + c);
+ // if (window.debug) { debugger; }
+ // ----------------------------
+ let hasPaths = this.__dataHasPaths;
+ this.__dataHasPaths = false;
+ // Compute properties
+ runComputedEffects(this, changedProps, oldProps, hasPaths);
+ // Clear notify properties prior to possible reentry (propagate, observe),
+ // but after computing effects have a chance to add to them
+ let notifyProps = this.__dataToNotify;
+ this.__dataToNotify = null;
+ // Propagate properties to clients
+ this._propagatePropertyChanges(changedProps, oldProps, hasPaths);
+ // Flush clients
+ this._flushClients();
+ // Reflect properties
+ runEffects(this, this[TYPES.REFLECT], changedProps, oldProps, hasPaths);
+ // Observe properties
+ runEffects(this, this[TYPES.OBSERVE], changedProps, oldProps, hasPaths);
+ // Notify properties to host
+ if (notifyProps) {
+ runNotifyEffects(this, notifyProps, changedProps, oldProps, hasPaths);
+ }
+ // Clear temporary cache at end of turn
+ if (this.__dataCounter == 1) {
+ this.__dataTemp = {};
+ }
+ // ----------------------------
+ // window.debug && console.groupEnd(this.localName + '#' + this.id + ': ' + c);
+ // ----------------------------
+ }
+
+ /**
+ * Called to propagate any property changes to stamped template nodes
+ * managed by this element.
+ *
+ * @param {Object} changedProps Bag of changed properties
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {boolean} hasPaths True with `props` contains one or more paths
+ * @return {void}
+ * @protected
+ */
+ _propagatePropertyChanges(changedProps, oldProps, hasPaths) {
+ if (this[TYPES.PROPAGATE]) {
+ runEffects(this, this[TYPES.PROPAGATE], changedProps, oldProps, hasPaths);
+ }
+ let templateInfo = this.__templateInfo;
+ while (templateInfo) {
+ runEffects(this, templateInfo.propertyEffects, changedProps, oldProps,
+ hasPaths, templateInfo.nodeList);
+ templateInfo = templateInfo.nextTemplateInfo;
+ }
+ }
+
+ /**
+ * Aliases one data path as another, such that path notifications from one
+ * are routed to the other.
+ *
+ * @param {string | !Array<string|number>} to Target path to link.
+ * @param {string | !Array<string|number>} from Source path to link.
+ * @return {void}
+ * @public
+ */
+ linkPaths(to, from) {
+ to = normalize(to);
+ from = normalize(from);
+ this.__dataLinkedPaths = this.__dataLinkedPaths || {};
+ this.__dataLinkedPaths[to] = from;
+ }
+
+ /**
+ * Removes a data path alias previously established with `_linkPaths`.
+ *
+ * Note, the path to unlink should be the target (`to`) used when
+ * linking the paths.
+ *
+ * @param {string | !Array<string|number>} path Target path to unlink.
+ * @return {void}
+ * @public
+ */
+ unlinkPaths(path) {
+ path = normalize(path);
+ if (this.__dataLinkedPaths) {
+ delete this.__dataLinkedPaths[path];
+ }
+ }
+
+ /**
+ * Notify that an array has changed.
+ *
+ * Example:
+ *
+ * this.items = [ {name: 'Jim'}, {name: 'Todd'}, {name: 'Bill'} ];
+ * ...
+ * this.items.splice(1, 1, {name: 'Sam'});
+ * this.items.push({name: 'Bob'});
+ * this.notifySplices('items', [
+ * { index: 1, removed: [{name: 'Todd'}], addedCount: 1, object: this.items, type: 'splice' },
+ * { index: 3, removed: [], addedCount: 1, object: this.items, type: 'splice'}
+ * ]);
+ *
+ * @param {string} path Path that should be notified.
+ * @param {Array} splices Array of splice records indicating ordered
+ * changes that occurred to the array. Each record should have the
+ * following fields:
+ * * index: index at which the change occurred
+ * * removed: array of items that were removed from this index
+ * * addedCount: number of new items added at this index
+ * * object: a reference to the array in question
+ * * type: the string literal 'splice'
+ *
+ * Note that splice records _must_ be normalized such that they are
+ * reported in index order (raw results from `Object.observe` are not
+ * ordered and must be normalized/merged before notifying).
+ * @return {void}
+ * @public
+ */
+ notifySplices(path, splices) {
+ let info = {path: ''};
+ let array = /** @type {Array} */(get$0(this, path, info));
+ notifySplices(this, array, info.path, splices);
+ }
+
+ /**
+ * Convenience method for reading a value from a path.
+ *
+ * Note, if any part in the path is undefined, this method returns
+ * `undefined` (this method does not throw when dereferencing undefined
+ * paths).
+ *
+ * @param {(string|!Array<(string|number)>)} path Path to the value
+ * to read. The path may be specified as a string (e.g. `foo.bar.baz`)
+ * or an array of path parts (e.g. `['foo.bar', 'baz']`). Note that
+ * bracketed expressions are not supported; string-based path parts
+ * *must* be separated by dots. Note that when dereferencing array
+ * indices, the index may be used as a dotted part directly
+ * (e.g. `users.12.name` or `['users', 12, 'name']`).
+ * @param {Object=} root Root object from which the path is evaluated.
+ * @return {*} Value at the path, or `undefined` if any part of the path
+ * is undefined.
+ * @public
+ */
+ get(path, root) {
+ return get$0(root || this, path);
+ }
+
+ /**
+ * Convenience method for setting a value to a path and notifying any
+ * elements bound to the same path.
+ *
+ * Note, if any part in the path except for the last is undefined,
+ * this method does nothing (this method does not throw when
+ * dereferencing undefined paths).
+ *
+ * @param {(string|!Array<(string|number)>)} path Path to the value
+ * to write. The path may be specified as a string (e.g. `'foo.bar.baz'`)
+ * or an array of path parts (e.g. `['foo.bar', 'baz']`). Note that
+ * bracketed expressions are not supported; string-based path parts
+ * *must* be separated by dots. Note that when dereferencing array
+ * indices, the index may be used as a dotted part directly
+ * (e.g. `'users.12.name'` or `['users', 12, 'name']`).
+ * @param {*} value Value to set at the specified path.
+ * @param {Object=} root Root object from which the path is evaluated.
+ * When specified, no notification will occur.
+ * @return {void}
+ * @public
+ */
+ set(path, value, root) {
+ if (root) {
+ set$0(root, path, value);
+ } else {
+ if (!this[TYPES.READ_ONLY] || !this[TYPES.READ_ONLY][/** @type {string} */(path)]) {
+ if (this._setPendingPropertyOrPath(path, value, true)) {
+ this._invalidateProperties();
+ }
+ }
+ }
+ }
+
+ /**
+ * Adds items onto the end of the array at the path specified.
+ *
+ * The arguments after `path` and return value match that of
+ * `Array.prototype.push`.
+ *
+ * This method notifies other paths to the same array that a
+ * splice occurred to the array.
+ *
+ * @param {string | !Array<string|number>} path Path to array.
+ * @param {...*} items Items to push onto array
+ * @return {number} New length of the array.
+ * @public
+ */
+ push(path, ...items) {
+ let info = {path: ''};
+ let array = /** @type {Array}*/(get$0(this, path, info));
+ let len = array.length;
+ let ret = array.push(...items);
+ if (items.length) {
+ notifySplice(this, array, info.path, len, items.length, []);
+ }
+ return ret;
+ }
+
+ /**
+ * Removes an item from the end of array at the path specified.
+ *
+ * The arguments after `path` and return value match that of
+ * `Array.prototype.pop`.
+ *
+ * This method notifies other paths to the same array that a
+ * splice occurred to the array.
+ *
+ * @param {string | !Array<string|number>} path Path to array.
+ * @return {*} Item that was removed.
+ * @public
+ */
+ pop(path) {
+ let info = {path: ''};
+ let array = /** @type {Array} */(get$0(this, path, info));
+ let hadLength = Boolean(array.length);
+ let ret = array.pop();
+ if (hadLength) {
+ notifySplice(this, array, info.path, array.length, 0, [ret]);
+ }
+ return ret;
+ }
+
+ /**
+ * Starting from the start index specified, removes 0 or more items
+ * from the array and inserts 0 or more new items in their place.
+ *
+ * The arguments after `path` and return value match that of
+ * `Array.prototype.splice`.
+ *
+ * This method notifies other paths to the same array that a
+ * splice occurred to the array.
+ *
+ * @param {string | !Array<string|number>} path Path to array.
+ * @param {number} start Index from which to start removing/inserting.
+ * @param {number} deleteCount Number of items to remove.
+ * @param {...*} items Items to insert into array.
+ * @return {Array} Array of removed items.
+ * @public
+ */
+ splice(path, start, deleteCount, ...items) {
+ let info = {path : ''};
+ let array = /** @type {Array} */(get$0(this, path, info));
+ // Normalize fancy native splice handling of crazy start values
+ if (start < 0) {
+ start = array.length - Math.floor(-start);
+ } else if (start) {
+ start = Math.floor(start);
+ }
+ // array.splice does different things based on the number of arguments
+ // you pass in. Therefore, array.splice(0) and array.splice(0, undefined)
+ // do different things. In the former, the whole array is cleared. In the
+ // latter, no items are removed.
+ // This means that we need to detect whether 1. one of the arguments
+ // is actually passed in and then 2. determine how many arguments
+ // we should pass on to the native array.splice
+ //
+ let ret;
+ // Omit any additional arguments if they were not passed in
+ if (arguments.length === 2) {
+ ret = array.splice(start);
+ // Either start was undefined and the others were defined, but in this
+ // case we can safely pass on all arguments
+ //
+ // Note: this includes the case where none of the arguments were passed in,
+ // e.g. this.splice('array'). However, if both start and deleteCount
+ // are undefined, array.splice will not modify the array (as expected)
+ } else {
+ ret = array.splice(start, deleteCount, ...items);
+ }
+ // At the end, check whether any items were passed in (e.g. insertions)
+ // or if the return array contains items (e.g. deletions).
+ // Only notify if items were added or deleted.
+ if (items.length || ret.length) {
+ notifySplice(this, array, info.path, start, items.length, ret);
+ }
+ return ret;
+ }
+
+ /**
+ * Removes an item from the beginning of array at the path specified.
+ *
+ * The arguments after `path` and return value match that of
+ * `Array.prototype.pop`.
+ *
+ * This method notifies other paths to the same array that a
+ * splice occurred to the array.
+ *
+ * @param {string | !Array<string|number>} path Path to array.
+ * @return {*} Item that was removed.
+ * @public
+ */
+ shift(path) {
+ let info = {path: ''};
+ let array = /** @type {Array} */(get$0(this, path, info));
+ let hadLength = Boolean(array.length);
+ let ret = array.shift();
+ if (hadLength) {
+ notifySplice(this, array, info.path, 0, 0, [ret]);
+ }
+ return ret;
+ }
+
+ /**
+ * Adds items onto the beginning of the array at the path specified.
+ *
+ * The arguments after `path` and return value match that of
+ * `Array.prototype.push`.
+ *
+ * This method notifies other paths to the same array that a
+ * splice occurred to the array.
+ *
+ * @param {string | !Array<string|number>} path Path to array.
+ * @param {...*} items Items to insert info array
+ * @return {number} New length of the array.
+ * @public
+ */
+ unshift(path, ...items) {
+ let info = {path: ''};
+ let array = /** @type {Array} */(get$0(this, path, info));
+ let ret = array.unshift(...items);
+ if (items.length) {
+ notifySplice(this, array, info.path, 0, items.length, []);
+ }
+ return ret;
+ }
+
+ /**
+ * Notify that a path has changed.
+ *
+ * Example:
+ *
+ * this.item.user.name = 'Bob';
+ * this.notifyPath('item.user.name');
+ *
+ * @param {string} path Path that should be notified.
+ * @param {*=} value Value at the path (optional).
+ * @return {void}
+ * @public
+ */
+ notifyPath(path, value) {
+ /** @type {string} */
+ let propPath;
+ if (arguments.length == 1) {
+ // Get value if not supplied
+ let info = {path: ''};
+ value = get$0(this, path, info);
+ propPath = info.path;
+ } else if (Array.isArray(path)) {
+ // Normalize path if needed
+ propPath = normalize(path);
+ } else {
+ propPath = /** @type{string} */(path);
+ }
+ if (this._setPendingPropertyOrPath(propPath, value, true, true)) {
+ this._invalidateProperties();
+ }
+ }
+
+ /**
+ * Equivalent to static `createReadOnlyProperty` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} property Property name
+ * @param {boolean=} protectedSetter Creates a custom protected setter
+ * when `true`.
+ * @return {void}
+ * @protected
+ */
+ _createReadOnlyProperty(property, protectedSetter) {
+ this._addPropertyEffect(property, TYPES.READ_ONLY);
+ if (protectedSetter) {
+ this['_set' + upper(property)] = /** @this {PropertyEffects} */function(value) {
+ this._setProperty(property, value);
+ };
+ }
+ }
+
+ /**
+ * Equivalent to static `createPropertyObserver` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} property Property name
+ * @param {string|function(*,*)} method Function or name of observer method to call
+ * @param {boolean=} dynamicFn Whether the method name should be included as
+ * a dependency to the effect.
+ * @return {void}
+ * @protected
+ */
+ _createPropertyObserver(property, method, dynamicFn) {
+ let info = { property, method, dynamicFn: Boolean(dynamicFn) };
+ this._addPropertyEffect(property, TYPES.OBSERVE, {
+ fn: runObserverEffect, info, trigger: {name: property}
+ });
+ if (dynamicFn) {
+ this._addPropertyEffect(/** @type {string} */(method), TYPES.OBSERVE, {
+ fn: runObserverEffect, info, trigger: {name: method}
+ });
+ }
+ }
+
+ /**
+ * Equivalent to static `createMethodObserver` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} expression Method expression
+ * @param {boolean|Object=} dynamicFn Boolean or object map indicating
+ * whether method names should be included as a dependency to the effect.
+ * @return {void}
+ * @protected
+ */
+ _createMethodObserver(expression, dynamicFn) {
+ let sig = parseMethod(expression);
+ if (!sig) {
+ throw new Error("Malformed observer expression '" + expression + "'");
+ }
+ createMethodEffect(this, sig, TYPES.OBSERVE, runMethodEffect, null, dynamicFn);
+ }
+
+ /**
+ * Equivalent to static `createNotifyingProperty` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} property Property name
+ * @return {void}
+ * @protected
+ */
+ _createNotifyingProperty(property) {
+ this._addPropertyEffect(property, TYPES.NOTIFY, {
+ fn: runNotifyEffect,
+ info: {
+ eventName: CaseMap.camelToDashCase(property) + '-changed',
+ property: property
+ }
+ });
+ }
+
+ /**
+ * Equivalent to static `createReflectedProperty` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} property Property name
+ * @return {void}
+ * @protected
+ */
+ _createReflectedProperty(property) {
+ let attr = this.constructor.attributeNameForProperty(property);
+ if (attr[0] === '-') {
+ console.warn('Property ' + property + ' cannot be reflected to attribute ' +
+ attr + ' because "-" is not a valid starting attribute name. Use a lowercase first letter for the property instead.');
+ } else {
+ this._addPropertyEffect(property, TYPES.REFLECT, {
+ fn: runReflectEffect,
+ info: {
+ attrName: attr
+ }
+ });
+ }
+ }
+
+ /**
+ * Equivalent to static `createComputedProperty` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} property Name of computed property to set
+ * @param {string} expression Method expression
+ * @param {boolean|Object=} dynamicFn Boolean or object map indicating
+ * whether method names should be included as a dependency to the effect.
+ * @return {void}
+ * @protected
+ */
+ _createComputedProperty(property, expression, dynamicFn) {
+ let sig = parseMethod(expression);
+ if (!sig) {
+ throw new Error("Malformed computed expression '" + expression + "'");
+ }
+ createMethodEffect(this, sig, TYPES.COMPUTE, runComputedEffect, property, dynamicFn);
+ }
+
+ // -- static class methods ------------
+
+ /**
+ * Ensures an accessor exists for the specified property, and adds
+ * to a list of "property effects" that will run when the accessor for
+ * the specified property is set. Effects are grouped by "type", which
+ * roughly corresponds to a phase in effect processing. The effect
+ * metadata should be in the following form:
+ *
+ * {
+ * fn: effectFunction, // Reference to function to call to perform effect
+ * info: { ... } // Effect metadata passed to function
+ * trigger: { // Optional triggering metadata; if not provided
+ * name: string // the property is treated as a wildcard
+ * structured: boolean
+ * wildcard: boolean
+ * }
+ * }
+ *
+ * Effects are called from `_propertiesChanged` in the following order by
+ * type:
+ *
+ * 1. COMPUTE
+ * 2. PROPAGATE
+ * 3. REFLECT
+ * 4. OBSERVE
+ * 5. NOTIFY
+ *
+ * Effect functions are called with the following signature:
+ *
+ * effectFunction(inst, path, props, oldProps, info, hasPaths)
+ *
+ * @param {string} property Property that should trigger the effect
+ * @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES
+ * @param {Object=} effect Effect metadata object
+ * @return {void}
+ * @protected
+ */
+ static addPropertyEffect(property, type, effect) {
+ this.prototype._addPropertyEffect(property, type, effect);
+ }
+
+ /**
+ * Creates a single-property observer for the given property.
+ *
+ * @param {string} property Property name
+ * @param {string|function(*,*)} method Function or name of observer method to call
+ * @param {boolean=} dynamicFn Whether the method name should be included as
+ * a dependency to the effect.
+ * @return {void}
+ * @protected
+ */
+ static createPropertyObserver(property, method, dynamicFn) {
+ this.prototype._createPropertyObserver(property, method, dynamicFn);
+ }
+
+ /**
+ * Creates a multi-property "method observer" based on the provided
+ * expression, which should be a string in the form of a normal JavaScript
+ * function signature: `'methodName(arg1, [..., argn])'`. Each argument
+ * should correspond to a property or path in the context of this
+ * prototype (or instance), or may be a literal string or number.
+ *
+ * @param {string} expression Method expression
+ * @param {boolean|Object=} dynamicFn Boolean or object map indicating
+ * @return {void}
+ * whether method names should be included as a dependency to the effect.
+ * @protected
+ */
+ static createMethodObserver(expression, dynamicFn) {
+ this.prototype._createMethodObserver(expression, dynamicFn);
+ }
+
+ /**
+ * Causes the setter for the given property to dispatch `<property>-changed`
+ * events to notify of changes to the property.
+ *
+ * @param {string} property Property name
+ * @return {void}
+ * @protected
+ */
+ static createNotifyingProperty(property) {
+ this.prototype._createNotifyingProperty(property);
+ }
+
+ /**
+ * Creates a read-only accessor for the given property.
+ *
+ * To set the property, use the protected `_setProperty` API.
+ * To create a custom protected setter (e.g. `_setMyProp()` for
+ * property `myProp`), pass `true` for `protectedSetter`.
+ *
+ * Note, if the property will have other property effects, this method
+ * should be called first, before adding other effects.
+ *
+ * @param {string} property Property name
+ * @param {boolean=} protectedSetter Creates a custom protected setter
+ * when `true`.
+ * @return {void}
+ * @protected
+ */
+ static createReadOnlyProperty(property, protectedSetter) {
+ this.prototype._createReadOnlyProperty(property, protectedSetter);
+ }
+
+ /**
+ * Causes the setter for the given property to reflect the property value
+ * to a (dash-cased) attribute of the same name.
+ *
+ * @param {string} property Property name
+ * @return {void}
+ * @protected
+ */
+ static createReflectedProperty(property) {
+ this.prototype._createReflectedProperty(property);
+ }
+
+ /**
+ * Creates a computed property whose value is set to the result of the
+ * method described by the given `expression` each time one or more
+ * arguments to the method changes. The expression should be a string
+ * in the form of a normal JavaScript function signature:
+ * `'methodName(arg1, [..., argn])'`
+ *
+ * @param {string} property Name of computed property to set
+ * @param {string} expression Method expression
+ * @param {boolean|Object=} dynamicFn Boolean or object map indicating whether
+ * method names should be included as a dependency to the effect.
+ * @return {void}
+ * @protected
+ */
+ static createComputedProperty(property, expression, dynamicFn) {
+ this.prototype._createComputedProperty(property, expression, dynamicFn);
+ }
+
+ /**
+ * Parses the provided template to ensure binding effects are created
+ * for them, and then ensures property accessors are created for any
+ * dependent properties in the template. Binding effects for bound
+ * templates are stored in a linked list on the instance so that
+ * templates can be efficiently stamped and unstamped.
+ *
+ * @param {!HTMLTemplateElement} template Template containing binding
+ * bindings
+ * @return {!TemplateInfo} Template metadata object
+ * @protected
+ */
+ static bindTemplate(template) {
+ return this.prototype._bindTemplate(template);
+ }
+
+ // -- binding ----------------------------------------------
+
+ /**
+ * Equivalent to static `bindTemplate` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * This method may be called on the prototype (for prototypical template
+ * binding, to avoid creating accessors every instance) once per prototype,
+ * and will be called with `runtimeBinding: true` by `_stampTemplate` to
+ * create and link an instance of the template metadata associated with a
+ * particular stamping.
+ *
+ * @param {!HTMLTemplateElement} template Template containing binding
+ * bindings
+ * @param {boolean=} instanceBinding When false (default), performs
+ * "prototypical" binding of the template and overwrites any previously
+ * bound template for the class. When true (as passed from
+ * `_stampTemplate`), the template info is instanced and linked into
+ * the list of bound templates.
+ * @return {!TemplateInfo} Template metadata object; for `runtimeBinding`,
+ * this is an instance of the prototypical template info
+ * @protected
+ */
+ _bindTemplate(template, instanceBinding) {
+ let templateInfo = this.constructor._parseTemplate(template);
+ let wasPreBound = this.__templateInfo == templateInfo;
+ // Optimization: since this is called twice for proto-bound templates,
+ // don't attempt to recreate accessors if this template was pre-bound
+ if (!wasPreBound) {
+ for (let prop in templateInfo.propertyEffects) {
+ this._createPropertyAccessor(prop);
+ }
+ }
+ if (instanceBinding) {
+ // For instance-time binding, create instance of template metadata
+ // and link into list of templates if necessary
+ templateInfo = /** @type {!TemplateInfo} */(Object.create(templateInfo));
+ templateInfo.wasPreBound = wasPreBound;
+ if (!wasPreBound && this.__templateInfo) {
+ let last = this.__templateInfoLast || this.__templateInfo;
+ this.__templateInfoLast = last.nextTemplateInfo = templateInfo;
+ templateInfo.previousTemplateInfo = last;
+ return templateInfo;
+ }
+ }
+ return this.__templateInfo = templateInfo;
+ }
+
+ /**
+ * Adds a property effect to the given template metadata, which is run
+ * at the "propagate" stage of `_propertiesChanged` when the template
+ * has been bound to the element via `_bindTemplate`.
+ *
+ * The `effect` object should match the format in `_addPropertyEffect`.
+ *
+ * @param {Object} templateInfo Template metadata to add effect to
+ * @param {string} prop Property that should trigger the effect
+ * @param {Object=} effect Effect metadata object
+ * @return {void}
+ * @protected
+ */
+ static _addTemplatePropertyEffect(templateInfo, prop, effect) {
+ let hostProps = templateInfo.hostProps = templateInfo.hostProps || {};
+ hostProps[prop] = true;
+ let effects = templateInfo.propertyEffects = templateInfo.propertyEffects || {};
+ let propEffects = effects[prop] = effects[prop] || [];
+ propEffects.push(effect);
+ }
+
+ /**
+ * Stamps the provided template and performs instance-time setup for
+ * Polymer template features, including data bindings, declarative event
+ * listeners, and the `this.$` map of `id`'s to nodes. A document fragment
+ * is returned containing the stamped DOM, ready for insertion into the
+ * DOM.
+ *
+ * This method may be called more than once; however note that due to
+ * `shadycss` polyfill limitations, only styles from templates prepared
+ * using `ShadyCSS.prepareTemplate` will be correctly polyfilled (scoped
+ * to the shadow root and support CSS custom properties), and note that
+ * `ShadyCSS.prepareTemplate` may only be called once per element. As such,
+ * any styles required by in runtime-stamped templates must be included
+ * in the main element template.
+ *
+ * @param {!HTMLTemplateElement} template Template to stamp
+ * @return {!StampedTemplate} Cloned template content
+ * @override
+ * @protected
+ */
+ _stampTemplate(template) {
+ // Ensures that created dom is `_enqueueClient`'d to this element so
+ // that it can be flushed on next call to `_flushProperties`
+ hostStack.beginHosting(this);
+ let dom = super._stampTemplate(template);
+ hostStack.endHosting(this);
+ let templateInfo = /** @type {!TemplateInfo} */(this._bindTemplate(template, true));
+ // Add template-instance-specific data to instanced templateInfo
+ templateInfo.nodeList = dom.nodeList;
+ // Capture child nodes to allow unstamping of non-prototypical templates
+ if (!templateInfo.wasPreBound) {
+ let nodes = templateInfo.childNodes = [];
+ for (let n=dom.firstChild; n; n=n.nextSibling) {
+ nodes.push(n);
+ }
+ }
+ dom.templateInfo = templateInfo;
+ // Setup compound storage, 2-way listeners, and dataHost for bindings
+ setupBindings(this, templateInfo);
+ // Flush properties into template nodes if already booted
+ if (this.__dataReady) {
+ runEffects(this, templateInfo.propertyEffects, this.__data, null,
+ false, templateInfo.nodeList);
+ }
+ return dom;
+ }
+
+ /**
+ * Removes and unbinds the nodes previously contained in the provided
+ * DocumentFragment returned from `_stampTemplate`.
+ *
+ * @param {!StampedTemplate} dom DocumentFragment previously returned
+ * from `_stampTemplate` associated with the nodes to be removed
+ * @return {void}
+ * @protected
+ */
+ _removeBoundDom(dom) {
+ // Unlink template info
+ let templateInfo = dom.templateInfo;
+ if (templateInfo.previousTemplateInfo) {
+ templateInfo.previousTemplateInfo.nextTemplateInfo =
+ templateInfo.nextTemplateInfo;
+ }
+ if (templateInfo.nextTemplateInfo) {
+ templateInfo.nextTemplateInfo.previousTemplateInfo =
+ templateInfo.previousTemplateInfo;
+ }
+ if (this.__templateInfoLast == templateInfo) {
+ this.__templateInfoLast = templateInfo.previousTemplateInfo;
+ }
+ templateInfo.previousTemplateInfo = templateInfo.nextTemplateInfo = null;
+ // Remove stamped nodes
+ let nodes = templateInfo.childNodes;
+ for (let i=0; i<nodes.length; i++) {
+ let node = nodes[i];
+ node.parentNode.removeChild(node);
+ }
+ }
+
+ /**
+ * Overrides default `TemplateStamp` implementation to add support for
+ * parsing bindings from `TextNode`'s' `textContent`. A `bindings`
+ * array is added to `nodeInfo` and populated with binding metadata
+ * with information capturing the binding target, and a `parts` array
+ * with one or more metadata objects capturing the source(s) of the
+ * binding.
+ *
+ * @override
+ * @param {Node} node Node to parse
+ * @param {TemplateInfo} templateInfo Template metadata for current template
+ * @param {NodeInfo} nodeInfo Node metadata for current template node
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ * @protected
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static _parseTemplateNode(node, templateInfo, nodeInfo) {
+ let noted = super._parseTemplateNode(node, templateInfo, nodeInfo);
+ if (node.nodeType === Node.TEXT_NODE) {
+ let parts = this._parseBindings(node.textContent, templateInfo);
+ if (parts) {
+ // Initialize the textContent with any literal parts
+ // NOTE: default to a space here so the textNode remains; some browsers
+ // (IE) omit an empty textNode following cloneNode/importNode.
+ node.textContent = literalFromParts(parts) || ' ';
+ addBinding(this, templateInfo, nodeInfo, 'text', 'textContent', parts);
+ noted = true;
+ }
+ }
+ return noted;
+ }
+
+ /**
+ * Overrides default `TemplateStamp` implementation to add support for
+ * parsing bindings from attributes. A `bindings`
+ * array is added to `nodeInfo` and populated with binding metadata
+ * with information capturing the binding target, and a `parts` array
+ * with one or more metadata objects capturing the source(s) of the
+ * binding.
+ *
+ * @override
+ * @param {Element} node Node to parse
+ * @param {TemplateInfo} templateInfo Template metadata for current template
+ * @param {NodeInfo} nodeInfo Node metadata for current template node
+ * @param {string} name Attribute name
+ * @param {string} value Attribute value
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ * @protected
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static _parseTemplateNodeAttribute(node, templateInfo, nodeInfo, name, value) {
+ let parts = this._parseBindings(value, templateInfo);
+ if (parts) {
+ // Attribute or property
+ let origName = name;
+ let kind = 'property';
+ // The only way we see a capital letter here is if the attr has
+ // a capital letter in it per spec. In this case, to make sure
+ // this binding works, we go ahead and make the binding to the attribute.
+ if (capitalAttributeRegex.test(name)) {
+ kind = 'attribute';
+ } else if (name[name.length-1] == '$') {
+ name = name.slice(0, -1);
+ kind = 'attribute';
+ }
+ // Initialize attribute bindings with any literal parts
+ let literal = literalFromParts(parts);
+ if (literal && kind == 'attribute') {
+ node.setAttribute(name, literal);
+ }
+ // Clear attribute before removing, since IE won't allow removing
+ // `value` attribute if it previously had a value (can't
+ // unconditionally set '' before removing since attributes with `$`
+ // can't be set using setAttribute)
+ if (node.localName === 'input' && origName === 'value') {
+ node.setAttribute(origName, '');
+ }
+ // Remove annotation
+ node.removeAttribute(origName);
+ // Case hackery: attributes are lower-case, but bind targets
+ // (properties) are case sensitive. Gambit is to map dash-case to
+ // camel-case: `foo-bar` becomes `fooBar`.
+ // Attribute bindings are excepted.
+ if (kind === 'property') {
+ name = dashToCamelCase(name);
+ }
+ addBinding(this, templateInfo, nodeInfo, kind, name, parts, literal);
+ return true;
+ } else {
+ return super._parseTemplateNodeAttribute(node, templateInfo, nodeInfo, name, value);
+ }
+ }
+
+ /**
+ * Overrides default `TemplateStamp` implementation to add support for
+ * binding the properties that a nested template depends on to the template
+ * as `_host_<property>`.
+ *
+ * @override
+ * @param {Node} node Node to parse
+ * @param {TemplateInfo} templateInfo Template metadata for current template
+ * @param {NodeInfo} nodeInfo Node metadata for current template node
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ * @protected
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static _parseTemplateNestedTemplate(node, templateInfo, nodeInfo) {
+ let noted = super._parseTemplateNestedTemplate(node, templateInfo, nodeInfo);
+ // Merge host props into outer template and add bindings
+ let hostProps = nodeInfo.templateInfo.hostProps;
+ let mode = '{';
+ for (let source in hostProps) {
+ let parts = [{ mode, source, dependencies: [source] }];
+ addBinding(this, templateInfo, nodeInfo, 'property', '_host_' + source, parts);
+ }
+ return noted;
+ }
+
+ /**
+ * Called to parse text in a template (either attribute values or
+ * textContent) into binding metadata.
+ *
+ * Any overrides of this method should return an array of binding part
+ * metadata representing one or more bindings found in the provided text
+ * and any "literal" text in between. Any non-literal parts will be passed
+ * to `_evaluateBinding` when any dependencies change. The only required
+ * fields of each "part" in the returned array are as follows:
+ *
+ * - `dependencies` - Array containing trigger metadata for each property
+ * that should trigger the binding to update
+ * - `literal` - String containing text if the part represents a literal;
+ * in this case no `dependencies` are needed
+ *
+ * Additional metadata for use by `_evaluateBinding` may be provided in
+ * each part object as needed.
+ *
+ * The default implementation handles the following types of bindings
+ * (one or more may be intermixed with literal strings):
+ * - Property binding: `[[prop]]`
+ * - Path binding: `[[object.prop]]`
+ * - Negated property or path bindings: `[[!prop]]` or `[[!object.prop]]`
+ * - Two-way property or path bindings (supports negation):
+ * `{{prop}}`, `{{object.prop}}`, `{{!prop}}` or `{{!object.prop}}`
+ * - Inline computed method (supports negation):
+ * `[[compute(a, 'literal', b)]]`, `[[!compute(a, 'literal', b)]]`
+ *
+ * The default implementation uses a regular expression for best
+ * performance. However, the regular expression uses a white-list of
+ * allowed characters in a data-binding, which causes problems for
+ * data-bindings that do use characters not in this white-list.
+ *
+ * Instead of updating the white-list with all allowed characters,
+ * there is a StrictBindingParser (see lib/mixins/strict-binding-parser)
+ * that uses a state machine instead. This state machine is able to handle
+ * all characters. However, it is slightly less performant, therefore we
+ * extracted it into a separate optional mixin.
+ *
+ * @param {string} text Text to parse from attribute or textContent
+ * @param {Object} templateInfo Current template metadata
+ * @return {Array<!BindingPart>} Array of binding part metadata
+ * @protected
+ */
+ static _parseBindings(text, templateInfo) {
+ let parts = [];
+ let lastIndex = 0;
+ let m;
+ // Example: "literal1{{prop}}literal2[[!compute(foo,bar)]]final"
+ // Regex matches:
+ // Iteration 1: Iteration 2:
+ // m[1]: '{{' '[['
+ // m[2]: '' '!'
+ // m[3]: 'prop' 'compute(foo,bar)'
+ while ((m = bindingRegex.exec(text)) !== null) {
+ // Add literal part
+ if (m.index > lastIndex) {
+ parts.push({literal: text.slice(lastIndex, m.index)});
+ }
+ // Add binding part
+ let mode = m[1][0];
+ let negate = Boolean(m[2]);
+ let source = m[3].trim();
+ let customEvent = false, notifyEvent = '', colon = -1;
+ if (mode == '{' && (colon = source.indexOf('::')) > 0) {
+ notifyEvent = source.substring(colon + 2);
+ source = source.substring(0, colon);
+ customEvent = true;
+ }
+ let signature = parseMethod(source);
+ let dependencies = [];
+ if (signature) {
+ // Inline computed function
+ let {args, methodName} = signature;
+ for (let i=0; i<args.length; i++) {
+ let arg = args[i];
+ if (!arg.literal) {
+ dependencies.push(arg);
+ }
+ }
+ let dynamicFns = templateInfo.dynamicFns;
+ if (dynamicFns && dynamicFns[methodName] || signature.static) {
+ dependencies.push(methodName);
+ signature.dynamicFn = true;
+ }
+ } else {
+ // Property or path
+ dependencies.push(source);
+ }
+ parts.push({
+ source, mode, negate, customEvent, signature, dependencies,
+ event: notifyEvent
+ });
+ lastIndex = bindingRegex.lastIndex;
+ }
+ // Add a final literal part
+ if (lastIndex && lastIndex < text.length) {
+ let literal = text.substring(lastIndex);
+ if (literal) {
+ parts.push({
+ literal: literal
+ });
+ }
+ }
+ if (parts.length) {
+ return parts;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Called to evaluate a previously parsed binding part based on a set of
+ * one or more changed dependencies.
+ *
+ * @param {this} inst Element that should be used as scope for
+ * binding dependencies
+ * @param {BindingPart} part Binding part metadata
+ * @param {string} path Property/path that triggered this effect
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {boolean} hasPaths True with `props` contains one or more paths
+ * @return {*} Value the binding part evaluated to
+ * @protected
+ */
+ static _evaluateBinding(inst, part, path, props, oldProps, hasPaths) {
+ let value;
+ if (part.signature) {
+ value = runMethodEffect(inst, path, props, oldProps, part.signature);
+ } else if (path != part.source) {
+ value = get$0(inst, part.source);
+ } else {
+ if (hasPaths && isPath$0(path)) {
+ value = get$0(inst, path);
+ } else {
+ value = inst.__data[path];
+ }
+ }
+ if (part.negate) {
+ value = !value;
+ }
+ return value;
+ }
+
+ }
+
+ // make a typing for closure :P
+ PropertyEffectsType = PropertyEffects;
+
+ return PropertyEffects;
+});
+
+/**
+ * Helper api for enqueuing client dom created by a host element.
+ *
+ * By default elements are flushed via `_flushProperties` when
+ * `connectedCallback` is called. Elements attach their client dom to
+ * themselves at `ready` time which results from this first flush.
+ * This provides an ordering guarantee that the client dom an element
+ * creates is flushed before the element itself (i.e. client `ready`
+ * fires before host `ready`).
+ *
+ * However, if `_flushProperties` is called *before* an element is connected,
+ * as for example `Templatize` does, this ordering guarantee cannot be
+ * satisfied because no elements are connected. (Note: Bound elements that
+ * receive data do become enqueued clients and are properly ordered but
+ * unbound elements are not.)
+ *
+ * To maintain the desired "client before host" ordering guarantee for this
+ * case we rely on the "host stack. Client nodes registers themselves with
+ * the creating host element when created. This ensures that all client dom
+ * is readied in the proper order, maintaining the desired guarantee.
+ *
+ * @private
+ */
+let hostStack = {
+
+ stack: [],
+
+ /**
+ * @param {*} inst Instance to add to hostStack
+ * @return {void}
+ * @this {hostStack}
+ */
+ registerHost(inst) {
+ if (this.stack.length) {
+ let host = this.stack[this.stack.length-1];
+ host._enqueueClient(inst);
+ }
+ },
+
+ /**
+ * @param {*} inst Instance to begin hosting
+ * @return {void}
+ * @this {hostStack}
+ */
+ beginHosting(inst) {
+ this.stack.push(inst);
+ },
+
+ /**
+ * @param {*} inst Instance to end hosting
+ * @return {void}
+ * @this {hostStack}
+ */
+ endHosting(inst) {
+ let stackLen = this.stack.length;
+ if (stackLen && this.stack[stackLen-1] == inst) {
+ this.stack.pop();
+ }
+ }
+
+};
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/strict-binding-parser.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/strict-binding-parser.js
new file mode 100644
index 00000000000..6af6612f184
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/strict-binding-parser.js
@@ -0,0 +1,413 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../utils/boot.js';
+
+import { isPath } from '../utils/path.js';
+import { dedupingMixin } from '../utils/mixin.js';
+import { PropertyEffects } from './property-effects.js';
+
+/**
+ * The open and corresponding closing brackets for surrounding bindings.
+ * @enum {string}
+ */
+const BINDINGS = {
+ '{': '}',
+ '[': ']'
+};
+
+/**
+ * All states that the parser can be in. The states represent the state-machine as a whole.
+ * @enum {number}
+ */
+const STATE = {
+ INITIAL: 1,
+ FIRSTOPENINGBINDING: 2,
+ FIRSTCHARACTERBINDING: 3,
+ BINDING: 4,
+ FIRSTCOLON: 5,
+ COLONNOTIFYEVENT: 6,
+ COLONNOTIFYEVENTFIRSTCLOSINGBINDING: 7,
+ FIRSTCLOSINGBINDING: 8,
+ STRING: 9,
+ METHOD: 10,
+ STRINGARG: 11,
+ NUMBERARG: 12,
+ VARIABLEARG: 13,
+ METHODCLOSED: 14,
+ METHODCLOSEDBINDING: 15
+};
+
+function pushLiteral(text, i, parts, startChar) {
+ const literal = text.substring(startChar || 0, i);
+ if (literal) {
+ parts.push({
+ literal
+ });
+ }
+}
+
+function storeMethod(bindingData, templateInfo) {
+ const methodName = bindingData.signature.methodName;
+ const dynamicFns = templateInfo.dynamicFns;
+ if (dynamicFns && dynamicFns[methodName] || bindingData.signature.static) {
+ bindingData.dependencies.push(methodName);
+ bindingData.signature.dynamicFn = true;
+ }
+}
+
+function storeVariableBinding(parts, bindingData, prop, i) {
+ bindingData.source = prop;
+ bindingData.dependencies.push(prop);
+ bindingData.startChar = i + 1;
+ parts.push(bindingData);
+}
+
+function storeMethodVariable(bindingData, text, i) {
+ const name = text.substring(bindingData.startChar, i).trim();
+ if (name) {
+ if (name === 'true' || name === 'false') {
+ bindingData.signature.args.push({
+ name,
+ value: name == 'true',
+ literal: true
+ });
+ } else {
+ const arg = {
+ name
+ };
+ arg.structured = isPath(name);
+ if (arg.structured) {
+ arg.wildcard = (name.slice(-2) == '.*');
+ if (arg.wildcard) {
+ arg.name = name.slice(0, -2);
+ }
+ }
+ bindingData.signature.args.push(arg);
+ bindingData.dependencies.push(name);
+ bindingData.signature.static = false;
+ }
+ }
+}
+
+function storeMethodNumber(bindingData, text, i) {
+ const value = text.substring(bindingData.startChar, i).trim();
+ bindingData.signature.args.push({
+ name: value,
+ value: Number(value),
+ literal: true
+ });
+}
+
+/**
+ * Mixin that parses binding expressions and generates corresponding metadata.
+ * The implementation is different than in `property-effects`, as it uses a
+ * state machine instead of a regex. As such, this implementation is able to
+ * handle more cases, with the potential performance hit.
+ *
+ * @mixinFunction
+ * @appliesMixin PropertyEffects
+ * @polymer
+ * @summary Mixin that parses binding expressions and generates corresponding metadata.
+ */
+const StrictBindingParser = dedupingMixin((base) => {
+
+ /**
+ * @constructor
+ * @extends {base}
+ * @implements {Polymer_PropertyEffects}
+ */
+ const elementBase = PropertyEffects(base);
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_PropertyEffects}
+ */
+ return class extends elementBase {
+
+ /**
+ * Called to parse text in a template (either attribute values or
+ * textContent) into binding metadata.
+ *
+ * Any overrides of this method should return an array of binding part
+ * metadata representing one or more bindings found in the provided text
+ * and any "literal" text in between. Any non-literal parts will be passed
+ * to `_evaluateBinding` when any dependencies change. The only required
+ * fields of each "part" in the returned array are as follows:
+ *
+ * - `dependencies` - Array containing trigger metadata for each property
+ * that should trigger the binding to update
+ * - `literal` - String containing text if the part represents a literal;
+ * in this case no `dependencies` are needed
+ *
+ * Additional metadata for use by `_evaluateBinding` may be provided in
+ * each part object as needed.
+ *
+ * The default implementation handles the following types of bindings
+ * (one or more may be intermixed with literal strings):
+ * - Property binding: `[[prop]]`
+ * - Path binding: `[[object.prop]]`
+ * - Negated property or path bindings: `[[!prop]]` or `[[!object.prop]]`
+ * - Two-way property or path bindings (supports negation):
+ * `{{prop}}`, `{{object.prop}}`, `{{!prop}}` or `{{!object.prop}}`
+ * - Inline computed method (supports negation):
+ * `[[compute(a, 'literal', b)]]`, `[[!compute(a, 'literal', b)]]`
+ *
+ * @param {string} text Text to parse from attribute or textContent
+ * @param {Object} templateInfo Current template metadata
+ * @return {Array<!BindingPart>} Array of binding part metadata
+ * @protected
+ */
+ static _parseBindings(text, templateInfo) {
+ const parts = [];
+ let bindingData = {};
+ let escaped = false;
+ /** @type {string} */
+ let quote;
+ /** @type {number} */
+ let state = STATE.INITIAL;
+ let i,l;
+
+ for (i=0,l=text.length; i<l; i++) {
+ const char = text.charAt(i);
+ switch (state) {
+ case STATE.INITIAL: {
+ if ((char === '{' || char === '[')) {
+ bindingData = {
+ mode: char,
+ dependencies: [],
+ startChar: bindingData.startChar
+ };
+ state = STATE.FIRSTOPENINGBINDING;
+ }
+ break;
+ }
+ case STATE.FIRSTOPENINGBINDING: {
+ if (char === bindingData.mode) {
+ pushLiteral(text, i - 1, parts, bindingData.startChar);
+ bindingData.startChar = i + 1;
+ state = STATE.FIRSTCHARACTERBINDING;
+ } else {
+ bindingData = {};
+ state = STATE.INITIAL;
+ }
+ break;
+ }
+ case STATE.FIRSTCHARACTERBINDING: {
+ if (char !== ' ' && char !== '\t' && char !== '\n') {
+ if (char === '!') {
+ bindingData.negate = true;
+ bindingData.startChar = i + 1;
+ }
+ state = STATE.BINDING;
+ }
+ break;
+ }
+ case STATE.BINDING: {
+ switch (char) {
+ case BINDINGS[bindingData.mode]: {
+ state = STATE.FIRSTCLOSINGBINDING;
+ break;
+ }
+ case '\'':
+ case '"': {
+ quote = char;
+ state = STATE.STRING;
+ break;
+ }
+ case '(': {
+ bindingData.signature = {
+ methodName: text.substring(bindingData.startChar, i).trim(),
+ args: [],
+ static: true
+ };
+ bindingData.startChar = i + 1;
+ state = STATE.METHOD;
+ break;
+ }
+ case ':': {
+ state = STATE.FIRSTCOLON;
+ }
+ }
+ break;
+ }
+ case STATE.FIRSTCOLON: {
+ if (char === ':') {
+ bindingData.customEvent = true;
+ bindingData.startCharAfterColon = i + 1;
+ state = STATE.COLONNOTIFYEVENT;
+ } else {
+ state = STATE.BINDING;
+ }
+ break;
+ }
+ case STATE.COLONNOTIFYEVENT: {
+ if (char === BINDINGS[bindingData.mode]) {
+ state = STATE.COLONNOTIFYEVENTFIRSTCLOSINGBINDING;
+ }
+ break;
+ }
+ case STATE.COLONNOTIFYEVENTFIRSTCLOSINGBINDING: {
+ if (char === BINDINGS[bindingData.mode]) {
+ bindingData.event = text.substring(bindingData.startCharAfterColon, i - 1).trim();
+ const prop = text.substring(bindingData.startChar, bindingData.startCharAfterColon - 2).trim();
+ storeVariableBinding(parts, bindingData, prop, i);
+ state = STATE.INITIAL;
+ } else {
+ state = STATE.BINDING;
+ }
+ break;
+ }
+ case STATE.FIRSTCLOSINGBINDING: {
+ if (char === BINDINGS[bindingData.mode]) {
+ const prop = text.substring(bindingData.startChar, i - 1).trim();
+ storeVariableBinding(parts, bindingData, prop, i);
+ state = STATE.INITIAL;
+ } else {
+ state = STATE.BINDING;
+ }
+ break;
+ }
+ case STATE.STRING: {
+ if (char === '\\') {
+ escaped = true;
+ } else if (char === quote && !escaped) {
+ state = STATE.BINDING;
+ } else {
+ escaped = false;
+ }
+ break;
+ }
+ case STATE.METHOD: {
+ switch (char) {
+ case ')': {
+ storeMethodVariable(bindingData, text, i);
+ storeMethod(bindingData, templateInfo);
+ bindingData.startChar = i + 1;
+ state = STATE.METHODCLOSED;
+ break;
+ }
+ case ',': {
+ storeMethodVariable(bindingData, text, i);
+ bindingData.startChar = i + 1;
+ break;
+ }
+ case '\'':
+ case '"': {
+ quote = char;
+ state = STATE.STRINGARG;
+ break;
+ }
+ default: {
+ if (char >= '0' && char <= '9' || char === '-') {
+ state = STATE.NUMBERARG;
+ } else if (char != ' ' && char != '\n') {
+ state = STATE.VARIABLEARG;
+ }
+ }
+ }
+ break;
+ }
+ case STATE.STRINGARG: {
+ if (char === '\\') {
+ escaped = true;
+ } else if (char === quote && !escaped) {
+ const value = text.substring(bindingData.startChar, i)
+ .replace(/^\s+/, '')
+ .substring(1)
+ // replace comma entity with comma
+ .replace(/&comma;/g, ',')
+ // repair extra escape sequences; note only commas strictly need
+ // escaping, but we allow any other char to be escaped since its
+ // likely users will do this
+ .replace(/\\(.)/g, '\$1');
+ bindingData.signature.args.push({
+ value,
+ name: value,
+ literal: true
+ });
+ bindingData.startChar = i + 1;
+ state = STATE.METHOD;
+ } else {
+ escaped = false;
+ }
+ break;
+ }
+ case STATE.NUMBERARG: {
+ switch (char) {
+ case ',': {
+ storeMethodNumber(bindingData, text, i);
+ bindingData.startChar = i + 1;
+ state = STATE.METHOD;
+ break;
+ }
+ case ')': {
+ storeMethodNumber(bindingData, text, i);
+ storeMethod(bindingData, templateInfo);
+ state = STATE.METHODCLOSED;
+ break;
+ }
+ default: {
+ if (char < '0' || char > '9') {
+ state = STATE.VARIABLEARG;
+ }
+ }
+ }
+ break;
+ }
+ case STATE.VARIABLEARG: {
+ switch (char) {
+ case ',': {
+ storeMethodVariable(bindingData, text, i);
+ bindingData.startChar = i + 1;
+ state = STATE.METHOD;
+ break;
+ }
+ case ')': {
+ storeMethodVariable(bindingData, text, i);
+ storeMethod(bindingData, templateInfo);
+ state = STATE.METHODCLOSED;
+ break;
+ }
+ }
+ break;
+ }
+ case STATE.METHODCLOSED: {
+ if (char === BINDINGS[bindingData.mode]) {
+ state = STATE.METHODCLOSEDBINDING;
+ } else if (char !== ' ' && char !== '\t' && char !== '\n') {
+ console.warn(`Expected two closing "${BINDINGS[bindingData.mode]}" for binding "${text}"`);
+ }
+ break;
+ }
+ case STATE.METHODCLOSEDBINDING: {
+ if (char === BINDINGS[bindingData.mode]) {
+ bindingData.startChar = i + 1;
+ parts.push(bindingData);
+ state = STATE.INITIAL;
+ } else if (char !== ' ' && char !== '\t' && char !== '\n') {
+ console.warn(`Expected one closing "${BINDINGS[bindingData.mode]}" for binding "${text}"`);
+ }
+ break;
+ }
+ }
+ }
+
+ if (parts.length) {
+ pushLiteral(text, i, parts, parts[parts.length - 1].startChar);
+ return parts;
+ }
+
+ return null;
+ }
+ };
+});
+
+export { StrictBindingParser };
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/template-stamp.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/template-stamp.js
new file mode 100644
index 00000000000..0355fd8c840
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/mixins/template-stamp.js
@@ -0,0 +1,482 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../utils/boot.js';
+
+import { dedupingMixin } from '../utils/mixin.js';
+
+// 1.x backwards-compatible auto-wrapper for template type extensions
+// This is a clear layering violation and gives favored-nation status to
+// dom-if and dom-repeat templates. This is a conceit we're choosing to keep
+// a.) to ease 1.x backwards-compatibility due to loss of `is`, and
+// b.) to maintain if/repeat capability in parser-constrained elements
+// (e.g. table, select) in lieu of native CE type extensions without
+// massive new invention in this space (e.g. directive system)
+const templateExtensions = {
+ 'dom-if': true,
+ 'dom-repeat': true
+};
+function wrapTemplateExtension(node) {
+ let is = node.getAttribute('is');
+ if (is && templateExtensions[is]) {
+ let t = node;
+ t.removeAttribute('is');
+ node = t.ownerDocument.createElement(is);
+ t.parentNode.replaceChild(node, t);
+ node.appendChild(t);
+ while(t.attributes.length) {
+ node.setAttribute(t.attributes[0].name, t.attributes[0].value);
+ t.removeAttribute(t.attributes[0].name);
+ }
+ }
+ return node;
+}
+
+function findTemplateNode(root, nodeInfo) {
+ // recursively ascend tree until we hit root
+ let parent = nodeInfo.parentInfo && findTemplateNode(root, nodeInfo.parentInfo);
+ // unwind the stack, returning the indexed node at each level
+ if (parent) {
+ // note: marginally faster than indexing via childNodes
+ // (http://jsperf.com/childnodes-lookup)
+ for (let n=parent.firstChild, i=0; n; n=n.nextSibling) {
+ if (nodeInfo.parentIndex === i++) {
+ return n;
+ }
+ }
+ } else {
+ return root;
+ }
+}
+
+// construct `$` map (from id annotations)
+function applyIdToMap(inst, map, node, nodeInfo) {
+ if (nodeInfo.id) {
+ map[nodeInfo.id] = node;
+ }
+}
+
+// install event listeners (from event annotations)
+function applyEventListener(inst, node, nodeInfo) {
+ if (nodeInfo.events && nodeInfo.events.length) {
+ for (let j=0, e$=nodeInfo.events, e; (j<e$.length) && (e=e$[j]); j++) {
+ inst._addMethodEventListenerToNode(node, e.name, e.value, inst);
+ }
+ }
+}
+
+// push configuration references at configure time
+function applyTemplateContent(inst, node, nodeInfo) {
+ if (nodeInfo.templateInfo) {
+ node._templateInfo = nodeInfo.templateInfo;
+ }
+}
+
+function createNodeEventHandler(context, eventName, methodName) {
+ // Instances can optionally have a _methodHost which allows redirecting where
+ // to find methods. Currently used by `templatize`.
+ context = context._methodHost || context;
+ let handler = function(e) {
+ if (context[methodName]) {
+ context[methodName](e, e.detail);
+ } else {
+ console.warn('listener method `' + methodName + '` not defined');
+ }
+ };
+ return handler;
+}
+
+/**
+ * Element mixin that provides basic template parsing and stamping, including
+ * the following template-related features for stamped templates:
+ *
+ * - Declarative event listeners (`on-eventname="listener"`)
+ * - Map of node id's to stamped node instances (`this.$.id`)
+ * - Nested template content caching/removal and re-installation (performance
+ * optimization)
+ *
+ * @mixinFunction
+ * @polymer
+ * @summary Element class mixin that provides basic template parsing and stamping
+ */
+export const TemplateStamp = dedupingMixin(superClass => {
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_TemplateStamp}
+ */
+ class TemplateStamp extends superClass {
+
+ /**
+ * Scans a template to produce template metadata.
+ *
+ * Template-specific metadata are stored in the object returned, and node-
+ * specific metadata are stored in objects in its flattened `nodeInfoList`
+ * array. Only nodes in the template that were parsed as nodes of
+ * interest contain an object in `nodeInfoList`. Each `nodeInfo` object
+ * contains an `index` (`childNodes` index in parent) and optionally
+ * `parent`, which points to node info of its parent (including its index).
+ *
+ * The template metadata object returned from this method has the following
+ * structure (many fields optional):
+ *
+ * ```js
+ * {
+ * // Flattened list of node metadata (for nodes that generated metadata)
+ * nodeInfoList: [
+ * {
+ * // `id` attribute for any nodes with id's for generating `$` map
+ * id: {string},
+ * // `on-event="handler"` metadata
+ * events: [
+ * {
+ * name: {string}, // event name
+ * value: {string}, // handler method name
+ * }, ...
+ * ],
+ * // Notes when the template contained a `<slot>` for shady DOM
+ * // optimization purposes
+ * hasInsertionPoint: {boolean},
+ * // For nested `<template>`` nodes, nested template metadata
+ * templateInfo: {object}, // nested template metadata
+ * // Metadata to allow efficient retrieval of instanced node
+ * // corresponding to this metadata
+ * parentInfo: {number}, // reference to parent nodeInfo>
+ * parentIndex: {number}, // index in parent's `childNodes` collection
+ * infoIndex: {number}, // index of this `nodeInfo` in `templateInfo.nodeInfoList`
+ * },
+ * ...
+ * ],
+ * // When true, the template had the `strip-whitespace` attribute
+ * // or was nested in a template with that setting
+ * stripWhitespace: {boolean},
+ * // For nested templates, nested template content is moved into
+ * // a document fragment stored here; this is an optimization to
+ * // avoid the cost of nested template cloning
+ * content: {DocumentFragment}
+ * }
+ * ```
+ *
+ * This method kicks off a recursive treewalk as follows:
+ *
+ * ```
+ * _parseTemplate <---------------------+
+ * _parseTemplateContent |
+ * _parseTemplateNode <------------|--+
+ * _parseTemplateNestedTemplate --+ |
+ * _parseTemplateChildNodes ---------+
+ * _parseTemplateNodeAttributes
+ * _parseTemplateNodeAttribute
+ *
+ * ```
+ *
+ * These methods may be overridden to add custom metadata about templates
+ * to either `templateInfo` or `nodeInfo`.
+ *
+ * Note that this method may be destructive to the template, in that
+ * e.g. event annotations may be removed after being noted in the
+ * template metadata.
+ *
+ * @param {!HTMLTemplateElement} template Template to parse
+ * @param {TemplateInfo=} outerTemplateInfo Template metadata from the outer
+ * template, for parsing nested templates
+ * @return {!TemplateInfo} Parsed template metadata
+ */
+ static _parseTemplate(template, outerTemplateInfo) {
+ // since a template may be re-used, memo-ize metadata
+ if (!template._templateInfo) {
+ let templateInfo = template._templateInfo = {};
+ templateInfo.nodeInfoList = [];
+ templateInfo.stripWhiteSpace =
+ (outerTemplateInfo && outerTemplateInfo.stripWhiteSpace) ||
+ template.hasAttribute('strip-whitespace');
+ this._parseTemplateContent(template, templateInfo, {parent: null});
+ }
+ return template._templateInfo;
+ }
+
+ static _parseTemplateContent(template, templateInfo, nodeInfo) {
+ return this._parseTemplateNode(template.content, templateInfo, nodeInfo);
+ }
+
+ /**
+ * Parses template node and adds template and node metadata based on
+ * the current node, and its `childNodes` and `attributes`.
+ *
+ * This method may be overridden to add custom node or template specific
+ * metadata based on this node.
+ *
+ * @param {Node} node Node to parse
+ * @param {!TemplateInfo} templateInfo Template metadata for current template
+ * @param {!NodeInfo} nodeInfo Node metadata for current template.
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ */
+ static _parseTemplateNode(node, templateInfo, nodeInfo) {
+ let noted;
+ let element = /** @type {Element} */(node);
+ if (element.localName == 'template' && !element.hasAttribute('preserve-content')) {
+ noted = this._parseTemplateNestedTemplate(element, templateInfo, nodeInfo) || noted;
+ } else if (element.localName === 'slot') {
+ // For ShadyDom optimization, indicating there is an insertion point
+ templateInfo.hasInsertionPoint = true;
+ }
+ if (element.firstChild) {
+ noted = this._parseTemplateChildNodes(element, templateInfo, nodeInfo) || noted;
+ }
+ if (element.hasAttributes && element.hasAttributes()) {
+ noted = this._parseTemplateNodeAttributes(element, templateInfo, nodeInfo) || noted;
+ }
+ return noted;
+ }
+
+ /**
+ * Parses template child nodes for the given root node.
+ *
+ * This method also wraps whitelisted legacy template extensions
+ * (`is="dom-if"` and `is="dom-repeat"`) with their equivalent element
+ * wrappers, collapses text nodes, and strips whitespace from the template
+ * if the `templateInfo.stripWhitespace` setting was provided.
+ *
+ * @param {Node} root Root node whose `childNodes` will be parsed
+ * @param {!TemplateInfo} templateInfo Template metadata for current template
+ * @param {!NodeInfo} nodeInfo Node metadata for current template.
+ * @return {void}
+ */
+ static _parseTemplateChildNodes(root, templateInfo, nodeInfo) {
+ if (root.localName === 'script' || root.localName === 'style') {
+ return;
+ }
+ for (let node=root.firstChild, parentIndex=0, next; node; node=next) {
+ // Wrap templates
+ if (node.localName == 'template') {
+ node = wrapTemplateExtension(node);
+ }
+ // collapse adjacent textNodes: fixes an IE issue that can cause
+ // text nodes to be inexplicably split =(
+ // note that root.normalize() should work but does not so we do this
+ // manually.
+ next = node.nextSibling;
+ if (node.nodeType === Node.TEXT_NODE) {
+ let /** Node */ n = next;
+ while (n && (n.nodeType === Node.TEXT_NODE)) {
+ node.textContent += n.textContent;
+ next = n.nextSibling;
+ root.removeChild(n);
+ n = next;
+ }
+ // optionally strip whitespace
+ if (templateInfo.stripWhiteSpace && !node.textContent.trim()) {
+ root.removeChild(node);
+ continue;
+ }
+ }
+ let childInfo = { parentIndex, parentInfo: nodeInfo };
+ if (this._parseTemplateNode(node, templateInfo, childInfo)) {
+ childInfo.infoIndex = templateInfo.nodeInfoList.push(/** @type {!NodeInfo} */(childInfo)) - 1;
+ }
+ // Increment if not removed
+ if (node.parentNode) {
+ parentIndex++;
+ }
+ }
+ }
+
+ /**
+ * Parses template content for the given nested `<template>`.
+ *
+ * Nested template info is stored as `templateInfo` in the current node's
+ * `nodeInfo`. `template.content` is removed and stored in `templateInfo`.
+ * It will then be the responsibility of the host to set it back to the
+ * template and for users stamping nested templates to use the
+ * `_contentForTemplate` method to retrieve the content for this template
+ * (an optimization to avoid the cost of cloning nested template content).
+ *
+ * @param {HTMLTemplateElement} node Node to parse (a <template>)
+ * @param {TemplateInfo} outerTemplateInfo Template metadata for current template
+ * that includes the template `node`
+ * @param {!NodeInfo} nodeInfo Node metadata for current template.
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ */
+ static _parseTemplateNestedTemplate(node, outerTemplateInfo, nodeInfo) {
+ let templateInfo = this._parseTemplate(node, outerTemplateInfo);
+ let content = templateInfo.content =
+ node.content.ownerDocument.createDocumentFragment();
+ content.appendChild(node.content);
+ nodeInfo.templateInfo = templateInfo;
+ return true;
+ }
+
+ /**
+ * Parses template node attributes and adds node metadata to `nodeInfo`
+ * for nodes of interest.
+ *
+ * @param {Element} node Node to parse
+ * @param {TemplateInfo} templateInfo Template metadata for current template
+ * @param {NodeInfo} nodeInfo Node metadata for current template.
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ */
+ static _parseTemplateNodeAttributes(node, templateInfo, nodeInfo) {
+ // Make copy of original attribute list, since the order may change
+ // as attributes are added and removed
+ let noted = false;
+ let attrs = Array.from(node.attributes);
+ for (let i=attrs.length-1, a; (a=attrs[i]); i--) {
+ noted = this._parseTemplateNodeAttribute(node, templateInfo, nodeInfo, a.name, a.value) || noted;
+ }
+ return noted;
+ }
+
+ /**
+ * Parses a single template node attribute and adds node metadata to
+ * `nodeInfo` for attributes of interest.
+ *
+ * This implementation adds metadata for `on-event="handler"` attributes
+ * and `id` attributes.
+ *
+ * @param {Element} node Node to parse
+ * @param {!TemplateInfo} templateInfo Template metadata for current template
+ * @param {!NodeInfo} nodeInfo Node metadata for current template.
+ * @param {string} name Attribute name
+ * @param {string} value Attribute value
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ */
+ static _parseTemplateNodeAttribute(node, templateInfo, nodeInfo, name, value) {
+ // events (on-*)
+ if (name.slice(0, 3) === 'on-') {
+ node.removeAttribute(name);
+ nodeInfo.events = nodeInfo.events || [];
+ nodeInfo.events.push({
+ name: name.slice(3),
+ value
+ });
+ return true;
+ }
+ // static id
+ else if (name === 'id') {
+ nodeInfo.id = value;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns the `content` document fragment for a given template.
+ *
+ * For nested templates, Polymer performs an optimization to cache nested
+ * template content to avoid the cost of cloning deeply nested templates.
+ * This method retrieves the cached content for a given template.
+ *
+ * @param {HTMLTemplateElement} template Template to retrieve `content` for
+ * @return {DocumentFragment} Content fragment
+ */
+ static _contentForTemplate(template) {
+ let templateInfo = /** @type {HTMLTemplateElementWithInfo} */ (template)._templateInfo;
+ return (templateInfo && templateInfo.content) || template.content;
+ }
+
+ /**
+ * Clones the provided template content and returns a document fragment
+ * containing the cloned dom.
+ *
+ * The template is parsed (once and memoized) using this library's
+ * template parsing features, and provides the following value-added
+ * features:
+ * * Adds declarative event listeners for `on-event="handler"` attributes
+ * * Generates an "id map" for all nodes with id's under `$` on returned
+ * document fragment
+ * * Passes template info including `content` back to templates as
+ * `_templateInfo` (a performance optimization to avoid deep template
+ * cloning)
+ *
+ * Note that the memoized template parsing process is destructive to the
+ * template: attributes for bindings and declarative event listeners are
+ * removed after being noted in notes, and any nested `<template>.content`
+ * is removed and stored in notes as well.
+ *
+ * @param {!HTMLTemplateElement} template Template to stamp
+ * @return {!StampedTemplate} Cloned template content
+ */
+ _stampTemplate(template) {
+ // Polyfill support: bootstrap the template if it has not already been
+ if (template && !template.content &&
+ window.HTMLTemplateElement && HTMLTemplateElement.decorate) {
+ HTMLTemplateElement.decorate(template);
+ }
+ let templateInfo = this.constructor._parseTemplate(template);
+ let nodeInfo = templateInfo.nodeInfoList;
+ let content = templateInfo.content || template.content;
+ let dom = /** @type {DocumentFragment} */ (document.importNode(content, true));
+ // NOTE: ShadyDom optimization indicating there is an insertion point
+ dom.__noInsertionPoint = !templateInfo.hasInsertionPoint;
+ let nodes = dom.nodeList = new Array(nodeInfo.length);
+ dom.$ = {};
+ for (let i=0, l=nodeInfo.length, info; (i<l) && (info=nodeInfo[i]); i++) {
+ let node = nodes[i] = findTemplateNode(dom, info);
+ applyIdToMap(this, dom.$, node, info);
+ applyTemplateContent(this, node, info);
+ applyEventListener(this, node, info);
+ }
+ dom = /** @type {!StampedTemplate} */(dom); // eslint-disable-line no-self-assign
+ return dom;
+ }
+
+ /**
+ * Adds an event listener by method name for the event provided.
+ *
+ * This method generates a handler function that looks up the method
+ * name at handling time.
+ *
+ * @param {!Node} node Node to add listener on
+ * @param {string} eventName Name of event
+ * @param {string} methodName Name of method
+ * @param {*=} context Context the method will be called on (defaults
+ * to `node`)
+ * @return {Function} Generated handler function
+ */
+ _addMethodEventListenerToNode(node, eventName, methodName, context) {
+ context = context || node;
+ let handler = createNodeEventHandler(context, eventName, methodName);
+ this._addEventListenerToNode(node, eventName, handler);
+ return handler;
+ }
+
+ /**
+ * Override point for adding custom or simulated event handling.
+ *
+ * @param {!Node} node Node to add event listener to
+ * @param {string} eventName Name of event
+ * @param {function(!Event):void} handler Listener function to add
+ * @return {void}
+ */
+ _addEventListenerToNode(node, eventName, handler) {
+ node.addEventListener(eventName, handler);
+ }
+
+ /**
+ * Override point for adding custom or simulated event handling.
+ *
+ * @param {Node} node Node to remove event listener from
+ * @param {string} eventName Name of event
+ * @param {function(!Event):void} handler Listener function to remove
+ * @return {void}
+ */
+ _removeEventListenerFromNode(node, eventName, handler) {
+ node.removeEventListener(eventName, handler);
+ }
+
+ }
+
+ return TemplateStamp;
+
+});
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/array-splice.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/array-splice.js
new file mode 100644
index 00000000000..77ccb1af5c1
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/array-splice.js
@@ -0,0 +1,299 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+function newSplice(index, removed, addedCount) {
+ return {
+ index: index,
+ removed: removed,
+ addedCount: addedCount
+ };
+}
+
+const EDIT_LEAVE = 0;
+const EDIT_UPDATE = 1;
+const EDIT_ADD = 2;
+const EDIT_DELETE = 3;
+
+// Note: This function is *based* on the computation of the Levenshtein
+// "edit" distance. The one change is that "updates" are treated as two
+// edits - not one. With Array splices, an update is really a delete
+// followed by an add. By retaining this, we optimize for "keeping" the
+// maximum array items in the original array. For example:
+//
+// 'xxxx123' -> '123yyyy'
+//
+// With 1-edit updates, the shortest path would be just to update all seven
+// characters. With 2-edit updates, we delete 4, leave 3, and add 4. This
+// leaves the substring '123' intact.
+function calcEditDistances(current, currentStart, currentEnd,
+ old, oldStart, oldEnd) {
+ // "Deletion" columns
+ let rowCount = oldEnd - oldStart + 1;
+ let columnCount = currentEnd - currentStart + 1;
+ let distances = new Array(rowCount);
+
+ // "Addition" rows. Initialize null column.
+ for (let i = 0; i < rowCount; i++) {
+ distances[i] = new Array(columnCount);
+ distances[i][0] = i;
+ }
+
+ // Initialize null row
+ for (let j = 0; j < columnCount; j++)
+ distances[0][j] = j;
+
+ for (let i = 1; i < rowCount; i++) {
+ for (let j = 1; j < columnCount; j++) {
+ if (equals(current[currentStart + j - 1], old[oldStart + i - 1]))
+ distances[i][j] = distances[i - 1][j - 1];
+ else {
+ let north = distances[i - 1][j] + 1;
+ let west = distances[i][j - 1] + 1;
+ distances[i][j] = north < west ? north : west;
+ }
+ }
+ }
+
+ return distances;
+}
+
+// This starts at the final weight, and walks "backward" by finding
+// the minimum previous weight recursively until the origin of the weight
+// matrix.
+function spliceOperationsFromEditDistances(distances) {
+ let i = distances.length - 1;
+ let j = distances[0].length - 1;
+ let current = distances[i][j];
+ let edits = [];
+ while (i > 0 || j > 0) {
+ if (i == 0) {
+ edits.push(EDIT_ADD);
+ j--;
+ continue;
+ }
+ if (j == 0) {
+ edits.push(EDIT_DELETE);
+ i--;
+ continue;
+ }
+ let northWest = distances[i - 1][j - 1];
+ let west = distances[i - 1][j];
+ let north = distances[i][j - 1];
+
+ let min;
+ if (west < north)
+ min = west < northWest ? west : northWest;
+ else
+ min = north < northWest ? north : northWest;
+
+ if (min == northWest) {
+ if (northWest == current) {
+ edits.push(EDIT_LEAVE);
+ } else {
+ edits.push(EDIT_UPDATE);
+ current = northWest;
+ }
+ i--;
+ j--;
+ } else if (min == west) {
+ edits.push(EDIT_DELETE);
+ i--;
+ current = west;
+ } else {
+ edits.push(EDIT_ADD);
+ j--;
+ current = north;
+ }
+ }
+
+ edits.reverse();
+ return edits;
+}
+
+/**
+ * Splice Projection functions:
+ *
+ * A splice map is a representation of how a previous array of items
+ * was transformed into a new array of items. Conceptually it is a list of
+ * tuples of
+ *
+ * <index, removed, addedCount>
+ *
+ * which are kept in ascending index order of. The tuple represents that at
+ * the |index|, |removed| sequence of items were removed, and counting forward
+ * from |index|, |addedCount| items were added.
+ */
+
+/**
+ * Lacking individual splice mutation information, the minimal set of
+ * splices can be synthesized given the previous state and final state of an
+ * array. The basic approach is to calculate the edit distance matrix and
+ * choose the shortest path through it.
+ *
+ * Complexity: O(l * p)
+ * l: The length of the current array
+ * p: The length of the old array
+ *
+ * @param {!Array} current The current "changed" array for which to
+ * calculate splices.
+ * @param {number} currentStart Starting index in the `current` array for
+ * which splices are calculated.
+ * @param {number} currentEnd Ending index in the `current` array for
+ * which splices are calculated.
+ * @param {!Array} old The original "unchanged" array to compare `current`
+ * against to determine splices.
+ * @param {number} oldStart Starting index in the `old` array for
+ * which splices are calculated.
+ * @param {number} oldEnd Ending index in the `old` array for
+ * which splices are calculated.
+ * @return {!Array} Returns an array of splice record objects. Each of these
+ * contains: `index` the location where the splice occurred; `removed`
+ * the array of removed items from this location; `addedCount` the number
+ * of items added at this location.
+ */
+function calcSplices(current, currentStart, currentEnd,
+ old, oldStart, oldEnd) {
+ let prefixCount = 0;
+ let suffixCount = 0;
+ let splice;
+
+ let minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);
+ if (currentStart == 0 && oldStart == 0)
+ prefixCount = sharedPrefix(current, old, minLength);
+
+ if (currentEnd == current.length && oldEnd == old.length)
+ suffixCount = sharedSuffix(current, old, minLength - prefixCount);
+
+ currentStart += prefixCount;
+ oldStart += prefixCount;
+ currentEnd -= suffixCount;
+ oldEnd -= suffixCount;
+
+ if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)
+ return [];
+
+ if (currentStart == currentEnd) {
+ splice = newSplice(currentStart, [], 0);
+ while (oldStart < oldEnd)
+ splice.removed.push(old[oldStart++]);
+
+ return [ splice ];
+ } else if (oldStart == oldEnd)
+ return [ newSplice(currentStart, [], currentEnd - currentStart) ];
+
+ let ops = spliceOperationsFromEditDistances(
+ calcEditDistances(current, currentStart, currentEnd,
+ old, oldStart, oldEnd));
+
+ splice = undefined;
+ let splices = [];
+ let index = currentStart;
+ let oldIndex = oldStart;
+ for (let i = 0; i < ops.length; i++) {
+ switch(ops[i]) {
+ case EDIT_LEAVE:
+ if (splice) {
+ splices.push(splice);
+ splice = undefined;
+ }
+
+ index++;
+ oldIndex++;
+ break;
+ case EDIT_UPDATE:
+ if (!splice)
+ splice = newSplice(index, [], 0);
+
+ splice.addedCount++;
+ index++;
+
+ splice.removed.push(old[oldIndex]);
+ oldIndex++;
+ break;
+ case EDIT_ADD:
+ if (!splice)
+ splice = newSplice(index, [], 0);
+
+ splice.addedCount++;
+ index++;
+ break;
+ case EDIT_DELETE:
+ if (!splice)
+ splice = newSplice(index, [], 0);
+
+ splice.removed.push(old[oldIndex]);
+ oldIndex++;
+ break;
+ }
+ }
+
+ if (splice) {
+ splices.push(splice);
+ }
+ return splices;
+}
+
+function sharedPrefix(current, old, searchLength) {
+ for (let i = 0; i < searchLength; i++)
+ if (!equals(current[i], old[i]))
+ return i;
+ return searchLength;
+}
+
+function sharedSuffix(current, old, searchLength) {
+ let index1 = current.length;
+ let index2 = old.length;
+ let count = 0;
+ while (count < searchLength && equals(current[--index1], old[--index2]))
+ count++;
+
+ return count;
+}
+
+/**
+ * Returns an array of splice records indicating the minimum edits required
+ * to transform the `previous` array into the `current` array.
+ *
+ * Splice records are ordered by index and contain the following fields:
+ * - `index`: index where edit started
+ * - `removed`: array of removed items from this index
+ * - `addedCount`: number of items added at this index
+ *
+ * This function is based on the Levenshtein "minimum edit distance"
+ * algorithm. Note that updates are treated as removal followed by addition.
+ *
+ * The worst-case time complexity of this algorithm is `O(l * p)`
+ * l: The length of the current array
+ * p: The length of the previous array
+ *
+ * However, the worst-case complexity is reduced by an `O(n)` optimization
+ * to detect any shared prefix & suffix between the two arrays and only
+ * perform the more expensive minimum edit distance calculation over the
+ * non-shared portions of the arrays.
+ *
+ * @function
+ * @param {!Array} current The "changed" array for which splices will be
+ * calculated.
+ * @param {!Array} previous The "unchanged" original array to compare
+ * `current` against to determine the splices.
+ * @return {!Array} Returns an array of splice record objects. Each of these
+ * contains: `index` the location where the splice occurred; `removed`
+ * the array of removed items from this location; `addedCount` the number
+ * of items added at this location.
+ */
+export function calculateSplices(current, previous) {
+ return calcSplices(current, 0, current.length, previous, 0,
+ previous.length);
+}
+
+function equals(currentValue, previousValue) {
+ return currentValue === previousValue;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/async.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/async.js
new file mode 100644
index 00000000000..e332f95325c
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/async.js
@@ -0,0 +1,207 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+/**
+ * @fileoverview
+ *
+ * This module provides a number of strategies for enqueuing asynchronous
+ * tasks. Each sub-module provides a standard `run(fn)` interface that returns a
+ * handle, and a `cancel(handle)` interface for canceling async tasks before
+ * they run.
+ *
+ * @summary Module that provides a number of strategies for enqueuing
+ * asynchronous tasks.
+ */
+
+import './boot.js';
+
+// Microtask implemented using Mutation Observer
+let microtaskCurrHandle = 0;
+let microtaskLastHandle = 0;
+let microtaskCallbacks = [];
+let microtaskNodeContent = 0;
+let microtaskNode = document.createTextNode('');
+new window.MutationObserver(microtaskFlush).observe(microtaskNode, {characterData: true});
+
+function microtaskFlush() {
+ const len = microtaskCallbacks.length;
+ for (let i = 0; i < len; i++) {
+ let cb = microtaskCallbacks[i];
+ if (cb) {
+ try {
+ cb();
+ } catch (e) {
+ setTimeout(() => { throw e; });
+ }
+ }
+ }
+ microtaskCallbacks.splice(0, len);
+ microtaskLastHandle += len;
+}
+
+/**
+ * Async interface wrapper around `setTimeout`.
+ *
+ * @namespace
+ * @summary Async interface wrapper around `setTimeout`.
+ */
+const timeOut = {
+ /**
+ * Returns a sub-module with the async interface providing the provided
+ * delay.
+ *
+ * @memberof timeOut
+ * @param {number=} delay Time to wait before calling callbacks in ms
+ * @return {!AsyncInterface} An async timeout interface
+ */
+ after(delay) {
+ return {
+ run(fn) { return window.setTimeout(fn, delay); },
+ cancel(handle) {
+ window.clearTimeout(handle);
+ }
+ };
+ },
+ /**
+ * Enqueues a function called in the next task.
+ *
+ * @memberof timeOut
+ * @param {!Function} fn Callback to run
+ * @param {number=} delay Delay in milliseconds
+ * @return {number} Handle used for canceling task
+ */
+ run(fn, delay) {
+ return window.setTimeout(fn, delay);
+ },
+ /**
+ * Cancels a previously enqueued `timeOut` callback.
+ *
+ * @memberof timeOut
+ * @param {number} handle Handle returned from `run` of callback to cancel
+ * @return {void}
+ */
+ cancel(handle) {
+ window.clearTimeout(handle);
+ }
+};
+export {timeOut};
+
+/**
+ * Async interface wrapper around `requestAnimationFrame`.
+ *
+ * @namespace
+ * @summary Async interface wrapper around `requestAnimationFrame`.
+ */
+const animationFrame = {
+ /**
+ * Enqueues a function called at `requestAnimationFrame` timing.
+ *
+ * @memberof animationFrame
+ * @param {function(number):void} fn Callback to run
+ * @return {number} Handle used for canceling task
+ */
+ run(fn) {
+ return window.requestAnimationFrame(fn);
+ },
+ /**
+ * Cancels a previously enqueued `animationFrame` callback.
+ *
+ * @memberof animationFrame
+ * @param {number} handle Handle returned from `run` of callback to cancel
+ * @return {void}
+ */
+ cancel(handle) {
+ window.cancelAnimationFrame(handle);
+ }
+};
+export {animationFrame};
+
+/**
+ * Async interface wrapper around `requestIdleCallback`. Falls back to
+ * `setTimeout` on browsers that do not support `requestIdleCallback`.
+ *
+ * @namespace
+ * @summary Async interface wrapper around `requestIdleCallback`.
+ */
+const idlePeriod = {
+ /**
+ * Enqueues a function called at `requestIdleCallback` timing.
+ *
+ * @memberof idlePeriod
+ * @param {function(!IdleDeadline):void} fn Callback to run
+ * @return {number} Handle used for canceling task
+ */
+ run(fn) {
+ return window.requestIdleCallback ?
+ window.requestIdleCallback(fn) :
+ window.setTimeout(fn, 16);
+ },
+ /**
+ * Cancels a previously enqueued `idlePeriod` callback.
+ *
+ * @memberof idlePeriod
+ * @param {number} handle Handle returned from `run` of callback to cancel
+ * @return {void}
+ */
+ cancel(handle) {
+ window.cancelIdleCallback ?
+ window.cancelIdleCallback(handle) :
+ window.clearTimeout(handle);
+ }
+};
+export {idlePeriod};
+
+/**
+ * Async interface for enqueuing callbacks that run at microtask timing.
+ *
+ * Note that microtask timing is achieved via a single `MutationObserver`,
+ * and thus callbacks enqueued with this API will all run in a single
+ * batch, and not interleaved with other microtasks such as promises.
+ * Promises are avoided as an implementation choice for the time being
+ * due to Safari bugs that cause Promises to lack microtask guarantees.
+ *
+ * @namespace
+ * @summary Async interface for enqueuing callbacks that run at microtask
+ * timing.
+ */
+const microTask = {
+
+ /**
+ * Enqueues a function called at microtask timing.
+ *
+ * @memberof microTask
+ * @param {!Function=} callback Callback to run
+ * @return {number} Handle used for canceling task
+ */
+ run(callback) {
+ microtaskNode.textContent = microtaskNodeContent++;
+ microtaskCallbacks.push(callback);
+ return microtaskCurrHandle++;
+ },
+
+ /**
+ * Cancels a previously enqueued `microTask` callback.
+ *
+ * @memberof microTask
+ * @param {number} handle Handle returned from `run` of callback to cancel
+ * @return {void}
+ */
+ cancel(handle) {
+ const idx = handle - microtaskLastHandle;
+ if (idx >= 0) {
+ if (!microtaskCallbacks[idx]) {
+ throw new Error('invalid async handle: ' + handle);
+ }
+ microtaskCallbacks[idx] = null;
+ }
+ }
+
+};
+export {microTask};
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/boot.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/boot.js
new file mode 100644
index 00000000000..511b3c52198
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/boot.js
@@ -0,0 +1,11 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+window.JSCompiler_renameProperty = function(prop) { return prop; };
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/case-map.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/case-map.js
new file mode 100644
index 00000000000..0f87213d3f7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/case-map.js
@@ -0,0 +1,53 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+const caseMap = {};
+const DASH_TO_CAMEL = /-[a-z]/g;
+const CAMEL_TO_DASH = /([A-Z])/g;
+
+/**
+ * Module with utilities for converting between "dash-case" and "camelCase"
+ * identifiers.
+ *
+ * @summary Module that provides utilities for converting between "dash-case"
+ * and "camelCase".
+ */
+`TODO(modulizer): A namespace named Polymer.CaseMap was
+declared here. The surrounding comments should be reviewed,
+and this string can then be deleted`;
+
+/**
+ * Converts "dash-case" identifier (e.g. `foo-bar-baz`) to "camelCase"
+ * (e.g. `fooBarBaz`).
+ *
+ * @param {string} dash Dash-case identifier
+ * @return {string} Camel-case representation of the identifier
+ */
+export function dashToCamelCase(dash) {
+ return caseMap[dash] || (
+ caseMap[dash] = dash.indexOf('-') < 0 ? dash : dash.replace(DASH_TO_CAMEL,
+ (m) => m[1].toUpperCase()
+ )
+ );
+}
+
+/**
+ * Converts "camelCase" identifier (e.g. `fooBarBaz`) to "dash-case"
+ * (e.g. `foo-bar-baz`).
+ *
+ * @param {string} camel Camel-case identifier
+ * @return {string} Dash-case representation of the identifier
+ */
+export function camelToDashCase(camel) {
+ return caseMap[camel] || (
+ caseMap[camel] = camel.replace(CAMEL_TO_DASH, '-$1').toLowerCase()
+ );
+}
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/debounce.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/debounce.js
new file mode 100644
index 00000000000..9262d00a1ee
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/debounce.js
@@ -0,0 +1,114 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+import './mixin.js';
+import './async.js';
+
+/**
+ * @summary Collapse multiple callbacks into one invocation after a timer.
+ */
+export const Debouncer = class Debouncer {
+ constructor() {
+ this._asyncModule = null;
+ this._callback = null;
+ this._timer = null;
+ }
+ /**
+ * Sets the scheduler; that is, a module with the Async interface,
+ * a callback and optional arguments to be passed to the run function
+ * from the async module.
+ *
+ * @param {!AsyncInterface} asyncModule Object with Async interface.
+ * @param {function()} callback Callback to run.
+ * @return {void}
+ */
+ setConfig(asyncModule, callback) {
+ this._asyncModule = asyncModule;
+ this._callback = callback;
+ this._timer = this._asyncModule.run(() => {
+ this._timer = null;
+ this._callback();
+ });
+ }
+ /**
+ * Cancels an active debouncer and returns a reference to itself.
+ *
+ * @return {void}
+ */
+ cancel() {
+ if (this.isActive()) {
+ this._asyncModule.cancel(this._timer);
+ this._timer = null;
+ }
+ }
+ /**
+ * Flushes an active debouncer and returns a reference to itself.
+ *
+ * @return {void}
+ */
+ flush() {
+ if (this.isActive()) {
+ this.cancel();
+ this._callback();
+ }
+ }
+ /**
+ * Returns true if the debouncer is active.
+ *
+ * @return {boolean} True if active.
+ */
+ isActive() {
+ return this._timer != null;
+ }
+ /**
+ * Creates a debouncer if no debouncer is passed as a parameter
+ * or it cancels an active debouncer otherwise. The following
+ * example shows how a debouncer can be called multiple times within a
+ * microtask and "debounced" such that the provided callback function is
+ * called once. Add this method to a custom element:
+ *
+ * ```js
+ * import {microtask} from '@polymer/polymer/lib/utils/async.js';
+ * import {Debouncer} from '@polymer/polymer/lib/utils/debounce.js';
+ * // ...
+ *
+ * _debounceWork() {
+ * this._debounceJob = Debouncer.debounce(this._debounceJob,
+ * microTask, () => this._doWork());
+ * }
+ * ```
+ *
+ * If the `_debounceWork` method is called multiple times within the same
+ * microtask, the `_doWork` function will be called only once at the next
+ * microtask checkpoint.
+ *
+ * Note: In testing it is often convenient to avoid asynchrony. To accomplish
+ * this with a debouncer, you can use `enqueueDebouncer` and
+ * `flush`. For example, extend the above example by adding
+ * `enqueueDebouncer(this._debounceJob)` at the end of the
+ * `_debounceWork` method. Then in a test, call `flush` to ensure
+ * the debouncer has completed.
+ *
+ * @param {Debouncer?} debouncer Debouncer object.
+ * @param {!AsyncInterface} asyncModule Object with Async interface
+ * @param {function()} callback Callback to run.
+ * @return {!Debouncer} Returns a debouncer object.
+ */
+ static debounce(debouncer, asyncModule, callback) {
+ if (debouncer instanceof Debouncer) {
+ debouncer.cancel();
+ } else {
+ debouncer = new Debouncer();
+ }
+ debouncer.setConfig(asyncModule, callback);
+ return debouncer;
+ }
+};
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/flattened-nodes-observer.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/flattened-nodes-observer.js
new file mode 100644
index 00000000000..7d522dc45cc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/flattened-nodes-observer.js
@@ -0,0 +1,304 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+import { calculateSplices } from './array-splice.js';
+import { microTask } from './async.js';
+
+/**
+ * Returns true if `node` is a slot element
+ * @param {Node} node Node to test.
+ * @return {boolean} Returns true if the given `node` is a slot
+ * @private
+ */
+function isSlot(node) {
+ return (node.localName === 'slot');
+}
+
+/**
+ * Class that listens for changes (additions or removals) to
+ * "flattened nodes" on a given `node`. The list of flattened nodes consists
+ * of a node's children and, for any children that are `<slot>` elements,
+ * the expanded flattened list of `assignedNodes`.
+ * For example, if the observed node has children `<a></a><slot></slot><b></b>`
+ * and the `<slot>` has one `<div>` assigned to it, then the flattened
+ * nodes list is `<a></a><div></div><b></b>`. If the `<slot>` has other
+ * `<slot>` elements assigned to it, these are flattened as well.
+ *
+ * The provided `callback` is called whenever any change to this list
+ * of flattened nodes occurs, where an addition or removal of a node is
+ * considered a change. The `callback` is called with one argument, an object
+ * containing an array of any `addedNodes` and `removedNodes`.
+ *
+ * Note: the callback is called asynchronous to any changes
+ * at a microtask checkpoint. This is because observation is performed using
+ * `MutationObserver` and the `<slot>` element's `slotchange` event which
+ * are asynchronous.
+ *
+ * An example:
+ * ```js
+ * class TestSelfObserve extends PolymerElement {
+ * static get is() { return 'test-self-observe';}
+ * connectedCallback() {
+ * super.connectedCallback();
+ * this._observer = new FlattenedNodesObserver(this, (info) => {
+ * this.info = info;
+ * });
+ * }
+ * disconnectedCallback() {
+ * super.disconnectedCallback();
+ * this._observer.disconnect();
+ * }
+ * }
+ * customElements.define(TestSelfObserve.is, TestSelfObserve);
+ * ```
+ *
+ * @summary Class that listens for changes (additions or removals) to
+ * "flattened nodes" on a given `node`.
+ */
+export class FlattenedNodesObserver {
+
+ /**
+ * Returns the list of flattened nodes for the given `node`.
+ * This list consists of a node's children and, for any children
+ * that are `<slot>` elements, the expanded flattened list of `assignedNodes`.
+ * For example, if the observed node has children `<a></a><slot></slot><b></b>`
+ * and the `<slot>` has one `<div>` assigned to it, then the flattened
+ * nodes list is `<a></a><div></div><b></b>`. If the `<slot>` has other
+ * `<slot>` elements assigned to it, these are flattened as well.
+ *
+ * @param {HTMLElement|HTMLSlotElement} node The node for which to return the list of flattened nodes.
+ * @return {Array} The list of flattened nodes for the given `node`.
+ */
+ static getFlattenedNodes(node) {
+ if (isSlot(node)) {
+ node = /** @type {HTMLSlotElement} */(node); // eslint-disable-line no-self-assign
+ return node.assignedNodes({flatten: true});
+ } else {
+ return Array.from(node.childNodes).map((node) => {
+ if (isSlot(node)) {
+ node = /** @type {HTMLSlotElement} */(node); // eslint-disable-line no-self-assign
+ return node.assignedNodes({flatten: true});
+ } else {
+ return [node];
+ }
+ }).reduce((a, b) => a.concat(b), []);
+ }
+ }
+
+ /**
+ * @param {Element} target Node on which to listen for changes.
+ * @param {?function(!Element, { target: !Element, addedNodes: !Array<!Element>, removedNodes: !Array<!Element> }):void} callback Function called when there are additions
+ * or removals from the target's list of flattened nodes.
+ */
+ constructor(target, callback) {
+ /**
+ * @type {MutationObserver}
+ * @private
+ */
+ this._shadyChildrenObserver = null;
+ /**
+ * @type {MutationObserver}
+ * @private
+ */
+ this._nativeChildrenObserver = null;
+ this._connected = false;
+ /**
+ * @type {Element}
+ * @private
+ */
+ this._target = target;
+ this.callback = callback;
+ this._effectiveNodes = [];
+ this._observer = null;
+ this._scheduled = false;
+ /**
+ * @type {function()}
+ * @private
+ */
+ this._boundSchedule = () => {
+ this._schedule();
+ };
+ this.connect();
+ this._schedule();
+ }
+
+ /**
+ * Activates an observer. This method is automatically called when
+ * a `FlattenedNodesObserver` is created. It should only be called to
+ * re-activate an observer that has been deactivated via the `disconnect` method.
+ *
+ * @return {void}
+ */
+ connect() {
+ if (isSlot(this._target)) {
+ this._listenSlots([this._target]);
+ } else if (this._target.children) {
+ this._listenSlots(this._target.children);
+ if (window.ShadyDOM) {
+ this._shadyChildrenObserver =
+ ShadyDOM.observeChildren(this._target, (mutations) => {
+ this._processMutations(mutations);
+ });
+ } else {
+ this._nativeChildrenObserver =
+ new MutationObserver((mutations) => {
+ this._processMutations(mutations);
+ });
+ this._nativeChildrenObserver.observe(this._target, {childList: true});
+ }
+ }
+ this._connected = true;
+ }
+
+ /**
+ * Deactivates the flattened nodes observer. After calling this method
+ * the observer callback will not be called when changes to flattened nodes
+ * occur. The `connect` method may be subsequently called to reactivate
+ * the observer.
+ *
+ * @return {void}
+ */
+ disconnect() {
+ if (isSlot(this._target)) {
+ this._unlistenSlots([this._target]);
+ } else if (this._target.children) {
+ this._unlistenSlots(this._target.children);
+ if (window.ShadyDOM && this._shadyChildrenObserver) {
+ ShadyDOM.unobserveChildren(this._shadyChildrenObserver);
+ this._shadyChildrenObserver = null;
+ } else if (this._nativeChildrenObserver) {
+ this._nativeChildrenObserver.disconnect();
+ this._nativeChildrenObserver = null;
+ }
+ }
+ this._connected = false;
+ }
+
+ /**
+ * @return {void}
+ * @private
+ */
+ _schedule() {
+ if (!this._scheduled) {
+ this._scheduled = true;
+ microTask.run(() => this.flush());
+ }
+ }
+
+ /**
+ * @param {Array<MutationRecord>} mutations Mutations signaled by the mutation observer
+ * @return {void}
+ * @private
+ */
+ _processMutations(mutations) {
+ this._processSlotMutations(mutations);
+ this.flush();
+ }
+
+ /**
+ * @param {Array<MutationRecord>} mutations Mutations signaled by the mutation observer
+ * @return {void}
+ * @private
+ */
+ _processSlotMutations(mutations) {
+ if (mutations) {
+ for (let i=0; i < mutations.length; i++) {
+ let mutation = mutations[i];
+ if (mutation.addedNodes) {
+ this._listenSlots(mutation.addedNodes);
+ }
+ if (mutation.removedNodes) {
+ this._unlistenSlots(mutation.removedNodes);
+ }
+ }
+ }
+ }
+
+ /**
+ * Flushes the observer causing any pending changes to be immediately
+ * delivered the observer callback. By default these changes are delivered
+ * asynchronously at the next microtask checkpoint.
+ *
+ * @return {boolean} Returns true if any pending changes caused the observer
+ * callback to run.
+ */
+ flush() {
+ if (!this._connected) {
+ return false;
+ }
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ if (this._nativeChildrenObserver) {
+ this._processSlotMutations(this._nativeChildrenObserver.takeRecords());
+ } else if (this._shadyChildrenObserver) {
+ this._processSlotMutations(this._shadyChildrenObserver.takeRecords());
+ }
+ this._scheduled = false;
+ let info = {
+ target: this._target,
+ addedNodes: [],
+ removedNodes: []
+ };
+ let newNodes = this.constructor.getFlattenedNodes(this._target);
+ let splices = calculateSplices(newNodes,
+ this._effectiveNodes);
+ // process removals
+ for (let i=0, s; (i<splices.length) && (s=splices[i]); i++) {
+ for (let j=0, n; (j < s.removed.length) && (n=s.removed[j]); j++) {
+ info.removedNodes.push(n);
+ }
+ }
+ // process adds
+ for (let i=0, s; (i<splices.length) && (s=splices[i]); i++) {
+ for (let j=s.index; j < s.index + s.addedCount; j++) {
+ info.addedNodes.push(newNodes[j]);
+ }
+ }
+ // update cache
+ this._effectiveNodes = newNodes;
+ let didFlush = false;
+ if (info.addedNodes.length || info.removedNodes.length) {
+ didFlush = true;
+ this.callback.call(this._target, info);
+ }
+ return didFlush;
+ }
+
+ /**
+ * @param {!Array<Element|Node>|!NodeList<Node>} nodeList Nodes that could change
+ * @return {void}
+ * @private
+ */
+ _listenSlots(nodeList) {
+ for (let i=0; i < nodeList.length; i++) {
+ let n = nodeList[i];
+ if (isSlot(n)) {
+ n.addEventListener('slotchange', this._boundSchedule);
+ }
+ }
+ }
+
+ /**
+ * @param {!Array<Element|Node>|!NodeList<Node>} nodeList Nodes that could change
+ * @return {void}
+ * @private
+ */
+ _unlistenSlots(nodeList) {
+ for (let i=0; i < nodeList.length; i++) {
+ let n = nodeList[i];
+ if (isSlot(n)) {
+ n.removeEventListener('slotchange', this._boundSchedule);
+ }
+ }
+ }
+
+}
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/flush.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/flush.js
new file mode 100644
index 00000000000..874eb0e55a7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/flush.js
@@ -0,0 +1,54 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+let debouncerQueue = [];
+
+/**
+ * Adds a `Debouncer` to a list of globally flushable tasks.
+ *
+ * @param {!Debouncer} debouncer Debouncer to enqueue
+ * @return {void}
+ */
+export const enqueueDebouncer = function(debouncer) {
+ debouncerQueue.push(debouncer);
+};
+
+function flushDebouncers() {
+ const didFlush = Boolean(debouncerQueue.length);
+ while (debouncerQueue.length) {
+ try {
+ debouncerQueue.shift().flush();
+ } catch(e) {
+ setTimeout(() => {
+ throw e;
+ });
+ }
+ }
+ return didFlush;
+}
+
+/**
+ * Forces several classes of asynchronously queued tasks to flush:
+ * - Debouncers added via `enqueueDebouncer`
+ * - ShadyDOM distribution
+ *
+ * @return {void}
+ */
+export const flush = function() {
+ let shadyDOM, debouncers;
+ do {
+ shadyDOM = window.ShadyDOM && ShadyDOM.flush();
+ if (window.ShadyCSS && window.ShadyCSS.ScopingShim) {
+ window.ShadyCSS.ScopingShim.flush();
+ }
+ debouncers = flushDebouncers();
+ } while (shadyDOM || debouncers);
+};
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/gestures.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/gestures.js
new file mode 100644
index 00000000000..c195032a1b3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/gestures.js
@@ -0,0 +1,1081 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+import { timeOut, microTask } from './async.js';
+import { Debouncer } from './debounce.js';
+import { passiveTouchGestures } from './settings.js';
+
+// detect native touch action support
+let HAS_NATIVE_TA = typeof document.head.style.touchAction === 'string';
+let GESTURE_KEY = '__polymerGestures';
+let HANDLED_OBJ = '__polymerGesturesHandled';
+let TOUCH_ACTION = '__polymerGesturesTouchAction';
+// radius for tap and track
+let TAP_DISTANCE = 25;
+let TRACK_DISTANCE = 5;
+// number of last N track positions to keep
+let TRACK_LENGTH = 2;
+
+// Disabling "mouse" handlers for 2500ms is enough
+let MOUSE_TIMEOUT = 2500;
+let MOUSE_EVENTS = ['mousedown', 'mousemove', 'mouseup', 'click'];
+// an array of bitmask values for mapping MouseEvent.which to MouseEvent.buttons
+let MOUSE_WHICH_TO_BUTTONS = [0, 1, 4, 2];
+let MOUSE_HAS_BUTTONS = (function() {
+ try {
+ return new MouseEvent('test', {buttons: 1}).buttons === 1;
+ } catch (e) {
+ return false;
+ }
+})();
+
+/**
+ * @param {string} name Possible mouse event name
+ * @return {boolean} true if mouse event, false if not
+ */
+function isMouseEvent(name) {
+ return MOUSE_EVENTS.indexOf(name) > -1;
+}
+
+/* eslint no-empty: ["error", { "allowEmptyCatch": true }] */
+// check for passive event listeners
+let SUPPORTS_PASSIVE = false;
+(function() {
+ try {
+ let opts = Object.defineProperty({}, 'passive', {get() {SUPPORTS_PASSIVE = true;}});
+ window.addEventListener('test', null, opts);
+ window.removeEventListener('test', null, opts);
+ } catch(e) {}
+})();
+
+/**
+ * Generate settings for event listeners, dependant on `passiveTouchGestures`
+ *
+ * @param {string} eventName Event name to determine if `{passive}` option is
+ * needed
+ * @return {{passive: boolean} | undefined} Options to use for addEventListener
+ * and removeEventListener
+ */
+function PASSIVE_TOUCH(eventName) {
+ if (isMouseEvent(eventName) || eventName === 'touchend') {
+ return;
+ }
+ if (HAS_NATIVE_TA && SUPPORTS_PASSIVE && passiveTouchGestures) {
+ return {passive: true};
+ } else {
+ return;
+ }
+}
+
+// Check for touch-only devices
+let IS_TOUCH_ONLY = navigator.userAgent.match(/iP(?:[oa]d|hone)|Android/);
+
+let GestureRecognizer = function(){}; // eslint-disable-line no-unused-vars
+/** @type {function(): void} */
+GestureRecognizer.prototype.reset;
+/** @type {function(MouseEvent): void | undefined} */
+GestureRecognizer.prototype.mousedown;
+/** @type {(function(MouseEvent): void | undefined)} */
+GestureRecognizer.prototype.mousemove;
+/** @type {(function(MouseEvent): void | undefined)} */
+GestureRecognizer.prototype.mouseup;
+/** @type {(function(TouchEvent): void | undefined)} */
+GestureRecognizer.prototype.touchstart;
+/** @type {(function(TouchEvent): void | undefined)} */
+GestureRecognizer.prototype.touchmove;
+/** @type {(function(TouchEvent): void | undefined)} */
+GestureRecognizer.prototype.touchend;
+/** @type {(function(MouseEvent): void | undefined)} */
+GestureRecognizer.prototype.click;
+
+// keep track of any labels hit by the mouseCanceller
+/** @type {!Array<!HTMLLabelElement>} */
+const clickedLabels = [];
+
+/** @type {!Object<boolean>} */
+const labellable = {
+ 'button': true,
+ 'input': true,
+ 'keygen': true,
+ 'meter': true,
+ 'output': true,
+ 'textarea': true,
+ 'progress': true,
+ 'select': true
+};
+
+/**
+ * @param {HTMLElement} el Element to check labelling status
+ * @return {boolean} element can have labels
+ */
+function canBeLabelled(el) {
+ return labellable[el.localName] || false;
+}
+
+/**
+ * @param {HTMLElement} el Element that may be labelled.
+ * @return {!Array<!HTMLLabelElement>} Relevant label for `el`
+ */
+function matchingLabels(el) {
+ let labels = Array.prototype.slice.call(/** @type {HTMLInputElement} */(el).labels || []);
+ // IE doesn't have `labels` and Safari doesn't populate `labels`
+ // if element is in a shadowroot.
+ // In this instance, finding the non-ancestor labels is enough,
+ // as the mouseCancellor code will handle ancstor labels
+ if (!labels.length) {
+ labels = [];
+ let root = el.getRootNode();
+ // if there is an id on `el`, check for all labels with a matching `for` attribute
+ if (el.id) {
+ let matching = root.querySelectorAll(`label[for = ${el.id}]`);
+ for (let i = 0; i < matching.length; i++) {
+ labels.push(/** @type {!HTMLLabelElement} */(matching[i]));
+ }
+ }
+ }
+ return labels;
+}
+
+// touch will make synthetic mouse events
+// `preventDefault` on touchend will cancel them,
+// but this breaks `<input>` focus and link clicks
+// disable mouse handlers for MOUSE_TIMEOUT ms after
+// a touchend to ignore synthetic mouse events
+let mouseCanceller = function(mouseEvent) {
+ // Check for sourceCapabilities, used to distinguish synthetic events
+ // if mouseEvent did not come from a device that fires touch events,
+ // it was made by a real mouse and should be counted
+ // http://wicg.github.io/InputDeviceCapabilities/#dom-inputdevicecapabilities-firestouchevents
+ let sc = mouseEvent.sourceCapabilities;
+ if (sc && !sc.firesTouchEvents) {
+ return;
+ }
+ // skip synthetic mouse events
+ mouseEvent[HANDLED_OBJ] = {skip: true};
+ // disable "ghost clicks"
+ if (mouseEvent.type === 'click') {
+ let clickFromLabel = false;
+ let path = mouseEvent.composedPath && mouseEvent.composedPath();
+ if (path) {
+ for (let i = 0; i < path.length; i++) {
+ if (path[i].nodeType === Node.ELEMENT_NODE) {
+ if (path[i].localName === 'label') {
+ clickedLabels.push(path[i]);
+ } else if (canBeLabelled(path[i])) {
+ let ownerLabels = matchingLabels(path[i]);
+ // check if one of the clicked labels is labelling this element
+ for (let j = 0; j < ownerLabels.length; j++) {
+ clickFromLabel = clickFromLabel || clickedLabels.indexOf(ownerLabels[j]) > -1;
+ }
+ }
+ }
+ if (path[i] === POINTERSTATE.mouse.target) {
+ return;
+ }
+ }
+ }
+ // if one of the clicked labels was labelling the target element,
+ // this is not a ghost click
+ if (clickFromLabel) {
+ return;
+ }
+ mouseEvent.preventDefault();
+ mouseEvent.stopPropagation();
+ }
+};
+
+/**
+ * @param {boolean=} setup True to add, false to remove.
+ * @return {void}
+ */
+function setupTeardownMouseCanceller(setup) {
+ let events = IS_TOUCH_ONLY ? ['click'] : MOUSE_EVENTS;
+ for (let i = 0, en; i < events.length; i++) {
+ en = events[i];
+ if (setup) {
+ // reset clickLabels array
+ clickedLabels.length = 0;
+ document.addEventListener(en, mouseCanceller, true);
+ } else {
+ document.removeEventListener(en, mouseCanceller, true);
+ }
+ }
+}
+
+function ignoreMouse(e) {
+ if (!POINTERSTATE.mouse.mouseIgnoreJob) {
+ setupTeardownMouseCanceller(true);
+ }
+ let unset = function() {
+ setupTeardownMouseCanceller();
+ POINTERSTATE.mouse.target = null;
+ POINTERSTATE.mouse.mouseIgnoreJob = null;
+ };
+ POINTERSTATE.mouse.target = e.composedPath()[0];
+ POINTERSTATE.mouse.mouseIgnoreJob = Debouncer.debounce(
+ POINTERSTATE.mouse.mouseIgnoreJob
+ , timeOut.after(MOUSE_TIMEOUT)
+ , unset);
+}
+
+/**
+ * @param {MouseEvent} ev event to test for left mouse button down
+ * @return {boolean} has left mouse button down
+ */
+function hasLeftMouseButton(ev) {
+ let type = ev.type;
+ // exit early if the event is not a mouse event
+ if (!isMouseEvent(type)) {
+ return false;
+ }
+ // ev.button is not reliable for mousemove (0 is overloaded as both left button and no buttons)
+ // instead we use ev.buttons (bitmask of buttons) or fall back to ev.which (deprecated, 0 for no buttons, 1 for left button)
+ if (type === 'mousemove') {
+ // allow undefined for testing events
+ let buttons = ev.buttons === undefined ? 1 : ev.buttons;
+ if ((ev instanceof window.MouseEvent) && !MOUSE_HAS_BUTTONS) {
+ buttons = MOUSE_WHICH_TO_BUTTONS[ev.which] || 0;
+ }
+ // buttons is a bitmask, check that the left button bit is set (1)
+ return Boolean(buttons & 1);
+ } else {
+ // allow undefined for testing events
+ let button = ev.button === undefined ? 0 : ev.button;
+ // ev.button is 0 in mousedown/mouseup/click for left button activation
+ return button === 0;
+ }
+}
+
+function isSyntheticClick(ev) {
+ if (ev.type === 'click') {
+ // ev.detail is 0 for HTMLElement.click in most browsers
+ if (ev.detail === 0) {
+ return true;
+ }
+ // in the worst case, check that the x/y position of the click is within
+ // the bounding box of the target of the event
+ // Thanks IE 10 >:(
+ let t = _findOriginalTarget(ev);
+ // make sure the target of the event is an element so we can use getBoundingClientRect,
+ // if not, just assume it is a synthetic click
+ if (!t.nodeType || /** @type {Element} */(t).nodeType !== Node.ELEMENT_NODE) {
+ return true;
+ }
+ let bcr = /** @type {Element} */(t).getBoundingClientRect();
+ // use page x/y to account for scrolling
+ let x = ev.pageX, y = ev.pageY;
+ // ev is a synthetic click if the position is outside the bounding box of the target
+ return !((x >= bcr.left && x <= bcr.right) && (y >= bcr.top && y <= bcr.bottom));
+ }
+ return false;
+}
+
+let POINTERSTATE = {
+ mouse: {
+ target: null,
+ mouseIgnoreJob: null
+ },
+ touch: {
+ x: 0,
+ y: 0,
+ id: -1,
+ scrollDecided: false
+ }
+};
+
+function firstTouchAction(ev) {
+ let ta = 'auto';
+ let path = ev.composedPath && ev.composedPath();
+ if (path) {
+ for (let i = 0, n; i < path.length; i++) {
+ n = path[i];
+ if (n[TOUCH_ACTION]) {
+ ta = n[TOUCH_ACTION];
+ break;
+ }
+ }
+ }
+ return ta;
+}
+
+function trackDocument(stateObj, movefn, upfn) {
+ stateObj.movefn = movefn;
+ stateObj.upfn = upfn;
+ document.addEventListener('mousemove', movefn);
+ document.addEventListener('mouseup', upfn);
+}
+
+function untrackDocument(stateObj) {
+ document.removeEventListener('mousemove', stateObj.movefn);
+ document.removeEventListener('mouseup', stateObj.upfn);
+ stateObj.movefn = null;
+ stateObj.upfn = null;
+}
+
+// use a document-wide touchend listener to start the ghost-click prevention mechanism
+// Use passive event listeners, if supported, to not affect scrolling performance
+document.addEventListener('touchend', ignoreMouse, SUPPORTS_PASSIVE ? {passive: true} : false);
+
+/**
+ * Module for adding listeners to a node for the following normalized
+ * cross-platform "gesture" events:
+ * - `down` - mouse or touch went down
+ * - `up` - mouse or touch went up
+ * - `tap` - mouse click or finger tap
+ * - `track` - mouse drag or touch move
+ *
+ * @summary Module for adding cross-platform gesture event listeners.
+ */
+`TODO(modulizer): A namespace named Polymer.Gestures was
+declared here. The surrounding comments should be reviewed,
+and this string can then be deleted`;
+
+export const gestures = {};
+export const recognizers = [];
+
+/**
+ * Finds the element rendered on the screen at the provided coordinates.
+ *
+ * Similar to `document.elementFromPoint`, but pierces through
+ * shadow roots.
+ *
+ * @param {number} x Horizontal pixel coordinate
+ * @param {number} y Vertical pixel coordinate
+ * @return {Element} Returns the deepest shadowRoot inclusive element
+ * found at the screen position given.
+ */
+export function deepTargetFind(x, y) {
+ let node = document.elementFromPoint(x, y);
+ let next = node;
+ // this code path is only taken when native ShadowDOM is used
+ // if there is a shadowroot, it may have a node at x/y
+ // if there is not a shadowroot, exit the loop
+ while (next && next.shadowRoot && !window.ShadyDOM) {
+ // if there is a node at x/y in the shadowroot, look deeper
+ let oldNext = next;
+ next = next.shadowRoot.elementFromPoint(x, y);
+ // on Safari, elementFromPoint may return the shadowRoot host
+ if (oldNext === next) {
+ break;
+ }
+ if (next) {
+ node = next;
+ }
+ }
+ return node;
+}
+
+/**
+ * a cheaper check than ev.composedPath()[0];
+ *
+ * @private
+ * @param {Event} ev Event.
+ * @return {EventTarget} Returns the event target.
+ */
+function _findOriginalTarget(ev) {
+ // shadowdom
+ if (ev.composedPath) {
+ const targets = /** @type {!Array<!EventTarget>} */(ev.composedPath());
+ // It shouldn't be, but sometimes targets is empty (window on Safari).
+ return targets.length > 0 ? targets[0] : ev.target;
+ }
+ // shadydom
+ return ev.target;
+}
+
+/**
+ * @private
+ * @param {Event} ev Event.
+ * @return {void}
+ */
+function _handleNative(ev) {
+ let handled;
+ let type = ev.type;
+ let node = ev.currentTarget;
+ let gobj = node[GESTURE_KEY];
+ if (!gobj) {
+ return;
+ }
+ let gs = gobj[type];
+ if (!gs) {
+ return;
+ }
+ if (!ev[HANDLED_OBJ]) {
+ ev[HANDLED_OBJ] = {};
+ if (type.slice(0, 5) === 'touch') {
+ ev = /** @type {TouchEvent} */(ev); // eslint-disable-line no-self-assign
+ let t = ev.changedTouches[0];
+ if (type === 'touchstart') {
+ // only handle the first finger
+ if (ev.touches.length === 1) {
+ POINTERSTATE.touch.id = t.identifier;
+ }
+ }
+ if (POINTERSTATE.touch.id !== t.identifier) {
+ return;
+ }
+ if (!HAS_NATIVE_TA) {
+ if (type === 'touchstart' || type === 'touchmove') {
+ _handleTouchAction(ev);
+ }
+ }
+ }
+ }
+ handled = ev[HANDLED_OBJ];
+ // used to ignore synthetic mouse events
+ if (handled.skip) {
+ return;
+ }
+ // reset recognizer state
+ for (let i = 0, r; i < recognizers.length; i++) {
+ r = recognizers[i];
+ if (gs[r.name] && !handled[r.name]) {
+ if (r.flow && r.flow.start.indexOf(ev.type) > -1 && r.reset) {
+ r.reset();
+ }
+ }
+ }
+ // enforce gesture recognizer order
+ for (let i = 0, r; i < recognizers.length; i++) {
+ r = recognizers[i];
+ if (gs[r.name] && !handled[r.name]) {
+ handled[r.name] = true;
+ r[type](ev);
+ }
+ }
+}
+
+/**
+ * @private
+ * @param {TouchEvent} ev Event.
+ * @return {void}
+ */
+function _handleTouchAction(ev) {
+ let t = ev.changedTouches[0];
+ let type = ev.type;
+ if (type === 'touchstart') {
+ POINTERSTATE.touch.x = t.clientX;
+ POINTERSTATE.touch.y = t.clientY;
+ POINTERSTATE.touch.scrollDecided = false;
+ } else if (type === 'touchmove') {
+ if (POINTERSTATE.touch.scrollDecided) {
+ return;
+ }
+ POINTERSTATE.touch.scrollDecided = true;
+ let ta = firstTouchAction(ev);
+ let prevent = false;
+ let dx = Math.abs(POINTERSTATE.touch.x - t.clientX);
+ let dy = Math.abs(POINTERSTATE.touch.y - t.clientY);
+ if (!ev.cancelable) {
+ // scrolling is happening
+ } else if (ta === 'none') {
+ prevent = true;
+ } else if (ta === 'pan-x') {
+ prevent = dy > dx;
+ } else if (ta === 'pan-y') {
+ prevent = dx > dy;
+ }
+ if (prevent) {
+ ev.preventDefault();
+ } else {
+ prevent('track');
+ }
+ }
+}
+
+/**
+ * Adds an event listener to a node for the given gesture type.
+ *
+ * @param {!Node} node Node to add listener on
+ * @param {string} evType Gesture type: `down`, `up`, `track`, or `tap`
+ * @param {!function(!Event):void} handler Event listener function to call
+ * @return {boolean} Returns true if a gesture event listener was added.
+ * @this {Gestures}
+ */
+export function addListener(node, evType, handler) {
+ if (gestures[evType]) {
+ _add(node, evType, handler);
+ return true;
+ }
+ return false;
+}
+
+/**
+ * Removes an event listener from a node for the given gesture type.
+ *
+ * @param {!Node} node Node to remove listener from
+ * @param {string} evType Gesture type: `down`, `up`, `track`, or `tap`
+ * @param {!function(!Event):void} handler Event listener function previously passed to
+ * `addListener`.
+ * @return {boolean} Returns true if a gesture event listener was removed.
+ * @this {Gestures}
+ */
+export function removeListener(node, evType, handler) {
+ if (gestures[evType]) {
+ _remove(node, evType, handler);
+ return true;
+ }
+ return false;
+}
+
+/**
+ * automate the event listeners for the native events
+ *
+ * @private
+ * @param {!HTMLElement} node Node on which to add the event.
+ * @param {string} evType Event type to add.
+ * @param {function(!Event)} handler Event handler function.
+ * @return {void}
+ * @this {Gestures}
+ */
+function _add(node, evType, handler) {
+ let recognizer = gestures[evType];
+ let deps = recognizer.deps;
+ let name = recognizer.name;
+ let gobj = node[GESTURE_KEY];
+ if (!gobj) {
+ node[GESTURE_KEY] = gobj = {};
+ }
+ for (let i = 0, dep, gd; i < deps.length; i++) {
+ dep = deps[i];
+ // don't add mouse handlers on iOS because they cause gray selection overlays
+ if (IS_TOUCH_ONLY && isMouseEvent(dep) && dep !== 'click') {
+ continue;
+ }
+ gd = gobj[dep];
+ if (!gd) {
+ gobj[dep] = gd = {_count: 0};
+ }
+ if (gd._count === 0) {
+ node.addEventListener(dep, _handleNative, PASSIVE_TOUCH(dep));
+ }
+ gd[name] = (gd[name] || 0) + 1;
+ gd._count = (gd._count || 0) + 1;
+ }
+ node.addEventListener(evType, handler);
+ if (recognizer.touchAction) {
+ setTouchAction(node, recognizer.touchAction);
+ }
+}
+
+/**
+ * automate event listener removal for native events
+ *
+ * @private
+ * @param {!HTMLElement} node Node on which to remove the event.
+ * @param {string} evType Event type to remove.
+ * @param {function(Event?)} handler Event handler function.
+ * @return {void}
+ * @this {Gestures}
+ */
+function _remove(node, evType, handler) {
+ let recognizer = gestures[evType];
+ let deps = recognizer.deps;
+ let name = recognizer.name;
+ let gobj = node[GESTURE_KEY];
+ if (gobj) {
+ for (let i = 0, dep, gd; i < deps.length; i++) {
+ dep = deps[i];
+ gd = gobj[dep];
+ if (gd && gd[name]) {
+ gd[name] = (gd[name] || 1) - 1;
+ gd._count = (gd._count || 1) - 1;
+ if (gd._count === 0) {
+ node.removeEventListener(dep, _handleNative, PASSIVE_TOUCH(dep));
+ }
+ }
+ }
+ }
+ node.removeEventListener(evType, handler);
+}
+
+/**
+ * Registers a new gesture event recognizer for adding new custom
+ * gesture event types.
+ *
+ * @param {!GestureRecognizer} recog Gesture recognizer descriptor
+ * @return {void}
+ * @this {Gestures}
+ */
+export function register(recog) {
+ recognizers.push(recog);
+ for (let i = 0; i < recog.emits.length; i++) {
+ gestures[recog.emits[i]] = recog;
+ }
+}
+
+/**
+ * @private
+ * @param {string} evName Event name.
+ * @return {Object} Returns the gesture for the given event name.
+ * @this {Gestures}
+ */
+function _findRecognizerByEvent(evName) {
+ for (let i = 0, r; i < recognizers.length; i++) {
+ r = recognizers[i];
+ for (let j = 0, n; j < r.emits.length; j++) {
+ n = r.emits[j];
+ if (n === evName) {
+ return r;
+ }
+ }
+ }
+ return null;
+}
+
+/**
+ * Sets scrolling direction on node.
+ *
+ * This value is checked on first move, thus it should be called prior to
+ * adding event listeners.
+ *
+ * @param {!Element} node Node to set touch action setting on
+ * @param {string} value Touch action value
+ * @return {void}
+ */
+export function setTouchAction(node, value) {
+ if (HAS_NATIVE_TA) {
+ // NOTE: add touchAction async so that events can be added in
+ // custom element constructors. Otherwise we run afoul of custom
+ // elements restriction against settings attributes (style) in the
+ // constructor.
+ microTask.run(() => {
+ node.style.touchAction = value;
+ });
+ }
+ node[TOUCH_ACTION] = value;
+}
+
+/**
+ * Dispatches an event on the `target` element of `type` with the given
+ * `detail`.
+ * @private
+ * @param {!EventTarget} target The element on which to fire an event.
+ * @param {string} type The type of event to fire.
+ * @param {!Object=} detail The detail object to populate on the event.
+ * @return {void}
+ */
+function _fire(target, type, detail) {
+ let ev = new Event(type, { bubbles: true, cancelable: true, composed: true });
+ ev.detail = detail;
+ target.dispatchEvent(ev);
+ // forward `preventDefault` in a clean way
+ if (ev.defaultPrevented) {
+ let preventer = detail.preventer || detail.sourceEvent;
+ if (preventer && preventer.preventDefault) {
+ preventer.preventDefault();
+ }
+ }
+}
+
+/**
+ * Prevents the dispatch and default action of the given event name.
+ *
+ * @param {string} evName Event name.
+ * @return {void}
+ * @this {Gestures}
+ */
+export function prevent(evName) {
+ let recognizer = _findRecognizerByEvent(evName);
+ if (recognizer.info) {
+ recognizer.info.prevent = true;
+ }
+}
+
+/**
+ * Reset the 2500ms timeout on processing mouse input after detecting touch input.
+ *
+ * Touch inputs create synthesized mouse inputs anywhere from 0 to 2000ms after the touch.
+ * This method should only be called during testing with simulated touch inputs.
+ * Calling this method in production may cause duplicate taps or other Gestures.
+ *
+ * @return {void}
+ */
+export function resetMouseCanceller() {
+ if (POINTERSTATE.mouse.mouseIgnoreJob) {
+ POINTERSTATE.mouse.mouseIgnoreJob.flush();
+ }
+}
+
+/* eslint-disable valid-jsdoc */
+
+register({
+ name: 'downup',
+ deps: ['mousedown', 'touchstart', 'touchend'],
+ flow: {
+ start: ['mousedown', 'touchstart'],
+ end: ['mouseup', 'touchend']
+ },
+ emits: ['down', 'up'],
+
+ info: {
+ movefn: null,
+ upfn: null
+ },
+
+ /**
+ * @this {GestureRecognizer}
+ * @return {void}
+ */
+ reset: function() {
+ untrackDocument(this.info);
+ },
+
+ /**
+ * @this {GestureRecognizer}
+ * @param {MouseEvent} e
+ * @return {void}
+ */
+ mousedown: function(e) {
+ if (!hasLeftMouseButton(e)) {
+ return;
+ }
+ let t = _findOriginalTarget(e);
+ let self = this;
+ let movefn = function movefn(e) {
+ if (!hasLeftMouseButton(e)) {
+ self._fire('up', t, e);
+ untrackDocument(self.info);
+ }
+ };
+ let upfn = function upfn(e) {
+ if (hasLeftMouseButton(e)) {
+ self._fire('up', t, e);
+ }
+ untrackDocument(self.info);
+ };
+ trackDocument(this.info, movefn, upfn);
+ this._fire('down', t, e);
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchstart: function(e) {
+ this._fire('down', _findOriginalTarget(e), e.changedTouches[0], e);
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchend: function(e) {
+ this._fire('up', _findOriginalTarget(e), e.changedTouches[0], e);
+ },
+ /**
+ * @param {string} type
+ * @param {!EventTarget} target
+ * @param {Event} event
+ * @param {Function} preventer
+ * @return {void}
+ */
+ _fire: function(type, target, event, preventer) {
+ _fire(target, type, {
+ x: event.clientX,
+ y: event.clientY,
+ sourceEvent: event,
+ preventer: preventer,
+ prevent: function(e) {
+ return prevent(e);
+ }
+ });
+ }
+});
+
+register({
+ name: 'track',
+ touchAction: 'none',
+ deps: ['mousedown', 'touchstart', 'touchmove', 'touchend'],
+ flow: {
+ start: ['mousedown', 'touchstart'],
+ end: ['mouseup', 'touchend']
+ },
+ emits: ['track'],
+
+ info: {
+ x: 0,
+ y: 0,
+ state: 'start',
+ started: false,
+ moves: [],
+ /** @this {GestureRecognizer} */
+ addMove: function(move) {
+ if (this.moves.length > TRACK_LENGTH) {
+ this.moves.shift();
+ }
+ this.moves.push(move);
+ },
+ movefn: null,
+ upfn: null,
+ prevent: false
+ },
+
+ /**
+ * @this {GestureRecognizer}
+ * @return {void}
+ */
+ reset: function() {
+ this.info.state = 'start';
+ this.info.started = false;
+ this.info.moves = [];
+ this.info.x = 0;
+ this.info.y = 0;
+ this.info.prevent = false;
+ untrackDocument(this.info);
+ },
+
+ /**
+ * @this {GestureRecognizer}
+ * @param {number} x
+ * @param {number} y
+ * @return {boolean}
+ */
+ hasMovedEnough: function(x, y) {
+ if (this.info.prevent) {
+ return false;
+ }
+ if (this.info.started) {
+ return true;
+ }
+ let dx = Math.abs(this.info.x - x);
+ let dy = Math.abs(this.info.y - y);
+ return (dx >= TRACK_DISTANCE || dy >= TRACK_DISTANCE);
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {MouseEvent} e
+ * @return {void}
+ */
+ mousedown: function(e) {
+ if (!hasLeftMouseButton(e)) {
+ return;
+ }
+ let t = _findOriginalTarget(e);
+ let self = this;
+ let movefn = function movefn(e) {
+ let x = e.clientX, y = e.clientY;
+ if (self.hasMovedEnough(x, y)) {
+ // first move is 'start', subsequent moves are 'move', mouseup is 'end'
+ self.info.state = self.info.started ? (e.type === 'mouseup' ? 'end' : 'track') : 'start';
+ if (self.info.state === 'start') {
+ // if and only if tracking, always prevent tap
+ prevent('tap');
+ }
+ self.info.addMove({x: x, y: y});
+ if (!hasLeftMouseButton(e)) {
+ // always _fire "end"
+ self.info.state = 'end';
+ untrackDocument(self.info);
+ }
+ self._fire(t, e);
+ self.info.started = true;
+ }
+ };
+ let upfn = function upfn(e) {
+ if (self.info.started) {
+ movefn(e);
+ }
+
+ // remove the temporary listeners
+ untrackDocument(self.info);
+ };
+ // add temporary document listeners as mouse retargets
+ trackDocument(this.info, movefn, upfn);
+ this.info.x = e.clientX;
+ this.info.y = e.clientY;
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchstart: function(e) {
+ let ct = e.changedTouches[0];
+ this.info.x = ct.clientX;
+ this.info.y = ct.clientY;
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchmove: function(e) {
+ let t = _findOriginalTarget(e);
+ let ct = e.changedTouches[0];
+ let x = ct.clientX, y = ct.clientY;
+ if (this.hasMovedEnough(x, y)) {
+ if (this.info.state === 'start') {
+ // if and only if tracking, always prevent tap
+ prevent('tap');
+ }
+ this.info.addMove({x: x, y: y});
+ this._fire(t, ct);
+ this.info.state = 'track';
+ this.info.started = true;
+ }
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchend: function(e) {
+ let t = _findOriginalTarget(e);
+ let ct = e.changedTouches[0];
+ // only trackend if track was started and not aborted
+ if (this.info.started) {
+ // reset started state on up
+ this.info.state = 'end';
+ this.info.addMove({x: ct.clientX, y: ct.clientY});
+ this._fire(t, ct, e);
+ }
+ },
+
+ /**
+ * @this {GestureRecognizer}
+ * @param {!EventTarget} target
+ * @param {Touch} touch
+ * @return {void}
+ */
+ _fire: function(target, touch) {
+ let secondlast = this.info.moves[this.info.moves.length - 2];
+ let lastmove = this.info.moves[this.info.moves.length - 1];
+ let dx = lastmove.x - this.info.x;
+ let dy = lastmove.y - this.info.y;
+ let ddx, ddy = 0;
+ if (secondlast) {
+ ddx = lastmove.x - secondlast.x;
+ ddy = lastmove.y - secondlast.y;
+ }
+ _fire(target, 'track', {
+ state: this.info.state,
+ x: touch.clientX,
+ y: touch.clientY,
+ dx: dx,
+ dy: dy,
+ ddx: ddx,
+ ddy: ddy,
+ sourceEvent: touch,
+ hover: function() {
+ return deepTargetFind(touch.clientX, touch.clientY);
+ }
+ });
+ }
+
+});
+
+register({
+ name: 'tap',
+ deps: ['mousedown', 'click', 'touchstart', 'touchend'],
+ flow: {
+ start: ['mousedown', 'touchstart'],
+ end: ['click', 'touchend']
+ },
+ emits: ['tap'],
+ info: {
+ x: NaN,
+ y: NaN,
+ prevent: false
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @return {void}
+ */
+ reset: function() {
+ this.info.x = NaN;
+ this.info.y = NaN;
+ this.info.prevent = false;
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {MouseEvent} e
+ * @return {void}
+ */
+ save: function(e) {
+ this.info.x = e.clientX;
+ this.info.y = e.clientY;
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {MouseEvent} e
+ * @return {void}
+ */
+ mousedown: function(e) {
+ if (hasLeftMouseButton(e)) {
+ this.save(e);
+ }
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {MouseEvent} e
+ * @return {void}
+ */
+ click: function(e) {
+ if (hasLeftMouseButton(e)) {
+ this.forward(e);
+ }
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchstart: function(e) {
+ this.save(e.changedTouches[0], e);
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchend: function(e) {
+ this.forward(e.changedTouches[0], e);
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {Event | Touch} e
+ * @param {Event=} preventer
+ * @return {void}
+ */
+ forward: function(e, preventer) {
+ let dx = Math.abs(e.clientX - this.info.x);
+ let dy = Math.abs(e.clientY - this.info.y);
+ // find original target from `preventer` for TouchEvents, or `e` for MouseEvents
+ let t = _findOriginalTarget((preventer || e));
+ if (!t || t.disabled) {
+ return;
+ }
+ // dx,dy can be NaN if `click` has been simulated and there was no `down` for `start`
+ if (isNaN(dx) || isNaN(dy) || (dx <= TAP_DISTANCE && dy <= TAP_DISTANCE) || isSyntheticClick(e)) {
+ // prevent taps from being generated if an event has canceled them
+ if (!this.info.prevent) {
+ _fire(t, 'tap', {
+ x: e.clientX,
+ y: e.clientY,
+ sourceEvent: e,
+ preventer: preventer
+ });
+ }
+ }
+ }
+});
+
+/* eslint-enable valid-jsdoc */
+
+/** @deprecated */
+export const findOriginalTarget = _findOriginalTarget;
+
+/** @deprecated */
+export const add = addListener;
+
+/** @deprecated */
+export const remove = removeListener;
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/html-tag.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/html-tag.js
new file mode 100644
index 00000000000..d5640629b98
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/html-tag.js
@@ -0,0 +1,127 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+/**
+ * Class representing a static string value which can be used to filter
+ * strings by asseting that they have been created via this class. The
+ * `value` property returns the string passed to the constructor.
+ */
+class LiteralString {
+ constructor(string) {
+ /** @type {string} */
+ this.value = string.toString();
+ }
+ /**
+ * @return {string} LiteralString string value
+ */
+ toString() {
+ return this.value;
+ }
+}
+
+/**
+ * @param {*} value Object to stringify into HTML
+ * @return {string} HTML stringified form of `obj`
+ */
+function literalValue(value) {
+ if (value instanceof LiteralString) {
+ return /** @type {!LiteralString} */(value).value;
+ } else {
+ throw new Error(
+ `non-literal value passed to Polymer's htmlLiteral function: ${value}`
+ );
+ }
+}
+
+/**
+ * @param {*} value Object to stringify into HTML
+ * @return {string} HTML stringified form of `obj`
+ */
+function htmlValue(value) {
+ if (value instanceof HTMLTemplateElement) {
+ return /** @type {!HTMLTemplateElement } */(value).innerHTML;
+ } else if (value instanceof LiteralString) {
+ return literalValue(value);
+ } else {
+ throw new Error(
+ `non-template value passed to Polymer's html function: ${value}`);
+ }
+}
+
+/**
+ * A template literal tag that creates an HTML <template> element from the
+ * contents of the string.
+ *
+ * This allows you to write a Polymer Template in JavaScript.
+ *
+ * Templates can be composed by interpolating `HTMLTemplateElement`s in
+ * expressions in the JavaScript template literal. The nested template's
+ * `innerHTML` is included in the containing template. The only other
+ * values allowed in expressions are those returned from `htmlLiteral`
+ * which ensures only literal values from JS source ever reach the HTML, to
+ * guard against XSS risks.
+ *
+ * All other values are disallowed in expressions to help prevent XSS
+ * attacks; however, `htmlLiteral` can be used to compose static
+ * string values into templates. This is useful to compose strings into
+ * places that do not accept html, like the css text of a `style`
+ * element.
+ *
+ * Example:
+ *
+ * static get template() {
+ * return html`
+ * <style>:host{ content:"..." }</style>
+ * <div class="shadowed">${this.partialTemplate}</div>
+ * ${super.template}
+ * `;
+ * }
+ * static get partialTemplate() { return html`<span>Partial!</span>`; }
+ *
+ * @param {!ITemplateArray} strings Constant parts of tagged template literal
+ * @param {...*} values Variable parts of tagged template literal
+ * @return {!HTMLTemplateElement} Constructed HTMLTemplateElement
+ */
+export const html = function html(strings, ...values) {
+ const template = /** @type {!HTMLTemplateElement} */(document.createElement('template'));
+ template.innerHTML = values.reduce((acc, v, idx) =>
+ acc + htmlValue(v) + strings[idx + 1], strings[0]);
+ return template;
+};
+
+/**
+ * An html literal tag that can be used with `html` to compose.
+ * a literal string.
+ *
+ * Example:
+ *
+ * static get template() {
+ * return html`
+ * <style>
+ * :host { display: block; }
+ * ${this.styleTemplate()}
+ * </style>
+ * <div class="shadowed">${staticValue}</div>
+ * ${super.template}
+ * `;
+ * }
+ * static get styleTemplate() {
+ * return htmlLiteral`.shadowed { background: gray; }`;
+ * }
+ *
+ * @param {!ITemplateArray} strings Constant parts of tagged template literal
+ * @param {...*} values Variable parts of tagged template literal
+ * @return {!LiteralString} Constructed literal string
+ */
+export const htmlLiteral = function(strings, ...values) {
+ return new LiteralString(values.reduce((acc, v, idx) =>
+ acc + literalValue(v) + strings[idx + 1], strings[0]));
+};
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/mixin.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/mixin.js
new file mode 100644
index 00000000000..45bf64f2f5f
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/mixin.js
@@ -0,0 +1,66 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+// unique global id for deduping mixins.
+let dedupeId = 0;
+
+/**
+ * @constructor
+ * @extends {Function}
+ */
+function MixinFunction(){}
+/** @type {(WeakMap | undefined)} */
+MixinFunction.prototype.__mixinApplications;
+/** @type {(Object | undefined)} */
+MixinFunction.prototype.__mixinSet;
+
+/* eslint-disable valid-jsdoc */
+/**
+ * Wraps an ES6 class expression mixin such that the mixin is only applied
+ * if it has not already been applied its base argument. Also memoizes mixin
+ * applications.
+ *
+ * @template T
+ * @param {T} mixin ES6 class expression mixin to wrap
+ * @return {T}
+ * @suppress {invalidCasts}
+ */
+export const dedupingMixin = function(mixin) {
+ let mixinApplications = /** @type {!MixinFunction} */(mixin).__mixinApplications;
+ if (!mixinApplications) {
+ mixinApplications = new WeakMap();
+ /** @type {!MixinFunction} */(mixin).__mixinApplications = mixinApplications;
+ }
+ // maintain a unique id for each mixin
+ let mixinDedupeId = dedupeId++;
+ function dedupingMixin(base) {
+ let baseSet = /** @type {!MixinFunction} */(base).__mixinSet;
+ if (baseSet && baseSet[mixinDedupeId]) {
+ return base;
+ }
+ let map = mixinApplications;
+ let extended = map.get(base);
+ if (!extended) {
+ extended = /** @type {!Function} */(mixin)(base);
+ map.set(base, extended);
+ }
+ // copy inherited mixin set from the extended class, or the base class
+ // NOTE: we avoid use of Set here because some browser (IE11)
+ // cannot extend a base Set via the constructor.
+ let mixinSet = Object.create(/** @type {!MixinFunction} */(extended).__mixinSet || baseSet || null);
+ mixinSet[mixinDedupeId] = true;
+ /** @type {!MixinFunction} */(extended).__mixinSet = mixinSet;
+ return extended;
+ }
+
+ return /** @type {T} */ (dedupingMixin);
+};
+/* eslint-enable valid-jsdoc */
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/path.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/path.js
new file mode 100644
index 00000000000..79292692ace
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/path.js
@@ -0,0 +1,262 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+/**
+ * Module with utilities for manipulating structured data path strings.
+ *
+ * @summary Module with utilities for manipulating structured data path strings.
+ */
+`TODO(modulizer): A namespace named Polymer.Path was
+declared here. The surrounding comments should be reviewed,
+and this string can then be deleted`;
+
+/**
+ * Returns true if the given string is a structured data path (has dots).
+ *
+ * Example:
+ *
+ * ```
+ * isPath('foo.bar.baz') // true
+ * isPath('foo') // false
+ * ```
+ *
+ * @param {string} path Path string
+ * @return {boolean} True if the string contained one or more dots
+ */
+export function isPath(path) {
+ return path.indexOf('.') >= 0;
+}
+
+/**
+ * Returns the root property name for the given path.
+ *
+ * Example:
+ *
+ * ```
+ * root('foo.bar.baz') // 'foo'
+ * root('foo') // 'foo'
+ * ```
+ *
+ * @param {string} path Path string
+ * @return {string} Root property name
+ */
+export function root(path) {
+ let dotIndex = path.indexOf('.');
+ if (dotIndex === -1) {
+ return path;
+ }
+ return path.slice(0, dotIndex);
+}
+
+/**
+ * Given `base` is `foo.bar`, `foo` is an ancestor, `foo.bar` is not
+ * Returns true if the given path is an ancestor of the base path.
+ *
+ * Example:
+ *
+ * ```
+ * isAncestor('foo.bar', 'foo') // true
+ * isAncestor('foo.bar', 'foo.bar') // false
+ * isAncestor('foo.bar', 'foo.bar.baz') // false
+ * ```
+ *
+ * @param {string} base Path string to test against.
+ * @param {string} path Path string to test.
+ * @return {boolean} True if `path` is an ancestor of `base`.
+ */
+export function isAncestor(base, path) {
+ // base.startsWith(path + '.');
+ return base.indexOf(path + '.') === 0;
+}
+
+/**
+ * Given `base` is `foo.bar`, `foo.bar.baz` is an descendant
+ *
+ * Example:
+ *
+ * ```
+ * isDescendant('foo.bar', 'foo.bar.baz') // true
+ * isDescendant('foo.bar', 'foo.bar') // false
+ * isDescendant('foo.bar', 'foo') // false
+ * ```
+ *
+ * @param {string} base Path string to test against.
+ * @param {string} path Path string to test.
+ * @return {boolean} True if `path` is a descendant of `base`.
+ */
+export function isDescendant(base, path) {
+ // path.startsWith(base + '.');
+ return path.indexOf(base + '.') === 0;
+}
+
+/**
+ * Replaces a previous base path with a new base path, preserving the
+ * remainder of the path.
+ *
+ * User must ensure `path` has a prefix of `base`.
+ *
+ * Example:
+ *
+ * ```
+ * translate('foo.bar', 'zot', 'foo.bar.baz') // 'zot.baz'
+ * ```
+ *
+ * @param {string} base Current base string to remove
+ * @param {string} newBase New base string to replace with
+ * @param {string} path Path to translate
+ * @return {string} Translated string
+ */
+export function translate(base, newBase, path) {
+ return newBase + path.slice(base.length);
+}
+
+/**
+ * @param {string} base Path string to test against
+ * @param {string} path Path string to test
+ * @return {boolean} True if `path` is equal to `base`
+ * @this {Path}
+ */
+export function matches(base, path) {
+ return (base === path) ||
+ isAncestor(base, path) ||
+ isDescendant(base, path);
+}
+
+/**
+ * Converts array-based paths to flattened path. String-based paths
+ * are returned as-is.
+ *
+ * Example:
+ *
+ * ```
+ * normalize(['foo.bar', 0, 'baz']) // 'foo.bar.0.baz'
+ * normalize('foo.bar.0.baz') // 'foo.bar.0.baz'
+ * ```
+ *
+ * @param {string | !Array<string|number>} path Input path
+ * @return {string} Flattened path
+ */
+export function normalize(path) {
+ if (Array.isArray(path)) {
+ let parts = [];
+ for (let i=0; i<path.length; i++) {
+ let args = path[i].toString().split('.');
+ for (let j=0; j<args.length; j++) {
+ parts.push(args[j]);
+ }
+ }
+ return parts.join('.');
+ } else {
+ return path;
+ }
+}
+
+/**
+ * Splits a path into an array of property names. Accepts either arrays
+ * of path parts or strings.
+ *
+ * Example:
+ *
+ * ```
+ * split(['foo.bar', 0, 'baz']) // ['foo', 'bar', '0', 'baz']
+ * split('foo.bar.0.baz') // ['foo', 'bar', '0', 'baz']
+ * ```
+ *
+ * @param {string | !Array<string|number>} path Input path
+ * @return {!Array<string>} Array of path parts
+ * @this {Path}
+ * @suppress {checkTypes}
+ */
+export function split(path) {
+ if (Array.isArray(path)) {
+ return normalize(path).split('.');
+ }
+ return path.toString().split('.');
+}
+
+/**
+ * Reads a value from a path. If any sub-property in the path is `undefined`,
+ * this method returns `undefined` (will never throw.
+ *
+ * @param {Object} root Object from which to dereference path from
+ * @param {string | !Array<string|number>} path Path to read
+ * @param {Object=} info If an object is provided to `info`, the normalized
+ * (flattened) path will be set to `info.path`.
+ * @return {*} Value at path, or `undefined` if the path could not be
+ * fully dereferenced.
+ * @this {Path}
+ */
+export function get(root, path, info) {
+ let prop = root;
+ let parts = split(path);
+ // Loop over path parts[0..n-1] and dereference
+ for (let i=0; i<parts.length; i++) {
+ if (!prop) {
+ return;
+ }
+ let part = parts[i];
+ prop = prop[part];
+ }
+ if (info) {
+ info.path = parts.join('.');
+ }
+ return prop;
+}
+
+/**
+ * Sets a value to a path. If any sub-property in the path is `undefined`,
+ * this method will no-op.
+ *
+ * @param {Object} root Object from which to dereference path from
+ * @param {string | !Array<string|number>} path Path to set
+ * @param {*} value Value to set to path
+ * @return {string | undefined} The normalized version of the input path
+ * @this {Path}
+ */
+export function set(root, path, value) {
+ let prop = root;
+ let parts = split(path);
+ let last = parts[parts.length-1];
+ if (parts.length > 1) {
+ // Loop over path parts[0..n-2] and dereference
+ for (let i=0; i<parts.length-1; i++) {
+ let part = parts[i];
+ prop = prop[part];
+ if (!prop) {
+ return;
+ }
+ }
+ // Set value to object at end of path
+ prop[last] = value;
+ } else {
+ // Simple property set
+ prop[path] = value;
+ }
+ return parts.join('.');
+}
+
+/**
+ * Returns true if the given string is a structured data path (has dots).
+ *
+ * This function is deprecated. Use `isPath` instead.
+ *
+ * Example:
+ *
+ * ```
+ * isDeep('foo.bar.baz') // true
+ * isDeep('foo') // false
+ * ```
+ *
+ * @deprecated
+ * @param {string} path Path string
+ * @return {boolean} True if the string contained one or more dots
+ */
+export const isDeep = isPath;
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/render-status.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/render-status.js
new file mode 100644
index 00000000000..1db3dd9ad43
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/render-status.js
@@ -0,0 +1,120 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+let scheduled = false;
+let beforeRenderQueue = [];
+let afterRenderQueue = [];
+
+function schedule() {
+ scheduled = true;
+ // before next render
+ requestAnimationFrame(function() {
+ scheduled = false;
+ flushQueue(beforeRenderQueue);
+ // after the render
+ setTimeout(function() {
+ runQueue(afterRenderQueue);
+ });
+ });
+}
+
+function flushQueue(queue) {
+ while (queue.length) {
+ callMethod(queue.shift());
+ }
+}
+
+function runQueue(queue) {
+ for (let i=0, l=queue.length; i < l; i++) {
+ callMethod(queue.shift());
+ }
+}
+
+function callMethod(info) {
+ const context = info[0];
+ const callback = info[1];
+ const args = info[2];
+ try {
+ callback.apply(context, args);
+ } catch(e) {
+ setTimeout(() => {
+ throw e;
+ });
+ }
+}
+
+function flush() {
+ while (beforeRenderQueue.length || afterRenderQueue.length) {
+ flushQueue(beforeRenderQueue);
+ flushQueue(afterRenderQueue);
+ }
+ scheduled = false;
+}
+
+/**
+ * Module for scheduling flushable pre-render and post-render tasks.
+ *
+ * @summary Module for scheduling flushable pre-render and post-render tasks.
+ */
+`TODO(modulizer): A namespace named Polymer.RenderStatus was
+declared here. The surrounding comments should be reviewed,
+and this string can then be deleted`;
+
+/**
+ * Enqueues a callback which will be run before the next render, at
+ * `requestAnimationFrame` timing.
+ *
+ * This method is useful for enqueuing work that requires DOM measurement,
+ * since measurement may not be reliable in custom element callbacks before
+ * the first render, as well as for batching measurement tasks in general.
+ *
+ * Tasks in this queue may be flushed by calling `flush()`.
+ *
+ * @param {*} context Context object the callback function will be bound to
+ * @param {function(...*):void} callback Callback function
+ * @param {!Array=} args An array of arguments to call the callback function with
+ * @return {void}
+ */
+export function beforeNextRender(context, callback, args) {
+ if (!scheduled) {
+ schedule();
+ }
+ beforeRenderQueue.push([context, callback, args]);
+}
+
+/**
+ * Enqueues a callback which will be run after the next render, equivalent
+ * to one task (`setTimeout`) after the next `requestAnimationFrame`.
+ *
+ * This method is useful for tuning the first-render performance of an
+ * element or application by deferring non-critical work until after the
+ * first paint. Typical non-render-critical work may include adding UI
+ * event listeners and aria attributes.
+ *
+ * @param {*} context Context object the callback function will be bound to
+ * @param {function(...*):void} callback Callback function
+ * @param {!Array=} args An array of arguments to call the callback function with
+ * @return {void}
+ */
+export function afterNextRender(context, callback, args) {
+ if (!scheduled) {
+ schedule();
+ }
+ afterRenderQueue.push([context, callback, args]);
+}
+
+/**
+ * Flushes all `beforeNextRender` tasks, followed by all `afterNextRender`
+ * tasks.
+ *
+ * @return {void}
+ */
+export { flush };
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/resolve-url.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/resolve-url.js
new file mode 100644
index 00000000000..06b2292e124
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/resolve-url.js
@@ -0,0 +1,87 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+let CSS_URL_RX = /(url\()([^)]*)(\))/g;
+let ABS_URL = /(^\/)|(^#)|(^[\w-\d]*:)/;
+let workingURL;
+let resolveDoc;
+/**
+ * Resolves the given URL against the provided `baseUri'.
+ *
+ * Note that this function performs no resolution for URLs that start
+ * with `/` (absolute URLs) or `#` (hash identifiers). For general purpose
+ * URL resolution, use `window.URL`.
+ *
+ * @param {string} url Input URL to resolve
+ * @param {?string=} baseURI Base URI to resolve the URL against
+ * @return {string} resolved URL
+ */
+export function resolveUrl(url, baseURI) {
+ if (url && ABS_URL.test(url)) {
+ return url;
+ }
+ // Lazy feature detection.
+ if (workingURL === undefined) {
+ workingURL = false;
+ try {
+ const u = new URL('b', 'http://a');
+ u.pathname = 'c%20d';
+ workingURL = (u.href === 'http://a/c%20d');
+ } catch (e) {
+ // silently fail
+ }
+ }
+ if (!baseURI) {
+ baseURI = document.baseURI || window.location.href;
+ }
+ if (workingURL) {
+ return (new URL(url, baseURI)).href;
+ }
+ // Fallback to creating an anchor into a disconnected document.
+ if (!resolveDoc) {
+ resolveDoc = document.implementation.createHTMLDocument('temp');
+ resolveDoc.base = resolveDoc.createElement('base');
+ resolveDoc.head.appendChild(resolveDoc.base);
+ resolveDoc.anchor = resolveDoc.createElement('a');
+ resolveDoc.body.appendChild(resolveDoc.anchor);
+ }
+ resolveDoc.base.href = baseURI;
+ resolveDoc.anchor.href = url;
+ return resolveDoc.anchor.href || url;
+
+}
+
+/**
+ * Resolves any relative URL's in the given CSS text against the provided
+ * `ownerDocument`'s `baseURI`.
+ *
+ * @param {string} cssText CSS text to process
+ * @param {string} baseURI Base URI to resolve the URL against
+ * @return {string} Processed CSS text with resolved URL's
+ */
+export function resolveCss(cssText, baseURI) {
+ return cssText.replace(CSS_URL_RX, function(m, pre, url, post) {
+ return pre + '\'' +
+ resolveUrl(url.replace(/["']/g, ''), baseURI) +
+ '\'' + post;
+ });
+}
+
+/**
+ * Returns a path from a given `url`. The path includes the trailing
+ * `/` from the url.
+ *
+ * @param {string} url Input URL to transform
+ * @return {string} resolved path
+ */
+export function pathFromUrl(url) {
+ return url.substring(0, url.lastIndexOf('/') + 1);
+}
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/settings.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/settings.js
new file mode 100644
index 00000000000..461bd33b4b7
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/settings.js
@@ -0,0 +1,85 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+import { pathFromUrl } from './resolve-url.js';
+export const useShadow = !(window.ShadyDOM);
+export const useNativeCSSProperties = Boolean(!window.ShadyCSS || window.ShadyCSS.nativeCss);
+export const useNativeCustomElements = !(window.customElements.polyfillWrapFlushCallback);
+
+
+/**
+ * Globally settable property that is automatically assigned to
+ * `ElementMixin` instances, useful for binding in templates to
+ * make URL's relative to an application's root. Defaults to the main
+ * document URL, but can be overridden by users. It may be useful to set
+ * `rootPath` to provide a stable application mount path when
+ * using client side routing.
+ */
+export let rootPath = undefined ||
+ pathFromUrl(document.baseURI || window.location.href);
+
+/**
+ * Sets the global rootPath property used by `ElementMixin` and
+ * available via `rootPath`.
+ *
+ * @param {string} path The new root path
+ * @return {void}
+ */
+export const setRootPath = function(path) {
+ rootPath = path;
+};
+
+/**
+ * A global callback used to sanitize any value before inserting it into the DOM. The callback signature is:
+ *
+ * Polymer = {
+ * sanitizeDOMValue: function(value, name, type, node) { ... }
+ * }
+ *
+ * Where:
+ *
+ * `value` is the value to sanitize.
+ * `name` is the name of an attribute or property (for example, href).
+ * `type` indicates where the value is being inserted: one of property, attribute, or text.
+ * `node` is the node where the value is being inserted.
+ *
+ * @type {(function(*,string,string,Node):*)|undefined}
+ */
+export let sanitizeDOMValue = undefined;
+
+/**
+ * Sets the global sanitizeDOMValue available via this module's exported
+ * `sanitizeDOMValue` variable.
+ *
+ * @param {(function(*,string,string,Node):*)|undefined} newSanitizeDOMValue the global sanitizeDOMValue callback
+ * @return {void}
+ */
+export const setSanitizeDOMValue = function(newSanitizeDOMValue) {
+ sanitizeDOMValue = newSanitizeDOMValue;
+};
+
+/**
+ * Globally settable property to make Polymer Gestures use passive TouchEvent listeners when recognizing gestures.
+ * When set to `true`, gestures made from touch will not be able to prevent scrolling, allowing for smoother
+ * scrolling performance.
+ * Defaults to `false` for backwards compatibility.
+ */
+export let passiveTouchGestures = false;
+
+/**
+ * Sets `passiveTouchGestures` globally for all elements using Polymer Gestures.
+ *
+ * @param {boolean} usePassive enable or disable passive touch gestures globally
+ * @return {void}
+ */
+export const setPassiveTouchGestures = function(usePassive) {
+ passiveTouchGestures = usePassive;
+};
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/style-gather.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/style-gather.js
new file mode 100644
index 00000000000..5daadb16013
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/style-gather.js
@@ -0,0 +1,282 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { resolveCss } from './resolve-url.js';
+
+const MODULE_STYLE_LINK_SELECTOR = 'link[rel=import][type~=css]';
+const INCLUDE_ATTR = 'include';
+const SHADY_UNSCOPED_ATTR = 'shady-unscoped';
+
+function importModule(moduleId) {
+ const /** DomModule */ PolymerDomModule = customElements.get('dom-module');
+ if (!PolymerDomModule) {
+ return null;
+ }
+ return PolymerDomModule.import(moduleId);
+}
+
+function styleForImport(importDoc) {
+ // NOTE: polyfill affordance.
+ // under the HTMLImports polyfill, there will be no 'body',
+ // but the import pseudo-doc can be used directly.
+ let container = importDoc.body ? importDoc.body : importDoc;
+ const importCss = resolveCss(container.textContent,
+ importDoc.baseURI);
+ const style = document.createElement('style');
+ style.textContent = importCss;
+ return style;
+}
+
+/** @typedef {{assetpath: string}} */
+let templateWithAssetPath; // eslint-disable-line no-unused-vars
+
+/**
+ * Module with utilities for collection CSS text from `<templates>`, external
+ * stylesheets, and `dom-module`s.
+ *
+ * @summary Module with utilities for collection CSS text from various sources.
+ */
+`TODO(modulizer): A namespace named Polymer.StyleGather was
+declared here. The surrounding comments should be reviewed,
+and this string can then be deleted`;
+
+/**
+ * Returns a list of <style> elements in a space-separated list of `dom-module`s.
+ *
+ * @function
+ * @param {string} moduleIds List of dom-module id's within which to
+ * search for css.
+ * @return {!Array<!HTMLStyleElement>} Array of contained <style> elements
+ * @this {StyleGather}
+ */
+export function stylesFromModules(moduleIds) {
+ const modules = moduleIds.trim().split(/\s+/);
+ const styles = [];
+ for (let i=0; i < modules.length; i++) {
+ styles.push(...stylesFromModule(modules[i]));
+ }
+ return styles;
+}
+
+/**
+ * Returns a list of <style> elements in a given `dom-module`.
+ * Styles in a `dom-module` can come either from `<style>`s within the
+ * first `<template>`, or else from one or more
+ * `<link rel="import" type="css">` links outside the template.
+ *
+ * @param {string} moduleId dom-module id to gather styles from
+ * @return {!Array<!HTMLStyleElement>} Array of contained styles.
+ * @this {StyleGather}
+ */
+export function stylesFromModule(moduleId) {
+ const m = importModule(moduleId);
+
+ if (!m) {
+ console.warn('Could not find style data in module named', moduleId);
+ return [];
+ }
+
+ if (m._styles === undefined) {
+ const styles = [];
+ // module imports: <link rel="import" type="css">
+ styles.push(..._stylesFromModuleImports(m));
+ // include css from the first template in the module
+ const template = m.querySelector('template');
+ if (template) {
+ styles.push(...stylesFromTemplate(template,
+ /** @type {templateWithAssetPath} */(m).assetpath));
+ }
+
+ m._styles = styles;
+ }
+
+ return m._styles;
+}
+
+/**
+ * Returns the `<style>` elements within a given template.
+ *
+ * @param {!HTMLTemplateElement} template Template to gather styles from
+ * @param {string} baseURI baseURI for style content
+ * @return {!Array<!HTMLStyleElement>} Array of styles
+ * @this {StyleGather}
+ */
+export function stylesFromTemplate(template, baseURI) {
+ if (!template._styles) {
+ const styles = [];
+ // if element is a template, get content from its .content
+ const e$ = template.content.querySelectorAll('style');
+ for (let i=0; i < e$.length; i++) {
+ let e = e$[i];
+ // support style sharing by allowing styles to "include"
+ // other dom-modules that contain styling
+ let include = e.getAttribute(INCLUDE_ATTR);
+ if (include) {
+ styles.push(...stylesFromModules(include).filter(function(item, index, self) {
+ return self.indexOf(item) === index;
+ }));
+ }
+ if (baseURI) {
+ e.textContent = resolveCss(e.textContent, baseURI);
+ }
+ styles.push(e);
+ }
+ template._styles = styles;
+ }
+ return template._styles;
+}
+
+/**
+ * Returns a list of <style> elements from stylesheets loaded via `<link rel="import" type="css">` links within the specified `dom-module`.
+ *
+ * @param {string} moduleId Id of `dom-module` to gather CSS from
+ * @return {!Array<!HTMLStyleElement>} Array of contained styles.
+ * @this {StyleGather}
+ */
+export function stylesFromModuleImports(moduleId) {
+ let m = importModule(moduleId);
+ return m ? _stylesFromModuleImports(m) : [];
+}
+
+/**
+ * @this {StyleGather}
+ * @param {!HTMLElement} module dom-module element that could contain `<link rel="import" type="css">` styles
+ * @return {!Array<!HTMLStyleElement>} Array of contained styles
+ */
+function _stylesFromModuleImports(module) {
+ const styles = [];
+ const p$ = module.querySelectorAll(MODULE_STYLE_LINK_SELECTOR);
+ for (let i=0; i < p$.length; i++) {
+ let p = p$[i];
+ if (p.import) {
+ const importDoc = p.import;
+ const unscoped = p.hasAttribute(SHADY_UNSCOPED_ATTR);
+ if (unscoped && !importDoc._unscopedStyle) {
+ const style = styleForImport(importDoc);
+ style.setAttribute(SHADY_UNSCOPED_ATTR, '');
+ importDoc._unscopedStyle = style;
+ } else if (!importDoc._style) {
+ importDoc._style = styleForImport(importDoc);
+ }
+ styles.push(unscoped ? importDoc._unscopedStyle : importDoc._style);
+ }
+ }
+ return styles;
+}
+
+/**
+ *
+ * Returns CSS text of styles in a space-separated list of `dom-module`s.
+ * Note: This method is deprecated, use `stylesFromModules` instead.
+ *
+ * @deprecated
+ * @param {string} moduleIds List of dom-module id's within which to
+ * search for css.
+ * @return {string} Concatenated CSS content from specified `dom-module`s
+ * @this {StyleGather}
+ */
+export function cssFromModules(moduleIds) {
+ let modules = moduleIds.trim().split(/\s+/);
+ let cssText = '';
+ for (let i=0; i < modules.length; i++) {
+ cssText += cssFromModule(modules[i]);
+ }
+ return cssText;
+}
+
+/**
+ * Returns CSS text of styles in a given `dom-module`. CSS in a `dom-module`
+ * can come either from `<style>`s within the first `<template>`, or else
+ * from one or more `<link rel="import" type="css">` links outside the
+ * template.
+ *
+ * Any `<styles>` processed are removed from their original location.
+ * Note: This method is deprecated, use `styleFromModule` instead.
+ *
+ * @deprecated
+ * @param {string} moduleId dom-module id to gather styles from
+ * @return {string} Concatenated CSS content from specified `dom-module`
+ * @this {StyleGather}
+ */
+export function cssFromModule(moduleId) {
+ let m = importModule(moduleId);
+ if (m && m._cssText === undefined) {
+ // module imports: <link rel="import" type="css">
+ let cssText = _cssFromModuleImports(m);
+ // include css from the first template in the module
+ let t = m.querySelector('template');
+ if (t) {
+ cssText += cssFromTemplate(t,
+ /** @type {templateWithAssetPath} */(m).assetpath);
+ }
+ m._cssText = cssText || null;
+ }
+ if (!m) {
+ console.warn('Could not find style data in module named', moduleId);
+ }
+ return m && m._cssText || '';
+}
+
+/**
+ * Returns CSS text of `<styles>` within a given template.
+ *
+ * Any `<styles>` processed are removed from their original location.
+ * Note: This method is deprecated, use `styleFromTemplate` instead.
+ *
+ * @deprecated
+ * @param {!HTMLTemplateElement} template Template to gather styles from
+ * @param {string} baseURI Base URI to resolve the URL against
+ * @return {string} Concatenated CSS content from specified template
+ * @this {StyleGather}
+ */
+export function cssFromTemplate(template, baseURI) {
+ let cssText = '';
+ const e$ = stylesFromTemplate(template, baseURI);
+ // if element is a template, get content from its .content
+ for (let i=0; i < e$.length; i++) {
+ let e = e$[i];
+ if (e.parentNode) {
+ e.parentNode.removeChild(e);
+ }
+ cssText += e.textContent;
+ }
+ return cssText;
+}
+
+/**
+ * Returns CSS text from stylesheets loaded via `<link rel="import" type="css">`
+ * links within the specified `dom-module`.
+ *
+ * Note: This method is deprecated, use `stylesFromModuleImports` instead.
+ *
+ * @deprecated
+ *
+ * @param {string} moduleId Id of `dom-module` to gather CSS from
+ * @return {string} Concatenated CSS content from links in specified `dom-module`
+ * @this {StyleGather}
+ */
+export function cssFromModuleImports(moduleId) {
+ let m = importModule(moduleId);
+ return m ? _cssFromModuleImports(m) : '';
+}
+
+/**
+ * @deprecated
+ * @this {StyleGather}
+ * @param {!HTMLElement} module dom-module element that could contain `<link rel="import" type="css">` styles
+ * @return {string} Concatenated CSS content from links in the dom-module
+ */
+function _cssFromModuleImports(module) {
+ let cssText = '';
+ let styles = _stylesFromModuleImports(module);
+ for (let i=0; i < styles.length; i++) {
+ cssText += styles[i].textContent;
+ }
+ return cssText;
+}
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/templatize.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/templatize.js
new file mode 100644
index 00000000000..986a22334c3
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/templatize.js
@@ -0,0 +1,568 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+import { PropertyEffects } from '../mixins/property-effects.js';
+import { MutableData } from '../mixins/mutable-data.js';
+
+// Base class for HTMLTemplateElement extension that has property effects
+// machinery for propagating host properties to children. This is an ES5
+// class only because Babel (incorrectly) requires super() in the class
+// constructor even though no `this` is used and it returns an instance.
+let newInstance = null;
+/**
+ * @constructor
+ * @extends {HTMLTemplateElement}
+ */
+function HTMLTemplateElementExtension() { return newInstance; }
+HTMLTemplateElementExtension.prototype = Object.create(HTMLTemplateElement.prototype, {
+ constructor: {
+ value: HTMLTemplateElementExtension,
+ writable: true
+ }
+});
+/**
+ * @constructor
+ * @implements {Polymer_PropertyEffects}
+ * @extends {HTMLTemplateElementExtension}
+ */
+const DataTemplate = PropertyEffects(HTMLTemplateElementExtension);
+/**
+ * @constructor
+ * @implements {Polymer_MutableData}
+ * @extends {DataTemplate}
+ */
+const MutableDataTemplate = MutableData(DataTemplate);
+
+// Applies a DataTemplate subclass to a <template> instance
+function upgradeTemplate(template, constructor) {
+ newInstance = template;
+ Object.setPrototypeOf(template, constructor.prototype);
+ new constructor();
+ newInstance = null;
+}
+
+// Base class for TemplateInstance's
+/**
+ * @constructor
+ * @implements {Polymer_PropertyEffects}
+ */
+const base = PropertyEffects(class {});
+
+/**
+ * @polymer
+ * @customElement
+ * @appliesMixin PropertyEffects
+ * @unrestricted
+ */
+class TemplateInstanceBase extends base {
+ constructor(props) {
+ super();
+ this._configureProperties(props);
+ this.root = this._stampTemplate(this.__dataHost);
+ // Save list of stamped children
+ let children = this.children = [];
+ for (let n = this.root.firstChild; n; n=n.nextSibling) {
+ children.push(n);
+ n.__templatizeInstance = this;
+ }
+ if (this.__templatizeOwner &&
+ this.__templatizeOwner.__hideTemplateChildren__) {
+ this._showHideChildren(true);
+ }
+ // Flush props only when props are passed if instance props exist
+ // or when there isn't instance props.
+ let options = this.__templatizeOptions;
+ if ((props && options.instanceProps) || !options.instanceProps) {
+ this._enableProperties();
+ }
+ }
+ /**
+ * Configure the given `props` by calling `_setPendingProperty`. Also
+ * sets any properties stored in `__hostProps`.
+ * @private
+ * @param {Object} props Object of property name-value pairs to set.
+ * @return {void}
+ */
+ _configureProperties(props) {
+ let options = this.__templatizeOptions;
+ if (options.forwardHostProp) {
+ for (let hprop in this.__hostProps) {
+ this._setPendingProperty(hprop, this.__dataHost['_host_' + hprop]);
+ }
+ }
+ // Any instance props passed in the constructor will overwrite host props;
+ // normally this would be a user error but we don't specifically filter them
+ for (let iprop in props) {
+ this._setPendingProperty(iprop, props[iprop]);
+ }
+ }
+ /**
+ * Forwards a host property to this instance. This method should be
+ * called on instances from the `options.forwardHostProp` callback
+ * to propagate changes of host properties to each instance.
+ *
+ * Note this method enqueues the change, which are flushed as a batch.
+ *
+ * @param {string} prop Property or path name
+ * @param {*} value Value of the property to forward
+ * @return {void}
+ */
+ forwardHostProp(prop, value) {
+ if (this._setPendingPropertyOrPath(prop, value, false, true)) {
+ this.__dataHost._enqueueClient(this);
+ }
+ }
+
+ /**
+ * Override point for adding custom or simulated event handling.
+ *
+ * @param {!Node} node Node to add event listener to
+ * @param {string} eventName Name of event
+ * @param {function(!Event):void} handler Listener function to add
+ * @return {void}
+ */
+ _addEventListenerToNode(node, eventName, handler) {
+ if (this._methodHost && this.__templatizeOptions.parentModel) {
+ // If this instance should be considered a parent model, decorate
+ // events this template instance as `model`
+ this._methodHost._addEventListenerToNode(node, eventName, (e) => {
+ e.model = this;
+ handler(e);
+ });
+ } else {
+ // Otherwise delegate to the template's host (which could be)
+ // another template instance
+ let templateHost = this.__dataHost.__dataHost;
+ if (templateHost) {
+ templateHost._addEventListenerToNode(node, eventName, handler);
+ }
+ }
+ }
+ /**
+ * Shows or hides the template instance top level child elements. For
+ * text nodes, `textContent` is removed while "hidden" and replaced when
+ * "shown."
+ * @param {boolean} hide Set to true to hide the children;
+ * set to false to show them.
+ * @return {void}
+ * @protected
+ */
+ _showHideChildren(hide) {
+ let c = this.children;
+ for (let i=0; i<c.length; i++) {
+ let n = c[i];
+ // Ignore non-changes
+ if (Boolean(hide) != Boolean(n.__hideTemplateChildren__)) {
+ if (n.nodeType === Node.TEXT_NODE) {
+ if (hide) {
+ n.__polymerTextContent__ = n.textContent;
+ n.textContent = '';
+ } else {
+ n.textContent = n.__polymerTextContent__;
+ }
+ // remove and replace slot
+ } else if (n.localName === 'slot') {
+ if (hide) {
+ n.__polymerReplaced__ = document.createComment('hidden-slot');
+ n.parentNode.replaceChild(n.__polymerReplaced__, n);
+ } else {
+ const replace = n.__polymerReplaced__;
+ if (replace) {
+ replace.parentNode.replaceChild(n, replace);
+ }
+ }
+ }
+
+ else if (n.style) {
+ if (hide) {
+ n.__polymerDisplay__ = n.style.display;
+ n.style.display = 'none';
+ } else {
+ n.style.display = n.__polymerDisplay__;
+ }
+ }
+ }
+ n.__hideTemplateChildren__ = hide;
+ if (n._showHideChildren) {
+ n._showHideChildren(hide);
+ }
+ }
+ }
+ /**
+ * Overrides default property-effects implementation to intercept
+ * textContent bindings while children are "hidden" and cache in
+ * private storage for later retrieval.
+ *
+ * @param {!Node} node The node to set a property on
+ * @param {string} prop The property to set
+ * @param {*} value The value to set
+ * @return {void}
+ * @protected
+ */
+ _setUnmanagedPropertyToNode(node, prop, value) {
+ if (node.__hideTemplateChildren__ &&
+ node.nodeType == Node.TEXT_NODE && prop == 'textContent') {
+ node.__polymerTextContent__ = value;
+ } else {
+ super._setUnmanagedPropertyToNode(node, prop, value);
+ }
+ }
+ /**
+ * Find the parent model of this template instance. The parent model
+ * is either another templatize instance that had option `parentModel: true`,
+ * or else the host element.
+ *
+ * @return {!Polymer_PropertyEffects} The parent model of this instance
+ */
+ get parentModel() {
+ let model = this.__parentModel;
+ if (!model) {
+ let options;
+ model = this;
+ do {
+ // A template instance's `__dataHost` is a <template>
+ // `model.__dataHost.__dataHost` is the template's host
+ model = model.__dataHost.__dataHost;
+ } while ((options = model.__templatizeOptions) && !options.parentModel);
+ this.__parentModel = model;
+ }
+ return model;
+ }
+
+ /**
+ * Stub of HTMLElement's `dispatchEvent`, so that effects that may
+ * dispatch events safely no-op.
+ *
+ * @param {Event} event Event to dispatch
+ * @return {boolean} Always true.
+ */
+ dispatchEvent(event) { // eslint-disable-line no-unused-vars
+ return true;
+ }
+}
+
+/** @type {!DataTemplate} */
+TemplateInstanceBase.prototype.__dataHost;
+/** @type {!TemplatizeOptions} */
+TemplateInstanceBase.prototype.__templatizeOptions;
+/** @type {!Polymer_PropertyEffects} */
+TemplateInstanceBase.prototype._methodHost;
+/** @type {!Object} */
+TemplateInstanceBase.prototype.__templatizeOwner;
+/** @type {!Object} */
+TemplateInstanceBase.prototype.__hostProps;
+
+/**
+ * @constructor
+ * @extends {TemplateInstanceBase}
+ * @implements {Polymer_MutableData}
+ */
+const MutableTemplateInstanceBase = MutableData(TemplateInstanceBase);
+
+function findMethodHost(template) {
+ // Technically this should be the owner of the outermost template.
+ // In shadow dom, this is always getRootNode().host, but we can
+ // approximate this via cooperation with our dataHost always setting
+ // `_methodHost` as long as there were bindings (or id's) on this
+ // instance causing it to get a dataHost.
+ let templateHost = template.__dataHost;
+ return templateHost && templateHost._methodHost || templateHost;
+}
+
+/* eslint-disable valid-jsdoc */
+/**
+ * @suppress {missingProperties} class.prototype is not defined for some reason
+ */
+function createTemplatizerClass(template, templateInfo, options) {
+ // Anonymous class created by the templatize
+ let base = options.mutableData ?
+ MutableTemplateInstanceBase : TemplateInstanceBase;
+ /**
+ * @constructor
+ * @extends {base}
+ * @private
+ */
+ let klass = class extends base { };
+ klass.prototype.__templatizeOptions = options;
+ klass.prototype._bindTemplate(template);
+ addNotifyEffects(klass, template, templateInfo, options);
+ return klass;
+}
+
+/**
+ * @suppress {missingProperties} class.prototype is not defined for some reason
+ */
+function addPropagateEffects(template, templateInfo, options) {
+ let userForwardHostProp = options.forwardHostProp;
+ if (userForwardHostProp) {
+ // Provide data API and property effects on memoized template class
+ let klass = templateInfo.templatizeTemplateClass;
+ if (!klass) {
+ let base = options.mutableData ? MutableDataTemplate : DataTemplate;
+ klass = templateInfo.templatizeTemplateClass =
+ class TemplatizedTemplate extends base {};
+ // Add template - >instances effects
+ // and host <- template effects
+ let hostProps = templateInfo.hostProps;
+ for (let prop in hostProps) {
+ klass.prototype._addPropertyEffect('_host_' + prop,
+ klass.prototype.PROPERTY_EFFECT_TYPES.PROPAGATE,
+ {fn: createForwardHostPropEffect(prop, userForwardHostProp)});
+ klass.prototype._createNotifyingProperty('_host_' + prop);
+ }
+ }
+ upgradeTemplate(template, klass);
+ // Mix any pre-bound data into __data; no need to flush this to
+ // instances since they pull from the template at instance-time
+ if (template.__dataProto) {
+ // Note, generally `__dataProto` could be chained, but it's guaranteed
+ // to not be since this is a vanilla template we just added effects to
+ Object.assign(template.__data, template.__dataProto);
+ }
+ // Clear any pending data for performance
+ template.__dataTemp = {};
+ template.__dataPending = null;
+ template.__dataOld = null;
+ template._enableProperties();
+ }
+}
+/* eslint-enable valid-jsdoc */
+
+function createForwardHostPropEffect(hostProp, userForwardHostProp) {
+ return function forwardHostProp(template, prop, props) {
+ userForwardHostProp.call(template.__templatizeOwner,
+ prop.substring('_host_'.length), props[prop]);
+ };
+}
+
+function addNotifyEffects(klass, template, templateInfo, options) {
+ let hostProps = templateInfo.hostProps || {};
+ for (let iprop in options.instanceProps) {
+ delete hostProps[iprop];
+ let userNotifyInstanceProp = options.notifyInstanceProp;
+ if (userNotifyInstanceProp) {
+ klass.prototype._addPropertyEffect(iprop,
+ klass.prototype.PROPERTY_EFFECT_TYPES.NOTIFY,
+ {fn: createNotifyInstancePropEffect(iprop, userNotifyInstanceProp)});
+ }
+ }
+ if (options.forwardHostProp && template.__dataHost) {
+ for (let hprop in hostProps) {
+ klass.prototype._addPropertyEffect(hprop,
+ klass.prototype.PROPERTY_EFFECT_TYPES.NOTIFY,
+ {fn: createNotifyHostPropEffect()});
+ }
+ }
+}
+
+function createNotifyInstancePropEffect(instProp, userNotifyInstanceProp) {
+ return function notifyInstanceProp(inst, prop, props) {
+ userNotifyInstanceProp.call(inst.__templatizeOwner,
+ inst, prop, props[prop]);
+ };
+}
+
+function createNotifyHostPropEffect() {
+ return function notifyHostProp(inst, prop, props) {
+ inst.__dataHost._setPendingPropertyOrPath('_host_' + prop, props[prop], true, true);
+ };
+}
+
+/**
+ * Module for preparing and stamping instances of templates that utilize
+ * Polymer's data-binding and declarative event listener features.
+ *
+ * Example:
+ *
+ * // Get a template from somewhere, e.g. light DOM
+ * let template = this.querySelector('template');
+ * // Prepare the template
+ * let TemplateClass = Templatize.templatize(template);
+ * // Instance the template with an initial data model
+ * let instance = new TemplateClass({myProp: 'initial'});
+ * // Insert the instance's DOM somewhere, e.g. element's shadow DOM
+ * this.shadowRoot.appendChild(instance.root);
+ * // Changing a property on the instance will propagate to bindings
+ * // in the template
+ * instance.myProp = 'new value';
+ *
+ * The `options` dictionary passed to `templatize` allows for customizing
+ * features of the generated template class, including how outer-scope host
+ * properties should be forwarded into template instances, how any instance
+ * properties added into the template's scope should be notified out to
+ * the host, and whether the instance should be decorated as a "parent model"
+ * of any event handlers.
+ *
+ * // Customize property forwarding and event model decoration
+ * let TemplateClass = Templatize.templatize(template, this, {
+ * parentModel: true,
+ * forwardHostProp(property, value) {...},
+ * instanceProps: {...},
+ * notifyInstanceProp(instance, property, value) {...},
+ * });
+ *
+ * @summary Module for preparing and stamping instances of templates
+ * utilizing Polymer templating features.
+ */
+`TODO(modulizer): A namespace named Polymer.Templatize was
+declared here. The surrounding comments should be reviewed,
+and this string can then be deleted`;
+
+/**
+ * Returns an anonymous `PropertyEffects` class bound to the
+ * `<template>` provided. Instancing the class will result in the
+ * template being stamped into a document fragment stored as the instance's
+ * `root` property, after which it can be appended to the DOM.
+ *
+ * Templates may utilize all Polymer data-binding features as well as
+ * declarative event listeners. Event listeners and inline computing
+ * functions in the template will be called on the host of the template.
+ *
+ * The constructor returned takes a single argument dictionary of initial
+ * property values to propagate into template bindings. Additionally
+ * host properties can be forwarded in, and instance properties can be
+ * notified out by providing optional callbacks in the `options` dictionary.
+ *
+ * Valid configuration in `options` are as follows:
+ *
+ * - `forwardHostProp(property, value)`: Called when a property referenced
+ * in the template changed on the template's host. As this library does
+ * not retain references to templates instanced by the user, it is the
+ * templatize owner's responsibility to forward host property changes into
+ * user-stamped instances. The `instance.forwardHostProp(property, value)`
+ * method on the generated class should be called to forward host
+ * properties into the template to prevent unnecessary property-changed
+ * notifications. Any properties referenced in the template that are not
+ * defined in `instanceProps` will be notified up to the template's host
+ * automatically.
+ * - `instanceProps`: Dictionary of property names that will be added
+ * to the instance by the templatize owner. These properties shadow any
+ * host properties, and changes within the template to these properties
+ * will result in `notifyInstanceProp` being called.
+ * - `mutableData`: When `true`, the generated class will skip strict
+ * dirty-checking for objects and arrays (always consider them to be
+ * "dirty").
+ * - `notifyInstanceProp(instance, property, value)`: Called when
+ * an instance property changes. Users may choose to call `notifyPath`
+ * on e.g. the owner to notify the change.
+ * - `parentModel`: When `true`, events handled by declarative event listeners
+ * (`on-event="handler"`) will be decorated with a `model` property pointing
+ * to the template instance that stamped it. It will also be returned
+ * from `instance.parentModel` in cases where template instance nesting
+ * causes an inner model to shadow an outer model.
+ *
+ * All callbacks are called bound to the `owner`. Any context
+ * needed for the callbacks (such as references to `instances` stamped)
+ * should be stored on the `owner` such that they can be retrieved via
+ * `this`.
+ *
+ * When `options.forwardHostProp` is declared as an option, any properties
+ * referenced in the template will be automatically forwarded from the host of
+ * the `<template>` to instances, with the exception of any properties listed in
+ * the `options.instanceProps` object. `instanceProps` are assumed to be
+ * managed by the owner of the instances, either passed into the constructor
+ * or set after the fact. Note, any properties passed into the constructor will
+ * always be set to the instance (regardless of whether they would normally
+ * be forwarded from the host).
+ *
+ * Note that `templatize()` can be run only once for a given `<template>`.
+ * Further calls will result in an error. Also, there is a special
+ * behavior if the template was duplicated through a mechanism such as
+ * `<dom-repeat>` or `<test-fixture>`. In this case, all calls to
+ * `templatize()` return the same class for all duplicates of a template.
+ * The class returned from `templatize()` is generated only once using
+ * the `options` from the first call. This means that any `options`
+ * provided to subsequent calls will be ignored. Therefore, it is very
+ * important not to close over any variables inside the callbacks. Also,
+ * arrow functions must be avoided because they bind the outer `this`.
+ * Inside the callbacks, any contextual information can be accessed
+ * through `this`, which points to the `owner`.
+ *
+ * @param {!HTMLTemplateElement} template Template to templatize
+ * @param {Polymer_PropertyEffects=} owner Owner of the template instances;
+ * any optional callbacks will be bound to this owner.
+ * @param {Object=} options Options dictionary (see summary for details)
+ * @return {function(new:TemplateInstanceBase)} Generated class bound to the template
+ * provided
+ * @suppress {invalidCasts}
+ */
+export function templatize(template, owner, options) {
+ options = /** @type {!TemplatizeOptions} */(options || {});
+ if (template.__templatizeOwner) {
+ throw new Error('A <template> can only be templatized once');
+ }
+ template.__templatizeOwner = owner;
+ const ctor = owner ? owner.constructor : TemplateInstanceBase;
+ let templateInfo = ctor._parseTemplate(template);
+ // Get memoized base class for the prototypical template, which
+ // includes property effects for binding template & forwarding
+ let baseClass = templateInfo.templatizeInstanceClass;
+ if (!baseClass) {
+ baseClass = createTemplatizerClass(template, templateInfo, options);
+ templateInfo.templatizeInstanceClass = baseClass;
+ }
+ // Host property forwarding must be installed onto template instance
+ addPropagateEffects(template, templateInfo, options);
+ // Subclass base class and add reference for this specific template
+ /** @private */
+ let klass = class TemplateInstance extends baseClass {};
+ klass.prototype._methodHost = findMethodHost(template);
+ klass.prototype.__dataHost = template;
+ klass.prototype.__templatizeOwner = owner;
+ klass.prototype.__hostProps = templateInfo.hostProps;
+ klass = /** @type {function(new:TemplateInstanceBase)} */(klass); //eslint-disable-line no-self-assign
+ return klass;
+}
+
+/**
+ * Returns the template "model" associated with a given element, which
+ * serves as the binding scope for the template instance the element is
+ * contained in. A template model is an instance of
+ * `TemplateInstanceBase`, and should be used to manipulate data
+ * associated with this template instance.
+ *
+ * Example:
+ *
+ * let model = modelForElement(el);
+ * if (model.index < 10) {
+ * model.set('item.checked', true);
+ * }
+ *
+ * @param {HTMLTemplateElement} template The model will be returned for
+ * elements stamped from this template
+ * @param {Node=} node Node for which to return a template model.
+ * @return {TemplateInstanceBase} Template instance representing the
+ * binding scope for the element
+ */
+export function modelForElement(template, node) {
+ let model;
+ while (node) {
+ // An element with a __templatizeInstance marks the top boundary
+ // of a scope; walk up until we find one, and then ensure that
+ // its __dataHost matches `this`, meaning this dom-repeat stamped it
+ if ((model = node.__templatizeInstance)) {
+ // Found an element stamped by another template; keep walking up
+ // from its __dataHost
+ if (model.__dataHost != template) {
+ node = model.__dataHost;
+ } else {
+ return model;
+ }
+ } else {
+ // Still in a template scope, keep going up until
+ // a __templatizeInstance is found
+ node = node.parentNode;
+ }
+ }
+ return null;
+}
+
+export { TemplateInstanceBase };
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/unresolved.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/unresolved.js
new file mode 100644
index 00000000000..20ed6f87155
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/utils/unresolved.js
@@ -0,0 +1,19 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+function resolve() {
+ document.body.removeAttribute('unresolved');
+}
+
+if (document.readyState === 'interactive' || document.readyState === 'complete') {
+ resolve();
+} else {
+ window.addEventListener('DOMContentLoaded', resolve);
+}
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/manifest.json b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/manifest.json
new file mode 100644
index 00000000000..9aa1e1dd681
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/manifest.json
@@ -0,0 +1,765 @@
+{
+ "files": {
+ "polymer.html": {
+ "convertedUrl": "polymer-legacy.js",
+ "exports": {
+ "Polymer.Base": "Base",
+ "Polymer.html": "html"
+ }
+ },
+ "lib/legacy/legacy-element-mixin.html": {
+ "convertedUrl": "lib/legacy/legacy-element-mixin.js",
+ "exports": {
+ "Polymer.LegacyElementMixin": "LegacyElementMixin"
+ }
+ },
+ "lib/mixins/element-mixin.html": {
+ "convertedUrl": "lib/mixins/element-mixin.js",
+ "exports": {
+ "Polymer.ElementMixin": "ElementMixin",
+ "Polymer.telemetry.instanceCount": "instanceCount",
+ "Polymer.telemetry.registrations": "registrations",
+ "Polymer.telemetry._regLog": "_regLog",
+ "Polymer.telemetry.register": "register",
+ "Polymer.telemetry.dumpRegistrations": "dumpRegistrations",
+ "Polymer.telemetry": "*",
+ "Polymer.updateStyles": "updateStyles"
+ }
+ },
+ "lib/utils/boot.html": {
+ "convertedUrl": "lib/utils/boot.js",
+ "exports": {}
+ },
+ "lib/utils/settings.html": {
+ "convertedUrl": "lib/utils/settings.js",
+ "exports": {
+ "Polymer.Settings.useShadow": "useShadow",
+ "Polymer.Settings.useNativeCSSProperties": "useNativeCSSProperties",
+ "Polymer.Settings.useNativeCustomElements": "useNativeCustomElements",
+ "Polymer.rootPath": "rootPath",
+ "Polymer.setRootPath": "setRootPath",
+ "Polymer.sanitizeDOMValue": "sanitizeDOMValue",
+ "Polymer.setSanitizeDOMValue": "setSanitizeDOMValue",
+ "Polymer.passiveTouchGestures": "passiveTouchGestures",
+ "Polymer.setPassiveTouchGestures": "setPassiveTouchGestures"
+ }
+ },
+ "lib/utils/resolve-url.html": {
+ "convertedUrl": "lib/utils/resolve-url.js",
+ "exports": {
+ "Polymer.ResolveUrl.resolveCss": "resolveCss",
+ "Polymer.ResolveUrl.resolveUrl": "resolveUrl",
+ "Polymer.ResolveUrl.pathFromUrl": "pathFromUrl",
+ "Polymer.ResolveUrl": "*"
+ }
+ },
+ "lib/utils/mixin.html": {
+ "convertedUrl": "lib/utils/mixin.js",
+ "exports": {
+ "Polymer.dedupingMixin": "dedupingMixin"
+ }
+ },
+ "lib/utils/style-gather.html": {
+ "convertedUrl": "lib/utils/style-gather.js",
+ "exports": {
+ "Polymer.StyleGather.stylesFromModules": "stylesFromModules",
+ "Polymer.StyleGather.stylesFromModule": "stylesFromModule",
+ "Polymer.StyleGather.stylesFromTemplate": "stylesFromTemplate",
+ "Polymer.StyleGather.stylesFromModuleImports": "stylesFromModuleImports",
+ "Polymer.StyleGather._stylesFromModuleImports": "_stylesFromModuleImports",
+ "Polymer.StyleGather.cssFromModules": "cssFromModules",
+ "Polymer.StyleGather.cssFromModule": "cssFromModule",
+ "Polymer.StyleGather.cssFromTemplate": "cssFromTemplate",
+ "Polymer.StyleGather.cssFromModuleImports": "cssFromModuleImports",
+ "Polymer.StyleGather._cssFromModuleImports": "_cssFromModuleImports",
+ "Polymer.StyleGather": "*"
+ }
+ },
+ "lib/elements/dom-module.html": {
+ "convertedUrl": "lib/elements/dom-module.js",
+ "exports": {
+ "Polymer.DomModule": "DomModule"
+ }
+ },
+ "lib/mixins/property-effects.html": {
+ "convertedUrl": "lib/mixins/property-effects.js",
+ "exports": {
+ "Polymer.PropertyEffects": "PropertyEffects"
+ }
+ },
+ "lib/utils/path.html": {
+ "convertedUrl": "lib/utils/path.js",
+ "exports": {
+ "Path.isDeep": "isDeep",
+ "Polymer.Path.isPath": "isPath",
+ "Polymer.Path.root": "root",
+ "Polymer.Path.isAncestor": "isAncestor",
+ "Polymer.Path.isDescendant": "isDescendant",
+ "Polymer.Path.translate": "translate",
+ "Polymer.Path.matches": "matches",
+ "Polymer.Path.normalize": "normalize",
+ "Polymer.Path.split": "split",
+ "Polymer.Path.get": "get",
+ "Polymer.Path.set": "set",
+ "Polymer.Path": "*"
+ }
+ },
+ "lib/utils/case-map.html": {
+ "convertedUrl": "lib/utils/case-map.js",
+ "exports": {
+ "Polymer.CaseMap.dashToCamelCase": "dashToCamelCase",
+ "Polymer.CaseMap.camelToDashCase": "camelToDashCase",
+ "Polymer.CaseMap": "*"
+ }
+ },
+ "lib/mixins/property-accessors.html": {
+ "convertedUrl": "lib/mixins/property-accessors.js",
+ "exports": {
+ "Polymer.PropertyAccessors": "PropertyAccessors"
+ }
+ },
+ "lib/mixins/properties-changed.html": {
+ "convertedUrl": "lib/mixins/properties-changed.js",
+ "exports": {
+ "Polymer.PropertiesChanged": "PropertiesChanged"
+ }
+ },
+ "lib/utils/async.html": {
+ "convertedUrl": "lib/utils/async.js",
+ "exports": {
+ "Polymer.Async.timeOut": "timeOut",
+ "Polymer.Async.animationFrame": "animationFrame",
+ "Polymer.Async.idlePeriod": "idlePeriod",
+ "Polymer.Async.microTask": "microTask",
+ "Polymer.Async": "*"
+ }
+ },
+ "lib/mixins/template-stamp.html": {
+ "convertedUrl": "lib/mixins/template-stamp.js",
+ "exports": {
+ "Polymer.TemplateStamp": "TemplateStamp"
+ }
+ },
+ "lib/mixins/properties-mixin.html": {
+ "convertedUrl": "lib/mixins/properties-mixin.js",
+ "exports": {
+ "Polymer.PropertiesMixin": "PropertiesMixin"
+ }
+ },
+ "lib/mixins/gesture-event-listeners.html": {
+ "convertedUrl": "lib/mixins/gesture-event-listeners.js",
+ "exports": {
+ "Polymer.GestureEventListeners": "GestureEventListeners"
+ }
+ },
+ "lib/utils/gestures.html": {
+ "convertedUrl": "lib/utils/gestures.js",
+ "exports": {
+ "Gestures.findOriginalTarget": "findOriginalTarget",
+ "Gestures.add": "add",
+ "Gestures.remove": "remove",
+ "Polymer.Gestures.gestures": "gestures",
+ "Polymer.Gestures.recognizers": "recognizers",
+ "Polymer.Gestures.deepTargetFind": "deepTargetFind",
+ "Polymer.Gestures._findOriginalTarget": "_findOriginalTarget",
+ "Polymer.Gestures._handleNative": "_handleNative",
+ "Polymer.Gestures._handleTouchAction": "_handleTouchAction",
+ "Polymer.Gestures.addListener": "addListener",
+ "Polymer.Gestures.removeListener": "removeListener",
+ "Polymer.Gestures._add": "_add",
+ "Polymer.Gestures._remove": "_remove",
+ "Polymer.Gestures.register": "register",
+ "Polymer.Gestures._findRecognizerByEvent": "_findRecognizerByEvent",
+ "Polymer.Gestures.setTouchAction": "setTouchAction",
+ "Polymer.Gestures._fire": "_fire",
+ "Polymer.Gestures.prevent": "prevent",
+ "Polymer.Gestures.resetMouseCanceller": "resetMouseCanceller",
+ "Polymer.Gestures": "*"
+ }
+ },
+ "lib/utils/debounce.html": {
+ "convertedUrl": "lib/utils/debounce.js",
+ "exports": {
+ "Polymer.Debouncer": "Debouncer"
+ }
+ },
+ "lib/mixins/dir-mixin.html": {
+ "convertedUrl": "lib/mixins/dir-mixin.js",
+ "exports": {
+ "Polymer.DirMixin": "DirMixin"
+ }
+ },
+ "lib/utils/render-status.html": {
+ "convertedUrl": "lib/utils/render-status.js",
+ "exports": {
+ "Polymer.RenderStatus.beforeNextRender": "beforeNextRender",
+ "Polymer.RenderStatus.afterNextRender": "afterNextRender",
+ "Polymer.RenderStatus.flush": "flush",
+ "Polymer.RenderStatus": "*"
+ }
+ },
+ "lib/utils/unresolved.html": {
+ "convertedUrl": "lib/utils/unresolved.js",
+ "exports": {}
+ },
+ "lib/legacy/polymer.dom.html": {
+ "convertedUrl": "lib/legacy/polymer.dom.js",
+ "exports": {
+ "Polymer.DomApi": "DomApi",
+ "Polymer.dom": "dom",
+ "Polymer.dom.matchesSelector": "matchesSelector",
+ "Polymer.dom.flush": "flush",
+ "Polymer.dom.addDebouncer": "addDebouncer"
+ }
+ },
+ "lib/utils/flattened-nodes-observer.html": {
+ "convertedUrl": "lib/utils/flattened-nodes-observer.js",
+ "exports": {
+ "Polymer.FlattenedNodesObserver": "FlattenedNodesObserver"
+ }
+ },
+ "lib/utils/array-splice.html": {
+ "convertedUrl": "lib/utils/array-splice.js",
+ "exports": {
+ "Polymer.ArraySplice.calculateSplices": "calculateSplices",
+ "Polymer.ArraySplice": "*"
+ }
+ },
+ "lib/utils/flush.html": {
+ "convertedUrl": "lib/utils/flush.js",
+ "exports": {
+ "Polymer.enqueueDebouncer": "enqueueDebouncer",
+ "Polymer.flush": "flush"
+ }
+ },
+ "lib/legacy/polymer-fn.html": {
+ "convertedUrl": "lib/legacy/polymer-fn.js",
+ "exports": {
+ "Polymer": "Polymer"
+ }
+ },
+ "lib/legacy/class.html": {
+ "convertedUrl": "lib/legacy/class.js",
+ "exports": {
+ "Polymer.Class": "Class",
+ "Polymer.mixinBehaviors": "mixinBehaviors"
+ }
+ },
+ "lib/legacy/templatizer-behavior.html": {
+ "convertedUrl": "lib/legacy/templatizer-behavior.js",
+ "exports": {
+ "Polymer.Templatizer": "Templatizer"
+ }
+ },
+ "lib/utils/templatize.html": {
+ "convertedUrl": "lib/utils/templatize.js",
+ "exports": {
+ "Polymer.Templatize.templatize": "templatize",
+ "Polymer.Templatize.modelForElement": "modelForElement",
+ "Polymer.Templatize": "*",
+ "Polymer.TemplateInstanceBase": "TemplateInstanceBase"
+ }
+ },
+ "lib/mixins/mutable-data.html": {
+ "convertedUrl": "lib/mixins/mutable-data.js",
+ "exports": {
+ "Polymer.MutableData": "MutableData",
+ "Polymer.OptionalMutableData": "OptionalMutableData"
+ }
+ },
+ "lib/elements/dom-bind.html": {
+ "convertedUrl": "lib/elements/dom-bind.js",
+ "exports": {
+ "Polymer.DomBind": "DomBind"
+ }
+ },
+ "lib/elements/dom-repeat.html": {
+ "convertedUrl": "lib/elements/dom-repeat.js",
+ "exports": {
+ "Polymer.DomRepeat": "DomRepeat"
+ }
+ },
+ "polymer-element.html": {
+ "convertedUrl": "polymer-element.js",
+ "exports": {
+ "Polymer.Element": "PolymerElement",
+ "Polymer.html": "html"
+ }
+ },
+ "lib/utils/html-tag.html": {
+ "convertedUrl": "lib/utils/html-tag.js",
+ "exports": {
+ "Polymer.html": "html",
+ "Polymer.htmlLiteral": "htmlLiteral"
+ }
+ },
+ "lib/elements/dom-if.html": {
+ "convertedUrl": "lib/elements/dom-if.js",
+ "exports": {
+ "Polymer.DomIf": "DomIf"
+ }
+ },
+ "lib/elements/array-selector.html": {
+ "convertedUrl": "lib/elements/array-selector.js",
+ "exports": {
+ "Polymer.ArraySelectorMixin": "ArraySelectorMixin",
+ "Polymer.ArraySelector": "ArraySelector"
+ }
+ },
+ "lib/elements/custom-style.html": {
+ "convertedUrl": "lib/elements/custom-style.js",
+ "exports": {
+ "Polymer.CustomStyle": "CustomStyle"
+ }
+ },
+ "lib/legacy/mutable-data-behavior.html": {
+ "convertedUrl": "lib/legacy/mutable-data-behavior.js",
+ "exports": {
+ "Polymer.MutableDataBehavior": "MutableDataBehavior",
+ "Polymer.OptionalMutableDataBehavior": "OptionalMutableDataBehavior"
+ }
+ },
+ "index.html": {
+ "convertedUrl": "index.html",
+ "exports": {}
+ },
+ "externs/polymer-internal-types.html": {
+ "convertedUrl": "externs/polymer-internal-types.html",
+ "exports": {}
+ },
+ "test/runner.html": {
+ "convertedUrl": "test/runner.html",
+ "exports": {}
+ },
+ "test/smoke/alacarte-property-accessors.html": {
+ "convertedUrl": "test/smoke/alacarte-property-accessors.html",
+ "exports": {}
+ },
+ "test/smoke/alacarte-property-effects-ordering.html": {
+ "convertedUrl": "test/smoke/alacarte-property-effects-ordering.html",
+ "exports": {}
+ },
+ "test/smoke/alacarte-property-effects.html": {
+ "convertedUrl": "test/smoke/alacarte-property-effects.html",
+ "exports": {}
+ },
+ "test/smoke/alacarte-template-stamp.html": {
+ "convertedUrl": "test/smoke/alacarte-template-stamp.html",
+ "exports": {}
+ },
+ "test/smoke/behavior-mixin.html": {
+ "convertedUrl": "test/smoke/behavior-mixin.html",
+ "exports": {}
+ },
+ "test/smoke/data-table.html": {
+ "convertedUrl": "test/smoke/data-table.html",
+ "exports": {}
+ },
+ "test/smoke/dirty-check.html": {
+ "convertedUrl": "test/smoke/dirty-check.html",
+ "exports": {}
+ },
+ "test/smoke/disable-upgrade.html": {
+ "convertedUrl": "test/smoke/disable-upgrade.html",
+ "exports": {}
+ },
+ "lib/mixins/disable-upgrade-mixin.html": {
+ "convertedUrl": "lib/mixins/disable-upgrade-mixin.js",
+ "exports": {
+ "Polymer.DisableUpgradeMixin": "DisableUpgradeMixin"
+ }
+ },
+ "test/smoke/disabled-attr-gestures.html": {
+ "convertedUrl": "test/smoke/disabled-attr-gestures.html",
+ "exports": {}
+ },
+ "test/smoke/dom-if.html": {
+ "convertedUrl": "test/smoke/dom-if.html",
+ "exports": {}
+ },
+ "test/smoke/gestures.html": {
+ "convertedUrl": "test/smoke/gestures.html",
+ "exports": {}
+ },
+ "test/smoke/html-tag.html": {
+ "convertedUrl": "test/smoke/html-tag.html",
+ "exports": {}
+ },
+ "test/smoke/label-click.html": {
+ "convertedUrl": "test/smoke/label-click.html",
+ "exports": {}
+ },
+ "test/smoke/ordering-test.html": {
+ "convertedUrl": "test/smoke/ordering-test.html",
+ "exports": {}
+ },
+ "test/smoke/passive-gestures.html": {
+ "convertedUrl": "test/smoke/passive-gestures.html",
+ "exports": {}
+ },
+ "test/smoke/style-props/test.html": {
+ "convertedUrl": "test/smoke/style-props/test.html",
+ "exports": {}
+ },
+ "test/smoke/style-props/src/scopes.html": {
+ "convertedUrl": "test/smoke/style-props/src/scopes.js",
+ "exports": {}
+ },
+ "test/smoke/style-props/src/settings.html": {
+ "convertedUrl": "test/smoke/style-props/src/settings.js",
+ "exports": {}
+ },
+ "test/smoke/style-props/src/elements.html": {
+ "convertedUrl": "test/smoke/style-props/src/elements.js",
+ "exports": {}
+ },
+ "test/smoke/style-props/src/elements-defaults.html": {
+ "convertedUrl": "test/smoke/style-props/src/elements-defaults.js",
+ "exports": {}
+ },
+ "test/unit/array-selector.html": {
+ "convertedUrl": "test/unit/array-selector.html",
+ "exports": {}
+ },
+ "test/unit/array-selector-elements.html": {
+ "convertedUrl": "test/unit/array-selector-elements.js",
+ "exports": {}
+ },
+ "test/unit/async.html": {
+ "convertedUrl": "test/unit/async.html",
+ "exports": {}
+ },
+ "test/unit/attributes.html": {
+ "convertedUrl": "test/unit/attributes.html",
+ "exports": {}
+ },
+ "test/unit/attributes-elements.html": {
+ "convertedUrl": "test/unit/attributes-elements.js",
+ "exports": {}
+ },
+ "test/unit/behaviors.html": {
+ "convertedUrl": "test/unit/behaviors.html",
+ "exports": {}
+ },
+ "test/unit/case-map.html": {
+ "convertedUrl": "test/unit/case-map.html",
+ "exports": {}
+ },
+ "test/unit/configure.html": {
+ "convertedUrl": "test/unit/configure.html",
+ "exports": {}
+ },
+ "test/unit/css-parse.html": {
+ "convertedUrl": "test/unit/css-parse.html",
+ "exports": {}
+ },
+ "test/unit/custom-style-async-import.html": {
+ "convertedUrl": "test/unit/custom-style-async-import.html",
+ "exports": {}
+ },
+ "test/unit/custom-style-async.html": {
+ "convertedUrl": "test/unit/custom-style-async.html",
+ "exports": {}
+ },
+ "test/unit/custom-style-late.html": {
+ "convertedUrl": "test/unit/custom-style-late.html",
+ "exports": {}
+ },
+ "test/unit/custom-style-scope-cache.html": {
+ "convertedUrl": "test/unit/custom-style-scope-cache.html",
+ "exports": {}
+ },
+ "test/unit/custom-style.html": {
+ "convertedUrl": "test/unit/custom-style.html",
+ "exports": {}
+ },
+ "test/unit/custom-style-import.html": {
+ "convertedUrl": "test/unit/custom-style-import.js",
+ "exports": {}
+ },
+ "test/unit/sub/style-import.html": {
+ "convertedUrl": "test/unit/sub/style-import.js",
+ "exports": {}
+ },
+ "test/unit/debounce.html": {
+ "convertedUrl": "test/unit/debounce.html",
+ "exports": {}
+ },
+ "test/unit/dir.html": {
+ "convertedUrl": "test/unit/dir.html",
+ "exports": {}
+ },
+ "test/unit/disable-upgrade.html": {
+ "convertedUrl": "test/unit/disable-upgrade.html",
+ "exports": {}
+ },
+ "test/unit/dom-bind.html": {
+ "convertedUrl": "test/unit/dom-bind.html",
+ "exports": {}
+ },
+ "test/unit/dom-bind-elements1.html": {
+ "convertedUrl": "test/unit/dom-bind-elements1.js",
+ "exports": {}
+ },
+ "test/unit/dom-bind-elements2.html": {
+ "convertedUrl": "test/unit/dom-bind-elements2.js",
+ "exports": {}
+ },
+ "test/unit/dom-if.html": {
+ "convertedUrl": "test/unit/dom-if.html",
+ "exports": {}
+ },
+ "test/unit/dom-if-elements.html": {
+ "convertedUrl": "test/unit/dom-if-elements.js",
+ "exports": {}
+ },
+ "test/unit/dom-repeat.html": {
+ "convertedUrl": "test/unit/dom-repeat.html",
+ "exports": {}
+ },
+ "test/unit/dom-repeat-elements.html": {
+ "convertedUrl": "test/unit/dom-repeat-elements.js",
+ "exports": {}
+ },
+ "test/unit/dynamic-import.html": {
+ "convertedUrl": "test/unit/dynamic-import.html",
+ "exports": {}
+ },
+ "test/unit/dynamic-imports/dynamic-element.html": {
+ "convertedUrl": "test/unit/dynamic-imports/dynamic-element.js",
+ "exports": {}
+ },
+ "test/unit/events.html": {
+ "convertedUrl": "test/unit/events.html",
+ "exports": {}
+ },
+ "test/unit/events-elements.html": {
+ "convertedUrl": "test/unit/events-elements.js",
+ "exports": {}
+ },
+ "test/unit/flattened-nodes-observer.html": {
+ "convertedUrl": "test/unit/flattened-nodes-observer.html",
+ "exports": {}
+ },
+ "test/unit/gestures.html": {
+ "convertedUrl": "test/unit/gestures.html",
+ "exports": {}
+ },
+ "test/unit/gestures-elements.html": {
+ "convertedUrl": "test/unit/gestures-elements.js",
+ "exports": {}
+ },
+ "test/unit/globals.html": {
+ "convertedUrl": "test/unit/globals.html",
+ "exports": {}
+ },
+ "test/unit/html-tag.html": {
+ "convertedUrl": "test/unit/html-tag.html",
+ "exports": {}
+ },
+ "test/unit/importHref.html": {
+ "convertedUrl": "test/unit/importHref.html",
+ "exports": {}
+ },
+ "test/unit/inheritance.html": {
+ "convertedUrl": "test/unit/inheritance.html",
+ "exports": {}
+ },
+ "test/unit/logging.html": {
+ "convertedUrl": "test/unit/logging.html",
+ "exports": {}
+ },
+ "test/unit/mixin-behaviors.html": {
+ "convertedUrl": "test/unit/mixin-behaviors.html",
+ "exports": {}
+ },
+ "test/unit/mixin-utils.html": {
+ "convertedUrl": "test/unit/mixin-utils.html",
+ "exports": {}
+ },
+ "test/unit/multi-style.html": {
+ "convertedUrl": "test/unit/multi-style.html",
+ "exports": {}
+ },
+ "test/unit/path-effects.html": {
+ "convertedUrl": "test/unit/path-effects.html",
+ "exports": {}
+ },
+ "test/unit/path-effects-elements.html": {
+ "convertedUrl": "test/unit/path-effects-elements.js",
+ "exports": {}
+ },
+ "test/unit/path.html": {
+ "convertedUrl": "test/unit/path.html",
+ "exports": {}
+ },
+ "test/unit/polymer-dom-observeNodes.html": {
+ "convertedUrl": "test/unit/polymer-dom-observeNodes.html",
+ "exports": {}
+ },
+ "test/unit/polymer-dom.html": {
+ "convertedUrl": "test/unit/polymer-dom.html",
+ "exports": {}
+ },
+ "test/unit/polymer-element-with-apply.html": {
+ "convertedUrl": "test/unit/polymer-element-with-apply.html",
+ "exports": {}
+ },
+ "test/unit/polymer-element-with-apply-import.html": {
+ "convertedUrl": "test/unit/polymer-element-with-apply-import.js",
+ "exports": {}
+ },
+ "test/unit/polymer.element.html": {
+ "convertedUrl": "test/unit/polymer.element.html",
+ "exports": {}
+ },
+ "test/unit/polymer.legacyelement.html": {
+ "convertedUrl": "test/unit/polymer.legacyelement.html",
+ "exports": {}
+ },
+ "test/unit/polymer.properties-mixin-with-property-accessors.html": {
+ "convertedUrl": "test/unit/polymer.properties-mixin-with-property-accessors.html",
+ "exports": {}
+ },
+ "test/unit/polymer.properties-mixin.html": {
+ "convertedUrl": "test/unit/polymer.properties-mixin.html",
+ "exports": {}
+ },
+ "test/unit/properties-changed.html": {
+ "convertedUrl": "test/unit/properties-changed.html",
+ "exports": {}
+ },
+ "test/unit/property-accessors.html": {
+ "convertedUrl": "test/unit/property-accessors.html",
+ "exports": {}
+ },
+ "test/unit/property-effects-template.html": {
+ "convertedUrl": "test/unit/property-effects-template.html",
+ "exports": {}
+ },
+ "test/unit/property-effects.html": {
+ "convertedUrl": "test/unit/property-effects.html",
+ "exports": {}
+ },
+ "test/unit/property-effects-elements.html": {
+ "convertedUrl": "test/unit/property-effects-elements.js",
+ "exports": {}
+ },
+ "test/unit/ready-attached-order-class.html": {
+ "convertedUrl": "test/unit/ready-attached-order-class.html",
+ "exports": {}
+ },
+ "test/unit/ready-attached-order.html": {
+ "convertedUrl": "test/unit/ready-attached-order.html",
+ "exports": {}
+ },
+ "test/unit/render-status.html": {
+ "convertedUrl": "test/unit/render-status.html",
+ "exports": {}
+ },
+ "test/unit/resolveurl.html": {
+ "convertedUrl": "test/unit/resolveurl.html",
+ "exports": {}
+ },
+ "test/unit/sub/resolveurl-elements.html": {
+ "convertedUrl": "test/unit/sub/resolveurl-elements.js",
+ "exports": {}
+ },
+ "test/unit/shady-content.html": {
+ "convertedUrl": "test/unit/shady-content.html",
+ "exports": {}
+ },
+ "test/unit/shady-dynamic.html": {
+ "convertedUrl": "test/unit/shady-dynamic.html",
+ "exports": {}
+ },
+ "test/unit/shady-events.html": {
+ "convertedUrl": "test/unit/shady-events.html",
+ "exports": {}
+ },
+ "test/unit/shady-unscoped-style.html": {
+ "convertedUrl": "test/unit/shady-unscoped-style.html",
+ "exports": {}
+ },
+ "test/unit/shady-unscoped-style-import.html": {
+ "convertedUrl": "test/unit/shady-unscoped-style-import.js",
+ "exports": {}
+ },
+ "test/unit/shady-unscoped-style-import-css.html": {
+ "convertedUrl": "test/unit/shady-unscoped-style-import-css.js",
+ "exports": {}
+ },
+ "test/unit/shady.html": {
+ "convertedUrl": "test/unit/shady.html",
+ "exports": {}
+ },
+ "test/unit/styling-cross-scope-apply.html": {
+ "convertedUrl": "test/unit/styling-cross-scope-apply.html",
+ "exports": {}
+ },
+ "test/unit/styling-cross-scope-unknown-host.html": {
+ "convertedUrl": "test/unit/styling-cross-scope-unknown-host.html",
+ "exports": {}
+ },
+ "test/unit/styling-cross-scope-var.html": {
+ "convertedUrl": "test/unit/styling-cross-scope-var.html",
+ "exports": {}
+ },
+ "test/unit/styling-import.html": {
+ "convertedUrl": "test/unit/styling-import.html",
+ "exports": {}
+ },
+ "test/unit/styling-import-shared-styles.html": {
+ "convertedUrl": "test/unit/styling-import-shared-styles.js",
+ "exports": {}
+ },
+ "test/unit/styling-only-with-template.html": {
+ "convertedUrl": "test/unit/styling-only-with-template.html",
+ "exports": {}
+ },
+ "test/unit/styling-scoped.html": {
+ "convertedUrl": "test/unit/styling-scoped.html",
+ "exports": {}
+ },
+ "test/unit/template-stamp.html": {
+ "convertedUrl": "test/unit/template-stamp.html",
+ "exports": {}
+ },
+ "test/unit/template-whitespace.html": {
+ "convertedUrl": "test/unit/template-whitespace.html",
+ "exports": {}
+ },
+ "test/unit/templatize.html": {
+ "convertedUrl": "test/unit/templatize.html",
+ "exports": {}
+ },
+ "test/unit/templatize-elements.html": {
+ "convertedUrl": "test/unit/templatize-elements.js",
+ "exports": {}
+ },
+ "test/unit/dynamic-imports/async-import.html": {
+ "convertedUrl": "test/unit/dynamic-imports/async-import.html",
+ "exports": {}
+ },
+ "test/unit/dynamic-imports/async.html": {
+ "convertedUrl": "test/unit/dynamic-imports/async.html",
+ "exports": {}
+ },
+ "test/unit/dynamic-imports/outer-element.html": {
+ "convertedUrl": "test/unit/dynamic-imports/outer-element.html",
+ "exports": {}
+ },
+ "test/unit/dynamic-imports/inner-element.html": {
+ "convertedUrl": "test/unit/dynamic-imports/inner-element.js",
+ "exports": {}
+ },
+ "test/unit/sub/x-sub.html": {
+ "convertedUrl": "test/unit/sub/x-sub.html",
+ "exports": {}
+ },
+ "test/unit/sub/x-test.html": {
+ "convertedUrl": "test/unit/sub/x-test.html",
+ "exports": {}
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/package-lock.json b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/package-lock.json
new file mode 100644
index 00000000000..3a4c3b70275
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/package-lock.json
@@ -0,0 +1,28382 @@
+{
+ "name": "@polymer/polymer",
+ "version": "3.0.2",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@polymer/app-layout": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/app-layout/-/app-layout-3.0.0-pre.12.tgz",
+ "integrity": "sha512-7CIwcse7gXp33WKchW8tqjxhqBL2hZmE/kfQhafA4d7P6iRfDmXAV0JLrh4QFriKQMQnxZp7NG4ZsFE0JQqPJg==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-flex-layout": "3.0.0-pre.12",
+ "@polymer/iron-media-query": "3.0.0-pre.12",
+ "@polymer/iron-resizable-behavior": "3.0.0-pre.12",
+ "@polymer/iron-scroll-target-behavior": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/font-roboto": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/font-roboto/-/font-roboto-3.0.0-pre.12.tgz",
+ "integrity": "sha512-D4inM9qe6YgtWLcB3yd7K4yuUjXfc1HqkoTUaLoatMYNFhVfZu60bOvvDEa0jdPFXEq1QmqKjzEJZ6qaX6vHqA==",
+ "dev": true
+ },
+ "@polymer/gen-closure-declarations": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-closure-declarations/-/gen-closure-declarations-0.4.0.tgz",
+ "integrity": "sha512-gRDYxL/2nko1dJDIS+l+nc7BBzIz4x5LF+X+fskXcoiH+2A4PdCBeQXbCSpq9Dne5iig6MIr7GaK+Z3Y+5STCA==",
+ "dev": true,
+ "requires": {
+ "escodegen": "1.9.1",
+ "polymer-analyzer": "2.7.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.2",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.107",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.46",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.1",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.8",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.1"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ }
+ }
+ }
+ }
+ },
+ "@polymer/iron-a11y-announcer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-a11y-announcer/-/iron-a11y-announcer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-s/ZU02aYqkvNhZ8vCN2GJvk6KZYYLB38pFaoP3y005FddOiLb+TlXUDGpGhfO6iDo9D8zO5jn+o92jJtJ9Gg6g==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz",
+ "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4="
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ }
+ }
+ },
+ "@polymer/iron-a11y-keys-behavior": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-a11y-keys-behavior/-/iron-a11y-keys-behavior-3.0.0-pre.12.tgz",
+ "integrity": "sha512-QLnvWTDYlObHeWvflWFDlSaEljZopYT8/D3XCaWtN6cSgsdnHe6uoV+W95YgAP+w9KM13vZZEpa4zJjmlAYrFA==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-ajax": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-ajax/-/iron-ajax-3.0.0-pre.12.tgz",
+ "integrity": "sha512-lUZrNm2pJthanU2DifTfeve27n2DoioVu+sR07j2TVEyhOB2n9Wom2HaXSNd/7gvWjDqZi54OJFEjxaH/mmraA==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-behaviors": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-behaviors/-/iron-behaviors-3.0.0-pre.12.tgz",
+ "integrity": "sha512-ros9dbO52jmV+henJxEXvoOx1tzX6i70aIOTgI92ebInPmyvtx5WeX1QXzUUMnUi4hKYLFZWqubgVQ4Hyu+pGw==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-a11y-keys-behavior": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-checked-element-behavior": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-checked-element-behavior/-/iron-checked-element-behavior-3.0.0-pre.12.tgz",
+ "integrity": "sha512-pCzvDOxEBybdMbtKIaAxcE/jBU+BISsVc552i9EOMqtBBPap5CFgtg1s9IC4jhEN+1Hw8xY3rQcHu1b7BFV9ow==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-form-element-behavior": "3.0.0-pre.12",
+ "@polymer/iron-validatable-behavior": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.35.tgz",
+ "integrity": "sha512-l0SE8cl9DUIY4hYAFAKTLX3F2Yr14Qri7uTsuI7iegB5E4KyQy4XY72L3VOxmj6kwR/RDQURoKYr2NzyETGo7A==",
+ "requires": {
+ "chalk": "2.4.1",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.35.tgz",
+ "integrity": "sha512-+216NxQ7/Lvj+iehFBKEhYU/BQ1aqHTWz1bxCDiQWms0qi23iqHA4r+WdRKW/o5dAV5mlTUL4nCBFaNx8LNnRQ==",
+ "requires": {
+ "@babel/helper-get-function-arity": "7.0.0-beta.35",
+ "@babel/template": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.35.tgz",
+ "integrity": "sha512-8co9nT1MgbNoGl6too2/jwldu5F7O1rMi+/QsM9bmFuCu76rU5okFWi4cb4Uv0WXZ4BWk6x+Lpdzzu7EgvkAwA==",
+ "requires": {
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/template": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.35.tgz",
+ "integrity": "sha512-NLd3Dfs8hmkxPvaD8ohNtEp9WXp48lxpW//6fXcT9bJWIO3isrH3OTYL9kjX7xFPPasJ1E9bUNSaPFUUgvPZSQ==",
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35",
+ "babylon": "7.0.0-beta.35",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/types": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.35.tgz",
+ "integrity": "sha512-y9XT11CozHDgjWcTdxmhSj13rJVXpa5ZXwjjOiTedjaM0ba5ItqdS02t31EhPl7HtOWxsZkYCCUNrSfrOisA6w==",
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "2.0.0"
+ }
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.35.tgz",
+ "integrity": "sha512-Y2o5scalPPlI6eOYMat6iqoM8akjqkAv9cXUN/7YNe3FANAsAGcF5L2u6XiUtBECvhyf7LeZYyzNYnjk43Vffg=="
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+ }
+ }
+ },
+ "@polymer/iron-component-page": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-component-page/-/iron-component-page-3.0.0-pre.12.tgz",
+ "integrity": "sha512-Or8NsZ1o1aCgT6Ae6g9eyeSiWrRanjeJOPJYFJFgZRXnfbfDT55+6Dn+q0i8i1kGo8+Nd6488bxQQkVZFDwNsw==",
+ "dev": true,
+ "requires": {
+ "@polymer/app-layout": "3.0.0-pre.12",
+ "@polymer/iron-ajax": "3.0.0-pre.12",
+ "@polymer/iron-doc-viewer": "3.0.0-pre.12",
+ "@polymer/iron-icons": "3.0.0-pre.12",
+ "@polymer/paper-icon-button": "3.0.0-pre.12",
+ "@polymer/paper-styles": "3.0.0-pre.12",
+ "@polymer/paper-toast": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-doc-viewer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-doc-viewer/-/iron-doc-viewer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-fivsKXRG6qD7KlSSzZ533eoLgMNmzS9oa//HxmIMVptBp7p4+iqW7A1kUDQw/QeKhwkkvRxQNupxRi8O3TIA7w==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-location": "3.0.0-pre.12",
+ "@polymer/marked-element": "3.0.0-pre.12",
+ "@polymer/paper-styles": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12",
+ "@polymer/prism-element": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-fit-behavior": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-fit-behavior/-/iron-fit-behavior-3.0.0-pre.12.tgz",
+ "integrity": "sha512-b0ln6rPpC7/bRjHp1aPIaCGuJr4Q4b67AxYV6FaoSMCR9RrlQTvJfvMkrcygrDCpm0DH0e7nL6IJHRmHBTrK9w==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-flex-layout": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-flex-layout/-/iron-flex-layout-3.0.0-pre.12.tgz",
+ "integrity": "sha512-JvctZ1K5TeRsoGMxVB1yBZYEWONQvyCdcmaoCB6gOJ9R5eq5ebAg2JPNSITAp9CTL2i08Af4tQER3AXzaKyi3A==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-form-element-behavior": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-form-element-behavior/-/iron-form-element-behavior-3.0.0-pre.12.tgz",
+ "integrity": "sha512-i3gAVSq4TbQyGqhHo7HLbzkZ3E1+ua1+U3vUSdVTs3R+qgAXqlIgUDuEintB42X49IvumEy/qWxxxvqL9oZhYw==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-icon": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-icon/-/iron-icon-3.0.0-pre.12.tgz",
+ "integrity": "sha512-S5I324FBMh8/MPBDVtfHS8FVKszhqhhdDjB0QsJ9dBooB5aZKwGyHMXgHW9dcnu+PjM7nP5532u4tpFdBw9TWg==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-flex-layout": "3.0.0-pre.12",
+ "@polymer/iron-meta": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-icons": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-icons/-/iron-icons-3.0.0-pre.12.tgz",
+ "integrity": "sha512-NaB1C8bNcll2yMZRuWf+xdLnUTbcUgUP2zjEaRHRHmB3vHxt95Cknbe2xy0s08Mb+1CNeadDEkEgdurf3YnMnA==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-icon": "3.0.0-pre.12",
+ "@polymer/iron-iconset-svg": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-iconset-svg": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-iconset-svg/-/iron-iconset-svg-3.0.0-pre.12.tgz",
+ "integrity": "sha512-FAUZjNZrMo6hsRoDoZeAj/kjygUDdv3XbgzoG93yKWxkIhkER2GxmIuYt+5fxx1ZSkB+BCqKnlqk+raGpJ9n6w==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-meta": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ },
+ "dependencies": {
+ "@babel/types": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.35.tgz",
+ "integrity": "sha512-y9XT11CozHDgjWcTdxmhSj13rJVXpa5ZXwjjOiTedjaM0ba5ItqdS02t31EhPl7HtOWxsZkYCCUNrSfrOisA6w==",
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "2.0.0"
+ }
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+ }
+ }
+ },
+ "@polymer/iron-location": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-location/-/iron-location-3.0.0-pre.12.tgz",
+ "integrity": "sha512-DovMCY4bF8YayceGS8fQ2lXC2RXG7KD9F3SUhL7llCiwL3Q4m1G2wCfm/m/q0SLYajZfR/zAAYVvvYJRrsKcKg==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-media-query": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-media-query/-/iron-media-query-3.0.0-pre.12.tgz",
+ "integrity": "sha512-6Ei0NXrKI01wObWez0fTwBvMcC5nqD0uNKQKOOug9ufPKyCwUNIHM0OUrjShfkbMwoJXPL2jU3KHokuHZXLrMg==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-meta": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-meta/-/iron-meta-3.0.0-pre.12.tgz",
+ "integrity": "sha512-Yi+Xiu0OlxTiAxWx+X9DuI35dTRm2/lHQqWplubZSGHW+ANuItOTxOLlTm175kq5HY7V8JQtiugko0xaJ60V4A==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.35.tgz",
+ "integrity": "sha512-l0SE8cl9DUIY4hYAFAKTLX3F2Yr14Qri7uTsuI7iegB5E4KyQy4XY72L3VOxmj6kwR/RDQURoKYr2NzyETGo7A==",
+ "requires": {
+ "chalk": "2.4.1",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.35.tgz",
+ "integrity": "sha512-+216NxQ7/Lvj+iehFBKEhYU/BQ1aqHTWz1bxCDiQWms0qi23iqHA4r+WdRKW/o5dAV5mlTUL4nCBFaNx8LNnRQ==",
+ "requires": {
+ "@babel/helper-get-function-arity": "7.0.0-beta.35",
+ "@babel/template": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.35.tgz",
+ "integrity": "sha512-8co9nT1MgbNoGl6too2/jwldu5F7O1rMi+/QsM9bmFuCu76rU5okFWi4cb4Uv0WXZ4BWk6x+Lpdzzu7EgvkAwA==",
+ "requires": {
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/template": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.35.tgz",
+ "integrity": "sha512-NLd3Dfs8hmkxPvaD8ohNtEp9WXp48lxpW//6fXcT9bJWIO3isrH3OTYL9kjX7xFPPasJ1E9bUNSaPFUUgvPZSQ==",
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35",
+ "babylon": "7.0.0-beta.35",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.35.tgz",
+ "integrity": "sha512-oj2mjz/20iiDt+X0mlzE2IEkzLyM0nmT1zSUy/6i6vyzitVeoyRaHoM7O81gmAHSfBSqyjWRU0OuD9VIUgj8Vg==",
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.35",
+ "@babel/helper-function-name": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35",
+ "babylon": "7.0.0-beta.35",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/types": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.35.tgz",
+ "integrity": "sha512-y9XT11CozHDgjWcTdxmhSj13rJVXpa5ZXwjjOiTedjaM0ba5ItqdS02t31EhPl7HtOWxsZkYCCUNrSfrOisA6w==",
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "2.0.0"
+ }
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.35.tgz",
+ "integrity": "sha512-Y2o5scalPPlI6eOYMat6iqoM8akjqkAv9cXUN/7YNe3FANAsAGcF5L2u6XiUtBECvhyf7LeZYyzNYnjk43Vffg=="
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+ }
+ }
+ },
+ "@polymer/iron-overlay-behavior": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-overlay-behavior/-/iron-overlay-behavior-3.0.0-pre.12.tgz",
+ "integrity": "sha512-qvpCckvzjYszSI9i235Ft+kLIxpRTWLsrhdBtnEycvwk6qtYhQDH+314409n40xoyT6zp8dmUXpuwMetNgr+sA==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-a11y-keys-behavior": "3.0.0-pre.12",
+ "@polymer/iron-fit-behavior": "3.0.0-pre.12",
+ "@polymer/iron-resizable-behavior": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-resizable-behavior": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-resizable-behavior/-/iron-resizable-behavior-3.0.0-pre.12.tgz",
+ "integrity": "sha512-ppZGXh//MVkWedjQtgOzBHiuoyTcKggnnMjVHxFsGdIu5kz9LVqB8uqYbN91yhjtLLUAkSIAo1DLhXpoK2x27w==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-scroll-target-behavior": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-scroll-target-behavior/-/iron-scroll-target-behavior-3.0.0-pre.12.tgz",
+ "integrity": "sha512-M+m/myMkARPxvCVj8CcLYIDaTBUEuZr5+3mTTRFY1N2pf8bt7mjEJ6lUpPAfe89+abSHXJMEXf1VjsVSXwDFSg==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-validatable-behavior": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-validatable-behavior/-/iron-validatable-behavior-3.0.0-pre.12.tgz",
+ "integrity": "sha512-80Zblp9n+2nepymuOMJcdmf0F5uxYrbRQdbt2eDStmXjlqcbxgTrdmHY93Pb2n1mwcvjHXU3ex3W4TtVaeX6Rg==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-meta": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/marked-element": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/marked-element/-/marked-element-3.0.0-pre.12.tgz",
+ "integrity": "sha512-S+jXTkTchuHGAFnzkhLhOq8MPDu3VSAMdVssFslnQkjwnKwewuxux8Y2fJqzGFQJt03JpkGk6fcNET/byDqqfQ==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12",
+ "marked": "0.3.19"
+ }
+ },
+ "@polymer/paper-behaviors": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/paper-behaviors/-/paper-behaviors-3.0.0-pre.12.tgz",
+ "integrity": "sha512-S1YRAwg7B+8P/ju4w8Fk1CMU9DMI/Hv5/MceN/10IX5znGnYqXZrOEHfUiYAM+P5RivsOn4UJdG7wyxAnrCzkg==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-behaviors": "3.0.0-pre.12",
+ "@polymer/iron-checked-element-behavior": "3.0.0-pre.12",
+ "@polymer/paper-ripple": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/paper-icon-button": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/paper-icon-button/-/paper-icon-button-3.0.0-pre.12.tgz",
+ "integrity": "sha512-+s0CO5Ctkb9SOZ+t8m4WeCUImtjHvvz58howHgxqW2nfKTBbDXz3pT1zOA7ngFxTvWOpfPUjRGE4uaapG1e0Xw==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-icon": "3.0.0-pre.12",
+ "@polymer/paper-behaviors": "3.0.0-pre.12",
+ "@polymer/paper-styles": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/paper-ripple": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/paper-ripple/-/paper-ripple-3.0.0-pre.12.tgz",
+ "integrity": "sha512-BNyqzLK7eqy6gzXJOr3PGc/5RcSNBouYXIgwiwmiFHWgTc1C8JJnPwE7EuiCfV6WyDY8byFyD10E4jBKHAUwOg==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-a11y-keys-behavior": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/paper-styles": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/paper-styles/-/paper-styles-3.0.0-pre.12.tgz",
+ "integrity": "sha512-mZEu5Rgel1vz3m1wz2XEgNN7pHx0yXvrmSspkD8JlPooy3ewNY0VyVHV/kcIcfQxaKQ8I8b59unOQPV48OqCLA==",
+ "dev": true,
+ "requires": {
+ "@polymer/font-roboto": "3.0.0-pre.12",
+ "@polymer/iron-flex-layout": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/paper-toast": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/paper-toast/-/paper-toast-3.0.0-pre.12.tgz",
+ "integrity": "sha512-F/vKj8VVisA3D7t2D0DZ8SqnzZeNHTrgw+hWFc2hvjxjH2T6Jf9DDgauaF6JN8cbZoTHtbKCNSu3MTgI2Qa78g==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-a11y-announcer": "3.0.0-pre.12",
+ "@polymer/iron-fit-behavior": "3.0.0-pre.12",
+ "@polymer/iron-overlay-behavior": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/polymer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-j3ie9DOtENLMR5pG8iyyrFF62lTnKrQCrMVlvgQF2q4qpUXFck0QUlE6gJJN/Zfi3br69mG5+F3mtwQb61OjOQ==",
+ "dev": true,
+ "requires": {
+ "@webcomponents/shadycss": "1.1.3",
+ "@webcomponents/webcomponentsjs": "1.2.0"
+ },
+ "dependencies": {
+ "@webcomponents/shadycss": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.1.3.tgz",
+ "integrity": "sha512-tGap6j8LVgy8ORM7pL5Yf6u8tTUH0jJaMmA5St/Ijy9WCNttDnrmZTiEF7fl7QQNerzMnCVQHtO0vuX8kybxfQ==",
+ "dev": true
+ },
+ "@webcomponents/webcomponentsjs": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-1.2.0.tgz",
+ "integrity": "sha512-P9JWydfpBR+CK12UwtBaoD/lYF3PR9XBArAWk5J9nfPaJwA3OUox4StZmyFSVDLsvpFq5HsEtxU/OdHAlAWPnw==",
+ "dev": true
+ }
+ }
+ },
+ "@polymer/prism-element": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/prism-element/-/prism-element-3.0.0-pre.12.tgz",
+ "integrity": "sha512-+a3rQ94KXY2Qe2MM9JKghCsKM27jX8oy33jvjRFsbpxNjqESvHWdba0TtMANGF3ftJU8h2W/t9xebiycsqJg1g==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12",
+ "prismjs": "1.14.0"
+ }
+ },
+ "@polymer/sinonjs": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/@polymer/sinonjs/-/sinonjs-1.17.1.tgz",
+ "integrity": "sha512-/U8F/cOTrbF2iVVYgINYmvKbtbexs+89Q3v8AaHADRYabTg7aOZGOb0RyWpOI+sUJt04kj63U4FwMhzW5r4wZA==",
+ "dev": true
+ },
+ "@polymer/test-fixture": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/test-fixture/-/test-fixture-3.0.0-pre.12.tgz",
+ "integrity": "sha512-6OsAdv6VUrVmkSCsDXo2KF/cuyyl5EETzQQpLysHioOYa3vGiYHiMATrw9G6CvuCc3gNevu41ln/XJ2n6Khurg==",
+ "dev": true
+ },
+ "@types/babel-core": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-core/-/babel-core-6.25.3.tgz",
+ "integrity": "sha512-OlUjfM+Qv+XwcaucEiekBIhfAYe4q4ruvQZZcCkOtQZ27Hykxm1LLY2s0mE6LtP9XQt6x+TUvS70KW2e8Mz0ZA==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-template": "6.25.0",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-template": {
+ "version": "6.25.0",
+ "resolved": "https://registry.npmjs.org/@types/babel-template/-/babel-template-6.25.0.tgz",
+ "integrity": "sha512-TtyfVlrprX92xSuKa8D//7vFz5kBJODBw5IQ1hQXehqO+me26vt1fyNxOZyXhUq2a7jRyT72V8p68IyH4NEZNA==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.3.tgz",
+ "integrity": "sha512-f5dXGzOJycyzSMdaXVhiBhauL4dYydXwVpavfQ1mVCaGjR56a9QfklXObUxlIY9bGTmCPHEEZ04I16BZ/8w5ww==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.3"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clean-css": {
+ "version": "3.4.30",
+ "resolved": "https://registry.npmjs.org/@types/clean-css/-/clean-css-3.4.30.tgz",
+ "integrity": "sha1-AFLBNvUkgAJCjjY4s33ko5gYZB0=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ="
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/escodegen": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/@types/escodegen/-/escodegen-0.0.2.tgz",
+ "integrity": "sha1-fOpBqyQukQ6xD2WuGK66RZ1ms18=",
+ "dev": true
+ },
+ "@types/estraverse": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estraverse/-/estraverse-0.0.6.tgz",
+ "integrity": "sha1-Zp9833KreX5hJfjQD+0z1M8wwiE=",
+ "dev": true,
+ "requires": {
+ "@types/estree": "0.0.37"
+ }
+ },
+ "@types/estree": {
+ "version": "0.0.37",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.37.tgz",
+ "integrity": "sha512-1IT6vNpmU9w18P3v6mN9idv18z5KPVTi4t7+rU9VLnkxo0LCam8IXy/eSVzOaQ1Wpabra2cN3A8K/SliPK/Suw==",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.2.tgz",
+ "integrity": "sha512-Q3FWsbdmkQd1ib11A4XNWQvRD//5KpPoGawA8aB2DR7pWKoW9XQv3+dGxD/Z1eVFze23Okdo27ZQytVFlweKvQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.107"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.107"
+ }
+ },
+ "@types/glob-stream": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@types/glob-stream/-/glob-stream-6.1.0.tgz",
+ "integrity": "sha512-RHv6ZQjcTncXo3thYZrsbAVwoy4vSKosSWhuhuQxLOTv74OJuFQxXkmUuZCr3q9uNBEVCvIzmZL/FeRNbHZGUg==",
+ "dev": true,
+ "requires": {
+ "@types/glob": "5.0.35",
+ "@types/node": "6.0.107"
+ }
+ },
+ "@types/gulp-if": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/gulp-if/-/gulp-if-0.0.33.tgz",
+ "integrity": "sha512-J5lzff21X7r1x/4hSzn02GgIUEyjCqYIXZ9GgGBLhbsD3RiBdqwnkFWgF16/0jO5rcVZ52Zp+6MQMQdvIsWuKg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.107",
+ "@types/vinyl": "2.0.2"
+ }
+ },
+ "@types/html-minifier": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/@types/html-minifier/-/html-minifier-3.5.2.tgz",
+ "integrity": "sha512-yikK28/KlVyf8g9i/k+TDFlteLuZ6QQTUdVqvKtzEB+8DSLCTjxfh6IK45KnW4rYFI3Y8T4LWpYJMTmfJleWaQ==",
+ "dev": true,
+ "requires": {
+ "@types/clean-css": "3.4.30",
+ "@types/relateurl": "0.2.28",
+ "@types/uglify-js": "3.0.2"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/mz": {
+ "version": "0.0.31",
+ "resolved": "https://registry.npmjs.org/@types/mz/-/mz-0.0.31.tgz",
+ "integrity": "sha1-pNgMCC/v5x5Ap8DwfR5lVbu8e1I=",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.107"
+ }
+ },
+ "@types/node": {
+ "version": "6.0.107",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.107.tgz",
+ "integrity": "sha512-iuJWRFHqU0tFLCYH6cfBZzMxThAAsNK31FZxoq+fKIDOSZk1p+3IhNWfEdvPJfsQXcTq8z+57s8xjQlrDAB0Gw=="
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "requires": {
+ "@types/node": "6.0.107"
+ }
+ },
+ "@types/relateurl": {
+ "version": "0.2.28",
+ "resolved": "https://registry.npmjs.org/@types/relateurl/-/relateurl-0.2.28.tgz",
+ "integrity": "sha1-a9p9uGU/piZD9e5p6facEaOS46Y=",
+ "dev": true
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.107"
+ },
+ "dependencies": {
+ "regenerator-transform": {
+ "version": "0.12.3",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.12.3.tgz",
+ "integrity": "sha512-y2uxO/6u+tVmtEDIKo+tLCtI0GcbQr0OreosKgCd7HP4VypGjtTrw79DezuwT+W5QX0YWuvpeBOgumrepwM1kA==",
+ "requires": {
+ "private": "0.1.8"
+ }
+ }
+ }
+ },
+ "@types/ua-parser-js": {
+ "version": "0.7.32",
+ "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.32.tgz",
+ "integrity": "sha512-+z7Q72Mlnq6SFkQYHzLg2Z70pIsgRVzgx1b5PV8eUv5uaZ/zoqIs45XnhtToW4gTeX4FbjIP49nhIjyvPF4rPg=="
+ },
+ "@types/uglify-js": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.2.tgz",
+ "integrity": "sha512-o8hU2+4xsyGC27Vujoklvxl88Ew5zmJuTBYMX1Uro2rYUt4HEFJKL6fuq8aGykvS+ssIsIzerWWP2DRxonownQ==",
+ "dev": true,
+ "requires": {
+ "source-map": "0.6.1"
+ }
+ },
+ "@types/uuid": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz",
+ "integrity": "sha512-5fRLCYhLtDb3hMWqQyH10qtF+Ud2JnNCXTCZ+9ktNdCcgslcuXkDTkFcJNk++MT29yDntDnlF1+jD+uVGumsbw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.107"
+ }
+ },
+ "@types/vinyl": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.2.tgz",
+ "integrity": "sha512-2iYpNuOl98SrLPBZfEN9Mh2JCJ2EI9HU35SfgBEb51DcmaHkhp8cKMblYeBqMQiwXMgAD3W60DbQ4i/UdLiXhw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.107"
+ }
+ },
+ "@types/vinyl-fs": {
+ "version": "0.0.28",
+ "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-0.0.28.tgz",
+ "integrity": "sha1-RmMBe8gCxlcOrk80Cf1cq/l8v94=",
+ "dev": true,
+ "requires": {
+ "@types/glob-stream": "6.1.0",
+ "@types/node": "6.0.107",
+ "@types/vinyl": "2.0.2"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "requires": {
+ "@types/node": "6.0.107"
+ }
+ },
+ "@webcomponents/shadycss": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.2.0.tgz",
+ "integrity": "sha512-ZkqUkqZAn+vQlxB4bgZ0aOfAgxpISsD9kUcPgKmeXze5PRVCRVwVje33GqA2OYYWSrwcq1JwWx+JscW3kLl4SQ=="
+ },
+ "@webcomponents/webcomponentsjs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.0.0.tgz",
+ "integrity": "sha512-f6izmesHd8E+rL32tftlXZmz1EAL+lLn8AUex0mJFLe39z53iTFNCqxAYsMmCA/QSGP+8X6D1it/JbuVl1jOHA==",
+ "dev": true
+ },
+ "abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+ },
+ "accessibility-developer-tools": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz",
+ "integrity": "sha1-PaDM6dbsY3OWS4TzXbfPw996tRQ=",
+ "dev": true
+ },
+ "acorn": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
+ "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+ "dev": true,
+ "requires": {
+ "acorn": "3.3.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+ "dev": true
+ }
+ }
+ },
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "requires": {
+ "co": "4.6.0",
+ "fast-deep-equal": "1.1.0",
+ "fast-json-stable-stringify": "2.0.0",
+ "json-schema-traverse": "0.3.1"
+ }
+ },
+ "ajv-keywords": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
+ "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
+ "dev": true
+ },
+ "ansi-align": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
+ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
+ "dev": true,
+ "requires": {
+ "string-width": "2.1.1"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+ }
+ }
+ },
+ "ansi-colors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+ "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-cyan": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
+ "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz",
+ "integrity": "sha1-HBg5S2r5t2/5pjUJ+kl2af0s5T4=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4"
+ },
+ "dependencies": {
+ "array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0="
+ }
+ }
+ }
+ }
+ },
+ "ansi-escapes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
+ "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
+ "dev": true
+ },
+ "ansi-gray": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
+ "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-red": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
+ "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+ },
+ "ansi-wrap": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768="
+ },
+ "any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
+ },
+ "anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "dev": true,
+ "requires": {
+ "micromatch": "3.1.10",
+ "normalize-path": "2.1.1"
+ }
+ },
+ "append-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz",
+ "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=",
+ "dev": true,
+ "requires": {
+ "buffer-equal": "1.0.0"
+ }
+ },
+ "archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
+ "dev": true
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "1.0.3"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-filter": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz",
+ "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=",
+ "dev": true,
+ "requires": {
+ "make-iterator": "1.0.1"
+ }
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz",
+ "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=",
+ "dev": true,
+ "requires": {
+ "make-iterator": "1.0.1"
+ }
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
+ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8="
+ },
+ "array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+ "dev": true
+ },
+ "array-initial": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz",
+ "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=",
+ "dev": true,
+ "requires": {
+ "array-slice": "1.1.0",
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "array-last": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz",
+ "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "array-slice": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
+ "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w=="
+ },
+ "array-sort": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz",
+ "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==",
+ "dev": true,
+ "requires": {
+ "default-compare": "1.0.0",
+ "get-value": "2.0.6",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "requires": {
+ "array-uniq": "1.0.3"
+ }
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
+ },
+ "assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw=="
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k="
+ },
+ "async-done": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.2.4.tgz",
+ "integrity": "sha512-mxc+yISkb0vjsuvG3dJCIZXzRWjKndQ9Zo9zNDJ1K2wh9eP0E0oGmOWm+4cFOvW4dA0tGFImTW5tQJHCtn1kIQ==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "once": "1.4.0",
+ "process-nextick-args": "1.0.7",
+ "stream-exhaust": "1.0.2"
+ },
+ "dependencies": {
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "dev": true
+ }
+ }
+ },
+ "async-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+ "dev": true
+ },
+ "async-settle": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz",
+ "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=",
+ "dev": true,
+ "requires": {
+ "async-done": "1.2.4"
+ }
+ },
+ "atob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz",
+ "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio="
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.4.1",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "babel-core": {
+ "version": "6.26.3",
+ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
+ "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-generator": "6.26.1",
+ "babel-helpers": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-register": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "convert-source-map": "1.5.1",
+ "debug": "2.6.9",
+ "json5": "0.5.1",
+ "lodash": "4.17.10",
+ "minimatch": "3.0.4",
+ "path-is-absolute": "1.0.1",
+ "private": "0.1.8",
+ "slash": "1.0.0",
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-eslint": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz",
+ "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.10",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-builder-binary-assignment-operator-visitor": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
+ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
+ "dev": true,
+ "requires": {
+ "babel-helper-explode-assignable-expression": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "babel-helper-call-delegate": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+ "dev": true,
+ "requires": {
+ "babel-helper-hoist-variables": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-define-map": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
+ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+ "dev": true,
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.10"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-evaluate-path": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.2.0.tgz",
+ "integrity": "sha512-0EK9TUKMxHL549hWDPkQoS7R0Ozg1CDLheVBHYds2B2qoAvmr9ejY3zOXFsrICK73TN7bPhU14PBeKc8jcBTwg==",
+ "dev": true
+ },
+ "babel-helper-explode-assignable-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
+ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-flip-expressions": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.2.0.tgz",
+ "integrity": "sha512-rAsPA1pWBc7e2E6HepkP2e1sXugT+Oq/VCqhyuHJ8aJ2d/ifwnJfd4Qxjm21qlW43AN8tqaeByagKK6wECFMSw==",
+ "dev": true
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-hoist-variables": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "babel-helper-is-nodes-equiv": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz",
+ "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=",
+ "dev": true
+ },
+ "babel-helper-is-void-0": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.2.0.tgz",
+ "integrity": "sha512-Axj1AYuD0E3Dl7nT3KxROP7VekEofz3XtEljzURf3fABalLpr8PamtgLFt+zuxtaCxRf9iuZmbAMMYWri5Bazw==",
+ "dev": true
+ },
+ "babel-helper-mark-eval-scopes": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.2.0.tgz",
+ "integrity": "sha512-KJuwrOUcHbvbh6he4xRXZFLaivK9DF9o3CrvpWnK1Wp0B+1ANYABXBMgwrnNFIDK/AvicxQ9CNr8wsgivlp4Aw==",
+ "dev": true
+ },
+ "babel-helper-optimise-call-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "babel-helper-regex": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
+ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.10"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "babel-helper-remap-async-to-generator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+ "dev": true,
+ "requires": {
+ "babel-helper-hoist-variables": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "requires": {
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
+ }
+ }
+ },
+ "babel-helper-remove-or-void": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.2.0.tgz",
+ "integrity": "sha512-1Z41upf/XR+PwY7Nd+F15Jo5BiQi5205ZXUuKed3yoyQgDkMyoM7vAdjEJS/T+M6jy32sXjskMUgms4zeiVtRA==",
+ "dev": true
+ },
+ "babel-helper-replace-supers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+ "dev": true,
+ "requires": {
+ "babel-helper-optimise-call-expression": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-to-multiple-sequence-expressions": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.2.0.tgz",
+ "integrity": "sha512-ij9lpfdP3+Zc/7kNwa+NXbTrUlsYEWPwt/ugmQO0qflzLrveTIkbfOqQztvitk81aG5NblYDQXDlRohzu3oa8Q==",
+ "dev": true
+ },
+ "babel-helpers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
+ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-check-es2015-constants": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
+ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-external-helpers": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz",
+ "integrity": "sha1-IoX0iwK9Xe3oUXXK+MYuhq3M76E=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-minify-builtins": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.2.0.tgz",
+ "integrity": "sha512-4i+8ntaS8gwVUcOz5y+zE+55OVOl2nTbmHV51D4wAIiKcRI8U5K//ip1GHfhsgk/NJrrHK7h97Oy5jpqt0Iixg==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-constant-folding": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.2.0.tgz",
+ "integrity": "sha512-B3ffQBEUQ8ydlIkYv2MkZtTCbV7FAkWAV7NkyhcXlGpD10PaCxNGQ/B9oguXGowR1m16Q5nGhvNn8Pkn1MO6Hw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-dead-code-elimination": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.2.0.tgz",
+ "integrity": "sha512-zE7y3pRyzA4zK5nBou0kTcwUTSQ/AiFrynt1cIEYN7vcO2gS9ZFZoI0aO9JYLUdct5fsC1vfB35408yrzTyVfg==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.2.0",
+ "babel-helper-mark-eval-scopes": "0.2.0",
+ "babel-helper-remove-or-void": "0.2.0",
+ "lodash.some": "4.6.0"
+ }
+ },
+ "babel-plugin-minify-flip-comparisons": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.2.0.tgz",
+ "integrity": "sha512-QOqXSEmD/LhT3LpM1WCyzAGcQZYYKJF7oOHvS6QbpomHenydrV53DMdPX2mK01icBExKZcJAHF209wvDBa+CSg==",
+ "dev": true,
+ "requires": {
+ "babel-helper-is-void-0": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-guarded-expressions": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.2.0.tgz",
+ "integrity": "sha512-5+NSPdRQ9mnrHaA+zFj+D5OzmSiv90EX5zGH6cWQgR/OUqmCHSDqgTRPFvOctgpo8MJyO7Rt7ajs2UfLnlAwYg==",
+ "dev": true,
+ "requires": {
+ "babel-helper-flip-expressions": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-infinity": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.2.0.tgz",
+ "integrity": "sha512-U694vrla1lN6vDHWGrR832t3a/A2eh+kyl019LxEE2+sS4VTydyOPRsAOIYAdJegWRA4cMX1lm9azAN0cLIr8g==",
+ "dev": true
+ },
+ "babel-plugin-minify-mangle-names": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.2.0.tgz",
+ "integrity": "sha512-Gixuak1/CO7VCdjn15/8Bxe/QsAtDG4zPbnsNoe1mIJGCIH/kcmSjFhMlGJtXDQZd6EKzeMfA5WmX9+jvGRefw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-mark-eval-scopes": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-numeric-literals": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.2.0.tgz",
+ "integrity": "sha512-VcLpb+r1YS7+RIOXdRsFVLLqoh22177USpHf+JM/g1nZbzdqENmfd5v534MLAbRErhbz6SyK+NQViVzVtBxu8g==",
+ "dev": true
+ },
+ "babel-plugin-minify-replace": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.2.0.tgz",
+ "integrity": "sha512-SEW6zoSVxh3OH6E1LCgyhhTWMnCv+JIRu5h5IlJDA11tU4ZeSF7uPQcO4vN/o52+FssRB26dmzJ/8D+z0QPg5Q==",
+ "dev": true
+ },
+ "babel-plugin-minify-simplify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.2.0.tgz",
+ "integrity": "sha512-Mj3Mwy2zVosMfXDWXZrQH5/uMAyfJdmDQ1NVqit+ArbHC3LlXVzptuyC1JxTyai/wgFvjLaichm/7vSUshkWqw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-flip-expressions": "0.2.0",
+ "babel-helper-is-nodes-equiv": "0.0.1",
+ "babel-helper-to-multiple-sequence-expressions": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-type-constructors": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.2.0.tgz",
+ "integrity": "sha512-NiOvvA9Pq6bki6nP4BayXwT5GZadw7DJFDDzHmkpnOQpENWe8RtHtKZM44MG1R6EQ5XxgbLdsdhswIzTkFlO5g==",
+ "dev": true,
+ "requires": {
+ "babel-helper-is-void-0": "0.2.0"
+ }
+ },
+ "babel-plugin-syntax-async-functions": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
+ "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
+ "dev": true
+ },
+ "babel-plugin-syntax-async-generators": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz",
+ "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=",
+ "dev": true
+ },
+ "babel-plugin-syntax-dynamic-import": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz",
+ "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=",
+ "dev": true
+ },
+ "babel-plugin-syntax-exponentiation-operator": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
+ "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
+ "dev": true
+ },
+ "babel-plugin-syntax-export-extensions": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz",
+ "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=",
+ "dev": true
+ },
+ "babel-plugin-syntax-object-rest-spread": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
+ "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=",
+ "dev": true
+ },
+ "babel-plugin-transform-async-generator-functions": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
+ "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=",
+ "dev": true,
+ "requires": {
+ "babel-helper-remap-async-to-generator": "6.24.1",
+ "babel-plugin-syntax-async-generators": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-async-to-generator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
+ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
+ "dev": true,
+ "requires": {
+ "babel-helper-remap-async-to-generator": "6.24.1",
+ "babel-plugin-syntax-async-functions": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-arrow-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-block-scoped-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-block-scoping": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.10"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-classes": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+ "dev": true,
+ "requires": {
+ "babel-helper-define-map": "6.26.0",
+ "babel-helper-function-name": "6.24.1",
+ "babel-helper-optimise-call-expression": "6.24.1",
+ "babel-helper-replace-supers": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-computed-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-destructuring": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-duplicate-keys": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-for-of": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+ "dev": true,
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-amd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-es2015-modules-commonjs": "6.26.2",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "requires": {
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-modules-commonjs": {
+ "version": "6.26.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
+ "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-strict-mode": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-modules-systemjs": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+ "dev": true,
+ "requires": {
+ "babel-helper-hoist-variables": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-modules-umd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
+ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-object-super": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+ "dev": true,
+ "requires": {
+ "babel-helper-replace-supers": "6.24.1",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-parameters": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+ "dev": true,
+ "requires": {
+ "babel-helper-call-delegate": "6.24.1",
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-shorthand-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-spread": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-sticky-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+ "dev": true,
+ "requires": {
+ "babel-helper-regex": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-template-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-typeof-symbol": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-unicode-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+ "dev": true,
+ "requires": {
+ "babel-helper-regex": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "regexpu-core": "2.0.0"
+ }
+ },
+ "babel-plugin-transform-exponentiation-operator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
+ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
+ "dev": true,
+ "requires": {
+ "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1",
+ "babel-plugin-syntax-exponentiation-operator": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-inline-consecutive-adds": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.2.0.tgz",
+ "integrity": "sha512-GlhOuLOQ28ua9prg0hT33HslCrEmz9xWXy9ZNZSACppCyRxxRW+haYtRgm7uYXCcd0q8ggCWD2pfWEJp5iiZfQ==",
+ "dev": true
+ },
+ "babel-plugin-transform-member-expression-literals": {
+ "version": "6.9.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.2.tgz",
+ "integrity": "sha1-Hzl6uWGlw6QB8qdHrwbnIASvy3Y=",
+ "dev": true
+ },
+ "babel-plugin-transform-merge-sibling-variables": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.1.tgz",
+ "integrity": "sha1-kHHkQ7IUWM5rCo04QbpaF09dwoI=",
+ "dev": true
+ },
+ "babel-plugin-transform-minify-booleans": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.1.tgz",
+ "integrity": "sha1-UsunnAD6UJc3BkBV76siFm4UDE0=",
+ "dev": true
+ },
+ "babel-plugin-transform-object-rest-spread": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
+ "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-syntax-object-rest-spread": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-property-literals": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.1.tgz",
+ "integrity": "sha1-aXD5Oxd5OrzenPJdLozRPgCI5ck=",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "babel-plugin-transform-regenerator": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
+ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+ "dev": true,
+ "requires": {
+ "regenerator-transform": "0.10.1"
+ }
+ },
+ "babel-plugin-transform-regexp-constructors": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.2.0.tgz",
+ "integrity": "sha512-7IsQ6aQx6LAaOqy97/PthTf+5Nx9grZww3r6E62IdWe76Yr8KsuwVjxzqSPQvESJqTE3EMADQ9S0RtwWDGNG9Q==",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-console": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.1.tgz",
+ "integrity": "sha1-QP6V2YyuWBHYoOGImBLXixKFllE=",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-debugger": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.1.tgz",
+ "integrity": "sha1-dlUtLp1sQ9nGdrv8CPPCoswUvhQ=",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-undefined": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.2.0.tgz",
+ "integrity": "sha512-O8v57tPMHkp89kA4ZfQEYds/pzgvz/QYerBJjIuL5/Jc7RnvMVRA5gJY9zFKP7WayW8WOSBV4vh8Y8FJRio+ow==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.2.0"
+ }
+ },
+ "babel-plugin-transform-simplify-comparison-operators": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.1.tgz",
+ "integrity": "sha1-Ww0GmAoXp4D1MYsnTAC+L7HHxP4=",
+ "dev": true
+ },
+ "babel-plugin-transform-strict-mode": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "babel-plugin-transform-undefined-to-void": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.1.tgz",
+ "integrity": "sha1-19+cHdDsEuD/6JXtFEX2Hxv14iE=",
+ "dev": true
+ },
+ "babel-polyfill": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
+ "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.10.5"
+ },
+ "dependencies": {
+ "regenerator-runtime": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+ "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
+ "dev": true
+ }
+ }
+ },
+ "babel-preset-es2015": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz",
+ "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-check-es2015-constants": "6.22.0",
+ "babel-plugin-transform-es2015-arrow-functions": "6.22.0",
+ "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0",
+ "babel-plugin-transform-es2015-block-scoping": "6.26.0",
+ "babel-plugin-transform-es2015-classes": "6.24.1",
+ "babel-plugin-transform-es2015-computed-properties": "6.24.1",
+ "babel-plugin-transform-es2015-destructuring": "6.23.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
+ "babel-plugin-transform-es2015-for-of": "6.23.0",
+ "babel-plugin-transform-es2015-function-name": "6.24.1",
+ "babel-plugin-transform-es2015-literals": "6.22.0",
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-plugin-transform-es2015-modules-commonjs": "6.26.2",
+ "babel-plugin-transform-es2015-modules-systemjs": "6.24.1",
+ "babel-plugin-transform-es2015-modules-umd": "6.24.1",
+ "babel-plugin-transform-es2015-object-super": "6.24.1",
+ "babel-plugin-transform-es2015-parameters": "6.24.1",
+ "babel-plugin-transform-es2015-shorthand-properties": "6.24.1",
+ "babel-plugin-transform-es2015-spread": "6.22.0",
+ "babel-plugin-transform-es2015-sticky-regex": "6.24.1",
+ "babel-plugin-transform-es2015-template-literals": "6.22.0",
+ "babel-plugin-transform-es2015-typeof-symbol": "6.23.0",
+ "babel-plugin-transform-es2015-unicode-regex": "6.24.1",
+ "babel-plugin-transform-regenerator": "6.26.0"
+ }
+ },
+ "babel-preset-minify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.2.0.tgz",
+ "integrity": "sha512-mR8Q44RmMzm18bM2Lqd9uiPopzk5GDCtVuquNbLFmX6lOKnqWoenaNBxnWW0UhBFC75lEHTIgNGCbnsRI0pJVw==",
+ "dev": true,
+ "requires": {
+ "babel-plugin-minify-builtins": "0.2.0",
+ "babel-plugin-minify-constant-folding": "0.2.0",
+ "babel-plugin-minify-dead-code-elimination": "0.2.0",
+ "babel-plugin-minify-flip-comparisons": "0.2.0",
+ "babel-plugin-minify-guarded-expressions": "0.2.0",
+ "babel-plugin-minify-infinity": "0.2.0",
+ "babel-plugin-minify-mangle-names": "0.2.0",
+ "babel-plugin-minify-numeric-literals": "0.2.0",
+ "babel-plugin-minify-replace": "0.2.0",
+ "babel-plugin-minify-simplify": "0.2.0",
+ "babel-plugin-minify-type-constructors": "0.2.0",
+ "babel-plugin-transform-inline-consecutive-adds": "0.2.0",
+ "babel-plugin-transform-member-expression-literals": "6.9.2",
+ "babel-plugin-transform-merge-sibling-variables": "6.9.1",
+ "babel-plugin-transform-minify-booleans": "6.9.1",
+ "babel-plugin-transform-property-literals": "6.9.1",
+ "babel-plugin-transform-regexp-constructors": "0.2.0",
+ "babel-plugin-transform-remove-console": "6.9.1",
+ "babel-plugin-transform-remove-debugger": "6.9.1",
+ "babel-plugin-transform-remove-undefined": "0.2.0",
+ "babel-plugin-transform-simplify-comparison-operators": "6.9.1",
+ "babel-plugin-transform-undefined-to-void": "6.9.1",
+ "lodash.isplainobject": "4.0.6"
+ }
+ },
+ "babel-register": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
+ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+ "dev": true,
+ "requires": {
+ "babel-core": "6.26.3",
+ "babel-runtime": "6.26.0",
+ "core-js": "2.5.5",
+ "home-or-tmp": "2.0.0",
+ "lodash": "4.17.10",
+ "mkdirp": "0.5.1",
+ "source-map-support": "0.4.18"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg=="
+ }
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.10"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz",
+ "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==",
+ "dev": true
+ },
+ "bach": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz",
+ "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=",
+ "dev": true,
+ "requires": {
+ "arr-filter": "1.1.2",
+ "arr-flatten": "1.1.0",
+ "arr-map": "2.0.2",
+ "array-each": "1.0.1",
+ "array-initial": "1.1.0",
+ "array-last": "1.3.0",
+ "async-done": "1.2.4",
+ "async-settle": "1.0.0",
+ "now-and-later": "2.0.0"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "binary-extensions": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
+ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
+ "dev": true
+ },
+ "binaryextensions": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-1.0.1.tgz",
+ "integrity": "sha1-HmN0iLNbWL2l9HdL+WpSEqjJB1U=",
+ "dev": true
+ },
+ "boxen": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
+ "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
+ "dev": true,
+ "requires": {
+ "ansi-align": "2.0.0",
+ "camelcase": "4.1.0",
+ "chalk": "2.4.1",
+ "cli-boxes": "1.0.0",
+ "string-width": "2.1.1",
+ "term-size": "1.2.0",
+ "widest-line": "2.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "globals": {
+ "version": "11.5.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz",
+ "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ=="
+ },
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8="
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "browser-capabilities": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/browser-capabilities/-/browser-capabilities-1.1.0.tgz",
+ "integrity": "sha512-D0AhTybfR0KbVxy1DShQut4eCeluMyJhbTgVTIxvItJKzEGG9pNvOBFZfpeCASo2z0XdfczuvSfNZe/vmNlqwQ==",
+ "requires": {
+ "@types/ua-parser-js": "0.7.32",
+ "ua-parser-js": "0.7.18"
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
+ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
+ "dev": true
+ },
+ "buffer-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
+ "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=",
+ "dev": true
+ },
+ "buffer-from": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz",
+ "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA=="
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8="
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "caller-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+ "dev": true,
+ "requires": {
+ "callsites": "0.2.0"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "callsites": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+ "dev": true
+ },
+ "camel-case": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
+ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+ "dev": true,
+ "requires": {
+ "no-case": "2.3.2",
+ "upper-case": "1.1.3"
+ }
+ },
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "2.1.1",
+ "map-obj": "1.0.1"
+ }
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "requires": {
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
+ }
+ }
+ },
+ "capture-stack-trace": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz",
+ "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=",
+ "dev": true
+ },
+ "chai": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz",
+ "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=",
+ "dev": true,
+ "requires": {
+ "assertion-error": "1.1.0",
+ "deep-eql": "0.1.3",
+ "type-detect": "1.0.0"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "chardet": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
+ "dev": true
+ },
+ "chokidar": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz",
+ "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==",
+ "dev": true,
+ "requires": {
+ "anymatch": "2.0.0",
+ "async-each": "1.0.1",
+ "braces": "2.3.2",
+ "fsevents": "1.2.3",
+ "glob-parent": "3.1.0",
+ "inherits": "2.0.3",
+ "is-binary-path": "1.0.1",
+ "is-glob": "4.0.0",
+ "normalize-path": "2.1.1",
+ "path-is-absolute": "1.0.1",
+ "readdirp": "2.1.0",
+ "upath": "1.0.5"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "ci-info": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz",
+ "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==",
+ "dev": true
+ },
+ "circular-json": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
+ "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
+ "dev": true
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clean-css": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz",
+ "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "cli-boxes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
+ "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
+ "dev": true
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "2.0.0"
+ }
+ },
+ "cli-width": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+ "dev": true
+ },
+ "clipboard": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.1.tgz",
+ "integrity": "sha512-7yhQBmtN+uYZmfRjjVjKa0dZdWuabzpSKGtyQZN+9C8xlC788SSJjOHWh7tzurfwTqTD5UDYAhIv5fRJg3sHjQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "good-listener": "1.2.2",
+ "select": "1.1.2",
+ "tiny-emitter": "2.0.2"
+ }
+ },
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wrap-ansi": "2.1.0"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "clone-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+ "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
+ "dev": true
+ },
+ "cloneable-readable": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz",
+ "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "process-nextick-args": "2.0.0",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "dev": true
+ },
+ "collection-map": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz",
+ "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=",
+ "dev": true,
+ "requires": {
+ "arr-map": "2.0.2",
+ "for-own": "1.0.0",
+ "make-iterator": "1.0.1"
+ }
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ },
+ "color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs="
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.4.1",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "requires": {
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "commander": {
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
+ "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
+ "dev": true
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "1.0.0",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6",
+ "typedarray": "0.0.6"
+ }
+ },
+ "configstore": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
+ "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==",
+ "dev": true,
+ "requires": {
+ "dot-prop": "4.2.0",
+ "graceful-fs": "4.1.11",
+ "make-dir": "1.2.0",
+ "unique-string": "1.0.0",
+ "write-file-atomic": "2.3.0",
+ "xdg-basedir": "3.0.0"
+ }
+ },
+ "convert-source-map": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
+ "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
+ },
+ "copy-props": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.3.tgz",
+ "integrity": "sha512-Q5jXiqCOvlQc1Nvy2txrVg9ZexZ0UAw9NBQ7/s3cZ7SCAm0WD7NNsLwwcy+xvNwuVBbfkF2+4SBcz1L1AWbtmw==",
+ "dev": true,
+ "requires": {
+ "each-props": "1.3.1",
+ "is-plain-object": "2.0.4"
+ }
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs="
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+ },
+ "create-error-class": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+ "dev": true,
+ "requires": {
+ "capture-stack-trace": "1.0.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "requires": {
+ "lru-cache": "4.1.2",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "lru-cache": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz",
+ "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==",
+ "requires": {
+ "pseudomap": "1.0.2",
+ "yallist": "2.1.2"
+ }
+ }
+ }
+ },
+ "crypto-random-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
+ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
+ "dev": true
+ },
+ "css-slam": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/css-slam/-/css-slam-2.1.0.tgz",
+ "integrity": "sha512-WY1C869GTC5zNMFsQUkiW+JB4TkCQ6XJC5LaCqFfVd0KiZu563/KnacaMYpCj6mSooTMGij5g809e4Lp4x+WvQ==",
+ "dev": true,
+ "requires": {
+ "command-line-args": "3.0.5",
+ "command-line-usage": "3.0.8",
+ "dom5": "3.0.0",
+ "parse5": "4.0.0",
+ "shady-css-parser": "0.1.0"
+ },
+ "dependencies": {
+ "array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-args": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-3.0.5.tgz",
+ "integrity": "sha1-W9StReeYPlwTRJGOQCgO4mk8WsA=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "find-replace": "1.0.3",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-3.0.8.tgz",
+ "integrity": "sha1-tqIJeMGzg0d/XBGlKUKLiAv+D00=",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "3.0.0",
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "table-layout": "0.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "deep-extend": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
+ "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz",
+ "integrity": "sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "test-value": "2.1.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
+ },
+ "table-layout": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.3.0.tgz",
+ "integrity": "sha1-buINxIPbNxs+XIf3BO0vfHmdLJo=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "core-js": "2.5.5",
+ "deep-extend": "0.4.2",
+ "feature-detect-es6": "1.4.0",
+ "typical": "2.6.1",
+ "wordwrapjs": "2.0.0"
+ }
+ },
+ "test-value": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
+ "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "typical": "2.6.1"
+ }
+ },
+ "wordwrapjs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-2.0.0.tgz",
+ "integrity": "sha1-q1X2leYRjak4WP3XDAU9HF4BrCA=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ }
+ }
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "dev": true,
+ "requires": {
+ "array-find-index": "1.0.2"
+ }
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI="
+ },
+ "d": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
+ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
+ "dev": true,
+ "requires": {
+ "es5-ext": "0.10.42"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+ },
+ "deep-eql": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
+ "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=",
+ "dev": true,
+ "requires": {
+ "type-detect": "0.1.1"
+ },
+ "dependencies": {
+ "type-detect": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
+ "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=",
+ "dev": true
+ }
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
+ "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w=="
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
+ },
+ "default-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz",
+ "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "default-resolution": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz",
+ "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=",
+ "dev": true
+ },
+ "define-properties": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
+ "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
+ "dev": true,
+ "requires": {
+ "foreach": "2.0.5",
+ "object-keys": "1.0.11"
+ }
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "del": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
+ "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
+ "dev": true,
+ "requires": {
+ "globby": "6.1.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.1",
+ "p-map": "1.2.0",
+ "pify": "3.0.0",
+ "rimraf": "2.6.2"
+ }
+ },
+ "delegate": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
+ "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==",
+ "dev": true,
+ "optional": true
+ },
+ "detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "diff": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz",
+ "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "dom-serializer": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
+ "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1.1.3",
+ "entities": "1.1.1"
+ },
+ "dependencies": {
+ "domelementtype": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
+ "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
+ "dev": true
+ }
+ }
+ },
+ "dom-urls": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz",
+ "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=",
+ "dev": true,
+ "requires": {
+ "urijs": "1.19.1"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "domelementtype": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
+ "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
+ "dev": true
+ },
+ "domhandler": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz",
+ "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1.3.0"
+ }
+ },
+ "domutils": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+ "dev": true,
+ "requires": {
+ "dom-serializer": "0.1.0",
+ "domelementtype": "1.3.0"
+ }
+ },
+ "dot-prop": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
+ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
+ "dev": true,
+ "requires": {
+ "is-obj": "1.0.1"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg=="
+ }
+ }
+ },
+ "duplexer": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
+ "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
+ "dev": true
+ },
+ "duplexer3": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+ "dev": true
+ },
+ "duplexify": {
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz",
+ "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==",
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6",
+ "stream-shift": "1.0.0"
+ },
+ "dependencies": {
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "requires": {
+ "once": "1.4.0"
+ }
+ }
+ }
+ },
+ "each-props": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.1.tgz",
+ "integrity": "sha1-/BOPUeOid0KG1IWOAtbn3kYt4Vg=",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4",
+ "object.defaults": "1.1.0"
+ }
+ },
+ "emitter-component": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.1.tgz",
+ "integrity": "sha1-Bl4tvtaVm/RwZ57avq95gdEAOrY=",
+ "dev": true
+ },
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "requires": {
+ "once": "1.4.0"
+ }
+ },
+ "entities": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
+ "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
+ "dev": true
+ },
+ "error-ex": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+ "requires": {
+ "is-arrayish": "0.2.1"
+ }
+ },
+ "es5-ext": {
+ "version": "0.10.42",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz",
+ "integrity": "sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA==",
+ "dev": true,
+ "requires": {
+ "es6-iterator": "2.0.3",
+ "es6-symbol": "3.1.1",
+ "next-tick": "1.0.0"
+ }
+ },
+ "es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.42",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "es6-promise": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz",
+ "integrity": "sha1-lu258v2wGZWCKyY92KratnSBgbw=",
+ "dev": true
+ },
+ "es6-symbol": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.42"
+ }
+ },
+ "es6-weak-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
+ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.42",
+ "es6-iterator": "2.0.3",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "eslint": {
+ "version": "4.19.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
+ "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "babel-code-frame": "6.26.0",
+ "chalk": "2.4.1",
+ "concat-stream": "1.6.2",
+ "cross-spawn": "5.1.0",
+ "debug": "3.1.0",
+ "doctrine": "2.1.0",
+ "eslint-scope": "3.7.1",
+ "eslint-visitor-keys": "1.0.0",
+ "espree": "3.5.4",
+ "esquery": "1.0.1",
+ "esutils": "2.0.2",
+ "file-entry-cache": "2.0.0",
+ "functional-red-black-tree": "1.0.1",
+ "glob": "7.1.2",
+ "globals": "11.5.0",
+ "ignore": "3.3.8",
+ "imurmurhash": "0.1.4",
+ "inquirer": "3.3.0",
+ "is-resolvable": "1.1.0",
+ "js-yaml": "3.11.0",
+ "json-stable-stringify-without-jsonify": "1.0.1",
+ "levn": "0.3.0",
+ "lodash": "4.17.10",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.1",
+ "natural-compare": "1.4.0",
+ "optionator": "0.8.2",
+ "path-is-inside": "1.0.2",
+ "pluralize": "7.0.0",
+ "progress": "2.0.0",
+ "regexpp": "1.1.0",
+ "require-uncached": "1.0.3",
+ "semver": "5.5.0",
+ "strip-ansi": "4.0.0",
+ "strip-json-comments": "2.0.1",
+ "table": "4.0.2",
+ "text-table": "0.2.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "globals": {
+ "version": "11.5.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz",
+ "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==",
+ "dev": true
+ },
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ }
+ }
+ }
+ }
+ },
+ "eslint-plugin-html": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-4.0.3.tgz",
+ "integrity": "sha512-ArFnlfQxwYSz/CP0zvk8Cy3MUhcDpT3o6jgO8eKD/b8ezcLVBrgkYzmMv+7S/ya+Yl9pN+Cz2tsgYp/zElkQzA==",
+ "dev": true,
+ "requires": {
+ "htmlparser2": "3.9.2"
+ }
+ },
+ "eslint-scope": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
+ "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
+ "dev": true,
+ "requires": {
+ "esrecurse": "4.2.1",
+ "estraverse": "4.2.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
+ "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
+ "dev": true
+ },
+ "espree": {
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
+ "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
+ "dev": true,
+ "requires": {
+ "acorn": "5.5.3",
+ "acorn-jsx": "3.0.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
+ "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
+ "dev": true,
+ "requires": {
+ "estraverse": "4.2.0"
+ }
+ },
+ "esrecurse": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
+ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+ "dev": true,
+ "requires": {
+ "estraverse": "4.2.0"
+ }
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
+ },
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+ "requires": {
+ "cross-spawn": "5.1.0",
+ "get-stream": "3.0.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.2",
+ "strip-eof": "1.0.0"
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "expand-range": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+ "dev": true,
+ "requires": {
+ "fill-range": "2.2.3"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "fill-range": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
+ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
+ "dev": true,
+ "requires": {
+ "is-number": "2.1.0",
+ "isobject": "2.1.0",
+ "randomatic": "1.1.7",
+ "repeat-element": "1.1.2",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "1.0.1"
+ }
+ },
+ "extend": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "external-editor": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
+ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
+ "dev": true,
+ "requires": {
+ "chardet": "0.4.2",
+ "iconv-lite": "0.4.21",
+ "tmp": "0.0.33"
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A="
+ },
+ "fancy-log": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
+ "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
+ "dev": true,
+ "requires": {
+ "ansi-gray": "0.1.1",
+ "color-support": "1.1.3",
+ "time-stamp": "1.1.0"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+ "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+ },
+ "feature-detect-es6": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/feature-detect-es6/-/feature-detect-es6-1.4.0.tgz",
+ "integrity": "sha512-7OnRV38WLydGuGcdm/fGk2SG9uo5ljslBSbPhCfEW5Gl0lX/IliaAVXYiYUBcI0UHTbepqO4T1SkJ74K8gtcDg==",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4"
+ },
+ "dependencies": {
+ "array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ }
+ }
+ },
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "file-entry-cache": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
+ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+ "dev": true,
+ "requires": {
+ "flat-cache": "1.3.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "filename-regex": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "requires": {
+ "path-exists": "2.1.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "findup-sync": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
+ "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
+ "dev": true,
+ "requires": {
+ "detect-file": "1.0.0",
+ "is-glob": "3.1.0",
+ "micromatch": "3.1.10",
+ "resolve-dir": "1.0.1"
+ }
+ },
+ "fined": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz",
+ "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "is-plain-object": "2.0.4",
+ "object.defaults": "1.1.0",
+ "object.pick": "1.3.0",
+ "parse-filepath": "1.0.2"
+ }
+ },
+ "first-chunk-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz",
+ "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=",
+ "dev": true
+ },
+ "flagged-respawn": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz",
+ "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=",
+ "dev": true
+ },
+ "flat-cache": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
+ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
+ "dev": true,
+ "requires": {
+ "circular-json": "0.3.3",
+ "del": "2.2.2",
+ "graceful-fs": "4.1.11",
+ "write": "0.2.1"
+ },
+ "dependencies": {
+ "del": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "dev": true,
+ "requires": {
+ "globby": "5.0.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.1",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "rimraf": "2.6.2"
+ }
+ },
+ "globby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+ "dev": true,
+ "requires": {
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "flush-write-stream": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz",
+ "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+ },
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "foreach": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
+ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
+ "dev": true
+ },
+ "fork-stream": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz",
+ "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=",
+ "dev": true
+ },
+ "formatio": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz",
+ "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=",
+ "dev": true,
+ "requires": {
+ "samsam": "1.1.2"
+ }
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs-mkdirp-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz",
+ "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "through2": "2.0.3"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ },
+ "fsevents": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.3.tgz",
+ "integrity": "sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nan": "2.10.0",
+ "node-pre-gyp": "0.9.1"
+ },
+ "dependencies": {
+ "abbrev": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "aproba": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "are-we-there-yet": {
+ "version": "1.1.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "delegates": "1.0.0",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chownr": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.4.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "detect-libc": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "fs-minipass": {
+ "version": "1.2.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minipass": "2.2.4"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aproba": "1.2.0",
+ "console-control-strings": "1.1.0",
+ "has-unicode": "2.0.1",
+ "object-assign": "4.1.1",
+ "signal-exit": "3.0.2",
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wide-align": "1.1.2"
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "iconv-lite": {
+ "version": "0.4.21",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safer-buffer": "2.1.2"
+ }
+ },
+ "ignore-walk": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "bundled": true,
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "bundled": true,
+ "dev": true
+ },
+ "minipass": {
+ "version": "2.2.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1",
+ "yallist": "3.0.2"
+ }
+ },
+ "minizlib": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minipass": "2.2.4"
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "needle": {
+ "version": "2.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "debug": "2.6.9",
+ "iconv-lite": "0.4.21",
+ "sax": "1.2.4"
+ }
+ },
+ "node-pre-gyp": {
+ "version": "0.9.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "detect-libc": "1.0.3",
+ "mkdirp": "0.5.1",
+ "needle": "2.2.0",
+ "nopt": "4.0.1",
+ "npm-packlist": "1.1.10",
+ "npmlog": "4.1.2",
+ "rc": "1.2.6",
+ "rimraf": "2.6.2",
+ "semver": "5.5.0",
+ "tar": "4.4.1"
+ }
+ },
+ "nopt": {
+ "version": "4.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "abbrev": "1.1.1",
+ "osenv": "0.1.5"
+ }
+ },
+ "npm-bundled": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "npm-packlist": {
+ "version": "1.1.10",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ignore-walk": "3.0.1",
+ "npm-bundled": "1.0.3"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "are-we-there-yet": "1.1.4",
+ "console-control-strings": "1.1.0",
+ "gauge": "2.7.4",
+ "set-blocking": "2.0.0"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "rc": {
+ "version": "1.2.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "deep-extend": "0.4.2",
+ "ini": "1.3.5",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "sax": {
+ "version": "1.2.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "semver": {
+ "version": "5.5.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "tar": {
+ "version": "4.4.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chownr": "1.0.1",
+ "fs-minipass": "1.2.5",
+ "minipass": "2.2.4",
+ "minizlib": "1.1.0",
+ "mkdirp": "0.5.1",
+ "safe-buffer": "5.1.1",
+ "yallist": "3.0.2"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "wide-align": {
+ "version": "1.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "string-width": "1.0.2"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true
+ },
+ "yallist": {
+ "version": "3.0.2",
+ "bundled": true,
+ "dev": true
+ }
+ }
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
+ "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-base": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+ "dev": true,
+ "requires": {
+ "glob-parent": "2.0.0",
+ "is-glob": "2.0.1"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+ "dev": true,
+ "requires": {
+ "is-glob": "2.0.1"
+ }
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ }
+ },
+ "glob-stream": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz",
+ "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "glob": "7.1.2",
+ "glob-parent": "3.1.0",
+ "is-negated-glob": "1.0.0",
+ "ordered-read-streams": "1.0.1",
+ "pumpify": "1.5.0",
+ "readable-stream": "2.3.6",
+ "remove-trailing-separator": "1.1.0",
+ "to-absolute-glob": "2.0.2",
+ "unique-stream": "2.2.1"
+ },
+ "dependencies": {
+ "to-absolute-glob": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
+ "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=",
+ "dev": true,
+ "requires": {
+ "is-absolute": "1.0.0",
+ "is-negated-glob": "1.0.0"
+ }
+ }
+ }
+ },
+ "glob-watcher": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.1.tgz",
+ "integrity": "sha512-fK92r2COMC199WCyGUblrZKhjra3cyVMDiypDdqg1vsSDmexnbYivK1kNR4QItiNXLKmGlqan469ks67RtNa2g==",
+ "dev": true,
+ "requires": {
+ "async-done": "1.2.4",
+ "chokidar": "2.0.3",
+ "just-debounce": "1.0.0",
+ "object.defaults": "1.1.0"
+ }
+ },
+ "global-dirs": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+ "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
+ "dev": true,
+ "requires": {
+ "ini": "1.3.5"
+ }
+ },
+ "global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "dev": true,
+ "requires": {
+ "global-prefix": "1.0.2",
+ "is-windows": "1.0.2",
+ "resolve-dir": "1.0.1"
+ }
+ },
+ "global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "homedir-polyfill": "1.0.1",
+ "ini": "1.3.5",
+ "is-windows": "1.0.2",
+ "which": "1.3.0"
+ }
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA=="
+ },
+ "globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+ "dev": true,
+ "requires": {
+ "array-union": "1.0.2",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "glogg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz",
+ "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==",
+ "dev": true,
+ "requires": {
+ "sparkles": "1.0.0"
+ }
+ },
+ "good-listener": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
+ "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "delegate": "3.2.0"
+ }
+ },
+ "google-closure-compiler": {
+ "version": "20180204.0.0",
+ "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20180204.0.0.tgz",
+ "integrity": "sha1-sJf/t1DGXKB6LaRp12xVHTuOIaM=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "vinyl": "2.1.0",
+ "vinyl-sourcemaps-apply": "0.2.1"
+ }
+ },
+ "got": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+ "dev": true,
+ "requires": {
+ "create-error-class": "3.0.2",
+ "duplexer3": "0.1.4",
+ "get-stream": "3.0.0",
+ "is-redirect": "1.0.0",
+ "is-retry-allowed": "1.1.0",
+ "is-stream": "1.1.0",
+ "lowercase-keys": "1.0.1",
+ "safe-buffer": "5.1.2",
+ "timed-out": "4.0.1",
+ "unzip-response": "2.0.1",
+ "url-parse-lax": "1.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
+ },
+ "graceful-readlink": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
+ "dev": true
+ },
+ "growl": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz",
+ "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=",
+ "dev": true
+ },
+ "gulp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.0.tgz",
+ "integrity": "sha1-lXZsYB2t5Kd+0+eyttwDiBtZY2Y=",
+ "dev": true,
+ "requires": {
+ "glob-watcher": "5.0.1",
+ "gulp-cli": "2.0.1",
+ "undertaker": "1.2.0",
+ "vinyl-fs": "3.0.2"
+ },
+ "dependencies": {
+ "gulp-cli": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.0.1.tgz",
+ "integrity": "sha512-RxujJJdN8/O6IW2nPugl7YazhmrIEjmiVfPKrWt68r71UCaLKS71Hp0gpKT+F6qOUFtr7KqtifDKaAJPRVvMYQ==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "1.1.0",
+ "archy": "1.0.0",
+ "array-sort": "1.0.0",
+ "color-support": "1.1.3",
+ "concat-stream": "1.6.2",
+ "copy-props": "2.0.3",
+ "fancy-log": "1.3.2",
+ "gulplog": "1.0.0",
+ "interpret": "1.1.0",
+ "isobject": "3.0.1",
+ "liftoff": "2.5.0",
+ "matchdep": "2.0.0",
+ "mute-stdout": "1.0.0",
+ "pretty-hrtime": "1.0.3",
+ "replace-homedir": "1.0.0",
+ "semver-greatest-satisfied-range": "1.1.0",
+ "v8flags": "3.0.2",
+ "yargs": "7.1.0"
+ }
+ }
+ }
+ },
+ "gulp-babel": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/gulp-babel/-/gulp-babel-6.1.3.tgz",
+ "integrity": "sha512-tm15R3rt4gO59WXCuqrwf4QXJM9VIJC+0J2NPYSC6xZn+cZRD5y5RPGAiHaDxCJq7Rz5BDljlrk3cEjWADF+wQ==",
+ "dev": true,
+ "requires": {
+ "babel-core": "6.26.3",
+ "object-assign": "4.1.1",
+ "plugin-error": "1.0.1",
+ "replace-ext": "0.0.1",
+ "through2": "2.0.3",
+ "vinyl-sourcemaps-apply": "0.2.1"
+ },
+ "dependencies": {
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "dev": true
+ }
+ }
+ },
+ "gulp-eslint": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-4.0.2.tgz",
+ "integrity": "sha512-fcFUQzFsN6dJ6KZlG+qPOEkqfcevRUXgztkYCvhNvJeSvOicC8ucutN4qR/ID8LmNZx9YPIkBzazTNnVvbh8wg==",
+ "dev": true,
+ "requires": {
+ "eslint": "4.19.1",
+ "fancy-log": "1.3.2",
+ "plugin-error": "1.0.1"
+ }
+ },
+ "gulp-if": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz",
+ "integrity": "sha1-pJe351cwBQQcqivIt92jyARE1ik=",
+ "dev": true,
+ "requires": {
+ "gulp-match": "1.0.3",
+ "ternary-stream": "2.0.1",
+ "through2": "2.0.3"
+ }
+ },
+ "gulp-match": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.0.3.tgz",
+ "integrity": "sha1-kcfA1/Kb7NZgbVfYCn+Hdqh6uo4=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "gulp-replace": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-0.6.1.tgz",
+ "integrity": "sha1-Eb+Mj85TPjPi9qjy9DC5VboL4GY=",
+ "dev": true,
+ "requires": {
+ "istextorbinary": "1.0.2",
+ "readable-stream": "2.3.6",
+ "replacestream": "4.0.3"
+ }
+ },
+ "gulp-size": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/gulp-size/-/gulp-size-3.0.0.tgz",
+ "integrity": "sha1-yxrI5rqD3t5SQwxH/QOTJPAD/4I=",
+ "dev": true,
+ "requires": {
+ "chalk": "2.4.1",
+ "fancy-log": "1.3.2",
+ "gzip-size": "4.1.0",
+ "plugin-error": "0.1.2",
+ "pretty-bytes": "4.0.2",
+ "stream-counter": "1.0.0",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "arr-diff": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
+ "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-slice": "0.2.3"
+ }
+ },
+ "arr-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
+ "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+ "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
+ "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
+ "dev": true,
+ "requires": {
+ "kind-of": "1.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
+ "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
+ "dev": true
+ },
+ "plugin-error": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
+ "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
+ "dev": true,
+ "requires": {
+ "ansi-cyan": "0.1.1",
+ "ansi-red": "0.1.1",
+ "arr-diff": "1.1.0",
+ "arr-union": "2.1.0",
+ "extend-shallow": "1.1.4"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "gulp-sourcemaps": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz",
+ "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=",
+ "dev": true,
+ "requires": {
+ "convert-source-map": "1.5.1",
+ "graceful-fs": "4.1.11",
+ "strip-bom": "2.0.0",
+ "through2": "2.0.3",
+ "vinyl": "1.2.0"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "dev": true
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ },
+ "vinyl": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
+ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.4",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ }
+ }
+ },
+ "gulp-vulcanize": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/gulp-vulcanize/-/gulp-vulcanize-7.0.0.tgz",
+ "integrity": "sha512-SnyChu0+DbCK7QWN0UStPKEG8igkv0feLfx25jLAbrEULTHmvUPhx1BF3vYz6SsA32Azxp5UoU6jNI4Q8PzBPQ==",
+ "dev": true,
+ "requires": {
+ "plugin-error": "0.1.2",
+ "safe-buffer": "5.1.2",
+ "through2": "2.0.3",
+ "vulcanize": "1.16.0"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
+ "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-slice": "0.2.3"
+ }
+ },
+ "arr-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
+ "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+ "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
+ "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
+ "dev": true,
+ "requires": {
+ "kind-of": "1.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
+ "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
+ "dev": true
+ },
+ "plugin-error": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
+ "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
+ "dev": true,
+ "requires": {
+ "ansi-cyan": "0.1.1",
+ "ansi-red": "0.1.1",
+ "arr-diff": "1.1.0",
+ "arr-union": "2.1.0",
+ "extend-shallow": "1.1.4"
+ }
+ }
+ }
+ },
+ "gulplog": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
+ "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
+ "dev": true,
+ "requires": {
+ "glogg": "1.0.1"
+ }
+ },
+ "gzip-size": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-4.1.0.tgz",
+ "integrity": "sha1-iuCWJX6r59acRb4rZ8RIEk/7UXw=",
+ "dev": true,
+ "requires": {
+ "duplexer": "0.1.1",
+ "pify": "3.0.0"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ },
+ "has-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
+ "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "he": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+ "dev": true
+ },
+ "home-or-tmp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
+ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "homedir-polyfill": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
+ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
+ "dev": true,
+ "requires": {
+ "parse-passwd": "1.0.0"
+ }
+ },
+ "hosted-git-info": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz",
+ "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw=="
+ },
+ "html-minifier": {
+ "version": "3.5.15",
+ "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.15.tgz",
+ "integrity": "sha512-OZa4rfb6tZOZ3Z8Xf0jKxXkiDcFWldQePGYFDcgKqES2sXeWaEv9y6QQvWUtX3ySI3feApQi5uCsHLINQ6NoAw==",
+ "dev": true,
+ "requires": {
+ "camel-case": "3.0.0",
+ "clean-css": "4.1.11",
+ "commander": "2.15.1",
+ "he": "1.1.1",
+ "param-case": "2.1.1",
+ "relateurl": "0.2.7",
+ "uglify-js": "3.3.23"
+ }
+ },
+ "htmlparser2": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz",
+ "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1.3.0",
+ "domhandler": "2.4.1",
+ "domutils": "1.7.0",
+ "entities": "1.1.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "hydrolysis": {
+ "version": "1.25.0",
+ "resolved": "https://registry.npmjs.org/hydrolysis/-/hydrolysis-1.25.0.tgz",
+ "integrity": "sha1-pPsUo3oeA7DbUtiqpXxoInKhTYQ=",
+ "dev": true,
+ "requires": {
+ "acorn": "3.3.0",
+ "babel-polyfill": "6.26.0",
+ "doctrine": "0.7.2",
+ "dom5": "1.1.0",
+ "escodegen": "1.9.1",
+ "espree": "3.5.4",
+ "estraverse": "3.1.0",
+ "path-is-absolute": "1.0.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz",
+ "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=",
+ "dev": true,
+ "requires": {
+ "esutils": "1.1.6",
+ "isarray": "0.0.1"
+ }
+ },
+ "dom5": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-1.1.0.tgz",
+ "integrity": "sha1-Ogx3AMCDq0xNJpOKeLDwxtzDd5Q=",
+ "dev": true,
+ "requires": {
+ "parse5": "1.5.1"
+ }
+ },
+ "estraverse": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-3.1.0.tgz",
+ "integrity": "sha1-FeKKRGuLgrxwDMyLlseK9NoNbLo=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz",
+ "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "parse5": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
+ "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=",
+ "dev": true
+ }
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.21",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz",
+ "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": "2.1.2"
+ }
+ },
+ "ignore": {
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz",
+ "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==",
+ "dev": true
+ },
+ "import-lazy": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+ "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+ "dev": true
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ },
+ "ini": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
+ },
+ "inquirer": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
+ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "3.1.0",
+ "chalk": "2.4.1",
+ "cli-cursor": "2.1.0",
+ "cli-width": "2.2.0",
+ "external-editor": "2.2.0",
+ "figures": "2.0.0",
+ "lodash": "4.17.10",
+ "mute-stream": "0.0.7",
+ "run-async": "2.3.0",
+ "rx-lite": "4.0.8",
+ "rx-lite-aggregates": "4.0.8",
+ "string-width": "2.1.1",
+ "strip-ansi": "4.0.0",
+ "through": "2.3.8"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "interpret": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
+ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "requires": {
+ "loose-envify": "1.3.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
+ },
+ "is-absolute": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
+ "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
+ "requires": {
+ "is-relative": "1.0.0",
+ "is-windows": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "1.11.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+ "requires": {
+ "builtin-modules": "1.1.1"
+ }
+ },
+ "is-ci": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz",
+ "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==",
+ "dev": true,
+ "requires": {
+ "ci-info": "1.1.3"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+ }
+ }
+ },
+ "is-dotfile": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+ "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+ "dev": true
+ },
+ "is-equal-shallow": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+ "requires": {
+ "is-primitive": "2.0.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
+ "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E="
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-installed-globally": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
+ "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
+ "dev": true,
+ "requires": {
+ "global-dirs": "0.1.1",
+ "is-path-inside": "1.0.1"
+ }
+ },
+ "is-negated-glob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz",
+ "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=",
+ "dev": true
+ },
+ "is-npm": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
+ "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
+ "dev": true
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "del": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "requires": {
+ "globby": "5.0.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.1",
+ "object-assign": "4.1.1",
+ "pinkie-promise": "2.0.1",
+ "rimraf": "2.6.2"
+ }
+ },
+ "globby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+ "requires": {
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+ "dev": true
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ=="
+ }
+ }
+ },
+ "is-path-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+ "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0="
+ },
+ "is-path-in-cwd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
+ "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
+ "requires": {
+ "is-path-inside": "1.0.1"
+ }
+ },
+ "is-path-inside": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+ "requires": {
+ "path-is-inside": "1.0.2"
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-posix-bracket": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+ "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+ "dev": true
+ },
+ "is-primitive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU="
+ },
+ "is-promise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
+ "dev": true
+ },
+ "is-redirect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+ "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
+ "dev": true
+ },
+ "is-relative": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
+ "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
+ "requires": {
+ "is-unc-path": "1.0.0"
+ }
+ },
+ "is-resolvable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
+ "dev": true
+ },
+ "is-retry-allowed": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
+ "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+ },
+ "is-unc-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
+ "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
+ "requires": {
+ "unc-path-regex": "0.1.2"
+ }
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
+ },
+ "is-valid-glob": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz",
+ "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=",
+ "dev": true
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+ },
+ "istextorbinary": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-1.0.2.tgz",
+ "integrity": "sha1-rOGTVNGpoBc+/rEITOD4ewrX3s8=",
+ "dev": true,
+ "requires": {
+ "binaryextensions": "1.0.1",
+ "textextensions": "1.0.2"
+ }
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
+ },
+ "js-yaml": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz",
+ "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==",
+ "dev": true,
+ "requires": {
+ "argparse": "1.0.10",
+ "esprima": "4.0.0"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
+ "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
+ "dev": true
+ }
+ }
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
+ },
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+ "dev": true,
+ "requires": {
+ "jsonify": "0.0.0"
+ }
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "json3": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
+ "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
+ "dev": true
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+ "dev": true
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw=="
+ },
+ "just-debounce": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz",
+ "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ },
+ "last-run": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz",
+ "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=",
+ "dev": true,
+ "requires": {
+ "default-resolution": "2.0.0",
+ "es6-weak-map": "2.0.2"
+ }
+ },
+ "latest-version": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
+ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
+ "dev": true,
+ "requires": {
+ "package-json": "4.0.1"
+ }
+ },
+ "lazypipe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lazypipe/-/lazypipe-1.0.1.tgz",
+ "integrity": "sha1-FHGu9rN6NA1Rw030Rpnc7wZMGUA=",
+ "dev": true,
+ "requires": {
+ "stream-combiner": "0.2.2"
+ }
+ },
+ "lazystream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
+ "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "requires": {
+ "invert-kv": "1.0.0"
+ }
+ },
+ "lead": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz",
+ "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=",
+ "dev": true,
+ "requires": {
+ "flush-write-stream": "1.0.3"
+ }
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "liftoff": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz",
+ "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "findup-sync": "2.0.0",
+ "fined": "1.1.0",
+ "flagged-respawn": "1.0.0",
+ "is-plain-object": "2.0.4",
+ "object.map": "1.0.1",
+ "rechoir": "0.6.2",
+ "resolve": "1.7.1"
+ }
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "strip-bom": "2.0.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ }
+ }
+ },
+ "lodash": {
+ "version": "4.17.10",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
+ },
+ "lodash._baseassign": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
+ "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
+ "dev": true,
+ "requires": {
+ "lodash._basecopy": "3.0.1",
+ "lodash.keys": "3.1.2"
+ }
+ },
+ "lodash._basecopy": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
+ "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
+ "dev": true
+ },
+ "lodash._basecreate": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz",
+ "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=",
+ "dev": true
+ },
+ "lodash._getnative": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
+ "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
+ "dev": true
+ },
+ "lodash._isiterateecall": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
+ "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
+ "dev": true
+ },
+ "lodash._reinterpolate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.create": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz",
+ "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=",
+ "dev": true,
+ "requires": {
+ "lodash._baseassign": "3.2.0",
+ "lodash._basecreate": "3.0.3",
+ "lodash._isiterateecall": "3.0.9"
+ }
+ },
+ "lodash.defaults": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+ "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
+ "dev": true
+ },
+ "lodash.isarguments": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
+ "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
+ "dev": true
+ },
+ "lodash.isarray": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
+ "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
+ "dev": true
+ },
+ "lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=",
+ "dev": true
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
+ "dev": true
+ },
+ "lodash.keys": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
+ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
+ "dev": true,
+ "requires": {
+ "lodash._getnative": "3.9.1",
+ "lodash.isarguments": "3.1.0",
+ "lodash.isarray": "3.0.4"
+ }
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.some": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz",
+ "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "lolex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz",
+ "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "dev": true,
+ "requires": {
+ "currently-unhandled": "0.4.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "lower-case": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
+ "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw="
+ },
+ "lowercase-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+ "dev": true
+ },
+ "make-dir": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz",
+ "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==",
+ "dev": true,
+ "requires": {
+ "pify": "3.0.0"
+ }
+ },
+ "make-iterator": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
+ "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
+ },
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "marked": {
+ "version": "0.3.19",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz",
+ "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==",
+ "dev": true
+ },
+ "matchdep": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz",
+ "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=",
+ "dev": true,
+ "requires": {
+ "findup-sync": "2.0.0",
+ "micromatch": "3.1.10",
+ "resolve": "1.7.1",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "matcher": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.0.tgz",
+ "integrity": "sha512-aZGv6JBTHqfqAd09jmAlbKnAICTfIvb5Z8gXVxPB5WZtFfHMaAMdACL7tQflD2V+6/8KNcY8s6DYtWLgpJP5lA==",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "2.1.0",
+ "decamelize": "1.2.0",
+ "loud-rejection": "1.6.0",
+ "map-obj": "1.0.1",
+ "minimist": "1.2.0",
+ "normalize-package-data": "2.4.0",
+ "object-assign": "4.1.1",
+ "read-pkg-up": "1.0.1",
+ "redent": "1.0.0",
+ "trim-newlines": "1.0.0"
+ }
+ },
+ "merge-stream": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
+ "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ }
+ }
+ },
+ "mocha": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz",
+ "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==",
+ "dev": true,
+ "requires": {
+ "browser-stdout": "1.3.0",
+ "commander": "2.9.0",
+ "debug": "2.6.8",
+ "diff": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "glob": "7.1.1",
+ "growl": "1.9.2",
+ "he": "1.1.1",
+ "json3": "3.3.2",
+ "lodash.create": "3.1.1",
+ "mkdirp": "0.5.1",
+ "supports-color": "3.1.2"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
+ "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
+ "dev": true,
+ "requires": {
+ "graceful-readlink": "1.0.1"
+ }
+ },
+ "debug": {
+ "version": "2.6.8",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
+ "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
+ "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz",
+ "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "mute-stdout": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.0.tgz",
+ "integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0=",
+ "dev": true
+ },
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+ "dev": true
+ },
+ "mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "requires": {
+ "any-promise": "1.3.0",
+ "object-assign": "4.1.1",
+ "thenify-all": "1.6.0"
+ }
+ },
+ "nan": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
+ "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==",
+ "dev": true,
+ "optional": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "next-tick": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
+ "dev": true
+ },
+ "no-case": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+ "dev": true,
+ "requires": {
+ "lower-case": "1.1.4"
+ }
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "dev": true,
+ "requires": {
+ "abbrev": "1.1.1"
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "2.6.0",
+ "is-builtin-module": "1.0.0",
+ "semver": "4.3.6",
+ "validate-npm-package-license": "3.0.3"
+ }
+ },
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "dev": true,
+ "requires": {
+ "remove-trailing-separator": "1.1.0"
+ }
+ },
+ "now-and-later": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz",
+ "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0"
+ }
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "requires": {
+ "path-key": "2.0.1"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-keys": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz",
+ "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=",
+ "dev": true
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.assign": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+ "dev": true,
+ "requires": {
+ "define-properties": "1.1.2",
+ "function-bind": "1.1.1",
+ "has-symbols": "1.0.0",
+ "object-keys": "1.0.11"
+ }
+ },
+ "object.defaults": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
+ "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+ "dev": true,
+ "requires": {
+ "array-each": "1.0.1",
+ "array-slice": "1.1.0",
+ "for-own": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "object.map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
+ "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
+ "dev": true,
+ "requires": {
+ "for-own": "1.0.0",
+ "make-iterator": "1.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.reduce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz",
+ "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=",
+ "dev": true,
+ "requires": {
+ "for-own": "1.0.0",
+ "make-iterator": "1.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "1.2.0"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "ordered-read-streams": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz",
+ "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "dev": true
+ },
+ "os-locale": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+ "dev": true,
+ "requires": {
+ "lcid": "1.0.0"
+ }
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "dev": true
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+ },
+ "p-map": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
+ "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
+ "dev": true
+ },
+ "package-json": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
+ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
+ "dev": true,
+ "requires": {
+ "got": "6.7.1",
+ "registry-auth-token": "3.3.2",
+ "registry-url": "3.1.0",
+ "semver": "5.5.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ }
+ }
+ },
+ "param-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
+ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+ "dev": true,
+ "requires": {
+ "no-case": "2.3.2"
+ }
+ },
+ "parse-filepath": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
+ "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
+ "dev": true,
+ "requires": {
+ "is-absolute": "1.0.0",
+ "map-cache": "0.2.2",
+ "path-root": "0.1.1"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "requires": {
+ "error-ex": "1.3.1"
+ }
+ },
+ "parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+ "dev": true
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME="
+ },
+ "path-posix": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/path-posix/-/path-posix-1.0.0.tgz",
+ "integrity": "sha1-BrJhE/Vr6rBCVFojv6iAA8ysJg8=",
+ "dev": true
+ },
+ "path-root": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
+ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+ "dev": true,
+ "requires": {
+ "path-root-regex": "0.1.2"
+ }
+ },
+ "path-root-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
+ "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
+ "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
+ "dev": true,
+ "requires": {
+ "isarray": "0.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ }
+ }
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "requires": {
+ "pinkie": "2.0.4"
+ }
+ },
+ "plugin-error": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
+ "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "1.1.0",
+ "arr-diff": "4.0.0",
+ "arr-union": "3.1.0",
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "pluralize": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
+ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.2"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-2.7.0.tgz",
+ "integrity": "sha512-yD5FYQ8thX/2vHTaEgTtCs/NSG3ko4VlEb0IjM/PFsu03lHNHnpadC1NGwKyvI9vOjcFhnw4mDEVW0lbxLo8Eg==",
+ "dev": true,
+ "requires": {
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/escodegen": "0.0.2",
+ "@types/estraverse": "0.0.6",
+ "@types/estree": "0.0.37",
+ "@types/node": "6.0.107",
+ "@types/parse5": "2.2.34",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "2.3.0",
+ "escodegen": "1.9.1",
+ "espree": "3.5.4",
+ "estraverse": "4.2.0",
+ "jsonschema": "1.2.4",
+ "parse5": "2.2.3",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.8",
+ "strip-indent": "2.0.0"
+ },
+ "dependencies": {
+ "dom5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz",
+ "integrity": "sha1-+CBJdb0NrLvltYqKk//B/tD/zSo=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "6.0.107",
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "2.2.3"
+ }
+ },
+ "parse5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz",
+ "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-build": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/polymer-build/-/polymer-build-2.5.0.tgz",
+ "integrity": "sha512-HM15aQKAWze9XW57F/5m5ByZWSG5PdxyBGPMjBEDu/c4aoA9ZIx9/aFDWlPxnXMC7AUNQuAD2EMgQ6Abp06m8g==",
+ "dev": true,
+ "requires": {
+ "@types/babel-core": "6.25.3",
+ "@types/babel-traverse": "6.25.3",
+ "@types/gulp-if": "0.0.33",
+ "@types/html-minifier": "3.5.2",
+ "@types/is-windows": "0.2.0",
+ "@types/mz": "0.0.31",
+ "@types/node": "6.0.107",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.7",
+ "@types/uuid": "3.4.3",
+ "@types/vinyl": "2.0.2",
+ "@types/vinyl-fs": "0.0.28",
+ "babel-core": "6.26.3",
+ "babel-plugin-external-helpers": "6.22.0",
+ "babel-plugin-syntax-async-functions": "6.13.0",
+ "babel-plugin-syntax-async-generators": "6.13.0",
+ "babel-plugin-syntax-dynamic-import": "6.18.0",
+ "babel-plugin-syntax-exponentiation-operator": "6.13.0",
+ "babel-plugin-syntax-export-extensions": "6.13.0",
+ "babel-plugin-syntax-object-rest-spread": "6.13.0",
+ "babel-plugin-transform-async-generator-functions": "6.24.1",
+ "babel-plugin-transform-async-to-generator": "6.24.1",
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-plugin-transform-exponentiation-operator": "6.24.1",
+ "babel-plugin-transform-object-rest-spread": "6.26.0",
+ "babel-preset-es2015": "6.24.1",
+ "babel-preset-minify": "0.3.0",
+ "babel-traverse": "6.26.0",
+ "css-slam": "2.1.0",
+ "dom5": "2.3.0",
+ "gulp-if": "2.0.2",
+ "html-minifier": "3.5.15",
+ "is-windows": "1.0.2",
+ "matcher": "1.1.0",
+ "multipipe": "1.0.2",
+ "mz": "2.7.0",
+ "parse5": "2.2.3",
+ "path-is-inside": "1.0.2",
+ "plylog": "0.5.0",
+ "polymer-analyzer": "2.7.0",
+ "polymer-bundler": "3.1.1",
+ "polymer-project-config": "3.14.0",
+ "resolve": "1.7.1",
+ "stream": "0.0.2",
+ "sw-precache": "5.2.1",
+ "uuid": "3.2.1",
+ "vinyl": "1.2.0",
+ "vinyl-fs": "2.4.4",
+ "whatwg-url": "6.4.1"
+ },
+ "dependencies": {
+ "@types/resolve": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.7.tgz",
+ "integrity": "sha512-GPewdjkb0Q76o459qgp6pBLzJj/bD3oveS2kfLhIkZ9U3t3AFKtl5DlFB6lGTw0iZmcmxoGC8lpLW3NNJKrN9A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.107"
+ }
+ },
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0"
+ }
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-helper-evaluate-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.3.0.tgz",
+ "integrity": "sha512-dRFlMTqUJRGzx5a2smKxmptDdNCXKSkPcXWzKLwAV72hvIZumrd/0z9RcewHkr7PmAEq+ETtpD1GK6wZ6ZUXzw==",
+ "dev": true
+ },
+ "babel-helper-flip-expressions": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.3.0.tgz",
+ "integrity": "sha512-kNGohWmtAG3b7tN1xocRQ5rsKkH/hpvZsMiGOJ1VwGJKhnwzR5KlB3rvKBaBPl5/IGHcopB2JN+r1SUEX1iMAw==",
+ "dev": true
+ },
+ "babel-helper-is-void-0": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.3.0.tgz",
+ "integrity": "sha512-JVqdX8y7Rf/x4NwbqtUI7mdQjL9HWoDnoAEQ8Gv8oxzjvbJv+n75f7l36m9Y8C7sCUltX3V5edndrp7Hp1oSXQ==",
+ "dev": true
+ },
+ "babel-helper-mark-eval-scopes": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.3.0.tgz",
+ "integrity": "sha512-nrho5Dg4vl0VUgURVpGpEGiwbst5JX7efIyDHFxmkCx/ocQFnrPt8ze9Kxl6TKjR29bJ7D/XKY1NMlSxOQJRbQ==",
+ "dev": true
+ },
+ "babel-helper-remove-or-void": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.3.0.tgz",
+ "integrity": "sha512-D68W1M3ibCcbg0ysh3ww4/O0g10X1CXK720oOuR8kpfY7w0yP4tVcpK7zDmI1JecynycTQYAZ1rhLJo9aVtIKQ==",
+ "dev": true
+ },
+ "babel-helper-to-multiple-sequence-expressions": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.3.0.tgz",
+ "integrity": "sha512-1uCrBD+EAaMnAYh7hc944n8Ga19y3daEnoXWPYDvFVsxMCc1l8aDjksApaCEaNSSuewq8BEcff47Cy1PbLg2Gw==",
+ "dev": true
+ },
+ "babel-plugin-minify-builtins": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.3.0.tgz",
+ "integrity": "sha512-MqhSHlxkmgURqj3144qPksbZ/qof1JWdumcbucc4tysFcf3P3V3z3munTevQgKEFNMd8F5/ECGnwb63xogLjAg==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.3.0"
+ }
+ },
+ "babel-plugin-minify-constant-folding": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.3.0.tgz",
+ "integrity": "sha512-1XeRpx+aY1BuNY6QU/cm6P+FtEi3ar3XceYbmC+4q4W+2Ewq5pL7V68oHg1hKXkBIE0Z4/FjSoHz6vosZLOe/A==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.3.0"
+ }
+ },
+ "babel-plugin-minify-dead-code-elimination": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.3.0.tgz",
+ "integrity": "sha512-SjM2Fzg85YZz+q/PNJ/HU4O3W98FKFOiP9K5z3sfonlamGOzvZw3Eup2OTiEBsbbqTeY8yzNCAv3qpJRYCgGmw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.3.0",
+ "babel-helper-mark-eval-scopes": "0.3.0",
+ "babel-helper-remove-or-void": "0.3.0",
+ "lodash.some": "4.6.0"
+ }
+ },
+ "babel-plugin-minify-flip-comparisons": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.3.0.tgz",
+ "integrity": "sha512-B8lK+ekcpSNVH7PZpWDe5nC5zxjRiiT4nTsa6h3QkF3Kk6y9qooIFLemdGlqBq6j0zALEnebvCpw8v7gAdpgnw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-is-void-0": "0.3.0"
+ }
+ },
+ "babel-plugin-minify-guarded-expressions": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.3.0.tgz",
+ "integrity": "sha512-O+6CvF5/Ttsth3LMg4/BhyvVZ82GImeKMXGdVRQGK/8jFiP15EjRpdgFlxv3cnqRjqdYxLCS6r28VfLpb9C/kA==",
+ "dev": true,
+ "requires": {
+ "babel-helper-flip-expressions": "0.3.0"
+ }
+ },
+ "babel-plugin-minify-infinity": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.3.0.tgz",
+ "integrity": "sha512-Sj8ia3/w9158DWieUxU6/VvnYVy59geeFEkVgLZYBE8EBP+sN48tHtBM/jSgz0ejEdBlcfqJ6TnvPmVXTzR2BQ==",
+ "dev": true
+ },
+ "babel-plugin-minify-mangle-names": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.3.0.tgz",
+ "integrity": "sha512-PYTonhFWURsfAN8achDwvR5Xgy6EeTClLz+fSgGRqjAIXb0OyFm3/xfccbQviVi1qDXmlSnt6oJhBg8KE4Fn7Q==",
+ "dev": true,
+ "requires": {
+ "babel-helper-mark-eval-scopes": "0.3.0"
+ }
+ },
+ "babel-plugin-minify-numeric-literals": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.3.0.tgz",
+ "integrity": "sha512-TgZj6ay8zDw74AS3yiIfoQ8vRSNJisYO/Du60S8nPV7EW7JM6fDMx5Sar6yVHlVuuwNgvDUBh191K33bVrAhpg==",
+ "dev": true
+ },
+ "babel-plugin-minify-replace": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.3.0.tgz",
+ "integrity": "sha512-VR6tTg2Lt0TicHIOw04fsUtpPw7RaRP8PC8YzSFwEixnzvguZjZJoL7TgG7ZyEWQD1cJ96UezswECmFNa815bg==",
+ "dev": true
+ },
+ "babel-plugin-minify-simplify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.3.0.tgz",
+ "integrity": "sha512-2M16ytQOCqBi7bYMu4DCWn8e6KyFCA108F6+tVrBJxOmm5u2sOmTFEa8s94tR9RHRRNYmcUf+rgidfnzL3ik9Q==",
+ "dev": true,
+ "requires": {
+ "babel-helper-flip-expressions": "0.3.0",
+ "babel-helper-is-nodes-equiv": "0.0.1",
+ "babel-helper-to-multiple-sequence-expressions": "0.3.0"
+ }
+ },
+ "babel-plugin-minify-type-constructors": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.3.0.tgz",
+ "integrity": "sha512-XRXpvsUCPeVw9YEUw+9vSiugcSZfow81oIJT0yR9s8H4W7yJ6FHbImi5DJHoL8KcDUjYnL9wYASXk/fOkbyR6Q==",
+ "dev": true,
+ "requires": {
+ "babel-helper-is-void-0": "0.3.0"
+ }
+ },
+ "babel-plugin-transform-inline-consecutive-adds": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.3.0.tgz",
+ "integrity": "sha512-iZsYAIjYLLfLK0yN5WVT7Xf7Y3wQ9Z75j9A8q/0IglQSpUt2ppTdHlwl/GeaXnxdaSmsxBu861klbTBbv2n+RA==",
+ "dev": true
+ },
+ "babel-plugin-transform-regexp-constructors": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.3.0.tgz",
+ "integrity": "sha512-h92YHzyl042rb0naKO8frTHntpRFwRgKkfWD8602kFHoQingjJNtbvZzvxqHncJ6XmKVyYvfrBpDOSkCTDIIxw==",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-undefined": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.3.0.tgz",
+ "integrity": "sha512-TYGQucc8iP3LJwN3kDZLEz5aa/2KuFrqpT+s8f8NnHsBU1sAgR3y8Opns0xhC+smyDYWscqFCKM1gbkWQOhhnw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.3.0"
+ }
+ },
+ "babel-preset-minify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.3.0.tgz",
+ "integrity": "sha512-+VV2GWEyak3eDOmzT1DDMuqHrw3VbE9nBNkx2LLVs4pH/Me32ND8DRpVDd8IRvk1xX5p75nygyRPtkMh6GIAbQ==",
+ "dev": true,
+ "requires": {
+ "babel-plugin-minify-builtins": "0.3.0",
+ "babel-plugin-minify-constant-folding": "0.3.0",
+ "babel-plugin-minify-dead-code-elimination": "0.3.0",
+ "babel-plugin-minify-flip-comparisons": "0.3.0",
+ "babel-plugin-minify-guarded-expressions": "0.3.0",
+ "babel-plugin-minify-infinity": "0.3.0",
+ "babel-plugin-minify-mangle-names": "0.3.0",
+ "babel-plugin-minify-numeric-literals": "0.3.0",
+ "babel-plugin-minify-replace": "0.3.0",
+ "babel-plugin-minify-simplify": "0.3.0",
+ "babel-plugin-minify-type-constructors": "0.3.0",
+ "babel-plugin-transform-inline-consecutive-adds": "0.3.0",
+ "babel-plugin-transform-member-expression-literals": "6.9.2",
+ "babel-plugin-transform-merge-sibling-variables": "6.9.1",
+ "babel-plugin-transform-minify-booleans": "6.9.1",
+ "babel-plugin-transform-property-literals": "6.9.1",
+ "babel-plugin-transform-regexp-constructors": "0.3.0",
+ "babel-plugin-transform-remove-console": "6.9.1",
+ "babel-plugin-transform-remove-debugger": "6.9.1",
+ "babel-plugin-transform-remove-undefined": "0.3.0",
+ "babel-plugin-transform-simplify-comparison-operators": "6.9.1",
+ "babel-plugin-transform-undefined-to-void": "6.9.1",
+ "lodash.isplainobject": "4.0.6"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "dev": true,
+ "requires": {
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.2"
+ }
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "dom5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz",
+ "integrity": "sha1-+CBJdb0NrLvltYqKk//B/tD/zSo=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "6.0.107",
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "2.2.3"
+ }
+ },
+ "duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "dev": true,
+ "requires": {
+ "is-posix-bracket": "0.1.1"
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "for-own": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-stream": {
+ "version": "5.3.5",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz",
+ "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "glob": "5.0.15",
+ "glob-parent": "3.1.0",
+ "micromatch": "2.3.11",
+ "ordered-read-streams": "0.3.0",
+ "through2": "0.6.5",
+ "to-absolute-glob": "0.1.1",
+ "unique-stream": "2.2.1"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "dev": true,
+ "requires": {
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
+ }
+ },
+ "multipipe": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-1.0.2.tgz",
+ "integrity": "sha1-zBPv2DPJzamfIk+GhGG44aP9k50=",
+ "dev": true,
+ "requires": {
+ "duplexer2": "0.1.4",
+ "object-assign": "4.1.1"
+ }
+ },
+ "nan": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
+ "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA=="
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "native-promise-only": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz",
+ "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE="
+ },
+ "natives": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.3.tgz",
+ "integrity": "sha512-BZGSYV4YOLxzoTK73l0/s/0sH9l8SHs2ocReMH1f8JYSh5FUWu4ZrKCpJdRkWXV6HFR/pZDz7bwWOVAY07q77g=="
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
+ },
+ "negotiator": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
+ },
+ "netrc": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/netrc/-/netrc-0.1.4.tgz",
+ "integrity": "sha1-a+lPysqNd63gqWcNxGCRTJRHJEQ="
+ },
+ "nice-try": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz",
+ "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA=="
+ },
+ "no-case": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+ "requires": {
+ "lower-case": "1.1.4"
+ }
+ },
+ "node-status-codes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz",
+ "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8="
+ },
+ "nodegit-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/nodegit-promise/-/nodegit-promise-4.0.0.tgz",
+ "integrity": "sha1-VyKxhPLfcycWEGSnkdLoQskWezQ="
+ },
+ "nomnom": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz",
+ "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=",
+ "requires": {
+ "chalk": "0.4.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz",
+ "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg="
+ },
+ "chalk": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz",
+ "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=",
+ "requires": {
+ "ansi-styles": "1.0.0",
+ "strip-ansi": "0.1.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz",
+ "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE="
+ }
+ }
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "requires": {
+ "abbrev": "1.1.1"
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+ "requires": {
+ "hosted-git-info": "2.6.0",
+ "is-builtin-module": "1.0.0",
+ "semver": "4.3.6",
+ "validate-npm-package-license": "3.0.3"
+ }
+ },
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "dev": true,
+ "requires": {
+ "remove-trailing-separator": "1.1.0"
+ }
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "requires": {
+ "path-key": "2.0.1"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+ "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "object-component": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
+ "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE="
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "object.defaults": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
+ "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+ "requires": {
+ "array-each": "1.0.1",
+ "array-slice": "1.1.0",
+ "for-own": "1.0.0",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "object.map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
+ "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
+ "requires": {
+ "for-own": "1.0.0",
+ "make-iterator": "1.0.1"
+ },
+ "dependencies": {
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ }
+ }
+ },
+ "object.omit": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+ "dev": true,
+ "requires": {
+ "for-own": "0.1.5",
+ "is-extendable": "0.1.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc="
+ },
+ "on-headers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
+ "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c="
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "onetime": {
+ "version": "1.1.0",
+ "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+ "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k="
+ },
+ "opn": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/opn/-/opn-3.0.3.tgz",
+ "integrity": "sha1-ttmec5n3jWXDuq/+8fsojpuFJDo=",
+ "requires": {
+ "object-assign": "4.1.1"
+ }
+ },
+ "optimist": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+ "requires": {
+ "minimist": "0.0.10",
+ "wordwrap": "0.0.3"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
+ "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
+ },
+ "wordwrap": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
+ }
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "orchestrator": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz",
+ "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=",
+ "requires": {
+ "end-of-stream": "0.1.5"
+ },
+ "dependencies": {
+ "end-of-stream": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz",
+ "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=",
+ "requires": {
+ "once": "1.3.3"
+ }
+ },
+ "once": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
+ "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=",
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ }
+ }
+ },
+ "ordered-read-streams": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz",
+ "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=",
+ "dev": true,
+ "requires": {
+ "is-stream": "1.1.0",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+ },
+ "os-locale": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+ "requires": {
+ "execa": "0.7.0",
+ "lcid": "1.0.0"
+ }
+ },
+ "os-shim": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz",
+ "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc="
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+ },
+ "p-limit": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
+ "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==",
+ "requires": {
+ "p-try": "1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "requires": {
+ "p-limit": "1.2.0"
+ }
+ },
+ "p-map": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
+ "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA=="
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
+ },
+ "package-json": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz",
+ "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=",
+ "requires": {
+ "registry-auth-token": "3.3.2",
+ "registry-url": "3.1.0"
+ }
+ },
+ "pako": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
+ "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU="
+ },
+ "param-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
+ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+ "requires": {
+ "no-case": "2.3.2"
+ }
+ },
+ "parse-filepath": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
+ "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
+ "requires": {
+ "is-absolute": "1.0.0",
+ "map-cache": "0.2.2",
+ "path-root": "0.1.1"
+ }
+ },
+ "parse-glob": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+ "dev": true,
+ "requires": {
+ "glob-base": "0.3.0",
+ "is-dotfile": "1.0.3",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "requires": {
+ "error-ex": "1.3.1"
+ }
+ },
+ "parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY="
+ },
+ "parse5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz",
+ "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=",
+ "dev": true
+ },
+ "parseqs": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
+ "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0="
+ },
+ "parseuri": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
+ "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo="
+ },
+ "parseurl": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
+ "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "requires": {
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME="
+ },
+ "path-root": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
+ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+ "requires": {
+ "path-root-regex": "0.1.2"
+ }
+ },
+ "path-root-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
+ "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0="
+ },
+ "path-to-regexp": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
+ "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
+ "requires": {
+ "isarray": "0.0.1"
+ }
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "pathval": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
+ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA="
+ },
+ "peek-stream": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz",
+ "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==",
+ "requires": {
+ "buffer-from": "1.0.0",
+ "duplexify": "3.5.4",
+ "through2": "2.0.3"
+ }
+ },
+ "pem": {
+ "version": "1.12.5",
+ "resolved": "https://registry.npmjs.org/pem/-/pem-1.12.5.tgz",
+ "integrity": "sha512-mm8gLf4ZCaY6Qdm8J4bBdHs6SO4px71FspxgC2jJ0vXf3PYNZnGhU9zITCxpzFHpLPHsHU3xRBbuXNxEWuWziQ==",
+ "requires": {
+ "os-tmpdir": "1.0.2",
+ "safe-buffer": "5.1.2",
+ "which": "1.3.0"
+ }
+ },
+ "pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "requires": {
+ "pinkie": "2.0.4"
+ }
+ },
+ "plist": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz",
+ "integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU="
+ },
+ "plugin-error": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
+ "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
+ "requires": {
+ "ansi-colors": "1.1.0",
+ "arr-diff": "4.0.0",
+ "arr-union": "3.1.0",
+ "extend-shallow": "3.0.2"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+ }
+ }
+ },
+ "pluralize": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
+ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow=="
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.2"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w=="
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.14.0.tgz",
+ "integrity": "sha512-rHKxCbb0eMrD0U9nn3PiBGXG8PcNUz9+3azl8i0FpY6SAxQdwKff0z2jbaDdpx9kJenYdfhHDGc20mFx4V8/6A==",
+ "requires": {
+ "@types/node": "9.6.12",
+ "browser-capabilities": "1.1.0",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "9.6.12",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.12.tgz",
+ "integrity": "sha512-2Z8ziWjJbvV8hHL5YcqCG9ng+/qwUlO1gB4frBD7QI5Wm1Y1iM+AEkGVEv0S5P+aDMwTtAhPJFR4rp1uqagSig=="
+ }
+ }
+ },
+ "polyserve": {
+ "version": "0.27.10",
+ "resolved": "https://registry.npmjs.org/polyserve/-/polyserve-0.27.10.tgz",
+ "integrity": "sha512-T4oguVGyz4p21UTWQ88VUB3zgyIUrPMycTpMcZwboYEvosdZqLnbULswKh/qJCaKbDReIVj6nBdt0fX6Seqjpw==",
+ "requires": {
+ "@types/mz": "0.0.29",
+ "@types/node": "9.6.11",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "browser-capabilities": "1.1.0",
+ "mz": "2.7.0",
+ "opn": "3.0.3",
+ "pem": "1.12.5",
+ "polymer-project-config": "3.14.0",
+ "resolve": "1.7.1"
+ },
+ "dependencies": {
+ "@types/mz": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/mz/-/mz-0.0.29.tgz",
+ "integrity": "sha1-vCRyjGSZc/HHhR6QM/nOUlZowns=",
+ "requires": {
+ "@types/node": "9.6.11"
+ }
+ },
+ "@types/node": {
+ "version": "9.6.11",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.11.tgz",
+ "integrity": "sha512-Zm2W8b3ouIP/rB4ZgIDBMsdi1a/5NuKG3IguCM6aUwXtT+h6g1/Lh59Td7S1QtHMRXU7AbrGRDJ7lbxW4MEDmg=="
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "requires": {
+ "@types/node": "9.6.11"
+ }
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
+ },
+ "preserve": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
+ "dev": true
+ },
+ "pretty-bytes": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz",
+ "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk="
+ },
+ "pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE="
+ },
+ "private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
+ },
+ "promisify-node": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/promisify-node/-/promisify-node-0.4.0.tgz",
+ "integrity": "sha1-MoA4dOxBF4TkeGwzmQKoeheaRpw=",
+ "requires": {
+ "nodegit-promise": "4.0.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "proxy-addr": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz",
+ "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ=="
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
+ },
+ "pump": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "once": "1.4.0"
+ }
+ },
+ "pumpify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz",
+ "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==",
+ "requires": {
+ "duplexify": "3.5.4",
+ "inherits": "2.0.3",
+ "pump": "2.0.1"
+ }
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+ },
+ "q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc="
+ },
+ "qs": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
+ },
+ "randomatic": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
+ "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "range-parser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+ "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
+ },
+ "raw-body": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
+ "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k="
+ },
+ "rc": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz",
+ "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==",
+ "requires": {
+ "deep-extend": "0.5.1",
+ "ini": "1.3.5",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "deep-extend": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
+ "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w=="
+ }
+ }
+ },
+ "read-all-stream": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz",
+ "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=",
+ "requires": {
+ "pinkie-promise": "2.0.1",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "read-chunk": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-2.1.0.tgz",
+ "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=",
+ "requires": {
+ "pify": "3.0.0",
+ "safe-buffer": "5.1.2"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
+ }
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "requires": {
+ "load-json-file": "1.1.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "1.1.0"
+ }
+ },
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "dev": true
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ },
+ "unique-stream": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
+ "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
+ "dev": true,
+ "requires": {
+ "json-stable-stringify": "1.0.1",
+ "through2-filter": "2.0.0"
+ }
+ },
+ "vinyl": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
+ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.4",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+ "dev": true
+ }
+ }
+ },
+ "vinyl-fs": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz",
+ "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=",
+ "dev": true,
+ "requires": {
+ "duplexify": "3.5.4",
+ "glob-stream": "5.3.5",
+ "graceful-fs": "4.1.11",
+ "gulp-sourcemaps": "1.6.0",
+ "is-valid-glob": "0.3.0",
+ "lazystream": "1.0.0",
+ "lodash.isequal": "4.5.0",
+ "merge-stream": "1.0.1",
+ "mkdirp": "0.5.1",
+ "object-assign": "4.1.1",
+ "readable-stream": "2.3.6",
+ "strip-bom": "2.0.0",
+ "strip-bom-stream": "1.0.0",
+ "through2": "2.0.3",
+ "through2-filter": "2.0.0",
+ "vali-date": "1.0.0",
+ "vinyl": "1.2.0"
+ }
+ }
+ }
+ },
+ "polymer-bundler": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/polymer-bundler/-/polymer-bundler-3.1.1.tgz",
+ "integrity": "sha512-a/MItYr/rTRZ8Ymj5npmoAAm89RC5hRh4yz8bs22GyMn+NlE7HqJ4EzLrPkyRWlOyBhbhYFPx2Zot8PlaWXvmQ==",
+ "dev": true,
+ "requires": {
+ "clone": "2.1.1",
+ "command-line-args": "3.0.5",
+ "command-line-usage": "3.0.8",
+ "dom5": "2.3.0",
+ "espree": "3.5.4",
+ "mkdirp": "0.5.1",
+ "parse5": "2.2.3",
+ "polymer-analyzer": "2.7.0",
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-args": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-3.0.5.tgz",
+ "integrity": "sha1-W9StReeYPlwTRJGOQCgO4mk8WsA=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "find-replace": "1.0.3",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-3.0.8.tgz",
+ "integrity": "sha1-tqIJeMGzg0d/XBGlKUKLiAv+D00=",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "3.0.0",
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "table-layout": "0.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "deep-extend": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
+ "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
+ "dev": true
+ },
+ "dom5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz",
+ "integrity": "sha1-+CBJdb0NrLvltYqKk//B/tD/zSo=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "6.0.107",
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "2.2.3"
+ }
+ },
+ "find-replace": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz",
+ "integrity": "sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "test-value": "2.1.0"
+ }
+ },
+ "parse5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz",
+ "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "readdirp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
+ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "minimatch": "3.0.4",
+ "readable-stream": "2.3.6",
+ "set-immediate-shim": "1.0.1"
+ }
+ },
+ "rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+ "requires": {
+ "resolve": "1.7.1"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "requires": {
+ "indent-string": "2.1.0"
+ }
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerate": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
+ "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg=="
+ },
+ "regenerate-unicode-properties": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-5.1.3.tgz",
+ "integrity": "sha512-Yjy6t7jFQczDhYE+WVm7pg6gWYE258q4sUkk9qDErwXJIqx7jU9jGrMFHutJK/SRfcg7MEkXjGaYiVlOZyev/A==",
+ "requires": {
+ "regenerate": "1.3.3"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+ },
+ "regenerator-transform": {
+ "version": "0.12.3",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.12.3.tgz",
+ "integrity": "sha512-y2uxO/6u+tVmtEDIKo+tLCtI0GcbQr0OreosKgCd7HP4VypGjtTrw79DezuwT+W5QX0YWuvpeBOgumrepwM1kA==",
+ "requires": {
+ "private": "0.1.8"
+ }
+ },
+ "regex-cache": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+ "requires": {
+ "is-equal-shallow": "0.1.3"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "regexpp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
+ "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw=="
+ },
+ "regexpu-core": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.1.3.tgz",
+ "integrity": "sha512-mB+njEzO7oezA57IbQxxd6fVPOeWKDmnGvJ485CwmfNchjHe5jWwqKepapmzUEj41yxIAqOg+C4LbXuJlkiO8A==",
+ "requires": {
+ "regenerate": "1.3.3",
+ "regenerate-unicode-properties": "5.1.3"
+ }
+ },
+ "registry-auth-token": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
+ "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
+ "requires": {
+ "rc": "1.2.7",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "registry-url": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+ "requires": {
+ "rc": "1.2.7"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.3.0.tgz",
+ "integrity": "sha1-buINxIPbNxs+XIf3BO0vfHmdLJo=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "core-js": "2.5.5",
+ "deep-extend": "0.4.2",
+ "feature-detect-es6": "1.4.0",
+ "typical": "2.6.1",
+ "wordwrapjs": "2.0.0"
+ }
+ },
+ "test-value": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
+ "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "typical": "2.6.1"
+ }
+ },
+ "wordwrapjs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-2.0.0.tgz",
+ "integrity": "sha1-q1X2leYRjak4WP3XDAU9HF4BrCA=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ }
+ }
+ },
+ "polymer-cli": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/polymer-cli/-/polymer-cli-1.7.0.tgz",
+ "integrity": "sha512-/Lm3D+h3BK9cHrBe3+k+37Rf3WvEHG3mo59mKcb8Gc4JunYSUkYEBy2YsX0nP/Zfj2Bw/NY0jdPV4omIWZGRMQ==",
+ "dev": true,
+ "requires": {
+ "@types/chalk": "0.4.31",
+ "@types/del": "3.0.1",
+ "@types/findup-sync": "0.3.29",
+ "@types/globby": "6.1.0",
+ "@types/inquirer": "0.0.32",
+ "@types/merge-stream": "1.1.0",
+ "@types/mz": "0.0.31",
+ "@types/request": "2.0.3",
+ "@types/resolve": "0.0.4",
+ "@types/rimraf": "0.0.28",
+ "@types/semver": "5.5.0",
+ "@types/temp": "0.8.32",
+ "@types/update-notifier": "1.0.3",
+ "@types/vinyl": "2.0.2",
+ "@types/vinyl-fs": "0.0.28",
+ "@types/yeoman-generator": "1.0.4",
+ "bower": "1.8.2",
+ "bower-json": "0.8.1",
+ "bower-logger": "0.2.2",
+ "chalk": "1.1.3",
+ "chokidar": "1.7.0",
+ "command-line-args": "3.0.5",
+ "command-line-commands": "1.0.4",
+ "command-line-usage": "3.0.8",
+ "del": "3.0.0",
+ "findup-sync": "0.4.3",
+ "github": "7.3.2",
+ "globby": "8.0.1",
+ "gunzip-maybe": "1.4.1",
+ "inquirer": "1.2.3",
+ "merge-stream": "1.0.1",
+ "mz": "2.7.0",
+ "plylog": "0.5.0",
+ "polymer-analyzer": "3.0.0",
+ "polymer-build": "3.0.0",
+ "polymer-bundler": "4.0.0",
+ "polymer-linter": "3.0.0",
+ "polymer-project-config": "4.0.0",
+ "polyserve": "0.27.11",
+ "request": "2.85.0",
+ "rimraf": "2.6.2",
+ "semver": "5.5.0",
+ "tar-fs": "1.16.2",
+ "temp": "0.8.3",
+ "update-notifier": "1.0.3",
+ "validate-element-name": "2.1.1",
+ "vinyl": "1.2.0",
+ "vinyl-fs": "2.4.4",
+ "web-component-tester": "6.6.0",
+ "yeoman-environment": "1.6.6",
+ "yeoman-generator": "1.1.1"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.46.tgz",
+ "integrity": "sha512-7BKRkmYaPZm3Yff5HGZJKCz7RqZ5jUjknsXT6Gz5YKG23J3uq9hAj0epncCB0rlqmnZ8Q+UUpQB2tCR5mT37vw==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "7.0.0-beta.46"
+ }
+ },
+ "@babel/core": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.0.0-beta.46.tgz",
+ "integrity": "sha512-lCDbBSAhNAt+nL98xbgWmuhgrIxKvbvFHf73zlNCuXCHJkdlo7qzTofYK0ZWb+OVce8fQ17fC7DwTIhAwowzMw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.46",
+ "@babel/generator": "7.0.0-beta.46",
+ "@babel/helpers": "7.0.0-beta.46",
+ "@babel/template": "7.0.0-beta.46",
+ "@babel/traverse": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46",
+ "babylon": "7.0.0-beta.46",
+ "convert-source-map": "1.5.1",
+ "debug": "3.1.0",
+ "json5": "0.5.1",
+ "lodash": "4.17.10",
+ "micromatch": "2.3.11",
+ "resolve": "1.7.1",
+ "semver": "5.5.0",
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz",
+ "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/generator": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.46.tgz",
+ "integrity": "sha512-5VfaEVkPG0gpNSTcf70jvV+MjbMoNn4g2iluwM7MhciedkolEtmG7PcdoUj5W1EmMfngz5cF65V7UMZXJO6y8Q==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.46",
+ "jsesc": "2.5.1",
+ "lodash": "4.17.10",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "@babel/helper-annotate-as-pure": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0-beta.46.tgz",
+ "integrity": "sha512-ej5W347ghJF1p2TM3VcEyds1+o1uy1apaQcHrYFJPus2xCgn5KkHPkBGf+6euLfFaQDtB+eWPVKjiZx/hpYXvA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.0.0-beta.46.tgz",
+ "integrity": "sha512-ZCQ62KqFC5R3NPe5ug9pVqIHYJNup8UdEbE4IXw+s7zr4D/7AsKSt3pXA+FbML5AnQXeCSOuUWioggGmKuDV5g==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-explode-assignable-expression": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-call-delegate": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.0.0-beta.46.tgz",
+ "integrity": "sha512-7nhBu/MBlpvZLQsmw/C7VxN14wph+yp+1yxzPEd2oTsHg3oA73tHyguQ6wbtkw+9f1AZtP7ZJCLQ+nGLprF4Fw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-hoist-variables": "7.0.0-beta.46",
+ "@babel/traverse": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-define-map": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.0.0-beta.35.tgz",
+ "integrity": "sha512-bS+6/gvj/iq4TtGZuL2//X7RunihWjS+Hp2o/3cPopvU3CK9IPFPpPZc7NiqjPcvlUc47lzHRO+uk77GBONojQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-function-name": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35",
+ "lodash": "4.17.10"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.35.tgz",
+ "integrity": "sha512-l0SE8cl9DUIY4hYAFAKTLX3F2Yr14Qri7uTsuI7iegB5E4KyQy4XY72L3VOxmj6kwR/RDQURoKYr2NzyETGo7A==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.4.1",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.35.tgz",
+ "integrity": "sha512-+216NxQ7/Lvj+iehFBKEhYU/BQ1aqHTWz1bxCDiQWms0qi23iqHA4r+WdRKW/o5dAV5mlTUL4nCBFaNx8LNnRQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "7.0.0-beta.35",
+ "@babel/template": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.35.tgz",
+ "integrity": "sha512-8co9nT1MgbNoGl6too2/jwldu5F7O1rMi+/QsM9bmFuCu76rU5okFWi4cb4Uv0WXZ4BWk6x+Lpdzzu7EgvkAwA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/template": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.35.tgz",
+ "integrity": "sha512-NLd3Dfs8hmkxPvaD8ohNtEp9WXp48lxpW//6fXcT9bJWIO3isrH3OTYL9kjX7xFPPasJ1E9bUNSaPFUUgvPZSQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35",
+ "babylon": "7.0.0-beta.35",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/types": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.35.tgz",
+ "integrity": "sha512-y9XT11CozHDgjWcTdxmhSj13rJVXpa5ZXwjjOiTedjaM0ba5ItqdS02t31EhPl7HtOWxsZkYCCUNrSfrOisA6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "2.0.0"
+ }
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.35.tgz",
+ "integrity": "sha512-Y2o5scalPPlI6eOYMat6iqoM8akjqkAv9cXUN/7YNe3FANAsAGcF5L2u6XiUtBECvhyf7LeZYyzNYnjk43Vffg==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "@babel/helper-explode-assignable-expression": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.0.0-beta.46.tgz",
+ "integrity": "sha512-SW1OUmx2fC2SqL7+vF1N72FITbPuEWGdr/Gm7I3Vqs8p8T1dfGwB9YFsD+tTpfagKXVMiCCuQ06+G0FB8uxg6Q==",
+ "dev": true,
+ "requires": {
+ "@babel/traverse": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.46.tgz",
+ "integrity": "sha512-zm4Kc5XB2njGs8PkmjV1zE/g1hBuphbh+VcDyFLaQsxkxSFSUtCbKwFL8AQpL/qPIcGbvX1MBt50a/3ZZH2CQA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "7.0.0-beta.46",
+ "@babel/template": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.46.tgz",
+ "integrity": "sha512-dPrTb7QHVx44xJLjUl3LGAc13iS7hdXdO0fiOxdRN1suIS91yGGgeuwiQBlrw5SxbFchYtwenhlKbqHdVfGyVA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-hoist-variables": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0-beta.46.tgz",
+ "integrity": "sha512-9xDHLfaVA445mcHU2OEPwEddiyS0Zxao2WObFR2L/SK5MNOPj2VqVCvivYrO2OpzhnLLCTbOfXRmrwrc9WYN6Q==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-member-expression-to-functions": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0-beta.46.tgz",
+ "integrity": "sha512-Xb5iVUHXY8yz4pgGBvtuS1kxZH1oUYcxTcbIW8NFRvgpeH3Zcv4me02bbixsk7nhn8ttE79Lr1g4vrem4k5Z3Q==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.46.tgz",
+ "integrity": "sha512-xjgpwrqHiKCZgAcqsNIpZ9kOCC5Ty/VYN1H07v21HbAf/dl0/HeUA0taz3EFv6/7lRgS3qThawTSG0POJQX9vQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.46",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.0.0-beta.46.tgz",
+ "integrity": "sha512-IckoWSub3PHNvkWcUEWfKBe8pFUdMhsZMFDcaovcLb+gfxL/zZhQYwedKKKwbzVGIk9k44yjeMQ/OJd4yt4FGQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "7.0.0-beta.46",
+ "@babel/helper-simple-access": "7.0.0-beta.46",
+ "@babel/helper-split-export-declaration": "7.0.0-beta.46",
+ "@babel/template": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/helper-optimise-call-expression": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0-beta.35.tgz",
+ "integrity": "sha512-hr/P3XTAtN5wppGLP4yrOUbvIyOQPmEG6EVsCSE5z0yUueNQzuCxXp0v7sx7/V+c0eP3XLy/lVsuM96cS3VUKQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.35"
+ },
+ "dependencies": {
+ "@babel/types": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.35.tgz",
+ "integrity": "sha512-y9XT11CozHDgjWcTdxmhSj13rJVXpa5ZXwjjOiTedjaM0ba5ItqdS02t31EhPl7HtOWxsZkYCCUNrSfrOisA6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "2.0.0"
+ }
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "@babel/helper-plugin-utils": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0-beta.46.tgz",
+ "integrity": "sha512-eRTFH+/1rqDfzx+Z//CYk4TNwhfPQpM/TCs4CmHu2DwCPrqFnKUZLI1KgStfLf//c8FdOqx/U9EPec7s8CbUIA==",
+ "dev": true
+ },
+ "@babel/helper-regex": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0-beta.46.tgz",
+ "integrity": "sha512-sPDHBt8Y4i6y9rwtxWMvcprlVHAZOOQK5xpS2Nw2q9QEDHRHwVbEpE6EejoUStSclnfJpPK/7ijFgypwc6rXlA==",
+ "dev": true,
+ "requires": {
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/helper-remap-async-to-generator": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.0.0-beta.46.tgz",
+ "integrity": "sha512-YrqQ98z8AMZx8f2PGJ4YV1MkXtj+qbwbFV7MOLTiavGSFY7UrN4uQfhKEJ/4GUf4QZdTr5NEmRt0AJrWno8y8w==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "7.0.0-beta.46",
+ "@babel/helper-wrap-function": "7.0.0-beta.46",
+ "@babel/template": "7.0.0-beta.46",
+ "@babel/traverse": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-replace-supers": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0-beta.35.tgz",
+ "integrity": "sha512-ez6sOMdXeFzGlg2Qbyi//2nbBrftC7RzMpN671Hd87ITP2af3feEWYEKC5O0EXLCcgaNBzNntkScRGV9ez03wg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-optimise-call-expression": "7.0.0-beta.35",
+ "@babel/template": "7.0.0-beta.35",
+ "@babel/traverse": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.35.tgz",
+ "integrity": "sha512-l0SE8cl9DUIY4hYAFAKTLX3F2Yr14Qri7uTsuI7iegB5E4KyQy4XY72L3VOxmj6kwR/RDQURoKYr2NzyETGo7A==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.4.1",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.35.tgz",
+ "integrity": "sha512-+216NxQ7/Lvj+iehFBKEhYU/BQ1aqHTWz1bxCDiQWms0qi23iqHA4r+WdRKW/o5dAV5mlTUL4nCBFaNx8LNnRQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "7.0.0-beta.35",
+ "@babel/template": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.35.tgz",
+ "integrity": "sha512-8co9nT1MgbNoGl6too2/jwldu5F7O1rMi+/QsM9bmFuCu76rU5okFWi4cb4Uv0WXZ4BWk6x+Lpdzzu7EgvkAwA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/template": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.35.tgz",
+ "integrity": "sha512-NLd3Dfs8hmkxPvaD8ohNtEp9WXp48lxpW//6fXcT9bJWIO3isrH3OTYL9kjX7xFPPasJ1E9bUNSaPFUUgvPZSQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35",
+ "babylon": "7.0.0-beta.35",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.35.tgz",
+ "integrity": "sha512-oj2mjz/20iiDt+X0mlzE2IEkzLyM0nmT1zSUy/6i6vyzitVeoyRaHoM7O81gmAHSfBSqyjWRU0OuD9VIUgj8Vg==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.35",
+ "@babel/helper-function-name": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35",
+ "babylon": "7.0.0-beta.35",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/types": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.35.tgz",
+ "integrity": "sha512-y9XT11CozHDgjWcTdxmhSj13rJVXpa5ZXwjjOiTedjaM0ba5ItqdS02t31EhPl7HtOWxsZkYCCUNrSfrOisA6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "2.0.0"
+ }
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.35.tgz",
+ "integrity": "sha512-Y2o5scalPPlI6eOYMat6iqoM8akjqkAv9cXUN/7YNe3FANAsAGcF5L2u6XiUtBECvhyf7LeZYyzNYnjk43Vffg==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.0.0-beta.46.tgz",
+ "integrity": "sha512-1OEjV/Qnl4u8Dg+jQIYf1TgnfdrYIrdrF7yZwp9mSgsVX2PCyLe7JNTqZ/5v/5RzlF6S+GTe9agkj+EFFTcZUw==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.46.tgz",
+ "integrity": "sha512-UT7acgV7wsnBPwnqslqcnUFvsPBP4TtVaYM82xPGA7+evAa8q8HXOmFk08qsMK/pX/yy4+51gJJwyw2zofnacA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-wrap-function": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.0.0-beta.46.tgz",
+ "integrity": "sha512-W87M4bP6veTKK66OjzV/rU47tjsWmKj9J0J5BDmxq5BIJB1M13ouQ2FAURa4jGHwjPFWN3D5njBrsrifSOHzbQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-function-name": "7.0.0-beta.46",
+ "@babel/template": "7.0.0-beta.46",
+ "@babel/traverse": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helpers": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.0.0-beta.46.tgz",
+ "integrity": "sha512-mbpH9pM3pJzo/tBr75U+zva3pqpyivogt1aofgEoD7bWFAYSuqOudRuz+m4XP6VPxxLoxcA4SFPGkuLRt9+7nQ==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "7.0.0-beta.46",
+ "@babel/traverse": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.46.tgz",
+ "integrity": "sha512-r4snW6Q8ICL3Y8hGzYJRvyG/+sc+kvkewXNedG9tQjoHmUFMwMSv/o45GWQUQswevGnWghiGkpRPivFfOuMsOA==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.4.1",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "@babel/plugin-external-helpers": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.0.0-beta.46.tgz",
+ "integrity": "sha512-ajlMWy4VZ/aOUl7Z5UPy8AKtm1AHu6oEw6WiZCspjSYU6PlwiwuU3ofqcPXOaSjK+3SBFT6zViq1iF8ZxzYYxg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-proposal-async-generator-functions": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.0.0-beta.46.tgz",
+ "integrity": "sha512-htHMsLBYkM89CplqHTbbemVvzTXXyXkpihetJZUTPpSayfxEd6oIH5uSM91efcf5Rog+1SC0Oq32q9yF/4W3ig==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46",
+ "@babel/helper-remap-async-to-generator": "7.0.0-beta.46",
+ "@babel/plugin-syntax-async-generators": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-proposal-object-rest-spread": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0-beta.46.tgz",
+ "integrity": "sha512-viGuWOgFT/Tbnn3sYi3g9iJcC3ql7bSjxDs+d+GFgyf3eV2qNIKO/6I+PJAD35fGqDGGBrQhlA6HvW0FzQVtoA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46",
+ "@babel/plugin-syntax-object-rest-spread": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-syntax-async-generators": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0-beta.46.tgz",
+ "integrity": "sha512-igLQzZYcSrY/W3eACq6Nrf9u9mfw7m5G6+JeTZlyI7w0z+upGvWvrpTaAP1Gni6MckQkx5q+pspgpV+/5ioPXg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-syntax-dynamic-import": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.0.0-beta.46.tgz",
+ "integrity": "sha512-D4ek6tZa80NgaTSprPOVxj8vxjChh6UCWgCT/ZvCwAa6CBe3iqUCuOwZQLjU41aDdeuR7C02wxl3rcb25wCRLA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-syntax-import-meta": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.0.0-beta.46.tgz",
+ "integrity": "sha512-/vOa4lDBN8CpJr9MwdavcZKwqX7ueul5KwSWrxhY6rwkpq0z50vlNoWWShzDMOmQ0VWV8B6T/mV3GEOofUzh/g==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0-beta.46.tgz",
+ "integrity": "sha512-MMv6WG69jmcSLXdUeHvoev5RkuP/QuJZwCB4jXp2gtss//avs4Sns+t0VpGKTf9umhvRq44HFO6PVjVG85F+/Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-arrow-functions": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0-beta.46.tgz",
+ "integrity": "sha512-GgeFCCMHXWRkPDXWKin76qiZh+DAYdQShmk8SmzDj6IAgPHyNqkxHN/8gsmNe5/7IWFFOKUuM9TNU7fgY7z7Gg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-async-to-generator": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.0.0-beta.46.tgz",
+ "integrity": "sha512-obykYLqAd3tujTjHYE+dln5+nDhm+R5FmUcxXFr/Mx6LK1NgrTQ9TdPPOcMCD08r8SDljFpMopuz9upN/xJlbw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "7.0.0-beta.46",
+ "@babel/helper-plugin-utils": "7.0.0-beta.46",
+ "@babel/helper-remap-async-to-generator": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0-beta.46.tgz",
+ "integrity": "sha512-0paq0AtTp3TXbXdzWwsL8ddacmo/g/14IgIZgs5BzUTrfROKQThYVccEBPqRnprTgvM0JXyDVfNSgLB4akCTjg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-block-scoping": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0-beta.46.tgz",
+ "integrity": "sha512-7OwS0ObI6nLacEKP1HCdnoIQnHBqOV6IgtKGiPO+Nj03OnZ1Yo2aeK9sfOtwL43aNztnKqFVt2L5PfZg4VGidA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/plugin-transform-classes": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.0.0-beta.35.tgz",
+ "integrity": "sha512-D71nw+Brh7IWSHiW4/JDux5EhT4gyMYG1WJVjaXl6D6DQhOFlZf5otUVrVX6IxEQaco3B2dlEBDEt/UXvf9E2Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "7.0.0-beta.35",
+ "@babel/helper-define-map": "7.0.0-beta.35",
+ "@babel/helper-function-name": "7.0.0-beta.35",
+ "@babel/helper-optimise-call-expression": "7.0.0-beta.35",
+ "@babel/helper-replace-supers": "7.0.0-beta.35"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.35.tgz",
+ "integrity": "sha512-l0SE8cl9DUIY4hYAFAKTLX3F2Yr14Qri7uTsuI7iegB5E4KyQy4XY72L3VOxmj6kwR/RDQURoKYr2NzyETGo7A==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.4.1",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "@babel/helper-annotate-as-pure": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0-beta.35.tgz",
+ "integrity": "sha512-bc2idaE5XgHlyZX7TT+9ij2hhUFa21KVffQY6FTwDRT8BgqgFhIzLMFLRfk7Bd9jj+YwuydHCbdp5jXbeGFfRg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.35.tgz",
+ "integrity": "sha512-+216NxQ7/Lvj+iehFBKEhYU/BQ1aqHTWz1bxCDiQWms0qi23iqHA4r+WdRKW/o5dAV5mlTUL4nCBFaNx8LNnRQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "7.0.0-beta.35",
+ "@babel/template": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.35.tgz",
+ "integrity": "sha512-8co9nT1MgbNoGl6too2/jwldu5F7O1rMi+/QsM9bmFuCu76rU5okFWi4cb4Uv0WXZ4BWk6x+Lpdzzu7EgvkAwA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/template": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.35.tgz",
+ "integrity": "sha512-NLd3Dfs8hmkxPvaD8ohNtEp9WXp48lxpW//6fXcT9bJWIO3isrH3OTYL9kjX7xFPPasJ1E9bUNSaPFUUgvPZSQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35",
+ "babylon": "7.0.0-beta.35",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/types": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.35.tgz",
+ "integrity": "sha512-y9XT11CozHDgjWcTdxmhSj13rJVXpa5ZXwjjOiTedjaM0ba5ItqdS02t31EhPl7HtOWxsZkYCCUNrSfrOisA6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "2.0.0"
+ }
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.35.tgz",
+ "integrity": "sha512-Y2o5scalPPlI6eOYMat6iqoM8akjqkAv9cXUN/7YNe3FANAsAGcF5L2u6XiUtBECvhyf7LeZYyzNYnjk43Vffg==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "@babel/plugin-transform-computed-properties": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0-beta.46.tgz",
+ "integrity": "sha512-0ne9TL53fXH+cBI591R1JSpPhu0d2Wd9dbD8jLCJFV4tlMfqQ+Rcm65RhWWqjEBZfGv2+FuOnwB4HJRHakdW+Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-destructuring": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0-beta.46.tgz",
+ "integrity": "sha512-l9x0+T29Njwp6smLbTIU2HG2s4ROd9DAIQcfciEfpjAqscXEst0M4X9+UvjQsuaOgPFmQTdAn9xOwNFXnRP7Tg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-duplicate-keys": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0-beta.46.tgz",
+ "integrity": "sha512-mP2+3QQ+ArIMX98zVYSC9XBzV7A/Pxbz+2hPcEAGVeakFYm5AeTkcVHRQzzA21v4ecl0L5LE1XWX9yeK643CWw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.0.0-beta.46.tgz",
+ "integrity": "sha512-acomgoNW/fwWSmBlhH22C9Eyl1Y/vADBSqzyIRWJGpm4frLhd49QQgKXbRGRHUDxyifXuZDF9+3pRhEmi7/HXA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "7.0.0-beta.46",
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-for-of": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0-beta.46.tgz",
+ "integrity": "sha512-a1gpwuO26szyz5K2FrRrI5nUDgvkaJfZ7GeDtFAH8XyrK/pNdtpW/7DFCf1PdQc6SbEMM/1QXsH7Y2YRkWoTeA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-function-name": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.0.0-beta.46.tgz",
+ "integrity": "sha512-XyxSW1jm7WKOoPYHUJA0mbOkDFdlHzGR4DzlWAEwXrzEI5ep0ZP1AttAbVkxsF63XG8p2t9VtKlgbyBq4Tyr7A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-function-name": "7.0.0-beta.46",
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-instanceof": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-instanceof/-/plugin-transform-instanceof-7.0.0-beta.46.tgz",
+ "integrity": "sha512-yMde/XDsS8ONNoI+QsT3RR/0Lrq5yKYEVZxMxsm+naKN/n1+CiG6sN9USAzF6qy+XC4uRTJ5gpDZu0CtDnh0qA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-literals": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0-beta.46.tgz",
+ "integrity": "sha512-Uuo7pRsBkrLrDg6XpOAMfwhKw56SB5qVBniUVM04uf8wf92S2Z5tSPNNfn1iTgphuckAO9vg86l2XJ0Y/QD4YQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-modules-amd": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.0.0-beta.46.tgz",
+ "integrity": "sha512-GNp7F3EqJlQIMY9sfoDS03P7EHa/+Bdy6PUugTIo1TjZQUnCy3JbeL2YGI4tU8XOHJGHiBKRjFMpeOsjOSmMtw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-transforms": "7.0.0-beta.46",
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-object-super": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.0.0-beta.46.tgz",
+ "integrity": "sha512-T+TV4rRuTubvjqEwBF5xib3vnfJgjQ62qJqHprTaJDBtF0ofpbv/A6x86EEr51iPymHc84eM+F1zyFEtJvKYwQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46",
+ "@babel/helper-replace-supers": "7.0.0-beta.46"
+ },
+ "dependencies": {
+ "@babel/helper-optimise-call-expression": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0-beta.46.tgz",
+ "integrity": "sha512-PVd7/PGxi82pEKyuDcEpMmlenMLhJCII3lIK4MhXGWrT/6cNMpY6ob5rWOarpXgZjy+JNI5uLPOce28bqq0Wtw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-replace-supers": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0-beta.46.tgz",
+ "integrity": "sha512-FSpK3QKzb58oMEccanHzg1djsYHhGARl08i8BQGBoOyHS6Df+4/8bsQiTnc59Dz5sJoZdb67nKKFjgMsMYi6Kg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-member-expression-to-functions": "7.0.0-beta.46",
+ "@babel/helper-optimise-call-expression": "7.0.0-beta.46",
+ "@babel/traverse": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46"
+ }
+ }
+ }
+ },
+ "@babel/plugin-transform-parameters": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.0.0-beta.46.tgz",
+ "integrity": "sha512-RnkdYrayTlQ0VFoyIjvY/cCp/1lJJkYE2lFcRNg6+Skd3g41PnocsHhQ5NUQjMNogL+RnNan3S/2S/i7S4zm+Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-call-delegate": "7.0.0-beta.46",
+ "@babel/helper-get-function-arity": "7.0.0-beta.46",
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-regenerator": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0-beta.46.tgz",
+ "integrity": "sha512-P6d8ckSjKlbr/1SL1NBO6ieFxSebTiRWd2R8/styUIizJWQlEB0ITQ7l8vv3jXGjJ0mh7lxBTegXejRkTGKKgw==",
+ "dev": true,
+ "requires": {
+ "regenerator-transform": "0.12.3"
+ }
+ },
+ "@babel/plugin-transform-shorthand-properties": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0-beta.46.tgz",
+ "integrity": "sha512-1QkKFWPsjrvMppycLwjPBXF+usSnGvbTxGe0Q+eIzcZyhabwGCsCgkmDIKMisPSAi6F7bM5H1S8VbE85IW3oRg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-spread": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0-beta.46.tgz",
+ "integrity": "sha512-R0GvFdJnFrgTlmZfFtCXk81uvq5S3FuY38FnRsxDt6Yx/sE8jCmmrRe7XHZOnXXGP3ZWY9icILUmzWHOf91jbA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-sticky-regex": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0-beta.46.tgz",
+ "integrity": "sha512-goMgOLODjG1cgFHlKACh/NT/wrnmuRi2CpXsjOan10eZce0fk9kahYz/04cqhppmwtV/vQWwH2ikAHODSD8r5w==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46",
+ "@babel/helper-regex": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-template-literals": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0-beta.46.tgz",
+ "integrity": "sha512-2iGMsHWVAQq9X6p3VNjktJCH6ZXHQHi3NTPLKh5d4bEW8+M3H7LXLNqk1yUm/Uwt0tzh1FUfb/EU2sEPbrBrVA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "7.0.0-beta.46",
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-typeof-symbol": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0-beta.46.tgz",
+ "integrity": "sha512-l+CfLR2c5KzZ/uZlkflNe7nK2hiEahc/FeiUCTd5Krj4aCKDdLLSdb4Lowf5hdZbqIPQc9TdL9SZt80YhUlmFw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-unicode-regex": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0-beta.46.tgz",
+ "integrity": "sha512-XWQ7uJ0HL/xdMesKzt1uq5CmZPBqDiEno+FBeYuOJu1IWjpr3yXfEzH/nW17KESXGRv68mLTr+fIeSwcC+qVFg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46",
+ "@babel/helper-regex": "7.0.0-beta.46",
+ "regexpu-core": "4.1.3"
+ }
+ },
+ "@babel/template": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.46.tgz",
+ "integrity": "sha512-3/qi4m0l6G/vZbEwtqfzJk73mYtuE7nvAO1zT3/ZrTAHy4sHf2vaF9Eh1w+Tau263Yrkh0bjVQPb9zw6G+GeMQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46",
+ "babylon": "7.0.0-beta.46",
+ "lodash": "4.17.10"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz",
+ "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==",
+ "dev": true
+ }
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.46.tgz",
+ "integrity": "sha512-IU7MTGbcjpfhf5tyCu3sDB7sWYainZQcT+CqOBdVZXZfq5MMr130R7aiZBI2g5dJYUaW1PS81DVNpd0/Sq/Gzg==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.46",
+ "@babel/generator": "7.0.0-beta.46",
+ "@babel/helper-function-name": "7.0.0-beta.46",
+ "@babel/helper-split-export-declaration": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46",
+ "babylon": "7.0.0-beta.46",
+ "debug": "3.1.0",
+ "globals": "11.5.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz",
+ "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "11.5.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz",
+ "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==",
+ "dev": true
+ }
+ }
+ },
+ "@babel/types": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.46.tgz",
+ "integrity": "sha512-uA5aruF2KKsJxToWdDpftsrPOIQtoGrGno2hiaeO9JRvfT9xZdK11nPoC+/RF9emNzmNbWn4HCRdCY+McT5Nbw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/esm-amd-loader": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@polymer/esm-amd-loader/-/esm-amd-loader-1.0.0.tgz",
+ "integrity": "sha512-8ZDZzuu2jkg2A6hC7NeH2GqAwxpS9ADI2PYOGi/n06h6ouyoQK2cWTarUPiCAwmHLvVVQ1ySJsags37H33caZQ==",
+ "dev": true
+ },
+ "@polymer/sinonjs": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/@polymer/sinonjs/-/sinonjs-1.17.1.tgz",
+ "integrity": "sha512-/U8F/cOTrbF2iVVYgINYmvKbtbexs+89Q3v8AaHADRYabTg7aOZGOb0RyWpOI+sUJt04kj63U4FwMhzW5r4wZA==",
+ "dev": true
+ },
+ "@polymer/test-fixture": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@polymer/test-fixture/-/test-fixture-0.0.3.tgz",
+ "integrity": "sha1-REN1JpfU2Sk7vEEuoLXk00HxSdk=",
+ "dev": true
+ },
+ "@polymer/tools-common": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@polymer/tools-common/-/tools-common-2.0.0.tgz",
+ "integrity": "sha512-tuU61CtwLQBqN64DnxGUchD3619engj6KOmsNOHkU/KfW5ipaKruugQtdnEZjPXozcGc8WLzHORW4lQfPejC0w==",
+ "requires": {
+ "depcheck": "0.6.9",
+ "fs-extra": "3.0.1",
+ "gulp-eslint": "4.0.2",
+ "gulp-mocha": "4.3.1",
+ "gulp-tslint": "8.1.3",
+ "gulp-typescript": "3.2.4",
+ "merge-stream": "1.0.1",
+ "run-sequence": "1.2.2",
+ "tslint": "5.10.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz",
+ "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==",
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "fs-extra": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz",
+ "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "3.0.1",
+ "universalify": "0.1.1"
+ }
+ },
+ "gulp-tslint": {
+ "version": "8.1.3",
+ "resolved": "https://registry.npmjs.org/gulp-tslint/-/gulp-tslint-8.1.3.tgz",
+ "integrity": "sha512-KEP350N5B9Jg6o6jnyCyKVBPemJePYpMsGfIQq0G0ErvY7tw4Lrfb/y3L4WRf7ek0OsaE8nnj86w+lcLXW8ovw==",
+ "requires": {
+ "@types/fancy-log": "1.3.0",
+ "chalk": "2.3.1",
+ "fancy-log": "1.3.2",
+ "map-stream": "0.0.7",
+ "plugin-error": "1.0.1",
+ "through": "2.3.8"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ },
+ "jsonfile": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz",
+ "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=",
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "map-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz",
+ "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg="
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "@types/acorn": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.3.tgz",
+ "integrity": "sha512-gou/kWQkGPMZjdCKNZGDpqxLm9+ErG/pFZKPX4tvCjr0Xf4FCYYX3nAsu7aDVKJV3KUe27+mvqqyWT/9VZoM/A==",
+ "dev": true,
+ "requires": {
+ "@types/estree": "0.0.39"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/bluebird": {
+ "version": "3.5.20",
+ "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.20.tgz",
+ "integrity": "sha512-Wk41MVdF+cHBfVXj/ufUHJeO3BlIQr1McbHZANErMykaCWeDSZbH5erGjNBw2/3UlRdSxZbLfSuQTzFmPOYFsA==",
+ "dev": true
+ },
+ "@types/body-parser": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz",
+ "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==",
+ "dev": true,
+ "requires": {
+ "@types/connect": "3.4.32",
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.3.tgz",
+ "integrity": "sha512-f5dXGzOJycyzSMdaXVhiBhauL4dYydXwVpavfQ1mVCaGjR56a9QfklXObUxlIY9bGTmCPHEEZ04I16BZ/8w5ww==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.3"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/chokidar": {
+ "version": "1.7.5",
+ "resolved": "https://registry.npmjs.org/@types/chokidar/-/chokidar-1.7.5.tgz",
+ "integrity": "sha512-PDkSRY7KltW3M60hSBlerxI8SFPXsO3AL/aRVsO4Kh9IHRW74Ih75gUuTd/aE4LSSFqypb10UIX3QzOJwBQMGQ==",
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/clean-css": {
+ "version": "3.4.30",
+ "resolved": "https://registry.npmjs.org/@types/clean-css/-/clean-css-3.4.30.tgz",
+ "integrity": "sha1-AFLBNvUkgAJCjjY4s33ko5gYZB0=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/compression": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/compression/-/compression-0.0.33.tgz",
+ "integrity": "sha1-ldxzOiM5qoRjgdfxN3eS0lU9wn0=",
+ "dev": true,
+ "requires": {
+ "@types/express": "4.11.1"
+ }
+ },
+ "@types/connect": {
+ "version": "3.4.32",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz",
+ "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/content-type": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@types/content-type/-/content-type-1.1.2.tgz",
+ "integrity": "sha512-w2d7fBCYbCBUBTGtkC4JfX1FicTtgEmq7wTTjc7rC5RA/JdB1Bi7o88nKzUqAnIIBXJVmq0n4tTmF3PJN8QqCg==",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/del": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/del/-/del-3.0.1.tgz",
+ "integrity": "sha512-y6qRq6raBuu965clKgx6FHuiPu3oHdtmzMPXi8Uahsjdq1L6DL5fS/aY5/s71YwM7k6K1QIWvem5vNwlnNGIkQ==",
+ "dev": true,
+ "requires": {
+ "@types/glob": "5.0.35"
+ }
+ },
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/escape-html": {
+ "version": "0.0.20",
+ "resolved": "https://registry.npmjs.org/@types/escape-html/-/escape-html-0.0.20.tgz",
+ "integrity": "sha512-6dhZJLbA7aOwkYB2GDGdIqJ20wmHnkDzaxV9PJXe7O02I2dSFTERzRB6JrX6cWKaS+VqhhY7cQUMCbO5kloFUw==",
+ "dev": true
+ },
+ "@types/estree": {
+ "version": "0.0.39",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
+ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA=="
+ },
+ "@types/express": {
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.11.1.tgz",
+ "integrity": "sha512-ttWle8cnPA5rAelauSWeWJimtY2RsUf2aspYZs7xPHiWgOlPn6nnUfBMtrkcnjFJuIHJF4gNOdVvpLK2Zmvh6g==",
+ "dev": true,
+ "requires": {
+ "@types/body-parser": "1.17.0",
+ "@types/express-serve-static-core": "4.11.1",
+ "@types/serve-static": "1.13.2"
+ }
+ },
+ "@types/express-serve-static-core": {
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.11.1.tgz",
+ "integrity": "sha512-EehCl3tpuqiM8RUb+0255M8PhhSwTtLfmO7zBBdv0ay/VTd/zmrqDfQdZFsa5z/PVMbH2yCMZPXsnrImpATyIw==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/fancy-log": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@types/fancy-log/-/fancy-log-1.3.0.tgz",
+ "integrity": "sha512-mQjDxyOM1Cpocd+vm1kZBP7smwKZ4TNokFeds9LV7OZibmPJFEzY3+xZMrKfUdNT71lv8GoCPD6upKwHxubClw=="
+ },
+ "@types/fast-levenshtein": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fast-levenshtein/-/fast-levenshtein-0.0.1.tgz",
+ "integrity": "sha1-OjYVzxc2Rcj8pY0FHk4ygk5L0oY=",
+ "dev": true
+ },
+ "@types/findup-sync": {
+ "version": "0.3.29",
+ "resolved": "https://registry.npmjs.org/@types/findup-sync/-/findup-sync-0.3.29.tgz",
+ "integrity": "sha1-7AyAWX5e0VcoIgfnYspyVMrVdjI=",
+ "dev": true,
+ "requires": {
+ "@types/minimatch": "3.0.3"
+ }
+ },
+ "@types/form-data": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz",
+ "integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/freeport": {
+ "version": "1.0.21",
+ "resolved": "https://registry.npmjs.org/@types/freeport/-/freeport-1.0.21.tgz",
+ "integrity": "sha1-c/ZUPtZ9PKP/+XuYVZFZi3CSBm8=",
+ "dev": true,
+ "optional": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.2.tgz",
+ "integrity": "sha512-Q3FWsbdmkQd1ib11A4XNWQvRD//5KpPoGawA8aB2DR7pWKoW9XQv3+dGxD/Z1eVFze23Okdo27ZQytVFlweKvQ==",
+ "requires": {
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/glob-stream": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@types/glob-stream/-/glob-stream-6.1.0.tgz",
+ "integrity": "sha512-RHv6ZQjcTncXo3thYZrsbAVwoy4vSKosSWhuhuQxLOTv74OJuFQxXkmUuZCr3q9uNBEVCvIzmZL/FeRNbHZGUg==",
+ "dev": true,
+ "requires": {
+ "@types/glob": "5.0.35",
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@types/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha512-j3XSDNoK4LO5T+ZviQD6PqfEjm07QFEacOTbJR3hnLWuWX0ZMLJl9oRPgj1PyrfGbXhfHFkksC9QZ9HFltJyrw==",
+ "dev": true,
+ "requires": {
+ "@types/glob": "5.0.35"
+ }
+ },
+ "@types/gulp-if": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/gulp-if/-/gulp-if-0.0.33.tgz",
+ "integrity": "sha512-J5lzff21X7r1x/4hSzn02GgIUEyjCqYIXZ9GgGBLhbsD3RiBdqwnkFWgF16/0jO5rcVZ52Zp+6MQMQdvIsWuKg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.13",
+ "@types/vinyl": "2.0.2"
+ }
+ },
+ "@types/html-minifier": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/@types/html-minifier/-/html-minifier-3.5.2.tgz",
+ "integrity": "sha512-yikK28/KlVyf8g9i/k+TDFlteLuZ6QQTUdVqvKtzEB+8DSLCTjxfh6IK45KnW4rYFI3Y8T4LWpYJMTmfJleWaQ==",
+ "dev": true,
+ "requires": {
+ "@types/clean-css": "3.4.30",
+ "@types/relateurl": "0.2.28",
+ "@types/uglify-js": "3.0.2"
+ }
+ },
+ "@types/inquirer": {
+ "version": "0.0.32",
+ "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-0.0.32.tgz",
+ "integrity": "sha1-pKCOg3QcUAp8PI53dgFPf4plhw0=",
+ "requires": {
+ "@types/rx": "4.1.1",
+ "@types/through": "0.0.29"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/launchpad": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@types/launchpad/-/launchpad-0.6.0.tgz",
+ "integrity": "sha1-NylhCbfyd/bmxf1+DAcGvJGPu1E=",
+ "dev": true,
+ "optional": true
+ },
+ "@types/merge-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@types/merge-stream/-/merge-stream-1.1.0.tgz",
+ "integrity": "sha512-mdbxuhPC4+kx37R3mO4nTTMFVJn5IRLdRqa7WL3Kf9haMh0DNnaU9Pt/naTZdBIWIg8jQb/EWoPyCGh0Hj+6tg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/mime": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-0.0.29.tgz",
+ "integrity": "sha1-+8/TMFc7kS71nu7hRgK/rOYwdUs=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/mocha": {
+ "version": "2.2.48",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz",
+ "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw=="
+ },
+ "@types/mz": {
+ "version": "0.0.31",
+ "resolved": "https://registry.npmjs.org/@types/mz/-/mz-0.0.31.tgz",
+ "integrity": "sha1-pNgMCC/v5x5Ap8DwfR5lVbu8e1I=",
+ "dev": true,
+ "requires": {
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/node": {
+ "version": "8.10.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.13.tgz",
+ "integrity": "sha512-AorNXRHoPVxIUIVmr6uJXRnvlPOSNKAJF5jZ1JOj1/IxYMocZzvQooNeLU02Db6kpy1IVIySTOvuIxmUF1HrOg=="
+ },
+ "@types/opn": {
+ "version": "3.0.28",
+ "resolved": "https://registry.npmjs.org/@types/opn/-/opn-3.0.28.tgz",
+ "integrity": "sha1-CX0NHJtXSVc6XZbfEyOHu20CEYo=",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/path-is-inside": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@types/path-is-inside/-/path-is-inside-1.0.0.tgz",
+ "integrity": "sha512-hfnXRGugz+McgX2jxyy5qz9sB21LRzlGn24zlwN2KEgoPtEvjzNRrLtUkOOebPDPZl3Rq7ywKxYvylVcEZDnEw==",
+ "dev": true
+ },
+ "@types/pem": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@types/pem/-/pem-1.9.3.tgz",
+ "integrity": "sha512-+hHbGi9PAyHVeRdMJN6yNuMWoshJ+7oTqYuhBB1/vHq0Tfu46ucbvgxmhwBfe0GCiJZvCa20VHhHsA0mY5W6hQ==",
+ "dev": true
+ },
+ "@types/puppeteer": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-1.3.1.tgz",
+ "integrity": "sha512-+mJKsb2XM/F4JuLCress3oPDH5UPcj7TMted0HBByhNGhIe0M5yzkGLsedZmuvRcyaBPU0ifPpFR8/GTxmILeg==",
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/relateurl": {
+ "version": "0.2.28",
+ "resolved": "https://registry.npmjs.org/@types/relateurl/-/relateurl-0.2.28.tgz",
+ "integrity": "sha1-a9p9uGU/piZD9e5p6facEaOS46Y=",
+ "dev": true
+ },
+ "@types/request": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/request/-/request-2.0.3.tgz",
+ "integrity": "sha512-cIvnyFRARxwE4OHpCyYue7H+SxaKFPpeleRCHJicft8QhyTNbVYsMwjvEzEPqG06D2LGHZ+sN5lXc8+bTu6D8A==",
+ "dev": true,
+ "requires": {
+ "@types/form-data": "2.2.1",
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.4.tgz",
+ "integrity": "sha1-m1htZalH3qiMS8JNoLkF/pUgoNU=",
+ "dev": true,
+ "requires": {
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/rimraf": {
+ "version": "0.0.28",
+ "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-0.0.28.tgz",
+ "integrity": "sha1-VWJRm8eWPKyoq/fxKMrjtZTUHQY=",
+ "dev": true
+ },
+ "@types/rx": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@types/rx/-/rx-4.1.1.tgz",
+ "integrity": "sha1-WY/JSla67ZdfGUV04PVy/Y5iekg=",
+ "requires": {
+ "@types/rx-core": "4.0.3",
+ "@types/rx-core-binding": "4.0.4",
+ "@types/rx-lite": "4.0.5",
+ "@types/rx-lite-aggregates": "4.0.3",
+ "@types/rx-lite-async": "4.0.2",
+ "@types/rx-lite-backpressure": "4.0.3",
+ "@types/rx-lite-coincidence": "4.0.3",
+ "@types/rx-lite-experimental": "4.0.1",
+ "@types/rx-lite-joinpatterns": "4.0.1",
+ "@types/rx-lite-testing": "4.0.1",
+ "@types/rx-lite-time": "4.0.3",
+ "@types/rx-lite-virtualtime": "4.0.3"
+ }
+ },
+ "@types/rx-core": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/rx-core/-/rx-core-4.0.3.tgz",
+ "integrity": "sha1-CzNUsSOM7b4rdPYybxOdvHpZHWA="
+ },
+ "@types/rx-core-binding": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/rx-core-binding/-/rx-core-binding-4.0.4.tgz",
+ "integrity": "sha512-5pkfxnC4w810LqBPUwP5bg7SFR/USwhMSaAeZQQbEHeBp57pjKXRlXmqpMrLJB4y1oglR/c2502853uN0I+DAQ==",
+ "requires": {
+ "@types/rx-core": "4.0.3"
+ }
+ },
+ "@types/rx-lite": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/@types/rx-lite/-/rx-lite-4.0.5.tgz",
+ "integrity": "sha512-KZk5XTR1dm/kNgBx8iVpjno6fRYtAUQWBOmj+O8j724+nk097sz4fOoHJNpCkOJUtHUurZlJC7QvSFCZHbkC+w==",
+ "requires": {
+ "@types/rx-core": "4.0.3",
+ "@types/rx-core-binding": "4.0.4"
+ }
+ },
+ "@types/rx-lite-aggregates": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/rx-lite-aggregates/-/rx-lite-aggregates-4.0.3.tgz",
+ "integrity": "sha512-MAGDAHy8cRatm94FDduhJF+iNS5//jrZ/PIfm+QYw9OCeDgbymFHChM8YVIvN2zArwsRftKgE33QfRWvQk4DPg==",
+ "requires": {
+ "@types/rx-lite": "4.0.5"
+ }
+ },
+ "@types/rx-lite-async": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/rx-lite-async/-/rx-lite-async-4.0.2.tgz",
+ "integrity": "sha512-vTEv5o8l6702ZwfAM5aOeVDfUwBSDOs+ARoGmWAKQ6LOInQ8J4/zjM7ov12fuTpktUKdMQjkeCp07Vd73mPkxw==",
+ "requires": {
+ "@types/rx-lite": "4.0.5"
+ }
+ },
+ "@types/rx-lite-backpressure": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/rx-lite-backpressure/-/rx-lite-backpressure-4.0.3.tgz",
+ "integrity": "sha512-Y6aIeQCtNban5XSAF4B8dffhIKu6aAy/TXFlScHzSxh6ivfQBQw6UjxyEJxIOt3IT49YkS+siuayM2H/Q0cmgA==",
+ "requires": {
+ "@types/rx-lite": "4.0.5"
+ }
+ },
+ "@types/rx-lite-coincidence": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/rx-lite-coincidence/-/rx-lite-coincidence-4.0.3.tgz",
+ "integrity": "sha512-1VNJqzE9gALUyMGypDXZZXzR0Tt7LC9DdAZQ3Ou/Q0MubNU35agVUNXKGHKpNTba+fr8GdIdkC26bRDqtCQBeQ==",
+ "requires": {
+ "@types/rx-lite": "4.0.5"
+ }
+ },
+ "@types/rx-lite-experimental": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@types/rx-lite-experimental/-/rx-lite-experimental-4.0.1.tgz",
+ "integrity": "sha1-xTL1y98/LBXaFt7Ykw0bKYQCPL0=",
+ "requires": {
+ "@types/rx-lite": "4.0.5"
+ }
+ },
+ "@types/rx-lite-joinpatterns": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@types/rx-lite-joinpatterns/-/rx-lite-joinpatterns-4.0.1.tgz",
+ "integrity": "sha1-9w/jcFGKhDLykVjMkv+1a05K/D4=",
+ "requires": {
+ "@types/rx-lite": "4.0.5"
+ }
+ },
+ "@types/rx-lite-testing": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@types/rx-lite-testing/-/rx-lite-testing-4.0.1.tgz",
+ "integrity": "sha1-IbGdEfTf1v/vWp0WSOnIh5v+Iek=",
+ "requires": {
+ "@types/rx-lite-virtualtime": "4.0.3"
+ }
+ },
+ "@types/rx-lite-time": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/rx-lite-time/-/rx-lite-time-4.0.3.tgz",
+ "integrity": "sha512-ukO5sPKDRwCGWRZRqPlaAU0SKVxmWwSjiOrLhoQDoWxZWg6vyB9XLEZViKOzIO6LnTIQBlk4UylYV0rnhJLxQw==",
+ "requires": {
+ "@types/rx-lite": "4.0.5"
+ }
+ },
+ "@types/rx-lite-virtualtime": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/rx-lite-virtualtime/-/rx-lite-virtualtime-4.0.3.tgz",
+ "integrity": "sha512-3uC6sGmjpOKatZSVHI2xB1+dedgml669ZRvqxy+WqmGJDVusOdyxcKfyzjW0P3/GrCiN4nmRkLVMhPwHCc5QLg==",
+ "requires": {
+ "@types/rx-lite": "4.0.5"
+ }
+ },
+ "@types/semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==",
+ "dev": true
+ },
+ "@types/serve-static": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz",
+ "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==",
+ "dev": true,
+ "requires": {
+ "@types/express-serve-static-core": "4.11.1",
+ "@types/mime": "0.0.29"
+ }
+ },
+ "@types/sinon": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-4.3.1.tgz",
+ "integrity": "sha512-DK4YtH30I67k4klURIBS4VAe1aBISfS9lgNlHFkibSmKem2tLQc5VkKoJreT3dCJAd+xRyCS8bx1o97iq3yUVg=="
+ },
+ "@types/spdy": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/@types/spdy/-/spdy-3.4.4.tgz",
+ "integrity": "sha512-N9LBlbVRRYq6HgYpPkqQc3a9HJ/iEtVZToW6xlTtJiMhmRJ7jJdV7TaZQJw/Ve/1ePUsQiCTDc4JMuzzag94GA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/temp": {
+ "version": "0.8.32",
+ "resolved": "https://registry.npmjs.org/@types/temp/-/temp-0.8.32.tgz",
+ "integrity": "sha512-gyIhOlWPqI8vtYTlRb61HKV7x+3wjpJIQi8mTaweVtEMvhIV6Xajo8FVcNJWeJOBuedRCzK2Uy+uhj/rJmR9oQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/through": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.29.tgz",
+ "integrity": "sha512-9a7C5VHh+1BKblaYiq+7Tfc+EOmjMdZaD1MYtkQjSoxgB69tBjW98ry6SKsi4zEIWztLOMRuL87A3bdT/Fc/4w==",
+ "requires": {
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow=="
+ }
+ }
+ },
+ "@types/tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha1-EHPEvIJHVK49EM+riKsCN7qWTk0="
+ },
+ "@types/ua-parser-js": {
+ "version": "0.7.32",
+ "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.32.tgz",
+ "integrity": "sha512-+z7Q72Mlnq6SFkQYHzLg2Z70pIsgRVzgx1b5PV8eUv5uaZ/zoqIs45XnhtToW4gTeX4FbjIP49nhIjyvPF4rPg==",
+ "dev": true
+ },
+ "@types/uglify-js": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.2.tgz",
+ "integrity": "sha512-o8hU2+4xsyGC27Vujoklvxl88Ew5zmJuTBYMX1Uro2rYUt4HEFJKL6fuq8aGykvS+ssIsIzerWWP2DRxonownQ==",
+ "dev": true,
+ "requires": {
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "@types/update-notifier": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@types/update-notifier/-/update-notifier-1.0.3.tgz",
+ "integrity": "sha512-BLStNhP2DFF7funARwTcoD6tetRte8NK3Sc59mn7GNALCN975jOlKX3dGvsFxXr/HwQMxxCuRn9IWB3WQ7odHQ==",
+ "dev": true
+ },
+ "@types/uuid": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz",
+ "integrity": "sha512-5fRLCYhLtDb3hMWqQyH10qtF+Ud2JnNCXTCZ+9ktNdCcgslcuXkDTkFcJNk++MT29yDntDnlF1+jD+uVGumsbw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/vinyl": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.2.tgz",
+ "integrity": "sha512-2iYpNuOl98SrLPBZfEN9Mh2JCJ2EI9HU35SfgBEb51DcmaHkhp8cKMblYeBqMQiwXMgAD3W60DbQ4i/UdLiXhw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/vinyl-fs": {
+ "version": "0.0.28",
+ "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-0.0.28.tgz",
+ "integrity": "sha1-RmMBe8gCxlcOrk80Cf1cq/l8v94=",
+ "dev": true,
+ "requires": {
+ "@types/glob-stream": "6.1.0",
+ "@types/node": "10.0.5",
+ "@types/vinyl": "2.0.2"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-tonhlcbQ2eho09am6RHnHOgvtDfDYINd5rgxD+2YSkKENooVCFsWizJz139MQW/PV8FfClyKrNe9ZbdHrSCxGg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-ZrJDWpvg75LTGX4XwuneY9s6bF3OeZcGTpoGh3zDV9ytzcHMFsRrMIaLBRJZQMBoGyKs6unBQfVdrLZiYfb1zQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/yeoman-generator": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@types/yeoman-generator/-/yeoman-generator-1.0.4.tgz",
+ "integrity": "sha512-iMm6ZU90vgupfqIDMQSSKh7VfM3susAoXx8Zv79FGnpiExtUTq8HeAg0AlrwqeP00VpPO/x/ytNejmmyuNoT/A==",
+ "requires": {
+ "@types/inquirer": "0.0.32"
+ }
+ },
+ "@types/yeoman-test": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/@types/yeoman-test/-/yeoman-test-1.7.4.tgz",
+ "integrity": "sha512-nppkWxmwWX2yuvuHqWjYZOxMuhjeKJ0CK6IONDBzYiLEC7l5dQR9RMTyBqtIXKrzX7PDMQmZDsKHfWds7anI7Q==",
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/yeoman-generator": "1.0.4"
+ }
+ },
+ "@webcomponents/webcomponentsjs": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-1.2.0.tgz",
+ "integrity": "sha512-P9JWydfpBR+CK12UwtBaoD/lYF3PR9XBArAWk5J9nfPaJwA3OUox4StZmyFSVDLsvpFq5HsEtxU/OdHAlAWPnw==",
+ "dev": true
+ },
+ "abbrev": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
+ "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU="
+ },
+ "accepts": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
+ "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
+ "dev": true,
+ "requires": {
+ "mime-types": "2.1.18",
+ "negotiator": "0.6.1"
+ }
+ },
+ "accessibility-developer-tools": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz",
+ "integrity": "sha1-PaDM6dbsY3OWS4TzXbfPw996tRQ=",
+ "dev": true
+ },
+ "acorn": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
+ "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ=="
+ },
+ "acorn-import-meta": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/acorn-import-meta/-/acorn-import-meta-0.2.1.tgz",
+ "integrity": "sha512-+KB5Q0P0Q/XpsPHgnLx4XbCGqMogw4yiJJjYsbzPCNrE/IoX+c6J4C+BFcwdWh3CD1zLzMxPITN1jzHd+NiS3w==",
+ "dev": true,
+ "requires": {
+ "acorn": "5.5.3"
+ }
+ },
+ "acorn-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+ "requires": {
+ "acorn": "3.3.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
+ }
+ }
+ },
+ "adm-zip": {
+ "version": "0.4.9",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.9.tgz",
+ "integrity": "sha512-eknaJ3Io/JasGGinVeqY5TsPlQgHbiNlHnK5zdFPRNs9XRggDykKz8zPesneOMEZJxWji7G3CfsUW0Ds9Dw0Bw==",
+ "dev": true,
+ "optional": true
+ },
+ "after": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
+ "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
+ "dev": true
+ },
+ "agent-base": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz",
+ "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "semver": "5.0.3"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz",
+ "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=",
+ "dev": true
+ }
+ }
+ },
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "requires": {
+ "co": "4.6.0",
+ "fast-deep-equal": "1.1.0",
+ "fast-json-stable-stringify": "2.0.0",
+ "json-schema-traverse": "0.3.1"
+ }
+ },
+ "ajv-keywords": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
+ "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I="
+ },
+ "align-text": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+ "requires": {
+ "kind-of": "3.2.2",
+ "longest": "1.0.1",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
+ },
+ "ansi-align": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-1.1.0.tgz",
+ "integrity": "sha1-LwwWWIKXOa3V67FeawxuNCPwFro=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2"
+ }
+ },
+ "ansi-colors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+ "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz",
+ "integrity": "sha1-HBg5S2r5t2/5pjUJ+kl2af0s5T4=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4"
+ }
+ },
+ "ansi-escapes": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
+ "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4="
+ },
+ "ansi-gray": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
+ "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+ },
+ "ansi-wrap": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768="
+ },
+ "any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=",
+ "dev": true
+ },
+ "anymatch": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
+ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
+ "dev": true,
+ "requires": {
+ "micromatch": "2.3.11",
+ "normalize-path": "2.1.1"
+ }
+ },
+ "append-field": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/append-field/-/append-field-0.1.0.tgz",
+ "integrity": "sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo=",
+ "dev": true
+ },
+ "archiver": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz",
+ "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=",
+ "dev": true,
+ "requires": {
+ "archiver-utils": "1.3.0",
+ "async": "2.6.0",
+ "buffer-crc32": "0.2.13",
+ "glob": "7.1.2",
+ "lodash": "4.17.10",
+ "readable-stream": "2.3.6",
+ "tar-stream": "1.6.0",
+ "walkdir": "0.0.11",
+ "zip-stream": "1.2.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "requires": {
+ "lodash": "4.17.10"
+ }
+ }
+ }
+ },
+ "archiver-utils": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz",
+ "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2",
+ "graceful-fs": "4.1.11",
+ "lazystream": "1.0.0",
+ "lodash": "4.17.10",
+ "normalize-path": "2.1.1",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA="
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "requires": {
+ "sprintf-js": "1.0.3"
+ }
+ },
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "requires": {
+ "arr-flatten": "1.1.0"
+ }
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+ },
+ "array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-differ": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
+ "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE="
+ },
+ "array-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
+ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8="
+ },
+ "array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+ "dev": true
+ },
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
+ "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w=="
+ },
+ "array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "requires": {
+ "array-uniq": "1.0.3"
+ }
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM="
+ },
+ "arraybuffer.slice": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
+ "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==",
+ "dev": true
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
+ },
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+ "dev": true
+ },
+ "asn1": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
+ "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
+ "dev": true
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ },
+ "assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw=="
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k="
+ },
+ "async-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+ "dev": true
+ },
+ "async-limiter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
+ "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz",
+ "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio="
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz",
+ "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.10",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-evaluate-path": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.4.1.tgz",
+ "integrity": "sha1-a3XB4OMPFmKfKoZFyjBeGo01iaY=",
+ "dev": true
+ },
+ "babel-helper-flip-expressions": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.4.1.tgz",
+ "integrity": "sha1-zAPYBFjBA7n1BcHGpn++D1nKwyA=",
+ "dev": true
+ },
+ "babel-helper-is-nodes-equiv": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz",
+ "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=",
+ "dev": true
+ },
+ "babel-helper-is-void-0": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.4.1.tgz",
+ "integrity": "sha1-ogu127ocMMSq/nPrMn0tGLKE7Ro=",
+ "dev": true
+ },
+ "babel-helper-mark-eval-scopes": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.4.1.tgz",
+ "integrity": "sha1-A/nMmN76R0fnQS5wD069D+1ktXE=",
+ "dev": true
+ },
+ "babel-helper-remove-or-void": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.4.1.tgz",
+ "integrity": "sha1-rdWwiBeFOVESpw8PHCWRebFSQmo=",
+ "dev": true
+ },
+ "babel-helper-to-multiple-sequence-expressions": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.4.1.tgz",
+ "integrity": "sha1-FU7MOBGPXBybDp/CNd21OSFJvI8=",
+ "dev": true
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-minify-builtins": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.4.1.tgz",
+ "integrity": "sha1-d6iMt2EO2SWxsCVKmQJAKR4LC+A=",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.4.1"
+ }
+ },
+ "babel-plugin-minify-constant-folding": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.4.1.tgz",
+ "integrity": "sha1-LtT4Ow/yj01VU9CcXvyFtdti0RI=",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.4.1"
+ }
+ },
+ "babel-plugin-minify-dead-code-elimination": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.4.1.tgz",
+ "integrity": "sha1-81/PNIk06wqslEUCrTA3KRgu6yE=",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.4.1",
+ "babel-helper-mark-eval-scopes": "0.4.1",
+ "babel-helper-remove-or-void": "0.4.1",
+ "lodash.some": "4.6.0"
+ }
+ },
+ "babel-plugin-minify-flip-comparisons": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.4.1.tgz",
+ "integrity": "sha1-5wfl2rxpXJnNKSP+lw7ZrHjE5ws=",
+ "dev": true,
+ "requires": {
+ "babel-helper-is-void-0": "0.4.1"
+ }
+ },
+ "babel-plugin-minify-guarded-expressions": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.4.1.tgz",
+ "integrity": "sha1-ylpZoGvBwi3Vz9mWpnUWOm9hm30=",
+ "dev": true,
+ "requires": {
+ "babel-helper-flip-expressions": "0.4.1"
+ }
+ },
+ "babel-plugin-minify-infinity": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.4.1.tgz",
+ "integrity": "sha1-zJw33MFmbcB/HrR4wrchoRz7lJE=",
+ "dev": true
+ },
+ "babel-plugin-minify-mangle-names": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.4.1.tgz",
+ "integrity": "sha1-d76P7TUOkxo6qaCfl/KCYWgIMTM=",
+ "dev": true,
+ "requires": {
+ "babel-helper-mark-eval-scopes": "0.4.1"
+ }
+ },
+ "babel-plugin-minify-numeric-literals": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.4.1.tgz",
+ "integrity": "sha1-lktObMdIfG1KMalRl8P0IbYMmkc=",
+ "dev": true
+ },
+ "babel-plugin-minify-replace": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.4.1.tgz",
+ "integrity": "sha1-xRnYhYxiKySWo2SmE1rSd1V42UM=",
+ "dev": true
+ },
+ "babel-plugin-minify-simplify": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.4.1.tgz",
+ "integrity": "sha1-XlX0ibLV8CyQjCswm/CBTxXHV74=",
+ "dev": true,
+ "requires": {
+ "babel-helper-flip-expressions": "0.4.1",
+ "babel-helper-is-nodes-equiv": "0.0.1",
+ "babel-helper-to-multiple-sequence-expressions": "0.4.1"
+ }
+ },
+ "babel-plugin-minify-type-constructors": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.4.1.tgz",
+ "integrity": "sha1-eSJNE0bDPk+kQnVqI0JkkVjvlEg=",
+ "dev": true,
+ "requires": {
+ "babel-helper-is-void-0": "0.4.1"
+ }
+ },
+ "babel-plugin-transform-inline-consecutive-adds": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.1.tgz",
+ "integrity": "sha1-F13t/odsL/enjHUe1NncBZfRFx0=",
+ "dev": true
+ },
+ "babel-plugin-transform-member-expression-literals": {
+ "version": "6.10.0-alpha.f95869d4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.10.0-alpha.f95869d4.tgz",
+ "integrity": "sha1-Jy69Ki1DQbhsJNzYQ3SuWqNwKHQ=",
+ "dev": true
+ },
+ "babel-plugin-transform-merge-sibling-variables": {
+ "version": "6.10.0-alpha.f95869d4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.10.0-alpha.f95869d4.tgz",
+ "integrity": "sha1-SKMw0oKT4xjQcXXCYMdIWec5i0M=",
+ "dev": true
+ },
+ "babel-plugin-transform-minify-booleans": {
+ "version": "6.10.0-alpha.f95869d4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.10.0-alpha.f95869d4.tgz",
+ "integrity": "sha1-He72nCITUDipHeH10T11njRkxDw=",
+ "dev": true
+ },
+ "babel-plugin-transform-property-literals": {
+ "version": "6.10.0-alpha.f95869d4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.10.0-alpha.f95869d4.tgz",
+ "integrity": "sha1-NxJ6qgQSXD0Iv5XNtajx0uRMpFM=",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "babel-plugin-transform-regexp-constructors": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.1.tgz",
+ "integrity": "sha1-T/fx2g4MMZENDhRhq+0MZ5yzHu4=",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-console": {
+ "version": "6.10.0-alpha.f95869d4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.10.0-alpha.f95869d4.tgz",
+ "integrity": "sha1-xXF6+fdpGLKCHPrvRNgkXU6pQiw=",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-debugger": {
+ "version": "6.10.0-alpha.f95869d4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.10.0-alpha.f95869d4.tgz",
+ "integrity": "sha1-H8NcKcfAh4zzDlWKczZRkG6IjkQ=",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-undefined": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.4.1.tgz",
+ "integrity": "sha1-Y2x/KM66/Fpm+jT5TGCAR+r3508=",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.4.1"
+ }
+ },
+ "babel-plugin-transform-simplify-comparison-operators": {
+ "version": "6.10.0-alpha.f95869d4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.10.0-alpha.f95869d4.tgz",
+ "integrity": "sha1-9UmabcPtaGvaUzY4ZrZ92ndMW+0=",
+ "dev": true
+ },
+ "babel-plugin-transform-undefined-to-void": {
+ "version": "6.10.0-alpha.f95869d4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.10.0-alpha.f95869d4.tgz",
+ "integrity": "sha1-F1oaMJDmFkA/jIGc3Ooa7LZlI7I=",
+ "dev": true
+ },
+ "babel-preset-minify": {
+ "version": "0.4.0-alpha.caaefb4c",
+ "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.4.0-alpha.caaefb4c.tgz",
+ "integrity": "sha1-pQUsWVXdl9JGmbKB/amjAuqMGHE=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-minify-builtins": "0.4.1",
+ "babel-plugin-minify-constant-folding": "0.4.1",
+ "babel-plugin-minify-dead-code-elimination": "0.4.1",
+ "babel-plugin-minify-flip-comparisons": "0.4.1",
+ "babel-plugin-minify-guarded-expressions": "0.4.1",
+ "babel-plugin-minify-infinity": "0.4.1",
+ "babel-plugin-minify-mangle-names": "0.4.1",
+ "babel-plugin-minify-numeric-literals": "0.4.1",
+ "babel-plugin-minify-replace": "0.4.1",
+ "babel-plugin-minify-simplify": "0.4.1",
+ "babel-plugin-minify-type-constructors": "0.4.1",
+ "babel-plugin-transform-inline-consecutive-adds": "0.4.1",
+ "babel-plugin-transform-member-expression-literals": "6.10.0-alpha.f95869d4",
+ "babel-plugin-transform-merge-sibling-variables": "6.10.0-alpha.f95869d4",
+ "babel-plugin-transform-minify-booleans": "6.10.0-alpha.f95869d4",
+ "babel-plugin-transform-property-literals": "6.10.0-alpha.f95869d4",
+ "babel-plugin-transform-regexp-constructors": "0.4.1",
+ "babel-plugin-transform-remove-console": "6.10.0-alpha.f95869d4",
+ "babel-plugin-transform-remove-debugger": "6.10.0-alpha.f95869d4",
+ "babel-plugin-transform-remove-undefined": "0.4.1",
+ "babel-plugin-transform-simplify-comparison-operators": "6.10.0-alpha.f95869d4",
+ "babel-plugin-transform-undefined-to-void": "6.10.0-alpha.f95869d4",
+ "lodash.isplainobject": "4.0.6"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "requires": {
+ "core-js": "2.5.6",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+ },
+ "backo2": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+ "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "base64-arraybuffer": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
+ "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
+ "dev": true
+ },
+ "base64-js": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz",
+ "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=",
+ "dev": true,
+ "optional": true
+ },
+ "base64id": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
+ "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=",
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
+ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "beeper": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz",
+ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak="
+ },
+ "better-assert": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
+ "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
+ "dev": true,
+ "requires": {
+ "callsite": "1.0.0"
+ }
+ },
+ "binary-extensions": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
+ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
+ "dev": true
+ },
+ "binaryextensions": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.1.1.tgz",
+ "integrity": "sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA=="
+ },
+ "bl": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
+ "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.6",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "blob": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
+ "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=",
+ "dev": true
+ },
+ "body-parser": {
+ "version": "1.18.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
+ "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
+ "dev": true,
+ "requires": {
+ "bytes": "3.0.0",
+ "content-type": "1.0.4",
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "http-errors": "1.6.3",
+ "iconv-lite": "0.4.19",
+ "on-finished": "2.3.0",
+ "qs": "6.5.1",
+ "raw-body": "2.3.2",
+ "type-is": "1.6.16"
+ },
+ "dependencies": {
+ "iconv-lite": {
+ "version": "0.4.19",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
+ "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+ "dev": true
+ }
+ }
+ },
+ "boom": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
+ "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
+ "dev": true,
+ "requires": {
+ "hoek": "4.2.1"
+ }
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "bower-config": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/bower-config/-/bower-config-1.4.1.tgz",
+ "integrity": "sha1-hf2d82fCuNu9DKpMXyutQM2Ewsw=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "mout": "1.1.0",
+ "optimist": "0.6.1",
+ "osenv": "0.1.5",
+ "untildify": "2.1.0"
+ }
+ },
+ "bower-json": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/bower-json/-/bower-json-0.8.1.tgz",
+ "integrity": "sha1-lsFHIyQa5kZqnFLhbKoyYjqIOEM=",
+ "dev": true,
+ "requires": {
+ "deep-extend": "0.4.2",
+ "ext-name": "3.0.0",
+ "graceful-fs": "4.1.11",
+ "intersect": "1.0.1"
+ }
+ },
+ "bower-logger": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/bower-logger/-/bower-logger-0.2.2.tgz",
+ "integrity": "sha1-Ob4H6Xmy/I4DqUY0IF7ZQiNz04E=",
+ "dev": true
+ },
+ "boxen": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-0.6.0.tgz",
+ "integrity": "sha1-g2TUJIrDT/DvGy8r9JpsYM4NgbY=",
+ "dev": true,
+ "requires": {
+ "ansi-align": "1.1.0",
+ "camelcase": "2.1.1",
+ "chalk": "1.1.3",
+ "cli-boxes": "1.0.0",
+ "filled-array": "1.1.0",
+ "object-assign": "4.1.1",
+ "repeating": "2.0.1",
+ "string-width": "1.0.2",
+ "widest-line": "1.0.0"
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "requires": {
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.2"
+ }
+ },
+ "browser-capabilities": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/browser-capabilities/-/browser-capabilities-1.1.0.tgz",
+ "integrity": "sha512-D0AhTybfR0KbVxy1DShQut4eCeluMyJhbTgVTIxvItJKzEGG9pNvOBFZfpeCASo2z0XdfczuvSfNZe/vmNlqwQ==",
+ "dev": true,
+ "requires": {
+ "@types/ua-parser-js": "0.7.32",
+ "ua-parser-js": "0.7.18"
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
+ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8="
+ },
+ "browserify-zlib": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz",
+ "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=",
+ "dev": true,
+ "requires": {
+ "pako": "0.2.9"
+ }
+ },
+ "browserstack": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.0.tgz",
+ "integrity": "sha1-tWVCWtYu1ywQgqHrl51TE8fUdU8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "https-proxy-agent": "1.0.0"
+ }
+ },
+ "buffer-alloc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.1.0.tgz",
+ "integrity": "sha1-BVFNM78WVtNUDGhPZbEgLpDsowM=",
+ "dev": true,
+ "requires": {
+ "buffer-alloc-unsafe": "0.1.1",
+ "buffer-fill": "0.1.1"
+ }
+ },
+ "buffer-alloc-unsafe": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-0.1.1.tgz",
+ "integrity": "sha1-/+H2dVHdBVc33iUzN7/oU9+rGmo=",
+ "dev": true
+ },
+ "buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
+ "dev": true
+ },
+ "buffer-fill": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-0.1.1.tgz",
+ "integrity": "sha512-YgBMBzdRLEfgxJIGu2wrvI2E03tMCFU1p7d1KhB4BOoMN0VxmTFjSyN5JtKt9z8Z9JajMHruI6SE25W96wNv7Q==",
+ "dev": true
+ },
+ "buffer-from": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz",
+ "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA=="
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8="
+ },
+ "busboy": {
+ "version": "0.2.14",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz",
+ "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=",
+ "dev": true,
+ "requires": {
+ "dicer": "0.2.5",
+ "readable-stream": "1.1.14"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+ "dev": true
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "caller-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+ "requires": {
+ "callsites": "0.2.0"
+ }
+ },
+ "callsite": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
+ "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
+ "dev": true
+ },
+ "callsites": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo="
+ },
+ "camel-case": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
+ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+ "dev": true,
+ "requires": {
+ "no-case": "2.3.2",
+ "upper-case": "1.1.3"
+ }
+ },
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "2.1.1",
+ "map-obj": "1.0.1"
+ }
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "capture-stack-trace": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz",
+ "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0="
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true
+ },
+ "center-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+ "optional": true,
+ "requires": {
+ "align-text": "0.1.4",
+ "lazy-cache": "1.0.4"
+ }
+ },
+ "chai": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz",
+ "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=",
+ "requires": {
+ "assertion-error": "1.1.0",
+ "deep-eql": "0.1.3",
+ "type-detect": "1.0.0"
+ }
+ },
+ "chai-subset": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/chai-subset/-/chai-subset-1.6.0.tgz",
+ "integrity": "sha1-pdDKFOMpp5WW7XAFi2ZGvWmIz+k="
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "chardet": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I="
+ },
+ "charenc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+ "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=",
+ "dev": true
+ },
+ "check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+ "dev": true
+ },
+ "chokidar": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
+ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
+ "dev": true,
+ "requires": {
+ "anymatch": "1.3.2",
+ "async-each": "1.0.1",
+ "fsevents": "1.2.3",
+ "glob-parent": "2.0.0",
+ "inherits": "2.0.3",
+ "is-binary-path": "1.0.1",
+ "is-glob": "2.0.1",
+ "path-is-absolute": "1.0.1",
+ "readdirp": "2.1.0"
+ }
+ },
+ "chownr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz",
+ "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=",
+ "dev": true
+ },
+ "ci-info": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz",
+ "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==",
+ "dev": true
+ },
+ "circular-json": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
+ "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A=="
+ },
+ "clang-format": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.1.0.tgz",
+ "integrity": "sha512-0Aru49uTLoROl4sPTyO3fvF/NZ+fnGEy5i7bsRwA/bAYT+eWaAxK3sDxRvm/AW7Nwq83BvARH/npeF8OIAaGVQ==",
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.1"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
+ }
+ }
+ },
+ "class-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/class-extend/-/class-extend-0.1.2.tgz",
+ "integrity": "sha1-gFeoKwD1P4Kl1ixQ74z/3sb6vDQ=",
+ "requires": {
+ "object-assign": "2.1.1"
+ },
+ "dependencies": {
+ "object-assign": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz",
+ "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo="
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "clean-css": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz",
+ "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7"
+ }
+ },
+ "cleankill": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/cleankill/-/cleankill-2.0.0.tgz",
+ "integrity": "sha1-WYMN/ItBHVPccq0J1Fp46jMWGpE=",
+ "dev": true
+ },
+ "cli-boxes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
+ "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
+ "dev": true
+ },
+ "cli-cursor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
+ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
+ "requires": {
+ "restore-cursor": "1.0.1"
+ }
+ },
+ "cli-table": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz",
+ "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=",
+ "requires": {
+ "colors": "1.0.3"
+ }
+ },
+ "cli-width": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
+ },
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wrap-ansi": "2.1.0"
+ }
+ },
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
+ },
+ "clone-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+ "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg="
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE="
+ },
+ "cloneable-readable": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz",
+ "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==",
+ "requires": {
+ "inherits": "2.0.3",
+ "process-nextick-args": "2.0.0",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ },
+ "color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs="
+ },
+ "combined-stream": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
+ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "1.0.0"
+ }
+ },
+ "command-line-args": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-3.0.5.tgz",
+ "integrity": "sha1-W9StReeYPlwTRJGOQCgO4mk8WsA=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "find-replace": "1.0.3",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-commands": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-commands/-/command-line-commands-1.0.4.tgz",
+ "integrity": "sha1-A0+bFntRiK+9z2su+7FQ/IRCwys=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0"
+ }
+ },
+ "command-line-usage": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-3.0.8.tgz",
+ "integrity": "sha1-tqIJeMGzg0d/XBGlKUKLiAv+D00=",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "3.0.0",
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "table-layout": "0.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "commander": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
+ "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
+ "requires": {
+ "graceful-readlink": "1.0.1"
+ }
+ },
+ "commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
+ },
+ "component-bind": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
+ "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
+ "dev": true
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
+ },
+ "component-inherit": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
+ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
+ "dev": true
+ },
+ "compress-commons": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz",
+ "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=",
+ "dev": true,
+ "requires": {
+ "buffer-crc32": "0.2.13",
+ "crc32-stream": "2.0.0",
+ "normalize-path": "2.1.1",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "compressible": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz",
+ "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.33.0"
+ }
+ },
+ "compression": {
+ "version": "1.7.2",
+ "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz",
+ "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=",
+ "dev": true,
+ "requires": {
+ "accepts": "1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "2.0.13",
+ "debug": "2.6.9",
+ "on-headers": "1.0.1",
+ "safe-buffer": "5.1.1",
+ "vary": "1.1.2"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
+ "dev": true
+ }
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "requires": {
+ "buffer-from": "1.0.0",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6",
+ "typedarray": "0.0.6"
+ }
+ },
+ "configstore": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz",
+ "integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=",
+ "dev": true,
+ "requires": {
+ "dot-prop": "3.0.0",
+ "graceful-fs": "4.1.11",
+ "mkdirp": "0.5.1",
+ "object-assign": "4.1.1",
+ "os-tmpdir": "1.0.2",
+ "osenv": "0.1.5",
+ "uuid": "2.0.3",
+ "write-file-atomic": "1.3.4",
+ "xdg-basedir": "2.0.0"
+ },
+ "dependencies": {
+ "uuid": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
+ "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=",
+ "dev": true
+ }
+ }
+ },
+ "content-disposition": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+ "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
+ "dev": true
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "dev": true
+ },
+ "convert-source-map": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
+ "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU="
+ },
+ "cookie": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
+ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
+ "dev": true
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
+ },
+ "core-js": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz",
+ "integrity": "sha512-lQUVfQi0aLix2xpyjrrJEvfuYCqPc/HwmTKsC/VNf8q0zsjX7SQZtp4+oRONN5Tsur9GDETPjj+Ub2iDiGZfSQ=="
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+ },
+ "crc": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/crc/-/crc-3.2.1.tgz",
+ "integrity": "sha1-XZyPt3okXNXsopHl0tAFM0urAII=",
+ "dev": true
+ },
+ "crc32-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz",
+ "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=",
+ "dev": true,
+ "requires": {
+ "crc": "3.5.0",
+ "readable-stream": "2.3.6"
+ },
+ "dependencies": {
+ "crc": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz",
+ "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=",
+ "dev": true
+ }
+ }
+ },
+ "create-error-class": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+ "requires": {
+ "capture-stack-trace": "1.0.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "requires": {
+ "lru-cache": "4.1.3",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ }
+ },
+ "crypt": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+ "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=",
+ "dev": true
+ },
+ "cryptiles": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
+ "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
+ "dev": true,
+ "requires": {
+ "boom": "5.2.0"
+ },
+ "dependencies": {
+ "boom": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
+ "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
+ "dev": true,
+ "requires": {
+ "hoek": "4.2.1"
+ }
+ }
+ }
+ },
+ "crypto-random-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
+ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
+ "dev": true
+ },
+ "css-slam": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/css-slam/-/css-slam-2.1.1.tgz",
+ "integrity": "sha512-CyPOtUEykoRkp+1dLJyfsl0CPRzuHfwFVwuZ8DCuVjunoG1LUUwEFlOg3XfKKpz6t3O/tgiSMRxoiYdEEXIQVA==",
+ "dev": true,
+ "requires": {
+ "command-line-args": "3.0.5",
+ "command-line-usage": "3.0.8",
+ "dom5": "3.0.0",
+ "parse5": "4.0.0",
+ "shady-css-parser": "0.1.0"
+ }
+ },
+ "css-what": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
+ "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "dev": true,
+ "requires": {
+ "array-find-index": "1.0.2"
+ }
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "dargs": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz",
+ "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk="
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ }
+ },
+ "dateformat": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
+ "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+ },
+ "deep-eql": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
+ "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=",
+ "requires": {
+ "type-detect": "0.1.1"
+ },
+ "dependencies": {
+ "type-detect": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
+ "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI="
+ }
+ }
+ },
+ "deep-extend": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
+ "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8="
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
+ },
+ "defaults": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+ "requires": {
+ "clone": "1.0.4"
+ }
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "del": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
+ "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
+ "dev": true,
+ "requires": {
+ "globby": "6.1.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.1",
+ "p-map": "1.2.0",
+ "pify": "3.0.0",
+ "rimraf": "2.6.2"
+ },
+ "dependencies": {
+ "globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+ "dev": true,
+ "requires": {
+ "array-union": "1.0.2",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ }
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true
+ },
+ "depcheck": {
+ "version": "0.6.9",
+ "resolved": "https://registry.npmjs.org/depcheck/-/depcheck-0.6.9.tgz",
+ "integrity": "sha1-7+b99c8AwhcoEbwqJAPVnlNB5Rk=",
+ "requires": {
+ "babel-traverse": "6.26.0",
+ "babylon": "6.18.0",
+ "builtin-modules": "1.1.1",
+ "deprecate": "1.0.0",
+ "deps-regex": "0.1.4",
+ "js-yaml": "3.11.0",
+ "lodash": "4.17.10",
+ "minimatch": "3.0.4",
+ "require-package-name": "2.0.1",
+ "walkdir": "0.0.11",
+ "yargs": "8.0.2"
+ }
+ },
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+ "dev": true
+ },
+ "deprecate": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/deprecate/-/deprecate-1.0.0.tgz",
+ "integrity": "sha1-ZhSQ7SQokWpsiIPYg05WRvTkpKg="
+ },
+ "deprecated": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz",
+ "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk="
+ },
+ "deps-regex": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deps-regex/-/deps-regex-0.1.4.tgz",
+ "integrity": "sha1-UYZnt2kUYKXn4KNBvnbrfOgJAYQ="
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+ "dev": true
+ },
+ "detect-conflict": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/detect-conflict/-/detect-conflict-1.0.1.tgz",
+ "integrity": "sha1-CIZXpmqWHAUBnbfEIwiDsca0F24="
+ },
+ "detect-file": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz",
+ "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=",
+ "dev": true,
+ "requires": {
+ "fs-exists-sync": "0.1.0"
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "detect-node": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz",
+ "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=",
+ "dev": true
+ },
+ "dicer": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz",
+ "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.1.14",
+ "streamsearch": "0.1.2"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "diff": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-2.2.3.tgz",
+ "integrity": "sha1-YOr9DSjukG5Oj/ClLBIpUhAzv5k="
+ },
+ "dir-glob": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
+ "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
+ "dev": true,
+ "requires": {
+ "arrify": "1.0.1",
+ "path-type": "3.0.0"
+ },
+ "dependencies": {
+ "path-type": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "dev": true,
+ "requires": {
+ "pify": "3.0.0"
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ }
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom-urls": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz",
+ "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=",
+ "dev": true,
+ "requires": {
+ "urijs": "1.19.1"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ }
+ }
+ },
+ "dot-prop": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz",
+ "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=",
+ "dev": true,
+ "requires": {
+ "is-obj": "1.0.1"
+ }
+ },
+ "duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "duplexer3": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
+ },
+ "duplexify": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz",
+ "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==",
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6",
+ "stream-shift": "1.0.0"
+ }
+ },
+ "ecc-jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
+ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "jsbn": "0.1.1"
+ }
+ },
+ "editions": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz",
+ "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg=="
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+ "dev": true
+ },
+ "ejs": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz",
+ "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ=="
+ },
+ "emitter-component": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.1.tgz",
+ "integrity": "sha1-Bl4tvtaVm/RwZ57avq95gdEAOrY=",
+ "dev": true
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+ "dev": true
+ },
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "requires": {
+ "once": "1.4.0"
+ }
+ },
+ "ends-with": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/ends-with/-/ends-with-0.2.0.tgz",
+ "integrity": "sha1-L52pjVelDP2kVxzkM5AAUA9Oa4o=",
+ "dev": true
+ },
+ "engine.io": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.0.tgz",
+ "integrity": "sha512-mRbgmAtQ4GAlKwuPnnAvXXwdPhEx+jkc0OBCLrXuD/CRvwNK3AxRSnqK4FSqmAMRRHryVJP8TopOvmEaA64fKw==",
+ "dev": true,
+ "requires": {
+ "accepts": "1.3.5",
+ "base64id": "1.0.0",
+ "cookie": "0.3.1",
+ "debug": "3.1.0",
+ "engine.io-parser": "2.1.2",
+ "ws": "3.3.3"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "engine.io-client": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz",
+ "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==",
+ "dev": true,
+ "requires": {
+ "component-emitter": "1.2.1",
+ "component-inherit": "0.0.3",
+ "debug": "3.1.0",
+ "engine.io-parser": "2.1.2",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "parseqs": "0.0.5",
+ "parseuri": "0.0.5",
+ "ws": "3.3.3",
+ "xmlhttprequest-ssl": "1.5.5",
+ "yeast": "0.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "engine.io-parser": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz",
+ "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==",
+ "dev": true,
+ "requires": {
+ "after": "0.8.2",
+ "arraybuffer.slice": "0.0.7",
+ "base64-arraybuffer": "0.1.5",
+ "blob": "0.0.4",
+ "has-binary2": "1.0.2"
+ }
+ },
+ "error": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz",
+ "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=",
+ "requires": {
+ "string-template": "0.2.1",
+ "xtend": "4.0.1"
+ }
+ },
+ "error-ex": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+ "requires": {
+ "is-arrayish": "0.2.1"
+ }
+ },
+ "es6-promise": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
+ "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ=="
+ },
+ "es6-promisify": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
+ "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
+ "requires": {
+ "es6-promise": "4.2.4"
+ }
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+ },
+ "escodegen": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
+ "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
+ "requires": {
+ "esprima": "2.7.3",
+ "estraverse": "1.9.3",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.2.0"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE="
+ },
+ "source-map": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
+ "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
+ "optional": true,
+ "requires": {
+ "amdefine": "1.0.1"
+ }
+ }
+ }
+ },
+ "eslint": {
+ "version": "4.19.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
+ "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==",
+ "requires": {
+ "ajv": "5.5.2",
+ "babel-code-frame": "6.26.0",
+ "chalk": "2.4.1",
+ "concat-stream": "1.6.2",
+ "cross-spawn": "5.1.0",
+ "debug": "3.1.0",
+ "doctrine": "2.1.0",
+ "eslint-scope": "3.7.1",
+ "eslint-visitor-keys": "1.0.0",
+ "espree": "3.5.4",
+ "esquery": "1.0.1",
+ "esutils": "2.0.2",
+ "file-entry-cache": "2.0.0",
+ "functional-red-black-tree": "1.0.1",
+ "glob": "7.1.2",
+ "globals": "11.5.0",
+ "ignore": "3.3.8",
+ "imurmurhash": "0.1.4",
+ "inquirer": "3.3.0",
+ "is-resolvable": "1.1.0",
+ "js-yaml": "3.11.0",
+ "json-stable-stringify-without-jsonify": "1.0.1",
+ "levn": "0.3.0",
+ "lodash": "4.17.10",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.1",
+ "natural-compare": "1.4.0",
+ "optionator": "0.8.2",
+ "path-is-inside": "1.0.2",
+ "pluralize": "7.0.0",
+ "progress": "2.0.0",
+ "regexpp": "1.1.0",
+ "require-uncached": "1.0.3",
+ "semver": "5.5.0",
+ "strip-ansi": "4.0.0",
+ "strip-json-comments": "2.0.1",
+ "table": "4.0.2",
+ "text-table": "0.2.0"
+ },
+ "dependencies": {
+ "ansi-escapes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
+ "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw=="
+ },
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "requires": {
+ "restore-cursor": "2.0.0"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "external-editor": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
+ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
+ "requires": {
+ "chardet": "0.4.2",
+ "iconv-lite": "0.4.23",
+ "tmp": "0.0.33"
+ }
+ },
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "requires": {
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "globals": {
+ "version": "11.5.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz",
+ "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ },
+ "inquirer": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
+ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
+ "requires": {
+ "ansi-escapes": "3.1.0",
+ "chalk": "2.4.1",
+ "cli-cursor": "2.1.0",
+ "cli-width": "2.2.0",
+ "external-editor": "2.2.0",
+ "figures": "2.0.0",
+ "lodash": "4.17.10",
+ "mute-stream": "0.0.7",
+ "run-async": "2.3.0",
+ "rx-lite": "4.0.8",
+ "rx-lite-aggregates": "4.0.8",
+ "string-width": "2.1.1",
+ "strip-ansi": "4.0.0",
+ "through": "2.3.8"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+ },
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "requires": {
+ "mimic-fn": "1.2.0"
+ }
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "requires": {
+ "onetime": "2.0.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ }
+ }
+ },
+ "eslint-scope": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
+ "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
+ "requires": {
+ "esrecurse": "4.2.1",
+ "estraverse": "4.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
+ "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ=="
+ },
+ "espree": {
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
+ "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
+ "requires": {
+ "acorn": "5.5.3",
+ "acorn-jsx": "3.0.1"
+ }
+ },
+ "esprima": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
+ "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw=="
+ },
+ "esquery": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
+ "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
+ "requires": {
+ "estraverse": "4.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
+ }
+ }
+ },
+ "esrecurse": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
+ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+ "requires": {
+ "estraverse": "4.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
+ }
+ }
+ },
+ "estraverse": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
+ "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q="
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+ "dev": true
+ },
+ "eventemitter3": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
+ "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==",
+ "dev": true
+ },
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+ "requires": {
+ "cross-spawn": "5.1.0",
+ "get-stream": "3.0.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.2",
+ "strip-eof": "1.0.0"
+ }
+ },
+ "exit-hook": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
+ "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g="
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "requires": {
+ "is-posix-bracket": "0.1.1"
+ }
+ },
+ "expand-range": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+ "requires": {
+ "fill-range": "2.2.4"
+ }
+ },
+ "expand-tilde": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz",
+ "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "express": {
+ "version": "4.16.3",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz",
+ "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
+ "dev": true,
+ "requires": {
+ "accepts": "1.3.5",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.18.2",
+ "content-disposition": "0.5.2",
+ "content-type": "1.0.4",
+ "cookie": "0.3.1",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.8.1",
+ "finalhandler": "1.1.1",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "1.1.2",
+ "on-finished": "2.3.0",
+ "parseurl": "1.3.2",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "2.0.3",
+ "qs": "6.5.1",
+ "range-parser": "1.2.0",
+ "safe-buffer": "5.1.1",
+ "send": "0.16.2",
+ "serve-static": "1.13.2",
+ "setprototypeof": "1.1.0",
+ "statuses": "1.4.0",
+ "type-is": "1.6.16",
+ "utils-merge": "1.0.1",
+ "vary": "1.1.2"
+ },
+ "dependencies": {
+ "mime": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+ "dev": true
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
+ "dev": true
+ },
+ "send": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
+ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "destroy": "1.0.4",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "1.6.3",
+ "mime": "1.4.1",
+ "ms": "2.0.0",
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.0",
+ "statuses": "1.4.0"
+ }
+ }
+ }
+ },
+ "ext-list": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz",
+ "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.33.0"
+ }
+ },
+ "ext-name": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-3.0.0.tgz",
+ "integrity": "sha1-B+RBhzfLH1E8MsbqSNi4yOBHGrs=",
+ "dev": true,
+ "requires": {
+ "ends-with": "0.2.0",
+ "ext-list": "2.2.2",
+ "meow": "3.7.0",
+ "sort-keys-length": "1.0.1"
+ }
+ },
+ "extend": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "external-editor": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-1.1.1.tgz",
+ "integrity": "sha1-Etew24UPf/fnCBuvQAVwAGDEYAs=",
+ "requires": {
+ "extend": "3.0.1",
+ "spawn-sync": "1.0.15",
+ "tmp": "0.0.29"
+ },
+ "dependencies": {
+ "tmp": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz",
+ "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=",
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "extract-zip": {
+ "version": "1.6.6",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz",
+ "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=",
+ "requires": {
+ "concat-stream": "1.6.0",
+ "debug": "2.6.9",
+ "mkdirp": "0.5.0",
+ "yauzl": "2.4.1"
+ },
+ "dependencies": {
+ "concat-stream": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
+ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6",
+ "typedarray": "0.0.6"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
+ },
+ "mkdirp": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz",
+ "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=",
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ }
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fancy-log": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
+ "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
+ "requires": {
+ "ansi-gray": "0.1.1",
+ "color-support": "1.1.3",
+ "time-stamp": "1.1.0"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+ "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
+ },
+ "fast-glob": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.1.tgz",
+ "integrity": "sha512-wSyW1TBK3ia5V+te0rGPXudeMHoUQW6O5Y9oATiaGhpENmEifPDlOdhpsnlj5HoG6ttIvGiY1DdCmI9X2xGMhg==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.2",
+ "micromatch": "3.1.10"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ }
+ }
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+ },
+ "fd-slicer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
+ "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
+ "requires": {
+ "pend": "1.2.0"
+ }
+ },
+ "feature-detect-es6": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/feature-detect-es6/-/feature-detect-es6-1.4.0.tgz",
+ "integrity": "sha512-7OnRV38WLydGuGcdm/fGk2SG9uo5ljslBSbPhCfEW5Gl0lX/IliaAVXYiYUBcI0UHTbepqO4T1SkJ74K8gtcDg==",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4"
+ }
+ },
+ "figures": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
+ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+ "requires": {
+ "escape-string-regexp": "1.0.5",
+ "object-assign": "4.1.1"
+ }
+ },
+ "file-entry-cache": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
+ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+ "requires": {
+ "flat-cache": "1.3.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "filename-regex": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY="
+ },
+ "fill-range": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
+ "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
+ "requires": {
+ "is-number": "2.1.0",
+ "isobject": "2.1.0",
+ "randomatic": "3.0.0",
+ "repeat-element": "1.1.2",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "filled-array": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/filled-array/-/filled-array-1.1.0.tgz",
+ "integrity": "sha1-w8T2xmO5I0WamqKZEtLQMfFQf4Q=",
+ "dev": true
+ },
+ "finalhandler": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
+ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "on-finished": "2.3.0",
+ "parseurl": "1.3.2",
+ "statuses": "1.4.0",
+ "unpipe": "1.0.0"
+ }
+ },
+ "find-index": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz",
+ "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ="
+ },
+ "find-port": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/find-port/-/find-port-1.0.1.tgz",
+ "integrity": "sha1-2whKbL+ZVk2Zhprnn73s9m6KGFw=",
+ "dev": true,
+ "requires": {
+ "async": "0.2.10"
+ },
+ "dependencies": {
+ "async": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
+ "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
+ "dev": true
+ }
+ }
+ },
+ "find-replace": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz",
+ "integrity": "sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "test-value": "2.1.0"
+ }
+ },
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "requires": {
+ "path-exists": "2.1.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "findup-sync": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz",
+ "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=",
+ "dev": true,
+ "requires": {
+ "detect-file": "0.1.0",
+ "is-glob": "2.0.1",
+ "micromatch": "2.3.11",
+ "resolve-dir": "0.1.1"
+ }
+ },
+ "fined": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz",
+ "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=",
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "is-plain-object": "2.0.4",
+ "object.defaults": "1.1.0",
+ "object.pick": "1.3.0",
+ "parse-filepath": "1.0.2"
+ },
+ "dependencies": {
+ "expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "requires": {
+ "homedir-polyfill": "1.0.1"
+ }
+ }
+ }
+ },
+ "first-chunk-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz",
+ "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04="
+ },
+ "flagged-respawn": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz",
+ "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c="
+ },
+ "flat-cache": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
+ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
+ "requires": {
+ "circular-json": "0.3.3",
+ "del": "2.2.2",
+ "graceful-fs": "4.1.11",
+ "write": "0.2.1"
+ },
+ "dependencies": {
+ "del": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "requires": {
+ "globby": "5.0.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.1",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "rimraf": "2.6.2"
+ }
+ },
+ "globby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+ "requires": {
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ }
+ }
+ },
+ "follow-redirects": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-0.0.7.tgz",
+ "integrity": "sha1-NLkLqyqRGqNHVx2pDyK9NuzYqRk=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "stream-consume": "0.1.1"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+ },
+ "for-own": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "dev": true
+ },
+ "fork-stream": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz",
+ "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=",
+ "dev": true
+ },
+ "form-data": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
+ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
+ "dev": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.6",
+ "mime-types": "2.1.18"
+ }
+ },
+ "formatio": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz",
+ "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=",
+ "requires": {
+ "samsam": "1.1.2"
+ }
+ },
+ "forwarded": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "freeport": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/freeport/-/freeport-1.0.5.tgz",
+ "integrity": "sha1-JV6KuEFwwzuoXZkOghrl9KGpvF0=",
+ "dev": true,
+ "optional": true
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+ "dev": true
+ },
+ "fs-constants": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+ "dev": true
+ },
+ "fs-exists-sync": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
+ "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=",
+ "dev": true
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ },
+ "fsevents": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.3.tgz",
+ "integrity": "sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nan": "2.10.0",
+ "node-pre-gyp": "0.9.1"
+ },
+ "dependencies": {
+ "abbrev": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "aproba": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "are-we-there-yet": {
+ "version": "1.1.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "delegates": "1.0.0",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chownr": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.4.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "detect-libc": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "fs-minipass": {
+ "version": "1.2.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minipass": "2.2.4"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aproba": "1.2.0",
+ "console-control-strings": "1.1.0",
+ "has-unicode": "2.0.1",
+ "object-assign": "4.1.1",
+ "signal-exit": "3.0.2",
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wide-align": "1.1.2"
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "iconv-lite": {
+ "version": "0.4.21",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safer-buffer": "2.1.2"
+ }
+ },
+ "ignore-walk": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "bundled": true,
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "bundled": true,
+ "dev": true
+ },
+ "minipass": {
+ "version": "2.2.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1",
+ "yallist": "3.0.2"
+ }
+ },
+ "minizlib": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minipass": "2.2.4"
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "needle": {
+ "version": "2.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "debug": "2.6.9",
+ "iconv-lite": "0.4.21",
+ "sax": "1.2.4"
+ }
+ },
+ "node-pre-gyp": {
+ "version": "0.9.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "detect-libc": "1.0.3",
+ "mkdirp": "0.5.1",
+ "needle": "2.2.0",
+ "nopt": "4.0.1",
+ "npm-packlist": "1.1.10",
+ "npmlog": "4.1.2",
+ "rc": "1.2.6",
+ "rimraf": "2.6.2",
+ "semver": "5.5.0",
+ "tar": "4.4.1"
+ }
+ },
+ "nopt": {
+ "version": "4.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "abbrev": "1.1.1",
+ "osenv": "0.1.5"
+ }
+ },
+ "npm-bundled": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "npm-packlist": {
+ "version": "1.1.10",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ignore-walk": "3.0.1",
+ "npm-bundled": "1.0.3"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "are-we-there-yet": "1.1.4",
+ "console-control-strings": "1.1.0",
+ "gauge": "2.7.4",
+ "set-blocking": "2.0.0"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "rc": {
+ "version": "1.2.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "deep-extend": "0.4.2",
+ "ini": "1.3.5",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "sax": {
+ "version": "1.2.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "semver": {
+ "version": "5.5.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "tar": {
+ "version": "4.4.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chownr": "1.0.1",
+ "fs-minipass": "1.2.5",
+ "minipass": "2.2.4",
+ "minizlib": "1.1.0",
+ "mkdirp": "0.5.1",
+ "safe-buffer": "5.1.1",
+ "yallist": "3.0.2"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "wide-align": {
+ "version": "1.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "string-width": "1.0.2"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true
+ },
+ "yallist": {
+ "version": "3.0.2",
+ "bundled": true,
+ "dev": true
+ }
+ }
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
+ },
+ "gaze": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz",
+ "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=",
+ "requires": {
+ "globule": "0.1.0"
+ }
+ },
+ "generate-function": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
+ "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=",
+ "dev": true,
+ "optional": true
+ },
+ "generate-object-property": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
+ "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-property": "1.0.2"
+ }
+ },
+ "get-caller-file": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
+ "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U="
+ },
+ "get-func-name": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ }
+ },
+ "gh-got": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-5.0.0.tgz",
+ "integrity": "sha1-7pW+NxBv2HSKlvjR20uuqJ4b+oo=",
+ "requires": {
+ "got": "6.7.1",
+ "is-plain-obj": "1.1.0"
+ },
+ "dependencies": {
+ "got": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+ "requires": {
+ "create-error-class": "3.0.2",
+ "duplexer3": "0.1.4",
+ "get-stream": "3.0.0",
+ "is-redirect": "1.0.0",
+ "is-retry-allowed": "1.1.0",
+ "is-stream": "1.1.0",
+ "lowercase-keys": "1.0.1",
+ "safe-buffer": "5.1.2",
+ "timed-out": "4.0.1",
+ "unzip-response": "2.0.1",
+ "url-parse-lax": "1.0.0"
+ }
+ },
+ "timed-out": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
+ },
+ "unzip-response": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+ "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c="
+ }
+ }
+ },
+ "github": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/github/-/github-7.3.2.tgz",
+ "integrity": "sha1-/hDN5pZDUsXZHhGnYW0m1f+2+Hs=",
+ "dev": true,
+ "requires": {
+ "follow-redirects": "0.0.7",
+ "https-proxy-agent": "1.0.0",
+ "mime": "1.6.0",
+ "netrc": "0.1.4"
+ }
+ },
+ "github-username": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/github-username/-/github-username-3.0.0.tgz",
+ "integrity": "sha1-CnciGbMTB0NCnyRW0L3T21Xc57E=",
+ "requires": {
+ "gh-got": "5.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-base": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+ "requires": {
+ "glob-parent": "2.0.0",
+ "is-glob": "2.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+ "requires": {
+ "is-glob": "2.0.1"
+ }
+ },
+ "glob-stream": {
+ "version": "5.3.5",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz",
+ "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=",
+ "requires": {
+ "extend": "3.0.1",
+ "glob": "5.0.15",
+ "glob-parent": "3.1.0",
+ "micromatch": "2.3.11",
+ "ordered-read-streams": "0.3.0",
+ "through2": "0.6.5",
+ "to-absolute-glob": "0.1.1",
+ "unique-stream": "2.2.1"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "glob-watcher": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz",
+ "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=",
+ "requires": {
+ "gaze": "0.5.2"
+ }
+ },
+ "glob2base": {
+ "version": "0.0.12",
+ "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz",
+ "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=",
+ "requires": {
+ "find-index": "0.1.1"
+ }
+ },
+ "global-dirs": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+ "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
+ "dev": true,
+ "requires": {
+ "ini": "1.3.5"
+ }
+ },
+ "global-modules": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz",
+ "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=",
+ "dev": true,
+ "requires": {
+ "global-prefix": "0.1.5",
+ "is-windows": "0.2.0"
+ }
+ },
+ "global-prefix": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz",
+ "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "1.0.1",
+ "ini": "1.3.5",
+ "is-windows": "0.2.0",
+ "which": "1.3.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
+ },
+ "globby": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz",
+ "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==",
+ "dev": true,
+ "requires": {
+ "array-union": "1.0.2",
+ "dir-glob": "2.0.0",
+ "fast-glob": "2.2.1",
+ "glob": "7.1.2",
+ "ignore": "3.3.8",
+ "pify": "3.0.0",
+ "slash": "1.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ }
+ }
+ },
+ "globule": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz",
+ "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=",
+ "requires": {
+ "glob": "3.1.21",
+ "lodash": "1.0.2",
+ "minimatch": "0.2.14"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "3.1.21",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz",
+ "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=",
+ "requires": {
+ "graceful-fs": "1.2.3",
+ "inherits": "1.0.2",
+ "minimatch": "0.2.14"
+ }
+ },
+ "graceful-fs": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
+ "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q="
+ },
+ "inherits": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz",
+ "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js="
+ },
+ "lodash": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz",
+ "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE="
+ },
+ "lru-cache": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
+ "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI="
+ },
+ "minimatch": {
+ "version": "0.2.14",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
+ "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
+ "requires": {
+ "lru-cache": "2.7.3",
+ "sigmund": "1.0.1"
+ }
+ }
+ }
+ },
+ "glogg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz",
+ "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==",
+ "requires": {
+ "sparkles": "1.0.0"
+ }
+ },
+ "got": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz",
+ "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=",
+ "dev": true,
+ "requires": {
+ "create-error-class": "3.0.2",
+ "duplexer2": "0.1.4",
+ "is-redirect": "1.0.0",
+ "is-retry-allowed": "1.1.0",
+ "is-stream": "1.1.0",
+ "lowercase-keys": "1.0.1",
+ "node-status-codes": "1.0.0",
+ "object-assign": "4.1.1",
+ "parse-json": "2.2.0",
+ "pinkie-promise": "2.0.1",
+ "read-all-stream": "3.1.0",
+ "readable-stream": "2.3.6",
+ "timed-out": "3.1.3",
+ "unzip-response": "1.0.2",
+ "url-parse-lax": "1.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
+ },
+ "graceful-readlink": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU="
+ },
+ "grouped-queue": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-0.3.3.tgz",
+ "integrity": "sha1-wWfSpTGcWg4JZO9qJbfC34mWyFw=",
+ "requires": {
+ "lodash": "4.17.10"
+ }
+ },
+ "growl": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz",
+ "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8="
+ },
+ "gulp": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz",
+ "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=",
+ "requires": {
+ "archy": "1.0.0",
+ "chalk": "1.1.3",
+ "deprecated": "0.0.1",
+ "gulp-util": "3.0.8",
+ "interpret": "1.1.0",
+ "liftoff": "2.5.0",
+ "minimist": "1.2.0",
+ "orchestrator": "0.3.8",
+ "pretty-hrtime": "1.0.3",
+ "semver": "4.3.6",
+ "tildify": "1.2.0",
+ "v8flags": "2.1.1",
+ "vinyl-fs": "0.3.14"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
+ "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8="
+ },
+ "glob": {
+ "version": "4.5.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz",
+ "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=",
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "2.0.10",
+ "once": "1.4.0"
+ }
+ },
+ "glob-stream": {
+ "version": "3.1.18",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz",
+ "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=",
+ "requires": {
+ "glob": "4.5.3",
+ "glob2base": "0.0.12",
+ "minimatch": "2.0.10",
+ "ordered-read-streams": "0.1.0",
+ "through2": "0.6.5",
+ "unique-stream": "1.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
+ "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
+ "requires": {
+ "natives": "1.1.3"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "minimatch": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz",
+ "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "ordered-read-streams": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz",
+ "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY="
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "semver": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
+ "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto="
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ },
+ "strip-bom": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz",
+ "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=",
+ "requires": {
+ "first-chunk-stream": "1.0.0",
+ "is-utf8": "0.2.1"
+ }
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ },
+ "unique-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz",
+ "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs="
+ },
+ "vinyl": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
+ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
+ "requires": {
+ "clone": "0.2.0",
+ "clone-stats": "0.0.1"
+ }
+ },
+ "vinyl-fs": {
+ "version": "0.3.14",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz",
+ "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=",
+ "requires": {
+ "defaults": "1.0.3",
+ "glob-stream": "3.1.18",
+ "glob-watcher": "0.0.6",
+ "graceful-fs": "3.0.11",
+ "mkdirp": "0.5.1",
+ "strip-bom": "1.0.0",
+ "through2": "0.6.5",
+ "vinyl": "0.4.6"
+ }
+ }
+ }
+ },
+ "gulp-eslint": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-4.0.2.tgz",
+ "integrity": "sha512-fcFUQzFsN6dJ6KZlG+qPOEkqfcevRUXgztkYCvhNvJeSvOicC8ucutN4qR/ID8LmNZx9YPIkBzazTNnVvbh8wg==",
+ "requires": {
+ "eslint": "4.19.1",
+ "fancy-log": "1.3.2",
+ "plugin-error": "1.0.1"
+ }
+ },
+ "gulp-if": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz",
+ "integrity": "sha1-pJe351cwBQQcqivIt92jyARE1ik=",
+ "dev": true,
+ "requires": {
+ "gulp-match": "1.0.3",
+ "ternary-stream": "2.0.1",
+ "through2": "2.0.3"
+ }
+ },
+ "gulp-match": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.0.3.tgz",
+ "integrity": "sha1-kcfA1/Kb7NZgbVfYCn+Hdqh6uo4=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "gulp-mocha": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/gulp-mocha/-/gulp-mocha-4.3.1.tgz",
+ "integrity": "sha1-d5ULQ7z/gWWVdnwHNOD9p9Fz3Nk=",
+ "requires": {
+ "dargs": "5.1.0",
+ "execa": "0.6.3",
+ "gulp-util": "3.0.8",
+ "mocha": "3.5.3",
+ "npm-run-path": "2.0.2",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "execa": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.6.3.tgz",
+ "integrity": "sha1-V7aaWU8IF1nGnlNw8NF7nLEWWP4=",
+ "requires": {
+ "cross-spawn": "5.1.0",
+ "get-stream": "3.0.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.2",
+ "strip-eof": "1.0.0"
+ }
+ }
+ }
+ },
+ "gulp-sourcemaps": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz",
+ "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=",
+ "requires": {
+ "convert-source-map": "1.5.1",
+ "graceful-fs": "4.1.11",
+ "strip-bom": "2.0.0",
+ "through2": "2.0.3",
+ "vinyl": "1.2.0"
+ }
+ },
+ "gulp-spawn-mocha": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/gulp-spawn-mocha/-/gulp-spawn-mocha-3.3.1.tgz",
+ "integrity": "sha512-0DoyYQ4+MmARhs6N0Yr5+Sm8K8aN0SwJoxpRl6YfWPP2nZhMLHtDx7grm7Bw5cr0VR2urkG/p36rRAbCqzaP2A==",
+ "requires": {
+ "gulp-util": "3.0.8",
+ "lodash": "4.17.10",
+ "through": "2.3.8"
+ }
+ },
+ "gulp-tslint": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/gulp-tslint/-/gulp-tslint-7.1.0.tgz",
+ "integrity": "sha1-m9P/T7wW1MvZq7CP94bbibVj6T0=",
+ "requires": {
+ "gulp-util": "3.0.8",
+ "map-stream": "0.1.0",
+ "through": "2.3.8"
+ }
+ },
+ "gulp-typescript": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-3.2.4.tgz",
+ "integrity": "sha512-bZosNvbUGzFA4bjjWoUPyjU5vfgJSzlYKkU0Jutbsrj+td8yvtqxethhqfzB9MwyamaUODIuidj5gIytZ523Bw==",
+ "requires": {
+ "gulp-util": "3.0.8",
+ "source-map": "0.5.7",
+ "through2": "2.0.3",
+ "vinyl-fs": "2.4.4"
+ }
+ },
+ "gulp-util": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
+ "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
+ "requires": {
+ "array-differ": "1.0.0",
+ "array-uniq": "1.0.3",
+ "beeper": "1.1.1",
+ "chalk": "1.1.3",
+ "dateformat": "2.2.0",
+ "fancy-log": "1.3.2",
+ "gulplog": "1.0.0",
+ "has-gulplog": "0.1.0",
+ "lodash._reescape": "3.0.0",
+ "lodash._reevaluate": "3.0.0",
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.template": "3.6.2",
+ "minimist": "1.2.0",
+ "multipipe": "0.1.2",
+ "object-assign": "3.0.0",
+ "replace-ext": "0.0.1",
+ "through2": "2.0.3",
+ "vinyl": "0.5.3"
+ },
+ "dependencies": {
+ "object-assign": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
+ "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I="
+ },
+ "vinyl": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
+ "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
+ "requires": {
+ "clone": "1.0.4",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ }
+ }
+ },
+ "gulplog": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
+ "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
+ "requires": {
+ "glogg": "1.0.1"
+ }
+ },
+ "gunzip-maybe": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.1.tgz",
+ "integrity": "sha512-qtutIKMthNJJgeHQS7kZ9FqDq59/Wn0G2HYCRNjpup7yKfVI6/eqwpmroyZGFoCYaG+sW6psNVb4zoLADHpp2g==",
+ "dev": true,
+ "requires": {
+ "browserify-zlib": "0.1.4",
+ "is-deflate": "1.0.0",
+ "is-gzip": "1.0.0",
+ "peek-stream": "1.1.3",
+ "pumpify": "1.5.0",
+ "through2": "2.0.3"
+ }
+ },
+ "handle-thing": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz",
+ "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=",
+ "dev": true
+ },
+ "handlebars": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
+ "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
+ "requires": {
+ "async": "1.5.2",
+ "optimist": "0.6.1",
+ "source-map": "0.4.4",
+ "uglify-js": "2.8.29"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
+ },
+ "source-map": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+ "requires": {
+ "amdefine": "1.0.1"
+ }
+ }
+ }
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
+ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "har-schema": "2.0.0"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-binary2": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz",
+ "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=",
+ "dev": true,
+ "requires": {
+ "isarray": "2.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+ "dev": true
+ }
+ }
+ },
+ "has-color": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz",
+ "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=",
+ "dev": true
+ },
+ "has-cors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+ "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+ },
+ "has-gulplog": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz",
+ "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
+ "requires": {
+ "sparkles": "1.0.0"
+ }
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "hawk": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
+ "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
+ "dev": true,
+ "requires": {
+ "boom": "4.3.1",
+ "cryptiles": "3.1.2",
+ "hoek": "4.2.1",
+ "sntp": "2.1.0"
+ }
+ },
+ "he": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0="
+ },
+ "hoek": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz",
+ "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==",
+ "dev": true
+ },
+ "homedir-polyfill": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
+ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
+ "requires": {
+ "parse-passwd": "1.0.0"
+ }
+ },
+ "hosted-git-info": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz",
+ "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw=="
+ },
+ "hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "obuf": "1.1.2",
+ "readable-stream": "2.3.6",
+ "wbuf": "1.7.3"
+ }
+ },
+ "html-minifier": {
+ "version": "3.5.15",
+ "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.15.tgz",
+ "integrity": "sha512-OZa4rfb6tZOZ3Z8Xf0jKxXkiDcFWldQePGYFDcgKqES2sXeWaEv9y6QQvWUtX3ySI3feApQi5uCsHLINQ6NoAw==",
+ "dev": true,
+ "requires": {
+ "camel-case": "3.0.0",
+ "clean-css": "4.1.11",
+ "commander": "2.15.1",
+ "he": "1.1.1",
+ "param-case": "2.1.1",
+ "relateurl": "0.2.7",
+ "uglify-js": "3.3.24"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
+ "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "uglify-js": {
+ "version": "3.3.24",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.24.tgz",
+ "integrity": "sha512-hS7+TDiqIqvWScCcKRybCQzmMnEzJ4ryl9ErRmW4GFyG48p0/dKZiy/5mVLbsFzU8CCnCgQdxMiJzZythvLzCg==",
+ "dev": true,
+ "requires": {
+ "commander": "2.15.1",
+ "source-map": "0.6.1"
+ }
+ }
+ }
+ },
+ "http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+ "dev": true,
+ "requires": {
+ "depd": "1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": "1.4.0"
+ }
+ },
+ "http-proxy": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
+ "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
+ "dev": true,
+ "requires": {
+ "eventemitter3": "3.1.0",
+ "follow-redirects": "1.4.1",
+ "requires-port": "1.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "follow-redirects": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz",
+ "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==",
+ "dev": true,
+ "requires": {
+ "debug": "3.1.0"
+ }
+ }
+ }
+ },
+ "http-proxy-middleware": {
+ "version": "0.17.4",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz",
+ "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=",
+ "dev": true,
+ "requires": {
+ "http-proxy": "1.17.0",
+ "is-glob": "3.1.0",
+ "lodash": "4.17.10",
+ "micromatch": "2.3.11"
+ },
+ "dependencies": {
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "jsprim": "1.4.1",
+ "sshpk": "1.14.1"
+ }
+ },
+ "https-proxy-agent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz",
+ "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=",
+ "dev": true,
+ "requires": {
+ "agent-base": "2.1.1",
+ "debug": "2.6.9",
+ "extend": "3.0.1"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.23",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
+ "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
+ "requires": {
+ "safer-buffer": "2.1.2"
+ }
+ },
+ "ignore": {
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz",
+ "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg=="
+ },
+ "import-lazy": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+ "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+ "dev": true
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "indexof": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ },
+ "ini": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
+ },
+ "inquirer": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-1.2.3.tgz",
+ "integrity": "sha1-TexvMvN+97sLLtPx0aXD9UUHSRg=",
+ "requires": {
+ "ansi-escapes": "1.4.0",
+ "chalk": "1.1.3",
+ "cli-cursor": "1.0.2",
+ "cli-width": "2.2.0",
+ "external-editor": "1.1.1",
+ "figures": "1.7.0",
+ "lodash": "4.17.10",
+ "mute-stream": "0.0.6",
+ "pinkie-promise": "2.0.1",
+ "run-async": "2.3.0",
+ "rx": "4.1.0",
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "through": "2.3.8"
+ }
+ },
+ "interpret": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
+ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ="
+ },
+ "intersect": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/intersect/-/intersect-1.0.1.tgz",
+ "integrity": "sha1-MyZQ4QhU2MCsWMGSvcJ6i/fnoww=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
+ },
+ "ipaddr.js": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz",
+ "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=",
+ "dev": true
+ },
+ "is-absolute": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
+ "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
+ "requires": {
+ "is-relative": "1.0.0",
+ "is-windows": "1.0.2"
+ },
+ "dependencies": {
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+ }
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "1.11.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+ "requires": {
+ "builtin-modules": "1.1.1"
+ }
+ },
+ "is-ci": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz",
+ "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==",
+ "dev": true,
+ "requires": {
+ "ci-info": "1.1.3"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-deflate": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz",
+ "integrity": "sha1-yGKQHDwWH7CdrHzcfnhPgOmPLxQ=",
+ "dev": true
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+ }
+ }
+ },
+ "is-dotfile": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+ "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE="
+ },
+ "is-equal-shallow": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+ "requires": {
+ "is-primitive": "2.0.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "is-gzip": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz",
+ "integrity": "sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=",
+ "dev": true
+ },
+ "is-installed-globally": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
+ "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
+ "dev": true,
+ "requires": {
+ "global-dirs": "0.1.1",
+ "is-path-inside": "1.0.1"
+ }
+ },
+ "is-my-ip-valid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz",
+ "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==",
+ "dev": true,
+ "optional": true
+ },
+ "is-my-json-valid": {
+ "version": "2.17.2",
+ "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz",
+ "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "generate-function": "2.0.0",
+ "generate-object-property": "1.2.0",
+ "is-my-ip-valid": "1.0.0",
+ "jsonpointer": "4.0.1",
+ "xtend": "4.0.1"
+ }
+ },
+ "is-npm": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
+ "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
+ "dev": true
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+ "dev": true
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ=="
+ }
+ }
+ },
+ "is-path-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+ "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0="
+ },
+ "is-path-in-cwd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
+ "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
+ "requires": {
+ "is-path-inside": "1.0.1"
+ }
+ },
+ "is-path-inside": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+ "requires": {
+ "path-is-inside": "1.0.2"
+ }
+ },
+ "is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "is-posix-bracket": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+ "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q="
+ },
+ "is-potential-custom-element-name": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz",
+ "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=",
+ "dev": true
+ },
+ "is-primitive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU="
+ },
+ "is-promise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
+ },
+ "is-property": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+ "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
+ "dev": true,
+ "optional": true
+ },
+ "is-redirect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+ "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ="
+ },
+ "is-relative": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
+ "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
+ "requires": {
+ "is-unc-path": "1.0.0"
+ }
+ },
+ "is-resolvable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
+ },
+ "is-retry-allowed": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
+ "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ="
+ },
+ "is-scoped": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-1.0.0.tgz",
+ "integrity": "sha1-RJypgpnnEwOCViieyytUDcQ3yzA=",
+ "requires": {
+ "scoped-regex": "1.0.0"
+ }
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "is-unc-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
+ "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
+ "requires": {
+ "unc-path-regex": "0.1.2"
+ }
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
+ },
+ "is-valid-glob": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz",
+ "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4="
+ },
+ "is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "istanbul": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz",
+ "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=",
+ "requires": {
+ "abbrev": "1.0.9",
+ "async": "1.0.0",
+ "escodegen": "1.8.1",
+ "esprima": "2.7.3",
+ "glob": "5.0.15",
+ "handlebars": "4.0.11",
+ "js-yaml": "3.11.0",
+ "mkdirp": "0.5.1",
+ "nopt": "3.0.6",
+ "once": "1.4.0",
+ "resolve": "1.1.7",
+ "supports-color": "3.2.3",
+ "which": "1.3.0",
+ "wordwrap": "1.0.0"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE="
+ },
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "resolve": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs="
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "istextorbinary": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz",
+ "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==",
+ "requires": {
+ "binaryextensions": "2.1.1",
+ "editions": "1.3.4",
+ "textextensions": "2.2.0"
+ }
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
+ },
+ "js-yaml": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz",
+ "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==",
+ "requires": {
+ "argparse": "1.0.10",
+ "esprima": "4.0.0"
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "dev": true,
+ "optional": true
+ },
+ "jsesc": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz",
+ "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=",
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
+ },
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+ "requires": {
+ "jsonify": "0.0.0"
+ }
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+ "dev": true
+ },
+ "json3": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
+ "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE="
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
+ },
+ "jsonpointer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
+ "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
+ "dev": true,
+ "optional": true
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ },
+ "latest-version": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-2.0.0.tgz",
+ "integrity": "sha1-VvjWE5YghHuAF/jx9NeOIRMkFos=",
+ "dev": true,
+ "requires": {
+ "package-json": "2.4.0"
+ }
+ },
+ "launchpad": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/launchpad/-/launchpad-0.7.0.tgz",
+ "integrity": "sha1-9CfTwOFehp7hVROCi6/vwW+ce8M=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "async": "2.6.0",
+ "browserstack": "1.5.0",
+ "debug": "2.6.9",
+ "plist": "2.1.0",
+ "q": "1.5.1",
+ "underscore": "1.9.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "lodash": "4.17.10"
+ }
+ },
+ "underscore": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.0.tgz",
+ "integrity": "sha512-4IV1DSSxC1QK48j9ONFK1MoIAKKkbE8i7u55w2R6IqBqbT7A/iG7aZBCR2Bi8piF0Uz+i/MG1aeqLwl/5vqF+A==",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "lazy-cache": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
+ "optional": true
+ },
+ "lazy-req": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz",
+ "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=",
+ "dev": true
+ },
+ "lazystream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
+ "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "requires": {
+ "invert-kv": "1.0.0"
+ }
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "liftoff": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz",
+ "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=",
+ "requires": {
+ "extend": "3.0.1",
+ "findup-sync": "2.0.0",
+ "fined": "1.1.0",
+ "flagged-respawn": "1.0.0",
+ "is-plain-object": "2.0.4",
+ "object.map": "1.0.1",
+ "rechoir": "0.6.2",
+ "resolve": "1.7.1"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc="
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+ }
+ }
+ },
+ "expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "requires": {
+ "homedir-polyfill": "1.0.1"
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "findup-sync": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
+ "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
+ "requires": {
+ "detect-file": "1.0.0",
+ "is-glob": "3.1.0",
+ "micromatch": "3.1.10",
+ "resolve-dir": "1.0.1"
+ }
+ },
+ "global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "requires": {
+ "global-prefix": "1.0.2",
+ "is-windows": "1.0.2",
+ "resolve-dir": "1.0.1"
+ }
+ },
+ "global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "homedir-polyfill": "1.0.1",
+ "ini": "1.3.5",
+ "is-windows": "1.0.2",
+ "which": "1.3.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "global-modules": "1.0.0"
+ }
+ }
+ }
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "strip-bom": "2.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "requires": {
+ "p-locate": "2.0.0",
+ "path-exists": "3.0.0"
+ },
+ "dependencies": {
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+ }
+ }
+ },
+ "lodash": {
+ "version": "4.17.10",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
+ },
+ "lodash._baseassign": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
+ "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
+ "requires": {
+ "lodash._basecopy": "3.0.1",
+ "lodash.keys": "3.1.2"
+ }
+ },
+ "lodash._basecopy": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
+ "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY="
+ },
+ "lodash._basecreate": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz",
+ "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE="
+ },
+ "lodash._basetostring": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz",
+ "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U="
+ },
+ "lodash._basevalues": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz",
+ "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc="
+ },
+ "lodash._getnative": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
+ "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U="
+ },
+ "lodash._isiterateecall": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
+ "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw="
+ },
+ "lodash._reescape": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz",
+ "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo="
+ },
+ "lodash._reevaluate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz",
+ "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0="
+ },
+ "lodash._reinterpolate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
+ },
+ "lodash._root": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
+ "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI="
+ },
+ "lodash.create": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz",
+ "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=",
+ "requires": {
+ "lodash._baseassign": "3.2.0",
+ "lodash._basecreate": "3.0.3",
+ "lodash._isiterateecall": "3.0.9"
+ }
+ },
+ "lodash.defaults": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+ "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
+ "dev": true
+ },
+ "lodash.escape": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz",
+ "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
+ "requires": {
+ "lodash._root": "3.0.1"
+ }
+ },
+ "lodash.isarguments": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
+ "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo="
+ },
+ "lodash.isarray": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
+ "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U="
+ },
+ "lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
+ "dev": true
+ },
+ "lodash.keys": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
+ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
+ "requires": {
+ "lodash._getnative": "3.9.1",
+ "lodash.isarguments": "3.1.0",
+ "lodash.isarray": "3.0.4"
+ }
+ },
+ "lodash.restparam": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
+ "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU="
+ },
+ "lodash.some": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz",
+ "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "lodash.template": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz",
+ "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
+ "requires": {
+ "lodash._basecopy": "3.0.1",
+ "lodash._basetostring": "3.0.1",
+ "lodash._basevalues": "3.0.0",
+ "lodash._isiterateecall": "3.0.9",
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.escape": "3.2.0",
+ "lodash.keys": "3.1.2",
+ "lodash.restparam": "3.6.1",
+ "lodash.templatesettings": "3.1.1"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz",
+ "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.escape": "3.2.0"
+ }
+ },
+ "log-symbols": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz",
+ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
+ "requires": {
+ "chalk": "1.1.3"
+ }
+ },
+ "lolex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz",
+ "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE="
+ },
+ "longest": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+ "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "dev": true,
+ "requires": {
+ "currently-unhandled": "0.4.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "lower-case": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
+ "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
+ "dev": true
+ },
+ "lowercase-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
+ },
+ "lru-cache": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
+ "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
+ "requires": {
+ "pseudomap": "1.0.2",
+ "yallist": "2.1.2"
+ }
+ },
+ "magic-string": {
+ "version": "0.22.5",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
+ "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
+ "dev": true,
+ "requires": {
+ "vlq": "0.2.3"
+ }
+ },
+ "make-dir": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz",
+ "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==",
+ "dev": true,
+ "requires": {
+ "pify": "3.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ }
+ }
+ },
+ "make-iterator": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
+ "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
+ "requires": {
+ "kind-of": "6.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
+ },
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ },
+ "map-stream": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
+ "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ="
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "matcher": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.0.tgz",
+ "integrity": "sha512-aZGv6JBTHqfqAd09jmAlbKnAICTfIvb5Z8gXVxPB5WZtFfHMaAMdACL7tQflD2V+6/8KNcY8s6DYtWLgpJP5lA==",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "math-random": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
+ "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w="
+ },
+ "md5": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
+ "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=",
+ "dev": true,
+ "requires": {
+ "charenc": "0.0.2",
+ "crypt": "0.0.2",
+ "is-buffer": "1.1.6"
+ }
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+ "dev": true
+ },
+ "mem": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
+ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+ "requires": {
+ "mimic-fn": "1.2.0"
+ }
+ },
+ "mem-fs": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-1.1.3.tgz",
+ "integrity": "sha1-uK6NLj/Lb10/kWXBLUVRoGXZicw=",
+ "requires": {
+ "through2": "2.0.3",
+ "vinyl": "1.2.0",
+ "vinyl-file": "2.0.0"
+ }
+ },
+ "mem-fs-editor": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-3.0.2.tgz",
+ "integrity": "sha1-3Qpuryu4prN3QAZ6pUnrUwEFr58=",
+ "requires": {
+ "commondir": "1.0.1",
+ "deep-extend": "0.4.2",
+ "ejs": "2.6.1",
+ "glob": "7.1.2",
+ "globby": "6.1.0",
+ "mkdirp": "0.5.1",
+ "multimatch": "2.1.0",
+ "rimraf": "2.6.2",
+ "through2": "2.0.3",
+ "vinyl": "2.1.0"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs="
+ },
+ "clone-stats": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA="
+ },
+ "globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+ "requires": {
+ "array-union": "1.0.2",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "replace-ext": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs="
+ },
+ "vinyl": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
+ "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=",
+ "requires": {
+ "clone": "2.1.1",
+ "clone-buffer": "1.0.0",
+ "clone-stats": "1.0.0",
+ "cloneable-readable": "1.1.2",
+ "remove-trailing-separator": "1.1.0",
+ "replace-ext": "1.0.0"
+ }
+ }
+ }
+ },
+ "memory-streams": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/memory-streams/-/memory-streams-0.1.3.tgz",
+ "integrity": "sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA==",
+ "requires": {
+ "readable-stream": "1.0.34"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ }
+ }
+ },
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "2.1.0",
+ "decamelize": "1.2.0",
+ "loud-rejection": "1.6.0",
+ "map-obj": "1.0.1",
+ "minimist": "1.2.0",
+ "normalize-package-data": "2.4.0",
+ "object-assign": "4.1.1",
+ "read-pkg-up": "1.0.1",
+ "redent": "1.0.0",
+ "trim-newlines": "1.0.0"
+ }
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+ "dev": true
+ },
+ "merge-stream": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
+ "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "merge2": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz",
+ "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==",
+ "dev": true
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "requires": {
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
+ }
+ },
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+ },
+ "mime-db": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
+ "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.18",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
+ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.33.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
+ },
+ "minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "requires": {
+ "minimist": "0.0.8"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
+ }
+ }
+ },
+ "mocha": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz",
+ "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==",
+ "requires": {
+ "browser-stdout": "1.3.0",
+ "commander": "2.9.0",
+ "debug": "2.6.8",
+ "diff": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "glob": "7.1.1",
+ "growl": "1.9.2",
+ "he": "1.1.1",
+ "json3": "3.3.2",
+ "lodash.create": "3.1.1",
+ "mkdirp": "0.5.1",
+ "supports-color": "3.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.8",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
+ "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "diff": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz",
+ "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k="
+ },
+ "glob": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
+ "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=",
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "supports-color": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz",
+ "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=",
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "mout": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mout/-/mout-1.1.0.tgz",
+ "integrity": "sha512-XsP0vf4As6BfqglxZqbqQ8SR6KQot2AgxvR0gG+WtUkf90vUXchMOZQtPf/Hml1rEffJupqL/tIrU6EYhsUQjw==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "multer": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/multer/-/multer-1.3.0.tgz",
+ "integrity": "sha1-CSsmcPaEb6SRSWXvyM+Uwg/sbNI=",
+ "dev": true,
+ "requires": {
+ "append-field": "0.1.0",
+ "busboy": "0.2.14",
+ "concat-stream": "1.6.2",
+ "mkdirp": "0.5.1",
+ "object-assign": "3.0.0",
+ "on-finished": "2.3.0",
+ "type-is": "1.6.16",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "object-assign": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
+ "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
+ "dev": true
+ }
+ }
+ },
+ "multimatch": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz",
+ "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=",
+ "requires": {
+ "array-differ": "1.0.0",
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "minimatch": "3.0.4"
+ }
+ },
+ "multipipe": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz",
+ "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=",
+ "requires": {
+ "duplexer2": "0.0.2"
+ },
+ "dependencies": {
+ "duplexer2": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
+ "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
+ "requires": {
+ "readable-stream": "1.1.14"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ }
+ }
+ },
+ "mute-stream": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz",
+ "integrity": "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s="
+ },
+ "mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "requires": {
+ "any-promise": "1.3.0",
+ "object-assign": "4.1.1",
+ "thenify-all": "1.6.0"
+ }
+ },
+ "nan": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
+ "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==",
+ "dev": true,
+ "optional": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "native-promise-only": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz",
+ "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE="
+ },
+ "natives": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.3.tgz",
+ "integrity": "sha512-BZGSYV4YOLxzoTK73l0/s/0sH9l8SHs2ocReMH1f8JYSh5FUWu4ZrKCpJdRkWXV6HFR/pZDz7bwWOVAY07q77g=="
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
+ },
+ "negotiator": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+ "dev": true
+ },
+ "netrc": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/netrc/-/netrc-0.1.4.tgz",
+ "integrity": "sha1-a+lPysqNd63gqWcNxGCRTJRHJEQ=",
+ "dev": true
+ },
+ "nice-try": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz",
+ "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==",
+ "dev": true,
+ "optional": true
+ },
+ "no-case": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+ "dev": true,
+ "requires": {
+ "lower-case": "1.1.4"
+ }
+ },
+ "node-status-codes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz",
+ "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=",
+ "dev": true
+ },
+ "nodegit-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/nodegit-promise/-/nodegit-promise-4.0.0.tgz",
+ "integrity": "sha1-VyKxhPLfcycWEGSnkdLoQskWezQ=",
+ "dev": true,
+ "requires": {
+ "asap": "2.0.6"
+ }
+ },
+ "nomnom": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz",
+ "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=",
+ "dev": true,
+ "requires": {
+ "chalk": "0.4.0",
+ "underscore": "1.6.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz",
+ "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz",
+ "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "1.0.0",
+ "has-color": "0.1.7",
+ "strip-ansi": "0.1.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz",
+ "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=",
+ "dev": true
+ }
+ }
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "requires": {
+ "abbrev": "1.0.9"
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+ "requires": {
+ "hosted-git-info": "2.6.0",
+ "is-builtin-module": "1.0.0",
+ "semver": "5.5.0",
+ "validate-npm-package-license": "3.0.3"
+ }
+ },
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "requires": {
+ "remove-trailing-separator": "1.1.0"
+ }
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "requires": {
+ "path-key": "2.0.1"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+ "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "object-component": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
+ "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "object.defaults": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
+ "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+ "requires": {
+ "array-each": "1.0.1",
+ "array-slice": "1.1.0",
+ "for-own": "1.0.0",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "object.map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
+ "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
+ "requires": {
+ "for-own": "1.0.0",
+ "make-iterator": "1.0.1"
+ },
+ "dependencies": {
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ }
+ }
+ },
+ "object.omit": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+ "requires": {
+ "for-own": "0.1.5",
+ "is-extendable": "0.1.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+ "dev": true
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "on-headers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
+ "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "onetime": {
+ "version": "1.1.0",
+ "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+ "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k="
+ },
+ "opn": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/opn/-/opn-3.0.3.tgz",
+ "integrity": "sha1-ttmec5n3jWXDuq/+8fsojpuFJDo=",
+ "dev": true,
+ "requires": {
+ "object-assign": "4.1.1"
+ }
+ },
+ "optimist": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+ "requires": {
+ "minimist": "0.0.10",
+ "wordwrap": "0.0.3"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
+ "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
+ },
+ "wordwrap": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
+ }
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "orchestrator": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz",
+ "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=",
+ "requires": {
+ "end-of-stream": "0.1.5",
+ "sequencify": "0.0.7",
+ "stream-consume": "0.1.1"
+ },
+ "dependencies": {
+ "end-of-stream": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz",
+ "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=",
+ "requires": {
+ "once": "1.3.3"
+ }
+ },
+ "once": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
+ "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=",
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ }
+ }
+ },
+ "ordered-read-streams": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz",
+ "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=",
+ "requires": {
+ "is-stream": "1.1.0",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+ },
+ "os-locale": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+ "requires": {
+ "execa": "0.7.0",
+ "lcid": "1.0.0",
+ "mem": "1.1.0"
+ }
+ },
+ "os-shim": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz",
+ "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc="
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+ },
+ "p-limit": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
+ "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==",
+ "requires": {
+ "p-try": "1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "requires": {
+ "p-limit": "1.2.0"
+ }
+ },
+ "p-map": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
+ "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
+ "dev": true
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
+ },
+ "package-json": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz",
+ "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=",
+ "dev": true,
+ "requires": {
+ "got": "5.7.1",
+ "registry-auth-token": "3.3.2",
+ "registry-url": "3.1.0",
+ "semver": "5.5.0"
+ }
+ },
+ "pako": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
+ "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=",
+ "dev": true
+ },
+ "param-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
+ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+ "dev": true,
+ "requires": {
+ "no-case": "2.3.2"
+ }
+ },
+ "parse-filepath": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
+ "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
+ "requires": {
+ "is-absolute": "1.0.0",
+ "map-cache": "0.2.2",
+ "path-root": "0.1.1"
+ }
+ },
+ "parse-glob": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+ "requires": {
+ "glob-base": "0.3.0",
+ "is-dotfile": "1.0.3",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "requires": {
+ "error-ex": "1.3.1"
+ }
+ },
+ "parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY="
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "parseqs": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
+ "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
+ "dev": true,
+ "requires": {
+ "better-assert": "1.0.2"
+ }
+ },
+ "parseuri": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
+ "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
+ "dev": true,
+ "requires": {
+ "better-assert": "1.0.2"
+ }
+ },
+ "parseurl": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
+ "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME="
+ },
+ "path-root": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
+ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+ "requires": {
+ "path-root-regex": "0.1.2"
+ }
+ },
+ "path-root-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
+ "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0="
+ },
+ "path-to-regexp": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
+ "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
+ "requires": {
+ "isarray": "0.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ }
+ }
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "pathval": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
+ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
+ "dev": true
+ },
+ "peek-stream": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz",
+ "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "1.0.0",
+ "duplexify": "3.6.0",
+ "through2": "2.0.3"
+ }
+ },
+ "pem": {
+ "version": "1.12.5",
+ "resolved": "https://registry.npmjs.org/pem/-/pem-1.12.5.tgz",
+ "integrity": "sha512-mm8gLf4ZCaY6Qdm8J4bBdHs6SO4px71FspxgC2jJ0vXf3PYNZnGhU9zITCxpzFHpLPHsHU3xRBbuXNxEWuWziQ==",
+ "dev": true,
+ "requires": {
+ "md5": "2.2.1",
+ "os-tmpdir": "1.0.2",
+ "safe-buffer": "5.1.2",
+ "which": "1.3.0"
+ }
+ },
+ "pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "dev": true
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "requires": {
+ "pinkie": "2.0.4"
+ }
+ },
+ "plist": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz",
+ "integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "base64-js": "1.2.0",
+ "xmlbuilder": "8.2.2",
+ "xmldom": "0.1.27"
+ }
+ },
+ "plugin-error": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
+ "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
+ "requires": {
+ "ansi-colors": "1.1.0",
+ "arr-diff": "4.0.0",
+ "arr-union": "3.1.0",
+ "extend-shallow": "3.0.2"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+ }
+ }
+ },
+ "pluralize": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
+ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow=="
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.2"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0.tgz",
+ "integrity": "sha512-TW10EIiVFcE/gjyIFlt9CjtWa2czncsJ+r2EjKKh+gk4cWmJYeO2UUZmnPxyVjk7skFAN5hsyE1eVrfAd+rmJg==",
+ "dev": true,
+ "requires": {
+ "@babel/generator": "7.0.0-beta.46",
+ "@babel/traverse": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46",
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.6.13",
+ "@types/parse5": "2.2.34",
+ "@types/path-is-inside": "1.0.0",
+ "@types/resolve": "0.0.6",
+ "@types/whatwg-url": "6.4.0",
+ "babylon": "7.0.0-beta.46",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "resolve": "1.7.1",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.8",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "9.6.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.13.tgz",
+ "integrity": "sha512-rAlzcc9b66uY+pwvBCjhl9/Nm/mr3rt1/pfHVHDMd0Bfg4olE0UlvaEZh+TM/uwzEFYVnLbDZHG9mVjZrHdv8g==",
+ "dev": true
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.13"
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz",
+ "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==",
+ "dev": true
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-build": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/polymer-build/-/polymer-build-3.0.0.tgz",
+ "integrity": "sha512-O4HBw1X1RmwbLc1xbp0KYQZDG2VUJVHZg5ANVpDpAWvRZgJ65qe4kwFisdm3dtNNV3LHXRAU2TGKSaTledGIsA==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "7.0.0-beta.46",
+ "@babel/plugin-external-helpers": "7.0.0-beta.46",
+ "@babel/plugin-proposal-async-generator-functions": "7.0.0-beta.46",
+ "@babel/plugin-proposal-object-rest-spread": "7.0.0-beta.46",
+ "@babel/plugin-syntax-async-generators": "7.0.0-beta.46",
+ "@babel/plugin-syntax-dynamic-import": "7.0.0-beta.46",
+ "@babel/plugin-syntax-import-meta": "7.0.0-beta.46",
+ "@babel/plugin-syntax-object-rest-spread": "7.0.0-beta.46",
+ "@babel/plugin-transform-arrow-functions": "7.0.0-beta.46",
+ "@babel/plugin-transform-async-to-generator": "7.0.0-beta.46",
+ "@babel/plugin-transform-block-scoped-functions": "7.0.0-beta.46",
+ "@babel/plugin-transform-block-scoping": "7.0.0-beta.46",
+ "@babel/plugin-transform-classes": "7.0.0-beta.35",
+ "@babel/plugin-transform-computed-properties": "7.0.0-beta.46",
+ "@babel/plugin-transform-destructuring": "7.0.0-beta.46",
+ "@babel/plugin-transform-duplicate-keys": "7.0.0-beta.46",
+ "@babel/plugin-transform-exponentiation-operator": "7.0.0-beta.46",
+ "@babel/plugin-transform-for-of": "7.0.0-beta.46",
+ "@babel/plugin-transform-function-name": "7.0.0-beta.46",
+ "@babel/plugin-transform-instanceof": "7.0.0-beta.46",
+ "@babel/plugin-transform-literals": "7.0.0-beta.46",
+ "@babel/plugin-transform-modules-amd": "7.0.0-beta.46",
+ "@babel/plugin-transform-object-super": "7.0.0-beta.46",
+ "@babel/plugin-transform-parameters": "7.0.0-beta.46",
+ "@babel/plugin-transform-regenerator": "7.0.0-beta.46",
+ "@babel/plugin-transform-shorthand-properties": "7.0.0-beta.46",
+ "@babel/plugin-transform-spread": "7.0.0-beta.46",
+ "@babel/plugin-transform-sticky-regex": "7.0.0-beta.46",
+ "@babel/plugin-transform-template-literals": "7.0.0-beta.46",
+ "@babel/plugin-transform-typeof-symbol": "7.0.0-beta.46",
+ "@babel/plugin-transform-unicode-regex": "7.0.0-beta.46",
+ "@babel/traverse": "7.0.0-beta.46",
+ "@polymer/esm-amd-loader": "1.0.0",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/gulp-if": "0.0.33",
+ "@types/html-minifier": "3.5.2",
+ "@types/is-windows": "0.2.0",
+ "@types/mz": "0.0.31",
+ "@types/node": "9.6.13",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.7",
+ "@types/uuid": "3.4.3",
+ "@types/vinyl": "2.0.2",
+ "@types/vinyl-fs": "2.4.8",
+ "babel-preset-minify": "0.4.0-alpha.caaefb4c",
+ "babylon": "7.0.0-beta.46",
+ "css-slam": "2.1.1",
+ "dom5": "3.0.0",
+ "gulp-if": "2.0.2",
+ "html-minifier": "3.5.15",
+ "matcher": "1.1.0",
+ "multipipe": "1.0.2",
+ "mz": "2.7.0",
+ "parse5": "4.0.0",
+ "plylog": "0.5.0",
+ "polymer-analyzer": "3.0.0",
+ "polymer-bundler": "4.0.0",
+ "polymer-project-config": "4.0.0",
+ "regenerator-runtime": "0.11.1",
+ "stream": "0.0.2",
+ "sw-precache": "5.2.1",
+ "uuid": "3.2.1",
+ "vinyl": "1.2.0",
+ "vinyl-fs": "2.4.4"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "9.6.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.13.tgz",
+ "integrity": "sha512-rAlzcc9b66uY+pwvBCjhl9/Nm/mr3rt1/pfHVHDMd0Bfg4olE0UlvaEZh+TM/uwzEFYVnLbDZHG9mVjZrHdv8g==",
+ "dev": true
+ },
+ "@types/resolve": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.7.tgz",
+ "integrity": "sha512-GPewdjkb0Q76o459qgp6pBLzJj/bD3oveS2kfLhIkZ9U3t3AFKtl5DlFB6lGTw0iZmcmxoGC8lpLW3NNJKrN9A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.13"
+ }
+ },
+ "@types/vinyl-fs": {
+ "version": "2.4.8",
+ "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-2.4.8.tgz",
+ "integrity": "sha512-yE2pN9OOrxJVeO7IZLHAHrh5R4Q0osbn5WQRuQU6GdXoK7dNFrMK3K7YhATkzf3z0yQBkol3+gafs7Rp0s7dDg==",
+ "dev": true,
+ "requires": {
+ "@types/glob-stream": "6.1.0",
+ "@types/node": "9.6.13",
+ "@types/vinyl": "2.0.2"
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz",
+ "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==",
+ "dev": true
+ },
+ "multipipe": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-1.0.2.tgz",
+ "integrity": "sha1-zBPv2DPJzamfIk+GhGG44aP9k50=",
+ "dev": true,
+ "requires": {
+ "duplexer2": "0.1.4",
+ "object-assign": "4.1.1"
+ }
+ }
+ }
+ },
+ "polymer-bundler": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/polymer-bundler/-/polymer-bundler-4.0.0.tgz",
+ "integrity": "sha512-Bp3lOw3ADJq/Zo6uPibA0kdbJAetcFVVnp1hljoyx7k7Q4klZBlno7M4ILsfPJhGp48KM1aApqHEWmpW3OSHTw==",
+ "dev": true,
+ "requires": {
+ "@types/acorn": "4.0.3",
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "acorn-import-meta": "0.2.1",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "6.26.0",
+ "clone": "2.1.1",
+ "command-line-args": "3.0.5",
+ "command-line-usage": "3.0.8",
+ "dom5": "2.3.0",
+ "espree": "3.5.4",
+ "magic-string": "0.22.5",
+ "mkdirp": "0.5.1",
+ "parse5": "2.2.3",
+ "polymer-analyzer": "3.0.0",
+ "rollup": "0.58.2",
+ "source-map": "0.5.7",
+ "vscode-uri": "1.0.3"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.109",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.109.tgz",
+ "integrity": "sha512-z8zzzMkjsMI4TgrjjRIvC5kcpqKE8euFbGvImGiujpdKsxbxiy6KguRJ93SFoEOKqeOsKBpaaHjobthVq6EOCg==",
+ "dev": true
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "dom5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz",
+ "integrity": "sha1-+CBJdb0NrLvltYqKk//B/tD/zSo=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "6.0.109",
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "2.2.3"
+ }
+ },
+ "parse5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz",
+ "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-linter": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/polymer-linter/-/polymer-linter-3.0.0.tgz",
+ "integrity": "sha512-YM6+kE3DmTvVlyXJYDVfgvyi4ZUJIZYF3zl8BHx65SKtyjdRmweUQolB/dQuFiVAY29APyjAWSh/V7fVwgVF4g==",
+ "dev": true,
+ "requires": {
+ "@types/fast-levenshtein": "0.0.1",
+ "@types/parse5": "2.2.34",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "cancel-token": "0.1.1",
+ "css-what": "2.1.0",
+ "dom5": "3.0.0",
+ "fast-levenshtein": "2.0.6",
+ "parse5": "4.0.0",
+ "polymer-analyzer": "3.0.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.8",
+ "strip-indent": "2.0.0",
+ "validate-element-name": "2.1.1"
+ },
+ "dependencies": {
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-4.0.0.tgz",
+ "integrity": "sha512-OP0iEEOrWl09EQETtyEr409ZHdNrQ3PNp5uDWmTIuBthOKkoenFxnptVikY3tp6e8g/JjQE5mxVKpLPIzBg7xg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.13",
+ "browser-capabilities": "1.1.0",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "9.6.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.13.tgz",
+ "integrity": "sha512-rAlzcc9b66uY+pwvBCjhl9/Nm/mr3rt1/pfHVHDMd0Bfg4olE0UlvaEZh+TM/uwzEFYVnLbDZHG9mVjZrHdv8g==",
+ "dev": true
+ }
+ }
+ },
+ "polyserve": {
+ "version": "0.27.11",
+ "resolved": "https://registry.npmjs.org/polyserve/-/polyserve-0.27.11.tgz",
+ "integrity": "sha512-C6laEBzDawtKzJEojv2wjUbuu66fNFEOfHsbHztrw0jn0CZsaV1okWEuFczgMNgW5ZL+Eg+QC4hzsHNA1dZZaw==",
+ "dev": true,
+ "requires": {
+ "@types/compression": "0.0.33",
+ "@types/content-type": "1.1.2",
+ "@types/escape-html": "0.0.20",
+ "@types/express": "4.11.1",
+ "@types/mime": "0.0.29",
+ "@types/mz": "0.0.29",
+ "@types/node": "9.6.13",
+ "@types/opn": "3.0.28",
+ "@types/parse5": "2.2.34",
+ "@types/pem": "1.9.3",
+ "@types/resolve": "0.0.6",
+ "@types/serve-static": "1.13.2",
+ "@types/spdy": "3.4.4",
+ "bower-config": "1.4.1",
+ "browser-capabilities": "1.1.0",
+ "command-line-args": "3.0.5",
+ "command-line-usage": "3.0.8",
+ "compression": "1.7.2",
+ "content-type": "1.0.4",
+ "escape-html": "1.0.3",
+ "express": "4.16.3",
+ "find-port": "1.0.1",
+ "http-proxy-middleware": "0.17.4",
+ "lru-cache": "4.1.3",
+ "mime": "1.6.0",
+ "mz": "2.7.0",
+ "opn": "3.0.3",
+ "pem": "1.12.5",
+ "polymer-build": "3.0.0",
+ "polymer-project-config": "4.0.0",
+ "requirejs": "2.3.5",
+ "resolve": "1.7.1",
+ "send": "0.14.2",
+ "spdy": "3.4.7"
+ },
+ "dependencies": {
+ "@types/mz": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/mz/-/mz-0.0.29.tgz",
+ "integrity": "sha1-vCRyjGSZc/HHhR6QM/nOUlZowns=",
+ "dev": true,
+ "requires": {
+ "@types/bluebird": "3.5.20",
+ "@types/node": "9.6.13"
+ }
+ },
+ "@types/node": {
+ "version": "9.6.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.13.tgz",
+ "integrity": "sha512-rAlzcc9b66uY+pwvBCjhl9/Nm/mr3rt1/pfHVHDMd0Bfg4olE0UlvaEZh+TM/uwzEFYVnLbDZHG9mVjZrHdv8g==",
+ "dev": true
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.13"
+ }
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
+ },
+ "preserve": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks="
+ },
+ "pretty-bytes": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz",
+ "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk="
+ },
+ "pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE="
+ },
+ "private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
+ },
+ "progress": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
+ "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8="
+ },
+ "promisify-node": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/promisify-node/-/promisify-node-0.4.0.tgz",
+ "integrity": "sha1-MoA4dOxBF4TkeGwzmQKoeheaRpw=",
+ "dev": true,
+ "requires": {
+ "nodegit-promise": "4.0.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "proxy-addr": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz",
+ "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==",
+ "dev": true,
+ "requires": {
+ "forwarded": "0.1.2",
+ "ipaddr.js": "1.6.0"
+ }
+ },
+ "proxy-from-env": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
+ "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4="
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
+ },
+ "pump": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "once": "1.4.0"
+ }
+ },
+ "pumpify": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.0.tgz",
+ "integrity": "sha512-UWi0klDoq8xtVzlMRgENV9F7iCTZExaJQSQL187UXsxpk9NnrKGqTqqUNYAKGOzucSOxs2+jUnRNI+rLviPhJg==",
+ "dev": true,
+ "requires": {
+ "duplexify": "3.6.0",
+ "inherits": "2.0.3",
+ "pump": "2.0.1"
+ }
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true
+ },
+ "puppeteer": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.3.0.tgz",
+ "integrity": "sha512-wx10aPQPpGJVxdB6yoDSLm9p4rCwARUSLMVV0bx++owuqkvviXKyiFM3EWsywaFmjOKNPXacIjplF7xhHiFP3w==",
+ "requires": {
+ "debug": "2.6.9",
+ "extract-zip": "1.6.6",
+ "https-proxy-agent": "2.2.1",
+ "mime": "1.6.0",
+ "progress": "2.0.0",
+ "proxy-from-env": "1.0.0",
+ "rimraf": "2.6.2",
+ "ws": "3.3.3"
+ },
+ "dependencies": {
+ "agent-base": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz",
+ "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==",
+ "requires": {
+ "es6-promisify": "5.0.0"
+ }
+ },
+ "https-proxy-agent": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
+ "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
+ "requires": {
+ "agent-base": "4.2.0",
+ "debug": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ }
+ }
+ },
+ "q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+ "dev": true,
+ "optional": true
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true
+ },
+ "randomatic": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz",
+ "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==",
+ "requires": {
+ "is-number": "4.0.0",
+ "kind-of": "6.0.2",
+ "math-random": "1.0.1"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ=="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "range-parser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+ "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+ "dev": true
+ },
+ "raw-body": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
+ "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
+ "dev": true,
+ "requires": {
+ "bytes": "3.0.0",
+ "http-errors": "1.6.2",
+ "iconv-lite": "0.4.19",
+ "unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "depd": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
+ "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
+ "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
+ "dev": true,
+ "requires": {
+ "depd": "1.1.1",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.0.3",
+ "statuses": "1.4.0"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.19",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
+ "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
+ "dev": true
+ },
+ "setprototypeof": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
+ "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
+ "dev": true
+ }
+ }
+ },
+ "rc": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz",
+ "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==",
+ "dev": true,
+ "requires": {
+ "deep-extend": "0.5.1",
+ "ini": "1.3.5",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "deep-extend": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
+ "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==",
+ "dev": true
+ }
+ }
+ },
+ "read-all-stream": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz",
+ "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "2.0.1",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "read-chunk": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-2.1.0.tgz",
+ "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=",
+ "requires": {
+ "pify": "3.0.0",
+ "safe-buffer": "5.1.2"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
+ }
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "1.1.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "1.1.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
+ "requires": {
+ "find-up": "1.1.2",
+ "read-pkg": "1.1.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "readdirp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
+ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "minimatch": "3.0.4",
+ "readable-stream": "2.3.6",
+ "set-immediate-shim": "1.0.1"
+ }
+ },
+ "rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+ "requires": {
+ "resolve": "1.7.1"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "2.1.0",
+ "strip-indent": "1.0.1"
+ }
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerate": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
+ "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==",
+ "dev": true
+ },
+ "regenerate-unicode-properties": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-5.1.3.tgz",
+ "integrity": "sha512-Yjy6t7jFQczDhYE+WVm7pg6gWYE258q4sUkk9qDErwXJIqx7jU9jGrMFHutJK/SRfcg7MEkXjGaYiVlOZyev/A==",
+ "dev": true,
+ "requires": {
+ "regenerate": "1.3.3"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+ },
+ "regenerator-transform": {
+ "version": "0.12.3",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.12.3.tgz",
+ "integrity": "sha512-y2uxO/6u+tVmtEDIKo+tLCtI0GcbQr0OreosKgCd7HP4VypGjtTrw79DezuwT+W5QX0YWuvpeBOgumrepwM1kA==",
+ "dev": true,
+ "requires": {
+ "private": "0.1.8"
+ }
+ },
+ "regex-cache": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+ "requires": {
+ "is-equal-shallow": "0.1.3"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "regexpp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
+ "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw=="
+ },
+ "regexpu-core": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.1.3.tgz",
+ "integrity": "sha512-mB+njEzO7oezA57IbQxxd6fVPOeWKDmnGvJ485CwmfNchjHe5jWwqKepapmzUEj41yxIAqOg+C4LbXuJlkiO8A==",
+ "dev": true,
+ "requires": {
+ "regenerate": "1.3.3",
+ "regenerate-unicode-properties": "5.1.3",
+ "regjsgen": "0.3.0",
+ "regjsparser": "0.2.1",
+ "unicode-match-property-ecmascript": "1.0.3",
+ "unicode-match-property-value-ecmascript": "1.0.1"
+ }
+ },
+ "registry-auth-token": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
+ "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
+ "dev": true,
+ "requires": {
+ "rc": "1.2.7",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "registry-url": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+ "dev": true,
+ "requires": {
+ "rc": "1.2.7"
+ }
+ },
+ "regjsgen": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.3.0.tgz",
+ "integrity": "sha1-DuSj6SdkMM2iXx54nqbBW4ewy0M=",
+ "dev": true
+ },
+ "regjsparser": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.2.1.tgz",
+ "integrity": "sha1-w3h1U/rwTndcMCEC7zRtmVAA7Bw=",
+ "dev": true,
+ "requires": {
+ "jsesc": "0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true
+ }
+ }
+ },
+ "relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
+ "dev": true
+ },
+ "remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo="
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ="
+ },
+ "request": {
+ "version": "2.85.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz",
+ "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "0.7.0",
+ "aws4": "1.7.0",
+ "caseless": "0.12.0",
+ "combined-stream": "1.0.6",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.3.2",
+ "har-validator": "5.0.3",
+ "hawk": "6.0.2",
+ "http-signature": "1.2.0",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.18",
+ "oauth-sign": "0.8.2",
+ "performance-now": "2.1.0",
+ "qs": "6.5.2",
+ "safe-buffer": "5.1.2",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.4",
+ "tunnel-agent": "0.6.0",
+ "uuid": "3.2.1"
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
+ },
+ "require-package-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz",
+ "integrity": "sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk="
+ },
+ "require-uncached": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+ "requires": {
+ "caller-path": "0.1.0",
+ "resolve-from": "1.0.1"
+ }
+ },
+ "requirejs": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.5.tgz",
+ "integrity": "sha512-svnO+aNcR/an9Dpi44C7KSAy5fFGLtmPbaaCeQaklUz8BQhS64tWWIIlvEA5jrWICzlO/X9KSzSeXFnZdBu8nw==",
+ "dev": true
+ },
+ "requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz",
+ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==",
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-dir": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz",
+ "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "1.2.2",
+ "global-modules": "0.2.3"
+ }
+ },
+ "resolve-from": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
+ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY="
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+ },
+ "restore-cursor": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
+ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
+ "requires": {
+ "exit-hook": "1.1.1",
+ "onetime": "1.1.0"
+ }
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
+ },
+ "right-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+ "optional": true,
+ "requires": {
+ "align-text": "0.1.4"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "rollup": {
+ "version": "0.58.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.58.2.tgz",
+ "integrity": "sha512-RZVvCWm9BHOYloaE6LLiE/ibpjv1CmI8F8k0B0Cp+q1eezo3cswszJH1DN0djgzSlo0hjuuCmyeI+1XOYLl4wg==",
+ "dev": true,
+ "requires": {
+ "@types/estree": "0.0.38",
+ "@types/node": "8.10.13"
+ },
+ "dependencies": {
+ "@types/estree": {
+ "version": "0.0.38",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.38.tgz",
+ "integrity": "sha512-F/v7t1LwS4vnXuPooJQGBRKRGIoxWUTmA4VHfqjOccFsNDThD5bfUNpITive6s352O7o384wcpEaDV8rHCehDA==",
+ "dev": true
+ }
+ }
+ },
+ "run-async": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+ "requires": {
+ "is-promise": "2.1.0"
+ }
+ },
+ "run-sequence": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-1.2.2.tgz",
+ "integrity": "sha1-UJWgvr6YczsBQL0I3YDsAw3azes=",
+ "requires": {
+ "chalk": "1.1.3",
+ "gulp-util": "3.0.8"
+ }
+ },
+ "rx": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz",
+ "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I="
+ },
+ "rx-lite": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
+ "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ="
+ },
+ "rx-lite-aggregates": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
+ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
+ "requires": {
+ "rx-lite": "4.0.8"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "samsam": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz",
+ "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc="
+ },
+ "sauce-connect-launcher": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.2.4.tgz",
+ "integrity": "sha512-X2vfwulR6brUGiicXKxPm1GJ7dBEeP1II450Uv4bHGrcGOapZNgzJvn9aioea5IC5BPp/7qjKdE3xbbTBIVXMA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "adm-zip": "0.4.9",
+ "async": "2.6.0",
+ "https-proxy-agent": "2.2.1",
+ "lodash": "4.17.10",
+ "rimraf": "2.6.2"
+ },
+ "dependencies": {
+ "agent-base": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz",
+ "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "es6-promisify": "5.0.0"
+ }
+ },
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "lodash": "4.17.10"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "https-proxy-agent": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
+ "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "agent-base": "4.2.0",
+ "debug": "3.1.0"
+ }
+ }
+ }
+ },
+ "scoped-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz",
+ "integrity": "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg="
+ },
+ "select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+ "dev": true
+ },
+ "selenium-standalone": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-6.14.0.tgz",
+ "integrity": "sha512-NTpcPZq8OkMuuhcPRXoI3Gx2qELMDFvs970h7jzoayLkmRd8DxqjNXy8L7Ainxnmo0er0uF2GsUda07Eu0k5EA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "async": "2.6.0",
+ "commander": "2.9.0",
+ "cross-spawn": "6.0.5",
+ "debug": "3.1.0",
+ "lodash": "4.17.10",
+ "minimist": "1.2.0",
+ "mkdirp": "0.5.1",
+ "progress": "2.0.0",
+ "request": "2.79.0",
+ "tar-stream": "1.5.2",
+ "urijs": "1.19.1",
+ "which": "1.3.0",
+ "yauzl": "2.9.1"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
+ "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
+ "dev": true,
+ "optional": true
+ },
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "lodash": "4.17.10"
+ }
+ },
+ "aws-sign2": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
+ "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
+ "dev": true,
+ "optional": true
+ },
+ "boom": {
+ "version": "2.10.1",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
+ "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
+ "dev": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "caseless": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
+ "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
+ "dev": true,
+ "optional": true
+ },
+ "cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nice-try": "1.0.4",
+ "path-key": "2.0.1",
+ "semver": "5.5.0",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ }
+ },
+ "cryptiles": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
+ "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "boom": "2.10.1"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "form-data": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
+ "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.6",
+ "mime-types": "2.1.18"
+ }
+ },
+ "har-validator": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
+ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "commander": "2.9.0",
+ "is-my-json-valid": "2.17.2",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "hawk": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+ "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "boom": "2.10.1",
+ "cryptiles": "2.0.5",
+ "hoek": "2.16.3",
+ "sntp": "1.0.9"
+ }
+ },
+ "hoek": {
+ "version": "2.16.3",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
+ "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
+ "dev": true
+ },
+ "http-signature": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
+ "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "0.2.0",
+ "jsprim": "1.4.1",
+ "sshpk": "1.14.1"
+ }
+ },
+ "qs": {
+ "version": "6.3.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
+ "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=",
+ "dev": true,
+ "optional": true
+ },
+ "request": {
+ "version": "2.79.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz",
+ "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aws-sign2": "0.6.0",
+ "aws4": "1.7.0",
+ "caseless": "0.11.0",
+ "combined-stream": "1.0.6",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.1.4",
+ "har-validator": "2.0.6",
+ "hawk": "3.1.3",
+ "http-signature": "1.1.1",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.18",
+ "oauth-sign": "0.8.2",
+ "qs": "6.3.2",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.4",
+ "tunnel-agent": "0.4.3",
+ "uuid": "3.2.1"
+ }
+ },
+ "sntp": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+ "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "tar-stream": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.2.tgz",
+ "integrity": "sha1-+8bG6DwaGdTLSMfZYXH8JI7/x78=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "bl": "1.2.2",
+ "end-of-stream": "1.4.1",
+ "readable-stream": "2.3.6",
+ "xtend": "4.0.1"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
+ "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
+ "dev": true,
+ "optional": true
+ },
+ "yauzl": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz",
+ "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "buffer-crc32": "0.2.13",
+ "fd-slicer": "1.0.1"
+ }
+ }
+ }
+ },
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
+ },
+ "semver-diff": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
+ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
+ "dev": true,
+ "requires": {
+ "semver": "5.5.0"
+ }
+ },
+ "send": {
+ "version": "0.14.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.14.2.tgz",
+ "integrity": "sha1-ObBDiz9RC+Xcb2Z6EfcWiTaM3u8=",
+ "dev": true,
+ "requires": {
+ "debug": "2.2.0",
+ "depd": "1.1.2",
+ "destroy": "1.0.4",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.7.0",
+ "fresh": "0.3.0",
+ "http-errors": "1.5.1",
+ "mime": "1.3.4",
+ "ms": "0.7.2",
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.0",
+ "statuses": "1.3.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
+ "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
+ "dev": true,
+ "requires": {
+ "ms": "0.7.1"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
+ "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
+ "dev": true
+ }
+ }
+ },
+ "etag": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz",
+ "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=",
+ "dev": true
+ },
+ "fresh": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz",
+ "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz",
+ "integrity": "sha1-eIwNLB3iyBuebowBhDtrl+uSB1A=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "setprototypeof": "1.0.2",
+ "statuses": "1.3.1"
+ }
+ },
+ "mime": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz",
+ "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=",
+ "dev": true
+ },
+ "ms": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
+ "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
+ "dev": true
+ },
+ "setprototypeof": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz",
+ "integrity": "sha1-gaVSFB7BBLiOic44MQOtXGZWTQg=",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+ "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+ "dev": true
+ }
+ }
+ },
+ "sequencify": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz",
+ "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw="
+ },
+ "serve-static": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
+ "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
+ "dev": true,
+ "requires": {
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "parseurl": "1.3.2",
+ "send": "0.16.2"
+ },
+ "dependencies": {
+ "mime": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+ "dev": true
+ },
+ "send": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
+ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "destroy": "1.0.4",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "1.6.3",
+ "mime": "1.4.1",
+ "ms": "2.0.0",
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.0",
+ "statuses": "1.4.0"
+ }
+ }
+ }
+ },
+ "server-destroy": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
+ "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=",
+ "dev": true
+ },
+ "serviceworker-cache-polyfill": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz",
+ "integrity": "sha1-3hnuc77yGrPAdAo3sz22JGS6ves=",
+ "dev": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+ },
+ "set-immediate-shim": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
+ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
+ "dev": true
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "dev": true
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "requires": {
+ "shebang-regex": "1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
+ },
+ "shelljs": {
+ "version": "0.7.8",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz",
+ "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=",
+ "requires": {
+ "glob": "7.1.2",
+ "interpret": "1.1.0",
+ "rechoir": "0.6.2"
+ }
+ },
+ "sigmund": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
+ "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA="
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+ },
+ "sinon": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz",
+ "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=",
+ "requires": {
+ "formatio": "1.1.1",
+ "lolex": "1.3.2",
+ "samsam": "1.1.2",
+ "util": "0.10.3"
+ }
+ },
+ "sinon-chai": {
+ "version": "2.14.0",
+ "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz",
+ "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==",
+ "dev": true
+ },
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
+ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+ }
+ }
+ },
+ "slide": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
+ "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "sntp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
+ "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
+ "dev": true,
+ "requires": {
+ "hoek": "4.2.1"
+ }
+ },
+ "socket.io": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.0.tgz",
+ "integrity": "sha512-KS+3CNWWNtLbVN5j0/B+1hjxRzey+oTK6ejpAOoxMZis6aXeB8cUtfuvjHl97tuZx+t/qD/VyqFMjuzu2Js6uQ==",
+ "dev": true,
+ "requires": {
+ "debug": "3.1.0",
+ "engine.io": "3.2.0",
+ "has-binary2": "1.0.2",
+ "socket.io-adapter": "1.1.1",
+ "socket.io-client": "2.1.0",
+ "socket.io-parser": "3.2.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "socket.io-adapter": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz",
+ "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=",
+ "dev": true
+ },
+ "socket.io-client": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.0.tgz",
+ "integrity": "sha512-TvKPpL0cBON5LduQfR8Rxrr+ktj70bLXGvqHCL3er5avBXruB3gpnbaud5ikFYVfANH1gCABAvo0qN8Axpg2ew==",
+ "dev": true,
+ "requires": {
+ "backo2": "1.0.2",
+ "base64-arraybuffer": "0.1.5",
+ "component-bind": "1.0.0",
+ "component-emitter": "1.2.1",
+ "debug": "3.1.0",
+ "engine.io-client": "3.2.1",
+ "has-binary2": "1.0.2",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "object-component": "0.0.3",
+ "parseqs": "0.0.5",
+ "parseuri": "0.0.5",
+ "socket.io-parser": "3.2.0",
+ "to-array": "0.1.4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "socket.io-parser": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz",
+ "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==",
+ "dev": true,
+ "requires": {
+ "component-emitter": "1.2.1",
+ "debug": "3.1.0",
+ "isarray": "2.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+ "dev": true
+ }
+ }
+ },
+ "sort-keys": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
+ "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
+ "dev": true,
+ "requires": {
+ "is-plain-obj": "1.1.0"
+ }
+ },
+ "sort-keys-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz",
+ "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=",
+ "dev": true,
+ "requires": {
+ "sort-keys": "1.1.2"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "requires": {
+ "atob": "2.1.1",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-support": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.5.tgz",
+ "integrity": "sha512-mR7/Nd5l1z6g99010shcXJiNEaf3fEtmLhRB/sBcQVJGodcHCULPp2y4Sfa43Kv2zq7T+Izmfp/WHCR6dYkQCA==",
+ "requires": {
+ "buffer-from": "1.0.0",
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
+ },
+ "sparkles": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz",
+ "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM="
+ },
+ "spawn-sync": {
+ "version": "1.0.15",
+ "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz",
+ "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=",
+ "requires": {
+ "concat-stream": "1.6.2",
+ "os-shim": "0.1.3"
+ }
+ },
+ "spdx-correct": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
+ "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
+ "requires": {
+ "spdx-expression-parse": "3.0.0",
+ "spdx-license-ids": "3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
+ "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg=="
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "requires": {
+ "spdx-exceptions": "2.1.0",
+ "spdx-license-ids": "3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
+ "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA=="
+ },
+ "spdy": {
+ "version": "3.4.7",
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz",
+ "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "handle-thing": "1.2.5",
+ "http-deceiver": "1.2.7",
+ "safe-buffer": "5.1.2",
+ "select-hose": "2.0.0",
+ "spdy-transport": "2.1.0"
+ }
+ },
+ "spdy-transport": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz",
+ "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "detect-node": "2.0.3",
+ "hpack.js": "2.1.6",
+ "obuf": "1.1.2",
+ "readable-stream": "2.3.6",
+ "safe-buffer": "5.1.2",
+ "wbuf": "1.7.3"
+ }
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+ },
+ "sshpk": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz",
+ "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=",
+ "dev": true,
+ "requires": {
+ "asn1": "0.2.3",
+ "assert-plus": "1.0.0",
+ "bcrypt-pbkdf": "1.0.1",
+ "dashdash": "1.14.1",
+ "ecc-jsbn": "0.1.1",
+ "getpass": "0.1.7",
+ "jsbn": "0.1.1",
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "stable": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "stacky": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/stacky/-/stacky-1.3.1.tgz",
+ "integrity": "sha1-PxF+UYe5pz0j+HbWnwXIWxGAShI=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "lodash": "3.10.1"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true
+ }
+ }
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "statuses": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+ "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+ "dev": true
+ },
+ "stream": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stream/-/stream-0.0.2.tgz",
+ "integrity": "sha1-f1Nj8Ff2WSxVlfALyAon9c7B8O8=",
+ "dev": true,
+ "requires": {
+ "emitter-component": "1.1.1"
+ }
+ },
+ "stream-consume": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz",
+ "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg=="
+ },
+ "stream-shift": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
+ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI="
+ },
+ "streamsearch": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
+ "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=",
+ "dev": true
+ },
+ "string-template": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz",
+ "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0="
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "stringstream": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
+ "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ },
+ "strip-bom-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz",
+ "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=",
+ "requires": {
+ "first-chunk-stream": "1.0.0",
+ "strip-bom": "2.0.0"
+ }
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
+ },
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "4.0.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+ },
+ "sw-precache": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.1.tgz",
+ "integrity": "sha512-8FAy+BP/FXE+ILfiVTt+GQJ6UEf4CVHD9OfhzH0JX+3zoy2uFk7Vn9EfXASOtVmmIVbL3jE/W8Z66VgPSZcMhw==",
+ "dev": true,
+ "requires": {
+ "dom-urls": "1.1.0",
+ "es6-promise": "4.2.4",
+ "glob": "7.1.2",
+ "lodash.defaults": "4.2.0",
+ "lodash.template": "4.4.0",
+ "meow": "3.7.0",
+ "mkdirp": "0.5.1",
+ "pretty-bytes": "4.0.2",
+ "sw-toolbox": "3.6.0",
+ "update-notifier": "2.5.0"
+ },
+ "dependencies": {
+ "ansi-align": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
+ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
+ "dev": true,
+ "requires": {
+ "string-width": "2.1.1"
+ }
+ },
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "boxen": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
+ "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
+ "dev": true,
+ "requires": {
+ "ansi-align": "2.0.0",
+ "camelcase": "4.1.0",
+ "chalk": "2.4.1",
+ "cli-boxes": "1.0.0",
+ "string-width": "2.1.1",
+ "term-size": "1.2.0",
+ "widest-line": "2.0.0"
+ }
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "configstore": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
+ "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==",
+ "dev": true,
+ "requires": {
+ "dot-prop": "4.2.0",
+ "graceful-fs": "4.1.11",
+ "make-dir": "1.2.0",
+ "unique-string": "1.0.0",
+ "write-file-atomic": "2.3.0",
+ "xdg-basedir": "3.0.0"
+ }
+ },
+ "dot-prop": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
+ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
+ "dev": true,
+ "requires": {
+ "is-obj": "1.0.1"
+ }
+ },
+ "got": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+ "dev": true,
+ "requires": {
+ "create-error-class": "3.0.2",
+ "duplexer3": "0.1.4",
+ "get-stream": "3.0.0",
+ "is-redirect": "1.0.0",
+ "is-retry-allowed": "1.1.0",
+ "is-stream": "1.1.0",
+ "lowercase-keys": "1.0.1",
+ "safe-buffer": "5.1.2",
+ "timed-out": "4.0.1",
+ "unzip-response": "2.0.1",
+ "url-parse-lax": "1.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "latest-version": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
+ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
+ "dev": true,
+ "requires": {
+ "package-json": "4.0.1"
+ }
+ },
+ "lodash.template": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz",
+ "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.templatesettings": "4.1.0"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz",
+ "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0"
+ }
+ },
+ "package-json": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
+ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
+ "dev": true,
+ "requires": {
+ "got": "6.7.1",
+ "registry-auth-token": "3.3.2",
+ "registry-url": "3.1.0",
+ "semver": "5.5.0"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "timed-out": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
+ "dev": true
+ },
+ "unzip-response": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+ "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
+ "dev": true
+ },
+ "update-notifier": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz",
+ "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==",
+ "dev": true,
+ "requires": {
+ "boxen": "1.3.0",
+ "chalk": "2.4.1",
+ "configstore": "3.1.2",
+ "import-lazy": "2.1.0",
+ "is-ci": "1.1.0",
+ "is-installed-globally": "0.1.0",
+ "is-npm": "1.0.0",
+ "latest-version": "3.1.0",
+ "semver-diff": "2.1.0",
+ "xdg-basedir": "3.0.0"
+ }
+ },
+ "widest-line": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz",
+ "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=",
+ "dev": true,
+ "requires": {
+ "string-width": "2.1.1"
+ }
+ },
+ "write-file-atomic": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
+ "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "imurmurhash": "0.1.4",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "xdg-basedir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
+ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
+ "dev": true
+ }
+ }
+ },
+ "sw-toolbox": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz",
+ "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=",
+ "dev": true,
+ "requires": {
+ "path-to-regexp": "1.7.0",
+ "serviceworker-cache-polyfill": "4.0.0"
+ }
+ },
+ "table": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
+ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
+ "requires": {
+ "ajv": "5.5.2",
+ "ajv-keywords": "2.1.1",
+ "chalk": "2.4.1",
+ "lodash": "4.17.10",
+ "slice-ansi": "1.0.0",
+ "string-width": "2.1.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "table-layout": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.3.0.tgz",
+ "integrity": "sha1-buINxIPbNxs+XIf3BO0vfHmdLJo=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "core-js": "2.5.6",
+ "deep-extend": "0.4.2",
+ "feature-detect-es6": "1.4.0",
+ "typical": "2.6.1",
+ "wordwrapjs": "2.0.0"
+ }
+ },
+ "tar-fs": {
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.2.tgz",
+ "integrity": "sha512-LdknWjPEiZC1nOBwhv0JBzfJBGPJar08dZg2rwZe0ZTLQoRGEzgrl7vF3qUEkCHpI/wN9e7RyCuDhMsJUCLPPQ==",
+ "dev": true,
+ "requires": {
+ "chownr": "1.0.1",
+ "mkdirp": "0.5.1",
+ "pump": "1.0.3",
+ "tar-stream": "1.6.0"
+ },
+ "dependencies": {
+ "pump": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz",
+ "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "once": "1.4.0"
+ }
+ }
+ }
+ },
+ "tar-stream": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.0.tgz",
+ "integrity": "sha512-lh2iAPG/BHNmN6WB9Ybdynk9rEJ5GD/dy4zscHmVlwa1dq2tpE+BH78i5vjYwYVWEaOXGBjzxr89aVACF17Cpw==",
+ "dev": true,
+ "requires": {
+ "bl": "1.2.2",
+ "buffer-alloc": "1.1.0",
+ "end-of-stream": "1.4.1",
+ "fs-constants": "1.0.0",
+ "readable-stream": "2.3.6",
+ "to-buffer": "1.1.1",
+ "xtend": "4.0.1"
+ }
+ },
+ "temp": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz",
+ "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "1.0.2",
+ "rimraf": "2.2.8"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "2.2.8",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
+ "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
+ "dev": true
+ }
+ }
+ },
+ "term-size": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
+ "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
+ "dev": true,
+ "requires": {
+ "execa": "0.7.0"
+ }
+ },
+ "ternary-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.0.1.tgz",
+ "integrity": "sha1-Bk5Im0tb9gumpre8fy9cJ07Pgmk=",
+ "dev": true,
+ "requires": {
+ "duplexify": "3.6.0",
+ "fork-stream": "0.0.4",
+ "merge-stream": "1.0.1",
+ "through2": "2.0.3"
+ }
+ },
+ "test-value": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
+ "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "typical": "2.6.1"
+ }
+ },
+ "text-encoding": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz",
+ "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk="
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
+ },
+ "textextensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.2.0.tgz",
+ "integrity": "sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA=="
+ },
+ "thenify": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz",
+ "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=",
+ "dev": true,
+ "requires": {
+ "any-promise": "1.3.0"
+ }
+ },
+ "thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
+ "dev": true,
+ "requires": {
+ "thenify": "3.3.0"
+ }
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "requires": {
+ "readable-stream": "2.3.6",
+ "xtend": "4.0.1"
+ }
+ },
+ "through2-filter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz",
+ "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=",
+ "requires": {
+ "through2": "2.0.3",
+ "xtend": "4.0.1"
+ }
+ },
+ "tildify": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz",
+ "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=",
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "time-stamp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
+ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM="
+ },
+ "timed-out": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz",
+ "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=",
+ "dev": true
+ },
+ "tmp": {
+ "version": "0.0.31",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz",
+ "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=",
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "to-absolute-glob": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz",
+ "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=",
+ "requires": {
+ "extend-shallow": "2.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "to-array": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
+ "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
+ "dev": true
+ },
+ "to-buffer": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
+ "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ }
+ }
+ },
+ "tough-cookie": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
+ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
+ "dev": true,
+ "requires": {
+ "punycode": "1.4.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ }
+ }
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "tsc-then": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/tsc-then/-/tsc-then-1.1.0.tgz",
+ "integrity": "sha512-830G8SK8tewOxfKVBC5YWqZ2C7wS1D4dh9267ebLxR7Gvh3UuI6aKU5Hxo+L3Kkcy6CuxZp4PMGl066DZ3Hlmw==",
+ "requires": {
+ "@types/node": "8.10.13",
+ "semver": "5.5.0"
+ }
+ },
+ "tslib": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz",
+ "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ=="
+ },
+ "tslint": {
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.10.0.tgz",
+ "integrity": "sha1-EeJrzLiK+gLdDZlWyuPUVAtfVMM=",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "builtin-modules": "1.1.1",
+ "chalk": "2.4.1",
+ "commander": "2.15.1",
+ "diff": "3.5.0",
+ "glob": "7.1.2",
+ "js-yaml": "3.11.0",
+ "minimatch": "3.0.4",
+ "resolve": "1.7.1",
+ "semver": "5.5.0",
+ "tslib": "1.9.0",
+ "tsutils": "2.26.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "commander": {
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
+ "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag=="
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "tsutils": {
+ "version": "2.26.2",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.26.2.tgz",
+ "integrity": "sha512-uzwnhmrSbyinPCiwfzGsOY3IulBTwoky7r83HmZdz9QNCjhSCzavkh47KLWuU0zF2F2WbpmmzoJUIEiYyd+jEQ==",
+ "requires": {
+ "tslib": "1.9.0"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "dev": true,
+ "optional": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "type-detect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz",
+ "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI="
+ },
+ "type-is": {
+ "version": "1.6.16",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
+ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
+ "dev": true,
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "2.1.18"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
+ },
+ "typescript": {
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.3.tgz",
+ "integrity": "sha512-K7g15Bb6Ra4lKf7Iq2l/I5/En+hLIHmxWZGq3D4DIRNFxMNV6j2SHSvDOqs2tGd4UvD/fJvrwopzQXjLrT7Itw=="
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "ua-parser-js": {
+ "version": "0.7.18",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz",
+ "integrity": "sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA==",
+ "dev": true
+ },
+ "uglify-js": {
+ "version": "2.8.29",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+ "optional": true,
+ "requires": {
+ "source-map": "0.5.7",
+ "uglify-to-browserify": "1.0.2",
+ "yargs": "3.10.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+ "optional": true
+ },
+ "cliui": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+ "optional": true,
+ "requires": {
+ "center-align": "0.1.3",
+ "right-align": "0.1.3",
+ "wordwrap": "0.0.2"
+ }
+ },
+ "wordwrap": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+ "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+ "optional": true
+ },
+ "yargs": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+ "optional": true,
+ "requires": {
+ "camelcase": "1.2.1",
+ "cliui": "2.1.0",
+ "decamelize": "1.2.0",
+ "window-size": "0.1.0"
+ }
+ }
+ }
+ },
+ "uglify-to-browserify": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
+ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+ "optional": true
+ },
+ "ultron": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
+ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
+ },
+ "unc-path-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
+ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo="
+ },
+ "underscore": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
+ "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=",
+ "dev": true
+ },
+ "underscore.string": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz",
+ "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "unicode-canonical-property-names-ecmascript": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.3.tgz",
+ "integrity": "sha512-iG/2t0F2LAU8aZYPkX5gi7ebukHnr3sWFESpb+zPQeeaQwOkfoO6ZW17YX7MdRPNG9pCy+tjzGill+Ah0Em0HA==",
+ "dev": true
+ },
+ "unicode-match-property-ecmascript": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.3.tgz",
+ "integrity": "sha512-nFcaBFcr08UQNF15ZgI5ISh3yUnQm7SJRRxwYrL5VYX46pS+6Q7TCTv4zbK+j6/l7rQt0mMiTL2zpmeygny6rA==",
+ "dev": true,
+ "requires": {
+ "unicode-canonical-property-names-ecmascript": "1.0.3",
+ "unicode-property-aliases-ecmascript": "1.0.3"
+ }
+ },
+ "unicode-match-property-value-ecmascript": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.1.tgz",
+ "integrity": "sha512-lM8B0FDZQh9yYGgiabRQcyWicB27VLOolSBRIxsO7FeQPtg+79Oe7sC8Mzr8BObDs+G9CeYmC/shHo6OggNEog==",
+ "dev": true
+ },
+ "unicode-property-aliases-ecmascript": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.3.tgz",
+ "integrity": "sha512-TdDmDOTxEf2ad1g3ZBpM6cqKIb2nJpVlz1Q++casDryKz18tpeMBhSng9hjC1CTQCkOV9Rw2knlSB6iRo7ad1w==",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "unique-stream": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
+ "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
+ "requires": {
+ "json-stable-stringify": "1.0.1",
+ "through2-filter": "2.0.0"
+ }
+ },
+ "unique-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
+ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
+ "dev": true,
+ "requires": {
+ "crypto-random-string": "1.0.0"
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc="
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "untildify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz",
+ "integrity": "sha1-F+soB5h/dpUunASF/DEdBqgmouA=",
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "unzip-response": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz",
+ "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=",
+ "dev": true
+ },
+ "update-notifier": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-1.0.3.tgz",
+ "integrity": "sha1-j5LFFUgr1oMbfJMBPnD4dVLHz1o=",
+ "dev": true,
+ "requires": {
+ "boxen": "0.6.0",
+ "chalk": "1.1.3",
+ "configstore": "2.1.0",
+ "is-npm": "1.0.0",
+ "latest-version": "2.0.0",
+ "lazy-req": "1.1.0",
+ "semver-diff": "2.1.0",
+ "xdg-basedir": "2.0.0"
+ }
+ },
+ "upper-case": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
+ "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
+ "dev": true
+ },
+ "urijs": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz",
+ "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==",
+ "dev": true
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+ },
+ "url-parse-lax": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+ "requires": {
+ "prepend-http": "1.0.4"
+ }
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "requires": {
+ "kind-of": "6.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "user-home": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz",
+ "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=",
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+ "requires": {
+ "inherits": "2.0.1"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
+ }
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+ "dev": true
+ },
+ "uuid": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
+ "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==",
+ "dev": true
+ },
+ "v8flags": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
+ "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
+ "requires": {
+ "user-home": "1.1.1"
+ },
+ "dependencies": {
+ "user-home": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
+ "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA="
+ }
+ }
+ },
+ "vali-date": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz",
+ "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY="
+ },
+ "validate-element-name": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/validate-element-name/-/validate-element-name-2.1.1.tgz",
+ "integrity": "sha1-j/dffaafc+fFEFiDYhMFCLesZE4=",
+ "dev": true,
+ "requires": {
+ "is-potential-custom-element-name": "1.0.0",
+ "log-symbols": "1.0.2",
+ "meow": "3.7.0"
+ }
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
+ "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
+ "requires": {
+ "spdx-correct": "3.0.0",
+ "spdx-expression-parse": "3.0.0"
+ }
+ },
+ "vargs": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/vargs/-/vargs-0.1.0.tgz",
+ "integrity": "sha1-a2GE2mUgzDIEzhtAfKwm2SYJ6/8=",
+ "dev": true
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+ "dev": true
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "1.3.0"
+ }
+ },
+ "vinyl": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
+ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
+ "requires": {
+ "clone": "1.0.4",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ },
+ "vinyl-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz",
+ "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "strip-bom": "2.0.0",
+ "strip-bom-stream": "2.0.0",
+ "vinyl": "1.2.0"
+ },
+ "dependencies": {
+ "first-chunk-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz",
+ "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=",
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "strip-bom-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz",
+ "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=",
+ "requires": {
+ "first-chunk-stream": "2.0.0",
+ "strip-bom": "2.0.0"
+ }
+ }
+ }
+ },
+ "vinyl-fs": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz",
+ "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=",
+ "requires": {
+ "duplexify": "3.6.0",
+ "glob-stream": "5.3.5",
+ "graceful-fs": "4.1.11",
+ "gulp-sourcemaps": "1.6.0",
+ "is-valid-glob": "0.3.0",
+ "lazystream": "1.0.0",
+ "lodash.isequal": "4.5.0",
+ "merge-stream": "1.0.1",
+ "mkdirp": "0.5.1",
+ "object-assign": "4.1.1",
+ "readable-stream": "2.3.6",
+ "strip-bom": "2.0.0",
+ "strip-bom-stream": "1.0.0",
+ "through2": "2.0.3",
+ "through2-filter": "2.0.0",
+ "vali-date": "1.0.0",
+ "vinyl": "1.2.0"
+ }
+ },
+ "vinyl-fs-fake": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/vinyl-fs-fake/-/vinyl-fs-fake-1.1.0.tgz",
+ "integrity": "sha1-BfGxQrrKoUXDH6E4zi+gv9aLXwI=",
+ "requires": {
+ "through2": "0.6.5",
+ "vinyl": "0.4.6",
+ "vinyl-fs": "0.3.14"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
+ "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8="
+ },
+ "glob": {
+ "version": "4.5.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz",
+ "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=",
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "2.0.10",
+ "once": "1.4.0"
+ }
+ },
+ "glob-stream": {
+ "version": "3.1.18",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz",
+ "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=",
+ "requires": {
+ "glob": "4.5.3",
+ "glob2base": "0.0.12",
+ "minimatch": "2.0.10",
+ "ordered-read-streams": "0.1.0",
+ "through2": "0.6.5",
+ "unique-stream": "1.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
+ "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
+ "requires": {
+ "natives": "1.1.3"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "minimatch": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz",
+ "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "ordered-read-streams": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz",
+ "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY="
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ },
+ "strip-bom": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz",
+ "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=",
+ "requires": {
+ "first-chunk-stream": "1.0.0",
+ "is-utf8": "0.2.1"
+ }
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ },
+ "unique-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz",
+ "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs="
+ },
+ "vinyl": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
+ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
+ "requires": {
+ "clone": "0.2.0",
+ "clone-stats": "0.0.1"
+ }
+ },
+ "vinyl-fs": {
+ "version": "0.3.14",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz",
+ "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=",
+ "requires": {
+ "defaults": "1.0.3",
+ "glob-stream": "3.1.18",
+ "glob-watcher": "0.0.6",
+ "graceful-fs": "3.0.11",
+ "mkdirp": "0.5.1",
+ "strip-bom": "1.0.0",
+ "through2": "0.6.5",
+ "vinyl": "0.4.6"
+ }
+ }
+ }
+ },
+ "vlq": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
+ "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "walkdir": {
+ "version": "0.0.11",
+ "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz",
+ "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI="
+ },
+ "wbuf": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "dev": true,
+ "requires": {
+ "minimalistic-assert": "1.0.1"
+ }
+ },
+ "wct-local": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wct-local/-/wct-local-2.1.0.tgz",
+ "integrity": "sha512-OiMSbxp6e5tyvTbUA4VAQbw4we53EXEmekx9BbIgS/HryoQISzap5DSAE/kvpRpJ2Axt0z12d8ChxqwNflApfA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "@types/express": "4.11.1",
+ "@types/freeport": "1.0.21",
+ "@types/launchpad": "0.6.0",
+ "@types/node": "9.6.13",
+ "@types/which": "1.3.1",
+ "chalk": "2.4.1",
+ "cleankill": "2.0.0",
+ "freeport": "1.0.5",
+ "launchpad": "0.7.0",
+ "promisify-node": "0.4.0",
+ "selenium-standalone": "6.14.0",
+ "which": "1.3.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "9.6.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.13.tgz",
+ "integrity": "sha512-rAlzcc9b66uY+pwvBCjhl9/Nm/mr3rt1/pfHVHDMd0Bfg4olE0UlvaEZh+TM/uwzEFYVnLbDZHG9mVjZrHdv8g==",
+ "dev": true,
+ "optional": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true,
+ "optional": true
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "wct-sauce": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/wct-sauce/-/wct-sauce-2.0.1.tgz",
+ "integrity": "sha512-nk6cPKdACVt3R+n9XyCTQTeRKOhhajyh0WaF5U1BsxPlVS8tNOUGleXQDUUjB+q1DPS7+j1F3UJqhnmrUMDVJA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "cleankill": "2.0.0",
+ "lodash": "3.10.1",
+ "request": "2.85.0",
+ "sauce-connect-launcher": "1.2.4",
+ "temp": "0.8.3",
+ "uuid": "2.0.3"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true,
+ "optional": true
+ },
+ "uuid": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
+ "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "wd": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/wd/-/wd-1.6.2.tgz",
+ "integrity": "sha512-QWfLPcChqM4yu0b+thRP4QIsvqqlu/HWRQXBNY/+j60yJ/D4Kk+g9i6JOo5JMuWPVGGARIVhzbr4j9dIMAr7wg==",
+ "dev": true,
+ "requires": {
+ "archiver": "1.3.0",
+ "async": "2.0.1",
+ "lodash": "4.16.2",
+ "mkdirp": "0.5.1",
+ "q": "1.4.1",
+ "request": "2.85.0",
+ "underscore.string": "3.3.4",
+ "vargs": "0.1.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.0.1.tgz",
+ "integrity": "sha1-twnMAoCpw28J9FNr6CPIOKkEniU=",
+ "dev": true,
+ "requires": {
+ "lodash": "4.16.2"
+ }
+ },
+ "lodash": {
+ "version": "4.16.2",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.2.tgz",
+ "integrity": "sha1-PmJtuCcEimmSgaihJSJjJs/A5lI=",
+ "dev": true
+ },
+ "q": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz",
+ "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=",
+ "dev": true
+ }
+ }
+ },
+ "web-component-tester": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/web-component-tester/-/web-component-tester-6.6.0.tgz",
+ "integrity": "sha512-f+LqR4rHUtVIg6T79uo6BYuyrIOzInPWzOJo69sGxX3tRTDeTwQzJSrfX4/MKA4qa3ldGPODJHizRYgZbjYjbQ==",
+ "dev": true,
+ "requires": {
+ "@polymer/sinonjs": "1.17.1",
+ "@polymer/test-fixture": "0.0.3",
+ "@webcomponents/webcomponentsjs": "1.2.0",
+ "accessibility-developer-tools": "2.12.0",
+ "async": "2.6.0",
+ "body-parser": "1.18.2",
+ "bower-config": "1.4.1",
+ "chai": "4.1.2",
+ "chalk": "1.1.3",
+ "cleankill": "2.0.0",
+ "express": "4.16.3",
+ "findup-sync": "2.0.0",
+ "glob": "7.1.2",
+ "lodash": "3.10.1",
+ "mocha": "3.5.3",
+ "multer": "1.3.0",
+ "nomnom": "1.8.1",
+ "polyserve": "0.27.11",
+ "promisify-node": "0.4.0",
+ "resolve": "1.7.1",
+ "semver": "5.5.0",
+ "send": "0.11.1",
+ "server-destroy": "1.0.1",
+ "sinon": "2.4.1",
+ "sinon-chai": "2.14.0",
+ "socket.io": "2.1.0",
+ "stacky": "1.3.1",
+ "update-notifier": "2.5.0",
+ "wct-local": "2.1.0",
+ "wct-sauce": "2.0.1",
+ "wd": "1.6.2"
+ },
+ "dependencies": {
+ "ansi-align": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
+ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "string-width": "2.1.1"
+ }
+ },
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "requires": {
+ "lodash": "4.17.10"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "4.17.10",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
+ "dev": true
+ }
+ }
+ },
+ "boxen": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
+ "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-align": "2.0.0",
+ "camelcase": "4.1.0",
+ "chalk": "2.4.1",
+ "cli-boxes": "1.0.0",
+ "string-width": "2.1.1",
+ "term-size": "1.2.0",
+ "widest-line": "2.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ }
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true,
+ "optional": true
+ },
+ "chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
+ "dev": true,
+ "requires": {
+ "assertion-error": "1.1.0",
+ "check-error": "1.0.2",
+ "deep-eql": "3.0.1",
+ "get-func-name": "2.0.0",
+ "pathval": "1.1.0",
+ "type-detect": "4.0.8"
+ }
+ },
+ "configstore": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
+ "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "dot-prop": "4.2.0",
+ "graceful-fs": "4.1.11",
+ "make-dir": "1.2.0",
+ "unique-string": "1.0.0",
+ "write-file-atomic": "2.3.0",
+ "xdg-basedir": "3.0.0"
+ }
+ },
+ "deep-eql": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "dev": true,
+ "requires": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "depd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz",
+ "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=",
+ "dev": true
+ },
+ "destroy": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz",
+ "integrity": "sha1-tDO0ck5x/YVR2YhRdIUcX8N34sk=",
+ "dev": true
+ },
+ "detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+ "dev": true
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "dot-prop": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
+ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-obj": "1.0.1"
+ }
+ },
+ "ee-first": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz",
+ "integrity": "sha1-ag18YiHkkP7v2S7D9EHJzozQl/Q=",
+ "dev": true
+ },
+ "escape-html": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz",
+ "integrity": "sha1-GBoobq05ejmpKFfPsdQwUuNWv/A=",
+ "dev": true
+ },
+ "etag": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.5.1.tgz",
+ "integrity": "sha1-VMUN4E7kJpVWKSWsVmWIKRvn6eo=",
+ "dev": true,
+ "requires": {
+ "crc": "3.2.1"
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "1.0.1"
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "findup-sync": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
+ "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
+ "dev": true,
+ "requires": {
+ "detect-file": "1.0.0",
+ "is-glob": "3.1.0",
+ "micromatch": "3.1.10",
+ "resolve-dir": "1.0.1"
+ }
+ },
+ "formatio": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz",
+ "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=",
+ "dev": true,
+ "requires": {
+ "samsam": "1.3.0"
+ }
+ },
+ "fresh": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.4.tgz",
+ "integrity": "sha1-NYJJkgbJcjcUGQ7ddLRgT+tKYUw=",
+ "dev": true
+ },
+ "global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "dev": true,
+ "requires": {
+ "global-prefix": "1.0.2",
+ "is-windows": "1.0.2",
+ "resolve-dir": "1.0.1"
+ }
+ },
+ "global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "homedir-polyfill": "1.0.1",
+ "ini": "1.3.5",
+ "is-windows": "1.0.2",
+ "which": "1.3.0"
+ }
+ },
+ "got": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "create-error-class": "3.0.2",
+ "duplexer3": "0.1.4",
+ "get-stream": "3.0.0",
+ "is-redirect": "1.0.0",
+ "is-retry-allowed": "1.1.0",
+ "is-stream": "1.1.0",
+ "lowercase-keys": "1.0.1",
+ "safe-buffer": "5.1.2",
+ "timed-out": "4.0.1",
+ "unzip-response": "2.0.1",
+ "url-parse-lax": "1.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "latest-version": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
+ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "package-json": "4.0.1"
+ }
+ },
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true
+ },
+ "lolex": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz",
+ "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "mime": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz",
+ "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=",
+ "dev": true
+ },
+ "ms": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz",
+ "integrity": "sha1-hlvpTC5zl62KV9pqYzpuLzB5i4M=",
+ "dev": true
+ },
+ "on-finished": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.2.1.tgz",
+ "integrity": "sha1-XIXBzDYpn3gCllP2Z/J7a5nrwCk=",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.0"
+ }
+ },
+ "package-json": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
+ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "got": "6.7.1",
+ "registry-auth-token": "3.3.2",
+ "registry-url": "3.1.0",
+ "semver": "5.5.0"
+ }
+ },
+ "range-parser": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz",
+ "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=",
+ "dev": true
+ },
+ "resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "global-modules": "1.0.0"
+ }
+ },
+ "samsam": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz",
+ "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==",
+ "dev": true
+ },
+ "send": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.11.1.tgz",
+ "integrity": "sha1-G+q/1C+eJwn5kCivMHisErRwktU=",
+ "dev": true,
+ "requires": {
+ "debug": "2.1.3",
+ "depd": "1.0.1",
+ "destroy": "1.0.3",
+ "escape-html": "1.0.1",
+ "etag": "1.5.1",
+ "fresh": "0.2.4",
+ "mime": "1.2.11",
+ "ms": "0.7.0",
+ "on-finished": "2.2.1",
+ "range-parser": "1.0.3"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz",
+ "integrity": "sha1-zoqxte6PvuK/o7Yzyrk9NmtjQY4=",
+ "dev": true,
+ "requires": {
+ "ms": "0.7.0"
+ }
+ }
+ }
+ },
+ "sinon": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz",
+ "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==",
+ "dev": true,
+ "requires": {
+ "diff": "3.5.0",
+ "formatio": "1.2.0",
+ "lolex": "1.6.0",
+ "native-promise-only": "0.8.1",
+ "path-to-regexp": "1.7.0",
+ "samsam": "1.3.0",
+ "text-encoding": "0.6.4",
+ "type-detect": "4.0.8"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "timed-out": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
+ "dev": true,
+ "optional": true
+ },
+ "type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true
+ },
+ "unzip-response": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+ "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
+ "dev": true,
+ "optional": true
+ },
+ "update-notifier": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz",
+ "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "boxen": "1.3.0",
+ "chalk": "2.4.1",
+ "configstore": "3.1.2",
+ "import-lazy": "2.1.0",
+ "is-ci": "1.1.0",
+ "is-installed-globally": "0.1.0",
+ "is-npm": "1.0.0",
+ "latest-version": "3.1.0",
+ "semver-diff": "2.1.0",
+ "xdg-basedir": "3.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ }
+ }
+ },
+ "widest-line": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz",
+ "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "string-width": "2.1.1"
+ }
+ },
+ "write-file-atomic": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
+ "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "imurmurhash": "0.1.4",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "xdg-basedir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
+ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
+ "dev": true
+ }
+ }
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "whatwg-url": {
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.1.tgz",
+ "integrity": "sha512-FwygsxsXx27x6XXuExA/ox3Ktwcbf+OAvrKmLulotDAiO1Q6ixchPFaHYsis2zZBZSJTR0+dR+JVtf7MlbqZjw==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "which": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
+ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+ },
+ "widest-line": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz",
+ "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2"
+ }
+ },
+ "window-size": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
+ "optional": true
+ },
+ "winston": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.2.tgz",
+ "integrity": "sha512-4S/Ad4ZfSNl8OccCLxnJmNISWcm2joa6Q0YGDxlxMzH0fgSwWsjMt+SmlNwCqdpaPg3ev1HKkMBsIiXeSUwpbA==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
+ },
+ "wordwrapjs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-2.0.0.tgz",
+ "integrity": "sha1-q1X2leYRjak4WP3XDAU9HF4BrCA=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "write": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+ "requires": {
+ "mkdirp": "0.5.1"
+ }
+ },
+ "write-file-atomic": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz",
+ "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "imurmurhash": "0.1.4",
+ "slide": "1.1.6"
+ }
+ },
+ "ws": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
+ "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
+ "requires": {
+ "async-limiter": "1.0.0",
+ "safe-buffer": "5.1.2",
+ "ultron": "1.1.1"
+ }
+ },
+ "xdg-basedir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz",
+ "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "xmlbuilder": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",
+ "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=",
+ "dev": true,
+ "optional": true
+ },
+ "xmldom": {
+ "version": "0.1.27",
+ "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz",
+ "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=",
+ "dev": true,
+ "optional": true
+ },
+ "xmlhttprequest-ssl": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
+ "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=",
+ "dev": true
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
+ },
+ "yargs": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz",
+ "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
+ "requires": {
+ "camelcase": "4.1.0",
+ "cliui": "3.2.0",
+ "decamelize": "1.2.0",
+ "get-caller-file": "1.0.2",
+ "os-locale": "2.1.0",
+ "read-pkg-up": "2.0.0",
+ "require-directory": "2.1.1",
+ "require-main-filename": "1.0.1",
+ "set-blocking": "2.0.0",
+ "string-width": "2.1.1",
+ "which-module": "2.0.0",
+ "y18n": "3.2.1",
+ "yargs-parser": "7.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
+ },
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "requires": {
+ "locate-path": "2.0.0"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+ },
+ "load-json-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "strip-bom": "3.0.0"
+ }
+ },
+ "path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "requires": {
+ "pify": "2.3.0"
+ }
+ },
+ "read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "requires": {
+ "load-json-file": "2.0.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "2.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "requires": {
+ "find-up": "2.1.0",
+ "read-pkg": "2.0.0"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
+ "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+ "requires": {
+ "camelcase": "4.1.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
+ }
+ }
+ },
+ "yauzl": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
+ "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
+ "requires": {
+ "fd-slicer": "1.0.1"
+ }
+ },
+ "yeast": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
+ "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
+ "dev": true
+ },
+ "yeoman-assert": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/yeoman-assert/-/yeoman-assert-2.2.3.tgz",
+ "integrity": "sha1-pWgqg2MsUKwO6EFzpaEP1vMgZHQ="
+ },
+ "yeoman-environment": {
+ "version": "1.6.6",
+ "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-1.6.6.tgz",
+ "integrity": "sha1-zYX6Z9FWBg5EDXgH1+988NLR1nE=",
+ "requires": {
+ "chalk": "1.1.3",
+ "debug": "2.6.9",
+ "diff": "2.2.3",
+ "escape-string-regexp": "1.0.5",
+ "globby": "4.1.0",
+ "grouped-queue": "0.3.3",
+ "inquirer": "1.2.3",
+ "lodash": "4.17.10",
+ "log-symbols": "1.0.2",
+ "mem-fs": "1.1.3",
+ "text-table": "0.2.0",
+ "untildify": "2.1.0"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
+ "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globby": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-4.1.0.tgz",
+ "integrity": "sha1-CA9UVJ7BuCpsYOYx/ILhIR2+lfg=",
+ "requires": {
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "glob": "6.0.4",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ }
+ }
+ },
+ "yeoman-generator": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-1.1.1.tgz",
+ "integrity": "sha1-QMK09s374F4ZUv3XKTPw2JJdvfU=",
+ "requires": {
+ "async": "2.6.0",
+ "chalk": "1.1.3",
+ "class-extend": "0.1.2",
+ "cli-table": "0.3.1",
+ "cross-spawn": "5.1.0",
+ "dargs": "5.1.0",
+ "dateformat": "2.2.0",
+ "debug": "2.6.9",
+ "detect-conflict": "1.0.1",
+ "error": "7.0.2",
+ "find-up": "2.1.0",
+ "github-username": "3.0.0",
+ "glob": "7.1.2",
+ "istextorbinary": "2.2.1",
+ "lodash": "4.17.10",
+ "mem-fs-editor": "3.0.2",
+ "minimist": "1.2.0",
+ "mkdirp": "0.5.1",
+ "path-exists": "3.0.0",
+ "path-is-absolute": "1.0.1",
+ "pretty-bytes": "4.0.2",
+ "read-chunk": "2.1.0",
+ "read-pkg-up": "2.0.0",
+ "rimraf": "2.6.2",
+ "run-async": "2.3.0",
+ "shelljs": "0.7.8",
+ "text-table": "0.2.0",
+ "through2": "2.0.3",
+ "user-home": "2.0.0",
+ "yeoman-environment": "1.6.6"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "requires": {
+ "lodash": "4.17.10"
+ }
+ },
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "requires": {
+ "locate-path": "2.0.0"
+ }
+ },
+ "load-json-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "strip-bom": "3.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+ },
+ "path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "requires": {
+ "pify": "2.3.0"
+ }
+ },
+ "read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "requires": {
+ "load-json-file": "2.0.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "2.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "requires": {
+ "find-up": "2.1.0",
+ "read-pkg": "2.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
+ }
+ }
+ },
+ "yeoman-test": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/yeoman-test/-/yeoman-test-1.7.0.tgz",
+ "integrity": "sha512-vJeg2gpWfhbq0HvQ7/yqmsQpYmADBfo9kaW+J6uJASkI7ChLBXNLIBQqaXCA65kWtHXOco+nBm0Km/O9YWk25Q==",
+ "requires": {
+ "inquirer": "3.3.0",
+ "lodash": "4.17.10",
+ "mkdirp": "0.5.1",
+ "pinkie-promise": "2.0.1",
+ "rimraf": "2.6.2",
+ "sinon": "2.4.1",
+ "yeoman-environment": "2.0.6",
+ "yeoman-generator": "1.1.1"
+ },
+ "dependencies": {
+ "ansi-escapes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
+ "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw=="
+ },
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "requires": {
+ "restore-cursor": "2.0.0"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
+ },
+ "external-editor": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
+ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
+ "requires": {
+ "chardet": "0.4.2",
+ "iconv-lite": "0.4.23",
+ "tmp": "0.0.33"
+ }
+ },
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "requires": {
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "formatio": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz",
+ "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=",
+ "requires": {
+ "samsam": "1.3.0"
+ }
+ },
+ "globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+ "requires": {
+ "array-union": "1.0.2",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ },
+ "inquirer": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
+ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
+ "requires": {
+ "ansi-escapes": "3.1.0",
+ "chalk": "2.4.1",
+ "cli-cursor": "2.1.0",
+ "cli-width": "2.2.0",
+ "external-editor": "2.2.0",
+ "figures": "2.0.0",
+ "lodash": "4.17.10",
+ "mute-stream": "0.0.7",
+ "run-async": "2.3.0",
+ "rx-lite": "4.0.8",
+ "rx-lite-aggregates": "4.0.8",
+ "string-width": "2.1.1",
+ "strip-ansi": "4.0.0",
+ "through": "2.3.8"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+ },
+ "log-symbols": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+ "requires": {
+ "chalk": "2.4.1"
+ }
+ },
+ "lolex": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz",
+ "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY="
+ },
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "requires": {
+ "mimic-fn": "1.2.0"
+ }
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "requires": {
+ "onetime": "2.0.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "samsam": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz",
+ "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg=="
+ },
+ "sinon": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz",
+ "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==",
+ "requires": {
+ "diff": "3.5.0",
+ "formatio": "1.2.0",
+ "lolex": "1.6.0",
+ "native-promise-only": "0.8.1",
+ "path-to-regexp": "1.7.0",
+ "samsam": "1.3.0",
+ "text-encoding": "0.6.4",
+ "type-detect": "4.0.8"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="
+ },
+ "untildify": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.2.tgz",
+ "integrity": "sha1-fx8wIFWz/qDz6B3HjrNnZstl4/E="
+ },
+ "yeoman-environment": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.0.6.tgz",
+ "integrity": "sha512-jzHBTTy8EPI4ImV8dpUMt+Q5zELkSU5xvGpndHcHudQ4tqN6YgIWaCGmRFl+HDchwRUkcgyjQ+n6/w5zlJBCPg==",
+ "requires": {
+ "chalk": "2.4.1",
+ "debug": "3.1.0",
+ "diff": "3.5.0",
+ "escape-string-regexp": "1.0.5",
+ "globby": "6.1.0",
+ "grouped-queue": "0.3.3",
+ "inquirer": "3.3.0",
+ "is-scoped": "1.0.0",
+ "lodash": "4.17.10",
+ "log-symbols": "2.2.0",
+ "mem-fs": "1.1.3",
+ "text-table": "0.2.0",
+ "untildify": "3.0.2"
+ }
+ }
+ }
+ },
+ "zip-stream": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz",
+ "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=",
+ "dev": true,
+ "requires": {
+ "archiver-utils": "1.3.0",
+ "compress-commons": "1.2.2",
+ "lodash": "4.17.10",
+ "readable-stream": "2.3.6"
+ }
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.107",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+ "dev": true
+ },
+ "pretty-bytes": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz",
+ "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=",
+ "dev": true
+ },
+ "pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
+ "dev": true
+ },
+ "prismjs": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.14.0.tgz",
+ "integrity": "sha512-sa2s4m60bXs+kU3jcuUwx3ZCrUH7o0kuqnOOINbODqlRrDB7KY8SRx+xR/D7nHLlgfDdG7zXbRO8wJ+su5Ls0A==",
+ "dev": true,
+ "requires": {
+ "clipboard": "2.0.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ }
+ }
+ },
+ "private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
+ },
+ "progress": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
+ "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
+ "dev": true
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
+ },
+ "pump": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "once": "1.4.0"
+ }
+ },
+ "pumpify": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.0.tgz",
+ "integrity": "sha512-UWi0klDoq8xtVzlMRgENV9F7iCTZExaJQSQL187UXsxpk9NnrKGqTqqUNYAKGOzucSOxs2+jUnRNI+rLviPhJg==",
+ "dev": true,
+ "requires": {
+ "duplexify": "3.6.0",
+ "inherits": "2.0.3",
+ "pump": "2.0.1"
+ },
+ "dependencies": {
+ "duplexify": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz",
+ "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6",
+ "stream-shift": "1.0.0"
+ }
+ }
+ }
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "randomatic": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
+ "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "rc": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz",
+ "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==",
+ "requires": {
+ "deep-extend": "0.5.1",
+ "ini": "1.3.5",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "1.1.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "1.1.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
+ "requires": {
+ "find-up": "1.1.2",
+ "read-pkg": "1.1.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "readdirp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
+ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "minimatch": "3.0.4",
+ "readable-stream": "2.3.6",
+ "set-immediate-shim": "1.0.1"
+ }
+ },
+ "rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+ "dev": true,
+ "requires": {
+ "resolve": "1.7.1"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "2.1.0",
+ "strip-indent": "1.0.1"
+ },
+ "dependencies": {
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "4.0.1"
+ }
+ }
+ }
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerate": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
+ "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+ },
+ "regenerator-transform": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "private": "0.1.8"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "regex-cache": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+ "dev": true,
+ "requires": {
+ "is-equal-shallow": "0.1.3"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "regexpp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
+ "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==",
+ "dev": true
+ },
+ "regexpu-core": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+ "dev": true,
+ "requires": {
+ "regenerate": "1.3.3",
+ "regjsgen": "0.2.0",
+ "regjsparser": "0.1.5"
+ }
+ },
+ "registry-auth-token": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
+ "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
+ "requires": {
+ "rc": "1.2.7",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "registry-url": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+ "requires": {
+ "rc": "1.2.7"
+ }
+ },
+ "regjsgen": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+ "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+ "dev": true
+ },
+ "regjsparser": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+ "dev": true,
+ "requires": {
+ "jsesc": "0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8="
+ }
+ }
+ },
+ "relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
+ "dev": true
+ },
+ "remove-bom-buffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz",
+ "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6",
+ "is-utf8": "0.2.1"
+ }
+ },
+ "remove-bom-stream": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz",
+ "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=",
+ "dev": true,
+ "requires": {
+ "remove-bom-buffer": "3.0.0",
+ "safe-buffer": "5.1.2",
+ "through2": "2.0.3"
+ }
+ },
+ "remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+ "dev": true
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "replace-ext": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+ "dev": true
+ },
+ "replace-homedir": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz",
+ "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "1.0.1",
+ "is-absolute": "1.0.0",
+ "remove-trailing-separator": "1.1.0"
+ }
+ },
+ "replacestream": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz",
+ "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "1.0.5",
+ "object-assign": "4.1.1",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "dev": true
+ },
+ "require-uncached": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+ "dev": true,
+ "requires": {
+ "caller-path": "0.1.0",
+ "resolve-from": "1.0.1"
+ }
+ },
+ "resolve": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz",
+ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==",
+ "requires": {
+ "path-parse": "1.0.5"
+ },
+ "dependencies": {
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ }
+ }
+ },
+ "resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "global-modules": "1.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
+ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
+ "dev": true
+ },
+ "resolve-options": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz",
+ "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=",
+ "dev": true,
+ "requires": {
+ "value-or-function": "3.0.0"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "dev": true,
+ "requires": {
+ "onetime": "2.0.1",
+ "signal-exit": "3.0.2"
+ },
+ "dependencies": {
+ "es6-promise": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
+ "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ=="
+ },
+ "lodash.template": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz",
+ "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=",
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.templatesettings": "4.1.0"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz",
+ "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=",
+ "requires": {
+ "lodash._reinterpolate": "3.0.0"
+ }
+ }
+ }
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "run-async": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+ "dev": true,
+ "requires": {
+ "is-promise": "2.1.0"
+ }
+ },
+ "run-sequence": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-2.2.1.tgz",
+ "integrity": "sha512-qkzZnQWMZjcKbh3CNly2srtrkaO/2H/SI5f2eliMCapdRD3UhMrwjfOAZJAnZ2H8Ju4aBzFZkBGXUqFs9V0yxw==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "fancy-log": "1.3.2",
+ "plugin-error": "0.1.2"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
+ "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-slice": "0.2.3"
+ }
+ },
+ "arr-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
+ "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+ "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
+ "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
+ "dev": true,
+ "requires": {
+ "kind-of": "1.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
+ "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
+ "dev": true
+ },
+ "plugin-error": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
+ "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
+ "dev": true,
+ "requires": {
+ "ansi-cyan": "0.1.1",
+ "ansi-red": "0.1.1",
+ "arr-diff": "1.1.0",
+ "arr-union": "2.1.0",
+ "extend-shallow": "1.1.4"
+ }
+ }
+ }
+ },
+ "rx-lite": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
+ "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
+ "dev": true
+ },
+ "rx-lite-aggregates": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
+ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
+ "dev": true,
+ "requires": {
+ "rx-lite": "4.0.8"
+ },
+ "dependencies": {
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "requires": {
+ "once": "1.4.0"
+ }
+ }
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "samsam": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz",
+ "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=",
+ "dev": true
+ },
+ "select": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
+ "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=",
+ "dev": true,
+ "optional": true
+ },
+ "semver": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
+ "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto="
+ },
+ "semver-diff": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
+ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
+ "dev": true,
+ "requires": {
+ "semver": "5.5.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ }
+ }
+ },
+ "semver-greatest-satisfied-range": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz",
+ "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=",
+ "dev": true,
+ "requires": {
+ "sver-compat": "1.5.0"
+ }
+ },
+ "serviceworker-cache-polyfill": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz",
+ "integrity": "sha1-3hnuc77yGrPAdAo3sz22JGS6ves=",
+ "dev": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true
+ },
+ "set-immediate-shim": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
+ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E="
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "requires": {
+ "shebang-regex": "1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+ },
+ "sinon": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz",
+ "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=",
+ "dev": true,
+ "requires": {
+ "formatio": "1.1.1",
+ "lolex": "1.3.2",
+ "samsam": "1.1.2",
+ "util": "0.10.3"
+ }
+ },
+ "sinon-chai": {
+ "version": "2.14.0",
+ "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz",
+ "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==",
+ "dev": true
+ },
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
+ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0"
+ }
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "requires": {
+ "atob": "2.1.1",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-support": {
+ "version": "0.4.18",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
+ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
+ },
+ "sparkles": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz",
+ "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=",
+ "dev": true
+ },
+ "spdx-correct": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
+ "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
+ "requires": {
+ "spdx-expression-parse": "3.0.0",
+ "spdx-license-ids": "3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
+ "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg=="
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "requires": {
+ "spdx-exceptions": "2.1.0",
+ "spdx-license-ids": "3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
+ "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA=="
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "stable": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
+ },
+ "stacky": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/stacky/-/stacky-1.3.1.tgz",
+ "integrity": "sha1-PxF+UYe5pz0j+HbWnwXIWxGAShI=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "lodash": "3.10.1"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true
+ }
+ }
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "stream": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stream/-/stream-0.0.2.tgz",
+ "integrity": "sha1-f1Nj8Ff2WSxVlfALyAon9c7B8O8=",
+ "dev": true,
+ "requires": {
+ "emitter-component": "1.1.1"
+ }
+ },
+ "stream-combiner": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz",
+ "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=",
+ "dev": true,
+ "requires": {
+ "duplexer": "0.1.1",
+ "through": "2.3.8"
+ }
+ },
+ "stream-counter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-1.0.0.tgz",
+ "integrity": "sha1-kc8lac5NxQYf6816yyY5SloRR1E=",
+ "dev": true
+ },
+ "stream-exhaust": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz",
+ "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==",
+ "dev": true
+ },
+ "stream-shift": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
+ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI="
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ }
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "requires": {
+ "ansi-regex": "2.1.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "strip-bom-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz",
+ "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=",
+ "dev": true,
+ "requires": {
+ "first-chunk-stream": "1.0.0",
+ "strip-bom": "2.0.0"
+ },
+ "dependencies": {
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ }
+ }
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+ },
+ "sver-compat": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz",
+ "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=",
+ "dev": true,
+ "requires": {
+ "es6-iterator": "2.0.3",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "sw-precache": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.1.tgz",
+ "integrity": "sha512-8FAy+BP/FXE+ILfiVTt+GQJ6UEf4CVHD9OfhzH0JX+3zoy2uFk7Vn9EfXASOtVmmIVbL3jE/W8Z66VgPSZcMhw==",
+ "dev": true,
+ "requires": {
+ "dom-urls": "1.1.0",
+ "es6-promise": "4.2.4",
+ "glob": "7.1.2",
+ "lodash.defaults": "4.2.0",
+ "lodash.template": "4.4.0",
+ "meow": "3.7.0",
+ "mkdirp": "0.5.1",
+ "pretty-bytes": "4.0.2",
+ "sw-toolbox": "3.6.0",
+ "update-notifier": "2.5.0"
+ },
+ "dependencies": {
+ "es6-promise": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
+ "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==",
+ "dev": true
+ },
+ "lodash.template": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz",
+ "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.templatesettings": "4.1.0"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz",
+ "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0"
+ }
+ }
+ }
+ },
+ "sw-toolbox": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz",
+ "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=",
+ "dev": true,
+ "requires": {
+ "path-to-regexp": "1.7.0",
+ "serviceworker-cache-polyfill": "4.0.0"
+ }
+ },
+ "table": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
+ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "ajv-keywords": "2.1.1",
+ "chalk": "2.4.1",
+ "lodash": "4.17.10",
+ "slice-ansi": "1.0.0",
+ "string-width": "2.1.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "clone": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
+ "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8="
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE="
+ },
+ "graceful-fs": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
+ "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg="
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.1",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ }
+ }
+ },
+ "term-size": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
+ "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
+ "dev": true,
+ "requires": {
+ "execa": "0.7.0"
+ }
+ },
+ "ternary-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.0.1.tgz",
+ "integrity": "sha1-Bk5Im0tb9gumpre8fy9cJ07Pgmk=",
+ "dev": true,
+ "requires": {
+ "duplexify": "3.5.4",
+ "fork-stream": "0.0.4",
+ "merge-stream": "1.0.1",
+ "through2": "2.0.3"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "textextensions": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-1.0.2.tgz",
+ "integrity": "sha1-ZUhjk+4fK7A5pgy7oFsLaL2VAdI=",
+ "dev": true
+ },
+ "thenify": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz",
+ "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=",
+ "requires": {
+ "any-promise": "1.3.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w=="
+ },
+ "@types/parse5": {
+ "version": "0.0.31",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-0.0.31.tgz",
+ "integrity": "sha1-6Cekk6RDsVbhtYKi5MO9wAQPLuc=",
+ "requires": {
+ "@types/node": "6.0.107"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.107",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.107.tgz",
+ "integrity": "sha512-iuJWRFHqU0tFLCYH6cfBZzMxThAAsNK31FZxoq+fKIDOSZk1p+3IhNWfEdvPJfsQXcTq8z+57s8xjQlrDAB0Gw=="
+ }
+ }
+ },
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
+ },
+ "dom5": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-1.3.6.tgz",
+ "integrity": "sha1-pwiKn8XzsI3J9u2kx6uuskGUXg0=",
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "4.2.23",
+ "@types/parse5": "0.0.31",
+ "clone": "1.0.4",
+ "parse5": "1.5.1"
+ }
+ },
+ "parse5": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
+ "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ="
+ }
+ }
+ },
+ "thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
+ "requires": {
+ "thenify": "3.3.0"
+ }
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "requires": {
+ "readable-stream": "2.3.6",
+ "xtend": "4.0.1"
+ }
+ },
+ "through2-filter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz",
+ "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=",
+ "dev": true,
+ "requires": {
+ "through2": "2.0.3",
+ "xtend": "4.0.1"
+ }
+ },
+ "time-stamp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
+ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
+ "dev": true
+ },
+ "timed-out": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
+ "dev": true
+ },
+ "tiny-emitter": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz",
+ "integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==",
+ "dev": true,
+ "optional": true
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "to-absolute-glob": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz",
+ "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "to-through": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz",
+ "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=",
+ "dev": true,
+ "requires": {
+ "through2": "2.0.3"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "type-detect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz",
+ "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=",
+ "dev": true
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "ua-parser-js": {
+ "version": "0.7.18",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz",
+ "integrity": "sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA=="
+ },
+ "uglify-js": {
+ "version": "3.3.23",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.23.tgz",
+ "integrity": "sha512-Ks+KqLGDsYn4z+pU7JsKCzC0T3mPYl+rU+VcPZiQOazjE4Uqi4UCRY3qPMDbJi7ze37n1lDXj3biz1ik93vqvw==",
+ "dev": true,
+ "requires": {
+ "commander": "2.15.1",
+ "source-map": "0.6.1"
+ }
+ },
+ "unc-path-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
+ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo="
+ },
+ "undertaker": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.0.tgz",
+ "integrity": "sha1-M52kZGJS0ILcN45wgGcpl1DhG0k=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "arr-map": "2.0.2",
+ "bach": "1.2.0",
+ "collection-map": "1.0.0",
+ "es6-weak-map": "2.0.2",
+ "last-run": "1.1.1",
+ "object.defaults": "1.1.0",
+ "object.reduce": "1.0.1",
+ "undertaker-registry": "1.0.1"
+ }
+ },
+ "undertaker-registry": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz",
+ "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "unique-stream": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
+ "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
+ "dev": true,
+ "requires": {
+ "json-stable-stringify": "1.0.1",
+ "through2-filter": "2.0.0"
+ }
+ },
+ "unique-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
+ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
+ "dev": true,
+ "requires": {
+ "crypto-random-string": "1.0.0"
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+ }
+ }
+ },
+ "unzip-response": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+ "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
+ "dev": true
+ },
+ "upath": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.5.tgz",
+ "integrity": "sha512-qbKn90aDQ0YEwvXoLqj0oiuUYroLX2lVHZ+b+xwjozFasAOC4GneDq5+OaIG5Zj+jFmbz/uO+f7a9qxjktJQww==",
+ "dev": true
+ },
+ "update-notifier": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz",
+ "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==",
+ "dev": true,
+ "requires": {
+ "boxen": "1.3.0",
+ "chalk": "2.4.1",
+ "configstore": "3.1.2",
+ "import-lazy": "2.1.0",
+ "is-ci": "1.1.0",
+ "is-installed-globally": "0.1.0",
+ "is-npm": "1.0.0",
+ "latest-version": "3.1.0",
+ "semver-diff": "2.1.0",
+ "xdg-basedir": "3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "upper-case": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
+ "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
+ "dev": true
+ },
+ "urijs": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz",
+ "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==",
+ "dev": true
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+ },
+ "url-parse-lax": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+ "dev": true,
+ "requires": {
+ "prepend-http": "1.0.4"
+ },
+ "dependencies": {
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
+ },
+ "boom": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
+ "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE="
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+ },
+ "cryptiles": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
+ "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
+ "requires": {
+ "boom": "5.2.0"
+ },
+ "dependencies": {
+ "boom": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
+ "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw=="
+ }
+ }
+ },
+ "form-data": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
+ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk="
+ },
+ "graceful-fs": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
+ "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg="
+ },
+ "har-validator": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
+ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
+ "requires": {
+ "ajv": "5.5.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.0.1.tgz",
+ "integrity": "sha1-twnMAoCpw28J9FNr6CPIOKkEniU=",
+ "requires": {
+ "lodash": "4.17.10"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "request": {
+ "version": "2.85.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz",
+ "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==",
+ "requires": {
+ "aws-sign2": "0.7.0",
+ "caseless": "0.12.0",
+ "extend": "3.0.1",
+ "form-data": "2.3.2",
+ "har-validator": "5.0.3",
+ "isstream": "0.1.2",
+ "safe-buffer": "5.1.2",
+ "uuid": "3.2.1"
+ }
+ },
+ "sntp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
+ "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg=="
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ },
+ "vinyl": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
+ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc="
+ }
+ }
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.1"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+ "dev": true
+ }
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "uuid": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
+ "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA=="
+ },
+ "v8flags": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz",
+ "integrity": "sha512-6sgSKoFw1UpUPd3cFdF7QGnrH6tDeBgW1F3v9gy8gLY0mlbiBXq8soy8aQpY6xeeCjH5K+JvC62Acp7gtl7wWA==",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "1.0.1"
+ }
+ },
+ "vali-date": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "dev": true
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
+ "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
+ "requires": {
+ "spdx-correct": "3.0.0",
+ "spdx-expression-parse": "3.0.0"
+ }
+ },
+ "value-or-function": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz",
+ "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=",
+ "dev": true
+ },
+ "vinyl": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
+ "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=",
+ "dev": true,
+ "requires": {
+ "clone": "2.1.1",
+ "clone-buffer": "1.0.0",
+ "clone-stats": "1.0.0",
+ "cloneable-readable": "1.1.2",
+ "remove-trailing-separator": "1.1.0",
+ "replace-ext": "1.0.0"
+ }
+ },
+ "vinyl-fs": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.2.tgz",
+ "integrity": "sha512-AUSFda1OukBwuLPBTbyuO4IRWgfXmqC4UTW0f8xrCa8Hkv9oyIU+NSqBlgfOLZRoUt7cHdo75hKQghCywpIyIw==",
+ "dev": true,
+ "requires": {
+ "fs-mkdirp-stream": "1.0.0",
+ "glob-stream": "6.1.0",
+ "graceful-fs": "4.1.11",
+ "is-valid-glob": "1.0.0",
+ "lazystream": "1.0.0",
+ "lead": "1.0.0",
+ "object.assign": "4.1.0",
+ "pumpify": "1.5.0",
+ "readable-stream": "2.3.6",
+ "remove-bom-buffer": "3.0.0",
+ "remove-bom-stream": "1.2.0",
+ "resolve-options": "1.1.0",
+ "through2": "2.0.3",
+ "to-through": "2.0.0",
+ "value-or-function": "3.0.0",
+ "vinyl": "2.1.0",
+ "vinyl-sourcemap": "1.1.0"
+ },
+ "dependencies": {
+ "is-valid-glob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
+ "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=",
+ "dev": true
+ }
+ }
+ },
+ "vinyl-sourcemap": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz",
+ "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=",
+ "dev": true,
+ "requires": {
+ "append-buffer": "1.0.2",
+ "convert-source-map": "1.5.1",
+ "graceful-fs": "4.1.11",
+ "normalize-path": "2.1.1",
+ "now-and-later": "2.0.0",
+ "remove-bom-buffer": "3.0.0",
+ "vinyl": "2.1.0"
+ }
+ },
+ "vinyl-sourcemaps-apply": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz",
+ "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "vulcanize": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/vulcanize/-/vulcanize-1.16.0.tgz",
+ "integrity": "sha512-TYlFljSc896b5+0FmMiw0JAMrHNBiHx0IAFC/dQR3Dxdb9Nx43ohm6wMWTlPXQn4sk/0WkqfgoAA6SLxyvPCLQ==",
+ "dev": true,
+ "requires": {
+ "dom5": "1.3.6",
+ "es6-promise": "2.3.0",
+ "hydrolysis": "1.25.0",
+ "nopt": "3.0.6",
+ "path-posix": "1.0.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "0.0.31",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-0.0.31.tgz",
+ "integrity": "sha1-6Cekk6RDsVbhtYKi5MO9wAQPLuc=",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.107"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.107",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.107.tgz",
+ "integrity": "sha512-iuJWRFHqU0tFLCYH6cfBZzMxThAAsNK31FZxoq+fKIDOSZk1p+3IhNWfEdvPJfsQXcTq8z+57s8xjQlrDAB0Gw==",
+ "dev": true
+ }
+ }
+ },
+ "chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
+ "requires": {
+ "assertion-error": "1.1.0"
+ }
+ },
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+ "dev": true
+ },
+ "dom5": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-1.3.6.tgz",
+ "integrity": "sha1-pwiKn8XzsI3J9u2kx6uuskGUXg0=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "4.2.23",
+ "@types/parse5": "0.0.31",
+ "clone": "1.0.4",
+ "parse5": "1.5.1"
+ }
+ },
+ "parse5": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
+ "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=",
+ "dev": true
+ }
+ }
+ },
+ "wct-browser-legacy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wct-browser-legacy/-/wct-browser-legacy-1.0.0.tgz",
+ "integrity": "sha512-eWbVuY0OdLOPZMXAQMEjhbs1xn7WR6IgKfueMWE8CKdTAoXAfquQ+7rQRuXVSBN2l21YG8MP+U36XqLaTvkRHg==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12",
+ "@polymer/sinonjs": "1.17.1",
+ "@polymer/test-fixture": "3.0.0-pre.12",
+ "@webcomponents/webcomponentsjs": "1.2.0",
+ "accessibility-developer-tools": "2.12.0",
+ "async": "1.5.2",
+ "chai": "3.5.0",
+ "lodash": "3.10.1",
+ "mocha": "3.5.3",
+ "sinon": "1.17.7",
+ "sinon-chai": "2.14.0",
+ "stacky": "1.3.1"
+ },
+ "dependencies": {
+ "@webcomponents/webcomponentsjs": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-1.2.0.tgz",
+ "integrity": "sha512-P9JWydfpBR+CK12UwtBaoD/lYF3PR9XBArAWk5J9nfPaJwA3OUox4StZmyFSVDLsvpFq5HsEtxU/OdHAlAWPnw==",
+ "dev": true
+ },
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ },
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true
+ }
+ }
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "whatwg-url": {
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.1.tgz",
+ "integrity": "sha512-FwygsxsXx27x6XXuExA/ox3Ktwcbf+OAvrKmLulotDAiO1Q6ixchPFaHYsis2zZBZSJTR0+dR+JVtf7MlbqZjw==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "which": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
+ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
+ "dev": true
+ },
+ "widest-line": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz",
+ "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=",
+ "dev": true,
+ "requires": {
+ "string-width": "2.1.1"
+ }
+ },
+ "winston": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.2.tgz",
+ "integrity": "sha512-4S/Ad4ZfSNl8OccCLxnJmNISWcm2joa6Q0YGDxlxMzH0fgSwWsjMt+SmlNwCqdpaPg3ev1HKkMBsIiXeSUwpbA==",
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "write": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+ "dev": true,
+ "requires": {
+ "mkdirp": "0.5.1"
+ }
+ },
+ "write-file-atomic": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
+ "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "imurmurhash": "0.1.4",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "xdg-basedir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
+ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
+ "dev": true
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
+ },
+ "yargs": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
+ "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
+ "dev": true,
+ "requires": {
+ "camelcase": "3.0.0",
+ "cliui": "3.2.0",
+ "decamelize": "1.2.0",
+ "get-caller-file": "1.0.2",
+ "os-locale": "1.4.0",
+ "read-pkg-up": "1.0.1",
+ "require-directory": "2.1.1",
+ "require-main-filename": "1.0.1",
+ "set-blocking": "2.0.0",
+ "string-width": "1.0.2",
+ "which-module": "1.0.0",
+ "y18n": "3.2.1",
+ "yargs-parser": "5.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
+ "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
+ "dev": true,
+ "requires": {
+ "camelcase": "3.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+ "dev": true
+ }
+ }
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/package.json b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/package.json
new file mode 100644
index 00000000000..8c52e47cc82
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/package.json
@@ -0,0 +1,68 @@
+{
+ "name": "@polymer/polymer",
+ "version": "3.0.2",
+ "description": "The Polymer library makes it easy to create your own web components. Give your element some markup and properties, and then use it on a site. Polymer provides features like dynamic templates and data binding to reduce the amount of boilerplate you need to write",
+ "main": "polymer-element.js",
+ "directories": {
+ "doc": "docs",
+ "test": "test"
+ },
+ "devDependencies": {
+ "@polymer/gen-closure-declarations": "^0.4.0",
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "@polymer/iron-component-page": "^3.0.0-pre.12",
+ "@polymer/test-fixture": "^3.0.0-pre.12",
+ "@webcomponents/webcomponentsjs": "^2.0.0",
+ "babel-eslint": "^7.2.3",
+ "babel-preset-minify": "^0.2.0",
+ "del": "^3.0.0",
+ "dom5": "^3.0.0",
+ "eslint-plugin-html": "^4.0.1",
+ "fs-extra": "^5.0.0",
+ "google-closure-compiler": "^20180204.0.0",
+ "gulp": "^4.0.0",
+ "gulp-babel": "^6.1.2",
+ "gulp-eslint": "^4.0.0",
+ "gulp-if": "^2.0.1",
+ "gulp-replace": "^0.6.1",
+ "gulp-size": "^3.0.0",
+ "gulp-vulcanize": "^7.0.0",
+ "lazypipe": "^1.0.1",
+ "merge-stream": "^1.0.1",
+ "parse5": "^4.0.0",
+ "polymer-build": "^2.1.1",
+ "polymer-cli": "^1.7.0",
+ "run-sequence": "^2.2.0",
+ "through2": "^2.0.0",
+ "wct-browser-legacy": "^1.0.0"
+ },
+ "scripts": {
+ "build": "gulp",
+ "test": "npm run lint && polymer test --npm --module-resolution=node",
+ "serve": "polymer serve --npm --module-resolution=node",
+ "lint": "gulp lint",
+ "update-types": "gulp update-types"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/Polymer/polymer.git"
+ },
+ "author": "The Polymer Project Authors",
+ "license": "BSD-3-Clause",
+ "bugs": {
+ "url": "https://github.com/Polymer/polymer/issues"
+ },
+ "homepage": "https://github.com/Polymer/polymer",
+ "publishConfig": {
+ "access": "public"
+ },
+ "resolutions": {
+ "inherits": "2.0.3",
+ "samsam": "1.1.3",
+ "supports-color": "3.1.2",
+ "type-detect": "1.0.0"
+ },
+ "dependencies": {
+ "@webcomponents/shadycss": "^1.2.0"
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/polymer-element.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/polymer-element.js
new file mode 100644
index 00000000000..7188e01b739
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/polymer-element.js
@@ -0,0 +1,30 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+import { ElementMixin } from './lib/mixins/element-mixin.js';
+export { html } from './lib/utils/html-tag.js';
+
+/**
+ * Base class that provides the core API for Polymer's meta-programming
+ * features including template stamping, data-binding, attribute deserialization,
+ * and property change observation.
+ *
+ * @customElement
+ * @polymer
+ * @constructor
+ * @implements {Polymer_ElementMixin}
+ * @extends HTMLElement
+ * @appliesMixin ElementMixin
+ * @summary Custom element base class that provides the core API for Polymer's
+ * key meta-programming features including template stamping, data-binding,
+ * attribute deserialization, and property change observation
+ */
+export const PolymerElement = ElementMixin(HTMLElement);
+
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/polymer-legacy.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/polymer-legacy.js
new file mode 100644
index 00000000000..ffdd35e08e6
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/polymer-legacy.js
@@ -0,0 +1,27 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+import { LegacyElementMixin } from './lib/legacy/legacy-element-mixin.js';
+export { Polymer } from './lib/legacy/polymer-fn.js';
+/* template elements */
+import './lib/legacy/templatizer-behavior.js';
+import './lib/elements/dom-bind.js';
+import './lib/elements/dom-repeat.js';
+import './lib/elements/dom-if.js';
+import './lib/elements/array-selector.js';
+/* custom-style */
+import './lib/elements/custom-style.js';
+/* bc behaviors */
+import './lib/legacy/mutable-data-behavior.js';
+/* import html-tag to export html */
+export { html } from './lib/utils/html-tag.js';
+
+// bc
+export const Base = LegacyElementMixin(HTMLElement).prototype;
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/util/.eslintrc.json b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/util/.eslintrc.json
new file mode 100644
index 00000000000..10d22388378
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/util/.eslintrc.json
@@ -0,0 +1,5 @@
+{
+ "env": {
+ "node": true
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/util/gen-changelog.sh b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/util/gen-changelog.sh
new file mode 100755
index 00000000000..dcfb7fbeb5d
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/util/gen-changelog.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+#
+# @license
+# Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+# This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+# The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+# The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+# Code distributed by Google as part of the polymer project is also
+# subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+#
+
+PRETTY="- %s ([commit](https://github.com/Polymer/polymer/commit/%h))%n"
+start="$1"
+end="$2"
+
+enddate=`git log -1 ${end} --pretty="%ai" | cut -d ' ' -f 1`
+
+old=""
+if [ -e CHANGELOG.md ]; then
+ old="`sed -e '1,2d' CHANGELOG.md`"
+fi
+
+cat > CHANGELOG.md <<EOD
+# Change Log
+
+## [${end}](https://github.com/Polymer/polymer/tree/${end}) (${enddate})
+`git log --no-merges "${start}".."${end}^1" --pretty="${PRETTY}"`
+
+${old}
+EOD
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/util/minimalDocument.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/util/minimalDocument.js
new file mode 100644
index 00000000000..b40256e6bcc
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/util/minimalDocument.js
@@ -0,0 +1,72 @@
+/**
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+const dom5 = require('dom5');
+const parse5 = require('parse5');
+const {Transform} = require('stream');
+
+const p = dom5.predicates;
+
+function onlyOneLicense(doc) {
+ let comments = dom5.nodeWalkAll(doc, dom5.isCommentNode);
+ let hasLicense = false;
+ for (let i = 0; i < comments.length; i++) {
+ let c = comments[i];
+ let text = dom5.getTextContent(c);
+ if (text.indexOf('@license') === -1 || hasLicense) {
+ dom5.remove(c);
+ } else {
+ hasLicense = true;
+ }
+ }
+}
+
+const blankRx = /^\s+$/;
+
+const isBlankNode = p.AND(dom5.isTextNode, (t) => blankRx.test(dom5.getTextContent(t)));
+
+class MinimalDocTransform extends Transform {
+ constructor() {
+ super({objectMode: true});
+ }
+ _transform(file, enc, cb) {
+ let doc = parse5.parse(String(file.contents), {locationInfo: true});
+ let vulc = dom5.query(doc, p.AND(p.hasTagName('div'), p.hasAttr('by-polymer-bundler'), p.hasAttr('hidden')));
+ let charset = dom5.query(doc, p.AND(p.hasTagName('meta'), p.hasAttrValue('charset', 'UTF-8')));
+
+ if (charset) {
+ dom5.remove(charset);
+ }
+
+ dom5.removeNodeSaveChildren(vulc);
+
+ let scripts = dom5.queryAll(doc, p.hasTagName('script'));
+ let collector = scripts[0];
+ let contents = [dom5.getTextContent(collector)];
+ for (let i = 1, s; i < scripts.length; i++) {
+ s = scripts[i];
+ dom5.remove(s);
+ contents.push(dom5.getTextContent(s));
+ }
+ dom5.setTextContent(collector, contents.join(''));
+
+ onlyOneLicense(doc);
+
+ dom5.removeFakeRootElements(doc);
+
+ dom5.nodeWalkAll(doc, isBlankNode).forEach((t) => dom5.remove(t));
+
+ file.contents = new Buffer(parse5.serialize(doc));
+
+ cb(null, file);
+ }
+}
+
+module.exports = () => new MinimalDocTransform();
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/util/travis-sauce-test.sh b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/util/travis-sauce-test.sh
new file mode 100755
index 00000000000..c2f80dd32b2
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/util/travis-sauce-test.sh
@@ -0,0 +1,12 @@
+#!/usr/bin/env bash
+#
+# @license
+# Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
+# This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+# The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+# The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+# Code distributed by Google as part of the polymer project is also
+# subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+#
+set -x
+node ./node_modules/.bin/polymer test --npm --module-resolution=node -s 'windows 10/microsoftedge@15' -s 'windows 10/microsoftedge@17' -s 'windows 8.1/internet explorer@11' -s 'os x 10.11/safari@9' -s 'macos 10.12/safari@10' -s 'macos 10.13/safari@11' -s 'Linux/chrome@41' \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/wct.conf.json b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/wct.conf.json
new file mode 100644
index 00000000000..5b315d73625
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/wct.conf.json
@@ -0,0 +1,20 @@
+{
+ "suites": ["test/runner.html"],
+ "environmentImports": [
+ "test-fixture/test-fixture.html"
+ ],
+ "plugins": {
+ "local": {
+ "browserOptions": {
+ "chrome": [
+ "headless",
+ "disable-gpu",
+ "no-sandbox"
+ ],
+ "firefox": [
+ "-headless"
+ ]
+ }
+ }
+ }
+}
diff --git a/chromium/third_party/catapult/third_party/six/CHANGES b/chromium/third_party/catapult/third_party/six/CHANGES
index 6e9df6dec55..f3bf6a4a7f9 100644
--- a/chromium/third_party/catapult/third_party/six/CHANGES
+++ b/chromium/third_party/catapult/third_party/six/CHANGES
@@ -3,6 +3,76 @@ Changelog for six
This file lists the changes in each six version.
+1.16.0
+------
+
+- Pull request #343, issue #341, pull request #349: Port _SixMetaPathImporter to
+ Python 3.10.
+
+1.15.0
+------
+
+- Pull request #331: Optimize `six.ensure_str` and `six.ensure_binary`.
+
+1.14.0
+------
+
+- Issue #288, pull request #289: Add `six.assertNotRegex`.
+
+- Issue #317: `six.moves._dummy_thread` now points to the `_thread` module on
+ Python 3.9+. Python 3.7 and later requires threading and deprecated the
+ `_dummy_thread` module.
+
+- Issue #308, pull request #314: Remove support for Python 2.6 and Python 3.2.
+
+- Issue #250, issue #165, pull request #251: `six.wraps` now ignores missing
+ attributes. This follows the Python 3.2+ standard library behavior.
+
+1.13.0
+------
+
+- Issue #298, pull request #299: Add `six.moves.dbm_ndbm`.
+
+- Issue #155: Add `six.moves.collections_abc`, which aliases the `collections`
+ module on Python 2-3.2 and the `collections.abc` on Python 3.3 and greater.
+
+- Pull request #304: Re-add distutils fallback in `setup.py`.
+
+- Pull request #305: On Python 3.7, `with_metaclass` supports classes using PEP
+ 560 features.
+
+1.12.0
+------
+
+- Issue #259, pull request #260: `six.add_metaclass` now preserves
+ `__qualname__` from the original class.
+
+- Pull request #204: Add `six.ensure_binary`, `six.ensure_text`, and
+ `six.ensure_str`.
+
+1.11.0
+------
+
+- Pull request #178: `with_metaclass` now properly proxies `__prepare__` to the
+ underlying metaclass.
+
+- Pull request #191: Allow `with_metaclass` to work with metaclasses implemented
+ in C.
+
+- Pull request #203: Add parse_http_list and parse_keqv_list to moved
+ urllib.request.
+
+- Pull request #172 and issue #171: Add unquote_to_bytes to moved urllib.parse.
+
+- Pull request #167: Add `six.moves.getoutput`.
+
+- Pull request #80: Add `six.moves.urllib_parse.splitvalue`.
+
+- Pull request #75: Add `six.moves.email_mime_image`.
+
+- Pull request #72: Avoid creating reference cycles through tracebacks in
+ `reraise`.
+
1.10.0
------
@@ -36,7 +106,7 @@ This file lists the changes in each six version.
- Issue #98: Fix `six.moves` race condition in multi-threaded code.
-- Pull request #51: Add `six.view(keys|values|itmes)`, which provide dictionary
+- Pull request #51: Add `six.view(keys|values|items)`, which provide dictionary
views on Python 2.7+.
- Issue #112: `six.moves.reload_module` now uses the importlib module on
@@ -163,7 +233,7 @@ This file lists the changes in each six version.
- Issue #40: Add import mapping for the Python 2 gdbm module.
- Issue #35: On Python versions less than 2.7, print_ now encodes unicode
- strings when outputing to standard streams. (Python 2.7 handles this
+ strings when outputting to standard streams. (Python 2.7 handles this
automatically.)
1.4.1
diff --git a/chromium/third_party/catapult/third_party/six/LICENSE b/chromium/third_party/catapult/third_party/six/LICENSE
index e558f9d494a..de6633112c1 100644
--- a/chromium/third_party/catapult/third_party/six/LICENSE
+++ b/chromium/third_party/catapult/third_party/six/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2010-2015 Benjamin Peterson
+Copyright (c) 2010-2020 Benjamin Peterson
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
diff --git a/chromium/third_party/catapult/third_party/six/PKG-INFO b/chromium/third_party/catapult/third_party/six/PKG-INFO
new file mode 100644
index 00000000000..1e57620bb60
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/six/PKG-INFO
@@ -0,0 +1,47 @@
+Metadata-Version: 1.2
+Name: six
+Version: 1.16.0
+Summary: Python 2 and 3 compatibility utilities
+Home-page: https://github.com/benjaminp/six
+Author: Benjamin Peterson
+Author-email: benjamin@python.org
+License: MIT
+Description: .. image:: https://img.shields.io/pypi/v/six.svg
+ :target: https://pypi.org/project/six/
+ :alt: six on PyPI
+
+ .. image:: https://travis-ci.org/benjaminp/six.svg?branch=master
+ :target: https://travis-ci.org/benjaminp/six
+ :alt: six on TravisCI
+
+ .. image:: https://readthedocs.org/projects/six/badge/?version=latest
+ :target: https://six.readthedocs.io/
+ :alt: six's documentation on Read the Docs
+
+ .. image:: https://img.shields.io/badge/license-MIT-green.svg
+ :target: https://github.com/benjaminp/six/blob/master/LICENSE
+ :alt: MIT License badge
+
+ Six is a Python 2 and 3 compatibility library. It provides utility functions
+ for smoothing over the differences between the Python versions with the goal of
+ writing Python code that is compatible on both Python versions. See the
+ documentation for more information on what is provided.
+
+ Six supports Python 2.7 and 3.3+. It is contained in only one Python
+ file, so it can be easily copied into your project. (The copyright and license
+ notice must be retained.)
+
+ Online documentation is at https://six.readthedocs.io/.
+
+ Bugs can be reported to https://github.com/benjaminp/six. The code can also
+ be found there.
+
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 3
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Topic :: Software Development :: Libraries
+Classifier: Topic :: Utilities
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*
diff --git a/chromium/third_party/catapult/third_party/six/README b/chromium/third_party/catapult/third_party/six/README
index ee628a9db6b..560a773d9e1 100644
--- a/chromium/third_party/catapult/third_party/six/README
+++ b/chromium/third_party/catapult/third_party/six/README
@@ -1,16 +1,7 @@
-Six is a Python 2 and 3 compatibility library. It provides utility functions
-for smoothing over the differences between the Python versions with the goal of
-writing Python code that is compatible on both Python versions. See the
-documentation for more information on what is provided.
+Six is a Python 2 and 3 compatibility library. It provides utility functions for smoothing over the differences between the Python versions with the goal of writing Python code that is compatible on both Python versions. See the documentation for more information on what is provided.
-Six supports every Python version since 2.6. It is contained in only one Python
-file, so it can be easily copied into your project. (The copyright and license
-notice must be retained.)
+Six supports Python 2.7 and 3.3+. It is contained in only one Python file, so it can be easily copied into your project. (The copyright and license notice must be retained.)
-Online documentation is at https://pythonhosted.org/six/.
+Online documentation is at https://six.readthedocs.io/.
-Bugs can be reported to https://bitbucket.org/gutworth/six. The code can also
-be found there.
-
-For questions about six or porting in general, email the python-porting mailing
-list: https://mail.python.org/mailman/listinfo/python-porting
+Bugs can be reported to https://github.com/benjaminp/six. The code can also be found there. \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/six/README.chromium b/chromium/third_party/catapult/third_party/six/README.chromium
index 4606beb343f..64c83be5e31 100644
--- a/chromium/third_party/catapult/third_party/six/README.chromium
+++ b/chromium/third_party/catapult/third_party/six/README.chromium
@@ -1,7 +1,7 @@
Name: six
-URL: https://bitbucket.org/gutworth/six/
-Version: 1991f8b5b654f077e773f05695a08e0506b7367f
-Date: 2016-01-13
+URL: https://pypi.org/project/six/
+Version: 1.16.0
+Date: 2021-05-05
License: MIT
License File: LICENSE
Security Critical: no
diff --git a/chromium/third_party/catapult/third_party/six/README.rst b/chromium/third_party/catapult/third_party/six/README.rst
new file mode 100644
index 00000000000..6339ba5d932
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/six/README.rst
@@ -0,0 +1,29 @@
+.. image:: https://img.shields.io/pypi/v/six.svg
+ :target: https://pypi.org/project/six/
+ :alt: six on PyPI
+
+.. image:: https://travis-ci.org/benjaminp/six.svg?branch=master
+ :target: https://travis-ci.org/benjaminp/six
+ :alt: six on TravisCI
+
+.. image:: https://readthedocs.org/projects/six/badge/?version=latest
+ :target: https://six.readthedocs.io/
+ :alt: six's documentation on Read the Docs
+
+.. image:: https://img.shields.io/badge/license-MIT-green.svg
+ :target: https://github.com/benjaminp/six/blob/master/LICENSE
+ :alt: MIT License badge
+
+Six is a Python 2 and 3 compatibility library. It provides utility functions
+for smoothing over the differences between the Python versions with the goal of
+writing Python code that is compatible on both Python versions. See the
+documentation for more information on what is provided.
+
+Six supports Python 2.7 and 3.3+. It is contained in only one Python
+file, so it can be easily copied into your project. (The copyright and license
+notice must be retained.)
+
+Online documentation is at https://six.readthedocs.io/.
+
+Bugs can be reported to https://github.com/benjaminp/six. The code can also
+be found there.
diff --git a/chromium/third_party/catapult/third_party/six/documentation/conf.py b/chromium/third_party/catapult/third_party/six/documentation/conf.py
index 0215bdd4059..2f0f3238ae8 100644
--- a/chromium/third_party/catapult/third_party/six/documentation/conf.py
+++ b/chromium/third_party/catapult/third_party/six/documentation/conf.py
@@ -33,7 +33,7 @@ master_doc = "index"
# General information about the project.
project = u"six"
-copyright = u"2010-2015, Benjamin Peterson"
+copyright = u"2010-2020, Benjamin Peterson"
sys.path.append(os.path.abspath(os.path.join(".", "..")))
from six import __version__ as six_version
diff --git a/chromium/third_party/catapult/third_party/six/documentation/index.rst b/chromium/third_party/catapult/third_party/six/documentation/index.rst
index 1391bacde94..45390b81b13 100644
--- a/chromium/third_party/catapult/third_party/six/documentation/index.rst
+++ b/chromium/third_party/catapult/third_party/six/documentation/index.rst
@@ -13,8 +13,8 @@ Python 3. It is intended to support codebases that work on both Python 2 and 3
without modification. six consists of only one Python file, so it is painless
to copy into a project.
-Six can be downloaded on `PyPi <http://pypi.python.org/pypi/six/>`_. Its bug
-tracker and code hosting is on `BitBucket <http://bitbucket.org/gutworth/six>`_.
+Six can be downloaded on `PyPI <https://pypi.org/project/six/>`_. Its bug
+tracker and code hosting is on `GitHub <https://github.com/benjaminp/six>`_.
The name, "six", comes from the fact that 2*3 equals 6. Why not addition?
Multiplication is more powerful, and, anyway, "five" has already been snatched
@@ -50,8 +50,9 @@ Six provides constants that may differ between Python versions. Ones ending
.. data:: class_types
- Possible class types. In Python 2, this encompasses old-style and new-style
- classes. In Python 3, this is just new-styles.
+ Possible class types. In Python 2, this encompasses old-style
+ :data:`py2:types.ClassType` and new-style ``type`` classes. In Python 3,
+ this is just ``type``.
.. data:: integer_types
@@ -75,7 +76,9 @@ Six provides constants that may differ between Python versions. Ones ending
.. data:: binary_type
Type for representing binary data. This is :func:`py2:str` in Python 2 and
- :func:`py3:bytes` in Python 3.
+ :func:`py3:bytes` in Python 3. Python 2.6 and 2.7 include ``bytes`` as a
+ builtin alias of ``str``, so six’s version is only necessary for Python 2.5
+ compatibility.
.. data:: MAXSIZE
@@ -104,7 +107,7 @@ Here's example usage of the module::
Object model compatibility
>>>>>>>>>>>>>>>>>>>>>>>>>>
-Python 3 renamed the attributes of several intepreter data structures. The
+Python 3 renamed the attributes of several interpreter data structures. The
following accessors are available. Note that the recommended way to inspect
functions and methods is the stdlib :mod:`py3:inspect` module.
@@ -164,7 +167,9 @@ functions and methods is the stdlib :mod:`py3:inspect` module.
Get the next item of iterator *it*. :exc:`py3:StopIteration` is raised if
the iterator is exhausted. This is a replacement for calling ``it.next()``
- in Python 2 and ``next(it)`` in Python 3.
+ in Python 2 and ``next(it)`` in Python 3. Python 2.6 and above have a
+ builtin ``next`` function, so six's version is only necessary for Python 2.5
+ compatibility.
.. function:: callable(obj)
@@ -252,9 +257,10 @@ functions and methods is the stdlib :mod:`py3:inspect` module.
.. decorator:: wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, updated=functools.WRAPPER_UPDATES)
- This is exactly the :func:`py3:functools.wraps` decorator, but it sets the
- ``__wrapped__`` attribute on what it decorates as :func:`py3:functools.wraps`
- does on Python versions after 3.2.
+ This is Python 3.2's :func:`py3:functools.wraps` decorator. It sets the
+ ``__wrapped__`` attribute on what it decorates. It doesn't raise an error if
+ any of the attributes mentioned in ``assigned`` and ``updated`` are missing
+ on ``wrapped`` object.
Syntax compatibility
@@ -345,7 +351,7 @@ Python 2 and 3.
on Python 3 or ::
class MyClass(object):
- __metaclass__ = MyMeta
+ __metaclass__ = Meta
on Python 2.
@@ -361,7 +367,7 @@ Binary and text data
>>>>>>>>>>>>>>>>>>>>
Python 3 enforces the distinction between byte strings and text strings far more
-rigoriously than Python 2 does; binary data cannot be automatically coerced to
+rigorously than Python 2 does; binary data cannot be automatically coerced to
or from text data. six provides several functions to assist in classifying
string data in all Python versions.
@@ -369,14 +375,14 @@ string data in all Python versions.
.. function:: b(data)
A "fake" bytes literal. *data* should always be a normal string literal. In
- Python 2, :func:`b` returns a 8-bit string. In Python 3, *data* is encoded
+ Python 2, :func:`b` returns an 8-bit string. In Python 3, *data* is encoded
with the latin-1 encoding to bytes.
.. note::
Since all Python versions 2.6 and after support the ``b`` prefix,
- :func:`b`, code without 2.5 support doesn't need :func:`b`.
+ code without 2.5 support doesn't need :func:`b`.
.. function:: u(text)
@@ -431,9 +437,27 @@ string data in all Python versions.
a bytes object iterator in Python 3.
+.. function:: ensure_binary(s, encoding='utf-8', errors='strict')
+
+ Coerce *s* to :data:`binary_type`. *encoding*, *errors* are the same as
+ :meth:`py3:str.encode`
+
+
+.. function:: ensure_str(s, encoding='utf-8', errors='strict')
+
+ Coerce *s* to ``str``. *encoding*, *errors* are the same as
+ :meth:`py3:str.encode`
+
+
+.. function:: ensure_text(s, encoding='utf-8', errors='strict')
+
+ Coerce *s* to :data:`text_type`. *encoding*, *errors* are the same as
+ :meth:`py3:bytes.decode`
+
+
.. data:: StringIO
- This is an fake file object for textual data. It's an alias for
+ This is a fake file object for textual data. It's an alias for
:class:`py2:StringIO.StringIO` in Python 2 and :class:`py3:io.StringIO` in
Python 3.
@@ -486,6 +510,11 @@ Note these functions are only available on Python 2.7 or later.
Alias for :meth:`~py3:unittest.TestCase.assertRegex` on Python 3 and
:meth:`~py2:unittest.TestCase.assertRegexpMatches` on Python 2.
+.. function:: assertNotRegex()
+
+ Alias for :meth:`~py3:unittest.TestCase.assertNotRegex` on Python 3 and
+ :meth:`~py2:unittest.TestCase.assertNotRegexpMatches` on Python 2.
+
Renamed modules and attributes compatibility
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
@@ -501,7 +530,7 @@ Python 2 or 3, write::
from six.moves import html_parser
Similarly, to get the function to reload modules, which was moved from the
-builtin module to the ``imp`` module, use::
+builtin module to the ``importlib`` module, use::
from six.moves import reload_module
@@ -509,7 +538,7 @@ For the most part, :mod:`six.moves` aliases are the names of the modules in
Python 3. When the new Python 3 name is a package, the components of the name
are separated by underscores. For example, ``html.parser`` becomes
``html_parser``. In some cases where several modules have been combined, the
-Python 2 name is retained. This is so the appropiate modules can be found when
+Python 2 name is retained. This is so the appropriate modules can be found when
running on Python 2. For example, ``BaseHTTPServer`` which is in
``http.server`` in Python 3 is aliased as ``BaseHTTPServer``.
@@ -530,14 +559,14 @@ functionality; its structure mimics the structure of the Python 3
from six.moves.cPickle import loads
- work, six places special proxy objects in in :data:`py3:sys.modules`. These
+ work, six places special proxy objects in :data:`py3:sys.modules`. These
proxies lazily load the underlying module when an attribute is fetched. This
will fail if the underlying module is not available in the Python
interpreter. For example, ``sys.modules["six.moves.winreg"].LoadKey`` would
fail on any non-Windows platform. Unfortunately, some applications try to
load attributes on every module in :data:`py3:sys.modules`. six mitigates
this problem for some applications by pretending attributes on unimportable
- modules don't exist. This hack doesn't work in every case, though. If you are
+ modules do not exist. This hack does not work in every case, though. If you are
encountering problems with the lazy modules and don't use any from imports
directly from ``six.moves`` modules, you can workaround the issue by removing
the six proxy modules::
@@ -548,139 +577,148 @@ functionality; its structure mimics the structure of the Python 3
Supported renames:
-+------------------------------+-------------------------------------+-------------------------------------+
-| Name | Python 2 name | Python 3 name |
-+==============================+=====================================+=====================================+
-| ``builtins`` | :mod:`py2:__builtin__` | :mod:`py3:builtins` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``configparser`` | :mod:`py2:ConfigParser` | :mod:`py3:configparser` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``copyreg`` | :mod:`py2:copy_reg` | :mod:`py3:copyreg` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``cPickle`` | :mod:`py2:cPickle` | :mod:`py3:pickle` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``cStringIO`` | :func:`py2:cStringIO.StringIO` | :class:`py3:io.StringIO` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``dbm_gnu`` | :func:`py2:gdbm` | :class:`py3:dbm.gnu` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``_dummy_thread`` | :mod:`py2:dummy_thread` | :mod:`py3:_dummy_thread` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``email_mime_multipart`` | :mod:`py2:email.MIMEMultipart` | :mod:`py3:email.mime.multipart` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``email_mime_nonmultipart`` | :mod:`py2:email.MIMENonMultipart` | :mod:`py3:email.mime.nonmultipart` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``email_mime_text`` | :mod:`py2:email.MIMEText` | :mod:`py3:email.mime.text` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``email_mime_base`` | :mod:`py2:email.MIMEBase` | :mod:`py3:email.mime.base` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``filter`` | :func:`py2:itertools.ifilter` | :func:`py3:filter` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``filterfalse`` | :func:`py2:itertools.ifilterfalse` | :func:`py3:itertools.filterfalse` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``getcwd`` | :func:`py2:os.getcwdu` | :func:`py3:os.getcwd` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``getcwdb`` | :func:`py2:os.getcwd` | :func:`py3:os.getcwdb` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``http_cookiejar`` | :mod:`py2:cookielib` | :mod:`py3:http.cookiejar` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``http_cookies`` | :mod:`py2:Cookie` | :mod:`py3:http.cookies` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``html_entities`` | :mod:`py2:htmlentitydefs` | :mod:`py3:html.entities` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``html_parser`` | :mod:`py2:HTMLParser` | :mod:`py3:html.parser` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``http_client`` | :mod:`py2:httplib` | :mod:`py3:http.client` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``BaseHTTPServer`` | :mod:`py2:BaseHTTPServer` | :mod:`py3:http.server` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``CGIHTTPServer`` | :mod:`py2:CGIHTTPServer` | :mod:`py3:http.server` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``SimpleHTTPServer`` | :mod:`py2:SimpleHTTPServer` | :mod:`py3:http.server` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``input`` | :func:`py2:raw_input` | :func:`py3:input` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``intern`` | :func:`py2:intern` | :func:`py3:sys.intern` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``map`` | :func:`py2:itertools.imap` | :func:`py3:map` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``queue`` | :mod:`py2:Queue` | :mod:`py3:queue` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``range`` | :func:`py2:xrange` | :func:`py3:range` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``reduce`` | :func:`py2:reduce` | :func:`py3:functools.reduce` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``reload_module`` | :func:`py2:reload` | :func:`py3:imp.reload`, |
-| | | :func:`py3:importlib.reload` |
-| | | on Python 3.4+ |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``reprlib`` | :mod:`py2:repr` | :mod:`py3:reprlib` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``shlex_quote`` | :mod:`py2:pipes.quote` | :mod:`py3:shlex.quote` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``socketserver`` | :mod:`py2:SocketServer` | :mod:`py3:socketserver` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``_thread`` | :mod:`py2:thread` | :mod:`py3:_thread` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``tkinter`` | :mod:`py2:Tkinter` | :mod:`py3:tkinter` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``tkinter_dialog`` | :mod:`py2:Dialog` | :mod:`py3:tkinter.dialog` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``tkinter_filedialog`` | :mod:`py2:FileDialog` | :mod:`py3:tkinter.FileDialog` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``tkinter_scrolledtext`` | :mod:`py2:ScrolledText` | :mod:`py3:tkinter.scrolledtext` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``tkinter_simpledialog`` | :mod:`py2:SimpleDialog` | :mod:`py3:tkinter.simpledialog` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``tkinter_ttk`` | :mod:`py2:ttk` | :mod:`py3:tkinter.ttk` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``tkinter_tix`` | :mod:`py2:Tix` | :mod:`py3:tkinter.tix` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``tkinter_constants`` | :mod:`py2:Tkconstants` | :mod:`py3:tkinter.constants` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``tkinter_dnd`` | :mod:`py2:Tkdnd` | :mod:`py3:tkinter.dnd` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``tkinter_colorchooser`` | :mod:`py2:tkColorChooser` | :mod:`py3:tkinter.colorchooser` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``tkinter_commondialog`` | :mod:`py2:tkCommonDialog` | :mod:`py3:tkinter.commondialog` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``tkinter_tkfiledialog`` | :mod:`py2:tkFileDialog` | :mod:`py3:tkinter.filedialog` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``tkinter_font`` | :mod:`py2:tkFont` | :mod:`py3:tkinter.font` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``tkinter_messagebox`` | :mod:`py2:tkMessageBox` | :mod:`py3:tkinter.messagebox` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``tkinter_tksimpledialog`` | :mod:`py2:tkSimpleDialog` | :mod:`py3:tkinter.simpledialog` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``urllib.parse`` | See :mod:`six.moves.urllib.parse` | :mod:`py3:urllib.parse` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``urllib.error`` | See :mod:`six.moves.urllib.error` | :mod:`py3:urllib.error` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``urllib.request`` | See :mod:`six.moves.urllib.request` | :mod:`py3:urllib.request` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``urllib.response`` | See :mod:`six.moves.urllib.response`| :mod:`py3:urllib.response` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``urllib.robotparser`` | :mod:`py2:robotparser` | :mod:`py3:urllib.robotparser` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``urllib_robotparser`` | :mod:`py2:robotparser` | :mod:`py3:urllib.robotparser` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``UserDict`` | :class:`py2:UserDict.UserDict` | :class:`py3:collections.UserDict` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``UserList`` | :class:`py2:UserList.UserList` | :class:`py3:collections.UserList` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``UserString`` | :class:`py2:UserString.UserString` | :class:`py3:collections.UserString` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``winreg`` | :mod:`py2:_winreg` | :mod:`py3:winreg` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``xmlrpc_client`` | :mod:`py2:xmlrpclib` | :mod:`py3:xmlrpc.client` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``xmlrpc_server`` | :mod:`py2:SimpleXMLRPCServer` | :mod:`py3:xmlrpc.server` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``xrange`` | :func:`py2:xrange` | :func:`py3:range` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``zip`` | :func:`py2:itertools.izip` | :func:`py3:zip` |
-+------------------------------+-------------------------------------+-------------------------------------+
-| ``zip_longest`` | :func:`py2:itertools.izip_longest` | :func:`py3:itertools.zip_longest` |
-+------------------------------+-------------------------------------+-------------------------------------+
++------------------------------+-------------------------------------+---------------------------------------+
+| Name | Python 2 name | Python 3 name |
++==============================+=====================================+=======================================+
+| ``builtins`` | :mod:`py2:__builtin__` | :mod:`py3:builtins` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``configparser`` | :mod:`py2:ConfigParser` | :mod:`py3:configparser` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``copyreg`` | :mod:`py2:copy_reg` | :mod:`py3:copyreg` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``cPickle`` | :mod:`py2:cPickle` | :mod:`py3:pickle` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``cStringIO`` | :func:`py2:cStringIO.StringIO` | :class:`py3:io.StringIO` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``collections_abc`` | :mod:`py2:collections` | :mod:`py3:collections.abc` (3.3+) |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``dbm_gnu`` | :mod:`py2:gdbm` | :mod:`py3:dbm.gnu` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``dbm_ndbm`` | :mod:`py2:dbm` | :mod:`py3:dbm.ndbm` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``_dummy_thread`` | :mod:`py2:dummy_thread` | :mod:`py3:_dummy_thread` (< 3.9) |
+| | | :mod:`py3:_thread` (3.9+) |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``email_mime_base`` | :mod:`py2:email.MIMEBase` | :mod:`py3:email.mime.base` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``email_mime_image`` | :mod:`py2:email.MIMEImage` | :mod:`py3:email.mime.image` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``email_mime_multipart`` | :mod:`py2:email.MIMEMultipart` | :mod:`py3:email.mime.multipart` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``email_mime_nonmultipart`` | :mod:`py2:email.MIMENonMultipart` | :mod:`py3:email.mime.nonmultipart` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``email_mime_text`` | :mod:`py2:email.MIMEText` | :mod:`py3:email.mime.text` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``filter`` | :func:`py2:itertools.ifilter` | :func:`py3:filter` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``filterfalse`` | :func:`py2:itertools.ifilterfalse` | :func:`py3:itertools.filterfalse` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``getcwd`` | :func:`py2:os.getcwdu` | :func:`py3:os.getcwd` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``getcwdb`` | :func:`py2:os.getcwd` | :func:`py3:os.getcwdb` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``getoutput`` | :func:`py2:commands.getoutput` | :func:`py3:subprocess.getoutput` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``http_cookiejar`` | :mod:`py2:cookielib` | :mod:`py3:http.cookiejar` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``http_cookies`` | :mod:`py2:Cookie` | :mod:`py3:http.cookies` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``html_entities`` | :mod:`py2:htmlentitydefs` | :mod:`py3:html.entities` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``html_parser`` | :mod:`py2:HTMLParser` | :mod:`py3:html.parser` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``http_client`` | :mod:`py2:httplib` | :mod:`py3:http.client` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``BaseHTTPServer`` | :mod:`py2:BaseHTTPServer` | :mod:`py3:http.server` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``CGIHTTPServer`` | :mod:`py2:CGIHTTPServer` | :mod:`py3:http.server` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``SimpleHTTPServer`` | :mod:`py2:SimpleHTTPServer` | :mod:`py3:http.server` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``input`` | :func:`py2:raw_input` | :func:`py3:input` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``intern`` | :func:`py2:intern` | :func:`py3:sys.intern` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``map`` | :func:`py2:itertools.imap` | :func:`py3:map` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``queue`` | :mod:`py2:Queue` | :mod:`py3:queue` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``range`` | :func:`py2:xrange` | :func:`py3:range` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``reduce`` | :func:`py2:reduce` | :func:`py3:functools.reduce` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``reload_module`` | :func:`py2:reload` | :func:`py3:imp.reload`, |
+| | | :func:`py3:importlib.reload` |
+| | | on Python 3.4+ |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``reprlib`` | :mod:`py2:repr` | :mod:`py3:reprlib` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``shlex_quote`` | :mod:`py2:pipes.quote` | :mod:`py3:shlex.quote` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``socketserver`` | :mod:`py2:SocketServer` | :mod:`py3:socketserver` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``_thread`` | :mod:`py2:thread` | :mod:`py3:_thread` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``tkinter`` | :mod:`py2:Tkinter` | :mod:`py3:tkinter` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``tkinter_dialog`` | :mod:`py2:Dialog` | :mod:`py3:tkinter.dialog` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``tkinter_filedialog`` | :mod:`py2:FileDialog` | :mod:`py3:tkinter.FileDialog` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``tkinter_scrolledtext`` | :mod:`py2:ScrolledText` | :mod:`py3:tkinter.scrolledtext` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``tkinter_simpledialog`` | :mod:`py2:SimpleDialog` | :mod:`py3:tkinter.simpledialog` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``tkinter_ttk`` | :mod:`py2:ttk` | :mod:`py3:tkinter.ttk` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``tkinter_tix`` | :mod:`py2:Tix` | :mod:`py3:tkinter.tix` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``tkinter_constants`` | :mod:`py2:Tkconstants` | :mod:`py3:tkinter.constants` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``tkinter_dnd`` | :mod:`py2:Tkdnd` | :mod:`py3:tkinter.dnd` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``tkinter_colorchooser`` | :mod:`py2:tkColorChooser` | :mod:`py3:tkinter.colorchooser` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``tkinter_commondialog`` | :mod:`py2:tkCommonDialog` | :mod:`py3:tkinter.commondialog` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``tkinter_tkfiledialog`` | :mod:`py2:tkFileDialog` | :mod:`py3:tkinter.filedialog` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``tkinter_font`` | :mod:`py2:tkFont` | :mod:`py3:tkinter.font` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``tkinter_messagebox`` | :mod:`py2:tkMessageBox` | :mod:`py3:tkinter.messagebox` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``tkinter_tksimpledialog`` | :mod:`py2:tkSimpleDialog` | :mod:`py3:tkinter.simpledialog` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``urllib.parse`` | See :mod:`six.moves.urllib.parse` | :mod:`py3:urllib.parse` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``urllib.error`` | See :mod:`six.moves.urllib.error` | :mod:`py3:urllib.error` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``urllib.request`` | See :mod:`six.moves.urllib.request` | :mod:`py3:urllib.request` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``urllib.response`` | See :mod:`six.moves.urllib.response`| :mod:`py3:urllib.response` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``urllib.robotparser`` | :mod:`py2:robotparser` | :mod:`py3:urllib.robotparser` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``urllib_robotparser`` | :mod:`py2:robotparser` | :mod:`py3:urllib.robotparser` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``UserDict`` | :class:`py2:UserDict.UserDict` | :class:`py3:collections.UserDict` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``UserList`` | :class:`py2:UserList.UserList` | :class:`py3:collections.UserList` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``UserString`` | :class:`py2:UserString.UserString` | :class:`py3:collections.UserString` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``winreg`` | :mod:`py2:_winreg` | :mod:`py3:winreg` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``xmlrpc_client`` | :mod:`py2:xmlrpclib` | :mod:`py3:xmlrpc.client` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``xmlrpc_server`` | :mod:`py2:SimpleXMLRPCServer` | :mod:`py3:xmlrpc.server` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``xrange`` | :func:`py2:xrange` | :func:`py3:range` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``zip`` | :func:`py2:itertools.izip` | :func:`py3:zip` |
++------------------------------+-------------------------------------+---------------------------------------+
+| ``zip_longest`` | :func:`py2:itertools.izip_longest` | :func:`py3:itertools.zip_longest` |
++------------------------------+-------------------------------------+---------------------------------------+
urllib parse
<<<<<<<<<<<<
@@ -715,7 +753,8 @@ and :mod:`py2:urllib`:
* :func:`py2:urllib.quote_plus`
* :func:`py2:urllib.splittag`
* :func:`py2:urllib.splituser`
-* :func:`py2:urllib.unquote`
+* :func:`py2:urllib.splitvalue`
+* :func:`py2:urllib.unquote` (also exposed as :func:`py3:urllib.parse.unquote_to_bytes`)
* :func:`py2:urllib.unquote_plus`
* :func:`py2:urllib.urlencode`
@@ -762,6 +801,8 @@ and :mod:`py2:urllib2`:
* :func:`py2:urllib2.urlopen`
* :func:`py2:urllib2.install_opener`
* :func:`py2:urllib2.build_opener`
+* :func:`py2:urllib2.parse_http_list`
+* :func:`py2:urllib2.parse_keqv_list`
* :class:`py2:urllib2.Request`
* :class:`py2:urllib2.OpenerDirector`
* :class:`py2:urllib2.HTTPDefaultErrorHandler`
diff --git a/chromium/third_party/catapult/third_party/six/setup.cfg b/chromium/third_party/catapult/third_party/six/setup.cfg
index 4a5b8473d03..fb1f5367a48 100644
--- a/chromium/third_party/catapult/third_party/six/setup.cfg
+++ b/chromium/third_party/catapult/third_party/six/setup.cfg
@@ -1,18 +1,24 @@
-[wheel]
+[bdist_wheel]
universal = 1
[flake8]
max-line-length = 100
ignore = F821
-[pytest]
-minversion=2.2.0
-pep8ignore =
- documentation/*.py ALL
- test_six.py ALL
+[metadata]
+license_file = LICENSE
-flakes-ignore =
- documentation/*.py ALL
- test_six.py ALL
- six.py UndefinedName
+[tool:pytest]
+minversion = 2.2.0
+pep8ignore =
+ documentation/*.py ALL
+ test_six.py ALL
+flakes-ignore =
+ documentation/*.py ALL
+ test_six.py ALL
+ six.py UndefinedName
+
+[egg_info]
+tag_build =
+tag_date = 0
diff --git a/chromium/third_party/catapult/third_party/six/setup.py b/chromium/third_party/catapult/third_party/six/setup.py
index 31d4625cf4c..d90958b69d3 100644
--- a/chromium/third_party/catapult/third_party/six/setup.py
+++ b/chromium/third_party/catapult/third_party/six/setup.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2010-2015 Benjamin Peterson
+# Copyright (c) 2010-2020 Benjamin Peterson
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -20,6 +20,9 @@
from __future__ import with_statement
+# Six is a dependency of setuptools, so using setuptools creates a
+# circular dependency when building a Python stack from source. We
+# therefore allow falling back to distutils to install six.
try:
from setuptools import setup
except ImportError:
@@ -28,6 +31,7 @@ except ImportError:
import six
six_classifiers = [
+ "Development Status :: 5 - Production/Stable",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
"Intended Audience :: Developers",
@@ -36,17 +40,19 @@ six_classifiers = [
"Topic :: Utilities",
]
-with open("README", "r") as fp:
+with open("README.rst", "r") as fp:
six_long_description = fp.read()
setup(name="six",
version=six.__version__,
author="Benjamin Peterson",
author_email="benjamin@python.org",
- url="http://pypi.python.org/pypi/six/",
+ url="https://github.com/benjaminp/six",
+ tests_require=["pytest"],
py_modules=["six"],
description="Python 2 and 3 compatibility utilities",
long_description=six_long_description,
license="MIT",
- classifiers=six_classifiers
+ classifiers=six_classifiers,
+ python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*",
)
diff --git a/chromium/third_party/catapult/third_party/six/six.egg-info/PKG-INFO b/chromium/third_party/catapult/third_party/six/six.egg-info/PKG-INFO
new file mode 100644
index 00000000000..1e57620bb60
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/six/six.egg-info/PKG-INFO
@@ -0,0 +1,47 @@
+Metadata-Version: 1.2
+Name: six
+Version: 1.16.0
+Summary: Python 2 and 3 compatibility utilities
+Home-page: https://github.com/benjaminp/six
+Author: Benjamin Peterson
+Author-email: benjamin@python.org
+License: MIT
+Description: .. image:: https://img.shields.io/pypi/v/six.svg
+ :target: https://pypi.org/project/six/
+ :alt: six on PyPI
+
+ .. image:: https://travis-ci.org/benjaminp/six.svg?branch=master
+ :target: https://travis-ci.org/benjaminp/six
+ :alt: six on TravisCI
+
+ .. image:: https://readthedocs.org/projects/six/badge/?version=latest
+ :target: https://six.readthedocs.io/
+ :alt: six's documentation on Read the Docs
+
+ .. image:: https://img.shields.io/badge/license-MIT-green.svg
+ :target: https://github.com/benjaminp/six/blob/master/LICENSE
+ :alt: MIT License badge
+
+ Six is a Python 2 and 3 compatibility library. It provides utility functions
+ for smoothing over the differences between the Python versions with the goal of
+ writing Python code that is compatible on both Python versions. See the
+ documentation for more information on what is provided.
+
+ Six supports Python 2.7 and 3.3+. It is contained in only one Python
+ file, so it can be easily copied into your project. (The copyright and license
+ notice must be retained.)
+
+ Online documentation is at https://six.readthedocs.io/.
+
+ Bugs can be reported to https://github.com/benjaminp/six. The code can also
+ be found there.
+
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 3
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Topic :: Software Development :: Libraries
+Classifier: Topic :: Utilities
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*
diff --git a/chromium/third_party/catapult/third_party/six/six.egg-info/SOURCES.txt b/chromium/third_party/catapult/third_party/six/six.egg-info/SOURCES.txt
new file mode 100644
index 00000000000..9a7f3dec6df
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/six/six.egg-info/SOURCES.txt
@@ -0,0 +1,15 @@
+CHANGES
+LICENSE
+MANIFEST.in
+README.rst
+setup.cfg
+setup.py
+six.py
+test_six.py
+documentation/Makefile
+documentation/conf.py
+documentation/index.rst
+six.egg-info/PKG-INFO
+six.egg-info/SOURCES.txt
+six.egg-info/dependency_links.txt
+six.egg-info/top_level.txt \ No newline at end of file
diff --git a/chromium/third_party/catapult/third_party/six/six.egg-info/dependency_links.txt b/chromium/third_party/catapult/third_party/six/six.egg-info/dependency_links.txt
new file mode 100644
index 00000000000..8b137891791
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/six/six.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/chromium/third_party/catapult/third_party/six/six.egg-info/top_level.txt b/chromium/third_party/catapult/third_party/six/six.egg-info/top_level.txt
new file mode 100644
index 00000000000..ffe2fce4989
--- /dev/null
+++ b/chromium/third_party/catapult/third_party/six/six.egg-info/top_level.txt
@@ -0,0 +1 @@
+six
diff --git a/chromium/third_party/catapult/third_party/six/six.py b/chromium/third_party/catapult/third_party/six/six.py
index 336e8a1cbb8..4e15675d8b5 100644
--- a/chromium/third_party/catapult/third_party/six/six.py
+++ b/chromium/third_party/catapult/third_party/six/six.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2010-2015 Benjamin Peterson
+# Copyright (c) 2010-2020 Benjamin Peterson
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -29,11 +29,7 @@ import sys
import types
__author__ = "Benjamin Peterson <benjamin@python.org>"
-__version__ = "1.10.0"
-
-
-# pylint: disable-all
-# pylint: skip-file
+__version__ = "1.16.0"
# Useful for very coarse version differentiation.
@@ -75,6 +71,11 @@ else:
MAXSIZE = int((1 << 63) - 1)
del X
+if PY34:
+ from importlib.util import spec_from_loader
+else:
+ spec_from_loader = None
+
def _add_doc(func, doc):
"""Add documentation to a function."""
@@ -190,6 +191,11 @@ class _SixMetaPathImporter(object):
return self
return None
+ def find_spec(self, fullname, path, target=None):
+ if fullname in self.known_modules:
+ return spec_from_loader(fullname, self)
+ return None
+
def __get_module(self, fullname):
try:
return self.known_modules[fullname]
@@ -227,6 +233,12 @@ class _SixMetaPathImporter(object):
return None
get_source = get_code # same as get_code
+ def create_module(self, spec):
+ return self.load_module(spec.name)
+
+ def exec_module(self, module):
+ pass
+
_importer = _SixMetaPathImporter(__name__)
@@ -245,6 +257,7 @@ _moved_attributes = [
MovedAttribute("map", "itertools", "builtins", "imap", "map"),
MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
+ MovedAttribute("getoutput", "commands", "subprocess"),
MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"),
MovedAttribute("reduce", "__builtin__", "functools"),
@@ -258,18 +271,21 @@ _moved_attributes = [
MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
MovedModule("builtins", "__builtin__"),
MovedModule("configparser", "ConfigParser"),
+ MovedModule("collections_abc", "collections", "collections.abc" if sys.version_info >= (3, 3) else "collections"),
MovedModule("copyreg", "copy_reg"),
MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
- MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
+ MovedModule("dbm_ndbm", "dbm", "dbm.ndbm"),
+ MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread" if sys.version_info < (3, 9) else "_thread"),
MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
MovedModule("http_cookies", "Cookie", "http.cookies"),
MovedModule("html_entities", "htmlentitydefs", "html.entities"),
MovedModule("html_parser", "HTMLParser", "html.parser"),
MovedModule("http_client", "httplib", "http.client"),
+ MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
+ MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"),
MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
- MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
@@ -341,10 +357,12 @@ _urllib_parse_moved_attributes = [
MovedAttribute("quote_plus", "urllib", "urllib.parse"),
MovedAttribute("unquote", "urllib", "urllib.parse"),
MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
+ MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"),
MovedAttribute("urlencode", "urllib", "urllib.parse"),
MovedAttribute("splitquery", "urllib", "urllib.parse"),
MovedAttribute("splittag", "urllib", "urllib.parse"),
MovedAttribute("splituser", "urllib", "urllib.parse"),
+ MovedAttribute("splitvalue", "urllib", "urllib.parse"),
MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
MovedAttribute("uses_params", "urlparse", "urllib.parse"),
@@ -420,6 +438,8 @@ _urllib_request_moved_attributes = [
MovedAttribute("URLopener", "urllib", "urllib.request"),
MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
+ MovedAttribute("parse_http_list", "urllib2", "urllib.request"),
+ MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"),
]
for attr in _urllib_request_moved_attributes:
setattr(Module_six_moves_urllib_request, attr.name, attr)
@@ -635,13 +655,16 @@ if PY3:
import io
StringIO = io.StringIO
BytesIO = io.BytesIO
+ del io
_assertCountEqual = "assertCountEqual"
if sys.version_info[1] <= 1:
_assertRaisesRegex = "assertRaisesRegexp"
_assertRegex = "assertRegexpMatches"
+ _assertNotRegex = "assertNotRegexpMatches"
else:
_assertRaisesRegex = "assertRaisesRegex"
_assertRegex = "assertRegex"
+ _assertNotRegex = "assertNotRegex"
else:
def b(s):
return s
@@ -663,6 +686,7 @@ else:
_assertCountEqual = "assertItemsEqual"
_assertRaisesRegex = "assertRaisesRegexp"
_assertRegex = "assertRegexpMatches"
+ _assertNotRegex = "assertNotRegexpMatches"
_add_doc(b, """Byte literal""")
_add_doc(u, """Text literal""")
@@ -679,15 +703,23 @@ def assertRegex(self, *args, **kwargs):
return getattr(self, _assertRegex)(*args, **kwargs)
+def assertNotRegex(self, *args, **kwargs):
+ return getattr(self, _assertNotRegex)(*args, **kwargs)
+
+
if PY3:
exec_ = getattr(moves.builtins, "exec")
def reraise(tp, value, tb=None):
- if value is None:
- value = tp()
- if value.__traceback__ is not tb:
- raise value.with_traceback(tb)
- raise value
+ try:
+ if value is None:
+ value = tp()
+ if value.__traceback__ is not tb:
+ raise value.with_traceback(tb)
+ raise value
+ finally:
+ value = None
+ tb = None
else:
def exec_(_code_, _globs_=None, _locs_=None):
@@ -703,19 +735,19 @@ else:
exec("""exec _code_ in _globs_, _locs_""")
exec_("""def reraise(tp, value, tb=None):
- raise tp, value, tb
+ try:
+ raise tp, value, tb
+ finally:
+ tb = None
""")
-if sys.version_info[:2] == (3, 2):
+if sys.version_info[:2] > (3,):
exec_("""def raise_from(value, from_value):
- if from_value is None:
- raise value
- raise value from from_value
-""")
-elif sys.version_info[:2] > (3, 2):
- exec_("""def raise_from(value, from_value):
- raise value from from_value
+ try:
+ raise value from from_value
+ finally:
+ value = None
""")
else:
def raise_from(value, from_value):
@@ -790,13 +822,33 @@ if sys.version_info[:2] < (3, 3):
_add_doc(reraise, """Reraise an exception.""")
if sys.version_info[0:2] < (3, 4):
+ # This does exactly the same what the :func:`py3:functools.update_wrapper`
+ # function does on Python versions after 3.2. It sets the ``__wrapped__``
+ # attribute on ``wrapper`` object and it doesn't raise an error if any of
+ # the attributes mentioned in ``assigned`` and ``updated`` are missing on
+ # ``wrapped`` object.
+ def _update_wrapper(wrapper, wrapped,
+ assigned=functools.WRAPPER_ASSIGNMENTS,
+ updated=functools.WRAPPER_UPDATES):
+ for attr in assigned:
+ try:
+ value = getattr(wrapped, attr)
+ except AttributeError:
+ continue
+ else:
+ setattr(wrapper, attr, value)
+ for attr in updated:
+ getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
+ wrapper.__wrapped__ = wrapped
+ return wrapper
+ _update_wrapper.__doc__ = functools.update_wrapper.__doc__
+
def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
updated=functools.WRAPPER_UPDATES):
- def wrapper(f):
- f = functools.wraps(wrapped, assigned, updated)(f)
- f.__wrapped__ = wrapped
- return f
- return wrapper
+ return functools.partial(_update_wrapper, wrapped=wrapped,
+ assigned=assigned, updated=updated)
+ wraps.__doc__ = functools.wraps.__doc__
+
else:
wraps = functools.wraps
@@ -806,10 +858,22 @@ def with_metaclass(meta, *bases):
# This requires a bit of explanation: the basic idea is to make a dummy
# metaclass for one level of class instantiation that replaces itself with
# the actual metaclass.
- class metaclass(meta):
+ class metaclass(type):
def __new__(cls, name, this_bases, d):
- return meta(name, bases, d)
+ if sys.version_info[:2] >= (3, 7):
+ # This version introduced PEP 560 that requires a bit
+ # of extra care (we mimic what is done by __build_class__).
+ resolved_bases = types.resolve_bases(bases)
+ if resolved_bases is not bases:
+ d['__orig_bases__'] = bases
+ else:
+ resolved_bases = bases
+ return meta(name, resolved_bases, d)
+
+ @classmethod
+ def __prepare__(cls, name, this_bases):
+ return meta.__prepare__(name, bases)
return type.__new__(metaclass, 'temporary_class', (), {})
@@ -825,13 +889,75 @@ def add_metaclass(metaclass):
orig_vars.pop(slots_var)
orig_vars.pop('__dict__', None)
orig_vars.pop('__weakref__', None)
+ if hasattr(cls, '__qualname__'):
+ orig_vars['__qualname__'] = cls.__qualname__
return metaclass(cls.__name__, cls.__bases__, orig_vars)
return wrapper
+def ensure_binary(s, encoding='utf-8', errors='strict'):
+ """Coerce **s** to six.binary_type.
+
+ For Python 2:
+ - `unicode` -> encoded to `str`
+ - `str` -> `str`
+
+ For Python 3:
+ - `str` -> encoded to `bytes`
+ - `bytes` -> `bytes`
+ """
+ if isinstance(s, binary_type):
+ return s
+ if isinstance(s, text_type):
+ return s.encode(encoding, errors)
+ raise TypeError("not expecting type '%s'" % type(s))
+
+
+def ensure_str(s, encoding='utf-8', errors='strict'):
+ """Coerce *s* to `str`.
+
+ For Python 2:
+ - `unicode` -> encoded to `str`
+ - `str` -> `str`
+
+ For Python 3:
+ - `str` -> `str`
+ - `bytes` -> decoded to `str`
+ """
+ # Optimization: Fast return for the common case.
+ if type(s) is str:
+ return s
+ if PY2 and isinstance(s, text_type):
+ return s.encode(encoding, errors)
+ elif PY3 and isinstance(s, binary_type):
+ return s.decode(encoding, errors)
+ elif not isinstance(s, (text_type, binary_type)):
+ raise TypeError("not expecting type '%s'" % type(s))
+ return s
+
+
+def ensure_text(s, encoding='utf-8', errors='strict'):
+ """Coerce *s* to six.text_type.
+
+ For Python 2:
+ - `unicode` -> `unicode`
+ - `str` -> `unicode`
+
+ For Python 3:
+ - `str` -> `str`
+ - `bytes` -> decoded to `str`
+ """
+ if isinstance(s, binary_type):
+ return s.decode(encoding, errors)
+ elif isinstance(s, text_type):
+ return s
+ else:
+ raise TypeError("not expecting type '%s'" % type(s))
+
+
def python_2_unicode_compatible(klass):
"""
- A decorator that defines __unicode__ and __str__ methods under Python 2.
+ A class decorator that defines __unicode__ and __str__ methods under Python 2.
Under Python 3 it does nothing.
To support Python 2 and 3 with a single code base, define a __str__ method
diff --git a/chromium/third_party/catapult/third_party/six/test_six.py b/chromium/third_party/catapult/third_party/six/test_six.py
index b68e0069d05..7b8b03b5e61 100644
--- a/chromium/third_party/catapult/third_party/six/test_six.py
+++ b/chromium/third_party/catapult/third_party/six/test_six.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2010-2015 Benjamin Peterson
+# Copyright (c) 2010-2020 Benjamin Peterson
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -22,8 +22,9 @@ import operator
import sys
import types
import unittest
+import abc
-import py
+import pytest
import six
@@ -80,7 +81,7 @@ def test_MAXSIZE():
except AttributeError:
# Before Python 2.6.
pass
- py.test.raises(
+ pytest.raises(
(ValueError, OverflowError),
operator.mul, [None], six.MAXSIZE + 1)
@@ -112,7 +113,7 @@ except ImportError:
except ImportError:
have_gdbm = False
-@py.test.mark.parametrize("item_name",
+@pytest.mark.parametrize("item_name",
[item.name for item in six._moved_attributes])
def test_move_items(item_name):
"""Ensure that everything loads correctly."""
@@ -120,70 +121,55 @@ def test_move_items(item_name):
item = getattr(six.moves, item_name)
if isinstance(item, types.ModuleType):
__import__("six.moves." + item_name)
- except AttributeError:
- if item_name == "zip_longest" and sys.version_info < (2, 6):
- py.test.skip("zip_longest only available on 2.6+")
except ImportError:
if item_name == "winreg" and not sys.platform.startswith("win"):
- py.test.skip("Windows only module")
+ pytest.skip("Windows only module")
if item_name.startswith("tkinter"):
if not have_tkinter:
- py.test.skip("requires tkinter")
- if item_name == "tkinter_ttk" and sys.version_info[:2] <= (2, 6):
- py.test.skip("ttk only available on 2.7+")
+ pytest.skip("requires tkinter")
if item_name.startswith("dbm_gnu") and not have_gdbm:
- py.test.skip("requires gdbm")
+ pytest.skip("requires gdbm")
raise
- if sys.version_info[:2] >= (2, 6):
- assert item_name in dir(six.moves)
+ assert item_name in dir(six.moves)
-@py.test.mark.parametrize("item_name",
+@pytest.mark.parametrize("item_name",
[item.name for item in six._urllib_parse_moved_attributes])
def test_move_items_urllib_parse(item_name):
"""Ensure that everything loads correctly."""
- if item_name == "ParseResult" and sys.version_info < (2, 5):
- py.test.skip("ParseResult is only found on 2.5+")
- if item_name in ("parse_qs", "parse_qsl") and sys.version_info < (2, 6):
- py.test.skip("parse_qs[l] is new in 2.6")
- if sys.version_info[:2] >= (2, 6):
- assert item_name in dir(six.moves.urllib.parse)
+ assert item_name in dir(six.moves.urllib.parse)
getattr(six.moves.urllib.parse, item_name)
-@py.test.mark.parametrize("item_name",
+@pytest.mark.parametrize("item_name",
[item.name for item in six._urllib_error_moved_attributes])
def test_move_items_urllib_error(item_name):
"""Ensure that everything loads correctly."""
- if sys.version_info[:2] >= (2, 6):
- assert item_name in dir(six.moves.urllib.error)
+ assert item_name in dir(six.moves.urllib.error)
getattr(six.moves.urllib.error, item_name)
-@py.test.mark.parametrize("item_name",
+@pytest.mark.parametrize("item_name",
[item.name for item in six._urllib_request_moved_attributes])
def test_move_items_urllib_request(item_name):
"""Ensure that everything loads correctly."""
- if sys.version_info[:2] >= (2, 6):
- assert item_name in dir(six.moves.urllib.request)
+ assert item_name in dir(six.moves.urllib.request)
getattr(six.moves.urllib.request, item_name)
-@py.test.mark.parametrize("item_name",
+@pytest.mark.parametrize("item_name",
[item.name for item in six._urllib_response_moved_attributes])
def test_move_items_urllib_response(item_name):
"""Ensure that everything loads correctly."""
- if sys.version_info[:2] >= (2, 6):
- assert item_name in dir(six.moves.urllib.response)
+ assert item_name in dir(six.moves.urllib.response)
getattr(six.moves.urllib.response, item_name)
-@py.test.mark.parametrize("item_name",
+@pytest.mark.parametrize("item_name",
[item.name for item in six._urllib_robotparser_moved_attributes])
def test_move_items_urllib_robotparser(item_name):
"""Ensure that everything loads correctly."""
- if sys.version_info[:2] >= (2, 6):
- assert item_name in dir(six.moves.urllib.robotparser)
+ assert item_name in dir(six.moves.urllib.robotparser)
getattr(six.moves.urllib.robotparser, item_name)
@@ -232,12 +218,17 @@ def test_map():
assert six.advance_iterator(map(lambda x: x + 1, range(2))) == 1
+def test_getoutput():
+ from six.moves import getoutput
+ output = getoutput('echo "foo"')
+ assert output == 'foo'
+
+
def test_zip():
from six.moves import zip
assert six.advance_iterator(zip(range(2), range(2))) == (0, 0)
-@py.test.mark.skipif("sys.version_info < (2, 6)")
def test_zip_longest():
from six.moves import zip_longest
it = zip_longest(range(2), range(1))
@@ -315,7 +306,7 @@ class TestCustomizedMoves:
def test_empty_remove(self):
- py.test.raises(AttributeError, six.remove_move, "eggs")
+ pytest.raises(AttributeError, six.remove_move, "eggs")
def test_get_unbound_function():
@@ -331,7 +322,7 @@ def test_get_method_self():
pass
x = X()
assert six.get_method_self(x.m) is x
- py.test.raises(AttributeError, six.get_method_self, 42)
+ pytest.raises(AttributeError, six.get_method_self, 42)
def test_get_method_function():
@@ -340,7 +331,7 @@ def test_get_method_function():
pass
x = X()
assert six.get_method_function(x.m) is X.__dict__["m"]
- py.test.raises(AttributeError, six.get_method_function, hasattr)
+ pytest.raises(AttributeError, six.get_method_function, hasattr)
def test_get_function_closure():
@@ -358,7 +349,7 @@ def test_get_function_code():
pass
assert isinstance(six.get_function_code(f), types.CodeType)
if not hasattr(sys, "pypy_version_info"):
- py.test.raises(AttributeError, six.get_function_code, hasattr)
+ pytest.raises(AttributeError, six.get_function_code, hasattr)
def test_get_function_defaults():
@@ -398,7 +389,7 @@ def test_dictionary_iterators(monkeypatch):
it = meth(d)
assert not isinstance(it, list)
assert list(it) == list(getattr(d, name)())
- py.test.raises(StopIteration, six.advance_iterator, it)
+ pytest.raises(StopIteration, six.advance_iterator, it)
record = []
def with_kw(*args, **kw):
record.append(kw["kw"])
@@ -410,17 +401,7 @@ def test_dictionary_iterators(monkeypatch):
monkeypatch.undo()
-@py.test.mark.skipif("sys.version_info[:2] < (2, 7)",
- reason="view methods on dictionaries only available on 2.7+")
def test_dictionary_views():
- def stock_method_name(viewwhat):
- """Given a method suffix like "keys" or "values", return the name
- of the dict method that delivers those on the version of Python
- we're running in."""
- if six.PY3:
- return viewwhat
- return 'view' + viewwhat
-
d = dict(zip(range(10), (range(11, 20))))
for name in "keys", "values", "items":
meth = getattr(six, "view" + name)
@@ -434,8 +415,8 @@ def test_advance_iterator():
it = iter(l)
assert six.next(it) == 1
assert six.next(it) == 2
- py.test.raises(StopIteration, six.next, it)
- py.test.raises(StopIteration, six.next, it)
+ pytest.raises(StopIteration, six.next, it)
+ pytest.raises(StopIteration, six.next, it)
def test_iterator():
@@ -483,7 +464,7 @@ def test_create_unbound_method():
def f(self):
return self
u = six.create_unbound_method(f, X)
- py.test.raises(TypeError, u)
+ pytest.raises(TypeError, u)
if six.PY2:
assert isinstance(u, types.MethodType)
x = X()
@@ -531,13 +512,13 @@ def test_unichr():
def test_int2byte():
assert six.int2byte(3) == six.b("\x03")
- py.test.raises(Exception, six.int2byte, 256)
+ pytest.raises(Exception, six.int2byte, 256)
def test_byte2int():
assert six.byte2int(six.b("\x03")) == 3
assert six.byte2int(six.b("\x03\x04")) == 3
- py.test.raises(IndexError, six.byte2int, six.b(""))
+ pytest.raises(IndexError, six.byte2int, six.b(""))
def test_bytesindex():
@@ -548,7 +529,7 @@ def test_bytesiter():
it = six.iterbytes(six.b("hi"))
assert six.next(it) == ord("h")
assert six.next(it) == ord("i")
- py.test.raises(StopIteration, six.next, it)
+ pytest.raises(StopIteration, six.next, it)
def test_StringIO():
@@ -637,7 +618,6 @@ def test_raise_from():
# We should have done a raise f from None equivalent.
assert val.__cause__ is None
assert val.__context__ is ctx
- if sys.version_info[:2] >= (3, 3):
# And that should suppress the context on the exception.
assert val.__suppress_context__
# For all versions the outer exception should have raised successfully.
@@ -683,28 +663,10 @@ def test_print_():
assert out.flushed
-@py.test.mark.skipif("sys.version_info[:2] >= (2, 6)")
-def test_print_encoding(monkeypatch):
- # Fool the type checking in print_.
- monkeypatch.setattr(six, "file", six.BytesIO, raising=False)
- out = six.BytesIO()
- out.encoding = "utf-8"
- out.errors = None
- six.print_(six.u("\u053c"), end="", file=out)
- assert out.getvalue() == six.b("\xd4\xbc")
- out = six.BytesIO()
- out.encoding = "ascii"
- out.errors = "strict"
- py.test.raises(UnicodeEncodeError, six.print_, six.u("\u053c"), file=out)
- out.errors = "backslashreplace"
- six.print_(six.u("\u053c"), end="", file=out)
- assert out.getvalue() == six.b("\\u053c")
-
-
def test_print_exceptions():
- py.test.raises(TypeError, six.print_, x=3)
- py.test.raises(TypeError, six.print_, end=3)
- py.test.raises(TypeError, six.print_, sep=42)
+ pytest.raises(TypeError, six.print_, x=3)
+ pytest.raises(TypeError, six.print_, end=3)
+ pytest.raises(TypeError, six.print_, sep=42)
def test_with_metaclass():
@@ -728,6 +690,88 @@ def test_with_metaclass():
assert issubclass(X, Base)
assert issubclass(X, Base2)
assert X.__mro__ == (X, Base, Base2, object)
+ class X(six.with_metaclass(Meta)):
+ pass
+ class MetaSub(Meta):
+ pass
+ class Y(six.with_metaclass(MetaSub, X)):
+ pass
+ assert type(Y) is MetaSub
+ assert Y.__mro__ == (Y, X, object)
+
+
+def test_with_metaclass_typing():
+ try:
+ import typing
+ except ImportError:
+ pytest.skip("typing module required")
+ class Meta(type):
+ pass
+ if sys.version_info[:2] < (3, 7):
+ # Generics with custom metaclasses were broken on older versions.
+ class Meta(Meta, typing.GenericMeta):
+ pass
+ T = typing.TypeVar('T')
+ class G(six.with_metaclass(Meta, typing.Generic[T])):
+ pass
+ class GA(six.with_metaclass(abc.ABCMeta, typing.Generic[T])):
+ pass
+ assert isinstance(G, Meta)
+ assert isinstance(GA, abc.ABCMeta)
+ assert G[int] is not G[G[int]]
+ assert GA[int] is not GA[GA[int]]
+ assert G.__bases__ == (typing.Generic,)
+ assert G.__orig_bases__ == (typing.Generic[T],)
+
+
+@pytest.mark.skipif("sys.version_info[:2] < (3, 7)")
+def test_with_metaclass_pep_560():
+ class Meta(type):
+ pass
+ class A:
+ pass
+ class B:
+ pass
+ class Fake:
+ def __mro_entries__(self, bases):
+ return (A, B)
+ fake = Fake()
+ class G(six.with_metaclass(Meta, fake)):
+ pass
+ class GA(six.with_metaclass(abc.ABCMeta, fake)):
+ pass
+ assert isinstance(G, Meta)
+ assert isinstance(GA, abc.ABCMeta)
+ assert G.__bases__ == (A, B)
+ assert G.__orig_bases__ == (fake,)
+
+
+@pytest.mark.skipif("sys.version_info[:2] < (3, 0)")
+def test_with_metaclass_prepare():
+ """Test that with_metaclass causes Meta.__prepare__ to be called with the correct arguments."""
+
+ class MyDict(dict):
+ pass
+
+ class Meta(type):
+
+ @classmethod
+ def __prepare__(cls, name, bases):
+ namespace = MyDict(super().__prepare__(name, bases), cls=cls, bases=bases)
+ namespace['namespace'] = namespace
+ return namespace
+
+ class Base(object):
+ pass
+
+ bases = (Base,)
+
+ class X(six.with_metaclass(Meta, *bases)):
+ pass
+
+ assert getattr(X, 'cls', type) is Meta
+ assert getattr(X, 'bases', ()) == bases
+ assert isinstance(getattr(X, 'namespace', {}), MyDict)
def test_wraps():
@@ -750,14 +794,33 @@ def test_wraps():
def f(g, assign, update):
def w():
return 42
- w.glue = {"foo" : "bar"}
+ w.glue = {"foo": "bar"}
+ w.xyzzy = {"qux": "quux"}
return six.wraps(g, assign, update)(w)
- k.glue = {"melon" : "egg"}
+ k.glue = {"melon": "egg"}
k.turnip = 43
- k = f(k, ["turnip"], ["glue"])
+ k = f(k, ["turnip", "baz"], ["glue", "xyzzy"])
assert k.__name__ == "w"
assert k.turnip == 43
- assert k.glue == {"melon" : "egg", "foo" : "bar"}
+ assert not hasattr(k, "baz")
+ assert k.glue == {"melon": "egg", "foo": "bar"}
+ assert k.xyzzy == {"qux": "quux"}
+
+
+def test_wraps_raises_on_missing_updated_field_on_wrapper():
+ """Ensure six.wraps doesn't ignore missing attrs wrapper.
+
+ Because that's what happens in Py3's functools.update_wrapper.
+ """
+ def wrapped():
+ pass
+
+ def wrapper():
+ pass
+
+ with pytest.raises(AttributeError, match='has no attribute.*xyzzy'):
+ six.wraps(wrapped, [], ['xyzzy'])(wrapper)
+
def test_add_metaclass():
@@ -815,7 +878,7 @@ def test_add_metaclass():
assert MySlots.__slots__ == ["a", "b"]
instance = MySlots()
instance.a = "foo"
- py.test.raises(AttributeError, setattr, instance, "c", "baz")
+ pytest.raises(AttributeError, setattr, instance, "c", "baz")
# Test a class with string for slots.
class MyStringSlots(object):
@@ -824,8 +887,8 @@ def test_add_metaclass():
assert MyStringSlots.__slots__ == "ab"
instance = MyStringSlots()
instance.ab = "foo"
- py.test.raises(AttributeError, setattr, instance, "a", "baz")
- py.test.raises(AttributeError, setattr, instance, "b", "baz")
+ pytest.raises(AttributeError, setattr, instance, "a", "baz")
+ pytest.raises(AttributeError, setattr, instance, "b", "baz")
class MySlotsWeakref(object):
__slots__ = "__weakref__",
@@ -833,7 +896,26 @@ def test_add_metaclass():
assert type(MySlotsWeakref) is Meta
-@py.test.mark.skipif("sys.version_info[:2] < (2, 7) or sys.version_info[:2] in ((3, 0), (3, 1))")
+@pytest.mark.skipif("sys.version_info[:2] < (3, 3)")
+def test_add_metaclass_nested():
+ # Regression test for https://github.com/benjaminp/six/issues/259
+ class Meta(type):
+ pass
+
+ class A:
+ class B: pass
+
+ expected = 'test_add_metaclass_nested.<locals>.A.B'
+
+ assert A.B.__qualname__ == expected
+
+ class A:
+ @six.add_metaclass(Meta)
+ class B: pass
+
+ assert A.B.__qualname__ == expected
+
+
def test_assertCountEqual():
class TestAssertCountEqual(unittest.TestCase):
def test(self):
@@ -845,7 +927,6 @@ def test_assertCountEqual():
TestAssertCountEqual('test').test()
-@py.test.mark.skipif("sys.version_info[:2] < (2, 7)")
def test_assertRegex():
class TestAssertRegex(unittest.TestCase):
def test(self):
@@ -857,7 +938,17 @@ def test_assertRegex():
TestAssertRegex('test').test()
-@py.test.mark.skipif("sys.version_info[:2] < (2, 7)")
+def test_assertNotRegex():
+ class TestAssertNotRegex(unittest.TestCase):
+ def test(self):
+ with self.assertRaises(AssertionError):
+ six.assertNotRegex(self, 'test', r'^t')
+
+ six.assertNotRegex(self, 'test', r'^a')
+
+ TestAssertNotRegex('test').test()
+
+
def test_assertRaisesRegex():
class TestAssertRaisesRegex(unittest.TestCase):
def test(self):
@@ -890,3 +981,61 @@ def test_python_2_unicode_compatible():
assert str(my_test) == six.u("hello")
assert getattr(six.moves.builtins, 'bytes', str)(my_test) == six.b("hello")
+
+
+class EnsureTests:
+
+ # grinning face emoji
+ UNICODE_EMOJI = six.u("\U0001F600")
+ BINARY_EMOJI = b"\xf0\x9f\x98\x80"
+
+ def test_ensure_binary_raise_type_error(self):
+ with pytest.raises(TypeError):
+ six.ensure_str(8)
+
+ def test_errors_and_encoding(self):
+ six.ensure_binary(self.UNICODE_EMOJI, encoding='latin-1', errors='ignore')
+ with pytest.raises(UnicodeEncodeError):
+ six.ensure_binary(self.UNICODE_EMOJI, encoding='latin-1', errors='strict')
+
+ def test_ensure_binary_raise(self):
+ converted_unicode = six.ensure_binary(self.UNICODE_EMOJI, encoding='utf-8', errors='strict')
+ converted_binary = six.ensure_binary(self.BINARY_EMOJI, encoding="utf-8", errors='strict')
+ if six.PY2:
+ # PY2: unicode -> str
+ assert converted_unicode == self.BINARY_EMOJI and isinstance(converted_unicode, str)
+ # PY2: str -> str
+ assert converted_binary == self.BINARY_EMOJI and isinstance(converted_binary, str)
+ else:
+ # PY3: str -> bytes
+ assert converted_unicode == self.BINARY_EMOJI and isinstance(converted_unicode, bytes)
+ # PY3: bytes -> bytes
+ assert converted_binary == self.BINARY_EMOJI and isinstance(converted_binary, bytes)
+
+ def test_ensure_str(self):
+ converted_unicode = six.ensure_str(self.UNICODE_EMOJI, encoding='utf-8', errors='strict')
+ converted_binary = six.ensure_str(self.BINARY_EMOJI, encoding="utf-8", errors='strict')
+ if six.PY2:
+ # PY2: unicode -> str
+ assert converted_unicode == self.BINARY_EMOJI and isinstance(converted_unicode, str)
+ # PY2: str -> str
+ assert converted_binary == self.BINARY_EMOJI and isinstance(converted_binary, str)
+ else:
+ # PY3: str -> str
+ assert converted_unicode == self.UNICODE_EMOJI and isinstance(converted_unicode, str)
+ # PY3: bytes -> str
+ assert converted_binary == self.UNICODE_EMOJI and isinstance(converted_unicode, str)
+
+ def test_ensure_text(self):
+ converted_unicode = six.ensure_text(self.UNICODE_EMOJI, encoding='utf-8', errors='strict')
+ converted_binary = six.ensure_text(self.BINARY_EMOJI, encoding="utf-8", errors='strict')
+ if six.PY2:
+ # PY2: unicode -> unicode
+ assert converted_unicode == self.UNICODE_EMOJI and isinstance(converted_unicode, unicode)
+ # PY2: str -> unicode
+ assert converted_binary == self.UNICODE_EMOJI and isinstance(converted_unicode, unicode)
+ else:
+ # PY3: str -> str
+ assert converted_unicode == self.UNICODE_EMOJI and isinstance(converted_unicode, str)
+ # PY3: bytes -> str
+ assert converted_binary == self.UNICODE_EMOJI and isinstance(converted_unicode, str)
diff --git a/chromium/third_party/catapult/third_party/vinn/BUILD.gn b/chromium/third_party/catapult/third_party/vinn/BUILD.gn
index 8e631748f29..de0217fec5f 100644
--- a/chromium/third_party/catapult/third_party/vinn/BUILD.gn
+++ b/chromium/third_party/catapult/third_party/vinn/BUILD.gn
@@ -33,7 +33,7 @@ group("vinn") {
]
}
- if (is_linux || is_chromeos || is_android) {
+ if (is_linux || is_chromeos || is_android || is_fuchsia) {
data += [ "third_party/v8/linux/x86_64/" ]
}
}
diff --git a/chromium/third_party/catapult/tracing/DIR_METADATA b/chromium/third_party/catapult/tracing/DIR_METADATA
new file mode 100644
index 00000000000..592fce2a9d8
--- /dev/null
+++ b/chromium/third_party/catapult/tracing/DIR_METADATA
@@ -0,0 +1,4 @@
+monorail {
+ component: "Speed>Tracing"
+}
+team_email: "tracing@chromium.org"
diff --git a/chromium/third_party/catapult/tracing/OWNERS b/chromium/third_party/catapult/tracing/OWNERS
index a2cfbf26769..d4c36899e10 100644
--- a/chromium/third_party/catapult/tracing/OWNERS
+++ b/chromium/third_party/catapult/tracing/OWNERS
@@ -1,13 +1,9 @@
-oysteine@chromium.org # Prefers python reviews.
dproy@chromium.org # Prefers javascript reviews.
khokhlov@google.com
-dberris@chromium.org
# For changes related to system_health/loading_metric.html and its tests.
kouhei@chromium.org
-# TEAM: tracing@chromium.org
-# COMPONENT: Speed>Tracing
# These folks have made huge contributions to the project, but are no longer
# actively reviewing patches.
diff --git a/chromium/third_party/catapult/tracing/PRESUBMIT.py b/chromium/third_party/catapult/tracing/PRESUBMIT.py
index 90442392078..676ca4d8ed6 100644
--- a/chromium/third_party/catapult/tracing/PRESUBMIT.py
+++ b/chromium/third_party/catapult/tracing/PRESUBMIT.py
@@ -2,6 +2,10 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+
+USE_PYTHON3 = True
+
+
import sys
def _RunArgs(args, input_api):
@@ -16,7 +20,7 @@ def _CheckRegisteredMetrics(input_api, output_api):
results = []
tracing_dir = input_api.PresubmitLocalPath()
out, return_code = _RunArgs(
- [input_api.python_executable,
+ [sys.executable,
input_api.os_path.join(tracing_dir, 'bin', 'validate_all_metrics')],
input_api)
if return_code:
@@ -30,7 +34,7 @@ def _CheckRegisteredDiagnostics(input_api, output_api):
results = []
tracing_dir = input_api.PresubmitLocalPath()
out, return_code = _RunArgs(
- [input_api.python_executable,
+ [sys.executable,
input_api.os_path.join(tracing_dir, 'bin', 'validate_all_diagnostics')],
input_api)
if return_code:
@@ -61,7 +65,8 @@ def _CheckHistogramProtoIsGated(input_api, output_api):
for f in input_api.AffectedSourceFiles(source_file_filter):
contents = input_api.ReadFile(f)
if ('histogram_pb2' in contents and
- not f.LocalPath().endswith('histogram_proto.py')):
+ not f.LocalPath().endswith('histogram_proto.py') and
+ not f.LocalPath().endswith('PRESUBMIT.py')):
files.append(f)
results = []
@@ -109,7 +114,7 @@ def _CheckChange(input_api, output_api):
original_sys_path = sys.path
try:
sys.path += [input_api.PresubmitLocalPath()]
- from tracing_build import check_gni
+ from tracing_build import check_gni # pylint: disable=import-outside-toplevel
error = check_gni.GniCheck()
if error:
results.append(output_api.PresubmitError(error))
@@ -120,7 +125,7 @@ def _CheckChange(input_api, output_api):
files_to_skip = input_api.DEFAULT_FILES_TO_SKIP + (".*_pb2.py$",)
results += input_api.RunTests(input_api.canned_checks.GetPylint(
input_api, output_api, extra_paths_list=_GetPathsToPrepend(input_api),
- pylintrc='../pylintrc', files_to_skip=files_to_skip))
+ pylintrc='../pylintrc', files_to_skip=files_to_skip, version='2.7'))
results += _CheckRegisteredMetrics(input_api, output_api)
results += _CheckRegisteredDiagnostics(input_api, output_api)
@@ -132,7 +137,7 @@ def _CheckChange(input_api, output_api):
def _GetPathsToPrepend(input_api):
- import tracing_project
+ import tracing_project # pylint: disable=import-outside-toplevel
project_dir = input_api.PresubmitLocalPath()
catapult_dir = input_api.os_path.join(project_dir, '..')
return [
diff --git a/chromium/third_party/catapult/tracing/bin/PRESUBMIT.py b/chromium/third_party/catapult/tracing/bin/PRESUBMIT.py
index 799215d729d..084bf71ec06 100644
--- a/chromium/third_party/catapult/tracing/bin/PRESUBMIT.py
+++ b/chromium/third_party/catapult/tracing/bin/PRESUBMIT.py
@@ -1,6 +1,11 @@
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+
+
+USE_PYTHON3 = True
+
+
import os
def CheckChange(input_api, output_api):
diff --git a/chromium/third_party/catapult/tracing/bin/add_reserved_diagnostics b/chromium/third_party/catapult/tracing/bin/add_reserved_diagnostics
index 988862ed4f7..10c6b352778 100755
--- a/chromium/third_party/catapult/tracing/bin/add_reserved_diagnostics
+++ b/chromium/third_party/catapult/tracing/bin/add_reserved_diagnostics
@@ -3,10 +3,12 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import print_function
import argparse
import json
import sys
import os
+import six
tracing_path = os.path.abspath(os.path.join(
os.path.dirname(os.path.realpath(__file__)), '..'))
@@ -69,7 +71,7 @@ def main():
args = parser.parse_args()
names_to_values = {}
- for name, value in vars(args).iteritems():
+ for name, value in six.iteritems(vars(args)):
if name == LOG_URLS_K and value is not None:
v_value = vars(args)[LOG_URLS_V]
names_to_values[reserved_infos.LOG_URLS.name] = [value, v_value]
@@ -94,16 +96,16 @@ def main():
if args.stdout:
assert len(json_batches) == 1, len(json_batches)
- print json_batches[0]
+ print(json_batches[0])
else:
path = args.output_path or args.input_path
if len(json_batches) == 1:
- with open(path, 'w') as f:
+ with open(path, 'wb') as f:
f.write(json_batches[0])
else:
base, ext = os.path.splitext(path)
for i, hs in enumerate(json_batches):
- with open('%s.%04d%s' % (base, i, ext), 'w') as f:
+ with open('%s.%04d%s' % (base, i, ext), 'wb') as f:
f.write(hs)
return 0
diff --git a/chromium/third_party/catapult/tracing/bin/compare_samples b/chromium/third_party/catapult/tracing/bin/compare_samples
index 0d67a997837..b39a4f053ce 100755
--- a/chromium/third_party/catapult/tracing/bin/compare_samples
+++ b/chromium/third_party/catapult/tracing/bin/compare_samples
@@ -3,6 +3,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import print_function
import argparse
import os
import sys
diff --git a/chromium/third_party/catapult/tracing/bin/histograms2csv b/chromium/third_party/catapult/tracing/bin/histograms2csv
index c36246ec3d2..84c10a8a5da 100755
--- a/chromium/third_party/catapult/tracing/bin/histograms2csv
+++ b/chromium/third_party/catapult/tracing/bin/histograms2csv
@@ -4,8 +4,6 @@
# found in the LICENSE file.
import argparse
-import codecs
-import json
import sys
import os
@@ -33,7 +31,7 @@ def main():
if result.returncode != 0:
sys.stderr.write(result.stdout)
else:
- file(args.csv_path, 'w').write(result.stdout)
+ open(args.csv_path, 'w').write(result.stdout)
return result.returncode
if __name__ == '__main__':
diff --git a/chromium/third_party/catapult/tracing/bin/histograms2html b/chromium/third_party/catapult/tracing/bin/histograms2html
index 454c98d154f..7e73628f064 100755
--- a/chromium/third_party/catapult/tracing/bin/histograms2html
+++ b/chromium/third_party/catapult/tracing/bin/histograms2html
@@ -8,6 +8,7 @@ import codecs
import json
import sys
import os
+import six
tracing_path = os.path.abspath(os.path.join(
os.path.dirname(os.path.realpath(__file__)), '..'))
@@ -42,7 +43,7 @@ def main():
histograms.extend(json.load(open(json_path, 'r')))
for json_path in args.mapresults:
- for filename, results in json.load(open(json_path, 'r')).iteritems():
+ for filename, results in six.iteritems(json.load(open(json_path, 'r'))):
for histogram in results['pairs']['histograms']:
histograms.append(histogram)
diff --git a/chromium/third_party/catapult/tracing/bin/html2trace b/chromium/third_party/catapult/tracing/bin/html2trace
index 82161fb1cfd..85ccff80316 100755
--- a/chromium/third_party/catapult/tracing/bin/html2trace
+++ b/chromium/third_party/catapult/tracing/bin/html2trace
@@ -3,6 +3,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import print_function
import argparse
import codecs
import sys
@@ -46,7 +47,7 @@ def main():
html_file, args.trace_path, gzipped_output)
if not args.quiet:
- print '\n'.join(saved_paths)
+ print('\n'.join(saved_paths))
if __name__ == '__main__':
diff --git a/chromium/third_party/catapult/tracing/bin/memory_infra_remote_dump b/chromium/third_party/catapult/tracing/bin/memory_infra_remote_dump
index 3125e9fe10d..4f821d68529 100755
--- a/chromium/third_party/catapult/tracing/bin/memory_infra_remote_dump
+++ b/chromium/third_party/catapult/tracing/bin/memory_infra_remote_dump
@@ -31,6 +31,7 @@ $ ./third_party/catapult/tracing/bin/memory_infra_remote_dump --port=1234
/var/folders/18/gl6q632j20nc_tw5g9l03dhc007g45/T/trace_20s191.json: 835 KB
"""
+from __future__ import print_function
import argparse
import json
import os
@@ -38,11 +39,12 @@ import requests
import sys
import tempfile
import time
+from six.moves import input
try:
import websocket
except ImportError:
- print 'Please run: pip install --user websocket-client'
+ print('Please run: pip install --user websocket-client')
sys.exit(1)
@@ -50,7 +52,7 @@ class TracingDevtoolsClient(object):
def __init__(self, host, port):
r = requests.get('http://%s:%s/json/version' % (host, port))
url = r.json()['webSocketDebuggerUrl']
- print 'Connecting to ' + url
+ print('Connecting to ' + url)
self.ws = websocket.create_connection(url)
self.cmd = 0
@@ -66,10 +68,10 @@ class TracingDevtoolsClient(object):
return json.loads(self.ws.recv())
def req_memory_dump(self):
- print 'Requesting memory dump...',
+ print('Requesting memory dump...', end=' ')
resp = self.send('Tracing.requestMemoryDump')
assert resp['success'] == True
- print ' ...done'
+ print(' ...done')
def dump(self, trace_fd):
trace_config = {
@@ -77,7 +79,7 @@ class TracingDevtoolsClient(object):
'includedCategories': ['disabled-by-default-memory-infra'],
'memoryDumpConfig': {'triggers': []}
}
- print 'Starting trace with trace_config', trace_config
+ print('Starting trace with trace_config', trace_config)
params = {'traceConfig': trace_config, 'transferMode': 'ReturnAsStream'}
self.send('Tracing.start', params)
self.req_memory_dump()
@@ -85,8 +87,8 @@ class TracingDevtoolsClient(object):
if sys.stdin.isatty():
while True:
try:
- print '[Press enter to trigger a new dump, q to finish the trace]'
- cmd = raw_input()
+ print('[Press enter to trigger a new dump, q to finish the trace]')
+ cmd = input()
except KeyboardInterrupt:
break
if cmd == 'q':
@@ -96,7 +98,7 @@ class TracingDevtoolsClient(object):
self.send('Tracing.end')
# Wait for trace completion
- print 'Flushing trace'
+ print('Flushing trace')
resp = self.recv()
assert resp['method'] == 'Tracing.tracingComplete'
stream_handle = resp['params']['stream']
@@ -128,4 +130,4 @@ if __name__ == '__main__':
cli = TracingDevtoolsClient(args.host, args.port)
cli.dump(trace_fd)
- print '\n%s: %d KB' % (trace_fd.name, os.stat(trace_fd.name).st_size / 1000)
+ print('\n%s: %d KB' % (trace_fd.name, os.stat(trace_fd.name).st_size / 1000))
diff --git a/chromium/third_party/catapult/tracing/bin/merge_histograms b/chromium/third_party/catapult/tracing/bin/merge_histograms
index ebf65d8615c..403715590ed 100755
--- a/chromium/third_party/catapult/tracing/bin/merge_histograms
+++ b/chromium/third_party/catapult/tracing/bin/merge_histograms
@@ -25,7 +25,7 @@ def Main(argv):
args = parser.parse_args(argv[1:])
merged = merge_histograms.MergeHistograms(args.input, args.groupby)
- json.dump(merged, file(args.output, 'w'))
+ json.dump(merged, open(args.output, 'w'))
return 0
if __name__ == '__main__':
diff --git a/chromium/third_party/catapult/tracing/bin/proto2json b/chromium/third_party/catapult/tracing/bin/proto2json
index b81c012de9a..792d75e333d 100755
--- a/chromium/third_party/catapult/tracing/bin/proto2json
+++ b/chromium/third_party/catapult/tracing/bin/proto2json
@@ -3,6 +3,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import print_function
import argparse
import os
import json
@@ -24,7 +25,7 @@ def main():
with open(args.proto_path, "rb") as f:
hs.ImportProto(f.read())
- print(json.dumps(hs.AsDicts(), indent=4))
+ print((json.dumps(hs.AsDicts(), indent=4)))
if __name__ == '__main__':
sys.exit(main())
diff --git a/chromium/third_party/catapult/tracing/bin/run_metric b/chromium/third_party/catapult/tracing/bin/run_metric
index 968f1ae42ef..07e7aca15e6 100755
--- a/chromium/third_party/catapult/tracing/bin/run_metric
+++ b/chromium/third_party/catapult/tracing/bin/run_metric
@@ -3,11 +3,13 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import print_function
import argparse
import codecs
import json
import os
import sys
+import six
sys.path.insert(1, os.path.join(os.path.dirname(__file__), '..'))
from tracing_build import vulcanize_histograms_viewer
@@ -54,8 +56,8 @@ def Main(argv):
failures = []
histograms = []
- for trace_url, mre_result in metric_runner.RunMetricOnTraces(
- traces, args.metrics).iteritems():
+ for trace_url, mre_result in six.iteritems(metric_runner.RunMetricOnTraces(
+ traces, args.metrics)):
failures.extend(mre_result.failures)
histograms.extend(mre_result.pairs.get('histograms', []))
@@ -68,22 +70,22 @@ def Main(argv):
histograms = hset.AsDicts()
if failures:
- print 'Running metric failed:'
+ print('Running metric failed:')
for failure in failures:
- print failure.stack
+ print(failure.stack)
output_file = args.filename + '.html'
open(output_file, 'a').close() # Create file if it doesn't exist.
with codecs.open(output_file, mode='r+', encoding='utf-8') as output_stream:
vulcanize_histograms_viewer.VulcanizeAndRenderHistogramsViewer(
histograms, output_stream, args.reset)
- print 'HTML result created in file://' + os.path.abspath(output_file)
+ print('HTML result created in file://' + os.path.abspath(output_file))
if args.also_output_json:
output_file = args.filename + '.json'
with open(output_file, 'w') as f:
json.dump(histograms, f, indent=2, sort_keys=True, separators=(',', ': '))
- print 'JSON result created in file://' + os.path.abspath(output_file)
+ print('JSON result created in file://' + os.path.abspath(output_file))
if __name__ == '__main__':
diff --git a/chromium/third_party/catapult/tracing/bin/run_py_tests b/chromium/third_party/catapult/tracing/bin/run_py_tests
index e81cb180b79..46796ed30ea 100755
--- a/chromium/third_party/catapult/tracing/bin/run_py_tests
+++ b/chromium/third_party/catapult/tracing/bin/run_py_tests
@@ -4,7 +4,6 @@
# found in the LICENSE file.
import os
-import platform
import sys
_CATAPULT_PATH = os.path.abspath(
diff --git a/chromium/third_party/catapult/tracing/bin/snapdragon2trace b/chromium/third_party/catapult/tracing/bin/snapdragon2trace
index fee277b5fc5..cf952ac6085 100755
--- a/chromium/third_party/catapult/tracing/bin/snapdragon2trace
+++ b/chromium/third_party/catapult/tracing/bin/snapdragon2trace
@@ -26,7 +26,6 @@ file.
"""
import argparse
-import codecs
import sys
import os
diff --git a/chromium/third_party/catapult/tracing/bin/trace2html b/chromium/third_party/catapult/tracing/bin/trace2html
index e1e56702268..803c7860851 100755
--- a/chromium/third_party/catapult/tracing/bin/trace2html
+++ b/chromium/third_party/catapult/tracing/bin/trace2html
@@ -1,8 +1,9 @@
-#!/usr/bin/env python2.7
+#!/usr/bin/env python
# Copyright (c) 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import sys
import os
diff --git a/chromium/third_party/catapult/tracing/bin/validate_all_diagnostics b/chromium/third_party/catapult/tracing/bin/validate_all_diagnostics
index f8bd5badaf0..7548cc31080 100755
--- a/chromium/third_party/catapult/tracing/bin/validate_all_diagnostics
+++ b/chromium/third_party/catapult/tracing/bin/validate_all_diagnostics
@@ -3,10 +3,8 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import argparse
import json
import os
-import string
import sys
sys.path.insert(
@@ -58,16 +56,16 @@ def CheckPythonDiagnostics():
return_code = 0
if unregistered_diagnostics:
- print ('These diagnostics are unregistered: %s. Please add them to '
- 'tracing/tracing/value/diagnostics/all_diagnostics.py.' %
- ', '.join(unregistered_diagnostics))
+ print('These diagnostics are unregistered: %s. Please add them to '
+ 'tracing/tracing/value/diagnostics/all_diagnostics.py.' %
+ ', '.join(unregistered_diagnostics))
return_code = 1
for name in all_diagnostics.GetDiagnosticTypenames():
diagnostic = all_diagnostics.GetDiagnosticClassForName(name)
if name != diagnostic.__name__:
- print 'This diagnostic refers to the wrong class: %s: %s' % (
- name, diagnostic.__name__)
+ print('This diagnostic refers to the wrong class: %s: %s' % (
+ name, diagnostic.__name__))
return_code = 1
return return_code
@@ -86,10 +84,10 @@ def CheckJSDiagnostics():
unregistered_diagnostics = (all_possible_diagnostics -
all_registered_diagnostics)
if unregistered_diagnostics:
- print ('These diagnostics are unregistered: %s. Please import their modules in '
- 'tracing/tracing/value/diagnostics/all_diagnostics.html and '
- 'ensure that they call Diagnostic.register().' %
- ', '.join(unregistered_diagnostics))
+ print('These diagnostics are unregistered: %s. Please import their modules in '
+ 'tracing/tracing/value/diagnostics/all_diagnostics.html and '
+ 'ensure that they call Diagnostic.register().' %
+ ', '.join(unregistered_diagnostics))
return 1
lowercased_diagnostics = []
@@ -97,8 +95,8 @@ def CheckJSDiagnostics():
if str.islower(m[0]):
lowercased_diagnostics.append(m)
if lowercased_diagnostics:
- print ('These diagnostics must be renamed to start with a upper-case: %s' %
- lowercased_diagnostics)
+ print('These diagnostics must be renamed to start with a upper-case: %s' %
+ lowercased_diagnostics)
return 1
return 0
diff --git a/chromium/third_party/catapult/tracing/bin/validate_all_metrics b/chromium/third_party/catapult/tracing/bin/validate_all_metrics
index b4b26307bc1..b38cac3ef6c 100755
--- a/chromium/third_party/catapult/tracing/bin/validate_all_metrics
+++ b/chromium/third_party/catapult/tracing/bin/validate_all_metrics
@@ -3,10 +3,8 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import argparse
-import json
+from __future__ import print_function
import os
-import string
import sys
sys.path.insert(
@@ -25,16 +23,16 @@ def Main():
all_possible_metrics = set(discover.DiscoverMetrics(all_modules))
unregistered_metrics = all_possible_metrics - all_registered_metrics
if unregistered_metrics:
- print ('These metrics are unregistered: %s. Please import their modules in '
- 'tracing/tracing/metrics/all_metrics.html' %
- ', '.join(unregistered_metrics))
+ print('These metrics are unregistered: %s. Please import their modules in '
+ 'tracing/tracing/metrics/all_metrics.html' %
+ ', '.join(unregistered_metrics))
return 1
uppercased_metrics = []
for m in all_possible_metrics:
if str.isupper(m[0]):
uppercased_metrics.append(m)
if uppercased_metrics:
- print ('These metrics must be renamed to start with a lower-case: %s' %
+ print('These metrics must be renamed to start with a lower-case: %s' %
uppercased_metrics)
return 1
return 0
diff --git a/chromium/third_party/catapult/tracing/bin/why_imported b/chromium/third_party/catapult/tracing/bin/why_imported
index 9b5a59a6f49..04a134681f7 100755
--- a/chromium/third_party/catapult/tracing/bin/why_imported
+++ b/chromium/third_party/catapult/tracing/bin/why_imported
@@ -15,6 +15,7 @@ This can then be converted to a graphical representation with the dot tool:
$ dot -Grankdir=LR -Tpng ~/analysis_view.dot -o ~/analysis_view.png
"""
+from __future__ import print_function
import os
import sys
import argparse
@@ -35,8 +36,8 @@ def Main():
load_sequence = vulcanizer.CalcLoadSequenceForModuleNames(names)
else:
parser.error('No config specified.')
- print vulcanizer.GetDominatorGraphForModulesNamed(
- args.module_names, load_sequence)
+ print(vulcanizer.GetDominatorGraphForModulesNamed(
+ args.module_names, load_sequence))
if __name__ == '__main__':
diff --git a/chromium/third_party/catapult/tracing/docs/perfetto.md b/chromium/third_party/catapult/tracing/docs/perfetto.md
new file mode 100644
index 00000000000..1ec78be2d27
--- /dev/null
+++ b/chromium/third_party/catapult/tracing/docs/perfetto.md
@@ -0,0 +1,19 @@
+**July 2022 update**: chrome://tracing is deprecated, and by default will
+redirect to https://ui.perfetto.dev. At the moment, it's still possible to use
+the old UI, but there's no guarantee that it will continue to function;
+please file [feature requests](https://perfetto.dev/docs/#bugs) for any
+blockers that prevent you from migrating from chrome://tracing to Perfetto.
+
+[Perfetto](https://perfetto.dev) is an evolution of chrome://tracing. Try it
+out!
+
+Perfetto offers various advantages, including:
+
+* Support for larger trace sizes and more responsive trace navigation
+* Interactive SQL queries to analyze the trace model
+* Android system trace recording via WebUSB
+
+So far, the Perfetto UI has been optimized for use cases on Android. If your
+Chromium use case could be supported in better ways, or if you're missing a
+loved feature from the catapult viewer, please leave us
+[feedback](https://perfetto.dev/docs/#bugs).
diff --git a/chromium/third_party/catapult/tracing/third_party/symbols/symbols/PRESUBMIT.py b/chromium/third_party/catapult/tracing/third_party/symbols/symbols/PRESUBMIT.py
index b4d94ae225b..2060f251606 100644
--- a/chromium/third_party/catapult/tracing/third_party/symbols/symbols/PRESUBMIT.py
+++ b/chromium/third_party/catapult/tracing/third_party/symbols/symbols/PRESUBMIT.py
@@ -2,14 +2,24 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+
+USE_PYTHON3 = True
+
+
def CommonChecks(input_api, output_api):
output = []
- output.extend(input_api.canned_checks.RunPylint(input_api, output_api))
+ output.extend(input_api.RunTests(input_api.canned_checks.GetPylint(
+ input_api,
+ output_api,
+ version='2.7')))
output.extend(input_api.canned_checks.RunUnitTestsInDirectory(
input_api,
output_api,
input_api.PresubmitLocalPath(),
- whitelist=[r'^.+_unittest\.py$']))
+ files_to_check=[r'^.+_unittest\.py$'],
+ run_on_python2=False,
+ run_on_python3=True,
+ skip_shebang_check=True))
return output
diff --git a/chromium/third_party/catapult/tracing/third_party/symbols/symbols/elf_symbolizer.py b/chromium/third_party/catapult/tracing/third_party/symbols/symbols/elf_symbolizer.py
index 9deec868368..4db186721fa 100644
--- a/chromium/third_party/catapult/tracing/third_party/symbols/symbols/elf_symbolizer.py
+++ b/chromium/third_party/catapult/tracing/third_party/symbols/symbols/elf_symbolizer.py
@@ -26,7 +26,7 @@ except ImportError:
ADDR2LINE_RECYCLE_LIMIT = 4000
-class ELFSymbolizer(object):
+class ELFSymbolizer:
"""An uber-fast (multiprocessing, pipelined and asynchronous) ELF symbolizer.
This class is a frontend for addr2line (part of GNU binutils), designed to
@@ -201,7 +201,7 @@ class ELFSymbolizer(object):
(time.time() - start_time))
- class Addr2Line(object):
+ class Addr2Line:
"""A python wrapper around an addr2line instance.
The communication with the addr2line process looks as follows:
@@ -397,7 +397,7 @@ class ELFSymbolizer(object):
if self._symbolizer.inlines:
cmd += ['--inlines']
self._proc = subprocess.Popen(cmd, bufsize=1, stdout=subprocess.PIPE,
- stdin=subprocess.PIPE, stderr=sys.stderr, close_fds=True)
+ stdin=subprocess.PIPE, stderr=sys.stderr, close_fds=True, text=True)
# Start the poller thread, which simply moves atomically the lines read
# from the addr2line's stdout to the |_out_queue|.
@@ -441,7 +441,7 @@ class ELFSymbolizer(object):
process_pipe.close()
# Every addr2line processes will die at some point, please die silently.
- except (IOError, OSError):
+ except (IOError, OSError, ValueError):
pass
@property
@@ -450,7 +450,7 @@ class ELFSymbolizer(object):
return self._request_queue[0][2] if self._request_queue else 0
-class ELFSymbolInfo(object):
+class ELFSymbolInfo:
"""The result of the symbolization passed as first arg. of each callback."""
def __init__(self, name, source_path, source_line, was_ambiguous=False,
diff --git a/chromium/third_party/catapult/tracing/third_party/symbols/symbols/elf_symbolizer_unittest.py b/chromium/third_party/catapult/tracing/third_party/symbols/symbols/elf_symbolizer_unittest.py
index d7978aba0f8..130f0139a16 100755
--- a/chromium/third_party/catapult/tracing/third_party/symbols/symbols/elf_symbolizer_unittest.py
+++ b/chromium/third_party/catapult/tracing/third_party/symbols/symbols/elf_symbolizer_unittest.py
@@ -10,7 +10,6 @@ import sys
import unittest
sys.path.insert(0, os.path.dirname(__file__))
-# pylint: disable=relative-import
import elf_symbolizer
import mock_addr2line
@@ -58,7 +57,7 @@ class ELFSymbolizerTest(unittest.TestCase):
inlines=True,
max_concurrent_jobs=4)
- for addr in xrange(1000):
+ for addr in range(1000):
exp_inline = False
exp_unknown = False
@@ -128,7 +127,7 @@ class ELFSymbolizerTest(unittest.TestCase):
max_concurrent_jobs=max_concurrent_jobs,
addr2line_timeout=0.5)
- for addr in xrange(num_symbols):
+ for addr in range(num_symbols):
exp_name = 'mock_sym_for_addr_%d' % addr
exp_source_path = 'mock_src/mock_lib1.so.c'
exp_source_line = addr
@@ -138,7 +137,7 @@ class ELFSymbolizerTest(unittest.TestCase):
symbolizer.Join()
# Check that all the expected callbacks have been received.
- for addr in xrange(num_symbols):
+ for addr in range(num_symbols):
self.assertIn(addr, self._resolved_addresses)
self._resolved_addresses.remove(addr)
diff --git a/chromium/third_party/catapult/tracing/third_party/symbols/symbols/mock_addr2line/mock_addr2line b/chromium/third_party/catapult/tracing/third_party/symbols/symbols/mock_addr2line/mock_addr2line
index 5544359ad60..7ae89a08934 100755
--- a/chromium/third_party/catapult/tracing/third_party/symbols/symbols/mock_addr2line/mock_addr2line
+++ b/chromium/third_party/catapult/tracing/third_party/symbols/symbols/mock_addr2line/mock_addr2line
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
@@ -9,21 +9,21 @@ Outputs mock symbol information, with each symbol being a function of the
original address (so it is easy to double-check consistency in unittests).
"""
-import optparse
+import argparse
import os
import posixpath
import sys
import time
-def main(argv):
- parser = optparse.OptionParser()
- parser.add_option('-e', '--exe', dest='exe') # Path of the debug-library.so.
+def main(args=None):
+ parser = argparse.ArgumentParser()
+ parser.add_argument('-e', '--exe') # Path of the debug-library.so.
# Silently swallow the other unnecessary arguments.
- parser.add_option('-C', '--demangle', action='store_true')
- parser.add_option('-f', '--functions', action='store_true')
- parser.add_option('-i', '--inlines', action='store_true')
- options, _ = parser.parse_args(argv[1:])
+ parser.add_argument('-C', '--demangle', action='store_true')
+ parser.add_argument('-f', '--functions', action='store_true')
+ parser.add_argument('-i', '--inlines', action='store_true')
+ options = parser.parse_args()
lib_file_name = posixpath.basename(options.exe)
processed_sym_count = 0
crash_every = int(os.environ.get('MOCK_A2L_CRASH_EVERY', 0))
@@ -36,8 +36,8 @@ def main(argv):
# An empty line should generate '??,??:0' (is used as marker for inlines).
if line == '\n':
- print '??'
- print '??:0'
+ print('??')
+ print('??:0')
sys.stdout.flush()
continue
@@ -50,31 +50,31 @@ def main(argv):
# Addresses < 1M will return good mock symbol information.
if addr < 1024 * 1024:
- print 'mock_sym_for_addr_%d' % addr
- print 'mock_src/%s.c:%d' % (lib_file_name, addr)
+ print('mock_sym_for_addr_%d' % addr)
+ print('mock_src/%s.c:%d' % (lib_file_name, addr))
# Addresses 1M <= x < 2M will return symbols with a name but a missing path.
elif addr < 2 * 1024 * 1024:
- print 'mock_sym_for_addr_%d' % addr
- print '??:0'
+ print('mock_sym_for_addr_%d' % addr)
+ print('??:0')
# Addresses 2M <= x < 3M will return unknown symbol information.
elif addr < 3 * 1024 * 1024:
- print '??'
- print '??'
+ print('??')
+ print('??')
# Addresses 3M <= x < 4M will return inlines.
elif addr < 4 * 1024 * 1024:
- print 'mock_sym_for_addr_%d_inner' % addr
- print 'mock_src/%s.c:%d' % (lib_file_name, addr)
- print 'mock_sym_for_addr_%d_middle' % addr
- print 'mock_src/%s.c:%d' % (lib_file_name, addr)
- print 'mock_sym_for_addr_%d_outer' % addr
- print 'mock_src/%s.c:%d' % (lib_file_name, addr)
+ print('mock_sym_for_addr_%d_inner' % addr)
+ print('mock_src/%s.c:%d' % (lib_file_name, addr))
+ print('mock_sym_for_addr_%d_middle' % addr)
+ print('mock_src/%s.c:%d' % (lib_file_name, addr))
+ print('mock_sym_for_addr_%d_outer' % addr)
+ print('mock_src/%s.c:%d' % (lib_file_name, addr))
else:
- print 'mock_sym_for_addr_%d' % addr
- print 'mock_src/%s.c:%d' % (lib_file_name, addr)
+ print('mock_sym_for_addr_%d' % addr)
+ print('mock_src/%s.c:%d' % (lib_file_name, addr))
sys.stdout.flush()
diff --git a/chromium/third_party/catapult/tracing/trace_viewer.gni b/chromium/third_party/catapult/tracing/trace_viewer.gni
index 18d64554a28..d286545782a 100644
--- a/chromium/third_party/catapult/tracing/trace_viewer.gni
+++ b/chromium/third_party/catapult/tracing/trace_viewer.gni
@@ -134,6 +134,7 @@ tracing_js_html_files = [
"tracing/extras/importer/linux_perf/kfunc_parser.html",
"tracing/extras/importer/linux_perf/mali_parser.html",
"tracing/extras/importer/linux_perf/memreclaim_parser.html",
+ "tracing/extras/importer/linux_perf/msm_parser.html",
"tracing/extras/importer/linux_perf/parser.html",
"tracing/extras/importer/linux_perf/power_parser.html",
"tracing/extras/importer/linux_perf/regulator_parser.html",
@@ -197,14 +198,18 @@ tracing_js_html_files = [
"tracing/metrics/android_systrace_metric.html",
"tracing/metrics/blink/gc_metric.html",
"tracing/metrics/blink/leak_detection_metric.html",
+ "tracing/metrics/blink/resource_metric.html",
"tracing/metrics/console_error_metric.html",
+ "tracing/metrics/core_web_vitals_metric.html",
+ "tracing/metrics/count_sum_metric.html",
"tracing/metrics/cpu_process_metric.html",
+ "tracing/metrics/custom_metric.html",
"tracing/metrics/media_metric.html",
- "tracing/metrics/memory_ablation_metric.html",
"tracing/metrics/metric_map_function.html",
"tracing/metrics/metric_registry.html",
+ "tracing/metrics/partition_alloc/pcscan_metric.html",
"tracing/metrics/rendering/cpu_utilization.html",
- "tracing/metrics/rendering/frame_time.html",
+ "tracing/metrics/rendering/frame_segment_filter.html",
"tracing/metrics/rendering/image_decode_time.html",
"tracing/metrics/rendering/pixels.html",
"tracing/metrics/rendering/queueing_duration.html",
@@ -231,6 +236,7 @@ tracing_js_html_files = [
"tracing/metrics/system_health/responsiveness_metric.html",
"tracing/metrics/system_health/screenshots_based_speed_index_metric.html",
"tracing/metrics/system_health/utils.html",
+ "tracing/metrics/system_health/weblayer_startup_metric.html",
"tracing/metrics/system_health/webview_startup_metric.html",
"tracing/metrics/tabs_metric.html",
"tracing/metrics/tracing_metric.html",
@@ -556,6 +562,7 @@ tracing_js_html_files = [
"tracing/ui/tracks/x_axis_track.html",
"tracing/ui/view_specific_brushing_state.html",
"tracing/value/csv_builder.html",
+ "tracing/value/diagnostics/alert_groups.html",
"tracing/value/diagnostics/all_diagnostics.html",
"tracing/value/diagnostics/breakdown.html",
"tracing/value/diagnostics/collected_related_event_set.html",
@@ -684,9 +691,8 @@ py_vulcanize_files = [
"../common/py_vulcanize/third_party/rjsmin/rjsmin.py",
"../common/py_vulcanize/third_party/rjsmin/setup.py",
]
-other_python_files = [
- "tracing_project.py",
-]
+other_python_files = [ "tracing_project.py" ]
+
# python files needed for deterministic builds. See https://crbug.com/1025132.
# This list is manually generated and may become out of date. Please fix it if
# it does so.
diff --git a/chromium/third_party/catapult/tracing/tracing/BUILD.gn b/chromium/third_party/catapult/tracing/tracing/BUILD.gn
index 816fa752e0b..0df405e5cf7 100644
--- a/chromium/third_party/catapult/tracing/tracing/BUILD.gn
+++ b/chromium/third_party/catapult/tracing/tracing/BUILD.gn
@@ -11,7 +11,7 @@ config("common_config") {
}
source_set("histogram") {
- configs += [ ":common_config" ]
+ public_configs = [ ":common_config" ]
sources = [
"value/histogram.cc",
"value/histogram.h",
@@ -25,7 +25,7 @@ source_set("histogram") {
}
source_set("reserved_infos") {
- configs += [ ":common_config" ]
+ public_configs = [ ":common_config" ]
sources = [
"value/diagnostics/reserved_infos.cc",
"value/diagnostics/reserved_infos.h",
@@ -33,7 +33,6 @@ source_set("reserved_infos") {
}
test("histogram_unittests") {
- configs += [ ":common_config" ]
sources = [
"value/histogram_unittest.cc",
"value/running_statistics_unittest.cc",
@@ -46,7 +45,7 @@ test("histogram_unittests") {
deps = [
":histogram",
"proto:histogram_proto",
- "//testing/gtest:gtest_main",
"//testing/gtest:gtest",
+ "//testing/gtest:gtest_main",
]
}
diff --git a/chromium/third_party/catapult/tracing/tracing/base/unittest/html_test_results.html b/chromium/third_party/catapult/tracing/tracing/base/unittest/html_test_results.html
index 1642cd7ec2e..1387d0206c8 100644
--- a/chromium/third_party/catapult/tracing/tracing/base/unittest/html_test_results.html
+++ b/chromium/third_party/catapult/tracing/tracing/base/unittest/html_test_results.html
@@ -503,8 +503,7 @@ tr.exportTo('tr.b.unittest', function() {
},
didAllTestsPass() {
- // A test counts as failing if it failed or it was skipped.
- return this.numTestsThatFailed_ + this.numSkippedTests_ === 0;
+ return this.numTestsThatFailed_ === 0;
},
notifyTestResultToDevServer_(result, extraMsg) {
diff --git a/chromium/third_party/catapult/tracing/tracing/base/unittest/suite_loader.html b/chromium/third_party/catapult/tracing/tracing/base/unittest/suite_loader.html
index 6c14bd5afbf..0a092a0a79a 100644
--- a/chromium/third_party/catapult/tracing/tracing/base/unittest/suite_loader.html
+++ b/chromium/third_party/catapult/tracing/tracing/base/unittest/suite_loader.html
@@ -212,11 +212,11 @@ tr.exportTo('tr.b.unittest', function() {
this.oldGlobalOnError_ = undefined;
},
- constructAndRegisterTestSuite(suiteConstructor) {
+ constructAndRegisterTestSuite(suiteConstructor, opt_options) {
const name = this.currentModuleLoader_.getCurrentlyExecutingModuleName();
const testSuite = new tr.b.unittest.TestSuite(
- name, suiteConstructor);
+ name, suiteConstructor, opt_options);
this.testSuites.push(testSuite);
diff --git a/chromium/third_party/catapult/tracing/tracing/base/unittest/test_suite.html b/chromium/third_party/catapult/tracing/tracing/base/unittest/test_suite.html
index 237403fbf05..f0e607273b4 100644
--- a/chromium/third_party/catapult/tracing/tracing/base/unittest/test_suite.html
+++ b/chromium/third_party/catapult/tracing/tracing/base/unittest/test_suite.html
@@ -19,7 +19,7 @@ tr.exportTo('tr.b.unittest', function() {
const TestTypes = tr.b.unittest.TestTypes;
- function TestSuite(name, suiteConstructor) {
+ function TestSuite(name, suiteConstructor, opt_suiteOptions) {
this.guid = tr.b.GUID.allocateSimple();
this.name_ = name;
this.tests_ = [];
@@ -36,6 +36,17 @@ tr.exportTo('tr.b.unittest', function() {
}
}.bind(this);
+ global.skipTest = function(testCaseOrName, opt_testFn, opt_options) {
+ if (testCaseOrName instanceof TestCase) {
+ testCaseOrName.options.skipped = true;
+ test(testCaseOrName);
+ } else {
+ const options = Object.assign({}, opt_options || {});
+ options.skipped = true;
+ test(testCaseOrName, opt_testFn, options);
+ }
+ }.bind(this);
+
global.test = function(testCaseOrName, opt_testFn, opt_options) {
if (testCaseOrName instanceof TestCase) {
if (opt_testFn !== undefined) {
@@ -44,6 +55,9 @@ tr.exportTo('tr.b.unittest', function() {
if (opt_options !== undefined) {
throw new Error('opt_options cannot be given when giving a TestCase');
}
+ if (opt_suiteOptions && opt_suiteOptions.skipped) {
+ testCaseOrName.options.skipped = true;
+ }
this.addTest(testCaseOrName);
return;
}
@@ -51,6 +65,9 @@ tr.exportTo('tr.b.unittest', function() {
let testName = testCaseOrName;
const testFn = opt_testFn;
const options = opt_options || {};
+ if (opt_suiteOptions && opt_suiteOptions.skipped) {
+ options.skipped = true;
+ }
if (testFn === undefined) {
throw new Error('Must provide opt_testFn');
}
@@ -100,6 +117,8 @@ tr.exportTo('tr.b.unittest', function() {
} finally {
global.test = undefined;
global.timedPerfTest = undefined;
+ global.flakyTest = undefined;
+ global.skipTest = undefined;
}
}
@@ -127,16 +146,22 @@ tr.exportTo('tr.b.unittest', function() {
}
};
- function testSuite(suiteConstructor) {
+ function testSuite(suiteConstructor, opt_suiteOptions) {
if (!global._currentSuiteLoader) {
throw new Error('testSuites can only be defined during suite loading');
}
- global._currentSuiteLoader.constructAndRegisterTestSuite(suiteConstructor);
+ global._currentSuiteLoader.constructAndRegisterTestSuite(
+ suiteConstructor, opt_suiteOptions);
+ }
+
+ function skippedTestSuite(suiteConstructor) {
+ testSuite(suiteConstructor, {skipped: true});
}
return {
TestSuite,
testSuite,
+ skippedTestSuite,
};
});
</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_auditor.html b/chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_auditor.html
index a010398a1cc..15a2e921d49 100644
--- a/chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_auditor.html
+++ b/chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_auditor.html
@@ -54,11 +54,12 @@ tr.exportTo('tr.e.audits', function() {
for (const slice of asyncSlices) {
if (slice.title === 'PipelineReporter' &&
slice.args.chrome_frame_reporter &&
- slice.args.chrome_frame_reporter.state === 'STATE_DROPPED') {
+ slice.args.chrome_frame_reporter.state === 'STATE_DROPPED' &&
+ slice.args.chrome_frame_reporter.affects_smoothness) {
const alertSlices = [slice].concat(slice.subSlices);
alerts.push(new Alert(
new EventInfo(
- 'Dropped Frame',
+ 'Dropped Frame affecting smoothness',
'Frame was dropped (i.e. not produced/presented).'),
slice.start,
alertSlices));
diff --git a/chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_auditor_test.html b/chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_auditor_test.html
index 8b41fa056ad..bbc0750b6b9 100644
--- a/chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_auditor_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_auditor_test.html
@@ -150,6 +150,30 @@ tr.b.unittest.testSuite(function() {
}
});
+ const missedFrameSliceNotAffectingSmoothness = newAsyncSliceEx({
+ title: 'PipelineReporter',
+ start: 200,
+ duration: 15,
+ args: {
+ chrome_frame_reporter: {
+ affects_smoothness: false,
+ state: 'STATE_DROPPED'
+ }
+ }
+ });
+
+ const missedFrameSliceAffectingSmoothness = newAsyncSliceEx({
+ title: 'PipelineReporter',
+ start: 200,
+ duration: 15,
+ args: {
+ chrome_frame_reporter: {
+ affects_smoothness: true,
+ state: 'STATE_DROPPED'
+ }
+ }
+ });
+
const missedFrameSlice = newAsyncSliceEx({
title: 'PipelineReporter',
start: 200,
@@ -161,6 +185,8 @@ tr.b.unittest.testSuite(function() {
m.compositorThread.asyncSliceGroup.push(noArgsFrameSlice);
m.compositorThread.asyncSliceGroup.push(submittedFrameSlice);
+ m.compositorThread.asyncSliceGroup.push(missedFrameSliceNotAffectingSmoothness);
+ m.compositorThread.asyncSliceGroup.push(missedFrameSliceAffectingSmoothness);
m.compositorThread.asyncSliceGroup.push(missedFrameSlice);
}, tr.e.audits.ChromeAuditor);
diff --git a/chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_test_utils.html b/chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_test_utils.html
index 69128010fa9..dc8483985a7 100644
--- a/chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_test_utils.html
+++ b/chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_test_utils.html
@@ -34,6 +34,9 @@ tr.exportTo('tr.e.chrome', function() {
model.rasterWorker1 = model.rendererProcess.getOrCreateThread(5);
model.rasterWorker1.name = 'CompositorTileWorker1';
+ model.foregroundWorker1 = model.rendererProcess.getOrCreateThread(6);
+ model.foregroundWorker1.name = 'ThreadPoolForegroundWorker1';
+
customizeModelCallback(model);
});
};
diff --git a/chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_user_friendly_category_driver.html b/chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_user_friendly_category_driver.html
index 6c046e34b18..f4f5671b022 100644
--- a/chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_user_friendly_category_driver.html
+++ b/chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_user_friendly_category_driver.html
@@ -82,6 +82,9 @@ tr.exportTo('tr.e.chrome', function() {
'HTMLDocumentParser::processParsedChunkFromBackgroundParser',
'HTMLDocumentParser::processTokenizedChunkFromBackgroundParser',
'ParseHTML',
+ 'HTMLDocumentParser::DeferredPumpTokenizerIfPossible',
+ 'HTMLDocumentParser::PumpTokenizer',
+ 'HTMLDocumentParser::appendBytes',
],
raster: [
diff --git a/chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_user_friendly_category_driver_test.html b/chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_user_friendly_category_driver_test.html
index 5251a7d2edc..4c346d1e2ba 100644
--- a/chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_user_friendly_category_driver_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/extras/chrome/chrome_user_friendly_category_driver_test.html
@@ -42,7 +42,7 @@ tr.b.unittest.testSuite(function() {
}), 'style');
assert.strictEqual(ufcFromEvent({
guid: tr.b.GUID.allocateSimple(),
- title: 'HTMLDocumentParser::didReceiveParsedChunkFromBackgroundParser',
+ title: 'HTMLDocumentParser::DeferredPumpTokenizerIfPossible',
category: 'cat'
}), 'parseHTML');
diff --git a/chromium/third_party/catapult/tracing/tracing/extras/chrome/estimated_input_latency_test.html b/chromium/third_party/catapult/tracing/tracing/extras/chrome/estimated_input_latency_test.html
index edae6767dfb..fc781613d4f 100644
--- a/chromium/third_party/catapult/tracing/tracing/extras/chrome/estimated_input_latency_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/extras/chrome/estimated_input_latency_test.html
@@ -44,6 +44,7 @@ tr.b.unittest.testSuite(function() {
function addTestFrame(rendererProcess) {
rendererProcess.objects.addSnapshot(
'ptr', 'loading', 'FrameLoader', 300, {
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
diff --git a/chromium/third_party/catapult/tracing/tracing/extras/chrome/largest_contentful_paint.html b/chromium/third_party/catapult/tracing/tracing/extras/chrome/largest_contentful_paint.html
index c61cca1047d..725106ed66e 100644
--- a/chromium/third_party/catapult/tracing/tracing/extras/chrome/largest_contentful_paint.html
+++ b/chromium/third_party/catapult/tracing/tracing/extras/chrome/largest_contentful_paint.html
@@ -89,9 +89,8 @@ tr.exportTo('tr.e.chrome', function() {
findCandidates() {
const finalLcpEvents = this.findFinalLcpEventOfEachNavigation(
this.allBrowserEvents);
- const finalCandidates = finalLcpEvents
- .filter(finalLcpEvent =>
- !LcpInvalidateEvent.isLcpInvalidateEvent(finalLcpEvent));
+ const finalCandidates = finalLcpEvents.filter(finalLcpEvent =>
+ !(finalLcpEvent instanceof LcpInvalidateEvent));
return finalCandidates;
}
diff --git a/chromium/third_party/catapult/tracing/tracing/extras/importer/fuchsia_importer.html b/chromium/third_party/catapult/tracing/tracing/extras/importer/fuchsia_importer.html
index 8fd2fcbf870..80079c7bb7a 100644
--- a/chromium/third_party/catapult/tracing/tracing/extras/importer/fuchsia_importer.html
+++ b/chromium/third_party/catapult/tracing/tracing/extras/importer/fuchsia_importer.html
@@ -14,7 +14,6 @@ found in the LICENSE file.
tr.exportTo('tr.e.importer.fuchsia', function() {
const IMPORT_PRIORITY = 0;
- const IDLE_THREAD_THRESHOLD = 6444000000;
// Zircon thread state constants from:
// https://fuchsia.googlesource.com/zircon/+/master/docs/syscalls/object_get_info.md
@@ -64,19 +63,12 @@ tr.exportTo('tr.e.importer.fuchsia', function() {
finalizeImport() {
}
- isIdleThread(prio, tid) {
- if (prio === undefined) {
- // If the "prio" field is not available (if we were, for example,
- // using an old trace), then fall back to the legacy heuristic of
- // assuming that large numbered threads are idle ones.
- return tid > IDLE_THREAD_THRESHOLD;
- }
- // A thread is idle iff its priority is set to 0.
- return prio === 0;
+ isIdleThread(pid, prio) {
+ return pid === 0 && prio === 0;
}
- recordThreadState_(tid, timestamp, state, prio) {
- if (this.isIdleThread(prio, tid)) {
+ recordThreadState_(pid, tid, timestamp, state, prio) {
+ if (this.isIdleThread(pid, prio)) {
return;
}
const states =
@@ -104,6 +96,7 @@ tr.exportTo('tr.e.importer.fuchsia', function() {
// },
processContextSwitchEvent_(event) {
let tid = event.in.tid;
+ let pid = event.in.pid;
let threadName = tid.toString();
let procName = '';
const prio = event.in.prio;
@@ -119,7 +112,7 @@ tr.exportTo('tr.e.importer.fuchsia', function() {
const name = procName + threadName;
- if (this.isIdleThread(prio, tid)) {
+ if (this.isIdleThread(pid, prio)) {
tid = undefined; // Fake kernel idle task
}
@@ -128,7 +121,7 @@ tr.exportTo('tr.e.importer.fuchsia', function() {
cpu.switchActiveThread(timestamp, {}, tid, name, tid);
const SCHEDULING_STATE = tr.model.SCHEDULING_STATE;
- this.recordThreadState_(tid, timestamp, SCHEDULING_STATE.RUNNING, prio);
+ this.recordThreadState_(pid, tid, timestamp, SCHEDULING_STATE.RUNNING, prio);
let outState = SCHEDULING_STATE.UNKNOWN;
@@ -153,7 +146,7 @@ tr.exportTo('tr.e.importer.fuchsia', function() {
outState = SCHEDULING_STATE.TASK_DEAD;
break;
}
- this.recordThreadState_(event.out.tid, timestamp, outState,
+ this.recordThreadState_(event.out.pid, event.out.tid, timestamp, outState,
event.out.prio);
}
diff --git a/chromium/third_party/catapult/tracing/tracing/extras/importer/linux_perf/ftrace_importer.html b/chromium/third_party/catapult/tracing/tracing/extras/importer/linux_perf/ftrace_importer.html
index 048869e22d0..6e5e9c9ac67 100644
--- a/chromium/third_party/catapult/tracing/tracing/extras/importer/linux_perf/ftrace_importer.html
+++ b/chromium/third_party/catapult/tracing/tracing/extras/importer/linux_perf/ftrace_importer.html
@@ -25,6 +25,7 @@ found in the LICENSE file.
<link rel="import" href="/tracing/extras/importer/linux_perf/kfunc_parser.html">
<link rel="import" href="/tracing/extras/importer/linux_perf/mali_parser.html">
<link rel="import" href="/tracing/extras/importer/linux_perf/memreclaim_parser.html">
+<link rel="import" href="/tracing/extras/importer/linux_perf/msm_parser.html">
<link rel="import" href="/tracing/extras/importer/linux_perf/power_parser.html">
<link rel="import" href="/tracing/extras/importer/linux_perf/regulator_parser.html">
<link rel="import" href="/tracing/extras/importer/linux_perf/rss_parser.html">
diff --git a/chromium/third_party/catapult/tracing/tracing/extras/importer/linux_perf/msm_parser.html b/chromium/third_party/catapult/tracing/tracing/extras/importer/linux_perf/msm_parser.html
new file mode 100644
index 00000000000..65b06999ddc
--- /dev/null
+++ b/chromium/third_party/catapult/tracing/tracing/extras/importer/linux_perf/msm_parser.html
@@ -0,0 +1,170 @@
+<!DOCTYPE html>
+<!--
+Copyright 2020 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<link rel="import" href="/tracing/extras/importer/linux_perf/parser.html">
+
+<script>
+'use strict';
+
+/**
+ * @fileoverview Parses drm/msm driver events in the Linux event trace format.
+ */
+tr.exportTo('tr.e.importer.linux_perf', function() {
+ const ColorScheme = tr.b.ColorScheme;
+ const Parser = tr.e.importer.linux_perf.Parser;
+
+ /**
+ * Parses linux drm/msm trace events.
+ * @constructor
+ */
+ function MSMParser(importer) {
+ Parser.call(this, importer);
+
+ importer.registerEventHandler('msm_gpu_freq_change',
+ MSMParser.prototype.gpuFrequency.bind(this));
+
+ importer.registerEventHandler('msm_gpu_submit_flush',
+ MSMParser.prototype.gpuSubmitFlush.bind(this));
+
+ importer.registerEventHandler('msm_gpu_submit_retired',
+ MSMParser.prototype.gpuSubmitRetired.bind(this));
+
+ this.model_ = importer.model_;
+ this.submits = {};
+ this.num_submits = 0; // # of in-flight submits
+ }
+
+ MSMParser.prototype = {
+ __proto__: Parser.prototype,
+
+ // msm_gpu_freq_change: new_freq=180
+ gpuFrequency(eventName, cpuNumber, pid, ts, eventBase) {
+ const event = /new_freq=(\d+)/.exec(eventBase.details);
+ if (!event) return false;
+ const freq = parseInt(event[1]);
+
+ const counter =
+ this.model_.kernel.getOrCreateCounter('GPU', 'GPU Frequency');
+ if (counter.numSeries === 0) {
+ counter.addSeries(new tr.model.CounterSeries('frequency',
+ ColorScheme.getColorIdForGeneralPurposeString(counter.name)));
+ }
+ counter.series.forEach(function(series) {
+ series.addCounterSample(ts, freq);
+ });
+
+ return true;
+ },
+
+ // msm_gpu_submit_flush: id=348500 pid=29590 ring=0:348502 ticks=130364028
+ gpuSubmitFlush(eventName, cpuNumber, pid, ts, eventBase) {
+ const event = /id=(\d+) pid=(\d+) ring=(\d+):(\d+) ticks=(\d+)/.
+ exec(eventBase.details);
+ if (!event) return false;
+ const id = parseInt(event[1]);
+
+ const submit = {};
+ submit.flushTS = ts;
+ submit.flushTicks = parseInt(event[5]);
+ submit.pid = parseInt(event[2]);
+ this.submits[id] = submit;
+ this.num_submits++;
+
+ return true;
+ },
+
+ // msm_gpu_submit_retired: id=348500 pid=29590 ring=0:348501 elapsed=3405520 ns mhz=179 start=130055449 end=130120835 // @suppress longLineCheck
+ gpuSubmitRetired(eventName, cpuNumber, pid, ts, eventBase) {
+ const event = /id=(\d+) pid=(\d+) ring=(\d+):(\d+) elapsed=(\d+) ns mhz=(\d+) start=(\d+) end=(\d+)/. // @suppress longLineCheck
+ exec(eventBase.details);
+ if (!event) return false;
+ const id = parseInt(event[1]);
+
+ // If we didn't see the start event (msm_gpu_submit_flush) then just
+ // skip this event:
+ if (!(id in this.submits)) return true;
+
+ const submit = this.submits[id];
+ delete this.submits[id];
+ this.num_submits--;
+
+ const gpuThread = this.importer.getOrCreatePseudoThread('GPU');
+
+ submit.elapsedNs = parseInt(event[5]);
+ submit.mhz = parseInt(event[6]);
+ submit.startTicks = parseInt(event[7]);
+ submit.endTicks = parseInt(event[8]);
+
+ // Ticks are in units of 19.2Mhz alwayson counter, we can derive
+ // the time queued and running from this. The submit_flush trace
+ // captures both the CPU timestamp and the 19.2Mhz counter as read
+ // from the CPU. The submit_retired timestamp includes the value
+ // of the 19.2Mhz counter as read from the GPU before and after
+ // executing the submit.
+ //
+ // The trace timestamps (CPU based) are in ms.
+
+ function ticks2ms(ticks) {
+ return ticks / 19200;
+ }
+
+ const queuedDuration = ticks2ms(submit.startTicks - submit.flushTicks);
+ const runningDuration = ticks2ms(submit.endTicks - submit.startTicks);
+
+ // for debug:
+ submit.queuedDuration = queuedDuration;
+ submit.runningDuration = runningDuration;
+
+ // AsyncSlice's to show when the submit is queued, and begins to run:
+ const queued = new tr.model.AsyncSlice('', event[1] + ' queued',
+ tr.b.ColorScheme.getColorIdForReservedName('thread_state_runnable'),
+ submit.flushTS,
+ submit,
+ queuedDuration);
+
+ const running = new tr.model.AsyncSlice('', event[1] + ' running',
+ tr.b.ColorScheme.getColorIdForReservedName('thread_state_running'),
+ submit.flushTS + queuedDuration,
+ submit,
+ runningDuration);
+
+ const async = new tr.model.AsyncSlice('', 'pipeline',
+ ColorScheme.getColorIdForGeneralPurposeString('ongpu:' + submit.pid),
+ submit.flushTS,
+ submit,
+ queuedDuration + runningDuration);
+
+ // We don't want the 'async' container slice visible, it just exists to
+ // group the 'queued' and 'running' subslices:
+ async.hidden = true;
+
+ async.subSlices.push(queued);
+ async.subSlices.push(running);
+ gpuThread.thread.asyncSliceGroup.push(async);
+
+ // And the synchronous ThreadSlice shows the time the submit is running
+ // on the gpu:
+ const onGpu = new tr.model.ThreadSlice('', event[1],
+ ColorScheme.getColorIdForGeneralPurposeString('ongpu:' + submit.pid),
+ submit.flushTS + queuedDuration,
+ submit,
+ runningDuration);
+
+ gpuThread.thread.sliceGroup.pushSlice(onGpu);
+
+ return true;
+ }
+ };
+
+ Parser.register(MSMParser);
+
+ return {
+ MSMParser,
+ };
+});
+</script>
+
diff --git a/chromium/third_party/catapult/tracing/tracing/extras/importer/linux_perf/msm_parser_test.html b/chromium/third_party/catapult/tracing/tracing/extras/importer/linux_perf/msm_parser_test.html
new file mode 100644
index 00000000000..fde592ac1af
--- /dev/null
+++ b/chromium/third_party/catapult/tracing/tracing/extras/importer/linux_perf/msm_parser_test.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<!--
+Copyright 2020 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<link rel="import" href="/tracing/core/test_utils.html">
+<link rel="import" href="/tracing/extras/importer/linux_perf/ftrace_importer.html">
+
+<script>
+'use strict';
+
+tr.b.unittest.testSuite(function() {
+ test('msmImport', function() {
+ const lines = [
+ ' UnityGfxDeviceW-20803 (20764) [007] .... 2569.637650: msm_gpu_submit_flush: id=164270 pid=20803 ring=0:164271 ticks=5854915894', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.638074: msm_gpu_freq_change: new_freq=180', // @suppress longLineCheck
+ ' UnityGfxDeviceW-20803 (20764) [007] .... 2569.638521: msm_gpu_submit_flush: id=164271 pid=20803 ring=0:164272 ticks=5854932654', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.650267: msm_gpu_submit_retired: id=164270 pid=20803 ring=0:164271 elapsed=11198437 ns mhz=179 start=5854916032 end=5855131042', // @suppress longLineCheck
+ ' kworker/u16:1-21183 (21183) [003] .... 2569.650297: msm_gpu_freq_change: new_freq=800', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.652039: msm_gpu_submit_retired: id=164271 pid=20803 ring=0:164272 elapsed=1594895 ns mhz=216 start=5855131119 end=5855161741', // @suppress longLineCheck
+ ' UnityGfxDeviceW-20803 (20764) [007] .... 2569.654153: msm_gpu_submit_flush: id=164272 pid=20803 ring=0:164273 ticks=5855232953', // @suppress longLineCheck
+ ' UnityGfxDeviceW-20803 (20764) [007] .... 2569.654563: msm_gpu_submit_flush: id=164273 pid=20803 ring=0:164274 ticks=5855240817', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.657140: msm_gpu_submit_retired: id=164272 pid=20803 ring=0:164273 elapsed=2771979 ns mhz=799 start=5855233005 end=5855286227', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.659900: msm_gpu_submit_retired: id=164273 pid=20803 ring=0:164274 elapsed=549166 ns mhz=800 start=5855286249 end=5855296793', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.663715: msm_gpu_freq_change: new_freq=267', // @suppress longLineCheck
+ ' UnityGfxDeviceW-20803 (20764) [007] .... 2569.670766: msm_gpu_submit_flush: id=164274 pid=20803 ring=0:164275 ticks=5855552051', // @suppress longLineCheck
+ ' UnityGfxDeviceW-20803 (20764) [007] .... 2569.671356: msm_gpu_submit_flush: id=164275 pid=20803 ring=0:164276 ticks=5855563392', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.676930: msm_gpu_freq_change: new_freq=180', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.679942: msm_gpu_submit_retired: id=164274 pid=20803 ring=0:164275 elapsed=8682343 ns mhz=241 start=5855552151 end=5855718852', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.682724: msm_gpu_submit_retired: id=164275 pid=20803 ring=0:164276 elapsed=1663906 ns mhz=179 start=5855718929 end=5855750876', // @suppress longLineCheck
+ ' UnityGfxDeviceW-20803 (20764) [006] .... 2569.688592: msm_gpu_submit_flush: id=164276 pid=20803 ring=0:164277 ticks=5855894498', // @suppress longLineCheck
+ ' UnityGfxDeviceW-20803 (20764) [006] .... 2569.689192: msm_gpu_submit_flush: id=164277 pid=20803 ring=0:164278 ticks=5855906029', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.693595: msm_gpu_freq_change: new_freq=180', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.699896: msm_gpu_submit_retired: id=164276 pid=20803 ring=0:164277 elapsed=11185572 ns mhz=179 start=5855894608 end=5856109371', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.701729: msm_gpu_submit_retired: id=164277 pid=20803 ring=0:164278 elapsed=1686666 ns mhz=180 start=5856109447 end=5856141831', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.704179: msm_gpu_freq_change: new_freq=180', // @suppress longLineCheck
+ ' UnityGfxDeviceW-20803 (20764) [006] .... 2569.704660: msm_gpu_submit_flush: id=164278 pid=20803 ring=0:164279 ticks=5856203141', // @suppress longLineCheck
+ ' UnityGfxDeviceW-20803 (20764) [006] .... 2569.705313: msm_gpu_submit_flush: id=164279 pid=20803 ring=0:164280 ticks=5856215696', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.715973: msm_gpu_freq_change: new_freq=800', // @suppress longLineCheck
+ ' kworker/u16:1-21183 (21183) [003] .... 2569.715991: msm_gpu_submit_retired: id=164278 pid=20803 ring=0:164279 elapsed=11180989 ns mhz=179 start=5856203256 end=5856417931', // @suppress longLineCheck
+ ' kworker/u16:1-21183 (21183) [003] .... 2569.716802: msm_gpu_submit_retired: id=164279 pid=20803 ring=0:164280 elapsed=876718 ns mhz=669 start=5856418010 end=5856434843', // @suppress longLineCheck
+ ' UnityGfxDeviceW-20803 (20764) [006] .... 2569.721188: msm_gpu_submit_flush: id=164280 pid=20803 ring=0:164281 ticks=5856520661', // @suppress longLineCheck
+ ' UnityGfxDeviceW-20803 (20764) [006] .... 2569.721710: msm_gpu_submit_flush: id=164281 pid=20803 ring=0:164282 ticks=5856530679', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.725951: msm_gpu_submit_retired: id=164280 pid=20803 ring=0:164281 elapsed=2776406 ns mhz=799 start=5856520717 end=5856574024', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.726539: msm_gpu_submit_retired: id=164281 pid=20803 ring=0:164282 elapsed=546458 ns mhz=800 start=5856574047 end=5856584539', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.727104: msm_gpu_freq_change: new_freq=355', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.738225: msm_gpu_freq_change: new_freq=180', // @suppress longLineCheck
+ ' UnityGfxDeviceW-20803 (20764) [006] .... 2569.742288: msm_gpu_submit_flush: id=164282 pid=20803 ring=0:164283 ticks=5856925966', // @suppress longLineCheck
+ ' UnityGfxDeviceW-20803 (20764) [006] .... 2569.742994: msm_gpu_submit_flush: id=164283 pid=20803 ring=0:164284 ticks=5856939530', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.749148: msm_gpu_freq_change: new_freq=180', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.753702: msm_gpu_submit_retired: id=164282 pid=20803 ring=0:164283 elapsed=11166041 ns mhz=179 start=5856926090 end=5857140478', // @suppress longLineCheck
+ ' UnityGfxDeviceW-20803 (20764) [006] .... 2569.754644: msm_gpu_submit_flush: id=164284 pid=20803 ring=0:164285 ticks=5857163320', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.755242: msm_gpu_submit_retired: id=164283 pid=20803 ring=0:164284 elapsed=1697864 ns mhz=179 start=5857140557 end=5857173156', // @suppress longLineCheck
+ ' UnityGfxDeviceW-20803 (20764) [006] .... 2569.755419: msm_gpu_submit_flush: id=164285 pid=20803 ring=0:164286 ticks=5857178216', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.760258: msm_gpu_freq_change: new_freq=800', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.762807: msm_gpu_submit_retired: id=164284 pid=20803 ring=0:164285 elapsed=6796979 ns mhz=329 start=5857173223 end=5857303725', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.763401: msm_gpu_submit_retired: id=164285 pid=20803 ring=0:164286 elapsed=550937 ns mhz=799 start=5857303747 end=5857314325', // @suppress longLineCheck
+ ' UnityGfxDeviceW-20803 (20764) [006] .... 2569.770442: msm_gpu_submit_flush: id=164286 pid=20803 ring=0:164287 ticks=5857466816', // @suppress longLineCheck
+ ' UnityGfxDeviceW-20803 (20764) [006] .... 2569.771292: msm_gpu_submit_flush: id=164287 pid=20803 ring=0:164288 ticks=5857483141', // @suppress longLineCheck
+ ' kworker/u16:5-416 ( 416) [001] .... 2569.773496: msm_gpu_submit_retired: id=164286 pid=20803 ring=0:164287 elapsed=2780833 ns mhz=799 start=5857466871 end=5857520263', // @suppress longLineCheck
+ ' kworker/u16:1-21183 (21183) [003] .... 2569.774162: msm_gpu_freq_change: new_freq=430', // @suppress longLineCheck
+ ];
+ const m = tr.c.TestUtils.newModelWithEvents([lines.join('\n')], {
+ shiftWorldToZero: false
+ });
+ assert.isFalse(m.hasImportWarnings);
+
+ let gpuThread = undefined;
+ m.getAllThreads().forEach(function(t) {
+ switch (t.name) {
+ case 'GPU':
+ gpuThread = t;
+ break;
+ default:
+ assert.fail(t, undefined, 'Unexpected thread named ' + t.name);
+ }
+ });
+ assert.isDefined(gpuThread);
+
+ assert.strictEqual(gpuThread.sliceGroup.length, 17);
+
+ function ticks2ms(ticks) {
+ return ticks / 19200;
+ }
+
+ const queuedDuration = ticks2ms(
+ 5854916032 - /* start= from retire trace */
+ 5854915894); /* ticks= from flush trace */
+ const runningDuration = ticks2ms(
+ 5855131042 - /* end= from retire trace */
+ 5854916032); /* start= from retire trace */
+
+ assert.closeTo(
+ (2569.637650 * 1000.0) + queuedDuration,
+ gpuThread.sliceGroup.slices[0].start,
+ 1e-5);
+ assert.closeTo(
+ runningDuration,
+ gpuThread.sliceGroup.slices[0].duration,
+ 1e-5);
+ });
+});
+</script>
+
diff --git a/chromium/third_party/catapult/tracing/tracing/extras/importer/trace_event_importer.html b/chromium/third_party/catapult/tracing/tracing/extras/importer/trace_event_importer.html
index 54f4dcbaa15..8aa9d5b35ae 100644
--- a/chromium/third_party/catapult/tracing/tracing/extras/importer/trace_event_importer.html
+++ b/chromium/third_party/catapult/tracing/tracing/extras/importer/trace_event_importer.html
@@ -772,7 +772,7 @@ tr.exportTo('tr.e.importer', function() {
// in the main thread, in order to get the correct thread object,
// we should use pid and tid from main thread.
if (data.startTime !== undefined) {
- this.profileInfo_.set(event.id, {
+ this.profileInfo_.set(`${event.pid} ${event.id}`, {
startTime: data.startTime,
pid: event.pid,
tid: event.tid
@@ -791,7 +791,8 @@ tr.exportTo('tr.e.importer', function() {
throw new Error('samples and timeDeltas array should have same length');
}
- const profileTree = this.getOrCreateProfileTree_(sampleType, event.id);
+ const profileTree = this.getOrCreateProfileTree_(sampleType,
+ `${event.pid} ${event.id}`);
const nodes = data[sampleType].nodes;
const samples = data[sampleType].samples;
if (nodes !== undefined) {
@@ -2853,6 +2854,7 @@ tr.exportTo('tr.e.importer', function() {
// In Chromium under //services/resource_coordinator/public see
// mojom/memory_instrumentation/memory_instrumentation.mojom and
// cpp/memory_instrumentation/tracing_observer.cc
+ if (rawVmRegions === null) return;
const vmRegions = new Array(rawVmRegions.length);
for (let i = 0; i < rawVmRegions.length; i++) {
const rawVmRegion = rawVmRegions[i];
diff --git a/chromium/third_party/catapult/tracing/tracing/extras/importer/trace_event_importer_test.html b/chromium/third_party/catapult/tracing/tracing/extras/importer/trace_event_importer_test.html
index 7953ba7c488..133345b9134 100644
--- a/chromium/third_party/catapult/tracing/tracing/extras/importer/trace_event_importer_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/extras/importer/trace_event_importer_test.html
@@ -6627,6 +6627,97 @@ tr.b.unittest.testSuite(function() {
checkParsedAndStreamInput(events, checkModel, false);
});
+ test('importV8SamplesInStreamingFormat_id_collision', function() {
+ function checkModel(m) {
+ const samples = m.samples;
+ assert.strictEqual(m.samples.length, 4);
+ assert.strictEqual(Object.keys(m.processes).length, 2);
+ assert.deepEqual(samples.map(sample => sample.start.toFixed(3)), [
+ '0.011',
+ '0.012',
+ '0.013',
+ '0.016'
+ ]);
+ assert.deepEqual(samples.map(sample => sample.thread.getProcess().pid), [
+ 1,
+ 1,
+ 2,
+ 2
+ ]);
+ assert.deepEqual(samples[0].userFriendlyStack, [
+ 'b url: b.js:1:2 Deoptimized reason: a reason',
+ 'a url: a.js:1:2'
+ ]);
+ assert.deepEqual(samples[1].userFriendlyStack, [
+ 'a url: a.js:1:2'
+ ]);
+ assert.deepEqual(samples[2].userFriendlyStack, [
+ 'd url: d.js:2:3 Deoptimized reason: another reason',
+ ]);
+ assert.deepEqual(samples[3].userFriendlyStack, [
+ 'c url: c.js:2:3',
+ ]);
+ }
+
+ const events = {
+ 'traceEvents': [
+ {'pid': 1, 'tid': 2, 'ts': 3, 'ph': 'P',
+ 'cat': 'disabled-by-default-v8.cpu_profiler',
+ 'name': 'Profile',
+ 'args': {'data': {'startTime': 10}},
+ 'id': 123
+ },
+ {'pid': 2, 'tid': 2, 'ts': 3, 'ph': 'P',
+ 'cat': 'disabled-by-default-v8.cpu_profiler',
+ 'name': 'Profile',
+ 'args': {'data': {'startTime': 10}},
+ 'id': 123
+ },
+ {'pid': 1, 'tid': 3, 'ts': 4, 'ph': 'P',
+ 'cat': 'disabled-by-default-v8.cpu_profiler',
+ 'name': 'Profile',
+ 'args': {
+ 'data': {
+ 'timeDeltas': [1, 1],
+ 'cpuProfile': {
+ 'nodes': [
+ // eslint-disable-next-line
+ {'callFrame': {'functionName': '(root)', 'scriptId': 0}, 'id': 1},
+ // eslint-disable-next-line
+ {'callFrame': {'functionName': 'a', 'url': 'a.js', 'scriptId': 1, 'lineNumber': 1, 'columnNumber': 2}, 'id': 2, 'parent': 1},
+ // eslint-disable-next-line
+ {'callFrame': {'functionName': 'b', 'url': 'b.js', 'scriptId': 2, 'lineNumber': 1, 'columnNumber': 2}, 'deoptReason': 'a reason', 'id': 3, 'parent': 2}
+ ],
+ 'samples': [3, 2]
+ }
+ }
+ },
+ 'id': 123
+ },
+ {'pid': 2, 'tid': 3, 'ts': 4, 'ph': 'P',
+ 'cat': 'disabled-by-default-v8.cpu_profiler',
+ 'name': 'Profile',
+ 'args': {
+ 'data': {
+ 'timeDeltas': [3, 3],
+ 'cpuProfile': {
+ 'nodes': [
+ // eslint-disable-next-line
+ {'callFrame': {'functionName': 'c', 'url': 'c.js', 'scriptId': 3, 'lineNumber': 2, 'columnNumber': 3}, 'id': 4, 'parent': 2},
+ // eslint-disable-next-line
+ {'callFrame': {'functionName': 'd', 'url': 'd.js', 'scriptId': 4, 'lineNumber': 2, 'columnNumber': 3}, 'deoptReason': 'another reason', 'id': 5, 'parent': 3}
+ ],
+ 'samples': [5, 4]
+ }
+ }
+ },
+ 'id': 123
+ }
+ ]
+ };
+ checkParsedAndStreamInput(events, checkModel, false);
+ });
+
test('scopedIdForEvent_defaultScopeAsyncEvent', function() {
const event = {pid: 1, ph: 'b', id: '0x1000'};
const id = tr.e.importer.TraceEventImporter.scopedIdForEvent_(event);
diff --git a/chromium/third_party/catapult/tracing/tracing/extras/symbolizer/symbolize_trace.py b/chromium/third_party/catapult/tracing/tracing/extras/symbolizer/symbolize_trace.py
index b15882a4ce6..cb5c4170b14 100755
--- a/chromium/third_party/catapult/tracing/tracing/extras/symbolizer/symbolize_trace.py
+++ b/chromium/third_party/catapult/tracing/tracing/extras/symbolizer/symbolize_trace.py
@@ -284,7 +284,6 @@ class NodeWrapper(object):
'modified' flag.
"""
- pass
class MemoryMap(NodeWrapper):
@@ -341,7 +340,7 @@ class MemoryMap(NodeWrapper):
def file_offset(self, value):
self._file_offset = value
- def __cmp__(self, other):
+ def compare(self, other): # pylint: disable=invalid-name
if isinstance(other, type(self)):
other_start_address = other._start_address
elif isinstance(other, six.integer_types):
@@ -350,10 +349,31 @@ class MemoryMap(NodeWrapper):
raise Exception('Cannot compare with %s' % type(other))
if self._start_address < other_start_address:
return -1
- elif self._start_address > other_start_address:
+ if self._start_address > other_start_address:
return 1
- else:
- return 0
+ return 0
+
+ if six.PY2:
+ def __cmp__(self, other):
+ return self.compare(other)
+ else:
+ def __eq__(self, other):
+ return self.compare(other) == 0
+
+ def __ne__(self, other):
+ return self.compare(other) != 0
+
+ def __lt__(self, other):
+ return self.compare(other) < 0
+
+ def __le__(self, other):
+ return self.compare(other) <= 0
+
+ def __gt__(self, other):
+ return self.compare(other) > 0
+
+ def __ge__(self, other):
+ return self.compare(other) >= 0
def __repr__(self):
return 'Region(0x{:X} - 0x{:X}, {})'.format(
@@ -369,7 +389,8 @@ class MemoryMap(NodeWrapper):
file_offset)
# Keep track of code-identifier when present.
if 'ts' in region_node and 'sz' in region_node:
- region._code_id = '%08X%X' % (int(region_node['ts'], 16), region.size)
+ region._code_id = '%08X%X' % (int(str(region_node['ts']), 16),
+ region.size)
regions.append(region)
regions.sort()
@@ -433,7 +454,7 @@ class MemoryMap(NodeWrapper):
region_index = bisect.bisect_right(self._regions, address) - 1
if region_index >= 0:
region = self._regions[region_index]
- if address >= region.start_address and address < region.end_address:
+ if region.start_address <= address < region.end_address:
return region
return None
@@ -948,6 +969,7 @@ class Trace(NodeWrapper):
self._version = None
self._is_chromium = True
self._is_64bit = False
+ self._os_arch = None
self._is_win = False
self._is_mac = False
self._is_linux = False
@@ -983,6 +1005,7 @@ class Trace(NodeWrapper):
self._is_64bit = (
re.search('x86_64', metadata['os-arch'], re.IGNORECASE) and
not re.search('WOW64', metadata['user-agent'], re.IGNORECASE))
+ self._os_arch = metadata['os-arch']
# Android traces produced via 'chrome://inspect/?tracing#devices' are
# just list of events.
@@ -1093,6 +1116,10 @@ class Trace(NodeWrapper):
return self._os
@property
+ def os_arch(self):
+ return self._os_arch
+
+ @property
def is_chromium(self):
return self._is_chromium
@@ -1151,12 +1178,11 @@ class Trace(NodeWrapper):
if self._heap_dump_version is None:
self._heap_dump_version = version
return version
- elif self._heap_dump_version != version:
+ if self._heap_dump_version != version:
raise Exception(
("Inconsistent trace file: first saw '{}' heap dump version, "
"then '{}'.").format(self._heap_dump_version, version))
- else:
- return version
+ return version
class SymbolizableFile(object):
@@ -1218,12 +1244,13 @@ def ResolveSymbolizableFiles(processes, trace_from_win, frame_as_object_type):
continue
ResolveSymbolizableFilesByNodes(
symfile_by_path, process.memory_map,
- process.stack_frame_map.frame_by_id.values(), trace_from_win)
+ list(process.stack_frame_map.frame_by_id.values()), trace_from_win)
if frame_as_object_type:
- ResolveSymbolizableFilesByNodes(symfile_by_path, process.memory_map,
- process.type_name_map.type_by_id.values(),
- trace_from_win)
+ ResolveSymbolizableFilesByNodes(
+ symfile_by_path, process.memory_map,
+ list(process.type_name_map.type_by_id.values()),
+ trace_from_win)
return list(symfile_by_path.values())
@@ -1277,7 +1304,8 @@ class BreakpadSymbolsModule(object):
class Symbolizer(object):
"""Encapsulates platform-specific symbolization logic."""
- def __init__(self, addr2line_executable):
+ def __init__(self, addr2line_executable, os_arch):
+ self._os_arch = os_arch
self.is_mac = sys.platform == 'darwin'
self.is_win = sys.platform == 'win32'
if self.is_mac:
@@ -1331,10 +1359,11 @@ class Symbolizer(object):
for address in symfile.frames_by_address.keys():
address_file.write('{:x} '.format(address + load_address))
- cmd = [self.symbolizer_path, '-arch', 'x86_64', '-l',
+ architecture = 'arm64e' if self._os_arch == 'arm64' else 'x86_64'
+ cmd = [self.symbolizer_path, '-arch', architecture, '-l',
'0x%x' % load_address, '-o', symfile.symbolizable_path,
'-f', address_file_path]
- output_array = subprocess.check_output(cmd).split('\n')
+ output_array = six.ensure_str(subprocess.check_output(cmd)).split('\n')
for i, frames in enumerate(symfile.frames_by_address.values()):
symbolized_name = self._matcher.Match(output_array[i])
@@ -1364,8 +1393,9 @@ class Symbolizer(object):
stderr=None)
addrs = ["%x" % relative_pc for relative_pc in
symfile.frames_by_address.keys()]
- (stdout_data, _) = proc.communicate('\n'.join(addrs))
+ (stdout_data, _) = proc.communicate(six.ensure_binary('\n'.join(addrs)))
# On windows, lines may contain '\r' character: e.g. "RtlUserThreadStart\r".
+ stdout_data = six.ensure_str(stdout_data)
stdout_data.replace('\r', '')
stdout_data = stdout_data.split('\n')
@@ -1438,11 +1468,11 @@ class Symbolizer(object):
if self.is_win:
extension = os.path.splitext(file_path)[1].lower()
return extension in ['.dll', '.exe']
- else:
- result = subprocess.check_output(['file', '-0', file_path])
- type_string = result[result.find('\0') + 1:]
- return bool(re.match(r'.*(ELF|Mach-O) (32|64)-bit\b.*',
- type_string, re.DOTALL))
+ result = six.ensure_str(
+ subprocess.check_output(['file', '-0', file_path]))
+ type_string = result[result.find('\0') + 1:]
+ return bool(re.match(r'.*(ELF|Mach-O) (32|64)-bit\b.*',
+ type_string, re.DOTALL))
def SymbolizeFiles(symfiles, symbolizer):
@@ -1654,9 +1684,11 @@ def FetchAndExtractBreakpadSymbols(symbol_base_directory,
def OpenTraceFile(file_path, mode):
if file_path.endswith('.gz'):
- return gzip.open(file_path, mode + 'b')
- else:
- return open(file_path, mode + 't')
+ if six.PY2:
+ return gzip.open(file_path, mode + 'b')
+ return gzip.open( # pylint: disable=unexpected-keyword-arg
+ file_path, mode + 't', encoding='utf-8', newline='')
+ return open(file_path, mode + 't')
def FetchAndExtractSymbolsMac(symbol_base_directory, version,
@@ -1710,6 +1742,7 @@ def FetchAndExtractSymbolsWin(symbol_base_directory, version, is64bit,
target = open(os.path.join(destination, filename), 'wb')
with source, target:
shutil.copyfileobj(source, target)
+ return True
folder = "win64" if is64bit else "win"
# Clang build (M61+)
@@ -1726,16 +1759,19 @@ def FetchAndExtractSymbolsWin(symbol_base_directory, version, is64bit,
return True
os.makedirs(symbol_sub_dir)
- DownloadAndExtractZipFile(
+ if not DownloadAndExtractZipFile(
os.path.join(symbol_base_directory,
"chrome-" + folder + "-" + version + "-syms.zip"),
gcs_folder + "chrome-win32-syms.zip",
- symbol_sub_dir)
- DownloadAndExtractZipFile(
+ symbol_sub_dir):
+ return False
+
+ if not DownloadAndExtractZipFile(
os.path.join(symbol_base_directory,
"chrome-" + folder + "-" + version + ".zip"),
gcs_folder + "chrome-" + folder + folder_suffix + ".zip",
- symbol_sub_dir)
+ symbol_sub_dir):
+ return False
return True
@@ -1807,11 +1843,6 @@ def main(args):
if options.frame_as_object_type and not options.is_cast:
sys.exit("Frame-as-object-type is only supported for cast.")
- symbolizer = Symbolizer(options.addr2line_executable)
- if (symbolizer.symbolizer_path is None and
- not options.use_breakpad_symbols):
- sys.exit("Can't symbolize - no %s in PATH." % symbolizer.binary)
-
trace_file_path = options.file
print('Reading trace file...')
@@ -1819,6 +1850,11 @@ def main(args):
trace = Trace(json.load(trace_file), options.frame_as_object_type)
print('Trace loaded for %s/%s' % (trace.os, trace.version))
+ symbolizer = Symbolizer(options.addr2line_executable, trace.os_arch)
+ if (symbolizer.symbolizer_path is None and
+ not options.use_breakpad_symbols):
+ sys.exit("Can't symbolize - no %s in PATH." % symbolizer.binary)
+
trace.is_chromium = options.is_local_build
trace.is_cast = options.is_cast
diff --git a/chromium/third_party/catapult/tracing/tracing/extras/symbolizer/symbolize_trace_macho_reader.py b/chromium/third_party/catapult/tracing/tracing/extras/symbolizer/symbolize_trace_macho_reader.py
index ff05cc6ba86..344a2437aeb 100644
--- a/chromium/third_party/catapult/tracing/tracing/extras/symbolizer/symbolize_trace_macho_reader.py
+++ b/chromium/third_party/catapult/tracing/tracing/extras/symbolizer/symbolize_trace_macho_reader.py
@@ -7,6 +7,7 @@ from __future__ import division
from __future__ import print_function
import re
import subprocess
+import six
from six.moves import range # pylint: disable=redefined-builtin
@@ -16,7 +17,7 @@ def ReadMachOTextLoadAddress(file_name):
"""
regex = re.compile(r".* vmaddr 0x([\dabcdef]*)")
cmd = ["otool", "-l", file_name]
- output = subprocess.check_output(cmd).split('\n')
+ output = six.ensure_str(subprocess.check_output(cmd)).split('\n')
for i in range(len(output) - 3):
# It's possible to use a regex here instead, but these conditionals are much
# clearer.
diff --git a/chromium/third_party/catapult/tracing/tracing/extras/symbolizer/symbolize_trace_macho_reader_unittest.py b/chromium/third_party/catapult/tracing/tracing/extras/symbolizer/symbolize_trace_macho_reader_unittest.py
index f0058abda51..6e812583c79 100644
--- a/chromium/third_party/catapult/tracing/tracing/extras/symbolizer/symbolize_trace_macho_reader_unittest.py
+++ b/chromium/third_party/catapult/tracing/tracing/extras/symbolizer/symbolize_trace_macho_reader_unittest.py
@@ -3,6 +3,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import os
import sys
import unittest
@@ -14,12 +15,16 @@ class AtosRegexTest(unittest.TestCase):
if sys.platform != "darwin":
return
file_name = "/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit"
- result = symbolize_trace_macho_reader.ReadMachOTextLoadAddress(file_name)
- self.assertNotEqual(None, result)
+ # TODO(crbug.com/1275181)
+ if os.path.exists(file_name):
+ result = symbolize_trace_macho_reader.ReadMachOTextLoadAddress(file_name)
+ self.assertNotEqual(None, result)
file_name = "/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa"
- result = symbolize_trace_macho_reader.ReadMachOTextLoadAddress(file_name)
- self.assertNotEqual(None, result)
+ # TODO(crbug.com/1275181)
+ if os.path.exists(file_name):
+ result = symbolize_trace_macho_reader.ReadMachOTextLoadAddress(file_name)
+ self.assertNotEqual(None, result)
if __name__ == '__main__':
diff --git a/chromium/third_party/catapult/tracing/tracing/importer/find_load_expectations.html b/chromium/third_party/catapult/tracing/tracing/importer/find_load_expectations.html
index b4db84afe45..5d83362b0f4 100644
--- a/chromium/third_party/catapult/tracing/tracing/importer/find_load_expectations.html
+++ b/chromium/third_party/catapult/tracing/tracing/importer/find_load_expectations.html
@@ -317,24 +317,29 @@ tr.exportTo('tr.importer', function() {
for (let index = 0; index < navStartEvents.length; index++) {
const currNavigation = navStartEvents[index];
let url;
- let isLoadingMainFrame = false;
+ let isOutermostMainFrame = false;
if (currNavigation.args.data) {
url = currNavigation.args.data.documentLoaderURL;
- isLoadingMainFrame = currNavigation.args.data.isLoadingMainFrame;
+ // If isOutermostMainFrame is available, use it, if not use
+ // isLoadingMainFrame.
+ isOutermostMainFrame =
+ (currNavigation.args.data.isOutermostMainFrame !== undefined) ?
+ currNavigation.args.data.isOutermostMainFrame :
+ currNavigation.args.data.isLoadingMainFrame;
} else {
// TODO(#4358): Delete old path of obtaining URL.
const snapshot = findFrameLoaderSnapshotAt(
rendererHelper, frameIdRef, currNavigation.start);
if (snapshot) {
url = snapshot.args.documentLoaderURL;
- isLoadingMainFrame = snapshot.args.isLoadingMainFrame;
+ isOutermostMainFrame = snapshot.args.isLoadingMainFrame;
}
}
// Filter navigationStartEvents that do not correspond to a loading main
// frame, or has a URL that we do not care about.
- if (!isLoadingMainFrame) continue;
+ if (!isOutermostMainFrame) continue;
if (url === undefined || IGNORE_URLS.includes(url)) continue;
if (prevNavigation.navigationEvent !== undefined) {
diff --git a/chromium/third_party/catapult/tracing/tracing/importer/import.html b/chromium/third_party/catapult/tracing/tracing/importer/import.html
index 8893120c2c5..00892071d69 100644
--- a/chromium/third_party/catapult/tracing/tracing/importer/import.html
+++ b/chromium/third_party/catapult/tracing/tracing/importer/import.html
@@ -235,11 +235,23 @@ tr.exportTo('tr.importer', function() {
// Create auditors
let auditors = [];
addImportStage('Adding arbitrary data to model...', () => {
- auditors = this.importOptions_.auditorConstructors.map(
- auditorConstructor => new auditorConstructor(this.model_));
+ for (const auditorConstructor of
+ this.importOptions_.auditorConstructors) {
+ try {
+ auditors.push(new auditorConstructor(this.model_));
+ } catch (e) {
+ console.error('Failed to construct an auditor:');
+ console.error(e);
+ }
+ }
auditors.forEach((auditor) => {
- auditor.runAnnotate();
- auditor.installUserFriendlyCategoryDriverIfNeeded();
+ try {
+ auditor.runAnnotate();
+ auditor.installUserFriendlyCategoryDriverIfNeeded();
+ } catch (e) {
+ console.error('Failed to run an auditor:');
+ console.error(e);
+ }
});
});
@@ -275,8 +287,13 @@ tr.exportTo('tr.importer', function() {
// Build the UserModel.
addImportStage('Building UserModel...', () => {
- const userModelBuilder = new tr.importer.UserModelBuilder(this.model_);
- userModelBuilder.buildUserModel();
+ try {
+ const userModelBuilder = new tr.importer.UserModelBuilder(this.model_);
+ userModelBuilder.buildUserModel();
+ } catch (e) {
+ console.error('Failed to build user model');
+ console.error(e);
+ }
});
// Sort Expectations.
diff --git a/chromium/third_party/catapult/tracing/tracing/importer/import_test.html b/chromium/third_party/catapult/tracing/tracing/importer/import_test.html
index 77787402719..55d5eb797fe 100644
--- a/chromium/third_party/catapult/tracing/tracing/importer/import_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/importer/import_test.html
@@ -213,7 +213,8 @@ tr.b.unittest.testSuite(function() {
p.memoryDumps[2].mostRecentVmRegions);
});
- test('setsModelStatsTraceImportDurationMs', function() {
+// TODO(crbug.com/1315423): Fix and re-enable test to pass on all trybots.
+ skipTest('setsModelStatsTraceImportDurationMs', function() {
const traceEvents = [
{ts: 1000, pid: 1, tid: 3, ph: 'B', cat: 'c', name: 'taskB', args: {
my_object: {id_ref: '0x1000'}
diff --git a/chromium/third_party/catapult/tracing/tracing/importer/proto_expectation.html b/chromium/third_party/catapult/tracing/tracing/importer/proto_expectation.html
index 3deaac7d934..4efb9c079af 100644
--- a/chromium/third_party/catapult/tracing/tracing/importer/proto_expectation.html
+++ b/chromium/third_party/catapult/tracing/tracing/importer/proto_expectation.html
@@ -83,8 +83,8 @@ tr.exportTo('tr.importer', function() {
if (this.type !== ProtoExpectation.IGNORED_TYPE && !this.isValid) {
model.importWarning({
type: 'ProtoExpectation',
- message: 'Please file a bug with this trace. ' + this.debug(),
- showToUser: true
+ message: this.debug(),
+ showToUser: false
});
return undefined;
}
diff --git a/chromium/third_party/catapult/tracing/tracing/importer/user_model_builder_test.html b/chromium/third_party/catapult/tracing/tracing/importer/user_model_builder_test.html
index e4eeaa972fd..f26b7a19241 100644
--- a/chromium/third_party/catapult/tracing/tracing/importer/user_model_builder_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/importer/user_model_builder_test.html
@@ -278,8 +278,9 @@ tr.b.unittest.testSuite(function() {
const verifier = new UserExpectationVerifier();
verifier.customizeModelCallback = function(model) {
model.rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader',
- 25, {isLoadingMainFrame: true, frame: {id_ref: '0xdeadbeef'},
- documentLoaderURL: 'http://example.com'});
+ 25, { isOutermostMainFrame: true, isLoadingMainFrame: true,
+ frame: {id_ref: '0xdeadbeef'},
+ documentLoaderURL: 'http://example.com'});
ChromeTestUtils.addFrameEvent(model, {start: 0, end: 10});
model.rendererMain.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
cat: 'blink.user_timing',
@@ -321,8 +322,9 @@ tr.b.unittest.testSuite(function() {
verifier.customizeModelCallback = function(model) {
ChromeTestUtils.addFrameEvent(model, {start: 0, end: 10});
model.rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader',
- 15, {isLoadingMainFrame: true, frame: {id_ref: '0xdeadbeef'},
- documentLoaderURL: 'http://example.com'});
+ 15, { isOutermostMainFrame: true, isLoadingMainFrame: true,
+ frame: {id_ref: '0xdeadbeef'},
+ documentLoaderURL: 'http://example.com'});
ChromeTestUtils.addFrameEvent(model, {start: 20, end: 40});
model.rendererMain.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
cat: 'blink.user_timing',
@@ -1111,8 +1113,9 @@ tr.b.unittest.testSuite(function() {
const verifier = new UserExpectationVerifier();
verifier.customizeModelCallback = function(model) {
model.rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader',
- 25, {isLoadingMainFrame: true, frame: {id_ref: '0xdeadbeef'},
- documentLoaderURL: 'http://example.com'});
+ 25, { isOutermostMainFrame: true, isLoadingMainFrame: true,
+ frame: {id_ref: '0xdeadbeef'},
+ documentLoaderURL: 'http://example.com'});
model.rendererMain.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
cat: 'blink.user_timing',
title: 'navigationStart',
@@ -1207,8 +1210,9 @@ tr.b.unittest.testSuite(function() {
verifier.customizeModelCallback = function(model) {
ChromeTestUtils.addFrameEvent(model, {start: 0, end: 10});
model.rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader',
- 25, {isLoadingMainFrame: true, frame: {id_ref: '0xdeadbeef'},
- documentLoaderURL: 'http://example.com'});
+ 25, { isOutermostMainFrame: true, isLoadingMainFrame: true,
+ frame: {id_ref: '0xdeadbeef'},
+ documentLoaderURL: 'http://example.com'});
ChromeTestUtils.addFrameEvent(model, {start: 10, end: 20});
model.rendererMain.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
cat: 'blink.user_timing',
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/__init__.py b/chromium/third_party/catapult/tracing/tracing/metrics/__init__.py
index cffcee63c42..c115b7fe69d 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/__init__.py
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/__init__.py
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import os
import sys
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/all_metrics.html b/chromium/third_party/catapult/tracing/tracing/metrics/all_metrics.html
index 694f443fab7..6ed6dd188fd 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/all_metrics.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/all_metrics.html
@@ -9,10 +9,14 @@ found in the LICENSE file.
<link rel="import" href="/tracing/metrics/android_systrace_metric.html">
<link rel="import" href="/tracing/metrics/blink/gc_metric.html">
<link rel="import" href="/tracing/metrics/blink/leak_detection_metric.html">
+<link rel="import" href="/tracing/metrics/blink/resource_metric.html">
<link rel="import" href="/tracing/metrics/console_error_metric.html">
+<link rel="import" href="/tracing/metrics/core_web_vitals_metric.html">
+<link rel="import" href="/tracing/metrics/count_sum_metric.html">
<link rel="import" href="/tracing/metrics/cpu_process_metric.html">
+<link rel="import" href="/tracing/metrics/custom_metric.html">
<link rel="import" href="/tracing/metrics/media_metric.html">
-<link rel="import" href="/tracing/metrics/memory_ablation_metric.html">
+<link rel="import" href="/tracing/metrics/partition_alloc/pcscan_metric.html">
<link rel="import" href="/tracing/metrics/rendering/rendering_metric.html">
<link rel="import" href="/tracing/metrics/reported_by_page_metric.html">
<link rel="import" href="/tracing/metrics/sample_exception_metric.html">
@@ -32,6 +36,7 @@ found in the LICENSE file.
<link rel="import" href="/tracing/metrics/system_health/rects_based_speed_index_metric.html">
<link rel="import" href="/tracing/metrics/system_health/responsiveness_metric.html">
<link rel="import" href="/tracing/metrics/system_health/screenshots_based_speed_index_metric.html">
+<link rel="import" href="/tracing/metrics/system_health/weblayer_startup_metric.html">
<link rel="import" href="/tracing/metrics/system_health/webview_startup_metric.html">
<link rel="import" href="/tracing/metrics/tabs_metric.html">
<link rel="import" href="/tracing/metrics/tracing_metric.html">
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/android_startup_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/android_startup_metric.html
index 702cdbf5fea..390b02df412 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/android_startup_metric.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/android_startup_metric.html
@@ -5,55 +5,113 @@ Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
+<link rel="import" href="/tracing/extras/chrome/event_finder_utils.html">
<link rel="import" href="/tracing/metrics/metric_registry.html">
<link rel="import" href="/tracing/value/histogram.html">
<script>
'use strict';
-// The |androidStartupMetric| produces metrics that start counting at the
-// earliest moment the Chrome code on Android is executed.
-// A few histograms are produced with the names as described below:
+// The |androidStartupMetric| produces metrics that (unless noted otherwise)
+// start counting at the earliest moment the Chrome code on Android is
+// executed. A few histograms are produced with the names as described below:
//
-// 1. messageloop_start_time - time till the message loop of the browser main
-// starts processing posted tasts (after having loaded the Profile)
-// 2. experimental_content_start_time - time when the renderer enters the main
-// entrypoint.
-// 3. experimental_navigation_start_time - This roughly corresponds to the time
-// the initial navigation network request is sent.
-// 4. navigation_commit_time - This is when the renderer has received the first
-// part of the response from the network and started loading the page.
-// 5. first_contentful_paint_time - time to the first contentful paint of the
-// page loaded at startup
+// * messageloop_start_time - Time till the message loop of the browser main
+// starts processing posted tasks (after having loaded the Profile)
+//
+// * experimental_navigation_start_time - This roughly corresponds to the time
+// the initial navigation network request is sent on the UI thread
+//
+// * experimental_network_request_start_time - Time until the first network
+// request starts in the netlog. The actual bytes will be sent to the network
+// slightly later: after disk cache responds. This metric can be used even for
+// netowrk loads that are served from the disk cache. Currently relies on
+// NetworkService running in the browser process.
+//
+// * navigation_commit_time - This is when the renderer has received the first
+// part of the response from the network after all redirects and started
+// loading the page. Recorded when the confirmation is received on the browser
+// UI thread.
+//
+// * first_contentful_paint_time - Time to the first 'contentful' paint of the
+// page loaded at startup
+//
+// * process_create_to_app_start_time - Time from process creation until the
+// application starts. The end time of this event will be the same as the
+// start time of messageloop_start_time.
//
// The metric also supports multiple browser restarts, in this case multiple
// samples would be added to the histograms above.
tr.exportTo('tr.metrics.sh', function() {
const MESSAGE_LOOP_EVENT_NAME = 'Startup.BrowserMessageLoopStartTime';
- const CONTENT_START_EVENT_NAME = 'content::Start';
const NAVIGATION_EVENT_NAME = 'Navigation StartToCommit';
const FIRST_CONTENTFUL_PAINT_EVENT_NAME = 'firstContentfulPaint';
+ const APPLICATION_START_EVENT_NAME =
+ 'Startup.LoadTime.ProcessCreateToApplicationStart';
+ const REQUEST_ALIVE = 'REQUEST_ALIVE';
+
+ function isGetRequest(event) {
+ if (event.args &&
+ event.args.params &&
+ event.args.params.method == 'GET') {
+ return true;
+ }
+ return false;
+ }
+
+ function findRequestEventAfterNavigation(networkEvents, range) {
+ let requestStart = range.max;
+ let requestEvent = null;
+ for (const event of networkEvents) {
+ if (isGetRequest(event)) {
+ for (const subSlice of event.subSlices) {
+ if (subSlice.title === REQUEST_ALIVE &&
+ range.min <= subSlice.start && subSlice.start < requestStart) {
+ requestStart = subSlice.start;
+ requestEvent = subSlice;
+ }
+ }
+ }
+ }
+ return requestEvent;
+ }
+
function androidStartupMetric(histograms, model) {
// Walk the browser slices, extract timestamps for the browser start,
// message loop start.
let messageLoopStartEvents = [];
- let navigationEvents = [];
+ let applicationStartEvents = [];
+ let navigationPairs = [];
+
+ function organizeBrowserEventByTitle(event, process) {
+ if (event.title === MESSAGE_LOOP_EVENT_NAME) {
+ messageLoopStartEvents.push(event);
+ } else if (event.title === APPLICATION_START_EVENT_NAME) {
+ applicationStartEvents.push(event);
+ } else if (event.title === NAVIGATION_EVENT_NAME) {
+ const networkEvents =
+ tr.e.chrome.EventFinderUtils.getNetworkEventsInRange(process,
+ event.range);
+ const requestEvent = findRequestEventAfterNavigation(
+ networkEvents, event.range);
+ navigationPairs.push({
+ 'nav': event,
+ 'req': requestEvent,
+ });
+ }
+ }
+
const chromeHelper =
model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);
if (!chromeHelper) return;
for (const helper of chromeHelper.browserHelpers) {
for (const ev of helper.mainThread.asyncSliceGroup.childEvents()) {
- if (ev.title === MESSAGE_LOOP_EVENT_NAME) {
- messageLoopStartEvents.push(ev);
- } else if (ev.title === NAVIGATION_EVENT_NAME) {
- navigationEvents.push(ev);
- }
+ organizeBrowserEventByTitle(ev, helper.process);
}
}
// Walk the renderer slices and extract the 'first contentful paint'
// histogram samples.
- let contentStartEvents = [];
let firstContentfulPaintEvents = [];
const rendererHelpers = chromeHelper.rendererHelpers;
const pids = Object.keys(rendererHelpers);
@@ -65,38 +123,28 @@ tr.exportTo('tr.metrics.sh', function() {
// There are usually several 'First Contentful Paint' events recorded
// for each page load. Take only the first one per renderer.
break;
- } else if (ev.title === CONTENT_START_EVENT_NAME) {
- contentStartEvents.push(ev);
}
}
}
// Fallback to scanning all processes if important events are not found.
let totalBrowserStarts = messageLoopStartEvents.length;
- let totalContentStartEvents = contentStartEvents.length;
let totalFcpEvents = firstContentfulPaintEvents.length;
- let totalNavigations = navigationEvents.length;
- if (totalFcpEvents !== totalBrowserStarts ||
- totalNavigations !== totalBrowserStarts ||
- totalContentStartEvents !== totalBrowserStarts ||
+ if (totalBrowserStarts !== totalFcpEvents ||
+ totalBrowserStarts !== navigationPairs.length ||
+ totalBrowserStarts !== applicationStartEvents.length ||
totalBrowserStarts === 0) {
- messageLoopStartEvents = [];
- contentStartEvents = [];
- navigationEvents = [];
- firstContentfulPaintEvents = [];
+ messageLoopStartEvents.length = 0;
+ navigationPairs.length = 0;
+ firstContentfulPaintEvents.length = 0;
+ applicationStartEvents.length = 0;
// Sometimes either the browser process or the renderer process does not
// have the proper name attached. This often happens when both chrome
// trace and systrace are merged. Other multi-process trickery, like
// Perfetto, may also cause this.
for (const proc of Object.values(model.processes)) {
for (const ev of proc.getDescendantEvents()) {
- if (ev.title === MESSAGE_LOOP_EVENT_NAME) {
- messageLoopStartEvents.push(ev);
- } else if (ev.title === NAVIGATION_EVENT_NAME) {
- navigationEvents.push(ev);
- } else if (ev.title === CONTENT_START_EVENT_NAME) {
- contentStartEvents.push(ev);
- }
+ organizeBrowserEventByTitle(ev, proc);
}
for (const ev of proc.getDescendantEvents()) {
if (ev.title === FIRST_CONTENTFUL_PAINT_EVENT_NAME) {
@@ -106,25 +154,65 @@ tr.exportTo('tr.metrics.sh', function() {
}
}
totalBrowserStarts = messageLoopStartEvents.length;
- totalContentStartEvents = contentStartEvents.length;
- totalNavigations = navigationEvents.length;
totalFcpEvents = firstContentfulPaintEvents.length;
}
- // Sometimes a number of early trace events are not recorded because tracing
- // takes time to start. This leads to having more FCP events than
- // messageloop_start events. As a workaround ignore the FCP events for which
- // there are no browser starts. Navigation and content start events are
- // recorded on a best effort basis if they are found in the trace; their
- // absence doesn't cause FCP events to be dropped.
+ // Sort the events by start time.
function orderEvents(event1, event2) {
return event1.start - event2.start;
}
messageLoopStartEvents.sort(orderEvents);
- contentStartEvents.sort(orderEvents);
- navigationEvents.sort(orderEvents);
+ applicationStartEvents.sort(orderEvents);
firstContentfulPaintEvents.sort(orderEvents);
+ function orderPairs(pair1, pair2) {
+ return pair1['nav'].start - pair2['nav'].start;
+ }
+ navigationPairs.sort(orderPairs);
+
+ // Remove spurious navigation events. Only one 'Navigation StartToCommit'
+ // event should remain for each browser session. When multiple events are
+ // encountered for a browsing session, remove all except the first one. The
+ // first navigation event looked more realistic for the story
+ // maps_pwa:with_http_cache (http://crbug.com/1307774).
+ let filteredNavigationPairs = [];
+ let filteredRequestsFollowingNavigation = [];
+ let navigation_index = 0;
+ let messageloop_index = 0;
+ do {
+ // Set |browserStart| as the upper limit for the set of navigations to
+ // select from.
+ let browserStart = Number.POSITIVE_INFINITY;
+ if (messageloop_index < messageLoopStartEvents.length) {
+ browserStart = messageLoopStartEvents[messageloop_index].start;
+ }
+ // From navigation events preceding |browserStart| take the first one,
+ // skip others.
+ let navigationFound = false;
+ for (; navigation_index < navigationPairs.length; navigation_index++) {
+ // Each request event has to be at the same index as its corresponding
+ // navigation event. Take either both of them or none.
+ const navPair = navigationPairs[navigation_index];
+ const navEvent = navPair['nav'];
+ const requestEvent = navPair['req'];
+ if (navEvent.start >= browserStart) {
+ break;
+ }
+ if (!navigationFound) {
+ if (messageloop_index === 0) {
+ throw new Error('Found a navigation event before browser start');
+ }
+ filteredNavigationPairs.push(navPair);
+ navigationFound = true;
+ }
+ }
+ // Run the last iteration with |browserStart| as positive infinity.
+ } while (messageloop_index++ <= messageLoopStartEvents.length);
+ navigationPairs = filteredNavigationPairs;
+
+ // Verify the number of FCP events to avoid pairing them to browser starts
+ // incorrectly. Absence of navigation events does not cause FCP events to be
+ // dropped.
if (totalFcpEvents < totalBrowserStarts) {
throw new Error('Found fewer FCP events (' + totalFcpEvents +
') than browser starts (' + totalBrowserStarts + ')');
@@ -135,47 +223,44 @@ tr.exportTo('tr.metrics.sh', function() {
const messageLoopStartHistogram = histograms.createHistogram(
'messageloop_start_time',
tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, []);
- const contentStartHistogram = histograms.createHistogram(
- 'experimental_content_start_time',
- tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, []);
const navigationStartHistogram = histograms.createHistogram(
'experimental_navigation_start_time',
tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, []);
+ const requestStartHistogram = histograms.createHistogram(
+ 'experimental_network_request_start_time',
+ tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, []);
const navigationCommitHistogram = histograms.createHistogram(
'navigation_commit_time',
tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, []);
const firstContentfulPaintHistogram = histograms.createHistogram(
'first_contentful_paint_time',
tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, []);
- // The earliest browser start is skipped because it is affected by the state
- // of the system coming from the time before the benchmark started. Removing
- // these influencing factors allows reducing measurement noise.
- // Note: Two early starts are ignored below, the reasons for spurious
- // slowdowns of the 2nd run are not known yet, see http://crbug.com/891797.
- let contentIndex = 0;
+ const applicationStartHistogram = histograms.createHistogram(
+ 'process_create_to_app_start_time',
+ tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, []);
+ // The earliest 2 browser starts are skipped to reduce measurement noise.
+ // See http://crbug.com/891797.
let navIndex = 0;
let fcpIndex = 0;
for (let loopStartIndex = 0; loopStartIndex < totalBrowserStarts;) {
- const startEvent = messageLoopStartEvents[loopStartIndex];
+ const loopStartEvent = messageLoopStartEvents[loopStartIndex];
+ // There should be a corresponding application start event for each
+ // message loop start event.
+ const applicationStartEvent = applicationStartEvents[loopStartIndex];
if (fcpIndex === totalFcpEvents) {
break;
}
// Skip all events that appear before the next browser start.
- const contentStartEvent = contentIndex < contentStartEvents.length ?
- contentStartEvents[contentIndex] : null;
- if (contentStartEvent && contentStartEvent.start < startEvent.start) {
- contentIndex++;
- continue;
- }
- const navEvent = navIndex < navigationEvents.length ?
- navigationEvents[navIndex] : null;
- if (navEvent && navEvent.start < startEvent.start) {
+ const navPair = navIndex < navigationPairs.length ?
+ navigationPairs[navIndex] : null;
+ const navEvent = navPair ? navPair['nav'] : null;
+ if (navEvent && navEvent.start < loopStartEvent.start) {
navIndex++;
continue;
}
const fcpEvent = firstContentfulPaintEvents[fcpIndex];
- if (fcpEvent.start < startEvent.start) {
+ if (fcpEvent.start < loopStartEvent.start) {
fcpIndex++;
continue;
}
@@ -190,25 +275,30 @@ tr.exportTo('tr.metrics.sh', function() {
}
// Record the histograms.
- messageLoopStartHistogram.addSample(startEvent.duration,
- {events: new tr.v.d.RelatedEventSet([startEvent])});
- if (contentStartEvent) {
- contentStartHistogram.addSample(
- contentStartEvent.start - startEvent.start,
- {events: new tr.v.d.RelatedEventSet([startEvent,
- contentStartEvent])});
- }
+ messageLoopStartHistogram.addSample(loopStartEvent.duration,
+ {events: new tr.v.d.RelatedEventSet([loopStartEvent])});
if (navEvent) {
navigationStartHistogram.addSample(
- navEvent.start - startEvent.start,
- {events: new tr.v.d.RelatedEventSet([startEvent, navEvent])});
+ navEvent.start - loopStartEvent.start,
+ {events: new tr.v.d.RelatedEventSet([loopStartEvent, navEvent])});
navigationCommitHistogram.addSample(
- navEvent.end - startEvent.start,
- {events: new tr.v.d.RelatedEventSet([startEvent, navEvent])});
+ navEvent.end - loopStartEvent.start,
+ {events: new tr.v.d.RelatedEventSet([loopStartEvent, navEvent])});
+ const requestEvent = navPair['req'];
+ if (!requestEvent) {
+ throw new Error('No network request after navigation');
+ }
+ requestStartHistogram.addSample(
+ requestEvent.start - loopStartEvent.start,
+ {events: new tr.v.d.RelatedEventSet([navEvent, requestEvent])});
}
firstContentfulPaintHistogram.addSample(
- fcpEvent.end - startEvent.start,
- {events: new tr.v.d.RelatedEventSet([startEvent, fcpEvent])});
+ fcpEvent.end - loopStartEvent.start,
+ {events: new tr.v.d.RelatedEventSet([loopStartEvent, fcpEvent])});
+ if (applicationStartEvent) {
+ applicationStartHistogram.addSample(applicationStartEvent.duration,
+ {events: new tr.v.d.RelatedEventSet([applicationStartEvent])});
+ }
}
}
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/android_startup_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/android_startup_metric_test.html
index af1dca98488..076cbfef83f 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/android_startup_metric_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/android_startup_metric_test.html
@@ -32,6 +32,34 @@ tr.b.unittest.testSuite(function() {
return rendererMainThread;
}
+ function addNetworkEvents(startTime, durationTime, process) {
+ const slice = tr.c.TestUtils.newAsyncSliceEx({
+ cat: 'netlog',
+ title: 'http://bbc.co.uk',
+ start: startTime,
+ args: { params: { method: 'GET' } },
+ duration: durationTime});
+ slice.args.params['method'] = 'GET';
+ const subSlice = tr.c.TestUtils.newAsyncSliceEx({
+ cat: 'netlog',
+ title: 'REQUEST_ALIVE',
+ start: startTime,
+ duration: durationTime});
+ slice.subSlices.push(subSlice);
+ const netThread = process.getOrCreateThread(tr.b.GUID.allocateSimple());
+ netThread.name = 'NetLog';
+ netThread.asyncSliceGroup.push(slice);
+ }
+
+ function addNavigationEvent(threadForAdding, startTime, durationTime) {
+ threadForAdding.asyncSliceGroup.push(
+ tr.c.TestUtils.newAsyncSliceEx({
+ cat: 'navigation',
+ title: 'Navigation StartToCommit',
+ start: startTime,
+ duration: durationTime}));
+ }
+
// Adds a browser and renderer to the process, with a few key events necessary
// to calculate the |androidStartupMetric|. An |offset| can be added to all
// events and the length of a few events can be extended by
@@ -43,22 +71,20 @@ tr.b.unittest.testSuite(function() {
browserMainThread.asyncSliceGroup.push(
tr.c.TestUtils.newAsyncSliceEx({
cat: 'startup',
+ title: 'Startup.LoadTime.ProcessCreateToApplicationStart',
+ start: (offset + 5000),
+ duration: (incrementForMetrics + 100)}));
+ browserMainThread.asyncSliceGroup.push(
+ tr.c.TestUtils.newAsyncSliceEx({
+ cat: 'startup',
title: 'Startup.BrowserMessageLoopStartTime',
start: (offset + 6800.125),
duration: (incrementForMetrics + 1700.0625)}));
- browserMainThread.asyncSliceGroup.push(
- tr.c.TestUtils.newAsyncSliceEx({
- cat: 'navigation',
- title: 'Navigation StartToCommit',
- start: (offset + 9000.5 + incrementForMetrics),
- duration: (incrementForMetrics + 2000.5)}));
+ const navigationStart = offset + 9000.5 + incrementForMetrics;
+ addNavigationEvent(browserMainThread, navigationStart,
+ incrementForMetrics + 2000.5);
const rendererMainThread = createRendererThread(model);
rendererMainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
- cat: 'startup',
- title: 'content::Start',
- start: (offset + 9500.125 + incrementForMetrics),
- duration: 10000.0}));
- rendererMainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
cat: 'loading,rail,devtools.timeline',
title: 'firstContentfulPaint',
start: (offset + 8400.125 + incrementForMetrics),
@@ -73,6 +99,11 @@ tr.b.unittest.testSuite(function() {
start: (offset + 8400.125 + incrementForMetrics + 0.125),
duration: 0.0,
args: {frame: '0x0'}}));
+
+ // The metrics rely on having network access in netlog soon after the
+ // navigation starts.
+ addNetworkEvents(navigationStart + 110, 2, browserMainThread.parent);
+ return browserMainThread;
}
// Adds early messageloop and FCP events. The metric should ignore these very
@@ -83,6 +114,12 @@ tr.b.unittest.testSuite(function() {
browserMainThread.asyncSliceGroup.push(
tr.c.TestUtils.newAsyncSliceEx({
cat: 'startup',
+ title: 'Startup.LoadTime.ProcessCreateToApplicationStart',
+ start: offset,
+ duration: 1.0}));
+ browserMainThread.asyncSliceGroup.push(
+ tr.c.TestUtils.newAsyncSliceEx({
+ cat: 'startup',
title: 'Startup.BrowserMessageLoopStartTime',
start: (offset + 1.0),
duration: 10.0}));
@@ -123,9 +160,11 @@ tr.b.unittest.testSuite(function() {
verifyHistogram(histograms, 'messageloop_start_time', 1, 1700.0625);
verifyHistogram(histograms, 'experimental_navigation_start_time', 1,
2200.375);
+ verifyHistogram(histograms, 'experimental_network_request_start_time', 1,
+ 2200.375 + 110);
verifyHistogram(histograms, 'navigation_commit_time', 1, 4200.875);
- verifyHistogram(histograms, 'experimental_content_start_time', 1, 2700);
verifyHistogram(histograms, 'first_contentful_paint_time', 1, 1600);
+ verifyHistogram(histograms, 'process_create_to_app_start_time', 1, 100);
});
// Emulates loss of the initial message loop start event. Checks that this
@@ -150,18 +189,10 @@ tr.b.unittest.testSuite(function() {
title: 'Startup.BrowserMessageLoopStartTime',
start: (20.0 + 1.0),
duration: 10.0}));
- browserMainThread.asyncSliceGroup.push(
- tr.c.TestUtils.newAsyncSliceEx({
- cat: 'navigation',
- title: 'Navigation StartToCommit',
- start: (20.0 + 11.0),
- duration: 10.0}));
+ const navigationStartTime = 20.0 + 11.0;
+ addNavigationEvent(browserMainThread, navigationStartTime, 10.0);
+ addNetworkEvents(navigationStartTime + 2, 2, browserMainThread.parent);
const rendererMainThread = createRendererThread(model);
- rendererMainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
- cat: 'startup',
- title: 'content::Start',
- start: (20.0 + 1.75),
- duration: 10.0}));
rendererMainThread.sliceGroup.pushSlice(
tr.c.TestUtils.newSliceEx({
cat: 'loading,rail,devtools.timeline',
@@ -178,8 +209,9 @@ tr.b.unittest.testSuite(function() {
verifyHistogram(histograms, 'messageloop_start_time', 1, 1700.0625);
verifyHistogram(histograms, 'experimental_navigation_start_time', 1,
2200.375);
+ verifyHistogram(histograms, 'experimental_network_request_start_time', 1,
+ 2200.375 + 110);
verifyHistogram(histograms, 'navigation_commit_time', 1, 4200.875);
- verifyHistogram(histograms, 'experimental_content_start_time', 1, 2700);
verifyHistogram(histograms, 'first_contentful_paint_time', 1, 1600);
});
@@ -212,10 +244,12 @@ tr.b.unittest.testSuite(function() {
verifyHistogram(histograms, 'messageloop_start_time', 1, 10);
verifyHistogram(histograms, 'experimental_navigation_start_time', 0,
undefined);
- verifyHistogram(histograms, 'navigation_commit_time', 0, undefined);
- verifyHistogram(histograms, 'experimental_content_start_time', 0,
+ verifyHistogram(histograms, 'experimental_network_request_start_time', 0,
undefined);
+ verifyHistogram(histograms, 'navigation_commit_time', 0, undefined);
verifyHistogram(histograms, 'first_contentful_paint_time', 1, 2);
+ verifyHistogram(histograms, 'process_create_to_app_start_time', 0,
+ undefined);
});
// Checks the metrics after adding an offset to events in the model, and
@@ -226,9 +260,11 @@ tr.b.unittest.testSuite(function() {
verifyHistogram(histograms, 'messageloop_start_time', 1, 1707.0625);
verifyHistogram(histograms, 'experimental_navigation_start_time', 1,
2207.375);
+ verifyHistogram(histograms, 'experimental_network_request_start_time', 1,
+ 2207.375 + 110);
verifyHistogram(histograms, 'navigation_commit_time', 1, 4214.875);
- verifyHistogram(histograms, 'experimental_content_start_time', 1, 2707);
verifyHistogram(histograms, 'first_contentful_paint_time', 1, 1607);
+ verifyHistogram(histograms, 'process_create_to_app_start_time', 1, 107);
});
test('androidStartupMetric_twoSessions', function() {
@@ -249,12 +285,35 @@ tr.b.unittest.testSuite(function() {
2, 1700.0625, 1700.0625 + delta);
verifyHistogramRange(histograms, 'experimental_navigation_start_time',
2, 2200.375, 2200.375 + delta);
+ verifyHistogramRange(histograms, 'experimental_network_request_start_time',
+ 2, 2200.375 + 110, 2200.375 + delta + 110);
verifyHistogramRange(histograms, 'navigation_commit_time',
2, 4200.875, 4200.875 + delta * 2);
- verifyHistogramRange(histograms, 'experimental_content_start_time',
- 2, 2700, 2700 + delta);
verifyHistogramRange(histograms, 'first_contentful_paint_time',
2, 1600, 1600 + delta);
+ verifyHistogramRange(histograms, 'process_create_to_app_start_time', 2, 100,
+ 100 + delta);
+ });
+
+ test('androidStartupMetric_extraNavigations', function() {
+ const histograms = new tr.v.HistogramSet();
+ function makeTestModelWithExtraNavigations() {
+ return tr.c.TestUtils.newModel(function(model) {
+ const mainThread = fillModelWithOneBrowserSession(model, 0.0, 0.0);
+ addEarlyEventsToBeIgnored(model, 0.0);
+ addEarlyEventsToBeIgnored(model, 20.0);
+ // The first commit time is hardcoded to match how it is added in
+ // fillModelWithOneBrowserSession().
+ const veryFirstCommitTime = 9000.5 + 2000.5;
+ addNavigationEvent(mainThread, veryFirstCommitTime + 20.0, 5.0);
+ });
+ }
+ tr.metrics.sh.androidStartupMetric(histograms, makeTestModelWithExtraNavigations());
+ verifyHistogram(histograms, 'messageloop_start_time', 1, 1700.0625);
+ verifyHistogram(histograms, 'experimental_navigation_start_time', 1,
+ 2200.375);
+ verifyHistogram(histograms, 'experimental_network_request_start_time', 1,
+ 2200.375 + 110);
});
});
</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/blink/gc_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/blink/gc_metric_test.html
index 0c20030edc1..fba89459e00 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/blink/gc_metric_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/blink/gc_metric_test.html
@@ -6,6 +6,7 @@ found in the LICENSE file.
-->
<link rel="import" href="/tracing/core/test_utils.html">
+<link rel="import" href="/tracing/extras/chrome/chrome_test_utils.html">
<link rel="import" href="/tracing/extras/importer/trace_event_importer.html">
<link rel="import" href="/tracing/metrics/blink/gc_metric.html">
<link rel="import" href="/tracing/metrics/v8/utils.html">
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/blink/resource_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/blink/resource_metric.html
new file mode 100644
index 00000000000..bb186a74e9d
--- /dev/null
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/blink/resource_metric.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<!--
+Copyright 2021 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<link rel="import" href="/tracing/extras/chrome/event_finder_utils.html">
+<link rel="import" href="/tracing/metrics/metric_registry.html">
+
+<script>
+'use strict';
+
+/**
+ * This metric is used for for blink network metrics
+ * - blinkRequestResourceCount: the count of requested resources
+ */
+tr.exportTo('tr.metrics', function() {
+ function blinkResourceMetric(histograms, model, opt_options) {
+ const chromeHelper = model.getOrCreateHelper(
+ tr.model.helpers.ChromeModelHelper);
+ if (!chromeHelper) {
+ // Chrome isn't present.
+ return;
+ }
+ const CATEGORY = 'blink.resource';
+ const NAME = 'ResourceFetcher::requestResource';
+ let count = 0;
+ // Collect trace events.
+ for (const helper of Object.values(chromeHelper.rendererHelpers)) {
+ if (helper.isChromeTracingUI) continue;
+ const events = tr.e.chrome.EventFinderUtils.getMainThreadEvents(
+ helper, NAME, CATEGORY);
+ for (const event of events) {
+ count++;
+ }
+ }
+ // Generate histograms.
+ histograms.createHistogram(
+ 'blinkRequestResourceCount', tr.b.Unit.byName.count, count);
+ }
+
+ tr.metrics.MetricRegistry.register(blinkResourceMetric, {
+ supportsRangeOfInterest: false,
+ });
+
+ return {
+ blinkResourceMetric,
+ };
+});
+</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/blink/resource_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/blink/resource_metric_test.html
new file mode 100644
index 00000000000..c11530c46fe
--- /dev/null
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/blink/resource_metric_test.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<!--
+Copyright 2021 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<link rel="import" href="/tracing/core/test_utils.html">
+<link rel="import" href="/tracing/extras/chrome/chrome_test_utils.html">
+<link rel="import" href="/tracing/metrics/blink/resource_metric.html">
+<link rel="import" href="/tracing/value/histogram_set.html">
+
+<script>
+'use strict';
+
+tr.b.unittest.testSuite(function() {
+ test('blinkRequestResourceCount_general', function() {
+ const model = tr.e.chrome.ChromeTestUtils.newChromeModel(function(model) {
+ const rendererProcess = model.rendererProcess;
+ const mainThread = model.rendererMain;
+ const mainFrame = { id: '0xdeadbeef', is_main: true };
+ const emitEvent = (time, cat, title, url, duration) => {
+ mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
+ cat,
+ title,
+ start: time,
+ duration,
+ args: {url},
+ }));
+ };
+ emitEvent(1000, 'blink.resource', 'ResourceFetcher::requestResource', 'A.js', 0.1);
+ emitEvent(2001, 'blink.resource', 'ignore', 'A.js', 0.1);
+ emitEvent(2002, 'ignore', 'ignore', 'A.js', 0.1);
+ emitEvent(3200, 'blink.resource', 'ResourceFetcher::requestResource', 'b.js', 0.1);
+ emitEvent(4201, 'ignore', 'ResourceFetcher::requestResource', 'b.js', 0.1);
+ });
+
+ const histograms = new tr.v.HistogramSet();
+ tr.metrics.blinkResourceMetric(histograms, model);
+ const histogram = histograms.getHistogramNamed('blinkRequestResourceCount');
+ assert.strictEqual(histogram.sampleValues.length, 1);
+ assert.strictEqual(histogram.running.count, 1);
+ assert.strictEqual(histogram.running.mean, 2);
+ });
+});
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/compare_samples_unittest.py b/chromium/third_party/catapult/tracing/tracing/metrics/compare_samples_unittest.py
index 2a766b2477c..c5a9817c522 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/compare_samples_unittest.py
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/compare_samples_unittest.py
@@ -91,7 +91,7 @@ class CompareSamplesUnittest(unittest.TestCase):
prev_bucket += width
for value in values:
for bucket in buckets:
- if value >= bucket['low'] and value < bucket['high']:
+ if bucket['low'] <= value < bucket['high']:
bucket['count'] += 1
break
charts = {
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/core_web_vitals_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/core_web_vitals_metric.html
new file mode 100644
index 00000000000..34382936e44
--- /dev/null
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/core_web_vitals_metric.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html>
+<!--
+Copyright 2022 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<!--
+These metrics are designed to read off Core Web Vitals metrics (and their
+important diagnostic metrics like First Contentful Paint) from the trace events
+generated by the UkmPageLoadMetricsObserver, doing as little post-processing as
+possible. These should therefore automatically stay updated as the definitions
+in chromium C++ code evolve. See http://go/cwv-ukm-lab-metrics for more details.
+-->
+
+<link rel="import" href="/tracing/base/unit.html">
+<link rel="import" href="/tracing/metrics/metric_registry.html">
+<link rel="import" href="/tracing/model/helpers/chrome_model_helper.html">
+<link rel="import" href="/tracing/value/diagnostics/alert_groups.html">
+<link rel="import" href="/tracing/value/histogram.html">
+
+
+<script>
+'use strict';
+
+tr.exportTo('tr.metrics', function() {
+ const CWV_HISTOGRAM_NAMES = {
+ FCP_HISTOGRAM_NAME: 'cwv:first_contentful_paint',
+ LCP_HISTOGRAM_NAME: 'cwv:largest_contentful_paint',
+ CLS_HISTOGRAM_NAME: 'cwv:cumulative_layout_shift',
+ };
+
+ function coreWebVitalsMetric(histograms, model) {
+ const chromeHelper = model.getOrCreateHelper(
+ tr.model.helpers.ChromeModelHelper);
+ if (chromeHelper === undefined) return;
+
+ const firstContentfulPaintHistogram =
+ histograms.createHistogram(CWV_HISTOGRAM_NAMES.FCP_HISTOGRAM_NAME,
+ tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, [], {
+ alertGrouping: [tr.v.d.ALERT_GROUPS.LOADING_PAINT],
+ });
+ const largestContentfulPaintHistogram =
+ histograms.createHistogram(CWV_HISTOGRAM_NAMES.LCP_HISTOGRAM_NAME,
+ tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, [], {
+ alertGrouping: [tr.v.d.ALERT_GROUPS.LOADING_PAINT],
+ });
+ const cumulativeLayoutShiftHistogram =
+ histograms.createHistogram(CWV_HISTOGRAM_NAMES.CLS_HISTOGRAM_NAME,
+ tr.b.Unit.byName.unitlessNumber_smallerIsBetter, [], {
+ alertGrouping: [tr.v.d.ALERT_GROUPS.LOADING_LAYOUT],
+ });
+
+ for (const browserHelper of Object.values(chromeHelper.browserHelpers)) {
+ const mainThread = browserHelper.mainThread;
+ const latestTimingBySourceId = new Map();
+
+ for (const event of mainThread.sliceGroup.childEvents()) {
+ if (event.category === 'loading' &&
+ event.title === 'UkmPageLoadTimingUpdate') {
+ const timingUpdate = event.args['ukm_page_load_timing_update'];
+ const sourceId = timingUpdate['ukm_source_id'];
+ latestTimingBySourceId.set(sourceId, timingUpdate);
+ }
+ }
+
+ for (const timingUpdate of latestTimingBySourceId.values()) {
+ const timingUpdateDiagnostic = {
+ 'page_load_timing': new tr.v.d.GenericSet([timingUpdate]),
+ };
+
+ // Note: This might always be a perfect round number because as of
+ // 2022/09/13, FCP values are clamped to 1ms resolution when sent to the
+ // browser process to prevent timing attacks.
+ const firstContentfulPaint =
+ timingUpdate['first_contentful_paint_ms'];
+
+ // Do not add any core web vitals metrics if page did not reach FCP.
+ if (firstContentfulPaint === undefined) continue;
+
+ firstContentfulPaintHistogram.addSample(
+ firstContentfulPaint, timingUpdateDiagnostic);
+
+ // Note: this could be undefined if somehow the browser determined the
+ // LCP data is invalid. They should be exactly the same cases where we
+ // also do not report data to UKM.
+ largestContentfulPaintHistogram.addSample(
+ timingUpdate['latest_largest_contentful_paint_ms'],
+ timingUpdateDiagnostic);
+
+ // Note: There is no need to specially handle the case when there are no
+ // layout shifts on the page. The latest_cumulative_layout_shift value
+ // should be reported as 0 in the trace event by the browser in that
+ // case, not undefined. Not that CLS can still be undefined if data
+ // is invalidated for some reason, e.g. see
+ // https://crsrc.org/c/components/page_load_metrics/browser/layout_shift_normalization.cc;l=25;drc=8d399817282e3c12ed54eb23ec42a5e418298ec6
+ cumulativeLayoutShiftHistogram.addSample(
+ timingUpdate['latest_cumulative_layout_shift'],
+ timingUpdateDiagnostic);
+ }
+ }
+ }
+
+ tr.metrics.MetricRegistry.register(coreWebVitalsMetric);
+
+ return {
+ coreWebVitalsMetric,
+ CWV_HISTOGRAM_NAMES,
+ };
+});
+</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/core_web_vitals_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/core_web_vitals_metric_test.html
new file mode 100644
index 00000000000..25354674ae1
--- /dev/null
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/core_web_vitals_metric_test.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html>
+<!--
+Copyright 2022 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<link rel="import" href="/tracing/base/utils.html">
+<link rel="import" href="/tracing/extras/chrome/chrome_test_utils.html">
+<link rel="import" href="/tracing/metrics/core_web_vitals_metric.html">
+<link rel="import" href="/tracing/value/histogram_set.html">
+
+<script>
+'use strict';
+
+tr.b.unittest.testSuite(function() {
+ const {
+ FCP_HISTOGRAM_NAME,
+ LCP_HISTOGRAM_NAME,
+ CLS_HISTOGRAM_NAME,
+ } = tr.metrics.CWV_HISTOGRAM_NAMES;
+
+ const timingUpdateEvent = (args) => {
+ return tr.c.TestUtils.newSliceEx({
+ title: 'UkmPageLoadTimingUpdate',
+ cat: 'loading',
+ start: args.ts,
+ duration: 0,
+ args: {
+ ukm_page_load_timing_update: {
+ ukm_source_id: args.sourceId,
+ first_contentful_paint_ms: args.fcp,
+ latest_largest_contentful_paint_ms: args.lcp,
+ latest_cumulative_layout_shift: args.cls,
+ },
+ },
+ });
+ };
+
+ test('histogramsAreAlwaysCreatedButCanBeEmpty', () => {
+ const model = tr.e.chrome.ChromeTestUtils.newChromeModel((model) => {
+ console.log(model);
+ model.browserMain.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx(
+ {title: 'SomeRandomEvent', start: 2, duration: 0}));
+ });
+
+ const histograms = new tr.v.HistogramSet();
+ tr.metrics.coreWebVitalsMetric(histograms, model);
+
+ assert.strictEqual(
+ 0, histograms.getHistogramNamed(FCP_HISTOGRAM_NAME).numValues);
+ assert.strictEqual(
+ 0, histograms.getHistogramNamed(LCP_HISTOGRAM_NAME).numValues);
+ assert.strictEqual(
+ 0, histograms.getHistogramNamed(CLS_HISTOGRAM_NAME).numValues);
+ });
+
+ test('metricIsReportedFromLatestEvent', () => {
+ const model = tr.e.chrome.ChromeTestUtils.newChromeModel((model) => {
+ model.browserMain.sliceGroup.pushSlice(timingUpdateEvent(
+ {sourceId: 42, ts: 11, fcp: 123, lcp: 300, cls: 2}));
+ model.browserMain.sliceGroup.pushSlice(timingUpdateEvent(
+ {sourceId: 42, ts: 12, fcp: 124, lcp: 301, cls: 3}));
+ });
+
+ const histograms = new tr.v.HistogramSet();
+ tr.metrics.coreWebVitalsMetric(histograms, model);
+
+ assert.strictEqual(
+ 1, histograms.getHistogramNamed(FCP_HISTOGRAM_NAME).numValues);
+ assert.strictEqual(
+ 124, histograms.getHistogramNamed(FCP_HISTOGRAM_NAME).max);
+ assert.strictEqual(
+ 1, histograms.getHistogramNamed(LCP_HISTOGRAM_NAME).numValues);
+ assert.strictEqual(
+ 301, histograms.getHistogramNamed(LCP_HISTOGRAM_NAME).max);
+ assert.strictEqual(
+ 1, histograms.getHistogramNamed(CLS_HISTOGRAM_NAME).numValues);
+ assert.strictEqual(
+ 3, histograms.getHistogramNamed(CLS_HISTOGRAM_NAME).max);
+ });
+
+ test('noMetricIsReportedIfFCPIsNotReached', () => {
+ const model = tr.e.chrome.ChromeTestUtils.newChromeModel((model) => {
+ model.browserMain.sliceGroup.pushSlice(timingUpdateEvent(
+ {sourceId: 42, ts: 11, lcp: 300, cls: 2})); // FCP missing.
+ });
+
+ const histograms = new tr.v.HistogramSet();
+ tr.metrics.coreWebVitalsMetric(histograms, model);
+
+ assert.strictEqual(
+ 0, histograms.getHistogramNamed(FCP_HISTOGRAM_NAME).numValues);
+ assert.strictEqual(
+ 0, histograms.getHistogramNamed(LCP_HISTOGRAM_NAME).numValues);
+ assert.strictEqual(
+ 0, histograms.getHistogramNamed(CLS_HISTOGRAM_NAME).numValues);
+ });
+
+ test('multipleNavigations', () => {
+ const modelClsMissing =
+ tr.e.chrome.ChromeTestUtils.newChromeModel((model) => {
+ // First navigation.
+ model.browserMain.sliceGroup.pushSlice(timingUpdateEvent(
+ {sourceId: 42, ts: 11, fcp: 123, lcp: 300, cls: 2}));
+ model.browserMain.sliceGroup.pushSlice(timingUpdateEvent(
+ {sourceId: 42, ts: 11, fcp: 123, lcp: 301, cls: 3}));
+
+ // Second navigation.
+ model.browserMain.sliceGroup.pushSlice(timingUpdateEvent(
+ {sourceId: 43, ts: 11, fcp: 223, lcp: 400, cls: 12}));
+ model.browserMain.sliceGroup.pushSlice(timingUpdateEvent(
+ {sourceId: 43, ts: 11, fcp: 223, lcp: 401, cls: 13}));
+ });
+
+ const histograms = new tr.v.HistogramSet();
+ tr.metrics.coreWebVitalsMetric(histograms, modelClsMissing);
+
+ assert.strictEqual(
+ 2, histograms.getHistogramNamed(FCP_HISTOGRAM_NAME).numValues);
+ assert.strictEqual(
+ 123, histograms.getHistogramNamed(FCP_HISTOGRAM_NAME).min);
+ assert.strictEqual(
+ 223, histograms.getHistogramNamed(FCP_HISTOGRAM_NAME).max);
+ assert.strictEqual(
+ 2, histograms.getHistogramNamed(LCP_HISTOGRAM_NAME).numValues);
+ assert.strictEqual(
+ 301, histograms.getHistogramNamed(LCP_HISTOGRAM_NAME).min);
+ assert.strictEqual(
+ 401, histograms.getHistogramNamed(LCP_HISTOGRAM_NAME).max);
+ assert.strictEqual(
+ 2, histograms.getHistogramNamed(CLS_HISTOGRAM_NAME).numValues);
+ assert.strictEqual(
+ 3, histograms.getHistogramNamed(CLS_HISTOGRAM_NAME).min);
+ assert.strictEqual(
+ 13, histograms.getHistogramNamed(CLS_HISTOGRAM_NAME).max);
+ });
+
+ test('metricIsNotReportedIfMissingInLatestButPresentInEarlierEvent', () => {
+ // Metric can become missing in later update events if it's invalidated /
+ // tainted somehow in the browser. We do not report the metric when that
+ // happens (as opposed to reporting the last valid value of the metric.)
+
+ const modelClsMissing =
+ tr.e.chrome.ChromeTestUtils.newChromeModel((model) => {
+ // First navigation.
+ model.browserMain.sliceGroup.pushSlice(timingUpdateEvent(
+ {sourceId: 42, ts: 11, fcp: 123, lcp: 300, cls: 2}));
+ model.browserMain.sliceGroup.pushSlice(timingUpdateEvent(
+ {sourceId: 42, ts: 11, fcp: 123, lcp: 301})); // CLS missing.
+
+ // Second navigation.
+ model.browserMain.sliceGroup.pushSlice(timingUpdateEvent(
+ {sourceId: 43, ts: 11, fcp: 123, lcp: 300, cls: 2}));
+ model.browserMain.sliceGroup.pushSlice(timingUpdateEvent(
+ {sourceId: 43, ts: 11, fcp: 123, cls: 3})); // LCP missing.
+ });
+
+ const histograms = new tr.v.HistogramSet();
+ tr.metrics.coreWebVitalsMetric(histograms, modelClsMissing);
+
+ assert.strictEqual(
+ 2, histograms.getHistogramNamed(FCP_HISTOGRAM_NAME).numValues);
+ assert.strictEqual(
+ 1, histograms.getHistogramNamed(LCP_HISTOGRAM_NAME).numValues);
+ assert.strictEqual(
+ 301, histograms.getHistogramNamed(LCP_HISTOGRAM_NAME).max);
+ assert.strictEqual(
+ 1, histograms.getHistogramNamed(CLS_HISTOGRAM_NAME).numValues);
+ assert.strictEqual(
+ 3, histograms.getHistogramNamed(CLS_HISTOGRAM_NAME).max);
+ });
+});
+</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/count_sum_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/count_sum_metric.html
new file mode 100644
index 00000000000..35148fcce85
--- /dev/null
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/count_sum_metric.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<!--
+Copyright 2021 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<link rel="import" href="/tracing/extras/chrome/event_finder_utils.html">
+<link rel="import" href="/tracing/metrics/metric_registry.html">
+
+<script>
+'use strict';
+
+/**
+ * This metric is used for custom benchmarks which need to record counts
+ * or sums of events ocurring in the renderer threads of traces. This is useful
+ * for one-off cluster telemetry analysis.
+ * For trace events with category "benchmark", and name "count_sum" and a
+ * "counter" field with the name of the counter, it records one or two metrics:
+ * - [counter]_count: the count of trace events with the same counter field.
+ * - [counter]_sum: the sum of values of trace events with that field, if any
+ * have a value field.
+ */
+tr.exportTo('tr.metrics', function() {
+ function countSumMetric(histograms, model, opt_options) {
+ const chromeHelper = model.getOrCreateHelper(
+ tr.model.helpers.ChromeModelHelper);
+ if (!chromeHelper) {
+ // Chrome isn't present.
+ return;
+ }
+
+ const CATEGORY = 'benchmark';
+ const NAME = 'count_sum';
+ const counts = new Map();
+ const sums = new Map();
+ // Collect trace events.
+ for (const pid in chromeHelper.rendererHelpers) {
+ const helper = chromeHelper.rendererHelpers[pid];
+ if (helper.isChromeTracingUI) continue;
+
+ const events = tr.e.chrome.EventFinderUtils.getMainThreadEvents(
+ helper, NAME, CATEGORY);
+ for (const event of events) {
+ const c = event.args.counter;
+ if (!c) {
+ continue;
+ }
+ if (!counts.get(c)) {
+ counts.set(c, 0);
+ }
+ counts.set(c, counts.get(c) + 1);
+ if (event.args.value) {
+ if (!sums.get(c)) {
+ sums.set(c, 0);
+ }
+ sums.set(c, sums.get(c) + event.args.value);
+ }
+ }
+ }
+
+ // Generate histograms.
+ counts.forEach((value, key) => {
+ histograms.createHistogram(
+ 'count_' + key, tr.b.Unit.byName.count, value);
+ });
+ sums.forEach((value, key) => {
+ histograms.createHistogram(
+ 'sum_' + key, tr.b.Unit.byName.unitlessNumber, value);
+ });
+ }
+
+ tr.metrics.MetricRegistry.register(countSumMetric, {
+ supportsRangeOfInterest: false,
+ });
+
+ return {
+ countSumMetric,
+ };
+});
+</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/count_sum_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/count_sum_metric_test.html
new file mode 100644
index 00000000000..a34fb9c7b84
--- /dev/null
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/count_sum_metric_test.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<!--
+Copyright 2020 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<link rel="import" href="/tracing/core/test_utils.html">
+<link rel="import" href="/tracing/extras/chrome/chrome_test_utils.html">
+<link rel="import" href="/tracing/metrics/count_sum_metric.html">
+<link rel="import" href="/tracing/value/histogram_set.html">
+
+<script>
+'use strict';
+
+tr.b.unittest.testSuite(function() {
+ test('countSumMetric_general', function() {
+ const model = tr.e.chrome.ChromeTestUtils.newChromeModel(function(model) {
+ const rendererProcess = model.rendererProcess;
+ const mainThread = model.rendererMain;
+ const mainFrame = { id: '0xdeadbeef', is_main: true };
+ const subframe = { id: '0xdeadb33f', is_main: false };
+ const emitEvent = (time, cat, title, counter, value) => {
+ mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
+ cat,
+ title,
+ start: time,
+ duration: 0.0,
+ args: {counter, value}
+ }));
+ };
+ emitEvent(1000, 'benchmark', 'count_sum', 'A', 2.1);
+ emitEvent(3000, 'benchmark', 'count_sum', 'B', null);
+ emitEvent(2000, 'benchmark', 'count_sum', 'A', 19.4);
+ emitEvent(4000, 'benchmark', 'count_sum', 'B', null);
+ emitEvent(4000, 'benchmark', 'count_sum', 'B', null);
+ emitEvent(4000, 'donotcount', 'count_sum', 'C', null);
+ emitEvent(4000, 'benchmark', 'foo', 'D', null);
+ });
+
+ const histograms = new tr.v.HistogramSet();
+ tr.metrics.countSumMetric(histograms, model);
+ const histAc = histograms.getHistogramNamed('count_A');
+ assert.strictEqual(histAc.sampleValues.length, 1);
+ assert.strictEqual(histAc.running.count, 1);
+ assert.strictEqual(histAc.running.mean, 2);
+ const histAs = histograms.getHistogramNamed('sum_A');
+ assert.strictEqual(histAs.sampleValues.length, 1);
+ assert.strictEqual(histAs.running.count, 1);
+ assert.strictEqual(histAs.running.mean, 21.5);
+ const histBc = histograms.getHistogramNamed('count_B');
+ assert.strictEqual(histBc.sampleValues.length, 1);
+ assert.strictEqual(histBc.running.count, 1);
+ assert.strictEqual(histBc.running.mean, 3);
+ assert.isUndefined(histograms.getHistogramNamed('sum_B'));
+ assert.isUndefined(histograms.getHistogramNamed('count_C'));
+ assert.isUndefined(histograms.getHistogramNamed('sum_C'));
+ assert.isUndefined(histograms.getHistogramNamed('count_D'));
+ assert.isUndefined(histograms.getHistogramNamed('sum_D'));
+ });
+});
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/custom_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/custom_metric.html
new file mode 100644
index 00000000000..63823b49cee
--- /dev/null
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/custom_metric.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html>
+<!--
+Copyright 2020 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<link rel="import" href="/tracing/metrics/metric_registry.html">
+
+<script>
+'use strict';
+
+/**
+ * This metric is used for custom performance benchmark.
+ * It captures the following:
+ * - Metrics reported by telemetry in the format of
+ * performance.mark('custom_metric:manifest:[{"name":<METRIC_NAME1>},{"name":<METRIC_NAME2>}...]');
+ * - Duration between performance.mark('<METRIC_NAME>:metric_begin')
+ * and performance.mark('<METRIC_NAME>:metric_end') on the JS side.
+ * - performance.mark('<METRIC_NAME>:<METRIC_VALUE>:metric_value')
+ * on the JS side.
+ */
+tr.exportTo('tr.metrics', function() {
+ function customMetric(histograms, model, opt_options) {
+ const chromeHelper = model.getOrCreateHelper(
+ tr.model.helpers.ChromeModelHelper);
+ if (!chromeHelper) {
+ // Chrome isn't present.
+ return;
+ }
+
+ const metrics = getMetrics(chromeHelper);
+ const traces = new Map();
+ const benchmarkValues = new Map();
+ // Collect trace events.
+ for (const helper of chromeHelper.browserHelpers) {
+ helper.iterAllThreads(function(thread) {
+ for (const slice of thread.sliceGroup.slices.concat(
+ thread.asyncSliceGroup.slices)) {
+ if (!slice.error && metrics.has(slice.title)) {
+ if (!traces.has(slice.title)) {
+ traces.set(slice.title, []);
+ }
+ traces.get(slice.title).push(slice.duration);
+ }
+ }
+ });
+ }
+
+ // Collect performance.mark().
+ const METRIC_BEGIN = 'metric_begin';
+ const METRIC_END = 'metric_end';
+ const METRIC_VALUE = 'metric_value';
+ const marks = new Map();
+ for (const helper of Object.values(chromeHelper.rendererHelpers)) {
+ if (!helper.mainThread) continue;
+ for (const event of helper.mainThread.sliceGroup.childEvents()) {
+ if (!event.category.includes('blink.user_timing')) continue;
+ const {title} = event;
+ const index = title.lastIndexOf(':');
+ if (index === -1) {
+ continue;
+ }
+ const name = title.substring(0, index);
+ const lastPart = title.substring(index + 1);
+ if (lastPart === METRIC_BEGIN) {
+ marks.set(name, event);
+ } else if (lastPart === METRIC_END) {
+ if (!marks.has(name)) {
+ continue;
+ }
+ const range = tr.b.math.Range.fromExplicitRange(
+ marks.get(name).start, event.start);
+ if (!traces.has(name)) {
+ traces.set(name, []);
+ }
+ traces.get(name).push(range.duration);
+ marks.delete(name);
+ } else if (lastPart === METRIC_VALUE) {
+ const index2 = name.lastIndexOf(':');
+ if (index2 === -1) {
+ continue;
+ }
+ const key = name.substring(0, index2);
+ const value = Number(name.substring(index2 + 1));
+ if (key && !isNaN(value)) {
+ if (!benchmarkValues.has(key)) {
+ benchmarkValues.set(key, []);
+ }
+ benchmarkValues.get(key).push(value);
+ }
+ }
+ }
+ }
+
+ // Generate histograms.
+ traces.forEach((value, key) => {
+ createMetricHistogram(histograms,
+ key,
+ tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,
+ value,
+ metrics.get(key));
+ });
+ benchmarkValues.forEach((value, key) => {
+ createMetricHistogram(histograms,
+ key,
+ tr.b.Unit.byName.unitlessNumber_smallerIsBetter,
+ value,
+ metrics.get(key));
+ });
+ }
+
+ // Get metrics from performance.mark()
+ function getMetrics(chromeHelper) {
+ const CUSTOM_METRIC_MANIFEST_PREFIX = 'custom_metric:manifest:'
+ for (const helper of Object.values(chromeHelper.rendererHelpers)) {
+ if (!helper.mainThread) continue;
+ for (const event of helper.mainThread.sliceGroup.childEvents()) {
+ if (!event.category.includes('blink.user_timing')) continue;
+ const {title} = event;
+ if (title.startsWith(CUSTOM_METRIC_MANIFEST_PREFIX)) {
+ const result = JSON.parse(title.substring(CUSTOM_METRIC_MANIFEST_PREFIX.length));
+ return new Map(result.map(event => [event.name, event]));
+ }
+ }
+ }
+ return new Map();
+ }
+
+ // Create histogram with default unit and
+ // read unit and description from the metric manifest if available.
+ function createMetricHistogram(histograms, key, defaultUnit, value, metric) {
+ let unit = metric && metric.unit;
+ if (unit) {
+ unit = tr.b.Unit.fromJSON(unit);
+ }
+ const description = metric && metric.description;
+ const histogram = histograms.createHistogram(key,
+ unit || defaultUnit,
+ value);
+ if (description) {
+ histogram.description = description;
+ }
+ return histogram;
+ }
+
+ tr.metrics.MetricRegistry.register(customMetric, {
+ supportsRangeOfInterest: false,
+ });
+
+ return {
+ customMetric,
+ };
+});
+</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/custom_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/custom_metric_test.html
new file mode 100644
index 00000000000..4a90395a6ef
--- /dev/null
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/custom_metric_test.html
@@ -0,0 +1,273 @@
+<!DOCTYPE html>
+<!--
+Copyright 2020 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<link rel="import" href="/tracing/core/test_utils.html">
+<link rel="import" href="/tracing/metrics/custom_metric.html">
+<link rel="import" href="/tracing/value/histogram_set.html">
+
+<script>
+'use strict';
+
+tr.b.unittest.testSuite(function() {
+ test('customMetric_collectTrace', function() {
+ const model = tr.c.TestUtils.newModel((model) => {
+ const browserThread = setUpBrowserThread(model);
+ addTraces(browserThread);
+ addSingleTrace(setUpOtherBrowserThread(model));
+ addSingleTrace(setUpOtherRendererThread(model));
+ const rendererMainThread = setUpRendererMainThread(model);
+ setMetrics(rendererMainThread);
+ });
+ const histograms = new tr.v.HistogramSet();
+ tr.metrics.customMetric(histograms, model);
+ const hist1 = histograms.getHistogramNamed('metric1');
+ assert.strictEqual(hist1.numValues, 2);
+ assert.strictEqual(hist1.unit.asJSON(), 'ms_smallerIsBetter');
+ const hist2 = histograms.getHistogramNamed('metric2');
+ assert.strictEqual(hist2.numValues, 1);
+ assert.strictEqual(hist2.unit.asJSON(), 'ms_biggerIsBetter');
+ assert.strictEqual(hist2.description, 'This is metric2');
+ const hist3 = histograms.getHistogramNamed('metric3');
+ // metric3 is not collected because its name isn't reported.
+ assert.isUndefined(hist3);
+ const hist4 = histograms.getHistogramNamed('metric4');
+ assert.strictEqual(hist4.numValues, 2);
+ // metric5 is collected from both other browser thread and
+ // other renderer thread.
+ const hist5 = histograms.getHistogramNamed('metric5');
+ assert.strictEqual(hist5.numValues, 2);
+ });
+
+ test('customMetric_collectPerformanceMark', function() {
+ const model = tr.c.TestUtils.newModel((model) => {
+ const rendererMainThread = setUpRendererMainThread(model);
+ addPerformanceMark(rendererMainThread);
+ });
+ const histograms = new tr.v.HistogramSet();
+ tr.metrics.customMetric(histograms, model);
+ const hist1 = histograms.getHistogramNamed('metric1');
+ assert.strictEqual(hist1.numValues, 2);
+ assert.strictEqual(hist1.max, 5.0);
+ assert.strictEqual(hist1.min, 2.0);
+ assert.strictEqual(hist1.average, 3.5);
+ const hist2 = histograms.getHistogramNamed('metric2');
+ assert.strictEqual(hist2.numValues, 1);
+ assert.strictEqual(hist2.max, 18.0);
+ assert.strictEqual(hist2.min, 18.0);
+ assert.strictEqual(hist2.average, 18.0);
+ // metric3 is not collected because
+ // ":metric_begin" and ":metric_end" are missing.
+ assert.isUndefined(histograms.getHistogramNamed('metric3'));
+ // metric4 is not collected because
+ // ":metric_end" is missing.
+ assert.isUndefined(histograms.getHistogramNamed('metric4'));
+ // metric5 is not collected because
+ // ":metric_begin" is missing.
+ assert.isUndefined(histograms.getHistogramNamed('metric5'));
+ const hist3 = histograms.getHistogramNamed('metric6');
+ assert.strictEqual(hist3.numValues, 2);
+ assert.strictEqual(hist3.max, 51);
+ assert.strictEqual(hist3.min, 49);
+ assert.strictEqual(hist3.average, 50);
+ // metric7 is not collected because
+ // benmark value is invalid.
+ assert.isUndefined(histograms.getHistogramNamed('metric7'));
+ // metric8 is not collected because
+ // benchmark value is missing.
+ assert.isUndefined(histograms.getHistogramNamed('metric8'));
+ });
+
+ function setUpBrowserThread(model) {
+ const BROWSER_PROCESS_ID = 1234;
+ const browserProcess = model.getOrCreateProcess(BROWSER_PROCESS_ID);
+ const browserThread = browserProcess.getOrCreateThread(2);
+ browserThread.name = 'CrBrowserMain';
+ return browserThread;
+ }
+
+ function setUpRendererMainThread(model) {
+ const RENDERER_PROCESS_ID = 2345;
+ const rendererProcess = model.getOrCreateProcess(RENDERER_PROCESS_ID);
+ const mainThread = rendererProcess.getOrCreateThread(23);
+ mainThread.name = 'CrRendererMain';
+ return mainThread;
+ }
+
+ function setUpOtherBrowserThread(model) {
+ const BROWSER_PROCESS_ID = 1234;
+ const browserProcess = model.getOrCreateProcess(BROWSER_PROCESS_ID);
+ const thread = browserProcess.getOrCreateThread(3);
+ thread.name = 'Other';
+ return thread;
+ }
+
+ function setUpOtherRendererThread(model) {
+ const RENDERER_PROCESS_ID = 2345;
+ const rendererProcess = model.getOrCreateProcess(RENDERER_PROCESS_ID);
+ const thread = rendererProcess.getOrCreateThread(4);
+ thread.name = 'Other';
+ return thread;
+ }
+
+ function addEvent(mainThread, event) {
+ mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
+ cat: 'blink.user_timing',
+ title: event.title,
+ start: event.start,
+ duration: 0.0,
+ }));
+ }
+
+ function addTraces(thread) {
+ [
+ {
+ cat: 'browser',
+ title: 'metric1',
+ start: 1,
+ duration: 1,
+ },
+ {
+ cat: 'browser',
+ title: 'metric1',
+ start: 2,
+ duration: 2,
+ },
+ {
+ cat: 'browser',
+ title: 'metric2',
+ start: 3,
+ duration: 3,
+ },
+ {
+ cat: 'browser',
+ title: 'metric3',
+ start: 4,
+ duration: 4,
+ }
+ ].forEach(slice => {
+ thread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx(slice));
+ });
+
+ [
+ {
+ cat: 'browser',
+ title: 'metric4',
+ start: 1,
+ duration: 1,
+ },
+ {
+ cat: 'browser',
+ title: 'metric4',
+ start: 2,
+ duration: 2,
+ }
+ ].forEach(slice => {
+ thread.asyncSliceGroup.push(tr.c.TestUtils.newAsyncSliceEx(slice));
+ });
+ }
+
+ function addSingleTrace(thread) {
+ const slice = {
+ cat: 'browser',
+ title: 'metric5',
+ start: 1,
+ duration: 1,
+ };
+ thread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx(slice));
+ }
+
+ function setMetrics(thread) {
+ const traceEvents = [
+ {
+ name: "metric1",
+ },
+ {
+ name: "metric2",
+ unit: "ms_biggerIsBetter",
+ description: "This is metric2"
+ },
+ {
+ name: "metric4",
+ },
+ {
+ name: "metric5",
+ },
+ ]
+ const report = `custom_metric:manifest:${JSON.stringify(traceEvents)}`;
+ thread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
+ cat: 'blink.user_timing',
+ title: report,
+ start: 0,
+ duration: 0,
+ }));
+ }
+
+ function addPerformanceMark(thread) {
+ [
+ {
+ title: 'metric1:metric_begin',
+ start: 10,
+ },
+ {
+ title: 'metric1:metric_end',
+ start: 15,
+ },
+ {
+ title: 'metric1:metric_begin',
+ start: 17,
+ },
+ {
+ title: 'metric1:metric_end',
+ start: 19,
+ },
+ {
+ title: 'metric2:metric_begin',
+ start: 2,
+ },
+ {
+ title: 'metric2:metric_end',
+ start: 20,
+ },
+ {
+ title: 'metric3',
+ start: 25,
+ },
+ {
+ title: 'metric4:metric_begin',
+ start: 5,
+ },
+ {
+ title: 'metric5:metric_end',
+ start: 10,
+ },
+ {
+ title: 'metric6:49:metric_value',
+ start: 10,
+ },
+ {
+ title: 'metric6:51:metric_value',
+ start: 20,
+ },
+ {
+ title: 'metric7:invalid value:metric_value',
+ start: 10,
+ },
+ {
+ title: 'metric8:metric_value',
+ start: 10,
+ }
+ ].forEach(slice => {
+ thread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
+ cat: 'blink.user_timing',
+ title: slice.title,
+ start: slice.start,
+ duration: 0,
+ }));
+ });
+ }
+});
+</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/discover.py b/chromium/third_party/catapult/tracing/tracing/metrics/discover.py
index ef532c6d0df..75802db5d06 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/discover.py
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/discover.py
@@ -30,5 +30,4 @@ def DiscoverMetrics(modules_to_load):
if res.returncode != 0:
raise RuntimeError('Error running metrics_discover_cmdline: ' + res.stdout)
- else:
- return [str(m) for m in json.loads(res.stdout)]
+ return [str(m) for m in json.loads(res.stdout)]
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/discover_unittest.py b/chromium/third_party/catapult/tracing/tracing/metrics/discover_unittest.py
index 10b81b547c8..978a9146d28 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/discover_unittest.py
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/discover_unittest.py
@@ -11,7 +11,7 @@ class MetricsDiscoverUnittest(unittest.TestCase):
self.assertFalse(discover.DiscoverMetrics([]))
def testMetricsDiscoverNonEmpty(self):
- self.assertEquals(['sampleMetric'], discover.DiscoverMetrics(
+ self.assertEqual(['sampleMetric'], discover.DiscoverMetrics(
['/tracing/metrics/sample_metric.html']))
def testMetricsDiscoverMultipleMetrics(self):
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/media_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/media_metric.html
index 9ec388ec862..0b11d30142b 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/media_metric.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/media_metric.html
@@ -71,6 +71,14 @@ tr.exportTo('tr.metrics', function() {
processData.calculateSeekTimes(mainThread);
processData.calculateBufferingTimes(mainThread);
+ // Roughness metrics are output from a thread pool worker, so we don't
+ // have a convenient name for the thread. Check all threads.
+ const allThreads =
+ rendererHelper.process.findAllThreadsMatching(function() {
+ return true;
+ });
+ processData.calculateVideoPlaybackQuality(allThreads);
+
processData.addMetricToHistograms(histograms);
}
}
@@ -160,6 +168,20 @@ tr.exportTo('tr.metrics', function() {
}
}
+ calculateVideoPlaybackQuality(threads) {
+ for (const thread of threads) {
+ for (const event of thread.sliceGroup.getDescendantEvents()) {
+ if (event.title === 'VideoPlaybackRoughness') {
+ this.getPerPlaybackObject_(event.args.id)
+ .processVideoRoughness(event.args.roughness);
+ } else if (event.title === 'VideoPlaybackFreezing') {
+ this.getPerPlaybackObject_(event.args.id)
+ .processVideoFreezing(event.args.freezing);
+ }
+ }
+ }
+ }
+
addMetricToHistograms(histograms) {
for (const [id, playbackData] of this.playbackIdToDataMap_) {
playbackData.addMetricToHistograms(histograms);
@@ -191,6 +213,8 @@ tr.exportTo('tr.metrics', function() {
this.seekError_ = false;
this.seekTimes_ = new Map();
this.currentSeek_ = undefined;
+ this.roughness_ = undefined;
+ this.freezing_ = undefined;
}
// API methods for retrieving metric values. Each method returns undefined
@@ -245,6 +269,16 @@ tr.exportTo('tr.metrics', function() {
return this.seekTimes_;
}
+ // Reports aggregate roughness.
+ get roughness() {
+ return this.roughness_;
+ }
+
+ // Reports aggregate freezing.
+ get freezing() {
+ return this.freezing_;
+ }
+
// API methods for processing data from trace events.
processVideoRenderTime(videoRenderTime) {
@@ -359,6 +393,20 @@ tr.exportTo('tr.metrics', function() {
}
}
+ processVideoRoughness(roughness) {
+ // Record the worst roughness.
+ if (this.roughness_ === undefined || this.roughness_ > roughness) {
+ this.roughness_ = roughness;
+ }
+ }
+
+ processVideoFreezing(freezing) {
+ // Record the worst freezing.
+ if (this.freezing_ === undefined || this.freezing_ > freezing) {
+ this.freezing_ = freezing;
+ }
+ }
+
addMetricToHistograms(histograms) {
this.addSample_(histograms, 'time_to_video_play',
tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,
@@ -384,6 +432,12 @@ tr.exportTo('tr.metrics', function() {
this.addSample_(histograms, 'buffering_time',
tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,
this.bufferingTime);
+ this.addSample_(histograms, 'roughness',
+ tr.b.Unit.byName.count_smallerIsBetter,
+ this.roughness);
+ this.addSample_(histograms, 'freezing',
+ tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,
+ this.freezing);
}
// @private
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/metric_map_function.html b/chromium/third_party/catapult/tracing/tracing/metrics/metric_map_function.html
index 02f5dcf02b5..0cb63b11c8d 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/metric_map_function.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/metric_map_function.html
@@ -147,6 +147,12 @@ tr.exportTo('tr.metrics', function() {
function validateDiagnosticNames(histograms) {
for (const hist of histograms) {
for (const name of hist.diagnostics.keys()) {
+ if (name === tr.v.d.RESERVED_NAMES.ALERT_GROUPING) {
+ // Metrics can set alert grouping when they create histogram. It's
+ // still a reserved diagnostic because that helps us enforce the right
+ // diagnostic shape.
+ continue;
+ }
if (tr.v.d.RESERVED_NAMES_SET.has(name)) {
throw new Error(
`Illegal diagnostic name "${name}" on Histogram "${hist.name}"`);
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/partition_alloc/OWNERS b/chromium/third_party/catapult/tracing/tracing/metrics/partition_alloc/OWNERS
new file mode 100644
index 00000000000..228f0c3184b
--- /dev/null
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/partition_alloc/OWNERS
@@ -0,0 +1,2 @@
+bikineev@chromium.org
+mlippautz@chromium.org
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/partition_alloc/pcscan_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/partition_alloc/pcscan_metric.html
new file mode 100644
index 00000000000..33743f757a5
--- /dev/null
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/partition_alloc/pcscan_metric.html
@@ -0,0 +1,195 @@
+<!DOCTYPE html>
+<!--
+Copyright 2020 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<link rel="import" href="/tracing/base/math/range.html">
+<link rel="import" href="/tracing/base/unit.html">
+<link rel="import" href="/tracing/extras/chrome/chrome_processes.html">
+<link rel="import" href="/tracing/metrics/metric_registry.html">
+<link rel="import" href="/tracing/model/helpers/chrome_model_helper.html">
+<link rel="import" href="/tracing/value/histogram.html">
+
+<script>
+'use strict';
+
+/**
+ * @fileoverview This file contains implementations of PCScan metrics. PCScan
+ * is the algorithm that eliminates use-after-free bugs by verifying that there
+ * are no pointers in memory which point to explicitly freed objects before
+ * actually releasing their memory.
+ *
+ * pa:pcscan:<process_name>:<scanner|mutator>
+ * ========================
+ * The overall time spent on scanning the partition alloc heap for a specific
+ * process either in the scanner or mutator thread (process_name can be either 'browser_process' or 'renderer_processes').
+ *
+ * pa:pcscan:<process_name>:<scanner|mutator>:<phase>
+ * ========================
+ * Time spent on a certain PCScan phase ('clear', 'scan' or 'sweep').
+ */
+tr.exportTo('tr.metrics.pa', function() {
+ function pcscanMetric(histograms, model) {
+ function createTimeNumericForProcess(name, processName, context, desc) {
+ function createNumeric(name, desc) {
+ const n = new tr.v.Histogram(name,
+ tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);
+ n.description = desc;
+ n.customizeSummaryOptions({
+ avg: true,
+ count: true,
+ max: true,
+ min: true,
+ std: true,
+ sum: true});
+ return n;
+ }
+ const scheme = ['pa', 'pcscan', processName, context];
+ if (name) scheme.push(name);
+ return createNumeric(scheme.join(':'), desc);
+ }
+
+ function createSizeNumericForProcess(name, processName, desc) {
+ function createNumeric(name, desc) {
+ const n = new tr.v.Histogram(name,
+ tr.b.Unit.byName.sizeInBytes_smallerIsBetter);
+ n.description = desc;
+ n.customizeSummaryOptions({
+ avg: true,
+ count: true,
+ max: true,
+ min: true,
+ std: true,
+ sum: true});
+ return n;
+ }
+ const scheme = ['pa', 'pcscan', processName, name];
+ return createNumeric(scheme.join(':'), desc);
+ }
+
+ function createPercentNumericForProcess(name, processName, desc) {
+ function createNumeric(name, desc) {
+ const n = new tr.v.Histogram(name,
+ tr.b.Unit.byName.normalizedPercentage_smallerIsBetter);
+ n.description = desc;
+ n.customizeSummaryOptions({
+ avg: true,
+ count: true,
+ max: true,
+ min: true,
+ std: true,
+ sum: true});
+ return n;
+ }
+ const scheme = ['pa', 'pcscan', processName, name];
+ return createNumeric(scheme.join(':'), desc);
+ }
+
+
+ function createHistsForProcess(processName) {
+ return {
+ scanner_scan: createTimeNumericForProcess('scan', processName, 'scanner',
+ 'Time for scanning heap for quarantine pointers on concurrent threads'),
+ scanner_sweep: createTimeNumericForProcess('sweep', processName, 'scanner',
+ 'Time for sweeping quarantine'),
+ scanner_clear: createTimeNumericForProcess('clear', processName, 'scanner',
+ 'Time for clearing quarantine entries'),
+ scanner_total: createTimeNumericForProcess('', processName, 'scanner',
+ 'Total time for PCScan execution on concurrent threads'),
+ mutator_scan_stack: createTimeNumericForProcess('scan_stack', processName, 'mutator',
+ 'Time for scanning stack for quarantine pointers on mutator threads'),
+ mutator_scan: createTimeNumericForProcess('scan', processName, 'mutator',
+ 'Time for scanning heap for quarantine pointers on mutator threads'),
+ mutator_clear: createTimeNumericForProcess('clear', processName, 'mutator',
+ 'Time for clearing heap quarantine entries on mutator threads'),
+ mutator_total: createTimeNumericForProcess('', processName, 'mutator',
+ 'Total time for PCScan execution on mutator threads (inside safepoints)'),
+ survived_quarantine_size: createSizeNumericForProcess(
+ 'survived_quarantine_size', processName,
+ 'Size in bytes of survived quarantined objects after each *Scan cycle'),
+ survived_quarantine_percent: createPercentNumericForProcess(
+ 'survived_quarantine_percent', processName,
+ 'Percent of survived quarantined objects after a *Scan cycle relative ' +
+ 'to the size of quarantined objects before the cycle'),
+ };
+ }
+
+ function addSliceSample(hists, slice) {
+ if (slice.category !== 'partition_alloc') return;
+ if (!(slice instanceof tr.model.ThreadSlice)) return;
+
+ if (slice.title === 'PCScan.Scanner.Scan') {
+ hists.scanner_scan.addSample(slice.duration);
+ } else if (slice.title === 'PCScan.Scanner.Sweep') {
+ hists.scanner_sweep.addSample(slice.duration);
+ } else if (slice.title === 'PCScan.Scanner.Clear') {
+ hists.scanner_clear.addSample(slice.duration);
+ } else if (slice.title === 'PCScan.Scanner') {
+ hists.scanner_total.addSample(slice.duration);
+ } else if (slice.title === 'PCScan.Mutator.ScanStack') {
+ hists.mutator_scan_stack.addSample(slice.duration);
+ } else if (slice.title === 'PCScan.Mutator.Scan') {
+ hists.mutator_scan.addSample(slice.duration);
+ } else if (slice.title === 'PCScan.Mutator.Clear') {
+ hists.mutator_clear.addSample(slice.duration);
+ } else if (slice.title === 'PCScan.Mutator') {
+ hists.mutator_total.addSample(slice.duration);
+ }
+ }
+
+ function addCounterSample(hists, counter) {
+ if (counter.category !== 'partition_alloc') return;
+ if (!(counter instanceof tr.model.Counter)) return;
+
+ for (const series of counter.series) {
+ for (const sample of series.samples) {
+ if (counter.name === 'PCScan.SurvivedQuarantineSize') {
+ hists.survived_quarantine_size.addSample(sample.value);
+ } else if (counter.name === 'PCScan.SurvivedQuarantinePercent') {
+ // Divide by 1000, since StatsCollector multiplies it by 1000.
+ hists.survived_quarantine_percent.addSample(sample.value / 1000);
+ }
+ }
+ }
+ }
+
+ function addHistsForProcess(processHists, processHelpers) {
+ for (const helper of Object.values(processHelpers)) {
+ const processName = tr.e.chrome.chrome_processes.
+ canonicalizeProcessName(helper.process.name);
+ if (!processHists.has(processName)) {
+ processHists.set(processName, createHistsForProcess(processName));
+ }
+ for (const slice of helper.process.getDescendantEvents()) {
+ addSliceSample(processHists.get(processName), slice);
+ }
+ for (const tid in helper.process.counters) {
+ addCounterSample(processHists.get(processName), helper.process.counters[tid]);
+ }
+ }
+ }
+
+ const helper =
+ model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);
+
+ const processHists = new Map();
+ addHistsForProcess(processHists, helper.browserHelpers);
+ addHistsForProcess(processHists, helper.rendererHelpers);
+
+ for (const hists of processHists.values()) {
+ for (const hist of Object.values(hists)) {
+ histograms.addHistogram(hist);
+ }
+ }
+ }
+
+ tr.metrics.MetricRegistry.register(pcscanMetric);
+
+ return {
+ pcscanMetric,
+ };
+});
+
+</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/partition_alloc/pcscan_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/partition_alloc/pcscan_metric_test.html
new file mode 100644
index 00000000000..ca43e546b56
--- /dev/null
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/partition_alloc/pcscan_metric_test.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html>
+<!--
+Copyright 2020 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<link rel="import" href="/tracing/core/test_utils.html">
+<link rel="import" href="/tracing/extras/chrome/chrome_processes.html">
+<link rel="import" href="/tracing/extras/chrome/chrome_test_utils.html">
+<link rel="import" href="/tracing/metrics/partition_alloc/pcscan_metric.html">
+<link rel="import" href="/tracing/value/histogram_set.html">
+
+<script>
+'use strict';
+
+tr.b.unittest.testSuite(function() {
+ const CHROME_PROCESS_NAMES =
+ tr.e.chrome.chrome_processes.CHROME_PROCESS_NAMES;
+
+ function makeTestModelFor(processName) {
+ return tr.e.chrome.ChromeTestUtils.newChromeModel(function(model) {
+ const process = (processName === CHROME_PROCESS_NAMES.RENDERER ?
+ model.rendererProcess : model.browserProcess);
+ const thread = process.getOrCreateThread(2);
+ // Create slices.
+ thread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
+ cat: 'partition_alloc',
+ title: 'PCScan.Scanner',
+ start: 200,
+ duration: 100,
+ cpuStart: 200,
+ cpuDuration: 100
+ }));
+ thread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
+ cat: 'partition_alloc',
+ title: 'PCScan.Mutator',
+ start: 200,
+ duration: 50,
+ cpuStart: 200,
+ cpuDuration: 50
+ }));
+ thread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
+ cat: 'partition_alloc',
+ title: 'PCScan.Scanner.Clear',
+ start: 200,
+ duration: 16,
+ cpuStart: 200,
+ cpuDuration: 16
+ }));
+ thread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
+ cat: 'partition_alloc',
+ title: 'PCScan.Scanner.Scan',
+ start: 216,
+ duration: 32,
+ cpuStart: 216,
+ cpuDuration: 32
+ }));
+ thread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
+ cat: 'partition_alloc',
+ title: 'PCScan.Mutator.Clear',
+ start: 210,
+ duration: 8,
+ cpuStart: 210,
+ cpuDuration: 8
+ }));
+ thread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
+ cat: 'partition_alloc',
+ title: 'PCScan.Mutator.ScanStack',
+ start: 218,
+ duration: 14,
+ cpuStart: 218,
+ cpuDuration: 14
+ }));
+ thread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
+ cat: 'partition_alloc',
+ title: 'PCScan.Mutator.Scan',
+ start: 232,
+ duration: 16,
+ cpuStart: 232,
+ cpuDuration: 16
+ }));
+ thread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
+ cat: 'partition_alloc',
+ title: 'PCScan.Scanner.Sweep',
+ start: 248,
+ duration: 42,
+ cpuStart: 248,
+ cpuDuration: 42
+ }));
+ // Create counters.
+ const quarantineSizeCounter = process.getOrCreateCounter('partition_alloc', 'PCScan.SurvivedQuarantineSize');
+ const quarantineSizeSeries = new tr.model.CounterSeries('value', 0);
+ quarantineSizeSeries.addCounterSample(1, 200000);
+ quarantineSizeSeries.addCounterSample(3, 300000);
+ quarantineSizeCounter.addSeries(quarantineSizeSeries);
+ const quarantineRateCounter = process.getOrCreateCounter('partition_alloc', 'PCScan.SurvivedQuarantinePercent');
+ const quarantineRateSeries = new tr.model.CounterSeries('value', 0);
+ quarantineRateSeries.addCounterSample(1, 0.14 * 1000);
+ quarantineRateSeries.addCounterSample(3, 0.21 * 1000);
+ quarantineRateCounter.addSeries(quarantineRateSeries);
+ });
+ }
+
+ function testPCScanMetrics(processName) {
+ const histograms = new tr.v.HistogramSet();
+ tr.metrics.pa.pcscanMetric(histograms, makeTestModelFor(processName));
+ assert.closeTo(100, histograms.getHistogramNamed(
+ 'pa:pcscan:' + processName + ':scanner').average, 1e-2);
+ assert.closeTo(50, histograms.getHistogramNamed(
+ 'pa:pcscan:' + processName + ':mutator').average, 1e-2);
+ assert.closeTo(16, histograms.getHistogramNamed(
+ 'pa:pcscan:' + processName + ':scanner:clear').average, 1e-2);
+ assert.closeTo(32, histograms.getHistogramNamed(
+ 'pa:pcscan:' + processName + ':scanner:scan').average, 1e-2);
+ assert.closeTo(8, histograms.getHistogramNamed(
+ 'pa:pcscan:' + processName + ':mutator:clear').average, 1e-2);
+ assert.closeTo(14, histograms.getHistogramNamed(
+ 'pa:pcscan:' + processName + ':mutator:scan_stack').average, 1e-2);
+ assert.closeTo(16, histograms.getHistogramNamed(
+ 'pa:pcscan:' + processName + ':mutator:scan').average, 1e-2);
+ assert.closeTo(42, histograms.getHistogramNamed(
+ 'pa:pcscan:' + processName + ':scanner:sweep').average, 1e-2);
+ assert.closeTo(250000, histograms.getHistogramNamed(
+ 'pa:pcscan:' + processName + ':survived_quarantine_size').average, 1e-2);
+ assert.closeTo(0.175, histograms.getHistogramNamed(
+ 'pa:pcscan:' + processName + ':survived_quarantine_percent').average, 1e-2);
+ }
+
+ test('pcscanMetricForBrowser', function() {
+ testPCScanMetrics(CHROME_PROCESS_NAMES.BROWSER);
+ });
+
+ test('pcscanMetricForRenderer', function() {
+ testPCScanMetrics(CHROME_PROCESS_NAMES.RENDERER);
+ });
+});
+</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/rendering/cpu_utilization.html b/chromium/third_party/catapult/tracing/tracing/metrics/rendering/cpu_utilization.html
index 16e185c172e..e6d55984e27 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/rendering/cpu_utilization.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/rendering/cpu_utilization.html
@@ -7,6 +7,9 @@ found in the LICENSE file.
<link rel="import" href="/tracing/base/math/statistics.html">
<link rel="import" href="/tracing/base/unit.html">
+<link rel="import" href="/tracing/model/helpers/chrome_model_helper.html">
+<link rel="import" href="/tracing/model/user_model/segment.html">
+
<link rel="import" href="/tracing/value/histogram.html">
<script>
@@ -15,7 +18,7 @@ found in the LICENSE file.
/**
* @fileoverview This file contains implementations of the following metrics.
*
- * The addCpuUtilizationHistograms method can generate the following sets of
+ * The addCpuSegmentCostHistograms method can generate the following sets of
* metrics, dependeing on the input values for segments, and segmentCostFunc.
*
* thread_{thread group}_cpu_time_per_frame
@@ -34,6 +37,13 @@ found in the LICENSE file.
* This set of metrics show the distribution of the number of task in each
* display compositor's frame of a thread group.
*
+ * The addCpuWallTimeHistogram method generates the metric:
+ * cpu_wall_time_ratio
+ * ==================
+ * segments: display compositor's frames
+ *
+ * This metric shows the ratio of cpu usage to wall time.
+ *
* Note: the CPU usage in all above-mentioned metrics, is approximated from
* top-level trace events in each thread; it does not come from the OS. So, the
* metric may be noisy and not be very meaningful for threads that do not have a
@@ -86,7 +96,7 @@ tr.exportTo('tr.metrics.rendering', function() {
if (isOther) yield 'other';
}
- function addCpuUtilizationHistograms(
+ function addCpuSegmentCostHistograms(
histograms, model, segments, segmentCostFunc, histogramNameFunc,
description) {
const categoryValues = new Map();
@@ -120,14 +130,26 @@ tr.exportTo('tr.metrics.rendering', function() {
}
}
- const SUMMARY_OPTIONS = {
- percentile: [0.90, 0.95],
- ci: [0.95],
- };
+ function addCpuWallTimeHistogram(histograms, model, segments) {
+ let totalWallTime = 0;
+ let totalCpuTime = 0;
+ for (const segment of segments) {
+ for (const thread of model.getAllThreads()) {
+ totalCpuTime += thread.getCpuTimeForRange(segment.boundsRange);
+ totalWallTime += thread.getWallTimeForRange(segment.boundsRange);
+ }
+ }
+ histograms.createHistogram('cpu_wall_time_ratio',
+ tr.b.Unit.byName.unitlessNumber_biggerIsBetter,
+ totalWallTime ? totalCpuTime / totalWallTime : NaN,
+ { description: 'Ratio of total cpu-time vs. wall-time.',
+ summaryOptions: {},
+ });
+ }
return {
- addCpuUtilizationHistograms,
- SUMMARY_OPTIONS,
+ addCpuSegmentCostHistograms,
+ addCpuWallTimeHistogram,
};
});
</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/rendering/cpu_utilization_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/rendering/cpu_utilization_test.html
index 9c3e0d21def..a5aab4912fc 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/rendering/cpu_utilization_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/rendering/cpu_utilization_test.html
@@ -38,7 +38,7 @@ tr.b.unittest.testSuite(function() {
{ start: 5, end: 6, cpuStart: 1, cpuEnd: 2 }));
});
const histograms = new tr.v.HistogramSet();
- tr.metrics.rendering.addCpuUtilizationHistograms(
+ tr.metrics.rendering.addCpuSegmentCostHistograms(
histograms, model, [new tr.model.um.Segment(0, 10)],
(thread, segment) => thread.getCpuTimeForRange(segment.boundsRange),
category => `thread_${category}_cpu_time_per_frame`, 'description');
@@ -95,7 +95,7 @@ tr.b.unittest.testSuite(function() {
{ start: 5, end: 6, cpuStart: 1, cpuEnd: 2 }));
});
const histograms = new tr.v.HistogramSet();
- tr.metrics.rendering.addCpuUtilizationHistograms(
+ tr.metrics.rendering.addCpuSegmentCostHistograms(
histograms, model,
[new tr.model.um.Segment(0, 5), new tr.model.um.Segment(5, 5)],
(thread, segment) => thread.getCpuTimeForRange(segment.boundsRange),
@@ -134,7 +134,7 @@ tr.b.unittest.testSuite(function() {
{ start: 5, end: 6, cpuStart: 1, cpuEnd: 2 }));
});
const histograms = new tr.v.HistogramSet();
- tr.metrics.rendering.addCpuUtilizationHistograms(
+ tr.metrics.rendering.addCpuSegmentCostHistograms(
histograms, model, [new tr.model.um.Segment(0, 10)],
(thread, segment) => thread.getCpuTimeForRange(segment.boundsRange),
category => `thread_${category}_cpu_time_per_frame`, 'description');
@@ -176,7 +176,7 @@ tr.b.unittest.testSuite(function() {
{ start: 5, end: 6, cpuStart: 1, cpuEnd: 2 }));
});
const histograms = new tr.v.HistogramSet();
- tr.metrics.rendering.addCpuUtilizationHistograms(
+ tr.metrics.rendering.addCpuSegmentCostHistograms(
histograms, model, [new tr.model.um.Segment(0, 10)],
(thread, segment) =>
thread.getNumToplevelSlicesForRange(segment.boundsRange),
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/rendering/frame_segment_filter.html b/chromium/third_party/catapult/tracing/tracing/metrics/rendering/frame_segment_filter.html
new file mode 100644
index 00000000000..9ebaa87d003
--- /dev/null
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/rendering/frame_segment_filter.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html>
+<!--
+Copyright 2022 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<link rel="import" href="/tracing/base/math/statistics.html">
+<link rel="import" href="/tracing/base/unit.html">
+<link rel="import" href="/tracing/base/unit_scale.html">
+<link rel="import" href="/tracing/metrics/rendering/cpu_utilization.html">
+<link rel="import" href="/tracing/model/helpers/chrome_model_helper.html">
+<link rel="import" href="/tracing/model/user_model/segment.html">
+<link rel="import" href="/tracing/value/diagnostics/generic_set.html">
+<link rel="import" href="/tracing/value/diagnostics/related_event_set.html">
+<link rel="import" href="/tracing/value/histogram.html">
+
+<script>
+'use strict';
+
+/**
+ * @fileoverview This file contains helper methods to filter Segments to just
+ * those for the displaying of frames.
+ */
+tr.exportTo('tr.metrics.rendering', function() {
+ // Various tracing events.
+ const DISPLAY_EVENT = 'BenchmarkInstrumentation::DisplayRenderingStats';
+ const DRM_EVENT = 'DrmEventFlipComplete';
+ const SURFACE_FLINGER_EVENT = 'vsync_before';
+
+
+ // The least number of frames needed to report frame_times.
+ // Measurements done with very few frames tend to be unstable.
+ // See crbug.com/954984 for example.
+ const MIN_FRAME_COUNT = 10;
+
+
+ class FrameEvent {
+ constructor(event) {
+ this.event_ = event;
+ }
+
+ get eventStart() {
+ return this.event_.start;
+ }
+
+ get frameStart() {
+ if (this.event_.title !== DRM_EVENT) return this.event_.start;
+ const data = this.event_.args.data;
+ const TIME = tr.b.UnitScale.TIME;
+ return tr.b.convertUnit(data['vblank.tv_sec'], TIME.SEC, TIME.MILLI_SEC) +
+ tr.b.convertUnit(
+ data['vblank.tv_usec'], TIME.MICRO_SEC, TIME.MILLI_SEC);
+ }
+
+ get event() { return this.event_; }
+ }
+
+
+ function getDisplayCompositorPresentationEvents_(model) {
+ const modelHelper = model.getOrCreateHelper(
+ tr.model.helpers.ChromeModelHelper);
+ if (!modelHelper || !modelHelper.browserProcess) return [];
+ // On ChromeOS, DRM events, if they exist, are the source of truth. On
+ // Android, Surface Flinger events are the source of truth. Otherwise, look
+ // for display rendering stats. With viz, display rendering stats are
+ // emitted from the GPU process; otherwise, they are emitted from the
+ // browser process.
+ let events = [];
+ if (modelHelper.surfaceFlingerProcess) {
+ events = [...modelHelper.surfaceFlingerProcess.findTopmostSlicesNamed(
+ SURFACE_FLINGER_EVENT)];
+ if (events.length > 0) return events;
+ }
+ if (modelHelper.gpuHelper) {
+ const gpuProcess = modelHelper.gpuHelper.process;
+ events = [...gpuProcess.findTopmostSlicesNamed(DRM_EVENT)];
+ if (events.length > 0) return events;
+ events = [...gpuProcess.findTopmostSlicesNamed(DISPLAY_EVENT)];
+ if (events.length > 0) return events;
+ }
+ return [...modelHelper.browserProcess.findTopmostSlicesNamed(
+ DISPLAY_EVENT)];
+ }
+
+
+ function computeFrameSegments(model, segments) {
+ const events = getDisplayCompositorPresentationEvents_(model);
+ if (!events) return [];
+ // We use filterArray for the sake of a cleaner code. The time complexity
+ // will be O(m + n log m), where m is |timestamps| and n is |segments|.
+ // Alternatively, we could directly loop through the timestamps and segments
+ // here for a slightly better time complexity of O(m + n).
+ const frameEvents = events.map(e => new FrameEvent(e));
+ const frameSegments = [];
+ for (const segment of segments) {
+ const filtered = segment.boundsRange.filterArray(
+ frameEvents, x => x.eventStart);
+ if (filtered.length < MIN_FRAME_COUNT) continue;
+ for (let i = 1; i < filtered.length; i++) {
+ const duration = filtered[i].frameStart - filtered[i - 1].frameStart;
+ frameSegments.push(new tr.model.um.Segment(filtered[i - 1].eventStart, duration));
+ }
+ }
+ return frameSegments;
+ }
+
+ return {
+ computeFrameSegments,
+ };
+});
+</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/rendering/queueing_duration.html b/chromium/third_party/catapult/tracing/tracing/metrics/rendering/queueing_duration.html
index 386bd444658..aa690649f66 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/rendering/queueing_duration.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/rendering/queueing_duration.html
@@ -22,8 +22,8 @@ found in the LICENSE file.
* ScheduledActionSendBeginMainFrame event in the compositor thread and the
* corresponding BeginMainFrame event in the main thread.
*
- * TODO(chiniforooshan): Does it make sense to just ignore data from OOPIF
- * processes, like what we are doing here?
+ * For OOPIF they might send a BeginMainFrame with the same ID, in those cases
+ * the earliest slice's time is used.
*/
tr.exportTo('tr.metrics.rendering', function() {
// Various tracing events.
@@ -38,7 +38,12 @@ tr.exportTo('tr.metrics.rendering', function() {
if (slice.title !== title) continue;
const id = slice.args.begin_frame_id;
if (id === undefined) throw new Error('Event is missing begin_frame_id');
- if (out.has(id)) throw new Error(`There must be exactly one ${title}`);
+ // If we've already seen an even with this name, we only track the first.
+ // Multiple ThreadProxy::BeginMainFrames can occur when OOPIF share the
+ // same origin and get routed to the same RendererMain.
+ if (out.has(id) && out[id] <= slice.start) {
+ continue;
+ }
out.set(id, slice.start);
}
return out;
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/rendering/rendering_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/rendering/rendering_metric.html
index b7d292eec14..0944c00c049 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/rendering/rendering_metric.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/rendering/rendering_metric.html
@@ -6,7 +6,8 @@ found in the LICENSE file.
-->
<link rel="import" href="/tracing/metrics/metric_registry.html">
-<link rel="import" href="/tracing/metrics/rendering/frame_time.html">
+<link rel="import" href="/tracing/metrics/rendering/cpu_utilization.html">
+<link rel="import" href="/tracing/metrics/rendering/frame_segment_filter.html">
<link rel="import" href="/tracing/metrics/rendering/image_decode_time.html">
<link rel="import" href="/tracing/metrics/rendering/pixels.html">
<link rel="import" href="/tracing/metrics/rendering/queueing_duration.html">
@@ -28,19 +29,28 @@ tr.exportTo('tr.metrics.rendering', function() {
segments = chromeHelper.telemetryHelper.animationSegments;
}
if (segments.length > 0) {
- tr.metrics.rendering.addFrameTimeHistograms(histograms, model, segments);
+ const frameSegments = tr.metrics.rendering.computeFrameSegments(model, segments);
+ if (frameSegments.length > 0) {
+ tr.metrics.rendering.addCpuSegmentCostHistograms(
+ histograms, model, frameSegments,
+ (thread, segment) => thread.getCpuTimeForRange(segment.boundsRange),
+ category => `thread_${category}_cpu_time_per_frame`,
+ 'CPU cores of a thread group per frame');
+ tr.metrics.rendering.addCpuSegmentCostHistograms(
+ histograms, model, frameSegments,
+ (thread, segment) =>
+ thread.getNumToplevelSlicesForRange(segment.boundsRange),
+ category => `tasks_per_frame_${category}`,
+ 'Number of tasks of a thread group per frame');
+ tr.metrics.rendering.addCpuWallTimeHistogram(histograms, model, frameSegments);
+ }
+
tr.metrics.rendering.addImageDecodeTimeHistograms(histograms, model,
segments);
tr.metrics.rendering.addPixelsHistograms(histograms, model, segments);
tr.metrics.rendering.addQueueingDurationHistograms(
histograms, model, segments);
}
-
- const uiSegments = chromeHelper.telemetryHelper.uiSegments;
- if (uiSegments.length > 0) {
- tr.metrics.rendering.addUIFrameTimeHistograms(
- histograms, model, chromeHelper.telemetryHelper.uiSegments);
- }
}
tr.metrics.MetricRegistry.register(renderingMetric, {
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/rendering/rendering_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/rendering/rendering_metric_test.html
index 1d30078252a..8cdf4b42b5c 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/rendering/rendering_metric_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/rendering/rendering_metric_test.html
@@ -39,11 +39,11 @@ tr.b.unittest.testSuite(function() {
// The gesture interaction record should be adjusted to [10, 30]. So, the
// first two frames and the last frame are outside the interaction record
// and should be discarded. The remaining frames are 11 to 29 which result
- // in 9 frame times of 2.
- const hist = histograms.getHistogramNamed('frame_times');
- assert.closeTo(2, hist.min, 1e-6);
- assert.closeTo(2, hist.max, 2e-6);
- assert.closeTo(2, hist.average, 1e-6);
+ // in 9 frames which have 1 task each.
+ const hist = histograms.getHistogramNamed('tasks_per_frame_total_all');
+ assert.closeTo(1, hist.min, 1e-6);
+ assert.closeTo(1, hist.max, 1e-6);
+ assert.closeTo(1, hist.average, 1e-6);
});
});
</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/breakdown_tree_helpers_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/breakdown_tree_helpers_test.html
index b40db0341b4..30f9dbe2cee 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/breakdown_tree_helpers_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/breakdown_tree_helpers_test.html
@@ -33,7 +33,7 @@ tr.b.unittest.testSuite(function() {
// Add layout categories
mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
cat: 'blink',
- title: 'HTMLDocumentParser::didReceiveParsedChunkFromBackgroundParser',
+ title: 'HTMLDocumentParser::DeferredPumpTokenizerIfPossible',
start: 200,
duration: 200,
cpuStart: 1160,
@@ -102,7 +102,7 @@ tr.b.unittest.testSuite(function() {
assert.deepEqual({
total: 150,
events: {
- 'HTMLDocumentParser::didReceiveParsedChunkFromBackgroundParser': 150
+ 'HTMLDocumentParser::DeferredPumpTokenizerIfPossible': 150
}
}, breakdownTree.parseHTML);
assert.deepEqual({
@@ -147,7 +147,7 @@ tr.b.unittest.testSuite(function() {
assert.deepEqual({
total: 100,
events: {
- 'HTMLDocumentParser::didReceiveParsedChunkFromBackgroundParser': 100
+ 'HTMLDocumentParser::DeferredPumpTokenizerIfPossible': 100
}
}, breakdownTree.parseHTML);
assert.deepEqual({
@@ -181,7 +181,7 @@ tr.b.unittest.testSuite(function() {
assert.deepEqual({
total: 120,
events: {
- 'HTMLDocumentParser::didReceiveParsedChunkFromBackgroundParser': 120
+ 'HTMLDocumentParser::DeferredPumpTokenizerIfPossible': 120
}
}, breakdownTree.parseHTML);
assert.deepEqual({
@@ -226,7 +226,7 @@ tr.b.unittest.testSuite(function() {
assert.deepEqual({
total: 80,
events: {
- 'HTMLDocumentParser::didReceiveParsedChunkFromBackgroundParser': 80
+ 'HTMLDocumentParser::DeferredPumpTokenizerIfPossible': 80
}
}, breakdownTree.parseHTML);
assert.deepEqual({
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/cpu_time_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/cpu_time_metric.html
index f8a63e84ba7..2d22034dbad 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/cpu_time_metric.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/cpu_time_metric.html
@@ -8,6 +8,7 @@ found in the LICENSE file.
<link rel="import" href="/tracing/metrics/metric_registry.html">
<link rel="import" href="/tracing/model/helpers/chrome_model_helper.html">
<link rel="import" href="/tracing/model/helpers/chrome_renderer_helper.html">
+<link rel="import" href="/tracing/value/diagnostics/alert_groups.html">
<link rel="import" href="/tracing/value/histogram.html">
<script>
@@ -78,6 +79,7 @@ tr.exportTo('tr.metrics.sh', function() {
cpuTimeHist.description =
'Percent CPU utilization, normalized against a single core. Can be ' +
'greater than 100% if machine has multiple cores.';
+ cpuTimeHist.setAlertGrouping([tr.v.d.ALERT_GROUPS.CPU_USAGE]);
cpuTimeHist.customizeSummaryOptions({
avg: true,
count: false,
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/loading_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/loading_metric.html
index d6884fa43c4..2c5ab4b2d03 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/loading_metric.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/loading_metric.html
@@ -18,6 +18,7 @@ found in the LICENSE file.
<link rel="import" href="/tracing/model/helpers/chrome_model_helper.html">
<link rel="import" href="/tracing/model/helpers/chrome_thread_helper.html">
<link rel="import" href="/tracing/model/timed_event.html">
+<link rel="import" href="/tracing/value/diagnostics/alert_groups.html">
<link rel="import" href="/tracing/value/diagnostics/diagnostic_map.html">
<link rel="import" href="/tracing/value/histogram.html">
@@ -186,7 +187,14 @@ tr.exportTo('tr.metrics.sh', function() {
const frameIdRef = targetEvent.args.frame;
const snapshot = findFrameLoaderSnapshotAt(
rendererHelper, frameIdRef, targetEvent.start);
- if (snapshot === undefined || !snapshot.args.isLoadingMainFrame) continue;
+ if (snapshot === undefined) continue;
+ // If isOutermostMainFrame is available, use it, if not use
+ // isLoadingMainFrame.
+ const isOutermostMainFrame =
+ (snapshot.args.isOutermostMainFrame !== undefined) ?
+ snapshot.args.isOutermostMainFrame :
+ snapshot.args.isLoadingMainFrame;
+ if (!isOutermostMainFrame) continue;
const url = snapshot.args.documentLoaderURL;
if (tr.e.chrome.CHROME_INTERNAL_URLS.includes(url)) continue;
let navigationStartEvent;
@@ -264,7 +272,7 @@ tr.exportTo('tr.metrics.sh', function() {
return samples;
}
- function findLayoutShiftSamples(rendererHelper) {
+ function findMainFrameLayoutShiftSamples(rendererHelper) {
let sample;
EventFinderUtils.getSortedMainThreadEventsByFrame(rendererHelper,
'LayoutShift', 'loading').forEach((events) => {
@@ -274,7 +282,34 @@ tr.exportTo('tr.metrics.sh', function() {
sample = {value: evData.cumulative_score};
}
});
- return sample ? [sample] : [];
+ // When there is no layout shift event on found on the page, CLS is 0.
+ return sample ? [sample] : [{value: 0}];
+ }
+
+ function findAllLayoutShiftSamples(chromeHelper) {
+ let total = 0;
+ let foundMainFrame = false;
+ for (const pid in chromeHelper.rendererHelpers) {
+ const rendererHelper = chromeHelper.rendererHelpers[pid];
+ if (rendererHelper.isChromeTracingUI) continue;
+
+ tr.e.chrome.EventFinderUtils.getSortedMainThreadEventsByFrame(
+ rendererHelper, 'LayoutShift', 'loading').forEach((events) => {
+ // Add up the scores for main frames and weighted scores for subframes.
+ for (const event of events) {
+ const evData = event.args.data;
+ if (evData.is_main_frame) {
+ total += evData.score;
+ foundMainFrame = true;
+ } else {
+ total += evData.weighted_score_delta;
+ }
+ }
+ });
+ }
+
+ // If no CLS is found, report value as 0 instead of null.
+ return foundMainFrame ? [{value: total}] : [{value: 0}];
}
function addFirstMeaningfulPaintSample(samples, rendererHelper,
@@ -487,7 +522,8 @@ tr.exportTo('tr.metrics.sh', function() {
const largestTextPaintSamples = findLargestTextPaintSamples(
rendererHelper, frameToNavStartEvents,
navIdToNavStartEvents);
- const layoutShiftSamples = findLayoutShiftSamples(rendererHelper);
+ const mainFrameLayoutShiftSamples = findMainFrameLayoutShiftSamples(
+ rendererHelper);
const navigationStartSamples = timeToFCPEntries.map(entry => {
return { value: entry.navigationStartEvent.start};
});
@@ -502,7 +538,7 @@ tr.exportTo('tr.metrics.sh', function() {
firstViewportReadySamples,
largestImagePaintSamples,
largestTextPaintSamples,
- layoutShiftSamples,
+ mainFrameLayoutShiftSamples,
navigationStartSamples,
};
}
@@ -568,40 +604,6 @@ tr.exportTo('tr.metrics.sh', function() {
function addSamplesToHistogram(samples, histogram, histograms) {
for (const sample of samples) {
histogram.addSample(sample.value, sample.diagnostics);
-
- // Only add breakdown histograms for FCP.
- // http://crbug.com/771610
- if (histogram.name !== 'timeToFirstContentfulPaint') continue;
-
- if (!sample.breakdownTree) continue;
- for (const [category, breakdown] of Object.entries(
- sample.breakdownTree)) {
- const relatedName = `${histogram.name}:${category}`;
- let relatedHist = histograms.getHistogramsNamed(relatedName)[0];
- if (!relatedHist) {
- relatedHist = histograms.createHistogram(
- relatedName, histogram.unit, [], {
- binBoundaries: LOADING_METRIC_BOUNDARIES,
- summaryOptions: {
- count: false,
- max: false,
- min: false,
- sum: false,
- },
- });
-
- let relatedNames = histogram.diagnostics.get('breakdown');
- if (!relatedNames) {
- relatedNames = new tr.v.d.RelatedNameMap();
- histogram.diagnostics.set('breakdown', relatedNames);
- }
- relatedNames.set(category, relatedName);
- }
- relatedHist.addSample(breakdown.total, {
- breakdown: tr.v.d.Breakdown.fromEntries(
- Object.entries(breakdown.events)),
- });
- }
}
}
@@ -611,18 +613,21 @@ tr.exportTo('tr.metrics.sh', function() {
binBoundaries: LOADING_METRIC_BOUNDARIES,
description: 'time to first paint',
summaryOptions: SUMMARY_OPTIONS,
+ alertGrouping: [tr.v.d.ALERT_GROUPS.LOADING_PAINT],
});
const firstContentfulPaintHistogram = histograms.createHistogram(
'timeToFirstContentfulPaint', timeDurationInMs_smallerIsBetter, [], {
binBoundaries: LOADING_METRIC_BOUNDARIES,
description: 'time to first contentful paint',
summaryOptions: SUMMARY_OPTIONS,
+ alertGrouping: [tr.v.d.ALERT_GROUPS.LOADING_PAINT],
});
const firstContentfulPaintCpuTimeHistogram = histograms.createHistogram(
'cpuTimeToFirstContentfulPaint', timeDurationInMs_smallerIsBetter, [], {
binBoundaries: LOADING_METRIC_BOUNDARIES,
description: 'CPU time to first contentful paint',
summaryOptions: SUMMARY_OPTIONS,
+ alertGrouping: [tr.v.d.ALERT_GROUPS.LOADING_PAINT],
});
const onLoadHistogram = histograms.createHistogram(
'timeToOnload', timeDurationInMs_smallerIsBetter, [], {
@@ -636,30 +641,36 @@ tr.exportTo('tr.metrics.sh', function() {
binBoundaries: LOADING_METRIC_BOUNDARIES,
description: 'time to first meaningful paint',
summaryOptions: SUMMARY_OPTIONS,
+ alertGrouping: [tr.v.d.ALERT_GROUPS.LOADING_PAINT],
});
const firstMeaningfulPaintCpuTimeHistogram = histograms.createHistogram(
'cpuTimeToFirstMeaningfulPaint', timeDurationInMs_smallerIsBetter, [], {
binBoundaries: LOADING_METRIC_BOUNDARIES,
description: 'CPU time to first meaningful paint',
summaryOptions: SUMMARY_OPTIONS,
+ alertGrouping: [tr.v.d.ALERT_GROUPS.LOADING_PAINT],
});
const timeToInteractiveHistogram = histograms.createHistogram(
'timeToInteractive', timeDurationInMs_smallerIsBetter, [], {
binBoundaries: TIME_TO_INTERACTIVE_BOUNDARIES,
description: 'Time to Interactive',
summaryOptions: SUMMARY_OPTIONS,
+ alertGrouping: [tr.v.d.ALERT_GROUPS.LOADING_PAINT],
+ alertGrouping: [tr.v.d.ALERT_GROUPS.LOADING_INTERACTIVITY],
});
const totalBlockingTimeHistogram = histograms.createHistogram(
'totalBlockingTime', timeDurationInMs_smallerIsBetter, [], {
binBoundaries: TIME_TO_INTERACTIVE_BOUNDARIES,
description: 'Total Blocking Time',
summaryOptions: SUMMARY_OPTIONS,
+ alertGrouping: [tr.v.d.ALERT_GROUPS.LOADING_INTERACTIVITY],
});
const timeToFirstCpuIdleHistogram = histograms.createHistogram(
'timeToFirstCpuIdle', timeDurationInMs_smallerIsBetter, [], {
binBoundaries: TIME_TO_INTERACTIVE_BOUNDARIES,
description: 'Time to First CPU Idle',
summaryOptions: SUMMARY_OPTIONS,
+ alertGrouping: [tr.v.d.ALERT_GROUPS.LOADING_INTERACTIVITY],
});
const aboveTheFoldLoadedToVisibleHistogram = histograms.createHistogram(
'aboveTheFoldLoadedToVisible', timeDurationInMs_smallerIsBetter, [], {
@@ -690,12 +701,21 @@ tr.exportTo('tr.metrics.sh', function() {
binBoundaries: LOADING_METRIC_BOUNDARIES,
description: 'Time to Largest Contentful Paint',
summaryOptions: SUMMARY_OPTIONS,
+ alertGrouping: [tr.v.d.ALERT_GROUPS.LOADING_PAINT],
});
- const layoutShiftHistogram = histograms.createHistogram(
+ const mainFrameLayoutShiftHistogram = histograms.createHistogram(
'mainFrameCumulativeLayoutShift', unitlessNumber_smallerIsBetter, [], {
binBoundaries: LAYOUT_SHIFT_SCORE_BOUNDARIES,
description: 'Main Frame Document Cumulative Layout Shift Score',
summaryOptions: SUMMARY_OPTIONS,
+ alertGrouping: [tr.v.d.ALERT_GROUPS.LOADING_LAYOUT],
+ });
+ const allLayoutShiftHistogram = histograms.createHistogram(
+ 'overallCumulativeLayoutShift', unitlessNumber_smallerIsBetter, [], {
+ binBoundaries: LAYOUT_SHIFT_SCORE_BOUNDARIES,
+ description: 'Document Cumulative Layout Shift Score with iframes',
+ summaryOptions: SUMMARY_OPTIONS,
+ alertGrouping: [tr.v.d.ALERT_GROUPS.LOADING_LAYOUT],
});
const navigationStartHistogram = histograms.createHistogram(
'navigationStart', timeDurationInMs_smallerIsBetter, [], {
@@ -707,6 +727,20 @@ tr.exportTo('tr.metrics.sh', function() {
const chromeHelper = model.getOrCreateHelper(
tr.model.helpers.ChromeModelHelper);
+
+ // Layout Shift and LCP are reported in the browser process, so we do not
+ // need to loop over the renderers to add samples.
+ const allLayoutShiftSamples = findAllLayoutShiftSamples(chromeHelper);
+ addSamplesToHistogram(
+ allLayoutShiftSamples,
+ allLayoutShiftHistogram,
+ histograms);
+
+ const lcpSamples = findLargestContentfulPaintHistogramSamples(
+ chromeHelper.browserHelper.mainThread.sliceGroup.slices);
+ addSamplesToHistogram(
+ lcpSamples, largestContentfulPaintHistogram, histograms);
+
for (const pid in chromeHelper.rendererHelpers) {
const rendererHelper = chromeHelper.rendererHelpers[pid];
if (rendererHelper.isChromeTracingUI) continue;
@@ -714,11 +748,6 @@ tr.exportTo('tr.metrics.sh', function() {
const samplesSet =
collectLoadingMetricsForRenderer(rendererHelper);
- const lcpSamples = findLargestContentfulPaintHistogramSamples(
- chromeHelper.browserHelper.mainThread.sliceGroup.slices);
- addSamplesToHistogram(
- lcpSamples, largestContentfulPaintHistogram, histograms);
-
addSamplesToHistogram(
samplesSet.firstPaintSamples, firstPaintHistogram, histograms);
addSamplesToHistogram(
@@ -748,7 +777,9 @@ tr.exportTo('tr.metrics.sh', function() {
largestTextPaintHistogram,
histograms);
addSamplesToHistogram(
- samplesSet.layoutShiftSamples, layoutShiftHistogram, histograms);
+ samplesSet.mainFrameLayoutShiftSamples,
+ mainFrameLayoutShiftHistogram,
+ histograms);
addSamplesToHistogram(
samplesSet.navigationStartSamples,
navigationStartHistogram,
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/loading_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/loading_metric_test.html
index f27187f5cb0..8d7f4eb53ef 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/loading_metric_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/loading_metric_test.html
@@ -30,6 +30,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -63,6 +64,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -88,15 +90,6 @@ tr.b.unittest.testSuite(function() {
const hist = histograms.getHistogramNamed('timeToFirstContentfulPaint');
assert.strictEqual(1, hist.running.count);
assert.strictEqual(800, hist.running.mean);
- const fcpResourceLoading = histograms.getHistogramNamed(
- 'timeToFirstContentfulPaint:resource_loading');
- assert.strictEqual(
- hist.diagnostics.get('breakdown').get(
- 'resource_loading'),
- 'timeToFirstContentfulPaint:resource_loading');
- assert.strictEqual(fcpResourceLoading.sum, 100);
- assert.strictEqual(tr.b.getOnlyElement(hist.getBinForValue(
- 800).diagnosticMaps).get('breakdown').get('resource_loading'), 100);
});
test('timeToLargestImagePaint', function() {
@@ -112,6 +105,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -147,6 +141,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -190,6 +185,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -232,6 +228,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -275,6 +272,45 @@ tr.b.unittest.testSuite(function() {
assert.strictEqual(100, hist.running.mean);
});
+ test('timeToLargestContentfulPaint_NoMultipleReporting', function() {
+ // Test that we do not report the same sample value multiple times if there
+ // is more than one renderer.
+ const model = tr.e.chrome.ChromeTestUtils.newChromeModel(function(model) {
+ const browerMain = model.browserMain;
+ browerMain.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
+ cat: 'loading',
+ title: tr.e.chrome.LCP_CANDIDATE_EVENT_TITLE,
+ start: 400,
+ duration: 0.0,
+ args: {
+ data: { durationInMilliseconds: 100, type: 'text', size: 1000,
+ inMainFrame: true },
+ main_frame_tree_node_id: 12345,
+ }
+ }));
+
+ const rendererProcess1 = model.rendererProcess;
+ const mainThread1 = model.rendererMain;
+ addNavigationStart_(mainThread1, 50,
+ { isOutermostMainFrame: true, isLoadingMainFrame: true,
+ documentLoaderURL: 'http://example.com'});
+
+ const rendererProcess2 = model.getOrCreateProcess(10);
+ const mainThread2 = rendererProcess2.getOrCreateThread(10);
+ mainThread2.name = 'CrRendererMain';
+
+ addNavigationStart_(mainThread2, 100,
+ { isOutermostMainFrame: true, isLoadingMainFrame: true,
+ documentLoaderURL: 'http://example.com'});
+ });
+
+ const histograms = new tr.v.HistogramSet();
+ tr.metrics.sh.loadingMetric(histograms, model);
+ const hist = histograms.getHistogramNamed('largestContentfulPaint');
+ assert.strictEqual(1, hist.running.count);
+ assert.strictEqual(100, hist.running.mean);
+ });
+
test('timeToLargestContentfulPaint_LastCandidate', function() {
const model = tr.e.chrome.ChromeTestUtils.newChromeModel(function(model) {
const browerMain = model.browserMain;
@@ -452,6 +488,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -504,6 +541,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: 'firstframeid'},
documentLoaderURL: 'http://example.com'
@@ -526,6 +564,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 2300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: 'secondframeid'},
documentLoaderURL: 'http://example.com'
@@ -636,6 +675,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -664,6 +704,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 2100,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -696,6 +737,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -745,6 +787,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -770,15 +813,6 @@ tr.b.unittest.testSuite(function() {
const hist = histograms.getHistogramNamed('timeToFirstContentfulPaint');
assert.strictEqual(1, hist.running.count);
assert.strictEqual(800, hist.running.mean);
- const fcpResourceLoading = histograms.getHistogramNamed(
- 'timeToFirstContentfulPaint:resource_loading');
- assert.strictEqual(
- hist.diagnostics.get('breakdown').get(
- 'resource_loading'),
- 'timeToFirstContentfulPaint:resource_loading');
- assert.strictEqual(fcpResourceLoading.sum, 100);
- assert.strictEqual(tr.b.getOnlyElement(hist.getBinForValue(
- 800).diagnosticMaps).get('breakdown').get('resource_loading'), 100);
});
test('timeToFirstMeaningfulPaint', function() {
@@ -794,6 +828,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -842,6 +877,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -904,6 +940,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -973,6 +1010,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess1.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -1009,6 +1047,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess2.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -1046,6 +1085,7 @@ tr.b.unittest.testSuite(function() {
function addFrameLoaderObject_(rendererProcess, timestamp) {
rendererProcess.objects.addSnapshot(
'ptr', 'loading', 'FrameLoader', timestamp, {
+ isOutermostMainFrame: true,
isLoadingMainFrame: true, frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com',
});
@@ -1119,13 +1159,15 @@ tr.b.unittest.testSuite(function() {
const mainThread = model.rendererMain;
addNavigationStart_(mainThread, 200,
- {isLoadingMainFrame: true, documentLoaderURL: 'http://example.com'});
+ { isOutermostMainFrame: true, isLoadingMainFrame: true,
+ documentLoaderURL: 'http://example.com'});
addNetworkRequest_(mainThread, 200, 250);
// FrameLoader creation time after navigation start.
rendererProcess.objects.idWasCreated(
'ptr', 'loading', 'FrameLoader', 250);
rendererProcess.objects.addSnapshot(
'ptr', 'loading', 'FrameLoader', 300, {
+ isOutermostMainFrame: true,
isLoadingMainFrame: true, frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com',
});
@@ -1136,7 +1178,8 @@ tr.b.unittest.testSuite(function() {
// New navigation to close the search window.
addNavigationStart_(mainThread, 7000,
- {isLoadingMainFrame: true, documentLoaderURL: 'http://example.com'});
+ { isOutermostMainFrame: true, isLoadingMainFrame: true,
+ documentLoaderURL: 'http://example.com'});
});
const histograms = new tr.v.HistogramSet();
@@ -1401,6 +1444,7 @@ tr.b.unittest.testSuite(function() {
// DomContentLoadedEnd and NavigationStart for a different frame.
rendererProcess.objects.addSnapshot(
'ptr', 'loading', 'FrameLoader', 4000, {
+ isOutermostMainFrame: true,
isLoadingMainFrame: true, frame: {id_ref: '0xffffffff'},
documentLoaderURL: 'http://example.com'
});
@@ -1474,6 +1518,7 @@ tr.b.unittest.testSuite(function() {
}));
process.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -1600,6 +1645,32 @@ tr.b.unittest.testSuite(function() {
partialNetworkEvents);
});
+ test('noLayoutShiftEventMeansZeroCLS', function() {
+ const model = tr.e.chrome.ChromeTestUtils.newChromeModel(function(model) {
+ const rendererProcess = model.rendererProcess;
+ const mainThread = model.rendererMain;
+ mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
+ cat: 'blink.user_timing',
+ title: 'navigationStart',
+ start: 10,
+ duration: 510,
+ args: {frame: '0xdeadbeef'}
+ }));
+ });
+ const histograms = new tr.v.HistogramSet();
+ tr.metrics.sh.loadingMetric(histograms, model);
+ const mainHist =
+ histograms.getHistogramNamed('mainFrameCumulativeLayoutShift');
+ assert.strictEqual(1, mainHist.sampleValues.length);
+ assert.strictEqual(1, mainHist.running.count);
+ assert.strictEqual(0, mainHist.running.mean);
+ const overallHist =
+ histograms.getHistogramNamed('overallCumulativeLayoutShift');
+ assert.strictEqual(1, overallHist.sampleValues.length);
+ assert.strictEqual(1, overallHist.running.count);
+ assert.strictEqual(0, overallHist.running.mean);
+ });
+
test('mainFrameCumulativeLayoutShift', function() {
const model = tr.e.chrome.ChromeTestUtils.newChromeModel(function(model) {
const rendererProcess = model.rendererProcess;
@@ -1632,6 +1703,44 @@ tr.b.unittest.testSuite(function() {
assert.strictEqual(3.5, hist.running.mean);
});
+ test('overallCumulativeLayoutShift', function() {
+ const model = tr.e.chrome.ChromeTestUtils.newChromeModel(function(model) {
+ const rendererProcess = model.rendererProcess;
+ const mainThread = model.rendererMain;
+ const mainFrame = {id: '0xdeadbeef', is_main: true};
+ const subframe = {id: '0xdeadb33f', is_main: false};
+ const emitEvent = (thread, time, score, weightedScore, frame) => {
+ const data = {
+ is_main_frame: frame.is_main,
+ score,
+ weighted_score_delta: weightedScore
+ };
+ thread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
+ cat: 'loading',
+ title: 'LayoutShift',
+ start: time,
+ duration: 0.0,
+ args: {frame: frame.id, data}
+ }));
+ };
+ emitEvent(mainThread, 1000, 1.5, 1000, mainFrame);
+ emitEvent(mainThread, 3000, 3.5, 1000, mainFrame);
+ emitEvent(mainThread, 2000, 3.0, 1000, mainFrame);
+ emitEvent(mainThread, 4000, 4000, 4.0, subframe);
+ const rendererProcess2 = model.getOrCreateProcess(10);
+ const mainThread2 = rendererProcess2.getOrCreateThread(20);
+ mainThread2.name = 'CrRendererMain';
+ const subframe2 = { id: '0xdeadb33f', is_main: false };
+ emitEvent(mainThread2, 2500, 1000, 2.0, subframe2);
+ });
+ const histograms = new tr.v.HistogramSet();
+ tr.metrics.sh.loadingMetric(histograms, model);
+ const hist = histograms.getHistogramNamed('overallCumulativeLayoutShift');
+ assert.strictEqual(1, hist.sampleValues.length);
+ assert.strictEqual(1, hist.running.count);
+ assert.strictEqual(14, hist.running.mean);
+ });
+
test('speedIndexIsAddedToHistograms', function() {
// The speed index code is fully tested in
// rects_based_speed_index_metric_test.
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/memory_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/memory_metric.html
index fea57533ba6..188000809ea 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/memory_metric.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/memory_metric.html
@@ -390,6 +390,28 @@ tr.exportTo('tr.metrics.sh', function() {
}
};
+ const MAX_ALLOCATED_SIZE = {
+ name: 'max_allocated_size',
+ unit: sizeInBytes_smallerIsBetter,
+ buildDescriptionPrefix(componentPath, processName) {
+ return buildChromeValueDescriptionPrefix(componentPath, processName, {
+ userFriendlyPropertyName: 'max size of all allocations',
+ componentPreposition: 'of'
+ });
+ }
+ };
+
+ const MAX_COMMITTED_SIZE = {
+ name: 'max_committed_size',
+ unit: sizeInBytes_smallerIsBetter,
+ buildDescriptionPrefix(componentPath, processName) {
+ return buildChromeValueDescriptionPrefix(componentPath, processName, {
+ userFriendlyPropertyName: 'max size of all committed memory',
+ componentPreposition: 'of'
+ });
+ }
+ };
+
const SHIM_ALLOCATED_OBJECTS_SIZE = {
name: 'shim_allocated_objects_size',
unit: sizeInBytes_smallerIsBetter,
@@ -451,6 +473,8 @@ tr.exportTo('tr.metrics.sh', function() {
EFFECTIVE_SIZE,
ALLOCATED_OBJECTS_SIZE,
SHIM_ALLOCATED_OBJECTS_SIZE,
+ MAX_ALLOCATED_SIZE,
+ MAX_COMMITTED_SIZE,
LOCKED_SIZE,
PEAK_SIZE
];
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/memory_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/memory_metric_test.html
index e3a6c40d327..6cac038fad7 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/memory_metric_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/memory_metric_test.html
@@ -397,6 +397,8 @@ tr.b.unittest.testSuite(function() {
size: 8,
allocated_objects_size: 4,
shim_allocated_objects_size: 3,
+ max_allocated_size: 5,
+ max_committed_size: 8
}})
];
pmdBrowser1.totals = {
@@ -565,7 +567,9 @@ tr.b.unittest.testSuite(function() {
newAllocatorDump(pmdBrowser3, 'malloc', {numerics: {
size: 8000,
allocated_objects_size: 4000,
- shim_allocated_objects_size: 3000
+ shim_allocated_objects_size: 3000,
+ max_allocated_size: 4000,
+ max_committed_size: 8000
}})
];
const pmdRendererB3 = addProcessMemoryDump(gmd3, pRendererB, {ts: 61});
@@ -656,6 +660,18 @@ tr.b.unittest.testSuite(function() {
description: 'total size of all allocated objects reported by Chrome ' +
'for all processes in Chrome'
},
+ 'memory:chrome:all_processes:reported_by_chrome:max_allocated_size': {
+ value: [5, 0, 4000, 0],
+ unit: sizeInBytes_smallerIsBetter,
+ description: 'total max size of all allocations reported by Chrome ' +
+ 'for all processes in Chrome'
+ },
+ 'memory:chrome:all_processes:reported_by_chrome:max_committed_size': {
+ value: [8, 0, 8000, 0],
+ unit: sizeInBytes_smallerIsBetter,
+ description: 'total max size of all committed memory reported by Chrome ' +
+ 'for all processes in Chrome'
+ },
'memory:chrome:all_processes:reported_by_chrome:blinkgc:BlinkObject:heap_category_size':
{
value: [0, 0, 1687992 + 1252376, 0],
@@ -765,6 +781,18 @@ tr.b.unittest.testSuite(function() {
description: 'size of all objects allocated through shim by malloc in ' +
'all processes in Chrome'
},
+ 'memory:chrome:all_processes:reported_by_chrome:malloc:max_allocated_size': {
+ value: [5, 0, 4000, 0],
+ unit: sizeInBytes_smallerIsBetter,
+ description: 'max size of all allocations of malloc ' +
+ 'in all processes in Chrome'
+ },
+ 'memory:chrome:all_processes:reported_by_chrome:malloc:max_committed_size': {
+ value: [8, 0, 8000, 0],
+ unit: sizeInBytes_smallerIsBetter,
+ description: 'max size of all committed memory of malloc ' +
+ 'in all processes in Chrome'
+ },
'memory:chrome:all_processes:reported_by_chrome:malloc:allocated_objects_size':
{
value: [4, 40 + 750, 4000, 0],
@@ -994,6 +1022,18 @@ tr.b.unittest.testSuite(function() {
description: 'total size of all allocated objects through shim ' +
'reported by Chrome for the browser process in Chrome'
},
+ 'memory:chrome:browser_process:reported_by_chrome:max_allocated_size': {
+ value: [5, 0, 4000, 0],
+ unit: sizeInBytes_smallerIsBetter,
+ description: 'total max size of all allocations reported by Chrome ' +
+ 'for the browser process in Chrome'
+ },
+ 'memory:chrome:browser_process:reported_by_chrome:max_committed_size': {
+ value: [8, 0, 8000, 0],
+ unit: sizeInBytes_smallerIsBetter,
+ description: 'total max size of all committed memory reported by Chrome ' +
+ 'for the browser process in Chrome'
+ },
'memory:chrome:browser_process:reported_by_chrome:malloc:effective_size': {
value: [8, 120 - 40, 8000, 80000],
unit: sizeInBytes_smallerIsBetter,
@@ -1020,6 +1060,18 @@ tr.b.unittest.testSuite(function() {
description: 'size of all objects allocated through shim by malloc in ' +
'the browser process in Chrome'
},
+ 'memory:chrome:browser_process:reported_by_chrome:malloc:max_allocated_size': {
+ value: [5, 0, 4000, 0],
+ unit: sizeInBytes_smallerIsBetter,
+ description: 'max size of all allocations of malloc ' +
+ 'in the browser process in Chrome'
+ },
+ 'memory:chrome:browser_process:reported_by_chrome:malloc:max_committed_size': {
+ value: [8, 0, 8000, 0],
+ unit: sizeInBytes_smallerIsBetter,
+ description: 'max size of all committed memory of malloc ' +
+ 'in the browser process in Chrome'
+ },
'memory:chrome:browser_process:reported_by_chrome:tracing:effective_size': {
value: [0, 40, 0, 0],
unit: sizeInBytes_smallerIsBetter,
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/persecond_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/persecond_metric_test.html
index f57d06da7dd..b34e7399322 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/persecond_metric_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/persecond_metric_test.html
@@ -29,6 +29,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -112,6 +113,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -164,6 +166,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -188,6 +191,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr2', 'loading', 'FrameLoader',
1200, {
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xlivebeef'},
documentLoaderURL: 'http://example.com'
@@ -240,6 +244,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
@@ -295,6 +300,7 @@ tr.b.unittest.testSuite(function() {
}));
rendererProcess.objects.addSnapshot('ptr', 'loading', 'FrameLoader', 300,
{
+ isOutermostMainFrame: true,
isLoadingMainFrame: true,
frame: {id_ref: '0xdeadbeef'},
documentLoaderURL: 'http://example.com'
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/weblayer_startup_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/weblayer_startup_metric.html
new file mode 100644
index 00000000000..914f4cef743
--- /dev/null
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/weblayer_startup_metric.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<!--
+Copyright 2020 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<link rel="import" href="/tracing/metrics/metric_registry.html">
+<link rel="import" href="/tracing/metrics/system_health/utils.html">
+<link rel="import" href="/tracing/value/histogram.html">
+
+<script>
+'use strict';
+
+tr.exportTo('tr.metrics.sh', function() {
+ function weblayerStartupMetric(histograms, model) {
+ const startupWallHist = new tr.v.Histogram('weblayer_startup_wall_time',
+ tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);
+ startupWallHist.description = 'WebLayer startup wall time';
+ const loadWallHist = new tr.v.Histogram('weblayer_url_load_wall_time',
+ tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);
+ loadWallHist.description = 'WebLayer blank URL load wall time';
+
+ // TODO(alexandermont): Only iterate over the processes and threads that
+ // could contain these events.
+ for (const slice of model.getDescendantEvents()) {
+ if (!(slice instanceof tr.model.ThreadSlice)) continue;
+
+ // WebLayerStartupInterval is the title of the section of code that is
+ // entered (via android.os.Trace.beginSection) when WebLayer is started
+ // up. This value is defined in TelemetryActivity.java.
+ if (slice.title === 'WebLayerStartupInterval') {
+ startupWallHist.addSample(slice.duration);
+ }
+
+ // WebLayerBlankUrlLoadInterval is the title of the section of code
+ // that is entered (via android.os.Trace.beginSection) when WebLayer
+ // is started up. This value is defined in TelemetryActivity.java.
+ if (slice.title === 'WebLayerBlankUrlLoadInterval') {
+ loadWallHist.addSample(slice.duration);
+ }
+ }
+
+ histograms.addHistogram(startupWallHist);
+ histograms.addHistogram(loadWallHist);
+ }
+
+ tr.metrics.MetricRegistry.register(weblayerStartupMetric);
+
+ return {
+ weblayerStartupMetric,
+ };
+});
+</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/system_health/weblayer_startup_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/weblayer_startup_metric_test.html
new file mode 100644
index 00000000000..acc5a8dc1c1
--- /dev/null
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/system_health/weblayer_startup_metric_test.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<!--
+Copyright 2020 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<link rel="import" href="/tracing/core/test_utils.html">
+<link rel="import" href="/tracing/metrics/system_health/weblayer_startup_metric.html">
+<link rel="import" href="/tracing/value/histogram_set.html">
+
+<script>
+'use strict';
+tr.b.unittest.testSuite(function() {
+ function makeTestModel() {
+ return tr.c.TestUtils.newModel(function(model) {
+ const mainThread = model.getOrCreateProcess(1).getOrCreateThread(2);
+ mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
+ cat: 'weblayer',
+ title: 'WebLayerStartupInterval',
+ start: 200,
+ duration: 42.0,
+ cpuStart: 150,
+ cpuDuration: 32.0
+ }));
+ mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
+ cat: 'weblayer',
+ title: 'WebLayerBlankUrlLoadInterval',
+ start: 250,
+ duration: 27.0,
+ cpuStart: 190,
+ cpuDuration: 17.0
+ }));
+ });
+ }
+
+ test('weblayerStartupMetric', function() {
+ const histograms = new tr.v.HistogramSet();
+ tr.metrics.sh.weblayerStartupMetric(histograms, makeTestModel());
+ assert.closeTo(42, histograms.getHistogramNamed(
+ 'weblayer_startup_wall_time').average, 1e-2);
+ assert.closeTo(27, histograms.getHistogramNamed(
+ 'weblayer_url_load_wall_time').average, 1e-2);
+ });
+});
+</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/uma_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/uma_metric.html
index 8f741b9cf7f..959006e9749 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/uma_metric.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/uma_metric.html
@@ -20,15 +20,12 @@ found in the LICENSE file.
*
* UMA histograms are logged in trace events titled 'UMAHistogramSamples'. The
* event arguments contain the histogram name and the base-64 coded of an
- * snapshot of histogram samples serialized in a pickle.
+ * snapshot of histogram samples serialized in a pickle. These are emitted at
+ * the end of tracing, and represent the difference in the UMA histograms from
+ * when the tracing began.
*
* If there are several processes that have snapshots of the same histogram,
* the snapshots will be merged.
- *
- * If there are two snapshots of the same histogram in the same process, we
- * assume that the first snapshot is taken when tracing started and the second
- * snapshot is taken when tracing is stopped. So, we compute the difference to
- * show the samples added during the tracing session.
*/
tr.exportTo('tr.metrics', function() {
function parseBuckets_(event, processName) {
@@ -78,36 +75,16 @@ tr.exportTo('tr.metrics', function() {
}
}
- function subtractBins_(x, y) {
- x.sum -= y.sum;
- let p1 = 0;
- let p2 = 0;
- while (p2 < y.bins.length) {
- while (p1 < x.bins.length && x.bins[p1].min !== y.bins[p2].min) {
- p1++;
- }
- if (p1 === x.bins.length) throw new Error('Cannot subtract');
- if (x.bins[p1].max !== y.bins[p2].max) {
- throw new Error('Incompatible bins');
- }
- if (x.bins[p1].count < y.bins[p2].count) {
- throw new Error('Cannot subtract');
- }
- x.bins[p1].count -= y.bins[p2].count;
- for (const event of y.bins[p2].events) {
- x.bins[p1].events.add(event);
- }
- const processName = tr.b.getOnlyElement(x.bins[p1].processes)[0];
- x.bins[p1].processes.set(processName, x.bins[p1].count);
- p2++;
- }
- }
-
function getHistogramUnit_(name) {
// Customize histogram units here.
return tr.b.Unit.byName.unitlessNumber_smallerIsBetter;
}
+ function getIsHistogramBinsLinear_(histogramName) {
+ return histogramName.startsWith('Graphics.Smoothness.Throughput') ||
+ histogramName.startsWith('Memory.Memory.GPU.PeakMemoryUsage');
+ }
+
function getHistogramBoundaries_(name) {
// Customize histogram boundaries here. Ideally, this would not be
// necessary.
@@ -150,13 +127,10 @@ tr.exportTo('tr.metrics', function() {
if (!histogramValues.has(name)) histogramValues.set(name, values);
const endValues = parseBuckets_(events[events.length - 1], processName);
if (events.length === 1) {
- mergeBins_(values, endValues);
- } else if (events.length === 2) {
- subtractBins_(endValues, parseBuckets_(events[0], processName));
- mergeBins_(values, endValues);
+ mergeBins_(values, endValues, name);
} else {
- throw new Error('There should be at most two snapshots of an UMA ' +
- 'histogram in each process');
+ throw new Error('There should be at most one snapshot of UMA ' +
+ `histogram for ${name} in each process.`);
}
}
}
@@ -164,6 +138,7 @@ tr.exportTo('tr.metrics', function() {
for (const [name, values] of histogramValues) {
const histogram = new tr.v.Histogram(
name, getHistogramUnit_(name), getHistogramBoundaries_(name));
+ const isLinear = getIsHistogramBinsLinear_(name);
// If we just put samples at the middle of the bins, their sum may not
// match the sum we read from traces. Compute how much samples should be
// shifted so that their sum matches what we expect.
@@ -173,16 +148,45 @@ tr.exportTo('tr.metrics', function() {
sumOfMiddles += bin.count * (bin.min + bin.max) / 2;
sumOfBinLengths += bin.count * (bin.max - bin.min);
}
+
+ if (name.startsWith('CompositorLatency.Type')) {
+ let histogramBoundaries = tr.v.HistogramBinBoundaries.createLinear(0, 100, 101);
+ let histogramUnit = getHistogramUnit_(name);
+ let presentedCount = values.bins[0] ? values.bins[0].count : 0;
+ let delayedCount = values.bins[1] ? values.bins[1].count : 0;
+ let droppedCount = values.bins[2] ? values.bins[2].count : 0;
+ let inTimeCount = presentedCount - delayedCount;
+ let totalCount = presentedCount + droppedCount;
+
+ const inTimeHistogram = new tr.v.Histogram(
+ name+'.Percentage_of_in_time_frames', histogramUnit, histogramBoundaries);
+ inTimeHistogram.addSample(100.0 * inTimeCount / totalCount);
+ histograms.addHistogram(inTimeHistogram);
+
+ const delayedHistogram = new tr.v.Histogram(
+ name+'.Percentage_of_delayed_frames', histogramUnit, histogramBoundaries);
+ delayedHistogram.addSample(100.0 * delayedCount / totalCount);
+ histograms.addHistogram(delayedHistogram);
+
+ const droppedHistogram = new tr.v.Histogram(
+ name+'.Percentage_of_dropped_frames', histogramUnit, histogramBoundaries);
+ droppedHistogram.addSample(100.0 * droppedCount / totalCount);
+ histograms.addHistogram(droppedHistogram);
+ }
+
const shift = (values.sum - sumOfMiddles) / sumOfBinLengths;
- // Note: if shift is less than -0.5, it means that even if we put all
- // samples at the lowest value of their bins their sum will be less than
- // the sum we read from traces. So, there is an inconsistency: either the
- // bins are reported incorrectly, or the sum is reported incorrectly.
+ // Note: for linear bins, if shift is less than -0.5, it means that even
+ // if we put all samples at the lowest value of their bins their sum will
+ // be less than the sum we read from traces. So, there is an
+ // inconsistency: either the bins are reported incorrectly, or the sum is
+ // reported incorrectly.
//
// Similarly, if shift is greater than 0.5, the sum of samples cannot add
// up to the sum we read from traces, even if we put all samples at the
// highest value of their bins.
- if (Math.abs(shift) > 0.5) throw new Error('Samples sum is wrong');
+ if (isLinear && Math.abs(shift) > 0.5) {
+ throw new Error(`Samples sum is wrong for ${name}.`);
+ }
for (const bin of values.bins) {
if (bin.count === 0) continue;
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/uma_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/uma_metric_test.html
index ae512c6b4ef..e11aca5c4f8 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/uma_metric_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/uma_metric_test.html
@@ -15,13 +15,11 @@ found in the LICENSE file.
tr.b.unittest.testSuite(function() {
// 1 sample in [1, 3) and 2 samples in [3, 7).
- const BROWSER_BUCKETS1 =
+ const BROWSER_BUCKETS =
'LAAAAAwAAAAAAAAAAwAAAAEAAAADAAAAAAAAAAEAAAADAAAABwAAAAAAAAACAAAA';
// 1 sample in [3, 7).
- const BROWSER_BUCKETS2 = 'HAAAAAUAAAAAAAAAAQAAAAMAAAAHAAAAAAAAAAEAAAA=';
- // 2 samples in [7, 9).
const RENDERER_BUCKETS = 'HAAAABAAAAAAAAAAAgAAAAcAAAAJAAAAAAAAAAIAAAA=';
- // 1 sample in [8, 10).
+ // 2 samples in [8, 10).
const RENDERER_INCOMPATIBLE_BUCKETS =
'HAAAAAkAAAAAAAAAAQAAAAgAAAAKAAAAAAAAAAEAAAA=';
// 1 sample in [1, 3) and 2 samples in [3, 7). The sum is 9.
@@ -38,7 +36,7 @@ tr.b.unittest.testSuite(function() {
title: 'UMAHistogramSamples', start: 2,
args: {
name: 'metric1',
- buckets: BROWSER_BUCKETS1}}));
+ buckets: BROWSER_BUCKETS}}));
});
const histograms = new tr.v.HistogramSet();
tr.metrics.umaMetric(histograms, model);
@@ -57,47 +55,15 @@ tr.b.unittest.testSuite(function() {
assert.closeTo(2, processes.get('browser_process_1'), 1e-6);
});
- test('twoUMASnapshots', function() {
- const model = tr.c.TestUtils.newModel((model) => {
- const browserProcess = model.getOrCreateProcess(0);
- browserProcess.getOrCreateThread(0).name = 'CrBrowserMain';
- browserProcess.instantEvents.push(tr.c.TestUtils.newInstantEvent({
- title: 'UMAHistogramSamples', start: 1,
- args: {
- name: 'metric1',
- buckets: BROWSER_BUCKETS2}}));
- browserProcess.instantEvents.push(tr.c.TestUtils.newInstantEvent({
- title: 'UMAHistogramSamples', start: 2,
- args: {
- name: 'metric1',
- buckets: BROWSER_BUCKETS1}}));
- });
- const histograms = new tr.v.HistogramSet();
- tr.metrics.umaMetric(histograms, model);
- const hist = histograms.getHistogramNamed('metric1');
-
- // (BROWSER_BUCKETS1 - BROWSER_BUCKETS2) looks like
- // * *
- // 1 2 3 4 5 6 7
- assert.closeTo(2, hist.min, 1e-6);
- assert.closeTo(5, hist.max, 1e-6);
- assert.closeTo(3.5, hist.average, 1e-6);
- });
-
test('twoUMASnapshotsInDifferentProcesses', function() {
const model = tr.c.TestUtils.newModel((model) => {
const browserProcess = model.getOrCreateProcess(0);
browserProcess.getOrCreateThread(0).name = 'CrBrowserMain';
browserProcess.instantEvents.push(tr.c.TestUtils.newInstantEvent({
- title: 'UMAHistogramSamples', start: 1,
- args: {
- name: 'metric1',
- buckets: BROWSER_BUCKETS2}}));
- browserProcess.instantEvents.push(tr.c.TestUtils.newInstantEvent({
title: 'UMAHistogramSamples', start: 2,
args: {
name: 'metric1',
- buckets: BROWSER_BUCKETS1}}));
+ buckets: BROWSER_BUCKETS}}));
const process = model.getOrCreateProcess(1);
process.instantEvents.push(tr.c.TestUtils.newInstantEvent({
title: 'UMAHistogramSamples', start: 2,
@@ -110,12 +76,12 @@ tr.b.unittest.testSuite(function() {
const hist = histograms.getHistogramNamed('metric1');
// The aggregated histogram looks like
- // *
+ // * *
// * * *
// 1 2 3 4 5 6 7 8 9
assert.closeTo(2, hist.min, 1e-6);
assert.closeTo(8, hist.max, 1e-6);
- assert.closeTo(5.75, hist.average, 1e-6);
+ assert.closeTo(5.6, hist.average, 1e-6);
const bin = hist.getBinForValue(8);
for (const diagnostics of bin.diagnosticMaps) {
@@ -188,27 +154,5 @@ tr.b.unittest.testSuite(function() {
tr.metrics.umaMetric(histograms, model);
}, 'Incompatible bins');
});
-
- test('badStartStopUMASnapshots', function() {
- const model = tr.c.TestUtils.newModel((model) => {
- const browserProcess = model.getOrCreateProcess(0);
- browserProcess.getOrCreateThread(0).name = 'CrBrowserMain';
- browserProcess.instantEvents.push(tr.c.TestUtils.newInstantEvent({
- title: 'UMAHistogramSamples', start: 1,
- args: {
- name: 'metric1',
- buckets: BROWSER_BUCKETS1}}));
- browserProcess.instantEvents.push(tr.c.TestUtils.newInstantEvent({
- title: 'UMAHistogramSamples', start: 2,
- args: {
- name: 'metric1',
- buckets: BROWSER_BUCKETS2}}));
- });
- const histograms = new tr.v.HistogramSet();
-
- assert.throws(function() {
- tr.metrics.umaMetric(histograms, model);
- }, 'Cannot subtract');
- });
});
</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/v8/OWNERS b/chromium/third_party/catapult/tracing/tracing/metrics/v8/OWNERS
index 3ecc1606516..1de8cc86062 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/v8/OWNERS
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/v8/OWNERS
@@ -1,3 +1,2 @@
mlippautz@chromium.org
-mythria@chromium.org
-ulan@chromium.org
+omerkatz@chromium.org
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/v8/gc_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/v8/gc_metric.html
index 75cae51c2e1..5390adb2eb2 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/v8/gc_metric.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/v8/gc_metric.html
@@ -22,6 +22,795 @@ tr.exportTo('tr.metrics.v8', function() {
const TARGET_FPS = 60;
const MS_PER_SECOND = 1000;
const WINDOW_SIZE_MS = MS_PER_SECOND / TARGET_FPS;
+ const EPSILON = 1e-6;
+
+ /**
+ * A list of metrics that are measured and tracked.
+ *
+ * See https://bit.ly/v8-gc-stats-collection for the metric naming convention.
+ * You can add a variant of an existing metric by simply adding its name to
+ * this list. E.g. v8:gc:cycle:background_threads:full:atomic:mark:cpp.
+ *
+ * If you want to add a completely new metric with its own TRACE_EVENT then
+ * you also need to add the corresponding rule to the RULES list below.
+ *
+ * @const {!Array<string>}
+ */
+ const METRICS = [
+ 'v8:gc:cycle:full',
+ 'v8:gc:cycle:full:cpp',
+ 'v8:gc:cycle:full:mark',
+ 'v8:gc:cycle:full:mark:cpp',
+ 'v8:gc:cycle:full:weak',
+ 'v8:gc:cycle:full:weak:cpp',
+ 'v8:gc:cycle:full:sweep',
+ 'v8:gc:cycle:full:sweep:cpp',
+ 'v8:gc:cycle:full:compact',
+ 'v8:gc:cycle:full:compact:cpp',
+ 'v8:gc:cycle:main_thread:full',
+ 'v8:gc:cycle:main_thread:full:cpp',
+ 'v8:gc:cycle:main_thread:full:mark',
+ 'v8:gc:cycle:main_thread:full:mark:cpp',
+ 'v8:gc:cycle:main_thread:full:weak',
+ 'v8:gc:cycle:main_thread:full:weak:cpp',
+ 'v8:gc:cycle:main_thread:full:sweep',
+ 'v8:gc:cycle:main_thread:full:sweep:cpp',
+ 'v8:gc:cycle:main_thread:full:compact',
+ 'v8:gc:cycle:main_thread:full:compact:cpp',
+ 'v8:gc:cycle:main_thread:full:atomic',
+ 'v8:gc:cycle:main_thread:full:atomic:cpp',
+ 'v8:gc:cycle:main_thread:full:atomic:mark',
+ 'v8:gc:cycle:main_thread:full:atomic:mark:cpp',
+ 'v8:gc:cycle:main_thread:full:atomic:weak',
+ 'v8:gc:cycle:main_thread:full:atomic:weak:cpp',
+ 'v8:gc:cycle:main_thread:full:atomic:sweep',
+ 'v8:gc:cycle:main_thread:full:atomic:sweep:cpp',
+ 'v8:gc:cycle:main_thread:full:atomic:compact',
+ 'v8:gc:cycle:main_thread:full:atomic:compact:cpp',
+ 'v8:gc:cycle:main_thread:full:incremental',
+ 'v8:gc:cycle:main_thread:full:incremental:cpp',
+ 'v8:gc:cycle:main_thread:full:incremental:mark',
+ 'v8:gc:cycle:main_thread:full:incremental:mark:cpp',
+ 'v8:gc:cycle:main_thread:full:incremental:sweep',
+ 'v8:gc:cycle:main_thread:full:incremental:sweep:cpp',
+ 'v8:gc:event:main_thread:full:atomic',
+ 'v8:gc:event:main_thread:full:atomic:cpp',
+ 'v8:gc:event:main_thread:full:atomic:mark',
+ 'v8:gc:event:main_thread:full:atomic:mark:cpp',
+ 'v8:gc:event:main_thread:full:atomic:weak',
+ 'v8:gc:event:main_thread:full:atomic:weak:cpp',
+ 'v8:gc:event:main_thread:full:atomic:sweep',
+ 'v8:gc:event:main_thread:full:atomic:sweep:cpp',
+ 'v8:gc:event:main_thread:full:atomic:compact',
+ 'v8:gc:event:main_thread:full:atomic:compact:cpp',
+ 'v8:gc:event:main_thread:full:incremental',
+ 'v8:gc:event:main_thread:full:incremental:cpp',
+ 'v8:gc:event:main_thread:full:incremental:mark',
+ 'v8:gc:event:main_thread:full:incremental:mark:cpp',
+ 'v8:gc:event:main_thread:full:incremental:sweep',
+ 'v8:gc:event:main_thread:full:incremental:sweep:cpp',
+ 'v8:gc:cycle:young',
+ 'v8:gc:cycle:young:mark',
+ 'v8:gc:cycle:young:weak',
+ 'v8:gc:cycle:young:sweep',
+ 'v8:gc:cycle:young:compact',
+ 'v8:gc:cycle:main_thread:young',
+ 'v8:gc:cycle:main_thread:young:mark',
+ 'v8:gc:cycle:main_thread:young:weak',
+ 'v8:gc:cycle:main_thread:young:sweep',
+ 'v8:gc:cycle:main_thread:young:compact',
+ 'v8:gc:cycle:main_thread:young:atomic',
+ 'v8:gc:cycle:main_thread:young:atomic:mark',
+ 'v8:gc:cycle:main_thread:young:atomic:weak',
+ 'v8:gc:cycle:main_thread:young:atomic:sweep',
+ 'v8:gc:cycle:main_thread:young:atomic:compact',
+ 'v8:gc:cycle:main_thread:young:incremental',
+ 'v8:gc:cycle:main_thread:young:incremental:mark',
+ 'v8:gc:cycle:main_thread:young:incremental:sweep',
+ 'v8:gc:event:main_thread:young:atomic',
+ 'v8:gc:event:main_thread:young:atomic:mark',
+ 'v8:gc:event:main_thread:young:atomic:weak',
+ 'v8:gc:event:main_thread:young:atomic:sweep',
+ 'v8:gc:event:main_thread:young:atomic:compact',
+ 'v8:gc:event:main_thread:young:incremental',
+ 'v8:gc:event:main_thread:young:incremental:mark',
+ 'v8:gc:event:main_thread:young:incremental:sweep',
+ ];
+
+ /**
+ * Shorthands for various event groups to be used in RULES below.
+ */
+ const V8_FULL_ATOMIC_EVENTS = [
+ 'V8.GC_MARK_COMPACTOR'
+ ];
+
+ const V8_FULL_MARK_EVENTS = [
+ 'V8.GC_MC_BACKGROUND_MARKING',
+ 'V8.GC_MC_MARK',
+ 'V8.GC_MC_INCREMENTAL',
+ 'V8.GC_MC_INCREMENTAL_START',
+ ];
+
+ const V8_FULL_COMPACT_EVENTS = [
+ 'V8.GC_MC_BACKGROUND_EVACUATE_COPY',
+ 'V8.GC_MC_BACKGROUND_EVACUATE_UPDATE_POINTERS',
+ 'V8.GC_MC_EVACUATE',
+ ];
+
+ const V8_FULL_SWEEP_EVENTS = [
+ 'V8.GC_MC_BACKGROUND_SWEEPING',
+ 'V8.GC_MC_SWEEP',
+ 'V8.GC_MC_COMPLETE_SWEEPING',
+ ];
+
+ const V8_FULL_WEAK_EVENTS = [
+ 'V8.GC_MC_CLEAR',
+ ];
+
+ const V8_YOUNG_ATOMIC_EVENTS = [
+ 'V8.GC_SCAVENGER_BACKGROUND_SCAVENGE_PARALLEL',
+ 'V8.GC_SCAVENGER',
+ 'V8.GC_MINOR_MARK_COMPACTOR',
+ ];
+
+ const V8_YOUNG_MARK_EVENTS = [
+ 'V8.GC_MINOR_MC_BACKGROUND_MARKING',
+ 'V8.GC_MINOR_MC_MARK',
+ 'V8.GC_MINOR_MC_INCREMENTAL',
+ 'V8.GC_MINOR_MC_INCREMENTAL_START',
+ ];
+
+ const V8_YOUNG_COMPACT_EVENTS = [
+ 'V8.GC_MINOR_MC_BACKGROUND_EVACUATE_COPY',
+ 'V8.GC_MINOR_MC_BACKGROUND_EVACUATE_UPDATE_POINTERS',
+ 'V8.GC_MINOR_MC_EVACUATE',
+ ];
+
+ const V8_YOUNG_SWEEP_EVENTS = [
+ 'V8.GC_MINOR_MC_BACKGROUND_SWEEPING',
+ 'V8.GC_MINOR_MC_SWEEP',
+ ];
+
+ const V8_YOUNG_WEAK_EVENTS = [
+ 'V8.GC_MINOR_MC_CLEAR',
+ ];
+
+ const CPP_GC_FULL_MARK_EVENTS = [
+ 'BlinkGC.AtomicPauseMarkEpilogue',
+ 'BlinkGC.AtomicPauseMarkPrologue',
+ 'BlinkGC.AtomicPauseMarkRoots',
+ 'BlinkGC.AtomicPauseMarkTransitiveClosure',
+ 'BlinkGC.ConcurrentMarkingStep',
+ 'BlinkGC.IncrementalMarkingStartMarking',
+ 'BlinkGC.IncrementalMarkingStep',
+ 'BlinkGC.MarkBailOutObjects',
+ 'BlinkGC.MarkFlushEphemeronPairs',
+ 'BlinkGC.MarkFlushV8References',
+ 'BlinkGC.UnifiedMarkingStep',
+ 'CppGC.AtomicMark',
+ 'CppGC.IncrementalMark',
+ 'CppGC.ConcurrentMark',
+ ];
+
+ const CPP_GC_FULL_COMPACT_EVENTS = [
+ 'BlinkGC.AtomicPauseSweepAndCompact',
+ 'CppGC.AtomicCompact',
+ ];
+
+ const CPP_GC_FULL_SWEEP_EVENTS = [
+ 'BlinkGC.CompleteSweep',
+ 'BlinkGC.ConcurrentSweepingStep',
+ 'BlinkGC.LazySweepInIdle',
+ 'BlinkGC.LazySweepOnAllocation',
+ 'CppGC.AtomicSweep',
+ 'CppGC.IncrementalSweep',
+ 'CppGC.ConcurrentSweep',
+ ];
+
+ const CPP_GC_FULL_WEAK_EVENTS = [
+ 'BlinkGC.MarkWeakProcessing',
+ 'CppGC.AtomicWeak',
+ ];
+
+ /**
+ * A Rule object describes a mapping from events to metrics.
+ *
+ * For each event in a single GC cycle there can be at most one rule that
+ * that applies to that event. An event E applies to a rule R if all the
+ * following conditions hold:
+ *
+ * 1. R.events contains E.title.
+ *
+ * 2. if R.inside is not empty, then at least one event X specified by
+ * R.inside exists on some thread and fully encloses E:
+ * X.start <= E.start && E.end <= X.end.
+ * Note that X and E don't have to be on the same thread, which allows
+ * us to find background thread events that happen during atomic pause.
+ *
+ * 3. if R.outside is not empty, then there is no such event X specified
+ * by R.outside that fully encloses E. This is useful for background
+ * events that happen during incremental phases.
+ *
+ * TODO(chromium:1056170): Currently event names of V8 and CppGC do not
+ * collide because V8 events are prefixed with 'V8' and CppGC events are
+ * prefixed with 'CppGC'. Revisit this it before switching to the library.
+ * We may need to either include the category to rules or keep the prefixes.
+ *
+ * @typedef {Object} Rule
+ * @property {!Array<string>} events - Event names selected by this rule.
+ * @property {?Array<string>} inside - Allowlist of enclosing event names.
+ * @property {?Array<string>} outside - Blocklist of enclosing event names.
+ * @property {string} contribute_to - The most specific target metric name.
+ * The rule automatically applies to all more general metrics that can
+ * be derived by dropping parts of the target metric name.
+ * Note that the metric name does not include granularity and threads.
+ */
+
+ /**
+ * @const {!Array<!Rule>}
+ */
+ const RULES = [
+ {
+ events: V8_FULL_ATOMIC_EVENTS,
+ contribute_to: 'full:atomic',
+ },
+ {
+ events: V8_FULL_MARK_EVENTS,
+ inside: V8_FULL_ATOMIC_EVENTS,
+ contribute_to: 'full:atomic:mark',
+ },
+ {
+ events: CPP_GC_FULL_MARK_EVENTS,
+ inside: V8_FULL_ATOMIC_EVENTS,
+ contribute_to: 'full:atomic:mark:cpp',
+ },
+ {
+ events: V8_FULL_MARK_EVENTS,
+ outside: V8_FULL_ATOMIC_EVENTS,
+ contribute_to: 'full:incremental:mark',
+ },
+ {
+ events: CPP_GC_FULL_MARK_EVENTS,
+ outside: V8_FULL_ATOMIC_EVENTS,
+ contribute_to: 'full:incremental:mark:cpp',
+ },
+ {
+ events: V8_FULL_COMPACT_EVENTS,
+ inside: V8_FULL_ATOMIC_EVENTS,
+ contribute_to: 'full:atomic:compact',
+ },
+ {
+ events: CPP_GC_FULL_COMPACT_EVENTS,
+ inside: V8_FULL_ATOMIC_EVENTS,
+ contribute_to: 'full:atomic:compact:cpp',
+ },
+ {
+ events: V8_FULL_SWEEP_EVENTS,
+ inside: V8_FULL_ATOMIC_EVENTS,
+ outside: V8_FULL_COMPACT_EVENTS,
+ contribute_to: 'full:atomic:sweep',
+ },
+ {
+ events: CPP_GC_FULL_SWEEP_EVENTS,
+ inside: V8_FULL_ATOMIC_EVENTS,
+ contribute_to: 'full:atomic:sweep:cpp',
+ },
+ {
+ events: V8_FULL_WEAK_EVENTS,
+ inside: V8_FULL_ATOMIC_EVENTS,
+ contribute_to: 'full:atomic:weak',
+ },
+ {
+ events: CPP_GC_FULL_WEAK_EVENTS,
+ inside: V8_FULL_ATOMIC_EVENTS,
+ contribute_to: 'full:atomic:weak:cpp',
+ },
+ {
+ events: V8_FULL_SWEEP_EVENTS,
+ outside: V8_FULL_ATOMIC_EVENTS.concat(V8_FULL_COMPACT_EVENTS),
+ contribute_to: 'full:incremental:sweep',
+ },
+ {
+ events: CPP_GC_FULL_SWEEP_EVENTS,
+ outside: V8_FULL_ATOMIC_EVENTS,
+ contribute_to: 'full:incremental:sweep:cpp',
+ },
+ {
+ events: V8_YOUNG_ATOMIC_EVENTS,
+ contribute_to: 'young:atomic',
+ },
+ {
+ events: V8_YOUNG_MARK_EVENTS,
+ inside: V8_YOUNG_ATOMIC_EVENTS,
+ contribute_to: 'young:atomic:mark',
+ },
+ {
+ events: V8_YOUNG_MARK_EVENTS,
+ outside: V8_YOUNG_ATOMIC_EVENTS,
+ contribute_to: 'young:incremental:mark',
+ },
+ {
+ events: V8_YOUNG_COMPACT_EVENTS,
+ inside: V8_YOUNG_ATOMIC_EVENTS,
+ contribute_to: 'young:atomic:compact',
+ },
+ {
+ events: V8_YOUNG_SWEEP_EVENTS,
+ inside: V8_YOUNG_ATOMIC_EVENTS,
+ outside: V8_YOUNG_COMPACT_EVENTS,
+ contribute_to: 'young:atomic:sweep',
+ },
+ {
+ events: V8_YOUNG_WEAK_EVENTS,
+ inside: V8_YOUNG_ATOMIC_EVENTS,
+ contribute_to: 'young:atomic:weak',
+ },
+ {
+ events: V8_YOUNG_SWEEP_EVENTS,
+ outside: V8_YOUNG_ATOMIC_EVENTS.concat(V8_YOUNG_COMPACT_EVENTS),
+ contribute_to: 'young:incremental:sweep',
+ },
+ ];
+
+ /**
+ * A part of the metric name that defines how the events contributing to
+ * the metric are aggregated. See Metric.apply() below.
+ * @enum {string}
+ */
+ const Granularity = {
+ CYCLE: 'cycle',
+ EVENT: 'event',
+ };
+
+ /**
+ * A thread of a V8 isolate is considered a main thread including:
+ *
+ * - the main thread of the renderer.
+ * - the main thread of a dedicated worker.
+ * - the main thread of a service worker.
+ *
+ * A thread that runs background tasks is considered a background
+ * thread. See jsExecutionThreadsWithTypes() below.
+ *
+ * @enum {string}
+ */
+ const ThreadType = {
+ MAIN: 'main',
+ BACKGROUND: 'background',
+ ALL_THREADS: 'all_threads',
+ };
+
+ /**
+ * Represents a single metric together with its histogram of measurements.
+ */
+ class Metric {
+ /**
+ * @param{string} name The name of the metric.
+ * See https://bit.ly/v8-gc-stats-collection for the metric naming
+ * convention and the meanining of name parts.
+ */
+ constructor(name) {
+ const parts = name.split(':');
+
+ /** @private @const {Granularity} */
+ this.granularity_ = parts[2];
+ assert(this.granularity_ === Granularity.CYCLE ||
+ this.granularity_ === Granularity.EVENT);
+
+ /** @private @const {?ThreadType} */
+ this.thread_ = ThreadType.ALL_THREADS;
+ let phasesIndex = 3;
+ if (parts[3] === 'main_thread') {
+ this.thread_ = ThreadType.MAIN;
+ phasesIndex = 4;
+ }
+ if (parts[3] === 'background_threads') {
+ this.thread_ = ThreadType.BACKGROUND;
+ phasesIndex = 4;
+ }
+
+ /** @private @const {!Array<string>} */
+ this.phases_ = parts.slice(phasesIndex);
+
+ const maxValue = this.isPerCycleMetric() ? 10000 : 1000;
+ const boundaries =
+ tr.v.HistogramBinBoundaries.createExponential(0.1, maxValue, 100);
+
+ /** @package @const {!tr.v.Histogram} */
+ this.histogram = new tr.v.Histogram(name,
+ tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, boundaries);
+ this.histogram.customizeSummaryOptions({
+ avg: true,
+ count: true,
+ max: true,
+ min: false,
+ std: false,
+ sum: this.isPerCycleMetric(),
+ });
+ }
+
+ /**
+ * @return {boolean} Whether the granularity of this metric is per cycle.
+ */
+ isPerCycleMetric() {
+ return this.granularity_ === Granularity.CYCLE;
+ }
+
+ /**
+ * @param {!Array<string>} phases - A list of metric phases.
+ * @return {boolean} Whether the phases of this metric are more general
+ * than (or equal to) the given phases.
+ */
+ isMoreGeneralThanOrEqualTo(phases) {
+ // Check that this.phases_ is a subset of phases.
+ const phasesSet = new Set(phases.split(':'));
+ return this.phases_.every(phase => phasesSet.has(phase));
+ }
+
+ /**
+ * @param {!Array<!Rule>} rules - Rules that map events to metrics.
+ * @param {!Array<!tr.model.Slice>} events - All events of a single GC cycle
+ * including the events of the main and background threads.
+ * @return {!Array<!tr.model.Slice>} A subset of the given events that
+ * contribute to this metric.
+ */
+ contributingEvents(rules, events) {
+ // A map from an event name to the events with that name.
+ // It is used to speed up enclosing checks below.
+ const eventsByName = groupBy(events, e => e.title);
+
+ // Checks if the given rule matches (or applies) to the given event.
+ function matches(rule, event) {
+ // Checks if there is an event with the given name that encloses
+ // |event|.
+ function isEnclosing(name) {
+ if (!eventsByName.has(name)) return false;
+ return eventsByName.get(name).some(e => encloses(e, event));
+ }
+ if (!rule.events.includes(event.title)) {
+ return false;
+ }
+ if (rule.inside && !rule.inside.some(isEnclosing)) {
+ return false;
+ }
+ if (rule.outside && rule.outside.some(isEnclosing)) {
+ return false;
+ }
+ return true;
+ }
+
+ // For each event find the applying rule and check if the rule also
+ // applies to this metric.
+ const result = [];
+ for (const event of events) {
+ const matching = rules.filter(r => matches(r, event));
+ if (matching.length === 0) {
+ continue;
+ }
+ assert(matching.length === 1,
+ `${event.userFriendlyName} matches more than one rule: ` +
+ JSON.stringify(matching));
+ if (this.isMoreGeneralThanOrEqualTo(matching[0].contribute_to)) {
+ result.push(event);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Finds all events that contribute to this metric and aggregates them
+ * in the metric's histogram.
+ *
+ * @param {!Array<!Rule>} rules - Rules that map events to metrics.
+ * @param {!Array<!tr.model.Slice>} events - All events of a single GC cycle
+ * including the events of the main and background threads.
+ * @param {!Map<number, ThreadType>} threadTypes - A map from a thread-id
+ * to a thread type.
+ */
+ apply(rules, events, threadTypes) {
+ // Find all events that are relevant for this metric.
+ const filtered = this.contributingEvents(rules, events);
+
+ // Group the events by thread.
+ const eventsByThread = groupBy(filtered, e => e.parentContainer.tid);
+
+ // Drop events nested in other events and also drop events from
+ // the irrelevant threads.
+ let flattened = [];
+ for (const [tid, threadEvents] of eventsByThread) {
+ if (this.thread_ === ThreadType.ALL_THREADS ||
+ this.thread_ === threadTypes.get(tid)) {
+ flattened = flattened.concat(flatten(threadEvents));
+ }
+ }
+
+ // Aggregate events in the histogram.
+ if (this.isPerCycleMetric()) {
+ let sum = 0;
+ for (const event of flattened) {
+ sum += event.cpuDuration;
+ }
+ if (flattened.length > 0) {
+ this.histogram.addSample(sum);
+ }
+ } else {
+ for (const event of flattened) {
+ this.histogram.addSample(event.cpuDuration);
+ }
+ }
+ }
+ }
+
+ /**
+ * A helper for checking the condition.
+ * @param {boolean} condition
+ * @param {string} message
+ */
+ function assert(condition, message) {
+ if (!condition) {
+ throw new Error(message);
+ }
+ }
+
+ /**
+ * A helper for grouping objects by the custom key.
+ * @param {!Array<!Object>} objects
+ * @param {!function(!Object): !Object} keyCallback
+ * @param {!Map<!Object, !Array<!Object>>} Objects grouped by the key.
+ */
+ function groupBy(objects, keyCallback) {
+ const result = new Map();
+ for (const object of objects) {
+ const group = keyCallback(object);
+ if (result.has(group)) {
+ result.get(group).push(object);
+ } else {
+ result.set(group, [object]);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * A helper for getting all events relevant for the rules.
+ * @param {!Array<Rule>} rules
+ * @return {!Array<string>} Event names.
+ */
+ function eventsMentionedIn(rules) {
+ let result = [];
+ for (const rule of rules) {
+ result = result.concat(rule.events);
+ if (rule.inside) {
+ result = result.concat(rule.inside);
+ }
+ if (rule.outside) {
+ result = result.concat(rule.outside);
+ }
+ }
+ return result;
+ }
+
+
+ /**
+ * Performs thread-independent check for event nesting.
+ *
+ * @param {!Array<!tr.model.Slice>} event1
+ * @param {!Array<!tr.model.Slice>} event2
+ * @return {boolean} Whether the first event encloses the second event.
+ */
+ function encloses(event1, event2) {
+ return (event1.start - EPSILON <= event2.start &&
+ event2.end <= event1.end + EPSILON);
+ }
+
+ /**
+ * Finds all threads that may execute JS code in the given renderer
+ * and return them together with the thread-id to thread type mapping.
+ *
+ * @param {!tr.model.helpers.ChromeRendererHelper} rendererHelper
+ * @return {[!Array<tr.model.Thread>, !Map<number, ThreadType>] A pair
+ * of a thread list and a thread type mapping.
+ */
+ function jsExecutionThreadsWithTypes(rendererHelper) {
+ const mainThreads = ([rendererHelper.mainThread]
+ .concat(rendererHelper.dedicatedWorkerThreads)
+ .concat(rendererHelper.serviceWorkerThreads));
+ const backgroundThreads = rendererHelper.foregroundWorkerThreads;
+ const threadTypes = new Map();
+ for (const thread of mainThreads) {
+ threadTypes.set(thread.tid, ThreadType.MAIN);
+ }
+ for (const thread of backgroundThreads) {
+ threadTypes.set(thread.tid, ThreadType.BACKGROUND);
+ }
+ return [mainThreads.concat(backgroundThreads), threadTypes];
+ }
+
+ /**
+ * Drops all events that are nested in other events.
+ *
+ * @param {!Array<!tr.model.Slice>} events - Events on the same thread.
+ * @return {!Array<!tr.model.Slice>} Top-level events.
+ */
+ function flatten(events) {
+ function compareWithEpsilon(a, b) {
+ if (a.start < b.start - EPSILON) return -1;
+ if (a.start > b.start + EPSILON) return 1;
+ return b.end - a.end;
+ }
+ events.sort(compareWithEpsilon);
+ let last = events[0];
+ const result = [last];
+ for (const e of events) {
+ if (e.end > last.end + EPSILON) {
+ assert(e.start >= last.end - EPSILON,
+ 'Overlapping events: ' +
+ e.userFriendlyName + ' ' +
+ last.userFriendlyName);
+ result.push(e);
+ last = e;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Groups the events by GC cycle using the epoch argument of events.
+ *
+ * The function is more complex than expected for two reasons:
+ *
+ * 1. V8 and CppGC do not syncronize their epoch counters (yet).
+ * 2. V8 adds the epoch argument only to the top-level events. Nested
+ * events are not requred to have the epoch.
+ *
+ * The function first finds the mapping from CppGC epoch to V8 epoch assuming
+ * that there will always be a CppGC event nested in a V8 event.
+ * Then it finds the V8 epoch for each nested V8 event and CppGC event.
+ * Finally, it groups the events by their V8 epoch.
+ *
+ * @param {!Array<!tr.model.Slice>} events - Events from multiple GC cycles
+ * and multiple threads.
+ * @return {!Map<string, !Array<!tr.model.Slice>>} Grouped events.
+ */
+ function groupByEpoch(events) {
+ function isV8Event(event) {
+ // TODO(1056170): Adjust this if the CppGC library uses a v8 category
+ // for trace events.
+ return event.category && event.category.includes('v8');
+ }
+
+ // Finds the V8 and CppGC epoch arguments in the given event and its
+ // ancestors.
+ function getEpoch(event) {
+ function checkEpochConsistency(epoch, event) {
+ if (epoch === null) return;
+ assert(epoch === event.args.epoch,
+ `${event.userFriendlyName} has epoch ${event.args.epoch} ` +
+ `which contradicts the epoch of nested events ${epoch}`);
+ }
+ const result = {v8: null, cpp: null};
+ while (event) {
+ if ('epoch' in event.args) {
+ if (isV8Event(event)) {
+ checkEpochConsistency(result.v8, event);
+ result.v8 = event.args.epoch;
+ } else {
+ checkEpochConsistency(result.cpp, event);
+ result.cpp = event.args.epoch;
+ }
+ }
+ event = event.parentSlice;
+ }
+ return result;
+ }
+
+ // The following two functions combine V8 and CppGC epoch into a single
+ // global epoch. We give V8 even global epochs and CppGC odd global epochs.
+ function GlobalEpochFromV8(v8Epoch) {
+ return 2 * v8Epoch;
+ }
+
+ function GlobalEpochFromCpp(cppEpoch) {
+ return 2 * cppEpoch + 1;
+ }
+
+ // Find the mapping from a CppGC epoch to a V8 epoch.
+ const cppToV8 = new Map();
+ for (const event of events) {
+ const epoch = getEpoch(event);
+ if (epoch.cpp !== null && epoch.v8 !== null) {
+ // The start of V8 incremental marking may finalize GppGC sweeping
+ // of the previous garbage collection cycle. Thus it may happen that
+ // the same CppGC epoch maps to two V8 epoch. In such a conflict
+ // the smaller V8 epoch wins, essentially mapping the event back to
+ // the previous V8 cycle.
+ if (!cppToV8.has(epoch.cpp) || cppToV8.get(epoch.cpp) > epoch.v8) {
+ cppToV8.set(epoch.cpp, epoch.v8);
+ }
+ }
+ }
+
+ // For each event infer its V8 epoch and group by that.
+ const result = new Map();
+ for (const event of events) {
+ const epoch = getEpoch(event);
+ if (epoch.cpp === null && epoch.v8 === null) {
+ continue;
+ }
+ let globalEpoch;
+ if (epoch.v8 !== null) {
+ // Case 1: either a V8 event or a CppGC event nested in a V8 event.
+ globalEpoch = GlobalEpochFromV8(epoch.v8);
+ } else if (cppToV8.has(epoch.cpp)) {
+ // Case 2: A CppGC event of a unified garbage collection.
+ globalEpoch = GlobalEpochFromV8(cppToV8.get(epoch.cpp));
+ } else {
+ // Case 3: An event from a standalone CppGC garbage collection.
+ globalEpoch = GlobalEpochFromCpp(epoch.cpp);
+ }
+ if (result.has(globalEpoch)) {
+ result.get(globalEpoch).push(event);
+ } else {
+ result.set(globalEpoch, [event]);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * The main entry point of GC metric computation.
+ *
+ * @param {!Array<string} metricNames - A list of metric names to be computed.
+ * @param {!tr.v.HistogramSet} histograms - The histogram set where the new
+ * histograms will be added.
+ * @param {!tr.Model} model
+ */
+ function addGarbageCollectionMetrics(metricNames, histograms, model) {
+ // Parse the metric names and store them in a list.
+ const metrics = metricNames.map(name => new Metric(name));
+
+ // Compute the set of GC related event names.
+ const gcEventNames = new Set(eventsMentionedIn(RULES));
+
+ // Iterate all renderer processes.
+ const chromeHelper = model.getOrCreateHelper(
+ tr.model.helpers.ChromeModelHelper);
+ for (const rendererHelper of Object.values(chromeHelper.rendererHelpers)) {
+ if (rendererHelper.isChromeTracingUI) continue;
+
+ const [threads, threadTypes] =
+ jsExecutionThreadsWithTypes(rendererHelper);
+
+ // Get all GC related events.
+ const events = [];
+ for (const thread of threads) {
+ for (const event of thread.sliceGroup.childEvents()) {
+ if (gcEventNames.has(event.title)) {
+ events.push(event);
+ }
+ }
+ }
+
+ // Group events by GC cycle and consider each cycle separately.
+ for (const cycleEvents of groupByEpoch(events).values()) {
+ // If any event is in the cycle is forced, then the whole cycle
+ // is considered forced. Skip all events in the cycle.
+ if (cycleEvents.some(
+ tr.metrics.v8.utils.isForcedGarbageCollectionEvent)) {
+ continue;
+ }
+
+ for (const metric of metrics) {
+ metric.apply(RULES, cycleEvents, threadTypes);
+ }
+ }
+ }
+
+ // Add the new histograms to the resulting histogram set.
+ for (const metric of metrics) {
+ histograms.addHistogram(metric.histogram);
+ }
+ }
function gcMetric(histograms, model, options) {
options = options || {};
@@ -36,6 +825,7 @@ tr.exportTo('tr.metrics.v8', function() {
addTotalMarkCompactorTime(histograms, model);
addTotalMarkCompactorMarkingTime(histograms, model);
addScavengerSurvivedFromStackEvents(histograms, model);
+ addGarbageCollectionMetrics(METRICS, histograms, model);
}
tr.metrics.MetricRegistry.register(gcMetric);
@@ -380,6 +1170,7 @@ tr.exportTo('tr.metrics.v8', function() {
return {
gcMetric,
WINDOW_SIZE_MS, // For testing purposes only.
+ addGarbageCollectionMetrics, // For testing purposes only.
};
});
</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/v8/gc_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/v8/gc_metric_test.html
index 4d0d3beca88..d542c1e25dd 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/v8/gc_metric_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/v8/gc_metric_test.html
@@ -16,16 +16,21 @@ found in the LICENSE file.
'use strict';
tr.b.unittest.testSuite(function() {
- function createModel(start, end, slices) {
- return tr.e.chrome.ChromeTestUtils.newChromeModel(function(model) {
- const rendererProcess = model.rendererProcess;
- const mainThread = model.rendererMain;
- const group = mainThread.sliceGroup;
+ function createModel(slices, backgroundSlices) {
+ function addSlices(thread, slices) {
+ const group = thread.sliceGroup;
for (const slice of slices) {
group.pushSlice(tr.c.TestUtils.newSliceEx(slice));
}
group.createSubSlices();
- mainThread.updateBounds();
+ thread.updateBounds();
+ }
+ return tr.e.chrome.ChromeTestUtils.newChromeModel(function(model) {
+ const rendererProcess = model.rendererProcess;
+ addSlices(model.rendererMain, slices);
+ if (backgroundSlices) {
+ addSlices(model.foregroundWorker1, backgroundSlices);
+ }
});
}
@@ -35,21 +40,24 @@ tr.b.unittest.testSuite(function() {
function run(slices) {
const histograms = new tr.v.HistogramSet();
- const startTime = slices.reduce(
- (acc, slice) => (Math.min(acc, slice.start)));
- const endTime = slices.reduce((acc, slice) => (Math.max(acc, slice.end)));
- const model = createModel(startTime - 1, endTime + 1, slices);
+ const model = createModel(slices);
tr.metrics.v8.gcMetric(histograms, model, {include_sub_events: true});
return histograms;
}
+ function addGarbageCollectionMetrics(metrics, slices, backgroundSlices) {
+ const histograms = new tr.v.HistogramSet();
+ const model = createModel(slices, backgroundSlices);
+ tr.metrics.v8.addGarbageCollectionMetrics(metrics, histograms, model);
+ return histograms;
+ }
+
test('topEvents', function() {
const events = {
'V8.GCCompactor': 'v8-gc-full-mark-compactor',
'V8.GCFinalizeMC': 'v8-gc-latency-mark-compactor',
'V8.GCFinalizeMCReduceMemory': 'v8-gc-memory-mark-compactor',
'V8.GCIncrementalMarking': 'v8-gc-incremental-step',
- 'V8.GCIncrementalMarkingFinalize': 'v8-gc-incremental-finalize',
'V8.GCIncrementalMarkingStart': 'v8-gc-incremental-start',
'V8.GCPhantomHandleProcessingCallback': 'v8-gc-phantom-handle-callback',
'V8.GCScavenger': 'v8-gc-scavenger'
@@ -147,11 +155,6 @@ tr.b.unittest.testSuite(function() {
cpuStart: 150, cpuEnd: 160
},
{
- title: 'V8.GCIncrementalMarkingFinalize',
- args: {}, start: 200, end: 220,
- cpuStart: 200, cpuEnd: 220
- },
- {
title: 'V8.GCFinalizeMC',
args: {}, start: 250, end: 300,
cpuStart: 250, cpuEnd: 300
@@ -160,7 +163,7 @@ tr.b.unittest.testSuite(function() {
const histograms = run(slices);
const mmu = histograms.getHistogramNamed(
'v8-gc-mark-compactor-mmu-100ms_window');
- assert.closeTo(0.3, mmu.min, 1e-3);
+ assert.closeTo(0.5, mmu.min, 1e-3);
assert.strictEqual(mmu.summaryOptions.get('min'), true);
assert.strictEqual(mmu.summaryOptions.get('max'), false);
});
@@ -244,5 +247,685 @@ tr.b.unittest.testSuite(function() {
'v8-gc-scavenger-survived-percentage-from-stack');
assert.closeTo(0.375, percentageFromStack.average, 1e-3);
});
+
+ test('cycleAndEvent', function() {
+ const mainSlices = [
+ {
+ title: 'V8.GC_MC_INCREMENTAL',
+ cat: 'v8',
+ args: {'epoch': 0},
+ start: 100, cpuStart: 100, end: 110, cpuEnd: 110,
+ },
+ {
+ title: 'V8.GC_MC_INCREMENTAL',
+ cat: 'v8',
+ args: {'epoch': 0},
+ start: 200, cpuStart: 200, end: 220, cpuEnd: 220,
+ },
+ {
+ title: 'V8.GC_MARK_COMPACTOR',
+ cat: 'v8',
+ args: {'epoch': 0},
+ start: 300, cpuStart: 300, end: 400, cpuEnd: 400,
+ },
+ {
+ title: 'V8.GC_MC_MARK',
+ cat: 'v8.gc',
+ start: 300, cpuStart: 300, end: 340, cpuEnd: 340,
+ },
+ ];
+ const backgroundSlices = [];
+ const expectedAverages = [
+ ['v8:gc:cycle:main_thread:full:atomic:mark', 40],
+ ['v8:gc:cycle:main_thread:full:incremental:mark', 10 + 20],
+ ['v8:gc:event:main_thread:full:atomic:mark', 40],
+ ['v8:gc:event:main_thread:full:incremental:mark', (10 + 20) / 2],
+ ];
+ const metrics = expectedAverages.map(pair => pair[0]);
+ const histograms = addGarbageCollectionMetrics(
+ metrics, mainSlices, backgroundSlices);
+ for (const [name, expectedAverage] of expectedAverages) {
+ const h = histograms.getHistogramNamed(name);
+ assert.closeTo(expectedAverage, h.average, 1e-3);
+ }
+ });
+
+ test('nested', function() {
+ const mainSlices = [
+ {
+ title: 'V8.GC_MARK_COMPACTOR',
+ cat: 'v8',
+ args: {'epoch': 0},
+ start: 100, cpuStart: 100, end: 900, cpuEnd: 900,
+ },
+ {
+ title: 'V8.GC_MC_MARK',
+ cat: 'v8.gc',
+ start: 100, cpuStart: 100, end: 300, cpuEnd: 300,
+ },
+ {
+ title: 'V8.GC_MC_MARK',
+ cat: 'v8.gc',
+ start: 110, cpuStart: 110, end: 120, cpuEnd: 120,
+ },
+ {
+ title: 'BlinkGC.AtomicPauseMarkTransitiveClosure',
+ cat: 'blink.gc',
+ args: {'epoch': 1},
+ start: 110, cpuStart: 110, end: 111, cpuEnd: 111,
+ },
+ {
+ title: 'CppGC.AtomicMark',
+ cat: 'cpp.gc',
+ args: {'epoch': 1},
+ start: 111, cpuStart: 111, end: 112, cpuEnd: 112,
+ },
+ {
+ title: 'V8.GC_MC_MARK',
+ cat: 'v8.gc',
+ start: 230, cpuStart: 230, end: 250, cpuEnd: 250,
+ },
+ {
+ title: 'BlinkGC.AtomicPauseMarkTransitiveClosure',
+ cat: 'blink.gc',
+ args: {'epoch': 1},
+ start: 230, cpuStart: 230, end: 232, cpuEnd: 232,
+ },
+ {
+ title: 'CppGC.AtomicMark',
+ cat: 'cpp.gc',
+ args: {'epoch': 1},
+ start: 232, cpuStart: 232, end: 234, cpuEnd: 234,
+ },
+ {
+ title: 'V8.GC_MC_MARK',
+ cat: 'v8.gc',
+ start: 400, cpuStart: 400, end: 500, cpuEnd: 500,
+ },
+ {
+ title: 'BlinkGC.AtomicPauseMarkTransitiveClosure',
+ cat: 'blink.gc',
+ args: {'epoch': 1},
+ start: 400, cpuStart: 400, end: 403, cpuEnd: 403,
+ },
+ {
+ title: 'CppGC.AtomicMark',
+ cat: 'cpp.gc',
+ args: {'epoch': 1},
+ start: 403, cpuStart: 403, end: 406, cpuEnd: 406,
+ },
+ ];
+ const backgroundSlices = [];
+ const expectedAverages = [
+ ['v8:gc:cycle:main_thread:full:atomic:mark', 200 + 100],
+ ['v8:gc:event:main_thread:full:atomic:mark', (200 + 100) / 2],
+ ['v8:gc:cycle:main_thread:full:atomic:mark:cpp', 1 + 2 + 3 + 1 + 2 + 3],
+ ['v8:gc:event:main_thread:full:atomic:mark:cpp',
+ (1 + 2 + 3 + 1 + 2 + 3) / 6],
+ ];
+ const metrics = expectedAverages.map(pair => pair[0]);
+ const histograms = addGarbageCollectionMetrics(
+ metrics, mainSlices, backgroundSlices);
+ for (const [name, expectedAverage] of expectedAverages) {
+ const h = histograms.getHistogramNamed(name);
+ assert.closeTo(expectedAverage, h.average, 1e-3);
+ }
+ });
+
+ test('phases', function() {
+ const mainSlices = [
+ {
+ title: 'V8.GC_MARK_COMPACTOR',
+ cat: 'v8',
+ args: {'epoch': 0},
+ start: 100, cpuStart: 100, end: 900, cpuEnd: 900,
+ },
+ {
+ title: 'V8.GC_MC_MARK',
+ cat: 'v8.gc',
+ start: 100, cpuStart: 100, end: 110, cpuEnd: 110,
+ },
+ {
+ title: 'V8.GC_MC_CLEAR',
+ cat: 'v8.gc',
+ start: 200, cpuStart: 200, end: 220, cpuEnd: 220,
+ },
+ {
+ title: 'V8.GC_MC_EVACUATE',
+ cat: 'v8.gc',
+ start: 300, cpuStart: 300, end: 330, cpuEnd: 330,
+ },
+ {
+ title: 'V8.GC_MC_SWEEP',
+ cat: 'v8.gc',
+ start: 400, cpuStart: 400, end: 440, cpuEnd: 440,
+ },
+ ];
+ const backgroundSlices = [];
+ const expectedAverages = [
+ ['v8:gc:cycle:main_thread:full:atomic:mark', 10],
+ ['v8:gc:cycle:main_thread:full:atomic:weak', 20],
+ ['v8:gc:cycle:main_thread:full:atomic:compact', 30],
+ ['v8:gc:cycle:main_thread:full:atomic:sweep', 40],
+ ];
+ const metrics = expectedAverages.map(pair => pair[0]);
+ const histograms = addGarbageCollectionMetrics(
+ metrics, mainSlices, backgroundSlices);
+ for (const [name, expectedAverage] of expectedAverages) {
+ const h = histograms.getHistogramNamed(name);
+ assert.closeTo(expectedAverage, h.average, 1e-3);
+ }
+ });
+
+ test('minorPhases', function() {
+ const mainSlices = [
+ {
+ title: 'V8.GC_MINOR_MARK_COMPACTOR',
+ cat: 'v8',
+ args: {'epoch': 0},
+ start: 100, cpuStart: 100, end: 900, cpuEnd: 900,
+ },
+ {
+ title: 'V8.GC_MINOR_MC_MARK',
+ cat: 'v8.gc',
+ start: 100, cpuStart: 100, end: 110, cpuEnd: 110,
+ },
+ {
+ title: 'V8.GC_MINOR_MC_CLEAR',
+ cat: 'v8.gc',
+ start: 200, cpuStart: 200, end: 220, cpuEnd: 220,
+ },
+ {
+ title: 'V8.GC_MINOR_MC_EVACUATE',
+ cat: 'v8.gc',
+ start: 300, cpuStart: 300, end: 330, cpuEnd: 330,
+ },
+ {
+ title: 'V8.GC_MINOR_MC_SWEEP',
+ cat: 'v8.gc',
+ start: 400, cpuStart: 400, end: 440, cpuEnd: 440,
+ },
+ ];
+ const backgroundSlices = [];
+ const expectedAverages = [
+ ['v8:gc:cycle:main_thread:young:atomic:mark', 10],
+ ['v8:gc:cycle:main_thread:young:atomic:weak', 20],
+ ['v8:gc:cycle:main_thread:young:atomic:compact', 30],
+ ['v8:gc:cycle:main_thread:young:atomic:sweep', 40],
+ ];
+ const metrics = expectedAverages.map(pair => pair[0]);
+ const histograms = addGarbageCollectionMetrics(
+ metrics, mainSlices, backgroundSlices);
+ for (const [name, expectedAverage] of expectedAverages) {
+ const h = histograms.getHistogramNamed(name);
+ assert.closeTo(expectedAverage, h.average, 1e-3);
+ }
+ });
+
+ test('fullAndYoung', function() {
+ const mainSlices = [
+ {
+ title: 'V8.GC_MARK_COMPACTOR',
+ cat: 'v8',
+ args: {'epoch': 0},
+ start: 100, cpuStart: 100, end: 110, cpuEnd: 110,
+ },
+ {
+ title: 'V8.GC_SCAVENGER',
+ cat: 'v8',
+ args: {'epoch': 1},
+ start: 200, cpuStart: 200, end: 220, cpuEnd: 220,
+ },
+ {
+ title: 'V8.GC_SCAVENGER',
+ cat: 'v8',
+ args: {'epoch': 2},
+ start: 300, cpuStart: 300, end: 330, cpuEnd: 330,
+ },
+ {
+ title: 'V8.GC_MARK_COMPACTOR',
+ cat: 'v8',
+ args: {'epoch': 4},
+ start: 400, cpuStart: 400, end: 440, cpuEnd: 440,
+ },
+ {
+ title: 'V8.GC_MINOR_MARK_COMPACTOR',
+ cat: 'v8',
+ args: {'epoch': 5},
+ start: 500, cpuStart: 500, end: 550, cpuEnd: 550,
+ },
+ ];
+ const backgroundSlices = [];
+ const expectedAverages = [
+ ['v8:gc:cycle:main_thread:full:atomic', (10 + 40) / 2],
+ ['v8:gc:cycle:main_thread:full', (10 + 40) / 2],
+ ['v8:gc:cycle:full', (10 + 40) / 2],
+ ['v8:gc:cycle:main_thread:young:atomic', (20 + 30 + 50) / 3],
+ ['v8:gc:cycle:main_thread:young', (20 + 30 + 50) / 3],
+ ['v8:gc:cycle:young', (20 + 30 + 50) / 3],
+ ['v8:gc:cycle:main_thread', (10 + 20 + 30 + 40 + 50) / 5],
+ ['v8:gc:cycle', (10 + 20 + 30 + 40 + 50) / 5],
+ ];
+ const metrics = expectedAverages.map(pair => pair[0]);
+ const histograms = addGarbageCollectionMetrics(
+ metrics, mainSlices, backgroundSlices);
+ for (const [name, expectedAverage] of expectedAverages) {
+ const h = histograms.getHistogramNamed(name);
+ assert.closeTo(expectedAverage, h.average, 1e-3);
+ }
+ });
+
+ test('cpp', function() {
+ const mainSlices = [
+ {
+ title: 'V8.GC_MC_INCREMENTAL',
+ cat: 'v8',
+ args: {'epoch': 0},
+ start: 100, cpuStart: 100, end: 200, cpuEnd: 200,
+ },
+ {
+ title: 'BlinkGC.IncrementalMarkingStep',
+ cat: 'blink.gc',
+ args: {'epoch': 1},
+ start: 100, cpuStart: 100, end: 110, cpuEnd: 110,
+ },
+ {
+ title: 'CppGC.IncrementalMark',
+ cat: 'cpp.gc',
+ args: {'epoch': 1},
+ start: 110, cpuStart: 110, end: 120, cpuEnd: 120,
+ },
+ {
+ title: 'V8.GC_MARK_COMPACTOR',
+ cat: 'v8',
+ args: {'epoch': 0},
+ start: 200, cpuStart: 200, end: 300, cpuEnd: 300,
+ },
+ {
+ title: 'BlinkGC.AtomicPauseMarkTransitiveClosure',
+ cat: 'blink.gc',
+ args: {'epoch': 1},
+ start: 200, cpuStart: 200, end: 220, cpuEnd: 220,
+ },
+ {
+ title: 'CppGC.AtomicMark',
+ cat: 'cpp.gc',
+ args: {'epoch': 1},
+ start: 220, cpuStart: 220, end: 240, cpuEnd: 240,
+ },
+ ];
+ const backgroundSlices = [
+ {
+ title: 'BlinkGC.ConcurrentMarkingStep',
+ cat: 'blink.gc',
+ args: {'epoch': 1},
+ start: 100, cpuStart: 100, end: 130, cpuEnd: 130,
+ },
+ {
+ title: 'CppGC.ConcurrentMark',
+ cat: 'cpp.gc',
+ args: {'epoch': 1},
+ start: 130, cpuStart: 130, end: 160, cpuEnd: 160,
+ },
+ {
+ title: 'BlinkGC.ConcurrentMarkingStep',
+ cat: 'blink.gc',
+ args: {'epoch': 1},
+ start: 200, cpuStart: 200, end: 240, cpuEnd: 240,
+ },
+ {
+ title: 'CppGC.ConcurrentMark',
+ cat: 'cpp.gc',
+ args: {'epoch': 1},
+ start: 240, cpuStart: 240, end: 280, cpuEnd: 280,
+ },
+ ];
+ const expectedAverages = [
+ ['v8:gc:cycle:main_thread:full:atomic:mark:cpp', 20 + 20],
+ ['v8:gc:cycle:main_thread:full:incremental:mark:cpp', 10 + 10],
+ ['v8:gc:cycle:full:atomic:mark:cpp', 20 + 40 + 20 + 40],
+ ['v8:gc:cycle:full:incremental:mark:cpp', 10 + 30 + 10 + 30],
+ ];
+ const metrics = expectedAverages.map(pair => pair[0]);
+ const histograms = addGarbageCollectionMetrics(
+ metrics, mainSlices, backgroundSlices);
+ for (const [name, expectedAverage] of expectedAverages) {
+ const h = histograms.getHistogramNamed(name);
+ assert.closeTo(expectedAverage, h.average, 1e-3);
+ }
+ });
+
+ test('atomicAndIncremental', function() {
+ const mainSlices = [
+ {
+ title: 'V8.GC_MC_COMPLETE_SWEEPING',
+ cat: 'v8',
+ args: {'epoch': 0},
+ start: 80, cpuStart: 80, end: 100, cpuEnd: 100,
+ },
+ {
+ title: 'V8.GC_MC_INCREMENTAL',
+ cat: 'v8',
+ args: {'epoch': 1},
+ start: 100, cpuStart: 100, end: 110, cpuEnd: 110,
+ },
+ {
+ title: 'V8.GC_MARK_COMPACTOR',
+ cat: 'v8',
+ args: {'epoch': 1},
+ start: 200, cpuStart: 200, end: 300, cpuEnd: 300,
+ },
+ {
+ title: 'V8.GC_MC_MARK',
+ cat: 'v8',
+ start: 200, cpuStart: 200, end: 220, cpuEnd: 220,
+ },
+ ];
+ const backgroundSlices = [
+ {
+ title: 'V8.GC_MC_BACKGROUND_MARKING',
+ cat: 'v8',
+ args: {'epoch': 1},
+ start: 100, cpuStart: 100, end: 130, cpuEnd: 130,
+ },
+ {
+ title: 'V8.GC_MC_BACKGROUND_MARKING',
+ cat: 'v8',
+ args: {'epoch': 1},
+ start: 200, cpuStart: 200, end: 240, cpuEnd: 240,
+ },
+ ];
+ const expectedAverages = [
+ ['v8:gc:cycle:main_thread:full:incremental:sweep', 20],
+ ['v8:gc:cycle:main_thread:full:atomic:mark', 20],
+ ['v8:gc:cycle:main_thread:full:incremental:mark', 10],
+ ['v8:gc:cycle:background_threads:full:atomic:mark', 40],
+ ['v8:gc:cycle:background_threads:full:incremental:mark', 30],
+ ['v8:gc:cycle:full:atomic:mark', 20 + 40],
+ ['v8:gc:cycle:full:incremental:mark', 10 + 30],
+ ];
+ const metrics = expectedAverages.map(pair => pair[0]);
+ const histograms = addGarbageCollectionMetrics(
+ metrics, mainSlices, backgroundSlices);
+ for (const [name, expectedAverage] of expectedAverages) {
+ const h = histograms.getHistogramNamed(name);
+ assert.closeTo(expectedAverage, h.average, 1e-3);
+ }
+ });
+
+ test('multipleCycles', function() {
+ const mainSlices = [
+ {
+ title: 'V8.GC_MC_INCREMENTAL',
+ cat: 'v8',
+ args: {'epoch': 0},
+ start: 100, cpuStart: 100, end: 110, cpuEnd: 110,
+ },
+ {
+ title: 'BlinkGC.IncrementalMarkingStep',
+ cat: 'blink.gc',
+ args: {'epoch': 1},
+ start: 200, cpuStart: 200, end: 220, cpuEnd: 220,
+ },
+ {
+ title: 'CppGC.IncrementalMark',
+ cat: 'cpp.gc',
+ args: {'epoch': 1},
+ start: 220, cpuStart: 220, end: 240, cpuEnd: 240,
+ },
+ {
+ title: 'V8.GC_MARK_COMPACTOR',
+ cat: 'v8',
+ args: {'epoch': 0},
+ start: 300, cpuStart: 300, end: 400, cpuEnd: 400,
+ },
+ {
+ title: 'BlinkGC.AtomicPauseMarkTransitiveClosure',
+ cat: 'blink.gc',
+ args: {'epoch': 1},
+ start: 300, cpuStart: 300, end: 330, cpuEnd: 330,
+ },
+ {
+ title: 'CppGC.AtomicMark',
+ cat: 'cpp.gc',
+ args: {'epoch': 1},
+ start: 330, cpuStart: 330, end: 360, cpuEnd: 360,
+ },
+ {
+ title: 'V8.GC_MC_INCREMENTAL',
+ cat: 'v8',
+ args: {'epoch': 1},
+ start: 600, cpuStart: 600, end: 640, cpuEnd: 640,
+ },
+ {
+ title: 'V8.GC_MARK_COMPACTOR',
+ cat: 'v8',
+ args: {'epoch': 1},
+ start: 700, cpuStart: 700, end: 900, cpuEnd: 900,
+ },
+ {
+ title: 'BlinkGC.AtomicPauseMarkTransitiveClosure',
+ cat: 'blink.gc',
+ args: {'epoch': 2},
+ start: 700, cpuStart: 700, end: 750, cpuEnd: 750,
+ },
+ {
+ title: 'CppGC.AtomicMark',
+ cat: 'cpp.gc',
+ args: {'epoch': 2},
+ start: 750, cpuStart: 750, end: 800, cpuEnd: 800,
+ },
+ ];
+ const expectedAverages = [
+ ['v8:gc:cycle:full', ((10 + 20 + 20 + 100) + (40 + 200)) / 2],
+ ['v8:gc:cycle:full:cpp', ((20 + 30 + 20 + 30) + (50 + 50)) / 2],
+ ];
+ const metrics = expectedAverages.map(pair => pair[0]);
+ const histograms = addGarbageCollectionMetrics(metrics, mainSlices, []);
+ for (const [name, expectedAverage] of expectedAverages) {
+ const h = histograms.getHistogramNamed(name);
+ assert.closeTo(expectedAverage, h.average, 1e-3);
+ }
+ });
+
+ test('standaloneCppGC', function() {
+ const mainSlices = [
+ {
+ title: 'BlinkGC.IncrementalMarkingStep',
+ cat: 'blink.gc',
+ args: {'epoch': 1},
+ start: 200, cpuStart: 200, end: 220, cpuEnd: 220,
+ },
+ {
+ title: 'CppGC.IncrementalMark',
+ cat: 'cpp.gc',
+ args: {'epoch': 1},
+ start: 220, cpuStart: 220, end: 240, cpuEnd: 240,
+ },
+ {
+ title: 'BlinkGC.AtomicPauseMarkTransitiveClosure',
+ cat: 'blink.gc',
+ args: {'epoch': 1},
+ start: 300, cpuStart: 300, end: 330, cpuEnd: 330,
+ },
+ {
+ title: 'CppGC.AtomicMark',
+ cat: 'cpp.gc',
+ args: {'epoch': 1},
+ start: 330, cpuStart: 330, end: 360, cpuEnd: 360,
+ },
+ {
+ title: 'BlinkGC.AtomicPauseMarkTransitiveClosure',
+ cat: 'blink.gc',
+ args: {'epoch': 2},
+ start: 700, cpuStart: 700, end: 750, cpuEnd: 750,
+ },
+ {
+ title: 'CppGC.AtomicMark',
+ cat: 'cpp.gc',
+ args: {'epoch': 2},
+ start: 750, cpuStart: 750, end: 800, cpuEnd: 800,
+ },
+ ];
+ const expectedAverages = [
+ ['v8:gc:cycle:full', ((20 + 30 + 20 + 30) + (50 + 50)) / 2],
+ ['v8:gc:cycle:full:cpp', ((20 + 30 + 20 + 30) + (50 + 50)) / 2],
+ ];
+ const metrics = expectedAverages.map(pair => pair[0]);
+ const histograms = addGarbageCollectionMetrics(metrics, mainSlices, []);
+ for (const [name, expectedAverage] of expectedAverages) {
+ const h = histograms.getHistogramNamed(name);
+ assert.closeTo(expectedAverage, h.average, 1e-3);
+ }
+ });
+
+ test('ambigousEpoch', function() {
+ const mainSlices = [
+ {
+ title: 'V8.GC_MARK_COMPACTOR',
+ cat: 'v8',
+ args: {'epoch': 0},
+ start: 300, cpuStart: 300, end: 400, cpuEnd: 400,
+ },
+ {
+ title: 'BlinkGC.AtomicPauseMarkTransitiveClosure',
+ cat: 'blink.gc',
+ args: {'epoch': 1},
+ start: 300, cpuStart: 300, end: 330, cpuEnd: 330,
+ },
+ {
+ title: 'V8.GC_MC_INCREMENTAL',
+ cat: 'v8',
+ args: {'epoch': 3},
+ start: 600, cpuStart: 600, end: 640, cpuEnd: 640,
+ },
+ {
+ title: 'BlinkGC.CompleteSweep',
+ cat: 'blink.gc',
+ args: {'epoch': 1},
+ start: 600, cpuStart: 600, end: 610, cpuEnd: 610,
+ },
+ {
+ title: 'CppGC.IncrementalMark',
+ cat: 'cpp.gc',
+ args: {'epoch': 2},
+ start: 610, cpuStart: 610, end: 640, cpuEnd: 640,
+ },
+ ];
+ const expectedAverages = [
+ ['v8:gc:cycle:full', ((100) + (40)) / 2],
+ ['v8:gc:cycle:full:cpp', ((30 + 10) + (30)) / 2],
+ ];
+ const metrics = expectedAverages.map(pair => pair[0]);
+ const histograms = addGarbageCollectionMetrics(metrics, mainSlices, []);
+ for (const [name, expectedAverage] of expectedAverages) {
+ const h = histograms.getHistogramNamed(name);
+ assert.closeTo(expectedAverage, h.average, 1e-3);
+ }
+ });
+
+ test('sweepingInEvacuation', function() {
+ const mainSlices = [
+ {
+ title: 'V8.GC_MARK_COMPACTOR',
+ cat: 'v8',
+ args: {'epoch': 0},
+ start: 100, cpuStart: 100, end: 200, cpuEnd: 200,
+ },
+ {
+ title: 'V8.GC_MC_EVACUATE',
+ cat: 'v8',
+ args: {'epoch': 0},
+ start: 110, cpuStart: 110, end: 150, cpuEnd: 150,
+ },
+ {
+ title: 'V8.GC_MC_SWEEP',
+ cat: 'v8',
+ args: {'epoch': 0},
+ start: 120, cpuStart: 120, end: 140, cpuEnd: 140,
+ },
+ {
+ title: 'V8.GC_MC_SWEEP',
+ cat: 'v8',
+ args: {'epoch': 0},
+ start: 160, cpuStart: 160, end: 190, cpuEnd: 190,
+ },
+ {
+ title: 'V8.GC_MINOR_MARK_COMPACTOR',
+ cat: 'v8',
+ args: {'epoch': 1},
+ start: 200, cpuStart: 200, end: 300, cpuEnd: 300,
+ },
+ {
+ title: 'V8.GC_MINOR_MC_EVACUATE',
+ cat: 'v8',
+ args: {'epoch': 1},
+ start: 210, cpuStart: 210, end: 250, cpuEnd: 250,
+ },
+ {
+ title: 'V8.GC_MINOR_MC_SWEEP',
+ cat: 'v8',
+ args: {'epoch': 1},
+ start: 220, cpuStart: 220, end: 240, cpuEnd: 240,
+ },
+ {
+ title: 'V8.GC_MINOR_MC_SWEEP',
+ cat: 'v8',
+ args: {'epoch': 1},
+ start: 260, cpuStart: 260, end: 290, cpuEnd: 290,
+ },
+ ];
+ const backgroundSlices = [
+ {
+ title: 'V8.GC_MC_BACKGROUND_EVACUATE_COPY',
+ cat: 'v8',
+ args: {'epoch': 0},
+ start: 110, cpuStart: 110, end: 150, cpuEnd: 150,
+ },
+ {
+ title: 'V8.GC_MC_BACKGROUND_SWEEPING',
+ cat: 'v8',
+ args: {'epoch': 0},
+ start: 120, cpuStart: 120, end: 140, cpuEnd: 140,
+ },
+ {
+ title: 'V8.GC_MC_BACKGROUND_SWEEPING',
+ cat: 'v8',
+ args: {'epoch': 0},
+ start: 160, cpuStart: 160, end: 190, cpuEnd: 190,
+ },
+ {
+ title: 'V8.GC_MINOR_MC_BACKGROUND_EVACUATE_COPY',
+ cat: 'v8',
+ args: {'epoch': 1},
+ start: 210, cpuStart: 210, end: 250, cpuEnd: 250,
+ },
+ {
+ title: 'V8.GC_MINOR_MC_BACKGROUND_SWEEPING',
+ cat: 'v8',
+ args: {'epoch': 1},
+ start: 220, cpuStart: 220, end: 240, cpuEnd: 240,
+ },
+ {
+ title: 'V8.GC_MINOR_MC_BACKGROUND_SWEEPING',
+ cat: 'v8',
+ args: {'epoch': 1},
+ start: 260, cpuStart: 260, end: 290, cpuEnd: 290,
+ },
+ ];
+ const expectedAverages = [
+ ['v8:gc:cycle:full:compact', 40 + 40],
+ ['v8:gc:cycle:full:sweep', 30 + 30],
+ ['v8:gc:cycle:young:compact', 40 + 40],
+ ['v8:gc:cycle:young:sweep', 30 + 30],
+ ];
+ const metrics = expectedAverages.map(pair => pair[0]);
+ const histograms = addGarbageCollectionMetrics(
+ metrics, mainSlices, backgroundSlices);
+ for (const [name, expectedAverage] of expectedAverages) {
+ const h = histograms.getHistogramNamed(name);
+ assert.closeTo(expectedAverage, h.average, 1e-3);
+ }
+ });
});
</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/v8/utils.html b/chromium/third_party/catapult/tracing/tracing/metrics/v8/utils.html
index cb5e9fe2f3a..1c06d3a590a 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/v8/utils.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/v8/utils.html
@@ -41,7 +41,6 @@ tr.exportTo('tr.metrics.v8.utils', function() {
'V8.GCFinalizeMC': 'v8-gc-latency-mark-compactor',
'V8.GCFinalizeMCReduceMemory': 'v8-gc-memory-mark-compactor',
'V8.GCIncrementalMarking': 'v8-gc-incremental-step',
- 'V8.GCIncrementalMarkingFinalize': 'v8-gc-incremental-finalize',
'V8.GCIncrementalMarkingStart': 'v8-gc-incremental-start',
'V8.GCPhantomHandleProcessingCallback': 'v8-gc-phantom-handle-callback',
'V8.GCScavenger': 'v8-gc-scavenger'
@@ -52,7 +51,6 @@ tr.exportTo('tr.metrics.v8.utils', function() {
'V8.GCFinalizeMC',
'V8.GCFinalizeMCReduceMemory',
'V8.GCIncrementalMarking',
- 'V8.GCIncrementalMarkingFinalize',
'V8.GCIncrementalMarkingStart',
'V8.GCPhantomHandleProcessingCallback'
]);
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/v8/v8_metrics.html b/chromium/third_party/catapult/tracing/tracing/metrics/v8/v8_metrics.html
index 507d23e6119..524814d55af 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/v8/v8_metrics.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/v8/v8_metrics.html
@@ -9,6 +9,7 @@ found in the LICENSE file.
<link rel="import" href="/tracing/metrics/system_health/memory_metric.html">
<link rel="import" href="/tracing/metrics/v8/execution_metric.html">
<link rel="import" href="/tracing/metrics/v8/gc_metric.html">
+<link rel="import" href="/tracing/metrics/v8/runtime_stats_metric.html">
<script>
'use strict';
@@ -17,6 +18,7 @@ tr.exportTo('tr.metrics.v8', function() {
function v8AndMemoryMetrics(histograms, model) {
tr.metrics.v8.executionMetric(histograms, model);
tr.metrics.v8.gcMetric(histograms, model);
+ tr.metrics.v8.runtimeStatsTotalMetric(histograms, model);
tr.metrics.sh.memoryMetric(histograms, model,
{rangeOfInterest: tr.metrics.v8.utils.rangeForMemoryDumps(model)});
}
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/v8/wasm_metric.html b/chromium/third_party/catapult/tracing/tracing/metrics/v8/wasm_metric.html
index b9e500c50fd..6e12457e664 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/v8/wasm_metric.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/v8/wasm_metric.html
@@ -38,6 +38,52 @@ tr.exportTo('tr.metrics.v8', function() {
histograms.addHistogram(wasmSyncInstantiationTimeWall);
}
+ function computeSyncCompileTimeMetric(histograms, wasmEvents) {
+ if (!wasmEvents.hasOwnProperty('wasm.SyncCompile')) return;
+
+ const wasmSyncCompileTimeCPU = new tr.v.Histogram(
+ 'v8:wasm:sync_compile:cpu_time',
+ tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);
+ wasmSyncCompileTimeCPU.description =
+ 'cpu time spent compiling a WebAssembly module synchronously';
+ const wasmSyncCompileTimeWall = new tr.v.Histogram(
+ 'v8:wasm:sync_compile:wall_time',
+ tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);
+ wasmSyncCompileTimeWall.description =
+ 'wall time spent compiling a WebAssembly module synchronously';
+
+ for (const e of wasmEvents['wasm.SyncCompile']) {
+ wasmSyncCompileTimeCPU.addSample(e.cpuDuration);
+ wasmSyncCompileTimeWall.addSample(e.duration);
+ }
+
+ histograms.addHistogram(wasmSyncCompileTimeCPU);
+ histograms.addHistogram(wasmSyncCompileTimeWall);
+ }
+
+ function computeDeserializeTimeMetric(histograms, wasmEvents) {
+ if (!wasmEvents.hasOwnProperty('wasm.Deserialize')) return;
+
+ const wasmDeserializeTimeCPU = new tr.v.Histogram(
+ 'v8:wasm:deserialize:cpu_time',
+ tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);
+ wasmDeserializeTimeCPU.description =
+ 'cpu time spent deserializing a WebAssembly module';
+ const wasmDeserializeTimeWall = new tr.v.Histogram(
+ 'v8:wasm:deserialize:wall_time',
+ tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);
+ wasmDeserializeTimeWall.description =
+ 'wall time spent deserializing a WebAssembly module';
+
+ for (const e of wasmEvents['wasm.Deserialize']) {
+ wasmDeserializeTimeCPU.addSample(e.cpuDuration);
+ wasmDeserializeTimeWall.addSample(e.duration);
+ }
+
+ histograms.addHistogram(wasmDeserializeTimeCPU);
+ histograms.addHistogram(wasmDeserializeTimeWall);
+ }
+
function computeStreamingBaselineCompileTimeMetric(histograms, wasmEvents) {
// With streaming compilation, baseline compilation happens from when the
// first bytes get received until when baseline compilation finishes. If
@@ -51,12 +97,14 @@ tr.exportTo('tr.metrics.v8', function() {
'v8:wasm:streaming_baseline_compilation:wall_time',
tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);
- const compilationStart =
- wasmEvents['wasm.StartStreamingCompilation'][0].start;
-
- const compilationEnd = wasmEvents['wasm.BaselineFinished'][0].end;
-
- histogram.addSample(compilationEnd - compilationStart);
+ for (const endEvent of wasmEvents['wasm.BaselineFinished']) {
+ const compilationEnd = endEvent.end;
+ const startEvent = wasmEvents['wasm.StartStreamingCompilation'].find(
+ e => e.args.id === endEvent.args.id);
+ if (!startEvent) continue;
+ const compilationStart = startEvent.start;
+ histogram.addSample(compilationEnd - compilationStart);
+ }
histograms.addHistogram(histogram);
}
@@ -70,10 +118,14 @@ tr.exportTo('tr.metrics.v8', function() {
'v8:wasm:compilation_tierup:wall_time',
tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);
- const tierupStart = wasmEvents['wasm.BaselineFinished'][0].start;
- const tierupEnd = wasmEvents['wasm.TopTierFinished'][0].end;
-
- histogram.addSample(tierupEnd - tierupStart);
+ for (const endEvent of wasmEvents['wasm.TopTierFinished']) {
+ const tierupEnd = endEvent.end;
+ const startEvent = wasmEvents['wasm.BaselineFinished'].find(
+ e => e.args.id === endEvent.args.id);
+ if (!startEvent) continue;
+ const tierupStart = startEvent.start;
+ histogram.addSample(tierupEnd - tierupStart);
+ }
histograms.addHistogram(histogram);
}
@@ -90,6 +142,8 @@ tr.exportTo('tr.metrics.v8', function() {
const wasmEvents = collectWasmEvents(model);
computeSyncInstantiationTimeMetric(histograms, wasmEvents);
+ computeSyncCompileTimeMetric(histograms, wasmEvents);
+ computeDeserializeTimeMetric(histograms, wasmEvents);
computeStreamingBaselineCompileTimeMetric(histograms, wasmEvents);
computeCompilationTierupWallTimeMetric(histograms, wasmEvents);
}
diff --git a/chromium/third_party/catapult/tracing/tracing/metrics/v8/wasm_metric_test.html b/chromium/third_party/catapult/tracing/tracing/metrics/v8/wasm_metric_test.html
index 0681b6ddf3b..573c02d4ff3 100644
--- a/chromium/third_party/catapult/tracing/tracing/metrics/v8/wasm_metric_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/metrics/v8/wasm_metric_test.html
@@ -67,14 +67,70 @@ tr.b.unittest.testSuite(function() {
assert.strictEqual(wallValue.running.max, 30);
});
+ test('testSyncCompileMetric', function() {
+ const slices = [
+ {
+ title: 'wasm.SyncCompile', args: {}, start: 10, end: 20,
+ cpuStart: 100, cpuEnd: 200
+ },
+ {
+ title: 'wasm.SyncCompile', args: {}, start: 30, end: 60,
+ cpuStart: 300, cpuEnd: 600
+ }
+ ];
+ const histograms = runMetrics(slices);
+
+ const cpuValue =
+ histograms.getHistogramNamed('v8:wasm:sync_compile:cpu_time');
+ assert.strictEqual(cpuValue.running.sum, 400);
+ assert.strictEqual(cpuValue.numValues, 2);
+ assert.strictEqual(cpuValue.average, 200);
+ assert.strictEqual(cpuValue.running.max, 300);
+
+ const wallValue =
+ histograms.getHistogramNamed('v8:wasm:sync_compile:wall_time');
+ assert.strictEqual(wallValue.running.sum, 40);
+ assert.strictEqual(wallValue.numValues, 2);
+ assert.strictEqual(wallValue.average, 20);
+ assert.strictEqual(wallValue.running.max, 30);
+ });
+
+ test('testDeserializeMetric', function() {
+ const slices = [
+ {
+ title: 'wasm.Deserialize', args: {}, start: 10, end: 20,
+ cpuStart: 100, cpuEnd: 200
+ },
+ {
+ title: 'wasm.Deserialize', args: {}, start: 30, end: 60,
+ cpuStart: 300, cpuEnd: 600
+ }
+ ];
+ const histograms = runMetrics(slices);
+
+ const cpuValue =
+ histograms.getHistogramNamed('v8:wasm:deserialize:cpu_time');
+ assert.strictEqual(cpuValue.running.sum, 400);
+ assert.strictEqual(cpuValue.numValues, 2);
+ assert.strictEqual(cpuValue.average, 200);
+ assert.strictEqual(cpuValue.running.max, 300);
+
+ const wallValue =
+ histograms.getHistogramNamed('v8:wasm:deserialize:wall_time');
+ assert.strictEqual(wallValue.running.sum, 40);
+ assert.strictEqual(wallValue.numValues, 2);
+ assert.strictEqual(wallValue.average, 20);
+ assert.strictEqual(wallValue.running.max, 30);
+ });
+
test('testStreamingBaselineCompileTime', function() {
const slices = [
{
- title: 'wasm.StartStreamingCompilation', args: {}, start: 10, end: 20,
- cpuStart: 10, cpuEnd: 20
+ title: 'wasm.StartStreamingCompilation', args: {id: 0}, start: 10,
+ end: 20, cpuStart: 10, cpuEnd: 20
},
{
- title: 'wasm.BaselineFinished', args: {}, start: 100, end: 110,
+ title: 'wasm.BaselineFinished', args: {id: 0}, start: 100, end: 110,
cpuStart: 100, cpuEnd: 110
},
];
@@ -87,10 +143,38 @@ tr.b.unittest.testSuite(function() {
assert.strictEqual(compileTime.running.max, 100);
});
+ test('testStreamingBaselineCompileTimeTwoCompilations', function() {
+ const slices = [
+ {
+ title: 'wasm.StartStreamingCompilation', args: {id: 0}, start: 10,
+ end: 20, cpuStart: 10, cpuEnd: 20
+ },
+ {
+ title: 'wasm.StartStreamingCompilation', args: {id: 1}, start: 110,
+ end: 120, cpuStart: 110, cpuEnd: 120
+ },
+ {
+ title: 'wasm.BaselineFinished', args: {id: 1}, start: 200, end: 210,
+ cpuStart: 200, cpuEnd: 210
+ },
+ {
+ title: 'wasm.BaselineFinished', args: {id: 0}, start: 100, end: 110,
+ cpuStart: 100, cpuEnd: 110
+ },
+ ];
+ const histograms = runMetrics(slices);
+
+ const compileTime = histograms.getHistogramNamed(
+ 'v8:wasm:streaming_baseline_compilation:wall_time');
+ assert.strictEqual(compileTime.numValues, 2);
+ assert.strictEqual(compileTime.average, 100);
+ assert.strictEqual(compileTime.running.max, 100);
+ });
+
test('testStreamingBaselineCompileTimeNoStartEvent', function() {
const slices = [
{
- title: 'wasm.BaselineFinished', args: {}, start: 100, end: 110,
+ title: 'wasm.BaselineFinished', args: {id: 0}, start: 100, end: 110,
cpuStart: 100, cpuEnd: 110
},
];
@@ -104,8 +188,8 @@ tr.b.unittest.testSuite(function() {
test('testStreamingBaselineCompileTimeNoEndEvent', function() {
const slices = [
{
- title: 'wasm.StartStreamingCompilation', args: {}, start: 100, end: 110,
- cpuStart: 100, cpuEnd: 110
+ title: 'wasm.StartStreamingCompilation', args: {id: 0}, start: 100,
+ end: 110, cpuStart: 100, cpuEnd: 110
},
];
const histograms = runMetrics(slices);
@@ -118,11 +202,11 @@ tr.b.unittest.testSuite(function() {
test('testTierupWallTime', function() {
const slices = [
{
- title: 'wasm.BaselineFinished', args: {}, start: 100, end: 110,
+ title: 'wasm.BaselineFinished', args: {id: 0}, start: 100, end: 110,
cpuStart: 100, cpuEnd: 110
},
{
- title: 'wasm.TopTierFinished', args: {}, start: 200, end: 210,
+ title: 'wasm.TopTierFinished', args: {id: 0}, start: 200, end: 210,
cpuStart: 200, cpuEnd: 210
},
];
@@ -136,10 +220,39 @@ tr.b.unittest.testSuite(function() {
assert.strictEqual(tierupTime.running.max, 110);
});
+ test('testTierupWallTimeTwoTierups', function() {
+ const slices = [
+ {
+ title: 'wasm.BaselineFinished', args: {id: 0}, start: 100, end: 110,
+ cpuStart: 100, cpuEnd: 110
+ },
+ {
+ title: 'wasm.BaselineFinished', args: {id: 1}, start: 200, end: 210,
+ cpuStart: 200, cpuEnd: 210
+ },
+ {
+ title: 'wasm.TopTierFinished', args: {id: 1}, start: 300, end: 310,
+ cpuStart: 200, cpuEnd: 210
+ },
+ {
+ title: 'wasm.TopTierFinished', args: {id: 0}, start: 200, end: 210,
+ cpuStart: 200, cpuEnd: 210
+ },
+ ];
+
+ const histograms = runMetrics(slices);
+
+ const tierupTime = histograms.getHistogramNamed(
+ 'v8:wasm:compilation_tierup:wall_time');
+ assert.strictEqual(tierupTime.numValues, 2);
+ assert.strictEqual(tierupTime.average, 110);
+ assert.strictEqual(tierupTime.running.max, 110);
+ });
+
test('testTierupNoStartEvent', function() {
const slices = [
{
- title: 'wasm.TopTierFinished', args: {}, start: 200, end: 210,
+ title: 'wasm.TopTierFinished', args: {id: 0}, start: 200, end: 210,
cpuStart: 200, cpuEnd: 210
},
];
@@ -154,7 +267,7 @@ tr.b.unittest.testSuite(function() {
test('testTierupNoEndEvent', function() {
const slices = [
{
- title: 'wasm.BaselineFinished', args: {}, start: 100, end: 110,
+ title: 'wasm.BaselineFinished', args: {id: 0}, start: 100, end: 110,
cpuStart: 100, cpuEnd: 110
},
];
diff --git a/chromium/third_party/catapult/tracing/tracing/model/clock_sync_manager.html b/chromium/third_party/catapult/tracing/tracing/model/clock_sync_manager.html
index 8e9e6be8170..57a4da9ea90 100644
--- a/chromium/third_party/catapult/tracing/tracing/model/clock_sync_manager.html
+++ b/chromium/third_party/catapult/tracing/tracing/model/clock_sync_manager.html
@@ -18,6 +18,7 @@ tr.exportTo('tr.model', function() {
// didn't explicitly specify the clock being used.
UNKNOWN_CHROME_LEGACY: 'UNKNOWN_CHROME_LEGACY',
+ FUCHSIA_ZX_CLOCK_MONOTONIC: 'FUCHSIA_ZX_CLOCK_MONOTONIC',
LINUX_CLOCK_MONOTONIC: 'LINUX_CLOCK_MONOTONIC',
LINUX_FTRACE_GLOBAL: 'LINUX_FTRACE_GLOBAL',
MAC_MACH_ABSOLUTE_TIME: 'MAC_MACH_ABSOLUTE_TIME',
diff --git a/chromium/third_party/catapult/tracing/tracing/model/helpers/telemetry_helper.html b/chromium/third_party/catapult/tracing/tracing/model/helpers/telemetry_helper.html
index 64ff046b3ef..415400638a9 100644
--- a/chromium/third_party/catapult/tracing/tracing/model/helpers/telemetry_helper.html
+++ b/chromium/third_party/catapult/tracing/tracing/model/helpers/telemetry_helper.html
@@ -117,7 +117,6 @@ tr.exportTo('tr.model.helpers', function() {
this.irSegments_.push(new tr.model.um.Segment(
gestureEvent.start, gestureEvent.duration));
gestureEventFound = true;
- break;
}
}
} else if (parts[1].startsWith('ui_')) {
diff --git a/chromium/third_party/catapult/tracing/tracing/model/helpers/telemetry_helper_test.html b/chromium/third_party/catapult/tracing/tracing/model/helpers/telemetry_helper_test.html
index f4a47ef74d1..705ab281dfc 100644
--- a/chromium/third_party/catapult/tracing/tracing/model/helpers/telemetry_helper_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/model/helpers/telemetry_helper_test.html
@@ -71,6 +71,36 @@ tr.b.unittest.testSuite(function() {
assert.deepEqual([6, 8], [segments[2].start, segments[2].end]);
});
+ test('irSegmentWithMultipleGestures', function() {
+ const m = tr.c.TestUtils.newModel((m) => {
+ // There is no IR in this renderer process.
+ const r = m.getOrCreateProcess(1).getOrCreateThread(1);
+ r.name = 'CrRendererMain';
+ r.asyncSliceGroup.push(tr.c.TestUtils.newAsyncSliceNamed(
+ 'SyntheticGestureController::running', 1, 1));
+ r.asyncSliceGroup.push(tr.c.TestUtils.newAsyncSliceNamed(
+ 'SyntheticGestureController::running', 3, 1));
+ r.asyncSliceGroup.push(tr.c.TestUtils.newAsyncSliceNamed(
+ 'SyntheticGestureController::running', 5, 2));
+ r.asyncSliceGroup.push(
+ tr.c.TestUtils.newAsyncSliceNamed('Interaction.Gesture_A', 1, 7));
+ });
+
+ // Async slices are:
+ //
+ // 1 2 3 4 5 6 7 8
+ // Interactions <---------------------- A ------------------------------>
+ // Gestures <-------> <-------> <--------------->
+ //
+ // Segments should be: [1, 2], [3, 4], and [6, 8].
+ const modelHelper = m.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);
+ const segments = modelHelper.telemetryHelper.irSegments;
+ assert.strictEqual(3, segments.length);
+ assert.deepEqual([1, 2], [segments[0].start, segments[0].end]);
+ assert.deepEqual([3, 4], [segments[1].start, segments[1].end]);
+ assert.deepEqual([5, 7], [segments[2].start, segments[2].end]);
+ });
+
test('uiSegments', function() {
const m = tr.c.TestUtils.newModel((m) => {
// There is no IR in this renderer process.
diff --git a/chromium/third_party/catapult/tracing/tracing/model/thread.html b/chromium/third_party/catapult/tracing/tracing/model/thread.html
index 0822a6140b3..b31de4aadd6 100644
--- a/chromium/third_party/catapult/tracing/tracing/model/thread.html
+++ b/chromium/third_party/catapult/tracing/tracing/model/thread.html
@@ -239,7 +239,8 @@ tr.exportTo('tr.model', function() {
let sum = 0;
tr.b.iterateOverIntersectingIntervals(
this.sliceGroup.topLevelSlices,
- slice => slice.start, slice => slice.end,
+ slice => slice.start, // mapLoFn
+ slice => slice.duration, // mapWidthFn measures width not end of slice
range.min, range.max,
slice => {
let fractionOfSliceInsideRangeOfInterest = 1;
diff --git a/chromium/third_party/catapult/tracing/tracing/mre/cloud_storage.py b/chromium/third_party/catapult/tracing/tracing/mre/cloud_storage.py
index 877ddaa0645..34e8c431bb0 100644
--- a/chromium/third_party/catapult/tracing/tracing/mre/cloud_storage.py
+++ b/chromium/third_party/catapult/tracing/tracing/mre/cloud_storage.py
@@ -22,6 +22,8 @@ class CloudStorageError(Exception):
' 3. For the project-id, just enter 0.' % command)
+# TODO(https://1277796): Rename this once we're Python 3-only.
+# pylint: disable=redefined-builtin
class PermissionError(CloudStorageError):
def __init__(self):
diff --git a/chromium/third_party/catapult/tracing/tracing/mre/failure.py b/chromium/third_party/catapult/tracing/tracing/mre/failure.py
index 8c0713e1d8b..cc70f4ee215 100644
--- a/chromium/third_party/catapult/tracing/tracing/mre/failure.py
+++ b/chromium/third_party/catapult/tracing/tracing/mre/failure.py
@@ -21,7 +21,7 @@ class Failure(object):
def __str__(self):
return (
'Failure for job %s with function handle %s and trace handle %s:\n'
- 'of type %s wtih description %s. Stack:\n\n%s' % (
+ 'of type "%s" with description "%s". Stack:\n\n%s' % (
self.job.guid, self.function_handle_string,
self.trace_canonical_url, self.failure_type_name,
self.description, self.stack))
diff --git a/chromium/third_party/catapult/tracing/tracing/mre/failure_unittest.py b/chromium/third_party/catapult/tracing/tracing/mre/failure_unittest.py
index 1140b17aa66..348b63ecf42 100644
--- a/chromium/third_party/catapult/tracing/tracing/mre/failure_unittest.py
+++ b/chromium/third_party/catapult/tracing/tracing/mre/failure_unittest.py
@@ -24,7 +24,7 @@ class FailureTests(unittest.TestCase):
'file://foo.html',
'err', 'desc', 'stack')
- self.assertEquals(failure.AsDict(), {
+ self.assertEqual(failure.AsDict(), {
'job_guid': '1',
'function_handle_string': 'foo.html:Foo',
'trace_canonical_url': 'file://foo.html',
@@ -48,9 +48,9 @@ class FailureTests(unittest.TestCase):
failure = failure_module.Failure.FromDict(failure_dict, job)
- self.assertEquals(failure.job.guid, '1')
- self.assertEquals(failure.function_handle_string, 'foo.html:Foo')
- self.assertEquals(failure.trace_canonical_url, 'file://foo.html')
- self.assertEquals(failure.failure_type_name, 'err')
- self.assertEquals(failure.description, 'desc')
- self.assertEquals(failure.stack, 'stack')
+ self.assertEqual(failure.job.guid, '1')
+ self.assertEqual(failure.function_handle_string, 'foo.html:Foo')
+ self.assertEqual(failure.trace_canonical_url, 'file://foo.html')
+ self.assertEqual(failure.failure_type_name, 'err')
+ self.assertEqual(failure.description, 'desc')
+ self.assertEqual(failure.stack, 'stack')
diff --git a/chromium/third_party/catapult/tracing/tracing/mre/function_handle.py b/chromium/third_party/catapult/tracing/tracing/mre/function_handle.py
index 1efa5d647a9..f000e46edef 100644
--- a/chromium/third_party/catapult/tracing/tracing/mre/function_handle.py
+++ b/chromium/third_party/catapult/tracing/tracing/mre/function_handle.py
@@ -99,7 +99,7 @@ class FunctionHandle(object):
abspath = module.filename
if not abspath:
- raise AbspathInvalidError('Filename %s invalid', abspath)
+ raise AbspathInvalidError('Filename %s invalid' % abspath)
new_modules_to_load.append(ModuleToLoad(filename=abspath))
@@ -136,4 +136,3 @@ class FunctionHandle(object):
return FunctionHandle(modules_to_load=modules_to_load,
function_name=parts[-1])
-
diff --git a/chromium/third_party/catapult/tracing/tracing/mre/function_handle_unittest.py b/chromium/third_party/catapult/tracing/tracing/mre/function_handle_unittest.py
index d3bf71dfe66..522ec69eade 100644
--- a/chromium/third_party/catapult/tracing/tracing/mre/function_handle_unittest.py
+++ b/chromium/third_party/catapult/tracing/tracing/mre/function_handle_unittest.py
@@ -20,18 +20,18 @@ class ModuleToLoadTests(unittest.TestCase):
mtl0 = function_handle.ModuleToLoad(href='/foo')
mtl1 = function_handle.ModuleToLoad(filename='foo.html')
- self.assertEquals(str(mtl0), 'ModuleToLoad(href="/foo")')
- self.assertEquals(str(mtl1), 'ModuleToLoad(filename="foo.html")')
+ self.assertEqual(str(mtl0), 'ModuleToLoad(href="/foo")')
+ self.assertEqual(str(mtl1), 'ModuleToLoad(filename="foo.html")')
def testAsDict(self):
mtl0 = function_handle.ModuleToLoad(href='/foo')
mtl1 = function_handle.ModuleToLoad(filename='foo.html')
- self.assertEquals(mtl0.AsDict(), {
+ self.assertEqual(mtl0.AsDict(), {
'href': '/foo'
})
- self.assertEquals(mtl1.AsDict(), {
+ self.assertEqual(mtl1.AsDict(), {
'filename': 'foo.html'
})
@@ -47,9 +47,9 @@ class ModuleToLoadTests(unittest.TestCase):
mtl0 = function_handle.ModuleToLoad.FromDict(module_dict0)
mtl1 = function_handle.ModuleToLoad.FromDict(module_dict1)
- self.assertEquals(mtl0.href, '/foo')
+ self.assertEqual(mtl0.href, '/foo')
self.assertIsNone(mtl0.filename)
- self.assertEquals(mtl1.filename, 'foo.html')
+ self.assertEqual(mtl1.filename, 'foo.html')
self.assertIsNone(mtl1.href)
@@ -59,7 +59,7 @@ class FunctionHandleTests(unittest.TestCase):
module = function_handle.ModuleToLoad(href='/foo')
handle = function_handle.FunctionHandle([module], 'Bar')
- self.assertEquals(
+ self.assertEqual(
str(handle),
'FunctionHandle(modules_to_load=[ModuleToLoad(href="/foo")], '
'function_name="Bar")')
@@ -68,7 +68,7 @@ class FunctionHandleTests(unittest.TestCase):
module = function_handle.ModuleToLoad(href='/foo')
handle = function_handle.FunctionHandle([module], 'Bar')
- self.assertEquals(
+ self.assertEqual(
handle.AsDict(), {
'modules_to_load': [{'href': '/foo'}],
'function_name': 'Bar'
@@ -81,6 +81,6 @@ class FunctionHandleTests(unittest.TestCase):
}
handle = function_handle.FunctionHandle.FromDict(handle_dict)
- self.assertEquals(len(handle.modules_to_load), 1)
- self.assertEquals(handle.modules_to_load[0].href, '/foo')
- self.assertEquals(handle.function_name, 'Bar')
+ self.assertEqual(len(handle.modules_to_load), 1)
+ self.assertEqual(handle.modules_to_load[0].href, '/foo')
+ self.assertEqual(handle.function_name, 'Bar')
diff --git a/chromium/third_party/catapult/tracing/tracing/mre/json_output_formatter.py b/chromium/third_party/catapult/tracing/tracing/mre/json_output_formatter.py
index aafc8838de3..6d5e86c72da 100644
--- a/chromium/third_party/catapult/tracing/tracing/mre/json_output_formatter.py
+++ b/chromium/third_party/catapult/tracing/tracing/mre/json_output_formatter.py
@@ -13,8 +13,8 @@ class JSONOutputFormatter(output_formatter.OutputFormatter):
super(JSONOutputFormatter, self).__init__(output_file)
self.output_file = output_file
- def Format(self, result_list):
- d = [result.AsDict() for result in result_list]
+ def Format(self, results):
+ d = [result.AsDict() for result in results]
json.dump(d, self.output_file, indent=2)
if hasattr(self.output_file, 'flush'):
self.output_file.flush()
diff --git a/chromium/third_party/catapult/tracing/tracing/mre/local_directory_corpus_driver.py b/chromium/third_party/catapult/tracing/tracing/mre/local_directory_corpus_driver.py
index a235f916baf..ee78dd585ca 100644
--- a/chromium/third_party/catapult/tracing/tracing/mre/local_directory_corpus_driver.py
+++ b/chromium/third_party/catapult/tracing/tracing/mre/local_directory_corpus_driver.py
@@ -66,4 +66,3 @@ class LocalDirectoryCorpusDriver(corpus_driver.CorpusDriver):
trace_handles.append(th)
return trace_handles
-
diff --git a/chromium/third_party/catapult/tracing/tracing/mre/map_single_trace.py b/chromium/third_party/catapult/tracing/tracing/mre/map_single_trace.py
index f035b693758..92a366062ba 100644
--- a/chromium/third_party/catapult/tracing/tracing/mre/map_single_trace.py
+++ b/chromium/third_party/catapult/tracing/tracing/mre/map_single_trace.py
@@ -120,7 +120,7 @@ def MapSingleTrace(trace_handle,
job,
trace_handle.canonical_url,
'Error', 'vinn runtime error while mapping trace.',
- e.message, 'Unknown stack'))
+ str(e), 'Unknown stack'))
return result
stdout = res.stdout
diff --git a/chromium/third_party/catapult/tracing/tracing/mre/map_single_trace_unittest.py b/chromium/third_party/catapult/tracing/tracing/mre/map_single_trace_unittest.py
index 6f0f2f43c5d..3cf0658c943 100644
--- a/chromium/third_party/catapult/tracing/tracing/mre/map_single_trace_unittest.py
+++ b/chromium/third_party/catapult/tracing/tracing/mre/map_single_trace_unittest.py
@@ -51,7 +51,7 @@ class MapSingleTraceTests(unittest.TestCase):
self.assertFalse(result.failures)
r = result.pairs['result']
- self.assertEquals(r['numProcesses'], 1)
+ self.assertEqual(r['numProcesses'], 1)
def testProcessingGiantTrace(self):
@@ -87,7 +87,7 @@ class MapSingleTraceTests(unittest.TestCase):
self.assertFalse(result.failures,
msg='\n'.join(str(f) for f in result.failures))
r = result.pairs['result']
- self.assertEquals(r['numEvents'], 2000000)
+ self.assertEqual(r['numEvents'], 2000000)
@@ -104,8 +104,8 @@ class MapSingleTraceTests(unittest.TestCase):
result = map_single_trace.MapSingleTrace(trace_handle,
_Handle(map_script.filename))
- self.assertEquals(len(result.failures), 1)
- self.assertEquals(len(result.pairs), 0)
+ self.assertEqual(len(result.failures), 1)
+ self.assertEqual(len(result.pairs), 0)
f = result.failures[0]
self.assertIsInstance(f, map_single_trace.TraceImportFailure)
@@ -128,8 +128,8 @@ class MapSingleTraceTests(unittest.TestCase):
result = map_single_trace.MapSingleTrace(trace_handle,
_Handle(map_script.filename))
- self.assertEquals(len(result.failures), 1)
- self.assertEquals(len(result.pairs), 0)
+ self.assertEqual(len(result.failures), 1)
+ self.assertEqual(len(result.pairs), 0)
f = result.failures[0]
self.assertIsInstance(f, map_single_trace.MapFunctionFailure)
@@ -149,8 +149,8 @@ class MapSingleTraceTests(unittest.TestCase):
result = map_single_trace.MapSingleTrace(trace_handle,
_Handle(map_script.filename))
- self.assertEquals(len(result.failures), 1)
- self.assertEquals(len(result.pairs), 0)
+ self.assertEqual(len(result.failures), 1)
+ self.assertEqual(len(result.pairs), 0)
f = result.failures[0]
self.assertIsInstance(f, map_single_trace.FunctionLoadingFailure)
@@ -168,8 +168,8 @@ class MapSingleTraceTests(unittest.TestCase):
result = map_single_trace.MapSingleTrace(trace_handle,
_Handle(map_script.filename))
- self.assertEquals(len(result.failures), 1)
- self.assertEquals(len(result.pairs), 0)
+ self.assertEqual(len(result.failures), 1)
+ self.assertEqual(len(result.pairs), 0)
f = result.failures[0]
self.assertIsInstance(f, failure.Failure)
@@ -188,8 +188,8 @@ class MapSingleTraceTests(unittest.TestCase):
result = map_single_trace.MapSingleTrace(trace_handle,
_Handle(map_script.filename))
- self.assertEquals(len(result.failures), 1)
- self.assertEquals(len(result.pairs), 0)
+ self.assertEqual(len(result.failures), 1)
+ self.assertEqual(len(result.pairs), 0)
f = result.failures[0]
self.assertIsInstance(f, map_single_trace.FunctionNotDefinedFailure)
@@ -211,8 +211,8 @@ class MapSingleTraceTests(unittest.TestCase):
result = map_single_trace.MapSingleTrace(trace_handle,
_Handle(map_script.filename))
- self.assertEquals(len(result.failures), 1)
- self.assertEquals(len(result.pairs), 0)
+ self.assertEqual(len(result.failures), 1)
+ self.assertEqual(len(result.pairs), 0)
f = result.failures[0]
self.assertIsInstance(f, map_single_trace.NoResultsAddedFailure)
@@ -226,7 +226,7 @@ class MapSingleTraceTests(unittest.TestCase):
results.addPair('numProcesses', model.getAllProcesses().length);
};
""")
- self.assertEquals(results['numProcesses'], 2)
+ self.assertEqual(results['numProcesses'], 2)
def testExecuteTraceMappingCodeWithError(self):
test_trace_path = os.path.join(os.path.dirname(__file__), 'test_trace.json')
diff --git a/chromium/third_party/catapult/tracing/tracing/mre/map_traces.py b/chromium/third_party/catapult/tracing/tracing/mre/map_traces.py
index 749e7acab39..b87c76c57f2 100644
--- a/chromium/third_party/catapult/tracing/tracing/mre/map_traces.py
+++ b/chromium/third_party/catapult/tracing/tracing/mre/map_traces.py
@@ -60,8 +60,7 @@ def Main(argv):
results = runner.Run()
if not any(result.failures for result in results):
return 0
- else:
- return 255
+ return 255
finally:
if ofile != sys.stdout:
ofile.close()
diff --git a/chromium/third_party/catapult/tracing/tracing/mre/mre_result.py b/chromium/third_party/catapult/tracing/tracing/mre/mre_result.py
index f3d128e23a8..572b3114ccf 100644
--- a/chromium/third_party/catapult/tracing/tracing/mre/mre_result.py
+++ b/chromium/third_party/catapult/tracing/tracing/mre/mre_result.py
@@ -38,7 +38,7 @@ class MreResult(object):
def AddFailure(self, failure):
if not isinstance(failure, failure_module.Failure):
- raise ValueError('Attempted to add %s as Failure', failure)
+ raise ValueError('Attempted to add %s as Failure' % failure)
self._failures.append(failure)
diff --git a/chromium/third_party/catapult/tracing/tracing/mre/mre_result_unittest.py b/chromium/third_party/catapult/tracing/tracing/mre/mre_result_unittest.py
index 2bdb5a8f19a..88ab596405e 100644
--- a/chromium/third_party/catapult/tracing/tracing/mre/mre_result_unittest.py
+++ b/chromium/third_party/catapult/tracing/tracing/mre/mre_result_unittest.py
@@ -37,8 +37,8 @@ class MreResultTests(unittest.TestCase):
result_dict = result.AsDict()
- self.assertEquals(result_dict['failures'], [failure.AsDict()])
- self.assertEquals(result_dict['pairs'], {'foo': 'bar'})
+ self.assertEqual(result_dict['failures'], [failure.AsDict()])
+ self.assertEqual(result_dict['pairs'], {'foo': 'bar'})
def testAddingNonFailure(self):
result = mre_result.MreResult()
diff --git a/chromium/third_party/catapult/tracing/tracing/mre/threaded_work_queue_unittest.py b/chromium/third_party/catapult/tracing/tracing/mre/threaded_work_queue_unittest.py
index 9bb086e05e0..e4b98a42a28 100644
--- a/chromium/third_party/catapult/tracing/tracing/mre/threaded_work_queue_unittest.py
+++ b/chromium/third_party/catapult/tracing/tracing/mre/threaded_work_queue_unittest.py
@@ -23,7 +23,7 @@ class ThreadedWorkQueueTests(unittest.TestCase):
wq = threaded_work_queue.ThreadedWorkQueue(num_threads=1)
wq.PostAnyThreadTask(Ex)
res = wq.Run()
- self.assertEquals(res, None)
+ self.assertEqual(res, None)
def _RunSimpleDecrementingTest(self, wq):
@@ -39,4 +39,4 @@ class ThreadedWorkQueueTests(unittest.TestCase):
wq.PostAnyThreadTask(Decrement)
res = wq.Run()
- self.assertEquals(res, 314)
+ self.assertEqual(res, 314)
diff --git a/chromium/third_party/catapult/tracing/tracing/proto/histogram_proto.py b/chromium/third_party/catapult/tracing/tracing/proto/histogram_proto.py
index 087454926df..de0eedb8e08 100644
--- a/chromium/third_party/catapult/tracing/tracing/proto/histogram_proto.py
+++ b/chromium/third_party/catapult/tracing/tracing/proto/histogram_proto.py
@@ -2,14 +2,25 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
try:
# Note: from tracing.proto import histogram_pb2 would make more sense here,
# but unfortunately protoc does not generate __init__.py files if you specify
# an out package (at least for the gn proto_library rule).
- import histogram_pb2 # pylint:disable=relative-import
+ import histogram_pb2
HAS_PROTO = True
-except ImportError:
- HAS_PROTO = False
+except ImportError as e:
+ try:
+ # crbug/1234919
+ # Catapult put the generated histogram_pb2.py in the same source folder,
+ # while the others (e.g., webrtc) put it in output path. By default we
+ # try to import from the sys.path. Here allows to try import from the
+ # source folder as well.
+ # TODO(wenbinzhang): Clean up import paths to work consistently.
+ from . import histogram_pb2
+ HAS_PROTO = True
+ except ImportError:
+ HAS_PROTO = False
def _EnsureProto():
@@ -51,14 +62,14 @@ if HAS_PROTO:
histogram_pb2.COUNT: 'count',
histogram_pb2.SIGMA: 'sigma',
}
- UNIT_PROTO_MAP = {v: k for k, v in PROTO_UNIT_MAP.iteritems()}
+ UNIT_PROTO_MAP = {v: k for k, v in PROTO_UNIT_MAP.items()}
PROTO_IMPROVEMENT_DIRECTION_MAP = {
histogram_pb2.BIGGER_IS_BETTER: 'biggerIsBetter',
histogram_pb2.SMALLER_IS_BETTER: 'smallerIsBetter',
}
IMPROVEMENT_DIRECTION_PROTO_MAP = {
- v: k for k, v in PROTO_IMPROVEMENT_DIRECTION_MAP.iteritems()
+ v: k for k, v in PROTO_IMPROVEMENT_DIRECTION_MAP.items()
}
@@ -87,4 +98,3 @@ def ProtoFromUnit(unit):
proto_unit.improvement_direction = IMPROVEMENT_DIRECTION_PROTO_MAP[parts[1]]
return proto_unit
-
diff --git a/chromium/third_party/catapult/tracing/tracing/proto/histogram_proto_unittest.py b/chromium/third_party/catapult/tracing/tracing/proto/histogram_proto_unittest.py
index 0c0edf1a6ac..3bba48eee13 100644
--- a/chromium/third_party/catapult/tracing/tracing/proto/histogram_proto_unittest.py
+++ b/chromium/third_party/catapult/tracing/tracing/proto/histogram_proto_unittest.py
@@ -3,8 +3,16 @@
# found in the LICENSE file.
import unittest
+import sys
+from six.moves import reload_module
-from tracing.proto import histogram_proto
+# Some packages, such as protobuf, clobber the google
+# namespace package. This prevents that.
+# crbug/1233198
+if 'google' in sys.modules:
+ reload_module(sys.modules['google'])
+
+from tracing.proto import histogram_proto# pylint: disable=wrong-import-position
class HistogramProtoUnittest(unittest.TestCase):
diff --git a/chromium/third_party/catapult/tracing/tracing/tests.html b/chromium/third_party/catapult/tracing/tracing/tests.html
index 2851bfae495..b2cb2cfd7b9 100644
--- a/chromium/third_party/catapult/tracing/tracing/tests.html
+++ b/chromium/third_party/catapult/tracing/tracing/tests.html
@@ -14,8 +14,6 @@ found in the LICENSE file.
<!-- WebComponents V0 origin trial token for 127.0.0.1:8003. Expires 1 Feb 2020.
See https://crbug.com/1021137. -->
<meta http-equiv="origin-trial" content="AuwWuUBIJgUHKi5rgEkqYaWR/Rbl/WrQPklxP3Lb9JBLQwdU4ykouPn0hTva5pHumlKNc1TqeZD1GEWo3YXTtQUAAABSeyJvcmlnaW4iOiJodHRwOi8vMTI3LjAuMC4xOjgwMDMiLCJmZWF0dXJlIjoiV2ViQ29tcG9uZW50c1YwIiwiZXhwaXJ5IjoxNjEyMjIzOTk5fQ==">
- <script src="/components/webcomponentsjs/webcomponents.js"></script>
-
<link rel="shortcut icon" href="data:image/x-icon;base64,"
type="image/x-icon">
diff --git a/chromium/third_party/catapult/tracing/tracing/trace_data/__init__.py b/chromium/third_party/catapult/tracing/tracing/trace_data/__init__.py
index bdb1f26b0b7..a22a6ee39a9 100644
--- a/chromium/third_party/catapult/tracing/tracing/trace_data/__init__.py
+++ b/chromium/third_party/catapult/tracing/tracing/trace_data/__init__.py
@@ -1,4 +1,3 @@
# Copyright 2017 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-
diff --git a/chromium/third_party/catapult/tracing/tracing/trace_data/trace_data.py b/chromium/third_party/catapult/tracing/tracing/trace_data/trace_data.py
index e599502c1d4..693f5c110d4 100644
--- a/chromium/third_party/catapult/tracing/tracing/trace_data/trace_data.py
+++ b/chromium/third_party/catapult/tracing/tracing/trace_data/trace_data.py
@@ -6,11 +6,11 @@ from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import collections
+import sys
import gzip
import json
import logging
import os
-import platform
import shutil
import subprocess
import tempfile
@@ -18,6 +18,10 @@ import time
import traceback
import six
+if sys.version_info.major == 3:
+ JSON_FILE_MODE = 'w+'
+else:
+ JSON_FILE_MODE = 'w+b'
try:
StringTypes = six.string_types # pylint: disable=invalid-name
@@ -126,7 +130,7 @@ class TraceDataBuilder(object):
def __exit__(self, *args):
self.CleanUpTraceData()
- def OpenTraceHandleFor(self, part, suffix):
+ def OpenTraceHandleFor(self, part, suffix, mode=None):
"""Open a file handle for writing trace data into it.
Args:
@@ -139,10 +143,16 @@ class TraceDataBuilder(object):
raise TypeError('part must be a TraceDataPart instance')
if self._frozen:
raise RuntimeError('trace data builder is no longer open for writing')
- trace = _TraceItem(
- part_name=part.raw_field_name,
- handle=tempfile.NamedTemporaryFile(
- delete=False, dir=self._temp_dir, suffix=suffix))
+ if mode:
+ trace = _TraceItem(
+ part_name=part.raw_field_name,
+ handle=tempfile.NamedTemporaryFile(
+ mode=mode, delete=False, dir=self._temp_dir, suffix=suffix))
+ else:
+ trace = _TraceItem(
+ part_name=part.raw_field_name,
+ handle=tempfile.NamedTemporaryFile(
+ delete=False, dir=self._temp_dir, suffix=suffix))
self._traces.append(trace)
return trace.handle
@@ -190,7 +200,7 @@ class TraceDataBuilder(object):
suffix = '.json'
else:
raise TypeError('invalid trace data type')
- with self.OpenTraceHandleFor(part, suffix) as handle:
+ with self.OpenTraceHandleFor(part, suffix, JSON_FILE_MODE) as handle:
do_write(data, handle)
def Freeze(self):
@@ -324,14 +334,7 @@ def SerializeAsHtml(trace_files, html_file, trace_title=None):
input_size = sum(os.path.getsize(trace_file) for trace_file in trace_files)
- cmd = []
- if platform.system() == 'Windows':
- version_cmd = ['python', '-c',
- 'import sys\nprint(sys.version_info.major)']
- version = subprocess.check_output(version_cmd)
- if version.strip() == '3':
- raise RuntimeError('trace2html cannot run with python 3.')
- cmd.append('python')
+ cmd = [sys.executable]
cmd.append(_TRACE2HTML_PATH)
cmd.extend(trace_files)
cmd.extend(['--output', html_file])
diff --git a/chromium/third_party/catapult/tracing/tracing/trace_data/trace_data_unittest.py b/chromium/third_party/catapult/tracing/tracing/trace_data/trace_data_unittest.py
index 37874841140..b59bd86e55f 100644
--- a/chromium/third_party/catapult/tracing/tracing/trace_data/trace_data_unittest.py
+++ b/chromium/third_party/catapult/tracing/tracing/trace_data/trace_data_unittest.py
@@ -59,7 +59,8 @@ class TraceDataBuilderTest(unittest.TestCase):
def testAddTraceFileFor(self):
original_data = {'msg': 'The answer is 42'}
- with tempfile.NamedTemporaryFile(delete=False, suffix='.json') as source:
+ with tempfile.NamedTemporaryFile(
+ delete=False, suffix='.json', mode='w+') as source:
json.dump(original_data, source)
with trace_data.TraceDataBuilder() as builder:
builder.AddTraceFileFor(trace_data.CHROME_TRACE_PART, source.name)
@@ -72,7 +73,7 @@ class TraceDataBuilderTest(unittest.TestCase):
original_data = {'msg': 'The answer is 42'}
with trace_data.TraceDataBuilder() as builder:
with builder.OpenTraceHandleFor(
- trace_data.CHROME_TRACE_PART, suffix='.json') as handle:
+ trace_data.CHROME_TRACE_PART, suffix='.json', mode='w+') as handle:
handle.write(json.dumps(original_data))
out_data = builder.AsData().GetTraceFor(trace_data.CHROME_TRACE_PART)
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/analysis/alert_sub_view_test.html b/chromium/third_party/catapult/tracing/tracing/ui/analysis/alert_sub_view_test.html
index 574cf5f0b86..0f639da1572 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/analysis/alert_sub_view_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/analysis/alert_sub_view_test.html
@@ -15,7 +15,8 @@ found in the LICENSE file.
<script>
'use strict';
-tr.b.unittest.testSuite(function() {
+// See https://crbug.com/1143376.
+tr.b.unittest.skippedTestSuite(function() {
const newSliceEx = tr.c.TestUtils.newSliceEx;
test('instantiate', function() {
@@ -47,7 +48,8 @@ tr.b.unittest.testSuite(function() {
assert.lengthOf(columns, 2);
});
- test('instantiate_twoAlertsWithRelatedEvents', function() {
+ // See https://crbug.com/1143376.
+ skipTest('instantiate_twoAlertsWithRelatedEvents', function() {
const slice1 = newSliceEx({title: 'b', start: 0, duration: 0.002});
const slice2 = newSliceEx({title: 'b', start: 1, duration: 0.002});
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/analysis/container_memory_dump_sub_view_test.html b/chromium/third_party/catapult/tracing/tracing/ui/analysis/container_memory_dump_sub_view_test.html
index 974837f545e..92be2bedc27 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/analysis/container_memory_dump_sub_view_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/analysis/container_memory_dump_sub_view_test.html
@@ -300,7 +300,8 @@ tr.b.unittest.testSuite(function() {
}, containerEl);
});
- test('instantiate_differentProcessMemoryDumps', function() {
+ // See https://crbug.com/1143376.
+ skipTest('instantiate_differentProcessMemoryDumps', function() {
const globalMemoryDumps =
tr.ui.analysis.createMultipleTestGlobalMemoryDumps();
// 2 dumps in Process 1, 3 dumps in Process 2, and 1 dump in Process 4
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/analysis/frame_power_usage_chart_test.html b/chromium/third_party/catapult/tracing/tracing/ui/analysis/frame_power_usage_chart_test.html
index 04ba9388852..43772870d97 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/analysis/frame_power_usage_chart_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/analysis/frame_power_usage_chart_test.html
@@ -47,7 +47,8 @@ tr.b.unittest.testSuite(function() {
assert.isUndefined(chart.chart);
});
- test('instantiate_oneFrame', function() {
+ // See https://crbug.com/1143376.
+ skipTest('instantiate_oneFrame', function() {
const series = new tr.model.PowerSeries(new tr.Model().device);
const vSyncTimestamps = [0];
@@ -70,7 +71,8 @@ tr.b.unittest.testSuite(function() {
assert.sameDeepMembers(chart.chart.data, expectedChartData);
});
- test('instantiate_twoFrames', function() {
+ // See https://crbug.com/1143376.
+ skipTest('instantiate_twoFrames', function() {
const series = new tr.model.PowerSeries(new tr.Model().device);
const vSyncTimestamps = [0, 4];
@@ -101,7 +103,8 @@ tr.b.unittest.testSuite(function() {
assert.sameDeepMembers(chart.chart.data, expectedChartData);
});
- test('instantiate_twoFramesDifferentXValues', function() {
+ // See https://crbug.com/1143376.
+ skipTest('instantiate_twoFramesDifferentXValues', function() {
const series = new tr.model.PowerSeries(new tr.Model().device);
// Power samples taken at 0, 1, 2, and 3s after frame start.
@@ -134,7 +137,8 @@ tr.b.unittest.testSuite(function() {
assert.sameDeepMembers(chart.chart.data, expectedChartData);
});
- test('instantiate_samplesBeforeFirstVSync', function() {
+ // See https://crbug.com/1143376.
+ skipTest('instantiate_samplesBeforeFirstVSync', function() {
const series = new tr.model.PowerSeries(new tr.Model().device);
const vSyncTimestamps = [4];
@@ -182,7 +186,8 @@ tr.b.unittest.testSuite(function() {
assert.isUndefined(chart.chart);
});
- test('instantiate_vSyncsAfterLastPowerSample', function() {
+ // See https://crbug.com/1143376.
+ skipTest('instantiate_vSyncsAfterLastPowerSample', function() {
const series = new tr.model.PowerSeries(new tr.Model().device);
const vSyncTimestamps = [0, 4, 8, 12];
@@ -232,8 +237,8 @@ tr.b.unittest.testSuite(function() {
assert.isUndefined(chart.chart);
});
-
- test('instantiate_samplesNotInChronologicalOrder', function() {
+ // See https://crbug.com/1143376.
+ skipTest('instantiate_samplesNotInChronologicalOrder', function() {
const series = new tr.model.PowerSeries(new tr.Model().device);
const vSyncTimestamps = [0, 4];
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/analysis/generic_object_view.html b/chromium/third_party/catapult/tracing/tracing/ui/analysis/generic_object_view.html
index e0c33df1231..969a9871a90 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/analysis/generic_object_view.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/analysis/generic_object_view.html
@@ -95,7 +95,7 @@ Polymer({
if (!(object instanceof Object)) {
const type = typeof object;
if (type !== 'string') {
- return this.appendSimpleText_(label, indent, object, suffix);
+ return this.appendSimpleText_(label, indent, String(object), suffix);
}
let objectReplaced = false;
if ((object[0] === '{' && object[object.length - 1] === '}') ||
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/analysis/generic_object_view_test.html b/chromium/third_party/catapult/tracing/tracing/ui/analysis/generic_object_view_test.html
index 2e7812e2730..cca52ae3ae2 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/analysis/generic_object_view_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/analysis/generic_object_view_test.html
@@ -62,7 +62,8 @@ tr.b.unittest.testSuite(function() {
assert.strictEqual(view.$.content.children.length, 3);
});
- test('booleanValue', function() {
+ // See https://crbug.com/1143376.
+ skipTest('booleanValue', function() {
const view = document.createElement('tr-ui-a-generic-object-view');
view.object = false;
assert.strictEqual(Polymer.dom(view.$.content).textContent, 'false');
@@ -196,7 +197,8 @@ tr.b.unittest.testSuite(function() {
view.$.content, 'tr-v-ui-scalar-span'));
});
- test('scalarValue', function() {
+ // See https://crbug.com/1143376.
+ skipTest('scalarValue', function() {
const view = document.createElement('tr-ui-a-generic-object-view');
view.object =
new tr.b.Scalar(tr.b.Unit.byName.normalizedPercentage, .3);
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/analysis/memory_dump_heap_details_breakdown_view.html b/chromium/third_party/catapult/tracing/tracing/ui/analysis/memory_dump_heap_details_breakdown_view.html
index 9d17e39ce85..15ad35863a1 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/analysis/memory_dump_heap_details_breakdown_view.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/analysis/memory_dump_heap_details_breakdown_view.html
@@ -141,7 +141,7 @@ tr.exportTo('tr.ui.analysis', function() {
if (!this.displayedNode_.parentNode) break;
// Enter the parent node upon pressing backspace.
- const viewEvent = new tr.b.Event('enter-node');
+ const viewEvent = new tr.b.Event('enter-node', true /*bubbles*/);
viewEvent.node = this.displayedNode_.parentNode;
this.dispatchEvent(viewEvent);
keyHandled = true;
@@ -180,7 +180,7 @@ tr.exportTo('tr.ui.analysis', function() {
ready() {
this.$.table.addEventListener('step-into', function(tableEvent) {
- const viewEvent = new tr.b.Event('enter-node');
+ const viewEvent = new tr.b.Event('enter-node', true /*bubbles*/);
viewEvent.node = tableEvent.tableRow;
this.dispatchEvent(viewEvent);
}.bind(this));
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/analysis/multi_event_sub_view_test.html b/chromium/third_party/catapult/tracing/tracing/ui/analysis/multi_event_sub_view_test.html
index 9958b7db81c..edabfc7fe54 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/analysis/multi_event_sub_view_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/analysis/multi_event_sub_view_test.html
@@ -14,7 +14,8 @@ found in the LICENSE file.
<script>
'use strict';
-tr.b.unittest.testSuite(function() {
+// See https://crbug.com/1143376.
+tr.b.unittest.skippedTestSuite(function() {
const Model = tr.Model;
const Thread = tr.model.Thread;
const EventSet = tr.model.EventSet;
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/base/base.html b/chromium/third_party/catapult/tracing/tracing/ui/base/base.html
index e0ca9e23c6b..e24c88c653a 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/base/base.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/base/base.html
@@ -5,6 +5,8 @@ Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
+<link rel="import" href="/tracing/base/base.html" data-suppress-import-order>
+
<link rel="import" href="/tracing/ui/base/polymer_preload.html" data-suppress-import-order>
<!--
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/base/camera_test.html b/chromium/third_party/catapult/tracing/tracing/ui/base/camera_test.html
index 7083856c539..090d8f70743 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/base/camera_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/base/camera_test.html
@@ -11,7 +11,8 @@ found in the LICENSE file.
<script>
'use strict';
-tr.b.unittest.testSuite(function() {
+// See https://crbug.com/1111537
+tr.b.unittest.skippedTestSuite(function() {
function createQuads() {
const quads = [
tr.b.math.Quad.fromXYWH(-500, -500, 30, 30), // 4 corners
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/base/container_that_decorates_its_children_test.html b/chromium/third_party/catapult/tracing/tracing/ui/base/container_that_decorates_its_children_test.html
index 54417b3ded6..72d66adfd15 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/base/container_that_decorates_its_children_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/base/container_that_decorates_its_children_test.html
@@ -45,7 +45,8 @@ tr.b.unittest.testSuite(function() {
assert.isTrue(container.children[2].decorated);
});
- test('clearUsingTextContent', function() {
+ // See https://crbug.com/1111537
+ skipTest('clearUsingTextContent', function() {
const c0 = createChild();
const container = new SimpleContainer();
Polymer.dom(container).appendChild(c0);
@@ -61,7 +62,8 @@ tr.b.unittest.testSuite(function() {
assert.isFalse(c0.decorated);
});
- test('insertNewBefore', function() {
+ // See https://crbug.com/1111537
+ skipTest('insertNewBefore', function() {
const c0 = createChild();
const c1 = createChild();
const container = new SimpleContainer();
@@ -82,7 +84,8 @@ tr.b.unittest.testSuite(function() {
assert.isTrue(c1.decorated);
});
- test('testReplace', function() {
+ // See https://crbug.com/1111537
+ skipTest('testReplace', function() {
const c0 = createChild();
const c1 = createChild();
const container = new SimpleContainer();
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/base/dom_helpers_test.html b/chromium/third_party/catapult/tracing/tracing/ui/base/dom_helpers_test.html
index 46313143710..4f35f0467cd 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/base/dom_helpers_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/base/dom_helpers_test.html
@@ -9,7 +9,7 @@ found in the LICENSE file.
'use strict';
tr.b.unittest.testSuite(function() {
- const THIS_DOC = document.currentScript.ownerDocument;
+ const THIS_DOC = document._currentScript.ownerDocument;
test('simpleSpanAndDiv', function() {
const divEl = tr.ui.b.createDiv({
@@ -145,25 +145,25 @@ tr.b.unittest.testSuite(function() {
let node = tr.ui.b.asHTMLOrTextNode('Hello, World!');
assert.instanceOf(node, Node);
assert.strictEqual(Polymer.dom(node).textContent, 'Hello, World!');
- assert.strictEqual(node.ownerDocument, document);
+ assert.strictEqual(unwrap(node.ownerDocument), document);
// Custom owner document.
node = tr.ui.b.asHTMLOrTextNode('Bye, World!', THIS_DOC);
assert.instanceOf(node, Node);
assert.strictEqual(Polymer.dom(node).textContent, 'Bye, World!');
- assert.strictEqual(node.ownerDocument, THIS_DOC);
+ assert.strictEqual(unwrap(node.ownerDocument), unwrap(THIS_DOC));
});
test('asHTMLOrTextNode_node', function() {
// Node object. Owner document should NOT be modified.
let node = document.createTextNode('Hi', THIS_DOC);
assert.strictEqual(tr.ui.b.asHTMLOrTextNode(node), node);
- assert.strictEqual(node.ownerDocument, document);
+ assert.strictEqual(unwrap(node.ownerDocument), unwrap(document));
// HTMLElement object. Owner document should NOT be modified.
node = THIS_DOC.createElement('div');
assert.strictEqual(tr.ui.b.asHTMLOrTextNode(node), node);
- assert.strictEqual(node.ownerDocument, THIS_DOC);
+ assert.strictEqual(unwrap(node.ownerDocument), unwrap(THIS_DOC));
});
});
</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/base/dropdown_test.html b/chromium/third_party/catapult/tracing/tracing/ui/base/dropdown_test.html
index bdc118a4d09..e0953f00e84 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/base/dropdown_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/base/dropdown_test.html
@@ -27,7 +27,8 @@ tr.b.unittest.testSuite(function() {
elem.dispatchEvent(clickEvent);
}
- test('basic', function() {
+ // See https://crbug.com/1143376.
+ skipTest('basic', function() {
const dd = document.createElement('tr-ui-b-dropdown');
dd.style.marginLeft = '50px';
dd.style.width = '50px';
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/base/hotkey_controller_test.html b/chromium/third_party/catapult/tracing/tracing/ui/base/hotkey_controller_test.html
index cff10cb775c..ab7a018009e 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/base/hotkey_controller_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/base/hotkey_controller_test.html
@@ -11,7 +11,8 @@ found in the LICENSE file.
<script>
'use strict';
-tr.b.unittest.testSuite(function() {
+// See https://crbug.com/1143376.
+tr.b.unittest.skippedTestSuite(function() {
const KeyEventManager = tr.b.KeyEventManager;
function newKeyEvent(eventType, dict) {
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/base/info_bar_group_test.html b/chromium/third_party/catapult/tracing/tracing/ui/base/info_bar_group_test.html
index 304d48ede37..7dc93a60272 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/base/info_bar_group_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/base/info_bar_group_test.html
@@ -21,7 +21,8 @@ tr.b.unittest.testSuite(function() {
this.addHTMLOutput(infoBarGroup);
});
- test('group-populate-then-clear', function() {
+ // See https://crbug.com/1143376.
+ skipTest('group-populate-then-clear', function() {
const infoBarGroup = document.createElement('tr-ui-b-info-bar-group');
infoBarGroup.addMessage(
'Message 1',
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/base/tab_view_test.html b/chromium/third_party/catapult/tracing/tracing/ui/base/tab_view_test.html
index d5e9c19e672..7912b58d344 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/base/tab_view_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/base/tab_view_test.html
@@ -28,7 +28,8 @@ Polymer({
behaviors: [nonSubViewBehavior]
});
-tr.b.unittest.testSuite(function() {
+// See https://crbug.com/1143376.
+tr.b.unittest.skippedTestSuite(function() {
function createPowerSampleSubView() {
const model = tr.c.TestUtils.newModel(function(m) {
m.device.powerSeries = new tr.model.PowerSeries(m.device);
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/base/table_test.html b/chromium/third_party/catapult/tracing/tracing/ui/base/table_test.html
index 73e8aca4418..4f768817c9d 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/base/table_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/base/table_test.html
@@ -1052,7 +1052,8 @@ tr.b.unittest.testSuite(function() {
assert.isFalse(table.getExpandedForTableRow(rows[0]));
});
- test('focus_empty', function() {
+ // See https://crbug.com/1143376.
+ skipTest('focus_empty', function() {
const table = createSimpleOneColumnNestedTable();
table.tableRows = [];
table.emptyValue = 'This table is left intentionally empty';
@@ -1105,7 +1106,8 @@ tr.b.unittest.testSuite(function() {
assert.isUndefined(table.selectedColumnIndex);
});
- test('focus_rows', function() {
+ // See https://crbug.com/1143376.
+ skipTest('focus_rows', function() {
const table = createSimpleOneColumnNestedTable();
table.selectionMode = SelectionMode.ROW;
this.addHTMLOutput(table);
@@ -1165,7 +1167,8 @@ tr.b.unittest.testSuite(function() {
assert.isUndefined(table.selectedColumnIndex);
});
- test('focus_cells', function() {
+ // See https://crbug.com/1143376.
+ skipTest('focus_cells', function() {
const table = createMultiColumnNestedTable();
table.selectionMode = SelectionMode.CELL;
this.addHTMLOutput(table);
@@ -1232,7 +1235,8 @@ tr.b.unittest.testSuite(function() {
assert.strictEqual(table.selectedColumnIndex, 1);
});
- test('focus_allCellsUnselectable', function() {
+ // See https://crbug.com/1143376.
+ skipTest('focus_allCellsUnselectable', function() {
const table = createMultiColumnNestedTable();
table.selectionMode = SelectionMode.CELL;
for (const c of table.tableColumns) {
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/base/utils.html b/chromium/third_party/catapult/tracing/tracing/ui/base/utils.html
index cca1003cc06..87b2f344b1f 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/base/utils.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/base/utils.html
@@ -60,19 +60,7 @@ tr.exportTo('tr.ui.b', function() {
undefined, {minimumFractionDigits: 3, maximumFractionDigits: 3});
}
- /**
- * Returns true if |name| is the name of an unknown HTML element. Registered
- * polymer elements are known, so this returns false. Typos of registered
- * polymer element names are unknown, so this returns true for typos.
- *
- * @return {boolean}
- */
- function isUnknownElementName(name) {
- return document.createElement(name) instanceof HTMLUnknownElement;
- }
-
return {
- isUnknownElementName,
toThreeDigitLocaleString,
instantiateTemplate,
windowRectForElement,
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/base/utils_test.html b/chromium/third_party/catapult/tracing/tracing/ui/base/utils_test.html
index 4ab76e1d221..aa84b3b40df 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/base/utils_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/base/utils_test.html
@@ -37,7 +37,8 @@ Polymer({
tr.b.unittest.testSuite(function() {
const THIS_DOC = document.currentScript.ownerDocument;
- test('instantiateTemplatePolymer', function() {
+ // See https://crbug.com/1143376.
+ skipTest('instantiateTemplatePolymer', function() {
const e = tr.ui.b.instantiateTemplate(
'#instantiate-template-polymer-test',
THIS_DOC);
@@ -45,7 +46,8 @@ tr.b.unittest.testSuite(function() {
assert.strictEqual(e.children[0].testProperty, 'Test');
});
- test('instantiateTemplateMultipleTemplates', function() {
+ // See https://crbug.com/1143376.
+ skipTest('instantiateTemplateMultipleTemplates', function() {
const outerElement = tr.ui.b.instantiateTemplate(
'#multiple-template-test',
THIS_DOC);
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/extras/about_tracing/profiling_view.html b/chromium/third_party/catapult/tracing/tracing/ui/extras/about_tracing/profiling_view.html
index 26d01ad27cf..08c5b67c69f 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/extras/about_tracing/profiling_view.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/extras/about_tracing/profiling_view.html
@@ -45,6 +45,21 @@ x-timeline-view-buttons {
display: flex;
align-items: center;
}
+
+#perfetto-banner-outer {
+ display: flex;
+ align-items: center;
+ flex-direction: column;
+ margin: auto 0;
+}
+
+#perfetto-banner-inner {
+ margin: auto 0;
+}
+
+#perfetto-logo-caption {
+ margin: 50px;
+}
</style>
<template id="profiling-view-template">
@@ -55,7 +70,18 @@ x-timeline-view-buttons {
<button id="load-button">Load</button>
</x-timeline-view-buttons>
<tr-ui-timeline-view>
- <track-view-container id='track_view_container'></track-view-container>
+ <track-view-container id='track_view_container'>
+ <div id="perfetto-banner-outer">
+ <div id="perfetto-banner-inner">
+ <img
+ src="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAYAAAAGACAYAAACkx7W/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAPFAAADxQAR7ikNUAAFRNSURBVHhe7d0HnFTV1QDwc9+07R3YpS3sLp1dQEQRwbVhi12JxliiUSxRY0k0lphioolfNDEmJDY0dkWNxh4rsCCIWFhYKVtgpe0C23dnp737nfvmYihbZmfezLz35vx/v2HevUPbmTf33H4ZEGIS06dPd+x2p+XaOE9ndp4OqprBwZbDFDUPVMjjCssFzvMYgzzgLAMYd3JgLgDuBGBOfM3FxHMwLfMF5sFrLz57OeN4zfBaS3uYeObgAcZa8c/v4YztYRx249+9m6vKHoWpIq+d+1k7OHytI7KdTYsXL/YH/15CjI0CADEKVlY2N6UDOlKZ35nBbYFCRWWjVAZFWAiPw5fHYeE8Cn+fAwtkGxbyCubhwwi4yjkLYFBQMeHDAFGHQWE943yDCrxO4bY6BrZ61dbd3glpnQ1r3u8Sf0j7o4TEEQUAEhfDZ85Mdna4JjGmTuUcDsPy8FDMHow17Qy8KdPw2mr3Jv6Y0I6/tuF1IwawVZixEp/XeFL9VVtXrHAHfxshsUMBgESVVtB3uYpB9Y/B261UPPCmK8PacjFe2+RvS2yc+/GbuIkDW4upNQzYGvAHajyZgVoKDCSaKAAQ/cybZyvZtCOH+5USUPiRwOEErPXOZJynYM2eCvuB4DyAAaGTAV+GqQ8Y48sVj71648bBzQCLAsHfREhkKACQiIwfPyPX50g+Eph6LHB2DBb6hXhXZcqXiZ44b8FAugXf448wOHzgZ+qn9ZUVGBAICQ8FADIgRdOPz2R+7yGgqidiIXQi3kBTMJvuo/jg6Et889/Gxweqy/1V7erVrfI1QvpFX1zSp5KSk1wsuWOYCuxYzuEcvGGOwrsmGV+ie8dY8OPhndg6+Biv/21jsNgRaNpaVVXlDb5MyMHoS0x68CulaNKHR4DCzsPEKViojGQMHMHXiBlwAK+YjopX7zDGX6yuXLYymE3I/1AAIJrCwvIkWyYcCqp6NpYT8xhjw+VLxAo438wZvAwqvJbEm1ZRy4AIFAAS2JCyuakprHsSC8D5mLwQa/m5+GyQxVUkSlSMBo3YFHiGq8pLvnTvWppqmrgoACSg4ilHToIAuwJrhGcz0Gr6dB8kJLGCGbYAY68GVPb4lnVLvpEvkARBX/wEMXZ6eZ7fq56KX/r5WOjPxCz67Mm+VGwVLGUqf9wR8Ly9fv2qPTKfWBgVAhY2ceJEZ7eSVQagXIXJ8xljqcFXCOkdBoJ2/OVpRWGPOf2719F4gXVRALCgkpLDMniy6yJs3l/NgI+nVbgkLJwH8N5Zh1cPpbKk59eseb8z+AKxCgoAFqL17XPlCiz4L8MPNl1mExIxbBWITewe44w/XLemYmMwl5gdBQCTE3vkt3hSD+XAb8Ov6cmMMbt8iRDdYSAQ6wveVBR+39Bs22o6+8DcKACYFyuePPsM/EL+kjGYikmavkliJ7hZ3SrO+e/r1lW8JXKCLxAzoQBgMiNLZ2c7GZzPVfZT/PTGyezEgHerLYmBLVkBJZmBPUUBezo+p2Ma8xUXvoZvjnhWenj2tahQ+/cW+Zftb/5x9XDeEdvB7bVBNz7cPkW7dnv3PtugtcsOTR0O2NPh1J7b3Hbo6LZDOz46um3g9SdmDMaSv0pR4QHweBZVV38muoqISVAAMAlR8Nu5chGAijV+liezLUUMVe8tsJ05NnDm4mOQDVx5NnBkicJeCZ4goDDAVs+A715vUwBq/tJzALj2xM1w+THfylRoOJZ8Ac5AVfGB100YGGobU7RH/e4k2NqUDNubXdCOgUIEEA8GFStXk/H92KUw9mtwdz9DgcAcKAAYXLCPP+VKYPx2/LgKZLb54Z3nxII9ucAOriFYyOfbsdBXgrV7rM1Ho0NL7wAQChEkOj02raXQ2OaENfUZsPbbdNi4IxU270rGwGHJr2A9/tz3ZLu6Fq5evdon84gBUQAwqLKyuamd3H0BfpFuxxq/OAvXtLQafTbW5gdjgT/UDknDbJCEBb7Ij6V4BIC+iBZBdUMKBoM02IABYcP2VKjblQItndbYd48Dr2aM3+1JCSyi7SaMiQKAwWgFP3SdA1y5G5Mjg7nmIWruthRFq9WnFjsgtcihdeModrzV4ny3GS0AHEi0FnwBBYNAMny6MRu+2JypBYVmDAgmHl8QvV71Kqi3dzu7X9uxerU4EJ8YBAUAAykqPfJk/Ej+yoCVyCxTYFi4J4+wQ9oYBz6c4MhWtL58ozF6AOiJKPh3tTmh8tt0+KQqFz7dlK0NRpsQxwBXxRm/oa6y4gOZR+KMAoABjJk4a6pqs4ka/6nBHGMTBX5S/v9q+KLwF3lGZ8YAcCAxZrBuaxos25ANn9VkYQshTRtjMBNsErxmU9ntm2jzubijABBHRWVHDAZuvxO/EVcZ/cAVWzIW+sPskD7BCRkTnVo3j9nuHisEgH2JLiO3zwarMBB8vC4XVlRnQWOr0yQDy7ybA1ug2Pgfqr+q2CUzSYxRAIiD8vJy+9Y9gavx+3uXkad0ikI/bSwW+GUuSB5u19JmZrUAcCAxqCxmF73xxRD4cG0e7Okww2Ayb2Aqu6N6Xf6TAIsCMpPECAWA2FJGl84+lnG4Dwv+aTLPUEQhn1rigMxSF6SOcQbn3VuE1QPAvgIqg89rM7VAIMYNvt2TJF8xKr4KVOXWmnVLPhGJYB6JNgoAMVI4sTzfbgv8CS9/gG+7oaZ0iAFbUcPPnOaC9IlOUBzWvC0SKQDsyx9gULUtDV78dCgs25ht4GmmPMA5PKHY4XbqFooN2iY4+pTiSXO+r9j461jwH4EPw5SuYqpmXnkKFJyaCtmHJ2lz85nNunWCgJtD84pumdrfYSUtcMhoay5eVbC6MSTTC8dN3gNnH7YTiod0QWObS3sYC1OwZXwI1v8vyhpUuLllV/16+QKJEmoBRNGY0tlFAQ4P4E19OiYN8V6LVbaiXz/7sCRIGZlYG4cmagugNzUNKfDa5/nw4dpc2N5suC4i0Q30Ig+ot9ZWLasPZhG9UQsgCgoLy5MGjRwxXwV4BQv/MsyKb+GP/7rYWyd3djIMPTcdMstc4Mg07cKisCVqC6A3OWk+mDW2Gc47YgeMHdoJO1qStP2MDDKLSPwnJoMCV+QMGbmnIC+tcteuXTRIrDMKADobVTprnN0F/8H79woGLO5tbDFXv+D0NBg8NwVSRjuCK3ITFAWAnokuoqLBXXDm9AY4euIe6PTYoa4xBbgBAgF+h5z466l+llyeN2TkkqbG+mb5EtEBBQCdiE3bknKKr1QYW4Q37WjMitu3RwzqZk5xabX93FnJ2j48TEncgn8vCgB9E6NTeek+OH7ybjgDg4HTrmqtArGRXZxhQ5oVYov6xzlDCnc1N9Z/hXk0U0gHFAB0MGbKzGFdvqTnFYVdH89avy2FQfb0JBh2XrCbx56aeN08faEAELq0pAAcju/JvMN3wKAML2zelaJtax1PwdYAnJY9pHBK1uCST1oa6+iM4ghRAIhQ0eSjTsFb8y2soUzFZFyq2WJgN++oZBh6VhqkT3IZch8eI6AAMHB2G4fJIzq02UOjBrnhm23p8W4RiIbKeMYCP8wdPGpNU+OWWplPwkABIEwlJYdlZA8ruo8B/zPekhkyO6bEQG5eeTIMOzcdUkucVPD3gwJA+EQgGFvQCefN3AFDsz2wrSkJmjpFhTxeWDoH/oOsISNTkkeUfdqxYyOdOxAGCgADx8ZMmTVVtTvewuL2NCz8Y97PYkvFgl/U+M9Ng9TRDlNsxGYEFAAiZ1M4TBiGLYLDd2oDxzWNKdAap4Vl2OoWZ8PNdvi7z8gaPHJZS2N9g3yJhIgCwMCwkrLZV3FVeQnboUNlXsyIbRnEoO6weWnatstWXrQVDRQA9CPmFJTkd8FZMxqgAFsEX2/JgG5fnIoTxgYDg4ty8kdta27Y8rXMJSGgABAicVBL2uChD+LddhfebDGt8ogavpjVM/y8DMiYbN2tGqKNAoD+7LJFcA62CER9pKYxVduULtaCA8T89Jwhhbkj8sctbWiopS6hEFAACEHxxPISL/O+izeZ2K8/ZqWv6FwSq3ZH/CAdsqYnmX43znijABA9LruqvYdi+qiYLbR5dzL4A7EOBFp37OFe7j82Z1Dhf5t31dMH2o/Yh2qTGV06+3huU1dg4S9m+cSMWLk74uIMGHFBunZ4OiFmIFYX//KcTfDi9V/CEWPis2aLMZgJCl85uvSoOTKL9IJKll6IhV3JecU/YxwWMsbSZHbU2bQpnSkw7Jy0YMFPlX7dUAsgNsQtm5nih+9Na4TCQd2wfntaHNYQsHTg/KKsISM7WhrrP8MMWjjWAwoAPRg/fkZuJ096Fgv+n+AjJu+RaLyK07ZGXJgBaeNogDcaKADoREnC4tQvE70TE/bH5HfCuYftBL+qwIYdqTHtFpKzhE7IHjxyfPaIse8376j1yJeIRF1ABxg5fk6Bz5H0Id48MdvBU9T0R16SAcPPSwd7On0kxMAUF0DKBJkIjcuhwg0n18Gz134F00e3ytyYwa8yOw883R+LMzlkHpGotNlH0eRZh9rtXDQXpwRzokvM7smdkwxFP8nUNmqj7h5ibHiDDv4BgHujTA+MWDfw+JVr4LfzNkJuWmwn6WAQmGZT1GVFZeWTZRZBFACkkklHnsbAthhvlOEyK6qShtph9JWZ2i6d1N1DTCHnJAC1GyAQ2RY8p09vgEU3rIZjJ+3WFpbFCmNQxNTA0tGTj5orsxIeBQC8L0pKZ1+jKmwRVnBSZF7UiL7+QcemwKjLM7QTuQgxBWc+8OHXAux6RWZERswWuv/Cb+APP1gP6cn9jyfohrEsxtQ3ikvnXC5zElpCl0ATJ050ZuSP/z3eFb9jwKK+uEucuzv8gnTIKHXR9sxxQIPAYVKSgU96CdiOxwE618rMyIlBYnE85WmHNMKO5iSo2xX1+pcGv+t2AP697MGFvGzC6OVbtmxR5UsJJ2EDQMH06SmMZzyJN8OVmIxqaSz6+gcdnQIFZ6aBI4MaXfFCASAcDPioX2PtpQhYza0yT1+prgDMLd0NJRgMVtVmxWhLCXH+MBzd6uZFSSMGvdexY0dCrhxOyNJo3LhZ6cnelLew8D9PZkWNI0uBwssyIO/oZG0vH0JMJedEgKFXAqu9AxPR668XrYHjMQg8f92XMG1UzAKx+GcvTPGkvFxScpLRTsiPiYQLAGOnl+f5Hba38YM/WmZFTcYkJ4y+Okvr+iHEdFzDgI/9O0Dbp/hYLjOjKz/LA4/NXwPzj60Hhy1GA8QMTubJHW8UTT8+U+YkjIQKACVTZw8KeNV38AOfLbOiQhzQIs7hHfb9dNq/h5iTLRX4hKcB7FnA6rD2z2PXTS5mBl1zwhZ4+PJKKMCAEBtsLvN0/1eUETIjISRMABg3bdZQNQCL8fLQYE50OAfZYNQVmZB1KLYoqewnJsULbwdIx69K03sAHZUyN7YOGd0KL1z/BRwzcY/MiTLGDlP98N7wiTNzZI7lJUQAGFM6u8jvUz5hwAa2hHEgsLDPnOaC0fMzwYVBgBDTyj0FYOhPtO0e2JZ7MCN+2+iIPYXEdNGfnlSnHVIfbWLBmEuxf1JSWh6T9UDxZvkAMLps9lgV2Ef4yY6RWboT+/Pnfy8Vhp6ZBoqLqv3ExFzDgY9dgCUhFg2Nz+s67TNcisLh0qO3woLL1kJeulfmRhFjpZyrFWIbeJljWZYOAKLwx3vnE7wsDOboT/Txj7gwHbIPS9JaAYSYlpIk+/1zAALtWPu/V75gDIcWtcJT13ytbTAXdQzLDEV93+otAcsGANHto3D2X/wkC2SW7rTtHK6S+/gQYmpYexl1F0D69GCy4VkAz9bgtYEMze6GJ6/+Gk6Z2ihzoojBKGwJfGDlIGDJAKAN+HJ4Fy+jU/PH74pYzSu2c3BkU38/sYC804APvSZ47dsj+/6NSSwc+/15G+Dnp9ZGf1yAwTgMAh+KXYJljqVYLgCIaVw+v/JBtPr8Rdfo4ONTYOg5adoKX0JMzzUU+JiHgjc3YjsXAvhbtGujEiu4fjh7G/z5oipIdgZkbpQwGGu387fEAlKZYxmWCgBikRcPsLejNdtHcTIYenaatoWz/K4QYm7afP9nAOzZwTTW/mHrX4PXJnDkuGZYeOWaqK8XELOD/A7bW1ZbLGaZYkxE54BH/TdeRmWevzbY+8N0yChLyBXjxJIU4Fq//96vDA92/fhjfmhLRCYM64AnrorB4DCDOeD1vG6lloAlAoDY2M3ntP0HP6CorPB1ZCpQeDkN9hKLEfP9C8ReiFL3luDgrwnt3UJiRlF0gxcDKPc7lRfKy8stsb+L6QOA2NI52Zu8ED+YqOztk1Rgh8IraHEXsZikkfv1+wus/g8AapdMmY9YNLbgx5Vw2vQGUVBHETtla5P6iBWCgNkDAPPYcn8brV09U4sc2k6etIUzsRRbWrDf35ErM1BnJUDjSzJhXmIDuauOq4cUV5QHhgF+VN+k3onPpp4JYuqSraR09tX49PNgSl8Zk53aAi9a2Uusho/6FUDaVJkKYvX3a1s/mF1ThwN+8sRk6PREvcUu2k6/LC6d82OZNiXTBgBxhq8K8ABe6v4ziDn+Q89Np2mexHryzgAouEImpI4vAXaL+RPmtqPFBZc9PAU270qWOVGnAIcHi8rmHCvTpmPKAFA0edahnCkvMGD6TsnB8l5s6DZMzPE3dduIkB4kFQIf87dg3XUv7gNW8wtxEUyblCj8r3ikLJaFfxCDFMZhUVHZEZNljqmYrpgLrshT/i3eeJmlm6zpSVBwRppJwyLZiwcAAl0q+FpU8DQEoKveDx2bfNCJj4SlpMj5/gdMY29dBtC+UibMSXT7XP14KWxtSpI5PYviiG0OqLZ3zLha2FR9HOPHz8j1OZI+xMspwRz9ZM3Awv/UVJO9I4lHnOvrb8fCvRUfTYHgNT7Ec/DBtcJ/oK49cTNcfsy3MnWw1bWZ8HTFMBiS6YH8TK/2PBgfg9K9kJfh1bYnMC68qYvvAz50nymfgqj9f3UsQMfXMsN8RM1fFP591fzFaMBl6T4YZudwT4sTvFFq7HAOK5JUZW5V1eIOmWV4pinupk+f7mj2JL/MGDtdZukD34GcmUkw5CQq/A0Dv6ABDxbknSp07wjgww+enfjc4MfCHV9Uue4HVPUXAD5cmwc3P3PwAnNxepUdHyIIjCvogDEFXcHn/E7ITvVjYPBr2xbE1aCzgY9biPf3AU3b3a8B++YSvDBn98/ebp++av6i8L8CC/8z8LMQH8Oybhv8sTV6QQDfyhdqcpWLYPFiU4yom6bIKyqdfQsD9ge81PX/nH14EuSfjIU/dfvElai9d23xg7vep3XZiBq+VpOPUdkUbgDojQgMYl56PrYSpo5qgxlFLTClsA1y0mLcDeUaAfyQ5Qd3/WAEZV/MBOhaLzPMRXT7hDLgKwr/s2Xhv9diEQSwJRCdbeS4ii2BG2vXVphiPw1TBIDRpbOPZxzewdq/rt14mWUubVM384RBi8BC3duMNfrtAeiq80EnPry749uFoncA6IloCYwa1AVTMRBMw6AwZWQbjMhzgxKt+0/M9y97+6Apn5qdTwHbdK1MmMtAun3OwcK/J++57fDXVgdE467jnPsZV06oWbfkY5llWIYv+sSpPNymrsD/6D6rViKXNs4Jw89PB0YLfGMi0M21Adn2bzzQvs6r1fhjeM54v2IRAA4kWgmDMrxw3OTdcNT4JhhX0AmZqT59vpRMAV78J4CCy2XGPvytWPs/HMCzXWaYRzjdPr15q8sOC9qiFQRgu8MRmLHhy+WGfpMNXfyVlc1N9TLvuwxYkczSRcooBwy/IB0UmucfVaqXQ8cGH+z6sAsa3+uC5pXd4P7WD6oHmwAG63Y+rKQFDhndJlMHq2tMgf+uGSRT+uCcQUe3HSrrM+DNL4bAK6vy4fPaLG1MYWi2Bxz2CN6kvDOx6fwbvOjhHt/xOLDdr8mEeYhun/mPlkH9nr67fS7Hwv+sfgp/YYxDhRT8Tau9+heD2NpLVwPK4bkZE59raqo27AwBIwcAljZ46INY+J8q07pIHmaHkRdnaFs7E/2Jwr2j2ge7P+qCHa91QtsaD3h3BYD7DFbiHyAeAeBAXr8C32Lh9gG2NsSMo7XfpoOKQUK0EpKdA2guJY0GPukFbernQcRhL99cjB9Ut8wwB1HzF4V/f90+ovAX3T6hfLvF75mA76uKV2u9URgEZDASHL6M5sb692SO4Rg1ALCSstlX4dNd4jqYFTmxodvISzLAlkwjvnpSsXAX/fl7Frth+2sd0PqVBzyNWOkxUBdPf4wQAPYVUBls2Z0CH63LgxeWD4XqhlRtUDk71dd3y8CWDrz039qirx5tfRBY8/syYQ57u336qvmLgkx0+4RS8z9QKQaBnQEF6jAAR8FhOUMKt2EQ+EKmDcWQAWDMlFlTuaq8hJ+kbvsv2zMUKLwsE+zpVPjrRdT2RbfO9n93QtNyNwYBv7YIy4yMFgD2JYJBDQYA0U30H3y0dDqgaHBXj2sPePF9ADknytQB/E3A1l+Kv8krM4xP726fnog/cyi+l9/4bNAQ0K2+uRfDcH10zrDRLzfv3NIk8wzDcAGgpOSwDNXueIsxGCqzIqYkYVvswgza0lkPeDe7t/lh9ydu2PFqB3Rs9IHabezunVAYOQDsq8tjgy83Z2KrYBhs2pkKGckBbS98RdRrBp0DMPpXeNFTIcaB1d4J0LZCpo0vGt0+vRHDgbOSVFjtVaAZA66e8G9zgaoekVo09Jm2rVsNtT7AcNVhnuy6G9+wSTIZMbH2peD0NEgaZonzG+JGdPOI2Tt1/2iFzY+2Qsvn3VoeiQ8f1lTfr8yDqxdOhrMeOBSWbjkU+Bgx9byXr7S7xlSHvezt9umv8N87z18PqVhX/1WWF/Js0biv2Qxnp/23MmEYhgoARZOPOgU4/4lMRg4jyaDjU7StnUl4eIBD65ceqFvQCltfbIfunfhlo3LfMDh+Fru7smDIzIVYIvZ+UiGr/yNGcbdMGVuoe/uIef79TfUcqMFY+P8Gg0Cyvo0ADcaXG4vL5vTSPxcfhgkAY6bMHMaY+jgw/WbmZ01zQe6Rffcdkp6JefvNn3VDzYMtsP3fHeDdY9LOfYtjjMFN1/4YxpSMkjk9EIe97HpFJoxN1Pz7W+G7t+YfabdPb4odKtyOQcCh918uyjaV/2P4xJk5MifuDBEAxD4/gYDjMXyH8mVWxMRpXvmn0SrfgRJz97WC/y/NsPPNTm1HTWJcJ889Gs4542SZ6lnrenMc9hKPbp/ezHAF4NI0nRbl7Yux0S7F/ijMm6dbRTcShggATd3Jl2NFRremkSNLgWHfp1W+A8IB2tYGu3pEwa9tukYMbfiwfLj9Z9dorYDerP1mI5x520549KOR2joDo4pnt09vxL8zOykKLV8GZxat33mhTMVV3O+IUaWzxjEF7sNLXT5TcYSjWOVrE0v8SP+wnBd75dc90grbXuoAbxN19ZhBamoK3H/Pndpzb/x+Pzzw0GPQ0mmDv/+3EM64/1B468vB4Nd/qmNEjNDt0xPxb/400wej7Hq3gsXUFP43UfbJjLiJawAoLCxPsoHyFAOWJrMiIt7W/FNSISmfZvyEQmzA9u2z7fDtM23Qvc34XQQkSFEUuPm6y2FsyWiZ07PPVn8NX62pkiksaJtdcOdL4+CHf58Kq+sytVXG8Wakbp+epDEOv872Qoaib4tYlHk2riyId1dQXAOAIyNwGb4VM2QyYplTXdqD9E0s1tr1URfU/bMVOjZ6tVYAMY8TjzsKzjz1BJnqmd8fgD//faHYmVLmBInkhu1pMP/RUrjt+XHaorJ4MWK3T0/ybRx+hi0B3QtLxo4p+mbHxTIVF3ELAGNKZxdhw+qPeKnL5ypq/UOw9h+3u8QM8Mvfvt4LtX9r0RZyiQFfYi6FI4b12+8vfLzkU6ip3SJTBxOri99bMwjOvH86vLyyIObjA0bt9unNYa4A/FD/QWH8FNkf4nmUZLzeV6Vo8uxX8SY+Q6YjYktVYPT8THBkx7VBY2j+DhUa3u6EtnVU4+/JnPFNMGtss0wdbMOONHht1RCZio+0tFR48p9/guLRI2VOz0Tt//sX/wTqtvS+vfWBJgzrgN+cuxHGFHRGvVDY2+2jx5bOseTH782vW5zwuUf3XptXayqXzsPnmE+5i8t7WzxpznnY9ngeLyP/97HMF/v6p4+nxV69aVvrhYa3OsHfSVM6zUp8Ue667QY489S5wYw+vPqfd+HuPz4kU6FLcqhw6dHfauciiLMKokF0+4R7kpcRtGHL6crdLr23i+AM+PerKytelumYifkAROHE8nzFxl/HS10GfnMOT4KcI/q+mRKVOHRlx386YffHXbRtg8l978Rj4OrLL+y366e9oxNu/eUfoLNr4Kt+/VioifMIlm/MhknD2yEPC2E9iZp/rPb2iRYX/qdG2rl2rKSO3ygs/+Gw7BFjn2zeUeuReTER6wCg5OWP+Af+vEfIdERcg20w/Lx0YFE7U8+k8M5s3+CFb5+i2T1WMGrkcPjLfb8Cp6P/AdsXFr0BHy5eLlPhaWxzwRurh4ALWwQTh3Xq0hrY2+0TrS2dY2kYBoAOrLOv9+nY5cxYFvj9ec2N9W/KnJiI6fsszvbFt+w9/GcjfucUB4NR8zPBNSTmjRhDE8csNr7XqW3TbKQjF0l4UlKS4elHHoCifvr9heaWVjj9vCugA1sBepk5phnuPX+Ddg5BuMze7dMTN8bEG/e4YLOOg+ccuNfG4KhNaypWyqyo0zGE9a28vNzOuFjwFXnhL+Qdk0yF/wE8uwKw5bFWaPqUCn8rEPP9f/7T+SEV/sKLr7ypa+EvrNiUDd9/8BCo2BDe9jVmm+0TKrFZ3B1ZXu1ISb0wYM6ACgtEWSmzoi5mJag9fcRPGGOXyWREtH1+Tk0Tc6iIgLWR1koPbH22nfbusZDTTj4OrvrxD/vt9xeamlvgF3f9EXx+/bv8xBkE7349CDxY2502qi3kLiErdfv0JBOrsln4A6zUcVYQftYFrV18R3Nj/ecyK6pi0gIoKjtiMN4y4njHiImzfPPPSNWpHWF+YlFXw7udsP2VDhrotRAx3//Wm64KqfAXFjzyNHS5o3fOr1g1vPCTEXDDUxOh3d1/BdUsi7wiNTfZD4f0cDJbZPgdZWVzU2UiqmJTjHL7nXgj58lU2LStHk5NBWd2zBouhiamdW59rk3r8tFzSgKJr/S0VLj/njsgJbnvPvO9ttRvg7f++7FMRZeYIXT+Q9Og8tvezx6wardPT0QBem2GTztMRi9YVg7vVN3iaLeoi3oAGDNx1lQsnK6SyYikjnFC5hTa6kHwNARgy6Ot2kZuxDpEv/8tN14JxUW9HOp+ALHVwz8efwa6u2M3e3Ab1urFdE5xItkBO0181+0TSuEfj719oqHAxuHSdH1/Fs7YVcUTy0tkMmqiHgBUm+1ubMVGvOGIONe34DTa6kEQ2zlsfqwVvE3U3281Yr7/9048Vqb6t2FTLXzw8TKZih23V4HbXhgPj38yQuYkTrdPT05J8cMUp37fR3xv0rkSuF8moyaqfSlFpUeezID9RiYjMujYFEjDFkCiE2fxisPYTXC+BxmgolEj4P577wSnM/T60r33/wNq6+plKrbEuMBnNVnQ0OqCUYPccPXCUlMv8oqE+HnGODj8120HvUYEGGPjcvILVzQ31NfILN1F7XMQgxgd3P0VBoCImzFJBXYYdWVmQg/8isHe3Z90we4lburvt6CM9DT41yP3a4u+QvV15Tdw6dU/P2jHz3hw2Lh2UH1vxAraq7DwPwlrylYr/Pf1UqcdFrbrt8MqfrZfZrvch69evToqfb1RK1I7oescPQp/ZmdQcFZiz/oRhf/O/3RQ4W9RYqaP6PcfSOHvF4e9/O0xQxT+Ql+Fv/jq3prphZMtXvgLZ+DPqOcBMnhvTG3yJp8pk7qLSrGqTWHiyt0yGZHsGa6EPuBFTO3ctqgdWr70UOFvUaedcjyccsIxMhWazz7/GirXbZAp4xI1/zuzvDArGkcrGpD4eW/K9OnZt84Uzu4Sh2fJtK6iEgA6ufsCfApt+WIfnDk2GHx870feWZ3azbXFXe1VXplDrKZ4dCHcdtPVIc/3F7w+H9z/kHFq/70RheHtCVT47zXWoWpdXbphMMmWEThLpnSlewCYPn26A+/L22UyIoOw8GcOqzcae6Z6OHz7XDt01tI0T6tK0871vR2SkgY2tVkc9jKQvf7jQRQsP8v0wuG6L5Iyhx+k+iFJv6JL7BZ6jyhbZVo3ugeAFk/KlVibGSWTYUspdEDG5MSc9aPV/J9vh67NVPhblZjvfyvW/AsH0O8viL7/hx9/ztC1fycWfKLwn5NgNf995dk4XJSm3/dXlKnNnhRdttLZl64BYGTp7GxgPOLavxj4FSt+E1HAzaH+X21U87c4cbCLmPM/UOKwFyPX/kXhfzMW/scmJ27hv5dYGzDcrmOgZvxneo8F6BoA7Fy5CP+XEZ9vKWr+ibjTpxjwFTV/N+3hb2lFo0bCz3565YD6/QVx2Mtj/3pRpoxHFCY3ZHihPIFr/vsSO4aKqa96EbMqbenqJTKpC90CgFb7B/WXMhk2G75rg09IvIFfMdVTLPCibh9ry8hIgz/dcwckD7DfX3jl9Xdg1+4mmTKWvd0+VPPf36GuAMzUdxzkFj03itMtAOANcD7WaCLe8C378CSwp+naMDE8rfB/rSN4YDuxLJtNgdtuvgZGFw6s31/Y09QCjz35gkwZC3X79E1sfaHXXBZsNBZ1Btxny2TE9CppGVfZT+V12ETBnzs7tB0QLYMDNL7bCa1fx/QoUBIHp58yF0487iiZGpgXX3kjrHN+o22g3T7bAgwSbddycYbw8Ul6Tgtld4hfg4nI6BIAiifPPgP/O+NkMjz44ww+KUXb7z+RNK3ohqbPorePOzGGMcWjtNO9BtrvL+xpaoZnX3pdpoxjoN0+1T4Fbtrjgr+0OSHRtjE8L03HaaFY1haXHnWaTEUk4gCgzfsHiLjv3zXIBhkTE2vap9jVs+G9Tlrha3GZGelw/z13QnLywCdwiOmef3v4KegyWO1/oN0+ovC/tdkJrSqDj9w2eLLdkVBBIN/G4YRk/VoBeF/cgE8Rl98R/wUtntRDsVIzVSbDlleerE3/TBTdO/zaKV4JVxVKMKLGf/vProERw8ObHFf/7XZ45/1PZMoYBtrts9nP4A4s/Dux8BdEfeflTju825VYW7xciK0AMTNIDwz4nOIpR06QybBFHAA48NvwvxPR3yOmfKZPSpyDXnyt4iSvdm21L7G2s047EeYeO0emBm7BY0+Dx2OcyQHhdPvc2uTSav77EvWev7c54CtvxEWQaWQoXDv7WBeM2bnKIu55iejdxwg0CUPAyTIZNjHwmyi7fXI/h20vtWtBgFjb2JLR2i6f4fT7C+u+2QgffrJcpuIvnG6fX8hun56Iv+W+Fifs7mMnUas5LcUPqfr9uN8bNeGI0I6O60VkxS5XrsCbO6J2nDPXBhmlCVL7xwr/zre6wP0tLfSyuvT04Hx/lzP8cS2x6CsQCK2wjQWxzfGRIc5p3yK7fTp6Kfz3asLXf4dBwJsgjeFsbAWIA3H0wIClKXbbtTIZlrADQEnJYRmcQ2R7U+C9MXhuSsLU/sVUz5YvaMaP1dlstmC//7DwF8WLw14+WbpCpoxhI9bo78HCur+eS1Hzv6WHbp/erMffv6DNmTBzIb6HrQDRHaQPdqUoi2ViwMIuenmy6yL8eNNlMiyuwTZIG5cYM3+6d/phx39oxk8iOPv0E8Oe7y/4fH74vwcfkSljWe6xaTX27l7u45p+un16867bBq8nyKBwJhb+J+m0aE6UwWqS6wcyOWBhBYCJEyc6sfZ/tUyGTev7T4Atf8QeP9sXiXN8qfS3ujHFo+Hm6y4Pu99fWPn5l1C1fpNMGc8qDAKiJXBgR4bo9rk9hG6f3vyr3QH1/sToDjg71a+NqegBb7WL8CmsNy6sP9StZJUx4ONlMiyOLAUyJlu/75+rADte7wTPLuP05ZLoyMrMgD/dczu4XOHf116vD/7y94WGP+zlMwwCv8fCfm93kKj5D6Tbpydu/Lv+0OLQnq0uC1sBx+u0LgDvlcNHl80O6/jdMMOtchWGnYjq7lmHJCVE7b99nRfaKmmbB6sT/f53/PxaGDl8qMwJzwefVEDt5nqZMrZPMQjcjS2BKiz89y7yilQttgAexZZAIrSVxYwgPYpAbSKOysTCsAEbcAAYO71cbPh2fjAVHrHgS5z1a3ViqueONzqo3z8BiH7/446eJVPhETN+Hl4oDnuRGSbwOQYBUfMPt9unJ+902WFJt/Vrh6PsHKbqtFOowviZ48bNGvCY7IADgN+rnooRJ6LtSLOmucCWGmbjwyzwS7zzzU7tdC9ibePHFsNNEfb7Cy+//o628tds9B7aEn/dP9sc0KxjUDEi8dOdn+oPtxvmACzf67KdIBMhC+Pf5vPlRVgUB4OcI6NywL2hiE3eOjbQ9s5Wl52VAfffcwckRdDvL7S2tcOjTxhzu+d4EIX/g63W3y9oglOFYocuPyVjnN8kr0M2oAAgVv4yYDNlMiwpo+zgzLF28867JwC7PuySKWJV4lzfO2+5DoYWDJE54Xv19Xe1XT/J/4iB5k8t3hUkJr7O029h2BHB3RlCN7AWQIBdgb+G3y7DP5l7lLX3+xezfna+1QlqoixtTGDnnnkyHHPUETIVPlHwP/70SzJF9hL14ofaHNBi8a6gWa6AtkJYBwxUdqG8DknIAWBI2dxUziCik2jEwq/kEQ6Zsqa2tR7orKFjHa1uwrgSuPn6KyLu9xfEXv+dndRi7Iko/B+2+KwgsQnyCTotDOOcnQbl5SGvqAs5AKSwbtH9M/Cz7PYh5v1bedsHsbtn47v4RabKv6WJ/f3/7/e3g9MReWVG1P6fX/QfmSI9Wey2WX7X0KMxAOgzJZRPGNXkK5bJfoX8rrKANvUz7OqOKPizplp46icW+g1vd4K/w+rDVonNbrPBnbdeB8N06PcXi70eevhf0N1N60T6Ir5R/2zrfw8iMxMb7ZXoMhjMFBu3hbxHW0gBoLCwXEzbGVDf0oFSxzjBnmndKO7e6qdzfRPAvLO/B8eVRzbff6+6zd/CO/9dLFOkL2KbibcsvFeQqFnrtUsoVi3OEic1ykSfQiqRbZkgTv3KlcmBw58uZ6Z1p36KgV9R+xfPxLpEv/8N11yqS7+/sOCxZ8DrpanCoXqqwwF7LDwgfIhT1TaKixQHNqrZlxbSGe2hVclVVQz+hl19d2DNP3mkdaN3e5UX3Nv1it7EiLKzM+H/fncbOCPY339f4rCXT5Z+KlMkFGJN5RMWHhBOw8J/TojHbPYF6ycOpqpig7h+hVCo/wp/D58nE2ERB76IBWBWJHb43PUBDfxamd1ug7tuvR6GDc2XOZERt4rY8iEQoCbjQH3stmnnDVjV6Sn+8Ada98GBXxAsu/vW728omvThEdjkDXv2j9jwLfsw63b/NC3vBm+TPlO4iDHNO/MUKJ99uExF7quv10HFp5/LFBkI8U17BFsBVg2dI+0cRtsj/+lEmS3KbpnsVf+hVGHnyauwJBXYwZFhzYjtb1dhzzK3TBErmjRhLNzwk8t06/f3+XzwwN8eN/x2z0ZW5VWg0sLTQo/SoRtIwHv2dHnZqz7fxZKSk8S8zVOCqfCkj3dqg8BWJPb7CSTC5uUJKic7C/4k5vvr1O8vLF+5Wuv/J+ETxaPYMtqqrYCZSaouawKw3D22v26gPl9kyR3DgMNImQxL+kRrHvkoav/NK+l8X6sS+/zcddv1kD9kkMyJnKj9/9kEh72YgRgHWGbRfYIK7SoU2CO/Rzjw0pGlH2bKZI/6DAAqsGPFiLJMDpgr3wbOPGt+SM2rumm/Hws7/9zT4KhZh8mUPv77UYUpt3s2qhc67VprwGpEh8lJOpwWxoC5HCqcKpM96jMAYEXlHHkZlqyp1hz8Fd0+TZ9S7d+qSieNgxt17PcXRO3/4cefpdq/jsQxlMst2gqYlRTQ9giKmAJnyqse9RoAiqYfn4n//lEyOWDMwSB9gjW7f/YscWv7/hDryc7KhPvuvg3sdn3XrYjDXr7dtkOmiF5ewlaAFccChtg4jLBF/pNxzmYWTJ+eIpMH6TUAML/3EGxDhL13syvPph38bjWBLhVavqTavxWJQl/vfn9BHPby+L9ou+doqMVWwDcWnBEk2jXH67BDKAM+ONWX2uuq4N7fOVU9EX8NuxGSPsmas39a13gxCFDt34p+MO90OHp2ROcd9ejFV96kw16iRBSRT3dYc4t50Q0UcRHKmJ1z9SyZOkivAYADEwEgPPi/zphsve4fseq3qYLm/VvR5Inj4LorL5Yp/eze0wz/eu4VmSLR8DW2AKy4OrjAxmGYLrOB2Gny8iA9vmvjx8/IxTJ8ikwOmDNbdP9Yb3CmY5MPfG1WnX2cuHJzsuG+u38BDh329z/Qc4teh64uqjREkygiX7XoTqGHuvToBoIpokyXyf30GAB8juQj8Sns1ofY+M2KB7/QzB/rEf3+v779BijIHyxz9LNr9x547qXXZYpEkzg7uM2CO4Ue6tShGwjLcr/T2eMe5j0X00w9Vl6FJbXYen1yngY/dG2hox6tRsz3P3LmdJnSj5ju+dd/PAkeD233HAtiQf67buv1OoxxcF2mg3LOQgwA8+bZgLNjZGrg8D9rxQDQtMITbGsSyyibPB6uv+oSXef771W7uR7e/6hCpkgsvO+2g89i31FxPsB4HU4K48DE7IaDbvSDAkDJph05+LsLZXLAxOZv9jRr9f+IhV/t39BpX1aSl5sN//e726PS7y9q/39/5Gnw0GEvMbXNz2CDBQeD9dgcjnGYWFJy0kEzcw56t7hfKcE40ef+EX1JH2e92n9njY+mflqIzWaD39xxIwweFP4hd31Z+81GWFyxUqZIrIh6shUHg6c5A7301Q8Ag8Hg7DjosPiD/16FiwHgsIiB3zSx+6eVYLnfvIIGf63kh98/A444TP9+/70eWfg8qCrNFouHld02yx0bmWfjkIOPiNnYCfLqOwcHAA4H/aZQ2VIUcOZaayDGszsA7q00+GsVU8smwnVX/wii0O2vWbV6DSxbQYe9xIvoLPnEYoPBSXivluhwSIzK+dHy8jv7BYDhM2cmY5wJeymkKPwVp7Wib8cGLx32bhG5OVnwx9/+Auy26BQQPp8f/vx3Ouwl3pZ5bJabrzHdFXkhxBibNnHi/vvz7xcAnF2uYsZ5rxsH9ceKB7+3r6OBPCtwOMR8/+j1+wui5r9+Y41MkXjZ5FOg2WLdQJOdOtRCOeR5WO4QmdLs3wWk+sdgmAi7emS16Z++5gC4t0W+LzeJv4vOPwtmH3GoTOlPzPenox6NQUwFfd9i3UCj7CpEPLmSQQpjvEimNAf8laxUXgyY2P45ebi1WgBi4zdifqLf/6rLL5Sp6Hj/46WwdSsd9mIUS7qt1Q0k2jMTHJFPB8WG0eHyUqNbAHDlKqDocoKBMXB8r9sqae6/2Q3Ky4E//vZWcOi8v/++vF6fNvOH6v7G8a1fgZ0Ba3UDTdKlG4jNkFea/QIAvl1l8nLAxAKwA8OJmYnuH+/uyCMuiR+xyOu3d94EgwflyZzoePHVN+mwF4MRp7Wu8lirG2iCQ9VaApE4sIz/rsgWM4CA8YMWCoQqeYS1un8663w0+8fkLjzvDJg5Y5pMRYc47OXJZ16WKWIkVjs0fqRdh32BsIzXynrpuwDg7HBNwlfDfseSR1hrALi9ivr/zeyQKZPgmisukqnoEYe9NDW3yBQxknU+Bbq4dbqBshQOGfiIDLMFy/qg7wIAY+pUeTlgzMbAmWedaCv2/unaQrN/zEpM9fxjFM71PVDjrj3wxDOLZIoYjR/Lyi881umXFqFMdANFSlHU7856+e7d4RwOk5cD5sxTImg7GE/3Dj/wAA3pmZHdbtP6/cVmb9EmDnvp7qaJAkb2uYUCgDBWj51BVf7dZJ+97w4GFx72JOmkIRbr/6/14dshE8RULv7BOXD4oWE3ZkPWuGu31v1DjG2dz6ZtD2EVRTocEYnF/f5dQGVlc8Xq37CPREqy2Pz/zmra+8eMDj2kLCb9/mKx118WPEG1fxPY7mfQbqFVwSPsKkTa2cIZH1ZeXq4V2loA6ICOVGAsQ1yHI3mYdQKA6uXg2Un9/2Yj5vvf++ufg80W/Sa/OOzlw4+XyRQxMlH7F4fGW4VYDZwe6UAwh0HbtiVrcUR7Z5jfmYExMk1cD5TY/M2RaZ03uHubn6Z/moxTzvfPy82ROdEjav9/e/gp8PqolWgWX3mtM0CZwjjkRrg1NGMsx5vcoe35ppXc3BYQJ4CF1U5SkhjYUqzTxBLz/4m5XPLDc6M+33+vr9d+A0uWfSZTxAyqsAVglSE9UdLqMBCs2AJsjHah/aKyUeI5HM5sBZiFtoAQp38R8zh0WinMv/R8mYq+R594gQ57MRmxoL/VQuMAY3QYCFYYH6c9i1/wvdlvh7iBsNIBMIFuDt4m+nKbxZDBeXDvb26J+nz/vVZ9sQaWr1wtU8QsxGKwrX7rBIChOhwOg02JseIpOAYAwWgQDke2dQKAv02FQBcFADNwOh3wu1/eHJN+f0Fs+Hb/Xx+VKWImor5caaGB4CF6HA/JYLR4ku8KCzsAWGkFsKcR24pW6Sy0uEsuOEeb9hkrFSs+h43VdTJFzGaT3zoBYBAGgMh/mmC3vzJ9+nQHZzzsMQCXlQIATf80hRnTp8CVl10gU9HX7fHAgwsW0mEvJlbrs04AEB2e4qD4CA2HefNsym53mjgjL6yd3Bi+p45s67yx7q0UAIxObPF8/VWXgC1K5/r25L0PlkD9t3TYi5k1BBh0WSh+50cYALAyk1q4sTFdsXGeDjy8xWW2FLEHkEUGV/D9FHsAEWPz+Xxw7c2/gpWffyVzosvn98PDC5+TKWJWoriss1ArIOJxAMZc3KMmK8zO0xkLr0vJlsrw75EJk/O1qdoqYGJ8Yg/+63/+a20vnmhPyXxh0X9gx85GmSJmVmehcYDIB4K5M8kJSQp+gzKCnTkDZxfrki3ynvpbVVoBbCJiVs4f//xP+PU9f4GuLrfM1VdTcytt92wh9RaaCppvi6ywwqq70w/+VIWDLex5dFbaAsLXQjOAzEYMyr7xzocw//rbYc+eZpmrn5defROaW9pkipidGAewCh0GgRkLOAYpTFHDPjDVJloAFuFroeq/Wa37ZiNc8OOfwpdr1smcyIntnp96/lWZIlawR2VglW95KsaySMMZV9R8Bd+RsAOAPdk6EdXbbKVdwxOPOJ1r/nW3waJ/v6XLuMDTz/8b3O5umSJW0CICgEVa+SlK5GsBGIcChStMTAMNi5JioRZAK7UAzM7vD8AfHvgn3Hv/AvD5wp/R1dC4G17CQEKsRewHZJVqnqh7KxHXv9kQBTgPvwvIQruA+popAFiBqP2//No7cM1Nd0IjFuQDJcYVHvzHE9ogM7EWH9b+d1lkHEBsCx35T8KHKIxF0gVkkRYA3hi+VuoCspLPv6iEi+bfDGurNsqc0Gyq2QwffFwhU8RqtgasUWa5sPR3RDprhcEgbAGEfxKYVVoAqocDpzVgliMGcudffxu8+c6HMqd/f3v4XxF1HxFja7JIC0D8FFmRxjIs+xVg3CmTAyZWAluBn3YAtSwxkPvL3z0AD/ztMW0VcV++WlMFy1bQds9WZqWe3pyIVwNzp8KBuWRyYDAE2SwyCyhgpU1CSI/ErB6xhURTU4vM2Z/o+//nwmfpsBeLs9LBMDkRng0syn6swofXArCJTiiLvJcUABLDZ6u/hgsvvwE2bqqVOf8jXvvs869lilhVm4UCQEakh8Nj2c+KSudU41tSLHNCJraBGHNLtkyZm79d1W0jONUHsP3lduA0pmxYaakpcNcvrofjj5ktDsjWZvxcPP8m2NBDYCDWcohThXtyPDJlbo+2O+CVzvBPw8PwUWPLHjzy5/glGPBAsBgAzjkiWabMTcHWjDjaUo+H2B5jz7JujATyLyeG4/X54KMly7Hg98K0skmwuGIlvPDyG/JVYmVi+uT3UqxRO1vrs8HaSE4647xLEZsCyeSAWGYbaJKQAgEVFj69CG78xW+1AWKSGLq5dcqtSKeBirI/7DEAZp2DwEgCW77yC9jZsEumiNVZaYKvI+JYxkUACG8WELUACCFmI3pmrdI7a4+4CI5gFhALf+yBEELiQnSaWGVDuLDO8d2P1gIID7UACCFmIwp/q0zQc7DII5noAgprThSNARBCzEZrAQQvTS/yFgDzsOLJs5uBsSyZEzJHlgLpE8LqPTIE0YLZe6BNoEsFLrYK1IGY/9/yeTcdL0mIAYn1qyck+8EKPdhiY7tVnrA7cbCw4i0YAOY0AIPBMosQQkgi4NCocMatsSyOEEJIyETZL8YAvDJNCCEkYTCxjphTACCEkITDRQAIbxYQIYQQM2MehVELgBBCEo4o+xXgQC0AQghJNFj2K8BYq0wSQghJFFj2YwuA75FJQgghiQLLfoUzRgGAEEISDmtQGIfdMkUIISRBcAY7FGCcAgAhhCQaxncqXFWoC4gQQhIMC2AAUJhKAYAQQhILBzvsEoPA7XhNmxcTQkiC4MC9Nq50KRBQ2jhnVjkkhxBCSL+Yx+NX3Aq3e9uAUQuAEEISBgePLdnhVkZkO5sw6QvmEkIIsToGvLN2dXaHsnjxYj/jUCfzCSGEWB7bCrAooB0oyRlbr+URQgixPM6ClX4tADDON4hnQggh1seAbxbPWgBQgVMXECGEJAjGmVbp1wKAwm0UAAghJEFwxrVu/2AXENjqRZ64JoQQYmmqX7HViItgF5Ctux1L/3ZxTQghxLo4hz2OzmS3uNYCQCekdWJum7gmhBBiYQwaq4e5td0ftADQsOb9LnxqFNeEEEKsiwFsh8WL/fI6qLh09j8xeaVMGkZO7mC46qd3ylR0BQJ+eOShe6C5KbQjEpIzCmDS3FtkKrq46oe1790Lni6xcLt/jrShkDfjZzIVXTzgg12f/QEC3c0yp28Fw0bCpVfG5v/m83rgn3/9PbS3tcicvqXmFMKEY26QqehSAx6oxM/U5w7tWG5nVhHkTrtWpqKL+7uhceW9oHpD6xkuHD0GfnjpdTIVXd3dbvjng3dDV2eHzOlb5pDxMGZ2bIq2gM+Nn+nvwe/plDkGxOHPNWuX3iQuvwsARZNnX8oYWyiThpFfMBzu/ctTMhVdfr8f7rjpR9DYsF3m9C0tdxTMvOBRmYouNeCFT5+5DNxtDTKnb87MIhg29x8yFV0c/29b3/sx+LtCa0SOLh4Hd90Tm/+bx9MNt914CTTv2SVz+paZPwFmzPurTEWXKCyWP30peDpD25E9Ka8UCo7+k0xFl+rrws/0spCD+oRJ0+CWu+6Xqejq6uqAX/z04pCDeu7IQ2HaGffKVHT5PB34mf4o5KAeDxzg0trKpU+Ka60LSGAM1shLQgghFsWAV8rL/wUAT6q/CjjX+oUIIYRYEJbxWlkvfRcAtq5Y4cbQsEkmCSGEWA2W8VpZL30XAAQObK28JIQQYjFYxn/X/SPsFwAQjQMQQohFMRVWyUvNfgGAAaMAQAghFqUqgZXyUrN/C8AfqAHO6XxgQgixGg5dimrTtoHea78A4MkM1HJgBl7BQAghJDy80cX37LeQaL8AIEaHGfBlMkkIIcQ6VldVVXnltebAQWDhA/lMCCHEIjjAEnn5nYMCAGN8ubwkhBBiDdwOtv/K6+8cFAAUj70aOA9tkw1CCCEmwBvU7uSDTn48KABs3Di4GZsBW2SSEEKIyXFg31RXv7tf/7/QwxjAogD+7o9kghBCiOnxFeKX4PX/9DQILKIFDQQTQohVcKVCXu2nxwDgZ+qn+ESHxBNCiPlxWaYfpMcAUF9Z0cw5/1ImCSGEmJQoy0WZLpP76TEACAzgbXlJCCHEtNhr8uIgfQUAMQ5A3UCEEGJWnPs58Ndl6iC9BgDV5f4K/yDtC0QIISaFNfiGbpe7WiYP0msAqF29uhX/9McySQghxGwYVOxYvbpLpg7SawCQ/i2fCSGEmAwH5T/yskd9BgAbg8XYhDho9RghhBCD4+AOgPqOTPWozwDgCDRtZRwO2j+CEEKIsWHlfU19ZUWrTPaozwAQ3Dua9xlBCCGEGA9nXIzhqsFUz/obAxDbQ78oLwkhhJiErY/pn3v1GwCqK5etBM73O0eSEEKIgWGZrZXd/eg3ACDOGbwsrwkhhBgcltnPi6dgqnehBADRiySWEvfZl0QIIST+xMxNpvBnZbJPIQWAJN60Cv/aRpkkhBBiWLxmeJZ9g0z0KaQAIGYDYVR5RiYJIYQY12uLFy/2y+s+hdYFhLiqvCR+lUlCCCFGw3kAbMoTMtWvkAOAL927lnOgs4IJIcSoGFtbO2ZIrUz1K+QAsHXFCjf+5a/KJCGEEIPBSvqbsGhRQCb7FXIAEAIqexyfqBuIEEKMRw1wFtLsn70GFAC2rFvyDQdYKpOEEEIMAsvmJaKMlsmQDCgACEzlohVACCHEODgD+Iu8DtmAA4Aj4HkbI027TBJCCIkzzvl2uzfwkUyGbMABYP36VXuwrfG0TBJCCIkzrP0v2rBh+YAr5gMOAIKisMe0+aaEEELiCmv/foXBQzI5IGEFAKd/9zpgbJ1MEkIIiZ/lmyorwtqxOawAEDwoJryIQwghRFdP4iOs6flhBQAhlSU9zwHaZJIQQkiMiTI4TUl+SSYHLOwAsGbN+5349FgwRQghJNY48AWyLA5L2AFA4Iw/jBFIdAcRQgiJJc5bnXY1oq74iAJA3ZqKjUzsPUEIISTW3trw5fLt8josEQUAQVH4fTQllBBCYodz8DEVfi+TYYs4AAzNtq3mwFbJJCGEkKjjH1VXVQxo35+eRBwAxMkznPOIIxEhhJBQKX/FX3jwOnwRBwChbl3FW/g/qZJJQgghUSLK2tq1S96RyYjoEgAQV1R4QF4TQgiJDs44+414DiYjo1cAAPB4FnEOu2SKEEKIzrDUr/Wked+QyYjpFgCqqz9rUxj7tUwSQgjRGefsHu14Xp3o1wIQ3N3P4K/1wQQhhBC9iL7/HFenrlvx6xoARCuAc7hHJgkhhOhEjLOuXr3aJ5O60LcFgLJdXQs58GqZJIQQEiFRpmYmdT0lk7rRPQCICMUYvxsvdRmlJoSQxMZVUJVb9a79C7oHAMGTEliETzQWQAghkeKwLonvjsqea1EJAGKUGkPW7XhJrQBCCAmfKEPvkodw6S4qAUDodna/xjmtDiaEkHBhGbqyZkKBbvP+DxS1ALBj9eouzvgNMkkIIWSgGL8TFi2K2m7LUQsAQl1lxQfYfnlNJgkhhISK81dqKys+lKmoiGoAEGwqux1/km6ZJIQQ0h/OW7jKb5KpqIl6ANi0bsk3HNgCmSSEENIPrrAFtVXLoj6TMuoBQFBs/A/4IzXIJCGEkN5wvtnt6IrJGStMPkddyaQ5P+YKPCaTIbPbHTCkYLhMRRnn0LBzK/j9fpnRt7TcUTDzgkdlKrrUgBc+feYycLeFFkedmUUwbO4/ZCq6OP7ftr73Y/B3Ncqcvo0uHgd33ROb/5vH0w233XgJNO8JbaPazPwJMGOeOGsj+gI+Nyx/+lLwdO6ROX1LyiuFgqP/JFPRpfq68DO9DALdzTKnbxMmTYNb7rpfpqKrq6sDfvHTi6G9rUXm9C135KEw7Yx7ZSq6fJ4O/Ex/BD53q8wZOA7wo9rKpf+SyaiKSQtAqF6X/yT+aAM+OtLv98G2b+ti89i6OeTCnxBC9MdX1Vbmi001YyJmAQBgUUAsZxb1RZlBCCHkO7xbVZWfaGVljMQwAADUrFvyCefwhEwSQgj5Dnukbt2SAfeSRCKmAQBxxQ5iWuhOmSaEkISHFePaVJYkts+JqVgHAKj+qmKXqrJr8ZL2CSKEECwLGfCb16x5v1OmYybmAUCoW7f0VXx6MZgihJDEhTXhZ2vWVrwukzEVlwCAOA+ot3LgHTJNCCEJiDcA898sLoLp2IpXAACxyo0BxO0HJ4SQOOOMw89q13wa2gKaKIhbABBcgaYnOedLZZIQQhIIf7t67XHPyURcxDUAiEMObAwupa4gQkgiEWWejbHrAH6jyqy4iGsAEDZVVtQyYDfiJXUFEUIsj3Pu55xdtXHN0jqZFTdxDwBCTeXShVj6x2UUnBBCYoqxF+rWLo1r189ehggASOXccRXGxh0yTQghliMWfDm8gWvEZTAnvowSAKBu7UcNjCuXiOaRzCKE7IOrXvB3NsTmIXZ25XHtnrYcrWxjfP6GDcvbZVbcxWw76FCNLp19rwLsFzJpaLQddBBtBx2egW4HLb6uTLHJ6+jjauh1MdoOOqiP7aBFOP1tXeXSX8u0IRimBbBXtzPrbgyVa2WSEPIdrhXKsXoQ/XAOn9ncqbGJQgNguACwY/WbXRgpf0hTQwkhlsChmam+C6ur3/XIHMMwXBfQXsVlR12M1ZCF+F+MXZt3gKgLKIi6gMIz8C4g4zJyF5Bid4ErJVumootzFTwdu7VnmRNQQbm4rnKJIWb9HMhwLYC9atYseQoL/7/LJCGEhEX1e7DitDMmj+72xn0Kf63r589GLfwFwwYAQeyPjW/gCpkkhBDz4PwjpTvtTpkyJEMHALE/NuPwfXwnaX0AIcQ8ON/sUf3zjNjvvy9DBwChZt3Sb1VQzqP1AYQQMwhu9QAXbq1a0SSzDMvwAUCoq1yylDO4BS9pvyBCiHFxHgBg19Wuq1gmcwzNFAFAqKuseBAj60sySQghhoM11Cdr1y59RCYNzzQBAKngSroSg8CXMk0IIcbBYZm3xX8dXplmDw0zBQCoXf1Ba0C1nSI2VJJZhBASd1jzr/Gryrlbt65wyyxTMOxCsL4UlZVPZmpgKTCWJbPiIjV7BEw/588yFV1iIdjnL9+gzTMOhZEXgqWkpsH4iVNlKrpUNQDrKr8Anze0yRi0ECw8Rl4IFn18J1PV2dXrltfIDNMwZQAQRk8+ai5j6hsMmEtmxRxjCtgcyTIVbVwrMDg2f0Jh5ABgZBQAwpOwAYBDFz7m1qxbulzmmIqpuoD2Vbd2yftY+F8rih+ZFXNixZ/f2xmjB95nIRb+hJBYwLJHYVebtfAXTBsAhJrKpY9xzn6Dl1QyEkJiiAc4sNuCW9aYl6kDgDAiV7kXS/9nZZIQQqIOK56P11bmPyCTpmX6ALB48WK/29l1JbYB3pFZhBASTf/GiudPABbFrftZL6YPAMKO1au7WHfqWRiX35dZhBCiO87hXVcg/3xR8ZRZpmaJACCITZe4M2kefkKfySxCCNENB1icpiSdW1W1yCuzTM8yAUAQC8WYHU6l1cKEED1hmbLC4Q2cJnYollmWYKkAIFR/VbHLq/qPx0+sUmYRQkgkvvYzOGXDhuXtMm0Zpl0I1p+S0vLhnKsV+BMWyqyEQgvBwkMLwcIjjvn80fybZSq6urvd8Nf77oTOzuiXxxz4N8ACR9eu+dT8N3cPLBsAhOKJ5SWgqO/jTzlKZiUMCgDhoQBAvsNhI2PKcdWVi7fKHMuxXBfQvmqqFlfjBzgHP8gNMosQQvolav5WL/wFSwcAQXyA+EEeL6K5zCKEkL58Lbp9rF74C5YPAIL4IH1+OJpmBxFC+iJm+/iAH2PVPv8DWXoM4EDjxs1K9ztsb+FPPUdmWRaNAYQn1ju8+n1uUerINIknMc9fTPW04myf3iRUABCKph+fCV7P6/iDl8ssS6IAQEjoxApfscjLavP8+5MQXUD7EovFRJTHj/xtmUUISWz/TlLzz0i0wl9IuAAgiCbe8BzbGXj5BD6o/U1IQuIBrPk/MjxH+b6VtncYiIQMAILYzAk/+PkqwG8xaZpDnAkhegju51+7Nv8aq2zsFo6EDQCC+ODrKpeKA2XEdtJdwVxCiKWJ7zpTLqutXPp/VtjSORIJHQAkrp0spsBpeN0UzCKEWBPfiQFgrtlP8tILBQCpds3Sjzjzl3POLb/4g5BExAFqmKrONvMZvnqjALCP2jWfrvX72WGcwwqZRQixAg7LAgFldvW65TUyhyAKAAeoX790R5KqzMUb5gW8a2hwmBAz42KmD3/c0+Kbu6Vq8U6ZSyQKAD2oqlrcUZOrXIQtgRvx5knYGQKEmJn47nJg19aurZi/desKt8wm+6AA0JvFi/144/yVceUEDATbZS4hxAw434yt+KNr1y79J6aoJd8LCgD9qFm35GOHIzADb6YKmUUIMTLOP/Ko/um16yqWyRzSCwoAIdjw5fLtrDv1eLwUJ4XQymFCDEnr7/8T6047ZWvVCprSHQIKACGqrn7XU1O59Aa8nI8RoC2YSwgxBA7NKigX166t+Ln4rspc0o+E2w1UD8XTykvAH3gO374ZMstwHOnDYfDMO2QqunjABw3Lfw2Bbqp0kZjDSj98xlTfhTVVK6plHgkRBYAwDZ85M9nZaf8t43AjMGaT2YSQGNFm+TD2e5s79V6q9YeHAkCEisvmnAgq/wcGgdEyixASZVjrrwXG59dWVnwos0gYqOYaoeaG+prUvKFP25kyBsPpOIypFFQJiRJtXQ5jzzl8gdOqq5atl9kkTFRY6WXePFvR+p0X4i36NwYsTeYSQnTCgXdwzq6qW7v0OS1JIkYBQGejSmeNs3FlAdZSjsEkvb+ERA4Le/62jbHrNq5ZWifziA5oGqjONlcu31AzoeAEbKr+GG9bOiSXkIjwBsb5xTWVx51Ohb/+qIYaRSPHzylwOOBveHkWPui9JiR0HKv9zwLz31y75lOqSEUJFUrRp5SUzj4b7+b/A8ZGyTxCSC/EDB8G/OaatRWvi2Qwl0QDzQKKPt7UWF+VPWLsk+D352HIncyA1g0QcjDejXXSBWlK0rnrKz+plJkkiqgFEFtsTNnswwIqLGCMHSLzCCHAV6mq8pO6dUtWyQwSAzQIHFt805qKlSNybYdjM/dqTsdPkkTH+WYO8KOayoIjqPCPPWoBxFFZ2dzUTtX9K87YVfhBpMtsQqyP8xausAVuR9fvd6xe3SVzSYxRADCA4onlJVwJ3M8YO11mEWJdnL/CVX5TbdWyeplD4oQCgIGIfYXwi3EvBoKpmKTPhliJ2LVzJTB+J+3fYxw0BmAgNWuWvpftch+uAj8POKzFLJoCR0yO4+3MK/Fxdu2E/NlU+BsL1TINqrCwPMmWETgLQ8A92CKg9QPEdDjwalCVW5P47jerqqq8MpsYCAUAg5s+fbqj2ZNyGTadf8aAlchsQgwLm61VigoPZCZ1PbV69WqfzCYGRAHAJLQWQbp6CV7ewhgUBXMJMQyxdUMt5+yeHFfn01TwmwMFAJPRpo4G3GcDY3fgpzdOZhMSN6LGzzj7jSfN+8bWFSvcMpuYAAUA82LFpUedxjm/gQGfgwHBLvMJiTqs7mMNn38EoPy1du2Sd0RW8BViJhQAzE8pnnLkBK6yX+L19+gwGhJVnLfir28xFX5fXVXxjcjR8okpUQCwkFETjihU7LZr8WO9Ej9YWllMdIOlfBsHvsBpVx/a8OXy7TKbmBwFAAsqKTksQ01y/YAxuIhzfjij7iESBrx3/Pi0HB9PpinJL61Z836n9gKxDAoA1qaMLptdAiq7QWH8TPy48zGPPnPSFyz3+Xa8SRYpDB7aVFmxGfPU4EvEaqgwSBDjxs1K97psJzDOb2LAjsAs+uzJvlQOsARvir/YvYGPNmxY3i7ziYVRIZCAiqccOQlbBRdyzk5jjE/A24C2BElEnAeAsbWcw5sBzp7dsm6JGNQlCYQCQCIrL7ePavIV27jtMiwNzuLARjEGDvkqsSCs5Xvx1xq8fA1syhO1Y4bUwqJFgeCrJNFQACAabcsJX9o4pqoXceAXMMaGy5eIFYiDVxg8zxT+7PAs+4bFixeLAV6S4CgAkB78Sima9OER2vkEDI7FgFDKgLnki8QMOLixtr+GM/6xDfjr1ZXLVmq5hOyDAgDpx6+UkaUfZjpUOBUUOJNzNpMBH0wrjw2Gcz+W7jvxG72Mg/KfAKjv1FdWiEVbNIOH9IoCABmQgunTU1J9qeM4V8WYwWl4A03BbLqP4kNM2fwS3/7XsJX2erfLXU3HK5KBoC8uicj48TNy/U7nLGwZzMKAMJNxmIh31WD5MtEPVvB5A77H3+DzCuBKhZ+pn2Itv1m+TsiAUQAgemIlJSc5wdlRDDZ2gsr50YyxaVh05eGdliJ/DwkFB6zJ80a8Wo0l/xI72P6rdifXVVe/Kw5Wob58ogsKACSqJk6c6PSw3CGM8SKVweHA2Qy86cqA8WK8/WzytyU2seUCg01Yu69kKqxSlcBKRbVtdvE9DXSSFokmCgAkLobPnJns7HBNUhR1Cld5Kd6Kkzjjw7BuOwhbDTn4W6y2OA0bRLAHv3GN+KXbjj/nWs5gDQNe6Un1V9E++iQeKAAQwygvL7dv25Zs8yZ3pNgCbIzC+Di8Q8fiYzTequJc5OGc81RgYkoqdzJgTsyL9z2M5TrHWjrzYKHuwQK9E6+3YuFeh9ebGWcbMLCt9yu2Gkdnsrt6mDsANAefGAQFAGIe8+bZCjc2pnOPmpzkhCQ/+FNZwDGIK2o+NhfyOReb3fEheFcPAs4ygHEn19YvcAwUGCw4dwWDhpaW+QIW3sFC3IuFNV4zsVpWK9SxEPeKgh2DTiv++T2Y14CF+w78u3eyAN8Jdthl40qXx6+4bckOd+3q7A4AWllLzADg/wFE9P+bQRFUHAAAAABJRU5ErkJggg=="></a>
+ <div id="perfetto-logo-caption">
+ Try the new <a href="https://ui.perfetto.dev">Perfetto UI</a>!
+ <a href="https://chromium.googlesource.com/catapult/+/refs/heads/main/tracing/docs/perfetto.md">Learn more</a>.
+ </div>
+ </div>
+ </div>
+ </track-view-container>
</tr-ui-timeline-view>
</template>
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/extras/about_tracing/profiling_view_test.html b/chromium/third_party/catapult/tracing/tracing/ui/extras/about_tracing/profiling_view_test.html
index 1344c1a36f9..11de7bca881 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/extras/about_tracing/profiling_view_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/extras/about_tracing/profiling_view_test.html
@@ -15,7 +15,8 @@ found in the LICENSE file.
<script>
'use strict';
-tr.b.unittest.testSuite(function() {
+// See https://crbug.com/1143376.
+tr.b.unittest.skippedTestSuite(function() {
const Base64 = tr.b.Base64;
const testData = [
{name: 'a', args: {}, pid: 52, ts: 15000, cat: 'foo', tid: 53, ph: 'B'},
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/extras/about_tracing/record_controller_test.html b/chromium/third_party/catapult/tracing/tracing/ui/extras/about_tracing/record_controller_test.html
index e3e0438f3a2..1f6aaf36da7 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/extras/about_tracing/record_controller_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/extras/about_tracing/record_controller_test.html
@@ -13,7 +13,8 @@ found in the LICENSE file.
<script>
'use strict';
-tr.b.unittest.testSuite(function() {
+// See https://crbug.com/1143376.
+tr.b.unittest.skippedTestSuite(function() {
const testData = [
{name: 'a', args: {}, pid: 52, ts: 15000, cat: 'foo', tid: 53, ph: 'B'},
{name: 'a', args: {}, pid: 52, ts: 19000, cat: 'foo', tid: 53, ph: 'E'},
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/extras/about_tracing/record_selection_dialog_test.html b/chromium/third_party/catapult/tracing/tracing/ui/extras/about_tracing/record_selection_dialog_test.html
index 7c62b487305..b286c065ec1 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/extras/about_tracing/record_selection_dialog_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/extras/about_tracing/record_selection_dialog_test.html
@@ -12,7 +12,8 @@ found in the LICENSE file.
<script>
'use strict';
-tr.b.unittest.testSuite(function() {
+// See https://crbug.com/1143376.
+tr.b.unittest.skippedTestSuite(function() {
test('instantitate', function() {
const showButton = document.createElement('button');
Polymer.dom(showButton).textContent = 'Show record selection dialog';
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/display_item_debugger_test.html b/chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/display_item_debugger_test.html
index c10d6995db3..067e8dc820d 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/display_item_debugger_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/display_item_debugger_test.html
@@ -11,7 +11,8 @@ found in the LICENSE file.
<script>
'use strict';
-tr.b.unittest.testSuite(function() {
+// See https://crbug.com/1143376.
+tr.b.unittest.skippedTestSuite(function() {
test('instantiate', function() {
const displayItemList = new tr.e.cc.DisplayItemListSnapshot(
{id: '31415'},
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/layer_tree_host_impl_view_test.html b/chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/layer_tree_host_impl_view_test.html
index 1831be24618..bc2b35939d5 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/layer_tree_host_impl_view_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/layer_tree_host_impl_view_test.html
@@ -18,7 +18,8 @@ found in the LICENSE file.
<script>
'use strict';
-tr.b.unittest.testSuite(function() {
+// See https://crbug.com/1143376.
+tr.b.unittest.skippedTestSuite(function() {
test('instantiate', function() {
const m = tr.c.TestUtils.newModelWithEvents([g_catLTHIEvents]);
const p = Object.values(m.processes)[0];
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/layer_tree_quad_stack_view_test.html b/chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/layer_tree_quad_stack_view_test.html
index 66932ae785f..e8d31358ee5 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/layer_tree_quad_stack_view_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/layer_tree_quad_stack_view_test.html
@@ -17,7 +17,8 @@ found in the LICENSE file.
<script>
'use strict';
-tr.b.unittest.testSuite(function() {
+// See https://crbug.com/1143376.
+tr.b.unittest.skippedTestSuite(function() {
test('tileCoverageRectCount', function() {
const m = tr.c.TestUtils.newModelWithEvents([g_catLTHIEvents]);
const p = m.processes[1];
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/layer_view_test.html b/chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/layer_view_test.html
index ed3de7b87e1..0694f977a4b 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/layer_view_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/layer_view_test.html
@@ -17,7 +17,8 @@ found in the LICENSE file.
<script>
'use strict';
-tr.b.unittest.testSuite(function() {
+// See https://crbug.com/1143376.
+tr.b.unittest.skippedTestSuite(function() {
test('instantiate', function() {
const m = tr.c.TestUtils.newModelWithEvents([g_catLTHIEvents]);
const p = m.processes[1];
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/raster_task_view_test.html b/chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/raster_task_view_test.html
index 56767cfcc89..90488f46b5f 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/raster_task_view_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/extras/chrome/cc/raster_task_view_test.html
@@ -47,7 +47,8 @@ tr.b.unittest.testSuite(function() {
this.addHTMLOutput(view);
});
- test('analysisViewIntegration', function() {
+ // See https://crbug.com/1143376.
+ skipTest('analysisViewIntegration', function() {
const selection = createSelection();
const timelineView = {model: selection.model};
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/timeline_view.html b/chromium/third_party/catapult/tracing/tracing/ui/timeline_view.html
index 723e120ebc6..288ab5df807 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/timeline_view.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/timeline_view.html
@@ -120,7 +120,13 @@ found in the LICENSE file.
<div id="control">
<div id="bar">
<div id="left_controls"></div>
- <div id="title">^_^</div>
+ <div id="title">
+ ^_^
+ <div style="padding-left: 3em">
+ Try the new <a href="https://ui.perfetto.dev">Perfetto UI</a>!
+ <a href="https://chromium.googlesource.com/catapult/+/refs/heads/main/tracing/docs/perfetto.md">Learn more</a>
+ </div>
+ </div>
<div id="right_controls">
<tr-ui-b-dropdown id="flow_event_filter_dropdown" label="Flow events"></tr-ui-b-dropdown>
<tr-ui-b-dropdown id="process_filter_dropdown" label="Processes"></tr-ui-b-dropdown>
@@ -140,8 +146,6 @@ found in the LICENSE file.
<div id="collapsing_controls"></div>
<tr-ui-b-info-bar-group id="import-warnings">
</tr-ui-b-info-bar-group>
- <tr-ui-b-info-bar-group id="polyfill-warning">
- </tr-ui-b-info-bar-group>
</div>
<middle-container>
<slot></slot>
@@ -161,9 +165,7 @@ found in the LICENSE file.
const POLYFILL_WARNING_MESSAGE =
'Trace Viewer is running with WebComponentsV0 polyfill, and some ' +
- 'features may be broken. As a workaround, you may try running chrome ' +
- 'with "--enable-blink-features=ShadowDOMV0,CustomElementsV0,HTMLImports" ' +
- 'flag. See crbug.com/1036492.';
+ 'features may be broken. See crbug.com/1036492.';
Polymer({
is: 'tr-ui-timeline-view',
@@ -278,19 +280,6 @@ Polymer({
if (this.polyfillWarnedOnce_) return;
console.warn(POLYFILL_WARNING_MESSAGE); // eslint-disable-line no-console
this.polyfillWarnedOnce_ = true;
-
- // You can set window.__hideTraceViewerPolyfillWarning = true somewhere
- // in your setup code if you embed trace viewer and want to hide the
- // UI polyfill warning.
- if (!window.__hideTraceViewerPolyfillWarning) {
- const polyfillWarningsEl =
- Polymer.dom(this.root).querySelector('#polyfill-warning');
- polyfillWarningsEl.addMessage(
- POLYFILL_WARNING_MESSAGE, [{
- buttonText: 'Hide',
- onClick: () => polyfillWarningsEl.clearMessages()
- }]);
- }
},
updateDocumentFavicon() {
diff --git a/chromium/third_party/catapult/tracing/tracing/ui/tracks/async_slice_group_track.html b/chromium/third_party/catapult/tracing/tracing/ui/tracks/async_slice_group_track.html
index d922030ce70..49a31c0e1a0 100644
--- a/chromium/third_party/catapult/tracing/tracing/ui/tracks/async_slice_group_track.html
+++ b/chromium/third_party/catapult/tracing/tracing/ui/tracks/async_slice_group_track.html
@@ -30,6 +30,9 @@ tr.exportTo('tr.ui.tracks', function() {
tr.ui.tracks.MultiRowTrack.prototype.decorate.call(this, viewport);
Polymer.dom(this).classList.add('async-slice-group-track');
this.group_ = undefined;
+ // Set the collapse threshold so we don't collapse by default, but the
+ // user can explicitly collapse if they want it.
+ this.defaultToCollapsedWhenSubRowCountMoreThan = 30;
},
addSubTrack_(slices) {
@@ -94,7 +97,8 @@ tr.exportTo('tr.ui.tracks', function() {
* a single track but provide no information themselves.
*/
function stripSlice_(slice) {
- if (slice.subSlices !== undefined && slice.subSlices.length === 1) {
+ if (slice.subSlices !== undefined && slice.subSlices.length === 1
+ && !slice.args) {
const subSlice = slice.subSlices[0];
if (tr.b.math.approximately(subSlice.start, slice.start, 1) &&
tr.b.math.approximately(subSlice.duration, slice.duration, 1)) {
@@ -112,6 +116,9 @@ tr.exportTo('tr.ui.tracks', function() {
function makeLevelSubRows_(slices) {
const rows = [];
const putSlice = (slice, level) => {
+ if (slice.hidden) {
+ return;
+ }
while (rows.length <= level) {
rows.push([]);
}
diff --git a/chromium/third_party/catapult/tracing/tracing/value/diagnostics/alert_groups.html b/chromium/third_party/catapult/tracing/tracing/value/diagnostics/alert_groups.html
new file mode 100644
index 00000000000..b7d1382c3ac
--- /dev/null
+++ b/chromium/third_party/catapult/tracing/tracing/value/diagnostics/alert_groups.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<!--
+Copyright 2020 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<link rel="import" href="/tracing/base/base.html">
+
+<script>
+'use strict';
+
+tr.exportTo('tr.v.d', function() {
+ // All alert groups used in TBMv2 metrics. If you add a new group, add it
+ // here first to make sure you're not accidentally reusing a name.
+ // The keys and values are same here by convention.
+ const ALERT_GROUPS = {
+ // For metrics measuring cpu usage in general, like cpu time percentage
+ // metric.
+ CPU_USAGE: 'cpu_usage',
+ // For paint related loading metrics like First Contentful Paint and Largest
+ // Contentful Paint
+ LOADING_PAINT: 'loading_paint',
+ // For interactivity related loading metrics like Time to Interactive and
+ // Total Blocking Time.
+ LOADING_INTERACTIVITY: 'loading_interactivity',
+ // For layour related metrics like Cumulative Layout Shift.
+ LOADING_LAYOUT: 'loading_layout',
+ };
+
+ return {
+ ALERT_GROUPS,
+ };
+});
+</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/value/diagnostics/breakdown.py b/chromium/third_party/catapult/tracing/tracing/value/diagnostics/breakdown.py
index e37d85753b4..2605e6c343d 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/diagnostics/breakdown.py
+++ b/chromium/third_party/catapult/tracing/tracing/value/diagnostics/breakdown.py
@@ -53,10 +53,10 @@ class Breakdown(diagnostic.Diagnostic):
return breakdown
@staticmethod
- def FromDict(d):
+ def FromDict(dct):
result = Breakdown()
- result._color_scheme = d.get('colorScheme')
- for name, value in d['values'].items():
+ result._color_scheme = dct.get('colorScheme')
+ for name, value in dct['values'].items():
if value in ['NaN', 'Infinity', '-Infinity']:
value = float(value)
result.Set(name, value)
diff --git a/chromium/third_party/catapult/tracing/tracing/value/diagnostics/date_range.py b/chromium/third_party/catapult/tracing/tracing/value/diagnostics/date_range.py
index 1fe181319fb..eb30a71efe8 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/diagnostics/date_range.py
+++ b/chromium/third_party/catapult/tracing/tracing/value/diagnostics/date_range.py
@@ -1,16 +1,17 @@
# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
import datetime
+from tracing.value import histogram
from tracing.value.diagnostics import diagnostic
class DateRange(diagnostic.Diagnostic):
- __slots__ = '_range',
+ __slots__ = ('_range',)
def __init__(self, ms):
- from tracing.value import histogram
super(DateRange, self).__init__()
self._range = histogram.Range()
self._range.AddValue(ms)
@@ -88,4 +89,3 @@ class DateRange(diagnostic.Diagnostic):
def AddDiagnostic(self, other_diagnostic):
self._range.AddRange(other_diagnostic._range)
-
diff --git a/chromium/third_party/catapult/tracing/tracing/value/diagnostics/diagnostic.py b/chromium/third_party/catapult/tracing/tracing/value/diagnostics/diagnostic.py
index 457c3fb9645..074bfd0175d 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/diagnostics/diagnostic.py
+++ b/chromium/third_party/catapult/tracing/tracing/value/diagnostics/diagnostic.py
@@ -15,7 +15,7 @@ from tracing.value.diagnostics import all_diagnostics
class Diagnostic(object):
- __slots__ = '_guid',
+ __slots__ = ('_guid',)
# Ensure that new subclasses remember to specify __slots__ in order to prevent
# regressing memory consumption:
diff --git a/chromium/third_party/catapult/tracing/tracing/value/diagnostics/generic_set.py b/chromium/third_party/catapult/tracing/tracing/value/diagnostics/generic_set.py
index 31966b02b66..8fd24f5e6c2 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/diagnostics/generic_set.py
+++ b/chromium/third_party/catapult/tracing/tracing/value/diagnostics/generic_set.py
@@ -3,6 +3,7 @@
# found in the LICENSE file.
import json
+import six
from tracing.proto import histogram_proto
from tracing.value.diagnostics import diagnostic
@@ -106,12 +107,13 @@ class GenericSet(diagnostic.Diagnostic):
for value_json in d.values:
try:
values.append(json.loads(value_json))
- except (TypeError, ValueError):
- raise TypeError('The value %s is not valid JSON. You cannot pass naked '
- 'strings as a GenericSet value, for instance; they '
- 'have to be quoted. Therefore, 1234 is a valid value '
- '(int), "abcd" is a valid value (string), but abcd is '
- 'not valid.' % value_json)
+ except (TypeError, ValueError) as e:
+ six.raise_from(
+ TypeError('The value %s is not valid JSON. You cannot pass naked '
+ 'strings as a GenericSet value, for instance; they '
+ 'have to be quoted. Therefore, 1234 is a valid value '
+ '(int), "abcd" is a valid value (string), but abcd is '
+ 'not valid.' % value_json), e)
return GenericSet(values)
diff --git a/chromium/third_party/catapult/tracing/tracing/value/diagnostics/related_event_set.py b/chromium/third_party/catapult/tracing/tracing/value/diagnostics/related_event_set.py
index be422e9f788..590ea5c22cc 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/diagnostics/related_event_set.py
+++ b/chromium/third_party/catapult/tracing/tracing/value/diagnostics/related_event_set.py
@@ -11,7 +11,7 @@ from tracing.value.diagnostics import diagnostic
class RelatedEventSet(diagnostic.Diagnostic):
- __slots__ = '_events_by_stable_id',
+ __slots__ = ('_events_by_stable_id',)
def __init__(self, events=()):
super(RelatedEventSet, self).__init__()
@@ -47,9 +47,9 @@ class RelatedEventSet(diagnostic.Diagnostic):
return events
@staticmethod
- def FromDict(d):
+ def FromDict(dct):
result = RelatedEventSet()
- for event in d['events']:
+ for event in dct['events']:
result.Add(event)
return result
@@ -68,7 +68,7 @@ class RelatedEventSet(diagnostic.Diagnostic):
for e in self]
def _AsDictInto(self, d):
- d['events'] = [event for event in self]
+ d['events'] = list(self)
def _AsProto(self):
raise NotImplementedError()
diff --git a/chromium/third_party/catapult/tracing/tracing/value/diagnostics/related_name_map.py b/chromium/third_party/catapult/tracing/tracing/value/diagnostics/related_name_map.py
index c644da95bf3..7f17b9890b0 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/diagnostics/related_name_map.py
+++ b/chromium/third_party/catapult/tracing/tracing/value/diagnostics/related_name_map.py
@@ -10,7 +10,7 @@ from tracing.value.diagnostics import diagnostic
class RelatedNameMap(diagnostic.Diagnostic):
- __slots__ = '_map',
+ __slots__ = ('_map',)
def __init__(self, entries=None):
super(RelatedNameMap, self).__init__()
diff --git a/chromium/third_party/catapult/tracing/tracing/value/diagnostics/reserved_infos.py b/chromium/third_party/catapult/tracing/tracing/value/diagnostics/reserved_infos.py
index e3087e5719f..ca975908acc 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/diagnostics/reserved_infos.py
+++ b/chromium/third_party/catapult/tracing/tracing/value/diagnostics/reserved_infos.py
@@ -25,11 +25,13 @@ class _Info(object):
return self._entry_type
+ALERT_GROUPING = _Info('alertGrouping', 'GenericSet', str)
ANGLE_REVISIONS = _Info('angleRevisions', 'GenericSet', str)
ARCHITECTURES = _Info('architectures', 'GenericSet', str)
BENCHMARKS = _Info('benchmarks', 'GenericSet', str)
BENCHMARK_START = _Info('benchmarkStart', 'DateRange')
BENCHMARK_DESCRIPTIONS = _Info('benchmarkDescriptions', 'GenericSet', str)
+BOT_ID = _Info('botId', 'GenericSet', str)
BOTS = _Info('bots', 'GenericSet', str)
BUG_COMPONENTS = _Info('bugComponents', 'GenericSet', str)
BUILD_URLS = _Info('buildUrls', 'GenericSet', str)
@@ -54,6 +56,7 @@ MASTERS = _Info('masters', 'GenericSet', str)
MEMORY_AMOUNTS = _Info('memoryAmounts', 'GenericSet', int)
OS_NAMES = _Info('osNames', 'GenericSet', str)
OS_VERSIONS = _Info('osVersions', 'GenericSet', str)
+OS_DETAILED_VERSIONS = _Info('osDetailedVersions', 'GenericSet', str)
OWNERS = _Info('owners', 'GenericSet', str)
POINT_ID = _Info('pointId', 'GenericSet', int)
PRODUCT_VERSIONS = _Info('productVersions', 'GenericSet', str)
@@ -70,7 +73,16 @@ TRACE_URLS = _Info('traceUrls', 'GenericSet', str)
V8_COMMIT_POSITIONS = _Info('v8CommitPositions', 'DateRange')
V8_REVISIONS = _Info('v8Revisions', 'GenericSet', str)
WEBRTC_REVISIONS = _Info('webrtcRevisions', 'GenericSet', str)
-WEBRTC_INTERNAL_REVISIONS = _Info('webrtcInternalRevisions', 'GenericSet', str)
+WEBRTC_INTERNAL_SIRIUS_REVISIONS = _Info(
+ 'webrtcInternalSiriusRevisions', 'GenericSet', str)
+WEBRTC_INTERNAL_VEGA_REVISIONS = _Info(
+ 'webrtcInternalVegaRevisions', 'GenericSet', str)
+WEBRTC_INTERNAL_CANOPUS_REVISIONS = _Info(
+ 'webrtcInternalCanopusRevisions', 'GenericSet', str)
+WEBRTC_INTERNAL_ARCTURUS_REVISIONS = _Info(
+ 'webrtcInternalArcturusRevisions', 'GenericSet', str)
+WEBRTC_INTERNAL_RIGEL_REVISIONS = _Info(
+ 'webrtcInternalRigelRevisions', 'GenericSet', str)
def _CreateCachedInfoTypes():
@@ -86,6 +98,7 @@ def GetTypeForName(name):
info = _CACHED_INFO_TYPES.get(name)
if info:
return info.type
+ return None
def AllInfos():
for info in _CACHED_INFO_TYPES.values():
diff --git a/chromium/third_party/catapult/tracing/tracing/value/diagnostics/reserved_names.html b/chromium/third_party/catapult/tracing/tracing/value/diagnostics/reserved_names.html
index e1f7c686d23..b25f946ec6d 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/diagnostics/reserved_names.html
+++ b/chromium/third_party/catapult/tracing/tracing/value/diagnostics/reserved_names.html
@@ -17,12 +17,14 @@ tr.exportTo('tr.v.d', function() {
// Diagnostics that are produced outside of metrics (e.g. by telemetry) use
// reserved names.
const RESERVED_INFOS = {
+ ALERT_GROUPING: { name: 'alertGrouping', type: tr.v.d.GenericSet },
ANGLE_REVISIONS: {name: 'angleRevisions', type: tr.v.d.GenericSet},
ARCHITECTURES: {name: 'architectures', type: tr.v.d.GenericSet},
BENCHMARKS: {name: 'benchmarks', type: tr.v.d.GenericSet},
BENCHMARK_START: {name: 'benchmarkStart', type: tr.v.d.DateRange},
BENCHMARK_DESCRIPTIONS: {name: 'benchmarkDescriptions',
type: tr.v.d.GenericSet},
+ BOT_ID: {name: 'botId', type: tr.v.d.GenericSet},
BOTS: {name: 'bots', type: tr.v.d.GenericSet},
BUG_COMPONENTS: {name: 'bugComponents', type: tr.v.d.GenericSet},
BUILDS: {name: 'builds', type: tr.v.d.GenericSet},
@@ -32,7 +34,7 @@ tr.exportTo('tr.v.d', function() {
CHROMIUM_REVISIONS: {name: 'chromiumRevisions', type: tr.v.d.GenericSet},
DESCRIPTION: {name: 'description', type: tr.v.d.GenericSet},
DEVICE_IDS: {name: 'deviceIds', type: tr.v.d.GenericSet},
- DOCUMENTATION_URLS: {name: 'documentationUrls', type: tr.v.d.GenericSet},
+ DOCUMENTATION_URLS: {name: 'documentationLinks', type: tr.v.d.GenericSet},
INFO_BLURB: {name: 'infoBlurb', type: tr.v.d.GenericSet},
FUCHSIA_GARNET_REVISIONS: {
name: 'fuchsiaGarnetRevisions', type: tr.v.d.GenericSet},
@@ -50,6 +52,7 @@ tr.exportTo('tr.v.d', function() {
MEMORY_AMOUNTS: {name: 'memoryAmounts', type: tr.v.d.GenericSet},
OS_NAMES: {name: 'osNames', type: tr.v.d.GenericSet},
OS_VERSIONS: {name: 'osVersions', type: tr.v.d.GenericSet},
+ OS_DETAILED_VERSIONS: {name: 'osDetailedVersions', type: tr.v.d.GenericSet},
OWNERS: {name: 'owners', type: tr.v.d.GenericSet},
POINT_ID: {name: 'pointId', type: tr.v.d.GenericSet},
PRODUCT_VERSIONS: {name: 'productVersions', type: tr.v.d.GenericSet},
@@ -66,8 +69,16 @@ tr.exportTo('tr.v.d', function() {
V8_COMMIT_POSITIONS: {name: 'v8CommitPositions', type: tr.v.d.DateRange},
V8_REVISIONS: {name: 'v8Revisions', type: tr.v.d.GenericSet},
WEBRTC_REVISIONS: {name: 'webrtcRevisions', type: tr.v.d.GenericSet},
- WEBRTC_INTERNAL_REVISIONS: {
- name: 'webrtcInternalRevisions', type: tr.v.d.GenericSet},
+ WEBRTC_INTERNAL_SIRIUS_REVISIONS: {
+ name:'webrtcInternalSiriusRevisions', type: tr.v.d.GenericSet},
+ WEBRTC_INTERNAL_VEGA_REVISIONS: {
+ name:'webrtcInternalVegaRevisions', type: tr.v.d.GenericSet},
+ WEBRTC_INTERNAL_CANOPUS_REVISIONS: {
+ name:'webrtcInternalCanopusRevisions', type: tr.v.d.GenericSet},
+ WEBRTC_INTERNAL_ARCTURUS_REVISIONS: {
+ name:'webrtcInternalArcturusRevisions', type: tr.v.d.GenericSet},
+ WEBRTC_INTERNAL_RIGEL_REVISIONS: {
+ name:'webrtcInternalRigelRevisions', type: tr.v.d.GenericSet},
};
const RESERVED_NAMES = {};
diff --git a/chromium/third_party/catapult/tracing/tracing/value/diagnostics/unmergeable_diagnostic_set.py b/chromium/third_party/catapult/tracing/tracing/value/diagnostics/unmergeable_diagnostic_set.py
index c6de25894d5..db5e20965c4 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/diagnostics/unmergeable_diagnostic_set.py
+++ b/chromium/third_party/catapult/tracing/tracing/value/diagnostics/unmergeable_diagnostic_set.py
@@ -16,7 +16,7 @@ except NameError:
class UnmergeableDiagnosticSet(diagnostic.Diagnostic):
- __slots__ = '_diagnostics',
+ __slots__ = ('_diagnostics',)
def __init__(self, diagnostics):
super(UnmergeableDiagnosticSet, self).__init__()
diff --git a/chromium/third_party/catapult/tracing/tracing/value/gtest_json_converter.py b/chromium/third_party/catapult/tracing/tracing/value/gtest_json_converter.py
index 4238c4b8bd4..fae316177a5 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/gtest_json_converter.py
+++ b/chromium/third_party/catapult/tracing/tracing/value/gtest_json_converter.py
@@ -107,7 +107,7 @@ def _ConvertUnit(unit):
# back to checking the histogram units directly, and defaulting to unitless if
# the unit is unrecognized.
legacy_unit = legacy_unit_info.LEGACY_UNIT_INFO.get(unit)
- if legacy_unit != None:
+ if legacy_unit is not None:
return legacy_unit.AsTuple()
if unit in histogram.UNIT_NAMES:
return unit, 1
diff --git a/chromium/third_party/catapult/tracing/tracing/value/heap_profiler.py b/chromium/third_party/catapult/tracing/tracing/value/heap_profiler.py
index 0ffd17b3a4b..9a85031112d 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/heap_profiler.py
+++ b/chromium/third_party/catapult/tracing/tracing/value/heap_profiler.py
@@ -23,7 +23,7 @@ from tracing_build import render_histograms_viewer
def _IsUserDefinedInstance(obj):
- return str(type(obj)).startswith('<class ')
+ return type(obj).__module__ != six.moves.builtins.__name__
class _HeapProfiler(object):
@@ -199,7 +199,7 @@ def Profile(root, label=None, html_filename=None, html_stream=None,
render_histograms_viewer.RenderHistogramsViewer(
histograms.AsDicts(), html_stream, reset_results, vulcanized_viewer)
else:
- from tracing_build import vulcanize_histograms_viewer
+ from tracing_build import vulcanize_histograms_viewer # pylint: disable=import-outside-toplevel
vulcanize_histograms_viewer.VulcanizeAndRenderHistogramsViewer(
histograms.AsDicts(), html_stream)
diff --git a/chromium/third_party/catapult/tracing/tracing/value/heap_profiler_unittest.py b/chromium/third_party/catapult/tracing/tracing/value/heap_profiler_unittest.py
index e5d1ea8d05b..556ca6c5902 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/heap_profiler_unittest.py
+++ b/chromium/third_party/catapult/tracing/tracing/value/heap_profiler_unittest.py
@@ -26,38 +26,41 @@ class HeapProfilerUnitTest(unittest.TestCase):
histograms = heap_profiler.Profile(test_data)
set_size_hist = histograms.GetHistogramNamed('heap:HistogramSet')
- self.assertEquals(set_size_hist.num_values, 1)
+ self.assertEqual(set_size_hist.num_values, 1)
# The exact sizes of python objects can vary between platforms and versions.
self.assertGreater(set_size_hist.sum, 10000)
hist_size_hist = histograms.GetHistogramNamed('heap:Histogram')
- self.assertEquals(hist_size_hist.num_values, 10)
+ self.assertEqual(hist_size_hist.num_values, 10)
self.assertGreater(hist_size_hist.sum, 10000)
related_names = hist_size_hist.diagnostics['types']
- self.assertEquals(related_names.Get('HistogramBin'), 'heap:HistogramBin')
- self.assertEquals(related_names.Get('DiagnosticMap'), 'heap:DiagnosticMap')
+ self.assertEqual(related_names.Get('HistogramBin'), 'heap:HistogramBin')
+ self.assertEqual(related_names.Get('DiagnosticMap'), 'heap:DiagnosticMap')
- properties = hist_size_hist.bins[33].diagnostic_maps[0]['properties']
- types = hist_size_hist.bins[33].diagnostic_maps[0]['types']
+ diagnostic_bin = [
+ hist_bin for hist_bin in hist_size_hist.bins
+ if len(hist_bin.diagnostic_maps)][-1]
+ properties = diagnostic_bin.diagnostic_maps[0]['properties']
+ types = diagnostic_bin.diagnostic_maps[0]['types']
self.assertGreater(len(properties), 3)
self.assertGreater(properties.Get('_bins'), 1000)
- self.assertEquals(len(types), 4)
+ self.assertEqual(len(types), 4)
self.assertGreater(types.Get('HistogramBin'), 1000)
self.assertGreater(types.Get('(builtin types)'), 1000)
bin_size_hist = histograms.GetHistogramNamed('heap:HistogramBin')
- self.assertEquals(bin_size_hist.num_values, 32)
+ self.assertEqual(bin_size_hist.num_values, 32)
self.assertGreater(bin_size_hist.sum, 1000)
diag_map_size_hist = histograms.GetHistogramNamed('heap:DiagnosticMap')
- self.assertEquals(diag_map_size_hist.num_values, 10)
+ self.assertEqual(diag_map_size_hist.num_values, 10)
self.assertGreater(diag_map_size_hist.sum, 1000)
range_size_hist = histograms.GetHistogramNamed('heap:Range')
- self.assertEquals(range_size_hist.num_values, 22)
+ self.assertEqual(range_size_hist.num_values, 22)
self.assertGreater(range_size_hist.sum, 1000)
stats_size_hist = histograms.GetHistogramNamed('heap:RunningStatistics')
- self.assertEquals(stats_size_hist.num_values, 10)
+ self.assertEqual(stats_size_hist.num_values, 10)
self.assertGreater(stats_size_hist.sum, 1000)
diff --git a/chromium/third_party/catapult/tracing/tracing/value/histogram.h b/chromium/third_party/catapult/tracing/tracing/value/histogram.h
index d29eac31de0..ff99d3311fe 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/histogram.h
+++ b/chromium/third_party/catapult/tracing/tracing/value/histogram.h
@@ -5,6 +5,7 @@
#include <map>
#include <memory>
#include <string>
+#include <unordered_map>
#include <vector>
#include "tracing/tracing/proto/histogram.pb.h"
diff --git a/chromium/third_party/catapult/tracing/tracing/value/histogram.html b/chromium/third_party/catapult/tracing/tracing/value/histogram.html
index 0a652d081fd..df47f36c554 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/histogram.html
+++ b/chromium/third_party/catapult/tracing/tracing/value/histogram.html
@@ -12,6 +12,7 @@ found in the LICENSE file.
<link rel="import" href="/tracing/base/unit.html">
<link rel="import" href="/tracing/base/utils.html">
<link rel="import" href="/tracing/value/diagnostics/diagnostic_map.html">
+<link rel="import" href="/tracing/value/diagnostics/reserved_names.html">
<script>
'use strict';
@@ -234,6 +235,9 @@ tr.exportTo('tr.v', function() {
static create(name, unit, samples, opt_options) {
const options = opt_options || {};
const hist = new Histogram(name, unit, options.binBoundaries);
+ if (options.alertGrouping !== undefined) {
+ hist.setAlertGrouping(options.alertGrouping);
+ }
if (options.description) hist.description = options.description;
@@ -275,6 +279,26 @@ tr.exportTo('tr.v', function() {
return this.diagnostics_;
}
+ /* Set alert grouping for a Histogram.
+ * See https://go/chromeperf-alert-grouping-dd
+ * @param {Array.< String >=} opt_alertGrouping
+ */
+ setAlertGrouping(alertGrouping) {
+ if (alertGrouping === undefined ||
+ alertGrouping === null ||
+ alertGrouping.length === undefined) {
+ throw Error('alertGrouping must be an array');
+ }
+ for (const alertGroup of alertGrouping) {
+ if (!Object.values(tr.v.d.ALERT_GROUPS).includes(alertGroup)) {
+ throw Error(`Alert group ${alertGroup} must be added to ` +
+ '/tracing/value/diagnostics/alert_groups.html');
+ }
+ }
+ this.diagnostics.set(tr.v.d.RESERVED_NAMES.ALERT_GROUPING,
+ new tr.v.d.GenericSet(alertGrouping));
+ }
+
get running() {
return this.running_;
}
diff --git a/chromium/third_party/catapult/tracing/tracing/value/histogram.py b/chromium/third_party/catapult/tracing/tracing/value/histogram.py
index d94f1a12327..28863bdda84 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/histogram.py
+++ b/chromium/third_party/catapult/tracing/tracing/value/histogram.py
@@ -150,7 +150,6 @@ def Percentile(ary, percent):
class HistogramError(ValueError):
"""Base execption type for Histogram related exceptions."""
- pass
class InvalidBucketError(HistogramError):
@@ -434,7 +433,7 @@ class RunningStatistics(object):
class DiagnosticMap(dict):
- __slots__ = '_allow_reserved_names',
+ __slots__ = ('_allow_reserved_names',)
def __init__(self, *args, **kwargs):
self._allow_reserved_names = True
@@ -752,8 +751,8 @@ class Histogram(object):
if summary_options:
hist.CustomizeSummaryOptions(summary_options)
if diagnostics:
- for name, diag in diagnostics.items():
- hist.diagnostics[name] = diag
+ for diag_name, diag in diagnostics.items():
+ hist.diagnostics[diag_name] = diag
if not isinstance(samples, list):
samples = [samples]
@@ -824,7 +823,7 @@ class Histogram(object):
upper = PercentFromString(stat_name[8:])
self._summary_options.get('iprs').push(
Range.FromExplicitRange(lower, upper))
- for stat_name in self._summary_options.keys():
+ for stat_name in self._summary_options:
if stat_name in ['percentile', 'iprs']:
continue
self._summary_options[stat_name] = stat_name in statistics_names
@@ -1030,10 +1029,9 @@ class Histogram(object):
continue
if hbin.range.min == -JS_MAX_VALUE:
return hbin.range.max
- elif hbin.range.max == JS_MAX_VALUE:
+ if hbin.range.max == JS_MAX_VALUE:
return hbin.range.min
- else:
- return hbin.range.center
+ return hbin.range.center
return self._bins[len(self._bins) - 1].range.min
def _ResampleMean(self, percent):
@@ -1215,6 +1213,8 @@ class Histogram(object):
return Scalar(self.unit, (self.GetApproximatePercentile(upper) -
self.GetApproximatePercentile(lower)))
+ return None
+
@property
def statistics_scalars(self):
results = {}
@@ -1256,7 +1256,7 @@ class Histogram(object):
dct['maxNumSampleValues'] = self.max_num_sample_values
if self.num_nans:
dct['numNans'] = self.num_nans
- if len(self.nan_diagnostic_maps):
+ if self.nan_diagnostic_maps:
dct['nanDiagnostics'] = [m.AsDict() for m in self.nan_diagnostic_maps]
if self.num_values:
dct['sampleValues'] = list(self.sample_values)
@@ -1268,7 +1268,7 @@ class Histogram(object):
summary_options = {}
any_overridden_summary_options = False
for name, option in self._summary_options.items():
- if name == 'percentile' or name == 'ci':
+ if name in ('percentile', 'ci'):
if len(option) == 0:
continue
elif name == 'iprs':
@@ -1313,8 +1313,8 @@ class Histogram(object):
self._GetAllBinsAsProto(proto.all_bins)
any_overridden_summary_options = any(
- [self._summary_options[k] != DEFAULT_SUMMARY_OPTIONS[k]
- for k in DEFAULT_SUMMARY_OPTIONS])
+ self._summary_options[k] != DEFAULT_SUMMARY_OPTIONS[k]
+ for k in DEFAULT_SUMMARY_OPTIONS)
if any_overridden_summary_options or self._summary_options['percentile']:
# Note: iprs and ci are not supported in the proto format yet.
diff --git a/chromium/third_party/catapult/tracing/tracing/value/histogram_importer.html b/chromium/third_party/catapult/tracing/tracing/value/histogram_importer.html
index c9a36824d73..49f1ecc7e87 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/histogram_importer.html
+++ b/chromium/third_party/catapult/tracing/tracing/value/histogram_importer.html
@@ -51,26 +51,26 @@ tr.exportTo('tr.v', function() {
* The |view| should have 'display:none' so that it doesn't obnoxiously
* display "zero Histograms" while they are being imported.
*
- * @param {!String} string
+ * @param {!String[]} strings
* @param {!Element} view A histogram-set-view.
* @return {Promise} resolves when |view| is displayed.
*/
- async importHistograms(string, view) {
+ async importHistograms(strings, view) {
this.histograms_ = new tr.v.HistogramSet();
- this.string_ = string;
this.view_ = view;
tr.b.Timing.instant('HistogramImporter', 'string', this.string_.length);
-
- if (this.string_.length > 0) {
+ const loadMark = tr.b.Timing.mark('HistogramImporter', 'loadHistograms');
+ for (const string of strings) {
+ this.string_ = string;
+ this.dataOffset_ = 0;
+ if (this.string_.length == 0) continue;
await this.update_('Loading Histogram 0');
- const loadMark = tr.b.Timing.mark(
- 'HistogramImporter', 'loadHistograms');
- if (!this.findDataStart_()) return;
+ if (!this.findDataStart_()) continue
await this.loadSomeHistograms_();
- loadMark.end();
- tr.b.Timing.instant('HistogramImporter', 'nsPerJson',
- parseInt(1e3 * loadMark.durationMs / this.histograms_.length));
}
+ loadMark.end();
+ tr.b.Timing.instant('HistogramImporter', 'nsPerJson',
+ parseInt(1e3 * loadMark.durationMs / this.histograms_.length));
await this.update_('Displaying Histogram table...');
await this.displayHistograms_();
diff --git a/chromium/third_party/catapult/tracing/tracing/value/histogram_serializer_unittest.py b/chromium/third_party/catapult/tracing/tracing/value/histogram_serializer_unittest.py
index 6b834056313..abd40370205 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/histogram_serializer_unittest.py
+++ b/chromium/third_party/catapult/tracing/tracing/value/histogram_serializer_unittest.py
@@ -41,42 +41,84 @@ class HistogramSerializerUnittest(unittest.TestCase):
hist.diagnostics['hhh'] = generic_set.GenericSet(['ggg'])
hist.AddSample(0, {
'bbb': breakdown.Breakdown.FromEntries({
- 'ccc': 11,
- 'ddd': 31,
+ 'ccc': 100,
+ 'ddd': 200,
}),
'eee': related_event_set.RelatedEventSet([{
'stableId': 'fff',
'title': 'ggg',
- 'start': 3,
- 'duration': 4,
+ 'start': 500,
+ 'duration': 600,
}]),
})
-
data = histogram_serializer.Serialize([hist])
- self.assertEqual(data, [
+
+ serializer_objects = data[0]
+ diagnostics = data[1]
+
+ self.assertIn('Breakdown', diagnostics)
+ self.assertIn('bbb', diagnostics['Breakdown'])
+ _, breakdown_indexes = list(
+ diagnostics['Breakdown']['bbb'].items())[0]
+ name_indexes = serializer_objects[breakdown_indexes[1]]
+ self.assertEqual(
[
- 'aaa',
- [1, [1, 1000.0, 20]],
- '',
- 'ccc',
- 'ddd',
- [3, 4],
- 'ggg',
- 'avg', 'count', 'max', 'min', 'std', 'sum',
- 'lorem ipsum',
- 'a:c',
- 'a:d',
+ serializer_objects[breakdown_indexes[0]],
+ [serializer_objects[i] for i in name_indexes],
+ breakdown_indexes[2],
+ breakdown_indexes[3]
],
- {
- 'Breakdown': {'bbb': {5: [2, 5, 11, 31]}},
- 'GenericSet': {
- 'hhh': {0: 6},
- 'statisticsNames': {1: [7, 8, 9, 10, 11, 12]},
- 'description': {3: 13},
- },
- 'RelatedEventSet': {'eee': {4: [['fff', 6, 3, 4]]}},
- 'RelatedNameMap': {'bbb': {2: [5, 14, 15]}},
- },
+ ['', ['ccc', 'ddd'], 100, 200]
+ )
+
+ self.assertIn('GenericSet', diagnostics)
+ self.assertIn('hhh', diagnostics['GenericSet'])
+ _, added_diagnostic = list(
+ diagnostics['GenericSet']['hhh'].items())[0]
+ self.assertEqual(serializer_objects[added_diagnostic], 'ggg')
+ self.assertIn('statisticsNames', diagnostics['GenericSet'])
+ _, stat_indexes = list(
+ diagnostics['GenericSet']['statisticsNames'].items())[0]
+ self.assertEqual(
+ ['avg', 'count', 'max', 'min', 'std', 'sum'],
+ [serializer_objects[i] for i in stat_indexes]
+ )
+ self.assertIn('description', diagnostics['GenericSet'])
+ _, description_index = list(
+ diagnostics['GenericSet']['description'].items())[0]
+ self.assertEqual(serializer_objects[description_index], 'lorem ipsum')
+
+ self.assertIn('RelatedEventSet', diagnostics)
+ self.assertIn('eee', diagnostics['RelatedEventSet'])
+ _, event_set_values = list(
+ diagnostics['RelatedEventSet']['eee'].items())[0]
+ self.assertEqual(
+ [
+ event_set_values[0][0],
+ serializer_objects[event_set_values[0][1]],
+ event_set_values[0][2],
+ event_set_values[0][3]
+ ],
+ ['fff', 'ggg', 500, 600]
+ )
+
+ self.assertIn('RelatedNameMap', diagnostics)
+ self.assertIn('bbb', diagnostics['RelatedNameMap'])
+ _, relative_name_values = list(
+ diagnostics['RelatedNameMap']['bbb'].items())[0]
+ name_indexes = relative_name_values[0]
+ self.assertEqual(
+ [
+ [serializer_objects[i] for i in serializer_objects[name_indexes]],
+ serializer_objects[relative_name_values[1]],
+ serializer_objects[relative_name_values[2]]
+ ],
+ [['ccc', 'ddd'], 'a:c', 'a:d']
+ )
+
+ histograms = data[2:]
+ self.assertEqual(
+ histograms[0],
[
0,
'count+',
@@ -86,4 +128,4 @@ class HistogramSerializerUnittest(unittest.TestCase):
{0: [1, [None, 4, 5]]},
0,
]
- ])
+ )
diff --git a/chromium/third_party/catapult/tracing/tracing/value/histogram_set.py b/chromium/third_party/catapult/tracing/tracing/value/histogram_set.py
index f9c96032ac7..bed920344b0 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/histogram_set.py
+++ b/chromium/third_party/catapult/tracing/tracing/value/histogram_set.py
@@ -5,7 +5,7 @@
import collections
from tracing.proto import histogram_proto
-from tracing.value import histogram as histogram
+from tracing.value import histogram
from tracing.value import histogram_deserializer
from tracing.value.diagnostics import all_diagnostics
from tracing.value.diagnostics import diagnostic
diff --git a/chromium/third_party/catapult/tracing/tracing/value/histogram_set_unittest.py b/chromium/third_party/catapult/tracing/tracing/value/histogram_set_unittest.py
index 7d3111490bd..99e413549ad 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/histogram_set_unittest.py
+++ b/chromium/third_party/catapult/tracing/tracing/value/histogram_set_unittest.py
@@ -4,6 +4,7 @@
import math
import unittest
+import six
from tracing.proto import histogram_proto
from tracing.value import histogram
@@ -11,6 +12,7 @@ from tracing.value import histogram_set
from tracing.value.diagnostics import date_range
from tracing.value.diagnostics import diagnostic_ref
from tracing.value.diagnostics import generic_set
+from six.moves import zip
def _AddHist(hist_set, name=None, unit=None):
@@ -145,7 +147,7 @@ class HistogramSetUnittest(unittest.TestCase):
hists2 = histogram_set.HistogramSet()
hists2.ImportDicts(ds)
self.assertEqual(len(hists2), 1)
- hist2 = [h for h in hists2][0]
+ hist2 = list(hists2)[0]
self.assertIsInstance(
hist2.diagnostics.get('generic'), generic_set.GenericSet)
@@ -280,10 +282,10 @@ class HistogramSetUnittest(unittest.TestCase):
# The order of the histograms isn't guaranteed.
self.assertEqual(len(hists), 2)
- self.assertItemsEqual(
- [hists[0].name, hists[1].name], ['metric1', 'metric2'])
- self.assertItemsEqual(
- [hists[0].unit, hists[1].unit], ['tsMs', 'sigma_biggerIsBetter'])
+ six.assertCountEqual(
+ self, [hists[0].name, hists[1].name], ['metric1', 'metric2'])
+ six.assertCountEqual(
+ self, [hists[0].unit, hists[1].unit], ['tsMs', 'sigma_biggerIsBetter'])
def testSimpleFieldsFromProto(self):
hist_set = histogram_proto.Pb2().HistogramSet()
@@ -428,11 +430,19 @@ class HistogramSetUnittest(unittest.TestCase):
# See the histogram spec in docs/histogram-set-json-format.md.
# Serializing to proto leads to funny rounding errors.
- self.assertEqual(
- parsed_hist.statistics_names,
- set(['pct_099_0000009537', 'pct_089_9999976158', 'pct_094_9999988079',
- 'nans', 'avg', 'geometricMean']),
- msg=str(parsed_hist.statistics_names))
+ # The rounding works different from Python 2 and Python 3.
+ actual_statistics_names = sorted(parsed_hist.statistics_names)
+ expected_statistics_names = sorted(
+ ['pct_099_0000009537', 'pct_089_9999976158', 'pct_094_9999988079',
+ 'nans', 'avg', 'geometricMean']
+ )
+ self.assertTrue(
+ all(actual[:17] == expected[:17]
+ for (actual, expected)
+ in zip(actual_statistics_names, expected_statistics_names)),
+ msg='Statistics names are different. Expected: %s. Actual: %s ' % (
+ expected_statistics_names, actual_statistics_names)
+ )
def testImportSharedDiagnosticsFromProto(self):
guid1 = 'f7f17394-fa4a-481e-86bd-a82cd55935a7'
diff --git a/chromium/third_party/catapult/tracing/tracing/value/histogram_test.html b/chromium/third_party/catapult/tracing/tracing/value/histogram_test.html
index 8b2e9d8c6a4..28ec21885a5 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/histogram_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/value/histogram_test.html
@@ -6,6 +6,7 @@ found in the LICENSE file.
-->
<link rel="import" href="/tracing/base/assert_utils.html">
+<link rel="import" href="/tracing/value/diagnostics/alert_groups.html">
<link rel="import" href="/tracing/value/diagnostics/generic_set.html">
<link rel="import" href="/tracing/value/histogram.html">
@@ -858,5 +859,61 @@ tr.b.unittest.testSuite(function() {
tr.b.assertRangeEquals(
mergedIprs[2], tr.b.math.Range.fromExplicitRange(0.2, 0.8));
});
+
+ test('alertGrouping', function() {
+ const hist0 = new tr.v.Histogram('', unitlessNumber);
+ hist0.setAlertGrouping([tr.v.d.ALERT_GROUPS.CPU_USAGE]);
+ const hist1 = tr.v.Histogram.create('', unitlessNumber, [], {
+ alertGrouping: [tr.v.d.ALERT_GROUPS.LOADING_PAINT]
+ });
+ const hist2 = tr.v.Histogram.create('', unitlessNumber, [], {
+ alertGrouping: [
+ tr.v.d.ALERT_GROUPS.LOADING_PAINT,
+ tr.v.d.ALERT_GROUPS.LOADING_INTERACTIVITY,
+ ]});
+
+ assert.isTrue(hist0.diagnostics.get('alertGrouping').equals(
+ new tr.v.d.GenericSet([tr.v.d.ALERT_GROUPS.CPU_USAGE])));
+ assert.isTrue(hist1.diagnostics.get('alertGrouping').equals(
+ new tr.v.d.GenericSet([tr.v.d.ALERT_GROUPS.LOADING_PAINT])));
+ assert.isTrue(hist2.diagnostics.get('alertGrouping').equals(
+ new tr.v.d.GenericSet([
+ tr.v.d.ALERT_GROUPS.LOADING_PAINT,
+ tr.v.d.ALERT_GROUPS.LOADING_INTERACTIVITY])));
+
+ const merged = hist0.clone();
+ merged.addHistogram(hist1);
+ merged.addHistogram(hist2);
+
+ assert.isTrue(merged.diagnostics.get('alertGrouping').equals(
+ new tr.v.d.GenericSet([
+ tr.v.d.ALERT_GROUPS.CPU_USAGE,
+ tr.v.d.ALERT_GROUPS.LOADING_PAINT,
+ tr.v.d.ALERT_GROUPS.LOADING_INTERACTIVITY])));
+ });
+
+ test('alertGroupingErrors', function() {
+ const hist0 = new tr.v.Histogram('', unitlessNumber);
+
+ // Must be from tr.v.d.ALERT_GROUPS.
+ assert.throws(() => {
+ hist0.setAlertGrouping(['foo']);
+ });
+ assert.throws(() => {
+ tr.v.Histogram.create('', unitlessNumber, [], {
+ alertGrouping: ['foo'],
+ });
+ });
+
+ // Must be an array.
+ assert.throws(() => {
+ hist0.setAlertGrouping(tr.v.d.ALERT_GROUPS.CPU_USAGE);
+ });
+ assert.throws(() => {
+ tr.v.Histogram.create('', unitlessNumber, [], {
+ alertGrouping: tr.v.d.ALERT_GROUPS.CPU_USAGE,
+ });
+ });
+ });
});
</script>
diff --git a/chromium/third_party/catapult/tracing/tracing/value/histogram_unittest.py b/chromium/third_party/catapult/tracing/tracing/value/histogram_unittest.py
index f7d6578ca29..4b1f2ca102b 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/histogram_unittest.py
+++ b/chromium/third_party/catapult/tracing/tracing/value/histogram_unittest.py
@@ -704,8 +704,8 @@ class HistogramUnittest(unittest.TestCase):
self.assertEqual(hist.description, clone.description)
self.assertEqual(len(hist.diagnostics), len(clone.diagnostics))
self.assertEqual(hist.diagnostics['foo'], clone.diagnostics['foo'])
- self.assertEqual(hist.statistics_scalars.keys(),
- clone.statistics_scalars.keys())
+ self.assertEqual(list(hist.statistics_scalars.keys()),
+ list(clone.statistics_scalars.keys()))
self.assertEqual(hist.max_num_sample_values, clone.max_num_sample_values)
class DiagnosticMapUnittest(unittest.TestCase):
@@ -808,4 +808,3 @@ class DiagnosticMapUnittest(unittest.TestCase):
self.assertIs(related_map, diagnostics[1])
self.assertIs(events, diagnostics[2])
self.assertIs(generic2, diagnostics[3])
-
diff --git a/chromium/third_party/catapult/tracing/tracing/value/running_statistics.cc b/chromium/third_party/catapult/tracing/tracing/value/running_statistics.cc
index 786f4765e36..0346def1fdd 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/running_statistics.cc
+++ b/chromium/third_party/catapult/tracing/tracing/value/running_statistics.cc
@@ -6,6 +6,7 @@
#include <algorithm>
#include <cassert>
+#include <cmath>
namespace catapult {
@@ -16,7 +17,7 @@ void RunningStatistics::Add(double value) {
min_ = std::min(min_, value);
sum_ += value;
- if (value < 0.0) {
+ if (std::islessequal(value, 0.0)) {
meanlogs_valid_ = false;
} else if (meanlogs_valid_) {
meanlogs_ += (std::log(std::abs(value)) - meanlogs_) / count_;
diff --git a/chromium/third_party/catapult/tracing/tracing/value/ui/breakdown_span_test.html b/chromium/third_party/catapult/tracing/tracing/value/ui/breakdown_span_test.html
index 71079cdc856..a1d04efa600 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/ui/breakdown_span_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/value/ui/breakdown_span_test.html
@@ -88,7 +88,8 @@ tr.b.unittest.testSuite(function() {
this.addHTMLOutput(span);
});
- test('correlate', function() {
+ // See https://crbug.com/1143376.
+ skipTest('correlate', function() {
const histograms = new tr.v.HistogramSet();
const sample0Breakdown = new tr.v.d.Breakdown();
sample0Breakdown.set('a', 5);
diff --git a/chromium/third_party/catapult/tracing/tracing/value/ui/diagnostic_span.html b/chromium/third_party/catapult/tracing/tracing/value/ui/diagnostic_span.html
index 741fc07f58e..cb9785e1969 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/ui/diagnostic_span.html
+++ b/chromium/third_party/catapult/tracing/tracing/value/ui/diagnostic_span.html
@@ -41,13 +41,7 @@ tr.exportTo('tr.v.ui', function() {
' or a base class must have a registered elementName');
}
- const tagName = typeInfo.metadata.elementName;
-
- if (tr.ui.b.isUnknownElementName(tagName)) {
- throw new Error('Element not registered: ' + tagName);
- }
-
- return tagName;
+ return typeInfo.metadata.elementName;
}
/**
@@ -61,6 +55,9 @@ tr.exportTo('tr.v.ui', function() {
function createDiagnosticSpan(diagnostic, name, histogram) {
const tagName = findElementNameForDiagnostic(diagnostic);
const span = document.createElement(tagName);
+ if (span instanceof HTMLUnknownElement) {
+ throw new Error('Element not registered: ' + tagName);
+ }
if (span.build === undefined) throw new Error(tagName);
span.build(diagnostic, name, histogram);
return span;
diff --git a/chromium/third_party/catapult/tracing/tracing/value/ui/generic_set_span_test.html b/chromium/third_party/catapult/tracing/tracing/value/ui/generic_set_span_test.html
index 6bddec81aa6..e8632b513d3 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/ui/generic_set_span_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/value/ui/generic_set_span_test.html
@@ -13,7 +13,8 @@ found in the LICENSE file.
<script>
'use strict';
-tr.b.unittest.testSuite(function() {
+// See https://crbug.com/1143376.
+tr.b.unittest.skippedTestSuite(function() {
test('link_tuple', function() {
const diagnostic = new tr.v.d.GenericSet([
['label', 'http://example.com/'],
@@ -94,7 +95,7 @@ tr.b.unittest.testSuite(function() {
test('traceUrls', function() {
const urls = [
- 'https://console.developers.google.com/m/cloudstorage/b/chromium-telemetry/o/c.html',
+ 'https://storage.cloud.google.com/chromium-telemetry/c.html',
'file://d/e/f.html',
];
const span = tr.v.ui.createDiagnosticSpan(
diff --git a/chromium/third_party/catapult/tracing/tracing/value/ui/histogram_importer_test.html b/chromium/third_party/catapult/tracing/tracing/value/ui/histogram_importer_test.html
index bb4e1e11ed0..96473519609 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/ui/histogram_importer_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/value/ui/histogram_importer_test.html
@@ -28,6 +28,37 @@ tr.b.unittest.testSuite(() => {
return histogram;
}
+ test('importZeroHistogramsEmptyArray', async function() {
+ const loadingEl = document.createElement('div');
+ this.addHTMLOutput(loadingEl);
+ const importer = new tr.v.HistogramImporter(loadingEl);
+
+ const view = document.createElement('tr-v-ui-histogram-set-view');
+ view.style.display = 'none';
+ this.addHTMLOutput(view);
+
+ await importer.importHistograms([], view);
+
+ assert.strictEqual('block', view.style.display);
+ assert.strictEqual(undefined, view.histograms);
+ });
+
+ test('importZeroHistogramsEmptyString', async function() {
+ const loadingEl = document.createElement('div');
+ this.addHTMLOutput(loadingEl);
+ const importer = new tr.v.HistogramImporter(loadingEl);
+ const histogramData = '';
+
+ const view = document.createElement('tr-v-ui-histogram-set-view');
+ view.style.display = 'none';
+ this.addHTMLOutput(view);
+
+ await importer.importHistograms([histogramData], view);
+
+ assert.strictEqual('block', view.style.display);
+ assert.strictEqual(undefined, view.histograms);
+ });
+
test('importZeroHistograms', async function() {
const loadingEl = document.createElement('div');
this.addHTMLOutput(loadingEl);
@@ -38,7 +69,7 @@ tr.b.unittest.testSuite(() => {
view.style.display = 'none';
this.addHTMLOutput(view);
- await importer.importHistograms(histogramData, view);
+ await importer.importHistograms([histogramData], view);
assert.strictEqual('block', view.style.display);
assert.strictEqual(undefined, view.histograms);
@@ -56,7 +87,7 @@ tr.b.unittest.testSuite(() => {
view.style.display = 'none';
this.addHTMLOutput(view);
- await importer.importHistograms(histogramData, view);
+ await importer.importHistograms([histogramData], view);
assert.strictEqual('none', loadingEl.style.display);
assert.strictEqual('block', view.style.display);
@@ -67,7 +98,31 @@ tr.b.unittest.testSuite(() => {
assert.deepEqual([42], histogram.sampleValues);
});
- test('importNHistogram', async function() {
+ test('importOneHistogramAndEmptyStrings', async function() {
+ const loadingEl = document.createElement('div');
+ this.addHTMLOutput(loadingEl);
+ const importer = new tr.v.HistogramImporter(loadingEl);
+
+ const hist = createHistogram(42);
+ const histogramDataArray = [
+ '', '\n' + JSON.stringify(hist.asDict()) + '\n', '\n', ''];
+
+ const view = document.createElement('tr-v-ui-histogram-set-view');
+ view.style.display = 'none';
+ this.addHTMLOutput(view);
+
+ await importer.importHistograms(histogramDataArray, view);
+
+ assert.strictEqual('none', loadingEl.style.display);
+ assert.strictEqual('block', view.style.display);
+ assert.lengthOf(view.histograms, 1);
+ const histogram = view.histograms.getHistogramNamed('name<42>');
+ assert.strictEqual(kHtmlString, tr.b.getOnlyElement(
+ histogram.diagnostics.get('html')));
+ assert.deepEqual([42], histogram.sampleValues);
+ });
+
+ test('importNHistogramsSingleString', async function() {
const loadingEl = document.createElement('div');
this.addHTMLOutput(loadingEl);
const importer = new tr.v.HistogramImporter(loadingEl);
@@ -84,7 +139,39 @@ tr.b.unittest.testSuite(() => {
view.style.display = 'none';
this.addHTMLOutput(view);
- await importer.importHistograms(histogramData, view);
+ await importer.importHistograms([histogramData], view);
+
+ assert.strictEqual('none', loadingEl.style.display);
+ assert.strictEqual('block', view.style.display);
+ assert.lengthOf(view.histograms, kNofHistograms);
+ for (let i = 0; i < kNofHistograms; i++) {
+ const id = kNofHistograms * 100 + i;
+ const histogram = view.histograms.getHistogramNamed('name<' + id + '>');
+ assert.strictEqual(kHtmlString, tr.b.getOnlyElement(
+ histogram.diagnostics.get('html')));
+ assert.deepEqual([id], histogram.sampleValues);
+ }
+ });
+
+ test('importNHistogramsSeparateStrings', async function() {
+ const loadingEl = document.createElement('div');
+ this.addHTMLOutput(loadingEl);
+ const importer = new tr.v.HistogramImporter(loadingEl);
+
+ const kNofHistograms = 1000;
+ let histogramDataArray = ['', '\n' ];
+ for (let i = 0; i < kNofHistograms; i++) {
+ const id = kNofHistograms * 100 + i;
+ const histogram = createHistogram(id);
+ histogramDataArray.push(
+ '\n' + JSON.stringify(histogram.asDict()) + '\n');
+ }
+
+ const view = document.createElement('tr-v-ui-histogram-set-view');
+ view.style.display = 'none';
+ this.addHTMLOutput(view);
+
+ await importer.importHistograms(histogramDataArray, view);
assert.strictEqual('none', loadingEl.style.display);
assert.strictEqual('block', view.style.display);
diff --git a/chromium/third_party/catapult/tracing/tracing/value/ui/histogram_set_controls_test.html b/chromium/third_party/catapult/tracing/tracing/value/ui/histogram_set_controls_test.html
index 9783059ccbe..236a2b337ac 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/ui/histogram_set_controls_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/value/ui/histogram_set_controls_test.html
@@ -134,7 +134,8 @@ tr.b.unittest.testSuite(function() {
assert.strictEqual(showAll.checked, false);
});
- test('controlShowAll', function() {
+ // See https://crbug.com/1143376.
+ skipTest('controlShowAll', function() {
const controls = buildControls(this);
const showAll = tr.ui.b.findDeepElementMatchingPredicate(
controls, e => e.id === 'show_all');
diff --git a/chromium/third_party/catapult/tracing/tracing/value/ui/histogram_set_table_row.html b/chromium/third_party/catapult/tracing/tracing/value/ui/histogram_set_table_row.html
index b4cb1a54020..68c080876a8 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/ui/histogram_set_table_row.html
+++ b/chromium/third_party/catapult/tracing/tracing/value/ui/histogram_set_table_row.html
@@ -221,6 +221,9 @@ tr.exportTo('tr.v.ui', function() {
const scalarA = cellA.getStatisticScalar(statisticA, referenceCellA);
if (scalarA) {
valueA = scalarA.value;
+ if (scalarA.unit.unitName == "normalizedPercentageDelta_smallerIsBetter") {
+ valueA = -valueA;
+ }
}
}
@@ -232,6 +235,9 @@ tr.exportTo('tr.v.ui', function() {
const scalarB = cellB.getStatisticScalar(statisticB, referenceCellB);
if (scalarB) {
valueB = scalarB.value;
+ if (scalarB.unit.unitName == "normalizedPercentageDelta_smallerIsBetter") {
+ valueB = -valueB;
+ }
}
}
diff --git a/chromium/third_party/catapult/tracing/tracing/value/ui/histogram_set_table_test.html b/chromium/third_party/catapult/tracing/tracing/value/ui/histogram_set_table_test.html
index f8d76afc72b..480a96dfe7c 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/ui/histogram_set_table_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/value/ui/histogram_set_table_test.html
@@ -213,7 +213,8 @@ tr.b.unittest.testSuite(function() {
assert.strictEqual(baseTable.sortColumnIndex, 1);
});
- test('controlSortColumnIndex', async function() {
+ // See https://crbug.com/1143376.
+ skipTest('controlSortColumnIndex', async function() {
const histograms = new tr.v.HistogramSet();
histograms.createHistogram('a', tr.b.Unit.byName.count, [1]);
histograms.createHistogram('b', tr.b.Unit.byName.count, [2]);
@@ -243,7 +244,8 @@ tr.b.unittest.testSuite(function() {
await table.viewState.update({sortDescending: false});
});
- test('controlSortDescending', async function() {
+ // See https://crbug.com/1143376.
+ skipTest('controlSortDescending', async function() {
const histograms = new tr.v.HistogramSet();
histograms.createHistogram('a', tr.b.Unit.byName.count, [1]);
histograms.createHistogram('b', tr.b.Unit.byName.count, [2]);
@@ -440,7 +442,8 @@ tr.b.unittest.testSuite(function() {
assert.lengthOf(getTableCells(table), 1);
});
- test('controlRowExpanded', async function() {
+ // See https://crbug.com/1143376.
+ skipTest('controlRowExpanded', async function() {
const histograms = new tr.v.HistogramSet();
const aHist = histograms.createHistogram('a', tr.b.Unit.byName.count, [1]);
aHist.diagnostics.set(tr.v.d.RESERVED_NAMES.STORIES,
@@ -1184,7 +1187,8 @@ tr.b.unittest.testSuite(function() {
assert.strictEqual('-90.0%', barContent.textContent);
});
- test('requestSelectionChange', async function() {
+ // See https://crbug.com/1143376.
+ skipTest('requestSelectionChange', async function() {
const histograms = new tr.v.HistogramSet();
const barHist = histograms.createHistogram(
'bar', tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, [1], {
@@ -1395,7 +1399,8 @@ tr.b.unittest.testSuite(function() {
table, e => e.textContent === '(missing)'));
});
- test('instantiate_1x1', async function() {
+ // See https://crbug.com/1143376.
+ skipTest('instantiate_1x1', async function() {
const histograms = new tr.v.HistogramSet();
const hist = histograms.createHistogram(
'foo', tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,
diff --git a/chromium/third_party/catapult/tracing/tracing/value/ui/histogram_span_test.html b/chromium/third_party/catapult/tracing/tracing/value/ui/histogram_span_test.html
index 2ca360b3348..5e3b0163744 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/ui/histogram_span_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/value/ui/histogram_span_test.html
@@ -241,7 +241,8 @@ tr.b.unittest.testSuite(function() {
this.addHTMLOutput(span);
});
- test('breakdownUnit', async function() {
+ // See https://crbug.com/1143376.
+ skipTest('breakdownUnit', async function() {
const root = new tr.v.Histogram('root', tr.b.Unit.byName.sizeInBytes);
const sampleBreakdown = new tr.v.d.Breakdown();
sampleBreakdown.set('x', 30 << 20);
@@ -266,7 +267,8 @@ tr.b.unittest.testSuite(function() {
span, e => e.textContent === '70.0 MiB'));
});
- test('diagnosticsTabs', async function() {
+ // See https://crbug.com/1143376.
+ skipTest('diagnosticsTabs', async function() {
const span = document.createElement('tr-v-ui-histogram-span');
span.build(tr.v.Histogram.create(
'', tr.b.Unit.byName.count, [
diff --git a/chromium/third_party/catapult/tracing/tracing/value/ui/related_event_set_span_test.html b/chromium/third_party/catapult/tracing/tracing/value/ui/related_event_set_span_test.html
index b0058a3c97b..81c99544388 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/ui/related_event_set_span_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/value/ui/related_event_set_span_test.html
@@ -12,7 +12,8 @@ found in the LICENSE file.
<script>
'use strict';
-tr.b.unittest.testSuite(function() {
+// See https://crbug.com/1143376.
+tr.b.unittest.skippedTestSuite(function() {
test('instantiate_RelatedEventSet0', function() {
const diagnostic = new tr.v.d.RelatedEventSet();
const span = tr.v.ui.createDiagnosticSpan(diagnostic);
diff --git a/chromium/third_party/catapult/tracing/tracing/value/ui/scalar_context_controller_test.html b/chromium/third_party/catapult/tracing/tracing/value/ui/scalar_context_controller_test.html
index ccb3f61d6f4..a4fdc85aaac 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/ui/scalar_context_controller_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/value/ui/scalar_context_controller_test.html
@@ -29,7 +29,8 @@ tr.b.unittest.testSuite(function() {
is: 'tr-v-ui-scalar-context-controller-mock-host'
});
- test('getScalarContextControllerForElement', function() {
+ // See https://crbug.com/1143376.
+ skipTest('getScalarContextControllerForElement', function() {
const root = document.createElement('div');
Polymer.dom(document.body).appendChild(root);
try {
diff --git a/chromium/third_party/catapult/tracing/tracing/value/ui/scalar_span_test.html b/chromium/third_party/catapult/tracing/tracing/value/ui/scalar_span_test.html
index 56ca6917d71..403b3cd10c2 100644
--- a/chromium/third_party/catapult/tracing/tracing/value/ui/scalar_span_test.html
+++ b/chromium/third_party/catapult/tracing/tracing/value/ui/scalar_span_test.html
@@ -284,7 +284,8 @@ tr.b.unittest.testSuite(function() {
{expectedColor: 'rgb(255, 0, 0)'});
});
- test('createScalarSpan', function() {
+ // See https://crbug.com/1143376.
+ skipTest('createScalarSpan', function() {
// No config.
let span = tr.v.ui.createScalarSpan(
new Scalar(Unit.byName.powerInWatts, 3.14));
@@ -477,7 +478,8 @@ tr.b.unittest.testSuite(function() {
assert.strictEqual(rectA.height, rectB.height);
});
- test('respectCurrentDisplayUnit', function() {
+ // See https://crbug.com/1143376.
+ skipTest('respectCurrentDisplayUnit', function() {
try {
Unit.currentTimeDisplayMode = tr.b.TimeDisplayModes.ns;
@@ -514,7 +516,8 @@ tr.b.unittest.testSuite(function() {
expectation.classList || []);
}
- test('customContextRange', function() {
+ // See https://crbug.com/1143376.
+ skipTest('customContextRange', function() {
const div = document.createElement('div');
div.style.width = '101px'; // One extra pixel for sparkline border.
this.addHTMLOutput(div);
@@ -603,7 +606,8 @@ tr.b.unittest.testSuite(function() {
assert.strictEqual(tr.v.ui.createScalarSpan(), '');
});
- test('contextControllerChanges', function() {
+ // See https://crbug.com/1143376.
+ skipTest('contextControllerChanges', function() {
const div = document.createElement('div');
div.style.width = '101px'; // One extra pixel for sparkline border.
this.addHTMLOutput(div);
@@ -721,7 +725,8 @@ tr.b.unittest.testSuite(function() {
checkSparkline(s1, {left: 0, width: 51, classList: ['positive']});
});
- test('deltaSparkline_noImprovementDirection', function() {
+ // See https://crbug.com/1143376.
+ skipTest('deltaSparkline_noImprovementDirection', function() {
const div = document.createElement('div');
div.style.width = '101px'; // One extra pixel for sparkline border.
this.addHTMLOutput(div);
@@ -781,7 +786,8 @@ tr.b.unittest.testSuite(function() {
checkSparkline(span8, {left: 0, width: 26, classList: ['positive']});
});
- test('deltaSparkline_smallerIsBetter', function() {
+ // See https://crbug.com/1143376.
+ skipTest('deltaSparkline_smallerIsBetter', function() {
const div = document.createElement('div');
div.style.width = '101px'; // One extra pixel for sparkline border.
this.addHTMLOutput(div);
@@ -842,7 +848,8 @@ tr.b.unittest.testSuite(function() {
checkSparkline(span8, {left: 0, width: 76, classList: ['better']});
});
- test('deltaSparkline_biggerIsBetter', function() {
+ // See https://crbug.com/1143376.
+ skipTest('deltaSparkline_biggerIsBetter', function() {
const div = document.createElement('div');
div.style.width = '101px'; // One extra pixel for sparkline border.
this.addHTMLOutput(div);
@@ -902,7 +909,8 @@ tr.b.unittest.testSuite(function() {
checkSparkline(span8, {left: 0, width: 101, classList: ['worse']});
});
- test('classListChanges', function() {
+ // See https://crbug.com/1143376.
+ skipTest('classListChanges', function() {
const div = document.createElement('div');
div.style.width = '200px';
this.addHTMLOutput(div);
diff --git a/chromium/third_party/catapult/tracing/tracing_build/check_common.py b/chromium/third_party/catapult/tracing/tracing_build/check_common.py
index 28dd49edc2c..9067fe517dc 100644
--- a/chromium/third_party/catapult/tracing/tracing_build/check_common.py
+++ b/chromium/third_party/catapult/tracing/tracing_build/check_common.py
@@ -42,8 +42,8 @@ Current listing:
Correct listing:
{4}\n\n'''.format(group_name, src_file, mismatch, what_is, what_should_be)
- else:
- return ''
+
+ return ''
def GetKnownFiles():
@@ -55,8 +55,8 @@ def GetKnownFiles():
absolute_filenames = m.GetAllDependentFilenamesRecursive(
include_raw_scripts=False)
- return list(set([os.path.relpath(f, project.tracing_root_path)
- for f in absolute_filenames]))
+ return list({os.path.relpath(f, project.tracing_root_path)
+ for f in absolute_filenames})
def CheckCommon(file_name, listed_files):
diff --git a/chromium/third_party/catapult/tracing/tracing_build/generate_about_tracing_contents_unittest.py b/chromium/third_party/catapult/tracing/tracing_build/generate_about_tracing_contents_unittest.py
index 7ebe3ddc861..0fccf2b7f3e 100644
--- a/chromium/third_party/catapult/tracing/tracing_build/generate_about_tracing_contents_unittest.py
+++ b/chromium/third_party/catapult/tracing/tracing_build/generate_about_tracing_contents_unittest.py
@@ -4,15 +4,10 @@
import unittest
import shutil
-import sys
import tempfile
-if sys.version_info < (3,):
- from tracing_build import generate_about_tracing_contents
+from tracing_build import generate_about_tracing_contents
-
-@unittest.skipIf(sys.version_info >= (3,),
- 'py_vulcanize is not ported to python3')
class GenerateAboutTracingContentsUnittTest(unittest.TestCase):
def testSmoke(self):
diff --git a/chromium/third_party/catapult/tracing/tracing_build/histograms_viewer.html b/chromium/third_party/catapult/tracing/tracing_build/histograms_viewer.html
index 054f21b8fc0..a37f35ce515 100644
--- a/chromium/third_party/catapult/tracing/tracing_build/histograms_viewer.html
+++ b/chromium/third_party/catapult/tracing/tracing_build/histograms_viewer.html
@@ -59,8 +59,10 @@ ga('set', 'historyImportTask', null);
const view = document.getElementById('histograms');
const locus = new tr.v.ui.HistogramSetLocation();
- const data = jsonData.childNodes[0].textContent;
- await importer.importHistograms(data, view);
+ // Extract all comment nodes inside jsonData.
+ const strings = Array.prototype.map.call(
+ jsonData.childNodes, each => each.textContent);
+ await importer.importHistograms(strings, view);
await locus.build(view.viewState);
// Free the objects and DOM referenced by the importer.
diff --git a/chromium/third_party/catapult/tracing/tracing_build/html2trace.py b/chromium/third_party/catapult/tracing/tracing_build/html2trace.py
index a5b17544e64..6032084edb4 100644
--- a/chromium/third_party/catapult/tracing/tracing_build/html2trace.py
+++ b/chromium/third_party/catapult/tracing/tracing_build/html2trace.py
@@ -55,7 +55,10 @@ def CopyTraceDataFromHTMLFilePath(html_file_handle, trace_path,
saved_path = trace_path if i == 0 else '%s.%d' % (trace_path, i)
saved_paths.append(saved_path)
with open(saved_path, 'wb' if gzipped_output else 'w') as trace_file:
- trace_file.write(trace_data.read())
+ if gzipped_output:
+ trace_file.write(trace_data.read())
+ else:
+ trace_file.write(trace_data.read().decode("utf-8"))
return saved_paths
@@ -83,26 +86,23 @@ def _ExtractTraceDataFromHTMLFile(html_file_handle, unzip_data=True):
if unzip_data:
return list(map(_UnzipFileIfNecessary, decoded_data_list))
- else:
- return list(map(_ZipFileIfNecessary, decoded_data_list))
+ return list(map(_ZipFileIfNecessary, decoded_data_list))
def _UnzipFileIfNecessary(original_file):
if _IsFileZipped(original_file):
return gzip.GzipFile(fileobj=original_file)
- else:
- return original_file
+ return original_file
def _ZipFileIfNecessary(original_file):
if _IsFileZipped(original_file):
return original_file
- else:
- zipped_file = io.BytesIO()
- with gzip.GzipFile(fileobj=zipped_file, mode='wb') as gzip_wrapper:
- gzip_wrapper.write(original_file.read())
- zipped_file.seek(0)
- return zipped_file
+ zipped_file = io.BytesIO()
+ with gzip.GzipFile(fileobj=zipped_file, mode='wb') as gzip_wrapper:
+ gzip_wrapper.write(original_file.read())
+ zipped_file.seek(0)
+ return zipped_file
def _IsFileZipped(f):
diff --git a/chromium/third_party/catapult/tracing/tracing_build/merge_traces.py b/chromium/third_party/catapult/tracing/tracing_build/merge_traces.py
index df1029a8805..5294a7ea412 100644
--- a/chromium/third_party/catapult/tracing/tracing_build/merge_traces.py
+++ b/chromium/third_party/catapult/tracing/tracing_build/merge_traces.py
@@ -10,6 +10,7 @@ import argparse
import codecs
import collections
import gzip
+import io
import itertools
import json
import logging
@@ -93,11 +94,12 @@ class IdMap(object):
assert 'id' not in items # ID is set according to the path.
for key, value in items.items():
value_set = self._items[key]
- if (isinstance(value, collections.Iterable) and
+ if (isinstance(value, collections.abc.Iterable) and
not isinstance(value, StringTypes)):
value_set.update(value)
else:
value_set.add(value)
+ return None
def MapEntry(self, source, path):
"""Map an source-specific entry ID path to a canonical entry ID path.
@@ -288,9 +290,8 @@ class IdMap(object):
cls_name = type(self).__name__
if self._depth == 0:
return '%s root' % cls_name
- else:
- return '%s %s entry(%s)' % (cls_name, self.LEVELS[self._depth - 1].name,
- self._items)
+ return '%s %s entry(%s)' % (cls_name, self.LEVELS[self._depth - 1].name,
+ self._items)
class ProcessIdMap(IdMap):
@@ -310,19 +311,18 @@ def LoadTrace(filename):
logging.info('Loading trace %r...', filename)
if filename.endswith(HTML_FILENAME_SUFFIX):
return LoadHTMLTrace(filename)
- elif filename.endswith(GZIP_FILENAME_SUFFIX):
+ if filename.endswith(GZIP_FILENAME_SUFFIX):
with gzip.open(filename, 'rb') as f:
return json.load(f)
- else:
- with open(filename, 'r') as f:
- return json.load(f)
+ with open(filename, 'r') as f:
+ return json.load(f)
def LoadHTMLTrace(filename):
"""Load a trace from a vulcanized HTML trace file."""
trace_components = collections.defaultdict(list)
- with open(filename) as file_handle:
+ with io.open(filename, 'r', encoding='utf-8') as file_handle:
for sub_trace in html2trace.ReadTracesFromHTMLFile(file_handle):
for name, component in TraceAsDict(sub_trace).items():
trace_components[name].append(component)
@@ -406,8 +406,7 @@ def MergeComponents(component_name, components_by_filename):
"""Merge a component of multiple JSON traces into a single component."""
if component_name == 'traceEvents':
return MergeTraceEvents(components_by_filename)
- else:
- return MergeGenericTraceComponents(component_name, components_by_filename)
+ return MergeGenericTraceComponents(component_name, components_by_filename)
def MergeTraceEvents(events_by_filename):
@@ -645,7 +644,7 @@ def MergeGenericTraceComponents(component_name, components_by_filename):
provided value (in some trace).
"""
components = list(components_by_filename.values())
- first_component = next(components)
+ first_component = next(iter(components))
if not all(c == first_component for c in components):
logging.warning(
'Values of trace component %r differ across the provided traces. '
diff --git a/chromium/third_party/catapult/tracing/tracing_build/merge_traces_unittest.py b/chromium/third_party/catapult/tracing/tracing_build/merge_traces_unittest.py
index 34e05571112..c2e73eecf4a 100644
--- a/chromium/third_party/catapult/tracing/tracing_build/merge_traces_unittest.py
+++ b/chromium/third_party/catapult/tracing/tracing_build/merge_traces_unittest.py
@@ -5,21 +5,17 @@
import json
import os
import shutil
-import sys
import tempfile
import unittest
from tracing.trace_data import trace_data
-if sys.version_info < (3,):
- from tracing_build import merge_traces
+from tracing_build import merge_traces
def _FakeDumpEvent(pid, tid):
return {'ph': 'v', 'ts': 100, 'pid': pid, 'tid': tid, 'args': {'dumps': {}}}
-@unittest.skipIf(sys.version_info >= (3,),
- 'py_vulcanize is not ported to python3')
class MergeTracesTest(unittest.TestCase):
def setUp(self):
self.test_dir = tempfile.mkdtemp()
@@ -46,4 +42,4 @@ class MergeTracesTest(unittest.TestCase):
events = json.load(f)['traceEvents']
# Check that both dumps are found in the merged trace.
dump_pids = [e['pid'] for e in events if e['ph'] == 'v']
- self.assertEquals([1, 2], dump_pids)
+ self.assertEqual([1, 2], dump_pids)
diff --git a/chromium/third_party/catapult/tracing/tracing_build/render_histograms_viewer.py b/chromium/third_party/catapult/tracing/tracing_build/render_histograms_viewer.py
index a5ad91a4e20..62c2089cf3a 100644
--- a/chromium/third_party/catapult/tracing/tracing_build/render_histograms_viewer.py
+++ b/chromium/third_party/catapult/tracing/tracing_build/render_histograms_viewer.py
@@ -7,7 +7,9 @@ import logging
import re
_DATA_START = '<div id="histogram-json-data" style="display:none;"><!--'
-_DATA_END = '--!></div>'
+_DATA_SEPARATOR = '--><!--'
+_DATA_END_OLD = '--!></div>'
+_DATA_END = '--></div>'
def ExtractJSON(results_html):
@@ -15,18 +17,22 @@ def ExtractJSON(results_html):
flags = re.MULTILINE | re.DOTALL
start = re.search("^%s" % re.escape(_DATA_START), results_html, flags)
if start is None:
- logging.warn('Could not find histogram data start: %s', _DATA_START)
+ logging.warning('Could not find histogram data start: %s', _DATA_START)
return []
- pattern = '^((%s)|(.*?))$' % re.escape(_DATA_END)
+ pattern = '^((%s|%s)|(.*?))$' % (re.escape(_DATA_END_OLD),
+ re.escape(_DATA_END))
# Find newlines and parse each line as separate JSON data.
for match in re.compile(pattern, flags).finditer(results_html, start.end()+1):
try:
# Check if the end tag in group(2) got a match.
if match.group(2):
return results
- results.append(json.loads(match.group(3)))
+ payload = match.group(3)
+ if payload == _DATA_SEPARATOR:
+ continue
+ results.append(json.loads(payload))
except ValueError:
- logging.warn(
+ logging.warning(
'Found existing results json, but failed to parse it: %s',
match.group(1))
return []
@@ -40,12 +46,13 @@ def ReadExistingResults(results_html):
histogram_dicts = ExtractJSON(results_html)
if not histogram_dicts:
- logging.warn('Failed to extract previous results from HTML output')
+ logging.warning('Failed to extract previous results from HTML output')
return histogram_dicts
def RenderHistogramsViewer(histogram_dicts, output_stream, reset_results=False,
- vulcanized_html=''):
+ vulcanized_html='',
+ max_chunk_size_hint_bytes=100000000):
"""Renders a Histograms viewer to output_stream containing histogram_dicts.
Requires a Histograms viewer to have already been vulcanized.
@@ -66,14 +73,22 @@ def RenderHistogramsViewer(histogram_dicts, output_stream, reset_results=False,
output_stream.write(vulcanized_html)
# Put all the serialized histograms nodes inside an html comment to avoid
- # unecessary stress on html parsing and avoid creating throw-away dom nodes.
+ # unnecessary stress on html parsing and avoid creating throw-away dom nodes.
output_stream.write(_DATA_START)
+
+ chunk_size = 0
for histogram in histogram_dicts:
- hist_json = json.dumps(histogram, separators=(',', ':'))
output_stream.write('\n')
# No escaping is necessary since the data is stored inside an html comment.
# This assumes that {hist_json} doesn't contain an html comment itself.
+ hist_json = json.dumps(histogram, separators=(',', ':'))
output_stream.write(hist_json)
+ chunk_size += len(hist_json) + 1
+ # Start a new comment after {max_chunk_size_hint_bytes} to avoid hitting
+ # V8's max string length. Each comment can be read as individual string.
+ if chunk_size > max_chunk_size_hint_bytes:
+ output_stream.write('\n%s' % _DATA_SEPARATOR)
+ chunk_size = 0
output_stream.write('\n%s\n' % _DATA_END)
# If the output file already existed and was longer than the new contents,
diff --git a/chromium/third_party/catapult/tracing/tracing_build/render_histograms_viewer_unittest.py b/chromium/third_party/catapult/tracing/tracing_build/render_histograms_viewer_unittest.py
index 48c8dcbe33e..acabbd69df7 100644
--- a/chromium/third_party/catapult/tracing/tracing_build/render_histograms_viewer_unittest.py
+++ b/chromium/third_party/catapult/tracing/tracing_build/render_histograms_viewer_unittest.py
@@ -9,6 +9,7 @@ import os
import tempfile
from tracing_build import render_histograms_viewer
+from six.moves import range
class ResultsRendererTest(unittest.TestCase):
@@ -52,6 +53,49 @@ class ResultsRendererTest(unittest.TestCase):
render_histograms_viewer.ReadExistingResults(self.output_stream.read()))
self.assertIn(value0_json, self.GetOutputFileContent())
+ def testBasicWithSeparatorOften(self):
+ data_list = [{'foo': i} for i in range(11)]
+ render_histograms_viewer.RenderHistogramsViewer(
+ [], self.output_stream, False)
+ self.output_stream.seek(0)
+ self.assertCountEqual([], render_histograms_viewer.ReadExistingResults(
+ self.output_stream.read()))
+ # Write payload, forcing a new chunk after ever single item
+ render_histograms_viewer.RenderHistogramsViewer(
+ data_list, self.output_stream, False, max_chunk_size_hint_bytes=1)
+ self.output_stream.seek(0)
+ self.assertCountEqual(
+ data_list,
+ render_histograms_viewer.ReadExistingResults(
+ self.output_stream.read()))
+
+ for data in data_list:
+ data_json = json.dumps(data, separators=(',', ':'))
+ self.assertIn(data_json, self.GetOutputFileContent())
+
+ def testBasicWithSeparator(self):
+ data_list = [{'foo': i} for i in range(11)]
+ render_histograms_viewer.RenderHistogramsViewer(
+ [], self.output_stream, False)
+ self.output_stream.seek(0)
+ self.assertCountEqual([], render_histograms_viewer.ReadExistingResults(
+ self.output_stream.read()))
+ # Write payload, forcing a new chunk after a few items
+ item_json = json.dumps(data_list[2], separators=(',', ':'))
+ render_histograms_viewer.RenderHistogramsViewer(
+ data_list,
+ self.output_stream,
+ False,
+ max_chunk_size_hint_bytes=len(item_json) * 3)
+ self.output_stream.seek(0)
+ self.assertCountEqual(
+ data_list,
+ render_histograms_viewer.ReadExistingResults(
+ self.output_stream.read()))
+ for data in data_list:
+ data_json = json.dumps(data, separators=(',', ':'))
+ self.assertIn(data_json, self.GetOutputFileContent())
+
def testExistingResults(self):
value0 = {'foo': 0}
value0_json = json.dumps(value0, separators=(',', ':'))
diff --git a/chromium/third_party/catapult/tracing/tracing_build/snapdragon2trace.py b/chromium/third_party/catapult/tracing/tracing_build/snapdragon2trace.py
index d0016e0f69d..754ae584312 100644
--- a/chromium/third_party/catapult/tracing/tracing_build/snapdragon2trace.py
+++ b/chromium/third_party/catapult/tracing/tracing_build/snapdragon2trace.py
@@ -47,7 +47,7 @@ def LoadTraces(chrome_trace_filename):
with open(chrome_trace_filename, 'r') as f:
traces.append(json.load(f))
else:
- raise Exception('Unknown trace file suffix: %s', chrome_trace_filename)
+ raise Exception('Unknown trace file suffix: %s' % chrome_trace_filename)
return list(map(_ConvertToDictIfNecessary, traces))
@@ -63,7 +63,7 @@ def WriteTraces(output_filename, traces):
with open(output_filename, 'w') as f:
json.dump(_ConcatTraces(traces), f)
else:
- raise Exception('Unknown trace file suffix: %s', output_filename)
+ raise Exception('Unknown trace file suffix: %s' % output_filename)
def LoadCSV(csv_filename):
@@ -147,7 +147,7 @@ def _ConvertToDictIfNecessary(trace):
def _MetadataEvent(pid, name, value):
if name not in TRACE_METADATA_ARG_NAME_MAP:
- raise Exception('Unknown metadata name: %s', name)
+ raise Exception('Unknown metadata name: %s' % name)
arg_name = TRACE_METADATA_ARG_NAME_MAP[name]
return {
'pid': pid,
diff --git a/chromium/third_party/catapult/tracing/tracing_build/strip_memory_infra_trace.py b/chromium/third_party/catapult/tracing/tracing_build/strip_memory_infra_trace.py
index b4df42f3924..703c8ecf937 100755
--- a/chromium/third_party/catapult/tracing/tracing_build/strip_memory_infra_trace.py
+++ b/chromium/third_party/catapult/tracing/tracing_build/strip_memory_infra_trace.py
@@ -6,6 +6,7 @@
from __future__ import print_function
+from __future__ import absolute_import
import collections
import gzip
import json
@@ -100,3 +101,4 @@ def Main(argv):
json.dump({'traceEvents': out_events}, fout)
num_bytes_written = fout.tell()
print(' (%s written)' % FormatBytes(num_bytes_written))
+ return 0
diff --git a/chromium/third_party/catapult/tracing/tracing_build/trace2html.py b/chromium/third_party/catapult/tracing/tracing_build/trace2html.py
index 1e9d62fa06a..6fd3027b141 100644
--- a/chromium/third_party/catapult/tracing/tracing_build/trace2html.py
+++ b/chromium/third_party/catapult/tracing/tracing_build/trace2html.py
@@ -75,10 +75,10 @@ class ViewerDataScript(generate.ExtraScript):
def WriteToFile(self, output_file):
output_file.write('<script id="viewer-data" type="%s">\n' % self._mime_type)
compressed_trace = io.BytesIO()
- with gzip.GzipFile(fileobj=compressed_trace, mode='w', mtime=0) as f:
- f.write(self._trace_data_string)
+ with gzip.GzipFile(fileobj=compressed_trace, mode='wb', mtime=0) as f:
+ f.write(self._trace_data_string.encode('utf-8'))
b64_content = base64.b64encode(compressed_trace.getvalue())
- output_file.write(b64_content)
+ output_file.write(b64_content.decode('utf-8'))
output_file.write('\n</script>\n')
@@ -118,9 +118,9 @@ def WriteHTMLForTracesToFile(trace_filenames, output_file, title='',
trace_data_list = []
for filename in trace_filenames:
try:
- with gzip.GzipFile(filename, 'r') as f:
+ with gzip.GzipFile(filename, 'rb') as f:
# If filename is not gzipped, then read() will raise IOError.
- trace_data = f.read()
+ trace_data = f.read().decode('utf-8')
except IOError:
with open(filename, 'r') as f:
trace_data = f.read()
diff --git a/chromium/third_party/catapult/tracing/tracing_build/trace2html_unittest.py b/chromium/third_party/catapult/tracing/tracing_build/trace2html_unittest.py
index 5e14ae3f5d1..c09e0c8c8eb 100644
--- a/chromium/third_party/catapult/tracing/tracing_build/trace2html_unittest.py
+++ b/chromium/third_party/catapult/tracing/tracing_build/trace2html_unittest.py
@@ -4,18 +4,14 @@
import codecs
import gzip
+import io
import os
import shutil
-import sys
import tempfile
import unittest
-if sys.version_info < (3,):
- from tracing_build import trace2html
+from tracing_build import trace2html
-
-@unittest.skipIf(sys.version_info >= (3,),
- 'py_vulcanize is not ported to python3')
class Trace2HTMLTests(unittest.TestCase):
SIMPLE_TRACE_PATH = os.path.join(
os.path.dirname(__file__),
@@ -50,15 +46,16 @@ class Trace2HTMLTests(unittest.TestCase):
# Hash the contents of the output file that was generated from an unzipped
# json input file.
- unzipped_hash = hash(open(output_filename).read())
+ unzipped_hash = hash(
+ io.open(output_filename, 'r', encoding='utf-8').read())
os.unlink(output_filename)
# Gzip SIMPLE_TRACE into |input_filename|.
# trace2html should automatically gunzip it and start building the html from
# the same input as if the input weren't gzipped.
- with gzip.GzipFile(input_filename, mode='w') as input_gzipfile:
- input_gzipfile.write(open(self.SIMPLE_TRACE_PATH).read())
+ with gzip.GzipFile(input_filename, mode='wb') as input_gzipfile:
+ input_gzipfile.write(open(self.SIMPLE_TRACE_PATH).read().encode('utf-8'))
# trace2html-ify the zipped version of SIMPLE_TRACE from the same input
# filename as the unzipped version so that the gzipping process is stable.
@@ -67,7 +64,7 @@ class Trace2HTMLTests(unittest.TestCase):
# Hash the contents of the output file that was generated from the zipped
# json input file.
- zipped_hash = hash(open(output_filename).read())
+ zipped_hash = hash(io.open(output_filename, 'r', encoding='utf-8').read())
# Compare the hashes, not the file contents directly so that, if they are
# different, python shouldn't try to print megabytes of html.
diff --git a/chromium/third_party/catapult/tracing/tracing_build/update_gni.py b/chromium/third_party/catapult/tracing/tracing_build/update_gni.py
index e31487831c7..4151ea7a6ac 100644
--- a/chromium/third_party/catapult/tracing/tracing_build/update_gni.py
+++ b/chromium/third_party/catapult/tracing/tracing_build/update_gni.py
@@ -24,7 +24,7 @@ class BuildFile(object):
def __init__(self, text, file_groups):
self._file_groups = file_groups
- self._tokens = [token for token in self._Tokenize(text)]
+ self._tokens = list(self._Tokenize(text))
def _Tokenize(self, text):
rest = text
diff --git a/chromium/third_party/catapult/tracing/tracing_build/vulcanize_trace_viewer_unittest.py b/chromium/third_party/catapult/tracing/tracing_build/vulcanize_trace_viewer_unittest.py
index 9d57ed06b96..b602388eb4a 100644
--- a/chromium/third_party/catapult/tracing/tracing_build/vulcanize_trace_viewer_unittest.py
+++ b/chromium/third_party/catapult/tracing/tracing_build/vulcanize_trace_viewer_unittest.py
@@ -4,16 +4,11 @@
import codecs
import os
-import sys
import unittest
import tempfile
-if sys.version_info < (3,):
- from tracing_build import vulcanize_trace_viewer
+from tracing_build import vulcanize_trace_viewer
-
-@unittest.skipIf(sys.version_info >= (3,),
- 'py_vulcanize is not ported to python3')
class Trace2HTMLTests(unittest.TestCase):
def testWriteHTMLForTracesToFile(self):
diff --git a/chromium/third_party/catapult/tracing/tracing_examples/trace_viewer_embedder.html b/chromium/third_party/catapult/tracing/tracing_examples/trace_viewer_embedder.html
index af6d9ed637c..47bcd733afc 100644
--- a/chromium/third_party/catapult/tracing/tracing_examples/trace_viewer_embedder.html
+++ b/chromium/third_party/catapult/tracing/tracing_examples/trace_viewer_embedder.html
@@ -47,10 +47,6 @@ function onTraceViewerImportFail() {
let url;
let model;
- // You can set this to true if you want to hide the WebComponentsV0 polyfill
- // warning.
- window.__hideTraceViewerPolyfillWarning = false;
-
function load() {
const req = new XMLHttpRequest();
const isBinary = /[.]gz$/.test(url) || /[.]zip$/.test(url);
diff --git a/chromium/third_party/catapult/tracing/tracing_project.py b/chromium/third_party/catapult/tracing/tracing_project.py
index ce198ce7bd3..85c29bd32ac 100644
--- a/chromium/third_party/catapult/tracing/tracing_project.py
+++ b/chromium/third_party/catapult/tracing/tracing_project.py
@@ -25,7 +25,7 @@ def GetDependencyPaths():
p.catapult_path,
p.py_vulcanize_path,
p.vinn_path,
- p.protobuf_path,
+ p.protobuf_py3_path if sys.version_info[0] >= 3 else p.protobuf_path,
os.path.join(p.catapult_third_party_path, 'WebOb'),
os.path.join(p.catapult_third_party_path, 'Paste'),
os.path.join(p.catapult_third_party_path, 'six'),
@@ -82,6 +82,8 @@ class TracingProject(object):
# the gae_ts_mon protobuf lib for its tests, so let's do the same for tracing.
protobuf_path = os.path.join(
catapult_third_party_path, 'gae_ts_mon', 'gae_ts_mon', 'protobuf')
+ protobuf_py3_path = os.path.join(
+ catapult_third_party_path, 'gae_ts_mon', 'gae_ts_mon', 'protobuf-3.20.0')
tracing_third_party_path = os.path.join(tracing_root_path, 'third_party')
py_vulcanize_path = os.path.join(common_root_path, 'py_vulcanize')
@@ -136,7 +138,7 @@ class TracingProject(object):
self.source_paths.append(self.oboe_path)
def CreateVulcanizer(self):
- from py_vulcanize import project as project_module
+ from py_vulcanize import project as project_module # pylint: disable=import-outside-toplevel
return project_module.Project(self.source_paths)
def IsD8CompatibleFile(self, filename):
@@ -214,4 +216,3 @@ class TracingProject(object):
def GetModuleNameForConfigName(self, config_name):
return 'tracing.ui.extras.%s_config' % config_name
-
diff --git a/chromium/third_party/dawn/generator/generator_lib.py b/chromium/third_party/dawn/generator/generator_lib.py
index 5e3734d7833..e3d46bd194f 100644
--- a/chromium/third_party/dawn/generator/generator_lib.py
+++ b/chromium/third_party/dawn/generator/generator_lib.py
@@ -201,6 +201,10 @@ def _compute_python_dependencies(root_dir=None):
paths = set()
for path in module_paths:
+ # Builtin/namespaced modules may return None for the file path.
+ if not path:
+ continue
+
path = os.path.abspath(path)
if not path.startswith(root_dir):
diff --git a/chromium/third_party/devtools-frontend/src/BUILD.gn b/chromium/third_party/devtools-frontend/src/BUILD.gn
index cd488e88b60..ea1dc3d9a79 100644
--- a/chromium/third_party/devtools-frontend/src/BUILD.gn
+++ b/chromium/third_party/devtools-frontend/src/BUILD.gn
@@ -2,6 +2,8 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//build/config/python.gni")
+
import("//third_party/blink/public/public_features.gni")
import("./all_devtools_files.gni")
import("./all_devtools_modules.gni")
diff --git a/chromium/third_party/devtools-frontend/src/scripts/build/build_inspector_overlay.py b/chromium/third_party/devtools-frontend/src/scripts/build/build_inspector_overlay.py
index d6666e8b74f..5cb98e67817 100644
--- a/chromium/third_party/devtools-frontend/src/scripts/build/build_inspector_overlay.py
+++ b/chromium/third_party/devtools-frontend/src/scripts/build/build_inspector_overlay.py
@@ -39,13 +39,24 @@ def check_size(filename, data, max_size):
def rollup(input_path, output_path, filename, max_size, rollup_plugin):
target = join(input_path, filename)
- rollup_process = subprocess.Popen(
- [devtools_paths.node_path(),
- devtools_paths.rollup_path()] +
- ['--format', 'iife', '-n', 'InspectorOverlay'] + ['--input', target] +
- ['--plugin', rollup_plugin],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
+ if sys.version_info[0] < 3:
+ rollup_process = subprocess.Popen(
+ [devtools_paths.node_path(),
+ devtools_paths.rollup_path()] +
+ ['--format', 'iife', '-n', 'InspectorOverlay'] + ['--input', target] +
+ ['--plugin', rollup_plugin],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ else:
+ rollup_process = subprocess.Popen(
+ [devtools_paths.node_path(),
+ devtools_paths.rollup_path()] +
+ ['--format', 'iife', '-n', 'InspectorOverlay'] + ['--input', target] +
+ ['--plugin', rollup_plugin],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ text=True)
+
out, error = rollup_process.communicate()
if not out:
raise Exception("rollup failed: " + error)
diff --git a/chromium/third_party/devtools-frontend/src/scripts/build/build_release_applications.py b/chromium/third_party/devtools-frontend/src/scripts/build/build_release_applications.py
index fa8e73d34af..414d59ec56b 100644
--- a/chromium/third_party/devtools-frontend/src/scripts/build/build_release_applications.py
+++ b/chromium/third_party/devtools-frontend/src/scripts/build/build_release_applications.py
@@ -10,14 +10,17 @@ Builds applications in release mode:
and the application loader into a single script.
"""
-from cStringIO import StringIO
+import sys
+if sys.version_info.major == 3:
+ from io import StringIO # for Python 3
+else:
+ from cStringIO import StringIO # for Python 2
from os import path
from os.path import join
import copy
import os
import re
import shutil
-import sys
import subprocess
from modular_build import read_file, write_file, bail_error
@@ -37,6 +40,9 @@ try:
finally:
sys.path = original_sys_path
+if sys.version_info.major == 3:
+ unicode = str
+
FRONT_END_DIRECTORY = path.join(os.path.dirname(path.abspath(__file__)), '..', '..', 'front_end')
@@ -145,8 +151,11 @@ class ReleaseBuilder(object):
resource_content = read_file(path.join(self.application_dir, resource_name))
if not (resource_name.endswith('.html')
or resource_name.endswith('md')):
- resource_content += resource_source_url(resource_name).encode(
- 'utf-8')
+ if sys.version_info[0] < 3:
+ resource_content += resource_source_url(resource_name).encode(
+ 'utf-8')
+ else:
+ resource_content += resource_source_url(resource_name)
resource_content = resource_content.replace('\\', '\\\\')
resource_content = resource_content.replace('\n', '\\n')
resource_content = resource_content.replace('"', '\\"')
@@ -173,7 +182,9 @@ class ReleaseBuilder(object):
def _concatenate_application_script(self, output):
output.write('Root.allDescriptors.push(...%s);' % self._release_module_descriptors())
if self.descriptors.extends:
- output.write('Root.applicationDescriptor.modules.push(...%s);' % json.dumps(self.descriptors.application.values()))
+ output.write(
+ 'Root.applicationDescriptor.modules.push(...%s);' %
+ json.dumps(list(self.descriptors.application.values())))
else:
output.write('Root.applicationDescriptor = %s;' % self.descriptors.application_json())
diff --git a/chromium/third_party/devtools-frontend/src/scripts/build/generate_devtools_grd.py b/chromium/third_party/devtools-frontend/src/scripts/build/generate_devtools_grd.py
index be510c48d76..c6a59c90298 100644
--- a/chromium/third_party/devtools-frontend/src/scripts/build/generate_devtools_grd.py
+++ b/chromium/third_party/devtools-frontend/src/scripts/build/generate_devtools_grd.py
@@ -123,7 +123,7 @@ def main(argv):
try:
os.makedirs(path.join(output_directory, 'Images'))
- except OSError, e:
+ except OSError as e:
if e.errno != errno.EEXIST:
raise e
@@ -147,7 +147,7 @@ def main(argv):
shutil.copy(path.join(dirname, filename), path.join(output_directory, 'Images'))
add_file_to_grd(doc, path.join('Images', filename))
- with open(parsed_args.output_filename, 'w') as output_file:
+ with open(parsed_args.output_filename, 'wb') as output_file:
output_file.write(doc.toxml(encoding='UTF-8'))
diff --git a/chromium/third_party/devtools-frontend/src/scripts/build/modular_build.py b/chromium/third_party/devtools-frontend/src/scripts/build/modular_build.py
index 0ba695d3810..bb1da2f9f8d 100644
--- a/chromium/third_party/devtools-frontend/src/scripts/build/modular_build.py
+++ b/chromium/third_party/devtools-frontend/src/scripts/build/modular_build.py
@@ -7,6 +7,8 @@
Utilities for the modular DevTools build.
"""
+from __future__ import print_function
+
import collections
from os import path
import os
@@ -40,7 +42,7 @@ def load_and_parse_json(filename):
try:
return json.loads(read_file(filename))
except:
- print 'ERROR: Failed to parse %s' % filename
+ print('ERROR: Failed to parse %s' % filename)
raise
class Descriptors:
@@ -57,7 +59,7 @@ class Descriptors:
def application_json(self):
result = dict()
- result['modules'] = self.application.values()
+ result['modules'] = list(self.application.values())
return json.dumps(result)
def all_compiled_files(self):
diff --git a/chromium/third_party/jinja2/tests.py b/chromium/third_party/jinja2/tests.py
index 0adc3d4dbcb..d3e56108cfb 100644
--- a/chromium/third_party/jinja2/tests.py
+++ b/chromium/third_party/jinja2/tests.py
@@ -10,7 +10,11 @@
"""
import operator
import re
-from collections import Mapping
+import sys
+if sys.version_info[0] > 2:
+ from collections.abc import Mapping
+else:
+ from collections import Mapping
from jinja2.runtime import Undefined
from jinja2._compat import text_type, string_types, integer_types
import decimal
diff --git a/chromium/tools/generate_stubs/generate_stubs.py b/chromium/tools/generate_stubs/generate_stubs.py
index ed3b89c2904..0e2e72e0be3 100755
--- a/chromium/tools/generate_stubs/generate_stubs.py
+++ b/chromium/tools/generate_stubs/generate_stubs.py
@@ -68,12 +68,12 @@ class SubprocessError(Error):
# From that, all preceding characters are considered the return value.
# Trailing characters should have a substring matching the form (.*). That
# is considered the arguments.
-SIGNATURE_REGEX = re.compile('(?P<return_type>.+?)'
- '(?P<name>[_a-zA-Z][_a-zA-Z0-9]+)\s*'
- '\((?P<params>.*?)\)')
+SIGNATURE_REGEX = re.compile(r'(?P<return_type>.+?)'
+ r'(?P<name>[_a-zA-Z][_a-zA-Z0-9]+)\s*'
+ r'\((?P<params>.*?)\)')
# Used for generating C++ identifiers.
-INVALID_C_IDENT_CHARS = re.compile('[^_a-zA-Z0-9]')
+INVALID_C_IDENT_CHARS = re.compile(r'[^_a-zA-Z0-9]')
# Constants defining the supported file types options.
FILE_TYPE_WIN_X86 = 'windows_lib'
@@ -662,7 +662,7 @@ class PosixStubWriter(object):
return_prefix = 'return '
# Generate the argument list.
- arguments = [re.split('[\*& ]', arg)[-1].strip() for arg in
+ arguments = [re.split(r'[\*& ]', arg)[-1].strip() for arg in
signature['params']]
# Remove square brackets from arrays, otherwise we will end with a
# compilation failure.
diff --git a/chromium/tools/grit/grit/util.py b/chromium/tools/grit/grit/util.py
index 528d766ad6b..6e8cdb0ebfa 100644
--- a/chromium/tools/grit/grit/util.py
+++ b/chromium/tools/grit/grit/util.py
@@ -211,7 +211,7 @@ def ReadFile(filename, encoding):
mode = 'rb'
encoding = None
else:
- mode = 'rU'
+ mode = 'r'
with io.open(abs(filename), mode, encoding=encoding) as f:
return f.read()
diff --git a/chromium/tools/metrics/structured/model.py b/chromium/tools/metrics/structured/model.py
index 2d90bf20c67..befea2eda7c 100644
--- a/chromium/tools/metrics/structured/model.py
+++ b/chromium/tools/metrics/structured/model.py
@@ -26,7 +26,7 @@ _METRIC_TYPE = models.ObjectNodeType(
'metric',
attributes=[
('name', unicode, r'^[A-Za-z0-9_.]+$'),
- ('kind', unicode, r'^(?i)(|hashed-string|int)$'),
+ ('kind', unicode, r'(?i)^(|hashed-string|int)$'),
],
alphabetization=[
(_OBSOLETE_TYPE.tag, lambda _: 1),
diff --git a/chromium/tools/metrics/ukm/gen_builders.py b/chromium/tools/metrics/ukm/gen_builders.py
index f9f61d90a56..44e46fae8cc 100755
--- a/chromium/tools/metrics/ukm/gen_builders.py
+++ b/chromium/tools/metrics/ukm/gen_builders.py
@@ -48,9 +48,10 @@ def ReadFilteredData(path):
data = ukm_model.UKM_XML_TYPE.Parse(ukm_file.read())
event_tag = ukm_model._EVENT_TYPE.tag
metric_tag = ukm_model._METRIC_TYPE.tag
- data[event_tag] = filter(ukm_model.IsNotObsolete, data[event_tag])
+ data[event_tag] = list(filter(ukm_model.IsNotObsolete, data[event_tag]))
for event in data[event_tag]:
- event[metric_tag] = filter(ukm_model.IsNotObsolete, event[metric_tag])
+ event[metric_tag] = list(
+ filter(ukm_model.IsNotObsolete, event[metric_tag]))
return data
diff --git a/chromium/tools/metrics/ukm/ukm_model.py b/chromium/tools/metrics/ukm/ukm_model.py
index ec24dd57360..57decab3ccc 100644
--- a/chromium/tools/metrics/ukm/ukm_model.py
+++ b/chromium/tools/metrics/ukm/ukm_model.py
@@ -42,7 +42,7 @@ _INDEX_TYPE = models.ObjectNodeType(
_STATISTICS_TYPE = models.ObjectNodeType(
'statistics',
attributes=[
- ('export', str, r'^(?i)(|true|false)$'),
+ ('export', str, r'(?i)^(|true|false)$'),
],
children=[
models.ChildType(_QUANTILES_TYPE.tag, _QUANTILES_TYPE, multiple=False),
@@ -94,7 +94,7 @@ _EVENT_TYPE = models.ObjectNodeType(
'event',
attributes=[
('name', str, r'^[A-Za-z0-9.]+$'),
- ('singular', str, r'^(?i)(|true|false)$'),
+ ('singular', str, r'(?i)^(|true|false)$'),
],
alphabetization=[
(_OBSOLETE_TYPE.tag, _KEEP_ORDER),
diff --git a/chromium/ui/ozone/generate_constructor_list.py b/chromium/ui/ozone/generate_constructor_list.py
index 8d800636c97..04fa18e93df 100755
--- a/chromium/ui/ozone/generate_constructor_list.py
+++ b/chromium/ui/ozone/generate_constructor_list.py
@@ -45,12 +45,15 @@ Example Output: ./ui/ozone/generate_constructor_list.py \
} // namespace ui
"""
+try:
+ from StringIO import StringIO # for Python 2
+except ImportError:
+ from io import StringIO # for Python 3
import optparse
import os
import collections
import re
import sys
-import string
def GetTypedefName(typename):
@@ -68,7 +71,7 @@ def GetConstructorName(typename, platform):
This is just "Create" + typename + platform.
"""
- return 'Create' + typename + string.capitalize(platform)
+ return 'Create' + typename + platform.capitalize()
def GenerateConstructorList(out, namespace, export, typenames, platforms,
@@ -163,12 +166,14 @@ def main(argv):
sys.exit(1)
# Write to standard output or file specified by --output_cc.
- out_cc = sys.stdout
+ out_cc = getattr(sys.stdout, 'buffer', sys.stdout)
if options.output_cc:
out_cc = open(options.output_cc, 'wb')
- GenerateConstructorList(out_cc, options.namespace, options.export,
+ out_cc_str = StringIO()
+ GenerateConstructorList(out_cc_str, options.namespace, options.export,
typenames, platforms, includes, usings)
+ out_cc.write(out_cc_str.getvalue().encode('utf-8'))
if options.output_cc:
out_cc.close()
diff --git a/chromium/ui/ozone/generate_ozone_platform_list.py b/chromium/ui/ozone/generate_ozone_platform_list.py
index d47c398259b..2702b68b9bd 100755
--- a/chromium/ui/ozone/generate_ozone_platform_list.py
+++ b/chromium/ui/ozone/generate_ozone_platform_list.py
@@ -49,12 +49,15 @@ Example Output: ./generate_ozone_platform_list.py --default wayland dri wayland
"""
+try:
+ from StringIO import StringIO # for Python 2
+except ImportError:
+ from io import StringIO # for Python 3
import optparse
import os
import collections
import re
import sys
-import string
def GetConstantName(name):
@@ -63,7 +66,7 @@ def GetConstantName(name):
We just capitalize the platform name and prepend "CreateOzonePlatform".
"""
- return 'kPlatform' + string.capitalize(name)
+ return 'kPlatform' + name.capitalize()
def GeneratePlatformListText(out, platforms):
@@ -149,9 +152,9 @@ def main(argv):
platforms.insert(0, options.default)
# Write to standard output or file specified by --output_{cc,h}.
- out_cc = sys.stdout
- out_h = sys.stdout
- out_txt = sys.stdout
+ out_cc = getattr(sys.stdout, 'buffer', sys.stdout)
+ out_h = getattr(sys.stdout, 'buffer', sys.stdout)
+ out_txt = getattr(sys.stdout, 'buffer', sys.stdout)
if options.output_cc:
out_cc = open(options.output_cc, 'wb')
if options.output_h:
@@ -159,9 +162,16 @@ def main(argv):
if options.output_txt:
out_txt = open(options.output_txt, 'wb')
- GeneratePlatformListText(out_txt, platforms)
- GeneratePlatformListHeader(out_h, platforms)
- GeneratePlatformListSource(out_cc, platforms)
+ out_txt_str = StringIO()
+ out_h_str = StringIO()
+ out_cc_str = StringIO()
+
+ GeneratePlatformListText(out_txt_str, platforms)
+ out_txt.write(out_txt_str.getvalue().encode('utf-8'))
+ GeneratePlatformListHeader(out_h_str, platforms)
+ out_h.write(out_h_str.getvalue().encode('utf-8'))
+ GeneratePlatformListSource(out_cc_str, platforms)
+ out_cc.write(out_cc_str.getvalue().encode('utf-8'))
if options.output_cc:
out_cc.close()